commit 0a0931cbfef9f1601049801a8f799c0ded54bc32 Author: root Date: Wed May 14 12:02:52 2025 +0700 first commit diff --git a/App antrian.ods b/App antrian.ods new file mode 100644 index 0000000..18c778f Binary files /dev/null and b/App antrian.ods differ diff --git a/README.md b/README.md new file mode 100644 index 0000000..e046179 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# CodeIgniter 2 +Open Source PHP Framework (originally from EllisLab) + +For more info, please refer to the user-guide at http://www.codeigniter.com/userguide2/ +(also available within the download package for offline use) + +**WARNING:** *CodeIgniter 2.x is no longer under development and only receives security patches until October 31st, 2015. +Please update your installation to the latest CodeIgniter 3.x version available +(upgrade instructions [here](http://www.codeigniter.com/userguide3/installation/upgrade_300.html)).* diff --git a/antrian_rssa.sql b/antrian_rssa.sql new file mode 100644 index 0000000..c94afba --- /dev/null +++ b/antrian_rssa.sql @@ -0,0 +1,228 @@ +/* +SQLyog Enterprise - MySQL GUI v8.12 +MySQL - 5.5.5-10.1.32-MariaDB : Database - antrian_rssa +********************************************************************* +*/ + +/*!40101 SET NAMES utf8 */; + +/*!40101 SET SQL_MODE=''*/; + +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/`antrian_rssa` /*!40100 DEFAULT CHARACTER SET latin1 */; + +USE `antrian_rssa`; + +/*Table structure for table `master_klinik` */ + +DROP TABLE IF EXISTS `master_klinik`; + +CREATE TABLE `master_klinik` ( + `mk_id` int(11) NOT NULL AUTO_INCREMENT, + `mk_nama` varchar(50) DEFAULT NULL, + `mk_kode` varchar(50) DEFAULT NULL, + `mk_shift` int(5) DEFAULT NULL, + `mk_menit` int(5) DEFAULT NULL, + `mk_quota` int(5) DEFAULT NULL, + `mk_quota_bangku` int(5) DEFAULT NULL, + `mk_status_shift` int(5) DEFAULT NULL, + `mk_aktif` int(5) DEFAULT NULL, + `mk_jadwal` text, + `mk_tanggal_sekarang` date DEFAULT NULL, + `mk_shift_buka` int(5) DEFAULT NULL, + `mk_auto_shift` int(1) DEFAULT NULL, + `mk_jam_shift` text, + PRIMARY KEY (`mk_id`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4; + +/*Data for the table `master_klinik` */ + +insert into `master_klinik`(`mk_id`,`mk_nama`,`mk_kode`,`mk_shift`,`mk_menit`,`mk_quota`,`mk_quota_bangku`,`mk_status_shift`,`mk_aktif`,`mk_jadwal`,`mk_tanggal_sekarang`,`mk_shift_buka`,`mk_auto_shift`,`mk_jam_shift`) values (1,'ANAK','AN',3,0,3,2,2,0,'senin|selasa|rabu|kamis|jumat|','2020-07-17',3,1,'07:00|09:40|12:20|'),(2,'JANTUNG','JT',4,0,2,2,2,0,'senin|selasa|rabu|kamis|jumat|','2020-07-17',4,1,'07:00|09:00|11:00|13:00|'),(4,'KANDUNGAN','OB',5,0,2,2,3,0,'rabu|jumat|','2020-07-17',5,1,'07:00|08:36|10:12|11:48|13:24|'),(5,'DALAM','DL',4,0,5,20,1,0,'senin|selasa|rabu|kamis|jumat|','2020-07-17',4,1,'07:00|09:00|11:00|13:00|'),(6,'THT','TH',3,0,10,10,1,0,'senin|selasa|rabu|kamis|jumat|','2020-07-17',3,1,'07:00|09:40|12:20|'); + +/*Table structure for table `master_loket` */ + +DROP TABLE IF EXISTS `master_loket`; + +CREATE TABLE `master_loket` ( + `ml_id` int(11) NOT NULL AUTO_INCREMENT, + `ml_nama` varchar(50) DEFAULT NULL, + `ml_pelayanan` text, + `ml_quota_bangku` int(5) DEFAULT NULL, + PRIMARY KEY (`ml_id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4; + +/*Data for the table `master_loket` */ + +insert into `master_loket`(`ml_id`,`ml_nama`,`ml_pelayanan`,`ml_quota_bangku`) values (1,'Loket 1','2,',12),(4,'Loket 2','1,2,4,',30),(5,'Loket SA','1,2,4,5,',50); + +/*Table structure for table `master_menu` */ + +DROP TABLE IF EXISTS `master_menu`; + +CREATE TABLE `master_menu` ( + `mm_id` int(11) NOT NULL AUTO_INCREMENT, + `mm_nama` varchar(50) DEFAULT NULL, + `mm_link` varchar(50) DEFAULT NULL, + `mm_icon` varchar(50) DEFAULT NULL, + `mm_parent` int(5) DEFAULT NULL, + `mm_level` int(5) DEFAULT NULL, + `mm_action` varchar(15) DEFAULT NULL, + PRIMARY KEY (`mm_id`) +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4; + +/*Data for the table `master_menu` */ + +insert into `master_menu`(`mm_id`,`mm_nama`,`mm_link`,`mm_icon`,`mm_parent`,`mm_level`,`mm_action`) values (1,'Dashboard',NULL,'fa fa-dashboard',NULL,1,NULL),(2,'Setting','#','fa fa-gears',NULL,1,NULL),(3,'Hak Akses','ps_hakakses',NULL,2,2,'true'),(4,'User Login','ps_userlogin',NULL,2,2,'true'),(5,'Master Loket','ps_loket',NULL,2,2,'true'),(6,'Master Klinik','ps_klinik',NULL,2,2,'true'),(7,'Anjungan','ps_anjungan','fa fa-desktop',NULL,1,NULL),(8,'Loket Admin','ps_loket_admin','fa fa-pencil-square-o',NULL,1,NULL),(9,'Klinik Admin','ps_klinik_admin','fa fa-ambulance',NULL,1,NULL); + +/*Table structure for table `master_tipeuser` */ + +DROP TABLE IF EXISTS `master_tipeuser`; + +CREATE TABLE `master_tipeuser` ( + `mt_id` int(11) NOT NULL AUTO_INCREMENT, + `mt_nama` varchar(20) DEFAULT NULL, + PRIMARY KEY (`mt_id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4; + +/*Data for the table `master_tipeuser` */ + +insert into `master_tipeuser`(`mt_id`,`mt_nama`) values (1,'Super Admin'),(2,'Admin'),(3,'Loket'),(4,'Klinik'); + +/*Table structure for table `master_user` */ + +DROP TABLE IF EXISTS `master_user`; + +CREATE TABLE `master_user` ( + `mu_id` int(11) NOT NULL AUTO_INCREMENT, + `mu_nama_lengkap` varchar(50) DEFAULT NULL, + `mu_nama_user` varchar(50) DEFAULT NULL, + `mu_password` varchar(50) DEFAULT NULL, + `mu_klinik_id` int(11) DEFAULT NULL, + `mu_loket_id` int(11) DEFAULT NULL, + `mu_tipeuser_id` int(11) DEFAULT NULL, + PRIMARY KEY (`mu_id`), + KEY `user_tipeuser_FK` (`mu_tipeuser_id`), + KEY `user_kunjunganklinik_FK` (`mu_klinik_id`), + KEY `user_loket_FK` (`mu_loket_id`), + CONSTRAINT `user_kunjunganklinik_FK` FOREIGN KEY (`mu_klinik_id`) REFERENCES `master_klinik` (`mk_id`) ON DELETE SET NULL ON UPDATE SET NULL, + CONSTRAINT `user_loket_FK` FOREIGN KEY (`mu_loket_id`) REFERENCES `master_loket` (`ml_id`) ON DELETE SET NULL ON UPDATE SET NULL, + CONSTRAINT `user_tipeuser_FK` FOREIGN KEY (`mu_tipeuser_id`) REFERENCES `master_tipeuser` (`mt_id`) ON DELETE SET NULL ON UPDATE SET NULL +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4; + +/*Data for the table `master_user` */ + +insert into `master_user`(`mu_id`,`mu_nama_lengkap`,`mu_nama_user`,`mu_password`,`mu_klinik_id`,`mu_loket_id`,`mu_tipeuser_id`) values (1,'Ragil Bayu Nugroho','hamigaki','afa7f6fb4dd3bb49e6960b6f4c74ce3d',NULL,5,1),(4,'PC 1 loket 2','loket','c866829cdc8d4b47eb94bd97641475fb',NULL,4,3),(5,'Klinik Anak','anak','b7a1bef48e489643e1899eb7f7884b9b',1,NULL,4),(6,'Jantung','jantung','9f2820d31f7b3f13e9f1ebda5af0ad50',2,NULL,4),(7,'Telinga Hidung Tenggorokan','tht','5549219ed402706bc6972e8bc830bdef',6,NULL,4); + +/*Table structure for table `master_user_menu` */ + +DROP TABLE IF EXISTS `master_user_menu`; + +CREATE TABLE `master_user_menu` ( + `mum_id` int(11) NOT NULL AUTO_INCREMENT, + `mum_tambah` varchar(10) DEFAULT NULL, + `mum_ubah` varchar(10) DEFAULT NULL, + `mum_hapus` varchar(10) DEFAULT NULL, + `mum_lihat` varchar(10) DEFAULT NULL, + `mum_tipeuser_id` int(11) DEFAULT NULL, + `mum_menu_id` int(11) DEFAULT NULL, + PRIMARY KEY (`mum_id`), + KEY `usermenu_tipeuser_FK` (`mum_tipeuser_id`), + KEY `usermenu_menu_FK` (`mum_menu_id`), + CONSTRAINT `usermenu_menu_FK` FOREIGN KEY (`mum_menu_id`) REFERENCES `master_menu` (`mm_id`) ON DELETE SET NULL ON UPDATE SET NULL, + CONSTRAINT `usermenu_tipeuser_FK` FOREIGN KEY (`mum_tipeuser_id`) REFERENCES `master_tipeuser` (`mt_id`) ON DELETE SET NULL ON UPDATE SET NULL +) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8mb4; + +/*Data for the table `master_user_menu` */ + +insert into `master_user_menu`(`mum_id`,`mum_tambah`,`mum_ubah`,`mum_hapus`,`mum_lihat`,`mum_tipeuser_id`,`mum_menu_id`) values (9,NULL,NULL,NULL,NULL,2,1),(10,NULL,NULL,NULL,NULL,2,2),(11,NULL,NULL,NULL,NULL,2,3),(12,NULL,NULL,NULL,NULL,2,4),(26,NULL,NULL,NULL,NULL,1,1),(27,NULL,NULL,NULL,NULL,1,2),(28,'tambah','ubah','hapus','lihat',1,3),(29,'tambah','ubah','hapus','lihat',1,4),(30,'tambah','ubah','hapus','lihat',1,5),(31,'tambah','ubah','hapus','lihat',1,6),(32,NULL,NULL,NULL,'lihat',1,7),(33,NULL,NULL,NULL,'lihat',1,8),(34,NULL,NULL,NULL,'lihat',1,9),(35,NULL,NULL,NULL,NULL,3,1),(36,NULL,NULL,NULL,NULL,3,2),(37,NULL,NULL,NULL,'lihat',3,5),(38,NULL,NULL,NULL,'lihat',3,8),(39,NULL,NULL,NULL,NULL,4,1),(40,NULL,NULL,NULL,NULL,4,2),(41,NULL,NULL,NULL,'lihat',4,6),(42,NULL,NULL,NULL,'lihat',4,9); + +/*Table structure for table `proses_kunjung_klinik` */ + +DROP TABLE IF EXISTS `proses_kunjung_klinik`; + +CREATE TABLE `proses_kunjung_klinik` ( + `pkk_id` int(11) NOT NULL AUTO_INCREMENT, + `pkk_tanggal_datang` datetime DEFAULT NULL, + `pkk_tanggal_selesai` datetime DEFAULT NULL, + `pkk_klinik_id` int(11) DEFAULT NULL, + `pkk_pengunjung_id` int(11) DEFAULT NULL, + PRIMARY KEY (`pkk_id`), + KEY `kunjunganklinik_pengunjung_FK` (`pkk_klinik_id`), + KEY `kunjunganklinik_pengunjung` (`pkk_pengunjung_id`), + CONSTRAINT `kunjunganklinik_klinik_FK` FOREIGN KEY (`pkk_klinik_id`) REFERENCES `master_klinik` (`mk_id`) ON DELETE SET NULL ON UPDATE SET NULL, + CONSTRAINT `kunjunganklinik_pengunjung` FOREIGN KEY (`pkk_pengunjung_id`) REFERENCES `proses_pengunjung` (`pp_id`) ON DELETE SET NULL ON UPDATE SET NULL +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4; + +/*Data for the table `proses_kunjung_klinik` */ + +insert into `proses_kunjung_klinik`(`pkk_id`,`pkk_tanggal_datang`,`pkk_tanggal_selesai`,`pkk_klinik_id`,`pkk_pengunjung_id`) values (1,'2020-07-10 01:34:23',NULL,1,134),(2,'2020-07-10 01:34:30',NULL,2,140),(3,'2020-07-10 01:34:31',NULL,2,141); + +/*Table structure for table `proses_kunjung_loket` */ + +DROP TABLE IF EXISTS `proses_kunjung_loket`; + +CREATE TABLE `proses_kunjung_loket` ( + `pkl_id` int(11) NOT NULL AUTO_INCREMENT, + `pkl_tanggal_datang` datetime DEFAULT NULL, + `pkl_tanggal_selesai` datetime DEFAULT NULL, + `pkl_loket_id` int(11) DEFAULT NULL, + `pkl_pengunjung_id` int(11) DEFAULT NULL, + PRIMARY KEY (`pkl_id`), + KEY `kunjunganloket_loket_FK` (`pkl_loket_id`), + KEY `kunjunganloket_pengunjung_FK` (`pkl_pengunjung_id`), + CONSTRAINT `kunjunganloket_loket_FK` FOREIGN KEY (`pkl_loket_id`) REFERENCES `master_loket` (`ml_id`) ON DELETE SET NULL ON UPDATE SET NULL, + CONSTRAINT `kunjunganloket_pengunjung_FK` FOREIGN KEY (`pkl_pengunjung_id`) REFERENCES `proses_pengunjung` (`pp_id`) ON DELETE SET NULL ON UPDATE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +/*Data for the table `proses_kunjung_loket` */ + +/*Table structure for table `proses_pengunjung` */ + +DROP TABLE IF EXISTS `proses_pengunjung`; + +CREATE TABLE `proses_pengunjung` ( + `pp_id` int(11) NOT NULL AUTO_INCREMENT, + `pp_nomor_antrian` varchar(10) DEFAULT NULL, + `pp_shift` int(5) DEFAULT NULL, + `pp_tanggal_periksa` date DEFAULT NULL, + `pp_tanggal_datang` datetime DEFAULT NULL, + `pp_posisi_status` int(5) DEFAULT NULL, + `pp_pendaftaran_online` varchar(10) DEFAULT NULL, + `pp_rekamedik` varchar(10) DEFAULT NULL, + `pp_status` int(5) DEFAULT NULL, + `pp_aktif` int(5) DEFAULT NULL, + `pp_klinik_id` int(11) DEFAULT NULL, + `pp_barcode` varchar(15) DEFAULT NULL, + `pp_nomor_antrian_klinik` varchar(10) DEFAULT NULL, + PRIMARY KEY (`pp_id`), + KEY `pengunjung_klinik_FK` (`pp_klinik_id`), + CONSTRAINT `pengunjung_klinik_FK` FOREIGN KEY (`pp_klinik_id`) REFERENCES `master_klinik` (`mk_id`) ON DELETE SET NULL ON UPDATE SET NULL +) ENGINE=InnoDB AUTO_INCREMENT=188 DEFAULT CHARSET=utf8mb4; + +/*Data for the table `proses_pengunjung` */ + +insert into `proses_pengunjung`(`pp_id`,`pp_nomor_antrian`,`pp_shift`,`pp_tanggal_periksa`,`pp_tanggal_datang`,`pp_posisi_status`,`pp_pendaftaran_online`,`pp_rekamedik`,`pp_status`,`pp_aktif`,`pp_klinik_id`,`pp_barcode`,`pp_nomor_antrian_klinik`) values (4,'AN1001',1,'2020-06-27','2020-06-25 11:33:16',1,NULL,NULL,NULL,NULL,1,NULL,NULL),(5,'AN1002',1,'2020-06-27','2020-06-25 11:34:00',1,NULL,NULL,NULL,NULL,1,NULL,NULL),(6,'JT1001',1,'2020-06-26','2020-06-25 01:06:31',1,NULL,NULL,NULL,NULL,2,NULL,NULL),(7,'OB2001',2,'2020-06-26','2020-06-25 01:13:35',1,'002121','11003532',NULL,NULL,4,NULL,NULL),(9,'AN1003',1,'2020-06-27','2020-06-26 09:20:06',1,NULL,NULL,NULL,NULL,1,NULL,NULL),(14,'AN2004',2,'2020-06-27','2020-06-26 09:22:23',1,NULL,NULL,NULL,NULL,1,NULL,NULL),(15,'AN2005',2,'2020-06-27','2020-06-26 09:22:25',1,NULL,NULL,NULL,NULL,1,NULL,NULL),(19,'AN2006',2,'2020-06-27','2020-06-26 09:28:44',1,NULL,NULL,NULL,NULL,1,NULL,NULL),(20,'AN3007',3,'2020-06-27','2020-06-26 09:28:49',1,NULL,NULL,NULL,NULL,1,NULL,NULL),(21,'AN3008',3,'2020-06-27','2020-06-26 09:28:51',1,NULL,NULL,NULL,NULL,1,NULL,NULL),(23,'JT2001',2,'2020-06-27','2020-06-27 10:25:29',1,NULL,NULL,NULL,NULL,2,NULL,NULL),(24,'AN3009',3,'2020-06-27','2020-06-27 12:00:21',2,NULL,NULL,NULL,NULL,1,NULL,NULL),(25,'AN1001',1,'2020-06-29','2020-06-27 04:39:03',1,NULL,NULL,NULL,NULL,1,NULL,NULL),(26,'AN3002',3,'2020-06-29','2020-06-29 08:55:32',1,NULL,NULL,NULL,NULL,1,NULL,NULL),(27,'AN2003',2,'2020-06-29','2020-06-29 10:02:12',1,NULL,NULL,NULL,NULL,1,NULL,NULL),(28,'AN1004',1,'2020-06-29','2020-06-29 10:02:17',1,NULL,NULL,NULL,NULL,1,NULL,NULL),(29,'AN1005',1,'2020-06-29','2020-06-29 10:02:20',1,NULL,NULL,NULL,NULL,1,NULL,NULL),(30,'AN2006',2,'2020-06-29','2020-06-29 10:09:48',1,NULL,NULL,NULL,NULL,1,NULL,NULL),(31,'AN2007',2,'2020-06-29','2020-06-29 10:10:13',1,NULL,NULL,NULL,NULL,1,NULL,NULL),(32,'AN3008',3,'2020-06-29','2020-06-29 10:11:27',1,NULL,NULL,NULL,NULL,1,NULL,NULL),(35,'JT1001',1,'2020-06-29','2020-06-29 10:43:35',1,NULL,NULL,NULL,NULL,2,NULL,NULL),(41,'DL1001',1,'2020-06-29','2020-06-29 10:49:25',1,NULL,NULL,NULL,NULL,5,NULL,NULL),(42,'DL2002',2,'2020-06-29','2020-06-29 10:49:44',1,NULL,NULL,NULL,NULL,5,NULL,NULL),(43,'DL1003',1,'2020-06-29','2020-06-29 10:50:21',1,NULL,NULL,NULL,NULL,5,NULL,NULL),(44,'DL1004',1,'2020-06-29','2020-06-29 10:50:29',1,NULL,NULL,NULL,NULL,5,NULL,NULL),(45,'DL1005',1,'2020-06-29','2020-06-29 10:50:42',1,NULL,NULL,NULL,NULL,5,NULL,NULL),(46,'DL1006',1,'2020-06-29','2020-06-29 10:50:47',1,NULL,NULL,NULL,NULL,5,NULL,NULL),(52,'AN3009',3,'2020-06-29','2020-06-29 02:28:14',1,NULL,NULL,NULL,NULL,1,'200629301009',NULL),(53,'AN1001',1,'2020-07-02','2020-07-02 07:45:51',1,NULL,NULL,1,NULL,1,'200702101001',NULL),(54,'AN1002',1,'2020-07-02','2020-07-02 07:45:53',1,NULL,NULL,1,NULL,1,'200702101002',NULL),(55,'AN1003',1,'2020-07-02','2020-07-02 07:45:55',1,NULL,NULL,1,NULL,1,'200702101003',NULL),(56,'AN2004',2,'2020-07-02','2020-07-02 10:02:07',1,NULL,NULL,1,NULL,1,'200702201004',NULL),(57,'DL1001',1,'2020-07-02','2020-07-02 11:57:51',1,NULL,NULL,NULL,NULL,5,'200702105001',NULL),(58,'JT1001',1,'2020-07-02','2020-07-02 11:57:54',1,NULL,NULL,1,NULL,2,'200702102001',NULL),(59,'AN1001',1,'2020-07-03','2020-07-03 05:22:51',1,NULL,NULL,1,NULL,1,'200703100001',NULL),(60,'AN1002',1,'2020-07-03','2020-07-03 05:22:54',1,NULL,NULL,1,NULL,1,'200703100002',NULL),(61,'OB1001',1,'2020-07-03','2020-07-03 05:22:56',1,NULL,NULL,1,NULL,4,'200703100003',NULL),(64,'OB1002',1,'2020-07-03','2020-07-03 05:24:36',1,NULL,NULL,1,NULL,4,'200703100004',NULL),(89,'AN1001',1,'2020-07-05','2020-07-05 05:55:31',1,NULL,NULL,NULL,NULL,1,'200705100001',NULL),(90,'AN1002',1,'2020-07-05','2020-07-05 05:55:32',1,NULL,NULL,NULL,NULL,1,'200705100002',NULL),(91,'AN1003',1,'2020-07-05','2020-07-05 05:55:34',1,NULL,NULL,NULL,NULL,1,'200705100003',NULL),(92,'OB1001',1,'2020-07-05','2020-07-05 05:55:37',1,NULL,NULL,NULL,NULL,4,'200705100004',NULL),(93,'AN2004',2,'2020-07-05','2020-07-05 05:55:39',1,NULL,NULL,NULL,NULL,1,'200705200005',NULL),(94,'AN2005',2,'2020-07-05','2020-07-05 05:55:41',1,NULL,NULL,NULL,NULL,1,'200705200006',NULL),(95,'OB1002',1,'2020-07-05','2020-07-05 05:55:43',1,NULL,NULL,NULL,NULL,4,'200705100007',NULL),(96,'OB2003',2,'2020-07-05','2020-07-05 05:55:45',1,NULL,NULL,NULL,NULL,4,'200705200008',NULL),(97,'AN1001',1,'2020-07-06','2020-07-06 08:48:12',1,NULL,NULL,1,NULL,1,'200706100001',NULL),(98,'AN1002',1,'2020-07-06','2020-07-06 08:48:14',1,NULL,NULL,1,NULL,1,'200706100002',NULL),(99,'AN1003',1,'2020-07-06','2020-07-06 08:48:15',1,NULL,NULL,1,NULL,1,'200706100003',NULL),(100,'AN2004',2,'2020-07-06','2020-07-06 08:48:17',1,NULL,NULL,1,NULL,1,'200706200004',NULL),(101,'DL1001',1,'2020-07-06','2020-07-06 08:48:20',1,NULL,NULL,NULL,NULL,5,'200706100005',NULL),(102,'JT1001',1,'2020-07-06','2020-07-06 08:48:22',1,NULL,NULL,1,NULL,2,'200706100006',NULL),(103,'DL1002',1,'2020-07-06','2020-07-06 08:48:23',1,NULL,NULL,NULL,NULL,5,'200706100007',NULL),(104,'DL1003',1,'2020-07-06','2020-07-06 08:48:25',1,NULL,NULL,NULL,NULL,5,'200706100008',NULL),(105,'JT1002',1,'2020-07-06','2020-07-06 08:48:28',1,NULL,NULL,1,NULL,2,'200706100009',NULL),(106,'JT2003',2,'2020-07-06','2020-07-06 08:48:31',1,NULL,NULL,1,NULL,2,'200706200010',NULL),(107,'AN2005',2,'2020-07-06','2020-07-06 11:32:21',1,NULL,NULL,1,NULL,1,'200706200011',NULL),(108,'AN2006',2,'2020-07-06','2020-07-06 11:32:23',1,NULL,NULL,1,NULL,1,'200706200012',NULL),(109,'JT2004',2,'2020-07-06','2020-07-06 11:32:27',1,NULL,NULL,1,NULL,2,'200706200013',NULL),(110,'JT3005',3,'2020-07-06','2020-07-06 11:32:28',1,NULL,NULL,NULL,NULL,2,'200706300014',NULL),(111,'AN3007',3,'2020-07-06','2020-07-06 12:34:01',1,NULL,NULL,NULL,NULL,1,'200706300015',NULL),(112,'AN3008',3,'2020-07-06','2020-07-06 12:34:03',1,NULL,NULL,NULL,NULL,1,'200706300016',NULL),(113,'AN3009',3,'2020-07-06','2020-07-06 12:39:10',1,NULL,NULL,NULL,NULL,1,'200706300017',NULL),(114,'JT3006',3,'2020-07-06','2020-07-06 12:39:35',1,NULL,NULL,NULL,NULL,2,'200706300018',NULL),(115,'AN1001',1,'2020-07-08','2020-07-08 08:08:29',1,NULL,NULL,1,NULL,1,'200708100001',NULL),(116,'DL1001',1,'2020-07-08','2020-07-08 08:08:32',1,NULL,NULL,NULL,NULL,5,'200708100002',NULL),(117,'JT1001',1,'2020-07-08','2020-07-08 08:08:34',1,NULL,NULL,1,NULL,2,'200708100003',NULL),(118,'OB1001',1,'2020-07-08','2020-07-08 08:08:36',1,NULL,NULL,1,NULL,4,'200708100004',NULL),(119,'AN1002',1,'2020-07-08','2020-07-08 08:08:38',1,NULL,NULL,1,NULL,1,'200708100005',NULL),(120,'DL1002',1,'2020-07-08','2020-07-08 08:08:40',1,NULL,NULL,NULL,NULL,5,'200708100006',NULL),(121,'AN1003',1,'2020-07-08','2020-07-08 08:08:42',1,NULL,NULL,1,NULL,1,'200708100007',NULL),(122,'AN2004',2,'2020-07-08','2020-07-08 08:08:43',1,NULL,NULL,1,NULL,1,'200708200008',NULL),(123,'AN2005',2,'2020-07-08','2020-07-08 08:19:18',1,NULL,NULL,NULL,NULL,1,'200708200009',NULL),(124,'AN2006',2,'2020-07-08','2020-07-08 08:20:01',1,NULL,NULL,NULL,NULL,1,'200708200010',NULL),(125,'AN3007',3,'2020-07-08','2020-07-08 09:19:07',1,NULL,NULL,NULL,NULL,1,'200708300011',NULL),(126,'AN3008',3,'2020-07-08','2020-07-08 09:19:09',1,NULL,NULL,NULL,NULL,1,'200708300012',NULL),(127,'DL1003',1,'2020-07-08','2020-07-08 09:19:12',1,NULL,NULL,NULL,NULL,5,'200708100013',NULL),(128,'JT1002',1,'2020-07-08','2020-07-08 09:19:15',1,NULL,NULL,NULL,NULL,2,'200708100014',NULL),(129,'OB1002',1,'2020-07-08','2020-07-08 09:19:17',1,NULL,NULL,NULL,NULL,4,'200708100015',NULL),(130,'AN3009',3,'2020-07-08','2020-07-08 09:50:15',1,NULL,NULL,NULL,NULL,1,'200708300016',NULL),(131,'DL1004',1,'2020-07-08','2020-07-08 09:50:19',1,NULL,NULL,NULL,NULL,5,'200708100017',NULL),(132,'DL1005',1,'2020-07-08','2020-07-08 09:50:21',1,NULL,NULL,NULL,NULL,5,'200708100018',NULL),(133,'AN1001',1,'2020-07-10','2020-07-10 08:46:17',1,NULL,NULL,1,NULL,1,'200710100001',NULL),(134,'AN1002',1,'2020-07-10','2020-07-10 08:46:19',1,NULL,NULL,1,NULL,1,'200710100002',NULL),(135,'AN1003',1,'2020-07-10','2020-07-10 08:46:21',1,NULL,NULL,1,NULL,1,'200710100003',NULL),(136,'DL1001',1,'2020-07-10','2020-07-10 08:46:23',1,NULL,NULL,NULL,NULL,5,'200710100004',NULL),(137,'DL1002',1,'2020-07-10','2020-07-10 08:46:25',1,NULL,NULL,NULL,NULL,5,'200710100005',NULL),(138,'DL1003',1,'2020-07-10','2020-07-10 08:46:27',1,NULL,NULL,NULL,NULL,5,'200710100006',NULL),(139,'DL1004',1,'2020-07-10','2020-07-10 08:46:30',1,NULL,NULL,NULL,NULL,5,'200710100007',NULL),(140,'JT1001',1,'2020-07-10','2020-07-10 08:46:32',1,NULL,NULL,1,NULL,2,'200710100008',NULL),(141,'JT1002',1,'2020-07-10','2020-07-10 08:46:34',1,NULL,NULL,1,NULL,2,'200710100009',NULL),(142,'OB1001',1,'2020-07-10','2020-07-10 08:46:37',1,NULL,NULL,1,NULL,4,'200710100010',NULL),(143,'OB1002',1,'2020-07-10','2020-07-10 08:46:38',1,NULL,NULL,1,NULL,4,'200710100011',NULL),(144,'AN2004',2,'2020-07-10','2020-07-10 09:50:23',1,NULL,NULL,1,NULL,1,'200710200012',NULL),(145,'AN2005',2,'2020-07-10','2020-07-10 09:50:25',1,NULL,NULL,1,NULL,1,'200710200013',NULL),(146,'DL1005',1,'2020-07-10','2020-07-10 09:50:27',1,NULL,NULL,NULL,NULL,5,'200710100014',NULL),(147,'OB2003',2,'2020-07-10','2020-07-10 09:50:31',1,NULL,NULL,1,NULL,4,'200710200015',NULL),(148,'JT2003',2,'2020-07-10','2020-07-10 09:50:32',1,NULL,NULL,1,NULL,2,'200710200016',NULL),(149,'AN1001',1,'2020-07-14','2020-07-14 07:48:17',1,NULL,NULL,1,NULL,1,'200714100001',NULL),(150,'AN1002',1,'2020-07-14','2020-07-14 07:48:28',1,'1231354','11232355',1,NULL,1,'200714100002',NULL),(151,'AN1003',1,'2020-07-14','2020-07-14 07:49:39',1,NULL,NULL,1,NULL,1,'200714100003',NULL),(152,'AN2004',2,'2020-07-14','2020-07-14 07:49:53',1,NULL,NULL,NULL,NULL,1,'200714200004',NULL),(153,'AN2005',2,'2020-07-14','2020-07-14 07:50:05',1,NULL,NULL,NULL,NULL,1,'200714200005',NULL),(154,'AN2006',2,'2020-07-14','2020-07-14 07:50:22',1,NULL,NULL,NULL,NULL,1,'200714200006',NULL),(155,'AN3007',3,'2020-07-14','2020-07-14 07:51:34',1,NULL,NULL,NULL,NULL,1,'200714300007',NULL),(156,'JT1001',1,'2020-07-14','2020-07-14 07:51:39',1,NULL,NULL,1,NULL,2,'200714100008',NULL),(157,'JT1002',1,'2020-07-14','2020-07-14 07:51:40',1,NULL,NULL,1,NULL,2,'200714100009',NULL),(158,'AN3008',3,'2020-07-14','2020-07-14 07:52:53',1,NULL,NULL,NULL,NULL,1,'200714300010',NULL),(159,'AN3009',3,'2020-07-14','2020-07-14 07:52:55',1,NULL,NULL,NULL,NULL,1,'200714300011',NULL),(160,'AN1001',1,'2020-07-16','2020-07-16 09:11:56',1,NULL,NULL,1,NULL,1,'200716100001',NULL),(161,'AN2002',2,'2020-07-16','2020-07-16 09:12:05',1,NULL,NULL,NULL,NULL,1,'200716200002',NULL),(162,'AN1003',1,'2020-07-16','2020-07-16 09:12:07',1,NULL,NULL,1,NULL,1,'200716100003',NULL),(163,'AN1004',1,'2020-07-16','2020-07-16 09:12:27',1,'213213213','11021223',1,NULL,1,'200716100004',NULL),(164,'AN2005',2,'2020-07-16','2020-07-16 09:16:07',1,NULL,NULL,NULL,NULL,1,'200716200005',NULL),(165,'AN2006',2,'2020-07-16','2020-07-16 09:16:13',1,NULL,NULL,NULL,NULL,1,'200716200006',NULL),(166,'DL1001',1,'2020-07-16','2020-07-16 11:41:14',1,NULL,NULL,NULL,NULL,5,'200716100007',NULL),(167,'JT1001',1,'2020-07-16','2020-07-16 11:41:16',1,NULL,'1122334455',1,NULL,2,'200716100008','KLJT001'),(168,'JT1002',1,'2020-07-16','2020-07-16 11:41:26',1,NULL,'21231515',1,NULL,2,'200716100009','KLJT002'),(169,'AN3007',3,'2020-07-16','2020-07-16 11:41:28',1,NULL,NULL,NULL,NULL,1,'200716300010',NULL),(170,'AN3008',3,'2020-07-16','2020-07-16 11:41:30',1,NULL,NULL,NULL,NULL,1,'200716300011',NULL),(171,'AN3009',3,'2020-07-16','2020-07-16 11:41:32',1,NULL,NULL,NULL,NULL,1,'200716300012',NULL),(172,'JT2003',2,'2020-07-16','2020-07-16 11:41:35',1,NULL,'3215646',1,NULL,2,'200716200013','KLJT003'),(173,'JT2004',2,'2020-07-16','2020-07-16 11:41:37',1,NULL,'1020',1,NULL,2,'200716200014','KLJT004'),(174,'JT3005',3,'2020-07-16','2020-07-16 01:35:47',1,NULL,NULL,NULL,NULL,2,'200716300015',NULL),(175,'AN1001',1,'2020-07-17','2020-07-17 08:30:22',1,NULL,'11223344',1,NULL,1,'200717100001','KLAN001'),(176,'DL1001',1,'2020-07-17','2020-07-17 08:30:26',1,NULL,NULL,NULL,NULL,5,'200717100002',NULL),(177,'JT1001',1,'2020-07-17','2020-07-17 08:30:28',1,NULL,'808080',1,NULL,2,'200717100003','KLJT001'),(178,'OB1001',1,'2020-07-17','2020-07-17 08:30:30',1,NULL,NULL,1,NULL,4,'200717100004',NULL),(179,'TH1001',1,'2020-07-17','2020-07-17 08:30:31',1,NULL,NULL,NULL,NULL,6,'200717100005',NULL),(180,'AN1002',1,'2020-07-17','2020-07-17 08:30:33',1,NULL,NULL,1,NULL,1,'200717100006',NULL),(181,'JT1002',1,'2020-07-17','2020-07-17 08:30:35',1,NULL,NULL,1,NULL,2,'200717100007',NULL),(182,'OB1002',1,'2020-07-17','2020-07-17 08:30:37',1,NULL,NULL,1,NULL,4,'200717100008',NULL),(183,'AN1003',1,'2020-07-17','2020-07-17 08:30:39',1,NULL,NULL,1,NULL,1,'200717100009',NULL),(184,'AN2004',2,'2020-07-17','2020-07-17 08:30:41',1,NULL,NULL,NULL,NULL,1,'200717200010',NULL),(185,'OB2003',2,'2020-07-17','2020-07-17 08:30:43',1,NULL,NULL,NULL,NULL,4,'200717200011',NULL),(186,'OB2004',2,'2020-07-17','2020-07-17 08:30:45',1,NULL,NULL,NULL,NULL,4,'200717200012',NULL),(187,'OB3005',3,'2020-07-17','2020-07-17 08:30:47',1,NULL,NULL,NULL,NULL,4,'200717300013',NULL); + +/*Table structure for table `proses_ruang_tunggu` */ + +DROP TABLE IF EXISTS `proses_ruang_tunggu`; + +CREATE TABLE `proses_ruang_tunggu` ( + `prt_id` int(11) NOT NULL AUTO_INCREMENT, + `prt_status` int(5) DEFAULT NULL, + `prt_tanggal` datetime DEFAULT NULL, + `prt_aktif` int(5) DEFAULT NULL, + `prt_pengunjung_id` int(5) DEFAULT NULL, + PRIMARY KEY (`prt_id`), + KEY `ruangtunggu_pengunjung_FK` (`prt_pengunjung_id`), + CONSTRAINT `ruangtunggu_pengunjung_FK` FOREIGN KEY (`prt_pengunjung_id`) REFERENCES `proses_pengunjung` (`pp_id`) ON DELETE SET NULL ON UPDATE SET NULL +) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8mb4; + +/*Data for the table `proses_ruang_tunggu` */ + +insert into `proses_ruang_tunggu`(`prt_id`,`prt_status`,`prt_tanggal`,`prt_aktif`,`prt_pengunjung_id`) values (1,0,'2020-07-08 11:26:04',1,115),(2,0,'2020-07-08 11:26:04',0,117),(3,0,'2020-07-08 11:26:04',0,118),(4,0,'2020-07-08 11:26:05',0,119),(5,0,'2020-07-08 11:26:05',0,121),(6,0,'2020-07-08 11:27:50',0,122),(7,4,'2020-07-10 08:49:51',0,133),(8,4,'2020-07-10 08:49:51',0,134),(9,0,'2020-07-10 08:49:51',0,135),(10,4,'2020-07-10 08:49:51',0,140),(11,4,'2020-07-10 08:49:51',0,141),(12,0,'2020-07-10 11:00:13',0,142),(13,0,'2020-07-10 11:00:13',0,143),(14,4,'2020-07-10 11:00:13',0,144),(15,0,'2020-07-10 11:04:47',0,145),(16,0,'2020-07-10 11:04:47',0,147),(17,0,'2020-07-10 11:04:47',0,148),(18,5,'2020-07-14 08:04:23',0,149),(19,4,'2020-07-14 08:04:23',0,150),(20,5,'2020-07-14 08:04:23',0,151),(21,5,'2020-07-14 08:04:23',0,156),(22,5,'2020-07-14 08:04:23',0,157),(23,5,'2020-07-16 09:18:50',0,160),(24,5,'2020-07-16 09:18:50',0,162),(25,1,'2020-07-16 09:18:50',0,163),(26,5,'2020-07-16 11:46:51',0,167),(27,5,'2020-07-16 11:46:51',0,168),(28,5,'2020-07-16 01:36:16',0,172),(29,5,'2020-07-16 01:36:16',0,173),(30,6,'2020-07-17 08:32:03',0,175),(31,4,'2020-07-17 08:32:03',0,177),(32,1,'2020-07-17 08:32:03',0,178),(33,1,'2020-07-17 08:32:03',0,180),(34,1,'2020-07-17 08:32:03',0,181),(35,1,'2020-07-17 11:00:30',0,182),(36,1,'2020-07-17 11:00:30',0,183); + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; diff --git a/antrian_rssa.zip b/antrian_rssa.zip new file mode 100644 index 0000000..7832ddb Binary files /dev/null and b/antrian_rssa.zip differ diff --git a/application/cache/index.html b/application/cache/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/application/cache/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/application/config/autoload.php b/application/config/autoload.php new file mode 100644 index 0000000..c2635f1 --- /dev/null +++ b/application/config/autoload.php @@ -0,0 +1,116 @@ + '', + 'xhtml1-strict' => '', + 'xhtml1-trans' => '', + 'xhtml1-frame' => '', + 'html5' => '', + 'html4-strict' => '', + 'html4-trans' => '', + 'html4-frame' => '' + ); + +/* End of file doctypes.php */ +/* Location: ./application/config/doctypes.php */ \ No newline at end of file diff --git a/application/config/foreign_chars.php b/application/config/foreign_chars.php new file mode 100644 index 0000000..14b0d73 --- /dev/null +++ b/application/config/foreign_chars.php @@ -0,0 +1,64 @@ + 'ae', + '/ö|œ/' => 'oe', + '/ü/' => 'ue', + '/Ä/' => 'Ae', + '/Ü/' => 'Ue', + '/Ö/' => 'Oe', + '/À|Á|Â|Ã|Ä|Å|Ǻ|Ā|Ă|Ą|Ǎ/' => 'A', + '/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª/' => 'a', + '/Ç|Ć|Ĉ|Ċ|Č/' => 'C', + '/ç|ć|ĉ|ċ|č/' => 'c', + '/Ð|Ď|Đ/' => 'D', + '/ð|ď|đ/' => 'd', + '/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě/' => 'E', + '/è|é|ê|ë|ē|ĕ|ė|ę|ě/' => 'e', + '/Ĝ|Ğ|Ġ|Ģ/' => 'G', + '/ĝ|ğ|ġ|ģ/' => 'g', + '/Ĥ|Ħ/' => 'H', + '/ĥ|ħ/' => 'h', + '/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ/' => 'I', + '/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı/' => 'i', + '/Ĵ/' => 'J', + '/ĵ/' => 'j', + '/Ķ/' => 'K', + '/ķ/' => 'k', + '/Ĺ|Ļ|Ľ|Ŀ|Ł/' => 'L', + '/ĺ|ļ|ľ|ŀ|ł/' => 'l', + '/Ñ|Ń|Ņ|Ň/' => 'N', + '/ñ|ń|ņ|ň|ʼn/' => 'n', + '/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ/' => 'O', + '/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º/' => 'o', + '/Ŕ|Ŗ|Ř/' => 'R', + '/ŕ|ŗ|ř/' => 'r', + '/Ś|Ŝ|Ş|Š/' => 'S', + '/ś|ŝ|ş|š|ſ/' => 's', + '/Ţ|Ť|Ŧ/' => 'T', + '/ţ|ť|ŧ/' => 't', + '/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ/' => 'U', + '/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ/' => 'u', + '/Ý|Ÿ|Ŷ/' => 'Y', + '/ý|ÿ|ŷ/' => 'y', + '/Ŵ/' => 'W', + '/ŵ/' => 'w', + '/Ź|Ż|Ž/' => 'Z', + '/ź|ż|ž/' => 'z', + '/Æ|Ǽ/' => 'AE', + '/ß/'=> 'ss', + '/IJ/' => 'IJ', + '/ij/' => 'ij', + '/Œ/' => 'OE', + '/ƒ/' => 'f' +); + +/* End of file foreign_chars.php */ +/* Location: ./application/config/foreign_chars.php */ \ No newline at end of file diff --git a/application/config/hooks.php b/application/config/hooks.php new file mode 100644 index 0000000..a4ad2be --- /dev/null +++ b/application/config/hooks.php @@ -0,0 +1,16 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/application/config/migration.php b/application/config/migration.php new file mode 100644 index 0000000..df42a3c --- /dev/null +++ b/application/config/migration.php @@ -0,0 +1,41 @@ +migration->latest() this is the version that schema will +| be upgraded / downgraded to. +| +*/ +$config['migration_version'] = 0; + + +/* +|-------------------------------------------------------------------------- +| Migrations Path +|-------------------------------------------------------------------------- +| +| Path to your migrations folder. +| Typically, it will be within your application path. +| Also, writing permission is required within the migrations path. +| +*/ +$config['migration_path'] = APPPATH . 'migrations/'; + + +/* End of file migration.php */ +/* Location: ./application/config/migration.php */ \ No newline at end of file diff --git a/application/config/mimes.php b/application/config/mimes.php new file mode 100644 index 0000000..100f7d4 --- /dev/null +++ b/application/config/mimes.php @@ -0,0 +1,106 @@ + 'application/mac-binhex40', + 'cpt' => 'application/mac-compactpro', + 'csv' => array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel'), + 'bin' => 'application/macbinary', + 'dms' => 'application/octet-stream', + 'lha' => 'application/octet-stream', + 'lzh' => 'application/octet-stream', + 'exe' => array('application/octet-stream', 'application/x-msdownload'), + 'class' => 'application/octet-stream', + 'psd' => 'application/x-photoshop', + 'so' => 'application/octet-stream', + 'sea' => 'application/octet-stream', + 'dll' => 'application/octet-stream', + 'oda' => 'application/oda', + 'pdf' => array('application/pdf', 'application/x-download'), + 'ai' => 'application/postscript', + 'eps' => 'application/postscript', + 'ps' => 'application/postscript', + 'smi' => 'application/smil', + 'smil' => 'application/smil', + 'mif' => 'application/vnd.mif', + 'xls' => array('application/excel', 'application/vnd.ms-excel', 'application/msexcel'), + 'ppt' => array('application/powerpoint', 'application/vnd.ms-powerpoint'), + 'wbxml' => 'application/wbxml', + 'wmlc' => 'application/wmlc', + 'dcr' => 'application/x-director', + 'dir' => 'application/x-director', + 'dxr' => 'application/x-director', + 'dvi' => 'application/x-dvi', + 'gtar' => 'application/x-gtar', + 'gz' => 'application/x-gzip', + 'php' => 'application/x-httpd-php', + 'php4' => 'application/x-httpd-php', + 'php3' => 'application/x-httpd-php', + 'phtml' => 'application/x-httpd-php', + 'phps' => 'application/x-httpd-php-source', + 'js' => 'application/x-javascript', + 'swf' => 'application/x-shockwave-flash', + 'sit' => 'application/x-stuffit', + 'tar' => 'application/x-tar', + 'tgz' => array('application/x-tar', 'application/x-gzip-compressed'), + 'xhtml' => 'application/xhtml+xml', + 'xht' => 'application/xhtml+xml', + 'zip' => array('application/x-zip', 'application/zip', 'application/x-zip-compressed'), + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mpga' => 'audio/mpeg', + 'mp2' => 'audio/mpeg', + 'mp3' => array('audio/mpeg', 'audio/mpg', 'audio/mpeg3', 'audio/mp3'), + 'aif' => 'audio/x-aiff', + 'aiff' => 'audio/x-aiff', + 'aifc' => 'audio/x-aiff', + 'ram' => 'audio/x-pn-realaudio', + 'rm' => 'audio/x-pn-realaudio', + 'rpm' => 'audio/x-pn-realaudio-plugin', + 'ra' => 'audio/x-realaudio', + 'rv' => 'video/vnd.rn-realvideo', + 'wav' => array('audio/x-wav', 'audio/wave', 'audio/wav'), + 'bmp' => array('image/bmp', 'image/x-windows-bmp'), + 'gif' => 'image/gif', + 'jpeg' => array('image/jpeg', 'image/pjpeg'), + 'jpg' => array('image/jpeg', 'image/pjpeg'), + 'jpe' => array('image/jpeg', 'image/pjpeg'), + 'png' => array('image/png', 'image/x-png'), + 'tiff' => 'image/tiff', + 'tif' => 'image/tiff', + 'css' => 'text/css', + 'html' => 'text/html', + 'htm' => 'text/html', + 'shtml' => 'text/html', + 'txt' => 'text/plain', + 'text' => 'text/plain', + 'log' => array('text/plain', 'text/x-log'), + 'rtx' => 'text/richtext', + 'rtf' => 'text/rtf', + 'xml' => 'text/xml', + 'xsl' => 'text/xml', + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mpe' => 'video/mpeg', + 'qt' => 'video/quicktime', + 'mov' => 'video/quicktime', + 'avi' => 'video/x-msvideo', + 'movie' => 'video/x-sgi-movie', + 'doc' => 'application/msword', + 'docx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip'), + 'xlsx' => array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip'), + 'word' => array('application/msword', 'application/octet-stream'), + 'xl' => 'application/excel', + 'eml' => 'message/rfc822', + 'json' => array('application/json', 'text/json') + ); + + +/* End of file mimes.php */ +/* Location: ./application/config/mimes.php */ diff --git a/application/config/profiler.php b/application/config/profiler.php new file mode 100644 index 0000000..f8a5b1a --- /dev/null +++ b/application/config/profiler.php @@ -0,0 +1,17 @@ + array('grin.gif', '19', '19', 'grin'), + ':lol:' => array('lol.gif', '19', '19', 'LOL'), + ':cheese:' => array('cheese.gif', '19', '19', 'cheese'), + ':)' => array('smile.gif', '19', '19', 'smile'), + ';-)' => array('wink.gif', '19', '19', 'wink'), + ';)' => array('wink.gif', '19', '19', 'wink'), + ':smirk:' => array('smirk.gif', '19', '19', 'smirk'), + ':roll:' => array('rolleyes.gif', '19', '19', 'rolleyes'), + ':-S' => array('confused.gif', '19', '19', 'confused'), + ':wow:' => array('surprise.gif', '19', '19', 'surprised'), + ':bug:' => array('bigsurprise.gif', '19', '19', 'big surprise'), + ':-P' => array('tongue_laugh.gif', '19', '19', 'tongue laugh'), + '%-P' => array('tongue_rolleye.gif', '19', '19', 'tongue rolleye'), + ';-P' => array('tongue_wink.gif', '19', '19', 'tongue wink'), + ':P' => array('raspberry.gif', '19', '19', 'raspberry'), + ':blank:' => array('blank.gif', '19', '19', 'blank stare'), + ':long:' => array('longface.gif', '19', '19', 'long face'), + ':ohh:' => array('ohh.gif', '19', '19', 'ohh'), + ':grrr:' => array('grrr.gif', '19', '19', 'grrr'), + ':gulp:' => array('gulp.gif', '19', '19', 'gulp'), + '8-/' => array('ohoh.gif', '19', '19', 'oh oh'), + ':down:' => array('downer.gif', '19', '19', 'downer'), + ':red:' => array('embarrassed.gif', '19', '19', 'red face'), + ':sick:' => array('sick.gif', '19', '19', 'sick'), + ':shut:' => array('shuteye.gif', '19', '19', 'shut eye'), + ':-/' => array('hmm.gif', '19', '19', 'hmmm'), + '>:(' => array('mad.gif', '19', '19', 'mad'), + ':mad:' => array('mad.gif', '19', '19', 'mad'), + '>:-(' => array('angry.gif', '19', '19', 'angry'), + ':angry:' => array('angry.gif', '19', '19', 'angry'), + ':zip:' => array('zip.gif', '19', '19', 'zipper'), + ':kiss:' => array('kiss.gif', '19', '19', 'kiss'), + ':ahhh:' => array('shock.gif', '19', '19', 'shock'), + ':coolsmile:' => array('shade_smile.gif', '19', '19', 'cool smile'), + ':coolsmirk:' => array('shade_smirk.gif', '19', '19', 'cool smirk'), + ':coolgrin:' => array('shade_grin.gif', '19', '19', 'cool grin'), + ':coolhmm:' => array('shade_hmm.gif', '19', '19', 'cool hmm'), + ':coolmad:' => array('shade_mad.gif', '19', '19', 'cool mad'), + ':coolcheese:' => array('shade_cheese.gif', '19', '19', 'cool cheese'), + ':vampire:' => array('vampire.gif', '19', '19', 'vampire'), + ':snake:' => array('snake.gif', '19', '19', 'snake'), + ':exclaim:' => array('exclaim.gif', '19', '19', 'excaim'), + ':question:' => array('question.gif', '19', '19', 'question') // no comma after last item + + ); + +/* End of file smileys.php */ +/* Location: ./application/config/smileys.php */ \ No newline at end of file diff --git a/application/config/user_agents.php b/application/config/user_agents.php new file mode 100644 index 0000000..e2d3c3a --- /dev/null +++ b/application/config/user_agents.php @@ -0,0 +1,178 @@ + 'Windows Longhorn', + 'windows nt 5.2' => 'Windows 2003', + 'windows nt 5.0' => 'Windows 2000', + 'windows nt 5.1' => 'Windows XP', + 'windows nt 4.0' => 'Windows NT 4.0', + 'winnt4.0' => 'Windows NT 4.0', + 'winnt 4.0' => 'Windows NT', + 'winnt' => 'Windows NT', + 'windows 98' => 'Windows 98', + 'win98' => 'Windows 98', + 'windows 95' => 'Windows 95', + 'win95' => 'Windows 95', + 'windows' => 'Unknown Windows OS', + 'os x' => 'Mac OS X', + 'ppc mac' => 'Power PC Mac', + 'freebsd' => 'FreeBSD', + 'ppc' => 'Macintosh', + 'linux' => 'Linux', + 'debian' => 'Debian', + 'sunos' => 'Sun Solaris', + 'beos' => 'BeOS', + 'apachebench' => 'ApacheBench', + 'aix' => 'AIX', + 'irix' => 'Irix', + 'osf' => 'DEC OSF', + 'hp-ux' => 'HP-UX', + 'netbsd' => 'NetBSD', + 'bsdi' => 'BSDi', + 'openbsd' => 'OpenBSD', + 'gnu' => 'GNU/Linux', + 'unix' => 'Unknown Unix OS' + ); + + +// The order of this array should NOT be changed. Many browsers return +// multiple browser types so we want to identify the sub-type first. +$browsers = array( + 'Flock' => 'Flock', + 'Chrome' => 'Chrome', + 'Opera' => 'Opera', + 'MSIE' => 'Internet Explorer', + 'Internet Explorer' => 'Internet Explorer', + 'Shiira' => 'Shiira', + 'Firefox' => 'Firefox', + 'Chimera' => 'Chimera', + 'Phoenix' => 'Phoenix', + 'Firebird' => 'Firebird', + 'Camino' => 'Camino', + 'Netscape' => 'Netscape', + 'OmniWeb' => 'OmniWeb', + 'Safari' => 'Safari', + 'Mozilla' => 'Mozilla', + 'Konqueror' => 'Konqueror', + 'icab' => 'iCab', + 'Lynx' => 'Lynx', + 'Links' => 'Links', + 'hotjava' => 'HotJava', + 'amaya' => 'Amaya', + 'IBrowse' => 'IBrowse' + ); + +$mobiles = array( + // legacy array, old values commented out + 'mobileexplorer' => 'Mobile Explorer', +// 'openwave' => 'Open Wave', +// 'opera mini' => 'Opera Mini', +// 'operamini' => 'Opera Mini', +// 'elaine' => 'Palm', + 'palmsource' => 'Palm', +// 'digital paths' => 'Palm', +// 'avantgo' => 'Avantgo', +// 'xiino' => 'Xiino', + 'palmscape' => 'Palmscape', +// 'nokia' => 'Nokia', +// 'ericsson' => 'Ericsson', +// 'blackberry' => 'BlackBerry', +// 'motorola' => 'Motorola' + + // Phones and Manufacturers + 'motorola' => "Motorola", + 'nokia' => "Nokia", + 'palm' => "Palm", + 'iphone' => "Apple iPhone", + 'ipad' => "iPad", + 'ipod' => "Apple iPod Touch", + 'sony' => "Sony Ericsson", + 'ericsson' => "Sony Ericsson", + 'blackberry' => "BlackBerry", + 'cocoon' => "O2 Cocoon", + 'blazer' => "Treo", + 'lg' => "LG", + 'amoi' => "Amoi", + 'xda' => "XDA", + 'mda' => "MDA", + 'vario' => "Vario", + 'htc' => "HTC", + 'samsung' => "Samsung", + 'sharp' => "Sharp", + 'sie-' => "Siemens", + 'alcatel' => "Alcatel", + 'benq' => "BenQ", + 'ipaq' => "HP iPaq", + 'mot-' => "Motorola", + 'playstation portable' => "PlayStation Portable", + 'hiptop' => "Danger Hiptop", + 'nec-' => "NEC", + 'panasonic' => "Panasonic", + 'philips' => "Philips", + 'sagem' => "Sagem", + 'sanyo' => "Sanyo", + 'spv' => "SPV", + 'zte' => "ZTE", + 'sendo' => "Sendo", + + // Operating Systems + 'symbian' => "Symbian", + 'SymbianOS' => "SymbianOS", + 'elaine' => "Palm", + 'palm' => "Palm", + 'series60' => "Symbian S60", + 'windows ce' => "Windows CE", + + // Browsers + 'obigo' => "Obigo", + 'netfront' => "Netfront Browser", + 'openwave' => "Openwave Browser", + 'mobilexplorer' => "Mobile Explorer", + 'operamini' => "Opera Mini", + 'opera mini' => "Opera Mini", + + // Other + 'digital paths' => "Digital Paths", + 'avantgo' => "AvantGo", + 'xiino' => "Xiino", + 'novarra' => "Novarra Transcoder", + 'vodafone' => "Vodafone", + 'docomo' => "NTT DoCoMo", + 'o2' => "O2", + + // Fallback + 'mobile' => "Generic Mobile", + 'wireless' => "Generic Mobile", + 'j2me' => "Generic Mobile", + 'midp' => "Generic Mobile", + 'cldc' => "Generic Mobile", + 'up.link' => "Generic Mobile", + 'up.browser' => "Generic Mobile", + 'smartphone' => "Generic Mobile", + 'cellphone' => "Generic Mobile" + ); + +// There are hundreds of bots but these are the most common. +$robots = array( + 'googlebot' => 'Googlebot', + 'msnbot' => 'MSNBot', + 'slurp' => 'Inktomi Slurp', + 'yahoo' => 'Yahoo', + 'askjeeves' => 'AskJeeves', + 'fastcrawler' => 'FastCrawler', + 'infoseek' => 'InfoSeek Robot 1.0', + 'lycos' => 'Lycos' + ); + +/* End of file user_agents.php */ +/* Location: ./application/config/user_agents.php */ \ No newline at end of file diff --git a/application/controllers/login.php b/application/controllers/login.php new file mode 100644 index 0000000..041a1f2 --- /dev/null +++ b/application/controllers/login.php @@ -0,0 +1,29 @@ +load->view('login/v_login',$data); + } + public function process(){ + $this->load->model('m_login'); + $result = $this->m_login->validate(); + if(! $result){ + $error = '
+ + Username atau Password Salah! +
'; + $this->index($error); + }else{ + redirect('index.php/ps_anjungan/admin_anjungan'); + } + } + public function logout(){ + $this->session->sess_destroy(); + redirect('index.php/login'); + } +} +?> \ No newline at end of file diff --git a/application/controllers/ps_anjungan.php b/application/controllers/ps_anjungan.php new file mode 100644 index 0000000..432cb3b --- /dev/null +++ b/application/controllers/ps_anjungan.php @@ -0,0 +1,429 @@ +check_isvalidated(); + $this->load->helper(array('form', 'date')); + } +// private function check_isvalidated(){ +// if(! $this->session->userdata('validated')){ +// redirect('index.php/login'); +// } + +//--------------start check access this form page-------------// +// $this->db->where('mum_tipeuser_id', $this->session->userdata('s_FK_TipeUser')); +// $this->db->where('mum_menu_id', '9'); +// $cekMenu = $this->db->get('master_user_menu'); +// $rowcount = $cekMenu->num_rows(); +// if($rowcount==0){ +// redirect('index.php'); +// }else{ +// foreach ($cekMenu->result() as $cm) +// { +// $this->vartambah=$cm->mum_tambah; +// $this->varedit=$cm->mum_ubah; +// $this->vardelete=$cm->mum_hapus; +// $this->varview=$cm->mum_lihat; +// } +// } +//--------------end check access this form page-------------// +// } + + public function index($error = NULL) { + //-----------------start untuk cek jam shift, jam shift, dan aktif klinik------------------// + $this->load->model('m_anjungan'); + $info_pengunjung = $this->m_anjungan->cek_shift_jam(); + + $this->load->model('m_anjungan'); + $cekanjungan = $this->m_anjungan->cekanjungan(); + //-----------------end untuk cek jam shift, jam shift, dan aktif klinik------------------// + + $data['title'] = 'Anjungan'; + $data['main_content'] = 'anjungan/v_anjungan'; + $data['error']=$error; + + $this->load->model('m_klinik'); + $masterklinik = $this->m_klinik->klinikasc(); + $this->load->vars('mk', $masterklinik); + + $this->load->model('m_anjungan'); + $terlambat = $this->m_anjungan->anjunganterlambat(); + $this->load->vars('tr', $terlambat); + + $this->load->view('includes3/template', $data); + + } + + public function admin_anjungan(){ + if(! $this->session->userdata('validated')){ + redirect('index.php/login'); + } + //-----------------start untuk cek jam shift, jam shift, dan aktif klinik------------------// + $this->load->model('m_anjungan'); + $info_pengunjung = $this->m_anjungan->cek_shift_jam(); + + $this->load->model('m_anjungan'); + $cekanjungan = $this->m_anjungan->cekanjungan(); + //-----------------end untuk cek jam shift, jam shift, dan aktif klinik------------------// + + $data['title'] = 'Admin Anjungan'; + $data['main_content'] = 'anjungan/v_admin_anjungan'; + + $this->load->model('m_klinik'); + $masterklinik = $this->m_klinik->klinikasc(); + $this->load->vars('mk', $masterklinik); + + $this->load->model('m_anjungan'); + $terlambat = $this->m_anjungan->anjunganterlambat(); + $this->load->vars('tr', $terlambat); + + $this->load->model('m_anjungan'); + $fasttrack = $this->m_anjungan->batasallpasien(); + $this->load->vars('fs', $fasttrack); + + $this->load->model('m_klinik'); + $masterklinik = $this->m_klinik->klinikasc(); + $this->load->vars('mk', $masterklinik); + + $this->load->view('includes/template', $data); + } + + public function print_ulang($id,$ket){ + $data['title'] = 'Anjungan'; + $data['main_content'] = 'print/print_anjungan/p_print_ulang'; + $data['ket']=$ket; + + $this->load->model('m_anjungan'); + $fasttrack = $this->m_anjungan->cetakulang($id); + $this->load->vars('cu', $fasttrack); + + $this->load->model('m_loket'); + $getloket = $this->m_loket->index(); + $this->load->vars('lk', $getloket); + + $this->load->view('print/print_anjungan/p_print_ulang',$data); + + } + + public function sekarang($id,$shift,$pembayaran){ + $data['title'] = 'Anjungan'; + $data['main_content'] = 'print/print_anjungan/p_sekarang'; + $data['idklinik']=$id; + $data['ket']="1"; + + $this->load->model('m_anjungan'); + $sekarang = $this->m_anjungan->insert_sekarang($id,$shift,1,$pembayaran); + + if($sekarang===FALSE){ + $this->session->set_flashdata('messagefalse', 'Anda gagal mendaftar, coba lagi!'); + redirect('index.php/ps_anjungan'); + }else{ + $this->load->model('m_anjungan'); + $getpas = $this->m_anjungan->datapengunjung($id); + $this->load->vars('dp', $getpas); + + $this->load->model('m_loket'); + $getloket = $this->m_loket->index(); + $this->load->vars('lk', $getloket); + + $this->load->view('print/print_anjungan/p_sekarang',$data); + //redirect('index.php/ps_anjungan'); + } + } + + public function print_pengantar($id,$ket){ + $data['title'] = 'Anjungan'; + $data['main_content'] = 'print/print_anjungan/p_pengantar'; + $data['ket']=$ket; + + $this->load->model('m_anjungan'); + $getpas = $this->m_anjungan->datapengunjungthis($id); + $this->load->vars('dp', $getpas); + + $this->load->view('print/print_anjungan/p_pengantar',$data); + } + + public function pesan(){ + $data['title'] = 'Anjungan'; + $data['main_content'] = 'print/print_anjungan/p_sekarang'; + + $this->load->model('m_anjungan'); + $this->m_anjungan->insert_pesan(); + + $idk = $this->input->post('idklinikpesan'); + $data['tglperiksa']=$this->input->post('tanggalpesan'); + $data['idklinik']=$idk; + $data['ket']="2"; + + + $this->load->model('m_anjungan'); + $getpas = $this->m_anjungan->datapengunjungpesan($idk,$this->input->post('tanggalpesan'),$this->input->post('shiftpesan')); + $this->load->vars('dp', $getpas); + + $this->load->model('m_loket'); + $getloket = $this->m_loket->index(); + $this->load->vars('lk', $getloket); + + $this->load->view('print/print_anjungan/p_sekarang',$data); + + //redirect('index.php/ps_anjungan'); + } + + public function daftar_online(){ + $data['title'] = 'Anjungan'; + $data['main_content'] = 'print/print_anjungan/p_sekarang'; + $data['idklinik']=$this->input->post('klinik'); + $data['ket']="3"; + + $idk = $this->input->post('klinik'); + + $this->load->model('m_anjungan'); + $this->m_anjungan->insert_daftar_online(); + + $this->load->model('m_anjungan'); + $getpas = $this->m_anjungan->datapengunjung($idk); + $this->load->vars('dp', $getpas); + + $this->load->model('m_loket'); + $getloket = $this->m_loket->index(); + $this->load->vars('lk', $getloket); + + $this->load->view('print/print_anjungan/p_sekarang',$data); + //redirect('index.php/ps_anjungan'); + } + + public function fasttrack(){ + $id=$this->input->post('idkliniksekarangFS'); + $shift=$this->input->post('shiftsekarangFS'); + $pembayaran=$this->input->post('pembayaranfs'); + + $data['title'] = 'Anjungan'; + $data['main_content'] = 'print/print_anjungan/p_sekarang'; + $data['idklinik']=$id; + $data['ket']="4"; + + $this->load->model('m_anjungan'); + $this->m_anjungan->insert_sekarang($id,$shift,4,$pembayaran); + + $this->load->model('m_anjungan'); + $getpas = $this->m_anjungan->datapengunjung($id); + $this->load->vars('dp', $getpas); + + $this->load->model('m_loket'); + $getloket = $this->m_loket->index(); + $this->load->vars('lk', $getloket); + + $this->load->view('print/print_anjungan/p_fasttrack',$data); + } + + function datashift_pesan($bulan,$tanggal,$tahun){ + $idk = $this->input->post('idk'); + $tanggalpesan = $tahun."-".$bulan."-".$tanggal; + //$tanggalpesan = date("Y-m-d", strtotime($tanggalpesan)); + $jumshift; + $jumquota; + $jumpp=0; + $jadwal; + $jamshift; + //---------------------start get data klinik--------------// + $this->db->where('mk_id', $idk); + $query_kl = $this->db->get('master_klinik'); + foreach ($query_kl->result() as $datklinik ){ + $jumshift=$datklinik->mk_shift; + $jumquota=$datklinik->mk_quota; + $jadwal=$datklinik->mk_jadwal; + $jamshift=$datklinik->mk_jam_shift; + } + //---------------------end get data klinik--------------// + + $pecahjamshift = explode("|",$jamshift); + $numpecah = 0; + + for($i=1;$i<=$jumshift;$i++){ + $jumpp=0; + $aktif=0; + $setaktifdb=0; + $this->db->where('pp_tanggal_periksa', $tanggalpesan); + $this->db->where('pp_klinik_id', $idk); + $this->db->where('pp_shift', $i); + $query_pp = $this->db->get('proses_pengunjung'); + $jumpp = $query_pp->num_rows(); + + //----------------start cek hari sekarang klinik buka atau tidak----------------// + $hari = date("D", strtotime($tanggalpesan)); + switch($hari){ + case 'Sun':$hari_ini = "minggu";break;case 'Mon':$hari_ini = "senin";break;case 'Tue':$hari_ini = "selasa";break; + case 'Wed':$hari_ini = "rabu";break;case 'Thu':$hari_ini = "kamis";break;case 'Fri':$hari_ini = "jumat";break; + case 'Sat':$hari_ini = "sabtu";break;default:$hari_ini = "Tidak di ketahui";break; + } + $pecahjadwal = explode("|",$jadwal); + $jumdat = count($pecahjadwal); + for ($x = 0; $x <= $jumdat; $x++){ + if(isset($pecahjadwal[$x])){ + if($pecahjadwal[$x]==$hari_ini){$aktif=$aktif+1;} + } + } + if($aktif==0){$setaktifdb=1;} + //----------------end cek hari sekarang klinik buka atau tidak----------------// + + if($jumpp>=$jumquota){ + $data[] = ['datashiftpesan'=>""]; + }elseif($setaktifdb==1){ + $data[] = ['datashiftpesan'=>""]; + } + else{ + $data[] = ['datashiftpesan'=>""]; + } + $numpecah++; + + } + echo json_encode($data); + } + + function data_shift_klinik(){ + $id = $this->input->post('klinik'); + $query = $this->db->query("select * from master_klinik where mk_id='$id'"); + foreach ($query->result() as $row){ + $data[] = $row; + } + echo json_encode($data); + } + +//--------------------------------------------------------START ANTRIAN PENDAFTARAN 1--------------------------------// + function info_anjungan(){ + $data['title'] = 'Antrian Pendaftaran'; + $data['main_content'] = 'anjungan/v_info_anjungan'; + + $this->load->model('m_anjungan'); + $info_pengunjung = $this->m_anjungan->info_pengunjung(); + $this->load->vars('ip', $info_pengunjung); + + $this->load->model('m_klinik'); + $klinik = $this->m_klinik->index(); + $this->load->vars('mk', $klinik); + + //-----------------start untuk cek jam shift, jam shift, dan aktif klinik------------------// + $this->load->model('m_anjungan'); + $info_pengunjung = $this->m_anjungan->cek_shift_jam(); + + $this->load->model('m_anjungan'); + $cekanjungan = $this->m_anjungan->cekanjungan(); + //-----------------end untuk cek jam shift, jam shift, dan aktif klinik------------------// + + $this->load->view('includes3/template', $data); + } +//--------------------------------------------------------END ANTRIAN PENDAFTARAN--------------------------------// +//--------------------------------------------------------START ANTRIAN PENDAFTARAN 2--------------------------------// + function info_anjungan2(){ + $data['title'] = 'Antrian Pendaftaran'; + $data['main_content'] = 'anjungan/v_info_anjungan2'; + + $this->load->model('m_anjungan'); + $info_pengunjung = $this->m_anjungan->info_pengunjung(); + $this->load->vars('ip', $info_pengunjung); + + $this->load->model('m_klinik'); + $klinik = $this->m_klinik->index(); + $this->load->vars('mk', $klinik); + + $this->load->model('m_loket'); + $loket = $this->m_loket->index(); + $this->load->vars('ml', $loket); + + $this->load->view('includes3/template', $data); + } +//--------------------------------------------------------END ANTRIAN PENDAFTARAN--------------------------------// +//--------------------------------------------------------START ANTRIAN PENDAFTARAN 2--------------------------------// + function info_anjungan3(){ + $data['title'] = 'Antrian Pendaftaran'; + $data['main_content'] = 'anjungan/v_info_anjungan3'; + + $this->load->model('m_anjungan'); + $info_pengunjung = $this->m_anjungan->info_pengunjung(); + $this->load->vars('ip', $info_pengunjung); + + $this->load->model('m_klinik'); + $klinik = $this->m_klinik->index(); + $this->load->vars('mk', $klinik); + + $this->load->model('m_loket'); + $loket = $this->m_loket->index(); + $this->load->vars('ml', $loket); + + $this->load->view('includes3/template', $data); + } +//--------------------------------------------------------END ANTRIAN PENDAFTARAN--------------------------------// +//--------------------------------------------------------START BARCODE------------------------------------------------// + function barcode($barcode){ + $this->load->model('m_anjungan'); + $this->m_anjungan->barcode($barcode); + + redirect('index.php/ps_anjungan/admin_anjungan'); + } + +//--------------------------------------------------------END BARCODE------------------------------------------------// + function proses_datang($id){ + $this->load->model('m_anjungan'); + $this->m_anjungan->datang($id); + redirect('index.php/ps_anjungan/admin_anjungan'); + } +//--------------------------------------------------------START ANTRIAN KLINIK----------------------------------------------------------// + function proses_bypass($id){ + $this->load->model('m_anjungan'); + $this->m_anjungan->bypass($id); + redirect('index.php/ps_anjungan/admin_anjungan'); + } + + function info_klinik(){ + $data['title'] = 'Antrian Klinik'; + $data['main_content'] = 'anjungan/v_info_klinik'; + + $this->load->model('m_anjungan'); + $info_pengunjung = $this->m_anjungan->info_klinik(); + $this->load->vars('ip', $info_pengunjung); + + $this->load->model('m_anjungan'); + $info_panggil = $this->m_anjungan->panggilpasien(); + $this->load->vars('pg', $info_panggil); + + $this->load->model('m_klinik'); + $klinik = $this->m_klinik->index(); + $this->load->vars('mk', $klinik); + + //-----------------start untuk cek jam shift, jam shift, dan aktif klinik------------------// + $this->load->model('m_anjungan'); + $info_pengunjung = $this->m_anjungan->cek_shift_jam(); + + $this->load->model('m_anjungan'); + $cekanjungan = $this->m_anjungan->cekanjungan(); + //-----------------end untuk cek jam shift, jam shift, dan aktif klinik------------------// + + $this->load->view('includes3/template', $data); + } +//--------------------------------------------------------END ANTRIAN KLINIK----------------------------------------------------------// + public function panggil_anjungan_null($idpp){ + $this->load->model('m_loket'); + $this->m_loket->proses_panggil_anjungan_null($idpp); + + redirect('index.php/ps_anjungan/info_anjungan'); + } + + public function panggil_admin_null($idpp){ + $this->load->model('m_loket'); + $this->m_loket->proses_panggil_null($idpp); + + redirect('index.php/ps_anjungan/info_klinik'); + } +} + +?> \ No newline at end of file diff --git a/application/controllers/ps_fasttrack.php b/application/controllers/ps_fasttrack.php new file mode 100644 index 0000000..e2ea515 --- /dev/null +++ b/application/controllers/ps_fasttrack.php @@ -0,0 +1,93 @@ +check_isvalidated(); + $this->load->helper(array('form', 'date')); + } + private function check_isvalidated(){ + if(! $this->session->userdata('validated')){ + redirect('index.php/login'); + } + +//--------------start check access this form page-------------// + $this->db->where('mum_tipeuser_id', $this->session->userdata('s_FK_TipeUser')); + $this->db->where('mum_menu_id', '14'); + $cekMenu = $this->db->get('master_user_menu'); + $rowcount = $cekMenu->num_rows(); + if($rowcount==0){ + redirect('index.php'); + }else{ + foreach ($cekMenu->result() as $cm) + { + $this->vartambah=$cm->mum_tambah; + $this->varedit=$cm->mum_ubah; + $this->vardelete=$cm->mum_hapus; + $this->varview=$cm->mum_lihat; + } + } +//--------------end check access this form page-------------// + } + + public function index($error = NULL) { + $data['title'] = 'Fast Track'; + $data['main_content'] = 'fasttrack/v_fasttrack'; + //$data['main_content'] = 'maintenance'; + $data['error']=$error; + + $this->load->model('m_fasttrack'); + $fasttrack = $this->m_fasttrack->index(); + $this->load->vars('fs', $fasttrack); + + $this->load->view('includes/template', $data); + } + + public function set_fasttrack() { + //----start validate page tambah-------// + //if($this->vartambah==null){redirect('index.php/ps_fasttrack');} + //----end validate page tambah---------// + $this->load->helper('form'); + $this->load->helper('url'); + $this->load->library('form_validation'); + $this->form_validation->set_rules('penanggungjawab','Nama Penanggung Jawab','required'); + $this->form_validation->set_rules('ket','Alasan Fast Track','required'); + $id = $this->input->post('idpengunjung'); + + if($this->form_validation->run()==FALSE){ + $data['title'] = 'Fast Track'; + $data['main_content'] = 'fasttrack/v_fasttrack'; + $this->load->model('m_fasttrack'); + $fasttrack = $this->m_fasttrack->index(); + $this->load->vars('fs', $fasttrack); + $this->load->view('includes/template', $data); + }else{ + $this->load->model('m_fasttrack'); + $this->m_fasttrack->setfastrack(); + + $this->load->model('m_anjungan'); + $fasttrack = $this->m_anjungan->cetakulang($id); + $this->load->vars('cu', $fasttrack); + + $this->load->model('m_loket'); + $getloket = $this->m_loket->index(); + $this->load->vars('lk', $getloket); + + $this->load->view('print/print_anjungan/p_fasttrack2'); + + //$this->session->set_flashdata('message', 'Anda berhasil melakukan fast track'); + //redirect('index.php/ps_fasttrack'); + } + } +} + +?> \ No newline at end of file diff --git a/application/controllers/ps_hakakses.php b/application/controllers/ps_hakakses.php new file mode 100644 index 0000000..7405b31 --- /dev/null +++ b/application/controllers/ps_hakakses.php @@ -0,0 +1,212 @@ +check_isvalidated(); + $this->load->helper(array('form', 'date')); + } + private function check_isvalidated(){ + if(! $this->session->userdata('validated')){ + redirect('index.php/login'); + } + +//--------------start check access this form page-------------// + $this->db->where('mum_tipeuser_id', $this->session->userdata('s_FK_TipeUser')); + $this->db->where('mum_menu_id', '3'); + $cekMenu = $this->db->get('master_user_menu'); + $rowcount = $cekMenu->num_rows(); + if($rowcount==0){ + redirect('index.php'); + }else{ + foreach ($cekMenu->result() as $cm) + { + $this->vartambah=$cm->mum_tambah; + $this->varedit=$cm->mum_ubah; + $this->vardelete=$cm->mum_hapus; + $this->varview=$cm->mum_lihat; + } + } +//--------------end check access this form page-------------// + } + + public function index($error = NULL) { + $data['title'] = 'Hak Akses'; + $data['main_content'] = 'setting/hakakses/v_hakakses'; + $data['error']=$error; + $this->load->model('m_tipeuser'); + $hakakses = $this->m_tipeuser->index(); + $this->load->vars('ha', $hakakses); + $this->load->view('includes/template', $data); + } + +// fungsi untuk menampilkan form tambah data + public function add() { + //----start validate page tambah-------// + if($this->vartambah==null){redirect('index.php/ps_hakakses');} + //----end validate page tambah---------// + $data['title'] = 'Tambah Tipe User'; + $data['actionform'] = 'prosesadd'; + $data['main_content'] = 'setting/hakakses/form_tipeuser'; + + $this->load->view('includes/template', $data); + } + +//fungsi untuk memproses penambahan dengan memanggil model + public function prosesadd() { + //----start validate page tambah-------// + if($this->vartambah==null){redirect('index.php/ps_hakakses');} + //----end validate page tambah---------// + $this->load->helper('form'); + $this->load->helper('url'); + $this->load->library('form_validation'); + $this->form_validation->set_rules('namatipeuser','Nama Tipe User','required'); + + if($this->form_validation->run()==FALSE){ + $data['title'] = 'Tambah Tipe User'; + $data['actionform'] = 'prosesadd'; + $data['main_content'] = 'setting/hakakses/form_tipeuser'; + $this->load->view('includes/template', $data); + }else{ + $this->load->model('m_tipeuser'); + $this->m_tipeuser->insert(); + $this->session->set_flashdata('message', 'Anda berhasil menambahkan Tipe User baru'); + redirect('index.php/ps_hakakses'); + } + } + +//fungsi untuk menampilkan form edit data dengan data terpilih + public function edit($id) { + //----start validate page edit-------// + if($this->varedit==null){redirect('index.php/ps_hakakses');} + //----end validate page edit---------// + $data['title'] = 'Edit Tipe User'; + $data['actionform'] = 'prosesedit'; + $data['main_content'] = 'setting/hakakses/form_tipeuser'; + $this->load->model('m_tipeuser'); + $hakakses = $this->m_tipeuser->edit($id); + $this->load->vars('ha', $hakakses); + $this->load->view('includes/template', $data); + } + +//funsi untuk memproses update data + public function prosesedit() { + //----start validate page edit-------// + if($this->varedit==null){redirect('index.php/ps_hakakses');} + //----end validate page edit---------// + $id = $this->input->post('id'); + $this->load->helper('form'); + $this->load->helper('url'); + $this->load->library('form_validation'); + $this->form_validation->set_rules('namatipeuser','Nama Tipe User','required'); + + if($this->form_validation->run()==FALSE){ + $data['title'] = 'Edit Tipe User'; + $data['actionform'] = 'prosesedit'; + $data['main_content'] = 'setting/hakakses/form_tipeuser'; + $this->load->model('m_tipeuser'); + $hakakses = $this->m_tipeuser->edit($id); + $this->load->vars('ha', $hakakses); + $this->load->view('includes/template', $data); + } + else{ + $this->session->set_flashdata('message', 'Anda berhasil mengedit Tipe User'); + $this->load->model('m_tipeuser'); + $this->m_tipeuser->prosesedit(); + redirect('index.php/ps_hakakses'); + } + } + +//fungsi untuk menampilkan form view data dengan data terpilih + public function view($id) { + //----start validate page view-------// + if($this->varview==null){redirect('index.php/ps_hakakses');} + //----end validate page view---------// + $data['title'] = 'View Tipe User'; + $data['actionform'] = 'prosesview'; + $data['main_content'] = 'setting/hakakses/form_tipeuser'; + $this->load->model('m_tipeuser'); + $hakakses = $this->m_tipeuser->view($id); + $this->load->vars('ha', $hakakses); + + $this->load->view('includes/template', $data); + } + +//fungsi untuk delete + function delete($id) { + //----start validate page delete-------// + if($this->vardelete==null){redirect('index.php/ps_hakakses');} + //----end validate page delete---------// + $this->session->set_flashdata('message', 'Anda berhasil menghapus Tipe User'); + $this->load->model('m_tipeuser'); + $this->m_tipeuser->delete($id); + redirect('index.php/ps_hakakses'); + } + +//--------------------------------------------------HAK AKSES---------------------------------------------------------// + public function edithakakses($id) { + //----start validate page edit-------// + if($this->varedit==null){redirect('index.php/ps_hakakses');} + //----end validate page edit---------// + $data['title'] = 'Edit Hak Akses Menu'; + $data['actionform'] = 'prosesedithakakses'; + $data['main_content'] = 'setting/hakakses/form_hakakses'; + $data['iduserpost']=$id; + + $this->load->model('m_tipeuser'); + $tipeuser = $this->m_tipeuser->edit($id); + $this->load->vars('tu', $tipeuser); + + $this->load->model('m_menu'); + $menu = $this->m_menu->urutan(); + $this->load->vars('mn', $menu); + + $this->load->model('m_menu'); + $hakakses = $this->m_menu->hakakses($id); + $this->load->vars('um', $hakakses); + + $this->load->view('includes/template', $data); + } + + //funsi untuk memproses update data karyawan + public function prosesedithakakses() { + //----start validate page edit-------// + if($this->varedit==null){redirect('index.php/ps_hakakses');} + //----end validate page edit---------// + $id = $this->input->post('id'); + $this->load->helper('form'); + $this->load->helper('url'); + $this->load->library('form_validation'); + + $this->load->model('m_tipeuser'); + $tipeuser = $this->m_tipeuser->edit($id); + $this->load->vars('tu', $tipeuser); + + $this->load->model('m_menu'); + $menu = $this->m_menu->index(); + $this->load->vars('mn', $menu); + + $this->load->model('m_menu'); + $hakakses = $this->m_menu->hakakses($id); + $this->load->vars('um', $hakakses); + + $this->session->set_flashdata('message', 'Anda berhasil mengedit hakakses'); + $this->load->model('m_hakakses'); + $this->m_hakakses->prosesedithakakses(); + redirect('index.php/ps_hakakses'); + } + + + +} + +?> \ No newline at end of file diff --git a/application/controllers/ps_klinik.php b/application/controllers/ps_klinik.php new file mode 100644 index 0000000..f5bcca0 --- /dev/null +++ b/application/controllers/ps_klinik.php @@ -0,0 +1,156 @@ +check_isvalidated(); + $this->load->helper(array('form', 'date')); + } + private function check_isvalidated(){ + if(! $this->session->userdata('validated')){ + redirect('index.php/login'); + } + +//--------------start check access this form page-------------// + $this->db->where('mum_tipeuser_id', $this->session->userdata('s_FK_TipeUser')); + $this->db->where('mum_menu_id', '6'); + $cekMenu = $this->db->get('master_user_menu'); + $rowcount = $cekMenu->num_rows(); + if($rowcount==0){ + redirect('index.php'); + }else{ + foreach ($cekMenu->result() as $cm) + { + $this->vartambah=$cm->mum_tambah; + $this->varedit=$cm->mum_ubah; + $this->vardelete=$cm->mum_hapus; + $this->varview=$cm->mum_lihat; + } + } +//--------------end check access this form page-------------// + } + + public function index($error = NULL) { + $data['title'] = 'Master Klinik'; + $data['main_content'] = 'setting/klinik/v_klinik'; + $data['error']=$error; + $this->load->model('m_klinik'); + $masterklinik = $this->m_klinik->index(); + $this->load->vars('mk', $masterklinik); + $this->load->view('includes/template', $data); + } + +// fungsi untuk menampilkan form tambah data + public function add() { + //----start validate page tambah-------// + if($this->vartambah==null){redirect('index.php/ps_klinik');} + //----end validate page tambah---------// + $data['title'] = 'Tambah Klinik'; + $data['actionform'] = 'prosesadd'; + $data['main_content'] = 'setting/klinik/form_klinik'; + + $this->load->view('includes/template', $data); + } + +//fungsi untuk memproses penambahan dengan memanggil model + public function prosesadd() { + //----start validate page tambah-------// + if($this->vartambah==null){redirect('index.php/ps_klinik');} + //----end validate page tambah---------// + $this->load->helper('form'); + $this->load->helper('url'); + $this->load->library('form_validation'); + $this->form_validation->set_rules('nama','Nama Klinik','required'); + + if($this->form_validation->run()==FALSE){ + $data['title'] = 'Tambah Klinik'; + $data['actionform'] = 'prosesadd'; + $data['main_content'] = 'setting/klinik/form_klinik'; + $this->load->view('includes/template', $data); + }else{ + $this->load->model('m_klinik'); + $this->m_klinik->insert(); + $this->session->set_flashdata('message', 'Anda berhasil menambahkan Klinik baru'); + redirect('index.php/ps_klinik'); + } + } + +//fungsi untuk menampilkan form edit data dengan data terpilih + public function edit($id) { + //----start validate page edit-------// + if($this->varedit==null){redirect('index.php/ps_klinik');} + //----end validate page edit---------// + $data['title'] = 'Edit Klinik'; + $data['actionform'] = 'prosesedit'; + $data['main_content'] = 'setting/klinik/form_klinik'; + $this->load->model('m_klinik'); + $masterklinik = $this->m_klinik->edit($id); + $this->load->vars('mk', $masterklinik); + $this->load->view('includes/template', $data); + } + +//funsi untuk memproses update data + public function prosesedit() { + //----start validate page edit-------// + if($this->varedit==null){redirect('index.php/ps_klinik');} + //----end validate page edit---------// + $id = $this->input->post('id'); + $this->load->helper('form'); + $this->load->helper('url'); + $this->load->library('form_validation'); + $this->form_validation->set_rules('nama','Nama Klinik','required'); + + if($this->form_validation->run()==FALSE){ + $data['title'] = 'Edit Klinik'; + $data['actionform'] = 'prosesedit'; + $data['main_content'] = 'setting/klinik/form_klinik'; + $this->load->model('m_klinik'); + $masterklinik = $this->m_klinik->edit($id); + $this->load->vars('mk', $masterklinik); + $this->load->view('includes/template', $data); + } + else{ + $this->session->set_flashdata('message', 'Anda berhasil mengedit Klinik'); + $this->load->model('m_klinik'); + $this->m_klinik->prosesedit(); + redirect('index.php/ps_klinik'); + } + } + +//fungsi untuk menampilkan form view data dengan data terpilih + public function view($id) { + //----start validate page view-------// + if($this->varview==null){redirect('index.php/ps_klinik');} + //----end validate page view---------// + $data['title'] = 'View Klinik'; + $data['actionform'] = 'prosesview'; + $data['main_content'] = 'setting/klinik/form_klinik'; + $this->load->model('m_klinik'); + $masterklinik = $this->m_klinik->view($id); + $this->load->vars('mk', $masterklinik); + + $this->load->view('includes/template', $data); + } + +//fungsi untuk delete + function delete($id) { + //----start validate page delete-------// + if($this->vardelete==null){redirect('index.php/ps_klinik');} + //----end validate page delete---------// + $this->session->set_flashdata('message', 'Anda berhasil menghapus Klinik'); + $this->load->model('m_klinik'); + $this->m_klinik->delete($id); + redirect('index.php/ps_klinik'); + } +} + +?> \ No newline at end of file diff --git a/application/controllers/ps_klinik_admin.php b/application/controllers/ps_klinik_admin.php new file mode 100644 index 0000000..121c9ca --- /dev/null +++ b/application/controllers/ps_klinik_admin.php @@ -0,0 +1,169 @@ +check_isvalidated(); + $this->load->helper(array('form', 'date')); + } + private function check_isvalidated(){ + if(! $this->session->userdata('validated')){ + redirect('index.php/login'); + } + +//--------------start check access this form page-------------// + $this->db->where('mum_tipeuser_id', $this->session->userdata('s_FK_TipeUser')); + $this->db->where('mum_menu_id', '8'); + $cekMenu = $this->db->get('master_user_menu'); + $rowcount = $cekMenu->num_rows(); + if($rowcount==0){ + redirect('index.php'); + }else{ + foreach ($cekMenu->result() as $cm) + { + $this->vartambah=$cm->mum_tambah; + $this->varedit=$cm->mum_ubah; + $this->vardelete=$cm->mum_hapus; + $this->varview=$cm->mum_lihat; + } + } +//--------------end check access this form page-------------// + } + + public function index($error = NULL) { + $data['title'] = 'Loket'; + $data['main_content'] = 'klinik/v_klinik_admin'; + $data['error']=$error; + $data['quotabangkuklinik']=0; + $data['shiftbuka']=0; + $data['jumshift']=0; + $data['idklinik']=0; + $data['autoshift']=0; + $data['namaklinik']=""; + + $idklinik=0; + + $iduser = $this->session->userdata('s_ID_User'); + + //----------------set hari------------------// + $hari = date("D"); + switch($hari){ + case 'Sun':$hari_ini = "Minggu";break;case 'Mon':$hari_ini = "Senin";break;case 'Tue':$hari_ini = "Selasa";break; + case 'Wed':$hari_ini = "Rabu";break;case 'Thu':$hari_ini = "Kamis";break;case 'Fri':$hari_ini = "Jumat";break; + case 'Sat':$hari_ini = "Sabtu";break;default:$hari_ini = "Tidak di ketahui";break; + } + //----------------set bulan------------------// + $bulan = date("m"); + switch($bulan){ + case '01':$bulan_ini = "Januari";break;case '02':$bulan_ini = "Februari";break;case '03':$bulan_ini = "Maret";break; + case '04':$bulan_ini = "April";break;case '05':$bulan_ini = "Mei";break;case '06':$bulan_ini = "Juni";break; + case '07':$bulan_ini = "Juli";break;case '08':$bulan_ini = "Agustus";break;case '09':$bulan_ini = "September";break; + case '10':$bulan_ini = "Oktober";break;case '11':$bulan_ini = "November";break;case '12':$bulan_ini = "Desember";break; + + default:$bulan_ini = "Tidak di ketahui";break; + } + + $this->db->join('master_klinik', 'mk_id = mu_klinik_id'); + $this->db->where('mu_id', $iduser); + $user = $this->db->get('master_user'); + foreach ($user->result() as $datuser){ + $data['title'] = "KLINIK ".$datuser->mk_nama." | ".$hari_ini.", ".date("d")." ".$bulan_ini." ".date("Y"); + $data['quotabangkuklinik']=$datuser->mk_quota_bangku; + $data['shiftbuka']=$datuser->mk_shift_buka; + $data['jumshift']=$datuser->mk_shift; + $data['idklinik']=$datuser->mk_id; + $data['autoshift']=$datuser->mk_auto_shift; + $idklinik=$datuser->mk_id; + $data['namaklinik']=$datuser->mk_nama; + } + + $this->load->model('m_klinik'); + $infopengunjung = $this->m_klinik->infopengunjung($idklinik); + $this->load->vars('ip', $infopengunjung); + + $this->load->model('m_klinik'); + $klinik = $this->m_klinik->index(); + $this->load->vars('kl', $klinik); + + $this->load->model('m_klinik'); + $pengunjung = $this->m_klinik->pengunjungklinik($idklinik); + $this->load->vars('pk', $pengunjung); + + $this->load->model('m_klinik'); + $datpeng = $this->m_klinik->datapengunjung($idklinik); + $this->load->vars('dp', $datpeng); + + $this->load->view('includes/template', $data); + } + + public function panggilpengunjung($jumlah,$klinik){ + $this->load->model('m_klinik'); + $this->m_klinik->panggil($jumlah,$klinik); + $this->session->set_flashdata('message', 'Anda Berhasil Memanggil Pengunjung Sebanyak '.$jumlah.' Orang, Tunggu Beberapa Saat'); + + redirect('index.php/ps_klinik_admin'); + } + + public function proses_admin($pengunjung, $kode){ + $this->load->model('m_klinik'); + $this->m_klinik->proses($pengunjung, $kode); + if($kode==6){ + $this->session->set_flashdata('message', 'Anda Berhasil Melakukan Proses Datang'); + }elseif($kode==7){ + $this->session->set_flashdata('message', 'Anda Berhasil Melakukan Proses'); + }elseif($kode==8){ + $this->session->set_flashdata('message', 'Anda Berhasil Melakukan Proses Pending'); + }elseif($kode==9){ + $this->session->set_flashdata('message', 'Anda Berhasil Melakukan Proses Selesai'); + } + redirect('index.php/ps_klinik_admin'); + } + + public function ubahklinik(){ + + $ket = $this->input->post('ket');//ket 1 = Ubah Klinik, ket 2 = Konsul + + if($ket==1){ + $this->load->model('m_klinik'); + $this->m_klinik->ubahklinik(); + $this->session->set_flashdata('message', 'Anda Berhasil Mengubah Klinik Pengunjung'); + + redirect('index.php/ps_klinik_admin'); + }else{ + $this->load->model('m_klinik'); + $this->m_klinik->konsul(); + $this->session->set_flashdata('message', 'Anda Berhasil Melakukan Konsultasi'); + + redirect('index.php/ps_klinik_admin'); + } + + } + + public function autoshift($id,$kode){ + $this->load->model('m_klinik'); + $this->m_klinik->autoshift($id,$kode); + $this->session->set_flashdata('message', 'Anda Berhasil Mengubah Otomatis Shift'); + + redirect('index.php/ps_klinik_admin'); + } + + public function aktif($id){ + $this->load->model('m_klinik'); + $this->m_klinik->aktif($id); + $this->session->set_flashdata('message', 'Anda Berhasil Mengaktifkan kembali pasien'); + + redirect('index.php/ps_klinik_admin'); + } + +} + +?> \ No newline at end of file diff --git a/application/controllers/ps_listpasien.php b/application/controllers/ps_listpasien.php new file mode 100644 index 0000000..9741c31 --- /dev/null +++ b/application/controllers/ps_listpasien.php @@ -0,0 +1,103 @@ +check_isvalidated(); + $this->load->helper(array('form', 'date')); + } + private function check_isvalidated(){ + if(! $this->session->userdata('validated')){ + redirect('index.php/login'); + } + +//--------------start check access this form page-------------// + $this->db->where('mum_tipeuser_id', $this->session->userdata('s_FK_TipeUser')); + $this->db->where('mum_menu_id', '20'); + $cekMenu = $this->db->get('master_user_menu'); + $rowcount = $cekMenu->num_rows(); + if($rowcount==0){ + redirect('index.php'); + }else{ + foreach ($cekMenu->result() as $cm) + { + $this->vartambah=$cm->mum_tambah; + $this->varedit=$cm->mum_ubah; + $this->vardelete=$cm->mum_hapus; + $this->varview=$cm->mum_lihat; + } + } +//--------------end check access this form page-------------// + } + + public function index($error = NULL) { + $data['title'] = 'List Pasien'; + $data['main_content'] = 'listpasien/v_listpasien'; + $data['error']=$error; + + $this->load->model('m_listpasien'); + $listpasien = $this->m_listpasien->index(); + $this->load->vars('lp', $listpasien); + + $this->load->view('includes/template', $data); + } + + public function search() { + $data['title'] = 'List Pasien'; + $data['main_content'] = 'listpasien/v_listpasien'; + + $data['tglset'] = $this->input->post('tglperiksa'); + $data['ketset'] = $this->input->post('ketkunjungan'); + + $this->load->model('m_listpasien'); + $listpasien = $this->m_listpasien->search(); + $this->load->vars('lp', $listpasien); + + $this->load->view('includes/template', $data); + } + + public function laporanpasien() { + $data['title'] = 'List Pasien'; + $data['main_content'] = 'listpasien/v_laporanpasien'; + + $data['bulanset'] = $this->input->post('bulankunjungan'); + $data['tahunset'] = $this->input->post('tahunkunjungan'); + + $this->load->model('m_listpasien'); + $listpasien = $this->m_listpasien->laporanpasien(); + $this->load->vars('lp', $listpasien); + + $this->load->view('includes/template', $data); + } + + public function laporanpasienperklinik() { + $data['title'] = 'List Pasien'; + $data['main_content'] = 'listpasien/v_laporanpasienperklinik'; + + $data['bulanset'] = $this->input->post('bulankunjungan'); + $data['tahunset'] = $this->input->post('tahunkunjungan'); + + //$this->load->model('m_listpasien'); + //$listpasien = $this->m_listpasien->laporanpasien(); + //$this->load->vars('lp', $listpasien); + + $this->load->model('m_klinik'); + $masterklinik = $this->m_klinik->index(); + $this->load->vars('mk', $masterklinik); + + $this->load->view('includes/template', $data); + } + + +} + +?> \ No newline at end of file diff --git a/application/controllers/ps_loket.php b/application/controllers/ps_loket.php new file mode 100644 index 0000000..684c8fd --- /dev/null +++ b/application/controllers/ps_loket.php @@ -0,0 +1,184 @@ +check_isvalidated(); + $this->load->helper(array('form', 'date')); + } + private function check_isvalidated(){ + if(! $this->session->userdata('validated')){ + redirect('index.php/login'); + } + +//--------------start check access this form page-------------// + $this->db->where('mum_tipeuser_id', $this->session->userdata('s_FK_TipeUser')); + $this->db->where('mum_menu_id', '5'); + $cekMenu = $this->db->get('master_user_menu'); + $rowcount = $cekMenu->num_rows(); + if($rowcount==0){ + redirect('index.php'); + }else{ + foreach ($cekMenu->result() as $cm) + { + $this->vartambah=$cm->mum_tambah; + $this->varedit=$cm->mum_ubah; + $this->vardelete=$cm->mum_hapus; + $this->varview=$cm->mum_lihat; + } + } +//--------------end check access this form page-------------// + } + + public function index($error = NULL) { + $data['title'] = 'Master Loket'; + $data['main_content'] = 'setting/loket/v_loket'; + $data['error']=$error; + + $this->load->model('m_loket'); + $masterloket = $this->m_loket->index(); + $this->load->vars('ml', $masterloket); + + $this->load->view('includes/template', $data); + } + +// fungsi untuk menampilkan form tambah data + public function add() { + //----start validate page tambah-------// + if($this->vartambah==null){redirect('index.php/ps_loket');} + //----end validate page tambah---------// + $data['title'] = 'Tambah Loket'; + $data['actionform'] = 'prosesadd'; + $data['main_content'] = 'setting/loket/form_loket'; + + $this->load->model('m_klinik'); + $masterklinik = $this->m_klinik->index(); + $this->load->vars('mk', $masterklinik); + + $this->load->view('includes/template', $data); + } + +//fungsi untuk memproses penambahan dengan memanggil model + public function prosesadd() { + //----start validate page tambah-------// + if($this->vartambah==null){redirect('index.php/ps_loket');} + //----end validate page tambah---------// + $this->load->helper('form'); + $this->load->helper('url'); + $this->load->library('form_validation'); + $this->form_validation->set_rules('nama','Nama Loket','required'); + + if($this->form_validation->run()==FALSE){ + $data['title'] = 'Tambah Loket'; + $data['actionform'] = 'prosesadd'; + $data['main_content'] = 'setting/loket/form_loket'; + + $this->load->model('m_klinik'); + $masterklinik = $this->m_klinik->index(); + $this->load->vars('mk', $masterklinik); + + $this->load->view('includes/template', $data); + }else{ + $this->load->model('m_loket'); + $this->m_loket->insert(); + $this->session->set_flashdata('message', 'Anda berhasil menambahkan Loket baru'); + redirect('index.php/ps_loket'); + } + } + +//fungsi untuk menampilkan form edit data dengan data terpilih + public function edit($id) { + //----start validate page edit-------// + if($this->varedit==null){redirect('index.php/ps_loket');} + //----end validate page edit---------// + $data['title'] = 'Edit Loket'; + $data['actionform'] = 'prosesedit'; + $data['main_content'] = 'setting/loket/form_loket'; + + $this->load->model('m_loket'); + $masterloket = $this->m_loket->edit($id); + $this->load->vars('ml', $masterloket); + + $this->load->model('m_klinik'); + $masterklinik = $this->m_klinik->index(); + $this->load->vars('mk', $masterklinik); + + $this->load->view('includes/template', $data); + } + +//funsi untuk memproses update data + public function prosesedit() { + //----start validate page edit-------// + if($this->varedit==null){redirect('index.php/ps_loket');} + //----end validate page edit---------// + $id = $this->input->post('id'); + $this->load->helper('form'); + $this->load->helper('url'); + $this->load->library('form_validation'); + $this->form_validation->set_rules('nama','Nama Loket','required'); + + if($this->form_validation->run()==FALSE){ + $data['title'] = 'Edit Loket'; + $data['actionform'] = 'prosesedit'; + $data['main_content'] = 'setting/loket/form_loket'; + + $this->load->model('m_loket'); + $masterloket = $this->m_loket->edit($id); + $this->load->vars('ml', $masterloket); + + $this->load->model('m_klinik'); + $masterklinik = $this->m_klinik->index(); + $this->load->vars('mk', $masterklinik); + + $this->load->view('includes/template', $data); + } + else{ + $this->session->set_flashdata('message', 'Anda berhasil mengedit Loket'); + $this->load->model('m_loket'); + $this->m_loket->prosesedit(); + redirect('index.php/ps_loket'); + } + } + +//fungsi untuk menampilkan form view data dengan data terpilih + public function view($id) { + //----start validate page view-------// + if($this->varview==null){redirect('index.php/ps_loket');} + //----end validate page view---------// + $data['title'] = 'View Loket'; + $data['actionform'] = 'prosesview'; + $data['main_content'] = 'setting/loket/form_loket'; + + $this->load->model('m_loket'); + $masterloket = $this->m_loket->view($id); + $this->load->vars('ml', $masterloket); + + $this->load->model('m_klinik'); + $masterklinik = $this->m_klinik->index(); + $this->load->vars('mk', $masterklinik); + + $this->load->view('includes/template', $data); + } + +//fungsi untuk delete + function delete($id) { + //----start validate page delete-------// + if($this->vardelete==null){redirect('index.php/ps_loket');} + //----end validate page delete---------// + $this->session->set_flashdata('message', 'Anda berhasil menghapus Loket'); + $this->load->model('m_loket'); + $this->m_loket->delete($id); + redirect('index.php/ps_loket'); + } +} + +?> \ No newline at end of file diff --git a/application/controllers/ps_loket_admin.php b/application/controllers/ps_loket_admin.php new file mode 100644 index 0000000..42c7702 --- /dev/null +++ b/application/controllers/ps_loket_admin.php @@ -0,0 +1,283 @@ +check_isvalidated(); + $this->load->helper(array('form', 'date')); + } + private function check_isvalidated(){ + if(! $this->session->userdata('validated')){ + redirect('index.php/login'); + } + +//--------------start check access this form page-------------// + $this->db->where('mum_tipeuser_id', $this->session->userdata('s_FK_TipeUser')); + $this->db->where('mum_menu_id', '7'); + $cekMenu = $this->db->get('master_user_menu'); + $rowcount = $cekMenu->num_rows(); + if($rowcount==0){ + redirect('index.php'); + }else{ + foreach ($cekMenu->result() as $cm) + { + $this->vartambah=$cm->mum_tambah; + $this->varedit=$cm->mum_ubah; + $this->vardelete=$cm->mum_hapus; + $this->varview=$cm->mum_lihat; + } + } +//--------------end check access this form page-------------// + } + + public function index($error = NULL) { + $data['title'] ='Loket'; + $data['main_content'] ='loket/v_loket_admin'; + $data['error'] =$error; + $data['klinik'] =""; + $data['quotaloket'] =0; + + $data['idklinik'] =""; + $data['shiftbuka'] =""; + $data['namaklinik'] =""; + $data['aktifklinik'] =""; + $data['namaloket'] =""; + $data['idloket'] =""; + $data['shiftpenuh'] =""; + $data['online'] =""; + + + $iduser = $this->session->userdata('s_ID_User'); + $this->db->join('master_loket', 'ml_id = mu_loket_id'); + $this->db->where('mu_id', $iduser); + $user = $this->db->get('master_user'); + foreach ($user->result() as $datuser){ + $klinikpecah = explode(",",$datuser->ml_pelayanan); + $pembayaran = $datuser->ml_pembayaran; + $online = $datuser->ml_online; + $hasilklinik = ""; + $idklinik = ""; + $shiftbuka = ""; + $namaklinik = ""; + $aktifklinik = ""; + $jumshift = ""; + $shiftpenuh = ""; + $quotaklinik = ""; + $jumlah = count($klinikpecah); + + for($i=0;$i<$jumlah;$i++){ + $this->db->where('mk_id', $klinikpecah[$i]); + $klinik = $this->db->get('master_klinik'); + foreach ($klinik->result() as $datklinik){ + if($jumlah<=5){$hasilklinik = $hasilklinik."".$datklinik->mk_nama." ";} + $idklinik = $idklinik.$datklinik->mk_id."|"; + $shiftbuka = $shiftbuka.$datklinik->mk_shift_buka."|"; + $namaklinik = $namaklinik.$datklinik->mk_nama."|"; + $aktifklinik = $aktifklinik.$datklinik->mk_aktif."|"; + $jumshift = $jumshift.$datklinik->mk_shift."|"; + $shiftpenuh = $shiftpenuh.$datklinik->mk_shift_penuh."|"; + $quotaklinik = $quotaklinik.$datklinik->mk_quota."|"; + } + } + + $data['idklinik'] = $idklinik; + $data['shiftbuka'] = $shiftbuka; + $data['namaklinik'] = $namaklinik; + $data['aktifklinik']= $aktifklinik; + $data['jumshift'] = $jumshift; + $data['namaloket'] = $datuser->ml_nama; + $data['idloket'] = $datuser->ml_id; + $data['shiftpenuh'] = $shiftpenuh; + $data['quotaklinik']= $quotaklinik; + $data['pembayaran'] = $pembayaran; + + $data['online'] = $online; + + $data['quotaloket']=$datuser->ml_quota_bangku; + $data['klinik']=$datuser->ml_pelayanan; + + //----------------set hari------------------// + $hari = date("D"); + switch($hari){ + case 'Sun':$hari_ini = "Minggu";break;case 'Mon':$hari_ini = "Senin";break;case 'Tue':$hari_ini = "Selasa";break; + case 'Wed':$hari_ini = "Rabu";break;case 'Thu':$hari_ini = "Kamis";break;case 'Fri':$hari_ini = "Jumat";break; + case 'Sat':$hari_ini = "Sabtu";break;default:$hari_ini = "Tidak di ketahui";break; + } + //----------------set bulan------------------// + $bulan = date("m"); + switch($bulan){ + case '01':$bulan_ini = "Januari";break;case '02':$bulan_ini = "Februari";break;case '03':$bulan_ini = "Maret";break; + case '04':$bulan_ini = "April";break;case '05':$bulan_ini = "Mei";break;case '06':$bulan_ini = "Juni";break; + case '07':$bulan_ini = "Juli";break;case '08':$bulan_ini = "Agustus";break;case '09':$bulan_ini = "September";break; + case '10':$bulan_ini = "Oktober";break;case '11':$bulan_ini = "November";break;case '':$bulan_ini = "Desember";break; + + default:$bulan_ini = "Tidak di ketahui";break; + } + + $data['title'] = $datuser->ml_nama." | ".$hari_ini.", ".date("d")." ".$bulan_ini." ".date("Y")." - Pelayanan : ".$hasilklinik; + } + + $this->load->model('m_loket'); + $infopengunjung = $this->m_loket->infopengunjung(); + $this->load->vars('ip', $infopengunjung); + + $this->load->model('m_loket'); + $pengunjungklinik = $this->m_loket->pengunjungklinik(); + $this->load->vars('pk', $pengunjungklinik); + + $this->load->model('m_loket'); + $pengunjung = $this->m_loket->pengunjung(); + $this->load->vars('pg', $pengunjung); + + $this->load->model('m_loket'); + $terlambat = $this->m_loket->kunjunganterlambat(); + $this->load->vars('tr', $terlambat); + + $this->load->model('m_klinik'); + $klinik = $this->m_klinik->index(); + $this->load->vars('kl', $klinik); + + $this->load->view('includes/template', $data); + } + + public function panggilpengunjung($jumlah){ + $this->load->model('m_loket'); + $this->m_loket->panggil($jumlah); + + $this->session->set_flashdata('message', 'Anda berhasil memanggil pengunjung sebanyak '.$jumlah.' orang, tunggu beberapa saat'); + + redirect('index.php/ps_loket_admin'); + } + public function proses_admin($pengunjung, $kode){ + $this->load->model('m_loket'); + $this->m_loket->proses($pengunjung, $kode); + if($kode==2){ + $this->session->set_flashdata('message', 'Anda berhasil melakukan proses'); + }elseif($kode==3){ + $this->session->set_flashdata('message', 'Anda berhasil melakukan proses pending'); + }elseif($kode==4){ + $this->session->set_flashdata('message', 'Anda berhasil selesai'); + } + redirect('index.php/ps_loket_admin'); + } + public function barcode($pengunjung){ + $this->load->model('m_loket'); + $this->m_loket->barcode($pengunjung); + $this->session->set_flashdata('message', 'Anda berhasil melakukan tindakan barcode'); + + redirect('index.php/ps_loket_admin'); + } + public function terlambat($pengunjung){ + $this->load->model('m_loket'); + $this->m_loket->terlambat($pengunjung); + $this->session->set_flashdata('message', 'Anda berhasil melakukan tindakan terlambat'); + + redirect('index.php/ps_loket_admin'); + } + public function aktif($pengunjung){ + $this->load->model('m_loket'); + $this->m_loket->aktif($pengunjung); + $this->session->set_flashdata('message', 'Anda berhasil melakukan tindakan aktif'); + + redirect('index.php/ps_loket_admin'); + } + public function ubahklinik(){ + $this->load->model('m_loket'); + $this->m_loket->ubahklinik(); + $this->session->set_flashdata('message', 'Anda berhasil mengubah klinik pengunjung'); + + redirect('index.php/ps_loket_admin'); + } + + public function proses_pengunjung(){ + $this->load->model('m_loket'); + $inputpengunjung = $this->m_loket->proses_pengunjung(); + + $this->load->model('m_loket'); + $pengunjung = $this->m_loket->data_pengunjung($this->input->post('idpp_proses')); + + if($inputpengunjung===FALSE){ + $this->session->set_flashdata('messagefalse', 'Anda gagal menyelesaikan pasien, coba lagi!'); + redirect('index.php/ps_loket_admin'); + }else{ + $data['title'] = 'Loket Admin'; + $data['main_content'] = 'print/print_loket/p_tiket_baru'; + $data['idpp']=$this->input->post('idpp_proses'); + $data['namaloket']=$this->input->post('loket_proses'); + + $this->load->vars('pp', $pengunjung); + $this->session->set_flashdata('message', 'Anda berhasil selesai'); + + //redirect('index.php/ps_loket_admin'); + + $this->load->view('print/print_loket/p_tiket_baru',$data); + } + + } + + public function proses_pengunjung_berkas($id,$loket){ + $data['title'] = 'Loket Admin'; + $data['main_content'] = 'print/print_loket/p_tiket_baru_berkas'; + $data['namaloket']=$loket; + + $this->load->model('m_loket'); + $pengunjung = $this->m_loket->data_pengunjung($id); + $this->load->vars('pp', $pengunjung); + + $this->load->view('print/print_loket/p_tiket_baru_berkas',$data); + } + + public function cetakulang($id){ + $data['title'] = 'Loket Admin'; + $data['main_content'] = 'print/print_loket/p_tiket_baru'; + $data['idpp']=$id; + + $this->load->model('m_loket'); + $pengunjung = $this->m_loket->data_pengunjung($id); + $this->load->vars('pp', $pengunjung); + + $this->load->view('print/print_loket/p_ulang_tiket_baru',$data); + } + + public function panggil_admin($idprt, $idpp, $loket){ + $this->load->model('m_loket'); + $this->m_loket->proses_panggil($idpp, $loket); + //$this->session->set_flashdata('message', 'Anda berhasil memanggil tunggu beberapa saat'); + + redirect('index.php/ps_loket_admin'); + } + + public function panggil_admin_awal($idprt, $idpp, $loket){ + $this->load->model('m_loket'); + $this->m_loket->proses_panggil($idpp, $loket); + + $this->proses_admin($idprt, "2"); + + redirect('index.php/ps_loket_admin'); + } + + public function panggil_anjungan_admin($idprt, $idpp){ + $this->load->model('m_loket'); + $this->m_loket->proses_panggil_anjungan($idpp); + + redirect('index.php/ps_loket_admin'); + } + +// public function panggil_admin_null($idpp){ +// $this->load->model('m_loket'); +// $this->m_loket->proses_panggil_null($idpp); +// +// redirect('index.php/ps_anjungan/info_klinik'); +// } +} + +?> \ No newline at end of file diff --git a/application/controllers/ps_pasien.php b/application/controllers/ps_pasien.php new file mode 100644 index 0000000..e45b8fd --- /dev/null +++ b/application/controllers/ps_pasien.php @@ -0,0 +1,168 @@ +check_isvalidated(); + $this->load->helper(array('form', 'date')); + } + private function check_isvalidated(){ + if(! $this->session->userdata('validated')){ + redirect('index.php/login'); + } + +//--------------start check access this form page-------------// + $this->db->where('mum_tipeuser_id', $this->session->userdata('s_FK_TipeUser')); + $this->db->where('mum_menu_id', '18'); + $cekMenu = $this->db->get('master_user_menu'); + $rowcount = $cekMenu->num_rows(); + if($rowcount==0){ + redirect('index.php'); + }else{ + foreach ($cekMenu->result() as $cm) + { + $this->vartambah=$cm->mum_tambah; + $this->varedit=$cm->mum_ubah; + $this->vardelete=$cm->mum_hapus; + $this->varview=$cm->mum_lihat; + } + } +//--------------end check access this form page-------------// + } + + public function index($error = NULL) { + $data['title'] = 'Data Pasien'; + $data['main_content'] = 'pasien/v_pasien'; + $data['error']=$error; + + $this->load->model('m_pasien'); + $ppdata = $this->m_pasien->index(); + $this->load->vars('mp', $ppdata); + + $this->load->view('includes/template', $data); + } + +//fungsi untuk menampilkan form edit data dengan data terpilih + public function edit($id) { + //----start validate page edit-------// + if($this->varedit==null){redirect('index.php/ps_pasien');} + //----end validate page edit---------// + $data['title'] = 'Edit Pasien'; + $data['actionform'] = 'prosesedit'; + $data['main_content'] = 'pasien/form_pasien'; + + $this->load->model('m_pasien'); + $ppdata = $this->m_pasien->edit($id); + $this->load->vars('mp', $ppdata); + + $this->load->model('m_klinik'); + $klinik = $this->m_klinik->index(); + $this->load->vars('mk', $klinik); + + $this->load->view('includes/template', $data); + } + +//funsi untuk memproses update data + public function prosesedit() { + //----start validate page edit-------// + if($this->varedit==null){redirect('index.php/ps_pasien');} + //----end validate page edit---------// + $id = $this->input->post('id'); + + $this->load->helper('form'); + $this->load->helper('url'); +// $this->load->library('form_validation'); +// $this->form_validation->set_rules('klinik','Klinik','required'); +// $this->form_validation->set_rules('shift','Shift Periksa','required'); +// $this->form_validation->set_rules('pembayaran','Jenis Pembayaran','required'); +// +// if($this->form_validation->run()==FALSE){ +// $data['title'] = 'Edit Pasien'; +// $data['actionform'] = 'prosesedit'; +// $data['main_content'] = 'pasien/form_pasien'; +// +// $this->load->model('m_pasien'); +// $ppdata = $this->m_pasien->edit($id); +// $this->load->vars('mp', $ppdata); +// +// $this->load->model('m_klinik'); +// $klinik = $this->m_klinik->index(); +// $this->load->vars('mk', $klinik); +// +// $this->load->view('includes/template', $data); +// } +// else{ + $this->session->set_flashdata('message', 'Anda berhasil mengedit Pasien'); + $this->load->model('m_pasien'); + $this->m_pasien->prosesedit(); + redirect('index.php/ps_pasien'); +// } + } + +//fungsi untuk menampilkan form view data dengan data terpilih + public function view($id) { + //----start validate page view-------// + if($this->varview==null){redirect('index.php/ps_pasien');} + //----end validate page view---------// + $data['title'] = 'View Pasien'; + $data['actionform'] = 'prosesview'; + $data['main_content'] = 'pasien/form_pasien'; + + $this->load->model('m_pasien'); + $ppdata = $this->m_pasien->edit($id); + $this->load->vars('mp', $ppdata); + + $this->load->model('m_klinik'); + $klinik = $this->m_klinik->index(); + $this->load->vars('mk', $klinik); + + $this->load->view('includes/template', $data); + } + +//fungsi untuk delete +// function delete($id) { +// //----start validate page delete-------// +// if($this->vardelete==null){redirect('index.php/ps_pasien');} +// //----end validate page delete---------// +// $this->session->set_flashdata('message', 'Anda berhasil menghapus pasien'); +// $this->load->model('m_paien'); +// $this->m_paien->delete($id); +// redirect('index.php/ps_pasien'); +// } + + function datashift(){ + $idk = $this->input->post('idklinik'); + $jumshift; + $jamshift; + //---------------------start get data klinik--------------// + $this->db->where('mk_id', $idk); + $query_kl = $this->db->get('master_klinik'); + foreach ($query_kl->result() as $datklinik ){ + $jumshift=$datklinik->mk_shift; + $jamshift=$datklinik->mk_jam_shift; + } + //---------------------end get data klinik--------------// + + $pecahjamshift = explode("|",$jamshift); + $numpecah = 0; + + for($i=1;$i<=$jumshift;$i++){ + $data[] = ['datashift'=>""]; + $numpecah++; + + } + echo json_encode($data); + } + +} + +?> \ No newline at end of file diff --git a/application/controllers/ps_ranap_admin.php b/application/controllers/ps_ranap_admin.php new file mode 100644 index 0000000..a87bf10 --- /dev/null +++ b/application/controllers/ps_ranap_admin.php @@ -0,0 +1,164 @@ +check_isvalidated(); + $this->load->helper(array('form', 'date')); + } + private function check_isvalidated(){ + if(! $this->session->userdata('validated')){ + redirect('index.php/login'); + } + +//--------------start check access this form page-------------// + $this->db->where('mum_tipeuser_id', $this->session->userdata('s_FK_TipeUser')); + $this->db->where('mum_menu_id', '23'); + $cekMenu = $this->db->get('master_user_menu'); + $rowcount = $cekMenu->num_rows(); + if($rowcount==0){ + redirect('index.php'); + }else{ + foreach ($cekMenu->result() as $cm) + { + $this->vartambah=$cm->mum_tambah; + $this->varedit=$cm->mum_ubah; + $this->vardelete=$cm->mum_hapus; + $this->varview=$cm->mum_lihat; + } + } +//--------------end check access this form page-------------// + } + + public function index($error = NULL) { + $data['title'] = 'Ranap Admin'; + $data['main_content'] = 'ranap/v_ranapadmin'; + $data['error']=$error; + + $this->load->model('m_loketranap'); + $loketranap = $this->m_loketranap->index(); + $this->load->vars('rn', $loketranap); + + $this->load->model('m_loketranap'); + $loketsearch = $this->m_loketranap->searchloket(); + $this->load->vars('sl', $loketsearch); + + $this->load->view('includes/template', $data); + } + + public function prosesadd() { + + $no_antrian; + $hasil_nomor = ""; + $this->db->like('ppr_tanggal_periksa', date("Y-m-d")); + $this->db->order_by('ppr_nomor_antrian', 'ASC'); + //$this->db->where('ppr_tanggal_periksa', date("Y-m-d")); + $query = $this->db->get('proses_pengunjung_ranap'); + foreach ($query->result() as $datpengunjung){ + $no_antrian = $datpengunjung->ppr_nomor_antrian; + } + + if(isset($no_antrian)){ + $hasil_nomor = $no_antrian+1; + $nomjum = strlen($hasil_nomor);$nol=""; + if($nomjum=="1"){$nol="00";} + elseif($nomjum=="2"){$nol="0";} + $hasil_nomor=$nol.$hasil_nomor; + }else { + $hasil_nomor="001"; + } + + $insert = array( + 'ppr_nomor_antrian' => $hasil_nomor, + 'ppr_tanggal_periksa' => date("Y-m-d H:i:s"), + 'ppr_status' => "0", + ); + $this->db->insert('proses_pengunjung_ranap', $insert); + $last_insert_id = $this->db->insert_id(); + + redirect('index.php/ps_ranap_admin/print_ranap/'.$last_insert_id); + } + + public function print_ranap($id){ + $data['title'] = 'Ranap'; + $data['main_content'] = 'print/print_ranap/print_ranap'; + + $this->load->model('m_loketranap'); + $getpas = $this->m_loketranap->datapengunjung($id); + $this->load->vars('dp', $getpas); + + $this->load->view('print/print_ranap/print_ranap',$data); + } + + public function next(){ + $pengunjung=""; + + $this->db->where('ppr_status', "0"); + $this->db->where('ppr_loket is NULL', NULL, TRUE); + $this->db->like('ppr_tanggal_periksa', date("Y-m-d")); + $this->db->order_by('ppr_tanggal_periksa', 'DESC'); + $query = $this->db->get('proses_pengunjung_ranap'); + foreach ($query->result() as $datpengunjung){ + $pengunjung = $datpengunjung->ppr_id; + } + + $update = array( + 'ppr_loket' => $this->session->userdata('s_loket'), + 'ppr_panggil' => date("Y-m-d H:i:s"), + 'ppr_callsound' => date("Y-m-d H:i:s"), + 'ppr_callstatus'=> "1", + 'ppr_status' => "1", + ); + $this->db->where('ppr_id', $pengunjung); + $this->db->update('proses_pengunjung_ranap', $update); + + redirect('index.php/ps_ranap_admin'); + } + + public function selesai($id){ + $update = array( + 'ppr_loket' => null, + 'ppr_callsound' => null, + 'ppr_status' => "3", + ); + $this->db->where('ppr_id', $id); + $this->db->update('proses_pengunjung_ranap', $update); + + redirect('index.php/ps_ranap_admin'); + } + + public function callsound($id){ + $update = array( + //'ppr_panggil' => date("Y-m-d H:i:s"), + 'ppr_callsound' => date("Y-m-d H:i:s"), + 'ppr_callstatus'=> "1", + ); + $this->db->where('ppr_id', $id); + $this->db->update('proses_pengunjung_ranap', $update); + + redirect('index.php/ps_ranap_admin'); + } + + public function pending($id){ + $update = array( + 'ppr_loket' => null, + 'ppr_callsound' => null, + 'ppr_status' => "2", + ); + $this->db->where('ppr_id', $id); + $this->db->update('proses_pengunjung_ranap', $update); + + redirect('index.php/ps_ranap_admin'); + } +} + +?> \ No newline at end of file diff --git a/application/controllers/ps_screen.php b/application/controllers/ps_screen.php new file mode 100644 index 0000000..0b30053 --- /dev/null +++ b/application/controllers/ps_screen.php @@ -0,0 +1,140 @@ +check_isvalidated(); + $this->load->helper(array('form', 'date')); + } + + private function check_isvalidated(){ + if(! $this->session->userdata('validated')){ + //redirect('index.php/login'); + } + +//--------------start check access this form page-------------// + $this->db->where('mum_tipeuser_id', $this->session->userdata('s_FK_TipeUser')); + $this->db->where('mum_menu_id', '19'); + $cekMenu = $this->db->get('master_user_menu'); + $rowcount = $cekMenu->num_rows(); + if($rowcount==0){ + //redirect('index.php'); + }else{ + foreach ($cekMenu->result() as $cm) + { + $this->vartambah=$cm->mum_tambah; + $this->varedit=$cm->mum_ubah; + $this->vardelete=$cm->mum_hapus; + $this->varview=$cm->mum_lihat; + } + } +//--------------end check access this form page-------------// + } + + public function index($error = NULL) { + if(! $this->session->userdata('validated')){ + redirect('index.php/login'); + } + + $data['title'] = 'Screen'; + $data['main_content'] = 'setting/screen/v_screen'; + $data['error']=$error; + + $this->load->model('m_screen'); + $screen = $this->m_screen->index(); + $this->load->vars('ms', $screen); + + $this->load->view('includes/template', $data); + } + + + function info_klinik_split($layar){ + $data['title'] = 'Antrian Klinik Layar '.$layar; + $data['main_content'] = 'screen/v_info_klinik_split'; + + $this->load->model('m_screen'); + $info_pp = $this->m_screen->info_pp($layar); + $this->load->vars('ip', $info_pp); + + $this->load->model('m_screen'); + $klinik = $this->m_screen->master_klinik($layar); + $this->load->vars('mk', $klinik); + + $this->load->view('includes3/template', $data); + } + + public function edit() { + //----start validate page edit-------// + if($this->varedit==null){redirect('index.php/ps_screen');} + //----end validate page edit---------// + $data['title'] = 'Edit Screen'; + $data['actionform'] = 'prosesedit'; + $data['main_content'] = 'setting/screen/form_screen'; + //$data['ketscr'] = $ketscr; + + $this->load->model('m_screen'); + $screen = $this->m_screen->index(); + $this->load->vars('ms', $screen); + + $this->load->view('includes/template', $data); + } + + public function prosesedit() { + //----start validate page edit-------// + if($this->varedit==null){redirect('index.php/ps_screen');} + //----end validate page edit---------// + + $this->session->set_flashdata('message', 'Anda berhasil mengedit Screen'); + $this->load->model('m_screen'); + $this->m_screen->prosesedit(); + redirect('index.php/ps_screen'); + } + + public function view() { + //----start validate page edit-------// + if($this->varedit==null){redirect('index.php/ps_screen');} + //----end validate page edit---------// + $data['title'] = 'View Screen'; + $data['actionform'] = 'prosesview'; + $data['main_content'] = 'setting/screen/form_screen'; + + $this->load->model('m_screen'); + $screen = $this->m_screen->index(); + $this->load->vars('ms', $screen); + + $this->load->view('includes/template', $data); + } + +//-------------------------------------------------------START INFO LOKET-----------------------------------------------------------// + public function screenloket($loket){ + $data['title'] = 'Loket '.$loket; + $data['main_content'] = 'screen/v_info_loket'; + + $this->db->where('ml_id', $loket); + $datlok = $this->db->get('master_loket'); + foreach ($datlok->result() as $datuser){ + $data['klinik']=$datuser->ml_pelayanan; + $data['pembayaran'] = $datuser->ml_pembayaran; + } + + $data['idloket']=$loket; + $this->load->model('m_screen'); + $pengunjung = $this->m_screen->pengunjung($loket); + $this->load->vars('pg', $pengunjung); + + $this->load->view('includes3/template', $data); + } +//-------------------------------------------------------END INFO LOKET-----------------------------------------------------------// + +} + +?> \ No newline at end of file diff --git a/application/controllers/ps_screenranap.php b/application/controllers/ps_screenranap.php new file mode 100644 index 0000000..fa0a0f7 --- /dev/null +++ b/application/controllers/ps_screenranap.php @@ -0,0 +1,62 @@ +load->helper(array('form', 'date')); + } + + public function index($error = NULL) { + + $data['title'] = 'Screen Ranap'; + $data['main_content'] = 'screen/v_ranap'; + $data['error']=$error; + + $this->load->model('m_loketranap'); + $datloket = $this->m_loketranap->dataloket(); + $this->load->vars('dl', $datloket); + + $this->load->model('m_loketranap'); + $datpanggil = $this->m_loketranap->datapanggil(); + $this->load->vars('dp', $datpanggil); + +// $this->load->model('m_loketranap'); +// $datsetpang = $this->m_loketranap->datasetpang(); +// $this->load->vars('dsp', $datsetpang); + + $this->load->model('m_loketranap'); + $datpangsuara = $this->m_loketranap->datapanggilsuara(); + $this->load->vars('dps', $datpangsuara); +// +// $this->load->model('m_anjungan'); +// $terlambat = $this->m_anjungan->anjunganterlambat(); +// $this->load->vars('tr', $terlambat); + + $this->load->view('includes3/template', $data); + + } + + public function set_null($id){ + $update = array( + //'ppr_loket' => null, + 'ppr_callstatus' => null, + //'ppr_status' => "2", + ); + $this->db->where('ppr_id', $id); + $this->db->update('proses_pengunjung_ranap', $update); + + redirect('index.php/ps_screenranap'); + } +} + +?> \ No newline at end of file diff --git a/application/controllers/ps_userlogin.php b/application/controllers/ps_userlogin.php new file mode 100644 index 0000000..66e8151 --- /dev/null +++ b/application/controllers/ps_userlogin.php @@ -0,0 +1,230 @@ +check_isvalidated(); + $this->load->helper(array('form', 'date')); + } + private function check_isvalidated(){ + if(! $this->session->userdata('validated')){ + redirect('index.php/login'); + } + +//--------------start check access this form page-------------// + $this->db->where('mum_tipeuser_id', $this->session->userdata('s_FK_TipeUser')); + $this->db->where('mum_menu_id', '4'); + $cekMenu = $this->db->get('master_user_menu'); + $rowcount = $cekMenu->num_rows(); + if($rowcount==0){ + redirect('index.php'); + }else{ + foreach ($cekMenu->result() as $cm) + { + $this->vartambah=$cm->mum_tambah; + $this->varedit=$cm->mum_ubah; + $this->vardelete=$cm->mum_hapus; + $this->varview=$cm->mum_lihat; + } + } +//--------------end check access this form page-------------// + } + + public function index($error = NULL) { + $data['title'] = 'User Login'; + $data['main_content'] = 'setting/userlogin/v_userlogin'; + $data['error']=$error; + + $this->load->model('m_userlogin'); + $userlogin = $this->m_userlogin->index(); + $this->load->vars('ul', $userlogin); + + $this->load->view('includes/template', $data); + } + +// fungsi untuk menampilkan form tambah data + public function add() { + //----start validate page tambah-------// + if($this->vartambah==null){redirect('index.php/ps_userlogin');} + //----end validate page tambah---------// + $data['title'] = 'Tambah User Login'; + $data['actionform'] = 'prosesadd'; + $data['main_content'] = 'setting/userlogin/form_userlogin'; + + $this->load->model('m_tipeuser'); + $tipeuser = $this->m_tipeuser->index(); + $this->load->vars('tu', $tipeuser); + + $this->load->model('m_loket'); + $loket = $this->m_loket->index(); + $this->load->vars('ml', $loket); + + $this->load->model('m_klinik'); + $klinik = $this->m_klinik->index(); + $this->load->vars('mk', $klinik); + + $this->load->view('includes/template', $data); + } + +//fungsi untuk memproses penambahan dengan memanggil model + public function prosesadd() { + //----start validate page tambah-------// + if($this->vartambah==null){redirect('index.php/ps_userlogin');} + //----end validate page tambah---------// + $this->load->helper('form'); + $this->load->helper('url'); + $this->load->library('form_validation'); + $this->form_validation->set_rules('namauser','Nama User','required'); + $this->form_validation->set_rules('passworduser','Password User','required'); + $this->form_validation->set_rules('repassworduser', 'Retype Password', 'required|matches[passworduser]'); + + if($this->form_validation->run()==FALSE){ + $data['title'] = 'Tambah User Login'; + $data['actionform'] = 'prosesadd'; + $data['main_content'] = 'setting/userlogin/form_userlogin'; + + $this->load->model('m_tipeuser'); + $tipeuser = $this->m_tipeuser->index(); + $this->load->vars('tu', $tipeuser); + + $this->load->model('m_loket'); + $loket = $this->m_loket->index(); + $this->load->vars('ml', $loket); + + $this->load->model('m_klinik'); + $klinik = $this->m_klinik->index(); + $this->load->vars('mk', $klinik); + + $this->load->view('includes/template', $data); + }else{ + $this->load->model('m_userlogin'); + $this->m_userlogin->insert(); + $this->session->set_flashdata('message', 'Anda berhasil menambahkan user login baru'); + redirect('index.php/ps_userlogin'); + } + } + +//fungsi untuk menampilkan form edit data dengan data terpilih + public function edit($id) { + //----start validate page edit-------// + if($this->varedit==null){redirect('index.php/ps_userlogin');} + //----end validate page edit---------// + $data['title'] = 'Edit User Login'; + $data['actionform'] = 'prosesedit'; + $data['main_content'] = 'setting/userlogin/form_userlogin'; + + $this->load->model('m_userlogin'); + $userlogin = $this->m_userlogin->edit($id); + $this->load->vars('ul', $userlogin); + + $this->load->model('m_tipeuser'); + $tipeuser = $this->m_tipeuser->index(); + $this->load->vars('tu', $tipeuser); + + $this->load->model('m_loket'); + $loket = $this->m_loket->index(); + $this->load->vars('ml', $loket); + + $this->load->model('m_klinik'); + $klinik = $this->m_klinik->index(); + $this->load->vars('mk', $klinik); + + $this->load->view('includes/template', $data); + } + +//funsi untuk memproses update data + public function prosesedit() { + //----start validate page edit-------// + if($this->varedit==null){redirect('index.php/ps_userlogin');} + //----end validate page edit---------// + $id = $this->input->post('id'); + $setpass = $this->input->post('passworduser'); + $this->load->helper('form'); + $this->load->helper('url'); + $this->load->library('form_validation'); + $this->form_validation->set_rules('namauser','Nama User','required'); + if(!empty($setpass)){ + $this->form_validation->set_rules('passworduser','Password User','required'); + $this->form_validation->set_rules('repassworduser', 'Retype Password', 'required|matches[passworduser]'); + } + if($this->form_validation->run()==FALSE){ + $data['title'] = 'Edit User Login'; + $data['actionform'] = 'prosesedit'; + $data['main_content'] = 'setting/userlogin/form_userlogin'; + + $this->load->model('m_userlogin'); + $userlogin = $this->m_userlogin->edit($id); + $this->load->vars('ul', $userlogin); + + $this->load->model('m_tipeuser'); + $tipeuser = $this->m_tipeuser->index(); + $this->load->vars('tu', $tipeuser); + + $this->load->model('m_loket'); + $loket = $this->m_loket->index(); + $this->load->vars('ml', $loket); + + $this->load->model('m_klinik'); + $klinik = $this->m_klinik->index(); + $this->load->vars('mk', $klinik); + + $this->load->view('includes/template', $data); + } + else{ + $this->session->set_flashdata('message', 'Anda berhasil mengedit User Login'); + $this->load->model('m_userlogin'); + $this->m_userlogin->prosesedit(); + redirect('index.php/ps_userlogin'); + } + } + +//fungsi untuk menampilkan form view data dengan data terpilih + public function view($id) { + //----start validate page view-------// + if($this->varview==null){redirect('index.php/ps_userlogin');} + //----end validate page view---------// + $data['title'] = 'View User Login'; + $data['actionform'] = 'prosesview'; + $data['main_content'] = 'setting/userlogin/form_userlogin'; + + $this->load->model('m_userlogin'); + $userlogin = $this->m_userlogin->edit($id); + $this->load->vars('ul', $userlogin); + + $this->load->model('m_tipeuser'); + $tipeuser = $this->m_tipeuser->index(); + $this->load->vars('tu', $tipeuser); + + $this->load->model('m_loket'); + $loket = $this->m_loket->index(); + $this->load->vars('ml', $loket); + + $this->load->model('m_klinik'); + $klinik = $this->m_klinik->index(); + $this->load->vars('mk', $klinik); + + $this->load->view('includes/template', $data); + } + +//fungsi untuk delete + function delete($id) { + //----start validate page delete-------// + if($this->vardelete==null){redirect('index.php/ps_userlogin');} + //----end validate page delete---------// + $this->session->set_flashdata('message', 'Anda berhasil menghapus User Login'); + $this->load->model('m_userlogin'); + $this->m_userlogin->delete($id); + redirect('index.php/ps_userlogin'); + } +} + +?> \ No newline at end of file diff --git a/application/controllers/welcome.php b/application/controllers/welcome.php new file mode 100644 index 0000000..602e2a7 --- /dev/null +++ b/application/controllers/welcome.php @@ -0,0 +1,35 @@ +check_isvalidated(); + } + public function index() + { + $data['title'] = 'App Antrian RSSA'; + $data['main_content'] = 'home/v_home'; + + $this->load->model('m_listpasien'); + $listpasien = $this->m_listpasien->datenow(); + $this->load->vars('lp', $listpasien); + + $this->load->view('includes/template', $data); + } + private function check_isvalidated(){ + if(! $this->session->userdata('validated')){ + redirect('index.php/login'); + } + } + public function do_logout(){ + $this->session->sess_destroy(); + redirect('login'); + } + + +} diff --git a/application/core/index.html b/application/core/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/application/core/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/application/errors/error_404.php b/application/errors/error_404.php new file mode 100644 index 0000000..792726a --- /dev/null +++ b/application/errors/error_404.php @@ -0,0 +1,62 @@ + + + +404 Page Not Found + + + +
+

+ +
+ + \ No newline at end of file diff --git a/application/errors/error_db.php b/application/errors/error_db.php new file mode 100644 index 0000000..b396cda --- /dev/null +++ b/application/errors/error_db.php @@ -0,0 +1,62 @@ + + + +Database Error + + + +
+

+ +
+ + \ No newline at end of file diff --git a/application/errors/error_general.php b/application/errors/error_general.php new file mode 100644 index 0000000..fd63ce2 --- /dev/null +++ b/application/errors/error_general.php @@ -0,0 +1,62 @@ + + + +Error + + + +
+

+ +
+ + \ No newline at end of file diff --git a/application/errors/error_php.php b/application/errors/error_php.php new file mode 100644 index 0000000..f085c20 --- /dev/null +++ b/application/errors/error_php.php @@ -0,0 +1,10 @@ +
+ +

A PHP Error was encountered

+ +

Severity:

+

Message:

+

Filename:

+

Line Number:

+ +
\ No newline at end of file diff --git a/application/errors/index.html b/application/errors/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/application/errors/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/application/helpers/index.html b/application/helpers/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/application/helpers/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/application/hooks/index.html b/application/hooks/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/application/hooks/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/application/index.html b/application/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/application/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/application/language/english/index.html b/application/language/english/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/application/language/english/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/application/language/index.html b/application/language/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/application/language/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/application/libraries/index.html b/application/libraries/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/application/libraries/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/application/libraries/m_pdf.php b/application/libraries/m_pdf.php new file mode 100644 index 0000000..f587290 --- /dev/null +++ b/application/libraries/m_pdf.php @@ -0,0 +1,22 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/application/models/index.html b/application/models/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/application/models/index.html @@ -0,0 +1,10 @@ + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + \ No newline at end of file diff --git a/application/models/m_anjungan.php b/application/models/m_anjungan.php new file mode 100644 index 0000000..ed2f69b --- /dev/null +++ b/application/models/m_anjungan.php @@ -0,0 +1,871 @@ +db->get('master_klinik'); + foreach ($query->result() as $datklinik){ + $reset_klinik = array( + 'mk_status_shift' => 1, + 'mk_aktif' => 0, + ); + $this->db->where('mk_id', $datklinik->mk_id); + $this->db->update('master_klinik', $reset_klinik); + + $aktif=0;//----------aktif 0 maka klinik tutup + $setaktifdb=0;//----------setaktif 0 maka klinik buka + $setpenuh=0;//----------setpenuh 1 maka klinik penuh + $shiftcek = $datklinik->mk_shift; + //----------------start cek hari sekarang klinik buka atau tidak----------------// + switch($hari){ + case 'Sun':$hari_ini = "minggu";break;case 'Mon':$hari_ini = "senin";break;case 'Tue':$hari_ini = "selasa";break; + case 'Wed':$hari_ini = "rabu";break;case 'Thu':$hari_ini = "kamis";break;case 'Fri':$hari_ini = "jumat";break; + case 'Sat':$hari_ini = "sabtu";break;default:$hari_ini = "Tidak di ketahui";break; + } + $pecahjadwal = explode("|",$datklinik->mk_jadwal); + $jumdat = count($pecahjadwal); + for ($x = 0; $x <= $jumdat; $x++){ + if(isset($pecahjadwal[$x])){ + if($pecahjadwal[$x]==$hari_ini){$aktif=$aktif+1;} + } + } + if($aktif==0){$setaktifdb=1;} + //----------------end cek hari sekarang klinik buka atau tidak----------------// + //----------------start cek quota pasien per shift----------------// + for ($i = 1; $i <= $datklinik->mk_shift; $i++){ + $this->db->where('pp_klinik_id', $datklinik->mk_id); + $this->db->where('pp_shift', $i); + $this->db->where('pp_tanggal_periksa', $tanggalsekarang); + $query_pp = $this->db->get('proses_pengunjung'); + $jum_row = $query_pp->num_rows(); + $next_shift = $i+1; + //-----------start cek quota shift jika penuh ke shift selanjutnya---------// + if($datklinik->mk_quota<=$jum_row){ + //-----------start cek klinik tidak bisa lebih dari jumlah shift klinik---------// + if($next_shift<=$shiftcek){ + $update_klinik = array( + 'mk_status_shift' => $next_shift, + ); + $this->db->where('mk_id', $datklinik->mk_id); + $this->db->update('master_klinik', $update_klinik); + }else{ +// $update_klinik = array(); + $setaktifdb=1; + $setpenuh=1; + } +// $this->db->where('mk_id', $datklinik->mk_id); +// $this->db->update('master_klinik', $update_klinik); + //-----------end cek klinik tidak bisa lebih dari jumlah shift klinik---------// + } + //-----------start cek quota shift jika penuh ke shift selanjutnya---------// + } + //----------------end cek quota pasien per shift----------------// + $update_mk = array( + 'mk_tanggal_sekarang' => $tanggalsekarang, + 'mk_aktif' => $setaktifdb, + 'mk_shift_penuh' => $setpenuh, + ); + $this->db->where('mk_id', $datklinik->mk_id); + $this->db->update('master_klinik', $update_mk); + } + + $this->db->where('pp_tanggal_periksa', date('Y-m-d')); + $this->db->where('pp_pendaftaran_online is NOT NULL', NULL, FALSE); + $this->db->where('pp_loket is NULL', NULL, TRUE); + $query_pp = $this->db->get('proses_pengunjung'); + foreach ($query_pp->result() as $datapp){ + $loket = null; + $this->db->order_by("ml_id", "RANDOM"); + $this->db->where('ml_pembayaran', $datapp->pp_pembayaran); + $query_loket = $this->db->get('master_loket'); + foreach ($query_loket->result() as $datloket){ + $loketexplode = explode(",",$datloket->ml_pelayanan); + $count = count($loketexplode); + for ($x = 0; $x <= $count; $x++) { + if(isset($loketexplode[$x])){ + if($datapp->pp_klinik_id==$loketexplode[$x]){ + $update_pp = array( + 'pp_loket' => $datloket->ml_id, + ); + $this->db->where('pp_id', $datapp->pp_id); + $this->db->update('proses_pengunjung', $update_pp); + //$loket = $datloket->ml_id; + } + } + } + } + } + } + + //-----------------digunakan untuk cek buka shift apabila sudah jam nya....(jika autoshift) + function cek_shift_jam(){ + $jamnow = date("H"); + $menitnow = date("m"); + $this->db->where('mk_aktif', '0'); + $query = $this->db->get('master_klinik'); + foreach ($query->result() as $datklinik){ + if($datklinik->mk_auto_shift==1){ + $jumwaktu=0; + $pecahwaktu = explode("|",$datklinik->mk_jam_shift); + $jumwaktu = count($pecahwaktu); + $ketshift = 1; + for ($x = 0; $x < $jumwaktu; $x++){ + $waktu_awal =strtotime(date("Y-m-d ").$pecahwaktu[$x]); + $waktu_akhir =strtotime(date("Y-m-d H:i")); + $diff =$waktu_akhir-$waktu_awal; + $hasil = number_format($diff,0,",","."); + if($hasil>=0){ + if($pecahwaktu[$x]!=0){ + $update_mk = array( + 'mk_shift_buka' => $ketshift, + ); + $this->db->where('mk_id', $datklinik->mk_id); + $this->db->update('master_klinik', $update_mk); + } + }else{ + if($ketshift==1){ + $update_mk = array( + 'mk_shift_buka' => 1, + ); + $this->db->where('mk_id', $datklinik->mk_id); + $this->db->update('master_klinik', $update_mk); + } + } + + $ketshift++; + + } + } + } + } + + function insert_sekarang($idk, $shift, $ket , $pembayaran){ + //--------start get kode master klinik-----------// + $kodeklinik=""; + $barcode="";$urutanbar=0; + $this->db->where('mk_id', $idk); + $query = $this->db->get('master_klinik'); + foreach ($query->result() as $datklinik){ + if($pembayaran==1){ + $kodeklinik="UM"; + }else{ + $kodeklinik= $datklinik->mk_kode; + } + } + //--------end get kode master klinik-----------// + //--------start nomor antrian------------------// + $no_antrian; + $hasil_nomor = ""; + $query_pengunjung = $this->db->query("select MAX(pp_nomor_antrian) AS maxnomorantrian from proses_pengunjung WHERE pp_tanggal_periksa = '".date("Y-m-d")."' AND pp_nomor_antrian LIKE '".$kodeklinik."%' "); +// $this->db->like('pp_nomor_antrian', $kodeklinik, 'after'); +// $this->db->where('pp_tanggal_periksa', date("Y-m-d")); +// $query_pengunjung = $this->db->get('proses_pengunjung'); + foreach ($query_pengunjung->result() as $datpengunjung){ + $no_antrian = $datpengunjung->maxnomorantrian; + } + + if(isset($no_antrian)){ + $urutan = (int) substr($no_antrian, 3, 3); + $urutan++; + $hasil_nomor = $kodeklinik.$shift.sprintf("%03s", $urutan); + }else { + $hasil_nomor=$kodeklinik.$shift."001"; + + } + //--------end nomor antrian--------------------// + //-------start nomor barcode------------------// + $no_barcode; + $hasil_barcode = ""; + $this->db->where('pp_tanggal_periksa', date("Y-m-d")); + $query_barcode = $this->db->get('proses_pengunjung'); + foreach ($query_barcode->result() as $datbarcode){ + $no_barcode = $datbarcode->pp_barcode; + } + if(isset($no_barcode)){ + $urutan = (int) substr($no_barcode, 7, 5); + $urutan++; + $barcode=date("ymd").$shift.sprintf("%05s", $urutan); + $urutanbar=$urutan; + }else { + $barcode=date("ymd").$shift."00001"; + $urutanbar=1; + } + //-------end nomor barcode-------------------// + if($ket==4){ + $this->db->where('pp_tanggal_periksa', date('Y-m-d')); + $this->db->where('pp_nomor_antrian', $hasil_nomor); + $query_cek_nomor = $this->db->get('proses_pengunjung'); + if($query_cek_nomor->num_rows()!=0){ + return FALSE; + }else{ + //----------------------start untuk pasien fasttrack----------------------------// + $pj = $this->input->post('penanggungjawab'); + $rm = $this->input->post('norek'); + $np = $this->input->post('namapas'); + $ke = $this->input->post('ket'); + + $rafast = $pj."|".$np."|".$ke."|"; + + $insert_pp = array( + 'pp_nomor_antrian' => $hasil_nomor, + 'pp_shift' => $shift, + 'pp_tanggal_periksa' => date("Y-m-d"), + 'pp_tanggal_datang' => date("Y-m-d H:i:s"), + 'pp_posisi_status' => 1, + 'pp_pendaftaran_online' => null, + 'pp_rekamedik' => $rm, + 'pp_status' => 1, + 'pp_aktif' => null, + 'pp_klinik_id' => $idk, + 'pp_barcode' => $barcode, + 'pp_pembayaran' => $pembayaran, + 'pp_fasttrack' => $rafast, + ); + $insert = $this->db->insert('proses_pengunjung', $insert_pp); + $last_insert_id = $this->db->insert_id(); + + $insert_prt = array( + 'prt_status' => 1, + 'prt_tanggal' => date("Y-m-d H:i:s"), + 'prt_aktif' => 0, + 'prt_pengunjung_id' => $last_insert_id, + ); + $prt = $this->db->insert('proses_ruang_tunggu', $insert_prt); + //----------------------end untuk pasien fasttrack----------------------------// + } + }else{ + $this->db->where('pp_tanggal_periksa', date('Y-m-d')); + $this->db->where('pp_nomor_antrian', $hasil_nomor); + $query_cek_nomor = $this->db->get('proses_pengunjung'); + if($query_cek_nomor->num_rows()!=0){ + return FALSE; + }else{ + $insert_pp = array( + 'pp_nomor_antrian' => $hasil_nomor, + 'pp_shift' => $shift, + 'pp_tanggal_periksa' => date("Y-m-d"), + 'pp_tanggal_datang' => date("Y-m-d H:i:s"), + 'pp_posisi_status' => 1, + 'pp_pendaftaran_online' => null, + 'pp_rekamedik' => null, + 'pp_status' => null, + 'pp_aktif' => null, + 'pp_klinik_id' => $idk, + 'pp_barcode' => $barcode, + 'pp_pembayaran' => $pembayaran, + ); + $insert = $this->db->insert('proses_pengunjung', $insert_pp); + $pp_last_id = $this->db->insert_id(); + //-----------start langsung masuk-------------------// + if($urutanbar<=70){ + + $loket = null; + $this->db->order_by("ml_id", "RANDOM"); + $this->db->where('ml_pembayaran', $pembayaran); + $query_loket = $this->db->get('master_loket'); + foreach ($query_loket->result() as $datloket){ + $loketexplode = explode(",",$datloket->ml_pelayanan); + $count = count($loketexplode); + for ($x = 0; $x <= $count; $x++) { + if(isset($loketexplode[$x])){ + if($idk==$loketexplode[$x]){ + $loket = $datloket->ml_id; + } + } + } + } + + $autoinsert_prt = array( + 'prt_status' => 0, + 'prt_tanggal' => date("Y-m-d H:i:s"), + 'prt_aktif' => 0, + 'prt_pengunjung_id' => $pp_last_id, + ); + $prt = $this->db->insert('proses_ruang_tunggu', $autoinsert_prt); + + $update_pp = array( + 'pp_status' => 1, + 'pp_panggil_anjungan' => date("Y-m-d H:i:s"), + 'pp_loket' => $loket, + ); + $this->db->where('pp_id', $pp_last_id); + $this->db->update('proses_pengunjung', $update_pp); + } + //-----------end langsung masuk-------------------// + } + } + //--------for cek data quota shift + $date=date("Y-m-d"); + $this->cek_quota_shift($idk, $shift,$date); + } + + function insert_pesan(){ + $urutanbar=0; + $pembayaran=$this->input->post('pembayaran'); + $idk = $this->input->post('idklinikpesan'); + $shift = $this->input->post('shiftpesan'); + $originalDate = $this->input->post('tanggalpesan'); + $newDate = date("Y-m-d", strtotime($originalDate)); + $newDate2 = date("ymd", strtotime($originalDate)); + //--------start get kode master klinik-----------// + $kodeklinik=""; + $barcode=""; + $this->db->where('mk_id', $idk); + $query = $this->db->get('master_klinik'); + foreach ($query->result() as $datklinik){ + if($pembayaran==1){ + $kodeklinik="UM"; + }else{ + $kodeklinik= $datklinik->mk_kode; + } + } + //--------end get kode master klinik-----------// + //--------start nomor antrian------------------// + $no_antrian; + $hasil_nomor = ""; + $query_pengunjung = $this->db->query("select * from proses_pengunjung WHERE pp_tanggal_periksa = '".$newDate."' AND pp_nomor_antrian LIKE '".$kodeklinik."%' "); + //$this->db->like('pp_nomor_antrian', $kodeklinik, 'after'); + //$this->db->where('pp_tanggal_periksa', $newDate); + //$query_pengunjung = $this->db->get('proses_pengunjung'); + foreach ($query_pengunjung->result() as $datpengunjung){ + $no_antrian = $datpengunjung->pp_nomor_antrian; + } + + if(isset($no_antrian)){ + $urutan = (int) substr($no_antrian, 3, 3); + $urutan++; + $hasil_nomor = $kodeklinik.$shift.sprintf("%03s", $urutan); + + }else { + $hasil_nomor=$kodeklinik.$shift."001"; + } + + //--------end nomor antrian--------------------// + //-------start nomor barcode------------------// + $no_barcode; + $hasil_barcode = ""; + $this->db->where('pp_tanggal_periksa', $newDate); + $query_barcode = $this->db->get('proses_pengunjung'); + foreach ($query_barcode->result() as $datbarcode){ + $no_barcode = $datbarcode->pp_barcode; + } + if(isset($no_barcode)){ + $urutan = (int) substr($no_barcode, 7, 5); + $urutan++; + $barcode=$newDate2.$shift.sprintf("%05s", $urutan); + $urutanbar=$urutan; + }else { + $barcode=$newDate2.$shift."00001"; + $urutanbar=1; + } + + //-------end nomor barcode-------------------// + // $this->db->where('pp_tanggal_periksa', date('Y-m-d')); + // $this->db->where('pp_nomor_antrian', $hasil_nomor); + // $query_cek_nomor = $this->db->get('proses_pengunjung'); + // // var_dump($query_cek_nomor->num_rows()); + // // exit(); + // if($query_cek_nomor->num_rows()!=0){ + // return FALSE; + // }else{ + $insert_pp = array( + 'pp_nomor_antrian' => $hasil_nomor, + 'pp_shift' => $shift, + 'pp_tanggal_periksa' => $newDate, + 'pp_tanggal_datang' => date("Y-m-d H:i:s"), + 'pp_posisi_status' => 1, + 'pp_pendaftaran_online' => null, + 'pp_rekamedik' => null, + 'pp_status' => null, + 'pp_aktif' => null, + 'pp_klinik_id' => $idk, + 'pp_barcode' => $barcode, + 'pp_pembayaran' => $pembayaran, + ); + $insert = $this->db->insert('proses_pengunjung', $insert_pp); + $pp_last_id = $this->db->insert_id(); + // var_dump($pp_last_id); + // exit(); + //-----------start langsung masuk-------------------// + if($urutanbar<=70){ + $loket = null; + $this->db->order_by("ml_id", "RANDOM"); + $this->db->where('ml_pembayaran', $pembayaran); + $query_loket = $this->db->get('master_loket'); + foreach ($query_loket->result() as $datloket){ + $loketexplode = explode(",",$datloket->ml_pelayanan); + $count = count($loketexplode); + for ($x = 0; $x <= $count; $x++) { + if(isset($loketexplode[$x])){ + if($idk==$loketexplode[$x]){ + $loket = $datloket->ml_id; + } + } + } + } + $autoinsert_prt = array( + 'prt_status' => 0, + 'prt_tanggal' => $newDate.date(" 05:00:00"), + 'prt_aktif' => 0, + 'prt_pengunjung_id' => $pp_last_id, + ); + $prt = $this->db->insert('proses_ruang_tunggu', $autoinsert_prt); + + $update_pp = array( + 'pp_status' => 1, + 'pp_panggil_anjungan' => $newDate.date(" 05:10:00"), + 'pp_loket' => $loket, + ); + $this->db->where('pp_id', $pp_last_id); + $this->db->update('proses_pengunjung', $update_pp); + } + //-----------end langsung masuk-------------------// + //} + + $date=$newDate; + $this->cek_quota_shift($idk, $shift,$date); + } + + function insert_daftar_online(){ + $urutanbar=0; + $pembayaran=$this->input->post('pembayaran'); + $idk = $this->input->post('klinik'); + $shift = $this->input->post('shiftonline'); + //--------start get kode master klinik-----------// + $kodeklinik=""; + $barcode=""; + $this->db->where('mk_id', $idk); + $query = $this->db->get('master_klinik'); + foreach ($query->result() as $datklinik){ + if($pembayaran==1){ + $kodeklinik="UM"; + }else{ + $kodeklinik= $datklinik->mk_kode; + } + } + //--------end get kode master klinik-----------// + //--------start nomor antrian------------------// + $no_antrian; + $hasil_nomor = ""; + $query_pengunjung = $this->db->query("select * from proses_pengunjung WHERE pp_tanggal_periksa = '".date("Y-m-d")."' AND pp_nomor_antrian LIKE '".$kodeklinik."%' "); +// $this->db->like('pp_nomor_antrian', $kodeklinik, 'after'); +// $this->db->where('pp_tanggal_periksa', date("Y-m-d")); +// $query_pengunjung = $this->db->get('proses_pengunjung'); + foreach ($query_pengunjung->result() as $datpengunjung){ + $no_antrian = $datpengunjung->pp_nomor_antrian; + } + if(isset($no_antrian)){ + $urutan = (int) substr($no_antrian, 3, 3); + $urutan++; + $hasil_nomor = $kodeklinik.$shift.sprintf("%03s", $urutan); + }else { + $hasil_nomor=$kodeklinik.$shift."001"; + } + //--------end nomor antrian--------------------// + //-------start nomor barcode------------------// + $no_barcode; + $hasil_barcode = ""; + $this->db->where('pp_tanggal_periksa', date("Y-m-d")); + $query_barcode = $this->db->get('proses_pengunjung'); + foreach ($query_barcode->result() as $datbarcode){ + $no_barcode = $datbarcode->pp_barcode; + } + if(isset($no_barcode)){ + $urutan = (int) substr($no_barcode, 7, 5); + $urutan++; + $barcode=date("ymd").$shift.sprintf("%05s", $urutan); + $urutanbar=$urutan; + }else { + $barcode=date("ymd").$shift."00001"; + $urutanbar=1; + } + + //-------end nomor barcode-------------------// + $loket = null; + $this->db->order_by("ml_id", "RANDOM"); + $this->db->where('ml_pembayaran', $pembayaran); + $query_loket = $this->db->get('master_loket'); + foreach ($query_loket->result() as $datloket){ + $loketexplode = explode(",",$datloket->ml_pelayanan); + $count = count($loketexplode); + for ($x = 0; $x <= $count; $x++) { + if(isset($loketexplode[$x])){ + if($idk==$loketexplode[$x]){ + $loket = $datloket->ml_id; + } + } + } + } + + $this->db->where('pp_nomor_antrian', $hasil_nomor); + $query_cek_nomor = $this->db->get('proses_pengunjung'); + if($query_cek_nomor->num_rows()!=0){ + return FALSE; + }else{ + $insert_pp = array( + 'pp_nomor_antrian' => $hasil_nomor, + 'pp_shift' => $shift, + 'pp_tanggal_periksa' => date("Y-m-d"), + 'pp_tanggal_datang' => date("Y-m-d H:i:s"), + 'pp_posisi_status' => 1, + 'pp_pendaftaran_online' => $this->input->post('nopendaftaran'), + 'pp_rekamedik' => $this->input->post('norm'), + 'pp_status' => 1, + 'pp_aktif' => null, + 'pp_klinik_id' => $idk, + 'pp_barcode' => $barcode, + 'pp_pembayaran' => $pembayaran, + 'pp_loket' => $loket, + ); + $insert = $this->db->insert('proses_pengunjung', $insert_pp); + + $last_insert_id = $this->db->insert_id(); + $insert_prt = array( + 'prt_status' => 1, + 'prt_tanggal' => date("Y-m-d H:i:s"), + 'prt_aktif' => 0, + 'prt_pengunjung_id' => $last_insert_id, + ); + $insert_prt = $this->db->insert('proses_ruang_tunggu', $insert_prt); + } + //--------for cek data quota shift + $date=date("Y-m-d"); + $this->cek_quota_shift($idk, $shift,$date); + } + + function cek_quota_shift($idk,$shift,$date){ + $quota_shift; + $jum_pp; + $shiftcek; + + $this->db->where('mk_id', $idk); + $query = $this->db->get('master_klinik'); + foreach ($query->result() as $datklinik){ + $quota_shift = $datklinik->mk_quota; + $shiftcek = $datklinik->mk_shift; + } + + for($i=1;$i<=$shiftcek;$i++){ + $this->db->where('pp_klinik_id', $idk); + $this->db->where('pp_shift', $i); + $this->db->where('pp_tanggal_periksa', $date); + $query_pp = $this->db->get('proses_pengunjung'); + $jum_row = $query_pp->num_rows(); + $next_shift = $i+1; + //-----------start cek quota shift jika penuh ke shift selanjutnya---------// + if($quota_shift<=$jum_row){ + //-----------start cek klinik tidak bisa lebih dari jumlah shift klinik---------// + if($next_shift<=$shiftcek){ + $update_klinik = array( + 'mk_status_shift' => $next_shift, + ); + }else{ + $update_klinik = array( + 'mk_aktif' => 1, + 'mk_shift_penuh'=> 1, + ); + } + $this->db->where('mk_id', $idk); + $this->db->update('master_klinik', $update_klinik); + //-----------end cek klinik tidak bisa lebih dari jumlah shift klinik---------// + } + //-----------start cek quota shift jika penuh ke shift selanjutnya---------// + } + + } + + function info_pengunjung(){ + $this->db->order_by('pp_panggil_anjungan', 'ASC'); + $this->db->join('proses_pengunjung', 'pp_id = prt_pengunjung_id'); + $this->db->join('master_klinik', 'mk_id = pp_klinik_id'); + $this->db->where('pp_tanggal_periksa', date("Y-m-d")); + $this->db->where('prt_status', 0); + $this->db->where('prt_aktif', 0); + $query = $this->db->get('proses_ruang_tunggu'); + return $query->result(); + + $this->cekanjungan(); + } + + function info_pengunjung2(){ + $this->db->order_by('mk_nama', 'ASC'); + $this->db->order_by('pp_panggil_anjungan', 'ASC'); + $this->db->join('proses_pengunjung', 'pp_id = prt_pengunjung_id'); + $this->db->join('master_klinik', 'mk_id = pp_klinik_id'); + $this->db->where('pp_tanggal_periksa', date("Y-m-d")); + $this->db->where('prt_status', 0); + $this->db->where('prt_aktif', 0); + $query = $this->db->get('proses_ruang_tunggu'); + return $query->result(); + + $this->cekanjungan(); + } + + function barcode($barcode){ + $barcode = date("y").substr($barcode,2); + $this->db->join('proses_ruang_tunggu', 'prt_pengunjung_id = pp_id', 'LEFT'); + $this->db->where('pp_barcode', $barcode); + $this->db->where('pp_tanggal_periksa', date("Y-m-d")); + //$this->db->where('prt_status', 0); + $querypp = $this->db->get('proses_pengunjung'); + $rowcount = $querypp->num_rows(); + + if($rowcount!=0){ + foreach ($querypp->result() as $datpp){ + + if($datpp->pp_status!=null){ + if($datpp->prt_aktif!=2){ + if($datpp->prt_aktif==0){ + if($datpp->prt_status==0){ + $update_prt = array( + 'prt_status' => 1, + ); + $this->db->where('prt_id', $datpp->prt_id); + $this->db->update('proses_ruang_tunggu', $update_prt); + + $update_pp = array( + 'pp_panggil_anjungan' => null, +// 'pp_panggil_loket' => null, +// 'pp_panggil' => null, + ); + $this->db->where('pp_id', $datpp->pp_id); + $this->db->update('proses_pengunjung', $update_pp); + + $this->checkin($datpp->prt_id, $datpp->pp_id); + + $this->session->set_flashdata('message', 'Anda berhasil input barcode, Silahkan Masuk'); + }else{ + + $this->checkin($datpp->prt_id, $datpp->pp_id); + + $this->session->set_flashdata('message', 'Pengunjung Ditemukan, Silahkan Masuk'); + } + }else{ + $this->datang($datpp->prt_id); + $this->session->set_flashdata('messageblue', 'Anda dinyatakan terlambat, tunggu panggilan selanjutnya diruang tunggu'); + } + }else{ + $this->session->set_flashdata('messagewarning', 'Anda belum di panggil!!!'); + } + }else{ + $this->session->set_flashdata('messagewarning', 'Anda belum di panggil!!!'); + } + + } + }else{ + $this->session->set_flashdata('messagefail', 'Barcode Tidak Ditemukan!!'); + } + } + + function anjunganterlambat(){ + $this->db->join('proses_pengunjung', 'pp_id = prt_pengunjung_id'); + $this->db->where('pp_tanggal_periksa', date("Y-m-d")); + $this->db->where('prt_status', 0); + $this->db->where('prt_aktif', 1); + $query = $this->db->get('proses_ruang_tunggu'); + return $query->result(); + } + + function datang($id){ + $update_prt = array( + 'prt_aktif' => 2, + ); + $this->db->where('prt_id', $id); + $this->db->update('proses_ruang_tunggu', $update_prt); + + //$this->session->set_flashdata('message', 'Anda berhasil input pasien terlambat'); + } + + function bypass($id){ + $autoinsert_prt = array( + 'prt_status' => 1, + 'prt_tanggal' => date("Y-m-d H:i:s"), + 'prt_aktif' => 0, + 'prt_pengunjung_id' => $id, + ); + $prt = $this->db->insert('proses_ruang_tunggu', $autoinsert_prt); + + $update_pp = array( + 'pp_status' => 1, + ); + $this->db->where('pp_id', $id); + $this->db->update('proses_pengunjung', $update_pp); + + $this->session->set_flashdata('message', 'Anda berhasil proses pasien bypass'); + } + + function info_klinik(){ + $this->db->join('proses_pengunjung', 'pp_id = prt_pengunjung_id'); + $this->db->where('pp_tanggal_periksa', date("Y-m-d")); + $this->db->where('prt_status', 5); + $this->db->where('prt_aktif', 0); + $query = $this->db->get('proses_ruang_tunggu'); + return $query->result(); + } + + function datapengunjung($idklinik){ + $this->db->join('master_klinik', 'mk_id = pp_klinik_id'); + $this->db->where('pp_tanggal_periksa', date("Y-m-d")); + $this->db->where('pp_klinik_id', $idklinik); + $query = $this->db->get('proses_pengunjung'); + return $query->result(); + } + + function datapengunjungthis($idpp){ + $this->db->join('master_klinik', 'mk_id = pp_klinik_id'); + //$this->db->where('pp_tanggal_periksa', date("Y-m-d")); + $this->db->where('pp_id', $idpp); + $query = $this->db->get('proses_pengunjung'); + return $query->result(); + } + + function datapengunjungpesan($idklinik,$tgl,$shift){ + $newDate = date("Y-m-d", strtotime($tgl)); + $this->db->join('master_klinik', 'mk_id = pp_klinik_id'); + $this->db->where('pp_tanggal_periksa', $newDate); + $this->db->where('pp_klinik_id', $idklinik); + $this->db->where('pp_shift', $shift); + $query = $this->db->get('proses_pengunjung'); + return $query->result(); + } + + function panggilpasien(){ + $this->db->order_by('pp_panggil', 'desc'); + $this->db->like('pp_panggil', date("Y-m-d"), 'both');// %a% + $query = $this->db->get('proses_pengunjung'); + return $query->result(); + } + + function cetakulang($id) { + $this->db->join('master_klinik', 'mk_id = pp_klinik_id'); + $this->db->where('pp_id', $id); + $this->db->where('pp_tanggal_periksa', date("Y-m-d")); + $query = $this->db->get('proses_pengunjung'); + return $query->result(); + } + + function allpasien() { + $this->db->order_by('pp_tanggal_datang', 'desc'); + $this->db->join('master_klinik', 'mk_id = pp_klinik_id'); + //$this->db->where('pp_tanggal_periksa', date("Y-m-d")); + $query = $this->db->get('proses_pengunjung'); + return $query->result(); + } + + function batasallpasien() { + $this->db->order_by('pp_tanggal_datang', 'desc'); + $this->db->join('proses_ruang_tunggu', 'prt_pengunjung_id = pp_id','LEFT'); + $this->db->join('master_klinik', 'mk_id = pp_klinik_id'); + $this->db->where('pp_tanggal_periksa', date("Y-m-d")); + $query = $this->db->get('proses_pengunjung'); + return $query->result(); + } + + public function checkin($idprt, $idpp){ + $this->load->model('m_loket'); + $this->m_loket->proses_checkin($idprt,$idpp); + + $this->db->join('proses_ruang_tunggu', 'prt_pengunjung_id = pp_id'); + $this->db->where('pp_id', $idpp); + $query = $this->db->get('proses_pengunjung'); + //var_dump("ij"); + //exit(); + foreach($query->result() as $dat){ + $dataObj = new stdClass(); + $dataObj->jenislayanan = 'antrian'; //// JENIS LAYANAN 1: simrs 2: antrian + $dataObj->norm = ''; //// Nomor Rekam Medik + $dataObj->instalasi = 'rajal'; + $dataObj->kodebooking = $dat->pp_barcode;//'230119100001'; //// Nomor Booking / Barcode + $dataObj->nomorpendaftaran = ''; //// Nomor Billing Atau idx Pendaftaran + $dataObj->waktu = strtotime(date('Y-m-d H:i:s'));// strtotime('Ymdhis'); //// INstalasi Medik 1:rajal 2:ranap + $dataObj->tasktime = strtotime(date('Y-m-d H:i:s')); //'1674178500'; //// Time by sortime + $dataObj->taskid = '1'; //// Task Id Proses + $dataJSON = json_encode($dataObj); + //var_dump($dataJSON); + $response_array = array( + 'url' => "http://10.10.150.170:8080/gomed-api/restapi/taskid", + 'action' => "proses", + 'method' => "POST", + 'data' => $dataJSON, + 'header' => array( + 'X-Username: antrian@onsite', + 'X-Token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJyb2xlIjp7InJvbGUiOiJ1c2VyIiwidXNlcm5hbWUiOiJhbnRyaWFuQG9uc2l0ZSIsInBhc3N3b3JkIjoiYW50cmlhbkAyMDIzIn0sImV4cCI6MTY4MzUxNzcyMywiaWF0IjoxNjc0NzkxMzIzfQ.KAjJTxDkC6cP8KqQJQUzwgJLlU5gWNLdHSj-43TcVfA', + 'Content-Type: application/json' + ) + ); + //var_dump($dataJSON); + // //var_dump($response_array); + $respose_data = $this->sendRequest($response_array); + //var_dump($respose_data); + + } + + // redirect('index.php/ps_loket_admin'); + } + + protected function sendRequest($options = []){ + $curl = curl_init(); + + $action = isset($options["action"]) ? (trim($options["action"]) != "" ? "/" . $options["action"] : "") : ""; + $headers = array( + "Content-type: application/json" + ); + + $data = isset($options["data"]) ? $options["data"] : ""; + + //var_dump($data); + $headers = $options["header"]; + + // if (isset($options["header"])) { + // $headers = array_merge($headers, $options["header"]); + // } + //var_dump($headers); + /** GET URL ACCES IP REST API */ + // $id = $this->writeBridgeLog([ + // "URL" => $options["url"] . $action, + // "REQUEST" => $data, + // "ACCESS_FROM_IP" => $_SERVER['REMOTE_ADDR'] + // ]); + curl_setopt($curl, CURLOPT_URL, $options["url"] . $action); + curl_setopt($curl, CURLOPT_HEADER, false); + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $options["method"]); + curl_setopt($curl, CURLOPT_POSTFIELDS, $data); + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); + $result = curl_exec($curl); + + var_dump($result); + + + curl_close($curl); + + + + // /** GET URL ACCES IP REST API */ + // // $this->writeBridgeLog([ + // // "ID" => $id, + // // "RESPONSE" => $result + // // ]); + + //return json_decode($result); + + $result = json_decode($result); + // var_dump($result); + //exit(); + // if($result['metadata']['code']=='200'){ + // $this->session->set_flashdata('message', 'Anda berhasil check in pasien M-JKN'); + // redirect('index.php/ps_loket_admin'); + // }else{ + // $this->session->set_flashdata('message', 'Anda gagal check in pasien M-JKN'); + // redirect('index.php/ps_loket_admin'); + // } + + + } + +} +?> \ No newline at end of file diff --git a/application/models/m_fasttrack.php b/application/models/m_fasttrack.php new file mode 100644 index 0000000..76d2c29 --- /dev/null +++ b/application/models/m_fasttrack.php @@ -0,0 +1,61 @@ +db->order_by("mk_nama", "asc"); + $this->db->order_by('pp_fasttrack', 'DESC'); + $this->db->join('master_klinik', 'mk_id = pp_klinik_id'); + $this->db->join('proses_ruang_tunggu', 'prt_pengunjung_id = pp_id', 'left'); + $this->db->where('pp_tanggal_periksa', date("Y-m-d")); + $query = $this->db->get('proses_pengunjung'); + return $query->result(); + } + + function selectpasien($id) { + $this->db->join('master_klinik', 'mk_id = pp_klinik_id'); + $this->db->where('pp_id', $id); + $this->db->where('pp_tanggal_periksa', date("Y-m-d")); + $query = $this->db->get('proses_pengunjung'); + return $query->result(); + } + + function setfastrack(){ + $id = $this->input->post('idpengunjung'); + $pj = $this->input->post('penanggungjawab'); + $rm = $this->input->post('norek'); + $np = $this->input->post('namapas'); + $ke = $this->input->post('ket'); + + $rafast = $pj."|".$np."|".$ke."|"; + + $update_fastrack = array( + 'pp_fasttrack' => $rafast, + 'pp_rekamedik' => $rm, + ); + $this->db->where('pp_id', $id); + $this->db->update('proses_pengunjung', $update_fastrack); + + if($this->input->post('ppstatus')==1){ + $update_prt = array( + 'prt_status' => 1, + ); + $this->db->where('prt_pengunjung_id', $id); + $this->db->update('proses_ruang_tunggu', $update_prt); + }else{ + $update_pp = array( + 'pp_status' => 1, + ); + $this->db->where('pp_id', $id); + $this->db->update('proses_pengunjung', $update_pp); + + $insert_prt = array( + 'prt_status' => 1, + 'prt_tanggal' => date("Y-m-d H:i:s"), + 'prt_aktif' => 0, + 'prt_pengunjung_id' => $id, + ); + $insert = $this->db->insert('proses_ruang_tunggu', $insert_prt); + } + } +} +?> \ No newline at end of file diff --git a/application/models/m_hakakses.php b/application/models/m_hakakses.php new file mode 100644 index 0000000..8cf6e58 --- /dev/null +++ b/application/models/m_hakakses.php @@ -0,0 +1,67 @@ +db->where('mum_tipeuser_id', $this->input->post('id')); + $this->db->delete('master_user_menu'); + + if(isset($_POST['akses'])){ + $postakses= $_POST['akses']; + foreach($postakses as $key1 =>$valueakses) + { + $tambahaction=null; + $editaction=null; + $deleteaction=null; + $dataakses= explode ("-",$valueakses); + + if(isset($_POST['tambah'])){ + $posttambah= $_POST['tambah']; + foreach($posttambah as $key2 =>$valuetambah) + { + if($dataakses[1]==$valuetambah){ + $tambahaction="tambah"; + } + } + } + if(isset($_POST['edit'])){ + $postedit= $_POST['edit']; + foreach($postedit as $key3 =>$valueedit) + { + if($dataakses[1]==$valueedit){ + $editaction="ubah"; + } + } + } + if(isset($_POST['delete'])){ + $postdelete= $_POST['delete']; + foreach($postdelete as $key4 =>$valuedelete) + { + if($dataakses[1]==$valuedelete){ + $deleteaction="hapus"; + } + } + } + if(isset($_POST['view'])){ + $postview= $_POST['view']; + foreach($postview as $key5 =>$valueview) + { + if($dataakses[1]==$valueview){ + $viewaction="lihat"; + } + } + } + $insert_hakakses = array( + 'mum_tipeuser_id' => $this->input->post('id'), + 'mum_menu_id' => $dataakses[1], + 'mum_lihat' => $viewaction, + 'mum_tambah' => $tambahaction, + 'mum_ubah' => $editaction, + 'mum_hapus' => $deleteaction, + ); + + $insert = $this->db->insert('master_user_menu', $insert_hakakses); + } + } + } +} +?> \ No newline at end of file diff --git a/application/models/m_klinik.php b/application/models/m_klinik.php new file mode 100644 index 0000000..0caedef --- /dev/null +++ b/application/models/m_klinik.php @@ -0,0 +1,224 @@ +db->order_by('mk_nama', 'asc'); + $query = $this->db->get('master_klinik'); + return $query->result(); + } + + function klinikasc(){ + $this->db->order_by("mk_nama", "asc"); + $query = $this->db->get('master_klinik'); + return $query->result(); + } + + function insert() { + $datjadwal=""; + $setautoshift=""; + $waktu=""; + + if($this->input->post('autoshift')=="on"){$setautoshift="1";}else{ $setautoshift="0";} + + if(isset($_POST['senin'])){$datjadwal = $datjadwal."senin|";} + if(isset($_POST['selasa'])){$datjadwal = $datjadwal."selasa|";} + if(isset($_POST['rabu'])){$datjadwal = $datjadwal."rabu|";} + if(isset($_POST['kamis'])){$datjadwal = $datjadwal."kamis|";} + if(isset($_POST['jumat'])){$datjadwal = $datjadwal."jumat|";} + + if(isset($_POST['jam'])){ + $jam = $_POST['jam']; + $menit = $_POST['menit']; + $count = count($jam); + for($i=0;$i<$count;$i++){ + $waktu = $waktu.$jam[$i].":".$menit[$i]."|"; + } + } + + $insert_klinik = array( + 'mk_nama' => $this->input->post('nama'), + 'mk_kode' => $this->input->post('kode'), + 'mk_shift' => $this->input->post('shift'), + //'mk_menit' => $this->input->post('menit'), + 'mk_quota' => $this->input->post('quota'), + 'mk_quota_bangku' => $this->input->post('quotabangku'), + //'mk_status_shift' => $this->input->post('statusshift'), + //'mk_aktif' => $this->input->post('aktif'), + 'mk_jadwal' => $datjadwal, + 'mk_auto_shift' => $setautoshift, + 'mk_jam_shift' => $waktu, + ); + $insert = $this->db->insert('master_klinik', $insert_klinik); + } + + function edit($id) { + $this->db->where('mk_id', $id); + $query = $this->db->get('master_klinik'); + return $query; + } + + function prosesedit() { + $datjadwal=""; + $setautoshift=""; + + if($this->input->post('autoshift')=="on"){$setautoshift="1";}else{ $setautoshift="0";} + + if(isset($_POST['senin'])){$datjadwal = $datjadwal."senin|";} + if(isset($_POST['selasa'])){$datjadwal = $datjadwal."selasa|";} + if(isset($_POST['rabu'])){$datjadwal = $datjadwal."rabu|";} + if(isset($_POST['kamis'])){$datjadwal = $datjadwal."kamis|";} + if(isset($_POST['jumat'])){$datjadwal = $datjadwal."jumat|";} + + if(isset($_POST['jam'])){ + $jam = $_POST['jam']; + $menit = $_POST['menit']; + $count = count($jam); + for($i=0;$i<$count;$i++){ + $waktu = $waktu.$jam[$i].":".$menit[$i]."|"; + } + } + + $update_klinik = array( + 'mk_nama' => $this->input->post('nama'), + 'mk_kode' => $this->input->post('kode'), + 'mk_shift' => $this->input->post('shift'), + 'mk_menit' => 0, + 'mk_quota' => $this->input->post('quota'), + 'mk_quota_bangku' => $this->input->post('quotabangku'), + //'mk_status_shift' => $this->input->post('statusshift'), + //'mk_aktif' => $this->input->post('aktif'), + 'mk_jadwal' => $datjadwal, + 'mk_auto_shift' => $setautoshift, + 'mk_jam_shift' => $waktu, + ); + $id = $this->input->post('id'); + $this->db->where('mk_id', $id); + $this->db->update('master_klinik', $update_klinik); + } + + function view($id) { + $this->db->where('mk_id', $id); + $query = $this->db->get('master_klinik'); + return $query; + } + + function delete($id) { + $this->db->where('mk_id', $id); + $this->db->delete('master_klinik'); + } + + //-------------------------------------Klinik Admin--------------------------------// + + function pengunjungklinik($klinik) { + $this->db->order_by('pp_fasttrack', 'desc'); + $this->db->order_by('pp_konsul', 'desc'); + $this->db->join('proses_pengunjung', 'pp_id = prt_pengunjung_id', 'left'); + $this->db->join('master_klinik', 'mk_id = pp_klinik_id', 'left'); + $this->db->where('pp_tanggal_periksa', date('Y-m-d')); + $this->db->where('prt_aktif ', '0'); + $this->db->where('prt_status >=', '5'); + $this->db->where('prt_status <=', '8'); + $this->db->where('pp_klinik_id', $klinik); + $this->db->order_by('pp_nomor_antrian_klinik', 'asc'); + $query = $this->db->get('proses_ruang_tunggu'); + return $query->result(); + + } + + function infopengunjung($idklinik){ + + $this->db->join('proses_pengunjung', 'pp_id = prt_pengunjung_id', 'left'); + $this->db->where('pp_tanggal_periksa', date('Y-m-d')); + $this->db->where('prt_aktif ', '0'); + $this->db->where('pp_klinik_id ', $idklinik); + $this->db->where('prt_status =', '4'); + $query = $this->db->get('proses_ruang_tunggu'); + return $query->result(); + } + + function panggil($jumlah,$klinik){ + $this->db->join('proses_pengunjung', 'pp_id = prt_pengunjung_id', 'left'); + $this->db->where('pp_tanggal_periksa', date('Y-m-d')); + $this->db->where('prt_aktif ', '0'); + $this->db->where('prt_status', '4'); + $this->db->where('pp_klinik_id', $klinik); + $prt = $this->db->get('proses_ruang_tunggu'); + $nomor=1; + foreach ($prt->result() as $datpengunjung){ + if($nomor<=$jumlah){$nomor++; + $update_prt = array( + 'prt_status' => 5, + ); + $this->db->where('prt_id', $datpengunjung->prt_id); + $this->db->update('proses_ruang_tunggu', $update_prt); + } + } + } + + function proses($pengunjung,$kode){ + $update_rt = array( + 'prt_status' => $kode, + ); + $this->db->where('prt_id', $pengunjung); + $this->db->update('proses_ruang_tunggu', $update_rt); + } + + function ubahklinik(){ + $update_pp = array( + 'pp_klinik_id' => $this->input->post('klinik'), + 'pp_konsul' => null, + ); + $this->db->where('pp_id', $this->input->post('idpengunjung')); + $this->db->update('proses_pengunjung', $update_pp); + + $update_prt = array( + 'prt_status' =>5, + ); + $this->db->where('prt_id', $this->input->post('idprt')); + $this->db->update('proses_ruang_tunggu', $update_prt); + + } + + function konsul(){ + $update_pp = array( + 'pp_klinik_id' => $this->input->post('klinik'), + 'pp_konsul' => 1, + ); + $this->db->where('pp_id', $this->input->post('idpengunjung')); + $this->db->update('proses_pengunjung', $update_pp); + + $update_prt = array( + 'prt_status' => 7, + ); + $this->db->where('prt_id', $this->input->post('idprt')); + $this->db->update('proses_ruang_tunggu', $update_prt); + } + + function autoshift($klinik,$kode){ + $update_autoshift = array( + 'mk_auto_shift' => $kode, + ); + $this->db->where('mk_id', $klinik); + $this->db->update('master_klinik', $update_autoshift); + } + + function datapengunjung($idklinik){ + $this->db->join('proses_ruang_tunggu', 'prt_pengunjung_id = pp_id', 'left'); + $this->db->join('master_klinik', 'mk_id = pp_klinik_id'); + $this->db->order_by('prt_tanggal', 'asc'); + $this->db->where('pp_tanggal_periksa', date("Y-m-d")); + $this->db->where('pp_klinik_id', $idklinik); + $query = $this->db->get('proses_pengunjung'); + return $query->result(); + } + + function aktif($idprt){ + $update_prt = array( + 'prt_status' => '7', + ); + $this->db->where('prt_id', $idprt); + $this->db->update('proses_ruang_tunggu', $update_prt); + } + +} +?> \ No newline at end of file diff --git a/application/models/m_listpasien.php b/application/models/m_listpasien.php new file mode 100644 index 0000000..49541cf --- /dev/null +++ b/application/models/m_listpasien.php @@ -0,0 +1,79 @@ +db->join('proses_ruang_tunggu', 'proses_pengunjung.pp_id = proses_ruang_tunggu.prt_pengunjung_id', 'left '); + $this->db->join('m_pasien', 'proses_pengunjung.pp_pasien_id = m_pasien.int_pasien_id', 'left '); + $this->db->join('master_klinik', 'proses_pengunjung.pp_klinik_id = master_klinik.mk_id'); + $this->db->order_by("pp_tanggal_periksa", "asc"); + $this->db->where('pp_tanggal_periksa >=', date("Y-m-d") ); + $query = $this->db->get('proses_pengunjung'); + return $query->result(); + } + + function search() { + $tglperiksa=$this->input->post('tglperiksa'); + $date = str_replace('/', '-', $tglperiksa); + $newDate= date('Y-m-d', strtotime($date)); + + $ketkunjungan=$this->input->post('ketkunjungan'); + + $this->db->join('proses_ruang_tunggu', 'proses_pengunjung.pp_id = proses_ruang_tunggu.prt_pengunjung_id', 'left '); + $this->db->join('m_pasien', 'proses_pengunjung.pp_pasien_id = m_pasien.int_pasien_id', 'left '); + $this->db->join('master_klinik', 'proses_pengunjung.pp_klinik_id = master_klinik.mk_id'); + $this->db->where('pp_tanggal_periksa ', $newDate ); + + if($ketkunjungan=="online"){ + $this->db->where('pp_pendaftaran_online is NOT NULL', NULL, FALSE); + }elseif($ketkunjungan=="offline"){ + $this->db->where('pp_pendaftaran_online', NULL); + } + + $query = $this->db->get('proses_pengunjung'); + return $query->result(); + } + + function view($id) { + $this->db->where('mt_id', $id); + $query = $this->db->get('master_tipeuser'); + return $query; + } + + function datenow(){ + $this->db->where('pp_tanggal_periksa >=', date("Y-m-d") ); + $query = $this->db->get('proses_pengunjung'); + return $query->result(); + } + + function minsatunow(){ + $tglend= date('Y-m', strtotime('-1 month', strtotime( date("Y-m") ))); + $this->db->like('pp_tanggal_periksa', $tglend , 'after'); + $query = $this->db->get('proses_pengunjung'); + return $query->result(); + } + + function laporanpasien() { + //$bulan=$this->input->post('bulankunjungan'); + //$tahun=$this->input->post('tahunkunjungan'); + + //$this->db->join('proses_ruang_tunggu', 'proses_pengunjung.pp_id = proses_ruang_tunggu.prt_pengunjung_id', 'left '); + //$this->db->join('m_pasien', 'proses_pengunjung.pp_pasien_id = m_pasien.int_pasien_id', 'left '); + //$this->db->join('master_klinik', 'proses_pengunjung.pp_klinik_id = master_klinik.mk_id'); + //$this->db->where('pp_tanggal_periksa >=', date("Y-m-d") ); + //$this->db->like('pp_tanggal_periksa', "2023-05"); + //$this->db->group_by('day(pp_tanggal_periksa)'); + //$this->db->group_by('DATE(pp_tanggal_periksa)'); + //$this->db->group_by('date'); + //$this->db->where('pp_tanggal_periksa ', $newDate ); + + // if($ketkunjungan=="online"){ + // $this->db->where('pp_pendaftaran_online is NOT NULL', NULL, FALSE); + // }elseif($ketkunjungan=="offline"){ + // $this->db->where('pp_pendaftaran_online', NULL); + // } + + // $query = $this->db->get('proses_pengunjung'); + // return $query->result(); + } +} +?> \ No newline at end of file diff --git a/application/models/m_login.php b/application/models/m_login.php new file mode 100644 index 0000000..6ec1fd0 --- /dev/null +++ b/application/models/m_login.php @@ -0,0 +1,39 @@ +security->xss_clean($this->input->post('username')); + $password = md5($this->security->xss_clean($this->input->post('password'))); + $this->db->where('mu_nama_user', $username); + $this->db->where('mu_password', $password); + $query = $this->db->get('master_user'); + if($query->num_rows() == 1) + { + if (date('H') < 7) { + //-----------------start untuk cek jam shift, jam shift, dan aktif klinik------------------// + $this->load->model('m_anjungan'); + $info_pengunjung = $this->m_anjungan->cek_shift_jam(); + + $this->load->model('m_anjungan'); + $cekanjungan = $this->m_anjungan->cekanjungan(); + //-----------------end untuk cek jam shift, jam shift, dan aktif klinik------------------// + } + + $row = $query->row(); + $data = array( + 's_ID_User' => $row->mu_id, + 's_NamaUser_User' => $row->mu_nama_user, + 's_FK_TipeUser' => $row->mu_tipeuser_id, + 's_loket' => $row->mu_loket_id, + 's_klinik' => $row->mu_klinik_id, + 'validated' => true + ); + $this->session->set_userdata($data); + return true; + } + return false; + } +} +?> \ No newline at end of file diff --git a/application/models/m_loket.php b/application/models/m_loket.php new file mode 100644 index 0000000..15f53d1 --- /dev/null +++ b/application/models/m_loket.php @@ -0,0 +1,350 @@ +db->get('master_loket'); + return $query->result(); + } + + function insert() { + $datpelayanan = ""; + if(isset($_POST['klinik'])){ + $dataklinik=$this->input->post('klinik'); + $jumlahklinik = count($this->input->post('klinik')); + for($x = 0; $x <= $jumlahklinik; $x++){ + if(isset($dataklinik[$x])){ + $datpelayanan = $datpelayanan.$dataklinik[$x].","; + } + } + } + $insert_loket = array( + 'ml_nama' => $this->input->post('nama'), + 'ml_pelayanan' => $datpelayanan, + 'ml_quota_bangku' => $this->input->post('quota'), + 'ml_pembayaran' => $this->input->post('pembayaran'), + 'ml_online' => $this->input->post('online'), + 'ml_statuspelayanan'=> $this->input->post('statuspelayanan'), + ); + $insert = $this->db->insert('master_loket', $insert_loket); + } + + function edit($id) { + $this->db->where('ml_id', $id); + $query = $this->db->get('master_loket'); + return $query; + } + + function prosesedit() { + $datpelayanan = ""; + if(isset($_POST['klinik'])){ + $dataklinik=$this->input->post('klinik'); + $jumlahklinik = count($this->input->post('klinik')); + for($x = 0; $x <= $jumlahklinik; $x++){ + if(isset($dataklinik[$x])){ + $datpelayanan = $datpelayanan.$dataklinik[$x].","; + } + } + } + $update_loket = array( + 'ml_nama' => $this->input->post('nama'), + 'ml_pelayanan' => $datpelayanan, + 'ml_quota_bangku' => $this->input->post('quota'), + 'ml_pembayaran' => $this->input->post('pembayaran'), + 'ml_online' => $this->input->post('online'), + 'ml_statuspelayanan'=> $this->input->post('statuspelayanan'), + ); + $id = $this->input->post('id'); + $this->db->where('ml_id', $id); + $this->db->update('master_loket', $update_loket); + } + + function view($id) { + $this->db->where('ml_id', $id); + $query = $this->db->get('master_loket'); + return $query; + } + + function delete($id) { + $this->db->where('ml_id', $id); + $this->db->delete('master_loket'); + } + + //-------------------------------------Loket Admin--------------------------------// + + function pengunjung() { + $this->db->order_by('pp_fasttrack', 'desc'); + $this->db->order_by('pp_tanggal_datang', 'asc'); + $this->db->join('proses_pengunjung', 'pp_id = prt_pengunjung_id', 'left'); + $this->db->join('master_klinik', 'mk_id = pp_klinik_id', 'left'); + $this->db->where('pp_tanggal_periksa', date('Y-m-d')); + $this->db->where('pp_loket', $this->session->userdata('s_loket')); + $this->db->where('prt_aktif ', '0'); + $this->db->where('prt_status <', '5'); + $query = $this->db->get('proses_ruang_tunggu'); + return $query->result(); + } + + function pengunjungklinik() { + $this->db->join('proses_pengunjung', 'pp_id = prt_pengunjung_id', 'left'); + $this->db->join('master_klinik', 'mk_id = pp_klinik_id', 'left'); + $this->db->where('pp_tanggal_periksa', date('Y-m-d')); + $this->db->where('prt_aktif ', '0'); + $this->db->where('prt_status >', '3'); + $this->db->where('prt_status <', '6'); + $query = $this->db->get('proses_ruang_tunggu'); + return $query->result(); + } + + function panggil($jumlah){ + $iduser = $this->session->userdata('s_ID_User'); + $dataklinik=""; + $datapembayaran=""; + $this->db->join('master_loket', 'ml_id = mu_loket_id'); + $this->db->where('mu_id', $iduser); + $user = $this->db->get('master_user'); + foreach ($user->result() as $datuser){ + $dataklinik = $datuser->ml_pelayanan; + $datapembayaran = $datuser->ml_pembayaran; + } + + $klinikpecah = explode(",",$dataklinik); + //$this->db->join('proses_ruang_tunggu', 'prt_pengunjung_id = pp_id','LEFT'); + $this->db->order_by('pp_tanggal_datang', 'asc'); + $this->db->or_where_in('pp_klinik_id', $klinikpecah); + $this->db->where('pp_status', null); + $this->db->where('pp_tanggal_periksa', date('Y-m-d')); + $this->db->where('pp_pembayaran', $datapembayaran); + $pengunjung = $this->db->get('proses_pengunjung'); + $nomor=1; + + $this->db->join('proses_pengunjung', 'pp_id = prt_pengunjung_id'); + $this->db->where('pp_tanggal_periksa', date("Y-m-d")); + $this->db->where('prt_aktif', 2); + $rt = $this->db->get('proses_ruang_tunggu'); + foreach ($rt->result() as $datruangtunggu){ + if($nomor<=$jumlah){$nomor++; + $update_ruangtunggu = array( + 'prt_aktif' => 0, + ); + $this->db->where('prt_id', $datruangtunggu->prt_id); + $this->db->update('proses_ruang_tunggu', $update_ruangtunggu); + + $updatepengunjung = array('pp_status'=> 1,'pp_panggil_anjungan'=> date("Y-m-d H:i:s")); + $this->db->where('pp_id', $datruangtunggu->pp_id); + $this->db->update('proses_pengunjung', $updatepengunjung); + } + } + + foreach ($pengunjung->result() as $datpengunjung){ + $this->db->where('mk_id', $datpengunjung->pp_klinik_id); + $kl = $this->db->get('master_klinik'); + foreach ($kl->result() as $datklinik){ + //-------------cek shift buka----------// + if($datpengunjung->pp_shift <= $datklinik->mk_shift_buka){ + //echo $datpengunjung->pp_id; echo $nomor; + if($nomor<=$jumlah){$nomor++; + + $input_ruangtunggu = array( + 'prt_status' => 0, + 'prt_tanggal' => date("Y-m-d H:i:s"), + 'prt_aktif' => 0, + 'prt_pengunjung_id' => $datpengunjung->pp_id, + ); + $insert = $this->db->insert('proses_ruang_tunggu', $input_ruangtunggu); + + $updatepengunjung = array('pp_status'=> 1,'pp_panggil_anjungan'=> date("Y-m-d H:i:s"),'pp_loket'=>$this->session->userdata('s_loket')); + //$updatepengunjung = array('pp_status'=> 1,'pp_panggil_anjungan'=> date("Y-m-d H:i:s")); + $this->db->where('pp_id', $datpengunjung->pp_id); + $this->db->update('proses_pengunjung', $updatepengunjung); + } + + } + } + } + + } + + function proses($pengunjung,$kode){ + $update_rt = array( + 'prt_status' => $kode, + ); + $this->db->where('prt_id', $pengunjung); + $this->db->update('proses_ruang_tunggu', $update_rt); + } + + function barcode($pengunjung){ + $update_prt = array( + 'prt_status' =>1, + ); + $this->db->where('prt_id', $pengunjung); + $this->db->update('proses_ruang_tunggu', $update_prt); + } + + function terlambat($pengunjung){ + $update_prt = array( + 'prt_aktif' =>1, + 'prt_status' =>0, + ); + $this->db->where('prt_id', $pengunjung); + $this->db->update('proses_ruang_tunggu', $update_prt); + } + + function aktif($pengunjung){ + $update_prt = array( + 'prt_aktif' =>0, + 'prt_status' =>1, + ); + $this->db->where('prt_id', $pengunjung); + $this->db->update('proses_ruang_tunggu', $update_prt); + } + + function infopengunjung(){ + $this->db->join('proses_ruang_tunggu', 'prt_pengunjung_id = pp_id','LEFT'); + $this->db->where('pp_tanggal_periksa', date("Y-m-d")); + $query = $this->db->get('proses_pengunjung'); + return $query->result(); + } + + function ubahklinik(){ + $update_pp = array( + 'pp_klinik_id' => $this->input->post('klinik'), + 'pp_pembayaran' => $this->input->post('pembayaran'), + 'pp_loket' => null, + ); + $this->db->where('pp_id', $this->input->post('idpengunjung')); + $this->db->update('proses_pengunjung', $update_pp); + + $update_prt = array( + 'prt_status' =>1, + ); + $this->db->where('prt_id', $this->input->post('idprt')); + $this->db->update('proses_ruang_tunggu', $update_prt); + + } + + function kunjunganterlambat(){ + $this->db->join('proses_pengunjung', 'pp_id = prt_pengunjung_id'); + $this->db->join('master_klinik', 'mk_id = pp_klinik_id'); + $this->db->where('pp_tanggal_periksa', date("Y-m-d")); + $this->db->where('prt_status', 0); + $this->db->where('prt_aktif', 1); + $query = $this->db->get('proses_ruang_tunggu'); + return $query->result(); + } + + function proses_pengunjung(){ + $idprt = $this->input->post('idprt_proses'); + $idpp = $this->input->post('idpp_proses'); + $idkl = $this->input->post('idklinik_proses'); + $kodekl = $this->input->post('kodeklinik_proses'); + $rm = $this->input->post('norm'); + $fasttr = $this->input->post('data_fastrack'); + + $kode = 4; + + $no_klinik=""; + $i=0; + $hasil_nomor = ""; + $this->db->order_by('pp_nomor_antrian_klinik', "asc"); + $this->db->where('pp_klinik_id', $idkl); + $this->db->where('pp_tanggal_periksa', date("Y-m-d")); + $this->db->like('pp_nomor_antrian_klinik', 'KL'.$kodekl); + $query_pengunjung = $this->db->get('proses_pengunjung'); + foreach ($query_pengunjung->result() as $datpengunjung){ + if(isset($datpengunjung->pp_nomor_antrian_klinik)){ + $no_klinik = $datpengunjung->pp_nomor_antrian_klinik; + } + } + + if($fasttr!=null){$kode=5;} + + if(isset($no_klinik)){ + $urutan = (int) substr($no_klinik, 4, 3); + $urutan++; + $hasil_nomor = "KL".$kodekl.sprintf("%03s", $urutan); + }else { + $hasil_nomor="KL".$kodekl."001"; + } + + $this->db->where('pp_tanggal_periksa', date('Y-m-d')); + $this->db->where('pp_nomor_antrian_klinik', $hasil_nomor); + $query_cek_nomor = $this->db->get('proses_pengunjung'); + if($query_cek_nomor->num_rows()!=0){ + return FALSE; + }else{ + $update_pp = array( + 'pp_nomor_antrian_klinik' => $hasil_nomor, + 'pp_rekamedik' => $rm, + ); + $this->db->where('pp_id', $idpp); + $this->db->update('proses_pengunjung', $update_pp); + + $update_rt = array( + 'prt_status' => $kode, + ); + $this->db->where('prt_id', $idprt); + $this->db->update('proses_ruang_tunggu', $update_rt); + } + } + + function proses_panggil($idpp, $idloket){ + $namaloket = ""; + $this->db->where('ml_id', $idloket); + $query_loket = $this->db->get('master_loket'); + foreach ($query_loket->result() as $datloket){ + $namaloket = $datloket->ml_nama; + } + + $update_pp = array( + 'pp_panggil' => date("Y-m-d H:i:s"), + 'pp_panggil_loket' => $namaloket, + ); + $this->db->where('pp_id', $idpp); + $this->db->update('proses_pengunjung', $update_pp); + } + + function proses_panggil_anjungan($idpp){ + $update_pp = array( + 'pp_panggil_anjungan' => date("Y-m-d H:i:s"), + ); + $this->db->where('pp_id', $idpp); + $this->db->update('proses_pengunjung', $update_pp); + } + + function proses_panggil_null($idpp){ + + $update_pp = array( + 'pp_panggil' => null, + 'pp_panggil_loket' => null, + //'pp_panggil_anjungan' => null, + ); + $this->db->where('pp_id', $idpp); + $this->db->update('proses_pengunjung', $update_pp); + } + + function proses_panggil_anjungan_null($idpp){ + + $update_pp = array( + 'pp_panggil_anjungan' => null, + ); + $this->db->where('pp_id', $idpp); + $this->db->update('proses_pengunjung', $update_pp); + } + + function data_pengunjung($idpp){ + $this->db->join('master_klinik', 'mk_id = pp_klinik_id'); + $this->db->where('pp_id', $idpp); + $query = $this->db->get('proses_pengunjung'); + return $query->result(); + } + + function proses_checkin($idprt, $idpp){ + $update_pp = array( + 'pp_tanggal_datang' => date("Y-m-d H:i:s"), + ); + $this->db->where('pp_id', $idpp); + $this->db->update('proses_pengunjung', $update_pp); + } + +} +?> \ No newline at end of file diff --git a/application/models/m_loketranap.php b/application/models/m_loketranap.php new file mode 100644 index 0000000..8162f48 --- /dev/null +++ b/application/models/m_loketranap.php @@ -0,0 +1,112 @@ +db->join('master_loket', 'ml_id = ppr_loket', 'LEFT'); + $this->db->where('ppr_status <=', "2"); + $this->db->like('ppr_tanggal_periksa', date("Y-m-d")); + + $this->db->order_by('ppr_tanggal_periksa', 'ASC'); + $this->db->order_by('ppr_status', 'ASC'); + $query = $this->db->get('proses_pengunjung_ranap'); + return $query->result(); + } + + function datapengunjung($id) { + $this->db->where('ppr_id', $id); + $query = $this->db->get('proses_pengunjung_ranap'); + return $query; + } + + function searchloket() { + $this->db->like('ppr_tanggal_periksa', date("Y-m-d")); + $this->db->where('ppr_status', "1"); + $this->db->where('ppr_loket', $this->session->userdata('s_loket')); + $query = $this->db->get('proses_pengunjung_ranap'); + return $query; + } + + function datapanggil() { + $this->db->join('master_loket', 'ml_id = ppr_loket', 'LEFT'); + $this->db->like('ppr_tanggal_periksa', date("Y-m-d")); + $this->db->where('ppr_status <=', "2"); + $this->db->where('ppr_loket is NULL', NULL, TRUE); + $this->db->where('ppr_callsound is NULL', NULL, FALSE); + $this->db->order_by('ppr_callsound', 'ASC'); + $query = $this->db->get('proses_pengunjung_ranap'); + return $query->result(); + } + + function datapanggilsuara() { + $this->db->join('master_loket', 'ml_id = ppr_loket', 'LEFT'); + $this->db->like('ppr_tanggal_periksa', date("Y-m-d")); + $this->db->where('ppr_loket is NOT NULL', NULL, FALSE); + $this->db->where('ppr_callsound is NOT NULL', NULL, FALSE); + $this->db->order_by('ppr_callsound', 'DESC'); + $query = $this->db->get('proses_pengunjung_ranap'); + return $query->result(); + } + + function dataloket() { + $this->db->join('master_loket', 'ml_id = mu_loket_id', 'LEFT'); + $this->db->where('mu_tipeuser_id', "7"); + $query = $this->db->get('master_user'); + return $query->result(); + } + +// function insertpengunjung() { +// +// $no_antrian; +// $hasil_nomor = ""; +// $this->db->order_by('ppr_nomor_antrian', 'ASC'); +// $this->db->where('ppr_tanggal_periksa', date("Y-m-d")); +// $query = $this->db->get('proses_pengunjung_ranap'); +// foreach ($query->result() as $datpengunjung){ +// $no_antrian = $datpengunjung->ppr_nomor_antrian; +// } +// +// if(isset($no_antrian)){ +// $hasil_nomor = $no_antrian+1; +// $nomjum = strlen($hasil_nomor);$nol=""; +// if($nomjum=="1"){$nol="00";} +// elseif($nomjum=="2"){$nol="0";} +// $hasil_nomor=$nol.$hasil_nomor; +// }else { +// $hasil_nomor="001"; +// } +// +// $insert = array( +// 'ppr_nomor_antrian' => $hasil_nomor, +// 'ppr_tanggal_periksa' => date("Y-m-d"), +// 'ppr_status' => "0", +// ); +// $this->db->insert('proses_pengunjung_ranap', $insert); +// } +// +// function edit($id) { +// $this->db->where('mt_id', $id); +// $query = $this->db->get('master_tipeuser'); +// return $query; +// } +// +// function prosesedit() { +// $update_tipeuser = array( +// 'mt_nama' => $this->input->post('namatipeuser'), +// ); +// $id = $this->input->post('id'); +// $this->db->where('mt_id', $id); +// $this->db->update('master_tipeuser', $update_tipeuser); +// } +// +// function view($id) { +// $this->db->where('mt_id', $id); +// $query = $this->db->get('master_tipeuser'); +// return $query; +// } +// +// function delete($id) { +// $this->db->where('mt_id', $id); +// $this->db->delete('master_tipeuser'); +// } +} +?> \ No newline at end of file diff --git a/application/models/m_masteruser.php b/application/models/m_masteruser.php new file mode 100644 index 0000000..ff93bdb --- /dev/null +++ b/application/models/m_masteruser.php @@ -0,0 +1,118 @@ +db->select('user.*,tipeuser.Nama_TipeUser'); + $this->db->from('user')->join('tipeuser', 'user.FK_TipeUser = tipeuser.ID_TipeUser', 'left'); + $query = $this->db->get(); + return $query->result(); + } + + function insert() { + $insert_masteruser = array( + 'FK_TipeUser' => $this->input->post('tipeuser'), + 'NamaUser_User' => $this->input->post('namauser'), + 'Password_User' => "simkoprasiBMB", + 'NamaLengkap_User' => $this->input->post('namalengkapuser'), + 'Telepon_User' => $this->input->post('teleponuser'), + 'Email_User' => $this->input->post('emailuser'), + 'TanggalLahir_User' => $this->input->post('tanggallahiruser'), + 'TempatLahir_User' => $this->input->post('tempatlahiruser'), + 'Alamat_User' => $this->input->post('alamatuser'), + 'JenisKelamin_User' => $this->input->post('jeniskelaminuser'), + 'Agama_User' => $this->input->post('agamauser'), + 'TanggalBuat_User' => date('Y-m-d H:i:s'), + 'TanggalEdit_User' => date('Y-m-d H:i:s'), + 'Provinsi_ID' => $this->input->post('provinsi'), + 'Kabupaten_ID' => $this->input->post('kabupaten'), + 'Kecamatan_ID' => $this->input->post('kecamatan'), + 'Desa_ID' => $this->input->post('desa'), + + ); + + $insert = $this->db->insert('user', $insert_masteruser); + return $insert; + } + + function edit($id) { + $this->db->where('ID_User', $id); + $query = $this->db->get('user'); + return $query; + } + + function prosesedit() { + $update_masteruser = array( + 'FK_TipeUser' => $this->input->post('tipeuser'), + 'NamaUser_User' => $this->input->post('namauser'), + //'Password_User' => $this->input->post('passworduser'), + 'NamaLengkap_User' => $this->input->post('namalengkapuser'), + 'Telepon_User' => $this->input->post('teleponuser'), + 'Email_User' => $this->input->post('emailuser'), + 'TanggalLahir_User' => $this->input->post('tanggallahiruser'), + 'TempatLahir_User' => $this->input->post('tempatlahiruser'), + 'Alamat_User' => $this->input->post('alamatuser'), + 'JenisKelamin_User' => $this->input->post('jeniskelaminuser'), + 'Agama_User' => $this->input->post('agamauser'), + 'TanggalEdit_User' => date('Y-m-d H:i:s'), + 'Provinsi_ID' => $this->input->post('provinsi'), + 'Kabupaten_ID' => $this->input->post('kabupaten'), + 'Kecamatan_ID' => $this->input->post('kecamatan'), + 'Desa_ID' => $this->input->post('desa'), + ); + $id = $this->input->post('id'); + $this->db->where('ID_User', $id); + $this->db->update('user', $update_masteruser); + } + + function view($id) { + $this->db->where('ID_User', $id); + $query = $this->db->get('user'); + return $query; + } + + function delete($id) { + $this->db->where('ID_User', $id); + $this->db->delete('user'); + } + + function editfoto() { + $config = array( + 'upload_path' => "./img/", + 'allowed_types' => "jpg|jpeg", + 'overwrite' => TRUE, + 'max_size' => "2048000", // Can be set to particular file size , here it is 2 MB(2048 Kb) + 'max_height' => "768", + 'max_width' => "1024" + ); + $this->load->library('upload', $config); + $upload_data = $this->upload->data(); + $file_name = $upload_data['file_name']; + + $update_user = array( + 'Foto_User' => $file_name, + 'TanggalEdit_User' => date('Y-m-d H:i:s'), + ); + $id = $this->session->userdata('s_ID_User'); + $this->db->where('ID_User', $id); + $this->db->update('user', $update_user); + } + + function resetpass($id) { + $update_user = array( + 'Password_User' => "simkoprasiBMB", + 'TanggalEdit_User' => date('Y-m-d H:i:s'), + ); + $this->db->where('ID_User', $id); + $this->db->update('user', $update_user); + } + + function editpass($id) { + $update_user = array( + 'Password_User' => $this->input->post('renewpass'), + 'TanggalEdit_User' => date('Y-m-d H:i:s'), + ); + $this->db->where('ID_User', $id); + $this->db->update('user', $update_user); + } + +} +?> \ No newline at end of file diff --git a/application/models/m_menu.php b/application/models/m_menu.php new file mode 100644 index 0000000..c049967 --- /dev/null +++ b/application/models/m_menu.php @@ -0,0 +1,22 @@ +db->order_by('mm_urutan', 'ASC'); + $query = $this->db->get('master_menu'); + return $query->result(); + } + + function urutan() { + $this->db->order_by('mm_urutan', 'ASC'); + $query = $this->db->get('master_menu'); + return $query->result(); + } + + function hakakses($id) { + $this->db->where('mum_tipeuser_id', $id); + $query = $this->db->get('master_user_menu'); + return $query->result(); + } +} +?> \ No newline at end of file diff --git a/application/models/m_pasien.php b/application/models/m_pasien.php new file mode 100644 index 0000000..3eafc16 --- /dev/null +++ b/application/models/m_pasien.php @@ -0,0 +1,42 @@ +db->where('pp_tanggal_periksa', date("Y-m-d")); + $this->db->join('proses_ruang_tunggu', 'prt_pengunjung_id = pp_id', 'LEFT'); + $this->db->join('master_klinik', 'mk_id = pp_klinik_id'); + $query = $this->db->get('proses_pengunjung'); + return $query->result(); + } + + function edit($id) { + $this->db->where('pp_id', $id); + $this->db->join('proses_ruang_tunggu', 'prt_pengunjung_id = pp_id', 'LEFT'); + $this->db->join('master_klinik', 'mk_id = pp_klinik_id'); + $query = $this->db->get('proses_pengunjung'); + return $query; + } + + function prosesedit() { + $update_pp = array( + 'pp_rekamedik' => $this->input->post('norek'), + //'pp_klinik_id' => $this->input->post('klinik'), + //'pp_shift' => $this->input->post('shift'), + //'pp_pembayaran' => $this->input->post('pembayaran'), + ); + $id = $this->input->post('id'); + $this->db->where('pp_id', $id); + $this->db->update('proses_pengunjung', $update_pp); + } + + function view($id) { + $this->db->where('mu_id', $id); + $query = $this->db->get('master_user'); + return $query; + } + + function delete($id) { + $this->db->where('mu_id', $id); + $this->db->delete('master_user'); + } +} +?> \ No newline at end of file diff --git a/application/models/m_screen.php b/application/models/m_screen.php new file mode 100644 index 0000000..3fcbc83 --- /dev/null +++ b/application/models/m_screen.php @@ -0,0 +1,57 @@ +db->get('master_klinik'); + return $query->result(); + } + + function info_pp($mlscreen) { + $this->db->join('proses_ruang_tunggu', 'prt_pengunjung_id = pp_id', 'LEFT'); + $this->db->join('master_klinik', 'mk_id = pp_klinik_id','LEFT'); + $this->db->where('mk_screen', $mlscreen); + $this->db->where('prt_status', '5'); + $this->db->where('pp_tanggal_periksa', date("Y-m-d")); + $query = $this->db->get('proses_pengunjung'); + return $query->result(); + } + + function master_klinik($mlscreen) { + $this->db->where('mk_screen', $mlscreen); + $this->db->order_by('mk_nama', 'asc'); + $query = $this->db->get('master_klinik'); + return $query->result(); + } + + function edit($ketscr) { + $this->db->where('mk_screen', $ketscr); + $query = $this->db->get('master_klinik'); + return $query; + } + + function prosesedit() { + $totnum = $this->input->post('lastnumber'); + for($i=1;$i<=$totnum;$i++){ + $update_kl = array( + 'mk_screen' => $this->input->post('sc'.$i), + ); + $id = $this->input->post('idk'.$i); + $this->db->where('mk_id', $id); + $this->db->update('master_klinik', $update_kl); + } + } + + function pengunjung($idloket) { + $this->db->order_by('pp_fasttrack', 'desc'); + $this->db->order_by('pp_tanggal_datang', 'DESC'); + $this->db->join('proses_pengunjung', 'pp_id = prt_pengunjung_id', 'left'); + $this->db->join('master_klinik', 'mk_id = pp_klinik_id', 'left'); + $this->db->where('pp_tanggal_periksa', date('Y-m-d')); + $this->db->where('pp_loket', $idloket); + //$this->db->where('pp_loket', $this->session->userdata('s_loket')); + $this->db->where('prt_aktif ', '0'); + $this->db->where('prt_status <', '5'); + $query = $this->db->get('proses_ruang_tunggu'); + return $query->result(); + } +} +?> \ No newline at end of file diff --git a/application/models/m_tipeuser.php b/application/models/m_tipeuser.php new file mode 100644 index 0000000..c4db84c --- /dev/null +++ b/application/models/m_tipeuser.php @@ -0,0 +1,42 @@ +db->get('master_tipeuser'); + return $query->result(); + } + + function insert() { + $insert_tipeuser = array( + 'mt_nama' => $this->input->post('namatipeuser'), + ); + $insert = $this->db->insert('master_tipeuser', $insert_tipeuser); + } + + function edit($id) { + $this->db->where('mt_id', $id); + $query = $this->db->get('master_tipeuser'); + return $query; + } + + function prosesedit() { + $update_tipeuser = array( + 'mt_nama' => $this->input->post('namatipeuser'), + ); + $id = $this->input->post('id'); + $this->db->where('mt_id', $id); + $this->db->update('master_tipeuser', $update_tipeuser); + } + + function view($id) { + $this->db->where('mt_id', $id); + $query = $this->db->get('master_tipeuser'); + return $query; + } + + function delete($id) { + $this->db->where('mt_id', $id); + $this->db->delete('master_tipeuser'); + } +} +?> \ No newline at end of file diff --git a/application/models/m_userlogin.php b/application/models/m_userlogin.php new file mode 100644 index 0000000..7e66bb9 --- /dev/null +++ b/application/models/m_userlogin.php @@ -0,0 +1,69 @@ +db->join('master_tipeuser', 'master_tipeuser.mt_id = master_user.mu_tipeuser_id','left'); + $this->db->join('master_klinik', 'master_klinik.mk_id = master_user.mu_klinik_id','left'); + $this->db->join('master_loket', 'master_loket.ml_id = master_user.mu_loket_id','left'); + $query = $this->db->get('master_user'); + return $query->result(); + } + + function insert() { + $loketdat = $this->input->post('loket');if(empty($loketdat)){$loketdat=null;} + $klinik = $this->input->post('klinik');if(empty($klinik)){$klinik=null;} + $insert_userlogin = array( + 'mu_nama_lengkap' => $this->input->post('namalengkapuser'), + 'mu_nama_user' => $this->input->post('namauser'), + 'mu_password' => md5($this->input->post('passworduser')), + 'mu_klinik_id' => $klinik, + 'mu_loket_id' => $loketdat, + 'mu_tipeuser_id' => $this->input->post('tipeuser'), + ); + $insert = $this->db->insert('master_user', $insert_userlogin); + } + + function edit($id) { + $this->db->where('mu_id', $id); + $query = $this->db->get('master_user'); + return $query; + } + + function prosesedit() { + $loketdat = $this->input->post('loket');if(empty($loketdat)){$loketdat=null;} + $klinik = $this->input->post('klinik');if(empty($klinik)){$klinik=null;} + $password = $this->input->post('passworduser'); + if(empty($password)){ + $update_userlogin = array( + 'mu_nama_lengkap' => $this->input->post('namalengkapuser'), + 'mu_nama_user' => $this->input->post('namauser'), + 'mu_klinik_id' => $klinik, + 'mu_loket_id' => $loketdat, + 'mu_tipeuser_id' => $this->input->post('tipeuser'), + ); + }else{ + $update_userlogin = array( + 'mu_nama_lengkap' => $this->input->post('namalengkapuser'), + 'mu_nama_user' => $this->input->post('namauser'), + 'mu_password' => md5($this->input->post('passworduser')), + 'mu_klinik_id' => $klinik, + 'mu_loket_id' => $loketdat, + 'mu_tipeuser_id' => $this->input->post('tipeuser'), + ); + } + $id = $this->input->post('id'); + $this->db->where('mu_id', $id); + $this->db->update('master_user', $update_userlogin); + } + + function view($id) { + $this->db->where('mu_id', $id); + $query = $this->db->get('master_user'); + return $query; + } + + function delete($id) { + $this->db->where('mu_id', $id); + $this->db->delete('master_user'); + } +} +?> \ No newline at end of file diff --git a/application/third_party/PHPExcel/PHPExcel.php b/application/third_party/PHPExcel/PHPExcel.php new file mode 100644 index 0000000..b8dbe0e --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel.php @@ -0,0 +1,1153 @@ +hasMacros; + } + + /** + * Define if a workbook has macros + * + * @param boolean $hasMacros true|false + */ + public function setHasMacros($hasMacros = false) + { + $this->hasMacros = (bool) $hasMacros; + } + + /** + * Set the macros code + * + * @param string $MacrosCode string|null + */ + public function setMacrosCode($MacrosCode = null) + { + $this->macrosCode=$MacrosCode; + $this->setHasMacros(!is_null($MacrosCode)); + } + + /** + * Return the macros code + * + * @return string|null + */ + public function getMacrosCode() + { + return $this->macrosCode; + } + + /** + * Set the macros certificate + * + * @param string|null $Certificate + */ + public function setMacrosCertificate($Certificate = null) + { + $this->macrosCertificate=$Certificate; + } + + /** + * Is the project signed ? + * + * @return boolean true|false + */ + public function hasMacrosCertificate() + { + return !is_null($this->macrosCertificate); + } + + /** + * Return the macros certificate + * + * @return string|null + */ + public function getMacrosCertificate() + { + return $this->macrosCertificate; + } + + /** + * Remove all macros, certificate from spreadsheet + * + */ + public function discardMacros() + { + $this->hasMacros=false; + $this->macrosCode=null; + $this->macrosCertificate=null; + } + + /** + * set ribbon XML data + * + */ + public function setRibbonXMLData($Target = null, $XMLData = null) + { + if (!is_null($Target) && !is_null($XMLData)) { + $this->ribbonXMLData = array('target' => $Target, 'data' => $XMLData); + } else { + $this->ribbonXMLData = null; + } + } + + /** + * retrieve ribbon XML Data + * + * return string|null|array + */ + public function getRibbonXMLData($What = 'all') //we need some constants here... + { + $ReturnData = null; + $What = strtolower($What); + switch ($What){ + case 'all': + $ReturnData = $this->ribbonXMLData; + break; + case 'target': + case 'data': + if (is_array($this->ribbonXMLData) && array_key_exists($What, $this->ribbonXMLData)) { + $ReturnData = $this->ribbonXMLData[$What]; + } + break; + } + + return $ReturnData; + } + + /** + * store binaries ribbon objects (pictures) + * + */ + public function setRibbonBinObjects($BinObjectsNames = null, $BinObjectsData = null) + { + if (!is_null($BinObjectsNames) && !is_null($BinObjectsData)) { + $this->ribbonBinObjects = array('names' => $BinObjectsNames, 'data' => $BinObjectsData); + } else { + $this->ribbonBinObjects = null; + } + } + /** + * return the extension of a filename. Internal use for a array_map callback (php<5.3 don't like lambda function) + * + */ + private function getExtensionOnly($ThePath) + { + return pathinfo($ThePath, PATHINFO_EXTENSION); + } + + /** + * retrieve Binaries Ribbon Objects + * + */ + public function getRibbonBinObjects($What = 'all') + { + $ReturnData = null; + $What = strtolower($What); + switch($What) { + case 'all': + return $this->ribbonBinObjects; + break; + case 'names': + case 'data': + if (is_array($this->ribbonBinObjects) && array_key_exists($What, $this->ribbonBinObjects)) { + $ReturnData=$this->ribbonBinObjects[$What]; + } + break; + case 'types': + if (is_array($this->ribbonBinObjects) && + array_key_exists('data', $this->ribbonBinObjects) && is_array($this->ribbonBinObjects['data'])) { + $tmpTypes=array_keys($this->ribbonBinObjects['data']); + $ReturnData = array_unique(array_map(array($this, 'getExtensionOnly'), $tmpTypes)); + } else { + $ReturnData=array(); // the caller want an array... not null if empty + } + break; + } + return $ReturnData; + } + + /** + * This workbook have a custom UI ? + * + * @return boolean true|false + */ + public function hasRibbon() + { + return !is_null($this->ribbonXMLData); + } + + /** + * This workbook have additionnal object for the ribbon ? + * + * @return boolean true|false + */ + public function hasRibbonBinObjects() + { + return !is_null($this->ribbonBinObjects); + } + + /** + * Check if a sheet with a specified code name already exists + * + * @param string $pSheetCodeName Name of the worksheet to check + * @return boolean + */ + public function sheetCodeNameExists($pSheetCodeName) + { + return ($this->getSheetByCodeName($pSheetCodeName) !== null); + } + + /** + * Get sheet by code name. Warning : sheet don't have always a code name ! + * + * @param string $pName Sheet name + * @return PHPExcel_Worksheet + */ + public function getSheetByCodeName($pName = '') + { + $worksheetCount = count($this->workSheetCollection); + for ($i = 0; $i < $worksheetCount; ++$i) { + if ($this->workSheetCollection[$i]->getCodeName() == $pName) { + return $this->workSheetCollection[$i]; + } + } + + return null; + } + + /** + * Create a new PHPExcel with one Worksheet + */ + public function __construct() + { + $this->uniqueID = uniqid(); + $this->calculationEngine = new PHPExcel_Calculation($this); + + // Initialise worksheet collection and add one worksheet + $this->workSheetCollection = array(); + $this->workSheetCollection[] = new PHPExcel_Worksheet($this); + $this->activeSheetIndex = 0; + + // Create document properties + $this->properties = new PHPExcel_DocumentProperties(); + + // Create document security + $this->security = new PHPExcel_DocumentSecurity(); + + // Set named ranges + $this->namedRanges = array(); + + // Create the cellXf supervisor + $this->cellXfSupervisor = new PHPExcel_Style(true); + $this->cellXfSupervisor->bindParent($this); + + // Create the default style + $this->addCellXf(new PHPExcel_Style); + $this->addCellStyleXf(new PHPExcel_Style); + } + + /** + * Code to execute when this worksheet is unset() + * + */ + public function __destruct() + { + $this->calculationEngine = null; + $this->disconnectWorksheets(); + } + + /** + * Disconnect all worksheets from this PHPExcel workbook object, + * typically so that the PHPExcel object can be unset + * + */ + public function disconnectWorksheets() + { + $worksheet = null; + foreach ($this->workSheetCollection as $k => &$worksheet) { + $worksheet->disconnectCells(); + $this->workSheetCollection[$k] = null; + } + unset($worksheet); + $this->workSheetCollection = array(); + } + + /** + * Return the calculation engine for this worksheet + * + * @return PHPExcel_Calculation + */ + public function getCalculationEngine() + { + return $this->calculationEngine; + } // function getCellCacheController() + + /** + * Get properties + * + * @return PHPExcel_DocumentProperties + */ + public function getProperties() + { + return $this->properties; + } + + /** + * Set properties + * + * @param PHPExcel_DocumentProperties $pValue + */ + public function setProperties(PHPExcel_DocumentProperties $pValue) + { + $this->properties = $pValue; + } + + /** + * Get security + * + * @return PHPExcel_DocumentSecurity + */ + public function getSecurity() + { + return $this->security; + } + + /** + * Set security + * + * @param PHPExcel_DocumentSecurity $pValue + */ + public function setSecurity(PHPExcel_DocumentSecurity $pValue) + { + $this->security = $pValue; + } + + /** + * Get active sheet + * + * @return PHPExcel_Worksheet + * + * @throws PHPExcel_Exception + */ + public function getActiveSheet() + { + return $this->getSheet($this->activeSheetIndex); + } + + /** + * Create sheet and add it to this workbook + * + * @param int|null $iSheetIndex Index where sheet should go (0,1,..., or null for last) + * @return PHPExcel_Worksheet + * @throws PHPExcel_Exception + */ + public function createSheet($iSheetIndex = null) + { + $newSheet = new PHPExcel_Worksheet($this); + $this->addSheet($newSheet, $iSheetIndex); + return $newSheet; + } + + /** + * Check if a sheet with a specified name already exists + * + * @param string $pSheetName Name of the worksheet to check + * @return boolean + */ + public function sheetNameExists($pSheetName) + { + return ($this->getSheetByName($pSheetName) !== null); + } + + /** + * Add sheet + * + * @param PHPExcel_Worksheet $pSheet + * @param int|null $iSheetIndex Index where sheet should go (0,1,..., or null for last) + * @return PHPExcel_Worksheet + * @throws PHPExcel_Exception + */ + public function addSheet(PHPExcel_Worksheet $pSheet, $iSheetIndex = null) + { + if ($this->sheetNameExists($pSheet->getTitle())) { + throw new PHPExcel_Exception( + "Workbook already contains a worksheet named '{$pSheet->getTitle()}'. Rename this worksheet first." + ); + } + + if ($iSheetIndex === null) { + if ($this->activeSheetIndex < 0) { + $this->activeSheetIndex = 0; + } + $this->workSheetCollection[] = $pSheet; + } else { + // Insert the sheet at the requested index + array_splice( + $this->workSheetCollection, + $iSheetIndex, + 0, + array($pSheet) + ); + + // Adjust active sheet index if necessary + if ($this->activeSheetIndex >= $iSheetIndex) { + ++$this->activeSheetIndex; + } + } + + if ($pSheet->getParent() === null) { + $pSheet->rebindParent($this); + } + + return $pSheet; + } + + /** + * Remove sheet by index + * + * @param int $pIndex Active sheet index + * @throws PHPExcel_Exception + */ + public function removeSheetByIndex($pIndex = 0) + { + + $numSheets = count($this->workSheetCollection); + if ($pIndex > $numSheets - 1) { + throw new PHPExcel_Exception( + "You tried to remove a sheet by the out of bounds index: {$pIndex}. The actual number of sheets is {$numSheets}." + ); + } else { + array_splice($this->workSheetCollection, $pIndex, 1); + } + // Adjust active sheet index if necessary + if (($this->activeSheetIndex >= $pIndex) && + ($pIndex > count($this->workSheetCollection) - 1)) { + --$this->activeSheetIndex; + } + + } + + /** + * Get sheet by index + * + * @param int $pIndex Sheet index + * @return PHPExcel_Worksheet + * @throws PHPExcel_Exception + */ + public function getSheet($pIndex = 0) + { + if (!isset($this->workSheetCollection[$pIndex])) { + $numSheets = $this->getSheetCount(); + throw new PHPExcel_Exception( + "Your requested sheet index: {$pIndex} is out of bounds. The actual number of sheets is {$numSheets}." + ); + } + + return $this->workSheetCollection[$pIndex]; + } + + /** + * Get all sheets + * + * @return PHPExcel_Worksheet[] + */ + public function getAllSheets() + { + return $this->workSheetCollection; + } + + /** + * Get sheet by name + * + * @param string $pName Sheet name + * @return PHPExcel_Worksheet + */ + public function getSheetByName($pName = '') + { + $worksheetCount = count($this->workSheetCollection); + for ($i = 0; $i < $worksheetCount; ++$i) { + if ($this->workSheetCollection[$i]->getTitle() === $pName) { + return $this->workSheetCollection[$i]; + } + } + + return null; + } + + /** + * Get index for sheet + * + * @param PHPExcel_Worksheet $pSheet + * @return int Sheet index + * @throws PHPExcel_Exception + */ + public function getIndex(PHPExcel_Worksheet $pSheet) + { + foreach ($this->workSheetCollection as $key => $value) { + if ($value->getHashCode() == $pSheet->getHashCode()) { + return $key; + } + } + + throw new PHPExcel_Exception("Sheet does not exist."); + } + + /** + * Set index for sheet by sheet name. + * + * @param string $sheetName Sheet name to modify index for + * @param int $newIndex New index for the sheet + * @return int New sheet index + * @throws PHPExcel_Exception + */ + public function setIndexByName($sheetName, $newIndex) + { + $oldIndex = $this->getIndex($this->getSheetByName($sheetName)); + $pSheet = array_splice( + $this->workSheetCollection, + $oldIndex, + 1 + ); + array_splice( + $this->workSheetCollection, + $newIndex, + 0, + $pSheet + ); + return $newIndex; + } + + /** + * Get sheet count + * + * @return int + */ + public function getSheetCount() + { + return count($this->workSheetCollection); + } + + /** + * Get active sheet index + * + * @return int Active sheet index + */ + public function getActiveSheetIndex() + { + return $this->activeSheetIndex; + } + + /** + * Set active sheet index + * + * @param int $pIndex Active sheet index + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function setActiveSheetIndex($pIndex = 0) + { + $numSheets = count($this->workSheetCollection); + + if ($pIndex > $numSheets - 1) { + throw new PHPExcel_Exception( + "You tried to set a sheet active by the out of bounds index: {$pIndex}. The actual number of sheets is {$numSheets}." + ); + } else { + $this->activeSheetIndex = $pIndex; + } + return $this->getActiveSheet(); + } + + /** + * Set active sheet index by name + * + * @param string $pValue Sheet title + * @return PHPExcel_Worksheet + * @throws PHPExcel_Exception + */ + public function setActiveSheetIndexByName($pValue = '') + { + if (($worksheet = $this->getSheetByName($pValue)) instanceof PHPExcel_Worksheet) { + $this->setActiveSheetIndex($this->getIndex($worksheet)); + return $worksheet; + } + + throw new PHPExcel_Exception('Workbook does not contain sheet:' . $pValue); + } + + /** + * Get sheet names + * + * @return string[] + */ + public function getSheetNames() + { + $returnValue = array(); + $worksheetCount = $this->getSheetCount(); + for ($i = 0; $i < $worksheetCount; ++$i) { + $returnValue[] = $this->getSheet($i)->getTitle(); + } + + return $returnValue; + } + + /** + * Add external sheet + * + * @param PHPExcel_Worksheet $pSheet External sheet to add + * @param int|null $iSheetIndex Index where sheet should go (0,1,..., or null for last) + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function addExternalSheet(PHPExcel_Worksheet $pSheet, $iSheetIndex = null) + { + if ($this->sheetNameExists($pSheet->getTitle())) { + throw new PHPExcel_Exception("Workbook already contains a worksheet named '{$pSheet->getTitle()}'. Rename the external sheet first."); + } + + // count how many cellXfs there are in this workbook currently, we will need this below + $countCellXfs = count($this->cellXfCollection); + + // copy all the shared cellXfs from the external workbook and append them to the current + foreach ($pSheet->getParent()->getCellXfCollection() as $cellXf) { + $this->addCellXf(clone $cellXf); + } + + // move sheet to this workbook + $pSheet->rebindParent($this); + + // update the cellXfs + foreach ($pSheet->getCellCollection(false) as $cellID) { + $cell = $pSheet->getCell($cellID); + $cell->setXfIndex($cell->getXfIndex() + $countCellXfs); + } + + return $this->addSheet($pSheet, $iSheetIndex); + } + + /** + * Get named ranges + * + * @return PHPExcel_NamedRange[] + */ + public function getNamedRanges() + { + return $this->namedRanges; + } + + /** + * Add named range + * + * @param PHPExcel_NamedRange $namedRange + * @return boolean + */ + public function addNamedRange(PHPExcel_NamedRange $namedRange) + { + if ($namedRange->getScope() == null) { + // global scope + $this->namedRanges[$namedRange->getName()] = $namedRange; + } else { + // local scope + $this->namedRanges[$namedRange->getScope()->getTitle().'!'.$namedRange->getName()] = $namedRange; + } + return true; + } + + /** + * Get named range + * + * @param string $namedRange + * @param PHPExcel_Worksheet|null $pSheet Scope. Use null for global scope + * @return PHPExcel_NamedRange|null + */ + public function getNamedRange($namedRange, PHPExcel_Worksheet $pSheet = null) + { + $returnValue = null; + + if ($namedRange != '' && ($namedRange !== null)) { + // first look for global defined name + if (isset($this->namedRanges[$namedRange])) { + $returnValue = $this->namedRanges[$namedRange]; + } + + // then look for local defined name (has priority over global defined name if both names exist) + if (($pSheet !== null) && isset($this->namedRanges[$pSheet->getTitle() . '!' . $namedRange])) { + $returnValue = $this->namedRanges[$pSheet->getTitle() . '!' . $namedRange]; + } + } + + return $returnValue; + } + + /** + * Remove named range + * + * @param string $namedRange + * @param PHPExcel_Worksheet|null $pSheet Scope: use null for global scope. + * @return PHPExcel + */ + public function removeNamedRange($namedRange, PHPExcel_Worksheet $pSheet = null) + { + if ($pSheet === null) { + if (isset($this->namedRanges[$namedRange])) { + unset($this->namedRanges[$namedRange]); + } + } else { + if (isset($this->namedRanges[$pSheet->getTitle() . '!' . $namedRange])) { + unset($this->namedRanges[$pSheet->getTitle() . '!' . $namedRange]); + } + } + return $this; + } + + /** + * Get worksheet iterator + * + * @return PHPExcel_WorksheetIterator + */ + public function getWorksheetIterator() + { + return new PHPExcel_WorksheetIterator($this); + } + + /** + * Copy workbook (!= clone!) + * + * @return PHPExcel + */ + public function copy() + { + $copied = clone $this; + + $worksheetCount = count($this->workSheetCollection); + for ($i = 0; $i < $worksheetCount; ++$i) { + $this->workSheetCollection[$i] = $this->workSheetCollection[$i]->copy(); + $this->workSheetCollection[$i]->rebindParent($this); + } + + return $copied; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + foreach ($this as $key => $val) { + if (is_object($val) || (is_array($val))) { + $this->{$key} = unserialize(serialize($val)); + } + } + } + + /** + * Get the workbook collection of cellXfs + * + * @return PHPExcel_Style[] + */ + public function getCellXfCollection() + { + return $this->cellXfCollection; + } + + /** + * Get cellXf by index + * + * @param int $pIndex + * @return PHPExcel_Style + */ + public function getCellXfByIndex($pIndex = 0) + { + return $this->cellXfCollection[$pIndex]; + } + + /** + * Get cellXf by hash code + * + * @param string $pValue + * @return PHPExcel_Style|boolean False if no match found + */ + public function getCellXfByHashCode($pValue = '') + { + foreach ($this->cellXfCollection as $cellXf) { + if ($cellXf->getHashCode() == $pValue) { + return $cellXf; + } + } + return false; + } + + /** + * Check if style exists in style collection + * + * @param PHPExcel_Style $pCellStyle + * @return boolean + */ + public function cellXfExists($pCellStyle = null) + { + return in_array($pCellStyle, $this->cellXfCollection, true); + } + + /** + * Get default style + * + * @return PHPExcel_Style + * @throws PHPExcel_Exception + */ + public function getDefaultStyle() + { + if (isset($this->cellXfCollection[0])) { + return $this->cellXfCollection[0]; + } + throw new PHPExcel_Exception('No default style found for this workbook'); + } + + /** + * Add a cellXf to the workbook + * + * @param PHPExcel_Style $style + */ + public function addCellXf(PHPExcel_Style $style) + { + $this->cellXfCollection[] = $style; + $style->setIndex(count($this->cellXfCollection) - 1); + } + + /** + * Remove cellXf by index. It is ensured that all cells get their xf index updated. + * + * @param integer $pIndex Index to cellXf + * @throws PHPExcel_Exception + */ + public function removeCellXfByIndex($pIndex = 0) + { + if ($pIndex > count($this->cellXfCollection) - 1) { + throw new PHPExcel_Exception("CellXf index is out of bounds."); + } else { + // first remove the cellXf + array_splice($this->cellXfCollection, $pIndex, 1); + + // then update cellXf indexes for cells + foreach ($this->workSheetCollection as $worksheet) { + foreach ($worksheet->getCellCollection(false) as $cellID) { + $cell = $worksheet->getCell($cellID); + $xfIndex = $cell->getXfIndex(); + if ($xfIndex > $pIndex) { + // decrease xf index by 1 + $cell->setXfIndex($xfIndex - 1); + } elseif ($xfIndex == $pIndex) { + // set to default xf index 0 + $cell->setXfIndex(0); + } + } + } + } + } + + /** + * Get the cellXf supervisor + * + * @return PHPExcel_Style + */ + public function getCellXfSupervisor() + { + return $this->cellXfSupervisor; + } + + /** + * Get the workbook collection of cellStyleXfs + * + * @return PHPExcel_Style[] + */ + public function getCellStyleXfCollection() + { + return $this->cellStyleXfCollection; + } + + /** + * Get cellStyleXf by index + * + * @param integer $pIndex Index to cellXf + * @return PHPExcel_Style + */ + public function getCellStyleXfByIndex($pIndex = 0) + { + return $this->cellStyleXfCollection[$pIndex]; + } + + /** + * Get cellStyleXf by hash code + * + * @param string $pValue + * @return PHPExcel_Style|boolean False if no match found + */ + public function getCellStyleXfByHashCode($pValue = '') + { + foreach ($this->cellStyleXfCollection as $cellStyleXf) { + if ($cellStyleXf->getHashCode() == $pValue) { + return $cellStyleXf; + } + } + return false; + } + + /** + * Add a cellStyleXf to the workbook + * + * @param PHPExcel_Style $pStyle + */ + public function addCellStyleXf(PHPExcel_Style $pStyle) + { + $this->cellStyleXfCollection[] = $pStyle; + $pStyle->setIndex(count($this->cellStyleXfCollection) - 1); + } + + /** + * Remove cellStyleXf by index + * + * @param integer $pIndex Index to cellXf + * @throws PHPExcel_Exception + */ + public function removeCellStyleXfByIndex($pIndex = 0) + { + if ($pIndex > count($this->cellStyleXfCollection) - 1) { + throw new PHPExcel_Exception("CellStyleXf index is out of bounds."); + } else { + array_splice($this->cellStyleXfCollection, $pIndex, 1); + } + } + + /** + * Eliminate all unneeded cellXf and afterwards update the xfIndex for all cells + * and columns in the workbook + */ + public function garbageCollect() + { + // how many references are there to each cellXf ? + $countReferencesCellXf = array(); + foreach ($this->cellXfCollection as $index => $cellXf) { + $countReferencesCellXf[$index] = 0; + } + + foreach ($this->getWorksheetIterator() as $sheet) { + // from cells + foreach ($sheet->getCellCollection(false) as $cellID) { + $cell = $sheet->getCell($cellID); + ++$countReferencesCellXf[$cell->getXfIndex()]; + } + + // from row dimensions + foreach ($sheet->getRowDimensions() as $rowDimension) { + if ($rowDimension->getXfIndex() !== null) { + ++$countReferencesCellXf[$rowDimension->getXfIndex()]; + } + } + + // from column dimensions + foreach ($sheet->getColumnDimensions() as $columnDimension) { + ++$countReferencesCellXf[$columnDimension->getXfIndex()]; + } + } + + // remove cellXfs without references and create mapping so we can update xfIndex + // for all cells and columns + $countNeededCellXfs = 0; + $map = array(); + foreach ($this->cellXfCollection as $index => $cellXf) { + if ($countReferencesCellXf[$index] > 0 || $index == 0) { // we must never remove the first cellXf + ++$countNeededCellXfs; + } else { + unset($this->cellXfCollection[$index]); + } + $map[$index] = $countNeededCellXfs - 1; + } + $this->cellXfCollection = array_values($this->cellXfCollection); + + // update the index for all cellXfs + foreach ($this->cellXfCollection as $i => $cellXf) { + $cellXf->setIndex($i); + } + + // make sure there is always at least one cellXf (there should be) + if (empty($this->cellXfCollection)) { + $this->cellXfCollection[] = new PHPExcel_Style(); + } + + // update the xfIndex for all cells, row dimensions, column dimensions + foreach ($this->getWorksheetIterator() as $sheet) { + // for all cells + foreach ($sheet->getCellCollection(false) as $cellID) { + $cell = $sheet->getCell($cellID); + $cell->setXfIndex($map[$cell->getXfIndex()]); + } + + // for all row dimensions + foreach ($sheet->getRowDimensions() as $rowDimension) { + if ($rowDimension->getXfIndex() !== null) { + $rowDimension->setXfIndex($map[$rowDimension->getXfIndex()]); + } + } + + // for all column dimensions + foreach ($sheet->getColumnDimensions() as $columnDimension) { + $columnDimension->setXfIndex($map[$columnDimension->getXfIndex()]); + } + + // also do garbage collection for all the sheets + $sheet->garbageCollect(); + } + } + + /** + * Return the unique ID value assigned to this spreadsheet workbook + * + * @return string + */ + public function getID() + { + return $this->uniqueID; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Autoloader.php b/application/third_party/PHPExcel/PHPExcel/Autoloader.php new file mode 100644 index 0000000..c3b95a2 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Autoloader.php @@ -0,0 +1,81 @@ += 0) { + return spl_autoload_register(array('PHPExcel_Autoloader', 'load'), true, true); + } else { + return spl_autoload_register(array('PHPExcel_Autoloader', 'load')); + } + } + + /** + * Autoload a class identified by name + * + * @param string $pClassName Name of the object to load + */ + public static function load($pClassName) + { + if ((class_exists($pClassName, false)) || (strpos($pClassName, 'PHPExcel') !== 0)) { + // Either already loaded, or not a PHPExcel class request + return false; + } + + $pClassFilePath = PHPEXCEL_ROOT . + str_replace('_', DIRECTORY_SEPARATOR, $pClassName) . + '.php'; + + if ((file_exists($pClassFilePath) === false) || (is_readable($pClassFilePath) === false)) { + // Can't load + return false; + } + + require($pClassFilePath); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/APC.php b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/APC.php new file mode 100644 index 0000000..c74b07f --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/APC.php @@ -0,0 +1,290 @@ +currentCellIsDirty && !empty($this->currentObjectID)) { + $this->currentObject->detach(); + + if (!apc_store( + $this->cachePrefix . $this->currentObjectID . '.cache', + serialize($this->currentObject), + $this->cacheTime + )) { + $this->__destruct(); + throw new PHPExcel_Exception('Failed to store cell ' . $this->currentObjectID . ' in APC'); + } + $this->currentCellIsDirty = false; + } + $this->currentObjectID = $this->currentObject = null; + } + + /** + * Add or Update a cell in cache identified by coordinate address + * + * @access public + * @param string $pCoord Coordinate address of the cell to update + * @param PHPExcel_Cell $cell Cell to update + * @return PHPExcel_Cell + * @throws PHPExcel_Exception + */ + public function addCacheData($pCoord, PHPExcel_Cell $cell) + { + if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) { + $this->storeData(); + } + $this->cellCache[$pCoord] = true; + + $this->currentObjectID = $pCoord; + $this->currentObject = $cell; + $this->currentCellIsDirty = true; + + return $cell; + } + + /** + * Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell? + * + * @access public + * @param string $pCoord Coordinate address of the cell to check + * @throws PHPExcel_Exception + * @return boolean + */ + public function isDataSet($pCoord) + { + // Check if the requested entry is the current object, or exists in the cache + if (parent::isDataSet($pCoord)) { + if ($this->currentObjectID == $pCoord) { + return true; + } + // Check if the requested entry still exists in apc + $success = apc_fetch($this->cachePrefix.$pCoord.'.cache'); + if ($success === false) { + // Entry no longer exists in APC, so clear it from the cache array + parent::deleteCacheData($pCoord); + throw new PHPExcel_Exception('Cell entry '.$pCoord.' no longer exists in APC cache'); + } + return true; + } + return false; + } + + /** + * Get cell at a specific coordinate + * + * @access public + * @param string $pCoord Coordinate of the cell + * @throws PHPExcel_Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) + { + if ($pCoord === $this->currentObjectID) { + return $this->currentObject; + } + $this->storeData(); + + // Check if the entry that has been requested actually exists + if (parent::isDataSet($pCoord)) { + $obj = apc_fetch($this->cachePrefix . $pCoord . '.cache'); + if ($obj === false) { + // Entry no longer exists in APC, so clear it from the cache array + parent::deleteCacheData($pCoord); + throw new PHPExcel_Exception('Cell entry '.$pCoord.' no longer exists in APC cache'); + } + } else { + // Return null if requested entry doesn't exist in cache + return null; + } + + // Set current entry to the requested entry + $this->currentObjectID = $pCoord; + $this->currentObject = unserialize($obj); + // Re-attach this as the cell's parent + $this->currentObject->attach($this); + + // Return requested entry + return $this->currentObject; + } + + /** + * Get a list of all cell addresses currently held in cache + * + * @return string[] + */ + public function getCellList() + { + if ($this->currentObjectID !== null) { + $this->storeData(); + } + + return parent::getCellList(); + } + + /** + * Delete a cell in cache identified by coordinate address + * + * @access public + * @param string $pCoord Coordinate address of the cell to delete + * @throws PHPExcel_Exception + */ + public function deleteCacheData($pCoord) + { + // Delete the entry from APC + apc_delete($this->cachePrefix.$pCoord.'.cache'); + + // Delete the entry from our cell address array + parent::deleteCacheData($pCoord); + } + + /** + * Clone the cell collection + * + * @access public + * @param PHPExcel_Worksheet $parent The new worksheet + * @throws PHPExcel_Exception + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) + { + parent::copyCellCollection($parent); + // Get a new id for the new file name + $baseUnique = $this->getUniqueID(); + $newCachePrefix = substr(md5($baseUnique), 0, 8) . '.'; + $cacheList = $this->getCellList(); + foreach ($cacheList as $cellID) { + if ($cellID != $this->currentObjectID) { + $obj = apc_fetch($this->cachePrefix . $cellID . '.cache'); + if ($obj === false) { + // Entry no longer exists in APC, so clear it from the cache array + parent::deleteCacheData($cellID); + throw new PHPExcel_Exception('Cell entry ' . $cellID . ' no longer exists in APC'); + } + if (!apc_store($newCachePrefix . $cellID . '.cache', $obj, $this->cacheTime)) { + $this->__destruct(); + throw new PHPExcel_Exception('Failed to store cell ' . $cellID . ' in APC'); + } + } + } + $this->cachePrefix = $newCachePrefix; + } + + /** + * Clear the cell collection and disconnect from our parent + * + * @return void + */ + public function unsetWorksheetCells() + { + if ($this->currentObject !== null) { + $this->currentObject->detach(); + $this->currentObject = $this->currentObjectID = null; + } + + // Flush the APC cache + $this->__destruct(); + + $this->cellCache = array(); + + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->parent = null; + } + + /** + * Initialise this new cell collection + * + * @param PHPExcel_Worksheet $parent The worksheet for this cell collection + * @param array of mixed $arguments Additional initialisation arguments + */ + public function __construct(PHPExcel_Worksheet $parent, $arguments) + { + $cacheTime = (isset($arguments['cacheTime'])) ? $arguments['cacheTime'] : 600; + + if ($this->cachePrefix === null) { + $baseUnique = $this->getUniqueID(); + $this->cachePrefix = substr(md5($baseUnique), 0, 8) . '.'; + $this->cacheTime = $cacheTime; + + parent::__construct($parent); + } + } + + /** + * Destroy this cell collection + */ + public function __destruct() + { + $cacheList = $this->getCellList(); + foreach ($cacheList as $cellID) { + apc_delete($this->cachePrefix . $cellID . '.cache'); + } + } + + /** + * Identify whether the caching method is currently available + * Some methods are dependent on the availability of certain extensions being enabled in the PHP build + * + * @return boolean + */ + public static function cacheMethodIsAvailable() + { + if (!function_exists('apc_store')) { + return false; + } + if (apc_sma_info() === false) { + return false; + } + + return true; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/CacheBase.php b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/CacheBase.php new file mode 100644 index 0000000..9a12ec8 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/CacheBase.php @@ -0,0 +1,368 @@ +parent = $parent; + } + + /** + * Return the parent worksheet for this cell collection + * + * @return PHPExcel_Worksheet + */ + public function getParent() + { + return $this->parent; + } + + /** + * Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell? + * + * @param string $pCoord Coordinate address of the cell to check + * @return boolean + */ + public function isDataSet($pCoord) + { + if ($pCoord === $this->currentObjectID) { + return true; + } + // Check if the requested entry exists in the cache + return isset($this->cellCache[$pCoord]); + } + + /** + * Move a cell object from one address to another + * + * @param string $fromAddress Current address of the cell to move + * @param string $toAddress Destination address of the cell to move + * @return boolean + */ + public function moveCell($fromAddress, $toAddress) + { + if ($fromAddress === $this->currentObjectID) { + $this->currentObjectID = $toAddress; + } + $this->currentCellIsDirty = true; + if (isset($this->cellCache[$fromAddress])) { + $this->cellCache[$toAddress] = &$this->cellCache[$fromAddress]; + unset($this->cellCache[$fromAddress]); + } + + return true; + } + + /** + * Add or Update a cell in cache + * + * @param PHPExcel_Cell $cell Cell to update + * @return PHPExcel_Cell + * @throws PHPExcel_Exception + */ + public function updateCacheData(PHPExcel_Cell $cell) + { + return $this->addCacheData($cell->getCoordinate(), $cell); + } + + /** + * Delete a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to delete + * @throws PHPExcel_Exception + */ + public function deleteCacheData($pCoord) + { + if ($pCoord === $this->currentObjectID && !is_null($this->currentObject)) { + $this->currentObject->detach(); + $this->currentObjectID = $this->currentObject = null; + } + + if (is_object($this->cellCache[$pCoord])) { + $this->cellCache[$pCoord]->detach(); + unset($this->cellCache[$pCoord]); + } + $this->currentCellIsDirty = false; + } + + /** + * Get a list of all cell addresses currently held in cache + * + * @return string[] + */ + public function getCellList() + { + return array_keys($this->cellCache); + } + + /** + * Sort the list of all cell addresses currently held in cache by row and column + * + * @return string[] + */ + public function getSortedCellList() + { + $sortKeys = array(); + foreach ($this->getCellList() as $coord) { + sscanf($coord, '%[A-Z]%d', $column, $row); + $sortKeys[sprintf('%09d%3s', $row, $column)] = $coord; + } + ksort($sortKeys); + + return array_values($sortKeys); + } + + /** + * Get highest worksheet column and highest row that have cell records + * + * @return array Highest column name and highest row number + */ + public function getHighestRowAndColumn() + { + // Lookup highest column and highest row + $col = array('A' => '1A'); + $row = array(1); + foreach ($this->getCellList() as $coord) { + sscanf($coord, '%[A-Z]%d', $c, $r); + $row[$r] = $r; + $col[$c] = strlen($c).$c; + } + if (!empty($row)) { + // Determine highest column and row + $highestRow = max($row); + $highestColumn = substr(max($col), 1); + } + + return array( + 'row' => $highestRow, + 'column' => $highestColumn + ); + } + + /** + * Return the cell address of the currently active cell object + * + * @return string + */ + public function getCurrentAddress() + { + return $this->currentObjectID; + } + + /** + * Return the column address of the currently active cell object + * + * @return string + */ + public function getCurrentColumn() + { + sscanf($this->currentObjectID, '%[A-Z]%d', $column, $row); + return $column; + } + + /** + * Return the row address of the currently active cell object + * + * @return integer + */ + public function getCurrentRow() + { + sscanf($this->currentObjectID, '%[A-Z]%d', $column, $row); + return (integer) $row; + } + + /** + * Get highest worksheet column + * + * @param string $row Return the highest column for the specified row, + * or the highest column of any row if no row number is passed + * @return string Highest column name + */ + public function getHighestColumn($row = null) + { + if ($row == null) { + $colRow = $this->getHighestRowAndColumn(); + return $colRow['column']; + } + + $columnList = array(1); + foreach ($this->getCellList() as $coord) { + sscanf($coord, '%[A-Z]%d', $c, $r); + if ($r != $row) { + continue; + } + $columnList[] = PHPExcel_Cell::columnIndexFromString($c); + } + return PHPExcel_Cell::stringFromColumnIndex(max($columnList) - 1); + } + + /** + * Get highest worksheet row + * + * @param string $column Return the highest row for the specified column, + * or the highest row of any column if no column letter is passed + * @return int Highest row number + */ + public function getHighestRow($column = null) + { + if ($column == null) { + $colRow = $this->getHighestRowAndColumn(); + return $colRow['row']; + } + + $rowList = array(0); + foreach ($this->getCellList() as $coord) { + sscanf($coord, '%[A-Z]%d', $c, $r); + if ($c != $column) { + continue; + } + $rowList[] = $r; + } + + return max($rowList); + } + + /** + * Generate a unique ID for cache referencing + * + * @return string Unique Reference + */ + protected function getUniqueID() + { + if (function_exists('posix_getpid')) { + $baseUnique = posix_getpid(); + } else { + $baseUnique = mt_rand(); + } + return uniqid($baseUnique, true); + } + + /** + * Clone the cell collection + * + * @param PHPExcel_Worksheet $parent The new worksheet + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) + { + $this->currentCellIsDirty; + $this->storeData(); + + $this->parent = $parent; + if (($this->currentObject !== null) && (is_object($this->currentObject))) { + $this->currentObject->attach($this); + } + } // function copyCellCollection() + + /** + * Remove a row, deleting all cells in that row + * + * @param string $row Row number to remove + * @return void + */ + public function removeRow($row) + { + foreach ($this->getCellList() as $coord) { + sscanf($coord, '%[A-Z]%d', $c, $r); + if ($r == $row) { + $this->deleteCacheData($coord); + } + } + } + + /** + * Remove a column, deleting all cells in that column + * + * @param string $column Column ID to remove + * @return void + */ + public function removeColumn($column) + { + foreach ($this->getCellList() as $coord) { + sscanf($coord, '%[A-Z]%d', $c, $r); + if ($c == $column) { + $this->deleteCacheData($coord); + } + } + } + + /** + * Identify whether the caching method is currently available + * Some methods are dependent on the availability of certain extensions being enabled in the PHP build + * + * @return boolean + */ + public static function cacheMethodIsAvailable() + { + return true; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/DiscISAM.php b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/DiscISAM.php new file mode 100644 index 0000000..13bc033 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/DiscISAM.php @@ -0,0 +1,208 @@ +currentCellIsDirty && !empty($this->currentObjectID)) { + $this->currentObject->detach(); + + fseek($this->fileHandle, 0, SEEK_END); + + $this->cellCache[$this->currentObjectID] = array( + 'ptr' => ftell($this->fileHandle), + 'sz' => fwrite($this->fileHandle, serialize($this->currentObject)) + ); + $this->currentCellIsDirty = false; + } + $this->currentObjectID = $this->currentObject = null; + } + + /** + * Add or Update a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to update + * @param PHPExcel_Cell $cell Cell to update + * @return PHPExcel_Cell + * @throws PHPExcel_Exception + */ + public function addCacheData($pCoord, PHPExcel_Cell $cell) + { + if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) { + $this->storeData(); + } + + $this->currentObjectID = $pCoord; + $this->currentObject = $cell; + $this->currentCellIsDirty = true; + + return $cell; + } + + /** + * Get cell at a specific coordinate + * + * @param string $pCoord Coordinate of the cell + * @throws PHPExcel_Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) + { + if ($pCoord === $this->currentObjectID) { + return $this->currentObject; + } + $this->storeData(); + + // Check if the entry that has been requested actually exists + if (!isset($this->cellCache[$pCoord])) { + // Return null if requested entry doesn't exist in cache + return null; + } + + // Set current entry to the requested entry + $this->currentObjectID = $pCoord; + fseek($this->fileHandle, $this->cellCache[$pCoord]['ptr']); + $this->currentObject = unserialize(fread($this->fileHandle, $this->cellCache[$pCoord]['sz'])); + // Re-attach this as the cell's parent + $this->currentObject->attach($this); + + // Return requested entry + return $this->currentObject; + } + + /** + * Get a list of all cell addresses currently held in cache + * + * @return string[] + */ + public function getCellList() + { + if ($this->currentObjectID !== null) { + $this->storeData(); + } + + return parent::getCellList(); + } + + /** + * Clone the cell collection + * + * @param PHPExcel_Worksheet $parent The new worksheet + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) + { + parent::copyCellCollection($parent); + // Get a new id for the new file name + $baseUnique = $this->getUniqueID(); + $newFileName = $this->cacheDirectory.'/PHPExcel.'.$baseUnique.'.cache'; + // Copy the existing cell cache file + copy($this->fileName, $newFileName); + $this->fileName = $newFileName; + // Open the copied cell cache file + $this->fileHandle = fopen($this->fileName, 'a+'); + } + + /** + * Clear the cell collection and disconnect from our parent + * + */ + public function unsetWorksheetCells() + { + if (!is_null($this->currentObject)) { + $this->currentObject->detach(); + $this->currentObject = $this->currentObjectID = null; + } + $this->cellCache = array(); + + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->parent = null; + + // Close down the temporary cache file + $this->__destruct(); + } + + /** + * Initialise this new cell collection + * + * @param PHPExcel_Worksheet $parent The worksheet for this cell collection + * @param array of mixed $arguments Additional initialisation arguments + */ + public function __construct(PHPExcel_Worksheet $parent, $arguments) + { + $this->cacheDirectory = ((isset($arguments['dir'])) && ($arguments['dir'] !== null)) + ? $arguments['dir'] + : PHPExcel_Shared_File::sys_get_temp_dir(); + + parent::__construct($parent); + if (is_null($this->fileHandle)) { + $baseUnique = $this->getUniqueID(); + $this->fileName = $this->cacheDirectory.'/PHPExcel.'.$baseUnique.'.cache'; + $this->fileHandle = fopen($this->fileName, 'a+'); + } + } + + /** + * Destroy this cell collection + */ + public function __destruct() + { + if (!is_null($this->fileHandle)) { + fclose($this->fileHandle); + unlink($this->fileName); + } + $this->fileHandle = null; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/ICache.php b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/ICache.php new file mode 100644 index 0000000..aafef6e --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/ICache.php @@ -0,0 +1,103 @@ +currentCellIsDirty && !empty($this->currentObjectID)) { + $this->currentObject->detach(); + + $this->cellCache[$this->currentObjectID] = igbinary_serialize($this->currentObject); + $this->currentCellIsDirty = false; + } + $this->currentObjectID = $this->currentObject = null; + } // function _storeData() + + + /** + * Add or Update a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to update + * @param PHPExcel_Cell $cell Cell to update + * @return PHPExcel_Cell + * @throws PHPExcel_Exception + */ + public function addCacheData($pCoord, PHPExcel_Cell $cell) + { + if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) { + $this->storeData(); + } + + $this->currentObjectID = $pCoord; + $this->currentObject = $cell; + $this->currentCellIsDirty = true; + + return $cell; + } // function addCacheData() + + + /** + * Get cell at a specific coordinate + * + * @param string $pCoord Coordinate of the cell + * @throws PHPExcel_Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) + { + if ($pCoord === $this->currentObjectID) { + return $this->currentObject; + } + $this->storeData(); + + // Check if the entry that has been requested actually exists + if (!isset($this->cellCache[$pCoord])) { + // Return null if requested entry doesn't exist in cache + return null; + } + + // Set current entry to the requested entry + $this->currentObjectID = $pCoord; + $this->currentObject = igbinary_unserialize($this->cellCache[$pCoord]); + // Re-attach this as the cell's parent + $this->currentObject->attach($this); + + // Return requested entry + return $this->currentObject; + } // function getCacheData() + + + /** + * Get a list of all cell addresses currently held in cache + * + * @return string[] + */ + public function getCellList() + { + if ($this->currentObjectID !== null) { + $this->storeData(); + } + + return parent::getCellList(); + } + + + /** + * Clear the cell collection and disconnect from our parent + * + * @return void + */ + public function unsetWorksheetCells() + { + if (!is_null($this->currentObject)) { + $this->currentObject->detach(); + $this->currentObject = $this->currentObjectID = null; + } + $this->cellCache = array(); + + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->parent = null; + } // function unsetWorksheetCells() + + + /** + * Identify whether the caching method is currently available + * Some methods are dependent on the availability of certain extensions being enabled in the PHP build + * + * @return boolean + */ + public static function cacheMethodIsAvailable() + { + if (!function_exists('igbinary_serialize')) { + return false; + } + + return true; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/Memcache.php b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/Memcache.php new file mode 100644 index 0000000..07942cc --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/Memcache.php @@ -0,0 +1,308 @@ +currentCellIsDirty && !empty($this->currentObjectID)) { + $this->currentObject->detach(); + + $obj = serialize($this->currentObject); + if (!$this->memcache->replace($this->cachePrefix . $this->currentObjectID . '.cache', $obj, null, $this->cacheTime)) { + if (!$this->memcache->add($this->cachePrefix . $this->currentObjectID . '.cache', $obj, null, $this->cacheTime)) { + $this->__destruct(); + throw new PHPExcel_Exception("Failed to store cell {$this->currentObjectID} in MemCache"); + } + } + $this->currentCellIsDirty = false; + } + $this->currentObjectID = $this->currentObject = null; + } // function _storeData() + + + /** + * Add or Update a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to update + * @param PHPExcel_Cell $cell Cell to update + * @return PHPExcel_Cell + * @throws PHPExcel_Exception + */ + public function addCacheData($pCoord, PHPExcel_Cell $cell) + { + if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) { + $this->storeData(); + } + $this->cellCache[$pCoord] = true; + + $this->currentObjectID = $pCoord; + $this->currentObject = $cell; + $this->currentCellIsDirty = true; + + return $cell; + } // function addCacheData() + + + /** + * Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell? + * + * @param string $pCoord Coordinate address of the cell to check + * @return boolean + * @return boolean + */ + public function isDataSet($pCoord) + { + // Check if the requested entry is the current object, or exists in the cache + if (parent::isDataSet($pCoord)) { + if ($this->currentObjectID == $pCoord) { + return true; + } + // Check if the requested entry still exists in Memcache + $success = $this->memcache->get($this->cachePrefix.$pCoord.'.cache'); + if ($success === false) { + // Entry no longer exists in Memcache, so clear it from the cache array + parent::deleteCacheData($pCoord); + throw new PHPExcel_Exception('Cell entry '.$pCoord.' no longer exists in MemCache'); + } + return true; + } + return false; + } + + + /** + * Get cell at a specific coordinate + * + * @param string $pCoord Coordinate of the cell + * @throws PHPExcel_Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) + { + if ($pCoord === $this->currentObjectID) { + return $this->currentObject; + } + $this->storeData(); + + // Check if the entry that has been requested actually exists + if (parent::isDataSet($pCoord)) { + $obj = $this->memcache->get($this->cachePrefix . $pCoord . '.cache'); + if ($obj === false) { + // Entry no longer exists in Memcache, so clear it from the cache array + parent::deleteCacheData($pCoord); + throw new PHPExcel_Exception("Cell entry {$pCoord} no longer exists in MemCache"); + } + } else { + // Return null if requested entry doesn't exist in cache + return null; + } + + // Set current entry to the requested entry + $this->currentObjectID = $pCoord; + $this->currentObject = unserialize($obj); + // Re-attach this as the cell's parent + $this->currentObject->attach($this); + + // Return requested entry + return $this->currentObject; + } + + /** + * Get a list of all cell addresses currently held in cache + * + * @return string[] + */ + public function getCellList() + { + if ($this->currentObjectID !== null) { + $this->storeData(); + } + + return parent::getCellList(); + } + + /** + * Delete a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to delete + * @throws PHPExcel_Exception + */ + public function deleteCacheData($pCoord) + { + // Delete the entry from Memcache + $this->memcache->delete($this->cachePrefix . $pCoord . '.cache'); + + // Delete the entry from our cell address array + parent::deleteCacheData($pCoord); + } + + /** + * Clone the cell collection + * + * @param PHPExcel_Worksheet $parent The new worksheet + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) + { + parent::copyCellCollection($parent); + // Get a new id for the new file name + $baseUnique = $this->getUniqueID(); + $newCachePrefix = substr(md5($baseUnique), 0, 8) . '.'; + $cacheList = $this->getCellList(); + foreach ($cacheList as $cellID) { + if ($cellID != $this->currentObjectID) { + $obj = $this->memcache->get($this->cachePrefix.$cellID.'.cache'); + if ($obj === false) { + // Entry no longer exists in Memcache, so clear it from the cache array + parent::deleteCacheData($cellID); + throw new PHPExcel_Exception("Cell entry {$cellID} no longer exists in MemCache"); + } + if (!$this->memcache->add($newCachePrefix . $cellID . '.cache', $obj, null, $this->cacheTime)) { + $this->__destruct(); + throw new PHPExcel_Exception("Failed to store cell {$cellID} in MemCache"); + } + } + } + $this->cachePrefix = $newCachePrefix; + } + + /** + * Clear the cell collection and disconnect from our parent + * + * @return void + */ + public function unsetWorksheetCells() + { + if (!is_null($this->currentObject)) { + $this->currentObject->detach(); + $this->currentObject = $this->currentObjectID = null; + } + + // Flush the Memcache cache + $this->__destruct(); + + $this->cellCache = array(); + + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->parent = null; + } + + /** + * Initialise this new cell collection + * + * @param PHPExcel_Worksheet $parent The worksheet for this cell collection + * @param array of mixed $arguments Additional initialisation arguments + */ + public function __construct(PHPExcel_Worksheet $parent, $arguments) + { + $memcacheServer = (isset($arguments['memcacheServer'])) ? $arguments['memcacheServer'] : 'localhost'; + $memcachePort = (isset($arguments['memcachePort'])) ? $arguments['memcachePort'] : 11211; + $cacheTime = (isset($arguments['cacheTime'])) ? $arguments['cacheTime'] : 600; + + if (is_null($this->cachePrefix)) { + $baseUnique = $this->getUniqueID(); + $this->cachePrefix = substr(md5($baseUnique), 0, 8) . '.'; + + // Set a new Memcache object and connect to the Memcache server + $this->memcache = new Memcache(); + if (!$this->memcache->addServer($memcacheServer, $memcachePort, false, 50, 5, 5, true, array($this, 'failureCallback'))) { + throw new PHPExcel_Exception("Could not connect to MemCache server at {$memcacheServer}:{$memcachePort}"); + } + $this->cacheTime = $cacheTime; + + parent::__construct($parent); + } + } + + /** + * Memcache error handler + * + * @param string $host Memcache server + * @param integer $port Memcache port + * @throws PHPExcel_Exception + */ + public function failureCallback($host, $port) + { + throw new PHPExcel_Exception("memcache {$host}:{$port} failed"); + } + + /** + * Destroy this cell collection + */ + public function __destruct() + { + $cacheList = $this->getCellList(); + foreach ($cacheList as $cellID) { + $this->memcache->delete($this->cachePrefix.$cellID . '.cache'); + } + } + + /** + * Identify whether the caching method is currently available + * Some methods are dependent on the availability of certain extensions being enabled in the PHP build + * + * @return boolean + */ + public static function cacheMethodIsAvailable() + { + if (!function_exists('memcache_add')) { + return false; + } + + return true; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/Memory.php b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/Memory.php new file mode 100644 index 0000000..0e2ea0b --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/Memory.php @@ -0,0 +1,118 @@ +cellCache[$pCoord] = $cell; + + // Set current entry to the new/updated entry + $this->currentObjectID = $pCoord; + + return $cell; + } + + + /** + * Get cell at a specific coordinate + * + * @param string $pCoord Coordinate of the cell + * @throws PHPExcel_Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) + { + // Check if the entry that has been requested actually exists + if (!isset($this->cellCache[$pCoord])) { + $this->currentObjectID = null; + // Return null if requested entry doesn't exist in cache + return null; + } + + // Set current entry to the requested entry + $this->currentObjectID = $pCoord; + + // Return requested entry + return $this->cellCache[$pCoord]; + } + + + /** + * Clone the cell collection + * + * @param PHPExcel_Worksheet $parent The new worksheet + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) + { + parent::copyCellCollection($parent); + + $newCollection = array(); + foreach ($this->cellCache as $k => &$cell) { + $newCollection[$k] = clone $cell; + $newCollection[$k]->attach($this); + } + + $this->cellCache = $newCollection; + } + + /** + * Clear the cell collection and disconnect from our parent + * + */ + public function unsetWorksheetCells() + { + // Because cells are all stored as intact objects in memory, we need to detach each one from the parent + foreach ($this->cellCache as $k => &$cell) { + $cell->detach(); + $this->cellCache[$k] = null; + } + unset($cell); + + $this->cellCache = array(); + + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->parent = null; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/MemoryGZip.php b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/MemoryGZip.php new file mode 100644 index 0000000..c06ec71 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/MemoryGZip.php @@ -0,0 +1,133 @@ +currentCellIsDirty && !empty($this->currentObjectID)) { + $this->currentObject->detach(); + + $this->cellCache[$this->currentObjectID] = gzdeflate(serialize($this->currentObject)); + $this->currentCellIsDirty = false; + } + $this->currentObjectID = $this->currentObject = null; + } + + + /** + * Add or Update a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to update + * @param PHPExcel_Cell $cell Cell to update + * @return PHPExcel_Cell + * @throws PHPExcel_Exception + */ + public function addCacheData($pCoord, PHPExcel_Cell $cell) + { + if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) { + $this->storeData(); + } + + $this->currentObjectID = $pCoord; + $this->currentObject = $cell; + $this->currentCellIsDirty = true; + + return $cell; + } + + + /** + * Get cell at a specific coordinate + * + * @param string $pCoord Coordinate of the cell + * @throws PHPExcel_Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) + { + if ($pCoord === $this->currentObjectID) { + return $this->currentObject; + } + $this->storeData(); + + // Check if the entry that has been requested actually exists + if (!isset($this->cellCache[$pCoord])) { + // Return null if requested entry doesn't exist in cache + return null; + } + + // Set current entry to the requested entry + $this->currentObjectID = $pCoord; + $this->currentObject = unserialize(gzinflate($this->cellCache[$pCoord])); + // Re-attach this as the cell's parent + $this->currentObject->attach($this); + + // Return requested entry + return $this->currentObject; + } + + + /** + * Get a list of all cell addresses currently held in cache + * + * @return string[] + */ + public function getCellList() + { + if ($this->currentObjectID !== null) { + $this->storeData(); + } + + return parent::getCellList(); + } + + + /** + * Clear the cell collection and disconnect from our parent + * + * @return void + */ + public function unsetWorksheetCells() + { + if (!is_null($this->currentObject)) { + $this->currentObject->detach(); + $this->currentObject = $this->currentObjectID = null; + } + $this->cellCache = array(); + + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->parent = null; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/MemorySerialized.php b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/MemorySerialized.php new file mode 100644 index 0000000..1332514 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/MemorySerialized.php @@ -0,0 +1,129 @@ +currentCellIsDirty && !empty($this->currentObjectID)) { + $this->currentObject->detach(); + + $this->cellCache[$this->currentObjectID] = serialize($this->currentObject); + $this->currentCellIsDirty = false; + } + $this->currentObjectID = $this->currentObject = null; + } + + /** + * Add or Update a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to update + * @param PHPExcel_Cell $cell Cell to update + * @return PHPExcel_Cell + * @throws PHPExcel_Exception + */ + public function addCacheData($pCoord, PHPExcel_Cell $cell) + { + if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) { + $this->storeData(); + } + + $this->currentObjectID = $pCoord; + $this->currentObject = $cell; + $this->currentCellIsDirty = true; + + return $cell; + } + + /** + * Get cell at a specific coordinate + * + * @param string $pCoord Coordinate of the cell + * @throws PHPExcel_Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) + { + if ($pCoord === $this->currentObjectID) { + return $this->currentObject; + } + $this->storeData(); + + // Check if the entry that has been requested actually exists + if (!isset($this->cellCache[$pCoord])) { + // Return null if requested entry doesn't exist in cache + return null; + } + + // Set current entry to the requested entry + $this->currentObjectID = $pCoord; + $this->currentObject = unserialize($this->cellCache[$pCoord]); + // Re-attach this as the cell's parent + $this->currentObject->attach($this); + + // Return requested entry + return $this->currentObject; + } + + /** + * Get a list of all cell addresses currently held in cache + * + * @return string[] + */ + public function getCellList() + { + if ($this->currentObjectID !== null) { + $this->storeData(); + } + + return parent::getCellList(); + } + + /** + * Clear the cell collection and disconnect from our parent + * + * @return void + */ + public function unsetWorksheetCells() + { + if (!is_null($this->currentObject)) { + $this->currentObject->detach(); + $this->currentObject = $this->currentObjectID = null; + } + $this->cellCache = array(); + + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->parent = null; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/PHPTemp.php b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/PHPTemp.php new file mode 100644 index 0000000..43c7819 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/PHPTemp.php @@ -0,0 +1,200 @@ +currentCellIsDirty && !empty($this->currentObjectID)) { + $this->currentObject->detach(); + + fseek($this->fileHandle, 0, SEEK_END); + + $this->cellCache[$this->currentObjectID] = array( + 'ptr' => ftell($this->fileHandle), + 'sz' => fwrite($this->fileHandle, serialize($this->currentObject)) + ); + $this->currentCellIsDirty = false; + } + $this->currentObjectID = $this->currentObject = null; + } + + + /** + * Add or Update a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to update + * @param PHPExcel_Cell $cell Cell to update + * @return PHPExcel_Cell + * @throws PHPExcel_Exception + */ + public function addCacheData($pCoord, PHPExcel_Cell $cell) + { + if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) { + $this->storeData(); + } + + $this->currentObjectID = $pCoord; + $this->currentObject = $cell; + $this->currentCellIsDirty = true; + + return $cell; + } + + + /** + * Get cell at a specific coordinate + * + * @param string $pCoord Coordinate of the cell + * @throws PHPExcel_Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) + { + if ($pCoord === $this->currentObjectID) { + return $this->currentObject; + } + $this->storeData(); + + // Check if the entry that has been requested actually exists + if (!isset($this->cellCache[$pCoord])) { + // Return null if requested entry doesn't exist in cache + return null; + } + + // Set current entry to the requested entry + $this->currentObjectID = $pCoord; + fseek($this->fileHandle, $this->cellCache[$pCoord]['ptr']); + $this->currentObject = unserialize(fread($this->fileHandle, $this->cellCache[$pCoord]['sz'])); + // Re-attach this as the cell's parent + $this->currentObject->attach($this); + + // Return requested entry + return $this->currentObject; + } + + /** + * Get a list of all cell addresses currently held in cache + * + * @return string[] + */ + public function getCellList() + { + if ($this->currentObjectID !== null) { + $this->storeData(); + } + + return parent::getCellList(); + } + + /** + * Clone the cell collection + * + * @param PHPExcel_Worksheet $parent The new worksheet + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) + { + parent::copyCellCollection($parent); + // Open a new stream for the cell cache data + $newFileHandle = fopen('php://temp/maxmemory:' . $this->memoryCacheSize, 'a+'); + // Copy the existing cell cache data to the new stream + fseek($this->fileHandle, 0); + while (!feof($this->fileHandle)) { + fwrite($newFileHandle, fread($this->fileHandle, 1024)); + } + $this->fileHandle = $newFileHandle; + } + + /** + * Clear the cell collection and disconnect from our parent + * + * @return void + */ + public function unsetWorksheetCells() + { + if (!is_null($this->currentObject)) { + $this->currentObject->detach(); + $this->currentObject = $this->currentObjectID = null; + } + $this->cellCache = array(); + + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->parent = null; + + // Close down the php://temp file + $this->__destruct(); + } + + /** + * Initialise this new cell collection + * + * @param PHPExcel_Worksheet $parent The worksheet for this cell collection + * @param array of mixed $arguments Additional initialisation arguments + */ + public function __construct(PHPExcel_Worksheet $parent, $arguments) + { + $this->memoryCacheSize = (isset($arguments['memoryCacheSize'])) ? $arguments['memoryCacheSize'] : '1MB'; + + parent::__construct($parent); + if (is_null($this->fileHandle)) { + $this->fileHandle = fopen('php://temp/maxmemory:' . $this->memoryCacheSize, 'a+'); + } + } + + /** + * Destroy this cell collection + */ + public function __destruct() + { + if (!is_null($this->fileHandle)) { + fclose($this->fileHandle); + } + $this->fileHandle = null; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/SQLite.php b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/SQLite.php new file mode 100644 index 0000000..e7b50c5 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/SQLite.php @@ -0,0 +1,307 @@ +currentCellIsDirty && !empty($this->currentObjectID)) { + $this->currentObject->detach(); + + if (!$this->DBHandle->queryExec("INSERT OR REPLACE INTO kvp_".$this->TableName." VALUES('".$this->currentObjectID."','".sqlite_escape_string(serialize($this->currentObject))."')")) { + throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError())); + } + $this->currentCellIsDirty = false; + } + $this->currentObjectID = $this->currentObject = null; + } + + /** + * Add or Update a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to update + * @param PHPExcel_Cell $cell Cell to update + * @return PHPExcel_Cell + * @throws PHPExcel_Exception + */ + public function addCacheData($pCoord, PHPExcel_Cell $cell) + { + if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) { + $this->storeData(); + } + + $this->currentObjectID = $pCoord; + $this->currentObject = $cell; + $this->currentCellIsDirty = true; + + return $cell; + } + + /** + * Get cell at a specific coordinate + * + * @param string $pCoord Coordinate of the cell + * @throws PHPExcel_Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) + { + if ($pCoord === $this->currentObjectID) { + return $this->currentObject; + } + $this->storeData(); + + $query = "SELECT value FROM kvp_".$this->TableName." WHERE id='".$pCoord."'"; + $cellResultSet = $this->DBHandle->query($query, SQLITE_ASSOC); + if ($cellResultSet === false) { + throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError())); + } elseif ($cellResultSet->numRows() == 0) { + // Return null if requested entry doesn't exist in cache + return null; + } + + // Set current entry to the requested entry + $this->currentObjectID = $pCoord; + + $cellResult = $cellResultSet->fetchSingle(); + $this->currentObject = unserialize($cellResult); + // Re-attach this as the cell's parent + $this->currentObject->attach($this); + + // Return requested entry + return $this->currentObject; + } + + /** + * Is a value set for an indexed cell? + * + * @param string $pCoord Coordinate address of the cell to check + * @return boolean + */ + public function isDataSet($pCoord) + { + if ($pCoord === $this->currentObjectID) { + return true; + } + + // Check if the requested entry exists in the cache + $query = "SELECT id FROM kvp_".$this->TableName." WHERE id='".$pCoord."'"; + $cellResultSet = $this->DBHandle->query($query, SQLITE_ASSOC); + if ($cellResultSet === false) { + throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError())); + } elseif ($cellResultSet->numRows() == 0) { + // Return null if requested entry doesn't exist in cache + return false; + } + return true; + } + + /** + * Delete a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to delete + * @throws PHPExcel_Exception + */ + public function deleteCacheData($pCoord) + { + if ($pCoord === $this->currentObjectID) { + $this->currentObject->detach(); + $this->currentObjectID = $this->currentObject = null; + } + + // Check if the requested entry exists in the cache + $query = "DELETE FROM kvp_".$this->TableName." WHERE id='".$pCoord."'"; + if (!$this->DBHandle->queryExec($query)) { + throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError())); + } + + $this->currentCellIsDirty = false; + } + + /** + * Move a cell object from one address to another + * + * @param string $fromAddress Current address of the cell to move + * @param string $toAddress Destination address of the cell to move + * @return boolean + */ + public function moveCell($fromAddress, $toAddress) + { + if ($fromAddress === $this->currentObjectID) { + $this->currentObjectID = $toAddress; + } + + $query = "DELETE FROM kvp_".$this->TableName." WHERE id='".$toAddress."'"; + $result = $this->DBHandle->exec($query); + if ($result === false) { + throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg()); + } + + $query = "UPDATE kvp_".$this->TableName." SET id='".$toAddress."' WHERE id='".$fromAddress."'"; + $result = $this->DBHandle->exec($query); + if ($result === false) { + throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg()); + } + + return true; + } + + /** + * Get a list of all cell addresses currently held in cache + * + * @return string[] + */ + public function getCellList() + { + if ($this->currentObjectID !== null) { + $this->storeData(); + } + + $query = "SELECT id FROM kvp_".$this->TableName; + $cellIdsResult = $this->DBHandle->unbufferedQuery($query, SQLITE_ASSOC); + if ($cellIdsResult === false) { + throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError())); + } + + $cellKeys = array(); + foreach ($cellIdsResult as $row) { + $cellKeys[] = $row['id']; + } + + return $cellKeys; + } + + /** + * Clone the cell collection + * + * @param PHPExcel_Worksheet $parent The new worksheet + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) + { + $this->currentCellIsDirty; + $this->storeData(); + + // Get a new id for the new table name + $tableName = str_replace('.', '_', $this->getUniqueID()); + if (!$this->DBHandle->queryExec('CREATE TABLE kvp_'.$tableName.' (id VARCHAR(12) PRIMARY KEY, value BLOB) + AS SELECT * FROM kvp_'.$this->TableName) + ) { + throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError())); + } + + // Copy the existing cell cache file + $this->TableName = $tableName; + } + + /** + * Clear the cell collection and disconnect from our parent + * + * @return void + */ + public function unsetWorksheetCells() + { + if (!is_null($this->currentObject)) { + $this->currentObject->detach(); + $this->currentObject = $this->currentObjectID = null; + } + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->parent = null; + + // Close down the temporary cache file + $this->__destruct(); + } + + /** + * Initialise this new cell collection + * + * @param PHPExcel_Worksheet $parent The worksheet for this cell collection + */ + public function __construct(PHPExcel_Worksheet $parent) + { + parent::__construct($parent); + if (is_null($this->DBHandle)) { + $this->TableName = str_replace('.', '_', $this->getUniqueID()); + $_DBName = ':memory:'; + + $this->DBHandle = new SQLiteDatabase($_DBName); + if ($this->DBHandle === false) { + throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError())); + } + if (!$this->DBHandle->queryExec('CREATE TABLE kvp_'.$this->TableName.' (id VARCHAR(12) PRIMARY KEY, value BLOB)')) { + throw new PHPExcel_Exception(sqlite_error_string($this->DBHandle->lastError())); + } + } + } + + /** + * Destroy this cell collection + */ + public function __destruct() + { + if (!is_null($this->DBHandle)) { + $this->DBHandle->queryExec('DROP TABLE kvp_'.$this->TableName); + } + $this->DBHandle = null; + } + + /** + * Identify whether the caching method is currently available + * Some methods are dependent on the availability of certain extensions being enabled in the PHP build + * + * @return boolean + */ + public static function cacheMethodIsAvailable() + { + if (!function_exists('sqlite_open')) { + return false; + } + + return true; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/SQLite3.php b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/SQLite3.php new file mode 100644 index 0000000..27473d6 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/SQLite3.php @@ -0,0 +1,346 @@ +currentCellIsDirty && !empty($this->currentObjectID)) { + $this->currentObject->detach(); + + $this->insertQuery->bindValue('id', $this->currentObjectID, SQLITE3_TEXT); + $this->insertQuery->bindValue('data', serialize($this->currentObject), SQLITE3_BLOB); + $result = $this->insertQuery->execute(); + if ($result === false) { + throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg()); + } + $this->currentCellIsDirty = false; + } + $this->currentObjectID = $this->currentObject = null; + } + + /** + * Add or Update a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to update + * @param PHPExcel_Cell $cell Cell to update + * @return PHPExcel_Cell + * @throws PHPExcel_Exception + */ + public function addCacheData($pCoord, PHPExcel_Cell $cell) + { + if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) { + $this->storeData(); + } + + $this->currentObjectID = $pCoord; + $this->currentObject = $cell; + $this->currentCellIsDirty = true; + + return $cell; + } + + /** + * Get cell at a specific coordinate + * + * @param string $pCoord Coordinate of the cell + * @throws PHPExcel_Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) + { + if ($pCoord === $this->currentObjectID) { + return $this->currentObject; + } + $this->storeData(); + + $this->selectQuery->bindValue('id', $pCoord, SQLITE3_TEXT); + $cellResult = $this->selectQuery->execute(); + if ($cellResult === false) { + throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg()); + } + $cellData = $cellResult->fetchArray(SQLITE3_ASSOC); + if ($cellData === false) { + // Return null if requested entry doesn't exist in cache + return null; + } + + // Set current entry to the requested entry + $this->currentObjectID = $pCoord; + + $this->currentObject = unserialize($cellData['value']); + // Re-attach this as the cell's parent + $this->currentObject->attach($this); + + // Return requested entry + return $this->currentObject; + } + + /** + * Is a value set for an indexed cell? + * + * @param string $pCoord Coordinate address of the cell to check + * @return boolean + */ + public function isDataSet($pCoord) + { + if ($pCoord === $this->currentObjectID) { + return true; + } + + // Check if the requested entry exists in the cache + $this->selectQuery->bindValue('id', $pCoord, SQLITE3_TEXT); + $cellResult = $this->selectQuery->execute(); + if ($cellResult === false) { + throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg()); + } + $cellData = $cellResult->fetchArray(SQLITE3_ASSOC); + + return ($cellData === false) ? false : true; + } + + /** + * Delete a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to delete + * @throws PHPExcel_Exception + */ + public function deleteCacheData($pCoord) + { + if ($pCoord === $this->currentObjectID) { + $this->currentObject->detach(); + $this->currentObjectID = $this->currentObject = null; + } + + // Check if the requested entry exists in the cache + $this->deleteQuery->bindValue('id', $pCoord, SQLITE3_TEXT); + $result = $this->deleteQuery->execute(); + if ($result === false) { + throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg()); + } + + $this->currentCellIsDirty = false; + } + + /** + * Move a cell object from one address to another + * + * @param string $fromAddress Current address of the cell to move + * @param string $toAddress Destination address of the cell to move + * @return boolean + */ + public function moveCell($fromAddress, $toAddress) + { + if ($fromAddress === $this->currentObjectID) { + $this->currentObjectID = $toAddress; + } + + $this->deleteQuery->bindValue('id', $toAddress, SQLITE3_TEXT); + $result = $this->deleteQuery->execute(); + if ($result === false) { + throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg()); + } + + $this->updateQuery->bindValue('toid', $toAddress, SQLITE3_TEXT); + $this->updateQuery->bindValue('fromid', $fromAddress, SQLITE3_TEXT); + $result = $this->updateQuery->execute(); + if ($result === false) { + throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg()); + } + + return true; + } + + /** + * Get a list of all cell addresses currently held in cache + * + * @return string[] + */ + public function getCellList() + { + if ($this->currentObjectID !== null) { + $this->storeData(); + } + + $query = "SELECT id FROM kvp_".$this->TableName; + $cellIdsResult = $this->DBHandle->query($query); + if ($cellIdsResult === false) { + throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg()); + } + + $cellKeys = array(); + while ($row = $cellIdsResult->fetchArray(SQLITE3_ASSOC)) { + $cellKeys[] = $row['id']; + } + + return $cellKeys; + } + + /** + * Clone the cell collection + * + * @param PHPExcel_Worksheet $parent The new worksheet + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) + { + $this->currentCellIsDirty; + $this->storeData(); + + // Get a new id for the new table name + $tableName = str_replace('.', '_', $this->getUniqueID()); + if (!$this->DBHandle->exec('CREATE TABLE kvp_'.$tableName.' (id VARCHAR(12) PRIMARY KEY, value BLOB) + AS SELECT * FROM kvp_'.$this->TableName) + ) { + throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg()); + } + + // Copy the existing cell cache file + $this->TableName = $tableName; + } + + /** + * Clear the cell collection and disconnect from our parent + * + * @return void + */ + public function unsetWorksheetCells() + { + if (!is_null($this->currentObject)) { + $this->currentObject->detach(); + $this->currentObject = $this->currentObjectID = null; + } + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->parent = null; + + // Close down the temporary cache file + $this->__destruct(); + } + + /** + * Initialise this new cell collection + * + * @param PHPExcel_Worksheet $parent The worksheet for this cell collection + */ + public function __construct(PHPExcel_Worksheet $parent) + { + parent::__construct($parent); + if (is_null($this->DBHandle)) { + $this->TableName = str_replace('.', '_', $this->getUniqueID()); + $_DBName = ':memory:'; + + $this->DBHandle = new SQLite3($_DBName); + if ($this->DBHandle === false) { + throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg()); + } + if (!$this->DBHandle->exec('CREATE TABLE kvp_'.$this->TableName.' (id VARCHAR(12) PRIMARY KEY, value BLOB)')) { + throw new PHPExcel_Exception($this->DBHandle->lastErrorMsg()); + } + } + + $this->selectQuery = $this->DBHandle->prepare("SELECT value FROM kvp_".$this->TableName." WHERE id = :id"); + $this->insertQuery = $this->DBHandle->prepare("INSERT OR REPLACE INTO kvp_".$this->TableName." VALUES(:id,:data)"); + $this->updateQuery = $this->DBHandle->prepare("UPDATE kvp_".$this->TableName." SET id=:toId WHERE id=:fromId"); + $this->deleteQuery = $this->DBHandle->prepare("DELETE FROM kvp_".$this->TableName." WHERE id = :id"); + } + + /** + * Destroy this cell collection + */ + public function __destruct() + { + if (!is_null($this->DBHandle)) { + $this->DBHandle->exec('DROP TABLE kvp_'.$this->TableName); + $this->DBHandle->close(); + } + $this->DBHandle = null; + } + + /** + * Identify whether the caching method is currently available + * Some methods are dependent on the availability of certain extensions being enabled in the PHP build + * + * @return boolean + */ + public static function cacheMethodIsAvailable() + { + if (!class_exists('SQLite3', false)) { + return false; + } + + return true; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/Wincache.php b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/Wincache.php new file mode 100644 index 0000000..1567874 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorage/Wincache.php @@ -0,0 +1,289 @@ +currentCellIsDirty && !empty($this->currentObjectID)) { + $this->currentObject->detach(); + + $obj = serialize($this->currentObject); + if (wincache_ucache_exists($this->cachePrefix.$this->currentObjectID.'.cache')) { + if (!wincache_ucache_set($this->cachePrefix.$this->currentObjectID.'.cache', $obj, $this->cacheTime)) { + $this->__destruct(); + throw new PHPExcel_Exception('Failed to store cell '.$this->currentObjectID.' in WinCache'); + } + } else { + if (!wincache_ucache_add($this->cachePrefix.$this->currentObjectID.'.cache', $obj, $this->cacheTime)) { + $this->__destruct(); + throw new PHPExcel_Exception('Failed to store cell '.$this->currentObjectID.' in WinCache'); + } + } + $this->currentCellIsDirty = false; + } + + $this->currentObjectID = $this->currentObject = null; + } + + /** + * Add or Update a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to update + * @param PHPExcel_Cell $cell Cell to update + * @return PHPExcel_Cell + * @throws PHPExcel_Exception + */ + public function addCacheData($pCoord, PHPExcel_Cell $cell) + { + if (($pCoord !== $this->currentObjectID) && ($this->currentObjectID !== null)) { + $this->storeData(); + } + $this->cellCache[$pCoord] = true; + + $this->currentObjectID = $pCoord; + $this->currentObject = $cell; + $this->currentCellIsDirty = true; + + return $cell; + } + + /** + * Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell? + * + * @param string $pCoord Coordinate address of the cell to check + * @return boolean + */ + public function isDataSet($pCoord) + { + // Check if the requested entry is the current object, or exists in the cache + if (parent::isDataSet($pCoord)) { + if ($this->currentObjectID == $pCoord) { + return true; + } + // Check if the requested entry still exists in cache + $success = wincache_ucache_exists($this->cachePrefix.$pCoord.'.cache'); + if ($success === false) { + // Entry no longer exists in Wincache, so clear it from the cache array + parent::deleteCacheData($pCoord); + throw new PHPExcel_Exception('Cell entry '.$pCoord.' no longer exists in WinCache'); + } + return true; + } + return false; + } + + + /** + * Get cell at a specific coordinate + * + * @param string $pCoord Coordinate of the cell + * @throws PHPExcel_Exception + * @return PHPExcel_Cell Cell that was found, or null if not found + */ + public function getCacheData($pCoord) + { + if ($pCoord === $this->currentObjectID) { + return $this->currentObject; + } + $this->storeData(); + + // Check if the entry that has been requested actually exists + $obj = null; + if (parent::isDataSet($pCoord)) { + $success = false; + $obj = wincache_ucache_get($this->cachePrefix.$pCoord.'.cache', $success); + if ($success === false) { + // Entry no longer exists in WinCache, so clear it from the cache array + parent::deleteCacheData($pCoord); + throw new PHPExcel_Exception('Cell entry '.$pCoord.' no longer exists in WinCache'); + } + } else { + // Return null if requested entry doesn't exist in cache + return null; + } + + // Set current entry to the requested entry + $this->currentObjectID = $pCoord; + $this->currentObject = unserialize($obj); + // Re-attach this as the cell's parent + $this->currentObject->attach($this); + + // Return requested entry + return $this->currentObject; + } + + + /** + * Get a list of all cell addresses currently held in cache + * + * @return string[] + */ + public function getCellList() + { + if ($this->currentObjectID !== null) { + $this->storeData(); + } + + return parent::getCellList(); + } + + /** + * Delete a cell in cache identified by coordinate address + * + * @param string $pCoord Coordinate address of the cell to delete + * @throws PHPExcel_Exception + */ + public function deleteCacheData($pCoord) + { + // Delete the entry from Wincache + wincache_ucache_delete($this->cachePrefix.$pCoord.'.cache'); + + // Delete the entry from our cell address array + parent::deleteCacheData($pCoord); + } + + /** + * Clone the cell collection + * + * @param PHPExcel_Worksheet $parent The new worksheet + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) + { + parent::copyCellCollection($parent); + // Get a new id for the new file name + $baseUnique = $this->getUniqueID(); + $newCachePrefix = substr(md5($baseUnique), 0, 8) . '.'; + $cacheList = $this->getCellList(); + foreach ($cacheList as $cellID) { + if ($cellID != $this->currentObjectID) { + $success = false; + $obj = wincache_ucache_get($this->cachePrefix.$cellID.'.cache', $success); + if ($success === false) { + // Entry no longer exists in WinCache, so clear it from the cache array + parent::deleteCacheData($cellID); + throw new PHPExcel_Exception('Cell entry '.$cellID.' no longer exists in Wincache'); + } + if (!wincache_ucache_add($newCachePrefix.$cellID.'.cache', $obj, $this->cacheTime)) { + $this->__destruct(); + throw new PHPExcel_Exception('Failed to store cell '.$cellID.' in Wincache'); + } + } + } + $this->cachePrefix = $newCachePrefix; + } + + + /** + * Clear the cell collection and disconnect from our parent + * + * @return void + */ + public function unsetWorksheetCells() + { + if (!is_null($this->currentObject)) { + $this->currentObject->detach(); + $this->currentObject = $this->currentObjectID = null; + } + + // Flush the WinCache cache + $this->__destruct(); + + $this->cellCache = array(); + + // detach ourself from the worksheet, so that it can then delete this object successfully + $this->parent = null; + } + + /** + * Initialise this new cell collection + * + * @param PHPExcel_Worksheet $parent The worksheet for this cell collection + * @param array of mixed $arguments Additional initialisation arguments + */ + public function __construct(PHPExcel_Worksheet $parent, $arguments) + { + $cacheTime = (isset($arguments['cacheTime'])) ? $arguments['cacheTime'] : 600; + + if (is_null($this->cachePrefix)) { + $baseUnique = $this->getUniqueID(); + $this->cachePrefix = substr(md5($baseUnique), 0, 8).'.'; + $this->cacheTime = $cacheTime; + + parent::__construct($parent); + } + } + + /** + * Destroy this cell collection + */ + public function __destruct() + { + $cacheList = $this->getCellList(); + foreach ($cacheList as $cellID) { + wincache_ucache_delete($this->cachePrefix.$cellID.'.cache'); + } + } + + /** + * Identify whether the caching method is currently available + * Some methods are dependent on the availability of certain extensions being enabled in the PHP build + * + * @return boolean + */ + public static function cacheMethodIsAvailable() + { + if (!function_exists('wincache_ucache_add')) { + return false; + } + + return true; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/CachedObjectStorageFactory.php b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorageFactory.php new file mode 100644 index 0000000..0a96978 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/CachedObjectStorageFactory.php @@ -0,0 +1,231 @@ + array( + ), + self::cache_in_memory_gzip => array( + ), + self::cache_in_memory_serialized => array( + ), + self::cache_igbinary => array( + ), + self::cache_to_phpTemp => array( 'memoryCacheSize' => '1MB' + ), + self::cache_to_discISAM => array( 'dir' => null + ), + self::cache_to_apc => array( 'cacheTime' => 600 + ), + self::cache_to_memcache => array( 'memcacheServer' => 'localhost', + 'memcachePort' => 11211, + 'cacheTime' => 600 + ), + self::cache_to_wincache => array( 'cacheTime' => 600 + ), + self::cache_to_sqlite => array( + ), + self::cache_to_sqlite3 => array( + ), + ); + + /** + * Arguments for the active cache storage method + * + * @var array of mixed array + */ + private static $storageMethodParameters = array(); + + /** + * Return the current cache storage method + * + * @return string|null + **/ + public static function getCacheStorageMethod() + { + return self::$cacheStorageMethod; + } + + /** + * Return the current cache storage class + * + * @return PHPExcel_CachedObjectStorage_ICache|null + **/ + public static function getCacheStorageClass() + { + return self::$cacheStorageClass; + } + + /** + * Return the list of all possible cache storage methods + * + * @return string[] + **/ + public static function getAllCacheStorageMethods() + { + return self::$storageMethods; + } + + /** + * Return the list of all available cache storage methods + * + * @return string[] + **/ + public static function getCacheStorageMethods() + { + $activeMethods = array(); + foreach (self::$storageMethods as $storageMethod) { + $cacheStorageClass = 'PHPExcel_CachedObjectStorage_' . $storageMethod; + if (call_user_func(array($cacheStorageClass, 'cacheMethodIsAvailable'))) { + $activeMethods[] = $storageMethod; + } + } + return $activeMethods; + } + + /** + * Identify the cache storage method to use + * + * @param string $method Name of the method to use for cell cacheing + * @param array of mixed $arguments Additional arguments to pass to the cell caching class + * when instantiating + * @return boolean + **/ + public static function initialize($method = self::cache_in_memory, $arguments = array()) + { + if (!in_array($method, self::$storageMethods)) { + return false; + } + + $cacheStorageClass = 'PHPExcel_CachedObjectStorage_'.$method; + if (!call_user_func(array( $cacheStorageClass, + 'cacheMethodIsAvailable'))) { + return false; + } + + self::$storageMethodParameters[$method] = self::$storageMethodDefaultParameters[$method]; + foreach ($arguments as $k => $v) { + if (array_key_exists($k, self::$storageMethodParameters[$method])) { + self::$storageMethodParameters[$method][$k] = $v; + } + } + + if (self::$cacheStorageMethod === null) { + self::$cacheStorageClass = 'PHPExcel_CachedObjectStorage_' . $method; + self::$cacheStorageMethod = $method; + } + return true; + } + + /** + * Initialise the cache storage + * + * @param PHPExcel_Worksheet $parent Enable cell caching for this worksheet + * @return PHPExcel_CachedObjectStorage_ICache + **/ + public static function getInstance(PHPExcel_Worksheet $parent) + { + $cacheMethodIsAvailable = true; + if (self::$cacheStorageMethod === null) { + $cacheMethodIsAvailable = self::initialize(); + } + + if ($cacheMethodIsAvailable) { + $instance = new self::$cacheStorageClass( + $parent, + self::$storageMethodParameters[self::$cacheStorageMethod] + ); + if ($instance !== null) { + return $instance; + } + } + + return false; + } + + /** + * Clear the cache storage + * + **/ + public static function finalize() + { + self::$cacheStorageMethod = null; + self::$cacheStorageClass = null; + self::$storageMethodParameters = array(); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/CalcEngine/CyclicReferenceStack.php b/application/third_party/PHPExcel/PHPExcel/CalcEngine/CyclicReferenceStack.php new file mode 100644 index 0000000..1072fc7 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/CalcEngine/CyclicReferenceStack.php @@ -0,0 +1,94 @@ +stack); + } + + /** + * Push a new entry onto the stack + * + * @param mixed $value + */ + public function push($value) + { + $this->stack[$value] = $value; + } + + /** + * Pop the last entry from the stack + * + * @return mixed + */ + public function pop() + { + return array_pop($this->stack); + } + + /** + * Test to see if a specified entry exists on the stack + * + * @param mixed $value The value to test + */ + public function onStack($value) + { + return isset($this->stack[$value]); + } + + /** + * Clear the stack + */ + public function clear() + { + $this->stack = array(); + } + + /** + * Return an array of all entries on the stack + * + * @return mixed[] + */ + public function showStack() + { + return $this->stack; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/CalcEngine/Logger.php b/application/third_party/PHPExcel/PHPExcel/CalcEngine/Logger.php new file mode 100644 index 0000000..c5ffe73 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/CalcEngine/Logger.php @@ -0,0 +1,151 @@ +cellStack = $stack; + } + + /** + * Enable/Disable Calculation engine logging + * + * @param boolean $pValue + */ + public function setWriteDebugLog($pValue = false) + { + $this->writeDebugLog = $pValue; + } + + /** + * Return whether calculation engine logging is enabled or disabled + * + * @return boolean + */ + public function getWriteDebugLog() + { + return $this->writeDebugLog; + } + + /** + * Enable/Disable echoing of debug log information + * + * @param boolean $pValue + */ + public function setEchoDebugLog($pValue = false) + { + $this->echoDebugLog = $pValue; + } + + /** + * Return whether echoing of debug log information is enabled or disabled + * + * @return boolean + */ + public function getEchoDebugLog() + { + return $this->echoDebugLog; + } + + /** + * Write an entry to the calculation engine debug log + */ + public function writeDebugLog() + { + // Only write the debug log if logging is enabled + if ($this->writeDebugLog) { + $message = implode(func_get_args()); + $cellReference = implode(' -> ', $this->cellStack->showStack()); + if ($this->echoDebugLog) { + echo $cellReference, + ($this->cellStack->count() > 0 ? ' => ' : ''), + $message, + PHP_EOL; + } + $this->debugLog[] = $cellReference . + ($this->cellStack->count() > 0 ? ' => ' : '') . + $message; + } + } + + /** + * Clear the calculation engine debug log + */ + public function clearLog() + { + $this->debugLog = array(); + } + + /** + * Return the calculation engine debug log + * + * @return string[] + */ + public function getLog() + { + return $this->debugLog; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Calculation.php b/application/third_party/PHPExcel/PHPExcel/Calculation.php new file mode 100644 index 0000000..20b1ec3 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Calculation.php @@ -0,0 +1,4391 @@ +=-]*)|(\'[^\']*\')|(\"[^\"]*\"))!)?\$?([a-z]{1,3})\$?(\d{1,7})'); + // Named Range of cells + define('CALCULATION_REGEXP_NAMEDRANGE', '((([^\s,!&%^\/\*\+<>=-]*)|(\'[^\']*\')|(\"[^\"]*\"))!)?([_A-Z][_A-Z0-9\.]*)'); + } else { + // Cell reference (cell or range of cells, with or without a sheet reference) + define('CALCULATION_REGEXP_CELLREF', '(((\w*)|(\'[^\']*\')|(\"[^\"]*\"))!)?\$?([a-z]{1,3})\$?(\d+)'); + // Named Range of cells + define('CALCULATION_REGEXP_NAMEDRANGE', '(((\w*)|(\'.*\')|(\".*\"))!)?([_A-Z][_A-Z0-9\.]*)'); + } +} + +/** + * PHPExcel_Calculation (Multiton) + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Calculation + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Calculation +{ + /** Constants */ + /** Regular Expressions */ + // Numeric operand + const CALCULATION_REGEXP_NUMBER = '[-+]?\d*\.?\d+(e[-+]?\d+)?'; + // String operand + const CALCULATION_REGEXP_STRING = '"(?:[^"]|"")*"'; + // Opening bracket + const CALCULATION_REGEXP_OPENBRACE = '\('; + // Function (allow for the old @ symbol that could be used to prefix a function, but we'll ignore it) + const CALCULATION_REGEXP_FUNCTION = '@?([A-Z][A-Z0-9\.]*)[\s]*\('; + // Cell reference (cell or range of cells, with or without a sheet reference) + const CALCULATION_REGEXP_CELLREF = CALCULATION_REGEXP_CELLREF; + // Named Range of cells + const CALCULATION_REGEXP_NAMEDRANGE = CALCULATION_REGEXP_NAMEDRANGE; + // Error + const CALCULATION_REGEXP_ERROR = '\#[A-Z][A-Z0_\/]*[!\?]?'; + + + /** constants */ + const RETURN_ARRAY_AS_ERROR = 'error'; + const RETURN_ARRAY_AS_VALUE = 'value'; + const RETURN_ARRAY_AS_ARRAY = 'array'; + + private static $returnArrayAsType = self::RETURN_ARRAY_AS_VALUE; + + + /** + * Instance of this class + * + * @access private + * @var PHPExcel_Calculation + */ + private static $instance; + + + /** + * Instance of the workbook this Calculation Engine is using + * + * @access private + * @var PHPExcel + */ + private $workbook; + + /** + * List of instances of the calculation engine that we've instantiated for individual workbooks + * + * @access private + * @var PHPExcel_Calculation[] + */ + private static $workbookSets; + + /** + * Calculation cache + * + * @access private + * @var array + */ + private $calculationCache = array (); + + + /** + * Calculation cache enabled + * + * @access private + * @var boolean + */ + private $calculationCacheEnabled = true; + + + /** + * List of operators that can be used within formulae + * The true/false value indicates whether it is a binary operator or a unary operator + * + * @access private + * @var array + */ + private static $operators = array( + '+' => true, '-' => true, '*' => true, '/' => true, + '^' => true, '&' => true, '%' => false, '~' => false, + '>' => true, '<' => true, '=' => true, '>=' => true, + '<=' => true, '<>' => true, '|' => true, ':' => true + ); + + /** + * List of binary operators (those that expect two operands) + * + * @access private + * @var array + */ + private static $binaryOperators = array( + '+' => true, '-' => true, '*' => true, '/' => true, + '^' => true, '&' => true, '>' => true, '<' => true, + '=' => true, '>=' => true, '<=' => true, '<>' => true, + '|' => true, ':' => true + ); + + /** + * The debug log generated by the calculation engine + * + * @access private + * @var PHPExcel_CalcEngine_Logger + * + */ + private $debugLog; + + /** + * Flag to determine how formula errors should be handled + * If true, then a user error will be triggered + * If false, then an exception will be thrown + * + * @access public + * @var boolean + * + */ + public $suppressFormulaErrors = false; + + /** + * Error message for any error that was raised/thrown by the calculation engine + * + * @access public + * @var string + * + */ + public $formulaError = null; + + /** + * An array of the nested cell references accessed by the calculation engine, used for the debug log + * + * @access private + * @var array of string + * + */ + private $cyclicReferenceStack; + + private $cellStack = array(); + + /** + * Current iteration counter for cyclic formulae + * If the value is 0 (or less) then cyclic formulae will throw an exception, + * otherwise they will iterate to the limit defined here before returning a result + * + * @var integer + * + */ + private $cyclicFormulaCounter = 1; + + private $cyclicFormulaCell = ''; + + /** + * Number of iterations for cyclic formulae + * + * @var integer + * + */ + public $cyclicFormulaCount = 1; + + /** + * Epsilon Precision used for comparisons in calculations + * + * @var float + * + */ + private $delta = 0.1e-12; + + + /** + * The current locale setting + * + * @var string + * + */ + private static $localeLanguage = 'en_us'; // US English (default locale) + + /** + * List of available locale settings + * Note that this is read for the locale subdirectory only when requested + * + * @var string[] + * + */ + private static $validLocaleLanguages = array( + 'en' // English (default language) + ); + + /** + * Locale-specific argument separator for function arguments + * + * @var string + * + */ + private static $localeArgumentSeparator = ','; + private static $localeFunctions = array(); + + /** + * Locale-specific translations for Excel constants (True, False and Null) + * + * @var string[] + * + */ + public static $localeBoolean = array( + 'TRUE' => 'TRUE', + 'FALSE' => 'FALSE', + 'NULL' => 'NULL' + ); + + /** + * Excel constant string translations to their PHP equivalents + * Constant conversion from text name/value to actual (datatyped) value + * + * @var string[] + * + */ + private static $excelConstants = array( + 'TRUE' => true, + 'FALSE' => false, + 'NULL' => null + ); + + // PHPExcel functions + private static $PHPExcelFunctions = array( + 'ABS' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'abs', + 'argumentCount' => '1' + ), + 'ACCRINT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::ACCRINT', + 'argumentCount' => '4-7' + ), + 'ACCRINTM' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::ACCRINTM', + 'argumentCount' => '3-5' + ), + 'ACOS' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'acos', + 'argumentCount' => '1' + ), + 'ACOSH' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'acosh', + 'argumentCount' => '1' + ), + 'ADDRESS' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::CELL_ADDRESS', + 'argumentCount' => '2-5' + ), + 'AMORDEGRC' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::AMORDEGRC', + 'argumentCount' => '6,7' + ), + 'AMORLINC' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::AMORLINC', + 'argumentCount' => '6,7' + ), + 'AND' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOGICAL, + 'functionCall' => 'PHPExcel_Calculation_Logical::LOGICAL_AND', + 'argumentCount' => '1+' + ), + 'AREAS' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '1' + ), + 'ASC' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '1' + ), + 'ASIN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'asin', + 'argumentCount' => '1' + ), + 'ASINH' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'asinh', + 'argumentCount' => '1' + ), + 'ATAN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'atan', + 'argumentCount' => '1' + ), + 'ATAN2' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::ATAN2', + 'argumentCount' => '2' + ), + 'ATANH' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'atanh', + 'argumentCount' => '1' + ), + 'AVEDEV' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::AVEDEV', + 'argumentCount' => '1+' + ), + 'AVERAGE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::AVERAGE', + 'argumentCount' => '1+' + ), + 'AVERAGEA' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::AVERAGEA', + 'argumentCount' => '1+' + ), + 'AVERAGEIF' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::AVERAGEIF', + 'argumentCount' => '2,3' + ), + 'AVERAGEIFS' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '3+' + ), + 'BAHTTEXT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '1' + ), + 'BESSELI' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::BESSELI', + 'argumentCount' => '2' + ), + 'BESSELJ' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::BESSELJ', + 'argumentCount' => '2' + ), + 'BESSELK' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::BESSELK', + 'argumentCount' => '2' + ), + 'BESSELY' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::BESSELY', + 'argumentCount' => '2' + ), + 'BETADIST' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::BETADIST', + 'argumentCount' => '3-5' + ), + 'BETAINV' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::BETAINV', + 'argumentCount' => '3-5' + ), + 'BIN2DEC' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::BINTODEC', + 'argumentCount' => '1' + ), + 'BIN2HEX' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::BINTOHEX', + 'argumentCount' => '1,2' + ), + 'BIN2OCT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::BINTOOCT', + 'argumentCount' => '1,2' + ), + 'BINOMDIST' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::BINOMDIST', + 'argumentCount' => '4' + ), + 'CEILING' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::CEILING', + 'argumentCount' => '2' + ), + 'CELL' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '1,2' + ), + 'CHAR' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::CHARACTER', + 'argumentCount' => '1' + ), + 'CHIDIST' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::CHIDIST', + 'argumentCount' => '2' + ), + 'CHIINV' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::CHIINV', + 'argumentCount' => '2' + ), + 'CHITEST' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '2' + ), + 'CHOOSE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::CHOOSE', + 'argumentCount' => '2+' + ), + 'CLEAN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::TRIMNONPRINTABLE', + 'argumentCount' => '1' + ), + 'CODE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::ASCIICODE', + 'argumentCount' => '1' + ), + 'COLUMN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::COLUMN', + 'argumentCount' => '-1', + 'passByReference' => array(true) + ), + 'COLUMNS' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::COLUMNS', + 'argumentCount' => '1' + ), + 'COMBIN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::COMBIN', + 'argumentCount' => '2' + ), + 'COMPLEX' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::COMPLEX', + 'argumentCount' => '2,3' + ), + 'CONCATENATE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::CONCATENATE', + 'argumentCount' => '1+' + ), + 'CONFIDENCE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::CONFIDENCE', + 'argumentCount' => '3' + ), + 'CONVERT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::CONVERTUOM', + 'argumentCount' => '3' + ), + 'CORREL' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::CORREL', + 'argumentCount' => '2' + ), + 'COS' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'cos', + 'argumentCount' => '1' + ), + 'COSH' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'cosh', + 'argumentCount' => '1' + ), + 'COUNT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::COUNT', + 'argumentCount' => '1+' + ), + 'COUNTA' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::COUNTA', + 'argumentCount' => '1+' + ), + 'COUNTBLANK' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::COUNTBLANK', + 'argumentCount' => '1' + ), + 'COUNTIF' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::COUNTIF', + 'argumentCount' => '2' + ), + 'COUNTIFS' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '2' + ), + 'COUPDAYBS' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::COUPDAYBS', + 'argumentCount' => '3,4' + ), + 'COUPDAYS' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::COUPDAYS', + 'argumentCount' => '3,4' + ), + 'COUPDAYSNC' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::COUPDAYSNC', + 'argumentCount' => '3,4' + ), + 'COUPNCD' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::COUPNCD', + 'argumentCount' => '3,4' + ), + 'COUPNUM' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::COUPNUM', + 'argumentCount' => '3,4' + ), + 'COUPPCD' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::COUPPCD', + 'argumentCount' => '3,4' + ), + 'COVAR' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::COVAR', + 'argumentCount' => '2' + ), + 'CRITBINOM' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::CRITBINOM', + 'argumentCount' => '3' + ), + 'CUBEKPIMEMBER' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_CUBE, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '?' + ), + 'CUBEMEMBER' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_CUBE, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '?' + ), + 'CUBEMEMBERPROPERTY' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_CUBE, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '?' + ), + 'CUBERANKEDMEMBER' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_CUBE, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '?' + ), + 'CUBESET' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_CUBE, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '?' + ), + 'CUBESETCOUNT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_CUBE, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '?' + ), + 'CUBEVALUE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_CUBE, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '?' + ), + 'CUMIPMT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::CUMIPMT', + 'argumentCount' => '6' + ), + 'CUMPRINC' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::CUMPRINC', + 'argumentCount' => '6' + ), + 'DATE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::DATE', + 'argumentCount' => '3' + ), + 'DATEDIF' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::DATEDIF', + 'argumentCount' => '2,3' + ), + 'DATEVALUE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::DATEVALUE', + 'argumentCount' => '1' + ), + 'DAVERAGE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DAVERAGE', + 'argumentCount' => '3' + ), + 'DAY' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::DAYOFMONTH', + 'argumentCount' => '1' + ), + 'DAYS360' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::DAYS360', + 'argumentCount' => '2,3' + ), + 'DB' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::DB', + 'argumentCount' => '4,5' + ), + 'DCOUNT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DCOUNT', + 'argumentCount' => '3' + ), + 'DCOUNTA' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DCOUNTA', + 'argumentCount' => '3' + ), + 'DDB' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::DDB', + 'argumentCount' => '4,5' + ), + 'DEC2BIN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::DECTOBIN', + 'argumentCount' => '1,2' + ), + 'DEC2HEX' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::DECTOHEX', + 'argumentCount' => '1,2' + ), + 'DEC2OCT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::DECTOOCT', + 'argumentCount' => '1,2' + ), + 'DEGREES' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'rad2deg', + 'argumentCount' => '1' + ), + 'DELTA' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::DELTA', + 'argumentCount' => '1,2' + ), + 'DEVSQ' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::DEVSQ', + 'argumentCount' => '1+' + ), + 'DGET' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DGET', + 'argumentCount' => '3' + ), + 'DISC' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::DISC', + 'argumentCount' => '4,5' + ), + 'DMAX' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DMAX', + 'argumentCount' => '3' + ), + 'DMIN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DMIN', + 'argumentCount' => '3' + ), + 'DOLLAR' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::DOLLAR', + 'argumentCount' => '1,2' + ), + 'DOLLARDE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::DOLLARDE', + 'argumentCount' => '2' + ), + 'DOLLARFR' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::DOLLARFR', + 'argumentCount' => '2' + ), + 'DPRODUCT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DPRODUCT', + 'argumentCount' => '3' + ), + 'DSTDEV' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DSTDEV', + 'argumentCount' => '3' + ), + 'DSTDEVP' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DSTDEVP', + 'argumentCount' => '3' + ), + 'DSUM' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DSUM', + 'argumentCount' => '3' + ), + 'DURATION' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '5,6' + ), + 'DVAR' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DVAR', + 'argumentCount' => '3' + ), + 'DVARP' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATABASE, + 'functionCall' => 'PHPExcel_Calculation_Database::DVARP', + 'argumentCount' => '3' + ), + 'EDATE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::EDATE', + 'argumentCount' => '2' + ), + 'EFFECT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::EFFECT', + 'argumentCount' => '2' + ), + 'EOMONTH' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::EOMONTH', + 'argumentCount' => '2' + ), + 'ERF' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::ERF', + 'argumentCount' => '1,2' + ), + 'ERFC' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::ERFC', + 'argumentCount' => '1' + ), + 'ERROR.TYPE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::ERROR_TYPE', + 'argumentCount' => '1' + ), + 'EVEN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::EVEN', + 'argumentCount' => '1' + ), + 'EXACT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '2' + ), + 'EXP' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'exp', + 'argumentCount' => '1' + ), + 'EXPONDIST' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::EXPONDIST', + 'argumentCount' => '3' + ), + 'FACT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::FACT', + 'argumentCount' => '1' + ), + 'FACTDOUBLE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::FACTDOUBLE', + 'argumentCount' => '1' + ), + 'FALSE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOGICAL, + 'functionCall' => 'PHPExcel_Calculation_Logical::FALSE', + 'argumentCount' => '0' + ), + 'FDIST' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '3' + ), + 'FIND' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::SEARCHSENSITIVE', + 'argumentCount' => '2,3' + ), + 'FINDB' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::SEARCHSENSITIVE', + 'argumentCount' => '2,3' + ), + 'FINV' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '3' + ), + 'FISHER' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::FISHER', + 'argumentCount' => '1' + ), + 'FISHERINV' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::FISHERINV', + 'argumentCount' => '1' + ), + 'FIXED' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::FIXEDFORMAT', + 'argumentCount' => '1-3' + ), + 'FLOOR' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::FLOOR', + 'argumentCount' => '2' + ), + 'FORECAST' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::FORECAST', + 'argumentCount' => '3' + ), + 'FREQUENCY' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '2' + ), + 'FTEST' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '2' + ), + 'FV' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::FV', + 'argumentCount' => '3-5' + ), + 'FVSCHEDULE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::FVSCHEDULE', + 'argumentCount' => '2' + ), + 'GAMMADIST' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::GAMMADIST', + 'argumentCount' => '4' + ), + 'GAMMAINV' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::GAMMAINV', + 'argumentCount' => '3' + ), + 'GAMMALN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::GAMMALN', + 'argumentCount' => '1' + ), + 'GCD' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::GCD', + 'argumentCount' => '1+' + ), + 'GEOMEAN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::GEOMEAN', + 'argumentCount' => '1+' + ), + 'GESTEP' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::GESTEP', + 'argumentCount' => '1,2' + ), + 'GETPIVOTDATA' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '2+' + ), + 'GROWTH' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::GROWTH', + 'argumentCount' => '1-4' + ), + 'HARMEAN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::HARMEAN', + 'argumentCount' => '1+' + ), + 'HEX2BIN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::HEXTOBIN', + 'argumentCount' => '1,2' + ), + 'HEX2DEC' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::HEXTODEC', + 'argumentCount' => '1' + ), + 'HEX2OCT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::HEXTOOCT', + 'argumentCount' => '1,2' + ), + 'HLOOKUP' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::HLOOKUP', + 'argumentCount' => '3,4' + ), + 'HOUR' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::HOUROFDAY', + 'argumentCount' => '1' + ), + 'HYPERLINK' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::HYPERLINK', + 'argumentCount' => '1,2', + 'passCellReference' => true + ), + 'HYPGEOMDIST' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::HYPGEOMDIST', + 'argumentCount' => '4' + ), + 'IF' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOGICAL, + 'functionCall' => 'PHPExcel_Calculation_Logical::STATEMENT_IF', + 'argumentCount' => '1-3' + ), + 'IFERROR' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOGICAL, + 'functionCall' => 'PHPExcel_Calculation_Logical::IFERROR', + 'argumentCount' => '2' + ), + 'IMABS' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMABS', + 'argumentCount' => '1' + ), + 'IMAGINARY' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMAGINARY', + 'argumentCount' => '1' + ), + 'IMARGUMENT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMARGUMENT', + 'argumentCount' => '1' + ), + 'IMCONJUGATE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMCONJUGATE', + 'argumentCount' => '1' + ), + 'IMCOS' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMCOS', + 'argumentCount' => '1' + ), + 'IMDIV' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMDIV', + 'argumentCount' => '2' + ), + 'IMEXP' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMEXP', + 'argumentCount' => '1' + ), + 'IMLN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMLN', + 'argumentCount' => '1' + ), + 'IMLOG10' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMLOG10', + 'argumentCount' => '1' + ), + 'IMLOG2' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMLOG2', + 'argumentCount' => '1' + ), + 'IMPOWER' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMPOWER', + 'argumentCount' => '2' + ), + 'IMPRODUCT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMPRODUCT', + 'argumentCount' => '1+' + ), + 'IMREAL' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMREAL', + 'argumentCount' => '1' + ), + 'IMSIN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMSIN', + 'argumentCount' => '1' + ), + 'IMSQRT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMSQRT', + 'argumentCount' => '1' + ), + 'IMSUB' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMSUB', + 'argumentCount' => '2' + ), + 'IMSUM' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::IMSUM', + 'argumentCount' => '1+' + ), + 'INDEX' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::INDEX', + 'argumentCount' => '1-4' + ), + 'INDIRECT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::INDIRECT', + 'argumentCount' => '1,2', + 'passCellReference' => true + ), + 'INFO' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '1' + ), + 'INT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::INT', + 'argumentCount' => '1' + ), + 'INTERCEPT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::INTERCEPT', + 'argumentCount' => '2' + ), + 'INTRATE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::INTRATE', + 'argumentCount' => '4,5' + ), + 'IPMT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::IPMT', + 'argumentCount' => '4-6' + ), + 'IRR' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::IRR', + 'argumentCount' => '1,2' + ), + 'ISBLANK' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::IS_BLANK', + 'argumentCount' => '1' + ), + 'ISERR' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::IS_ERR', + 'argumentCount' => '1' + ), + 'ISERROR' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::IS_ERROR', + 'argumentCount' => '1' + ), + 'ISEVEN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::IS_EVEN', + 'argumentCount' => '1' + ), + 'ISLOGICAL' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::IS_LOGICAL', + 'argumentCount' => '1' + ), + 'ISNA' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::IS_NA', + 'argumentCount' => '1' + ), + 'ISNONTEXT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::IS_NONTEXT', + 'argumentCount' => '1' + ), + 'ISNUMBER' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::IS_NUMBER', + 'argumentCount' => '1' + ), + 'ISODD' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::IS_ODD', + 'argumentCount' => '1' + ), + 'ISPMT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::ISPMT', + 'argumentCount' => '4' + ), + 'ISREF' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '1' + ), + 'ISTEXT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::IS_TEXT', + 'argumentCount' => '1' + ), + 'JIS' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '1' + ), + 'KURT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::KURT', + 'argumentCount' => '1+' + ), + 'LARGE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::LARGE', + 'argumentCount' => '2' + ), + 'LCM' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::LCM', + 'argumentCount' => '1+' + ), + 'LEFT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::LEFT', + 'argumentCount' => '1,2' + ), + 'LEFTB' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::LEFT', + 'argumentCount' => '1,2' + ), + 'LEN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::STRINGLENGTH', + 'argumentCount' => '1' + ), + 'LENB' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::STRINGLENGTH', + 'argumentCount' => '1' + ), + 'LINEST' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::LINEST', + 'argumentCount' => '1-4' + ), + 'LN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'log', + 'argumentCount' => '1' + ), + 'LOG' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::LOG_BASE', + 'argumentCount' => '1,2' + ), + 'LOG10' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'log10', + 'argumentCount' => '1' + ), + 'LOGEST' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::LOGEST', + 'argumentCount' => '1-4' + ), + 'LOGINV' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::LOGINV', + 'argumentCount' => '3' + ), + 'LOGNORMDIST' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::LOGNORMDIST', + 'argumentCount' => '3' + ), + 'LOOKUP' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::LOOKUP', + 'argumentCount' => '2,3' + ), + 'LOWER' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::LOWERCASE', + 'argumentCount' => '1' + ), + 'MATCH' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::MATCH', + 'argumentCount' => '2,3' + ), + 'MAX' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::MAX', + 'argumentCount' => '1+' + ), + 'MAXA' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::MAXA', + 'argumentCount' => '1+' + ), + 'MAXIF' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::MAXIF', + 'argumentCount' => '2+' + ), + 'MDETERM' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::MDETERM', + 'argumentCount' => '1' + ), + 'MDURATION' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '5,6' + ), + 'MEDIAN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::MEDIAN', + 'argumentCount' => '1+' + ), + 'MEDIANIF' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '2+' + ), + 'MID' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::MID', + 'argumentCount' => '3' + ), + 'MIDB' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::MID', + 'argumentCount' => '3' + ), + 'MIN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::MIN', + 'argumentCount' => '1+' + ), + 'MINA' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::MINA', + 'argumentCount' => '1+' + ), + 'MINIF' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::MINIF', + 'argumentCount' => '2+' + ), + 'MINUTE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::MINUTEOFHOUR', + 'argumentCount' => '1' + ), + 'MINVERSE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::MINVERSE', + 'argumentCount' => '1' + ), + 'MIRR' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::MIRR', + 'argumentCount' => '3' + ), + 'MMULT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::MMULT', + 'argumentCount' => '2' + ), + 'MOD' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::MOD', + 'argumentCount' => '2' + ), + 'MODE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::MODE', + 'argumentCount' => '1+' + ), + 'MONTH' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::MONTHOFYEAR', + 'argumentCount' => '1' + ), + 'MROUND' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::MROUND', + 'argumentCount' => '2' + ), + 'MULTINOMIAL' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::MULTINOMIAL', + 'argumentCount' => '1+' + ), + 'N' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::N', + 'argumentCount' => '1' + ), + 'NA' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::NA', + 'argumentCount' => '0' + ), + 'NEGBINOMDIST' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::NEGBINOMDIST', + 'argumentCount' => '3' + ), + 'NETWORKDAYS' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::NETWORKDAYS', + 'argumentCount' => '2+' + ), + 'NOMINAL' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::NOMINAL', + 'argumentCount' => '2' + ), + 'NORMDIST' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::NORMDIST', + 'argumentCount' => '4' + ), + 'NORMINV' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::NORMINV', + 'argumentCount' => '3' + ), + 'NORMSDIST' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::NORMSDIST', + 'argumentCount' => '1' + ), + 'NORMSINV' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::NORMSINV', + 'argumentCount' => '1' + ), + 'NOT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOGICAL, + 'functionCall' => 'PHPExcel_Calculation_Logical::NOT', + 'argumentCount' => '1' + ), + 'NOW' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::DATETIMENOW', + 'argumentCount' => '0' + ), + 'NPER' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::NPER', + 'argumentCount' => '3-5' + ), + 'NPV' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::NPV', + 'argumentCount' => '2+' + ), + 'OCT2BIN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::OCTTOBIN', + 'argumentCount' => '1,2' + ), + 'OCT2DEC' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::OCTTODEC', + 'argumentCount' => '1' + ), + 'OCT2HEX' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_ENGINEERING, + 'functionCall' => 'PHPExcel_Calculation_Engineering::OCTTOHEX', + 'argumentCount' => '1,2' + ), + 'ODD' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::ODD', + 'argumentCount' => '1' + ), + 'ODDFPRICE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '8,9' + ), + 'ODDFYIELD' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '8,9' + ), + 'ODDLPRICE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '7,8' + ), + 'ODDLYIELD' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '7,8' + ), + 'OFFSET' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::OFFSET', + 'argumentCount' => '3-5', + 'passCellReference' => true, + 'passByReference' => array(true) + ), + 'OR' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOGICAL, + 'functionCall' => 'PHPExcel_Calculation_Logical::LOGICAL_OR', + 'argumentCount' => '1+' + ), + 'PEARSON' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::CORREL', + 'argumentCount' => '2' + ), + 'PERCENTILE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::PERCENTILE', + 'argumentCount' => '2' + ), + 'PERCENTRANK' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::PERCENTRANK', + 'argumentCount' => '2,3' + ), + 'PERMUT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::PERMUT', + 'argumentCount' => '2' + ), + 'PHONETIC' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '1' + ), + 'PI' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'pi', + 'argumentCount' => '0' + ), + 'PMT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::PMT', + 'argumentCount' => '3-5' + ), + 'POISSON' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::POISSON', + 'argumentCount' => '3' + ), + 'POWER' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::POWER', + 'argumentCount' => '2' + ), + 'PPMT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::PPMT', + 'argumentCount' => '4-6' + ), + 'PRICE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::PRICE', + 'argumentCount' => '6,7' + ), + 'PRICEDISC' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::PRICEDISC', + 'argumentCount' => '4,5' + ), + 'PRICEMAT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::PRICEMAT', + 'argumentCount' => '5,6' + ), + 'PROB' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '3,4' + ), + 'PRODUCT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::PRODUCT', + 'argumentCount' => '1+' + ), + 'PROPER' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::PROPERCASE', + 'argumentCount' => '1' + ), + 'PV' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::PV', + 'argumentCount' => '3-5' + ), + 'QUARTILE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::QUARTILE', + 'argumentCount' => '2' + ), + 'QUOTIENT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::QUOTIENT', + 'argumentCount' => '2' + ), + 'RADIANS' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'deg2rad', + 'argumentCount' => '1' + ), + 'RAND' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::RAND', + 'argumentCount' => '0' + ), + 'RANDBETWEEN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::RAND', + 'argumentCount' => '2' + ), + 'RANK' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::RANK', + 'argumentCount' => '2,3' + ), + 'RATE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::RATE', + 'argumentCount' => '3-6' + ), + 'RECEIVED' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::RECEIVED', + 'argumentCount' => '4-5' + ), + 'REPLACE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::REPLACE', + 'argumentCount' => '4' + ), + 'REPLACEB' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::REPLACE', + 'argumentCount' => '4' + ), + 'REPT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'str_repeat', + 'argumentCount' => '2' + ), + 'RIGHT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::RIGHT', + 'argumentCount' => '1,2' + ), + 'RIGHTB' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::RIGHT', + 'argumentCount' => '1,2' + ), + 'ROMAN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::ROMAN', + 'argumentCount' => '1,2' + ), + 'ROUND' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'round', + 'argumentCount' => '2' + ), + 'ROUNDDOWN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::ROUNDDOWN', + 'argumentCount' => '2' + ), + 'ROUNDUP' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::ROUNDUP', + 'argumentCount' => '2' + ), + 'ROW' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::ROW', + 'argumentCount' => '-1', + 'passByReference' => array(true) + ), + 'ROWS' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::ROWS', + 'argumentCount' => '1' + ), + 'RSQ' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::RSQ', + 'argumentCount' => '2' + ), + 'RTD' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '1+' + ), + 'SEARCH' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::SEARCHINSENSITIVE', + 'argumentCount' => '2,3' + ), + 'SEARCHB' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::SEARCHINSENSITIVE', + 'argumentCount' => '2,3' + ), + 'SECOND' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::SECONDOFMINUTE', + 'argumentCount' => '1' + ), + 'SERIESSUM' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SERIESSUM', + 'argumentCount' => '4' + ), + 'SIGN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SIGN', + 'argumentCount' => '1' + ), + 'SIN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'sin', + 'argumentCount' => '1' + ), + 'SINH' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'sinh', + 'argumentCount' => '1' + ), + 'SKEW' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::SKEW', + 'argumentCount' => '1+' + ), + 'SLN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::SLN', + 'argumentCount' => '3' + ), + 'SLOPE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::SLOPE', + 'argumentCount' => '2' + ), + 'SMALL' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::SMALL', + 'argumentCount' => '2' + ), + 'SQRT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'sqrt', + 'argumentCount' => '1' + ), + 'SQRTPI' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SQRTPI', + 'argumentCount' => '1' + ), + 'STANDARDIZE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::STANDARDIZE', + 'argumentCount' => '3' + ), + 'STDEV' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::STDEV', + 'argumentCount' => '1+' + ), + 'STDEVA' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::STDEVA', + 'argumentCount' => '1+' + ), + 'STDEVP' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::STDEVP', + 'argumentCount' => '1+' + ), + 'STDEVPA' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::STDEVPA', + 'argumentCount' => '1+' + ), + 'STEYX' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::STEYX', + 'argumentCount' => '2' + ), + 'SUBSTITUTE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::SUBSTITUTE', + 'argumentCount' => '3,4' + ), + 'SUBTOTAL' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SUBTOTAL', + 'argumentCount' => '2+' + ), + 'SUM' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SUM', + 'argumentCount' => '1+' + ), + 'SUMIF' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SUMIF', + 'argumentCount' => '2,3' + ), + 'SUMIFS' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SUMIFS', + 'argumentCount' => '3+' + ), + 'SUMPRODUCT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SUMPRODUCT', + 'argumentCount' => '1+' + ), + 'SUMSQ' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SUMSQ', + 'argumentCount' => '1+' + ), + 'SUMX2MY2' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SUMX2MY2', + 'argumentCount' => '2' + ), + 'SUMX2PY2' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SUMX2PY2', + 'argumentCount' => '2' + ), + 'SUMXMY2' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::SUMXMY2', + 'argumentCount' => '2' + ), + 'SYD' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::SYD', + 'argumentCount' => '4' + ), + 'T' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::RETURNSTRING', + 'argumentCount' => '1' + ), + 'TAN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'tan', + 'argumentCount' => '1' + ), + 'TANH' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'tanh', + 'argumentCount' => '1' + ), + 'TBILLEQ' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::TBILLEQ', + 'argumentCount' => '3' + ), + 'TBILLPRICE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::TBILLPRICE', + 'argumentCount' => '3' + ), + 'TBILLYIELD' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::TBILLYIELD', + 'argumentCount' => '3' + ), + 'TDIST' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::TDIST', + 'argumentCount' => '3' + ), + 'TEXT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::TEXTFORMAT', + 'argumentCount' => '2' + ), + 'TIME' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::TIME', + 'argumentCount' => '3' + ), + 'TIMEVALUE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::TIMEVALUE', + 'argumentCount' => '1' + ), + 'TINV' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::TINV', + 'argumentCount' => '2' + ), + 'TODAY' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::DATENOW', + 'argumentCount' => '0' + ), + 'TRANSPOSE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::TRANSPOSE', + 'argumentCount' => '1' + ), + 'TREND' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::TREND', + 'argumentCount' => '1-4' + ), + 'TRIM' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::TRIMSPACES', + 'argumentCount' => '1' + ), + 'TRIMMEAN' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::TRIMMEAN', + 'argumentCount' => '2' + ), + 'TRUE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOGICAL, + 'functionCall' => 'PHPExcel_Calculation_Logical::TRUE', + 'argumentCount' => '0' + ), + 'TRUNC' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_MATH_AND_TRIG, + 'functionCall' => 'PHPExcel_Calculation_MathTrig::TRUNC', + 'argumentCount' => '1,2' + ), + 'TTEST' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '4' + ), + 'TYPE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::TYPE', + 'argumentCount' => '1' + ), + 'UPPER' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::UPPERCASE', + 'argumentCount' => '1' + ), + 'USDOLLAR' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '2' + ), + 'VALUE' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_TEXT_AND_DATA, + 'functionCall' => 'PHPExcel_Calculation_TextData::VALUE', + 'argumentCount' => '1' + ), + 'VAR' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::VARFunc', + 'argumentCount' => '1+' + ), + 'VARA' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::VARA', + 'argumentCount' => '1+' + ), + 'VARP' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::VARP', + 'argumentCount' => '1+' + ), + 'VARPA' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::VARPA', + 'argumentCount' => '1+' + ), + 'VDB' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '5-7' + ), + 'VERSION' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_INFORMATION, + 'functionCall' => 'PHPExcel_Calculation_Functions::VERSION', + 'argumentCount' => '0' + ), + 'VLOOKUP' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_LOOKUP_AND_REFERENCE, + 'functionCall' => 'PHPExcel_Calculation_LookupRef::VLOOKUP', + 'argumentCount' => '3,4' + ), + 'WEEKDAY' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::DAYOFWEEK', + 'argumentCount' => '1,2' + ), + 'WEEKNUM' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::WEEKOFYEAR', + 'argumentCount' => '1,2' + ), + 'WEIBULL' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::WEIBULL', + 'argumentCount' => '4' + ), + 'WORKDAY' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::WORKDAY', + 'argumentCount' => '2+' + ), + 'XIRR' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::XIRR', + 'argumentCount' => '2,3' + ), + 'XNPV' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::XNPV', + 'argumentCount' => '3' + ), + 'YEAR' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::YEAR', + 'argumentCount' => '1' + ), + 'YEARFRAC' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_DATE_AND_TIME, + 'functionCall' => 'PHPExcel_Calculation_DateTime::YEARFRAC', + 'argumentCount' => '2,3' + ), + 'YIELD' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Functions::DUMMY', + 'argumentCount' => '6,7' + ), + 'YIELDDISC' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::YIELDDISC', + 'argumentCount' => '4,5' + ), + 'YIELDMAT' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_FINANCIAL, + 'functionCall' => 'PHPExcel_Calculation_Financial::YIELDMAT', + 'argumentCount' => '5,6' + ), + 'ZTEST' => array( + 'category' => PHPExcel_Calculation_Function::CATEGORY_STATISTICAL, + 'functionCall' => 'PHPExcel_Calculation_Statistical::ZTEST', + 'argumentCount' => '2-3' + ) + ); + + // Internal functions used for special control purposes + private static $controlFunctions = array( + 'MKMATRIX' => array( + 'argumentCount' => '*', + 'functionCall' => 'self::mkMatrix' + ) + ); + + + public function __construct(PHPExcel $workbook = null) + { + $this->delta = 1 * pow(10, 0 - ini_get('precision')); + + $this->workbook = $workbook; + $this->cyclicReferenceStack = new PHPExcel_CalcEngine_CyclicReferenceStack(); + $this->_debugLog = new PHPExcel_CalcEngine_Logger($this->cyclicReferenceStack); + } + + + private static function loadLocales() + { + $localeFileDirectory = PHPEXCEL_ROOT.'PHPExcel/locale/'; + foreach (glob($localeFileDirectory.'/*', GLOB_ONLYDIR) as $filename) { + $filename = substr($filename, strlen($localeFileDirectory)+1); + if ($filename != 'en') { + self::$validLocaleLanguages[] = $filename; + } + } + } + + /** + * Get an instance of this class + * + * @access public + * @param PHPExcel $workbook Injected workbook for working with a PHPExcel object, + * or NULL to create a standalone claculation engine + * @return PHPExcel_Calculation + */ + public static function getInstance(PHPExcel $workbook = null) + { + if ($workbook !== null) { + $instance = $workbook->getCalculationEngine(); + if (isset($instance)) { + return $instance; + } + } + + if (!isset(self::$instance) || (self::$instance === null)) { + self::$instance = new PHPExcel_Calculation(); + } + return self::$instance; + } + + /** + * Unset an instance of this class + * + * @access public + */ + public function __destruct() + { + $this->workbook = null; + } + + /** + * Flush the calculation cache for any existing instance of this class + * but only if a PHPExcel_Calculation instance exists + * + * @access public + * @return null + */ + public function flushInstance() + { + $this->clearCalculationCache(); + } + + + /** + * Get the debuglog for this claculation engine instance + * + * @access public + * @return PHPExcel_CalcEngine_Logger + */ + public function getDebugLog() + { + return $this->_debugLog; + } + + /** + * __clone implementation. Cloning should not be allowed in a Singleton! + * + * @access public + * @throws PHPExcel_Calculation_Exception + */ + final public function __clone() + { + throw new PHPExcel_Calculation_Exception('Cloning the calculation engine is not allowed!'); + } + + + /** + * Return the locale-specific translation of TRUE + * + * @access public + * @return string locale-specific translation of TRUE + */ + public static function getTRUE() + { + return self::$localeBoolean['TRUE']; + } + + /** + * Return the locale-specific translation of FALSE + * + * @access public + * @return string locale-specific translation of FALSE + */ + public static function getFALSE() + { + return self::$localeBoolean['FALSE']; + } + + /** + * Set the Array Return Type (Array or Value of first element in the array) + * + * @access public + * @param string $returnType Array return type + * @return boolean Success or failure + */ + public static function setArrayReturnType($returnType) + { + if (($returnType == self::RETURN_ARRAY_AS_VALUE) || + ($returnType == self::RETURN_ARRAY_AS_ERROR) || + ($returnType == self::RETURN_ARRAY_AS_ARRAY)) { + self::$returnArrayAsType = $returnType; + return true; + } + return false; + } + + + /** + * Return the Array Return Type (Array or Value of first element in the array) + * + * @access public + * @return string $returnType Array return type + */ + public static function getArrayReturnType() + { + return self::$returnArrayAsType; + } + + + /** + * Is calculation caching enabled? + * + * @access public + * @return boolean + */ + public function getCalculationCacheEnabled() + { + return $this->calculationCacheEnabled; + } + + /** + * Enable/disable calculation cache + * + * @access public + * @param boolean $pValue + */ + public function setCalculationCacheEnabled($pValue = true) + { + $this->calculationCacheEnabled = $pValue; + $this->clearCalculationCache(); + } + + + /** + * Enable calculation cache + */ + public function enableCalculationCache() + { + $this->setCalculationCacheEnabled(true); + } + + + /** + * Disable calculation cache + */ + public function disableCalculationCache() + { + $this->setCalculationCacheEnabled(false); + } + + + /** + * Clear calculation cache + */ + public function clearCalculationCache() + { + $this->calculationCache = array(); + } + + /** + * Clear calculation cache for a specified worksheet + * + * @param string $worksheetName + */ + public function clearCalculationCacheForWorksheet($worksheetName) + { + if (isset($this->calculationCache[$worksheetName])) { + unset($this->calculationCache[$worksheetName]); + } + } + + /** + * Rename calculation cache for a specified worksheet + * + * @param string $fromWorksheetName + * @param string $toWorksheetName + */ + public function renameCalculationCacheForWorksheet($fromWorksheetName, $toWorksheetName) + { + if (isset($this->calculationCache[$fromWorksheetName])) { + $this->calculationCache[$toWorksheetName] = &$this->calculationCache[$fromWorksheetName]; + unset($this->calculationCache[$fromWorksheetName]); + } + } + + + /** + * Get the currently defined locale code + * + * @return string + */ + public function getLocale() + { + return self::$localeLanguage; + } + + + /** + * Set the locale code + * + * @param string $locale The locale to use for formula translation + * @return boolean + */ + public function setLocale($locale = 'en_us') + { + // Identify our locale and language + $language = $locale = strtolower($locale); + if (strpos($locale, '_') !== false) { + list($language) = explode('_', $locale); + } + + if (count(self::$validLocaleLanguages) == 1) { + self::loadLocales(); + } + // Test whether we have any language data for this language (any locale) + if (in_array($language, self::$validLocaleLanguages)) { + // initialise language/locale settings + self::$localeFunctions = array(); + self::$localeArgumentSeparator = ','; + self::$localeBoolean = array('TRUE' => 'TRUE', 'FALSE' => 'FALSE', 'NULL' => 'NULL'); + // Default is English, if user isn't requesting english, then read the necessary data from the locale files + if ($locale != 'en_us') { + // Search for a file with a list of function names for locale + $functionNamesFile = PHPEXCEL_ROOT . 'PHPExcel'.DIRECTORY_SEPARATOR.'locale'.DIRECTORY_SEPARATOR.str_replace('_', DIRECTORY_SEPARATOR, $locale).DIRECTORY_SEPARATOR.'functions'; + if (!file_exists($functionNamesFile)) { + // If there isn't a locale specific function file, look for a language specific function file + $functionNamesFile = PHPEXCEL_ROOT . 'PHPExcel'.DIRECTORY_SEPARATOR.'locale'.DIRECTORY_SEPARATOR.$language.DIRECTORY_SEPARATOR.'functions'; + if (!file_exists($functionNamesFile)) { + return false; + } + } + // Retrieve the list of locale or language specific function names + $localeFunctions = file($functionNamesFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + foreach ($localeFunctions as $localeFunction) { + list($localeFunction) = explode('##', $localeFunction); // Strip out comments + if (strpos($localeFunction, '=') !== false) { + list($fName, $lfName) = explode('=', $localeFunction); + $fName = trim($fName); + $lfName = trim($lfName); + if ((isset(self::$PHPExcelFunctions[$fName])) && ($lfName != '') && ($fName != $lfName)) { + self::$localeFunctions[$fName] = $lfName; + } + } + } + // Default the TRUE and FALSE constants to the locale names of the TRUE() and FALSE() functions + if (isset(self::$localeFunctions['TRUE'])) { + self::$localeBoolean['TRUE'] = self::$localeFunctions['TRUE']; + } + if (isset(self::$localeFunctions['FALSE'])) { + self::$localeBoolean['FALSE'] = self::$localeFunctions['FALSE']; + } + + $configFile = PHPEXCEL_ROOT . 'PHPExcel'.DIRECTORY_SEPARATOR.'locale'.DIRECTORY_SEPARATOR.str_replace('_', DIRECTORY_SEPARATOR, $locale).DIRECTORY_SEPARATOR.'config'; + if (!file_exists($configFile)) { + $configFile = PHPEXCEL_ROOT . 'PHPExcel'.DIRECTORY_SEPARATOR.'locale'.DIRECTORY_SEPARATOR.$language.DIRECTORY_SEPARATOR.'config'; + } + if (file_exists($configFile)) { + $localeSettings = file($configFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); + foreach ($localeSettings as $localeSetting) { + list($localeSetting) = explode('##', $localeSetting); // Strip out comments + if (strpos($localeSetting, '=') !== false) { + list($settingName, $settingValue) = explode('=', $localeSetting); + $settingName = strtoupper(trim($settingName)); + switch ($settingName) { + case 'ARGUMENTSEPARATOR': + self::$localeArgumentSeparator = trim($settingValue); + break; + } + } + } + } + } + + self::$functionReplaceFromExcel = self::$functionReplaceToExcel = + self::$functionReplaceFromLocale = self::$functionReplaceToLocale = null; + self::$localeLanguage = $locale; + return true; + } + return false; + } + + + + public static function translateSeparator($fromSeparator, $toSeparator, $formula, &$inBraces) + { + $strlen = mb_strlen($formula); + for ($i = 0; $i < $strlen; ++$i) { + $chr = mb_substr($formula, $i, 1); + switch ($chr) { + case '{': + $inBraces = true; + break; + case '}': + $inBraces = false; + break; + case $fromSeparator: + if (!$inBraces) { + $formula = mb_substr($formula, 0, $i).$toSeparator.mb_substr($formula, $i+1); + } + } + } + return $formula; + } + + private static function translateFormula($from, $to, $formula, $fromSeparator, $toSeparator) + { + // Convert any Excel function names to the required language + if (self::$localeLanguage !== 'en_us') { + $inBraces = false; + // If there is the possibility of braces within a quoted string, then we don't treat those as matrix indicators + if (strpos($formula, '"') !== false) { + // So instead we skip replacing in any quoted strings by only replacing in every other array element after we've exploded + // the formula + $temp = explode('"', $formula); + $i = false; + foreach ($temp as &$value) { + // Only count/replace in alternating array entries + if ($i = !$i) { + $value = preg_replace($from, $to, $value); + $value = self::translateSeparator($fromSeparator, $toSeparator, $value, $inBraces); + } + } + unset($value); + // Then rebuild the formula string + $formula = implode('"', $temp); + } else { + // If there's no quoted strings, then we do a simple count/replace + $formula = preg_replace($from, $to, $formula); + $formula = self::translateSeparator($fromSeparator, $toSeparator, $formula, $inBraces); + } + } + + return $formula; + } + + private static $functionReplaceFromExcel = null; + private static $functionReplaceToLocale = null; + + public function _translateFormulaToLocale($formula) + { + if (self::$functionReplaceFromExcel === null) { + self::$functionReplaceFromExcel = array(); + foreach (array_keys(self::$localeFunctions) as $excelFunctionName) { + self::$functionReplaceFromExcel[] = '/(@?[^\w\.])'.preg_quote($excelFunctionName).'([\s]*\()/Ui'; + } + foreach (array_keys(self::$localeBoolean) as $excelBoolean) { + self::$functionReplaceFromExcel[] = '/(@?[^\w\.])'.preg_quote($excelBoolean).'([^\w\.])/Ui'; + } + + } + + if (self::$functionReplaceToLocale === null) { + self::$functionReplaceToLocale = array(); + foreach (array_values(self::$localeFunctions) as $localeFunctionName) { + self::$functionReplaceToLocale[] = '$1'.trim($localeFunctionName).'$2'; + } + foreach (array_values(self::$localeBoolean) as $localeBoolean) { + self::$functionReplaceToLocale[] = '$1'.trim($localeBoolean).'$2'; + } + } + + return self::translateFormula(self::$functionReplaceFromExcel, self::$functionReplaceToLocale, $formula, ',', self::$localeArgumentSeparator); + } + + + private static $functionReplaceFromLocale = null; + private static $functionReplaceToExcel = null; + + public function _translateFormulaToEnglish($formula) + { + if (self::$functionReplaceFromLocale === null) { + self::$functionReplaceFromLocale = array(); + foreach (array_values(self::$localeFunctions) as $localeFunctionName) { + self::$functionReplaceFromLocale[] = '/(@?[^\w\.])'.preg_quote($localeFunctionName).'([\s]*\()/Ui'; + } + foreach (array_values(self::$localeBoolean) as $excelBoolean) { + self::$functionReplaceFromLocale[] = '/(@?[^\w\.])'.preg_quote($excelBoolean).'([^\w\.])/Ui'; + } + } + + if (self::$functionReplaceToExcel === null) { + self::$functionReplaceToExcel = array(); + foreach (array_keys(self::$localeFunctions) as $excelFunctionName) { + self::$functionReplaceToExcel[] = '$1'.trim($excelFunctionName).'$2'; + } + foreach (array_keys(self::$localeBoolean) as $excelBoolean) { + self::$functionReplaceToExcel[] = '$1'.trim($excelBoolean).'$2'; + } + } + + return self::translateFormula(self::$functionReplaceFromLocale, self::$functionReplaceToExcel, $formula, self::$localeArgumentSeparator, ','); + } + + + public static function localeFunc($function) + { + if (self::$localeLanguage !== 'en_us') { + $functionName = trim($function, '('); + if (isset(self::$localeFunctions[$functionName])) { + $brace = ($functionName != $function); + $function = self::$localeFunctions[$functionName]; + if ($brace) { + $function .= '('; + } + } + } + return $function; + } + + + + + /** + * Wrap string values in quotes + * + * @param mixed $value + * @return mixed + */ + public static function wrapResult($value) + { + if (is_string($value)) { + // Error values cannot be "wrapped" + if (preg_match('/^'.self::CALCULATION_REGEXP_ERROR.'$/i', $value, $match)) { + // Return Excel errors "as is" + return $value; + } + // Return strings wrapped in quotes + return '"'.$value.'"'; + // Convert numeric errors to NaN error + } elseif ((is_float($value)) && ((is_nan($value)) || (is_infinite($value)))) { + return PHPExcel_Calculation_Functions::NaN(); + } + + return $value; + } + + + /** + * Remove quotes used as a wrapper to identify string values + * + * @param mixed $value + * @return mixed + */ + public static function unwrapResult($value) + { + if (is_string($value)) { + if ((isset($value{0})) && ($value{0} == '"') && (substr($value, -1) == '"')) { + return substr($value, 1, -1); + } + // Convert numeric errors to NaN error + } elseif ((is_float($value)) && ((is_nan($value)) || (is_infinite($value)))) { + return PHPExcel_Calculation_Functions::NaN(); + } + return $value; + } + + + + + /** + * Calculate cell value (using formula from a cell ID) + * Retained for backward compatibility + * + * @access public + * @param PHPExcel_Cell $pCell Cell to calculate + * @return mixed + * @throws PHPExcel_Calculation_Exception + */ + public function calculate(PHPExcel_Cell $pCell = null) + { + try { + return $this->calculateCellValue($pCell); + } catch (PHPExcel_Exception $e) { + throw new PHPExcel_Calculation_Exception($e->getMessage()); + } + } + + + /** + * Calculate the value of a cell formula + * + * @access public + * @param PHPExcel_Cell $pCell Cell to calculate + * @param Boolean $resetLog Flag indicating whether the debug log should be reset or not + * @return mixed + * @throws PHPExcel_Calculation_Exception + */ + public function calculateCellValue(PHPExcel_Cell $pCell = null, $resetLog = true) + { + if ($pCell === null) { + return null; + } + + $returnArrayAsType = self::$returnArrayAsType; + if ($resetLog) { + // Initialise the logging settings if requested + $this->formulaError = null; + $this->_debugLog->clearLog(); + $this->cyclicReferenceStack->clear(); + $this->cyclicFormulaCounter = 1; + + self::$returnArrayAsType = self::RETURN_ARRAY_AS_ARRAY; + } + + // Execute the calculation for the cell formula + $this->cellStack[] = array( + 'sheet' => $pCell->getWorksheet()->getTitle(), + 'cell' => $pCell->getCoordinate(), + ); + try { + $result = self::unwrapResult($this->_calculateFormulaValue($pCell->getValue(), $pCell->getCoordinate(), $pCell)); + $cellAddress = array_pop($this->cellStack); + $this->workbook->getSheetByName($cellAddress['sheet'])->getCell($cellAddress['cell']); + } catch (PHPExcel_Exception $e) { + $cellAddress = array_pop($this->cellStack); + $this->workbook->getSheetByName($cellAddress['sheet'])->getCell($cellAddress['cell']); + throw new PHPExcel_Calculation_Exception($e->getMessage()); + } + + if ((is_array($result)) && (self::$returnArrayAsType != self::RETURN_ARRAY_AS_ARRAY)) { + self::$returnArrayAsType = $returnArrayAsType; + $testResult = PHPExcel_Calculation_Functions::flattenArray($result); + if (self::$returnArrayAsType == self::RETURN_ARRAY_AS_ERROR) { + return PHPExcel_Calculation_Functions::VALUE(); + } + // If there's only a single cell in the array, then we allow it + if (count($testResult) != 1) { + // If keys are numeric, then it's a matrix result rather than a cell range result, so we permit it + $r = array_keys($result); + $r = array_shift($r); + if (!is_numeric($r)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (is_array($result[$r])) { + $c = array_keys($result[$r]); + $c = array_shift($c); + if (!is_numeric($c)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + } + $result = array_shift($testResult); + } + self::$returnArrayAsType = $returnArrayAsType; + + + if ($result === null) { + return 0; + } elseif ((is_float($result)) && ((is_nan($result)) || (is_infinite($result)))) { + return PHPExcel_Calculation_Functions::NaN(); + } + return $result; + } + + + /** + * Validate and parse a formula string + * + * @param string $formula Formula to parse + * @return array + * @throws PHPExcel_Calculation_Exception + */ + public function parseFormula($formula) + { + // Basic validation that this is indeed a formula + // We return an empty array if not + $formula = trim($formula); + if ((!isset($formula{0})) || ($formula{0} != '=')) { + return array(); + } + $formula = ltrim(substr($formula, 1)); + if (!isset($formula{0})) { + return array(); + } + + // Parse the formula and return the token stack + return $this->_parseFormula($formula); + } + + + /** + * Calculate the value of a formula + * + * @param string $formula Formula to parse + * @param string $cellID Address of the cell to calculate + * @param PHPExcel_Cell $pCell Cell to calculate + * @return mixed + * @throws PHPExcel_Calculation_Exception + */ + public function calculateFormula($formula, $cellID = null, PHPExcel_Cell $pCell = null) + { + // Initialise the logging settings + $this->formulaError = null; + $this->_debugLog->clearLog(); + $this->cyclicReferenceStack->clear(); + + if ($this->workbook !== null && $cellID === null && $pCell === null) { + $cellID = 'A1'; + $pCell = $this->workbook->getActiveSheet()->getCell($cellID); + } else { + // Disable calculation cacheing because it only applies to cell calculations, not straight formulae + // But don't actually flush any cache + $resetCache = $this->getCalculationCacheEnabled(); + $this->calculationCacheEnabled = false; + } + + // Execute the calculation + try { + $result = self::unwrapResult($this->_calculateFormulaValue($formula, $cellID, $pCell)); + } catch (PHPExcel_Exception $e) { + throw new PHPExcel_Calculation_Exception($e->getMessage()); + } + + if ($this->workbook === null) { + // Reset calculation cacheing to its previous state + $this->calculationCacheEnabled = $resetCache; + } + + return $result; + } + + + public function getValueFromCache($cellReference, &$cellValue) + { + // Is calculation cacheing enabled? + // Is the value present in calculation cache? + $this->_debugLog->writeDebugLog('Testing cache value for cell ', $cellReference); + if (($this->calculationCacheEnabled) && (isset($this->calculationCache[$cellReference]))) { + $this->_debugLog->writeDebugLog('Retrieving value for cell ', $cellReference, ' from cache'); + // Return the cached result + $cellValue = $this->calculationCache[$cellReference]; + return true; + } + return false; + } + + public function saveValueToCache($cellReference, $cellValue) + { + if ($this->calculationCacheEnabled) { + $this->calculationCache[$cellReference] = $cellValue; + } + } + + /** + * Parse a cell formula and calculate its value + * + * @param string $formula The formula to parse and calculate + * @param string $cellID The ID (e.g. A3) of the cell that we are calculating + * @param PHPExcel_Cell $pCell Cell to calculate + * @return mixed + * @throws PHPExcel_Calculation_Exception + */ + public function _calculateFormulaValue($formula, $cellID = null, PHPExcel_Cell $pCell = null) + { + $cellValue = null; + + // Basic validation that this is indeed a formula + // We simply return the cell value if not + $formula = trim($formula); + if ($formula{0} != '=') { + return self::wrapResult($formula); + } + $formula = ltrim(substr($formula, 1)); + if (!isset($formula{0})) { + return self::wrapResult($formula); + } + + $pCellParent = ($pCell !== null) ? $pCell->getWorksheet() : null; + $wsTitle = ($pCellParent !== null) ? $pCellParent->getTitle() : "\x00Wrk"; + $wsCellReference = $wsTitle . '!' . $cellID; + + if (($cellID !== null) && ($this->getValueFromCache($wsCellReference, $cellValue))) { + return $cellValue; + } + + if (($wsTitle{0} !== "\x00") && ($this->cyclicReferenceStack->onStack($wsCellReference))) { + if ($this->cyclicFormulaCount <= 0) { + $this->cyclicFormulaCell = ''; + return $this->raiseFormulaError('Cyclic Reference in Formula'); + } elseif ($this->cyclicFormulaCell === $wsCellReference) { + ++$this->cyclicFormulaCounter; + if ($this->cyclicFormulaCounter >= $this->cyclicFormulaCount) { + $this->cyclicFormulaCell = ''; + return $cellValue; + } + } elseif ($this->cyclicFormulaCell == '') { + if ($this->cyclicFormulaCounter >= $this->cyclicFormulaCount) { + return $cellValue; + } + $this->cyclicFormulaCell = $wsCellReference; + } + } + + // Parse the formula onto the token stack and calculate the value + $this->cyclicReferenceStack->push($wsCellReference); + $cellValue = $this->processTokenStack($this->_parseFormula($formula, $pCell), $cellID, $pCell); + $this->cyclicReferenceStack->pop(); + + // Save to calculation cache + if ($cellID !== null) { + $this->saveValueToCache($wsCellReference, $cellValue); + } + + // Return the calculated value + return $cellValue; + } + + + /** + * Ensure that paired matrix operands are both matrices and of the same size + * + * @param mixed &$operand1 First matrix operand + * @param mixed &$operand2 Second matrix operand + * @param integer $resize Flag indicating whether the matrices should be resized to match + * and (if so), whether the smaller dimension should grow or the + * larger should shrink. + * 0 = no resize + * 1 = shrink to fit + * 2 = extend to fit + */ + private static function checkMatrixOperands(&$operand1, &$operand2, $resize = 1) + { + // Examine each of the two operands, and turn them into an array if they aren't one already + // Note that this function should only be called if one or both of the operand is already an array + if (!is_array($operand1)) { + list($matrixRows, $matrixColumns) = self::getMatrixDimensions($operand2); + $operand1 = array_fill(0, $matrixRows, array_fill(0, $matrixColumns, $operand1)); + $resize = 0; + } elseif (!is_array($operand2)) { + list($matrixRows, $matrixColumns) = self::getMatrixDimensions($operand1); + $operand2 = array_fill(0, $matrixRows, array_fill(0, $matrixColumns, $operand2)); + $resize = 0; + } + + list($matrix1Rows, $matrix1Columns) = self::getMatrixDimensions($operand1); + list($matrix2Rows, $matrix2Columns) = self::getMatrixDimensions($operand2); + if (($matrix1Rows == $matrix2Columns) && ($matrix2Rows == $matrix1Columns)) { + $resize = 1; + } + + if ($resize == 2) { + // Given two matrices of (potentially) unequal size, convert the smaller in each dimension to match the larger + self::resizeMatricesExtend($operand1, $operand2, $matrix1Rows, $matrix1Columns, $matrix2Rows, $matrix2Columns); + } elseif ($resize == 1) { + // Given two matrices of (potentially) unequal size, convert the larger in each dimension to match the smaller + self::resizeMatricesShrink($operand1, $operand2, $matrix1Rows, $matrix1Columns, $matrix2Rows, $matrix2Columns); + } + return array( $matrix1Rows, $matrix1Columns, $matrix2Rows, $matrix2Columns); + } + + + /** + * Read the dimensions of a matrix, and re-index it with straight numeric keys starting from row 0, column 0 + * + * @param mixed &$matrix matrix operand + * @return array An array comprising the number of rows, and number of columns + */ + private static function getMatrixDimensions(&$matrix) + { + $matrixRows = count($matrix); + $matrixColumns = 0; + foreach ($matrix as $rowKey => $rowValue) { + $matrixColumns = max(count($rowValue), $matrixColumns); + if (!is_array($rowValue)) { + $matrix[$rowKey] = array($rowValue); + } else { + $matrix[$rowKey] = array_values($rowValue); + } + } + $matrix = array_values($matrix); + return array($matrixRows, $matrixColumns); + } + + + /** + * Ensure that paired matrix operands are both matrices of the same size + * + * @param mixed &$matrix1 First matrix operand + * @param mixed &$matrix2 Second matrix operand + * @param integer $matrix1Rows Row size of first matrix operand + * @param integer $matrix1Columns Column size of first matrix operand + * @param integer $matrix2Rows Row size of second matrix operand + * @param integer $matrix2Columns Column size of second matrix operand + */ + private static function resizeMatricesShrink(&$matrix1, &$matrix2, $matrix1Rows, $matrix1Columns, $matrix2Rows, $matrix2Columns) + { + if (($matrix2Columns < $matrix1Columns) || ($matrix2Rows < $matrix1Rows)) { + if ($matrix2Rows < $matrix1Rows) { + for ($i = $matrix2Rows; $i < $matrix1Rows; ++$i) { + unset($matrix1[$i]); + } + } + if ($matrix2Columns < $matrix1Columns) { + for ($i = 0; $i < $matrix1Rows; ++$i) { + for ($j = $matrix2Columns; $j < $matrix1Columns; ++$j) { + unset($matrix1[$i][$j]); + } + } + } + } + + if (($matrix1Columns < $matrix2Columns) || ($matrix1Rows < $matrix2Rows)) { + if ($matrix1Rows < $matrix2Rows) { + for ($i = $matrix1Rows; $i < $matrix2Rows; ++$i) { + unset($matrix2[$i]); + } + } + if ($matrix1Columns < $matrix2Columns) { + for ($i = 0; $i < $matrix2Rows; ++$i) { + for ($j = $matrix1Columns; $j < $matrix2Columns; ++$j) { + unset($matrix2[$i][$j]); + } + } + } + } + } + + + /** + * Ensure that paired matrix operands are both matrices of the same size + * + * @param mixed &$matrix1 First matrix operand + * @param mixed &$matrix2 Second matrix operand + * @param integer $matrix1Rows Row size of first matrix operand + * @param integer $matrix1Columns Column size of first matrix operand + * @param integer $matrix2Rows Row size of second matrix operand + * @param integer $matrix2Columns Column size of second matrix operand + */ + private static function resizeMatricesExtend(&$matrix1, &$matrix2, $matrix1Rows, $matrix1Columns, $matrix2Rows, $matrix2Columns) + { + if (($matrix2Columns < $matrix1Columns) || ($matrix2Rows < $matrix1Rows)) { + if ($matrix2Columns < $matrix1Columns) { + for ($i = 0; $i < $matrix2Rows; ++$i) { + $x = $matrix2[$i][$matrix2Columns-1]; + for ($j = $matrix2Columns; $j < $matrix1Columns; ++$j) { + $matrix2[$i][$j] = $x; + } + } + } + if ($matrix2Rows < $matrix1Rows) { + $x = $matrix2[$matrix2Rows-1]; + for ($i = 0; $i < $matrix1Rows; ++$i) { + $matrix2[$i] = $x; + } + } + } + + if (($matrix1Columns < $matrix2Columns) || ($matrix1Rows < $matrix2Rows)) { + if ($matrix1Columns < $matrix2Columns) { + for ($i = 0; $i < $matrix1Rows; ++$i) { + $x = $matrix1[$i][$matrix1Columns-1]; + for ($j = $matrix1Columns; $j < $matrix2Columns; ++$j) { + $matrix1[$i][$j] = $x; + } + } + } + if ($matrix1Rows < $matrix2Rows) { + $x = $matrix1[$matrix1Rows-1]; + for ($i = 0; $i < $matrix2Rows; ++$i) { + $matrix1[$i] = $x; + } + } + } + } + + + /** + * Format details of an operand for display in the log (based on operand type) + * + * @param mixed $value First matrix operand + * @return mixed + */ + private function showValue($value) + { + if ($this->_debugLog->getWriteDebugLog()) { + $testArray = PHPExcel_Calculation_Functions::flattenArray($value); + if (count($testArray) == 1) { + $value = array_pop($testArray); + } + + if (is_array($value)) { + $returnMatrix = array(); + $pad = $rpad = ', '; + foreach ($value as $row) { + if (is_array($row)) { + $returnMatrix[] = implode($pad, array_map(array($this, 'showValue'), $row)); + $rpad = '; '; + } else { + $returnMatrix[] = $this->showValue($row); + } + } + return '{ '.implode($rpad, $returnMatrix).' }'; + } elseif (is_string($value) && (trim($value, '"') == $value)) { + return '"'.$value.'"'; + } elseif (is_bool($value)) { + return ($value) ? self::$localeBoolean['TRUE'] : self::$localeBoolean['FALSE']; + } + } + return PHPExcel_Calculation_Functions::flattenSingleValue($value); + } + + + /** + * Format type and details of an operand for display in the log (based on operand type) + * + * @param mixed $value First matrix operand + * @return mixed + */ + private function showTypeDetails($value) + { + if ($this->_debugLog->getWriteDebugLog()) { + $testArray = PHPExcel_Calculation_Functions::flattenArray($value); + if (count($testArray) == 1) { + $value = array_pop($testArray); + } + + if ($value === null) { + return 'a NULL value'; + } elseif (is_float($value)) { + $typeString = 'a floating point number'; + } elseif (is_int($value)) { + $typeString = 'an integer number'; + } elseif (is_bool($value)) { + $typeString = 'a boolean'; + } elseif (is_array($value)) { + $typeString = 'a matrix'; + } else { + if ($value == '') { + return 'an empty string'; + } elseif ($value{0} == '#') { + return 'a '.$value.' error'; + } else { + $typeString = 'a string'; + } + } + return $typeString.' with a value of '.$this->showValue($value); + } + } + + + private function convertMatrixReferences($formula) + { + static $matrixReplaceFrom = array('{', ';', '}'); + static $matrixReplaceTo = array('MKMATRIX(MKMATRIX(', '),MKMATRIX(', '))'); + + // Convert any Excel matrix references to the MKMATRIX() function + if (strpos($formula, '{') !== false) { + // If there is the possibility of braces within a quoted string, then we don't treat those as matrix indicators + if (strpos($formula, '"') !== false) { + // So instead we skip replacing in any quoted strings by only replacing in every other array element after we've exploded + // the formula + $temp = explode('"', $formula); + // Open and Closed counts used for trapping mismatched braces in the formula + $openCount = $closeCount = 0; + $i = false; + foreach ($temp as &$value) { + // Only count/replace in alternating array entries + if ($i = !$i) { + $openCount += substr_count($value, '{'); + $closeCount += substr_count($value, '}'); + $value = str_replace($matrixReplaceFrom, $matrixReplaceTo, $value); + } + } + unset($value); + // Then rebuild the formula string + $formula = implode('"', $temp); + } else { + // If there's no quoted strings, then we do a simple count/replace + $openCount = substr_count($formula, '{'); + $closeCount = substr_count($formula, '}'); + $formula = str_replace($matrixReplaceFrom, $matrixReplaceTo, $formula); + } + // Trap for mismatched braces and trigger an appropriate error + if ($openCount < $closeCount) { + if ($openCount > 0) { + return $this->raiseFormulaError("Formula Error: Mismatched matrix braces '}'"); + } else { + return $this->raiseFormulaError("Formula Error: Unexpected '}' encountered"); + } + } elseif ($openCount > $closeCount) { + if ($closeCount > 0) { + return $this->raiseFormulaError("Formula Error: Mismatched matrix braces '{'"); + } else { + return $this->raiseFormulaError("Formula Error: Unexpected '{' encountered"); + } + } + } + + return $formula; + } + + + private static function mkMatrix() + { + return func_get_args(); + } + + + // Binary Operators + // These operators always work on two values + // Array key is the operator, the value indicates whether this is a left or right associative operator + private static $operatorAssociativity = array( + '^' => 0, // Exponentiation + '*' => 0, '/' => 0, // Multiplication and Division + '+' => 0, '-' => 0, // Addition and Subtraction + '&' => 0, // Concatenation + '|' => 0, ':' => 0, // Intersect and Range + '>' => 0, '<' => 0, '=' => 0, '>=' => 0, '<=' => 0, '<>' => 0 // Comparison + ); + + // Comparison (Boolean) Operators + // These operators work on two values, but always return a boolean result + private static $comparisonOperators = array('>' => true, '<' => true, '=' => true, '>=' => true, '<=' => true, '<>' => true); + + // Operator Precedence + // This list includes all valid operators, whether binary (including boolean) or unary (such as %) + // Array key is the operator, the value is its precedence + private static $operatorPrecedence = array( + ':' => 8, // Range + '|' => 7, // Intersect + '~' => 6, // Negation + '%' => 5, // Percentage + '^' => 4, // Exponentiation + '*' => 3, '/' => 3, // Multiplication and Division + '+' => 2, '-' => 2, // Addition and Subtraction + '&' => 1, // Concatenation + '>' => 0, '<' => 0, '=' => 0, '>=' => 0, '<=' => 0, '<>' => 0 // Comparison + ); + + // Convert infix to postfix notation + private function _parseFormula($formula, PHPExcel_Cell $pCell = null) + { + if (($formula = $this->convertMatrixReferences(trim($formula))) === false) { + return false; + } + + // If we're using cell caching, then $pCell may well be flushed back to the cache (which detaches the parent worksheet), + // so we store the parent worksheet so that we can re-attach it when necessary + $pCellParent = ($pCell !== null) ? $pCell->getWorksheet() : null; + + $regexpMatchString = '/^('.self::CALCULATION_REGEXP_FUNCTION. + '|'.self::CALCULATION_REGEXP_CELLREF. + '|'.self::CALCULATION_REGEXP_NUMBER. + '|'.self::CALCULATION_REGEXP_STRING. + '|'.self::CALCULATION_REGEXP_OPENBRACE. + '|'.self::CALCULATION_REGEXP_NAMEDRANGE. + '|'.self::CALCULATION_REGEXP_ERROR. + ')/si'; + + // Start with initialisation + $index = 0; + $stack = new PHPExcel_Calculation_Token_Stack; + $output = array(); + $expectingOperator = false; // We use this test in syntax-checking the expression to determine when a + // - is a negation or + is a positive operator rather than an operation + $expectingOperand = false; // We use this test in syntax-checking the expression to determine whether an operand + // should be null in a function call + // The guts of the lexical parser + // Loop through the formula extracting each operator and operand in turn + while (true) { +//echo 'Assessing Expression '.substr($formula, $index), PHP_EOL; + $opCharacter = $formula{$index}; // Get the first character of the value at the current index position +//echo 'Initial character of expression block is '.$opCharacter, PHP_EOL; + if ((isset(self::$comparisonOperators[$opCharacter])) && (strlen($formula) > $index) && (isset(self::$comparisonOperators[$formula{$index+1}]))) { + $opCharacter .= $formula{++$index}; +//echo 'Initial character of expression block is comparison operator '.$opCharacter.PHP_EOL; + } + + // Find out if we're currently at the beginning of a number, variable, cell reference, function, parenthesis or operand + $isOperandOrFunction = preg_match($regexpMatchString, substr($formula, $index), $match); +//echo '$isOperandOrFunction is '.(($isOperandOrFunction) ? 'True' : 'False').PHP_EOL; +//var_dump($match); + + if ($opCharacter == '-' && !$expectingOperator) { // Is it a negation instead of a minus? +//echo 'Element is a Negation operator', PHP_EOL; + $stack->push('Unary Operator', '~'); // Put a negation on the stack + ++$index; // and drop the negation symbol + } elseif ($opCharacter == '%' && $expectingOperator) { +//echo 'Element is a Percentage operator', PHP_EOL; + $stack->push('Unary Operator', '%'); // Put a percentage on the stack + ++$index; + } elseif ($opCharacter == '+' && !$expectingOperator) { // Positive (unary plus rather than binary operator plus) can be discarded? +//echo 'Element is a Positive number, not Plus operator', PHP_EOL; + ++$index; // Drop the redundant plus symbol + } elseif ((($opCharacter == '~') || ($opCharacter == '|')) && (!$isOperandOrFunction)) { // We have to explicitly deny a tilde or pipe, because they are legal + return $this->raiseFormulaError("Formula Error: Illegal character '~'"); // on the stack but not in the input expression + + } elseif ((isset(self::$operators[$opCharacter]) or $isOperandOrFunction) && $expectingOperator) { // Are we putting an operator on the stack? +//echo 'Element with value '.$opCharacter.' is an Operator', PHP_EOL; + while ($stack->count() > 0 && + ($o2 = $stack->last()) && + isset(self::$operators[$o2['value']]) && + @(self::$operatorAssociativity[$opCharacter] ? self::$operatorPrecedence[$opCharacter] < self::$operatorPrecedence[$o2['value']] : self::$operatorPrecedence[$opCharacter] <= self::$operatorPrecedence[$o2['value']])) { + $output[] = $stack->pop(); // Swap operands and higher precedence operators from the stack to the output + } + $stack->push('Binary Operator', $opCharacter); // Finally put our current operator onto the stack + ++$index; + $expectingOperator = false; + + } elseif ($opCharacter == ')' && $expectingOperator) { // Are we expecting to close a parenthesis? +//echo 'Element is a Closing bracket', PHP_EOL; + $expectingOperand = false; + while (($o2 = $stack->pop()) && $o2['value'] != '(') { // Pop off the stack back to the last ( + if ($o2 === null) { + return $this->raiseFormulaError('Formula Error: Unexpected closing brace ")"'); + } else { + $output[] = $o2; + } + } + $d = $stack->last(2); + if (preg_match('/^'.self::CALCULATION_REGEXP_FUNCTION.'$/i', $d['value'], $matches)) { // Did this parenthesis just close a function? + $functionName = $matches[1]; // Get the function name +//echo 'Closed Function is '.$functionName, PHP_EOL; + $d = $stack->pop(); + $argumentCount = $d['value']; // See how many arguments there were (argument count is the next value stored on the stack) +//if ($argumentCount == 0) { +// echo 'With no arguments', PHP_EOL; +//} elseif ($argumentCount == 1) { +// echo 'With 1 argument', PHP_EOL; +//} else { +// echo 'With '.$argumentCount.' arguments', PHP_EOL; +//} + $output[] = $d; // Dump the argument count on the output + $output[] = $stack->pop(); // Pop the function and push onto the output + if (isset(self::$controlFunctions[$functionName])) { +//echo 'Built-in function '.$functionName, PHP_EOL; + $expectedArgumentCount = self::$controlFunctions[$functionName]['argumentCount']; + $functionCall = self::$controlFunctions[$functionName]['functionCall']; + } elseif (isset(self::$PHPExcelFunctions[$functionName])) { +//echo 'PHPExcel function '.$functionName, PHP_EOL; + $expectedArgumentCount = self::$PHPExcelFunctions[$functionName]['argumentCount']; + $functionCall = self::$PHPExcelFunctions[$functionName]['functionCall']; + } else { // did we somehow push a non-function on the stack? this should never happen + return $this->raiseFormulaError("Formula Error: Internal error, non-function on stack"); + } + // Check the argument count + $argumentCountError = false; + if (is_numeric($expectedArgumentCount)) { + if ($expectedArgumentCount < 0) { +//echo '$expectedArgumentCount is between 0 and '.abs($expectedArgumentCount), PHP_EOL; + if ($argumentCount > abs($expectedArgumentCount)) { + $argumentCountError = true; + $expectedArgumentCountString = 'no more than '.abs($expectedArgumentCount); + } + } else { +//echo '$expectedArgumentCount is numeric '.$expectedArgumentCount, PHP_EOL; + if ($argumentCount != $expectedArgumentCount) { + $argumentCountError = true; + $expectedArgumentCountString = $expectedArgumentCount; + } + } + } elseif ($expectedArgumentCount != '*') { + $isOperandOrFunction = preg_match('/(\d*)([-+,])(\d*)/', $expectedArgumentCount, $argMatch); +//print_r($argMatch); +//echo PHP_EOL; + switch ($argMatch[2]) { + case '+': + if ($argumentCount < $argMatch[1]) { + $argumentCountError = true; + $expectedArgumentCountString = $argMatch[1].' or more '; + } + break; + case '-': + if (($argumentCount < $argMatch[1]) || ($argumentCount > $argMatch[3])) { + $argumentCountError = true; + $expectedArgumentCountString = 'between '.$argMatch[1].' and '.$argMatch[3]; + } + break; + case ',': + if (($argumentCount != $argMatch[1]) && ($argumentCount != $argMatch[3])) { + $argumentCountError = true; + $expectedArgumentCountString = 'either '.$argMatch[1].' or '.$argMatch[3]; + } + break; + } + } + if ($argumentCountError) { + return $this->raiseFormulaError("Formula Error: Wrong number of arguments for $functionName() function: $argumentCount given, ".$expectedArgumentCountString." expected"); + } + } + ++$index; + + } elseif ($opCharacter == ',') { // Is this the separator for function arguments? +//echo 'Element is a Function argument separator', PHP_EOL; + while (($o2 = $stack->pop()) && $o2['value'] != '(') { // Pop off the stack back to the last ( + if ($o2 === null) { + return $this->raiseFormulaError("Formula Error: Unexpected ,"); + } else { + $output[] = $o2; // pop the argument expression stuff and push onto the output + } + } + // If we've a comma when we're expecting an operand, then what we actually have is a null operand; + // so push a null onto the stack + if (($expectingOperand) || (!$expectingOperator)) { + $output[] = array('type' => 'NULL Value', 'value' => self::$excelConstants['NULL'], 'reference' => null); + } + // make sure there was a function + $d = $stack->last(2); + if (!preg_match('/^'.self::CALCULATION_REGEXP_FUNCTION.'$/i', $d['value'], $matches)) { + return $this->raiseFormulaError("Formula Error: Unexpected ,"); + } + $d = $stack->pop(); + $stack->push($d['type'], ++$d['value'], $d['reference']); // increment the argument count + $stack->push('Brace', '('); // put the ( back on, we'll need to pop back to it again + $expectingOperator = false; + $expectingOperand = true; + ++$index; + + } elseif ($opCharacter == '(' && !$expectingOperator) { +// echo 'Element is an Opening Bracket
'; + $stack->push('Brace', '('); + ++$index; + + } elseif ($isOperandOrFunction && !$expectingOperator) { // do we now have a function/variable/number? + $expectingOperator = true; + $expectingOperand = false; + $val = $match[1]; + $length = strlen($val); +// echo 'Element with value '.$val.' is an Operand, Variable, Constant, String, Number, Cell Reference or Function
'; + + if (preg_match('/^'.self::CALCULATION_REGEXP_FUNCTION.'$/i', $val, $matches)) { + $val = preg_replace('/\s/u', '', $val); +// echo 'Element '.$val.' is a Function
'; + if (isset(self::$PHPExcelFunctions[strtoupper($matches[1])]) || isset(self::$controlFunctions[strtoupper($matches[1])])) { // it's a function + $stack->push('Function', strtoupper($val)); + $ax = preg_match('/^\s*(\s*\))/ui', substr($formula, $index+$length), $amatch); + if ($ax) { + $stack->push('Operand Count for Function '.strtoupper($val).')', 0); + $expectingOperator = true; + } else { + $stack->push('Operand Count for Function '.strtoupper($val).')', 1); + $expectingOperator = false; + } + $stack->push('Brace', '('); + } else { // it's a var w/ implicit multiplication + $output[] = array('type' => 'Value', 'value' => $matches[1], 'reference' => null); + } + } elseif (preg_match('/^'.self::CALCULATION_REGEXP_CELLREF.'$/i', $val, $matches)) { +// echo 'Element '.$val.' is a Cell reference
'; + // Watch for this case-change when modifying to allow cell references in different worksheets... + // Should only be applied to the actual cell column, not the worksheet name + + // If the last entry on the stack was a : operator, then we have a cell range reference + $testPrevOp = $stack->last(1); + if ($testPrevOp['value'] == ':') { + // If we have a worksheet reference, then we're playing with a 3D reference + if ($matches[2] == '') { + // Otherwise, we 'inherit' the worksheet reference from the start cell reference + // The start of the cell range reference should be the last entry in $output + $startCellRef = $output[count($output)-1]['value']; + preg_match('/^'.self::CALCULATION_REGEXP_CELLREF.'$/i', $startCellRef, $startMatches); + if ($startMatches[2] > '') { + $val = $startMatches[2].'!'.$val; + } + } else { + return $this->raiseFormulaError("3D Range references are not yet supported"); + } + } + + $output[] = array('type' => 'Cell Reference', 'value' => $val, 'reference' => $val); +// $expectingOperator = FALSE; + } else { // it's a variable, constant, string, number or boolean +// echo 'Element is a Variable, Constant, String, Number or Boolean
'; + // If the last entry on the stack was a : operator, then we may have a row or column range reference + $testPrevOp = $stack->last(1); + if ($testPrevOp['value'] == ':') { + $startRowColRef = $output[count($output)-1]['value']; + $rangeWS1 = ''; + if (strpos('!', $startRowColRef) !== false) { + list($rangeWS1, $startRowColRef) = explode('!', $startRowColRef); + } + if ($rangeWS1 != '') { + $rangeWS1 .= '!'; + } + $rangeWS2 = $rangeWS1; + if (strpos('!', $val) !== false) { + list($rangeWS2, $val) = explode('!', $val); + } + if ($rangeWS2 != '') { + $rangeWS2 .= '!'; + } + if ((is_integer($startRowColRef)) && (ctype_digit($val)) && + ($startRowColRef <= 1048576) && ($val <= 1048576)) { + // Row range + $endRowColRef = ($pCellParent !== null) ? $pCellParent->getHighestColumn() : 'XFD'; // Max 16,384 columns for Excel2007 + $output[count($output)-1]['value'] = $rangeWS1.'A'.$startRowColRef; + $val = $rangeWS2.$endRowColRef.$val; + } elseif ((ctype_alpha($startRowColRef)) && (ctype_alpha($val)) && + (strlen($startRowColRef) <= 3) && (strlen($val) <= 3)) { + // Column range + $endRowColRef = ($pCellParent !== null) ? $pCellParent->getHighestRow() : 1048576; // Max 1,048,576 rows for Excel2007 + $output[count($output)-1]['value'] = $rangeWS1.strtoupper($startRowColRef).'1'; + $val = $rangeWS2.$val.$endRowColRef; + } + } + + $localeConstant = false; + if ($opCharacter == '"') { +// echo 'Element is a String
'; + // UnEscape any quotes within the string + $val = self::wrapResult(str_replace('""', '"', self::unwrapResult($val))); + } elseif (is_numeric($val)) { +// echo 'Element is a Number
'; + if ((strpos($val, '.') !== false) || (stripos($val, 'e') !== false) || ($val > PHP_INT_MAX) || ($val < -PHP_INT_MAX)) { +// echo 'Casting '.$val.' to float
'; + $val = (float) $val; + } else { +// echo 'Casting '.$val.' to integer
'; + $val = (integer) $val; + } + } elseif (isset(self::$excelConstants[trim(strtoupper($val))])) { + $excelConstant = trim(strtoupper($val)); +// echo 'Element '.$excelConstant.' is an Excel Constant
'; + $val = self::$excelConstants[$excelConstant]; + } elseif (($localeConstant = array_search(trim(strtoupper($val)), self::$localeBoolean)) !== false) { +// echo 'Element '.$localeConstant.' is an Excel Constant
'; + $val = self::$excelConstants[$localeConstant]; + } + $details = array('type' => 'Value', 'value' => $val, 'reference' => null); + if ($localeConstant) { + $details['localeValue'] = $localeConstant; + } + $output[] = $details; + } + $index += $length; + + } elseif ($opCharacter == '$') { // absolute row or column range + ++$index; + } elseif ($opCharacter == ')') { // miscellaneous error checking + if ($expectingOperand) { + $output[] = array('type' => 'NULL Value', 'value' => self::$excelConstants['NULL'], 'reference' => null); + $expectingOperand = false; + $expectingOperator = true; + } else { + return $this->raiseFormulaError("Formula Error: Unexpected ')'"); + } + } elseif (isset(self::$operators[$opCharacter]) && !$expectingOperator) { + return $this->raiseFormulaError("Formula Error: Unexpected operator '$opCharacter'"); + } else { // I don't even want to know what you did to get here + return $this->raiseFormulaError("Formula Error: An unexpected error occured"); + } + // Test for end of formula string + if ($index == strlen($formula)) { + // Did we end with an operator?. + // Only valid for the % unary operator + if ((isset(self::$operators[$opCharacter])) && ($opCharacter != '%')) { + return $this->raiseFormulaError("Formula Error: Operator '$opCharacter' has no operands"); + } else { + break; + } + } + // Ignore white space + while (($formula{$index} == "\n") || ($formula{$index} == "\r")) { + ++$index; + } + if ($formula{$index} == ' ') { + while ($formula{$index} == ' ') { + ++$index; + } + // If we're expecting an operator, but only have a space between the previous and next operands (and both are + // Cell References) then we have an INTERSECTION operator +// echo 'Possible Intersect Operator
'; + if (($expectingOperator) && (preg_match('/^'.self::CALCULATION_REGEXP_CELLREF.'.*/Ui', substr($formula, $index), $match)) && + ($output[count($output)-1]['type'] == 'Cell Reference')) { +// echo 'Element is an Intersect Operator
'; + while ($stack->count() > 0 && + ($o2 = $stack->last()) && + isset(self::$operators[$o2['value']]) && + @(self::$operatorAssociativity[$opCharacter] ? self::$operatorPrecedence[$opCharacter] < self::$operatorPrecedence[$o2['value']] : self::$operatorPrecedence[$opCharacter] <= self::$operatorPrecedence[$o2['value']])) { + $output[] = $stack->pop(); // Swap operands and higher precedence operators from the stack to the output + } + $stack->push('Binary Operator', '|'); // Put an Intersect Operator on the stack + $expectingOperator = false; + } + } + } + + while (($op = $stack->pop()) !== null) { // pop everything off the stack and push onto output + if ((is_array($op) && $op['value'] == '(') || ($op === '(')) { + return $this->raiseFormulaError("Formula Error: Expecting ')'"); // if there are any opening braces on the stack, then braces were unbalanced + } + $output[] = $op; + } + return $output; + } + + + private static function dataTestReference(&$operandData) + { + $operand = $operandData['value']; + if (($operandData['reference'] === null) && (is_array($operand))) { + $rKeys = array_keys($operand); + $rowKey = array_shift($rKeys); + $cKeys = array_keys(array_keys($operand[$rowKey])); + $colKey = array_shift($cKeys); + if (ctype_upper($colKey)) { + $operandData['reference'] = $colKey.$rowKey; + } + } + return $operand; + } + + // evaluate postfix notation + private function processTokenStack($tokens, $cellID = null, PHPExcel_Cell $pCell = null) + { + if ($tokens == false) { + return false; + } + + // If we're using cell caching, then $pCell may well be flushed back to the cache (which detaches the parent cell collection), + // so we store the parent cell collection so that we can re-attach it when necessary + $pCellWorksheet = ($pCell !== null) ? $pCell->getWorksheet() : null; + $pCellParent = ($pCell !== null) ? $pCell->getParent() : null; + $stack = new PHPExcel_Calculation_Token_Stack; + + // Loop through each token in turn + foreach ($tokens as $tokenData) { +// print_r($tokenData); +// echo '
'; + $token = $tokenData['value']; +// echo 'Token is '.$token.'
'; + // if the token is a binary operator, pop the top two values off the stack, do the operation, and push the result back on the stack + if (isset(self::$binaryOperators[$token])) { +// echo 'Token is a binary operator
'; + // We must have two operands, error if we don't + if (($operand2Data = $stack->pop()) === null) { + return $this->raiseFormulaError('Internal error - Operand value missing from stack'); + } + if (($operand1Data = $stack->pop()) === null) { + return $this->raiseFormulaError('Internal error - Operand value missing from stack'); + } + + $operand1 = self::dataTestReference($operand1Data); + $operand2 = self::dataTestReference($operand2Data); + + // Log what we're doing + if ($token == ':') { + $this->_debugLog->writeDebugLog('Evaluating Range ', $this->showValue($operand1Data['reference']), ' ', $token, ' ', $this->showValue($operand2Data['reference'])); + } else { + $this->_debugLog->writeDebugLog('Evaluating ', $this->showValue($operand1), ' ', $token, ' ', $this->showValue($operand2)); + } + + // Process the operation in the appropriate manner + switch ($token) { + // Comparison (Boolean) Operators + case '>': // Greater than + case '<': // Less than + case '>=': // Greater than or Equal to + case '<=': // Less than or Equal to + case '=': // Equality + case '<>': // Inequality + $this->executeBinaryComparisonOperation($cellID, $operand1, $operand2, $token, $stack); + break; + // Binary Operators + case ':': // Range + $sheet1 = $sheet2 = ''; + if (strpos($operand1Data['reference'], '!') !== false) { + list($sheet1, $operand1Data['reference']) = explode('!', $operand1Data['reference']); + } else { + $sheet1 = ($pCellParent !== null) ? $pCellWorksheet->getTitle() : ''; + } + if (strpos($operand2Data['reference'], '!') !== false) { + list($sheet2, $operand2Data['reference']) = explode('!', $operand2Data['reference']); + } else { + $sheet2 = $sheet1; + } + if ($sheet1 == $sheet2) { + if ($operand1Data['reference'] === null) { + if ((trim($operand1Data['value']) != '') && (is_numeric($operand1Data['value']))) { + $operand1Data['reference'] = $pCell->getColumn().$operand1Data['value']; + } elseif (trim($operand1Data['reference']) == '') { + $operand1Data['reference'] = $pCell->getCoordinate(); + } else { + $operand1Data['reference'] = $operand1Data['value'].$pCell->getRow(); + } + } + if ($operand2Data['reference'] === null) { + if ((trim($operand2Data['value']) != '') && (is_numeric($operand2Data['value']))) { + $operand2Data['reference'] = $pCell->getColumn().$operand2Data['value']; + } elseif (trim($operand2Data['reference']) == '') { + $operand2Data['reference'] = $pCell->getCoordinate(); + } else { + $operand2Data['reference'] = $operand2Data['value'].$pCell->getRow(); + } + } + + $oData = array_merge(explode(':', $operand1Data['reference']), explode(':', $operand2Data['reference'])); + $oCol = $oRow = array(); + foreach ($oData as $oDatum) { + $oCR = PHPExcel_Cell::coordinateFromString($oDatum); + $oCol[] = PHPExcel_Cell::columnIndexFromString($oCR[0]) - 1; + $oRow[] = $oCR[1]; + } + $cellRef = PHPExcel_Cell::stringFromColumnIndex(min($oCol)).min($oRow).':'.PHPExcel_Cell::stringFromColumnIndex(max($oCol)).max($oRow); + if ($pCellParent !== null) { + $cellValue = $this->extractCellRange($cellRef, $this->workbook->getSheetByName($sheet1), false); + } else { + return $this->raiseFormulaError('Unable to access Cell Reference'); + } + $stack->push('Cell Reference', $cellValue, $cellRef); + } else { + $stack->push('Error', PHPExcel_Calculation_Functions::REF(), null); + } + break; + case '+': // Addition + $this->executeNumericBinaryOperation($cellID, $operand1, $operand2, $token, 'plusEquals', $stack); + break; + case '-': // Subtraction + $this->executeNumericBinaryOperation($cellID, $operand1, $operand2, $token, 'minusEquals', $stack); + break; + case '*': // Multiplication + $this->executeNumericBinaryOperation($cellID, $operand1, $operand2, $token, 'arrayTimesEquals', $stack); + break; + case '/': // Division + $this->executeNumericBinaryOperation($cellID, $operand1, $operand2, $token, 'arrayRightDivide', $stack); + break; + case '^': // Exponential + $this->executeNumericBinaryOperation($cellID, $operand1, $operand2, $token, 'power', $stack); + break; + case '&': // Concatenation + // If either of the operands is a matrix, we need to treat them both as matrices + // (converting the other operand to a matrix if need be); then perform the required + // matrix operation + if (is_bool($operand1)) { + $operand1 = ($operand1) ? self::$localeBoolean['TRUE'] : self::$localeBoolean['FALSE']; + } + if (is_bool($operand2)) { + $operand2 = ($operand2) ? self::$localeBoolean['TRUE'] : self::$localeBoolean['FALSE']; + } + if ((is_array($operand1)) || (is_array($operand2))) { + // Ensure that both operands are arrays/matrices + self::checkMatrixOperands($operand1, $operand2, 2); + try { + // Convert operand 1 from a PHP array to a matrix + $matrix = new PHPExcel_Shared_JAMA_Matrix($operand1); + // Perform the required operation against the operand 1 matrix, passing in operand 2 + $matrixResult = $matrix->concat($operand2); + $result = $matrixResult->getArray(); + } catch (PHPExcel_Exception $ex) { + $this->_debugLog->writeDebugLog('JAMA Matrix Exception: ', $ex->getMessage()); + $result = '#VALUE!'; + } + } else { + $result = '"'.str_replace('""', '"', self::unwrapResult($operand1, '"').self::unwrapResult($operand2, '"')).'"'; + } + $this->_debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails($result)); + $stack->push('Value', $result); + break; + case '|': // Intersect + $rowIntersect = array_intersect_key($operand1, $operand2); + $cellIntersect = $oCol = $oRow = array(); + foreach (array_keys($rowIntersect) as $row) { + $oRow[] = $row; + foreach ($rowIntersect[$row] as $col => $data) { + $oCol[] = PHPExcel_Cell::columnIndexFromString($col) - 1; + $cellIntersect[$row] = array_intersect_key($operand1[$row], $operand2[$row]); + } + } + $cellRef = PHPExcel_Cell::stringFromColumnIndex(min($oCol)).min($oRow).':'.PHPExcel_Cell::stringFromColumnIndex(max($oCol)).max($oRow); + $this->_debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails($cellIntersect)); + $stack->push('Value', $cellIntersect, $cellRef); + break; + } + + // if the token is a unary operator, pop one value off the stack, do the operation, and push it back on + } elseif (($token === '~') || ($token === '%')) { +// echo 'Token is a unary operator
'; + if (($arg = $stack->pop()) === null) { + return $this->raiseFormulaError('Internal error - Operand value missing from stack'); + } + $arg = $arg['value']; + if ($token === '~') { +// echo 'Token is a negation operator
'; + $this->_debugLog->writeDebugLog('Evaluating Negation of ', $this->showValue($arg)); + $multiplier = -1; + } else { +// echo 'Token is a percentile operator
'; + $this->_debugLog->writeDebugLog('Evaluating Percentile of ', $this->showValue($arg)); + $multiplier = 0.01; + } + if (is_array($arg)) { + self::checkMatrixOperands($arg, $multiplier, 2); + try { + $matrix1 = new PHPExcel_Shared_JAMA_Matrix($arg); + $matrixResult = $matrix1->arrayTimesEquals($multiplier); + $result = $matrixResult->getArray(); + } catch (PHPExcel_Exception $ex) { + $this->_debugLog->writeDebugLog('JAMA Matrix Exception: ', $ex->getMessage()); + $result = '#VALUE!'; + } + $this->_debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails($result)); + $stack->push('Value', $result); + } else { + $this->executeNumericBinaryOperation($cellID, $multiplier, $arg, '*', 'arrayTimesEquals', $stack); + } + + } elseif (preg_match('/^'.self::CALCULATION_REGEXP_CELLREF.'$/i', $token, $matches)) { + $cellRef = null; +// echo 'Element '.$token.' is a Cell reference
'; + if (isset($matches[8])) { +// echo 'Reference is a Range of cells
'; + if ($pCell === null) { +// We can't access the range, so return a REF error + $cellValue = PHPExcel_Calculation_Functions::REF(); + } else { + $cellRef = $matches[6].$matches[7].':'.$matches[9].$matches[10]; + if ($matches[2] > '') { + $matches[2] = trim($matches[2], "\"'"); + if ((strpos($matches[2], '[') !== false) || (strpos($matches[2], ']') !== false)) { + // It's a Reference to an external workbook (not currently supported) + return $this->raiseFormulaError('Unable to access External Workbook'); + } + $matches[2] = trim($matches[2], "\"'"); +// echo '$cellRef='.$cellRef.' in worksheet '.$matches[2].'
'; + $this->_debugLog->writeDebugLog('Evaluating Cell Range ', $cellRef, ' in worksheet ', $matches[2]); + if ($pCellParent !== null) { + $cellValue = $this->extractCellRange($cellRef, $this->workbook->getSheetByName($matches[2]), false); + } else { + return $this->raiseFormulaError('Unable to access Cell Reference'); + } + $this->_debugLog->writeDebugLog('Evaluation Result for cells ', $cellRef, ' in worksheet ', $matches[2], ' is ', $this->showTypeDetails($cellValue)); +// $cellRef = $matches[2].'!'.$cellRef; + } else { +// echo '$cellRef='.$cellRef.' in current worksheet
'; + $this->_debugLog->writeDebugLog('Evaluating Cell Range ', $cellRef, ' in current worksheet'); + if ($pCellParent !== null) { + $cellValue = $this->extractCellRange($cellRef, $pCellWorksheet, false); + } else { + return $this->raiseFormulaError('Unable to access Cell Reference'); + } + $this->_debugLog->writeDebugLog('Evaluation Result for cells ', $cellRef, ' is ', $this->showTypeDetails($cellValue)); + } + } + } else { +// echo 'Reference is a single Cell
'; + if ($pCell === null) { +// We can't access the cell, so return a REF error + $cellValue = PHPExcel_Calculation_Functions::REF(); + } else { + $cellRef = $matches[6].$matches[7]; + if ($matches[2] > '') { + $matches[2] = trim($matches[2], "\"'"); + if ((strpos($matches[2], '[') !== false) || (strpos($matches[2], ']') !== false)) { + // It's a Reference to an external workbook (not currently supported) + return $this->raiseFormulaError('Unable to access External Workbook'); + } +// echo '$cellRef='.$cellRef.' in worksheet '.$matches[2].'
'; + $this->_debugLog->writeDebugLog('Evaluating Cell ', $cellRef, ' in worksheet ', $matches[2]); + if ($pCellParent !== null) { + $cellSheet = $this->workbook->getSheetByName($matches[2]); + if ($cellSheet && $cellSheet->cellExists($cellRef)) { + $cellValue = $this->extractCellRange($cellRef, $this->workbook->getSheetByName($matches[2]), false); + $pCell->attach($pCellParent); + } else { + $cellValue = null; + } + } else { + return $this->raiseFormulaError('Unable to access Cell Reference'); + } + $this->_debugLog->writeDebugLog('Evaluation Result for cell ', $cellRef, ' in worksheet ', $matches[2], ' is ', $this->showTypeDetails($cellValue)); +// $cellRef = $matches[2].'!'.$cellRef; + } else { +// echo '$cellRef='.$cellRef.' in current worksheet
'; + $this->_debugLog->writeDebugLog('Evaluating Cell ', $cellRef, ' in current worksheet'); + if ($pCellParent->isDataSet($cellRef)) { + $cellValue = $this->extractCellRange($cellRef, $pCellWorksheet, false); + $pCell->attach($pCellParent); + } else { + $cellValue = null; + } + $this->_debugLog->writeDebugLog('Evaluation Result for cell ', $cellRef, ' is ', $this->showTypeDetails($cellValue)); + } + } + } + $stack->push('Value', $cellValue, $cellRef); + + // if the token is a function, pop arguments off the stack, hand them to the function, and push the result back on + } elseif (preg_match('/^'.self::CALCULATION_REGEXP_FUNCTION.'$/i', $token, $matches)) { +// echo 'Token is a function
'; + $functionName = $matches[1]; + $argCount = $stack->pop(); + $argCount = $argCount['value']; + if ($functionName != 'MKMATRIX') { + $this->_debugLog->writeDebugLog('Evaluating Function ', self::localeFunc($functionName), '() with ', (($argCount == 0) ? 'no' : $argCount), ' argument', (($argCount == 1) ? '' : 's')); + } + if ((isset(self::$PHPExcelFunctions[$functionName])) || (isset(self::$controlFunctions[$functionName]))) { // function + if (isset(self::$PHPExcelFunctions[$functionName])) { + $functionCall = self::$PHPExcelFunctions[$functionName]['functionCall']; + $passByReference = isset(self::$PHPExcelFunctions[$functionName]['passByReference']); + $passCellReference = isset(self::$PHPExcelFunctions[$functionName]['passCellReference']); + } elseif (isset(self::$controlFunctions[$functionName])) { + $functionCall = self::$controlFunctions[$functionName]['functionCall']; + $passByReference = isset(self::$controlFunctions[$functionName]['passByReference']); + $passCellReference = isset(self::$controlFunctions[$functionName]['passCellReference']); + } + // get the arguments for this function +// echo 'Function '.$functionName.' expects '.$argCount.' arguments
'; + $args = $argArrayVals = array(); + for ($i = 0; $i < $argCount; ++$i) { + $arg = $stack->pop(); + $a = $argCount - $i - 1; + if (($passByReference) && + (isset(self::$PHPExcelFunctions[$functionName]['passByReference'][$a])) && + (self::$PHPExcelFunctions[$functionName]['passByReference'][$a])) { + if ($arg['reference'] === null) { + $args[] = $cellID; + if ($functionName != 'MKMATRIX') { + $argArrayVals[] = $this->showValue($cellID); + } + } else { + $args[] = $arg['reference']; + if ($functionName != 'MKMATRIX') { + $argArrayVals[] = $this->showValue($arg['reference']); + } + } + } else { + $args[] = self::unwrapResult($arg['value']); + if ($functionName != 'MKMATRIX') { + $argArrayVals[] = $this->showValue($arg['value']); + } + } + } + // Reverse the order of the arguments + krsort($args); + if (($passByReference) && ($argCount == 0)) { + $args[] = $cellID; + $argArrayVals[] = $this->showValue($cellID); + } +// echo 'Arguments are: '; +// print_r($args); +// echo '
'; + if ($functionName != 'MKMATRIX') { + if ($this->_debugLog->getWriteDebugLog()) { + krsort($argArrayVals); + $this->_debugLog->writeDebugLog('Evaluating ', self::localeFunc($functionName), '( ', implode(self::$localeArgumentSeparator.' ', PHPExcel_Calculation_Functions::flattenArray($argArrayVals)), ' )'); + } + } + // Process each argument in turn, building the return value as an array +// if (($argCount == 1) && (is_array($args[1])) && ($functionName != 'MKMATRIX')) { +// $operand1 = $args[1]; +// $this->_debugLog->writeDebugLog('Argument is a matrix: ', $this->showValue($operand1)); +// $result = array(); +// $row = 0; +// foreach($operand1 as $args) { +// if (is_array($args)) { +// foreach($args as $arg) { +// $this->_debugLog->writeDebugLog('Evaluating ', self::localeFunc($functionName), '( ', $this->showValue($arg), ' )'); +// $r = call_user_func_array($functionCall, $arg); +// $this->_debugLog->writeDebugLog('Evaluation Result for ', self::localeFunc($functionName), '() function call is ', $this->showTypeDetails($r)); +// $result[$row][] = $r; +// } +// ++$row; +// } else { +// $this->_debugLog->writeDebugLog('Evaluating ', self::localeFunc($functionName), '( ', $this->showValue($args), ' )'); +// $r = call_user_func_array($functionCall, $args); +// $this->_debugLog->writeDebugLog('Evaluation Result for ', self::localeFunc($functionName), '() function call is ', $this->showTypeDetails($r)); +// $result[] = $r; +// } +// } +// } else { + // Process the argument with the appropriate function call + if ($passCellReference) { + $args[] = $pCell; + } + if (strpos($functionCall, '::') !== false) { + $result = call_user_func_array(explode('::', $functionCall), $args); + } else { + foreach ($args as &$arg) { + $arg = PHPExcel_Calculation_Functions::flattenSingleValue($arg); + } + unset($arg); + $result = call_user_func_array($functionCall, $args); + } + if ($functionName != 'MKMATRIX') { + $this->_debugLog->writeDebugLog('Evaluation Result for ', self::localeFunc($functionName), '() function call is ', $this->showTypeDetails($result)); + } + $stack->push('Value', self::wrapResult($result)); + } + + } else { + // if the token is a number, boolean, string or an Excel error, push it onto the stack + if (isset(self::$excelConstants[strtoupper($token)])) { + $excelConstant = strtoupper($token); +// echo 'Token is a PHPExcel constant: '.$excelConstant.'
'; + $stack->push('Constant Value', self::$excelConstants[$excelConstant]); + $this->_debugLog->writeDebugLog('Evaluating Constant ', $excelConstant, ' as ', $this->showTypeDetails(self::$excelConstants[$excelConstant])); + } elseif ((is_numeric($token)) || ($token === null) || (is_bool($token)) || ($token == '') || ($token{0} == '"') || ($token{0} == '#')) { +// echo 'Token is a number, boolean, string, null or an Excel error
'; + $stack->push('Value', $token); + // if the token is a named range, push the named range name onto the stack + } elseif (preg_match('/^'.self::CALCULATION_REGEXP_NAMEDRANGE.'$/i', $token, $matches)) { +// echo 'Token is a named range
'; + $namedRange = $matches[6]; +// echo 'Named Range is '.$namedRange.'
'; + $this->_debugLog->writeDebugLog('Evaluating Named Range ', $namedRange); + $cellValue = $this->extractNamedRange($namedRange, ((null !== $pCell) ? $pCellWorksheet : null), false); + $pCell->attach($pCellParent); + $this->_debugLog->writeDebugLog('Evaluation Result for named range ', $namedRange, ' is ', $this->showTypeDetails($cellValue)); + $stack->push('Named Range', $cellValue, $namedRange); + } else { + return $this->raiseFormulaError("undefined variable '$token'"); + } + } + } + // when we're out of tokens, the stack should have a single element, the final result + if ($stack->count() != 1) { + return $this->raiseFormulaError("internal error"); + } + $output = $stack->pop(); + $output = $output['value']; + +// if ((is_array($output)) && (self::$returnArrayAsType != self::RETURN_ARRAY_AS_ARRAY)) { +// return array_shift(PHPExcel_Calculation_Functions::flattenArray($output)); +// } + return $output; + } + + + private function validateBinaryOperand($cellID, &$operand, &$stack) + { + if (is_array($operand)) { + if ((count($operand, COUNT_RECURSIVE) - count($operand)) == 1) { + do { + $operand = array_pop($operand); + } while (is_array($operand)); + } + } + // Numbers, matrices and booleans can pass straight through, as they're already valid + if (is_string($operand)) { + // We only need special validations for the operand if it is a string + // Start by stripping off the quotation marks we use to identify true excel string values internally + if ($operand > '' && $operand{0} == '"') { + $operand = self::unwrapResult($operand); + } + // If the string is a numeric value, we treat it as a numeric, so no further testing + if (!is_numeric($operand)) { + // If not a numeric, test to see if the value is an Excel error, and so can't be used in normal binary operations + if ($operand > '' && $operand{0} == '#') { + $stack->push('Value', $operand); + $this->_debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails($operand)); + return false; + } elseif (!PHPExcel_Shared_String::convertToNumberIfFraction($operand)) { + // If not a numeric or a fraction, then it's a text string, and so can't be used in mathematical binary operations + $stack->push('Value', '#VALUE!'); + $this->_debugLog->writeDebugLog('Evaluation Result is a ', $this->showTypeDetails('#VALUE!')); + return false; + } + } + } + + // return a true if the value of the operand is one that we can use in normal binary operations + return true; + } + + + private function executeBinaryComparisonOperation($cellID, $operand1, $operand2, $operation, &$stack, $recursingArrays = false) + { + // If we're dealing with matrix operations, we want a matrix result + if ((is_array($operand1)) || (is_array($operand2))) { + $result = array(); + if ((is_array($operand1)) && (!is_array($operand2))) { + foreach ($operand1 as $x => $operandData) { + $this->_debugLog->writeDebugLog('Evaluating Comparison ', $this->showValue($operandData), ' ', $operation, ' ', $this->showValue($operand2)); + $this->executeBinaryComparisonOperation($cellID, $operandData, $operand2, $operation, $stack); + $r = $stack->pop(); + $result[$x] = $r['value']; + } + } elseif ((!is_array($operand1)) && (is_array($operand2))) { + foreach ($operand2 as $x => $operandData) { + $this->_debugLog->writeDebugLog('Evaluating Comparison ', $this->showValue($operand1), ' ', $operation, ' ', $this->showValue($operandData)); + $this->executeBinaryComparisonOperation($cellID, $operand1, $operandData, $operation, $stack); + $r = $stack->pop(); + $result[$x] = $r['value']; + } + } else { + if (!$recursingArrays) { + self::checkMatrixOperands($operand1, $operand2, 2); + } + foreach ($operand1 as $x => $operandData) { + $this->_debugLog->writeDebugLog('Evaluating Comparison ', $this->showValue($operandData), ' ', $operation, ' ', $this->showValue($operand2[$x])); + $this->executeBinaryComparisonOperation($cellID, $operandData, $operand2[$x], $operation, $stack, true); + $r = $stack->pop(); + $result[$x] = $r['value']; + } + } + // Log the result details + $this->_debugLog->writeDebugLog('Comparison Evaluation Result is ', $this->showTypeDetails($result)); + // And push the result onto the stack + $stack->push('Array', $result); + return true; + } + + // Simple validate the two operands if they are string values + if (is_string($operand1) && $operand1 > '' && $operand1{0} == '"') { + $operand1 = self::unwrapResult($operand1); + } + if (is_string($operand2) && $operand2 > '' && $operand2{0} == '"') { + $operand2 = self::unwrapResult($operand2); + } + + // Use case insensitive comparaison if not OpenOffice mode + if (PHPExcel_Calculation_Functions::getCompatibilityMode() != PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + if (is_string($operand1)) { + $operand1 = strtoupper($operand1); + } + if (is_string($operand2)) { + $operand2 = strtoupper($operand2); + } + } + + $useLowercaseFirstComparison = is_string($operand1) && is_string($operand2) && PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE; + + // execute the necessary operation + switch ($operation) { + // Greater than + case '>': + if ($useLowercaseFirstComparison) { + $result = $this->strcmpLowercaseFirst($operand1, $operand2) > 0; + } else { + $result = ($operand1 > $operand2); + } + break; + // Less than + case '<': + if ($useLowercaseFirstComparison) { + $result = $this->strcmpLowercaseFirst($operand1, $operand2) < 0; + } else { + $result = ($operand1 < $operand2); + } + break; + // Equality + case '=': + if (is_numeric($operand1) && is_numeric($operand2)) { + $result = (abs($operand1 - $operand2) < $this->delta); + } else { + $result = strcmp($operand1, $operand2) == 0; + } + break; + // Greater than or equal + case '>=': + if (is_numeric($operand1) && is_numeric($operand2)) { + $result = ((abs($operand1 - $operand2) < $this->delta) || ($operand1 > $operand2)); + } elseif ($useLowercaseFirstComparison) { + $result = $this->strcmpLowercaseFirst($operand1, $operand2) >= 0; + } else { + $result = strcmp($operand1, $operand2) >= 0; + } + break; + // Less than or equal + case '<=': + if (is_numeric($operand1) && is_numeric($operand2)) { + $result = ((abs($operand1 - $operand2) < $this->delta) || ($operand1 < $operand2)); + } elseif ($useLowercaseFirstComparison) { + $result = $this->strcmpLowercaseFirst($operand1, $operand2) <= 0; + } else { + $result = strcmp($operand1, $operand2) <= 0; + } + break; + // Inequality + case '<>': + if (is_numeric($operand1) && is_numeric($operand2)) { + $result = (abs($operand1 - $operand2) > 1E-14); + } else { + $result = strcmp($operand1, $operand2) != 0; + } + break; + } + + // Log the result details + $this->_debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails($result)); + // And push the result onto the stack + $stack->push('Value', $result); + return true; + } + + /** + * Compare two strings in the same way as strcmp() except that lowercase come before uppercase letters + * @param string $str1 First string value for the comparison + * @param string $str2 Second string value for the comparison + * @return integer + */ + private function strcmpLowercaseFirst($str1, $str2) + { + $inversedStr1 = PHPExcel_Shared_String::StrCaseReverse($str1); + $inversedStr2 = PHPExcel_Shared_String::StrCaseReverse($str2); + + return strcmp($inversedStr1, $inversedStr2); + } + + private function executeNumericBinaryOperation($cellID, $operand1, $operand2, $operation, $matrixFunction, &$stack) + { + // Validate the two operands + if (!$this->validateBinaryOperand($cellID, $operand1, $stack)) { + return false; + } + if (!$this->validateBinaryOperand($cellID, $operand2, $stack)) { + return false; + } + + // If either of the operands is a matrix, we need to treat them both as matrices + // (converting the other operand to a matrix if need be); then perform the required + // matrix operation + if ((is_array($operand1)) || (is_array($operand2))) { + // Ensure that both operands are arrays/matrices of the same size + self::checkMatrixOperands($operand1, $operand2, 2); + + try { + // Convert operand 1 from a PHP array to a matrix + $matrix = new PHPExcel_Shared_JAMA_Matrix($operand1); + // Perform the required operation against the operand 1 matrix, passing in operand 2 + $matrixResult = $matrix->$matrixFunction($operand2); + $result = $matrixResult->getArray(); + } catch (PHPExcel_Exception $ex) { + $this->_debugLog->writeDebugLog('JAMA Matrix Exception: ', $ex->getMessage()); + $result = '#VALUE!'; + } + } else { + if ((PHPExcel_Calculation_Functions::getCompatibilityMode() != PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) && + ((is_string($operand1) && !is_numeric($operand1) && strlen($operand1)>0) || + (is_string($operand2) && !is_numeric($operand2) && strlen($operand2)>0))) { + $result = PHPExcel_Calculation_Functions::VALUE(); + } else { + // If we're dealing with non-matrix operations, execute the necessary operation + switch ($operation) { + // Addition + case '+': + $result = $operand1 + $operand2; + break; + // Subtraction + case '-': + $result = $operand1 - $operand2; + break; + // Multiplication + case '*': + $result = $operand1 * $operand2; + break; + // Division + case '/': + if ($operand2 == 0) { + // Trap for Divide by Zero error + $stack->push('Value', '#DIV/0!'); + $this->_debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails('#DIV/0!')); + return false; + } else { + $result = $operand1 / $operand2; + } + break; + // Power + case '^': + $result = pow($operand1, $operand2); + break; + } + } + } + + // Log the result details + $this->_debugLog->writeDebugLog('Evaluation Result is ', $this->showTypeDetails($result)); + // And push the result onto the stack + $stack->push('Value', $result); + return true; + } + + + // trigger an error, but nicely, if need be + protected function raiseFormulaError($errorMessage) + { + $this->formulaError = $errorMessage; + $this->cyclicReferenceStack->clear(); + if (!$this->suppressFormulaErrors) { + throw new PHPExcel_Calculation_Exception($errorMessage); + } + trigger_error($errorMessage, E_USER_ERROR); + } + + + /** + * Extract range values + * + * @param string &$pRange String based range representation + * @param PHPExcel_Worksheet $pSheet Worksheet + * @param boolean $resetLog Flag indicating whether calculation log should be reset or not + * @return mixed Array of values in range if range contains more than one element. Otherwise, a single value is returned. + * @throws PHPExcel_Calculation_Exception + */ + public function extractCellRange(&$pRange = 'A1', PHPExcel_Worksheet $pSheet = null, $resetLog = true) + { + // Return value + $returnValue = array (); + +// echo 'extractCellRange('.$pRange.')', PHP_EOL; + if ($pSheet !== null) { + $pSheetName = $pSheet->getTitle(); +// echo 'Passed sheet name is '.$pSheetName.PHP_EOL; +// echo 'Range reference is '.$pRange.PHP_EOL; + if (strpos($pRange, '!') !== false) { +// echo '$pRange reference includes sheet reference', PHP_EOL; + list($pSheetName, $pRange) = PHPExcel_Worksheet::extractSheetTitle($pRange, true); +// echo 'New sheet name is '.$pSheetName, PHP_EOL; +// echo 'Adjusted Range reference is '.$pRange, PHP_EOL; + $pSheet = $this->workbook->getSheetByName($pSheetName); + } + + // Extract range + $aReferences = PHPExcel_Cell::extractAllCellReferencesInRange($pRange); + $pRange = $pSheetName.'!'.$pRange; + if (!isset($aReferences[1])) { + // Single cell in range + sscanf($aReferences[0], '%[A-Z]%d', $currentCol, $currentRow); + $cellValue = null; + if ($pSheet->cellExists($aReferences[0])) { + $returnValue[$currentRow][$currentCol] = $pSheet->getCell($aReferences[0])->getCalculatedValue($resetLog); + } else { + $returnValue[$currentRow][$currentCol] = null; + } + } else { + // Extract cell data for all cells in the range + foreach ($aReferences as $reference) { + // Extract range + sscanf($reference, '%[A-Z]%d', $currentCol, $currentRow); + $cellValue = null; + if ($pSheet->cellExists($reference)) { + $returnValue[$currentRow][$currentCol] = $pSheet->getCell($reference)->getCalculatedValue($resetLog); + } else { + $returnValue[$currentRow][$currentCol] = null; + } + } + } + } + + return $returnValue; + } + + + /** + * Extract range values + * + * @param string &$pRange String based range representation + * @param PHPExcel_Worksheet $pSheet Worksheet + * @return mixed Array of values in range if range contains more than one element. Otherwise, a single value is returned. + * @param boolean $resetLog Flag indicating whether calculation log should be reset or not + * @throws PHPExcel_Calculation_Exception + */ + public function extractNamedRange(&$pRange = 'A1', PHPExcel_Worksheet $pSheet = null, $resetLog = true) + { + // Return value + $returnValue = array (); + +// echo 'extractNamedRange('.$pRange.')
'; + if ($pSheet !== null) { + $pSheetName = $pSheet->getTitle(); +// echo 'Current sheet name is '.$pSheetName.'
'; +// echo 'Range reference is '.$pRange.'
'; + if (strpos($pRange, '!') !== false) { +// echo '$pRange reference includes sheet reference', PHP_EOL; + list($pSheetName, $pRange) = PHPExcel_Worksheet::extractSheetTitle($pRange, true); +// echo 'New sheet name is '.$pSheetName, PHP_EOL; +// echo 'Adjusted Range reference is '.$pRange, PHP_EOL; + $pSheet = $this->workbook->getSheetByName($pSheetName); + } + + // Named range? + $namedRange = PHPExcel_NamedRange::resolveRange($pRange, $pSheet); + if ($namedRange !== null) { + $pSheet = $namedRange->getWorksheet(); +// echo 'Named Range '.$pRange.' ('; + $pRange = $namedRange->getRange(); + $splitRange = PHPExcel_Cell::splitRange($pRange); + // Convert row and column references + if (ctype_alpha($splitRange[0][0])) { + $pRange = $splitRange[0][0] . '1:' . $splitRange[0][1] . $namedRange->getWorksheet()->getHighestRow(); + } elseif (ctype_digit($splitRange[0][0])) { + $pRange = 'A' . $splitRange[0][0] . ':' . $namedRange->getWorksheet()->getHighestColumn() . $splitRange[0][1]; + } +// echo $pRange.') is in sheet '.$namedRange->getWorksheet()->getTitle().'
'; + +// if ($pSheet->getTitle() != $namedRange->getWorksheet()->getTitle()) { +// if (!$namedRange->getLocalOnly()) { +// $pSheet = $namedRange->getWorksheet(); +// } else { +// return $returnValue; +// } +// } + } else { + return PHPExcel_Calculation_Functions::REF(); + } + + // Extract range + $aReferences = PHPExcel_Cell::extractAllCellReferencesInRange($pRange); +// var_dump($aReferences); + if (!isset($aReferences[1])) { + // Single cell (or single column or row) in range + list($currentCol, $currentRow) = PHPExcel_Cell::coordinateFromString($aReferences[0]); + $cellValue = null; + if ($pSheet->cellExists($aReferences[0])) { + $returnValue[$currentRow][$currentCol] = $pSheet->getCell($aReferences[0])->getCalculatedValue($resetLog); + } else { + $returnValue[$currentRow][$currentCol] = null; + } + } else { + // Extract cell data for all cells in the range + foreach ($aReferences as $reference) { + // Extract range + list($currentCol, $currentRow) = PHPExcel_Cell::coordinateFromString($reference); +// echo 'NAMED RANGE: $currentCol='.$currentCol.' $currentRow='.$currentRow.'
'; + $cellValue = null; + if ($pSheet->cellExists($reference)) { + $returnValue[$currentRow][$currentCol] = $pSheet->getCell($reference)->getCalculatedValue($resetLog); + } else { + $returnValue[$currentRow][$currentCol] = null; + } + } + } +// print_r($returnValue); +// echo '
'; + } + + return $returnValue; + } + + + /** + * Is a specific function implemented? + * + * @param string $pFunction Function Name + * @return boolean + */ + public function isImplemented($pFunction = '') + { + $pFunction = strtoupper($pFunction); + if (isset(self::$PHPExcelFunctions[$pFunction])) { + return (self::$PHPExcelFunctions[$pFunction]['functionCall'] != 'PHPExcel_Calculation_Functions::DUMMY'); + } else { + return false; + } + } + + + /** + * Get a list of all implemented functions as an array of function objects + * + * @return array of PHPExcel_Calculation_Function + */ + public function listFunctions() + { + $returnValue = array(); + + foreach (self::$PHPExcelFunctions as $functionName => $function) { + if ($function['functionCall'] != 'PHPExcel_Calculation_Functions::DUMMY') { + $returnValue[$functionName] = new PHPExcel_Calculation_Function( + $function['category'], + $functionName, + $function['functionCall'] + ); + } + } + + return $returnValue; + } + + + /** + * Get a list of all Excel function names + * + * @return array + */ + public function listAllFunctionNames() + { + return array_keys(self::$PHPExcelFunctions); + } + + /** + * Get a list of implemented Excel function names + * + * @return array + */ + public function listFunctionNames() + { + $returnValue = array(); + foreach (self::$PHPExcelFunctions as $functionName => $function) { + if ($function['functionCall'] != 'PHPExcel_Calculation_Functions::DUMMY') { + $returnValue[] = $functionName; + } + } + + return $returnValue; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Calculation/Database.php b/application/third_party/PHPExcel/PHPExcel/Calculation/Database.php new file mode 100644 index 0000000..b8d91cb --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Calculation/Database.php @@ -0,0 +1,676 @@ + $criteriaName) { + $testCondition = array(); + $testConditionCount = 0; + foreach ($criteria as $row => $criterion) { + if ($criterion[$key] > '') { + $testCondition[] = '[:'.$criteriaName.']'.PHPExcel_Calculation_Functions::ifCondition($criterion[$key]); + $testConditionCount++; + } + } + if ($testConditionCount > 1) { + $testConditions[] = 'OR(' . implode(',', $testCondition) . ')'; + $testConditionsCount++; + } elseif ($testConditionCount == 1) { + $testConditions[] = $testCondition[0]; + $testConditionsCount++; + } + } + + if ($testConditionsCount > 1) { + $testConditionSet = 'AND(' . implode(',', $testConditions) . ')'; + } elseif ($testConditionsCount == 1) { + $testConditionSet = $testConditions[0]; + } + + // Loop through each row of the database + foreach ($database as $dataRow => $dataValues) { + // Substitute actual values from the database row for our [:placeholders] + $testConditionList = $testConditionSet; + foreach ($criteriaNames as $key => $criteriaName) { + $k = array_search($criteriaName, $fieldNames); + if (isset($dataValues[$k])) { + $dataValue = $dataValues[$k]; + $dataValue = (is_string($dataValue)) ? PHPExcel_Calculation::wrapResult(strtoupper($dataValue)) : $dataValue; + $testConditionList = str_replace('[:' . $criteriaName . ']', $dataValue, $testConditionList); + } + } + // evaluate the criteria against the row data + $result = PHPExcel_Calculation::getInstance()->_calculateFormulaValue('='.$testConditionList); + // If the row failed to meet the criteria, remove it from the database + if (!$result) { + unset($database[$dataRow]); + } + } + + return $database; + } + + + private static function getFilteredColumn($database, $field, $criteria) + { + // reduce the database to a set of rows that match all the criteria + $database = self::filter($database, $criteria); + // extract an array of values for the requested column + $colData = array(); + foreach ($database as $row) { + $colData[] = $row[$field]; + } + + return $colData; + } + + /** + * DAVERAGE + * + * Averages the values in a column of a list or database that match conditions you specify. + * + * Excel Function: + * DAVERAGE(database,field,criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return float + * + */ + public static function DAVERAGE($database, $field, $criteria) + { + $field = self::fieldExtract($database, $field); + if (is_null($field)) { + return null; + } + + // Return + return PHPExcel_Calculation_Statistical::AVERAGE( + self::getFilteredColumn($database, $field, $criteria) + ); + } + + + /** + * DCOUNT + * + * Counts the cells that contain numbers in a column of a list or database that match conditions + * that you specify. + * + * Excel Function: + * DCOUNT(database,[field],criteria) + * + * Excel Function: + * DAVERAGE(database,field,criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return integer + * + * @TODO The field argument is optional. If field is omitted, DCOUNT counts all records in the + * database that match the criteria. + * + */ + public static function DCOUNT($database, $field, $criteria) + { + $field = self::fieldExtract($database, $field); + if (is_null($field)) { + return null; + } + + // Return + return PHPExcel_Calculation_Statistical::COUNT( + self::getFilteredColumn($database, $field, $criteria) + ); + } + + + /** + * DCOUNTA + * + * Counts the nonblank cells in a column of a list or database that match conditions that you specify. + * + * Excel Function: + * DCOUNTA(database,[field],criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return integer + * + * @TODO The field argument is optional. If field is omitted, DCOUNTA counts all records in the + * database that match the criteria. + * + */ + public static function DCOUNTA($database, $field, $criteria) + { + $field = self::fieldExtract($database, $field); + if (is_null($field)) { + return null; + } + + // reduce the database to a set of rows that match all the criteria + $database = self::filter($database, $criteria); + // extract an array of values for the requested column + $colData = array(); + foreach ($database as $row) { + $colData[] = $row[$field]; + } + + // Return + return PHPExcel_Calculation_Statistical::COUNTA( + self::getFilteredColumn($database, $field, $criteria) + ); + } + + + /** + * DGET + * + * Extracts a single value from a column of a list or database that matches conditions that you + * specify. + * + * Excel Function: + * DGET(database,field,criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return mixed + * + */ + public static function DGET($database, $field, $criteria) + { + $field = self::fieldExtract($database, $field); + if (is_null($field)) { + return null; + } + + // Return + $colData = self::getFilteredColumn($database, $field, $criteria); + if (count($colData) > 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + + return $colData[0]; + } + + + /** + * DMAX + * + * Returns the largest number in a column of a list or database that matches conditions you that + * specify. + * + * Excel Function: + * DMAX(database,field,criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return float + * + */ + public static function DMAX($database, $field, $criteria) + { + $field = self::fieldExtract($database, $field); + if (is_null($field)) { + return null; + } + + // Return + return PHPExcel_Calculation_Statistical::MAX( + self::getFilteredColumn($database, $field, $criteria) + ); + } + + + /** + * DMIN + * + * Returns the smallest number in a column of a list or database that matches conditions you that + * specify. + * + * Excel Function: + * DMIN(database,field,criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return float + * + */ + public static function DMIN($database, $field, $criteria) + { + $field = self::fieldExtract($database, $field); + if (is_null($field)) { + return null; + } + + // Return + return PHPExcel_Calculation_Statistical::MIN( + self::getFilteredColumn($database, $field, $criteria) + ); + } + + + /** + * DPRODUCT + * + * Multiplies the values in a column of a list or database that match conditions that you specify. + * + * Excel Function: + * DPRODUCT(database,field,criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return float + * + */ + public static function DPRODUCT($database, $field, $criteria) + { + $field = self::fieldExtract($database, $field); + if (is_null($field)) { + return null; + } + + // Return + return PHPExcel_Calculation_MathTrig::PRODUCT( + self::getFilteredColumn($database, $field, $criteria) + ); + } + + + /** + * DSTDEV + * + * Estimates the standard deviation of a population based on a sample by using the numbers in a + * column of a list or database that match conditions that you specify. + * + * Excel Function: + * DSTDEV(database,field,criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return float + * + */ + public static function DSTDEV($database, $field, $criteria) + { + $field = self::fieldExtract($database, $field); + if (is_null($field)) { + return null; + } + + // Return + return PHPExcel_Calculation_Statistical::STDEV( + self::getFilteredColumn($database, $field, $criteria) + ); + } + + + /** + * DSTDEVP + * + * Calculates the standard deviation of a population based on the entire population by using the + * numbers in a column of a list or database that match conditions that you specify. + * + * Excel Function: + * DSTDEVP(database,field,criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return float + * + */ + public static function DSTDEVP($database, $field, $criteria) + { + $field = self::fieldExtract($database, $field); + if (is_null($field)) { + return null; + } + + // Return + return PHPExcel_Calculation_Statistical::STDEVP( + self::getFilteredColumn($database, $field, $criteria) + ); + } + + + /** + * DSUM + * + * Adds the numbers in a column of a list or database that match conditions that you specify. + * + * Excel Function: + * DSUM(database,field,criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return float + * + */ + public static function DSUM($database, $field, $criteria) + { + $field = self::fieldExtract($database, $field); + if (is_null($field)) { + return null; + } + + // Return + return PHPExcel_Calculation_MathTrig::SUM( + self::getFilteredColumn($database, $field, $criteria) + ); + } + + + /** + * DVAR + * + * Estimates the variance of a population based on a sample by using the numbers in a column + * of a list or database that match conditions that you specify. + * + * Excel Function: + * DVAR(database,field,criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return float + * + */ + public static function DVAR($database, $field, $criteria) + { + $field = self::fieldExtract($database, $field); + if (is_null($field)) { + return null; + } + + // Return + return PHPExcel_Calculation_Statistical::VARFunc( + self::getFilteredColumn($database, $field, $criteria) + ); + } + + + /** + * DVARP + * + * Calculates the variance of a population based on the entire population by using the numbers + * in a column of a list or database that match conditions that you specify. + * + * Excel Function: + * DVARP(database,field,criteria) + * + * @access public + * @category Database Functions + * @param mixed[] $database The range of cells that makes up the list or database. + * A database is a list of related data in which rows of related + * information are records, and columns of data are fields. The + * first row of the list contains labels for each column. + * @param string|integer $field Indicates which column is used in the function. Enter the + * column label enclosed between double quotation marks, such as + * "Age" or "Yield," or a number (without quotation marks) that + * represents the position of the column within the list: 1 for + * the first column, 2 for the second column, and so on. + * @param mixed[] $criteria The range of cells that contains the conditions you specify. + * You can use any range for the criteria argument, as long as it + * includes at least one column label and at least one cell below + * the column label in which you specify a condition for the + * column. + * @return float + * + */ + public static function DVARP($database, $field, $criteria) + { + $field = self::fieldExtract($database, $field); + if (is_null($field)) { + return null; + } + + // Return + return PHPExcel_Calculation_Statistical::VARP( + self::getFilteredColumn($database, $field, $criteria) + ); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Calculation/DateTime.php b/application/third_party/PHPExcel/PHPExcel/Calculation/DateTime.php new file mode 100644 index 0000000..72f4c7a --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Calculation/DateTime.php @@ -0,0 +1,1553 @@ +format('m'); + $oYear = (int) $PHPDateObject->format('Y'); + + $adjustmentMonthsString = (string) $adjustmentMonths; + if ($adjustmentMonths > 0) { + $adjustmentMonthsString = '+'.$adjustmentMonths; + } + if ($adjustmentMonths != 0) { + $PHPDateObject->modify($adjustmentMonthsString.' months'); + } + $nMonth = (int) $PHPDateObject->format('m'); + $nYear = (int) $PHPDateObject->format('Y'); + + $monthDiff = ($nMonth - $oMonth) + (($nYear - $oYear) * 12); + if ($monthDiff != $adjustmentMonths) { + $adjustDays = (int) $PHPDateObject->format('d'); + $adjustDaysString = '-'.$adjustDays.' days'; + $PHPDateObject->modify($adjustDaysString); + } + return $PHPDateObject; + } + + + /** + * DATETIMENOW + * + * Returns the current date and time. + * The NOW function is useful when you need to display the current date and time on a worksheet or + * calculate a value based on the current date and time, and have that value updated each time you + * open the worksheet. + * + * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the date + * and time format of your regional settings. PHPExcel does not change cell formatting in this way. + * + * Excel Function: + * NOW() + * + * @access public + * @category Date/Time Functions + * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * depending on the value of the ReturnDateType flag + */ + public static function DATETIMENOW() + { + $saveTimeZone = date_default_timezone_get(); + date_default_timezone_set('UTC'); + $retValue = false; + switch (PHPExcel_Calculation_Functions::getReturnDateType()) { + case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL: + $retValue = (float) PHPExcel_Shared_Date::PHPToExcel(time()); + break; + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC: + $retValue = (integer) time(); + break; + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT: + $retValue = new DateTime(); + break; + } + date_default_timezone_set($saveTimeZone); + + return $retValue; + } + + + /** + * DATENOW + * + * Returns the current date. + * The NOW function is useful when you need to display the current date and time on a worksheet or + * calculate a value based on the current date and time, and have that value updated each time you + * open the worksheet. + * + * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the date + * and time format of your regional settings. PHPExcel does not change cell formatting in this way. + * + * Excel Function: + * TODAY() + * + * @access public + * @category Date/Time Functions + * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * depending on the value of the ReturnDateType flag + */ + public static function DATENOW() + { + $saveTimeZone = date_default_timezone_get(); + date_default_timezone_set('UTC'); + $retValue = false; + $excelDateTime = floor(PHPExcel_Shared_Date::PHPToExcel(time())); + switch (PHPExcel_Calculation_Functions::getReturnDateType()) { + case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL: + $retValue = (float) $excelDateTime; + break; + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC: + $retValue = (integer) PHPExcel_Shared_Date::ExcelToPHP($excelDateTime); + break; + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT: + $retValue = PHPExcel_Shared_Date::ExcelToPHPObject($excelDateTime); + break; + } + date_default_timezone_set($saveTimeZone); + + return $retValue; + } + + + /** + * DATE + * + * The DATE function returns a value that represents a particular date. + * + * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the date + * format of your regional settings. PHPExcel does not change cell formatting in this way. + * + * Excel Function: + * DATE(year,month,day) + * + * PHPExcel is a lot more forgiving than MS Excel when passing non numeric values to this function. + * A Month name or abbreviation (English only at this point) such as 'January' or 'Jan' will still be accepted, + * as will a day value with a suffix (e.g. '21st' rather than simply 21); again only English language. + * + * @access public + * @category Date/Time Functions + * @param integer $year The value of the year argument can include one to four digits. + * Excel interprets the year argument according to the configured + * date system: 1900 or 1904. + * If year is between 0 (zero) and 1899 (inclusive), Excel adds that + * value to 1900 to calculate the year. For example, DATE(108,1,2) + * returns January 2, 2008 (1900+108). + * If year is between 1900 and 9999 (inclusive), Excel uses that + * value as the year. For example, DATE(2008,1,2) returns January 2, + * 2008. + * If year is less than 0 or is 10000 or greater, Excel returns the + * #NUM! error value. + * @param integer $month A positive or negative integer representing the month of the year + * from 1 to 12 (January to December). + * If month is greater than 12, month adds that number of months to + * the first month in the year specified. For example, DATE(2008,14,2) + * returns the serial number representing February 2, 2009. + * If month is less than 1, month subtracts the magnitude of that + * number of months, plus 1, from the first month in the year + * specified. For example, DATE(2008,-3,2) returns the serial number + * representing September 2, 2007. + * @param integer $day A positive or negative integer representing the day of the month + * from 1 to 31. + * If day is greater than the number of days in the month specified, + * day adds that number of days to the first day in the month. For + * example, DATE(2008,1,35) returns the serial number representing + * February 4, 2008. + * If day is less than 1, day subtracts the magnitude that number of + * days, plus one, from the first day of the month specified. For + * example, DATE(2008,1,-15) returns the serial number representing + * December 16, 2007. + * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * depending on the value of the ReturnDateType flag + */ + public static function DATE($year = 0, $month = 1, $day = 1) + { + $year = PHPExcel_Calculation_Functions::flattenSingleValue($year); + $month = PHPExcel_Calculation_Functions::flattenSingleValue($month); + $day = PHPExcel_Calculation_Functions::flattenSingleValue($day); + + if (($month !== null) && (!is_numeric($month))) { + $month = PHPExcel_Shared_Date::monthStringToNumber($month); + } + + if (($day !== null) && (!is_numeric($day))) { + $day = PHPExcel_Shared_Date::dayStringToNumber($day); + } + + $year = ($year !== null) ? PHPExcel_Shared_String::testStringAsNumeric($year) : 0; + $month = ($month !== null) ? PHPExcel_Shared_String::testStringAsNumeric($month) : 0; + $day = ($day !== null) ? PHPExcel_Shared_String::testStringAsNumeric($day) : 0; + if ((!is_numeric($year)) || + (!is_numeric($month)) || + (!is_numeric($day))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $year = (integer) $year; + $month = (integer) $month; + $day = (integer) $day; + + $baseYear = PHPExcel_Shared_Date::getExcelCalendar(); + // Validate parameters + if ($year < ($baseYear-1900)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ((($baseYear-1900) != 0) && ($year < $baseYear) && ($year >= 1900)) { + return PHPExcel_Calculation_Functions::NaN(); + } + + if (($year < $baseYear) && ($year >= ($baseYear-1900))) { + $year += 1900; + } + + if ($month < 1) { + // Handle year/month adjustment if month < 1 + --$month; + $year += ceil($month / 12) - 1; + $month = 13 - abs($month % 12); + } elseif ($month > 12) { + // Handle year/month adjustment if month > 12 + $year += floor($month / 12); + $month = ($month % 12); + } + + // Re-validate the year parameter after adjustments + if (($year < $baseYear) || ($year >= 10000)) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Execute function + $excelDateValue = PHPExcel_Shared_Date::FormattedPHPToExcel($year, $month, $day); + switch (PHPExcel_Calculation_Functions::getReturnDateType()) { + case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL: + return (float) $excelDateValue; + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC: + return (integer) PHPExcel_Shared_Date::ExcelToPHP($excelDateValue); + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT: + return PHPExcel_Shared_Date::ExcelToPHPObject($excelDateValue); + } + } + + + /** + * TIME + * + * The TIME function returns a value that represents a particular time. + * + * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the time + * format of your regional settings. PHPExcel does not change cell formatting in this way. + * + * Excel Function: + * TIME(hour,minute,second) + * + * @access public + * @category Date/Time Functions + * @param integer $hour A number from 0 (zero) to 32767 representing the hour. + * Any value greater than 23 will be divided by 24 and the remainder + * will be treated as the hour value. For example, TIME(27,0,0) = + * TIME(3,0,0) = .125 or 3:00 AM. + * @param integer $minute A number from 0 to 32767 representing the minute. + * Any value greater than 59 will be converted to hours and minutes. + * For example, TIME(0,750,0) = TIME(12,30,0) = .520833 or 12:30 PM. + * @param integer $second A number from 0 to 32767 representing the second. + * Any value greater than 59 will be converted to hours, minutes, + * and seconds. For example, TIME(0,0,2000) = TIME(0,33,22) = .023148 + * or 12:33:20 AM + * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * depending on the value of the ReturnDateType flag + */ + public static function TIME($hour = 0, $minute = 0, $second = 0) + { + $hour = PHPExcel_Calculation_Functions::flattenSingleValue($hour); + $minute = PHPExcel_Calculation_Functions::flattenSingleValue($minute); + $second = PHPExcel_Calculation_Functions::flattenSingleValue($second); + + if ($hour == '') { + $hour = 0; + } + if ($minute == '') { + $minute = 0; + } + if ($second == '') { + $second = 0; + } + + if ((!is_numeric($hour)) || (!is_numeric($minute)) || (!is_numeric($second))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $hour = (integer) $hour; + $minute = (integer) $minute; + $second = (integer) $second; + + if ($second < 0) { + $minute += floor($second / 60); + $second = 60 - abs($second % 60); + if ($second == 60) { + $second = 0; + } + } elseif ($second >= 60) { + $minute += floor($second / 60); + $second = $second % 60; + } + if ($minute < 0) { + $hour += floor($minute / 60); + $minute = 60 - abs($minute % 60); + if ($minute == 60) { + $minute = 0; + } + } elseif ($minute >= 60) { + $hour += floor($minute / 60); + $minute = $minute % 60; + } + + if ($hour > 23) { + $hour = $hour % 24; + } elseif ($hour < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Execute function + switch (PHPExcel_Calculation_Functions::getReturnDateType()) { + case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL: + $date = 0; + $calendar = PHPExcel_Shared_Date::getExcelCalendar(); + if ($calendar != PHPExcel_Shared_Date::CALENDAR_WINDOWS_1900) { + $date = 1; + } + return (float) PHPExcel_Shared_Date::FormattedPHPToExcel($calendar, 1, $date, $hour, $minute, $second); + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC: + return (integer) PHPExcel_Shared_Date::ExcelToPHP(PHPExcel_Shared_Date::FormattedPHPToExcel(1970, 1, 1, $hour, $minute, $second)); // -2147468400; // -2147472000 + 3600 + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT: + $dayAdjust = 0; + if ($hour < 0) { + $dayAdjust = floor($hour / 24); + $hour = 24 - abs($hour % 24); + if ($hour == 24) { + $hour = 0; + } + } elseif ($hour >= 24) { + $dayAdjust = floor($hour / 24); + $hour = $hour % 24; + } + $phpDateObject = new DateTime('1900-01-01 '.$hour.':'.$minute.':'.$second); + if ($dayAdjust != 0) { + $phpDateObject->modify($dayAdjust.' days'); + } + return $phpDateObject; + } + } + + + /** + * DATEVALUE + * + * Returns a value that represents a particular date. + * Use DATEVALUE to convert a date represented by a text string to an Excel or PHP date/time stamp + * value. + * + * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the date + * format of your regional settings. PHPExcel does not change cell formatting in this way. + * + * Excel Function: + * DATEVALUE(dateValue) + * + * @access public + * @category Date/Time Functions + * @param string $dateValue Text that represents a date in a Microsoft Excel date format. + * For example, "1/30/2008" or "30-Jan-2008" are text strings within + * quotation marks that represent dates. Using the default date + * system in Excel for Windows, date_text must represent a date from + * January 1, 1900, to December 31, 9999. Using the default date + * system in Excel for the Macintosh, date_text must represent a date + * from January 1, 1904, to December 31, 9999. DATEVALUE returns the + * #VALUE! error value if date_text is out of this range. + * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * depending on the value of the ReturnDateType flag + */ + public static function DATEVALUE($dateValue = 1) + { + $dateValue = trim(PHPExcel_Calculation_Functions::flattenSingleValue($dateValue), '"'); + // Strip any ordinals because they're allowed in Excel (English only) + $dateValue = preg_replace('/(\d)(st|nd|rd|th)([ -\/])/Ui', '$1$3', $dateValue); + // Convert separators (/ . or space) to hyphens (should also handle dot used for ordinals in some countries, e.g. Denmark, Germany) + $dateValue = str_replace(array('/', '.', '-', ' '), array(' ', ' ', ' ', ' '), $dateValue); + + $yearFound = false; + $t1 = explode(' ', $dateValue); + foreach ($t1 as &$t) { + if ((is_numeric($t)) && ($t > 31)) { + if ($yearFound) { + return PHPExcel_Calculation_Functions::VALUE(); + } else { + if ($t < 100) { + $t += 1900; + } + $yearFound = true; + } + } + } + if ((count($t1) == 1) && (strpos($t, ':') != false)) { + // We've been fed a time value without any date + return 0.0; + } elseif (count($t1) == 2) { + // We only have two parts of the date: either day/month or month/year + if ($yearFound) { + array_unshift($t1, 1); + } else { + array_push($t1, date('Y')); + } + } + unset($t); + $dateValue = implode(' ', $t1); + + $PHPDateArray = date_parse($dateValue); + if (($PHPDateArray === false) || ($PHPDateArray['error_count'] > 0)) { + $testVal1 = strtok($dateValue, '- '); + if ($testVal1 !== false) { + $testVal2 = strtok('- '); + if ($testVal2 !== false) { + $testVal3 = strtok('- '); + if ($testVal3 === false) { + $testVal3 = strftime('%Y'); + } + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + $PHPDateArray = date_parse($testVal1.'-'.$testVal2.'-'.$testVal3); + if (($PHPDateArray === false) || ($PHPDateArray['error_count'] > 0)) { + $PHPDateArray = date_parse($testVal2.'-'.$testVal1.'-'.$testVal3); + if (($PHPDateArray === false) || ($PHPDateArray['error_count'] > 0)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + } + + if (($PHPDateArray !== false) && ($PHPDateArray['error_count'] == 0)) { + // Execute function + if ($PHPDateArray['year'] == '') { + $PHPDateArray['year'] = strftime('%Y'); + } + if ($PHPDateArray['year'] < 1900) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if ($PHPDateArray['month'] == '') { + $PHPDateArray['month'] = strftime('%m'); + } + if ($PHPDateArray['day'] == '') { + $PHPDateArray['day'] = strftime('%d'); + } + $excelDateValue = floor( + PHPExcel_Shared_Date::FormattedPHPToExcel( + $PHPDateArray['year'], + $PHPDateArray['month'], + $PHPDateArray['day'], + $PHPDateArray['hour'], + $PHPDateArray['minute'], + $PHPDateArray['second'] + ) + ); + + switch (PHPExcel_Calculation_Functions::getReturnDateType()) { + case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL: + return (float) $excelDateValue; + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC: + return (integer) PHPExcel_Shared_Date::ExcelToPHP($excelDateValue); + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT: + return new DateTime($PHPDateArray['year'].'-'.$PHPDateArray['month'].'-'.$PHPDateArray['day'].' 00:00:00'); + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * TIMEVALUE + * + * Returns a value that represents a particular time. + * Use TIMEVALUE to convert a time represented by a text string to an Excel or PHP date/time stamp + * value. + * + * NOTE: When used in a Cell Formula, MS Excel changes the cell format so that it matches the time + * format of your regional settings. PHPExcel does not change cell formatting in this way. + * + * Excel Function: + * TIMEVALUE(timeValue) + * + * @access public + * @category Date/Time Functions + * @param string $timeValue A text string that represents a time in any one of the Microsoft + * Excel time formats; for example, "6:45 PM" and "18:45" text strings + * within quotation marks that represent time. + * Date information in time_text is ignored. + * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * depending on the value of the ReturnDateType flag + */ + public static function TIMEVALUE($timeValue) + { + $timeValue = trim(PHPExcel_Calculation_Functions::flattenSingleValue($timeValue), '"'); + $timeValue = str_replace(array('/', '.'), array('-', '-'), $timeValue); + + $PHPDateArray = date_parse($timeValue); + if (($PHPDateArray !== false) && ($PHPDateArray['error_count'] == 0)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + $excelDateValue = PHPExcel_Shared_Date::FormattedPHPToExcel( + $PHPDateArray['year'], + $PHPDateArray['month'], + $PHPDateArray['day'], + $PHPDateArray['hour'], + $PHPDateArray['minute'], + $PHPDateArray['second'] + ); + } else { + $excelDateValue = PHPExcel_Shared_Date::FormattedPHPToExcel(1900, 1, 1, $PHPDateArray['hour'], $PHPDateArray['minute'], $PHPDateArray['second']) - 1; + } + + switch (PHPExcel_Calculation_Functions::getReturnDateType()) { + case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL: + return (float) $excelDateValue; + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC: + return (integer) $phpDateValue = PHPExcel_Shared_Date::ExcelToPHP($excelDateValue+25569) - 3600; + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT: + return new DateTime('1900-01-01 '.$PHPDateArray['hour'].':'.$PHPDateArray['minute'].':'.$PHPDateArray['second']); + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * DATEDIF + * + * @param mixed $startDate Excel date serial value, PHP date/time stamp, PHP DateTime object + * or a standard date string + * @param mixed $endDate Excel date serial value, PHP date/time stamp, PHP DateTime object + * or a standard date string + * @param string $unit + * @return integer Interval between the dates + */ + public static function DATEDIF($startDate = 0, $endDate = 0, $unit = 'D') + { + $startDate = PHPExcel_Calculation_Functions::flattenSingleValue($startDate); + $endDate = PHPExcel_Calculation_Functions::flattenSingleValue($endDate); + $unit = strtoupper(PHPExcel_Calculation_Functions::flattenSingleValue($unit)); + + if (is_string($startDate = self::getDateValue($startDate))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (is_string($endDate = self::getDateValue($endDate))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + // Validate parameters + if ($startDate >= $endDate) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Execute function + $difference = $endDate - $startDate; + + $PHPStartDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($startDate); + $startDays = $PHPStartDateObject->format('j'); + $startMonths = $PHPStartDateObject->format('n'); + $startYears = $PHPStartDateObject->format('Y'); + + $PHPEndDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($endDate); + $endDays = $PHPEndDateObject->format('j'); + $endMonths = $PHPEndDateObject->format('n'); + $endYears = $PHPEndDateObject->format('Y'); + + $retVal = PHPExcel_Calculation_Functions::NaN(); + switch ($unit) { + case 'D': + $retVal = intval($difference); + break; + case 'M': + $retVal = intval($endMonths - $startMonths) + (intval($endYears - $startYears) * 12); + // We're only interested in full months + if ($endDays < $startDays) { + --$retVal; + } + break; + case 'Y': + $retVal = intval($endYears - $startYears); + // We're only interested in full months + if ($endMonths < $startMonths) { + --$retVal; + } elseif (($endMonths == $startMonths) && ($endDays < $startDays)) { + --$retVal; + } + break; + case 'MD': + if ($endDays < $startDays) { + $retVal = $endDays; + $PHPEndDateObject->modify('-'.$endDays.' days'); + $adjustDays = $PHPEndDateObject->format('j'); + if ($adjustDays > $startDays) { + $retVal += ($adjustDays - $startDays); + } + } else { + $retVal = $endDays - $startDays; + } + break; + case 'YM': + $retVal = intval($endMonths - $startMonths); + if ($retVal < 0) { + $retVal += 12; + } + // We're only interested in full months + if ($endDays < $startDays) { + --$retVal; + } + break; + case 'YD': + $retVal = intval($difference); + if ($endYears > $startYears) { + while ($endYears > $startYears) { + $PHPEndDateObject->modify('-1 year'); + $endYears = $PHPEndDateObject->format('Y'); + } + $retVal = $PHPEndDateObject->format('z') - $PHPStartDateObject->format('z'); + if ($retVal < 0) { + $retVal += 365; + } + } + break; + default: + $retVal = PHPExcel_Calculation_Functions::NaN(); + } + return $retVal; + } + + + /** + * DAYS360 + * + * Returns the number of days between two dates based on a 360-day year (twelve 30-day months), + * which is used in some accounting calculations. Use this function to help compute payments if + * your accounting system is based on twelve 30-day months. + * + * Excel Function: + * DAYS360(startDate,endDate[,method]) + * + * @access public + * @category Date/Time Functions + * @param mixed $startDate Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @param mixed $endDate Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @param boolean $method US or European Method + * FALSE or omitted: U.S. (NASD) method. If the starting date is + * the last day of a month, it becomes equal to the 30th of the + * same month. If the ending date is the last day of a month and + * the starting date is earlier than the 30th of a month, the + * ending date becomes equal to the 1st of the next month; + * otherwise the ending date becomes equal to the 30th of the + * same month. + * TRUE: European method. Starting dates and ending dates that + * occur on the 31st of a month become equal to the 30th of the + * same month. + * @return integer Number of days between start date and end date + */ + public static function DAYS360($startDate = 0, $endDate = 0, $method = false) + { + $startDate = PHPExcel_Calculation_Functions::flattenSingleValue($startDate); + $endDate = PHPExcel_Calculation_Functions::flattenSingleValue($endDate); + + if (is_string($startDate = self::getDateValue($startDate))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (is_string($endDate = self::getDateValue($endDate))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (!is_bool($method)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + // Execute function + $PHPStartDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($startDate); + $startDay = $PHPStartDateObject->format('j'); + $startMonth = $PHPStartDateObject->format('n'); + $startYear = $PHPStartDateObject->format('Y'); + + $PHPEndDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($endDate); + $endDay = $PHPEndDateObject->format('j'); + $endMonth = $PHPEndDateObject->format('n'); + $endYear = $PHPEndDateObject->format('Y'); + + return self::dateDiff360($startDay, $startMonth, $startYear, $endDay, $endMonth, $endYear, !$method); + } + + + /** + * YEARFRAC + * + * Calculates the fraction of the year represented by the number of whole days between two dates + * (the start_date and the end_date). + * Use the YEARFRAC worksheet function to identify the proportion of a whole year's benefits or + * obligations to assign to a specific term. + * + * Excel Function: + * YEARFRAC(startDate,endDate[,method]) + * + * @access public + * @category Date/Time Functions + * @param mixed $startDate Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @param mixed $endDate Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @param integer $method Method used for the calculation + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float fraction of the year + */ + public static function YEARFRAC($startDate = 0, $endDate = 0, $method = 0) + { + $startDate = PHPExcel_Calculation_Functions::flattenSingleValue($startDate); + $endDate = PHPExcel_Calculation_Functions::flattenSingleValue($endDate); + $method = PHPExcel_Calculation_Functions::flattenSingleValue($method); + + if (is_string($startDate = self::getDateValue($startDate))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (is_string($endDate = self::getDateValue($endDate))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (((is_numeric($method)) && (!is_string($method))) || ($method == '')) { + switch ($method) { + case 0: + return self::DAYS360($startDate, $endDate) / 360; + case 1: + $days = self::DATEDIF($startDate, $endDate); + $startYear = self::YEAR($startDate); + $endYear = self::YEAR($endDate); + $years = $endYear - $startYear + 1; + $leapDays = 0; + if ($years == 1) { + if (self::isLeapYear($endYear)) { + $startMonth = self::MONTHOFYEAR($startDate); + $endMonth = self::MONTHOFYEAR($endDate); + $endDay = self::DAYOFMONTH($endDate); + if (($startMonth < 3) || + (($endMonth * 100 + $endDay) >= (2 * 100 + 29))) { + $leapDays += 1; + } + } + } else { + for ($year = $startYear; $year <= $endYear; ++$year) { + if ($year == $startYear) { + $startMonth = self::MONTHOFYEAR($startDate); + $startDay = self::DAYOFMONTH($startDate); + if ($startMonth < 3) { + $leapDays += (self::isLeapYear($year)) ? 1 : 0; + } + } elseif ($year == $endYear) { + $endMonth = self::MONTHOFYEAR($endDate); + $endDay = self::DAYOFMONTH($endDate); + if (($endMonth * 100 + $endDay) >= (2 * 100 + 29)) { + $leapDays += (self::isLeapYear($year)) ? 1 : 0; + } + } else { + $leapDays += (self::isLeapYear($year)) ? 1 : 0; + } + } + if ($years == 2) { + if (($leapDays == 0) && (self::isLeapYear($startYear)) && ($days > 365)) { + $leapDays = 1; + } elseif ($days < 366) { + $years = 1; + } + } + $leapDays /= $years; + } + return $days / (365 + $leapDays); + case 2: + return self::DATEDIF($startDate, $endDate) / 360; + case 3: + return self::DATEDIF($startDate, $endDate) / 365; + case 4: + return self::DAYS360($startDate, $endDate, true) / 360; + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * NETWORKDAYS + * + * Returns the number of whole working days between start_date and end_date. Working days + * exclude weekends and any dates identified in holidays. + * Use NETWORKDAYS to calculate employee benefits that accrue based on the number of days + * worked during a specific term. + * + * Excel Function: + * NETWORKDAYS(startDate,endDate[,holidays[,holiday[,...]]]) + * + * @access public + * @category Date/Time Functions + * @param mixed $startDate Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @param mixed $endDate Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @param mixed $holidays,... Optional series of Excel date serial value (float), PHP date + * timestamp (integer), PHP DateTime object, or a standard date + * strings that will be excluded from the working calendar, such + * as state and federal holidays and floating holidays. + * @return integer Interval between the dates + */ + public static function NETWORKDAYS($startDate, $endDate) + { + // Retrieve the mandatory start and end date that are referenced in the function definition + $startDate = PHPExcel_Calculation_Functions::flattenSingleValue($startDate); + $endDate = PHPExcel_Calculation_Functions::flattenSingleValue($endDate); + // Flush the mandatory start and end date that are referenced in the function definition, and get the optional days + $dateArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + array_shift($dateArgs); + array_shift($dateArgs); + + // Validate the start and end dates + if (is_string($startDate = $sDate = self::getDateValue($startDate))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $startDate = (float) floor($startDate); + if (is_string($endDate = $eDate = self::getDateValue($endDate))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $endDate = (float) floor($endDate); + + if ($sDate > $eDate) { + $startDate = $eDate; + $endDate = $sDate; + } + + // Execute function + $startDoW = 6 - self::DAYOFWEEK($startDate, 2); + if ($startDoW < 0) { + $startDoW = 0; + } + $endDoW = self::DAYOFWEEK($endDate, 2); + if ($endDoW >= 6) { + $endDoW = 0; + } + + $wholeWeekDays = floor(($endDate - $startDate) / 7) * 5; + $partWeekDays = $endDoW + $startDoW; + if ($partWeekDays > 5) { + $partWeekDays -= 5; + } + + // Test any extra holiday parameters + $holidayCountedArray = array(); + foreach ($dateArgs as $holidayDate) { + if (is_string($holidayDate = self::getDateValue($holidayDate))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (($holidayDate >= $startDate) && ($holidayDate <= $endDate)) { + if ((self::DAYOFWEEK($holidayDate, 2) < 6) && (!in_array($holidayDate, $holidayCountedArray))) { + --$partWeekDays; + $holidayCountedArray[] = $holidayDate; + } + } + } + + if ($sDate > $eDate) { + return 0 - ($wholeWeekDays + $partWeekDays); + } + return $wholeWeekDays + $partWeekDays; + } + + + /** + * WORKDAY + * + * Returns the date that is the indicated number of working days before or after a date (the + * starting date). Working days exclude weekends and any dates identified as holidays. + * Use WORKDAY to exclude weekends or holidays when you calculate invoice due dates, expected + * delivery times, or the number of days of work performed. + * + * Excel Function: + * WORKDAY(startDate,endDays[,holidays[,holiday[,...]]]) + * + * @access public + * @category Date/Time Functions + * @param mixed $startDate Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @param integer $endDays The number of nonweekend and nonholiday days before or after + * startDate. A positive value for days yields a future date; a + * negative value yields a past date. + * @param mixed $holidays,... Optional series of Excel date serial value (float), PHP date + * timestamp (integer), PHP DateTime object, or a standard date + * strings that will be excluded from the working calendar, such + * as state and federal holidays and floating holidays. + * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * depending on the value of the ReturnDateType flag + */ + public static function WORKDAY($startDate, $endDays) + { + // Retrieve the mandatory start date and days that are referenced in the function definition + $startDate = PHPExcel_Calculation_Functions::flattenSingleValue($startDate); + $endDays = PHPExcel_Calculation_Functions::flattenSingleValue($endDays); + // Flush the mandatory start date and days that are referenced in the function definition, and get the optional days + $dateArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + array_shift($dateArgs); + array_shift($dateArgs); + + if ((is_string($startDate = self::getDateValue($startDate))) || (!is_numeric($endDays))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $startDate = (float) floor($startDate); + $endDays = (int) floor($endDays); + // If endDays is 0, we always return startDate + if ($endDays == 0) { + return $startDate; + } + + $decrementing = ($endDays < 0) ? true : false; + + // Adjust the start date if it falls over a weekend + + $startDoW = self::DAYOFWEEK($startDate, 3); + if (self::DAYOFWEEK($startDate, 3) >= 5) { + $startDate += ($decrementing) ? -$startDoW + 4: 7 - $startDoW; + ($decrementing) ? $endDays++ : $endDays--; + } + + // Add endDays + $endDate = (float) $startDate + (intval($endDays / 5) * 7) + ($endDays % 5); + + // Adjust the calculated end date if it falls over a weekend + $endDoW = self::DAYOFWEEK($endDate, 3); + if ($endDoW >= 5) { + $endDate += ($decrementing) ? -$endDoW + 4: 7 - $endDoW; + } + + // Test any extra holiday parameters + if (!empty($dateArgs)) { + $holidayCountedArray = $holidayDates = array(); + foreach ($dateArgs as $holidayDate) { + if (($holidayDate !== null) && (trim($holidayDate) > '')) { + if (is_string($holidayDate = self::getDateValue($holidayDate))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (self::DAYOFWEEK($holidayDate, 3) < 5) { + $holidayDates[] = $holidayDate; + } + } + } + if ($decrementing) { + rsort($holidayDates, SORT_NUMERIC); + } else { + sort($holidayDates, SORT_NUMERIC); + } + foreach ($holidayDates as $holidayDate) { + if ($decrementing) { + if (($holidayDate <= $startDate) && ($holidayDate >= $endDate)) { + if (!in_array($holidayDate, $holidayCountedArray)) { + --$endDate; + $holidayCountedArray[] = $holidayDate; + } + } + } else { + if (($holidayDate >= $startDate) && ($holidayDate <= $endDate)) { + if (!in_array($holidayDate, $holidayCountedArray)) { + ++$endDate; + $holidayCountedArray[] = $holidayDate; + } + } + } + // Adjust the calculated end date if it falls over a weekend + $endDoW = self::DAYOFWEEK($endDate, 3); + if ($endDoW >= 5) { + $endDate += ($decrementing) ? -$endDoW + 4 : 7 - $endDoW; + } + } + } + + switch (PHPExcel_Calculation_Functions::getReturnDateType()) { + case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL: + return (float) $endDate; + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC: + return (integer) PHPExcel_Shared_Date::ExcelToPHP($endDate); + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT: + return PHPExcel_Shared_Date::ExcelToPHPObject($endDate); + } + } + + + /** + * DAYOFMONTH + * + * Returns the day of the month, for a specified date. The day is given as an integer + * ranging from 1 to 31. + * + * Excel Function: + * DAY(dateValue) + * + * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @return int Day of the month + */ + public static function DAYOFMONTH($dateValue = 1) + { + $dateValue = PHPExcel_Calculation_Functions::flattenSingleValue($dateValue); + + if ($dateValue === null) { + $dateValue = 1; + } elseif (is_string($dateValue = self::getDateValue($dateValue))) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif ($dateValue == 0.0) { + return 0; + } elseif ($dateValue < 0.0) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Execute function + $PHPDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($dateValue); + + return (int) $PHPDateObject->format('j'); + } + + + /** + * DAYOFWEEK + * + * Returns the day of the week for a specified date. The day is given as an integer + * ranging from 0 to 7 (dependent on the requested style). + * + * Excel Function: + * WEEKDAY(dateValue[,style]) + * + * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @param int $style A number that determines the type of return value + * 1 or omitted Numbers 1 (Sunday) through 7 (Saturday). + * 2 Numbers 1 (Monday) through 7 (Sunday). + * 3 Numbers 0 (Monday) through 6 (Sunday). + * @return int Day of the week value + */ + public static function DAYOFWEEK($dateValue = 1, $style = 1) + { + $dateValue = PHPExcel_Calculation_Functions::flattenSingleValue($dateValue); + $style = PHPExcel_Calculation_Functions::flattenSingleValue($style); + + if (!is_numeric($style)) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif (($style < 1) || ($style > 3)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $style = floor($style); + + if ($dateValue === null) { + $dateValue = 1; + } elseif (is_string($dateValue = self::getDateValue($dateValue))) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif ($dateValue < 0.0) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Execute function + $PHPDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($dateValue); + $DoW = $PHPDateObject->format('w'); + + $firstDay = 1; + switch ($style) { + case 1: + ++$DoW; + break; + case 2: + if ($DoW == 0) { + $DoW = 7; + } + break; + case 3: + if ($DoW == 0) { + $DoW = 7; + } + $firstDay = 0; + --$DoW; + break; + } + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_EXCEL) { + // Test for Excel's 1900 leap year, and introduce the error as required + if (($PHPDateObject->format('Y') == 1900) && ($PHPDateObject->format('n') <= 2)) { + --$DoW; + if ($DoW < $firstDay) { + $DoW += 7; + } + } + } + + return (int) $DoW; + } + + + /** + * WEEKOFYEAR + * + * Returns the week of the year for a specified date. + * The WEEKNUM function considers the week containing January 1 to be the first week of the year. + * However, there is a European standard that defines the first week as the one with the majority + * of days (four or more) falling in the new year. This means that for years in which there are + * three days or less in the first week of January, the WEEKNUM function returns week numbers + * that are incorrect according to the European standard. + * + * Excel Function: + * WEEKNUM(dateValue[,style]) + * + * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @param boolean $method Week begins on Sunday or Monday + * 1 or omitted Week begins on Sunday. + * 2 Week begins on Monday. + * @return int Week Number + */ + public static function WEEKOFYEAR($dateValue = 1, $method = 1) + { + $dateValue = PHPExcel_Calculation_Functions::flattenSingleValue($dateValue); + $method = PHPExcel_Calculation_Functions::flattenSingleValue($method); + + if (!is_numeric($method)) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif (($method < 1) || ($method > 2)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $method = floor($method); + + if ($dateValue === null) { + $dateValue = 1; + } elseif (is_string($dateValue = self::getDateValue($dateValue))) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif ($dateValue < 0.0) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Execute function + $PHPDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($dateValue); + $dayOfYear = $PHPDateObject->format('z'); + $dow = $PHPDateObject->format('w'); + $PHPDateObject->modify('-' . $dayOfYear . ' days'); + $dow = $PHPDateObject->format('w'); + $daysInFirstWeek = 7 - (($dow + (2 - $method)) % 7); + $dayOfYear -= $daysInFirstWeek; + $weekOfYear = ceil($dayOfYear / 7) + 1; + + return (int) $weekOfYear; + } + + + /** + * MONTHOFYEAR + * + * Returns the month of a date represented by a serial number. + * The month is given as an integer, ranging from 1 (January) to 12 (December). + * + * Excel Function: + * MONTH(dateValue) + * + * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @return int Month of the year + */ + public static function MONTHOFYEAR($dateValue = 1) + { + $dateValue = PHPExcel_Calculation_Functions::flattenSingleValue($dateValue); + + if ($dateValue === null) { + $dateValue = 1; + } elseif (is_string($dateValue = self::getDateValue($dateValue))) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif ($dateValue < 0.0) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Execute function + $PHPDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($dateValue); + + return (int) $PHPDateObject->format('n'); + } + + + /** + * YEAR + * + * Returns the year corresponding to a date. + * The year is returned as an integer in the range 1900-9999. + * + * Excel Function: + * YEAR(dateValue) + * + * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @return int Year + */ + public static function YEAR($dateValue = 1) + { + $dateValue = PHPExcel_Calculation_Functions::flattenSingleValue($dateValue); + + if ($dateValue === null) { + $dateValue = 1; + } elseif (is_string($dateValue = self::getDateValue($dateValue))) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif ($dateValue < 0.0) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Execute function + $PHPDateObject = PHPExcel_Shared_Date::ExcelToPHPObject($dateValue); + + return (int) $PHPDateObject->format('Y'); + } + + + /** + * HOUROFDAY + * + * Returns the hour of a time value. + * The hour is given as an integer, ranging from 0 (12:00 A.M.) to 23 (11:00 P.M.). + * + * Excel Function: + * HOUR(timeValue) + * + * @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard time string + * @return int Hour + */ + public static function HOUROFDAY($timeValue = 0) + { + $timeValue = PHPExcel_Calculation_Functions::flattenSingleValue($timeValue); + + if (!is_numeric($timeValue)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) { + $testVal = strtok($timeValue, '/-: '); + if (strlen($testVal) < strlen($timeValue)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + $timeValue = self::getTimeValue($timeValue); + if (is_string($timeValue)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + // Execute function + if ($timeValue >= 1) { + $timeValue = fmod($timeValue, 1); + } elseif ($timeValue < 0.0) { + return PHPExcel_Calculation_Functions::NaN(); + } + $timeValue = PHPExcel_Shared_Date::ExcelToPHP($timeValue); + + return (int) gmdate('G', $timeValue); + } + + + /** + * MINUTEOFHOUR + * + * Returns the minutes of a time value. + * The minute is given as an integer, ranging from 0 to 59. + * + * Excel Function: + * MINUTE(timeValue) + * + * @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard time string + * @return int Minute + */ + public static function MINUTEOFHOUR($timeValue = 0) + { + $timeValue = $timeTester = PHPExcel_Calculation_Functions::flattenSingleValue($timeValue); + + if (!is_numeric($timeValue)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) { + $testVal = strtok($timeValue, '/-: '); + if (strlen($testVal) < strlen($timeValue)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + $timeValue = self::getTimeValue($timeValue); + if (is_string($timeValue)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + // Execute function + if ($timeValue >= 1) { + $timeValue = fmod($timeValue, 1); + } elseif ($timeValue < 0.0) { + return PHPExcel_Calculation_Functions::NaN(); + } + $timeValue = PHPExcel_Shared_Date::ExcelToPHP($timeValue); + + return (int) gmdate('i', $timeValue); + } + + + /** + * SECONDOFMINUTE + * + * Returns the seconds of a time value. + * The second is given as an integer in the range 0 (zero) to 59. + * + * Excel Function: + * SECOND(timeValue) + * + * @param mixed $timeValue Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard time string + * @return int Second + */ + public static function SECONDOFMINUTE($timeValue = 0) + { + $timeValue = PHPExcel_Calculation_Functions::flattenSingleValue($timeValue); + + if (!is_numeric($timeValue)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) { + $testVal = strtok($timeValue, '/-: '); + if (strlen($testVal) < strlen($timeValue)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + $timeValue = self::getTimeValue($timeValue); + if (is_string($timeValue)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + // Execute function + if ($timeValue >= 1) { + $timeValue = fmod($timeValue, 1); + } elseif ($timeValue < 0.0) { + return PHPExcel_Calculation_Functions::NaN(); + } + $timeValue = PHPExcel_Shared_Date::ExcelToPHP($timeValue); + + return (int) gmdate('s', $timeValue); + } + + + /** + * EDATE + * + * Returns the serial number that represents the date that is the indicated number of months + * before or after a specified date (the start_date). + * Use EDATE to calculate maturity dates or due dates that fall on the same day of the month + * as the date of issue. + * + * Excel Function: + * EDATE(dateValue,adjustmentMonths) + * + * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @param int $adjustmentMonths The number of months before or after start_date. + * A positive value for months yields a future date; + * a negative value yields a past date. + * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * depending on the value of the ReturnDateType flag + */ + public static function EDATE($dateValue = 1, $adjustmentMonths = 0) + { + $dateValue = PHPExcel_Calculation_Functions::flattenSingleValue($dateValue); + $adjustmentMonths = PHPExcel_Calculation_Functions::flattenSingleValue($adjustmentMonths); + + if (!is_numeric($adjustmentMonths)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $adjustmentMonths = floor($adjustmentMonths); + + if (is_string($dateValue = self::getDateValue($dateValue))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + // Execute function + $PHPDateObject = self::adjustDateByMonths($dateValue, $adjustmentMonths); + + switch (PHPExcel_Calculation_Functions::getReturnDateType()) { + case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL: + return (float) PHPExcel_Shared_Date::PHPToExcel($PHPDateObject); + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC: + return (integer) PHPExcel_Shared_Date::ExcelToPHP(PHPExcel_Shared_Date::PHPToExcel($PHPDateObject)); + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT: + return $PHPDateObject; + } + } + + + /** + * EOMONTH + * + * Returns the date value for the last day of the month that is the indicated number of months + * before or after start_date. + * Use EOMONTH to calculate maturity dates or due dates that fall on the last day of the month. + * + * Excel Function: + * EOMONTH(dateValue,adjustmentMonths) + * + * @param mixed $dateValue Excel date serial value (float), PHP date timestamp (integer), + * PHP DateTime object, or a standard date string + * @param int $adjustmentMonths The number of months before or after start_date. + * A positive value for months yields a future date; + * a negative value yields a past date. + * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * depending on the value of the ReturnDateType flag + */ + public static function EOMONTH($dateValue = 1, $adjustmentMonths = 0) + { + $dateValue = PHPExcel_Calculation_Functions::flattenSingleValue($dateValue); + $adjustmentMonths = PHPExcel_Calculation_Functions::flattenSingleValue($adjustmentMonths); + + if (!is_numeric($adjustmentMonths)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $adjustmentMonths = floor($adjustmentMonths); + + if (is_string($dateValue = self::getDateValue($dateValue))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + // Execute function + $PHPDateObject = self::adjustDateByMonths($dateValue, $adjustmentMonths+1); + $adjustDays = (int) $PHPDateObject->format('d'); + $adjustDaysString = '-' . $adjustDays . ' days'; + $PHPDateObject->modify($adjustDaysString); + + switch (PHPExcel_Calculation_Functions::getReturnDateType()) { + case PHPExcel_Calculation_Functions::RETURNDATE_EXCEL: + return (float) PHPExcel_Shared_Date::PHPToExcel($PHPDateObject); + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC: + return (integer) PHPExcel_Shared_Date::ExcelToPHP(PHPExcel_Shared_Date::PHPToExcel($PHPDateObject)); + case PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT: + return $PHPDateObject; + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Calculation/Engineering.php b/application/third_party/PHPExcel/PHPExcel/Calculation/Engineering.php new file mode 100644 index 0000000..75e2784 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Calculation/Engineering.php @@ -0,0 +1,2650 @@ + array('Group' => 'Mass', 'Unit Name' => 'Gram', 'AllowPrefix' => true), + 'sg' => array('Group' => 'Mass', 'Unit Name' => 'Slug', 'AllowPrefix' => false), + 'lbm' => array('Group' => 'Mass', 'Unit Name' => 'Pound mass (avoirdupois)', 'AllowPrefix' => false), + 'u' => array('Group' => 'Mass', 'Unit Name' => 'U (atomic mass unit)', 'AllowPrefix' => true), + 'ozm' => array('Group' => 'Mass', 'Unit Name' => 'Ounce mass (avoirdupois)', 'AllowPrefix' => false), + 'm' => array('Group' => 'Distance', 'Unit Name' => 'Meter', 'AllowPrefix' => true), + 'mi' => array('Group' => 'Distance', 'Unit Name' => 'Statute mile', 'AllowPrefix' => false), + 'Nmi' => array('Group' => 'Distance', 'Unit Name' => 'Nautical mile', 'AllowPrefix' => false), + 'in' => array('Group' => 'Distance', 'Unit Name' => 'Inch', 'AllowPrefix' => false), + 'ft' => array('Group' => 'Distance', 'Unit Name' => 'Foot', 'AllowPrefix' => false), + 'yd' => array('Group' => 'Distance', 'Unit Name' => 'Yard', 'AllowPrefix' => false), + 'ang' => array('Group' => 'Distance', 'Unit Name' => 'Angstrom', 'AllowPrefix' => true), + 'Pica' => array('Group' => 'Distance', 'Unit Name' => 'Pica (1/72 in)', 'AllowPrefix' => false), + 'yr' => array('Group' => 'Time', 'Unit Name' => 'Year', 'AllowPrefix' => false), + 'day' => array('Group' => 'Time', 'Unit Name' => 'Day', 'AllowPrefix' => false), + 'hr' => array('Group' => 'Time', 'Unit Name' => 'Hour', 'AllowPrefix' => false), + 'mn' => array('Group' => 'Time', 'Unit Name' => 'Minute', 'AllowPrefix' => false), + 'sec' => array('Group' => 'Time', 'Unit Name' => 'Second', 'AllowPrefix' => true), + 'Pa' => array('Group' => 'Pressure', 'Unit Name' => 'Pascal', 'AllowPrefix' => true), + 'p' => array('Group' => 'Pressure', 'Unit Name' => 'Pascal', 'AllowPrefix' => true), + 'atm' => array('Group' => 'Pressure', 'Unit Name' => 'Atmosphere', 'AllowPrefix' => true), + 'at' => array('Group' => 'Pressure', 'Unit Name' => 'Atmosphere', 'AllowPrefix' => true), + 'mmHg' => array('Group' => 'Pressure', 'Unit Name' => 'mm of Mercury', 'AllowPrefix' => true), + 'N' => array('Group' => 'Force', 'Unit Name' => 'Newton', 'AllowPrefix' => true), + 'dyn' => array('Group' => 'Force', 'Unit Name' => 'Dyne', 'AllowPrefix' => true), + 'dy' => array('Group' => 'Force', 'Unit Name' => 'Dyne', 'AllowPrefix' => true), + 'lbf' => array('Group' => 'Force', 'Unit Name' => 'Pound force', 'AllowPrefix' => false), + 'J' => array('Group' => 'Energy', 'Unit Name' => 'Joule', 'AllowPrefix' => true), + 'e' => array('Group' => 'Energy', 'Unit Name' => 'Erg', 'AllowPrefix' => true), + 'c' => array('Group' => 'Energy', 'Unit Name' => 'Thermodynamic calorie', 'AllowPrefix' => true), + 'cal' => array('Group' => 'Energy', 'Unit Name' => 'IT calorie', 'AllowPrefix' => true), + 'eV' => array('Group' => 'Energy', 'Unit Name' => 'Electron volt', 'AllowPrefix' => true), + 'ev' => array('Group' => 'Energy', 'Unit Name' => 'Electron volt', 'AllowPrefix' => true), + 'HPh' => array('Group' => 'Energy', 'Unit Name' => 'Horsepower-hour', 'AllowPrefix' => false), + 'hh' => array('Group' => 'Energy', 'Unit Name' => 'Horsepower-hour', 'AllowPrefix' => false), + 'Wh' => array('Group' => 'Energy', 'Unit Name' => 'Watt-hour', 'AllowPrefix' => true), + 'wh' => array('Group' => 'Energy', 'Unit Name' => 'Watt-hour', 'AllowPrefix' => true), + 'flb' => array('Group' => 'Energy', 'Unit Name' => 'Foot-pound', 'AllowPrefix' => false), + 'BTU' => array('Group' => 'Energy', 'Unit Name' => 'BTU', 'AllowPrefix' => false), + 'btu' => array('Group' => 'Energy', 'Unit Name' => 'BTU', 'AllowPrefix' => false), + 'HP' => array('Group' => 'Power', 'Unit Name' => 'Horsepower', 'AllowPrefix' => false), + 'h' => array('Group' => 'Power', 'Unit Name' => 'Horsepower', 'AllowPrefix' => false), + 'W' => array('Group' => 'Power', 'Unit Name' => 'Watt', 'AllowPrefix' => true), + 'w' => array('Group' => 'Power', 'Unit Name' => 'Watt', 'AllowPrefix' => true), + 'T' => array('Group' => 'Magnetism', 'Unit Name' => 'Tesla', 'AllowPrefix' => true), + 'ga' => array('Group' => 'Magnetism', 'Unit Name' => 'Gauss', 'AllowPrefix' => true), + 'C' => array('Group' => 'Temperature', 'Unit Name' => 'Celsius', 'AllowPrefix' => false), + 'cel' => array('Group' => 'Temperature', 'Unit Name' => 'Celsius', 'AllowPrefix' => false), + 'F' => array('Group' => 'Temperature', 'Unit Name' => 'Fahrenheit', 'AllowPrefix' => false), + 'fah' => array('Group' => 'Temperature', 'Unit Name' => 'Fahrenheit', 'AllowPrefix' => false), + 'K' => array('Group' => 'Temperature', 'Unit Name' => 'Kelvin', 'AllowPrefix' => false), + 'kel' => array('Group' => 'Temperature', 'Unit Name' => 'Kelvin', 'AllowPrefix' => false), + 'tsp' => array('Group' => 'Liquid', 'Unit Name' => 'Teaspoon', 'AllowPrefix' => false), + 'tbs' => array('Group' => 'Liquid', 'Unit Name' => 'Tablespoon', 'AllowPrefix' => false), + 'oz' => array('Group' => 'Liquid', 'Unit Name' => 'Fluid Ounce', 'AllowPrefix' => false), + 'cup' => array('Group' => 'Liquid', 'Unit Name' => 'Cup', 'AllowPrefix' => false), + 'pt' => array('Group' => 'Liquid', 'Unit Name' => 'U.S. Pint', 'AllowPrefix' => false), + 'us_pt' => array('Group' => 'Liquid', 'Unit Name' => 'U.S. Pint', 'AllowPrefix' => false), + 'uk_pt' => array('Group' => 'Liquid', 'Unit Name' => 'U.K. Pint', 'AllowPrefix' => false), + 'qt' => array('Group' => 'Liquid', 'Unit Name' => 'Quart', 'AllowPrefix' => false), + 'gal' => array('Group' => 'Liquid', 'Unit Name' => 'Gallon', 'AllowPrefix' => false), + 'l' => array('Group' => 'Liquid', 'Unit Name' => 'Litre', 'AllowPrefix' => true), + 'lt' => array('Group' => 'Liquid', 'Unit Name' => 'Litre', 'AllowPrefix' => true), + ); + + /** + * Details of the Multiplier prefixes that can be used with Units of Measure in CONVERTUOM() + * + * @var mixed[] + */ + private static $conversionMultipliers = array( + 'Y' => array('multiplier' => 1E24, 'name' => 'yotta'), + 'Z' => array('multiplier' => 1E21, 'name' => 'zetta'), + 'E' => array('multiplier' => 1E18, 'name' => 'exa'), + 'P' => array('multiplier' => 1E15, 'name' => 'peta'), + 'T' => array('multiplier' => 1E12, 'name' => 'tera'), + 'G' => array('multiplier' => 1E9, 'name' => 'giga'), + 'M' => array('multiplier' => 1E6, 'name' => 'mega'), + 'k' => array('multiplier' => 1E3, 'name' => 'kilo'), + 'h' => array('multiplier' => 1E2, 'name' => 'hecto'), + 'e' => array('multiplier' => 1E1, 'name' => 'deka'), + 'd' => array('multiplier' => 1E-1, 'name' => 'deci'), + 'c' => array('multiplier' => 1E-2, 'name' => 'centi'), + 'm' => array('multiplier' => 1E-3, 'name' => 'milli'), + 'u' => array('multiplier' => 1E-6, 'name' => 'micro'), + 'n' => array('multiplier' => 1E-9, 'name' => 'nano'), + 'p' => array('multiplier' => 1E-12, 'name' => 'pico'), + 'f' => array('multiplier' => 1E-15, 'name' => 'femto'), + 'a' => array('multiplier' => 1E-18, 'name' => 'atto'), + 'z' => array('multiplier' => 1E-21, 'name' => 'zepto'), + 'y' => array('multiplier' => 1E-24, 'name' => 'yocto'), + ); + + /** + * Details of the Units of measure conversion factors, organised by group + * + * @var mixed[] + */ + private static $unitConversions = array( + 'Mass' => array( + 'g' => array( + 'g' => 1.0, + 'sg' => 6.85220500053478E-05, + 'lbm' => 2.20462291469134E-03, + 'u' => 6.02217000000000E+23, + 'ozm' => 3.52739718003627E-02, + ), + 'sg' => array( + 'g' => 1.45938424189287E+04, + 'sg' => 1.0, + 'lbm' => 3.21739194101647E+01, + 'u' => 8.78866000000000E+27, + 'ozm' => 5.14782785944229E+02, + ), + 'lbm' => array( + 'g' => 4.5359230974881148E+02, + 'sg' => 3.10810749306493E-02, + 'lbm' => 1.0, + 'u' => 2.73161000000000E+26, + 'ozm' => 1.60000023429410E+01, + ), + 'u' => array( + 'g' => 1.66053100460465E-24, + 'sg' => 1.13782988532950E-28, + 'lbm' => 3.66084470330684E-27, + 'u' => 1.0, + 'ozm' => 5.85735238300524E-26, + ), + 'ozm' => array( + 'g' => 2.83495152079732E+01, + 'sg' => 1.94256689870811E-03, + 'lbm' => 6.24999908478882E-02, + 'u' => 1.70725600000000E+25, + 'ozm' => 1.0, + ), + ), + 'Distance' => array( + 'm' => array( + 'm' => 1.0, + 'mi' => 6.21371192237334E-04, + 'Nmi' => 5.39956803455724E-04, + 'in' => 3.93700787401575E+01, + 'ft' => 3.28083989501312E+00, + 'yd' => 1.09361329797891E+00, + 'ang' => 1.00000000000000E+10, + 'Pica' => 2.83464566929116E+03, + ), + 'mi' => array( + 'm' => 1.60934400000000E+03, + 'mi' => 1.0, + 'Nmi' => 8.68976241900648E-01, + 'in' => 6.33600000000000E+04, + 'ft' => 5.28000000000000E+03, + 'yd' => 1.76000000000000E+03, + 'ang' => 1.60934400000000E+13, + 'Pica' => 4.56191999999971E+06, + ), + 'Nmi' => array( + 'm' => 1.85200000000000E+03, + 'mi' => 1.15077944802354E+00, + 'Nmi' => 1.0, + 'in' => 7.29133858267717E+04, + 'ft' => 6.07611548556430E+03, + 'yd' => 2.02537182785694E+03, + 'ang' => 1.85200000000000E+13, + 'Pica' => 5.24976377952723E+06, + ), + 'in' => array( + 'm' => 2.54000000000000E-02, + 'mi' => 1.57828282828283E-05, + 'Nmi' => 1.37149028077754E-05, + 'in' => 1.0, + 'ft' => 8.33333333333333E-02, + 'yd' => 2.77777777686643E-02, + 'ang' => 2.54000000000000E+08, + 'Pica' => 7.19999999999955E+01, + ), + 'ft' => array( + 'm' => 3.04800000000000E-01, + 'mi' => 1.89393939393939E-04, + 'Nmi' => 1.64578833693305E-04, + 'in' => 1.20000000000000E+01, + 'ft' => 1.0, + 'yd' => 3.33333333223972E-01, + 'ang' => 3.04800000000000E+09, + 'Pica' => 8.63999999999946E+02, + ), + 'yd' => array( + 'm' => 9.14400000300000E-01, + 'mi' => 5.68181818368230E-04, + 'Nmi' => 4.93736501241901E-04, + 'in' => 3.60000000118110E+01, + 'ft' => 3.00000000000000E+00, + 'yd' => 1.0, + 'ang' => 9.14400000300000E+09, + 'Pica' => 2.59200000085023E+03, + ), + 'ang' => array( + 'm' => 1.00000000000000E-10, + 'mi' => 6.21371192237334E-14, + 'Nmi' => 5.39956803455724E-14, + 'in' => 3.93700787401575E-09, + 'ft' => 3.28083989501312E-10, + 'yd' => 1.09361329797891E-10, + 'ang' => 1.0, + 'Pica' => 2.83464566929116E-07, + ), + 'Pica' => array( + 'm' => 3.52777777777800E-04, + 'mi' => 2.19205948372629E-07, + 'Nmi' => 1.90484761219114E-07, + 'in' => 1.38888888888898E-02, + 'ft' => 1.15740740740748E-03, + 'yd' => 3.85802469009251E-04, + 'ang' => 3.52777777777800E+06, + 'Pica' => 1.0, + ), + ), + 'Time' => array( + 'yr' => array( + 'yr' => 1.0, + 'day' => 365.25, + 'hr' => 8766.0, + 'mn' => 525960.0, + 'sec' => 31557600.0, + ), + 'day' => array( + 'yr' => 2.73785078713210E-03, + 'day' => 1.0, + 'hr' => 24.0, + 'mn' => 1440.0, + 'sec' => 86400.0, + ), + 'hr' => array( + 'yr' => 1.14077116130504E-04, + 'day' => 4.16666666666667E-02, + 'hr' => 1.0, + 'mn' => 60.0, + 'sec' => 3600.0, + ), + 'mn' => array( + 'yr' => 1.90128526884174E-06, + 'day' => 6.94444444444444E-04, + 'hr' => 1.66666666666667E-02, + 'mn' => 1.0, + 'sec' => 60.0, + ), + 'sec' => array( + 'yr' => 3.16880878140289E-08, + 'day' => 1.15740740740741E-05, + 'hr' => 2.77777777777778E-04, + 'mn' => 1.66666666666667E-02, + 'sec' => 1.0, + ), + ), + 'Pressure' => array( + 'Pa' => array( + 'Pa' => 1.0, + 'p' => 1.0, + 'atm' => 9.86923299998193E-06, + 'at' => 9.86923299998193E-06, + 'mmHg' => 7.50061707998627E-03, + ), + 'p' => array( + 'Pa' => 1.0, + 'p' => 1.0, + 'atm' => 9.86923299998193E-06, + 'at' => 9.86923299998193E-06, + 'mmHg' => 7.50061707998627E-03, + ), + 'atm' => array( + 'Pa' => 1.01324996583000E+05, + 'p' => 1.01324996583000E+05, + 'atm' => 1.0, + 'at' => 1.0, + 'mmHg' => 760.0, + ), + 'at' => array( + 'Pa' => 1.01324996583000E+05, + 'p' => 1.01324996583000E+05, + 'atm' => 1.0, + 'at' => 1.0, + 'mmHg' => 760.0, + ), + 'mmHg' => array( + 'Pa' => 1.33322363925000E+02, + 'p' => 1.33322363925000E+02, + 'atm' => 1.31578947368421E-03, + 'at' => 1.31578947368421E-03, + 'mmHg' => 1.0, + ), + ), + 'Force' => array( + 'N' => array( + 'N' => 1.0, + 'dyn' => 1.0E+5, + 'dy' => 1.0E+5, + 'lbf' => 2.24808923655339E-01, + ), + 'dyn' => array( + 'N' => 1.0E-5, + 'dyn' => 1.0, + 'dy' => 1.0, + 'lbf' => 2.24808923655339E-06, + ), + 'dy' => array( + 'N' => 1.0E-5, + 'dyn' => 1.0, + 'dy' => 1.0, + 'lbf' => 2.24808923655339E-06, + ), + 'lbf' => array( + 'N' => 4.448222, + 'dyn' => 4.448222E+5, + 'dy' => 4.448222E+5, + 'lbf' => 1.0, + ), + ), + 'Energy' => array( + 'J' => array( + 'J' => 1.0, + 'e' => 9.99999519343231E+06, + 'c' => 2.39006249473467E-01, + 'cal' => 2.38846190642017E-01, + 'eV' => 6.24145700000000E+18, + 'ev' => 6.24145700000000E+18, + 'HPh' => 3.72506430801000E-07, + 'hh' => 3.72506430801000E-07, + 'Wh' => 2.77777916238711E-04, + 'wh' => 2.77777916238711E-04, + 'flb' => 2.37304222192651E+01, + 'BTU' => 9.47815067349015E-04, + 'btu' => 9.47815067349015E-04, + ), + 'e' => array( + 'J' => 1.00000048065700E-07, + 'e' => 1.0, + 'c' => 2.39006364353494E-08, + 'cal' => 2.38846305445111E-08, + 'eV' => 6.24146000000000E+11, + 'ev' => 6.24146000000000E+11, + 'HPh' => 3.72506609848824E-14, + 'hh' => 3.72506609848824E-14, + 'Wh' => 2.77778049754611E-11, + 'wh' => 2.77778049754611E-11, + 'flb' => 2.37304336254586E-06, + 'BTU' => 9.47815522922962E-11, + 'btu' => 9.47815522922962E-11, + ), + 'c' => array( + 'J' => 4.18399101363672E+00, + 'e' => 4.18398900257312E+07, + 'c' => 1.0, + 'cal' => 9.99330315287563E-01, + 'eV' => 2.61142000000000E+19, + 'ev' => 2.61142000000000E+19, + 'HPh' => 1.55856355899327E-06, + 'hh' => 1.55856355899327E-06, + 'Wh' => 1.16222030532950E-03, + 'wh' => 1.16222030532950E-03, + 'flb' => 9.92878733152102E+01, + 'BTU' => 3.96564972437776E-03, + 'btu' => 3.96564972437776E-03, + ), + 'cal' => array( + 'J' => 4.18679484613929E+00, + 'e' => 4.18679283372801E+07, + 'c' => 1.00067013349059E+00, + 'cal' => 1.0, + 'eV' => 2.61317000000000E+19, + 'ev' => 2.61317000000000E+19, + 'HPh' => 1.55960800463137E-06, + 'hh' => 1.55960800463137E-06, + 'Wh' => 1.16299914807955E-03, + 'wh' => 1.16299914807955E-03, + 'flb' => 9.93544094443283E+01, + 'BTU' => 3.96830723907002E-03, + 'btu' => 3.96830723907002E-03, + ), + 'eV' => array( + 'J' => 1.60219000146921E-19, + 'e' => 1.60218923136574E-12, + 'c' => 3.82933423195043E-20, + 'cal' => 3.82676978535648E-20, + 'eV' => 1.0, + 'ev' => 1.0, + 'HPh' => 5.96826078912344E-26, + 'hh' => 5.96826078912344E-26, + 'Wh' => 4.45053000026614E-23, + 'wh' => 4.45053000026614E-23, + 'flb' => 3.80206452103492E-18, + 'BTU' => 1.51857982414846E-22, + 'btu' => 1.51857982414846E-22, + ), + 'ev' => array( + 'J' => 1.60219000146921E-19, + 'e' => 1.60218923136574E-12, + 'c' => 3.82933423195043E-20, + 'cal' => 3.82676978535648E-20, + 'eV' => 1.0, + 'ev' => 1.0, + 'HPh' => 5.96826078912344E-26, + 'hh' => 5.96826078912344E-26, + 'Wh' => 4.45053000026614E-23, + 'wh' => 4.45053000026614E-23, + 'flb' => 3.80206452103492E-18, + 'BTU' => 1.51857982414846E-22, + 'btu' => 1.51857982414846E-22, + ), + 'HPh' => array( + 'J' => 2.68451741316170E+06, + 'e' => 2.68451612283024E+13, + 'c' => 6.41616438565991E+05, + 'cal' => 6.41186757845835E+05, + 'eV' => 1.67553000000000E+25, + 'ev' => 1.67553000000000E+25, + 'HPh' => 1.0, + 'hh' => 1.0, + 'Wh' => 7.45699653134593E+02, + 'wh' => 7.45699653134593E+02, + 'flb' => 6.37047316692964E+07, + 'BTU' => 2.54442605275546E+03, + 'btu' => 2.54442605275546E+03, + ), + 'hh' => array( + 'J' => 2.68451741316170E+06, + 'e' => 2.68451612283024E+13, + 'c' => 6.41616438565991E+05, + 'cal' => 6.41186757845835E+05, + 'eV' => 1.67553000000000E+25, + 'ev' => 1.67553000000000E+25, + 'HPh' => 1.0, + 'hh' => 1.0, + 'Wh' => 7.45699653134593E+02, + 'wh' => 7.45699653134593E+02, + 'flb' => 6.37047316692964E+07, + 'BTU' => 2.54442605275546E+03, + 'btu' => 2.54442605275546E+03, + ), + 'Wh' => array( + 'J' => 3.59999820554720E+03, + 'e' => 3.59999647518369E+10, + 'c' => 8.60422069219046E+02, + 'cal' => 8.59845857713046E+02, + 'eV' => 2.24692340000000E+22, + 'ev' => 2.24692340000000E+22, + 'HPh' => 1.34102248243839E-03, + 'hh' => 1.34102248243839E-03, + 'Wh' => 1.0, + 'wh' => 1.0, + 'flb' => 8.54294774062316E+04, + 'BTU' => 3.41213254164705E+00, + 'btu' => 3.41213254164705E+00, + ), + 'wh' => array( + 'J' => 3.59999820554720E+03, + 'e' => 3.59999647518369E+10, + 'c' => 8.60422069219046E+02, + 'cal' => 8.59845857713046E+02, + 'eV' => 2.24692340000000E+22, + 'ev' => 2.24692340000000E+22, + 'HPh' => 1.34102248243839E-03, + 'hh' => 1.34102248243839E-03, + 'Wh' => 1.0, + 'wh' => 1.0, + 'flb' => 8.54294774062316E+04, + 'BTU' => 3.41213254164705E+00, + 'btu' => 3.41213254164705E+00, + ), + 'flb' => array( + 'J' => 4.21400003236424E-02, + 'e' => 4.21399800687660E+05, + 'c' => 1.00717234301644E-02, + 'cal' => 1.00649785509554E-02, + 'eV' => 2.63015000000000E+17, + 'ev' => 2.63015000000000E+17, + 'HPh' => 1.56974211145130E-08, + 'hh' => 1.56974211145130E-08, + 'Wh' => 1.17055614802000E-05, + 'wh' => 1.17055614802000E-05, + 'flb' => 1.0, + 'BTU' => 3.99409272448406E-05, + 'btu' => 3.99409272448406E-05, + ), + 'BTU' => array( + 'J' => 1.05505813786749E+03, + 'e' => 1.05505763074665E+10, + 'c' => 2.52165488508168E+02, + 'cal' => 2.51996617135510E+02, + 'eV' => 6.58510000000000E+21, + 'ev' => 6.58510000000000E+21, + 'HPh' => 3.93015941224568E-04, + 'hh' => 3.93015941224568E-04, + 'Wh' => 2.93071851047526E-01, + 'wh' => 2.93071851047526E-01, + 'flb' => 2.50369750774671E+04, + 'BTU' => 1.0, + 'btu' => 1.0, + ), + 'btu' => array( + 'J' => 1.05505813786749E+03, + 'e' => 1.05505763074665E+10, + 'c' => 2.52165488508168E+02, + 'cal' => 2.51996617135510E+02, + 'eV' => 6.58510000000000E+21, + 'ev' => 6.58510000000000E+21, + 'HPh' => 3.93015941224568E-04, + 'hh' => 3.93015941224568E-04, + 'Wh' => 2.93071851047526E-01, + 'wh' => 2.93071851047526E-01, + 'flb' => 2.50369750774671E+04, + 'BTU' => 1.0, + 'btu' => 1.0, + ), + ), + 'Power' => array( + 'HP' => array( + 'HP' => 1.0, + 'h' => 1.0, + 'W' => 7.45701000000000E+02, + 'w' => 7.45701000000000E+02, + ), + 'h' => array( + 'HP' => 1.0, + 'h' => 1.0, + 'W' => 7.45701000000000E+02, + 'w' => 7.45701000000000E+02, + ), + 'W' => array( + 'HP' => 1.34102006031908E-03, + 'h' => 1.34102006031908E-03, + 'W' => 1.0, + 'w' => 1.0, + ), + 'w' => array( + 'HP' => 1.34102006031908E-03, + 'h' => 1.34102006031908E-03, + 'W' => 1.0, + 'w' => 1.0, + ), + ), + 'Magnetism' => array( + 'T' => array( + 'T' => 1.0, + 'ga' => 10000.0, + ), + 'ga' => array( + 'T' => 0.0001, + 'ga' => 1.0, + ), + ), + 'Liquid' => array( + 'tsp' => array( + 'tsp' => 1.0, + 'tbs' => 3.33333333333333E-01, + 'oz' => 1.66666666666667E-01, + 'cup' => 2.08333333333333E-02, + 'pt' => 1.04166666666667E-02, + 'us_pt' => 1.04166666666667E-02, + 'uk_pt' => 8.67558516821960E-03, + 'qt' => 5.20833333333333E-03, + 'gal' => 1.30208333333333E-03, + 'l' => 4.92999408400710E-03, + 'lt' => 4.92999408400710E-03, + ), + 'tbs' => array( + 'tsp' => 3.00000000000000E+00, + 'tbs' => 1.0, + 'oz' => 5.00000000000000E-01, + 'cup' => 6.25000000000000E-02, + 'pt' => 3.12500000000000E-02, + 'us_pt' => 3.12500000000000E-02, + 'uk_pt' => 2.60267555046588E-02, + 'qt' => 1.56250000000000E-02, + 'gal' => 3.90625000000000E-03, + 'l' => 1.47899822520213E-02, + 'lt' => 1.47899822520213E-02, + ), + 'oz' => array( + 'tsp' => 6.00000000000000E+00, + 'tbs' => 2.00000000000000E+00, + 'oz' => 1.0, + 'cup' => 1.25000000000000E-01, + 'pt' => 6.25000000000000E-02, + 'us_pt' => 6.25000000000000E-02, + 'uk_pt' => 5.20535110093176E-02, + 'qt' => 3.12500000000000E-02, + 'gal' => 7.81250000000000E-03, + 'l' => 2.95799645040426E-02, + 'lt' => 2.95799645040426E-02, + ), + 'cup' => array( + 'tsp' => 4.80000000000000E+01, + 'tbs' => 1.60000000000000E+01, + 'oz' => 8.00000000000000E+00, + 'cup' => 1.0, + 'pt' => 5.00000000000000E-01, + 'us_pt' => 5.00000000000000E-01, + 'uk_pt' => 4.16428088074541E-01, + 'qt' => 2.50000000000000E-01, + 'gal' => 6.25000000000000E-02, + 'l' => 2.36639716032341E-01, + 'lt' => 2.36639716032341E-01, + ), + 'pt' => array( + 'tsp' => 9.60000000000000E+01, + 'tbs' => 3.20000000000000E+01, + 'oz' => 1.60000000000000E+01, + 'cup' => 2.00000000000000E+00, + 'pt' => 1.0, + 'us_pt' => 1.0, + 'uk_pt' => 8.32856176149081E-01, + 'qt' => 5.00000000000000E-01, + 'gal' => 1.25000000000000E-01, + 'l' => 4.73279432064682E-01, + 'lt' => 4.73279432064682E-01, + ), + 'us_pt' => array( + 'tsp' => 9.60000000000000E+01, + 'tbs' => 3.20000000000000E+01, + 'oz' => 1.60000000000000E+01, + 'cup' => 2.00000000000000E+00, + 'pt' => 1.0, + 'us_pt' => 1.0, + 'uk_pt' => 8.32856176149081E-01, + 'qt' => 5.00000000000000E-01, + 'gal' => 1.25000000000000E-01, + 'l' => 4.73279432064682E-01, + 'lt' => 4.73279432064682E-01, + ), + 'uk_pt' => array( + 'tsp' => 1.15266000000000E+02, + 'tbs' => 3.84220000000000E+01, + 'oz' => 1.92110000000000E+01, + 'cup' => 2.40137500000000E+00, + 'pt' => 1.20068750000000E+00, + 'us_pt' => 1.20068750000000E+00, + 'uk_pt' => 1.0, + 'qt' => 6.00343750000000E-01, + 'gal' => 1.50085937500000E-01, + 'l' => 5.68260698087162E-01, + 'lt' => 5.68260698087162E-01, + ), + 'qt' => array( + 'tsp' => 1.92000000000000E+02, + 'tbs' => 6.40000000000000E+01, + 'oz' => 3.20000000000000E+01, + 'cup' => 4.00000000000000E+00, + 'pt' => 2.00000000000000E+00, + 'us_pt' => 2.00000000000000E+00, + 'uk_pt' => 1.66571235229816E+00, + 'qt' => 1.0, + 'gal' => 2.50000000000000E-01, + 'l' => 9.46558864129363E-01, + 'lt' => 9.46558864129363E-01, + ), + 'gal' => array( + 'tsp' => 7.68000000000000E+02, + 'tbs' => 2.56000000000000E+02, + 'oz' => 1.28000000000000E+02, + 'cup' => 1.60000000000000E+01, + 'pt' => 8.00000000000000E+00, + 'us_pt' => 8.00000000000000E+00, + 'uk_pt' => 6.66284940919265E+00, + 'qt' => 4.00000000000000E+00, + 'gal' => 1.0, + 'l' => 3.78623545651745E+00, + 'lt' => 3.78623545651745E+00, + ), + 'l' => array( + 'tsp' => 2.02840000000000E+02, + 'tbs' => 6.76133333333333E+01, + 'oz' => 3.38066666666667E+01, + 'cup' => 4.22583333333333E+00, + 'pt' => 2.11291666666667E+00, + 'us_pt' => 2.11291666666667E+00, + 'uk_pt' => 1.75975569552166E+00, + 'qt' => 1.05645833333333E+00, + 'gal' => 2.64114583333333E-01, + 'l' => 1.0, + 'lt' => 1.0, + ), + 'lt' => array( + 'tsp' => 2.02840000000000E+02, + 'tbs' => 6.76133333333333E+01, + 'oz' => 3.38066666666667E+01, + 'cup' => 4.22583333333333E+00, + 'pt' => 2.11291666666667E+00, + 'us_pt' => 2.11291666666667E+00, + 'uk_pt' => 1.75975569552166E+00, + 'qt' => 1.05645833333333E+00, + 'gal' => 2.64114583333333E-01, + 'l' => 1.0, + 'lt' => 1.0, + ), + ), + ); + + + /** + * parseComplex + * + * Parses a complex number into its real and imaginary parts, and an I or J suffix + * + * @param string $complexNumber The complex number + * @return string[] Indexed on "real", "imaginary" and "suffix" + */ + public static function parseComplex($complexNumber) + { + $workString = (string) $complexNumber; + + $realNumber = $imaginary = 0; + // Extract the suffix, if there is one + $suffix = substr($workString, -1); + if (!is_numeric($suffix)) { + $workString = substr($workString, 0, -1); + } else { + $suffix = ''; + } + + // Split the input into its Real and Imaginary components + $leadingSign = 0; + if (strlen($workString) > 0) { + $leadingSign = (($workString{0} == '+') || ($workString{0} == '-')) ? 1 : 0; + } + $power = ''; + $realNumber = strtok($workString, '+-'); + if (strtoupper(substr($realNumber, -1)) == 'E') { + $power = strtok('+-'); + ++$leadingSign; + } + + $realNumber = substr($workString, 0, strlen($realNumber)+strlen($power)+$leadingSign); + + if ($suffix != '') { + $imaginary = substr($workString, strlen($realNumber)); + + if (($imaginary == '') && (($realNumber == '') || ($realNumber == '+') || ($realNumber == '-'))) { + $imaginary = $realNumber.'1'; + $realNumber = '0'; + } elseif ($imaginary == '') { + $imaginary = $realNumber; + $realNumber = '0'; + } elseif (($imaginary == '+') || ($imaginary == '-')) { + $imaginary .= '1'; + } + } + + return array( + 'real' => $realNumber, + 'imaginary' => $imaginary, + 'suffix' => $suffix + ); + } + + + /** + * Cleans the leading characters in a complex number string + * + * @param string $complexNumber The complex number to clean + * @return string The "cleaned" complex number + */ + private static function cleanComplex($complexNumber) + { + if ($complexNumber{0} == '+') { + $complexNumber = substr($complexNumber, 1); + } + if ($complexNumber{0} == '0') { + $complexNumber = substr($complexNumber, 1); + } + if ($complexNumber{0} == '.') { + $complexNumber = '0'.$complexNumber; + } + if ($complexNumber{0} == '+') { + $complexNumber = substr($complexNumber, 1); + } + return $complexNumber; + } + + /** + * Formats a number base string value with leading zeroes + * + * @param string $xVal The "number" to pad + * @param integer $places The length that we want to pad this value + * @return string The padded "number" + */ + private static function nbrConversionFormat($xVal, $places) + { + if (!is_null($places)) { + if (strlen($xVal) <= $places) { + return substr(str_pad($xVal, $places, '0', STR_PAD_LEFT), -10); + } else { + return PHPExcel_Calculation_Functions::NaN(); + } + } + + return substr($xVal, -10); + } + + /** + * BESSELI + * + * Returns the modified Bessel function In(x), which is equivalent to the Bessel function evaluated + * for purely imaginary arguments + * + * Excel Function: + * BESSELI(x,ord) + * + * @access public + * @category Engineering Functions + * @param float $x The value at which to evaluate the function. + * If x is nonnumeric, BESSELI returns the #VALUE! error value. + * @param integer $ord The order of the Bessel function. + * If ord is not an integer, it is truncated. + * If $ord is nonnumeric, BESSELI returns the #VALUE! error value. + * If $ord < 0, BESSELI returns the #NUM! error value. + * @return float + * + */ + public static function BESSELI($x, $ord) + { + $x = (is_null($x)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($x); + $ord = (is_null($ord)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($ord); + + if ((is_numeric($x)) && (is_numeric($ord))) { + $ord = floor($ord); + if ($ord < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + + if (abs($x) <= 30) { + $fResult = $fTerm = pow($x / 2, $ord) / PHPExcel_Calculation_MathTrig::FACT($ord); + $ordK = 1; + $fSqrX = ($x * $x) / 4; + do { + $fTerm *= $fSqrX; + $fTerm /= ($ordK * ($ordK + $ord)); + $fResult += $fTerm; + } while ((abs($fTerm) > 1e-12) && (++$ordK < 100)); + } else { + $f_2_PI = 2 * M_PI; + + $fXAbs = abs($x); + $fResult = exp($fXAbs) / sqrt($f_2_PI * $fXAbs); + if (($ord & 1) && ($x < 0)) { + $fResult = -$fResult; + } + } + return (is_nan($fResult)) ? PHPExcel_Calculation_Functions::NaN() : $fResult; + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * BESSELJ + * + * Returns the Bessel function + * + * Excel Function: + * BESSELJ(x,ord) + * + * @access public + * @category Engineering Functions + * @param float $x The value at which to evaluate the function. + * If x is nonnumeric, BESSELJ returns the #VALUE! error value. + * @param integer $ord The order of the Bessel function. If n is not an integer, it is truncated. + * If $ord is nonnumeric, BESSELJ returns the #VALUE! error value. + * If $ord < 0, BESSELJ returns the #NUM! error value. + * @return float + * + */ + public static function BESSELJ($x, $ord) + { + $x = (is_null($x)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($x); + $ord = (is_null($ord)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($ord); + + if ((is_numeric($x)) && (is_numeric($ord))) { + $ord = floor($ord); + if ($ord < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + + $fResult = 0; + if (abs($x) <= 30) { + $fResult = $fTerm = pow($x / 2, $ord) / PHPExcel_Calculation_MathTrig::FACT($ord); + $ordK = 1; + $fSqrX = ($x * $x) / -4; + do { + $fTerm *= $fSqrX; + $fTerm /= ($ordK * ($ordK + $ord)); + $fResult += $fTerm; + } while ((abs($fTerm) > 1e-12) && (++$ordK < 100)); + } else { + $f_PI_DIV_2 = M_PI / 2; + $f_PI_DIV_4 = M_PI / 4; + + $fXAbs = abs($x); + $fResult = sqrt(M_2DIVPI / $fXAbs) * cos($fXAbs - $ord * $f_PI_DIV_2 - $f_PI_DIV_4); + if (($ord & 1) && ($x < 0)) { + $fResult = -$fResult; + } + } + return (is_nan($fResult)) ? PHPExcel_Calculation_Functions::NaN() : $fResult; + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + private static function besselK0($fNum) + { + if ($fNum <= 2) { + $fNum2 = $fNum * 0.5; + $y = ($fNum2 * $fNum2); + $fRet = -log($fNum2) * self::BESSELI($fNum, 0) + + (-0.57721566 + $y * (0.42278420 + $y * (0.23069756 + $y * (0.3488590e-1 + $y * (0.262698e-2 + $y * + (0.10750e-3 + $y * 0.74e-5)))))); + } else { + $y = 2 / $fNum; + $fRet = exp(-$fNum) / sqrt($fNum) * + (1.25331414 + $y * (-0.7832358e-1 + $y * (0.2189568e-1 + $y * (-0.1062446e-1 + $y * + (0.587872e-2 + $y * (-0.251540e-2 + $y * 0.53208e-3)))))); + } + return $fRet; + } + + + private static function besselK1($fNum) + { + if ($fNum <= 2) { + $fNum2 = $fNum * 0.5; + $y = ($fNum2 * $fNum2); + $fRet = log($fNum2) * self::BESSELI($fNum, 1) + + (1 + $y * (0.15443144 + $y * (-0.67278579 + $y * (-0.18156897 + $y * (-0.1919402e-1 + $y * + (-0.110404e-2 + $y * (-0.4686e-4))))))) / $fNum; + } else { + $y = 2 / $fNum; + $fRet = exp(-$fNum) / sqrt($fNum) * + (1.25331414 + $y * (0.23498619 + $y * (-0.3655620e-1 + $y * (0.1504268e-1 + $y * (-0.780353e-2 + $y * + (0.325614e-2 + $y * (-0.68245e-3))))))); + } + return $fRet; + } + + + /** + * BESSELK + * + * Returns the modified Bessel function Kn(x), which is equivalent to the Bessel functions evaluated + * for purely imaginary arguments. + * + * Excel Function: + * BESSELK(x,ord) + * + * @access public + * @category Engineering Functions + * @param float $x The value at which to evaluate the function. + * If x is nonnumeric, BESSELK returns the #VALUE! error value. + * @param integer $ord The order of the Bessel function. If n is not an integer, it is truncated. + * If $ord is nonnumeric, BESSELK returns the #VALUE! error value. + * If $ord < 0, BESSELK returns the #NUM! error value. + * @return float + * + */ + public static function BESSELK($x, $ord) + { + $x = (is_null($x)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($x); + $ord = (is_null($ord)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($ord); + + if ((is_numeric($x)) && (is_numeric($ord))) { + if (($ord < 0) || ($x == 0.0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + + switch (floor($ord)) { + case 0: + return self::besselK0($x); + case 1: + return self::besselK1($x); + default: + $fTox = 2 / $x; + $fBkm = self::besselK0($x); + $fBk = self::besselK1($x); + for ($n = 1; $n < $ord; ++$n) { + $fBkp = $fBkm + $n * $fTox * $fBk; + $fBkm = $fBk; + $fBk = $fBkp; + } + } + return (is_nan($fBk)) ? PHPExcel_Calculation_Functions::NaN() : $fBk; + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + private static function besselY0($fNum) + { + if ($fNum < 8.0) { + $y = ($fNum * $fNum); + $f1 = -2957821389.0 + $y * (7062834065.0 + $y * (-512359803.6 + $y * (10879881.29 + $y * (-86327.92757 + $y * 228.4622733)))); + $f2 = 40076544269.0 + $y * (745249964.8 + $y * (7189466.438 + $y * (47447.26470 + $y * (226.1030244 + $y)))); + $fRet = $f1 / $f2 + 0.636619772 * self::BESSELJ($fNum, 0) * log($fNum); + } else { + $z = 8.0 / $fNum; + $y = ($z * $z); + $xx = $fNum - 0.785398164; + $f1 = 1 + $y * (-0.1098628627e-2 + $y * (0.2734510407e-4 + $y * (-0.2073370639e-5 + $y * 0.2093887211e-6))); + $f2 = -0.1562499995e-1 + $y * (0.1430488765e-3 + $y * (-0.6911147651e-5 + $y * (0.7621095161e-6 + $y * (-0.934945152e-7)))); + $fRet = sqrt(0.636619772 / $fNum) * (sin($xx) * $f1 + $z * cos($xx) * $f2); + } + return $fRet; + } + + + private static function besselY1($fNum) + { + if ($fNum < 8.0) { + $y = ($fNum * $fNum); + $f1 = $fNum * (-0.4900604943e13 + $y * (0.1275274390e13 + $y * (-0.5153438139e11 + $y * (0.7349264551e9 + $y * + (-0.4237922726e7 + $y * 0.8511937935e4))))); + $f2 = 0.2499580570e14 + $y * (0.4244419664e12 + $y * (0.3733650367e10 + $y * (0.2245904002e8 + $y * + (0.1020426050e6 + $y * (0.3549632885e3 + $y))))); + $fRet = $f1 / $f2 + 0.636619772 * ( self::BESSELJ($fNum, 1) * log($fNum) - 1 / $fNum); + } else { + $fRet = sqrt(0.636619772 / $fNum) * sin($fNum - 2.356194491); + } + return $fRet; + } + + + /** + * BESSELY + * + * Returns the Bessel function, which is also called the Weber function or the Neumann function. + * + * Excel Function: + * BESSELY(x,ord) + * + * @access public + * @category Engineering Functions + * @param float $x The value at which to evaluate the function. + * If x is nonnumeric, BESSELK returns the #VALUE! error value. + * @param integer $ord The order of the Bessel function. If n is not an integer, it is truncated. + * If $ord is nonnumeric, BESSELK returns the #VALUE! error value. + * If $ord < 0, BESSELK returns the #NUM! error value. + * + * @return float + */ + public static function BESSELY($x, $ord) + { + $x = (is_null($x)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($x); + $ord = (is_null($ord)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($ord); + + if ((is_numeric($x)) && (is_numeric($ord))) { + if (($ord < 0) || ($x == 0.0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + + switch (floor($ord)) { + case 0: + return self::besselY0($x); + case 1: + return self::besselY1($x); + default: + $fTox = 2 / $x; + $fBym = self::besselY0($x); + $fBy = self::besselY1($x); + for ($n = 1; $n < $ord; ++$n) { + $fByp = $n * $fTox * $fBy - $fBym; + $fBym = $fBy; + $fBy = $fByp; + } + } + return (is_nan($fBy)) ? PHPExcel_Calculation_Functions::NaN() : $fBy; + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * BINTODEC + * + * Return a binary value as decimal. + * + * Excel Function: + * BIN2DEC(x) + * + * @access public + * @category Engineering Functions + * @param string $x The binary number (as a string) that you want to convert. The number + * cannot contain more than 10 characters (10 bits). The most significant + * bit of number is the sign bit. The remaining 9 bits are magnitude bits. + * Negative numbers are represented using two's-complement notation. + * If number is not a valid binary number, or if number contains more than + * 10 characters (10 bits), BIN2DEC returns the #NUM! error value. + * @return string + */ + public static function BINTODEC($x) + { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + + if (is_bool($x)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + $x = (int) $x; + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) { + $x = floor($x); + } + $x = (string) $x; + if (strlen($x) > preg_match_all('/[01]/', $x, $out)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (strlen($x) > 10) { + return PHPExcel_Calculation_Functions::NaN(); + } elseif (strlen($x) == 10) { + // Two's Complement + $x = substr($x, -9); + return '-'.(512-bindec($x)); + } + return bindec($x); + } + + + /** + * BINTOHEX + * + * Return a binary value as hex. + * + * Excel Function: + * BIN2HEX(x[,places]) + * + * @access public + * @category Engineering Functions + * @param string $x The binary number (as a string) that you want to convert. The number + * cannot contain more than 10 characters (10 bits). The most significant + * bit of number is the sign bit. The remaining 9 bits are magnitude bits. + * Negative numbers are represented using two's-complement notation. + * If number is not a valid binary number, or if number contains more than + * 10 characters (10 bits), BIN2HEX returns the #NUM! error value. + * @param integer $places The number of characters to use. If places is omitted, BIN2HEX uses the + * minimum number of characters necessary. Places is useful for padding the + * return value with leading 0s (zeros). + * If places is not an integer, it is truncated. + * If places is nonnumeric, BIN2HEX returns the #VALUE! error value. + * If places is negative, BIN2HEX returns the #NUM! error value. + * @return string + */ + public static function BINTOHEX($x, $places = null) + { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + $places = PHPExcel_Calculation_Functions::flattenSingleValue($places); + + if (is_bool($x)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + $x = (int) $x; + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) { + $x = floor($x); + } + $x = (string) $x; + if (strlen($x) > preg_match_all('/[01]/', $x, $out)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (strlen($x) > 10) { + return PHPExcel_Calculation_Functions::NaN(); + } elseif (strlen($x) == 10) { + // Two's Complement + return str_repeat('F', 8).substr(strtoupper(dechex(bindec(substr($x, -9)))), -2); + } + $hexVal = (string) strtoupper(dechex(bindec($x))); + + return self::nbrConversionFormat($hexVal, $places); + } + + + /** + * BINTOOCT + * + * Return a binary value as octal. + * + * Excel Function: + * BIN2OCT(x[,places]) + * + * @access public + * @category Engineering Functions + * @param string $x The binary number (as a string) that you want to convert. The number + * cannot contain more than 10 characters (10 bits). The most significant + * bit of number is the sign bit. The remaining 9 bits are magnitude bits. + * Negative numbers are represented using two's-complement notation. + * If number is not a valid binary number, or if number contains more than + * 10 characters (10 bits), BIN2OCT returns the #NUM! error value. + * @param integer $places The number of characters to use. If places is omitted, BIN2OCT uses the + * minimum number of characters necessary. Places is useful for padding the + * return value with leading 0s (zeros). + * If places is not an integer, it is truncated. + * If places is nonnumeric, BIN2OCT returns the #VALUE! error value. + * If places is negative, BIN2OCT returns the #NUM! error value. + * @return string + */ + public static function BINTOOCT($x, $places = null) + { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + $places = PHPExcel_Calculation_Functions::flattenSingleValue($places); + + if (is_bool($x)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + $x = (int) $x; + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) { + $x = floor($x); + } + $x = (string) $x; + if (strlen($x) > preg_match_all('/[01]/', $x, $out)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (strlen($x) > 10) { + return PHPExcel_Calculation_Functions::NaN(); + } elseif (strlen($x) == 10) { + // Two's Complement + return str_repeat('7', 7).substr(strtoupper(decoct(bindec(substr($x, -9)))), -3); + } + $octVal = (string) decoct(bindec($x)); + + return self::nbrConversionFormat($octVal, $places); + } + + + /** + * DECTOBIN + * + * Return a decimal value as binary. + * + * Excel Function: + * DEC2BIN(x[,places]) + * + * @access public + * @category Engineering Functions + * @param string $x The decimal integer you want to convert. If number is negative, + * valid place values are ignored and DEC2BIN returns a 10-character + * (10-bit) binary number in which the most significant bit is the sign + * bit. The remaining 9 bits are magnitude bits. Negative numbers are + * represented using two's-complement notation. + * If number < -512 or if number > 511, DEC2BIN returns the #NUM! error + * value. + * If number is nonnumeric, DEC2BIN returns the #VALUE! error value. + * If DEC2BIN requires more than places characters, it returns the #NUM! + * error value. + * @param integer $places The number of characters to use. If places is omitted, DEC2BIN uses + * the minimum number of characters necessary. Places is useful for + * padding the return value with leading 0s (zeros). + * If places is not an integer, it is truncated. + * If places is nonnumeric, DEC2BIN returns the #VALUE! error value. + * If places is zero or negative, DEC2BIN returns the #NUM! error value. + * @return string + */ + public static function DECTOBIN($x, $places = null) + { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + $places = PHPExcel_Calculation_Functions::flattenSingleValue($places); + + if (is_bool($x)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + $x = (int) $x; + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + $x = (string) $x; + if (strlen($x) > preg_match_all('/[-0123456789.]/', $x, $out)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $x = (string) floor($x); + $r = decbin($x); + if (strlen($r) == 32) { + // Two's Complement + $r = substr($r, -10); + } elseif (strlen($r) > 11) { + return PHPExcel_Calculation_Functions::NaN(); + } + + return self::nbrConversionFormat($r, $places); + } + + + /** + * DECTOHEX + * + * Return a decimal value as hex. + * + * Excel Function: + * DEC2HEX(x[,places]) + * + * @access public + * @category Engineering Functions + * @param string $x The decimal integer you want to convert. If number is negative, + * places is ignored and DEC2HEX returns a 10-character (40-bit) + * hexadecimal number in which the most significant bit is the sign + * bit. The remaining 39 bits are magnitude bits. Negative numbers + * are represented using two's-complement notation. + * If number < -549,755,813,888 or if number > 549,755,813,887, + * DEC2HEX returns the #NUM! error value. + * If number is nonnumeric, DEC2HEX returns the #VALUE! error value. + * If DEC2HEX requires more than places characters, it returns the + * #NUM! error value. + * @param integer $places The number of characters to use. If places is omitted, DEC2HEX uses + * the minimum number of characters necessary. Places is useful for + * padding the return value with leading 0s (zeros). + * If places is not an integer, it is truncated. + * If places is nonnumeric, DEC2HEX returns the #VALUE! error value. + * If places is zero or negative, DEC2HEX returns the #NUM! error value. + * @return string + */ + public static function DECTOHEX($x, $places = null) + { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + $places = PHPExcel_Calculation_Functions::flattenSingleValue($places); + + if (is_bool($x)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + $x = (int) $x; + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + $x = (string) $x; + if (strlen($x) > preg_match_all('/[-0123456789.]/', $x, $out)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $x = (string) floor($x); + $r = strtoupper(dechex($x)); + if (strlen($r) == 8) { + // Two's Complement + $r = 'FF'.$r; + } + + return self::nbrConversionFormat($r, $places); + } + + + /** + * DECTOOCT + * + * Return an decimal value as octal. + * + * Excel Function: + * DEC2OCT(x[,places]) + * + * @access public + * @category Engineering Functions + * @param string $x The decimal integer you want to convert. If number is negative, + * places is ignored and DEC2OCT returns a 10-character (30-bit) + * octal number in which the most significant bit is the sign bit. + * The remaining 29 bits are magnitude bits. Negative numbers are + * represented using two's-complement notation. + * If number < -536,870,912 or if number > 536,870,911, DEC2OCT + * returns the #NUM! error value. + * If number is nonnumeric, DEC2OCT returns the #VALUE! error value. + * If DEC2OCT requires more than places characters, it returns the + * #NUM! error value. + * @param integer $places The number of characters to use. If places is omitted, DEC2OCT uses + * the minimum number of characters necessary. Places is useful for + * padding the return value with leading 0s (zeros). + * If places is not an integer, it is truncated. + * If places is nonnumeric, DEC2OCT returns the #VALUE! error value. + * If places is zero or negative, DEC2OCT returns the #NUM! error value. + * @return string + */ + public static function DECTOOCT($x, $places = null) + { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + $places = PHPExcel_Calculation_Functions::flattenSingleValue($places); + + if (is_bool($x)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + $x = (int) $x; + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + $x = (string) $x; + if (strlen($x) > preg_match_all('/[-0123456789.]/', $x, $out)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $x = (string) floor($x); + $r = decoct($x); + if (strlen($r) == 11) { + // Two's Complement + $r = substr($r, -10); + } + + return self::nbrConversionFormat($r, $places); + } + + + /** + * HEXTOBIN + * + * Return a hex value as binary. + * + * Excel Function: + * HEX2BIN(x[,places]) + * + * @access public + * @category Engineering Functions + * @param string $x the hexadecimal number you want to convert. Number cannot + * contain more than 10 characters. The most significant bit of + * number is the sign bit (40th bit from the right). The remaining + * 9 bits are magnitude bits. Negative numbers are represented + * using two's-complement notation. + * If number is negative, HEX2BIN ignores places and returns a + * 10-character binary number. + * If number is negative, it cannot be less than FFFFFFFE00, and + * if number is positive, it cannot be greater than 1FF. + * If number is not a valid hexadecimal number, HEX2BIN returns + * the #NUM! error value. + * If HEX2BIN requires more than places characters, it returns + * the #NUM! error value. + * @param integer $places The number of characters to use. If places is omitted, + * HEX2BIN uses the minimum number of characters necessary. Places + * is useful for padding the return value with leading 0s (zeros). + * If places is not an integer, it is truncated. + * If places is nonnumeric, HEX2BIN returns the #VALUE! error value. + * If places is negative, HEX2BIN returns the #NUM! error value. + * @return string + */ + public static function HEXTOBIN($x, $places = null) + { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + $places = PHPExcel_Calculation_Functions::flattenSingleValue($places); + + if (is_bool($x)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $x = (string) $x; + if (strlen($x) > preg_match_all('/[0123456789ABCDEF]/', strtoupper($x), $out)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $binVal = decbin(hexdec($x)); + + return substr(self::nbrConversionFormat($binVal, $places), -10); + } + + + /** + * HEXTODEC + * + * Return a hex value as decimal. + * + * Excel Function: + * HEX2DEC(x) + * + * @access public + * @category Engineering Functions + * @param string $x The hexadecimal number you want to convert. This number cannot + * contain more than 10 characters (40 bits). The most significant + * bit of number is the sign bit. The remaining 39 bits are magnitude + * bits. Negative numbers are represented using two's-complement + * notation. + * If number is not a valid hexadecimal number, HEX2DEC returns the + * #NUM! error value. + * @return string + */ + public static function HEXTODEC($x) + { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + + if (is_bool($x)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $x = (string) $x; + if (strlen($x) > preg_match_all('/[0123456789ABCDEF]/', strtoupper($x), $out)) { + return PHPExcel_Calculation_Functions::NaN(); + } + return hexdec($x); + } + + + /** + * HEXTOOCT + * + * Return a hex value as octal. + * + * Excel Function: + * HEX2OCT(x[,places]) + * + * @access public + * @category Engineering Functions + * @param string $x The hexadecimal number you want to convert. Number cannot + * contain more than 10 characters. The most significant bit of + * number is the sign bit. The remaining 39 bits are magnitude + * bits. Negative numbers are represented using two's-complement + * notation. + * If number is negative, HEX2OCT ignores places and returns a + * 10-character octal number. + * If number is negative, it cannot be less than FFE0000000, and + * if number is positive, it cannot be greater than 1FFFFFFF. + * If number is not a valid hexadecimal number, HEX2OCT returns + * the #NUM! error value. + * If HEX2OCT requires more than places characters, it returns + * the #NUM! error value. + * @param integer $places The number of characters to use. If places is omitted, HEX2OCT + * uses the minimum number of characters necessary. Places is + * useful for padding the return value with leading 0s (zeros). + * If places is not an integer, it is truncated. + * If places is nonnumeric, HEX2OCT returns the #VALUE! error + * value. + * If places is negative, HEX2OCT returns the #NUM! error value. + * @return string + */ + public static function HEXTOOCT($x, $places = null) + { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + $places = PHPExcel_Calculation_Functions::flattenSingleValue($places); + + if (is_bool($x)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $x = (string) $x; + if (strlen($x) > preg_match_all('/[0123456789ABCDEF]/', strtoupper($x), $out)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $octVal = decoct(hexdec($x)); + + return self::nbrConversionFormat($octVal, $places); + } // function HEXTOOCT() + + + /** + * OCTTOBIN + * + * Return an octal value as binary. + * + * Excel Function: + * OCT2BIN(x[,places]) + * + * @access public + * @category Engineering Functions + * @param string $x The octal number you want to convert. Number may not + * contain more than 10 characters. The most significant + * bit of number is the sign bit. The remaining 29 bits + * are magnitude bits. Negative numbers are represented + * using two's-complement notation. + * If number is negative, OCT2BIN ignores places and returns + * a 10-character binary number. + * If number is negative, it cannot be less than 7777777000, + * and if number is positive, it cannot be greater than 777. + * If number is not a valid octal number, OCT2BIN returns + * the #NUM! error value. + * If OCT2BIN requires more than places characters, it + * returns the #NUM! error value. + * @param integer $places The number of characters to use. If places is omitted, + * OCT2BIN uses the minimum number of characters necessary. + * Places is useful for padding the return value with + * leading 0s (zeros). + * If places is not an integer, it is truncated. + * If places is nonnumeric, OCT2BIN returns the #VALUE! + * error value. + * If places is negative, OCT2BIN returns the #NUM! error + * value. + * @return string + */ + public static function OCTTOBIN($x, $places = null) + { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + $places = PHPExcel_Calculation_Functions::flattenSingleValue($places); + + if (is_bool($x)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $x = (string) $x; + if (preg_match_all('/[01234567]/', $x, $out) != strlen($x)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $r = decbin(octdec($x)); + + return self::nbrConversionFormat($r, $places); + } + + + /** + * OCTTODEC + * + * Return an octal value as decimal. + * + * Excel Function: + * OCT2DEC(x) + * + * @access public + * @category Engineering Functions + * @param string $x The octal number you want to convert. Number may not contain + * more than 10 octal characters (30 bits). The most significant + * bit of number is the sign bit. The remaining 29 bits are + * magnitude bits. Negative numbers are represented using + * two's-complement notation. + * If number is not a valid octal number, OCT2DEC returns the + * #NUM! error value. + * @return string + */ + public static function OCTTODEC($x) + { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + + if (is_bool($x)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $x = (string) $x; + if (preg_match_all('/[01234567]/', $x, $out) != strlen($x)) { + return PHPExcel_Calculation_Functions::NaN(); + } + return octdec($x); + } + + + /** + * OCTTOHEX + * + * Return an octal value as hex. + * + * Excel Function: + * OCT2HEX(x[,places]) + * + * @access public + * @category Engineering Functions + * @param string $x The octal number you want to convert. Number may not contain + * more than 10 octal characters (30 bits). The most significant + * bit of number is the sign bit. The remaining 29 bits are + * magnitude bits. Negative numbers are represented using + * two's-complement notation. + * If number is negative, OCT2HEX ignores places and returns a + * 10-character hexadecimal number. + * If number is not a valid octal number, OCT2HEX returns the + * #NUM! error value. + * If OCT2HEX requires more than places characters, it returns + * the #NUM! error value. + * @param integer $places The number of characters to use. If places is omitted, OCT2HEX + * uses the minimum number of characters necessary. Places is useful + * for padding the return value with leading 0s (zeros). + * If places is not an integer, it is truncated. + * If places is nonnumeric, OCT2HEX returns the #VALUE! error value. + * If places is negative, OCT2HEX returns the #NUM! error value. + * @return string + */ + public static function OCTTOHEX($x, $places = null) + { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + $places = PHPExcel_Calculation_Functions::flattenSingleValue($places); + + if (is_bool($x)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $x = (string) $x; + if (preg_match_all('/[01234567]/', $x, $out) != strlen($x)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $hexVal = strtoupper(dechex(octdec($x))); + + return self::nbrConversionFormat($hexVal, $places); + } + + + /** + * COMPLEX + * + * Converts real and imaginary coefficients into a complex number of the form x + yi or x + yj. + * + * Excel Function: + * COMPLEX(realNumber,imaginary[,places]) + * + * @access public + * @category Engineering Functions + * @param float $realNumber The real coefficient of the complex number. + * @param float $imaginary The imaginary coefficient of the complex number. + * @param string $suffix The suffix for the imaginary component of the complex number. + * If omitted, the suffix is assumed to be "i". + * @return string + */ + public static function COMPLEX($realNumber = 0.0, $imaginary = 0.0, $suffix = 'i') + { + $realNumber = (is_null($realNumber)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($realNumber); + $imaginary = (is_null($imaginary)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($imaginary); + $suffix = (is_null($suffix)) ? 'i' : PHPExcel_Calculation_Functions::flattenSingleValue($suffix); + + if (((is_numeric($realNumber)) && (is_numeric($imaginary))) && + (($suffix == 'i') || ($suffix == 'j') || ($suffix == ''))) { + $realNumber = (float) $realNumber; + $imaginary = (float) $imaginary; + + if ($suffix == '') { + $suffix = 'i'; + } + if ($realNumber == 0.0) { + if ($imaginary == 0.0) { + return (string) '0'; + } elseif ($imaginary == 1.0) { + return (string) $suffix; + } elseif ($imaginary == -1.0) { + return (string) '-'.$suffix; + } + return (string) $imaginary.$suffix; + } elseif ($imaginary == 0.0) { + return (string) $realNumber; + } elseif ($imaginary == 1.0) { + return (string) $realNumber.'+'.$suffix; + } elseif ($imaginary == -1.0) { + return (string) $realNumber.'-'.$suffix; + } + if ($imaginary > 0) { + $imaginary = (string) '+'.$imaginary; + } + return (string) $realNumber.$imaginary.$suffix; + } + + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * IMAGINARY + * + * Returns the imaginary coefficient of a complex number in x + yi or x + yj text format. + * + * Excel Function: + * IMAGINARY(complexNumber) + * + * @access public + * @category Engineering Functions + * @param string $complexNumber The complex number for which you want the imaginary + * coefficient. + * @return float + */ + public static function IMAGINARY($complexNumber) + { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::parseComplex($complexNumber); + return $parsedComplex['imaginary']; + } + + + /** + * IMREAL + * + * Returns the real coefficient of a complex number in x + yi or x + yj text format. + * + * Excel Function: + * IMREAL(complexNumber) + * + * @access public + * @category Engineering Functions + * @param string $complexNumber The complex number for which you want the real coefficient. + * @return float + */ + public static function IMREAL($complexNumber) + { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::parseComplex($complexNumber); + return $parsedComplex['real']; + } + + + /** + * IMABS + * + * Returns the absolute value (modulus) of a complex number in x + yi or x + yj text format. + * + * Excel Function: + * IMABS(complexNumber) + * + * @param string $complexNumber The complex number for which you want the absolute value. + * @return float + */ + public static function IMABS($complexNumber) + { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::parseComplex($complexNumber); + + return sqrt( + ($parsedComplex['real'] * $parsedComplex['real']) + + ($parsedComplex['imaginary'] * $parsedComplex['imaginary']) + ); + } + + + /** + * IMARGUMENT + * + * Returns the argument theta of a complex number, i.e. the angle in radians from the real + * axis to the representation of the number in polar coordinates. + * + * Excel Function: + * IMARGUMENT(complexNumber) + * + * @param string $complexNumber The complex number for which you want the argument theta. + * @return float + */ + public static function IMARGUMENT($complexNumber) + { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::parseComplex($complexNumber); + + if ($parsedComplex['real'] == 0.0) { + if ($parsedComplex['imaginary'] == 0.0) { + return 0.0; + } elseif ($parsedComplex['imaginary'] < 0.0) { + return M_PI / -2; + } else { + return M_PI / 2; + } + } elseif ($parsedComplex['real'] > 0.0) { + return atan($parsedComplex['imaginary'] / $parsedComplex['real']); + } elseif ($parsedComplex['imaginary'] < 0.0) { + return 0 - (M_PI - atan(abs($parsedComplex['imaginary']) / abs($parsedComplex['real']))); + } else { + return M_PI - atan($parsedComplex['imaginary'] / abs($parsedComplex['real'])); + } + } + + + /** + * IMCONJUGATE + * + * Returns the complex conjugate of a complex number in x + yi or x + yj text format. + * + * Excel Function: + * IMCONJUGATE(complexNumber) + * + * @param string $complexNumber The complex number for which you want the conjugate. + * @return string + */ + public static function IMCONJUGATE($complexNumber) + { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::parseComplex($complexNumber); + + if ($parsedComplex['imaginary'] == 0.0) { + return $parsedComplex['real']; + } else { + return self::cleanComplex( + self::COMPLEX( + $parsedComplex['real'], + 0 - $parsedComplex['imaginary'], + $parsedComplex['suffix'] + ) + ); + } + } + + + /** + * IMCOS + * + * Returns the cosine of a complex number in x + yi or x + yj text format. + * + * Excel Function: + * IMCOS(complexNumber) + * + * @param string $complexNumber The complex number for which you want the cosine. + * @return string|float + */ + public static function IMCOS($complexNumber) + { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::parseComplex($complexNumber); + + if ($parsedComplex['imaginary'] == 0.0) { + return cos($parsedComplex['real']); + } else { + return self::IMCONJUGATE( + self::COMPLEX( + cos($parsedComplex['real']) * cosh($parsedComplex['imaginary']), + sin($parsedComplex['real']) * sinh($parsedComplex['imaginary']), + $parsedComplex['suffix'] + ) + ); + } + } + + + /** + * IMSIN + * + * Returns the sine of a complex number in x + yi or x + yj text format. + * + * Excel Function: + * IMSIN(complexNumber) + * + * @param string $complexNumber The complex number for which you want the sine. + * @return string|float + */ + public static function IMSIN($complexNumber) + { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::parseComplex($complexNumber); + + if ($parsedComplex['imaginary'] == 0.0) { + return sin($parsedComplex['real']); + } else { + return self::COMPLEX( + sin($parsedComplex['real']) * cosh($parsedComplex['imaginary']), + cos($parsedComplex['real']) * sinh($parsedComplex['imaginary']), + $parsedComplex['suffix'] + ); + } + } + + + /** + * IMSQRT + * + * Returns the square root of a complex number in x + yi or x + yj text format. + * + * Excel Function: + * IMSQRT(complexNumber) + * + * @param string $complexNumber The complex number for which you want the square root. + * @return string + */ + public static function IMSQRT($complexNumber) + { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::parseComplex($complexNumber); + + $theta = self::IMARGUMENT($complexNumber); + $d1 = cos($theta / 2); + $d2 = sin($theta / 2); + $r = sqrt(sqrt(($parsedComplex['real'] * $parsedComplex['real']) + ($parsedComplex['imaginary'] * $parsedComplex['imaginary']))); + + if ($parsedComplex['suffix'] == '') { + return self::COMPLEX($d1 * $r, $d2 * $r); + } else { + return self::COMPLEX($d1 * $r, $d2 * $r, $parsedComplex['suffix']); + } + } + + + /** + * IMLN + * + * Returns the natural logarithm of a complex number in x + yi or x + yj text format. + * + * Excel Function: + * IMLN(complexNumber) + * + * @param string $complexNumber The complex number for which you want the natural logarithm. + * @return string + */ + public static function IMLN($complexNumber) + { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::parseComplex($complexNumber); + + if (($parsedComplex['real'] == 0.0) && ($parsedComplex['imaginary'] == 0.0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + + $logR = log(sqrt(($parsedComplex['real'] * $parsedComplex['real']) + ($parsedComplex['imaginary'] * $parsedComplex['imaginary']))); + $t = self::IMARGUMENT($complexNumber); + + if ($parsedComplex['suffix'] == '') { + return self::COMPLEX($logR, $t); + } else { + return self::COMPLEX($logR, $t, $parsedComplex['suffix']); + } + } + + + /** + * IMLOG10 + * + * Returns the common logarithm (base 10) of a complex number in x + yi or x + yj text format. + * + * Excel Function: + * IMLOG10(complexNumber) + * + * @param string $complexNumber The complex number for which you want the common logarithm. + * @return string + */ + public static function IMLOG10($complexNumber) + { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::parseComplex($complexNumber); + + if (($parsedComplex['real'] == 0.0) && ($parsedComplex['imaginary'] == 0.0)) { + return PHPExcel_Calculation_Functions::NaN(); + } elseif (($parsedComplex['real'] > 0.0) && ($parsedComplex['imaginary'] == 0.0)) { + return log10($parsedComplex['real']); + } + + return self::IMPRODUCT(log10(EULER), self::IMLN($complexNumber)); + } + + + /** + * IMLOG2 + * + * Returns the base-2 logarithm of a complex number in x + yi or x + yj text format. + * + * Excel Function: + * IMLOG2(complexNumber) + * + * @param string $complexNumber The complex number for which you want the base-2 logarithm. + * @return string + */ + public static function IMLOG2($complexNumber) + { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::parseComplex($complexNumber); + + if (($parsedComplex['real'] == 0.0) && ($parsedComplex['imaginary'] == 0.0)) { + return PHPExcel_Calculation_Functions::NaN(); + } elseif (($parsedComplex['real'] > 0.0) && ($parsedComplex['imaginary'] == 0.0)) { + return log($parsedComplex['real'], 2); + } + + return self::IMPRODUCT(log(EULER, 2), self::IMLN($complexNumber)); + } + + + /** + * IMEXP + * + * Returns the exponential of a complex number in x + yi or x + yj text format. + * + * Excel Function: + * IMEXP(complexNumber) + * + * @param string $complexNumber The complex number for which you want the exponential. + * @return string + */ + public static function IMEXP($complexNumber) + { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + + $parsedComplex = self::parseComplex($complexNumber); + + if (($parsedComplex['real'] == 0.0) && ($parsedComplex['imaginary'] == 0.0)) { + return '1'; + } + + $e = exp($parsedComplex['real']); + $eX = $e * cos($parsedComplex['imaginary']); + $eY = $e * sin($parsedComplex['imaginary']); + + if ($parsedComplex['suffix'] == '') { + return self::COMPLEX($eX, $eY); + } else { + return self::COMPLEX($eX, $eY, $parsedComplex['suffix']); + } + } + + + /** + * IMPOWER + * + * Returns a complex number in x + yi or x + yj text format raised to a power. + * + * Excel Function: + * IMPOWER(complexNumber,realNumber) + * + * @param string $complexNumber The complex number you want to raise to a power. + * @param float $realNumber The power to which you want to raise the complex number. + * @return string + */ + public static function IMPOWER($complexNumber, $realNumber) + { + $complexNumber = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber); + $realNumber = PHPExcel_Calculation_Functions::flattenSingleValue($realNumber); + + if (!is_numeric($realNumber)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + $parsedComplex = self::parseComplex($complexNumber); + + $r = sqrt(($parsedComplex['real'] * $parsedComplex['real']) + ($parsedComplex['imaginary'] * $parsedComplex['imaginary'])); + $rPower = pow($r, $realNumber); + $theta = self::IMARGUMENT($complexNumber) * $realNumber; + if ($theta == 0) { + return 1; + } elseif ($parsedComplex['imaginary'] == 0.0) { + return self::COMPLEX($rPower * cos($theta), $rPower * sin($theta), $parsedComplex['suffix']); + } else { + return self::COMPLEX($rPower * cos($theta), $rPower * sin($theta), $parsedComplex['suffix']); + } + } + + + /** + * IMDIV + * + * Returns the quotient of two complex numbers in x + yi or x + yj text format. + * + * Excel Function: + * IMDIV(complexDividend,complexDivisor) + * + * @param string $complexDividend The complex numerator or dividend. + * @param string $complexDivisor The complex denominator or divisor. + * @return string + */ + public static function IMDIV($complexDividend, $complexDivisor) + { + $complexDividend = PHPExcel_Calculation_Functions::flattenSingleValue($complexDividend); + $complexDivisor = PHPExcel_Calculation_Functions::flattenSingleValue($complexDivisor); + + $parsedComplexDividend = self::parseComplex($complexDividend); + $parsedComplexDivisor = self::parseComplex($complexDivisor); + + if (($parsedComplexDividend['suffix'] != '') && ($parsedComplexDivisor['suffix'] != '') && + ($parsedComplexDividend['suffix'] != $parsedComplexDivisor['suffix'])) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (($parsedComplexDividend['suffix'] != '') && ($parsedComplexDivisor['suffix'] == '')) { + $parsedComplexDivisor['suffix'] = $parsedComplexDividend['suffix']; + } + + $d1 = ($parsedComplexDividend['real'] * $parsedComplexDivisor['real']) + ($parsedComplexDividend['imaginary'] * $parsedComplexDivisor['imaginary']); + $d2 = ($parsedComplexDividend['imaginary'] * $parsedComplexDivisor['real']) - ($parsedComplexDividend['real'] * $parsedComplexDivisor['imaginary']); + $d3 = ($parsedComplexDivisor['real'] * $parsedComplexDivisor['real']) + ($parsedComplexDivisor['imaginary'] * $parsedComplexDivisor['imaginary']); + + $r = $d1 / $d3; + $i = $d2 / $d3; + + if ($i > 0.0) { + return self::cleanComplex($r.'+'.$i.$parsedComplexDivisor['suffix']); + } elseif ($i < 0.0) { + return self::cleanComplex($r.$i.$parsedComplexDivisor['suffix']); + } else { + return $r; + } + } + + + /** + * IMSUB + * + * Returns the difference of two complex numbers in x + yi or x + yj text format. + * + * Excel Function: + * IMSUB(complexNumber1,complexNumber2) + * + * @param string $complexNumber1 The complex number from which to subtract complexNumber2. + * @param string $complexNumber2 The complex number to subtract from complexNumber1. + * @return string + */ + public static function IMSUB($complexNumber1, $complexNumber2) + { + $complexNumber1 = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber1); + $complexNumber2 = PHPExcel_Calculation_Functions::flattenSingleValue($complexNumber2); + + $parsedComplex1 = self::parseComplex($complexNumber1); + $parsedComplex2 = self::parseComplex($complexNumber2); + + if ((($parsedComplex1['suffix'] != '') && ($parsedComplex2['suffix'] != '')) && + ($parsedComplex1['suffix'] != $parsedComplex2['suffix'])) { + return PHPExcel_Calculation_Functions::NaN(); + } elseif (($parsedComplex1['suffix'] == '') && ($parsedComplex2['suffix'] != '')) { + $parsedComplex1['suffix'] = $parsedComplex2['suffix']; + } + + $d1 = $parsedComplex1['real'] - $parsedComplex2['real']; + $d2 = $parsedComplex1['imaginary'] - $parsedComplex2['imaginary']; + + return self::COMPLEX($d1, $d2, $parsedComplex1['suffix']); + } + + + /** + * IMSUM + * + * Returns the sum of two or more complex numbers in x + yi or x + yj text format. + * + * Excel Function: + * IMSUM(complexNumber[,complexNumber[,...]]) + * + * @param string $complexNumber,... Series of complex numbers to add + * @return string + */ + public static function IMSUM() + { + // Return value + $returnValue = self::parseComplex('0'); + $activeSuffix = ''; + + // Loop through the arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + foreach ($aArgs as $arg) { + $parsedComplex = self::parseComplex($arg); + + if ($activeSuffix == '') { + $activeSuffix = $parsedComplex['suffix']; + } elseif (($parsedComplex['suffix'] != '') && ($activeSuffix != $parsedComplex['suffix'])) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + $returnValue['real'] += $parsedComplex['real']; + $returnValue['imaginary'] += $parsedComplex['imaginary']; + } + + if ($returnValue['imaginary'] == 0.0) { + $activeSuffix = ''; + } + return self::COMPLEX($returnValue['real'], $returnValue['imaginary'], $activeSuffix); + } + + + /** + * IMPRODUCT + * + * Returns the product of two or more complex numbers in x + yi or x + yj text format. + * + * Excel Function: + * IMPRODUCT(complexNumber[,complexNumber[,...]]) + * + * @param string $complexNumber,... Series of complex numbers to multiply + * @return string + */ + public static function IMPRODUCT() + { + // Return value + $returnValue = self::parseComplex('1'); + $activeSuffix = ''; + + // Loop through the arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + foreach ($aArgs as $arg) { + $parsedComplex = self::parseComplex($arg); + + $workValue = $returnValue; + if (($parsedComplex['suffix'] != '') && ($activeSuffix == '')) { + $activeSuffix = $parsedComplex['suffix']; + } elseif (($parsedComplex['suffix'] != '') && ($activeSuffix != $parsedComplex['suffix'])) { + return PHPExcel_Calculation_Functions::NaN(); + } + $returnValue['real'] = ($workValue['real'] * $parsedComplex['real']) - ($workValue['imaginary'] * $parsedComplex['imaginary']); + $returnValue['imaginary'] = ($workValue['real'] * $parsedComplex['imaginary']) + ($workValue['imaginary'] * $parsedComplex['real']); + } + + if ($returnValue['imaginary'] == 0.0) { + $activeSuffix = ''; + } + return self::COMPLEX($returnValue['real'], $returnValue['imaginary'], $activeSuffix); + } + + + /** + * DELTA + * + * Tests whether two values are equal. Returns 1 if number1 = number2; returns 0 otherwise. + * Use this function to filter a set of values. For example, by summing several DELTA + * functions you calculate the count of equal pairs. This function is also known as the + * Kronecker Delta function. + * + * Excel Function: + * DELTA(a[,b]) + * + * @param float $a The first number. + * @param float $b The second number. If omitted, b is assumed to be zero. + * @return int + */ + public static function DELTA($a, $b = 0) + { + $a = PHPExcel_Calculation_Functions::flattenSingleValue($a); + $b = PHPExcel_Calculation_Functions::flattenSingleValue($b); + + return (int) ($a == $b); + } + + + /** + * GESTEP + * + * Excel Function: + * GESTEP(number[,step]) + * + * Returns 1 if number >= step; returns 0 (zero) otherwise + * Use this function to filter a set of values. For example, by summing several GESTEP + * functions you calculate the count of values that exceed a threshold. + * + * @param float $number The value to test against step. + * @param float $step The threshold value. + * If you omit a value for step, GESTEP uses zero. + * @return int + */ + public static function GESTEP($number, $step = 0) + { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + $step = PHPExcel_Calculation_Functions::flattenSingleValue($step); + + return (int) ($number >= $step); + } + + + // + // Private method to calculate the erf value + // + private static $twoSqrtPi = 1.128379167095512574; + + public static function erfVal($x) + { + if (abs($x) > 2.2) { + return 1 - self::erfcVal($x); + } + $sum = $term = $x; + $xsqr = ($x * $x); + $j = 1; + do { + $term *= $xsqr / $j; + $sum -= $term / (2 * $j + 1); + ++$j; + $term *= $xsqr / $j; + $sum += $term / (2 * $j + 1); + ++$j; + if ($sum == 0.0) { + break; + } + } while (abs($term / $sum) > PRECISION); + return self::$twoSqrtPi * $sum; + } + + + /** + * ERF + * + * Returns the error function integrated between the lower and upper bound arguments. + * + * Note: In Excel 2007 or earlier, if you input a negative value for the upper or lower bound arguments, + * the function would return a #NUM! error. However, in Excel 2010, the function algorithm was + * improved, so that it can now calculate the function for both positive and negative ranges. + * PHPExcel follows Excel 2010 behaviour, and accepts nagative arguments. + * + * Excel Function: + * ERF(lower[,upper]) + * + * @param float $lower lower bound for integrating ERF + * @param float $upper upper bound for integrating ERF. + * If omitted, ERF integrates between zero and lower_limit + * @return float + */ + public static function ERF($lower, $upper = null) + { + $lower = PHPExcel_Calculation_Functions::flattenSingleValue($lower); + $upper = PHPExcel_Calculation_Functions::flattenSingleValue($upper); + + if (is_numeric($lower)) { + if (is_null($upper)) { + return self::erfVal($lower); + } + if (is_numeric($upper)) { + return self::erfVal($upper) - self::erfVal($lower); + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + // + // Private method to calculate the erfc value + // + private static $oneSqrtPi = 0.564189583547756287; + + private static function erfcVal($x) + { + if (abs($x) < 2.2) { + return 1 - self::erfVal($x); + } + if ($x < 0) { + return 2 - self::ERFC(-$x); + } + $a = $n = 1; + $b = $c = $x; + $d = ($x * $x) + 0.5; + $q1 = $q2 = $b / $d; + $t = 0; + do { + $t = $a * $n + $b * $x; + $a = $b; + $b = $t; + $t = $c * $n + $d * $x; + $c = $d; + $d = $t; + $n += 0.5; + $q1 = $q2; + $q2 = $b / $d; + } while ((abs($q1 - $q2) / $q2) > PRECISION); + return self::$oneSqrtPi * exp(-$x * $x) * $q2; + } + + + /** + * ERFC + * + * Returns the complementary ERF function integrated between x and infinity + * + * Note: In Excel 2007 or earlier, if you input a negative value for the lower bound argument, + * the function would return a #NUM! error. However, in Excel 2010, the function algorithm was + * improved, so that it can now calculate the function for both positive and negative x values. + * PHPExcel follows Excel 2010 behaviour, and accepts nagative arguments. + * + * Excel Function: + * ERFC(x) + * + * @param float $x The lower bound for integrating ERFC + * @return float + */ + public static function ERFC($x) + { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + + if (is_numeric($x)) { + return self::erfcVal($x); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * getConversionGroups + * Returns a list of the different conversion groups for UOM conversions + * + * @return array + */ + public static function getConversionGroups() + { + $conversionGroups = array(); + foreach (self::$conversionUnits as $conversionUnit) { + $conversionGroups[] = $conversionUnit['Group']; + } + return array_merge(array_unique($conversionGroups)); + } + + + /** + * getConversionGroupUnits + * Returns an array of units of measure, for a specified conversion group, or for all groups + * + * @param string $group The group whose units of measure you want to retrieve + * @return array + */ + public static function getConversionGroupUnits($group = null) + { + $conversionGroups = array(); + foreach (self::$conversionUnits as $conversionUnit => $conversionGroup) { + if ((is_null($group)) || ($conversionGroup['Group'] == $group)) { + $conversionGroups[$conversionGroup['Group']][] = $conversionUnit; + } + } + return $conversionGroups; + } + + + /** + * getConversionGroupUnitDetails + * + * @param string $group The group whose units of measure you want to retrieve + * @return array + */ + public static function getConversionGroupUnitDetails($group = null) + { + $conversionGroups = array(); + foreach (self::$conversionUnits as $conversionUnit => $conversionGroup) { + if ((is_null($group)) || ($conversionGroup['Group'] == $group)) { + $conversionGroups[$conversionGroup['Group']][] = array( + 'unit' => $conversionUnit, + 'description' => $conversionGroup['Unit Name'] + ); + } + } + return $conversionGroups; + } + + + /** + * getConversionMultipliers + * Returns an array of the Multiplier prefixes that can be used with Units of Measure in CONVERTUOM() + * + * @return array of mixed + */ + public static function getConversionMultipliers() + { + return self::$conversionMultipliers; + } + + + /** + * CONVERTUOM + * + * Converts a number from one measurement system to another. + * For example, CONVERT can translate a table of distances in miles to a table of distances + * in kilometers. + * + * Excel Function: + * CONVERT(value,fromUOM,toUOM) + * + * @param float $value The value in fromUOM to convert. + * @param string $fromUOM The units for value. + * @param string $toUOM The units for the result. + * + * @return float + */ + public static function CONVERTUOM($value, $fromUOM, $toUOM) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $fromUOM = PHPExcel_Calculation_Functions::flattenSingleValue($fromUOM); + $toUOM = PHPExcel_Calculation_Functions::flattenSingleValue($toUOM); + + if (!is_numeric($value)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $fromMultiplier = 1.0; + if (isset(self::$conversionUnits[$fromUOM])) { + $unitGroup1 = self::$conversionUnits[$fromUOM]['Group']; + } else { + $fromMultiplier = substr($fromUOM, 0, 1); + $fromUOM = substr($fromUOM, 1); + if (isset(self::$conversionMultipliers[$fromMultiplier])) { + $fromMultiplier = self::$conversionMultipliers[$fromMultiplier]['multiplier']; + } else { + return PHPExcel_Calculation_Functions::NA(); + } + if ((isset(self::$conversionUnits[$fromUOM])) && (self::$conversionUnits[$fromUOM]['AllowPrefix'])) { + $unitGroup1 = self::$conversionUnits[$fromUOM]['Group']; + } else { + return PHPExcel_Calculation_Functions::NA(); + } + } + $value *= $fromMultiplier; + + $toMultiplier = 1.0; + if (isset(self::$conversionUnits[$toUOM])) { + $unitGroup2 = self::$conversionUnits[$toUOM]['Group']; + } else { + $toMultiplier = substr($toUOM, 0, 1); + $toUOM = substr($toUOM, 1); + if (isset(self::$conversionMultipliers[$toMultiplier])) { + $toMultiplier = self::$conversionMultipliers[$toMultiplier]['multiplier']; + } else { + return PHPExcel_Calculation_Functions::NA(); + } + if ((isset(self::$conversionUnits[$toUOM])) && (self::$conversionUnits[$toUOM]['AllowPrefix'])) { + $unitGroup2 = self::$conversionUnits[$toUOM]['Group']; + } else { + return PHPExcel_Calculation_Functions::NA(); + } + } + if ($unitGroup1 != $unitGroup2) { + return PHPExcel_Calculation_Functions::NA(); + } + + if (($fromUOM == $toUOM) && ($fromMultiplier == $toMultiplier)) { + // We've already factored $fromMultiplier into the value, so we need + // to reverse it again + return $value / $fromMultiplier; + } elseif ($unitGroup1 == 'Temperature') { + if (($fromUOM == 'F') || ($fromUOM == 'fah')) { + if (($toUOM == 'F') || ($toUOM == 'fah')) { + return $value; + } else { + $value = (($value - 32) / 1.8); + if (($toUOM == 'K') || ($toUOM == 'kel')) { + $value += 273.15; + } + return $value; + } + } elseif ((($fromUOM == 'K') || ($fromUOM == 'kel')) && + (($toUOM == 'K') || ($toUOM == 'kel'))) { + return $value; + } elseif ((($fromUOM == 'C') || ($fromUOM == 'cel')) && + (($toUOM == 'C') || ($toUOM == 'cel'))) { + return $value; + } + if (($toUOM == 'F') || ($toUOM == 'fah')) { + if (($fromUOM == 'K') || ($fromUOM == 'kel')) { + $value -= 273.15; + } + return ($value * 1.8) + 32; + } + if (($toUOM == 'C') || ($toUOM == 'cel')) { + return $value - 273.15; + } + return $value + 273.15; + } + return ($value * self::$unitConversions[$unitGroup1][$fromUOM][$toUOM]) / $toMultiplier; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Calculation/Exception.php b/application/third_party/PHPExcel/PHPExcel/Calculation/Exception.php new file mode 100644 index 0000000..52d73fc --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Calculation/Exception.php @@ -0,0 +1,46 @@ +line = $line; + $e->file = $file; + throw $e; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Calculation/ExceptionHandler.php b/application/third_party/PHPExcel/PHPExcel/Calculation/ExceptionHandler.php new file mode 100644 index 0000000..4cb0a68 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Calculation/ExceptionHandler.php @@ -0,0 +1,45 @@ +format('d') == $testDate->format('t')); + } + + + /** + * isFirstDayOfMonth + * + * Returns a boolean TRUE/FALSE indicating if this date is the first date of the month + * + * @param DateTime $testDate The date for testing + * @return boolean + */ + private static function isFirstDayOfMonth($testDate) + { + return ($testDate->format('d') == 1); + } + + + private static function couponFirstPeriodDate($settlement, $maturity, $frequency, $next) + { + $months = 12 / $frequency; + + $result = PHPExcel_Shared_Date::ExcelToPHPObject($maturity); + $eom = self::isLastDayOfMonth($result); + + while ($settlement < PHPExcel_Shared_Date::PHPToExcel($result)) { + $result->modify('-'.$months.' months'); + } + if ($next) { + $result->modify('+'.$months.' months'); + } + + if ($eom) { + $result->modify('-1 day'); + } + + return PHPExcel_Shared_Date::PHPToExcel($result); + } + + + private static function isValidFrequency($frequency) + { + if (($frequency == 1) || ($frequency == 2) || ($frequency == 4)) { + return true; + } + if ((PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) && + (($frequency == 6) || ($frequency == 12))) { + return true; + } + return false; + } + + + /** + * daysPerYear + * + * Returns the number of days in a specified year, as defined by the "basis" value + * + * @param integer $year The year against which we're testing + * @param integer $basis The type of day count: + * 0 or omitted US (NASD) 360 + * 1 Actual (365 or 366 in a leap year) + * 2 360 + * 3 365 + * 4 European 360 + * @return integer + */ + private static function daysPerYear($year, $basis = 0) + { + switch ($basis) { + case 0: + case 2: + case 4: + $daysPerYear = 360; + break; + case 3: + $daysPerYear = 365; + break; + case 1: + $daysPerYear = (PHPExcel_Calculation_DateTime::isLeapYear($year)) ? 366 : 365; + break; + default: + return PHPExcel_Calculation_Functions::NaN(); + } + return $daysPerYear; + } + + + private static function interestAndPrincipal($rate = 0, $per = 0, $nper = 0, $pv = 0, $fv = 0, $type = 0) + { + $pmt = self::PMT($rate, $nper, $pv, $fv, $type); + $capital = $pv; + for ($i = 1; $i<= $per; ++$i) { + $interest = ($type && $i == 1) ? 0 : -$capital * $rate; + $principal = $pmt - $interest; + $capital += $principal; + } + return array($interest, $principal); + } + + + /** + * ACCRINT + * + * Returns the accrued interest for a security that pays periodic interest. + * + * Excel Function: + * ACCRINT(issue,firstinterest,settlement,rate,par,frequency[,basis]) + * + * @access public + * @category Financial Functions + * @param mixed $issue The security's issue date. + * @param mixed $firstinterest The security's first interest date. + * @param mixed $settlement The security's settlement date. + * The security settlement date is the date after the issue date + * when the security is traded to the buyer. + * @param float $rate The security's annual coupon rate. + * @param float $par The security's par value. + * If you omit par, ACCRINT uses $1,000. + * @param integer $frequency the number of coupon payments per year. + * Valid frequency values are: + * 1 Annual + * 2 Semi-Annual + * 4 Quarterly + * If working in Gnumeric Mode, the following frequency options are + * also available + * 6 Bimonthly + * 12 Monthly + * @param integer $basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function ACCRINT($issue, $firstinterest, $settlement, $rate, $par = 1000, $frequency = 1, $basis = 0) + { + $issue = PHPExcel_Calculation_Functions::flattenSingleValue($issue); + $firstinterest = PHPExcel_Calculation_Functions::flattenSingleValue($firstinterest); + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $par = (is_null($par)) ? 1000 : PHPExcel_Calculation_Functions::flattenSingleValue($par); + $frequency = (is_null($frequency)) ? 1 : PHPExcel_Calculation_Functions::flattenSingleValue($frequency); + $basis = (is_null($basis)) ? 0 : PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + // Validate + if ((is_numeric($rate)) && (is_numeric($par))) { + $rate = (float) $rate; + $par = (float) $par; + if (($rate <= 0) || ($par <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $daysBetweenIssueAndSettlement = PHPExcel_Calculation_DateTime::YEARFRAC($issue, $settlement, $basis); + if (!is_numeric($daysBetweenIssueAndSettlement)) { + // return date error + return $daysBetweenIssueAndSettlement; + } + + return $par * $rate * $daysBetweenIssueAndSettlement; + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * ACCRINTM + * + * Returns the accrued interest for a security that pays interest at maturity. + * + * Excel Function: + * ACCRINTM(issue,settlement,rate[,par[,basis]]) + * + * @access public + * @category Financial Functions + * @param mixed issue The security's issue date. + * @param mixed settlement The security's settlement (or maturity) date. + * @param float rate The security's annual coupon rate. + * @param float par The security's par value. + * If you omit par, ACCRINT uses $1,000. + * @param integer basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function ACCRINTM($issue, $settlement, $rate, $par = 1000, $basis = 0) + { + $issue = PHPExcel_Calculation_Functions::flattenSingleValue($issue); + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $par = (is_null($par)) ? 1000 : PHPExcel_Calculation_Functions::flattenSingleValue($par); + $basis = (is_null($basis)) ? 0 : PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + // Validate + if ((is_numeric($rate)) && (is_numeric($par))) { + $rate = (float) $rate; + $par = (float) $par; + if (($rate <= 0) || ($par <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $daysBetweenIssueAndSettlement = PHPExcel_Calculation_DateTime::YEARFRAC($issue, $settlement, $basis); + if (!is_numeric($daysBetweenIssueAndSettlement)) { + // return date error + return $daysBetweenIssueAndSettlement; + } + return $par * $rate * $daysBetweenIssueAndSettlement; + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * AMORDEGRC + * + * Returns the depreciation for each accounting period. + * This function is provided for the French accounting system. If an asset is purchased in + * the middle of the accounting period, the prorated depreciation is taken into account. + * The function is similar to AMORLINC, except that a depreciation coefficient is applied in + * the calculation depending on the life of the assets. + * This function will return the depreciation until the last period of the life of the assets + * or until the cumulated value of depreciation is greater than the cost of the assets minus + * the salvage value. + * + * Excel Function: + * AMORDEGRC(cost,purchased,firstPeriod,salvage,period,rate[,basis]) + * + * @access public + * @category Financial Functions + * @param float cost The cost of the asset. + * @param mixed purchased Date of the purchase of the asset. + * @param mixed firstPeriod Date of the end of the first period. + * @param mixed salvage The salvage value at the end of the life of the asset. + * @param float period The period. + * @param float rate Rate of depreciation. + * @param integer basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function AMORDEGRC($cost, $purchased, $firstPeriod, $salvage, $period, $rate, $basis = 0) + { + $cost = PHPExcel_Calculation_Functions::flattenSingleValue($cost); + $purchased = PHPExcel_Calculation_Functions::flattenSingleValue($purchased); + $firstPeriod = PHPExcel_Calculation_Functions::flattenSingleValue($firstPeriod); + $salvage = PHPExcel_Calculation_Functions::flattenSingleValue($salvage); + $period = floor(PHPExcel_Calculation_Functions::flattenSingleValue($period)); + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $basis = (is_null($basis)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + // The depreciation coefficients are: + // Life of assets (1/rate) Depreciation coefficient + // Less than 3 years 1 + // Between 3 and 4 years 1.5 + // Between 5 and 6 years 2 + // More than 6 years 2.5 + $fUsePer = 1.0 / $rate; + if ($fUsePer < 3.0) { + $amortiseCoeff = 1.0; + } elseif ($fUsePer < 5.0) { + $amortiseCoeff = 1.5; + } elseif ($fUsePer <= 6.0) { + $amortiseCoeff = 2.0; + } else { + $amortiseCoeff = 2.5; + } + + $rate *= $amortiseCoeff; + $fNRate = round(PHPExcel_Calculation_DateTime::YEARFRAC($purchased, $firstPeriod, $basis) * $rate * $cost, 0); + $cost -= $fNRate; + $fRest = $cost - $salvage; + + for ($n = 0; $n < $period; ++$n) { + $fNRate = round($rate * $cost, 0); + $fRest -= $fNRate; + + if ($fRest < 0.0) { + switch ($period - $n) { + case 0: + case 1: + return round($cost * 0.5, 0); + default: + return 0.0; + } + } + $cost -= $fNRate; + } + return $fNRate; + } + + + /** + * AMORLINC + * + * Returns the depreciation for each accounting period. + * This function is provided for the French accounting system. If an asset is purchased in + * the middle of the accounting period, the prorated depreciation is taken into account. + * + * Excel Function: + * AMORLINC(cost,purchased,firstPeriod,salvage,period,rate[,basis]) + * + * @access public + * @category Financial Functions + * @param float cost The cost of the asset. + * @param mixed purchased Date of the purchase of the asset. + * @param mixed firstPeriod Date of the end of the first period. + * @param mixed salvage The salvage value at the end of the life of the asset. + * @param float period The period. + * @param float rate Rate of depreciation. + * @param integer basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function AMORLINC($cost, $purchased, $firstPeriod, $salvage, $period, $rate, $basis = 0) + { + $cost = PHPExcel_Calculation_Functions::flattenSingleValue($cost); + $purchased = PHPExcel_Calculation_Functions::flattenSingleValue($purchased); + $firstPeriod = PHPExcel_Calculation_Functions::flattenSingleValue($firstPeriod); + $salvage = PHPExcel_Calculation_Functions::flattenSingleValue($salvage); + $period = PHPExcel_Calculation_Functions::flattenSingleValue($period); + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $basis = (is_null($basis)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + $fOneRate = $cost * $rate; + $fCostDelta = $cost - $salvage; + // Note, quirky variation for leap years on the YEARFRAC for this function + $purchasedYear = PHPExcel_Calculation_DateTime::YEAR($purchased); + $yearFrac = PHPExcel_Calculation_DateTime::YEARFRAC($purchased, $firstPeriod, $basis); + + if (($basis == 1) && ($yearFrac < 1) && (PHPExcel_Calculation_DateTime::isLeapYear($purchasedYear))) { + $yearFrac *= 365 / 366; + } + + $f0Rate = $yearFrac * $rate * $cost; + $nNumOfFullPeriods = intval(($cost - $salvage - $f0Rate) / $fOneRate); + + if ($period == 0) { + return $f0Rate; + } elseif ($period <= $nNumOfFullPeriods) { + return $fOneRate; + } elseif ($period == ($nNumOfFullPeriods + 1)) { + return ($fCostDelta - $fOneRate * $nNumOfFullPeriods - $f0Rate); + } else { + return 0.0; + } + } + + + /** + * COUPDAYBS + * + * Returns the number of days from the beginning of the coupon period to the settlement date. + * + * Excel Function: + * COUPDAYBS(settlement,maturity,frequency[,basis]) + * + * @access public + * @category Financial Functions + * @param mixed settlement The security's settlement date. + * The security settlement date is the date after the issue + * date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param mixed frequency the number of coupon payments per year. + * Valid frequency values are: + * 1 Annual + * 2 Semi-Annual + * 4 Quarterly + * If working in Gnumeric Mode, the following frequency options are + * also available + * 6 Bimonthly + * 12 Monthly + * @param integer basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function COUPDAYBS($settlement, $maturity, $frequency, $basis = 0) + { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $frequency = (int) PHPExcel_Calculation_Functions::flattenSingleValue($frequency); + $basis = (is_null($basis)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + if (is_string($settlement = PHPExcel_Calculation_DateTime::getDateValue($settlement))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (is_string($maturity = PHPExcel_Calculation_DateTime::getDateValue($maturity))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (($settlement > $maturity) || + (!self::isValidFrequency($frequency)) || + (($basis < 0) || ($basis > 4))) { + return PHPExcel_Calculation_Functions::NaN(); + } + + $daysPerYear = self::daysPerYear(PHPExcel_Calculation_DateTime::YEAR($settlement), $basis); + $prev = self::couponFirstPeriodDate($settlement, $maturity, $frequency, false); + + return PHPExcel_Calculation_DateTime::YEARFRAC($prev, $settlement, $basis) * $daysPerYear; + } + + + /** + * COUPDAYS + * + * Returns the number of days in the coupon period that contains the settlement date. + * + * Excel Function: + * COUPDAYS(settlement,maturity,frequency[,basis]) + * + * @access public + * @category Financial Functions + * @param mixed settlement The security's settlement date. + * The security settlement date is the date after the issue + * date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param mixed frequency the number of coupon payments per year. + * Valid frequency values are: + * 1 Annual + * 2 Semi-Annual + * 4 Quarterly + * If working in Gnumeric Mode, the following frequency options are + * also available + * 6 Bimonthly + * 12 Monthly + * @param integer basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function COUPDAYS($settlement, $maturity, $frequency, $basis = 0) + { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $frequency = (int) PHPExcel_Calculation_Functions::flattenSingleValue($frequency); + $basis = (is_null($basis)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + if (is_string($settlement = PHPExcel_Calculation_DateTime::getDateValue($settlement))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (is_string($maturity = PHPExcel_Calculation_DateTime::getDateValue($maturity))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (($settlement > $maturity) || + (!self::isValidFrequency($frequency)) || + (($basis < 0) || ($basis > 4))) { + return PHPExcel_Calculation_Functions::NaN(); + } + + switch ($basis) { + case 3: + // Actual/365 + return 365 / $frequency; + case 1: + // Actual/actual + if ($frequency == 1) { + $daysPerYear = self::daysPerYear(PHPExcel_Calculation_DateTime::YEAR($maturity), $basis); + return ($daysPerYear / $frequency); + } + $prev = self::couponFirstPeriodDate($settlement, $maturity, $frequency, false); + $next = self::couponFirstPeriodDate($settlement, $maturity, $frequency, true); + return ($next - $prev); + default: + // US (NASD) 30/360, Actual/360 or European 30/360 + return 360 / $frequency; + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * COUPDAYSNC + * + * Returns the number of days from the settlement date to the next coupon date. + * + * Excel Function: + * COUPDAYSNC(settlement,maturity,frequency[,basis]) + * + * @access public + * @category Financial Functions + * @param mixed settlement The security's settlement date. + * The security settlement date is the date after the issue + * date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param mixed frequency the number of coupon payments per year. + * Valid frequency values are: + * 1 Annual + * 2 Semi-Annual + * 4 Quarterly + * If working in Gnumeric Mode, the following frequency options are + * also available + * 6 Bimonthly + * 12 Monthly + * @param integer basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function COUPDAYSNC($settlement, $maturity, $frequency, $basis = 0) + { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $frequency = (int) PHPExcel_Calculation_Functions::flattenSingleValue($frequency); + $basis = (is_null($basis)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + if (is_string($settlement = PHPExcel_Calculation_DateTime::getDateValue($settlement))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (is_string($maturity = PHPExcel_Calculation_DateTime::getDateValue($maturity))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (($settlement > $maturity) || + (!self::isValidFrequency($frequency)) || + (($basis < 0) || ($basis > 4))) { + return PHPExcel_Calculation_Functions::NaN(); + } + + $daysPerYear = self::daysPerYear(PHPExcel_Calculation_DateTime::YEAR($settlement), $basis); + $next = self::couponFirstPeriodDate($settlement, $maturity, $frequency, true); + + return PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $next, $basis) * $daysPerYear; + } + + + /** + * COUPNCD + * + * Returns the next coupon date after the settlement date. + * + * Excel Function: + * COUPNCD(settlement,maturity,frequency[,basis]) + * + * @access public + * @category Financial Functions + * @param mixed settlement The security's settlement date. + * The security settlement date is the date after the issue + * date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param mixed frequency the number of coupon payments per year. + * Valid frequency values are: + * 1 Annual + * 2 Semi-Annual + * 4 Quarterly + * If working in Gnumeric Mode, the following frequency options are + * also available + * 6 Bimonthly + * 12 Monthly + * @param integer basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * depending on the value of the ReturnDateType flag + */ + public static function COUPNCD($settlement, $maturity, $frequency, $basis = 0) + { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $frequency = (int) PHPExcel_Calculation_Functions::flattenSingleValue($frequency); + $basis = (is_null($basis)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + if (is_string($settlement = PHPExcel_Calculation_DateTime::getDateValue($settlement))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (is_string($maturity = PHPExcel_Calculation_DateTime::getDateValue($maturity))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (($settlement > $maturity) || + (!self::isValidFrequency($frequency)) || + (($basis < 0) || ($basis > 4))) { + return PHPExcel_Calculation_Functions::NaN(); + } + + return self::couponFirstPeriodDate($settlement, $maturity, $frequency, true); + } + + + /** + * COUPNUM + * + * Returns the number of coupons payable between the settlement date and maturity date, + * rounded up to the nearest whole coupon. + * + * Excel Function: + * COUPNUM(settlement,maturity,frequency[,basis]) + * + * @access public + * @category Financial Functions + * @param mixed settlement The security's settlement date. + * The security settlement date is the date after the issue + * date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param mixed frequency the number of coupon payments per year. + * Valid frequency values are: + * 1 Annual + * 2 Semi-Annual + * 4 Quarterly + * If working in Gnumeric Mode, the following frequency options are + * also available + * 6 Bimonthly + * 12 Monthly + * @param integer basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return integer + */ + public static function COUPNUM($settlement, $maturity, $frequency, $basis = 0) + { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $frequency = (int) PHPExcel_Calculation_Functions::flattenSingleValue($frequency); + $basis = (is_null($basis)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + if (is_string($settlement = PHPExcel_Calculation_DateTime::getDateValue($settlement))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (is_string($maturity = PHPExcel_Calculation_DateTime::getDateValue($maturity))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (($settlement > $maturity) || + (!self::isValidFrequency($frequency)) || + (($basis < 0) || ($basis > 4))) { + return PHPExcel_Calculation_Functions::NaN(); + } + + $settlement = self::couponFirstPeriodDate($settlement, $maturity, $frequency, true); + $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis) * 365; + + switch ($frequency) { + case 1: // annual payments + return ceil($daysBetweenSettlementAndMaturity / 360); + case 2: // half-yearly + return ceil($daysBetweenSettlementAndMaturity / 180); + case 4: // quarterly + return ceil($daysBetweenSettlementAndMaturity / 90); + case 6: // bimonthly + return ceil($daysBetweenSettlementAndMaturity / 60); + case 12: // monthly + return ceil($daysBetweenSettlementAndMaturity / 30); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * COUPPCD + * + * Returns the previous coupon date before the settlement date. + * + * Excel Function: + * COUPPCD(settlement,maturity,frequency[,basis]) + * + * @access public + * @category Financial Functions + * @param mixed settlement The security's settlement date. + * The security settlement date is the date after the issue + * date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param mixed frequency the number of coupon payments per year. + * Valid frequency values are: + * 1 Annual + * 2 Semi-Annual + * 4 Quarterly + * If working in Gnumeric Mode, the following frequency options are + * also available + * 6 Bimonthly + * 12 Monthly + * @param integer basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return mixed Excel date/time serial value, PHP date/time serial value or PHP date/time object, + * depending on the value of the ReturnDateType flag + */ + public static function COUPPCD($settlement, $maturity, $frequency, $basis = 0) + { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $frequency = (int) PHPExcel_Calculation_Functions::flattenSingleValue($frequency); + $basis = (is_null($basis)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + if (is_string($settlement = PHPExcel_Calculation_DateTime::getDateValue($settlement))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (is_string($maturity = PHPExcel_Calculation_DateTime::getDateValue($maturity))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (($settlement > $maturity) || + (!self::isValidFrequency($frequency)) || + (($basis < 0) || ($basis > 4))) { + return PHPExcel_Calculation_Functions::NaN(); + } + + return self::couponFirstPeriodDate($settlement, $maturity, $frequency, false); + } + + + /** + * CUMIPMT + * + * Returns the cumulative interest paid on a loan between the start and end periods. + * + * Excel Function: + * CUMIPMT(rate,nper,pv,start,end[,type]) + * + * @access public + * @category Financial Functions + * @param float $rate The Interest rate + * @param integer $nper The total number of payment periods + * @param float $pv Present Value + * @param integer $start The first period in the calculation. + * Payment periods are numbered beginning with 1. + * @param integer $end The last period in the calculation. + * @param integer $type A number 0 or 1 and indicates when payments are due: + * 0 or omitted At the end of the period. + * 1 At the beginning of the period. + * @return float + */ + public static function CUMIPMT($rate, $nper, $pv, $start, $end, $type = 0) + { + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $nper = (int) PHPExcel_Calculation_Functions::flattenSingleValue($nper); + $pv = PHPExcel_Calculation_Functions::flattenSingleValue($pv); + $start = (int) PHPExcel_Calculation_Functions::flattenSingleValue($start); + $end = (int) PHPExcel_Calculation_Functions::flattenSingleValue($end); + $type = (int) PHPExcel_Calculation_Functions::flattenSingleValue($type); + + // Validate parameters + if ($type != 0 && $type != 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ($start < 1 || $start > $end) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + // Calculate + $interest = 0; + for ($per = $start; $per <= $end; ++$per) { + $interest += self::IPMT($rate, $per, $nper, $pv, 0, $type); + } + + return $interest; + } + + + /** + * CUMPRINC + * + * Returns the cumulative principal paid on a loan between the start and end periods. + * + * Excel Function: + * CUMPRINC(rate,nper,pv,start,end[,type]) + * + * @access public + * @category Financial Functions + * @param float $rate The Interest rate + * @param integer $nper The total number of payment periods + * @param float $pv Present Value + * @param integer $start The first period in the calculation. + * Payment periods are numbered beginning with 1. + * @param integer $end The last period in the calculation. + * @param integer $type A number 0 or 1 and indicates when payments are due: + * 0 or omitted At the end of the period. + * 1 At the beginning of the period. + * @return float + */ + public static function CUMPRINC($rate, $nper, $pv, $start, $end, $type = 0) + { + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $nper = (int) PHPExcel_Calculation_Functions::flattenSingleValue($nper); + $pv = PHPExcel_Calculation_Functions::flattenSingleValue($pv); + $start = (int) PHPExcel_Calculation_Functions::flattenSingleValue($start); + $end = (int) PHPExcel_Calculation_Functions::flattenSingleValue($end); + $type = (int) PHPExcel_Calculation_Functions::flattenSingleValue($type); + + // Validate parameters + if ($type != 0 && $type != 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ($start < 1 || $start > $end) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + // Calculate + $principal = 0; + for ($per = $start; $per <= $end; ++$per) { + $principal += self::PPMT($rate, $per, $nper, $pv, 0, $type); + } + + return $principal; + } + + + /** + * DB + * + * Returns the depreciation of an asset for a specified period using the + * fixed-declining balance method. + * This form of depreciation is used if you want to get a higher depreciation value + * at the beginning of the depreciation (as opposed to linear depreciation). The + * depreciation value is reduced with every depreciation period by the depreciation + * already deducted from the initial cost. + * + * Excel Function: + * DB(cost,salvage,life,period[,month]) + * + * @access public + * @category Financial Functions + * @param float cost Initial cost of the asset. + * @param float salvage Value at the end of the depreciation. + * (Sometimes called the salvage value of the asset) + * @param integer life Number of periods over which the asset is depreciated. + * (Sometimes called the useful life of the asset) + * @param integer period The period for which you want to calculate the + * depreciation. Period must use the same units as life. + * @param integer month Number of months in the first year. If month is omitted, + * it defaults to 12. + * @return float + */ + public static function DB($cost, $salvage, $life, $period, $month = 12) + { + $cost = PHPExcel_Calculation_Functions::flattenSingleValue($cost); + $salvage = PHPExcel_Calculation_Functions::flattenSingleValue($salvage); + $life = PHPExcel_Calculation_Functions::flattenSingleValue($life); + $period = PHPExcel_Calculation_Functions::flattenSingleValue($period); + $month = PHPExcel_Calculation_Functions::flattenSingleValue($month); + + // Validate + if ((is_numeric($cost)) && (is_numeric($salvage)) && (is_numeric($life)) && (is_numeric($period)) && (is_numeric($month))) { + $cost = (float) $cost; + $salvage = (float) $salvage; + $life = (int) $life; + $period = (int) $period; + $month = (int) $month; + if ($cost == 0) { + return 0.0; + } elseif (($cost < 0) || (($salvage / $cost) < 0) || ($life <= 0) || ($period < 1) || ($month < 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + // Set Fixed Depreciation Rate + $fixedDepreciationRate = 1 - pow(($salvage / $cost), (1 / $life)); + $fixedDepreciationRate = round($fixedDepreciationRate, 3); + + // Loop through each period calculating the depreciation + $previousDepreciation = 0; + for ($per = 1; $per <= $period; ++$per) { + if ($per == 1) { + $depreciation = $cost * $fixedDepreciationRate * $month / 12; + } elseif ($per == ($life + 1)) { + $depreciation = ($cost - $previousDepreciation) * $fixedDepreciationRate * (12 - $month) / 12; + } else { + $depreciation = ($cost - $previousDepreciation) * $fixedDepreciationRate; + } + $previousDepreciation += $depreciation; + } + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) { + $depreciation = round($depreciation, 2); + } + return $depreciation; + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * DDB + * + * Returns the depreciation of an asset for a specified period using the + * double-declining balance method or some other method you specify. + * + * Excel Function: + * DDB(cost,salvage,life,period[,factor]) + * + * @access public + * @category Financial Functions + * @param float cost Initial cost of the asset. + * @param float salvage Value at the end of the depreciation. + * (Sometimes called the salvage value of the asset) + * @param integer life Number of periods over which the asset is depreciated. + * (Sometimes called the useful life of the asset) + * @param integer period The period for which you want to calculate the + * depreciation. Period must use the same units as life. + * @param float factor The rate at which the balance declines. + * If factor is omitted, it is assumed to be 2 (the + * double-declining balance method). + * @return float + */ + public static function DDB($cost, $salvage, $life, $period, $factor = 2.0) + { + $cost = PHPExcel_Calculation_Functions::flattenSingleValue($cost); + $salvage = PHPExcel_Calculation_Functions::flattenSingleValue($salvage); + $life = PHPExcel_Calculation_Functions::flattenSingleValue($life); + $period = PHPExcel_Calculation_Functions::flattenSingleValue($period); + $factor = PHPExcel_Calculation_Functions::flattenSingleValue($factor); + + // Validate + if ((is_numeric($cost)) && (is_numeric($salvage)) && (is_numeric($life)) && (is_numeric($period)) && (is_numeric($factor))) { + $cost = (float) $cost; + $salvage = (float) $salvage; + $life = (int) $life; + $period = (int) $period; + $factor = (float) $factor; + if (($cost <= 0) || (($salvage / $cost) < 0) || ($life <= 0) || ($period < 1) || ($factor <= 0.0) || ($period > $life)) { + return PHPExcel_Calculation_Functions::NaN(); + } + // Set Fixed Depreciation Rate + $fixedDepreciationRate = 1 - pow(($salvage / $cost), (1 / $life)); + $fixedDepreciationRate = round($fixedDepreciationRate, 3); + + // Loop through each period calculating the depreciation + $previousDepreciation = 0; + for ($per = 1; $per <= $period; ++$per) { + $depreciation = min(($cost - $previousDepreciation) * ($factor / $life), ($cost - $salvage - $previousDepreciation)); + $previousDepreciation += $depreciation; + } + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) { + $depreciation = round($depreciation, 2); + } + return $depreciation; + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * DISC + * + * Returns the discount rate for a security. + * + * Excel Function: + * DISC(settlement,maturity,price,redemption[,basis]) + * + * @access public + * @category Financial Functions + * @param mixed settlement The security's settlement date. + * The security settlement date is the date after the issue + * date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param integer price The security's price per $100 face value. + * @param integer redemption The security's redemption value per $100 face value. + * @param integer basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function DISC($settlement, $maturity, $price, $redemption, $basis = 0) + { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $price = PHPExcel_Calculation_Functions::flattenSingleValue($price); + $redemption = PHPExcel_Calculation_Functions::flattenSingleValue($redemption); + $basis = PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + // Validate + if ((is_numeric($price)) && (is_numeric($redemption)) && (is_numeric($basis))) { + $price = (float) $price; + $redemption = (float) $redemption; + $basis = (int) $basis; + if (($price <= 0) || ($redemption <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis); + if (!is_numeric($daysBetweenSettlementAndMaturity)) { + // return date error + return $daysBetweenSettlementAndMaturity; + } + + return ((1 - $price / $redemption) / $daysBetweenSettlementAndMaturity); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * DOLLARDE + * + * Converts a dollar price expressed as an integer part and a fraction + * part into a dollar price expressed as a decimal number. + * Fractional dollar numbers are sometimes used for security prices. + * + * Excel Function: + * DOLLARDE(fractional_dollar,fraction) + * + * @access public + * @category Financial Functions + * @param float $fractional_dollar Fractional Dollar + * @param integer $fraction Fraction + * @return float + */ + public static function DOLLARDE($fractional_dollar = null, $fraction = 0) + { + $fractional_dollar = PHPExcel_Calculation_Functions::flattenSingleValue($fractional_dollar); + $fraction = (int)PHPExcel_Calculation_Functions::flattenSingleValue($fraction); + + // Validate parameters + if (is_null($fractional_dollar) || $fraction < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ($fraction == 0) { + return PHPExcel_Calculation_Functions::DIV0(); + } + + $dollars = floor($fractional_dollar); + $cents = fmod($fractional_dollar, 1); + $cents /= $fraction; + $cents *= pow(10, ceil(log10($fraction))); + return $dollars + $cents; + } + + + /** + * DOLLARFR + * + * Converts a dollar price expressed as a decimal number into a dollar price + * expressed as a fraction. + * Fractional dollar numbers are sometimes used for security prices. + * + * Excel Function: + * DOLLARFR(decimal_dollar,fraction) + * + * @access public + * @category Financial Functions + * @param float $decimal_dollar Decimal Dollar + * @param integer $fraction Fraction + * @return float + */ + public static function DOLLARFR($decimal_dollar = null, $fraction = 0) + { + $decimal_dollar = PHPExcel_Calculation_Functions::flattenSingleValue($decimal_dollar); + $fraction = (int)PHPExcel_Calculation_Functions::flattenSingleValue($fraction); + + // Validate parameters + if (is_null($decimal_dollar) || $fraction < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ($fraction == 0) { + return PHPExcel_Calculation_Functions::DIV0(); + } + + $dollars = floor($decimal_dollar); + $cents = fmod($decimal_dollar, 1); + $cents *= $fraction; + $cents *= pow(10, -ceil(log10($fraction))); + return $dollars + $cents; + } + + + /** + * EFFECT + * + * Returns the effective interest rate given the nominal rate and the number of + * compounding payments per year. + * + * Excel Function: + * EFFECT(nominal_rate,npery) + * + * @access public + * @category Financial Functions + * @param float $nominal_rate Nominal interest rate + * @param integer $npery Number of compounding payments per year + * @return float + */ + public static function EFFECT($nominal_rate = 0, $npery = 0) + { + $nominal_rate = PHPExcel_Calculation_Functions::flattenSingleValue($nominal_rate); + $npery = (int)PHPExcel_Calculation_Functions::flattenSingleValue($npery); + + // Validate parameters + if ($nominal_rate <= 0 || $npery < 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + + return pow((1 + $nominal_rate / $npery), $npery) - 1; + } + + + /** + * FV + * + * Returns the Future Value of a cash flow with constant payments and interest rate (annuities). + * + * Excel Function: + * FV(rate,nper,pmt[,pv[,type]]) + * + * @access public + * @category Financial Functions + * @param float $rate The interest rate per period + * @param int $nper Total number of payment periods in an annuity + * @param float $pmt The payment made each period: it cannot change over the + * life of the annuity. Typically, pmt contains principal + * and interest but no other fees or taxes. + * @param float $pv Present Value, or the lump-sum amount that a series of + * future payments is worth right now. + * @param integer $type A number 0 or 1 and indicates when payments are due: + * 0 or omitted At the end of the period. + * 1 At the beginning of the period. + * @return float + */ + public static function FV($rate = 0, $nper = 0, $pmt = 0, $pv = 0, $type = 0) + { + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $nper = PHPExcel_Calculation_Functions::flattenSingleValue($nper); + $pmt = PHPExcel_Calculation_Functions::flattenSingleValue($pmt); + $pv = PHPExcel_Calculation_Functions::flattenSingleValue($pv); + $type = PHPExcel_Calculation_Functions::flattenSingleValue($type); + + // Validate parameters + if ($type != 0 && $type != 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Calculate + if (!is_null($rate) && $rate != 0) { + return -$pv * pow(1 + $rate, $nper) - $pmt * (1 + $rate * $type) * (pow(1 + $rate, $nper) - 1) / $rate; + } + return -$pv - $pmt * $nper; + } + + + /** + * FVSCHEDULE + * + * Returns the future value of an initial principal after applying a series of compound interest rates. + * Use FVSCHEDULE to calculate the future value of an investment with a variable or adjustable rate. + * + * Excel Function: + * FVSCHEDULE(principal,schedule) + * + * @param float $principal The present value. + * @param float[] $schedule An array of interest rates to apply. + * @return float + */ + public static function FVSCHEDULE($principal, $schedule) + { + $principal = PHPExcel_Calculation_Functions::flattenSingleValue($principal); + $schedule = PHPExcel_Calculation_Functions::flattenArray($schedule); + + foreach ($schedule as $rate) { + $principal *= 1 + $rate; + } + + return $principal; + } + + + /** + * INTRATE + * + * Returns the interest rate for a fully invested security. + * + * Excel Function: + * INTRATE(settlement,maturity,investment,redemption[,basis]) + * + * @param mixed $settlement The security's settlement date. + * The security settlement date is the date after the issue date when the security is traded to the buyer. + * @param mixed $maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param integer $investment The amount invested in the security. + * @param integer $redemption The amount to be received at maturity. + * @param integer $basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function INTRATE($settlement, $maturity, $investment, $redemption, $basis = 0) + { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $investment = PHPExcel_Calculation_Functions::flattenSingleValue($investment); + $redemption = PHPExcel_Calculation_Functions::flattenSingleValue($redemption); + $basis = PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + // Validate + if ((is_numeric($investment)) && (is_numeric($redemption)) && (is_numeric($basis))) { + $investment = (float) $investment; + $redemption = (float) $redemption; + $basis = (int) $basis; + if (($investment <= 0) || ($redemption <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis); + if (!is_numeric($daysBetweenSettlementAndMaturity)) { + // return date error + return $daysBetweenSettlementAndMaturity; + } + + return (($redemption / $investment) - 1) / ($daysBetweenSettlementAndMaturity); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * IPMT + * + * Returns the interest payment for a given period for an investment based on periodic, constant payments and a constant interest rate. + * + * Excel Function: + * IPMT(rate,per,nper,pv[,fv][,type]) + * + * @param float $rate Interest rate per period + * @param int $per Period for which we want to find the interest + * @param int $nper Number of periods + * @param float $pv Present Value + * @param float $fv Future Value + * @param int $type Payment type: 0 = at the end of each period, 1 = at the beginning of each period + * @return float + */ + public static function IPMT($rate, $per, $nper, $pv, $fv = 0, $type = 0) + { + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $per = (int) PHPExcel_Calculation_Functions::flattenSingleValue($per); + $nper = (int) PHPExcel_Calculation_Functions::flattenSingleValue($nper); + $pv = PHPExcel_Calculation_Functions::flattenSingleValue($pv); + $fv = PHPExcel_Calculation_Functions::flattenSingleValue($fv); + $type = (int) PHPExcel_Calculation_Functions::flattenSingleValue($type); + + // Validate parameters + if ($type != 0 && $type != 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ($per <= 0 || $per > $nper) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + // Calculate + $interestAndPrincipal = self::interestAndPrincipal($rate, $per, $nper, $pv, $fv, $type); + return $interestAndPrincipal[0]; + } + + /** + * IRR + * + * Returns the internal rate of return for a series of cash flows represented by the numbers in values. + * These cash flows do not have to be even, as they would be for an annuity. However, the cash flows must occur + * at regular intervals, such as monthly or annually. The internal rate of return is the interest rate received + * for an investment consisting of payments (negative values) and income (positive values) that occur at regular + * periods. + * + * Excel Function: + * IRR(values[,guess]) + * + * @param float[] $values An array or a reference to cells that contain numbers for which you want + * to calculate the internal rate of return. + * Values must contain at least one positive value and one negative value to + * calculate the internal rate of return. + * @param float $guess A number that you guess is close to the result of IRR + * @return float + */ + public static function IRR($values, $guess = 0.1) + { + if (!is_array($values)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $values = PHPExcel_Calculation_Functions::flattenArray($values); + $guess = PHPExcel_Calculation_Functions::flattenSingleValue($guess); + + // create an initial range, with a root somewhere between 0 and guess + $x1 = 0.0; + $x2 = $guess; + $f1 = self::NPV($x1, $values); + $f2 = self::NPV($x2, $values); + for ($i = 0; $i < FINANCIAL_MAX_ITERATIONS; ++$i) { + if (($f1 * $f2) < 0.0) { + break; + } + if (abs($f1) < abs($f2)) { + $f1 = self::NPV($x1 += 1.6 * ($x1 - $x2), $values); + } else { + $f2 = self::NPV($x2 += 1.6 * ($x2 - $x1), $values); + } + } + if (($f1 * $f2) > 0.0) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + $f = self::NPV($x1, $values); + if ($f < 0.0) { + $rtb = $x1; + $dx = $x2 - $x1; + } else { + $rtb = $x2; + $dx = $x1 - $x2; + } + + for ($i = 0; $i < FINANCIAL_MAX_ITERATIONS; ++$i) { + $dx *= 0.5; + $x_mid = $rtb + $dx; + $f_mid = self::NPV($x_mid, $values); + if ($f_mid <= 0.0) { + $rtb = $x_mid; + } + if ((abs($f_mid) < FINANCIAL_PRECISION) || (abs($dx) < FINANCIAL_PRECISION)) { + return $x_mid; + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * ISPMT + * + * Returns the interest payment for an investment based on an interest rate and a constant payment schedule. + * + * Excel Function: + * =ISPMT(interest_rate, period, number_payments, PV) + * + * interest_rate is the interest rate for the investment + * + * period is the period to calculate the interest rate. It must be betweeen 1 and number_payments. + * + * number_payments is the number of payments for the annuity + * + * PV is the loan amount or present value of the payments + */ + public static function ISPMT() + { + // Return value + $returnValue = 0; + + // Get the parameters + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + $interestRate = array_shift($aArgs); + $period = array_shift($aArgs); + $numberPeriods = array_shift($aArgs); + $principleRemaining = array_shift($aArgs); + + // Calculate + $principlePayment = ($principleRemaining * 1.0) / ($numberPeriods * 1.0); + for ($i=0; $i <= $period; ++$i) { + $returnValue = $interestRate * $principleRemaining * -1; + $principleRemaining -= $principlePayment; + // principle needs to be 0 after the last payment, don't let floating point screw it up + if ($i == $numberPeriods) { + $returnValue = 0; + } + } + return($returnValue); + } + + + /** + * MIRR + * + * Returns the modified internal rate of return for a series of periodic cash flows. MIRR considers both + * the cost of the investment and the interest received on reinvestment of cash. + * + * Excel Function: + * MIRR(values,finance_rate, reinvestment_rate) + * + * @param float[] $values An array or a reference to cells that contain a series of payments and + * income occurring at regular intervals. + * Payments are negative value, income is positive values. + * @param float $finance_rate The interest rate you pay on the money used in the cash flows + * @param float $reinvestment_rate The interest rate you receive on the cash flows as you reinvest them + * @return float + */ + public static function MIRR($values, $finance_rate, $reinvestment_rate) + { + if (!is_array($values)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $values = PHPExcel_Calculation_Functions::flattenArray($values); + $finance_rate = PHPExcel_Calculation_Functions::flattenSingleValue($finance_rate); + $reinvestment_rate = PHPExcel_Calculation_Functions::flattenSingleValue($reinvestment_rate); + $n = count($values); + + $rr = 1.0 + $reinvestment_rate; + $fr = 1.0 + $finance_rate; + + $npv_pos = $npv_neg = 0.0; + foreach ($values as $i => $v) { + if ($v >= 0) { + $npv_pos += $v / pow($rr, $i); + } else { + $npv_neg += $v / pow($fr, $i); + } + } + + if (($npv_neg == 0) || ($npv_pos == 0) || ($reinvestment_rate <= -1)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + $mirr = pow((-$npv_pos * pow($rr, $n)) + / ($npv_neg * ($rr)), (1.0 / ($n - 1))) - 1.0; + + return (is_finite($mirr) ? $mirr : PHPExcel_Calculation_Functions::VALUE()); + } + + + /** + * NOMINAL + * + * Returns the nominal interest rate given the effective rate and the number of compounding payments per year. + * + * @param float $effect_rate Effective interest rate + * @param int $npery Number of compounding payments per year + * @return float + */ + public static function NOMINAL($effect_rate = 0, $npery = 0) + { + $effect_rate = PHPExcel_Calculation_Functions::flattenSingleValue($effect_rate); + $npery = (int)PHPExcel_Calculation_Functions::flattenSingleValue($npery); + + // Validate parameters + if ($effect_rate <= 0 || $npery < 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Calculate + return $npery * (pow($effect_rate + 1, 1 / $npery) - 1); + } + + + /** + * NPER + * + * Returns the number of periods for a cash flow with constant periodic payments (annuities), and interest rate. + * + * @param float $rate Interest rate per period + * @param int $pmt Periodic payment (annuity) + * @param float $pv Present Value + * @param float $fv Future Value + * @param int $type Payment type: 0 = at the end of each period, 1 = at the beginning of each period + * @return float + */ + public static function NPER($rate = 0, $pmt = 0, $pv = 0, $fv = 0, $type = 0) + { + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $pmt = PHPExcel_Calculation_Functions::flattenSingleValue($pmt); + $pv = PHPExcel_Calculation_Functions::flattenSingleValue($pv); + $fv = PHPExcel_Calculation_Functions::flattenSingleValue($fv); + $type = PHPExcel_Calculation_Functions::flattenSingleValue($type); + + // Validate parameters + if ($type != 0 && $type != 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Calculate + if (!is_null($rate) && $rate != 0) { + if ($pmt == 0 && $pv == 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + return log(($pmt * (1 + $rate * $type) / $rate - $fv) / ($pv + $pmt * (1 + $rate * $type) / $rate)) / log(1 + $rate); + } + if ($pmt == 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + return (-$pv -$fv) / $pmt; + } + + /** + * NPV + * + * Returns the Net Present Value of a cash flow series given a discount rate. + * + * @return float + */ + public static function NPV() + { + // Return value + $returnValue = 0; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + + // Calculate + $rate = array_shift($aArgs); + for ($i = 1; $i <= count($aArgs); ++$i) { + // Is it a numeric value? + if (is_numeric($aArgs[$i - 1])) { + $returnValue += $aArgs[$i - 1] / pow(1 + $rate, $i); + } + } + + // Return + return $returnValue; + } + + /** + * PMT + * + * Returns the constant payment (annuity) for a cash flow with a constant interest rate. + * + * @param float $rate Interest rate per period + * @param int $nper Number of periods + * @param float $pv Present Value + * @param float $fv Future Value + * @param int $type Payment type: 0 = at the end of each period, 1 = at the beginning of each period + * @return float + */ + public static function PMT($rate = 0, $nper = 0, $pv = 0, $fv = 0, $type = 0) + { + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $nper = PHPExcel_Calculation_Functions::flattenSingleValue($nper); + $pv = PHPExcel_Calculation_Functions::flattenSingleValue($pv); + $fv = PHPExcel_Calculation_Functions::flattenSingleValue($fv); + $type = PHPExcel_Calculation_Functions::flattenSingleValue($type); + + // Validate parameters + if ($type != 0 && $type != 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Calculate + if (!is_null($rate) && $rate != 0) { + return (-$fv - $pv * pow(1 + $rate, $nper)) / (1 + $rate * $type) / ((pow(1 + $rate, $nper) - 1) / $rate); + } + return (-$pv - $fv) / $nper; + } + + + /** + * PPMT + * + * Returns the interest payment for a given period for an investment based on periodic, constant payments and a constant interest rate. + * + * @param float $rate Interest rate per period + * @param int $per Period for which we want to find the interest + * @param int $nper Number of periods + * @param float $pv Present Value + * @param float $fv Future Value + * @param int $type Payment type: 0 = at the end of each period, 1 = at the beginning of each period + * @return float + */ + public static function PPMT($rate, $per, $nper, $pv, $fv = 0, $type = 0) + { + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $per = (int) PHPExcel_Calculation_Functions::flattenSingleValue($per); + $nper = (int) PHPExcel_Calculation_Functions::flattenSingleValue($nper); + $pv = PHPExcel_Calculation_Functions::flattenSingleValue($pv); + $fv = PHPExcel_Calculation_Functions::flattenSingleValue($fv); + $type = (int) PHPExcel_Calculation_Functions::flattenSingleValue($type); + + // Validate parameters + if ($type != 0 && $type != 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ($per <= 0 || $per > $nper) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + // Calculate + $interestAndPrincipal = self::interestAndPrincipal($rate, $per, $nper, $pv, $fv, $type); + return $interestAndPrincipal[1]; + } + + + public static function PRICE($settlement, $maturity, $rate, $yield, $redemption, $frequency, $basis = 0) + { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $rate = (float) PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $yield = (float) PHPExcel_Calculation_Functions::flattenSingleValue($yield); + $redemption = (float) PHPExcel_Calculation_Functions::flattenSingleValue($redemption); + $frequency = (int) PHPExcel_Calculation_Functions::flattenSingleValue($frequency); + $basis = (is_null($basis)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + if (is_string($settlement = PHPExcel_Calculation_DateTime::getDateValue($settlement))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (is_string($maturity = PHPExcel_Calculation_DateTime::getDateValue($maturity))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (($settlement > $maturity) || + (!self::isValidFrequency($frequency)) || + (($basis < 0) || ($basis > 4))) { + return PHPExcel_Calculation_Functions::NaN(); + } + + $dsc = self::COUPDAYSNC($settlement, $maturity, $frequency, $basis); + $e = self::COUPDAYS($settlement, $maturity, $frequency, $basis); + $n = self::COUPNUM($settlement, $maturity, $frequency, $basis); + $a = self::COUPDAYBS($settlement, $maturity, $frequency, $basis); + + $baseYF = 1.0 + ($yield / $frequency); + $rfp = 100 * ($rate / $frequency); + $de = $dsc / $e; + + $result = $redemption / pow($baseYF, (--$n + $de)); + for ($k = 0; $k <= $n; ++$k) { + $result += $rfp / (pow($baseYF, ($k + $de))); + } + $result -= $rfp * ($a / $e); + + return $result; + } + + + /** + * PRICEDISC + * + * Returns the price per $100 face value of a discounted security. + * + * @param mixed settlement The security's settlement date. + * The security settlement date is the date after the issue date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param int discount The security's discount rate. + * @param int redemption The security's redemption value per $100 face value. + * @param int basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function PRICEDISC($settlement, $maturity, $discount, $redemption, $basis = 0) + { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $discount = (float) PHPExcel_Calculation_Functions::flattenSingleValue($discount); + $redemption = (float) PHPExcel_Calculation_Functions::flattenSingleValue($redemption); + $basis = (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + // Validate + if ((is_numeric($discount)) && (is_numeric($redemption)) && (is_numeric($basis))) { + if (($discount <= 0) || ($redemption <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis); + if (!is_numeric($daysBetweenSettlementAndMaturity)) { + // return date error + return $daysBetweenSettlementAndMaturity; + } + + return $redemption * (1 - $discount * $daysBetweenSettlementAndMaturity); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * PRICEMAT + * + * Returns the price per $100 face value of a security that pays interest at maturity. + * + * @param mixed settlement The security's settlement date. + * The security's settlement date is the date after the issue date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param mixed issue The security's issue date. + * @param int rate The security's interest rate at date of issue. + * @param int yield The security's annual yield. + * @param int basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function PRICEMAT($settlement, $maturity, $issue, $rate, $yield, $basis = 0) + { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $issue = PHPExcel_Calculation_Functions::flattenSingleValue($issue); + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $yield = PHPExcel_Calculation_Functions::flattenSingleValue($yield); + $basis = (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + // Validate + if (is_numeric($rate) && is_numeric($yield)) { + if (($rate <= 0) || ($yield <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $daysPerYear = self::daysPerYear(PHPExcel_Calculation_DateTime::YEAR($settlement), $basis); + if (!is_numeric($daysPerYear)) { + return $daysPerYear; + } + $daysBetweenIssueAndSettlement = PHPExcel_Calculation_DateTime::YEARFRAC($issue, $settlement, $basis); + if (!is_numeric($daysBetweenIssueAndSettlement)) { + // return date error + return $daysBetweenIssueAndSettlement; + } + $daysBetweenIssueAndSettlement *= $daysPerYear; + $daysBetweenIssueAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($issue, $maturity, $basis); + if (!is_numeric($daysBetweenIssueAndMaturity)) { + // return date error + return $daysBetweenIssueAndMaturity; + } + $daysBetweenIssueAndMaturity *= $daysPerYear; + $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis); + if (!is_numeric($daysBetweenSettlementAndMaturity)) { + // return date error + return $daysBetweenSettlementAndMaturity; + } + $daysBetweenSettlementAndMaturity *= $daysPerYear; + + return ((100 + (($daysBetweenIssueAndMaturity / $daysPerYear) * $rate * 100)) / + (1 + (($daysBetweenSettlementAndMaturity / $daysPerYear) * $yield)) - + (($daysBetweenIssueAndSettlement / $daysPerYear) * $rate * 100)); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * PV + * + * Returns the Present Value of a cash flow with constant payments and interest rate (annuities). + * + * @param float $rate Interest rate per period + * @param int $nper Number of periods + * @param float $pmt Periodic payment (annuity) + * @param float $fv Future Value + * @param int $type Payment type: 0 = at the end of each period, 1 = at the beginning of each period + * @return float + */ + public static function PV($rate = 0, $nper = 0, $pmt = 0, $fv = 0, $type = 0) + { + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $nper = PHPExcel_Calculation_Functions::flattenSingleValue($nper); + $pmt = PHPExcel_Calculation_Functions::flattenSingleValue($pmt); + $fv = PHPExcel_Calculation_Functions::flattenSingleValue($fv); + $type = PHPExcel_Calculation_Functions::flattenSingleValue($type); + + // Validate parameters + if ($type != 0 && $type != 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // Calculate + if (!is_null($rate) && $rate != 0) { + return (-$pmt * (1 + $rate * $type) * ((pow(1 + $rate, $nper) - 1) / $rate) - $fv) / pow(1 + $rate, $nper); + } + return -$fv - $pmt * $nper; + } + + + /** + * RATE + * + * Returns the interest rate per period of an annuity. + * RATE is calculated by iteration and can have zero or more solutions. + * If the successive results of RATE do not converge to within 0.0000001 after 20 iterations, + * RATE returns the #NUM! error value. + * + * Excel Function: + * RATE(nper,pmt,pv[,fv[,type[,guess]]]) + * + * @access public + * @category Financial Functions + * @param float nper The total number of payment periods in an annuity. + * @param float pmt The payment made each period and cannot change over the life + * of the annuity. + * Typically, pmt includes principal and interest but no other + * fees or taxes. + * @param float pv The present value - the total amount that a series of future + * payments is worth now. + * @param float fv The future value, or a cash balance you want to attain after + * the last payment is made. If fv is omitted, it is assumed + * to be 0 (the future value of a loan, for example, is 0). + * @param integer type A number 0 or 1 and indicates when payments are due: + * 0 or omitted At the end of the period. + * 1 At the beginning of the period. + * @param float guess Your guess for what the rate will be. + * If you omit guess, it is assumed to be 10 percent. + * @return float + **/ + public static function RATE($nper, $pmt, $pv, $fv = 0.0, $type = 0, $guess = 0.1) + { + $nper = (int) PHPExcel_Calculation_Functions::flattenSingleValue($nper); + $pmt = PHPExcel_Calculation_Functions::flattenSingleValue($pmt); + $pv = PHPExcel_Calculation_Functions::flattenSingleValue($pv); + $fv = (is_null($fv)) ? 0.0 : PHPExcel_Calculation_Functions::flattenSingleValue($fv); + $type = (is_null($type)) ? 0 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($type); + $guess = (is_null($guess)) ? 0.1 : PHPExcel_Calculation_Functions::flattenSingleValue($guess); + + $rate = $guess; + if (abs($rate) < FINANCIAL_PRECISION) { + $y = $pv * (1 + $nper * $rate) + $pmt * (1 + $rate * $type) * $nper + $fv; + } else { + $f = exp($nper * log(1 + $rate)); + $y = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv; + } + $y0 = $pv + $pmt * $nper + $fv; + $y1 = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv; + + // find root by secant method + $i = $x0 = 0.0; + $x1 = $rate; + while ((abs($y0 - $y1) > FINANCIAL_PRECISION) && ($i < FINANCIAL_MAX_ITERATIONS)) { + $rate = ($y1 * $x0 - $y0 * $x1) / ($y1 - $y0); + $x0 = $x1; + $x1 = $rate; + if (($nper * abs($pmt)) > ($pv - $fv)) { + $x1 = abs($x1); + } + if (abs($rate) < FINANCIAL_PRECISION) { + $y = $pv * (1 + $nper * $rate) + $pmt * (1 + $rate * $type) * $nper + $fv; + } else { + $f = exp($nper * log(1 + $rate)); + $y = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv; + } + + $y0 = $y1; + $y1 = $y; + ++$i; + } + return $rate; + } + + + /** + * RECEIVED + * + * Returns the price per $100 face value of a discounted security. + * + * @param mixed settlement The security's settlement date. + * The security settlement date is the date after the issue date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param int investment The amount invested in the security. + * @param int discount The security's discount rate. + * @param int basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function RECEIVED($settlement, $maturity, $investment, $discount, $basis = 0) + { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $investment = (float) PHPExcel_Calculation_Functions::flattenSingleValue($investment); + $discount = (float) PHPExcel_Calculation_Functions::flattenSingleValue($discount); + $basis = (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + // Validate + if ((is_numeric($investment)) && (is_numeric($discount)) && (is_numeric($basis))) { + if (($investment <= 0) || ($discount <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis); + if (!is_numeric($daysBetweenSettlementAndMaturity)) { + // return date error + return $daysBetweenSettlementAndMaturity; + } + + return $investment / ( 1 - ($discount * $daysBetweenSettlementAndMaturity)); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * SLN + * + * Returns the straight-line depreciation of an asset for one period + * + * @param cost Initial cost of the asset + * @param salvage Value at the end of the depreciation + * @param life Number of periods over which the asset is depreciated + * @return float + */ + public static function SLN($cost, $salvage, $life) + { + $cost = PHPExcel_Calculation_Functions::flattenSingleValue($cost); + $salvage = PHPExcel_Calculation_Functions::flattenSingleValue($salvage); + $life = PHPExcel_Calculation_Functions::flattenSingleValue($life); + + // Calculate + if ((is_numeric($cost)) && (is_numeric($salvage)) && (is_numeric($life))) { + if ($life < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + return ($cost - $salvage) / $life; + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * SYD + * + * Returns the sum-of-years' digits depreciation of an asset for a specified period. + * + * @param cost Initial cost of the asset + * @param salvage Value at the end of the depreciation + * @param life Number of periods over which the asset is depreciated + * @param period Period + * @return float + */ + public static function SYD($cost, $salvage, $life, $period) + { + $cost = PHPExcel_Calculation_Functions::flattenSingleValue($cost); + $salvage = PHPExcel_Calculation_Functions::flattenSingleValue($salvage); + $life = PHPExcel_Calculation_Functions::flattenSingleValue($life); + $period = PHPExcel_Calculation_Functions::flattenSingleValue($period); + + // Calculate + if ((is_numeric($cost)) && (is_numeric($salvage)) && (is_numeric($life)) && (is_numeric($period))) { + if (($life < 1) || ($period > $life)) { + return PHPExcel_Calculation_Functions::NaN(); + } + return (($cost - $salvage) * ($life - $period + 1) * 2) / ($life * ($life + 1)); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * TBILLEQ + * + * Returns the bond-equivalent yield for a Treasury bill. + * + * @param mixed settlement The Treasury bill's settlement date. + * The Treasury bill's settlement date is the date after the issue date when the Treasury bill is traded to the buyer. + * @param mixed maturity The Treasury bill's maturity date. + * The maturity date is the date when the Treasury bill expires. + * @param int discount The Treasury bill's discount rate. + * @return float + */ + public static function TBILLEQ($settlement, $maturity, $discount) + { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $discount = PHPExcel_Calculation_Functions::flattenSingleValue($discount); + + // Use TBILLPRICE for validation + $testValue = self::TBILLPRICE($settlement, $maturity, $discount); + if (is_string($testValue)) { + return $testValue; + } + + if (is_string($maturity = PHPExcel_Calculation_DateTime::getDateValue($maturity))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + ++$maturity; + $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity) * 360; + } else { + $daysBetweenSettlementAndMaturity = (PHPExcel_Calculation_DateTime::getDateValue($maturity) - PHPExcel_Calculation_DateTime::getDateValue($settlement)); + } + + return (365 * $discount) / (360 - $discount * $daysBetweenSettlementAndMaturity); + } + + + /** + * TBILLPRICE + * + * Returns the yield for a Treasury bill. + * + * @param mixed settlement The Treasury bill's settlement date. + * The Treasury bill's settlement date is the date after the issue date when the Treasury bill is traded to the buyer. + * @param mixed maturity The Treasury bill's maturity date. + * The maturity date is the date when the Treasury bill expires. + * @param int discount The Treasury bill's discount rate. + * @return float + */ + public static function TBILLPRICE($settlement, $maturity, $discount) + { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $discount = PHPExcel_Calculation_Functions::flattenSingleValue($discount); + + if (is_string($maturity = PHPExcel_Calculation_DateTime::getDateValue($maturity))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + // Validate + if (is_numeric($discount)) { + if ($discount <= 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + ++$maturity; + $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity) * 360; + if (!is_numeric($daysBetweenSettlementAndMaturity)) { + // return date error + return $daysBetweenSettlementAndMaturity; + } + } else { + $daysBetweenSettlementAndMaturity = (PHPExcel_Calculation_DateTime::getDateValue($maturity) - PHPExcel_Calculation_DateTime::getDateValue($settlement)); + } + + if ($daysBetweenSettlementAndMaturity > 360) { + return PHPExcel_Calculation_Functions::NaN(); + } + + $price = 100 * (1 - (($discount * $daysBetweenSettlementAndMaturity) / 360)); + if ($price <= 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + return $price; + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * TBILLYIELD + * + * Returns the yield for a Treasury bill. + * + * @param mixed settlement The Treasury bill's settlement date. + * The Treasury bill's settlement date is the date after the issue date when the Treasury bill is traded to the buyer. + * @param mixed maturity The Treasury bill's maturity date. + * The maturity date is the date when the Treasury bill expires. + * @param int price The Treasury bill's price per $100 face value. + * @return float + */ + public static function TBILLYIELD($settlement, $maturity, $price) + { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $price = PHPExcel_Calculation_Functions::flattenSingleValue($price); + + // Validate + if (is_numeric($price)) { + if ($price <= 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + ++$maturity; + $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity) * 360; + if (!is_numeric($daysBetweenSettlementAndMaturity)) { + // return date error + return $daysBetweenSettlementAndMaturity; + } + } else { + $daysBetweenSettlementAndMaturity = (PHPExcel_Calculation_DateTime::getDateValue($maturity) - PHPExcel_Calculation_DateTime::getDateValue($settlement)); + } + + if ($daysBetweenSettlementAndMaturity > 360) { + return PHPExcel_Calculation_Functions::NaN(); + } + + return ((100 - $price) / $price) * (360 / $daysBetweenSettlementAndMaturity); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + public static function XIRR($values, $dates, $guess = 0.1) + { + if ((!is_array($values)) && (!is_array($dates))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $values = PHPExcel_Calculation_Functions::flattenArray($values); + $dates = PHPExcel_Calculation_Functions::flattenArray($dates); + $guess = PHPExcel_Calculation_Functions::flattenSingleValue($guess); + if (count($values) != count($dates)) { + return PHPExcel_Calculation_Functions::NaN(); + } + + // create an initial range, with a root somewhere between 0 and guess + $x1 = 0.0; + $x2 = $guess; + $f1 = self::XNPV($x1, $values, $dates); + $f2 = self::XNPV($x2, $values, $dates); + for ($i = 0; $i < FINANCIAL_MAX_ITERATIONS; ++$i) { + if (($f1 * $f2) < 0.0) { + break; + } elseif (abs($f1) < abs($f2)) { + $f1 = self::XNPV($x1 += 1.6 * ($x1 - $x2), $values, $dates); + } else { + $f2 = self::XNPV($x2 += 1.6 * ($x2 - $x1), $values, $dates); + } + } + if (($f1 * $f2) > 0.0) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + $f = self::XNPV($x1, $values, $dates); + if ($f < 0.0) { + $rtb = $x1; + $dx = $x2 - $x1; + } else { + $rtb = $x2; + $dx = $x1 - $x2; + } + + for ($i = 0; $i < FINANCIAL_MAX_ITERATIONS; ++$i) { + $dx *= 0.5; + $x_mid = $rtb + $dx; + $f_mid = self::XNPV($x_mid, $values, $dates); + if ($f_mid <= 0.0) { + $rtb = $x_mid; + } + if ((abs($f_mid) < FINANCIAL_PRECISION) || (abs($dx) < FINANCIAL_PRECISION)) { + return $x_mid; + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * XNPV + * + * Returns the net present value for a schedule of cash flows that is not necessarily periodic. + * To calculate the net present value for a series of cash flows that is periodic, use the NPV function. + * + * Excel Function: + * =XNPV(rate,values,dates) + * + * @param float $rate The discount rate to apply to the cash flows. + * @param array of float $values A series of cash flows that corresponds to a schedule of payments in dates. + * The first payment is optional and corresponds to a cost or payment that occurs at the beginning of the investment. + * If the first value is a cost or payment, it must be a negative value. All succeeding payments are discounted based on a 365-day year. + * The series of values must contain at least one positive value and one negative value. + * @param array of mixed $dates A schedule of payment dates that corresponds to the cash flow payments. + * The first payment date indicates the beginning of the schedule of payments. + * All other dates must be later than this date, but they may occur in any order. + * @return float + */ + public static function XNPV($rate, $values, $dates) + { + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + if (!is_numeric($rate)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if ((!is_array($values)) || (!is_array($dates))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $values = PHPExcel_Calculation_Functions::flattenArray($values); + $dates = PHPExcel_Calculation_Functions::flattenArray($dates); + $valCount = count($values); + if ($valCount != count($dates)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ((min($values) > 0) || (max($values) < 0)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + $xnpv = 0.0; + for ($i = 0; $i < $valCount; ++$i) { + if (!is_numeric($values[$i])) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $xnpv += $values[$i] / pow(1 + $rate, PHPExcel_Calculation_DateTime::DATEDIF($dates[0], $dates[$i], 'd') / 365); + } + return (is_finite($xnpv)) ? $xnpv : PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * YIELDDISC + * + * Returns the annual yield of a security that pays interest at maturity. + * + * @param mixed settlement The security's settlement date. + * The security's settlement date is the date after the issue date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param int price The security's price per $100 face value. + * @param int redemption The security's redemption value per $100 face value. + * @param int basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function YIELDDISC($settlement, $maturity, $price, $redemption, $basis = 0) + { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $price = PHPExcel_Calculation_Functions::flattenSingleValue($price); + $redemption = PHPExcel_Calculation_Functions::flattenSingleValue($redemption); + $basis = (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + // Validate + if (is_numeric($price) && is_numeric($redemption)) { + if (($price <= 0) || ($redemption <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $daysPerYear = self::daysPerYear(PHPExcel_Calculation_DateTime::YEAR($settlement), $basis); + if (!is_numeric($daysPerYear)) { + return $daysPerYear; + } + $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis); + if (!is_numeric($daysBetweenSettlementAndMaturity)) { + // return date error + return $daysBetweenSettlementAndMaturity; + } + $daysBetweenSettlementAndMaturity *= $daysPerYear; + + return (($redemption - $price) / $price) * ($daysPerYear / $daysBetweenSettlementAndMaturity); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * YIELDMAT + * + * Returns the annual yield of a security that pays interest at maturity. + * + * @param mixed settlement The security's settlement date. + * The security's settlement date is the date after the issue date when the security is traded to the buyer. + * @param mixed maturity The security's maturity date. + * The maturity date is the date when the security expires. + * @param mixed issue The security's issue date. + * @param int rate The security's interest rate at date of issue. + * @param int price The security's price per $100 face value. + * @param int basis The type of day count to use. + * 0 or omitted US (NASD) 30/360 + * 1 Actual/actual + * 2 Actual/360 + * 3 Actual/365 + * 4 European 30/360 + * @return float + */ + public static function YIELDMAT($settlement, $maturity, $issue, $rate, $price, $basis = 0) + { + $settlement = PHPExcel_Calculation_Functions::flattenSingleValue($settlement); + $maturity = PHPExcel_Calculation_Functions::flattenSingleValue($maturity); + $issue = PHPExcel_Calculation_Functions::flattenSingleValue($issue); + $rate = PHPExcel_Calculation_Functions::flattenSingleValue($rate); + $price = PHPExcel_Calculation_Functions::flattenSingleValue($price); + $basis = (int) PHPExcel_Calculation_Functions::flattenSingleValue($basis); + + // Validate + if (is_numeric($rate) && is_numeric($price)) { + if (($rate <= 0) || ($price <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $daysPerYear = self::daysPerYear(PHPExcel_Calculation_DateTime::YEAR($settlement), $basis); + if (!is_numeric($daysPerYear)) { + return $daysPerYear; + } + $daysBetweenIssueAndSettlement = PHPExcel_Calculation_DateTime::YEARFRAC($issue, $settlement, $basis); + if (!is_numeric($daysBetweenIssueAndSettlement)) { + // return date error + return $daysBetweenIssueAndSettlement; + } + $daysBetweenIssueAndSettlement *= $daysPerYear; + $daysBetweenIssueAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($issue, $maturity, $basis); + if (!is_numeric($daysBetweenIssueAndMaturity)) { + // return date error + return $daysBetweenIssueAndMaturity; + } + $daysBetweenIssueAndMaturity *= $daysPerYear; + $daysBetweenSettlementAndMaturity = PHPExcel_Calculation_DateTime::YEARFRAC($settlement, $maturity, $basis); + if (!is_numeric($daysBetweenSettlementAndMaturity)) { + // return date error + return $daysBetweenSettlementAndMaturity; + } + $daysBetweenSettlementAndMaturity *= $daysPerYear; + + return ((1 + (($daysBetweenIssueAndMaturity / $daysPerYear) * $rate) - (($price / 100) + (($daysBetweenIssueAndSettlement / $daysPerYear) * $rate))) / + (($price / 100) + (($daysBetweenIssueAndSettlement / $daysPerYear) * $rate))) * + ($daysPerYear / $daysBetweenSettlementAndMaturity); + } + return PHPExcel_Calculation_Functions::VALUE(); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Calculation/FormulaParser.php b/application/third_party/PHPExcel/PHPExcel/Calculation/FormulaParser.php new file mode 100644 index 0000000..893f19e --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Calculation/FormulaParser.php @@ -0,0 +1,622 @@ +<"; + const OPERATORS_POSTFIX = "%"; + + /** + * Formula + * + * @var string + */ + private $formula; + + /** + * Tokens + * + * @var PHPExcel_Calculation_FormulaToken[] + */ + private $tokens = array(); + + /** + * Create a new PHPExcel_Calculation_FormulaParser + * + * @param string $pFormula Formula to parse + * @throws PHPExcel_Calculation_Exception + */ + public function __construct($pFormula = '') + { + // Check parameters + if (is_null($pFormula)) { + throw new PHPExcel_Calculation_Exception("Invalid parameter passed: formula"); + } + + // Initialise values + $this->formula = trim($pFormula); + // Parse! + $this->parseToTokens(); + } + + /** + * Get Formula + * + * @return string + */ + public function getFormula() + { + return $this->formula; + } + + /** + * Get Token + * + * @param int $pId Token id + * @return string + * @throws PHPExcel_Calculation_Exception + */ + public function getToken($pId = 0) + { + if (isset($this->tokens[$pId])) { + return $this->tokens[$pId]; + } else { + throw new PHPExcel_Calculation_Exception("Token with id $pId does not exist."); + } + } + + /** + * Get Token count + * + * @return string + */ + public function getTokenCount() + { + return count($this->tokens); + } + + /** + * Get Tokens + * + * @return PHPExcel_Calculation_FormulaToken[] + */ + public function getTokens() + { + return $this->tokens; + } + + /** + * Parse to tokens + */ + private function parseToTokens() + { + // No attempt is made to verify formulas; assumes formulas are derived from Excel, where + // they can only exist if valid; stack overflows/underflows sunk as nulls without exceptions. + + // Check if the formula has a valid starting = + $formulaLength = strlen($this->formula); + if ($formulaLength < 2 || $this->formula{0} != '=') { + return; + } + + // Helper variables + $tokens1 = $tokens2 = $stack = array(); + $inString = $inPath = $inRange = $inError = false; + $token = $previousToken = $nextToken = null; + + $index = 1; + $value = ''; + + $ERRORS = array("#NULL!", "#DIV/0!", "#VALUE!", "#REF!", "#NAME?", "#NUM!", "#N/A"); + $COMPARATORS_MULTI = array(">=", "<=", "<>"); + + while ($index < $formulaLength) { + // state-dependent character evaluation (order is important) + + // double-quoted strings + // embeds are doubled + // end marks token + if ($inString) { + if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::QUOTE_DOUBLE) { + if ((($index + 2) <= $formulaLength) && ($this->formula{$index + 1} == PHPExcel_Calculation_FormulaParser::QUOTE_DOUBLE)) { + $value .= PHPExcel_Calculation_FormulaParser::QUOTE_DOUBLE; + ++$index; + } else { + $inString = false; + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_TEXT); + $value = ""; + } + } else { + $value .= $this->formula{$index}; + } + ++$index; + continue; + } + + // single-quoted strings (links) + // embeds are double + // end does not mark a token + if ($inPath) { + if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::QUOTE_SINGLE) { + if ((($index + 2) <= $formulaLength) && ($this->formula{$index + 1} == PHPExcel_Calculation_FormulaParser::QUOTE_SINGLE)) { + $value .= PHPExcel_Calculation_FormulaParser::QUOTE_SINGLE; + ++$index; + } else { + $inPath = false; + } + } else { + $value .= $this->formula{$index}; + } + ++$index; + continue; + } + + // bracked strings (R1C1 range index or linked workbook name) + // no embeds (changed to "()" by Excel) + // end does not mark a token + if ($inRange) { + if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::BRACKET_CLOSE) { + $inRange = false; + } + $value .= $this->formula{$index}; + ++$index; + continue; + } + + // error values + // end marks a token, determined from absolute list of values + if ($inError) { + $value .= $this->formula{$index}; + ++$index; + if (in_array($value, $ERRORS)) { + $inError = false; + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_ERROR); + $value = ""; + } + continue; + } + + // scientific notation check + if (strpos(PHPExcel_Calculation_FormulaParser::OPERATORS_SN, $this->formula{$index}) !== false) { + if (strlen($value) > 1) { + if (preg_match("/^[1-9]{1}(\.[0-9]+)?E{1}$/", $this->formula{$index}) != 0) { + $value .= $this->formula{$index}; + ++$index; + continue; + } + } + } + + // independent character evaluation (order not important) + + // establish state-dependent character evaluations + if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::QUOTE_DOUBLE) { + if (strlen($value > 0)) { + // unexpected + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_UNKNOWN); + $value = ""; + } + $inString = true; + ++$index; + continue; + } + + if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::QUOTE_SINGLE) { + if (strlen($value) > 0) { + // unexpected + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_UNKNOWN); + $value = ""; + } + $inPath = true; + ++$index; + continue; + } + + if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::BRACKET_OPEN) { + $inRange = true; + $value .= PHPExcel_Calculation_FormulaParser::BRACKET_OPEN; + ++$index; + continue; + } + + if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::ERROR_START) { + if (strlen($value) > 0) { + // unexpected + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_UNKNOWN); + $value = ""; + } + $inError = true; + $value .= PHPExcel_Calculation_FormulaParser::ERROR_START; + ++$index; + continue; + } + + // mark start and end of arrays and array rows + if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::BRACE_OPEN) { + if (strlen($value) > 0) { + // unexpected + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_UNKNOWN); + $value = ""; + } + + $tmp = new PHPExcel_Calculation_FormulaToken("ARRAY", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START); + $tokens1[] = $tmp; + $stack[] = clone $tmp; + + $tmp = new PHPExcel_Calculation_FormulaToken("ARRAYROW", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START); + $tokens1[] = $tmp; + $stack[] = clone $tmp; + + ++$index; + continue; + } + + if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::SEMICOLON) { + if (strlen($value) > 0) { + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND); + $value = ""; + } + + $tmp = array_pop($stack); + $tmp->setValue(""); + $tmp->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP); + $tokens1[] = $tmp; + + $tmp = new PHPExcel_Calculation_FormulaToken(",", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_ARGUMENT); + $tokens1[] = $tmp; + + $tmp = new PHPExcel_Calculation_FormulaToken("ARRAYROW", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START); + $tokens1[] = $tmp; + $stack[] = clone $tmp; + + ++$index; + continue; + } + + if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::BRACE_CLOSE) { + if (strlen($value) > 0) { + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND); + $value = ""; + } + + $tmp = array_pop($stack); + $tmp->setValue(""); + $tmp->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP); + $tokens1[] = $tmp; + + $tmp = array_pop($stack); + $tmp->setValue(""); + $tmp->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP); + $tokens1[] = $tmp; + + ++$index; + continue; + } + + // trim white-space + if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::WHITESPACE) { + if (strlen($value) > 0) { + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND); + $value = ""; + } + $tokens1[] = new PHPExcel_Calculation_FormulaToken("", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_WHITESPACE); + ++$index; + while (($this->formula{$index} == PHPExcel_Calculation_FormulaParser::WHITESPACE) && ($index < $formulaLength)) { + ++$index; + } + continue; + } + + // multi-character comparators + if (($index + 2) <= $formulaLength) { + if (in_array(substr($this->formula, $index, 2), $COMPARATORS_MULTI)) { + if (strlen($value) > 0) { + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND); + $value = ""; + } + $tokens1[] = new PHPExcel_Calculation_FormulaToken(substr($this->formula, $index, 2), PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_LOGICAL); + $index += 2; + continue; + } + } + + // standard infix operators + if (strpos(PHPExcel_Calculation_FormulaParser::OPERATORS_INFIX, $this->formula{$index}) !== false) { + if (strlen($value) > 0) { + $tokens1[] =new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND); + $value = ""; + } + $tokens1[] = new PHPExcel_Calculation_FormulaToken($this->formula{$index}, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX); + ++$index; + continue; + } + + // standard postfix operators (only one) + if (strpos(PHPExcel_Calculation_FormulaParser::OPERATORS_POSTFIX, $this->formula{$index}) !== false) { + if (strlen($value) > 0) { + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND); + $value = ""; + } + $tokens1[] = new PHPExcel_Calculation_FormulaToken($this->formula{$index}, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORPOSTFIX); + ++$index; + continue; + } + + // start subexpression or function + if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::PAREN_OPEN) { + if (strlen($value) > 0) { + $tmp = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START); + $tokens1[] = $tmp; + $stack[] = clone $tmp; + $value = ""; + } else { + $tmp = new PHPExcel_Calculation_FormulaToken("", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_SUBEXPRESSION, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START); + $tokens1[] = $tmp; + $stack[] = clone $tmp; + } + ++$index; + continue; + } + + // function, subexpression, or array parameters, or operand unions + if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::COMMA) { + if (strlen($value) > 0) { + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND); + $value = ""; + } + + $tmp = array_pop($stack); + $tmp->setValue(""); + $tmp->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP); + $stack[] = $tmp; + + if ($tmp->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) { + $tokens1[] = new PHPExcel_Calculation_FormulaToken(",", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_UNION); + } else { + $tokens1[] = new PHPExcel_Calculation_FormulaToken(",", PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_ARGUMENT); + } + ++$index; + continue; + } + + // stop subexpression + if ($this->formula{$index} == PHPExcel_Calculation_FormulaParser::PAREN_CLOSE) { + if (strlen($value) > 0) { + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND); + $value = ""; + } + + $tmp = array_pop($stack); + $tmp->setValue(""); + $tmp->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP); + $tokens1[] = $tmp; + + ++$index; + continue; + } + + // token accumulation + $value .= $this->formula{$index}; + ++$index; + } + + // dump remaining accumulation + if (strlen($value) > 0) { + $tokens1[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND); + } + + // move tokenList to new set, excluding unnecessary white-space tokens and converting necessary ones to intersections + $tokenCount = count($tokens1); + for ($i = 0; $i < $tokenCount; ++$i) { + $token = $tokens1[$i]; + if (isset($tokens1[$i - 1])) { + $previousToken = $tokens1[$i - 1]; + } else { + $previousToken = null; + } + if (isset($tokens1[$i + 1])) { + $nextToken = $tokens1[$i + 1]; + } else { + $nextToken = null; + } + + if (is_null($token)) { + continue; + } + + if ($token->getTokenType() != PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_WHITESPACE) { + $tokens2[] = $token; + continue; + } + + if (is_null($previousToken)) { + continue; + } + + if (! ( + (($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) && ($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) || + (($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_SUBEXPRESSION) && ($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) || + ($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND) + ) ) { + continue; + } + + if (is_null($nextToken)) { + continue; + } + + if (! ( + (($nextToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) && ($nextToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START)) || + (($nextToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_SUBEXPRESSION) && ($nextToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_START)) || + ($nextToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND) + ) ) { + continue; + } + + $tokens2[] = new PHPExcel_Calculation_FormulaToken($value, PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX, PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_INTERSECTION); + } + + // move tokens to final list, switching infix "-" operators to prefix when appropriate, switching infix "+" operators + // to noop when appropriate, identifying operand and infix-operator subtypes, and pulling "@" from function names + $this->tokens = array(); + + $tokenCount = count($tokens2); + for ($i = 0; $i < $tokenCount; ++$i) { + $token = $tokens2[$i]; + if (isset($tokens2[$i - 1])) { + $previousToken = $tokens2[$i - 1]; + } else { + $previousToken = null; + } + if (isset($tokens2[$i + 1])) { + $nextToken = $tokens2[$i + 1]; + } else { + $nextToken = null; + } + + if (is_null($token)) { + continue; + } + + if ($token->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX && $token->getValue() == "-") { + if ($i == 0) { + $token->setTokenType(PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORPREFIX); + } elseif ((($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) && + ($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) || + (($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_SUBEXPRESSION) && + ($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) || + ($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORPOSTFIX) || + ($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND)) { + $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_MATH); + } else { + $token->setTokenType(PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORPREFIX); + } + + $this->tokens[] = $token; + continue; + } + + if ($token->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX && $token->getValue() == "+") { + if ($i == 0) { + continue; + } elseif ((($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) && + ($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) || + (($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_SUBEXPRESSION) && + ($previousToken->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_STOP)) || + ($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORPOSTFIX) || + ($previousToken->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND)) { + $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_MATH); + } else { + continue; + } + + $this->tokens[] = $token; + continue; + } + + if ($token->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERATORINFIX && + $token->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_NOTHING) { + if (strpos("<>=", substr($token->getValue(), 0, 1)) !== false) { + $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_LOGICAL); + } elseif ($token->getValue() == "&") { + $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_CONCATENATION); + } else { + $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_MATH); + } + + $this->tokens[] = $token; + continue; + } + + if ($token->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_OPERAND && + $token->getTokenSubType() == PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_NOTHING) { + if (!is_numeric($token->getValue())) { + if (strtoupper($token->getValue()) == "TRUE" || strtoupper($token->getValue() == "FALSE")) { + $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_LOGICAL); + } else { + $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_RANGE); + } + } else { + $token->setTokenSubType(PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_NUMBER); + } + + $this->tokens[] = $token; + continue; + } + + if ($token->getTokenType() == PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_FUNCTION) { + if (strlen($token->getValue() > 0)) { + if (substr($token->getValue(), 0, 1) == "@") { + $token->setValue(substr($token->getValue(), 1)); + } + } + } + + $this->tokens[] = $token; + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Calculation/FormulaToken.php b/application/third_party/PHPExcel/PHPExcel/Calculation/FormulaToken.php new file mode 100644 index 0000000..41c6e3d --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Calculation/FormulaToken.php @@ -0,0 +1,176 @@ +value = $pValue; + $this->tokenType = $pTokenType; + $this->tokenSubType = $pTokenSubType; + } + + /** + * Get Value + * + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * Set Value + * + * @param string $value + */ + public function setValue($value) + { + $this->value = $value; + } + + /** + * Get Token Type (represented by TOKEN_TYPE_*) + * + * @return string + */ + public function getTokenType() + { + return $this->tokenType; + } + + /** + * Set Token Type + * + * @param string $value + */ + public function setTokenType($value = PHPExcel_Calculation_FormulaToken::TOKEN_TYPE_UNKNOWN) + { + $this->tokenType = $value; + } + + /** + * Get Token SubType (represented by TOKEN_SUBTYPE_*) + * + * @return string + */ + public function getTokenSubType() + { + return $this->tokenSubType; + } + + /** + * Set Token SubType + * + * @param string $value + */ + public function setTokenSubType($value = PHPExcel_Calculation_FormulaToken::TOKEN_SUBTYPE_NOTHING) + { + $this->tokenSubType = $value; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Calculation/Function.php b/application/third_party/PHPExcel/PHPExcel/Calculation/Function.php new file mode 100644 index 0000000..d58cef2 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Calculation/Function.php @@ -0,0 +1,148 @@ +category = $pCategory; + $this->excelName = $pExcelName; + $this->phpExcelName = $pPHPExcelName; + } else { + throw new PHPExcel_Calculation_Exception("Invalid parameters passed."); + } + } + + /** + * Get Category (represented by CATEGORY_*) + * + * @return string + */ + public function getCategory() + { + return $this->category; + } + + /** + * Set Category (represented by CATEGORY_*) + * + * @param string $value + * @throws PHPExcel_Calculation_Exception + */ + public function setCategory($value = null) + { + if (!is_null($value)) { + $this->category = $value; + } else { + throw new PHPExcel_Calculation_Exception("Invalid parameter passed."); + } + } + + /** + * Get Excel name + * + * @return string + */ + public function getExcelName() + { + return $this->excelName; + } + + /** + * Set Excel name + * + * @param string $value + */ + public function setExcelName($value) + { + $this->excelName = $value; + } + + /** + * Get PHPExcel name + * + * @return string + */ + public function getPHPExcelName() + { + return $this->phpExcelName; + } + + /** + * Set PHPExcel name + * + * @param string $value + */ + public function setPHPExcelName($value) + { + $this->phpExcelName = $value; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Calculation/Functions.php b/application/third_party/PHPExcel/PHPExcel/Calculation/Functions.php new file mode 100644 index 0000000..5a1e5ee --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Calculation/Functions.php @@ -0,0 +1,760 @@ + '#NULL!', + 'divisionbyzero' => '#DIV/0!', + 'value' => '#VALUE!', + 'reference' => '#REF!', + 'name' => '#NAME?', + 'num' => '#NUM!', + 'na' => '#N/A', + 'gettingdata' => '#GETTING_DATA' + ); + + + /** + * Set the Compatibility Mode + * + * @access public + * @category Function Configuration + * @param string $compatibilityMode Compatibility Mode + * Permitted values are: + * PHPExcel_Calculation_Functions::COMPATIBILITY_EXCEL 'Excel' + * PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC 'Gnumeric' + * PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE 'OpenOfficeCalc' + * @return boolean (Success or Failure) + */ + public static function setCompatibilityMode($compatibilityMode) + { + if (($compatibilityMode == self::COMPATIBILITY_EXCEL) || + ($compatibilityMode == self::COMPATIBILITY_GNUMERIC) || + ($compatibilityMode == self::COMPATIBILITY_OPENOFFICE)) { + self::$compatibilityMode = $compatibilityMode; + return true; + } + return false; + } + + + /** + * Return the current Compatibility Mode + * + * @access public + * @category Function Configuration + * @return string Compatibility Mode + * Possible Return values are: + * PHPExcel_Calculation_Functions::COMPATIBILITY_EXCEL 'Excel' + * PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC 'Gnumeric' + * PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE 'OpenOfficeCalc' + */ + public static function getCompatibilityMode() + { + return self::$compatibilityMode; + } + + + /** + * Set the Return Date Format used by functions that return a date/time (Excel, PHP Serialized Numeric or PHP Object) + * + * @access public + * @category Function Configuration + * @param string $returnDateType Return Date Format + * Permitted values are: + * PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC 'P' + * PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT 'O' + * PHPExcel_Calculation_Functions::RETURNDATE_EXCEL 'E' + * @return boolean Success or failure + */ + public static function setReturnDateType($returnDateType) + { + if (($returnDateType == self::RETURNDATE_PHP_NUMERIC) || + ($returnDateType == self::RETURNDATE_PHP_OBJECT) || + ($returnDateType == self::RETURNDATE_EXCEL)) { + self::$returnDateType = $returnDateType; + return true; + } + return false; + } + + + /** + * Return the current Return Date Format for functions that return a date/time (Excel, PHP Serialized Numeric or PHP Object) + * + * @access public + * @category Function Configuration + * @return string Return Date Format + * Possible Return values are: + * PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC 'P' + * PHPExcel_Calculation_Functions::RETURNDATE_PHP_OBJECT 'O' + * PHPExcel_Calculation_Functions::RETURNDATE_EXCEL 'E' + */ + public static function getReturnDateType() + { + return self::$returnDateType; + } + + + /** + * DUMMY + * + * @access public + * @category Error Returns + * @return string #Not Yet Implemented + */ + public static function DUMMY() + { + return '#Not Yet Implemented'; + } + + + /** + * DIV0 + * + * @access public + * @category Error Returns + * @return string #Not Yet Implemented + */ + public static function DIV0() + { + return self::$errorCodes['divisionbyzero']; + } + + + /** + * NA + * + * Excel Function: + * =NA() + * + * Returns the error value #N/A + * #N/A is the error value that means "no value is available." + * + * @access public + * @category Logical Functions + * @return string #N/A! + */ + public static function NA() + { + return self::$errorCodes['na']; + } + + + /** + * NaN + * + * Returns the error value #NUM! + * + * @access public + * @category Error Returns + * @return string #NUM! + */ + public static function NaN() + { + return self::$errorCodes['num']; + } + + + /** + * NAME + * + * Returns the error value #NAME? + * + * @access public + * @category Error Returns + * @return string #NAME? + */ + public static function NAME() + { + return self::$errorCodes['name']; + } + + + /** + * REF + * + * Returns the error value #REF! + * + * @access public + * @category Error Returns + * @return string #REF! + */ + public static function REF() + { + return self::$errorCodes['reference']; + } + + + /** + * NULL + * + * Returns the error value #NULL! + * + * @access public + * @category Error Returns + * @return string #NULL! + */ + public static function NULL() + { + return self::$errorCodes['null']; + } + + + /** + * VALUE + * + * Returns the error value #VALUE! + * + * @access public + * @category Error Returns + * @return string #VALUE! + */ + public static function VALUE() + { + return self::$errorCodes['value']; + } + + + public static function isMatrixValue($idx) + { + return ((substr_count($idx, '.') <= 1) || (preg_match('/\.[A-Z]/', $idx) > 0)); + } + + + public static function isValue($idx) + { + return (substr_count($idx, '.') == 0); + } + + + public static function isCellValue($idx) + { + return (substr_count($idx, '.') > 1); + } + + + public static function ifCondition($condition) + { + $condition = PHPExcel_Calculation_Functions::flattenSingleValue($condition); + if (!isset($condition{0})) { + $condition = '=""'; + } + if (!in_array($condition{0}, array('>', '<', '='))) { + if (!is_numeric($condition)) { + $condition = PHPExcel_Calculation::wrapResult(strtoupper($condition)); + } + return '=' . $condition; + } else { + preg_match('/([<>=]+)(.*)/', $condition, $matches); + list(, $operator, $operand) = $matches; + + if (!is_numeric($operand)) { + $operand = str_replace('"', '""', $operand); + $operand = PHPExcel_Calculation::wrapResult(strtoupper($operand)); + } + + return $operator.$operand; + } + } + + /** + * ERROR_TYPE + * + * @param mixed $value Value to check + * @return boolean + */ + public static function ERROR_TYPE($value = '') + { + $value = self::flattenSingleValue($value); + + $i = 1; + foreach (self::$errorCodes as $errorCode) { + if ($value === $errorCode) { + return $i; + } + ++$i; + } + return self::NA(); + } + + + /** + * IS_BLANK + * + * @param mixed $value Value to check + * @return boolean + */ + public static function IS_BLANK($value = null) + { + if (!is_null($value)) { + $value = self::flattenSingleValue($value); + } + + return is_null($value); + } + + + /** + * IS_ERR + * + * @param mixed $value Value to check + * @return boolean + */ + public static function IS_ERR($value = '') + { + $value = self::flattenSingleValue($value); + + return self::IS_ERROR($value) && (!self::IS_NA($value)); + } + + + /** + * IS_ERROR + * + * @param mixed $value Value to check + * @return boolean + */ + public static function IS_ERROR($value = '') + { + $value = self::flattenSingleValue($value); + + if (!is_string($value)) { + return false; + } + return in_array($value, array_values(self::$errorCodes)); + } + + + /** + * IS_NA + * + * @param mixed $value Value to check + * @return boolean + */ + public static function IS_NA($value = '') + { + $value = self::flattenSingleValue($value); + + return ($value === self::NA()); + } + + + /** + * IS_EVEN + * + * @param mixed $value Value to check + * @return boolean + */ + public static function IS_EVEN($value = null) + { + $value = self::flattenSingleValue($value); + + if ($value === null) { + return self::NAME(); + } elseif ((is_bool($value)) || ((is_string($value)) && (!is_numeric($value)))) { + return self::VALUE(); + } + + return ($value % 2 == 0); + } + + + /** + * IS_ODD + * + * @param mixed $value Value to check + * @return boolean + */ + public static function IS_ODD($value = null) + { + $value = self::flattenSingleValue($value); + + if ($value === null) { + return self::NAME(); + } elseif ((is_bool($value)) || ((is_string($value)) && (!is_numeric($value)))) { + return self::VALUE(); + } + + return (abs($value) % 2 == 1); + } + + + /** + * IS_NUMBER + * + * @param mixed $value Value to check + * @return boolean + */ + public static function IS_NUMBER($value = null) + { + $value = self::flattenSingleValue($value); + + if (is_string($value)) { + return false; + } + return is_numeric($value); + } + + + /** + * IS_LOGICAL + * + * @param mixed $value Value to check + * @return boolean + */ + public static function IS_LOGICAL($value = null) + { + $value = self::flattenSingleValue($value); + + return is_bool($value); + } + + + /** + * IS_TEXT + * + * @param mixed $value Value to check + * @return boolean + */ + public static function IS_TEXT($value = null) + { + $value = self::flattenSingleValue($value); + + return (is_string($value) && !self::IS_ERROR($value)); + } + + + /** + * IS_NONTEXT + * + * @param mixed $value Value to check + * @return boolean + */ + public static function IS_NONTEXT($value = null) + { + return !self::IS_TEXT($value); + } + + + /** + * VERSION + * + * @return string Version information + */ + public static function VERSION() + { + return 'PHPExcel ##VERSION##, ##DATE##'; + } + + + /** + * N + * + * Returns a value converted to a number + * + * @param value The value you want converted + * @return number N converts values listed in the following table + * If value is or refers to N returns + * A number That number + * A date The serial number of that date + * TRUE 1 + * FALSE 0 + * An error value The error value + * Anything else 0 + */ + public static function N($value = null) + { + while (is_array($value)) { + $value = array_shift($value); + } + + switch (gettype($value)) { + case 'double': + case 'float': + case 'integer': + return $value; + case 'boolean': + return (integer) $value; + case 'string': + // Errors + if ((strlen($value) > 0) && ($value{0} == '#')) { + return $value; + } + break; + } + return 0; + } + + + /** + * TYPE + * + * Returns a number that identifies the type of a value + * + * @param value The value you want tested + * @return number N converts values listed in the following table + * If value is or refers to N returns + * A number 1 + * Text 2 + * Logical Value 4 + * An error value 16 + * Array or Matrix 64 + */ + public static function TYPE($value = null) + { + $value = self::flattenArrayIndexed($value); + if (is_array($value) && (count($value) > 1)) { + end($value); + $a = key($value); + // Range of cells is an error + if (self::isCellValue($a)) { + return 16; + // Test for Matrix + } elseif (self::isMatrixValue($a)) { + return 64; + } + } elseif (empty($value)) { + // Empty Cell + return 1; + } + $value = self::flattenSingleValue($value); + + if (($value === null) || (is_float($value)) || (is_int($value))) { + return 1; + } elseif (is_bool($value)) { + return 4; + } elseif (is_array($value)) { + return 64; + } elseif (is_string($value)) { + // Errors + if ((strlen($value) > 0) && ($value{0} == '#')) { + return 16; + } + return 2; + } + return 0; + } + + + /** + * Convert a multi-dimensional array to a simple 1-dimensional array + * + * @param array $array Array to be flattened + * @return array Flattened array + */ + public static function flattenArray($array) + { + if (!is_array($array)) { + return (array) $array; + } + + $arrayValues = array(); + foreach ($array as $value) { + if (is_array($value)) { + foreach ($value as $val) { + if (is_array($val)) { + foreach ($val as $v) { + $arrayValues[] = $v; + } + } else { + $arrayValues[] = $val; + } + } + } else { + $arrayValues[] = $value; + } + } + + return $arrayValues; + } + + + /** + * Convert a multi-dimensional array to a simple 1-dimensional array, but retain an element of indexing + * + * @param array $array Array to be flattened + * @return array Flattened array + */ + public static function flattenArrayIndexed($array) + { + if (!is_array($array)) { + return (array) $array; + } + + $arrayValues = array(); + foreach ($array as $k1 => $value) { + if (is_array($value)) { + foreach ($value as $k2 => $val) { + if (is_array($val)) { + foreach ($val as $k3 => $v) { + $arrayValues[$k1.'.'.$k2.'.'.$k3] = $v; + } + } else { + $arrayValues[$k1.'.'.$k2] = $val; + } + } + } else { + $arrayValues[$k1] = $value; + } + } + + return $arrayValues; + } + + + /** + * Convert an array to a single scalar value by extracting the first element + * + * @param mixed $value Array or scalar value + * @return mixed + */ + public static function flattenSingleValue($value = '') + { + while (is_array($value)) { + $value = array_pop($value); + } + + return $value; + } +} + + +// +// There are a few mathematical functions that aren't available on all versions of PHP for all platforms +// These functions aren't available in Windows implementations of PHP prior to version 5.3.0 +// So we test if they do exist for this version of PHP/operating platform; and if not we create them +// +if (!function_exists('acosh')) { + function acosh($x) + { + return 2 * log(sqrt(($x + 1) / 2) + sqrt(($x - 1) / 2)); + } // function acosh() +} + +if (!function_exists('asinh')) { + function asinh($x) + { + return log($x + sqrt(1 + $x * $x)); + } // function asinh() +} + +if (!function_exists('atanh')) { + function atanh($x) + { + return (log(1 + $x) - log(1 - $x)) / 2; + } // function atanh() +} + + +// +// Strangely, PHP doesn't have a mb_str_replace multibyte function +// As we'll only ever use this function with UTF-8 characters, we can simply "hard-code" the character set +// +if ((!function_exists('mb_str_replace')) && + (function_exists('mb_substr')) && (function_exists('mb_strlen')) && (function_exists('mb_strpos'))) { + function mb_str_replace($search, $replace, $subject) + { + if (is_array($subject)) { + $ret = array(); + foreach ($subject as $key => $val) { + $ret[$key] = mb_str_replace($search, $replace, $val); + } + return $ret; + } + + foreach ((array) $search as $key => $s) { + if ($s == '' && $s !== 0) { + continue; + } + $r = !is_array($replace) ? $replace : (array_key_exists($key, $replace) ? $replace[$key] : ''); + $pos = mb_strpos($subject, $s, 0, 'UTF-8'); + while ($pos !== false) { + $subject = mb_substr($subject, 0, $pos, 'UTF-8') . $r . mb_substr($subject, $pos + mb_strlen($s, 'UTF-8'), 65535, 'UTF-8'); + $pos = mb_strpos($subject, $s, $pos + mb_strlen($r, 'UTF-8'), 'UTF-8'); + } + } + return $subject; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Calculation/Logical.php b/application/third_party/PHPExcel/PHPExcel/Calculation/Logical.php new file mode 100644 index 0000000..dd65f01 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Calculation/Logical.php @@ -0,0 +1,285 @@ + $arg) { + // Is it a boolean value? + if (is_bool($arg)) { + $returnValue = $returnValue && $arg; + } elseif ((is_numeric($arg)) && (!is_string($arg))) { + $returnValue = $returnValue && ($arg != 0); + } elseif (is_string($arg)) { + $arg = strtoupper($arg); + if (($arg == 'TRUE') || ($arg == PHPExcel_Calculation::getTRUE())) { + $arg = true; + } elseif (($arg == 'FALSE') || ($arg == PHPExcel_Calculation::getFALSE())) { + $arg = false; + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + $returnValue = $returnValue && ($arg != 0); + } + } + + // Return + if ($argCount < 0) { + return PHPExcel_Calculation_Functions::VALUE(); + } + return $returnValue; + } + + + /** + * LOGICAL_OR + * + * Returns boolean TRUE if any argument is TRUE; returns FALSE if all arguments are FALSE. + * + * Excel Function: + * =OR(logical1[,logical2[, ...]]) + * + * The arguments must evaluate to logical values such as TRUE or FALSE, or the arguments must be arrays + * or references that contain logical values. + * + * Boolean arguments are treated as True or False as appropriate + * Integer or floating point arguments are treated as True, except for 0 or 0.0 which are False + * If any argument value is a string, or a Null, the function returns a #VALUE! error, unless the string holds + * the value TRUE or FALSE, in which case it is evaluated as the corresponding boolean value + * + * @access public + * @category Logical Functions + * @param mixed $arg,... Data values + * @return boolean The logical OR of the arguments. + */ + public static function LOGICAL_OR() + { + // Return value + $returnValue = false; + + // Loop through the arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + $argCount = -1; + foreach ($aArgs as $argCount => $arg) { + // Is it a boolean value? + if (is_bool($arg)) { + $returnValue = $returnValue || $arg; + } elseif ((is_numeric($arg)) && (!is_string($arg))) { + $returnValue = $returnValue || ($arg != 0); + } elseif (is_string($arg)) { + $arg = strtoupper($arg); + if (($arg == 'TRUE') || ($arg == PHPExcel_Calculation::getTRUE())) { + $arg = true; + } elseif (($arg == 'FALSE') || ($arg == PHPExcel_Calculation::getFALSE())) { + $arg = false; + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + $returnValue = $returnValue || ($arg != 0); + } + } + + // Return + if ($argCount < 0) { + return PHPExcel_Calculation_Functions::VALUE(); + } + return $returnValue; + } + + + /** + * NOT + * + * Returns the boolean inverse of the argument. + * + * Excel Function: + * =NOT(logical) + * + * The argument must evaluate to a logical value such as TRUE or FALSE + * + * Boolean arguments are treated as True or False as appropriate + * Integer or floating point arguments are treated as True, except for 0 or 0.0 which are False + * If any argument value is a string, or a Null, the function returns a #VALUE! error, unless the string holds + * the value TRUE or FALSE, in which case it is evaluated as the corresponding boolean value + * + * @access public + * @category Logical Functions + * @param mixed $logical A value or expression that can be evaluated to TRUE or FALSE + * @return boolean The boolean inverse of the argument. + */ + public static function NOT($logical = false) + { + $logical = PHPExcel_Calculation_Functions::flattenSingleValue($logical); + if (is_string($logical)) { + $logical = strtoupper($logical); + if (($logical == 'TRUE') || ($logical == PHPExcel_Calculation::getTRUE())) { + return false; + } elseif (($logical == 'FALSE') || ($logical == PHPExcel_Calculation::getFALSE())) { + return true; + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + + return !$logical; + } + + /** + * STATEMENT_IF + * + * Returns one value if a condition you specify evaluates to TRUE and another value if it evaluates to FALSE. + * + * Excel Function: + * =IF(condition[,returnIfTrue[,returnIfFalse]]) + * + * Condition is any value or expression that can be evaluated to TRUE or FALSE. + * For example, A10=100 is a logical expression; if the value in cell A10 is equal to 100, + * the expression evaluates to TRUE. Otherwise, the expression evaluates to FALSE. + * This argument can use any comparison calculation operator. + * ReturnIfTrue is the value that is returned if condition evaluates to TRUE. + * For example, if this argument is the text string "Within budget" and the condition argument evaluates to TRUE, + * then the IF function returns the text "Within budget" + * If condition is TRUE and ReturnIfTrue is blank, this argument returns 0 (zero). To display the word TRUE, use + * the logical value TRUE for this argument. + * ReturnIfTrue can be another formula. + * ReturnIfFalse is the value that is returned if condition evaluates to FALSE. + * For example, if this argument is the text string "Over budget" and the condition argument evaluates to FALSE, + * then the IF function returns the text "Over budget". + * If condition is FALSE and ReturnIfFalse is omitted, then the logical value FALSE is returned. + * If condition is FALSE and ReturnIfFalse is blank, then the value 0 (zero) is returned. + * ReturnIfFalse can be another formula. + * + * @access public + * @category Logical Functions + * @param mixed $condition Condition to evaluate + * @param mixed $returnIfTrue Value to return when condition is true + * @param mixed $returnIfFalse Optional value to return when condition is false + * @return mixed The value of returnIfTrue or returnIfFalse determined by condition + */ + public static function STATEMENT_IF($condition = true, $returnIfTrue = 0, $returnIfFalse = false) + { + $condition = (is_null($condition)) ? true : (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($condition); + $returnIfTrue = (is_null($returnIfTrue)) ? 0 : PHPExcel_Calculation_Functions::flattenSingleValue($returnIfTrue); + $returnIfFalse = (is_null($returnIfFalse)) ? false : PHPExcel_Calculation_Functions::flattenSingleValue($returnIfFalse); + + return ($condition) ? $returnIfTrue : $returnIfFalse; + } + + + /** + * IFERROR + * + * Excel Function: + * =IFERROR(testValue,errorpart) + * + * @access public + * @category Logical Functions + * @param mixed $testValue Value to check, is also the value returned when no error + * @param mixed $errorpart Value to return when testValue is an error condition + * @return mixed The value of errorpart or testValue determined by error condition + */ + public static function IFERROR($testValue = '', $errorpart = '') + { + $testValue = (is_null($testValue)) ? '' : PHPExcel_Calculation_Functions::flattenSingleValue($testValue); + $errorpart = (is_null($errorpart)) ? '' : PHPExcel_Calculation_Functions::flattenSingleValue($errorpart); + + return self::STATEMENT_IF(PHPExcel_Calculation_Functions::IS_ERROR($testValue), $errorpart, $testValue); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Calculation/LookupRef.php b/application/third_party/PHPExcel/PHPExcel/Calculation/LookupRef.php new file mode 100644 index 0000000..1fe7790 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Calculation/LookupRef.php @@ -0,0 +1,879 @@ + '') { + if (strpos($sheetText, ' ') !== false) { + $sheetText = "'".$sheetText."'"; + } + $sheetText .='!'; + } + if ((!is_bool($referenceStyle)) || $referenceStyle) { + $rowRelative = $columnRelative = '$'; + $column = PHPExcel_Cell::stringFromColumnIndex($column-1); + if (($relativity == 2) || ($relativity == 4)) { + $columnRelative = ''; + } + if (($relativity == 3) || ($relativity == 4)) { + $rowRelative = ''; + } + return $sheetText.$columnRelative.$column.$rowRelative.$row; + } else { + if (($relativity == 2) || ($relativity == 4)) { + $column = '['.$column.']'; + } + if (($relativity == 3) || ($relativity == 4)) { + $row = '['.$row.']'; + } + return $sheetText.'R'.$row.'C'.$column; + } + } + + + /** + * COLUMN + * + * Returns the column number of the given cell reference + * If the cell reference is a range of cells, COLUMN returns the column numbers of each column in the reference as a horizontal array. + * If cell reference is omitted, and the function is being called through the calculation engine, then it is assumed to be the + * reference of the cell in which the COLUMN function appears; otherwise this function returns 0. + * + * Excel Function: + * =COLUMN([cellAddress]) + * + * @param cellAddress A reference to a range of cells for which you want the column numbers + * @return integer or array of integer + */ + public static function COLUMN($cellAddress = null) + { + if (is_null($cellAddress) || trim($cellAddress) === '') { + return 0; + } + + if (is_array($cellAddress)) { + foreach ($cellAddress as $columnKey => $value) { + $columnKey = preg_replace('/[^a-z]/i', '', $columnKey); + return (integer) PHPExcel_Cell::columnIndexFromString($columnKey); + } + } else { + if (strpos($cellAddress, '!') !== false) { + list($sheet, $cellAddress) = explode('!', $cellAddress); + } + if (strpos($cellAddress, ':') !== false) { + list($startAddress, $endAddress) = explode(':', $cellAddress); + $startAddress = preg_replace('/[^a-z]/i', '', $startAddress); + $endAddress = preg_replace('/[^a-z]/i', '', $endAddress); + $returnValue = array(); + do { + $returnValue[] = (integer) PHPExcel_Cell::columnIndexFromString($startAddress); + } while ($startAddress++ != $endAddress); + return $returnValue; + } else { + $cellAddress = preg_replace('/[^a-z]/i', '', $cellAddress); + return (integer) PHPExcel_Cell::columnIndexFromString($cellAddress); + } + } + } + + + /** + * COLUMNS + * + * Returns the number of columns in an array or reference. + * + * Excel Function: + * =COLUMNS(cellAddress) + * + * @param cellAddress An array or array formula, or a reference to a range of cells for which you want the number of columns + * @return integer The number of columns in cellAddress + */ + public static function COLUMNS($cellAddress = null) + { + if (is_null($cellAddress) || $cellAddress === '') { + return 1; + } elseif (!is_array($cellAddress)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + reset($cellAddress); + $isMatrix = (is_numeric(key($cellAddress))); + list($columns, $rows) = PHPExcel_Calculation::_getMatrixDimensions($cellAddress); + + if ($isMatrix) { + return $rows; + } else { + return $columns; + } + } + + + /** + * ROW + * + * Returns the row number of the given cell reference + * If the cell reference is a range of cells, ROW returns the row numbers of each row in the reference as a vertical array. + * If cell reference is omitted, and the function is being called through the calculation engine, then it is assumed to be the + * reference of the cell in which the ROW function appears; otherwise this function returns 0. + * + * Excel Function: + * =ROW([cellAddress]) + * + * @param cellAddress A reference to a range of cells for which you want the row numbers + * @return integer or array of integer + */ + public static function ROW($cellAddress = null) + { + if (is_null($cellAddress) || trim($cellAddress) === '') { + return 0; + } + + if (is_array($cellAddress)) { + foreach ($cellAddress as $columnKey => $rowValue) { + foreach ($rowValue as $rowKey => $cellValue) { + return (integer) preg_replace('/[^0-9]/i', '', $rowKey); + } + } + } else { + if (strpos($cellAddress, '!') !== false) { + list($sheet, $cellAddress) = explode('!', $cellAddress); + } + if (strpos($cellAddress, ':') !== false) { + list($startAddress, $endAddress) = explode(':', $cellAddress); + $startAddress = preg_replace('/[^0-9]/', '', $startAddress); + $endAddress = preg_replace('/[^0-9]/', '', $endAddress); + $returnValue = array(); + do { + $returnValue[][] = (integer) $startAddress; + } while ($startAddress++ != $endAddress); + return $returnValue; + } else { + list($cellAddress) = explode(':', $cellAddress); + return (integer) preg_replace('/[^0-9]/', '', $cellAddress); + } + } + } + + + /** + * ROWS + * + * Returns the number of rows in an array or reference. + * + * Excel Function: + * =ROWS(cellAddress) + * + * @param cellAddress An array or array formula, or a reference to a range of cells for which you want the number of rows + * @return integer The number of rows in cellAddress + */ + public static function ROWS($cellAddress = null) + { + if (is_null($cellAddress) || $cellAddress === '') { + return 1; + } elseif (!is_array($cellAddress)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + reset($cellAddress); + $isMatrix = (is_numeric(key($cellAddress))); + list($columns, $rows) = PHPExcel_Calculation::_getMatrixDimensions($cellAddress); + + if ($isMatrix) { + return $columns; + } else { + return $rows; + } + } + + + /** + * HYPERLINK + * + * Excel Function: + * =HYPERLINK(linkURL,displayName) + * + * @access public + * @category Logical Functions + * @param string $linkURL Value to check, is also the value returned when no error + * @param string $displayName Value to return when testValue is an error condition + * @param PHPExcel_Cell $pCell The cell to set the hyperlink in + * @return mixed The value of $displayName (or $linkURL if $displayName was blank) + */ + public static function HYPERLINK($linkURL = '', $displayName = null, PHPExcel_Cell $pCell = null) + { + $args = func_get_args(); + $pCell = array_pop($args); + + $linkURL = (is_null($linkURL)) ? '' : PHPExcel_Calculation_Functions::flattenSingleValue($linkURL); + $displayName = (is_null($displayName)) ? '' : PHPExcel_Calculation_Functions::flattenSingleValue($displayName); + + if ((!is_object($pCell)) || (trim($linkURL) == '')) { + return PHPExcel_Calculation_Functions::REF(); + } + + if ((is_object($displayName)) || trim($displayName) == '') { + $displayName = $linkURL; + } + + $pCell->getHyperlink()->setUrl($linkURL); + $pCell->getHyperlink()->setTooltip($displayName); + + return $displayName; + } + + + /** + * INDIRECT + * + * Returns the reference specified by a text string. + * References are immediately evaluated to display their contents. + * + * Excel Function: + * =INDIRECT(cellAddress) + * + * NOTE - INDIRECT() does not yet support the optional a1 parameter introduced in Excel 2010 + * + * @param cellAddress $cellAddress The cell address of the current cell (containing this formula) + * @param PHPExcel_Cell $pCell The current cell (containing this formula) + * @return mixed The cells referenced by cellAddress + * + * @todo Support for the optional a1 parameter introduced in Excel 2010 + * + */ + public static function INDIRECT($cellAddress = null, PHPExcel_Cell $pCell = null) + { + $cellAddress = PHPExcel_Calculation_Functions::flattenSingleValue($cellAddress); + if (is_null($cellAddress) || $cellAddress === '') { + return PHPExcel_Calculation_Functions::REF(); + } + + $cellAddress1 = $cellAddress; + $cellAddress2 = null; + if (strpos($cellAddress, ':') !== false) { + list($cellAddress1, $cellAddress2) = explode(':', $cellAddress); + } + + if ((!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $cellAddress1, $matches)) || + ((!is_null($cellAddress2)) && (!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $cellAddress2, $matches)))) { + if (!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_NAMEDRANGE.'$/i', $cellAddress1, $matches)) { + return PHPExcel_Calculation_Functions::REF(); + } + + if (strpos($cellAddress, '!') !== false) { + list($sheetName, $cellAddress) = explode('!', $cellAddress); + $sheetName = trim($sheetName, "'"); + $pSheet = $pCell->getWorksheet()->getParent()->getSheetByName($sheetName); + } else { + $pSheet = $pCell->getWorksheet(); + } + + return PHPExcel_Calculation::getInstance()->extractNamedRange($cellAddress, $pSheet, false); + } + + if (strpos($cellAddress, '!') !== false) { + list($sheetName, $cellAddress) = explode('!', $cellAddress); + $sheetName = trim($sheetName, "'"); + $pSheet = $pCell->getWorksheet()->getParent()->getSheetByName($sheetName); + } else { + $pSheet = $pCell->getWorksheet(); + } + + return PHPExcel_Calculation::getInstance()->extractCellRange($cellAddress, $pSheet, false); + } + + + /** + * OFFSET + * + * Returns a reference to a range that is a specified number of rows and columns from a cell or range of cells. + * The reference that is returned can be a single cell or a range of cells. You can specify the number of rows and + * the number of columns to be returned. + * + * Excel Function: + * =OFFSET(cellAddress, rows, cols, [height], [width]) + * + * @param cellAddress The reference from which you want to base the offset. Reference must refer to a cell or + * range of adjacent cells; otherwise, OFFSET returns the #VALUE! error value. + * @param rows The number of rows, up or down, that you want the upper-left cell to refer to. + * Using 5 as the rows argument specifies that the upper-left cell in the reference is + * five rows below reference. Rows can be positive (which means below the starting reference) + * or negative (which means above the starting reference). + * @param cols The number of columns, to the left or right, that you want the upper-left cell of the result + * to refer to. Using 5 as the cols argument specifies that the upper-left cell in the + * reference is five columns to the right of reference. Cols can be positive (which means + * to the right of the starting reference) or negative (which means to the left of the + * starting reference). + * @param height The height, in number of rows, that you want the returned reference to be. Height must be a positive number. + * @param width The width, in number of columns, that you want the returned reference to be. Width must be a positive number. + * @return string A reference to a cell or range of cells + */ + public static function OFFSET($cellAddress = null, $rows = 0, $columns = 0, $height = null, $width = null) + { + $rows = PHPExcel_Calculation_Functions::flattenSingleValue($rows); + $columns = PHPExcel_Calculation_Functions::flattenSingleValue($columns); + $height = PHPExcel_Calculation_Functions::flattenSingleValue($height); + $width = PHPExcel_Calculation_Functions::flattenSingleValue($width); + if ($cellAddress == null) { + return 0; + } + + $args = func_get_args(); + $pCell = array_pop($args); + if (!is_object($pCell)) { + return PHPExcel_Calculation_Functions::REF(); + } + + $sheetName = null; + if (strpos($cellAddress, "!")) { + list($sheetName, $cellAddress) = explode("!", $cellAddress); + $sheetName = trim($sheetName, "'"); + } + if (strpos($cellAddress, ":")) { + list($startCell, $endCell) = explode(":", $cellAddress); + } else { + $startCell = $endCell = $cellAddress; + } + list($startCellColumn, $startCellRow) = PHPExcel_Cell::coordinateFromString($startCell); + list($endCellColumn, $endCellRow) = PHPExcel_Cell::coordinateFromString($endCell); + + $startCellRow += $rows; + $startCellColumn = PHPExcel_Cell::columnIndexFromString($startCellColumn) - 1; + $startCellColumn += $columns; + + if (($startCellRow <= 0) || ($startCellColumn < 0)) { + return PHPExcel_Calculation_Functions::REF(); + } + $endCellColumn = PHPExcel_Cell::columnIndexFromString($endCellColumn) - 1; + if (($width != null) && (!is_object($width))) { + $endCellColumn = $startCellColumn + $width - 1; + } else { + $endCellColumn += $columns; + } + $startCellColumn = PHPExcel_Cell::stringFromColumnIndex($startCellColumn); + + if (($height != null) && (!is_object($height))) { + $endCellRow = $startCellRow + $height - 1; + } else { + $endCellRow += $rows; + } + + if (($endCellRow <= 0) || ($endCellColumn < 0)) { + return PHPExcel_Calculation_Functions::REF(); + } + $endCellColumn = PHPExcel_Cell::stringFromColumnIndex($endCellColumn); + + $cellAddress = $startCellColumn.$startCellRow; + if (($startCellColumn != $endCellColumn) || ($startCellRow != $endCellRow)) { + $cellAddress .= ':'.$endCellColumn.$endCellRow; + } + + if ($sheetName !== null) { + $pSheet = $pCell->getWorksheet()->getParent()->getSheetByName($sheetName); + } else { + $pSheet = $pCell->getWorksheet(); + } + + return PHPExcel_Calculation::getInstance()->extractCellRange($cellAddress, $pSheet, false); + } + + + /** + * CHOOSE + * + * Uses lookup_value to return a value from the list of value arguments. + * Use CHOOSE to select one of up to 254 values based on the lookup_value. + * + * Excel Function: + * =CHOOSE(index_num, value1, [value2], ...) + * + * @param index_num Specifies which value argument is selected. + * Index_num must be a number between 1 and 254, or a formula or reference to a cell containing a number + * between 1 and 254. + * @param value1... Value1 is required, subsequent values are optional. + * Between 1 to 254 value arguments from which CHOOSE selects a value or an action to perform based on + * index_num. The arguments can be numbers, cell references, defined names, formulas, functions, or + * text. + * @return mixed The selected value + */ + public static function CHOOSE() + { + $chooseArgs = func_get_args(); + $chosenEntry = PHPExcel_Calculation_Functions::flattenArray(array_shift($chooseArgs)); + $entryCount = count($chooseArgs) - 1; + + if (is_array($chosenEntry)) { + $chosenEntry = array_shift($chosenEntry); + } + if ((is_numeric($chosenEntry)) && (!is_bool($chosenEntry))) { + --$chosenEntry; + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + $chosenEntry = floor($chosenEntry); + if (($chosenEntry < 0) || ($chosenEntry > $entryCount)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (is_array($chooseArgs[$chosenEntry])) { + return PHPExcel_Calculation_Functions::flattenArray($chooseArgs[$chosenEntry]); + } else { + return $chooseArgs[$chosenEntry]; + } + } + + + /** + * MATCH + * + * The MATCH function searches for a specified item in a range of cells + * + * Excel Function: + * =MATCH(lookup_value, lookup_array, [match_type]) + * + * @param lookup_value The value that you want to match in lookup_array + * @param lookup_array The range of cells being searched + * @param match_type The number -1, 0, or 1. -1 means above, 0 means exact match, 1 means below. If match_type is 1 or -1, the list has to be ordered. + * @return integer The relative position of the found item + */ + public static function MATCH($lookup_value, $lookup_array, $match_type = 1) + { + $lookup_array = PHPExcel_Calculation_Functions::flattenArray($lookup_array); + $lookup_value = PHPExcel_Calculation_Functions::flattenSingleValue($lookup_value); + $match_type = (is_null($match_type)) ? 1 : (int) PHPExcel_Calculation_Functions::flattenSingleValue($match_type); + // MATCH is not case sensitive + $lookup_value = strtolower($lookup_value); + + // lookup_value type has to be number, text, or logical values + if ((!is_numeric($lookup_value)) && (!is_string($lookup_value)) && (!is_bool($lookup_value))) { + return PHPExcel_Calculation_Functions::NA(); + } + + // match_type is 0, 1 or -1 + if (($match_type !== 0) && ($match_type !== -1) && ($match_type !== 1)) { + return PHPExcel_Calculation_Functions::NA(); + } + + // lookup_array should not be empty + $lookupArraySize = count($lookup_array); + if ($lookupArraySize <= 0) { + return PHPExcel_Calculation_Functions::NA(); + } + + // lookup_array should contain only number, text, or logical values, or empty (null) cells + foreach ($lookup_array as $i => $lookupArrayValue) { + // check the type of the value + if ((!is_numeric($lookupArrayValue)) && (!is_string($lookupArrayValue)) && + (!is_bool($lookupArrayValue)) && (!is_null($lookupArrayValue))) { + return PHPExcel_Calculation_Functions::NA(); + } + // convert strings to lowercase for case-insensitive testing + if (is_string($lookupArrayValue)) { + $lookup_array[$i] = strtolower($lookupArrayValue); + } + if ((is_null($lookupArrayValue)) && (($match_type == 1) || ($match_type == -1))) { + $lookup_array = array_slice($lookup_array, 0, $i-1); + } + } + + // if match_type is 1 or -1, the list has to be ordered + if ($match_type == 1) { + asort($lookup_array); + $keySet = array_keys($lookup_array); + } elseif ($match_type == -1) { + arsort($lookup_array); + $keySet = array_keys($lookup_array); + } + + // ** + // find the match + // ** + foreach ($lookup_array as $i => $lookupArrayValue) { + if (($match_type == 0) && ($lookupArrayValue == $lookup_value)) { + // exact match + return ++$i; + } elseif (($match_type == -1) && ($lookupArrayValue <= $lookup_value)) { + $i = array_search($i, $keySet); + // if match_type is -1 <=> find the smallest value that is greater than or equal to lookup_value + if ($i < 1) { + // 1st cell was already smaller than the lookup_value + break; + } else { + // the previous cell was the match + return $keySet[$i-1]+1; + } + } elseif (($match_type == 1) && ($lookupArrayValue >= $lookup_value)) { + $i = array_search($i, $keySet); + // if match_type is 1 <=> find the largest value that is less than or equal to lookup_value + if ($i < 1) { + // 1st cell was already bigger than the lookup_value + break; + } else { + // the previous cell was the match + return $keySet[$i-1]+1; + } + } + } + + // unsuccessful in finding a match, return #N/A error value + return PHPExcel_Calculation_Functions::NA(); + } + + + /** + * INDEX + * + * Uses an index to choose a value from a reference or array + * + * Excel Function: + * =INDEX(range_array, row_num, [column_num]) + * + * @param range_array A range of cells or an array constant + * @param row_num The row in array from which to return a value. If row_num is omitted, column_num is required. + * @param column_num The column in array from which to return a value. If column_num is omitted, row_num is required. + * @return mixed the value of a specified cell or array of cells + */ + public static function INDEX($arrayValues, $rowNum = 0, $columnNum = 0) + { + if (($rowNum < 0) || ($columnNum < 0)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (!is_array($arrayValues)) { + return PHPExcel_Calculation_Functions::REF(); + } + + $rowKeys = array_keys($arrayValues); + $columnKeys = @array_keys($arrayValues[$rowKeys[0]]); + + if ($columnNum > count($columnKeys)) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif ($columnNum == 0) { + if ($rowNum == 0) { + return $arrayValues; + } + $rowNum = $rowKeys[--$rowNum]; + $returnArray = array(); + foreach ($arrayValues as $arrayColumn) { + if (is_array($arrayColumn)) { + if (isset($arrayColumn[$rowNum])) { + $returnArray[] = $arrayColumn[$rowNum]; + } else { + return $arrayValues[$rowNum]; + } + } else { + return $arrayValues[$rowNum]; + } + } + return $returnArray; + } + $columnNum = $columnKeys[--$columnNum]; + if ($rowNum > count($rowKeys)) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif ($rowNum == 0) { + return $arrayValues[$columnNum]; + } + $rowNum = $rowKeys[--$rowNum]; + + return $arrayValues[$rowNum][$columnNum]; + } + + + /** + * TRANSPOSE + * + * @param array $matrixData A matrix of values + * @return array + * + * Unlike the Excel TRANSPOSE function, which will only work on a single row or column, this function will transpose a full matrix. + */ + public static function TRANSPOSE($matrixData) + { + $returnMatrix = array(); + if (!is_array($matrixData)) { + $matrixData = array(array($matrixData)); + } + + $column = 0; + foreach ($matrixData as $matrixRow) { + $row = 0; + foreach ($matrixRow as $matrixCell) { + $returnMatrix[$row][$column] = $matrixCell; + ++$row; + } + ++$column; + } + return $returnMatrix; + } + + + private static function vlookupSort($a, $b) + { + reset($a); + $firstColumn = key($a); + if (($aLower = strtolower($a[$firstColumn])) == ($bLower = strtolower($b[$firstColumn]))) { + return 0; + } + return ($aLower < $bLower) ? -1 : 1; + } + + + /** + * VLOOKUP + * The VLOOKUP function searches for value in the left-most column of lookup_array and returns the value in the same row based on the index_number. + * @param lookup_value The value that you want to match in lookup_array + * @param lookup_array The range of cells being searched + * @param index_number The column number in table_array from which the matching value must be returned. The first column is 1. + * @param not_exact_match Determines if you are looking for an exact match based on lookup_value. + * @return mixed The value of the found cell + */ + public static function VLOOKUP($lookup_value, $lookup_array, $index_number, $not_exact_match = true) + { + $lookup_value = PHPExcel_Calculation_Functions::flattenSingleValue($lookup_value); + $index_number = PHPExcel_Calculation_Functions::flattenSingleValue($index_number); + $not_exact_match = PHPExcel_Calculation_Functions::flattenSingleValue($not_exact_match); + + // index_number must be greater than or equal to 1 + if ($index_number < 1) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + // index_number must be less than or equal to the number of columns in lookup_array + if ((!is_array($lookup_array)) || (empty($lookup_array))) { + return PHPExcel_Calculation_Functions::REF(); + } else { + $f = array_keys($lookup_array); + $firstRow = array_pop($f); + if ((!is_array($lookup_array[$firstRow])) || ($index_number > count($lookup_array[$firstRow]))) { + return PHPExcel_Calculation_Functions::REF(); + } else { + $columnKeys = array_keys($lookup_array[$firstRow]); + $returnColumn = $columnKeys[--$index_number]; + $firstColumn = array_shift($columnKeys); + } + } + + if (!$not_exact_match) { + uasort($lookup_array, array('self', 'vlookupSort')); + } + + $rowNumber = $rowValue = false; + foreach ($lookup_array as $rowKey => $rowData) { + if ((is_numeric($lookup_value) && is_numeric($rowData[$firstColumn]) && ($rowData[$firstColumn] > $lookup_value)) || + (!is_numeric($lookup_value) && !is_numeric($rowData[$firstColumn]) && (strtolower($rowData[$firstColumn]) > strtolower($lookup_value)))) { + break; + } + $rowNumber = $rowKey; + $rowValue = $rowData[$firstColumn]; + } + + if ($rowNumber !== false) { + if ((!$not_exact_match) && ($rowValue != $lookup_value)) { + // if an exact match is required, we have what we need to return an appropriate response + return PHPExcel_Calculation_Functions::NA(); + } else { + // otherwise return the appropriate value + return $lookup_array[$rowNumber][$returnColumn]; + } + } + + return PHPExcel_Calculation_Functions::NA(); + } + + + /** + * HLOOKUP + * The HLOOKUP function searches for value in the top-most row of lookup_array and returns the value in the same column based on the index_number. + * @param lookup_value The value that you want to match in lookup_array + * @param lookup_array The range of cells being searched + * @param index_number The row number in table_array from which the matching value must be returned. The first row is 1. + * @param not_exact_match Determines if you are looking for an exact match based on lookup_value. + * @return mixed The value of the found cell + */ + public static function HLOOKUP($lookup_value, $lookup_array, $index_number, $not_exact_match = true) + { + $lookup_value = PHPExcel_Calculation_Functions::flattenSingleValue($lookup_value); + $index_number = PHPExcel_Calculation_Functions::flattenSingleValue($index_number); + $not_exact_match = PHPExcel_Calculation_Functions::flattenSingleValue($not_exact_match); + + // index_number must be greater than or equal to 1 + if ($index_number < 1) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + // index_number must be less than or equal to the number of columns in lookup_array + if ((!is_array($lookup_array)) || (empty($lookup_array))) { + return PHPExcel_Calculation_Functions::REF(); + } else { + $f = array_keys($lookup_array); + $firstRow = array_pop($f); + if ((!is_array($lookup_array[$firstRow])) || ($index_number > count($lookup_array[$firstRow]))) { + return PHPExcel_Calculation_Functions::REF(); + } else { + $columnKeys = array_keys($lookup_array[$firstRow]); + $firstkey = $f[0] - 1; + $returnColumn = $firstkey + $index_number; + $firstColumn = array_shift($f); + } + } + + if (!$not_exact_match) { + $firstRowH = asort($lookup_array[$firstColumn]); + } + + $rowNumber = $rowValue = false; + foreach ($lookup_array[$firstColumn] as $rowKey => $rowData) { + if ((is_numeric($lookup_value) && is_numeric($rowData) && ($rowData > $lookup_value)) || + (!is_numeric($lookup_value) && !is_numeric($rowData) && (strtolower($rowData) > strtolower($lookup_value)))) { + break; + } + $rowNumber = $rowKey; + $rowValue = $rowData; + } + + if ($rowNumber !== false) { + if ((!$not_exact_match) && ($rowValue != $lookup_value)) { + // if an exact match is required, we have what we need to return an appropriate response + return PHPExcel_Calculation_Functions::NA(); + } else { + // otherwise return the appropriate value + return $lookup_array[$returnColumn][$rowNumber]; + } + } + + return PHPExcel_Calculation_Functions::NA(); + } + + + /** + * LOOKUP + * The LOOKUP function searches for value either from a one-row or one-column range or from an array. + * @param lookup_value The value that you want to match in lookup_array + * @param lookup_vector The range of cells being searched + * @param result_vector The column from which the matching value must be returned + * @return mixed The value of the found cell + */ + public static function LOOKUP($lookup_value, $lookup_vector, $result_vector = null) + { + $lookup_value = PHPExcel_Calculation_Functions::flattenSingleValue($lookup_value); + + if (!is_array($lookup_vector)) { + return PHPExcel_Calculation_Functions::NA(); + } + $lookupRows = count($lookup_vector); + $l = array_keys($lookup_vector); + $l = array_shift($l); + $lookupColumns = count($lookup_vector[$l]); + if ((($lookupRows == 1) && ($lookupColumns > 1)) || (($lookupRows == 2) && ($lookupColumns != 2))) { + $lookup_vector = self::TRANSPOSE($lookup_vector); + $lookupRows = count($lookup_vector); + $l = array_keys($lookup_vector); + $lookupColumns = count($lookup_vector[array_shift($l)]); + } + + if (is_null($result_vector)) { + $result_vector = $lookup_vector; + } + $resultRows = count($result_vector); + $l = array_keys($result_vector); + $l = array_shift($l); + $resultColumns = count($result_vector[$l]); + if ((($resultRows == 1) && ($resultColumns > 1)) || (($resultRows == 2) && ($resultColumns != 2))) { + $result_vector = self::TRANSPOSE($result_vector); + $resultRows = count($result_vector); + $r = array_keys($result_vector); + $resultColumns = count($result_vector[array_shift($r)]); + } + + if ($lookupRows == 2) { + $result_vector = array_pop($lookup_vector); + $lookup_vector = array_shift($lookup_vector); + } + if ($lookupColumns != 2) { + foreach ($lookup_vector as &$value) { + if (is_array($value)) { + $k = array_keys($value); + $key1 = $key2 = array_shift($k); + $key2++; + $dataValue1 = $value[$key1]; + } else { + $key1 = 0; + $key2 = 1; + $dataValue1 = $value; + } + $dataValue2 = array_shift($result_vector); + if (is_array($dataValue2)) { + $dataValue2 = array_shift($dataValue2); + } + $value = array($key1 => $dataValue1, $key2 => $dataValue2); + } + unset($value); + } + + return self::VLOOKUP($lookup_value, $lookup_vector, 2); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Calculation/MathTrig.php b/application/third_party/PHPExcel/PHPExcel/Calculation/MathTrig.php new file mode 100644 index 0000000..894ba9c --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Calculation/MathTrig.php @@ -0,0 +1,1459 @@ + 1; --$i) { + if (($value % $i) == 0) { + $factorArray = array_merge($factorArray, self::factors($value / $i)); + $factorArray = array_merge($factorArray, self::factors($i)); + if ($i <= sqrt($value)) { + break; + } + } + } + if (!empty($factorArray)) { + rsort($factorArray); + return $factorArray; + } else { + return array((integer) $value); + } + } + + + private static function romanCut($num, $n) + { + return ($num - ($num % $n ) ) / $n; + } + + + /** + * ATAN2 + * + * This function calculates the arc tangent of the two variables x and y. It is similar to + * calculating the arc tangent of y ÷ x, except that the signs of both arguments are used + * to determine the quadrant of the result. + * The arctangent is the angle from the x-axis to a line containing the origin (0, 0) and a + * point with coordinates (xCoordinate, yCoordinate). The angle is given in radians between + * -pi and pi, excluding -pi. + * + * Note that the Excel ATAN2() function accepts its arguments in the reverse order to the standard + * PHP atan2() function, so we need to reverse them here before calling the PHP atan() function. + * + * Excel Function: + * ATAN2(xCoordinate,yCoordinate) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param float $xCoordinate The x-coordinate of the point. + * @param float $yCoordinate The y-coordinate of the point. + * @return float The inverse tangent of the specified x- and y-coordinates. + */ + public static function ATAN2($xCoordinate = null, $yCoordinate = null) + { + $xCoordinate = PHPExcel_Calculation_Functions::flattenSingleValue($xCoordinate); + $yCoordinate = PHPExcel_Calculation_Functions::flattenSingleValue($yCoordinate); + + $xCoordinate = ($xCoordinate !== null) ? $xCoordinate : 0.0; + $yCoordinate = ($yCoordinate !== null) ? $yCoordinate : 0.0; + + if (((is_numeric($xCoordinate)) || (is_bool($xCoordinate))) && + ((is_numeric($yCoordinate))) || (is_bool($yCoordinate))) { + $xCoordinate = (float) $xCoordinate; + $yCoordinate = (float) $yCoordinate; + + if (($xCoordinate == 0) && ($yCoordinate == 0)) { + return PHPExcel_Calculation_Functions::DIV0(); + } + + return atan2($yCoordinate, $xCoordinate); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * CEILING + * + * Returns number rounded up, away from zero, to the nearest multiple of significance. + * For example, if you want to avoid using pennies in your prices and your product is + * priced at $4.42, use the formula =CEILING(4.42,0.05) to round prices up to the + * nearest nickel. + * + * Excel Function: + * CEILING(number[,significance]) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param float $number The number you want to round. + * @param float $significance The multiple to which you want to round. + * @return float Rounded Number + */ + public static function CEILING($number, $significance = null) + { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + $significance = PHPExcel_Calculation_Functions::flattenSingleValue($significance); + + if ((is_null($significance)) && + (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC)) { + $significance = $number / abs($number); + } + + if ((is_numeric($number)) && (is_numeric($significance))) { + if (($number == 0.0 ) || ($significance == 0.0)) { + return 0.0; + } elseif (self::SIGN($number) == self::SIGN($significance)) { + return ceil($number / $significance) * $significance; + } else { + return PHPExcel_Calculation_Functions::NaN(); + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * COMBIN + * + * Returns the number of combinations for a given number of items. Use COMBIN to + * determine the total possible number of groups for a given number of items. + * + * Excel Function: + * COMBIN(numObjs,numInSet) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param int $numObjs Number of different objects + * @param int $numInSet Number of objects in each combination + * @return int Number of combinations + */ + public static function COMBIN($numObjs, $numInSet) + { + $numObjs = PHPExcel_Calculation_Functions::flattenSingleValue($numObjs); + $numInSet = PHPExcel_Calculation_Functions::flattenSingleValue($numInSet); + + if ((is_numeric($numObjs)) && (is_numeric($numInSet))) { + if ($numObjs < $numInSet) { + return PHPExcel_Calculation_Functions::NaN(); + } elseif ($numInSet < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + return round(self::FACT($numObjs) / self::FACT($numObjs - $numInSet)) / self::FACT($numInSet); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * EVEN + * + * Returns number rounded up to the nearest even integer. + * You can use this function for processing items that come in twos. For example, + * a packing crate accepts rows of one or two items. The crate is full when + * the number of items, rounded up to the nearest two, matches the crate's + * capacity. + * + * Excel Function: + * EVEN(number) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param float $number Number to round + * @return int Rounded Number + */ + public static function EVEN($number) + { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + + if (is_null($number)) { + return 0; + } elseif (is_bool($number)) { + $number = (int) $number; + } + + if (is_numeric($number)) { + $significance = 2 * self::SIGN($number); + return (int) self::CEILING($number, $significance); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * FACT + * + * Returns the factorial of a number. + * The factorial of a number is equal to 1*2*3*...* number. + * + * Excel Function: + * FACT(factVal) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param float $factVal Factorial Value + * @return int Factorial + */ + public static function FACT($factVal) + { + $factVal = PHPExcel_Calculation_Functions::flattenSingleValue($factVal); + + if (is_numeric($factVal)) { + if ($factVal < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + $factLoop = floor($factVal); + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) { + if ($factVal > $factLoop) { + return PHPExcel_Calculation_Functions::NaN(); + } + } + + $factorial = 1; + while ($factLoop > 1) { + $factorial *= $factLoop--; + } + return $factorial ; + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * FACTDOUBLE + * + * Returns the double factorial of a number. + * + * Excel Function: + * FACTDOUBLE(factVal) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param float $factVal Factorial Value + * @return int Double Factorial + */ + public static function FACTDOUBLE($factVal) + { + $factLoop = PHPExcel_Calculation_Functions::flattenSingleValue($factVal); + + if (is_numeric($factLoop)) { + $factLoop = floor($factLoop); + if ($factVal < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + $factorial = 1; + while ($factLoop > 1) { + $factorial *= $factLoop--; + --$factLoop; + } + return $factorial ; + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * FLOOR + * + * Rounds number down, toward zero, to the nearest multiple of significance. + * + * Excel Function: + * FLOOR(number[,significance]) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param float $number Number to round + * @param float $significance Significance + * @return float Rounded Number + */ + public static function FLOOR($number, $significance = null) + { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + $significance = PHPExcel_Calculation_Functions::flattenSingleValue($significance); + + if ((is_null($significance)) && + (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC)) { + $significance = $number/abs($number); + } + + if ((is_numeric($number)) && (is_numeric($significance))) { + if ($significance == 0.0) { + return PHPExcel_Calculation_Functions::DIV0(); + } elseif ($number == 0.0) { + return 0.0; + } elseif (self::SIGN($number) == self::SIGN($significance)) { + return floor($number / $significance) * $significance; + } else { + return PHPExcel_Calculation_Functions::NaN(); + } + } + + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * GCD + * + * Returns the greatest common divisor of a series of numbers. + * The greatest common divisor is the largest integer that divides both + * number1 and number2 without a remainder. + * + * Excel Function: + * GCD(number1[,number2[, ...]]) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @return integer Greatest Common Divisor + */ + public static function GCD() + { + $returnValue = 1; + $allValuesFactors = array(); + // Loop through arguments + foreach (PHPExcel_Calculation_Functions::flattenArray(func_get_args()) as $value) { + if (!is_numeric($value)) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif ($value == 0) { + continue; + } elseif ($value < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + $myFactors = self::factors($value); + $myCountedFactors = array_count_values($myFactors); + $allValuesFactors[] = $myCountedFactors; + } + $allValuesCount = count($allValuesFactors); + if ($allValuesCount == 0) { + return 0; + } + + $mergedArray = $allValuesFactors[0]; + for ($i=1; $i < $allValuesCount; ++$i) { + $mergedArray = array_intersect_key($mergedArray, $allValuesFactors[$i]); + } + $mergedArrayValues = count($mergedArray); + if ($mergedArrayValues == 0) { + return $returnValue; + } elseif ($mergedArrayValues > 1) { + foreach ($mergedArray as $mergedKey => $mergedValue) { + foreach ($allValuesFactors as $highestPowerTest) { + foreach ($highestPowerTest as $testKey => $testValue) { + if (($testKey == $mergedKey) && ($testValue < $mergedValue)) { + $mergedArray[$mergedKey] = $testValue; + $mergedValue = $testValue; + } + } + } + } + + $returnValue = 1; + foreach ($mergedArray as $key => $value) { + $returnValue *= pow($key, $value); + } + return $returnValue; + } else { + $keys = array_keys($mergedArray); + $key = $keys[0]; + $value = $mergedArray[$key]; + foreach ($allValuesFactors as $testValue) { + foreach ($testValue as $mergedKey => $mergedValue) { + if (($mergedKey == $key) && ($mergedValue < $value)) { + $value = $mergedValue; + } + } + } + return pow($key, $value); + } + } + + + /** + * INT + * + * Casts a floating point value to an integer + * + * Excel Function: + * INT(number) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param float $number Number to cast to an integer + * @return integer Integer value + */ + public static function INT($number) + { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + + if (is_null($number)) { + return 0; + } elseif (is_bool($number)) { + return (int) $number; + } + if (is_numeric($number)) { + return (int) floor($number); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * LCM + * + * Returns the lowest common multiplier of a series of numbers + * The least common multiple is the smallest positive integer that is a multiple + * of all integer arguments number1, number2, and so on. Use LCM to add fractions + * with different denominators. + * + * Excel Function: + * LCM(number1[,number2[, ...]]) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @return int Lowest Common Multiplier + */ + public static function LCM() + { + $returnValue = 1; + $allPoweredFactors = array(); + // Loop through arguments + foreach (PHPExcel_Calculation_Functions::flattenArray(func_get_args()) as $value) { + if (!is_numeric($value)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if ($value == 0) { + return 0; + } elseif ($value < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + $myFactors = self::factors(floor($value)); + $myCountedFactors = array_count_values($myFactors); + $myPoweredFactors = array(); + foreach ($myCountedFactors as $myCountedFactor => $myCountedPower) { + $myPoweredFactors[$myCountedFactor] = pow($myCountedFactor, $myCountedPower); + } + foreach ($myPoweredFactors as $myPoweredValue => $myPoweredFactor) { + if (array_key_exists($myPoweredValue, $allPoweredFactors)) { + if ($allPoweredFactors[$myPoweredValue] < $myPoweredFactor) { + $allPoweredFactors[$myPoweredValue] = $myPoweredFactor; + } + } else { + $allPoweredFactors[$myPoweredValue] = $myPoweredFactor; + } + } + } + foreach ($allPoweredFactors as $allPoweredFactor) { + $returnValue *= (integer) $allPoweredFactor; + } + return $returnValue; + } + + + /** + * LOG_BASE + * + * Returns the logarithm of a number to a specified base. The default base is 10. + * + * Excel Function: + * LOG(number[,base]) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param float $number The positive real number for which you want the logarithm + * @param float $base The base of the logarithm. If base is omitted, it is assumed to be 10. + * @return float + */ + public static function LOG_BASE($number = null, $base = 10) + { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + $base = (is_null($base)) ? 10 : (float) PHPExcel_Calculation_Functions::flattenSingleValue($base); + + if ((!is_numeric($base)) || (!is_numeric($number))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (($base <= 0) || ($number <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + return log($number, $base); + } + + + /** + * MDETERM + * + * Returns the matrix determinant of an array. + * + * Excel Function: + * MDETERM(array) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param array $matrixValues A matrix of values + * @return float + */ + public static function MDETERM($matrixValues) + { + $matrixData = array(); + if (!is_array($matrixValues)) { + $matrixValues = array(array($matrixValues)); + } + + $row = $maxColumn = 0; + foreach ($matrixValues as $matrixRow) { + if (!is_array($matrixRow)) { + $matrixRow = array($matrixRow); + } + $column = 0; + foreach ($matrixRow as $matrixCell) { + if ((is_string($matrixCell)) || ($matrixCell === null)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $matrixData[$column][$row] = $matrixCell; + ++$column; + } + if ($column > $maxColumn) { + $maxColumn = $column; + } + ++$row; + } + if ($row != $maxColumn) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + try { + $matrix = new PHPExcel_Shared_JAMA_Matrix($matrixData); + return $matrix->det(); + } catch (PHPExcel_Exception $ex) { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + + + /** + * MINVERSE + * + * Returns the inverse matrix for the matrix stored in an array. + * + * Excel Function: + * MINVERSE(array) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param array $matrixValues A matrix of values + * @return array + */ + public static function MINVERSE($matrixValues) + { + $matrixData = array(); + if (!is_array($matrixValues)) { + $matrixValues = array(array($matrixValues)); + } + + $row = $maxColumn = 0; + foreach ($matrixValues as $matrixRow) { + if (!is_array($matrixRow)) { + $matrixRow = array($matrixRow); + } + $column = 0; + foreach ($matrixRow as $matrixCell) { + if ((is_string($matrixCell)) || ($matrixCell === null)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $matrixData[$column][$row] = $matrixCell; + ++$column; + } + if ($column > $maxColumn) { + $maxColumn = $column; + } + ++$row; + } + if ($row != $maxColumn) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + try { + $matrix = new PHPExcel_Shared_JAMA_Matrix($matrixData); + return $matrix->inverse()->getArray(); + } catch (PHPExcel_Exception $ex) { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + + + /** + * MMULT + * + * @param array $matrixData1 A matrix of values + * @param array $matrixData2 A matrix of values + * @return array + */ + public static function MMULT($matrixData1, $matrixData2) + { + $matrixAData = $matrixBData = array(); + if (!is_array($matrixData1)) { + $matrixData1 = array(array($matrixData1)); + } + if (!is_array($matrixData2)) { + $matrixData2 = array(array($matrixData2)); + } + + try { + $rowA = 0; + foreach ($matrixData1 as $matrixRow) { + if (!is_array($matrixRow)) { + $matrixRow = array($matrixRow); + } + $columnA = 0; + foreach ($matrixRow as $matrixCell) { + if ((!is_numeric($matrixCell)) || ($matrixCell === null)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $matrixAData[$rowA][$columnA] = $matrixCell; + ++$columnA; + } + ++$rowA; + } + $matrixA = new PHPExcel_Shared_JAMA_Matrix($matrixAData); + $rowB = 0; + foreach ($matrixData2 as $matrixRow) { + if (!is_array($matrixRow)) { + $matrixRow = array($matrixRow); + } + $columnB = 0; + foreach ($matrixRow as $matrixCell) { + if ((!is_numeric($matrixCell)) || ($matrixCell === null)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $matrixBData[$rowB][$columnB] = $matrixCell; + ++$columnB; + } + ++$rowB; + } + $matrixB = new PHPExcel_Shared_JAMA_Matrix($matrixBData); + + if ($columnA != $rowB) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + return $matrixA->times($matrixB)->getArray(); + } catch (PHPExcel_Exception $ex) { + var_dump($ex->getMessage()); + return PHPExcel_Calculation_Functions::VALUE(); + } + } + + + /** + * MOD + * + * @param int $a Dividend + * @param int $b Divisor + * @return int Remainder + */ + public static function MOD($a = 1, $b = 1) + { + $a = PHPExcel_Calculation_Functions::flattenSingleValue($a); + $b = PHPExcel_Calculation_Functions::flattenSingleValue($b); + + if ($b == 0.0) { + return PHPExcel_Calculation_Functions::DIV0(); + } elseif (($a < 0.0) && ($b > 0.0)) { + return $b - fmod(abs($a), $b); + } elseif (($a > 0.0) && ($b < 0.0)) { + return $b + fmod($a, abs($b)); + } + + return fmod($a, $b); + } + + + /** + * MROUND + * + * Rounds a number to the nearest multiple of a specified value + * + * @param float $number Number to round + * @param int $multiple Multiple to which you want to round $number + * @return float Rounded Number + */ + public static function MROUND($number, $multiple) + { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + $multiple = PHPExcel_Calculation_Functions::flattenSingleValue($multiple); + + if ((is_numeric($number)) && (is_numeric($multiple))) { + if ($multiple == 0) { + return 0; + } + if ((self::SIGN($number)) == (self::SIGN($multiple))) { + $multiplier = 1 / $multiple; + return round($number * $multiplier) / $multiplier; + } + return PHPExcel_Calculation_Functions::NaN(); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * MULTINOMIAL + * + * Returns the ratio of the factorial of a sum of values to the product of factorials. + * + * @param array of mixed Data Series + * @return float + */ + public static function MULTINOMIAL() + { + $summer = 0; + $divisor = 1; + // Loop through arguments + foreach (PHPExcel_Calculation_Functions::flattenArray(func_get_args()) as $arg) { + // Is it a numeric value? + if (is_numeric($arg)) { + if ($arg < 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + $summer += floor($arg); + $divisor *= self::FACT($arg); + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + + // Return + if ($summer > 0) { + $summer = self::FACT($summer); + return $summer / $divisor; + } + return 0; + } + + + /** + * ODD + * + * Returns number rounded up to the nearest odd integer. + * + * @param float $number Number to round + * @return int Rounded Number + */ + public static function ODD($number) + { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + + if (is_null($number)) { + return 1; + } elseif (is_bool($number)) { + return 1; + } elseif (is_numeric($number)) { + $significance = self::SIGN($number); + if ($significance == 0) { + return 1; + } + + $result = self::CEILING($number, $significance); + if ($result == self::EVEN($result)) { + $result += $significance; + } + + return (int) $result; + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * POWER + * + * Computes x raised to the power y. + * + * @param float $x + * @param float $y + * @return float + */ + public static function POWER($x = 0, $y = 2) + { + $x = PHPExcel_Calculation_Functions::flattenSingleValue($x); + $y = PHPExcel_Calculation_Functions::flattenSingleValue($y); + + // Validate parameters + if ($x == 0.0 && $y == 0.0) { + return PHPExcel_Calculation_Functions::NaN(); + } elseif ($x == 0.0 && $y < 0.0) { + return PHPExcel_Calculation_Functions::DIV0(); + } + + // Return + $result = pow($x, $y); + return (!is_nan($result) && !is_infinite($result)) ? $result : PHPExcel_Calculation_Functions::NaN(); + } + + + /** + * PRODUCT + * + * PRODUCT returns the product of all the values and cells referenced in the argument list. + * + * Excel Function: + * PRODUCT(value1[,value2[, ...]]) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function PRODUCT() + { + // Return value + $returnValue = null; + + // Loop through arguments + foreach (PHPExcel_Calculation_Functions::flattenArray(func_get_args()) as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + if (is_null($returnValue)) { + $returnValue = $arg; + } else { + $returnValue *= $arg; + } + } + } + + // Return + if (is_null($returnValue)) { + return 0; + } + return $returnValue; + } + + + /** + * QUOTIENT + * + * QUOTIENT function returns the integer portion of a division. Numerator is the divided number + * and denominator is the divisor. + * + * Excel Function: + * QUOTIENT(value1[,value2[, ...]]) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function QUOTIENT() + { + // Return value + $returnValue = null; + + // Loop through arguments + foreach (PHPExcel_Calculation_Functions::flattenArray(func_get_args()) as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + if (is_null($returnValue)) { + $returnValue = ($arg == 0) ? 0 : $arg; + } else { + if (($returnValue == 0) || ($arg == 0)) { + $returnValue = 0; + } else { + $returnValue /= $arg; + } + } + } + } + + // Return + return intval($returnValue); + } + + + /** + * RAND + * + * @param int $min Minimal value + * @param int $max Maximal value + * @return int Random number + */ + public static function RAND($min = 0, $max = 0) + { + $min = PHPExcel_Calculation_Functions::flattenSingleValue($min); + $max = PHPExcel_Calculation_Functions::flattenSingleValue($max); + + if ($min == 0 && $max == 0) { + return (mt_rand(0, 10000000)) / 10000000; + } else { + return mt_rand($min, $max); + } + } + + + public static function ROMAN($aValue, $style = 0) + { + $aValue = PHPExcel_Calculation_Functions::flattenSingleValue($aValue); + $style = (is_null($style)) ? 0 : (integer) PHPExcel_Calculation_Functions::flattenSingleValue($style); + if ((!is_numeric($aValue)) || ($aValue < 0) || ($aValue >= 4000)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $aValue = (integer) $aValue; + if ($aValue == 0) { + return ''; + } + + $mill = array('', 'M', 'MM', 'MMM', 'MMMM', 'MMMMM'); + $cent = array('', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'); + $tens = array('', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'); + $ones = array('', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'); + + $roman = ''; + while ($aValue > 5999) { + $roman .= 'M'; + $aValue -= 1000; + } + $m = self::romanCut($aValue, 1000); + $aValue %= 1000; + $c = self::romanCut($aValue, 100); + $aValue %= 100; + $t = self::romanCut($aValue, 10); + $aValue %= 10; + + return $roman.$mill[$m].$cent[$c].$tens[$t].$ones[$aValue]; + } + + + /** + * ROUNDUP + * + * Rounds a number up to a specified number of decimal places + * + * @param float $number Number to round + * @param int $digits Number of digits to which you want to round $number + * @return float Rounded Number + */ + public static function ROUNDUP($number, $digits) + { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + $digits = PHPExcel_Calculation_Functions::flattenSingleValue($digits); + + if ((is_numeric($number)) && (is_numeric($digits))) { + $significance = pow(10, (int) $digits); + if ($number < 0.0) { + return floor($number * $significance) / $significance; + } else { + return ceil($number * $significance) / $significance; + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * ROUNDDOWN + * + * Rounds a number down to a specified number of decimal places + * + * @param float $number Number to round + * @param int $digits Number of digits to which you want to round $number + * @return float Rounded Number + */ + public static function ROUNDDOWN($number, $digits) + { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + $digits = PHPExcel_Calculation_Functions::flattenSingleValue($digits); + + if ((is_numeric($number)) && (is_numeric($digits))) { + $significance = pow(10, (int) $digits); + if ($number < 0.0) { + return ceil($number * $significance) / $significance; + } else { + return floor($number * $significance) / $significance; + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * SERIESSUM + * + * Returns the sum of a power series + * + * @param float $x Input value to the power series + * @param float $n Initial power to which you want to raise $x + * @param float $m Step by which to increase $n for each term in the series + * @param array of mixed Data Series + * @return float + */ + public static function SERIESSUM() + { + $returnValue = 0; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + + $x = array_shift($aArgs); + $n = array_shift($aArgs); + $m = array_shift($aArgs); + + if ((is_numeric($x)) && (is_numeric($n)) && (is_numeric($m))) { + // Calculate + $i = 0; + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $returnValue += $arg * pow($x, $n + ($m * $i++)); + } else { + return PHPExcel_Calculation_Functions::VALUE(); + } + } + return $returnValue; + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * SIGN + * + * Determines the sign of a number. Returns 1 if the number is positive, zero (0) + * if the number is 0, and -1 if the number is negative. + * + * @param float $number Number to round + * @return int sign value + */ + public static function SIGN($number) + { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + + if (is_bool($number)) { + return (int) $number; + } + if (is_numeric($number)) { + if ($number == 0.0) { + return 0; + } + return $number / abs($number); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * SQRTPI + * + * Returns the square root of (number * pi). + * + * @param float $number Number + * @return float Square Root of Number * Pi + */ + public static function SQRTPI($number) + { + $number = PHPExcel_Calculation_Functions::flattenSingleValue($number); + + if (is_numeric($number)) { + if ($number < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + return sqrt($number * M_PI) ; + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * SUBTOTAL + * + * Returns a subtotal in a list or database. + * + * @param int the number 1 to 11 that specifies which function to + * use in calculating subtotals within a list. + * @param array of mixed Data Series + * @return float + */ + public static function SUBTOTAL() + { + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + + // Calculate + $subtotal = array_shift($aArgs); + + if ((is_numeric($subtotal)) && (!is_string($subtotal))) { + switch ($subtotal) { + case 1: + return PHPExcel_Calculation_Statistical::AVERAGE($aArgs); + case 2: + return PHPExcel_Calculation_Statistical::COUNT($aArgs); + case 3: + return PHPExcel_Calculation_Statistical::COUNTA($aArgs); + case 4: + return PHPExcel_Calculation_Statistical::MAX($aArgs); + case 5: + return PHPExcel_Calculation_Statistical::MIN($aArgs); + case 6: + return self::PRODUCT($aArgs); + case 7: + return PHPExcel_Calculation_Statistical::STDEV($aArgs); + case 8: + return PHPExcel_Calculation_Statistical::STDEVP($aArgs); + case 9: + return self::SUM($aArgs); + case 10: + return PHPExcel_Calculation_Statistical::VARFunc($aArgs); + case 11: + return PHPExcel_Calculation_Statistical::VARP($aArgs); + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * SUM + * + * SUM computes the sum of all the values and cells referenced in the argument list. + * + * Excel Function: + * SUM(value1[,value2[, ...]]) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function SUM() + { + $returnValue = 0; + + // Loop through the arguments + foreach (PHPExcel_Calculation_Functions::flattenArray(func_get_args()) as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $returnValue += $arg; + } + } + + return $returnValue; + } + + + /** + * SUMIF + * + * Counts the number of cells that contain numbers within the list of arguments + * + * Excel Function: + * SUMIF(value1[,value2[, ...]],condition) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @param string $condition The criteria that defines which cells will be summed. + * @return float + */ + public static function SUMIF($aArgs, $condition, $sumArgs = array()) + { + $returnValue = 0; + + $aArgs = PHPExcel_Calculation_Functions::flattenArray($aArgs); + $sumArgs = PHPExcel_Calculation_Functions::flattenArray($sumArgs); + if (empty($sumArgs)) { + $sumArgs = $aArgs; + } + $condition = PHPExcel_Calculation_Functions::ifCondition($condition); + // Loop through arguments + foreach ($aArgs as $key => $arg) { + if (!is_numeric($arg)) { + $arg = str_replace('"', '""', $arg); + $arg = PHPExcel_Calculation::wrapResult(strtoupper($arg)); + } + + $testCondition = '='.$arg.$condition; + if (PHPExcel_Calculation::getInstance()->_calculateFormulaValue($testCondition)) { + // Is it a value within our criteria + $returnValue += $sumArgs[$key]; + } + } + + return $returnValue; + } + + + /** + * SUMIFS + * + * Counts the number of cells that contain numbers within the list of arguments + * + * Excel Function: + * SUMIFS(value1[,value2[, ...]],condition) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @param string $condition The criteria that defines which cells will be summed. + * @return float + */ + public static function SUMIFS() { + $arrayList = func_get_args(); + + $sumArgs = PHPExcel_Calculation_Functions::flattenArray(array_shift($arrayList)); + + while (count($arrayList) > 0) { + $aArgsArray[] = PHPExcel_Calculation_Functions::flattenArray(array_shift($arrayList)); + $conditions[] = PHPExcel_Calculation_Functions::ifCondition(array_shift($arrayList)); + } + + // Loop through each set of arguments and conditions + foreach ($conditions as $index => $condition) { + $aArgs = $aArgsArray[$index]; + $wildcard = false; + if ((strpos($condition, '*') !== false) || (strpos($condition, '?') !== false)) { + // * and ? are wildcard characters. + // Use ~* and ~? for literal star and question mark + // Code logic doesn't yet handle escaping + $condition = trim(ltrim($condition, '=<>'), '"'); + $wildcard = true; + } + // Loop through arguments + foreach ($aArgs as $key => $arg) { + if ($wildcard) { + if (!fnmatch($condition, $arg, FNM_CASEFOLD)) { + // Is it a value within our criteria + $sumArgs[$key] = 0.0; + } + } else { + if (!is_numeric($arg)) { + $arg = PHPExcel_Calculation::wrapResult(strtoupper($arg)); + } + $testCondition = '='.$arg.$condition; + if (!PHPExcel_Calculation::getInstance()->_calculateFormulaValue($testCondition)) { + // Is it a value within our criteria + $sumArgs[$key] = 0.0; + } + } + } + } + + // Return + return array_sum($sumArgs); + } + + + /** + * SUMPRODUCT + * + * Excel Function: + * SUMPRODUCT(value1[,value2[, ...]]) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function SUMPRODUCT() + { + $arrayList = func_get_args(); + + $wrkArray = PHPExcel_Calculation_Functions::flattenArray(array_shift($arrayList)); + $wrkCellCount = count($wrkArray); + + for ($i=0; $i< $wrkCellCount; ++$i) { + if ((!is_numeric($wrkArray[$i])) || (is_string($wrkArray[$i]))) { + $wrkArray[$i] = 0; + } + } + + foreach ($arrayList as $matrixData) { + $array2 = PHPExcel_Calculation_Functions::flattenArray($matrixData); + $count = count($array2); + if ($wrkCellCount != $count) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + foreach ($array2 as $i => $val) { + if ((!is_numeric($val)) || (is_string($val))) { + $val = 0; + } + $wrkArray[$i] *= $val; + } + } + + return array_sum($wrkArray); + } + + + /** + * SUMSQ + * + * SUMSQ returns the sum of the squares of the arguments + * + * Excel Function: + * SUMSQ(value1[,value2[, ...]]) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function SUMSQ() + { + $returnValue = 0; + + // Loop through arguments + foreach (PHPExcel_Calculation_Functions::flattenArray(func_get_args()) as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $returnValue += ($arg * $arg); + } + } + + return $returnValue; + } + + + /** + * SUMX2MY2 + * + * @param mixed[] $matrixData1 Matrix #1 + * @param mixed[] $matrixData2 Matrix #2 + * @return float + */ + public static function SUMX2MY2($matrixData1, $matrixData2) + { + $array1 = PHPExcel_Calculation_Functions::flattenArray($matrixData1); + $array2 = PHPExcel_Calculation_Functions::flattenArray($matrixData2); + $count = min(count($array1), count($array2)); + + $result = 0; + for ($i = 0; $i < $count; ++$i) { + if (((is_numeric($array1[$i])) && (!is_string($array1[$i]))) && + ((is_numeric($array2[$i])) && (!is_string($array2[$i])))) { + $result += ($array1[$i] * $array1[$i]) - ($array2[$i] * $array2[$i]); + } + } + + return $result; + } + + + /** + * SUMX2PY2 + * + * @param mixed[] $matrixData1 Matrix #1 + * @param mixed[] $matrixData2 Matrix #2 + * @return float + */ + public static function SUMX2PY2($matrixData1, $matrixData2) + { + $array1 = PHPExcel_Calculation_Functions::flattenArray($matrixData1); + $array2 = PHPExcel_Calculation_Functions::flattenArray($matrixData2); + $count = min(count($array1), count($array2)); + + $result = 0; + for ($i = 0; $i < $count; ++$i) { + if (((is_numeric($array1[$i])) && (!is_string($array1[$i]))) && + ((is_numeric($array2[$i])) && (!is_string($array2[$i])))) { + $result += ($array1[$i] * $array1[$i]) + ($array2[$i] * $array2[$i]); + } + } + + return $result; + } + + + /** + * SUMXMY2 + * + * @param mixed[] $matrixData1 Matrix #1 + * @param mixed[] $matrixData2 Matrix #2 + * @return float + */ + public static function SUMXMY2($matrixData1, $matrixData2) + { + $array1 = PHPExcel_Calculation_Functions::flattenArray($matrixData1); + $array2 = PHPExcel_Calculation_Functions::flattenArray($matrixData2); + $count = min(count($array1), count($array2)); + + $result = 0; + for ($i = 0; $i < $count; ++$i) { + if (((is_numeric($array1[$i])) && (!is_string($array1[$i]))) && + ((is_numeric($array2[$i])) && (!is_string($array2[$i])))) { + $result += ($array1[$i] - $array2[$i]) * ($array1[$i] - $array2[$i]); + } + } + + return $result; + } + + + /** + * TRUNC + * + * Truncates value to the number of fractional digits by number_digits. + * + * @param float $value + * @param int $digits + * @return float Truncated value + */ + public static function TRUNC($value = 0, $digits = 0) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $digits = PHPExcel_Calculation_Functions::flattenSingleValue($digits); + + // Validate parameters + if ((!is_numeric($value)) || (!is_numeric($digits))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $digits = floor($digits); + + // Truncate + $adjust = pow(10, $digits); + + if (($digits > 0) && (rtrim(intval((abs($value) - abs(intval($value))) * $adjust), '0') < $adjust/10)) { + return $value; + } + + return (intval($value * $adjust)) / $adjust; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Calculation/Statistical.php b/application/third_party/PHPExcel/PHPExcel/Calculation/Statistical.php new file mode 100644 index 0000000..1a33610 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Calculation/Statistical.php @@ -0,0 +1,3745 @@ + $value) { + if ((is_bool($value)) || (is_string($value)) || (is_null($value))) { + unset($array1[$key]); + unset($array2[$key]); + } + } + foreach ($array2 as $key => $value) { + if ((is_bool($value)) || (is_string($value)) || (is_null($value))) { + unset($array1[$key]); + unset($array2[$key]); + } + } + $array1 = array_merge($array1); + $array2 = array_merge($array2); + + return true; + } + + + /** + * Beta function. + * + * @author Jaco van Kooten + * + * @param p require p>0 + * @param q require q>0 + * @return 0 if p<=0, q<=0 or p+q>2.55E305 to avoid errors and over/underflow + */ + private static function beta($p, $q) + { + if ($p <= 0.0 || $q <= 0.0 || ($p + $q) > LOG_GAMMA_X_MAX_VALUE) { + return 0.0; + } else { + return exp(self::logBeta($p, $q)); + } + } + + + /** + * Incomplete beta function + * + * @author Jaco van Kooten + * @author Paul Meagher + * + * The computation is based on formulas from Numerical Recipes, Chapter 6.4 (W.H. Press et al, 1992). + * @param x require 0<=x<=1 + * @param p require p>0 + * @param q require q>0 + * @return 0 if x<0, p<=0, q<=0 or p+q>2.55E305 and 1 if x>1 to avoid errors and over/underflow + */ + private static function incompleteBeta($x, $p, $q) + { + if ($x <= 0.0) { + return 0.0; + } elseif ($x >= 1.0) { + return 1.0; + } elseif (($p <= 0.0) || ($q <= 0.0) || (($p + $q) > LOG_GAMMA_X_MAX_VALUE)) { + return 0.0; + } + $beta_gam = exp((0 - self::logBeta($p, $q)) + $p * log($x) + $q * log(1.0 - $x)); + if ($x < ($p + 1.0) / ($p + $q + 2.0)) { + return $beta_gam * self::betaFraction($x, $p, $q) / $p; + } else { + return 1.0 - ($beta_gam * self::betaFraction(1 - $x, $q, $p) / $q); + } + } + + + // Function cache for logBeta function + private static $logBetaCacheP = 0.0; + private static $logBetaCacheQ = 0.0; + private static $logBetaCacheResult = 0.0; + + /** + * The natural logarithm of the beta function. + * + * @param p require p>0 + * @param q require q>0 + * @return 0 if p<=0, q<=0 or p+q>2.55E305 to avoid errors and over/underflow + * @author Jaco van Kooten + */ + private static function logBeta($p, $q) + { + if ($p != self::$logBetaCacheP || $q != self::$logBetaCacheQ) { + self::$logBetaCacheP = $p; + self::$logBetaCacheQ = $q; + if (($p <= 0.0) || ($q <= 0.0) || (($p + $q) > LOG_GAMMA_X_MAX_VALUE)) { + self::$logBetaCacheResult = 0.0; + } else { + self::$logBetaCacheResult = self::logGamma($p) + self::logGamma($q) - self::logGamma($p + $q); + } + } + return self::$logBetaCacheResult; + } + + + /** + * Evaluates of continued fraction part of incomplete beta function. + * Based on an idea from Numerical Recipes (W.H. Press et al, 1992). + * @author Jaco van Kooten + */ + private static function betaFraction($x, $p, $q) + { + $c = 1.0; + $sum_pq = $p + $q; + $p_plus = $p + 1.0; + $p_minus = $p - 1.0; + $h = 1.0 - $sum_pq * $x / $p_plus; + if (abs($h) < XMININ) { + $h = XMININ; + } + $h = 1.0 / $h; + $frac = $h; + $m = 1; + $delta = 0.0; + while ($m <= MAX_ITERATIONS && abs($delta-1.0) > PRECISION) { + $m2 = 2 * $m; + // even index for d + $d = $m * ($q - $m) * $x / ( ($p_minus + $m2) * ($p + $m2)); + $h = 1.0 + $d * $h; + if (abs($h) < XMININ) { + $h = XMININ; + } + $h = 1.0 / $h; + $c = 1.0 + $d / $c; + if (abs($c) < XMININ) { + $c = XMININ; + } + $frac *= $h * $c; + // odd index for d + $d = -($p + $m) * ($sum_pq + $m) * $x / (($p + $m2) * ($p_plus + $m2)); + $h = 1.0 + $d * $h; + if (abs($h) < XMININ) { + $h = XMININ; + } + $h = 1.0 / $h; + $c = 1.0 + $d / $c; + if (abs($c) < XMININ) { + $c = XMININ; + } + $delta = $h * $c; + $frac *= $delta; + ++$m; + } + return $frac; + } + + + /** + * logGamma function + * + * @version 1.1 + * @author Jaco van Kooten + * + * Original author was Jaco van Kooten. Ported to PHP by Paul Meagher. + * + * The natural logarithm of the gamma function.
+ * Based on public domain NETLIB (Fortran) code by W. J. Cody and L. Stoltz
+ * Applied Mathematics Division
+ * Argonne National Laboratory
+ * Argonne, IL 60439
+ *

+ * References: + *

    + *
  1. W. J. Cody and K. E. Hillstrom, 'Chebyshev Approximations for the Natural + * Logarithm of the Gamma Function,' Math. Comp. 21, 1967, pp. 198-203.
  2. + *
  3. K. E. Hillstrom, ANL/AMD Program ANLC366S, DGAMMA/DLGAMA, May, 1969.
  4. + *
  5. Hart, Et. Al., Computer Approximations, Wiley and sons, New York, 1968.
  6. + *
+ *

+ *

+ * From the original documentation: + *

+ *

+ * This routine calculates the LOG(GAMMA) function for a positive real argument X. + * Computation is based on an algorithm outlined in references 1 and 2. + * The program uses rational functions that theoretically approximate LOG(GAMMA) + * to at least 18 significant decimal digits. The approximation for X > 12 is from + * reference 3, while approximations for X < 12.0 are similar to those in reference + * 1, but are unpublished. The accuracy achieved depends on the arithmetic system, + * the compiler, the intrinsic functions, and proper selection of the + * machine-dependent constants. + *

+ *

+ * Error returns:
+ * The program returns the value XINF for X .LE. 0.0 or when overflow would occur. + * The computation is believed to be free of underflow and overflow. + *

+ * @return MAX_VALUE for x < 0.0 or when overflow would occur, i.e. x > 2.55E305 + */ + + // Function cache for logGamma + private static $logGammaCacheResult = 0.0; + private static $logGammaCacheX = 0.0; + + private static function logGamma($x) + { + // Log Gamma related constants + static $lg_d1 = -0.5772156649015328605195174; + static $lg_d2 = 0.4227843350984671393993777; + static $lg_d4 = 1.791759469228055000094023; + + static $lg_p1 = array( + 4.945235359296727046734888, + 201.8112620856775083915565, + 2290.838373831346393026739, + 11319.67205903380828685045, + 28557.24635671635335736389, + 38484.96228443793359990269, + 26377.48787624195437963534, + 7225.813979700288197698961 + ); + static $lg_p2 = array( + 4.974607845568932035012064, + 542.4138599891070494101986, + 15506.93864978364947665077, + 184793.2904445632425417223, + 1088204.76946882876749847, + 3338152.967987029735917223, + 5106661.678927352456275255, + 3074109.054850539556250927 + ); + static $lg_p4 = array( + 14745.02166059939948905062, + 2426813.369486704502836312, + 121475557.4045093227939592, + 2663432449.630976949898078, + 29403789566.34553899906876, + 170266573776.5398868392998, + 492612579337.743088758812, + 560625185622.3951465078242 + ); + static $lg_q1 = array( + 67.48212550303777196073036, + 1113.332393857199323513008, + 7738.757056935398733233834, + 27639.87074403340708898585, + 54993.10206226157329794414, + 61611.22180066002127833352, + 36351.27591501940507276287, + 8785.536302431013170870835 + ); + static $lg_q2 = array( + 183.0328399370592604055942, + 7765.049321445005871323047, + 133190.3827966074194402448, + 1136705.821321969608938755, + 5267964.117437946917577538, + 13467014.54311101692290052, + 17827365.30353274213975932, + 9533095.591844353613395747 + ); + static $lg_q4 = array( + 2690.530175870899333379843, + 639388.5654300092398984238, + 41355999.30241388052042842, + 1120872109.61614794137657, + 14886137286.78813811542398, + 101680358627.2438228077304, + 341747634550.7377132798597, + 446315818741.9713286462081 + ); + static $lg_c = array( + -0.001910444077728, + 8.4171387781295e-4, + -5.952379913043012e-4, + 7.93650793500350248e-4, + -0.002777777777777681622553, + 0.08333333333333333331554247, + 0.0057083835261 + ); + + // Rough estimate of the fourth root of logGamma_xBig + static $lg_frtbig = 2.25e76; + static $pnt68 = 0.6796875; + + + if ($x == self::$logGammaCacheX) { + return self::$logGammaCacheResult; + } + $y = $x; + if ($y > 0.0 && $y <= LOG_GAMMA_X_MAX_VALUE) { + if ($y <= EPS) { + $res = -log(y); + } elseif ($y <= 1.5) { + // --------------------- + // EPS .LT. X .LE. 1.5 + // --------------------- + if ($y < $pnt68) { + $corr = -log($y); + $xm1 = $y; + } else { + $corr = 0.0; + $xm1 = $y - 1.0; + } + if ($y <= 0.5 || $y >= $pnt68) { + $xden = 1.0; + $xnum = 0.0; + for ($i = 0; $i < 8; ++$i) { + $xnum = $xnum * $xm1 + $lg_p1[$i]; + $xden = $xden * $xm1 + $lg_q1[$i]; + } + $res = $corr + $xm1 * ($lg_d1 + $xm1 * ($xnum / $xden)); + } else { + $xm2 = $y - 1.0; + $xden = 1.0; + $xnum = 0.0; + for ($i = 0; $i < 8; ++$i) { + $xnum = $xnum * $xm2 + $lg_p2[$i]; + $xden = $xden * $xm2 + $lg_q2[$i]; + } + $res = $corr + $xm2 * ($lg_d2 + $xm2 * ($xnum / $xden)); + } + } elseif ($y <= 4.0) { + // --------------------- + // 1.5 .LT. X .LE. 4.0 + // --------------------- + $xm2 = $y - 2.0; + $xden = 1.0; + $xnum = 0.0; + for ($i = 0; $i < 8; ++$i) { + $xnum = $xnum * $xm2 + $lg_p2[$i]; + $xden = $xden * $xm2 + $lg_q2[$i]; + } + $res = $xm2 * ($lg_d2 + $xm2 * ($xnum / $xden)); + } elseif ($y <= 12.0) { + // ---------------------- + // 4.0 .LT. X .LE. 12.0 + // ---------------------- + $xm4 = $y - 4.0; + $xden = -1.0; + $xnum = 0.0; + for ($i = 0; $i < 8; ++$i) { + $xnum = $xnum * $xm4 + $lg_p4[$i]; + $xden = $xden * $xm4 + $lg_q4[$i]; + } + $res = $lg_d4 + $xm4 * ($xnum / $xden); + } else { + // --------------------------------- + // Evaluate for argument .GE. 12.0 + // --------------------------------- + $res = 0.0; + if ($y <= $lg_frtbig) { + $res = $lg_c[6]; + $ysq = $y * $y; + for ($i = 0; $i < 6; ++$i) { + $res = $res / $ysq + $lg_c[$i]; + } + $res /= $y; + $corr = log($y); + $res = $res + log(SQRT2PI) - 0.5 * $corr; + $res += $y * ($corr - 1.0); + } + } + } else { + // -------------------------- + // Return for bad arguments + // -------------------------- + $res = MAX_VALUE; + } + // ------------------------------ + // Final adjustments and return + // ------------------------------ + self::$logGammaCacheX = $x; + self::$logGammaCacheResult = $res; + return $res; + } + + + // + // Private implementation of the incomplete Gamma function + // + private static function incompleteGamma($a, $x) + { + static $max = 32; + $summer = 0; + for ($n=0; $n<=$max; ++$n) { + $divisor = $a; + for ($i=1; $i<=$n; ++$i) { + $divisor *= ($a + $i); + } + $summer += (pow($x, $n) / $divisor); + } + return pow($x, $a) * exp(0-$x) * $summer; + } + + + // + // Private implementation of the Gamma function + // + private static function gamma($data) + { + if ($data == 0.0) { + return 0; + } + + static $p0 = 1.000000000190015; + static $p = array( + 1 => 76.18009172947146, + 2 => -86.50532032941677, + 3 => 24.01409824083091, + 4 => -1.231739572450155, + 5 => 1.208650973866179e-3, + 6 => -5.395239384953e-6 + ); + + $y = $x = $data; + $tmp = $x + 5.5; + $tmp -= ($x + 0.5) * log($tmp); + + $summer = $p0; + for ($j=1; $j<=6; ++$j) { + $summer += ($p[$j] / ++$y); + } + return exp(0 - $tmp + log(SQRT2PI * $summer / $x)); + } + + + /*************************************************************************** + * inverse_ncdf.php + * ------------------- + * begin : Friday, January 16, 2004 + * copyright : (C) 2004 Michael Nickerson + * email : nickersonm@yahoo.com + * + ***************************************************************************/ + private static function inverseNcdf($p) + { + // Inverse ncdf approximation by Peter J. Acklam, implementation adapted to + // PHP by Michael Nickerson, using Dr. Thomas Ziegler's C implementation as + // a guide. http://home.online.no/~pjacklam/notes/invnorm/index.html + // I have not checked the accuracy of this implementation. Be aware that PHP + // will truncate the coeficcients to 14 digits. + + // You have permission to use and distribute this function freely for + // whatever purpose you want, but please show common courtesy and give credit + // where credit is due. + + // Input paramater is $p - probability - where 0 < p < 1. + + // Coefficients in rational approximations + static $a = array( + 1 => -3.969683028665376e+01, + 2 => 2.209460984245205e+02, + 3 => -2.759285104469687e+02, + 4 => 1.383577518672690e+02, + 5 => -3.066479806614716e+01, + 6 => 2.506628277459239e+00 + ); + + static $b = array( + 1 => -5.447609879822406e+01, + 2 => 1.615858368580409e+02, + 3 => -1.556989798598866e+02, + 4 => 6.680131188771972e+01, + 5 => -1.328068155288572e+01 + ); + + static $c = array( + 1 => -7.784894002430293e-03, + 2 => -3.223964580411365e-01, + 3 => -2.400758277161838e+00, + 4 => -2.549732539343734e+00, + 5 => 4.374664141464968e+00, + 6 => 2.938163982698783e+00 + ); + + static $d = array( + 1 => 7.784695709041462e-03, + 2 => 3.224671290700398e-01, + 3 => 2.445134137142996e+00, + 4 => 3.754408661907416e+00 + ); + + // Define lower and upper region break-points. + $p_low = 0.02425; //Use lower region approx. below this + $p_high = 1 - $p_low; //Use upper region approx. above this + + if (0 < $p && $p < $p_low) { + // Rational approximation for lower region. + $q = sqrt(-2 * log($p)); + return ((((($c[1] * $q + $c[2]) * $q + $c[3]) * $q + $c[4]) * $q + $c[5]) * $q + $c[6]) / + (((($d[1] * $q + $d[2]) * $q + $d[3]) * $q + $d[4]) * $q + 1); + } elseif ($p_low <= $p && $p <= $p_high) { + // Rational approximation for central region. + $q = $p - 0.5; + $r = $q * $q; + return ((((($a[1] * $r + $a[2]) * $r + $a[3]) * $r + $a[4]) * $r + $a[5]) * $r + $a[6]) * $q / + ((((($b[1] * $r + $b[2]) * $r + $b[3]) * $r + $b[4]) * $r + $b[5]) * $r + 1); + } elseif ($p_high < $p && $p < 1) { + // Rational approximation for upper region. + $q = sqrt(-2 * log(1 - $p)); + return -((((($c[1] * $q + $c[2]) * $q + $c[3]) * $q + $c[4]) * $q + $c[5]) * $q + $c[6]) / + (((($d[1] * $q + $d[2]) * $q + $d[3]) * $q + $d[4]) * $q + 1); + } + // If 0 < p < 1, return a null value + return PHPExcel_Calculation_Functions::NULL(); + } + + + private static function inverseNcdf2($prob) + { + // Approximation of inverse standard normal CDF developed by + // B. Moro, "The Full Monte," Risk 8(2), Feb 1995, 57-58. + + $a1 = 2.50662823884; + $a2 = -18.61500062529; + $a3 = 41.39119773534; + $a4 = -25.44106049637; + + $b1 = -8.4735109309; + $b2 = 23.08336743743; + $b3 = -21.06224101826; + $b4 = 3.13082909833; + + $c1 = 0.337475482272615; + $c2 = 0.976169019091719; + $c3 = 0.160797971491821; + $c4 = 2.76438810333863E-02; + $c5 = 3.8405729373609E-03; + $c6 = 3.951896511919E-04; + $c7 = 3.21767881768E-05; + $c8 = 2.888167364E-07; + $c9 = 3.960315187E-07; + + $y = $prob - 0.5; + if (abs($y) < 0.42) { + $z = ($y * $y); + $z = $y * ((($a4 * $z + $a3) * $z + $a2) * $z + $a1) / (((($b4 * $z + $b3) * $z + $b2) * $z + $b1) * $z + 1); + } else { + if ($y > 0) { + $z = log(-log(1 - $prob)); + } else { + $z = log(-log($prob)); + } + $z = $c1 + $z * ($c2 + $z * ($c3 + $z * ($c4 + $z * ($c5 + $z * ($c6 + $z * ($c7 + $z * ($c8 + $z * $c9))))))); + if ($y < 0) { + $z = -$z; + } + } + return $z; + } // function inverseNcdf2() + + + private static function inverseNcdf3($p) + { + // ALGORITHM AS241 APPL. STATIST. (1988) VOL. 37, NO. 3. + // Produces the normal deviate Z corresponding to a given lower + // tail area of P; Z is accurate to about 1 part in 10**16. + // + // This is a PHP version of the original FORTRAN code that can + // be found at http://lib.stat.cmu.edu/apstat/ + $split1 = 0.425; + $split2 = 5; + $const1 = 0.180625; + $const2 = 1.6; + + // coefficients for p close to 0.5 + $a0 = 3.3871328727963666080; + $a1 = 1.3314166789178437745E+2; + $a2 = 1.9715909503065514427E+3; + $a3 = 1.3731693765509461125E+4; + $a4 = 4.5921953931549871457E+4; + $a5 = 6.7265770927008700853E+4; + $a6 = 3.3430575583588128105E+4; + $a7 = 2.5090809287301226727E+3; + + $b1 = 4.2313330701600911252E+1; + $b2 = 6.8718700749205790830E+2; + $b3 = 5.3941960214247511077E+3; + $b4 = 2.1213794301586595867E+4; + $b5 = 3.9307895800092710610E+4; + $b6 = 2.8729085735721942674E+4; + $b7 = 5.2264952788528545610E+3; + + // coefficients for p not close to 0, 0.5 or 1. + $c0 = 1.42343711074968357734; + $c1 = 4.63033784615654529590; + $c2 = 5.76949722146069140550; + $c3 = 3.64784832476320460504; + $c4 = 1.27045825245236838258; + $c5 = 2.41780725177450611770E-1; + $c6 = 2.27238449892691845833E-2; + $c7 = 7.74545014278341407640E-4; + + $d1 = 2.05319162663775882187; + $d2 = 1.67638483018380384940; + $d3 = 6.89767334985100004550E-1; + $d4 = 1.48103976427480074590E-1; + $d5 = 1.51986665636164571966E-2; + $d6 = 5.47593808499534494600E-4; + $d7 = 1.05075007164441684324E-9; + + // coefficients for p near 0 or 1. + $e0 = 6.65790464350110377720; + $e1 = 5.46378491116411436990; + $e2 = 1.78482653991729133580; + $e3 = 2.96560571828504891230E-1; + $e4 = 2.65321895265761230930E-2; + $e5 = 1.24266094738807843860E-3; + $e6 = 2.71155556874348757815E-5; + $e7 = 2.01033439929228813265E-7; + + $f1 = 5.99832206555887937690E-1; + $f2 = 1.36929880922735805310E-1; + $f3 = 1.48753612908506148525E-2; + $f4 = 7.86869131145613259100E-4; + $f5 = 1.84631831751005468180E-5; + $f6 = 1.42151175831644588870E-7; + $f7 = 2.04426310338993978564E-15; + + $q = $p - 0.5; + + // computation for p close to 0.5 + if (abs($q) <= split1) { + $R = $const1 - $q * $q; + $z = $q * ((((((($a7 * $R + $a6) * $R + $a5) * $R + $a4) * $R + $a3) * $R + $a2) * $R + $a1) * $R + $a0) / + ((((((($b7 * $R + $b6) * $R + $b5) * $R + $b4) * $R + $b3) * $R + $b2) * $R + $b1) * $R + 1); + } else { + if ($q < 0) { + $R = $p; + } else { + $R = 1 - $p; + } + $R = pow(-log($R), 2); + + // computation for p not close to 0, 0.5 or 1. + if ($R <= $split2) { + $R = $R - $const2; + $z = ((((((($c7 * $R + $c6) * $R + $c5) * $R + $c4) * $R + $c3) * $R + $c2) * $R + $c1) * $R + $c0) / + ((((((($d7 * $R + $d6) * $R + $d5) * $R + $d4) * $R + $d3) * $R + $d2) * $R + $d1) * $R + 1); + } else { + // computation for p near 0 or 1. + $R = $R - $split2; + $z = ((((((($e7 * $R + $e6) * $R + $e5) * $R + $e4) * $R + $e3) * $R + $e2) * $R + $e1) * $R + $e0) / + ((((((($f7 * $R + $f6) * $R + $f5) * $R + $f4) * $R + $f3) * $R + $f2) * $R + $f1) * $R + 1); + } + if ($q < 0) { + $z = -$z; + } + } + return $z; + } + + + /** + * AVEDEV + * + * Returns the average of the absolute deviations of data points from their mean. + * AVEDEV is a measure of the variability in a data set. + * + * Excel Function: + * AVEDEV(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function AVEDEV() + { + $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()); + + // Return value + $returnValue = null; + + $aMean = self::AVERAGE($aArgs); + if ($aMean != PHPExcel_Calculation_Functions::DIV0()) { + $aCount = 0; + foreach ($aArgs as $k => $arg) { + if ((is_bool($arg)) && + ((!PHPExcel_Calculation_Functions::isCellValue($k)) || (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE))) { + $arg = (integer) $arg; + } + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + if (is_null($returnValue)) { + $returnValue = abs($arg - $aMean); + } else { + $returnValue += abs($arg - $aMean); + } + ++$aCount; + } + } + + // Return + if ($aCount == 0) { + return PHPExcel_Calculation_Functions::DIV0(); + } + return $returnValue / $aCount; + } + return PHPExcel_Calculation_Functions::NaN(); + } + + + /** + * AVERAGE + * + * Returns the average (arithmetic mean) of the arguments + * + * Excel Function: + * AVERAGE(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function AVERAGE() + { + $returnValue = $aCount = 0; + + // Loop through arguments + foreach (PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()) as $k => $arg) { + if ((is_bool($arg)) && + ((!PHPExcel_Calculation_Functions::isCellValue($k)) || (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE))) { + $arg = (integer) $arg; + } + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + if (is_null($returnValue)) { + $returnValue = $arg; + } else { + $returnValue += $arg; + } + ++$aCount; + } + } + + // Return + if ($aCount > 0) { + return $returnValue / $aCount; + } else { + return PHPExcel_Calculation_Functions::DIV0(); + } + } + + + /** + * AVERAGEA + * + * Returns the average of its arguments, including numbers, text, and logical values + * + * Excel Function: + * AVERAGEA(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function AVERAGEA() + { + $returnValue = null; + + $aCount = 0; + // Loop through arguments + foreach (PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()) as $k => $arg) { + if ((is_bool($arg)) && + (!PHPExcel_Calculation_Functions::isMatrixValue($k))) { + } else { + if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) && ($arg != '')))) { + if (is_bool($arg)) { + $arg = (integer) $arg; + } elseif (is_string($arg)) { + $arg = 0; + } + if (is_null($returnValue)) { + $returnValue = $arg; + } else { + $returnValue += $arg; + } + ++$aCount; + } + } + } + + if ($aCount > 0) { + return $returnValue / $aCount; + } else { + return PHPExcel_Calculation_Functions::DIV0(); + } + } + + + /** + * AVERAGEIF + * + * Returns the average value from a range of cells that contain numbers within the list of arguments + * + * Excel Function: + * AVERAGEIF(value1[,value2[, ...]],condition) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @param string $condition The criteria that defines which cells will be checked. + * @param mixed[] $averageArgs Data values + * @return float + */ + public static function AVERAGEIF($aArgs, $condition, $averageArgs = array()) + { + $returnValue = 0; + + $aArgs = PHPExcel_Calculation_Functions::flattenArray($aArgs); + $averageArgs = PHPExcel_Calculation_Functions::flattenArray($averageArgs); + if (empty($averageArgs)) { + $averageArgs = $aArgs; + } + $condition = PHPExcel_Calculation_Functions::ifCondition($condition); + // Loop through arguments + $aCount = 0; + foreach ($aArgs as $key => $arg) { + if (!is_numeric($arg)) { + $arg = PHPExcel_Calculation::wrapResult(strtoupper($arg)); + } + $testCondition = '='.$arg.$condition; + if (PHPExcel_Calculation::getInstance()->_calculateFormulaValue($testCondition)) { + if ((is_null($returnValue)) || ($arg > $returnValue)) { + $returnValue += $arg; + ++$aCount; + } + } + } + + if ($aCount > 0) { + return $returnValue / $aCount; + } + return PHPExcel_Calculation_Functions::DIV0(); + } + + + /** + * BETADIST + * + * Returns the beta distribution. + * + * @param float $value Value at which you want to evaluate the distribution + * @param float $alpha Parameter to the distribution + * @param float $beta Parameter to the distribution + * @param boolean $cumulative + * @return float + * + */ + public static function BETADIST($value, $alpha, $beta, $rMin = 0, $rMax = 1) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $alpha = PHPExcel_Calculation_Functions::flattenSingleValue($alpha); + $beta = PHPExcel_Calculation_Functions::flattenSingleValue($beta); + $rMin = PHPExcel_Calculation_Functions::flattenSingleValue($rMin); + $rMax = PHPExcel_Calculation_Functions::flattenSingleValue($rMax); + + if ((is_numeric($value)) && (is_numeric($alpha)) && (is_numeric($beta)) && (is_numeric($rMin)) && (is_numeric($rMax))) { + if (($value < $rMin) || ($value > $rMax) || ($alpha <= 0) || ($beta <= 0) || ($rMin == $rMax)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ($rMin > $rMax) { + $tmp = $rMin; + $rMin = $rMax; + $rMax = $tmp; + } + $value -= $rMin; + $value /= ($rMax - $rMin); + return self::incompleteBeta($value, $alpha, $beta); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * BETAINV + * + * Returns the inverse of the beta distribution. + * + * @param float $probability Probability at which you want to evaluate the distribution + * @param float $alpha Parameter to the distribution + * @param float $beta Parameter to the distribution + * @param float $rMin Minimum value + * @param float $rMax Maximum value + * @param boolean $cumulative + * @return float + * + */ + public static function BETAINV($probability, $alpha, $beta, $rMin = 0, $rMax = 1) + { + $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability); + $alpha = PHPExcel_Calculation_Functions::flattenSingleValue($alpha); + $beta = PHPExcel_Calculation_Functions::flattenSingleValue($beta); + $rMin = PHPExcel_Calculation_Functions::flattenSingleValue($rMin); + $rMax = PHPExcel_Calculation_Functions::flattenSingleValue($rMax); + + if ((is_numeric($probability)) && (is_numeric($alpha)) && (is_numeric($beta)) && (is_numeric($rMin)) && (is_numeric($rMax))) { + if (($alpha <= 0) || ($beta <= 0) || ($rMin == $rMax) || ($probability <= 0) || ($probability > 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ($rMin > $rMax) { + $tmp = $rMin; + $rMin = $rMax; + $rMax = $tmp; + } + $a = 0; + $b = 2; + + $i = 0; + while ((($b - $a) > PRECISION) && ($i++ < MAX_ITERATIONS)) { + $guess = ($a + $b) / 2; + $result = self::BETADIST($guess, $alpha, $beta); + if (($result == $probability) || ($result == 0)) { + $b = $a; + } elseif ($result > $probability) { + $b = $guess; + } else { + $a = $guess; + } + } + if ($i == MAX_ITERATIONS) { + return PHPExcel_Calculation_Functions::NA(); + } + return round($rMin + $guess * ($rMax - $rMin), 12); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * BINOMDIST + * + * Returns the individual term binomial distribution probability. Use BINOMDIST in problems with + * a fixed number of tests or trials, when the outcomes of any trial are only success or failure, + * when trials are independent, and when the probability of success is constant throughout the + * experiment. For example, BINOMDIST can calculate the probability that two of the next three + * babies born are male. + * + * @param float $value Number of successes in trials + * @param float $trials Number of trials + * @param float $probability Probability of success on each trial + * @param boolean $cumulative + * @return float + * + * @todo Cumulative distribution function + * + */ + public static function BINOMDIST($value, $trials, $probability, $cumulative) + { + $value = floor(PHPExcel_Calculation_Functions::flattenSingleValue($value)); + $trials = floor(PHPExcel_Calculation_Functions::flattenSingleValue($trials)); + $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability); + + if ((is_numeric($value)) && (is_numeric($trials)) && (is_numeric($probability))) { + if (($value < 0) || ($value > $trials)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (($probability < 0) || ($probability > 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ((is_numeric($cumulative)) || (is_bool($cumulative))) { + if ($cumulative) { + $summer = 0; + for ($i = 0; $i <= $value; ++$i) { + $summer += PHPExcel_Calculation_MathTrig::COMBIN($trials, $i) * pow($probability, $i) * pow(1 - $probability, $trials - $i); + } + return $summer; + } else { + return PHPExcel_Calculation_MathTrig::COMBIN($trials, $value) * pow($probability, $value) * pow(1 - $probability, $trials - $value) ; + } + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * CHIDIST + * + * Returns the one-tailed probability of the chi-squared distribution. + * + * @param float $value Value for the function + * @param float $degrees degrees of freedom + * @return float + */ + public static function CHIDIST($value, $degrees) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $degrees = floor(PHPExcel_Calculation_Functions::flattenSingleValue($degrees)); + + if ((is_numeric($value)) && (is_numeric($degrees))) { + if ($degrees < 1) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ($value < 0) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) { + return 1; + } + return PHPExcel_Calculation_Functions::NaN(); + } + return 1 - (self::incompleteGamma($degrees/2, $value/2) / self::gamma($degrees/2)); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * CHIINV + * + * Returns the one-tailed probability of the chi-squared distribution. + * + * @param float $probability Probability for the function + * @param float $degrees degrees of freedom + * @return float + */ + public static function CHIINV($probability, $degrees) + { + $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability); + $degrees = floor(PHPExcel_Calculation_Functions::flattenSingleValue($degrees)); + + if ((is_numeric($probability)) && (is_numeric($degrees))) { + $xLo = 100; + $xHi = 0; + + $x = $xNew = 1; + $dx = 1; + $i = 0; + + while ((abs($dx) > PRECISION) && ($i++ < MAX_ITERATIONS)) { + // Apply Newton-Raphson step + $result = self::CHIDIST($x, $degrees); + $error = $result - $probability; + if ($error == 0.0) { + $dx = 0; + } elseif ($error < 0.0) { + $xLo = $x; + } else { + $xHi = $x; + } + // Avoid division by zero + if ($result != 0.0) { + $dx = $error / $result; + $xNew = $x - $dx; + } + // If the NR fails to converge (which for example may be the + // case if the initial guess is too rough) we apply a bisection + // step to determine a more narrow interval around the root. + if (($xNew < $xLo) || ($xNew > $xHi) || ($result == 0.0)) { + $xNew = ($xLo + $xHi) / 2; + $dx = $xNew - $x; + } + $x = $xNew; + } + if ($i == MAX_ITERATIONS) { + return PHPExcel_Calculation_Functions::NA(); + } + return round($x, 12); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * CONFIDENCE + * + * Returns the confidence interval for a population mean + * + * @param float $alpha + * @param float $stdDev Standard Deviation + * @param float $size + * @return float + * + */ + public static function CONFIDENCE($alpha, $stdDev, $size) + { + $alpha = PHPExcel_Calculation_Functions::flattenSingleValue($alpha); + $stdDev = PHPExcel_Calculation_Functions::flattenSingleValue($stdDev); + $size = floor(PHPExcel_Calculation_Functions::flattenSingleValue($size)); + + if ((is_numeric($alpha)) && (is_numeric($stdDev)) && (is_numeric($size))) { + if (($alpha <= 0) || ($alpha >= 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (($stdDev <= 0) || ($size < 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + return self::NORMSINV(1 - $alpha / 2) * $stdDev / sqrt($size); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * CORREL + * + * Returns covariance, the average of the products of deviations for each data point pair. + * + * @param array of mixed Data Series Y + * @param array of mixed Data Series X + * @return float + */ + public static function CORREL($yValues, $xValues = null) + { + if ((is_null($xValues)) || (!is_array($yValues)) || (!is_array($xValues))) { + return PHPExcel_Calculation_Functions::VALUE(); + } + if (!self::checkTrendArrays($yValues, $xValues)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $yValueCount = count($yValues); + $xValueCount = count($xValues); + + if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { + return PHPExcel_Calculation_Functions::NA(); + } elseif ($yValueCount == 1) { + return PHPExcel_Calculation_Functions::DIV0(); + } + + $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR, $yValues, $xValues); + return $bestFitLinear->getCorrelation(); + } + + + /** + * COUNT + * + * Counts the number of cells that contain numbers within the list of arguments + * + * Excel Function: + * COUNT(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return int + */ + public static function COUNT() + { + $returnValue = 0; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()); + foreach ($aArgs as $k => $arg) { + if ((is_bool($arg)) && + ((!PHPExcel_Calculation_Functions::isCellValue($k)) || (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE))) { + $arg = (integer) $arg; + } + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + ++$returnValue; + } + } + + return $returnValue; + } + + + /** + * COUNTA + * + * Counts the number of cells that are not empty within the list of arguments + * + * Excel Function: + * COUNTA(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return int + */ + public static function COUNTA() + { + $returnValue = 0; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + foreach ($aArgs as $arg) { + // Is it a numeric, boolean or string value? + if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) && ($arg != '')))) { + ++$returnValue; + } + } + + return $returnValue; + } + + + /** + * COUNTBLANK + * + * Counts the number of empty cells within the list of arguments + * + * Excel Function: + * COUNTBLANK(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return int + */ + public static function COUNTBLANK() + { + $returnValue = 0; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + foreach ($aArgs as $arg) { + // Is it a blank cell? + if ((is_null($arg)) || ((is_string($arg)) && ($arg == ''))) { + ++$returnValue; + } + } + + return $returnValue; + } + + + /** + * COUNTIF + * + * Counts the number of cells that contain numbers within the list of arguments + * + * Excel Function: + * COUNTIF(value1[,value2[, ...]],condition) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @param string $condition The criteria that defines which cells will be counted. + * @return int + */ + public static function COUNTIF($aArgs, $condition) + { + $returnValue = 0; + + $aArgs = PHPExcel_Calculation_Functions::flattenArray($aArgs); + $condition = PHPExcel_Calculation_Functions::ifCondition($condition); + // Loop through arguments + foreach ($aArgs as $arg) { + if (!is_numeric($arg)) { + $arg = PHPExcel_Calculation::wrapResult(strtoupper($arg)); + } + $testCondition = '='.$arg.$condition; + if (PHPExcel_Calculation::getInstance()->_calculateFormulaValue($testCondition)) { + // Is it a value within our criteria + ++$returnValue; + } + } + + return $returnValue; + } + + + /** + * COVAR + * + * Returns covariance, the average of the products of deviations for each data point pair. + * + * @param array of mixed Data Series Y + * @param array of mixed Data Series X + * @return float + */ + public static function COVAR($yValues, $xValues) + { + if (!self::checkTrendArrays($yValues, $xValues)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $yValueCount = count($yValues); + $xValueCount = count($xValues); + + if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { + return PHPExcel_Calculation_Functions::NA(); + } elseif ($yValueCount == 1) { + return PHPExcel_Calculation_Functions::DIV0(); + } + + $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR, $yValues, $xValues); + return $bestFitLinear->getCovariance(); + } + + + /** + * CRITBINOM + * + * Returns the smallest value for which the cumulative binomial distribution is greater + * than or equal to a criterion value + * + * See http://support.microsoft.com/kb/828117/ for details of the algorithm used + * + * @param float $trials number of Bernoulli trials + * @param float $probability probability of a success on each trial + * @param float $alpha criterion value + * @return int + * + * @todo Warning. This implementation differs from the algorithm detailed on the MS + * web site in that $CumPGuessMinus1 = $CumPGuess - 1 rather than $CumPGuess - $PGuess + * This eliminates a potential endless loop error, but may have an adverse affect on the + * accuracy of the function (although all my tests have so far returned correct results). + * + */ + public static function CRITBINOM($trials, $probability, $alpha) + { + $trials = floor(PHPExcel_Calculation_Functions::flattenSingleValue($trials)); + $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability); + $alpha = PHPExcel_Calculation_Functions::flattenSingleValue($alpha); + + if ((is_numeric($trials)) && (is_numeric($probability)) && (is_numeric($alpha))) { + if ($trials < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } elseif (($probability < 0) || ($probability > 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } elseif (($alpha < 0) || ($alpha > 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } elseif ($alpha <= 0.5) { + $t = sqrt(log(1 / ($alpha * $alpha))); + $trialsApprox = 0 - ($t + (2.515517 + 0.802853 * $t + 0.010328 * $t * $t) / (1 + 1.432788 * $t + 0.189269 * $t * $t + 0.001308 * $t * $t * $t)); + } else { + $t = sqrt(log(1 / pow(1 - $alpha, 2))); + $trialsApprox = $t - (2.515517 + 0.802853 * $t + 0.010328 * $t * $t) / (1 + 1.432788 * $t + 0.189269 * $t * $t + 0.001308 * $t * $t * $t); + } + $Guess = floor($trials * $probability + $trialsApprox * sqrt($trials * $probability * (1 - $probability))); + if ($Guess < 0) { + $Guess = 0; + } elseif ($Guess > $trials) { + $Guess = $trials; + } + + $TotalUnscaledProbability = $UnscaledPGuess = $UnscaledCumPGuess = 0.0; + $EssentiallyZero = 10e-12; + + $m = floor($trials * $probability); + ++$TotalUnscaledProbability; + if ($m == $Guess) { + ++$UnscaledPGuess; + } + if ($m <= $Guess) { + ++$UnscaledCumPGuess; + } + + $PreviousValue = 1; + $Done = false; + $k = $m + 1; + while ((!$Done) && ($k <= $trials)) { + $CurrentValue = $PreviousValue * ($trials - $k + 1) * $probability / ($k * (1 - $probability)); + $TotalUnscaledProbability += $CurrentValue; + if ($k == $Guess) { + $UnscaledPGuess += $CurrentValue; + } + if ($k <= $Guess) { + $UnscaledCumPGuess += $CurrentValue; + } + if ($CurrentValue <= $EssentiallyZero) { + $Done = true; + } + $PreviousValue = $CurrentValue; + ++$k; + } + + $PreviousValue = 1; + $Done = false; + $k = $m - 1; + while ((!$Done) && ($k >= 0)) { + $CurrentValue = $PreviousValue * $k + 1 * (1 - $probability) / (($trials - $k) * $probability); + $TotalUnscaledProbability += $CurrentValue; + if ($k == $Guess) { + $UnscaledPGuess += $CurrentValue; + } + if ($k <= $Guess) { + $UnscaledCumPGuess += $CurrentValue; + } + if ($CurrentValue <= $EssentiallyZero) { + $Done = true; + } + $PreviousValue = $CurrentValue; + --$k; + } + + $PGuess = $UnscaledPGuess / $TotalUnscaledProbability; + $CumPGuess = $UnscaledCumPGuess / $TotalUnscaledProbability; + +// $CumPGuessMinus1 = $CumPGuess - $PGuess; + $CumPGuessMinus1 = $CumPGuess - 1; + + while (true) { + if (($CumPGuessMinus1 < $alpha) && ($CumPGuess >= $alpha)) { + return $Guess; + } elseif (($CumPGuessMinus1 < $alpha) && ($CumPGuess < $alpha)) { + $PGuessPlus1 = $PGuess * ($trials - $Guess) * $probability / $Guess / (1 - $probability); + $CumPGuessMinus1 = $CumPGuess; + $CumPGuess = $CumPGuess + $PGuessPlus1; + $PGuess = $PGuessPlus1; + ++$Guess; + } elseif (($CumPGuessMinus1 >= $alpha) && ($CumPGuess >= $alpha)) { + $PGuessMinus1 = $PGuess * $Guess * (1 - $probability) / ($trials - $Guess + 1) / $probability; + $CumPGuess = $CumPGuessMinus1; + $CumPGuessMinus1 = $CumPGuessMinus1 - $PGuess; + $PGuess = $PGuessMinus1; + --$Guess; + } + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * DEVSQ + * + * Returns the sum of squares of deviations of data points from their sample mean. + * + * Excel Function: + * DEVSQ(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function DEVSQ() + { + $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()); + + // Return value + $returnValue = null; + + $aMean = self::AVERAGE($aArgs); + if ($aMean != PHPExcel_Calculation_Functions::DIV0()) { + $aCount = -1; + foreach ($aArgs as $k => $arg) { + // Is it a numeric value? + if ((is_bool($arg)) && + ((!PHPExcel_Calculation_Functions::isCellValue($k)) || + (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE))) { + $arg = (integer) $arg; + } + if ((is_numeric($arg)) && (!is_string($arg))) { + if (is_null($returnValue)) { + $returnValue = pow(($arg - $aMean), 2); + } else { + $returnValue += pow(($arg - $aMean), 2); + } + ++$aCount; + } + } + + // Return + if (is_null($returnValue)) { + return PHPExcel_Calculation_Functions::NaN(); + } else { + return $returnValue; + } + } + return self::NA(); + } + + + /** + * EXPONDIST + * + * Returns the exponential distribution. Use EXPONDIST to model the time between events, + * such as how long an automated bank teller takes to deliver cash. For example, you can + * use EXPONDIST to determine the probability that the process takes at most 1 minute. + * + * @param float $value Value of the function + * @param float $lambda The parameter value + * @param boolean $cumulative + * @return float + */ + public static function EXPONDIST($value, $lambda, $cumulative) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $lambda = PHPExcel_Calculation_Functions::flattenSingleValue($lambda); + $cumulative = PHPExcel_Calculation_Functions::flattenSingleValue($cumulative); + + if ((is_numeric($value)) && (is_numeric($lambda))) { + if (($value < 0) || ($lambda < 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ((is_numeric($cumulative)) || (is_bool($cumulative))) { + if ($cumulative) { + return 1 - exp(0-$value*$lambda); + } else { + return $lambda * exp(0-$value*$lambda); + } + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * FISHER + * + * Returns the Fisher transformation at x. This transformation produces a function that + * is normally distributed rather than skewed. Use this function to perform hypothesis + * testing on the correlation coefficient. + * + * @param float $value + * @return float + */ + public static function FISHER($value) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + + if (is_numeric($value)) { + if (($value <= -1) || ($value >= 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + return 0.5 * log((1+$value)/(1-$value)); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * FISHERINV + * + * Returns the inverse of the Fisher transformation. Use this transformation when + * analyzing correlations between ranges or arrays of data. If y = FISHER(x), then + * FISHERINV(y) = x. + * + * @param float $value + * @return float + */ + public static function FISHERINV($value) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + + if (is_numeric($value)) { + return (exp(2 * $value) - 1) / (exp(2 * $value) + 1); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * FORECAST + * + * Calculates, or predicts, a future value by using existing values. The predicted value is a y-value for a given x-value. + * + * @param float Value of X for which we want to find Y + * @param array of mixed Data Series Y + * @param array of mixed Data Series X + * @return float + */ + public static function FORECAST($xValue, $yValues, $xValues) + { + $xValue = PHPExcel_Calculation_Functions::flattenSingleValue($xValue); + if (!is_numeric($xValue)) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif (!self::checkTrendArrays($yValues, $xValues)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $yValueCount = count($yValues); + $xValueCount = count($xValues); + + if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { + return PHPExcel_Calculation_Functions::NA(); + } elseif ($yValueCount == 1) { + return PHPExcel_Calculation_Functions::DIV0(); + } + + $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR, $yValues, $xValues); + return $bestFitLinear->getValueOfYForX($xValue); + } + + + /** + * GAMMADIST + * + * Returns the gamma distribution. + * + * @param float $value Value at which you want to evaluate the distribution + * @param float $a Parameter to the distribution + * @param float $b Parameter to the distribution + * @param boolean $cumulative + * @return float + * + */ + public static function GAMMADIST($value, $a, $b, $cumulative) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $a = PHPExcel_Calculation_Functions::flattenSingleValue($a); + $b = PHPExcel_Calculation_Functions::flattenSingleValue($b); + + if ((is_numeric($value)) && (is_numeric($a)) && (is_numeric($b))) { + if (($value < 0) || ($a <= 0) || ($b <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ((is_numeric($cumulative)) || (is_bool($cumulative))) { + if ($cumulative) { + return self::incompleteGamma($a, $value / $b) / self::gamma($a); + } else { + return (1 / (pow($b, $a) * self::gamma($a))) * pow($value, $a-1) * exp(0-($value / $b)); + } + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * GAMMAINV + * + * Returns the inverse of the beta distribution. + * + * @param float $probability Probability at which you want to evaluate the distribution + * @param float $alpha Parameter to the distribution + * @param float $beta Parameter to the distribution + * @return float + * + */ + public static function GAMMAINV($probability, $alpha, $beta) + { + $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability); + $alpha = PHPExcel_Calculation_Functions::flattenSingleValue($alpha); + $beta = PHPExcel_Calculation_Functions::flattenSingleValue($beta); + + if ((is_numeric($probability)) && (is_numeric($alpha)) && (is_numeric($beta))) { + if (($alpha <= 0) || ($beta <= 0) || ($probability < 0) || ($probability > 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + + $xLo = 0; + $xHi = $alpha * $beta * 5; + + $x = $xNew = 1; + $error = $pdf = 0; + $dx = 1024; + $i = 0; + + while ((abs($dx) > PRECISION) && ($i++ < MAX_ITERATIONS)) { + // Apply Newton-Raphson step + $error = self::GAMMADIST($x, $alpha, $beta, true) - $probability; + if ($error < 0.0) { + $xLo = $x; + } else { + $xHi = $x; + } + $pdf = self::GAMMADIST($x, $alpha, $beta, false); + // Avoid division by zero + if ($pdf != 0.0) { + $dx = $error / $pdf; + $xNew = $x - $dx; + } + // If the NR fails to converge (which for example may be the + // case if the initial guess is too rough) we apply a bisection + // step to determine a more narrow interval around the root. + if (($xNew < $xLo) || ($xNew > $xHi) || ($pdf == 0.0)) { + $xNew = ($xLo + $xHi) / 2; + $dx = $xNew - $x; + } + $x = $xNew; + } + if ($i == MAX_ITERATIONS) { + return PHPExcel_Calculation_Functions::NA(); + } + return $x; + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * GAMMALN + * + * Returns the natural logarithm of the gamma function. + * + * @param float $value + * @return float + */ + public static function GAMMALN($value) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + + if (is_numeric($value)) { + if ($value <= 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + return log(self::gamma($value)); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * GEOMEAN + * + * Returns the geometric mean of an array or range of positive data. For example, you + * can use GEOMEAN to calculate average growth rate given compound interest with + * variable rates. + * + * Excel Function: + * GEOMEAN(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function GEOMEAN() + { + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + + $aMean = PHPExcel_Calculation_MathTrig::PRODUCT($aArgs); + if (is_numeric($aMean) && ($aMean > 0)) { + $aCount = self::COUNT($aArgs) ; + if (self::MIN($aArgs) > 0) { + return pow($aMean, (1 / $aCount)); + } + } + return PHPExcel_Calculation_Functions::NaN(); + } + + + /** + * GROWTH + * + * Returns values along a predicted emponential trend + * + * @param array of mixed Data Series Y + * @param array of mixed Data Series X + * @param array of mixed Values of X for which we want to find Y + * @param boolean A logical value specifying whether to force the intersect to equal 0. + * @return array of float + */ + public static function GROWTH($yValues, $xValues = array(), $newValues = array(), $const = true) + { + $yValues = PHPExcel_Calculation_Functions::flattenArray($yValues); + $xValues = PHPExcel_Calculation_Functions::flattenArray($xValues); + $newValues = PHPExcel_Calculation_Functions::flattenArray($newValues); + $const = (is_null($const)) ? true : (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($const); + + $bestFitExponential = trendClass::calculate(trendClass::TREND_EXPONENTIAL, $yValues, $xValues, $const); + if (empty($newValues)) { + $newValues = $bestFitExponential->getXValues(); + } + + $returnArray = array(); + foreach ($newValues as $xValue) { + $returnArray[0][] = $bestFitExponential->getValueOfYForX($xValue); + } + + return $returnArray; + } + + + /** + * HARMEAN + * + * Returns the harmonic mean of a data set. The harmonic mean is the reciprocal of the + * arithmetic mean of reciprocals. + * + * Excel Function: + * HARMEAN(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function HARMEAN() + { + // Return value + $returnValue = PHPExcel_Calculation_Functions::NA(); + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + if (self::MIN($aArgs) < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + $aCount = 0; + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + if ($arg <= 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (is_null($returnValue)) { + $returnValue = (1 / $arg); + } else { + $returnValue += (1 / $arg); + } + ++$aCount; + } + } + + // Return + if ($aCount > 0) { + return 1 / ($returnValue / $aCount); + } else { + return $returnValue; + } + } + + + /** + * HYPGEOMDIST + * + * Returns the hypergeometric distribution. HYPGEOMDIST returns the probability of a given number of + * sample successes, given the sample size, population successes, and population size. + * + * @param float $sampleSuccesses Number of successes in the sample + * @param float $sampleNumber Size of the sample + * @param float $populationSuccesses Number of successes in the population + * @param float $populationNumber Population size + * @return float + * + */ + public static function HYPGEOMDIST($sampleSuccesses, $sampleNumber, $populationSuccesses, $populationNumber) + { + $sampleSuccesses = floor(PHPExcel_Calculation_Functions::flattenSingleValue($sampleSuccesses)); + $sampleNumber = floor(PHPExcel_Calculation_Functions::flattenSingleValue($sampleNumber)); + $populationSuccesses = floor(PHPExcel_Calculation_Functions::flattenSingleValue($populationSuccesses)); + $populationNumber = floor(PHPExcel_Calculation_Functions::flattenSingleValue($populationNumber)); + + if ((is_numeric($sampleSuccesses)) && (is_numeric($sampleNumber)) && (is_numeric($populationSuccesses)) && (is_numeric($populationNumber))) { + if (($sampleSuccesses < 0) || ($sampleSuccesses > $sampleNumber) || ($sampleSuccesses > $populationSuccesses)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (($sampleNumber <= 0) || ($sampleNumber > $populationNumber)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (($populationSuccesses <= 0) || ($populationSuccesses > $populationNumber)) { + return PHPExcel_Calculation_Functions::NaN(); + } + return PHPExcel_Calculation_MathTrig::COMBIN($populationSuccesses, $sampleSuccesses) * + PHPExcel_Calculation_MathTrig::COMBIN($populationNumber - $populationSuccesses, $sampleNumber - $sampleSuccesses) / + PHPExcel_Calculation_MathTrig::COMBIN($populationNumber, $sampleNumber); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * INTERCEPT + * + * Calculates the point at which a line will intersect the y-axis by using existing x-values and y-values. + * + * @param array of mixed Data Series Y + * @param array of mixed Data Series X + * @return float + */ + public static function INTERCEPT($yValues, $xValues) + { + if (!self::checkTrendArrays($yValues, $xValues)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $yValueCount = count($yValues); + $xValueCount = count($xValues); + + if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { + return PHPExcel_Calculation_Functions::NA(); + } elseif ($yValueCount == 1) { + return PHPExcel_Calculation_Functions::DIV0(); + } + + $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR, $yValues, $xValues); + return $bestFitLinear->getIntersect(); + } + + + /** + * KURT + * + * Returns the kurtosis of a data set. Kurtosis characterizes the relative peakedness + * or flatness of a distribution compared with the normal distribution. Positive + * kurtosis indicates a relatively peaked distribution. Negative kurtosis indicates a + * relatively flat distribution. + * + * @param array Data Series + * @return float + */ + public static function KURT() + { + $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()); + $mean = self::AVERAGE($aArgs); + $stdDev = self::STDEV($aArgs); + + if ($stdDev > 0) { + $count = $summer = 0; + // Loop through arguments + foreach ($aArgs as $k => $arg) { + if ((is_bool($arg)) && + (!PHPExcel_Calculation_Functions::isMatrixValue($k))) { + } else { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $summer += pow((($arg - $mean) / $stdDev), 4); + ++$count; + } + } + } + + // Return + if ($count > 3) { + return $summer * ($count * ($count+1) / (($count-1) * ($count-2) * ($count-3))) - (3 * pow($count-1, 2) / (($count-2) * ($count-3))); + } + } + return PHPExcel_Calculation_Functions::DIV0(); + } + + + /** + * LARGE + * + * Returns the nth largest value in a data set. You can use this function to + * select a value based on its relative standing. + * + * Excel Function: + * LARGE(value1[,value2[, ...]],entry) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @param int $entry Position (ordered from the largest) in the array or range of data to return + * @return float + * + */ + public static function LARGE() + { + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + + // Calculate + $entry = floor(array_pop($aArgs)); + + if ((is_numeric($entry)) && (!is_string($entry))) { + $mArgs = array(); + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $mArgs[] = $arg; + } + } + $count = self::COUNT($mArgs); + $entry = floor(--$entry); + if (($entry < 0) || ($entry >= $count) || ($count == 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + rsort($mArgs); + return $mArgs[$entry]; + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * LINEST + * + * Calculates the statistics for a line by using the "least squares" method to calculate a straight line that best fits your data, + * and then returns an array that describes the line. + * + * @param array of mixed Data Series Y + * @param array of mixed Data Series X + * @param boolean A logical value specifying whether to force the intersect to equal 0. + * @param boolean A logical value specifying whether to return additional regression statistics. + * @return array + */ + public static function LINEST($yValues, $xValues = null, $const = true, $stats = false) + { + $const = (is_null($const)) ? true : (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($const); + $stats = (is_null($stats)) ? false : (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($stats); + if (is_null($xValues)) { + $xValues = range(1, count(PHPExcel_Calculation_Functions::flattenArray($yValues))); + } + + if (!self::checkTrendArrays($yValues, $xValues)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $yValueCount = count($yValues); + $xValueCount = count($xValues); + + + if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { + return PHPExcel_Calculation_Functions::NA(); + } elseif ($yValueCount == 1) { + return 0; + } + + $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR, $yValues, $xValues, $const); + if ($stats) { + return array( + array( + $bestFitLinear->getSlope(), + $bestFitLinear->getSlopeSE(), + $bestFitLinear->getGoodnessOfFit(), + $bestFitLinear->getF(), + $bestFitLinear->getSSRegression(), + ), + array( + $bestFitLinear->getIntersect(), + $bestFitLinear->getIntersectSE(), + $bestFitLinear->getStdevOfResiduals(), + $bestFitLinear->getDFResiduals(), + $bestFitLinear->getSSResiduals() + ) + ); + } else { + return array( + $bestFitLinear->getSlope(), + $bestFitLinear->getIntersect() + ); + } + } + + + /** + * LOGEST + * + * Calculates an exponential curve that best fits the X and Y data series, + * and then returns an array that describes the line. + * + * @param array of mixed Data Series Y + * @param array of mixed Data Series X + * @param boolean A logical value specifying whether to force the intersect to equal 0. + * @param boolean A logical value specifying whether to return additional regression statistics. + * @return array + */ + public static function LOGEST($yValues, $xValues = null, $const = true, $stats = false) + { + $const = (is_null($const)) ? true : (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($const); + $stats = (is_null($stats)) ? false : (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($stats); + if (is_null($xValues)) { + $xValues = range(1, count(PHPExcel_Calculation_Functions::flattenArray($yValues))); + } + + if (!self::checkTrendArrays($yValues, $xValues)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $yValueCount = count($yValues); + $xValueCount = count($xValues); + + foreach ($yValues as $value) { + if ($value <= 0.0) { + return PHPExcel_Calculation_Functions::NaN(); + } + } + + + if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { + return PHPExcel_Calculation_Functions::NA(); + } elseif ($yValueCount == 1) { + return 1; + } + + $bestFitExponential = trendClass::calculate(trendClass::TREND_EXPONENTIAL, $yValues, $xValues, $const); + if ($stats) { + return array( + array( + $bestFitExponential->getSlope(), + $bestFitExponential->getSlopeSE(), + $bestFitExponential->getGoodnessOfFit(), + $bestFitExponential->getF(), + $bestFitExponential->getSSRegression(), + ), + array( + $bestFitExponential->getIntersect(), + $bestFitExponential->getIntersectSE(), + $bestFitExponential->getStdevOfResiduals(), + $bestFitExponential->getDFResiduals(), + $bestFitExponential->getSSResiduals() + ) + ); + } else { + return array( + $bestFitExponential->getSlope(), + $bestFitExponential->getIntersect() + ); + } + } + + + /** + * LOGINV + * + * Returns the inverse of the normal cumulative distribution + * + * @param float $probability + * @param float $mean + * @param float $stdDev + * @return float + * + * @todo Try implementing P J Acklam's refinement algorithm for greater + * accuracy if I can get my head round the mathematics + * (as described at) http://home.online.no/~pjacklam/notes/invnorm/ + */ + public static function LOGINV($probability, $mean, $stdDev) + { + $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability); + $mean = PHPExcel_Calculation_Functions::flattenSingleValue($mean); + $stdDev = PHPExcel_Calculation_Functions::flattenSingleValue($stdDev); + + if ((is_numeric($probability)) && (is_numeric($mean)) && (is_numeric($stdDev))) { + if (($probability < 0) || ($probability > 1) || ($stdDev <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + return exp($mean + $stdDev * self::NORMSINV($probability)); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * LOGNORMDIST + * + * Returns the cumulative lognormal distribution of x, where ln(x) is normally distributed + * with parameters mean and standard_dev. + * + * @param float $value + * @param float $mean + * @param float $stdDev + * @return float + */ + public static function LOGNORMDIST($value, $mean, $stdDev) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $mean = PHPExcel_Calculation_Functions::flattenSingleValue($mean); + $stdDev = PHPExcel_Calculation_Functions::flattenSingleValue($stdDev); + + if ((is_numeric($value)) && (is_numeric($mean)) && (is_numeric($stdDev))) { + if (($value <= 0) || ($stdDev <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + return self::NORMSDIST((log($value) - $mean) / $stdDev); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * MAX + * + * MAX returns the value of the element of the values passed that has the highest value, + * with negative numbers considered smaller than positive numbers. + * + * Excel Function: + * MAX(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function MAX() + { + $returnValue = null; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + if ((is_null($returnValue)) || ($arg > $returnValue)) { + $returnValue = $arg; + } + } + } + + if (is_null($returnValue)) { + return 0; + } + return $returnValue; + } + + + /** + * MAXA + * + * Returns the greatest value in a list of arguments, including numbers, text, and logical values + * + * Excel Function: + * MAXA(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function MAXA() + { + $returnValue = null; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) && ($arg != '')))) { + if (is_bool($arg)) { + $arg = (integer) $arg; + } elseif (is_string($arg)) { + $arg = 0; + } + if ((is_null($returnValue)) || ($arg > $returnValue)) { + $returnValue = $arg; + } + } + } + + if (is_null($returnValue)) { + return 0; + } + return $returnValue; + } + + + /** + * MAXIF + * + * Counts the maximum value within a range of cells that contain numbers within the list of arguments + * + * Excel Function: + * MAXIF(value1[,value2[, ...]],condition) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @param string $condition The criteria that defines which cells will be checked. + * @return float + */ + public static function MAXIF($aArgs, $condition, $sumArgs = array()) + { + $returnValue = null; + + $aArgs = PHPExcel_Calculation_Functions::flattenArray($aArgs); + $sumArgs = PHPExcel_Calculation_Functions::flattenArray($sumArgs); + if (empty($sumArgs)) { + $sumArgs = $aArgs; + } + $condition = PHPExcel_Calculation_Functions::ifCondition($condition); + // Loop through arguments + foreach ($aArgs as $key => $arg) { + if (!is_numeric($arg)) { + $arg = PHPExcel_Calculation::wrapResult(strtoupper($arg)); + } + $testCondition = '='.$arg.$condition; + if (PHPExcel_Calculation::getInstance()->_calculateFormulaValue($testCondition)) { + if ((is_null($returnValue)) || ($arg > $returnValue)) { + $returnValue = $arg; + } + } + } + + return $returnValue; + } + + /** + * MEDIAN + * + * Returns the median of the given numbers. The median is the number in the middle of a set of numbers. + * + * Excel Function: + * MEDIAN(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function MEDIAN() + { + $returnValue = PHPExcel_Calculation_Functions::NaN(); + + $mArgs = array(); + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $mArgs[] = $arg; + } + } + + $mValueCount = count($mArgs); + if ($mValueCount > 0) { + sort($mArgs, SORT_NUMERIC); + $mValueCount = $mValueCount / 2; + if ($mValueCount == floor($mValueCount)) { + $returnValue = ($mArgs[$mValueCount--] + $mArgs[$mValueCount]) / 2; + } else { + $mValueCount = floor($mValueCount); + $returnValue = $mArgs[$mValueCount]; + } + } + + return $returnValue; + } + + + /** + * MIN + * + * MIN returns the value of the element of the values passed that has the smallest value, + * with negative numbers considered smaller than positive numbers. + * + * Excel Function: + * MIN(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function MIN() + { + $returnValue = null; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + if ((is_null($returnValue)) || ($arg < $returnValue)) { + $returnValue = $arg; + } + } + } + + if (is_null($returnValue)) { + return 0; + } + return $returnValue; + } + + + /** + * MINA + * + * Returns the smallest value in a list of arguments, including numbers, text, and logical values + * + * Excel Function: + * MINA(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function MINA() + { + $returnValue = null; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) && ($arg != '')))) { + if (is_bool($arg)) { + $arg = (integer) $arg; + } elseif (is_string($arg)) { + $arg = 0; + } + if ((is_null($returnValue)) || ($arg < $returnValue)) { + $returnValue = $arg; + } + } + } + + if (is_null($returnValue)) { + return 0; + } + return $returnValue; + } + + + /** + * MINIF + * + * Returns the minimum value within a range of cells that contain numbers within the list of arguments + * + * Excel Function: + * MINIF(value1[,value2[, ...]],condition) + * + * @access public + * @category Mathematical and Trigonometric Functions + * @param mixed $arg,... Data values + * @param string $condition The criteria that defines which cells will be checked. + * @return float + */ + public static function MINIF($aArgs, $condition, $sumArgs = array()) + { + $returnValue = null; + + $aArgs = PHPExcel_Calculation_Functions::flattenArray($aArgs); + $sumArgs = PHPExcel_Calculation_Functions::flattenArray($sumArgs); + if (empty($sumArgs)) { + $sumArgs = $aArgs; + } + $condition = PHPExcel_Calculation_Functions::ifCondition($condition); + // Loop through arguments + foreach ($aArgs as $key => $arg) { + if (!is_numeric($arg)) { + $arg = PHPExcel_Calculation::wrapResult(strtoupper($arg)); + } + $testCondition = '='.$arg.$condition; + if (PHPExcel_Calculation::getInstance()->_calculateFormulaValue($testCondition)) { + if ((is_null($returnValue)) || ($arg < $returnValue)) { + $returnValue = $arg; + } + } + } + + return $returnValue; + } + + + // + // Special variant of array_count_values that isn't limited to strings and integers, + // but can work with floating point numbers as values + // + private static function modeCalc($data) + { + $frequencyArray = array(); + foreach ($data as $datum) { + $found = false; + foreach ($frequencyArray as $key => $value) { + if ((string) $value['value'] == (string) $datum) { + ++$frequencyArray[$key]['frequency']; + $found = true; + break; + } + } + if (!$found) { + $frequencyArray[] = array( + 'value' => $datum, + 'frequency' => 1 + ); + } + } + + foreach ($frequencyArray as $key => $value) { + $frequencyList[$key] = $value['frequency']; + $valueList[$key] = $value['value']; + } + array_multisort($frequencyList, SORT_DESC, $valueList, SORT_ASC, SORT_NUMERIC, $frequencyArray); + + if ($frequencyArray[0]['frequency'] == 1) { + return PHPExcel_Calculation_Functions::NA(); + } + return $frequencyArray[0]['value']; + } + + + /** + * MODE + * + * Returns the most frequently occurring, or repetitive, value in an array or range of data + * + * Excel Function: + * MODE(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function MODE() + { + $returnValue = PHPExcel_Calculation_Functions::NA(); + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + + $mArgs = array(); + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $mArgs[] = $arg; + } + } + + if (!empty($mArgs)) { + return self::modeCalc($mArgs); + } + + return $returnValue; + } + + + /** + * NEGBINOMDIST + * + * Returns the negative binomial distribution. NEGBINOMDIST returns the probability that + * there will be number_f failures before the number_s-th success, when the constant + * probability of a success is probability_s. This function is similar to the binomial + * distribution, except that the number of successes is fixed, and the number of trials is + * variable. Like the binomial, trials are assumed to be independent. + * + * @param float $failures Number of Failures + * @param float $successes Threshold number of Successes + * @param float $probability Probability of success on each trial + * @return float + * + */ + public static function NEGBINOMDIST($failures, $successes, $probability) + { + $failures = floor(PHPExcel_Calculation_Functions::flattenSingleValue($failures)); + $successes = floor(PHPExcel_Calculation_Functions::flattenSingleValue($successes)); + $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability); + + if ((is_numeric($failures)) && (is_numeric($successes)) && (is_numeric($probability))) { + if (($failures < 0) || ($successes < 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } elseif (($probability < 0) || ($probability > 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_GNUMERIC) { + if (($failures + $successes - 1) <= 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + } + return (PHPExcel_Calculation_MathTrig::COMBIN($failures + $successes - 1, $successes - 1)) * (pow($probability, $successes)) * (pow(1 - $probability, $failures)); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * NORMDIST + * + * Returns the normal distribution for the specified mean and standard deviation. This + * function has a very wide range of applications in statistics, including hypothesis + * testing. + * + * @param float $value + * @param float $mean Mean Value + * @param float $stdDev Standard Deviation + * @param boolean $cumulative + * @return float + * + */ + public static function NORMDIST($value, $mean, $stdDev, $cumulative) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $mean = PHPExcel_Calculation_Functions::flattenSingleValue($mean); + $stdDev = PHPExcel_Calculation_Functions::flattenSingleValue($stdDev); + + if ((is_numeric($value)) && (is_numeric($mean)) && (is_numeric($stdDev))) { + if ($stdDev < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ((is_numeric($cumulative)) || (is_bool($cumulative))) { + if ($cumulative) { + return 0.5 * (1 + PHPExcel_Calculation_Engineering::erfVal(($value - $mean) / ($stdDev * sqrt(2)))); + } else { + return (1 / (SQRT2PI * $stdDev)) * exp(0 - (pow($value - $mean, 2) / (2 * ($stdDev * $stdDev)))); + } + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * NORMINV + * + * Returns the inverse of the normal cumulative distribution for the specified mean and standard deviation. + * + * @param float $value + * @param float $mean Mean Value + * @param float $stdDev Standard Deviation + * @return float + * + */ + public static function NORMINV($probability, $mean, $stdDev) + { + $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability); + $mean = PHPExcel_Calculation_Functions::flattenSingleValue($mean); + $stdDev = PHPExcel_Calculation_Functions::flattenSingleValue($stdDev); + + if ((is_numeric($probability)) && (is_numeric($mean)) && (is_numeric($stdDev))) { + if (($probability < 0) || ($probability > 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ($stdDev < 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + return (self::inverseNcdf($probability) * $stdDev) + $mean; + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * NORMSDIST + * + * Returns the standard normal cumulative distribution function. The distribution has + * a mean of 0 (zero) and a standard deviation of one. Use this function in place of a + * table of standard normal curve areas. + * + * @param float $value + * @return float + */ + public static function NORMSDIST($value) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + + return self::NORMDIST($value, 0, 1, true); + } + + + /** + * NORMSINV + * + * Returns the inverse of the standard normal cumulative distribution + * + * @param float $value + * @return float + */ + public static function NORMSINV($value) + { + return self::NORMINV($value, 0, 1); + } + + + /** + * PERCENTILE + * + * Returns the nth percentile of values in a range.. + * + * Excel Function: + * PERCENTILE(value1[,value2[, ...]],entry) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @param float $entry Percentile value in the range 0..1, inclusive. + * @return float + */ + public static function PERCENTILE() + { + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + + // Calculate + $entry = array_pop($aArgs); + + if ((is_numeric($entry)) && (!is_string($entry))) { + if (($entry < 0) || ($entry > 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $mArgs = array(); + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $mArgs[] = $arg; + } + } + $mValueCount = count($mArgs); + if ($mValueCount > 0) { + sort($mArgs); + $count = self::COUNT($mArgs); + $index = $entry * ($count-1); + $iBase = floor($index); + if ($index == $iBase) { + return $mArgs[$index]; + } else { + $iNext = $iBase + 1; + $iProportion = $index - $iBase; + return $mArgs[$iBase] + (($mArgs[$iNext] - $mArgs[$iBase]) * $iProportion) ; + } + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * PERCENTRANK + * + * Returns the rank of a value in a data set as a percentage of the data set. + * + * @param array of number An array of, or a reference to, a list of numbers. + * @param number The number whose rank you want to find. + * @param number The number of significant digits for the returned percentage value. + * @return float + */ + public static function PERCENTRANK($valueSet, $value, $significance = 3) + { + $valueSet = PHPExcel_Calculation_Functions::flattenArray($valueSet); + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $significance = (is_null($significance)) ? 3 : (integer) PHPExcel_Calculation_Functions::flattenSingleValue($significance); + + foreach ($valueSet as $key => $valueEntry) { + if (!is_numeric($valueEntry)) { + unset($valueSet[$key]); + } + } + sort($valueSet, SORT_NUMERIC); + $valueCount = count($valueSet); + if ($valueCount == 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + + $valueAdjustor = $valueCount - 1; + if (($value < $valueSet[0]) || ($value > $valueSet[$valueAdjustor])) { + return PHPExcel_Calculation_Functions::NA(); + } + + $pos = array_search($value, $valueSet); + if ($pos === false) { + $pos = 0; + $testValue = $valueSet[0]; + while ($testValue < $value) { + $testValue = $valueSet[++$pos]; + } + --$pos; + $pos += (($value - $valueSet[$pos]) / ($testValue - $valueSet[$pos])); + } + + return round($pos / $valueAdjustor, $significance); + } + + + /** + * PERMUT + * + * Returns the number of permutations for a given number of objects that can be + * selected from number objects. A permutation is any set or subset of objects or + * events where internal order is significant. Permutations are different from + * combinations, for which the internal order is not significant. Use this function + * for lottery-style probability calculations. + * + * @param int $numObjs Number of different objects + * @param int $numInSet Number of objects in each permutation + * @return int Number of permutations + */ + public static function PERMUT($numObjs, $numInSet) + { + $numObjs = PHPExcel_Calculation_Functions::flattenSingleValue($numObjs); + $numInSet = PHPExcel_Calculation_Functions::flattenSingleValue($numInSet); + + if ((is_numeric($numObjs)) && (is_numeric($numInSet))) { + $numInSet = floor($numInSet); + if ($numObjs < $numInSet) { + return PHPExcel_Calculation_Functions::NaN(); + } + return round(PHPExcel_Calculation_MathTrig::FACT($numObjs) / PHPExcel_Calculation_MathTrig::FACT($numObjs - $numInSet)); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * POISSON + * + * Returns the Poisson distribution. A common application of the Poisson distribution + * is predicting the number of events over a specific time, such as the number of + * cars arriving at a toll plaza in 1 minute. + * + * @param float $value + * @param float $mean Mean Value + * @param boolean $cumulative + * @return float + * + */ + public static function POISSON($value, $mean, $cumulative) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $mean = PHPExcel_Calculation_Functions::flattenSingleValue($mean); + + if ((is_numeric($value)) && (is_numeric($mean))) { + if (($value < 0) || ($mean <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ((is_numeric($cumulative)) || (is_bool($cumulative))) { + if ($cumulative) { + $summer = 0; + for ($i = 0; $i <= floor($value); ++$i) { + $summer += pow($mean, $i) / PHPExcel_Calculation_MathTrig::FACT($i); + } + return exp(0-$mean) * $summer; + } else { + return (exp(0-$mean) * pow($mean, $value)) / PHPExcel_Calculation_MathTrig::FACT($value); + } + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * QUARTILE + * + * Returns the quartile of a data set. + * + * Excel Function: + * QUARTILE(value1[,value2[, ...]],entry) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @param int $entry Quartile value in the range 1..3, inclusive. + * @return float + */ + public static function QUARTILE() + { + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + + // Calculate + $entry = floor(array_pop($aArgs)); + + if ((is_numeric($entry)) && (!is_string($entry))) { + $entry /= 4; + if (($entry < 0) || ($entry > 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + return self::PERCENTILE($aArgs, $entry); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * RANK + * + * Returns the rank of a number in a list of numbers. + * + * @param number The number whose rank you want to find. + * @param array of number An array of, or a reference to, a list of numbers. + * @param mixed Order to sort the values in the value set + * @return float + */ + public static function RANK($value, $valueSet, $order = 0) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $valueSet = PHPExcel_Calculation_Functions::flattenArray($valueSet); + $order = (is_null($order)) ? 0 : (integer) PHPExcel_Calculation_Functions::flattenSingleValue($order); + + foreach ($valueSet as $key => $valueEntry) { + if (!is_numeric($valueEntry)) { + unset($valueSet[$key]); + } + } + + if ($order == 0) { + rsort($valueSet, SORT_NUMERIC); + } else { + sort($valueSet, SORT_NUMERIC); + } + $pos = array_search($value, $valueSet); + if ($pos === false) { + return PHPExcel_Calculation_Functions::NA(); + } + + return ++$pos; + } + + + /** + * RSQ + * + * Returns the square of the Pearson product moment correlation coefficient through data points in known_y's and known_x's. + * + * @param array of mixed Data Series Y + * @param array of mixed Data Series X + * @return float + */ + public static function RSQ($yValues, $xValues) + { + if (!self::checkTrendArrays($yValues, $xValues)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $yValueCount = count($yValues); + $xValueCount = count($xValues); + + if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { + return PHPExcel_Calculation_Functions::NA(); + } elseif ($yValueCount == 1) { + return PHPExcel_Calculation_Functions::DIV0(); + } + + $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR, $yValues, $xValues); + return $bestFitLinear->getGoodnessOfFit(); + } + + + /** + * SKEW + * + * Returns the skewness of a distribution. Skewness characterizes the degree of asymmetry + * of a distribution around its mean. Positive skewness indicates a distribution with an + * asymmetric tail extending toward more positive values. Negative skewness indicates a + * distribution with an asymmetric tail extending toward more negative values. + * + * @param array Data Series + * @return float + */ + public static function SKEW() + { + $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()); + $mean = self::AVERAGE($aArgs); + $stdDev = self::STDEV($aArgs); + + $count = $summer = 0; + // Loop through arguments + foreach ($aArgs as $k => $arg) { + if ((is_bool($arg)) && + (!PHPExcel_Calculation_Functions::isMatrixValue($k))) { + } else { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $summer += pow((($arg - $mean) / $stdDev), 3); + ++$count; + } + } + } + + if ($count > 2) { + return $summer * ($count / (($count-1) * ($count-2))); + } + return PHPExcel_Calculation_Functions::DIV0(); + } + + + /** + * SLOPE + * + * Returns the slope of the linear regression line through data points in known_y's and known_x's. + * + * @param array of mixed Data Series Y + * @param array of mixed Data Series X + * @return float + */ + public static function SLOPE($yValues, $xValues) + { + if (!self::checkTrendArrays($yValues, $xValues)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $yValueCount = count($yValues); + $xValueCount = count($xValues); + + if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { + return PHPExcel_Calculation_Functions::NA(); + } elseif ($yValueCount == 1) { + return PHPExcel_Calculation_Functions::DIV0(); + } + + $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR, $yValues, $xValues); + return $bestFitLinear->getSlope(); + } + + + /** + * SMALL + * + * Returns the nth smallest value in a data set. You can use this function to + * select a value based on its relative standing. + * + * Excel Function: + * SMALL(value1[,value2[, ...]],entry) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @param int $entry Position (ordered from the smallest) in the array or range of data to return + * @return float + */ + public static function SMALL() + { + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + + // Calculate + $entry = array_pop($aArgs); + + if ((is_numeric($entry)) && (!is_string($entry))) { + $mArgs = array(); + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $mArgs[] = $arg; + } + } + $count = self::COUNT($mArgs); + $entry = floor(--$entry); + if (($entry < 0) || ($entry >= $count) || ($count == 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + sort($mArgs); + return $mArgs[$entry]; + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * STANDARDIZE + * + * Returns a normalized value from a distribution characterized by mean and standard_dev. + * + * @param float $value Value to normalize + * @param float $mean Mean Value + * @param float $stdDev Standard Deviation + * @return float Standardized value + */ + public static function STANDARDIZE($value, $mean, $stdDev) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $mean = PHPExcel_Calculation_Functions::flattenSingleValue($mean); + $stdDev = PHPExcel_Calculation_Functions::flattenSingleValue($stdDev); + + if ((is_numeric($value)) && (is_numeric($mean)) && (is_numeric($stdDev))) { + if ($stdDev <= 0) { + return PHPExcel_Calculation_Functions::NaN(); + } + return ($value - $mean) / $stdDev ; + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * STDEV + * + * Estimates standard deviation based on a sample. The standard deviation is a measure of how + * widely values are dispersed from the average value (the mean). + * + * Excel Function: + * STDEV(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function STDEV() + { + $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()); + + // Return value + $returnValue = null; + + $aMean = self::AVERAGE($aArgs); + if (!is_null($aMean)) { + $aCount = -1; + foreach ($aArgs as $k => $arg) { + if ((is_bool($arg)) && + ((!PHPExcel_Calculation_Functions::isCellValue($k)) || (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE))) { + $arg = (integer) $arg; + } + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + if (is_null($returnValue)) { + $returnValue = pow(($arg - $aMean), 2); + } else { + $returnValue += pow(($arg - $aMean), 2); + } + ++$aCount; + } + } + + // Return + if (($aCount > 0) && ($returnValue >= 0)) { + return sqrt($returnValue / $aCount); + } + } + return PHPExcel_Calculation_Functions::DIV0(); + } + + + /** + * STDEVA + * + * Estimates standard deviation based on a sample, including numbers, text, and logical values + * + * Excel Function: + * STDEVA(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function STDEVA() + { + $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()); + + $returnValue = null; + + $aMean = self::AVERAGEA($aArgs); + if (!is_null($aMean)) { + $aCount = -1; + foreach ($aArgs as $k => $arg) { + if ((is_bool($arg)) && + (!PHPExcel_Calculation_Functions::isMatrixValue($k))) { + } else { + // Is it a numeric value? + if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) & ($arg != '')))) { + if (is_bool($arg)) { + $arg = (integer) $arg; + } elseif (is_string($arg)) { + $arg = 0; + } + if (is_null($returnValue)) { + $returnValue = pow(($arg - $aMean), 2); + } else { + $returnValue += pow(($arg - $aMean), 2); + } + ++$aCount; + } + } + } + + if (($aCount > 0) && ($returnValue >= 0)) { + return sqrt($returnValue / $aCount); + } + } + return PHPExcel_Calculation_Functions::DIV0(); + } + + + /** + * STDEVP + * + * Calculates standard deviation based on the entire population + * + * Excel Function: + * STDEVP(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function STDEVP() + { + $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()); + + $returnValue = null; + + $aMean = self::AVERAGE($aArgs); + if (!is_null($aMean)) { + $aCount = 0; + foreach ($aArgs as $k => $arg) { + if ((is_bool($arg)) && + ((!PHPExcel_Calculation_Functions::isCellValue($k)) || (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE))) { + $arg = (integer) $arg; + } + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + if (is_null($returnValue)) { + $returnValue = pow(($arg - $aMean), 2); + } else { + $returnValue += pow(($arg - $aMean), 2); + } + ++$aCount; + } + } + + if (($aCount > 0) && ($returnValue >= 0)) { + return sqrt($returnValue / $aCount); + } + } + return PHPExcel_Calculation_Functions::DIV0(); + } + + + /** + * STDEVPA + * + * Calculates standard deviation based on the entire population, including numbers, text, and logical values + * + * Excel Function: + * STDEVPA(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function STDEVPA() + { + $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()); + + $returnValue = null; + + $aMean = self::AVERAGEA($aArgs); + if (!is_null($aMean)) { + $aCount = 0; + foreach ($aArgs as $k => $arg) { + if ((is_bool($arg)) && + (!PHPExcel_Calculation_Functions::isMatrixValue($k))) { + } else { + // Is it a numeric value? + if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) & ($arg != '')))) { + if (is_bool($arg)) { + $arg = (integer) $arg; + } elseif (is_string($arg)) { + $arg = 0; + } + if (is_null($returnValue)) { + $returnValue = pow(($arg - $aMean), 2); + } else { + $returnValue += pow(($arg - $aMean), 2); + } + ++$aCount; + } + } + } + + if (($aCount > 0) && ($returnValue >= 0)) { + return sqrt($returnValue / $aCount); + } + } + return PHPExcel_Calculation_Functions::DIV0(); + } + + + /** + * STEYX + * + * Returns the standard error of the predicted y-value for each x in the regression. + * + * @param array of mixed Data Series Y + * @param array of mixed Data Series X + * @return float + */ + public static function STEYX($yValues, $xValues) + { + if (!self::checkTrendArrays($yValues, $xValues)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $yValueCount = count($yValues); + $xValueCount = count($xValues); + + if (($yValueCount == 0) || ($yValueCount != $xValueCount)) { + return PHPExcel_Calculation_Functions::NA(); + } elseif ($yValueCount == 1) { + return PHPExcel_Calculation_Functions::DIV0(); + } + + $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR, $yValues, $xValues); + return $bestFitLinear->getStdevOfResiduals(); + } + + + /** + * TDIST + * + * Returns the probability of Student's T distribution. + * + * @param float $value Value for the function + * @param float $degrees degrees of freedom + * @param float $tails number of tails (1 or 2) + * @return float + */ + public static function TDIST($value, $degrees, $tails) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $degrees = floor(PHPExcel_Calculation_Functions::flattenSingleValue($degrees)); + $tails = floor(PHPExcel_Calculation_Functions::flattenSingleValue($tails)); + + if ((is_numeric($value)) && (is_numeric($degrees)) && (is_numeric($tails))) { + if (($value < 0) || ($degrees < 1) || ($tails < 1) || ($tails > 2)) { + return PHPExcel_Calculation_Functions::NaN(); + } + // tdist, which finds the probability that corresponds to a given value + // of t with k degrees of freedom. This algorithm is translated from a + // pascal function on p81 of "Statistical Computing in Pascal" by D + // Cooke, A H Craven & G M Clark (1985: Edward Arnold (Pubs.) Ltd: + // London). The above Pascal algorithm is itself a translation of the + // fortran algoritm "AS 3" by B E Cooper of the Atlas Computer + // Laboratory as reported in (among other places) "Applied Statistics + // Algorithms", editied by P Griffiths and I D Hill (1985; Ellis + // Horwood Ltd.; W. Sussex, England). + $tterm = $degrees; + $ttheta = atan2($value, sqrt($tterm)); + $tc = cos($ttheta); + $ts = sin($ttheta); + $tsum = 0; + + if (($degrees % 2) == 1) { + $ti = 3; + $tterm = $tc; + } else { + $ti = 2; + $tterm = 1; + } + + $tsum = $tterm; + while ($ti < $degrees) { + $tterm *= $tc * $tc * ($ti - 1) / $ti; + $tsum += $tterm; + $ti += 2; + } + $tsum *= $ts; + if (($degrees % 2) == 1) { + $tsum = M_2DIVPI * ($tsum + $ttheta); + } + $tValue = 0.5 * (1 + $tsum); + if ($tails == 1) { + return 1 - abs($tValue); + } else { + return 1 - abs((1 - $tValue) - $tValue); + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * TINV + * + * Returns the one-tailed probability of the chi-squared distribution. + * + * @param float $probability Probability for the function + * @param float $degrees degrees of freedom + * @return float + */ + public static function TINV($probability, $degrees) + { + $probability = PHPExcel_Calculation_Functions::flattenSingleValue($probability); + $degrees = floor(PHPExcel_Calculation_Functions::flattenSingleValue($degrees)); + + if ((is_numeric($probability)) && (is_numeric($degrees))) { + $xLo = 100; + $xHi = 0; + + $x = $xNew = 1; + $dx = 1; + $i = 0; + + while ((abs($dx) > PRECISION) && ($i++ < MAX_ITERATIONS)) { + // Apply Newton-Raphson step + $result = self::TDIST($x, $degrees, 2); + $error = $result - $probability; + if ($error == 0.0) { + $dx = 0; + } elseif ($error < 0.0) { + $xLo = $x; + } else { + $xHi = $x; + } + // Avoid division by zero + if ($result != 0.0) { + $dx = $error / $result; + $xNew = $x - $dx; + } + // If the NR fails to converge (which for example may be the + // case if the initial guess is too rough) we apply a bisection + // step to determine a more narrow interval around the root. + if (($xNew < $xLo) || ($xNew > $xHi) || ($result == 0.0)) { + $xNew = ($xLo + $xHi) / 2; + $dx = $xNew - $x; + } + $x = $xNew; + } + if ($i == MAX_ITERATIONS) { + return PHPExcel_Calculation_Functions::NA(); + } + return round($x, 12); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * TREND + * + * Returns values along a linear trend + * + * @param array of mixed Data Series Y + * @param array of mixed Data Series X + * @param array of mixed Values of X for which we want to find Y + * @param boolean A logical value specifying whether to force the intersect to equal 0. + * @return array of float + */ + public static function TREND($yValues, $xValues = array(), $newValues = array(), $const = true) + { + $yValues = PHPExcel_Calculation_Functions::flattenArray($yValues); + $xValues = PHPExcel_Calculation_Functions::flattenArray($xValues); + $newValues = PHPExcel_Calculation_Functions::flattenArray($newValues); + $const = (is_null($const)) ? true : (boolean) PHPExcel_Calculation_Functions::flattenSingleValue($const); + + $bestFitLinear = trendClass::calculate(trendClass::TREND_LINEAR, $yValues, $xValues, $const); + if (empty($newValues)) { + $newValues = $bestFitLinear->getXValues(); + } + + $returnArray = array(); + foreach ($newValues as $xValue) { + $returnArray[0][] = $bestFitLinear->getValueOfYForX($xValue); + } + + return $returnArray; + } + + + /** + * TRIMMEAN + * + * Returns the mean of the interior of a data set. TRIMMEAN calculates the mean + * taken by excluding a percentage of data points from the top and bottom tails + * of a data set. + * + * Excel Function: + * TRIMEAN(value1[,value2[, ...]], $discard) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @param float $discard Percentage to discard + * @return float + */ + public static function TRIMMEAN() + { + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + + // Calculate + $percent = array_pop($aArgs); + + if ((is_numeric($percent)) && (!is_string($percent))) { + if (($percent < 0) || ($percent > 1)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $mArgs = array(); + foreach ($aArgs as $arg) { + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $mArgs[] = $arg; + } + } + $discard = floor(self::COUNT($mArgs) * $percent / 2); + sort($mArgs); + for ($i=0; $i < $discard; ++$i) { + array_pop($mArgs); + array_shift($mArgs); + } + return self::AVERAGE($mArgs); + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * VARFunc + * + * Estimates variance based on a sample. + * + * Excel Function: + * VAR(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function VARFunc() + { + $returnValue = PHPExcel_Calculation_Functions::DIV0(); + + $summerA = $summerB = 0; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + $aCount = 0; + foreach ($aArgs as $arg) { + if (is_bool($arg)) { + $arg = (integer) $arg; + } + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $summerA += ($arg * $arg); + $summerB += $arg; + ++$aCount; + } + } + + if ($aCount > 1) { + $summerA *= $aCount; + $summerB *= $summerB; + $returnValue = ($summerA - $summerB) / ($aCount * ($aCount - 1)); + } + return $returnValue; + } + + + /** + * VARA + * + * Estimates variance based on a sample, including numbers, text, and logical values + * + * Excel Function: + * VARA(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function VARA() + { + $returnValue = PHPExcel_Calculation_Functions::DIV0(); + + $summerA = $summerB = 0; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()); + $aCount = 0; + foreach ($aArgs as $k => $arg) { + if ((is_string($arg)) && + (PHPExcel_Calculation_Functions::isValue($k))) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif ((is_string($arg)) && + (!PHPExcel_Calculation_Functions::isMatrixValue($k))) { + } else { + // Is it a numeric value? + if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) & ($arg != '')))) { + if (is_bool($arg)) { + $arg = (integer) $arg; + } elseif (is_string($arg)) { + $arg = 0; + } + $summerA += ($arg * $arg); + $summerB += $arg; + ++$aCount; + } + } + } + + if ($aCount > 1) { + $summerA *= $aCount; + $summerB *= $summerB; + $returnValue = ($summerA - $summerB) / ($aCount * ($aCount - 1)); + } + return $returnValue; + } + + + /** + * VARP + * + * Calculates variance based on the entire population + * + * Excel Function: + * VARP(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function VARP() + { + // Return value + $returnValue = PHPExcel_Calculation_Functions::DIV0(); + + $summerA = $summerB = 0; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + $aCount = 0; + foreach ($aArgs as $arg) { + if (is_bool($arg)) { + $arg = (integer) $arg; + } + // Is it a numeric value? + if ((is_numeric($arg)) && (!is_string($arg))) { + $summerA += ($arg * $arg); + $summerB += $arg; + ++$aCount; + } + } + + if ($aCount > 0) { + $summerA *= $aCount; + $summerB *= $summerB; + $returnValue = ($summerA - $summerB) / ($aCount * $aCount); + } + return $returnValue; + } + + + /** + * VARPA + * + * Calculates variance based on the entire population, including numbers, text, and logical values + * + * Excel Function: + * VARPA(value1[,value2[, ...]]) + * + * @access public + * @category Statistical Functions + * @param mixed $arg,... Data values + * @return float + */ + public static function VARPA() + { + $returnValue = PHPExcel_Calculation_Functions::DIV0(); + + $summerA = $summerB = 0; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArrayIndexed(func_get_args()); + $aCount = 0; + foreach ($aArgs as $k => $arg) { + if ((is_string($arg)) && + (PHPExcel_Calculation_Functions::isValue($k))) { + return PHPExcel_Calculation_Functions::VALUE(); + } elseif ((is_string($arg)) && + (!PHPExcel_Calculation_Functions::isMatrixValue($k))) { + } else { + // Is it a numeric value? + if ((is_numeric($arg)) || (is_bool($arg)) || ((is_string($arg) & ($arg != '')))) { + if (is_bool($arg)) { + $arg = (integer) $arg; + } elseif (is_string($arg)) { + $arg = 0; + } + $summerA += ($arg * $arg); + $summerB += $arg; + ++$aCount; + } + } + } + + if ($aCount > 0) { + $summerA *= $aCount; + $summerB *= $summerB; + $returnValue = ($summerA - $summerB) / ($aCount * $aCount); + } + return $returnValue; + } + + + /** + * WEIBULL + * + * Returns the Weibull distribution. Use this distribution in reliability + * analysis, such as calculating a device's mean time to failure. + * + * @param float $value + * @param float $alpha Alpha Parameter + * @param float $beta Beta Parameter + * @param boolean $cumulative + * @return float + * + */ + public static function WEIBULL($value, $alpha, $beta, $cumulative) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $alpha = PHPExcel_Calculation_Functions::flattenSingleValue($alpha); + $beta = PHPExcel_Calculation_Functions::flattenSingleValue($beta); + + if ((is_numeric($value)) && (is_numeric($alpha)) && (is_numeric($beta))) { + if (($value < 0) || ($alpha <= 0) || ($beta <= 0)) { + return PHPExcel_Calculation_Functions::NaN(); + } + if ((is_numeric($cumulative)) || (is_bool($cumulative))) { + if ($cumulative) { + return 1 - exp(0 - pow($value / $beta, $alpha)); + } else { + return ($alpha / pow($beta, $alpha)) * pow($value, $alpha - 1) * exp(0 - pow($value / $beta, $alpha)); + } + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * ZTEST + * + * Returns the Weibull distribution. Use this distribution in reliability + * analysis, such as calculating a device's mean time to failure. + * + * @param float $dataSet + * @param float $m0 Alpha Parameter + * @param float $sigma Beta Parameter + * @param boolean $cumulative + * @return float + * + */ + public static function ZTEST($dataSet, $m0, $sigma = null) + { + $dataSet = PHPExcel_Calculation_Functions::flattenArrayIndexed($dataSet); + $m0 = PHPExcel_Calculation_Functions::flattenSingleValue($m0); + $sigma = PHPExcel_Calculation_Functions::flattenSingleValue($sigma); + + if (is_null($sigma)) { + $sigma = self::STDEV($dataSet); + } + $n = count($dataSet); + + return 1 - self::NORMSDIST((self::AVERAGE($dataSet) - $m0) / ($sigma / SQRT($n))); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Calculation/TextData.php b/application/third_party/PHPExcel/PHPExcel/Calculation/TextData.php new file mode 100644 index 0000000..6461d06 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Calculation/TextData.php @@ -0,0 +1,651 @@ +=0 && ord($c{0}) <= 127) { + return ord($c{0}); + } elseif (ord($c{0}) >= 192 && ord($c{0}) <= 223) { + return (ord($c{0})-192)*64 + (ord($c{1})-128); + } elseif (ord($c{0}) >= 224 && ord($c{0}) <= 239) { + return (ord($c{0})-224)*4096 + (ord($c{1})-128)*64 + (ord($c{2})-128); + } elseif (ord($c{0}) >= 240 && ord($c{0}) <= 247) { + return (ord($c{0})-240)*262144 + (ord($c{1})-128)*4096 + (ord($c{2})-128)*64 + (ord($c{3})-128); + } elseif (ord($c{0}) >= 248 && ord($c{0}) <= 251) { + return (ord($c{0})-248)*16777216 + (ord($c{1})-128)*262144 + (ord($c{2})-128)*4096 + (ord($c{3})-128)*64 + (ord($c{4})-128); + } elseif (ord($c{0}) >= 252 && ord($c{0}) <= 253) { + return (ord($c{0})-252)*1073741824 + (ord($c{1})-128)*16777216 + (ord($c{2})-128)*262144 + (ord($c{3})-128)*4096 + (ord($c{4})-128)*64 + (ord($c{5})-128); + } elseif (ord($c{0}) >= 254 && ord($c{0}) <= 255) { + // error + return PHPExcel_Calculation_Functions::VALUE(); + } + return 0; + } + + /** + * CHARACTER + * + * @param string $character Value + * @return int + */ + public static function CHARACTER($character) + { + $character = PHPExcel_Calculation_Functions::flattenSingleValue($character); + + if ((!is_numeric($character)) || ($character < 0)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (function_exists('mb_convert_encoding')) { + return mb_convert_encoding('&#'.intval($character).';', 'UTF-8', 'HTML-ENTITIES'); + } else { + return chr(intval($character)); + } + } + + + /** + * TRIMNONPRINTABLE + * + * @param mixed $stringValue Value to check + * @return string + */ + public static function TRIMNONPRINTABLE($stringValue = '') + { + $stringValue = PHPExcel_Calculation_Functions::flattenSingleValue($stringValue); + + if (is_bool($stringValue)) { + return ($stringValue) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + + if (self::$invalidChars == null) { + self::$invalidChars = range(chr(0), chr(31)); + } + + if (is_string($stringValue) || is_numeric($stringValue)) { + return str_replace(self::$invalidChars, '', trim($stringValue, "\x00..\x1F")); + } + return null; + } + + + /** + * TRIMSPACES + * + * @param mixed $stringValue Value to check + * @return string + */ + public static function TRIMSPACES($stringValue = '') + { + $stringValue = PHPExcel_Calculation_Functions::flattenSingleValue($stringValue); + if (is_bool($stringValue)) { + return ($stringValue) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + + if (is_string($stringValue) || is_numeric($stringValue)) { + return trim(preg_replace('/ +/', ' ', trim($stringValue, ' ')), ' '); + } + return null; + } + + + /** + * ASCIICODE + * + * @param string $characters Value + * @return int + */ + public static function ASCIICODE($characters) + { + if (($characters === null) || ($characters === '')) { + return PHPExcel_Calculation_Functions::VALUE(); + } + $characters = PHPExcel_Calculation_Functions::flattenSingleValue($characters); + if (is_bool($characters)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + $characters = (int) $characters; + } else { + $characters = ($characters) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + } + + $character = $characters; + if ((function_exists('mb_strlen')) && (function_exists('mb_substr'))) { + if (mb_strlen($characters, 'UTF-8') > 1) { + $character = mb_substr($characters, 0, 1, 'UTF-8'); + } + return self::unicodeToOrd($character); + } else { + if (strlen($characters) > 0) { + $character = substr($characters, 0, 1); + } + return ord($character); + } + } + + + /** + * CONCATENATE + * + * @return string + */ + public static function CONCATENATE() + { + $returnValue = ''; + + // Loop through arguments + $aArgs = PHPExcel_Calculation_Functions::flattenArray(func_get_args()); + foreach ($aArgs as $arg) { + if (is_bool($arg)) { + if (PHPExcel_Calculation_Functions::getCompatibilityMode() == PHPExcel_Calculation_Functions::COMPATIBILITY_OPENOFFICE) { + $arg = (int) $arg; + } else { + $arg = ($arg) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + } + $returnValue .= $arg; + } + + return $returnValue; + } + + + /** + * DOLLAR + * + * This function converts a number to text using currency format, with the decimals rounded to the specified place. + * The format used is $#,##0.00_);($#,##0.00).. + * + * @param float $value The value to format + * @param int $decimals The number of digits to display to the right of the decimal point. + * If decimals is negative, number is rounded to the left of the decimal point. + * If you omit decimals, it is assumed to be 2 + * @return string + */ + public static function DOLLAR($value = 0, $decimals = 2) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $decimals = is_null($decimals) ? 0 : PHPExcel_Calculation_Functions::flattenSingleValue($decimals); + + // Validate parameters + if (!is_numeric($value) || !is_numeric($decimals)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $decimals = floor($decimals); + + $mask = '$#,##0'; + if ($decimals > 0) { + $mask .= '.' . str_repeat('0', $decimals); + } else { + $round = pow(10, abs($decimals)); + if ($value < 0) { + $round = 0-$round; + } + $value = PHPExcel_Calculation_MathTrig::MROUND($value, $round); + } + + return PHPExcel_Style_NumberFormat::toFormattedString($value, $mask); + + } + + + /** + * SEARCHSENSITIVE + * + * @param string $needle The string to look for + * @param string $haystack The string in which to look + * @param int $offset Offset within $haystack + * @return string + */ + public static function SEARCHSENSITIVE($needle, $haystack, $offset = 1) + { + $needle = PHPExcel_Calculation_Functions::flattenSingleValue($needle); + $haystack = PHPExcel_Calculation_Functions::flattenSingleValue($haystack); + $offset = PHPExcel_Calculation_Functions::flattenSingleValue($offset); + + if (!is_bool($needle)) { + if (is_bool($haystack)) { + $haystack = ($haystack) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + + if (($offset > 0) && (PHPExcel_Shared_String::CountCharacters($haystack) > $offset)) { + if (PHPExcel_Shared_String::CountCharacters($needle) == 0) { + return $offset; + } + if (function_exists('mb_strpos')) { + $pos = mb_strpos($haystack, $needle, --$offset, 'UTF-8'); + } else { + $pos = strpos($haystack, $needle, --$offset); + } + if ($pos !== false) { + return ++$pos; + } + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * SEARCHINSENSITIVE + * + * @param string $needle The string to look for + * @param string $haystack The string in which to look + * @param int $offset Offset within $haystack + * @return string + */ + public static function SEARCHINSENSITIVE($needle, $haystack, $offset = 1) + { + $needle = PHPExcel_Calculation_Functions::flattenSingleValue($needle); + $haystack = PHPExcel_Calculation_Functions::flattenSingleValue($haystack); + $offset = PHPExcel_Calculation_Functions::flattenSingleValue($offset); + + if (!is_bool($needle)) { + if (is_bool($haystack)) { + $haystack = ($haystack) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + + if (($offset > 0) && (PHPExcel_Shared_String::CountCharacters($haystack) > $offset)) { + if (PHPExcel_Shared_String::CountCharacters($needle) == 0) { + return $offset; + } + if (function_exists('mb_stripos')) { + $pos = mb_stripos($haystack, $needle, --$offset, 'UTF-8'); + } else { + $pos = stripos($haystack, $needle, --$offset); + } + if ($pos !== false) { + return ++$pos; + } + } + } + return PHPExcel_Calculation_Functions::VALUE(); + } + + + /** + * FIXEDFORMAT + * + * @param mixed $value Value to check + * @param integer $decimals + * @param boolean $no_commas + * @return boolean + */ + public static function FIXEDFORMAT($value, $decimals = 2, $no_commas = false) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $decimals = PHPExcel_Calculation_Functions::flattenSingleValue($decimals); + $no_commas = PHPExcel_Calculation_Functions::flattenSingleValue($no_commas); + + // Validate parameters + if (!is_numeric($value) || !is_numeric($decimals)) { + return PHPExcel_Calculation_Functions::NaN(); + } + $decimals = floor($decimals); + + $valueResult = round($value, $decimals); + if ($decimals < 0) { + $decimals = 0; + } + if (!$no_commas) { + $valueResult = number_format($valueResult, $decimals); + } + + return (string) $valueResult; + } + + + /** + * LEFT + * + * @param string $value Value + * @param int $chars Number of characters + * @return string + */ + public static function LEFT($value = '', $chars = 1) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $chars = PHPExcel_Calculation_Functions::flattenSingleValue($chars); + + if ($chars < 0) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (is_bool($value)) { + $value = ($value) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + + if (function_exists('mb_substr')) { + return mb_substr($value, 0, $chars, 'UTF-8'); + } else { + return substr($value, 0, $chars); + } + } + + + /** + * MID + * + * @param string $value Value + * @param int $start Start character + * @param int $chars Number of characters + * @return string + */ + public static function MID($value = '', $start = 1, $chars = null) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $start = PHPExcel_Calculation_Functions::flattenSingleValue($start); + $chars = PHPExcel_Calculation_Functions::flattenSingleValue($chars); + + if (($start < 1) || ($chars < 0)) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (is_bool($value)) { + $value = ($value) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + + if (function_exists('mb_substr')) { + return mb_substr($value, --$start, $chars, 'UTF-8'); + } else { + return substr($value, --$start, $chars); + } + } + + + /** + * RIGHT + * + * @param string $value Value + * @param int $chars Number of characters + * @return string + */ + public static function RIGHT($value = '', $chars = 1) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $chars = PHPExcel_Calculation_Functions::flattenSingleValue($chars); + + if ($chars < 0) { + return PHPExcel_Calculation_Functions::VALUE(); + } + + if (is_bool($value)) { + $value = ($value) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + + if ((function_exists('mb_substr')) && (function_exists('mb_strlen'))) { + return mb_substr($value, mb_strlen($value, 'UTF-8') - $chars, $chars, 'UTF-8'); + } else { + return substr($value, strlen($value) - $chars); + } + } + + + /** + * STRINGLENGTH + * + * @param string $value Value + * @return string + */ + public static function STRINGLENGTH($value = '') + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + + if (is_bool($value)) { + $value = ($value) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + + if (function_exists('mb_strlen')) { + return mb_strlen($value, 'UTF-8'); + } else { + return strlen($value); + } + } + + + /** + * LOWERCASE + * + * Converts a string value to upper case. + * + * @param string $mixedCaseString + * @return string + */ + public static function LOWERCASE($mixedCaseString) + { + $mixedCaseString = PHPExcel_Calculation_Functions::flattenSingleValue($mixedCaseString); + + if (is_bool($mixedCaseString)) { + $mixedCaseString = ($mixedCaseString) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + + return PHPExcel_Shared_String::StrToLower($mixedCaseString); + } + + + /** + * UPPERCASE + * + * Converts a string value to upper case. + * + * @param string $mixedCaseString + * @return string + */ + public static function UPPERCASE($mixedCaseString) + { + $mixedCaseString = PHPExcel_Calculation_Functions::flattenSingleValue($mixedCaseString); + + if (is_bool($mixedCaseString)) { + $mixedCaseString = ($mixedCaseString) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + + return PHPExcel_Shared_String::StrToUpper($mixedCaseString); + } + + + /** + * PROPERCASE + * + * Converts a string value to upper case. + * + * @param string $mixedCaseString + * @return string + */ + public static function PROPERCASE($mixedCaseString) + { + $mixedCaseString = PHPExcel_Calculation_Functions::flattenSingleValue($mixedCaseString); + + if (is_bool($mixedCaseString)) { + $mixedCaseString = ($mixedCaseString) ? PHPExcel_Calculation::getTRUE() : PHPExcel_Calculation::getFALSE(); + } + + return PHPExcel_Shared_String::StrToTitle($mixedCaseString); + } + + + /** + * REPLACE + * + * @param string $oldText String to modify + * @param int $start Start character + * @param int $chars Number of characters + * @param string $newText String to replace in defined position + * @return string + */ + public static function REPLACE($oldText = '', $start = 1, $chars = null, $newText) + { + $oldText = PHPExcel_Calculation_Functions::flattenSingleValue($oldText); + $start = PHPExcel_Calculation_Functions::flattenSingleValue($start); + $chars = PHPExcel_Calculation_Functions::flattenSingleValue($chars); + $newText = PHPExcel_Calculation_Functions::flattenSingleValue($newText); + + $left = self::LEFT($oldText, $start-1); + $right = self::RIGHT($oldText, self::STRINGLENGTH($oldText)-($start+$chars)+1); + + return $left.$newText.$right; + } + + + /** + * SUBSTITUTE + * + * @param string $text Value + * @param string $fromText From Value + * @param string $toText To Value + * @param integer $instance Instance Number + * @return string + */ + public static function SUBSTITUTE($text = '', $fromText = '', $toText = '', $instance = 0) + { + $text = PHPExcel_Calculation_Functions::flattenSingleValue($text); + $fromText = PHPExcel_Calculation_Functions::flattenSingleValue($fromText); + $toText = PHPExcel_Calculation_Functions::flattenSingleValue($toText); + $instance = floor(PHPExcel_Calculation_Functions::flattenSingleValue($instance)); + + if ($instance == 0) { + if (function_exists('mb_str_replace')) { + return mb_str_replace($fromText, $toText, $text); + } else { + return str_replace($fromText, $toText, $text); + } + } else { + $pos = -1; + while ($instance > 0) { + if (function_exists('mb_strpos')) { + $pos = mb_strpos($text, $fromText, $pos+1, 'UTF-8'); + } else { + $pos = strpos($text, $fromText, $pos+1); + } + if ($pos === false) { + break; + } + --$instance; + } + if ($pos !== false) { + if (function_exists('mb_strlen')) { + return self::REPLACE($text, ++$pos, mb_strlen($fromText, 'UTF-8'), $toText); + } else { + return self::REPLACE($text, ++$pos, strlen($fromText), $toText); + } + } + } + + return $text; + } + + + /** + * RETURNSTRING + * + * @param mixed $testValue Value to check + * @return boolean + */ + public static function RETURNSTRING($testValue = '') + { + $testValue = PHPExcel_Calculation_Functions::flattenSingleValue($testValue); + + if (is_string($testValue)) { + return $testValue; + } + return null; + } + + + /** + * TEXTFORMAT + * + * @param mixed $value Value to check + * @param string $format Format mask to use + * @return boolean + */ + public static function TEXTFORMAT($value, $format) + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + $format = PHPExcel_Calculation_Functions::flattenSingleValue($format); + + if ((is_string($value)) && (!is_numeric($value)) && PHPExcel_Shared_Date::isDateTimeFormatCode($format)) { + $value = PHPExcel_Calculation_DateTime::DATEVALUE($value); + } + + return (string) PHPExcel_Style_NumberFormat::toFormattedString($value, $format); + } + + /** + * VALUE + * + * @param mixed $value Value to check + * @return boolean + */ + public static function VALUE($value = '') + { + $value = PHPExcel_Calculation_Functions::flattenSingleValue($value); + + if (!is_numeric($value)) { + $numberValue = str_replace( + PHPExcel_Shared_String::getThousandsSeparator(), + '', + trim($value, " \t\n\r\0\x0B" . PHPExcel_Shared_String::getCurrencyCode()) + ); + if (is_numeric($numberValue)) { + return (float) $numberValue; + } + + $dateSetting = PHPExcel_Calculation_Functions::getReturnDateType(); + PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL); + + if (strpos($value, ':') !== false) { + $timeValue = PHPExcel_Calculation_DateTime::TIMEVALUE($value); + if ($timeValue !== PHPExcel_Calculation_Functions::VALUE()) { + PHPExcel_Calculation_Functions::setReturnDateType($dateSetting); + return $timeValue; + } + } + $dateValue = PHPExcel_Calculation_DateTime::DATEVALUE($value); + if ($dateValue !== PHPExcel_Calculation_Functions::VALUE()) { + PHPExcel_Calculation_Functions::setReturnDateType($dateSetting); + return $dateValue; + } + PHPExcel_Calculation_Functions::setReturnDateType($dateSetting); + + return PHPExcel_Calculation_Functions::VALUE(); + } + return (float) $value; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Calculation/Token/Stack.php b/application/third_party/PHPExcel/PHPExcel/Calculation/Token/Stack.php new file mode 100644 index 0000000..02ed5aa --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Calculation/Token/Stack.php @@ -0,0 +1,111 @@ +count; + } + + /** + * Push a new entry onto the stack + * + * @param mixed $type + * @param mixed $value + * @param mixed $reference + */ + public function push($type, $value, $reference = null) + { + $this->stack[$this->count++] = array( + 'type' => $type, + 'value' => $value, + 'reference' => $reference + ); + if ($type == 'Function') { + $localeFunction = PHPExcel_Calculation::localeFunc($value); + if ($localeFunction != $value) { + $this->stack[($this->count - 1)]['localeValue'] = $localeFunction; + } + } + } + + /** + * Pop the last entry from the stack + * + * @return mixed + */ + public function pop() + { + if ($this->count > 0) { + return $this->stack[--$this->count]; + } + return null; + } + + /** + * Return an entry from the stack without removing it + * + * @param integer $n number indicating how far back in the stack we want to look + * @return mixed + */ + public function last($n = 1) + { + if ($this->count - $n < 0) { + return null; + } + return $this->stack[$this->count - $n]; + } + + /** + * Clear the stack + */ + public function clear() + { + $this->stack = array(); + $this->count = 0; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Calculation/functionlist.txt b/application/third_party/PHPExcel/PHPExcel/Calculation/functionlist.txt new file mode 100644 index 0000000..67dbd49 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Calculation/functionlist.txt @@ -0,0 +1,351 @@ +ABS +ACCRINT +ACCRINTM +ACOS +ACOSH +ADDRESS +AMORDEGRC +AMORLINC +AND +AREAS +ASC +ASIN +ASINH +ATAN +ATAN2 +ATANH +AVEDEV +AVERAGE +AVERAGEA +AVERAGEIF +AVERAGEIFS +BAHTTEXT +BESSELI +BESSELJ +BESSELK +BESSELY +BETADIST +BETAINV +BIN2DEC +BIN2HEX +BIN2OCT +BINOMDIST +CEILING +CELL +CHAR +CHIDIST +CHIINV +CHITEST +CHOOSE +CLEAN +CODE +COLUMN +COLUMNS +COMBIN +COMPLEX +CONCATENATE +CONFIDENCE +CONVERT +CORREL +COS +COSH +COUNT +COUNTA +COUNTBLANK +COUNTIF +COUNTIFS +COUPDAYBS +COUPDAYBS +COUPDAYSNC +COUPNCD +COUPNUM +COUPPCD +COVAR +CRITBINOM +CUBEKPIMEMBER +CUBEMEMBER +CUBEMEMBERPROPERTY +CUBERANKEDMEMBER +CUBESET +CUBESETCOUNT +CUBEVALUE +CUMIPMT +CUMPRINC +DATE +DATEDIF +DATEVALUE +DAVERAGE +DAY +DAYS360 +DB +DCOUNT +DCOUNTA +DDB +DEC2BIN +DEC2HEX +DEC2OCT +DEGREES +DELTA +DEVSQ +DGET +DISC +DMAX +DMIN +DOLLAR +DOLLARDE +DOLLARFR +DPRODUCT +DSTDEV +DSTDEVP +DSUM +DURATION +DVAR +DVARP +EDATE +EFFECT +EOMONTH +ERF +ERFC +ERROR.TYPE +EVEN +EXACT +EXP +EXPONDIST +FACT +FACTDOUBLE +FALSE +FDIST +FIND +FINDB +FINV +FISHER +FISHERINV +FIXED +FLOOR +FORECAST +FREQUENCY +FTEST +FV +FVSCHEDULE +GAMAMDIST +GAMMAINV +GAMMALN +GCD +GEOMEAN +GESTEP +GETPIVOTDATA +GROWTH +HARMEAN +HEX2BIN +HEX2OCT +HLOOKUP +HOUR +HYPERLINK +HYPGEOMDIST +IF +IFERROR +IMABS +IMAGINARY +IMARGUMENT +IMCONJUGATE +IMCOS +IMEXP +IMLN +IMLOG10 +IMLOG2 +IMPOWER +IMPRODUCT +IMREAL +IMSIN +IMSQRT +IMSUB +IMSUM +INDEX +INDIRECT +INFO +INT +INTERCEPT +INTRATE +IPMT +IRR +ISBLANK +ISERR +ISERROR +ISEVEN +ISLOGICAL +ISNA +ISNONTEXT +ISNUMBER +ISODD +ISPMT +ISREF +ISTEXT +JIS +KURT +LARGE +LCM +LEFT +LEFTB +LEN +LENB +LINEST +LN +LOG +LOG10 +LOGEST +LOGINV +LOGNORMDIST +LOOKUP +LOWER +MATCH +MAX +MAXA +MDETERM +MDURATION +MEDIAN +MID +MIDB +MIN +MINA +MINUTE +MINVERSE +MIRR +MMULT +MOD +MODE +MONTH +MROUND +MULTINOMIAL +N +NA +NEGBINOMDIST +NETWORKDAYS +NOMINAL +NORMDIST +NORMINV +NORMSDIST +NORMSINV +NOT +NOW +NPER +NPV +OCT2BIN +OCT2DEC +OCT2HEX +ODD +ODDFPRICE +ODDFYIELD +ODDLPRICE +ODDLYIELD +OFFSET +OR +PEARSON +PERCENTILE +PERCENTRANK +PERMUT +PHONETIC +PI +PMT +POISSON +POWER +PPMT +PRICE +PRICEDISC +PRICEMAT +PROB +PRODUCT +PROPER +PV +QUARTILE +QUOTIENT +RADIANS +RAND +RANDBETWEEN +RANK +RATE +RECEIVED +REPLACE +REPLACEB +REPT +RIGHT +RIGHTB +ROMAN +ROUND +ROUNDDOWN +ROUNDUP +ROW +ROWS +RSQ +RTD +SEARCH +SEARCHB +SECOND +SERIESSUM +SIGN +SIN +SINH +SKEW +SLN +SLOPE +SMALL +SQRT +SQRTPI +STANDARDIZE +STDEV +STDEVA +STDEVP +STDEVPA +STEYX +SUBSTITUTE +SUBTOTAL +SUM +SUMIF +SUMIFS +SUMPRODUCT +SUMSQ +SUMX2MY2 +SUMX2PY2 +SUMXMY2 +SYD +T +TAN +TANH +TBILLEQ +TBILLPRICE +TBILLYIELD +TDIST +TEXT +TIME +TIMEVALUE +TINV +TODAY +TRANSPOSE +TREND +TRIM +TRIMMEAN +TRUE +TRUNC +TTEST +TYPE +UPPER +USDOLLAR +VALUE +VAR +VARA +VARP +VARPA +VDB +VERSION +VLOOKUP +WEEKDAY +WEEKNUM +WEIBULL +WORKDAY +XIRR +XNPV +YEAR +YEARFRAC +YIELD +YIELDDISC +YIELDMAT +ZTEST diff --git a/application/third_party/PHPExcel/PHPExcel/Cell.php b/application/third_party/PHPExcel/PHPExcel/Cell.php new file mode 100644 index 0000000..c99a3c8 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Cell.php @@ -0,0 +1,1032 @@ +parent->updateCacheData($this); + + return $this; + } + + public function detach() + { + $this->parent = null; + } + + public function attach(PHPExcel_CachedObjectStorage_CacheBase $parent) + { + $this->parent = $parent; + } + + + /** + * Create a new Cell + * + * @param mixed $pValue + * @param string $pDataType + * @param PHPExcel_Worksheet $pSheet + * @throws PHPExcel_Exception + */ + public function __construct($pValue = null, $pDataType = null, PHPExcel_Worksheet $pSheet = null) + { + // Initialise cell value + $this->value = $pValue; + + // Set worksheet cache + $this->parent = $pSheet->getCellCacheController(); + + // Set datatype? + if ($pDataType !== null) { + if ($pDataType == PHPExcel_Cell_DataType::TYPE_STRING2) { + $pDataType = PHPExcel_Cell_DataType::TYPE_STRING; + } + $this->dataType = $pDataType; + } elseif (!self::getValueBinder()->bindValue($this, $pValue)) { + throw new PHPExcel_Exception("Value could not be bound to cell."); + } + } + + /** + * Get cell coordinate column + * + * @return string + */ + public function getColumn() + { + return $this->parent->getCurrentColumn(); + } + + /** + * Get cell coordinate row + * + * @return int + */ + public function getRow() + { + return $this->parent->getCurrentRow(); + } + + /** + * Get cell coordinate + * + * @return string + */ + public function getCoordinate() + { + return $this->parent->getCurrentAddress(); + } + + /** + * Get cell value + * + * @return mixed + */ + public function getValue() + { + return $this->value; + } + + /** + * Get cell value with formatting + * + * @return string + */ + public function getFormattedValue() + { + return (string) PHPExcel_Style_NumberFormat::toFormattedString( + $this->getCalculatedValue(), + $this->getStyle() + ->getNumberFormat()->getFormatCode() + ); + } + + /** + * Set cell value + * + * Sets the value for a cell, automatically determining the datatype using the value binder + * + * @param mixed $pValue Value + * @return PHPExcel_Cell + * @throws PHPExcel_Exception + */ + public function setValue($pValue = null) + { + if (!self::getValueBinder()->bindValue($this, $pValue)) { + throw new PHPExcel_Exception("Value could not be bound to cell."); + } + return $this; + } + + /** + * Set the value for a cell, with the explicit data type passed to the method (bypassing any use of the value binder) + * + * @param mixed $pValue Value + * @param string $pDataType Explicit data type + * @return PHPExcel_Cell + * @throws PHPExcel_Exception + */ + public function setValueExplicit($pValue = null, $pDataType = PHPExcel_Cell_DataType::TYPE_STRING) + { + // set the value according to data type + switch ($pDataType) { + case PHPExcel_Cell_DataType::TYPE_NULL: + $this->value = $pValue; + break; + case PHPExcel_Cell_DataType::TYPE_STRING2: + $pDataType = PHPExcel_Cell_DataType::TYPE_STRING; + // no break + case PHPExcel_Cell_DataType::TYPE_STRING: + // Synonym for string + case PHPExcel_Cell_DataType::TYPE_INLINE: + // Rich text + $this->value = PHPExcel_Cell_DataType::checkString($pValue); + break; + case PHPExcel_Cell_DataType::TYPE_NUMERIC: + $this->value = (float) $pValue; + break; + case PHPExcel_Cell_DataType::TYPE_FORMULA: + $this->value = (string) $pValue; + break; + case PHPExcel_Cell_DataType::TYPE_BOOL: + $this->value = (bool) $pValue; + break; + case PHPExcel_Cell_DataType::TYPE_ERROR: + $this->value = PHPExcel_Cell_DataType::checkErrorCode($pValue); + break; + default: + throw new PHPExcel_Exception('Invalid datatype: ' . $pDataType); + break; + } + + // set the datatype + $this->dataType = $pDataType; + + return $this->notifyCacheController(); + } + + /** + * Get calculated cell value + * + * @deprecated Since version 1.7.8 for planned changes to cell for array formula handling + * + * @param boolean $resetLog Whether the calculation engine logger should be reset or not + * @return mixed + * @throws PHPExcel_Exception + */ + public function getCalculatedValue($resetLog = true) + { +//echo 'Cell '.$this->getCoordinate().' value is a '.$this->dataType.' with a value of '.$this->getValue().PHP_EOL; + if ($this->dataType == PHPExcel_Cell_DataType::TYPE_FORMULA) { + try { +//echo 'Cell value for '.$this->getCoordinate().' is a formula: Calculating value'.PHP_EOL; + $result = PHPExcel_Calculation::getInstance( + $this->getWorksheet()->getParent() + )->calculateCellValue($this, $resetLog); +//echo $this->getCoordinate().' calculation result is '.$result.PHP_EOL; + // We don't yet handle array returns + if (is_array($result)) { + while (is_array($result)) { + $result = array_pop($result); + } + } + } catch (PHPExcel_Exception $ex) { + if (($ex->getMessage() === 'Unable to access External Workbook') && ($this->calculatedValue !== null)) { +//echo 'Returning fallback value of '.$this->calculatedValue.' for cell '.$this->getCoordinate().PHP_EOL; + return $this->calculatedValue; // Fallback for calculations referencing external files. + } +//echo 'Calculation Exception: '.$ex->getMessage().PHP_EOL; + $result = '#N/A'; + throw new PHPExcel_Calculation_Exception( + $this->getWorksheet()->getTitle().'!'.$this->getCoordinate().' -> '.$ex->getMessage() + ); + } + + if ($result === '#Not Yet Implemented') { +//echo 'Returning fallback value of '.$this->calculatedValue.' for cell '.$this->getCoordinate().PHP_EOL; + return $this->calculatedValue; // Fallback if calculation engine does not support the formula. + } +//echo 'Returning calculated value of '.$result.' for cell '.$this->getCoordinate().PHP_EOL; + return $result; + } elseif ($this->value instanceof PHPExcel_RichText) { +// echo 'Cell value for '.$this->getCoordinate().' is rich text: Returning data value of '.$this->value.'
'; + return $this->value->getPlainText(); + } +// echo 'Cell value for '.$this->getCoordinate().' is not a formula: Returning data value of '.$this->value.'
'; + return $this->value; + } + + /** + * Set old calculated value (cached) + * + * @param mixed $pValue Value + * @return PHPExcel_Cell + */ + public function setCalculatedValue($pValue = null) + { + if ($pValue !== null) { + $this->calculatedValue = (is_numeric($pValue)) ? (float) $pValue : $pValue; + } + + return $this->notifyCacheController(); + } + + /** + * Get old calculated value (cached) + * This returns the value last calculated by MS Excel or whichever spreadsheet program was used to + * create the original spreadsheet file. + * Note that this value is not guaranteed to refelect the actual calculated value because it is + * possible that auto-calculation was disabled in the original spreadsheet, and underlying data + * values used by the formula have changed since it was last calculated. + * + * @return mixed + */ + public function getOldCalculatedValue() + { + return $this->calculatedValue; + } + + /** + * Get cell data type + * + * @return string + */ + public function getDataType() + { + return $this->dataType; + } + + /** + * Set cell data type + * + * @param string $pDataType + * @return PHPExcel_Cell + */ + public function setDataType($pDataType = PHPExcel_Cell_DataType::TYPE_STRING) + { + if ($pDataType == PHPExcel_Cell_DataType::TYPE_STRING2) { + $pDataType = PHPExcel_Cell_DataType::TYPE_STRING; + } + $this->dataType = $pDataType; + + return $this->notifyCacheController(); + } + + /** + * Identify if the cell contains a formula + * + * @return boolean + */ + public function isFormula() + { + return $this->dataType == PHPExcel_Cell_DataType::TYPE_FORMULA; + } + + /** + * Does this cell contain Data validation rules? + * + * @return boolean + * @throws PHPExcel_Exception + */ + public function hasDataValidation() + { + if (!isset($this->parent)) { + throw new PHPExcel_Exception('Cannot check for data validation when cell is not bound to a worksheet'); + } + + return $this->getWorksheet()->dataValidationExists($this->getCoordinate()); + } + + /** + * Get Data validation rules + * + * @return PHPExcel_Cell_DataValidation + * @throws PHPExcel_Exception + */ + public function getDataValidation() + { + if (!isset($this->parent)) { + throw new PHPExcel_Exception('Cannot get data validation for cell that is not bound to a worksheet'); + } + + return $this->getWorksheet()->getDataValidation($this->getCoordinate()); + } + + /** + * Set Data validation rules + * + * @param PHPExcel_Cell_DataValidation $pDataValidation + * @return PHPExcel_Cell + * @throws PHPExcel_Exception + */ + public function setDataValidation(PHPExcel_Cell_DataValidation $pDataValidation = null) + { + if (!isset($this->parent)) { + throw new PHPExcel_Exception('Cannot set data validation for cell that is not bound to a worksheet'); + } + + $this->getWorksheet()->setDataValidation($this->getCoordinate(), $pDataValidation); + + return $this->notifyCacheController(); + } + + /** + * Does this cell contain a Hyperlink? + * + * @return boolean + * @throws PHPExcel_Exception + */ + public function hasHyperlink() + { + if (!isset($this->parent)) { + throw new PHPExcel_Exception('Cannot check for hyperlink when cell is not bound to a worksheet'); + } + + return $this->getWorksheet()->hyperlinkExists($this->getCoordinate()); + } + + /** + * Get Hyperlink + * + * @return PHPExcel_Cell_Hyperlink + * @throws PHPExcel_Exception + */ + public function getHyperlink() + { + if (!isset($this->parent)) { + throw new PHPExcel_Exception('Cannot get hyperlink for cell that is not bound to a worksheet'); + } + + return $this->getWorksheet()->getHyperlink($this->getCoordinate()); + } + + /** + * Set Hyperlink + * + * @param PHPExcel_Cell_Hyperlink $pHyperlink + * @return PHPExcel_Cell + * @throws PHPExcel_Exception + */ + public function setHyperlink(PHPExcel_Cell_Hyperlink $pHyperlink = null) + { + if (!isset($this->parent)) { + throw new PHPExcel_Exception('Cannot set hyperlink for cell that is not bound to a worksheet'); + } + + $this->getWorksheet()->setHyperlink($this->getCoordinate(), $pHyperlink); + + return $this->notifyCacheController(); + } + + /** + * Get parent worksheet + * + * @return PHPExcel_CachedObjectStorage_CacheBase + */ + public function getParent() + { + return $this->parent; + } + + /** + * Get parent worksheet + * + * @return PHPExcel_Worksheet + */ + public function getWorksheet() + { + return $this->parent->getParent(); + } + + /** + * Is this cell in a merge range + * + * @return boolean + */ + public function isInMergeRange() + { + return (boolean) $this->getMergeRange(); + } + + /** + * Is this cell the master (top left cell) in a merge range (that holds the actual data value) + * + * @return boolean + */ + public function isMergeRangeValueCell() + { + if ($mergeRange = $this->getMergeRange()) { + $mergeRange = PHPExcel_Cell::splitRange($mergeRange); + list($startCell) = $mergeRange[0]; + if ($this->getCoordinate() === $startCell) { + return true; + } + } + return false; + } + + /** + * If this cell is in a merge range, then return the range + * + * @return string + */ + public function getMergeRange() + { + foreach ($this->getWorksheet()->getMergeCells() as $mergeRange) { + if ($this->isInRange($mergeRange)) { + return $mergeRange; + } + } + return false; + } + + /** + * Get cell style + * + * @return PHPExcel_Style + */ + public function getStyle() + { + return $this->getWorksheet()->getStyle($this->getCoordinate()); + } + + /** + * Re-bind parent + * + * @param PHPExcel_Worksheet $parent + * @return PHPExcel_Cell + */ + public function rebindParent(PHPExcel_Worksheet $parent) + { + $this->parent = $parent->getCellCacheController(); + + return $this->notifyCacheController(); + } + + /** + * Is cell in a specific range? + * + * @param string $pRange Cell range (e.g. A1:A1) + * @return boolean + */ + public function isInRange($pRange = 'A1:A1') + { + list($rangeStart, $rangeEnd) = self::rangeBoundaries($pRange); + + // Translate properties + $myColumn = self::columnIndexFromString($this->getColumn()); + $myRow = $this->getRow(); + + // Verify if cell is in range + return (($rangeStart[0] <= $myColumn) && ($rangeEnd[0] >= $myColumn) && + ($rangeStart[1] <= $myRow) && ($rangeEnd[1] >= $myRow) + ); + } + + /** + * Coordinate from string + * + * @param string $pCoordinateString + * @return array Array containing column and row (indexes 0 and 1) + * @throws PHPExcel_Exception + */ + public static function coordinateFromString($pCoordinateString = 'A1') + { + if (preg_match("/^([$]?[A-Z]{1,3})([$]?\d{1,7})$/", $pCoordinateString, $matches)) { + return array($matches[1],$matches[2]); + } elseif ((strpos($pCoordinateString, ':') !== false) || (strpos($pCoordinateString, ',') !== false)) { + throw new PHPExcel_Exception('Cell coordinate string can not be a range of cells'); + } elseif ($pCoordinateString == '') { + throw new PHPExcel_Exception('Cell coordinate can not be zero-length string'); + } + + throw new PHPExcel_Exception('Invalid cell coordinate '.$pCoordinateString); + } + + /** + * Make string row, column or cell coordinate absolute + * + * @param string $pCoordinateString e.g. 'A' or '1' or 'A1' + * Note that this value can be a row or column reference as well as a cell reference + * @return string Absolute coordinate e.g. '$A' or '$1' or '$A$1' + * @throws PHPExcel_Exception + */ + public static function absoluteReference($pCoordinateString = 'A1') + { + if (strpos($pCoordinateString, ':') === false && strpos($pCoordinateString, ',') === false) { + // Split out any worksheet name from the reference + $worksheet = ''; + $cellAddress = explode('!', $pCoordinateString); + if (count($cellAddress) > 1) { + list($worksheet, $pCoordinateString) = $cellAddress; + } + if ($worksheet > '') { + $worksheet .= '!'; + } + + // Create absolute coordinate + if (ctype_digit($pCoordinateString)) { + return $worksheet . '$' . $pCoordinateString; + } elseif (ctype_alpha($pCoordinateString)) { + return $worksheet . '$' . strtoupper($pCoordinateString); + } + return $worksheet . self::absoluteCoordinate($pCoordinateString); + } + + throw new PHPExcel_Exception('Cell coordinate string can not be a range of cells'); + } + + /** + * Make string coordinate absolute + * + * @param string $pCoordinateString e.g. 'A1' + * @return string Absolute coordinate e.g. '$A$1' + * @throws PHPExcel_Exception + */ + public static function absoluteCoordinate($pCoordinateString = 'A1') + { + if (strpos($pCoordinateString, ':') === false && strpos($pCoordinateString, ',') === false) { + // Split out any worksheet name from the coordinate + $worksheet = ''; + $cellAddress = explode('!', $pCoordinateString); + if (count($cellAddress) > 1) { + list($worksheet, $pCoordinateString) = $cellAddress; + } + if ($worksheet > '') { + $worksheet .= '!'; + } + + // Create absolute coordinate + list($column, $row) = self::coordinateFromString($pCoordinateString); + $column = ltrim($column, '$'); + $row = ltrim($row, '$'); + return $worksheet . '$' . $column . '$' . $row; + } + + throw new PHPExcel_Exception('Cell coordinate string can not be a range of cells'); + } + + /** + * Split range into coordinate strings + * + * @param string $pRange e.g. 'B4:D9' or 'B4:D9,H2:O11' or 'B4' + * @return array Array containg one or more arrays containing one or two coordinate strings + * e.g. array('B4','D9') or array(array('B4','D9'),array('H2','O11')) + * or array('B4') + */ + public static function splitRange($pRange = 'A1:A1') + { + // Ensure $pRange is a valid range + if (empty($pRange)) { + $pRange = self::DEFAULT_RANGE; + } + + $exploded = explode(',', $pRange); + $counter = count($exploded); + for ($i = 0; $i < $counter; ++$i) { + $exploded[$i] = explode(':', $exploded[$i]); + } + return $exploded; + } + + /** + * Build range from coordinate strings + * + * @param array $pRange Array containg one or more arrays containing one or two coordinate strings + * @return string String representation of $pRange + * @throws PHPExcel_Exception + */ + public static function buildRange($pRange) + { + // Verify range + if (!is_array($pRange) || empty($pRange) || !is_array($pRange[0])) { + throw new PHPExcel_Exception('Range does not contain any information'); + } + + // Build range + $imploded = array(); + $counter = count($pRange); + for ($i = 0; $i < $counter; ++$i) { + $pRange[$i] = implode(':', $pRange[$i]); + } + $imploded = implode(',', $pRange); + + return $imploded; + } + + /** + * Calculate range boundaries + * + * @param string $pRange Cell range (e.g. A1:A1) + * @return array Range coordinates array(Start Cell, End Cell) + * where Start Cell and End Cell are arrays (Column Number, Row Number) + */ + public static function rangeBoundaries($pRange = 'A1:A1') + { + // Ensure $pRange is a valid range + if (empty($pRange)) { + $pRange = self::DEFAULT_RANGE; + } + + // Uppercase coordinate + $pRange = strtoupper($pRange); + + // Extract range + if (strpos($pRange, ':') === false) { + $rangeA = $rangeB = $pRange; + } else { + list($rangeA, $rangeB) = explode(':', $pRange); + } + + // Calculate range outer borders + $rangeStart = self::coordinateFromString($rangeA); + $rangeEnd = self::coordinateFromString($rangeB); + + // Translate column into index + $rangeStart[0] = self::columnIndexFromString($rangeStart[0]); + $rangeEnd[0] = self::columnIndexFromString($rangeEnd[0]); + + return array($rangeStart, $rangeEnd); + } + + /** + * Calculate range dimension + * + * @param string $pRange Cell range (e.g. A1:A1) + * @return array Range dimension (width, height) + */ + public static function rangeDimension($pRange = 'A1:A1') + { + // Calculate range outer borders + list($rangeStart, $rangeEnd) = self::rangeBoundaries($pRange); + + return array( ($rangeEnd[0] - $rangeStart[0] + 1), ($rangeEnd[1] - $rangeStart[1] + 1) ); + } + + /** + * Calculate range boundaries + * + * @param string $pRange Cell range (e.g. A1:A1) + * @return array Range coordinates array(Start Cell, End Cell) + * where Start Cell and End Cell are arrays (Column ID, Row Number) + */ + public static function getRangeBoundaries($pRange = 'A1:A1') + { + // Ensure $pRange is a valid range + if (empty($pRange)) { + $pRange = self::DEFAULT_RANGE; + } + + // Uppercase coordinate + $pRange = strtoupper($pRange); + + // Extract range + if (strpos($pRange, ':') === false) { + $rangeA = $rangeB = $pRange; + } else { + list($rangeA, $rangeB) = explode(':', $pRange); + } + + return array( self::coordinateFromString($rangeA), self::coordinateFromString($rangeB)); + } + + /** + * Column index from string + * + * @param string $pString + * @return int Column index (base 1 !!!) + */ + public static function columnIndexFromString($pString = 'A') + { + // Using a lookup cache adds a slight memory overhead, but boosts speed + // caching using a static within the method is faster than a class static, + // though it's additional memory overhead + static $_indexCache = array(); + + if (isset($_indexCache[$pString])) { + return $_indexCache[$pString]; + } + // It's surprising how costly the strtoupper() and ord() calls actually are, so we use a lookup array rather than use ord() + // and make it case insensitive to get rid of the strtoupper() as well. Because it's a static, there's no significant + // memory overhead either + static $_columnLookup = array( + 'A' => 1, 'B' => 2, 'C' => 3, 'D' => 4, 'E' => 5, 'F' => 6, 'G' => 7, 'H' => 8, 'I' => 9, 'J' => 10, 'K' => 11, 'L' => 12, 'M' => 13, + 'N' => 14, 'O' => 15, 'P' => 16, 'Q' => 17, 'R' => 18, 'S' => 19, 'T' => 20, 'U' => 21, 'V' => 22, 'W' => 23, 'X' => 24, 'Y' => 25, 'Z' => 26, + 'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5, 'f' => 6, 'g' => 7, 'h' => 8, 'i' => 9, 'j' => 10, 'k' => 11, 'l' => 12, 'm' => 13, + 'n' => 14, 'o' => 15, 'p' => 16, 'q' => 17, 'r' => 18, 's' => 19, 't' => 20, 'u' => 21, 'v' => 22, 'w' => 23, 'x' => 24, 'y' => 25, 'z' => 26 + ); + + // We also use the language construct isset() rather than the more costly strlen() function to match the length of $pString + // for improved performance + if (isset($pString{0})) { + if (!isset($pString{1})) { + $_indexCache[$pString] = $_columnLookup[$pString]; + return $_indexCache[$pString]; + } elseif (!isset($pString{2})) { + $_indexCache[$pString] = $_columnLookup[$pString{0}] * 26 + $_columnLookup[$pString{1}]; + return $_indexCache[$pString]; + } elseif (!isset($pString{3})) { + $_indexCache[$pString] = $_columnLookup[$pString{0}] * 676 + $_columnLookup[$pString{1}] * 26 + $_columnLookup[$pString{2}]; + return $_indexCache[$pString]; + } + } + throw new PHPExcel_Exception("Column string index can not be " . ((isset($pString{0})) ? "longer than 3 characters" : "empty")); + } + + /** + * String from columnindex + * + * @param int $pColumnIndex Column index (base 0 !!!) + * @return string + */ + public static function stringFromColumnIndex($pColumnIndex = 0) + { + // Using a lookup cache adds a slight memory overhead, but boosts speed + // caching using a static within the method is faster than a class static, + // though it's additional memory overhead + static $_indexCache = array(); + + if (!isset($_indexCache[$pColumnIndex])) { + // Determine column string + if ($pColumnIndex < 26) { + $_indexCache[$pColumnIndex] = chr(65 + $pColumnIndex); + } elseif ($pColumnIndex < 702) { + $_indexCache[$pColumnIndex] = chr(64 + ($pColumnIndex / 26)) . + chr(65 + $pColumnIndex % 26); + } else { + $_indexCache[$pColumnIndex] = chr(64 + (($pColumnIndex - 26) / 676)) . + chr(65 + ((($pColumnIndex - 26) % 676) / 26)) . + chr(65 + $pColumnIndex % 26); + } + } + return $_indexCache[$pColumnIndex]; + } + + /** + * Extract all cell references in range + * + * @param string $pRange Range (e.g. A1 or A1:C10 or A1:E10 A20:E25) + * @return array Array containing single cell references + */ + public static function extractAllCellReferencesInRange($pRange = 'A1') + { + // Returnvalue + $returnValue = array(); + + // Explode spaces + $cellBlocks = explode(' ', str_replace('$', '', strtoupper($pRange))); + foreach ($cellBlocks as $cellBlock) { + // Single cell? + if (strpos($cellBlock, ':') === false && strpos($cellBlock, ',') === false) { + $returnValue[] = $cellBlock; + continue; + } + + // Range... + $ranges = self::splitRange($cellBlock); + foreach ($ranges as $range) { + // Single cell? + if (!isset($range[1])) { + $returnValue[] = $range[0]; + continue; + } + + // Range... + list($rangeStart, $rangeEnd) = $range; + sscanf($rangeStart, '%[A-Z]%d', $startCol, $startRow); + sscanf($rangeEnd, '%[A-Z]%d', $endCol, $endRow); + ++$endCol; + + // Current data + $currentCol = $startCol; + $currentRow = $startRow; + + // Loop cells + while ($currentCol != $endCol) { + while ($currentRow <= $endRow) { + $returnValue[] = $currentCol.$currentRow; + ++$currentRow; + } + ++$currentCol; + $currentRow = $startRow; + } + } + } + + // Sort the result by column and row + $sortKeys = array(); + foreach (array_unique($returnValue) as $coord) { + sscanf($coord, '%[A-Z]%d', $column, $row); + $sortKeys[sprintf('%3s%09d', $column, $row)] = $coord; + } + ksort($sortKeys); + + // Return value + return array_values($sortKeys); + } + + /** + * Compare 2 cells + * + * @param PHPExcel_Cell $a Cell a + * @param PHPExcel_Cell $b Cell b + * @return int Result of comparison (always -1 or 1, never zero!) + */ + public static function compareCells(PHPExcel_Cell $a, PHPExcel_Cell $b) + { + if ($a->getRow() < $b->getRow()) { + return -1; + } elseif ($a->getRow() > $b->getRow()) { + return 1; + } elseif (self::columnIndexFromString($a->getColumn()) < self::columnIndexFromString($b->getColumn())) { + return -1; + } else { + return 1; + } + } + + /** + * Get value binder to use + * + * @return PHPExcel_Cell_IValueBinder + */ + public static function getValueBinder() + { + if (self::$valueBinder === null) { + self::$valueBinder = new PHPExcel_Cell_DefaultValueBinder(); + } + + return self::$valueBinder; + } + + /** + * Set value binder to use + * + * @param PHPExcel_Cell_IValueBinder $binder + * @throws PHPExcel_Exception + */ + public static function setValueBinder(PHPExcel_Cell_IValueBinder $binder = null) + { + if ($binder === null) { + throw new PHPExcel_Exception("A PHPExcel_Cell_IValueBinder is required for PHPExcel to function correctly."); + } + + self::$valueBinder = $binder; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if ((is_object($value)) && ($key != 'parent')) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } + + /** + * Get index to cellXf + * + * @return int + */ + public function getXfIndex() + { + return $this->xfIndex; + } + + /** + * Set index to cellXf + * + * @param int $pValue + * @return PHPExcel_Cell + */ + public function setXfIndex($pValue = 0) + { + $this->xfIndex = $pValue; + + return $this->notifyCacheController(); + } + + /** + * @deprecated Since version 1.7.8 for planned changes to cell for array formula handling + */ + public function setFormulaAttributes($pAttributes) + { + $this->formulaAttributes = $pAttributes; + return $this; + } + + /** + * @deprecated Since version 1.7.8 for planned changes to cell for array formula handling + */ + public function getFormulaAttributes() + { + return $this->formulaAttributes; + } + + /** + * Convert to string + * + * @return string + */ + public function __toString() + { + return (string) $this->getValue(); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Cell/AdvancedValueBinder.php b/application/third_party/PHPExcel/PHPExcel/Cell/AdvancedValueBinder.php new file mode 100644 index 0000000..061d04e --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Cell/AdvancedValueBinder.php @@ -0,0 +1,187 @@ +setValueExplicit(true, PHPExcel_Cell_DataType::TYPE_BOOL); + return true; + } elseif ($value == PHPExcel_Calculation::getFALSE()) { + $cell->setValueExplicit(false, PHPExcel_Cell_DataType::TYPE_BOOL); + return true; + } + + // Check for number in scientific format + if (preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_NUMBER.'$/', $value)) { + $cell->setValueExplicit((float) $value, PHPExcel_Cell_DataType::TYPE_NUMERIC); + return true; + } + + // Check for fraction + if (preg_match('/^([+-]?)\s*([0-9]+)\s?\/\s*([0-9]+)$/', $value, $matches)) { + // Convert value to number + $value = $matches[2] / $matches[3]; + if ($matches[1] == '-') { + $value = 0 - $value; + } + $cell->setValueExplicit((float) $value, PHPExcel_Cell_DataType::TYPE_NUMERIC); + // Set style + $cell->getWorksheet()->getStyle($cell->getCoordinate()) + ->getNumberFormat()->setFormatCode('??/??'); + return true; + } elseif (preg_match('/^([+-]?)([0-9]*) +([0-9]*)\s?\/\s*([0-9]*)$/', $value, $matches)) { + // Convert value to number + $value = $matches[2] + ($matches[3] / $matches[4]); + if ($matches[1] == '-') { + $value = 0 - $value; + } + $cell->setValueExplicit((float) $value, PHPExcel_Cell_DataType::TYPE_NUMERIC); + // Set style + $cell->getWorksheet()->getStyle($cell->getCoordinate()) + ->getNumberFormat()->setFormatCode('# ??/??'); + return true; + } + + // Check for percentage + if (preg_match('/^\-?[0-9]*\.?[0-9]*\s?\%$/', $value)) { + // Convert value to number + $value = (float) str_replace('%', '', $value) / 100; + $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_NUMERIC); + // Set style + $cell->getWorksheet()->getStyle($cell->getCoordinate()) + ->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE_00); + return true; + } + + // Check for currency + $currencyCode = PHPExcel_Shared_String::getCurrencyCode(); + $decimalSeparator = PHPExcel_Shared_String::getDecimalSeparator(); + $thousandsSeparator = PHPExcel_Shared_String::getThousandsSeparator(); + if (preg_match('/^'.preg_quote($currencyCode).' *(\d{1,3}('.preg_quote($thousandsSeparator).'\d{3})*|(\d+))('.preg_quote($decimalSeparator).'\d{2})?$/', $value)) { + // Convert value to number + $value = (float) trim(str_replace(array($currencyCode, $thousandsSeparator, $decimalSeparator), array('', '', '.'), $value)); + $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_NUMERIC); + // Set style + $cell->getWorksheet()->getStyle($cell->getCoordinate()) + ->getNumberFormat()->setFormatCode( + str_replace('$', $currencyCode, PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE) + ); + return true; + } elseif (preg_match('/^\$ *(\d{1,3}(\,\d{3})*|(\d+))(\.\d{2})?$/', $value)) { + // Convert value to number + $value = (float) trim(str_replace(array('$',','), '', $value)); + $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_NUMERIC); + // Set style + $cell->getWorksheet()->getStyle($cell->getCoordinate()) + ->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE); + return true; + } + + // Check for time without seconds e.g. '9:45', '09:45' + if (preg_match('/^(\d|[0-1]\d|2[0-3]):[0-5]\d$/', $value)) { + // Convert value to number + list($h, $m) = explode(':', $value); + $days = $h / 24 + $m / 1440; + $cell->setValueExplicit($days, PHPExcel_Cell_DataType::TYPE_NUMERIC); + // Set style + $cell->getWorksheet()->getStyle($cell->getCoordinate()) + ->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME3); + return true; + } + + // Check for time with seconds '9:45:59', '09:45:59' + if (preg_match('/^(\d|[0-1]\d|2[0-3]):[0-5]\d:[0-5]\d$/', $value)) { + // Convert value to number + list($h, $m, $s) = explode(':', $value); + $days = $h / 24 + $m / 1440 + $s / 86400; + // Convert value to number + $cell->setValueExplicit($days, PHPExcel_Cell_DataType::TYPE_NUMERIC); + // Set style + $cell->getWorksheet()->getStyle($cell->getCoordinate()) + ->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4); + return true; + } + + // Check for datetime, e.g. '2008-12-31', '2008-12-31 15:59', '2008-12-31 15:59:10' + if (($d = PHPExcel_Shared_Date::stringToExcel($value)) !== false) { + // Convert value to number + $cell->setValueExplicit($d, PHPExcel_Cell_DataType::TYPE_NUMERIC); + // Determine style. Either there is a time part or not. Look for ':' + if (strpos($value, ':') !== false) { + $formatCode = 'yyyy-mm-dd h:mm'; + } else { + $formatCode = 'yyyy-mm-dd'; + } + $cell->getWorksheet()->getStyle($cell->getCoordinate()) + ->getNumberFormat()->setFormatCode($formatCode); + return true; + } + + // Check for newline character "\n" + if (strpos($value, "\n") !== false) { + $value = PHPExcel_Shared_String::SanitizeUTF8($value); + $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING); + // Set style + $cell->getWorksheet()->getStyle($cell->getCoordinate()) + ->getAlignment()->setWrapText(true); + return true; + } + } + + // Not bound yet? Use parent... + return parent::bindValue($cell, $value); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Cell/DataType.php b/application/third_party/PHPExcel/PHPExcel/Cell/DataType.php new file mode 100644 index 0000000..fc010e6 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Cell/DataType.php @@ -0,0 +1,115 @@ + 0, + '#DIV/0!' => 1, + '#VALUE!' => 2, + '#REF!' => 3, + '#NAME?' => 4, + '#NUM!' => 5, + '#N/A' => 6 + ); + + /** + * Get list of error codes + * + * @return array + */ + public static function getErrorCodes() + { + return self::$errorCodes; + } + + /** + * DataType for value + * + * @deprecated Replaced by PHPExcel_Cell_IValueBinder infrastructure, will be removed in version 1.8.0 + * @param mixed $pValue + * @return string + */ + public static function dataTypeForValue($pValue = null) + { + return PHPExcel_Cell_DefaultValueBinder::dataTypeForValue($pValue); + } + + /** + * Check a string that it satisfies Excel requirements + * + * @param mixed Value to sanitize to an Excel string + * @return mixed Sanitized value + */ + public static function checkString($pValue = null) + { + if ($pValue instanceof PHPExcel_RichText) { + // TODO: Sanitize Rich-Text string (max. character count is 32,767) + return $pValue; + } + + // string must never be longer than 32,767 characters, truncate if necessary + $pValue = PHPExcel_Shared_String::Substring($pValue, 0, 32767); + + // we require that newline is represented as "\n" in core, not as "\r\n" or "\r" + $pValue = str_replace(array("\r\n", "\r"), "\n", $pValue); + + return $pValue; + } + + /** + * Check a value that it is a valid error code + * + * @param mixed Value to sanitize to an Excel error code + * @return string Sanitized value + */ + public static function checkErrorCode($pValue = null) + { + $pValue = (string) $pValue; + + if (!array_key_exists($pValue, self::$errorCodes)) { + $pValue = '#NULL!'; + } + + return $pValue; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Cell/DataValidation.php b/application/third_party/PHPExcel/PHPExcel/Cell/DataValidation.php new file mode 100644 index 0000000..9883633 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Cell/DataValidation.php @@ -0,0 +1,492 @@ +formula1 = ''; + $this->formula2 = ''; + $this->type = PHPExcel_Cell_DataValidation::TYPE_NONE; + $this->errorStyle = PHPExcel_Cell_DataValidation::STYLE_STOP; + $this->operator = ''; + $this->allowBlank = false; + $this->showDropDown = false; + $this->showInputMessage = false; + $this->showErrorMessage = false; + $this->errorTitle = ''; + $this->error = ''; + $this->promptTitle = ''; + $this->prompt = ''; + } + + /** + * Get Formula 1 + * + * @return string + */ + public function getFormula1() + { + return $this->formula1; + } + + /** + * Set Formula 1 + * + * @param string $value + * @return PHPExcel_Cell_DataValidation + */ + public function setFormula1($value = '') + { + $this->formula1 = $value; + return $this; + } + + /** + * Get Formula 2 + * + * @return string + */ + public function getFormula2() + { + return $this->formula2; + } + + /** + * Set Formula 2 + * + * @param string $value + * @return PHPExcel_Cell_DataValidation + */ + public function setFormula2($value = '') + { + $this->formula2 = $value; + return $this; + } + + /** + * Get Type + * + * @return string + */ + public function getType() + { + return $this->type; + } + + /** + * Set Type + * + * @param string $value + * @return PHPExcel_Cell_DataValidation + */ + public function setType($value = PHPExcel_Cell_DataValidation::TYPE_NONE) + { + $this->type = $value; + return $this; + } + + /** + * Get Error style + * + * @return string + */ + public function getErrorStyle() + { + return $this->errorStyle; + } + + /** + * Set Error style + * + * @param string $value + * @return PHPExcel_Cell_DataValidation + */ + public function setErrorStyle($value = PHPExcel_Cell_DataValidation::STYLE_STOP) + { + $this->errorStyle = $value; + return $this; + } + + /** + * Get Operator + * + * @return string + */ + public function getOperator() + { + return $this->operator; + } + + /** + * Set Operator + * + * @param string $value + * @return PHPExcel_Cell_DataValidation + */ + public function setOperator($value = '') + { + $this->operator = $value; + return $this; + } + + /** + * Get Allow Blank + * + * @return boolean + */ + public function getAllowBlank() + { + return $this->allowBlank; + } + + /** + * Set Allow Blank + * + * @param boolean $value + * @return PHPExcel_Cell_DataValidation + */ + public function setAllowBlank($value = false) + { + $this->allowBlank = $value; + return $this; + } + + /** + * Get Show DropDown + * + * @return boolean + */ + public function getShowDropDown() + { + return $this->showDropDown; + } + + /** + * Set Show DropDown + * + * @param boolean $value + * @return PHPExcel_Cell_DataValidation + */ + public function setShowDropDown($value = false) + { + $this->showDropDown = $value; + return $this; + } + + /** + * Get Show InputMessage + * + * @return boolean + */ + public function getShowInputMessage() + { + return $this->showInputMessage; + } + + /** + * Set Show InputMessage + * + * @param boolean $value + * @return PHPExcel_Cell_DataValidation + */ + public function setShowInputMessage($value = false) + { + $this->showInputMessage = $value; + return $this; + } + + /** + * Get Show ErrorMessage + * + * @return boolean + */ + public function getShowErrorMessage() + { + return $this->showErrorMessage; + } + + /** + * Set Show ErrorMessage + * + * @param boolean $value + * @return PHPExcel_Cell_DataValidation + */ + public function setShowErrorMessage($value = false) + { + $this->showErrorMessage = $value; + return $this; + } + + /** + * Get Error title + * + * @return string + */ + public function getErrorTitle() + { + return $this->errorTitle; + } + + /** + * Set Error title + * + * @param string $value + * @return PHPExcel_Cell_DataValidation + */ + public function setErrorTitle($value = '') + { + $this->errorTitle = $value; + return $this; + } + + /** + * Get Error + * + * @return string + */ + public function getError() + { + return $this->error; + } + + /** + * Set Error + * + * @param string $value + * @return PHPExcel_Cell_DataValidation + */ + public function setError($value = '') + { + $this->error = $value; + return $this; + } + + /** + * Get Prompt title + * + * @return string + */ + public function getPromptTitle() + { + return $this->promptTitle; + } + + /** + * Set Prompt title + * + * @param string $value + * @return PHPExcel_Cell_DataValidation + */ + public function setPromptTitle($value = '') + { + $this->promptTitle = $value; + return $this; + } + + /** + * Get Prompt + * + * @return string + */ + public function getPrompt() + { + return $this->prompt; + } + + /** + * Set Prompt + * + * @param string $value + * @return PHPExcel_Cell_DataValidation + */ + public function setPrompt($value = '') + { + $this->prompt = $value; + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + return md5( + $this->formula1 . + $this->formula2 . + $this->type = PHPExcel_Cell_DataValidation::TYPE_NONE . + $this->errorStyle = PHPExcel_Cell_DataValidation::STYLE_STOP . + $this->operator . + ($this->allowBlank ? 't' : 'f') . + ($this->showDropDown ? 't' : 'f') . + ($this->showInputMessage ? 't' : 'f') . + ($this->showErrorMessage ? 't' : 'f') . + $this->errorTitle . + $this->error . + $this->promptTitle . + $this->prompt . + __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Cell/DefaultValueBinder.php b/application/third_party/PHPExcel/PHPExcel/Cell/DefaultValueBinder.php new file mode 100644 index 0000000..dc19e6c --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Cell/DefaultValueBinder.php @@ -0,0 +1,102 @@ +format('Y-m-d H:i:s'); + } elseif (!($value instanceof PHPExcel_RichText)) { + $value = (string) $value; + } + } + + // Set value explicit + $cell->setValueExplicit($value, self::dataTypeForValue($value)); + + // Done! + return true; + } + + /** + * DataType for value + * + * @param mixed $pValue + * @return string + */ + public static function dataTypeForValue($pValue = null) + { + // Match the value against a few data types + if ($pValue === null) { + return PHPExcel_Cell_DataType::TYPE_NULL; + } elseif ($pValue === '') { + return PHPExcel_Cell_DataType::TYPE_STRING; + } elseif ($pValue instanceof PHPExcel_RichText) { + return PHPExcel_Cell_DataType::TYPE_INLINE; + } elseif ($pValue{0} === '=' && strlen($pValue) > 1) { + return PHPExcel_Cell_DataType::TYPE_FORMULA; + } elseif (is_bool($pValue)) { + return PHPExcel_Cell_DataType::TYPE_BOOL; + } elseif (is_float($pValue) || is_int($pValue)) { + return PHPExcel_Cell_DataType::TYPE_NUMERIC; + } elseif (preg_match('/^[\+\-]?([0-9]+\\.?[0-9]*|[0-9]*\\.?[0-9]+)([Ee][\-\+]?[0-2]?\d{1,3})?$/', $pValue)) { + $tValue = ltrim($pValue, '+-'); + if (is_string($pValue) && $tValue{0} === '0' && strlen($tValue) > 1 && $tValue{1} !== '.') { + return PHPExcel_Cell_DataType::TYPE_STRING; + } elseif ((strpos($pValue, '.') === false) && ($pValue > PHP_INT_MAX)) { + return PHPExcel_Cell_DataType::TYPE_STRING; + } + return PHPExcel_Cell_DataType::TYPE_NUMERIC; + } elseif (is_string($pValue) && array_key_exists($pValue, PHPExcel_Cell_DataType::getErrorCodes())) { + return PHPExcel_Cell_DataType::TYPE_ERROR; + } + + return PHPExcel_Cell_DataType::TYPE_STRING; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Cell/Hyperlink.php b/application/third_party/PHPExcel/PHPExcel/Cell/Hyperlink.php new file mode 100644 index 0000000..daab54c --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Cell/Hyperlink.php @@ -0,0 +1,124 @@ +url = $pUrl; + $this->tooltip = $pTooltip; + } + + /** + * Get URL + * + * @return string + */ + public function getUrl() + { + return $this->url; + } + + /** + * Set URL + * + * @param string $value + * @return PHPExcel_Cell_Hyperlink + */ + public function setUrl($value = '') + { + $this->url = $value; + return $this; + } + + /** + * Get tooltip + * + * @return string + */ + public function getTooltip() + { + return $this->tooltip; + } + + /** + * Set tooltip + * + * @param string $value + * @return PHPExcel_Cell_Hyperlink + */ + public function setTooltip($value = '') + { + $this->tooltip = $value; + return $this; + } + + /** + * Is this hyperlink internal? (to another worksheet) + * + * @return boolean + */ + public function isInternal() + { + return strpos($this->url, 'sheet://') !== false; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + return md5( + $this->url . + $this->tooltip . + __CLASS__ + ); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Cell/IValueBinder.php b/application/third_party/PHPExcel/PHPExcel/Cell/IValueBinder.php new file mode 100644 index 0000000..de2d0ac --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Cell/IValueBinder.php @@ -0,0 +1,47 @@ +name = $name; + $this->title = $title; + $this->legend = $legend; + $this->xAxisLabel = $xAxisLabel; + $this->yAxisLabel = $yAxisLabel; + $this->plotArea = $plotArea; + $this->plotVisibleOnly = $plotVisibleOnly; + $this->displayBlanksAs = $displayBlanksAs; + $this->xAxis = $xAxis; + $this->yAxis = $yAxis; + $this->majorGridlines = $majorGridlines; + $this->minorGridlines = $minorGridlines; + } + + /** + * Get Name + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Get Worksheet + * + * @return PHPExcel_Worksheet + */ + public function getWorksheet() + { + return $this->worksheet; + } + + /** + * Set Worksheet + * + * @param PHPExcel_Worksheet $pValue + * @throws PHPExcel_Chart_Exception + * @return PHPExcel_Chart + */ + public function setWorksheet(PHPExcel_Worksheet $pValue = null) + { + $this->worksheet = $pValue; + + return $this; + } + + /** + * Get Title + * + * @return PHPExcel_Chart_Title + */ + public function getTitle() + { + return $this->title; + } + + /** + * Set Title + * + * @param PHPExcel_Chart_Title $title + * @return PHPExcel_Chart + */ + public function setTitle(PHPExcel_Chart_Title $title) + { + $this->title = $title; + + return $this; + } + + /** + * Get Legend + * + * @return PHPExcel_Chart_Legend + */ + public function getLegend() + { + return $this->legend; + } + + /** + * Set Legend + * + * @param PHPExcel_Chart_Legend $legend + * @return PHPExcel_Chart + */ + public function setLegend(PHPExcel_Chart_Legend $legend) + { + $this->legend = $legend; + + return $this; + } + + /** + * Get X-Axis Label + * + * @return PHPExcel_Chart_Title + */ + public function getXAxisLabel() + { + return $this->xAxisLabel; + } + + /** + * Set X-Axis Label + * + * @param PHPExcel_Chart_Title $label + * @return PHPExcel_Chart + */ + public function setXAxisLabel(PHPExcel_Chart_Title $label) + { + $this->xAxisLabel = $label; + + return $this; + } + + /** + * Get Y-Axis Label + * + * @return PHPExcel_Chart_Title + */ + public function getYAxisLabel() + { + return $this->yAxisLabel; + } + + /** + * Set Y-Axis Label + * + * @param PHPExcel_Chart_Title $label + * @return PHPExcel_Chart + */ + public function setYAxisLabel(PHPExcel_Chart_Title $label) + { + $this->yAxisLabel = $label; + + return $this; + } + + /** + * Get Plot Area + * + * @return PHPExcel_Chart_PlotArea + */ + public function getPlotArea() + { + return $this->plotArea; + } + + /** + * Get Plot Visible Only + * + * @return boolean + */ + public function getPlotVisibleOnly() + { + return $this->plotVisibleOnly; + } + + /** + * Set Plot Visible Only + * + * @param boolean $plotVisibleOnly + * @return PHPExcel_Chart + */ + public function setPlotVisibleOnly($plotVisibleOnly = true) + { + $this->plotVisibleOnly = $plotVisibleOnly; + + return $this; + } + + /** + * Get Display Blanks as + * + * @return string + */ + public function getDisplayBlanksAs() + { + return $this->displayBlanksAs; + } + + /** + * Set Display Blanks as + * + * @param string $displayBlanksAs + * @return PHPExcel_Chart + */ + public function setDisplayBlanksAs($displayBlanksAs = '0') + { + $this->displayBlanksAs = $displayBlanksAs; + } + + + /** + * Get yAxis + * + * @return PHPExcel_Chart_Axis + */ + public function getChartAxisY() + { + if ($this->yAxis !== null) { + return $this->yAxis; + } + + return new PHPExcel_Chart_Axis(); + } + + /** + * Get xAxis + * + * @return PHPExcel_Chart_Axis + */ + public function getChartAxisX() + { + if ($this->xAxis !== null) { + return $this->xAxis; + } + + return new PHPExcel_Chart_Axis(); + } + + /** + * Get Major Gridlines + * + * @return PHPExcel_Chart_GridLines + */ + public function getMajorGridlines() + { + if ($this->majorGridlines !== null) { + return $this->majorGridlines; + } + + return new PHPExcel_Chart_GridLines(); + } + + /** + * Get Minor Gridlines + * + * @return PHPExcel_Chart_GridLines + */ + public function getMinorGridlines() + { + if ($this->minorGridlines !== null) { + return $this->minorGridlines; + } + + return new PHPExcel_Chart_GridLines(); + } + + + /** + * Set the Top Left position for the chart + * + * @param string $cell + * @param integer $xOffset + * @param integer $yOffset + * @return PHPExcel_Chart + */ + public function setTopLeftPosition($cell, $xOffset = null, $yOffset = null) + { + $this->topLeftCellRef = $cell; + if (!is_null($xOffset)) { + $this->setTopLeftXOffset($xOffset); + } + if (!is_null($yOffset)) { + $this->setTopLeftYOffset($yOffset); + } + + return $this; + } + + /** + * Get the top left position of the chart + * + * @return array an associative array containing the cell address, X-Offset and Y-Offset from the top left of that cell + */ + public function getTopLeftPosition() + { + return array( + 'cell' => $this->topLeftCellRef, + 'xOffset' => $this->topLeftXOffset, + 'yOffset' => $this->topLeftYOffset + ); + } + + /** + * Get the cell address where the top left of the chart is fixed + * + * @return string + */ + public function getTopLeftCell() + { + return $this->topLeftCellRef; + } + + /** + * Set the Top Left cell position for the chart + * + * @param string $cell + * @return PHPExcel_Chart + */ + public function setTopLeftCell($cell) + { + $this->topLeftCellRef = $cell; + + return $this; + } + + /** + * Set the offset position within the Top Left cell for the chart + * + * @param integer $xOffset + * @param integer $yOffset + * @return PHPExcel_Chart + */ + public function setTopLeftOffset($xOffset = null, $yOffset = null) + { + if (!is_null($xOffset)) { + $this->setTopLeftXOffset($xOffset); + } + if (!is_null($yOffset)) { + $this->setTopLeftYOffset($yOffset); + } + + return $this; + } + + /** + * Get the offset position within the Top Left cell for the chart + * + * @return integer[] + */ + public function getTopLeftOffset() + { + return array( + 'X' => $this->topLeftXOffset, + 'Y' => $this->topLeftYOffset + ); + } + + public function setTopLeftXOffset($xOffset) + { + $this->topLeftXOffset = $xOffset; + + return $this; + } + + public function getTopLeftXOffset() + { + return $this->topLeftXOffset; + } + + public function setTopLeftYOffset($yOffset) + { + $this->topLeftYOffset = $yOffset; + + return $this; + } + + public function getTopLeftYOffset() + { + return $this->topLeftYOffset; + } + + /** + * Set the Bottom Right position of the chart + * + * @param string $cell + * @param integer $xOffset + * @param integer $yOffset + * @return PHPExcel_Chart + */ + public function setBottomRightPosition($cell, $xOffset = null, $yOffset = null) + { + $this->bottomRightCellRef = $cell; + if (!is_null($xOffset)) { + $this->setBottomRightXOffset($xOffset); + } + if (!is_null($yOffset)) { + $this->setBottomRightYOffset($yOffset); + } + + return $this; + } + + /** + * Get the bottom right position of the chart + * + * @return array an associative array containing the cell address, X-Offset and Y-Offset from the top left of that cell + */ + public function getBottomRightPosition() + { + return array( + 'cell' => $this->bottomRightCellRef, + 'xOffset' => $this->bottomRightXOffset, + 'yOffset' => $this->bottomRightYOffset + ); + } + + public function setBottomRightCell($cell) + { + $this->bottomRightCellRef = $cell; + + return $this; + } + + /** + * Get the cell address where the bottom right of the chart is fixed + * + * @return string + */ + public function getBottomRightCell() + { + return $this->bottomRightCellRef; + } + + /** + * Set the offset position within the Bottom Right cell for the chart + * + * @param integer $xOffset + * @param integer $yOffset + * @return PHPExcel_Chart + */ + public function setBottomRightOffset($xOffset = null, $yOffset = null) + { + if (!is_null($xOffset)) { + $this->setBottomRightXOffset($xOffset); + } + if (!is_null($yOffset)) { + $this->setBottomRightYOffset($yOffset); + } + + return $this; + } + + /** + * Get the offset position within the Bottom Right cell for the chart + * + * @return integer[] + */ + public function getBottomRightOffset() + { + return array( + 'X' => $this->bottomRightXOffset, + 'Y' => $this->bottomRightYOffset + ); + } + + public function setBottomRightXOffset($xOffset) + { + $this->bottomRightXOffset = $xOffset; + + return $this; + } + + public function getBottomRightXOffset() + { + return $this->bottomRightXOffset; + } + + public function setBottomRightYOffset($yOffset) + { + $this->bottomRightYOffset = $yOffset; + + return $this; + } + + public function getBottomRightYOffset() + { + return $this->bottomRightYOffset; + } + + + public function refresh() + { + if ($this->worksheet !== null) { + $this->plotArea->refresh($this->worksheet); + } + } + + public function render($outputDestination = null) + { + $libraryName = PHPExcel_Settings::getChartRendererName(); + if (is_null($libraryName)) { + return false; + } + // Ensure that data series values are up-to-date before we render + $this->refresh(); + + $libraryPath = PHPExcel_Settings::getChartRendererPath(); + $includePath = str_replace('\\', '/', get_include_path()); + $rendererPath = str_replace('\\', '/', $libraryPath); + if (strpos($rendererPath, $includePath) === false) { + set_include_path(get_include_path() . PATH_SEPARATOR . $libraryPath); + } + + $rendererName = 'PHPExcel_Chart_Renderer_'.$libraryName; + $renderer = new $rendererName($this); + + if ($outputDestination == 'php://output') { + $outputDestination = null; + } + return $renderer->render($outputDestination); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Chart/Axis.php b/application/third_party/PHPExcel/PHPExcel/Chart/Axis.php new file mode 100644 index 0000000..9aeafc6 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Chart/Axis.php @@ -0,0 +1,561 @@ + self::FORMAT_CODE_GENERAL, + 'source_linked' => 1 + ); + + /** + * Axis Options + * + * @var array of mixed + */ + private $axisOptions = array( + 'minimum' => null, + 'maximum' => null, + 'major_unit' => null, + 'minor_unit' => null, + 'orientation' => self::ORIENTATION_NORMAL, + 'minor_tick_mark' => self::TICK_MARK_NONE, + 'major_tick_mark' => self::TICK_MARK_NONE, + 'axis_labels' => self::AXIS_LABELS_NEXT_TO, + 'horizontal_crosses' => self::HORIZONTAL_CROSSES_AUTOZERO, + 'horizontal_crosses_value' => null + ); + + /** + * Fill Properties + * + * @var array of mixed + */ + private $fillProperties = array( + 'type' => self::EXCEL_COLOR_TYPE_ARGB, + 'value' => null, + 'alpha' => 0 + ); + + /** + * Line Properties + * + * @var array of mixed + */ + private $lineProperties = array( + 'type' => self::EXCEL_COLOR_TYPE_ARGB, + 'value' => null, + 'alpha' => 0 + ); + + /** + * Line Style Properties + * + * @var array of mixed + */ + private $lineStyleProperties = array( + 'width' => '9525', + 'compound' => self::LINE_STYLE_COMPOUND_SIMPLE, + 'dash' => self::LINE_STYLE_DASH_SOLID, + 'cap' => self::LINE_STYLE_CAP_FLAT, + 'join' => self::LINE_STYLE_JOIN_BEVEL, + 'arrow' => array( + 'head' => array( + 'type' => self::LINE_STYLE_ARROW_TYPE_NOARROW, + 'size' => self::LINE_STYLE_ARROW_SIZE_5 + ), + 'end' => array( + 'type' => self::LINE_STYLE_ARROW_TYPE_NOARROW, + 'size' => self::LINE_STYLE_ARROW_SIZE_8 + ), + ) + ); + + /** + * Shadow Properties + * + * @var array of mixed + */ + private $shadowProperties = array( + 'presets' => self::SHADOW_PRESETS_NOSHADOW, + 'effect' => null, + 'color' => array( + 'type' => self::EXCEL_COLOR_TYPE_STANDARD, + 'value' => 'black', + 'alpha' => 40, + ), + 'size' => array( + 'sx' => null, + 'sy' => null, + 'kx' => null + ), + 'blur' => null, + 'direction' => null, + 'distance' => null, + 'algn' => null, + 'rotWithShape' => null + ); + + /** + * Glow Properties + * + * @var array of mixed + */ + private $glowProperties = array( + 'size' => null, + 'color' => array( + 'type' => self::EXCEL_COLOR_TYPE_STANDARD, + 'value' => 'black', + 'alpha' => 40 + ) + ); + + /** + * Soft Edge Properties + * + * @var array of mixed + */ + private $softEdges = array( + 'size' => null + ); + + /** + * Get Series Data Type + * + * @return string + */ + public function setAxisNumberProperties($format_code) + { + $this->axisNumber['format'] = (string) $format_code; + $this->axisNumber['source_linked'] = 0; + } + + /** + * Get Axis Number Format Data Type + * + * @return string + */ + public function getAxisNumberFormat() + { + return $this->axisNumber['format']; + } + + /** + * Get Axis Number Source Linked + * + * @return string + */ + public function getAxisNumberSourceLinked() + { + return (string) $this->axisNumber['source_linked']; + } + + /** + * Set Axis Options Properties + * + * @param string $axis_labels + * @param string $horizontal_crosses_value + * @param string $horizontal_crosses + * @param string $axis_orientation + * @param string $major_tmt + * @param string $minor_tmt + * @param string $minimum + * @param string $maximum + * @param string $major_unit + * @param string $minor_unit + * + */ + public function setAxisOptionsProperties($axis_labels, $horizontal_crosses_value = null, $horizontal_crosses = null, $axis_orientation = null, $major_tmt = null, $minor_tmt = null, $minimum = null, $maximum = null, $major_unit = null, $minor_unit = null) + { + $this->axisOptions['axis_labels'] = (string) $axis_labels; + ($horizontal_crosses_value !== null) ? $this->axisOptions['horizontal_crosses_value'] = (string) $horizontal_crosses_value : null; + ($horizontal_crosses !== null) ? $this->axisOptions['horizontal_crosses'] = (string) $horizontal_crosses : null; + ($axis_orientation !== null) ? $this->axisOptions['orientation'] = (string) $axis_orientation : null; + ($major_tmt !== null) ? $this->axisOptions['major_tick_mark'] = (string) $major_tmt : null; + ($minor_tmt !== null) ? $this->axisOptions['minor_tick_mark'] = (string) $minor_tmt : null; + ($minor_tmt !== null) ? $this->axisOptions['minor_tick_mark'] = (string) $minor_tmt : null; + ($minimum !== null) ? $this->axisOptions['minimum'] = (string) $minimum : null; + ($maximum !== null) ? $this->axisOptions['maximum'] = (string) $maximum : null; + ($major_unit !== null) ? $this->axisOptions['major_unit'] = (string) $major_unit : null; + ($minor_unit !== null) ? $this->axisOptions['minor_unit'] = (string) $minor_unit : null; + } + + /** + * Get Axis Options Property + * + * @param string $property + * + * @return string + */ + public function getAxisOptionsProperty($property) + { + return $this->axisOptions[$property]; + } + + /** + * Set Axis Orientation Property + * + * @param string $orientation + * + */ + public function setAxisOrientation($orientation) + { + $this->orientation = (string) $orientation; + } + + /** + * Set Fill Property + * + * @param string $color + * @param int $alpha + * @param string $type + * + */ + public function setFillParameters($color, $alpha = 0, $type = self::EXCEL_COLOR_TYPE_ARGB) + { + $this->fillProperties = $this->setColorProperties($color, $alpha, $type); + } + + /** + * Set Line Property + * + * @param string $color + * @param int $alpha + * @param string $type + * + */ + public function setLineParameters($color, $alpha = 0, $type = self::EXCEL_COLOR_TYPE_ARGB) + { + $this->lineProperties = $this->setColorProperties($color, $alpha, $type); + } + + /** + * Get Fill Property + * + * @param string $property + * + * @return string + */ + public function getFillProperty($property) + { + return $this->fillProperties[$property]; + } + + /** + * Get Line Property + * + * @param string $property + * + * @return string + */ + public function getLineProperty($property) + { + return $this->lineProperties[$property]; + } + + /** + * Set Line Style Properties + * + * @param float $line_width + * @param string $compound_type + * @param string $dash_type + * @param string $cap_type + * @param string $join_type + * @param string $head_arrow_type + * @param string $head_arrow_size + * @param string $end_arrow_type + * @param string $end_arrow_size + * + */ + public function setLineStyleProperties($line_width = null, $compound_type = null, $dash_type = null, $cap_type = null, $join_type = null, $head_arrow_type = null, $head_arrow_size = null, $end_arrow_type = null, $end_arrow_size = null) + { + (!is_null($line_width)) ? $this->lineStyleProperties['width'] = $this->getExcelPointsWidth((float) $line_width) : null; + (!is_null($compound_type)) ? $this->lineStyleProperties['compound'] = (string) $compound_type : null; + (!is_null($dash_type)) ? $this->lineStyleProperties['dash'] = (string) $dash_type : null; + (!is_null($cap_type)) ? $this->lineStyleProperties['cap'] = (string) $cap_type : null; + (!is_null($join_type)) ? $this->lineStyleProperties['join'] = (string) $join_type : null; + (!is_null($head_arrow_type)) ? $this->lineStyleProperties['arrow']['head']['type'] = (string) $head_arrow_type : null; + (!is_null($head_arrow_size)) ? $this->lineStyleProperties['arrow']['head']['size'] = (string) $head_arrow_size : null; + (!is_null($end_arrow_type)) ? $this->lineStyleProperties['arrow']['end']['type'] = (string) $end_arrow_type : null; + (!is_null($end_arrow_size)) ? $this->lineStyleProperties['arrow']['end']['size'] = (string) $end_arrow_size : null; + } + + /** + * Get Line Style Property + * + * @param array|string $elements + * + * @return string + */ + public function getLineStyleProperty($elements) + { + return $this->getArrayElementsValue($this->lineStyleProperties, $elements); + } + + /** + * Get Line Style Arrow Excel Width + * + * @param string $arrow + * + * @return string + */ + public function getLineStyleArrowWidth($arrow) + { + return $this->getLineStyleArrowSize($this->lineStyleProperties['arrow'][$arrow]['size'], 'w'); + } + + /** + * Get Line Style Arrow Excel Length + * + * @param string $arrow + * + * @return string + */ + public function getLineStyleArrowLength($arrow) + { + return $this->getLineStyleArrowSize($this->lineStyleProperties['arrow'][$arrow]['size'], 'len'); + } + + /** + * Set Shadow Properties + * + * @param int $shadow_presets + * @param string $sh_color_value + * @param string $sh_color_type + * @param string $sh_color_alpha + * @param float $sh_blur + * @param int $sh_angle + * @param float $sh_distance + * + */ + public function setShadowProperties($sh_presets, $sh_color_value = null, $sh_color_type = null, $sh_color_alpha = null, $sh_blur = null, $sh_angle = null, $sh_distance = null) + { + $this->setShadowPresetsProperties((int) $sh_presets) + ->setShadowColor( + is_null($sh_color_value) ? $this->shadowProperties['color']['value'] : $sh_color_value, + is_null($sh_color_alpha) ? (int) $this->shadowProperties['color']['alpha'] : $sh_color_alpha, + is_null($sh_color_type) ? $this->shadowProperties['color']['type'] : $sh_color_type + ) + ->setShadowBlur($sh_blur) + ->setShadowAngle($sh_angle) + ->setShadowDistance($sh_distance); + } + + /** + * Set Shadow Color + * + * @param int $shadow_presets + * + * @return PHPExcel_Chart_Axis + */ + private function setShadowPresetsProperties($shadow_presets) + { + $this->shadowProperties['presets'] = $shadow_presets; + $this->setShadowProperiesMapValues($this->getShadowPresetsMap($shadow_presets)); + + return $this; + } + + /** + * Set Shadow Properties from Maped Values + * + * @param array $properties_map + * @param * $reference + * + * @return PHPExcel_Chart_Axis + */ + private function setShadowProperiesMapValues(array $properties_map, &$reference = null) + { + $base_reference = $reference; + foreach ($properties_map as $property_key => $property_val) { + if (is_array($property_val)) { + if ($reference === null) { + $reference = & $this->shadowProperties[$property_key]; + } else { + $reference = & $reference[$property_key]; + } + $this->setShadowProperiesMapValues($property_val, $reference); + } else { + if ($base_reference === null) { + $this->shadowProperties[$property_key] = $property_val; + } else { + $reference[$property_key] = $property_val; + } + } + } + + return $this; + } + + /** + * Set Shadow Color + * + * @param string $color + * @param int $alpha + * @param string $type + * + * @return PHPExcel_Chart_Axis + */ + private function setShadowColor($color, $alpha, $type) + { + $this->shadowProperties['color'] = $this->setColorProperties($color, $alpha, $type); + + return $this; + } + + /** + * Set Shadow Blur + * + * @param float $blur + * + * @return PHPExcel_Chart_Axis + */ + private function setShadowBlur($blur) + { + if ($blur !== null) { + $this->shadowProperties['blur'] = (string) $this->getExcelPointsWidth($blur); + } + + return $this; + } + + /** + * Set Shadow Angle + * + * @param int $angle + * + * @return PHPExcel_Chart_Axis + */ + private function setShadowAngle($angle) + { + if ($angle !== null) { + $this->shadowProperties['direction'] = (string) $this->getExcelPointsAngle($angle); + } + + return $this; + } + + /** + * Set Shadow Distance + * + * @param float $distance + * + * @return PHPExcel_Chart_Axis + */ + private function setShadowDistance($distance) + { + if ($distance !== null) { + $this->shadowProperties['distance'] = (string) $this->getExcelPointsWidth($distance); + } + + return $this; + } + + /** + * Get Glow Property + * + * @param float $size + * @param string $color_value + * @param int $color_alpha + * @param string $color_type + */ + public function getShadowProperty($elements) + { + return $this->getArrayElementsValue($this->shadowProperties, $elements); + } + + /** + * Set Glow Properties + * + * @param float $size + * @param string $color_value + * @param int $color_alpha + * @param string $color_type + */ + public function setGlowProperties($size, $color_value = null, $color_alpha = null, $color_type = null) + { + $this->setGlowSize($size) + ->setGlowColor( + is_null($color_value) ? $this->glowProperties['color']['value'] : $color_value, + is_null($color_alpha) ? (int) $this->glowProperties['color']['alpha'] : $color_alpha, + is_null($color_type) ? $this->glowProperties['color']['type'] : $color_type + ); + } + + /** + * Get Glow Property + * + * @param array|string $property + * + * @return string + */ + public function getGlowProperty($property) + { + return $this->getArrayElementsValue($this->glowProperties, $property); + } + + /** + * Set Glow Color + * + * @param float $size + * + * @return PHPExcel_Chart_Axis + */ + private function setGlowSize($size) + { + if (!is_null($size)) { + $this->glowProperties['size'] = $this->getExcelPointsWidth($size); + } + + return $this; + } + + /** + * Set Glow Color + * + * @param string $color + * @param int $alpha + * @param string $type + * + * @return PHPExcel_Chart_Axis + */ + private function setGlowColor($color, $alpha, $type) + { + $this->glowProperties['color'] = $this->setColorProperties($color, $alpha, $type); + + return $this; + } + + /** + * Set Soft Edges Size + * + * @param float $size + */ + public function setSoftEdges($size) + { + if (!is_null($size)) { + $softEdges['size'] = (string) $this->getExcelPointsWidth($size); + } + } + + /** + * Get Soft Edges Size + * + * @return string + */ + public function getSoftEdgesSize() + { + return $this->softEdges['size']; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Chart/DataSeries.php b/application/third_party/PHPExcel/PHPExcel/Chart/DataSeries.php new file mode 100644 index 0000000..9ecd543 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Chart/DataSeries.php @@ -0,0 +1,390 @@ +plotType = $plotType; + $this->plotGrouping = $plotGrouping; + $this->plotOrder = $plotOrder; + $keys = array_keys($plotValues); + $this->plotValues = $plotValues; + if ((count($plotLabel) == 0) || (is_null($plotLabel[$keys[0]]))) { + $plotLabel[$keys[0]] = new PHPExcel_Chart_DataSeriesValues(); + } + + $this->plotLabel = $plotLabel; + if ((count($plotCategory) == 0) || (is_null($plotCategory[$keys[0]]))) { + $plotCategory[$keys[0]] = new PHPExcel_Chart_DataSeriesValues(); + } + $this->plotCategory = $plotCategory; + $this->smoothLine = $smoothLine; + $this->plotStyle = $plotStyle; + + if (is_null($plotDirection)) { + $plotDirection = self::DIRECTION_COL; + } + $this->plotDirection = $plotDirection; + } + + /** + * Get Plot Type + * + * @return string + */ + public function getPlotType() + { + return $this->plotType; + } + + /** + * Set Plot Type + * + * @param string $plotType + * @return PHPExcel_Chart_DataSeries + */ + public function setPlotType($plotType = '') + { + $this->plotType = $plotType; + return $this; + } + + /** + * Get Plot Grouping Type + * + * @return string + */ + public function getPlotGrouping() + { + return $this->plotGrouping; + } + + /** + * Set Plot Grouping Type + * + * @param string $groupingType + * @return PHPExcel_Chart_DataSeries + */ + public function setPlotGrouping($groupingType = null) + { + $this->plotGrouping = $groupingType; + return $this; + } + + /** + * Get Plot Direction + * + * @return string + */ + public function getPlotDirection() + { + return $this->plotDirection; + } + + /** + * Set Plot Direction + * + * @param string $plotDirection + * @return PHPExcel_Chart_DataSeries + */ + public function setPlotDirection($plotDirection = null) + { + $this->plotDirection = $plotDirection; + return $this; + } + + /** + * Get Plot Order + * + * @return string + */ + public function getPlotOrder() + { + return $this->plotOrder; + } + + /** + * Get Plot Labels + * + * @return array of PHPExcel_Chart_DataSeriesValues + */ + public function getPlotLabels() + { + return $this->plotLabel; + } + + /** + * Get Plot Label by Index + * + * @return PHPExcel_Chart_DataSeriesValues + */ + public function getPlotLabelByIndex($index) + { + $keys = array_keys($this->plotLabel); + if (in_array($index, $keys)) { + return $this->plotLabel[$index]; + } elseif (isset($keys[$index])) { + return $this->plotLabel[$keys[$index]]; + } + return false; + } + + /** + * Get Plot Categories + * + * @return array of PHPExcel_Chart_DataSeriesValues + */ + public function getPlotCategories() + { + return $this->plotCategory; + } + + /** + * Get Plot Category by Index + * + * @return PHPExcel_Chart_DataSeriesValues + */ + public function getPlotCategoryByIndex($index) + { + $keys = array_keys($this->plotCategory); + if (in_array($index, $keys)) { + return $this->plotCategory[$index]; + } elseif (isset($keys[$index])) { + return $this->plotCategory[$keys[$index]]; + } + return false; + } + + /** + * Get Plot Style + * + * @return string + */ + public function getPlotStyle() + { + return $this->plotStyle; + } + + /** + * Set Plot Style + * + * @param string $plotStyle + * @return PHPExcel_Chart_DataSeries + */ + public function setPlotStyle($plotStyle = null) + { + $this->plotStyle = $plotStyle; + return $this; + } + + /** + * Get Plot Values + * + * @return array of PHPExcel_Chart_DataSeriesValues + */ + public function getPlotValues() + { + return $this->plotValues; + } + + /** + * Get Plot Values by Index + * + * @return PHPExcel_Chart_DataSeriesValues + */ + public function getPlotValuesByIndex($index) + { + $keys = array_keys($this->plotValues); + if (in_array($index, $keys)) { + return $this->plotValues[$index]; + } elseif (isset($keys[$index])) { + return $this->plotValues[$keys[$index]]; + } + return false; + } + + /** + * Get Number of Plot Series + * + * @return integer + */ + public function getPlotSeriesCount() + { + return count($this->plotValues); + } + + /** + * Get Smooth Line + * + * @return boolean + */ + public function getSmoothLine() + { + return $this->smoothLine; + } + + /** + * Set Smooth Line + * + * @param boolean $smoothLine + * @return PHPExcel_Chart_DataSeries + */ + public function setSmoothLine($smoothLine = true) + { + $this->smoothLine = $smoothLine; + return $this; + } + + public function refresh(PHPExcel_Worksheet $worksheet) + { + foreach ($this->plotValues as $plotValues) { + if ($plotValues !== null) { + $plotValues->refresh($worksheet, true); + } + } + foreach ($this->plotLabel as $plotValues) { + if ($plotValues !== null) { + $plotValues->refresh($worksheet, true); + } + } + foreach ($this->plotCategory as $plotValues) { + if ($plotValues !== null) { + $plotValues->refresh($worksheet, false); + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Chart/DataSeriesValues.php b/application/third_party/PHPExcel/PHPExcel/Chart/DataSeriesValues.php new file mode 100644 index 0000000..ea57e52 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Chart/DataSeriesValues.php @@ -0,0 +1,333 @@ +setDataType($dataType); + $this->dataSource = $dataSource; + $this->formatCode = $formatCode; + $this->pointCount = $pointCount; + $this->dataValues = $dataValues; + $this->pointMarker = $marker; + } + + /** + * Get Series Data Type + * + * @return string + */ + public function getDataType() + { + return $this->dataType; + } + + /** + * Set Series Data Type + * + * @param string $dataType Datatype of this data series + * Typical values are: + * PHPExcel_Chart_DataSeriesValues::DATASERIES_TYPE_STRING + * Normally used for axis point values + * PHPExcel_Chart_DataSeriesValues::DATASERIES_TYPE_NUMBER + * Normally used for chart data values + * @return PHPExcel_Chart_DataSeriesValues + */ + public function setDataType($dataType = self::DATASERIES_TYPE_NUMBER) + { + if (!in_array($dataType, self::$dataTypeValues)) { + throw new PHPExcel_Chart_Exception('Invalid datatype for chart data series values'); + } + $this->dataType = $dataType; + + return $this; + } + + /** + * Get Series Data Source (formula) + * + * @return string + */ + public function getDataSource() + { + return $this->dataSource; + } + + /** + * Set Series Data Source (formula) + * + * @param string $dataSource + * @return PHPExcel_Chart_DataSeriesValues + */ + public function setDataSource($dataSource = null, $refreshDataValues = true) + { + $this->dataSource = $dataSource; + + if ($refreshDataValues) { + // TO DO + } + + return $this; + } + + /** + * Get Point Marker + * + * @return string + */ + public function getPointMarker() + { + return $this->pointMarker; + } + + /** + * Set Point Marker + * + * @param string $marker + * @return PHPExcel_Chart_DataSeriesValues + */ + public function setPointMarker($marker = null) + { + $this->pointMarker = $marker; + + return $this; + } + + /** + * Get Series Format Code + * + * @return string + */ + public function getFormatCode() + { + return $this->formatCode; + } + + /** + * Set Series Format Code + * + * @param string $formatCode + * @return PHPExcel_Chart_DataSeriesValues + */ + public function setFormatCode($formatCode = null) + { + $this->formatCode = $formatCode; + + return $this; + } + + /** + * Get Series Point Count + * + * @return integer + */ + public function getPointCount() + { + return $this->pointCount; + } + + /** + * Identify if the Data Series is a multi-level or a simple series + * + * @return boolean + */ + public function isMultiLevelSeries() + { + if (count($this->dataValues) > 0) { + return is_array($this->dataValues[0]); + } + return null; + } + + /** + * Return the level count of a multi-level Data Series + * + * @return boolean + */ + public function multiLevelCount() + { + $levelCount = 0; + foreach ($this->dataValues as $dataValueSet) { + $levelCount = max($levelCount, count($dataValueSet)); + } + return $levelCount; + } + + /** + * Get Series Data Values + * + * @return array of mixed + */ + public function getDataValues() + { + return $this->dataValues; + } + + /** + * Get the first Series Data value + * + * @return mixed + */ + public function getDataValue() + { + $count = count($this->dataValues); + if ($count == 0) { + return null; + } elseif ($count == 1) { + return $this->dataValues[0]; + } + return $this->dataValues; + } + + /** + * Set Series Data Values + * + * @param array $dataValues + * @param boolean $refreshDataSource + * TRUE - refresh the value of dataSource based on the values of $dataValues + * FALSE - don't change the value of dataSource + * @return PHPExcel_Chart_DataSeriesValues + */ + public function setDataValues($dataValues = array(), $refreshDataSource = true) + { + $this->dataValues = PHPExcel_Calculation_Functions::flattenArray($dataValues); + $this->pointCount = count($dataValues); + + if ($refreshDataSource) { + // TO DO + } + + return $this; + } + + private function stripNulls($var) + { + return $var !== null; + } + + public function refresh(PHPExcel_Worksheet $worksheet, $flatten = true) + { + if ($this->dataSource !== null) { + $calcEngine = PHPExcel_Calculation::getInstance($worksheet->getParent()); + $newDataValues = PHPExcel_Calculation::unwrapResult( + $calcEngine->_calculateFormulaValue( + '='.$this->dataSource, + null, + $worksheet->getCell('A1') + ) + ); + if ($flatten) { + $this->dataValues = PHPExcel_Calculation_Functions::flattenArray($newDataValues); + foreach ($this->dataValues as &$dataValue) { + if ((!empty($dataValue)) && ($dataValue[0] == '#')) { + $dataValue = 0.0; + } + } + unset($dataValue); + } else { + $cellRange = explode('!', $this->dataSource); + if (count($cellRange) > 1) { + list(, $cellRange) = $cellRange; + } + + $dimensions = PHPExcel_Cell::rangeDimension(str_replace('$', '', $cellRange)); + if (($dimensions[0] == 1) || ($dimensions[1] == 1)) { + $this->dataValues = PHPExcel_Calculation_Functions::flattenArray($newDataValues); + } else { + $newArray = array_values(array_shift($newDataValues)); + foreach ($newArray as $i => $newDataSet) { + $newArray[$i] = array($newDataSet); + } + + foreach ($newDataValues as $newDataSet) { + $i = 0; + foreach ($newDataSet as $newDataVal) { + array_unshift($newArray[$i++], $newDataVal); + } + } + $this->dataValues = $newArray; + } + } + $this->pointCount = count($this->dataValues); + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Chart/Exception.php b/application/third_party/PHPExcel/PHPExcel/Chart/Exception.php new file mode 100644 index 0000000..e20dfa5 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Chart/Exception.php @@ -0,0 +1,46 @@ +line = $line; + $e->file = $file; + throw $e; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Chart/GridLines.php b/application/third_party/PHPExcel/PHPExcel/Chart/GridLines.php new file mode 100644 index 0000000..898012e --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Chart/GridLines.php @@ -0,0 +1,472 @@ + array( + 'type' => self::EXCEL_COLOR_TYPE_STANDARD, + 'value' => null, + 'alpha' => 0 + ), + 'style' => array( + 'width' => '9525', + 'compound' => self::LINE_STYLE_COMPOUND_SIMPLE, + 'dash' => self::LINE_STYLE_DASH_SOLID, + 'cap' => self::LINE_STYLE_CAP_FLAT, + 'join' => self::LINE_STYLE_JOIN_BEVEL, + 'arrow' => array( + 'head' => array( + 'type' => self::LINE_STYLE_ARROW_TYPE_NOARROW, + 'size' => self::LINE_STYLE_ARROW_SIZE_5 + ), + 'end' => array( + 'type' => self::LINE_STYLE_ARROW_TYPE_NOARROW, + 'size' => self::LINE_STYLE_ARROW_SIZE_8 + ), + ) + ) + ); + + private $shadowProperties = array( + 'presets' => self::SHADOW_PRESETS_NOSHADOW, + 'effect' => null, + 'color' => array( + 'type' => self::EXCEL_COLOR_TYPE_STANDARD, + 'value' => 'black', + 'alpha' => 85, + ), + 'size' => array( + 'sx' => null, + 'sy' => null, + 'kx' => null + ), + 'blur' => null, + 'direction' => null, + 'distance' => null, + 'algn' => null, + 'rotWithShape' => null + ); + + private $glowProperties = array( + 'size' => null, + 'color' => array( + 'type' => self::EXCEL_COLOR_TYPE_STANDARD, + 'value' => 'black', + 'alpha' => 40 + ) + ); + + private $softEdges = array( + 'size' => null + ); + + /** + * Get Object State + * + * @return bool + */ + + public function getObjectState() + { + return $this->objectState; + } + + /** + * Change Object State to True + * + * @return PHPExcel_Chart_GridLines + */ + + private function activateObject() + { + $this->objectState = true; + + return $this; + } + + /** + * Set Line Color Properties + * + * @param string $value + * @param int $alpha + * @param string $type + */ + + public function setLineColorProperties($value, $alpha = 0, $type = self::EXCEL_COLOR_TYPE_STANDARD) + { + $this->activateObject() + ->lineProperties['color'] = $this->setColorProperties( + $value, + $alpha, + $type + ); + } + + /** + * Set Line Color Properties + * + * @param float $line_width + * @param string $compound_type + * @param string $dash_type + * @param string $cap_type + * @param string $join_type + * @param string $head_arrow_type + * @param string $head_arrow_size + * @param string $end_arrow_type + * @param string $end_arrow_size + */ + + public function setLineStyleProperties($line_width = null, $compound_type = null, $dash_type = null, $cap_type = null, $join_type = null, $head_arrow_type = null, $head_arrow_size = null, $end_arrow_type = null, $end_arrow_size = null) + { + $this->activateObject(); + (!is_null($line_width)) + ? $this->lineProperties['style']['width'] = $this->getExcelPointsWidth((float) $line_width) + : null; + (!is_null($compound_type)) + ? $this->lineProperties['style']['compound'] = (string) $compound_type + : null; + (!is_null($dash_type)) + ? $this->lineProperties['style']['dash'] = (string) $dash_type + : null; + (!is_null($cap_type)) + ? $this->lineProperties['style']['cap'] = (string) $cap_type + : null; + (!is_null($join_type)) + ? $this->lineProperties['style']['join'] = (string) $join_type + : null; + (!is_null($head_arrow_type)) + ? $this->lineProperties['style']['arrow']['head']['type'] = (string) $head_arrow_type + : null; + (!is_null($head_arrow_size)) + ? $this->lineProperties['style']['arrow']['head']['size'] = (string) $head_arrow_size + : null; + (!is_null($end_arrow_type)) + ? $this->lineProperties['style']['arrow']['end']['type'] = (string) $end_arrow_type + : null; + (!is_null($end_arrow_size)) + ? $this->lineProperties['style']['arrow']['end']['size'] = (string) $end_arrow_size + : null; + } + + /** + * Get Line Color Property + * + * @param string $parameter + * + * @return string + */ + + public function getLineColorProperty($parameter) + { + return $this->lineProperties['color'][$parameter]; + } + + /** + * Get Line Style Property + * + * @param array|string $elements + * + * @return string + */ + + public function getLineStyleProperty($elements) + { + return $this->getArrayElementsValue($this->lineProperties['style'], $elements); + } + + /** + * Set Glow Properties + * + * @param float $size + * @param string $color_value + * @param int $color_alpha + * @param string $color_type + * + */ + + public function setGlowProperties($size, $color_value = null, $color_alpha = null, $color_type = null) + { + $this + ->activateObject() + ->setGlowSize($size) + ->setGlowColor($color_value, $color_alpha, $color_type); + } + + /** + * Get Glow Color Property + * + * @param string $property + * + * @return string + */ + + public function getGlowColor($property) + { + return $this->glowProperties['color'][$property]; + } + + /** + * Get Glow Size + * + * @return string + */ + + public function getGlowSize() + { + return $this->glowProperties['size']; + } + + /** + * Set Glow Size + * + * @param float $size + * + * @return PHPExcel_Chart_GridLines + */ + + private function setGlowSize($size) + { + $this->glowProperties['size'] = $this->getExcelPointsWidth((float) $size); + + return $this; + } + + /** + * Set Glow Color + * + * @param string $color + * @param int $alpha + * @param string $type + * + * @return PHPExcel_Chart_GridLines + */ + + private function setGlowColor($color, $alpha, $type) + { + if (!is_null($color)) { + $this->glowProperties['color']['value'] = (string) $color; + } + if (!is_null($alpha)) { + $this->glowProperties['color']['alpha'] = $this->getTrueAlpha((int) $alpha); + } + if (!is_null($type)) { + $this->glowProperties['color']['type'] = (string) $type; + } + + return $this; + } + + /** + * Get Line Style Arrow Parameters + * + * @param string $arrow_selector + * @param string $property_selector + * + * @return string + */ + + public function getLineStyleArrowParameters($arrow_selector, $property_selector) + { + return $this->getLineStyleArrowSize($this->lineProperties['style']['arrow'][$arrow_selector]['size'], $property_selector); + } + + /** + * Set Shadow Properties + * + * @param int $sh_presets + * @param string $sh_color_value + * @param string $sh_color_type + * @param int $sh_color_alpha + * @param string $sh_blur + * @param int $sh_angle + * @param float $sh_distance + * + */ + + public function setShadowProperties($sh_presets, $sh_color_value = null, $sh_color_type = null, $sh_color_alpha = null, $sh_blur = null, $sh_angle = null, $sh_distance = null) + { + $this->activateObject() + ->setShadowPresetsProperties((int) $sh_presets) + ->setShadowColor( + is_null($sh_color_value) ? $this->shadowProperties['color']['value'] : $sh_color_value, + is_null($sh_color_alpha) ? (int) $this->shadowProperties['color']['alpha'] : $this->getTrueAlpha($sh_color_alpha), + is_null($sh_color_type) ? $this->shadowProperties['color']['type'] : $sh_color_type + ) + ->setShadowBlur($sh_blur) + ->setShadowAngle($sh_angle) + ->setShadowDistance($sh_distance); + } + + /** + * Set Shadow Presets Properties + * + * @param int $shadow_presets + * + * @return PHPExcel_Chart_GridLines + */ + + private function setShadowPresetsProperties($shadow_presets) + { + $this->shadowProperties['presets'] = $shadow_presets; + $this->setShadowProperiesMapValues($this->getShadowPresetsMap($shadow_presets)); + + return $this; + } + + /** + * Set Shadow Properties Values + * + * @param array $properties_map + * @param * $reference + * + * @return PHPExcel_Chart_GridLines + */ + + private function setShadowProperiesMapValues(array $properties_map, &$reference = null) + { + $base_reference = $reference; + foreach ($properties_map as $property_key => $property_val) { + if (is_array($property_val)) { + if ($reference === null) { + $reference = & $this->shadowProperties[$property_key]; + } else { + $reference = & $reference[$property_key]; + } + $this->setShadowProperiesMapValues($property_val, $reference); + } else { + if ($base_reference === null) { + $this->shadowProperties[$property_key] = $property_val; + } else { + $reference[$property_key] = $property_val; + } + } + } + + return $this; + } + + /** + * Set Shadow Color + * + * @param string $color + * @param int $alpha + * @param string $type + * @return PHPExcel_Chart_GridLines + */ + private function setShadowColor($color, $alpha, $type) + { + if (!is_null($color)) { + $this->shadowProperties['color']['value'] = (string) $color; + } + if (!is_null($alpha)) { + $this->shadowProperties['color']['alpha'] = $this->getTrueAlpha((int) $alpha); + } + if (!is_null($type)) { + $this->shadowProperties['color']['type'] = (string) $type; + } + + return $this; + } + + /** + * Set Shadow Blur + * + * @param float $blur + * + * @return PHPExcel_Chart_GridLines + */ + private function setShadowBlur($blur) + { + if ($blur !== null) { + $this->shadowProperties['blur'] = (string) $this->getExcelPointsWidth($blur); + } + + return $this; + } + + /** + * Set Shadow Angle + * + * @param int $angle + * @return PHPExcel_Chart_GridLines + */ + + private function setShadowAngle($angle) + { + if ($angle !== null) { + $this->shadowProperties['direction'] = (string) $this->getExcelPointsAngle($angle); + } + + return $this; + } + + /** + * Set Shadow Distance + * + * @param float $distance + * @return PHPExcel_Chart_GridLines + */ + private function setShadowDistance($distance) + { + if ($distance !== null) { + $this->shadowProperties['distance'] = (string) $this->getExcelPointsWidth($distance); + } + + return $this; + } + + /** + * Get Shadow Property + * + * @param string $elements + * @param array $elements + * @return string + */ + public function getShadowProperty($elements) + { + return $this->getArrayElementsValue($this->shadowProperties, $elements); + } + + /** + * Set Soft Edges Size + * + * @param float $size + */ + public function setSoftEdgesSize($size) + { + if (!is_null($size)) { + $this->activateObject(); + $softEdges['size'] = (string) $this->getExcelPointsWidth($size); + } + } + + /** + * Get Soft Edges Size + * + * @return string + */ + public function getSoftEdgesSize() + { + return $this->softEdges['size']; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Chart/Layout.php b/application/third_party/PHPExcel/PHPExcel/Chart/Layout.php new file mode 100644 index 0000000..7fef074 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Chart/Layout.php @@ -0,0 +1,486 @@ +layoutTarget = $layout['layoutTarget']; + } + if (isset($layout['xMode'])) { + $this->xMode = $layout['xMode']; + } + if (isset($layout['yMode'])) { + $this->yMode = $layout['yMode']; + } + if (isset($layout['x'])) { + $this->xPos = (float) $layout['x']; + } + if (isset($layout['y'])) { + $this->yPos = (float) $layout['y']; + } + if (isset($layout['w'])) { + $this->width = (float) $layout['w']; + } + if (isset($layout['h'])) { + $this->height = (float) $layout['h']; + } + } + + /** + * Get Layout Target + * + * @return string + */ + public function getLayoutTarget() + { + return $this->layoutTarget; + } + + /** + * Set Layout Target + * + * @param Layout Target $value + * @return PHPExcel_Chart_Layout + */ + public function setLayoutTarget($value) + { + $this->layoutTarget = $value; + return $this; + } + + /** + * Get X-Mode + * + * @return string + */ + public function getXMode() + { + return $this->xMode; + } + + /** + * Set X-Mode + * + * @param X-Mode $value + * @return PHPExcel_Chart_Layout + */ + public function setXMode($value) + { + $this->xMode = $value; + return $this; + } + + /** + * Get Y-Mode + * + * @return string + */ + public function getYMode() + { + return $this->yMode; + } + + /** + * Set Y-Mode + * + * @param Y-Mode $value + * @return PHPExcel_Chart_Layout + */ + public function setYMode($value) + { + $this->yMode = $value; + return $this; + } + + /** + * Get X-Position + * + * @return number + */ + public function getXPosition() + { + return $this->xPos; + } + + /** + * Set X-Position + * + * @param X-Position $value + * @return PHPExcel_Chart_Layout + */ + public function setXPosition($value) + { + $this->xPos = $value; + return $this; + } + + /** + * Get Y-Position + * + * @return number + */ + public function getYPosition() + { + return $this->yPos; + } + + /** + * Set Y-Position + * + * @param Y-Position $value + * @return PHPExcel_Chart_Layout + */ + public function setYPosition($value) + { + $this->yPos = $value; + return $this; + } + + /** + * Get Width + * + * @return number + */ + public function getWidth() + { + return $this->width; + } + + /** + * Set Width + * + * @param Width $value + * @return PHPExcel_Chart_Layout + */ + public function setWidth($value) + { + $this->width = $value; + return $this; + } + + /** + * Get Height + * + * @return number + */ + public function getHeight() + { + return $this->height; + } + + /** + * Set Height + * + * @param Height $value + * @return PHPExcel_Chart_Layout + */ + public function setHeight($value) + { + $this->height = $value; + return $this; + } + + + /** + * Get show legend key + * + * @return boolean + */ + public function getShowLegendKey() + { + return $this->showLegendKey; + } + + /** + * Set show legend key + * Specifies that legend keys should be shown in data labels. + * + * @param boolean $value Show legend key + * @return PHPExcel_Chart_Layout + */ + public function setShowLegendKey($value) + { + $this->showLegendKey = $value; + return $this; + } + + /** + * Get show value + * + * @return boolean + */ + public function getShowVal() + { + return $this->showVal; + } + + /** + * Set show val + * Specifies that the value should be shown in data labels. + * + * @param boolean $value Show val + * @return PHPExcel_Chart_Layout + */ + public function setShowVal($value) + { + $this->showVal = $value; + return $this; + } + + /** + * Get show category name + * + * @return boolean + */ + public function getShowCatName() + { + return $this->showCatName; + } + + /** + * Set show cat name + * Specifies that the category name should be shown in data labels. + * + * @param boolean $value Show cat name + * @return PHPExcel_Chart_Layout + */ + public function setShowCatName($value) + { + $this->showCatName = $value; + return $this; + } + + /** + * Get show data series name + * + * @return boolean + */ + public function getShowSerName() + { + return $this->showSerName; + } + + /** + * Set show ser name + * Specifies that the series name should be shown in data labels. + * + * @param boolean $value Show series name + * @return PHPExcel_Chart_Layout + */ + public function setShowSerName($value) + { + $this->showSerName = $value; + return $this; + } + + /** + * Get show percentage + * + * @return boolean + */ + public function getShowPercent() + { + return $this->showPercent; + } + + /** + * Set show percentage + * Specifies that the percentage should be shown in data labels. + * + * @param boolean $value Show percentage + * @return PHPExcel_Chart_Layout + */ + public function setShowPercent($value) + { + $this->showPercent = $value; + return $this; + } + + /** + * Get show bubble size + * + * @return boolean + */ + public function getShowBubbleSize() + { + return $this->showBubbleSize; + } + + /** + * Set show bubble size + * Specifies that the bubble size should be shown in data labels. + * + * @param boolean $value Show bubble size + * @return PHPExcel_Chart_Layout + */ + public function setShowBubbleSize($value) + { + $this->showBubbleSize = $value; + return $this; + } + + /** + * Get show leader lines + * + * @return boolean + */ + public function getShowLeaderLines() + { + return $this->showLeaderLines; + } + + /** + * Set show leader lines + * Specifies that leader lines should be shown in data labels. + * + * @param boolean $value Show leader lines + * @return PHPExcel_Chart_Layout + */ + public function setShowLeaderLines($value) + { + $this->showLeaderLines = $value; + return $this; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Chart/Legend.php b/application/third_party/PHPExcel/PHPExcel/Chart/Legend.php new file mode 100644 index 0000000..e850eb5 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Chart/Legend.php @@ -0,0 +1,170 @@ + self::POSITION_BOTTOM, + self::xlLegendPositionCorner => self::POSITION_TOPRIGHT, + self::xlLegendPositionCustom => '??', + self::xlLegendPositionLeft => self::POSITION_LEFT, + self::xlLegendPositionRight => self::POSITION_RIGHT, + self::xlLegendPositionTop => self::POSITION_TOP + ); + + /** + * Legend position + * + * @var string + */ + private $position = self::POSITION_RIGHT; + + /** + * Allow overlay of other elements? + * + * @var boolean + */ + private $overlay = true; + + /** + * Legend Layout + * + * @var PHPExcel_Chart_Layout + */ + private $layout = null; + + + /** + * Create a new PHPExcel_Chart_Legend + */ + public function __construct($position = self::POSITION_RIGHT, PHPExcel_Chart_Layout $layout = null, $overlay = false) + { + $this->setPosition($position); + $this->layout = $layout; + $this->setOverlay($overlay); + } + + /** + * Get legend position as an excel string value + * + * @return string + */ + public function getPosition() + { + return $this->position; + } + + /** + * Get legend position using an excel string value + * + * @param string $position + */ + public function setPosition($position = self::POSITION_RIGHT) + { + if (!in_array($position, self::$positionXLref)) { + return false; + } + + $this->position = $position; + return true; + } + + /** + * Get legend position as an Excel internal numeric value + * + * @return number + */ + public function getPositionXL() + { + return array_search($this->position, self::$positionXLref); + } + + /** + * Set legend position using an Excel internal numeric value + * + * @param number $positionXL + */ + public function setPositionXL($positionXL = self::xlLegendPositionRight) + { + if (!array_key_exists($positionXL, self::$positionXLref)) { + return false; + } + + $this->position = self::$positionXLref[$positionXL]; + return true; + } + + /** + * Get allow overlay of other elements? + * + * @return boolean + */ + public function getOverlay() + { + return $this->overlay; + } + + /** + * Set allow overlay of other elements? + * + * @param boolean $overlay + * @return boolean + */ + public function setOverlay($overlay = false) + { + if (!is_bool($overlay)) { + return false; + } + + $this->overlay = $overlay; + return true; + } + + /** + * Get Layout + * + * @return PHPExcel_Chart_Layout + */ + public function getLayout() + { + return $this->layout; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Chart/PlotArea.php b/application/third_party/PHPExcel/PHPExcel/Chart/PlotArea.php new file mode 100644 index 0000000..551cc51 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Chart/PlotArea.php @@ -0,0 +1,126 @@ +layout = $layout; + $this->plotSeries = $plotSeries; + } + + /** + * Get Layout + * + * @return PHPExcel_Chart_Layout + */ + public function getLayout() + { + return $this->layout; + } + + /** + * Get Number of Plot Groups + * + * @return array of PHPExcel_Chart_DataSeries + */ + public function getPlotGroupCount() + { + return count($this->plotSeries); + } + + /** + * Get Number of Plot Series + * + * @return integer + */ + public function getPlotSeriesCount() + { + $seriesCount = 0; + foreach ($this->plotSeries as $plot) { + $seriesCount += $plot->getPlotSeriesCount(); + } + return $seriesCount; + } + + /** + * Get Plot Series + * + * @return array of PHPExcel_Chart_DataSeries + */ + public function getPlotGroup() + { + return $this->plotSeries; + } + + /** + * Get Plot Series by Index + * + * @return PHPExcel_Chart_DataSeries + */ + public function getPlotGroupByIndex($index) + { + return $this->plotSeries[$index]; + } + + /** + * Set Plot Series + * + * @param [PHPExcel_Chart_DataSeries] + * @return PHPExcel_Chart_PlotArea + */ + public function setPlotSeries($plotSeries = array()) + { + $this->plotSeries = $plotSeries; + + return $this; + } + + public function refresh(PHPExcel_Worksheet $worksheet) + { + foreach ($this->plotSeries as $plotSeries) { + $plotSeries->refresh($worksheet); + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Chart/Properties.php b/application/third_party/PHPExcel/PHPExcel/Chart/Properties.php new file mode 100644 index 0000000..9bb6e93 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Chart/Properties.php @@ -0,0 +1,363 @@ + (string) $type, + 'value' => (string) $color, + 'alpha' => (string) $this->getTrueAlpha($alpha) + ); + } + + protected function getLineStyleArrowSize($array_selector, $array_kay_selector) + { + $sizes = array( + 1 => array('w' => 'sm', 'len' => 'sm'), + 2 => array('w' => 'sm', 'len' => 'med'), + 3 => array('w' => 'sm', 'len' => 'lg'), + 4 => array('w' => 'med', 'len' => 'sm'), + 5 => array('w' => 'med', 'len' => 'med'), + 6 => array('w' => 'med', 'len' => 'lg'), + 7 => array('w' => 'lg', 'len' => 'sm'), + 8 => array('w' => 'lg', 'len' => 'med'), + 9 => array('w' => 'lg', 'len' => 'lg') + ); + + return $sizes[$array_selector][$array_kay_selector]; + } + + protected function getShadowPresetsMap($shadow_presets_option) + { + $presets_options = array( + //OUTER + 1 => array( + 'effect' => 'outerShdw', + 'blur' => '50800', + 'distance' => '38100', + 'direction' => '2700000', + 'algn' => 'tl', + 'rotWithShape' => '0' + ), + 2 => array( + 'effect' => 'outerShdw', + 'blur' => '50800', + 'distance' => '38100', + 'direction' => '5400000', + 'algn' => 't', + 'rotWithShape' => '0' + ), + 3 => array( + 'effect' => 'outerShdw', + 'blur' => '50800', + 'distance' => '38100', + 'direction' => '8100000', + 'algn' => 'tr', + 'rotWithShape' => '0' + ), + 4 => array( + 'effect' => 'outerShdw', + 'blur' => '50800', + 'distance' => '38100', + 'algn' => 'l', + 'rotWithShape' => '0' + ), + 5 => array( + 'effect' => 'outerShdw', + 'size' => array( + 'sx' => '102000', + 'sy' => '102000' + ) + , + 'blur' => '63500', + 'distance' => '38100', + 'algn' => 'ctr', + 'rotWithShape' => '0' + ), + 6 => array( + 'effect' => 'outerShdw', + 'blur' => '50800', + 'distance' => '38100', + 'direction' => '10800000', + 'algn' => 'r', + 'rotWithShape' => '0' + ), + 7 => array( + 'effect' => 'outerShdw', + 'blur' => '50800', + 'distance' => '38100', + 'direction' => '18900000', + 'algn' => 'bl', + 'rotWithShape' => '0' + ), + 8 => array( + 'effect' => 'outerShdw', + 'blur' => '50800', + 'distance' => '38100', + 'direction' => '16200000', + 'rotWithShape' => '0' + ), + 9 => array( + 'effect' => 'outerShdw', + 'blur' => '50800', + 'distance' => '38100', + 'direction' => '13500000', + 'algn' => 'br', + 'rotWithShape' => '0' + ), + //INNER + 10 => array( + 'effect' => 'innerShdw', + 'blur' => '63500', + 'distance' => '50800', + 'direction' => '2700000', + ), + 11 => array( + 'effect' => 'innerShdw', + 'blur' => '63500', + 'distance' => '50800', + 'direction' => '5400000', + ), + 12 => array( + 'effect' => 'innerShdw', + 'blur' => '63500', + 'distance' => '50800', + 'direction' => '8100000', + ), + 13 => array( + 'effect' => 'innerShdw', + 'blur' => '63500', + 'distance' => '50800', + ), + 14 => array( + 'effect' => 'innerShdw', + 'blur' => '114300', + ), + 15 => array( + 'effect' => 'innerShdw', + 'blur' => '63500', + 'distance' => '50800', + 'direction' => '10800000', + ), + 16 => array( + 'effect' => 'innerShdw', + 'blur' => '63500', + 'distance' => '50800', + 'direction' => '18900000', + ), + 17 => array( + 'effect' => 'innerShdw', + 'blur' => '63500', + 'distance' => '50800', + 'direction' => '16200000', + ), + 18 => array( + 'effect' => 'innerShdw', + 'blur' => '63500', + 'distance' => '50800', + 'direction' => '13500000', + ), + //perspective + 19 => array( + 'effect' => 'outerShdw', + 'blur' => '152400', + 'distance' => '317500', + 'size' => array( + 'sx' => '90000', + 'sy' => '-19000', + ), + 'direction' => '5400000', + 'rotWithShape' => '0', + ), + 20 => array( + 'effect' => 'outerShdw', + 'blur' => '76200', + 'direction' => '18900000', + 'size' => array( + 'sy' => '23000', + 'kx' => '-1200000', + ), + 'algn' => 'bl', + 'rotWithShape' => '0', + ), + 21 => array( + 'effect' => 'outerShdw', + 'blur' => '76200', + 'direction' => '13500000', + 'size' => array( + 'sy' => '23000', + 'kx' => '1200000', + ), + 'algn' => 'br', + 'rotWithShape' => '0', + ), + 22 => array( + 'effect' => 'outerShdw', + 'blur' => '76200', + 'distance' => '12700', + 'direction' => '2700000', + 'size' => array( + 'sy' => '-23000', + 'kx' => '-800400', + ), + 'algn' => 'bl', + 'rotWithShape' => '0', + ), + 23 => array( + 'effect' => 'outerShdw', + 'blur' => '76200', + 'distance' => '12700', + 'direction' => '8100000', + 'size' => array( + 'sy' => '-23000', + 'kx' => '800400', + ), + 'algn' => 'br', + 'rotWithShape' => '0', + ), + ); + + return $presets_options[$shadow_presets_option]; + } + + protected function getArrayElementsValue($properties, $elements) + { + $reference = & $properties; + if (!is_array($elements)) { + return $reference[$elements]; + } else { + foreach ($elements as $keys) { + $reference = & $reference[$keys]; + } + return $reference; + } + return $this; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Chart/Renderer/PHP Charting Libraries.txt b/application/third_party/PHPExcel/PHPExcel/Chart/Renderer/PHP Charting Libraries.txt new file mode 100644 index 0000000..a088989 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Chart/Renderer/PHP Charting Libraries.txt @@ -0,0 +1,20 @@ +ChartDirector + http://www.advsofteng.com/cdphp.html + +GraPHPite + http://graphpite.sourceforge.net/ + +JpGraph + http://www.aditus.nu/jpgraph/ + +LibChart + http://naku.dohcrew.com/libchart/pages/introduction/ + +pChart + http://pchart.sourceforge.net/ + +TeeChart + http://www.steema.com/products/teechart/overview.html + +PHPGraphLib + http://www.ebrueggeman.com/phpgraphlib \ No newline at end of file diff --git a/application/third_party/PHPExcel/PHPExcel/Chart/Renderer/jpgraph.php b/application/third_party/PHPExcel/PHPExcel/Chart/Renderer/jpgraph.php new file mode 100644 index 0000000..b3d7396 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Chart/Renderer/jpgraph.php @@ -0,0 +1,883 @@ + MARK_DIAMOND, + 'square' => MARK_SQUARE, + 'triangle' => MARK_UTRIANGLE, + 'x' => MARK_X, + 'star' => MARK_STAR, + 'dot' => MARK_FILLEDCIRCLE, + 'dash' => MARK_DTRIANGLE, + 'circle' => MARK_CIRCLE, + 'plus' => MARK_CROSS + ); + + + private $chart; + + private $graph; + + private static $plotColour = 0; + + private static $plotMark = 0; + + + private function formatPointMarker($seriesPlot, $markerID) + { + $plotMarkKeys = array_keys(self::$markSet); + if (is_null($markerID)) { + // Use default plot marker (next marker in the series) + self::$plotMark %= count(self::$markSet); + $seriesPlot->mark->SetType(self::$markSet[$plotMarkKeys[self::$plotMark++]]); + } elseif ($markerID !== 'none') { + // Use specified plot marker (if it exists) + if (isset(self::$markSet[$markerID])) { + $seriesPlot->mark->SetType(self::$markSet[$markerID]); + } else { + // If the specified plot marker doesn't exist, use default plot marker (next marker in the series) + self::$plotMark %= count(self::$markSet); + $seriesPlot->mark->SetType(self::$markSet[$plotMarkKeys[self::$plotMark++]]); + } + } else { + // Hide plot marker + $seriesPlot->mark->Hide(); + } + $seriesPlot->mark->SetColor(self::$colourSet[self::$plotColour]); + $seriesPlot->mark->SetFillColor(self::$colourSet[self::$plotColour]); + $seriesPlot->SetColor(self::$colourSet[self::$plotColour++]); + + return $seriesPlot; + } + + + private function formatDataSetLabels($groupID, $datasetLabels, $labelCount, $rotation = '') + { + $datasetLabelFormatCode = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getFormatCode(); + if (!is_null($datasetLabelFormatCode)) { + // Retrieve any label formatting code + $datasetLabelFormatCode = stripslashes($datasetLabelFormatCode); + } + + $testCurrentIndex = 0; + foreach ($datasetLabels as $i => $datasetLabel) { + if (is_array($datasetLabel)) { + if ($rotation == 'bar') { + $datasetLabels[$i] = implode(" ", $datasetLabel); + } else { + $datasetLabel = array_reverse($datasetLabel); + $datasetLabels[$i] = implode("\n", $datasetLabel); + } + } else { + // Format labels according to any formatting code + if (!is_null($datasetLabelFormatCode)) { + $datasetLabels[$i] = PHPExcel_Style_NumberFormat::toFormattedString($datasetLabel, $datasetLabelFormatCode); + } + } + ++$testCurrentIndex; + } + + return $datasetLabels; + } + + + private function percentageSumCalculation($groupID, $seriesCount) + { + // Adjust our values to a percentage value across all series in the group + for ($i = 0; $i < $seriesCount; ++$i) { + if ($i == 0) { + $sumValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues(); + } else { + $nextValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues(); + foreach ($nextValues as $k => $value) { + if (isset($sumValues[$k])) { + $sumValues[$k] += $value; + } else { + $sumValues[$k] = $value; + } + } + } + } + + return $sumValues; + } + + + private function percentageAdjustValues($dataValues, $sumValues) + { + foreach ($dataValues as $k => $dataValue) { + $dataValues[$k] = $dataValue / $sumValues[$k] * 100; + } + + return $dataValues; + } + + + private function getCaption($captionElement) + { + // Read any caption + $caption = (!is_null($captionElement)) ? $captionElement->getCaption() : null; + // Test if we have a title caption to display + if (!is_null($caption)) { + // If we do, it could be a plain string or an array + if (is_array($caption)) { + // Implode an array to a plain string + $caption = implode('', $caption); + } + } + return $caption; + } + + + private function renderTitle() + { + $title = $this->getCaption($this->chart->getTitle()); + if (!is_null($title)) { + $this->graph->title->Set($title); + } + } + + + private function renderLegend() + { + $legend = $this->chart->getLegend(); + if (!is_null($legend)) { + $legendPosition = $legend->getPosition(); + $legendOverlay = $legend->getOverlay(); + switch ($legendPosition) { + case 'r': + $this->graph->legend->SetPos(0.01, 0.5, 'right', 'center'); // right + $this->graph->legend->SetColumns(1); + break; + case 'l': + $this->graph->legend->SetPos(0.01, 0.5, 'left', 'center'); // left + $this->graph->legend->SetColumns(1); + break; + case 't': + $this->graph->legend->SetPos(0.5, 0.01, 'center', 'top'); // top + break; + case 'b': + $this->graph->legend->SetPos(0.5, 0.99, 'center', 'bottom'); // bottom + break; + default: + $this->graph->legend->SetPos(0.01, 0.01, 'right', 'top'); // top-right + $this->graph->legend->SetColumns(1); + break; + } + } else { + $this->graph->legend->Hide(); + } + } + + + private function renderCartesianPlotArea($type = 'textlin') + { + $this->graph = new Graph(self::$width, self::$height); + $this->graph->SetScale($type); + + $this->renderTitle(); + + // Rotate for bar rather than column chart + $rotation = $this->chart->getPlotArea()->getPlotGroupByIndex(0)->getPlotDirection(); + $reverse = ($rotation == 'bar') ? true : false; + + $xAxisLabel = $this->chart->getXAxisLabel(); + if (!is_null($xAxisLabel)) { + $title = $this->getCaption($xAxisLabel); + if (!is_null($title)) { + $this->graph->xaxis->SetTitle($title, 'center'); + $this->graph->xaxis->title->SetMargin(35); + if ($reverse) { + $this->graph->xaxis->title->SetAngle(90); + $this->graph->xaxis->title->SetMargin(90); + } + } + } + + $yAxisLabel = $this->chart->getYAxisLabel(); + if (!is_null($yAxisLabel)) { + $title = $this->getCaption($yAxisLabel); + if (!is_null($title)) { + $this->graph->yaxis->SetTitle($title, 'center'); + if ($reverse) { + $this->graph->yaxis->title->SetAngle(0); + $this->graph->yaxis->title->SetMargin(-55); + } + } + } + } + + + private function renderPiePlotArea($doughnut = false) + { + $this->graph = new PieGraph(self::$width, self::$height); + + $this->renderTitle(); + } + + + private function renderRadarPlotArea() + { + $this->graph = new RadarGraph(self::$width, self::$height); + $this->graph->SetScale('lin'); + + $this->renderTitle(); + } + + + private function renderPlotLine($groupID, $filled = false, $combination = false, $dimensions = '2d') + { + $grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping(); + + $labelCount = count($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount()); + if ($labelCount > 0) { + $datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues(); + $datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels, $labelCount); + $this->graph->xaxis->SetTickLabels($datasetLabels); + } + + $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount(); + $seriesPlots = array(); + if ($grouping == 'percentStacked') { + $sumValues = $this->percentageSumCalculation($groupID, $seriesCount); + } + + // Loop through each data series in turn + for ($i = 0; $i < $seriesCount; ++$i) { + $dataValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues(); + $marker = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker(); + + if ($grouping == 'percentStacked') { + $dataValues = $this->percentageAdjustValues($dataValues, $sumValues); + } + + // Fill in any missing values in the $dataValues array + $testCurrentIndex = 0; + foreach ($dataValues as $k => $dataValue) { + while ($k != $testCurrentIndex) { + $dataValues[$testCurrentIndex] = null; + ++$testCurrentIndex; + } + ++$testCurrentIndex; + } + + $seriesPlot = new LinePlot($dataValues); + if ($combination) { + $seriesPlot->SetBarCenter(); + } + + if ($filled) { + $seriesPlot->SetFilled(true); + $seriesPlot->SetColor('black'); + $seriesPlot->SetFillColor(self::$colourSet[self::$plotColour++]); + } else { + // Set the appropriate plot marker + $this->formatPointMarker($seriesPlot, $marker); + } + $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue(); + $seriesPlot->SetLegend($dataLabel); + + $seriesPlots[] = $seriesPlot; + } + + if ($grouping == 'standard') { + $groupPlot = $seriesPlots; + } else { + $groupPlot = new AccLinePlot($seriesPlots); + } + $this->graph->Add($groupPlot); + } + + + private function renderPlotBar($groupID, $dimensions = '2d') + { + $rotation = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotDirection(); + // Rotate for bar rather than column chart + if (($groupID == 0) && ($rotation == 'bar')) { + $this->graph->Set90AndMargin(); + } + $grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping(); + + $labelCount = count($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount()); + if ($labelCount > 0) { + $datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues(); + $datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels, $labelCount, $rotation); + // Rotate for bar rather than column chart + if ($rotation == 'bar') { + $datasetLabels = array_reverse($datasetLabels); + $this->graph->yaxis->SetPos('max'); + $this->graph->yaxis->SetLabelAlign('center', 'top'); + $this->graph->yaxis->SetLabelSide(SIDE_RIGHT); + } + $this->graph->xaxis->SetTickLabels($datasetLabels); + } + + + $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount(); + $seriesPlots = array(); + if ($grouping == 'percentStacked') { + $sumValues = $this->percentageSumCalculation($groupID, $seriesCount); + } + + // Loop through each data series in turn + for ($j = 0; $j < $seriesCount; ++$j) { + $dataValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($j)->getDataValues(); + if ($grouping == 'percentStacked') { + $dataValues = $this->percentageAdjustValues($dataValues, $sumValues); + } + + // Fill in any missing values in the $dataValues array + $testCurrentIndex = 0; + foreach ($dataValues as $k => $dataValue) { + while ($k != $testCurrentIndex) { + $dataValues[$testCurrentIndex] = null; + ++$testCurrentIndex; + } + ++$testCurrentIndex; + } + + // Reverse the $dataValues order for bar rather than column chart + if ($rotation == 'bar') { + $dataValues = array_reverse($dataValues); + } + $seriesPlot = new BarPlot($dataValues); + $seriesPlot->SetColor('black'); + $seriesPlot->SetFillColor(self::$colourSet[self::$plotColour++]); + if ($dimensions == '3d') { + $seriesPlot->SetShadow(); + } + if (!$this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($j)) { + $dataLabel = ''; + } else { + $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($j)->getDataValue(); + } + $seriesPlot->SetLegend($dataLabel); + + $seriesPlots[] = $seriesPlot; + } + // Reverse the plot order for bar rather than column chart + if (($rotation == 'bar') && (!($grouping == 'percentStacked'))) { + $seriesPlots = array_reverse($seriesPlots); + } + + if ($grouping == 'clustered') { + $groupPlot = new GroupBarPlot($seriesPlots); + } elseif ($grouping == 'standard') { + $groupPlot = new GroupBarPlot($seriesPlots); + } else { + $groupPlot = new AccBarPlot($seriesPlots); + if ($dimensions == '3d') { + $groupPlot->SetShadow(); + } + } + + $this->graph->Add($groupPlot); + } + + + private function renderPlotScatter($groupID, $bubble) + { + $grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping(); + $scatterStyle = $bubbleSize = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle(); + + $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount(); + $seriesPlots = array(); + + // Loop through each data series in turn + for ($i = 0; $i < $seriesCount; ++$i) { + $dataValuesY = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues(); + $dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues(); + + foreach ($dataValuesY as $k => $dataValueY) { + $dataValuesY[$k] = $k; + } + + $seriesPlot = new ScatterPlot($dataValuesX, $dataValuesY); + if ($scatterStyle == 'lineMarker') { + $seriesPlot->SetLinkPoints(); + $seriesPlot->link->SetColor(self::$colourSet[self::$plotColour]); + } elseif ($scatterStyle == 'smoothMarker') { + $spline = new Spline($dataValuesY, $dataValuesX); + list($splineDataY, $splineDataX) = $spline->Get(count($dataValuesX) * self::$width / 20); + $lplot = new LinePlot($splineDataX, $splineDataY); + $lplot->SetColor(self::$colourSet[self::$plotColour]); + + $this->graph->Add($lplot); + } + + if ($bubble) { + $this->formatPointMarker($seriesPlot, 'dot'); + $seriesPlot->mark->SetColor('black'); + $seriesPlot->mark->SetSize($bubbleSize); + } else { + $marker = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker(); + $this->formatPointMarker($seriesPlot, $marker); + } + $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue(); + $seriesPlot->SetLegend($dataLabel); + + $this->graph->Add($seriesPlot); + } + } + + + private function renderPlotRadar($groupID) + { + $radarStyle = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle(); + + $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount(); + $seriesPlots = array(); + + // Loop through each data series in turn + for ($i = 0; $i < $seriesCount; ++$i) { + $dataValuesY = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues(); + $dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues(); + $marker = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getPointMarker(); + + $dataValues = array(); + foreach ($dataValuesY as $k => $dataValueY) { + $dataValues[$k] = implode(' ', array_reverse($dataValueY)); + } + $tmp = array_shift($dataValues); + $dataValues[] = $tmp; + $tmp = array_shift($dataValuesX); + $dataValuesX[] = $tmp; + + $this->graph->SetTitles(array_reverse($dataValues)); + + $seriesPlot = new RadarPlot(array_reverse($dataValuesX)); + + $dataLabel = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotLabelByIndex($i)->getDataValue(); + $seriesPlot->SetColor(self::$colourSet[self::$plotColour++]); + if ($radarStyle == 'filled') { + $seriesPlot->SetFillColor(self::$colourSet[self::$plotColour]); + } + $this->formatPointMarker($seriesPlot, $marker); + $seriesPlot->SetLegend($dataLabel); + + $this->graph->Add($seriesPlot); + } + } + + + private function renderPlotContour($groupID) + { + $contourStyle = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle(); + + $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount(); + $seriesPlots = array(); + + $dataValues = array(); + // Loop through each data series in turn + for ($i = 0; $i < $seriesCount; ++$i) { + $dataValuesY = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex($i)->getDataValues(); + $dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($i)->getDataValues(); + + $dataValues[$i] = $dataValuesX; + } + $seriesPlot = new ContourPlot($dataValues); + + $this->graph->Add($seriesPlot); + } + + + private function renderPlotStock($groupID) + { + $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount(); + $plotOrder = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotOrder(); + + $dataValues = array(); + // Loop through each data series in turn and build the plot arrays + foreach ($plotOrder as $i => $v) { + $dataValuesX = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($v)->getDataValues(); + foreach ($dataValuesX as $j => $dataValueX) { + $dataValues[$plotOrder[$i]][$j] = $dataValueX; + } + } + if (empty($dataValues)) { + return; + } + + $dataValuesPlot = array(); + // Flatten the plot arrays to a single dimensional array to work with jpgraph + for ($j = 0; $j < count($dataValues[0]); ++$j) { + for ($i = 0; $i < $seriesCount; ++$i) { + $dataValuesPlot[] = $dataValues[$i][$j]; + } + } + + // Set the x-axis labels + $labelCount = count($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount()); + if ($labelCount > 0) { + $datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues(); + $datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels, $labelCount); + $this->graph->xaxis->SetTickLabels($datasetLabels); + } + + $seriesPlot = new StockPlot($dataValuesPlot); + $seriesPlot->SetWidth(20); + + $this->graph->Add($seriesPlot); + } + + + private function renderAreaChart($groupCount, $dimensions = '2d') + { + require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_line.php'); + + $this->renderCartesianPlotArea(); + + for ($i = 0; $i < $groupCount; ++$i) { + $this->renderPlotLine($i, true, false, $dimensions); + } + } + + + private function renderLineChart($groupCount, $dimensions = '2d') + { + require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_line.php'); + + $this->renderCartesianPlotArea(); + + for ($i = 0; $i < $groupCount; ++$i) { + $this->renderPlotLine($i, false, false, $dimensions); + } + } + + + private function renderBarChart($groupCount, $dimensions = '2d') + { + require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_bar.php'); + + $this->renderCartesianPlotArea(); + + for ($i = 0; $i < $groupCount; ++$i) { + $this->renderPlotBar($i, $dimensions); + } + } + + + private function renderScatterChart($groupCount) + { + require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_scatter.php'); + require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_regstat.php'); + require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_line.php'); + + $this->renderCartesianPlotArea('linlin'); + + for ($i = 0; $i < $groupCount; ++$i) { + $this->renderPlotScatter($i, false); + } + } + + + private function renderBubbleChart($groupCount) + { + require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_scatter.php'); + + $this->renderCartesianPlotArea('linlin'); + + for ($i = 0; $i < $groupCount; ++$i) { + $this->renderPlotScatter($i, true); + } + } + + + private function renderPieChart($groupCount, $dimensions = '2d', $doughnut = false, $multiplePlots = false) + { + require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_pie.php'); + if ($dimensions == '3d') { + require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_pie3d.php'); + } + + $this->renderPiePlotArea($doughnut); + + $iLimit = ($multiplePlots) ? $groupCount : 1; + for ($groupID = 0; $groupID < $iLimit; ++$groupID) { + $grouping = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotGrouping(); + $exploded = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotStyle(); + if ($groupID == 0) { + $labelCount = count($this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex(0)->getPointCount()); + if ($labelCount > 0) { + $datasetLabels = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotCategoryByIndex(0)->getDataValues(); + $datasetLabels = $this->formatDataSetLabels($groupID, $datasetLabels, $labelCount); + } + } + + $seriesCount = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotSeriesCount(); + $seriesPlots = array(); + // For pie charts, we only display the first series: doughnut charts generally display all series + $jLimit = ($multiplePlots) ? $seriesCount : 1; + // Loop through each data series in turn + for ($j = 0; $j < $jLimit; ++$j) { + $dataValues = $this->chart->getPlotArea()->getPlotGroupByIndex($groupID)->getPlotValuesByIndex($j)->getDataValues(); + + // Fill in any missing values in the $dataValues array + $testCurrentIndex = 0; + foreach ($dataValues as $k => $dataValue) { + while ($k != $testCurrentIndex) { + $dataValues[$testCurrentIndex] = null; + ++$testCurrentIndex; + } + ++$testCurrentIndex; + } + + if ($dimensions == '3d') { + $seriesPlot = new PiePlot3D($dataValues); + } else { + if ($doughnut) { + $seriesPlot = new PiePlotC($dataValues); + } else { + $seriesPlot = new PiePlot($dataValues); + } + } + + if ($multiplePlots) { + $seriesPlot->SetSize(($jLimit-$j) / ($jLimit * 4)); + } + + if ($doughnut) { + $seriesPlot->SetMidColor('white'); + } + + $seriesPlot->SetColor(self::$colourSet[self::$plotColour++]); + if (count($datasetLabels) > 0) { + $seriesPlot->SetLabels(array_fill(0, count($datasetLabels), '')); + } + if ($dimensions != '3d') { + $seriesPlot->SetGuideLines(false); + } + if ($j == 0) { + if ($exploded) { + $seriesPlot->ExplodeAll(); + } + $seriesPlot->SetLegends($datasetLabels); + } + + $this->graph->Add($seriesPlot); + } + } + } + + + private function renderRadarChart($groupCount) + { + require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_radar.php'); + + $this->renderRadarPlotArea(); + + for ($groupID = 0; $groupID < $groupCount; ++$groupID) { + $this->renderPlotRadar($groupID); + } + } + + + private function renderStockChart($groupCount) + { + require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_stock.php'); + + $this->renderCartesianPlotArea('intint'); + + for ($groupID = 0; $groupID < $groupCount; ++$groupID) { + $this->renderPlotStock($groupID); + } + } + + + private function renderContourChart($groupCount, $dimensions) + { + require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_contour.php'); + + $this->renderCartesianPlotArea('intint'); + + for ($i = 0; $i < $groupCount; ++$i) { + $this->renderPlotContour($i); + } + } + + + private function renderCombinationChart($groupCount, $dimensions, $outputDestination) + { + require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_line.php'); + require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_bar.php'); + require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_scatter.php'); + require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_regstat.php'); + require_once(PHPExcel_Settings::getChartRendererPath().'jpgraph_line.php'); + + $this->renderCartesianPlotArea(); + + for ($i = 0; $i < $groupCount; ++$i) { + $dimensions = null; + $chartType = $this->chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType(); + switch ($chartType) { + case 'area3DChart': + $dimensions = '3d'; + // no break + case 'areaChart': + $this->renderPlotLine($i, true, true, $dimensions); + break; + case 'bar3DChart': + $dimensions = '3d'; + // no break + case 'barChart': + $this->renderPlotBar($i, $dimensions); + break; + case 'line3DChart': + $dimensions = '3d'; + // no break + case 'lineChart': + $this->renderPlotLine($i, false, true, $dimensions); + break; + case 'scatterChart': + $this->renderPlotScatter($i, false); + break; + case 'bubbleChart': + $this->renderPlotScatter($i, true); + break; + default: + $this->graph = null; + return false; + } + } + + $this->renderLegend(); + + $this->graph->Stroke($outputDestination); + return true; + } + + + public function render($outputDestination) + { + self::$plotColour = 0; + + $groupCount = $this->chart->getPlotArea()->getPlotGroupCount(); + + $dimensions = null; + if ($groupCount == 1) { + $chartType = $this->chart->getPlotArea()->getPlotGroupByIndex(0)->getPlotType(); + } else { + $chartTypes = array(); + for ($i = 0; $i < $groupCount; ++$i) { + $chartTypes[] = $this->chart->getPlotArea()->getPlotGroupByIndex($i)->getPlotType(); + } + $chartTypes = array_unique($chartTypes); + if (count($chartTypes) == 1) { + $chartType = array_pop($chartTypes); + } elseif (count($chartTypes) == 0) { + echo 'Chart is not yet implemented
'; + return false; + } else { + return $this->renderCombinationChart($groupCount, $dimensions, $outputDestination); + } + } + + switch ($chartType) { + case 'area3DChart': + $dimensions = '3d'; + // no break + case 'areaChart': + $this->renderAreaChart($groupCount, $dimensions); + break; + case 'bar3DChart': + $dimensions = '3d'; + // no break + case 'barChart': + $this->renderBarChart($groupCount, $dimensions); + break; + case 'line3DChart': + $dimensions = '3d'; + // no break + case 'lineChart': + $this->renderLineChart($groupCount, $dimensions); + break; + case 'pie3DChart': + $dimensions = '3d'; + // no break + case 'pieChart': + $this->renderPieChart($groupCount, $dimensions, false, false); + break; + case 'doughnut3DChart': + $dimensions = '3d'; + // no break + case 'doughnutChart': + $this->renderPieChart($groupCount, $dimensions, true, true); + break; + case 'scatterChart': + $this->renderScatterChart($groupCount); + break; + case 'bubbleChart': + $this->renderBubbleChart($groupCount); + break; + case 'radarChart': + $this->renderRadarChart($groupCount); + break; + case 'surface3DChart': + $dimensions = '3d'; + // no break + case 'surfaceChart': + $this->renderContourChart($groupCount, $dimensions); + break; + case 'stockChart': + $this->renderStockChart($groupCount, $dimensions); + break; + default: + echo $chartType.' is not yet implemented
'; + return false; + } + $this->renderLegend(); + + $this->graph->Stroke($outputDestination); + return true; + } + + + /** + * Create a new PHPExcel_Chart_Renderer_jpgraph + */ + public function __construct(PHPExcel_Chart $chart) + { + $this->graph = null; + $this->chart = $chart; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Chart/Title.php b/application/third_party/PHPExcel/PHPExcel/Chart/Title.php new file mode 100644 index 0000000..d8dc14f --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Chart/Title.php @@ -0,0 +1,86 @@ +caption = $caption; + $this->layout = $layout; + } + + /** + * Get caption + * + * @return string + */ + public function getCaption() + { + return $this->caption; + } + + /** + * Set caption + * + * @param string $caption + * @return PHPExcel_Chart_Title + */ + public function setCaption($caption = null) + { + $this->caption = $caption; + + return $this; + } + + /** + * Get Layout + * + * @return PHPExcel_Chart_Layout + */ + public function getLayout() + { + return $this->layout; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Comment.php b/application/third_party/PHPExcel/PHPExcel/Comment.php new file mode 100644 index 0000000..d55363f --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Comment.php @@ -0,0 +1,338 @@ +author = 'Author'; + $this->text = new PHPExcel_RichText(); + $this->fillColor = new PHPExcel_Style_Color('FFFFFFE1'); + $this->alignment = PHPExcel_Style_Alignment::HORIZONTAL_GENERAL; + } + + /** + * Get Author + * + * @return string + */ + public function getAuthor() + { + return $this->author; + } + + /** + * Set Author + * + * @param string $pValue + * @return PHPExcel_Comment + */ + public function setAuthor($pValue = '') + { + $this->author = $pValue; + return $this; + } + + /** + * Get Rich text comment + * + * @return PHPExcel_RichText + */ + public function getText() + { + return $this->text; + } + + /** + * Set Rich text comment + * + * @param PHPExcel_RichText $pValue + * @return PHPExcel_Comment + */ + public function setText(PHPExcel_RichText $pValue) + { + $this->text = $pValue; + return $this; + } + + /** + * Get comment width (CSS style, i.e. XXpx or YYpt) + * + * @return string + */ + public function getWidth() + { + return $this->width; + } + + /** + * Set comment width (CSS style, i.e. XXpx or YYpt) + * + * @param string $value + * @return PHPExcel_Comment + */ + public function setWidth($value = '96pt') + { + $this->width = $value; + return $this; + } + + /** + * Get comment height (CSS style, i.e. XXpx or YYpt) + * + * @return string + */ + public function getHeight() + { + return $this->height; + } + + /** + * Set comment height (CSS style, i.e. XXpx or YYpt) + * + * @param string $value + * @return PHPExcel_Comment + */ + public function setHeight($value = '55.5pt') + { + $this->height = $value; + return $this; + } + + /** + * Get left margin (CSS style, i.e. XXpx or YYpt) + * + * @return string + */ + public function getMarginLeft() + { + return $this->marginLeft; + } + + /** + * Set left margin (CSS style, i.e. XXpx or YYpt) + * + * @param string $value + * @return PHPExcel_Comment + */ + public function setMarginLeft($value = '59.25pt') + { + $this->marginLeft = $value; + return $this; + } + + /** + * Get top margin (CSS style, i.e. XXpx or YYpt) + * + * @return string + */ + public function getMarginTop() + { + return $this->marginTop; + } + + /** + * Set top margin (CSS style, i.e. XXpx or YYpt) + * + * @param string $value + * @return PHPExcel_Comment + */ + public function setMarginTop($value = '1.5pt') + { + $this->marginTop = $value; + return $this; + } + + /** + * Is the comment visible by default? + * + * @return boolean + */ + public function getVisible() + { + return $this->visible; + } + + /** + * Set comment default visibility + * + * @param boolean $value + * @return PHPExcel_Comment + */ + public function setVisible($value = false) + { + $this->visible = $value; + return $this; + } + + /** + * Get fill color + * + * @return PHPExcel_Style_Color + */ + public function getFillColor() + { + return $this->fillColor; + } + + /** + * Set Alignment + * + * @param string $pValue + * @return PHPExcel_Comment + */ + public function setAlignment($pValue = PHPExcel_Style_Alignment::HORIZONTAL_GENERAL) + { + $this->alignment = $pValue; + return $this; + } + + /** + * Get Alignment + * + * @return string + */ + public function getAlignment() + { + return $this->alignment; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + return md5( + $this->author . + $this->text->getHashCode() . + $this->width . + $this->height . + $this->marginLeft . + $this->marginTop . + ($this->visible ? 1 : 0) . + $this->fillColor->getHashCode() . + $this->alignment . + __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } + + /** + * Convert to string + * + * @return string + */ + public function __toString() + { + return $this->text->getPlainText(); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/DocumentProperties.php b/application/third_party/PHPExcel/PHPExcel/DocumentProperties.php new file mode 100644 index 0000000..2395ba9 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/DocumentProperties.php @@ -0,0 +1,611 @@ +lastModifiedBy = $this->creator; + $this->created = time(); + $this->modified = time(); + } + + /** + * Get Creator + * + * @return string + */ + public function getCreator() + { + return $this->creator; + } + + /** + * Set Creator + * + * @param string $pValue + * @return PHPExcel_DocumentProperties + */ + public function setCreator($pValue = '') + { + $this->creator = $pValue; + return $this; + } + + /** + * Get Last Modified By + * + * @return string + */ + public function getLastModifiedBy() + { + return $this->lastModifiedBy; + } + + /** + * Set Last Modified By + * + * @param string $pValue + * @return PHPExcel_DocumentProperties + */ + public function setLastModifiedBy($pValue = '') + { + $this->lastModifiedBy = $pValue; + return $this; + } + + /** + * Get Created + * + * @return datetime + */ + public function getCreated() + { + return $this->created; + } + + /** + * Set Created + * + * @param datetime $pValue + * @return PHPExcel_DocumentProperties + */ + public function setCreated($pValue = null) + { + if ($pValue === null) { + $pValue = time(); + } elseif (is_string($pValue)) { + if (is_numeric($pValue)) { + $pValue = intval($pValue); + } else { + $pValue = strtotime($pValue); + } + } + + $this->created = $pValue; + return $this; + } + + /** + * Get Modified + * + * @return datetime + */ + public function getModified() + { + return $this->modified; + } + + /** + * Set Modified + * + * @param datetime $pValue + * @return PHPExcel_DocumentProperties + */ + public function setModified($pValue = null) + { + if ($pValue === null) { + $pValue = time(); + } elseif (is_string($pValue)) { + if (is_numeric($pValue)) { + $pValue = intval($pValue); + } else { + $pValue = strtotime($pValue); + } + } + + $this->modified = $pValue; + return $this; + } + + /** + * Get Title + * + * @return string + */ + public function getTitle() + { + return $this->title; + } + + /** + * Set Title + * + * @param string $pValue + * @return PHPExcel_DocumentProperties + */ + public function setTitle($pValue = '') + { + $this->title = $pValue; + return $this; + } + + /** + * Get Description + * + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * Set Description + * + * @param string $pValue + * @return PHPExcel_DocumentProperties + */ + public function setDescription($pValue = '') + { + $this->description = $pValue; + return $this; + } + + /** + * Get Subject + * + * @return string + */ + public function getSubject() + { + return $this->subject; + } + + /** + * Set Subject + * + * @param string $pValue + * @return PHPExcel_DocumentProperties + */ + public function setSubject($pValue = '') + { + $this->subject = $pValue; + return $this; + } + + /** + * Get Keywords + * + * @return string + */ + public function getKeywords() + { + return $this->keywords; + } + + /** + * Set Keywords + * + * @param string $pValue + * @return PHPExcel_DocumentProperties + */ + public function setKeywords($pValue = '') + { + $this->keywords = $pValue; + return $this; + } + + /** + * Get Category + * + * @return string + */ + public function getCategory() + { + return $this->category; + } + + /** + * Set Category + * + * @param string $pValue + * @return PHPExcel_DocumentProperties + */ + public function setCategory($pValue = '') + { + $this->category = $pValue; + return $this; + } + + /** + * Get Company + * + * @return string + */ + public function getCompany() + { + return $this->company; + } + + /** + * Set Company + * + * @param string $pValue + * @return PHPExcel_DocumentProperties + */ + public function setCompany($pValue = '') + { + $this->company = $pValue; + return $this; + } + + /** + * Get Manager + * + * @return string + */ + public function getManager() + { + return $this->manager; + } + + /** + * Set Manager + * + * @param string $pValue + * @return PHPExcel_DocumentProperties + */ + public function setManager($pValue = '') + { + $this->manager = $pValue; + return $this; + } + + /** + * Get a List of Custom Property Names + * + * @return array of string + */ + public function getCustomProperties() + { + return array_keys($this->customProperties); + } + + /** + * Check if a Custom Property is defined + * + * @param string $propertyName + * @return boolean + */ + public function isCustomPropertySet($propertyName) + { + return isset($this->customProperties[$propertyName]); + } + + /** + * Get a Custom Property Value + * + * @param string $propertyName + * @return string + */ + public function getCustomPropertyValue($propertyName) + { + if (isset($this->customProperties[$propertyName])) { + return $this->customProperties[$propertyName]['value']; + } + + } + + /** + * Get a Custom Property Type + * + * @param string $propertyName + * @return string + */ + public function getCustomPropertyType($propertyName) + { + if (isset($this->customProperties[$propertyName])) { + return $this->customProperties[$propertyName]['type']; + } + + } + + /** + * Set a Custom Property + * + * @param string $propertyName + * @param mixed $propertyValue + * @param string $propertyType + * 'i' : Integer + * 'f' : Floating Point + * 's' : String + * 'd' : Date/Time + * 'b' : Boolean + * @return PHPExcel_DocumentProperties + */ + public function setCustomProperty($propertyName, $propertyValue = '', $propertyType = null) + { + if (($propertyType === null) || (!in_array($propertyType, array(self::PROPERTY_TYPE_INTEGER, + self::PROPERTY_TYPE_FLOAT, + self::PROPERTY_TYPE_STRING, + self::PROPERTY_TYPE_DATE, + self::PROPERTY_TYPE_BOOLEAN)))) { + if ($propertyValue === null) { + $propertyType = self::PROPERTY_TYPE_STRING; + } elseif (is_float($propertyValue)) { + $propertyType = self::PROPERTY_TYPE_FLOAT; + } elseif (is_int($propertyValue)) { + $propertyType = self::PROPERTY_TYPE_INTEGER; + } elseif (is_bool($propertyValue)) { + $propertyType = self::PROPERTY_TYPE_BOOLEAN; + } else { + $propertyType = self::PROPERTY_TYPE_STRING; + } + } + + $this->customProperties[$propertyName] = array( + 'value' => $propertyValue, + 'type' => $propertyType + ); + return $this; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } + + public static function convertProperty($propertyValue, $propertyType) + { + switch ($propertyType) { + case 'empty': // Empty + return ''; + break; + case 'null': // Null + return null; + break; + case 'i1': // 1-Byte Signed Integer + case 'i2': // 2-Byte Signed Integer + case 'i4': // 4-Byte Signed Integer + case 'i8': // 8-Byte Signed Integer + case 'int': // Integer + return (int) $propertyValue; + break; + case 'ui1': // 1-Byte Unsigned Integer + case 'ui2': // 2-Byte Unsigned Integer + case 'ui4': // 4-Byte Unsigned Integer + case 'ui8': // 8-Byte Unsigned Integer + case 'uint': // Unsigned Integer + return abs((int) $propertyValue); + break; + case 'r4': // 4-Byte Real Number + case 'r8': // 8-Byte Real Number + case 'decimal': // Decimal + return (float) $propertyValue; + break; + case 'lpstr': // LPSTR + case 'lpwstr': // LPWSTR + case 'bstr': // Basic String + return $propertyValue; + break; + case 'date': // Date and Time + case 'filetime': // File Time + return strtotime($propertyValue); + break; + case 'bool': // Boolean + return ($propertyValue == 'true') ? true : false; + break; + case 'cy': // Currency + case 'error': // Error Status Code + case 'vector': // Vector + case 'array': // Array + case 'blob': // Binary Blob + case 'oblob': // Binary Blob Object + case 'stream': // Binary Stream + case 'ostream': // Binary Stream Object + case 'storage': // Binary Storage + case 'ostorage': // Binary Storage Object + case 'vstream': // Binary Versioned Stream + case 'clsid': // Class ID + case 'cf': // Clipboard Data + return $propertyValue; + break; + } + return $propertyValue; + } + + public static function convertPropertyType($propertyType) + { + switch ($propertyType) { + case 'i1': // 1-Byte Signed Integer + case 'i2': // 2-Byte Signed Integer + case 'i4': // 4-Byte Signed Integer + case 'i8': // 8-Byte Signed Integer + case 'int': // Integer + case 'ui1': // 1-Byte Unsigned Integer + case 'ui2': // 2-Byte Unsigned Integer + case 'ui4': // 4-Byte Unsigned Integer + case 'ui8': // 8-Byte Unsigned Integer + case 'uint': // Unsigned Integer + return self::PROPERTY_TYPE_INTEGER; + break; + case 'r4': // 4-Byte Real Number + case 'r8': // 8-Byte Real Number + case 'decimal': // Decimal + return self::PROPERTY_TYPE_FLOAT; + break; + case 'empty': // Empty + case 'null': // Null + case 'lpstr': // LPSTR + case 'lpwstr': // LPWSTR + case 'bstr': // Basic String + return self::PROPERTY_TYPE_STRING; + break; + case 'date': // Date and Time + case 'filetime': // File Time + return self::PROPERTY_TYPE_DATE; + break; + case 'bool': // Boolean + return self::PROPERTY_TYPE_BOOLEAN; + break; + case 'cy': // Currency + case 'error': // Error Status Code + case 'vector': // Vector + case 'array': // Array + case 'blob': // Binary Blob + case 'oblob': // Binary Blob Object + case 'stream': // Binary Stream + case 'ostream': // Binary Stream Object + case 'storage': // Binary Storage + case 'ostorage': // Binary Storage Object + case 'vstream': // Binary Versioned Stream + case 'clsid': // Class ID + case 'cf': // Clipboard Data + return self::PROPERTY_TYPE_UNKNOWN; + break; + } + return self::PROPERTY_TYPE_UNKNOWN; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/DocumentSecurity.php b/application/third_party/PHPExcel/PHPExcel/DocumentSecurity.php new file mode 100644 index 0000000..ecea0da --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/DocumentSecurity.php @@ -0,0 +1,222 @@ +lockRevision = false; + $this->lockStructure = false; + $this->lockWindows = false; + $this->revisionsPassword = ''; + $this->workbookPassword = ''; + } + + /** + * Is some sort of document security enabled? + * + * @return boolean + */ + public function isSecurityEnabled() + { + return $this->lockRevision || + $this->lockStructure || + $this->lockWindows; + } + + /** + * Get LockRevision + * + * @return boolean + */ + public function getLockRevision() + { + return $this->lockRevision; + } + + /** + * Set LockRevision + * + * @param boolean $pValue + * @return PHPExcel_DocumentSecurity + */ + public function setLockRevision($pValue = false) + { + $this->lockRevision = $pValue; + return $this; + } + + /** + * Get LockStructure + * + * @return boolean + */ + public function getLockStructure() + { + return $this->lockStructure; + } + + /** + * Set LockStructure + * + * @param boolean $pValue + * @return PHPExcel_DocumentSecurity + */ + public function setLockStructure($pValue = false) + { + $this->lockStructure = $pValue; + return $this; + } + + /** + * Get LockWindows + * + * @return boolean + */ + public function getLockWindows() + { + return $this->lockWindows; + } + + /** + * Set LockWindows + * + * @param boolean $pValue + * @return PHPExcel_DocumentSecurity + */ + public function setLockWindows($pValue = false) + { + $this->lockWindows = $pValue; + return $this; + } + + /** + * Get RevisionsPassword (hashed) + * + * @return string + */ + public function getRevisionsPassword() + { + return $this->revisionsPassword; + } + + /** + * Set RevisionsPassword + * + * @param string $pValue + * @param boolean $pAlreadyHashed If the password has already been hashed, set this to true + * @return PHPExcel_DocumentSecurity + */ + public function setRevisionsPassword($pValue = '', $pAlreadyHashed = false) + { + if (!$pAlreadyHashed) { + $pValue = PHPExcel_Shared_PasswordHasher::hashPassword($pValue); + } + $this->revisionsPassword = $pValue; + return $this; + } + + /** + * Get WorkbookPassword (hashed) + * + * @return string + */ + public function getWorkbookPassword() + { + return $this->workbookPassword; + } + + /** + * Set WorkbookPassword + * + * @param string $pValue + * @param boolean $pAlreadyHashed If the password has already been hashed, set this to true + * @return PHPExcel_DocumentSecurity + */ + public function setWorkbookPassword($pValue = '', $pAlreadyHashed = false) + { + if (!$pAlreadyHashed) { + $pValue = PHPExcel_Shared_PasswordHasher::hashPassword($pValue); + } + $this->workbookPassword = $pValue; + return $this; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Exception.php b/application/third_party/PHPExcel/PHPExcel/Exception.php new file mode 100644 index 0000000..b27750e --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Exception.php @@ -0,0 +1,54 @@ +line = $line; + $e->file = $file; + throw $e; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/HashTable.php b/application/third_party/PHPExcel/PHPExcel/HashTable.php new file mode 100644 index 0000000..c21d18c --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/HashTable.php @@ -0,0 +1,204 @@ +addFromSource($pSource); + } + } + + /** + * Add HashTable items from source + * + * @param PHPExcel_IComparable[] $pSource Source array to create HashTable from + * @throws PHPExcel_Exception + */ + public function addFromSource($pSource = null) + { + // Check if an array was passed + if ($pSource == null) { + return; + } elseif (!is_array($pSource)) { + throw new PHPExcel_Exception('Invalid array parameter passed.'); + } + + foreach ($pSource as $item) { + $this->add($item); + } + } + + /** + * Add HashTable item + * + * @param PHPExcel_IComparable $pSource Item to add + * @throws PHPExcel_Exception + */ + public function add(PHPExcel_IComparable $pSource = null) + { + $hash = $pSource->getHashCode(); + if (!isset($this->items[$hash])) { + $this->items[$hash] = $pSource; + $this->keyMap[count($this->items) - 1] = $hash; + } + } + + /** + * Remove HashTable item + * + * @param PHPExcel_IComparable $pSource Item to remove + * @throws PHPExcel_Exception + */ + public function remove(PHPExcel_IComparable $pSource = null) + { + $hash = $pSource->getHashCode(); + if (isset($this->items[$hash])) { + unset($this->items[$hash]); + + $deleteKey = -1; + foreach ($this->keyMap as $key => $value) { + if ($deleteKey >= 0) { + $this->keyMap[$key - 1] = $value; + } + + if ($value == $hash) { + $deleteKey = $key; + } + } + unset($this->keyMap[count($this->keyMap) - 1]); + } + } + + /** + * Clear HashTable + * + */ + public function clear() + { + $this->items = array(); + $this->keyMap = array(); + } + + /** + * Count + * + * @return int + */ + public function count() + { + return count($this->items); + } + + /** + * Get index for hash code + * + * @param string $pHashCode + * @return int Index + */ + public function getIndexForHashCode($pHashCode = '') + { + return array_search($pHashCode, $this->keyMap); + } + + /** + * Get by index + * + * @param int $pIndex + * @return PHPExcel_IComparable + * + */ + public function getByIndex($pIndex = 0) + { + if (isset($this->keyMap[$pIndex])) { + return $this->getByHashCode($this->keyMap[$pIndex]); + } + + return null; + } + + /** + * Get by hashcode + * + * @param string $pHashCode + * @return PHPExcel_IComparable + * + */ + public function getByHashCode($pHashCode = '') + { + if (isset($this->items[$pHashCode])) { + return $this->items[$pHashCode]; + } + + return null; + } + + /** + * HashTable to array + * + * @return PHPExcel_IComparable[] + */ + public function toArray() + { + return $this->items; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Helper/HTML.php b/application/third_party/PHPExcel/PHPExcel/Helper/HTML.php new file mode 100644 index 0000000..a78f11c --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Helper/HTML.php @@ -0,0 +1,808 @@ + 'f0f8ff', + 'antiquewhite' => 'faebd7', + 'antiquewhite1' => 'ffefdb', + 'antiquewhite2' => 'eedfcc', + 'antiquewhite3' => 'cdc0b0', + 'antiquewhite4' => '8b8378', + 'aqua' => '00ffff', + 'aquamarine1' => '7fffd4', + 'aquamarine2' => '76eec6', + 'aquamarine4' => '458b74', + 'azure1' => 'f0ffff', + 'azure2' => 'e0eeee', + 'azure3' => 'c1cdcd', + 'azure4' => '838b8b', + 'beige' => 'f5f5dc', + 'bisque1' => 'ffe4c4', + 'bisque2' => 'eed5b7', + 'bisque3' => 'cdb79e', + 'bisque4' => '8b7d6b', + 'black' => '000000', + 'blanchedalmond' => 'ffebcd', + 'blue' => '0000ff', + 'blue1' => '0000ff', + 'blue2' => '0000ee', + 'blue4' => '00008b', + 'blueviolet' => '8a2be2', + 'brown' => 'a52a2a', + 'brown1' => 'ff4040', + 'brown2' => 'ee3b3b', + 'brown3' => 'cd3333', + 'brown4' => '8b2323', + 'burlywood' => 'deb887', + 'burlywood1' => 'ffd39b', + 'burlywood2' => 'eec591', + 'burlywood3' => 'cdaa7d', + 'burlywood4' => '8b7355', + 'cadetblue' => '5f9ea0', + 'cadetblue1' => '98f5ff', + 'cadetblue2' => '8ee5ee', + 'cadetblue3' => '7ac5cd', + 'cadetblue4' => '53868b', + 'chartreuse1' => '7fff00', + 'chartreuse2' => '76ee00', + 'chartreuse3' => '66cd00', + 'chartreuse4' => '458b00', + 'chocolate' => 'd2691e', + 'chocolate1' => 'ff7f24', + 'chocolate2' => 'ee7621', + 'chocolate3' => 'cd661d', + 'coral' => 'ff7f50', + 'coral1' => 'ff7256', + 'coral2' => 'ee6a50', + 'coral3' => 'cd5b45', + 'coral4' => '8b3e2f', + 'cornflowerblue' => '6495ed', + 'cornsilk1' => 'fff8dc', + 'cornsilk2' => 'eee8cd', + 'cornsilk3' => 'cdc8b1', + 'cornsilk4' => '8b8878', + 'cyan1' => '00ffff', + 'cyan2' => '00eeee', + 'cyan3' => '00cdcd', + 'cyan4' => '008b8b', + 'darkgoldenrod' => 'b8860b', + 'darkgoldenrod1' => 'ffb90f', + 'darkgoldenrod2' => 'eead0e', + 'darkgoldenrod3' => 'cd950c', + 'darkgoldenrod4' => '8b6508', + 'darkgreen' => '006400', + 'darkkhaki' => 'bdb76b', + 'darkolivegreen' => '556b2f', + 'darkolivegreen1' => 'caff70', + 'darkolivegreen2' => 'bcee68', + 'darkolivegreen3' => 'a2cd5a', + 'darkolivegreen4' => '6e8b3d', + 'darkorange' => 'ff8c00', + 'darkorange1' => 'ff7f00', + 'darkorange2' => 'ee7600', + 'darkorange3' => 'cd6600', + 'darkorange4' => '8b4500', + 'darkorchid' => '9932cc', + 'darkorchid1' => 'bf3eff', + 'darkorchid2' => 'b23aee', + 'darkorchid3' => '9a32cd', + 'darkorchid4' => '68228b', + 'darksalmon' => 'e9967a', + 'darkseagreen' => '8fbc8f', + 'darkseagreen1' => 'c1ffc1', + 'darkseagreen2' => 'b4eeb4', + 'darkseagreen3' => '9bcd9b', + 'darkseagreen4' => '698b69', + 'darkslateblue' => '483d8b', + 'darkslategray' => '2f4f4f', + 'darkslategray1' => '97ffff', + 'darkslategray2' => '8deeee', + 'darkslategray3' => '79cdcd', + 'darkslategray4' => '528b8b', + 'darkturquoise' => '00ced1', + 'darkviolet' => '9400d3', + 'deeppink1' => 'ff1493', + 'deeppink2' => 'ee1289', + 'deeppink3' => 'cd1076', + 'deeppink4' => '8b0a50', + 'deepskyblue1' => '00bfff', + 'deepskyblue2' => '00b2ee', + 'deepskyblue3' => '009acd', + 'deepskyblue4' => '00688b', + 'dimgray' => '696969', + 'dodgerblue1' => '1e90ff', + 'dodgerblue2' => '1c86ee', + 'dodgerblue3' => '1874cd', + 'dodgerblue4' => '104e8b', + 'firebrick' => 'b22222', + 'firebrick1' => 'ff3030', + 'firebrick2' => 'ee2c2c', + 'firebrick3' => 'cd2626', + 'firebrick4' => '8b1a1a', + 'floralwhite' => 'fffaf0', + 'forestgreen' => '228b22', + 'fuchsia' => 'ff00ff', + 'gainsboro' => 'dcdcdc', + 'ghostwhite' => 'f8f8ff', + 'gold1' => 'ffd700', + 'gold2' => 'eec900', + 'gold3' => 'cdad00', + 'gold4' => '8b7500', + 'goldenrod' => 'daa520', + 'goldenrod1' => 'ffc125', + 'goldenrod2' => 'eeb422', + 'goldenrod3' => 'cd9b1d', + 'goldenrod4' => '8b6914', + 'gray' => 'bebebe', + 'gray1' => '030303', + 'gray10' => '1a1a1a', + 'gray11' => '1c1c1c', + 'gray12' => '1f1f1f', + 'gray13' => '212121', + 'gray14' => '242424', + 'gray15' => '262626', + 'gray16' => '292929', + 'gray17' => '2b2b2b', + 'gray18' => '2e2e2e', + 'gray19' => '303030', + 'gray2' => '050505', + 'gray20' => '333333', + 'gray21' => '363636', + 'gray22' => '383838', + 'gray23' => '3b3b3b', + 'gray24' => '3d3d3d', + 'gray25' => '404040', + 'gray26' => '424242', + 'gray27' => '454545', + 'gray28' => '474747', + 'gray29' => '4a4a4a', + 'gray3' => '080808', + 'gray30' => '4d4d4d', + 'gray31' => '4f4f4f', + 'gray32' => '525252', + 'gray33' => '545454', + 'gray34' => '575757', + 'gray35' => '595959', + 'gray36' => '5c5c5c', + 'gray37' => '5e5e5e', + 'gray38' => '616161', + 'gray39' => '636363', + 'gray4' => '0a0a0a', + 'gray40' => '666666', + 'gray41' => '696969', + 'gray42' => '6b6b6b', + 'gray43' => '6e6e6e', + 'gray44' => '707070', + 'gray45' => '737373', + 'gray46' => '757575', + 'gray47' => '787878', + 'gray48' => '7a7a7a', + 'gray49' => '7d7d7d', + 'gray5' => '0d0d0d', + 'gray50' => '7f7f7f', + 'gray51' => '828282', + 'gray52' => '858585', + 'gray53' => '878787', + 'gray54' => '8a8a8a', + 'gray55' => '8c8c8c', + 'gray56' => '8f8f8f', + 'gray57' => '919191', + 'gray58' => '949494', + 'gray59' => '969696', + 'gray6' => '0f0f0f', + 'gray60' => '999999', + 'gray61' => '9c9c9c', + 'gray62' => '9e9e9e', + 'gray63' => 'a1a1a1', + 'gray64' => 'a3a3a3', + 'gray65' => 'a6a6a6', + 'gray66' => 'a8a8a8', + 'gray67' => 'ababab', + 'gray68' => 'adadad', + 'gray69' => 'b0b0b0', + 'gray7' => '121212', + 'gray70' => 'b3b3b3', + 'gray71' => 'b5b5b5', + 'gray72' => 'b8b8b8', + 'gray73' => 'bababa', + 'gray74' => 'bdbdbd', + 'gray75' => 'bfbfbf', + 'gray76' => 'c2c2c2', + 'gray77' => 'c4c4c4', + 'gray78' => 'c7c7c7', + 'gray79' => 'c9c9c9', + 'gray8' => '141414', + 'gray80' => 'cccccc', + 'gray81' => 'cfcfcf', + 'gray82' => 'd1d1d1', + 'gray83' => 'd4d4d4', + 'gray84' => 'd6d6d6', + 'gray85' => 'd9d9d9', + 'gray86' => 'dbdbdb', + 'gray87' => 'dedede', + 'gray88' => 'e0e0e0', + 'gray89' => 'e3e3e3', + 'gray9' => '171717', + 'gray90' => 'e5e5e5', + 'gray91' => 'e8e8e8', + 'gray92' => 'ebebeb', + 'gray93' => 'ededed', + 'gray94' => 'f0f0f0', + 'gray95' => 'f2f2f2', + 'gray97' => 'f7f7f7', + 'gray98' => 'fafafa', + 'gray99' => 'fcfcfc', + 'green' => '00ff00', + 'green1' => '00ff00', + 'green2' => '00ee00', + 'green3' => '00cd00', + 'green4' => '008b00', + 'greenyellow' => 'adff2f', + 'honeydew1' => 'f0fff0', + 'honeydew2' => 'e0eee0', + 'honeydew3' => 'c1cdc1', + 'honeydew4' => '838b83', + 'hotpink' => 'ff69b4', + 'hotpink1' => 'ff6eb4', + 'hotpink2' => 'ee6aa7', + 'hotpink3' => 'cd6090', + 'hotpink4' => '8b3a62', + 'indianred' => 'cd5c5c', + 'indianred1' => 'ff6a6a', + 'indianred2' => 'ee6363', + 'indianred3' => 'cd5555', + 'indianred4' => '8b3a3a', + 'ivory1' => 'fffff0', + 'ivory2' => 'eeeee0', + 'ivory3' => 'cdcdc1', + 'ivory4' => '8b8b83', + 'khaki' => 'f0e68c', + 'khaki1' => 'fff68f', + 'khaki2' => 'eee685', + 'khaki3' => 'cdc673', + 'khaki4' => '8b864e', + 'lavender' => 'e6e6fa', + 'lavenderblush1' => 'fff0f5', + 'lavenderblush2' => 'eee0e5', + 'lavenderblush3' => 'cdc1c5', + 'lavenderblush4' => '8b8386', + 'lawngreen' => '7cfc00', + 'lemonchiffon1' => 'fffacd', + 'lemonchiffon2' => 'eee9bf', + 'lemonchiffon3' => 'cdc9a5', + 'lemonchiffon4' => '8b8970', + 'light' => 'eedd82', + 'lightblue' => 'add8e6', + 'lightblue1' => 'bfefff', + 'lightblue2' => 'b2dfee', + 'lightblue3' => '9ac0cd', + 'lightblue4' => '68838b', + 'lightcoral' => 'f08080', + 'lightcyan1' => 'e0ffff', + 'lightcyan2' => 'd1eeee', + 'lightcyan3' => 'b4cdcd', + 'lightcyan4' => '7a8b8b', + 'lightgoldenrod1' => 'ffec8b', + 'lightgoldenrod2' => 'eedc82', + 'lightgoldenrod3' => 'cdbe70', + 'lightgoldenrod4' => '8b814c', + 'lightgoldenrodyellow' => 'fafad2', + 'lightgray' => 'd3d3d3', + 'lightpink' => 'ffb6c1', + 'lightpink1' => 'ffaeb9', + 'lightpink2' => 'eea2ad', + 'lightpink3' => 'cd8c95', + 'lightpink4' => '8b5f65', + 'lightsalmon1' => 'ffa07a', + 'lightsalmon2' => 'ee9572', + 'lightsalmon3' => 'cd8162', + 'lightsalmon4' => '8b5742', + 'lightseagreen' => '20b2aa', + 'lightskyblue' => '87cefa', + 'lightskyblue1' => 'b0e2ff', + 'lightskyblue2' => 'a4d3ee', + 'lightskyblue3' => '8db6cd', + 'lightskyblue4' => '607b8b', + 'lightslateblue' => '8470ff', + 'lightslategray' => '778899', + 'lightsteelblue' => 'b0c4de', + 'lightsteelblue1' => 'cae1ff', + 'lightsteelblue2' => 'bcd2ee', + 'lightsteelblue3' => 'a2b5cd', + 'lightsteelblue4' => '6e7b8b', + 'lightyellow1' => 'ffffe0', + 'lightyellow2' => 'eeeed1', + 'lightyellow3' => 'cdcdb4', + 'lightyellow4' => '8b8b7a', + 'lime' => '00ff00', + 'limegreen' => '32cd32', + 'linen' => 'faf0e6', + 'magenta' => 'ff00ff', + 'magenta2' => 'ee00ee', + 'magenta3' => 'cd00cd', + 'magenta4' => '8b008b', + 'maroon' => 'b03060', + 'maroon1' => 'ff34b3', + 'maroon2' => 'ee30a7', + 'maroon3' => 'cd2990', + 'maroon4' => '8b1c62', + 'medium' => '66cdaa', + 'mediumaquamarine' => '66cdaa', + 'mediumblue' => '0000cd', + 'mediumorchid' => 'ba55d3', + 'mediumorchid1' => 'e066ff', + 'mediumorchid2' => 'd15fee', + 'mediumorchid3' => 'b452cd', + 'mediumorchid4' => '7a378b', + 'mediumpurple' => '9370db', + 'mediumpurple1' => 'ab82ff', + 'mediumpurple2' => '9f79ee', + 'mediumpurple3' => '8968cd', + 'mediumpurple4' => '5d478b', + 'mediumseagreen' => '3cb371', + 'mediumslateblue' => '7b68ee', + 'mediumspringgreen' => '00fa9a', + 'mediumturquoise' => '48d1cc', + 'mediumvioletred' => 'c71585', + 'midnightblue' => '191970', + 'mintcream' => 'f5fffa', + 'mistyrose1' => 'ffe4e1', + 'mistyrose2' => 'eed5d2', + 'mistyrose3' => 'cdb7b5', + 'mistyrose4' => '8b7d7b', + 'moccasin' => 'ffe4b5', + 'navajowhite1' => 'ffdead', + 'navajowhite2' => 'eecfa1', + 'navajowhite3' => 'cdb38b', + 'navajowhite4' => '8b795e', + 'navy' => '000080', + 'navyblue' => '000080', + 'oldlace' => 'fdf5e6', + 'olive' => '808000', + 'olivedrab' => '6b8e23', + 'olivedrab1' => 'c0ff3e', + 'olivedrab2' => 'b3ee3a', + 'olivedrab4' => '698b22', + 'orange' => 'ffa500', + 'orange1' => 'ffa500', + 'orange2' => 'ee9a00', + 'orange3' => 'cd8500', + 'orange4' => '8b5a00', + 'orangered1' => 'ff4500', + 'orangered2' => 'ee4000', + 'orangered3' => 'cd3700', + 'orangered4' => '8b2500', + 'orchid' => 'da70d6', + 'orchid1' => 'ff83fa', + 'orchid2' => 'ee7ae9', + 'orchid3' => 'cd69c9', + 'orchid4' => '8b4789', + 'pale' => 'db7093', + 'palegoldenrod' => 'eee8aa', + 'palegreen' => '98fb98', + 'palegreen1' => '9aff9a', + 'palegreen2' => '90ee90', + 'palegreen3' => '7ccd7c', + 'palegreen4' => '548b54', + 'paleturquoise' => 'afeeee', + 'paleturquoise1' => 'bbffff', + 'paleturquoise2' => 'aeeeee', + 'paleturquoise3' => '96cdcd', + 'paleturquoise4' => '668b8b', + 'palevioletred' => 'db7093', + 'palevioletred1' => 'ff82ab', + 'palevioletred2' => 'ee799f', + 'palevioletred3' => 'cd6889', + 'palevioletred4' => '8b475d', + 'papayawhip' => 'ffefd5', + 'peachpuff1' => 'ffdab9', + 'peachpuff2' => 'eecbad', + 'peachpuff3' => 'cdaf95', + 'peachpuff4' => '8b7765', + 'pink' => 'ffc0cb', + 'pink1' => 'ffb5c5', + 'pink2' => 'eea9b8', + 'pink3' => 'cd919e', + 'pink4' => '8b636c', + 'plum' => 'dda0dd', + 'plum1' => 'ffbbff', + 'plum2' => 'eeaeee', + 'plum3' => 'cd96cd', + 'plum4' => '8b668b', + 'powderblue' => 'b0e0e6', + 'purple' => 'a020f0', + 'rebeccapurple' => '663399', + 'purple1' => '9b30ff', + 'purple2' => '912cee', + 'purple3' => '7d26cd', + 'purple4' => '551a8b', + 'red' => 'ff0000', + 'red1' => 'ff0000', + 'red2' => 'ee0000', + 'red3' => 'cd0000', + 'red4' => '8b0000', + 'rosybrown' => 'bc8f8f', + 'rosybrown1' => 'ffc1c1', + 'rosybrown2' => 'eeb4b4', + 'rosybrown3' => 'cd9b9b', + 'rosybrown4' => '8b6969', + 'royalblue' => '4169e1', + 'royalblue1' => '4876ff', + 'royalblue2' => '436eee', + 'royalblue3' => '3a5fcd', + 'royalblue4' => '27408b', + 'saddlebrown' => '8b4513', + 'salmon' => 'fa8072', + 'salmon1' => 'ff8c69', + 'salmon2' => 'ee8262', + 'salmon3' => 'cd7054', + 'salmon4' => '8b4c39', + 'sandybrown' => 'f4a460', + 'seagreen1' => '54ff9f', + 'seagreen2' => '4eee94', + 'seagreen3' => '43cd80', + 'seagreen4' => '2e8b57', + 'seashell1' => 'fff5ee', + 'seashell2' => 'eee5de', + 'seashell3' => 'cdc5bf', + 'seashell4' => '8b8682', + 'sienna' => 'a0522d', + 'sienna1' => 'ff8247', + 'sienna2' => 'ee7942', + 'sienna3' => 'cd6839', + 'sienna4' => '8b4726', + 'silver' => 'c0c0c0', + 'skyblue' => '87ceeb', + 'skyblue1' => '87ceff', + 'skyblue2' => '7ec0ee', + 'skyblue3' => '6ca6cd', + 'skyblue4' => '4a708b', + 'slateblue' => '6a5acd', + 'slateblue1' => '836fff', + 'slateblue2' => '7a67ee', + 'slateblue3' => '6959cd', + 'slateblue4' => '473c8b', + 'slategray' => '708090', + 'slategray1' => 'c6e2ff', + 'slategray2' => 'b9d3ee', + 'slategray3' => '9fb6cd', + 'slategray4' => '6c7b8b', + 'snow1' => 'fffafa', + 'snow2' => 'eee9e9', + 'snow3' => 'cdc9c9', + 'snow4' => '8b8989', + 'springgreen1' => '00ff7f', + 'springgreen2' => '00ee76', + 'springgreen3' => '00cd66', + 'springgreen4' => '008b45', + 'steelblue' => '4682b4', + 'steelblue1' => '63b8ff', + 'steelblue2' => '5cacee', + 'steelblue3' => '4f94cd', + 'steelblue4' => '36648b', + 'tan' => 'd2b48c', + 'tan1' => 'ffa54f', + 'tan2' => 'ee9a49', + 'tan3' => 'cd853f', + 'tan4' => '8b5a2b', + 'teal' => '008080', + 'thistle' => 'd8bfd8', + 'thistle1' => 'ffe1ff', + 'thistle2' => 'eed2ee', + 'thistle3' => 'cdb5cd', + 'thistle4' => '8b7b8b', + 'tomato1' => 'ff6347', + 'tomato2' => 'ee5c42', + 'tomato3' => 'cd4f39', + 'tomato4' => '8b3626', + 'turquoise' => '40e0d0', + 'turquoise1' => '00f5ff', + 'turquoise2' => '00e5ee', + 'turquoise3' => '00c5cd', + 'turquoise4' => '00868b', + 'violet' => 'ee82ee', + 'violetred' => 'd02090', + 'violetred1' => 'ff3e96', + 'violetred2' => 'ee3a8c', + 'violetred3' => 'cd3278', + 'violetred4' => '8b2252', + 'wheat' => 'f5deb3', + 'wheat1' => 'ffe7ba', + 'wheat2' => 'eed8ae', + 'wheat3' => 'cdba96', + 'wheat4' => '8b7e66', + 'white' => 'ffffff', + 'whitesmoke' => 'f5f5f5', + 'yellow' => 'ffff00', + 'yellow1' => 'ffff00', + 'yellow2' => 'eeee00', + 'yellow3' => 'cdcd00', + 'yellow4' => '8b8b00', + 'yellowgreen' => '9acd32', + ); + + protected $face; + protected $size; + protected $color; + + protected $bold = false; + protected $italic = false; + protected $underline = false; + protected $superscript = false; + protected $subscript = false; + protected $strikethrough = false; + + protected $startTagCallbacks = array( + 'font' => 'startFontTag', + 'b' => 'startBoldTag', + 'strong' => 'startBoldTag', + 'i' => 'startItalicTag', + 'em' => 'startItalicTag', + 'u' => 'startUnderlineTag', + 'ins' => 'startUnderlineTag', + 'del' => 'startStrikethruTag', + 'sup' => 'startSuperscriptTag', + 'sub' => 'startSubscriptTag', + ); + + protected $endTagCallbacks = array( + 'font' => 'endFontTag', + 'b' => 'endBoldTag', + 'strong' => 'endBoldTag', + 'i' => 'endItalicTag', + 'em' => 'endItalicTag', + 'u' => 'endUnderlineTag', + 'ins' => 'endUnderlineTag', + 'del' => 'endStrikethruTag', + 'sup' => 'endSuperscriptTag', + 'sub' => 'endSubscriptTag', + 'br' => 'breakTag', + 'p' => 'breakTag', + 'h1' => 'breakTag', + 'h2' => 'breakTag', + 'h3' => 'breakTag', + 'h4' => 'breakTag', + 'h5' => 'breakTag', + 'h6' => 'breakTag', + ); + + protected $stack = array(); + + protected $stringData = ''; + + protected $richTextObject; + + protected function initialise() + { + $this->face = $this->size = $this->color = null; + $this->bold = $this->italic = $this->underline = $this->superscript = $this->subscript = $this->strikethrough = false; + + $this->stack = array(); + + $this->stringData = ''; + } + + public function toRichTextObject($html) + { + $this->initialise(); + + // Create a new DOM object + $dom = new \DOMDocument; + // Load the HTML file into the DOM object + // Note the use of error suppression, because typically this will be an html fragment, so not fully valid markup + $loaded = @$dom->loadHTML($html); + + // Discard excess white space + $dom->preserveWhiteSpace = false; + + $this->richTextObject = new PHPExcel_RichText();; + $this->parseElements($dom); + + // Clean any further spurious whitespace + $this->cleanWhitespace(); + + return $this->richTextObject; + } + + protected function cleanWhitespace() + { + foreach ($this->richTextObject->getRichTextElements() as $key => $element) { + $text = $element->getText(); + // Trim any leading spaces on the first run + if ($key == 0) { + $text = ltrim($text); + } + // Trim any spaces immediately after a line break + $text = preg_replace('/\n */mu', "\n", $text); + $element->setText($text); + } + } + + protected function buildTextRun() + { + $text = $this->stringData; + if (trim($text) === '') { + return; + } + + $richtextRun = $this->richTextObject->createTextRun($this->stringData); + if ($this->face) { + $richtextRun->getFont()->setName($this->face); + } + if ($this->size) { + $richtextRun->getFont()->setSize($this->size); + } + if ($this->color) { + $richtextRun->getFont()->setColor(new PHPExcel_Style_Color('ff' . $this->color)); + } + if ($this->bold) { + $richtextRun->getFont()->setBold(true); + } + if ($this->italic) { + $richtextRun->getFont()->setItalic(true); + } + if ($this->underline) { + $richtextRun->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE); + } + if ($this->superscript) { + $richtextRun->getFont()->setSuperScript(true); + } + if ($this->subscript) { + $richtextRun->getFont()->setSubScript(true); + } + if ($this->strikethrough) { + $richtextRun->getFont()->setStrikethrough(true); + } + $this->stringData = ''; + } + + protected function rgbToColour($rgb) + { + preg_match_all('/\d+/', $rgb, $values); + foreach ($values[0] as &$value) { + $value = str_pad(dechex($value), 2, '0', STR_PAD_LEFT); + } + return implode($values[0]); + } + + protected function colourNameLookup($rgb) + { + return self::$colourMap[$rgb]; + } + + protected function startFontTag($tag) + { + foreach ($tag->attributes as $attribute) { + $attributeName = strtolower($attribute->name); + $attributeValue = $attribute->value; + + if ($attributeName == 'color') { + if (preg_match('/rgb\s*\(/', $attributeValue)) { + $this->$attributeName = $this->rgbToColour($attributeValue); + } elseif (strpos(trim($attributeValue), '#') === 0) { + $this->$attributeName = ltrim($attributeValue, '#'); + } else { + $this->$attributeName = $this->colourNameLookup($attributeValue); + } + } else { + $this->$attributeName = $attributeValue; + } + } + } + + protected function endFontTag() + { + $this->face = $this->size = $this->color = null; + } + + protected function startBoldTag() + { + $this->bold = true; + } + + protected function endBoldTag() + { + $this->bold = false; + } + + protected function startItalicTag() + { + $this->italic = true; + } + + protected function endItalicTag() + { + $this->italic = false; + } + + protected function startUnderlineTag() + { + $this->underline = true; + } + + protected function endUnderlineTag() + { + $this->underline = false; + } + + protected function startSubscriptTag() + { + $this->subscript = true; + } + + protected function endSubscriptTag() + { + $this->subscript = false; + } + + protected function startSuperscriptTag() + { + $this->superscript = true; + } + + protected function endSuperscriptTag() + { + $this->superscript = false; + } + + protected function startStrikethruTag() + { + $this->strikethrough = true; + } + + protected function endStrikethruTag() + { + $this->strikethrough = false; + } + + protected function breakTag() + { + $this->stringData .= "\n"; + } + + protected function parseTextNode(DOMText $textNode) + { + $domText = preg_replace( + '/\s+/u', + ' ', + str_replace(array("\r", "\n"), ' ', $textNode->nodeValue) + ); + $this->stringData .= $domText; + $this->buildTextRun(); + } + + protected function handleCallback($element, $callbackTag, $callbacks) + { + if (isset($callbacks[$callbackTag])) { + $elementHandler = $callbacks[$callbackTag]; + if (method_exists($this, $elementHandler)) { + call_user_func(array($this, $elementHandler), $element); + } + } + } + + protected function parseElementNode(DOMElement $element) + { + $callbackTag = strtolower($element->nodeName); + $this->stack[] = $callbackTag; + + $this->handleCallback($element, $callbackTag, $this->startTagCallbacks); + + $this->parseElements($element); + array_pop($this->stack); + + $this->handleCallback($element, $callbackTag, $this->endTagCallbacks); + } + + protected function parseElements(DOMNode $element) + { + foreach ($element->childNodes as $child) { + if ($child instanceof DOMText) { + $this->parseTextNode($child); + } elseif ($child instanceof DOMElement) { + $this->parseElementNode($child); + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/IComparable.php b/application/third_party/PHPExcel/PHPExcel/IComparable.php new file mode 100644 index 0000000..6dc36a9 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/IComparable.php @@ -0,0 +1,34 @@ + 'IWriter', 'path' => 'PHPExcel/Writer/{0}.php', 'class' => 'PHPExcel_Writer_{0}' ), + array( 'type' => 'IReader', 'path' => 'PHPExcel/Reader/{0}.php', 'class' => 'PHPExcel_Reader_{0}' ) + ); + + /** + * Autoresolve classes + * + * @var array + * @access private + * @static + */ + private static $autoResolveClasses = array( + 'Excel2007', + 'Excel5', + 'Excel2003XML', + 'OOCalc', + 'SYLK', + 'Gnumeric', + 'HTML', + 'CSV', + ); + + /** + * Private constructor for PHPExcel_IOFactory + */ + private function __construct() + { + } + + /** + * Get search locations + * + * @static + * @access public + * @return array + */ + public static function getSearchLocations() + { + return self::$searchLocations; + } + + /** + * Set search locations + * + * @static + * @access public + * @param array $value + * @throws PHPExcel_Reader_Exception + */ + public static function setSearchLocations($value) + { + if (is_array($value)) { + self::$searchLocations = $value; + } else { + throw new PHPExcel_Reader_Exception('Invalid parameter passed.'); + } + } + + /** + * Add search location + * + * @static + * @access public + * @param string $type Example: IWriter + * @param string $location Example: PHPExcel/Writer/{0}.php + * @param string $classname Example: PHPExcel_Writer_{0} + */ + public static function addSearchLocation($type = '', $location = '', $classname = '') + { + self::$searchLocations[] = array( 'type' => $type, 'path' => $location, 'class' => $classname ); + } + + /** + * Create PHPExcel_Writer_IWriter + * + * @static + * @access public + * @param PHPExcel $phpExcel + * @param string $writerType Example: Excel2007 + * @return PHPExcel_Writer_IWriter + * @throws PHPExcel_Reader_Exception + */ + public static function createWriter(PHPExcel $phpExcel, $writerType = '') + { + // Search type + $searchType = 'IWriter'; + + // Include class + foreach (self::$searchLocations as $searchLocation) { + if ($searchLocation['type'] == $searchType) { + $className = str_replace('{0}', $writerType, $searchLocation['class']); + + $instance = new $className($phpExcel); + if ($instance !== null) { + return $instance; + } + } + } + + // Nothing found... + throw new PHPExcel_Reader_Exception("No $searchType found for type $writerType"); + } + + /** + * Create PHPExcel_Reader_IReader + * + * @static + * @access public + * @param string $readerType Example: Excel2007 + * @return PHPExcel_Reader_IReader + * @throws PHPExcel_Reader_Exception + */ + public static function createReader($readerType = '') + { + // Search type + $searchType = 'IReader'; + + // Include class + foreach (self::$searchLocations as $searchLocation) { + if ($searchLocation['type'] == $searchType) { + $className = str_replace('{0}', $readerType, $searchLocation['class']); + + $instance = new $className(); + if ($instance !== null) { + return $instance; + } + } + } + + // Nothing found... + throw new PHPExcel_Reader_Exception("No $searchType found for type $readerType"); + } + + /** + * Loads PHPExcel from file using automatic PHPExcel_Reader_IReader resolution + * + * @static + * @access public + * @param string $pFilename The name of the spreadsheet file + * @return PHPExcel + * @throws PHPExcel_Reader_Exception + */ + public static function load($pFilename) + { + $reader = self::createReaderForFile($pFilename); + return $reader->load($pFilename); + } + + /** + * Identify file type using automatic PHPExcel_Reader_IReader resolution + * + * @static + * @access public + * @param string $pFilename The name of the spreadsheet file to identify + * @return string + * @throws PHPExcel_Reader_Exception + */ + public static function identify($pFilename) + { + $reader = self::createReaderForFile($pFilename); + $className = get_class($reader); + $classType = explode('_', $className); + unset($reader); + return array_pop($classType); + } + + /** + * Create PHPExcel_Reader_IReader for file using automatic PHPExcel_Reader_IReader resolution + * + * @static + * @access public + * @param string $pFilename The name of the spreadsheet file + * @return PHPExcel_Reader_IReader + * @throws PHPExcel_Reader_Exception + */ + public static function createReaderForFile($pFilename) + { + // First, lucky guess by inspecting file extension + $pathinfo = pathinfo($pFilename); + + $extensionType = null; + if (isset($pathinfo['extension'])) { + switch (strtolower($pathinfo['extension'])) { + case 'xlsx': // Excel (OfficeOpenXML) Spreadsheet + case 'xlsm': // Excel (OfficeOpenXML) Macro Spreadsheet (macros will be discarded) + case 'xltx': // Excel (OfficeOpenXML) Template + case 'xltm': // Excel (OfficeOpenXML) Macro Template (macros will be discarded) + $extensionType = 'Excel2007'; + break; + case 'xls': // Excel (BIFF) Spreadsheet + case 'xlt': // Excel (BIFF) Template + $extensionType = 'Excel5'; + break; + case 'ods': // Open/Libre Offic Calc + case 'ots': // Open/Libre Offic Calc Template + $extensionType = 'OOCalc'; + break; + case 'slk': + $extensionType = 'SYLK'; + break; + case 'xml': // Excel 2003 SpreadSheetML + $extensionType = 'Excel2003XML'; + break; + case 'gnumeric': + $extensionType = 'Gnumeric'; + break; + case 'htm': + case 'html': + $extensionType = 'HTML'; + break; + case 'csv': + // Do nothing + // We must not try to use CSV reader since it loads + // all files including Excel files etc. + break; + default: + break; + } + + if ($extensionType !== null) { + $reader = self::createReader($extensionType); + // Let's see if we are lucky + if (isset($reader) && $reader->canRead($pFilename)) { + return $reader; + } + } + } + + // If we reach here then "lucky guess" didn't give any result + // Try walking through all the options in self::$autoResolveClasses + foreach (self::$autoResolveClasses as $autoResolveClass) { + // Ignore our original guess, we know that won't work + if ($autoResolveClass !== $extensionType) { + $reader = self::createReader($autoResolveClass); + if ($reader->canRead($pFilename)) { + return $reader; + } + } + } + + throw new PHPExcel_Reader_Exception('Unable to identify a reader for this file'); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/NamedRange.php b/application/third_party/PHPExcel/PHPExcel/NamedRange.php new file mode 100644 index 0000000..2848db8 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/NamedRange.php @@ -0,0 +1,249 @@ +worksheet) + * + * @var bool + */ + private $localOnly; + + /** + * Scope + * + * @var PHPExcel_Worksheet + */ + private $scope; + + /** + * Create a new NamedRange + * + * @param string $pName + * @param PHPExcel_Worksheet $pWorksheet + * @param string $pRange + * @param bool $pLocalOnly + * @param PHPExcel_Worksheet|null $pScope Scope. Only applies when $pLocalOnly = true. Null for global scope. + * @throws PHPExcel_Exception + */ + public function __construct($pName = null, PHPExcel_Worksheet $pWorksheet, $pRange = 'A1', $pLocalOnly = false, $pScope = null) + { + // Validate data + if (($pName === null) || ($pWorksheet === null) || ($pRange === null)) { + throw new PHPExcel_Exception('Parameters can not be null.'); + } + + // Set local members + $this->name = $pName; + $this->worksheet = $pWorksheet; + $this->range = $pRange; + $this->localOnly = $pLocalOnly; + $this->scope = ($pLocalOnly == true) ? (($pScope == null) ? $pWorksheet : $pScope) : null; + } + + /** + * Get name + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Set name + * + * @param string $value + * @return PHPExcel_NamedRange + */ + public function setName($value = null) + { + if ($value !== null) { + // Old title + $oldTitle = $this->name; + + // Re-attach + if ($this->worksheet !== null) { + $this->worksheet->getParent()->removeNamedRange($this->name, $this->worksheet); + } + $this->name = $value; + + if ($this->worksheet !== null) { + $this->worksheet->getParent()->addNamedRange($this); + } + + // New title + $newTitle = $this->name; + PHPExcel_ReferenceHelper::getInstance()->updateNamedFormulas($this->worksheet->getParent(), $oldTitle, $newTitle); + } + return $this; + } + + /** + * Get worksheet + * + * @return PHPExcel_Worksheet + */ + public function getWorksheet() + { + return $this->worksheet; + } + + /** + * Set worksheet + * + * @param PHPExcel_Worksheet $value + * @return PHPExcel_NamedRange + */ + public function setWorksheet(PHPExcel_Worksheet $value = null) + { + if ($value !== null) { + $this->worksheet = $value; + } + return $this; + } + + /** + * Get range + * + * @return string + */ + public function getRange() + { + return $this->range; + } + + /** + * Set range + * + * @param string $value + * @return PHPExcel_NamedRange + */ + public function setRange($value = null) + { + if ($value !== null) { + $this->range = $value; + } + return $this; + } + + /** + * Get localOnly + * + * @return bool + */ + public function getLocalOnly() + { + return $this->localOnly; + } + + /** + * Set localOnly + * + * @param bool $value + * @return PHPExcel_NamedRange + */ + public function setLocalOnly($value = false) + { + $this->localOnly = $value; + $this->scope = $value ? $this->worksheet : null; + return $this; + } + + /** + * Get scope + * + * @return PHPExcel_Worksheet|null + */ + public function getScope() + { + return $this->scope; + } + + /** + * Set scope + * + * @param PHPExcel_Worksheet|null $value + * @return PHPExcel_NamedRange + */ + public function setScope(PHPExcel_Worksheet $value = null) + { + $this->scope = $value; + $this->localOnly = ($value == null) ? false : true; + return $this; + } + + /** + * Resolve a named range to a regular cell range + * + * @param string $pNamedRange Named range + * @param PHPExcel_Worksheet|null $pSheet Scope. Use null for global scope + * @return PHPExcel_NamedRange + */ + public static function resolveRange($pNamedRange = '', PHPExcel_Worksheet $pSheet) + { + return $pSheet->getParent()->getNamedRange($pNamedRange, $pSheet); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/Abstract.php b/application/third_party/PHPExcel/PHPExcel/Reader/Abstract.php new file mode 100644 index 0000000..189c70a --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/Abstract.php @@ -0,0 +1,289 @@ +readDataOnly; + } + + /** + * Set read data only + * Set to true, to advise the Reader only to read data values for cells, and to ignore any formatting information. + * Set to false (the default) to advise the Reader to read both data and formatting for cells. + * + * @param boolean $pValue + * + * @return PHPExcel_Reader_IReader + */ + public function setReadDataOnly($pValue = false) + { + $this->readDataOnly = $pValue; + return $this; + } + + /** + * Read empty cells? + * If this is true (the default), then the Reader will read data values for all cells, irrespective of value. + * If false it will not read data for cells containing a null value or an empty string. + * + * @return boolean + */ + public function getReadEmptyCells() + { + return $this->readEmptyCells; + } + + /** + * Set read empty cells + * Set to true (the default) to advise the Reader read data values for all cells, irrespective of value. + * Set to false to advise the Reader to ignore cells containing a null value or an empty string. + * + * @param boolean $pValue + * + * @return PHPExcel_Reader_IReader + */ + public function setReadEmptyCells($pValue = true) + { + $this->readEmptyCells = $pValue; + return $this; + } + + /** + * Read charts in workbook? + * If this is true, then the Reader will include any charts that exist in the workbook. + * Note that a ReadDataOnly value of false overrides, and charts won't be read regardless of the IncludeCharts value. + * If false (the default) it will ignore any charts defined in the workbook file. + * + * @return boolean + */ + public function getIncludeCharts() + { + return $this->includeCharts; + } + + /** + * Set read charts in workbook + * Set to true, to advise the Reader to include any charts that exist in the workbook. + * Note that a ReadDataOnly value of false overrides, and charts won't be read regardless of the IncludeCharts value. + * Set to false (the default) to discard charts. + * + * @param boolean $pValue + * + * @return PHPExcel_Reader_IReader + */ + public function setIncludeCharts($pValue = false) + { + $this->includeCharts = (boolean) $pValue; + return $this; + } + + /** + * Get which sheets to load + * Returns either an array of worksheet names (the list of worksheets that should be loaded), or a null + * indicating that all worksheets in the workbook should be loaded. + * + * @return mixed + */ + public function getLoadSheetsOnly() + { + return $this->loadSheetsOnly; + } + + /** + * Set which sheets to load + * + * @param mixed $value + * This should be either an array of worksheet names to be loaded, or a string containing a single worksheet name. + * If NULL, then it tells the Reader to read all worksheets in the workbook + * + * @return PHPExcel_Reader_IReader + */ + public function setLoadSheetsOnly($value = null) + { + if ($value === null) { + return $this->setLoadAllSheets(); + } + + $this->loadSheetsOnly = is_array($value) ? $value : array($value); + return $this; + } + + /** + * Set all sheets to load + * Tells the Reader to load all worksheets from the workbook. + * + * @return PHPExcel_Reader_IReader + */ + public function setLoadAllSheets() + { + $this->loadSheetsOnly = null; + return $this; + } + + /** + * Read filter + * + * @return PHPExcel_Reader_IReadFilter + */ + public function getReadFilter() + { + return $this->readFilter; + } + + /** + * Set read filter + * + * @param PHPExcel_Reader_IReadFilter $pValue + * @return PHPExcel_Reader_IReader + */ + public function setReadFilter(PHPExcel_Reader_IReadFilter $pValue) + { + $this->readFilter = $pValue; + return $this; + } + + /** + * Open file for reading + * + * @param string $pFilename + * @throws PHPExcel_Reader_Exception + * @return resource + */ + protected function openFile($pFilename) + { + // Check if file exists + if (!file_exists($pFilename) || !is_readable($pFilename)) { + throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + // Open file + $this->fileHandle = fopen($pFilename, 'r'); + if ($this->fileHandle === false) { + throw new PHPExcel_Reader_Exception("Could not open file " . $pFilename . " for reading."); + } + } + + /** + * Can the current PHPExcel_Reader_IReader read the file? + * + * @param string $pFilename + * @return boolean + * @throws PHPExcel_Reader_Exception + */ + public function canRead($pFilename) + { + // Check if file exists + try { + $this->openFile($pFilename); + } catch (Exception $e) { + return false; + } + + $readable = $this->isValidFormat(); + fclose($this->fileHandle); + return $readable; + } + + /** + * Scan theXML for use of securityScan(file_get_contents($filestream)); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/CSV.php b/application/third_party/PHPExcel/PHPExcel/Reader/CSV.php new file mode 100644 index 0000000..21329da --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/CSV.php @@ -0,0 +1,406 @@ +readFilter = new PHPExcel_Reader_DefaultReadFilter(); + } + + /** + * Validate that the current file is a CSV file + * + * @return boolean + */ + protected function isValidFormat() + { + return true; + } + + /** + * Set input encoding + * + * @param string $pValue Input encoding + */ + public function setInputEncoding($pValue = 'UTF-8') + { + $this->inputEncoding = $pValue; + return $this; + } + + /** + * Get input encoding + * + * @return string + */ + public function getInputEncoding() + { + return $this->inputEncoding; + } + + /** + * Move filepointer past any BOM marker + * + */ + protected function skipBOM() + { + rewind($this->fileHandle); + + switch ($this->inputEncoding) { + case 'UTF-8': + fgets($this->fileHandle, 4) == "\xEF\xBB\xBF" ? + fseek($this->fileHandle, 3) : fseek($this->fileHandle, 0); + break; + case 'UTF-16LE': + fgets($this->fileHandle, 3) == "\xFF\xFE" ? + fseek($this->fileHandle, 2) : fseek($this->fileHandle, 0); + break; + case 'UTF-16BE': + fgets($this->fileHandle, 3) == "\xFE\xFF" ? + fseek($this->fileHandle, 2) : fseek($this->fileHandle, 0); + break; + case 'UTF-32LE': + fgets($this->fileHandle, 5) == "\xFF\xFE\x00\x00" ? + fseek($this->fileHandle, 4) : fseek($this->fileHandle, 0); + break; + case 'UTF-32BE': + fgets($this->fileHandle, 5) == "\x00\x00\xFE\xFF" ? + fseek($this->fileHandle, 4) : fseek($this->fileHandle, 0); + break; + default: + break; + } + } + + /** + * Identify any separator that is explicitly set in the file + * + */ + protected function checkSeparator() + { + $line = fgets($this->fileHandle); + if ($line === false) { + return; + } + + if ((strlen(trim($line, "\r\n")) == 5) && (stripos($line, 'sep=') === 0)) { + $this->delimiter = substr($line, 4, 1); + return; + } + return $this->skipBOM(); + } + + /** + * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns) + * + * @param string $pFilename + * @throws PHPExcel_Reader_Exception + */ + public function listWorksheetInfo($pFilename) + { + // Open file + $this->openFile($pFilename); + if (!$this->isValidFormat()) { + fclose($this->fileHandle); + throw new PHPExcel_Reader_Exception($pFilename . " is an Invalid Spreadsheet file."); + } + $fileHandle = $this->fileHandle; + + // Skip BOM, if any + $this->skipBOM(); + $this->checkSeparator(); + + $escapeEnclosures = array( "\\" . $this->enclosure, $this->enclosure . $this->enclosure ); + + $worksheetInfo = array(); + $worksheetInfo[0]['worksheetName'] = 'Worksheet'; + $worksheetInfo[0]['lastColumnLetter'] = 'A'; + $worksheetInfo[0]['lastColumnIndex'] = 0; + $worksheetInfo[0]['totalRows'] = 0; + $worksheetInfo[0]['totalColumns'] = 0; + + // Loop through each line of the file in turn + while (($rowData = fgetcsv($fileHandle, 0, $this->delimiter, $this->enclosure)) !== false) { + $worksheetInfo[0]['totalRows']++; + $worksheetInfo[0]['lastColumnIndex'] = max($worksheetInfo[0]['lastColumnIndex'], count($rowData) - 1); + } + + $worksheetInfo[0]['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($worksheetInfo[0]['lastColumnIndex']); + $worksheetInfo[0]['totalColumns'] = $worksheetInfo[0]['lastColumnIndex'] + 1; + + // Close file + fclose($fileHandle); + + return $worksheetInfo; + } + + /** + * Loads PHPExcel from file + * + * @param string $pFilename + * @return PHPExcel + * @throws PHPExcel_Reader_Exception + */ + public function load($pFilename) + { + // Create new PHPExcel + $objPHPExcel = new PHPExcel(); + + // Load into this instance + return $this->loadIntoExisting($pFilename, $objPHPExcel); + } + + /** + * Loads PHPExcel from file into PHPExcel instance + * + * @param string $pFilename + * @param PHPExcel $objPHPExcel + * @return PHPExcel + * @throws PHPExcel_Reader_Exception + */ + public function loadIntoExisting($pFilename, PHPExcel $objPHPExcel) + { + $lineEnding = ini_get('auto_detect_line_endings'); + ini_set('auto_detect_line_endings', true); + + // Open file + $this->openFile($pFilename); + if (!$this->isValidFormat()) { + fclose($this->fileHandle); + throw new PHPExcel_Reader_Exception($pFilename . " is an Invalid Spreadsheet file."); + } + $fileHandle = $this->fileHandle; + + // Skip BOM, if any + $this->skipBOM(); + $this->checkSeparator(); + + // Create new PHPExcel object + while ($objPHPExcel->getSheetCount() <= $this->sheetIndex) { + $objPHPExcel->createSheet(); + } + $sheet = $objPHPExcel->setActiveSheetIndex($this->sheetIndex); + + $escapeEnclosures = array( "\\" . $this->enclosure, + $this->enclosure . $this->enclosure + ); + + // Set our starting row based on whether we're in contiguous mode or not + $currentRow = 1; + if ($this->contiguous) { + $currentRow = ($this->contiguousRow == -1) ? $sheet->getHighestRow(): $this->contiguousRow; + } + + // Loop through each line of the file in turn + while (($rowData = fgetcsv($fileHandle, 0, $this->delimiter, $this->enclosure)) !== false) { + $columnLetter = 'A'; + foreach ($rowData as $rowDatum) { + if ($rowDatum != '' && $this->readFilter->readCell($columnLetter, $currentRow)) { + // Unescape enclosures + $rowDatum = str_replace($escapeEnclosures, $this->enclosure, $rowDatum); + + // Convert encoding if necessary + if ($this->inputEncoding !== 'UTF-8') { + $rowDatum = PHPExcel_Shared_String::ConvertEncoding($rowDatum, 'UTF-8', $this->inputEncoding); + } + + // Set cell value + $sheet->getCell($columnLetter . $currentRow)->setValue($rowDatum); + } + ++$columnLetter; + } + ++$currentRow; + } + + // Close file + fclose($fileHandle); + + if ($this->contiguous) { + $this->contiguousRow = $currentRow; + } + + ini_set('auto_detect_line_endings', $lineEnding); + + // Return + return $objPHPExcel; + } + + /** + * Get delimiter + * + * @return string + */ + public function getDelimiter() + { + return $this->delimiter; + } + + /** + * Set delimiter + * + * @param string $pValue Delimiter, defaults to , + * @return PHPExcel_Reader_CSV + */ + public function setDelimiter($pValue = ',') + { + $this->delimiter = $pValue; + return $this; + } + + /** + * Get enclosure + * + * @return string + */ + public function getEnclosure() + { + return $this->enclosure; + } + + /** + * Set enclosure + * + * @param string $pValue Enclosure, defaults to " + * @return PHPExcel_Reader_CSV + */ + public function setEnclosure($pValue = '"') + { + if ($pValue == '') { + $pValue = '"'; + } + $this->enclosure = $pValue; + return $this; + } + + /** + * Get sheet index + * + * @return integer + */ + public function getSheetIndex() + { + return $this->sheetIndex; + } + + /** + * Set sheet index + * + * @param integer $pValue Sheet index + * @return PHPExcel_Reader_CSV + */ + public function setSheetIndex($pValue = 0) + { + $this->sheetIndex = $pValue; + return $this; + } + + /** + * Set Contiguous + * + * @param boolean $contiguous + */ + public function setContiguous($contiguous = false) + { + $this->contiguous = (bool) $contiguous; + if (!$contiguous) { + $this->contiguousRow = -1; + } + + return $this; + } + + /** + * Get Contiguous + * + * @return boolean + */ + public function getContiguous() + { + return $this->contiguous; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/DefaultReadFilter.php b/application/third_party/PHPExcel/PHPExcel/Reader/DefaultReadFilter.php new file mode 100644 index 0000000..ea25f63 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/DefaultReadFilter.php @@ -0,0 +1,51 @@ +readFilter = new PHPExcel_Reader_DefaultReadFilter(); + } + + + /** + * Can the current PHPExcel_Reader_IReader read the file? + * + * @param string $pFilename + * @return boolean + * @throws PHPExcel_Reader_Exception + */ + public function canRead($pFilename) + { + + // Office xmlns:o="urn:schemas-microsoft-com:office:office" + // Excel xmlns:x="urn:schemas-microsoft-com:office:excel" + // XML Spreadsheet xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" + // Spreadsheet component xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" + // XML schema xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" + // XML data type xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" + // MS-persist recordset xmlns:rs="urn:schemas-microsoft-com:rowset" + // Rowset xmlns:z="#RowsetSchema" + // + + $signature = array( + '' + ); + + // Open file + $this->openFile($pFilename); + $fileHandle = $this->fileHandle; + + // Read sample data (first 2 KB will do) + $data = fread($fileHandle, 2048); + fclose($fileHandle); + + $valid = true; + foreach ($signature as $match) { + // every part of the signature must be present + if (strpos($data, $match) === false) { + $valid = false; + break; + } + } + + // Retrieve charset encoding + if (preg_match('//um', $data, $matches)) { + $this->charSet = strtoupper($matches[1]); + } +// echo 'Character Set is ', $this->charSet,'
'; + + return $valid; + } + + + /** + * Reads names of the worksheets from a file, without parsing the whole file to a PHPExcel object + * + * @param string $pFilename + * @throws PHPExcel_Reader_Exception + */ + public function listWorksheetNames($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + if (!$this->canRead($pFilename)) { + throw new PHPExcel_Reader_Exception($pFilename . " is an Invalid Spreadsheet file."); + } + + $worksheetNames = array(); + + $xml = simplexml_load_string($this->securityScan(file_get_contents($pFilename)), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); + $namespaces = $xml->getNamespaces(true); + + $xml_ss = $xml->children($namespaces['ss']); + foreach ($xml_ss->Worksheet as $worksheet) { + $worksheet_ss = $worksheet->attributes($namespaces['ss']); + $worksheetNames[] = self::convertStringEncoding((string) $worksheet_ss['Name'], $this->charSet); + } + + return $worksheetNames; + } + + + /** + * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns) + * + * @param string $pFilename + * @throws PHPExcel_Reader_Exception + */ + public function listWorksheetInfo($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $worksheetInfo = array(); + + $xml = simplexml_load_string($this->securityScan(file_get_contents($pFilename)), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); + $namespaces = $xml->getNamespaces(true); + + $worksheetID = 1; + $xml_ss = $xml->children($namespaces['ss']); + foreach ($xml_ss->Worksheet as $worksheet) { + $worksheet_ss = $worksheet->attributes($namespaces['ss']); + + $tmpInfo = array(); + $tmpInfo['worksheetName'] = ''; + $tmpInfo['lastColumnLetter'] = 'A'; + $tmpInfo['lastColumnIndex'] = 0; + $tmpInfo['totalRows'] = 0; + $tmpInfo['totalColumns'] = 0; + + if (isset($worksheet_ss['Name'])) { + $tmpInfo['worksheetName'] = (string) $worksheet_ss['Name']; + } else { + $tmpInfo['worksheetName'] = "Worksheet_{$worksheetID}"; + } + + if (isset($worksheet->Table->Row)) { + $rowIndex = 0; + + foreach ($worksheet->Table->Row as $rowData) { + $columnIndex = 0; + $rowHasData = false; + + foreach ($rowData->Cell as $cell) { + if (isset($cell->Data)) { + $tmpInfo['lastColumnIndex'] = max($tmpInfo['lastColumnIndex'], $columnIndex); + $rowHasData = true; + } + + ++$columnIndex; + } + + ++$rowIndex; + + if ($rowHasData) { + $tmpInfo['totalRows'] = max($tmpInfo['totalRows'], $rowIndex); + } + } + } + + $tmpInfo['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($tmpInfo['lastColumnIndex']); + $tmpInfo['totalColumns'] = $tmpInfo['lastColumnIndex'] + 1; + + $worksheetInfo[] = $tmpInfo; + ++$worksheetID; + } + + return $worksheetInfo; + } + + + /** + * Loads PHPExcel from file + * + * @param string $pFilename + * @return PHPExcel + * @throws PHPExcel_Reader_Exception + */ + public function load($pFilename) + { + // Create new PHPExcel + $objPHPExcel = new PHPExcel(); + $objPHPExcel->removeSheetByIndex(0); + + // Load into this instance + return $this->loadIntoExisting($pFilename, $objPHPExcel); + } + + protected static function identifyFixedStyleValue($styleList, &$styleAttributeValue) + { + $styleAttributeValue = strtolower($styleAttributeValue); + foreach ($styleList as $style) { + if ($styleAttributeValue == strtolower($style)) { + $styleAttributeValue = $style; + return true; + } + } + return false; + } + + /** + * pixel units to excel width units(units of 1/256th of a character width) + * @param pxs + * @return + */ + protected static function pixel2WidthUnits($pxs) + { + $UNIT_OFFSET_MAP = array(0, 36, 73, 109, 146, 182, 219); + + $widthUnits = 256 * ($pxs / 7); + $widthUnits += $UNIT_OFFSET_MAP[($pxs % 7)]; + return $widthUnits; + } + + /** + * excel width units(units of 1/256th of a character width) to pixel units + * @param widthUnits + * @return + */ + protected static function widthUnits2Pixel($widthUnits) + { + $pixels = ($widthUnits / 256) * 7; + $offsetWidthUnits = $widthUnits % 256; + $pixels += round($offsetWidthUnits / (256 / 7)); + return $pixels; + } + + protected static function hex2str($hex) + { + return chr(hexdec($hex[1])); + } + + /** + * Loads PHPExcel from file into PHPExcel instance + * + * @param string $pFilename + * @param PHPExcel $objPHPExcel + * @return PHPExcel + * @throws PHPExcel_Reader_Exception + */ + public function loadIntoExisting($pFilename, PHPExcel $objPHPExcel) + { + $fromFormats = array('\-', '\ '); + $toFormats = array('-', ' '); + + $underlineStyles = array ( + PHPExcel_Style_Font::UNDERLINE_NONE, + PHPExcel_Style_Font::UNDERLINE_DOUBLE, + PHPExcel_Style_Font::UNDERLINE_DOUBLEACCOUNTING, + PHPExcel_Style_Font::UNDERLINE_SINGLE, + PHPExcel_Style_Font::UNDERLINE_SINGLEACCOUNTING + ); + $verticalAlignmentStyles = array ( + PHPExcel_Style_Alignment::VERTICAL_BOTTOM, + PHPExcel_Style_Alignment::VERTICAL_TOP, + PHPExcel_Style_Alignment::VERTICAL_CENTER, + PHPExcel_Style_Alignment::VERTICAL_JUSTIFY + ); + $horizontalAlignmentStyles = array ( + PHPExcel_Style_Alignment::HORIZONTAL_GENERAL, + PHPExcel_Style_Alignment::HORIZONTAL_LEFT, + PHPExcel_Style_Alignment::HORIZONTAL_RIGHT, + PHPExcel_Style_Alignment::HORIZONTAL_CENTER, + PHPExcel_Style_Alignment::HORIZONTAL_CENTER_CONTINUOUS, + PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY + ); + + $timezoneObj = new DateTimeZone('Europe/London'); + $GMT = new DateTimeZone('UTC'); + + // Check if file exists + if (!file_exists($pFilename)) { + throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + if (!$this->canRead($pFilename)) { + throw new PHPExcel_Reader_Exception($pFilename . " is an Invalid Spreadsheet file."); + } + + $xml = simplexml_load_string($this->securityScan(file_get_contents($pFilename)), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); + $namespaces = $xml->getNamespaces(true); + + $docProps = $objPHPExcel->getProperties(); + if (isset($xml->DocumentProperties[0])) { + foreach ($xml->DocumentProperties[0] as $propertyName => $propertyValue) { + switch ($propertyName) { + case 'Title': + $docProps->setTitle(self::convertStringEncoding($propertyValue, $this->charSet)); + break; + case 'Subject': + $docProps->setSubject(self::convertStringEncoding($propertyValue, $this->charSet)); + break; + case 'Author': + $docProps->setCreator(self::convertStringEncoding($propertyValue, $this->charSet)); + break; + case 'Created': + $creationDate = strtotime($propertyValue); + $docProps->setCreated($creationDate); + break; + case 'LastAuthor': + $docProps->setLastModifiedBy(self::convertStringEncoding($propertyValue, $this->charSet)); + break; + case 'LastSaved': + $lastSaveDate = strtotime($propertyValue); + $docProps->setModified($lastSaveDate); + break; + case 'Company': + $docProps->setCompany(self::convertStringEncoding($propertyValue, $this->charSet)); + break; + case 'Category': + $docProps->setCategory(self::convertStringEncoding($propertyValue, $this->charSet)); + break; + case 'Manager': + $docProps->setManager(self::convertStringEncoding($propertyValue, $this->charSet)); + break; + case 'Keywords': + $docProps->setKeywords(self::convertStringEncoding($propertyValue, $this->charSet)); + break; + case 'Description': + $docProps->setDescription(self::convertStringEncoding($propertyValue, $this->charSet)); + break; + } + } + } + if (isset($xml->CustomDocumentProperties)) { + foreach ($xml->CustomDocumentProperties[0] as $propertyName => $propertyValue) { + $propertyAttributes = $propertyValue->attributes($namespaces['dt']); + $propertyName = preg_replace_callback('/_x([0-9a-z]{4})_/', 'PHPExcel_Reader_Excel2003XML::hex2str', $propertyName); + $propertyType = PHPExcel_DocumentProperties::PROPERTY_TYPE_UNKNOWN; + switch ((string) $propertyAttributes) { + case 'string': + $propertyType = PHPExcel_DocumentProperties::PROPERTY_TYPE_STRING; + $propertyValue = trim($propertyValue); + break; + case 'boolean': + $propertyType = PHPExcel_DocumentProperties::PROPERTY_TYPE_BOOLEAN; + $propertyValue = (bool) $propertyValue; + break; + case 'integer': + $propertyType = PHPExcel_DocumentProperties::PROPERTY_TYPE_INTEGER; + $propertyValue = intval($propertyValue); + break; + case 'float': + $propertyType = PHPExcel_DocumentProperties::PROPERTY_TYPE_FLOAT; + $propertyValue = floatval($propertyValue); + break; + case 'dateTime.tz': + $propertyType = PHPExcel_DocumentProperties::PROPERTY_TYPE_DATE; + $propertyValue = strtotime(trim($propertyValue)); + break; + } + $docProps->setCustomProperty($propertyName, $propertyValue, $propertyType); + } + } + + foreach ($xml->Styles[0] as $style) { + $style_ss = $style->attributes($namespaces['ss']); + $styleID = (string) $style_ss['ID']; +// echo 'Style ID = '.$styleID.'
'; + $this->styles[$styleID] = (isset($this->styles['Default'])) ? $this->styles['Default'] : array(); + foreach ($style as $styleType => $styleData) { + $styleAttributes = $styleData->attributes($namespaces['ss']); +// echo $styleType.'
'; + switch ($styleType) { + case 'Alignment': + foreach ($styleAttributes as $styleAttributeKey => $styleAttributeValue) { +// echo $styleAttributeKey.' = '.$styleAttributeValue.'
'; + $styleAttributeValue = (string) $styleAttributeValue; + switch ($styleAttributeKey) { + case 'Vertical': + if (self::identifyFixedStyleValue($verticalAlignmentStyles, $styleAttributeValue)) { + $this->styles[$styleID]['alignment']['vertical'] = $styleAttributeValue; + } + break; + case 'Horizontal': + if (self::identifyFixedStyleValue($horizontalAlignmentStyles, $styleAttributeValue)) { + $this->styles[$styleID]['alignment']['horizontal'] = $styleAttributeValue; + } + break; + case 'WrapText': + $this->styles[$styleID]['alignment']['wrap'] = true; + break; + } + } + break; + case 'Borders': + foreach ($styleData->Border as $borderStyle) { + $borderAttributes = $borderStyle->attributes($namespaces['ss']); + $thisBorder = array(); + foreach ($borderAttributes as $borderStyleKey => $borderStyleValue) { +// echo $borderStyleKey.' = '.$borderStyleValue.'
'; + switch ($borderStyleKey) { + case 'LineStyle': + $thisBorder['style'] = PHPExcel_Style_Border::BORDER_MEDIUM; +// $thisBorder['style'] = $borderStyleValue; + break; + case 'Weight': +// $thisBorder['style'] = $borderStyleValue; + break; + case 'Position': + $borderPosition = strtolower($borderStyleValue); + break; + case 'Color': + $borderColour = substr($borderStyleValue, 1); + $thisBorder['color']['rgb'] = $borderColour; + break; + } + } + if (!empty($thisBorder)) { + if (($borderPosition == 'left') || ($borderPosition == 'right') || ($borderPosition == 'top') || ($borderPosition == 'bottom')) { + $this->styles[$styleID]['borders'][$borderPosition] = $thisBorder; + } + } + } + break; + case 'Font': + foreach ($styleAttributes as $styleAttributeKey => $styleAttributeValue) { +// echo $styleAttributeKey.' = '.$styleAttributeValue.'
'; + $styleAttributeValue = (string) $styleAttributeValue; + switch ($styleAttributeKey) { + case 'FontName': + $this->styles[$styleID]['font']['name'] = $styleAttributeValue; + break; + case 'Size': + $this->styles[$styleID]['font']['size'] = $styleAttributeValue; + break; + case 'Color': + $this->styles[$styleID]['font']['color']['rgb'] = substr($styleAttributeValue, 1); + break; + case 'Bold': + $this->styles[$styleID]['font']['bold'] = true; + break; + case 'Italic': + $this->styles[$styleID]['font']['italic'] = true; + break; + case 'Underline': + if (self::identifyFixedStyleValue($underlineStyles, $styleAttributeValue)) { + $this->styles[$styleID]['font']['underline'] = $styleAttributeValue; + } + break; + } + } + break; + case 'Interior': + foreach ($styleAttributes as $styleAttributeKey => $styleAttributeValue) { +// echo $styleAttributeKey.' = '.$styleAttributeValue.'
'; + switch ($styleAttributeKey) { + case 'Color': + $this->styles[$styleID]['fill']['color']['rgb'] = substr($styleAttributeValue, 1); + break; + } + } + break; + case 'NumberFormat': + foreach ($styleAttributes as $styleAttributeKey => $styleAttributeValue) { +// echo $styleAttributeKey.' = '.$styleAttributeValue.'
'; + $styleAttributeValue = str_replace($fromFormats, $toFormats, $styleAttributeValue); + switch ($styleAttributeValue) { + case 'Short Date': + $styleAttributeValue = 'dd/mm/yyyy'; + break; + } + if ($styleAttributeValue > '') { + $this->styles[$styleID]['numberformat']['code'] = $styleAttributeValue; + } + } + break; + case 'Protection': + foreach ($styleAttributes as $styleAttributeKey => $styleAttributeValue) { +// echo $styleAttributeKey.' = '.$styleAttributeValue.'
'; + } + break; + } + } +// print_r($this->styles[$styleID]); +// echo '
'; + } +// echo '
'; + + $worksheetID = 0; + $xml_ss = $xml->children($namespaces['ss']); + + foreach ($xml_ss->Worksheet as $worksheet) { + $worksheet_ss = $worksheet->attributes($namespaces['ss']); + + if ((isset($this->loadSheetsOnly)) && (isset($worksheet_ss['Name'])) && + (!in_array($worksheet_ss['Name'], $this->loadSheetsOnly))) { + continue; + } + +// echo '

Worksheet: ', $worksheet_ss['Name'],'

'; +// + // Create new Worksheet + $objPHPExcel->createSheet(); + $objPHPExcel->setActiveSheetIndex($worksheetID); + if (isset($worksheet_ss['Name'])) { + $worksheetName = self::convertStringEncoding((string) $worksheet_ss['Name'], $this->charSet); + // Use false for $updateFormulaCellReferences to prevent adjustment of worksheet references in + // formula cells... during the load, all formulae should be correct, and we're simply bringing + // the worksheet name in line with the formula, not the reverse + $objPHPExcel->getActiveSheet()->setTitle($worksheetName, false); + } + + $columnID = 'A'; + if (isset($worksheet->Table->Column)) { + foreach ($worksheet->Table->Column as $columnData) { + $columnData_ss = $columnData->attributes($namespaces['ss']); + if (isset($columnData_ss['Index'])) { + $columnID = PHPExcel_Cell::stringFromColumnIndex($columnData_ss['Index']-1); + } + if (isset($columnData_ss['Width'])) { + $columnWidth = $columnData_ss['Width']; +// echo 'Setting column width for '.$columnID.' to '.$columnWidth.'
'; + $objPHPExcel->getActiveSheet()->getColumnDimension($columnID)->setWidth($columnWidth / 5.4); + } + ++$columnID; + } + } + + $rowID = 1; + if (isset($worksheet->Table->Row)) { + $additionalMergedCells = 0; + foreach ($worksheet->Table->Row as $rowData) { + $rowHasData = false; + $row_ss = $rowData->attributes($namespaces['ss']); + if (isset($row_ss['Index'])) { + $rowID = (integer) $row_ss['Index']; + } +// echo 'Row '.$rowID.'
'; + + $columnID = 'A'; + foreach ($rowData->Cell as $cell) { + $cell_ss = $cell->attributes($namespaces['ss']); + if (isset($cell_ss['Index'])) { + $columnID = PHPExcel_Cell::stringFromColumnIndex($cell_ss['Index']-1); + } + $cellRange = $columnID.$rowID; + + if ($this->getReadFilter() !== null) { + if (!$this->getReadFilter()->readCell($columnID, $rowID, $worksheetName)) { + continue; + } + } + + if ((isset($cell_ss['MergeAcross'])) || (isset($cell_ss['MergeDown']))) { + $columnTo = $columnID; + if (isset($cell_ss['MergeAcross'])) { + $additionalMergedCells += (int)$cell_ss['MergeAcross']; + $columnTo = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::columnIndexFromString($columnID) + $cell_ss['MergeAcross'] -1); + } + $rowTo = $rowID; + if (isset($cell_ss['MergeDown'])) { + $rowTo = $rowTo + $cell_ss['MergeDown']; + } + $cellRange .= ':'.$columnTo.$rowTo; + $objPHPExcel->getActiveSheet()->mergeCells($cellRange); + } + + $cellIsSet = $hasCalculatedValue = false; + $cellDataFormula = ''; + if (isset($cell_ss['Formula'])) { + $cellDataFormula = $cell_ss['Formula']; + // added this as a check for array formulas + if (isset($cell_ss['ArrayRange'])) { + $cellDataCSEFormula = $cell_ss['ArrayRange']; +// echo "found an array formula at ".$columnID.$rowID."
"; + } + $hasCalculatedValue = true; + } + if (isset($cell->Data)) { + $cellValue = $cellData = $cell->Data; + $type = PHPExcel_Cell_DataType::TYPE_NULL; + $cellData_ss = $cellData->attributes($namespaces['ss']); + if (isset($cellData_ss['Type'])) { + $cellDataType = $cellData_ss['Type']; + switch ($cellDataType) { + /* + const TYPE_STRING = 's'; + const TYPE_FORMULA = 'f'; + const TYPE_NUMERIC = 'n'; + const TYPE_BOOL = 'b'; + const TYPE_NULL = 'null'; + const TYPE_INLINE = 'inlineStr'; + const TYPE_ERROR = 'e'; + */ + case 'String': + $cellValue = self::convertStringEncoding($cellValue, $this->charSet); + $type = PHPExcel_Cell_DataType::TYPE_STRING; + break; + case 'Number': + $type = PHPExcel_Cell_DataType::TYPE_NUMERIC; + $cellValue = (float) $cellValue; + if (floor($cellValue) == $cellValue) { + $cellValue = (integer) $cellValue; + } + break; + case 'Boolean': + $type = PHPExcel_Cell_DataType::TYPE_BOOL; + $cellValue = ($cellValue != 0); + break; + case 'DateTime': + $type = PHPExcel_Cell_DataType::TYPE_NUMERIC; + $cellValue = PHPExcel_Shared_Date::PHPToExcel(strtotime($cellValue)); + break; + case 'Error': + $type = PHPExcel_Cell_DataType::TYPE_ERROR; + break; + } + } + + if ($hasCalculatedValue) { +// echo 'FORMULA
'; + $type = PHPExcel_Cell_DataType::TYPE_FORMULA; + $columnNumber = PHPExcel_Cell::columnIndexFromString($columnID); + if (substr($cellDataFormula, 0, 3) == 'of:') { + $cellDataFormula = substr($cellDataFormula, 3); +// echo 'Before: ', $cellDataFormula,'
'; + $temp = explode('"', $cellDataFormula); + $key = false; + foreach ($temp as &$value) { + // Only replace in alternate array entries (i.e. non-quoted blocks) + if ($key = !$key) { + $value = str_replace(array('[.', '.', ']'), '', $value); + } + } + } else { + // Convert R1C1 style references to A1 style references (but only when not quoted) +// echo 'Before: ', $cellDataFormula,'
'; + $temp = explode('"', $cellDataFormula); + $key = false; + foreach ($temp as &$value) { + // Only replace in alternate array entries (i.e. non-quoted blocks) + if ($key = !$key) { + preg_match_all('/(R(\[?-?\d*\]?))(C(\[?-?\d*\]?))/', $value, $cellReferences, PREG_SET_ORDER + PREG_OFFSET_CAPTURE); + // Reverse the matches array, otherwise all our offsets will become incorrect if we modify our way + // through the formula from left to right. Reversing means that we work right to left.through + // the formula + $cellReferences = array_reverse($cellReferences); + // Loop through each R1C1 style reference in turn, converting it to its A1 style equivalent, + // then modify the formula to use that new reference + foreach ($cellReferences as $cellReference) { + $rowReference = $cellReference[2][0]; + // Empty R reference is the current row + if ($rowReference == '') { + $rowReference = $rowID; + } + // Bracketed R references are relative to the current row + if ($rowReference{0} == '[') { + $rowReference = $rowID + trim($rowReference, '[]'); + } + $columnReference = $cellReference[4][0]; + // Empty C reference is the current column + if ($columnReference == '') { + $columnReference = $columnNumber; + } + // Bracketed C references are relative to the current column + if ($columnReference{0} == '[') { + $columnReference = $columnNumber + trim($columnReference, '[]'); + } + $A1CellReference = PHPExcel_Cell::stringFromColumnIndex($columnReference-1).$rowReference; + $value = substr_replace($value, $A1CellReference, $cellReference[0][1], strlen($cellReference[0][0])); + } + } + } + } + unset($value); + // Then rebuild the formula string + $cellDataFormula = implode('"', $temp); +// echo 'After: ', $cellDataFormula,'
'; + } + +// echo 'Cell '.$columnID.$rowID.' is a '.$type.' with a value of '.(($hasCalculatedValue) ? $cellDataFormula : $cellValue).'
'; +// + $objPHPExcel->getActiveSheet()->getCell($columnID.$rowID)->setValueExplicit((($hasCalculatedValue) ? $cellDataFormula : $cellValue), $type); + if ($hasCalculatedValue) { +// echo 'Formula result is '.$cellValue.'
'; + $objPHPExcel->getActiveSheet()->getCell($columnID.$rowID)->setCalculatedValue($cellValue); + } + $cellIsSet = $rowHasData = true; + } + + if (isset($cell->Comment)) { +// echo 'comment found
'; + $commentAttributes = $cell->Comment->attributes($namespaces['ss']); + $author = 'unknown'; + if (isset($commentAttributes->Author)) { + $author = (string)$commentAttributes->Author; +// echo 'Author: ', $author,'
'; + } + $node = $cell->Comment->Data->asXML(); +// $annotation = str_replace('html:','',substr($node,49,-10)); +// echo $annotation,'
'; + $annotation = strip_tags($node); +// echo 'Annotation: ', $annotation,'
'; + $objPHPExcel->getActiveSheet()->getComment($columnID.$rowID)->setAuthor(self::convertStringEncoding($author, $this->charSet))->setText($this->parseRichText($annotation)); + } + + if (($cellIsSet) && (isset($cell_ss['StyleID']))) { + $style = (string) $cell_ss['StyleID']; +// echo 'Cell style for '.$columnID.$rowID.' is '.$style.'
'; + if ((isset($this->styles[$style])) && (!empty($this->styles[$style]))) { +// echo 'Cell '.$columnID.$rowID.'
'; +// print_r($this->styles[$style]); +// echo '
'; + if (!$objPHPExcel->getActiveSheet()->cellExists($columnID.$rowID)) { + $objPHPExcel->getActiveSheet()->getCell($columnID.$rowID)->setValue(null); + } + $objPHPExcel->getActiveSheet()->getStyle($cellRange)->applyFromArray($this->styles[$style]); + } + } + ++$columnID; + while ($additionalMergedCells > 0) { + ++$columnID; + $additionalMergedCells--; + } + } + + if ($rowHasData) { + if (isset($row_ss['StyleID'])) { + $rowStyle = $row_ss['StyleID']; + } + if (isset($row_ss['Height'])) { + $rowHeight = $row_ss['Height']; +// echo 'Setting row height to '.$rowHeight.'
'; + $objPHPExcel->getActiveSheet()->getRowDimension($rowID)->setRowHeight($rowHeight); + } + } + + ++$rowID; + } + } + ++$worksheetID; + } + + // Return + return $objPHPExcel; + } + + + protected static function convertStringEncoding($string, $charset) + { + if ($charset != 'UTF-8') { + return PHPExcel_Shared_String::ConvertEncoding($string, 'UTF-8', $charset); + } + return $string; + } + + + protected function parseRichText($is = '') + { + $value = new PHPExcel_RichText(); + + $value->createText(self::convertStringEncoding($is, $this->charSet)); + + return $value; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/Excel2007.php b/application/third_party/PHPExcel/PHPExcel/Reader/Excel2007.php new file mode 100644 index 0000000..1932df4 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/Excel2007.php @@ -0,0 +1,2051 @@ +readFilter = new PHPExcel_Reader_DefaultReadFilter(); + $this->referenceHelper = PHPExcel_ReferenceHelper::getInstance(); + } + + /** + * Can the current PHPExcel_Reader_IReader read the file? + * + * @param string $pFilename + * @return boolean + * @throws PHPExcel_Reader_Exception + */ + public function canRead($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $zipClass = PHPExcel_Settings::getZipClass(); + + // Check if zip class exists +// if (!class_exists($zipClass, false)) { +// throw new PHPExcel_Reader_Exception($zipClass . " library is not enabled"); +// } + + $xl = false; + // Load file + $zip = new $zipClass; + if ($zip->open($pFilename) === true) { + // check if it is an OOXML archive + $rels = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, "_rels/.rels")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); + if ($rels !== false) { + foreach ($rels->Relationship as $rel) { + switch ($rel["Type"]) { + case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument": + if (basename($rel["Target"]) == 'workbook.xml') { + $xl = true; + } + break; + + } + } + } + $zip->close(); + } + + return $xl; + } + + + /** + * Reads names of the worksheets from a file, without parsing the whole file to a PHPExcel object + * + * @param string $pFilename + * @throws PHPExcel_Reader_Exception + */ + public function listWorksheetNames($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $worksheetNames = array(); + + $zipClass = PHPExcel_Settings::getZipClass(); + + $zip = new $zipClass; + $zip->open($pFilename); + + // The files we're looking at here are small enough that simpleXML is more efficient than XMLReader + $rels = simplexml_load_string( + $this->securityScan($this->getFromZipArchive($zip, "_rels/.rels"), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()) + ); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + foreach ($rels->Relationship as $rel) { + switch ($rel["Type"]) { + case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument": + $xmlWorkbook = simplexml_load_string( + $this->securityScan($this->getFromZipArchive($zip, "{$rel['Target']}"), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()) + ); //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main"); + + if ($xmlWorkbook->sheets) { + foreach ($xmlWorkbook->sheets->sheet as $eleSheet) { + // Check if sheet should be skipped + $worksheetNames[] = (string) $eleSheet["name"]; + } + } + } + } + + $zip->close(); + + return $worksheetNames; + } + + + /** + * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns) + * + * @param string $pFilename + * @throws PHPExcel_Reader_Exception + */ + public function listWorksheetInfo($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $worksheetInfo = array(); + + $zipClass = PHPExcel_Settings::getZipClass(); + + $zip = new $zipClass; + $zip->open($pFilename); + + $rels = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, "_rels/.rels")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + foreach ($rels->Relationship as $rel) { + if ($rel["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument") { + $dir = dirname($rel["Target"]); + $relsWorkbook = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, "$dir/_rels/" . basename($rel["Target"]) . ".rels")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + $relsWorkbook->registerXPathNamespace("rel", "http://schemas.openxmlformats.org/package/2006/relationships"); + + $worksheets = array(); + foreach ($relsWorkbook->Relationship as $ele) { + if ($ele["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet") { + $worksheets[(string) $ele["Id"]] = $ele["Target"]; + } + } + + $xmlWorkbook = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, "{$rel['Target']}")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main"); + if ($xmlWorkbook->sheets) { + $dir = dirname($rel["Target"]); + foreach ($xmlWorkbook->sheets->sheet as $eleSheet) { + $tmpInfo = array( + 'worksheetName' => (string) $eleSheet["name"], + 'lastColumnLetter' => 'A', + 'lastColumnIndex' => 0, + 'totalRows' => 0, + 'totalColumns' => 0, + ); + + $fileWorksheet = $worksheets[(string) self::getArrayItem($eleSheet->attributes("http://schemas.openxmlformats.org/officeDocument/2006/relationships"), "id")]; + + $xml = new XMLReader(); + $res = $xml->xml($this->securityScanFile('zip://'.PHPExcel_Shared_File::realpath($pFilename).'#'."$dir/$fileWorksheet"), null, PHPExcel_Settings::getLibXmlLoaderOptions()); + $xml->setParserProperty(2, true); + + $currCells = 0; + while ($xml->read()) { + if ($xml->name == 'row' && $xml->nodeType == XMLReader::ELEMENT) { + $row = $xml->getAttribute('r'); + $tmpInfo['totalRows'] = $row; + $tmpInfo['totalColumns'] = max($tmpInfo['totalColumns'], $currCells); + $currCells = 0; + } elseif ($xml->name == 'c' && $xml->nodeType == XMLReader::ELEMENT) { + $currCells++; + } + } + $tmpInfo['totalColumns'] = max($tmpInfo['totalColumns'], $currCells); + $xml->close(); + + $tmpInfo['lastColumnIndex'] = $tmpInfo['totalColumns'] - 1; + $tmpInfo['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($tmpInfo['lastColumnIndex']); + + $worksheetInfo[] = $tmpInfo; + } + } + } + } + + $zip->close(); + + return $worksheetInfo; + } + + private static function castToBoolean($c) + { +// echo 'Initial Cast to Boolean', PHP_EOL; + $value = isset($c->v) ? (string) $c->v : null; + if ($value == '0') { + return false; + } elseif ($value == '1') { + return true; + } else { + return (bool)$c->v; + } + return $value; + } + + private static function castToError($c) + { +// echo 'Initial Cast to Error', PHP_EOL; + return isset($c->v) ? (string) $c->v : null; + } + + private static function castToString($c) + { +// echo 'Initial Cast to String, PHP_EOL; + return isset($c->v) ? (string) $c->v : null; + } + + private function castToFormula($c, $r, &$cellDataType, &$value, &$calculatedValue, &$sharedFormulas, $castBaseType) + { +// echo 'Formula', PHP_EOL; +// echo '$c->f is ', $c->f, PHP_EOL; + $cellDataType = 'f'; + $value = "={$c->f}"; + $calculatedValue = self::$castBaseType($c); + + // Shared formula? + if (isset($c->f['t']) && strtolower((string)$c->f['t']) == 'shared') { +// echo 'SHARED FORMULA', PHP_EOL; + $instance = (string)$c->f['si']; + +// echo 'Instance ID = ', $instance, PHP_EOL; +// +// echo 'Shared Formula Array:', PHP_EOL; +// print_r($sharedFormulas); + if (!isset($sharedFormulas[(string)$c->f['si']])) { +// echo 'SETTING NEW SHARED FORMULA', PHP_EOL; +// echo 'Master is ', $r, PHP_EOL; +// echo 'Formula is ', $value, PHP_EOL; + $sharedFormulas[$instance] = array('master' => $r, 'formula' => $value); +// echo 'New Shared Formula Array:', PHP_EOL; +// print_r($sharedFormulas); + } else { +// echo 'GETTING SHARED FORMULA', PHP_EOL; +// echo 'Master is ', $sharedFormulas[$instance]['master'], PHP_EOL; +// echo 'Formula is ', $sharedFormulas[$instance]['formula'], PHP_EOL; + $master = PHPExcel_Cell::coordinateFromString($sharedFormulas[$instance]['master']); + $current = PHPExcel_Cell::coordinateFromString($r); + + $difference = array(0, 0); + $difference[0] = PHPExcel_Cell::columnIndexFromString($current[0]) - PHPExcel_Cell::columnIndexFromString($master[0]); + $difference[1] = $current[1] - $master[1]; + + $value = $this->referenceHelper->updateFormulaReferences($sharedFormulas[$instance]['formula'], 'A1', $difference[0], $difference[1]); +// echo 'Adjusted Formula is ', $value, PHP_EOL; + } + } + } + + + private function getFromZipArchive($archive, $fileName = '') + { + // Root-relative paths + if (strpos($fileName, '//') !== false) { + $fileName = substr($fileName, strpos($fileName, '//') + 1); + } + $fileName = PHPExcel_Shared_File::realpath($fileName); + + // Sadly, some 3rd party xlsx generators don't use consistent case for filenaming + // so we need to load case-insensitively from the zip file + + // Apache POI fixes + $contents = $archive->getFromIndex( + $archive->locateName($fileName, ZIPARCHIVE::FL_NOCASE) + ); + if ($contents === false) { + $contents = $archive->getFromIndex( + $archive->locateName(substr($fileName, 1), ZIPARCHIVE::FL_NOCASE) + ); + } + + return $contents; + } + + + /** + * Loads PHPExcel from file + * + * @param string $pFilename + * @return PHPExcel + * @throws PHPExcel_Reader_Exception + */ + public function load($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + // Initialisations + $excel = new PHPExcel; + $excel->removeSheetByIndex(0); + if (!$this->readDataOnly) { + $excel->removeCellStyleXfByIndex(0); // remove the default style + $excel->removeCellXfByIndex(0); // remove the default style + } + + $zipClass = PHPExcel_Settings::getZipClass(); + + $zip = new $zipClass; + $zip->open($pFilename); + + // Read the theme first, because we need the colour scheme when reading the styles + $wbRels = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, "xl/_rels/workbook.xml.rels")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + foreach ($wbRels->Relationship as $rel) { + switch ($rel["Type"]) { + case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme": + $themeOrderArray = array('lt1', 'dk1', 'lt2', 'dk2'); + $themeOrderAdditional = count($themeOrderArray); + + $xmlTheme = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, "xl/{$rel['Target']}")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); + if (is_object($xmlTheme)) { + $xmlThemeName = $xmlTheme->attributes(); + $xmlTheme = $xmlTheme->children("http://schemas.openxmlformats.org/drawingml/2006/main"); + $themeName = (string)$xmlThemeName['name']; + + $colourScheme = $xmlTheme->themeElements->clrScheme->attributes(); + $colourSchemeName = (string)$colourScheme['name']; + $colourScheme = $xmlTheme->themeElements->clrScheme->children("http://schemas.openxmlformats.org/drawingml/2006/main"); + + $themeColours = array(); + foreach ($colourScheme as $k => $xmlColour) { + $themePos = array_search($k, $themeOrderArray); + if ($themePos === false) { + $themePos = $themeOrderAdditional++; + } + if (isset($xmlColour->sysClr)) { + $xmlColourData = $xmlColour->sysClr->attributes(); + $themeColours[$themePos] = $xmlColourData['lastClr']; + } elseif (isset($xmlColour->srgbClr)) { + $xmlColourData = $xmlColour->srgbClr->attributes(); + $themeColours[$themePos] = $xmlColourData['val']; + } + } + self::$theme = new PHPExcel_Reader_Excel2007_Theme($themeName, $colourSchemeName, $themeColours); + } + break; + } + } + + $rels = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, "_rels/.rels")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + foreach ($rels->Relationship as $rel) { + switch ($rel["Type"]) { + case "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties": + $xmlCore = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, "{$rel['Target']}")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); + if (is_object($xmlCore)) { + $xmlCore->registerXPathNamespace("dc", "http://purl.org/dc/elements/1.1/"); + $xmlCore->registerXPathNamespace("dcterms", "http://purl.org/dc/terms/"); + $xmlCore->registerXPathNamespace("cp", "http://schemas.openxmlformats.org/package/2006/metadata/core-properties"); + $docProps = $excel->getProperties(); + $docProps->setCreator((string) self::getArrayItem($xmlCore->xpath("dc:creator"))); + $docProps->setLastModifiedBy((string) self::getArrayItem($xmlCore->xpath("cp:lastModifiedBy"))); + $docProps->setCreated(strtotime(self::getArrayItem($xmlCore->xpath("dcterms:created")))); //! respect xsi:type + $docProps->setModified(strtotime(self::getArrayItem($xmlCore->xpath("dcterms:modified")))); //! respect xsi:type + $docProps->setTitle((string) self::getArrayItem($xmlCore->xpath("dc:title"))); + $docProps->setDescription((string) self::getArrayItem($xmlCore->xpath("dc:description"))); + $docProps->setSubject((string) self::getArrayItem($xmlCore->xpath("dc:subject"))); + $docProps->setKeywords((string) self::getArrayItem($xmlCore->xpath("cp:keywords"))); + $docProps->setCategory((string) self::getArrayItem($xmlCore->xpath("cp:category"))); + } + break; + case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties": + $xmlCore = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, "{$rel['Target']}")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); + if (is_object($xmlCore)) { + $docProps = $excel->getProperties(); + if (isset($xmlCore->Company)) { + $docProps->setCompany((string) $xmlCore->Company); + } + if (isset($xmlCore->Manager)) { + $docProps->setManager((string) $xmlCore->Manager); + } + } + break; + case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties": + $xmlCore = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, "{$rel['Target']}")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); + if (is_object($xmlCore)) { + $docProps = $excel->getProperties(); + foreach ($xmlCore as $xmlProperty) { + $cellDataOfficeAttributes = $xmlProperty->attributes(); + if (isset($cellDataOfficeAttributes['name'])) { + $propertyName = (string) $cellDataOfficeAttributes['name']; + $cellDataOfficeChildren = $xmlProperty->children('http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes'); + $attributeType = $cellDataOfficeChildren->getName(); + $attributeValue = (string) $cellDataOfficeChildren->{$attributeType}; + $attributeValue = PHPExcel_DocumentProperties::convertProperty($attributeValue, $attributeType); + $attributeType = PHPExcel_DocumentProperties::convertPropertyType($attributeType); + $docProps->setCustomProperty($propertyName, $attributeValue, $attributeType); + } + } + } + break; + //Ribbon + case "http://schemas.microsoft.com/office/2006/relationships/ui/extensibility": + $customUI = $rel['Target']; + if (!is_null($customUI)) { + $this->readRibbon($excel, $customUI, $zip); + } + break; + case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument": + $dir = dirname($rel["Target"]); + $relsWorkbook = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, "$dir/_rels/" . basename($rel["Target"]) . ".rels")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + $relsWorkbook->registerXPathNamespace("rel", "http://schemas.openxmlformats.org/package/2006/relationships"); + + $sharedStrings = array(); + $xpath = self::getArrayItem($relsWorkbook->xpath("rel:Relationship[@Type='http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings']")); + $xmlStrings = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, "$dir/$xpath[Target]")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main"); + if (isset($xmlStrings) && isset($xmlStrings->si)) { + foreach ($xmlStrings->si as $val) { + if (isset($val->t)) { + $sharedStrings[] = PHPExcel_Shared_String::ControlCharacterOOXML2PHP((string) $val->t); + } elseif (isset($val->r)) { + $sharedStrings[] = $this->parseRichText($val); + } + } + } + + $worksheets = array(); + $macros = $customUI = null; + foreach ($relsWorkbook->Relationship as $ele) { + switch ($ele['Type']) { + case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet": + $worksheets[(string) $ele["Id"]] = $ele["Target"]; + break; + // a vbaProject ? (: some macros) + case "http://schemas.microsoft.com/office/2006/relationships/vbaProject": + $macros = $ele["Target"]; + break; + } + } + + if (!is_null($macros)) { + $macrosCode = $this->getFromZipArchive($zip, 'xl/vbaProject.bin');//vbaProject.bin always in 'xl' dir and always named vbaProject.bin + if ($macrosCode !== false) { + $excel->setMacrosCode($macrosCode); + $excel->setHasMacros(true); + //short-circuit : not reading vbaProject.bin.rel to get Signature =>allways vbaProjectSignature.bin in 'xl' dir + $Certificate = $this->getFromZipArchive($zip, 'xl/vbaProjectSignature.bin'); + if ($Certificate !== false) { + $excel->setMacrosCertificate($Certificate); + } + } + } + $styles = array(); + $cellStyles = array(); + $xpath = self::getArrayItem($relsWorkbook->xpath("rel:Relationship[@Type='http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles']")); + $xmlStyles = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, "$dir/$xpath[Target]")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); + //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main"); + + $numFmts = null; + if ($xmlStyles && $xmlStyles->numFmts[0]) { + $numFmts = $xmlStyles->numFmts[0]; + } + if (isset($numFmts) && ($numFmts !== null)) { + $numFmts->registerXPathNamespace("sml", "http://schemas.openxmlformats.org/spreadsheetml/2006/main"); + } + if (!$this->readDataOnly && $xmlStyles) { + foreach ($xmlStyles->cellXfs->xf as $xf) { + $numFmt = PHPExcel_Style_NumberFormat::FORMAT_GENERAL; + if ($xf["numFmtId"]) { + if (isset($numFmts)) { + $tmpNumFmt = self::getArrayItem($numFmts->xpath("sml:numFmt[@numFmtId=$xf[numFmtId]]")); + + if (isset($tmpNumFmt["formatCode"])) { + $numFmt = (string) $tmpNumFmt["formatCode"]; + } + } + + // We shouldn't override any of the built-in MS Excel values (values below id 164) + // But there's a lot of naughty homebrew xlsx writers that do use "reserved" id values that aren't actually used + // So we make allowance for them rather than lose formatting masks + if ((int)$xf["numFmtId"] < 164 && PHPExcel_Style_NumberFormat::builtInFormatCode((int)$xf["numFmtId"]) !== '') { + $numFmt = PHPExcel_Style_NumberFormat::builtInFormatCode((int)$xf["numFmtId"]); + } + } + $quotePrefix = false; + if (isset($xf["quotePrefix"])) { + $quotePrefix = (boolean) $xf["quotePrefix"]; + } + + $style = (object) array( + "numFmt" => $numFmt, + "font" => $xmlStyles->fonts->font[intval($xf["fontId"])], + "fill" => $xmlStyles->fills->fill[intval($xf["fillId"])], + "border" => $xmlStyles->borders->border[intval($xf["borderId"])], + "alignment" => $xf->alignment, + "protection" => $xf->protection, + "quotePrefix" => $quotePrefix, + ); + $styles[] = $style; + + // add style to cellXf collection + $objStyle = new PHPExcel_Style; + self::readStyle($objStyle, $style); + $excel->addCellXf($objStyle); + } + + foreach ($xmlStyles->cellStyleXfs->xf as $xf) { + $numFmt = PHPExcel_Style_NumberFormat::FORMAT_GENERAL; + if ($numFmts && $xf["numFmtId"]) { + $tmpNumFmt = self::getArrayItem($numFmts->xpath("sml:numFmt[@numFmtId=$xf[numFmtId]]")); + if (isset($tmpNumFmt["formatCode"])) { + $numFmt = (string) $tmpNumFmt["formatCode"]; + } elseif ((int)$xf["numFmtId"] < 165) { + $numFmt = PHPExcel_Style_NumberFormat::builtInFormatCode((int)$xf["numFmtId"]); + } + } + + $cellStyle = (object) array( + "numFmt" => $numFmt, + "font" => $xmlStyles->fonts->font[intval($xf["fontId"])], + "fill" => $xmlStyles->fills->fill[intval($xf["fillId"])], + "border" => $xmlStyles->borders->border[intval($xf["borderId"])], + "alignment" => $xf->alignment, + "protection" => $xf->protection, + "quotePrefix" => $quotePrefix, + ); + $cellStyles[] = $cellStyle; + + // add style to cellStyleXf collection + $objStyle = new PHPExcel_Style; + self::readStyle($objStyle, $cellStyle); + $excel->addCellStyleXf($objStyle); + } + } + + $dxfs = array(); + if (!$this->readDataOnly && $xmlStyles) { + // Conditional Styles + if ($xmlStyles->dxfs) { + foreach ($xmlStyles->dxfs->dxf as $dxf) { + $style = new PHPExcel_Style(false, true); + self::readStyle($style, $dxf); + $dxfs[] = $style; + } + } + // Cell Styles + if ($xmlStyles->cellStyles) { + foreach ($xmlStyles->cellStyles->cellStyle as $cellStyle) { + if (intval($cellStyle['builtinId']) == 0) { + if (isset($cellStyles[intval($cellStyle['xfId'])])) { + // Set default style + $style = new PHPExcel_Style; + self::readStyle($style, $cellStyles[intval($cellStyle['xfId'])]); + + // normal style, currently not using it for anything + } + } + } + } + } + + $xmlWorkbook = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, "{$rel['Target']}")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main"); + + // Set base date + if ($xmlWorkbook->workbookPr) { + PHPExcel_Shared_Date::setExcelCalendar(PHPExcel_Shared_Date::CALENDAR_WINDOWS_1900); + if (isset($xmlWorkbook->workbookPr['date1904'])) { + if (self::boolean((string) $xmlWorkbook->workbookPr['date1904'])) { + PHPExcel_Shared_Date::setExcelCalendar(PHPExcel_Shared_Date::CALENDAR_MAC_1904); + } + } + } + + $sheetId = 0; // keep track of new sheet id in final workbook + $oldSheetId = -1; // keep track of old sheet id in final workbook + $countSkippedSheets = 0; // keep track of number of skipped sheets + $mapSheetId = array(); // mapping of sheet ids from old to new + + $charts = $chartDetails = array(); + + if ($xmlWorkbook->sheets) { + foreach ($xmlWorkbook->sheets->sheet as $eleSheet) { + ++$oldSheetId; + + // Check if sheet should be skipped + if (isset($this->loadSheetsOnly) && !in_array((string) $eleSheet["name"], $this->loadSheetsOnly)) { + ++$countSkippedSheets; + $mapSheetId[$oldSheetId] = null; + continue; + } + + // Map old sheet id in original workbook to new sheet id. + // They will differ if loadSheetsOnly() is being used + $mapSheetId[$oldSheetId] = $oldSheetId - $countSkippedSheets; + + // Load sheet + $docSheet = $excel->createSheet(); + // Use false for $updateFormulaCellReferences to prevent adjustment of worksheet + // references in formula cells... during the load, all formulae should be correct, + // and we're simply bringing the worksheet name in line with the formula, not the + // reverse + $docSheet->setTitle((string) $eleSheet["name"], false); + $fileWorksheet = $worksheets[(string) self::getArrayItem($eleSheet->attributes("http://schemas.openxmlformats.org/officeDocument/2006/relationships"), "id")]; + $xmlSheet = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, "$dir/$fileWorksheet")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/spreadsheetml/2006/main"); + + $sharedFormulas = array(); + + if (isset($eleSheet["state"]) && (string) $eleSheet["state"] != '') { + $docSheet->setSheetState((string) $eleSheet["state"]); + } + + if (isset($xmlSheet->sheetViews) && isset($xmlSheet->sheetViews->sheetView)) { + if (isset($xmlSheet->sheetViews->sheetView['zoomScale'])) { + $docSheet->getSheetView()->setZoomScale(intval($xmlSheet->sheetViews->sheetView['zoomScale'])); + } + if (isset($xmlSheet->sheetViews->sheetView['zoomScaleNormal'])) { + $docSheet->getSheetView()->setZoomScaleNormal(intval($xmlSheet->sheetViews->sheetView['zoomScaleNormal'])); + } + if (isset($xmlSheet->sheetViews->sheetView['view'])) { + $docSheet->getSheetView()->setView((string) $xmlSheet->sheetViews->sheetView['view']); + } + if (isset($xmlSheet->sheetViews->sheetView['showGridLines'])) { + $docSheet->setShowGridLines(self::boolean((string)$xmlSheet->sheetViews->sheetView['showGridLines'])); + } + if (isset($xmlSheet->sheetViews->sheetView['showRowColHeaders'])) { + $docSheet->setShowRowColHeaders(self::boolean((string)$xmlSheet->sheetViews->sheetView['showRowColHeaders'])); + } + if (isset($xmlSheet->sheetViews->sheetView['rightToLeft'])) { + $docSheet->setRightToLeft(self::boolean((string)$xmlSheet->sheetViews->sheetView['rightToLeft'])); + } + if (isset($xmlSheet->sheetViews->sheetView->pane)) { + if (isset($xmlSheet->sheetViews->sheetView->pane['topLeftCell'])) { + $docSheet->freezePane((string)$xmlSheet->sheetViews->sheetView->pane['topLeftCell']); + } else { + $xSplit = 0; + $ySplit = 0; + + if (isset($xmlSheet->sheetViews->sheetView->pane['xSplit'])) { + $xSplit = 1 + intval($xmlSheet->sheetViews->sheetView->pane['xSplit']); + } + + if (isset($xmlSheet->sheetViews->sheetView->pane['ySplit'])) { + $ySplit = 1 + intval($xmlSheet->sheetViews->sheetView->pane['ySplit']); + } + + $docSheet->freezePaneByColumnAndRow($xSplit, $ySplit); + } + } + + if (isset($xmlSheet->sheetViews->sheetView->selection)) { + if (isset($xmlSheet->sheetViews->sheetView->selection['sqref'])) { + $sqref = (string)$xmlSheet->sheetViews->sheetView->selection['sqref']; + $sqref = explode(' ', $sqref); + $sqref = $sqref[0]; + $docSheet->setSelectedCells($sqref); + } + } + } + + if (isset($xmlSheet->sheetPr) && isset($xmlSheet->sheetPr->tabColor)) { + if (isset($xmlSheet->sheetPr->tabColor['rgb'])) { + $docSheet->getTabColor()->setARGB((string)$xmlSheet->sheetPr->tabColor['rgb']); + } + } + if (isset($xmlSheet->sheetPr) && isset($xmlSheet->sheetPr['codeName'])) { + $docSheet->setCodeName((string) $xmlSheet->sheetPr['codeName']); + } + if (isset($xmlSheet->sheetPr) && isset($xmlSheet->sheetPr->outlinePr)) { + if (isset($xmlSheet->sheetPr->outlinePr['summaryRight']) && + !self::boolean((string) $xmlSheet->sheetPr->outlinePr['summaryRight'])) { + $docSheet->setShowSummaryRight(false); + } else { + $docSheet->setShowSummaryRight(true); + } + + if (isset($xmlSheet->sheetPr->outlinePr['summaryBelow']) && + !self::boolean((string) $xmlSheet->sheetPr->outlinePr['summaryBelow'])) { + $docSheet->setShowSummaryBelow(false); + } else { + $docSheet->setShowSummaryBelow(true); + } + } + + if (isset($xmlSheet->sheetPr) && isset($xmlSheet->sheetPr->pageSetUpPr)) { + if (isset($xmlSheet->sheetPr->pageSetUpPr['fitToPage']) && + !self::boolean((string) $xmlSheet->sheetPr->pageSetUpPr['fitToPage'])) { + $docSheet->getPageSetup()->setFitToPage(false); + } else { + $docSheet->getPageSetup()->setFitToPage(true); + } + } + + if (isset($xmlSheet->sheetFormatPr)) { + if (isset($xmlSheet->sheetFormatPr['customHeight']) && + self::boolean((string) $xmlSheet->sheetFormatPr['customHeight']) && + isset($xmlSheet->sheetFormatPr['defaultRowHeight'])) { + $docSheet->getDefaultRowDimension()->setRowHeight((float)$xmlSheet->sheetFormatPr['defaultRowHeight']); + } + if (isset($xmlSheet->sheetFormatPr['defaultColWidth'])) { + $docSheet->getDefaultColumnDimension()->setWidth((float)$xmlSheet->sheetFormatPr['defaultColWidth']); + } + if (isset($xmlSheet->sheetFormatPr['zeroHeight']) && + ((string)$xmlSheet->sheetFormatPr['zeroHeight'] == '1')) { + $docSheet->getDefaultRowDimension()->setZeroHeight(true); + } + } + + if (isset($xmlSheet->cols) && !$this->readDataOnly) { + foreach ($xmlSheet->cols->col as $col) { + for ($i = intval($col["min"]) - 1; $i < intval($col["max"]); ++$i) { + if ($col["style"] && !$this->readDataOnly) { + $docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setXfIndex(intval($col["style"])); + } + if (self::boolean($col["bestFit"])) { + //$docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setAutoSize(true); + } + if (self::boolean($col["hidden"])) { + // echo PHPExcel_Cell::stringFromColumnIndex($i), ': HIDDEN COLUMN',PHP_EOL; + $docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setVisible(false); + } + if (self::boolean($col["collapsed"])) { + $docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setCollapsed(true); + } + if ($col["outlineLevel"] > 0) { + $docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setOutlineLevel(intval($col["outlineLevel"])); + } + $docSheet->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($i))->setWidth(floatval($col["width"])); + + if (intval($col["max"]) == 16384) { + break; + } + } + } + } + + if (isset($xmlSheet->printOptions) && !$this->readDataOnly) { + if (self::boolean((string) $xmlSheet->printOptions['gridLinesSet'])) { + $docSheet->setShowGridlines(true); + } + if (self::boolean((string) $xmlSheet->printOptions['gridLines'])) { + $docSheet->setPrintGridlines(true); + } + if (self::boolean((string) $xmlSheet->printOptions['horizontalCentered'])) { + $docSheet->getPageSetup()->setHorizontalCentered(true); + } + if (self::boolean((string) $xmlSheet->printOptions['verticalCentered'])) { + $docSheet->getPageSetup()->setVerticalCentered(true); + } + } + + if ($xmlSheet && $xmlSheet->sheetData && $xmlSheet->sheetData->row) { + foreach ($xmlSheet->sheetData->row as $row) { + if ($row["ht"] && !$this->readDataOnly) { + $docSheet->getRowDimension(intval($row["r"]))->setRowHeight(floatval($row["ht"])); + } + if (self::boolean($row["hidden"]) && !$this->readDataOnly) { + $docSheet->getRowDimension(intval($row["r"]))->setVisible(false); + } + if (self::boolean($row["collapsed"])) { + $docSheet->getRowDimension(intval($row["r"]))->setCollapsed(true); + } + if ($row["outlineLevel"] > 0) { + $docSheet->getRowDimension(intval($row["r"]))->setOutlineLevel(intval($row["outlineLevel"])); + } + if ($row["s"] && !$this->readDataOnly) { + $docSheet->getRowDimension(intval($row["r"]))->setXfIndex(intval($row["s"])); + } + + foreach ($row->c as $c) { + $r = (string) $c["r"]; + $cellDataType = (string) $c["t"]; + $value = null; + $calculatedValue = null; + + // Read cell? + if ($this->getReadFilter() !== null) { + $coordinates = PHPExcel_Cell::coordinateFromString($r); + + if (!$this->getReadFilter()->readCell($coordinates[0], $coordinates[1], $docSheet->getTitle())) { + continue; + } + } + + // echo 'Reading cell ', $coordinates[0], $coordinates[1], PHP_EOL; + // print_r($c); + // echo PHP_EOL; + // echo 'Cell Data Type is ', $cellDataType, ': '; + // + // Read cell! + switch ($cellDataType) { + case "s": + // echo 'String', PHP_EOL; + if ((string)$c->v != '') { + $value = $sharedStrings[intval($c->v)]; + + if ($value instanceof PHPExcel_RichText) { + $value = clone $value; + } + } else { + $value = ''; + } + break; + case "b": + // echo 'Boolean', PHP_EOL; + if (!isset($c->f)) { + $value = self::castToBoolean($c); + } else { + // Formula + $this->castToFormula($c, $r, $cellDataType, $value, $calculatedValue, $sharedFormulas, 'castToBoolean'); + if (isset($c->f['t'])) { + $att = array(); + $att = $c->f; + $docSheet->getCell($r)->setFormulaAttributes($att); + } + // echo '$calculatedValue = ', $calculatedValue, PHP_EOL; + } + break; + case "inlineStr": +// echo 'Inline String', PHP_EOL; + if (isset($c->f)) { + $this->castToFormula($c, $r, $cellDataType, $value, $calculatedValue, $sharedFormulas, 'castToError'); + } else { + $value = $this->parseRichText($c->is); + } + break; + case "e": + // echo 'Error', PHP_EOL; + if (!isset($c->f)) { + $value = self::castToError($c); + } else { + // Formula + $this->castToFormula($c, $r, $cellDataType, $value, $calculatedValue, $sharedFormulas, 'castToError'); + // echo '$calculatedValue = ', $calculatedValue, PHP_EOL; + } + break; + default: +// echo 'Default', PHP_EOL; + if (!isset($c->f)) { + // echo 'Not a Formula', PHP_EOL; + $value = self::castToString($c); + } else { + // echo 'Treat as Formula', PHP_EOL; + // Formula + $this->castToFormula($c, $r, $cellDataType, $value, $calculatedValue, $sharedFormulas, 'castToString'); + // echo '$calculatedValue = ', $calculatedValue, PHP_EOL; + } + break; + } + // echo 'Value is ', $value, PHP_EOL; + + // Check for numeric values + if (is_numeric($value) && $cellDataType != 's') { + if ($value == (int)$value) { + $value = (int)$value; + } elseif ($value == (float)$value) { + $value = (float)$value; + } elseif ($value == (double)$value) { + $value = (double)$value; + } + } + + // Rich text? + if ($value instanceof PHPExcel_RichText && $this->readDataOnly) { + $value = $value->getPlainText(); + } + + $cell = $docSheet->getCell($r); + // Assign value + if ($cellDataType != '') { + $cell->setValueExplicit($value, $cellDataType); + } else { + $cell->setValue($value); + } + if ($calculatedValue !== null) { + $cell->setCalculatedValue($calculatedValue); + } + + // Style information? + if ($c["s"] && !$this->readDataOnly) { + // no style index means 0, it seems + $cell->setXfIndex(isset($styles[intval($c["s"])]) ? + intval($c["s"]) : 0); + } + } + } + } + + $conditionals = array(); + if (!$this->readDataOnly && $xmlSheet && $xmlSheet->conditionalFormatting) { + foreach ($xmlSheet->conditionalFormatting as $conditional) { + foreach ($conditional->cfRule as $cfRule) { + if (((string)$cfRule["type"] == PHPExcel_Style_Conditional::CONDITION_NONE || (string)$cfRule["type"] == PHPExcel_Style_Conditional::CONDITION_CELLIS || (string)$cfRule["type"] == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT || (string)$cfRule["type"] == PHPExcel_Style_Conditional::CONDITION_EXPRESSION) && isset($dxfs[intval($cfRule["dxfId"])])) { + $conditionals[(string) $conditional["sqref"]][intval($cfRule["priority"])] = $cfRule; + } + } + } + + foreach ($conditionals as $ref => $cfRules) { + ksort($cfRules); + $conditionalStyles = array(); + foreach ($cfRules as $cfRule) { + $objConditional = new PHPExcel_Style_Conditional(); + $objConditional->setConditionType((string)$cfRule["type"]); + $objConditional->setOperatorType((string)$cfRule["operator"]); + + if ((string)$cfRule["text"] != '') { + $objConditional->setText((string)$cfRule["text"]); + } + + if (count($cfRule->formula) > 1) { + foreach ($cfRule->formula as $formula) { + $objConditional->addCondition((string)$formula); + } + } else { + $objConditional->addCondition((string)$cfRule->formula); + } + $objConditional->setStyle(clone $dxfs[intval($cfRule["dxfId"])]); + $conditionalStyles[] = $objConditional; + } + + // Extract all cell references in $ref + $cellBlocks = explode(' ', str_replace('$', '', strtoupper($ref))); + foreach ($cellBlocks as $cellBlock) { + $docSheet->getStyle($cellBlock)->setConditionalStyles($conditionalStyles); + } + } + } + + $aKeys = array("sheet", "objects", "scenarios", "formatCells", "formatColumns", "formatRows", "insertColumns", "insertRows", "insertHyperlinks", "deleteColumns", "deleteRows", "selectLockedCells", "sort", "autoFilter", "pivotTables", "selectUnlockedCells"); + if (!$this->readDataOnly && $xmlSheet && $xmlSheet->sheetProtection) { + foreach ($aKeys as $key) { + $method = "set" . ucfirst($key); + $docSheet->getProtection()->$method(self::boolean((string) $xmlSheet->sheetProtection[$key])); + } + } + + if (!$this->readDataOnly && $xmlSheet && $xmlSheet->sheetProtection) { + $docSheet->getProtection()->setPassword((string) $xmlSheet->sheetProtection["password"], true); + if ($xmlSheet->protectedRanges->protectedRange) { + foreach ($xmlSheet->protectedRanges->protectedRange as $protectedRange) { + $docSheet->protectCells((string) $protectedRange["sqref"], (string) $protectedRange["password"], true); + } + } + } + + if ($xmlSheet && $xmlSheet->autoFilter && !$this->readDataOnly) { + $autoFilterRange = (string) $xmlSheet->autoFilter["ref"]; + if (strpos($autoFilterRange, ':') !== false) { + $autoFilter = $docSheet->getAutoFilter(); + $autoFilter->setRange($autoFilterRange); + + foreach ($xmlSheet->autoFilter->filterColumn as $filterColumn) { + $column = $autoFilter->getColumnByOffset((integer) $filterColumn["colId"]); + // Check for standard filters + if ($filterColumn->filters) { + $column->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_FILTER); + $filters = $filterColumn->filters; + if ((isset($filters["blank"])) && ($filters["blank"] == 1)) { + // Operator is undefined, but always treated as EQUAL + $column->createRule()->setRule(null, '')->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_FILTER); + } + // Standard filters are always an OR join, so no join rule needs to be set + // Entries can be either filter elements + foreach ($filters->filter as $filterRule) { + // Operator is undefined, but always treated as EQUAL + $column->createRule()->setRule(null, (string) $filterRule["val"])->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_FILTER); + } + // Or Date Group elements + foreach ($filters->dateGroupItem as $dateGroupItem) { + $column->createRule()->setRule( + // Operator is undefined, but always treated as EQUAL + null, + array( + 'year' => (string) $dateGroupItem["year"], + 'month' => (string) $dateGroupItem["month"], + 'day' => (string) $dateGroupItem["day"], + 'hour' => (string) $dateGroupItem["hour"], + 'minute' => (string) $dateGroupItem["minute"], + 'second' => (string) $dateGroupItem["second"], + ), + (string) $dateGroupItem["dateTimeGrouping"] + ) + ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP); + } + } + // Check for custom filters + if ($filterColumn->customFilters) { + $column->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_CUSTOMFILTER); + $customFilters = $filterColumn->customFilters; + // Custom filters can an AND or an OR join; + // and there should only ever be one or two entries + if ((isset($customFilters["and"])) && ($customFilters["and"] == 1)) { + $column->setJoin(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_AND); + } + foreach ($customFilters->customFilter as $filterRule) { + $column->createRule()->setRule( + (string) $filterRule["operator"], + (string) $filterRule["val"] + ) + ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_CUSTOMFILTER); + } + } + // Check for dynamic filters + if ($filterColumn->dynamicFilter) { + $column->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_DYNAMICFILTER); + // We should only ever have one dynamic filter + foreach ($filterColumn->dynamicFilter as $filterRule) { + $column->createRule()->setRule( + // Operator is undefined, but always treated as EQUAL + null, + (string) $filterRule["val"], + (string) $filterRule["type"] + ) + ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMICFILTER); + if (isset($filterRule["val"])) { + $column->setAttribute('val', (string) $filterRule["val"]); + } + if (isset($filterRule["maxVal"])) { + $column->setAttribute('maxVal', (string) $filterRule["maxVal"]); + } + } + } + // Check for dynamic filters + if ($filterColumn->top10) { + $column->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_TOPTENFILTER); + // We should only ever have one top10 filter + foreach ($filterColumn->top10 as $filterRule) { + $column->createRule()->setRule( + (((isset($filterRule["percent"])) && ($filterRule["percent"] == 1)) + ? PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT + : PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_BY_VALUE + ), + (string) $filterRule["val"], + (((isset($filterRule["top"])) && ($filterRule["top"] == 1)) + ? PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP + : PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_BOTTOM + ) + ) + ->setRuleType(PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_TOPTENFILTER); + } + } + } + } + } + + if ($xmlSheet && $xmlSheet->mergeCells && $xmlSheet->mergeCells->mergeCell && !$this->readDataOnly) { + foreach ($xmlSheet->mergeCells->mergeCell as $mergeCell) { + $mergeRef = (string) $mergeCell["ref"]; + if (strpos($mergeRef, ':') !== false) { + $docSheet->mergeCells((string) $mergeCell["ref"]); + } + } + } + + if ($xmlSheet && $xmlSheet->pageMargins && !$this->readDataOnly) { + $docPageMargins = $docSheet->getPageMargins(); + $docPageMargins->setLeft(floatval($xmlSheet->pageMargins["left"])); + $docPageMargins->setRight(floatval($xmlSheet->pageMargins["right"])); + $docPageMargins->setTop(floatval($xmlSheet->pageMargins["top"])); + $docPageMargins->setBottom(floatval($xmlSheet->pageMargins["bottom"])); + $docPageMargins->setHeader(floatval($xmlSheet->pageMargins["header"])); + $docPageMargins->setFooter(floatval($xmlSheet->pageMargins["footer"])); + } + + if ($xmlSheet && $xmlSheet->pageSetup && !$this->readDataOnly) { + $docPageSetup = $docSheet->getPageSetup(); + + if (isset($xmlSheet->pageSetup["orientation"])) { + $docPageSetup->setOrientation((string) $xmlSheet->pageSetup["orientation"]); + } + if (isset($xmlSheet->pageSetup["paperSize"])) { + $docPageSetup->setPaperSize(intval($xmlSheet->pageSetup["paperSize"])); + } + if (isset($xmlSheet->pageSetup["scale"])) { + $docPageSetup->setScale(intval($xmlSheet->pageSetup["scale"]), false); + } + if (isset($xmlSheet->pageSetup["fitToHeight"]) && intval($xmlSheet->pageSetup["fitToHeight"]) >= 0) { + $docPageSetup->setFitToHeight(intval($xmlSheet->pageSetup["fitToHeight"]), false); + } + if (isset($xmlSheet->pageSetup["fitToWidth"]) && intval($xmlSheet->pageSetup["fitToWidth"]) >= 0) { + $docPageSetup->setFitToWidth(intval($xmlSheet->pageSetup["fitToWidth"]), false); + } + if (isset($xmlSheet->pageSetup["firstPageNumber"]) && isset($xmlSheet->pageSetup["useFirstPageNumber"]) && + self::boolean((string) $xmlSheet->pageSetup["useFirstPageNumber"])) { + $docPageSetup->setFirstPageNumber(intval($xmlSheet->pageSetup["firstPageNumber"])); + } + } + + if ($xmlSheet && $xmlSheet->headerFooter && !$this->readDataOnly) { + $docHeaderFooter = $docSheet->getHeaderFooter(); + + if (isset($xmlSheet->headerFooter["differentOddEven"]) && + self::boolean((string)$xmlSheet->headerFooter["differentOddEven"])) { + $docHeaderFooter->setDifferentOddEven(true); + } else { + $docHeaderFooter->setDifferentOddEven(false); + } + if (isset($xmlSheet->headerFooter["differentFirst"]) && + self::boolean((string)$xmlSheet->headerFooter["differentFirst"])) { + $docHeaderFooter->setDifferentFirst(true); + } else { + $docHeaderFooter->setDifferentFirst(false); + } + if (isset($xmlSheet->headerFooter["scaleWithDoc"]) && + !self::boolean((string)$xmlSheet->headerFooter["scaleWithDoc"])) { + $docHeaderFooter->setScaleWithDocument(false); + } else { + $docHeaderFooter->setScaleWithDocument(true); + } + if (isset($xmlSheet->headerFooter["alignWithMargins"]) && + !self::boolean((string)$xmlSheet->headerFooter["alignWithMargins"])) { + $docHeaderFooter->setAlignWithMargins(false); + } else { + $docHeaderFooter->setAlignWithMargins(true); + } + + $docHeaderFooter->setOddHeader((string) $xmlSheet->headerFooter->oddHeader); + $docHeaderFooter->setOddFooter((string) $xmlSheet->headerFooter->oddFooter); + $docHeaderFooter->setEvenHeader((string) $xmlSheet->headerFooter->evenHeader); + $docHeaderFooter->setEvenFooter((string) $xmlSheet->headerFooter->evenFooter); + $docHeaderFooter->setFirstHeader((string) $xmlSheet->headerFooter->firstHeader); + $docHeaderFooter->setFirstFooter((string) $xmlSheet->headerFooter->firstFooter); + } + + if ($xmlSheet && $xmlSheet->rowBreaks && $xmlSheet->rowBreaks->brk && !$this->readDataOnly) { + foreach ($xmlSheet->rowBreaks->brk as $brk) { + if ($brk["man"]) { + $docSheet->setBreak("A$brk[id]", PHPExcel_Worksheet::BREAK_ROW); + } + } + } + if ($xmlSheet && $xmlSheet->colBreaks && $xmlSheet->colBreaks->brk && !$this->readDataOnly) { + foreach ($xmlSheet->colBreaks->brk as $brk) { + if ($brk["man"]) { + $docSheet->setBreak(PHPExcel_Cell::stringFromColumnIndex((string) $brk["id"]) . "1", PHPExcel_Worksheet::BREAK_COLUMN); + } + } + } + + if ($xmlSheet && $xmlSheet->dataValidations && !$this->readDataOnly) { + foreach ($xmlSheet->dataValidations->dataValidation as $dataValidation) { + // Uppercase coordinate + $range = strtoupper($dataValidation["sqref"]); + $rangeSet = explode(' ', $range); + foreach ($rangeSet as $range) { + $stRange = $docSheet->shrinkRangeToFit($range); + + // Extract all cell references in $range + foreach (PHPExcel_Cell::extractAllCellReferencesInRange($stRange) as $reference) { + // Create validation + $docValidation = $docSheet->getCell($reference)->getDataValidation(); + $docValidation->setType((string) $dataValidation["type"]); + $docValidation->setErrorStyle((string) $dataValidation["errorStyle"]); + $docValidation->setOperator((string) $dataValidation["operator"]); + $docValidation->setAllowBlank($dataValidation["allowBlank"] != 0); + $docValidation->setShowDropDown($dataValidation["showDropDown"] == 0); + $docValidation->setShowInputMessage($dataValidation["showInputMessage"] != 0); + $docValidation->setShowErrorMessage($dataValidation["showErrorMessage"] != 0); + $docValidation->setErrorTitle((string) $dataValidation["errorTitle"]); + $docValidation->setError((string) $dataValidation["error"]); + $docValidation->setPromptTitle((string) $dataValidation["promptTitle"]); + $docValidation->setPrompt((string) $dataValidation["prompt"]); + $docValidation->setFormula1((string) $dataValidation->formula1); + $docValidation->setFormula2((string) $dataValidation->formula2); + } + } + } + } + + // Add hyperlinks + $hyperlinks = array(); + if (!$this->readDataOnly) { + // Locate hyperlink relations + if ($zip->locateName(dirname("$dir/$fileWorksheet") . "/_rels/" . basename($fileWorksheet) . ".rels")) { + $relsWorksheet = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, dirname("$dir/$fileWorksheet") . "/_rels/" . basename($fileWorksheet) . ".rels")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + foreach ($relsWorksheet->Relationship as $ele) { + if ($ele["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink") { + $hyperlinks[(string)$ele["Id"]] = (string)$ele["Target"]; + } + } + } + + // Loop through hyperlinks + if ($xmlSheet && $xmlSheet->hyperlinks) { + foreach ($xmlSheet->hyperlinks->hyperlink as $hyperlink) { + // Link url + $linkRel = $hyperlink->attributes('http://schemas.openxmlformats.org/officeDocument/2006/relationships'); + + foreach (PHPExcel_Cell::extractAllCellReferencesInRange($hyperlink['ref']) as $cellReference) { + $cell = $docSheet->getCell($cellReference); + if (isset($linkRel['id'])) { + $hyperlinkUrl = $hyperlinks[ (string)$linkRel['id'] ]; + if (isset($hyperlink['location'])) { + $hyperlinkUrl .= '#' . (string) $hyperlink['location']; + } + $cell->getHyperlink()->setUrl($hyperlinkUrl); + } elseif (isset($hyperlink['location'])) { + $cell->getHyperlink()->setUrl('sheet://' . (string)$hyperlink['location']); + } + + // Tooltip + if (isset($hyperlink['tooltip'])) { + $cell->getHyperlink()->setTooltip((string)$hyperlink['tooltip']); + } + } + } + } + } + + // Add comments + $comments = array(); + $vmlComments = array(); + if (!$this->readDataOnly) { + // Locate comment relations + if ($zip->locateName(dirname("$dir/$fileWorksheet") . "/_rels/" . basename($fileWorksheet) . ".rels")) { + $relsWorksheet = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, dirname("$dir/$fileWorksheet") . "/_rels/" . basename($fileWorksheet) . ".rels")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + foreach ($relsWorksheet->Relationship as $ele) { + if ($ele["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments") { + $comments[(string)$ele["Id"]] = (string)$ele["Target"]; + } + if ($ele["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing") { + $vmlComments[(string)$ele["Id"]] = (string)$ele["Target"]; + } + } + } + + // Loop through comments + foreach ($comments as $relName => $relPath) { + // Load comments file + $relPath = PHPExcel_Shared_File::realpath(dirname("$dir/$fileWorksheet") . "/" . $relPath); + $commentsFile = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, $relPath)), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); + + // Utility variables + $authors = array(); + + // Loop through authors + foreach ($commentsFile->authors->author as $author) { + $authors[] = (string)$author; + } + + // Loop through contents + foreach ($commentsFile->commentList->comment as $comment) { + if (!empty($comment['authorId'])) { + $docSheet->getComment((string)$comment['ref'])->setAuthor($authors[(string)$comment['authorId']]); + } + $docSheet->getComment((string)$comment['ref'])->setText($this->parseRichText($comment->text)); + } + } + + // Loop through VML comments + foreach ($vmlComments as $relName => $relPath) { + // Load VML comments file + $relPath = PHPExcel_Shared_File::realpath(dirname("$dir/$fileWorksheet") . "/" . $relPath); + $vmlCommentsFile = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, $relPath)), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); + $vmlCommentsFile->registerXPathNamespace('v', 'urn:schemas-microsoft-com:vml'); + + $shapes = $vmlCommentsFile->xpath('//v:shape'); + foreach ($shapes as $shape) { + $shape->registerXPathNamespace('v', 'urn:schemas-microsoft-com:vml'); + + if (isset($shape['style'])) { + $style = (string)$shape['style']; + $fillColor = strtoupper(substr((string)$shape['fillcolor'], 1)); + $column = null; + $row = null; + + $clientData = $shape->xpath('.//x:ClientData'); + if (is_array($clientData) && !empty($clientData)) { + $clientData = $clientData[0]; + + if (isset($clientData['ObjectType']) && (string)$clientData['ObjectType'] == 'Note') { + $temp = $clientData->xpath('.//x:Row'); + if (is_array($temp)) { + $row = $temp[0]; + } + + $temp = $clientData->xpath('.//x:Column'); + if (is_array($temp)) { + $column = $temp[0]; + } + } + } + + if (($column !== null) && ($row !== null)) { + // Set comment properties + $comment = $docSheet->getCommentByColumnAndRow((string) $column, $row + 1); + $comment->getFillColor()->setRGB($fillColor); + + // Parse style + $styleArray = explode(';', str_replace(' ', '', $style)); + foreach ($styleArray as $stylePair) { + $stylePair = explode(':', $stylePair); + + if ($stylePair[0] == 'margin-left') { + $comment->setMarginLeft($stylePair[1]); + } + if ($stylePair[0] == 'margin-top') { + $comment->setMarginTop($stylePair[1]); + } + if ($stylePair[0] == 'width') { + $comment->setWidth($stylePair[1]); + } + if ($stylePair[0] == 'height') { + $comment->setHeight($stylePair[1]); + } + if ($stylePair[0] == 'visibility') { + $comment->setVisible($stylePair[1] == 'visible'); + } + } + } + } + } + } + + // Header/footer images + if ($xmlSheet && $xmlSheet->legacyDrawingHF && !$this->readDataOnly) { + if ($zip->locateName(dirname("$dir/$fileWorksheet") . "/_rels/" . basename($fileWorksheet) . ".rels")) { + $relsWorksheet = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, dirname("$dir/$fileWorksheet") . "/_rels/" . basename($fileWorksheet) . ".rels")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + $vmlRelationship = ''; + + foreach ($relsWorksheet->Relationship as $ele) { + if ($ele["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing") { + $vmlRelationship = self::dirAdd("$dir/$fileWorksheet", $ele["Target"]); + } + } + + if ($vmlRelationship != '') { + // Fetch linked images + $relsVML = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, dirname($vmlRelationship) . '/_rels/' . basename($vmlRelationship) . '.rels')), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + $drawings = array(); + foreach ($relsVML->Relationship as $ele) { + if ($ele["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image") { + $drawings[(string) $ele["Id"]] = self::dirAdd($vmlRelationship, $ele["Target"]); + } + } + + // Fetch VML document + $vmlDrawing = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, $vmlRelationship)), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); + $vmlDrawing->registerXPathNamespace('v', 'urn:schemas-microsoft-com:vml'); + + $hfImages = array(); + + $shapes = $vmlDrawing->xpath('//v:shape'); + foreach ($shapes as $idx => $shape) { + $shape->registerXPathNamespace('v', 'urn:schemas-microsoft-com:vml'); + $imageData = $shape->xpath('//v:imagedata'); + $imageData = $imageData[$idx]; + + $imageData = $imageData->attributes('urn:schemas-microsoft-com:office:office'); + $style = self::toCSSArray((string)$shape['style']); + + $hfImages[ (string)$shape['id'] ] = new PHPExcel_Worksheet_HeaderFooterDrawing(); + if (isset($imageData['title'])) { + $hfImages[ (string)$shape['id'] ]->setName((string)$imageData['title']); + } + + $hfImages[ (string)$shape['id'] ]->setPath("zip://".PHPExcel_Shared_File::realpath($pFilename)."#" . $drawings[(string)$imageData['relid']], false); + $hfImages[ (string)$shape['id'] ]->setResizeProportional(false); + $hfImages[ (string)$shape['id'] ]->setWidth($style['width']); + $hfImages[ (string)$shape['id'] ]->setHeight($style['height']); + if (isset($style['margin-left'])) { + $hfImages[ (string)$shape['id'] ]->setOffsetX($style['margin-left']); + } + $hfImages[ (string)$shape['id'] ]->setOffsetY($style['margin-top']); + $hfImages[ (string)$shape['id'] ]->setResizeProportional(true); + } + + $docSheet->getHeaderFooter()->setImages($hfImages); + } + } + } + + } + + // TODO: Autoshapes from twoCellAnchors! + if ($zip->locateName(dirname("$dir/$fileWorksheet") . "/_rels/" . basename($fileWorksheet) . ".rels")) { + $relsWorksheet = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, dirname("$dir/$fileWorksheet") . "/_rels/" . basename($fileWorksheet) . ".rels")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + $drawings = array(); + foreach ($relsWorksheet->Relationship as $ele) { + if ($ele["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing") { + $drawings[(string) $ele["Id"]] = self::dirAdd("$dir/$fileWorksheet", $ele["Target"]); + } + } + if ($xmlSheet->drawing && !$this->readDataOnly) { + foreach ($xmlSheet->drawing as $drawing) { + $fileDrawing = $drawings[(string) self::getArrayItem($drawing->attributes("http://schemas.openxmlformats.org/officeDocument/2006/relationships"), "id")]; + $relsDrawing = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, dirname($fileDrawing) . "/_rels/" . basename($fileDrawing) . ".rels")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); //~ http://schemas.openxmlformats.org/package/2006/relationships"); + $images = array(); + + if ($relsDrawing && $relsDrawing->Relationship) { + foreach ($relsDrawing->Relationship as $ele) { + if ($ele["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image") { + $images[(string) $ele["Id"]] = self::dirAdd($fileDrawing, $ele["Target"]); + } elseif ($ele["Type"] == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart") { + if ($this->includeCharts) { + $charts[self::dirAdd($fileDrawing, $ele["Target"])] = array( + 'id' => (string) $ele["Id"], + 'sheet' => $docSheet->getTitle() + ); + } + } + } + } + $xmlDrawing = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, $fileDrawing)), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions())->children("http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"); + + if ($xmlDrawing->oneCellAnchor) { + foreach ($xmlDrawing->oneCellAnchor as $oneCellAnchor) { + if ($oneCellAnchor->pic->blipFill) { + $blip = $oneCellAnchor->pic->blipFill->children("http://schemas.openxmlformats.org/drawingml/2006/main")->blip; + $xfrm = $oneCellAnchor->pic->spPr->children("http://schemas.openxmlformats.org/drawingml/2006/main")->xfrm; + $outerShdw = $oneCellAnchor->pic->spPr->children("http://schemas.openxmlformats.org/drawingml/2006/main")->effectLst->outerShdw; + $objDrawing = new PHPExcel_Worksheet_Drawing; + $objDrawing->setName((string) self::getArrayItem($oneCellAnchor->pic->nvPicPr->cNvPr->attributes(), "name")); + $objDrawing->setDescription((string) self::getArrayItem($oneCellAnchor->pic->nvPicPr->cNvPr->attributes(), "descr")); + $objDrawing->setPath("zip://".PHPExcel_Shared_File::realpath($pFilename)."#" . $images[(string) self::getArrayItem($blip->attributes("http://schemas.openxmlformats.org/officeDocument/2006/relationships"), "embed")], false); + $objDrawing->setCoordinates(PHPExcel_Cell::stringFromColumnIndex((string) $oneCellAnchor->from->col) . ($oneCellAnchor->from->row + 1)); + $objDrawing->setOffsetX(PHPExcel_Shared_Drawing::EMUToPixels($oneCellAnchor->from->colOff)); + $objDrawing->setOffsetY(PHPExcel_Shared_Drawing::EMUToPixels($oneCellAnchor->from->rowOff)); + $objDrawing->setResizeProportional(false); + $objDrawing->setWidth(PHPExcel_Shared_Drawing::EMUToPixels(self::getArrayItem($oneCellAnchor->ext->attributes(), "cx"))); + $objDrawing->setHeight(PHPExcel_Shared_Drawing::EMUToPixels(self::getArrayItem($oneCellAnchor->ext->attributes(), "cy"))); + if ($xfrm) { + $objDrawing->setRotation(PHPExcel_Shared_Drawing::angleToDegrees(self::getArrayItem($xfrm->attributes(), "rot"))); + } + if ($outerShdw) { + $shadow = $objDrawing->getShadow(); + $shadow->setVisible(true); + $shadow->setBlurRadius(PHPExcel_Shared_Drawing::EMUTopixels(self::getArrayItem($outerShdw->attributes(), "blurRad"))); + $shadow->setDistance(PHPExcel_Shared_Drawing::EMUTopixels(self::getArrayItem($outerShdw->attributes(), "dist"))); + $shadow->setDirection(PHPExcel_Shared_Drawing::angleToDegrees(self::getArrayItem($outerShdw->attributes(), "dir"))); + $shadow->setAlignment((string) self::getArrayItem($outerShdw->attributes(), "algn")); + $shadow->getColor()->setRGB(self::getArrayItem($outerShdw->srgbClr->attributes(), "val")); + $shadow->setAlpha(self::getArrayItem($outerShdw->srgbClr->alpha->attributes(), "val") / 1000); + } + $objDrawing->setWorksheet($docSheet); + } else { + // ? Can charts be positioned with a oneCellAnchor ? + $coordinates = PHPExcel_Cell::stringFromColumnIndex((string) $oneCellAnchor->from->col) . ($oneCellAnchor->from->row + 1); + $offsetX = PHPExcel_Shared_Drawing::EMUToPixels($oneCellAnchor->from->colOff); + $offsetY = PHPExcel_Shared_Drawing::EMUToPixels($oneCellAnchor->from->rowOff); + $width = PHPExcel_Shared_Drawing::EMUToPixels(self::getArrayItem($oneCellAnchor->ext->attributes(), "cx")); + $height = PHPExcel_Shared_Drawing::EMUToPixels(self::getArrayItem($oneCellAnchor->ext->attributes(), "cy")); + } + } + } + if ($xmlDrawing->twoCellAnchor) { + foreach ($xmlDrawing->twoCellAnchor as $twoCellAnchor) { + if ($twoCellAnchor->pic->blipFill) { + $blip = $twoCellAnchor->pic->blipFill->children("http://schemas.openxmlformats.org/drawingml/2006/main")->blip; + $xfrm = $twoCellAnchor->pic->spPr->children("http://schemas.openxmlformats.org/drawingml/2006/main")->xfrm; + $outerShdw = $twoCellAnchor->pic->spPr->children("http://schemas.openxmlformats.org/drawingml/2006/main")->effectLst->outerShdw; + $objDrawing = new PHPExcel_Worksheet_Drawing; + $objDrawing->setName((string) self::getArrayItem($twoCellAnchor->pic->nvPicPr->cNvPr->attributes(), "name")); + $objDrawing->setDescription((string) self::getArrayItem($twoCellAnchor->pic->nvPicPr->cNvPr->attributes(), "descr")); + $objDrawing->setPath("zip://".PHPExcel_Shared_File::realpath($pFilename)."#" . $images[(string) self::getArrayItem($blip->attributes("http://schemas.openxmlformats.org/officeDocument/2006/relationships"), "embed")], false); + $objDrawing->setCoordinates(PHPExcel_Cell::stringFromColumnIndex((string) $twoCellAnchor->from->col) . ($twoCellAnchor->from->row + 1)); + $objDrawing->setOffsetX(PHPExcel_Shared_Drawing::EMUToPixels($twoCellAnchor->from->colOff)); + $objDrawing->setOffsetY(PHPExcel_Shared_Drawing::EMUToPixels($twoCellAnchor->from->rowOff)); + $objDrawing->setResizeProportional(false); + + if ($xfrm) { + $objDrawing->setWidth(PHPExcel_Shared_Drawing::EMUToPixels(self::getArrayItem($xfrm->ext->attributes(), "cx"))); + $objDrawing->setHeight(PHPExcel_Shared_Drawing::EMUToPixels(self::getArrayItem($xfrm->ext->attributes(), "cy"))); + $objDrawing->setRotation(PHPExcel_Shared_Drawing::angleToDegrees(self::getArrayItem($xfrm->attributes(), "rot"))); + } + if ($outerShdw) { + $shadow = $objDrawing->getShadow(); + $shadow->setVisible(true); + $shadow->setBlurRadius(PHPExcel_Shared_Drawing::EMUTopixels(self::getArrayItem($outerShdw->attributes(), "blurRad"))); + $shadow->setDistance(PHPExcel_Shared_Drawing::EMUTopixels(self::getArrayItem($outerShdw->attributes(), "dist"))); + $shadow->setDirection(PHPExcel_Shared_Drawing::angleToDegrees(self::getArrayItem($outerShdw->attributes(), "dir"))); + $shadow->setAlignment((string) self::getArrayItem($outerShdw->attributes(), "algn")); + $shadow->getColor()->setRGB(self::getArrayItem($outerShdw->srgbClr->attributes(), "val")); + $shadow->setAlpha(self::getArrayItem($outerShdw->srgbClr->alpha->attributes(), "val") / 1000); + } + $objDrawing->setWorksheet($docSheet); + } elseif (($this->includeCharts) && ($twoCellAnchor->graphicFrame)) { + $fromCoordinate = PHPExcel_Cell::stringFromColumnIndex((string) $twoCellAnchor->from->col) . ($twoCellAnchor->from->row + 1); + $fromOffsetX = PHPExcel_Shared_Drawing::EMUToPixels($twoCellAnchor->from->colOff); + $fromOffsetY = PHPExcel_Shared_Drawing::EMUToPixels($twoCellAnchor->from->rowOff); + $toCoordinate = PHPExcel_Cell::stringFromColumnIndex((string) $twoCellAnchor->to->col) . ($twoCellAnchor->to->row + 1); + $toOffsetX = PHPExcel_Shared_Drawing::EMUToPixels($twoCellAnchor->to->colOff); + $toOffsetY = PHPExcel_Shared_Drawing::EMUToPixels($twoCellAnchor->to->rowOff); + $graphic = $twoCellAnchor->graphicFrame->children("http://schemas.openxmlformats.org/drawingml/2006/main")->graphic; + $chartRef = $graphic->graphicData->children("http://schemas.openxmlformats.org/drawingml/2006/chart")->chart; + $thisChart = (string) $chartRef->attributes("http://schemas.openxmlformats.org/officeDocument/2006/relationships"); + + $chartDetails[$docSheet->getTitle().'!'.$thisChart] = array( + 'fromCoordinate' => $fromCoordinate, + 'fromOffsetX' => $fromOffsetX, + 'fromOffsetY' => $fromOffsetY, + 'toCoordinate' => $toCoordinate, + 'toOffsetX' => $toOffsetX, + 'toOffsetY' => $toOffsetY, + 'worksheetTitle' => $docSheet->getTitle() + ); + } + } + } + } + } + } + + // Loop through definedNames + if ($xmlWorkbook->definedNames) { + foreach ($xmlWorkbook->definedNames->definedName as $definedName) { + // Extract range + $extractedRange = (string)$definedName; + $extractedRange = preg_replace('/\'(\w+)\'\!/', '', $extractedRange); + if (($spos = strpos($extractedRange, '!')) !== false) { + $extractedRange = substr($extractedRange, 0, $spos).str_replace('$', '', substr($extractedRange, $spos)); + } else { + $extractedRange = str_replace('$', '', $extractedRange); + } + + // Valid range? + if (stripos((string)$definedName, '#REF!') !== false || $extractedRange == '') { + continue; + } + + // Some definedNames are only applicable if we are on the same sheet... + if ((string)$definedName['localSheetId'] != '' && (string)$definedName['localSheetId'] == $sheetId) { + // Switch on type + switch ((string)$definedName['name']) { + case '_xlnm._FilterDatabase': + if ((string)$definedName['hidden'] !== '1') { + $extractedRange = explode(',', $extractedRange); + foreach ($extractedRange as $range) { + $autoFilterRange = $range; + if (strpos($autoFilterRange, ':') !== false) { + $docSheet->getAutoFilter()->setRange($autoFilterRange); + } + } + } + break; + case '_xlnm.Print_Titles': + // Split $extractedRange + $extractedRange = explode(',', $extractedRange); + + // Set print titles + foreach ($extractedRange as $range) { + $matches = array(); + $range = str_replace('$', '', $range); + + // check for repeating columns, e g. 'A:A' or 'A:D' + if (preg_match('/!?([A-Z]+)\:([A-Z]+)$/', $range, $matches)) { + $docSheet->getPageSetup()->setColumnsToRepeatAtLeft(array($matches[1], $matches[2])); + } elseif (preg_match('/!?(\d+)\:(\d+)$/', $range, $matches)) { + // check for repeating rows, e.g. '1:1' or '1:5' + $docSheet->getPageSetup()->setRowsToRepeatAtTop(array($matches[1], $matches[2])); + } + } + break; + case '_xlnm.Print_Area': + $rangeSets = explode(',', $extractedRange); // FIXME: what if sheetname contains comma? + $newRangeSets = array(); + foreach ($rangeSets as $rangeSet) { + $range = explode('!', $rangeSet); // FIXME: what if sheetname contains exclamation mark? + $rangeSet = isset($range[1]) ? $range[1] : $range[0]; + if (strpos($rangeSet, ':') === false) { + $rangeSet = $rangeSet . ':' . $rangeSet; + } + $newRangeSets[] = str_replace('$', '', $rangeSet); + } + $docSheet->getPageSetup()->setPrintArea(implode(',', $newRangeSets)); + break; + + default: + break; + } + } + } + } + + // Next sheet id + ++$sheetId; + } + + // Loop through definedNames + if ($xmlWorkbook->definedNames) { + foreach ($xmlWorkbook->definedNames->definedName as $definedName) { + // Extract range + $extractedRange = (string)$definedName; + $extractedRange = preg_replace('/\'(\w+)\'\!/', '', $extractedRange); + if (($spos = strpos($extractedRange, '!')) !== false) { + $extractedRange = substr($extractedRange, 0, $spos).str_replace('$', '', substr($extractedRange, $spos)); + } else { + $extractedRange = str_replace('$', '', $extractedRange); + } + + // Valid range? + if (stripos((string)$definedName, '#REF!') !== false || $extractedRange == '') { + continue; + } + + // Some definedNames are only applicable if we are on the same sheet... + if ((string)$definedName['localSheetId'] != '') { + // Local defined name + // Switch on type + switch ((string)$definedName['name']) { + case '_xlnm._FilterDatabase': + case '_xlnm.Print_Titles': + case '_xlnm.Print_Area': + break; + default: + if ($mapSheetId[(integer) $definedName['localSheetId']] !== null) { + $range = explode('!', (string)$definedName); + if (count($range) == 2) { + $range[0] = str_replace("''", "'", $range[0]); + $range[0] = str_replace("'", "", $range[0]); + if ($worksheet = $docSheet->getParent()->getSheetByName($range[0])) { + $extractedRange = str_replace('$', '', $range[1]); + $scope = $docSheet->getParent()->getSheet($mapSheetId[(integer) $definedName['localSheetId']]); + $excel->addNamedRange(new PHPExcel_NamedRange((string)$definedName['name'], $worksheet, $extractedRange, true, $scope)); + } + } + } + break; + } + } elseif (!isset($definedName['localSheetId'])) { + // "Global" definedNames + $locatedSheet = null; + $extractedSheetName = ''; + if (strpos((string)$definedName, '!') !== false) { + // Extract sheet name + $extractedSheetName = PHPExcel_Worksheet::extractSheetTitle((string)$definedName, true); + $extractedSheetName = $extractedSheetName[0]; + + // Locate sheet + $locatedSheet = $excel->getSheetByName($extractedSheetName); + + // Modify range + $range = explode('!', $extractedRange); + $extractedRange = isset($range[1]) ? $range[1] : $range[0]; + } + + if ($locatedSheet !== null) { + $excel->addNamedRange(new PHPExcel_NamedRange((string)$definedName['name'], $locatedSheet, $extractedRange, false)); + } + } + } + } + } + + if ((!$this->readDataOnly) || (!empty($this->loadSheetsOnly))) { + // active sheet index + $activeTab = intval($xmlWorkbook->bookViews->workbookView["activeTab"]); // refers to old sheet index + + // keep active sheet index if sheet is still loaded, else first sheet is set as the active + if (isset($mapSheetId[$activeTab]) && $mapSheetId[$activeTab] !== null) { + $excel->setActiveSheetIndex($mapSheetId[$activeTab]); + } else { + if ($excel->getSheetCount() == 0) { + $excel->createSheet(); + } + $excel->setActiveSheetIndex(0); + } + } + break; + } + } + + if (!$this->readDataOnly) { + $contentTypes = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, "[Content_Types].xml")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); + foreach ($contentTypes->Override as $contentType) { + switch ($contentType["ContentType"]) { + case "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": + if ($this->includeCharts) { + $chartEntryRef = ltrim($contentType['PartName'], '/'); + $chartElements = simplexml_load_string($this->securityScan($this->getFromZipArchive($zip, $chartEntryRef)), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); + $objChart = PHPExcel_Reader_Excel2007_Chart::readChart($chartElements, basename($chartEntryRef, '.xml')); + +// echo 'Chart ', $chartEntryRef, '
'; +// var_dump($charts[$chartEntryRef]); +// + if (isset($charts[$chartEntryRef])) { + $chartPositionRef = $charts[$chartEntryRef]['sheet'].'!'.$charts[$chartEntryRef]['id']; +// echo 'Position Ref ', $chartPositionRef, '
'; + if (isset($chartDetails[$chartPositionRef])) { +// var_dump($chartDetails[$chartPositionRef]); + + $excel->getSheetByName($charts[$chartEntryRef]['sheet'])->addChart($objChart); + $objChart->setWorksheet($excel->getSheetByName($charts[$chartEntryRef]['sheet'])); + $objChart->setTopLeftPosition($chartDetails[$chartPositionRef]['fromCoordinate'], $chartDetails[$chartPositionRef]['fromOffsetX'], $chartDetails[$chartPositionRef]['fromOffsetY']); + $objChart->setBottomRightPosition($chartDetails[$chartPositionRef]['toCoordinate'], $chartDetails[$chartPositionRef]['toOffsetX'], $chartDetails[$chartPositionRef]['toOffsetY']); + } + } + } + } + } + } + + $zip->close(); + + return $excel; + } + + private static function readColor($color, $background = false) + { + if (isset($color["rgb"])) { + return (string)$color["rgb"]; + } elseif (isset($color["indexed"])) { + return PHPExcel_Style_Color::indexedColor($color["indexed"]-7, $background)->getARGB(); + } elseif (isset($color["theme"])) { + if (self::$theme !== null) { + $returnColour = self::$theme->getColourByIndex((int)$color["theme"]); + if (isset($color["tint"])) { + $tintAdjust = (float) $color["tint"]; + $returnColour = PHPExcel_Style_Color::changeBrightness($returnColour, $tintAdjust); + } + return 'FF'.$returnColour; + } + } + + if ($background) { + return 'FFFFFFFF'; + } + return 'FF000000'; + } + + private static function readStyle($docStyle, $style) + { + // format code +// if (isset($style->numFmt)) { +// if (isset($style->numFmt['formatCode'])) { +// $docStyle->getNumberFormat()->setFormatCode((string) $style->numFmt['formatCode']); +// } else { + $docStyle->getNumberFormat()->setFormatCode($style->numFmt); +// } +// } + + // font + if (isset($style->font)) { + $docStyle->getFont()->setName((string) $style->font->name["val"]); + $docStyle->getFont()->setSize((string) $style->font->sz["val"]); + if (isset($style->font->b)) { + $docStyle->getFont()->setBold(!isset($style->font->b["val"]) || self::boolean((string) $style->font->b["val"])); + } + if (isset($style->font->i)) { + $docStyle->getFont()->setItalic(!isset($style->font->i["val"]) || self::boolean((string) $style->font->i["val"])); + } + if (isset($style->font->strike)) { + $docStyle->getFont()->setStrikethrough(!isset($style->font->strike["val"]) || self::boolean((string) $style->font->strike["val"])); + } + $docStyle->getFont()->getColor()->setARGB(self::readColor($style->font->color)); + + if (isset($style->font->u) && !isset($style->font->u["val"])) { + $docStyle->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE); + } elseif (isset($style->font->u) && isset($style->font->u["val"])) { + $docStyle->getFont()->setUnderline((string)$style->font->u["val"]); + } + + if (isset($style->font->vertAlign) && isset($style->font->vertAlign["val"])) { + $vertAlign = strtolower((string)$style->font->vertAlign["val"]); + if ($vertAlign == 'superscript') { + $docStyle->getFont()->setSuperScript(true); + } + if ($vertAlign == 'subscript') { + $docStyle->getFont()->setSubScript(true); + } + } + } + + // fill + if (isset($style->fill)) { + if ($style->fill->gradientFill) { + $gradientFill = $style->fill->gradientFill[0]; + if (!empty($gradientFill["type"])) { + $docStyle->getFill()->setFillType((string) $gradientFill["type"]); + } + $docStyle->getFill()->setRotation(floatval($gradientFill["degree"])); + $gradientFill->registerXPathNamespace("sml", "http://schemas.openxmlformats.org/spreadsheetml/2006/main"); + $docStyle->getFill()->getStartColor()->setARGB(self::readColor(self::getArrayItem($gradientFill->xpath("sml:stop[@position=0]"))->color)); + $docStyle->getFill()->getEndColor()->setARGB(self::readColor(self::getArrayItem($gradientFill->xpath("sml:stop[@position=1]"))->color)); + } elseif ($style->fill->patternFill) { + $patternType = (string)$style->fill->patternFill["patternType"] != '' ? (string)$style->fill->patternFill["patternType"] : 'solid'; + $docStyle->getFill()->setFillType($patternType); + if ($style->fill->patternFill->fgColor) { + $docStyle->getFill()->getStartColor()->setARGB(self::readColor($style->fill->patternFill->fgColor, true)); + } else { + $docStyle->getFill()->getStartColor()->setARGB('FF000000'); + } + if ($style->fill->patternFill->bgColor) { + $docStyle->getFill()->getEndColor()->setARGB(self::readColor($style->fill->patternFill->bgColor, true)); + } + } + } + + // border + if (isset($style->border)) { + $diagonalUp = self::boolean((string) $style->border["diagonalUp"]); + $diagonalDown = self::boolean((string) $style->border["diagonalDown"]); + if (!$diagonalUp && !$diagonalDown) { + $docStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_NONE); + } elseif ($diagonalUp && !$diagonalDown) { + $docStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_UP); + } elseif (!$diagonalUp && $diagonalDown) { + $docStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_DOWN); + } else { + $docStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_BOTH); + } + self::readBorder($docStyle->getBorders()->getLeft(), $style->border->left); + self::readBorder($docStyle->getBorders()->getRight(), $style->border->right); + self::readBorder($docStyle->getBorders()->getTop(), $style->border->top); + self::readBorder($docStyle->getBorders()->getBottom(), $style->border->bottom); + self::readBorder($docStyle->getBorders()->getDiagonal(), $style->border->diagonal); + } + + // alignment + if (isset($style->alignment)) { + $docStyle->getAlignment()->setHorizontal((string) $style->alignment["horizontal"]); + $docStyle->getAlignment()->setVertical((string) $style->alignment["vertical"]); + + $textRotation = 0; + if ((int)$style->alignment["textRotation"] <= 90) { + $textRotation = (int)$style->alignment["textRotation"]; + } elseif ((int)$style->alignment["textRotation"] > 90) { + $textRotation = 90 - (int)$style->alignment["textRotation"]; + } + + $docStyle->getAlignment()->setTextRotation(intval($textRotation)); + $docStyle->getAlignment()->setWrapText(self::boolean((string) $style->alignment["wrapText"])); + $docStyle->getAlignment()->setShrinkToFit(self::boolean((string) $style->alignment["shrinkToFit"])); + $docStyle->getAlignment()->setIndent(intval((string)$style->alignment["indent"]) > 0 ? intval((string)$style->alignment["indent"]) : 0); + $docStyle->getAlignment()->setReadorder(intval((string)$style->alignment["readingOrder"]) > 0 ? intval((string)$style->alignment["readingOrder"]) : 0); + } + + // protection + if (isset($style->protection)) { + if (isset($style->protection['locked'])) { + if (self::boolean((string) $style->protection['locked'])) { + $docStyle->getProtection()->setLocked(PHPExcel_Style_Protection::PROTECTION_PROTECTED); + } else { + $docStyle->getProtection()->setLocked(PHPExcel_Style_Protection::PROTECTION_UNPROTECTED); + } + } + + if (isset($style->protection['hidden'])) { + if (self::boolean((string) $style->protection['hidden'])) { + $docStyle->getProtection()->setHidden(PHPExcel_Style_Protection::PROTECTION_PROTECTED); + } else { + $docStyle->getProtection()->setHidden(PHPExcel_Style_Protection::PROTECTION_UNPROTECTED); + } + } + } + + // top-level style settings + if (isset($style->quotePrefix)) { + $docStyle->setQuotePrefix($style->quotePrefix); + } + } + + private static function readBorder($docBorder, $eleBorder) + { + if (isset($eleBorder["style"])) { + $docBorder->setBorderStyle((string) $eleBorder["style"]); + } + if (isset($eleBorder->color)) { + $docBorder->getColor()->setARGB(self::readColor($eleBorder->color)); + } + } + + private function parseRichText($is = null) + { + $value = new PHPExcel_RichText(); + + if (isset($is->t)) { + $value->createText(PHPExcel_Shared_String::ControlCharacterOOXML2PHP((string) $is->t)); + } else { + if (is_object($is->r)) { + foreach ($is->r as $run) { + if (!isset($run->rPr)) { + $objText = $value->createText(PHPExcel_Shared_String::ControlCharacterOOXML2PHP((string) $run->t)); + + } else { + $objText = $value->createTextRun(PHPExcel_Shared_String::ControlCharacterOOXML2PHP((string) $run->t)); + + if (isset($run->rPr->rFont["val"])) { + $objText->getFont()->setName((string) $run->rPr->rFont["val"]); + } + if (isset($run->rPr->sz["val"])) { + $objText->getFont()->setSize((string) $run->rPr->sz["val"]); + } + if (isset($run->rPr->color)) { + $objText->getFont()->setColor(new PHPExcel_Style_Color(self::readColor($run->rPr->color))); + } + if ((isset($run->rPr->b["val"]) && self::boolean((string) $run->rPr->b["val"])) || + (isset($run->rPr->b) && !isset($run->rPr->b["val"]))) { + $objText->getFont()->setBold(true); + } + if ((isset($run->rPr->i["val"]) && self::boolean((string) $run->rPr->i["val"])) || + (isset($run->rPr->i) && !isset($run->rPr->i["val"]))) { + $objText->getFont()->setItalic(true); + } + if (isset($run->rPr->vertAlign) && isset($run->rPr->vertAlign["val"])) { + $vertAlign = strtolower((string)$run->rPr->vertAlign["val"]); + if ($vertAlign == 'superscript') { + $objText->getFont()->setSuperScript(true); + } + if ($vertAlign == 'subscript') { + $objText->getFont()->setSubScript(true); + } + } + if (isset($run->rPr->u) && !isset($run->rPr->u["val"])) { + $objText->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE); + } elseif (isset($run->rPr->u) && isset($run->rPr->u["val"])) { + $objText->getFont()->setUnderline((string)$run->rPr->u["val"]); + } + if ((isset($run->rPr->strike["val"]) && self::boolean((string) $run->rPr->strike["val"])) || + (isset($run->rPr->strike) && !isset($run->rPr->strike["val"]))) { + $objText->getFont()->setStrikethrough(true); + } + } + } + } + } + + return $value; + } + + private function readRibbon($excel, $customUITarget, $zip) + { + $baseDir = dirname($customUITarget); + $nameCustomUI = basename($customUITarget); + // get the xml file (ribbon) + $localRibbon = $this->getFromZipArchive($zip, $customUITarget); + $customUIImagesNames = array(); + $customUIImagesBinaries = array(); + // something like customUI/_rels/customUI.xml.rels + $pathRels = $baseDir . '/_rels/' . $nameCustomUI . '.rels'; + $dataRels = $this->getFromZipArchive($zip, $pathRels); + if ($dataRels) { + // exists and not empty if the ribbon have some pictures (other than internal MSO) + $UIRels = simplexml_load_string($this->securityScan($dataRels), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); + if ($UIRels) { + // we need to save id and target to avoid parsing customUI.xml and "guess" if it's a pseudo callback who load the image + foreach ($UIRels->Relationship as $ele) { + if ($ele["Type"] == 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image') { + // an image ? + $customUIImagesNames[(string) $ele['Id']] = (string)$ele['Target']; + $customUIImagesBinaries[(string)$ele['Target']] = $this->getFromZipArchive($zip, $baseDir . '/' . (string) $ele['Target']); + } + } + } + } + if ($localRibbon) { + $excel->setRibbonXMLData($customUITarget, $localRibbon); + if (count($customUIImagesNames) > 0 && count($customUIImagesBinaries) > 0) { + $excel->setRibbonBinObjects($customUIImagesNames, $customUIImagesBinaries); + } else { + $excel->setRibbonBinObjects(null); + } + } else { + $excel->setRibbonXMLData(null); + $excel->setRibbonBinObjects(null); + } + } + + private static function getArrayItem($array, $key = 0) + { + return (isset($array[$key]) ? $array[$key] : null); + } + + private static function dirAdd($base, $add) + { + return preg_replace('~[^/]+/\.\./~', '', dirname($base) . "/$add"); + } + + private static function toCSSArray($style) + { + $style = str_replace(array("\r","\n"), "", $style); + + $temp = explode(';', $style); + $style = array(); + foreach ($temp as $item) { + $item = explode(':', $item); + + if (strpos($item[1], 'px') !== false) { + $item[1] = str_replace('px', '', $item[1]); + } + if (strpos($item[1], 'pt') !== false) { + $item[1] = str_replace('pt', '', $item[1]); + $item[1] = PHPExcel_Shared_Font::fontSizeToPixels($item[1]); + } + if (strpos($item[1], 'in') !== false) { + $item[1] = str_replace('in', '', $item[1]); + $item[1] = PHPExcel_Shared_Font::inchSizeToPixels($item[1]); + } + if (strpos($item[1], 'cm') !== false) { + $item[1] = str_replace('cm', '', $item[1]); + $item[1] = PHPExcel_Shared_Font::centimeterSizeToPixels($item[1]); + } + + $style[$item[0]] = $item[1]; + } + + return $style; + } + + private static function boolean($value = null) + { + if (is_object($value)) { + $value = (string) $value; + } + if (is_numeric($value)) { + return (bool) $value; + } + return ($value === 'true' || $value === 'TRUE'); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/Excel2007/Chart.php b/application/third_party/PHPExcel/PHPExcel/Reader/Excel2007/Chart.php new file mode 100644 index 0000000..590bf2d --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/Excel2007/Chart.php @@ -0,0 +1,520 @@ +attributes(); + if (isset($attributes[$name])) { + if ($format == 'string') { + return (string) $attributes[$name]; + } elseif ($format == 'integer') { + return (integer) $attributes[$name]; + } elseif ($format == 'boolean') { + return (boolean) ($attributes[$name] === '0' || $attributes[$name] !== 'true') ? false : true; + } else { + return (float) $attributes[$name]; + } + } + return null; + } + + + private static function readColor($color, $background = false) + { + if (isset($color["rgb"])) { + return (string)$color["rgb"]; + } elseif (isset($color["indexed"])) { + return PHPExcel_Style_Color::indexedColor($color["indexed"]-7, $background)->getARGB(); + } + } + + public static function readChart($chartElements, $chartName) + { + $namespacesChartMeta = $chartElements->getNamespaces(true); + $chartElementsC = $chartElements->children($namespacesChartMeta['c']); + + $XaxisLabel = $YaxisLabel = $legend = $title = null; + $dispBlanksAs = $plotVisOnly = null; + + foreach ($chartElementsC as $chartElementKey => $chartElement) { + switch ($chartElementKey) { + case "chart": + foreach ($chartElement as $chartDetailsKey => $chartDetails) { + $chartDetailsC = $chartDetails->children($namespacesChartMeta['c']); + switch ($chartDetailsKey) { + case "plotArea": + $plotAreaLayout = $XaxisLable = $YaxisLable = null; + $plotSeries = $plotAttributes = array(); + foreach ($chartDetails as $chartDetailKey => $chartDetail) { + switch ($chartDetailKey) { + case "layout": + $plotAreaLayout = self::chartLayoutDetails($chartDetail, $namespacesChartMeta, 'plotArea'); + break; + case "catAx": + if (isset($chartDetail->title)) { + $XaxisLabel = self::chartTitle($chartDetail->title->children($namespacesChartMeta['c']), $namespacesChartMeta, 'cat'); + } + break; + case "dateAx": + if (isset($chartDetail->title)) { + $XaxisLabel = self::chartTitle($chartDetail->title->children($namespacesChartMeta['c']), $namespacesChartMeta, 'cat'); + } + break; + case "valAx": + if (isset($chartDetail->title)) { + $YaxisLabel = self::chartTitle($chartDetail->title->children($namespacesChartMeta['c']), $namespacesChartMeta, 'cat'); + } + break; + case "barChart": + case "bar3DChart": + $barDirection = self::getAttribute($chartDetail->barDir, 'val', 'string'); + $plotSer = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey); + $plotSer->setPlotDirection($barDirection); + $plotSeries[] = $plotSer; + $plotAttributes = self::readChartAttributes($chartDetail); + break; + case "lineChart": + case "line3DChart": + $plotSeries[] = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey); + $plotAttributes = self::readChartAttributes($chartDetail); + break; + case "areaChart": + case "area3DChart": + $plotSeries[] = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey); + $plotAttributes = self::readChartAttributes($chartDetail); + break; + case "doughnutChart": + case "pieChart": + case "pie3DChart": + $explosion = isset($chartDetail->ser->explosion); + $plotSer = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey); + $plotSer->setPlotStyle($explosion); + $plotSeries[] = $plotSer; + $plotAttributes = self::readChartAttributes($chartDetail); + break; + case "scatterChart": + $scatterStyle = self::getAttribute($chartDetail->scatterStyle, 'val', 'string'); + $plotSer = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey); + $plotSer->setPlotStyle($scatterStyle); + $plotSeries[] = $plotSer; + $plotAttributes = self::readChartAttributes($chartDetail); + break; + case "bubbleChart": + $bubbleScale = self::getAttribute($chartDetail->bubbleScale, 'val', 'integer'); + $plotSer = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey); + $plotSer->setPlotStyle($bubbleScale); + $plotSeries[] = $plotSer; + $plotAttributes = self::readChartAttributes($chartDetail); + break; + case "radarChart": + $radarStyle = self::getAttribute($chartDetail->radarStyle, 'val', 'string'); + $plotSer = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey); + $plotSer->setPlotStyle($radarStyle); + $plotSeries[] = $plotSer; + $plotAttributes = self::readChartAttributes($chartDetail); + break; + case "surfaceChart": + case "surface3DChart": + $wireFrame = self::getAttribute($chartDetail->wireframe, 'val', 'boolean'); + $plotSer = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey); + $plotSer->setPlotStyle($wireFrame); + $plotSeries[] = $plotSer; + $plotAttributes = self::readChartAttributes($chartDetail); + break; + case "stockChart": + $plotSeries[] = self::chartDataSeries($chartDetail, $namespacesChartMeta, $chartDetailKey); + $plotAttributes = self::readChartAttributes($plotAreaLayout); + break; + } + } + if ($plotAreaLayout == null) { + $plotAreaLayout = new PHPExcel_Chart_Layout(); + } + $plotArea = new PHPExcel_Chart_PlotArea($plotAreaLayout, $plotSeries); + self::setChartAttributes($plotAreaLayout, $plotAttributes); + break; + case "plotVisOnly": + $plotVisOnly = self::getAttribute($chartDetails, 'val', 'string'); + break; + case "dispBlanksAs": + $dispBlanksAs = self::getAttribute($chartDetails, 'val', 'string'); + break; + case "title": + $title = self::chartTitle($chartDetails, $namespacesChartMeta, 'title'); + break; + case "legend": + $legendPos = 'r'; + $legendLayout = null; + $legendOverlay = false; + foreach ($chartDetails as $chartDetailKey => $chartDetail) { + switch ($chartDetailKey) { + case "legendPos": + $legendPos = self::getAttribute($chartDetail, 'val', 'string'); + break; + case "overlay": + $legendOverlay = self::getAttribute($chartDetail, 'val', 'boolean'); + break; + case "layout": + $legendLayout = self::chartLayoutDetails($chartDetail, $namespacesChartMeta, 'legend'); + break; + } + } + $legend = new PHPExcel_Chart_Legend($legendPos, $legendLayout, $legendOverlay); + break; + } + } + } + } + $chart = new PHPExcel_Chart($chartName, $title, $legend, $plotArea, $plotVisOnly, $dispBlanksAs, $XaxisLabel, $YaxisLabel); + + return $chart; + } + + private static function chartTitle($titleDetails, $namespacesChartMeta, $type) + { + $caption = array(); + $titleLayout = null; + foreach ($titleDetails as $titleDetailKey => $chartDetail) { + switch ($titleDetailKey) { + case "tx": + $titleDetails = $chartDetail->rich->children($namespacesChartMeta['a']); + foreach ($titleDetails as $titleKey => $titleDetail) { + switch ($titleKey) { + case "p": + $titleDetailPart = $titleDetail->children($namespacesChartMeta['a']); + $caption[] = self::parseRichText($titleDetailPart); + } + } + break; + case "layout": + $titleLayout = self::chartLayoutDetails($chartDetail, $namespacesChartMeta); + break; + } + } + + return new PHPExcel_Chart_Title($caption, $titleLayout); + } + + private static function chartLayoutDetails($chartDetail, $namespacesChartMeta) + { + if (!isset($chartDetail->manualLayout)) { + return null; + } + $details = $chartDetail->manualLayout->children($namespacesChartMeta['c']); + if (is_null($details)) { + return null; + } + $layout = array(); + foreach ($details as $detailKey => $detail) { +// echo $detailKey, ' => ',self::getAttribute($detail, 'val', 'string'),PHP_EOL; + $layout[$detailKey] = self::getAttribute($detail, 'val', 'string'); + } + return new PHPExcel_Chart_Layout($layout); + } + + private static function chartDataSeries($chartDetail, $namespacesChartMeta, $plotType) + { + $multiSeriesType = null; + $smoothLine = false; + $seriesLabel = $seriesCategory = $seriesValues = $plotOrder = array(); + + $seriesDetailSet = $chartDetail->children($namespacesChartMeta['c']); + foreach ($seriesDetailSet as $seriesDetailKey => $seriesDetails) { + switch ($seriesDetailKey) { + case "grouping": + $multiSeriesType = self::getAttribute($chartDetail->grouping, 'val', 'string'); + break; + case "ser": + $marker = null; + foreach ($seriesDetails as $seriesKey => $seriesDetail) { + switch ($seriesKey) { + case "idx": + $seriesIndex = self::getAttribute($seriesDetail, 'val', 'integer'); + break; + case "order": + $seriesOrder = self::getAttribute($seriesDetail, 'val', 'integer'); + $plotOrder[$seriesIndex] = $seriesOrder; + break; + case "tx": + $seriesLabel[$seriesIndex] = self::chartDataSeriesValueSet($seriesDetail, $namespacesChartMeta); + break; + case "marker": + $marker = self::getAttribute($seriesDetail->symbol, 'val', 'string'); + break; + case "smooth": + $smoothLine = self::getAttribute($seriesDetail, 'val', 'boolean'); + break; + case "cat": + $seriesCategory[$seriesIndex] = self::chartDataSeriesValueSet($seriesDetail, $namespacesChartMeta); + break; + case "val": + $seriesValues[$seriesIndex] = self::chartDataSeriesValueSet($seriesDetail, $namespacesChartMeta, $marker); + break; + case "xVal": + $seriesCategory[$seriesIndex] = self::chartDataSeriesValueSet($seriesDetail, $namespacesChartMeta, $marker); + break; + case "yVal": + $seriesValues[$seriesIndex] = self::chartDataSeriesValueSet($seriesDetail, $namespacesChartMeta, $marker); + break; + } + } + } + } + return new PHPExcel_Chart_DataSeries($plotType, $multiSeriesType, $plotOrder, $seriesLabel, $seriesCategory, $seriesValues, $smoothLine); + } + + + private static function chartDataSeriesValueSet($seriesDetail, $namespacesChartMeta, $marker = null, $smoothLine = false) + { + if (isset($seriesDetail->strRef)) { + $seriesSource = (string) $seriesDetail->strRef->f; + $seriesData = self::chartDataSeriesValues($seriesDetail->strRef->strCache->children($namespacesChartMeta['c']), 's'); + + return new PHPExcel_Chart_DataSeriesValues('String', $seriesSource, $seriesData['formatCode'], $seriesData['pointCount'], $seriesData['dataValues'], $marker, $smoothLine); + } elseif (isset($seriesDetail->numRef)) { + $seriesSource = (string) $seriesDetail->numRef->f; + $seriesData = self::chartDataSeriesValues($seriesDetail->numRef->numCache->children($namespacesChartMeta['c'])); + + return new PHPExcel_Chart_DataSeriesValues('Number', $seriesSource, $seriesData['formatCode'], $seriesData['pointCount'], $seriesData['dataValues'], $marker, $smoothLine); + } elseif (isset($seriesDetail->multiLvlStrRef)) { + $seriesSource = (string) $seriesDetail->multiLvlStrRef->f; + $seriesData = self::chartDataSeriesValuesMultiLevel($seriesDetail->multiLvlStrRef->multiLvlStrCache->children($namespacesChartMeta['c']), 's'); + $seriesData['pointCount'] = count($seriesData['dataValues']); + + return new PHPExcel_Chart_DataSeriesValues('String', $seriesSource, $seriesData['formatCode'], $seriesData['pointCount'], $seriesData['dataValues'], $marker, $smoothLine); + } elseif (isset($seriesDetail->multiLvlNumRef)) { + $seriesSource = (string) $seriesDetail->multiLvlNumRef->f; + $seriesData = self::chartDataSeriesValuesMultiLevel($seriesDetail->multiLvlNumRef->multiLvlNumCache->children($namespacesChartMeta['c']), 's'); + $seriesData['pointCount'] = count($seriesData['dataValues']); + + return new PHPExcel_Chart_DataSeriesValues('String', $seriesSource, $seriesData['formatCode'], $seriesData['pointCount'], $seriesData['dataValues'], $marker, $smoothLine); + } + return null; + } + + + private static function chartDataSeriesValues($seriesValueSet, $dataType = 'n') + { + $seriesVal = array(); + $formatCode = ''; + $pointCount = 0; + + foreach ($seriesValueSet as $seriesValueIdx => $seriesValue) { + switch ($seriesValueIdx) { + case 'ptCount': + $pointCount = self::getAttribute($seriesValue, 'val', 'integer'); + break; + case 'formatCode': + $formatCode = (string) $seriesValue; + break; + case 'pt': + $pointVal = self::getAttribute($seriesValue, 'idx', 'integer'); + if ($dataType == 's') { + $seriesVal[$pointVal] = (string) $seriesValue->v; + } else { + $seriesVal[$pointVal] = (float) $seriesValue->v; + } + break; + } + } + + return array( + 'formatCode' => $formatCode, + 'pointCount' => $pointCount, + 'dataValues' => $seriesVal + ); + } + + private static function chartDataSeriesValuesMultiLevel($seriesValueSet, $dataType = 'n') + { + $seriesVal = array(); + $formatCode = ''; + $pointCount = 0; + + foreach ($seriesValueSet->lvl as $seriesLevelIdx => $seriesLevel) { + foreach ($seriesLevel as $seriesValueIdx => $seriesValue) { + switch ($seriesValueIdx) { + case 'ptCount': + $pointCount = self::getAttribute($seriesValue, 'val', 'integer'); + break; + case 'formatCode': + $formatCode = (string) $seriesValue; + break; + case 'pt': + $pointVal = self::getAttribute($seriesValue, 'idx', 'integer'); + if ($dataType == 's') { + $seriesVal[$pointVal][] = (string) $seriesValue->v; + } else { + $seriesVal[$pointVal][] = (float) $seriesValue->v; + } + break; + } + } + } + + return array( + 'formatCode' => $formatCode, + 'pointCount' => $pointCount, + 'dataValues' => $seriesVal + ); + } + + private static function parseRichText($titleDetailPart = null) + { + $value = new PHPExcel_RichText(); + + foreach ($titleDetailPart as $titleDetailElementKey => $titleDetailElement) { + if (isset($titleDetailElement->t)) { + $objText = $value->createTextRun((string) $titleDetailElement->t); + } + if (isset($titleDetailElement->rPr)) { + if (isset($titleDetailElement->rPr->rFont["val"])) { + $objText->getFont()->setName((string) $titleDetailElement->rPr->rFont["val"]); + } + + $fontSize = (self::getAttribute($titleDetailElement->rPr, 'sz', 'integer')); + if (!is_null($fontSize)) { + $objText->getFont()->setSize(floor($fontSize / 100)); + } + + $fontColor = (self::getAttribute($titleDetailElement->rPr, 'color', 'string')); + if (!is_null($fontColor)) { + $objText->getFont()->setColor(new PHPExcel_Style_Color(self::readColor($fontColor))); + } + + $bold = self::getAttribute($titleDetailElement->rPr, 'b', 'boolean'); + if (!is_null($bold)) { + $objText->getFont()->setBold($bold); + } + + $italic = self::getAttribute($titleDetailElement->rPr, 'i', 'boolean'); + if (!is_null($italic)) { + $objText->getFont()->setItalic($italic); + } + + $baseline = self::getAttribute($titleDetailElement->rPr, 'baseline', 'integer'); + if (!is_null($baseline)) { + if ($baseline > 0) { + $objText->getFont()->setSuperScript(true); + } elseif ($baseline < 0) { + $objText->getFont()->setSubScript(true); + } + } + + $underscore = (self::getAttribute($titleDetailElement->rPr, 'u', 'string')); + if (!is_null($underscore)) { + if ($underscore == 'sng') { + $objText->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE); + } elseif ($underscore == 'dbl') { + $objText->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_DOUBLE); + } else { + $objText->getFont()->setUnderline(PHPExcel_Style_Font::UNDERLINE_NONE); + } + } + + $strikethrough = (self::getAttribute($titleDetailElement->rPr, 's', 'string')); + if (!is_null($strikethrough)) { + if ($strikethrough == 'noStrike') { + $objText->getFont()->setStrikethrough(false); + } else { + $objText->getFont()->setStrikethrough(true); + } + } + } + } + + return $value; + } + + private static function readChartAttributes($chartDetail) + { + $plotAttributes = array(); + if (isset($chartDetail->dLbls)) { + if (isset($chartDetail->dLbls->howLegendKey)) { + $plotAttributes['showLegendKey'] = self::getAttribute($chartDetail->dLbls->showLegendKey, 'val', 'string'); + } + if (isset($chartDetail->dLbls->showVal)) { + $plotAttributes['showVal'] = self::getAttribute($chartDetail->dLbls->showVal, 'val', 'string'); + } + if (isset($chartDetail->dLbls->showCatName)) { + $plotAttributes['showCatName'] = self::getAttribute($chartDetail->dLbls->showCatName, 'val', 'string'); + } + if (isset($chartDetail->dLbls->showSerName)) { + $plotAttributes['showSerName'] = self::getAttribute($chartDetail->dLbls->showSerName, 'val', 'string'); + } + if (isset($chartDetail->dLbls->showPercent)) { + $plotAttributes['showPercent'] = self::getAttribute($chartDetail->dLbls->showPercent, 'val', 'string'); + } + if (isset($chartDetail->dLbls->showBubbleSize)) { + $plotAttributes['showBubbleSize'] = self::getAttribute($chartDetail->dLbls->showBubbleSize, 'val', 'string'); + } + if (isset($chartDetail->dLbls->showLeaderLines)) { + $plotAttributes['showLeaderLines'] = self::getAttribute($chartDetail->dLbls->showLeaderLines, 'val', 'string'); + } + } + + return $plotAttributes; + } + + private static function setChartAttributes($plotArea, $plotAttributes) + { + foreach ($plotAttributes as $plotAttributeKey => $plotAttributeValue) { + switch ($plotAttributeKey) { + case 'showLegendKey': + $plotArea->setShowLegendKey($plotAttributeValue); + break; + case 'showVal': + $plotArea->setShowVal($plotAttributeValue); + break; + case 'showCatName': + $plotArea->setShowCatName($plotAttributeValue); + break; + case 'showSerName': + $plotArea->setShowSerName($plotAttributeValue); + break; + case 'showPercent': + $plotArea->setShowPercent($plotAttributeValue); + break; + case 'showBubbleSize': + $plotArea->setShowBubbleSize($plotAttributeValue); + break; + case 'showLeaderLines': + $plotArea->setShowLeaderLines($plotAttributeValue); + break; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/Excel2007/Theme.php b/application/third_party/PHPExcel/PHPExcel/Reader/Excel2007/Theme.php new file mode 100644 index 0000000..134f4b6 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/Excel2007/Theme.php @@ -0,0 +1,127 @@ +themeName = $themeName; + $this->colourSchemeName = $colourSchemeName; + $this->colourMap = $colourMap; + } + + /** + * Get Theme Name + * + * @return string + */ + public function getThemeName() + { + return $this->themeName; + } + + /** + * Get colour Scheme Name + * + * @return string + */ + public function getColourSchemeName() + { + return $this->colourSchemeName; + } + + /** + * Get colour Map Value by Position + * + * @return string + */ + public function getColourByIndex($index = 0) + { + if (isset($this->colourMap[$index])) { + return $this->colourMap[$index]; + } + return null; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if ((is_object($value)) && ($key != '_parent')) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/Excel5.php b/application/third_party/PHPExcel/PHPExcel/Reader/Excel5.php new file mode 100644 index 0000000..62e971d --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/Excel5.php @@ -0,0 +1,7594 @@ +data + * + * @var int + */ + private $dataSize; + + /** + * Current position in stream + * + * @var integer + */ + private $pos; + + /** + * Workbook to be returned by the reader. + * + * @var PHPExcel + */ + private $phpExcel; + + /** + * Worksheet that is currently being built by the reader. + * + * @var PHPExcel_Worksheet + */ + private $phpSheet; + + /** + * BIFF version + * + * @var int + */ + private $version; + + /** + * Codepage set in the Excel file being read. Only important for BIFF5 (Excel 5.0 - Excel 95) + * For BIFF8 (Excel 97 - Excel 2003) this will always have the value 'UTF-16LE' + * + * @var string + */ + private $codepage; + + /** + * Shared formats + * + * @var array + */ + private $formats; + + /** + * Shared fonts + * + * @var array + */ + private $objFonts; + + /** + * Color palette + * + * @var array + */ + private $palette; + + /** + * Worksheets + * + * @var array + */ + private $sheets; + + /** + * External books + * + * @var array + */ + private $externalBooks; + + /** + * REF structures. Only applies to BIFF8. + * + * @var array + */ + private $ref; + + /** + * External names + * + * @var array + */ + private $externalNames; + + /** + * Defined names + * + * @var array + */ + private $definedname; + + /** + * Shared strings. Only applies to BIFF8. + * + * @var array + */ + private $sst; + + /** + * Panes are frozen? (in sheet currently being read). See WINDOW2 record. + * + * @var boolean + */ + private $frozen; + + /** + * Fit printout to number of pages? (in sheet currently being read). See SHEETPR record. + * + * @var boolean + */ + private $isFitToPages; + + /** + * Objects. One OBJ record contributes with one entry. + * + * @var array + */ + private $objs; + + /** + * Text Objects. One TXO record corresponds with one entry. + * + * @var array + */ + private $textObjects; + + /** + * Cell Annotations (BIFF8) + * + * @var array + */ + private $cellNotes; + + /** + * The combined MSODRAWINGGROUP data + * + * @var string + */ + private $drawingGroupData; + + /** + * The combined MSODRAWING data (per sheet) + * + * @var string + */ + private $drawingData; + + /** + * Keep track of XF index + * + * @var int + */ + private $xfIndex; + + /** + * Mapping of XF index (that is a cell XF) to final index in cellXf collection + * + * @var array + */ + private $mapCellXfIndex; + + /** + * Mapping of XF index (that is a style XF) to final index in cellStyleXf collection + * + * @var array + */ + private $mapCellStyleXfIndex; + + /** + * The shared formulas in a sheet. One SHAREDFMLA record contributes with one value. + * + * @var array + */ + private $sharedFormulas; + + /** + * The shared formula parts in a sheet. One FORMULA record contributes with one value if it + * refers to a shared formula. + * + * @var array + */ + private $sharedFormulaParts; + + /** + * The type of encryption in use + * + * @var int + */ + private $encryption = 0; + + /** + * The position in the stream after which contents are encrypted + * + * @var int + */ + private $encryptionStartPos = false; + + /** + * The current RC4 decryption object + * + * @var PHPExcel_Reader_Excel5_RC4 + */ + private $rc4Key = null; + + /** + * The position in the stream that the RC4 decryption object was left at + * + * @var int + */ + private $rc4Pos = 0; + + /** + * The current MD5 context state + * + * @var string + */ + private $md5Ctxt = null; + + /** + * Create a new PHPExcel_Reader_Excel5 instance + */ + public function __construct() + { + $this->readFilter = new PHPExcel_Reader_DefaultReadFilter(); + } + + /** + * Can the current PHPExcel_Reader_IReader read the file? + * + * @param string $pFilename + * @return boolean + * @throws PHPExcel_Reader_Exception + */ + public function canRead($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + try { + // Use ParseXL for the hard work. + $ole = new PHPExcel_Shared_OLERead(); + + // get excel data + $res = $ole->read($pFilename); + return true; + } catch (PHPExcel_Exception $e) { + return false; + } + } + + /** + * Reads names of the worksheets from a file, without parsing the whole file to a PHPExcel object + * + * @param string $pFilename + * @throws PHPExcel_Reader_Exception + */ + public function listWorksheetNames($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $worksheetNames = array(); + + // Read the OLE file + $this->loadOLE($pFilename); + + // total byte size of Excel data (workbook global substream + sheet substreams) + $this->dataSize = strlen($this->data); + + $this->pos = 0; + $this->sheets = array(); + + // Parse Workbook Global Substream + while ($this->pos < $this->dataSize) { + $code = self::getInt2d($this->data, $this->pos); + + switch ($code) { + case self::XLS_TYPE_BOF: + $this->readBof(); + break; + case self::XLS_TYPE_SHEET: + $this->readSheet(); + break; + case self::XLS_TYPE_EOF: + $this->readDefault(); + break 2; + default: + $this->readDefault(); + break; + } + } + + foreach ($this->sheets as $sheet) { + if ($sheet['sheetType'] != 0x00) { + // 0x00: Worksheet, 0x02: Chart, 0x06: Visual Basic module + continue; + } + + $worksheetNames[] = $sheet['name']; + } + + return $worksheetNames; + } + + + /** + * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns) + * + * @param string $pFilename + * @throws PHPExcel_Reader_Exception + */ + public function listWorksheetInfo($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $worksheetInfo = array(); + + // Read the OLE file + $this->loadOLE($pFilename); + + // total byte size of Excel data (workbook global substream + sheet substreams) + $this->dataSize = strlen($this->data); + + // initialize + $this->pos = 0; + $this->sheets = array(); + + // Parse Workbook Global Substream + while ($this->pos < $this->dataSize) { + $code = self::getInt2d($this->data, $this->pos); + + switch ($code) { + case self::XLS_TYPE_BOF: + $this->readBof(); + break; + case self::XLS_TYPE_SHEET: + $this->readSheet(); + break; + case self::XLS_TYPE_EOF: + $this->readDefault(); + break 2; + default: + $this->readDefault(); + break; + } + } + + // Parse the individual sheets + foreach ($this->sheets as $sheet) { + if ($sheet['sheetType'] != 0x00) { + // 0x00: Worksheet + // 0x02: Chart + // 0x06: Visual Basic module + continue; + } + + $tmpInfo = array(); + $tmpInfo['worksheetName'] = $sheet['name']; + $tmpInfo['lastColumnLetter'] = 'A'; + $tmpInfo['lastColumnIndex'] = 0; + $tmpInfo['totalRows'] = 0; + $tmpInfo['totalColumns'] = 0; + + $this->pos = $sheet['offset']; + + while ($this->pos <= $this->dataSize - 4) { + $code = self::getInt2d($this->data, $this->pos); + + switch ($code) { + case self::XLS_TYPE_RK: + case self::XLS_TYPE_LABELSST: + case self::XLS_TYPE_NUMBER: + case self::XLS_TYPE_FORMULA: + case self::XLS_TYPE_BOOLERR: + case self::XLS_TYPE_LABEL: + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + $rowIndex = self::getInt2d($recordData, 0) + 1; + $columnIndex = self::getInt2d($recordData, 2); + + $tmpInfo['totalRows'] = max($tmpInfo['totalRows'], $rowIndex); + $tmpInfo['lastColumnIndex'] = max($tmpInfo['lastColumnIndex'], $columnIndex); + break; + case self::XLS_TYPE_BOF: + $this->readBof(); + break; + case self::XLS_TYPE_EOF: + $this->readDefault(); + break 2; + default: + $this->readDefault(); + break; + } + } + + $tmpInfo['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($tmpInfo['lastColumnIndex']); + $tmpInfo['totalColumns'] = $tmpInfo['lastColumnIndex'] + 1; + + $worksheetInfo[] = $tmpInfo; + } + + return $worksheetInfo; + } + + + /** + * Loads PHPExcel from file + * + * @param string $pFilename + * @return PHPExcel + * @throws PHPExcel_Reader_Exception + */ + public function load($pFilename) + { + // Read the OLE file + $this->loadOLE($pFilename); + + // Initialisations + $this->phpExcel = new PHPExcel; + $this->phpExcel->removeSheetByIndex(0); // remove 1st sheet + if (!$this->readDataOnly) { + $this->phpExcel->removeCellStyleXfByIndex(0); // remove the default style + $this->phpExcel->removeCellXfByIndex(0); // remove the default style + } + + // Read the summary information stream (containing meta data) + $this->readSummaryInformation(); + + // Read the Additional document summary information stream (containing application-specific meta data) + $this->readDocumentSummaryInformation(); + + // total byte size of Excel data (workbook global substream + sheet substreams) + $this->dataSize = strlen($this->data); + + // initialize + $this->pos = 0; + $this->codepage = 'CP1252'; + $this->formats = array(); + $this->objFonts = array(); + $this->palette = array(); + $this->sheets = array(); + $this->externalBooks = array(); + $this->ref = array(); + $this->definedname = array(); + $this->sst = array(); + $this->drawingGroupData = ''; + $this->xfIndex = ''; + $this->mapCellXfIndex = array(); + $this->mapCellStyleXfIndex = array(); + + // Parse Workbook Global Substream + while ($this->pos < $this->dataSize) { + $code = self::getInt2d($this->data, $this->pos); + + switch ($code) { + case self::XLS_TYPE_BOF: + $this->readBof(); + break; + case self::XLS_TYPE_FILEPASS: + $this->readFilepass(); + break; + case self::XLS_TYPE_CODEPAGE: + $this->readCodepage(); + break; + case self::XLS_TYPE_DATEMODE: + $this->readDateMode(); + break; + case self::XLS_TYPE_FONT: + $this->readFont(); + break; + case self::XLS_TYPE_FORMAT: + $this->readFormat(); + break; + case self::XLS_TYPE_XF: + $this->readXf(); + break; + case self::XLS_TYPE_XFEXT: + $this->readXfExt(); + break; + case self::XLS_TYPE_STYLE: + $this->readStyle(); + break; + case self::XLS_TYPE_PALETTE: + $this->readPalette(); + break; + case self::XLS_TYPE_SHEET: + $this->readSheet(); + break; + case self::XLS_TYPE_EXTERNALBOOK: + $this->readExternalBook(); + break; + case self::XLS_TYPE_EXTERNNAME: + $this->readExternName(); + break; + case self::XLS_TYPE_EXTERNSHEET: + $this->readExternSheet(); + break; + case self::XLS_TYPE_DEFINEDNAME: + $this->readDefinedName(); + break; + case self::XLS_TYPE_MSODRAWINGGROUP: + $this->readMsoDrawingGroup(); + break; + case self::XLS_TYPE_SST: + $this->readSst(); + break; + case self::XLS_TYPE_EOF: + $this->readDefault(); + break 2; + default: + $this->readDefault(); + break; + } + } + + // Resolve indexed colors for font, fill, and border colors + // Cannot be resolved already in XF record, because PALETTE record comes afterwards + if (!$this->readDataOnly) { + foreach ($this->objFonts as $objFont) { + if (isset($objFont->colorIndex)) { + $color = PHPExcel_Reader_Excel5_Color::map($objFont->colorIndex, $this->palette, $this->version); + $objFont->getColor()->setRGB($color['rgb']); + } + } + + foreach ($this->phpExcel->getCellXfCollection() as $objStyle) { + // fill start and end color + $fill = $objStyle->getFill(); + + if (isset($fill->startcolorIndex)) { + $startColor = PHPExcel_Reader_Excel5_Color::map($fill->startcolorIndex, $this->palette, $this->version); + $fill->getStartColor()->setRGB($startColor['rgb']); + } + if (isset($fill->endcolorIndex)) { + $endColor = PHPExcel_Reader_Excel5_Color::map($fill->endcolorIndex, $this->palette, $this->version); + $fill->getEndColor()->setRGB($endColor['rgb']); + } + + // border colors + $top = $objStyle->getBorders()->getTop(); + $right = $objStyle->getBorders()->getRight(); + $bottom = $objStyle->getBorders()->getBottom(); + $left = $objStyle->getBorders()->getLeft(); + $diagonal = $objStyle->getBorders()->getDiagonal(); + + if (isset($top->colorIndex)) { + $borderTopColor = PHPExcel_Reader_Excel5_Color::map($top->colorIndex, $this->palette, $this->version); + $top->getColor()->setRGB($borderTopColor['rgb']); + } + if (isset($right->colorIndex)) { + $borderRightColor = PHPExcel_Reader_Excel5_Color::map($right->colorIndex, $this->palette, $this->version); + $right->getColor()->setRGB($borderRightColor['rgb']); + } + if (isset($bottom->colorIndex)) { + $borderBottomColor = PHPExcel_Reader_Excel5_Color::map($bottom->colorIndex, $this->palette, $this->version); + $bottom->getColor()->setRGB($borderBottomColor['rgb']); + } + if (isset($left->colorIndex)) { + $borderLeftColor = PHPExcel_Reader_Excel5_Color::map($left->colorIndex, $this->palette, $this->version); + $left->getColor()->setRGB($borderLeftColor['rgb']); + } + if (isset($diagonal->colorIndex)) { + $borderDiagonalColor = PHPExcel_Reader_Excel5_Color::map($diagonal->colorIndex, $this->palette, $this->version); + $diagonal->getColor()->setRGB($borderDiagonalColor['rgb']); + } + } + } + + // treat MSODRAWINGGROUP records, workbook-level Escher + if (!$this->readDataOnly && $this->drawingGroupData) { + $escherWorkbook = new PHPExcel_Shared_Escher(); + $reader = new PHPExcel_Reader_Excel5_Escher($escherWorkbook); + $escherWorkbook = $reader->load($this->drawingGroupData); + + // debug Escher stream + //$debug = new Debug_Escher(new PHPExcel_Shared_Escher()); + //$debug->load($this->drawingGroupData); + } + + // Parse the individual sheets + foreach ($this->sheets as $sheet) { + if ($sheet['sheetType'] != 0x00) { + // 0x00: Worksheet, 0x02: Chart, 0x06: Visual Basic module + continue; + } + + // check if sheet should be skipped + if (isset($this->loadSheetsOnly) && !in_array($sheet['name'], $this->loadSheetsOnly)) { + continue; + } + + // add sheet to PHPExcel object + $this->phpSheet = $this->phpExcel->createSheet(); + // Use false for $updateFormulaCellReferences to prevent adjustment of worksheet references in formula + // cells... during the load, all formulae should be correct, and we're simply bringing the worksheet + // name in line with the formula, not the reverse + $this->phpSheet->setTitle($sheet['name'], false); + $this->phpSheet->setSheetState($sheet['sheetState']); + + $this->pos = $sheet['offset']; + + // Initialize isFitToPages. May change after reading SHEETPR record. + $this->isFitToPages = false; + + // Initialize drawingData + $this->drawingData = ''; + + // Initialize objs + $this->objs = array(); + + // Initialize shared formula parts + $this->sharedFormulaParts = array(); + + // Initialize shared formulas + $this->sharedFormulas = array(); + + // Initialize text objs + $this->textObjects = array(); + + // Initialize cell annotations + $this->cellNotes = array(); + $this->textObjRef = -1; + + while ($this->pos <= $this->dataSize - 4) { + $code = self::getInt2d($this->data, $this->pos); + + switch ($code) { + case self::XLS_TYPE_BOF: + $this->readBof(); + break; + case self::XLS_TYPE_PRINTGRIDLINES: + $this->readPrintGridlines(); + break; + case self::XLS_TYPE_DEFAULTROWHEIGHT: + $this->readDefaultRowHeight(); + break; + case self::XLS_TYPE_SHEETPR: + $this->readSheetPr(); + break; + case self::XLS_TYPE_HORIZONTALPAGEBREAKS: + $this->readHorizontalPageBreaks(); + break; + case self::XLS_TYPE_VERTICALPAGEBREAKS: + $this->readVerticalPageBreaks(); + break; + case self::XLS_TYPE_HEADER: + $this->readHeader(); + break; + case self::XLS_TYPE_FOOTER: + $this->readFooter(); + break; + case self::XLS_TYPE_HCENTER: + $this->readHcenter(); + break; + case self::XLS_TYPE_VCENTER: + $this->readVcenter(); + break; + case self::XLS_TYPE_LEFTMARGIN: + $this->readLeftMargin(); + break; + case self::XLS_TYPE_RIGHTMARGIN: + $this->readRightMargin(); + break; + case self::XLS_TYPE_TOPMARGIN: + $this->readTopMargin(); + break; + case self::XLS_TYPE_BOTTOMMARGIN: + $this->readBottomMargin(); + break; + case self::XLS_TYPE_PAGESETUP: + $this->readPageSetup(); + break; + case self::XLS_TYPE_PROTECT: + $this->readProtect(); + break; + case self::XLS_TYPE_SCENPROTECT: + $this->readScenProtect(); + break; + case self::XLS_TYPE_OBJECTPROTECT: + $this->readObjectProtect(); + break; + case self::XLS_TYPE_PASSWORD: + $this->readPassword(); + break; + case self::XLS_TYPE_DEFCOLWIDTH: + $this->readDefColWidth(); + break; + case self::XLS_TYPE_COLINFO: + $this->readColInfo(); + break; + case self::XLS_TYPE_DIMENSION: + $this->readDefault(); + break; + case self::XLS_TYPE_ROW: + $this->readRow(); + break; + case self::XLS_TYPE_DBCELL: + $this->readDefault(); + break; + case self::XLS_TYPE_RK: + $this->readRk(); + break; + case self::XLS_TYPE_LABELSST: + $this->readLabelSst(); + break; + case self::XLS_TYPE_MULRK: + $this->readMulRk(); + break; + case self::XLS_TYPE_NUMBER: + $this->readNumber(); + break; + case self::XLS_TYPE_FORMULA: + $this->readFormula(); + break; + case self::XLS_TYPE_SHAREDFMLA: + $this->readSharedFmla(); + break; + case self::XLS_TYPE_BOOLERR: + $this->readBoolErr(); + break; + case self::XLS_TYPE_MULBLANK: + $this->readMulBlank(); + break; + case self::XLS_TYPE_LABEL: + $this->readLabel(); + break; + case self::XLS_TYPE_BLANK: + $this->readBlank(); + break; + case self::XLS_TYPE_MSODRAWING: + $this->readMsoDrawing(); + break; + case self::XLS_TYPE_OBJ: + $this->readObj(); + break; + case self::XLS_TYPE_WINDOW2: + $this->readWindow2(); + break; + case self::XLS_TYPE_PAGELAYOUTVIEW: + $this->readPageLayoutView(); + break; + case self::XLS_TYPE_SCL: + $this->readScl(); + break; + case self::XLS_TYPE_PANE: + $this->readPane(); + break; + case self::XLS_TYPE_SELECTION: + $this->readSelection(); + break; + case self::XLS_TYPE_MERGEDCELLS: + $this->readMergedCells(); + break; + case self::XLS_TYPE_HYPERLINK: + $this->readHyperLink(); + break; + case self::XLS_TYPE_DATAVALIDATIONS: + $this->readDataValidations(); + break; + case self::XLS_TYPE_DATAVALIDATION: + $this->readDataValidation(); + break; + case self::XLS_TYPE_SHEETLAYOUT: + $this->readSheetLayout(); + break; + case self::XLS_TYPE_SHEETPROTECTION: + $this->readSheetProtection(); + break; + case self::XLS_TYPE_RANGEPROTECTION: + $this->readRangeProtection(); + break; + case self::XLS_TYPE_NOTE: + $this->readNote(); + break; + //case self::XLS_TYPE_IMDATA: $this->readImData(); break; + case self::XLS_TYPE_TXO: + $this->readTextObject(); + break; + case self::XLS_TYPE_CONTINUE: + $this->readContinue(); + break; + case self::XLS_TYPE_EOF: + $this->readDefault(); + break 2; + default: + $this->readDefault(); + break; + } + + } + + // treat MSODRAWING records, sheet-level Escher + if (!$this->readDataOnly && $this->drawingData) { + $escherWorksheet = new PHPExcel_Shared_Escher(); + $reader = new PHPExcel_Reader_Excel5_Escher($escherWorksheet); + $escherWorksheet = $reader->load($this->drawingData); + + // debug Escher stream + //$debug = new Debug_Escher(new PHPExcel_Shared_Escher()); + //$debug->load($this->drawingData); + + // get all spContainers in one long array, so they can be mapped to OBJ records + $allSpContainers = $escherWorksheet->getDgContainer()->getSpgrContainer()->getAllSpContainers(); + } + + // treat OBJ records + foreach ($this->objs as $n => $obj) { +// echo '
Object reference is ', $n,'
'; +// var_dump($obj); +// echo '
'; + + // the first shape container never has a corresponding OBJ record, hence $n + 1 + if (isset($allSpContainers[$n + 1]) && is_object($allSpContainers[$n + 1])) { + $spContainer = $allSpContainers[$n + 1]; + + // we skip all spContainers that are a part of a group shape since we cannot yet handle those + if ($spContainer->getNestingLevel() > 1) { + continue; + } + + // calculate the width and height of the shape + list($startColumn, $startRow) = PHPExcel_Cell::coordinateFromString($spContainer->getStartCoordinates()); + list($endColumn, $endRow) = PHPExcel_Cell::coordinateFromString($spContainer->getEndCoordinates()); + + $startOffsetX = $spContainer->getStartOffsetX(); + $startOffsetY = $spContainer->getStartOffsetY(); + $endOffsetX = $spContainer->getEndOffsetX(); + $endOffsetY = $spContainer->getEndOffsetY(); + + $width = PHPExcel_Shared_Excel5::getDistanceX($this->phpSheet, $startColumn, $startOffsetX, $endColumn, $endOffsetX); + $height = PHPExcel_Shared_Excel5::getDistanceY($this->phpSheet, $startRow, $startOffsetY, $endRow, $endOffsetY); + + // calculate offsetX and offsetY of the shape + $offsetX = $startOffsetX * PHPExcel_Shared_Excel5::sizeCol($this->phpSheet, $startColumn) / 1024; + $offsetY = $startOffsetY * PHPExcel_Shared_Excel5::sizeRow($this->phpSheet, $startRow) / 256; + + switch ($obj['otObjType']) { + case 0x19: + // Note +// echo 'Cell Annotation Object
'; +// echo 'Object ID is ', $obj['idObjID'],'
'; + if (isset($this->cellNotes[$obj['idObjID']])) { + $cellNote = $this->cellNotes[$obj['idObjID']]; + + if (isset($this->textObjects[$obj['idObjID']])) { + $textObject = $this->textObjects[$obj['idObjID']]; + $this->cellNotes[$obj['idObjID']]['objTextData'] = $textObject; + } + } + break; + case 0x08: +// echo 'Picture Object
'; + // picture + // get index to BSE entry (1-based) + $BSEindex = $spContainer->getOPT(0x0104); + $BSECollection = $escherWorkbook->getDggContainer()->getBstoreContainer()->getBSECollection(); + $BSE = $BSECollection[$BSEindex - 1]; + $blipType = $BSE->getBlipType(); + + // need check because some blip types are not supported by Escher reader such as EMF + if ($blip = $BSE->getBlip()) { + $ih = imagecreatefromstring($blip->getData()); + $drawing = new PHPExcel_Worksheet_MemoryDrawing(); + $drawing->setImageResource($ih); + + // width, height, offsetX, offsetY + $drawing->setResizeProportional(false); + $drawing->setWidth($width); + $drawing->setHeight($height); + $drawing->setOffsetX($offsetX); + $drawing->setOffsetY($offsetY); + + switch ($blipType) { + case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG: + $drawing->setRenderingFunction(PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG); + $drawing->setMimeType(PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_JPEG); + break; + case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG: + $drawing->setRenderingFunction(PHPExcel_Worksheet_MemoryDrawing::RENDERING_PNG); + $drawing->setMimeType(PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_PNG); + break; + } + + $drawing->setWorksheet($this->phpSheet); + $drawing->setCoordinates($spContainer->getStartCoordinates()); + } + break; + default: + // other object type + break; + } + } + } + + // treat SHAREDFMLA records + if ($this->version == self::XLS_BIFF8) { + foreach ($this->sharedFormulaParts as $cell => $baseCell) { + list($column, $row) = PHPExcel_Cell::coordinateFromString($cell); + if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($column, $row, $this->phpSheet->getTitle())) { + $formula = $this->getFormulaFromStructure($this->sharedFormulas[$baseCell], $cell); + $this->phpSheet->getCell($cell)->setValueExplicit('=' . $formula, PHPExcel_Cell_DataType::TYPE_FORMULA); + } + } + } + + if (!empty($this->cellNotes)) { + foreach ($this->cellNotes as $note => $noteDetails) { + if (!isset($noteDetails['objTextData'])) { + if (isset($this->textObjects[$note])) { + $textObject = $this->textObjects[$note]; + $noteDetails['objTextData'] = $textObject; + } else { + $noteDetails['objTextData']['text'] = ''; + } + } +// echo 'Cell annotation ', $note,'
'; +// var_dump($noteDetails); +// echo '
'; + $cellAddress = str_replace('$', '', $noteDetails['cellRef']); + $this->phpSheet->getComment($cellAddress)->setAuthor($noteDetails['author'])->setText($this->parseRichText($noteDetails['objTextData']['text'])); + } + } + } + + // add the named ranges (defined names) + foreach ($this->definedname as $definedName) { + if ($definedName['isBuiltInName']) { + switch ($definedName['name']) { + case pack('C', 0x06): + // print area + // in general, formula looks like this: Foo!$C$7:$J$66,Bar!$A$1:$IV$2 + $ranges = explode(',', $definedName['formula']); // FIXME: what if sheetname contains comma? + + $extractedRanges = array(); + foreach ($ranges as $range) { + // $range should look like one of these + // Foo!$C$7:$J$66 + // Bar!$A$1:$IV$2 + $explodes = explode('!', $range); // FIXME: what if sheetname contains exclamation mark? + $sheetName = trim($explodes[0], "'"); + if (count($explodes) == 2) { + if (strpos($explodes[1], ':') === false) { + $explodes[1] = $explodes[1] . ':' . $explodes[1]; + } + $extractedRanges[] = str_replace('$', '', $explodes[1]); // C7:J66 + } + } + if ($docSheet = $this->phpExcel->getSheetByName($sheetName)) { + $docSheet->getPageSetup()->setPrintArea(implode(',', $extractedRanges)); // C7:J66,A1:IV2 + } + break; + case pack('C', 0x07): + // print titles (repeating rows) + // Assuming BIFF8, there are 3 cases + // 1. repeating rows + // formula looks like this: Sheet!$A$1:$IV$2 + // rows 1-2 repeat + // 2. repeating columns + // formula looks like this: Sheet!$A$1:$B$65536 + // columns A-B repeat + // 3. both repeating rows and repeating columns + // formula looks like this: Sheet!$A$1:$B$65536,Sheet!$A$1:$IV$2 + $ranges = explode(',', $definedName['formula']); // FIXME: what if sheetname contains comma? + foreach ($ranges as $range) { + // $range should look like this one of these + // Sheet!$A$1:$B$65536 + // Sheet!$A$1:$IV$2 + $explodes = explode('!', $range); + if (count($explodes) == 2) { + if ($docSheet = $this->phpExcel->getSheetByName($explodes[0])) { + $extractedRange = $explodes[1]; + $extractedRange = str_replace('$', '', $extractedRange); + + $coordinateStrings = explode(':', $extractedRange); + if (count($coordinateStrings) == 2) { + list($firstColumn, $firstRow) = PHPExcel_Cell::coordinateFromString($coordinateStrings[0]); + list($lastColumn, $lastRow) = PHPExcel_Cell::coordinateFromString($coordinateStrings[1]); + + if ($firstColumn == 'A' and $lastColumn == 'IV') { + // then we have repeating rows + $docSheet->getPageSetup()->setRowsToRepeatAtTop(array($firstRow, $lastRow)); + } elseif ($firstRow == 1 and $lastRow == 65536) { + // then we have repeating columns + $docSheet->getPageSetup()->setColumnsToRepeatAtLeft(array($firstColumn, $lastColumn)); + } + } + } + } + } + break; + } + } else { + // Extract range + $explodes = explode('!', $definedName['formula']); + + if (count($explodes) == 2) { + if (($docSheet = $this->phpExcel->getSheetByName($explodes[0])) || + ($docSheet = $this->phpExcel->getSheetByName(trim($explodes[0], "'")))) { + $extractedRange = $explodes[1]; + $extractedRange = str_replace('$', '', $extractedRange); + + $localOnly = ($definedName['scope'] == 0) ? false : true; + + $scope = ($definedName['scope'] == 0) ? null : $this->phpExcel->getSheetByName($this->sheets[$definedName['scope'] - 1]['name']); + + $this->phpExcel->addNamedRange(new PHPExcel_NamedRange((string)$definedName['name'], $docSheet, $extractedRange, $localOnly, $scope)); + } + } else { + // Named Value + // TODO Provide support for named values + } + } + } + $this->data = null; + + return $this->phpExcel; + } + + /** + * Read record data from stream, decrypting as required + * + * @param string $data Data stream to read from + * @param int $pos Position to start reading from + * @param int $length Record data length + * + * @return string Record data + */ + private function readRecordData($data, $pos, $len) + { + $data = substr($data, $pos, $len); + + // File not encrypted, or record before encryption start point + if ($this->encryption == self::MS_BIFF_CRYPTO_NONE || $pos < $this->encryptionStartPos) { + return $data; + } + + $recordData = ''; + if ($this->encryption == self::MS_BIFF_CRYPTO_RC4) { + $oldBlock = floor($this->rc4Pos / self::REKEY_BLOCK); + $block = floor($pos / self::REKEY_BLOCK); + $endBlock = floor(($pos + $len) / self::REKEY_BLOCK); + + // Spin an RC4 decryptor to the right spot. If we have a decryptor sitting + // at a point earlier in the current block, re-use it as we can save some time. + if ($block != $oldBlock || $pos < $this->rc4Pos || !$this->rc4Key) { + $this->rc4Key = $this->makeKey($block, $this->md5Ctxt); + $step = $pos % self::REKEY_BLOCK; + } else { + $step = $pos - $this->rc4Pos; + } + $this->rc4Key->RC4(str_repeat("\0", $step)); + + // Decrypt record data (re-keying at the end of every block) + while ($block != $endBlock) { + $step = self::REKEY_BLOCK - ($pos % self::REKEY_BLOCK); + $recordData .= $this->rc4Key->RC4(substr($data, 0, $step)); + $data = substr($data, $step); + $pos += $step; + $len -= $step; + $block++; + $this->rc4Key = $this->makeKey($block, $this->md5Ctxt); + } + $recordData .= $this->rc4Key->RC4(substr($data, 0, $len)); + + // Keep track of the position of this decryptor. + // We'll try and re-use it later if we can to speed things up + $this->rc4Pos = $pos + $len; + } elseif ($this->encryption == self::MS_BIFF_CRYPTO_XOR) { + throw new PHPExcel_Reader_Exception('XOr encryption not supported'); + } + return $recordData; + } + + /** + * Use OLE reader to extract the relevant data streams from the OLE file + * + * @param string $pFilename + */ + private function loadOLE($pFilename) + { + // OLE reader + $ole = new PHPExcel_Shared_OLERead(); + // get excel data, + $res = $ole->read($pFilename); + // Get workbook data: workbook stream + sheet streams + $this->data = $ole->getStream($ole->wrkbook); + // Get summary information data + $this->summaryInformation = $ole->getStream($ole->summaryInformation); + // Get additional document summary information data + $this->documentSummaryInformation = $ole->getStream($ole->documentSummaryInformation); + // Get user-defined property data +// $this->userDefinedProperties = $ole->getUserDefinedProperties(); + } + + + /** + * Read summary information + */ + private function readSummaryInformation() + { + if (!isset($this->summaryInformation)) { + return; + } + + // offset: 0; size: 2; must be 0xFE 0xFF (UTF-16 LE byte order mark) + // offset: 2; size: 2; + // offset: 4; size: 2; OS version + // offset: 6; size: 2; OS indicator + // offset: 8; size: 16 + // offset: 24; size: 4; section count + $secCount = self::getInt4d($this->summaryInformation, 24); + + // offset: 28; size: 16; first section's class id: e0 85 9f f2 f9 4f 68 10 ab 91 08 00 2b 27 b3 d9 + // offset: 44; size: 4 + $secOffset = self::getInt4d($this->summaryInformation, 44); + + // section header + // offset: $secOffset; size: 4; section length + $secLength = self::getInt4d($this->summaryInformation, $secOffset); + + // offset: $secOffset+4; size: 4; property count + $countProperties = self::getInt4d($this->summaryInformation, $secOffset+4); + + // initialize code page (used to resolve string values) + $codePage = 'CP1252'; + + // offset: ($secOffset+8); size: var + // loop through property decarations and properties + for ($i = 0; $i < $countProperties; ++$i) { + // offset: ($secOffset+8) + (8 * $i); size: 4; property ID + $id = self::getInt4d($this->summaryInformation, ($secOffset+8) + (8 * $i)); + + // Use value of property id as appropriate + // offset: ($secOffset+12) + (8 * $i); size: 4; offset from beginning of section (48) + $offset = self::getInt4d($this->summaryInformation, ($secOffset+12) + (8 * $i)); + + $type = self::getInt4d($this->summaryInformation, $secOffset + $offset); + + // initialize property value + $value = null; + + // extract property value based on property type + switch ($type) { + case 0x02: // 2 byte signed integer + $value = self::getInt2d($this->summaryInformation, $secOffset + 4 + $offset); + break; + case 0x03: // 4 byte signed integer + $value = self::getInt4d($this->summaryInformation, $secOffset + 4 + $offset); + break; + case 0x13: // 4 byte unsigned integer + // not needed yet, fix later if necessary + break; + case 0x1E: // null-terminated string prepended by dword string length + $byteLength = self::getInt4d($this->summaryInformation, $secOffset + 4 + $offset); + $value = substr($this->summaryInformation, $secOffset + 8 + $offset, $byteLength); + $value = PHPExcel_Shared_String::ConvertEncoding($value, 'UTF-8', $codePage); + $value = rtrim($value); + break; + case 0x40: // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601) + // PHP-time + $value = PHPExcel_Shared_OLE::OLE2LocalDate(substr($this->summaryInformation, $secOffset + 4 + $offset, 8)); + break; + case 0x47: // Clipboard format + // not needed yet, fix later if necessary + break; + } + + switch ($id) { + case 0x01: // Code Page + $codePage = PHPExcel_Shared_CodePage::NumberToName($value); + break; + case 0x02: // Title + $this->phpExcel->getProperties()->setTitle($value); + break; + case 0x03: // Subject + $this->phpExcel->getProperties()->setSubject($value); + break; + case 0x04: // Author (Creator) + $this->phpExcel->getProperties()->setCreator($value); + break; + case 0x05: // Keywords + $this->phpExcel->getProperties()->setKeywords($value); + break; + case 0x06: // Comments (Description) + $this->phpExcel->getProperties()->setDescription($value); + break; + case 0x07: // Template + // Not supported by PHPExcel + break; + case 0x08: // Last Saved By (LastModifiedBy) + $this->phpExcel->getProperties()->setLastModifiedBy($value); + break; + case 0x09: // Revision + // Not supported by PHPExcel + break; + case 0x0A: // Total Editing Time + // Not supported by PHPExcel + break; + case 0x0B: // Last Printed + // Not supported by PHPExcel + break; + case 0x0C: // Created Date/Time + $this->phpExcel->getProperties()->setCreated($value); + break; + case 0x0D: // Modified Date/Time + $this->phpExcel->getProperties()->setModified($value); + break; + case 0x0E: // Number of Pages + // Not supported by PHPExcel + break; + case 0x0F: // Number of Words + // Not supported by PHPExcel + break; + case 0x10: // Number of Characters + // Not supported by PHPExcel + break; + case 0x11: // Thumbnail + // Not supported by PHPExcel + break; + case 0x12: // Name of creating application + // Not supported by PHPExcel + break; + case 0x13: // Security + // Not supported by PHPExcel + break; + } + } + } + + + /** + * Read additional document summary information + */ + private function readDocumentSummaryInformation() + { + if (!isset($this->documentSummaryInformation)) { + return; + } + + // offset: 0; size: 2; must be 0xFE 0xFF (UTF-16 LE byte order mark) + // offset: 2; size: 2; + // offset: 4; size: 2; OS version + // offset: 6; size: 2; OS indicator + // offset: 8; size: 16 + // offset: 24; size: 4; section count + $secCount = self::getInt4d($this->documentSummaryInformation, 24); +// echo '$secCount = ', $secCount,'
'; + + // offset: 28; size: 16; first section's class id: 02 d5 cd d5 9c 2e 1b 10 93 97 08 00 2b 2c f9 ae + // offset: 44; size: 4; first section offset + $secOffset = self::getInt4d($this->documentSummaryInformation, 44); +// echo '$secOffset = ', $secOffset,'
'; + + // section header + // offset: $secOffset; size: 4; section length + $secLength = self::getInt4d($this->documentSummaryInformation, $secOffset); +// echo '$secLength = ', $secLength,'
'; + + // offset: $secOffset+4; size: 4; property count + $countProperties = self::getInt4d($this->documentSummaryInformation, $secOffset+4); +// echo '$countProperties = ', $countProperties,'
'; + + // initialize code page (used to resolve string values) + $codePage = 'CP1252'; + + // offset: ($secOffset+8); size: var + // loop through property decarations and properties + for ($i = 0; $i < $countProperties; ++$i) { +// echo 'Property ', $i,'
'; + // offset: ($secOffset+8) + (8 * $i); size: 4; property ID + $id = self::getInt4d($this->documentSummaryInformation, ($secOffset+8) + (8 * $i)); +// echo 'ID is ', $id,'
'; + + // Use value of property id as appropriate + // offset: 60 + 8 * $i; size: 4; offset from beginning of section (48) + $offset = self::getInt4d($this->documentSummaryInformation, ($secOffset+12) + (8 * $i)); + + $type = self::getInt4d($this->documentSummaryInformation, $secOffset + $offset); +// echo 'Type is ', $type,', '; + + // initialize property value + $value = null; + + // extract property value based on property type + switch ($type) { + case 0x02: // 2 byte signed integer + $value = self::getInt2d($this->documentSummaryInformation, $secOffset + 4 + $offset); + break; + case 0x03: // 4 byte signed integer + $value = self::getInt4d($this->documentSummaryInformation, $secOffset + 4 + $offset); + break; + case 0x0B: // Boolean + $value = self::getInt2d($this->documentSummaryInformation, $secOffset + 4 + $offset); + $value = ($value == 0 ? false : true); + break; + case 0x13: // 4 byte unsigned integer + // not needed yet, fix later if necessary + break; + case 0x1E: // null-terminated string prepended by dword string length + $byteLength = self::getInt4d($this->documentSummaryInformation, $secOffset + 4 + $offset); + $value = substr($this->documentSummaryInformation, $secOffset + 8 + $offset, $byteLength); + $value = PHPExcel_Shared_String::ConvertEncoding($value, 'UTF-8', $codePage); + $value = rtrim($value); + break; + case 0x40: // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601) + // PHP-Time + $value = PHPExcel_Shared_OLE::OLE2LocalDate(substr($this->documentSummaryInformation, $secOffset + 4 + $offset, 8)); + break; + case 0x47: // Clipboard format + // not needed yet, fix later if necessary + break; + } + + switch ($id) { + case 0x01: // Code Page + $codePage = PHPExcel_Shared_CodePage::NumberToName($value); + break; + case 0x02: // Category + $this->phpExcel->getProperties()->setCategory($value); + break; + case 0x03: // Presentation Target + // Not supported by PHPExcel + break; + case 0x04: // Bytes + // Not supported by PHPExcel + break; + case 0x05: // Lines + // Not supported by PHPExcel + break; + case 0x06: // Paragraphs + // Not supported by PHPExcel + break; + case 0x07: // Slides + // Not supported by PHPExcel + break; + case 0x08: // Notes + // Not supported by PHPExcel + break; + case 0x09: // Hidden Slides + // Not supported by PHPExcel + break; + case 0x0A: // MM Clips + // Not supported by PHPExcel + break; + case 0x0B: // Scale Crop + // Not supported by PHPExcel + break; + case 0x0C: // Heading Pairs + // Not supported by PHPExcel + break; + case 0x0D: // Titles of Parts + // Not supported by PHPExcel + break; + case 0x0E: // Manager + $this->phpExcel->getProperties()->setManager($value); + break; + case 0x0F: // Company + $this->phpExcel->getProperties()->setCompany($value); + break; + case 0x10: // Links up-to-date + // Not supported by PHPExcel + break; + } + } + } + + + /** + * Reads a general type of BIFF record. Does nothing except for moving stream pointer forward to next record. + */ + private function readDefault() + { + $length = self::getInt2d($this->data, $this->pos + 2); +// $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + } + + + /** + * The NOTE record specifies a comment associated with a particular cell. In Excel 95 (BIFF7) and earlier versions, + * this record stores a note (cell note). This feature was significantly enhanced in Excel 97. + */ + private function readNote() + { +// echo 'Read Cell Annotation
'; + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if ($this->readDataOnly) { + return; + } + + $cellAddress = $this->readBIFF8CellAddress(substr($recordData, 0, 4)); + if ($this->version == self::XLS_BIFF8) { + $noteObjID = self::getInt2d($recordData, 6); + $noteAuthor = self::readUnicodeStringLong(substr($recordData, 8)); + $noteAuthor = $noteAuthor['value']; +// echo 'Note Address=', $cellAddress,'
'; +// echo 'Note Object ID=', $noteObjID,'
'; +// echo 'Note Author=', $noteAuthor,'
'; +// + $this->cellNotes[$noteObjID] = array( + 'cellRef' => $cellAddress, + 'objectID' => $noteObjID, + 'author' => $noteAuthor + ); + } else { + $extension = false; + if ($cellAddress == '$B$65536') { + // If the address row is -1 and the column is 0, (which translates as $B$65536) then this is a continuation + // note from the previous cell annotation. We're not yet handling this, so annotations longer than the + // max 2048 bytes will probably throw a wobbly. + $row = self::getInt2d($recordData, 0); + $extension = true; + $cellAddress = array_pop(array_keys($this->phpSheet->getComments())); + } +// echo 'Note Address=', $cellAddress,'
'; + + $cellAddress = str_replace('$', '', $cellAddress); + $noteLength = self::getInt2d($recordData, 4); + $noteText = trim(substr($recordData, 6)); +// echo 'Note Length=', $noteLength,'
'; +// echo 'Note Text=', $noteText,'
'; + + if ($extension) { + // Concatenate this extension with the currently set comment for the cell + $comment = $this->phpSheet->getComment($cellAddress); + $commentText = $comment->getText()->getPlainText(); + $comment->setText($this->parseRichText($commentText.$noteText)); + } else { + // Set comment for the cell + $this->phpSheet->getComment($cellAddress)->setText($this->parseRichText($noteText)); +// ->setAuthor($author) + } + } + + } + + + /** + * The TEXT Object record contains the text associated with a cell annotation. + */ + private function readTextObject() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if ($this->readDataOnly) { + return; + } + + // recordData consists of an array of subrecords looking like this: + // grbit: 2 bytes; Option Flags + // rot: 2 bytes; rotation + // cchText: 2 bytes; length of the text (in the first continue record) + // cbRuns: 2 bytes; length of the formatting (in the second continue record) + // followed by the continuation records containing the actual text and formatting + $grbitOpts = self::getInt2d($recordData, 0); + $rot = self::getInt2d($recordData, 2); + $cchText = self::getInt2d($recordData, 10); + $cbRuns = self::getInt2d($recordData, 12); + $text = $this->getSplicedRecordData(); + + $this->textObjects[$this->textObjRef] = array( + 'text' => substr($text["recordData"], $text["spliceOffsets"][0]+1, $cchText), + 'format' => substr($text["recordData"], $text["spliceOffsets"][1], $cbRuns), + 'alignment' => $grbitOpts, + 'rotation' => $rot + ); + +// echo '_readTextObject()
'; +// var_dump($this->textObjects[$this->textObjRef]); +// echo '
'; + } + + + /** + * Read BOF + */ + private function readBof() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = substr($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // offset: 2; size: 2; type of the following data + $substreamType = self::getInt2d($recordData, 2); + + switch ($substreamType) { + case self::XLS_WorkbookGlobals: + $version = self::getInt2d($recordData, 0); + if (($version != self::XLS_BIFF8) && ($version != self::XLS_BIFF7)) { + throw new PHPExcel_Reader_Exception('Cannot read this Excel file. Version is too old.'); + } + $this->version = $version; + break; + case self::XLS_Worksheet: + // do not use this version information for anything + // it is unreliable (OpenOffice doc, 5.8), use only version information from the global stream + break; + default: + // substream, e.g. chart + // just skip the entire substream + do { + $code = self::getInt2d($this->data, $this->pos); + $this->readDefault(); + } while ($code != self::XLS_TYPE_EOF && $this->pos < $this->dataSize); + break; + } + } + + + /** + * FILEPASS + * + * This record is part of the File Protection Block. It + * contains information about the read/write password of the + * file. All record contents following this record will be + * encrypted. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + * + * The decryption functions and objects used from here on in + * are based on the source of Spreadsheet-ParseExcel: + * http://search.cpan.org/~jmcnamara/Spreadsheet-ParseExcel/ + */ + private function readFilepass() + { + $length = self::getInt2d($this->data, $this->pos + 2); + + if ($length != 54) { + throw new PHPExcel_Reader_Exception('Unexpected file pass record length'); + } + + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if (!$this->verifyPassword('VelvetSweatshop', substr($recordData, 6, 16), substr($recordData, 22, 16), substr($recordData, 38, 16), $this->md5Ctxt)) { + throw new PHPExcel_Reader_Exception('Decryption password incorrect'); + } + + $this->encryption = self::MS_BIFF_CRYPTO_RC4; + + // Decryption required from the record after next onwards + $this->encryptionStartPos = $this->pos + self::getInt2d($this->data, $this->pos + 2); + } + + /** + * Make an RC4 decryptor for the given block + * + * @var int $block Block for which to create decrypto + * @var string $valContext MD5 context state + * + * @return PHPExcel_Reader_Excel5_RC4 + */ + private function makeKey($block, $valContext) + { + $pwarray = str_repeat("\0", 64); + + for ($i = 0; $i < 5; $i++) { + $pwarray[$i] = $valContext[$i]; + } + + $pwarray[5] = chr($block & 0xff); + $pwarray[6] = chr(($block >> 8) & 0xff); + $pwarray[7] = chr(($block >> 16) & 0xff); + $pwarray[8] = chr(($block >> 24) & 0xff); + + $pwarray[9] = "\x80"; + $pwarray[56] = "\x48"; + + $md5 = new PHPExcel_Reader_Excel5_MD5(); + $md5->add($pwarray); + + $s = $md5->getContext(); + return new PHPExcel_Reader_Excel5_RC4($s); + } + + /** + * Verify RC4 file password + * + * @var string $password Password to check + * @var string $docid Document id + * @var string $salt_data Salt data + * @var string $hashedsalt_data Hashed salt data + * @var string &$valContext Set to the MD5 context of the value + * + * @return bool Success + */ + private function verifyPassword($password, $docid, $salt_data, $hashedsalt_data, &$valContext) + { + $pwarray = str_repeat("\0", 64); + + for ($i = 0; $i < strlen($password); $i++) { + $o = ord(substr($password, $i, 1)); + $pwarray[2 * $i] = chr($o & 0xff); + $pwarray[2 * $i + 1] = chr(($o >> 8) & 0xff); + } + $pwarray[2 * $i] = chr(0x80); + $pwarray[56] = chr(($i << 4) & 0xff); + + $md5 = new PHPExcel_Reader_Excel5_MD5(); + $md5->add($pwarray); + + $mdContext1 = $md5->getContext(); + + $offset = 0; + $keyoffset = 0; + $tocopy = 5; + + $md5->reset(); + + while ($offset != 16) { + if ((64 - $offset) < 5) { + $tocopy = 64 - $offset; + } + for ($i = 0; $i <= $tocopy; $i++) { + $pwarray[$offset + $i] = $mdContext1[$keyoffset + $i]; + } + $offset += $tocopy; + + if ($offset == 64) { + $md5->add($pwarray); + $keyoffset = $tocopy; + $tocopy = 5 - $tocopy; + $offset = 0; + continue; + } + + $keyoffset = 0; + $tocopy = 5; + for ($i = 0; $i < 16; $i++) { + $pwarray[$offset + $i] = $docid[$i]; + } + $offset += 16; + } + + $pwarray[16] = "\x80"; + for ($i = 0; $i < 47; $i++) { + $pwarray[17 + $i] = "\0"; + } + $pwarray[56] = "\x80"; + $pwarray[57] = "\x0a"; + + $md5->add($pwarray); + $valContext = $md5->getContext(); + + $key = $this->makeKey(0, $valContext); + + $salt = $key->RC4($salt_data); + $hashedsalt = $key->RC4($hashedsalt_data); + + $salt .= "\x80" . str_repeat("\0", 47); + $salt[56] = "\x80"; + + $md5->reset(); + $md5->add($salt); + $mdContext2 = $md5->getContext(); + + return $mdContext2 == $hashedsalt; + } + + /** + * CODEPAGE + * + * This record stores the text encoding used to write byte + * strings, stored as MS Windows code page identifier. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function readCodepage() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // offset: 0; size: 2; code page identifier + $codepage = self::getInt2d($recordData, 0); + + $this->codepage = PHPExcel_Shared_CodePage::NumberToName($codepage); + } + + + /** + * DATEMODE + * + * This record specifies the base date for displaying date + * values. All dates are stored as count of days past this + * base date. In BIFF2-BIFF4 this record is part of the + * Calculation Settings Block. In BIFF5-BIFF8 it is + * stored in the Workbook Globals Substream. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function readDateMode() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // offset: 0; size: 2; 0 = base 1900, 1 = base 1904 + PHPExcel_Shared_Date::setExcelCalendar(PHPExcel_Shared_Date::CALENDAR_WINDOWS_1900); + if (ord($recordData{0}) == 1) { + PHPExcel_Shared_Date::setExcelCalendar(PHPExcel_Shared_Date::CALENDAR_MAC_1904); + } + } + + + /** + * Read a FONT record + */ + private function readFont() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if (!$this->readDataOnly) { + $objFont = new PHPExcel_Style_Font(); + + // offset: 0; size: 2; height of the font (in twips = 1/20 of a point) + $size = self::getInt2d($recordData, 0); + $objFont->setSize($size / 20); + + // offset: 2; size: 2; option flags + // bit: 0; mask 0x0001; bold (redundant in BIFF5-BIFF8) + // bit: 1; mask 0x0002; italic + $isItalic = (0x0002 & self::getInt2d($recordData, 2)) >> 1; + if ($isItalic) { + $objFont->setItalic(true); + } + + // bit: 2; mask 0x0004; underlined (redundant in BIFF5-BIFF8) + // bit: 3; mask 0x0008; strike + $isStrike = (0x0008 & self::getInt2d($recordData, 2)) >> 3; + if ($isStrike) { + $objFont->setStrikethrough(true); + } + + // offset: 4; size: 2; colour index + $colorIndex = self::getInt2d($recordData, 4); + $objFont->colorIndex = $colorIndex; + + // offset: 6; size: 2; font weight + $weight = self::getInt2d($recordData, 6); + switch ($weight) { + case 0x02BC: + $objFont->setBold(true); + break; + } + + // offset: 8; size: 2; escapement type + $escapement = self::getInt2d($recordData, 8); + switch ($escapement) { + case 0x0001: + $objFont->setSuperScript(true); + break; + case 0x0002: + $objFont->setSubScript(true); + break; + } + + // offset: 10; size: 1; underline type + $underlineType = ord($recordData{10}); + switch ($underlineType) { + case 0x00: + break; // no underline + case 0x01: + $objFont->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLE); + break; + case 0x02: + $objFont->setUnderline(PHPExcel_Style_Font::UNDERLINE_DOUBLE); + break; + case 0x21: + $objFont->setUnderline(PHPExcel_Style_Font::UNDERLINE_SINGLEACCOUNTING); + break; + case 0x22: + $objFont->setUnderline(PHPExcel_Style_Font::UNDERLINE_DOUBLEACCOUNTING); + break; + } + + // offset: 11; size: 1; font family + // offset: 12; size: 1; character set + // offset: 13; size: 1; not used + // offset: 14; size: var; font name + if ($this->version == self::XLS_BIFF8) { + $string = self::readUnicodeStringShort(substr($recordData, 14)); + } else { + $string = $this->readByteStringShort(substr($recordData, 14)); + } + $objFont->setName($string['value']); + + $this->objFonts[] = $objFont; + } + } + + + /** + * FORMAT + * + * This record contains information about a number format. + * All FORMAT records occur together in a sequential list. + * + * In BIFF2-BIFF4 other records referencing a FORMAT record + * contain a zero-based index into this list. From BIFF5 on + * the FORMAT record contains the index itself that will be + * used by other records. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function readFormat() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if (!$this->readDataOnly) { + $indexCode = self::getInt2d($recordData, 0); + + if ($this->version == self::XLS_BIFF8) { + $string = self::readUnicodeStringLong(substr($recordData, 2)); + } else { + // BIFF7 + $string = $this->readByteStringShort(substr($recordData, 2)); + } + + $formatString = $string['value']; + $this->formats[$indexCode] = $formatString; + } + } + + + /** + * XF - Extended Format + * + * This record contains formatting information for cells, rows, columns or styles. + * According to http://support.microsoft.com/kb/147732 there are always at least 15 cell style XF + * and 1 cell XF. + * Inspection of Excel files generated by MS Office Excel shows that XF records 0-14 are cell style XF + * and XF record 15 is a cell XF + * We only read the first cell style XF and skip the remaining cell style XF records + * We read all cell XF records. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function readXf() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + $objStyle = new PHPExcel_Style(); + + if (!$this->readDataOnly) { + // offset: 0; size: 2; Index to FONT record + if (self::getInt2d($recordData, 0) < 4) { + $fontIndex = self::getInt2d($recordData, 0); + } else { + // this has to do with that index 4 is omitted in all BIFF versions for some strange reason + // check the OpenOffice documentation of the FONT record + $fontIndex = self::getInt2d($recordData, 0) - 1; + } + $objStyle->setFont($this->objFonts[$fontIndex]); + + // offset: 2; size: 2; Index to FORMAT record + $numberFormatIndex = self::getInt2d($recordData, 2); + if (isset($this->formats[$numberFormatIndex])) { + // then we have user-defined format code + $numberformat = array('code' => $this->formats[$numberFormatIndex]); + } elseif (($code = PHPExcel_Style_NumberFormat::builtInFormatCode($numberFormatIndex)) !== '') { + // then we have built-in format code + $numberformat = array('code' => $code); + } else { + // we set the general format code + $numberformat = array('code' => 'General'); + } + $objStyle->getNumberFormat()->setFormatCode($numberformat['code']); + + // offset: 4; size: 2; XF type, cell protection, and parent style XF + // bit 2-0; mask 0x0007; XF_TYPE_PROT + $xfTypeProt = self::getInt2d($recordData, 4); + // bit 0; mask 0x01; 1 = cell is locked + $isLocked = (0x01 & $xfTypeProt) >> 0; + $objStyle->getProtection()->setLocked($isLocked ? PHPExcel_Style_Protection::PROTECTION_INHERIT : PHPExcel_Style_Protection::PROTECTION_UNPROTECTED); + + // bit 1; mask 0x02; 1 = Formula is hidden + $isHidden = (0x02 & $xfTypeProt) >> 1; + $objStyle->getProtection()->setHidden($isHidden ? PHPExcel_Style_Protection::PROTECTION_PROTECTED : PHPExcel_Style_Protection::PROTECTION_UNPROTECTED); + + // bit 2; mask 0x04; 0 = Cell XF, 1 = Cell Style XF + $isCellStyleXf = (0x04 & $xfTypeProt) >> 2; + + // offset: 6; size: 1; Alignment and text break + // bit 2-0, mask 0x07; horizontal alignment + $horAlign = (0x07 & ord($recordData{6})) >> 0; + switch ($horAlign) { + case 0: + $objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_GENERAL); + break; + case 1: + $objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT); + break; + case 2: + $objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); + break; + case 3: + $objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT); + break; + case 4: + $objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_FILL); + break; + case 5: + $objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY); + break; + case 6: + $objStyle->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER_CONTINUOUS); + break; + } + // bit 3, mask 0x08; wrap text + $wrapText = (0x08 & ord($recordData{6})) >> 3; + switch ($wrapText) { + case 0: + $objStyle->getAlignment()->setWrapText(false); + break; + case 1: + $objStyle->getAlignment()->setWrapText(true); + break; + } + // bit 6-4, mask 0x70; vertical alignment + $vertAlign = (0x70 & ord($recordData{6})) >> 4; + switch ($vertAlign) { + case 0: + $objStyle->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_TOP); + break; + case 1: + $objStyle->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); + break; + case 2: + $objStyle->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_BOTTOM); + break; + case 3: + $objStyle->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_JUSTIFY); + break; + } + + if ($this->version == self::XLS_BIFF8) { + // offset: 7; size: 1; XF_ROTATION: Text rotation angle + $angle = ord($recordData{7}); + $rotation = 0; + if ($angle <= 90) { + $rotation = $angle; + } elseif ($angle <= 180) { + $rotation = 90 - $angle; + } elseif ($angle == 255) { + $rotation = -165; + } + $objStyle->getAlignment()->setTextRotation($rotation); + + // offset: 8; size: 1; Indentation, shrink to cell size, and text direction + // bit: 3-0; mask: 0x0F; indent level + $indent = (0x0F & ord($recordData{8})) >> 0; + $objStyle->getAlignment()->setIndent($indent); + + // bit: 4; mask: 0x10; 1 = shrink content to fit into cell + $shrinkToFit = (0x10 & ord($recordData{8})) >> 4; + switch ($shrinkToFit) { + case 0: + $objStyle->getAlignment()->setShrinkToFit(false); + break; + case 1: + $objStyle->getAlignment()->setShrinkToFit(true); + break; + } + + // offset: 9; size: 1; Flags used for attribute groups + + // offset: 10; size: 4; Cell border lines and background area + // bit: 3-0; mask: 0x0000000F; left style + if ($bordersLeftStyle = PHPExcel_Reader_Excel5_Style_Border::lookup((0x0000000F & self::getInt4d($recordData, 10)) >> 0)) { + $objStyle->getBorders()->getLeft()->setBorderStyle($bordersLeftStyle); + } + // bit: 7-4; mask: 0x000000F0; right style + if ($bordersRightStyle = PHPExcel_Reader_Excel5_Style_Border::lookup((0x000000F0 & self::getInt4d($recordData, 10)) >> 4)) { + $objStyle->getBorders()->getRight()->setBorderStyle($bordersRightStyle); + } + // bit: 11-8; mask: 0x00000F00; top style + if ($bordersTopStyle = PHPExcel_Reader_Excel5_Style_Border::lookup((0x00000F00 & self::getInt4d($recordData, 10)) >> 8)) { + $objStyle->getBorders()->getTop()->setBorderStyle($bordersTopStyle); + } + // bit: 15-12; mask: 0x0000F000; bottom style + if ($bordersBottomStyle = PHPExcel_Reader_Excel5_Style_Border::lookup((0x0000F000 & self::getInt4d($recordData, 10)) >> 12)) { + $objStyle->getBorders()->getBottom()->setBorderStyle($bordersBottomStyle); + } + // bit: 22-16; mask: 0x007F0000; left color + $objStyle->getBorders()->getLeft()->colorIndex = (0x007F0000 & self::getInt4d($recordData, 10)) >> 16; + + // bit: 29-23; mask: 0x3F800000; right color + $objStyle->getBorders()->getRight()->colorIndex = (0x3F800000 & self::getInt4d($recordData, 10)) >> 23; + + // bit: 30; mask: 0x40000000; 1 = diagonal line from top left to right bottom + $diagonalDown = (0x40000000 & self::getInt4d($recordData, 10)) >> 30 ? true : false; + + // bit: 31; mask: 0x80000000; 1 = diagonal line from bottom left to top right + $diagonalUp = (0x80000000 & self::getInt4d($recordData, 10)) >> 31 ? true : false; + + if ($diagonalUp == false && $diagonalDown == false) { + $objStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_NONE); + } elseif ($diagonalUp == true && $diagonalDown == false) { + $objStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_UP); + } elseif ($diagonalUp == false && $diagonalDown == true) { + $objStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_DOWN); + } elseif ($diagonalUp == true && $diagonalDown == true) { + $objStyle->getBorders()->setDiagonalDirection(PHPExcel_Style_Borders::DIAGONAL_BOTH); + } + + // offset: 14; size: 4; + // bit: 6-0; mask: 0x0000007F; top color + $objStyle->getBorders()->getTop()->colorIndex = (0x0000007F & self::getInt4d($recordData, 14)) >> 0; + + // bit: 13-7; mask: 0x00003F80; bottom color + $objStyle->getBorders()->getBottom()->colorIndex = (0x00003F80 & self::getInt4d($recordData, 14)) >> 7; + + // bit: 20-14; mask: 0x001FC000; diagonal color + $objStyle->getBorders()->getDiagonal()->colorIndex = (0x001FC000 & self::getInt4d($recordData, 14)) >> 14; + + // bit: 24-21; mask: 0x01E00000; diagonal style + if ($bordersDiagonalStyle = PHPExcel_Reader_Excel5_Style_Border::lookup((0x01E00000 & self::getInt4d($recordData, 14)) >> 21)) { + $objStyle->getBorders()->getDiagonal()->setBorderStyle($bordersDiagonalStyle); + } + + // bit: 31-26; mask: 0xFC000000 fill pattern + if ($fillType = PHPExcel_Reader_Excel5_Style_FillPattern::lookup((0xFC000000 & self::getInt4d($recordData, 14)) >> 26)) { + $objStyle->getFill()->setFillType($fillType); + } + // offset: 18; size: 2; pattern and background colour + // bit: 6-0; mask: 0x007F; color index for pattern color + $objStyle->getFill()->startcolorIndex = (0x007F & self::getInt2d($recordData, 18)) >> 0; + + // bit: 13-7; mask: 0x3F80; color index for pattern background + $objStyle->getFill()->endcolorIndex = (0x3F80 & self::getInt2d($recordData, 18)) >> 7; + } else { + // BIFF5 + + // offset: 7; size: 1; Text orientation and flags + $orientationAndFlags = ord($recordData{7}); + + // bit: 1-0; mask: 0x03; XF_ORIENTATION: Text orientation + $xfOrientation = (0x03 & $orientationAndFlags) >> 0; + switch ($xfOrientation) { + case 0: + $objStyle->getAlignment()->setTextRotation(0); + break; + case 1: + $objStyle->getAlignment()->setTextRotation(-165); + break; + case 2: + $objStyle->getAlignment()->setTextRotation(90); + break; + case 3: + $objStyle->getAlignment()->setTextRotation(-90); + break; + } + + // offset: 8; size: 4; cell border lines and background area + $borderAndBackground = self::getInt4d($recordData, 8); + + // bit: 6-0; mask: 0x0000007F; color index for pattern color + $objStyle->getFill()->startcolorIndex = (0x0000007F & $borderAndBackground) >> 0; + + // bit: 13-7; mask: 0x00003F80; color index for pattern background + $objStyle->getFill()->endcolorIndex = (0x00003F80 & $borderAndBackground) >> 7; + + // bit: 21-16; mask: 0x003F0000; fill pattern + $objStyle->getFill()->setFillType(PHPExcel_Reader_Excel5_Style_FillPattern::lookup((0x003F0000 & $borderAndBackground) >> 16)); + + // bit: 24-22; mask: 0x01C00000; bottom line style + $objStyle->getBorders()->getBottom()->setBorderStyle(PHPExcel_Reader_Excel5_Style_Border::lookup((0x01C00000 & $borderAndBackground) >> 22)); + + // bit: 31-25; mask: 0xFE000000; bottom line color + $objStyle->getBorders()->getBottom()->colorIndex = (0xFE000000 & $borderAndBackground) >> 25; + + // offset: 12; size: 4; cell border lines + $borderLines = self::getInt4d($recordData, 12); + + // bit: 2-0; mask: 0x00000007; top line style + $objStyle->getBorders()->getTop()->setBorderStyle(PHPExcel_Reader_Excel5_Style_Border::lookup((0x00000007 & $borderLines) >> 0)); + + // bit: 5-3; mask: 0x00000038; left line style + $objStyle->getBorders()->getLeft()->setBorderStyle(PHPExcel_Reader_Excel5_Style_Border::lookup((0x00000038 & $borderLines) >> 3)); + + // bit: 8-6; mask: 0x000001C0; right line style + $objStyle->getBorders()->getRight()->setBorderStyle(PHPExcel_Reader_Excel5_Style_Border::lookup((0x000001C0 & $borderLines) >> 6)); + + // bit: 15-9; mask: 0x0000FE00; top line color index + $objStyle->getBorders()->getTop()->colorIndex = (0x0000FE00 & $borderLines) >> 9; + + // bit: 22-16; mask: 0x007F0000; left line color index + $objStyle->getBorders()->getLeft()->colorIndex = (0x007F0000 & $borderLines) >> 16; + + // bit: 29-23; mask: 0x3F800000; right line color index + $objStyle->getBorders()->getRight()->colorIndex = (0x3F800000 & $borderLines) >> 23; + } + + // add cellStyleXf or cellXf and update mapping + if ($isCellStyleXf) { + // we only read one style XF record which is always the first + if ($this->xfIndex == 0) { + $this->phpExcel->addCellStyleXf($objStyle); + $this->mapCellStyleXfIndex[$this->xfIndex] = 0; + } + } else { + // we read all cell XF records + $this->phpExcel->addCellXf($objStyle); + $this->mapCellXfIndex[$this->xfIndex] = count($this->phpExcel->getCellXfCollection()) - 1; + } + + // update XF index for when we read next record + ++$this->xfIndex; + } + } + + + /** + * + */ + private function readXfExt() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if (!$this->readDataOnly) { + // offset: 0; size: 2; 0x087D = repeated header + + // offset: 2; size: 2 + + // offset: 4; size: 8; not used + + // offset: 12; size: 2; record version + + // offset: 14; size: 2; index to XF record which this record modifies + $ixfe = self::getInt2d($recordData, 14); + + // offset: 16; size: 2; not used + + // offset: 18; size: 2; number of extension properties that follow + $cexts = self::getInt2d($recordData, 18); + + // start reading the actual extension data + $offset = 20; + while ($offset < $length) { + // extension type + $extType = self::getInt2d($recordData, $offset); + + // extension length + $cb = self::getInt2d($recordData, $offset + 2); + + // extension data + $extData = substr($recordData, $offset + 4, $cb); + + switch ($extType) { + case 4: // fill start color + $xclfType = self::getInt2d($extData, 0); // color type + $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + + if ($xclfType == 2) { + $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2})); + + // modify the relevant style property + if (isset($this->mapCellXfIndex[$ixfe])) { + $fill = $this->phpExcel->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getFill(); + $fill->getStartColor()->setRGB($rgb); + unset($fill->startcolorIndex); // normal color index does not apply, discard + } + } + break; + case 5: // fill end color + $xclfType = self::getInt2d($extData, 0); // color type + $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + + if ($xclfType == 2) { + $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2})); + + // modify the relevant style property + if (isset($this->mapCellXfIndex[$ixfe])) { + $fill = $this->phpExcel->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getFill(); + $fill->getEndColor()->setRGB($rgb); + unset($fill->endcolorIndex); // normal color index does not apply, discard + } + } + break; + case 7: // border color top + $xclfType = self::getInt2d($extData, 0); // color type + $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + + if ($xclfType == 2) { + $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2})); + + // modify the relevant style property + if (isset($this->mapCellXfIndex[$ixfe])) { + $top = $this->phpExcel->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getBorders()->getTop(); + $top->getColor()->setRGB($rgb); + unset($top->colorIndex); // normal color index does not apply, discard + } + } + break; + case 8: // border color bottom + $xclfType = self::getInt2d($extData, 0); // color type + $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + + if ($xclfType == 2) { + $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2})); + + // modify the relevant style property + if (isset($this->mapCellXfIndex[$ixfe])) { + $bottom = $this->phpExcel->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getBorders()->getBottom(); + $bottom->getColor()->setRGB($rgb); + unset($bottom->colorIndex); // normal color index does not apply, discard + } + } + break; + case 9: // border color left + $xclfType = self::getInt2d($extData, 0); // color type + $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + + if ($xclfType == 2) { + $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2})); + + // modify the relevant style property + if (isset($this->mapCellXfIndex[$ixfe])) { + $left = $this->phpExcel->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getBorders()->getLeft(); + $left->getColor()->setRGB($rgb); + unset($left->colorIndex); // normal color index does not apply, discard + } + } + break; + case 10: // border color right + $xclfType = self::getInt2d($extData, 0); // color type + $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + + if ($xclfType == 2) { + $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2})); + + // modify the relevant style property + if (isset($this->mapCellXfIndex[$ixfe])) { + $right = $this->phpExcel->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getBorders()->getRight(); + $right->getColor()->setRGB($rgb); + unset($right->colorIndex); // normal color index does not apply, discard + } + } + break; + case 11: // border color diagonal + $xclfType = self::getInt2d($extData, 0); // color type + $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + + if ($xclfType == 2) { + $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2})); + + // modify the relevant style property + if (isset($this->mapCellXfIndex[$ixfe])) { + $diagonal = $this->phpExcel->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getBorders()->getDiagonal(); + $diagonal->getColor()->setRGB($rgb); + unset($diagonal->colorIndex); // normal color index does not apply, discard + } + } + break; + case 13: // font color + $xclfType = self::getInt2d($extData, 0); // color type + $xclrValue = substr($extData, 4, 4); // color value (value based on color type) + + if ($xclfType == 2) { + $rgb = sprintf('%02X%02X%02X', ord($xclrValue{0}), ord($xclrValue{1}), ord($xclrValue{2})); + + // modify the relevant style property + if (isset($this->mapCellXfIndex[$ixfe])) { + $font = $this->phpExcel->getCellXfByIndex($this->mapCellXfIndex[$ixfe])->getFont(); + $font->getColor()->setRGB($rgb); + unset($font->colorIndex); // normal color index does not apply, discard + } + } + break; + } + + $offset += $cb; + } + } + + } + + + /** + * Read STYLE record + */ + private function readStyle() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if (!$this->readDataOnly) { + // offset: 0; size: 2; index to XF record and flag for built-in style + $ixfe = self::getInt2d($recordData, 0); + + // bit: 11-0; mask 0x0FFF; index to XF record + $xfIndex = (0x0FFF & $ixfe) >> 0; + + // bit: 15; mask 0x8000; 0 = user-defined style, 1 = built-in style + $isBuiltIn = (bool) ((0x8000 & $ixfe) >> 15); + + if ($isBuiltIn) { + // offset: 2; size: 1; identifier for built-in style + $builtInId = ord($recordData{2}); + + switch ($builtInId) { + case 0x00: + // currently, we are not using this for anything + break; + default: + break; + } + } else { + // user-defined; not supported by PHPExcel + } + } + } + + + /** + * Read PALETTE record + */ + private function readPalette() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if (!$this->readDataOnly) { + // offset: 0; size: 2; number of following colors + $nm = self::getInt2d($recordData, 0); + + // list of RGB colors + for ($i = 0; $i < $nm; ++$i) { + $rgb = substr($recordData, 2 + 4 * $i, 4); + $this->palette[] = self::readRGB($rgb); + } + } + } + + + /** + * SHEET + * + * This record is located in the Workbook Globals + * Substream and represents a sheet inside the workbook. + * One SHEET record is written for each sheet. It stores the + * sheet name and a stream offset to the BOF record of the + * respective Sheet Substream within the Workbook Stream. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function readSheet() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // offset: 0; size: 4; absolute stream position of the BOF record of the sheet + // NOTE: not encrypted + $rec_offset = self::getInt4d($this->data, $this->pos + 4); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // offset: 4; size: 1; sheet state + switch (ord($recordData{4})) { + case 0x00: + $sheetState = PHPExcel_Worksheet::SHEETSTATE_VISIBLE; + break; + case 0x01: + $sheetState = PHPExcel_Worksheet::SHEETSTATE_HIDDEN; + break; + case 0x02: + $sheetState = PHPExcel_Worksheet::SHEETSTATE_VERYHIDDEN; + break; + default: + $sheetState = PHPExcel_Worksheet::SHEETSTATE_VISIBLE; + break; + } + + // offset: 5; size: 1; sheet type + $sheetType = ord($recordData{5}); + + // offset: 6; size: var; sheet name + if ($this->version == self::XLS_BIFF8) { + $string = self::readUnicodeStringShort(substr($recordData, 6)); + $rec_name = $string['value']; + } elseif ($this->version == self::XLS_BIFF7) { + $string = $this->readByteStringShort(substr($recordData, 6)); + $rec_name = $string['value']; + } + + $this->sheets[] = array( + 'name' => $rec_name, + 'offset' => $rec_offset, + 'sheetState' => $sheetState, + 'sheetType' => $sheetType, + ); + } + + + /** + * Read EXTERNALBOOK record + */ + private function readExternalBook() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // offset within record data + $offset = 0; + + // there are 4 types of records + if (strlen($recordData) > 4) { + // external reference + // offset: 0; size: 2; number of sheet names ($nm) + $nm = self::getInt2d($recordData, 0); + $offset += 2; + + // offset: 2; size: var; encoded URL without sheet name (Unicode string, 16-bit length) + $encodedUrlString = self::readUnicodeStringLong(substr($recordData, 2)); + $offset += $encodedUrlString['size']; + + // offset: var; size: var; list of $nm sheet names (Unicode strings, 16-bit length) + $externalSheetNames = array(); + for ($i = 0; $i < $nm; ++$i) { + $externalSheetNameString = self::readUnicodeStringLong(substr($recordData, $offset)); + $externalSheetNames[] = $externalSheetNameString['value']; + $offset += $externalSheetNameString['size']; + } + + // store the record data + $this->externalBooks[] = array( + 'type' => 'external', + 'encodedUrl' => $encodedUrlString['value'], + 'externalSheetNames' => $externalSheetNames, + ); + } elseif (substr($recordData, 2, 2) == pack('CC', 0x01, 0x04)) { + // internal reference + // offset: 0; size: 2; number of sheet in this document + // offset: 2; size: 2; 0x01 0x04 + $this->externalBooks[] = array( + 'type' => 'internal', + ); + } elseif (substr($recordData, 0, 4) == pack('vCC', 0x0001, 0x01, 0x3A)) { + // add-in function + // offset: 0; size: 2; 0x0001 + $this->externalBooks[] = array( + 'type' => 'addInFunction', + ); + } elseif (substr($recordData, 0, 2) == pack('v', 0x0000)) { + // DDE links, OLE links + // offset: 0; size: 2; 0x0000 + // offset: 2; size: var; encoded source document name + $this->externalBooks[] = array( + 'type' => 'DDEorOLE', + ); + } + } + + + /** + * Read EXTERNNAME record. + */ + private function readExternName() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // external sheet references provided for named cells + if ($this->version == self::XLS_BIFF8) { + // offset: 0; size: 2; options + $options = self::getInt2d($recordData, 0); + + // offset: 2; size: 2; + + // offset: 4; size: 2; not used + + // offset: 6; size: var + $nameString = self::readUnicodeStringShort(substr($recordData, 6)); + + // offset: var; size: var; formula data + $offset = 6 + $nameString['size']; + $formula = $this->getFormulaFromStructure(substr($recordData, $offset)); + + $this->externalNames[] = array( + 'name' => $nameString['value'], + 'formula' => $formula, + ); + } + } + + + /** + * Read EXTERNSHEET record + */ + private function readExternSheet() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // external sheet references provided for named cells + if ($this->version == self::XLS_BIFF8) { + // offset: 0; size: 2; number of following ref structures + $nm = self::getInt2d($recordData, 0); + for ($i = 0; $i < $nm; ++$i) { + $this->ref[] = array( + // offset: 2 + 6 * $i; index to EXTERNALBOOK record + 'externalBookIndex' => self::getInt2d($recordData, 2 + 6 * $i), + // offset: 4 + 6 * $i; index to first sheet in EXTERNALBOOK record + 'firstSheetIndex' => self::getInt2d($recordData, 4 + 6 * $i), + // offset: 6 + 6 * $i; index to last sheet in EXTERNALBOOK record + 'lastSheetIndex' => self::getInt2d($recordData, 6 + 6 * $i), + ); + } + } + } + + + /** + * DEFINEDNAME + * + * This record is part of a Link Table. It contains the name + * and the token array of an internal defined name. Token + * arrays of defined names contain tokens with aberrant + * token classes. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function readDefinedName() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if ($this->version == self::XLS_BIFF8) { + // retrieves named cells + + // offset: 0; size: 2; option flags + $opts = self::getInt2d($recordData, 0); + + // bit: 5; mask: 0x0020; 0 = user-defined name, 1 = built-in-name + $isBuiltInName = (0x0020 & $opts) >> 5; + + // offset: 2; size: 1; keyboard shortcut + + // offset: 3; size: 1; length of the name (character count) + $nlen = ord($recordData{3}); + + // offset: 4; size: 2; size of the formula data (it can happen that this is zero) + // note: there can also be additional data, this is not included in $flen + $flen = self::getInt2d($recordData, 4); + + // offset: 8; size: 2; 0=Global name, otherwise index to sheet (1-based) + $scope = self::getInt2d($recordData, 8); + + // offset: 14; size: var; Name (Unicode string without length field) + $string = self::readUnicodeString(substr($recordData, 14), $nlen); + + // offset: var; size: $flen; formula data + $offset = 14 + $string['size']; + $formulaStructure = pack('v', $flen) . substr($recordData, $offset); + + try { + $formula = $this->getFormulaFromStructure($formulaStructure); + } catch (PHPExcel_Exception $e) { + $formula = ''; + } + + $this->definedname[] = array( + 'isBuiltInName' => $isBuiltInName, + 'name' => $string['value'], + 'formula' => $formula, + 'scope' => $scope, + ); + } + } + + + /** + * Read MSODRAWINGGROUP record + */ + private function readMsoDrawingGroup() + { + $length = self::getInt2d($this->data, $this->pos + 2); + + // get spliced record data + $splicedRecordData = $this->getSplicedRecordData(); + $recordData = $splicedRecordData['recordData']; + + $this->drawingGroupData .= $recordData; + } + + + /** + * SST - Shared String Table + * + * This record contains a list of all strings used anywhere + * in the workbook. Each string occurs only once. The + * workbook uses indexes into the list to reference the + * strings. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + **/ + private function readSst() + { + // offset within (spliced) record data + $pos = 0; + + // get spliced record data + $splicedRecordData = $this->getSplicedRecordData(); + + $recordData = $splicedRecordData['recordData']; + $spliceOffsets = $splicedRecordData['spliceOffsets']; + + // offset: 0; size: 4; total number of strings in the workbook + $pos += 4; + + // offset: 4; size: 4; number of following strings ($nm) + $nm = self::getInt4d($recordData, 4); + $pos += 4; + + // loop through the Unicode strings (16-bit length) + for ($i = 0; $i < $nm; ++$i) { + // number of characters in the Unicode string + $numChars = self::getInt2d($recordData, $pos); + $pos += 2; + + // option flags + $optionFlags = ord($recordData{$pos}); + ++$pos; + + // bit: 0; mask: 0x01; 0 = compressed; 1 = uncompressed + $isCompressed = (($optionFlags & 0x01) == 0) ; + + // bit: 2; mask: 0x02; 0 = ordinary; 1 = Asian phonetic + $hasAsian = (($optionFlags & 0x04) != 0); + + // bit: 3; mask: 0x03; 0 = ordinary; 1 = Rich-Text + $hasRichText = (($optionFlags & 0x08) != 0); + + if ($hasRichText) { + // number of Rich-Text formatting runs + $formattingRuns = self::getInt2d($recordData, $pos); + $pos += 2; + } + + if ($hasAsian) { + // size of Asian phonetic setting + $extendedRunLength = self::getInt4d($recordData, $pos); + $pos += 4; + } + + // expected byte length of character array if not split + $len = ($isCompressed) ? $numChars : $numChars * 2; + + // look up limit position + foreach ($spliceOffsets as $spliceOffset) { + // it can happen that the string is empty, therefore we need + // <= and not just < + if ($pos <= $spliceOffset) { + $limitpos = $spliceOffset; + break; + } + } + + if ($pos + $len <= $limitpos) { + // character array is not split between records + + $retstr = substr($recordData, $pos, $len); + $pos += $len; + } else { + // character array is split between records + + // first part of character array + $retstr = substr($recordData, $pos, $limitpos - $pos); + + $bytesRead = $limitpos - $pos; + + // remaining characters in Unicode string + $charsLeft = $numChars - (($isCompressed) ? $bytesRead : ($bytesRead / 2)); + + $pos = $limitpos; + + // keep reading the characters + while ($charsLeft > 0) { + // look up next limit position, in case the string span more than one continue record + foreach ($spliceOffsets as $spliceOffset) { + if ($pos < $spliceOffset) { + $limitpos = $spliceOffset; + break; + } + } + + // repeated option flags + // OpenOffice.org documentation 5.21 + $option = ord($recordData{$pos}); + ++$pos; + + if ($isCompressed && ($option == 0)) { + // 1st fragment compressed + // this fragment compressed + $len = min($charsLeft, $limitpos - $pos); + $retstr .= substr($recordData, $pos, $len); + $charsLeft -= $len; + $isCompressed = true; + } elseif (!$isCompressed && ($option != 0)) { + // 1st fragment uncompressed + // this fragment uncompressed + $len = min($charsLeft * 2, $limitpos - $pos); + $retstr .= substr($recordData, $pos, $len); + $charsLeft -= $len / 2; + $isCompressed = false; + } elseif (!$isCompressed && ($option == 0)) { + // 1st fragment uncompressed + // this fragment compressed + $len = min($charsLeft, $limitpos - $pos); + for ($j = 0; $j < $len; ++$j) { + $retstr .= $recordData{$pos + $j} . chr(0); + } + $charsLeft -= $len; + $isCompressed = false; + } else { + // 1st fragment compressed + // this fragment uncompressed + $newstr = ''; + for ($j = 0; $j < strlen($retstr); ++$j) { + $newstr .= $retstr[$j] . chr(0); + } + $retstr = $newstr; + $len = min($charsLeft * 2, $limitpos - $pos); + $retstr .= substr($recordData, $pos, $len); + $charsLeft -= $len / 2; + $isCompressed = false; + } + + $pos += $len; + } + } + + // convert to UTF-8 + $retstr = self::encodeUTF16($retstr, $isCompressed); + + // read additional Rich-Text information, if any + $fmtRuns = array(); + if ($hasRichText) { + // list of formatting runs + for ($j = 0; $j < $formattingRuns; ++$j) { + // first formatted character; zero-based + $charPos = self::getInt2d($recordData, $pos + $j * 4); + + // index to font record + $fontIndex = self::getInt2d($recordData, $pos + 2 + $j * 4); + + $fmtRuns[] = array( + 'charPos' => $charPos, + 'fontIndex' => $fontIndex, + ); + } + $pos += 4 * $formattingRuns; + } + + // read additional Asian phonetics information, if any + if ($hasAsian) { + // For Asian phonetic settings, we skip the extended string data + $pos += $extendedRunLength; + } + + // store the shared sting + $this->sst[] = array( + 'value' => $retstr, + 'fmtRuns' => $fmtRuns, + ); + } + + // getSplicedRecordData() takes care of moving current position in data stream + } + + + /** + * Read PRINTGRIDLINES record + */ + private function readPrintGridlines() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if ($this->version == self::XLS_BIFF8 && !$this->readDataOnly) { + // offset: 0; size: 2; 0 = do not print sheet grid lines; 1 = print sheet gridlines + $printGridlines = (bool) self::getInt2d($recordData, 0); + $this->phpSheet->setPrintGridlines($printGridlines); + } + } + + + /** + * Read DEFAULTROWHEIGHT record + */ + private function readDefaultRowHeight() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // offset: 0; size: 2; option flags + // offset: 2; size: 2; default height for unused rows, (twips 1/20 point) + $height = self::getInt2d($recordData, 2); + $this->phpSheet->getDefaultRowDimension()->setRowHeight($height / 20); + } + + + /** + * Read SHEETPR record + */ + private function readSheetPr() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // offset: 0; size: 2 + + // bit: 6; mask: 0x0040; 0 = outline buttons above outline group + $isSummaryBelow = (0x0040 & self::getInt2d($recordData, 0)) >> 6; + $this->phpSheet->setShowSummaryBelow($isSummaryBelow); + + // bit: 7; mask: 0x0080; 0 = outline buttons left of outline group + $isSummaryRight = (0x0080 & self::getInt2d($recordData, 0)) >> 7; + $this->phpSheet->setShowSummaryRight($isSummaryRight); + + // bit: 8; mask: 0x100; 0 = scale printout in percent, 1 = fit printout to number of pages + // this corresponds to radio button setting in page setup dialog in Excel + $this->isFitToPages = (bool) ((0x0100 & self::getInt2d($recordData, 0)) >> 8); + } + + + /** + * Read HORIZONTALPAGEBREAKS record + */ + private function readHorizontalPageBreaks() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if ($this->version == self::XLS_BIFF8 && !$this->readDataOnly) { + // offset: 0; size: 2; number of the following row index structures + $nm = self::getInt2d($recordData, 0); + + // offset: 2; size: 6 * $nm; list of $nm row index structures + for ($i = 0; $i < $nm; ++$i) { + $r = self::getInt2d($recordData, 2 + 6 * $i); + $cf = self::getInt2d($recordData, 2 + 6 * $i + 2); + $cl = self::getInt2d($recordData, 2 + 6 * $i + 4); + + // not sure why two column indexes are necessary? + $this->phpSheet->setBreakByColumnAndRow($cf, $r, PHPExcel_Worksheet::BREAK_ROW); + } + } + } + + + /** + * Read VERTICALPAGEBREAKS record + */ + private function readVerticalPageBreaks() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if ($this->version == self::XLS_BIFF8 && !$this->readDataOnly) { + // offset: 0; size: 2; number of the following column index structures + $nm = self::getInt2d($recordData, 0); + + // offset: 2; size: 6 * $nm; list of $nm row index structures + for ($i = 0; $i < $nm; ++$i) { + $c = self::getInt2d($recordData, 2 + 6 * $i); + $rf = self::getInt2d($recordData, 2 + 6 * $i + 2); + $rl = self::getInt2d($recordData, 2 + 6 * $i + 4); + + // not sure why two row indexes are necessary? + $this->phpSheet->setBreakByColumnAndRow($c, $rf, PHPExcel_Worksheet::BREAK_COLUMN); + } + } + } + + + /** + * Read HEADER record + */ + private function readHeader() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if (!$this->readDataOnly) { + // offset: 0; size: var + // realized that $recordData can be empty even when record exists + if ($recordData) { + if ($this->version == self::XLS_BIFF8) { + $string = self::readUnicodeStringLong($recordData); + } else { + $string = $this->readByteStringShort($recordData); + } + + $this->phpSheet->getHeaderFooter()->setOddHeader($string['value']); + $this->phpSheet->getHeaderFooter()->setEvenHeader($string['value']); + } + } + } + + + /** + * Read FOOTER record + */ + private function readFooter() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if (!$this->readDataOnly) { + // offset: 0; size: var + // realized that $recordData can be empty even when record exists + if ($recordData) { + if ($this->version == self::XLS_BIFF8) { + $string = self::readUnicodeStringLong($recordData); + } else { + $string = $this->readByteStringShort($recordData); + } + $this->phpSheet->getHeaderFooter()->setOddFooter($string['value']); + $this->phpSheet->getHeaderFooter()->setEvenFooter($string['value']); + } + } + } + + + /** + * Read HCENTER record + */ + private function readHcenter() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if (!$this->readDataOnly) { + // offset: 0; size: 2; 0 = print sheet left aligned, 1 = print sheet centered horizontally + $isHorizontalCentered = (bool) self::getInt2d($recordData, 0); + + $this->phpSheet->getPageSetup()->setHorizontalCentered($isHorizontalCentered); + } + } + + + /** + * Read VCENTER record + */ + private function readVcenter() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if (!$this->readDataOnly) { + // offset: 0; size: 2; 0 = print sheet aligned at top page border, 1 = print sheet vertically centered + $isVerticalCentered = (bool) self::getInt2d($recordData, 0); + + $this->phpSheet->getPageSetup()->setVerticalCentered($isVerticalCentered); + } + } + + + /** + * Read LEFTMARGIN record + */ + private function readLeftMargin() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if (!$this->readDataOnly) { + // offset: 0; size: 8 + $this->phpSheet->getPageMargins()->setLeft(self::extractNumber($recordData)); + } + } + + + /** + * Read RIGHTMARGIN record + */ + private function readRightMargin() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if (!$this->readDataOnly) { + // offset: 0; size: 8 + $this->phpSheet->getPageMargins()->setRight(self::extractNumber($recordData)); + } + } + + + /** + * Read TOPMARGIN record + */ + private function readTopMargin() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if (!$this->readDataOnly) { + // offset: 0; size: 8 + $this->phpSheet->getPageMargins()->setTop(self::extractNumber($recordData)); + } + } + + + /** + * Read BOTTOMMARGIN record + */ + private function readBottomMargin() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if (!$this->readDataOnly) { + // offset: 0; size: 8 + $this->phpSheet->getPageMargins()->setBottom(self::extractNumber($recordData)); + } + } + + + /** + * Read PAGESETUP record + */ + private function readPageSetup() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if (!$this->readDataOnly) { + // offset: 0; size: 2; paper size + $paperSize = self::getInt2d($recordData, 0); + + // offset: 2; size: 2; scaling factor + $scale = self::getInt2d($recordData, 2); + + // offset: 6; size: 2; fit worksheet width to this number of pages, 0 = use as many as needed + $fitToWidth = self::getInt2d($recordData, 6); + + // offset: 8; size: 2; fit worksheet height to this number of pages, 0 = use as many as needed + $fitToHeight = self::getInt2d($recordData, 8); + + // offset: 10; size: 2; option flags + + // bit: 1; mask: 0x0002; 0=landscape, 1=portrait + $isPortrait = (0x0002 & self::getInt2d($recordData, 10)) >> 1; + + // bit: 2; mask: 0x0004; 1= paper size, scaling factor, paper orient. not init + // when this bit is set, do not use flags for those properties + $isNotInit = (0x0004 & self::getInt2d($recordData, 10)) >> 2; + + if (!$isNotInit) { + $this->phpSheet->getPageSetup()->setPaperSize($paperSize); + switch ($isPortrait) { + case 0: + $this->phpSheet->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE); + break; + case 1: + $this->phpSheet->getPageSetup()->setOrientation(PHPExcel_Worksheet_PageSetup::ORIENTATION_PORTRAIT); + break; + } + + $this->phpSheet->getPageSetup()->setScale($scale, false); + $this->phpSheet->getPageSetup()->setFitToPage((bool) $this->isFitToPages); + $this->phpSheet->getPageSetup()->setFitToWidth($fitToWidth, false); + $this->phpSheet->getPageSetup()->setFitToHeight($fitToHeight, false); + } + + // offset: 16; size: 8; header margin (IEEE 754 floating-point value) + $marginHeader = self::extractNumber(substr($recordData, 16, 8)); + $this->phpSheet->getPageMargins()->setHeader($marginHeader); + + // offset: 24; size: 8; footer margin (IEEE 754 floating-point value) + $marginFooter = self::extractNumber(substr($recordData, 24, 8)); + $this->phpSheet->getPageMargins()->setFooter($marginFooter); + } + } + + + /** + * PROTECT - Sheet protection (BIFF2 through BIFF8) + * if this record is omitted, then it also means no sheet protection + */ + private function readProtect() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if ($this->readDataOnly) { + return; + } + + // offset: 0; size: 2; + + // bit 0, mask 0x01; 1 = sheet is protected + $bool = (0x01 & self::getInt2d($recordData, 0)) >> 0; + $this->phpSheet->getProtection()->setSheet((bool)$bool); + } + + + /** + * SCENPROTECT + */ + private function readScenProtect() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if ($this->readDataOnly) { + return; + } + + // offset: 0; size: 2; + + // bit: 0, mask 0x01; 1 = scenarios are protected + $bool = (0x01 & self::getInt2d($recordData, 0)) >> 0; + + $this->phpSheet->getProtection()->setScenarios((bool)$bool); + } + + + /** + * OBJECTPROTECT + */ + private function readObjectProtect() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if ($this->readDataOnly) { + return; + } + + // offset: 0; size: 2; + + // bit: 0, mask 0x01; 1 = objects are protected + $bool = (0x01 & self::getInt2d($recordData, 0)) >> 0; + + $this->phpSheet->getProtection()->setObjects((bool)$bool); + } + + + /** + * PASSWORD - Sheet protection (hashed) password (BIFF2 through BIFF8) + */ + private function readPassword() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if (!$this->readDataOnly) { + // offset: 0; size: 2; 16-bit hash value of password + $password = strtoupper(dechex(self::getInt2d($recordData, 0))); // the hashed password + $this->phpSheet->getProtection()->setPassword($password, true); + } + } + + + /** + * Read DEFCOLWIDTH record + */ + private function readDefColWidth() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // offset: 0; size: 2; default column width + $width = self::getInt2d($recordData, 0); + if ($width != 8) { + $this->phpSheet->getDefaultColumnDimension()->setWidth($width); + } + } + + + /** + * Read COLINFO record + */ + private function readColInfo() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if (!$this->readDataOnly) { + // offset: 0; size: 2; index to first column in range + $fc = self::getInt2d($recordData, 0); // first column index + + // offset: 2; size: 2; index to last column in range + $lc = self::getInt2d($recordData, 2); // first column index + + // offset: 4; size: 2; width of the column in 1/256 of the width of the zero character + $width = self::getInt2d($recordData, 4); + + // offset: 6; size: 2; index to XF record for default column formatting + $xfIndex = self::getInt2d($recordData, 6); + + // offset: 8; size: 2; option flags + // bit: 0; mask: 0x0001; 1= columns are hidden + $isHidden = (0x0001 & self::getInt2d($recordData, 8)) >> 0; + + // bit: 10-8; mask: 0x0700; outline level of the columns (0 = no outline) + $level = (0x0700 & self::getInt2d($recordData, 8)) >> 8; + + // bit: 12; mask: 0x1000; 1 = collapsed + $isCollapsed = (0x1000 & self::getInt2d($recordData, 8)) >> 12; + + // offset: 10; size: 2; not used + + for ($i = $fc; $i <= $lc; ++$i) { + if ($lc == 255 || $lc == 256) { + $this->phpSheet->getDefaultColumnDimension()->setWidth($width / 256); + break; + } + $this->phpSheet->getColumnDimensionByColumn($i)->setWidth($width / 256); + $this->phpSheet->getColumnDimensionByColumn($i)->setVisible(!$isHidden); + $this->phpSheet->getColumnDimensionByColumn($i)->setOutlineLevel($level); + $this->phpSheet->getColumnDimensionByColumn($i)->setCollapsed($isCollapsed); + $this->phpSheet->getColumnDimensionByColumn($i)->setXfIndex($this->mapCellXfIndex[$xfIndex]); + } + } + } + + + /** + * ROW + * + * This record contains the properties of a single row in a + * sheet. Rows and cells in a sheet are divided into blocks + * of 32 rows. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function readRow() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if (!$this->readDataOnly) { + // offset: 0; size: 2; index of this row + $r = self::getInt2d($recordData, 0); + + // offset: 2; size: 2; index to column of the first cell which is described by a cell record + + // offset: 4; size: 2; index to column of the last cell which is described by a cell record, increased by 1 + + // offset: 6; size: 2; + + // bit: 14-0; mask: 0x7FFF; height of the row, in twips = 1/20 of a point + $height = (0x7FFF & self::getInt2d($recordData, 6)) >> 0; + + // bit: 15: mask: 0x8000; 0 = row has custom height; 1= row has default height + $useDefaultHeight = (0x8000 & self::getInt2d($recordData, 6)) >> 15; + + if (!$useDefaultHeight) { + $this->phpSheet->getRowDimension($r + 1)->setRowHeight($height / 20); + } + + // offset: 8; size: 2; not used + + // offset: 10; size: 2; not used in BIFF5-BIFF8 + + // offset: 12; size: 4; option flags and default row formatting + + // bit: 2-0: mask: 0x00000007; outline level of the row + $level = (0x00000007 & self::getInt4d($recordData, 12)) >> 0; + $this->phpSheet->getRowDimension($r + 1)->setOutlineLevel($level); + + // bit: 4; mask: 0x00000010; 1 = outline group start or ends here... and is collapsed + $isCollapsed = (0x00000010 & self::getInt4d($recordData, 12)) >> 4; + $this->phpSheet->getRowDimension($r + 1)->setCollapsed($isCollapsed); + + // bit: 5; mask: 0x00000020; 1 = row is hidden + $isHidden = (0x00000020 & self::getInt4d($recordData, 12)) >> 5; + $this->phpSheet->getRowDimension($r + 1)->setVisible(!$isHidden); + + // bit: 7; mask: 0x00000080; 1 = row has explicit format + $hasExplicitFormat = (0x00000080 & self::getInt4d($recordData, 12)) >> 7; + + // bit: 27-16; mask: 0x0FFF0000; only applies when hasExplicitFormat = 1; index to XF record + $xfIndex = (0x0FFF0000 & self::getInt4d($recordData, 12)) >> 16; + + if ($hasExplicitFormat) { + $this->phpSheet->getRowDimension($r + 1)->setXfIndex($this->mapCellXfIndex[$xfIndex]); + } + } + } + + + /** + * Read RK record + * This record represents a cell that contains an RK value + * (encoded integer or floating-point value). If a + * floating-point value cannot be encoded to an RK value, + * a NUMBER record will be written. This record replaces the + * record INTEGER written in BIFF2. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function readRk() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // offset: 0; size: 2; index to row + $row = self::getInt2d($recordData, 0); + + // offset: 2; size: 2; index to column + $column = self::getInt2d($recordData, 2); + $columnString = PHPExcel_Cell::stringFromColumnIndex($column); + + // Read cell? + if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) { + // offset: 4; size: 2; index to XF record + $xfIndex = self::getInt2d($recordData, 4); + + // offset: 6; size: 4; RK value + $rknum = self::getInt4d($recordData, 6); + $numValue = self::getIEEE754($rknum); + + $cell = $this->phpSheet->getCell($columnString . ($row + 1)); + if (!$this->readDataOnly) { + // add style information + $cell->setXfIndex($this->mapCellXfIndex[$xfIndex]); + } + + // add cell + $cell->setValueExplicit($numValue, PHPExcel_Cell_DataType::TYPE_NUMERIC); + } + } + + + /** + * Read LABELSST record + * This record represents a cell that contains a string. It + * replaces the LABEL record and RSTRING record used in + * BIFF2-BIFF5. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function readLabelSst() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // offset: 0; size: 2; index to row + $row = self::getInt2d($recordData, 0); + + // offset: 2; size: 2; index to column + $column = self::getInt2d($recordData, 2); + $columnString = PHPExcel_Cell::stringFromColumnIndex($column); + + $emptyCell = true; + // Read cell? + if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) { + // offset: 4; size: 2; index to XF record + $xfIndex = self::getInt2d($recordData, 4); + + // offset: 6; size: 4; index to SST record + $index = self::getInt4d($recordData, 6); + + // add cell + if (($fmtRuns = $this->sst[$index]['fmtRuns']) && !$this->readDataOnly) { + // then we should treat as rich text + $richText = new PHPExcel_RichText(); + $charPos = 0; + $sstCount = count($this->sst[$index]['fmtRuns']); + for ($i = 0; $i <= $sstCount; ++$i) { + if (isset($fmtRuns[$i])) { + $text = PHPExcel_Shared_String::Substring($this->sst[$index]['value'], $charPos, $fmtRuns[$i]['charPos'] - $charPos); + $charPos = $fmtRuns[$i]['charPos']; + } else { + $text = PHPExcel_Shared_String::Substring($this->sst[$index]['value'], $charPos, PHPExcel_Shared_String::CountCharacters($this->sst[$index]['value'])); + } + + if (PHPExcel_Shared_String::CountCharacters($text) > 0) { + if ($i == 0) { // first text run, no style + $richText->createText($text); + } else { + $textRun = $richText->createTextRun($text); + if (isset($fmtRuns[$i - 1])) { + if ($fmtRuns[$i - 1]['fontIndex'] < 4) { + $fontIndex = $fmtRuns[$i - 1]['fontIndex']; + } else { + // this has to do with that index 4 is omitted in all BIFF versions for some strange reason + // check the OpenOffice documentation of the FONT record + $fontIndex = $fmtRuns[$i - 1]['fontIndex'] - 1; + } + $textRun->setFont(clone $this->objFonts[$fontIndex]); + } + } + } + } + if ($this->readEmptyCells || trim($richText->getPlainText()) !== '') { + $cell = $this->phpSheet->getCell($columnString . ($row + 1)); + $cell->setValueExplicit($richText, PHPExcel_Cell_DataType::TYPE_STRING); + $emptyCell = false; + } + } else { + if ($this->readEmptyCells || trim($this->sst[$index]['value']) !== '') { + $cell = $this->phpSheet->getCell($columnString . ($row + 1)); + $cell->setValueExplicit($this->sst[$index]['value'], PHPExcel_Cell_DataType::TYPE_STRING); + $emptyCell = false; + } + } + + if (!$this->readDataOnly && !$emptyCell) { + // add style information + $cell->setXfIndex($this->mapCellXfIndex[$xfIndex]); + } + } + } + + + /** + * Read MULRK record + * This record represents a cell range containing RK value + * cells. All cells are located in the same row. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function readMulRk() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // offset: 0; size: 2; index to row + $row = self::getInt2d($recordData, 0); + + // offset: 2; size: 2; index to first column + $colFirst = self::getInt2d($recordData, 2); + + // offset: var; size: 2; index to last column + $colLast = self::getInt2d($recordData, $length - 2); + $columns = $colLast - $colFirst + 1; + + // offset within record data + $offset = 4; + + for ($i = 0; $i < $columns; ++$i) { + $columnString = PHPExcel_Cell::stringFromColumnIndex($colFirst + $i); + + // Read cell? + if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) { + // offset: var; size: 2; index to XF record + $xfIndex = self::getInt2d($recordData, $offset); + + // offset: var; size: 4; RK value + $numValue = self::getIEEE754(self::getInt4d($recordData, $offset + 2)); + $cell = $this->phpSheet->getCell($columnString . ($row + 1)); + if (!$this->readDataOnly) { + // add style + $cell->setXfIndex($this->mapCellXfIndex[$xfIndex]); + } + + // add cell value + $cell->setValueExplicit($numValue, PHPExcel_Cell_DataType::TYPE_NUMERIC); + } + + $offset += 6; + } + } + + + /** + * Read NUMBER record + * This record represents a cell that contains a + * floating-point value. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function readNumber() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // offset: 0; size: 2; index to row + $row = self::getInt2d($recordData, 0); + + // offset: 2; size 2; index to column + $column = self::getInt2d($recordData, 2); + $columnString = PHPExcel_Cell::stringFromColumnIndex($column); + + // Read cell? + if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) { + // offset 4; size: 2; index to XF record + $xfIndex = self::getInt2d($recordData, 4); + + $numValue = self::extractNumber(substr($recordData, 6, 8)); + + $cell = $this->phpSheet->getCell($columnString . ($row + 1)); + if (!$this->readDataOnly) { + // add cell style + $cell->setXfIndex($this->mapCellXfIndex[$xfIndex]); + } + + // add cell value + $cell->setValueExplicit($numValue, PHPExcel_Cell_DataType::TYPE_NUMERIC); + } + } + + + /** + * Read FORMULA record + perhaps a following STRING record if formula result is a string + * This record contains the token array and the result of a + * formula cell. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function readFormula() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // offset: 0; size: 2; row index + $row = self::getInt2d($recordData, 0); + + // offset: 2; size: 2; col index + $column = self::getInt2d($recordData, 2); + $columnString = PHPExcel_Cell::stringFromColumnIndex($column); + + // offset: 20: size: variable; formula structure + $formulaStructure = substr($recordData, 20); + + // offset: 14: size: 2; option flags, recalculate always, recalculate on open etc. + $options = self::getInt2d($recordData, 14); + + // bit: 0; mask: 0x0001; 1 = recalculate always + // bit: 1; mask: 0x0002; 1 = calculate on open + // bit: 2; mask: 0x0008; 1 = part of a shared formula + $isPartOfSharedFormula = (bool) (0x0008 & $options); + + // WARNING: + // We can apparently not rely on $isPartOfSharedFormula. Even when $isPartOfSharedFormula = true + // the formula data may be ordinary formula data, therefore we need to check + // explicitly for the tExp token (0x01) + $isPartOfSharedFormula = $isPartOfSharedFormula && ord($formulaStructure{2}) == 0x01; + + if ($isPartOfSharedFormula) { + // part of shared formula which means there will be a formula with a tExp token and nothing else + // get the base cell, grab tExp token + $baseRow = self::getInt2d($formulaStructure, 3); + $baseCol = self::getInt2d($formulaStructure, 5); + $this->_baseCell = PHPExcel_Cell::stringFromColumnIndex($baseCol). ($baseRow + 1); + } + + // Read cell? + if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) { + if ($isPartOfSharedFormula) { + // formula is added to this cell after the sheet has been read + $this->sharedFormulaParts[$columnString . ($row + 1)] = $this->_baseCell; + } + + // offset: 16: size: 4; not used + + // offset: 4; size: 2; XF index + $xfIndex = self::getInt2d($recordData, 4); + + // offset: 6; size: 8; result of the formula + if ((ord($recordData{6}) == 0) && (ord($recordData{12}) == 255) && (ord($recordData{13}) == 255)) { + // String formula. Result follows in appended STRING record + $dataType = PHPExcel_Cell_DataType::TYPE_STRING; + + // read possible SHAREDFMLA record + $code = self::getInt2d($this->data, $this->pos); + if ($code == self::XLS_TYPE_SHAREDFMLA) { + $this->readSharedFmla(); + } + + // read STRING record + $value = $this->readString(); + } elseif ((ord($recordData{6}) == 1) + && (ord($recordData{12}) == 255) + && (ord($recordData{13}) == 255)) { + // Boolean formula. Result is in +2; 0=false, 1=true + $dataType = PHPExcel_Cell_DataType::TYPE_BOOL; + $value = (bool) ord($recordData{8}); + } elseif ((ord($recordData{6}) == 2) + && (ord($recordData{12}) == 255) + && (ord($recordData{13}) == 255)) { + // Error formula. Error code is in +2 + $dataType = PHPExcel_Cell_DataType::TYPE_ERROR; + $value = PHPExcel_Reader_Excel5_ErrorCode::lookup(ord($recordData{8})); + } elseif ((ord($recordData{6}) == 3) + && (ord($recordData{12}) == 255) + && (ord($recordData{13}) == 255)) { + // Formula result is a null string + $dataType = PHPExcel_Cell_DataType::TYPE_NULL; + $value = ''; + } else { + // forumla result is a number, first 14 bytes like _NUMBER record + $dataType = PHPExcel_Cell_DataType::TYPE_NUMERIC; + $value = self::extractNumber(substr($recordData, 6, 8)); + } + + $cell = $this->phpSheet->getCell($columnString . ($row + 1)); + if (!$this->readDataOnly) { + // add cell style + $cell->setXfIndex($this->mapCellXfIndex[$xfIndex]); + } + + // store the formula + if (!$isPartOfSharedFormula) { + // not part of shared formula + // add cell value. If we can read formula, populate with formula, otherwise just used cached value + try { + if ($this->version != self::XLS_BIFF8) { + throw new PHPExcel_Reader_Exception('Not BIFF8. Can only read BIFF8 formulas'); + } + $formula = $this->getFormulaFromStructure($formulaStructure); // get formula in human language + $cell->setValueExplicit('=' . $formula, PHPExcel_Cell_DataType::TYPE_FORMULA); + + } catch (PHPExcel_Exception $e) { + $cell->setValueExplicit($value, $dataType); + } + } else { + if ($this->version == self::XLS_BIFF8) { + // do nothing at this point, formula id added later in the code + } else { + $cell->setValueExplicit($value, $dataType); + } + } + + // store the cached calculated value + $cell->setCalculatedValue($value); + } + } + + + /** + * Read a SHAREDFMLA record. This function just stores the binary shared formula in the reader, + * which usually contains relative references. + * These will be used to construct the formula in each shared formula part after the sheet is read. + */ + private function readSharedFmla() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // offset: 0, size: 6; cell range address of the area used by the shared formula, not used for anything + $cellRange = substr($recordData, 0, 6); + $cellRange = $this->readBIFF5CellRangeAddressFixed($cellRange); // note: even BIFF8 uses BIFF5 syntax + + // offset: 6, size: 1; not used + + // offset: 7, size: 1; number of existing FORMULA records for this shared formula + $no = ord($recordData{7}); + + // offset: 8, size: var; Binary token array of the shared formula + $formula = substr($recordData, 8); + + // at this point we only store the shared formula for later use + $this->sharedFormulas[$this->_baseCell] = $formula; + } + + + /** + * Read a STRING record from current stream position and advance the stream pointer to next record + * This record is used for storing result from FORMULA record when it is a string, and + * it occurs directly after the FORMULA record + * + * @return string The string contents as UTF-8 + */ + private function readString() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if ($this->version == self::XLS_BIFF8) { + $string = self::readUnicodeStringLong($recordData); + $value = $string['value']; + } else { + $string = $this->readByteStringLong($recordData); + $value = $string['value']; + } + + return $value; + } + + + /** + * Read BOOLERR record + * This record represents a Boolean value or error value + * cell. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function readBoolErr() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // offset: 0; size: 2; row index + $row = self::getInt2d($recordData, 0); + + // offset: 2; size: 2; column index + $column = self::getInt2d($recordData, 2); + $columnString = PHPExcel_Cell::stringFromColumnIndex($column); + + // Read cell? + if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) { + // offset: 4; size: 2; index to XF record + $xfIndex = self::getInt2d($recordData, 4); + + // offset: 6; size: 1; the boolean value or error value + $boolErr = ord($recordData{6}); + + // offset: 7; size: 1; 0=boolean; 1=error + $isError = ord($recordData{7}); + + $cell = $this->phpSheet->getCell($columnString . ($row + 1)); + switch ($isError) { + case 0: // boolean + $value = (bool) $boolErr; + + // add cell value + $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_BOOL); + break; + case 1: // error type + $value = PHPExcel_Reader_Excel5_ErrorCode::lookup($boolErr); + + // add cell value + $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_ERROR); + break; + } + + if (!$this->readDataOnly) { + // add cell style + $cell->setXfIndex($this->mapCellXfIndex[$xfIndex]); + } + } + } + + + /** + * Read MULBLANK record + * This record represents a cell range of empty cells. All + * cells are located in the same row + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function readMulBlank() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // offset: 0; size: 2; index to row + $row = self::getInt2d($recordData, 0); + + // offset: 2; size: 2; index to first column + $fc = self::getInt2d($recordData, 2); + + // offset: 4; size: 2 x nc; list of indexes to XF records + // add style information + if (!$this->readDataOnly && $this->readEmptyCells) { + for ($i = 0; $i < $length / 2 - 3; ++$i) { + $columnString = PHPExcel_Cell::stringFromColumnIndex($fc + $i); + + // Read cell? + if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) { + $xfIndex = self::getInt2d($recordData, 4 + 2 * $i); + $this->phpSheet->getCell($columnString . ($row + 1))->setXfIndex($this->mapCellXfIndex[$xfIndex]); + } + } + } + + // offset: 6; size 2; index to last column (not needed) + } + + + /** + * Read LABEL record + * This record represents a cell that contains a string. In + * BIFF8 it is usually replaced by the LABELSST record. + * Excel still uses this record, if it copies unformatted + * text cells to the clipboard. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function readLabel() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // offset: 0; size: 2; index to row + $row = self::getInt2d($recordData, 0); + + // offset: 2; size: 2; index to column + $column = self::getInt2d($recordData, 2); + $columnString = PHPExcel_Cell::stringFromColumnIndex($column); + + // Read cell? + if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) { + // offset: 4; size: 2; XF index + $xfIndex = self::getInt2d($recordData, 4); + + // add cell value + // todo: what if string is very long? continue record + if ($this->version == self::XLS_BIFF8) { + $string = self::readUnicodeStringLong(substr($recordData, 6)); + $value = $string['value']; + } else { + $string = $this->readByteStringLong(substr($recordData, 6)); + $value = $string['value']; + } + if ($this->readEmptyCells || trim($value) !== '') { + $cell = $this->phpSheet->getCell($columnString . ($row + 1)); + $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING); + + if (!$this->readDataOnly) { + // add cell style + $cell->setXfIndex($this->mapCellXfIndex[$xfIndex]); + } + } + } + } + + + /** + * Read BLANK record + */ + private function readBlank() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // offset: 0; size: 2; row index + $row = self::getInt2d($recordData, 0); + + // offset: 2; size: 2; col index + $col = self::getInt2d($recordData, 2); + $columnString = PHPExcel_Cell::stringFromColumnIndex($col); + + // Read cell? + if (($this->getReadFilter() !== null) && $this->getReadFilter()->readCell($columnString, $row + 1, $this->phpSheet->getTitle())) { + // offset: 4; size: 2; XF index + $xfIndex = self::getInt2d($recordData, 4); + + // add style information + if (!$this->readDataOnly && $this->readEmptyCells) { + $this->phpSheet->getCell($columnString . ($row + 1))->setXfIndex($this->mapCellXfIndex[$xfIndex]); + } + } + } + + + /** + * Read MSODRAWING record + */ + private function readMsoDrawing() + { + $length = self::getInt2d($this->data, $this->pos + 2); + + // get spliced record data + $splicedRecordData = $this->getSplicedRecordData(); + $recordData = $splicedRecordData['recordData']; + + $this->drawingData .= $recordData; + } + + + /** + * Read OBJ record + */ + private function readObj() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if ($this->readDataOnly || $this->version != self::XLS_BIFF8) { + return; + } + + // recordData consists of an array of subrecords looking like this: + // ft: 2 bytes; ftCmo type (0x15) + // cb: 2 bytes; size in bytes of ftCmo data + // ot: 2 bytes; Object Type + // id: 2 bytes; Object id number + // grbit: 2 bytes; Option Flags + // data: var; subrecord data + + // for now, we are just interested in the second subrecord containing the object type + $ftCmoType = self::getInt2d($recordData, 0); + $cbCmoSize = self::getInt2d($recordData, 2); + $otObjType = self::getInt2d($recordData, 4); + $idObjID = self::getInt2d($recordData, 6); + $grbitOpts = self::getInt2d($recordData, 6); + + $this->objs[] = array( + 'ftCmoType' => $ftCmoType, + 'cbCmoSize' => $cbCmoSize, + 'otObjType' => $otObjType, + 'idObjID' => $idObjID, + 'grbitOpts' => $grbitOpts + ); + $this->textObjRef = $idObjID; + +// echo '_readObj()
'; +// var_dump(end($this->objs)); +// echo '
'; + } + + + /** + * Read WINDOW2 record + */ + private function readWindow2() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // offset: 0; size: 2; option flags + $options = self::getInt2d($recordData, 0); + + // offset: 2; size: 2; index to first visible row + $firstVisibleRow = self::getInt2d($recordData, 2); + + // offset: 4; size: 2; index to first visible colum + $firstVisibleColumn = self::getInt2d($recordData, 4); + if ($this->version === self::XLS_BIFF8) { + // offset: 8; size: 2; not used + // offset: 10; size: 2; cached magnification factor in page break preview (in percent); 0 = Default (60%) + // offset: 12; size: 2; cached magnification factor in normal view (in percent); 0 = Default (100%) + // offset: 14; size: 4; not used + $zoomscaleInPageBreakPreview = self::getInt2d($recordData, 10); + if ($zoomscaleInPageBreakPreview === 0) { + $zoomscaleInPageBreakPreview = 60; + } + $zoomscaleInNormalView = self::getInt2d($recordData, 12); + if ($zoomscaleInNormalView === 0) { + $zoomscaleInNormalView = 100; + } + } + + // bit: 1; mask: 0x0002; 0 = do not show gridlines, 1 = show gridlines + $showGridlines = (bool) ((0x0002 & $options) >> 1); + $this->phpSheet->setShowGridlines($showGridlines); + + // bit: 2; mask: 0x0004; 0 = do not show headers, 1 = show headers + $showRowColHeaders = (bool) ((0x0004 & $options) >> 2); + $this->phpSheet->setShowRowColHeaders($showRowColHeaders); + + // bit: 3; mask: 0x0008; 0 = panes are not frozen, 1 = panes are frozen + $this->frozen = (bool) ((0x0008 & $options) >> 3); + + // bit: 6; mask: 0x0040; 0 = columns from left to right, 1 = columns from right to left + $this->phpSheet->setRightToLeft((bool)((0x0040 & $options) >> 6)); + + // bit: 10; mask: 0x0400; 0 = sheet not active, 1 = sheet active + $isActive = (bool) ((0x0400 & $options) >> 10); + if ($isActive) { + $this->phpExcel->setActiveSheetIndex($this->phpExcel->getIndex($this->phpSheet)); + } + + // bit: 11; mask: 0x0800; 0 = normal view, 1 = page break view + $isPageBreakPreview = (bool) ((0x0800 & $options) >> 11); + + //FIXME: set $firstVisibleRow and $firstVisibleColumn + + if ($this->phpSheet->getSheetView()->getView() !== PHPExcel_Worksheet_SheetView::SHEETVIEW_PAGE_LAYOUT) { + //NOTE: this setting is inferior to page layout view(Excel2007-) + $view = $isPageBreakPreview ? PHPExcel_Worksheet_SheetView::SHEETVIEW_PAGE_BREAK_PREVIEW : PHPExcel_Worksheet_SheetView::SHEETVIEW_NORMAL; + $this->phpSheet->getSheetView()->setView($view); + if ($this->version === self::XLS_BIFF8) { + $zoomScale = $isPageBreakPreview ? $zoomscaleInPageBreakPreview : $zoomscaleInNormalView; + $this->phpSheet->getSheetView()->setZoomScale($zoomScale); + $this->phpSheet->getSheetView()->setZoomScaleNormal($zoomscaleInNormalView); + } + } + } + + /** + * Read PLV Record(Created by Excel2007 or upper) + */ + private function readPageLayoutView() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + //var_dump(unpack("vrt/vgrbitFrt/V2reserved/vwScalePLV/vgrbit", $recordData)); + + // offset: 0; size: 2; rt + //->ignore + $rt = self::getInt2d($recordData, 0); + // offset: 2; size: 2; grbitfr + //->ignore + $grbitFrt = self::getInt2d($recordData, 2); + // offset: 4; size: 8; reserved + //->ignore + + // offset: 12; size 2; zoom scale + $wScalePLV = self::getInt2d($recordData, 12); + // offset: 14; size 2; grbit + $grbit = self::getInt2d($recordData, 14); + + // decomprise grbit + $fPageLayoutView = $grbit & 0x01; + $fRulerVisible = ($grbit >> 1) & 0x01; //no support + $fWhitespaceHidden = ($grbit >> 3) & 0x01; //no support + + if ($fPageLayoutView === 1) { + $this->phpSheet->getSheetView()->setView(PHPExcel_Worksheet_SheetView::SHEETVIEW_PAGE_LAYOUT); + $this->phpSheet->getSheetView()->setZoomScale($wScalePLV); //set by Excel2007 only if SHEETVIEW_PAGE_LAYOUT + } + //otherwise, we cannot know whether SHEETVIEW_PAGE_LAYOUT or SHEETVIEW_PAGE_BREAK_PREVIEW. + } + + /** + * Read SCL record + */ + private function readScl() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // offset: 0; size: 2; numerator of the view magnification + $numerator = self::getInt2d($recordData, 0); + + // offset: 2; size: 2; numerator of the view magnification + $denumerator = self::getInt2d($recordData, 2); + + // set the zoom scale (in percent) + $this->phpSheet->getSheetView()->setZoomScale($numerator * 100 / $denumerator); + } + + + /** + * Read PANE record + */ + private function readPane() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if (!$this->readDataOnly) { + // offset: 0; size: 2; position of vertical split + $px = self::getInt2d($recordData, 0); + + // offset: 2; size: 2; position of horizontal split + $py = self::getInt2d($recordData, 2); + + if ($this->frozen) { + // frozen panes + $this->phpSheet->freezePane(PHPExcel_Cell::stringFromColumnIndex($px) . ($py + 1)); + } else { + // unfrozen panes; split windows; not supported by PHPExcel core + } + } + } + + + /** + * Read SELECTION record. There is one such record for each pane in the sheet. + */ + private function readSelection() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if (!$this->readDataOnly) { + // offset: 0; size: 1; pane identifier + $paneId = ord($recordData{0}); + + // offset: 1; size: 2; index to row of the active cell + $r = self::getInt2d($recordData, 1); + + // offset: 3; size: 2; index to column of the active cell + $c = self::getInt2d($recordData, 3); + + // offset: 5; size: 2; index into the following cell range list to the + // entry that contains the active cell + $index = self::getInt2d($recordData, 5); + + // offset: 7; size: var; cell range address list containing all selected cell ranges + $data = substr($recordData, 7); + $cellRangeAddressList = $this->readBIFF5CellRangeAddressList($data); // note: also BIFF8 uses BIFF5 syntax + + $selectedCells = $cellRangeAddressList['cellRangeAddresses'][0]; + + // first row '1' + last row '16384' indicates that full column is selected (apparently also in BIFF8!) + if (preg_match('/^([A-Z]+1\:[A-Z]+)16384$/', $selectedCells)) { + $selectedCells = preg_replace('/^([A-Z]+1\:[A-Z]+)16384$/', '${1}1048576', $selectedCells); + } + + // first row '1' + last row '65536' indicates that full column is selected + if (preg_match('/^([A-Z]+1\:[A-Z]+)65536$/', $selectedCells)) { + $selectedCells = preg_replace('/^([A-Z]+1\:[A-Z]+)65536$/', '${1}1048576', $selectedCells); + } + + // first column 'A' + last column 'IV' indicates that full row is selected + if (preg_match('/^(A[0-9]+\:)IV([0-9]+)$/', $selectedCells)) { + $selectedCells = preg_replace('/^(A[0-9]+\:)IV([0-9]+)$/', '${1}XFD${2}', $selectedCells); + } + + $this->phpSheet->setSelectedCells($selectedCells); + } + } + + + private function includeCellRangeFiltered($cellRangeAddress) + { + $includeCellRange = true; + if ($this->getReadFilter() !== null) { + $includeCellRange = false; + $rangeBoundaries = PHPExcel_Cell::getRangeBoundaries($cellRangeAddress); + $rangeBoundaries[1][0]++; + for ($row = $rangeBoundaries[0][1]; $row <= $rangeBoundaries[1][1]; $row++) { + for ($column = $rangeBoundaries[0][0]; $column != $rangeBoundaries[1][0]; $column++) { + if ($this->getReadFilter()->readCell($column, $row, $this->phpSheet->getTitle())) { + $includeCellRange = true; + break 2; + } + } + } + } + return $includeCellRange; + } + + + /** + * MERGEDCELLS + * + * This record contains the addresses of merged cell ranges + * in the current sheet. + * + * -- "OpenOffice.org's Documentation of the Microsoft + * Excel File Format" + */ + private function readMergedCells() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if ($this->version == self::XLS_BIFF8 && !$this->readDataOnly) { + $cellRangeAddressList = $this->readBIFF8CellRangeAddressList($recordData); + foreach ($cellRangeAddressList['cellRangeAddresses'] as $cellRangeAddress) { + if ((strpos($cellRangeAddress, ':') !== false) && + ($this->includeCellRangeFiltered($cellRangeAddress))) { + $this->phpSheet->mergeCells($cellRangeAddress); + } + } + } + } + + + /** + * Read HYPERLINK record + */ + private function readHyperLink() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer forward to next record + $this->pos += 4 + $length; + + if (!$this->readDataOnly) { + // offset: 0; size: 8; cell range address of all cells containing this hyperlink + try { + $cellRange = $this->readBIFF8CellRangeAddressFixed($recordData, 0, 8); + } catch (PHPExcel_Exception $e) { + return; + } + + // offset: 8, size: 16; GUID of StdLink + + // offset: 24, size: 4; unknown value + + // offset: 28, size: 4; option flags + // bit: 0; mask: 0x00000001; 0 = no link or extant, 1 = file link or URL + $isFileLinkOrUrl = (0x00000001 & self::getInt2d($recordData, 28)) >> 0; + + // bit: 1; mask: 0x00000002; 0 = relative path, 1 = absolute path or URL + $isAbsPathOrUrl = (0x00000001 & self::getInt2d($recordData, 28)) >> 1; + + // bit: 2 (and 4); mask: 0x00000014; 0 = no description + $hasDesc = (0x00000014 & self::getInt2d($recordData, 28)) >> 2; + + // bit: 3; mask: 0x00000008; 0 = no text, 1 = has text + $hasText = (0x00000008 & self::getInt2d($recordData, 28)) >> 3; + + // bit: 7; mask: 0x00000080; 0 = no target frame, 1 = has target frame + $hasFrame = (0x00000080 & self::getInt2d($recordData, 28)) >> 7; + + // bit: 8; mask: 0x00000100; 0 = file link or URL, 1 = UNC path (inc. server name) + $isUNC = (0x00000100 & self::getInt2d($recordData, 28)) >> 8; + + // offset within record data + $offset = 32; + + if ($hasDesc) { + // offset: 32; size: var; character count of description text + $dl = self::getInt4d($recordData, 32); + // offset: 36; size: var; character array of description text, no Unicode string header, always 16-bit characters, zero terminated + $desc = self::encodeUTF16(substr($recordData, 36, 2 * ($dl - 1)), false); + $offset += 4 + 2 * $dl; + } + if ($hasFrame) { + $fl = self::getInt4d($recordData, $offset); + $offset += 4 + 2 * $fl; + } + + // detect type of hyperlink (there are 4 types) + $hyperlinkType = null; + + if ($isUNC) { + $hyperlinkType = 'UNC'; + } elseif (!$isFileLinkOrUrl) { + $hyperlinkType = 'workbook'; + } elseif (ord($recordData{$offset}) == 0x03) { + $hyperlinkType = 'local'; + } elseif (ord($recordData{$offset}) == 0xE0) { + $hyperlinkType = 'URL'; + } + + switch ($hyperlinkType) { + case 'URL': + // section 5.58.2: Hyperlink containing a URL + // e.g. http://example.org/index.php + + // offset: var; size: 16; GUID of URL Moniker + $offset += 16; + // offset: var; size: 4; size (in bytes) of character array of the URL including trailing zero word + $us = self::getInt4d($recordData, $offset); + $offset += 4; + // offset: var; size: $us; character array of the URL, no Unicode string header, always 16-bit characters, zero-terminated + $url = self::encodeUTF16(substr($recordData, $offset, $us - 2), false); + $nullOffset = strpos($url, 0x00); + if ($nullOffset) { + $url = substr($url, 0, $nullOffset); + } + $url .= $hasText ? '#' : ''; + $offset += $us; + break; + case 'local': + // section 5.58.3: Hyperlink to local file + // examples: + // mydoc.txt + // ../../somedoc.xls#Sheet!A1 + + // offset: var; size: 16; GUI of File Moniker + $offset += 16; + + // offset: var; size: 2; directory up-level count. + $upLevelCount = self::getInt2d($recordData, $offset); + $offset += 2; + + // offset: var; size: 4; character count of the shortened file path and name, including trailing zero word + $sl = self::getInt4d($recordData, $offset); + $offset += 4; + + // offset: var; size: sl; character array of the shortened file path and name in 8.3-DOS-format (compressed Unicode string) + $shortenedFilePath = substr($recordData, $offset, $sl); + $shortenedFilePath = self::encodeUTF16($shortenedFilePath, true); + $shortenedFilePath = substr($shortenedFilePath, 0, -1); // remove trailing zero + + $offset += $sl; + + // offset: var; size: 24; unknown sequence + $offset += 24; + + // extended file path + // offset: var; size: 4; size of the following file link field including string lenth mark + $sz = self::getInt4d($recordData, $offset); + $offset += 4; + + // only present if $sz > 0 + if ($sz > 0) { + // offset: var; size: 4; size of the character array of the extended file path and name + $xl = self::getInt4d($recordData, $offset); + $offset += 4; + + // offset: var; size 2; unknown + $offset += 2; + + // offset: var; size $xl; character array of the extended file path and name. + $extendedFilePath = substr($recordData, $offset, $xl); + $extendedFilePath = self::encodeUTF16($extendedFilePath, false); + $offset += $xl; + } + + // construct the path + $url = str_repeat('..\\', $upLevelCount); + $url .= ($sz > 0) ? $extendedFilePath : $shortenedFilePath; // use extended path if available + $url .= $hasText ? '#' : ''; + + break; + case 'UNC': + // section 5.58.4: Hyperlink to a File with UNC (Universal Naming Convention) Path + // todo: implement + return; + case 'workbook': + // section 5.58.5: Hyperlink to the Current Workbook + // e.g. Sheet2!B1:C2, stored in text mark field + $url = 'sheet://'; + break; + default: + return; + } + + if ($hasText) { + // offset: var; size: 4; character count of text mark including trailing zero word + $tl = self::getInt4d($recordData, $offset); + $offset += 4; + // offset: var; size: var; character array of the text mark without the # sign, no Unicode header, always 16-bit characters, zero-terminated + $text = self::encodeUTF16(substr($recordData, $offset, 2 * ($tl - 1)), false); + $url .= $text; + } + + // apply the hyperlink to all the relevant cells + foreach (PHPExcel_Cell::extractAllCellReferencesInRange($cellRange) as $coordinate) { + $this->phpSheet->getCell($coordinate)->getHyperLink()->setUrl($url); + } + } + } + + + /** + * Read DATAVALIDATIONS record + */ + private function readDataValidations() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer forward to next record + $this->pos += 4 + $length; + } + + + /** + * Read DATAVALIDATION record + */ + private function readDataValidation() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer forward to next record + $this->pos += 4 + $length; + + if ($this->readDataOnly) { + return; + } + + // offset: 0; size: 4; Options + $options = self::getInt4d($recordData, 0); + + // bit: 0-3; mask: 0x0000000F; type + $type = (0x0000000F & $options) >> 0; + switch ($type) { + case 0x00: + $type = PHPExcel_Cell_DataValidation::TYPE_NONE; + break; + case 0x01: + $type = PHPExcel_Cell_DataValidation::TYPE_WHOLE; + break; + case 0x02: + $type = PHPExcel_Cell_DataValidation::TYPE_DECIMAL; + break; + case 0x03: + $type = PHPExcel_Cell_DataValidation::TYPE_LIST; + break; + case 0x04: + $type = PHPExcel_Cell_DataValidation::TYPE_DATE; + break; + case 0x05: + $type = PHPExcel_Cell_DataValidation::TYPE_TIME; + break; + case 0x06: + $type = PHPExcel_Cell_DataValidation::TYPE_TEXTLENGTH; + break; + case 0x07: + $type = PHPExcel_Cell_DataValidation::TYPE_CUSTOM; + break; + } + + // bit: 4-6; mask: 0x00000070; error type + $errorStyle = (0x00000070 & $options) >> 4; + switch ($errorStyle) { + case 0x00: + $errorStyle = PHPExcel_Cell_DataValidation::STYLE_STOP; + break; + case 0x01: + $errorStyle = PHPExcel_Cell_DataValidation::STYLE_WARNING; + break; + case 0x02: + $errorStyle = PHPExcel_Cell_DataValidation::STYLE_INFORMATION; + break; + } + + // bit: 7; mask: 0x00000080; 1= formula is explicit (only applies to list) + // I have only seen cases where this is 1 + $explicitFormula = (0x00000080 & $options) >> 7; + + // bit: 8; mask: 0x00000100; 1= empty cells allowed + $allowBlank = (0x00000100 & $options) >> 8; + + // bit: 9; mask: 0x00000200; 1= suppress drop down arrow in list type validity + $suppressDropDown = (0x00000200 & $options) >> 9; + + // bit: 18; mask: 0x00040000; 1= show prompt box if cell selected + $showInputMessage = (0x00040000 & $options) >> 18; + + // bit: 19; mask: 0x00080000; 1= show error box if invalid values entered + $showErrorMessage = (0x00080000 & $options) >> 19; + + // bit: 20-23; mask: 0x00F00000; condition operator + $operator = (0x00F00000 & $options) >> 20; + switch ($operator) { + case 0x00: + $operator = PHPExcel_Cell_DataValidation::OPERATOR_BETWEEN; + break; + case 0x01: + $operator = PHPExcel_Cell_DataValidation::OPERATOR_NOTBETWEEN; + break; + case 0x02: + $operator = PHPExcel_Cell_DataValidation::OPERATOR_EQUAL; + break; + case 0x03: + $operator = PHPExcel_Cell_DataValidation::OPERATOR_NOTEQUAL; + break; + case 0x04: + $operator = PHPExcel_Cell_DataValidation::OPERATOR_GREATERTHAN; + break; + case 0x05: + $operator = PHPExcel_Cell_DataValidation::OPERATOR_LESSTHAN; + break; + case 0x06: + $operator = PHPExcel_Cell_DataValidation::OPERATOR_GREATERTHANOREQUAL; + break; + case 0x07: + $operator = PHPExcel_Cell_DataValidation::OPERATOR_LESSTHANOREQUAL; + break; + } + + // offset: 4; size: var; title of the prompt box + $offset = 4; + $string = self::readUnicodeStringLong(substr($recordData, $offset)); + $promptTitle = $string['value'] !== chr(0) ? $string['value'] : ''; + $offset += $string['size']; + + // offset: var; size: var; title of the error box + $string = self::readUnicodeStringLong(substr($recordData, $offset)); + $errorTitle = $string['value'] !== chr(0) ? $string['value'] : ''; + $offset += $string['size']; + + // offset: var; size: var; text of the prompt box + $string = self::readUnicodeStringLong(substr($recordData, $offset)); + $prompt = $string['value'] !== chr(0) ? $string['value'] : ''; + $offset += $string['size']; + + // offset: var; size: var; text of the error box + $string = self::readUnicodeStringLong(substr($recordData, $offset)); + $error = $string['value'] !== chr(0) ? $string['value'] : ''; + $offset += $string['size']; + + // offset: var; size: 2; size of the formula data for the first condition + $sz1 = self::getInt2d($recordData, $offset); + $offset += 2; + + // offset: var; size: 2; not used + $offset += 2; + + // offset: var; size: $sz1; formula data for first condition (without size field) + $formula1 = substr($recordData, $offset, $sz1); + $formula1 = pack('v', $sz1) . $formula1; // prepend the length + try { + $formula1 = $this->getFormulaFromStructure($formula1); + + // in list type validity, null characters are used as item separators + if ($type == PHPExcel_Cell_DataValidation::TYPE_LIST) { + $formula1 = str_replace(chr(0), ',', $formula1); + } + } catch (PHPExcel_Exception $e) { + return; + } + $offset += $sz1; + + // offset: var; size: 2; size of the formula data for the first condition + $sz2 = self::getInt2d($recordData, $offset); + $offset += 2; + + // offset: var; size: 2; not used + $offset += 2; + + // offset: var; size: $sz2; formula data for second condition (without size field) + $formula2 = substr($recordData, $offset, $sz2); + $formula2 = pack('v', $sz2) . $formula2; // prepend the length + try { + $formula2 = $this->getFormulaFromStructure($formula2); + } catch (PHPExcel_Exception $e) { + return; + } + $offset += $sz2; + + // offset: var; size: var; cell range address list with + $cellRangeAddressList = $this->readBIFF8CellRangeAddressList(substr($recordData, $offset)); + $cellRangeAddresses = $cellRangeAddressList['cellRangeAddresses']; + + foreach ($cellRangeAddresses as $cellRange) { + $stRange = $this->phpSheet->shrinkRangeToFit($cellRange); + foreach (PHPExcel_Cell::extractAllCellReferencesInRange($stRange) as $coordinate) { + $objValidation = $this->phpSheet->getCell($coordinate)->getDataValidation(); + $objValidation->setType($type); + $objValidation->setErrorStyle($errorStyle); + $objValidation->setAllowBlank((bool)$allowBlank); + $objValidation->setShowInputMessage((bool)$showInputMessage); + $objValidation->setShowErrorMessage((bool)$showErrorMessage); + $objValidation->setShowDropDown(!$suppressDropDown); + $objValidation->setOperator($operator); + $objValidation->setErrorTitle($errorTitle); + $objValidation->setError($error); + $objValidation->setPromptTitle($promptTitle); + $objValidation->setPrompt($prompt); + $objValidation->setFormula1($formula1); + $objValidation->setFormula2($formula2); + } + } + } + + /** + * Read SHEETLAYOUT record. Stores sheet tab color information. + */ + private function readSheetLayout() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // local pointer in record data + $offset = 0; + + if (!$this->readDataOnly) { + // offset: 0; size: 2; repeated record identifier 0x0862 + + // offset: 2; size: 10; not used + + // offset: 12; size: 4; size of record data + // Excel 2003 uses size of 0x14 (documented), Excel 2007 uses size of 0x28 (not documented?) + $sz = self::getInt4d($recordData, 12); + + switch ($sz) { + case 0x14: + // offset: 16; size: 2; color index for sheet tab + $colorIndex = self::getInt2d($recordData, 16); + $color = PHPExcel_Reader_Excel5_Color::map($colorIndex, $this->palette, $this->version); + $this->phpSheet->getTabColor()->setRGB($color['rgb']); + break; + case 0x28: + // TODO: Investigate structure for .xls SHEETLAYOUT record as saved by MS Office Excel 2007 + return; + break; + } + } + } + + + /** + * Read SHEETPROTECTION record (FEATHEADR) + */ + private function readSheetProtection() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + if ($this->readDataOnly) { + return; + } + + // offset: 0; size: 2; repeated record header + + // offset: 2; size: 2; FRT cell reference flag (=0 currently) + + // offset: 4; size: 8; Currently not used and set to 0 + + // offset: 12; size: 2; Shared feature type index (2=Enhanced Protetion, 4=SmartTag) + $isf = self::getInt2d($recordData, 12); + if ($isf != 2) { + return; + } + + // offset: 14; size: 1; =1 since this is a feat header + + // offset: 15; size: 4; size of rgbHdrSData + + // rgbHdrSData, assume "Enhanced Protection" + // offset: 19; size: 2; option flags + $options = self::getInt2d($recordData, 19); + + // bit: 0; mask 0x0001; 1 = user may edit objects, 0 = users must not edit objects + $bool = (0x0001 & $options) >> 0; + $this->phpSheet->getProtection()->setObjects(!$bool); + + // bit: 1; mask 0x0002; edit scenarios + $bool = (0x0002 & $options) >> 1; + $this->phpSheet->getProtection()->setScenarios(!$bool); + + // bit: 2; mask 0x0004; format cells + $bool = (0x0004 & $options) >> 2; + $this->phpSheet->getProtection()->setFormatCells(!$bool); + + // bit: 3; mask 0x0008; format columns + $bool = (0x0008 & $options) >> 3; + $this->phpSheet->getProtection()->setFormatColumns(!$bool); + + // bit: 4; mask 0x0010; format rows + $bool = (0x0010 & $options) >> 4; + $this->phpSheet->getProtection()->setFormatRows(!$bool); + + // bit: 5; mask 0x0020; insert columns + $bool = (0x0020 & $options) >> 5; + $this->phpSheet->getProtection()->setInsertColumns(!$bool); + + // bit: 6; mask 0x0040; insert rows + $bool = (0x0040 & $options) >> 6; + $this->phpSheet->getProtection()->setInsertRows(!$bool); + + // bit: 7; mask 0x0080; insert hyperlinks + $bool = (0x0080 & $options) >> 7; + $this->phpSheet->getProtection()->setInsertHyperlinks(!$bool); + + // bit: 8; mask 0x0100; delete columns + $bool = (0x0100 & $options) >> 8; + $this->phpSheet->getProtection()->setDeleteColumns(!$bool); + + // bit: 9; mask 0x0200; delete rows + $bool = (0x0200 & $options) >> 9; + $this->phpSheet->getProtection()->setDeleteRows(!$bool); + + // bit: 10; mask 0x0400; select locked cells + $bool = (0x0400 & $options) >> 10; + $this->phpSheet->getProtection()->setSelectLockedCells(!$bool); + + // bit: 11; mask 0x0800; sort cell range + $bool = (0x0800 & $options) >> 11; + $this->phpSheet->getProtection()->setSort(!$bool); + + // bit: 12; mask 0x1000; auto filter + $bool = (0x1000 & $options) >> 12; + $this->phpSheet->getProtection()->setAutoFilter(!$bool); + + // bit: 13; mask 0x2000; pivot tables + $bool = (0x2000 & $options) >> 13; + $this->phpSheet->getProtection()->setPivotTables(!$bool); + + // bit: 14; mask 0x4000; select unlocked cells + $bool = (0x4000 & $options) >> 14; + $this->phpSheet->getProtection()->setSelectUnlockedCells(!$bool); + + // offset: 21; size: 2; not used + } + + + /** + * Read RANGEPROTECTION record + * Reading of this record is based on Microsoft Office Excel 97-2000 Binary File Format Specification, + * where it is referred to as FEAT record + */ + private function readRangeProtection() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // move stream pointer to next record + $this->pos += 4 + $length; + + // local pointer in record data + $offset = 0; + + if (!$this->readDataOnly) { + $offset += 12; + + // offset: 12; size: 2; shared feature type, 2 = enhanced protection, 4 = smart tag + $isf = self::getInt2d($recordData, 12); + if ($isf != 2) { + // we only read FEAT records of type 2 + return; + } + $offset += 2; + + $offset += 5; + + // offset: 19; size: 2; count of ref ranges this feature is on + $cref = self::getInt2d($recordData, 19); + $offset += 2; + + $offset += 6; + + // offset: 27; size: 8 * $cref; list of cell ranges (like in hyperlink record) + $cellRanges = array(); + for ($i = 0; $i < $cref; ++$i) { + try { + $cellRange = $this->readBIFF8CellRangeAddressFixed(substr($recordData, 27 + 8 * $i, 8)); + } catch (PHPExcel_Exception $e) { + return; + } + $cellRanges[] = $cellRange; + $offset += 8; + } + + // offset: var; size: var; variable length of feature specific data + $rgbFeat = substr($recordData, $offset); + $offset += 4; + + // offset: var; size: 4; the encrypted password (only 16-bit although field is 32-bit) + $wPassword = self::getInt4d($recordData, $offset); + $offset += 4; + + // Apply range protection to sheet + if ($cellRanges) { + $this->phpSheet->protectCells(implode(' ', $cellRanges), strtoupper(dechex($wPassword)), true); + } + } + } + + + /** + * Read IMDATA record + */ + private function readImData() + { + $length = self::getInt2d($this->data, $this->pos + 2); + + // get spliced record data + $splicedRecordData = $this->getSplicedRecordData(); + $recordData = $splicedRecordData['recordData']; + + // UNDER CONSTRUCTION + + // offset: 0; size: 2; image format + $cf = self::getInt2d($recordData, 0); + + // offset: 2; size: 2; environment from which the file was written + $env = self::getInt2d($recordData, 2); + + // offset: 4; size: 4; length of the image data + $lcb = self::getInt4d($recordData, 4); + + // offset: 8; size: var; image data + $iData = substr($recordData, 8); + + switch ($cf) { + case 0x09: // Windows bitmap format + // BITMAPCOREINFO + // 1. BITMAPCOREHEADER + // offset: 0; size: 4; bcSize, Specifies the number of bytes required by the structure + $bcSize = self::getInt4d($iData, 0); + // var_dump($bcSize); + + // offset: 4; size: 2; bcWidth, specifies the width of the bitmap, in pixels + $bcWidth = self::getInt2d($iData, 4); + // var_dump($bcWidth); + + // offset: 6; size: 2; bcHeight, specifies the height of the bitmap, in pixels. + $bcHeight = self::getInt2d($iData, 6); + // var_dump($bcHeight); + $ih = imagecreatetruecolor($bcWidth, $bcHeight); + + // offset: 8; size: 2; bcPlanes, specifies the number of planes for the target device. This value must be 1 + + // offset: 10; size: 2; bcBitCount specifies the number of bits-per-pixel. This value must be 1, 4, 8, or 24 + $bcBitCount = self::getInt2d($iData, 10); + // var_dump($bcBitCount); + + $rgbString = substr($iData, 12); + $rgbTriples = array(); + while (strlen($rgbString) > 0) { + $rgbTriples[] = unpack('Cb/Cg/Cr', $rgbString); + $rgbString = substr($rgbString, 3); + } + $x = 0; + $y = 0; + foreach ($rgbTriples as $i => $rgbTriple) { + $color = imagecolorallocate($ih, $rgbTriple['r'], $rgbTriple['g'], $rgbTriple['b']); + imagesetpixel($ih, $x, $bcHeight - 1 - $y, $color); + $x = ($x + 1) % $bcWidth; + $y = $y + floor(($x + 1) / $bcWidth); + } + //imagepng($ih, 'image.png'); + + $drawing = new PHPExcel_Worksheet_Drawing(); + $drawing->setPath($filename); + $drawing->setWorksheet($this->phpSheet); + break; + case 0x02: // Windows metafile or Macintosh PICT format + case 0x0e: // native format + default: + break; + } + + // getSplicedRecordData() takes care of moving current position in data stream + } + + + /** + * Read a free CONTINUE record. Free CONTINUE record may be a camouflaged MSODRAWING record + * When MSODRAWING data on a sheet exceeds 8224 bytes, CONTINUE records are used instead. Undocumented. + * In this case, we must treat the CONTINUE record as a MSODRAWING record + */ + private function readContinue() + { + $length = self::getInt2d($this->data, $this->pos + 2); + $recordData = $this->readRecordData($this->data, $this->pos + 4, $length); + + // check if we are reading drawing data + // this is in case a free CONTINUE record occurs in other circumstances we are unaware of + if ($this->drawingData == '') { + // move stream pointer to next record + $this->pos += 4 + $length; + + return; + } + + // check if record data is at least 4 bytes long, otherwise there is no chance this is MSODRAWING data + if ($length < 4) { + // move stream pointer to next record + $this->pos += 4 + $length; + + return; + } + + // dirty check to see if CONTINUE record could be a camouflaged MSODRAWING record + // look inside CONTINUE record to see if it looks like a part of an Escher stream + // we know that Escher stream may be split at least at + // 0xF003 MsofbtSpgrContainer + // 0xF004 MsofbtSpContainer + // 0xF00D MsofbtClientTextbox + $validSplitPoints = array(0xF003, 0xF004, 0xF00D); // add identifiers if we find more + + $splitPoint = self::getInt2d($recordData, 2); + if (in_array($splitPoint, $validSplitPoints)) { + // get spliced record data (and move pointer to next record) + $splicedRecordData = $this->getSplicedRecordData(); + $this->drawingData .= $splicedRecordData['recordData']; + + return; + } + + // move stream pointer to next record + $this->pos += 4 + $length; + } + + + /** + * Reads a record from current position in data stream and continues reading data as long as CONTINUE + * records are found. Splices the record data pieces and returns the combined string as if record data + * is in one piece. + * Moves to next current position in data stream to start of next record different from a CONtINUE record + * + * @return array + */ + private function getSplicedRecordData() + { + $data = ''; + $spliceOffsets = array(); + + $i = 0; + $spliceOffsets[0] = 0; + + do { + ++$i; + + // offset: 0; size: 2; identifier + $identifier = self::getInt2d($this->data, $this->pos); + // offset: 2; size: 2; length + $length = self::getInt2d($this->data, $this->pos + 2); + $data .= $this->readRecordData($this->data, $this->pos + 4, $length); + + $spliceOffsets[$i] = $spliceOffsets[$i - 1] + $length; + + $this->pos += 4 + $length; + $nextIdentifier = self::getInt2d($this->data, $this->pos); + } while ($nextIdentifier == self::XLS_TYPE_CONTINUE); + + $splicedData = array( + 'recordData' => $data, + 'spliceOffsets' => $spliceOffsets, + ); + + return $splicedData; + + } + + + /** + * Convert formula structure into human readable Excel formula like 'A3+A5*5' + * + * @param string $formulaStructure The complete binary data for the formula + * @param string $baseCell Base cell, only needed when formula contains tRefN tokens, e.g. with shared formulas + * @return string Human readable formula + */ + private function getFormulaFromStructure($formulaStructure, $baseCell = 'A1') + { + // offset: 0; size: 2; size of the following formula data + $sz = self::getInt2d($formulaStructure, 0); + + // offset: 2; size: sz + $formulaData = substr($formulaStructure, 2, $sz); + + // for debug: dump the formula data + //echo ''; + //echo 'size: ' . $sz . "\n"; + //echo 'the entire formula data: '; + //Debug::dump($formulaData); + //echo "\n----\n"; + + // offset: 2 + sz; size: variable (optional) + if (strlen($formulaStructure) > 2 + $sz) { + $additionalData = substr($formulaStructure, 2 + $sz); + + // for debug: dump the additional data + //echo 'the entire additional data: '; + //Debug::dump($additionalData); + //echo "\n----\n"; + } else { + $additionalData = ''; + } + + return $this->getFormulaFromData($formulaData, $additionalData, $baseCell); + } + + + /** + * Take formula data and additional data for formula and return human readable formula + * + * @param string $formulaData The binary data for the formula itself + * @param string $additionalData Additional binary data going with the formula + * @param string $baseCell Base cell, only needed when formula contains tRefN tokens, e.g. with shared formulas + * @return string Human readable formula + */ + private function getFormulaFromData($formulaData, $additionalData = '', $baseCell = 'A1') + { + // start parsing the formula data + $tokens = array(); + + while (strlen($formulaData) > 0 and $token = $this->getNextToken($formulaData, $baseCell)) { + $tokens[] = $token; + $formulaData = substr($formulaData, $token['size']); + + // for debug: dump the token + //var_dump($token); + } + + $formulaString = $this->createFormulaFromTokens($tokens, $additionalData); + + return $formulaString; + } + + + /** + * Take array of tokens together with additional data for formula and return human readable formula + * + * @param array $tokens + * @param array $additionalData Additional binary data going with the formula + * @param string $baseCell Base cell, only needed when formula contains tRefN tokens, e.g. with shared formulas + * @return string Human readable formula + */ + private function createFormulaFromTokens($tokens, $additionalData) + { + // empty formula? + if (empty($tokens)) { + return ''; + } + + $formulaStrings = array(); + foreach ($tokens as $token) { + // initialize spaces + $space0 = isset($space0) ? $space0 : ''; // spaces before next token, not tParen + $space1 = isset($space1) ? $space1 : ''; // carriage returns before next token, not tParen + $space2 = isset($space2) ? $space2 : ''; // spaces before opening parenthesis + $space3 = isset($space3) ? $space3 : ''; // carriage returns before opening parenthesis + $space4 = isset($space4) ? $space4 : ''; // spaces before closing parenthesis + $space5 = isset($space5) ? $space5 : ''; // carriage returns before closing parenthesis + + switch ($token['name']) { + case 'tAdd': // addition + case 'tConcat': // addition + case 'tDiv': // division + case 'tEQ': // equality + case 'tGE': // greater than or equal + case 'tGT': // greater than + case 'tIsect': // intersection + case 'tLE': // less than or equal + case 'tList': // less than or equal + case 'tLT': // less than + case 'tMul': // multiplication + case 'tNE': // multiplication + case 'tPower': // power + case 'tRange': // range + case 'tSub': // subtraction + $op2 = array_pop($formulaStrings); + $op1 = array_pop($formulaStrings); + $formulaStrings[] = "$op1$space1$space0{$token['data']}$op2"; + unset($space0, $space1); + break; + case 'tUplus': // unary plus + case 'tUminus': // unary minus + $op = array_pop($formulaStrings); + $formulaStrings[] = "$space1$space0{$token['data']}$op"; + unset($space0, $space1); + break; + case 'tPercent': // percent sign + $op = array_pop($formulaStrings); + $formulaStrings[] = "$op$space1$space0{$token['data']}"; + unset($space0, $space1); + break; + case 'tAttrVolatile': // indicates volatile function + case 'tAttrIf': + case 'tAttrSkip': + case 'tAttrChoose': + // token is only important for Excel formula evaluator + // do nothing + break; + case 'tAttrSpace': // space / carriage return + // space will be used when next token arrives, do not alter formulaString stack + switch ($token['data']['spacetype']) { + case 'type0': + $space0 = str_repeat(' ', $token['data']['spacecount']); + break; + case 'type1': + $space1 = str_repeat("\n", $token['data']['spacecount']); + break; + case 'type2': + $space2 = str_repeat(' ', $token['data']['spacecount']); + break; + case 'type3': + $space3 = str_repeat("\n", $token['data']['spacecount']); + break; + case 'type4': + $space4 = str_repeat(' ', $token['data']['spacecount']); + break; + case 'type5': + $space5 = str_repeat("\n", $token['data']['spacecount']); + break; + } + break; + case 'tAttrSum': // SUM function with one parameter + $op = array_pop($formulaStrings); + $formulaStrings[] = "{$space1}{$space0}SUM($op)"; + unset($space0, $space1); + break; + case 'tFunc': // function with fixed number of arguments + case 'tFuncV': // function with variable number of arguments + if ($token['data']['function'] != '') { + // normal function + $ops = array(); // array of operators + for ($i = 0; $i < $token['data']['args']; ++$i) { + $ops[] = array_pop($formulaStrings); + } + $ops = array_reverse($ops); + $formulaStrings[] = "$space1$space0{$token['data']['function']}(" . implode(',', $ops) . ")"; + unset($space0, $space1); + } else { + // add-in function + $ops = array(); // array of operators + for ($i = 0; $i < $token['data']['args'] - 1; ++$i) { + $ops[] = array_pop($formulaStrings); + } + $ops = array_reverse($ops); + $function = array_pop($formulaStrings); + $formulaStrings[] = "$space1$space0$function(" . implode(',', $ops) . ")"; + unset($space0, $space1); + } + break; + case 'tParen': // parenthesis + $expression = array_pop($formulaStrings); + $formulaStrings[] = "$space3$space2($expression$space5$space4)"; + unset($space2, $space3, $space4, $space5); + break; + case 'tArray': // array constant + $constantArray = self::readBIFF8ConstantArray($additionalData); + $formulaStrings[] = $space1 . $space0 . $constantArray['value']; + $additionalData = substr($additionalData, $constantArray['size']); // bite of chunk of additional data + unset($space0, $space1); + break; + case 'tMemArea': + // bite off chunk of additional data + $cellRangeAddressList = $this->readBIFF8CellRangeAddressList($additionalData); + $additionalData = substr($additionalData, $cellRangeAddressList['size']); + $formulaStrings[] = "$space1$space0{$token['data']}"; + unset($space0, $space1); + break; + case 'tArea': // cell range address + case 'tBool': // boolean + case 'tErr': // error code + case 'tInt': // integer + case 'tMemErr': + case 'tMemFunc': + case 'tMissArg': + case 'tName': + case 'tNameX': + case 'tNum': // number + case 'tRef': // single cell reference + case 'tRef3d': // 3d cell reference + case 'tArea3d': // 3d cell range reference + case 'tRefN': + case 'tAreaN': + case 'tStr': // string + $formulaStrings[] = "$space1$space0{$token['data']}"; + unset($space0, $space1); + break; + } + } + $formulaString = $formulaStrings[0]; + + // for debug: dump the human readable formula + //echo '----' . "\n"; + //echo 'Formula: ' . $formulaString; + + return $formulaString; + } + + + /** + * Fetch next token from binary formula data + * + * @param string Formula data + * @param string $baseCell Base cell, only needed when formula contains tRefN tokens, e.g. with shared formulas + * @return array + * @throws PHPExcel_Reader_Exception + */ + private function getNextToken($formulaData, $baseCell = 'A1') + { + // offset: 0; size: 1; token id + $id = ord($formulaData[0]); // token id + $name = false; // initialize token name + + switch ($id) { + case 0x03: + $name = 'tAdd'; + $size = 1; + $data = '+'; + break; + case 0x04: + $name = 'tSub'; + $size = 1; + $data = '-'; + break; + case 0x05: + $name = 'tMul'; + $size = 1; + $data = '*'; + break; + case 0x06: + $name = 'tDiv'; + $size = 1; + $data = '/'; + break; + case 0x07: + $name = 'tPower'; + $size = 1; + $data = '^'; + break; + case 0x08: + $name = 'tConcat'; + $size = 1; + $data = '&'; + break; + case 0x09: + $name = 'tLT'; + $size = 1; + $data = '<'; + break; + case 0x0A: + $name = 'tLE'; + $size = 1; + $data = '<='; + break; + case 0x0B: + $name = 'tEQ'; + $size = 1; + $data = '='; + break; + case 0x0C: + $name = 'tGE'; + $size = 1; + $data = '>='; + break; + case 0x0D: + $name = 'tGT'; + $size = 1; + $data = '>'; + break; + case 0x0E: + $name = 'tNE'; + $size = 1; + $data = '<>'; + break; + case 0x0F: + $name = 'tIsect'; + $size = 1; + $data = ' '; + break; + case 0x10: + $name = 'tList'; + $size = 1; + $data = ','; + break; + case 0x11: + $name = 'tRange'; + $size = 1; + $data = ':'; + break; + case 0x12: + $name = 'tUplus'; + $size = 1; + $data = '+'; + break; + case 0x13: + $name = 'tUminus'; + $size = 1; + $data = '-'; + break; + case 0x14: + $name = 'tPercent'; + $size = 1; + $data = '%'; + break; + case 0x15: // parenthesis + $name = 'tParen'; + $size = 1; + $data = null; + break; + case 0x16: // missing argument + $name = 'tMissArg'; + $size = 1; + $data = ''; + break; + case 0x17: // string + $name = 'tStr'; + // offset: 1; size: var; Unicode string, 8-bit string length + $string = self::readUnicodeStringShort(substr($formulaData, 1)); + $size = 1 + $string['size']; + $data = self::UTF8toExcelDoubleQuoted($string['value']); + break; + case 0x19: // Special attribute + // offset: 1; size: 1; attribute type flags: + switch (ord($formulaData[1])) { + case 0x01: + $name = 'tAttrVolatile'; + $size = 4; + $data = null; + break; + case 0x02: + $name = 'tAttrIf'; + $size = 4; + $data = null; + break; + case 0x04: + $name = 'tAttrChoose'; + // offset: 2; size: 2; number of choices in the CHOOSE function ($nc, number of parameters decreased by 1) + $nc = self::getInt2d($formulaData, 2); + // offset: 4; size: 2 * $nc + // offset: 4 + 2 * $nc; size: 2 + $size = 2 * $nc + 6; + $data = null; + break; + case 0x08: + $name = 'tAttrSkip'; + $size = 4; + $data = null; + break; + case 0x10: + $name = 'tAttrSum'; + $size = 4; + $data = null; + break; + case 0x40: + case 0x41: + $name = 'tAttrSpace'; + $size = 4; + // offset: 2; size: 2; space type and position + switch (ord($formulaData[2])) { + case 0x00: + $spacetype = 'type0'; + break; + case 0x01: + $spacetype = 'type1'; + break; + case 0x02: + $spacetype = 'type2'; + break; + case 0x03: + $spacetype = 'type3'; + break; + case 0x04: + $spacetype = 'type4'; + break; + case 0x05: + $spacetype = 'type5'; + break; + default: + throw new PHPExcel_Reader_Exception('Unrecognized space type in tAttrSpace token'); + break; + } + // offset: 3; size: 1; number of inserted spaces/carriage returns + $spacecount = ord($formulaData[3]); + + $data = array('spacetype' => $spacetype, 'spacecount' => $spacecount); + break; + default: + throw new PHPExcel_Reader_Exception('Unrecognized attribute flag in tAttr token'); + break; + } + break; + case 0x1C: // error code + // offset: 1; size: 1; error code + $name = 'tErr'; + $size = 2; + $data = PHPExcel_Reader_Excel5_ErrorCode::lookup(ord($formulaData[1])); + break; + case 0x1D: // boolean + // offset: 1; size: 1; 0 = false, 1 = true; + $name = 'tBool'; + $size = 2; + $data = ord($formulaData[1]) ? 'TRUE' : 'FALSE'; + break; + case 0x1E: // integer + // offset: 1; size: 2; unsigned 16-bit integer + $name = 'tInt'; + $size = 3; + $data = self::getInt2d($formulaData, 1); + break; + case 0x1F: // number + // offset: 1; size: 8; + $name = 'tNum'; + $size = 9; + $data = self::extractNumber(substr($formulaData, 1)); + $data = str_replace(',', '.', (string)$data); // in case non-English locale + break; + case 0x20: // array constant + case 0x40: + case 0x60: + // offset: 1; size: 7; not used + $name = 'tArray'; + $size = 8; + $data = null; + break; + case 0x21: // function with fixed number of arguments + case 0x41: + case 0x61: + $name = 'tFunc'; + $size = 3; + // offset: 1; size: 2; index to built-in sheet function + switch (self::getInt2d($formulaData, 1)) { + case 2: + $function = 'ISNA'; + $args = 1; + break; + case 3: + $function = 'ISERROR'; + $args = 1; + break; + case 10: + $function = 'NA'; + $args = 0; + break; + case 15: + $function = 'SIN'; + $args = 1; + break; + case 16: + $function = 'COS'; + $args = 1; + break; + case 17: + $function = 'TAN'; + $args = 1; + break; + case 18: + $function = 'ATAN'; + $args = 1; + break; + case 19: + $function = 'PI'; + $args = 0; + break; + case 20: + $function = 'SQRT'; + $args = 1; + break; + case 21: + $function = 'EXP'; + $args = 1; + break; + case 22: + $function = 'LN'; + $args = 1; + break; + case 23: + $function = 'LOG10'; + $args = 1; + break; + case 24: + $function = 'ABS'; + $args = 1; + break; + case 25: + $function = 'INT'; + $args = 1; + break; + case 26: + $function = 'SIGN'; + $args = 1; + break; + case 27: + $function = 'ROUND'; + $args = 2; + break; + case 30: + $function = 'REPT'; + $args = 2; + break; + case 31: + $function = 'MID'; + $args = 3; + break; + case 32: + $function = 'LEN'; + $args = 1; + break; + case 33: + $function = 'VALUE'; + $args = 1; + break; + case 34: + $function = 'TRUE'; + $args = 0; + break; + case 35: + $function = 'FALSE'; + $args = 0; + break; + case 38: + $function = 'NOT'; + $args = 1; + break; + case 39: + $function = 'MOD'; + $args = 2; + break; + case 40: + $function = 'DCOUNT'; + $args = 3; + break; + case 41: + $function = 'DSUM'; + $args = 3; + break; + case 42: + $function = 'DAVERAGE'; + $args = 3; + break; + case 43: + $function = 'DMIN'; + $args = 3; + break; + case 44: + $function = 'DMAX'; + $args = 3; + break; + case 45: + $function = 'DSTDEV'; + $args = 3; + break; + case 48: + $function = 'TEXT'; + $args = 2; + break; + case 61: + $function = 'MIRR'; + $args = 3; + break; + case 63: + $function = 'RAND'; + $args = 0; + break; + case 65: + $function = 'DATE'; + $args = 3; + break; + case 66: + $function = 'TIME'; + $args = 3; + break; + case 67: + $function = 'DAY'; + $args = 1; + break; + case 68: + $function = 'MONTH'; + $args = 1; + break; + case 69: + $function = 'YEAR'; + $args = 1; + break; + case 71: + $function = 'HOUR'; + $args = 1; + break; + case 72: + $function = 'MINUTE'; + $args = 1; + break; + case 73: + $function = 'SECOND'; + $args = 1; + break; + case 74: + $function = 'NOW'; + $args = 0; + break; + case 75: + $function = 'AREAS'; + $args = 1; + break; + case 76: + $function = 'ROWS'; + $args = 1; + break; + case 77: + $function = 'COLUMNS'; + $args = 1; + break; + case 83: + $function = 'TRANSPOSE'; + $args = 1; + break; + case 86: + $function = 'TYPE'; + $args = 1; + break; + case 97: + $function = 'ATAN2'; + $args = 2; + break; + case 98: + $function = 'ASIN'; + $args = 1; + break; + case 99: + $function = 'ACOS'; + $args = 1; + break; + case 105: + $function = 'ISREF'; + $args = 1; + break; + case 111: + $function = 'CHAR'; + $args = 1; + break; + case 112: + $function = 'LOWER'; + $args = 1; + break; + case 113: + $function = 'UPPER'; + $args = 1; + break; + case 114: + $function = 'PROPER'; + $args = 1; + break; + case 117: + $function = 'EXACT'; + $args = 2; + break; + case 118: + $function = 'TRIM'; + $args = 1; + break; + case 119: + $function = 'REPLACE'; + $args = 4; + break; + case 121: + $function = 'CODE'; + $args = 1; + break; + case 126: + $function = 'ISERR'; + $args = 1; + break; + case 127: + $function = 'ISTEXT'; + $args = 1; + break; + case 128: + $function = 'ISNUMBER'; + $args = 1; + break; + case 129: + $function = 'ISBLANK'; + $args = 1; + break; + case 130: + $function = 'T'; + $args = 1; + break; + case 131: + $function = 'N'; + $args = 1; + break; + case 140: + $function = 'DATEVALUE'; + $args = 1; + break; + case 141: + $function = 'TIMEVALUE'; + $args = 1; + break; + case 142: + $function = 'SLN'; + $args = 3; + break; + case 143: + $function = 'SYD'; + $args = 4; + break; + case 162: + $function = 'CLEAN'; + $args = 1; + break; + case 163: + $function = 'MDETERM'; + $args = 1; + break; + case 164: + $function = 'MINVERSE'; + $args = 1; + break; + case 165: + $function = 'MMULT'; + $args = 2; + break; + case 184: + $function = 'FACT'; + $args = 1; + break; + case 189: + $function = 'DPRODUCT'; + $args = 3; + break; + case 190: + $function = 'ISNONTEXT'; + $args = 1; + break; + case 195: + $function = 'DSTDEVP'; + $args = 3; + break; + case 196: + $function = 'DVARP'; + $args = 3; + break; + case 198: + $function = 'ISLOGICAL'; + $args = 1; + break; + case 199: + $function = 'DCOUNTA'; + $args = 3; + break; + case 207: + $function = 'REPLACEB'; + $args = 4; + break; + case 210: + $function = 'MIDB'; + $args = 3; + break; + case 211: + $function = 'LENB'; + $args = 1; + break; + case 212: + $function = 'ROUNDUP'; + $args = 2; + break; + case 213: + $function = 'ROUNDDOWN'; + $args = 2; + break; + case 214: + $function = 'ASC'; + $args = 1; + break; + case 215: + $function = 'DBCS'; + $args = 1; + break; + case 221: + $function = 'TODAY'; + $args = 0; + break; + case 229: + $function = 'SINH'; + $args = 1; + break; + case 230: + $function = 'COSH'; + $args = 1; + break; + case 231: + $function = 'TANH'; + $args = 1; + break; + case 232: + $function = 'ASINH'; + $args = 1; + break; + case 233: + $function = 'ACOSH'; + $args = 1; + break; + case 234: + $function = 'ATANH'; + $args = 1; + break; + case 235: + $function = 'DGET'; + $args = 3; + break; + case 244: + $function = 'INFO'; + $args = 1; + break; + case 252: + $function = 'FREQUENCY'; + $args = 2; + break; + case 261: + $function = 'ERROR.TYPE'; + $args = 1; + break; + case 271: + $function = 'GAMMALN'; + $args = 1; + break; + case 273: + $function = 'BINOMDIST'; + $args = 4; + break; + case 274: + $function = 'CHIDIST'; + $args = 2; + break; + case 275: + $function = 'CHIINV'; + $args = 2; + break; + case 276: + $function = 'COMBIN'; + $args = 2; + break; + case 277: + $function = 'CONFIDENCE'; + $args = 3; + break; + case 278: + $function = 'CRITBINOM'; + $args = 3; + break; + case 279: + $function = 'EVEN'; + $args = 1; + break; + case 280: + $function = 'EXPONDIST'; + $args = 3; + break; + case 281: + $function = 'FDIST'; + $args = 3; + break; + case 282: + $function = 'FINV'; + $args = 3; + break; + case 283: + $function = 'FISHER'; + $args = 1; + break; + case 284: + $function = 'FISHERINV'; + $args = 1; + break; + case 285: + $function = 'FLOOR'; + $args = 2; + break; + case 286: + $function = 'GAMMADIST'; + $args = 4; + break; + case 287: + $function = 'GAMMAINV'; + $args = 3; + break; + case 288: + $function = 'CEILING'; + $args = 2; + break; + case 289: + $function = 'HYPGEOMDIST'; + $args = 4; + break; + case 290: + $function = 'LOGNORMDIST'; + $args = 3; + break; + case 291: + $function = 'LOGINV'; + $args = 3; + break; + case 292: + $function = 'NEGBINOMDIST'; + $args = 3; + break; + case 293: + $function = 'NORMDIST'; + $args = 4; + break; + case 294: + $function = 'NORMSDIST'; + $args = 1; + break; + case 295: + $function = 'NORMINV'; + $args = 3; + break; + case 296: + $function = 'NORMSINV'; + $args = 1; + break; + case 297: + $function = 'STANDARDIZE'; + $args = 3; + break; + case 298: + $function = 'ODD'; + $args = 1; + break; + case 299: + $function = 'PERMUT'; + $args = 2; + break; + case 300: + $function = 'POISSON'; + $args = 3; + break; + case 301: + $function = 'TDIST'; + $args = 3; + break; + case 302: + $function = 'WEIBULL'; + $args = 4; + break; + case 303: + $function = 'SUMXMY2'; + $args = 2; + break; + case 304: + $function = 'SUMX2MY2'; + $args = 2; + break; + case 305: + $function = 'SUMX2PY2'; + $args = 2; + break; + case 306: + $function = 'CHITEST'; + $args = 2; + break; + case 307: + $function = 'CORREL'; + $args = 2; + break; + case 308: + $function = 'COVAR'; + $args = 2; + break; + case 309: + $function = 'FORECAST'; + $args = 3; + break; + case 310: + $function = 'FTEST'; + $args = 2; + break; + case 311: + $function = 'INTERCEPT'; + $args = 2; + break; + case 312: + $function = 'PEARSON'; + $args = 2; + break; + case 313: + $function = 'RSQ'; + $args = 2; + break; + case 314: + $function = 'STEYX'; + $args = 2; + break; + case 315: + $function = 'SLOPE'; + $args = 2; + break; + case 316: + $function = 'TTEST'; + $args = 4; + break; + case 325: + $function = 'LARGE'; + $args = 2; + break; + case 326: + $function = 'SMALL'; + $args = 2; + break; + case 327: + $function = 'QUARTILE'; + $args = 2; + break; + case 328: + $function = 'PERCENTILE'; + $args = 2; + break; + case 331: + $function = 'TRIMMEAN'; + $args = 2; + break; + case 332: + $function = 'TINV'; + $args = 2; + break; + case 337: + $function = 'POWER'; + $args = 2; + break; + case 342: + $function = 'RADIANS'; + $args = 1; + break; + case 343: + $function = 'DEGREES'; + $args = 1; + break; + case 346: + $function = 'COUNTIF'; + $args = 2; + break; + case 347: + $function = 'COUNTBLANK'; + $args = 1; + break; + case 350: + $function = 'ISPMT'; + $args = 4; + break; + case 351: + $function = 'DATEDIF'; + $args = 3; + break; + case 352: + $function = 'DATESTRING'; + $args = 1; + break; + case 353: + $function = 'NUMBERSTRING'; + $args = 2; + break; + case 360: + $function = 'PHONETIC'; + $args = 1; + break; + case 368: + $function = 'BAHTTEXT'; + $args = 1; + break; + default: + throw new PHPExcel_Reader_Exception('Unrecognized function in formula'); + break; + } + $data = array('function' => $function, 'args' => $args); + break; + case 0x22: // function with variable number of arguments + case 0x42: + case 0x62: + $name = 'tFuncV'; + $size = 4; + // offset: 1; size: 1; number of arguments + $args = ord($formulaData[1]); + // offset: 2: size: 2; index to built-in sheet function + $index = self::getInt2d($formulaData, 2); + switch ($index) { + case 0: + $function = 'COUNT'; + break; + case 1: + $function = 'IF'; + break; + case 4: + $function = 'SUM'; + break; + case 5: + $function = 'AVERAGE'; + break; + case 6: + $function = 'MIN'; + break; + case 7: + $function = 'MAX'; + break; + case 8: + $function = 'ROW'; + break; + case 9: + $function = 'COLUMN'; + break; + case 11: + $function = 'NPV'; + break; + case 12: + $function = 'STDEV'; + break; + case 13: + $function = 'DOLLAR'; + break; + case 14: + $function = 'FIXED'; + break; + case 28: + $function = 'LOOKUP'; + break; + case 29: + $function = 'INDEX'; + break; + case 36: + $function = 'AND'; + break; + case 37: + $function = 'OR'; + break; + case 46: + $function = 'VAR'; + break; + case 49: + $function = 'LINEST'; + break; + case 50: + $function = 'TREND'; + break; + case 51: + $function = 'LOGEST'; + break; + case 52: + $function = 'GROWTH'; + break; + case 56: + $function = 'PV'; + break; + case 57: + $function = 'FV'; + break; + case 58: + $function = 'NPER'; + break; + case 59: + $function = 'PMT'; + break; + case 60: + $function = 'RATE'; + break; + case 62: + $function = 'IRR'; + break; + case 64: + $function = 'MATCH'; + break; + case 70: + $function = 'WEEKDAY'; + break; + case 78: + $function = 'OFFSET'; + break; + case 82: + $function = 'SEARCH'; + break; + case 100: + $function = 'CHOOSE'; + break; + case 101: + $function = 'HLOOKUP'; + break; + case 102: + $function = 'VLOOKUP'; + break; + case 109: + $function = 'LOG'; + break; + case 115: + $function = 'LEFT'; + break; + case 116: + $function = 'RIGHT'; + break; + case 120: + $function = 'SUBSTITUTE'; + break; + case 124: + $function = 'FIND'; + break; + case 125: + $function = 'CELL'; + break; + case 144: + $function = 'DDB'; + break; + case 148: + $function = 'INDIRECT'; + break; + case 167: + $function = 'IPMT'; + break; + case 168: + $function = 'PPMT'; + break; + case 169: + $function = 'COUNTA'; + break; + case 183: + $function = 'PRODUCT'; + break; + case 193: + $function = 'STDEVP'; + break; + case 194: + $function = 'VARP'; + break; + case 197: + $function = 'TRUNC'; + break; + case 204: + $function = 'USDOLLAR'; + break; + case 205: + $function = 'FINDB'; + break; + case 206: + $function = 'SEARCHB'; + break; + case 208: + $function = 'LEFTB'; + break; + case 209: + $function = 'RIGHTB'; + break; + case 216: + $function = 'RANK'; + break; + case 219: + $function = 'ADDRESS'; + break; + case 220: + $function = 'DAYS360'; + break; + case 222: + $function = 'VDB'; + break; + case 227: + $function = 'MEDIAN'; + break; + case 228: + $function = 'SUMPRODUCT'; + break; + case 247: + $function = 'DB'; + break; + case 255: + $function = ''; + break; + case 269: + $function = 'AVEDEV'; + break; + case 270: + $function = 'BETADIST'; + break; + case 272: + $function = 'BETAINV'; + break; + case 317: + $function = 'PROB'; + break; + case 318: + $function = 'DEVSQ'; + break; + case 319: + $function = 'GEOMEAN'; + break; + case 320: + $function = 'HARMEAN'; + break; + case 321: + $function = 'SUMSQ'; + break; + case 322: + $function = 'KURT'; + break; + case 323: + $function = 'SKEW'; + break; + case 324: + $function = 'ZTEST'; + break; + case 329: + $function = 'PERCENTRANK'; + break; + case 330: + $function = 'MODE'; + break; + case 336: + $function = 'CONCATENATE'; + break; + case 344: + $function = 'SUBTOTAL'; + break; + case 345: + $function = 'SUMIF'; + break; + case 354: + $function = 'ROMAN'; + break; + case 358: + $function = 'GETPIVOTDATA'; + break; + case 359: + $function = 'HYPERLINK'; + break; + case 361: + $function = 'AVERAGEA'; + break; + case 362: + $function = 'MAXA'; + break; + case 363: + $function = 'MINA'; + break; + case 364: + $function = 'STDEVPA'; + break; + case 365: + $function = 'VARPA'; + break; + case 366: + $function = 'STDEVA'; + break; + case 367: + $function = 'VARA'; + break; + default: + throw new PHPExcel_Reader_Exception('Unrecognized function in formula'); + break; + } + $data = array('function' => $function, 'args' => $args); + break; + case 0x23: // index to defined name + case 0x43: + case 0x63: + $name = 'tName'; + $size = 5; + // offset: 1; size: 2; one-based index to definedname record + $definedNameIndex = self::getInt2d($formulaData, 1) - 1; + // offset: 2; size: 2; not used + $data = $this->definedname[$definedNameIndex]['name']; + break; + case 0x24: // single cell reference e.g. A5 + case 0x44: + case 0x64: + $name = 'tRef'; + $size = 5; + $data = $this->readBIFF8CellAddress(substr($formulaData, 1, 4)); + break; + case 0x25: // cell range reference to cells in the same sheet (2d) + case 0x45: + case 0x65: + $name = 'tArea'; + $size = 9; + $data = $this->readBIFF8CellRangeAddress(substr($formulaData, 1, 8)); + break; + case 0x26: // Constant reference sub-expression + case 0x46: + case 0x66: + $name = 'tMemArea'; + // offset: 1; size: 4; not used + // offset: 5; size: 2; size of the following subexpression + $subSize = self::getInt2d($formulaData, 5); + $size = 7 + $subSize; + $data = $this->getFormulaFromData(substr($formulaData, 7, $subSize)); + break; + case 0x27: // Deleted constant reference sub-expression + case 0x47: + case 0x67: + $name = 'tMemErr'; + // offset: 1; size: 4; not used + // offset: 5; size: 2; size of the following subexpression + $subSize = self::getInt2d($formulaData, 5); + $size = 7 + $subSize; + $data = $this->getFormulaFromData(substr($formulaData, 7, $subSize)); + break; + case 0x29: // Variable reference sub-expression + case 0x49: + case 0x69: + $name = 'tMemFunc'; + // offset: 1; size: 2; size of the following sub-expression + $subSize = self::getInt2d($formulaData, 1); + $size = 3 + $subSize; + $data = $this->getFormulaFromData(substr($formulaData, 3, $subSize)); + break; + case 0x2C: // Relative 2d cell reference reference, used in shared formulas and some other places + case 0x4C: + case 0x6C: + $name = 'tRefN'; + $size = 5; + $data = $this->readBIFF8CellAddressB(substr($formulaData, 1, 4), $baseCell); + break; + case 0x2D: // Relative 2d range reference + case 0x4D: + case 0x6D: + $name = 'tAreaN'; + $size = 9; + $data = $this->readBIFF8CellRangeAddressB(substr($formulaData, 1, 8), $baseCell); + break; + case 0x39: // External name + case 0x59: + case 0x79: + $name = 'tNameX'; + $size = 7; + // offset: 1; size: 2; index to REF entry in EXTERNSHEET record + // offset: 3; size: 2; one-based index to DEFINEDNAME or EXTERNNAME record + $index = self::getInt2d($formulaData, 3); + // assume index is to EXTERNNAME record + $data = $this->externalNames[$index - 1]['name']; + // offset: 5; size: 2; not used + break; + case 0x3A: // 3d reference to cell + case 0x5A: + case 0x7A: + $name = 'tRef3d'; + $size = 7; + + try { + // offset: 1; size: 2; index to REF entry + $sheetRange = $this->readSheetRangeByRefIndex(self::getInt2d($formulaData, 1)); + // offset: 3; size: 4; cell address + $cellAddress = $this->readBIFF8CellAddress(substr($formulaData, 3, 4)); + + $data = "$sheetRange!$cellAddress"; + } catch (PHPExcel_Exception $e) { + // deleted sheet reference + $data = '#REF!'; + } + break; + case 0x3B: // 3d reference to cell range + case 0x5B: + case 0x7B: + $name = 'tArea3d'; + $size = 11; + + try { + // offset: 1; size: 2; index to REF entry + $sheetRange = $this->readSheetRangeByRefIndex(self::getInt2d($formulaData, 1)); + // offset: 3; size: 8; cell address + $cellRangeAddress = $this->readBIFF8CellRangeAddress(substr($formulaData, 3, 8)); + + $data = "$sheetRange!$cellRangeAddress"; + } catch (PHPExcel_Exception $e) { + // deleted sheet reference + $data = '#REF!'; + } + break; + // Unknown cases // don't know how to deal with + default: + throw new PHPExcel_Reader_Exception('Unrecognized token ' . sprintf('%02X', $id) . ' in formula'); + break; + } + + return array( + 'id' => $id, + 'name' => $name, + 'size' => $size, + 'data' => $data, + ); + } + + + /** + * Reads a cell address in BIFF8 e.g. 'A2' or '$A$2' + * section 3.3.4 + * + * @param string $cellAddressStructure + * @return string + */ + private function readBIFF8CellAddress($cellAddressStructure) + { + // offset: 0; size: 2; index to row (0... 65535) (or offset (-32768... 32767)) + $row = self::getInt2d($cellAddressStructure, 0) + 1; + + // offset: 2; size: 2; index to column or column offset + relative flags + // bit: 7-0; mask 0x00FF; column index + $column = PHPExcel_Cell::stringFromColumnIndex(0x00FF & self::getInt2d($cellAddressStructure, 2)); + + // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index) + if (!(0x4000 & self::getInt2d($cellAddressStructure, 2))) { + $column = '$' . $column; + } + // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index) + if (!(0x8000 & self::getInt2d($cellAddressStructure, 2))) { + $row = '$' . $row; + } + + return $column . $row; + } + + + /** + * Reads a cell address in BIFF8 for shared formulas. Uses positive and negative values for row and column + * to indicate offsets from a base cell + * section 3.3.4 + * + * @param string $cellAddressStructure + * @param string $baseCell Base cell, only needed when formula contains tRefN tokens, e.g. with shared formulas + * @return string + */ + private function readBIFF8CellAddressB($cellAddressStructure, $baseCell = 'A1') + { + list($baseCol, $baseRow) = PHPExcel_Cell::coordinateFromString($baseCell); + $baseCol = PHPExcel_Cell::columnIndexFromString($baseCol) - 1; + + // offset: 0; size: 2; index to row (0... 65535) (or offset (-32768... 32767)) + $rowIndex = self::getInt2d($cellAddressStructure, 0); + $row = self::getInt2d($cellAddressStructure, 0) + 1; + + // offset: 2; size: 2; index to column or column offset + relative flags + // bit: 7-0; mask 0x00FF; column index + $colIndex = 0x00FF & self::getInt2d($cellAddressStructure, 2); + + // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index) + if (!(0x4000 & self::getInt2d($cellAddressStructure, 2))) { + $column = PHPExcel_Cell::stringFromColumnIndex($colIndex); + $column = '$' . $column; + } else { + $colIndex = ($colIndex <= 127) ? $colIndex : $colIndex - 256; + $column = PHPExcel_Cell::stringFromColumnIndex($baseCol + $colIndex); + } + + // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index) + if (!(0x8000 & self::getInt2d($cellAddressStructure, 2))) { + $row = '$' . $row; + } else { + $rowIndex = ($rowIndex <= 32767) ? $rowIndex : $rowIndex - 65536; + $row = $baseRow + $rowIndex; + } + + return $column . $row; + } + + + /** + * Reads a cell range address in BIFF5 e.g. 'A2:B6' or 'A1' + * always fixed range + * section 2.5.14 + * + * @param string $subData + * @return string + * @throws PHPExcel_Reader_Exception + */ + private function readBIFF5CellRangeAddressFixed($subData) + { + // offset: 0; size: 2; index to first row + $fr = self::getInt2d($subData, 0) + 1; + + // offset: 2; size: 2; index to last row + $lr = self::getInt2d($subData, 2) + 1; + + // offset: 4; size: 1; index to first column + $fc = ord($subData{4}); + + // offset: 5; size: 1; index to last column + $lc = ord($subData{5}); + + // check values + if ($fr > $lr || $fc > $lc) { + throw new PHPExcel_Reader_Exception('Not a cell range address'); + } + + // column index to letter + $fc = PHPExcel_Cell::stringFromColumnIndex($fc); + $lc = PHPExcel_Cell::stringFromColumnIndex($lc); + + if ($fr == $lr and $fc == $lc) { + return "$fc$fr"; + } + return "$fc$fr:$lc$lr"; + } + + + /** + * Reads a cell range address in BIFF8 e.g. 'A2:B6' or 'A1' + * always fixed range + * section 2.5.14 + * + * @param string $subData + * @return string + * @throws PHPExcel_Reader_Exception + */ + private function readBIFF8CellRangeAddressFixed($subData) + { + // offset: 0; size: 2; index to first row + $fr = self::getInt2d($subData, 0) + 1; + + // offset: 2; size: 2; index to last row + $lr = self::getInt2d($subData, 2) + 1; + + // offset: 4; size: 2; index to first column + $fc = self::getInt2d($subData, 4); + + // offset: 6; size: 2; index to last column + $lc = self::getInt2d($subData, 6); + + // check values + if ($fr > $lr || $fc > $lc) { + throw new PHPExcel_Reader_Exception('Not a cell range address'); + } + + // column index to letter + $fc = PHPExcel_Cell::stringFromColumnIndex($fc); + $lc = PHPExcel_Cell::stringFromColumnIndex($lc); + + if ($fr == $lr and $fc == $lc) { + return "$fc$fr"; + } + return "$fc$fr:$lc$lr"; + } + + + /** + * Reads a cell range address in BIFF8 e.g. 'A2:B6' or '$A$2:$B$6' + * there are flags indicating whether column/row index is relative + * section 3.3.4 + * + * @param string $subData + * @return string + */ + private function readBIFF8CellRangeAddress($subData) + { + // todo: if cell range is just a single cell, should this funciton + // not just return e.g. 'A1' and not 'A1:A1' ? + + // offset: 0; size: 2; index to first row (0... 65535) (or offset (-32768... 32767)) + $fr = self::getInt2d($subData, 0) + 1; + + // offset: 2; size: 2; index to last row (0... 65535) (or offset (-32768... 32767)) + $lr = self::getInt2d($subData, 2) + 1; + + // offset: 4; size: 2; index to first column or column offset + relative flags + + // bit: 7-0; mask 0x00FF; column index + $fc = PHPExcel_Cell::stringFromColumnIndex(0x00FF & self::getInt2d($subData, 4)); + + // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index) + if (!(0x4000 & self::getInt2d($subData, 4))) { + $fc = '$' . $fc; + } + + // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index) + if (!(0x8000 & self::getInt2d($subData, 4))) { + $fr = '$' . $fr; + } + + // offset: 6; size: 2; index to last column or column offset + relative flags + + // bit: 7-0; mask 0x00FF; column index + $lc = PHPExcel_Cell::stringFromColumnIndex(0x00FF & self::getInt2d($subData, 6)); + + // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index) + if (!(0x4000 & self::getInt2d($subData, 6))) { + $lc = '$' . $lc; + } + + // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index) + if (!(0x8000 & self::getInt2d($subData, 6))) { + $lr = '$' . $lr; + } + + return "$fc$fr:$lc$lr"; + } + + + /** + * Reads a cell range address in BIFF8 for shared formulas. Uses positive and negative values for row and column + * to indicate offsets from a base cell + * section 3.3.4 + * + * @param string $subData + * @param string $baseCell Base cell + * @return string Cell range address + */ + private function readBIFF8CellRangeAddressB($subData, $baseCell = 'A1') + { + list($baseCol, $baseRow) = PHPExcel_Cell::coordinateFromString($baseCell); + $baseCol = PHPExcel_Cell::columnIndexFromString($baseCol) - 1; + + // TODO: if cell range is just a single cell, should this funciton + // not just return e.g. 'A1' and not 'A1:A1' ? + + // offset: 0; size: 2; first row + $frIndex = self::getInt2d($subData, 0); // adjust below + + // offset: 2; size: 2; relative index to first row (0... 65535) should be treated as offset (-32768... 32767) + $lrIndex = self::getInt2d($subData, 2); // adjust below + + // offset: 4; size: 2; first column with relative/absolute flags + + // bit: 7-0; mask 0x00FF; column index + $fcIndex = 0x00FF & self::getInt2d($subData, 4); + + // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index) + if (!(0x4000 & self::getInt2d($subData, 4))) { + // absolute column index + $fc = PHPExcel_Cell::stringFromColumnIndex($fcIndex); + $fc = '$' . $fc; + } else { + // column offset + $fcIndex = ($fcIndex <= 127) ? $fcIndex : $fcIndex - 256; + $fc = PHPExcel_Cell::stringFromColumnIndex($baseCol + $fcIndex); + } + + // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index) + if (!(0x8000 & self::getInt2d($subData, 4))) { + // absolute row index + $fr = $frIndex + 1; + $fr = '$' . $fr; + } else { + // row offset + $frIndex = ($frIndex <= 32767) ? $frIndex : $frIndex - 65536; + $fr = $baseRow + $frIndex; + } + + // offset: 6; size: 2; last column with relative/absolute flags + + // bit: 7-0; mask 0x00FF; column index + $lcIndex = 0x00FF & self::getInt2d($subData, 6); + $lcIndex = ($lcIndex <= 127) ? $lcIndex : $lcIndex - 256; + $lc = PHPExcel_Cell::stringFromColumnIndex($baseCol + $lcIndex); + + // bit: 14; mask 0x4000; (1 = relative column index, 0 = absolute column index) + if (!(0x4000 & self::getInt2d($subData, 6))) { + // absolute column index + $lc = PHPExcel_Cell::stringFromColumnIndex($lcIndex); + $lc = '$' . $lc; + } else { + // column offset + $lcIndex = ($lcIndex <= 127) ? $lcIndex : $lcIndex - 256; + $lc = PHPExcel_Cell::stringFromColumnIndex($baseCol + $lcIndex); + } + + // bit: 15; mask 0x8000; (1 = relative row index, 0 = absolute row index) + if (!(0x8000 & self::getInt2d($subData, 6))) { + // absolute row index + $lr = $lrIndex + 1; + $lr = '$' . $lr; + } else { + // row offset + $lrIndex = ($lrIndex <= 32767) ? $lrIndex : $lrIndex - 65536; + $lr = $baseRow + $lrIndex; + } + + return "$fc$fr:$lc$lr"; + } + + + /** + * Read BIFF8 cell range address list + * section 2.5.15 + * + * @param string $subData + * @return array + */ + private function readBIFF8CellRangeAddressList($subData) + { + $cellRangeAddresses = array(); + + // offset: 0; size: 2; number of the following cell range addresses + $nm = self::getInt2d($subData, 0); + + $offset = 2; + // offset: 2; size: 8 * $nm; list of $nm (fixed) cell range addresses + for ($i = 0; $i < $nm; ++$i) { + $cellRangeAddresses[] = $this->readBIFF8CellRangeAddressFixed(substr($subData, $offset, 8)); + $offset += 8; + } + + return array( + 'size' => 2 + 8 * $nm, + 'cellRangeAddresses' => $cellRangeAddresses, + ); + } + + + /** + * Read BIFF5 cell range address list + * section 2.5.15 + * + * @param string $subData + * @return array + */ + private function readBIFF5CellRangeAddressList($subData) + { + $cellRangeAddresses = array(); + + // offset: 0; size: 2; number of the following cell range addresses + $nm = self::getInt2d($subData, 0); + + $offset = 2; + // offset: 2; size: 6 * $nm; list of $nm (fixed) cell range addresses + for ($i = 0; $i < $nm; ++$i) { + $cellRangeAddresses[] = $this->readBIFF5CellRangeAddressFixed(substr($subData, $offset, 6)); + $offset += 6; + } + + return array( + 'size' => 2 + 6 * $nm, + 'cellRangeAddresses' => $cellRangeAddresses, + ); + } + + + /** + * Get a sheet range like Sheet1:Sheet3 from REF index + * Note: If there is only one sheet in the range, one gets e.g Sheet1 + * It can also happen that the REF structure uses the -1 (FFFF) code to indicate deleted sheets, + * in which case an PHPExcel_Reader_Exception is thrown + * + * @param int $index + * @return string|false + * @throws PHPExcel_Reader_Exception + */ + private function readSheetRangeByRefIndex($index) + { + if (isset($this->ref[$index])) { + $type = $this->externalBooks[$this->ref[$index]['externalBookIndex']]['type']; + + switch ($type) { + case 'internal': + // check if we have a deleted 3d reference + if ($this->ref[$index]['firstSheetIndex'] == 0xFFFF or $this->ref[$index]['lastSheetIndex'] == 0xFFFF) { + throw new PHPExcel_Reader_Exception('Deleted sheet reference'); + } + + // we have normal sheet range (collapsed or uncollapsed) + $firstSheetName = $this->sheets[$this->ref[$index]['firstSheetIndex']]['name']; + $lastSheetName = $this->sheets[$this->ref[$index]['lastSheetIndex']]['name']; + + if ($firstSheetName == $lastSheetName) { + // collapsed sheet range + $sheetRange = $firstSheetName; + } else { + $sheetRange = "$firstSheetName:$lastSheetName"; + } + + // escape the single-quotes + $sheetRange = str_replace("'", "''", $sheetRange); + + // if there are special characters, we need to enclose the range in single-quotes + // todo: check if we have identified the whole set of special characters + // it seems that the following characters are not accepted for sheet names + // and we may assume that they are not present: []*/:\? + if (preg_match("/[ !\"@#£$%&{()}<>=+'|^,;-]/", $sheetRange)) { + $sheetRange = "'$sheetRange'"; + } + + return $sheetRange; + break; + default: + // TODO: external sheet support + throw new PHPExcel_Reader_Exception('Excel5 reader only supports internal sheets in fomulas'); + break; + } + } + return false; + } + + + /** + * read BIFF8 constant value array from array data + * returns e.g. array('value' => '{1,2;3,4}', 'size' => 40} + * section 2.5.8 + * + * @param string $arrayData + * @return array + */ + private static function readBIFF8ConstantArray($arrayData) + { + // offset: 0; size: 1; number of columns decreased by 1 + $nc = ord($arrayData[0]); + + // offset: 1; size: 2; number of rows decreased by 1 + $nr = self::getInt2d($arrayData, 1); + $size = 3; // initialize + $arrayData = substr($arrayData, 3); + + // offset: 3; size: var; list of ($nc + 1) * ($nr + 1) constant values + $matrixChunks = array(); + for ($r = 1; $r <= $nr + 1; ++$r) { + $items = array(); + for ($c = 1; $c <= $nc + 1; ++$c) { + $constant = self::readBIFF8Constant($arrayData); + $items[] = $constant['value']; + $arrayData = substr($arrayData, $constant['size']); + $size += $constant['size']; + } + $matrixChunks[] = implode(',', $items); // looks like e.g. '1,"hello"' + } + $matrix = '{' . implode(';', $matrixChunks) . '}'; + + return array( + 'value' => $matrix, + 'size' => $size, + ); + } + + + /** + * read BIFF8 constant value which may be 'Empty Value', 'Number', 'String Value', 'Boolean Value', 'Error Value' + * section 2.5.7 + * returns e.g. array('value' => '5', 'size' => 9) + * + * @param string $valueData + * @return array + */ + private static function readBIFF8Constant($valueData) + { + // offset: 0; size: 1; identifier for type of constant + $identifier = ord($valueData[0]); + + switch ($identifier) { + case 0x00: // empty constant (what is this?) + $value = ''; + $size = 9; + break; + case 0x01: // number + // offset: 1; size: 8; IEEE 754 floating-point value + $value = self::extractNumber(substr($valueData, 1, 8)); + $size = 9; + break; + case 0x02: // string value + // offset: 1; size: var; Unicode string, 16-bit string length + $string = self::readUnicodeStringLong(substr($valueData, 1)); + $value = '"' . $string['value'] . '"'; + $size = 1 + $string['size']; + break; + case 0x04: // boolean + // offset: 1; size: 1; 0 = FALSE, 1 = TRUE + if (ord($valueData[1])) { + $value = 'TRUE'; + } else { + $value = 'FALSE'; + } + $size = 9; + break; + case 0x10: // error code + // offset: 1; size: 1; error code + $value = PHPExcel_Reader_Excel5_ErrorCode::lookup(ord($valueData[1])); + $size = 9; + break; + } + return array( + 'value' => $value, + 'size' => $size, + ); + } + + + /** + * Extract RGB color + * OpenOffice.org's Documentation of the Microsoft Excel File Format, section 2.5.4 + * + * @param string $rgb Encoded RGB value (4 bytes) + * @return array + */ + private static function readRGB($rgb) + { + // offset: 0; size 1; Red component + $r = ord($rgb{0}); + + // offset: 1; size: 1; Green component + $g = ord($rgb{1}); + + // offset: 2; size: 1; Blue component + $b = ord($rgb{2}); + + // HEX notation, e.g. 'FF00FC' + $rgb = sprintf('%02X%02X%02X', $r, $g, $b); + + return array('rgb' => $rgb); + } + + + /** + * Read byte string (8-bit string length) + * OpenOffice documentation: 2.5.2 + * + * @param string $subData + * @return array + */ + private function readByteStringShort($subData) + { + // offset: 0; size: 1; length of the string (character count) + $ln = ord($subData[0]); + + // offset: 1: size: var; character array (8-bit characters) + $value = $this->decodeCodepage(substr($subData, 1, $ln)); + + return array( + 'value' => $value, + 'size' => 1 + $ln, // size in bytes of data structure + ); + } + + + /** + * Read byte string (16-bit string length) + * OpenOffice documentation: 2.5.2 + * + * @param string $subData + * @return array + */ + private function readByteStringLong($subData) + { + // offset: 0; size: 2; length of the string (character count) + $ln = self::getInt2d($subData, 0); + + // offset: 2: size: var; character array (8-bit characters) + $value = $this->decodeCodepage(substr($subData, 2)); + + //return $string; + return array( + 'value' => $value, + 'size' => 2 + $ln, // size in bytes of data structure + ); + } + + + /** + * Extracts an Excel Unicode short string (8-bit string length) + * OpenOffice documentation: 2.5.3 + * function will automatically find out where the Unicode string ends. + * + * @param string $subData + * @return array + */ + private static function readUnicodeStringShort($subData) + { + $value = ''; + + // offset: 0: size: 1; length of the string (character count) + $characterCount = ord($subData[0]); + + $string = self::readUnicodeString(substr($subData, 1), $characterCount); + + // add 1 for the string length + $string['size'] += 1; + + return $string; + } + + + /** + * Extracts an Excel Unicode long string (16-bit string length) + * OpenOffice documentation: 2.5.3 + * this function is under construction, needs to support rich text, and Asian phonetic settings + * + * @param string $subData + * @return array + */ + private static function readUnicodeStringLong($subData) + { + $value = ''; + + // offset: 0: size: 2; length of the string (character count) + $characterCount = self::getInt2d($subData, 0); + + $string = self::readUnicodeString(substr($subData, 2), $characterCount); + + // add 2 for the string length + $string['size'] += 2; + + return $string; + } + + + /** + * Read Unicode string with no string length field, but with known character count + * this function is under construction, needs to support rich text, and Asian phonetic settings + * OpenOffice.org's Documentation of the Microsoft Excel File Format, section 2.5.3 + * + * @param string $subData + * @param int $characterCount + * @return array + */ + private static function readUnicodeString($subData, $characterCount) + { + $value = ''; + + // offset: 0: size: 1; option flags + // bit: 0; mask: 0x01; character compression (0 = compressed 8-bit, 1 = uncompressed 16-bit) + $isCompressed = !((0x01 & ord($subData[0])) >> 0); + + // bit: 2; mask: 0x04; Asian phonetic settings + $hasAsian = (0x04) & ord($subData[0]) >> 2; + + // bit: 3; mask: 0x08; Rich-Text settings + $hasRichText = (0x08) & ord($subData[0]) >> 3; + + // offset: 1: size: var; character array + // this offset assumes richtext and Asian phonetic settings are off which is generally wrong + // needs to be fixed + $value = self::encodeUTF16(substr($subData, 1, $isCompressed ? $characterCount : 2 * $characterCount), $isCompressed); + + return array( + 'value' => $value, + 'size' => $isCompressed ? 1 + $characterCount : 1 + 2 * $characterCount, // the size in bytes including the option flags + ); + } + + + /** + * Convert UTF-8 string to string surounded by double quotes. Used for explicit string tokens in formulas. + * Example: hello"world --> "hello""world" + * + * @param string $value UTF-8 encoded string + * @return string + */ + private static function UTF8toExcelDoubleQuoted($value) + { + return '"' . str_replace('"', '""', $value) . '"'; + } + + + /** + * Reads first 8 bytes of a string and return IEEE 754 float + * + * @param string $data Binary string that is at least 8 bytes long + * @return float + */ + private static function extractNumber($data) + { + $rknumhigh = self::getInt4d($data, 4); + $rknumlow = self::getInt4d($data, 0); + $sign = ($rknumhigh & 0x80000000) >> 31; + $exp = (($rknumhigh & 0x7ff00000) >> 20) - 1023; + $mantissa = (0x100000 | ($rknumhigh & 0x000fffff)); + $mantissalow1 = ($rknumlow & 0x80000000) >> 31; + $mantissalow2 = ($rknumlow & 0x7fffffff); + $value = $mantissa / pow(2, (20 - $exp)); + + if ($mantissalow1 != 0) { + $value += 1 / pow(2, (21 - $exp)); + } + + $value += $mantissalow2 / pow(2, (52 - $exp)); + if ($sign) { + $value *= -1; + } + + return $value; + } + + + private static function getIEEE754($rknum) + { + if (($rknum & 0x02) != 0) { + $value = $rknum >> 2; + } else { + // changes by mmp, info on IEEE754 encoding from + // research.microsoft.com/~hollasch/cgindex/coding/ieeefloat.html + // The RK format calls for using only the most significant 30 bits + // of the 64 bit floating point value. The other 34 bits are assumed + // to be 0 so we use the upper 30 bits of $rknum as follows... + $sign = ($rknum & 0x80000000) >> 31; + $exp = ($rknum & 0x7ff00000) >> 20; + $mantissa = (0x100000 | ($rknum & 0x000ffffc)); + $value = $mantissa / pow(2, (20- ($exp - 1023))); + if ($sign) { + $value = -1 * $value; + } + //end of changes by mmp + } + if (($rknum & 0x01) != 0) { + $value /= 100; + } + return $value; + } + + + /** + * Get UTF-8 string from (compressed or uncompressed) UTF-16 string + * + * @param string $string + * @param bool $compressed + * @return string + */ + private static function encodeUTF16($string, $compressed = '') + { + if ($compressed) { + $string = self::uncompressByteString($string); + } + + return PHPExcel_Shared_String::ConvertEncoding($string, 'UTF-8', 'UTF-16LE'); + } + + /** + * Convert UTF-16 string in compressed notation to uncompressed form. Only used for BIFF8. + * + * @param string $string + * @return string + */ + private static function uncompressByteString($string) + { + $uncompressedString = ''; + $strLen = strlen($string); + for ($i = 0; $i < $strLen; ++$i) { + $uncompressedString .= $string[$i] . "\0"; + } + + return $uncompressedString; + } + + /** + * Convert string to UTF-8. Only used for BIFF5. + * + * @param string $string + * @return string + */ + private function decodeCodepage($string) + { + return PHPExcel_Shared_String::ConvertEncoding($string, 'UTF-8', $this->codepage); + } + + /** + * Read 16-bit unsigned integer + * + * @param string $data + * @param int $pos + * @return int + */ + public static function getInt2d($data, $pos) + { + return ord($data[$pos]) | (ord($data[$pos+1]) << 8); + } + + /** + * Read 32-bit signed integer + * + * @param string $data + * @param int $pos + * @return int + */ + public static function getInt4d($data, $pos) + { + // FIX: represent numbers correctly on 64-bit system + // http://sourceforge.net/tracker/index.php?func=detail&aid=1487372&group_id=99160&atid=623334 + // Hacked by Andreas Rehm 2006 to ensure correct result of the <<24 block on 32 and 64bit systems + $_or_24 = ord($data[$pos + 3]); + if ($_or_24 >= 128) { + // negative number + $_ord_24 = -abs((256 - $_or_24) << 24); + } else { + $_ord_24 = ($_or_24 & 127) << 24; + } + return ord($data[$pos]) | (ord($data[$pos+1]) << 8) | (ord($data[$pos+2]) << 16) | $_ord_24; + } + + private function parseRichText($is = '') + { + $value = new PHPExcel_RichText(); + $value->createText($is); + + return $value; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/Color.php b/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/Color.php new file mode 100644 index 0000000..1801df5 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/Color.php @@ -0,0 +1,32 @@ +<?php + +class PHPExcel_Reader_Excel5_Color +{ + /** + * Read color + * + * @param int $color Indexed color + * @param array $palette Color palette + * @return array RGB color value, example: array('rgb' => 'FF0000') + */ + public static function map($color, $palette, $version) + { + if ($color <= 0x07 || $color >= 0x40) { + // special built-in color + return PHPExcel_Reader_Excel5_Color_BuiltIn::lookup($color); + } elseif (isset($palette) && isset($palette[$color - 8])) { + // palette color, color index 0x08 maps to pallete index 0 + return $palette[$color - 8]; + } else { + // default color table + if ($version == PHPExcel_Reader_Excel5::XLS_BIFF8) { + return PHPExcel_Reader_Excel5_Color_BIFF8::lookup($color); + } else { + // BIFF5 + return PHPExcel_Reader_Excel5_Color_BIFF5::lookup($color); + } + } + + return $color; + } +} \ No newline at end of file diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/Color/BIFF5.php b/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/Color/BIFF5.php new file mode 100644 index 0000000..159c27f --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/Color/BIFF5.php @@ -0,0 +1,77 @@ +<?php + +class PHPExcel_Reader_Excel5_Color_BIFF5 +{ + protected static $map = array( + 0x08 => '000000', + 0x09 => 'FFFFFF', + 0x0A => 'FF0000', + 0x0B => '00FF00', + 0x0C => '0000FF', + 0x0D => 'FFFF00', + 0x0E => 'FF00FF', + 0x0F => '00FFFF', + 0x10 => '800000', + 0x11 => '008000', + 0x12 => '000080', + 0x13 => '808000', + 0x14 => '800080', + 0x15 => '008080', + 0x16 => 'C0C0C0', + 0x17 => '808080', + 0x18 => '8080FF', + 0x19 => '802060', + 0x1A => 'FFFFC0', + 0x1B => 'A0E0F0', + 0x1C => '600080', + 0x1D => 'FF8080', + 0x1E => '0080C0', + 0x1F => 'C0C0FF', + 0x20 => '000080', + 0x21 => 'FF00FF', + 0x22 => 'FFFF00', + 0x23 => '00FFFF', + 0x24 => '800080', + 0x25 => '800000', + 0x26 => '008080', + 0x27 => '0000FF', + 0x28 => '00CFFF', + 0x29 => '69FFFF', + 0x2A => 'E0FFE0', + 0x2B => 'FFFF80', + 0x2C => 'A6CAF0', + 0x2D => 'DD9CB3', + 0x2E => 'B38FEE', + 0x2F => 'E3E3E3', + 0x30 => '2A6FF9', + 0x31 => '3FB8CD', + 0x32 => '488436', + 0x33 => '958C41', + 0x34 => '8E5E42', + 0x35 => 'A0627A', + 0x36 => '624FAC', + 0x37 => '969696', + 0x38 => '1D2FBE', + 0x39 => '286676', + 0x3A => '004500', + 0x3B => '453E01', + 0x3C => '6A2813', + 0x3D => '85396A', + 0x3E => '4A3285', + 0x3F => '424242', + ); + + /** + * Map color array from BIFF5 built-in color index + * + * @param int $color + * @return array + */ + public static function lookup($color) + { + if (isset(self::$map[$color])) { + return array('rgb' => self::$map[$color]); + } + return array('rgb' => '000000'); + } +} \ No newline at end of file diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/Color/BIFF8.php b/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/Color/BIFF8.php new file mode 100644 index 0000000..4d3f2d0 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/Color/BIFF8.php @@ -0,0 +1,77 @@ +<?php + +class PHPExcel_Reader_Excel5_Color_BIFF8 +{ + protected static $map = array( + 0x08 => '000000', + 0x09 => 'FFFFFF', + 0x0A => 'FF0000', + 0x0B => '00FF00', + 0x0C => '0000FF', + 0x0D => 'FFFF00', + 0x0E => 'FF00FF', + 0x0F => '00FFFF', + 0x10 => '800000', + 0x11 => '008000', + 0x12 => '000080', + 0x13 => '808000', + 0x14 => '800080', + 0x15 => '008080', + 0x16 => 'C0C0C0', + 0x17 => '808080', + 0x18 => '9999FF', + 0x19 => '993366', + 0x1A => 'FFFFCC', + 0x1B => 'CCFFFF', + 0x1C => '660066', + 0x1D => 'FF8080', + 0x1E => '0066CC', + 0x1F => 'CCCCFF', + 0x20 => '000080', + 0x21 => 'FF00FF', + 0x22 => 'FFFF00', + 0x23 => '00FFFF', + 0x24 => '800080', + 0x25 => '800000', + 0x26 => '008080', + 0x27 => '0000FF', + 0x28 => '00CCFF', + 0x29 => 'CCFFFF', + 0x2A => 'CCFFCC', + 0x2B => 'FFFF99', + 0x2C => '99CCFF', + 0x2D => 'FF99CC', + 0x2E => 'CC99FF', + 0x2F => 'FFCC99', + 0x30 => '3366FF', + 0x31 => '33CCCC', + 0x32 => '99CC00', + 0x33 => 'FFCC00', + 0x34 => 'FF9900', + 0x35 => 'FF6600', + 0x36 => '666699', + 0x37 => '969696', + 0x38 => '003366', + 0x39 => '339966', + 0x3A => '003300', + 0x3B => '333300', + 0x3C => '993300', + 0x3D => '993366', + 0x3E => '333399', + 0x3F => '333333', + ); + + /** + * Map color array from BIFF8 built-in color index + * + * @param int $color + * @return array + */ + public static function lookup($color) + { + if (isset(self::$map[$color])) { + return array('rgb' => self::$map[$color]); + } + return array('rgb' => '000000'); + } +} \ No newline at end of file diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/Color/BuiltIn.php b/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/Color/BuiltIn.php new file mode 100644 index 0000000..a5b7e59 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/Color/BuiltIn.php @@ -0,0 +1,31 @@ +<?php + +class PHPExcel_Reader_Excel5_Color_BuiltIn +{ + protected static $map = array( + 0x00 => '000000', + 0x01 => 'FFFFFF', + 0x02 => 'FF0000', + 0x03 => '00FF00', + 0x04 => '0000FF', + 0x05 => 'FFFF00', + 0x06 => 'FF00FF', + 0x07 => '00FFFF', + 0x40 => '000000', // system window text color + 0x41 => 'FFFFFF', // system window background color + ); + + /** + * Map built-in color to RGB value + * + * @param int $color Indexed color + * @return array + */ + public static function lookup($color) + { + if (isset(self::$map[$color])) { + return array('rgb' => self::$map[$color]); + } + return array('rgb' => '000000'); + } +} \ No newline at end of file diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/ErrorCode.php b/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/ErrorCode.php new file mode 100644 index 0000000..f1d1cb6 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/ErrorCode.php @@ -0,0 +1,28 @@ +<?php + +class PHPExcel_Reader_Excel5_ErrorCode +{ + protected static $map = array( + 0x00 => '#NULL!', + 0x07 => '#DIV/0!', + 0x0F => '#VALUE!', + 0x17 => '#REF!', + 0x1D => '#NAME?', + 0x24 => '#NUM!', + 0x2A => '#N/A', + ); + + /** + * Map error code, e.g. '#N/A' + * + * @param int $code + * @return string + */ + public static function lookup($code) + { + if (isset(self::$map[$code])) { + return self::$map[$code]; + } + return false; + } +} \ No newline at end of file diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/Escher.php b/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/Escher.php new file mode 100644 index 0000000..2b99e22 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/Escher.php @@ -0,0 +1,669 @@ +<?php + +/** + * PHPExcel_Reader_Excel5_Escher + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Reader_Excel5 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Reader_Excel5_Escher +{ + const DGGCONTAINER = 0xF000; + const BSTORECONTAINER = 0xF001; + const DGCONTAINER = 0xF002; + const SPGRCONTAINER = 0xF003; + const SPCONTAINER = 0xF004; + const DGG = 0xF006; + const BSE = 0xF007; + const DG = 0xF008; + const SPGR = 0xF009; + const SP = 0xF00A; + const OPT = 0xF00B; + const CLIENTTEXTBOX = 0xF00D; + const CLIENTANCHOR = 0xF010; + const CLIENTDATA = 0xF011; + const BLIPJPEG = 0xF01D; + const BLIPPNG = 0xF01E; + const SPLITMENUCOLORS = 0xF11E; + const TERTIARYOPT = 0xF122; + + /** + * Escher stream data (binary) + * + * @var string + */ + private $data; + + /** + * Size in bytes of the Escher stream data + * + * @var int + */ + private $dataSize; + + /** + * Current position of stream pointer in Escher stream data + * + * @var int + */ + private $pos; + + /** + * The object to be returned by the reader. Modified during load. + * + * @var mixed + */ + private $object; + + /** + * Create a new PHPExcel_Reader_Excel5_Escher instance + * + * @param mixed $object + */ + public function __construct($object) + { + $this->object = $object; + } + + /** + * Load Escher stream data. May be a partial Escher stream. + * + * @param string $data + */ + public function load($data) + { + $this->data = $data; + + // total byte size of Excel data (workbook global substream + sheet substreams) + $this->dataSize = strlen($this->data); + + $this->pos = 0; + + // Parse Escher stream + while ($this->pos < $this->dataSize) { + // offset: 2; size: 2: Record Type + $fbt = PHPExcel_Reader_Excel5::getInt2d($this->data, $this->pos + 2); + + switch ($fbt) { + case self::DGGCONTAINER: + $this->readDggContainer(); + break; + case self::DGG: + $this->readDgg(); + break; + case self::BSTORECONTAINER: + $this->readBstoreContainer(); + break; + case self::BSE: + $this->readBSE(); + break; + case self::BLIPJPEG: + $this->readBlipJPEG(); + break; + case self::BLIPPNG: + $this->readBlipPNG(); + break; + case self::OPT: + $this->readOPT(); + break; + case self::TERTIARYOPT: + $this->readTertiaryOPT(); + break; + case self::SPLITMENUCOLORS: + $this->readSplitMenuColors(); + break; + case self::DGCONTAINER: + $this->readDgContainer(); + break; + case self::DG: + $this->readDg(); + break; + case self::SPGRCONTAINER: + $this->readSpgrContainer(); + break; + case self::SPCONTAINER: + $this->readSpContainer(); + break; + case self::SPGR: + $this->readSpgr(); + break; + case self::SP: + $this->readSp(); + break; + case self::CLIENTTEXTBOX: + $this->readClientTextbox(); + break; + case self::CLIENTANCHOR: + $this->readClientAnchor(); + break; + case self::CLIENTDATA: + $this->readClientData(); + break; + default: + $this->readDefault(); + break; + } + } + + return $this->object; + } + + /** + * Read a generic record + */ + private function readDefault() + { + // offset 0; size: 2; recVer and recInstance + $verInstance = PHPExcel_Reader_Excel5::getInt2d($this->data, $this->pos); + + // offset: 2; size: 2: Record Type + $fbt = PHPExcel_Reader_Excel5::getInt2d($this->data, $this->pos + 2); + + // bit: 0-3; mask: 0x000F; recVer + $recVer = (0x000F & $verInstance) >> 0; + + $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4); + $recordData = substr($this->data, $this->pos + 8, $length); + + // move stream pointer to next record + $this->pos += 8 + $length; + } + + /** + * Read DggContainer record (Drawing Group Container) + */ + private function readDggContainer() + { + $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4); + $recordData = substr($this->data, $this->pos + 8, $length); + + // move stream pointer to next record + $this->pos += 8 + $length; + + // record is a container, read contents + $dggContainer = new PHPExcel_Shared_Escher_DggContainer(); + $this->object->setDggContainer($dggContainer); + $reader = new PHPExcel_Reader_Excel5_Escher($dggContainer); + $reader->load($recordData); + } + + /** + * Read Dgg record (Drawing Group) + */ + private function readDgg() + { + $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4); + $recordData = substr($this->data, $this->pos + 8, $length); + + // move stream pointer to next record + $this->pos += 8 + $length; + } + + /** + * Read BstoreContainer record (Blip Store Container) + */ + private function readBstoreContainer() + { + $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4); + $recordData = substr($this->data, $this->pos + 8, $length); + + // move stream pointer to next record + $this->pos += 8 + $length; + + // record is a container, read contents + $bstoreContainer = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer(); + $this->object->setBstoreContainer($bstoreContainer); + $reader = new PHPExcel_Reader_Excel5_Escher($bstoreContainer); + $reader->load($recordData); + } + + /** + * Read BSE record + */ + private function readBSE() + { + // offset: 0; size: 2; recVer and recInstance + + // bit: 4-15; mask: 0xFFF0; recInstance + $recInstance = (0xFFF0 & PHPExcel_Reader_Excel5::getInt2d($this->data, $this->pos)) >> 4; + + $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4); + $recordData = substr($this->data, $this->pos + 8, $length); + + // move stream pointer to next record + $this->pos += 8 + $length; + + // add BSE to BstoreContainer + $BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE(); + $this->object->addBSE($BSE); + + $BSE->setBLIPType($recInstance); + + // offset: 0; size: 1; btWin32 (MSOBLIPTYPE) + $btWin32 = ord($recordData[0]); + + // offset: 1; size: 1; btWin32 (MSOBLIPTYPE) + $btMacOS = ord($recordData[1]); + + // offset: 2; size: 16; MD4 digest + $rgbUid = substr($recordData, 2, 16); + + // offset: 18; size: 2; tag + $tag = PHPExcel_Reader_Excel5::getInt2d($recordData, 18); + + // offset: 20; size: 4; size of BLIP in bytes + $size = PHPExcel_Reader_Excel5::getInt4d($recordData, 20); + + // offset: 24; size: 4; number of references to this BLIP + $cRef = PHPExcel_Reader_Excel5::getInt4d($recordData, 24); + + // offset: 28; size: 4; MSOFO file offset + $foDelay = PHPExcel_Reader_Excel5::getInt4d($recordData, 28); + + // offset: 32; size: 1; unused1 + $unused1 = ord($recordData{32}); + + // offset: 33; size: 1; size of nameData in bytes (including null terminator) + $cbName = ord($recordData{33}); + + // offset: 34; size: 1; unused2 + $unused2 = ord($recordData{34}); + + // offset: 35; size: 1; unused3 + $unused3 = ord($recordData{35}); + + // offset: 36; size: $cbName; nameData + $nameData = substr($recordData, 36, $cbName); + + // offset: 36 + $cbName, size: var; the BLIP data + $blipData = substr($recordData, 36 + $cbName); + + // record is a container, read contents + $reader = new PHPExcel_Reader_Excel5_Escher($BSE); + $reader->load($blipData); + } + + /** + * Read BlipJPEG record. Holds raw JPEG image data + */ + private function readBlipJPEG() + { + // offset: 0; size: 2; recVer and recInstance + + // bit: 4-15; mask: 0xFFF0; recInstance + $recInstance = (0xFFF0 & PHPExcel_Reader_Excel5::getInt2d($this->data, $this->pos)) >> 4; + + $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4); + $recordData = substr($this->data, $this->pos + 8, $length); + + // move stream pointer to next record + $this->pos += 8 + $length; + + $pos = 0; + + // offset: 0; size: 16; rgbUid1 (MD4 digest of) + $rgbUid1 = substr($recordData, 0, 16); + $pos += 16; + + // offset: 16; size: 16; rgbUid2 (MD4 digest), only if $recInstance = 0x46B or 0x6E3 + if (in_array($recInstance, array(0x046B, 0x06E3))) { + $rgbUid2 = substr($recordData, 16, 16); + $pos += 16; + } + + // offset: var; size: 1; tag + $tag = ord($recordData{$pos}); + $pos += 1; + + // offset: var; size: var; the raw image data + $data = substr($recordData, $pos); + + $blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip(); + $blip->setData($data); + + $this->object->setBlip($blip); + } + + /** + * Read BlipPNG record. Holds raw PNG image data + */ + private function readBlipPNG() + { + // offset: 0; size: 2; recVer and recInstance + + // bit: 4-15; mask: 0xFFF0; recInstance + $recInstance = (0xFFF0 & PHPExcel_Reader_Excel5::getInt2d($this->data, $this->pos)) >> 4; + + $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4); + $recordData = substr($this->data, $this->pos + 8, $length); + + // move stream pointer to next record + $this->pos += 8 + $length; + + $pos = 0; + + // offset: 0; size: 16; rgbUid1 (MD4 digest of) + $rgbUid1 = substr($recordData, 0, 16); + $pos += 16; + + // offset: 16; size: 16; rgbUid2 (MD4 digest), only if $recInstance = 0x46B or 0x6E3 + if ($recInstance == 0x06E1) { + $rgbUid2 = substr($recordData, 16, 16); + $pos += 16; + } + + // offset: var; size: 1; tag + $tag = ord($recordData{$pos}); + $pos += 1; + + // offset: var; size: var; the raw image data + $data = substr($recordData, $pos); + + $blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip(); + $blip->setData($data); + + $this->object->setBlip($blip); + } + + /** + * Read OPT record. This record may occur within DggContainer record or SpContainer + */ + private function readOPT() + { + // offset: 0; size: 2; recVer and recInstance + + // bit: 4-15; mask: 0xFFF0; recInstance + $recInstance = (0xFFF0 & PHPExcel_Reader_Excel5::getInt2d($this->data, $this->pos)) >> 4; + + $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4); + $recordData = substr($this->data, $this->pos + 8, $length); + + // move stream pointer to next record + $this->pos += 8 + $length; + + $this->readOfficeArtRGFOPTE($recordData, $recInstance); + } + + /** + * Read TertiaryOPT record + */ + private function readTertiaryOPT() + { + // offset: 0; size: 2; recVer and recInstance + + // bit: 4-15; mask: 0xFFF0; recInstance + $recInstance = (0xFFF0 & PHPExcel_Reader_Excel5::getInt2d($this->data, $this->pos)) >> 4; + + $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4); + $recordData = substr($this->data, $this->pos + 8, $length); + + // move stream pointer to next record + $this->pos += 8 + $length; + } + + /** + * Read SplitMenuColors record + */ + private function readSplitMenuColors() + { + $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4); + $recordData = substr($this->data, $this->pos + 8, $length); + + // move stream pointer to next record + $this->pos += 8 + $length; + } + + /** + * Read DgContainer record (Drawing Container) + */ + private function readDgContainer() + { + $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4); + $recordData = substr($this->data, $this->pos + 8, $length); + + // move stream pointer to next record + $this->pos += 8 + $length; + + // record is a container, read contents + $dgContainer = new PHPExcel_Shared_Escher_DgContainer(); + $this->object->setDgContainer($dgContainer); + $reader = new PHPExcel_Reader_Excel5_Escher($dgContainer); + $escher = $reader->load($recordData); + } + + /** + * Read Dg record (Drawing) + */ + private function readDg() + { + $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4); + $recordData = substr($this->data, $this->pos + 8, $length); + + // move stream pointer to next record + $this->pos += 8 + $length; + } + + /** + * Read SpgrContainer record (Shape Group Container) + */ + private function readSpgrContainer() + { + // context is either context DgContainer or SpgrContainer + + $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4); + $recordData = substr($this->data, $this->pos + 8, $length); + + // move stream pointer to next record + $this->pos += 8 + $length; + + // record is a container, read contents + $spgrContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer(); + + if ($this->object instanceof PHPExcel_Shared_Escher_DgContainer) { + // DgContainer + $this->object->setSpgrContainer($spgrContainer); + } else { + // SpgrContainer + $this->object->addChild($spgrContainer); + } + + $reader = new PHPExcel_Reader_Excel5_Escher($spgrContainer); + $escher = $reader->load($recordData); + } + + /** + * Read SpContainer record (Shape Container) + */ + private function readSpContainer() + { + $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4); + $recordData = substr($this->data, $this->pos + 8, $length); + + // add spContainer to spgrContainer + $spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer(); + $this->object->addChild($spContainer); + + // move stream pointer to next record + $this->pos += 8 + $length; + + // record is a container, read contents + $reader = new PHPExcel_Reader_Excel5_Escher($spContainer); + $escher = $reader->load($recordData); + } + + /** + * Read Spgr record (Shape Group) + */ + private function readSpgr() + { + $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4); + $recordData = substr($this->data, $this->pos + 8, $length); + + // move stream pointer to next record + $this->pos += 8 + $length; + } + + /** + * Read Sp record (Shape) + */ + private function readSp() + { + // offset: 0; size: 2; recVer and recInstance + + // bit: 4-15; mask: 0xFFF0; recInstance + $recInstance = (0xFFF0 & PHPExcel_Reader_Excel5::getInt2d($this->data, $this->pos)) >> 4; + + $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4); + $recordData = substr($this->data, $this->pos + 8, $length); + + // move stream pointer to next record + $this->pos += 8 + $length; + } + + /** + * Read ClientTextbox record + */ + private function readClientTextbox() + { + // offset: 0; size: 2; recVer and recInstance + + // bit: 4-15; mask: 0xFFF0; recInstance + $recInstance = (0xFFF0 & PHPExcel_Reader_Excel5::getInt2d($this->data, $this->pos)) >> 4; + + $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4); + $recordData = substr($this->data, $this->pos + 8, $length); + + // move stream pointer to next record + $this->pos += 8 + $length; + } + + /** + * Read ClientAnchor record. This record holds information about where the shape is anchored in worksheet + */ + private function readClientAnchor() + { + $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4); + $recordData = substr($this->data, $this->pos + 8, $length); + + // move stream pointer to next record + $this->pos += 8 + $length; + + // offset: 2; size: 2; upper-left corner column index (0-based) + $c1 = PHPExcel_Reader_Excel5::getInt2d($recordData, 2); + + // offset: 4; size: 2; upper-left corner horizontal offset in 1/1024 of column width + $startOffsetX = PHPExcel_Reader_Excel5::getInt2d($recordData, 4); + + // offset: 6; size: 2; upper-left corner row index (0-based) + $r1 = PHPExcel_Reader_Excel5::getInt2d($recordData, 6); + + // offset: 8; size: 2; upper-left corner vertical offset in 1/256 of row height + $startOffsetY = PHPExcel_Reader_Excel5::getInt2d($recordData, 8); + + // offset: 10; size: 2; bottom-right corner column index (0-based) + $c2 = PHPExcel_Reader_Excel5::getInt2d($recordData, 10); + + // offset: 12; size: 2; bottom-right corner horizontal offset in 1/1024 of column width + $endOffsetX = PHPExcel_Reader_Excel5::getInt2d($recordData, 12); + + // offset: 14; size: 2; bottom-right corner row index (0-based) + $r2 = PHPExcel_Reader_Excel5::getInt2d($recordData, 14); + + // offset: 16; size: 2; bottom-right corner vertical offset in 1/256 of row height + $endOffsetY = PHPExcel_Reader_Excel5::getInt2d($recordData, 16); + + // set the start coordinates + $this->object->setStartCoordinates(PHPExcel_Cell::stringFromColumnIndex($c1) . ($r1 + 1)); + + // set the start offsetX + $this->object->setStartOffsetX($startOffsetX); + + // set the start offsetY + $this->object->setStartOffsetY($startOffsetY); + + // set the end coordinates + $this->object->setEndCoordinates(PHPExcel_Cell::stringFromColumnIndex($c2) . ($r2 + 1)); + + // set the end offsetX + $this->object->setEndOffsetX($endOffsetX); + + // set the end offsetY + $this->object->setEndOffsetY($endOffsetY); + } + + /** + * Read ClientData record + */ + private function readClientData() + { + $length = PHPExcel_Reader_Excel5::getInt4d($this->data, $this->pos + 4); + $recordData = substr($this->data, $this->pos + 8, $length); + + // move stream pointer to next record + $this->pos += 8 + $length; + } + + /** + * Read OfficeArtRGFOPTE table of property-value pairs + * + * @param string $data Binary data + * @param int $n Number of properties + */ + private function readOfficeArtRGFOPTE($data, $n) + { + $splicedComplexData = substr($data, 6 * $n); + + // loop through property-value pairs + for ($i = 0; $i < $n; ++$i) { + // read 6 bytes at a time + $fopte = substr($data, 6 * $i, 6); + + // offset: 0; size: 2; opid + $opid = PHPExcel_Reader_Excel5::getInt2d($fopte, 0); + + // bit: 0-13; mask: 0x3FFF; opid.opid + $opidOpid = (0x3FFF & $opid) >> 0; + + // bit: 14; mask 0x4000; 1 = value in op field is BLIP identifier + $opidFBid = (0x4000 & $opid) >> 14; + + // bit: 15; mask 0x8000; 1 = this is a complex property, op field specifies size of complex data + $opidFComplex = (0x8000 & $opid) >> 15; + + // offset: 2; size: 4; the value for this property + $op = PHPExcel_Reader_Excel5::getInt4d($fopte, 2); + + if ($opidFComplex) { + $complexData = substr($splicedComplexData, 0, $op); + $splicedComplexData = substr($splicedComplexData, $op); + + // we store string value with complex data + $value = $complexData; + } else { + // we store integer value + $value = $op; + } + + $this->object->setOPT($opidOpid, $value); + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/MD5.php b/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/MD5.php new file mode 100644 index 0000000..f14ea94 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/MD5.php @@ -0,0 +1,203 @@ +<?php + +/** + * PHPExcel_Reader_Excel5_MD5 + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Reader_Excel5 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Reader_Excel5_MD5 +{ + // Context + private $a; + private $b; + private $c; + private $d; + + /** + * MD5 stream constructor + */ + public function __construct() + { + $this->reset(); + } + + /** + * Reset the MD5 stream context + */ + public function reset() + { + $this->a = 0x67452301; + $this->b = 0xEFCDAB89; + $this->c = 0x98BADCFE; + $this->d = 0x10325476; + } + + /** + * Get MD5 stream context + * + * @return string + */ + public function getContext() + { + $s = ''; + foreach (array('a', 'b', 'c', 'd') as $i) { + $v = $this->{$i}; + $s .= chr($v & 0xff); + $s .= chr(($v >> 8) & 0xff); + $s .= chr(($v >> 16) & 0xff); + $s .= chr(($v >> 24) & 0xff); + } + + return $s; + } + + /** + * Add data to context + * + * @param string $data Data to add + */ + public function add($data) + { + $words = array_values(unpack('V16', $data)); + + $A = $this->a; + $B = $this->b; + $C = $this->c; + $D = $this->d; + + $F = array('PHPExcel_Reader_Excel5_MD5','f'); + $G = array('PHPExcel_Reader_Excel5_MD5','g'); + $H = array('PHPExcel_Reader_Excel5_MD5','h'); + $I = array('PHPExcel_Reader_Excel5_MD5','i'); + + /* ROUND 1 */ + self::step($F, $A, $B, $C, $D, $words[0], 7, 0xd76aa478); + self::step($F, $D, $A, $B, $C, $words[1], 12, 0xe8c7b756); + self::step($F, $C, $D, $A, $B, $words[2], 17, 0x242070db); + self::step($F, $B, $C, $D, $A, $words[3], 22, 0xc1bdceee); + self::step($F, $A, $B, $C, $D, $words[4], 7, 0xf57c0faf); + self::step($F, $D, $A, $B, $C, $words[5], 12, 0x4787c62a); + self::step($F, $C, $D, $A, $B, $words[6], 17, 0xa8304613); + self::step($F, $B, $C, $D, $A, $words[7], 22, 0xfd469501); + self::step($F, $A, $B, $C, $D, $words[8], 7, 0x698098d8); + self::step($F, $D, $A, $B, $C, $words[9], 12, 0x8b44f7af); + self::step($F, $C, $D, $A, $B, $words[10], 17, 0xffff5bb1); + self::step($F, $B, $C, $D, $A, $words[11], 22, 0x895cd7be); + self::step($F, $A, $B, $C, $D, $words[12], 7, 0x6b901122); + self::step($F, $D, $A, $B, $C, $words[13], 12, 0xfd987193); + self::step($F, $C, $D, $A, $B, $words[14], 17, 0xa679438e); + self::step($F, $B, $C, $D, $A, $words[15], 22, 0x49b40821); + + /* ROUND 2 */ + self::step($G, $A, $B, $C, $D, $words[1], 5, 0xf61e2562); + self::step($G, $D, $A, $B, $C, $words[6], 9, 0xc040b340); + self::step($G, $C, $D, $A, $B, $words[11], 14, 0x265e5a51); + self::step($G, $B, $C, $D, $A, $words[0], 20, 0xe9b6c7aa); + self::step($G, $A, $B, $C, $D, $words[5], 5, 0xd62f105d); + self::step($G, $D, $A, $B, $C, $words[10], 9, 0x02441453); + self::step($G, $C, $D, $A, $B, $words[15], 14, 0xd8a1e681); + self::step($G, $B, $C, $D, $A, $words[4], 20, 0xe7d3fbc8); + self::step($G, $A, $B, $C, $D, $words[9], 5, 0x21e1cde6); + self::step($G, $D, $A, $B, $C, $words[14], 9, 0xc33707d6); + self::step($G, $C, $D, $A, $B, $words[3], 14, 0xf4d50d87); + self::step($G, $B, $C, $D, $A, $words[8], 20, 0x455a14ed); + self::step($G, $A, $B, $C, $D, $words[13], 5, 0xa9e3e905); + self::step($G, $D, $A, $B, $C, $words[2], 9, 0xfcefa3f8); + self::step($G, $C, $D, $A, $B, $words[7], 14, 0x676f02d9); + self::step($G, $B, $C, $D, $A, $words[12], 20, 0x8d2a4c8a); + + /* ROUND 3 */ + self::step($H, $A, $B, $C, $D, $words[5], 4, 0xfffa3942); + self::step($H, $D, $A, $B, $C, $words[8], 11, 0x8771f681); + self::step($H, $C, $D, $A, $B, $words[11], 16, 0x6d9d6122); + self::step($H, $B, $C, $D, $A, $words[14], 23, 0xfde5380c); + self::step($H, $A, $B, $C, $D, $words[1], 4, 0xa4beea44); + self::step($H, $D, $A, $B, $C, $words[4], 11, 0x4bdecfa9); + self::step($H, $C, $D, $A, $B, $words[7], 16, 0xf6bb4b60); + self::step($H, $B, $C, $D, $A, $words[10], 23, 0xbebfbc70); + self::step($H, $A, $B, $C, $D, $words[13], 4, 0x289b7ec6); + self::step($H, $D, $A, $B, $C, $words[0], 11, 0xeaa127fa); + self::step($H, $C, $D, $A, $B, $words[3], 16, 0xd4ef3085); + self::step($H, $B, $C, $D, $A, $words[6], 23, 0x04881d05); + self::step($H, $A, $B, $C, $D, $words[9], 4, 0xd9d4d039); + self::step($H, $D, $A, $B, $C, $words[12], 11, 0xe6db99e5); + self::step($H, $C, $D, $A, $B, $words[15], 16, 0x1fa27cf8); + self::step($H, $B, $C, $D, $A, $words[2], 23, 0xc4ac5665); + + /* ROUND 4 */ + self::step($I, $A, $B, $C, $D, $words[0], 6, 0xf4292244); + self::step($I, $D, $A, $B, $C, $words[7], 10, 0x432aff97); + self::step($I, $C, $D, $A, $B, $words[14], 15, 0xab9423a7); + self::step($I, $B, $C, $D, $A, $words[5], 21, 0xfc93a039); + self::step($I, $A, $B, $C, $D, $words[12], 6, 0x655b59c3); + self::step($I, $D, $A, $B, $C, $words[3], 10, 0x8f0ccc92); + self::step($I, $C, $D, $A, $B, $words[10], 15, 0xffeff47d); + self::step($I, $B, $C, $D, $A, $words[1], 21, 0x85845dd1); + self::step($I, $A, $B, $C, $D, $words[8], 6, 0x6fa87e4f); + self::step($I, $D, $A, $B, $C, $words[15], 10, 0xfe2ce6e0); + self::step($I, $C, $D, $A, $B, $words[6], 15, 0xa3014314); + self::step($I, $B, $C, $D, $A, $words[13], 21, 0x4e0811a1); + self::step($I, $A, $B, $C, $D, $words[4], 6, 0xf7537e82); + self::step($I, $D, $A, $B, $C, $words[11], 10, 0xbd3af235); + self::step($I, $C, $D, $A, $B, $words[2], 15, 0x2ad7d2bb); + self::step($I, $B, $C, $D, $A, $words[9], 21, 0xeb86d391); + + $this->a = ($this->a + $A) & 0xffffffff; + $this->b = ($this->b + $B) & 0xffffffff; + $this->c = ($this->c + $C) & 0xffffffff; + $this->d = ($this->d + $D) & 0xffffffff; + } + + private static function f($X, $Y, $Z) + { + return (($X & $Y) | ((~ $X) & $Z)); // X AND Y OR NOT X AND Z + } + + private static function g($X, $Y, $Z) + { + return (($X & $Z) | ($Y & (~ $Z))); // X AND Z OR Y AND NOT Z + } + + private static function h($X, $Y, $Z) + { + return ($X ^ $Y ^ $Z); // X XOR Y XOR Z + } + + private static function i($X, $Y, $Z) + { + return ($Y ^ ($X | (~ $Z))) ; // Y XOR (X OR NOT Z) + } + + private static function step($func, &$A, $B, $C, $D, $M, $s, $t) + { + $A = ($A + call_user_func($func, $B, $C, $D) + $M + $t) & 0xffffffff; + $A = self::rotate($A, $s); + $A = ($B + $A) & 0xffffffff; + } + + private static function rotate($decimal, $bits) + { + $binary = str_pad(decbin($decimal), 32, "0", STR_PAD_LEFT); + return bindec(substr($binary, $bits).substr($binary, 0, $bits)); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/RC4.php b/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/RC4.php new file mode 100644 index 0000000..5640539 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/RC4.php @@ -0,0 +1,81 @@ +<?php + +/** + * PHPExcel_Reader_Excel5_RC4 + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Reader_Excel5 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Reader_Excel5_RC4 +{ + // Context + protected $s = array(); + protected $i = 0; + protected $j = 0; + + /** + * RC4 stream decryption/encryption constrcutor + * + * @param string $key Encryption key/passphrase + */ + public function __construct($key) + { + $len = strlen($key); + + for ($this->i = 0; $this->i < 256; $this->i++) { + $this->s[$this->i] = $this->i; + } + + $this->j = 0; + for ($this->i = 0; $this->i < 256; $this->i++) { + $this->j = ($this->j + $this->s[$this->i] + ord($key[$this->i % $len])) % 256; + $t = $this->s[$this->i]; + $this->s[$this->i] = $this->s[$this->j]; + $this->s[$this->j] = $t; + } + $this->i = $this->j = 0; + } + + /** + * Symmetric decryption/encryption function + * + * @param string $data Data to encrypt/decrypt + * + * @return string + */ + public function RC4($data) + { + $len = strlen($data); + for ($c = 0; $c < $len; $c++) { + $this->i = ($this->i + 1) % 256; + $this->j = ($this->j + $this->s[$this->i]) % 256; + $t = $this->s[$this->i]; + $this->s[$this->i] = $this->s[$this->j]; + $this->s[$this->j] = $t; + + $t = ($this->s[$this->i] + $this->s[$this->j]) % 256; + + $data[$c] = chr(ord($data[$c]) ^ $this->s[$t]); + } + return $data; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/Style/Border.php b/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/Style/Border.php new file mode 100644 index 0000000..fb45b9d --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/Style/Border.php @@ -0,0 +1,36 @@ +<?php + +class PHPExcel_Reader_Excel5_Style_Border +{ + protected static $map = array( + 0x00 => PHPExcel_Style_Border::BORDER_NONE, + 0x01 => PHPExcel_Style_Border::BORDER_THIN, + 0x02 => PHPExcel_Style_Border::BORDER_MEDIUM, + 0x03 => PHPExcel_Style_Border::BORDER_DASHED, + 0x04 => PHPExcel_Style_Border::BORDER_DOTTED, + 0x05 => PHPExcel_Style_Border::BORDER_THICK, + 0x06 => PHPExcel_Style_Border::BORDER_DOUBLE, + 0x07 => PHPExcel_Style_Border::BORDER_HAIR, + 0x08 => PHPExcel_Style_Border::BORDER_MEDIUMDASHED, + 0x09 => PHPExcel_Style_Border::BORDER_DASHDOT, + 0x0A => PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT, + 0x0B => PHPExcel_Style_Border::BORDER_DASHDOTDOT, + 0x0C => PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT, + 0x0D => PHPExcel_Style_Border::BORDER_SLANTDASHDOT, + ); + + /** + * Map border style + * OpenOffice documentation: 2.5.11 + * + * @param int $index + * @return string + */ + public static function lookup($index) + { + if (isset(self::$map[$index])) { + return self::$map[$index]; + } + return PHPExcel_Style_Border::BORDER_NONE; + } +} \ No newline at end of file diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/Style/FillPattern.php b/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/Style/FillPattern.php new file mode 100644 index 0000000..c92d19a --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/Excel5/Style/FillPattern.php @@ -0,0 +1,41 @@ +<?php + +class PHPExcel_Reader_Excel5_Style_FillPattern +{ + protected static $map = array( + 0x00 => PHPExcel_Style_Fill::FILL_NONE, + 0x01 => PHPExcel_Style_Fill::FILL_SOLID, + 0x02 => PHPExcel_Style_Fill::FILL_PATTERN_MEDIUMGRAY, + 0x03 => PHPExcel_Style_Fill::FILL_PATTERN_DARKGRAY, + 0x04 => PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRAY, + 0x05 => PHPExcel_Style_Fill::FILL_PATTERN_DARKHORIZONTAL, + 0x06 => PHPExcel_Style_Fill::FILL_PATTERN_DARKVERTICAL, + 0x07 => PHPExcel_Style_Fill::FILL_PATTERN_DARKDOWN, + 0x08 => PHPExcel_Style_Fill::FILL_PATTERN_DARKUP, + 0x09 => PHPExcel_Style_Fill::FILL_PATTERN_DARKGRID, + 0x0A => PHPExcel_Style_Fill::FILL_PATTERN_DARKTRELLIS, + 0x0B => PHPExcel_Style_Fill::FILL_PATTERN_LIGHTHORIZONTAL, + 0x0C => PHPExcel_Style_Fill::FILL_PATTERN_LIGHTVERTICAL, + 0x0D => PHPExcel_Style_Fill::FILL_PATTERN_LIGHTDOWN, + 0x0E => PHPExcel_Style_Fill::FILL_PATTERN_LIGHTUP, + 0x0F => PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRID, + 0x10 => PHPExcel_Style_Fill::FILL_PATTERN_LIGHTTRELLIS, + 0x11 => PHPExcel_Style_Fill::FILL_PATTERN_GRAY125, + 0x12 => PHPExcel_Style_Fill::FILL_PATTERN_GRAY0625, + ); + + /** + * Get fill pattern from index + * OpenOffice documentation: 2.5.12 + * + * @param int $index + * @return string + */ + public static function lookup($index) + { + if (isset(self::$map[$index])) { + return self::$map[$index]; + } + return PHPExcel_Style_Fill::FILL_NONE; + } +} \ No newline at end of file diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/Exception.php b/application/third_party/PHPExcel/PHPExcel/Reader/Exception.php new file mode 100644 index 0000000..48b3f82 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/Exception.php @@ -0,0 +1,46 @@ +<?php + +/** + * PHPExcel_Reader_Exception + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Reader + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Reader_Exception extends PHPExcel_Exception +{ + /** + * Error handler callback + * + * @param mixed $code + * @param mixed $string + * @param mixed $file + * @param mixed $line + * @param mixed $context + */ + public static function errorHandlerCallback($code, $string, $file, $line, $context) + { + $e = new self($string, $code); + $e->line = $line; + $e->file = $file; + throw $e; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/Gnumeric.php b/application/third_party/PHPExcel/PHPExcel/Reader/Gnumeric.php new file mode 100644 index 0000000..913e52b --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/Gnumeric.php @@ -0,0 +1,850 @@ +<?php + +/** PHPExcel root directory */ +if (!defined('PHPEXCEL_ROOT')) { + /** + * @ignore + */ + define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../'); + require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php'); +} + +/** + * PHPExcel_Reader_Gnumeric + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Reader + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Reader_Gnumeric extends PHPExcel_Reader_Abstract implements PHPExcel_Reader_IReader +{ + /** + * Formats + * + * @var array + */ + private $styles = array(); + + /** + * Shared Expressions + * + * @var array + */ + private $expressions = array(); + + private $referenceHelper = null; + + /** + * Create a new PHPExcel_Reader_Gnumeric + */ + public function __construct() + { + $this->readFilter = new PHPExcel_Reader_DefaultReadFilter(); + $this->referenceHelper = PHPExcel_ReferenceHelper::getInstance(); + } + + /** + * Can the current PHPExcel_Reader_IReader read the file? + * + * @param string $pFilename + * @return boolean + * @throws PHPExcel_Reader_Exception + */ + public function canRead($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + // Check if gzlib functions are available + if (!function_exists('gzread')) { + throw new PHPExcel_Reader_Exception("gzlib library is not enabled"); + } + + // Read signature data (first 3 bytes) + $fh = fopen($pFilename, 'r'); + $data = fread($fh, 2); + fclose($fh); + + if ($data != chr(0x1F).chr(0x8B)) { + return false; + } + + return true; + } + + /** + * Reads names of the worksheets from a file, without parsing the whole file to a PHPExcel object + * + * @param string $pFilename + * @throws PHPExcel_Reader_Exception + */ + public function listWorksheetNames($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $xml = new XMLReader(); + $xml->xml($this->securityScanFile('compress.zlib://'.realpath($pFilename)), null, PHPExcel_Settings::getLibXmlLoaderOptions()); + $xml->setParserProperty(2, true); + + $worksheetNames = array(); + while ($xml->read()) { + if ($xml->name == 'gnm:SheetName' && $xml->nodeType == XMLReader::ELEMENT) { + $xml->read(); // Move onto the value node + $worksheetNames[] = (string) $xml->value; + } elseif ($xml->name == 'gnm:Sheets') { + // break out of the loop once we've got our sheet names rather than parse the entire file + break; + } + } + + return $worksheetNames; + } + + /** + * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns) + * + * @param string $pFilename + * @throws PHPExcel_Reader_Exception + */ + public function listWorksheetInfo($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $xml = new XMLReader(); + $xml->xml($this->securityScanFile('compress.zlib://'.realpath($pFilename)), null, PHPExcel_Settings::getLibXmlLoaderOptions()); + $xml->setParserProperty(2, true); + + $worksheetInfo = array(); + while ($xml->read()) { + if ($xml->name == 'gnm:Sheet' && $xml->nodeType == XMLReader::ELEMENT) { + $tmpInfo = array( + 'worksheetName' => '', + 'lastColumnLetter' => 'A', + 'lastColumnIndex' => 0, + 'totalRows' => 0, + 'totalColumns' => 0, + ); + + while ($xml->read()) { + if ($xml->name == 'gnm:Name' && $xml->nodeType == XMLReader::ELEMENT) { + $xml->read(); // Move onto the value node + $tmpInfo['worksheetName'] = (string) $xml->value; + } elseif ($xml->name == 'gnm:MaxCol' && $xml->nodeType == XMLReader::ELEMENT) { + $xml->read(); // Move onto the value node + $tmpInfo['lastColumnIndex'] = (int) $xml->value; + $tmpInfo['totalColumns'] = (int) $xml->value + 1; + } elseif ($xml->name == 'gnm:MaxRow' && $xml->nodeType == XMLReader::ELEMENT) { + $xml->read(); // Move onto the value node + $tmpInfo['totalRows'] = (int) $xml->value + 1; + break; + } + } + $tmpInfo['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($tmpInfo['lastColumnIndex']); + $worksheetInfo[] = $tmpInfo; + } + } + + return $worksheetInfo; + } + + private function gzfileGetContents($filename) + { + $file = @gzopen($filename, 'rb'); + if ($file !== false) { + $data = ''; + while (!gzeof($file)) { + $data .= gzread($file, 1024); + } + gzclose($file); + } + return $data; + } + + /** + * Loads PHPExcel from file + * + * @param string $pFilename + * @return PHPExcel + * @throws PHPExcel_Reader_Exception + */ + public function load($pFilename) + { + // Create new PHPExcel + $objPHPExcel = new PHPExcel(); + + // Load into this instance + return $this->loadIntoExisting($pFilename, $objPHPExcel); + } + + /** + * Loads PHPExcel from file into PHPExcel instance + * + * @param string $pFilename + * @param PHPExcel $objPHPExcel + * @return PHPExcel + * @throws PHPExcel_Reader_Exception + */ + public function loadIntoExisting($pFilename, PHPExcel $objPHPExcel) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $timezoneObj = new DateTimeZone('Europe/London'); + $GMT = new DateTimeZone('UTC'); + + $gFileData = $this->gzfileGetContents($pFilename); + +// echo '<pre>'; +// echo htmlentities($gFileData,ENT_QUOTES,'UTF-8'); +// echo '</pre><hr />'; +// + $xml = simplexml_load_string($this->securityScan($gFileData), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); + $namespacesMeta = $xml->getNamespaces(true); + +// var_dump($namespacesMeta); +// + $gnmXML = $xml->children($namespacesMeta['gnm']); + + $docProps = $objPHPExcel->getProperties(); + // Document Properties are held differently, depending on the version of Gnumeric + if (isset($namespacesMeta['office'])) { + $officeXML = $xml->children($namespacesMeta['office']); + $officeDocXML = $officeXML->{'document-meta'}; + $officeDocMetaXML = $officeDocXML->meta; + + foreach ($officeDocMetaXML as $officePropertyData) { + $officePropertyDC = array(); + if (isset($namespacesMeta['dc'])) { + $officePropertyDC = $officePropertyData->children($namespacesMeta['dc']); + } + foreach ($officePropertyDC as $propertyName => $propertyValue) { + $propertyValue = (string) $propertyValue; + switch ($propertyName) { + case 'title': + $docProps->setTitle(trim($propertyValue)); + break; + case 'subject': + $docProps->setSubject(trim($propertyValue)); + break; + case 'creator': + $docProps->setCreator(trim($propertyValue)); + $docProps->setLastModifiedBy(trim($propertyValue)); + break; + case 'date': + $creationDate = strtotime(trim($propertyValue)); + $docProps->setCreated($creationDate); + $docProps->setModified($creationDate); + break; + case 'description': + $docProps->setDescription(trim($propertyValue)); + break; + } + } + $officePropertyMeta = array(); + if (isset($namespacesMeta['meta'])) { + $officePropertyMeta = $officePropertyData->children($namespacesMeta['meta']); + } + foreach ($officePropertyMeta as $propertyName => $propertyValue) { + $attributes = $propertyValue->attributes($namespacesMeta['meta']); + $propertyValue = (string) $propertyValue; + switch ($propertyName) { + case 'keyword': + $docProps->setKeywords(trim($propertyValue)); + break; + case 'initial-creator': + $docProps->setCreator(trim($propertyValue)); + $docProps->setLastModifiedBy(trim($propertyValue)); + break; + case 'creation-date': + $creationDate = strtotime(trim($propertyValue)); + $docProps->setCreated($creationDate); + $docProps->setModified($creationDate); + break; + case 'user-defined': + list(, $attrName) = explode(':', $attributes['name']); + switch ($attrName) { + case 'publisher': + $docProps->setCompany(trim($propertyValue)); + break; + case 'category': + $docProps->setCategory(trim($propertyValue)); + break; + case 'manager': + $docProps->setManager(trim($propertyValue)); + break; + } + break; + } + } + } + } elseif (isset($gnmXML->Summary)) { + foreach ($gnmXML->Summary->Item as $summaryItem) { + $propertyName = $summaryItem->name; + $propertyValue = $summaryItem->{'val-string'}; + switch ($propertyName) { + case 'title': + $docProps->setTitle(trim($propertyValue)); + break; + case 'comments': + $docProps->setDescription(trim($propertyValue)); + break; + case 'keywords': + $docProps->setKeywords(trim($propertyValue)); + break; + case 'category': + $docProps->setCategory(trim($propertyValue)); + break; + case 'manager': + $docProps->setManager(trim($propertyValue)); + break; + case 'author': + $docProps->setCreator(trim($propertyValue)); + $docProps->setLastModifiedBy(trim($propertyValue)); + break; + case 'company': + $docProps->setCompany(trim($propertyValue)); + break; + } + } + } + + $worksheetID = 0; + foreach ($gnmXML->Sheets->Sheet as $sheet) { + $worksheetName = (string) $sheet->Name; +// echo '<b>Worksheet: ', $worksheetName,'</b><br />'; + if ((isset($this->loadSheetsOnly)) && (!in_array($worksheetName, $this->loadSheetsOnly))) { + continue; + } + + $maxRow = $maxCol = 0; + + // Create new Worksheet + $objPHPExcel->createSheet(); + $objPHPExcel->setActiveSheetIndex($worksheetID); + // Use false for $updateFormulaCellReferences to prevent adjustment of worksheet references in formula + // cells... during the load, all formulae should be correct, and we're simply bringing the worksheet + // name in line with the formula, not the reverse + $objPHPExcel->getActiveSheet()->setTitle($worksheetName, false); + + if ((!$this->readDataOnly) && (isset($sheet->PrintInformation))) { + if (isset($sheet->PrintInformation->Margins)) { + foreach ($sheet->PrintInformation->Margins->children('gnm', true) as $key => $margin) { + $marginAttributes = $margin->attributes(); + $marginSize = 72 / 100; // Default + switch ($marginAttributes['PrefUnit']) { + case 'mm': + $marginSize = intval($marginAttributes['Points']) / 100; + break; + } + switch ($key) { + case 'top': + $objPHPExcel->getActiveSheet()->getPageMargins()->setTop($marginSize); + break; + case 'bottom': + $objPHPExcel->getActiveSheet()->getPageMargins()->setBottom($marginSize); + break; + case 'left': + $objPHPExcel->getActiveSheet()->getPageMargins()->setLeft($marginSize); + break; + case 'right': + $objPHPExcel->getActiveSheet()->getPageMargins()->setRight($marginSize); + break; + case 'header': + $objPHPExcel->getActiveSheet()->getPageMargins()->setHeader($marginSize); + break; + case 'footer': + $objPHPExcel->getActiveSheet()->getPageMargins()->setFooter($marginSize); + break; + } + } + } + } + + foreach ($sheet->Cells->Cell as $cell) { + $cellAttributes = $cell->attributes(); + $row = (int) $cellAttributes->Row + 1; + $column = (int) $cellAttributes->Col; + + if ($row > $maxRow) { + $maxRow = $row; + } + if ($column > $maxCol) { + $maxCol = $column; + } + + $column = PHPExcel_Cell::stringFromColumnIndex($column); + + // Read cell? + if ($this->getReadFilter() !== null) { + if (!$this->getReadFilter()->readCell($column, $row, $worksheetName)) { + continue; + } + } + + $ValueType = $cellAttributes->ValueType; + $ExprID = (string) $cellAttributes->ExprID; +// echo 'Cell ', $column, $row,'<br />'; +// echo 'Type is ', $ValueType,'<br />'; +// echo 'Value is ', $cell,'<br />'; + $type = PHPExcel_Cell_DataType::TYPE_FORMULA; + if ($ExprID > '') { + if (((string) $cell) > '') { + $this->expressions[$ExprID] = array( + 'column' => $cellAttributes->Col, + 'row' => $cellAttributes->Row, + 'formula' => (string) $cell + ); +// echo 'NEW EXPRESSION ', $ExprID,'<br />'; + } else { + $expression = $this->expressions[$ExprID]; + + $cell = $this->referenceHelper->updateFormulaReferences( + $expression['formula'], + 'A1', + $cellAttributes->Col - $expression['column'], + $cellAttributes->Row - $expression['row'], + $worksheetName + ); +// echo 'SHARED EXPRESSION ', $ExprID,'<br />'; +// echo 'New Value is ', $cell,'<br />'; + } + $type = PHPExcel_Cell_DataType::TYPE_FORMULA; + } else { + switch ($ValueType) { + case '10': // NULL + $type = PHPExcel_Cell_DataType::TYPE_NULL; + break; + case '20': // Boolean + $type = PHPExcel_Cell_DataType::TYPE_BOOL; + $cell = ($cell == 'TRUE') ? true: false; + break; + case '30': // Integer + $cell = intval($cell); + // Excel 2007+ doesn't differentiate between integer and float, so set the value and dropthru to the next (numeric) case + case '40': // Float + $type = PHPExcel_Cell_DataType::TYPE_NUMERIC; + break; + case '50': // Error + $type = PHPExcel_Cell_DataType::TYPE_ERROR; + break; + case '60': // String + $type = PHPExcel_Cell_DataType::TYPE_STRING; + break; + case '70': // Cell Range + case '80': // Array + } + } + $objPHPExcel->getActiveSheet()->getCell($column.$row)->setValueExplicit($cell, $type); + } + + if ((!$this->readDataOnly) && (isset($sheet->Objects))) { + foreach ($sheet->Objects->children('gnm', true) as $key => $comment) { + $commentAttributes = $comment->attributes(); + // Only comment objects are handled at the moment + if ($commentAttributes->Text) { + $objPHPExcel->getActiveSheet()->getComment((string)$commentAttributes->ObjectBound)->setAuthor((string)$commentAttributes->Author)->setText($this->parseRichText((string)$commentAttributes->Text)); + } + } + } +// echo '$maxCol=', $maxCol,'; $maxRow=', $maxRow,'<br />'; +// + foreach ($sheet->Styles->StyleRegion as $styleRegion) { + $styleAttributes = $styleRegion->attributes(); + if (($styleAttributes['startRow'] <= $maxRow) && + ($styleAttributes['startCol'] <= $maxCol)) { + $startColumn = PHPExcel_Cell::stringFromColumnIndex((int) $styleAttributes['startCol']); + $startRow = $styleAttributes['startRow'] + 1; + + $endColumn = ($styleAttributes['endCol'] > $maxCol) ? $maxCol : (int) $styleAttributes['endCol']; + $endColumn = PHPExcel_Cell::stringFromColumnIndex($endColumn); + $endRow = ($styleAttributes['endRow'] > $maxRow) ? $maxRow : $styleAttributes['endRow']; + $endRow += 1; + $cellRange = $startColumn.$startRow.':'.$endColumn.$endRow; +// echo $cellRange,'<br />'; + + $styleAttributes = $styleRegion->Style->attributes(); +// var_dump($styleAttributes); +// echo '<br />'; + + // We still set the number format mask for date/time values, even if readDataOnly is true + if ((!$this->readDataOnly) || + (PHPExcel_Shared_Date::isDateTimeFormatCode((string) $styleAttributes['Format']))) { + $styleArray = array(); + $styleArray['numberformat']['code'] = (string) $styleAttributes['Format']; + // If readDataOnly is false, we set all formatting information + if (!$this->readDataOnly) { + switch ($styleAttributes['HAlign']) { + case '1': + $styleArray['alignment']['horizontal'] = PHPExcel_Style_Alignment::HORIZONTAL_GENERAL; + break; + case '2': + $styleArray['alignment']['horizontal'] = PHPExcel_Style_Alignment::HORIZONTAL_LEFT; + break; + case '4': + $styleArray['alignment']['horizontal'] = PHPExcel_Style_Alignment::HORIZONTAL_RIGHT; + break; + case '8': + $styleArray['alignment']['horizontal'] = PHPExcel_Style_Alignment::HORIZONTAL_CENTER; + break; + case '16': + case '64': + $styleArray['alignment']['horizontal'] = PHPExcel_Style_Alignment::HORIZONTAL_CENTER_CONTINUOUS; + break; + case '32': + $styleArray['alignment']['horizontal'] = PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY; + break; + } + + switch ($styleAttributes['VAlign']) { + case '1': + $styleArray['alignment']['vertical'] = PHPExcel_Style_Alignment::VERTICAL_TOP; + break; + case '2': + $styleArray['alignment']['vertical'] = PHPExcel_Style_Alignment::VERTICAL_BOTTOM; + break; + case '4': + $styleArray['alignment']['vertical'] = PHPExcel_Style_Alignment::VERTICAL_CENTER; + break; + case '8': + $styleArray['alignment']['vertical'] = PHPExcel_Style_Alignment::VERTICAL_JUSTIFY; + break; + } + + $styleArray['alignment']['wrap'] = ($styleAttributes['WrapText'] == '1') ? true : false; + $styleArray['alignment']['shrinkToFit'] = ($styleAttributes['ShrinkToFit'] == '1') ? true : false; + $styleArray['alignment']['indent'] = (intval($styleAttributes["Indent"]) > 0) ? $styleAttributes["indent"] : 0; + + $RGB = self::parseGnumericColour($styleAttributes["Fore"]); + $styleArray['font']['color']['rgb'] = $RGB; + $RGB = self::parseGnumericColour($styleAttributes["Back"]); + $shade = $styleAttributes["Shade"]; + if (($RGB != '000000') || ($shade != '0')) { + $styleArray['fill']['color']['rgb'] = $styleArray['fill']['startcolor']['rgb'] = $RGB; + $RGB2 = self::parseGnumericColour($styleAttributes["PatternColor"]); + $styleArray['fill']['endcolor']['rgb'] = $RGB2; + switch ($shade) { + case '1': + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_SOLID; + break; + case '2': + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR; + break; + case '3': + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_GRADIENT_PATH; + break; + case '4': + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_DARKDOWN; + break; + case '5': + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_DARKGRAY; + break; + case '6': + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_DARKGRID; + break; + case '7': + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_DARKHORIZONTAL; + break; + case '8': + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_DARKTRELLIS; + break; + case '9': + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_DARKUP; + break; + case '10': + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_DARKVERTICAL; + break; + case '11': + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_GRAY0625; + break; + case '12': + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_GRAY125; + break; + case '13': + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_LIGHTDOWN; + break; + case '14': + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRAY; + break; + case '15': + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRID; + break; + case '16': + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_LIGHTHORIZONTAL; + break; + case '17': + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_LIGHTTRELLIS; + break; + case '18': + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_LIGHTUP; + break; + case '19': + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_LIGHTVERTICAL; + break; + case '20': + $styleArray['fill']['type'] = PHPExcel_Style_Fill::FILL_PATTERN_MEDIUMGRAY; + break; + } + } + + $fontAttributes = $styleRegion->Style->Font->attributes(); +// var_dump($fontAttributes); +// echo '<br />'; + $styleArray['font']['name'] = (string) $styleRegion->Style->Font; + $styleArray['font']['size'] = intval($fontAttributes['Unit']); + $styleArray['font']['bold'] = ($fontAttributes['Bold'] == '1') ? true : false; + $styleArray['font']['italic'] = ($fontAttributes['Italic'] == '1') ? true : false; + $styleArray['font']['strike'] = ($fontAttributes['StrikeThrough'] == '1') ? true : false; + switch ($fontAttributes['Underline']) { + case '1': + $styleArray['font']['underline'] = PHPExcel_Style_Font::UNDERLINE_SINGLE; + break; + case '2': + $styleArray['font']['underline'] = PHPExcel_Style_Font::UNDERLINE_DOUBLE; + break; + case '3': + $styleArray['font']['underline'] = PHPExcel_Style_Font::UNDERLINE_SINGLEACCOUNTING; + break; + case '4': + $styleArray['font']['underline'] = PHPExcel_Style_Font::UNDERLINE_DOUBLEACCOUNTING; + break; + default: + $styleArray['font']['underline'] = PHPExcel_Style_Font::UNDERLINE_NONE; + break; + } + switch ($fontAttributes['Script']) { + case '1': + $styleArray['font']['superScript'] = true; + break; + case '-1': + $styleArray['font']['subScript'] = true; + break; + } + + if (isset($styleRegion->Style->StyleBorder)) { + if (isset($styleRegion->Style->StyleBorder->Top)) { + $styleArray['borders']['top'] = self::parseBorderAttributes($styleRegion->Style->StyleBorder->Top->attributes()); + } + if (isset($styleRegion->Style->StyleBorder->Bottom)) { + $styleArray['borders']['bottom'] = self::parseBorderAttributes($styleRegion->Style->StyleBorder->Bottom->attributes()); + } + if (isset($styleRegion->Style->StyleBorder->Left)) { + $styleArray['borders']['left'] = self::parseBorderAttributes($styleRegion->Style->StyleBorder->Left->attributes()); + } + if (isset($styleRegion->Style->StyleBorder->Right)) { + $styleArray['borders']['right'] = self::parseBorderAttributes($styleRegion->Style->StyleBorder->Right->attributes()); + } + if ((isset($styleRegion->Style->StyleBorder->Diagonal)) && (isset($styleRegion->Style->StyleBorder->{'Rev-Diagonal'}))) { + $styleArray['borders']['diagonal'] = self::parseBorderAttributes($styleRegion->Style->StyleBorder->Diagonal->attributes()); + $styleArray['borders']['diagonaldirection'] = PHPExcel_Style_Borders::DIAGONAL_BOTH; + } elseif (isset($styleRegion->Style->StyleBorder->Diagonal)) { + $styleArray['borders']['diagonal'] = self::parseBorderAttributes($styleRegion->Style->StyleBorder->Diagonal->attributes()); + $styleArray['borders']['diagonaldirection'] = PHPExcel_Style_Borders::DIAGONAL_UP; + } elseif (isset($styleRegion->Style->StyleBorder->{'Rev-Diagonal'})) { + $styleArray['borders']['diagonal'] = self::parseBorderAttributes($styleRegion->Style->StyleBorder->{'Rev-Diagonal'}->attributes()); + $styleArray['borders']['diagonaldirection'] = PHPExcel_Style_Borders::DIAGONAL_DOWN; + } + } + if (isset($styleRegion->Style->HyperLink)) { + // TO DO + $hyperlink = $styleRegion->Style->HyperLink->attributes(); + } + } +// var_dump($styleArray); +// echo '<br />'; + $objPHPExcel->getActiveSheet()->getStyle($cellRange)->applyFromArray($styleArray); + } + } + } + + if ((!$this->readDataOnly) && (isset($sheet->Cols))) { + // Column Widths + $columnAttributes = $sheet->Cols->attributes(); + $defaultWidth = $columnAttributes['DefaultSizePts'] / 5.4; + $c = 0; + foreach ($sheet->Cols->ColInfo as $columnOverride) { + $columnAttributes = $columnOverride->attributes(); + $column = $columnAttributes['No']; + $columnWidth = $columnAttributes['Unit'] / 5.4; + $hidden = ((isset($columnAttributes['Hidden'])) && ($columnAttributes['Hidden'] == '1')) ? true : false; + $columnCount = (isset($columnAttributes['Count'])) ? $columnAttributes['Count'] : 1; + while ($c < $column) { + $objPHPExcel->getActiveSheet()->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($c))->setWidth($defaultWidth); + ++$c; + } + while (($c < ($column+$columnCount)) && ($c <= $maxCol)) { + $objPHPExcel->getActiveSheet()->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($c))->setWidth($columnWidth); + if ($hidden) { + $objPHPExcel->getActiveSheet()->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($c))->setVisible(false); + } + ++$c; + } + } + while ($c <= $maxCol) { + $objPHPExcel->getActiveSheet()->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($c))->setWidth($defaultWidth); + ++$c; + } + } + + if ((!$this->readDataOnly) && (isset($sheet->Rows))) { + // Row Heights + $rowAttributes = $sheet->Rows->attributes(); + $defaultHeight = $rowAttributes['DefaultSizePts']; + $r = 0; + + foreach ($sheet->Rows->RowInfo as $rowOverride) { + $rowAttributes = $rowOverride->attributes(); + $row = $rowAttributes['No']; + $rowHeight = $rowAttributes['Unit']; + $hidden = ((isset($rowAttributes['Hidden'])) && ($rowAttributes['Hidden'] == '1')) ? true : false; + $rowCount = (isset($rowAttributes['Count'])) ? $rowAttributes['Count'] : 1; + while ($r < $row) { + ++$r; + $objPHPExcel->getActiveSheet()->getRowDimension($r)->setRowHeight($defaultHeight); + } + while (($r < ($row+$rowCount)) && ($r < $maxRow)) { + ++$r; + $objPHPExcel->getActiveSheet()->getRowDimension($r)->setRowHeight($rowHeight); + if ($hidden) { + $objPHPExcel->getActiveSheet()->getRowDimension($r)->setVisible(false); + } + } + } + while ($r < $maxRow) { + ++$r; + $objPHPExcel->getActiveSheet()->getRowDimension($r)->setRowHeight($defaultHeight); + } + } + + // Handle Merged Cells in this worksheet + if (isset($sheet->MergedRegions)) { + foreach ($sheet->MergedRegions->Merge as $mergeCells) { + if (strpos($mergeCells, ':') !== false) { + $objPHPExcel->getActiveSheet()->mergeCells($mergeCells); + } + } + } + + $worksheetID++; + } + + // Loop through definedNames (global named ranges) + if (isset($gnmXML->Names)) { + foreach ($gnmXML->Names->Name as $namedRange) { + $name = (string) $namedRange->name; + $range = (string) $namedRange->value; + if (stripos($range, '#REF!') !== false) { + continue; + } + + $range = explode('!', $range); + $range[0] = trim($range[0], "'"); + if ($worksheet = $objPHPExcel->getSheetByName($range[0])) { + $extractedRange = str_replace('$', '', $range[1]); + $objPHPExcel->addNamedRange(new PHPExcel_NamedRange($name, $worksheet, $extractedRange)); + } + } + } + + // Return + return $objPHPExcel; + } + + private static function parseBorderAttributes($borderAttributes) + { + $styleArray = array(); + if (isset($borderAttributes["Color"])) { + $styleArray['color']['rgb'] = self::parseGnumericColour($borderAttributes["Color"]); + } + + switch ($borderAttributes["Style"]) { + case '0': + $styleArray['style'] = PHPExcel_Style_Border::BORDER_NONE; + break; + case '1': + $styleArray['style'] = PHPExcel_Style_Border::BORDER_THIN; + break; + case '2': + $styleArray['style'] = PHPExcel_Style_Border::BORDER_MEDIUM; + break; + case '3': + $styleArray['style'] = PHPExcel_Style_Border::BORDER_SLANTDASHDOT; + break; + case '4': + $styleArray['style'] = PHPExcel_Style_Border::BORDER_DASHED; + break; + case '5': + $styleArray['style'] = PHPExcel_Style_Border::BORDER_THICK; + break; + case '6': + $styleArray['style'] = PHPExcel_Style_Border::BORDER_DOUBLE; + break; + case '7': + $styleArray['style'] = PHPExcel_Style_Border::BORDER_DOTTED; + break; + case '8': + $styleArray['style'] = PHPExcel_Style_Border::BORDER_MEDIUMDASHED; + break; + case '9': + $styleArray['style'] = PHPExcel_Style_Border::BORDER_DASHDOT; + break; + case '10': + $styleArray['style'] = PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT; + break; + case '11': + $styleArray['style'] = PHPExcel_Style_Border::BORDER_DASHDOTDOT; + break; + case '12': + $styleArray['style'] = PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT; + break; + case '13': + $styleArray['style'] = PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT; + break; + } + return $styleArray; + } + + private function parseRichText($is = '') + { + $value = new PHPExcel_RichText(); + $value->createText($is); + + return $value; + } + + private static function parseGnumericColour($gnmColour) + { + list($gnmR, $gnmG, $gnmB) = explode(':', $gnmColour); + $gnmR = substr(str_pad($gnmR, 4, '0', STR_PAD_RIGHT), 0, 2); + $gnmG = substr(str_pad($gnmG, 4, '0', STR_PAD_RIGHT), 0, 2); + $gnmB = substr(str_pad($gnmB, 4, '0', STR_PAD_RIGHT), 0, 2); + return $gnmR . $gnmG . $gnmB; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/HTML.php b/application/third_party/PHPExcel/PHPExcel/Reader/HTML.php new file mode 100644 index 0000000..ac762a4 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/HTML.php @@ -0,0 +1,549 @@ +<?php + +if (!defined('PHPEXCEL_ROOT')) { + /** + * @ignore + */ + define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../'); + require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php'); +} + +/** + * PHPExcel_Reader_HTML + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Reader + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +/** PHPExcel root directory */ +class PHPExcel_Reader_HTML extends PHPExcel_Reader_Abstract implements PHPExcel_Reader_IReader +{ + + /** + * Input encoding + * + * @var string + */ + protected $inputEncoding = 'ANSI'; + + /** + * Sheet index to read + * + * @var int + */ + protected $sheetIndex = 0; + + /** + * Formats + * + * @var array + */ + protected $formats = array( + 'h1' => array( + 'font' => array( + 'bold' => true, + 'size' => 24, + ), + ), // Bold, 24pt + 'h2' => array( + 'font' => array( + 'bold' => true, + 'size' => 18, + ), + ), // Bold, 18pt + 'h3' => array( + 'font' => array( + 'bold' => true, + 'size' => 13.5, + ), + ), // Bold, 13.5pt + 'h4' => array( + 'font' => array( + 'bold' => true, + 'size' => 12, + ), + ), // Bold, 12pt + 'h5' => array( + 'font' => array( + 'bold' => true, + 'size' => 10, + ), + ), // Bold, 10pt + 'h6' => array( + 'font' => array( + 'bold' => true, + 'size' => 7.5, + ), + ), // Bold, 7.5pt + 'a' => array( + 'font' => array( + 'underline' => true, + 'color' => array( + 'argb' => PHPExcel_Style_Color::COLOR_BLUE, + ), + ), + ), // Blue underlined + 'hr' => array( + 'borders' => array( + 'bottom' => array( + 'style' => PHPExcel_Style_Border::BORDER_THIN, + 'color' => array( + PHPExcel_Style_Color::COLOR_BLACK, + ), + ), + ), + ), // Bottom border + ); + + protected $rowspan = array(); + + /** + * Create a new PHPExcel_Reader_HTML + */ + public function __construct() + { + $this->readFilter = new PHPExcel_Reader_DefaultReadFilter(); + } + + /** + * Validate that the current file is an HTML file + * + * @return boolean + */ + protected function isValidFormat() + { + // Reading 2048 bytes should be enough to validate that the format is HTML + $data = fread($this->fileHandle, 2048); + if ((strpos($data, '<') !== false) && + (strlen($data) !== strlen(strip_tags($data)))) { + return true; + } + + return false; + } + + /** + * Loads PHPExcel from file + * + * @param string $pFilename + * @return PHPExcel + * @throws PHPExcel_Reader_Exception + */ + public function load($pFilename) + { + // Create new PHPExcel + $objPHPExcel = new PHPExcel(); + + // Load into this instance + return $this->loadIntoExisting($pFilename, $objPHPExcel); + } + + /** + * Set input encoding + * + * @param string $pValue Input encoding + */ + public function setInputEncoding($pValue = 'ANSI') + { + $this->inputEncoding = $pValue; + + return $this; + } + + /** + * Get input encoding + * + * @return string + */ + public function getInputEncoding() + { + return $this->inputEncoding; + } + + // Data Array used for testing only, should write to PHPExcel object on completion of tests + protected $dataArray = array(); + protected $tableLevel = 0; + protected $nestedColumn = array('A'); + + protected function setTableStartColumn($column) + { + if ($this->tableLevel == 0) { + $column = 'A'; + } + ++$this->tableLevel; + $this->nestedColumn[$this->tableLevel] = $column; + + return $this->nestedColumn[$this->tableLevel]; + } + + protected function getTableStartColumn() + { + return $this->nestedColumn[$this->tableLevel]; + } + + protected function releaseTableStartColumn() + { + --$this->tableLevel; + + return array_pop($this->nestedColumn); + } + + protected function flushCell($sheet, $column, $row, &$cellContent) + { + if (is_string($cellContent)) { + // Simple String content + if (trim($cellContent) > '') { + // Only actually write it if there's content in the string +// echo 'FLUSH CELL: ' , $column , $row , ' => ' , $cellContent , '<br />'; + // Write to worksheet to be done here... + // ... we return the cell so we can mess about with styles more easily + $sheet->setCellValue($column . $row, $cellContent, true); + $this->dataArray[$row][$column] = $cellContent; + } + } else { + // We have a Rich Text run + // TODO + $this->dataArray[$row][$column] = 'RICH TEXT: ' . $cellContent; + } + $cellContent = (string) ''; + } + + protected function processDomElement(DOMNode $element, $sheet, &$row, &$column, &$cellContent, $format = null) + { + foreach ($element->childNodes as $child) { + if ($child instanceof DOMText) { + $domText = preg_replace('/\s+/u', ' ', trim($child->nodeValue)); + if (is_string($cellContent)) { + // simply append the text if the cell content is a plain text string + $cellContent .= $domText; + } else { + // but if we have a rich text run instead, we need to append it correctly + // TODO + } + } elseif ($child instanceof DOMElement) { +// echo '<b>DOM ELEMENT: </b>' , strtoupper($child->nodeName) , '<br />'; + + $attributeArray = array(); + foreach ($child->attributes as $attribute) { +// echo '<b>ATTRIBUTE: </b>' , $attribute->name , ' => ' , $attribute->value , '<br />'; + $attributeArray[$attribute->name] = $attribute->value; + } + + switch ($child->nodeName) { + case 'meta': + foreach ($attributeArray as $attributeName => $attributeValue) { + switch ($attributeName) { + case 'content': + // TODO + // Extract character set, so we can convert to UTF-8 if required + break; + } + } + $this->processDomElement($child, $sheet, $row, $column, $cellContent); + break; + case 'title': + $this->processDomElement($child, $sheet, $row, $column, $cellContent); + $sheet->setTitle($cellContent); + $cellContent = ''; + break; + case 'span': + case 'div': + case 'font': + case 'i': + case 'em': + case 'strong': + case 'b': +// echo 'STYLING, SPAN OR DIV<br />'; + if ($cellContent > '') { + $cellContent .= ' '; + } + $this->processDomElement($child, $sheet, $row, $column, $cellContent); + if ($cellContent > '') { + $cellContent .= ' '; + } +// echo 'END OF STYLING, SPAN OR DIV<br />'; + break; + case 'hr': + $this->flushCell($sheet, $column, $row, $cellContent); + ++$row; + if (isset($this->formats[$child->nodeName])) { + $sheet->getStyle($column . $row)->applyFromArray($this->formats[$child->nodeName]); + } else { + $cellContent = '----------'; + $this->flushCell($sheet, $column, $row, $cellContent); + } + ++$row; + // Add a break after a horizontal rule, simply by allowing the code to dropthru + case 'br': + if ($this->tableLevel > 0) { + // If we're inside a table, replace with a \n + $cellContent .= "\n"; + } else { + // Otherwise flush our existing content and move the row cursor on + $this->flushCell($sheet, $column, $row, $cellContent); + ++$row; + } +// echo 'HARD LINE BREAK: ' , '<br />'; + break; + case 'a': +// echo 'START OF HYPERLINK: ' , '<br />'; + foreach ($attributeArray as $attributeName => $attributeValue) { + switch ($attributeName) { + case 'href': +// echo 'Link to ' , $attributeValue , '<br />'; + $sheet->getCell($column . $row)->getHyperlink()->setUrl($attributeValue); + if (isset($this->formats[$child->nodeName])) { + $sheet->getStyle($column . $row)->applyFromArray($this->formats[$child->nodeName]); + } + break; + } + } + $cellContent .= ' '; + $this->processDomElement($child, $sheet, $row, $column, $cellContent); +// echo 'END OF HYPERLINK:' , '<br />'; + break; + case 'h1': + case 'h2': + case 'h3': + case 'h4': + case 'h5': + case 'h6': + case 'ol': + case 'ul': + case 'p': + if ($this->tableLevel > 0) { + // If we're inside a table, replace with a \n + $cellContent .= "\n"; +// echo 'LIST ENTRY: ' , '<br />'; + $this->processDomElement($child, $sheet, $row, $column, $cellContent); +// echo 'END OF LIST ENTRY:' , '<br />'; + } else { + if ($cellContent > '') { + $this->flushCell($sheet, $column, $row, $cellContent); + $row++; + } +// echo 'START OF PARAGRAPH: ' , '<br />'; + $this->processDomElement($child, $sheet, $row, $column, $cellContent); +// echo 'END OF PARAGRAPH:' , '<br />'; + $this->flushCell($sheet, $column, $row, $cellContent); + + if (isset($this->formats[$child->nodeName])) { + $sheet->getStyle($column . $row)->applyFromArray($this->formats[$child->nodeName]); + } + + $row++; + $column = 'A'; + } + break; + case 'li': + if ($this->tableLevel > 0) { + // If we're inside a table, replace with a \n + $cellContent .= "\n"; +// echo 'LIST ENTRY: ' , '<br />'; + $this->processDomElement($child, $sheet, $row, $column, $cellContent); +// echo 'END OF LIST ENTRY:' , '<br />'; + } else { + if ($cellContent > '') { + $this->flushCell($sheet, $column, $row, $cellContent); + } + ++$row; +// echo 'LIST ENTRY: ' , '<br />'; + $this->processDomElement($child, $sheet, $row, $column, $cellContent); +// echo 'END OF LIST ENTRY:' , '<br />'; + $this->flushCell($sheet, $column, $row, $cellContent); + $column = 'A'; + } + break; + case 'table': + $this->flushCell($sheet, $column, $row, $cellContent); + $column = $this->setTableStartColumn($column); +// echo 'START OF TABLE LEVEL ' , $this->tableLevel , '<br />'; + if ($this->tableLevel > 1) { + --$row; + } + $this->processDomElement($child, $sheet, $row, $column, $cellContent); +// echo 'END OF TABLE LEVEL ' , $this->tableLevel , '<br />'; + $column = $this->releaseTableStartColumn(); + if ($this->tableLevel > 1) { + ++$column; + } else { + ++$row; + } + break; + case 'thead': + case 'tbody': + $this->processDomElement($child, $sheet, $row, $column, $cellContent); + break; + case 'tr': + $column = $this->getTableStartColumn(); + $cellContent = ''; +// echo 'START OF TABLE ' , $this->tableLevel , ' ROW<br />'; + $this->processDomElement($child, $sheet, $row, $column, $cellContent); + ++$row; +// echo 'END OF TABLE ' , $this->tableLevel , ' ROW<br />'; + break; + case 'th': + case 'td': +// echo 'START OF TABLE ' , $this->tableLevel , ' CELL<br />'; + $this->processDomElement($child, $sheet, $row, $column, $cellContent); +// echo 'END OF TABLE ' , $this->tableLevel , ' CELL<br />'; + + while (isset($this->rowspan[$column . $row])) { + ++$column; + } + + $this->flushCell($sheet, $column, $row, $cellContent); + +// if (isset($attributeArray['style']) && !empty($attributeArray['style'])) { +// $styleAry = $this->getPhpExcelStyleArray($attributeArray['style']); +// +// if (!empty($styleAry)) { +// $sheet->getStyle($column . $row)->applyFromArray($styleAry); +// } +// } + + if (isset($attributeArray['rowspan']) && isset($attributeArray['colspan'])) { + //create merging rowspan and colspan + $columnTo = $column; + for ($i = 0; $i < $attributeArray['colspan'] - 1; $i++) { + ++$columnTo; + } + $range = $column . $row . ':' . $columnTo . ($row + $attributeArray['rowspan'] - 1); + foreach (\PHPExcel_Cell::extractAllCellReferencesInRange($range) as $value) { + $this->rowspan[$value] = true; + } + $sheet->mergeCells($range); + $column = $columnTo; + } elseif (isset($attributeArray['rowspan'])) { + //create merging rowspan + $range = $column . $row . ':' . $column . ($row + $attributeArray['rowspan'] - 1); + foreach (\PHPExcel_Cell::extractAllCellReferencesInRange($range) as $value) { + $this->rowspan[$value] = true; + } + $sheet->mergeCells($range); + } elseif (isset($attributeArray['colspan'])) { + //create merging colspan + $columnTo = $column; + for ($i = 0; $i < $attributeArray['colspan'] - 1; $i++) { + ++$columnTo; + } + $sheet->mergeCells($column . $row . ':' . $columnTo . $row); + $column = $columnTo; + } + ++$column; + break; + case 'body': + $row = 1; + $column = 'A'; + $content = ''; + $this->tableLevel = 0; + $this->processDomElement($child, $sheet, $row, $column, $cellContent); + break; + default: + $this->processDomElement($child, $sheet, $row, $column, $cellContent); + } + } + } + } + + /** + * Loads PHPExcel from file into PHPExcel instance + * + * @param string $pFilename + * @param PHPExcel $objPHPExcel + * @return PHPExcel + * @throws PHPExcel_Reader_Exception + */ + public function loadIntoExisting($pFilename, PHPExcel $objPHPExcel) + { + // Open file to validate + $this->openFile($pFilename); + if (!$this->isValidFormat()) { + fclose($this->fileHandle); + throw new PHPExcel_Reader_Exception($pFilename . " is an Invalid HTML file."); + } + // Close after validating + fclose($this->fileHandle); + + // Create new PHPExcel + while ($objPHPExcel->getSheetCount() <= $this->sheetIndex) { + $objPHPExcel->createSheet(); + } + $objPHPExcel->setActiveSheetIndex($this->sheetIndex); + + // Create a new DOM object + $dom = new domDocument; + // Reload the HTML file into the DOM object + $loaded = $dom->loadHTML(mb_convert_encoding($this->securityScanFile($pFilename), 'HTML-ENTITIES', 'UTF-8')); + if ($loaded === false) { + throw new PHPExcel_Reader_Exception('Failed to load ' . $pFilename . ' as a DOM Document'); + } + + // Discard white space + $dom->preserveWhiteSpace = false; + + $row = 0; + $column = 'A'; + $content = ''; + $this->processDomElement($dom, $objPHPExcel->getActiveSheet(), $row, $column, $content); + + // Return + return $objPHPExcel; + } + + /** + * Get sheet index + * + * @return int + */ + public function getSheetIndex() + { + return $this->sheetIndex; + } + + /** + * Set sheet index + * + * @param int $pValue Sheet index + * @return PHPExcel_Reader_HTML + */ + public function setSheetIndex($pValue = 0) + { + $this->sheetIndex = $pValue; + + return $this; + } + + /** + * Scan theXML for use of <!ENTITY to prevent XXE/XEE attacks + * + * @param string $xml + * @throws PHPExcel_Reader_Exception + */ + public function securityScan($xml) + { + $pattern = '/\\0?' . implode('\\0?', str_split('<!ENTITY')) . '\\0?/'; + if (preg_match($pattern, $xml)) { + throw new PHPExcel_Reader_Exception('Detected use of ENTITY in XML, spreadsheet file load() aborted to prevent XXE/XEE attacks'); + } + return $xml; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/IReadFilter.php b/application/third_party/PHPExcel/PHPExcel/Reader/IReadFilter.php new file mode 100644 index 0000000..f7c852d --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/IReadFilter.php @@ -0,0 +1,39 @@ +<?php + +/** + * PHPExcel_Reader_IReadFilter + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Reader + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +interface PHPExcel_Reader_IReadFilter +{ + /** + * Should this cell be read? + * + * @param $column Column address (as a string value like "A", or "IV") + * @param $row Row number + * @param $worksheetName Optional worksheet name + * @return boolean + */ + public function readCell($column, $row, $worksheetName = ''); +} diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/IReader.php b/application/third_party/PHPExcel/PHPExcel/Reader/IReader.php new file mode 100644 index 0000000..9034546 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/IReader.php @@ -0,0 +1,46 @@ +<?php + +/** + * PHPExcel_Reader_IReader + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Reader + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +interface PHPExcel_Reader_IReader +{ + /** + * Can the current PHPExcel_Reader_IReader read the file? + * + * @param string $pFilename + * @return boolean + */ + public function canRead($pFilename); + + /** + * Loads PHPExcel from file + * + * @param string $pFilename + * @return PHPExcel + * @throws PHPExcel_Reader_Exception + */ + public function load($pFilename); +} diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/OOCalc.php b/application/third_party/PHPExcel/PHPExcel/Reader/OOCalc.php new file mode 100644 index 0000000..a889d95 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/OOCalc.php @@ -0,0 +1,696 @@ +<?php + +/** PHPExcel root directory */ +if (!defined('PHPEXCEL_ROOT')) { + /** + * @ignore + */ + define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../'); + require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php'); +} + +/** + * PHPExcel_Reader_OOCalc + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Reader + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Reader_OOCalc extends PHPExcel_Reader_Abstract implements PHPExcel_Reader_IReader +{ + /** + * Formats + * + * @var array + */ + private $styles = array(); + + /** + * Create a new PHPExcel_Reader_OOCalc + */ + public function __construct() + { + $this->readFilter = new PHPExcel_Reader_DefaultReadFilter(); + } + + /** + * Can the current PHPExcel_Reader_IReader read the file? + * + * @param string $pFilename + * @return boolean + * @throws PHPExcel_Reader_Exception + */ + public function canRead($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $zipClass = PHPExcel_Settings::getZipClass(); + + // Check if zip class exists +// if (!class_exists($zipClass, false)) { +// throw new PHPExcel_Reader_Exception($zipClass . " library is not enabled"); +// } + + $mimeType = 'UNKNOWN'; + // Load file + $zip = new $zipClass; + if ($zip->open($pFilename) === true) { + // check if it is an OOXML archive + $stat = $zip->statName('mimetype'); + if ($stat && ($stat['size'] <= 255)) { + $mimeType = $zip->getFromName($stat['name']); + } elseif ($stat = $zip->statName('META-INF/manifest.xml')) { + $xml = simplexml_load_string($this->securityScan($zip->getFromName('META-INF/manifest.xml')), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); + $namespacesContent = $xml->getNamespaces(true); + if (isset($namespacesContent['manifest'])) { + $manifest = $xml->children($namespacesContent['manifest']); + foreach ($manifest as $manifestDataSet) { + $manifestAttributes = $manifestDataSet->attributes($namespacesContent['manifest']); + if ($manifestAttributes->{'full-path'} == '/') { + $mimeType = (string) $manifestAttributes->{'media-type'}; + break; + } + } + } + } + + $zip->close(); + + return ($mimeType === 'application/vnd.oasis.opendocument.spreadsheet'); + } + + return false; + } + + + /** + * Reads names of the worksheets from a file, without parsing the whole file to a PHPExcel object + * + * @param string $pFilename + * @throws PHPExcel_Reader_Exception + */ + public function listWorksheetNames($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $zipClass = PHPExcel_Settings::getZipClass(); + + $zip = new $zipClass; + if (!$zip->open($pFilename)) { + throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! Error opening file."); + } + + $worksheetNames = array(); + + $xml = new XMLReader(); + $res = $xml->xml($this->securityScanFile('zip://'.realpath($pFilename).'#content.xml'), null, PHPExcel_Settings::getLibXmlLoaderOptions()); + $xml->setParserProperty(2, true); + + // Step into the first level of content of the XML + $xml->read(); + while ($xml->read()) { + // Quickly jump through to the office:body node + while ($xml->name !== 'office:body') { + if ($xml->isEmptyElement) { + $xml->read(); + } else { + $xml->next(); + } + } + // Now read each node until we find our first table:table node + while ($xml->read()) { + if ($xml->name == 'table:table' && $xml->nodeType == XMLReader::ELEMENT) { + // Loop through each table:table node reading the table:name attribute for each worksheet name + do { + $worksheetNames[] = $xml->getAttribute('table:name'); + $xml->next(); + } while ($xml->name == 'table:table' && $xml->nodeType == XMLReader::ELEMENT); + } + } + } + + return $worksheetNames; + } + + /** + * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns) + * + * @param string $pFilename + * @throws PHPExcel_Reader_Exception + */ + public function listWorksheetInfo($pFilename) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $worksheetInfo = array(); + + $zipClass = PHPExcel_Settings::getZipClass(); + + $zip = new $zipClass; + if (!$zip->open($pFilename)) { + throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! Error opening file."); + } + + $xml = new XMLReader(); + $res = $xml->xml($this->securityScanFile('zip://'.realpath($pFilename).'#content.xml'), null, PHPExcel_Settings::getLibXmlLoaderOptions()); + $xml->setParserProperty(2, true); + + // Step into the first level of content of the XML + $xml->read(); + while ($xml->read()) { + // Quickly jump through to the office:body node + while ($xml->name !== 'office:body') { + if ($xml->isEmptyElement) { + $xml->read(); + } else { + $xml->next(); + } + } + // Now read each node until we find our first table:table node + while ($xml->read()) { + if ($xml->name == 'table:table' && $xml->nodeType == XMLReader::ELEMENT) { + $worksheetNames[] = $xml->getAttribute('table:name'); + + $tmpInfo = array( + 'worksheetName' => $xml->getAttribute('table:name'), + 'lastColumnLetter' => 'A', + 'lastColumnIndex' => 0, + 'totalRows' => 0, + 'totalColumns' => 0, + ); + + // Loop through each child node of the table:table element reading + $currCells = 0; + do { + $xml->read(); + if ($xml->name == 'table:table-row' && $xml->nodeType == XMLReader::ELEMENT) { + $rowspan = $xml->getAttribute('table:number-rows-repeated'); + $rowspan = empty($rowspan) ? 1 : $rowspan; + $tmpInfo['totalRows'] += $rowspan; + $tmpInfo['totalColumns'] = max($tmpInfo['totalColumns'], $currCells); + $currCells = 0; + // Step into the row + $xml->read(); + do { + if ($xml->name == 'table:table-cell' && $xml->nodeType == XMLReader::ELEMENT) { + if (!$xml->isEmptyElement) { + $currCells++; + $xml->next(); + } else { + $xml->read(); + } + } elseif ($xml->name == 'table:covered-table-cell' && $xml->nodeType == XMLReader::ELEMENT) { + $mergeSize = $xml->getAttribute('table:number-columns-repeated'); + $currCells += $mergeSize; + $xml->read(); + } + } while ($xml->name != 'table:table-row'); + } + } while ($xml->name != 'table:table'); + + $tmpInfo['totalColumns'] = max($tmpInfo['totalColumns'], $currCells); + $tmpInfo['lastColumnIndex'] = $tmpInfo['totalColumns'] - 1; + $tmpInfo['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($tmpInfo['lastColumnIndex']); + $worksheetInfo[] = $tmpInfo; + } + } + +// foreach ($workbookData->table as $worksheetDataSet) { +// $worksheetData = $worksheetDataSet->children($namespacesContent['table']); +// $worksheetDataAttributes = $worksheetDataSet->attributes($namespacesContent['table']); +// +// $rowIndex = 0; +// foreach ($worksheetData as $key => $rowData) { +// switch ($key) { +// case 'table-row' : +// $rowDataTableAttributes = $rowData->attributes($namespacesContent['table']); +// $rowRepeats = (isset($rowDataTableAttributes['number-rows-repeated'])) ? +// $rowDataTableAttributes['number-rows-repeated'] : 1; +// $columnIndex = 0; +// +// foreach ($rowData as $key => $cellData) { +// $cellDataTableAttributes = $cellData->attributes($namespacesContent['table']); +// $colRepeats = (isset($cellDataTableAttributes['number-columns-repeated'])) ? +// $cellDataTableAttributes['number-columns-repeated'] : 1; +// $cellDataOfficeAttributes = $cellData->attributes($namespacesContent['office']); +// if (isset($cellDataOfficeAttributes['value-type'])) { +// $tmpInfo['lastColumnIndex'] = max($tmpInfo['lastColumnIndex'], $columnIndex + $colRepeats - 1); +// $tmpInfo['totalRows'] = max($tmpInfo['totalRows'], $rowIndex + $rowRepeats); +// } +// $columnIndex += $colRepeats; +// } +// $rowIndex += $rowRepeats; +// break; +// } +// } +// +// $tmpInfo['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($tmpInfo['lastColumnIndex']); +// $tmpInfo['totalColumns'] = $tmpInfo['lastColumnIndex'] + 1; +// +// } +// } + } + + return $worksheetInfo; + } + + /** + * Loads PHPExcel from file + * + * @param string $pFilename + * @return PHPExcel + * @throws PHPExcel_Reader_Exception + */ + public function load($pFilename) + { + // Create new PHPExcel + $objPHPExcel = new PHPExcel(); + + // Load into this instance + return $this->loadIntoExisting($pFilename, $objPHPExcel); + } + + private static function identifyFixedStyleValue($styleList, &$styleAttributeValue) + { + $styleAttributeValue = strtolower($styleAttributeValue); + foreach ($styleList as $style) { + if ($styleAttributeValue == strtolower($style)) { + $styleAttributeValue = $style; + return true; + } + } + return false; + } + + /** + * Loads PHPExcel from file into PHPExcel instance + * + * @param string $pFilename + * @param PHPExcel $objPHPExcel + * @return PHPExcel + * @throws PHPExcel_Reader_Exception + */ + public function loadIntoExisting($pFilename, PHPExcel $objPHPExcel) + { + // Check if file exists + if (!file_exists($pFilename)) { + throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist."); + } + + $timezoneObj = new DateTimeZone('Europe/London'); + $GMT = new DateTimeZone('UTC'); + + $zipClass = PHPExcel_Settings::getZipClass(); + + $zip = new $zipClass; + if (!$zip->open($pFilename)) { + throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! Error opening file."); + } + +// echo '<h1>Meta Information</h1>'; + $xml = simplexml_load_string($this->securityScan($zip->getFromName("meta.xml")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); + $namespacesMeta = $xml->getNamespaces(true); +// echo '<pre>'; +// print_r($namespacesMeta); +// echo '</pre><hr />'; + + $docProps = $objPHPExcel->getProperties(); + $officeProperty = $xml->children($namespacesMeta['office']); + foreach ($officeProperty as $officePropertyData) { + $officePropertyDC = array(); + if (isset($namespacesMeta['dc'])) { + $officePropertyDC = $officePropertyData->children($namespacesMeta['dc']); + } + foreach ($officePropertyDC as $propertyName => $propertyValue) { + $propertyValue = (string) $propertyValue; + switch ($propertyName) { + case 'title': + $docProps->setTitle($propertyValue); + break; + case 'subject': + $docProps->setSubject($propertyValue); + break; + case 'creator': + $docProps->setCreator($propertyValue); + $docProps->setLastModifiedBy($propertyValue); + break; + case 'date': + $creationDate = strtotime($propertyValue); + $docProps->setCreated($creationDate); + $docProps->setModified($creationDate); + break; + case 'description': + $docProps->setDescription($propertyValue); + break; + } + } + $officePropertyMeta = array(); + if (isset($namespacesMeta['dc'])) { + $officePropertyMeta = $officePropertyData->children($namespacesMeta['meta']); + } + foreach ($officePropertyMeta as $propertyName => $propertyValue) { + $propertyValueAttributes = $propertyValue->attributes($namespacesMeta['meta']); + $propertyValue = (string) $propertyValue; + switch ($propertyName) { + case 'initial-creator': + $docProps->setCreator($propertyValue); + break; + case 'keyword': + $docProps->setKeywords($propertyValue); + break; + case 'creation-date': + $creationDate = strtotime($propertyValue); + $docProps->setCreated($creationDate); + break; + case 'user-defined': + $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_STRING; + foreach ($propertyValueAttributes as $key => $value) { + if ($key == 'name') { + $propertyValueName = (string) $value; + } elseif ($key == 'value-type') { + switch ($value) { + case 'date': + $propertyValue = PHPExcel_DocumentProperties::convertProperty($propertyValue, 'date'); + $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_DATE; + break; + case 'boolean': + $propertyValue = PHPExcel_DocumentProperties::convertProperty($propertyValue, 'bool'); + $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_BOOLEAN; + break; + case 'float': + $propertyValue = PHPExcel_DocumentProperties::convertProperty($propertyValue, 'r4'); + $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_FLOAT; + break; + default: + $propertyValueType = PHPExcel_DocumentProperties::PROPERTY_TYPE_STRING; + } + } + } + $docProps->setCustomProperty($propertyValueName, $propertyValue, $propertyValueType); + break; + } + } + } + + +// echo '<h1>Workbook Content</h1>'; + $xml = simplexml_load_string($this->securityScan($zip->getFromName("content.xml")), 'SimpleXMLElement', PHPExcel_Settings::getLibXmlLoaderOptions()); + $namespacesContent = $xml->getNamespaces(true); +// echo '<pre>'; +// print_r($namespacesContent); +// echo '</pre><hr />'; + + $workbook = $xml->children($namespacesContent['office']); + foreach ($workbook->body->spreadsheet as $workbookData) { + $workbookData = $workbookData->children($namespacesContent['table']); + $worksheetID = 0; + foreach ($workbookData->table as $worksheetDataSet) { + $worksheetData = $worksheetDataSet->children($namespacesContent['table']); +// print_r($worksheetData); +// echo '<br />'; + $worksheetDataAttributes = $worksheetDataSet->attributes($namespacesContent['table']); +// print_r($worksheetDataAttributes); +// echo '<br />'; + if ((isset($this->loadSheetsOnly)) && (isset($worksheetDataAttributes['name'])) && + (!in_array($worksheetDataAttributes['name'], $this->loadSheetsOnly))) { + continue; + } + +// echo '<h2>Worksheet '.$worksheetDataAttributes['name'].'</h2>'; + // Create new Worksheet + $objPHPExcel->createSheet(); + $objPHPExcel->setActiveSheetIndex($worksheetID); + if (isset($worksheetDataAttributes['name'])) { + $worksheetName = (string) $worksheetDataAttributes['name']; + // Use false for $updateFormulaCellReferences to prevent adjustment of worksheet references in + // formula cells... during the load, all formulae should be correct, and we're simply + // bringing the worksheet name in line with the formula, not the reverse + $objPHPExcel->getActiveSheet()->setTitle($worksheetName, false); + } + + $rowID = 1; + foreach ($worksheetData as $key => $rowData) { +// echo '<b>'.$key.'</b><br />'; + switch ($key) { + case 'table-header-rows': + foreach ($rowData as $key => $cellData) { + $rowData = $cellData; + break; + } + case 'table-row': + $rowDataTableAttributes = $rowData->attributes($namespacesContent['table']); + $rowRepeats = (isset($rowDataTableAttributes['number-rows-repeated'])) ? $rowDataTableAttributes['number-rows-repeated'] : 1; + $columnID = 'A'; + foreach ($rowData as $key => $cellData) { + if ($this->getReadFilter() !== null) { + if (!$this->getReadFilter()->readCell($columnID, $rowID, $worksheetName)) { + continue; + } + } + +// echo '<b>'.$columnID.$rowID.'</b><br />'; + $cellDataText = (isset($namespacesContent['text'])) ? $cellData->children($namespacesContent['text']) : ''; + $cellDataOffice = $cellData->children($namespacesContent['office']); + $cellDataOfficeAttributes = $cellData->attributes($namespacesContent['office']); + $cellDataTableAttributes = $cellData->attributes($namespacesContent['table']); + +// echo 'Office Attributes: '; +// print_r($cellDataOfficeAttributes); +// echo '<br />Table Attributes: '; +// print_r($cellDataTableAttributes); +// echo '<br />Cell Data Text'; +// print_r($cellDataText); +// echo '<br />'; +// + $type = $formatting = $hyperlink = null; + $hasCalculatedValue = false; + $cellDataFormula = ''; + if (isset($cellDataTableAttributes['formula'])) { + $cellDataFormula = $cellDataTableAttributes['formula']; + $hasCalculatedValue = true; + } + + if (isset($cellDataOffice->annotation)) { +// echo 'Cell has comment<br />'; + $annotationText = $cellDataOffice->annotation->children($namespacesContent['text']); + $textArray = array(); + foreach ($annotationText as $t) { + if (isset($t->span)) { + foreach ($t->span as $text) { + $textArray[] = (string)$text; + } + } else { + $textArray[] = (string) $t; + } + } + $text = implode("\n", $textArray); +// echo $text, '<br />'; + $objPHPExcel->getActiveSheet()->getComment($columnID.$rowID)->setText($this->parseRichText($text)); +// ->setAuthor( $author ) + } + + if (isset($cellDataText->p)) { + // Consolidate if there are multiple p records (maybe with spans as well) + $dataArray = array(); + // Text can have multiple text:p and within those, multiple text:span. + // text:p newlines, but text:span does not. + // Also, here we assume there is no text data is span fields are specified, since + // we have no way of knowing proper positioning anyway. + foreach ($cellDataText->p as $pData) { + if (isset($pData->span)) { + // span sections do not newline, so we just create one large string here + $spanSection = ""; + foreach ($pData->span as $spanData) { + $spanSection .= $spanData; + } + array_push($dataArray, $spanSection); + } else { + array_push($dataArray, $pData); + } + } + $allCellDataText = implode($dataArray, "\n"); + +// echo 'Value Type is '.$cellDataOfficeAttributes['value-type'].'<br />'; + switch ($cellDataOfficeAttributes['value-type']) { + case 'string': + $type = PHPExcel_Cell_DataType::TYPE_STRING; + $dataValue = $allCellDataText; + if (isset($dataValue->a)) { + $dataValue = $dataValue->a; + $cellXLinkAttributes = $dataValue->attributes($namespacesContent['xlink']); + $hyperlink = $cellXLinkAttributes['href']; + } + break; + case 'boolean': + $type = PHPExcel_Cell_DataType::TYPE_BOOL; + $dataValue = ($allCellDataText == 'TRUE') ? true : false; + break; + case 'percentage': + $type = PHPExcel_Cell_DataType::TYPE_NUMERIC; + $dataValue = (float) $cellDataOfficeAttributes['value']; + if (floor($dataValue) == $dataValue) { + $dataValue = (integer) $dataValue; + } + $formatting = PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE_00; + break; + case 'currency': + $type = PHPExcel_Cell_DataType::TYPE_NUMERIC; + $dataValue = (float) $cellDataOfficeAttributes['value']; + if (floor($dataValue) == $dataValue) { + $dataValue = (integer) $dataValue; + } + $formatting = PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE; + break; + case 'float': + $type = PHPExcel_Cell_DataType::TYPE_NUMERIC; + $dataValue = (float) $cellDataOfficeAttributes['value']; + if (floor($dataValue) == $dataValue) { + if ($dataValue == (integer) $dataValue) { + $dataValue = (integer) $dataValue; + } else { + $dataValue = (float) $dataValue; + } + } + break; + case 'date': + $type = PHPExcel_Cell_DataType::TYPE_NUMERIC; + $dateObj = new DateTime($cellDataOfficeAttributes['date-value'], $GMT); + $dateObj->setTimeZone($timezoneObj); + list($year, $month, $day, $hour, $minute, $second) = explode(' ', $dateObj->format('Y m d H i s')); + $dataValue = PHPExcel_Shared_Date::FormattedPHPToExcel($year, $month, $day, $hour, $minute, $second); + if ($dataValue != floor($dataValue)) { + $formatting = PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX15.' '.PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4; + } else { + $formatting = PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX15; + } + break; + case 'time': + $type = PHPExcel_Cell_DataType::TYPE_NUMERIC; + $dataValue = PHPExcel_Shared_Date::PHPToExcel(strtotime('01-01-1970 '.implode(':', sscanf($cellDataOfficeAttributes['time-value'], 'PT%dH%dM%dS')))); + $formatting = PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4; + break; + } +// echo 'Data value is '.$dataValue.'<br />'; +// if ($hyperlink !== null) { +// echo 'Hyperlink is '.$hyperlink.'<br />'; +// } + } else { + $type = PHPExcel_Cell_DataType::TYPE_NULL; + $dataValue = null; + } + + if ($hasCalculatedValue) { + $type = PHPExcel_Cell_DataType::TYPE_FORMULA; +// echo 'Formula: ', $cellDataFormula, PHP_EOL; + $cellDataFormula = substr($cellDataFormula, strpos($cellDataFormula, ':=')+1); + $temp = explode('"', $cellDataFormula); + $tKey = false; + foreach ($temp as &$value) { + // Only replace in alternate array entries (i.e. non-quoted blocks) + if ($tKey = !$tKey) { + $value = preg_replace('/\[([^\.]+)\.([^\.]+):\.([^\.]+)\]/Ui', '$1!$2:$3', $value); // Cell range reference in another sheet + $value = preg_replace('/\[([^\.]+)\.([^\.]+)\]/Ui', '$1!$2', $value); // Cell reference in another sheet + $value = preg_replace('/\[\.([^\.]+):\.([^\.]+)\]/Ui', '$1:$2', $value); // Cell range reference + $value = preg_replace('/\[\.([^\.]+)\]/Ui', '$1', $value); // Simple cell reference + $value = PHPExcel_Calculation::translateSeparator(';', ',', $value, $inBraces); + } + } + unset($value); + // Then rebuild the formula string + $cellDataFormula = implode('"', $temp); +// echo 'Adjusted Formula: ', $cellDataFormula, PHP_EOL; + } + + $colRepeats = (isset($cellDataTableAttributes['number-columns-repeated'])) ? $cellDataTableAttributes['number-columns-repeated'] : 1; + if ($type !== null) { + for ($i = 0; $i < $colRepeats; ++$i) { + if ($i > 0) { + ++$columnID; + } + if ($type !== PHPExcel_Cell_DataType::TYPE_NULL) { + for ($rowAdjust = 0; $rowAdjust < $rowRepeats; ++$rowAdjust) { + $rID = $rowID + $rowAdjust; + $objPHPExcel->getActiveSheet()->getCell($columnID.$rID)->setValueExplicit((($hasCalculatedValue) ? $cellDataFormula : $dataValue), $type); + if ($hasCalculatedValue) { +// echo 'Forumla result is '.$dataValue.'<br />'; + $objPHPExcel->getActiveSheet()->getCell($columnID.$rID)->setCalculatedValue($dataValue); + } + if ($formatting !== null) { + $objPHPExcel->getActiveSheet()->getStyle($columnID.$rID)->getNumberFormat()->setFormatCode($formatting); + } else { + $objPHPExcel->getActiveSheet()->getStyle($columnID.$rID)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_GENERAL); + } + if ($hyperlink !== null) { + $objPHPExcel->getActiveSheet()->getCell($columnID.$rID)->getHyperlink()->setUrl($hyperlink); + } + } + } + } + } + + // Merged cells + if ((isset($cellDataTableAttributes['number-columns-spanned'])) || (isset($cellDataTableAttributes['number-rows-spanned']))) { + if (($type !== PHPExcel_Cell_DataType::TYPE_NULL) || (!$this->readDataOnly)) { + $columnTo = $columnID; + if (isset($cellDataTableAttributes['number-columns-spanned'])) { + $columnTo = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::columnIndexFromString($columnID) + $cellDataTableAttributes['number-columns-spanned'] -2); + } + $rowTo = $rowID; + if (isset($cellDataTableAttributes['number-rows-spanned'])) { + $rowTo = $rowTo + $cellDataTableAttributes['number-rows-spanned'] - 1; + } + $cellRange = $columnID.$rowID.':'.$columnTo.$rowTo; + $objPHPExcel->getActiveSheet()->mergeCells($cellRange); + } + } + + ++$columnID; + } + $rowID += $rowRepeats; + break; + } + } + ++$worksheetID; + } + } + + // Return + return $objPHPExcel; + } + + private function parseRichText($is = '') + { + $value = new PHPExcel_RichText(); + + $value->createText($is); + + return $value; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Reader/SYLK.php b/application/third_party/PHPExcel/PHPExcel/Reader/SYLK.php new file mode 100644 index 0000000..eb7ef1a --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Reader/SYLK.php @@ -0,0 +1,478 @@ +<?php + +/** PHPExcel root directory */ +if (!defined('PHPEXCEL_ROOT')) { + /** + * @ignore + */ + define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../'); + require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php'); +} + +/** + * PHPExcel_Reader_SYLK + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Reader + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Reader_SYLK extends PHPExcel_Reader_Abstract implements PHPExcel_Reader_IReader +{ + /** + * Input encoding + * + * @var string + */ + private $inputEncoding = 'ANSI'; + + /** + * Sheet index to read + * + * @var int + */ + private $sheetIndex = 0; + + /** + * Formats + * + * @var array + */ + private $formats = array(); + + /** + * Format Count + * + * @var int + */ + private $format = 0; + + /** + * Create a new PHPExcel_Reader_SYLK + */ + public function __construct() + { + $this->readFilter = new PHPExcel_Reader_DefaultReadFilter(); + } + + /** + * Validate that the current file is a SYLK file + * + * @return boolean + */ + protected function isValidFormat() + { + // Read sample data (first 2 KB will do) + $data = fread($this->fileHandle, 2048); + + // Count delimiters in file + $delimiterCount = substr_count($data, ';'); + if ($delimiterCount < 1) { + return false; + } + + // Analyze first line looking for ID; signature + $lines = explode("\n", $data); + if (substr($lines[0], 0, 4) != 'ID;P') { + return false; + } + + return true; + } + + /** + * Set input encoding + * + * @param string $pValue Input encoding + */ + public function setInputEncoding($pValue = 'ANSI') + { + $this->inputEncoding = $pValue; + return $this; + } + + /** + * Get input encoding + * + * @return string + */ + public function getInputEncoding() + { + return $this->inputEncoding; + } + + /** + * Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns) + * + * @param string $pFilename + * @throws PHPExcel_Reader_Exception + */ + public function listWorksheetInfo($pFilename) + { + // Open file + $this->openFile($pFilename); + if (!$this->isValidFormat()) { + fclose($this->fileHandle); + throw new PHPExcel_Reader_Exception($pFilename . " is an Invalid Spreadsheet file."); + } + $fileHandle = $this->fileHandle; + rewind($fileHandle); + + $worksheetInfo = array(); + $worksheetInfo[0]['worksheetName'] = 'Worksheet'; + $worksheetInfo[0]['lastColumnLetter'] = 'A'; + $worksheetInfo[0]['lastColumnIndex'] = 0; + $worksheetInfo[0]['totalRows'] = 0; + $worksheetInfo[0]['totalColumns'] = 0; + + // Loop through file + $rowData = array(); + + // loop through one row (line) at a time in the file + $rowIndex = 0; + while (($rowData = fgets($fileHandle)) !== false) { + $columnIndex = 0; + + // convert SYLK encoded $rowData to UTF-8 + $rowData = PHPExcel_Shared_String::SYLKtoUTF8($rowData); + + // explode each row at semicolons while taking into account that literal semicolon (;) + // is escaped like this (;;) + $rowData = explode("\t", str_replace('¤', ';', str_replace(';', "\t", str_replace(';;', '¤', rtrim($rowData))))); + + $dataType = array_shift($rowData); + if ($dataType == 'C') { + // Read cell value data + foreach ($rowData as $rowDatum) { + switch ($rowDatum{0}) { + case 'C': + case 'X': + $columnIndex = substr($rowDatum, 1) - 1; + break; + case 'R': + case 'Y': + $rowIndex = substr($rowDatum, 1); + break; + } + + $worksheetInfo[0]['totalRows'] = max($worksheetInfo[0]['totalRows'], $rowIndex); + $worksheetInfo[0]['lastColumnIndex'] = max($worksheetInfo[0]['lastColumnIndex'], $columnIndex); + } + } + } + + $worksheetInfo[0]['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($worksheetInfo[0]['lastColumnIndex']); + $worksheetInfo[0]['totalColumns'] = $worksheetInfo[0]['lastColumnIndex'] + 1; + + // Close file + fclose($fileHandle); + + return $worksheetInfo; + } + + /** + * Loads PHPExcel from file + * + * @param string $pFilename + * @return PHPExcel + * @throws PHPExcel_Reader_Exception + */ + public function load($pFilename) + { + // Create new PHPExcel + $objPHPExcel = new PHPExcel(); + + // Load into this instance + return $this->loadIntoExisting($pFilename, $objPHPExcel); + } + + /** + * Loads PHPExcel from file into PHPExcel instance + * + * @param string $pFilename + * @param PHPExcel $objPHPExcel + * @return PHPExcel + * @throws PHPExcel_Reader_Exception + */ + public function loadIntoExisting($pFilename, PHPExcel $objPHPExcel) + { + // Open file + $this->openFile($pFilename); + if (!$this->isValidFormat()) { + fclose($this->fileHandle); + throw new PHPExcel_Reader_Exception($pFilename . " is an Invalid Spreadsheet file."); + } + $fileHandle = $this->fileHandle; + rewind($fileHandle); + + // Create new PHPExcel + while ($objPHPExcel->getSheetCount() <= $this->sheetIndex) { + $objPHPExcel->createSheet(); + } + $objPHPExcel->setActiveSheetIndex($this->sheetIndex); + + $fromFormats = array('\-', '\ '); + $toFormats = array('-', ' '); + + // Loop through file + $rowData = array(); + $column = $row = ''; + + // loop through one row (line) at a time in the file + while (($rowData = fgets($fileHandle)) !== false) { + // convert SYLK encoded $rowData to UTF-8 + $rowData = PHPExcel_Shared_String::SYLKtoUTF8($rowData); + + // explode each row at semicolons while taking into account that literal semicolon (;) + // is escaped like this (;;) + $rowData = explode("\t", str_replace('¤', ';', str_replace(';', "\t", str_replace(';;', '¤', rtrim($rowData))))); + + $dataType = array_shift($rowData); + // Read shared styles + if ($dataType == 'P') { + $formatArray = array(); + foreach ($rowData as $rowDatum) { + switch ($rowDatum{0}) { + case 'P': + $formatArray['numberformat']['code'] = str_replace($fromFormats, $toFormats, substr($rowDatum, 1)); + break; + case 'E': + case 'F': + $formatArray['font']['name'] = substr($rowDatum, 1); + break; + case 'L': + $formatArray['font']['size'] = substr($rowDatum, 1); + break; + case 'S': + $styleSettings = substr($rowDatum, 1); + for ($i=0; $i<strlen($styleSettings); ++$i) { + switch ($styleSettings{$i}) { + case 'I': + $formatArray['font']['italic'] = true; + break; + case 'D': + $formatArray['font']['bold'] = true; + break; + case 'T': + $formatArray['borders']['top']['style'] = PHPExcel_Style_Border::BORDER_THIN; + break; + case 'B': + $formatArray['borders']['bottom']['style'] = PHPExcel_Style_Border::BORDER_THIN; + break; + case 'L': + $formatArray['borders']['left']['style'] = PHPExcel_Style_Border::BORDER_THIN; + break; + case 'R': + $formatArray['borders']['right']['style'] = PHPExcel_Style_Border::BORDER_THIN; + break; + } + } + break; + } + } + $this->formats['P'.$this->format++] = $formatArray; + // Read cell value data + } elseif ($dataType == 'C') { + $hasCalculatedValue = false; + $cellData = $cellDataFormula = ''; + foreach ($rowData as $rowDatum) { + switch ($rowDatum{0}) { + case 'C': + case 'X': + $column = substr($rowDatum, 1); + break; + case 'R': + case 'Y': + $row = substr($rowDatum, 1); + break; + case 'K': + $cellData = substr($rowDatum, 1); + break; + case 'E': + $cellDataFormula = '='.substr($rowDatum, 1); + // Convert R1C1 style references to A1 style references (but only when not quoted) + $temp = explode('"', $cellDataFormula); + $key = false; + foreach ($temp as &$value) { + // Only count/replace in alternate array entries + if ($key = !$key) { + preg_match_all('/(R(\[?-?\d*\]?))(C(\[?-?\d*\]?))/', $value, $cellReferences, PREG_SET_ORDER+PREG_OFFSET_CAPTURE); + // Reverse the matches array, otherwise all our offsets will become incorrect if we modify our way + // through the formula from left to right. Reversing means that we work right to left.through + // the formula + $cellReferences = array_reverse($cellReferences); + // Loop through each R1C1 style reference in turn, converting it to its A1 style equivalent, + // then modify the formula to use that new reference + foreach ($cellReferences as $cellReference) { + $rowReference = $cellReference[2][0]; + // Empty R reference is the current row + if ($rowReference == '') { + $rowReference = $row; + } + // Bracketed R references are relative to the current row + if ($rowReference{0} == '[') { + $rowReference = $row + trim($rowReference, '[]'); + } + $columnReference = $cellReference[4][0]; + // Empty C reference is the current column + if ($columnReference == '') { + $columnReference = $column; + } + // Bracketed C references are relative to the current column + if ($columnReference{0} == '[') { + $columnReference = $column + trim($columnReference, '[]'); + } + $A1CellReference = PHPExcel_Cell::stringFromColumnIndex($columnReference-1).$rowReference; + + $value = substr_replace($value, $A1CellReference, $cellReference[0][1], strlen($cellReference[0][0])); + } + } + } + unset($value); + // Then rebuild the formula string + $cellDataFormula = implode('"', $temp); + $hasCalculatedValue = true; + break; + } + } + $columnLetter = PHPExcel_Cell::stringFromColumnIndex($column-1); + $cellData = PHPExcel_Calculation::unwrapResult($cellData); + + // Set cell value + $objPHPExcel->getActiveSheet()->getCell($columnLetter.$row)->setValue(($hasCalculatedValue) ? $cellDataFormula : $cellData); + if ($hasCalculatedValue) { + $cellData = PHPExcel_Calculation::unwrapResult($cellData); + $objPHPExcel->getActiveSheet()->getCell($columnLetter.$row)->setCalculatedValue($cellData); + } + // Read cell formatting + } elseif ($dataType == 'F') { + $formatStyle = $columnWidth = $styleSettings = ''; + $styleData = array(); + foreach ($rowData as $rowDatum) { + switch ($rowDatum{0}) { + case 'C': + case 'X': + $column = substr($rowDatum, 1); + break; + case 'R': + case 'Y': + $row = substr($rowDatum, 1); + break; + case 'P': + $formatStyle = $rowDatum; + break; + case 'W': + list($startCol, $endCol, $columnWidth) = explode(' ', substr($rowDatum, 1)); + break; + case 'S': + $styleSettings = substr($rowDatum, 1); + for ($i=0; $i<strlen($styleSettings); ++$i) { + switch ($styleSettings{$i}) { + case 'I': + $styleData['font']['italic'] = true; + break; + case 'D': + $styleData['font']['bold'] = true; + break; + case 'T': + $styleData['borders']['top']['style'] = PHPExcel_Style_Border::BORDER_THIN; + break; + case 'B': + $styleData['borders']['bottom']['style'] = PHPExcel_Style_Border::BORDER_THIN; + break; + case 'L': + $styleData['borders']['left']['style'] = PHPExcel_Style_Border::BORDER_THIN; + break; + case 'R': + $styleData['borders']['right']['style'] = PHPExcel_Style_Border::BORDER_THIN; + break; + } + } + break; + } + } + if (($formatStyle > '') && ($column > '') && ($row > '')) { + $columnLetter = PHPExcel_Cell::stringFromColumnIndex($column-1); + if (isset($this->formats[$formatStyle])) { + $objPHPExcel->getActiveSheet()->getStyle($columnLetter.$row)->applyFromArray($this->formats[$formatStyle]); + } + } + if ((!empty($styleData)) && ($column > '') && ($row > '')) { + $columnLetter = PHPExcel_Cell::stringFromColumnIndex($column-1); + $objPHPExcel->getActiveSheet()->getStyle($columnLetter.$row)->applyFromArray($styleData); + } + if ($columnWidth > '') { + if ($startCol == $endCol) { + $startCol = PHPExcel_Cell::stringFromColumnIndex($startCol-1); + $objPHPExcel->getActiveSheet()->getColumnDimension($startCol)->setWidth($columnWidth); + } else { + $startCol = PHPExcel_Cell::stringFromColumnIndex($startCol-1); + $endCol = PHPExcel_Cell::stringFromColumnIndex($endCol-1); + $objPHPExcel->getActiveSheet()->getColumnDimension($startCol)->setWidth($columnWidth); + do { + $objPHPExcel->getActiveSheet()->getColumnDimension(++$startCol)->setWidth($columnWidth); + } while ($startCol != $endCol); + } + } + } else { + foreach ($rowData as $rowDatum) { + switch ($rowDatum{0}) { + case 'C': + case 'X': + $column = substr($rowDatum, 1); + break; + case 'R': + case 'Y': + $row = substr($rowDatum, 1); + break; + } + } + } + } + + // Close file + fclose($fileHandle); + + // Return + return $objPHPExcel; + } + + /** + * Get sheet index + * + * @return int + */ + public function getSheetIndex() + { + return $this->sheetIndex; + } + + /** + * Set sheet index + * + * @param int $pValue Sheet index + * @return PHPExcel_Reader_SYLK + */ + public function setSheetIndex($pValue = 0) + { + $this->sheetIndex = $pValue; + return $this; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/ReferenceHelper.php b/application/third_party/PHPExcel/PHPExcel/ReferenceHelper.php new file mode 100644 index 0000000..7d7de93 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/ReferenceHelper.php @@ -0,0 +1,913 @@ +<?php + +/** + * PHPExcel_ReferenceHelper (Singleton) + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_ReferenceHelper +{ + /** Constants */ + /** Regular Expressions */ + const REFHELPER_REGEXP_CELLREF = '((\w*|\'[^!]*\')!)?(?<![:a-z\$])(\$?[a-z]{1,3}\$?\d+)(?=[^:!\d\'])'; + const REFHELPER_REGEXP_CELLRANGE = '((\w*|\'[^!]*\')!)?(\$?[a-z]{1,3}\$?\d+):(\$?[a-z]{1,3}\$?\d+)'; + const REFHELPER_REGEXP_ROWRANGE = '((\w*|\'[^!]*\')!)?(\$?\d+):(\$?\d+)'; + const REFHELPER_REGEXP_COLRANGE = '((\w*|\'[^!]*\')!)?(\$?[a-z]{1,3}):(\$?[a-z]{1,3})'; + + /** + * Instance of this class + * + * @var PHPExcel_ReferenceHelper + */ + private static $instance; + + /** + * Get an instance of this class + * + * @return PHPExcel_ReferenceHelper + */ + public static function getInstance() + { + if (!isset(self::$instance) || (self::$instance === null)) { + self::$instance = new PHPExcel_ReferenceHelper(); + } + + return self::$instance; + } + + /** + * Create a new PHPExcel_ReferenceHelper + */ + protected function __construct() + { + } + + /** + * Compare two column addresses + * Intended for use as a Callback function for sorting column addresses by column + * + * @param string $a First column to test (e.g. 'AA') + * @param string $b Second column to test (e.g. 'Z') + * @return integer + */ + public static function columnSort($a, $b) + { + return strcasecmp(strlen($a) . $a, strlen($b) . $b); + } + + /** + * Compare two column addresses + * Intended for use as a Callback function for reverse sorting column addresses by column + * + * @param string $a First column to test (e.g. 'AA') + * @param string $b Second column to test (e.g. 'Z') + * @return integer + */ + public static function columnReverseSort($a, $b) + { + return 1 - strcasecmp(strlen($a) . $a, strlen($b) . $b); + } + + /** + * Compare two cell addresses + * Intended for use as a Callback function for sorting cell addresses by column and row + * + * @param string $a First cell to test (e.g. 'AA1') + * @param string $b Second cell to test (e.g. 'Z1') + * @return integer + */ + public static function cellSort($a, $b) + { + sscanf($a, '%[A-Z]%d', $ac, $ar); + sscanf($b, '%[A-Z]%d', $bc, $br); + + if ($ar == $br) { + return strcasecmp(strlen($ac) . $ac, strlen($bc) . $bc); + } + return ($ar < $br) ? -1 : 1; + } + + /** + * Compare two cell addresses + * Intended for use as a Callback function for sorting cell addresses by column and row + * + * @param string $a First cell to test (e.g. 'AA1') + * @param string $b Second cell to test (e.g. 'Z1') + * @return integer + */ + public static function cellReverseSort($a, $b) + { + sscanf($a, '%[A-Z]%d', $ac, $ar); + sscanf($b, '%[A-Z]%d', $bc, $br); + + if ($ar == $br) { + return 1 - strcasecmp(strlen($ac) . $ac, strlen($bc) . $bc); + } + return ($ar < $br) ? 1 : -1; + } + + /** + * Test whether a cell address falls within a defined range of cells + * + * @param string $cellAddress Address of the cell we're testing + * @param integer $beforeRow Number of the row we're inserting/deleting before + * @param integer $pNumRows Number of rows to insert/delete (negative values indicate deletion) + * @param integer $beforeColumnIndex Index number of the column we're inserting/deleting before + * @param integer $pNumCols Number of columns to insert/delete (negative values indicate deletion) + * @return boolean + */ + private static function cellAddressInDeleteRange($cellAddress, $beforeRow, $pNumRows, $beforeColumnIndex, $pNumCols) + { + list($cellColumn, $cellRow) = PHPExcel_Cell::coordinateFromString($cellAddress); + $cellColumnIndex = PHPExcel_Cell::columnIndexFromString($cellColumn); + // Is cell within the range of rows/columns if we're deleting + if ($pNumRows < 0 && + ($cellRow >= ($beforeRow + $pNumRows)) && + ($cellRow < $beforeRow)) { + return true; + } elseif ($pNumCols < 0 && + ($cellColumnIndex >= ($beforeColumnIndex + $pNumCols)) && + ($cellColumnIndex < $beforeColumnIndex)) { + return true; + } + return false; + } + + /** + * Update page breaks when inserting/deleting rows/columns + * + * @param PHPExcel_Worksheet $pSheet The worksheet that we're editing + * @param string $pBefore Insert/Delete before this cell address (e.g. 'A1') + * @param integer $beforeColumnIndex Index number of the column we're inserting/deleting before + * @param integer $pNumCols Number of columns to insert/delete (negative values indicate deletion) + * @param integer $beforeRow Number of the row we're inserting/deleting before + * @param integer $pNumRows Number of rows to insert/delete (negative values indicate deletion) + */ + protected function adjustPageBreaks(PHPExcel_Worksheet $pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows) + { + $aBreaks = $pSheet->getBreaks(); + ($pNumCols > 0 || $pNumRows > 0) ? + uksort($aBreaks, array('PHPExcel_ReferenceHelper','cellReverseSort')) : + uksort($aBreaks, array('PHPExcel_ReferenceHelper','cellSort')); + + foreach ($aBreaks as $key => $value) { + if (self::cellAddressInDeleteRange($key, $beforeRow, $pNumRows, $beforeColumnIndex, $pNumCols)) { + // If we're deleting, then clear any defined breaks that are within the range + // of rows/columns that we're deleting + $pSheet->setBreak($key, PHPExcel_Worksheet::BREAK_NONE); + } else { + // Otherwise update any affected breaks by inserting a new break at the appropriate point + // and removing the old affected break + $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows); + if ($key != $newReference) { + $pSheet->setBreak($newReference, $value) + ->setBreak($key, PHPExcel_Worksheet::BREAK_NONE); + } + } + } + } + + /** + * Update cell comments when inserting/deleting rows/columns + * + * @param PHPExcel_Worksheet $pSheet The worksheet that we're editing + * @param string $pBefore Insert/Delete before this cell address (e.g. 'A1') + * @param integer $beforeColumnIndex Index number of the column we're inserting/deleting before + * @param integer $pNumCols Number of columns to insert/delete (negative values indicate deletion) + * @param integer $beforeRow Number of the row we're inserting/deleting before + * @param integer $pNumRows Number of rows to insert/delete (negative values indicate deletion) + */ + protected function adjustComments($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows) + { + $aComments = $pSheet->getComments(); + $aNewComments = array(); // the new array of all comments + + foreach ($aComments as $key => &$value) { + // Any comments inside a deleted range will be ignored + if (!self::cellAddressInDeleteRange($key, $beforeRow, $pNumRows, $beforeColumnIndex, $pNumCols)) { + // Otherwise build a new array of comments indexed by the adjusted cell reference + $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows); + $aNewComments[$newReference] = $value; + } + } + // Replace the comments array with the new set of comments + $pSheet->setComments($aNewComments); + } + + /** + * Update hyperlinks when inserting/deleting rows/columns + * + * @param PHPExcel_Worksheet $pSheet The worksheet that we're editing + * @param string $pBefore Insert/Delete before this cell address (e.g. 'A1') + * @param integer $beforeColumnIndex Index number of the column we're inserting/deleting before + * @param integer $pNumCols Number of columns to insert/delete (negative values indicate deletion) + * @param integer $beforeRow Number of the row we're inserting/deleting before + * @param integer $pNumRows Number of rows to insert/delete (negative values indicate deletion) + */ + protected function adjustHyperlinks($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows) + { + $aHyperlinkCollection = $pSheet->getHyperlinkCollection(); + ($pNumCols > 0 || $pNumRows > 0) ? uksort($aHyperlinkCollection, array('PHPExcel_ReferenceHelper','cellReverseSort')) : uksort($aHyperlinkCollection, array('PHPExcel_ReferenceHelper','cellSort')); + + foreach ($aHyperlinkCollection as $key => $value) { + $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows); + if ($key != $newReference) { + $pSheet->setHyperlink($newReference, $value); + $pSheet->setHyperlink($key, null); + } + } + } + + /** + * Update data validations when inserting/deleting rows/columns + * + * @param PHPExcel_Worksheet $pSheet The worksheet that we're editing + * @param string $pBefore Insert/Delete before this cell address (e.g. 'A1') + * @param integer $beforeColumnIndex Index number of the column we're inserting/deleting before + * @param integer $pNumCols Number of columns to insert/delete (negative values indicate deletion) + * @param integer $beforeRow Number of the row we're inserting/deleting before + * @param integer $pNumRows Number of rows to insert/delete (negative values indicate deletion) + */ + protected function adjustDataValidations($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows) + { + $aDataValidationCollection = $pSheet->getDataValidationCollection(); + ($pNumCols > 0 || $pNumRows > 0) ? uksort($aDataValidationCollection, array('PHPExcel_ReferenceHelper','cellReverseSort')) : uksort($aDataValidationCollection, array('PHPExcel_ReferenceHelper','cellSort')); + + foreach ($aDataValidationCollection as $key => $value) { + $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows); + if ($key != $newReference) { + $pSheet->setDataValidation($newReference, $value); + $pSheet->setDataValidation($key, null); + } + } + } + + /** + * Update merged cells when inserting/deleting rows/columns + * + * @param PHPExcel_Worksheet $pSheet The worksheet that we're editing + * @param string $pBefore Insert/Delete before this cell address (e.g. 'A1') + * @param integer $beforeColumnIndex Index number of the column we're inserting/deleting before + * @param integer $pNumCols Number of columns to insert/delete (negative values indicate deletion) + * @param integer $beforeRow Number of the row we're inserting/deleting before + * @param integer $pNumRows Number of rows to insert/delete (negative values indicate deletion) + */ + protected function adjustMergeCells($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows) + { + $aMergeCells = $pSheet->getMergeCells(); + $aNewMergeCells = array(); // the new array of all merge cells + foreach ($aMergeCells as $key => &$value) { + $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows); + $aNewMergeCells[$newReference] = $newReference; + } + $pSheet->setMergeCells($aNewMergeCells); // replace the merge cells array + } + + /** + * Update protected cells when inserting/deleting rows/columns + * + * @param PHPExcel_Worksheet $pSheet The worksheet that we're editing + * @param string $pBefore Insert/Delete before this cell address (e.g. 'A1') + * @param integer $beforeColumnIndex Index number of the column we're inserting/deleting before + * @param integer $pNumCols Number of columns to insert/delete (negative values indicate deletion) + * @param integer $beforeRow Number of the row we're inserting/deleting before + * @param integer $pNumRows Number of rows to insert/delete (negative values indicate deletion) + */ + protected function adjustProtectedCells($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows) + { + $aProtectedCells = $pSheet->getProtectedCells(); + ($pNumCols > 0 || $pNumRows > 0) ? + uksort($aProtectedCells, array('PHPExcel_ReferenceHelper','cellReverseSort')) : + uksort($aProtectedCells, array('PHPExcel_ReferenceHelper','cellSort')); + foreach ($aProtectedCells as $key => $value) { + $newReference = $this->updateCellReference($key, $pBefore, $pNumCols, $pNumRows); + if ($key != $newReference) { + $pSheet->protectCells($newReference, $value, true); + $pSheet->unprotectCells($key); + } + } + } + + /** + * Update column dimensions when inserting/deleting rows/columns + * + * @param PHPExcel_Worksheet $pSheet The worksheet that we're editing + * @param string $pBefore Insert/Delete before this cell address (e.g. 'A1') + * @param integer $beforeColumnIndex Index number of the column we're inserting/deleting before + * @param integer $pNumCols Number of columns to insert/delete (negative values indicate deletion) + * @param integer $beforeRow Number of the row we're inserting/deleting before + * @param integer $pNumRows Number of rows to insert/delete (negative values indicate deletion) + */ + protected function adjustColumnDimensions($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows) + { + $aColumnDimensions = array_reverse($pSheet->getColumnDimensions(), true); + if (!empty($aColumnDimensions)) { + foreach ($aColumnDimensions as $objColumnDimension) { + $newReference = $this->updateCellReference($objColumnDimension->getColumnIndex() . '1', $pBefore, $pNumCols, $pNumRows); + list($newReference) = PHPExcel_Cell::coordinateFromString($newReference); + if ($objColumnDimension->getColumnIndex() != $newReference) { + $objColumnDimension->setColumnIndex($newReference); + } + } + $pSheet->refreshColumnDimensions(); + } + } + + /** + * Update row dimensions when inserting/deleting rows/columns + * + * @param PHPExcel_Worksheet $pSheet The worksheet that we're editing + * @param string $pBefore Insert/Delete before this cell address (e.g. 'A1') + * @param integer $beforeColumnIndex Index number of the column we're inserting/deleting before + * @param integer $pNumCols Number of columns to insert/delete (negative values indicate deletion) + * @param integer $beforeRow Number of the row we're inserting/deleting before + * @param integer $pNumRows Number of rows to insert/delete (negative values indicate deletion) + */ + protected function adjustRowDimensions($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows) + { + $aRowDimensions = array_reverse($pSheet->getRowDimensions(), true); + if (!empty($aRowDimensions)) { + foreach ($aRowDimensions as $objRowDimension) { + $newReference = $this->updateCellReference('A' . $objRowDimension->getRowIndex(), $pBefore, $pNumCols, $pNumRows); + list(, $newReference) = PHPExcel_Cell::coordinateFromString($newReference); + if ($objRowDimension->getRowIndex() != $newReference) { + $objRowDimension->setRowIndex($newReference); + } + } + $pSheet->refreshRowDimensions(); + + $copyDimension = $pSheet->getRowDimension($beforeRow - 1); + for ($i = $beforeRow; $i <= $beforeRow - 1 + $pNumRows; ++$i) { + $newDimension = $pSheet->getRowDimension($i); + $newDimension->setRowHeight($copyDimension->getRowHeight()); + $newDimension->setVisible($copyDimension->getVisible()); + $newDimension->setOutlineLevel($copyDimension->getOutlineLevel()); + $newDimension->setCollapsed($copyDimension->getCollapsed()); + } + } + } + + /** + * Insert a new column or row, updating all possible related data + * + * @param string $pBefore Insert before this cell address (e.g. 'A1') + * @param integer $pNumCols Number of columns to insert/delete (negative values indicate deletion) + * @param integer $pNumRows Number of rows to insert/delete (negative values indicate deletion) + * @param PHPExcel_Worksheet $pSheet The worksheet that we're editing + * @throws PHPExcel_Exception + */ + public function insertNewBefore($pBefore = 'A1', $pNumCols = 0, $pNumRows = 0, PHPExcel_Worksheet $pSheet = null) + { + $remove = ($pNumCols < 0 || $pNumRows < 0); + $aCellCollection = $pSheet->getCellCollection(); + + // Get coordinates of $pBefore + $beforeColumn = 'A'; + $beforeRow = 1; + list($beforeColumn, $beforeRow) = PHPExcel_Cell::coordinateFromString($pBefore); + $beforeColumnIndex = PHPExcel_Cell::columnIndexFromString($beforeColumn); + + // Clear cells if we are removing columns or rows + $highestColumn = $pSheet->getHighestColumn(); + $highestRow = $pSheet->getHighestRow(); + + // 1. Clear column strips if we are removing columns + if ($pNumCols < 0 && $beforeColumnIndex - 2 + $pNumCols > 0) { + for ($i = 1; $i <= $highestRow - 1; ++$i) { + for ($j = $beforeColumnIndex - 1 + $pNumCols; $j <= $beforeColumnIndex - 2; ++$j) { + $coordinate = PHPExcel_Cell::stringFromColumnIndex($j) . $i; + $pSheet->removeConditionalStyles($coordinate); + if ($pSheet->cellExists($coordinate)) { + $pSheet->getCell($coordinate)->setValueExplicit('', PHPExcel_Cell_DataType::TYPE_NULL); + $pSheet->getCell($coordinate)->setXfIndex(0); + } + } + } + } + + // 2. Clear row strips if we are removing rows + if ($pNumRows < 0 && $beforeRow - 1 + $pNumRows > 0) { + for ($i = $beforeColumnIndex - 1; $i <= PHPExcel_Cell::columnIndexFromString($highestColumn) - 1; ++$i) { + for ($j = $beforeRow + $pNumRows; $j <= $beforeRow - 1; ++$j) { + $coordinate = PHPExcel_Cell::stringFromColumnIndex($i) . $j; + $pSheet->removeConditionalStyles($coordinate); + if ($pSheet->cellExists($coordinate)) { + $pSheet->getCell($coordinate)->setValueExplicit('', PHPExcel_Cell_DataType::TYPE_NULL); + $pSheet->getCell($coordinate)->setXfIndex(0); + } + } + } + } + + // Loop through cells, bottom-up, and change cell coordinates + if ($remove) { + // It's faster to reverse and pop than to use unshift, especially with large cell collections + $aCellCollection = array_reverse($aCellCollection); + } + while ($cellID = array_pop($aCellCollection)) { + $cell = $pSheet->getCell($cellID); + $cellIndex = PHPExcel_Cell::columnIndexFromString($cell->getColumn()); + + if ($cellIndex-1 + $pNumCols < 0) { + continue; + } + + // New coordinates + $newCoordinates = PHPExcel_Cell::stringFromColumnIndex($cellIndex-1 + $pNumCols) . ($cell->getRow() + $pNumRows); + + // Should the cell be updated? Move value and cellXf index from one cell to another. + if (($cellIndex >= $beforeColumnIndex) && ($cell->getRow() >= $beforeRow)) { + // Update cell styles + $pSheet->getCell($newCoordinates)->setXfIndex($cell->getXfIndex()); + + // Insert this cell at its new location + if ($cell->getDataType() == PHPExcel_Cell_DataType::TYPE_FORMULA) { + // Formula should be adjusted + $pSheet->getCell($newCoordinates) + ->setValue($this->updateFormulaReferences($cell->getValue(), $pBefore, $pNumCols, $pNumRows, $pSheet->getTitle())); + } else { + // Formula should not be adjusted + $pSheet->getCell($newCoordinates)->setValue($cell->getValue()); + } + + // Clear the original cell + $pSheet->getCellCacheController()->deleteCacheData($cellID); + } else { + /* We don't need to update styles for rows/columns before our insertion position, + but we do still need to adjust any formulae in those cells */ + if ($cell->getDataType() == PHPExcel_Cell_DataType::TYPE_FORMULA) { + // Formula should be adjusted + $cell->setValue($this->updateFormulaReferences($cell->getValue(), $pBefore, $pNumCols, $pNumRows, $pSheet->getTitle())); + } + + } + } + + // Duplicate styles for the newly inserted cells + $highestColumn = $pSheet->getHighestColumn(); + $highestRow = $pSheet->getHighestRow(); + + if ($pNumCols > 0 && $beforeColumnIndex - 2 > 0) { + for ($i = $beforeRow; $i <= $highestRow - 1; ++$i) { + // Style + $coordinate = PHPExcel_Cell::stringFromColumnIndex($beforeColumnIndex - 2) . $i; + if ($pSheet->cellExists($coordinate)) { + $xfIndex = $pSheet->getCell($coordinate)->getXfIndex(); + $conditionalStyles = $pSheet->conditionalStylesExists($coordinate) ? + $pSheet->getConditionalStyles($coordinate) : false; + for ($j = $beforeColumnIndex - 1; $j <= $beforeColumnIndex - 2 + $pNumCols; ++$j) { + $pSheet->getCellByColumnAndRow($j, $i)->setXfIndex($xfIndex); + if ($conditionalStyles) { + $cloned = array(); + foreach ($conditionalStyles as $conditionalStyle) { + $cloned[] = clone $conditionalStyle; + } + $pSheet->setConditionalStyles(PHPExcel_Cell::stringFromColumnIndex($j) . $i, $cloned); + } + } + } + + } + } + + if ($pNumRows > 0 && $beforeRow - 1 > 0) { + for ($i = $beforeColumnIndex - 1; $i <= PHPExcel_Cell::columnIndexFromString($highestColumn) - 1; ++$i) { + // Style + $coordinate = PHPExcel_Cell::stringFromColumnIndex($i) . ($beforeRow - 1); + if ($pSheet->cellExists($coordinate)) { + $xfIndex = $pSheet->getCell($coordinate)->getXfIndex(); + $conditionalStyles = $pSheet->conditionalStylesExists($coordinate) ? + $pSheet->getConditionalStyles($coordinate) : false; + for ($j = $beforeRow; $j <= $beforeRow - 1 + $pNumRows; ++$j) { + $pSheet->getCell(PHPExcel_Cell::stringFromColumnIndex($i) . $j)->setXfIndex($xfIndex); + if ($conditionalStyles) { + $cloned = array(); + foreach ($conditionalStyles as $conditionalStyle) { + $cloned[] = clone $conditionalStyle; + } + $pSheet->setConditionalStyles(PHPExcel_Cell::stringFromColumnIndex($i) . $j, $cloned); + } + } + } + } + } + + // Update worksheet: column dimensions + $this->adjustColumnDimensions($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows); + + // Update worksheet: row dimensions + $this->adjustRowDimensions($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows); + + // Update worksheet: page breaks + $this->adjustPageBreaks($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows); + + // Update worksheet: comments + $this->adjustComments($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows); + + // Update worksheet: hyperlinks + $this->adjustHyperlinks($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows); + + // Update worksheet: data validations + $this->adjustDataValidations($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows); + + // Update worksheet: merge cells + $this->adjustMergeCells($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows); + + // Update worksheet: protected cells + $this->adjustProtectedCells($pSheet, $pBefore, $beforeColumnIndex, $pNumCols, $beforeRow, $pNumRows); + + // Update worksheet: autofilter + $autoFilter = $pSheet->getAutoFilter(); + $autoFilterRange = $autoFilter->getRange(); + if (!empty($autoFilterRange)) { + if ($pNumCols != 0) { + $autoFilterColumns = array_keys($autoFilter->getColumns()); + if (count($autoFilterColumns) > 0) { + sscanf($pBefore, '%[A-Z]%d', $column, $row); + $columnIndex = PHPExcel_Cell::columnIndexFromString($column); + list($rangeStart, $rangeEnd) = PHPExcel_Cell::rangeBoundaries($autoFilterRange); + if ($columnIndex <= $rangeEnd[0]) { + if ($pNumCols < 0) { + // If we're actually deleting any columns that fall within the autofilter range, + // then we delete any rules for those columns + $deleteColumn = $columnIndex + $pNumCols - 1; + $deleteCount = abs($pNumCols); + for ($i = 1; $i <= $deleteCount; ++$i) { + if (in_array(PHPExcel_Cell::stringFromColumnIndex($deleteColumn), $autoFilterColumns)) { + $autoFilter->clearColumn(PHPExcel_Cell::stringFromColumnIndex($deleteColumn)); + } + ++$deleteColumn; + } + } + $startCol = ($columnIndex > $rangeStart[0]) ? $columnIndex : $rangeStart[0]; + + // Shuffle columns in autofilter range + if ($pNumCols > 0) { + // For insert, we shuffle from end to beginning to avoid overwriting + $startColID = PHPExcel_Cell::stringFromColumnIndex($startCol-1); + $toColID = PHPExcel_Cell::stringFromColumnIndex($startCol+$pNumCols-1); + $endColID = PHPExcel_Cell::stringFromColumnIndex($rangeEnd[0]); + + $startColRef = $startCol; + $endColRef = $rangeEnd[0]; + $toColRef = $rangeEnd[0]+$pNumCols; + + do { + $autoFilter->shiftColumn(PHPExcel_Cell::stringFromColumnIndex($endColRef-1), PHPExcel_Cell::stringFromColumnIndex($toColRef-1)); + --$endColRef; + --$toColRef; + } while ($startColRef <= $endColRef); + } else { + // For delete, we shuffle from beginning to end to avoid overwriting + $startColID = PHPExcel_Cell::stringFromColumnIndex($startCol-1); + $toColID = PHPExcel_Cell::stringFromColumnIndex($startCol+$pNumCols-1); + $endColID = PHPExcel_Cell::stringFromColumnIndex($rangeEnd[0]); + do { + $autoFilter->shiftColumn($startColID, $toColID); + ++$startColID; + ++$toColID; + } while ($startColID != $endColID); + } + } + } + } + $pSheet->setAutoFilter($this->updateCellReference($autoFilterRange, $pBefore, $pNumCols, $pNumRows)); + } + + // Update worksheet: freeze pane + if ($pSheet->getFreezePane() != '') { + $pSheet->freezePane($this->updateCellReference($pSheet->getFreezePane(), $pBefore, $pNumCols, $pNumRows)); + } + + // Page setup + if ($pSheet->getPageSetup()->isPrintAreaSet()) { + $pSheet->getPageSetup()->setPrintArea($this->updateCellReference($pSheet->getPageSetup()->getPrintArea(), $pBefore, $pNumCols, $pNumRows)); + } + + // Update worksheet: drawings + $aDrawings = $pSheet->getDrawingCollection(); + foreach ($aDrawings as $objDrawing) { + $newReference = $this->updateCellReference($objDrawing->getCoordinates(), $pBefore, $pNumCols, $pNumRows); + if ($objDrawing->getCoordinates() != $newReference) { + $objDrawing->setCoordinates($newReference); + } + } + + // Update workbook: named ranges + if (count($pSheet->getParent()->getNamedRanges()) > 0) { + foreach ($pSheet->getParent()->getNamedRanges() as $namedRange) { + if ($namedRange->getWorksheet()->getHashCode() == $pSheet->getHashCode()) { + $namedRange->setRange($this->updateCellReference($namedRange->getRange(), $pBefore, $pNumCols, $pNumRows)); + } + } + } + + // Garbage collect + $pSheet->garbageCollect(); + } + + /** + * Update references within formulas + * + * @param string $pFormula Formula to update + * @param int $pBefore Insert before this one + * @param int $pNumCols Number of columns to insert + * @param int $pNumRows Number of rows to insert + * @param string $sheetName Worksheet name/title + * @return string Updated formula + * @throws PHPExcel_Exception + */ + public function updateFormulaReferences($pFormula = '', $pBefore = 'A1', $pNumCols = 0, $pNumRows = 0, $sheetName = '') + { + // Update cell references in the formula + $formulaBlocks = explode('"', $pFormula); + $i = false; + foreach ($formulaBlocks as &$formulaBlock) { + // Ignore blocks that were enclosed in quotes (alternating entries in the $formulaBlocks array after the explode) + if ($i = !$i) { + $adjustCount = 0; + $newCellTokens = $cellTokens = array(); + // Search for row ranges (e.g. 'Sheet1'!3:5 or 3:5) with or without $ absolutes (e.g. $3:5) + $matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_ROWRANGE.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER); + if ($matchCount > 0) { + foreach ($matches as $match) { + $fromString = ($match[2] > '') ? $match[2].'!' : ''; + $fromString .= $match[3].':'.$match[4]; + $modified3 = substr($this->updateCellReference('$A'.$match[3], $pBefore, $pNumCols, $pNumRows), 2); + $modified4 = substr($this->updateCellReference('$A'.$match[4], $pBefore, $pNumCols, $pNumRows), 2); + + if ($match[3].':'.$match[4] !== $modified3.':'.$modified4) { + if (($match[2] == '') || (trim($match[2], "'") == $sheetName)) { + $toString = ($match[2] > '') ? $match[2].'!' : ''; + $toString .= $modified3.':'.$modified4; + // Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more + $column = 100000; + $row = 10000000 + trim($match[3], '$'); + $cellIndex = $column.$row; + + $newCellTokens[$cellIndex] = preg_quote($toString); + $cellTokens[$cellIndex] = '/(?<!\d\$\!)'.preg_quote($fromString).'(?!\d)/i'; + ++$adjustCount; + } + } + } + } + // Search for column ranges (e.g. 'Sheet1'!C:E or C:E) with or without $ absolutes (e.g. $C:E) + $matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_COLRANGE.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER); + if ($matchCount > 0) { + foreach ($matches as $match) { + $fromString = ($match[2] > '') ? $match[2].'!' : ''; + $fromString .= $match[3].':'.$match[4]; + $modified3 = substr($this->updateCellReference($match[3].'$1', $pBefore, $pNumCols, $pNumRows), 0, -2); + $modified4 = substr($this->updateCellReference($match[4].'$1', $pBefore, $pNumCols, $pNumRows), 0, -2); + + if ($match[3].':'.$match[4] !== $modified3.':'.$modified4) { + if (($match[2] == '') || (trim($match[2], "'") == $sheetName)) { + $toString = ($match[2] > '') ? $match[2].'!' : ''; + $toString .= $modified3.':'.$modified4; + // Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more + $column = PHPExcel_Cell::columnIndexFromString(trim($match[3], '$')) + 100000; + $row = 10000000; + $cellIndex = $column.$row; + + $newCellTokens[$cellIndex] = preg_quote($toString); + $cellTokens[$cellIndex] = '/(?<![A-Z\$\!])'.preg_quote($fromString).'(?![A-Z])/i'; + ++$adjustCount; + } + } + } + } + // Search for cell ranges (e.g. 'Sheet1'!A3:C5 or A3:C5) with or without $ absolutes (e.g. $A1:C$5) + $matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_CELLRANGE.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER); + if ($matchCount > 0) { + foreach ($matches as $match) { + $fromString = ($match[2] > '') ? $match[2].'!' : ''; + $fromString .= $match[3].':'.$match[4]; + $modified3 = $this->updateCellReference($match[3], $pBefore, $pNumCols, $pNumRows); + $modified4 = $this->updateCellReference($match[4], $pBefore, $pNumCols, $pNumRows); + + if ($match[3].$match[4] !== $modified3.$modified4) { + if (($match[2] == '') || (trim($match[2], "'") == $sheetName)) { + $toString = ($match[2] > '') ? $match[2].'!' : ''; + $toString .= $modified3.':'.$modified4; + list($column, $row) = PHPExcel_Cell::coordinateFromString($match[3]); + // Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more + $column = PHPExcel_Cell::columnIndexFromString(trim($column, '$')) + 100000; + $row = trim($row, '$') + 10000000; + $cellIndex = $column.$row; + + $newCellTokens[$cellIndex] = preg_quote($toString); + $cellTokens[$cellIndex] = '/(?<![A-Z]\$\!)'.preg_quote($fromString).'(?!\d)/i'; + ++$adjustCount; + } + } + } + } + // Search for cell references (e.g. 'Sheet1'!A3 or C5) with or without $ absolutes (e.g. $A1 or C$5) + $matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_CELLREF.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER); + + if ($matchCount > 0) { + foreach ($matches as $match) { + $fromString = ($match[2] > '') ? $match[2].'!' : ''; + $fromString .= $match[3]; + + $modified3 = $this->updateCellReference($match[3], $pBefore, $pNumCols, $pNumRows); + if ($match[3] !== $modified3) { + if (($match[2] == '') || (trim($match[2], "'") == $sheetName)) { + $toString = ($match[2] > '') ? $match[2].'!' : ''; + $toString .= $modified3; + list($column, $row) = PHPExcel_Cell::coordinateFromString($match[3]); + // Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more + $column = PHPExcel_Cell::columnIndexFromString(trim($column, '$')) + 100000; + $row = trim($row, '$') + 10000000; + $cellIndex = $row . $column; + + $newCellTokens[$cellIndex] = preg_quote($toString); + $cellTokens[$cellIndex] = '/(?<![A-Z\$\!])'.preg_quote($fromString).'(?!\d)/i'; + ++$adjustCount; + } + } + } + } + if ($adjustCount > 0) { + if ($pNumCols > 0 || $pNumRows > 0) { + krsort($cellTokens); + krsort($newCellTokens); + } else { + ksort($cellTokens); + ksort($newCellTokens); + } // Update cell references in the formula + $formulaBlock = str_replace('\\', '', preg_replace($cellTokens, $newCellTokens, $formulaBlock)); + } + } + } + unset($formulaBlock); + + // Then rebuild the formula string + return implode('"', $formulaBlocks); + } + + /** + * Update cell reference + * + * @param string $pCellRange Cell range + * @param int $pBefore Insert before this one + * @param int $pNumCols Number of columns to increment + * @param int $pNumRows Number of rows to increment + * @return string Updated cell range + * @throws PHPExcel_Exception + */ + public function updateCellReference($pCellRange = 'A1', $pBefore = 'A1', $pNumCols = 0, $pNumRows = 0) + { + // Is it in another worksheet? Will not have to update anything. + if (strpos($pCellRange, "!") !== false) { + return $pCellRange; + // Is it a range or a single cell? + } elseif (strpos($pCellRange, ':') === false && strpos($pCellRange, ',') === false) { + // Single cell + return $this->updateSingleCellReference($pCellRange, $pBefore, $pNumCols, $pNumRows); + } elseif (strpos($pCellRange, ':') !== false || strpos($pCellRange, ',') !== false) { + // Range + return $this->updateCellRange($pCellRange, $pBefore, $pNumCols, $pNumRows); + } else { + // Return original + return $pCellRange; + } + } + + /** + * Update named formulas (i.e. containing worksheet references / named ranges) + * + * @param PHPExcel $pPhpExcel Object to update + * @param string $oldName Old name (name to replace) + * @param string $newName New name + */ + public function updateNamedFormulas(PHPExcel $pPhpExcel, $oldName = '', $newName = '') + { + if ($oldName == '') { + return; + } + + foreach ($pPhpExcel->getWorksheetIterator() as $sheet) { + foreach ($sheet->getCellCollection(false) as $cellID) { + $cell = $sheet->getCell($cellID); + if (($cell !== null) && ($cell->getDataType() == PHPExcel_Cell_DataType::TYPE_FORMULA)) { + $formula = $cell->getValue(); + if (strpos($formula, $oldName) !== false) { + $formula = str_replace("'" . $oldName . "'!", "'" . $newName . "'!", $formula); + $formula = str_replace($oldName . "!", $newName . "!", $formula); + $cell->setValueExplicit($formula, PHPExcel_Cell_DataType::TYPE_FORMULA); + } + } + } + } + } + + /** + * Update cell range + * + * @param string $pCellRange Cell range (e.g. 'B2:D4', 'B:C' or '2:3') + * @param int $pBefore Insert before this one + * @param int $pNumCols Number of columns to increment + * @param int $pNumRows Number of rows to increment + * @return string Updated cell range + * @throws PHPExcel_Exception + */ + private function updateCellRange($pCellRange = 'A1:A1', $pBefore = 'A1', $pNumCols = 0, $pNumRows = 0) + { + if (strpos($pCellRange, ':') !== false || strpos($pCellRange, ',') !== false) { + // Update range + $range = PHPExcel_Cell::splitRange($pCellRange); + $ic = count($range); + for ($i = 0; $i < $ic; ++$i) { + $jc = count($range[$i]); + for ($j = 0; $j < $jc; ++$j) { + if (ctype_alpha($range[$i][$j])) { + $r = PHPExcel_Cell::coordinateFromString($this->updateSingleCellReference($range[$i][$j].'1', $pBefore, $pNumCols, $pNumRows)); + $range[$i][$j] = $r[0]; + } elseif (ctype_digit($range[$i][$j])) { + $r = PHPExcel_Cell::coordinateFromString($this->updateSingleCellReference('A'.$range[$i][$j], $pBefore, $pNumCols, $pNumRows)); + $range[$i][$j] = $r[1]; + } else { + $range[$i][$j] = $this->updateSingleCellReference($range[$i][$j], $pBefore, $pNumCols, $pNumRows); + } + } + } + + // Recreate range string + return PHPExcel_Cell::buildRange($range); + } else { + throw new PHPExcel_Exception("Only cell ranges may be passed to this method."); + } + } + + /** + * Update single cell reference + * + * @param string $pCellReference Single cell reference + * @param int $pBefore Insert before this one + * @param int $pNumCols Number of columns to increment + * @param int $pNumRows Number of rows to increment + * @return string Updated cell reference + * @throws PHPExcel_Exception + */ + private function updateSingleCellReference($pCellReference = 'A1', $pBefore = 'A1', $pNumCols = 0, $pNumRows = 0) + { + if (strpos($pCellReference, ':') === false && strpos($pCellReference, ',') === false) { + // Get coordinates of $pBefore + list($beforeColumn, $beforeRow) = PHPExcel_Cell::coordinateFromString($pBefore); + + // Get coordinates of $pCellReference + list($newColumn, $newRow) = PHPExcel_Cell::coordinateFromString($pCellReference); + + // Verify which parts should be updated + $updateColumn = (($newColumn{0} != '$') && ($beforeColumn{0} != '$') && (PHPExcel_Cell::columnIndexFromString($newColumn) >= PHPExcel_Cell::columnIndexFromString($beforeColumn))); + $updateRow = (($newRow{0} != '$') && ($beforeRow{0} != '$') && $newRow >= $beforeRow); + + // Create new column reference + if ($updateColumn) { + $newColumn = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::columnIndexFromString($newColumn) - 1 + $pNumCols); + } + + // Create new row reference + if ($updateRow) { + $newRow = $newRow + $pNumRows; + } + + // Return new reference + return $newColumn . $newRow; + } else { + throw new PHPExcel_Exception("Only single cell references may be passed to this method."); + } + } + + /** + * __clone implementation. Cloning should not be allowed in a Singleton! + * + * @throws PHPExcel_Exception + */ + final public function __clone() + { + throw new PHPExcel_Exception("Cloning a Singleton is not allowed!"); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/RichText.php b/application/third_party/PHPExcel/PHPExcel/RichText.php new file mode 100644 index 0000000..74a3534 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/RichText.php @@ -0,0 +1,191 @@ +<?php + +/** + * PHPExcel_RichText + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_RichText + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_RichText implements PHPExcel_IComparable +{ + /** + * Rich text elements + * + * @var PHPExcel_RichText_ITextElement[] + */ + private $richTextElements; + + /** + * Create a new PHPExcel_RichText instance + * + * @param PHPExcel_Cell $pCell + * @throws PHPExcel_Exception + */ + public function __construct(PHPExcel_Cell $pCell = null) + { + // Initialise variables + $this->richTextElements = array(); + + // Rich-Text string attached to cell? + if ($pCell !== null) { + // Add cell text and style + if ($pCell->getValue() != "") { + $objRun = new PHPExcel_RichText_Run($pCell->getValue()); + $objRun->setFont(clone $pCell->getParent()->getStyle($pCell->getCoordinate())->getFont()); + $this->addText($objRun); + } + + // Set parent value + $pCell->setValueExplicit($this, PHPExcel_Cell_DataType::TYPE_STRING); + } + } + + /** + * Add text + * + * @param PHPExcel_RichText_ITextElement $pText Rich text element + * @throws PHPExcel_Exception + * @return PHPExcel_RichText + */ + public function addText(PHPExcel_RichText_ITextElement $pText = null) + { + $this->richTextElements[] = $pText; + return $this; + } + + /** + * Create text + * + * @param string $pText Text + * @return PHPExcel_RichText_TextElement + * @throws PHPExcel_Exception + */ + public function createText($pText = '') + { + $objText = new PHPExcel_RichText_TextElement($pText); + $this->addText($objText); + return $objText; + } + + /** + * Create text run + * + * @param string $pText Text + * @return PHPExcel_RichText_Run + * @throws PHPExcel_Exception + */ + public function createTextRun($pText = '') + { + $objText = new PHPExcel_RichText_Run($pText); + $this->addText($objText); + return $objText; + } + + /** + * Get plain text + * + * @return string + */ + public function getPlainText() + { + // Return value + $returnValue = ''; + + // Loop through all PHPExcel_RichText_ITextElement + foreach ($this->richTextElements as $text) { + $returnValue .= $text->getText(); + } + + // Return + return $returnValue; + } + + /** + * Convert to string + * + * @return string + */ + public function __toString() + { + return $this->getPlainText(); + } + + /** + * Get Rich Text elements + * + * @return PHPExcel_RichText_ITextElement[] + */ + public function getRichTextElements() + { + return $this->richTextElements; + } + + /** + * Set Rich Text elements + * + * @param PHPExcel_RichText_ITextElement[] $pElements Array of elements + * @throws PHPExcel_Exception + * @return PHPExcel_RichText + */ + public function setRichTextElements($pElements = null) + { + if (is_array($pElements)) { + $this->richTextElements = $pElements; + } else { + throw new PHPExcel_Exception("Invalid PHPExcel_RichText_ITextElement[] array passed."); + } + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + $hashElements = ''; + foreach ($this->richTextElements as $element) { + $hashElements .= $element->getHashCode(); + } + + return md5( + $hashElements . + __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/RichText/ITextElement.php b/application/third_party/PHPExcel/PHPExcel/RichText/ITextElement.php new file mode 100644 index 0000000..5db3432 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/RichText/ITextElement.php @@ -0,0 +1,56 @@ +<?php + +/** + * PHPExcel_RichText_ITextElement + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_RichText + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +interface PHPExcel_RichText_ITextElement +{ + /** + * Get text + * + * @return string Text + */ + public function getText(); + + /** + * Set text + * + * @param $pText string Text + * @return PHPExcel_RichText_ITextElement + */ + public function setText($pText = ''); + + /** + * Get font + * + * @return PHPExcel_Style_Font + */ + public function getFont(); + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode(); +} diff --git a/application/third_party/PHPExcel/PHPExcel/RichText/Run.php b/application/third_party/PHPExcel/PHPExcel/RichText/Run.php new file mode 100644 index 0000000..5737bb0 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/RichText/Run.php @@ -0,0 +1,98 @@ +<?php + +/** + * PHPExcel_RichText_Run + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_RichText + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_RichText_Run extends PHPExcel_RichText_TextElement implements PHPExcel_RichText_ITextElement +{ + /** + * Font + * + * @var PHPExcel_Style_Font + */ + private $font; + + /** + * Create a new PHPExcel_RichText_Run instance + * + * @param string $pText Text + */ + public function __construct($pText = '') + { + // Initialise variables + $this->setText($pText); + $this->font = new PHPExcel_Style_Font(); + } + + /** + * Get font + * + * @return PHPExcel_Style_Font + */ + public function getFont() + { + return $this->font; + } + + /** + * Set font + * + * @param PHPExcel_Style_Font $pFont Font + * @throws PHPExcel_Exception + * @return PHPExcel_RichText_ITextElement + */ + public function setFont(PHPExcel_Style_Font $pFont = null) + { + $this->font = $pFont; + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + return md5( + $this->getText() . + $this->font->getHashCode() . + __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/RichText/TextElement.php b/application/third_party/PHPExcel/PHPExcel/RichText/TextElement.php new file mode 100644 index 0000000..f86e703 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/RichText/TextElement.php @@ -0,0 +1,105 @@ +<?php + +/** + * PHPExcel_RichText_TextElement + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_RichText + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_RichText_TextElement implements PHPExcel_RichText_ITextElement +{ + /** + * Text + * + * @var string + */ + private $text; + + /** + * Create a new PHPExcel_RichText_TextElement instance + * + * @param string $pText Text + */ + public function __construct($pText = '') + { + // Initialise variables + $this->text = $pText; + } + + /** + * Get text + * + * @return string Text + */ + public function getText() + { + return $this->text; + } + + /** + * Set text + * + * @param $pText string Text + * @return PHPExcel_RichText_ITextElement + */ + public function setText($pText = '') + { + $this->text = $pText; + return $this; + } + + /** + * Get font + * + * @return PHPExcel_Style_Font + */ + public function getFont() + { + return null; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + return md5( + $this->text . + __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Settings.php b/application/third_party/PHPExcel/PHPExcel/Settings.php new file mode 100644 index 0000000..dcbc89f --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Settings.php @@ -0,0 +1,389 @@ +<?php + +/** PHPExcel root directory */ +if (!defined('PHPEXCEL_ROOT')) { + /** + * @ignore + */ + define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../'); + require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php'); +} + +/** + * PHPExcel_Settings + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Settings + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Settings +{ + /** constants */ + /** Available Zip library classes */ + const PCLZIP = 'PHPExcel_Shared_ZipArchive'; + const ZIPARCHIVE = 'ZipArchive'; + + /** Optional Chart Rendering libraries */ + const CHART_RENDERER_JPGRAPH = 'jpgraph'; + + /** Optional PDF Rendering libraries */ + const PDF_RENDERER_TCPDF = 'tcPDF'; + const PDF_RENDERER_DOMPDF = 'DomPDF'; + const PDF_RENDERER_MPDF = 'mPDF'; + + + private static $chartRenderers = array( + self::CHART_RENDERER_JPGRAPH, + ); + + private static $pdfRenderers = array( + self::PDF_RENDERER_TCPDF, + self::PDF_RENDERER_DOMPDF, + self::PDF_RENDERER_MPDF, + ); + + + /** + * Name of the class used for Zip file management + * e.g. + * ZipArchive + * + * @var string + */ + private static $zipClass = self::ZIPARCHIVE; + + + /** + * Name of the external Library used for rendering charts + * e.g. + * jpgraph + * + * @var string + */ + private static $chartRendererName; + + /** + * Directory Path to the external Library used for rendering charts + * + * @var string + */ + private static $chartRendererPath; + + + /** + * Name of the external Library used for rendering PDF files + * e.g. + * mPDF + * + * @var string + */ + private static $pdfRendererName; + + /** + * Directory Path to the external Library used for rendering PDF files + * + * @var string + */ + private static $pdfRendererPath; + + /** + * Default options for libxml loader + * + * @var int + */ + private static $libXmlLoaderOptions = null; + + /** + * Set the Zip handler Class that PHPExcel should use for Zip file management (PCLZip or ZipArchive) + * + * @param string $zipClass The Zip handler class that PHPExcel should use for Zip file management + * e.g. PHPExcel_Settings::PCLZip or PHPExcel_Settings::ZipArchive + * @return boolean Success or failure + */ + public static function setZipClass($zipClass) + { + if (($zipClass === self::PCLZIP) || + ($zipClass === self::ZIPARCHIVE)) { + self::$zipClass = $zipClass; + return true; + } + return false; + } + + + /** + * Return the name of the Zip handler Class that PHPExcel is configured to use (PCLZip or ZipArchive) + * or Zip file management + * + * @return string Name of the Zip handler Class that PHPExcel is configured to use + * for Zip file management + * e.g. PHPExcel_Settings::PCLZip or PHPExcel_Settings::ZipArchive + */ + public static function getZipClass() + { + return self::$zipClass; + } + + + /** + * Return the name of the method that is currently configured for cell cacheing + * + * @return string Name of the cacheing method + */ + public static function getCacheStorageMethod() + { + return PHPExcel_CachedObjectStorageFactory::getCacheStorageMethod(); + } + + + /** + * Return the name of the class that is currently being used for cell cacheing + * + * @return string Name of the class currently being used for cacheing + */ + public static function getCacheStorageClass() + { + return PHPExcel_CachedObjectStorageFactory::getCacheStorageClass(); + } + + + /** + * Set the method that should be used for cell cacheing + * + * @param string $method Name of the cacheing method + * @param array $arguments Optional configuration arguments for the cacheing method + * @return boolean Success or failure + */ + public static function setCacheStorageMethod($method = PHPExcel_CachedObjectStorageFactory::cache_in_memory, $arguments = array()) + { + return PHPExcel_CachedObjectStorageFactory::initialize($method, $arguments); + } + + + /** + * Set the locale code to use for formula translations and any special formatting + * + * @param string $locale The locale code to use (e.g. "fr" or "pt_br" or "en_uk") + * @return boolean Success or failure + */ + public static function setLocale($locale = 'en_us') + { + return PHPExcel_Calculation::getInstance()->setLocale($locale); + } + + + /** + * Set details of the external library that PHPExcel should use for rendering charts + * + * @param string $libraryName Internal reference name of the library + * e.g. PHPExcel_Settings::CHART_RENDERER_JPGRAPH + * @param string $libraryBaseDir Directory path to the library's base folder + * + * @return boolean Success or failure + */ + public static function setChartRenderer($libraryName, $libraryBaseDir) + { + if (!self::setChartRendererName($libraryName)) { + return false; + } + return self::setChartRendererPath($libraryBaseDir); + } + + + /** + * Identify to PHPExcel the external library to use for rendering charts + * + * @param string $libraryName Internal reference name of the library + * e.g. PHPExcel_Settings::CHART_RENDERER_JPGRAPH + * + * @return boolean Success or failure + */ + public static function setChartRendererName($libraryName) + { + if (!in_array($libraryName, self::$chartRenderers)) { + return false; + } + self::$chartRendererName = $libraryName; + + return true; + } + + + /** + * Tell PHPExcel where to find the external library to use for rendering charts + * + * @param string $libraryBaseDir Directory path to the library's base folder + * @return boolean Success or failure + */ + public static function setChartRendererPath($libraryBaseDir) + { + if ((file_exists($libraryBaseDir) === false) || (is_readable($libraryBaseDir) === false)) { + return false; + } + self::$chartRendererPath = $libraryBaseDir; + + return true; + } + + + /** + * Return the Chart Rendering Library that PHPExcel is currently configured to use (e.g. jpgraph) + * + * @return string|NULL Internal reference name of the Chart Rendering Library that PHPExcel is + * currently configured to use + * e.g. PHPExcel_Settings::CHART_RENDERER_JPGRAPH + */ + public static function getChartRendererName() + { + return self::$chartRendererName; + } + + + /** + * Return the directory path to the Chart Rendering Library that PHPExcel is currently configured to use + * + * @return string|NULL Directory Path to the Chart Rendering Library that PHPExcel is + * currently configured to use + */ + public static function getChartRendererPath() + { + return self::$chartRendererPath; + } + + + /** + * Set details of the external library that PHPExcel should use for rendering PDF files + * + * @param string $libraryName Internal reference name of the library + * e.g. PHPExcel_Settings::PDF_RENDERER_TCPDF, + * PHPExcel_Settings::PDF_RENDERER_DOMPDF + * or PHPExcel_Settings::PDF_RENDERER_MPDF + * @param string $libraryBaseDir Directory path to the library's base folder + * + * @return boolean Success or failure + */ + public static function setPdfRenderer($libraryName, $libraryBaseDir) + { + if (!self::setPdfRendererName($libraryName)) { + return false; + } + return self::setPdfRendererPath($libraryBaseDir); + } + + + /** + * Identify to PHPExcel the external library to use for rendering PDF files + * + * @param string $libraryName Internal reference name of the library + * e.g. PHPExcel_Settings::PDF_RENDERER_TCPDF, + * PHPExcel_Settings::PDF_RENDERER_DOMPDF + * or PHPExcel_Settings::PDF_RENDERER_MPDF + * + * @return boolean Success or failure + */ + public static function setPdfRendererName($libraryName) + { + if (!in_array($libraryName, self::$pdfRenderers)) { + return false; + } + self::$pdfRendererName = $libraryName; + + return true; + } + + + /** + * Tell PHPExcel where to find the external library to use for rendering PDF files + * + * @param string $libraryBaseDir Directory path to the library's base folder + * @return boolean Success or failure + */ + public static function setPdfRendererPath($libraryBaseDir) + { + if ((file_exists($libraryBaseDir) === false) || (is_readable($libraryBaseDir) === false)) { + return false; + } + self::$pdfRendererPath = $libraryBaseDir; + + return true; + } + + + /** + * Return the PDF Rendering Library that PHPExcel is currently configured to use (e.g. dompdf) + * + * @return string|NULL Internal reference name of the PDF Rendering Library that PHPExcel is + * currently configured to use + * e.g. PHPExcel_Settings::PDF_RENDERER_TCPDF, + * PHPExcel_Settings::PDF_RENDERER_DOMPDF + * or PHPExcel_Settings::PDF_RENDERER_MPDF + */ + public static function getPdfRendererName() + { + return self::$pdfRendererName; + } + + /** + * Return the directory path to the PDF Rendering Library that PHPExcel is currently configured to use + * + * @return string|NULL Directory Path to the PDF Rendering Library that PHPExcel is + * currently configured to use + */ + public static function getPdfRendererPath() + { + return self::$pdfRendererPath; + } + + /** + * Set options for libxml loader + * + * @param int $options Options for libxml loader + */ + public static function setLibXmlLoaderOptions($options = null) + { + if (is_null($options) && defined('LIBXML_DTDLOAD')) { + $options = LIBXML_DTDLOAD | LIBXML_DTDATTR; + } + if (version_compare(PHP_VERSION, '5.2.11') >= 0) { + @libxml_disable_entity_loader((bool) $options); + } + self::$libXmlLoaderOptions = $options; + } + + /** + * Get defined options for libxml loader. + * Defaults to LIBXML_DTDLOAD | LIBXML_DTDATTR when not set explicitly. + * + * @return int Default options for libxml loader + */ + public static function getLibXmlLoaderOptions() + { + if (is_null(self::$libXmlLoaderOptions) && defined('LIBXML_DTDLOAD')) { + self::setLibXmlLoaderOptions(LIBXML_DTDLOAD | LIBXML_DTDATTR); + } elseif (is_null(self::$libXmlLoaderOptions)) { + self::$libXmlLoaderOptions = true; + } + if (version_compare(PHP_VERSION, '5.2.11') >= 0) { + @libxml_disable_entity_loader((bool) self::$libXmlLoaderOptions); + } + return self::$libXmlLoaderOptions; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/CodePage.php b/application/third_party/PHPExcel/PHPExcel/Shared/CodePage.php new file mode 100644 index 0000000..b3e440e --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/CodePage.php @@ -0,0 +1,156 @@ +<?php + +/** + * PHPExcel_Shared_CodePage + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Shared_CodePage +{ + /** + * Convert Microsoft Code Page Identifier to Code Page Name which iconv + * and mbstring understands + * + * @param integer $codePage Microsoft Code Page Indentifier + * @return string Code Page Name + * @throws PHPExcel_Exception + */ + public static function NumberToName($codePage = 1252) + { + switch ($codePage) { + case 367: + return 'ASCII'; // ASCII + case 437: + return 'CP437'; // OEM US + case 720: + throw new PHPExcel_Exception('Code page 720 not supported.'); // OEM Arabic + case 737: + return 'CP737'; // OEM Greek + case 775: + return 'CP775'; // OEM Baltic + case 850: + return 'CP850'; // OEM Latin I + case 852: + return 'CP852'; // OEM Latin II (Central European) + case 855: + return 'CP855'; // OEM Cyrillic + case 857: + return 'CP857'; // OEM Turkish + case 858: + return 'CP858'; // OEM Multilingual Latin I with Euro + case 860: + return 'CP860'; // OEM Portugese + case 861: + return 'CP861'; // OEM Icelandic + case 862: + return 'CP862'; // OEM Hebrew + case 863: + return 'CP863'; // OEM Canadian (French) + case 864: + return 'CP864'; // OEM Arabic + case 865: + return 'CP865'; // OEM Nordic + case 866: + return 'CP866'; // OEM Cyrillic (Russian) + case 869: + return 'CP869'; // OEM Greek (Modern) + case 874: + return 'CP874'; // ANSI Thai + case 932: + return 'CP932'; // ANSI Japanese Shift-JIS + case 936: + return 'CP936'; // ANSI Chinese Simplified GBK + case 949: + return 'CP949'; // ANSI Korean (Wansung) + case 950: + return 'CP950'; // ANSI Chinese Traditional BIG5 + case 1200: + return 'UTF-16LE'; // UTF-16 (BIFF8) + case 1250: + return 'CP1250'; // ANSI Latin II (Central European) + case 1251: + return 'CP1251'; // ANSI Cyrillic + case 0: + // CodePage is not always correctly set when the xls file was saved by Apple's Numbers program + case 1252: + return 'CP1252'; // ANSI Latin I (BIFF4-BIFF7) + case 1253: + return 'CP1253'; // ANSI Greek + case 1254: + return 'CP1254'; // ANSI Turkish + case 1255: + return 'CP1255'; // ANSI Hebrew + case 1256: + return 'CP1256'; // ANSI Arabic + case 1257: + return 'CP1257'; // ANSI Baltic + case 1258: + return 'CP1258'; // ANSI Vietnamese + case 1361: + return 'CP1361'; // ANSI Korean (Johab) + case 10000: + return 'MAC'; // Apple Roman + case 10001: + return 'CP932'; // Macintosh Japanese + case 10002: + return 'CP950'; // Macintosh Chinese Traditional + case 10003: + return 'CP1361'; // Macintosh Korean + case 10004: + return 'MACARABIC'; // Apple Arabic + case 10005: + return 'MACHEBREW'; // Apple Hebrew + case 10006: + return 'MACGREEK'; // Macintosh Greek + case 10007: + return 'MACCYRILLIC'; // Macintosh Cyrillic + case 10008: + return 'CP936'; // Macintosh - Simplified Chinese (GB 2312) + case 10010: + return 'MACROMANIA'; // Macintosh Romania + case 10017: + return 'MACUKRAINE'; // Macintosh Ukraine + case 10021: + return 'MACTHAI'; // Macintosh Thai + case 10029: + return 'MACCENTRALEUROPE'; // Macintosh Central Europe + case 10079: + return 'MACICELAND'; // Macintosh Icelandic + case 10081: + return 'MACTURKISH'; // Macintosh Turkish + case 10082: + return 'MACCROATIAN'; // Macintosh Croatian + case 21010: + return 'UTF-16LE'; // UTF-16 (BIFF8) This isn't correct, but some Excel writer libraries erroneously use Codepage 21010 for UTF-16LE + case 32768: + return 'MAC'; // Apple Roman + case 32769: + throw new PHPExcel_Exception('Code page 32769 not supported.'); // ANSI Latin I (BIFF2-BIFF3) + case 65000: + return 'UTF-7'; // Unicode (UTF-7) + case 65001: + return 'UTF-8'; // Unicode (UTF-8) + } + throw new PHPExcel_Exception('Unknown codepage: ' . $codePage); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/Date.php b/application/third_party/PHPExcel/PHPExcel/Shared/Date.php new file mode 100644 index 0000000..b00a39a --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/Date.php @@ -0,0 +1,418 @@ +<?php + +/** + * PHPExcel_Shared_Date + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Shared_Date +{ + /** constants */ + const CALENDAR_WINDOWS_1900 = 1900; // Base date of 1st Jan 1900 = 1.0 + const CALENDAR_MAC_1904 = 1904; // Base date of 2nd Jan 1904 = 1.0 + + /* + * Names of the months of the year, indexed by shortname + * Planned usage for locale settings + * + * @public + * @var string[] + */ + public static $monthNames = array( + 'Jan' => 'January', + 'Feb' => 'February', + 'Mar' => 'March', + 'Apr' => 'April', + 'May' => 'May', + 'Jun' => 'June', + 'Jul' => 'July', + 'Aug' => 'August', + 'Sep' => 'September', + 'Oct' => 'October', + 'Nov' => 'November', + 'Dec' => 'December', + ); + + /* + * Names of the months of the year, indexed by shortname + * Planned usage for locale settings + * + * @public + * @var string[] + */ + public static $numberSuffixes = array( + 'st', + 'nd', + 'rd', + 'th', + ); + + /* + * Base calendar year to use for calculations + * + * @private + * @var int + */ + protected static $excelBaseDate = self::CALENDAR_WINDOWS_1900; + + /** + * Set the Excel calendar (Windows 1900 or Mac 1904) + * + * @param integer $baseDate Excel base date (1900 or 1904) + * @return boolean Success or failure + */ + public static function setExcelCalendar($baseDate) + { + if (($baseDate == self::CALENDAR_WINDOWS_1900) || + ($baseDate == self::CALENDAR_MAC_1904)) { + self::$excelBaseDate = $baseDate; + return true; + } + return false; + } + + + /** + * Return the Excel calendar (Windows 1900 or Mac 1904) + * + * @return integer Excel base date (1900 or 1904) + */ + public static function getExcelCalendar() + { + return self::$excelBaseDate; + } + + + /** + * Convert a date from Excel to PHP + * + * @param integer $dateValue Excel date/time value + * @param boolean $adjustToTimezone Flag indicating whether $dateValue should be treated as + * a UST timestamp, or adjusted to UST + * @param string $timezone The timezone for finding the adjustment from UST + * @return integer PHP serialized date/time + */ + public static function ExcelToPHP($dateValue = 0, $adjustToTimezone = false, $timezone = null) + { + if (self::$excelBaseDate == self::CALENDAR_WINDOWS_1900) { + $myexcelBaseDate = 25569; + // Adjust for the spurious 29-Feb-1900 (Day 60) + if ($dateValue < 60) { + --$myexcelBaseDate; + } + } else { + $myexcelBaseDate = 24107; + } + + // Perform conversion + if ($dateValue >= 1) { + $utcDays = $dateValue - $myexcelBaseDate; + $returnValue = round($utcDays * 86400); + if (($returnValue <= PHP_INT_MAX) && ($returnValue >= -PHP_INT_MAX)) { + $returnValue = (integer) $returnValue; + } + } else { + $hours = round($dateValue * 24); + $mins = round($dateValue * 1440) - round($hours * 60); + $secs = round($dateValue * 86400) - round($hours * 3600) - round($mins * 60); + $returnValue = (integer) gmmktime($hours, $mins, $secs); + } + + $timezoneAdjustment = ($adjustToTimezone) ? + PHPExcel_Shared_TimeZone::getTimezoneAdjustment($timezone, $returnValue) : + 0; + + return $returnValue + $timezoneAdjustment; + } + + + /** + * Convert a date from Excel to a PHP Date/Time object + * + * @param integer $dateValue Excel date/time value + * @return DateTime PHP date/time object + */ + public static function ExcelToPHPObject($dateValue = 0) + { + $dateTime = self::ExcelToPHP($dateValue); + $days = floor($dateTime / 86400); + $time = round((($dateTime / 86400) - $days) * 86400); + $hours = round($time / 3600); + $minutes = round($time / 60) - ($hours * 60); + $seconds = round($time) - ($hours * 3600) - ($minutes * 60); + + $dateObj = date_create('1-Jan-1970+'.$days.' days'); + $dateObj->setTime($hours, $minutes, $seconds); + + return $dateObj; + } + + + /** + * Convert a date from PHP to Excel + * + * @param mixed $dateValue PHP serialized date/time or date object + * @param boolean $adjustToTimezone Flag indicating whether $dateValue should be treated as + * a UST timestamp, or adjusted to UST + * @param string $timezone The timezone for finding the adjustment from UST + * @return mixed Excel date/time value + * or boolean FALSE on failure + */ + public static function PHPToExcel($dateValue = 0, $adjustToTimezone = false, $timezone = null) + { + $saveTimeZone = date_default_timezone_get(); + date_default_timezone_set('UTC'); + + $timezoneAdjustment = ($adjustToTimezone) ? + PHPExcel_Shared_TimeZone::getTimezoneAdjustment($timezone ? $timezone : $saveTimeZone, $dateValue) : + 0; + + $retValue = false; + if ((is_object($dateValue)) && ($dateValue instanceof DateTime)) { + $dateValue->add(new DateInterval('PT' . $timezoneAdjustment . 'S')); + $retValue = self::FormattedPHPToExcel($dateValue->format('Y'), $dateValue->format('m'), $dateValue->format('d'), $dateValue->format('H'), $dateValue->format('i'), $dateValue->format('s')); + } elseif (is_numeric($dateValue)) { + $dateValue += $timezoneAdjustment; + $retValue = self::FormattedPHPToExcel(date('Y', $dateValue), date('m', $dateValue), date('d', $dateValue), date('H', $dateValue), date('i', $dateValue), date('s', $dateValue)); + } elseif (is_string($dateValue)) { + $retValue = self::stringToExcel($dateValue); + } + date_default_timezone_set($saveTimeZone); + + return $retValue; + } + + + /** + * FormattedPHPToExcel + * + * @param integer $year + * @param integer $month + * @param integer $day + * @param integer $hours + * @param integer $minutes + * @param integer $seconds + * @return integer Excel date/time value + */ + public static function FormattedPHPToExcel($year, $month, $day, $hours = 0, $minutes = 0, $seconds = 0) + { + if (self::$excelBaseDate == self::CALENDAR_WINDOWS_1900) { + // + // Fudge factor for the erroneous fact that the year 1900 is treated as a Leap Year in MS Excel + // This affects every date following 28th February 1900 + // + $excel1900isLeapYear = true; + if (($year == 1900) && ($month <= 2)) { + $excel1900isLeapYear = false; + } + $myexcelBaseDate = 2415020; + } else { + $myexcelBaseDate = 2416481; + $excel1900isLeapYear = false; + } + + // Julian base date Adjustment + if ($month > 2) { + $month -= 3; + } else { + $month += 9; + --$year; + } + + // Calculate the Julian Date, then subtract the Excel base date (JD 2415020 = 31-Dec-1899 Giving Excel Date of 0) + $century = substr($year, 0, 2); + $decade = substr($year, 2, 2); + $excelDate = floor((146097 * $century) / 4) + floor((1461 * $decade) / 4) + floor((153 * $month + 2) / 5) + $day + 1721119 - $myexcelBaseDate + $excel1900isLeapYear; + + $excelTime = (($hours * 3600) + ($minutes * 60) + $seconds) / 86400; + + return (float) $excelDate + $excelTime; + } + + + /** + * Is a given cell a date/time? + * + * @param PHPExcel_Cell $pCell + * @return boolean + */ + public static function isDateTime(PHPExcel_Cell $pCell) + { + return self::isDateTimeFormat( + $pCell->getWorksheet()->getStyle( + $pCell->getCoordinate() + )->getNumberFormat() + ); + } + + + /** + * Is a given number format a date/time? + * + * @param PHPExcel_Style_NumberFormat $pFormat + * @return boolean + */ + public static function isDateTimeFormat(PHPExcel_Style_NumberFormat $pFormat) + { + return self::isDateTimeFormatCode($pFormat->getFormatCode()); + } + + + private static $possibleDateFormatCharacters = 'eymdHs'; + + /** + * Is a given number format code a date/time? + * + * @param string $pFormatCode + * @return boolean + */ + public static function isDateTimeFormatCode($pFormatCode = '') + { + if (strtolower($pFormatCode) === strtolower(PHPExcel_Style_NumberFormat::FORMAT_GENERAL)) { + // "General" contains an epoch letter 'e', so we trap for it explicitly here (case-insensitive check) + return false; + } + if (preg_match('/[0#]E[+-]0/i', $pFormatCode)) { + // Scientific format + return false; + } + + // Switch on formatcode + switch ($pFormatCode) { + // Explicitly defined date formats + case PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_DDMMYYYY: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYMINUS: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_DMMINUS: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_MYMINUS: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_DATETIME: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME1: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME2: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME3: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME5: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME6: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME7: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME8: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDDSLASH: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX14: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX15: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX16: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX17: + case PHPExcel_Style_NumberFormat::FORMAT_DATE_XLSX22: + return true; + } + + // Typically number, currency or accounting (or occasionally fraction) formats + if ((substr($pFormatCode, 0, 1) == '_') || (substr($pFormatCode, 0, 2) == '0 ')) { + return false; + } + // Try checking for any of the date formatting characters that don't appear within square braces + if (preg_match('/(^|\])[^\[]*['.self::$possibleDateFormatCharacters.']/i', $pFormatCode)) { + // We might also have a format mask containing quoted strings... + // we don't want to test for any of our characters within the quoted blocks + if (strpos($pFormatCode, '"') !== false) { + $segMatcher = false; + foreach (explode('"', $pFormatCode) as $subVal) { + // Only test in alternate array entries (the non-quoted blocks) + if (($segMatcher = !$segMatcher) && + (preg_match('/(^|\])[^\[]*['.self::$possibleDateFormatCharacters.']/i', $subVal))) { + return true; + } + } + return false; + } + return true; + } + + // No date... + return false; + } + + + /** + * Convert a date/time string to Excel time + * + * @param string $dateValue Examples: '2009-12-31', '2009-12-31 15:59', '2009-12-31 15:59:10' + * @return float|FALSE Excel date/time serial value + */ + public static function stringToExcel($dateValue = '') + { + if (strlen($dateValue) < 2) { + return false; + } + if (!preg_match('/^(\d{1,4}[ \.\/\-][A-Z]{3,9}([ \.\/\-]\d{1,4})?|[A-Z]{3,9}[ \.\/\-]\d{1,4}([ \.\/\-]\d{1,4})?|\d{1,4}[ \.\/\-]\d{1,4}([ \.\/\-]\d{1,4})?)( \d{1,2}:\d{1,2}(:\d{1,2})?)?$/iu', $dateValue)) { + return false; + } + + $dateValueNew = PHPExcel_Calculation_DateTime::DATEVALUE($dateValue); + + if ($dateValueNew === PHPExcel_Calculation_Functions::VALUE()) { + return false; + } + + if (strpos($dateValue, ':') !== false) { + $timeValue = PHPExcel_Calculation_DateTime::TIMEVALUE($dateValue); + if ($timeValue === PHPExcel_Calculation_Functions::VALUE()) { + return false; + } + $dateValueNew += $timeValue; + } + return $dateValueNew; + } + + /** + * Converts a month name (either a long or a short name) to a month number + * + * @param string $month Month name or abbreviation + * @return integer|string Month number (1 - 12), or the original string argument if it isn't a valid month name + */ + public static function monthStringToNumber($month) + { + $monthIndex = 1; + foreach (self::$monthNames as $shortMonthName => $longMonthName) { + if (($month === $longMonthName) || ($month === $shortMonthName)) { + return $monthIndex; + } + ++$monthIndex; + } + return $month; + } + + /** + * Strips an ordinal froma numeric value + * + * @param string $day Day number with an ordinal + * @return integer|string The integer value with any ordinal stripped, or the original string argument if it isn't a valid numeric + */ + public static function dayStringToNumber($day) + { + $strippedDayValue = (str_replace(self::$numberSuffixes, '', $day)); + if (is_numeric($strippedDayValue)) { + return (integer) $strippedDayValue; + } + return $day; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/Drawing.php b/application/third_party/PHPExcel/PHPExcel/Shared/Drawing.php new file mode 100644 index 0000000..3e027b4 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/Drawing.php @@ -0,0 +1,270 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ + + +/** + * PHPExcel_Shared_Drawing + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_Drawing +{ + /** + * Convert pixels to EMU + * + * @param int $pValue Value in pixels + * @return int Value in EMU + */ + public static function pixelsToEMU($pValue = 0) + { + return round($pValue * 9525); + } + + /** + * Convert EMU to pixels + * + * @param int $pValue Value in EMU + * @return int Value in pixels + */ + public static function EMUToPixels($pValue = 0) + { + if ($pValue != 0) { + return round($pValue / 9525); + } else { + return 0; + } + } + + /** + * Convert pixels to column width. Exact algorithm not known. + * By inspection of a real Excel file using Calibri 11, one finds 1000px ~ 142.85546875 + * This gives a conversion factor of 7. Also, we assume that pixels and font size are proportional. + * + * @param int $pValue Value in pixels + * @param PHPExcel_Style_Font $pDefaultFont Default font of the workbook + * @return int Value in cell dimension + */ + public static function pixelsToCellDimension($pValue = 0, PHPExcel_Style_Font $pDefaultFont) + { + // Font name and size + $name = $pDefaultFont->getName(); + $size = $pDefaultFont->getSize(); + + if (isset(PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size])) { + // Exact width can be determined + $colWidth = $pValue * PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size]['width'] / PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size]['px']; + } else { + // We don't have data for this particular font and size, use approximation by + // extrapolating from Calibri 11 + $colWidth = $pValue * 11 * PHPExcel_Shared_Font::$defaultColumnWidths['Calibri'][11]['width'] / PHPExcel_Shared_Font::$defaultColumnWidths['Calibri'][11]['px'] / $size; + } + + return $colWidth; + } + + /** + * Convert column width from (intrinsic) Excel units to pixels + * + * @param float $pValue Value in cell dimension + * @param PHPExcel_Style_Font $pDefaultFont Default font of the workbook + * @return int Value in pixels + */ + public static function cellDimensionToPixels($pValue = 0, PHPExcel_Style_Font $pDefaultFont) + { + // Font name and size + $name = $pDefaultFont->getName(); + $size = $pDefaultFont->getSize(); + + if (isset(PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size])) { + // Exact width can be determined + $colWidth = $pValue * PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size]['px'] / PHPExcel_Shared_Font::$defaultColumnWidths[$name][$size]['width']; + } else { + // We don't have data for this particular font and size, use approximation by + // extrapolating from Calibri 11 + $colWidth = $pValue * $size * PHPExcel_Shared_Font::$defaultColumnWidths['Calibri'][11]['px'] / PHPExcel_Shared_Font::$defaultColumnWidths['Calibri'][11]['width'] / 11; + } + + // Round pixels to closest integer + $colWidth = (int) round($colWidth); + + return $colWidth; + } + + /** + * Convert pixels to points + * + * @param int $pValue Value in pixels + * @return int Value in points + */ + public static function pixelsToPoints($pValue = 0) + { + return $pValue * 0.67777777; + } + + /** + * Convert points to pixels + * + * @param int $pValue Value in points + * @return int Value in pixels + */ + public static function pointsToPixels($pValue = 0) + { + if ($pValue != 0) { + return (int) ceil($pValue * 1.333333333); + } else { + return 0; + } + } + + /** + * Convert degrees to angle + * + * @param int $pValue Degrees + * @return int Angle + */ + public static function degreesToAngle($pValue = 0) + { + return (int)round($pValue * 60000); + } + + /** + * Convert angle to degrees + * + * @param int $pValue Angle + * @return int Degrees + */ + public static function angleToDegrees($pValue = 0) + { + if ($pValue != 0) { + return round($pValue / 60000); + } else { + return 0; + } + } + + /** + * Create a new image from file. By alexander at alexauto dot nl + * + * @link http://www.php.net/manual/en/function.imagecreatefromwbmp.php#86214 + * @param string $filename Path to Windows DIB (BMP) image + * @return resource + */ + public static function imagecreatefrombmp($p_sFile) + { + // Load the image into a string + $file = fopen($p_sFile, "rb"); + $read = fread($file, 10); + while (!feof($file) && ($read<>"")) { + $read .= fread($file, 1024); + } + + $temp = unpack("H*", $read); + $hex = $temp[1]; + $header = substr($hex, 0, 108); + + // Process the header + // Structure: http://www.fastgraph.com/help/bmp_header_format.html + if (substr($header, 0, 4)=="424d") { + // Cut it in parts of 2 bytes + $header_parts = str_split($header, 2); + + // Get the width 4 bytes + $width = hexdec($header_parts[19].$header_parts[18]); + + // Get the height 4 bytes + $height = hexdec($header_parts[23].$header_parts[22]); + + // Unset the header params + unset($header_parts); + } + + // Define starting X and Y + $x = 0; + $y = 1; + + // Create newimage + $image = imagecreatetruecolor($width, $height); + + // Grab the body from the image + $body = substr($hex, 108); + + // Calculate if padding at the end-line is needed + // Divided by two to keep overview. + // 1 byte = 2 HEX-chars + $body_size = (strlen($body)/2); + $header_size = ($width*$height); + + // Use end-line padding? Only when needed + $usePadding = ($body_size>($header_size*3)+4); + + // Using a for-loop with index-calculation instaid of str_split to avoid large memory consumption + // Calculate the next DWORD-position in the body + for ($i = 0; $i < $body_size; $i += 3) { + // Calculate line-ending and padding + if ($x >= $width) { + // If padding needed, ignore image-padding + // Shift i to the ending of the current 32-bit-block + if ($usePadding) { + $i += $width%4; + } + + // Reset horizontal position + $x = 0; + + // Raise the height-position (bottom-up) + $y++; + + // Reached the image-height? Break the for-loop + if ($y > $height) { + break; + } + } + + // Calculation of the RGB-pixel (defined as BGR in image-data) + // Define $i_pos as absolute position in the body + $i_pos = $i * 2; + $r = hexdec($body[$i_pos+4].$body[$i_pos+5]); + $g = hexdec($body[$i_pos+2].$body[$i_pos+3]); + $b = hexdec($body[$i_pos].$body[$i_pos+1]); + + // Calculate and draw the pixel + $color = imagecolorallocate($image, $r, $g, $b); + imagesetpixel($image, $x, $height-$y, $color); + + // Raise the horizontal position + $x++; + } + + // Unset the body / free the memory + unset($body); + + // Return image-object + return $image; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/Escher.php b/application/third_party/PHPExcel/PHPExcel/Shared/Escher.php new file mode 100644 index 0000000..1aedb9d --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/Escher.php @@ -0,0 +1,83 @@ +<?php + +/** + * PHPExcel_Shared_Escher + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Shared_Escher +{ + /** + * Drawing Group Container + * + * @var PHPExcel_Shared_Escher_DggContainer + */ + private $dggContainer; + + /** + * Drawing Container + * + * @var PHPExcel_Shared_Escher_DgContainer + */ + private $dgContainer; + + /** + * Get Drawing Group Container + * + * @return PHPExcel_Shared_Escher_DgContainer + */ + public function getDggContainer() + { + return $this->dggContainer; + } + + /** + * Set Drawing Group Container + * + * @param PHPExcel_Shared_Escher_DggContainer $dggContainer + */ + public function setDggContainer($dggContainer) + { + return $this->dggContainer = $dggContainer; + } + + /** + * Get Drawing Container + * + * @return PHPExcel_Shared_Escher_DgContainer + */ + public function getDgContainer() + { + return $this->dgContainer; + } + + /** + * Set Drawing Container + * + * @param PHPExcel_Shared_Escher_DgContainer $dgContainer + */ + public function setDgContainer($dgContainer) + { + return $this->dgContainer = $dgContainer; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/Escher/DgContainer.php b/application/third_party/PHPExcel/PHPExcel/Shared/Escher/DgContainer.php new file mode 100644 index 0000000..739cd90 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/Escher/DgContainer.php @@ -0,0 +1,75 @@ +<?php + +/** + * PHPExcel_Shared_Escher_DgContainer + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Shared_Escher_DgContainer +{ + /** + * Drawing index, 1-based. + * + * @var int + */ + private $dgId; + + /** + * Last shape index in this drawing + * + * @var int + */ + private $lastSpId; + + private $spgrContainer = null; + + public function getDgId() + { + return $this->dgId; + } + + public function setDgId($value) + { + $this->dgId = $value; + } + + public function getLastSpId() + { + return $this->lastSpId; + } + + public function setLastSpId($value) + { + $this->lastSpId = $value; + } + + public function getSpgrContainer() + { + return $this->spgrContainer; + } + + public function setSpgrContainer($spgrContainer) + { + return $this->spgrContainer = $spgrContainer; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer.php b/application/third_party/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer.php new file mode 100644 index 0000000..49e7d68 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer.php @@ -0,0 +1,102 @@ +<?php + +/** + * PHPExcel_Shared_Escher_DgContainer_SpgrContainer + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Shared_Escher_DgContainer_SpgrContainer +{ + /** + * Parent Shape Group Container + * + * @var PHPExcel_Shared_Escher_DgContainer_SpgrContainer + */ + private $parent; + + /** + * Shape Container collection + * + * @var array + */ + private $children = array(); + + /** + * Set parent Shape Group Container + * + * @param PHPExcel_Shared_Escher_DgContainer_SpgrContainer $parent + */ + public function setParent($parent) + { + $this->parent = $parent; + } + + /** + * Get the parent Shape Group Container if any + * + * @return PHPExcel_Shared_Escher_DgContainer_SpgrContainer|null + */ + public function getParent() + { + return $this->parent; + } + + /** + * Add a child. This will be either spgrContainer or spContainer + * + * @param mixed $child + */ + public function addChild($child) + { + $this->children[] = $child; + $child->setParent($this); + } + + /** + * Get collection of Shape Containers + */ + public function getChildren() + { + return $this->children; + } + + /** + * Recursively get all spContainers within this spgrContainer + * + * @return PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer[] + */ + public function getAllSpContainers() + { + $allSpContainers = array(); + + foreach ($this->children as $child) { + if ($child instanceof PHPExcel_Shared_Escher_DgContainer_SpgrContainer) { + $allSpContainers = array_merge($allSpContainers, $child->getAllSpContainers()); + } else { + $allSpContainers[] = $child; + } + } + + return $allSpContainers; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php b/application/third_party/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php new file mode 100644 index 0000000..a1f1a46 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php @@ -0,0 +1,388 @@ +<?php + +/** + * PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer +{ + /** + * Parent Shape Group Container + * + * @var PHPExcel_Shared_Escher_DgContainer_SpgrContainer + */ + private $parent; + + /** + * Is this a group shape? + * + * @var boolean + */ + private $spgr = false; + + /** + * Shape type + * + * @var int + */ + private $spType; + + /** + * Shape flag + * + * @var int + */ + private $spFlag; + + /** + * Shape index (usually group shape has index 0, and the rest: 1,2,3...) + * + * @var boolean + */ + private $spId; + + /** + * Array of options + * + * @var array + */ + private $OPT; + + /** + * Cell coordinates of upper-left corner of shape, e.g. 'A1' + * + * @var string + */ + private $startCoordinates; + + /** + * Horizontal offset of upper-left corner of shape measured in 1/1024 of column width + * + * @var int + */ + private $startOffsetX; + + /** + * Vertical offset of upper-left corner of shape measured in 1/256 of row height + * + * @var int + */ + private $startOffsetY; + + /** + * Cell coordinates of bottom-right corner of shape, e.g. 'B2' + * + * @var string + */ + private $endCoordinates; + + /** + * Horizontal offset of bottom-right corner of shape measured in 1/1024 of column width + * + * @var int + */ + private $endOffsetX; + + /** + * Vertical offset of bottom-right corner of shape measured in 1/256 of row height + * + * @var int + */ + private $endOffsetY; + + /** + * Set parent Shape Group Container + * + * @param PHPExcel_Shared_Escher_DgContainer_SpgrContainer $parent + */ + public function setParent($parent) + { + $this->parent = $parent; + } + + /** + * Get the parent Shape Group Container + * + * @return PHPExcel_Shared_Escher_DgContainer_SpgrContainer + */ + public function getParent() + { + return $this->parent; + } + + /** + * Set whether this is a group shape + * + * @param boolean $value + */ + public function setSpgr($value = false) + { + $this->spgr = $value; + } + + /** + * Get whether this is a group shape + * + * @return boolean + */ + public function getSpgr() + { + return $this->spgr; + } + + /** + * Set the shape type + * + * @param int $value + */ + public function setSpType($value) + { + $this->spType = $value; + } + + /** + * Get the shape type + * + * @return int + */ + public function getSpType() + { + return $this->spType; + } + + /** + * Set the shape flag + * + * @param int $value + */ + public function setSpFlag($value) + { + $this->spFlag = $value; + } + + /** + * Get the shape flag + * + * @return int + */ + public function getSpFlag() + { + return $this->spFlag; + } + + /** + * Set the shape index + * + * @param int $value + */ + public function setSpId($value) + { + $this->spId = $value; + } + + /** + * Get the shape index + * + * @return int + */ + public function getSpId() + { + return $this->spId; + } + + /** + * Set an option for the Shape Group Container + * + * @param int $property The number specifies the option + * @param mixed $value + */ + public function setOPT($property, $value) + { + $this->OPT[$property] = $value; + } + + /** + * Get an option for the Shape Group Container + * + * @param int $property The number specifies the option + * @return mixed + */ + public function getOPT($property) + { + if (isset($this->OPT[$property])) { + return $this->OPT[$property]; + } + return null; + } + + /** + * Get the collection of options + * + * @return array + */ + public function getOPTCollection() + { + return $this->OPT; + } + + /** + * Set cell coordinates of upper-left corner of shape + * + * @param string $value + */ + public function setStartCoordinates($value = 'A1') + { + $this->startCoordinates = $value; + } + + /** + * Get cell coordinates of upper-left corner of shape + * + * @return string + */ + public function getStartCoordinates() + { + return $this->startCoordinates; + } + + /** + * Set offset in x-direction of upper-left corner of shape measured in 1/1024 of column width + * + * @param int $startOffsetX + */ + public function setStartOffsetX($startOffsetX = 0) + { + $this->startOffsetX = $startOffsetX; + } + + /** + * Get offset in x-direction of upper-left corner of shape measured in 1/1024 of column width + * + * @return int + */ + public function getStartOffsetX() + { + return $this->startOffsetX; + } + + /** + * Set offset in y-direction of upper-left corner of shape measured in 1/256 of row height + * + * @param int $startOffsetY + */ + public function setStartOffsetY($startOffsetY = 0) + { + $this->startOffsetY = $startOffsetY; + } + + /** + * Get offset in y-direction of upper-left corner of shape measured in 1/256 of row height + * + * @return int + */ + public function getStartOffsetY() + { + return $this->startOffsetY; + } + + /** + * Set cell coordinates of bottom-right corner of shape + * + * @param string $value + */ + public function setEndCoordinates($value = 'A1') + { + $this->endCoordinates = $value; + } + + /** + * Get cell coordinates of bottom-right corner of shape + * + * @return string + */ + public function getEndCoordinates() + { + return $this->endCoordinates; + } + + /** + * Set offset in x-direction of bottom-right corner of shape measured in 1/1024 of column width + * + * @param int $startOffsetX + */ + public function setEndOffsetX($endOffsetX = 0) + { + $this->endOffsetX = $endOffsetX; + } + + /** + * Get offset in x-direction of bottom-right corner of shape measured in 1/1024 of column width + * + * @return int + */ + public function getEndOffsetX() + { + return $this->endOffsetX; + } + + /** + * Set offset in y-direction of bottom-right corner of shape measured in 1/256 of row height + * + * @param int $endOffsetY + */ + public function setEndOffsetY($endOffsetY = 0) + { + $this->endOffsetY = $endOffsetY; + } + + /** + * Get offset in y-direction of bottom-right corner of shape measured in 1/256 of row height + * + * @return int + */ + public function getEndOffsetY() + { + return $this->endOffsetY; + } + + /** + * Get the nesting level of this spContainer. This is the number of spgrContainers between this spContainer and + * the dgContainer. A value of 1 = immediately within first spgrContainer + * Higher nesting level occurs if and only if spContainer is part of a shape group + * + * @return int Nesting level + */ + public function getNestingLevel() + { + $nestingLevel = 0; + + $parent = $this->getParent(); + while ($parent instanceof PHPExcel_Shared_Escher_DgContainer_SpgrContainer) { + ++$nestingLevel; + $parent = $parent->getParent(); + } + + return $nestingLevel; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/Escher/DggContainer.php b/application/third_party/PHPExcel/PHPExcel/Shared/Escher/DggContainer.php new file mode 100644 index 0000000..b116b1b --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/Escher/DggContainer.php @@ -0,0 +1,196 @@ +<?php + +/** + * PHPExcel_Shared_Escher_DggContainer + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Shared_Escher_DggContainer +{ + /** + * Maximum shape index of all shapes in all drawings increased by one + * + * @var int + */ + private $spIdMax; + + /** + * Total number of drawings saved + * + * @var int + */ + private $cDgSaved; + + /** + * Total number of shapes saved (including group shapes) + * + * @var int + */ + private $cSpSaved; + + /** + * BLIP Store Container + * + * @var PHPExcel_Shared_Escher_DggContainer_BstoreContainer + */ + private $bstoreContainer; + + /** + * Array of options for the drawing group + * + * @var array + */ + private $OPT = array(); + + /** + * Array of identifier clusters containg information about the maximum shape identifiers + * + * @var array + */ + private $IDCLs = array(); + + /** + * Get maximum shape index of all shapes in all drawings (plus one) + * + * @return int + */ + public function getSpIdMax() + { + return $this->spIdMax; + } + + /** + * Set maximum shape index of all shapes in all drawings (plus one) + * + * @param int + */ + public function setSpIdMax($value) + { + $this->spIdMax = $value; + } + + /** + * Get total number of drawings saved + * + * @return int + */ + public function getCDgSaved() + { + return $this->cDgSaved; + } + + /** + * Set total number of drawings saved + * + * @param int + */ + public function setCDgSaved($value) + { + $this->cDgSaved = $value; + } + + /** + * Get total number of shapes saved (including group shapes) + * + * @return int + */ + public function getCSpSaved() + { + return $this->cSpSaved; + } + + /** + * Set total number of shapes saved (including group shapes) + * + * @param int + */ + public function setCSpSaved($value) + { + $this->cSpSaved = $value; + } + + /** + * Get BLIP Store Container + * + * @return PHPExcel_Shared_Escher_DggContainer_BstoreContainer + */ + public function getBstoreContainer() + { + return $this->bstoreContainer; + } + + /** + * Set BLIP Store Container + * + * @param PHPExcel_Shared_Escher_DggContainer_BstoreContainer $bstoreContainer + */ + public function setBstoreContainer($bstoreContainer) + { + $this->bstoreContainer = $bstoreContainer; + } + + /** + * Set an option for the drawing group + * + * @param int $property The number specifies the option + * @param mixed $value + */ + public function setOPT($property, $value) + { + $this->OPT[$property] = $value; + } + + /** + * Get an option for the drawing group + * + * @param int $property The number specifies the option + * @return mixed + */ + public function getOPT($property) + { + if (isset($this->OPT[$property])) { + return $this->OPT[$property]; + } + return null; + } + + /** + * Get identifier clusters + * + * @return array + */ + public function getIDCLs() + { + return $this->IDCLs; + } + + /** + * Set identifier clusters. array(<drawingId> => <max shape id>, ...) + * + * @param array $pValue + */ + public function setIDCLs($pValue) + { + $this->IDCLs = $pValue; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer.php b/application/third_party/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer.php new file mode 100644 index 0000000..1af2432 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer.php @@ -0,0 +1,57 @@ +<?php + +/** + * PHPExcel_Shared_Escher_DggContainer_BstoreContainer + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Shared_Escher_DggContainer_BstoreContainer +{ + /** + * BLIP Store Entries. Each of them holds one BLIP (Big Large Image or Picture) + * + * @var array + */ + private $BSECollection = array(); + + /** + * Add a BLIP Store Entry + * + * @param PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE $BSE + */ + public function addBSE($BSE) + { + $this->BSECollection[] = $BSE; + $BSE->setParent($this); + } + + /** + * Get the collection of BLIP Store Entries + * + * @return PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE[] + */ + public function getBSECollection() + { + return $this->BSECollection; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE.php b/application/third_party/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE.php new file mode 100644 index 0000000..d17e91e --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE.php @@ -0,0 +1,112 @@ +<?php + +/** + * PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE +{ + const BLIPTYPE_ERROR = 0x00; + const BLIPTYPE_UNKNOWN = 0x01; + const BLIPTYPE_EMF = 0x02; + const BLIPTYPE_WMF = 0x03; + const BLIPTYPE_PICT = 0x04; + const BLIPTYPE_JPEG = 0x05; + const BLIPTYPE_PNG = 0x06; + const BLIPTYPE_DIB = 0x07; + const BLIPTYPE_TIFF = 0x11; + const BLIPTYPE_CMYKJPEG = 0x12; + + /** + * The parent BLIP Store Entry Container + * + * @var PHPExcel_Shared_Escher_DggContainer_BstoreContainer + */ + private $parent; + + /** + * The BLIP (Big Large Image or Picture) + * + * @var PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip + */ + private $blip; + + /** + * The BLIP type + * + * @var int + */ + private $blipType; + + /** + * Set parent BLIP Store Entry Container + * + * @param PHPExcel_Shared_Escher_DggContainer_BstoreContainer $parent + */ + public function setParent($parent) + { + $this->parent = $parent; + } + + /** + * Get the BLIP + * + * @return PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip + */ + public function getBlip() + { + return $this->blip; + } + + /** + * Set the BLIP + * + * @param PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip $blip + */ + public function setBlip($blip) + { + $this->blip = $blip; + $blip->setParent($this); + } + + /** + * Get the BLIP type + * + * @return int + */ + public function getBlipType() + { + return $this->blipType; + } + + /** + * Set the BLIP type + * + * @param int + */ + public function setBlipType($blipType) + { + $this->blipType = $blipType; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php b/application/third_party/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php new file mode 100644 index 0000000..3bcbbbe --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php @@ -0,0 +1,83 @@ +<?php + +/** + * PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Escher + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip +{ + /** + * The parent BSE + * + * @var PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE + */ + private $parent; + + /** + * Raw image data + * + * @var string + */ + private $data; + + /** + * Get the raw image data + * + * @return string + */ + public function getData() + { + return $this->data; + } + + /** + * Set the raw image data + * + * @param string + */ + public function setData($data) + { + $this->data = $data; + } + + /** + * Set parent BSE + * + * @param PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE $parent + */ + public function setParent($parent) + { + $this->parent = $parent; + } + + /** + * Get parent BSE + * + * @return PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE $parent + */ + public function getParent() + { + return $this->parent; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/Excel5.php b/application/third_party/PHPExcel/PHPExcel/Shared/Excel5.php new file mode 100644 index 0000000..c3ff209 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/Excel5.php @@ -0,0 +1,298 @@ +<?php + +/** + * PHPExcel_Shared_Excel5 + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Shared_Excel5 +{ + /** + * Get the width of a column in pixels. We use the relationship y = ceil(7x) where + * x is the width in intrinsic Excel units (measuring width in number of normal characters) + * This holds for Arial 10 + * + * @param PHPExcel_Worksheet $sheet The sheet + * @param string $col The column + * @return integer The width in pixels + */ + public static function sizeCol($sheet, $col = 'A') + { + // default font of the workbook + $font = $sheet->getParent()->getDefaultStyle()->getFont(); + + $columnDimensions = $sheet->getColumnDimensions(); + + // first find the true column width in pixels (uncollapsed and unhidden) + if (isset($columnDimensions[$col]) and $columnDimensions[$col]->getWidth() != -1) { + // then we have column dimension with explicit width + $columnDimension = $columnDimensions[$col]; + $width = $columnDimension->getWidth(); + $pixelWidth = PHPExcel_Shared_Drawing::cellDimensionToPixels($width, $font); + } elseif ($sheet->getDefaultColumnDimension()->getWidth() != -1) { + // then we have default column dimension with explicit width + $defaultColumnDimension = $sheet->getDefaultColumnDimension(); + $width = $defaultColumnDimension->getWidth(); + $pixelWidth = PHPExcel_Shared_Drawing::cellDimensionToPixels($width, $font); + } else { + // we don't even have any default column dimension. Width depends on default font + $pixelWidth = PHPExcel_Shared_Font::getDefaultColumnWidthByFont($font, true); + } + + // now find the effective column width in pixels + if (isset($columnDimensions[$col]) and !$columnDimensions[$col]->getVisible()) { + $effectivePixelWidth = 0; + } else { + $effectivePixelWidth = $pixelWidth; + } + + return $effectivePixelWidth; + } + + /** + * Convert the height of a cell from user's units to pixels. By interpolation + * the relationship is: y = 4/3x. If the height hasn't been set by the user we + * use the default value. If the row is hidden we use a value of zero. + * + * @param PHPExcel_Worksheet $sheet The sheet + * @param integer $row The row index (1-based) + * @return integer The width in pixels + */ + public static function sizeRow($sheet, $row = 1) + { + // default font of the workbook + $font = $sheet->getParent()->getDefaultStyle()->getFont(); + + $rowDimensions = $sheet->getRowDimensions(); + + // first find the true row height in pixels (uncollapsed and unhidden) + if (isset($rowDimensions[$row]) and $rowDimensions[$row]->getRowHeight() != -1) { + // then we have a row dimension + $rowDimension = $rowDimensions[$row]; + $rowHeight = $rowDimension->getRowHeight(); + $pixelRowHeight = (int) ceil(4 * $rowHeight / 3); // here we assume Arial 10 + } elseif ($sheet->getDefaultRowDimension()->getRowHeight() != -1) { + // then we have a default row dimension with explicit height + $defaultRowDimension = $sheet->getDefaultRowDimension(); + $rowHeight = $defaultRowDimension->getRowHeight(); + $pixelRowHeight = PHPExcel_Shared_Drawing::pointsToPixels($rowHeight); + } else { + // we don't even have any default row dimension. Height depends on default font + $pointRowHeight = PHPExcel_Shared_Font::getDefaultRowHeightByFont($font); + $pixelRowHeight = PHPExcel_Shared_Font::fontSizeToPixels($pointRowHeight); + } + + // now find the effective row height in pixels + if (isset($rowDimensions[$row]) and !$rowDimensions[$row]->getVisible()) { + $effectivePixelRowHeight = 0; + } else { + $effectivePixelRowHeight = $pixelRowHeight; + } + + return $effectivePixelRowHeight; + } + + /** + * Get the horizontal distance in pixels between two anchors + * The distanceX is found as sum of all the spanning columns widths minus correction for the two offsets + * + * @param PHPExcel_Worksheet $sheet + * @param string $startColumn + * @param integer $startOffsetX Offset within start cell measured in 1/1024 of the cell width + * @param string $endColumn + * @param integer $endOffsetX Offset within end cell measured in 1/1024 of the cell width + * @return integer Horizontal measured in pixels + */ + public static function getDistanceX(PHPExcel_Worksheet $sheet, $startColumn = 'A', $startOffsetX = 0, $endColumn = 'A', $endOffsetX = 0) + { + $distanceX = 0; + + // add the widths of the spanning columns + $startColumnIndex = PHPExcel_Cell::columnIndexFromString($startColumn) - 1; // 1-based + $endColumnIndex = PHPExcel_Cell::columnIndexFromString($endColumn) - 1; // 1-based + for ($i = $startColumnIndex; $i <= $endColumnIndex; ++$i) { + $distanceX += self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($i)); + } + + // correct for offsetX in startcell + $distanceX -= (int) floor(self::sizeCol($sheet, $startColumn) * $startOffsetX / 1024); + + // correct for offsetX in endcell + $distanceX -= (int) floor(self::sizeCol($sheet, $endColumn) * (1 - $endOffsetX / 1024)); + + return $distanceX; + } + + /** + * Get the vertical distance in pixels between two anchors + * The distanceY is found as sum of all the spanning rows minus two offsets + * + * @param PHPExcel_Worksheet $sheet + * @param integer $startRow (1-based) + * @param integer $startOffsetY Offset within start cell measured in 1/256 of the cell height + * @param integer $endRow (1-based) + * @param integer $endOffsetY Offset within end cell measured in 1/256 of the cell height + * @return integer Vertical distance measured in pixels + */ + public static function getDistanceY(PHPExcel_Worksheet $sheet, $startRow = 1, $startOffsetY = 0, $endRow = 1, $endOffsetY = 0) + { + $distanceY = 0; + + // add the widths of the spanning rows + for ($row = $startRow; $row <= $endRow; ++$row) { + $distanceY += self::sizeRow($sheet, $row); + } + + // correct for offsetX in startcell + $distanceY -= (int) floor(self::sizeRow($sheet, $startRow) * $startOffsetY / 256); + + // correct for offsetX in endcell + $distanceY -= (int) floor(self::sizeRow($sheet, $endRow) * (1 - $endOffsetY / 256)); + + return $distanceY; + } + + /** + * Convert 1-cell anchor coordinates to 2-cell anchor coordinates + * This function is ported from PEAR Spreadsheet_Writer_Excel with small modifications + * + * Calculate the vertices that define the position of the image as required by + * the OBJ record. + * + * +------------+------------+ + * | A | B | + * +-----+------------+------------+ + * | |(x1,y1) | | + * | 1 |(A1)._______|______ | + * | | | | | + * | | | | | + * +-----+----| BITMAP |-----+ + * | | | | | + * | 2 | |______________. | + * | | | (B2)| + * | | | (x2,y2)| + * +---- +------------+------------+ + * + * Example of a bitmap that covers some of the area from cell A1 to cell B2. + * + * Based on the width and height of the bitmap we need to calculate 8 vars: + * $col_start, $row_start, $col_end, $row_end, $x1, $y1, $x2, $y2. + * The width and height of the cells are also variable and have to be taken into + * account. + * The values of $col_start and $row_start are passed in from the calling + * function. The values of $col_end and $row_end are calculated by subtracting + * the width and height of the bitmap from the width and height of the + * underlying cells. + * The vertices are expressed as a percentage of the underlying cell width as + * follows (rhs values are in pixels): + * + * x1 = X / W *1024 + * y1 = Y / H *256 + * x2 = (X-1) / W *1024 + * y2 = (Y-1) / H *256 + * + * Where: X is distance from the left side of the underlying cell + * Y is distance from the top of the underlying cell + * W is the width of the cell + * H is the height of the cell + * + * @param PHPExcel_Worksheet $sheet + * @param string $coordinates E.g. 'A1' + * @param integer $offsetX Horizontal offset in pixels + * @param integer $offsetY Vertical offset in pixels + * @param integer $width Width in pixels + * @param integer $height Height in pixels + * @return array + */ + public static function oneAnchor2twoAnchor($sheet, $coordinates, $offsetX, $offsetY, $width, $height) + { + list($column, $row) = PHPExcel_Cell::coordinateFromString($coordinates); + $col_start = PHPExcel_Cell::columnIndexFromString($column) - 1; + $row_start = $row - 1; + + $x1 = $offsetX; + $y1 = $offsetY; + + // Initialise end cell to the same as the start cell + $col_end = $col_start; // Col containing lower right corner of object + $row_end = $row_start; // Row containing bottom right corner of object + + // Zero the specified offset if greater than the cell dimensions + if ($x1 >= self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($col_start))) { + $x1 = 0; + } + if ($y1 >= self::sizeRow($sheet, $row_start + 1)) { + $y1 = 0; + } + + $width = $width + $x1 -1; + $height = $height + $y1 -1; + + // Subtract the underlying cell widths to find the end cell of the image + while ($width >= self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($col_end))) { + $width -= self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($col_end)); + ++$col_end; + } + + // Subtract the underlying cell heights to find the end cell of the image + while ($height >= self::sizeRow($sheet, $row_end + 1)) { + $height -= self::sizeRow($sheet, $row_end + 1); + ++$row_end; + } + + // Bitmap isn't allowed to start or finish in a hidden cell, i.e. a cell + // with zero height or width. + if (self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($col_start)) == 0) { + return; + } + if (self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($col_end)) == 0) { + return; + } + if (self::sizeRow($sheet, $row_start + 1) == 0) { + return; + } + if (self::sizeRow($sheet, $row_end + 1) == 0) { + return; + } + + // Convert the pixel values to the percentage value expected by Excel + $x1 = $x1 / self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($col_start)) * 1024; + $y1 = $y1 / self::sizeRow($sheet, $row_start + 1) * 256; + $x2 = ($width + 1) / self::sizeCol($sheet, PHPExcel_Cell::stringFromColumnIndex($col_end)) * 1024; // Distance to right side of object + $y2 = ($height + 1) / self::sizeRow($sheet, $row_end + 1) * 256; // Distance to bottom of object + + $startCoordinates = PHPExcel_Cell::stringFromColumnIndex($col_start) . ($row_start + 1); + $endCoordinates = PHPExcel_Cell::stringFromColumnIndex($col_end) . ($row_end + 1); + + $twoAnchor = array( + 'startCoordinates' => $startCoordinates, + 'startOffsetX' => $x1, + 'startOffsetY' => $y1, + 'endCoordinates' => $endCoordinates, + 'endOffsetX' => $x2, + 'endOffsetY' => $y2, + ); + + return $twoAnchor; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/File.php b/application/third_party/PHPExcel/PHPExcel/Shared/File.php new file mode 100644 index 0000000..a62df75 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/File.php @@ -0,0 +1,180 @@ +<?php + +/** + * PHPExcel_Shared_File + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Shared_File +{ + /* + * Use Temp or File Upload Temp for temporary files + * + * @protected + * @var boolean + */ + protected static $useUploadTempDirectory = false; + + + /** + * Set the flag indicating whether the File Upload Temp directory should be used for temporary files + * + * @param boolean $useUploadTempDir Use File Upload Temporary directory (true or false) + */ + public static function setUseUploadTempDirectory($useUploadTempDir = false) + { + self::$useUploadTempDirectory = (boolean) $useUploadTempDir; + } + + + /** + * Get the flag indicating whether the File Upload Temp directory should be used for temporary files + * + * @return boolean Use File Upload Temporary directory (true or false) + */ + public static function getUseUploadTempDirectory() + { + return self::$useUploadTempDirectory; + } + + + /** + * Verify if a file exists + * + * @param string $pFilename Filename + * @return bool + */ + public static function file_exists($pFilename) + { + // Sick construction, but it seems that + // file_exists returns strange values when + // doing the original file_exists on ZIP archives... + if (strtolower(substr($pFilename, 0, 3)) == 'zip') { + // Open ZIP file and verify if the file exists + $zipFile = substr($pFilename, 6, strpos($pFilename, '#') - 6); + $archiveFile = substr($pFilename, strpos($pFilename, '#') + 1); + + $zip = new ZipArchive(); + if ($zip->open($zipFile) === true) { + $returnValue = ($zip->getFromName($archiveFile) !== false); + $zip->close(); + return $returnValue; + } else { + return false; + } + } else { + // Regular file_exists + return file_exists($pFilename); + } + } + + /** + * Returns canonicalized absolute pathname, also for ZIP archives + * + * @param string $pFilename + * @return string + */ + public static function realpath($pFilename) + { + // Returnvalue + $returnValue = ''; + + // Try using realpath() + if (file_exists($pFilename)) { + $returnValue = realpath($pFilename); + } + + // Found something? + if ($returnValue == '' || ($returnValue === null)) { + $pathArray = explode('/', $pFilename); + while (in_array('..', $pathArray) && $pathArray[0] != '..') { + for ($i = 0; $i < count($pathArray); ++$i) { + if ($pathArray[$i] == '..' && $i > 0) { + unset($pathArray[$i]); + unset($pathArray[$i - 1]); + break; + } + } + } + $returnValue = implode('/', $pathArray); + } + + // Return + return $returnValue; + } + + /** + * Get the systems temporary directory. + * + * @return string + */ + public static function sys_get_temp_dir() + { + if (self::$useUploadTempDirectory) { + // use upload-directory when defined to allow running on environments having very restricted + // open_basedir configs + if (ini_get('upload_tmp_dir') !== false) { + if ($temp = ini_get('upload_tmp_dir')) { + if (file_exists($temp)) { + return realpath($temp); + } + } + } + } + + // sys_get_temp_dir is only available since PHP 5.2.1 + // http://php.net/manual/en/function.sys-get-temp-dir.php#94119 + if (!function_exists('sys_get_temp_dir')) { + if ($temp = getenv('TMP')) { + if ((!empty($temp)) && (file_exists($temp))) { + return realpath($temp); + } + } + if ($temp = getenv('TEMP')) { + if ((!empty($temp)) && (file_exists($temp))) { + return realpath($temp); + } + } + if ($temp = getenv('TMPDIR')) { + if ((!empty($temp)) && (file_exists($temp))) { + return realpath($temp); + } + } + + // trick for creating a file in system's temporary dir + // without knowing the path of the system's temporary dir + $temp = tempnam(__FILE__, ''); + if (file_exists($temp)) { + unlink($temp); + return realpath(dirname($temp)); + } + + return null; + } + + // use ordinary built-in PHP function + // There should be no problem with the 5.2.4 Suhosin realpath() bug, because this line should only + // be called if we're running 5.2.1 or earlier + return realpath(sys_get_temp_dir()); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/Font.php b/application/third_party/PHPExcel/PHPExcel/Shared/Font.php new file mode 100644 index 0000000..7efb3c9 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/Font.php @@ -0,0 +1,741 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ + + +/** + * PHPExcel_Shared_Font + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_Font +{ + /* Methods for resolving autosize value */ + const AUTOSIZE_METHOD_APPROX = 'approx'; + const AUTOSIZE_METHOD_EXACT = 'exact'; + + private static $autoSizeMethods = array( + self::AUTOSIZE_METHOD_APPROX, + self::AUTOSIZE_METHOD_EXACT, + ); + + /** Character set codes used by BIFF5-8 in Font records */ + const CHARSET_ANSI_LATIN = 0x00; + const CHARSET_SYSTEM_DEFAULT = 0x01; + const CHARSET_SYMBOL = 0x02; + const CHARSET_APPLE_ROMAN = 0x4D; + const CHARSET_ANSI_JAPANESE_SHIFTJIS = 0x80; + const CHARSET_ANSI_KOREAN_HANGUL = 0x81; + const CHARSET_ANSI_KOREAN_JOHAB = 0x82; + const CHARSET_ANSI_CHINESE_SIMIPLIFIED = 0x86; // gb2312 + const CHARSET_ANSI_CHINESE_TRADITIONAL = 0x88; // big5 + const CHARSET_ANSI_GREEK = 0xA1; + const CHARSET_ANSI_TURKISH = 0xA2; + const CHARSET_ANSI_VIETNAMESE = 0xA3; + const CHARSET_ANSI_HEBREW = 0xB1; + const CHARSET_ANSI_ARABIC = 0xB2; + const CHARSET_ANSI_BALTIC = 0xBA; + const CHARSET_ANSI_CYRILLIC = 0xCC; + const CHARSET_ANSI_THAI = 0xDD; + const CHARSET_ANSI_LATIN_II = 0xEE; + const CHARSET_OEM_LATIN_I = 0xFF; + + // XXX: Constants created! + /** Font filenames */ + const ARIAL = 'arial.ttf'; + const ARIAL_BOLD = 'arialbd.ttf'; + const ARIAL_ITALIC = 'ariali.ttf'; + const ARIAL_BOLD_ITALIC = 'arialbi.ttf'; + + const CALIBRI = 'CALIBRI.TTF'; + const CALIBRI_BOLD = 'CALIBRIB.TTF'; + const CALIBRI_ITALIC = 'CALIBRII.TTF'; + const CALIBRI_BOLD_ITALIC = 'CALIBRIZ.TTF'; + + const COMIC_SANS_MS = 'comic.ttf'; + const COMIC_SANS_MS_BOLD = 'comicbd.ttf'; + + const COURIER_NEW = 'cour.ttf'; + const COURIER_NEW_BOLD = 'courbd.ttf'; + const COURIER_NEW_ITALIC = 'couri.ttf'; + const COURIER_NEW_BOLD_ITALIC = 'courbi.ttf'; + + const GEORGIA = 'georgia.ttf'; + const GEORGIA_BOLD = 'georgiab.ttf'; + const GEORGIA_ITALIC = 'georgiai.ttf'; + const GEORGIA_BOLD_ITALIC = 'georgiaz.ttf'; + + const IMPACT = 'impact.ttf'; + + const LIBERATION_SANS = 'LiberationSans-Regular.ttf'; + const LIBERATION_SANS_BOLD = 'LiberationSans-Bold.ttf'; + const LIBERATION_SANS_ITALIC = 'LiberationSans-Italic.ttf'; + const LIBERATION_SANS_BOLD_ITALIC = 'LiberationSans-BoldItalic.ttf'; + + const LUCIDA_CONSOLE = 'lucon.ttf'; + const LUCIDA_SANS_UNICODE = 'l_10646.ttf'; + + const MICROSOFT_SANS_SERIF = 'micross.ttf'; + + const PALATINO_LINOTYPE = 'pala.ttf'; + const PALATINO_LINOTYPE_BOLD = 'palab.ttf'; + const PALATINO_LINOTYPE_ITALIC = 'palai.ttf'; + const PALATINO_LINOTYPE_BOLD_ITALIC = 'palabi.ttf'; + + const SYMBOL = 'symbol.ttf'; + + const TAHOMA = 'tahoma.ttf'; + const TAHOMA_BOLD = 'tahomabd.ttf'; + + const TIMES_NEW_ROMAN = 'times.ttf'; + const TIMES_NEW_ROMAN_BOLD = 'timesbd.ttf'; + const TIMES_NEW_ROMAN_ITALIC = 'timesi.ttf'; + const TIMES_NEW_ROMAN_BOLD_ITALIC = 'timesbi.ttf'; + + const TREBUCHET_MS = 'trebuc.ttf'; + const TREBUCHET_MS_BOLD = 'trebucbd.ttf'; + const TREBUCHET_MS_ITALIC = 'trebucit.ttf'; + const TREBUCHET_MS_BOLD_ITALIC = 'trebucbi.ttf'; + + const VERDANA = 'verdana.ttf'; + const VERDANA_BOLD = 'verdanab.ttf'; + const VERDANA_ITALIC = 'verdanai.ttf'; + const VERDANA_BOLD_ITALIC = 'verdanaz.ttf'; + + /** + * AutoSize method + * + * @var string + */ + private static $autoSizeMethod = self::AUTOSIZE_METHOD_APPROX; + + /** + * Path to folder containing TrueType font .ttf files + * + * @var string + */ + private static $trueTypeFontPath = null; + + /** + * How wide is a default column for a given default font and size? + * Empirical data found by inspecting real Excel files and reading off the pixel width + * in Microsoft Office Excel 2007. + * + * @var array + */ + public static $defaultColumnWidths = array( + 'Arial' => array( + 1 => array('px' => 24, 'width' => 12.00000000), + 2 => array('px' => 24, 'width' => 12.00000000), + 3 => array('px' => 32, 'width' => 10.66406250), + 4 => array('px' => 32, 'width' => 10.66406250), + 5 => array('px' => 40, 'width' => 10.00000000), + 6 => array('px' => 48, 'width' => 9.59765625), + 7 => array('px' => 48, 'width' => 9.59765625), + 8 => array('px' => 56, 'width' => 9.33203125), + 9 => array('px' => 64, 'width' => 9.14062500), + 10 => array('px' => 64, 'width' => 9.14062500), + ), + 'Calibri' => array( + 1 => array('px' => 24, 'width' => 12.00000000), + 2 => array('px' => 24, 'width' => 12.00000000), + 3 => array('px' => 32, 'width' => 10.66406250), + 4 => array('px' => 32, 'width' => 10.66406250), + 5 => array('px' => 40, 'width' => 10.00000000), + 6 => array('px' => 48, 'width' => 9.59765625), + 7 => array('px' => 48, 'width' => 9.59765625), + 8 => array('px' => 56, 'width' => 9.33203125), + 9 => array('px' => 56, 'width' => 9.33203125), + 10 => array('px' => 64, 'width' => 9.14062500), + 11 => array('px' => 64, 'width' => 9.14062500), + ), + 'Verdana' => array( + 1 => array('px' => 24, 'width' => 12.00000000), + 2 => array('px' => 24, 'width' => 12.00000000), + 3 => array('px' => 32, 'width' => 10.66406250), + 4 => array('px' => 32, 'width' => 10.66406250), + 5 => array('px' => 40, 'width' => 10.00000000), + 6 => array('px' => 48, 'width' => 9.59765625), + 7 => array('px' => 48, 'width' => 9.59765625), + 8 => array('px' => 64, 'width' => 9.14062500), + 9 => array('px' => 72, 'width' => 9.00000000), + 10 => array('px' => 72, 'width' => 9.00000000), + ), + ); + + /** + * Set autoSize method + * + * @param string $pValue + * @return boolean Success or failure + */ + public static function setAutoSizeMethod($pValue = self::AUTOSIZE_METHOD_APPROX) + { + if (!in_array($pValue, self::$autoSizeMethods)) { + return false; + } + self::$autoSizeMethod = $pValue; + + return true; + } + + /** + * Get autoSize method + * + * @return string + */ + public static function getAutoSizeMethod() + { + return self::$autoSizeMethod; + } + + /** + * Set the path to the folder containing .ttf files. There should be a trailing slash. + * Typical locations on variout some platforms: + * <ul> + * <li>C:/Windows/Fonts/</li> + * <li>/usr/share/fonts/truetype/</li> + * <li>~/.fonts/</li> + * </ul> + * + * @param string $pValue + */ + public static function setTrueTypeFontPath($pValue = '') + { + self::$trueTypeFontPath = $pValue; + } + + /** + * Get the path to the folder containing .ttf files. + * + * @return string + */ + public static function getTrueTypeFontPath() + { + return self::$trueTypeFontPath; + } + + /** + * Calculate an (approximate) OpenXML column width, based on font size and text contained + * + * @param PHPExcel_Style_Font $font Font object + * @param PHPExcel_RichText|string $cellText Text to calculate width + * @param integer $rotation Rotation angle + * @param PHPExcel_Style_Font|NULL $defaultFont Font object + * @return integer Column width + */ + public static function calculateColumnWidth(PHPExcel_Style_Font $font, $cellText = '', $rotation = 0, PHPExcel_Style_Font $defaultFont = null) + { + // If it is rich text, use plain text + if ($cellText instanceof PHPExcel_RichText) { + $cellText = $cellText->getPlainText(); + } + + // Special case if there are one or more newline characters ("\n") + if (strpos($cellText, "\n") !== false) { + $lineTexts = explode("\n", $cellText); + $lineWidths = array(); + foreach ($lineTexts as $lineText) { + $lineWidths[] = self::calculateColumnWidth($font, $lineText, $rotation = 0, $defaultFont); + } + return max($lineWidths); // width of longest line in cell + } + + // Try to get the exact text width in pixels + $approximate = self::$autoSizeMethod == self::AUTOSIZE_METHOD_APPROX; + if (!$approximate) { + $columnWidthAdjust = ceil(self::getTextWidthPixelsExact('n', $font, 0) * 1.07); + try { + // Width of text in pixels excl. padding + // and addition because Excel adds some padding, just use approx width of 'n' glyph + $columnWidth = self::getTextWidthPixelsExact($cellText, $font, $rotation) + $columnWidthAdjust; + } catch (PHPExcel_Exception $e) { + $approximate = true; + } + } + + if ($approximate) { + $columnWidthAdjust = self::getTextWidthPixelsApprox('n', $font, 0); + // Width of text in pixels excl. padding, approximation + // and addition because Excel adds some padding, just use approx width of 'n' glyph + $columnWidth = self::getTextWidthPixelsApprox($cellText, $font, $rotation) + $columnWidthAdjust; + } + + // Convert from pixel width to column width + $columnWidth = PHPExcel_Shared_Drawing::pixelsToCellDimension($columnWidth, $defaultFont); + + // Return + return round($columnWidth, 6); + } + + /** + * Get GD text width in pixels for a string of text in a certain font at a certain rotation angle + * + * @param string $text + * @param PHPExcel_Style_Font + * @param int $rotation + * @return int + * @throws PHPExcel_Exception + */ + public static function getTextWidthPixelsExact($text, PHPExcel_Style_Font $font, $rotation = 0) + { + if (!function_exists('imagettfbbox')) { + throw new PHPExcel_Exception('GD library needs to be enabled'); + } + + // font size should really be supplied in pixels in GD2, + // but since GD2 seems to assume 72dpi, pixels and points are the same + $fontFile = self::getTrueTypeFontFileFromFont($font); + $textBox = imagettfbbox($font->getSize(), $rotation, $fontFile, $text); + + // Get corners positions + $lowerLeftCornerX = $textBox[0]; +// $lowerLeftCornerY = $textBox[1]; + $lowerRightCornerX = $textBox[2]; +// $lowerRightCornerY = $textBox[3]; + $upperRightCornerX = $textBox[4]; +// $upperRightCornerY = $textBox[5]; + $upperLeftCornerX = $textBox[6]; +// $upperLeftCornerY = $textBox[7]; + + // Consider the rotation when calculating the width + $textWidth = max($lowerRightCornerX - $upperLeftCornerX, $upperRightCornerX - $lowerLeftCornerX); + + return $textWidth; + } + + /** + * Get approximate width in pixels for a string of text in a certain font at a certain rotation angle + * + * @param string $columnText + * @param PHPExcel_Style_Font $font + * @param int $rotation + * @return int Text width in pixels (no padding added) + */ + public static function getTextWidthPixelsApprox($columnText, PHPExcel_Style_Font $font = null, $rotation = 0) + { + $fontName = $font->getName(); + $fontSize = $font->getSize(); + + // Calculate column width in pixels. We assume fixed glyph width. Result varies with font name and size. + switch ($fontName) { + case 'Calibri': + // value 8.26 was found via interpolation by inspecting real Excel files with Calibri 11 font. + $columnWidth = (int) (8.26 * PHPExcel_Shared_String::CountCharacters($columnText)); + $columnWidth = $columnWidth * $fontSize / 11; // extrapolate from font size + break; + + case 'Arial': + // value 7 was found via interpolation by inspecting real Excel files with Arial 10 font. +// $columnWidth = (int) (7 * PHPExcel_Shared_String::CountCharacters($columnText)); + // value 8 was set because of experience in different exports at Arial 10 font. + $columnWidth = (int) (8 * PHPExcel_Shared_String::CountCharacters($columnText)); + $columnWidth = $columnWidth * $fontSize / 10; // extrapolate from font size + break; + + case 'Verdana': + // value 8 was found via interpolation by inspecting real Excel files with Verdana 10 font. + $columnWidth = (int) (8 * PHPExcel_Shared_String::CountCharacters($columnText)); + $columnWidth = $columnWidth * $fontSize / 10; // extrapolate from font size + break; + + default: + // just assume Calibri + $columnWidth = (int) (8.26 * PHPExcel_Shared_String::CountCharacters($columnText)); + $columnWidth = $columnWidth * $fontSize / 11; // extrapolate from font size + break; + } + + // Calculate approximate rotated column width + if ($rotation !== 0) { + if ($rotation == -165) { + // stacked text + $columnWidth = 4; // approximation + } else { + // rotated text + $columnWidth = $columnWidth * cos(deg2rad($rotation)) + + $fontSize * abs(sin(deg2rad($rotation))) / 5; // approximation + } + } + + // pixel width is an integer + return (int) $columnWidth; + } + + /** + * Calculate an (approximate) pixel size, based on a font points size + * + * @param int $fontSizeInPoints Font size (in points) + * @return int Font size (in pixels) + */ + public static function fontSizeToPixels($fontSizeInPoints = 11) + { + return (int) ((4 / 3) * $fontSizeInPoints); + } + + /** + * Calculate an (approximate) pixel size, based on inch size + * + * @param int $sizeInInch Font size (in inch) + * @return int Size (in pixels) + */ + public static function inchSizeToPixels($sizeInInch = 1) + { + return ($sizeInInch * 96); + } + + /** + * Calculate an (approximate) pixel size, based on centimeter size + * + * @param int $sizeInCm Font size (in centimeters) + * @return int Size (in pixels) + */ + public static function centimeterSizeToPixels($sizeInCm = 1) + { + return ($sizeInCm * 37.795275591); + } + + /** + * Returns the font path given the font + * + * @param PHPExcel_Style_Font + * @return string Path to TrueType font file + */ + public static function getTrueTypeFontFileFromFont($font) + { + if (!file_exists(self::$trueTypeFontPath) || !is_dir(self::$trueTypeFontPath)) { + throw new PHPExcel_Exception('Valid directory to TrueType Font files not specified'); + } + + $name = $font->getName(); + $bold = $font->getBold(); + $italic = $font->getItalic(); + + // Check if we can map font to true type font file + switch ($name) { + case 'Arial': + $fontFile = ( + $bold ? ($italic ? self::ARIAL_BOLD_ITALIC : self::ARIAL_BOLD) + : ($italic ? self::ARIAL_ITALIC : self::ARIAL) + ); + break; + case 'Calibri': + $fontFile = ( + $bold ? ($italic ? self::CALIBRI_BOLD_ITALIC : self::CALIBRI_BOLD) + : ($italic ? self::CALIBRI_ITALIC : self::CALIBRI) + ); + break; + case 'Courier New': + $fontFile = ( + $bold ? ($italic ? self::COURIER_NEW_BOLD_ITALIC : self::COURIER_NEW_BOLD) + : ($italic ? self::COURIER_NEW_ITALIC : self::COURIER_NEW) + ); + break; + case 'Comic Sans MS': + $fontFile = ( + $bold ? self::COMIC_SANS_MS_BOLD : self::COMIC_SANS_MS + ); + break; + case 'Georgia': + $fontFile = ( + $bold ? ($italic ? self::GEORGIA_BOLD_ITALIC : self::GEORGIA_BOLD) + : ($italic ? self::GEORGIA_ITALIC : self::GEORGIA) + ); + break; + case 'Impact': + $fontFile = self::IMPACT; + break; + case 'Liberation Sans': + $fontFile = ( + $bold ? ($italic ? self::LIBERATION_SANS_BOLD_ITALIC : self::LIBERATION_SANS_BOLD) + : ($italic ? self::LIBERATION_SANS_ITALIC : self::LIBERATION_SANS) + ); + break; + case 'Lucida Console': + $fontFile = self::LUCIDA_CONSOLE; + break; + case 'Lucida Sans Unicode': + $fontFile = self::LUCIDA_SANS_UNICODE; + break; + case 'Microsoft Sans Serif': + $fontFile = self::MICROSOFT_SANS_SERIF; + break; + case 'Palatino Linotype': + $fontFile = ( + $bold ? ($italic ? self::PALATINO_LINOTYPE_BOLD_ITALIC : self::PALATINO_LINOTYPE_BOLD) + : ($italic ? self::PALATINO_LINOTYPE_ITALIC : self::PALATINO_LINOTYPE) + ); + break; + case 'Symbol': + $fontFile = self::SYMBOL; + break; + case 'Tahoma': + $fontFile = ( + $bold ? self::TAHOMA_BOLD : self::TAHOMA + ); + break; + case 'Times New Roman': + $fontFile = ( + $bold ? ($italic ? self::TIMES_NEW_ROMAN_BOLD_ITALIC : self::TIMES_NEW_ROMAN_BOLD) + : ($italic ? self::TIMES_NEW_ROMAN_ITALIC : self::TIMES_NEW_ROMAN) + ); + break; + case 'Trebuchet MS': + $fontFile = ( + $bold ? ($italic ? self::TREBUCHET_MS_BOLD_ITALIC : self::TREBUCHET_MS_BOLD) + : ($italic ? self::TREBUCHET_MS_ITALIC : self::TREBUCHET_MS) + ); + break; + case 'Verdana': + $fontFile = ( + $bold ? ($italic ? self::VERDANA_BOLD_ITALIC : self::VERDANA_BOLD) + : ($italic ? self::VERDANA_ITALIC : self::VERDANA) + ); + break; + default: + throw new PHPExcel_Exception('Unknown font name "'. $name .'". Cannot map to TrueType font file'); + break; + } + + $fontFile = self::$trueTypeFontPath . $fontFile; + + // Check if file actually exists + if (!file_exists($fontFile)) { + throw new PHPExcel_Exception('TrueType Font file not found'); + } + + return $fontFile; + } + + /** + * Returns the associated charset for the font name. + * + * @param string $name Font name + * @return int Character set code + */ + public static function getCharsetFromFontName($name) + { + switch ($name) { + // Add more cases. Check FONT records in real Excel files. + case 'EucrosiaUPC': + return self::CHARSET_ANSI_THAI; + case 'Wingdings': + return self::CHARSET_SYMBOL; + case 'Wingdings 2': + return self::CHARSET_SYMBOL; + case 'Wingdings 3': + return self::CHARSET_SYMBOL; + default: + return self::CHARSET_ANSI_LATIN; + } + } + + /** + * Get the effective column width for columns without a column dimension or column with width -1 + * For example, for Calibri 11 this is 9.140625 (64 px) + * + * @param PHPExcel_Style_Font $font The workbooks default font + * @param boolean $pPixels true = return column width in pixels, false = return in OOXML units + * @return mixed Column width + */ + public static function getDefaultColumnWidthByFont(PHPExcel_Style_Font $font, $pPixels = false) + { + if (isset(self::$defaultColumnWidths[$font->getName()][$font->getSize()])) { + // Exact width can be determined + $columnWidth = $pPixels ? + self::$defaultColumnWidths[$font->getName()][$font->getSize()]['px'] + : self::$defaultColumnWidths[$font->getName()][$font->getSize()]['width']; + + } else { + // We don't have data for this particular font and size, use approximation by + // extrapolating from Calibri 11 + $columnWidth = $pPixels ? + self::$defaultColumnWidths['Calibri'][11]['px'] + : self::$defaultColumnWidths['Calibri'][11]['width']; + $columnWidth = $columnWidth * $font->getSize() / 11; + + // Round pixels to closest integer + if ($pPixels) { + $columnWidth = (int) round($columnWidth); + } + } + + return $columnWidth; + } + + /** + * Get the effective row height for rows without a row dimension or rows with height -1 + * For example, for Calibri 11 this is 15 points + * + * @param PHPExcel_Style_Font $font The workbooks default font + * @return float Row height in points + */ + public static function getDefaultRowHeightByFont(PHPExcel_Style_Font $font) + { + switch ($font->getName()) { + case 'Arial': + switch ($font->getSize()) { + case 10: + // inspection of Arial 10 workbook says 12.75pt ~17px + $rowHeight = 12.75; + break; + case 9: + // inspection of Arial 9 workbook says 12.00pt ~16px + $rowHeight = 12; + break; + case 8: + // inspection of Arial 8 workbook says 11.25pt ~15px + $rowHeight = 11.25; + break; + case 7: + // inspection of Arial 7 workbook says 9.00pt ~12px + $rowHeight = 9; + break; + case 6: + case 5: + // inspection of Arial 5,6 workbook says 8.25pt ~11px + $rowHeight = 8.25; + break; + case 4: + // inspection of Arial 4 workbook says 6.75pt ~9px + $rowHeight = 6.75; + break; + case 3: + // inspection of Arial 3 workbook says 6.00pt ~8px + $rowHeight = 6; + break; + case 2: + case 1: + // inspection of Arial 1,2 workbook says 5.25pt ~7px + $rowHeight = 5.25; + break; + default: + // use Arial 10 workbook as an approximation, extrapolation + $rowHeight = 12.75 * $font->getSize() / 10; + break; + } + break; + + case 'Calibri': + switch ($font->getSize()) { + case 11: + // inspection of Calibri 11 workbook says 15.00pt ~20px + $rowHeight = 15; + break; + case 10: + // inspection of Calibri 10 workbook says 12.75pt ~17px + $rowHeight = 12.75; + break; + case 9: + // inspection of Calibri 9 workbook says 12.00pt ~16px + $rowHeight = 12; + break; + case 8: + // inspection of Calibri 8 workbook says 11.25pt ~15px + $rowHeight = 11.25; + break; + case 7: + // inspection of Calibri 7 workbook says 9.00pt ~12px + $rowHeight = 9; + break; + case 6: + case 5: + // inspection of Calibri 5,6 workbook says 8.25pt ~11px + $rowHeight = 8.25; + break; + case 4: + // inspection of Calibri 4 workbook says 6.75pt ~9px + $rowHeight = 6.75; + break; + case 3: + // inspection of Calibri 3 workbook says 6.00pt ~8px + $rowHeight = 6.00; + break; + case 2: + case 1: + // inspection of Calibri 1,2 workbook says 5.25pt ~7px + $rowHeight = 5.25; + break; + default: + // use Calibri 11 workbook as an approximation, extrapolation + $rowHeight = 15 * $font->getSize() / 11; + break; + } + break; + + case 'Verdana': + switch ($font->getSize()) { + case 10: + // inspection of Verdana 10 workbook says 12.75pt ~17px + $rowHeight = 12.75; + break; + case 9: + // inspection of Verdana 9 workbook says 11.25pt ~15px + $rowHeight = 11.25; + break; + case 8: + // inspection of Verdana 8 workbook says 10.50pt ~14px + $rowHeight = 10.50; + break; + case 7: + // inspection of Verdana 7 workbook says 9.00pt ~12px + $rowHeight = 9.00; + break; + case 6: + case 5: + // inspection of Verdana 5,6 workbook says 8.25pt ~11px + $rowHeight = 8.25; + break; + case 4: + // inspection of Verdana 4 workbook says 6.75pt ~9px + $rowHeight = 6.75; + break; + case 3: + // inspection of Verdana 3 workbook says 6.00pt ~8px + $rowHeight = 6; + break; + case 2: + case 1: + // inspection of Verdana 1,2 workbook says 5.25pt ~7px + $rowHeight = 5.25; + break; + default: + // use Verdana 10 workbook as an approximation, extrapolation + $rowHeight = 12.75 * $font->getSize() / 10; + break; + } + break; + default: + // just use Calibri as an approximation + $rowHeight = 15 * $font->getSize() / 11; + break; + } + + return $rowHeight; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/CHANGELOG.TXT b/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/CHANGELOG.TXT new file mode 100644 index 0000000..1c18a5d --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/CHANGELOG.TXT @@ -0,0 +1,16 @@ +Mar 1, 2005 11:15 AST by PM + ++ For consistency, renamed Math.php to Maths.java, utils to util, + tests to test, docs to doc - + ++ Removed conditional logic from top of Matrix class. + ++ Switched to using hypo function in Maths.php for all php-hypot calls. + NOTE TO SELF: Need to make sure that all decompositions have been + switched over to using the bundled hypo. + +Feb 25, 2005 at 10:00 AST by PM + ++ Recommend using simpler Error.php instead of JAMA_Error.php but + can be persuaded otherwise. + diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/CholeskyDecomposition.php b/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/CholeskyDecomposition.php new file mode 100644 index 0000000..d68109b --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/CholeskyDecomposition.php @@ -0,0 +1,148 @@ +<?php +/** + * @package JAMA + * + * Cholesky decomposition class + * + * For a symmetric, positive definite matrix A, the Cholesky decomposition + * is an lower triangular matrix L so that A = L*L'. + * + * If the matrix is not symmetric or positive definite, the constructor + * returns a partial decomposition and sets an internal flag that may + * be queried by the isSPD() method. + * + * @author Paul Meagher + * @author Michael Bommarito + * @version 1.2 + */ +class CholeskyDecomposition +{ + /** + * Decomposition storage + * @var array + * @access private + */ + private $L = array(); + + /** + * Matrix row and column dimension + * @var int + * @access private + */ + private $m; + + /** + * Symmetric positive definite flag + * @var boolean + * @access private + */ + private $isspd = true; + + /** + * CholeskyDecomposition + * + * Class constructor - decomposes symmetric positive definite matrix + * @param mixed Matrix square symmetric positive definite matrix + */ + public function __construct($A = null) + { + if ($A instanceof Matrix) { + $this->L = $A->getArray(); + $this->m = $A->getRowDimension(); + + for ($i = 0; $i < $this->m; ++$i) { + for ($j = $i; $j < $this->m; ++$j) { + for ($sum = $this->L[$i][$j], $k = $i - 1; $k >= 0; --$k) { + $sum -= $this->L[$i][$k] * $this->L[$j][$k]; + } + if ($i == $j) { + if ($sum >= 0) { + $this->L[$i][$i] = sqrt($sum); + } else { + $this->isspd = false; + } + } else { + if ($this->L[$i][$i] != 0) { + $this->L[$j][$i] = $sum / $this->L[$i][$i]; + } + } + } + + for ($k = $i+1; $k < $this->m; ++$k) { + $this->L[$i][$k] = 0.0; + } + } + } else { + throw new PHPExcel_Calculation_Exception(JAMAError(ARGUMENT_TYPE_EXCEPTION)); + } + } // function __construct() + + /** + * Is the matrix symmetric and positive definite? + * + * @return boolean + */ + public function isSPD() + { + return $this->isspd; + } // function isSPD() + + /** + * getL + * + * Return triangular factor. + * @return Matrix Lower triangular matrix + */ + public function getL() + { + return new Matrix($this->L); + } // function getL() + + /** + * Solve A*X = B + * + * @param $B Row-equal matrix + * @return Matrix L * L' * X = B + */ + public function solve($B = null) + { + if ($B instanceof Matrix) { + if ($B->getRowDimension() == $this->m) { + if ($this->isspd) { + $X = $B->getArrayCopy(); + $nx = $B->getColumnDimension(); + + for ($k = 0; $k < $this->m; ++$k) { + for ($i = $k + 1; $i < $this->m; ++$i) { + for ($j = 0; $j < $nx; ++$j) { + $X[$i][$j] -= $X[$k][$j] * $this->L[$i][$k]; + } + } + for ($j = 0; $j < $nx; ++$j) { + $X[$k][$j] /= $this->L[$k][$k]; + } + } + + for ($k = $this->m - 1; $k >= 0; --$k) { + for ($j = 0; $j < $nx; ++$j) { + $X[$k][$j] /= $this->L[$k][$k]; + } + for ($i = 0; $i < $k; ++$i) { + for ($j = 0; $j < $nx; ++$j) { + $X[$i][$j] -= $X[$k][$j] * $this->L[$k][$i]; + } + } + } + + return new Matrix($X, $this->m, $nx); + } else { + throw new PHPExcel_Calculation_Exception(JAMAError(MatrixSPDException)); + } + } else { + throw new PHPExcel_Calculation_Exception(JAMAError(MATRIX_DIMENSION_EXCEPTION)); + } + } else { + throw new PHPExcel_Calculation_Exception(JAMAError(ARGUMENT_TYPE_EXCEPTION)); + } + } // function solve() +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/EigenvalueDecomposition.php b/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/EigenvalueDecomposition.php new file mode 100644 index 0000000..d4ae397 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/EigenvalueDecomposition.php @@ -0,0 +1,864 @@ +<?php +/** + * @package JAMA + * + * Class to obtain eigenvalues and eigenvectors of a real matrix. + * + * If A is symmetric, then A = V*D*V' where the eigenvalue matrix D + * is diagonal and the eigenvector matrix V is orthogonal (i.e. + * A = V.times(D.times(V.transpose())) and V.times(V.transpose()) + * equals the identity matrix). + * + * If A is not symmetric, then the eigenvalue matrix D is block diagonal + * with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, + * lambda + i*mu, in 2-by-2 blocks, [lambda, mu; -mu, lambda]. The + * columns of V represent the eigenvectors in the sense that A*V = V*D, + * i.e. A.times(V) equals V.times(D). The matrix V may be badly + * conditioned, or even singular, so the validity of the equation + * A = V*D*inverse(V) depends upon V.cond(). + * + * @author Paul Meagher + * @license PHP v3.0 + * @version 1.1 + */ +class EigenvalueDecomposition +{ + /** + * Row and column dimension (square matrix). + * @var int + */ + private $n; + + /** + * Internal symmetry flag. + * @var int + */ + private $issymmetric; + + /** + * Arrays for internal storage of eigenvalues. + * @var array + */ + private $d = array(); + private $e = array(); + + /** + * Array for internal storage of eigenvectors. + * @var array + */ + private $V = array(); + + /** + * Array for internal storage of nonsymmetric Hessenberg form. + * @var array + */ + private $H = array(); + + /** + * Working storage for nonsymmetric algorithm. + * @var array + */ + private $ort; + + /** + * Used for complex scalar division. + * @var float + */ + private $cdivr; + private $cdivi; + + /** + * Symmetric Householder reduction to tridiagonal form. + * + * @access private + */ + private function tred2() + { + // This is derived from the Algol procedures tred2 by + // Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + // Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + // Fortran subroutine in EISPACK. + $this->d = $this->V[$this->n-1]; + // Householder reduction to tridiagonal form. + for ($i = $this->n-1; $i > 0; --$i) { + $i_ = $i -1; + // Scale to avoid under/overflow. + $h = $scale = 0.0; + $scale += array_sum(array_map(abs, $this->d)); + if ($scale == 0.0) { + $this->e[$i] = $this->d[$i_]; + $this->d = array_slice($this->V[$i_], 0, $i_); + for ($j = 0; $j < $i; ++$j) { + $this->V[$j][$i] = $this->V[$i][$j] = 0.0; + } + } else { + // Generate Householder vector. + for ($k = 0; $k < $i; ++$k) { + $this->d[$k] /= $scale; + $h += pow($this->d[$k], 2); + } + $f = $this->d[$i_]; + $g = sqrt($h); + if ($f > 0) { + $g = -$g; + } + $this->e[$i] = $scale * $g; + $h = $h - $f * $g; + $this->d[$i_] = $f - $g; + for ($j = 0; $j < $i; ++$j) { + $this->e[$j] = 0.0; + } + // Apply similarity transformation to remaining columns. + for ($j = 0; $j < $i; ++$j) { + $f = $this->d[$j]; + $this->V[$j][$i] = $f; + $g = $this->e[$j] + $this->V[$j][$j] * $f; + for ($k = $j+1; $k <= $i_; ++$k) { + $g += $this->V[$k][$j] * $this->d[$k]; + $this->e[$k] += $this->V[$k][$j] * $f; + } + $this->e[$j] = $g; + } + $f = 0.0; + for ($j = 0; $j < $i; ++$j) { + $this->e[$j] /= $h; + $f += $this->e[$j] * $this->d[$j]; + } + $hh = $f / (2 * $h); + for ($j=0; $j < $i; ++$j) { + $this->e[$j] -= $hh * $this->d[$j]; + } + for ($j = 0; $j < $i; ++$j) { + $f = $this->d[$j]; + $g = $this->e[$j]; + for ($k = $j; $k <= $i_; ++$k) { + $this->V[$k][$j] -= ($f * $this->e[$k] + $g * $this->d[$k]); + } + $this->d[$j] = $this->V[$i-1][$j]; + $this->V[$i][$j] = 0.0; + } + } + $this->d[$i] = $h; + } + + // Accumulate transformations. + for ($i = 0; $i < $this->n-1; ++$i) { + $this->V[$this->n-1][$i] = $this->V[$i][$i]; + $this->V[$i][$i] = 1.0; + $h = $this->d[$i+1]; + if ($h != 0.0) { + for ($k = 0; $k <= $i; ++$k) { + $this->d[$k] = $this->V[$k][$i+1] / $h; + } + for ($j = 0; $j <= $i; ++$j) { + $g = 0.0; + for ($k = 0; $k <= $i; ++$k) { + $g += $this->V[$k][$i+1] * $this->V[$k][$j]; + } + for ($k = 0; $k <= $i; ++$k) { + $this->V[$k][$j] -= $g * $this->d[$k]; + } + } + } + for ($k = 0; $k <= $i; ++$k) { + $this->V[$k][$i+1] = 0.0; + } + } + + $this->d = $this->V[$this->n-1]; + $this->V[$this->n-1] = array_fill(0, $j, 0.0); + $this->V[$this->n-1][$this->n-1] = 1.0; + $this->e[0] = 0.0; + } + + /** + * Symmetric tridiagonal QL algorithm. + * + * This is derived from the Algol procedures tql2, by + * Bowdler, Martin, Reinsch, and Wilkinson, Handbook for + * Auto. Comp., Vol.ii-Linear Algebra, and the corresponding + * Fortran subroutine in EISPACK. + * + * @access private + */ + private function tql2() + { + for ($i = 1; $i < $this->n; ++$i) { + $this->e[$i-1] = $this->e[$i]; + } + $this->e[$this->n-1] = 0.0; + $f = 0.0; + $tst1 = 0.0; + $eps = pow(2.0, -52.0); + + for ($l = 0; $l < $this->n; ++$l) { + // Find small subdiagonal element + $tst1 = max($tst1, abs($this->d[$l]) + abs($this->e[$l])); + $m = $l; + while ($m < $this->n) { + if (abs($this->e[$m]) <= $eps * $tst1) { + break; + } + ++$m; + } + // If m == l, $this->d[l] is an eigenvalue, + // otherwise, iterate. + if ($m > $l) { + $iter = 0; + do { + // Could check iteration count here. + $iter += 1; + // Compute implicit shift + $g = $this->d[$l]; + $p = ($this->d[$l+1] - $g) / (2.0 * $this->e[$l]); + $r = hypo($p, 1.0); + if ($p < 0) { + $r *= -1; + } + $this->d[$l] = $this->e[$l] / ($p + $r); + $this->d[$l+1] = $this->e[$l] * ($p + $r); + $dl1 = $this->d[$l+1]; + $h = $g - $this->d[$l]; + for ($i = $l + 2; $i < $this->n; ++$i) { + $this->d[$i] -= $h; + } + $f += $h; + // Implicit QL transformation. + $p = $this->d[$m]; + $c = 1.0; + $c2 = $c3 = $c; + $el1 = $this->e[$l + 1]; + $s = $s2 = 0.0; + for ($i = $m-1; $i >= $l; --$i) { + $c3 = $c2; + $c2 = $c; + $s2 = $s; + $g = $c * $this->e[$i]; + $h = $c * $p; + $r = hypo($p, $this->e[$i]); + $this->e[$i+1] = $s * $r; + $s = $this->e[$i] / $r; + $c = $p / $r; + $p = $c * $this->d[$i] - $s * $g; + $this->d[$i+1] = $h + $s * ($c * $g + $s * $this->d[$i]); + // Accumulate transformation. + for ($k = 0; $k < $this->n; ++$k) { + $h = $this->V[$k][$i+1]; + $this->V[$k][$i+1] = $s * $this->V[$k][$i] + $c * $h; + $this->V[$k][$i] = $c * $this->V[$k][$i] - $s * $h; + } + } + $p = -$s * $s2 * $c3 * $el1 * $this->e[$l] / $dl1; + $this->e[$l] = $s * $p; + $this->d[$l] = $c * $p; + // Check for convergence. + } while (abs($this->e[$l]) > $eps * $tst1); + } + $this->d[$l] = $this->d[$l] + $f; + $this->e[$l] = 0.0; + } + + // Sort eigenvalues and corresponding vectors. + for ($i = 0; $i < $this->n - 1; ++$i) { + $k = $i; + $p = $this->d[$i]; + for ($j = $i+1; $j < $this->n; ++$j) { + if ($this->d[$j] < $p) { + $k = $j; + $p = $this->d[$j]; + } + } + if ($k != $i) { + $this->d[$k] = $this->d[$i]; + $this->d[$i] = $p; + for ($j = 0; $j < $this->n; ++$j) { + $p = $this->V[$j][$i]; + $this->V[$j][$i] = $this->V[$j][$k]; + $this->V[$j][$k] = $p; + } + } + } + } + + /** + * Nonsymmetric reduction to Hessenberg form. + * + * This is derived from the Algol procedures orthes and ortran, + * by Martin and Wilkinson, Handbook for Auto. Comp., + * Vol.ii-Linear Algebra, and the corresponding + * Fortran subroutines in EISPACK. + * + * @access private + */ + private function orthes() + { + $low = 0; + $high = $this->n-1; + + for ($m = $low+1; $m <= $high-1; ++$m) { + // Scale column. + $scale = 0.0; + for ($i = $m; $i <= $high; ++$i) { + $scale = $scale + abs($this->H[$i][$m-1]); + } + if ($scale != 0.0) { + // Compute Householder transformation. + $h = 0.0; + for ($i = $high; $i >= $m; --$i) { + $this->ort[$i] = $this->H[$i][$m-1] / $scale; + $h += $this->ort[$i] * $this->ort[$i]; + } + $g = sqrt($h); + if ($this->ort[$m] > 0) { + $g *= -1; + } + $h -= $this->ort[$m] * $g; + $this->ort[$m] -= $g; + // Apply Householder similarity transformation + // H = (I -u * u' / h) * H * (I -u * u') / h) + for ($j = $m; $j < $this->n; ++$j) { + $f = 0.0; + for ($i = $high; $i >= $m; --$i) { + $f += $this->ort[$i] * $this->H[$i][$j]; + } + $f /= $h; + for ($i = $m; $i <= $high; ++$i) { + $this->H[$i][$j] -= $f * $this->ort[$i]; + } + } + for ($i = 0; $i <= $high; ++$i) { + $f = 0.0; + for ($j = $high; $j >= $m; --$j) { + $f += $this->ort[$j] * $this->H[$i][$j]; + } + $f = $f / $h; + for ($j = $m; $j <= $high; ++$j) { + $this->H[$i][$j] -= $f * $this->ort[$j]; + } + } + $this->ort[$m] = $scale * $this->ort[$m]; + $this->H[$m][$m-1] = $scale * $g; + } + } + + // Accumulate transformations (Algol's ortran). + for ($i = 0; $i < $this->n; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + $this->V[$i][$j] = ($i == $j ? 1.0 : 0.0); + } + } + for ($m = $high-1; $m >= $low+1; --$m) { + if ($this->H[$m][$m-1] != 0.0) { + for ($i = $m+1; $i <= $high; ++$i) { + $this->ort[$i] = $this->H[$i][$m-1]; + } + for ($j = $m; $j <= $high; ++$j) { + $g = 0.0; + for ($i = $m; $i <= $high; ++$i) { + $g += $this->ort[$i] * $this->V[$i][$j]; + } + // Double division avoids possible underflow + $g = ($g / $this->ort[$m]) / $this->H[$m][$m-1]; + for ($i = $m; $i <= $high; ++$i) { + $this->V[$i][$j] += $g * $this->ort[$i]; + } + } + } + } + } + + /** + * Performs complex division. + * + * @access private + */ + private function cdiv($xr, $xi, $yr, $yi) + { + if (abs($yr) > abs($yi)) { + $r = $yi / $yr; + $d = $yr + $r * $yi; + $this->cdivr = ($xr + $r * $xi) / $d; + $this->cdivi = ($xi - $r * $xr) / $d; + } else { + $r = $yr / $yi; + $d = $yi + $r * $yr; + $this->cdivr = ($r * $xr + $xi) / $d; + $this->cdivi = ($r * $xi - $xr) / $d; + } + } + + /** + * Nonsymmetric reduction from Hessenberg to real Schur form. + * + * Code is derived from the Algol procedure hqr2, + * by Martin and Wilkinson, Handbook for Auto. Comp., + * Vol.ii-Linear Algebra, and the corresponding + * Fortran subroutine in EISPACK. + * + * @access private + */ + private function hqr2() + { + // Initialize + $nn = $this->n; + $n = $nn - 1; + $low = 0; + $high = $nn - 1; + $eps = pow(2.0, -52.0); + $exshift = 0.0; + $p = $q = $r = $s = $z = 0; + // Store roots isolated by balanc and compute matrix norm + $norm = 0.0; + + for ($i = 0; $i < $nn; ++$i) { + if (($i < $low) or ($i > $high)) { + $this->d[$i] = $this->H[$i][$i]; + $this->e[$i] = 0.0; + } + for ($j = max($i-1, 0); $j < $nn; ++$j) { + $norm = $norm + abs($this->H[$i][$j]); + } + } + + // Outer loop over eigenvalue index + $iter = 0; + while ($n >= $low) { + // Look for single small sub-diagonal element + $l = $n; + while ($l > $low) { + $s = abs($this->H[$l-1][$l-1]) + abs($this->H[$l][$l]); + if ($s == 0.0) { + $s = $norm; + } + if (abs($this->H[$l][$l-1]) < $eps * $s) { + break; + } + --$l; + } + // Check for convergence + // One root found + if ($l == $n) { + $this->H[$n][$n] = $this->H[$n][$n] + $exshift; + $this->d[$n] = $this->H[$n][$n]; + $this->e[$n] = 0.0; + --$n; + $iter = 0; + // Two roots found + } elseif ($l == $n-1) { + $w = $this->H[$n][$n-1] * $this->H[$n-1][$n]; + $p = ($this->H[$n-1][$n-1] - $this->H[$n][$n]) / 2.0; + $q = $p * $p + $w; + $z = sqrt(abs($q)); + $this->H[$n][$n] = $this->H[$n][$n] + $exshift; + $this->H[$n-1][$n-1] = $this->H[$n-1][$n-1] + $exshift; + $x = $this->H[$n][$n]; + // Real pair + if ($q >= 0) { + if ($p >= 0) { + $z = $p + $z; + } else { + $z = $p - $z; + } + $this->d[$n-1] = $x + $z; + $this->d[$n] = $this->d[$n-1]; + if ($z != 0.0) { + $this->d[$n] = $x - $w / $z; + } + $this->e[$n-1] = 0.0; + $this->e[$n] = 0.0; + $x = $this->H[$n][$n-1]; + $s = abs($x) + abs($z); + $p = $x / $s; + $q = $z / $s; + $r = sqrt($p * $p + $q * $q); + $p = $p / $r; + $q = $q / $r; + // Row modification + for ($j = $n-1; $j < $nn; ++$j) { + $z = $this->H[$n-1][$j]; + $this->H[$n-1][$j] = $q * $z + $p * $this->H[$n][$j]; + $this->H[$n][$j] = $q * $this->H[$n][$j] - $p * $z; + } + // Column modification + for ($i = 0; $i <= $n; ++$i) { + $z = $this->H[$i][$n-1]; + $this->H[$i][$n-1] = $q * $z + $p * $this->H[$i][$n]; + $this->H[$i][$n] = $q * $this->H[$i][$n] - $p * $z; + } + // Accumulate transformations + for ($i = $low; $i <= $high; ++$i) { + $z = $this->V[$i][$n-1]; + $this->V[$i][$n-1] = $q * $z + $p * $this->V[$i][$n]; + $this->V[$i][$n] = $q * $this->V[$i][$n] - $p * $z; + } + // Complex pair + } else { + $this->d[$n-1] = $x + $p; + $this->d[$n] = $x + $p; + $this->e[$n-1] = $z; + $this->e[$n] = -$z; + } + $n = $n - 2; + $iter = 0; + // No convergence yet + } else { + // Form shift + $x = $this->H[$n][$n]; + $y = 0.0; + $w = 0.0; + if ($l < $n) { + $y = $this->H[$n-1][$n-1]; + $w = $this->H[$n][$n-1] * $this->H[$n-1][$n]; + } + // Wilkinson's original ad hoc shift + if ($iter == 10) { + $exshift += $x; + for ($i = $low; $i <= $n; ++$i) { + $this->H[$i][$i] -= $x; + } + $s = abs($this->H[$n][$n-1]) + abs($this->H[$n-1][$n-2]); + $x = $y = 0.75 * $s; + $w = -0.4375 * $s * $s; + } + // MATLAB's new ad hoc shift + if ($iter == 30) { + $s = ($y - $x) / 2.0; + $s = $s * $s + $w; + if ($s > 0) { + $s = sqrt($s); + if ($y < $x) { + $s = -$s; + } + $s = $x - $w / (($y - $x) / 2.0 + $s); + for ($i = $low; $i <= $n; ++$i) { + $this->H[$i][$i] -= $s; + } + $exshift += $s; + $x = $y = $w = 0.964; + } + } + // Could check iteration count here. + $iter = $iter + 1; + // Look for two consecutive small sub-diagonal elements + $m = $n - 2; + while ($m >= $l) { + $z = $this->H[$m][$m]; + $r = $x - $z; + $s = $y - $z; + $p = ($r * $s - $w) / $this->H[$m+1][$m] + $this->H[$m][$m+1]; + $q = $this->H[$m+1][$m+1] - $z - $r - $s; + $r = $this->H[$m+2][$m+1]; + $s = abs($p) + abs($q) + abs($r); + $p = $p / $s; + $q = $q / $s; + $r = $r / $s; + if ($m == $l) { + break; + } + if (abs($this->H[$m][$m-1]) * (abs($q) + abs($r)) < + $eps * (abs($p) * (abs($this->H[$m-1][$m-1]) + abs($z) + abs($this->H[$m+1][$m+1])))) { + break; + } + --$m; + } + for ($i = $m + 2; $i <= $n; ++$i) { + $this->H[$i][$i-2] = 0.0; + if ($i > $m+2) { + $this->H[$i][$i-3] = 0.0; + } + } + // Double QR step involving rows l:n and columns m:n + for ($k = $m; $k <= $n-1; ++$k) { + $notlast = ($k != $n-1); + if ($k != $m) { + $p = $this->H[$k][$k-1]; + $q = $this->H[$k+1][$k-1]; + $r = ($notlast ? $this->H[$k+2][$k-1] : 0.0); + $x = abs($p) + abs($q) + abs($r); + if ($x != 0.0) { + $p = $p / $x; + $q = $q / $x; + $r = $r / $x; + } + } + if ($x == 0.0) { + break; + } + $s = sqrt($p * $p + $q * $q + $r * $r); + if ($p < 0) { + $s = -$s; + } + if ($s != 0) { + if ($k != $m) { + $this->H[$k][$k-1] = -$s * $x; + } elseif ($l != $m) { + $this->H[$k][$k-1] = -$this->H[$k][$k-1]; + } + $p = $p + $s; + $x = $p / $s; + $y = $q / $s; + $z = $r / $s; + $q = $q / $p; + $r = $r / $p; + // Row modification + for ($j = $k; $j < $nn; ++$j) { + $p = $this->H[$k][$j] + $q * $this->H[$k+1][$j]; + if ($notlast) { + $p = $p + $r * $this->H[$k+2][$j]; + $this->H[$k+2][$j] = $this->H[$k+2][$j] - $p * $z; + } + $this->H[$k][$j] = $this->H[$k][$j] - $p * $x; + $this->H[$k+1][$j] = $this->H[$k+1][$j] - $p * $y; + } + // Column modification + for ($i = 0; $i <= min($n, $k+3); ++$i) { + $p = $x * $this->H[$i][$k] + $y * $this->H[$i][$k+1]; + if ($notlast) { + $p = $p + $z * $this->H[$i][$k+2]; + $this->H[$i][$k+2] = $this->H[$i][$k+2] - $p * $r; + } + $this->H[$i][$k] = $this->H[$i][$k] - $p; + $this->H[$i][$k+1] = $this->H[$i][$k+1] - $p * $q; + } + // Accumulate transformations + for ($i = $low; $i <= $high; ++$i) { + $p = $x * $this->V[$i][$k] + $y * $this->V[$i][$k+1]; + if ($notlast) { + $p = $p + $z * $this->V[$i][$k+2]; + $this->V[$i][$k+2] = $this->V[$i][$k+2] - $p * $r; + } + $this->V[$i][$k] = $this->V[$i][$k] - $p; + $this->V[$i][$k+1] = $this->V[$i][$k+1] - $p * $q; + } + } // ($s != 0) + } // k loop + } // check convergence + } // while ($n >= $low) + + // Backsubstitute to find vectors of upper triangular form + if ($norm == 0.0) { + return; + } + + for ($n = $nn-1; $n >= 0; --$n) { + $p = $this->d[$n]; + $q = $this->e[$n]; + // Real vector + if ($q == 0) { + $l = $n; + $this->H[$n][$n] = 1.0; + for ($i = $n-1; $i >= 0; --$i) { + $w = $this->H[$i][$i] - $p; + $r = 0.0; + for ($j = $l; $j <= $n; ++$j) { + $r = $r + $this->H[$i][$j] * $this->H[$j][$n]; + } + if ($this->e[$i] < 0.0) { + $z = $w; + $s = $r; + } else { + $l = $i; + if ($this->e[$i] == 0.0) { + if ($w != 0.0) { + $this->H[$i][$n] = -$r / $w; + } else { + $this->H[$i][$n] = -$r / ($eps * $norm); + } + // Solve real equations + } else { + $x = $this->H[$i][$i+1]; + $y = $this->H[$i+1][$i]; + $q = ($this->d[$i] - $p) * ($this->d[$i] - $p) + $this->e[$i] * $this->e[$i]; + $t = ($x * $s - $z * $r) / $q; + $this->H[$i][$n] = $t; + if (abs($x) > abs($z)) { + $this->H[$i+1][$n] = (-$r - $w * $t) / $x; + } else { + $this->H[$i+1][$n] = (-$s - $y * $t) / $z; + } + } + // Overflow control + $t = abs($this->H[$i][$n]); + if (($eps * $t) * $t > 1) { + for ($j = $i; $j <= $n; ++$j) { + $this->H[$j][$n] = $this->H[$j][$n] / $t; + } + } + } + } + // Complex vector + } elseif ($q < 0) { + $l = $n-1; + // Last vector component imaginary so matrix is triangular + if (abs($this->H[$n][$n-1]) > abs($this->H[$n-1][$n])) { + $this->H[$n-1][$n-1] = $q / $this->H[$n][$n-1]; + $this->H[$n-1][$n] = -($this->H[$n][$n] - $p) / $this->H[$n][$n-1]; + } else { + $this->cdiv(0.0, -$this->H[$n-1][$n], $this->H[$n-1][$n-1] - $p, $q); + $this->H[$n-1][$n-1] = $this->cdivr; + $this->H[$n-1][$n] = $this->cdivi; + } + $this->H[$n][$n-1] = 0.0; + $this->H[$n][$n] = 1.0; + for ($i = $n-2; $i >= 0; --$i) { + // double ra,sa,vr,vi; + $ra = 0.0; + $sa = 0.0; + for ($j = $l; $j <= $n; ++$j) { + $ra = $ra + $this->H[$i][$j] * $this->H[$j][$n-1]; + $sa = $sa + $this->H[$i][$j] * $this->H[$j][$n]; + } + $w = $this->H[$i][$i] - $p; + if ($this->e[$i] < 0.0) { + $z = $w; + $r = $ra; + $s = $sa; + } else { + $l = $i; + if ($this->e[$i] == 0) { + $this->cdiv(-$ra, -$sa, $w, $q); + $this->H[$i][$n-1] = $this->cdivr; + $this->H[$i][$n] = $this->cdivi; + } else { + // Solve complex equations + $x = $this->H[$i][$i+1]; + $y = $this->H[$i+1][$i]; + $vr = ($this->d[$i] - $p) * ($this->d[$i] - $p) + $this->e[$i] * $this->e[$i] - $q * $q; + $vi = ($this->d[$i] - $p) * 2.0 * $q; + if ($vr == 0.0 & $vi == 0.0) { + $vr = $eps * $norm * (abs($w) + abs($q) + abs($x) + abs($y) + abs($z)); + } + $this->cdiv($x * $r - $z * $ra + $q * $sa, $x * $s - $z * $sa - $q * $ra, $vr, $vi); + $this->H[$i][$n-1] = $this->cdivr; + $this->H[$i][$n] = $this->cdivi; + if (abs($x) > (abs($z) + abs($q))) { + $this->H[$i+1][$n-1] = (-$ra - $w * $this->H[$i][$n-1] + $q * $this->H[$i][$n]) / $x; + $this->H[$i+1][$n] = (-$sa - $w * $this->H[$i][$n] - $q * $this->H[$i][$n-1]) / $x; + } else { + $this->cdiv(-$r - $y * $this->H[$i][$n-1], -$s - $y * $this->H[$i][$n], $z, $q); + $this->H[$i+1][$n-1] = $this->cdivr; + $this->H[$i+1][$n] = $this->cdivi; + } + } + // Overflow control + $t = max(abs($this->H[$i][$n-1]), abs($this->H[$i][$n])); + if (($eps * $t) * $t > 1) { + for ($j = $i; $j <= $n; ++$j) { + $this->H[$j][$n-1] = $this->H[$j][$n-1] / $t; + $this->H[$j][$n] = $this->H[$j][$n] / $t; + } + } + } // end else + } // end for + } // end else for complex case + } // end for + + // Vectors of isolated roots + for ($i = 0; $i < $nn; ++$i) { + if ($i < $low | $i > $high) { + for ($j = $i; $j < $nn; ++$j) { + $this->V[$i][$j] = $this->H[$i][$j]; + } + } + } + + // Back transformation to get eigenvectors of original matrix + for ($j = $nn-1; $j >= $low; --$j) { + for ($i = $low; $i <= $high; ++$i) { + $z = 0.0; + for ($k = $low; $k <= min($j, $high); ++$k) { + $z = $z + $this->V[$i][$k] * $this->H[$k][$j]; + } + $this->V[$i][$j] = $z; + } + } + } // end hqr2 + + /** + * Constructor: Check for symmetry, then construct the eigenvalue decomposition + * + * @access public + * @param A Square matrix + * @return Structure to access D and V. + */ + public function __construct($Arg) + { + $this->A = $Arg->getArray(); + $this->n = $Arg->getColumnDimension(); + + $issymmetric = true; + for ($j = 0; ($j < $this->n) & $issymmetric; ++$j) { + for ($i = 0; ($i < $this->n) & $issymmetric; ++$i) { + $issymmetric = ($this->A[$i][$j] == $this->A[$j][$i]); + } + } + + if ($issymmetric) { + $this->V = $this->A; + // Tridiagonalize. + $this->tred2(); + // Diagonalize. + $this->tql2(); + } else { + $this->H = $this->A; + $this->ort = array(); + // Reduce to Hessenberg form. + $this->orthes(); + // Reduce Hessenberg to real Schur form. + $this->hqr2(); + } + } + + /** + * Return the eigenvector matrix + * + * @access public + * @return V + */ + public function getV() + { + return new Matrix($this->V, $this->n, $this->n); + } + + /** + * Return the real parts of the eigenvalues + * + * @access public + * @return real(diag(D)) + */ + public function getRealEigenvalues() + { + return $this->d; + } + + /** + * Return the imaginary parts of the eigenvalues + * + * @access public + * @return imag(diag(D)) + */ + public function getImagEigenvalues() + { + return $this->e; + } + + /** + * Return the block diagonal eigenvalue matrix + * + * @access public + * @return D + */ + public function getD() + { + for ($i = 0; $i < $this->n; ++$i) { + $D[$i] = array_fill(0, $this->n, 0.0); + $D[$i][$i] = $this->d[$i]; + if ($this->e[$i] == 0) { + continue; + } + $o = ($this->e[$i] > 0) ? $i + 1 : $i - 1; + $D[$i][$o] = $this->e[$i]; + } + return new Matrix($D); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/LUDecomposition.php b/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/LUDecomposition.php new file mode 100644 index 0000000..2505d92 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/LUDecomposition.php @@ -0,0 +1,257 @@ +<?php +/** + * @package JAMA + * + * For an m-by-n matrix A with m >= n, the LU decomposition is an m-by-n + * unit lower triangular matrix L, an n-by-n upper triangular matrix U, + * and a permutation vector piv of length m so that A(piv,:) = L*U. + * If m < n, then L is m-by-m and U is m-by-n. + * + * The LU decompostion with pivoting always exists, even if the matrix is + * singular, so the constructor will never fail. The primary use of the + * LU decomposition is in the solution of square systems of simultaneous + * linear equations. This will fail if isNonsingular() returns false. + * + * @author Paul Meagher + * @author Bartosz Matosiuk + * @author Michael Bommarito + * @version 1.1 + * @license PHP v3.0 + */ +class PHPExcel_Shared_JAMA_LUDecomposition +{ + const MATRIX_SINGULAR_EXCEPTION = "Can only perform operation on singular matrix."; + const MATRIX_SQUARE_EXCEPTION = "Mismatched Row dimension"; + + /** + * Decomposition storage + * @var array + */ + private $LU = array(); + + /** + * Row dimension. + * @var int + */ + private $m; + + /** + * Column dimension. + * @var int + */ + private $n; + + /** + * Pivot sign. + * @var int + */ + private $pivsign; + + /** + * Internal storage of pivot vector. + * @var array + */ + private $piv = array(); + + /** + * LU Decomposition constructor. + * + * @param $A Rectangular matrix + * @return Structure to access L, U and piv. + */ + public function __construct($A) + { + if ($A instanceof PHPExcel_Shared_JAMA_Matrix) { + // Use a "left-looking", dot-product, Crout/Doolittle algorithm. + $this->LU = $A->getArray(); + $this->m = $A->getRowDimension(); + $this->n = $A->getColumnDimension(); + for ($i = 0; $i < $this->m; ++$i) { + $this->piv[$i] = $i; + } + $this->pivsign = 1; + $LUrowi = $LUcolj = array(); + + // Outer loop. + for ($j = 0; $j < $this->n; ++$j) { + // Make a copy of the j-th column to localize references. + for ($i = 0; $i < $this->m; ++$i) { + $LUcolj[$i] = &$this->LU[$i][$j]; + } + // Apply previous transformations. + for ($i = 0; $i < $this->m; ++$i) { + $LUrowi = $this->LU[$i]; + // Most of the time is spent in the following dot product. + $kmax = min($i, $j); + $s = 0.0; + for ($k = 0; $k < $kmax; ++$k) { + $s += $LUrowi[$k] * $LUcolj[$k]; + } + $LUrowi[$j] = $LUcolj[$i] -= $s; + } + // Find pivot and exchange if necessary. + $p = $j; + for ($i = $j+1; $i < $this->m; ++$i) { + if (abs($LUcolj[$i]) > abs($LUcolj[$p])) { + $p = $i; + } + } + if ($p != $j) { + for ($k = 0; $k < $this->n; ++$k) { + $t = $this->LU[$p][$k]; + $this->LU[$p][$k] = $this->LU[$j][$k]; + $this->LU[$j][$k] = $t; + } + $k = $this->piv[$p]; + $this->piv[$p] = $this->piv[$j]; + $this->piv[$j] = $k; + $this->pivsign = $this->pivsign * -1; + } + // Compute multipliers. + if (($j < $this->m) && ($this->LU[$j][$j] != 0.0)) { + for ($i = $j+1; $i < $this->m; ++$i) { + $this->LU[$i][$j] /= $this->LU[$j][$j]; + } + } + } + } else { + throw new PHPExcel_Calculation_Exception(PHPExcel_Shared_JAMA_Matrix::ARGUMENT_TYPE_EXCEPTION); + } + } // function __construct() + + /** + * Get lower triangular factor. + * + * @return array Lower triangular factor + */ + public function getL() + { + for ($i = 0; $i < $this->m; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + if ($i > $j) { + $L[$i][$j] = $this->LU[$i][$j]; + } elseif ($i == $j) { + $L[$i][$j] = 1.0; + } else { + $L[$i][$j] = 0.0; + } + } + } + return new PHPExcel_Shared_JAMA_Matrix($L); + } // function getL() + + /** + * Get upper triangular factor. + * + * @return array Upper triangular factor + */ + public function getU() + { + for ($i = 0; $i < $this->n; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + if ($i <= $j) { + $U[$i][$j] = $this->LU[$i][$j]; + } else { + $U[$i][$j] = 0.0; + } + } + } + return new PHPExcel_Shared_JAMA_Matrix($U); + } // function getU() + + /** + * Return pivot permutation vector. + * + * @return array Pivot vector + */ + public function getPivot() + { + return $this->piv; + } // function getPivot() + + /** + * Alias for getPivot + * + * @see getPivot + */ + public function getDoublePivot() + { + return $this->getPivot(); + } // function getDoublePivot() + + /** + * Is the matrix nonsingular? + * + * @return true if U, and hence A, is nonsingular. + */ + public function isNonsingular() + { + for ($j = 0; $j < $this->n; ++$j) { + if ($this->LU[$j][$j] == 0) { + return false; + } + } + return true; + } // function isNonsingular() + + /** + * Count determinants + * + * @return array d matrix deterninat + */ + public function det() + { + if ($this->m == $this->n) { + $d = $this->pivsign; + for ($j = 0; $j < $this->n; ++$j) { + $d *= $this->LU[$j][$j]; + } + return $d; + } else { + throw new PHPExcel_Calculation_Exception(PHPExcel_Shared_JAMA_Matrix::MATRIX_DIMENSION_EXCEPTION); + } + } // function det() + + /** + * Solve A*X = B + * + * @param $B A Matrix with as many rows as A and any number of columns. + * @return X so that L*U*X = B(piv,:) + * @PHPExcel_Calculation_Exception IllegalArgumentException Matrix row dimensions must agree. + * @PHPExcel_Calculation_Exception RuntimeException Matrix is singular. + */ + public function solve($B) + { + if ($B->getRowDimension() == $this->m) { + if ($this->isNonsingular()) { + // Copy right hand side with pivoting + $nx = $B->getColumnDimension(); + $X = $B->getMatrix($this->piv, 0, $nx-1); + // Solve L*Y = B(piv,:) + for ($k = 0; $k < $this->n; ++$k) { + for ($i = $k+1; $i < $this->n; ++$i) { + for ($j = 0; $j < $nx; ++$j) { + $X->A[$i][$j] -= $X->A[$k][$j] * $this->LU[$i][$k]; + } + } + } + // Solve U*X = Y; + for ($k = $this->n-1; $k >= 0; --$k) { + for ($j = 0; $j < $nx; ++$j) { + $X->A[$k][$j] /= $this->LU[$k][$k]; + } + for ($i = 0; $i < $k; ++$i) { + for ($j = 0; $j < $nx; ++$j) { + $X->A[$i][$j] -= $X->A[$k][$j] * $this->LU[$i][$k]; + } + } + } + return $X; + } else { + throw new PHPExcel_Calculation_Exception(self::MATRIX_SINGULAR_EXCEPTION); + } + } else { + throw new PHPExcel_Calculation_Exception(self::MATRIX_SQUARE_EXCEPTION); + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/Matrix.php b/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/Matrix.php new file mode 100644 index 0000000..82fb0fb --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/Matrix.php @@ -0,0 +1,1159 @@ +<?php +/** + * @package JAMA + */ + +/** PHPExcel root directory */ +if (!defined('PHPEXCEL_ROOT')) { + /** + * @ignore + */ + define('PHPEXCEL_ROOT', dirname(__FILE__) . '/../../../'); + require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php'); +} + + +/* + * Matrix class + * + * @author Paul Meagher + * @author Michael Bommarito + * @author Lukasz Karapuda + * @author Bartek Matosiuk + * @version 1.8 + * @license PHP v3.0 + * @see http://math.nist.gov/javanumerics/jama/ + */ +class PHPExcel_Shared_JAMA_Matrix +{ + const POLYMORPHIC_ARGUMENT_EXCEPTION = "Invalid argument pattern for polymorphic function."; + const ARGUMENT_TYPE_EXCEPTION = "Invalid argument type."; + const ARGUMENT_BOUNDS_EXCEPTION = "Invalid argument range."; + const MATRIX_DIMENSION_EXCEPTION = "Matrix dimensions are not equal."; + const ARRAY_LENGTH_EXCEPTION = "Array length must be a multiple of m."; + + /** + * Matrix storage + * + * @var array + * @access public + */ + public $A = array(); + + /** + * Matrix row dimension + * + * @var int + * @access private + */ + private $m; + + /** + * Matrix column dimension + * + * @var int + * @access private + */ + private $n; + + /** + * Polymorphic constructor + * + * As PHP has no support for polymorphic constructors, we hack our own sort of polymorphism using func_num_args, func_get_arg, and gettype. In essence, we're just implementing a simple RTTI filter and calling the appropriate constructor. + */ + public function __construct() + { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch ($match) { + //Rectangular matrix - m x n initialized from 2D array + case 'array': + $this->m = count($args[0]); + $this->n = count($args[0][0]); + $this->A = $args[0]; + break; + //Square matrix - n x n + case 'integer': + $this->m = $args[0]; + $this->n = $args[0]; + $this->A = array_fill(0, $this->m, array_fill(0, $this->n, 0)); + break; + //Rectangular matrix - m x n + case 'integer,integer': + $this->m = $args[0]; + $this->n = $args[1]; + $this->A = array_fill(0, $this->m, array_fill(0, $this->n, 0)); + break; + //Rectangular matrix - m x n initialized from packed array + case 'array,integer': + $this->m = $args[1]; + if ($this->m != 0) { + $this->n = count($args[0]) / $this->m; + } else { + $this->n = 0; + } + if (($this->m * $this->n) == count($args[0])) { + for ($i = 0; $i < $this->m; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + $this->A[$i][$j] = $args[0][$i + $j * $this->m]; + } + } + } else { + throw new PHPExcel_Calculation_Exception(self::ARRAY_LENGTH_EXCEPTION); + } + break; + default: + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + break; + } + } else { + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + } + } + + /** + * getArray + * + * @return array Matrix array + */ + public function getArray() + { + return $this->A; + } + + /** + * getRowDimension + * + * @return int Row dimension + */ + public function getRowDimension() + { + return $this->m; + } + + /** + * getColumnDimension + * + * @return int Column dimension + */ + public function getColumnDimension() + { + return $this->n; + } + + /** + * get + * + * Get the i,j-th element of the matrix. + * @param int $i Row position + * @param int $j Column position + * @return mixed Element (int/float/double) + */ + public function get($i = null, $j = null) + { + return $this->A[$i][$j]; + } + + /** + * getMatrix + * + * Get a submatrix + * @param int $i0 Initial row index + * @param int $iF Final row index + * @param int $j0 Initial column index + * @param int $jF Final column index + * @return Matrix Submatrix + */ + public function getMatrix() + { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch ($match) { + //A($i0...; $j0...) + case 'integer,integer': + list($i0, $j0) = $args; + if ($i0 >= 0) { + $m = $this->m - $i0; + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION); + } + if ($j0 >= 0) { + $n = $this->n - $j0; + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION); + } + $R = new PHPExcel_Shared_JAMA_Matrix($m, $n); + for ($i = $i0; $i < $this->m; ++$i) { + for ($j = $j0; $j < $this->n; ++$j) { + $R->set($i, $j, $this->A[$i][$j]); + } + } + return $R; + break; + //A($i0...$iF; $j0...$jF) + case 'integer,integer,integer,integer': + list($i0, $iF, $j0, $jF) = $args; + if (($iF > $i0) && ($this->m >= $iF) && ($i0 >= 0)) { + $m = $iF - $i0; + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION); + } + if (($jF > $j0) && ($this->n >= $jF) && ($j0 >= 0)) { + $n = $jF - $j0; + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION); + } + $R = new PHPExcel_Shared_JAMA_Matrix($m+1, $n+1); + for ($i = $i0; $i <= $iF; ++$i) { + for ($j = $j0; $j <= $jF; ++$j) { + $R->set($i - $i0, $j - $j0, $this->A[$i][$j]); + } + } + return $R; + break; + //$R = array of row indices; $C = array of column indices + case 'array,array': + list($RL, $CL) = $args; + if (count($RL) > 0) { + $m = count($RL); + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION); + } + if (count($CL) > 0) { + $n = count($CL); + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION); + } + $R = new PHPExcel_Shared_JAMA_Matrix($m, $n); + for ($i = 0; $i < $m; ++$i) { + for ($j = 0; $j < $n; ++$j) { + $R->set($i - $i0, $j - $j0, $this->A[$RL[$i]][$CL[$j]]); + } + } + return $R; + break; + //$RL = array of row indices; $CL = array of column indices + case 'array,array': + list($RL, $CL) = $args; + if (count($RL) > 0) { + $m = count($RL); + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION); + } + if (count($CL) > 0) { + $n = count($CL); + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION); + } + $R = new PHPExcel_Shared_JAMA_Matrix($m, $n); + for ($i = 0; $i < $m; ++$i) { + for ($j = 0; $j < $n; ++$j) { + $R->set($i, $j, $this->A[$RL[$i]][$CL[$j]]); + } + } + return $R; + break; + //A($i0...$iF); $CL = array of column indices + case 'integer,integer,array': + list($i0, $iF, $CL) = $args; + if (($iF > $i0) && ($this->m >= $iF) && ($i0 >= 0)) { + $m = $iF - $i0; + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION); + } + if (count($CL) > 0) { + $n = count($CL); + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION); + } + $R = new PHPExcel_Shared_JAMA_Matrix($m, $n); + for ($i = $i0; $i < $iF; ++$i) { + for ($j = 0; $j < $n; ++$j) { + $R->set($i - $i0, $j, $this->A[$RL[$i]][$j]); + } + } + return $R; + break; + //$RL = array of row indices + case 'array,integer,integer': + list($RL, $j0, $jF) = $args; + if (count($RL) > 0) { + $m = count($RL); + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION); + } + if (($jF >= $j0) && ($this->n >= $jF) && ($j0 >= 0)) { + $n = $jF - $j0; + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_BOUNDS_EXCEPTION); + } + $R = new PHPExcel_Shared_JAMA_Matrix($m, $n+1); + for ($i = 0; $i < $m; ++$i) { + for ($j = $j0; $j <= $jF; ++$j) { + $R->set($i, $j - $j0, $this->A[$RL[$i]][$j]); + } + } + return $R; + break; + default: + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + break; + } + } else { + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + } + } + + /** + * checkMatrixDimensions + * + * Is matrix B the same size? + * @param Matrix $B Matrix B + * @return boolean + */ + public function checkMatrixDimensions($B = null) + { + if ($B instanceof PHPExcel_Shared_JAMA_Matrix) { + if (($this->m == $B->getRowDimension()) && ($this->n == $B->getColumnDimension())) { + return true; + } else { + throw new PHPExcel_Calculation_Exception(self::MATRIX_DIMENSION_EXCEPTION); + } + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION); + } + } // function checkMatrixDimensions() + + /** + * set + * + * Set the i,j-th element of the matrix. + * @param int $i Row position + * @param int $j Column position + * @param mixed $c Int/float/double value + * @return mixed Element (int/float/double) + */ + public function set($i = null, $j = null, $c = null) + { + // Optimized set version just has this + $this->A[$i][$j] = $c; + } // function set() + + /** + * identity + * + * Generate an identity matrix. + * @param int $m Row dimension + * @param int $n Column dimension + * @return Matrix Identity matrix + */ + public function identity($m = null, $n = null) + { + return $this->diagonal($m, $n, 1); + } + + /** + * diagonal + * + * Generate a diagonal matrix + * @param int $m Row dimension + * @param int $n Column dimension + * @param mixed $c Diagonal value + * @return Matrix Diagonal matrix + */ + public function diagonal($m = null, $n = null, $c = 1) + { + $R = new PHPExcel_Shared_JAMA_Matrix($m, $n); + for ($i = 0; $i < $m; ++$i) { + $R->set($i, $i, $c); + } + return $R; + } + + /** + * getMatrixByRow + * + * Get a submatrix by row index/range + * @param int $i0 Initial row index + * @param int $iF Final row index + * @return Matrix Submatrix + */ + public function getMatrixByRow($i0 = null, $iF = null) + { + if (is_int($i0)) { + if (is_int($iF)) { + return $this->getMatrix($i0, 0, $iF + 1, $this->n); + } else { + return $this->getMatrix($i0, 0, $i0 + 1, $this->n); + } + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION); + } + } + + /** + * getMatrixByCol + * + * Get a submatrix by column index/range + * @param int $i0 Initial column index + * @param int $iF Final column index + * @return Matrix Submatrix + */ + public function getMatrixByCol($j0 = null, $jF = null) + { + if (is_int($j0)) { + if (is_int($jF)) { + return $this->getMatrix(0, $j0, $this->m, $jF + 1); + } else { + return $this->getMatrix(0, $j0, $this->m, $j0 + 1); + } + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION); + } + } + + /** + * transpose + * + * Tranpose matrix + * @return Matrix Transposed matrix + */ + public function transpose() + { + $R = new PHPExcel_Shared_JAMA_Matrix($this->n, $this->m); + for ($i = 0; $i < $this->m; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + $R->set($j, $i, $this->A[$i][$j]); + } + } + return $R; + } // function transpose() + + /** + * trace + * + * Sum of diagonal elements + * @return float Sum of diagonal elements + */ + public function trace() + { + $s = 0; + $n = min($this->m, $this->n); + for ($i = 0; $i < $n; ++$i) { + $s += $this->A[$i][$i]; + } + return $s; + } + + /** + * uminus + * + * Unary minus matrix -A + * @return Matrix Unary minus matrix + */ + public function uminus() + { + } + + /** + * plus + * + * A + B + * @param mixed $B Matrix/Array + * @return Matrix Sum + */ + public function plus() + { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch ($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { + $M = $args[0]; + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION); + } + break; + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + break; + } + $this->checkMatrixDimensions($M); + for ($i = 0; $i < $this->m; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + $M->set($i, $j, $M->get($i, $j) + $this->A[$i][$j]); + } + } + return $M; + } else { + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + } + } + + /** + * plusEquals + * + * A = A + B + * @param mixed $B Matrix/Array + * @return Matrix Sum + */ + public function plusEquals() + { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch ($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { + $M = $args[0]; + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION); + } + break; + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + break; + } + $this->checkMatrixDimensions($M); + for ($i = 0; $i < $this->m; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + $validValues = true; + $value = $M->get($i, $j); + if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) { + $this->A[$i][$j] = trim($this->A[$i][$j], '"'); + $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($this->A[$i][$j]); + } + if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) { + $value = trim($value, '"'); + $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($value); + } + if ($validValues) { + $this->A[$i][$j] += $value; + } else { + $this->A[$i][$j] = PHPExcel_Calculation_Functions::NaN(); + } + } + } + return $this; + } else { + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + } + } + + /** + * minus + * + * A - B + * @param mixed $B Matrix/Array + * @return Matrix Sum + */ + public function minus() + { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch ($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { + $M = $args[0]; + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION); + } + break; + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + break; + } + $this->checkMatrixDimensions($M); + for ($i = 0; $i < $this->m; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + $M->set($i, $j, $M->get($i, $j) - $this->A[$i][$j]); + } + } + return $M; + } else { + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + } + } + + /** + * minusEquals + * + * A = A - B + * @param mixed $B Matrix/Array + * @return Matrix Sum + */ + public function minusEquals() + { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch ($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { + $M = $args[0]; + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION); + } + break; + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + break; + } + $this->checkMatrixDimensions($M); + for ($i = 0; $i < $this->m; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + $validValues = true; + $value = $M->get($i, $j); + if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) { + $this->A[$i][$j] = trim($this->A[$i][$j], '"'); + $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($this->A[$i][$j]); + } + if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) { + $value = trim($value, '"'); + $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($value); + } + if ($validValues) { + $this->A[$i][$j] -= $value; + } else { + $this->A[$i][$j] = PHPExcel_Calculation_Functions::NaN(); + } + } + } + return $this; + } else { + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + } + } + + /** + * arrayTimes + * + * Element-by-element multiplication + * Cij = Aij * Bij + * @param mixed $B Matrix/Array + * @return Matrix Matrix Cij + */ + public function arrayTimes() + { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch ($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { + $M = $args[0]; + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION); + } + break; + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + break; + } + $this->checkMatrixDimensions($M); + for ($i = 0; $i < $this->m; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + $M->set($i, $j, $M->get($i, $j) * $this->A[$i][$j]); + } + } + return $M; + } else { + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + } + } + + /** + * arrayTimesEquals + * + * Element-by-element multiplication + * Aij = Aij * Bij + * @param mixed $B Matrix/Array + * @return Matrix Matrix Aij + */ + public function arrayTimesEquals() + { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch ($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { + $M = $args[0]; + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION); + } + break; + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + break; + } + $this->checkMatrixDimensions($M); + for ($i = 0; $i < $this->m; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + $validValues = true; + $value = $M->get($i, $j); + if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) { + $this->A[$i][$j] = trim($this->A[$i][$j], '"'); + $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($this->A[$i][$j]); + } + if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) { + $value = trim($value, '"'); + $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($value); + } + if ($validValues) { + $this->A[$i][$j] *= $value; + } else { + $this->A[$i][$j] = PHPExcel_Calculation_Functions::NaN(); + } + } + } + return $this; + } else { + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + } + } + + /** + * arrayRightDivide + * + * Element-by-element right division + * A / B + * @param Matrix $B Matrix B + * @return Matrix Division result + */ + public function arrayRightDivide() + { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch ($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { + $M = $args[0]; + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION); + } + break; + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + break; + } + $this->checkMatrixDimensions($M); + for ($i = 0; $i < $this->m; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + $validValues = true; + $value = $M->get($i, $j); + if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) { + $this->A[$i][$j] = trim($this->A[$i][$j], '"'); + $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($this->A[$i][$j]); + } + if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) { + $value = trim($value, '"'); + $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($value); + } + if ($validValues) { + if ($value == 0) { + // Trap for Divide by Zero error + $M->set($i, $j, '#DIV/0!'); + } else { + $M->set($i, $j, $this->A[$i][$j] / $value); + } + } else { + $M->set($i, $j, PHPExcel_Calculation_Functions::NaN()); + } + } + } + return $M; + } else { + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + } + } + + + /** + * arrayRightDivideEquals + * + * Element-by-element right division + * Aij = Aij / Bij + * @param mixed $B Matrix/Array + * @return Matrix Matrix Aij + */ + public function arrayRightDivideEquals() + { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch ($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { + $M = $args[0]; + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION); + } + break; + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + break; + } + $this->checkMatrixDimensions($M); + for ($i = 0; $i < $this->m; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + $this->A[$i][$j] = $this->A[$i][$j] / $M->get($i, $j); + } + } + return $M; + } else { + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + } + } + + + /** + * arrayLeftDivide + * + * Element-by-element Left division + * A / B + * @param Matrix $B Matrix B + * @return Matrix Division result + */ + public function arrayLeftDivide() + { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch ($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { + $M = $args[0]; + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION); + } + break; + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + break; + } + $this->checkMatrixDimensions($M); + for ($i = 0; $i < $this->m; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + $M->set($i, $j, $M->get($i, $j) / $this->A[$i][$j]); + } + } + return $M; + } else { + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + } + } + + + /** + * arrayLeftDivideEquals + * + * Element-by-element Left division + * Aij = Aij / Bij + * @param mixed $B Matrix/Array + * @return Matrix Matrix Aij + */ + public function arrayLeftDivideEquals() + { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch ($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { + $M = $args[0]; + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION); + } + break; + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + break; + } + $this->checkMatrixDimensions($M); + for ($i = 0; $i < $this->m; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + $this->A[$i][$j] = $M->get($i, $j) / $this->A[$i][$j]; + } + } + return $M; + } else { + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + } + } + + + /** + * times + * + * Matrix multiplication + * @param mixed $n Matrix/Array/Scalar + * @return Matrix Product + */ + public function times() + { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch ($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { + $B = $args[0]; + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION); + } + if ($this->n == $B->m) { + $C = new PHPExcel_Shared_JAMA_Matrix($this->m, $B->n); + for ($j = 0; $j < $B->n; ++$j) { + for ($k = 0; $k < $this->n; ++$k) { + $Bcolj[$k] = $B->A[$k][$j]; + } + for ($i = 0; $i < $this->m; ++$i) { + $Arowi = $this->A[$i]; + $s = 0; + for ($k = 0; $k < $this->n; ++$k) { + $s += $Arowi[$k] * $Bcolj[$k]; + } + $C->A[$i][$j] = $s; + } + } + return $C; + } else { + throw new PHPExcel_Calculation_Exception(JAMAError(MatrixDimensionMismatch)); + } + break; + case 'array': + $B = new PHPExcel_Shared_JAMA_Matrix($args[0]); + if ($this->n == $B->m) { + $C = new PHPExcel_Shared_JAMA_Matrix($this->m, $B->n); + for ($i = 0; $i < $C->m; ++$i) { + for ($j = 0; $j < $C->n; ++$j) { + $s = "0"; + for ($k = 0; $k < $C->n; ++$k) { + $s += $this->A[$i][$k] * $B->A[$k][$j]; + } + $C->A[$i][$j] = $s; + } + } + return $C; + } else { + throw new PHPExcel_Calculation_Exception(JAMAError(MatrixDimensionMismatch)); + } + return $M; + break; + case 'integer': + $C = new PHPExcel_Shared_JAMA_Matrix($this->A); + for ($i = 0; $i < $C->m; ++$i) { + for ($j = 0; $j < $C->n; ++$j) { + $C->A[$i][$j] *= $args[0]; + } + } + return $C; + break; + case 'double': + $C = new PHPExcel_Shared_JAMA_Matrix($this->m, $this->n); + for ($i = 0; $i < $C->m; ++$i) { + for ($j = 0; $j < $C->n; ++$j) { + $C->A[$i][$j] = $args[0] * $this->A[$i][$j]; + } + } + return $C; + break; + case 'float': + $C = new PHPExcel_Shared_JAMA_Matrix($this->A); + for ($i = 0; $i < $C->m; ++$i) { + for ($j = 0; $j < $C->n; ++$j) { + $C->A[$i][$j] *= $args[0]; + } + } + return $C; + break; + default: + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + break; + } + } else { + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + } + } + + /** + * power + * + * A = A ^ B + * @param mixed $B Matrix/Array + * @return Matrix Sum + */ + public function power() + { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch ($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { + $M = $args[0]; + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION); + } + break; + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + break; + } + $this->checkMatrixDimensions($M); + for ($i = 0; $i < $this->m; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + $validValues = true; + $value = $M->get($i, $j); + if ((is_string($this->A[$i][$j])) && (strlen($this->A[$i][$j]) > 0) && (!is_numeric($this->A[$i][$j]))) { + $this->A[$i][$j] = trim($this->A[$i][$j], '"'); + $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($this->A[$i][$j]); + } + if ((is_string($value)) && (strlen($value) > 0) && (!is_numeric($value))) { + $value = trim($value, '"'); + $validValues &= PHPExcel_Shared_String::convertToNumberIfFraction($value); + } + if ($validValues) { + $this->A[$i][$j] = pow($this->A[$i][$j], $value); + } else { + $this->A[$i][$j] = PHPExcel_Calculation_Functions::NaN(); + } + } + } + return $this; + } else { + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + } + } + + /** + * concat + * + * A = A & B + * @param mixed $B Matrix/Array + * @return Matrix Sum + */ + public function concat() + { + if (func_num_args() > 0) { + $args = func_get_args(); + $match = implode(",", array_map('gettype', $args)); + + switch ($match) { + case 'object': + if ($args[0] instanceof PHPExcel_Shared_JAMA_Matrix) { + $M = $args[0]; + } else { + throw new PHPExcel_Calculation_Exception(self::ARGUMENT_TYPE_EXCEPTION); + } + case 'array': + $M = new PHPExcel_Shared_JAMA_Matrix($args[0]); + break; + default: + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + break; + } + $this->checkMatrixDimensions($M); + for ($i = 0; $i < $this->m; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + $this->A[$i][$j] = trim($this->A[$i][$j], '"').trim($M->get($i, $j), '"'); + } + } + return $this; + } else { + throw new PHPExcel_Calculation_Exception(self::POLYMORPHIC_ARGUMENT_EXCEPTION); + } + } + + /** + * Solve A*X = B. + * + * @param Matrix $B Right hand side + * @return Matrix ... Solution if A is square, least squares solution otherwise + */ + public function solve($B) + { + if ($this->m == $this->n) { + $LU = new PHPExcel_Shared_JAMA_LUDecomposition($this); + return $LU->solve($B); + } else { + $QR = new PHPExcel_Shared_JAMA_QRDecomposition($this); + return $QR->solve($B); + } + } + + /** + * Matrix inverse or pseudoinverse. + * + * @return Matrix ... Inverse(A) if A is square, pseudoinverse otherwise. + */ + public function inverse() + { + return $this->solve($this->identity($this->m, $this->m)); + } + + /** + * det + * + * Calculate determinant + * @return float Determinant + */ + public function det() + { + $L = new PHPExcel_Shared_JAMA_LUDecomposition($this); + return $L->det(); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/QRDecomposition.php b/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/QRDecomposition.php new file mode 100644 index 0000000..1e43c7c --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/QRDecomposition.php @@ -0,0 +1,235 @@ +<?php +/** + * @package JAMA + * + * For an m-by-n matrix A with m >= n, the QR decomposition is an m-by-n + * orthogonal matrix Q and an n-by-n upper triangular matrix R so that + * A = Q*R. + * + * The QR decompostion always exists, even if the matrix does not have + * full rank, so the constructor will never fail. The primary use of the + * QR decomposition is in the least squares solution of nonsquare systems + * of simultaneous linear equations. This will fail if isFullRank() + * returns false. + * + * @author Paul Meagher + * @license PHP v3.0 + * @version 1.1 + */ +class PHPExcel_Shared_JAMA_QRDecomposition +{ + const MATRIX_RANK_EXCEPTION = "Can only perform operation on full-rank matrix."; + + /** + * Array for internal storage of decomposition. + * @var array + */ + private $QR = array(); + + /** + * Row dimension. + * @var integer + */ + private $m; + + /** + * Column dimension. + * @var integer + */ + private $n; + + /** + * Array for internal storage of diagonal of R. + * @var array + */ + private $Rdiag = array(); + + + /** + * QR Decomposition computed by Householder reflections. + * + * @param matrix $A Rectangular matrix + * @return Structure to access R and the Householder vectors and compute Q. + */ + public function __construct($A) + { + if ($A instanceof PHPExcel_Shared_JAMA_Matrix) { + // Initialize. + $this->QR = $A->getArrayCopy(); + $this->m = $A->getRowDimension(); + $this->n = $A->getColumnDimension(); + // Main loop. + for ($k = 0; $k < $this->n; ++$k) { + // Compute 2-norm of k-th column without under/overflow. + $nrm = 0.0; + for ($i = $k; $i < $this->m; ++$i) { + $nrm = hypo($nrm, $this->QR[$i][$k]); + } + if ($nrm != 0.0) { + // Form k-th Householder vector. + if ($this->QR[$k][$k] < 0) { + $nrm = -$nrm; + } + for ($i = $k; $i < $this->m; ++$i) { + $this->QR[$i][$k] /= $nrm; + } + $this->QR[$k][$k] += 1.0; + // Apply transformation to remaining columns. + for ($j = $k+1; $j < $this->n; ++$j) { + $s = 0.0; + for ($i = $k; $i < $this->m; ++$i) { + $s += $this->QR[$i][$k] * $this->QR[$i][$j]; + } + $s = -$s/$this->QR[$k][$k]; + for ($i = $k; $i < $this->m; ++$i) { + $this->QR[$i][$j] += $s * $this->QR[$i][$k]; + } + } + } + $this->Rdiag[$k] = -$nrm; + } + } else { + throw new PHPExcel_Calculation_Exception(PHPExcel_Shared_JAMA_Matrix::ARGUMENT_TYPE_EXCEPTION); + } + } // function __construct() + + + /** + * Is the matrix full rank? + * + * @return boolean true if R, and hence A, has full rank, else false. + */ + public function isFullRank() + { + for ($j = 0; $j < $this->n; ++$j) { + if ($this->Rdiag[$j] == 0) { + return false; + } + } + return true; + } // function isFullRank() + + /** + * Return the Householder vectors + * + * @return Matrix Lower trapezoidal matrix whose columns define the reflections + */ + public function getH() + { + for ($i = 0; $i < $this->m; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + if ($i >= $j) { + $H[$i][$j] = $this->QR[$i][$j]; + } else { + $H[$i][$j] = 0.0; + } + } + } + return new PHPExcel_Shared_JAMA_Matrix($H); + } // function getH() + + /** + * Return the upper triangular factor + * + * @return Matrix upper triangular factor + */ + public function getR() + { + for ($i = 0; $i < $this->n; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + if ($i < $j) { + $R[$i][$j] = $this->QR[$i][$j]; + } elseif ($i == $j) { + $R[$i][$j] = $this->Rdiag[$i]; + } else { + $R[$i][$j] = 0.0; + } + } + } + return new PHPExcel_Shared_JAMA_Matrix($R); + } // function getR() + + /** + * Generate and return the (economy-sized) orthogonal factor + * + * @return Matrix orthogonal factor + */ + public function getQ() + { + for ($k = $this->n-1; $k >= 0; --$k) { + for ($i = 0; $i < $this->m; ++$i) { + $Q[$i][$k] = 0.0; + } + $Q[$k][$k] = 1.0; + for ($j = $k; $j < $this->n; ++$j) { + if ($this->QR[$k][$k] != 0) { + $s = 0.0; + for ($i = $k; $i < $this->m; ++$i) { + $s += $this->QR[$i][$k] * $Q[$i][$j]; + } + $s = -$s/$this->QR[$k][$k]; + for ($i = $k; $i < $this->m; ++$i) { + $Q[$i][$j] += $s * $this->QR[$i][$k]; + } + } + } + } + /* + for($i = 0; $i < count($Q); ++$i) { + for($j = 0; $j < count($Q); ++$j) { + if (! isset($Q[$i][$j]) ) { + $Q[$i][$j] = 0; + } + } + } + */ + return new PHPExcel_Shared_JAMA_Matrix($Q); + } // function getQ() + + /** + * Least squares solution of A*X = B + * + * @param Matrix $B A Matrix with as many rows as A and any number of columns. + * @return Matrix Matrix that minimizes the two norm of Q*R*X-B. + */ + public function solve($B) + { + if ($B->getRowDimension() == $this->m) { + if ($this->isFullRank()) { + // Copy right hand side + $nx = $B->getColumnDimension(); + $X = $B->getArrayCopy(); + // Compute Y = transpose(Q)*B + for ($k = 0; $k < $this->n; ++$k) { + for ($j = 0; $j < $nx; ++$j) { + $s = 0.0; + for ($i = $k; $i < $this->m; ++$i) { + $s += $this->QR[$i][$k] * $X[$i][$j]; + } + $s = -$s/$this->QR[$k][$k]; + for ($i = $k; $i < $this->m; ++$i) { + $X[$i][$j] += $s * $this->QR[$i][$k]; + } + } + } + // Solve R*X = Y; + for ($k = $this->n-1; $k >= 0; --$k) { + for ($j = 0; $j < $nx; ++$j) { + $X[$k][$j] /= $this->Rdiag[$k]; + } + for ($i = 0; $i < $k; ++$i) { + for ($j = 0; $j < $nx; ++$j) { + $X[$i][$j] -= $X[$k][$j]* $this->QR[$i][$k]; + } + } + } + $X = new PHPExcel_Shared_JAMA_Matrix($X); + return ($X->getMatrix(0, $this->n-1, 0, $nx)); + } else { + throw new PHPExcel_Calculation_Exception(self::MATRIX_RANK_EXCEPTION); + } + } else { + throw new PHPExcel_Calculation_Exception(PHPExcel_Shared_JAMA_Matrix::MATRIX_DIMENSION_EXCEPTION); + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/SingularValueDecomposition.php b/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/SingularValueDecomposition.php new file mode 100644 index 0000000..f57d122 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/SingularValueDecomposition.php @@ -0,0 +1,528 @@ +<?php +/** + * @package JAMA + * + * For an m-by-n matrix A with m >= n, the singular value decomposition is + * an m-by-n orthogonal matrix U, an n-by-n diagonal matrix S, and + * an n-by-n orthogonal matrix V so that A = U*S*V'. + * + * The singular values, sigma[$k] = S[$k][$k], are ordered so that + * sigma[0] >= sigma[1] >= ... >= sigma[n-1]. + * + * The singular value decompostion always exists, so the constructor will + * never fail. The matrix condition number and the effective numerical + * rank can be computed from this decomposition. + * + * @author Paul Meagher + * @license PHP v3.0 + * @version 1.1 + */ +class SingularValueDecomposition +{ + /** + * Internal storage of U. + * @var array + */ + private $U = array(); + + /** + * Internal storage of V. + * @var array + */ + private $V = array(); + + /** + * Internal storage of singular values. + * @var array + */ + private $s = array(); + + /** + * Row dimension. + * @var int + */ + private $m; + + /** + * Column dimension. + * @var int + */ + private $n; + + /** + * Construct the singular value decomposition + * + * Derived from LINPACK code. + * + * @param $A Rectangular matrix + * @return Structure to access U, S and V. + */ + public function __construct($Arg) + { + // Initialize. + $A = $Arg->getArrayCopy(); + $this->m = $Arg->getRowDimension(); + $this->n = $Arg->getColumnDimension(); + $nu = min($this->m, $this->n); + $e = array(); + $work = array(); + $wantu = true; + $wantv = true; + $nct = min($this->m - 1, $this->n); + $nrt = max(0, min($this->n - 2, $this->m)); + + // Reduce A to bidiagonal form, storing the diagonal elements + // in s and the super-diagonal elements in e. + for ($k = 0; $k < max($nct, $nrt); ++$k) { + if ($k < $nct) { + // Compute the transformation for the k-th column and + // place the k-th diagonal in s[$k]. + // Compute 2-norm of k-th column without under/overflow. + $this->s[$k] = 0; + for ($i = $k; $i < $this->m; ++$i) { + $this->s[$k] = hypo($this->s[$k], $A[$i][$k]); + } + if ($this->s[$k] != 0.0) { + if ($A[$k][$k] < 0.0) { + $this->s[$k] = -$this->s[$k]; + } + for ($i = $k; $i < $this->m; ++$i) { + $A[$i][$k] /= $this->s[$k]; + } + $A[$k][$k] += 1.0; + } + $this->s[$k] = -$this->s[$k]; + } + + for ($j = $k + 1; $j < $this->n; ++$j) { + if (($k < $nct) & ($this->s[$k] != 0.0)) { + // Apply the transformation. + $t = 0; + for ($i = $k; $i < $this->m; ++$i) { + $t += $A[$i][$k] * $A[$i][$j]; + } + $t = -$t / $A[$k][$k]; + for ($i = $k; $i < $this->m; ++$i) { + $A[$i][$j] += $t * $A[$i][$k]; + } + // Place the k-th row of A into e for the + // subsequent calculation of the row transformation. + $e[$j] = $A[$k][$j]; + } + } + + if ($wantu and ($k < $nct)) { + // Place the transformation in U for subsequent back + // multiplication. + for ($i = $k; $i < $this->m; ++$i) { + $this->U[$i][$k] = $A[$i][$k]; + } + } + + if ($k < $nrt) { + // Compute the k-th row transformation and place the + // k-th super-diagonal in e[$k]. + // Compute 2-norm without under/overflow. + $e[$k] = 0; + for ($i = $k + 1; $i < $this->n; ++$i) { + $e[$k] = hypo($e[$k], $e[$i]); + } + if ($e[$k] != 0.0) { + if ($e[$k+1] < 0.0) { + $e[$k] = -$e[$k]; + } + for ($i = $k + 1; $i < $this->n; ++$i) { + $e[$i] /= $e[$k]; + } + $e[$k+1] += 1.0; + } + $e[$k] = -$e[$k]; + if (($k+1 < $this->m) and ($e[$k] != 0.0)) { + // Apply the transformation. + for ($i = $k+1; $i < $this->m; ++$i) { + $work[$i] = 0.0; + } + for ($j = $k+1; $j < $this->n; ++$j) { + for ($i = $k+1; $i < $this->m; ++$i) { + $work[$i] += $e[$j] * $A[$i][$j]; + } + } + for ($j = $k + 1; $j < $this->n; ++$j) { + $t = -$e[$j] / $e[$k+1]; + for ($i = $k + 1; $i < $this->m; ++$i) { + $A[$i][$j] += $t * $work[$i]; + } + } + } + if ($wantv) { + // Place the transformation in V for subsequent + // back multiplication. + for ($i = $k + 1; $i < $this->n; ++$i) { + $this->V[$i][$k] = $e[$i]; + } + } + } + } + + // Set up the final bidiagonal matrix or order p. + $p = min($this->n, $this->m + 1); + if ($nct < $this->n) { + $this->s[$nct] = $A[$nct][$nct]; + } + if ($this->m < $p) { + $this->s[$p-1] = 0.0; + } + if ($nrt + 1 < $p) { + $e[$nrt] = $A[$nrt][$p-1]; + } + $e[$p-1] = 0.0; + // If required, generate U. + if ($wantu) { + for ($j = $nct; $j < $nu; ++$j) { + for ($i = 0; $i < $this->m; ++$i) { + $this->U[$i][$j] = 0.0; + } + $this->U[$j][$j] = 1.0; + } + for ($k = $nct - 1; $k >= 0; --$k) { + if ($this->s[$k] != 0.0) { + for ($j = $k + 1; $j < $nu; ++$j) { + $t = 0; + for ($i = $k; $i < $this->m; ++$i) { + $t += $this->U[$i][$k] * $this->U[$i][$j]; + } + $t = -$t / $this->U[$k][$k]; + for ($i = $k; $i < $this->m; ++$i) { + $this->U[$i][$j] += $t * $this->U[$i][$k]; + } + } + for ($i = $k; $i < $this->m; ++$i) { + $this->U[$i][$k] = -$this->U[$i][$k]; + } + $this->U[$k][$k] = 1.0 + $this->U[$k][$k]; + for ($i = 0; $i < $k - 1; ++$i) { + $this->U[$i][$k] = 0.0; + } + } else { + for ($i = 0; $i < $this->m; ++$i) { + $this->U[$i][$k] = 0.0; + } + $this->U[$k][$k] = 1.0; + } + } + } + + // If required, generate V. + if ($wantv) { + for ($k = $this->n - 1; $k >= 0; --$k) { + if (($k < $nrt) and ($e[$k] != 0.0)) { + for ($j = $k + 1; $j < $nu; ++$j) { + $t = 0; + for ($i = $k + 1; $i < $this->n; ++$i) { + $t += $this->V[$i][$k]* $this->V[$i][$j]; + } + $t = -$t / $this->V[$k+1][$k]; + for ($i = $k + 1; $i < $this->n; ++$i) { + $this->V[$i][$j] += $t * $this->V[$i][$k]; + } + } + } + for ($i = 0; $i < $this->n; ++$i) { + $this->V[$i][$k] = 0.0; + } + $this->V[$k][$k] = 1.0; + } + } + + // Main iteration loop for the singular values. + $pp = $p - 1; + $iter = 0; + $eps = pow(2.0, -52.0); + + while ($p > 0) { + // Here is where a test for too many iterations would go. + // This section of the program inspects for negligible + // elements in the s and e arrays. On completion the + // variables kase and k are set as follows: + // kase = 1 if s(p) and e[k-1] are negligible and k<p + // kase = 2 if s(k) is negligible and k<p + // kase = 3 if e[k-1] is negligible, k<p, and + // s(k), ..., s(p) are not negligible (qr step). + // kase = 4 if e(p-1) is negligible (convergence). + for ($k = $p - 2; $k >= -1; --$k) { + if ($k == -1) { + break; + } + if (abs($e[$k]) <= $eps * (abs($this->s[$k]) + abs($this->s[$k+1]))) { + $e[$k] = 0.0; + break; + } + } + if ($k == $p - 2) { + $kase = 4; + } else { + for ($ks = $p - 1; $ks >= $k; --$ks) { + if ($ks == $k) { + break; + } + $t = ($ks != $p ? abs($e[$ks]) : 0.) + ($ks != $k + 1 ? abs($e[$ks-1]) : 0.); + if (abs($this->s[$ks]) <= $eps * $t) { + $this->s[$ks] = 0.0; + break; + } + } + if ($ks == $k) { + $kase = 3; + } elseif ($ks == $p-1) { + $kase = 1; + } else { + $kase = 2; + $k = $ks; + } + } + ++$k; + + // Perform the task indicated by kase. + switch ($kase) { + // Deflate negligible s(p). + case 1: + $f = $e[$p-2]; + $e[$p-2] = 0.0; + for ($j = $p - 2; $j >= $k; --$j) { + $t = hypo($this->s[$j], $f); + $cs = $this->s[$j] / $t; + $sn = $f / $t; + $this->s[$j] = $t; + if ($j != $k) { + $f = -$sn * $e[$j-1]; + $e[$j-1] = $cs * $e[$j-1]; + } + if ($wantv) { + for ($i = 0; $i < $this->n; ++$i) { + $t = $cs * $this->V[$i][$j] + $sn * $this->V[$i][$p-1]; + $this->V[$i][$p-1] = -$sn * $this->V[$i][$j] + $cs * $this->V[$i][$p-1]; + $this->V[$i][$j] = $t; + } + } + } + break; + // Split at negligible s(k). + case 2: + $f = $e[$k-1]; + $e[$k-1] = 0.0; + for ($j = $k; $j < $p; ++$j) { + $t = hypo($this->s[$j], $f); + $cs = $this->s[$j] / $t; + $sn = $f / $t; + $this->s[$j] = $t; + $f = -$sn * $e[$j]; + $e[$j] = $cs * $e[$j]; + if ($wantu) { + for ($i = 0; $i < $this->m; ++$i) { + $t = $cs * $this->U[$i][$j] + $sn * $this->U[$i][$k-1]; + $this->U[$i][$k-1] = -$sn * $this->U[$i][$j] + $cs * $this->U[$i][$k-1]; + $this->U[$i][$j] = $t; + } + } + } + break; + // Perform one qr step. + case 3: + // Calculate the shift. + $scale = max(max(max(max(abs($this->s[$p-1]), abs($this->s[$p-2])), abs($e[$p-2])), abs($this->s[$k])), abs($e[$k])); + $sp = $this->s[$p-1] / $scale; + $spm1 = $this->s[$p-2] / $scale; + $epm1 = $e[$p-2] / $scale; + $sk = $this->s[$k] / $scale; + $ek = $e[$k] / $scale; + $b = (($spm1 + $sp) * ($spm1 - $sp) + $epm1 * $epm1) / 2.0; + $c = ($sp * $epm1) * ($sp * $epm1); + $shift = 0.0; + if (($b != 0.0) || ($c != 0.0)) { + $shift = sqrt($b * $b + $c); + if ($b < 0.0) { + $shift = -$shift; + } + $shift = $c / ($b + $shift); + } + $f = ($sk + $sp) * ($sk - $sp) + $shift; + $g = $sk * $ek; + // Chase zeros. + for ($j = $k; $j < $p-1; ++$j) { + $t = hypo($f, $g); + $cs = $f/$t; + $sn = $g/$t; + if ($j != $k) { + $e[$j-1] = $t; + } + $f = $cs * $this->s[$j] + $sn * $e[$j]; + $e[$j] = $cs * $e[$j] - $sn * $this->s[$j]; + $g = $sn * $this->s[$j+1]; + $this->s[$j+1] = $cs * $this->s[$j+1]; + if ($wantv) { + for ($i = 0; $i < $this->n; ++$i) { + $t = $cs * $this->V[$i][$j] + $sn * $this->V[$i][$j+1]; + $this->V[$i][$j+1] = -$sn * $this->V[$i][$j] + $cs * $this->V[$i][$j+1]; + $this->V[$i][$j] = $t; + } + } + $t = hypo($f, $g); + $cs = $f/$t; + $sn = $g/$t; + $this->s[$j] = $t; + $f = $cs * $e[$j] + $sn * $this->s[$j+1]; + $this->s[$j+1] = -$sn * $e[$j] + $cs * $this->s[$j+1]; + $g = $sn * $e[$j+1]; + $e[$j+1] = $cs * $e[$j+1]; + if ($wantu && ($j < $this->m - 1)) { + for ($i = 0; $i < $this->m; ++$i) { + $t = $cs * $this->U[$i][$j] + $sn * $this->U[$i][$j+1]; + $this->U[$i][$j+1] = -$sn * $this->U[$i][$j] + $cs * $this->U[$i][$j+1]; + $this->U[$i][$j] = $t; + } + } + } + $e[$p-2] = $f; + $iter = $iter + 1; + break; + // Convergence. + case 4: + // Make the singular values positive. + if ($this->s[$k] <= 0.0) { + $this->s[$k] = ($this->s[$k] < 0.0 ? -$this->s[$k] : 0.0); + if ($wantv) { + for ($i = 0; $i <= $pp; ++$i) { + $this->V[$i][$k] = -$this->V[$i][$k]; + } + } + } + // Order the singular values. + while ($k < $pp) { + if ($this->s[$k] >= $this->s[$k+1]) { + break; + } + $t = $this->s[$k]; + $this->s[$k] = $this->s[$k+1]; + $this->s[$k+1] = $t; + if ($wantv and ($k < $this->n - 1)) { + for ($i = 0; $i < $this->n; ++$i) { + $t = $this->V[$i][$k+1]; + $this->V[$i][$k+1] = $this->V[$i][$k]; + $this->V[$i][$k] = $t; + } + } + if ($wantu and ($k < $this->m-1)) { + for ($i = 0; $i < $this->m; ++$i) { + $t = $this->U[$i][$k+1]; + $this->U[$i][$k+1] = $this->U[$i][$k]; + $this->U[$i][$k] = $t; + } + } + ++$k; + } + $iter = 0; + --$p; + break; + } // end switch + } // end while + + } // end constructor + + + /** + * Return the left singular vectors + * + * @access public + * @return U + */ + public function getU() + { + return new Matrix($this->U, $this->m, min($this->m + 1, $this->n)); + } + + + /** + * Return the right singular vectors + * + * @access public + * @return V + */ + public function getV() + { + return new Matrix($this->V); + } + + + /** + * Return the one-dimensional array of singular values + * + * @access public + * @return diagonal of S. + */ + public function getSingularValues() + { + return $this->s; + } + + + /** + * Return the diagonal matrix of singular values + * + * @access public + * @return S + */ + public function getS() + { + for ($i = 0; $i < $this->n; ++$i) { + for ($j = 0; $j < $this->n; ++$j) { + $S[$i][$j] = 0.0; + } + $S[$i][$i] = $this->s[$i]; + } + return new Matrix($S); + } + + + /** + * Two norm + * + * @access public + * @return max(S) + */ + public function norm2() + { + return $this->s[0]; + } + + + /** + * Two norm condition number + * + * @access public + * @return max(S)/min(S) + */ + public function cond() + { + return $this->s[0] / $this->s[min($this->m, $this->n) - 1]; + } + + + /** + * Effective numerical matrix rank + * + * @access public + * @return Number of nonnegligible singular values. + */ + public function rank() + { + $eps = pow(2.0, -52.0); + $tol = max($this->m, $this->n) * $this->s[0] * $eps; + $r = 0; + for ($i = 0; $i < count($this->s); ++$i) { + if ($this->s[$i] > $tol) { + ++$r; + } + } + return $r; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/utils/Error.php b/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/utils/Error.php new file mode 100644 index 0000000..71b8c99 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/utils/Error.php @@ -0,0 +1,83 @@ +<?php +/** + * @package JAMA + * + * Error handling + * @author Michael Bommarito + * @version 01292005 + */ + +//Language constant +define('JAMALANG', 'EN'); + + +//All errors may be defined by the following format: +//define('ExceptionName', N); +//$error['lang'][ExceptionName] = 'Error message'; +$error = array(); + +/* +I've used Babelfish and a little poor knowledge of Romance/Germanic languages for the translations here. +Feel free to correct anything that looks amiss to you. +*/ + +define('POLYMORPHIC_ARGUMENT_EXCEPTION', -1); +$error['EN'][POLYMORPHIC_ARGUMENT_EXCEPTION] = "Invalid argument pattern for polymorphic function."; +$error['FR'][POLYMORPHIC_ARGUMENT_EXCEPTION] = "Modèle inadmissible d'argument pour la fonction polymorphe.". +$error['DE'][POLYMORPHIC_ARGUMENT_EXCEPTION] = "Unzulässiges Argumentmuster für polymorphe Funktion."; + +define('ARGUMENT_TYPE_EXCEPTION', -2); +$error['EN'][ARGUMENT_TYPE_EXCEPTION] = "Invalid argument type."; +$error['FR'][ARGUMENT_TYPE_EXCEPTION] = "Type inadmissible d'argument."; +$error['DE'][ARGUMENT_TYPE_EXCEPTION] = "Unzulässige Argumentart."; + +define('ARGUMENT_BOUNDS_EXCEPTION', -3); +$error['EN'][ARGUMENT_BOUNDS_EXCEPTION] = "Invalid argument range."; +$error['FR'][ARGUMENT_BOUNDS_EXCEPTION] = "Gamme inadmissible d'argument."; +$error['DE'][ARGUMENT_BOUNDS_EXCEPTION] = "Unzulässige Argumentstrecke."; + +define('MATRIX_DIMENSION_EXCEPTION', -4); +$error['EN'][MATRIX_DIMENSION_EXCEPTION] = "Matrix dimensions are not equal."; +$error['FR'][MATRIX_DIMENSION_EXCEPTION] = "Les dimensions de Matrix ne sont pas égales."; +$error['DE'][MATRIX_DIMENSION_EXCEPTION] = "Matrixmaße sind nicht gleich."; + +define('PRECISION_LOSS_EXCEPTION', -5); +$error['EN'][PRECISION_LOSS_EXCEPTION] = "Significant precision loss detected."; +$error['FR'][PRECISION_LOSS_EXCEPTION] = "Perte significative de précision détectée."; +$error['DE'][PRECISION_LOSS_EXCEPTION] = "Bedeutender Präzision Verlust ermittelte."; + +define('MATRIX_SPD_EXCEPTION', -6); +$error['EN'][MATRIX_SPD_EXCEPTION] = "Can only perform operation on symmetric positive definite matrix."; +$error['FR'][MATRIX_SPD_EXCEPTION] = "Perte significative de précision détectée."; +$error['DE'][MATRIX_SPD_EXCEPTION] = "Bedeutender Präzision Verlust ermittelte."; + +define('MATRIX_SINGULAR_EXCEPTION', -7); +$error['EN'][MATRIX_SINGULAR_EXCEPTION] = "Can only perform operation on singular matrix."; + +define('MATRIX_RANK_EXCEPTION', -8); +$error['EN'][MATRIX_RANK_EXCEPTION] = "Can only perform operation on full-rank matrix."; + +define('ARRAY_LENGTH_EXCEPTION', -9); +$error['EN'][ARRAY_LENGTH_EXCEPTION] = "Array length must be a multiple of m."; + +define('ROW_LENGTH_EXCEPTION', -10); +$error['EN'][ROW_LENGTH_EXCEPTION] = "All rows must have the same length."; + +/** + * Custom error handler + * @param int $num Error number + */ +function JAMAError($errorNumber = null) +{ + global $error; + + if (isset($errorNumber)) { + if (isset($error[JAMALANG][$errorNumber])) { + return $error[JAMALANG][$errorNumber]; + } else { + return $error['EN'][$errorNumber]; + } + } else { + return ("Invalid argument to JAMAError()"); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/utils/Maths.php b/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/utils/Maths.php new file mode 100644 index 0000000..386c1e6 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/JAMA/utils/Maths.php @@ -0,0 +1,44 @@ +<?php +/** + * @package JAMA + * + * Pythagorean Theorem: + * + * a = 3 + * b = 4 + * r = sqrt(square(a) + square(b)) + * r = 5 + * + * r = sqrt(a^2 + b^2) without under/overflow. + */ +function hypo($a, $b) +{ + if (abs($a) > abs($b)) { + $r = $b / $a; + $r = abs($a) * sqrt(1 + $r * $r); + } elseif ($b != 0) { + $r = $a / $b; + $r = abs($b) * sqrt(1 + $r * $r); + } else { + $r = 0.0; + } + return $r; +} // function hypo() + + +/** + * Mike Bommarito's version. + * Compute n-dimensional hyotheneuse. + * +function hypot() { + $s = 0; + foreach (func_get_args() as $d) { + if (is_numeric($d)) { + $s += pow($d, 2); + } else { + throw new PHPExcel_Calculation_Exception(JAMAError(ARGUMENT_TYPE_EXCEPTION)); + } + } + return sqrt($s); +} +*/ diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/OLE.php b/application/third_party/PHPExcel/PHPExcel/Shared/OLE.php new file mode 100644 index 0000000..42a3c52 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/OLE.php @@ -0,0 +1,526 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4: */ +// +----------------------------------------------------------------------+ +// | PHP Version 4 | +// +----------------------------------------------------------------------+ +// | Copyright (c) 1997-2002 The PHP Group | +// +----------------------------------------------------------------------+ +// | This source file is subject to version 2.02 of the PHP license, | +// | that is bundled with this package in the file LICENSE, and is | +// | available at through the world-wide-web at | +// | http://www.php.net/license/2_02.txt. | +// | If you did not receive a copy of the PHP license and are unable to | +// | obtain it through the world-wide-web, please send a note to | +// | license@php.net so we can mail you a copy immediately. | +// +----------------------------------------------------------------------+ +// | Author: Xavier Noguer <xnoguer@php.net> | +// | Based on OLE::Storage_Lite by Kawai, Takanori | +// +----------------------------------------------------------------------+ +// +// $Id: OLE.php,v 1.13 2007/03/07 14:38:25 schmidt Exp $ + + +/** +* Array for storing OLE instances that are accessed from +* OLE_ChainedBlockStream::stream_open(). +* @var array +*/ +$GLOBALS['_OLE_INSTANCES'] = array(); + +/** +* OLE package base class. +* +* @author Xavier Noguer <xnoguer@php.net> +* @author Christian Schmidt <schmidt@php.net> +* @category PHPExcel +* @package PHPExcel_Shared_OLE +*/ +class PHPExcel_Shared_OLE +{ + const OLE_PPS_TYPE_ROOT = 5; + const OLE_PPS_TYPE_DIR = 1; + const OLE_PPS_TYPE_FILE = 2; + const OLE_DATA_SIZE_SMALL = 0x1000; + const OLE_LONG_INT_SIZE = 4; + const OLE_PPS_SIZE = 0x80; + + /** + * The file handle for reading an OLE container + * @var resource + */ + public $_file_handle; + + /** + * Array of PPS's found on the OLE container + * @var array + */ + public $_list = array(); + + /** + * Root directory of OLE container + * @var OLE_PPS_Root + */ + public $root; + + /** + * Big Block Allocation Table + * @var array (blockId => nextBlockId) + */ + public $bbat; + + /** + * Short Block Allocation Table + * @var array (blockId => nextBlockId) + */ + public $sbat; + + /** + * Size of big blocks. This is usually 512. + * @var int number of octets per block. + */ + public $bigBlockSize; + + /** + * Size of small blocks. This is usually 64. + * @var int number of octets per block + */ + public $smallBlockSize; + + /** + * Reads an OLE container from the contents of the file given. + * + * @acces public + * @param string $file + * @return mixed true on success, PEAR_Error on failure + */ + public function read($file) + { + $fh = fopen($file, "r"); + if (!$fh) { + throw new PHPExcel_Reader_Exception("Can't open file $file"); + } + $this->_file_handle = $fh; + + $signature = fread($fh, 8); + if ("\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" != $signature) { + throw new PHPExcel_Reader_Exception("File doesn't seem to be an OLE container."); + } + fseek($fh, 28); + if (fread($fh, 2) != "\xFE\xFF") { + // This shouldn't be a problem in practice + throw new PHPExcel_Reader_Exception("Only Little-Endian encoding is supported."); + } + // Size of blocks and short blocks in bytes + $this->bigBlockSize = pow(2, self::_readInt2($fh)); + $this->smallBlockSize = pow(2, self::_readInt2($fh)); + + // Skip UID, revision number and version number + fseek($fh, 44); + // Number of blocks in Big Block Allocation Table + $bbatBlockCount = self::_readInt4($fh); + + // Root chain 1st block + $directoryFirstBlockId = self::_readInt4($fh); + + // Skip unused bytes + fseek($fh, 56); + // Streams shorter than this are stored using small blocks + $this->bigBlockThreshold = self::_readInt4($fh); + // Block id of first sector in Short Block Allocation Table + $sbatFirstBlockId = self::_readInt4($fh); + // Number of blocks in Short Block Allocation Table + $sbbatBlockCount = self::_readInt4($fh); + // Block id of first sector in Master Block Allocation Table + $mbatFirstBlockId = self::_readInt4($fh); + // Number of blocks in Master Block Allocation Table + $mbbatBlockCount = self::_readInt4($fh); + $this->bbat = array(); + + // Remaining 4 * 109 bytes of current block is beginning of Master + // Block Allocation Table + $mbatBlocks = array(); + for ($i = 0; $i < 109; ++$i) { + $mbatBlocks[] = self::_readInt4($fh); + } + + // Read rest of Master Block Allocation Table (if any is left) + $pos = $this->_getBlockOffset($mbatFirstBlockId); + for ($i = 0; $i < $mbbatBlockCount; ++$i) { + fseek($fh, $pos); + for ($j = 0; $j < $this->bigBlockSize / 4 - 1; ++$j) { + $mbatBlocks[] = self::_readInt4($fh); + } + // Last block id in each block points to next block + $pos = $this->_getBlockOffset(self::_readInt4($fh)); + } + + // Read Big Block Allocation Table according to chain specified by + // $mbatBlocks + for ($i = 0; $i < $bbatBlockCount; ++$i) { + $pos = $this->_getBlockOffset($mbatBlocks[$i]); + fseek($fh, $pos); + for ($j = 0; $j < $this->bigBlockSize / 4; ++$j) { + $this->bbat[] = self::_readInt4($fh); + } + } + + // Read short block allocation table (SBAT) + $this->sbat = array(); + $shortBlockCount = $sbbatBlockCount * $this->bigBlockSize / 4; + $sbatFh = $this->getStream($sbatFirstBlockId); + for ($blockId = 0; $blockId < $shortBlockCount; ++$blockId) { + $this->sbat[$blockId] = self::_readInt4($sbatFh); + } + fclose($sbatFh); + + $this->_readPpsWks($directoryFirstBlockId); + + return true; + } + + /** + * @param int block id + * @param int byte offset from beginning of file + * @access public + */ + public function _getBlockOffset($blockId) + { + return 512 + $blockId * $this->bigBlockSize; + } + + /** + * Returns a stream for use with fread() etc. External callers should + * use PHPExcel_Shared_OLE_PPS_File::getStream(). + * @param int|PPS block id or PPS + * @return resource read-only stream + */ + public function getStream($blockIdOrPps) + { + static $isRegistered = false; + if (!$isRegistered) { + stream_wrapper_register('ole-chainedblockstream', 'PHPExcel_Shared_OLE_ChainedBlockStream'); + $isRegistered = true; + } + + // Store current instance in global array, so that it can be accessed + // in OLE_ChainedBlockStream::stream_open(). + // Object is removed from self::$instances in OLE_Stream::close(). + $GLOBALS['_OLE_INSTANCES'][] = $this; + $instanceId = end(array_keys($GLOBALS['_OLE_INSTANCES'])); + + $path = 'ole-chainedblockstream://oleInstanceId=' . $instanceId; + if ($blockIdOrPps instanceof PHPExcel_Shared_OLE_PPS) { + $path .= '&blockId=' . $blockIdOrPps->_StartBlock; + $path .= '&size=' . $blockIdOrPps->Size; + } else { + $path .= '&blockId=' . $blockIdOrPps; + } + return fopen($path, 'r'); + } + + /** + * Reads a signed char. + * @param resource file handle + * @return int + * @access public + */ + private static function _readInt1($fh) + { + list(, $tmp) = unpack("c", fread($fh, 1)); + return $tmp; + } + + /** + * Reads an unsigned short (2 octets). + * @param resource file handle + * @return int + * @access public + */ + private static function _readInt2($fh) + { + list(, $tmp) = unpack("v", fread($fh, 2)); + return $tmp; + } + + /** + * Reads an unsigned long (4 octets). + * @param resource file handle + * @return int + * @access public + */ + private static function _readInt4($fh) + { + list(, $tmp) = unpack("V", fread($fh, 4)); + return $tmp; + } + + /** + * Gets information about all PPS's on the OLE container from the PPS WK's + * creates an OLE_PPS object for each one. + * + * @access public + * @param integer the block id of the first block + * @return mixed true on success, PEAR_Error on failure + */ + public function _readPpsWks($blockId) + { + $fh = $this->getStream($blockId); + for ($pos = 0;; $pos += 128) { + fseek($fh, $pos, SEEK_SET); + $nameUtf16 = fread($fh, 64); + $nameLength = self::_readInt2($fh); + $nameUtf16 = substr($nameUtf16, 0, $nameLength - 2); + // Simple conversion from UTF-16LE to ISO-8859-1 + $name = str_replace("\x00", "", $nameUtf16); + $type = self::_readInt1($fh); + switch ($type) { + case self::OLE_PPS_TYPE_ROOT: + $pps = new PHPExcel_Shared_OLE_PPS_Root(null, null, array()); + $this->root = $pps; + break; + case self::OLE_PPS_TYPE_DIR: + $pps = new PHPExcel_Shared_OLE_PPS(null, null, null, null, null, null, null, null, null, array()); + break; + case self::OLE_PPS_TYPE_FILE: + $pps = new PHPExcel_Shared_OLE_PPS_File($name); + break; + default: + continue; + } + fseek($fh, 1, SEEK_CUR); + $pps->Type = $type; + $pps->Name = $name; + $pps->PrevPps = self::_readInt4($fh); + $pps->NextPps = self::_readInt4($fh); + $pps->DirPps = self::_readInt4($fh); + fseek($fh, 20, SEEK_CUR); + $pps->Time1st = self::OLE2LocalDate(fread($fh, 8)); + $pps->Time2nd = self::OLE2LocalDate(fread($fh, 8)); + $pps->_StartBlock = self::_readInt4($fh); + $pps->Size = self::_readInt4($fh); + $pps->No = count($this->_list); + $this->_list[] = $pps; + + // check if the PPS tree (starting from root) is complete + if (isset($this->root) && $this->_ppsTreeComplete($this->root->No)) { + break; + } + } + fclose($fh); + + // Initialize $pps->children on directories + foreach ($this->_list as $pps) { + if ($pps->Type == self::OLE_PPS_TYPE_DIR || $pps->Type == self::OLE_PPS_TYPE_ROOT) { + $nos = array($pps->DirPps); + $pps->children = array(); + while ($nos) { + $no = array_pop($nos); + if ($no != -1) { + $childPps = $this->_list[$no]; + $nos[] = $childPps->PrevPps; + $nos[] = $childPps->NextPps; + $pps->children[] = $childPps; + } + } + } + } + + return true; + } + + /** + * It checks whether the PPS tree is complete (all PPS's read) + * starting with the given PPS (not necessarily root) + * + * @access public + * @param integer $index The index of the PPS from which we are checking + * @return boolean Whether the PPS tree for the given PPS is complete + */ + public function _ppsTreeComplete($index) + { + return isset($this->_list[$index]) && + ($pps = $this->_list[$index]) && + ($pps->PrevPps == -1 || + $this->_ppsTreeComplete($pps->PrevPps)) && + ($pps->NextPps == -1 || + $this->_ppsTreeComplete($pps->NextPps)) && + ($pps->DirPps == -1 || + $this->_ppsTreeComplete($pps->DirPps)); + } + + /** + * Checks whether a PPS is a File PPS or not. + * If there is no PPS for the index given, it will return false. + * + * @access public + * @param integer $index The index for the PPS + * @return bool true if it's a File PPS, false otherwise + */ + public function isFile($index) + { + if (isset($this->_list[$index])) { + return ($this->_list[$index]->Type == self::OLE_PPS_TYPE_FILE); + } + return false; + } + + /** + * Checks whether a PPS is a Root PPS or not. + * If there is no PPS for the index given, it will return false. + * + * @access public + * @param integer $index The index for the PPS. + * @return bool true if it's a Root PPS, false otherwise + */ + public function isRoot($index) + { + if (isset($this->_list[$index])) { + return ($this->_list[$index]->Type == self::OLE_PPS_TYPE_ROOT); + } + return false; + } + + /** + * Gives the total number of PPS's found in the OLE container. + * + * @access public + * @return integer The total number of PPS's found in the OLE container + */ + public function ppsTotal() + { + return count($this->_list); + } + + /** + * Gets data from a PPS + * If there is no PPS for the index given, it will return an empty string. + * + * @access public + * @param integer $index The index for the PPS + * @param integer $position The position from which to start reading + * (relative to the PPS) + * @param integer $length The amount of bytes to read (at most) + * @return string The binary string containing the data requested + * @see OLE_PPS_File::getStream() + */ + public function getData($index, $position, $length) + { + // if position is not valid return empty string + if (!isset($this->_list[$index]) || ($position >= $this->_list[$index]->Size) || ($position < 0)) { + return ''; + } + $fh = $this->getStream($this->_list[$index]); + $data = stream_get_contents($fh, $length, $position); + fclose($fh); + return $data; + } + + /** + * Gets the data length from a PPS + * If there is no PPS for the index given, it will return 0. + * + * @access public + * @param integer $index The index for the PPS + * @return integer The amount of bytes in data the PPS has + */ + public function getDataLength($index) + { + if (isset($this->_list[$index])) { + return $this->_list[$index]->Size; + } + return 0; + } + + /** + * Utility function to transform ASCII text to Unicode + * + * @access public + * @static + * @param string $ascii The ASCII string to transform + * @return string The string in Unicode + */ + public static function Asc2Ucs($ascii) + { + $rawname = ''; + for ($i = 0; $i < strlen($ascii); ++$i) { + $rawname .= $ascii{$i} . "\x00"; + } + return $rawname; + } + + /** + * Utility function + * Returns a string for the OLE container with the date given + * + * @access public + * @static + * @param integer $date A timestamp + * @return string The string for the OLE container + */ + public static function LocalDate2OLE($date = null) + { + if (!isset($date)) { + return "\x00\x00\x00\x00\x00\x00\x00\x00"; + } + + // factor used for separating numbers into 4 bytes parts + $factor = pow(2, 32); + + // days from 1-1-1601 until the beggining of UNIX era + $days = 134774; + // calculate seconds + $big_date = $days*24*3600 + gmmktime(date("H", $date), date("i", $date), date("s", $date), date("m", $date), date("d", $date), date("Y", $date)); + // multiply just to make MS happy + $big_date *= 10000000; + + $high_part = floor($big_date / $factor); + // lower 4 bytes + $low_part = floor((($big_date / $factor) - $high_part) * $factor); + + // Make HEX string + $res = ''; + + for ($i = 0; $i < 4; ++$i) { + $hex = $low_part % 0x100; + $res .= pack('c', $hex); + $low_part /= 0x100; + } + for ($i = 0; $i < 4; ++$i) { + $hex = $high_part % 0x100; + $res .= pack('c', $hex); + $high_part /= 0x100; + } + return $res; + } + + /** + * Returns a timestamp from an OLE container's date + * + * @access public + * @static + * @param integer $string A binary string with the encoded date + * @return string The timestamp corresponding to the string + */ + public static function OLE2LocalDate($string) + { + if (strlen($string) != 8) { + return new PEAR_Error("Expecting 8 byte string"); + } + + // factor used for separating numbers into 4 bytes parts + $factor = pow(2, 32); + list(, $high_part) = unpack('V', substr($string, 4, 4)); + list(, $low_part) = unpack('V', substr($string, 0, 4)); + + $big_date = ($high_part * $factor) + $low_part; + // translate to seconds + $big_date /= 10000000; + + // days from 1-1-1601 until the beggining of UNIX era + $days = 134774; + + // translate to seconds from beggining of UNIX era + $big_date -= $days * 24 * 3600; + return floor($big_date); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/OLE/ChainedBlockStream.php b/application/third_party/PHPExcel/PHPExcel/Shared/OLE/ChainedBlockStream.php new file mode 100644 index 0000000..84d2cc5 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/OLE/ChainedBlockStream.php @@ -0,0 +1,206 @@ +<?php + +/** + * PHPExcel_Shared_OLE_ChainedBlockStream + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_OLE + * @copyright Copyright (c) 2006 - 2007 Christian Schmidt + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Shared_OLE_ChainedBlockStream +{ + /** + * The OLE container of the file that is being read. + * @var OLE + */ + public $ole; + + /** + * Parameters specified by fopen(). + * @var array + */ + public $params; + + /** + * The binary data of the file. + * @var string + */ + public $data; + + /** + * The file pointer. + * @var int byte offset + */ + public $pos; + + /** + * Implements support for fopen(). + * For creating streams using this wrapper, use OLE_PPS_File::getStream(). + * + * @param string $path resource name including scheme, e.g. + * ole-chainedblockstream://oleInstanceId=1 + * @param string $mode only "r" is supported + * @param int $options mask of STREAM_REPORT_ERRORS and STREAM_USE_PATH + * @param string &$openedPath absolute path of the opened stream (out parameter) + * @return bool true on success + */ + public function stream_open($path, $mode, $options, &$openedPath) + { + if ($mode != 'r') { + if ($options & STREAM_REPORT_ERRORS) { + trigger_error('Only reading is supported', E_USER_WARNING); + } + return false; + } + + // 25 is length of "ole-chainedblockstream://" + parse_str(substr($path, 25), $this->params); + if (!isset($this->params['oleInstanceId'], $this->params['blockId'], $GLOBALS['_OLE_INSTANCES'][$this->params['oleInstanceId']])) { + if ($options & STREAM_REPORT_ERRORS) { + trigger_error('OLE stream not found', E_USER_WARNING); + } + return false; + } + $this->ole = $GLOBALS['_OLE_INSTANCES'][$this->params['oleInstanceId']]; + + $blockId = $this->params['blockId']; + $this->data = ''; + if (isset($this->params['size']) && $this->params['size'] < $this->ole->bigBlockThreshold && $blockId != $this->ole->root->_StartBlock) { + // Block id refers to small blocks + $rootPos = $this->ole->_getBlockOffset($this->ole->root->_StartBlock); + while ($blockId != -2) { + $pos = $rootPos + $blockId * $this->ole->bigBlockSize; + $blockId = $this->ole->sbat[$blockId]; + fseek($this->ole->_file_handle, $pos); + $this->data .= fread($this->ole->_file_handle, $this->ole->bigBlockSize); + } + } else { + // Block id refers to big blocks + while ($blockId != -2) { + $pos = $this->ole->_getBlockOffset($blockId); + fseek($this->ole->_file_handle, $pos); + $this->data .= fread($this->ole->_file_handle, $this->ole->bigBlockSize); + $blockId = $this->ole->bbat[$blockId]; + } + } + if (isset($this->params['size'])) { + $this->data = substr($this->data, 0, $this->params['size']); + } + + if ($options & STREAM_USE_PATH) { + $openedPath = $path; + } + + return true; + } + + /** + * Implements support for fclose(). + * + */ + public function stream_close() + { + $this->ole = null; + unset($GLOBALS['_OLE_INSTANCES']); + } + + /** + * Implements support for fread(), fgets() etc. + * + * @param int $count maximum number of bytes to read + * @return string + */ + public function stream_read($count) + { + if ($this->stream_eof()) { + return false; + } + $s = substr($this->data, $this->pos, $count); + $this->pos += $count; + return $s; + } + + /** + * Implements support for feof(). + * + * @return bool TRUE if the file pointer is at EOF; otherwise FALSE + */ + public function stream_eof() + { + return $this->pos >= strlen($this->data); + } + + /** + * Returns the position of the file pointer, i.e. its offset into the file + * stream. Implements support for ftell(). + * + * @return int + */ + public function stream_tell() + { + return $this->pos; + } + + /** + * Implements support for fseek(). + * + * @param int $offset byte offset + * @param int $whence SEEK_SET, SEEK_CUR or SEEK_END + * @return bool + */ + public function stream_seek($offset, $whence) + { + if ($whence == SEEK_SET && $offset >= 0) { + $this->pos = $offset; + } elseif ($whence == SEEK_CUR && -$offset <= $this->pos) { + $this->pos += $offset; + } elseif ($whence == SEEK_END && -$offset <= sizeof($this->data)) { + $this->pos = strlen($this->data) + $offset; + } else { + return false; + } + return true; + } + + /** + * Implements support for fstat(). Currently the only supported field is + * "size". + * @return array + */ + public function stream_stat() + { + return array( + 'size' => strlen($this->data), + ); + } + + // Methods used by stream_wrapper_register() that are not implemented: + // bool stream_flush ( void ) + // int stream_write ( string data ) + // bool rename ( string path_from, string path_to ) + // bool mkdir ( string path, int mode, int options ) + // bool rmdir ( string path, int options ) + // bool dir_opendir ( string path, int options ) + // array url_stat ( string path, int flags ) + // string dir_readdir ( void ) + // bool dir_rewinddir ( void ) + // bool dir_closedir ( void ) +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/OLE/PPS.php b/application/third_party/PHPExcel/PHPExcel/Shared/OLE/PPS.php new file mode 100644 index 0000000..608a892 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/OLE/PPS.php @@ -0,0 +1,230 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4: */ +// +----------------------------------------------------------------------+ +// | PHP Version 4 | +// +----------------------------------------------------------------------+ +// | Copyright (c) 1997-2002 The PHP Group | +// +----------------------------------------------------------------------+ +// | This source file is subject to version 2.02 of the PHP license, | +// | that is bundled with this package in the file LICENSE, and is | +// | available at through the world-wide-web at | +// | http://www.php.net/license/2_02.txt. | +// | If you did not receive a copy of the PHP license and are unable to | +// | obtain it through the world-wide-web, please send a note to | +// | license@php.net so we can mail you a copy immediately. | +// +----------------------------------------------------------------------+ +// | Author: Xavier Noguer <xnoguer@php.net> | +// | Based on OLE::Storage_Lite by Kawai, Takanori | +// +----------------------------------------------------------------------+ +// +// $Id: PPS.php,v 1.7 2007/02/13 21:00:42 schmidt Exp $ + + +/** +* Class for creating PPS's for OLE containers +* +* @author Xavier Noguer <xnoguer@php.net> +* @category PHPExcel +* @package PHPExcel_Shared_OLE +*/ +class PHPExcel_Shared_OLE_PPS +{ + /** + * The PPS index + * @var integer + */ + public $No; + + /** + * The PPS name (in Unicode) + * @var string + */ + public $Name; + + /** + * The PPS type. Dir, Root or File + * @var integer + */ + public $Type; + + /** + * The index of the previous PPS + * @var integer + */ + public $PrevPps; + + /** + * The index of the next PPS + * @var integer + */ + public $NextPps; + + /** + * The index of it's first child if this is a Dir or Root PPS + * @var integer + */ + public $DirPps; + + /** + * A timestamp + * @var integer + */ + public $Time1st; + + /** + * A timestamp + * @var integer + */ + public $Time2nd; + + /** + * Starting block (small or big) for this PPS's data inside the container + * @var integer + */ + public $_StartBlock; + + /** + * The size of the PPS's data (in bytes) + * @var integer + */ + public $Size; + + /** + * The PPS's data (only used if it's not using a temporary file) + * @var string + */ + public $_data; + + /** + * Array of child PPS's (only used by Root and Dir PPS's) + * @var array + */ + public $children = array(); + + /** + * Pointer to OLE container + * @var OLE + */ + public $ole; + + /** + * The constructor + * + * @access public + * @param integer $No The PPS index + * @param string $name The PPS name + * @param integer $type The PPS type. Dir, Root or File + * @param integer $prev The index of the previous PPS + * @param integer $next The index of the next PPS + * @param integer $dir The index of it's first child if this is a Dir or Root PPS + * @param integer $time_1st A timestamp + * @param integer $time_2nd A timestamp + * @param string $data The (usually binary) source data of the PPS + * @param array $children Array containing children PPS for this PPS + */ + public function __construct($No, $name, $type, $prev, $next, $dir, $time_1st, $time_2nd, $data, $children) + { + $this->No = $No; + $this->Name = $name; + $this->Type = $type; + $this->PrevPps = $prev; + $this->NextPps = $next; + $this->DirPps = $dir; + $this->Time1st = $time_1st; + $this->Time2nd = $time_2nd; + $this->_data = $data; + $this->children = $children; + if ($data != '') { + $this->Size = strlen($data); + } else { + $this->Size = 0; + } + } + + /** + * Returns the amount of data saved for this PPS + * + * @access public + * @return integer The amount of data (in bytes) + */ + public function _DataLen() + { + if (!isset($this->_data)) { + return 0; + } + //if (isset($this->_PPS_FILE)) { + // fseek($this->_PPS_FILE, 0); + // $stats = fstat($this->_PPS_FILE); + // return $stats[7]; + //} else { + return strlen($this->_data); + //} + } + + /** + * Returns a string with the PPS's WK (What is a WK?) + * + * @access public + * @return string The binary string + */ + public function _getPpsWk() + { + $ret = str_pad($this->Name, 64, "\x00"); + + $ret .= pack("v", strlen($this->Name) + 2) // 66 + . pack("c", $this->Type) // 67 + . pack("c", 0x00) //UK // 68 + . pack("V", $this->PrevPps) //Prev // 72 + . pack("V", $this->NextPps) //Next // 76 + . pack("V", $this->DirPps) //Dir // 80 + . "\x00\x09\x02\x00" // 84 + . "\x00\x00\x00\x00" // 88 + . "\xc0\x00\x00\x00" // 92 + . "\x00\x00\x00\x46" // 96 // Seems to be ok only for Root + . "\x00\x00\x00\x00" // 100 + . PHPExcel_Shared_OLE::LocalDate2OLE($this->Time1st) // 108 + . PHPExcel_Shared_OLE::LocalDate2OLE($this->Time2nd) // 116 + . pack("V", isset($this->_StartBlock)? + $this->_StartBlock:0) // 120 + . pack("V", $this->Size) // 124 + . pack("V", 0); // 128 + return $ret; + } + + /** + * Updates index and pointers to previous, next and children PPS's for this + * PPS. I don't think it'll work with Dir PPS's. + * + * @access public + * @param array &$raList Reference to the array of PPS's for the whole OLE + * container + * @return integer The index for this PPS + */ + public static function _savePpsSetPnt(&$raList, $to_save, $depth = 0) + { + if (!is_array($to_save) || (empty($to_save))) { + return 0xFFFFFFFF; + } elseif (count($to_save) == 1) { + $cnt = count($raList); + // If the first entry, it's the root... Don't clone it! + $raList[$cnt] = ( $depth == 0 ) ? $to_save[0] : clone $to_save[0]; + $raList[$cnt]->No = $cnt; + $raList[$cnt]->PrevPps = 0xFFFFFFFF; + $raList[$cnt]->NextPps = 0xFFFFFFFF; + $raList[$cnt]->DirPps = self::_savePpsSetPnt($raList, @$raList[$cnt]->children, $depth++); + } else { + $iPos = floor(count($to_save) / 2); + $aPrev = array_slice($to_save, 0, $iPos); + $aNext = array_slice($to_save, $iPos + 1); + $cnt = count($raList); + // If the first entry, it's the root... Don't clone it! + $raList[$cnt] = ( $depth == 0 ) ? $to_save[$iPos] : clone $to_save[$iPos]; + $raList[$cnt]->No = $cnt; + $raList[$cnt]->PrevPps = self::_savePpsSetPnt($raList, $aPrev, $depth++); + $raList[$cnt]->NextPps = self::_savePpsSetPnt($raList, $aNext, $depth++); + $raList[$cnt]->DirPps = self::_savePpsSetPnt($raList, @$raList[$cnt]->children, $depth++); + + } + return $cnt; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/OLE/PPS/File.php b/application/third_party/PHPExcel/PHPExcel/Shared/OLE/PPS/File.php new file mode 100644 index 0000000..1ca337c --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/OLE/PPS/File.php @@ -0,0 +1,74 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4: */ +// +----------------------------------------------------------------------+ +// | PHP Version 4 | +// +----------------------------------------------------------------------+ +// | Copyright (c) 1997-2002 The PHP Group | +// +----------------------------------------------------------------------+ +// | This source file is subject to version 2.02 of the PHP license, | +// | that is bundled with this package in the file LICENSE, and is | +// | available at through the world-wide-web at | +// | http://www.php.net/license/2_02.txt. | +// | If you did not receive a copy of the PHP license and are unable to | +// | obtain it through the world-wide-web, please send a note to | +// | license@php.net so we can mail you a copy immediately. | +// +----------------------------------------------------------------------+ +// | Author: Xavier Noguer <xnoguer@php.net> | +// | Based on OLE::Storage_Lite by Kawai, Takanori | +// +----------------------------------------------------------------------+ +// +// $Id: File.php,v 1.11 2007/02/13 21:00:42 schmidt Exp $ + + +/** +* Class for creating File PPS's for OLE containers +* +* @author Xavier Noguer <xnoguer@php.net> +* @category PHPExcel +* @package PHPExcel_Shared_OLE +*/ +class PHPExcel_Shared_OLE_PPS_File extends PHPExcel_Shared_OLE_PPS +{ + /** + * The constructor + * + * @access public + * @param string $name The name of the file (in Unicode) + * @see OLE::Asc2Ucs() + */ + public function __construct($name) + { + parent::__construct(null, $name, PHPExcel_Shared_OLE::OLE_PPS_TYPE_FILE, null, null, null, null, null, '', array()); + } + + /** + * Initialization method. Has to be called right after OLE_PPS_File(). + * + * @access public + * @return mixed true on success + */ + public function init() + { + return true; + } + + /** + * Append data to PPS + * + * @access public + * @param string $data The data to append + */ + public function append($data) + { + $this->_data .= $data; + } + + /** + * Returns a stream for reading this file using fread() etc. + * @return resource a read-only stream + */ + public function getStream() + { + $this->ole->getStream($this); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/OLE/PPS/Root.php b/application/third_party/PHPExcel/PHPExcel/Shared/OLE/PPS/Root.php new file mode 100644 index 0000000..5d4052f --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/OLE/PPS/Root.php @@ -0,0 +1,462 @@ +<?php +/* vim: set expandtab tabstop=4 shiftwidth=4: */ +// +----------------------------------------------------------------------+ +// | PHP Version 4 | +// +----------------------------------------------------------------------+ +// | Copyright (c) 1997-2002 The PHP Group | +// +----------------------------------------------------------------------+ +// | This source file is subject to version 2.02 of the PHP license, | +// | that is bundled with this package in the file LICENSE, and is | +// | available at through the world-wide-web at | +// | http://www.php.net/license/2_02.txt. | +// | If you did not receive a copy of the PHP license and are unable to | +// | obtain it through the world-wide-web, please send a note to | +// | license@php.net so we can mail you a copy immediately. | +// +----------------------------------------------------------------------+ +// | Author: Xavier Noguer <xnoguer@php.net> | +// | Based on OLE::Storage_Lite by Kawai, Takanori | +// +----------------------------------------------------------------------+ +// +// $Id: Root.php,v 1.9 2005/04/23 21:53:49 dufuz Exp $ + + +/** +* Class for creating Root PPS's for OLE containers +* +* @author Xavier Noguer <xnoguer@php.net> +* @category PHPExcel +* @package PHPExcel_Shared_OLE +*/ +class PHPExcel_Shared_OLE_PPS_Root extends PHPExcel_Shared_OLE_PPS +{ + + /** + * Directory for temporary files + * @var string + */ + protected $tempDirectory = null; + + /** + * @param integer $time_1st A timestamp + * @param integer $time_2nd A timestamp + */ + public function __construct($time_1st, $time_2nd, $raChild) + { + $this->_tempDir = PHPExcel_Shared_File::sys_get_temp_dir(); + + parent::__construct(null, PHPExcel_Shared_OLE::Asc2Ucs('Root Entry'), PHPExcel_Shared_OLE::OLE_PPS_TYPE_ROOT, null, null, null, $time_1st, $time_2nd, null, $raChild); + } + + /** + * Method for saving the whole OLE container (including files). + * In fact, if called with an empty argument (or '-'), it saves to a + * temporary file and then outputs it's contents to stdout. + * If a resource pointer to a stream created by fopen() is passed + * it will be used, but you have to close such stream by yourself. + * + * @param string|resource $filename The name of the file or stream where to save the OLE container. + * @access public + * @return mixed true on success + */ + public function save($filename) + { + // Initial Setting for saving + $this->_BIG_BLOCK_SIZE = pow( + 2, + (isset($this->_BIG_BLOCK_SIZE))? self::adjust2($this->_BIG_BLOCK_SIZE) : 9 + ); + $this->_SMALL_BLOCK_SIZE= pow( + 2, + (isset($this->_SMALL_BLOCK_SIZE))? self::adjust2($this->_SMALL_BLOCK_SIZE) : 6 + ); + + if (is_resource($filename)) { + $this->_FILEH_ = $filename; + } elseif ($filename == '-' || $filename == '') { + if ($this->tempDirectory === null) { + $this->tempDirectory = PHPExcel_Shared_File::sys_get_temp_dir(); + } + $this->_tmp_filename = tempnam($this->tempDirectory, "OLE_PPS_Root"); + $this->_FILEH_ = fopen($this->_tmp_filename, "w+b"); + if ($this->_FILEH_ == false) { + throw new PHPExcel_Writer_Exception("Can't create temporary file."); + } + } else { + $this->_FILEH_ = fopen($filename, "wb"); + } + if ($this->_FILEH_ == false) { + throw new PHPExcel_Writer_Exception("Can't open $filename. It may be in use or protected."); + } + // Make an array of PPS's (for Save) + $aList = array(); + PHPExcel_Shared_OLE_PPS::_savePpsSetPnt($aList, array($this)); + // calculate values for header + list($iSBDcnt, $iBBcnt, $iPPScnt) = $this->_calcSize($aList); //, $rhInfo); + // Save Header + $this->_saveHeader($iSBDcnt, $iBBcnt, $iPPScnt); + + // Make Small Data string (write SBD) + $this->_data = $this->_makeSmallData($aList); + + // Write BB + $this->_saveBigData($iSBDcnt, $aList); + // Write PPS + $this->_savePps($aList); + // Write Big Block Depot and BDList and Adding Header informations + $this->_saveBbd($iSBDcnt, $iBBcnt, $iPPScnt); + + if (!is_resource($filename)) { + fclose($this->_FILEH_); + } + + return true; + } + + /** + * Calculate some numbers + * + * @access public + * @param array $raList Reference to an array of PPS's + * @return array The array of numbers + */ + public function _calcSize(&$raList) + { + // Calculate Basic Setting + list($iSBDcnt, $iBBcnt, $iPPScnt) = array(0,0,0); + $iSmallLen = 0; + $iSBcnt = 0; + $iCount = count($raList); + for ($i = 0; $i < $iCount; ++$i) { + if ($raList[$i]->Type == PHPExcel_Shared_OLE::OLE_PPS_TYPE_FILE) { + $raList[$i]->Size = $raList[$i]->_DataLen(); + if ($raList[$i]->Size < PHPExcel_Shared_OLE::OLE_DATA_SIZE_SMALL) { + $iSBcnt += floor($raList[$i]->Size / $this->_SMALL_BLOCK_SIZE) + + (($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)? 1: 0); + } else { + $iBBcnt += (floor($raList[$i]->Size / $this->_BIG_BLOCK_SIZE) + + (($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)? 1: 0)); + } + } + } + $iSmallLen = $iSBcnt * $this->_SMALL_BLOCK_SIZE; + $iSlCnt = floor($this->_BIG_BLOCK_SIZE / PHPExcel_Shared_OLE::OLE_LONG_INT_SIZE); + $iSBDcnt = floor($iSBcnt / $iSlCnt) + (($iSBcnt % $iSlCnt)? 1:0); + $iBBcnt += (floor($iSmallLen / $this->_BIG_BLOCK_SIZE) + + (( $iSmallLen % $this->_BIG_BLOCK_SIZE)? 1: 0)); + $iCnt = count($raList); + $iBdCnt = $this->_BIG_BLOCK_SIZE / PHPExcel_Shared_OLE::OLE_PPS_SIZE; + $iPPScnt = (floor($iCnt/$iBdCnt) + (($iCnt % $iBdCnt)? 1: 0)); + + return array($iSBDcnt, $iBBcnt, $iPPScnt); + } + + /** + * Helper function for caculating a magic value for block sizes + * + * @access public + * @param integer $i2 The argument + * @see save() + * @return integer + */ + private static function adjust2($i2) + { + $iWk = log($i2)/log(2); + return ($iWk > floor($iWk))? floor($iWk)+1:$iWk; + } + + /** + * Save OLE header + * + * @access public + * @param integer $iSBDcnt + * @param integer $iBBcnt + * @param integer $iPPScnt + */ + public function _saveHeader($iSBDcnt, $iBBcnt, $iPPScnt) + { + $FILE = $this->_FILEH_; + + // Calculate Basic Setting + $iBlCnt = $this->_BIG_BLOCK_SIZE / PHPExcel_Shared_OLE::OLE_LONG_INT_SIZE; + $i1stBdL = ($this->_BIG_BLOCK_SIZE - 0x4C) / PHPExcel_Shared_OLE::OLE_LONG_INT_SIZE; + + $iBdExL = 0; + $iAll = $iBBcnt + $iPPScnt + $iSBDcnt; + $iAllW = $iAll; + $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt)? 1: 0); + $iBdCnt = floor(($iAll + $iBdCntW) / $iBlCnt) + ((($iAllW+$iBdCntW) % $iBlCnt)? 1: 0); + + // Calculate BD count + if ($iBdCnt > $i1stBdL) { + while (1) { + ++$iBdExL; + ++$iAllW; + $iBdCntW = floor($iAllW / $iBlCnt) + (($iAllW % $iBlCnt)? 1: 0); + $iBdCnt = floor(($iAllW + $iBdCntW) / $iBlCnt) + ((($iAllW+$iBdCntW) % $iBlCnt)? 1: 0); + if ($iBdCnt <= ($iBdExL*$iBlCnt+ $i1stBdL)) { + break; + } + } + } + + // Save Header + fwrite( + $FILE, + "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1" + . "\x00\x00\x00\x00" + . "\x00\x00\x00\x00" + . "\x00\x00\x00\x00" + . "\x00\x00\x00\x00" + . pack("v", 0x3b) + . pack("v", 0x03) + . pack("v", -2) + . pack("v", 9) + . pack("v", 6) + . pack("v", 0) + . "\x00\x00\x00\x00" + . "\x00\x00\x00\x00" + . pack("V", $iBdCnt) + . pack("V", $iBBcnt+$iSBDcnt) //ROOT START + . pack("V", 0) + . pack("V", 0x1000) + . pack("V", $iSBDcnt ? 0 : -2) //Small Block Depot + . pack("V", $iSBDcnt) + ); + // Extra BDList Start, Count + if ($iBdCnt < $i1stBdL) { + fwrite( + $FILE, + pack("V", -2) // Extra BDList Start + . pack("V", 0)// Extra BDList Count + ); + } else { + fwrite($FILE, pack("V", $iAll+$iBdCnt) . pack("V", $iBdExL)); + } + + // BDList + for ($i = 0; $i < $i1stBdL && $i < $iBdCnt; ++$i) { + fwrite($FILE, pack("V", $iAll+$i)); + } + if ($i < $i1stBdL) { + $jB = $i1stBdL - $i; + for ($j = 0; $j < $jB; ++$j) { + fwrite($FILE, (pack("V", -1))); + } + } + } + + /** + * Saving big data (PPS's with data bigger than PHPExcel_Shared_OLE::OLE_DATA_SIZE_SMALL) + * + * @access public + * @param integer $iStBlk + * @param array &$raList Reference to array of PPS's + */ + public function _saveBigData($iStBlk, &$raList) + { + $FILE = $this->_FILEH_; + + // cycle through PPS's + $iCount = count($raList); + for ($i = 0; $i < $iCount; ++$i) { + if ($raList[$i]->Type != PHPExcel_Shared_OLE::OLE_PPS_TYPE_DIR) { + $raList[$i]->Size = $raList[$i]->_DataLen(); + if (($raList[$i]->Size >= PHPExcel_Shared_OLE::OLE_DATA_SIZE_SMALL) || (($raList[$i]->Type == PHPExcel_Shared_OLE::OLE_PPS_TYPE_ROOT) && isset($raList[$i]->_data))) { + // Write Data + //if (isset($raList[$i]->_PPS_FILE)) { + // $iLen = 0; + // fseek($raList[$i]->_PPS_FILE, 0); // To The Top + // while ($sBuff = fread($raList[$i]->_PPS_FILE, 4096)) { + // $iLen += strlen($sBuff); + // fwrite($FILE, $sBuff); + // } + //} else { + fwrite($FILE, $raList[$i]->_data); + //} + + if ($raList[$i]->Size % $this->_BIG_BLOCK_SIZE) { + fwrite($FILE, str_repeat("\x00", $this->_BIG_BLOCK_SIZE - ($raList[$i]->Size % $this->_BIG_BLOCK_SIZE))); + } + // Set For PPS + $raList[$i]->_StartBlock = $iStBlk; + $iStBlk += + (floor($raList[$i]->Size / $this->_BIG_BLOCK_SIZE) + + (($raList[$i]->Size % $this->_BIG_BLOCK_SIZE)? 1: 0)); + } + // Close file for each PPS, and unlink it + //if (isset($raList[$i]->_PPS_FILE)) { + // fclose($raList[$i]->_PPS_FILE); + // $raList[$i]->_PPS_FILE = null; + // unlink($raList[$i]->_tmp_filename); + //} + } + } + } + + /** + * get small data (PPS's with data smaller than PHPExcel_Shared_OLE::OLE_DATA_SIZE_SMALL) + * + * @access public + * @param array &$raList Reference to array of PPS's + */ + public function _makeSmallData(&$raList) + { + $sRes = ''; + $FILE = $this->_FILEH_; + $iSmBlk = 0; + + $iCount = count($raList); + for ($i = 0; $i < $iCount; ++$i) { + // Make SBD, small data string + if ($raList[$i]->Type == PHPExcel_Shared_OLE::OLE_PPS_TYPE_FILE) { + if ($raList[$i]->Size <= 0) { + continue; + } + if ($raList[$i]->Size < PHPExcel_Shared_OLE::OLE_DATA_SIZE_SMALL) { + $iSmbCnt = floor($raList[$i]->Size / $this->_SMALL_BLOCK_SIZE) + + (($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)? 1: 0); + // Add to SBD + $jB = $iSmbCnt - 1; + for ($j = 0; $j < $jB; ++$j) { + fwrite($FILE, pack("V", $j+$iSmBlk+1)); + } + fwrite($FILE, pack("V", -2)); + + //// Add to Data String(this will be written for RootEntry) + //if ($raList[$i]->_PPS_FILE) { + // fseek($raList[$i]->_PPS_FILE, 0); // To The Top + // while ($sBuff = fread($raList[$i]->_PPS_FILE, 4096)) { + // $sRes .= $sBuff; + // } + //} else { + $sRes .= $raList[$i]->_data; + //} + if ($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE) { + $sRes .= str_repeat("\x00", $this->_SMALL_BLOCK_SIZE - ($raList[$i]->Size % $this->_SMALL_BLOCK_SIZE)); + } + // Set for PPS + $raList[$i]->_StartBlock = $iSmBlk; + $iSmBlk += $iSmbCnt; + } + } + } + $iSbCnt = floor($this->_BIG_BLOCK_SIZE / PHPExcel_Shared_OLE::OLE_LONG_INT_SIZE); + if ($iSmBlk % $iSbCnt) { + $iB = $iSbCnt - ($iSmBlk % $iSbCnt); + for ($i = 0; $i < $iB; ++$i) { + fwrite($FILE, pack("V", -1)); + } + } + return $sRes; + } + + /** + * Saves all the PPS's WKs + * + * @access public + * @param array $raList Reference to an array with all PPS's + */ + public function _savePps(&$raList) + { + // Save each PPS WK + $iC = count($raList); + for ($i = 0; $i < $iC; ++$i) { + fwrite($this->_FILEH_, $raList[$i]->_getPpsWk()); + } + // Adjust for Block + $iCnt = count($raList); + $iBCnt = $this->_BIG_BLOCK_SIZE / PHPExcel_Shared_OLE::OLE_PPS_SIZE; + if ($iCnt % $iBCnt) { + fwrite($this->_FILEH_, str_repeat("\x00", ($iBCnt - ($iCnt % $iBCnt)) * PHPExcel_Shared_OLE::OLE_PPS_SIZE)); + } + } + + /** + * Saving Big Block Depot + * + * @access public + * @param integer $iSbdSize + * @param integer $iBsize + * @param integer $iPpsCnt + */ + public function _saveBbd($iSbdSize, $iBsize, $iPpsCnt) + { + $FILE = $this->_FILEH_; + // Calculate Basic Setting + $iBbCnt = $this->_BIG_BLOCK_SIZE / PHPExcel_Shared_OLE::OLE_LONG_INT_SIZE; + $i1stBdL = ($this->_BIG_BLOCK_SIZE - 0x4C) / PHPExcel_Shared_OLE::OLE_LONG_INT_SIZE; + + $iBdExL = 0; + $iAll = $iBsize + $iPpsCnt + $iSbdSize; + $iAllW = $iAll; + $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt)? 1: 0); + $iBdCnt = floor(($iAll + $iBdCntW) / $iBbCnt) + ((($iAllW+$iBdCntW) % $iBbCnt)? 1: 0); + // Calculate BD count + if ($iBdCnt >$i1stBdL) { + while (1) { + ++$iBdExL; + ++$iAllW; + $iBdCntW = floor($iAllW / $iBbCnt) + (($iAllW % $iBbCnt)? 1: 0); + $iBdCnt = floor(($iAllW + $iBdCntW) / $iBbCnt) + ((($iAllW+$iBdCntW) % $iBbCnt)? 1: 0); + if ($iBdCnt <= ($iBdExL*$iBbCnt+ $i1stBdL)) { + break; + } + } + } + + // Making BD + // Set for SBD + if ($iSbdSize > 0) { + for ($i = 0; $i < ($iSbdSize - 1); ++$i) { + fwrite($FILE, pack("V", $i+1)); + } + fwrite($FILE, pack("V", -2)); + } + // Set for B + for ($i = 0; $i < ($iBsize - 1); ++$i) { + fwrite($FILE, pack("V", $i+$iSbdSize+1)); + } + fwrite($FILE, pack("V", -2)); + + // Set for PPS + for ($i = 0; $i < ($iPpsCnt - 1); ++$i) { + fwrite($FILE, pack("V", $i+$iSbdSize+$iBsize+1)); + } + fwrite($FILE, pack("V", -2)); + // Set for BBD itself ( 0xFFFFFFFD : BBD) + for ($i = 0; $i < $iBdCnt; ++$i) { + fwrite($FILE, pack("V", 0xFFFFFFFD)); + } + // Set for ExtraBDList + for ($i = 0; $i < $iBdExL; ++$i) { + fwrite($FILE, pack("V", 0xFFFFFFFC)); + } + // Adjust for Block + if (($iAllW + $iBdCnt) % $iBbCnt) { + $iBlock = ($iBbCnt - (($iAllW + $iBdCnt) % $iBbCnt)); + for ($i = 0; $i < $iBlock; ++$i) { + fwrite($FILE, pack("V", -1)); + } + } + // Extra BDList + if ($iBdCnt > $i1stBdL) { + $iN=0; + $iNb=0; + for ($i = $i1stBdL; $i < $iBdCnt; $i++, ++$iN) { + if ($iN >= ($iBbCnt - 1)) { + $iN = 0; + ++$iNb; + fwrite($FILE, pack("V", $iAll+$iBdCnt+$iNb)); + } + fwrite($FILE, pack("V", $iBsize+$iSbdSize+$iPpsCnt+$i)); + } + if (($iBdCnt-$i1stBdL) % ($iBbCnt-1)) { + $iB = ($iBbCnt - 1) - (($iBdCnt - $i1stBdL) % ($iBbCnt - 1)); + for ($i = 0; $i < $iB; ++$i) { + fwrite($FILE, pack("V", -1)); + } + } + fwrite($FILE, pack("V", -2)); + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/OLERead.php b/application/third_party/PHPExcel/PHPExcel/Shared/OLERead.php new file mode 100644 index 0000000..6b15d97 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/OLERead.php @@ -0,0 +1,318 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ + +defined('IDENTIFIER_OLE') || + define('IDENTIFIER_OLE', pack('CCCCCCCC', 0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1)); + +class PHPExcel_Shared_OLERead +{ + private $data = ''; + + // OLE identifier + const IDENTIFIER_OLE = IDENTIFIER_OLE; + + // Size of a sector = 512 bytes + const BIG_BLOCK_SIZE = 0x200; + + // Size of a short sector = 64 bytes + const SMALL_BLOCK_SIZE = 0x40; + + // Size of a directory entry always = 128 bytes + const PROPERTY_STORAGE_BLOCK_SIZE = 0x80; + + // Minimum size of a standard stream = 4096 bytes, streams smaller than this are stored as short streams + const SMALL_BLOCK_THRESHOLD = 0x1000; + + // header offsets + const NUM_BIG_BLOCK_DEPOT_BLOCKS_POS = 0x2c; + const ROOT_START_BLOCK_POS = 0x30; + const SMALL_BLOCK_DEPOT_BLOCK_POS = 0x3c; + const EXTENSION_BLOCK_POS = 0x44; + const NUM_EXTENSION_BLOCK_POS = 0x48; + const BIG_BLOCK_DEPOT_BLOCKS_POS = 0x4c; + + // property storage offsets (directory offsets) + const SIZE_OF_NAME_POS = 0x40; + const TYPE_POS = 0x42; + const START_BLOCK_POS = 0x74; + const SIZE_POS = 0x78; + + + + public $wrkbook = null; + public $summaryInformation = null; + public $documentSummaryInformation = null; + + + /** + * Read the file + * + * @param $sFileName string Filename + * @throws PHPExcel_Reader_Exception + */ + public function read($sFileName) + { + // Check if file exists and is readable + if (!is_readable($sFileName)) { + throw new PHPExcel_Reader_Exception("Could not open " . $sFileName . " for reading! File does not exist, or it is not readable."); + } + + // Get the file identifier + // Don't bother reading the whole file until we know it's a valid OLE file + $this->data = file_get_contents($sFileName, false, null, 0, 8); + + // Check OLE identifier + if ($this->data != self::IDENTIFIER_OLE) { + throw new PHPExcel_Reader_Exception('The filename ' . $sFileName . ' is not recognised as an OLE file'); + } + + // Get the file data + $this->data = file_get_contents($sFileName); + + // Total number of sectors used for the SAT + $this->numBigBlockDepotBlocks = self::getInt4d($this->data, self::NUM_BIG_BLOCK_DEPOT_BLOCKS_POS); + + // SecID of the first sector of the directory stream + $this->rootStartBlock = self::getInt4d($this->data, self::ROOT_START_BLOCK_POS); + + // SecID of the first sector of the SSAT (or -2 if not extant) + $this->sbdStartBlock = self::getInt4d($this->data, self::SMALL_BLOCK_DEPOT_BLOCK_POS); + + // SecID of the first sector of the MSAT (or -2 if no additional sectors are used) + $this->extensionBlock = self::getInt4d($this->data, self::EXTENSION_BLOCK_POS); + + // Total number of sectors used by MSAT + $this->numExtensionBlocks = self::getInt4d($this->data, self::NUM_EXTENSION_BLOCK_POS); + + $bigBlockDepotBlocks = array(); + $pos = self::BIG_BLOCK_DEPOT_BLOCKS_POS; + + $bbdBlocks = $this->numBigBlockDepotBlocks; + + if ($this->numExtensionBlocks != 0) { + $bbdBlocks = (self::BIG_BLOCK_SIZE - self::BIG_BLOCK_DEPOT_BLOCKS_POS)/4; + } + + for ($i = 0; $i < $bbdBlocks; ++$i) { + $bigBlockDepotBlocks[$i] = self::getInt4d($this->data, $pos); + $pos += 4; + } + + for ($j = 0; $j < $this->numExtensionBlocks; ++$j) { + $pos = ($this->extensionBlock + 1) * self::BIG_BLOCK_SIZE; + $blocksToRead = min($this->numBigBlockDepotBlocks - $bbdBlocks, self::BIG_BLOCK_SIZE / 4 - 1); + + for ($i = $bbdBlocks; $i < $bbdBlocks + $blocksToRead; ++$i) { + $bigBlockDepotBlocks[$i] = self::getInt4d($this->data, $pos); + $pos += 4; + } + + $bbdBlocks += $blocksToRead; + if ($bbdBlocks < $this->numBigBlockDepotBlocks) { + $this->extensionBlock = self::getInt4d($this->data, $pos); + } + } + + $pos = 0; + $this->bigBlockChain = ''; + $bbs = self::BIG_BLOCK_SIZE / 4; + for ($i = 0; $i < $this->numBigBlockDepotBlocks; ++$i) { + $pos = ($bigBlockDepotBlocks[$i] + 1) * self::BIG_BLOCK_SIZE; + + $this->bigBlockChain .= substr($this->data, $pos, 4*$bbs); + $pos += 4*$bbs; + } + + $pos = 0; + $sbdBlock = $this->sbdStartBlock; + $this->smallBlockChain = ''; + while ($sbdBlock != -2) { + $pos = ($sbdBlock + 1) * self::BIG_BLOCK_SIZE; + + $this->smallBlockChain .= substr($this->data, $pos, 4*$bbs); + $pos += 4*$bbs; + + $sbdBlock = self::getInt4d($this->bigBlockChain, $sbdBlock*4); + } + + // read the directory stream + $block = $this->rootStartBlock; + $this->entry = $this->_readData($block); + + $this->readPropertySets(); + } + + /** + * Extract binary stream data + * + * @return string + */ + public function getStream($stream) + { + if ($stream === null) { + return null; + } + + $streamData = ''; + + if ($this->props[$stream]['size'] < self::SMALL_BLOCK_THRESHOLD) { + $rootdata = $this->_readData($this->props[$this->rootentry]['startBlock']); + + $block = $this->props[$stream]['startBlock']; + + while ($block != -2) { + $pos = $block * self::SMALL_BLOCK_SIZE; + $streamData .= substr($rootdata, $pos, self::SMALL_BLOCK_SIZE); + + $block = self::getInt4d($this->smallBlockChain, $block*4); + } + + return $streamData; + } else { + $numBlocks = $this->props[$stream]['size'] / self::BIG_BLOCK_SIZE; + if ($this->props[$stream]['size'] % self::BIG_BLOCK_SIZE != 0) { + ++$numBlocks; + } + + if ($numBlocks == 0) { + return ''; + } + + $block = $this->props[$stream]['startBlock']; + + while ($block != -2) { + $pos = ($block + 1) * self::BIG_BLOCK_SIZE; + $streamData .= substr($this->data, $pos, self::BIG_BLOCK_SIZE); + $block = self::getInt4d($this->bigBlockChain, $block*4); + } + + return $streamData; + } + } + + /** + * Read a standard stream (by joining sectors using information from SAT) + * + * @param int $bl Sector ID where the stream starts + * @return string Data for standard stream + */ + private function _readData($bl) + { + $block = $bl; + $data = ''; + + while ($block != -2) { + $pos = ($block + 1) * self::BIG_BLOCK_SIZE; + $data .= substr($this->data, $pos, self::BIG_BLOCK_SIZE); + $block = self::getInt4d($this->bigBlockChain, $block*4); + } + return $data; + } + + /** + * Read entries in the directory stream. + */ + private function readPropertySets() + { + $offset = 0; + + // loop through entires, each entry is 128 bytes + $entryLen = strlen($this->entry); + while ($offset < $entryLen) { + // entry data (128 bytes) + $d = substr($this->entry, $offset, self::PROPERTY_STORAGE_BLOCK_SIZE); + + // size in bytes of name + $nameSize = ord($d[self::SIZE_OF_NAME_POS]) | (ord($d[self::SIZE_OF_NAME_POS+1]) << 8); + + // type of entry + $type = ord($d[self::TYPE_POS]); + + // sectorID of first sector or short sector, if this entry refers to a stream (the case with workbook) + // sectorID of first sector of the short-stream container stream, if this entry is root entry + $startBlock = self::getInt4d($d, self::START_BLOCK_POS); + + $size = self::getInt4d($d, self::SIZE_POS); + + $name = str_replace("\x00", "", substr($d, 0, $nameSize)); + + $this->props[] = array( + 'name' => $name, + 'type' => $type, + 'startBlock' => $startBlock, + 'size' => $size + ); + + // tmp helper to simplify checks + $upName = strtoupper($name); + + // Workbook directory entry (BIFF5 uses Book, BIFF8 uses Workbook) + if (($upName === 'WORKBOOK') || ($upName === 'BOOK')) { + $this->wrkbook = count($this->props) - 1; + } elseif ($upName === 'ROOT ENTRY' || $upName === 'R') { + // Root entry + $this->rootentry = count($this->props) - 1; + } + + // Summary information + if ($name == chr(5) . 'SummaryInformation') { +// echo 'Summary Information<br />'; + $this->summaryInformation = count($this->props) - 1; + } + + // Additional Document Summary information + if ($name == chr(5) . 'DocumentSummaryInformation') { +// echo 'Document Summary Information<br />'; + $this->documentSummaryInformation = count($this->props) - 1; + } + + $offset += self::PROPERTY_STORAGE_BLOCK_SIZE; + } + } + + /** + * Read 4 bytes of data at specified position + * + * @param string $data + * @param int $pos + * @return int + */ + private static function getInt4d($data, $pos) + { + // FIX: represent numbers correctly on 64-bit system + // http://sourceforge.net/tracker/index.php?func=detail&aid=1487372&group_id=99160&atid=623334 + // Hacked by Andreas Rehm 2006 to ensure correct result of the <<24 block on 32 and 64bit systems + $_or_24 = ord($data[$pos + 3]); + if ($_or_24 >= 128) { + // negative number + $_ord_24 = -abs((256 - $_or_24) << 24); + } else { + $_ord_24 = ($_or_24 & 127) << 24; + } + return ord($data[$pos]) | (ord($data[$pos + 1]) << 8) | (ord($data[$pos + 2]) << 16) | $_ord_24; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/PCLZip/gnu-lgpl.txt b/application/third_party/PHPExcel/PHPExcel/Shared/PCLZip/gnu-lgpl.txt new file mode 100644 index 0000000..cbee875 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/PCLZip/gnu-lgpl.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + <one line to give the library's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + <signature of Ty Coon>, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/PCLZip/pclzip.lib.php b/application/third_party/PHPExcel/PHPExcel/Shared/PCLZip/pclzip.lib.php new file mode 100644 index 0000000..a5a9b0a --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/PCLZip/pclzip.lib.php @@ -0,0 +1,5173 @@ +<?php +// -------------------------------------------------------------------------------- +// PhpConcept Library - Zip Module 2.8.2 +// -------------------------------------------------------------------------------- +// License GNU/LGPL - Vincent Blavet - August 2009 +// http://www.phpconcept.net +// -------------------------------------------------------------------------------- +// +// Presentation : +// PclZip is a PHP library that manage ZIP archives. +// So far tests show that archives generated by PclZip are readable by +// WinZip application and other tools. +// +// Description : +// See readme.txt and http://www.phpconcept.net +// +// Warning : +// This library and the associated files are non commercial, non professional +// work. +// It should not have unexpected results. However if any damage is caused by +// this software the author can not be responsible. +// The use of this software is at the risk of the user. +// +// -------------------------------------------------------------------------------- +// $Id: pclzip.lib.php,v 1.60 2009/09/30 21:01:04 vblavet Exp $ +// -------------------------------------------------------------------------------- + +// ----- Constants +if (!defined('PCLZIP_READ_BLOCK_SIZE')) { + define('PCLZIP_READ_BLOCK_SIZE', 2048); +} + +// ----- File list separator +// In version 1.x of PclZip, the separator for file list is a space +// (which is not a very smart choice, specifically for windows paths !). +// A better separator should be a comma (,). This constant gives you the +// abilty to change that. +// However notice that changing this value, may have impact on existing +// scripts, using space separated filenames. +// Recommanded values for compatibility with older versions : +//define('PCLZIP_SEPARATOR', ' '); +// Recommanded values for smart separation of filenames. +if (!defined('PCLZIP_SEPARATOR')) { + define('PCLZIP_SEPARATOR', ','); +} + +// ----- Error configuration +// 0 : PclZip Class integrated error handling +// 1 : PclError external library error handling. By enabling this +// you must ensure that you have included PclError library. +// [2,...] : reserved for futur use +if (!defined('PCLZIP_ERROR_EXTERNAL')) { + define('PCLZIP_ERROR_EXTERNAL', 0); +} + +// ----- Optional static temporary directory +// By default temporary files are generated in the script current +// path. +// If defined : +// - MUST BE terminated by a '/'. +// - MUST be a valid, already created directory +// Samples : +// define('PCLZIP_TEMPORARY_DIR', '/temp/'); +// define('PCLZIP_TEMPORARY_DIR', 'C:/Temp/'); +if (!defined('PCLZIP_TEMPORARY_DIR')) { + define('PCLZIP_TEMPORARY_DIR', ''); +} + +// ----- Optional threshold ratio for use of temporary files +// Pclzip sense the size of the file to add/extract and decide to +// use or not temporary file. The algorythm is looking for +// memory_limit of PHP and apply a ratio. +// threshold = memory_limit * ratio. +// Recommended values are under 0.5. Default 0.47. +// Samples : +// define('PCLZIP_TEMPORARY_FILE_RATIO', 0.5); +if (!defined('PCLZIP_TEMPORARY_FILE_RATIO')) { + define('PCLZIP_TEMPORARY_FILE_RATIO', 0.47); +} + +// -------------------------------------------------------------------------------- +// ***** UNDER THIS LINE NOTHING NEEDS TO BE MODIFIED ***** +// -------------------------------------------------------------------------------- + +// ----- Global variables +$g_pclzip_version = "2.8.2"; + +// ----- Error codes +// -1 : Unable to open file in binary write mode +// -2 : Unable to open file in binary read mode +// -3 : Invalid parameters +// -4 : File does not exist +// -5 : Filename is too long (max. 255) +// -6 : Not a valid zip file +// -7 : Invalid extracted file size +// -8 : Unable to create directory +// -9 : Invalid archive extension +// -10 : Invalid archive format +// -11 : Unable to delete file (unlink) +// -12 : Unable to rename file (rename) +// -13 : Invalid header checksum +// -14 : Invalid archive size +define('PCLZIP_ERR_USER_ABORTED', 2); +define('PCLZIP_ERR_NO_ERROR', 0); +define('PCLZIP_ERR_WRITE_OPEN_FAIL', -1); +define('PCLZIP_ERR_READ_OPEN_FAIL', -2); +define('PCLZIP_ERR_INVALID_PARAMETER', -3); +define('PCLZIP_ERR_MISSING_FILE', -4); +define('PCLZIP_ERR_FILENAME_TOO_LONG', -5); +define('PCLZIP_ERR_INVALID_ZIP', -6); +define('PCLZIP_ERR_BAD_EXTRACTED_FILE', -7); +define('PCLZIP_ERR_DIR_CREATE_FAIL', -8); +define('PCLZIP_ERR_BAD_EXTENSION', -9); +define('PCLZIP_ERR_BAD_FORMAT', -10); +define('PCLZIP_ERR_DELETE_FILE_FAIL', -11); +define('PCLZIP_ERR_RENAME_FILE_FAIL', -12); +define('PCLZIP_ERR_BAD_CHECKSUM', -13); +define('PCLZIP_ERR_INVALID_ARCHIVE_ZIP', -14); +define('PCLZIP_ERR_MISSING_OPTION_VALUE', -15); +define('PCLZIP_ERR_INVALID_OPTION_VALUE', -16); +define('PCLZIP_ERR_ALREADY_A_DIRECTORY', -17); +define('PCLZIP_ERR_UNSUPPORTED_COMPRESSION', -18); +define('PCLZIP_ERR_UNSUPPORTED_ENCRYPTION', -19); +define('PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE', -20); +define('PCLZIP_ERR_DIRECTORY_RESTRICTION', -21); + +// ----- Options values +define('PCLZIP_OPT_PATH', 77001); +define('PCLZIP_OPT_ADD_PATH', 77002); +define('PCLZIP_OPT_REMOVE_PATH', 77003); +define('PCLZIP_OPT_REMOVE_ALL_PATH', 77004); +define('PCLZIP_OPT_SET_CHMOD', 77005); +define('PCLZIP_OPT_EXTRACT_AS_STRING', 77006); +define('PCLZIP_OPT_NO_COMPRESSION', 77007); +define('PCLZIP_OPT_BY_NAME', 77008); +define('PCLZIP_OPT_BY_INDEX', 77009); +define('PCLZIP_OPT_BY_EREG', 77010); +define('PCLZIP_OPT_BY_PREG', 77011); +define('PCLZIP_OPT_COMMENT', 77012); +define('PCLZIP_OPT_ADD_COMMENT', 77013); +define('PCLZIP_OPT_PREPEND_COMMENT', 77014); +define('PCLZIP_OPT_EXTRACT_IN_OUTPUT', 77015); +define('PCLZIP_OPT_REPLACE_NEWER', 77016); +define('PCLZIP_OPT_STOP_ON_ERROR', 77017); +// Having big trouble with crypt. Need to multiply 2 long int +// which is not correctly supported by PHP ... +//define('PCLZIP_OPT_CRYPT', 77018); +define('PCLZIP_OPT_EXTRACT_DIR_RESTRICTION', 77019); +define('PCLZIP_OPT_TEMP_FILE_THRESHOLD', 77020); +define('PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD', 77020); // alias +define('PCLZIP_OPT_TEMP_FILE_ON', 77021); +define('PCLZIP_OPT_ADD_TEMP_FILE_ON', 77021); // alias +define('PCLZIP_OPT_TEMP_FILE_OFF', 77022); +define('PCLZIP_OPT_ADD_TEMP_FILE_OFF', 77022); // alias + +// ----- File description attributes +define('PCLZIP_ATT_FILE_NAME', 79001); +define('PCLZIP_ATT_FILE_NEW_SHORT_NAME', 79002); +define('PCLZIP_ATT_FILE_NEW_FULL_NAME', 79003); +define('PCLZIP_ATT_FILE_MTIME', 79004); +define('PCLZIP_ATT_FILE_CONTENT', 79005); +define('PCLZIP_ATT_FILE_COMMENT', 79006); + +// ----- Call backs values +define('PCLZIP_CB_PRE_EXTRACT', 78001); +define('PCLZIP_CB_POST_EXTRACT', 78002); +define('PCLZIP_CB_PRE_ADD', 78003); +define('PCLZIP_CB_POST_ADD', 78004); +/* For futur use +define('PCLZIP_CB_PRE_LIST', 78005); +define('PCLZIP_CB_POST_LIST', 78006); +define('PCLZIP_CB_PRE_DELETE', 78007); +define('PCLZIP_CB_POST_DELETE', 78008); +*/ + +// -------------------------------------------------------------------------------- +// Class : PclZip +// Description : +// PclZip is the class that represent a Zip archive. +// The public methods allow the manipulation of the archive. +// Attributes : +// Attributes must not be accessed directly. +// Methods : +// PclZip() : Object creator +// create() : Creates the Zip archive +// listContent() : List the content of the Zip archive +// extract() : Extract the content of the archive +// properties() : List the properties of the archive +// -------------------------------------------------------------------------------- +class PclZip +{ + // ----- Filename of the zip file + public $zipname = ''; + + // ----- File descriptor of the zip file + public $zip_fd = 0; + + // ----- Internal error handling + public $error_code = 1; + public $error_string = ''; + + // ----- Current status of the magic_quotes_runtime + // This value store the php configuration for magic_quotes + // The class can then disable the magic_quotes and reset it after + public $magic_quotes_status; + + // -------------------------------------------------------------------------------- + // Function : PclZip() + // Description : + // Creates a PclZip object and set the name of the associated Zip archive + // filename. + // Note that no real action is taken, if the archive does not exist it is not + // created. Use create() for that. + // -------------------------------------------------------------------------------- + public function __construct($p_zipname) + { + + // ----- Tests the zlib + if (!function_exists('gzopen')) { + die('Abort '.basename(__FILE__).' : Missing zlib extensions'); + } + + // ----- Set the attributes + $this->zipname = $p_zipname; + $this->zip_fd = 0; + $this->magic_quotes_status = -1; + + // ----- Return + return; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // create($p_filelist, $p_add_dir="", $p_remove_dir="") + // create($p_filelist, $p_option, $p_option_value, ...) + // Description : + // This method supports two different synopsis. The first one is historical. + // This method creates a Zip Archive. The Zip file is created in the + // filesystem. The files and directories indicated in $p_filelist + // are added in the archive. See the parameters description for the + // supported format of $p_filelist. + // When a directory is in the list, the directory and its content is added + // in the archive. + // In this synopsis, the function takes an optional variable list of + // options. See bellow the supported options. + // Parameters : + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or one directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_add_dir : A path to add before the real path of the archived file, + // in order to have it memorized in the archive. + // $p_remove_dir : A path to remove from the real path of the file to archive, + // in order to have a shorter path memorized in the archive. + // When $p_add_dir and $p_remove_dir are set, $p_remove_dir + // is removed first, before $p_add_dir is added. + // Options : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_COMMENT : + // PCLZIP_CB_PRE_ADD : + // PCLZIP_CB_POST_ADD : + // Return Values : + // 0 on failure, + // The list of the added files, with a status of the add action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + public function create($p_filelist) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Set default values + $v_options = array(); + $v_options[PCLZIP_OPT_NO_COMPRESSION] = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove from the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array ( + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_ADD => 'optional', + PCLZIP_CB_POST_ADD => 'optional', + PCLZIP_OPT_NO_COMPRESSION => 'optional', + PCLZIP_OPT_COMMENT => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + //, PCLZIP_OPT_CRYPT => 'optional' + )); + if ($v_result != 1) { + return 0; + } + } else { + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + // ----- Get the first argument + $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; + } elseif ($v_size > 2) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Init + $v_string_list = array(); + $v_att_list = array(); + $v_filedescr_list = array(); + $p_result_list = array(); + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + // ----- Look if the first element is also an array + // This will mean that this is a file description entry + if (isset($p_filelist[0]) && is_array($p_filelist[0])) { + $v_att_list = $p_filelist; + } else { + // ----- The list is a list of string names + $v_string_list = $p_filelist; + } + } elseif (is_string($p_filelist)) { + // ----- Look if the $p_filelist is a string + // ----- Create a list from the string + $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); + } else { + // ----- Invalid variable type for $p_filelist + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist"); + return 0; + } + + // ----- Reformat the string list + if (sizeof($v_string_list) != 0) { + foreach ($v_string_list as $v_string) { + if ($v_string != '') { + $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; + } else { + } + } + } + + // ----- For each file in the list check the attributes + $v_supported_attributes = array( + PCLZIP_ATT_FILE_NAME => 'mandatory', + PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional', + PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional', + PCLZIP_ATT_FILE_MTIME => 'optional', + PCLZIP_ATT_FILE_CONTENT => 'optional', + PCLZIP_ATT_FILE_COMMENT => 'optional' + ); + foreach ($v_att_list as $v_entry) { + $v_result = $this->privFileDescrParseAtt($v_entry, $v_filedescr_list[], $v_options, $v_supported_attributes); + if ($v_result != 1) { + return 0; + } + } + + // ----- Expand the filelist (expand directories) + $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Call the create fct + $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Return + return $p_result_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // add($p_filelist, $p_add_dir="", $p_remove_dir="") + // add($p_filelist, $p_option, $p_option_value, ...) + // Description : + // This method supports two synopsis. The first one is historical. + // This methods add the list of files in an existing archive. + // If a file with the same name already exists, it is added at the end of the + // archive, the first one is still present. + // If the archive does not exist, it is created. + // Parameters : + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or one directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_add_dir : A path to add before the real path of the archived file, + // in order to have it memorized in the archive. + // $p_remove_dir : A path to remove from the real path of the file to archive, + // in order to have a shorter path memorized in the archive. + // When $p_add_dir and $p_remove_dir are set, $p_remove_dir + // is removed first, before $p_add_dir is added. + // Options : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_COMMENT : + // PCLZIP_OPT_ADD_COMMENT : + // PCLZIP_OPT_PREPEND_COMMENT : + // PCLZIP_CB_PRE_ADD : + // PCLZIP_CB_POST_ADD : + // Return Values : + // 0 on failure, + // The list of the added files, with a status of the add action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + public function add($p_filelist) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Set default values + $v_options = array(); + $v_options[PCLZIP_OPT_NO_COMPRESSION] = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove form the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array ( + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_ADD => 'optional', + PCLZIP_CB_POST_ADD => 'optional', + PCLZIP_OPT_NO_COMPRESSION => 'optional', + PCLZIP_OPT_COMMENT => 'optional', + PCLZIP_OPT_ADD_COMMENT => 'optional', + PCLZIP_OPT_PREPEND_COMMENT => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + //, PCLZIP_OPT_CRYPT => 'optional' + )); + if ($v_result != 1) { + return 0; + } + } else { + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + // ----- Get the first argument + $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; + } elseif ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Init + $v_string_list = array(); + $v_att_list = array(); + $v_filedescr_list = array(); + $p_result_list = array(); + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + // ----- Look if the first element is also an array + // This will mean that this is a file description entry + if (isset($p_filelist[0]) && is_array($p_filelist[0])) { + $v_att_list = $p_filelist; + } else { + // ----- The list is a list of string names + $v_string_list = $p_filelist; + } + } elseif (is_string($p_filelist)) { + // ----- Look if the $p_filelist is a string + // ----- Create a list from the string + $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); + } else { + // ----- Invalid variable type for $p_filelist + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist"); + return 0; + } + + // ----- Reformat the string list + if (sizeof($v_string_list) != 0) { + foreach ($v_string_list as $v_string) { + $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; + } + } + + // ----- For each file in the list check the attributes + $v_supported_attributes = array( + PCLZIP_ATT_FILE_NAME => 'mandatory', + PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional', + PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional', + PCLZIP_ATT_FILE_MTIME => 'optional', + PCLZIP_ATT_FILE_CONTENT => 'optional', + PCLZIP_ATT_FILE_COMMENT => 'optional', + ); + foreach ($v_att_list as $v_entry) { + $v_result = $this->privFileDescrParseAtt($v_entry, $v_filedescr_list[], $v_options, $v_supported_attributes); + if ($v_result != 1) { + return 0; + } + } + + // ----- Expand the filelist (expand directories) + $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Call the create fct + $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Return + return $p_result_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : listContent() + // Description : + // This public method, gives the list of the files and directories, with their + // properties. + // The properties of each entries in the list are (used also in other functions) : + // filename : Name of the file. For a create or add action it is the filename + // given by the user. For an extract function it is the filename + // of the extracted file. + // stored_filename : Name of the file / directory stored in the archive. + // size : Size of the stored file. + // compressed_size : Size of the file's data compressed in the archive + // (without the headers overhead) + // mtime : Last known modification date of the file (UNIX timestamp) + // comment : Comment associated with the file + // folder : true | false + // index : index of the file in the archive + // status : status of the action (depending of the action) : + // Values are : + // ok : OK ! + // filtered : the file / dir is not extracted (filtered by user) + // already_a_directory : the file can not be extracted because a + // directory with the same name already exists + // write_protected : the file can not be extracted because a file + // with the same name already exists and is + // write protected + // newer_exist : the file was not extracted because a newer file exists + // path_creation_fail : the file is not extracted because the folder + // does not exist and can not be created + // write_error : the file was not extracted because there was a + // error while writing the file + // read_error : the file was not extracted because there was a error + // while reading the file + // invalid_header : the file was not extracted because of an archive + // format error (bad file header) + // Note that each time a method can continue operating when there + // is an action error on a file, the error is only logged in the file status. + // Return Values : + // 0 on an unrecoverable failure, + // The list of the files in the archive. + // -------------------------------------------------------------------------------- + public function listContent() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Call the extracting fct + $p_list = array(); + if (($v_result = $this->privList($p_list)) != 1) { + unset($p_list); + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // extract($p_path="./", $p_remove_path="") + // extract([$p_option, $p_option_value, ...]) + // Description : + // This method supports two synopsis. The first one is historical. + // This method extract all the files / directories from the archive to the + // folder indicated in $p_path. + // If you want to ignore the 'root' part of path of the memorized files + // you can indicate this in the optional $p_remove_path parameter. + // By default, if a newer file with the same name already exists, the + // file is not extracted. + // + // If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions + // are used, the path indicated in PCLZIP_OPT_ADD_PATH is append + // at the end of the path value of PCLZIP_OPT_PATH. + // Parameters : + // $p_path : Path where the files and directories are to be extracted + // $p_remove_path : First part ('root' part) of the memorized path + // (if any similar) to remove while extracting. + // Options : + // PCLZIP_OPT_PATH : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_CB_PRE_EXTRACT : + // PCLZIP_CB_POST_EXTRACT : + // Return Values : + // 0 or a negative value on failure, + // The list of the extracted files, with a status of the action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + public function extract() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); + // $v_path = "./"; + $v_path = ''; + $v_remove_path = ""; + $v_remove_all_path = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Default values for option + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = false; + + // ----- Look for arguments + if ($v_size > 0) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array ( + PCLZIP_OPT_PATH => 'optional', + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_EXTRACT => 'optional', + PCLZIP_CB_POST_EXTRACT => 'optional', + PCLZIP_OPT_SET_CHMOD => 'optional', + PCLZIP_OPT_BY_NAME => 'optional', + PCLZIP_OPT_BY_EREG => 'optional', + PCLZIP_OPT_BY_PREG => 'optional', + PCLZIP_OPT_BY_INDEX => 'optional', + PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', + PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional', + PCLZIP_OPT_REPLACE_NEWER => 'optional', + PCLZIP_OPT_STOP_ON_ERROR => 'optional', + PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + )); + if ($v_result != 1) { + return 0; + } + + // ----- Set the arguments + if (isset($v_options[PCLZIP_OPT_PATH])) { + $v_path = $v_options[PCLZIP_OPT_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { + // ----- Check for '/' in last path char + if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { + $v_path .= '/'; + } + $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; + } + } else { + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + // ----- Get the first argument + $v_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_remove_path = $v_arg_list[1]; + } elseif ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Trace + + // ----- Call the extracting fct + $p_list = array(); + $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options); + if ($v_result < 1) { + unset($p_list); + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + + // -------------------------------------------------------------------------------- + // Function : + // extractByIndex($p_index, $p_path="./", $p_remove_path="") + // extractByIndex($p_index, [$p_option, $p_option_value, ...]) + // Description : + // This method supports two synopsis. The first one is historical. + // This method is doing a partial extract of the archive. + // The extracted files or folders are identified by their index in the + // archive (from 0 to n). + // Note that if the index identify a folder, only the folder entry is + // extracted, not all the files included in the archive. + // Parameters : + // $p_index : A single index (integer) or a string of indexes of files to + // extract. The form of the string is "0,4-6,8-12" with only numbers + // and '-' for range or ',' to separate ranges. No spaces or ';' + // are allowed. + // $p_path : Path where the files and directories are to be extracted + // $p_remove_path : First part ('root' part) of the memorized path + // (if any similar) to remove while extracting. + // Options : + // PCLZIP_OPT_PATH : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and + // not as files. + // The resulting content is in a new field 'content' in the file + // structure. + // This option must be used alone (any other options are ignored). + // PCLZIP_CB_PRE_EXTRACT : + // PCLZIP_CB_POST_EXTRACT : + // Return Values : + // 0 on failure, + // The list of the extracted files, with a status of the action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + //function extractByIndex($p_index, options...) + public function extractByIndex($p_index) + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); + // $v_path = "./"; + $v_path = ''; + $v_remove_path = ""; + $v_remove_all_path = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Default values for option + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = false; + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove form the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array( + PCLZIP_OPT_PATH => 'optional', + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_EXTRACT => 'optional', + PCLZIP_CB_POST_EXTRACT => 'optional', + PCLZIP_OPT_SET_CHMOD => 'optional', + PCLZIP_OPT_REPLACE_NEWER => 'optional', + PCLZIP_OPT_STOP_ON_ERROR => 'optional', + PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + )); + if ($v_result != 1) { + return 0; + } + + // ----- Set the arguments + if (isset($v_options[PCLZIP_OPT_PATH])) { + $v_path = $v_options[PCLZIP_OPT_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { + // ----- Check for '/' in last path char + if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { + $v_path .= '/'; + } + $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; + } + if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) { + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = false; + } else { + } + } else { + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + + // ----- Get the first argument + $v_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_remove_path = $v_arg_list[1]; + } elseif ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + + // ----- Trace + + // ----- Trick + // Here I want to reuse extractByRule(), so I need to parse the $p_index + // with privParseOptions() + $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index); + $v_options_trick = array(); + $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick, array (PCLZIP_OPT_BY_INDEX => 'optional')); + if ($v_result != 1) { + return 0; + } + $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX]; + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Call the extracting fct + if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) { + return(0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // delete([$p_option, $p_option_value, ...]) + // Description : + // This method removes files from the archive. + // If no parameters are given, then all the archive is emptied. + // Parameters : + // None or optional arguments. + // Options : + // PCLZIP_OPT_BY_INDEX : + // PCLZIP_OPT_BY_NAME : + // PCLZIP_OPT_BY_EREG : + // PCLZIP_OPT_BY_PREG : + // Return Values : + // 0 on failure, + // The list of the files which are still present in the archive. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + public function delete() + { + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Set default values + $v_options = array(); + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 0) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, array ( + PCLZIP_OPT_BY_NAME => 'optional', + PCLZIP_OPT_BY_EREG => 'optional', + PCLZIP_OPT_BY_PREG => 'optional', + PCLZIP_OPT_BY_INDEX => 'optional' + )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Call the delete fct + $v_list = array(); + if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) { + $this->privSwapBackMagicQuotes(); + unset($v_list); + return(0); + } + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : deleteByIndex() + // Description : + // ***** Deprecated ***** + // delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered. + // -------------------------------------------------------------------------------- + public function deleteByIndex($p_index) + { + + $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index); + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : properties() + // Description : + // This method gives the properties of the archive. + // The properties are : + // nb : Number of files in the archive + // comment : Comment associated with the archive file + // status : not_exist, ok + // Parameters : + // None + // Return Values : + // 0 on failure, + // An array with the archive properties. + // -------------------------------------------------------------------------------- + public function properties() + { + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + $this->privSwapBackMagicQuotes(); + return(0); + } + + // ----- Default properties + $v_prop = array(); + $v_prop['comment'] = ''; + $v_prop['nb'] = 0; + $v_prop['status'] = 'not_exist'; + + // ----- Look if file exists + if (@is_file($this->zipname)) { + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) { + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); + + // ----- Return + return 0; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { + $this->privSwapBackMagicQuotes(); + return 0; + } + + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Set the user attributes + $v_prop['comment'] = $v_central_dir['comment']; + $v_prop['nb'] = $v_central_dir['entries']; + $v_prop['status'] = 'ok'; + } + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_prop; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : duplicate() + // Description : + // This method creates an archive by copying the content of an other one. If + // the archive already exist, it is replaced by the new one without any warning. + // Parameters : + // $p_archive : The filename of a valid archive, or + // a valid PclZip object. + // Return Values : + // 1 on success. + // 0 or a negative value on error (error code). + // -------------------------------------------------------------------------------- + public function duplicate($p_archive) + { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Look if the $p_archive is a PclZip object + if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip')) { + // ----- Duplicate the archive + $v_result = $this->privDuplicate($p_archive->zipname); + } elseif (is_string($p_archive)) { + // ----- Look if the $p_archive is a string (so a filename) + // ----- Check that $p_archive is a valid zip file + // TBC : Should also check the archive format + if (!is_file($p_archive)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'"); + $v_result = PCLZIP_ERR_MISSING_FILE; + } else { + // ----- Duplicate the archive + $v_result = $this->privDuplicate($p_archive); + } + } else { + // ----- Invalid variable + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); + $v_result = PCLZIP_ERR_INVALID_PARAMETER; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : merge() + // Description : + // This method merge the $p_archive_to_add archive at the end of the current + // one ($this). + // If the archive ($this) does not exist, the merge becomes a duplicate. + // If the $p_archive_to_add archive does not exist, the merge is a success. + // Parameters : + // $p_archive_to_add : It can be directly the filename of a valid zip archive, + // or a PclZip object archive. + // Return Values : + // 1 on success, + // 0 or negative values on error (see below). + // -------------------------------------------------------------------------------- + public function merge($p_archive_to_add) + { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return(0); + } + + // ----- Look if the $p_archive_to_add is a PclZip object + if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip')) { + // ----- Merge the archive + $v_result = $this->privMerge($p_archive_to_add); + } elseif (is_string($p_archive_to_add)) { + // ----- Look if the $p_archive_to_add is a string (so a filename) + // ----- Create a temporary archive + $v_object_archive = new PclZip($p_archive_to_add); + + // ----- Merge the archive + $v_result = $this->privMerge($v_object_archive); + } else { + // ----- Invalid variable + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); + $v_result = PCLZIP_ERR_INVALID_PARAMETER; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + + + // -------------------------------------------------------------------------------- + // Function : errorCode() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + public function errorCode() + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + return(PclErrorCode()); + } else { + return($this->error_code); + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : errorName() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + public function errorName($p_with_code = false) + { + $v_name = array( + PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR', + PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL', + PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL', + PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER', + PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE', + PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG', + PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP', + PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE', + PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL', + PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION', + PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT', + PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL', + PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL', + PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM', + PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', + PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE', + PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE', + PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', + PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION', + PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE', + PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION', + ); + + if (isset($v_name[$this->error_code])) { + $v_value = $v_name[$this->error_code]; + } else { + $v_value = 'NoName'; + } + + if ($p_with_code) { + return($v_value.' ('.$this->error_code.')'); + } else { + return($v_value); + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : errorInfo() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + public function errorInfo($p_full = false) + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + return(PclErrorString()); + } else { + if ($p_full) { + return($this->errorName(true)." : ".$this->error_string); + } else { + return($this->error_string." [code ".$this->error_code."]"); + } + } + } + // -------------------------------------------------------------------------------- + + + // -------------------------------------------------------------------------------- + // ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS ***** + // ***** ***** + // ***** THESES FUNCTIONS MUST NOT BE USED DIRECTLY ***** + // -------------------------------------------------------------------------------- + + + + // -------------------------------------------------------------------------------- + // Function : privCheckFormat() + // Description : + // This method check that the archive exists and is a valid zip archive. + // Several level of check exists. (futur) + // Parameters : + // $p_level : Level of check. Default 0. + // 0 : Check the first bytes (magic codes) (default value)) + // 1 : 0 + Check the central directory (futur) + // 2 : 1 + Check each file header (futur) + // Return Values : + // true on success, + // false on error, the error code is set. + // -------------------------------------------------------------------------------- + public function privCheckFormat($p_level = 0) + { + $v_result = true; + + // ----- Reset the file system cache + clearstatcache(); + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Look if the file exits + if (!is_file($this->zipname)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'"); + return(false); + } + + // ----- Check that the file is readeable + if (!is_readable($this->zipname)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'"); + return(false); + } + + // ----- Check the magic code + // TBC + + // ----- Check the central header + // TBC + + // ----- Check each file header + // TBC + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privParseOptions() + // Description : + // This internal methods reads the variable list of arguments ($p_options_list, + // $p_size) and generate an array with the options and values ($v_result_list). + // $v_requested_options contains the options that can be present and those that + // must be present. + // $v_requested_options is an array, with the option value as key, and 'optional', + // or 'mandatory' as value. + // Parameters : + // See above. + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + public function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options = false) + { + $v_result=1; + + // ----- Read the options + $i=0; + while ($i<$p_size) { + // ----- Check if the option is supported + if (!isset($v_requested_options[$p_options_list[$i]])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for next option + switch ($p_options_list[$i]) { + // ----- Look for options that request a path value + case PCLZIP_OPT_PATH: + case PCLZIP_OPT_REMOVE_PATH: + case PCLZIP_OPT_ADD_PATH: + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], false); + $i++; + break; + + case PCLZIP_OPT_TEMP_FILE_THRESHOLD: + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + return PclZip::errorCode(); + } + + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); + return PclZip::errorCode(); + } + + // ----- Check the value + $v_value = $p_options_list[$i+1]; + if ((!is_integer($v_value)) || ($v_value<0)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + return PclZip::errorCode(); + } + + // ----- Get the value (and convert it in bytes) + $v_result_list[$p_options_list[$i]] = $v_value*1048576; + $i++; + break; + + case PCLZIP_OPT_TEMP_FILE_ON: + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); + return PclZip::errorCode(); + } + + $v_result_list[$p_options_list[$i]] = true; + break; + + case PCLZIP_OPT_TEMP_FILE_OFF: + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'"); + return PclZip::errorCode(); + } + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'"); + return PclZip::errorCode(); + } + $v_result_list[$p_options_list[$i]] = true; + break; + + case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION: + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1]) && ($p_options_list[$i+1] != '')) { + $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], false); + $i++; + } else { + } + break; + // ----- Look for options that request an array of string for value + case PCLZIP_OPT_BY_NAME: + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1]; + } elseif (is_array($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + // ----- Look for options that request an EREG or PREG expression + case PCLZIP_OPT_BY_EREG: + // ereg() is deprecated starting with PHP 5.3. Move PCLZIP_OPT_BY_EREG + // to PCLZIP_OPT_BY_PREG + $p_options_list[$i] = PCLZIP_OPT_BY_PREG; + case PCLZIP_OPT_BY_PREG: + //case PCLZIP_OPT_CRYPT : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that takes a string + case PCLZIP_OPT_COMMENT: + case PCLZIP_OPT_ADD_COMMENT: + case PCLZIP_OPT_PREPEND_COMMENT: + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '" .PclZipUtilOptionText($p_options_list[$i]) ."'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that request an array of index + case PCLZIP_OPT_BY_INDEX: + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_work_list = array(); + if (is_string($p_options_list[$i+1])) { + // ----- Remove spaces + $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', ''); + + // ----- Parse items + $v_work_list = explode(",", $p_options_list[$i+1]); + } elseif (is_integer($p_options_list[$i+1])) { + $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1]; + } elseif (is_array($p_options_list[$i+1])) { + $v_work_list = $p_options_list[$i+1]; + } else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Reduce the index list + // each index item in the list must be a couple with a start and + // an end value : [0,3], [5-5], [8-10], ... + // ----- Check the format of each item + $v_sort_flag=false; + $v_sort_value=0; + for ($j=0; $j<sizeof($v_work_list); $j++) { + // ----- Explode the item + $v_item_list = explode("-", $v_work_list[$j]); + $v_size_item_list = sizeof($v_item_list); + + // ----- TBC : Here we might check that each item is a + // real integer ... + + // ----- Look for single value + if ($v_size_item_list == 1) { + // ----- Set the option value + $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0]; + $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[0]; + } elseif ($v_size_item_list == 2) { + // ----- Set the option value + $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0]; + $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[1]; + } else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Too many values in index range for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + + + // ----- Look for list sort + if ($v_result_list[$p_options_list[$i]][$j]['start'] < $v_sort_value) { + $v_sort_flag=true; + + // ----- TBC : An automatic sort should be writen ... + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Invalid order of index range for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + return PclZip::errorCode(); + } + $v_sort_value = $v_result_list[$p_options_list[$i]][$j]['start']; + } + + // ----- Sort the items + if ($v_sort_flag) { + // TBC : To Be Completed + } + // ----- Next option + $i++; + break; + // ----- Look for options that request no value + case PCLZIP_OPT_REMOVE_ALL_PATH: + case PCLZIP_OPT_EXTRACT_AS_STRING: + case PCLZIP_OPT_NO_COMPRESSION: + case PCLZIP_OPT_EXTRACT_IN_OUTPUT: + case PCLZIP_OPT_REPLACE_NEWER: + case PCLZIP_OPT_STOP_ON_ERROR: + $v_result_list[$p_options_list[$i]] = true; + break; + // ----- Look for options that request an octal value + case PCLZIP_OPT_SET_CHMOD: + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + // ----- Return + return PclZip::errorCode(); + } + // ----- Get the value + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + $i++; + break; + + // ----- Look for options that request a call-back + case PCLZIP_CB_PRE_EXTRACT: + case PCLZIP_CB_POST_EXTRACT: + case PCLZIP_CB_PRE_ADD: + case PCLZIP_CB_POST_ADD: + /* for futur use + case PCLZIP_CB_PRE_DELETE : + case PCLZIP_CB_POST_DELETE : + case PCLZIP_CB_PRE_LIST : + case PCLZIP_CB_POST_LIST : + */ + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_function_name = $p_options_list[$i+1]; + + // ----- Check that the value is a valid existing function + if (!function_exists($v_function_name)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + // ----- Return + return PclZip::errorCode(); + } + + // ----- Set the attribute + $v_result_list[$p_options_list[$i]] = $v_function_name; + $i++; + break; + default: + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Unknown parameter '" .$p_options_list[$i]."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Next options + $i++; + } + + // ----- Look for mandatory options + if ($v_requested_options !== false) { + for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { + // ----- Look for mandatory option + if ($v_requested_options[$key] == 'mandatory') { + // ----- Look if present + if (!isset($v_result_list[$key])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); + + // ----- Return + return PclZip::errorCode(); + } + } + } + } + + // ----- Look for default values + if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privOptionDefaultThreshold() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + public function privOptionDefaultThreshold(&$p_options) + { + $v_result=1; + + if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) { + return $v_result; + } + + // ----- Get 'memory_limit' configuration value + $v_memory_limit = ini_get('memory_limit'); + $v_memory_limit = trim($v_memory_limit); + $last = strtolower(substr($v_memory_limit, -1)); + + if ($last == 'g') { + //$v_memory_limit = $v_memory_limit*1024*1024*1024; + $v_memory_limit = $v_memory_limit*1073741824; + } + if ($last == 'm') { + //$v_memory_limit = $v_memory_limit*1024*1024; + $v_memory_limit = $v_memory_limit*1048576; + } + if ($last == 'k') { + $v_memory_limit = $v_memory_limit*1024; + } + + $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit*PCLZIP_TEMPORARY_FILE_RATIO); + + // ----- Sanity check : No threshold if value lower than 1M + if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) { + unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privFileDescrParseAtt() + // Description : + // Parameters : + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + public function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options = false) + { + $v_result=1; + + // ----- For each file in the list check the attributes + foreach ($p_file_list as $v_key => $v_value) { + // ----- Check if the option is supported + if (!isset($v_requested_options[$v_key])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for attribute + switch ($v_key) { + case PCLZIP_ATT_FILE_NAME: + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['filename'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['filename'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + break; + case PCLZIP_ATT_FILE_NEW_SHORT_NAME: + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['new_short_name'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + break; + case PCLZIP_ATT_FILE_NEW_FULL_NAME: + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + + $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['new_full_name'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + break; + // ----- Look for options that takes a string + case PCLZIP_ATT_FILE_COMMENT: + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + $p_filedescr['comment'] = $v_value; + break; + case PCLZIP_ATT_FILE_MTIME: + if (!is_integer($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". Integer expected for attribute '".PclZipUtilOptionText($v_key)."'"); + return PclZip::errorCode(); + } + $p_filedescr['mtime'] = $v_value; + break; + case PCLZIP_ATT_FILE_CONTENT: + $p_filedescr['content'] = $v_value; + break; + default: + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Unknown parameter '".$v_key."'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for mandatory options + if ($v_requested_options !== false) { + for ($key = reset($v_requested_options); $key = key($v_requested_options); $key = next($v_requested_options)) { + // ----- Look for mandatory option + if ($v_requested_options[$key] == 'mandatory') { + // ----- Look if present + if (!isset($p_file_list[$key])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); + return PclZip::errorCode(); + } + } + } + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privFileDescrExpand() + // Description : + // This method look for each item of the list to see if its a file, a folder + // or a string to be added as file. For any other type of files (link, other) + // just ignore the item. + // Then prepare the information that will be stored for that file. + // When its a folder, expand the folder with all the files that are in that + // folder (recursively). + // Parameters : + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + public function privFileDescrExpand(&$p_filedescr_list, &$p_options) + { + $v_result=1; + + // ----- Create a result list + $v_result_list = array(); + + // ----- Look each entry + for ($i=0; $i<sizeof($p_filedescr_list); $i++) { + // ----- Get filedescr + $v_descr = $p_filedescr_list[$i]; + + // ----- Reduce the filename + $v_descr['filename'] = PclZipUtilTranslateWinPath($v_descr['filename'], false); + $v_descr['filename'] = PclZipUtilPathReduction($v_descr['filename']); + + // ----- Look for real file or folder + if (file_exists($v_descr['filename'])) { + if (@is_file($v_descr['filename'])) { + $v_descr['type'] = 'file'; + } elseif (@is_dir($v_descr['filename'])) { + $v_descr['type'] = 'folder'; + } elseif (@is_link($v_descr['filename'])) { + // skip + continue; + } else { + // skip + continue; + } + } elseif (isset($v_descr['content'])) { + // ----- Look for string added as file + $v_descr['type'] = 'virtual_file'; + } else { + // ----- Missing file + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$v_descr['filename']."' does not exist"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Calculate the stored filename + $this->privCalculateStoredFilename($v_descr, $p_options); + + // ----- Add the descriptor in result list + $v_result_list[sizeof($v_result_list)] = $v_descr; + + // ----- Look for folder + if ($v_descr['type'] == 'folder') { + // ----- List of items in folder + $v_dirlist_descr = array(); + $v_dirlist_nb = 0; + if ($v_folder_handler = @opendir($v_descr['filename'])) { + while (($v_item_handler = @readdir($v_folder_handler)) !== false) { + // ----- Skip '.' and '..' + if (($v_item_handler == '.') || ($v_item_handler == '..')) { + continue; + } + + // ----- Compose the full filename + $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler; + + // ----- Look for different stored filename + // Because the name of the folder was changed, the name of the + // files/sub-folders also change + if (($v_descr['stored_filename'] != $v_descr['filename']) + && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) { + if ($v_descr['stored_filename'] != '') { + $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler; + } else { + $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler; + } + } + $v_dirlist_nb++; + } + + @closedir($v_folder_handler); + } else { + // TBC : unable to open folder in read mode + } + + // ----- Expand each element of the list + if ($v_dirlist_nb != 0) { + // ----- Expand + if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) { + return $v_result; + } + + // ----- Concat the resulting list + $v_result_list = array_merge($v_result_list, $v_dirlist_descr); + } + + // ----- Free local array + unset($v_dirlist_descr); + } + } + + // ----- Get the result list + $p_filedescr_list = $v_result_list; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCreate() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + public function privCreate($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the file in write mode + if (($v_result = $this->privOpenFd('wb')) != 1) { + // ----- Return + return $v_result; + } + + // ----- Add the list of files + $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options); + + // ----- Close + $this->privCloseFd(); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAdd() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + public function privAdd($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Look if the archive exists or is empty + if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0)) { + // ----- Do a create + $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options); + + // ----- Return + return $v_result; + } + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) { + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = $v_central_dir['offset']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Swap the file descriptor + // Here is a trick : I swap the temporary fd with the zip fd, in order to use + // the following methods on the temporary fil and not the real archive + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Add the files + $v_header_list = array(); + if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) { + fclose($v_zip_temp_fd); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($this->zip_fd); + + // ----- Copy the block of file headers from the old archive + $v_size = $v_central_dir['size']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_zip_temp_fd, $v_read_size); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Create the Central Dir files header + for ($i=0, $v_count=0; $i<sizeof($v_header_list); $i++) { + // ----- Create the file header + if ($v_header_list[$i]['status'] == 'ok') { + if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) { + fclose($v_zip_temp_fd); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + $v_count++; + } + + // ----- Transform the header to a 'usable' info + $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + // ----- Zip file comment + $v_comment = $v_central_dir['comment']; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) { + $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT]; + } + if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($this->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1) { + // ----- Reset the file list + unset($v_header_list); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Swap back the file descriptor + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Close + $this->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privOpenFd() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + public function privOpenFd($p_mode) + { + $v_result=1; + + // ----- Look if already open + if ($this->zip_fd != 0) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCloseFd() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + public function privCloseFd() + { + $v_result=1; + + if ($this->zip_fd != 0) { + @fclose($this->zip_fd); + } + $this->zip_fd = 0; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddList() + // Description : + // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is + // different from the real path of the file. This is usefull if you want to have PclTar + // running in any directory, and memorize relative path from an other directory. + // Parameters : + // $p_list : An array containing the file or directory names to add in the tar + // $p_result_list : list of added files with their properties (specially the status field) + // $p_add_dir : Path to add in the filename path archived + // $p_remove_dir : Path to remove in the filename path archived + // Return Values : + // -------------------------------------------------------------------------------- + // public function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options) + public function privAddList($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + + // ----- Add the files + $v_header_list = array(); + if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) { + // ----- Return + return $v_result; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($this->zip_fd); + + // ----- Create the Central Dir files header + for ($i=0, $v_count=0; $i<sizeof($v_header_list); $i++) { + // ----- Create the file header + if ($v_header_list[$i]['status'] == 'ok') { + if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) { + // ----- Return + return $v_result; + } + $v_count++; + } + + // ----- Transform the header to a 'usable' info + $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + // ----- Zip file comment + $v_comment = ''; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($this->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1) { + // ----- Reset the file list + unset($v_header_list); + + // ----- Return + return $v_result; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFileList() + // Description : + // Parameters : + // $p_filedescr_list : An array containing the file description + // or directory names to add in the zip + // $p_result_list : list of added files with their properties (specially the status field) + // Return Values : + // -------------------------------------------------------------------------------- + public function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options) + { + $v_result=1; + $v_header = array(); + + // ----- Recuperate the current number of elt in list + $v_nb = sizeof($p_result_list); + + // ----- Loop on the files + for ($j=0; ($j<sizeof($p_filedescr_list)) && ($v_result==1); $j++) { + // ----- Format the filename + $p_filedescr_list[$j]['filename'] = PclZipUtilTranslateWinPath($p_filedescr_list[$j]['filename'], false); + + // ----- Skip empty file names + // TBC : Can this be possible ? not checked in DescrParseAtt ? + if ($p_filedescr_list[$j]['filename'] == "") { + continue; + } + + // ----- Check the filename + if (($p_filedescr_list[$j]['type'] != 'virtual_file') && (!file_exists($p_filedescr_list[$j]['filename']))) { + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$p_filedescr_list[$j]['filename']."' does not exist"); + return PclZip::errorCode(); + } + + // ----- Look if it is a file or a dir with no all path remove option + // or a dir with all its path removed + // if ( (is_file($p_filedescr_list[$j]['filename'])) + // || ( is_dir($p_filedescr_list[$j]['filename']) + if (($p_filedescr_list[$j]['type'] == 'file') || ($p_filedescr_list[$j]['type'] == 'virtual_file') || (($p_filedescr_list[$j]['type'] == 'folder') && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]) || !$p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) { + // ----- Add the file + $v_result = $this->privAddFile($p_filedescr_list[$j], $v_header, $p_options); + if ($v_result != 1) { + return $v_result; + } + + // ----- Store the file infos + $p_result_list[$v_nb++] = $v_header; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + public function privAddFile($p_filedescr, &$p_header, &$p_options) + { + $v_result=1; + + // ----- Working variable + $p_filename = $p_filedescr['filename']; + + // TBC : Already done in the fileAtt check ... ? + if ($p_filename == "") { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for a stored different filename + /* TBC : Removed + if (isset($p_filedescr['stored_filename'])) { + $v_stored_filename = $p_filedescr['stored_filename']; + } + else { + $v_stored_filename = $p_filedescr['stored_filename']; + } + */ + + // ----- Set the file properties + clearstatcache(); + $p_header['version'] = 20; + $p_header['version_extracted'] = 10; + $p_header['flag'] = 0; + $p_header['compression'] = 0; + $p_header['crc'] = 0; + $p_header['compressed_size'] = 0; + $p_header['filename_len'] = strlen($p_filename); + $p_header['extra_len'] = 0; + $p_header['disk'] = 0; + $p_header['internal'] = 0; + $p_header['offset'] = 0; + $p_header['filename'] = $p_filename; + // TBC : Removed $p_header['stored_filename'] = $v_stored_filename; + $p_header['stored_filename'] = $p_filedescr['stored_filename']; + $p_header['extra'] = ''; + $p_header['status'] = 'ok'; + $p_header['index'] = -1; + + // ----- Look for regular file + if ($p_filedescr['type']=='file') { + $p_header['external'] = 0x00000000; + $p_header['size'] = filesize($p_filename); + } elseif ($p_filedescr['type']=='folder') { + // ----- Look for regular folder + $p_header['external'] = 0x00000010; + $p_header['mtime'] = filemtime($p_filename); + $p_header['size'] = filesize($p_filename); + } elseif ($p_filedescr['type'] == 'virtual_file') { + // ----- Look for virtual file + $p_header['external'] = 0x00000000; + $p_header['size'] = strlen($p_filedescr['content']); + } + + // ----- Look for filetime + if (isset($p_filedescr['mtime'])) { + $p_header['mtime'] = $p_filedescr['mtime']; + } elseif ($p_filedescr['type'] == 'virtual_file') { + $p_header['mtime'] = time(); + } else { + $p_header['mtime'] = filemtime($p_filename); + } + + // ------ Look for file comment + if (isset($p_filedescr['comment'])) { + $p_header['comment_len'] = strlen($p_filedescr['comment']); + $p_header['comment'] = $p_filedescr['comment']; + } else { + $p_header['comment_len'] = 0; + $p_header['comment'] = ''; + } + + // ----- Look for pre-add callback + if (isset($p_options[PCLZIP_CB_PRE_ADD])) { + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_header, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_header['status'] = "skipped"; + $v_result = 1; + } + + // ----- Update the informations + // Only some fields can be modified + if ($p_header['stored_filename'] != $v_local_header['stored_filename']) { + $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']); + } + } + + // ----- Look for empty stored filename + if ($p_header['stored_filename'] == "") { + $p_header['status'] = "filtered"; + } + + // ----- Check the path length + if (strlen($p_header['stored_filename']) > 0xFF) { + $p_header['status'] = 'filename_too_long'; + } + + // ----- Look if no error, or file not skipped + if ($p_header['status'] == 'ok') { + // ----- Look for a file + if ($p_filedescr['type'] == 'file') { + // ----- Look for using temporary file to zip + if ((!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])))) { + $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options); + if ($v_result < PCLZIP_ERR_NO_ERROR) { + return $v_result; + } + } else { + // ----- Use "in memory" zip algo + // ----- Open the source file + if (($v_file = @fopen($p_filename, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); + return PclZip::errorCode(); + } + + // ----- Read the file content + $v_content = @fread($v_file, $p_header['size']); + + // ----- Close the file + @fclose($v_file); + + // ----- Calculate the CRC + $p_header['crc'] = @crc32($v_content); + + // ----- Look for no compression + if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { + // ----- Set header parameters + $p_header['compressed_size'] = $p_header['size']; + $p_header['compression'] = 0; + } else { + // ----- Look for normal compression + // ----- Compress the content + $v_content = @gzdeflate($v_content); + + // ----- Set header parameters + $p_header['compressed_size'] = strlen($v_content); + $p_header['compression'] = 8; + } + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + @fclose($v_file); + return $v_result; + } + + // ----- Write the compressed (or not) content + @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); + } + } elseif ($p_filedescr['type'] == 'virtual_file') { + // ----- Look for a virtual file (a file from string) + $v_content = $p_filedescr['content']; + + // ----- Calculate the CRC + $p_header['crc'] = @crc32($v_content); + + // ----- Look for no compression + if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { + // ----- Set header parameters + $p_header['compressed_size'] = $p_header['size']; + $p_header['compression'] = 0; + } else { + // ----- Look for normal compression + // ----- Compress the content + $v_content = @gzdeflate($v_content); + + // ----- Set header parameters + $p_header['compressed_size'] = strlen($v_content); + $p_header['compression'] = 8; + } + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + @fclose($v_file); + return $v_result; + } + + // ----- Write the compressed (or not) content + @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); + } elseif ($p_filedescr['type'] == 'folder') { + // ----- Look for a directory + // ----- Look for directory last '/' + if (@substr($p_header['stored_filename'], -1) != '/') { + $p_header['stored_filename'] .= '/'; + } + + // ----- Set the file properties + $p_header['size'] = 0; + //$p_header['external'] = 0x41FF0010; // Value for a folder : to be checked + $p_header['external'] = 0x00000010; // Value for a folder : to be checked + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + return $v_result; + } + } + } + + // ----- Look for post-add callback + if (isset($p_options[PCLZIP_CB_POST_ADD])) { + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_header, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + // eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header); + if ($v_result == 0) { + // ----- Ignored + $v_result = 1; + } + + // ----- Update the informations + // Nothing can be modified + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFileUsingTempFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + public function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options) + { + $v_result=PCLZIP_ERR_NO_ERROR; + + // ----- Working variable + $p_filename = $p_filedescr['filename']; + + + // ----- Open the source file + if (($v_file = @fopen($p_filename, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); + return PclZip::errorCode(); + } + + // ----- Creates a compressed temporary file + $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; + if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) { + fclose($v_file); + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); + return PclZip::errorCode(); + } + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = filesize($p_filename); + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_file, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @gzputs($v_file_compressed, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close the file + @fclose($v_file); + @gzclose($v_file_compressed); + + // ----- Check the minimum file size + if (filesize($v_gzip_temp_name) < 18) { + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \''.$v_gzip_temp_name.'\' has invalid filesize - should be minimum 18 bytes'); + return PclZip::errorCode(); + } + + // ----- Extract the compressed attributes + if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + // ----- Read the gzip file header + $v_binary_data = @fread($v_file_compressed, 10); + $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data); + + // ----- Check some parameters + $v_data_header['os'] = bin2hex($v_data_header['os']); + + // ----- Read the gzip file footer + @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8); + $v_binary_data = @fread($v_file_compressed, 8); + $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data); + + // ----- Set the attributes + $p_header['compression'] = ord($v_data_header['cm']); + //$p_header['mtime'] = $v_data_header['mtime']; + $p_header['crc'] = $v_data_footer['crc']; + $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18; + + // ----- Close the file + @fclose($v_file_compressed); + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + return $v_result; + } + + // ----- Add the compressed data + if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + fseek($v_file_compressed, 10); + $v_size = $p_header['compressed_size']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_file_compressed, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close the file + @fclose($v_file_compressed); + + // ----- Unlink the temporary file + @unlink($v_gzip_temp_name); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCalculateStoredFilename() + // Description : + // Based on file descriptor properties and global options, this method + // calculate the filename that will be stored in the archive. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + public function privCalculateStoredFilename(&$p_filedescr, &$p_options) + { + $v_result=1; + + // ----- Working variables + $p_filename = $p_filedescr['filename']; + if (isset($p_options[PCLZIP_OPT_ADD_PATH])) { + $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH]; + } else { + $p_add_dir = ''; + } + if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) { + $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH]; + } else { + $p_remove_dir = ''; + } + if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } else { + $p_remove_all_dir = 0; + } + + // ----- Look for full name change + if (isset($p_filedescr['new_full_name'])) { + // ----- Remove drive letter if any + $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']); + } else { + // ----- Look for path and/or short name change + // ----- Look for short name change + // Its when we cahnge just the filename but not the path + if (isset($p_filedescr['new_short_name'])) { + $v_path_info = pathinfo($p_filename); + $v_dir = ''; + if ($v_path_info['dirname'] != '') { + $v_dir = $v_path_info['dirname'].'/'; + } + $v_stored_filename = $v_dir.$p_filedescr['new_short_name']; + } else { + // ----- Calculate the stored filename + $v_stored_filename = $p_filename; + } + + // ----- Look for all path to remove + if ($p_remove_all_dir) { + $v_stored_filename = basename($p_filename); + } elseif ($p_remove_dir != "") { + // ----- Look for partial path remove + if (substr($p_remove_dir, -1) != '/') { + $p_remove_dir .= "/"; + } + + if ((substr($p_filename, 0, 2) == "./") || (substr($p_remove_dir, 0, 2) == "./")) { + if ((substr($p_filename, 0, 2) == "./") && (substr($p_remove_dir, 0, 2) != "./")) { + $p_remove_dir = "./".$p_remove_dir; + } + if ((substr($p_filename, 0, 2) != "./") && (substr($p_remove_dir, 0, 2) == "./")) { + $p_remove_dir = substr($p_remove_dir, 2); + } + } + + $v_compare = PclZipUtilPathInclusion($p_remove_dir, $v_stored_filename); + if ($v_compare > 0) { + if ($v_compare == 2) { + $v_stored_filename = ""; + } else { + $v_stored_filename = substr($v_stored_filename, strlen($p_remove_dir)); + } + } + } + + // ----- Remove drive letter if any + $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename); + + // ----- Look for path to add + if ($p_add_dir != "") { + if (substr($p_add_dir, -1) == "/") { + $v_stored_filename = $p_add_dir.$v_stored_filename; + } else { + $v_stored_filename = $p_add_dir."/".$v_stored_filename; + } + } + } + + // ----- Filename (reduce the path of stored name) + $v_stored_filename = PclZipUtilPathReduction($v_stored_filename); + $p_filedescr['stored_filename'] = $v_stored_filename; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + public function privWriteFileHeader(&$p_header) + { + $v_result=1; + + // ----- Store the offset position of the file + $p_header['offset'] = ftell($this->zip_fd); + + // ----- Transform UNIX mtime to DOS format mdate/mtime + $v_date = getdate($p_header['mtime']); + $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; + $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; + + // ----- Packed data + $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50, $p_header['version_extracted'], $p_header['flag'], $p_header['compression'], $v_mtime, $v_mdate, $p_header['crc'], $p_header['compressed_size'], $p_header['size'], strlen($p_header['stored_filename']), $p_header['extra_len']); + + // ----- Write the first 148 bytes of the header in the archive + fputs($this->zip_fd, $v_binary_data, 30); + + // ----- Write the variable fields + if (strlen($p_header['stored_filename']) != 0) { + fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); + } + if ($p_header['extra_len'] != 0) { + fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteCentralFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + public function privWriteCentralFileHeader(&$p_header) + { + $v_result=1; + + // TBC + //for(reset($p_header); $key = key($p_header); next($p_header)) { + //} + + // ----- Transform UNIX mtime to DOS format mdate/mtime + $v_date = getdate($p_header['mtime']); + $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; + $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; + + + // ----- Packed data + $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50, $p_header['version'], $p_header['version_extracted'], $p_header['flag'], $p_header['compression'], $v_mtime, $v_mdate, $p_header['crc'], $p_header['compressed_size'], $p_header['size'], strlen($p_header['stored_filename']), $p_header['extra_len'], $p_header['comment_len'], $p_header['disk'], $p_header['internal'], $p_header['external'], $p_header['offset']); + + // ----- Write the 42 bytes of the header in the zip file + fputs($this->zip_fd, $v_binary_data, 46); + + // ----- Write the variable fields + if (strlen($p_header['stored_filename']) != 0) { + fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); + } + if ($p_header['extra_len'] != 0) { + fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); + } + if ($p_header['comment_len'] != 0) { + fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteCentralHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + public function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment) + { + $v_result = 1; + + // ----- Packed data + $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries, $p_nb_entries, $p_size, $p_offset, strlen($p_comment)); + + // ----- Write the 22 bytes of the header in the zip file + fputs($this->zip_fd, $v_binary_data, 22); + + // ----- Write the variable fields + if (strlen($p_comment) != 0) { + fputs($this->zip_fd, $p_comment, strlen($p_comment)); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privList() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + public function privList(&$p_list) + { + $v_result = 1; + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) { + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Go to beginning of Central Dir + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_central_dir['offset'])) { + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read each entry + for ($i=0; $i<$v_central_dir['entries']; $i++) { + // ----- Read the file header + if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + $v_header['index'] = $i; + + // ----- Get the only interesting attributes + $this->privConvertHeader2FileInfo($v_header, $p_list[$i]); + unset($v_header); + } + + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privConvertHeader2FileInfo() + // Description : + // This function takes the file informations from the central directory + // entries and extract the interesting parameters that will be given back. + // The resulting file infos are set in the array $p_info + // $p_info['filename'] : Filename with full path. Given by user (add), + // extracted in the filesystem (extract). + // $p_info['stored_filename'] : Stored filename in the archive. + // $p_info['size'] = Size of the file. + // $p_info['compressed_size'] = Compressed size of the file. + // $p_info['mtime'] = Last modification date of the file. + // $p_info['comment'] = Comment associated with the file. + // $p_info['folder'] = true/false : indicates if the entry is a folder or not. + // $p_info['status'] = status of the action on the file. + // $p_info['crc'] = CRC of the file content. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + public function privConvertHeader2FileInfo($p_header, &$p_info) + { + $v_result=1; + + // ----- Get the interesting attributes + $v_temp_path = PclZipUtilPathReduction($p_header['filename']); + $p_info['filename'] = $v_temp_path; + $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']); + $p_info['stored_filename'] = $v_temp_path; + $p_info['size'] = $p_header['size']; + $p_info['compressed_size'] = $p_header['compressed_size']; + $p_info['mtime'] = $p_header['mtime']; + $p_info['comment'] = $p_header['comment']; + $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010); + $p_info['index'] = $p_header['index']; + $p_info['status'] = $p_header['status']; + $p_info['crc'] = $p_header['crc']; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractByRule() + // Description : + // Extract a file or directory depending of rules (by index, by name, ...) + // Parameters : + // $p_file_list : An array where will be placed the properties of each + // extracted file + // $p_path : Path to add while writing the extracted files + // $p_remove_path : Path to remove (from the file memorized path) while writing the + // extracted files. If the path does not match the file path, + // the file is extracted with its memorized path. + // $p_remove_path does not apply to 'list' mode. + // $p_path and $p_remove_path are commulative. + // Return Values : + // 1 on success,0 or less on error (see error code list) + // -------------------------------------------------------------------------------- + public function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) + { + $v_result=1; + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Check the path + if (($p_path == "") || ((substr($p_path, 0, 1) != "/") && (substr($p_path, 0, 3) != "../") && (substr($p_path, 1, 2)!=":/"))) { + $p_path = "./".$p_path; + } + + // ----- Reduce the path last (and duplicated) '/' + if (($p_path != "./") && ($p_path != "/")) { + // ----- Look for the path end '/' + while (substr($p_path, -1) == "/") { + $p_path = substr($p_path, 0, strlen($p_path)-1); + } + } + + // ----- Look for path to remove format (should end by /) + if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) { + $p_remove_path .= '/'; + } + $p_remove_path_size = strlen($p_remove_path); + + // ----- Open the zip file + if (($v_result = $this->privOpenFd('rb')) != 1) { + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Start at beginning of Central Dir + $v_pos_entry = $v_central_dir['offset']; + + // ----- Read each entry + $j_start = 0; + for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) { + // ----- Read next Central dir entry + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_pos_entry)) { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the file header + $v_header = array(); + if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Store the index + $v_header['index'] = $i; + + // ----- Store the file position + $v_pos_entry = ftell($this->zip_fd); + + // ----- Look for the specific extract rules + $v_extract = false; + + // ----- Look for extract by name rule + if ((isset($p_options[PCLZIP_OPT_BY_NAME])) && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { + // ----- Look if the filename is in the list + for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_extract); $j++) { + // ----- Look for a directory + if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") { + // ----- Look if the directory is in the filename path + if ((strlen($v_header['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_extract = true; + } + } elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { + // ----- Look for a filename + $v_extract = true; + } + } + } elseif ((isset($p_options[PCLZIP_OPT_BY_PREG])) && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { + // ----- Look for extract by preg rule + if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) { + $v_extract = true; + } + } elseif ((isset($p_options[PCLZIP_OPT_BY_INDEX])) && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { + // ----- Look for extract by index rule + // ----- Look if the index is in the list + for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_extract); $j++) { + if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { + $v_extract = true; + } + if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { + $j_start = $j+1; + } + + if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { + break; + } + } + } else { + // ----- Look for no rule, which means extract all the archive + $v_extract = true; + } + + // ----- Check compression method + if (($v_extract) && (($v_header['compression'] != 8) && ($v_header['compression'] != 0))) { + $v_header['status'] = 'unsupported_compression'; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true)) { + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION, "Filename '".$v_header['stored_filename']."' is compressed by an unsupported compression method (".$v_header['compression'].") "); + + return PclZip::errorCode(); + } + } + + // ----- Check encrypted files + if (($v_extract) && (($v_header['flag'] & 1) == 1)) { + $v_header['status'] = 'unsupported_encryption'; + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true)) { + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, "Unsupported encryption for filename '".$v_header['stored_filename']."'"); + + return PclZip::errorCode(); + } + } + + // ----- Look for real extraction + if (($v_extract) && ($v_header['status'] != 'ok')) { + $v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++]); + if ($v_result != 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + $v_extract = false; + } + + // ----- Look for real extraction + if ($v_extract) { + // ----- Go to the file position + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_header['offset'])) { + // ----- Close the zip file + $this->privCloseFd(); + + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for extraction as string + if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) { + $v_string = ''; + + // ----- Extracting the file + $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Set the file content + $p_file_list[$v_nb_extracted]['content'] = $v_string; + + // ----- Next extracted file + $v_nb_extracted++; + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } elseif ((isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) { + // ----- Look for extraction in standard output + // ----- Extracting the file in standard output + $v_result1 = $this->privExtractFileInOutput($v_header, $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result; + } + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } else { + // ----- Look for normal extraction + // ----- Extracting the file + $v_result1 = $this->privExtractFile($v_header, $p_path, $p_remove_path, $p_remove_all_path, $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + } + } + + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFile() + // Description : + // Parameters : + // Return Values : + // + // 1 : ... ? + // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback + // -------------------------------------------------------------------------------- + public function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) + { + $v_result=1; + + // ----- Read the file header + if (($v_result = $this->privReadFileHeader($v_header)) != 1) { + // ----- Return + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for all path to remove + if ($p_remove_all_path == true) { + // ----- Look for folder entry that not need to be extracted + if (($p_entry['external']&0x00000010)==0x00000010) { + $p_entry['status'] = "filtered"; + + return $v_result; + } + + // ----- Get the basename of the path + $p_entry['filename'] = basename($p_entry['filename']); + } elseif ($p_remove_path != "") { + // ----- Look for path to remove + if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2) { + // ----- Change the file status + $p_entry['status'] = "filtered"; + + // ----- Return + return $v_result; + } + + $p_remove_path_size = strlen($p_remove_path); + if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path) { + // ----- Remove the path + $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size); + } + } + + // ----- Add the path + if ($p_path != '') { + $p_entry['filename'] = $p_path."/".$p_entry['filename']; + } + + // ----- Check a base_dir_restriction + if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) { + $v_inclusion = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION], $p_entry['filename']); + if ($v_inclusion == 0) { + PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION, "Filename '".$p_entry['filename']."' is outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION"); + + return PclZip::errorCode(); + } + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + // ----- Look for specific actions while the file exist + if (file_exists($p_entry['filename'])) { + // ----- Look if file is a directory + if (is_dir($p_entry['filename'])) { + // ----- Change the file status + $p_entry['status'] = "already_a_directory"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY, "Filename '".$p_entry['filename']."' is already used by an existing directory"); + return PclZip::errorCode(); + } + } elseif (!is_writeable($p_entry['filename'])) { + // ----- Look if file is write protected + // ----- Change the file status + $p_entry['status'] = "write_protected"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true)) { + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, "Filename '".$p_entry['filename']."' exists and is write protected"); + return PclZip::errorCode(); + } + } elseif (filemtime($p_entry['filename']) > $p_entry['mtime']) { + // ----- Look if the extracted file is older + // ----- Change the file status + if ((isset($p_options[PCLZIP_OPT_REPLACE_NEWER])) && ($p_options[PCLZIP_OPT_REPLACE_NEWER] === true)) { + } else { + $p_entry['status'] = "newer_exist"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true)) { + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, "Newer version of '".$p_entry['filename']."' exists and option PCLZIP_OPT_REPLACE_NEWER is not selected"); + return PclZip::errorCode(); + } + } + } else { + } + } else { + // ----- Check the directory availability and create it if necessary + if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/')) { + $v_dir_to_check = $p_entry['filename']; + } elseif (!strstr($p_entry['filename'], "/")) { + $v_dir_to_check = ""; + } else { + $v_dir_to_check = dirname($p_entry['filename']); + } + + if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) { + // ----- Change the file status + $p_entry['status'] = "path_creation_fail"; + + // ----- Return + //return $v_result; + $v_result = 1; + } + } + } + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010) == 0x00000010)) { + // ----- Look for not compressed file + if ($p_entry['compression'] == 0) { + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { + // ----- Change the file status + $p_entry['status'] = "write_error"; + + // ----- Return + return $v_result; + } + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['compressed_size']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + /* Try to speed up the code + $v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_binary_data, $v_read_size); + */ + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Closing the destination file + fclose($v_dest_file); + + // ----- Change the file mtime + touch($p_entry['filename'], $p_entry['mtime']); + } else { + // ----- TBC + // Need to be finished + if (($p_entry['flag'] & 1) == 1) { + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \''.$p_entry['filename'].'\' is encrypted. Encrypted files are not supported.'); + return PclZip::errorCode(); + } + + // ----- Look for using temporary file to unzip + if ((!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])))) { + $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options); + if ($v_result < PCLZIP_ERR_NO_ERROR) { + return $v_result; + } + } else { + // ----- Look for extract in memory + // ----- Read the compressed file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + $v_file_content = @gzinflate($v_buffer); + unset($v_buffer); + if ($v_file_content === false) { + // ----- Change the file status + // TBC + $p_entry['status'] = "error"; + + return $v_result; + } + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { + // ----- Change the file status + $p_entry['status'] = "write_error"; + + return $v_result; + } + + // ----- Write the uncompressed data + @fwrite($v_dest_file, $v_file_content, $p_entry['size']); + unset($v_file_content); + + // ----- Closing the destination file + @fclose($v_dest_file); + } + + // ----- Change the file mtime + @touch($p_entry['filename'], $p_entry['mtime']); + } + + // ----- Look for chmod option + if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) { + // ----- Change the mode of the file + @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]); + } + } + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + // ----- Look for post-extract callback + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + // eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileUsingTempFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + public function privExtractFileUsingTempFile(&$p_entry, &$p_options) + { + $v_result=1; + + // ----- Creates a temporary file + $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; + if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) { + fclose($v_file); + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); + return PclZip::errorCode(); + } + + // ----- Write gz file format header + $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3)); + @fwrite($v_dest_file, $v_binary_data, 10); + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['compressed_size']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Write gz file format footer + $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']); + @fwrite($v_dest_file, $v_binary_data, 8); + + // ----- Close the temporary file + @fclose($v_dest_file); + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { + $p_entry['status'] = "write_error"; + return $v_result; + } + + // ----- Open the temporary gz file + if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) { + @fclose($v_dest_file); + $p_entry['status'] = "read_error"; + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); + return PclZip::errorCode(); + } + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['size']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($v_src_file, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + @fclose($v_dest_file); + @gzclose($v_src_file); + + // ----- Delete the temporary file + @unlink($v_gzip_temp_name); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileInOutput() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + public function privExtractFileInOutput(&$p_entry, &$p_options) + { + $v_result=1; + + // ----- Read the file header + if (($v_result = $this->privReadFileHeader($v_header)) != 1) { + return $v_result; + } + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + // ----- Trace + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) { + // ----- Look for not compressed file + if ($p_entry['compressed_size'] == $p_entry['size']) { + // ----- Read the file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Send the file to the output + echo $v_buffer; + unset($v_buffer); + } else { + // ----- Read the compressed file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + $v_file_content = gzinflate($v_buffer); + unset($v_buffer); + + // ----- Send the file to the output + echo $v_file_content; + unset($v_file_content); + } + } + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + // ----- Look for post-extract callback + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + // eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileAsString() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + public function privExtractFileAsString(&$p_entry, &$p_string, &$p_options) + { + $v_result=1; + + // ----- Read the file header + $v_header = array(); + if (($v_result = $this->privReadFileHeader($v_header)) != 1) { + // ----- Return + return $v_result; + } + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + // eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) { + // ----- Look for not compressed file + // if ($p_entry['compressed_size'] == $p_entry['size']) + if ($p_entry['compression'] == 0) { + // ----- Reading the file + $p_string = @fread($this->zip_fd, $p_entry['compressed_size']); + } else { + // ----- Reading the file + $v_data = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + if (($p_string = @gzinflate($v_data)) === false) { + // TBC + } + } + // ----- Trace + } else { + // TBC : error : can not extract a folder in a string + } + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + // ----- Look for post-extract callback + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Swap the content to header + $v_local_header['content'] = $p_string; + $p_string = ''; + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + // eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + + // ----- Swap back the content to header + $p_string = $v_local_header['content']; + unset($v_local_header['content']); + + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + public function privReadFileHeader(&$p_header) + { + $v_result=1; + + // ----- Read the 4 bytes signature + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] != 0x04034b50) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the first 42 bytes of the header + $v_binary_data = fread($this->zip_fd, 26); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 26) { + $p_header['filename'] = ""; + $p_header['status'] = "invalid_header"; + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data); + + // ----- Get filename + $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']); + + // ----- Get extra_fields + if ($v_data['extra_len'] != 0) { + $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']); + } else { + $p_header['extra'] = ''; + } + + // ----- Extract properties + $p_header['version_extracted'] = $v_data['version']; + $p_header['compression'] = $v_data['compression']; + $p_header['size'] = $v_data['size']; + $p_header['compressed_size'] = $v_data['compressed_size']; + $p_header['crc'] = $v_data['crc']; + $p_header['flag'] = $v_data['flag']; + $p_header['filename_len'] = $v_data['filename_len']; + + // ----- Recuperate date in UNIX format + $p_header['mdate'] = $v_data['mdate']; + $p_header['mtime'] = $v_data['mtime']; + if ($p_header['mdate'] && $p_header['mtime']) { + // ----- Extract time + $v_hour = ($p_header['mtime'] & 0xF800) >> 11; + $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; + $v_seconde = ($p_header['mtime'] & 0x001F)*2; + + // ----- Extract date + $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; + $v_month = ($p_header['mdate'] & 0x01E0) >> 5; + $v_day = $p_header['mdate'] & 0x001F; + + // ----- Get UNIX date format + $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); + + } else { + $p_header['mtime'] = time(); + } + + // TBC + //for(reset($v_data); $key = key($v_data); next($v_data)) { + //} + + // ----- Set the stored filename + $p_header['stored_filename'] = $p_header['filename']; + + // ----- Set the status field + $p_header['status'] = "ok"; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadCentralFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + public function privReadCentralFileHeader(&$p_header) + { + $v_result = 1; + + // ----- Read the 4 bytes signature + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] != 0x02014b50) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the first 42 bytes of the header + $v_binary_data = fread($this->zip_fd, 42); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 42) { + $p_header['filename'] = ""; + $p_header['status'] = "invalid_header"; + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data); + + // ----- Get filename + if ($p_header['filename_len'] != 0) { + $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']); + } else { + $p_header['filename'] = ''; + } + + // ----- Get extra + if ($p_header['extra_len'] != 0) { + $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']); + } else { + $p_header['extra'] = ''; + } + + // ----- Get comment + if ($p_header['comment_len'] != 0) { + $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']); + } else { + $p_header['comment'] = ''; + } + + // ----- Extract properties + + // ----- Recuperate date in UNIX format + //if ($p_header['mdate'] && $p_header['mtime']) + // TBC : bug : this was ignoring time with 0/0/0 + if (1) { + // ----- Extract time + $v_hour = ($p_header['mtime'] & 0xF800) >> 11; + $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; + $v_seconde = ($p_header['mtime'] & 0x001F)*2; + + // ----- Extract date + $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; + $v_month = ($p_header['mdate'] & 0x01E0) >> 5; + $v_day = $p_header['mdate'] & 0x001F; + + // ----- Get UNIX date format + $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); + + } else { + $p_header['mtime'] = time(); + } + + // ----- Set the stored filename + $p_header['stored_filename'] = $p_header['filename']; + + // ----- Set default status to ok + $p_header['status'] = 'ok'; + + // ----- Look if it is a directory + if (substr($p_header['filename'], -1) == '/') { + //$p_header['external'] = 0x41FF0010; + $p_header['external'] = 0x00000010; + } + + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCheckFileHeaders() + // Description : + // Parameters : + // Return Values : + // 1 on success, + // 0 on error; + // -------------------------------------------------------------------------------- + public function privCheckFileHeaders(&$p_local_header, &$p_central_header) + { + $v_result=1; + + // ----- Check the static values + // TBC + if ($p_local_header['filename'] != $p_central_header['filename']) { + } + if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) { + } + if ($p_local_header['flag'] != $p_central_header['flag']) { + } + if ($p_local_header['compression'] != $p_central_header['compression']) { + } + if ($p_local_header['mtime'] != $p_central_header['mtime']) { + } + if ($p_local_header['filename_len'] != $p_central_header['filename_len']) { + } + + // ----- Look for flag bit 3 + if (($p_local_header['flag'] & 8) == 8) { + $p_local_header['size'] = $p_central_header['size']; + $p_local_header['compressed_size'] = $p_central_header['compressed_size']; + $p_local_header['crc'] = $p_central_header['crc']; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadEndCentralDir() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + public function privReadEndCentralDir(&$p_central_dir) + { + $v_result=1; + + // ----- Go to the end of the zip file + $v_size = filesize($this->zipname); + @fseek($this->zip_fd, $v_size); + if (@ftell($this->zip_fd) != $v_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- First try : look if this is an archive with no commentaries (most of the time) + // in this case the end of central dir is at 22 bytes of the file end + $v_found = 0; + if ($v_size > 26) { + @fseek($this->zip_fd, $v_size-22); + if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read for bytes + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = @unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] == 0x06054b50) { + $v_found = 1; + } + + $v_pos = ftell($this->zip_fd); + } + + // ----- Go back to the maximum possible size of the Central Dir End Record + if (!$v_found) { + $v_maximum_size = 65557; // 0xFFFF + 22; + if ($v_maximum_size > $v_size) { + $v_maximum_size = $v_size; + } + @fseek($this->zip_fd, $v_size-$v_maximum_size); + if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read byte per byte in order to find the signature + $v_pos = ftell($this->zip_fd); + $v_bytes = 0x00000000; + while ($v_pos < $v_size) { + // ----- Read a byte + $v_byte = @fread($this->zip_fd, 1); + + // ----- Add the byte + //$v_bytes = ($v_bytes << 8) | Ord($v_byte); + // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number + // Otherwise on systems where we have 64bit integers the check below for the magic number will fail. + $v_bytes = (($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte); + + // ----- Compare the bytes + if ($v_bytes == 0x504b0506) { + $v_pos++; + break; + } + + $v_pos++; + } + + // ----- Look if not found end of central dir + if ($v_pos == $v_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature"); + + // ----- Return + return PclZip::errorCode(); + } + } + + // ----- Read the first 18 bytes of the header + $v_binary_data = fread($this->zip_fd, 18); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 18) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data); + + // ----- Check the global size + if (($v_pos + $v_data['comment_size'] + 18) != $v_size) { + // ----- Removed in release 2.2 see readme file + // The check of the file size is a little too strict. + // Some bugs where found when a zip is encrypted/decrypted with 'crypt'. + // While decrypted, zip has training 0 bytes + if (0) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'The central dir is not at the end of the archive. Some trailing bytes exists after the archive.'); + + // ----- Return + return PclZip::errorCode(); + } + } + + // ----- Get comment + if ($v_data['comment_size'] != 0) { + $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']); + } else { + $p_central_dir['comment'] = ''; + } + + $p_central_dir['entries'] = $v_data['entries']; + $p_central_dir['disk_entries'] = $v_data['disk_entries']; + $p_central_dir['offset'] = $v_data['offset']; + $p_central_dir['size'] = $v_data['size']; + $p_central_dir['disk'] = $v_data['disk']; + $p_central_dir['disk_start'] = $v_data['disk_start']; + + // TBC + //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) { + //} + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDeleteByRule() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + public function privDeleteByRule(&$p_result_list, &$p_options) + { + $v_result=1; + $v_list_detail = array(); + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) { + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { + $this->privCloseFd(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Scan all the files + // ----- Start at beginning of Central Dir + $v_pos_entry = $v_central_dir['offset']; + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_pos_entry)) { + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read each entry + $v_header_list = array(); + $j_start = 0; + for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) { + // ----- Read the file header + $v_header_list[$v_nb_extracted] = array(); + if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + + return $v_result; + } + + + // ----- Store the index + $v_header_list[$v_nb_extracted]['index'] = $i; + + // ----- Look for the specific extract rules + $v_found = false; + + // ----- Look for extract by name rule + if ((isset($p_options[PCLZIP_OPT_BY_NAME])) && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { + // ----- Look if the filename is in the list + for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_found); $j++) { + // ----- Look for a directory + if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") { + // ----- Look if the directory is in the filename path + if ((strlen($v_header_list[$v_nb_extracted]['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_found = true; + } elseif ((($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */ && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + $v_found = true; + } + } elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { + // ----- Look for a filename + $v_found = true; + } + } + } elseif ((isset($p_options[PCLZIP_OPT_BY_PREG])) && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { + // ----- Look for extract by preg rule + if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { + $v_found = true; + } + } elseif ((isset($p_options[PCLZIP_OPT_BY_INDEX])) && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { + // ----- Look for extract by index rule + // ----- Look if the index is in the list + for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_found); $j++) { + if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { + $v_found = true; + } + if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { + $j_start = $j+1; + } + if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { + break; + } + } + } else { + $v_found = true; + } + + // ----- Look for deletion + if ($v_found) { + unset($v_header_list[$v_nb_extracted]); + } else { + $v_nb_extracted++; + } + } + + // ----- Look if something need to be deleted + if ($v_nb_extracted > 0) { + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Creates a temporary zip archive + $v_temp_zip = new PclZip($v_zip_temp_name); + + // ----- Open the temporary zip file in write mode + if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) { + $this->privCloseFd(); + + // ----- Return + return $v_result; + } + + // ----- Look which file need to be kept + for ($i=0; $i<sizeof($v_header_list); $i++) { + // ----- Calculate the position of the header + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the file header + $v_local_header = array(); + if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Check that local file header is same as central file header + if ($this->privCheckFileHeaders($v_local_header, $v_header_list[$i]) != 1) { + // TBC + } + unset($v_local_header); + + // ----- Write the file header + if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Read/write the data block + if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($v_temp_zip->zip_fd); + + // ----- Re-Create the Central Dir files header + for ($i=0; $i<sizeof($v_header_list); $i++) { + // ----- Create the file header + if (($v_result = $v_temp_zip->privWriteCentralFileHeader($v_header_list[$i])) != 1) { + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Transform the header to a 'usable' info + $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + + // ----- Zip file comment + $v_comment = ''; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) { + // ----- Reset the file list + unset($v_header_list); + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Close + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Destroy the temporary archive + unset($v_temp_zip); + } elseif ($v_central_dir['entries'] != 0) { + // ----- Remove every files : reset the file + $this->privCloseFd(); + + if (($v_result = $this->privOpenFd('wb')) != 1) { + return $v_result; + } + + if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) { + return $v_result; + } + + $this->privCloseFd(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDirCheck() + // Description : + // Check if a directory exists, if not it creates it and all the parents directory + // which may be useful. + // Parameters : + // $p_dir : Directory path to check. + // Return Values : + // 1 : OK + // -1 : Unable to create directory + // -------------------------------------------------------------------------------- + public function privDirCheck($p_dir, $p_is_dir = false) + { + $v_result = 1; + + // ----- Remove the final '/' + if (($p_is_dir) && (substr($p_dir, -1)=='/')) { + $p_dir = substr($p_dir, 0, strlen($p_dir)-1); + } + + // ----- Check the directory availability + if ((is_dir($p_dir)) || ($p_dir == "")) { + return 1; + } + + // ----- Extract parent directory + $p_parent_dir = dirname($p_dir); + + // ----- Just a check + if ($p_parent_dir != $p_dir) { + // ----- Look for parent directory + if ($p_parent_dir != "") { + if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) { + return $v_result; + } + } + } + + // ----- Create the directory + if (!@mkdir($p_dir, 0777)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privMerge() + // Description : + // If $p_archive_to_add does not exist, the function exit with a success result. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + public function privMerge(&$p_archive_to_add) + { + $v_result=1; + + // ----- Look if the archive_to_add exists + if (!is_file($p_archive_to_add->zipname)) { + // ----- Nothing to merge, so merge is a success + $v_result = 1; + + // ----- Return + return $v_result; + } + + // ----- Look if the archive exists + if (!is_file($this->zipname)) { + // ----- Do a duplicate + $v_result = $this->privDuplicate($p_archive_to_add->zipname); + + // ----- Return + return $v_result; + } + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('rb')) != 1) { + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { + $this->privCloseFd(); + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Open the archive_to_add file + if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1) { + $this->privCloseFd(); + + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir_to_add = array(); + if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1) { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + return $v_result; + } + + // ----- Go to beginning of File + @rewind($p_archive_to_add->zip_fd); + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = $v_central_dir['offset']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Copy the files from the archive_to_add into the temporary file + $v_size = $v_central_dir_to_add['offset']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($v_zip_temp_fd); + + // ----- Copy the block of file headers from the old archive + $v_size = $v_central_dir['size']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Copy the block of file headers from the archive_to_add + $v_size = $v_central_dir_to_add['size']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Merge the file comments + $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment']; + + // ----- Calculate the size of the (new) central header + $v_size = @ftell($v_zip_temp_fd)-$v_offset; + + // ----- Swap the file descriptor + // Here is a trick : I swap the temporary fd with the zip fd, in order to use + // the following methods on the temporary fil and not the real archive fd + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1) { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + @fclose($v_zip_temp_fd); + $this->zip_fd = null; + + // ----- Reset the file list + unset($v_header_list); + + // ----- Return + return $v_result; + } + + // ----- Swap back the file descriptor + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Close + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDuplicate() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + public function privDuplicate($p_archive_filename) + { + $v_result=1; + + // ----- Look if the $p_archive_filename exists + if (!is_file($p_archive_filename)) { + // ----- Nothing to duplicate, so duplicate is a success. + $v_result = 1; + + // ----- Return + return $v_result; + } + + // ----- Open the zip file + if (($v_result=$this->privOpenFd('wb')) != 1) { + // ----- Return + return $v_result; + } + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) { + $this->privCloseFd(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = filesize($p_archive_filename); + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($v_zip_temp_fd, $v_read_size); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close + $this->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privErrorLog() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + public function privErrorLog($p_error_code = 0, $p_error_string = '') + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + PclError($p_error_code, $p_error_string); + } else { + $this->error_code = $p_error_code; + $this->error_string = $p_error_string; + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privErrorReset() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + public function privErrorReset() + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + PclErrorReset(); + } else { + $this->error_code = 0; + $this->error_string = ''; + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDisableMagicQuotes() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + public function privDisableMagicQuotes() + { + $v_result=1; + + // ----- Look if function exists + if ((!function_exists("get_magic_quotes_runtime")) || (!function_exists("set_magic_quotes_runtime"))) { + return $v_result; + } + + // ----- Look if already done + if ($this->magic_quotes_status != -1) { + return $v_result; + } + + // ----- Get and memorize the magic_quote value + $this->magic_quotes_status = @get_magic_quotes_runtime(); + + // ----- Disable magic_quotes + if ($this->magic_quotes_status == 1) { + @set_magic_quotes_runtime(0); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privSwapBackMagicQuotes() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + public function privSwapBackMagicQuotes() + { + $v_result=1; + + // ----- Look if function exists + if ((!function_exists("get_magic_quotes_runtime")) || (!function_exists("set_magic_quotes_runtime"))) { + return $v_result; + } + + // ----- Look if something to do + if ($this->magic_quotes_status != -1) { + return $v_result; + } + + // ----- Swap back magic_quotes + if ($this->magic_quotes_status == 1) { + @set_magic_quotes_runtime($this->magic_quotes_status); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- +} +// End of class +// -------------------------------------------------------------------------------- + +// -------------------------------------------------------------------------------- +// Function : PclZipUtilPathReduction() +// Description : +// Parameters : +// Return Values : +// -------------------------------------------------------------------------------- +function PclZipUtilPathReduction($p_dir) +{ + $v_result = ""; + + // ----- Look for not empty path + if ($p_dir != "") { + // ----- Explode path by directory names + $v_list = explode("/", $p_dir); + + // ----- Study directories from last to first + $v_skip = 0; + for ($i=sizeof($v_list)-1; $i>=0; $i--) { + // ----- Look for current path + if ($v_list[$i] == ".") { + // ----- Ignore this directory + // Should be the first $i=0, but no check is done + } elseif ($v_list[$i] == "..") { + $v_skip++; + } elseif ($v_list[$i] == "") { + // ----- First '/' i.e. root slash + if ($i == 0) { + $v_result = "/".$v_result; + if ($v_skip > 0) { + // ----- It is an invalid path, so the path is not modified + // TBC + $v_result = $p_dir; + $v_skip = 0; + } + } elseif ($i == (sizeof($v_list)-1)) { + // ----- Last '/' i.e. indicates a directory + $v_result = $v_list[$i]; + } else { + // ----- Double '/' inside the path + // ----- Ignore only the double '//' in path, + // but not the first and last '/' + } + } else { + // ----- Look for item to skip + if ($v_skip > 0) { + $v_skip--; + } else { + $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:""); + } + } + } + + // ----- Look for skip + if ($v_skip > 0) { + while ($v_skip > 0) { + $v_result = '../'.$v_result; + $v_skip--; + } + } + } + + // ----- Return + return $v_result; +} +// -------------------------------------------------------------------------------- + +// -------------------------------------------------------------------------------- +// Function : PclZipUtilPathInclusion() +// Description : +// This function indicates if the path $p_path is under the $p_dir tree. Or, +// said in an other way, if the file or sub-dir $p_path is inside the dir +// $p_dir. +// The function indicates also if the path is exactly the same as the dir. +// This function supports path with duplicated '/' like '//', but does not +// support '.' or '..' statements. +// Parameters : +// Return Values : +// 0 if $p_path is not inside directory $p_dir +// 1 if $p_path is inside directory $p_dir +// 2 if $p_path is exactly the same as $p_dir +// -------------------------------------------------------------------------------- +function PclZipUtilPathInclusion($p_dir, $p_path) +{ + $v_result = 1; + + // ----- Look for path beginning by ./ + if (($p_dir == '.') || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) { + $p_dir = PclZipUtilTranslateWinPath(getcwd(), false).'/'.substr($p_dir, 1); + } + if (($p_path == '.') || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) { + $p_path = PclZipUtilTranslateWinPath(getcwd(), false).'/'.substr($p_path, 1); + } + + // ----- Explode dir and path by directory separator + $v_list_dir = explode("/", $p_dir); + $v_list_dir_size = sizeof($v_list_dir); + $v_list_path = explode("/", $p_path); + $v_list_path_size = sizeof($v_list_path); + + // ----- Study directories paths + $i = 0; + $j = 0; + while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) { + // ----- Look for empty dir (path reduction) + if ($v_list_dir[$i] == '') { + $i++; + continue; + } + if ($v_list_path[$j] == '') { + $j++; + continue; + } + + // ----- Compare the items + if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ($v_list_path[$j] != '')) { + $v_result = 0; + } + + // ----- Next items + $i++; + $j++; + } + + // ----- Look if everything seems to be the same + if ($v_result) { + // ----- Skip all the empty items + while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) { + $j++; + } + while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) { + $i++; + } + + if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) { + // ----- There are exactly the same + $v_result = 2; + } elseif ($i < $v_list_dir_size) { + // ----- The path is shorter than the dir + $v_result = 0; + } + } + + // ----- Return + return $v_result; +} +// -------------------------------------------------------------------------------- + +// -------------------------------------------------------------------------------- +// Function : PclZipUtilCopyBlock() +// Description : +// Parameters : +// $p_mode : read/write compression mode +// 0 : src & dest normal +// 1 : src gzip, dest normal +// 2 : src normal, dest gzip +// 3 : src & dest gzip +// Return Values : +// -------------------------------------------------------------------------------- +function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode = 0) +{ + $v_result = 1; + + if ($p_mode==0) { + while ($p_size != 0) { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_src, $v_read_size); + @fwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } elseif ($p_mode==1) { + while ($p_size != 0) { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($p_src, $v_read_size); + @fwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } elseif ($p_mode==2) { + while ($p_size != 0) { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_src, $v_read_size); + @gzwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } elseif ($p_mode==3) { + while ($p_size != 0) { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($p_src, $v_read_size); + @gzwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + + // ----- Return + return $v_result; +} +// -------------------------------------------------------------------------------- + +// -------------------------------------------------------------------------------- +// Function : PclZipUtilRename() +// Description : +// This function tries to do a simple rename() function. If it fails, it +// tries to copy the $p_src file in a new $p_dest file and then unlink the +// first one. +// Parameters : +// $p_src : Old filename +// $p_dest : New filename +// Return Values : +// 1 on success, 0 on failure. +// -------------------------------------------------------------------------------- +function PclZipUtilRename($p_src, $p_dest) +{ + $v_result = 1; + + // ----- Try to rename the files + if (!@rename($p_src, $p_dest)) { + // ----- Try to copy & unlink the src + if (!@copy($p_src, $p_dest)) { + $v_result = 0; + } elseif (!@unlink($p_src)) { + $v_result = 0; + } + } + + // ----- Return + return $v_result; +} +// -------------------------------------------------------------------------------- + +// -------------------------------------------------------------------------------- +// Function : PclZipUtilOptionText() +// Description : +// Translate option value in text. Mainly for debug purpose. +// Parameters : +// $p_option : the option value. +// Return Values : +// The option text value. +// -------------------------------------------------------------------------------- +function PclZipUtilOptionText($p_option) +{ + $v_list = get_defined_constants(); + for (reset($v_list); $v_key = key($v_list); next($v_list)) { + $v_prefix = substr($v_key, 0, 10); + if ((($v_prefix == 'PCLZIP_OPT') || ($v_prefix == 'PCLZIP_CB_') || ($v_prefix == 'PCLZIP_ATT')) && ($v_list[$v_key] == $p_option)) { + return $v_key; + } + } + + $v_result = 'Unknown'; + + return $v_result; +} +// -------------------------------------------------------------------------------- + +// -------------------------------------------------------------------------------- +// Function : PclZipUtilTranslateWinPath() +// Description : +// Translate windows path by replacing '\' by '/' and optionally removing +// drive letter. +// Parameters : +// $p_path : path to translate. +// $p_remove_disk_letter : true | false +// Return Values : +// The path translated. +// -------------------------------------------------------------------------------- +function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter = true) +{ + if (stristr(php_uname(), 'windows')) { + // ----- Look for potential disk letter + if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) { + $p_path = substr($p_path, $v_position+1); + } + // ----- Change potential windows directory separator + if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0, 1) == '\\')) { + $p_path = strtr($p_path, '\\', '/'); + } + } + return $p_path; +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/PCLZip/readme.txt b/application/third_party/PHPExcel/PHPExcel/Shared/PCLZip/readme.txt new file mode 100644 index 0000000..6ed8839 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/PCLZip/readme.txt @@ -0,0 +1,421 @@ +// -------------------------------------------------------------------------------- +// PclZip 2.8.2 - readme.txt +// -------------------------------------------------------------------------------- +// License GNU/LGPL - August 2009 +// Vincent Blavet - vincent@phpconcept.net +// http://www.phpconcept.net +// -------------------------------------------------------------------------------- +// $Id: readme.txt,v 1.60 2009/09/30 20:35:21 vblavet Exp $ +// -------------------------------------------------------------------------------- + + + +0 - Sommaire +============ + 1 - Introduction + 2 - What's new + 3 - Corrected bugs + 4 - Known bugs or limitations + 5 - License + 6 - Warning + 7 - Documentation + 8 - Author + 9 - Contribute + +1 - Introduction +================ + + PclZip is a library that allow you to manage a Zip archive. + + Full documentation about PclZip can be found here : http://www.phpconcept.net/pclzip + +2 - What's new +============== + + Version 2.8.2 : + - PCLZIP_CB_PRE_EXTRACT and PCLZIP_CB_POST_EXTRACT are now supported with + extraction as a string (PCLZIP_OPT_EXTRACT_AS_STRING). The string + can also be modified in the post-extract call back. + **Bugs correction : + - PCLZIP_OPT_REMOVE_ALL_PATH was not working correctly + - Remove use of eval() and do direct call to callback functions + - Correct support of 64bits systems (Thanks to WordPress team) + + Version 2.8.1 : + - Move option PCLZIP_OPT_BY_EREG to PCLZIP_OPT_BY_PREG because ereg() is + deprecated in PHP 5.3. When using option PCLZIP_OPT_BY_EREG, PclZip will + automatically replace it by PCLZIP_OPT_BY_PREG. + + Version 2.8 : + - Improve extraction of zip archive for large files by using temporary files + This feature is working like the one defined in r2.7. + Options are renamed : PCLZIP_OPT_TEMP_FILE_ON, PCLZIP_OPT_TEMP_FILE_OFF, + PCLZIP_OPT_TEMP_FILE_THRESHOLD + - Add a ratio constant PCLZIP_TEMPORARY_FILE_RATIO to configure the auto + sense of temporary file use. + - Bug correction : Reduce filepath in returned file list to remove ennoying + './/' preambule in file path. + + Version 2.7 : + - Improve creation of zip archive for large files : + PclZip will now autosense the configured memory and use temporary files + when large file is suspected. + This feature can also ne triggered by manual options in create() and add() + methods. 'PCLZIP_OPT_ADD_TEMP_FILE_ON' force the use of temporary files, + 'PCLZIP_OPT_ADD_TEMP_FILE_OFF' disable the autosense technic, + 'PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD' allow for configuration of a size + threshold to use temporary files. + Using "temporary files" rather than "memory" might take more time, but + might give the ability to zip very large files : + Tested on my win laptop with a 88Mo file : + Zip "in-memory" : 18sec (max_execution_time=30, memory_limit=180Mo) + Zip "tmporary-files" : 23sec (max_execution_time=30, memory_limit=30Mo) + - Replace use of mktime() by time() to limit the E_STRICT error messages. + - Bug correction : When adding files with full windows path (drive letter) + PclZip is now working. Before, if the drive letter is not the default + path, PclZip was not able to add the file. + + Version 2.6 : + - Code optimisation + - New attributes PCLZIP_ATT_FILE_COMMENT gives the ability to + add a comment for a specific file. (Don't really know if this is usefull) + - New attribute PCLZIP_ATT_FILE_CONTENT gives the ability to add a string + as a file. + - New attribute PCLZIP_ATT_FILE_MTIME modify the timestamp associated with + a file. + - Correct a bug. Files archived with a timestamp with 0h0m0s were extracted + with current time + - Add CRC value in the informations returned back for each file after an + action. + - Add missing closedir() statement. + - When adding a folder, and removing the path of this folder, files were + incorrectly added with a '/' at the beginning. Which means files are + related to root in unix systems. Corrected. + - Add conditional if before constant definition. This will allow users + to redefine constants without changing the file, and then improve + upgrade of pclzip code for new versions. + + Version 2.5 : + - Introduce the ability to add file/folder with individual properties (file descriptor). + This gives for example the ability to change the filename of a zipped file. + . Able to add files individually + . Able to change full name + . Able to change short name + . Compatible with global options + - New attributes : PCLZIP_ATT_FILE_NAME, PCLZIP_ATT_FILE_NEW_SHORT_NAME, PCLZIP_ATT_FILE_NEW_FULL_NAME + - New error code : PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE + - Add a security control feature. PclZip can extract any file in any folder + of a system. People may use this to upload a zip file and try to override + a system file. The PCLZIP_OPT_EXTRACT_DIR_RESTRICTION will give the + ability to forgive any directory transversal behavior. + - New PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : check extraction path + - New error code : PCLZIP_ERR_DIRECTORY_RESTRICTION + - Modification in PclZipUtilPathInclusion() : dir and path beginning with ./ will be prepend + by current path (getcwd()) + + Version 2.4 : + - Code improvment : try to speed up the code by removing unusefull call to pack() + - Correct bug in delete() : delete() should be called with no argument. This was not + the case in 2.3. This is corrected in 2.4. + - Correct a bug in path_inclusion function. When the path has several '../../', the + result was bad. + - Add a check for magic_quotes_runtime configuration. If enabled, PclZip will + disable it while working and det it back to its original value. + This resolve a lots of bad formated archive errors. + - Bug correction : PclZip now correctly unzip file in some specific situation, + when compressed content has same size as uncompressed content. + - Bug correction : When selecting option 'PCLZIP_OPT_REMOVE_ALL_PATH', + directories are not any more created. + - Code improvment : correct unclosed opendir(), better handling of . and .. in + loops. + + + Version 2.3 : + - Correct a bug with PHP5 : affecting the value 0xFE49FFE0 to a variable does not + give the same result in PHP4 and PHP5 .... + + Version 2.2 : + - Try development of PCLZIP_OPT_CRYPT ..... + However this becomes to a stop. To crypt/decrypt I need to multiply 2 long integers, + the result (greater than a long) is not supported by PHP. Even the use of bcmath + functions does not help. I did not find yet a solution ...; + - Add missing '/' at end of directory entries + - Check is a file is encrypted or not. Returns status 'unsupported_encryption' and/or + error code PCLZIP_ERR_UNSUPPORTED_ENCRYPTION. + - Corrected : Bad "version need to extract" field in local file header + - Add private method privCheckFileHeaders() in order to check local and central + file headers. PclZip is now supporting purpose bit flag bit 3. Purpose bit flag bit 3 gives + the ability to have a local file header without size, compressed size and crc filled. + - Add a generic status 'error' for file status + - Add control of compression type. PclZip only support deflate compression method. + Before v2.2, PclZip does not check the compression method used in an archive while + extracting. With v2.2 PclZip returns a new error status for a file using an unsupported + compression method. New status is "unsupported_compression". New error code is + PCLZIP_ERR_UNSUPPORTED_COMPRESSION. + - Add optional attribute PCLZIP_OPT_STOP_ON_ERROR. This will stop the extract of files + when errors like 'a folder with same name exists' or 'a newer file exists' or + 'a write protected file' exists, rather than set a status for the concerning file + and resume the extract of the zip. + - Add optional attribute PCLZIP_OPT_REPLACE_NEWER. This will force, during an extract' the + replacement of the file, even if a newer version of the file exists. + Note that today if a file with the same name already exists but is older it will be + replaced by the extracted one. + - Improve PclZipUtilOption() + - Support of zip archive with trailing bytes. Before 2.2, PclZip checks that the central + directory structure is the last data in the archive. Crypt encryption/decryption of + zip archive put trailing 0 bytes after decryption. PclZip is now supporting this. + + Version 2.1 : + - Add the ability to abort the extraction by using a user callback function. + The user can now return the value '2' in its callback which indicates to stop the + extraction. For a pre call-back extract is stopped before the extration of the current + file. For a post call back, the extraction is stopped after. + - Add the ability to extract a file (or several files) directly in the standard output. + This is done by the new parameter PCLZIP_OPT_EXTRACT_IN_OUTPUT with method extract(). + - Add support for parameters PCLZIP_OPT_COMMENT, PCLZIP_OPT_ADD_COMMENT, + PCLZIP_OPT_PREPEND_COMMENT. This will create, replace, add, or prepend comments + in the zip archive. + - When merging two archives, the comments are not any more lost, but merged, with a + blank space separator. + - Corrected bug : Files are not deleted when all files are asked to be deleted. + - Corrected bug : Folders with name '0' made PclZip to abort the create or add feature. + + + Version 2.0 : + ***** Warning : Some new features may break the backward compatibility for your scripts. + Please carefully read the readme file. + - Add the ability to delete by Index, name and regular expression. This feature is + performed by the method delete(), which uses the optional parameters + PCLZIP_OPT_BY_INDEX, PCLZIP_OPT_BY_NAME, PCLZIP_OPT_BY_EREG or PCLZIP_OPT_BY_PREG. + - Add the ability to extract by regular expression. To extract by regexp you must use the method + extract(), with the option PCLZIP_OPT_BY_EREG or PCLZIP_OPT_BY_PREG + (depending if you want to use ereg() or preg_match() syntax) followed by the + regular expression pattern. + - Add the ability to extract by index, directly with the extract() method. This is a + code improvment of the extractByIndex() method. + - Add the ability to extract by name. To extract by name you must use the method + extract(), with the option PCLZIP_OPT_BY_NAME followed by the filename to + extract or an array of filenames to extract. To extract all a folder, use the folder + name rather than the filename with a '/' at the end. + - Add the ability to add files without compression. This is done with a new attribute + which is PCLZIP_OPT_NO_COMPRESSION. + - Add the attribute PCLZIP_OPT_EXTRACT_AS_STRING, which allow to extract a file directly + in a string without using any file (or temporary file). + - Add constant PCLZIP_SEPARATOR for static configuration of filename separators in a single string. + The default separator is now a comma (,) and not any more a blank space. + THIS BREAK THE BACKWARD COMPATIBILITY : Please check if this may have an impact with + your script. + - Improve algorythm performance by removing the use of temporary files when adding or + extracting files in an archive. + - Add (correct) detection of empty filename zipping. This can occurs when the removed + path is the same + as a zipped dir. The dir is not zipped (['status'] = filtered), only its content. + - Add better support for windows paths (thanks for help from manus@manusfreedom.com). + - Corrected bug : When the archive file already exists with size=0, the add() method + fails. Corrected in 2.0. + - Remove the use of OS_WINDOWS constant. Use php_uname() function rather. + - Control the order of index ranges in extract by index feature. + - Change the internal management of folders (better handling of internal flag). + + + Version 1.3 : + - Removing the double include check. This is now done by include_once() and require_once() + PHP directives. + - Changing the error handling mecanism : Remove the use of an external error library. + The former PclError...() functions are replaced by internal equivalent methods. + By changing the environment variable PCLZIP_ERROR_EXTERNAL you can still use the former library. + Introducing the use of constants for error codes rather than integer values. This will help + in futur improvment. + Introduction of error handling functions like errorCode(), errorName() and errorInfo(). + - Remove the deprecated use of calling function with arguments passed by reference. + - Add the calling of extract(), extractByIndex(), create() and add() functions + with variable options rather than fixed arguments. + - Add the ability to remove all the file path while extracting or adding, + without any need to specify the path to remove. + This is available for extract(), extractByIndex(), create() and add() functionS by using + the new variable options parameters : + - PCLZIP_OPT_REMOVE_ALL_PATH : by indicating this option while calling the fct. + - Ability to change the mode of a file after the extraction (chmod()). + This is available for extract() and extractByIndex() functionS by using + the new variable options parameters. + - PCLZIP_OPT_SET_CHMOD : by setting the value of this option. + - Ability to definition call-back options. These call-back will be called during the adding, + or the extracting of file (extract(), extractByIndex(), create() and add() functions) : + - PCLZIP_CB_PRE_EXTRACT : will be called before each extraction of a file. The user + can trigerred the change the filename of the extracted file. The user can triggered the + skip of the extraction. This is adding a 'skipped' status in the file list result value. + - PCLZIP_CB_POST_EXTRACT : will be called after each extraction of a file. + Nothing can be triggered from that point. + - PCLZIP_CB_PRE_ADD : will be called before each add of a file. The user + can trigerred the change the stored filename of the added file. The user can triggered the + skip of the add. This is adding a 'skipped' status in the file list result value. + - PCLZIP_CB_POST_ADD : will be called after each add of a file. + Nothing can be triggered from that point. + - Two status are added in the file list returned as function result : skipped & filename_too_long + 'skipped' is used when a call-back function ask for skipping the file. + 'filename_too_long' is used while adding a file with a too long filename to archive (the file is + not added) + - Adding the function PclZipUtilPathInclusion(), that check the inclusion of a path into + a directory. + - Add a check of the presence of the archive file before some actions (like list, ...) + - Add the initialisation of field "index" in header array. This means that by + default index will be -1 when not explicitly set by the methods. + + Version 1.2 : + - Adding a duplicate function. + - Adding a merge function. The merge function is a "quick merge" function, + it just append the content of an archive at the end of the first one. There + is no check for duplicate files or more recent files. + - Improve the search of the central directory end. + + Version 1.1.2 : + + - Changing the license of PclZip. PclZip is now released under the GNU / LGPL license + (see License section). + - Adding the optional support of a static temporary directory. You will need to configure + the constant PCLZIP_TEMPORARY_DIR if you want to use this feature. + - Improving the rename() function. In some cases rename() does not work (different + Filesystems), so it will be replaced by a copy() + unlink() functions. + + Version 1.1.1 : + + - Maintenance release, no new feature. + + Version 1.1 : + + - New method Add() : adding files in the archive + - New method ExtractByIndex() : partial extract of the archive, files are identified by + their index in the archive + - New method DeleteByIndex() : delete some files/folder entries from the archive, + files are identified by their index in the archive. + - Adding a test of the zlib extension presence. If not present abort the script. + + Version 1.0.1 : + + - No new feature + + +3 - Corrected bugs +================== + + Corrected in Version 2.0 : + - Corrected : During an extraction, if a call-back fucntion is used and try to skip + a file, all the extraction process is stopped. + + Corrected in Version 1.3 : + - Corrected : Support of static synopsis for method extract() is broken. + - Corrected : invalid size of archive content field (0xFF) should be (0xFFFF). + - Corrected : When an extract is done with a remove_path parameter, the entry for + the directory with exactly the same path is not skipped/filtered. + - Corrected : extractByIndex() and deleteByIndex() were not managing index in the + right way. For example indexes '1,3-5,11' will only extract files 1 and 11. This + is due to a sort of the index resulting table that puts 11 before 3-5 (sort on + string and not interger). The sort is temporarilly removed, this means that + you must provide a sorted list of index ranges. + + Corrected in Version 1.2 : + + - Nothing. + + Corrected in Version 1.1.2 : + + - Corrected : Winzip is unable to delete or add new files in a PclZip created archives. + + Corrected in Version 1.1.1 : + + - Corrected : When archived file is not compressed (0% compression), the + extract method fails. + + Corrected in Version 1.1 : + + - Corrected : Adding a complete tree of folder may result in a bad archive + creation. + + Corrected in Version 1.0.1 : + + - Corrected : Error while compressing files greater than PCLZIP_READ_BLOCK_SIZE (default=1024). + + +4 - Known bugs or limitations +============================= + + Please publish bugs reports in SourceForge : + http://sourceforge.net/tracker/?group_id=40254&atid=427564 + + In Version 2.x : + - PclZip does only support file uncompressed or compressed with deflate (compression method 8) + - PclZip does not support password protected zip archive + - Some concern were seen when changing mtime of a file while archiving. + Seems to be linked to Daylight Saving Time (PclTest_changing_mtime). + + In Version 1.2 : + + - merge() methods does not check for duplicate files or last date of modifications. + + In Version 1.1 : + + - Limitation : Using 'extract' fields in the file header in the zip archive is not supported. + - WinZip is unable to delete a single file in a PclZip created archive. It is also unable to + add a file in a PclZip created archive. (Corrected in v.1.2) + + In Version 1.0.1 : + + - Adding a complete tree of folder may result in a bad archive + creation. (Corrected in V.1.1). + - Path given to methods must be in the unix format (/) and not the Windows format (\). + Workaround : Use only / directory separators. + - PclZip is using temporary files that are sometime the name of the file with a .tmp or .gz + added suffix. Files with these names may already exist and may be overwritten. + Workaround : none. + - PclZip does not check if the zlib extension is present. If it is absent, the zip + file is not created and the lib abort without warning. + Workaround : enable the zlib extension on the php install + + In Version 1.0 : + + - Error while compressing files greater than PCLZIP_READ_BLOCK_SIZE (default=1024). + (Corrected in v.1.0.1) + - Limitation : Multi-disk zip archive are not supported. + + +5 - License +=========== + + Since version 1.1.2, PclZip Library is released under GNU/LGPL license. + This library is free, so you can use it at no cost. + + HOWEVER, if you release a script, an application, a library or any kind of + code using PclZip library (or a part of it), YOU MUST : + - Indicate in the documentation (or a readme file), that your work + uses PclZip Library, and make a reference to the author and the web site + http://www.phpconcept.net + - Gives the ability to the final user to update the PclZip libary. + + I will also appreciate that you send me a mail (vincent@phpconcept.net), just to + be aware that someone is using PclZip. + + For more information about GNU/LGPL license : http://www.gnu.org + +6 - Warning +================= + + This library and the associated files are non commercial, non professional work. + It should not have unexpected results. However if any damage is caused by this software + the author can not be responsible. + The use of this software is at the risk of the user. + +7 - Documentation +================= + PclZip User Manuel is available in English on PhpConcept : http://www.phpconcept.net/pclzip/man/en/index.php + A Russian translation was done by Feskov Kuzma : http://php.russofile.ru/ru/authors/unsort/zip/ + +8 - Author +========== + + This software was written by Vincent Blavet (vincent@phpconcept.net) on its leasure time. + +9 - Contribute +============== + If you want to contribute to the development of PclZip, please contact vincent@phpconcept.net. + If you can help in financing PhpConcept hosting service, please go to + http://www.phpconcept.net/soutien.php diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/PasswordHasher.php b/application/third_party/PHPExcel/PHPExcel/Shared/PasswordHasher.php new file mode 100644 index 0000000..946742b --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/PasswordHasher.php @@ -0,0 +1,67 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ + + +/** + * PHPExcel_Shared_PasswordHasher + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_PasswordHasher +{ + /** + * Create a password hash from a given string. + * + * This method is based on the algorithm provided by + * Daniel Rentz of OpenOffice and the PEAR package + * Spreadsheet_Excel_Writer by Xavier Noguer <xnoguer@rezebra.com>. + * + * @param string $pPassword Password to hash + * @return string Hashed password + */ + public static function hashPassword($pPassword = '') + { + $password = 0x0000; + $charPos = 1; // char position + + // split the plain text password in its component characters + $chars = preg_split('//', $pPassword, -1, PREG_SPLIT_NO_EMPTY); + foreach ($chars as $char) { + $value = ord($char) << $charPos++; // shifted ASCII value + $rotated_bits = $value >> 15; // rotated bits beyond bit 15 + $value &= 0x7fff; // first 15 bits + $password ^= ($value | $rotated_bits); + } + + $password ^= strlen($pPassword); + $password ^= 0xCE4B; + + return(strtoupper(dechex($password))); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/String.php b/application/third_party/PHPExcel/PHPExcel/Shared/String.php new file mode 100644 index 0000000..fa1a64e --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/String.php @@ -0,0 +1,819 @@ +<?php + +/** + * PHPExcel_Shared_String + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Shared_String +{ + /** Constants */ + /** Regular Expressions */ + // Fraction + const STRING_REGEXP_FRACTION = '(-?)(\d+)\s+(\d+\/\d+)'; + + + /** + * Control characters array + * + * @var string[] + */ + private static $controlCharacters = array(); + + /** + * SYLK Characters array + * + * $var array + */ + private static $SYLKCharacters = array(); + + /** + * Decimal separator + * + * @var string + */ + private static $decimalSeparator; + + /** + * Thousands separator + * + * @var string + */ + private static $thousandsSeparator; + + /** + * Currency code + * + * @var string + */ + private static $currencyCode; + + /** + * Is mbstring extension avalable? + * + * @var boolean + */ + private static $isMbstringEnabled; + + /** + * Is iconv extension avalable? + * + * @var boolean + */ + private static $isIconvEnabled; + + /** + * Build control characters array + */ + private static function buildControlCharacters() + { + for ($i = 0; $i <= 31; ++$i) { + if ($i != 9 && $i != 10 && $i != 13) { + $find = '_x' . sprintf('%04s', strtoupper(dechex($i))) . '_'; + $replace = chr($i); + self::$controlCharacters[$find] = $replace; + } + } + } + + /** + * Build SYLK characters array + */ + private static function buildSYLKCharacters() + { + self::$SYLKCharacters = array( + "\x1B 0" => chr(0), + "\x1B 1" => chr(1), + "\x1B 2" => chr(2), + "\x1B 3" => chr(3), + "\x1B 4" => chr(4), + "\x1B 5" => chr(5), + "\x1B 6" => chr(6), + "\x1B 7" => chr(7), + "\x1B 8" => chr(8), + "\x1B 9" => chr(9), + "\x1B :" => chr(10), + "\x1B ;" => chr(11), + "\x1B <" => chr(12), + "\x1B :" => chr(13), + "\x1B >" => chr(14), + "\x1B ?" => chr(15), + "\x1B!0" => chr(16), + "\x1B!1" => chr(17), + "\x1B!2" => chr(18), + "\x1B!3" => chr(19), + "\x1B!4" => chr(20), + "\x1B!5" => chr(21), + "\x1B!6" => chr(22), + "\x1B!7" => chr(23), + "\x1B!8" => chr(24), + "\x1B!9" => chr(25), + "\x1B!:" => chr(26), + "\x1B!;" => chr(27), + "\x1B!<" => chr(28), + "\x1B!=" => chr(29), + "\x1B!>" => chr(30), + "\x1B!?" => chr(31), + "\x1B'?" => chr(127), + "\x1B(0" => '€', // 128 in CP1252 + "\x1B(2" => '‚', // 130 in CP1252 + "\x1B(3" => 'ƒ', // 131 in CP1252 + "\x1B(4" => '„', // 132 in CP1252 + "\x1B(5" => '…', // 133 in CP1252 + "\x1B(6" => '†', // 134 in CP1252 + "\x1B(7" => '‡', // 135 in CP1252 + "\x1B(8" => 'ˆ', // 136 in CP1252 + "\x1B(9" => '‰', // 137 in CP1252 + "\x1B(:" => 'Š', // 138 in CP1252 + "\x1B(;" => '‹', // 139 in CP1252 + "\x1BNj" => 'Œ', // 140 in CP1252 + "\x1B(>" => 'Ž', // 142 in CP1252 + "\x1B)1" => '‘', // 145 in CP1252 + "\x1B)2" => '’', // 146 in CP1252 + "\x1B)3" => '“', // 147 in CP1252 + "\x1B)4" => '”', // 148 in CP1252 + "\x1B)5" => '•', // 149 in CP1252 + "\x1B)6" => '–', // 150 in CP1252 + "\x1B)7" => '—', // 151 in CP1252 + "\x1B)8" => '˜', // 152 in CP1252 + "\x1B)9" => '™', // 153 in CP1252 + "\x1B):" => 'š', // 154 in CP1252 + "\x1B);" => '›', // 155 in CP1252 + "\x1BNz" => 'œ', // 156 in CP1252 + "\x1B)>" => 'ž', // 158 in CP1252 + "\x1B)?" => 'Ÿ', // 159 in CP1252 + "\x1B*0" => ' ', // 160 in CP1252 + "\x1BN!" => '¡', // 161 in CP1252 + "\x1BN\"" => '¢', // 162 in CP1252 + "\x1BN#" => '£', // 163 in CP1252 + "\x1BN(" => '¤', // 164 in CP1252 + "\x1BN%" => '¥', // 165 in CP1252 + "\x1B*6" => '¦', // 166 in CP1252 + "\x1BN'" => '§', // 167 in CP1252 + "\x1BNH " => '¨', // 168 in CP1252 + "\x1BNS" => '©', // 169 in CP1252 + "\x1BNc" => 'ª', // 170 in CP1252 + "\x1BN+" => '«', // 171 in CP1252 + "\x1B*<" => '¬', // 172 in CP1252 + "\x1B*=" => '­', // 173 in CP1252 + "\x1BNR" => '®', // 174 in CP1252 + "\x1B*?" => '¯', // 175 in CP1252 + "\x1BN0" => '°', // 176 in CP1252 + "\x1BN1" => '±', // 177 in CP1252 + "\x1BN2" => '²', // 178 in CP1252 + "\x1BN3" => '³', // 179 in CP1252 + "\x1BNB " => '´', // 180 in CP1252 + "\x1BN5" => 'µ', // 181 in CP1252 + "\x1BN6" => '¶', // 182 in CP1252 + "\x1BN7" => '·', // 183 in CP1252 + "\x1B+8" => '¸', // 184 in CP1252 + "\x1BNQ" => '¹', // 185 in CP1252 + "\x1BNk" => 'º', // 186 in CP1252 + "\x1BN;" => '»', // 187 in CP1252 + "\x1BN<" => '¼', // 188 in CP1252 + "\x1BN=" => '½', // 189 in CP1252 + "\x1BN>" => '¾', // 190 in CP1252 + "\x1BN?" => '¿', // 191 in CP1252 + "\x1BNAA" => 'À', // 192 in CP1252 + "\x1BNBA" => 'Á', // 193 in CP1252 + "\x1BNCA" => 'Â', // 194 in CP1252 + "\x1BNDA" => 'Ã', // 195 in CP1252 + "\x1BNHA" => 'Ä', // 196 in CP1252 + "\x1BNJA" => 'Å', // 197 in CP1252 + "\x1BNa" => 'Æ', // 198 in CP1252 + "\x1BNKC" => 'Ç', // 199 in CP1252 + "\x1BNAE" => 'È', // 200 in CP1252 + "\x1BNBE" => 'É', // 201 in CP1252 + "\x1BNCE" => 'Ê', // 202 in CP1252 + "\x1BNHE" => 'Ë', // 203 in CP1252 + "\x1BNAI" => 'Ì', // 204 in CP1252 + "\x1BNBI" => 'Í', // 205 in CP1252 + "\x1BNCI" => 'Î', // 206 in CP1252 + "\x1BNHI" => 'Ï', // 207 in CP1252 + "\x1BNb" => 'Ð', // 208 in CP1252 + "\x1BNDN" => 'Ñ', // 209 in CP1252 + "\x1BNAO" => 'Ò', // 210 in CP1252 + "\x1BNBO" => 'Ó', // 211 in CP1252 + "\x1BNCO" => 'Ô', // 212 in CP1252 + "\x1BNDO" => 'Õ', // 213 in CP1252 + "\x1BNHO" => 'Ö', // 214 in CP1252 + "\x1B-7" => '×', // 215 in CP1252 + "\x1BNi" => 'Ø', // 216 in CP1252 + "\x1BNAU" => 'Ù', // 217 in CP1252 + "\x1BNBU" => 'Ú', // 218 in CP1252 + "\x1BNCU" => 'Û', // 219 in CP1252 + "\x1BNHU" => 'Ü', // 220 in CP1252 + "\x1B-=" => 'Ý', // 221 in CP1252 + "\x1BNl" => 'Þ', // 222 in CP1252 + "\x1BN{" => 'ß', // 223 in CP1252 + "\x1BNAa" => 'à', // 224 in CP1252 + "\x1BNBa" => 'á', // 225 in CP1252 + "\x1BNCa" => 'â', // 226 in CP1252 + "\x1BNDa" => 'ã', // 227 in CP1252 + "\x1BNHa" => 'ä', // 228 in CP1252 + "\x1BNJa" => 'å', // 229 in CP1252 + "\x1BNq" => 'æ', // 230 in CP1252 + "\x1BNKc" => 'ç', // 231 in CP1252 + "\x1BNAe" => 'è', // 232 in CP1252 + "\x1BNBe" => 'é', // 233 in CP1252 + "\x1BNCe" => 'ê', // 234 in CP1252 + "\x1BNHe" => 'ë', // 235 in CP1252 + "\x1BNAi" => 'ì', // 236 in CP1252 + "\x1BNBi" => 'í', // 237 in CP1252 + "\x1BNCi" => 'î', // 238 in CP1252 + "\x1BNHi" => 'ï', // 239 in CP1252 + "\x1BNs" => 'ð', // 240 in CP1252 + "\x1BNDn" => 'ñ', // 241 in CP1252 + "\x1BNAo" => 'ò', // 242 in CP1252 + "\x1BNBo" => 'ó', // 243 in CP1252 + "\x1BNCo" => 'ô', // 244 in CP1252 + "\x1BNDo" => 'õ', // 245 in CP1252 + "\x1BNHo" => 'ö', // 246 in CP1252 + "\x1B/7" => '÷', // 247 in CP1252 + "\x1BNy" => 'ø', // 248 in CP1252 + "\x1BNAu" => 'ù', // 249 in CP1252 + "\x1BNBu" => 'ú', // 250 in CP1252 + "\x1BNCu" => 'û', // 251 in CP1252 + "\x1BNHu" => 'ü', // 252 in CP1252 + "\x1B/=" => 'ý', // 253 in CP1252 + "\x1BN|" => 'þ', // 254 in CP1252 + "\x1BNHy" => 'ÿ', // 255 in CP1252 + ); + } + + /** + * Get whether mbstring extension is available + * + * @return boolean + */ + public static function getIsMbstringEnabled() + { + if (isset(self::$isMbstringEnabled)) { + return self::$isMbstringEnabled; + } + + self::$isMbstringEnabled = function_exists('mb_convert_encoding') ? + true : false; + + return self::$isMbstringEnabled; + } + + /** + * Get whether iconv extension is available + * + * @return boolean + */ + public static function getIsIconvEnabled() + { + if (isset(self::$isIconvEnabled)) { + return self::$isIconvEnabled; + } + + // Fail if iconv doesn't exist + if (!function_exists('iconv')) { + self::$isIconvEnabled = false; + return false; + } + + // Sometimes iconv is not working, and e.g. iconv('UTF-8', 'UTF-16LE', 'x') just returns false, + if (!@iconv('UTF-8', 'UTF-16LE', 'x')) { + self::$isIconvEnabled = false; + return false; + } + + // Sometimes iconv_substr('A', 0, 1, 'UTF-8') just returns false in PHP 5.2.0 + // we cannot use iconv in that case either (http://bugs.php.net/bug.php?id=37773) + if (!@iconv_substr('A', 0, 1, 'UTF-8')) { + self::$isIconvEnabled = false; + return false; + } + + // CUSTOM: IBM AIX iconv() does not work + if (defined('PHP_OS') && @stristr(PHP_OS, 'AIX') && defined('ICONV_IMPL') && (@strcasecmp(ICONV_IMPL, 'unknown') == 0) && defined('ICONV_VERSION') && (@strcasecmp(ICONV_VERSION, 'unknown') == 0)) { + self::$isIconvEnabled = false; + return false; + } + + // If we reach here no problems were detected with iconv + self::$isIconvEnabled = true; + return true; + } + + public static function buildCharacterSets() + { + if (empty(self::$controlCharacters)) { + self::buildControlCharacters(); + } + if (empty(self::$SYLKCharacters)) { + self::buildSYLKCharacters(); + } + } + + /** + * Convert from OpenXML escaped control character to PHP control character + * + * Excel 2007 team: + * ---------------- + * That's correct, control characters are stored directly in the shared-strings table. + * We do encode characters that cannot be represented in XML using the following escape sequence: + * _xHHHH_ where H represents a hexadecimal character in the character's value... + * So you could end up with something like _x0008_ in a string (either in a cell value (<v>) + * element or in the shared string <t> element. + * + * @param string $value Value to unescape + * @return string + */ + public static function ControlCharacterOOXML2PHP($value = '') + { + return str_replace(array_keys(self::$controlCharacters), array_values(self::$controlCharacters), $value); + } + + /** + * Convert from PHP control character to OpenXML escaped control character + * + * Excel 2007 team: + * ---------------- + * That's correct, control characters are stored directly in the shared-strings table. + * We do encode characters that cannot be represented in XML using the following escape sequence: + * _xHHHH_ where H represents a hexadecimal character in the character's value... + * So you could end up with something like _x0008_ in a string (either in a cell value (<v>) + * element or in the shared string <t> element. + * + * @param string $value Value to escape + * @return string + */ + public static function ControlCharacterPHP2OOXML($value = '') + { + return str_replace(array_values(self::$controlCharacters), array_keys(self::$controlCharacters), $value); + } + + /** + * Try to sanitize UTF8, stripping invalid byte sequences. Not perfect. Does not surrogate characters. + * + * @param string $value + * @return string + */ + public static function SanitizeUTF8($value) + { + if (self::getIsIconvEnabled()) { + $value = @iconv('UTF-8', 'UTF-8', $value); + return $value; + } + + if (self::getIsMbstringEnabled()) { + $value = mb_convert_encoding($value, 'UTF-8', 'UTF-8'); + return $value; + } + + // else, no conversion + return $value; + } + + /** + * Check if a string contains UTF8 data + * + * @param string $value + * @return boolean + */ + public static function IsUTF8($value = '') + { + return $value === '' || preg_match('/^./su', $value) === 1; + } + + /** + * Formats a numeric value as a string for output in various output writers forcing + * point as decimal separator in case locale is other than English. + * + * @param mixed $value + * @return string + */ + public static function FormatNumber($value) + { + if (is_float($value)) { + return str_replace(',', '.', $value); + } + return (string) $value; + } + + /** + * Converts a UTF-8 string into BIFF8 Unicode string data (8-bit string length) + * Writes the string using uncompressed notation, no rich text, no Asian phonetics + * If mbstring extension is not available, ASCII is assumed, and compressed notation is used + * although this will give wrong results for non-ASCII strings + * see OpenOffice.org's Documentation of the Microsoft Excel File Format, sect. 2.5.3 + * + * @param string $value UTF-8 encoded string + * @param mixed[] $arrcRuns Details of rich text runs in $value + * @return string + */ + public static function UTF8toBIFF8UnicodeShort($value, $arrcRuns = array()) + { + // character count + $ln = self::CountCharacters($value, 'UTF-8'); + // option flags + if (empty($arrcRuns)) { + $opt = (self::getIsIconvEnabled() || self::getIsMbstringEnabled()) ? + 0x0001 : 0x0000; + $data = pack('CC', $ln, $opt); + // characters + $data .= self::ConvertEncoding($value, 'UTF-16LE', 'UTF-8'); + } else { + $data = pack('vC', $ln, 0x09); + $data .= pack('v', count($arrcRuns)); + // characters + $data .= self::ConvertEncoding($value, 'UTF-16LE', 'UTF-8'); + foreach ($arrcRuns as $cRun) { + $data .= pack('v', $cRun['strlen']); + $data .= pack('v', $cRun['fontidx']); + } + } + return $data; + } + + /** + * Converts a UTF-8 string into BIFF8 Unicode string data (16-bit string length) + * Writes the string using uncompressed notation, no rich text, no Asian phonetics + * If mbstring extension is not available, ASCII is assumed, and compressed notation is used + * although this will give wrong results for non-ASCII strings + * see OpenOffice.org's Documentation of the Microsoft Excel File Format, sect. 2.5.3 + * + * @param string $value UTF-8 encoded string + * @return string + */ + public static function UTF8toBIFF8UnicodeLong($value) + { + // character count + $ln = self::CountCharacters($value, 'UTF-8'); + + // option flags + $opt = (self::getIsIconvEnabled() || self::getIsMbstringEnabled()) ? + 0x0001 : 0x0000; + + // characters + $chars = self::ConvertEncoding($value, 'UTF-16LE', 'UTF-8'); + + $data = pack('vC', $ln, $opt) . $chars; + return $data; + } + + /** + * Convert string from one encoding to another. First try mbstring, then iconv, finally strlen + * + * @param string $value + * @param string $to Encoding to convert to, e.g. 'UTF-8' + * @param string $from Encoding to convert from, e.g. 'UTF-16LE' + * @return string + */ + public static function ConvertEncoding($value, $to, $from) + { + if (self::getIsIconvEnabled()) { + return iconv($from, $to, $value); + } + + if (self::getIsMbstringEnabled()) { + return mb_convert_encoding($value, $to, $from); + } + + if ($from == 'UTF-16LE') { + return self::utf16_decode($value, false); + } elseif ($from == 'UTF-16BE') { + return self::utf16_decode($value); + } + // else, no conversion + return $value; + } + + /** + * Decode UTF-16 encoded strings. + * + * Can handle both BOM'ed data and un-BOM'ed data. + * Assumes Big-Endian byte order if no BOM is available. + * This function was taken from http://php.net/manual/en/function.utf8-decode.php + * and $bom_be parameter added. + * + * @param string $str UTF-16 encoded data to decode. + * @return string UTF-8 / ISO encoded data. + * @access public + * @version 0.2 / 2010-05-13 + * @author Rasmus Andersson {@link http://rasmusandersson.se/} + * @author vadik56 + */ + public static function utf16_decode($str, $bom_be = true) + { + if (strlen($str) < 2) { + return $str; + } + $c0 = ord($str{0}); + $c1 = ord($str{1}); + if ($c0 == 0xfe && $c1 == 0xff) { + $str = substr($str, 2); + } elseif ($c0 == 0xff && $c1 == 0xfe) { + $str = substr($str, 2); + $bom_be = false; + } + $len = strlen($str); + $newstr = ''; + for ($i=0; $i<$len; $i+=2) { + if ($bom_be) { + $val = ord($str{$i}) << 4; + $val += ord($str{$i+1}); + } else { + $val = ord($str{$i+1}) << 4; + $val += ord($str{$i}); + } + $newstr .= ($val == 0x228) ? "\n" : chr($val); + } + return $newstr; + } + + /** + * Get character count. First try mbstring, then iconv, finally strlen + * + * @param string $value + * @param string $enc Encoding + * @return int Character count + */ + public static function CountCharacters($value, $enc = 'UTF-8') + { + if (self::getIsMbstringEnabled()) { + return mb_strlen($value, $enc); + } + + if (self::getIsIconvEnabled()) { + return iconv_strlen($value, $enc); + } + + // else strlen + return strlen($value); + } + + /** + * Get a substring of a UTF-8 encoded string. First try mbstring, then iconv, finally strlen + * + * @param string $pValue UTF-8 encoded string + * @param int $pStart Start offset + * @param int $pLength Maximum number of characters in substring + * @return string + */ + public static function Substring($pValue = '', $pStart = 0, $pLength = 0) + { + if (self::getIsMbstringEnabled()) { + return mb_substr($pValue, $pStart, $pLength, 'UTF-8'); + } + + if (self::getIsIconvEnabled()) { + return iconv_substr($pValue, $pStart, $pLength, 'UTF-8'); + } + + // else substr + return substr($pValue, $pStart, $pLength); + } + + /** + * Convert a UTF-8 encoded string to upper case + * + * @param string $pValue UTF-8 encoded string + * @return string + */ + public static function StrToUpper($pValue = '') + { + if (function_exists('mb_convert_case')) { + return mb_convert_case($pValue, MB_CASE_UPPER, "UTF-8"); + } + return strtoupper($pValue); + } + + /** + * Convert a UTF-8 encoded string to lower case + * + * @param string $pValue UTF-8 encoded string + * @return string + */ + public static function StrToLower($pValue = '') + { + if (function_exists('mb_convert_case')) { + return mb_convert_case($pValue, MB_CASE_LOWER, "UTF-8"); + } + return strtolower($pValue); + } + + /** + * Convert a UTF-8 encoded string to title/proper case + * (uppercase every first character in each word, lower case all other characters) + * + * @param string $pValue UTF-8 encoded string + * @return string + */ + public static function StrToTitle($pValue = '') + { + if (function_exists('mb_convert_case')) { + return mb_convert_case($pValue, MB_CASE_TITLE, "UTF-8"); + } + return ucwords($pValue); + } + + public static function mb_is_upper($char) + { + return mb_strtolower($char, "UTF-8") != $char; + } + + public static function mb_str_split($string) + { + # Split at all position not after the start: ^ + # and not before the end: $ + return preg_split('/(?<!^)(?!$)/u', $string); + } + + /** + * Reverse the case of a string, so that all uppercase characters become lowercase + * and all lowercase characters become uppercase + * + * @param string $pValue UTF-8 encoded string + * @return string + */ + public static function StrCaseReverse($pValue = '') + { + if (self::getIsMbstringEnabled()) { + $characters = self::mb_str_split($pValue); + foreach ($characters as &$character) { + if (self::mb_is_upper($character)) { + $character = mb_strtolower($character, 'UTF-8'); + } else { + $character = mb_strtoupper($character, 'UTF-8'); + } + } + return implode('', $characters); + } + return strtolower($pValue) ^ strtoupper($pValue) ^ $pValue; + } + + /** + * Identify whether a string contains a fractional numeric value, + * and convert it to a numeric if it is + * + * @param string &$operand string value to test + * @return boolean + */ + public static function convertToNumberIfFraction(&$operand) + { + if (preg_match('/^'.self::STRING_REGEXP_FRACTION.'$/i', $operand, $match)) { + $sign = ($match[1] == '-') ? '-' : '+'; + $fractionFormula = '='.$sign.$match[2].$sign.$match[3]; + $operand = PHPExcel_Calculation::getInstance()->_calculateFormulaValue($fractionFormula); + return true; + } + return false; + } // function convertToNumberIfFraction() + + /** + * Get the decimal separator. If it has not yet been set explicitly, try to obtain number + * formatting information from locale. + * + * @return string + */ + public static function getDecimalSeparator() + { + if (!isset(self::$decimalSeparator)) { + $localeconv = localeconv(); + self::$decimalSeparator = ($localeconv['decimal_point'] != '') + ? $localeconv['decimal_point'] : $localeconv['mon_decimal_point']; + + if (self::$decimalSeparator == '') { + // Default to . + self::$decimalSeparator = '.'; + } + } + return self::$decimalSeparator; + } + + /** + * Set the decimal separator. Only used by PHPExcel_Style_NumberFormat::toFormattedString() + * to format output by PHPExcel_Writer_HTML and PHPExcel_Writer_PDF + * + * @param string $pValue Character for decimal separator + */ + public static function setDecimalSeparator($pValue = '.') + { + self::$decimalSeparator = $pValue; + } + + /** + * Get the thousands separator. If it has not yet been set explicitly, try to obtain number + * formatting information from locale. + * + * @return string + */ + public static function getThousandsSeparator() + { + if (!isset(self::$thousandsSeparator)) { + $localeconv = localeconv(); + self::$thousandsSeparator = ($localeconv['thousands_sep'] != '') + ? $localeconv['thousands_sep'] : $localeconv['mon_thousands_sep']; + + if (self::$thousandsSeparator == '') { + // Default to . + self::$thousandsSeparator = ','; + } + } + return self::$thousandsSeparator; + } + + /** + * Set the thousands separator. Only used by PHPExcel_Style_NumberFormat::toFormattedString() + * to format output by PHPExcel_Writer_HTML and PHPExcel_Writer_PDF + * + * @param string $pValue Character for thousands separator + */ + public static function setThousandsSeparator($pValue = ',') + { + self::$thousandsSeparator = $pValue; + } + + /** + * Get the currency code. If it has not yet been set explicitly, try to obtain the + * symbol information from locale. + * + * @return string + */ + public static function getCurrencyCode() + { + if (!isset(self::$currencyCode)) { + $localeconv = localeconv(); + self::$currencyCode = ($localeconv['currency_symbol'] != '') + ? $localeconv['currency_symbol'] : $localeconv['int_curr_symbol']; + + if (self::$currencyCode == '') { + // Default to $ + self::$currencyCode = '$'; + } + } + return self::$currencyCode; + } + + /** + * Set the currency code. Only used by PHPExcel_Style_NumberFormat::toFormattedString() + * to format output by PHPExcel_Writer_HTML and PHPExcel_Writer_PDF + * + * @param string $pValue Character for currency code + */ + public static function setCurrencyCode($pValue = '$') + { + self::$currencyCode = $pValue; + } + + /** + * Convert SYLK encoded string to UTF-8 + * + * @param string $pValue + * @return string UTF-8 encoded string + */ + public static function SYLKtoUTF8($pValue = '') + { + // If there is no escape character in the string there is nothing to do + if (strpos($pValue, '') === false) { + return $pValue; + } + + foreach (self::$SYLKCharacters as $k => $v) { + $pValue = str_replace($k, $v, $pValue); + } + + return $pValue; + } + + /** + * Retrieve any leading numeric part of a string, or return the full string if no leading numeric + * (handles basic integer or float, but not exponent or non decimal) + * + * @param string $value + * @return mixed string or only the leading numeric part of the string + */ + public static function testStringAsNumeric($value) + { + if (is_numeric($value)) { + return $value; + } + $v = floatval($value); + return (is_numeric(substr($value, 0, strlen($v)))) ? $v : $value; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/TimeZone.php b/application/third_party/PHPExcel/PHPExcel/Shared/TimeZone.php new file mode 100644 index 0000000..73373e0 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/TimeZone.php @@ -0,0 +1,144 @@ +<?php + +/** + * PHPExcel + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ + + +/** + * PHPExcel_Shared_TimeZone + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Shared_TimeZone +{ + /* + * Default Timezone used for date/time conversions + * + * @private + * @var string + */ + protected static $timezone = 'UTC'; + + /** + * Validate a Timezone name + * + * @param string $timezone Time zone (e.g. 'Europe/London') + * @return boolean Success or failure + */ + public static function _validateTimeZone($timezone) + { + if (in_array($timezone, DateTimeZone::listIdentifiers())) { + return true; + } + return false; + } + + /** + * Set the Default Timezone used for date/time conversions + * + * @param string $timezone Time zone (e.g. 'Europe/London') + * @return boolean Success or failure + */ + public static function setTimeZone($timezone) + { + if (self::_validateTimezone($timezone)) { + self::$timezone = $timezone; + return true; + } + return false; + } + + + /** + * Return the Default Timezone used for date/time conversions + * + * @return string Timezone (e.g. 'Europe/London') + */ + public static function getTimeZone() + { + return self::$timezone; + } + + + /** + * Return the Timezone transition for the specified timezone and timestamp + * + * @param DateTimeZone $objTimezone The timezone for finding the transitions + * @param integer $timestamp PHP date/time value for finding the current transition + * @return array The current transition details + */ + private static function getTimezoneTransitions($objTimezone, $timestamp) + { + $allTransitions = $objTimezone->getTransitions(); + $transitions = array(); + foreach ($allTransitions as $key => $transition) { + if ($transition['ts'] > $timestamp) { + $transitions[] = ($key > 0) ? $allTransitions[$key - 1] : $transition; + break; + } + if (empty($transitions)) { + $transitions[] = end($allTransitions); + } + } + + return $transitions; + } + + /** + * Return the Timezone offset used for date/time conversions to/from UST + * This requires both the timezone and the calculated date/time to allow for local DST + * + * @param string $timezone The timezone for finding the adjustment to UST + * @param integer $timestamp PHP date/time value + * @return integer Number of seconds for timezone adjustment + * @throws PHPExcel_Exception + */ + public static function getTimeZoneAdjustment($timezone, $timestamp) + { + if ($timezone !== null) { + if (!self::_validateTimezone($timezone)) { + throw new PHPExcel_Exception("Invalid timezone " . $timezone); + } + } else { + $timezone = self::$timezone; + } + + if ($timezone == 'UST') { + return 0; + } + + $objTimezone = new DateTimeZone($timezone); + if (version_compare(PHP_VERSION, '5.3.0') >= 0) { + $transitions = $objTimezone->getTransitions($timestamp, $timestamp); + } else { + $transitions = self::getTimezoneTransitions($objTimezone, $timestamp); + } + + return (count($transitions) > 0) ? $transitions[0]['offset'] : 0; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/XMLWriter.php b/application/third_party/PHPExcel/PHPExcel/Shared/XMLWriter.php new file mode 100644 index 0000000..1dc119b --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/XMLWriter.php @@ -0,0 +1,124 @@ +<?php + +if (!defined('DATE_W3C')) { + define('DATE_W3C', 'Y-m-d\TH:i:sP'); +} + +if (!defined('DEBUGMODE_ENABLED')) { + define('DEBUGMODE_ENABLED', false); +} + +/** + * PHPExcel_Shared_XMLWriter + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Shared_XMLWriter extends XMLWriter +{ + /** Temporary storage method */ + const STORAGE_MEMORY = 1; + const STORAGE_DISK = 2; + + /** + * Temporary filename + * + * @var string + */ + private $tempFileName = ''; + + /** + * Create a new PHPExcel_Shared_XMLWriter instance + * + * @param int $pTemporaryStorage Temporary storage location + * @param string $pTemporaryStorageFolder Temporary storage folder + */ + public function __construct($pTemporaryStorage = self::STORAGE_MEMORY, $pTemporaryStorageFolder = null) + { + // Open temporary storage + if ($pTemporaryStorage == self::STORAGE_MEMORY) { + $this->openMemory(); + } else { + // Create temporary filename + if ($pTemporaryStorageFolder === null) { + $pTemporaryStorageFolder = PHPExcel_Shared_File::sys_get_temp_dir(); + } + $this->tempFileName = @tempnam($pTemporaryStorageFolder, 'xml'); + + // Open storage + if ($this->openUri($this->tempFileName) === false) { + // Fallback to memory... + $this->openMemory(); + } + } + + // Set default values + if (DEBUGMODE_ENABLED) { + $this->setIndent(true); + } + } + + /** + * Destructor + */ + public function __destruct() + { + // Unlink temporary files + if ($this->tempFileName != '') { + @unlink($this->tempFileName); + } + } + + /** + * Get written data + * + * @return $data + */ + public function getData() + { + if ($this->tempFileName == '') { + return $this->outputMemory(true); + } else { + $this->flush(); + return file_get_contents($this->tempFileName); + } + } + + /** + * Fallback method for writeRaw, introduced in PHP 5.2 + * + * @param string $text + * @return string + */ + public function writeRawData($text) + { + if (is_array($text)) { + $text = implode("\n", $text); + } + + if (method_exists($this, 'writeRaw')) { + return $this->writeRaw(htmlspecialchars($text)); + } + + return $this->text($text); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/ZipArchive.php b/application/third_party/PHPExcel/PHPExcel/Shared/ZipArchive.php new file mode 100644 index 0000000..9eac8ca --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/ZipArchive.php @@ -0,0 +1,163 @@ +<?php + +if (!defined('PCLZIP_TEMPORARY_DIR')) { + define('PCLZIP_TEMPORARY_DIR', PHPExcel_Shared_File::sys_get_temp_dir() . DIRECTORY_SEPARATOR); +} +require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/PCLZip/pclzip.lib.php'; + +/** + * PHPExcel_Shared_ZipArchive + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_ZipArchive + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Shared_ZipArchive +{ + + /** constants */ + const OVERWRITE = 'OVERWRITE'; + const CREATE = 'CREATE'; + + + /** + * Temporary storage directory + * + * @var string + */ + private $tempDir; + + /** + * Zip Archive Stream Handle + * + * @var string + */ + private $zip; + + + /** + * Open a new zip archive + * + * @param string $fileName Filename for the zip archive + * @return boolean + */ + public function open($fileName) + { + $this->tempDir = PHPExcel_Shared_File::sys_get_temp_dir(); + $this->zip = new PclZip($fileName); + + return true; + } + + + /** + * Close this zip archive + * + */ + public function close() + { + } + + + /** + * Add a new file to the zip archive from a string of raw data. + * + * @param string $localname Directory/Name of the file to add to the zip archive + * @param string $contents String of data to add to the zip archive + */ + public function addFromString($localname, $contents) + { + $filenameParts = pathinfo($localname); + + $handle = fopen($this->tempDir.'/'.$filenameParts["basename"], "wb"); + fwrite($handle, $contents); + fclose($handle); + + $res = $this->zip->add($this->tempDir.'/'.$filenameParts["basename"], PCLZIP_OPT_REMOVE_PATH, $this->tempDir, PCLZIP_OPT_ADD_PATH, $filenameParts["dirname"]); + if ($res == 0) { + throw new PHPExcel_Writer_Exception("Error zipping files : " . $this->zip->errorInfo(true)); + } + + unlink($this->tempDir.'/'.$filenameParts["basename"]); + } + + /** + * Find if given fileName exist in archive (Emulate ZipArchive locateName()) + * + * @param string $fileName Filename for the file in zip archive + * @return boolean + */ + public function locateName($fileName) + { + $fileName = strtolower($fileName); + + $list = $this->zip->listContent(); + $listCount = count($list); + $index = -1; + for ($i = 0; $i < $listCount; ++$i) { + if (strtolower($list[$i]["filename"]) == $fileName || + strtolower($list[$i]["stored_filename"]) == $fileName) { + $index = $i; + break; + } + } + return ($index > -1) ? $index : false; + } + + /** + * Extract file from archive by given fileName (Emulate ZipArchive getFromName()) + * + * @param string $fileName Filename for the file in zip archive + * @return string $contents File string contents + */ + public function getFromName($fileName) + { + $index = $this->locateName($fileName); + + if ($index !== false) { + $extracted = $this->getFromIndex($index); + } else { + $fileName = substr($fileName, 1); + $index = $this->locateName($fileName); + if ($index === false) { + return false; + } + $extracted = $this->zip->getFromIndex($index); + } + + $contents = $extracted; + if ((is_array($extracted)) && ($extracted != 0)) { + $contents = $extracted[0]["content"]; + } + + return $contents; + } + + public function getFromIndex($index) { + $extracted = $this->zip->extractByIndex($index, PCLZIP_OPT_EXTRACT_AS_STRING); + $contents = ''; + if ((is_array($extracted)) && ($extracted != 0)) { + $contents = $extracted[0]["content"]; + } + + return $contents; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/ZipStreamWrapper.php b/application/third_party/PHPExcel/PHPExcel/Shared/ZipStreamWrapper.php new file mode 100644 index 0000000..2e0324c --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/ZipStreamWrapper.php @@ -0,0 +1,200 @@ +<?php + +/** + * PHPExcel_Shared_ZipStreamWrapper + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Shared_ZipStreamWrapper +{ + /** + * Internal ZipAcrhive + * + * @var ZipArchive + */ + private $archive; + + /** + * Filename in ZipAcrhive + * + * @var string + */ + private $fileNameInArchive = ''; + + /** + * Position in file + * + * @var int + */ + private $position = 0; + + /** + * Data + * + * @var mixed + */ + private $data = ''; + + /** + * Register wrapper + */ + public static function register() + { + @stream_wrapper_unregister('zip'); + @stream_wrapper_register('zip', __CLASS__); + } + + /** + * Implements support for fopen(). + * + * @param string $path resource name including scheme, e.g. + * @param string $mode only "r" is supported + * @param int $options mask of STREAM_REPORT_ERRORS and STREAM_USE_PATH + * @param string &$openedPath absolute path of the opened stream (out parameter) + * @return bool true on success + */ + public function stream_open($path, $mode, $options, &$opened_path) + { + // Check for mode + if ($mode{0} != 'r') { + throw new PHPExcel_Reader_Exception('Mode ' . $mode . ' is not supported. Only read mode is supported.'); + } + + $pos = strrpos($path, '#'); + $url['host'] = substr($path, 6, $pos - 6); // 6: strlen('zip://') + $url['fragment'] = substr($path, $pos + 1); + + // Open archive + $this->archive = new ZipArchive(); + $this->archive->open($url['host']); + + $this->fileNameInArchive = $url['fragment']; + $this->position = 0; + $this->data = $this->archive->getFromName($this->fileNameInArchive); + + return true; + } + + /** + * Implements support for fstat(). + * + * @return boolean + */ + public function statName() + { + return $this->fileNameInArchive; + } + + /** + * Implements support for fstat(). + * + * @return boolean + */ + public function url_stat() + { + return $this->statName($this->fileNameInArchive); + } + + /** + * Implements support for fstat(). + * + * @return boolean + */ + public function stream_stat() + { + return $this->archive->statName($this->fileNameInArchive); + } + + /** + * Implements support for fread(), fgets() etc. + * + * @param int $count maximum number of bytes to read + * @return string + */ + public function stream_read($count) + { + $ret = substr($this->data, $this->position, $count); + $this->position += strlen($ret); + return $ret; + } + + /** + * Returns the position of the file pointer, i.e. its offset into the file + * stream. Implements support for ftell(). + * + * @return int + */ + public function stream_tell() + { + return $this->position; + } + + /** + * EOF stream + * + * @return bool + */ + public function stream_eof() + { + return $this->position >= strlen($this->data); + } + + /** + * Seek stream + * + * @param int $offset byte offset + * @param int $whence SEEK_SET, SEEK_CUR or SEEK_END + * @return bool + */ + public function stream_seek($offset, $whence) + { + switch ($whence) { + case SEEK_SET: + if ($offset < strlen($this->data) && $offset >= 0) { + $this->position = $offset; + return true; + } else { + return false; + } + break; + case SEEK_CUR: + if ($offset >= 0) { + $this->position += $offset; + return true; + } else { + return false; + } + break; + case SEEK_END: + if (strlen($this->data) + $offset >= 0) { + $this->position = strlen($this->data) + $offset; + return true; + } else { + return false; + } + break; + default: + return false; + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/trend/bestFitClass.php b/application/third_party/PHPExcel/PHPExcel/Shared/trend/bestFitClass.php new file mode 100644 index 0000000..2de029f --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/trend/bestFitClass.php @@ -0,0 +1,425 @@ +<?php + +/** + * PHPExcel_Best_Fit + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Trend + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Best_Fit +{ + /** + * Indicator flag for a calculation error + * + * @var boolean + **/ + protected $error = false; + + /** + * Algorithm type to use for best-fit + * + * @var string + **/ + protected $bestFitType = 'undetermined'; + + /** + * Number of entries in the sets of x- and y-value arrays + * + * @var int + **/ + protected $valueCount = 0; + + /** + * X-value dataseries of values + * + * @var float[] + **/ + protected $xValues = array(); + + /** + * Y-value dataseries of values + * + * @var float[] + **/ + protected $yValues = array(); + + /** + * Flag indicating whether values should be adjusted to Y=0 + * + * @var boolean + **/ + protected $adjustToZero = false; + + /** + * Y-value series of best-fit values + * + * @var float[] + **/ + protected $yBestFitValues = array(); + + protected $goodnessOfFit = 1; + + protected $stdevOfResiduals = 0; + + protected $covariance = 0; + + protected $correlation = 0; + + protected $SSRegression = 0; + + protected $SSResiduals = 0; + + protected $DFResiduals = 0; + + protected $f = 0; + + protected $slope = 0; + + protected $slopeSE = 0; + + protected $intersect = 0; + + protected $intersectSE = 0; + + protected $xOffset = 0; + + protected $yOffset = 0; + + + public function getError() + { + return $this->error; + } + + + public function getBestFitType() + { + return $this->bestFitType; + } + + /** + * Return the Y-Value for a specified value of X + * + * @param float $xValue X-Value + * @return float Y-Value + */ + public function getValueOfYForX($xValue) + { + return false; + } + + /** + * Return the X-Value for a specified value of Y + * + * @param float $yValue Y-Value + * @return float X-Value + */ + public function getValueOfXForY($yValue) + { + return false; + } + + /** + * Return the original set of X-Values + * + * @return float[] X-Values + */ + public function getXValues() + { + return $this->xValues; + } + + /** + * Return the Equation of the best-fit line + * + * @param int $dp Number of places of decimal precision to display + * @return string + */ + public function getEquation($dp = 0) + { + return false; + } + + /** + * Return the Slope of the line + * + * @param int $dp Number of places of decimal precision to display + * @return string + */ + public function getSlope($dp = 0) + { + if ($dp != 0) { + return round($this->slope, $dp); + } + return $this->slope; + } + + /** + * Return the standard error of the Slope + * + * @param int $dp Number of places of decimal precision to display + * @return string + */ + public function getSlopeSE($dp = 0) + { + if ($dp != 0) { + return round($this->slopeSE, $dp); + } + return $this->slopeSE; + } + + /** + * Return the Value of X where it intersects Y = 0 + * + * @param int $dp Number of places of decimal precision to display + * @return string + */ + public function getIntersect($dp = 0) + { + if ($dp != 0) { + return round($this->intersect, $dp); + } + return $this->intersect; + } + + /** + * Return the standard error of the Intersect + * + * @param int $dp Number of places of decimal precision to display + * @return string + */ + public function getIntersectSE($dp = 0) + { + if ($dp != 0) { + return round($this->intersectSE, $dp); + } + return $this->intersectSE; + } + + /** + * Return the goodness of fit for this regression + * + * @param int $dp Number of places of decimal precision to return + * @return float + */ + public function getGoodnessOfFit($dp = 0) + { + if ($dp != 0) { + return round($this->goodnessOfFit, $dp); + } + return $this->goodnessOfFit; + } + + public function getGoodnessOfFitPercent($dp = 0) + { + if ($dp != 0) { + return round($this->goodnessOfFit * 100, $dp); + } + return $this->goodnessOfFit * 100; + } + + /** + * Return the standard deviation of the residuals for this regression + * + * @param int $dp Number of places of decimal precision to return + * @return float + */ + public function getStdevOfResiduals($dp = 0) + { + if ($dp != 0) { + return round($this->stdevOfResiduals, $dp); + } + return $this->stdevOfResiduals; + } + + public function getSSRegression($dp = 0) + { + if ($dp != 0) { + return round($this->SSRegression, $dp); + } + return $this->SSRegression; + } + + public function getSSResiduals($dp = 0) + { + if ($dp != 0) { + return round($this->SSResiduals, $dp); + } + return $this->SSResiduals; + } + + public function getDFResiduals($dp = 0) + { + if ($dp != 0) { + return round($this->DFResiduals, $dp); + } + return $this->DFResiduals; + } + + public function getF($dp = 0) + { + if ($dp != 0) { + return round($this->f, $dp); + } + return $this->f; + } + + public function getCovariance($dp = 0) + { + if ($dp != 0) { + return round($this->covariance, $dp); + } + return $this->covariance; + } + + public function getCorrelation($dp = 0) + { + if ($dp != 0) { + return round($this->correlation, $dp); + } + return $this->correlation; + } + + public function getYBestFitValues() + { + return $this->yBestFitValues; + } + + protected function calculateGoodnessOfFit($sumX, $sumY, $sumX2, $sumY2, $sumXY, $meanX, $meanY, $const) + { + $SSres = $SScov = $SScor = $SStot = $SSsex = 0.0; + foreach ($this->xValues as $xKey => $xValue) { + $bestFitY = $this->yBestFitValues[$xKey] = $this->getValueOfYForX($xValue); + + $SSres += ($this->yValues[$xKey] - $bestFitY) * ($this->yValues[$xKey] - $bestFitY); + if ($const) { + $SStot += ($this->yValues[$xKey] - $meanY) * ($this->yValues[$xKey] - $meanY); + } else { + $SStot += $this->yValues[$xKey] * $this->yValues[$xKey]; + } + $SScov += ($this->xValues[$xKey] - $meanX) * ($this->yValues[$xKey] - $meanY); + if ($const) { + $SSsex += ($this->xValues[$xKey] - $meanX) * ($this->xValues[$xKey] - $meanX); + } else { + $SSsex += $this->xValues[$xKey] * $this->xValues[$xKey]; + } + } + + $this->SSResiduals = $SSres; + $this->DFResiduals = $this->valueCount - 1 - $const; + + if ($this->DFResiduals == 0.0) { + $this->stdevOfResiduals = 0.0; + } else { + $this->stdevOfResiduals = sqrt($SSres / $this->DFResiduals); + } + if (($SStot == 0.0) || ($SSres == $SStot)) { + $this->goodnessOfFit = 1; + } else { + $this->goodnessOfFit = 1 - ($SSres / $SStot); + } + + $this->SSRegression = $this->goodnessOfFit * $SStot; + $this->covariance = $SScov / $this->valueCount; + $this->correlation = ($this->valueCount * $sumXY - $sumX * $sumY) / sqrt(($this->valueCount * $sumX2 - pow($sumX, 2)) * ($this->valueCount * $sumY2 - pow($sumY, 2))); + $this->slopeSE = $this->stdevOfResiduals / sqrt($SSsex); + $this->intersectSE = $this->stdevOfResiduals * sqrt(1 / ($this->valueCount - ($sumX * $sumX) / $sumX2)); + if ($this->SSResiduals != 0.0) { + if ($this->DFResiduals == 0.0) { + $this->f = 0.0; + } else { + $this->f = $this->SSRegression / ($this->SSResiduals / $this->DFResiduals); + } + } else { + if ($this->DFResiduals == 0.0) { + $this->f = 0.0; + } else { + $this->f = $this->SSRegression / $this->DFResiduals; + } + } + } + + protected function leastSquareFit($yValues, $xValues, $const) + { + // calculate sums + $x_sum = array_sum($xValues); + $y_sum = array_sum($yValues); + $meanX = $x_sum / $this->valueCount; + $meanY = $y_sum / $this->valueCount; + $mBase = $mDivisor = $xx_sum = $xy_sum = $yy_sum = 0.0; + for ($i = 0; $i < $this->valueCount; ++$i) { + $xy_sum += $xValues[$i] * $yValues[$i]; + $xx_sum += $xValues[$i] * $xValues[$i]; + $yy_sum += $yValues[$i] * $yValues[$i]; + + if ($const) { + $mBase += ($xValues[$i] - $meanX) * ($yValues[$i] - $meanY); + $mDivisor += ($xValues[$i] - $meanX) * ($xValues[$i] - $meanX); + } else { + $mBase += $xValues[$i] * $yValues[$i]; + $mDivisor += $xValues[$i] * $xValues[$i]; + } + } + + // calculate slope +// $this->slope = (($this->valueCount * $xy_sum) - ($x_sum * $y_sum)) / (($this->valueCount * $xx_sum) - ($x_sum * $x_sum)); + $this->slope = $mBase / $mDivisor; + + // calculate intersect +// $this->intersect = ($y_sum - ($this->slope * $x_sum)) / $this->valueCount; + if ($const) { + $this->intersect = $meanY - ($this->slope * $meanX); + } else { + $this->intersect = 0; + } + + $this->calculateGoodnessOfFit($x_sum, $y_sum, $xx_sum, $yy_sum, $xy_sum, $meanX, $meanY, $const); + } + + /** + * Define the regression + * + * @param float[] $yValues The set of Y-values for this regression + * @param float[] $xValues The set of X-values for this regression + * @param boolean $const + */ + public function __construct($yValues, $xValues = array(), $const = true) + { + // Calculate number of points + $nY = count($yValues); + $nX = count($xValues); + + // Define X Values if necessary + if ($nX == 0) { + $xValues = range(1, $nY); + $nX = $nY; + } elseif ($nY != $nX) { + // Ensure both arrays of points are the same size + $this->error = true; + return false; + } + + $this->valueCount = $nY; + $this->xValues = $xValues; + $this->yValues = $yValues; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/trend/exponentialBestFitClass.php b/application/third_party/PHPExcel/PHPExcel/Shared/trend/exponentialBestFitClass.php new file mode 100644 index 0000000..4448735 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/trend/exponentialBestFitClass.php @@ -0,0 +1,138 @@ +<?php + +require_once(PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/bestFitClass.php'); + +/** + * PHPExcel_Exponential_Best_Fit + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Trend + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Exponential_Best_Fit extends PHPExcel_Best_Fit +{ + /** + * Algorithm type to use for best-fit + * (Name of this trend class) + * + * @var string + **/ + protected $bestFitType = 'exponential'; + + /** + * Return the Y-Value for a specified value of X + * + * @param float $xValue X-Value + * @return float Y-Value + **/ + public function getValueOfYForX($xValue) + { + return $this->getIntersect() * pow($this->getSlope(), ($xValue - $this->xOffset)); + } + + /** + * Return the X-Value for a specified value of Y + * + * @param float $yValue Y-Value + * @return float X-Value + **/ + public function getValueOfXForY($yValue) + { + return log(($yValue + $this->yOffset) / $this->getIntersect()) / log($this->getSlope()); + } + + /** + * Return the Equation of the best-fit line + * + * @param int $dp Number of places of decimal precision to display + * @return string + **/ + public function getEquation($dp = 0) + { + $slope = $this->getSlope($dp); + $intersect = $this->getIntersect($dp); + + return 'Y = ' . $intersect . ' * ' . $slope . '^X'; + } + + /** + * Return the Slope of the line + * + * @param int $dp Number of places of decimal precision to display + * @return string + **/ + public function getSlope($dp = 0) + { + if ($dp != 0) { + return round(exp($this->_slope), $dp); + } + return exp($this->_slope); + } + + /** + * Return the Value of X where it intersects Y = 0 + * + * @param int $dp Number of places of decimal precision to display + * @return string + **/ + public function getIntersect($dp = 0) + { + if ($dp != 0) { + return round(exp($this->intersect), $dp); + } + return exp($this->intersect); + } + + /** + * Execute the regression and calculate the goodness of fit for a set of X and Y data values + * + * @param float[] $yValues The set of Y-values for this regression + * @param float[] $xValues The set of X-values for this regression + * @param boolean $const + */ + private function exponentialRegression($yValues, $xValues, $const) + { + foreach ($yValues as &$value) { + if ($value < 0.0) { + $value = 0 - log(abs($value)); + } elseif ($value > 0.0) { + $value = log($value); + } + } + unset($value); + + $this->leastSquareFit($yValues, $xValues, $const); + } + + /** + * Define the regression and calculate the goodness of fit for a set of X and Y data values + * + * @param float[] $yValues The set of Y-values for this regression + * @param float[] $xValues The set of X-values for this regression + * @param boolean $const + */ + public function __construct($yValues, $xValues = array(), $const = true) + { + if (parent::__construct($yValues, $xValues) !== false) { + $this->exponentialRegression($yValues, $xValues, $const); + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/trend/linearBestFitClass.php b/application/third_party/PHPExcel/PHPExcel/Shared/trend/linearBestFitClass.php new file mode 100644 index 0000000..76b55b3 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/trend/linearBestFitClass.php @@ -0,0 +1,102 @@ +<?php + +require_once(PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/bestFitClass.php'); + +/** + * PHPExcel_Linear_Best_Fit + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Trend + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Linear_Best_Fit extends PHPExcel_Best_Fit +{ + /** + * Algorithm type to use for best-fit + * (Name of this trend class) + * + * @var string + **/ + protected $bestFitType = 'linear'; + + /** + * Return the Y-Value for a specified value of X + * + * @param float $xValue X-Value + * @return float Y-Value + **/ + public function getValueOfYForX($xValue) + { + return $this->getIntersect() + $this->getSlope() * $xValue; + } + + /** + * Return the X-Value for a specified value of Y + * + * @param float $yValue Y-Value + * @return float X-Value + **/ + public function getValueOfXForY($yValue) + { + return ($yValue - $this->getIntersect()) / $this->getSlope(); + } + + + /** + * Return the Equation of the best-fit line + * + * @param int $dp Number of places of decimal precision to display + * @return string + **/ + public function getEquation($dp = 0) + { + $slope = $this->getSlope($dp); + $intersect = $this->getIntersect($dp); + + return 'Y = ' . $intersect . ' + ' . $slope . ' * X'; + } + + /** + * Execute the regression and calculate the goodness of fit for a set of X and Y data values + * + * @param float[] $yValues The set of Y-values for this regression + * @param float[] $xValues The set of X-values for this regression + * @param boolean $const + */ + private function linearRegression($yValues, $xValues, $const) + { + $this->leastSquareFit($yValues, $xValues, $const); + } + + /** + * Define the regression and calculate the goodness of fit for a set of X and Y data values + * + * @param float[] $yValues The set of Y-values for this regression + * @param float[] $xValues The set of X-values for this regression + * @param boolean $const + */ + public function __construct($yValues, $xValues = array(), $const = true) + { + if (parent::__construct($yValues, $xValues) !== false) { + $this->linearRegression($yValues, $xValues, $const); + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/trend/logarithmicBestFitClass.php b/application/third_party/PHPExcel/PHPExcel/Shared/trend/logarithmicBestFitClass.php new file mode 100644 index 0000000..221c538 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/trend/logarithmicBestFitClass.php @@ -0,0 +1,110 @@ +<?php + +require_once(PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/bestFitClass.php'); + +/** + * PHPExcel_Logarithmic_Best_Fit + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Trend + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Logarithmic_Best_Fit extends PHPExcel_Best_Fit +{ + /** + * Algorithm type to use for best-fit + * (Name of this trend class) + * + * @var string + **/ + protected $bestFitType = 'logarithmic'; + + /** + * Return the Y-Value for a specified value of X + * + * @param float $xValue X-Value + * @return float Y-Value + **/ + public function getValueOfYForX($xValue) + { + return $this->getIntersect() + $this->getSlope() * log($xValue - $this->xOffset); + } + + /** + * Return the X-Value for a specified value of Y + * + * @param float $yValue Y-Value + * @return float X-Value + **/ + public function getValueOfXForY($yValue) + { + return exp(($yValue - $this->getIntersect()) / $this->getSlope()); + } + + /** + * Return the Equation of the best-fit line + * + * @param int $dp Number of places of decimal precision to display + * @return string + **/ + public function getEquation($dp = 0) + { + $slope = $this->getSlope($dp); + $intersect = $this->getIntersect($dp); + + return 'Y = '.$intersect.' + '.$slope.' * log(X)'; + } + + /** + * Execute the regression and calculate the goodness of fit for a set of X and Y data values + * + * @param float[] $yValues The set of Y-values for this regression + * @param float[] $xValues The set of X-values for this regression + * @param boolean $const + */ + private function logarithmicRegression($yValues, $xValues, $const) + { + foreach ($xValues as &$value) { + if ($value < 0.0) { + $value = 0 - log(abs($value)); + } elseif ($value > 0.0) { + $value = log($value); + } + } + unset($value); + + $this->leastSquareFit($yValues, $xValues, $const); + } + + /** + * Define the regression and calculate the goodness of fit for a set of X and Y data values + * + * @param float[] $yValues The set of Y-values for this regression + * @param float[] $xValues The set of X-values for this regression + * @param boolean $const + */ + public function __construct($yValues, $xValues = array(), $const = true) + { + if (parent::__construct($yValues, $xValues) !== false) { + $this->logarithmicRegression($yValues, $xValues, $const); + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/trend/polynomialBestFitClass.php b/application/third_party/PHPExcel/PHPExcel/Shared/trend/polynomialBestFitClass.php new file mode 100644 index 0000000..8a882b7 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/trend/polynomialBestFitClass.php @@ -0,0 +1,222 @@ +<?php + +require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/bestFitClass.php'; +require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/JAMA/Matrix.php'; + +/** + * PHPExcel_Polynomial_Best_Fit + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Trend + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Polynomial_Best_Fit extends PHPExcel_Best_Fit +{ + /** + * Algorithm type to use for best-fit + * (Name of this trend class) + * + * @var string + **/ + protected $bestFitType = 'polynomial'; + + /** + * Polynomial order + * + * @protected + * @var int + **/ + protected $order = 0; + + + /** + * Return the order of this polynomial + * + * @return int + **/ + public function getOrder() + { + return $this->order; + } + + + /** + * Return the Y-Value for a specified value of X + * + * @param float $xValue X-Value + * @return float Y-Value + **/ + public function getValueOfYForX($xValue) + { + $retVal = $this->getIntersect(); + $slope = $this->getSlope(); + foreach ($slope as $key => $value) { + if ($value != 0.0) { + $retVal += $value * pow($xValue, $key + 1); + } + } + return $retVal; + } + + + /** + * Return the X-Value for a specified value of Y + * + * @param float $yValue Y-Value + * @return float X-Value + **/ + public function getValueOfXForY($yValue) + { + return ($yValue - $this->getIntersect()) / $this->getSlope(); + } + + + /** + * Return the Equation of the best-fit line + * + * @param int $dp Number of places of decimal precision to display + * @return string + **/ + public function getEquation($dp = 0) + { + $slope = $this->getSlope($dp); + $intersect = $this->getIntersect($dp); + + $equation = 'Y = ' . $intersect; + foreach ($slope as $key => $value) { + if ($value != 0.0) { + $equation .= ' + ' . $value . ' * X'; + if ($key > 0) { + $equation .= '^' . ($key + 1); + } + } + } + return $equation; + } + + + /** + * Return the Slope of the line + * + * @param int $dp Number of places of decimal precision to display + * @return string + **/ + public function getSlope($dp = 0) + { + if ($dp != 0) { + $coefficients = array(); + foreach ($this->_slope as $coefficient) { + $coefficients[] = round($coefficient, $dp); + } + return $coefficients; + } + return $this->_slope; + } + + + public function getCoefficients($dp = 0) + { + return array_merge(array($this->getIntersect($dp)), $this->getSlope($dp)); + } + + + /** + * Execute the regression and calculate the goodness of fit for a set of X and Y data values + * + * @param int $order Order of Polynomial for this regression + * @param float[] $yValues The set of Y-values for this regression + * @param float[] $xValues The set of X-values for this regression + * @param boolean $const + */ + private function polynomialRegression($order, $yValues, $xValues, $const) + { + // calculate sums + $x_sum = array_sum($xValues); + $y_sum = array_sum($yValues); + $xx_sum = $xy_sum = 0; + for ($i = 0; $i < $this->valueCount; ++$i) { + $xy_sum += $xValues[$i] * $yValues[$i]; + $xx_sum += $xValues[$i] * $xValues[$i]; + $yy_sum += $yValues[$i] * $yValues[$i]; + } + /* + * This routine uses logic from the PHP port of polyfit version 0.1 + * written by Michael Bommarito and Paul Meagher + * + * The function fits a polynomial function of order $order through + * a series of x-y data points using least squares. + * + */ + for ($i = 0; $i < $this->valueCount; ++$i) { + for ($j = 0; $j <= $order; ++$j) { + $A[$i][$j] = pow($xValues[$i], $j); + } + } + for ($i=0; $i < $this->valueCount; ++$i) { + $B[$i] = array($yValues[$i]); + } + $matrixA = new Matrix($A); + $matrixB = new Matrix($B); + $C = $matrixA->solve($matrixB); + + $coefficients = array(); + for ($i = 0; $i < $C->m; ++$i) { + $r = $C->get($i, 0); + if (abs($r) <= pow(10, -9)) { + $r = 0; + } + $coefficients[] = $r; + } + + $this->intersect = array_shift($coefficients); + $this->_slope = $coefficients; + + $this->calculateGoodnessOfFit($x_sum, $y_sum, $xx_sum, $yy_sum, $xy_sum); + foreach ($this->xValues as $xKey => $xValue) { + $this->yBestFitValues[$xKey] = $this->getValueOfYForX($xValue); + } + } + + + /** + * Define the regression and calculate the goodness of fit for a set of X and Y data values + * + * @param int $order Order of Polynomial for this regression + * @param float[] $yValues The set of Y-values for this regression + * @param float[] $xValues The set of X-values for this regression + * @param boolean $const + */ + public function __construct($order, $yValues, $xValues = array(), $const = true) + { + if (parent::__construct($yValues, $xValues) !== false) { + if ($order < $this->valueCount) { + $this->bestFitType .= '_'.$order; + $this->order = $order; + $this->polynomialRegression($order, $yValues, $xValues, $const); + if (($this->getGoodnessOfFit() < 0.0) || ($this->getGoodnessOfFit() > 1.0)) { + $this->_error = true; + } + } else { + $this->_error = true; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/trend/powerBestFitClass.php b/application/third_party/PHPExcel/PHPExcel/Shared/trend/powerBestFitClass.php new file mode 100644 index 0000000..77c4734 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/trend/powerBestFitClass.php @@ -0,0 +1,138 @@ +<?php + +require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/bestFitClass.php'; + +/** + * PHPExcel_Power_Best_Fit + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Trend + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Power_Best_Fit extends PHPExcel_Best_Fit +{ + /** + * Algorithm type to use for best-fit + * (Name of this trend class) + * + * @var string + **/ + protected $bestFitType = 'power'; + + + /** + * Return the Y-Value for a specified value of X + * + * @param float $xValue X-Value + * @return float Y-Value + **/ + public function getValueOfYForX($xValue) + { + return $this->getIntersect() * pow(($xValue - $this->xOffset), $this->getSlope()); + } + + + /** + * Return the X-Value for a specified value of Y + * + * @param float $yValue Y-Value + * @return float X-Value + **/ + public function getValueOfXForY($yValue) + { + return pow((($yValue + $this->yOffset) / $this->getIntersect()), (1 / $this->getSlope())); + } + + + /** + * Return the Equation of the best-fit line + * + * @param int $dp Number of places of decimal precision to display + * @return string + **/ + public function getEquation($dp = 0) + { + $slope = $this->getSlope($dp); + $intersect = $this->getIntersect($dp); + + return 'Y = ' . $intersect . ' * X^' . $slope; + } + + + /** + * Return the Value of X where it intersects Y = 0 + * + * @param int $dp Number of places of decimal precision to display + * @return string + **/ + public function getIntersect($dp = 0) + { + if ($dp != 0) { + return round(exp($this->intersect), $dp); + } + return exp($this->intersect); + } + + + /** + * Execute the regression and calculate the goodness of fit for a set of X and Y data values + * + * @param float[] $yValues The set of Y-values for this regression + * @param float[] $xValues The set of X-values for this regression + * @param boolean $const + */ + private function powerRegression($yValues, $xValues, $const) + { + foreach ($xValues as &$value) { + if ($value < 0.0) { + $value = 0 - log(abs($value)); + } elseif ($value > 0.0) { + $value = log($value); + } + } + unset($value); + foreach ($yValues as &$value) { + if ($value < 0.0) { + $value = 0 - log(abs($value)); + } elseif ($value > 0.0) { + $value = log($value); + } + } + unset($value); + + $this->leastSquareFit($yValues, $xValues, $const); + } + + + /** + * Define the regression and calculate the goodness of fit for a set of X and Y data values + * + * @param float[] $yValues The set of Y-values for this regression + * @param float[] $xValues The set of X-values for this regression + * @param boolean $const + */ + public function __construct($yValues, $xValues = array(), $const = true) + { + if (parent::__construct($yValues, $xValues) !== false) { + $this->powerRegression($yValues, $xValues, $const); + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Shared/trend/trendClass.php b/application/third_party/PHPExcel/PHPExcel/Shared/trend/trendClass.php new file mode 100644 index 0000000..715cd41 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Shared/trend/trendClass.php @@ -0,0 +1,147 @@ +<?php + +require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/linearBestFitClass.php'; +require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/logarithmicBestFitClass.php'; +require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/exponentialBestFitClass.php'; +require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/powerBestFitClass.php'; +require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/trend/polynomialBestFitClass.php'; + +/** + * PHPExcel_trendClass + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Shared_Trend + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class trendClass +{ + const TREND_LINEAR = 'Linear'; + const TREND_LOGARITHMIC = 'Logarithmic'; + const TREND_EXPONENTIAL = 'Exponential'; + const TREND_POWER = 'Power'; + const TREND_POLYNOMIAL_2 = 'Polynomial_2'; + const TREND_POLYNOMIAL_3 = 'Polynomial_3'; + const TREND_POLYNOMIAL_4 = 'Polynomial_4'; + const TREND_POLYNOMIAL_5 = 'Polynomial_5'; + const TREND_POLYNOMIAL_6 = 'Polynomial_6'; + const TREND_BEST_FIT = 'Bestfit'; + const TREND_BEST_FIT_NO_POLY = 'Bestfit_no_Polynomials'; + + /** + * Names of the best-fit trend analysis methods + * + * @var string[] + **/ + private static $trendTypes = array( + self::TREND_LINEAR, + self::TREND_LOGARITHMIC, + self::TREND_EXPONENTIAL, + self::TREND_POWER + ); + + /** + * Names of the best-fit trend polynomial orders + * + * @var string[] + **/ + private static $trendTypePolynomialOrders = array( + self::TREND_POLYNOMIAL_2, + self::TREND_POLYNOMIAL_3, + self::TREND_POLYNOMIAL_4, + self::TREND_POLYNOMIAL_5, + self::TREND_POLYNOMIAL_6 + ); + + /** + * Cached results for each method when trying to identify which provides the best fit + * + * @var PHPExcel_Best_Fit[] + **/ + private static $trendCache = array(); + + + public static function calculate($trendType = self::TREND_BEST_FIT, $yValues, $xValues = array(), $const = true) + { + // Calculate number of points in each dataset + $nY = count($yValues); + $nX = count($xValues); + + // Define X Values if necessary + if ($nX == 0) { + $xValues = range(1, $nY); + $nX = $nY; + } elseif ($nY != $nX) { + // Ensure both arrays of points are the same size + trigger_error("trend(): Number of elements in coordinate arrays do not match.", E_USER_ERROR); + } + + $key = md5($trendType.$const.serialize($yValues).serialize($xValues)); + // Determine which trend method has been requested + switch ($trendType) { + // Instantiate and return the class for the requested trend method + case self::TREND_LINEAR: + case self::TREND_LOGARITHMIC: + case self::TREND_EXPONENTIAL: + case self::TREND_POWER: + if (!isset(self::$trendCache[$key])) { + $className = 'PHPExcel_'.$trendType.'_Best_Fit'; + self::$trendCache[$key] = new $className($yValues, $xValues, $const); + } + return self::$trendCache[$key]; + case self::TREND_POLYNOMIAL_2: + case self::TREND_POLYNOMIAL_3: + case self::TREND_POLYNOMIAL_4: + case self::TREND_POLYNOMIAL_5: + case self::TREND_POLYNOMIAL_6: + if (!isset(self::$trendCache[$key])) { + $order = substr($trendType, -1); + self::$trendCache[$key] = new PHPExcel_Polynomial_Best_Fit($order, $yValues, $xValues, $const); + } + return self::$trendCache[$key]; + case self::TREND_BEST_FIT: + case self::TREND_BEST_FIT_NO_POLY: + // If the request is to determine the best fit regression, then we test each trend line in turn + // Start by generating an instance of each available trend method + foreach (self::$trendTypes as $trendMethod) { + $className = 'PHPExcel_'.$trendMethod.'BestFit'; + $bestFit[$trendMethod] = new $className($yValues, $xValues, $const); + $bestFitValue[$trendMethod] = $bestFit[$trendMethod]->getGoodnessOfFit(); + } + if ($trendType != self::TREND_BEST_FIT_NO_POLY) { + foreach (self::$trendTypePolynomialOrders as $trendMethod) { + $order = substr($trendMethod, -1); + $bestFit[$trendMethod] = new PHPExcel_Polynomial_Best_Fit($order, $yValues, $xValues, $const); + if ($bestFit[$trendMethod]->getError()) { + unset($bestFit[$trendMethod]); + } else { + $bestFitValue[$trendMethod] = $bestFit[$trendMethod]->getGoodnessOfFit(); + } + } + } + // Determine which of our trend lines is the best fit, and then we return the instance of that trend class + arsort($bestFitValue); + $bestFitType = key($bestFitValue); + return $bestFit[$bestFitType]; + default: + return false; + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Style.php b/application/third_party/PHPExcel/PHPExcel/Style.php new file mode 100644 index 0000000..6b952ef --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Style.php @@ -0,0 +1,644 @@ +<?php + +/** + * PHPExcel_Style + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Style extends PHPExcel_Style_Supervisor implements PHPExcel_IComparable +{ + /** + * Font + * + * @var PHPExcel_Style_Font + */ + protected $font; + + /** + * Fill + * + * @var PHPExcel_Style_Fill + */ + protected $fill; + + /** + * Borders + * + * @var PHPExcel_Style_Borders + */ + protected $borders; + + /** + * Alignment + * + * @var PHPExcel_Style_Alignment + */ + protected $alignment; + + /** + * Number Format + * + * @var PHPExcel_Style_NumberFormat + */ + protected $numberFormat; + + /** + * Conditional styles + * + * @var PHPExcel_Style_Conditional[] + */ + protected $conditionalStyles; + + /** + * Protection + * + * @var PHPExcel_Style_Protection + */ + protected $protection; + + /** + * Index of style in collection. Only used for real style. + * + * @var int + */ + protected $index; + + /** + * Use Quote Prefix when displaying in cell editor. Only used for real style. + * + * @var boolean + */ + protected $quotePrefix = false; + + /** + * Create a new PHPExcel_Style + * + * @param boolean $isSupervisor Flag indicating if this is a supervisor or not + * Leave this value at default unless you understand exactly what + * its ramifications are + * @param boolean $isConditional Flag indicating if this is a conditional style or not + * Leave this value at default unless you understand exactly what + * its ramifications are + */ + public function __construct($isSupervisor = false, $isConditional = false) + { + // Supervisor? + $this->isSupervisor = $isSupervisor; + + // Initialise values + $this->conditionalStyles = array(); + $this->font = new PHPExcel_Style_Font($isSupervisor, $isConditional); + $this->fill = new PHPExcel_Style_Fill($isSupervisor, $isConditional); + $this->borders = new PHPExcel_Style_Borders($isSupervisor, $isConditional); + $this->alignment = new PHPExcel_Style_Alignment($isSupervisor, $isConditional); + $this->numberFormat = new PHPExcel_Style_NumberFormat($isSupervisor, $isConditional); + $this->protection = new PHPExcel_Style_Protection($isSupervisor, $isConditional); + + // bind parent if we are a supervisor + if ($isSupervisor) { + $this->font->bindParent($this); + $this->fill->bindParent($this); + $this->borders->bindParent($this); + $this->alignment->bindParent($this); + $this->numberFormat->bindParent($this); + $this->protection->bindParent($this); + } + } + + /** + * Get the shared style component for the currently active cell in currently active sheet. + * Only used for style supervisor + * + * @return PHPExcel_Style + */ + public function getSharedComponent() + { + $activeSheet = $this->getActiveSheet(); + $selectedCell = $this->getActiveCell(); // e.g. 'A1' + + if ($activeSheet->cellExists($selectedCell)) { + $xfIndex = $activeSheet->getCell($selectedCell)->getXfIndex(); + } else { + $xfIndex = 0; + } + + return $this->parent->getCellXfByIndex($xfIndex); + } + + /** + * Get parent. Only used for style supervisor + * + * @return PHPExcel + */ + public function getParent() + { + return $this->parent; + } + + /** + * Build style array from subcomponents + * + * @param array $array + * @return array + */ + public function getStyleArray($array) + { + return array('quotePrefix' => $array); + } + + /** + * Apply styles from array + * + * <code> + * $objPHPExcel->getActiveSheet()->getStyle('B2')->applyFromArray( + * array( + * 'font' => array( + * 'name' => 'Arial', + * 'bold' => true, + * 'italic' => false, + * 'underline' => PHPExcel_Style_Font::UNDERLINE_DOUBLE, + * 'strike' => false, + * 'color' => array( + * 'rgb' => '808080' + * ) + * ), + * 'borders' => array( + * 'bottom' => array( + * 'style' => PHPExcel_Style_Border::BORDER_DASHDOT, + * 'color' => array( + * 'rgb' => '808080' + * ) + * ), + * 'top' => array( + * 'style' => PHPExcel_Style_Border::BORDER_DASHDOT, + * 'color' => array( + * 'rgb' => '808080' + * ) + * ) + * ), + * 'quotePrefix' => true + * ) + * ); + * </code> + * + * @param array $pStyles Array containing style information + * @param boolean $pAdvanced Advanced mode for setting borders. + * @throws PHPExcel_Exception + * @return PHPExcel_Style + */ + public function applyFromArray($pStyles = null, $pAdvanced = true) + { + if (is_array($pStyles)) { + if ($this->isSupervisor) { + $pRange = $this->getSelectedCells(); + + // Uppercase coordinate + $pRange = strtoupper($pRange); + + // Is it a cell range or a single cell? + if (strpos($pRange, ':') === false) { + $rangeA = $pRange; + $rangeB = $pRange; + } else { + list($rangeA, $rangeB) = explode(':', $pRange); + } + + // Calculate range outer borders + $rangeStart = PHPExcel_Cell::coordinateFromString($rangeA); + $rangeEnd = PHPExcel_Cell::coordinateFromString($rangeB); + + // Translate column into index + $rangeStart[0] = PHPExcel_Cell::columnIndexFromString($rangeStart[0]) - 1; + $rangeEnd[0] = PHPExcel_Cell::columnIndexFromString($rangeEnd[0]) - 1; + + // Make sure we can loop upwards on rows and columns + if ($rangeStart[0] > $rangeEnd[0] && $rangeStart[1] > $rangeEnd[1]) { + $tmp = $rangeStart; + $rangeStart = $rangeEnd; + $rangeEnd = $tmp; + } + + // ADVANCED MODE: + if ($pAdvanced && isset($pStyles['borders'])) { + // 'allborders' is a shorthand property for 'outline' and 'inside' and + // it applies to components that have not been set explicitly + if (isset($pStyles['borders']['allborders'])) { + foreach (array('outline', 'inside') as $component) { + if (!isset($pStyles['borders'][$component])) { + $pStyles['borders'][$component] = $pStyles['borders']['allborders']; + } + } + unset($pStyles['borders']['allborders']); // not needed any more + } + // 'outline' is a shorthand property for 'top', 'right', 'bottom', 'left' + // it applies to components that have not been set explicitly + if (isset($pStyles['borders']['outline'])) { + foreach (array('top', 'right', 'bottom', 'left') as $component) { + if (!isset($pStyles['borders'][$component])) { + $pStyles['borders'][$component] = $pStyles['borders']['outline']; + } + } + unset($pStyles['borders']['outline']); // not needed any more + } + // 'inside' is a shorthand property for 'vertical' and 'horizontal' + // it applies to components that have not been set explicitly + if (isset($pStyles['borders']['inside'])) { + foreach (array('vertical', 'horizontal') as $component) { + if (!isset($pStyles['borders'][$component])) { + $pStyles['borders'][$component] = $pStyles['borders']['inside']; + } + } + unset($pStyles['borders']['inside']); // not needed any more + } + // width and height characteristics of selection, 1, 2, or 3 (for 3 or more) + $xMax = min($rangeEnd[0] - $rangeStart[0] + 1, 3); + $yMax = min($rangeEnd[1] - $rangeStart[1] + 1, 3); + + // loop through up to 3 x 3 = 9 regions + for ($x = 1; $x <= $xMax; ++$x) { + // start column index for region + $colStart = ($x == 3) ? + PHPExcel_Cell::stringFromColumnIndex($rangeEnd[0]) + : PHPExcel_Cell::stringFromColumnIndex($rangeStart[0] + $x - 1); + // end column index for region + $colEnd = ($x == 1) ? + PHPExcel_Cell::stringFromColumnIndex($rangeStart[0]) + : PHPExcel_Cell::stringFromColumnIndex($rangeEnd[0] - $xMax + $x); + + for ($y = 1; $y <= $yMax; ++$y) { + // which edges are touching the region + $edges = array(); + if ($x == 1) { + // are we at left edge + $edges[] = 'left'; + } + if ($x == $xMax) { + // are we at right edge + $edges[] = 'right'; + } + if ($y == 1) { + // are we at top edge? + $edges[] = 'top'; + } + if ($y == $yMax) { + // are we at bottom edge? + $edges[] = 'bottom'; + } + + // start row index for region + $rowStart = ($y == 3) ? + $rangeEnd[1] : $rangeStart[1] + $y - 1; + + // end row index for region + $rowEnd = ($y == 1) ? + $rangeStart[1] : $rangeEnd[1] - $yMax + $y; + + // build range for region + $range = $colStart . $rowStart . ':' . $colEnd . $rowEnd; + + // retrieve relevant style array for region + $regionStyles = $pStyles; + unset($regionStyles['borders']['inside']); + + // what are the inner edges of the region when looking at the selection + $innerEdges = array_diff(array('top', 'right', 'bottom', 'left'), $edges); + + // inner edges that are not touching the region should take the 'inside' border properties if they have been set + foreach ($innerEdges as $innerEdge) { + switch ($innerEdge) { + case 'top': + case 'bottom': + // should pick up 'horizontal' border property if set + if (isset($pStyles['borders']['horizontal'])) { + $regionStyles['borders'][$innerEdge] = $pStyles['borders']['horizontal']; + } else { + unset($regionStyles['borders'][$innerEdge]); + } + break; + case 'left': + case 'right': + // should pick up 'vertical' border property if set + if (isset($pStyles['borders']['vertical'])) { + $regionStyles['borders'][$innerEdge] = $pStyles['borders']['vertical']; + } else { + unset($regionStyles['borders'][$innerEdge]); + } + break; + } + } + + // apply region style to region by calling applyFromArray() in simple mode + $this->getActiveSheet()->getStyle($range)->applyFromArray($regionStyles, false); + } + } + return $this; + } + + // SIMPLE MODE: + // Selection type, inspect + if (preg_match('/^[A-Z]+1:[A-Z]+1048576$/', $pRange)) { + $selectionType = 'COLUMN'; + } elseif (preg_match('/^A[0-9]+:XFD[0-9]+$/', $pRange)) { + $selectionType = 'ROW'; + } else { + $selectionType = 'CELL'; + } + + // First loop through columns, rows, or cells to find out which styles are affected by this operation + switch ($selectionType) { + case 'COLUMN': + $oldXfIndexes = array(); + for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) { + $oldXfIndexes[$this->getActiveSheet()->getColumnDimensionByColumn($col)->getXfIndex()] = true; + } + break; + case 'ROW': + $oldXfIndexes = array(); + for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) { + if ($this->getActiveSheet()->getRowDimension($row)->getXfIndex() == null) { + $oldXfIndexes[0] = true; // row without explicit style should be formatted based on default style + } else { + $oldXfIndexes[$this->getActiveSheet()->getRowDimension($row)->getXfIndex()] = true; + } + } + break; + case 'CELL': + $oldXfIndexes = array(); + for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) { + for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) { + $oldXfIndexes[$this->getActiveSheet()->getCellByColumnAndRow($col, $row)->getXfIndex()] = true; + } + } + break; + } + + // clone each of the affected styles, apply the style array, and add the new styles to the workbook + $workbook = $this->getActiveSheet()->getParent(); + foreach ($oldXfIndexes as $oldXfIndex => $dummy) { + $style = $workbook->getCellXfByIndex($oldXfIndex); + $newStyle = clone $style; + $newStyle->applyFromArray($pStyles); + + if ($existingStyle = $workbook->getCellXfByHashCode($newStyle->getHashCode())) { + // there is already such cell Xf in our collection + $newXfIndexes[$oldXfIndex] = $existingStyle->getIndex(); + } else { + // we don't have such a cell Xf, need to add + $workbook->addCellXf($newStyle); + $newXfIndexes[$oldXfIndex] = $newStyle->getIndex(); + } + } + + // Loop through columns, rows, or cells again and update the XF index + switch ($selectionType) { + case 'COLUMN': + for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) { + $columnDimension = $this->getActiveSheet()->getColumnDimensionByColumn($col); + $oldXfIndex = $columnDimension->getXfIndex(); + $columnDimension->setXfIndex($newXfIndexes[$oldXfIndex]); + } + break; + + case 'ROW': + for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) { + $rowDimension = $this->getActiveSheet()->getRowDimension($row); + $oldXfIndex = $rowDimension->getXfIndex() === null ? + 0 : $rowDimension->getXfIndex(); // row without explicit style should be formatted based on default style + $rowDimension->setXfIndex($newXfIndexes[$oldXfIndex]); + } + break; + + case 'CELL': + for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) { + for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) { + $cell = $this->getActiveSheet()->getCellByColumnAndRow($col, $row); + $oldXfIndex = $cell->getXfIndex(); + $cell->setXfIndex($newXfIndexes[$oldXfIndex]); + } + } + break; + } + + } else { + // not a supervisor, just apply the style array directly on style object + if (array_key_exists('fill', $pStyles)) { + $this->getFill()->applyFromArray($pStyles['fill']); + } + if (array_key_exists('font', $pStyles)) { + $this->getFont()->applyFromArray($pStyles['font']); + } + if (array_key_exists('borders', $pStyles)) { + $this->getBorders()->applyFromArray($pStyles['borders']); + } + if (array_key_exists('alignment', $pStyles)) { + $this->getAlignment()->applyFromArray($pStyles['alignment']); + } + if (array_key_exists('numberformat', $pStyles)) { + $this->getNumberFormat()->applyFromArray($pStyles['numberformat']); + } + if (array_key_exists('protection', $pStyles)) { + $this->getProtection()->applyFromArray($pStyles['protection']); + } + if (array_key_exists('quotePrefix', $pStyles)) { + $this->quotePrefix = $pStyles['quotePrefix']; + } + } + } else { + throw new PHPExcel_Exception("Invalid style array passed."); + } + return $this; + } + + /** + * Get Fill + * + * @return PHPExcel_Style_Fill + */ + public function getFill() + { + return $this->fill; + } + + /** + * Get Font + * + * @return PHPExcel_Style_Font + */ + public function getFont() + { + return $this->font; + } + + /** + * Set font + * + * @param PHPExcel_Style_Font $font + * @return PHPExcel_Style + */ + public function setFont(PHPExcel_Style_Font $font) + { + $this->font = $font; + return $this; + } + + /** + * Get Borders + * + * @return PHPExcel_Style_Borders + */ + public function getBorders() + { + return $this->borders; + } + + /** + * Get Alignment + * + * @return PHPExcel_Style_Alignment + */ + public function getAlignment() + { + return $this->alignment; + } + + /** + * Get Number Format + * + * @return PHPExcel_Style_NumberFormat + */ + public function getNumberFormat() + { + return $this->numberFormat; + } + + /** + * Get Conditional Styles. Only used on supervisor. + * + * @return PHPExcel_Style_Conditional[] + */ + public function getConditionalStyles() + { + return $this->getActiveSheet()->getConditionalStyles($this->getActiveCell()); + } + + /** + * Set Conditional Styles. Only used on supervisor. + * + * @param PHPExcel_Style_Conditional[] $pValue Array of condtional styles + * @return PHPExcel_Style + */ + public function setConditionalStyles($pValue = null) + { + if (is_array($pValue)) { + $this->getActiveSheet()->setConditionalStyles($this->getSelectedCells(), $pValue); + } + return $this; + } + + /** + * Get Protection + * + * @return PHPExcel_Style_Protection + */ + public function getProtection() + { + return $this->protection; + } + + /** + * Get quote prefix + * + * @return boolean + */ + public function getQuotePrefix() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getQuotePrefix(); + } + return $this->quotePrefix; + } + + /** + * Set quote prefix + * + * @param boolean $pValue + */ + public function setQuotePrefix($pValue) + { + if ($pValue == '') { + $pValue = false; + } + if ($this->isSupervisor) { + $styleArray = array('quotePrefix' => $pValue); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->quotePrefix = (boolean) $pValue; + } + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + $hashConditionals = ''; + foreach ($this->conditionalStyles as $conditional) { + $hashConditionals .= $conditional->getHashCode(); + } + + return md5( + $this->fill->getHashCode() . + $this->font->getHashCode() . + $this->borders->getHashCode() . + $this->alignment->getHashCode() . + $this->numberFormat->getHashCode() . + $hashConditionals . + $this->protection->getHashCode() . + ($this->quotePrefix ? 't' : 'f') . + __CLASS__ + ); + } + + /** + * Get own index in style collection + * + * @return int + */ + public function getIndex() + { + return $this->index; + } + + /** + * Set own index in style collection + * + * @param int $pValue + */ + public function setIndex($pValue) + { + $this->index = $pValue; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Style/Alignment.php b/application/third_party/PHPExcel/PHPExcel/Style/Alignment.php new file mode 100644 index 0000000..bfc4947 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Style/Alignment.php @@ -0,0 +1,464 @@ +<?php +/** + * PHPExcel_Style_Alignment + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Style_Alignment extends PHPExcel_Style_Supervisor implements PHPExcel_IComparable +{ + /* Horizontal alignment styles */ + const HORIZONTAL_GENERAL = 'general'; + const HORIZONTAL_LEFT = 'left'; + const HORIZONTAL_RIGHT = 'right'; + const HORIZONTAL_CENTER = 'center'; + const HORIZONTAL_CENTER_CONTINUOUS = 'centerContinuous'; + const HORIZONTAL_JUSTIFY = 'justify'; + const HORIZONTAL_FILL = 'fill'; + const HORIZONTAL_DISTRIBUTED = 'distributed'; // Excel2007 only + + /* Vertical alignment styles */ + const VERTICAL_BOTTOM = 'bottom'; + const VERTICAL_TOP = 'top'; + const VERTICAL_CENTER = 'center'; + const VERTICAL_JUSTIFY = 'justify'; + const VERTICAL_DISTRIBUTED = 'distributed'; // Excel2007 only + + /* Read order */ + const READORDER_CONTEXT = 0; + const READORDER_LTR = 1; + const READORDER_RTL = 2; + + /** + * Horizontal alignment + * + * @var string + */ + protected $horizontal = PHPExcel_Style_Alignment::HORIZONTAL_GENERAL; + + /** + * Vertical alignment + * + * @var string + */ + protected $vertical = PHPExcel_Style_Alignment::VERTICAL_BOTTOM; + + /** + * Text rotation + * + * @var integer + */ + protected $textRotation = 0; + + /** + * Wrap text + * + * @var boolean + */ + protected $wrapText = false; + + /** + * Shrink to fit + * + * @var boolean + */ + protected $shrinkToFit = false; + + /** + * Indent - only possible with horizontal alignment left and right + * + * @var integer + */ + protected $indent = 0; + + /** + * Read order + * + * @var integer + */ + protected $readorder = 0; + + /** + * Create a new PHPExcel_Style_Alignment + * + * @param boolean $isSupervisor Flag indicating if this is a supervisor or not + * Leave this value at default unless you understand exactly what + * its ramifications are + * @param boolean $isConditional Flag indicating if this is a conditional style or not + * Leave this value at default unless you understand exactly what + * its ramifications are + */ + public function __construct($isSupervisor = false, $isConditional = false) + { + // Supervisor? + parent::__construct($isSupervisor); + + if ($isConditional) { + $this->horizontal = null; + $this->vertical = null; + $this->textRotation = null; + } + } + + /** + * Get the shared style component for the currently active cell in currently active sheet. + * Only used for style supervisor + * + * @return PHPExcel_Style_Alignment + */ + public function getSharedComponent() + { + return $this->parent->getSharedComponent()->getAlignment(); + } + + /** + * Build style array from subcomponents + * + * @param array $array + * @return array + */ + public function getStyleArray($array) + { + return array('alignment' => $array); + } + + /** + * Apply styles from array + * + * <code> + * $objPHPExcel->getActiveSheet()->getStyle('B2')->getAlignment()->applyFromArray( + * array( + * 'horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER, + * 'vertical' => PHPExcel_Style_Alignment::VERTICAL_CENTER, + * 'rotation' => 0, + * 'wrap' => TRUE + * ) + * ); + * </code> + * + * @param array $pStyles Array containing style information + * @throws PHPExcel_Exception + * @return PHPExcel_Style_Alignment + */ + public function applyFromArray($pStyles = null) + { + if (is_array($pStyles)) { + if ($this->isSupervisor) { + $this->getActiveSheet()->getStyle($this->getSelectedCells()) + ->applyFromArray($this->getStyleArray($pStyles)); + } else { + if (isset($pStyles['horizontal'])) { + $this->setHorizontal($pStyles['horizontal']); + } + if (isset($pStyles['vertical'])) { + $this->setVertical($pStyles['vertical']); + } + if (isset($pStyles['rotation'])) { + $this->setTextRotation($pStyles['rotation']); + } + if (isset($pStyles['wrap'])) { + $this->setWrapText($pStyles['wrap']); + } + if (isset($pStyles['shrinkToFit'])) { + $this->setShrinkToFit($pStyles['shrinkToFit']); + } + if (isset($pStyles['indent'])) { + $this->setIndent($pStyles['indent']); + } + if (isset($pStyles['readorder'])) { + $this->setReadorder($pStyles['readorder']); + } + } + } else { + throw new PHPExcel_Exception("Invalid style array passed."); + } + return $this; + } + + /** + * Get Horizontal + * + * @return string + */ + public function getHorizontal() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getHorizontal(); + } + return $this->horizontal; + } + + /** + * Set Horizontal + * + * @param string $pValue + * @return PHPExcel_Style_Alignment + */ + public function setHorizontal($pValue = PHPExcel_Style_Alignment::HORIZONTAL_GENERAL) + { + if ($pValue == '') { + $pValue = PHPExcel_Style_Alignment::HORIZONTAL_GENERAL; + } + + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('horizontal' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->horizontal = $pValue; + } + return $this; + } + + /** + * Get Vertical + * + * @return string + */ + public function getVertical() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getVertical(); + } + return $this->vertical; + } + + /** + * Set Vertical + * + * @param string $pValue + * @return PHPExcel_Style_Alignment + */ + public function setVertical($pValue = PHPExcel_Style_Alignment::VERTICAL_BOTTOM) + { + if ($pValue == '') { + $pValue = PHPExcel_Style_Alignment::VERTICAL_BOTTOM; + } + + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('vertical' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->vertical = $pValue; + } + return $this; + } + + /** + * Get TextRotation + * + * @return int + */ + public function getTextRotation() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getTextRotation(); + } + return $this->textRotation; + } + + /** + * Set TextRotation + * + * @param int $pValue + * @throws PHPExcel_Exception + * @return PHPExcel_Style_Alignment + */ + public function setTextRotation($pValue = 0) + { + // Excel2007 value 255 => PHPExcel value -165 + if ($pValue == 255) { + $pValue = -165; + } + + // Set rotation + if (($pValue >= -90 && $pValue <= 90) || $pValue == -165) { + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('rotation' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->textRotation = $pValue; + } + } else { + throw new PHPExcel_Exception("Text rotation should be a value between -90 and 90."); + } + + return $this; + } + + /** + * Get Wrap Text + * + * @return boolean + */ + public function getWrapText() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getWrapText(); + } + return $this->wrapText; + } + + /** + * Set Wrap Text + * + * @param boolean $pValue + * @return PHPExcel_Style_Alignment + */ + public function setWrapText($pValue = false) + { + if ($pValue == '') { + $pValue = false; + } + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('wrap' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->wrapText = $pValue; + } + return $this; + } + + /** + * Get Shrink to fit + * + * @return boolean + */ + public function getShrinkToFit() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getShrinkToFit(); + } + return $this->shrinkToFit; + } + + /** + * Set Shrink to fit + * + * @param boolean $pValue + * @return PHPExcel_Style_Alignment + */ + public function setShrinkToFit($pValue = false) + { + if ($pValue == '') { + $pValue = false; + } + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('shrinkToFit' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->shrinkToFit = $pValue; + } + return $this; + } + + /** + * Get indent + * + * @return int + */ + public function getIndent() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getIndent(); + } + return $this->indent; + } + + /** + * Set indent + * + * @param int $pValue + * @return PHPExcel_Style_Alignment + */ + public function setIndent($pValue = 0) + { + if ($pValue > 0) { + if ($this->getHorizontal() != self::HORIZONTAL_GENERAL && + $this->getHorizontal() != self::HORIZONTAL_LEFT && + $this->getHorizontal() != self::HORIZONTAL_RIGHT) { + $pValue = 0; // indent not supported + } + } + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('indent' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->indent = $pValue; + } + return $this; + } + + /** + * Get read order + * + * @return integer + */ + public function getReadorder() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getReadorder(); + } + return $this->readorder; + } + + /** + * Set read order + * + * @param int $pValue + * @return PHPExcel_Style_Alignment + */ + public function setReadorder($pValue = 0) + { + if ($pValue < 0 || $pValue > 2) { + $pValue = 0; + } + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('readorder' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->readorder = $pValue; + } + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getHashCode(); + } + return md5( + $this->horizontal . + $this->vertical . + $this->textRotation . + ($this->wrapText ? 't' : 'f') . + ($this->shrinkToFit ? 't' : 'f') . + $this->indent . + $this->readorder . + __CLASS__ + ); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Style/Border.php b/application/third_party/PHPExcel/PHPExcel/Style/Border.php new file mode 100644 index 0000000..55efc50 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Style/Border.php @@ -0,0 +1,282 @@ +<?php + +/** + * PHPExcel_Style_Border + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Style_Border extends PHPExcel_Style_Supervisor implements PHPExcel_IComparable +{ + /* Border style */ + const BORDER_NONE = 'none'; + const BORDER_DASHDOT = 'dashDot'; + const BORDER_DASHDOTDOT = 'dashDotDot'; + const BORDER_DASHED = 'dashed'; + const BORDER_DOTTED = 'dotted'; + const BORDER_DOUBLE = 'double'; + const BORDER_HAIR = 'hair'; + const BORDER_MEDIUM = 'medium'; + const BORDER_MEDIUMDASHDOT = 'mediumDashDot'; + const BORDER_MEDIUMDASHDOTDOT = 'mediumDashDotDot'; + const BORDER_MEDIUMDASHED = 'mediumDashed'; + const BORDER_SLANTDASHDOT = 'slantDashDot'; + const BORDER_THICK = 'thick'; + const BORDER_THIN = 'thin'; + + /** + * Border style + * + * @var string + */ + protected $borderStyle = PHPExcel_Style_Border::BORDER_NONE; + + /** + * Border color + * + * @var PHPExcel_Style_Color + */ + protected $color; + + /** + * Parent property name + * + * @var string + */ + protected $parentPropertyName; + + /** + * Create a new PHPExcel_Style_Border + * + * @param boolean $isSupervisor Flag indicating if this is a supervisor or not + * Leave this value at default unless you understand exactly what + * its ramifications are + * @param boolean $isConditional Flag indicating if this is a conditional style or not + * Leave this value at default unless you understand exactly what + * its ramifications are + */ + public function __construct($isSupervisor = false, $isConditional = false) + { + // Supervisor? + parent::__construct($isSupervisor); + + // Initialise values + $this->color = new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_BLACK, $isSupervisor); + + // bind parent if we are a supervisor + if ($isSupervisor) { + $this->color->bindParent($this, 'color'); + } + } + + /** + * Bind parent. Only used for supervisor + * + * @param PHPExcel_Style_Borders $parent + * @param string $parentPropertyName + * @return PHPExcel_Style_Border + */ + public function bindParent($parent, $parentPropertyName = null) + { + $this->parent = $parent; + $this->parentPropertyName = $parentPropertyName; + return $this; + } + + /** + * Get the shared style component for the currently active cell in currently active sheet. + * Only used for style supervisor + * + * @return PHPExcel_Style_Border + * @throws PHPExcel_Exception + */ + public function getSharedComponent() + { + switch ($this->parentPropertyName) { + case 'allBorders': + case 'horizontal': + case 'inside': + case 'outline': + case 'vertical': + throw new PHPExcel_Exception('Cannot get shared component for a pseudo-border.'); + break; + case 'bottom': + return $this->parent->getSharedComponent()->getBottom(); + case 'diagonal': + return $this->parent->getSharedComponent()->getDiagonal(); + case 'left': + return $this->parent->getSharedComponent()->getLeft(); + case 'right': + return $this->parent->getSharedComponent()->getRight(); + case 'top': + return $this->parent->getSharedComponent()->getTop(); + } + } + + /** + * Build style array from subcomponents + * + * @param array $array + * @return array + */ + public function getStyleArray($array) + { + switch ($this->parentPropertyName) { + case 'allBorders': + case 'bottom': + case 'diagonal': + case 'horizontal': + case 'inside': + case 'left': + case 'outline': + case 'right': + case 'top': + case 'vertical': + $key = strtolower('vertical'); + break; + } + return $this->parent->getStyleArray(array($key => $array)); + } + + /** + * Apply styles from array + * + * <code> + * $objPHPExcel->getActiveSheet()->getStyle('B2')->getBorders()->getTop()->applyFromArray( + * array( + * 'style' => PHPExcel_Style_Border::BORDER_DASHDOT, + * 'color' => array( + * 'rgb' => '808080' + * ) + * ) + * ); + * </code> + * + * @param array $pStyles Array containing style information + * @throws PHPExcel_Exception + * @return PHPExcel_Style_Border + */ + public function applyFromArray($pStyles = null) + { + if (is_array($pStyles)) { + if ($this->isSupervisor) { + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); + } else { + if (isset($pStyles['style'])) { + $this->setBorderStyle($pStyles['style']); + } + if (isset($pStyles['color'])) { + $this->getColor()->applyFromArray($pStyles['color']); + } + } + } else { + throw new PHPExcel_Exception("Invalid style array passed."); + } + return $this; + } + + /** + * Get Border style + * + * @return string + */ + public function getBorderStyle() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getBorderStyle(); + } + return $this->borderStyle; + } + + /** + * Set Border style + * + * @param string|boolean $pValue + * When passing a boolean, FALSE equates PHPExcel_Style_Border::BORDER_NONE + * and TRUE to PHPExcel_Style_Border::BORDER_MEDIUM + * @return PHPExcel_Style_Border + */ + public function setBorderStyle($pValue = PHPExcel_Style_Border::BORDER_NONE) + { + + if (empty($pValue)) { + $pValue = PHPExcel_Style_Border::BORDER_NONE; + } elseif (is_bool($pValue) && $pValue) { + $pValue = PHPExcel_Style_Border::BORDER_MEDIUM; + } + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('style' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->borderStyle = $pValue; + } + return $this; + } + + /** + * Get Border Color + * + * @return PHPExcel_Style_Color + */ + public function getColor() + { + return $this->color; + } + + /** + * Set Border Color + * + * @param PHPExcel_Style_Color $pValue + * @throws PHPExcel_Exception + * @return PHPExcel_Style_Border + */ + public function setColor(PHPExcel_Style_Color $pValue = null) + { + // make sure parameter is a real color and not a supervisor + $color = $pValue->getIsSupervisor() ? $pValue->getSharedComponent() : $pValue; + + if ($this->isSupervisor) { + $styleArray = $this->getColor()->getStyleArray(array('argb' => $color->getARGB())); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->color = $color; + } + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getHashCode(); + } + return md5( + $this->borderStyle . + $this->color->getHashCode() . + __CLASS__ + ); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Style/Borders.php b/application/third_party/PHPExcel/PHPExcel/Style/Borders.php new file mode 100644 index 0000000..27c40a4 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Style/Borders.php @@ -0,0 +1,429 @@ +<?php + +/** + * PHPExcel_Style_Borders + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Style_Borders extends PHPExcel_Style_Supervisor implements PHPExcel_IComparable +{ + /* Diagonal directions */ + const DIAGONAL_NONE = 0; + const DIAGONAL_UP = 1; + const DIAGONAL_DOWN = 2; + const DIAGONAL_BOTH = 3; + + /** + * Left + * + * @var PHPExcel_Style_Border + */ + protected $left; + + /** + * Right + * + * @var PHPExcel_Style_Border + */ + protected $right; + + /** + * Top + * + * @var PHPExcel_Style_Border + */ + protected $top; + + /** + * Bottom + * + * @var PHPExcel_Style_Border + */ + protected $bottom; + + /** + * Diagonal + * + * @var PHPExcel_Style_Border + */ + protected $diagonal; + + /** + * DiagonalDirection + * + * @var int + */ + protected $diagonalDirection; + + /** + * All borders psedo-border. Only applies to supervisor. + * + * @var PHPExcel_Style_Border + */ + protected $allBorders; + + /** + * Outline psedo-border. Only applies to supervisor. + * + * @var PHPExcel_Style_Border + */ + protected $outline; + + /** + * Inside psedo-border. Only applies to supervisor. + * + * @var PHPExcel_Style_Border + */ + protected $inside; + + /** + * Vertical pseudo-border. Only applies to supervisor. + * + * @var PHPExcel_Style_Border + */ + protected $vertical; + + /** + * Horizontal pseudo-border. Only applies to supervisor. + * + * @var PHPExcel_Style_Border + */ + protected $horizontal; + + /** + * Create a new PHPExcel_Style_Borders + * + * @param boolean $isSupervisor Flag indicating if this is a supervisor or not + * Leave this value at default unless you understand exactly what + * its ramifications are + * @param boolean $isConditional Flag indicating if this is a conditional style or not + * Leave this value at default unless you understand exactly what + * its ramifications are + */ + public function __construct($isSupervisor = false, $isConditional = false) + { + // Supervisor? + parent::__construct($isSupervisor); + + // Initialise values + $this->left = new PHPExcel_Style_Border($isSupervisor, $isConditional); + $this->right = new PHPExcel_Style_Border($isSupervisor, $isConditional); + $this->top = new PHPExcel_Style_Border($isSupervisor, $isConditional); + $this->bottom = new PHPExcel_Style_Border($isSupervisor, $isConditional); + $this->diagonal = new PHPExcel_Style_Border($isSupervisor, $isConditional); + $this->diagonalDirection = PHPExcel_Style_Borders::DIAGONAL_NONE; + + // Specially for supervisor + if ($isSupervisor) { + // Initialize pseudo-borders + $this->allBorders = new PHPExcel_Style_Border(true); + $this->outline = new PHPExcel_Style_Border(true); + $this->inside = new PHPExcel_Style_Border(true); + $this->vertical = new PHPExcel_Style_Border(true); + $this->horizontal = new PHPExcel_Style_Border(true); + + // bind parent if we are a supervisor + $this->left->bindParent($this, 'left'); + $this->right->bindParent($this, 'right'); + $this->top->bindParent($this, 'top'); + $this->bottom->bindParent($this, 'bottom'); + $this->diagonal->bindParent($this, 'diagonal'); + $this->allBorders->bindParent($this, 'allBorders'); + $this->outline->bindParent($this, 'outline'); + $this->inside->bindParent($this, 'inside'); + $this->vertical->bindParent($this, 'vertical'); + $this->horizontal->bindParent($this, 'horizontal'); + } + } + + /** + * Get the shared style component for the currently active cell in currently active sheet. + * Only used for style supervisor + * + * @return PHPExcel_Style_Borders + */ + public function getSharedComponent() + { + return $this->parent->getSharedComponent()->getBorders(); + } + + /** + * Build style array from subcomponents + * + * @param array $array + * @return array + */ + public function getStyleArray($array) + { + return array('borders' => $array); + } + + /** + * Apply styles from array + * + * <code> + * $objPHPExcel->getActiveSheet()->getStyle('B2')->getBorders()->applyFromArray( + * array( + * 'bottom' => array( + * 'style' => PHPExcel_Style_Border::BORDER_DASHDOT, + * 'color' => array( + * 'rgb' => '808080' + * ) + * ), + * 'top' => array( + * 'style' => PHPExcel_Style_Border::BORDER_DASHDOT, + * 'color' => array( + * 'rgb' => '808080' + * ) + * ) + * ) + * ); + * </code> + * <code> + * $objPHPExcel->getActiveSheet()->getStyle('B2')->getBorders()->applyFromArray( + * array( + * 'allborders' => array( + * 'style' => PHPExcel_Style_Border::BORDER_DASHDOT, + * 'color' => array( + * 'rgb' => '808080' + * ) + * ) + * ) + * ); + * </code> + * + * @param array $pStyles Array containing style information + * @throws PHPExcel_Exception + * @return PHPExcel_Style_Borders + */ + public function applyFromArray($pStyles = null) + { + if (is_array($pStyles)) { + if ($this->isSupervisor) { + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); + } else { + if (array_key_exists('left', $pStyles)) { + $this->getLeft()->applyFromArray($pStyles['left']); + } + if (array_key_exists('right', $pStyles)) { + $this->getRight()->applyFromArray($pStyles['right']); + } + if (array_key_exists('top', $pStyles)) { + $this->getTop()->applyFromArray($pStyles['top']); + } + if (array_key_exists('bottom', $pStyles)) { + $this->getBottom()->applyFromArray($pStyles['bottom']); + } + if (array_key_exists('diagonal', $pStyles)) { + $this->getDiagonal()->applyFromArray($pStyles['diagonal']); + } + if (array_key_exists('diagonaldirection', $pStyles)) { + $this->setDiagonalDirection($pStyles['diagonaldirection']); + } + if (array_key_exists('allborders', $pStyles)) { + $this->getLeft()->applyFromArray($pStyles['allborders']); + $this->getRight()->applyFromArray($pStyles['allborders']); + $this->getTop()->applyFromArray($pStyles['allborders']); + $this->getBottom()->applyFromArray($pStyles['allborders']); + } + } + } else { + throw new PHPExcel_Exception("Invalid style array passed."); + } + return $this; + } + + /** + * Get Left + * + * @return PHPExcel_Style_Border + */ + public function getLeft() + { + return $this->left; + } + + /** + * Get Right + * + * @return PHPExcel_Style_Border + */ + public function getRight() + { + return $this->right; + } + + /** + * Get Top + * + * @return PHPExcel_Style_Border + */ + public function getTop() + { + return $this->top; + } + + /** + * Get Bottom + * + * @return PHPExcel_Style_Border + */ + public function getBottom() + { + return $this->bottom; + } + + /** + * Get Diagonal + * + * @return PHPExcel_Style_Border + */ + public function getDiagonal() + { + return $this->diagonal; + } + + /** + * Get AllBorders (pseudo-border). Only applies to supervisor. + * + * @return PHPExcel_Style_Border + * @throws PHPExcel_Exception + */ + public function getAllBorders() + { + if (!$this->isSupervisor) { + throw new PHPExcel_Exception('Can only get pseudo-border for supervisor.'); + } + return $this->allBorders; + } + + /** + * Get Outline (pseudo-border). Only applies to supervisor. + * + * @return boolean + * @throws PHPExcel_Exception + */ + public function getOutline() + { + if (!$this->isSupervisor) { + throw new PHPExcel_Exception('Can only get pseudo-border for supervisor.'); + } + return $this->outline; + } + + /** + * Get Inside (pseudo-border). Only applies to supervisor. + * + * @return boolean + * @throws PHPExcel_Exception + */ + public function getInside() + { + if (!$this->isSupervisor) { + throw new PHPExcel_Exception('Can only get pseudo-border for supervisor.'); + } + return $this->inside; + } + + /** + * Get Vertical (pseudo-border). Only applies to supervisor. + * + * @return PHPExcel_Style_Border + * @throws PHPExcel_Exception + */ + public function getVertical() + { + if (!$this->isSupervisor) { + throw new PHPExcel_Exception('Can only get pseudo-border for supervisor.'); + } + return $this->vertical; + } + + /** + * Get Horizontal (pseudo-border). Only applies to supervisor. + * + * @return PHPExcel_Style_Border + * @throws PHPExcel_Exception + */ + public function getHorizontal() + { + if (!$this->isSupervisor) { + throw new PHPExcel_Exception('Can only get pseudo-border for supervisor.'); + } + return $this->horizontal; + } + + /** + * Get DiagonalDirection + * + * @return int + */ + public function getDiagonalDirection() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getDiagonalDirection(); + } + return $this->diagonalDirection; + } + + /** + * Set DiagonalDirection + * + * @param int $pValue + * @return PHPExcel_Style_Borders + */ + public function setDiagonalDirection($pValue = PHPExcel_Style_Borders::DIAGONAL_NONE) + { + if ($pValue == '') { + $pValue = PHPExcel_Style_Borders::DIAGONAL_NONE; + } + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('diagonaldirection' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->diagonalDirection = $pValue; + } + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getHashcode(); + } + return md5( + $this->getLeft()->getHashCode() . + $this->getRight()->getHashCode() . + $this->getTop()->getHashCode() . + $this->getBottom()->getHashCode() . + $this->getDiagonal()->getHashCode() . + $this->getDiagonalDirection() . + __CLASS__ + ); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Style/Color.php b/application/third_party/PHPExcel/PHPExcel/Style/Color.php new file mode 100644 index 0000000..9c7790f --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Style/Color.php @@ -0,0 +1,443 @@ +<?php + +/** + * PHPExcel_Style_Color + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Style_Color extends PHPExcel_Style_Supervisor implements PHPExcel_IComparable +{ + /* Colors */ + const COLOR_BLACK = 'FF000000'; + const COLOR_WHITE = 'FFFFFFFF'; + const COLOR_RED = 'FFFF0000'; + const COLOR_DARKRED = 'FF800000'; + const COLOR_BLUE = 'FF0000FF'; + const COLOR_DARKBLUE = 'FF000080'; + const COLOR_GREEN = 'FF00FF00'; + const COLOR_DARKGREEN = 'FF008000'; + const COLOR_YELLOW = 'FFFFFF00'; + const COLOR_DARKYELLOW = 'FF808000'; + + /** + * Indexed colors array + * + * @var array + */ + protected static $indexedColors; + + /** + * ARGB - Alpha RGB + * + * @var string + */ + protected $argb = null; + + /** + * Parent property name + * + * @var string + */ + protected $parentPropertyName; + + + /** + * Create a new PHPExcel_Style_Color + * + * @param string $pARGB ARGB value for the colour + * @param boolean $isSupervisor Flag indicating if this is a supervisor or not + * Leave this value at default unless you understand exactly what + * its ramifications are + * @param boolean $isConditional Flag indicating if this is a conditional style or not + * Leave this value at default unless you understand exactly what + * its ramifications are + */ + public function __construct($pARGB = PHPExcel_Style_Color::COLOR_BLACK, $isSupervisor = false, $isConditional = false) + { + // Supervisor? + parent::__construct($isSupervisor); + + // Initialise values + if (!$isConditional) { + $this->argb = $pARGB; + } + } + + /** + * Bind parent. Only used for supervisor + * + * @param mixed $parent + * @param string $parentPropertyName + * @return PHPExcel_Style_Color + */ + public function bindParent($parent, $parentPropertyName = null) + { + $this->parent = $parent; + $this->parentPropertyName = $parentPropertyName; + return $this; + } + + /** + * Get the shared style component for the currently active cell in currently active sheet. + * Only used for style supervisor + * + * @return PHPExcel_Style_Color + */ + public function getSharedComponent() + { + switch ($this->parentPropertyName) { + case 'endColor': + return $this->parent->getSharedComponent()->getEndColor(); + case 'color': + return $this->parent->getSharedComponent()->getColor(); + case 'startColor': + return $this->parent->getSharedComponent()->getStartColor(); + } + } + + /** + * Build style array from subcomponents + * + * @param array $array + * @return array + */ + public function getStyleArray($array) + { + switch ($this->parentPropertyName) { + case 'endColor': + $key = 'endcolor'; + break; + case 'color': + $key = 'color'; + break; + case 'startColor': + $key = 'startcolor'; + break; + + } + return $this->parent->getStyleArray(array($key => $array)); + } + + /** + * Apply styles from array + * + * <code> + * $objPHPExcel->getActiveSheet()->getStyle('B2')->getFont()->getColor()->applyFromArray( array('rgb' => '808080') ); + * </code> + * + * @param array $pStyles Array containing style information + * @throws PHPExcel_Exception + * @return PHPExcel_Style_Color + */ + public function applyFromArray($pStyles = null) + { + if (is_array($pStyles)) { + if ($this->isSupervisor) { + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); + } else { + if (array_key_exists('rgb', $pStyles)) { + $this->setRGB($pStyles['rgb']); + } + if (array_key_exists('argb', $pStyles)) { + $this->setARGB($pStyles['argb']); + } + } + } else { + throw new PHPExcel_Exception("Invalid style array passed."); + } + return $this; + } + + /** + * Get ARGB + * + * @return string + */ + public function getARGB() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getARGB(); + } + return $this->argb; + } + + /** + * Set ARGB + * + * @param string $pValue + * @return PHPExcel_Style_Color + */ + public function setARGB($pValue = PHPExcel_Style_Color::COLOR_BLACK) + { + if ($pValue == '') { + $pValue = PHPExcel_Style_Color::COLOR_BLACK; + } + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('argb' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->argb = $pValue; + } + return $this; + } + + /** + * Get RGB + * + * @return string + */ + public function getRGB() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getRGB(); + } + return substr($this->argb, 2); + } + + /** + * Set RGB + * + * @param string $pValue RGB value + * @return PHPExcel_Style_Color + */ + public function setRGB($pValue = '000000') + { + if ($pValue == '') { + $pValue = '000000'; + } + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('argb' => 'FF' . $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->argb = 'FF' . $pValue; + } + return $this; + } + + /** + * Get a specified colour component of an RGB value + * + * @private + * @param string $RGB The colour as an RGB value (e.g. FF00CCCC or CCDDEE + * @param int $offset Position within the RGB value to extract + * @param boolean $hex Flag indicating whether the component should be returned as a hex or a + * decimal value + * @return string The extracted colour component + */ + private static function getColourComponent($RGB, $offset, $hex = true) + { + $colour = substr($RGB, $offset, 2); + if (!$hex) { + $colour = hexdec($colour); + } + return $colour; + } + + /** + * Get the red colour component of an RGB value + * + * @param string $RGB The colour as an RGB value (e.g. FF00CCCC or CCDDEE + * @param boolean $hex Flag indicating whether the component should be returned as a hex or a + * decimal value + * @return string The red colour component + */ + public static function getRed($RGB, $hex = true) + { + return self::getColourComponent($RGB, strlen($RGB) - 6, $hex); + } + + /** + * Get the green colour component of an RGB value + * + * @param string $RGB The colour as an RGB value (e.g. FF00CCCC or CCDDEE + * @param boolean $hex Flag indicating whether the component should be returned as a hex or a + * decimal value + * @return string The green colour component + */ + public static function getGreen($RGB, $hex = true) + { + return self::getColourComponent($RGB, strlen($RGB) - 4, $hex); + } + + /** + * Get the blue colour component of an RGB value + * + * @param string $RGB The colour as an RGB value (e.g. FF00CCCC or CCDDEE + * @param boolean $hex Flag indicating whether the component should be returned as a hex or a + * decimal value + * @return string The blue colour component + */ + public static function getBlue($RGB, $hex = true) + { + return self::getColourComponent($RGB, strlen($RGB) - 2, $hex); + } + + /** + * Adjust the brightness of a color + * + * @param string $hex The colour as an RGBA or RGB value (e.g. FF00CCCC or CCDDEE) + * @param float $adjustPercentage The percentage by which to adjust the colour as a float from -1 to 1 + * @return string The adjusted colour as an RGBA or RGB value (e.g. FF00CCCC or CCDDEE) + */ + public static function changeBrightness($hex, $adjustPercentage) + { + $rgba = (strlen($hex) == 8); + + $red = self::getRed($hex, false); + $green = self::getGreen($hex, false); + $blue = self::getBlue($hex, false); + if ($adjustPercentage > 0) { + $red += (255 - $red) * $adjustPercentage; + $green += (255 - $green) * $adjustPercentage; + $blue += (255 - $blue) * $adjustPercentage; + } else { + $red += $red * $adjustPercentage; + $green += $green * $adjustPercentage; + $blue += $blue * $adjustPercentage; + } + + if ($red < 0) { + $red = 0; + } elseif ($red > 255) { + $red = 255; + } + if ($green < 0) { + $green = 0; + } elseif ($green > 255) { + $green = 255; + } + if ($blue < 0) { + $blue = 0; + } elseif ($blue > 255) { + $blue = 255; + } + + $rgb = strtoupper( + str_pad(dechex($red), 2, '0', 0) . + str_pad(dechex($green), 2, '0', 0) . + str_pad(dechex($blue), 2, '0', 0) + ); + return (($rgba) ? 'FF' : '') . $rgb; + } + + /** + * Get indexed color + * + * @param int $pIndex Index entry point into the colour array + * @param boolean $background Flag to indicate whether default background or foreground colour + * should be returned if the indexed colour doesn't exist + * @return PHPExcel_Style_Color + */ + public static function indexedColor($pIndex, $background = false) + { + // Clean parameter + $pIndex = intval($pIndex); + + // Indexed colors + if (is_null(self::$indexedColors)) { + self::$indexedColors = array( + 1 => 'FF000000', // System Colour #1 - Black + 2 => 'FFFFFFFF', // System Colour #2 - White + 3 => 'FFFF0000', // System Colour #3 - Red + 4 => 'FF00FF00', // System Colour #4 - Green + 5 => 'FF0000FF', // System Colour #5 - Blue + 6 => 'FFFFFF00', // System Colour #6 - Yellow + 7 => 'FFFF00FF', // System Colour #7- Magenta + 8 => 'FF00FFFF', // System Colour #8- Cyan + 9 => 'FF800000', // Standard Colour #9 + 10 => 'FF008000', // Standard Colour #10 + 11 => 'FF000080', // Standard Colour #11 + 12 => 'FF808000', // Standard Colour #12 + 13 => 'FF800080', // Standard Colour #13 + 14 => 'FF008080', // Standard Colour #14 + 15 => 'FFC0C0C0', // Standard Colour #15 + 16 => 'FF808080', // Standard Colour #16 + 17 => 'FF9999FF', // Chart Fill Colour #17 + 18 => 'FF993366', // Chart Fill Colour #18 + 19 => 'FFFFFFCC', // Chart Fill Colour #19 + 20 => 'FFCCFFFF', // Chart Fill Colour #20 + 21 => 'FF660066', // Chart Fill Colour #21 + 22 => 'FFFF8080', // Chart Fill Colour #22 + 23 => 'FF0066CC', // Chart Fill Colour #23 + 24 => 'FFCCCCFF', // Chart Fill Colour #24 + 25 => 'FF000080', // Chart Line Colour #25 + 26 => 'FFFF00FF', // Chart Line Colour #26 + 27 => 'FFFFFF00', // Chart Line Colour #27 + 28 => 'FF00FFFF', // Chart Line Colour #28 + 29 => 'FF800080', // Chart Line Colour #29 + 30 => 'FF800000', // Chart Line Colour #30 + 31 => 'FF008080', // Chart Line Colour #31 + 32 => 'FF0000FF', // Chart Line Colour #32 + 33 => 'FF00CCFF', // Standard Colour #33 + 34 => 'FFCCFFFF', // Standard Colour #34 + 35 => 'FFCCFFCC', // Standard Colour #35 + 36 => 'FFFFFF99', // Standard Colour #36 + 37 => 'FF99CCFF', // Standard Colour #37 + 38 => 'FFFF99CC', // Standard Colour #38 + 39 => 'FFCC99FF', // Standard Colour #39 + 40 => 'FFFFCC99', // Standard Colour #40 + 41 => 'FF3366FF', // Standard Colour #41 + 42 => 'FF33CCCC', // Standard Colour #42 + 43 => 'FF99CC00', // Standard Colour #43 + 44 => 'FFFFCC00', // Standard Colour #44 + 45 => 'FFFF9900', // Standard Colour #45 + 46 => 'FFFF6600', // Standard Colour #46 + 47 => 'FF666699', // Standard Colour #47 + 48 => 'FF969696', // Standard Colour #48 + 49 => 'FF003366', // Standard Colour #49 + 50 => 'FF339966', // Standard Colour #50 + 51 => 'FF003300', // Standard Colour #51 + 52 => 'FF333300', // Standard Colour #52 + 53 => 'FF993300', // Standard Colour #53 + 54 => 'FF993366', // Standard Colour #54 + 55 => 'FF333399', // Standard Colour #55 + 56 => 'FF333333' // Standard Colour #56 + ); + } + + if (array_key_exists($pIndex, self::$indexedColors)) { + return new PHPExcel_Style_Color(self::$indexedColors[$pIndex]); + } + + if ($background) { + return new PHPExcel_Style_Color(self::COLOR_WHITE); + } + return new PHPExcel_Style_Color(self::COLOR_BLACK); + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getHashCode(); + } + return md5( + $this->argb . + __CLASS__ + ); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Style/Conditional.php b/application/third_party/PHPExcel/PHPExcel/Style/Conditional.php new file mode 100644 index 0000000..331362b --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Style/Conditional.php @@ -0,0 +1,293 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ + + +/** + * PHPExcel_Style_Conditional + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Style_Conditional implements PHPExcel_IComparable +{ + /* Condition types */ + const CONDITION_NONE = 'none'; + const CONDITION_CELLIS = 'cellIs'; + const CONDITION_CONTAINSTEXT = 'containsText'; + const CONDITION_EXPRESSION = 'expression'; + + /* Operator types */ + const OPERATOR_NONE = ''; + const OPERATOR_BEGINSWITH = 'beginsWith'; + const OPERATOR_ENDSWITH = 'endsWith'; + const OPERATOR_EQUAL = 'equal'; + const OPERATOR_GREATERTHAN = 'greaterThan'; + const OPERATOR_GREATERTHANOREQUAL = 'greaterThanOrEqual'; + const OPERATOR_LESSTHAN = 'lessThan'; + const OPERATOR_LESSTHANOREQUAL = 'lessThanOrEqual'; + const OPERATOR_NOTEQUAL = 'notEqual'; + const OPERATOR_CONTAINSTEXT = 'containsText'; + const OPERATOR_NOTCONTAINS = 'notContains'; + const OPERATOR_BETWEEN = 'between'; + + /** + * Condition type + * + * @var int + */ + private $conditionType; + + /** + * Operator type + * + * @var int + */ + private $operatorType; + + /** + * Text + * + * @var string + */ + private $text; + + /** + * Condition + * + * @var string[] + */ + private $condition = array(); + + /** + * Style + * + * @var PHPExcel_Style + */ + private $style; + + /** + * Create a new PHPExcel_Style_Conditional + */ + public function __construct() + { + // Initialise values + $this->conditionType = PHPExcel_Style_Conditional::CONDITION_NONE; + $this->operatorType = PHPExcel_Style_Conditional::OPERATOR_NONE; + $this->text = null; + $this->condition = array(); + $this->style = new PHPExcel_Style(false, true); + } + + /** + * Get Condition type + * + * @return string + */ + public function getConditionType() + { + return $this->conditionType; + } + + /** + * Set Condition type + * + * @param string $pValue PHPExcel_Style_Conditional condition type + * @return PHPExcel_Style_Conditional + */ + public function setConditionType($pValue = PHPExcel_Style_Conditional::CONDITION_NONE) + { + $this->conditionType = $pValue; + return $this; + } + + /** + * Get Operator type + * + * @return string + */ + public function getOperatorType() + { + return $this->operatorType; + } + + /** + * Set Operator type + * + * @param string $pValue PHPExcel_Style_Conditional operator type + * @return PHPExcel_Style_Conditional + */ + public function setOperatorType($pValue = PHPExcel_Style_Conditional::OPERATOR_NONE) + { + $this->operatorType = $pValue; + return $this; + } + + /** + * Get text + * + * @return string + */ + public function getText() + { + return $this->text; + } + + /** + * Set text + * + * @param string $value + * @return PHPExcel_Style_Conditional + */ + public function setText($value = null) + { + $this->text = $value; + return $this; + } + + /** + * Get Condition + * + * @deprecated Deprecated, use getConditions instead + * @return string + */ + public function getCondition() + { + if (isset($this->condition[0])) { + return $this->condition[0]; + } + + return ''; + } + + /** + * Set Condition + * + * @deprecated Deprecated, use setConditions instead + * @param string $pValue Condition + * @return PHPExcel_Style_Conditional + */ + public function setCondition($pValue = '') + { + if (!is_array($pValue)) { + $pValue = array($pValue); + } + + return $this->setConditions($pValue); + } + + /** + * Get Conditions + * + * @return string[] + */ + public function getConditions() + { + return $this->condition; + } + + /** + * Set Conditions + * + * @param string[] $pValue Condition + * @return PHPExcel_Style_Conditional + */ + public function setConditions($pValue) + { + if (!is_array($pValue)) { + $pValue = array($pValue); + } + $this->condition = $pValue; + return $this; + } + + /** + * Add Condition + * + * @param string $pValue Condition + * @return PHPExcel_Style_Conditional + */ + public function addCondition($pValue = '') + { + $this->condition[] = $pValue; + return $this; + } + + /** + * Get Style + * + * @return PHPExcel_Style + */ + public function getStyle() + { + return $this->style; + } + + /** + * Set Style + * + * @param PHPExcel_Style $pValue + * @throws PHPExcel_Exception + * @return PHPExcel_Style_Conditional + */ + public function setStyle(PHPExcel_Style $pValue = null) + { + $this->style = $pValue; + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + return md5( + $this->conditionType . + $this->operatorType . + implode(';', $this->condition) . + $this->style->getHashCode() . + __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Style/Fill.php b/application/third_party/PHPExcel/PHPExcel/Style/Fill.php new file mode 100644 index 0000000..26343ff --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Style/Fill.php @@ -0,0 +1,322 @@ +<?php + +/** + * PHPExcel_Style_Fill + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Style_Fill extends PHPExcel_Style_Supervisor implements PHPExcel_IComparable +{ + /* Fill types */ + const FILL_NONE = 'none'; + const FILL_SOLID = 'solid'; + const FILL_GRADIENT_LINEAR = 'linear'; + const FILL_GRADIENT_PATH = 'path'; + const FILL_PATTERN_DARKDOWN = 'darkDown'; + const FILL_PATTERN_DARKGRAY = 'darkGray'; + const FILL_PATTERN_DARKGRID = 'darkGrid'; + const FILL_PATTERN_DARKHORIZONTAL = 'darkHorizontal'; + const FILL_PATTERN_DARKTRELLIS = 'darkTrellis'; + const FILL_PATTERN_DARKUP = 'darkUp'; + const FILL_PATTERN_DARKVERTICAL = 'darkVertical'; + const FILL_PATTERN_GRAY0625 = 'gray0625'; + const FILL_PATTERN_GRAY125 = 'gray125'; + const FILL_PATTERN_LIGHTDOWN = 'lightDown'; + const FILL_PATTERN_LIGHTGRAY = 'lightGray'; + const FILL_PATTERN_LIGHTGRID = 'lightGrid'; + const FILL_PATTERN_LIGHTHORIZONTAL = 'lightHorizontal'; + const FILL_PATTERN_LIGHTTRELLIS = 'lightTrellis'; + const FILL_PATTERN_LIGHTUP = 'lightUp'; + const FILL_PATTERN_LIGHTVERTICAL = 'lightVertical'; + const FILL_PATTERN_MEDIUMGRAY = 'mediumGray'; + + /** + * Fill type + * + * @var string + */ + protected $fillType = PHPExcel_Style_Fill::FILL_NONE; + + /** + * Rotation + * + * @var double + */ + protected $rotation = 0; + + /** + * Start color + * + * @var PHPExcel_Style_Color + */ + protected $startColor; + + /** + * End color + * + * @var PHPExcel_Style_Color + */ + protected $endColor; + + /** + * Create a new PHPExcel_Style_Fill + * + * @param boolean $isSupervisor Flag indicating if this is a supervisor or not + * Leave this value at default unless you understand exactly what + * its ramifications are + * @param boolean $isConditional Flag indicating if this is a conditional style or not + * Leave this value at default unless you understand exactly what + * its ramifications are + */ + public function __construct($isSupervisor = false, $isConditional = false) + { + // Supervisor? + parent::__construct($isSupervisor); + + // Initialise values + if ($isConditional) { + $this->fillType = null; + } + $this->startColor = new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_WHITE, $isSupervisor, $isConditional); + $this->endColor = new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_BLACK, $isSupervisor, $isConditional); + + // bind parent if we are a supervisor + if ($isSupervisor) { + $this->startColor->bindParent($this, 'startColor'); + $this->endColor->bindParent($this, 'endColor'); + } + } + + /** + * Get the shared style component for the currently active cell in currently active sheet. + * Only used for style supervisor + * + * @return PHPExcel_Style_Fill + */ + public function getSharedComponent() + { + return $this->parent->getSharedComponent()->getFill(); + } + + /** + * Build style array from subcomponents + * + * @param array $array + * @return array + */ + public function getStyleArray($array) + { + return array('fill' => $array); + } + + /** + * Apply styles from array + * + * <code> + * $objPHPExcel->getActiveSheet()->getStyle('B2')->getFill()->applyFromArray( + * array( + * 'type' => PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR, + * 'rotation' => 0, + * 'startcolor' => array( + * 'rgb' => '000000' + * ), + * 'endcolor' => array( + * 'argb' => 'FFFFFFFF' + * ) + * ) + * ); + * </code> + * + * @param array $pStyles Array containing style information + * @throws PHPExcel_Exception + * @return PHPExcel_Style_Fill + */ + public function applyFromArray($pStyles = null) + { + if (is_array($pStyles)) { + if ($this->isSupervisor) { + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); + } else { + if (array_key_exists('type', $pStyles)) { + $this->setFillType($pStyles['type']); + } + if (array_key_exists('rotation', $pStyles)) { + $this->setRotation($pStyles['rotation']); + } + if (array_key_exists('startcolor', $pStyles)) { + $this->getStartColor()->applyFromArray($pStyles['startcolor']); + } + if (array_key_exists('endcolor', $pStyles)) { + $this->getEndColor()->applyFromArray($pStyles['endcolor']); + } + if (array_key_exists('color', $pStyles)) { + $this->getStartColor()->applyFromArray($pStyles['color']); + } + } + } else { + throw new PHPExcel_Exception("Invalid style array passed."); + } + return $this; + } + + /** + * Get Fill Type + * + * @return string + */ + public function getFillType() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getFillType(); + } + return $this->fillType; + } + + /** + * Set Fill Type + * + * @param string $pValue PHPExcel_Style_Fill fill type + * @return PHPExcel_Style_Fill + */ + public function setFillType($pValue = PHPExcel_Style_Fill::FILL_NONE) + { + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('type' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->fillType = $pValue; + } + return $this; + } + + /** + * Get Rotation + * + * @return double + */ + public function getRotation() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getRotation(); + } + return $this->rotation; + } + + /** + * Set Rotation + * + * @param double $pValue + * @return PHPExcel_Style_Fill + */ + public function setRotation($pValue = 0) + { + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('rotation' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->rotation = $pValue; + } + return $this; + } + + /** + * Get Start Color + * + * @return PHPExcel_Style_Color + */ + public function getStartColor() + { + return $this->startColor; + } + + /** + * Set Start Color + * + * @param PHPExcel_Style_Color $pValue + * @throws PHPExcel_Exception + * @return PHPExcel_Style_Fill + */ + public function setStartColor(PHPExcel_Style_Color $pValue = null) + { + // make sure parameter is a real color and not a supervisor + $color = $pValue->getIsSupervisor() ? $pValue->getSharedComponent() : $pValue; + + if ($this->isSupervisor) { + $styleArray = $this->getStartColor()->getStyleArray(array('argb' => $color->getARGB())); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->startColor = $color; + } + return $this; + } + + /** + * Get End Color + * + * @return PHPExcel_Style_Color + */ + public function getEndColor() + { + return $this->endColor; + } + + /** + * Set End Color + * + * @param PHPExcel_Style_Color $pValue + * @throws PHPExcel_Exception + * @return PHPExcel_Style_Fill + */ + public function setEndColor(PHPExcel_Style_Color $pValue = null) + { + // make sure parameter is a real color and not a supervisor + $color = $pValue->getIsSupervisor() ? $pValue->getSharedComponent() : $pValue; + + if ($this->isSupervisor) { + $styleArray = $this->getEndColor()->getStyleArray(array('argb' => $color->getARGB())); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->endColor = $color; + } + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getHashCode(); + } + return md5( + $this->getFillType() . + $this->getRotation() . + $this->getStartColor()->getHashCode() . + $this->getEndColor()->getHashCode() . + __CLASS__ + ); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Style/Font.php b/application/third_party/PHPExcel/PHPExcel/Style/Font.php new file mode 100644 index 0000000..9566e1d --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Style/Font.php @@ -0,0 +1,543 @@ +<?php + +/** + * PHPExcel_Style_Font + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Style_Font extends PHPExcel_Style_Supervisor implements PHPExcel_IComparable +{ + /* Underline types */ + const UNDERLINE_NONE = 'none'; + const UNDERLINE_DOUBLE = 'double'; + const UNDERLINE_DOUBLEACCOUNTING = 'doubleAccounting'; + const UNDERLINE_SINGLE = 'single'; + const UNDERLINE_SINGLEACCOUNTING = 'singleAccounting'; + + /** + * Font Name + * + * @var string + */ + protected $name = 'Calibri'; + + /** + * Font Size + * + * @var float + */ + protected $size = 11; + + /** + * Bold + * + * @var boolean + */ + protected $bold = false; + + /** + * Italic + * + * @var boolean + */ + protected $italic = false; + + /** + * Superscript + * + * @var boolean + */ + protected $superScript = false; + + /** + * Subscript + * + * @var boolean + */ + protected $subScript = false; + + /** + * Underline + * + * @var string + */ + protected $underline = self::UNDERLINE_NONE; + + /** + * Strikethrough + * + * @var boolean + */ + protected $strikethrough = false; + + /** + * Foreground color + * + * @var PHPExcel_Style_Color + */ + protected $color; + + /** + * Create a new PHPExcel_Style_Font + * + * @param boolean $isSupervisor Flag indicating if this is a supervisor or not + * Leave this value at default unless you understand exactly what + * its ramifications are + * @param boolean $isConditional Flag indicating if this is a conditional style or not + * Leave this value at default unless you understand exactly what + * its ramifications are + */ + public function __construct($isSupervisor = false, $isConditional = false) + { + // Supervisor? + parent::__construct($isSupervisor); + + // Initialise values + if ($isConditional) { + $this->name = null; + $this->size = null; + $this->bold = null; + $this->italic = null; + $this->superScript = null; + $this->subScript = null; + $this->underline = null; + $this->strikethrough = null; + $this->color = new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_BLACK, $isSupervisor, $isConditional); + } else { + $this->color = new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_BLACK, $isSupervisor); + } + // bind parent if we are a supervisor + if ($isSupervisor) { + $this->color->bindParent($this, 'color'); + } + } + + /** + * Get the shared style component for the currently active cell in currently active sheet. + * Only used for style supervisor + * + * @return PHPExcel_Style_Font + */ + public function getSharedComponent() + { + return $this->parent->getSharedComponent()->getFont(); + } + + /** + * Build style array from subcomponents + * + * @param array $array + * @return array + */ + public function getStyleArray($array) + { + return array('font' => $array); + } + + /** + * Apply styles from array + * + * <code> + * $objPHPExcel->getActiveSheet()->getStyle('B2')->getFont()->applyFromArray( + * array( + * 'name' => 'Arial', + * 'bold' => TRUE, + * 'italic' => FALSE, + * 'underline' => PHPExcel_Style_Font::UNDERLINE_DOUBLE, + * 'strike' => FALSE, + * 'color' => array( + * 'rgb' => '808080' + * ) + * ) + * ); + * </code> + * + * @param array $pStyles Array containing style information + * @throws PHPExcel_Exception + * @return PHPExcel_Style_Font + */ + public function applyFromArray($pStyles = null) + { + if (is_array($pStyles)) { + if ($this->isSupervisor) { + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); + } else { + if (array_key_exists('name', $pStyles)) { + $this->setName($pStyles['name']); + } + if (array_key_exists('bold', $pStyles)) { + $this->setBold($pStyles['bold']); + } + if (array_key_exists('italic', $pStyles)) { + $this->setItalic($pStyles['italic']); + } + if (array_key_exists('superScript', $pStyles)) { + $this->setSuperScript($pStyles['superScript']); + } + if (array_key_exists('subScript', $pStyles)) { + $this->setSubScript($pStyles['subScript']); + } + if (array_key_exists('underline', $pStyles)) { + $this->setUnderline($pStyles['underline']); + } + if (array_key_exists('strike', $pStyles)) { + $this->setStrikethrough($pStyles['strike']); + } + if (array_key_exists('color', $pStyles)) { + $this->getColor()->applyFromArray($pStyles['color']); + } + if (array_key_exists('size', $pStyles)) { + $this->setSize($pStyles['size']); + } + } + } else { + throw new PHPExcel_Exception("Invalid style array passed."); + } + return $this; + } + + /** + * Get Name + * + * @return string + */ + public function getName() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getName(); + } + return $this->name; + } + + /** + * Set Name + * + * @param string $pValue + * @return PHPExcel_Style_Font + */ + public function setName($pValue = 'Calibri') + { + if ($pValue == '') { + $pValue = 'Calibri'; + } + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('name' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->name = $pValue; + } + return $this; + } + + /** + * Get Size + * + * @return double + */ + public function getSize() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getSize(); + } + return $this->size; + } + + /** + * Set Size + * + * @param double $pValue + * @return PHPExcel_Style_Font + */ + public function setSize($pValue = 10) + { + if ($pValue == '') { + $pValue = 10; + } + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('size' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->size = $pValue; + } + return $this; + } + + /** + * Get Bold + * + * @return boolean + */ + public function getBold() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getBold(); + } + return $this->bold; + } + + /** + * Set Bold + * + * @param boolean $pValue + * @return PHPExcel_Style_Font + */ + public function setBold($pValue = false) + { + if ($pValue == '') { + $pValue = false; + } + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('bold' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->bold = $pValue; + } + return $this; + } + + /** + * Get Italic + * + * @return boolean + */ + public function getItalic() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getItalic(); + } + return $this->italic; + } + + /** + * Set Italic + * + * @param boolean $pValue + * @return PHPExcel_Style_Font + */ + public function setItalic($pValue = false) + { + if ($pValue == '') { + $pValue = false; + } + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('italic' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->italic = $pValue; + } + return $this; + } + + /** + * Get SuperScript + * + * @return boolean + */ + public function getSuperScript() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getSuperScript(); + } + return $this->superScript; + } + + /** + * Set SuperScript + * + * @param boolean $pValue + * @return PHPExcel_Style_Font + */ + public function setSuperScript($pValue = false) + { + if ($pValue == '') { + $pValue = false; + } + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('superScript' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->superScript = $pValue; + $this->subScript = !$pValue; + } + return $this; + } + + /** + * Get SubScript + * + * @return boolean + */ + public function getSubScript() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getSubScript(); + } + return $this->subScript; + } + + /** + * Set SubScript + * + * @param boolean $pValue + * @return PHPExcel_Style_Font + */ + public function setSubScript($pValue = false) + { + if ($pValue == '') { + $pValue = false; + } + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('subScript' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->subScript = $pValue; + $this->superScript = !$pValue; + } + return $this; + } + + /** + * Get Underline + * + * @return string + */ + public function getUnderline() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getUnderline(); + } + return $this->underline; + } + + /** + * Set Underline + * + * @param string|boolean $pValue PHPExcel_Style_Font underline type + * If a boolean is passed, then TRUE equates to UNDERLINE_SINGLE, + * false equates to UNDERLINE_NONE + * @return PHPExcel_Style_Font + */ + public function setUnderline($pValue = self::UNDERLINE_NONE) + { + if (is_bool($pValue)) { + $pValue = ($pValue) ? self::UNDERLINE_SINGLE : self::UNDERLINE_NONE; + } elseif ($pValue == '') { + $pValue = self::UNDERLINE_NONE; + } + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('underline' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->underline = $pValue; + } + return $this; + } + + /** + * Get Strikethrough + * + * @return boolean + */ + public function getStrikethrough() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getStrikethrough(); + } + return $this->strikethrough; + } + + /** + * Set Strikethrough + * + * @param boolean $pValue + * @return PHPExcel_Style_Font + */ + public function setStrikethrough($pValue = false) + { + if ($pValue == '') { + $pValue = false; + } + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('strike' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->strikethrough = $pValue; + } + return $this; + } + + /** + * Get Color + * + * @return PHPExcel_Style_Color + */ + public function getColor() + { + return $this->color; + } + + /** + * Set Color + * + * @param PHPExcel_Style_Color $pValue + * @throws PHPExcel_Exception + * @return PHPExcel_Style_Font + */ + public function setColor(PHPExcel_Style_Color $pValue = null) + { + // make sure parameter is a real color and not a supervisor + $color = $pValue->getIsSupervisor() ? $pValue->getSharedComponent() : $pValue; + + if ($this->isSupervisor) { + $styleArray = $this->getColor()->getStyleArray(array('argb' => $color->getARGB())); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->color = $color; + } + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getHashCode(); + } + return md5( + $this->name . + $this->size . + ($this->bold ? 't' : 'f') . + ($this->italic ? 't' : 'f') . + ($this->superScript ? 't' : 'f') . + ($this->subScript ? 't' : 'f') . + $this->underline . + ($this->strikethrough ? 't' : 'f') . + $this->color->getHashCode() . + __CLASS__ + ); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Style/NumberFormat.php b/application/third_party/PHPExcel/PHPExcel/Style/NumberFormat.php new file mode 100644 index 0000000..1b72cda --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Style/NumberFormat.php @@ -0,0 +1,751 @@ +<?php + +/** + * PHPExcel_Style_NumberFormat + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Style_NumberFormat extends PHPExcel_Style_Supervisor implements PHPExcel_IComparable +{ + /* Pre-defined formats */ + const FORMAT_GENERAL = 'General'; + + const FORMAT_TEXT = '@'; + + const FORMAT_NUMBER = '0'; + const FORMAT_NUMBER_00 = '0.00'; + const FORMAT_NUMBER_COMMA_SEPARATED1 = '#,##0.00'; + const FORMAT_NUMBER_COMMA_SEPARATED2 = '#,##0.00_-'; + + const FORMAT_PERCENTAGE = '0%'; + const FORMAT_PERCENTAGE_00 = '0.00%'; + + const FORMAT_DATE_YYYYMMDD2 = 'yyyy-mm-dd'; + const FORMAT_DATE_YYYYMMDD = 'yy-mm-dd'; + const FORMAT_DATE_DDMMYYYY = 'dd/mm/yy'; + const FORMAT_DATE_DMYSLASH = 'd/m/y'; + const FORMAT_DATE_DMYMINUS = 'd-m-y'; + const FORMAT_DATE_DMMINUS = 'd-m'; + const FORMAT_DATE_MYMINUS = 'm-y'; + const FORMAT_DATE_XLSX14 = 'mm-dd-yy'; + const FORMAT_DATE_XLSX15 = 'd-mmm-yy'; + const FORMAT_DATE_XLSX16 = 'd-mmm'; + const FORMAT_DATE_XLSX17 = 'mmm-yy'; + const FORMAT_DATE_XLSX22 = 'm/d/yy h:mm'; + const FORMAT_DATE_DATETIME = 'd/m/y h:mm'; + const FORMAT_DATE_TIME1 = 'h:mm AM/PM'; + const FORMAT_DATE_TIME2 = 'h:mm:ss AM/PM'; + const FORMAT_DATE_TIME3 = 'h:mm'; + const FORMAT_DATE_TIME4 = 'h:mm:ss'; + const FORMAT_DATE_TIME5 = 'mm:ss'; + const FORMAT_DATE_TIME6 = 'h:mm:ss'; + const FORMAT_DATE_TIME7 = 'i:s.S'; + const FORMAT_DATE_TIME8 = 'h:mm:ss;@'; + const FORMAT_DATE_YYYYMMDDSLASH = 'yy/mm/dd;@'; + + const FORMAT_CURRENCY_USD_SIMPLE = '"$"#,##0.00_-'; + const FORMAT_CURRENCY_USD = '$#,##0_-'; + const FORMAT_CURRENCY_EUR_SIMPLE = '[$EUR ]#,##0.00_-'; + + /** + * Excel built-in number formats + * + * @var array + */ + protected static $builtInFormats; + + /** + * Excel built-in number formats (flipped, for faster lookups) + * + * @var array + */ + protected static $flippedBuiltInFormats; + + /** + * Format Code + * + * @var string + */ + protected $formatCode = PHPExcel_Style_NumberFormat::FORMAT_GENERAL; + + /** + * Built-in format Code + * + * @var string + */ + protected $builtInFormatCode = 0; + + /** + * Create a new PHPExcel_Style_NumberFormat + * + * @param boolean $isSupervisor Flag indicating if this is a supervisor or not + * Leave this value at default unless you understand exactly what + * its ramifications are + * @param boolean $isConditional Flag indicating if this is a conditional style or not + * Leave this value at default unless you understand exactly what + * its ramifications are + */ + public function __construct($isSupervisor = false, $isConditional = false) + { + // Supervisor? + parent::__construct($isSupervisor); + + if ($isConditional) { + $this->formatCode = null; + $this->builtInFormatCode = false; + } + } + + /** + * Get the shared style component for the currently active cell in currently active sheet. + * Only used for style supervisor + * + * @return PHPExcel_Style_NumberFormat + */ + public function getSharedComponent() + { + return $this->parent->getSharedComponent()->getNumberFormat(); + } + + /** + * Build style array from subcomponents + * + * @param array $array + * @return array + */ + public function getStyleArray($array) + { + return array('numberformat' => $array); + } + + /** + * Apply styles from array + * + * <code> + * $objPHPExcel->getActiveSheet()->getStyle('B2')->getNumberFormat()->applyFromArray( + * array( + * 'code' => PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_EUR_SIMPLE + * ) + * ); + * </code> + * + * @param array $pStyles Array containing style information + * @throws PHPExcel_Exception + * @return PHPExcel_Style_NumberFormat + */ + public function applyFromArray($pStyles = null) + { + if (is_array($pStyles)) { + if ($this->isSupervisor) { + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); + } else { + if (array_key_exists('code', $pStyles)) { + $this->setFormatCode($pStyles['code']); + } + } + } else { + throw new PHPExcel_Exception("Invalid style array passed."); + } + return $this; + } + + /** + * Get Format Code + * + * @return string + */ + public function getFormatCode() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getFormatCode(); + } + if ($this->builtInFormatCode !== false) { + return self::builtInFormatCode($this->builtInFormatCode); + } + return $this->formatCode; + } + + /** + * Set Format Code + * + * @param string $pValue + * @return PHPExcel_Style_NumberFormat + */ + public function setFormatCode($pValue = PHPExcel_Style_NumberFormat::FORMAT_GENERAL) + { + if ($pValue == '') { + $pValue = PHPExcel_Style_NumberFormat::FORMAT_GENERAL; + } + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('code' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->formatCode = $pValue; + $this->builtInFormatCode = self::builtInFormatCodeIndex($pValue); + } + return $this; + } + + /** + * Get Built-In Format Code + * + * @return int + */ + public function getBuiltInFormatCode() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getBuiltInFormatCode(); + } + return $this->builtInFormatCode; + } + + /** + * Set Built-In Format Code + * + * @param int $pValue + * @return PHPExcel_Style_NumberFormat + */ + public function setBuiltInFormatCode($pValue = 0) + { + + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('code' => self::builtInFormatCode($pValue))); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->builtInFormatCode = $pValue; + $this->formatCode = self::builtInFormatCode($pValue); + } + return $this; + } + + /** + * Fill built-in format codes + */ + private static function fillBuiltInFormatCodes() + { + // [MS-OI29500: Microsoft Office Implementation Information for ISO/IEC-29500 Standard Compliance] + // 18.8.30. numFmt (Number Format) + // + // The ECMA standard defines built-in format IDs + // 14: "mm-dd-yy" + // 22: "m/d/yy h:mm" + // 37: "#,##0 ;(#,##0)" + // 38: "#,##0 ;[Red](#,##0)" + // 39: "#,##0.00;(#,##0.00)" + // 40: "#,##0.00;[Red](#,##0.00)" + // 47: "mmss.0" + // KOR fmt 55: "yyyy-mm-dd" + // Excel defines built-in format IDs + // 14: "m/d/yyyy" + // 22: "m/d/yyyy h:mm" + // 37: "#,##0_);(#,##0)" + // 38: "#,##0_);[Red](#,##0)" + // 39: "#,##0.00_);(#,##0.00)" + // 40: "#,##0.00_);[Red](#,##0.00)" + // 47: "mm:ss.0" + // KOR fmt 55: "yyyy/mm/dd" + + // Built-in format codes + if (is_null(self::$builtInFormats)) { + self::$builtInFormats = array(); + + // General + self::$builtInFormats[0] = PHPExcel_Style_NumberFormat::FORMAT_GENERAL; + self::$builtInFormats[1] = '0'; + self::$builtInFormats[2] = '0.00'; + self::$builtInFormats[3] = '#,##0'; + self::$builtInFormats[4] = '#,##0.00'; + + self::$builtInFormats[9] = '0%'; + self::$builtInFormats[10] = '0.00%'; + self::$builtInFormats[11] = '0.00E+00'; + self::$builtInFormats[12] = '# ?/?'; + self::$builtInFormats[13] = '# ??/??'; + self::$builtInFormats[14] = 'm/d/yyyy'; // Despite ECMA 'mm-dd-yy'; + self::$builtInFormats[15] = 'd-mmm-yy'; + self::$builtInFormats[16] = 'd-mmm'; + self::$builtInFormats[17] = 'mmm-yy'; + self::$builtInFormats[18] = 'h:mm AM/PM'; + self::$builtInFormats[19] = 'h:mm:ss AM/PM'; + self::$builtInFormats[20] = 'h:mm'; + self::$builtInFormats[21] = 'h:mm:ss'; + self::$builtInFormats[22] = 'm/d/yyyy h:mm'; // Despite ECMA 'm/d/yy h:mm'; + + self::$builtInFormats[37] = '#,##0_);(#,##0)'; // Despite ECMA '#,##0 ;(#,##0)'; + self::$builtInFormats[38] = '#,##0_);[Red](#,##0)'; // Despite ECMA '#,##0 ;[Red](#,##0)'; + self::$builtInFormats[39] = '#,##0.00_);(#,##0.00)'; // Despite ECMA '#,##0.00;(#,##0.00)'; + self::$builtInFormats[40] = '#,##0.00_);[Red](#,##0.00)'; // Despite ECMA '#,##0.00;[Red](#,##0.00)'; + + self::$builtInFormats[44] = '_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)'; + self::$builtInFormats[45] = 'mm:ss'; + self::$builtInFormats[46] = '[h]:mm:ss'; + self::$builtInFormats[47] = 'mm:ss.0'; // Despite ECMA 'mmss.0'; + self::$builtInFormats[48] = '##0.0E+0'; + self::$builtInFormats[49] = '@'; + + // CHT + self::$builtInFormats[27] = '[$-404]e/m/d'; + self::$builtInFormats[30] = 'm/d/yy'; + self::$builtInFormats[36] = '[$-404]e/m/d'; + self::$builtInFormats[50] = '[$-404]e/m/d'; + self::$builtInFormats[57] = '[$-404]e/m/d'; + + // THA + self::$builtInFormats[59] = 't0'; + self::$builtInFormats[60] = 't0.00'; + self::$builtInFormats[61] = 't#,##0'; + self::$builtInFormats[62] = 't#,##0.00'; + self::$builtInFormats[67] = 't0%'; + self::$builtInFormats[68] = 't0.00%'; + self::$builtInFormats[69] = 't# ?/?'; + self::$builtInFormats[70] = 't# ??/??'; + + // Flip array (for faster lookups) + self::$flippedBuiltInFormats = array_flip(self::$builtInFormats); + } + } + + /** + * Get built-in format code + * + * @param int $pIndex + * @return string + */ + public static function builtInFormatCode($pIndex) + { + // Clean parameter + $pIndex = intval($pIndex); + + // Ensure built-in format codes are available + self::fillBuiltInFormatCodes(); + // Lookup format code + if (isset(self::$builtInFormats[$pIndex])) { + return self::$builtInFormats[$pIndex]; + } + + return ''; + } + + /** + * Get built-in format code index + * + * @param string $formatCode + * @return int|boolean + */ + public static function builtInFormatCodeIndex($formatCode) + { + // Ensure built-in format codes are available + self::fillBuiltInFormatCodes(); + + // Lookup format code + if (isset(self::$flippedBuiltInFormats[$formatCode])) { + return self::$flippedBuiltInFormats[$formatCode]; + } + + return false; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getHashCode(); + } + return md5( + $this->formatCode . + $this->builtInFormatCode . + __CLASS__ + ); + } + + /** + * Search/replace values to convert Excel date/time format masks to PHP format masks + * + * @var array + */ + private static $dateFormatReplacements = array( + // first remove escapes related to non-format characters + '\\' => '', + // 12-hour suffix + 'am/pm' => 'A', + // 4-digit year + 'e' => 'Y', + 'yyyy' => 'Y', + // 2-digit year + 'yy' => 'y', + // first letter of month - no php equivalent + 'mmmmm' => 'M', + // full month name + 'mmmm' => 'F', + // short month name + 'mmm' => 'M', + // mm is minutes if time, but can also be month w/leading zero + // so we try to identify times be the inclusion of a : separator in the mask + // It isn't perfect, but the best way I know how + ':mm' => ':i', + 'mm:' => 'i:', + // month leading zero + 'mm' => 'm', + // month no leading zero + 'm' => 'n', + // full day of week name + 'dddd' => 'l', + // short day of week name + 'ddd' => 'D', + // days leading zero + 'dd' => 'd', + // days no leading zero + 'd' => 'j', + // seconds + 'ss' => 's', + // fractional seconds - no php equivalent + '.s' => '' + ); + /** + * Search/replace values to convert Excel date/time format masks hours to PHP format masks (24 hr clock) + * + * @var array + */ + private static $dateFormatReplacements24 = array( + 'hh' => 'H', + 'h' => 'G' + ); + /** + * Search/replace values to convert Excel date/time format masks hours to PHP format masks (12 hr clock) + * + * @var array + */ + private static $dateFormatReplacements12 = array( + 'hh' => 'h', + 'h' => 'g' + ); + + private static function setLowercaseCallback($matches) { + return mb_strtolower($matches[0]); + } + + private static function escapeQuotesCallback($matches) { + return '\\' . implode('\\', str_split($matches[1])); + } + + private static function formatAsDate(&$value, &$format) + { + // strip off first part containing e.g. [$-F800] or [$USD-409] + // general syntax: [$<Currency string>-<language info>] + // language info is in hexadecimal + $format = preg_replace('/^(\[\$[A-Z]*-[0-9A-F]*\])/i', '', $format); + + // OpenOffice.org uses upper-case number formats, e.g. 'YYYY', convert to lower-case; + // but we don't want to change any quoted strings + $format = preg_replace_callback('/(?:^|")([^"]*)(?:$|")/', array('self', 'setLowercaseCallback'), $format); + + // Only process the non-quoted blocks for date format characters + $blocks = explode('"', $format); + foreach($blocks as $key => &$block) { + if ($key % 2 == 0) { + $block = strtr($block, self::$dateFormatReplacements); + if (!strpos($block, 'A')) { + // 24-hour time format + $block = strtr($block, self::$dateFormatReplacements24); + } else { + // 12-hour time format + $block = strtr($block, self::$dateFormatReplacements12); + } + } + } + $format = implode('"', $blocks); + + // escape any quoted characters so that DateTime format() will render them correctly + $format = preg_replace_callback('/"(.*)"/U', array('self', 'escapeQuotesCallback'), $format); + + $dateObj = PHPExcel_Shared_Date::ExcelToPHPObject($value); + $value = $dateObj->format($format); + } + + private static function formatAsPercentage(&$value, &$format) + { + if ($format === self::FORMAT_PERCENTAGE) { + $value = round((100 * $value), 0) . '%'; + } else { + if (preg_match('/\.[#0]+/i', $format, $m)) { + $s = substr($m[0], 0, 1) . (strlen($m[0]) - 1); + $format = str_replace($m[0], $s, $format); + } + if (preg_match('/^[#0]+/', $format, $m)) { + $format = str_replace($m[0], strlen($m[0]), $format); + } + $format = '%' . str_replace('%', 'f%%', $format); + + $value = sprintf($format, 100 * $value); + } + } + + private static function formatAsFraction(&$value, &$format) + { + $sign = ($value < 0) ? '-' : ''; + + $integerPart = floor(abs($value)); + $decimalPart = trim(fmod(abs($value), 1), '0.'); + $decimalLength = strlen($decimalPart); + $decimalDivisor = pow(10, $decimalLength); + + $GCD = PHPExcel_Calculation_MathTrig::GCD($decimalPart, $decimalDivisor); + + $adjustedDecimalPart = $decimalPart/$GCD; + $adjustedDecimalDivisor = $decimalDivisor/$GCD; + + if ((strpos($format, '0') !== false) || (strpos($format, '#') !== false) || (substr($format, 0, 3) == '? ?')) { + if ($integerPart == 0) { + $integerPart = ''; + } + $value = "$sign$integerPart $adjustedDecimalPart/$adjustedDecimalDivisor"; + } else { + $adjustedDecimalPart += $integerPart * $adjustedDecimalDivisor; + $value = "$sign$adjustedDecimalPart/$adjustedDecimalDivisor"; + } + } + + private static function complexNumberFormatMask($number, $mask, $level = 0) + { + $sign = ($number < 0.0); + $number = abs($number); + if (strpos($mask, '.') !== false) { + $numbers = explode('.', $number . '.0'); + $masks = explode('.', $mask . '.0'); + $result1 = self::complexNumberFormatMask($numbers[0], $masks[0], 1); + $result2 = strrev(self::complexNumberFormatMask(strrev($numbers[1]), strrev($masks[1]), 1)); + return (($sign) ? '-' : '') . $result1 . '.' . $result2; + } + + $r = preg_match_all('/0+/', $mask, $result, PREG_OFFSET_CAPTURE); + if ($r > 1) { + $result = array_reverse($result[0]); + + foreach ($result as $block) { + $divisor = 1 . $block[0]; + $size = strlen($block[0]); + $offset = $block[1]; + + $blockValue = sprintf( + '%0' . $size . 'd', + fmod($number, $divisor) + ); + $number = floor($number / $divisor); + $mask = substr_replace($mask, $blockValue, $offset, $size); + } + if ($number > 0) { + $mask = substr_replace($mask, $number, $offset, 0); + } + $result = $mask; + } else { + $result = $number; + } + + return (($sign) ? '-' : '') . $result; + } + + /** + * Convert a value in a pre-defined format to a PHP string + * + * @param mixed $value Value to format + * @param string $format Format code + * @param array $callBack Callback function for additional formatting of string + * @return string Formatted string + */ + public static function toFormattedString($value = '0', $format = PHPExcel_Style_NumberFormat::FORMAT_GENERAL, $callBack = null) + { + // For now we do not treat strings although section 4 of a format code affects strings + if (!is_numeric($value)) { + return $value; + } + + // For 'General' format code, we just pass the value although this is not entirely the way Excel does it, + // it seems to round numbers to a total of 10 digits. + if (($format === PHPExcel_Style_NumberFormat::FORMAT_GENERAL) || ($format === PHPExcel_Style_NumberFormat::FORMAT_TEXT)) { + return $value; + } + + // Convert any other escaped characters to quoted strings, e.g. (\T to "T") + $format = preg_replace('/(\\\(.))(?=(?:[^"]|"[^"]*")*$)/u', '"${2}"', $format); + + // Get the sections, there can be up to four sections, separated with a semi-colon (but only if not a quoted literal) + $sections = preg_split('/(;)(?=(?:[^"]|"[^"]*")*$)/u', $format); + + // Extract the relevant section depending on whether number is positive, negative, or zero? + // Text not supported yet. + // Here is how the sections apply to various values in Excel: + // 1 section: [POSITIVE/NEGATIVE/ZERO/TEXT] + // 2 sections: [POSITIVE/ZERO/TEXT] [NEGATIVE] + // 3 sections: [POSITIVE/TEXT] [NEGATIVE] [ZERO] + // 4 sections: [POSITIVE] [NEGATIVE] [ZERO] [TEXT] + switch (count($sections)) { + case 1: + $format = $sections[0]; + break; + case 2: + $format = ($value >= 0) ? $sections[0] : $sections[1]; + $value = abs($value); // Use the absolute value + break; + case 3: + $format = ($value > 0) ? + $sections[0] : ( ($value < 0) ? + $sections[1] : $sections[2]); + $value = abs($value); // Use the absolute value + break; + case 4: + $format = ($value > 0) ? + $sections[0] : ( ($value < 0) ? + $sections[1] : $sections[2]); + $value = abs($value); // Use the absolute value + break; + default: + // something is wrong, just use first section + $format = $sections[0]; + break; + } + + // In Excel formats, "_" is used to add spacing, + // The following character indicates the size of the spacing, which we can't do in HTML, so we just use a standard space + $format = preg_replace('/_./', ' ', $format); + + // Save format with color information for later use below + $formatColor = $format; + + // Strip color information + $color_regex = '/^\\[[a-zA-Z]+\\]/'; + $format = preg_replace($color_regex, '', $format); + + // Let's begin inspecting the format and converting the value to a formatted string + + // Check for date/time characters (not inside quotes) + if (preg_match('/(\[\$[A-Z]*-[0-9A-F]*\])*[hmsdy](?=(?:[^"]|"[^"]*")*$)/miu', $format, $matches)) { + // datetime format + self::formatAsDate($value, $format); + } elseif (preg_match('/%$/', $format)) { + // % number format + self::formatAsPercentage($value, $format); + } else { + if ($format === self::FORMAT_CURRENCY_EUR_SIMPLE) { + $value = 'EUR ' . sprintf('%1.2f', $value); + } else { + // Some non-number strings are quoted, so we'll get rid of the quotes, likewise any positional * symbols + $format = str_replace(array('"', '*'), '', $format); + + // Find out if we need thousands separator + // This is indicated by a comma enclosed by a digit placeholder: + // #,# or 0,0 + $useThousands = preg_match('/(#,#|0,0)/', $format); + if ($useThousands) { + $format = preg_replace('/0,0/', '00', $format); + $format = preg_replace('/#,#/', '##', $format); + } + + // Scale thousands, millions,... + // This is indicated by a number of commas after a digit placeholder: + // #, or 0.0,, + $scale = 1; // same as no scale + $matches = array(); + if (preg_match('/(#|0)(,+)/', $format, $matches)) { + $scale = pow(1000, strlen($matches[2])); + + // strip the commas + $format = preg_replace('/0,+/', '0', $format); + $format = preg_replace('/#,+/', '#', $format); + } + + if (preg_match('/#?.*\?\/\?/', $format, $m)) { + //echo 'Format mask is fractional '.$format.' <br />'; + if ($value != (int)$value) { + self::formatAsFraction($value, $format); + } + + } else { + // Handle the number itself + + // scale number + $value = $value / $scale; + + // Strip # + $format = preg_replace('/\\#/', '0', $format); + + $n = "/\[[^\]]+\]/"; + $m = preg_replace($n, '', $format); + $number_regex = "/(0+)(\.?)(0*)/"; + if (preg_match($number_regex, $m, $matches)) { + $left = $matches[1]; + $dec = $matches[2]; + $right = $matches[3]; + + // minimun width of formatted number (including dot) + $minWidth = strlen($left) + strlen($dec) + strlen($right); + if ($useThousands) { + $value = number_format( + $value, + strlen($right), + PHPExcel_Shared_String::getDecimalSeparator(), + PHPExcel_Shared_String::getThousandsSeparator() + ); + $value = preg_replace($number_regex, $value, $format); + } else { + if (preg_match('/[0#]E[+-]0/i', $format)) { + // Scientific format + $value = sprintf('%5.2E', $value); + } elseif (preg_match('/0([^\d\.]+)0/', $format)) { + $value = self::complexNumberFormatMask($value, $format); + } else { + $sprintf_pattern = "%0$minWidth." . strlen($right) . "f"; + $value = sprintf($sprintf_pattern, $value); + $value = preg_replace($number_regex, $value, $format); + } + } + } + } + if (preg_match('/\[\$(.*)\]/u', $format, $m)) { + // Currency or Accounting + $currencyFormat = $m[0]; + $currencyCode = $m[1]; + list($currencyCode) = explode('-', $currencyCode); + if ($currencyCode == '') { + $currencyCode = PHPExcel_Shared_String::getCurrencyCode(); + } + $value = preg_replace('/\[\$([^\]]*)\]/u', $currencyCode, $value); + } + } + } + + // Escape any escaped slashes to a single slash + $format = preg_replace("/\\\\/u", '\\', $format); + + // Additional formatting provided by callback function + if ($callBack !== null) { + list($writerInstance, $function) = $callBack; + $value = $writerInstance->$function($value, $formatColor); + } + + return $value; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Style/Protection.php b/application/third_party/PHPExcel/PHPExcel/Style/Protection.php new file mode 100644 index 0000000..d5568f6 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Style/Protection.php @@ -0,0 +1,204 @@ +<?php + +/** + * PHPExcel_Style_Protection + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Style_Protection extends PHPExcel_Style_Supervisor implements PHPExcel_IComparable +{ + /** Protection styles */ + const PROTECTION_INHERIT = 'inherit'; + const PROTECTION_PROTECTED = 'protected'; + const PROTECTION_UNPROTECTED = 'unprotected'; + + /** + * Locked + * + * @var string + */ + protected $locked; + + /** + * Hidden + * + * @var string + */ + protected $hidden; + + /** + * Create a new PHPExcel_Style_Protection + * + * @param boolean $isSupervisor Flag indicating if this is a supervisor or not + * Leave this value at default unless you understand exactly what + * its ramifications are + * @param boolean $isConditional Flag indicating if this is a conditional style or not + * Leave this value at default unless you understand exactly what + * its ramifications are + */ + public function __construct($isSupervisor = false, $isConditional = false) + { + // Supervisor? + parent::__construct($isSupervisor); + + // Initialise values + if (!$isConditional) { + $this->locked = self::PROTECTION_INHERIT; + $this->hidden = self::PROTECTION_INHERIT; + } + } + + /** + * Get the shared style component for the currently active cell in currently active sheet. + * Only used for style supervisor + * + * @return PHPExcel_Style_Protection + */ + public function getSharedComponent() + { + return $this->parent->getSharedComponent()->getProtection(); + } + + /** + * Build style array from subcomponents + * + * @param array $array + * @return array + */ + public function getStyleArray($array) + { + return array('protection' => $array); + } + + /** + * Apply styles from array + * + * <code> + * $objPHPExcel->getActiveSheet()->getStyle('B2')->getLocked()->applyFromArray( + * array( + * 'locked' => TRUE, + * 'hidden' => FALSE + * ) + * ); + * </code> + * + * @param array $pStyles Array containing style information + * @throws PHPExcel_Exception + * @return PHPExcel_Style_Protection + */ + public function applyFromArray($pStyles = null) + { + if (is_array($pStyles)) { + if ($this->isSupervisor) { + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($this->getStyleArray($pStyles)); + } else { + if (isset($pStyles['locked'])) { + $this->setLocked($pStyles['locked']); + } + if (isset($pStyles['hidden'])) { + $this->setHidden($pStyles['hidden']); + } + } + } else { + throw new PHPExcel_Exception("Invalid style array passed."); + } + return $this; + } + + /** + * Get locked + * + * @return string + */ + public function getLocked() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getLocked(); + } + return $this->locked; + } + + /** + * Set locked + * + * @param string $pValue + * @return PHPExcel_Style_Protection + */ + public function setLocked($pValue = self::PROTECTION_INHERIT) + { + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('locked' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->locked = $pValue; + } + return $this; + } + + /** + * Get hidden + * + * @return string + */ + public function getHidden() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getHidden(); + } + return $this->hidden; + } + + /** + * Set hidden + * + * @param string $pValue + * @return PHPExcel_Style_Protection + */ + public function setHidden($pValue = self::PROTECTION_INHERIT) + { + if ($this->isSupervisor) { + $styleArray = $this->getStyleArray(array('hidden' => $pValue)); + $this->getActiveSheet()->getStyle($this->getSelectedCells())->applyFromArray($styleArray); + } else { + $this->hidden = $pValue; + } + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + if ($this->isSupervisor) { + return $this->getSharedComponent()->getHashCode(); + } + return md5( + $this->locked . + $this->hidden . + __CLASS__ + ); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Style/Supervisor.php b/application/third_party/PHPExcel/PHPExcel/Style/Supervisor.php new file mode 100644 index 0000000..a90e1c6 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Style/Supervisor.php @@ -0,0 +1,125 @@ +<?php + +/** + * PHPExcel_Style_Supervisor + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Style + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +abstract class PHPExcel_Style_Supervisor +{ + /** + * Supervisor? + * + * @var boolean + */ + protected $isSupervisor; + + /** + * Parent. Only used for supervisor + * + * @var PHPExcel_Style + */ + protected $parent; + + /** + * Create a new PHPExcel_Style_Alignment + * + * @param boolean $isSupervisor Flag indicating if this is a supervisor or not + * Leave this value at default unless you understand exactly what + * its ramifications are + */ + public function __construct($isSupervisor = false) + { + // Supervisor? + $this->isSupervisor = $isSupervisor; + } + + /** + * Bind parent. Only used for supervisor + * + * @param PHPExcel $parent + * @return PHPExcel_Style_Supervisor + */ + public function bindParent($parent, $parentPropertyName = null) + { + $this->parent = $parent; + return $this; + } + + /** + * Is this a supervisor or a cell style component? + * + * @return boolean + */ + public function getIsSupervisor() + { + return $this->isSupervisor; + } + + /** + * Get the currently active sheet. Only used for supervisor + * + * @return PHPExcel_Worksheet + */ + public function getActiveSheet() + { + return $this->parent->getActiveSheet(); + } + + /** + * Get the currently active cell coordinate in currently active sheet. + * Only used for supervisor + * + * @return string E.g. 'A1' + */ + public function getSelectedCells() + { + return $this->getActiveSheet()->getSelectedCells(); + } + + /** + * Get the currently active cell coordinate in currently active sheet. + * Only used for supervisor + * + * @return string E.g. 'A1' + */ + public function getActiveCell() + { + return $this->getActiveSheet()->getActiveCell(); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if ((is_object($value)) && ($key != 'parent')) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet.php b/application/third_party/PHPExcel/PHPExcel/Worksheet.php new file mode 100644 index 0000000..483aa00 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet.php @@ -0,0 +1,2968 @@ +<?php + +/** + * PHPExcel_Worksheet + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Worksheet implements PHPExcel_IComparable +{ + /* Break types */ + const BREAK_NONE = 0; + const BREAK_ROW = 1; + const BREAK_COLUMN = 2; + + /* Sheet state */ + const SHEETSTATE_VISIBLE = 'visible'; + const SHEETSTATE_HIDDEN = 'hidden'; + const SHEETSTATE_VERYHIDDEN = 'veryHidden'; + + /** + * Invalid characters in sheet title + * + * @var array + */ + private static $invalidCharacters = array('*', ':', '/', '\\', '?', '[', ']'); + + /** + * Parent spreadsheet + * + * @var PHPExcel + */ + private $parent; + + /** + * Cacheable collection of cells + * + * @var PHPExcel_CachedObjectStorage_xxx + */ + private $cellCollection; + + /** + * Collection of row dimensions + * + * @var PHPExcel_Worksheet_RowDimension[] + */ + private $rowDimensions = array(); + + /** + * Default row dimension + * + * @var PHPExcel_Worksheet_RowDimension + */ + private $defaultRowDimension; + + /** + * Collection of column dimensions + * + * @var PHPExcel_Worksheet_ColumnDimension[] + */ + private $columnDimensions = array(); + + /** + * Default column dimension + * + * @var PHPExcel_Worksheet_ColumnDimension + */ + private $defaultColumnDimension = null; + + /** + * Collection of drawings + * + * @var PHPExcel_Worksheet_BaseDrawing[] + */ + private $drawingCollection = null; + + /** + * Collection of Chart objects + * + * @var PHPExcel_Chart[] + */ + private $chartCollection = array(); + + /** + * Worksheet title + * + * @var string + */ + private $title; + + /** + * Sheet state + * + * @var string + */ + private $sheetState; + + /** + * Page setup + * + * @var PHPExcel_Worksheet_PageSetup + */ + private $pageSetup; + + /** + * Page margins + * + * @var PHPExcel_Worksheet_PageMargins + */ + private $pageMargins; + + /** + * Page header/footer + * + * @var PHPExcel_Worksheet_HeaderFooter + */ + private $headerFooter; + + /** + * Sheet view + * + * @var PHPExcel_Worksheet_SheetView + */ + private $sheetView; + + /** + * Protection + * + * @var PHPExcel_Worksheet_Protection + */ + private $protection; + + /** + * Collection of styles + * + * @var PHPExcel_Style[] + */ + private $styles = array(); + + /** + * Conditional styles. Indexed by cell coordinate, e.g. 'A1' + * + * @var array + */ + private $conditionalStylesCollection = array(); + + /** + * Is the current cell collection sorted already? + * + * @var boolean + */ + private $cellCollectionIsSorted = false; + + /** + * Collection of breaks + * + * @var array + */ + private $breaks = array(); + + /** + * Collection of merged cell ranges + * + * @var array + */ + private $mergeCells = array(); + + /** + * Collection of protected cell ranges + * + * @var array + */ + private $protectedCells = array(); + + /** + * Autofilter Range and selection + * + * @var PHPExcel_Worksheet_AutoFilter + */ + private $autoFilter; + + /** + * Freeze pane + * + * @var string + */ + private $freezePane = ''; + + /** + * Show gridlines? + * + * @var boolean + */ + private $showGridlines = true; + + /** + * Print gridlines? + * + * @var boolean + */ + private $printGridlines = false; + + /** + * Show row and column headers? + * + * @var boolean + */ + private $showRowColHeaders = true; + + /** + * Show summary below? (Row/Column outline) + * + * @var boolean + */ + private $showSummaryBelow = true; + + /** + * Show summary right? (Row/Column outline) + * + * @var boolean + */ + private $showSummaryRight = true; + + /** + * Collection of comments + * + * @var PHPExcel_Comment[] + */ + private $comments = array(); + + /** + * Active cell. (Only one!) + * + * @var string + */ + private $activeCell = 'A1'; + + /** + * Selected cells + * + * @var string + */ + private $selectedCells = 'A1'; + + /** + * Cached highest column + * + * @var string + */ + private $cachedHighestColumn = 'A'; + + /** + * Cached highest row + * + * @var int + */ + private $cachedHighestRow = 1; + + /** + * Right-to-left? + * + * @var boolean + */ + private $rightToLeft = false; + + /** + * Hyperlinks. Indexed by cell coordinate, e.g. 'A1' + * + * @var array + */ + private $hyperlinkCollection = array(); + + /** + * Data validation objects. Indexed by cell coordinate, e.g. 'A1' + * + * @var array + */ + private $dataValidationCollection = array(); + + /** + * Tab color + * + * @var PHPExcel_Style_Color + */ + private $tabColor; + + /** + * Dirty flag + * + * @var boolean + */ + private $dirty = true; + + /** + * Hash + * + * @var string + */ + private $hash; + + /** + * CodeName + * + * @var string + */ + private $codeName = null; + + /** + * Create a new worksheet + * + * @param PHPExcel $pParent + * @param string $pTitle + */ + public function __construct(PHPExcel $pParent = null, $pTitle = 'Worksheet') + { + // Set parent and title + $this->parent = $pParent; + $this->setTitle($pTitle, false); + // setTitle can change $pTitle + $this->setCodeName($this->getTitle()); + $this->setSheetState(PHPExcel_Worksheet::SHEETSTATE_VISIBLE); + + $this->cellCollection = PHPExcel_CachedObjectStorageFactory::getInstance($this); + // Set page setup + $this->pageSetup = new PHPExcel_Worksheet_PageSetup(); + // Set page margins + $this->pageMargins = new PHPExcel_Worksheet_PageMargins(); + // Set page header/footer + $this->headerFooter = new PHPExcel_Worksheet_HeaderFooter(); + // Set sheet view + $this->sheetView = new PHPExcel_Worksheet_SheetView(); + // Drawing collection + $this->drawingCollection = new ArrayObject(); + // Chart collection + $this->chartCollection = new ArrayObject(); + // Protection + $this->protection = new PHPExcel_Worksheet_Protection(); + // Default row dimension + $this->defaultRowDimension = new PHPExcel_Worksheet_RowDimension(null); + // Default column dimension + $this->defaultColumnDimension = new PHPExcel_Worksheet_ColumnDimension(null); + $this->autoFilter = new PHPExcel_Worksheet_AutoFilter(null, $this); + } + + + /** + * Disconnect all cells from this PHPExcel_Worksheet object, + * typically so that the worksheet object can be unset + * + */ + public function disconnectCells() + { + if ($this->cellCollection !== null) { + $this->cellCollection->unsetWorksheetCells(); + $this->cellCollection = null; + } + // detach ourself from the workbook, so that it can then delete this worksheet successfully + $this->parent = null; + } + + /** + * Code to execute when this worksheet is unset() + * + */ + public function __destruct() + { + PHPExcel_Calculation::getInstance($this->parent)->clearCalculationCacheForWorksheet($this->title); + + $this->disconnectCells(); + } + + /** + * Return the cache controller for the cell collection + * + * @return PHPExcel_CachedObjectStorage_xxx + */ + public function getCellCacheController() + { + return $this->cellCollection; + } + + + /** + * Get array of invalid characters for sheet title + * + * @return array + */ + public static function getInvalidCharacters() + { + return self::$invalidCharacters; + } + + /** + * Check sheet code name for valid Excel syntax + * + * @param string $pValue The string to check + * @return string The valid string + * @throws Exception + */ + private static function checkSheetCodeName($pValue) + { + $CharCount = PHPExcel_Shared_String::CountCharacters($pValue); + if ($CharCount == 0) { + throw new PHPExcel_Exception('Sheet code name cannot be empty.'); + } + // Some of the printable ASCII characters are invalid: * : / \ ? [ ] and first and last characters cannot be a "'" + if ((str_replace(self::$invalidCharacters, '', $pValue) !== $pValue) || + (PHPExcel_Shared_String::Substring($pValue, -1, 1)=='\'') || + (PHPExcel_Shared_String::Substring($pValue, 0, 1)=='\'')) { + throw new PHPExcel_Exception('Invalid character found in sheet code name'); + } + + // Maximum 31 characters allowed for sheet title + if ($CharCount > 31) { + throw new PHPExcel_Exception('Maximum 31 characters allowed in sheet code name.'); + } + + return $pValue; + } + + /** + * Check sheet title for valid Excel syntax + * + * @param string $pValue The string to check + * @return string The valid string + * @throws PHPExcel_Exception + */ + private static function checkSheetTitle($pValue) + { + // Some of the printable ASCII characters are invalid: * : / \ ? [ ] + if (str_replace(self::$invalidCharacters, '', $pValue) !== $pValue) { + throw new PHPExcel_Exception('Invalid character found in sheet title'); + } + + // Maximum 31 characters allowed for sheet title + if (PHPExcel_Shared_String::CountCharacters($pValue) > 31) { + throw new PHPExcel_Exception('Maximum 31 characters allowed in sheet title.'); + } + + return $pValue; + } + + /** + * Get collection of cells + * + * @param boolean $pSorted Also sort the cell collection? + * @return PHPExcel_Cell[] + */ + public function getCellCollection($pSorted = true) + { + if ($pSorted) { + // Re-order cell collection + return $this->sortCellCollection(); + } + if ($this->cellCollection !== null) { + return $this->cellCollection->getCellList(); + } + return array(); + } + + /** + * Sort collection of cells + * + * @return PHPExcel_Worksheet + */ + public function sortCellCollection() + { + if ($this->cellCollection !== null) { + return $this->cellCollection->getSortedCellList(); + } + return array(); + } + + /** + * Get collection of row dimensions + * + * @return PHPExcel_Worksheet_RowDimension[] + */ + public function getRowDimensions() + { + return $this->rowDimensions; + } + + /** + * Get default row dimension + * + * @return PHPExcel_Worksheet_RowDimension + */ + public function getDefaultRowDimension() + { + return $this->defaultRowDimension; + } + + /** + * Get collection of column dimensions + * + * @return PHPExcel_Worksheet_ColumnDimension[] + */ + public function getColumnDimensions() + { + return $this->columnDimensions; + } + + /** + * Get default column dimension + * + * @return PHPExcel_Worksheet_ColumnDimension + */ + public function getDefaultColumnDimension() + { + return $this->defaultColumnDimension; + } + + /** + * Get collection of drawings + * + * @return PHPExcel_Worksheet_BaseDrawing[] + */ + public function getDrawingCollection() + { + return $this->drawingCollection; + } + + /** + * Get collection of charts + * + * @return PHPExcel_Chart[] + */ + public function getChartCollection() + { + return $this->chartCollection; + } + + /** + * Add chart + * + * @param PHPExcel_Chart $pChart + * @param int|null $iChartIndex Index where chart should go (0,1,..., or null for last) + * @return PHPExcel_Chart + */ + public function addChart(PHPExcel_Chart $pChart = null, $iChartIndex = null) + { + $pChart->setWorksheet($this); + if (is_null($iChartIndex)) { + $this->chartCollection[] = $pChart; + } else { + // Insert the chart at the requested index + array_splice($this->chartCollection, $iChartIndex, 0, array($pChart)); + } + + return $pChart; + } + + /** + * Return the count of charts on this worksheet + * + * @return int The number of charts + */ + public function getChartCount() + { + return count($this->chartCollection); + } + + /** + * Get a chart by its index position + * + * @param string $index Chart index position + * @return false|PHPExcel_Chart + * @throws PHPExcel_Exception + */ + public function getChartByIndex($index = null) + { + $chartCount = count($this->chartCollection); + if ($chartCount == 0) { + return false; + } + if (is_null($index)) { + $index = --$chartCount; + } + if (!isset($this->chartCollection[$index])) { + return false; + } + + return $this->chartCollection[$index]; + } + + /** + * Return an array of the names of charts on this worksheet + * + * @return string[] The names of charts + * @throws PHPExcel_Exception + */ + public function getChartNames() + { + $chartNames = array(); + foreach ($this->chartCollection as $chart) { + $chartNames[] = $chart->getName(); + } + return $chartNames; + } + + /** + * Get a chart by name + * + * @param string $chartName Chart name + * @return false|PHPExcel_Chart + * @throws PHPExcel_Exception + */ + public function getChartByName($chartName = '') + { + $chartCount = count($this->chartCollection); + if ($chartCount == 0) { + return false; + } + foreach ($this->chartCollection as $index => $chart) { + if ($chart->getName() == $chartName) { + return $this->chartCollection[$index]; + } + } + return false; + } + + /** + * Refresh column dimensions + * + * @return PHPExcel_Worksheet + */ + public function refreshColumnDimensions() + { + $currentColumnDimensions = $this->getColumnDimensions(); + $newColumnDimensions = array(); + + foreach ($currentColumnDimensions as $objColumnDimension) { + $newColumnDimensions[$objColumnDimension->getColumnIndex()] = $objColumnDimension; + } + + $this->columnDimensions = $newColumnDimensions; + + return $this; + } + + /** + * Refresh row dimensions + * + * @return PHPExcel_Worksheet + */ + public function refreshRowDimensions() + { + $currentRowDimensions = $this->getRowDimensions(); + $newRowDimensions = array(); + + foreach ($currentRowDimensions as $objRowDimension) { + $newRowDimensions[$objRowDimension->getRowIndex()] = $objRowDimension; + } + + $this->rowDimensions = $newRowDimensions; + + return $this; + } + + /** + * Calculate worksheet dimension + * + * @return string String containing the dimension of this worksheet + */ + public function calculateWorksheetDimension() + { + // Return + return 'A1' . ':' . $this->getHighestColumn() . $this->getHighestRow(); + } + + /** + * Calculate worksheet data dimension + * + * @return string String containing the dimension of this worksheet that actually contain data + */ + public function calculateWorksheetDataDimension() + { + // Return + return 'A1' . ':' . $this->getHighestDataColumn() . $this->getHighestDataRow(); + } + + /** + * Calculate widths for auto-size columns + * + * @param boolean $calculateMergeCells Calculate merge cell width + * @return PHPExcel_Worksheet; + */ + public function calculateColumnWidths($calculateMergeCells = false) + { + // initialize $autoSizes array + $autoSizes = array(); + foreach ($this->getColumnDimensions() as $colDimension) { + if ($colDimension->getAutoSize()) { + $autoSizes[$colDimension->getColumnIndex()] = -1; + } + } + + // There is only something to do if there are some auto-size columns + if (!empty($autoSizes)) { + // build list of cells references that participate in a merge + $isMergeCell = array(); + foreach ($this->getMergeCells() as $cells) { + foreach (PHPExcel_Cell::extractAllCellReferencesInRange($cells) as $cellReference) { + $isMergeCell[$cellReference] = true; + } + } + + // loop through all cells in the worksheet + foreach ($this->getCellCollection(false) as $cellID) { + $cell = $this->getCell($cellID, false); + if ($cell !== null && isset($autoSizes[$this->cellCollection->getCurrentColumn()])) { + // Determine width if cell does not participate in a merge + if (!isset($isMergeCell[$this->cellCollection->getCurrentAddress()])) { + // Calculated value + // To formatted string + $cellValue = PHPExcel_Style_NumberFormat::toFormattedString( + $cell->getCalculatedValue(), + $this->getParent()->getCellXfByIndex($cell->getXfIndex())->getNumberFormat()->getFormatCode() + ); + + $autoSizes[$this->cellCollection->getCurrentColumn()] = max( + (float) $autoSizes[$this->cellCollection->getCurrentColumn()], + (float)PHPExcel_Shared_Font::calculateColumnWidth( + $this->getParent()->getCellXfByIndex($cell->getXfIndex())->getFont(), + $cellValue, + $this->getParent()->getCellXfByIndex($cell->getXfIndex())->getAlignment()->getTextRotation(), + $this->getDefaultStyle()->getFont() + ) + ); + } + } + } + + // adjust column widths + foreach ($autoSizes as $columnIndex => $width) { + if ($width == -1) { + $width = $this->getDefaultColumnDimension()->getWidth(); + } + $this->getColumnDimension($columnIndex)->setWidth($width); + } + } + + return $this; + } + + /** + * Get parent + * + * @return PHPExcel + */ + public function getParent() + { + return $this->parent; + } + + /** + * Re-bind parent + * + * @param PHPExcel $parent + * @return PHPExcel_Worksheet + */ + public function rebindParent(PHPExcel $parent) + { + if ($this->parent !== null) { + $namedRanges = $this->parent->getNamedRanges(); + foreach ($namedRanges as $namedRange) { + $parent->addNamedRange($namedRange); + } + + $this->parent->removeSheetByIndex( + $this->parent->getIndex($this) + ); + } + $this->parent = $parent; + + return $this; + } + + /** + * Get title + * + * @return string + */ + public function getTitle() + { + return $this->title; + } + + /** + * Set title + * + * @param string $pValue String containing the dimension of this worksheet + * @param string $updateFormulaCellReferences boolean Flag indicating whether cell references in formulae should + * be updated to reflect the new sheet name. + * This should be left as the default true, unless you are + * certain that no formula cells on any worksheet contain + * references to this worksheet + * @return PHPExcel_Worksheet + */ + public function setTitle($pValue = 'Worksheet', $updateFormulaCellReferences = true) + { + // Is this a 'rename' or not? + if ($this->getTitle() == $pValue) { + return $this; + } + + // Syntax check + self::checkSheetTitle($pValue); + + // Old title + $oldTitle = $this->getTitle(); + + if ($this->parent) { + // Is there already such sheet name? + if ($this->parent->sheetNameExists($pValue)) { + // Use name, but append with lowest possible integer + + if (PHPExcel_Shared_String::CountCharacters($pValue) > 29) { + $pValue = PHPExcel_Shared_String::Substring($pValue, 0, 29); + } + $i = 1; + while ($this->parent->sheetNameExists($pValue . ' ' . $i)) { + ++$i; + if ($i == 10) { + if (PHPExcel_Shared_String::CountCharacters($pValue) > 28) { + $pValue = PHPExcel_Shared_String::Substring($pValue, 0, 28); + } + } elseif ($i == 100) { + if (PHPExcel_Shared_String::CountCharacters($pValue) > 27) { + $pValue = PHPExcel_Shared_String::Substring($pValue, 0, 27); + } + } + } + + $altTitle = $pValue . ' ' . $i; + return $this->setTitle($altTitle, $updateFormulaCellReferences); + } + } + + // Set title + $this->title = $pValue; + $this->dirty = true; + + if ($this->parent && $this->parent->getCalculationEngine()) { + // New title + $newTitle = $this->getTitle(); + $this->parent->getCalculationEngine() + ->renameCalculationCacheForWorksheet($oldTitle, $newTitle); + if ($updateFormulaCellReferences) { + PHPExcel_ReferenceHelper::getInstance()->updateNamedFormulas($this->parent, $oldTitle, $newTitle); + } + } + + return $this; + } + + /** + * Get sheet state + * + * @return string Sheet state (visible, hidden, veryHidden) + */ + public function getSheetState() + { + return $this->sheetState; + } + + /** + * Set sheet state + * + * @param string $value Sheet state (visible, hidden, veryHidden) + * @return PHPExcel_Worksheet + */ + public function setSheetState($value = PHPExcel_Worksheet::SHEETSTATE_VISIBLE) + { + $this->sheetState = $value; + return $this; + } + + /** + * Get page setup + * + * @return PHPExcel_Worksheet_PageSetup + */ + public function getPageSetup() + { + return $this->pageSetup; + } + + /** + * Set page setup + * + * @param PHPExcel_Worksheet_PageSetup $pValue + * @return PHPExcel_Worksheet + */ + public function setPageSetup(PHPExcel_Worksheet_PageSetup $pValue) + { + $this->pageSetup = $pValue; + return $this; + } + + /** + * Get page margins + * + * @return PHPExcel_Worksheet_PageMargins + */ + public function getPageMargins() + { + return $this->pageMargins; + } + + /** + * Set page margins + * + * @param PHPExcel_Worksheet_PageMargins $pValue + * @return PHPExcel_Worksheet + */ + public function setPageMargins(PHPExcel_Worksheet_PageMargins $pValue) + { + $this->pageMargins = $pValue; + return $this; + } + + /** + * Get page header/footer + * + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function getHeaderFooter() + { + return $this->headerFooter; + } + + /** + * Set page header/footer + * + * @param PHPExcel_Worksheet_HeaderFooter $pValue + * @return PHPExcel_Worksheet + */ + public function setHeaderFooter(PHPExcel_Worksheet_HeaderFooter $pValue) + { + $this->headerFooter = $pValue; + return $this; + } + + /** + * Get sheet view + * + * @return PHPExcel_Worksheet_SheetView + */ + public function getSheetView() + { + return $this->sheetView; + } + + /** + * Set sheet view + * + * @param PHPExcel_Worksheet_SheetView $pValue + * @return PHPExcel_Worksheet + */ + public function setSheetView(PHPExcel_Worksheet_SheetView $pValue) + { + $this->sheetView = $pValue; + return $this; + } + + /** + * Get Protection + * + * @return PHPExcel_Worksheet_Protection + */ + public function getProtection() + { + return $this->protection; + } + + /** + * Set Protection + * + * @param PHPExcel_Worksheet_Protection $pValue + * @return PHPExcel_Worksheet + */ + public function setProtection(PHPExcel_Worksheet_Protection $pValue) + { + $this->protection = $pValue; + $this->dirty = true; + + return $this; + } + + /** + * Get highest worksheet column + * + * @param string $row Return the data highest column for the specified row, + * or the highest column of any row if no row number is passed + * @return string Highest column name + */ + public function getHighestColumn($row = null) + { + if ($row == null) { + return $this->cachedHighestColumn; + } + return $this->getHighestDataColumn($row); + } + + /** + * Get highest worksheet column that contains data + * + * @param string $row Return the highest data column for the specified row, + * or the highest data column of any row if no row number is passed + * @return string Highest column name that contains data + */ + public function getHighestDataColumn($row = null) + { + return $this->cellCollection->getHighestColumn($row); + } + + /** + * Get highest worksheet row + * + * @param string $column Return the highest data row for the specified column, + * or the highest row of any column if no column letter is passed + * @return int Highest row number + */ + public function getHighestRow($column = null) + { + if ($column == null) { + return $this->cachedHighestRow; + } + return $this->getHighestDataRow($column); + } + + /** + * Get highest worksheet row that contains data + * + * @param string $column Return the highest data row for the specified column, + * or the highest data row of any column if no column letter is passed + * @return string Highest row number that contains data + */ + public function getHighestDataRow($column = null) + { + return $this->cellCollection->getHighestRow($column); + } + + /** + * Get highest worksheet column and highest row that have cell records + * + * @return array Highest column name and highest row number + */ + public function getHighestRowAndColumn() + { + return $this->cellCollection->getHighestRowAndColumn(); + } + + /** + * Set a cell value + * + * @param string $pCoordinate Coordinate of the cell + * @param mixed $pValue Value of the cell + * @param bool $returnCell Return the worksheet (false, default) or the cell (true) + * @return PHPExcel_Worksheet|PHPExcel_Cell Depending on the last parameter being specified + */ + public function setCellValue($pCoordinate = 'A1', $pValue = null, $returnCell = false) + { + $cell = $this->getCell(strtoupper($pCoordinate))->setValue($pValue); + return ($returnCell) ? $cell : $this; + } + + /** + * Set a cell value by using numeric cell coordinates + * + * @param string $pColumn Numeric column coordinate of the cell (A = 0) + * @param string $pRow Numeric row coordinate of the cell + * @param mixed $pValue Value of the cell + * @param bool $returnCell Return the worksheet (false, default) or the cell (true) + * @return PHPExcel_Worksheet|PHPExcel_Cell Depending on the last parameter being specified + */ + public function setCellValueByColumnAndRow($pColumn = 0, $pRow = 1, $pValue = null, $returnCell = false) + { + $cell = $this->getCellByColumnAndRow($pColumn, $pRow)->setValue($pValue); + return ($returnCell) ? $cell : $this; + } + + /** + * Set a cell value + * + * @param string $pCoordinate Coordinate of the cell + * @param mixed $pValue Value of the cell + * @param string $pDataType Explicit data type + * @param bool $returnCell Return the worksheet (false, default) or the cell (true) + * @return PHPExcel_Worksheet|PHPExcel_Cell Depending on the last parameter being specified + */ + public function setCellValueExplicit($pCoordinate = 'A1', $pValue = null, $pDataType = PHPExcel_Cell_DataType::TYPE_STRING, $returnCell = false) + { + // Set value + $cell = $this->getCell(strtoupper($pCoordinate))->setValueExplicit($pValue, $pDataType); + return ($returnCell) ? $cell : $this; + } + + /** + * Set a cell value by using numeric cell coordinates + * + * @param string $pColumn Numeric column coordinate of the cell + * @param string $pRow Numeric row coordinate of the cell + * @param mixed $pValue Value of the cell + * @param string $pDataType Explicit data type + * @param bool $returnCell Return the worksheet (false, default) or the cell (true) + * @return PHPExcel_Worksheet|PHPExcel_Cell Depending on the last parameter being specified + */ + public function setCellValueExplicitByColumnAndRow($pColumn = 0, $pRow = 1, $pValue = null, $pDataType = PHPExcel_Cell_DataType::TYPE_STRING, $returnCell = false) + { + $cell = $this->getCellByColumnAndRow($pColumn, $pRow)->setValueExplicit($pValue, $pDataType); + return ($returnCell) ? $cell : $this; + } + + /** + * Get cell at a specific coordinate + * + * @param string $pCoordinate Coordinate of the cell + * @param boolean $createIfNotExists Flag indicating whether a new cell should be created if it doesn't + * already exist, or a null should be returned instead + * @throws PHPExcel_Exception + * @return null|PHPExcel_Cell Cell that was found/created or null + */ + public function getCell($pCoordinate = 'A1', $createIfNotExists = true) + { + // Check cell collection + if ($this->cellCollection->isDataSet(strtoupper($pCoordinate))) { + return $this->cellCollection->getCacheData($pCoordinate); + } + + // Worksheet reference? + if (strpos($pCoordinate, '!') !== false) { + $worksheetReference = PHPExcel_Worksheet::extractSheetTitle($pCoordinate, true); + return $this->parent->getSheetByName($worksheetReference[0])->getCell(strtoupper($worksheetReference[1]), $createIfNotExists); + } + + // Named range? + if ((!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $pCoordinate, $matches)) && + (preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_NAMEDRANGE.'$/i', $pCoordinate, $matches))) { + $namedRange = PHPExcel_NamedRange::resolveRange($pCoordinate, $this); + if ($namedRange !== null) { + $pCoordinate = $namedRange->getRange(); + return $namedRange->getWorksheet()->getCell($pCoordinate, $createIfNotExists); + } + } + + // Uppercase coordinate + $pCoordinate = strtoupper($pCoordinate); + + if (strpos($pCoordinate, ':') !== false || strpos($pCoordinate, ',') !== false) { + throw new PHPExcel_Exception('Cell coordinate can not be a range of cells.'); + } elseif (strpos($pCoordinate, '$') !== false) { + throw new PHPExcel_Exception('Cell coordinate must not be absolute.'); + } + + // Create new cell object, if required + return $createIfNotExists ? $this->createNewCell($pCoordinate) : null; + } + + /** + * Get cell at a specific coordinate by using numeric cell coordinates + * + * @param string $pColumn Numeric column coordinate of the cell (starting from 0) + * @param string $pRow Numeric row coordinate of the cell + * @param boolean $createIfNotExists Flag indicating whether a new cell should be created if it doesn't + * already exist, or a null should be returned instead + * @return null|PHPExcel_Cell Cell that was found/created or null + */ + public function getCellByColumnAndRow($pColumn = 0, $pRow = 1, $createIfNotExists = true) + { + $columnLetter = PHPExcel_Cell::stringFromColumnIndex($pColumn); + $coordinate = $columnLetter . $pRow; + + if ($this->cellCollection->isDataSet($coordinate)) { + return $this->cellCollection->getCacheData($coordinate); + } + + // Create new cell object, if required + return $createIfNotExists ? $this->createNewCell($coordinate) : null; + } + + /** + * Create a new cell at the specified coordinate + * + * @param string $pCoordinate Coordinate of the cell + * @return PHPExcel_Cell Cell that was created + */ + private function createNewCell($pCoordinate) + { + $cell = $this->cellCollection->addCacheData( + $pCoordinate, + new PHPExcel_Cell(null, PHPExcel_Cell_DataType::TYPE_NULL, $this) + ); + $this->cellCollectionIsSorted = false; + + // Coordinates + $aCoordinates = PHPExcel_Cell::coordinateFromString($pCoordinate); + if (PHPExcel_Cell::columnIndexFromString($this->cachedHighestColumn) < PHPExcel_Cell::columnIndexFromString($aCoordinates[0])) { + $this->cachedHighestColumn = $aCoordinates[0]; + } + $this->cachedHighestRow = max($this->cachedHighestRow, $aCoordinates[1]); + + // Cell needs appropriate xfIndex from dimensions records + // but don't create dimension records if they don't already exist + $rowDimension = $this->getRowDimension($aCoordinates[1], false); + $columnDimension = $this->getColumnDimension($aCoordinates[0], false); + + if ($rowDimension !== null && $rowDimension->getXfIndex() > 0) { + // then there is a row dimension with explicit style, assign it to the cell + $cell->setXfIndex($rowDimension->getXfIndex()); + } elseif ($columnDimension !== null && $columnDimension->getXfIndex() > 0) { + // then there is a column dimension, assign it to the cell + $cell->setXfIndex($columnDimension->getXfIndex()); + } + + return $cell; + } + + /** + * Does the cell at a specific coordinate exist? + * + * @param string $pCoordinate Coordinate of the cell + * @throws PHPExcel_Exception + * @return boolean + */ + public function cellExists($pCoordinate = 'A1') + { + // Worksheet reference? + if (strpos($pCoordinate, '!') !== false) { + $worksheetReference = PHPExcel_Worksheet::extractSheetTitle($pCoordinate, true); + return $this->parent->getSheetByName($worksheetReference[0])->cellExists(strtoupper($worksheetReference[1])); + } + + // Named range? + if ((!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $pCoordinate, $matches)) && + (preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_NAMEDRANGE.'$/i', $pCoordinate, $matches))) { + $namedRange = PHPExcel_NamedRange::resolveRange($pCoordinate, $this); + if ($namedRange !== null) { + $pCoordinate = $namedRange->getRange(); + if ($this->getHashCode() != $namedRange->getWorksheet()->getHashCode()) { + if (!$namedRange->getLocalOnly()) { + return $namedRange->getWorksheet()->cellExists($pCoordinate); + } else { + throw new PHPExcel_Exception('Named range ' . $namedRange->getName() . ' is not accessible from within sheet ' . $this->getTitle()); + } + } + } else { + return false; + } + } + + // Uppercase coordinate + $pCoordinate = strtoupper($pCoordinate); + + if (strpos($pCoordinate, ':') !== false || strpos($pCoordinate, ',') !== false) { + throw new PHPExcel_Exception('Cell coordinate can not be a range of cells.'); + } elseif (strpos($pCoordinate, '$') !== false) { + throw new PHPExcel_Exception('Cell coordinate must not be absolute.'); + } else { + // Coordinates + $aCoordinates = PHPExcel_Cell::coordinateFromString($pCoordinate); + + // Cell exists? + return $this->cellCollection->isDataSet($pCoordinate); + } + } + + /** + * Cell at a specific coordinate by using numeric cell coordinates exists? + * + * @param string $pColumn Numeric column coordinate of the cell + * @param string $pRow Numeric row coordinate of the cell + * @return boolean + */ + public function cellExistsByColumnAndRow($pColumn = 0, $pRow = 1) + { + return $this->cellExists(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow); + } + + /** + * Get row dimension at a specific row + * + * @param int $pRow Numeric index of the row + * @return PHPExcel_Worksheet_RowDimension + */ + public function getRowDimension($pRow = 1, $create = true) + { + // Found + $found = null; + + // Get row dimension + if (!isset($this->rowDimensions[$pRow])) { + if (!$create) { + return null; + } + $this->rowDimensions[$pRow] = new PHPExcel_Worksheet_RowDimension($pRow); + + $this->cachedHighestRow = max($this->cachedHighestRow, $pRow); + } + return $this->rowDimensions[$pRow]; + } + + /** + * Get column dimension at a specific column + * + * @param string $pColumn String index of the column + * @return PHPExcel_Worksheet_ColumnDimension + */ + public function getColumnDimension($pColumn = 'A', $create = true) + { + // Uppercase coordinate + $pColumn = strtoupper($pColumn); + + // Fetch dimensions + if (!isset($this->columnDimensions[$pColumn])) { + if (!$create) { + return null; + } + $this->columnDimensions[$pColumn] = new PHPExcel_Worksheet_ColumnDimension($pColumn); + + if (PHPExcel_Cell::columnIndexFromString($this->cachedHighestColumn) < PHPExcel_Cell::columnIndexFromString($pColumn)) { + $this->cachedHighestColumn = $pColumn; + } + } + return $this->columnDimensions[$pColumn]; + } + + /** + * Get column dimension at a specific column by using numeric cell coordinates + * + * @param string $pColumn Numeric column coordinate of the cell + * @return PHPExcel_Worksheet_ColumnDimension + */ + public function getColumnDimensionByColumn($pColumn = 0) + { + return $this->getColumnDimension(PHPExcel_Cell::stringFromColumnIndex($pColumn)); + } + + /** + * Get styles + * + * @return PHPExcel_Style[] + */ + public function getStyles() + { + return $this->styles; + } + + /** + * Get default style of workbook. + * + * @deprecated + * @return PHPExcel_Style + * @throws PHPExcel_Exception + */ + public function getDefaultStyle() + { + return $this->parent->getDefaultStyle(); + } + + /** + * Set default style - should only be used by PHPExcel_IReader implementations! + * + * @deprecated + * @param PHPExcel_Style $pValue + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function setDefaultStyle(PHPExcel_Style $pValue) + { + $this->parent->getDefaultStyle()->applyFromArray(array( + 'font' => array( + 'name' => $pValue->getFont()->getName(), + 'size' => $pValue->getFont()->getSize(), + ), + )); + return $this; + } + + /** + * Get style for cell + * + * @param string $pCellCoordinate Cell coordinate (or range) to get style for + * @return PHPExcel_Style + * @throws PHPExcel_Exception + */ + public function getStyle($pCellCoordinate = 'A1') + { + // set this sheet as active + $this->parent->setActiveSheetIndex($this->parent->getIndex($this)); + + // set cell coordinate as active + $this->setSelectedCells(strtoupper($pCellCoordinate)); + + return $this->parent->getCellXfSupervisor(); + } + + /** + * Get conditional styles for a cell + * + * @param string $pCoordinate + * @return PHPExcel_Style_Conditional[] + */ + public function getConditionalStyles($pCoordinate = 'A1') + { + $pCoordinate = strtoupper($pCoordinate); + if (!isset($this->conditionalStylesCollection[$pCoordinate])) { + $this->conditionalStylesCollection[$pCoordinate] = array(); + } + return $this->conditionalStylesCollection[$pCoordinate]; + } + + /** + * Do conditional styles exist for this cell? + * + * @param string $pCoordinate + * @return boolean + */ + public function conditionalStylesExists($pCoordinate = 'A1') + { + if (isset($this->conditionalStylesCollection[strtoupper($pCoordinate)])) { + return true; + } + return false; + } + + /** + * Removes conditional styles for a cell + * + * @param string $pCoordinate + * @return PHPExcel_Worksheet + */ + public function removeConditionalStyles($pCoordinate = 'A1') + { + unset($this->conditionalStylesCollection[strtoupper($pCoordinate)]); + return $this; + } + + /** + * Get collection of conditional styles + * + * @return array + */ + public function getConditionalStylesCollection() + { + return $this->conditionalStylesCollection; + } + + /** + * Set conditional styles + * + * @param $pCoordinate string E.g. 'A1' + * @param $pValue PHPExcel_Style_Conditional[] + * @return PHPExcel_Worksheet + */ + public function setConditionalStyles($pCoordinate = 'A1', $pValue) + { + $this->conditionalStylesCollection[strtoupper($pCoordinate)] = $pValue; + return $this; + } + + /** + * Get style for cell by using numeric cell coordinates + * + * @param int $pColumn Numeric column coordinate of the cell + * @param int $pRow Numeric row coordinate of the cell + * @param int pColumn2 Numeric column coordinate of the range cell + * @param int pRow2 Numeric row coordinate of the range cell + * @return PHPExcel_Style + */ + public function getStyleByColumnAndRow($pColumn = 0, $pRow = 1, $pColumn2 = null, $pRow2 = null) + { + if (!is_null($pColumn2) && !is_null($pRow2)) { + $cellRange = PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow . ':' . PHPExcel_Cell::stringFromColumnIndex($pColumn2) . $pRow2; + return $this->getStyle($cellRange); + } + + return $this->getStyle(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow); + } + + /** + * Set shared cell style to a range of cells + * + * Please note that this will overwrite existing cell styles for cells in range! + * + * @deprecated + * @param PHPExcel_Style $pSharedCellStyle Cell style to share + * @param string $pRange Range of cells (i.e. "A1:B10"), or just one cell (i.e. "A1") + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function setSharedStyle(PHPExcel_Style $pSharedCellStyle = null, $pRange = '') + { + $this->duplicateStyle($pSharedCellStyle, $pRange); + return $this; + } + + /** + * Duplicate cell style to a range of cells + * + * Please note that this will overwrite existing cell styles for cells in range! + * + * @param PHPExcel_Style $pCellStyle Cell style to duplicate + * @param string $pRange Range of cells (i.e. "A1:B10"), or just one cell (i.e. "A1") + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function duplicateStyle(PHPExcel_Style $pCellStyle = null, $pRange = '') + { + // make sure we have a real style and not supervisor + $style = $pCellStyle->getIsSupervisor() ? $pCellStyle->getSharedComponent() : $pCellStyle; + + // Add the style to the workbook if necessary + $workbook = $this->parent; + if ($existingStyle = $this->parent->getCellXfByHashCode($pCellStyle->getHashCode())) { + // there is already such cell Xf in our collection + $xfIndex = $existingStyle->getIndex(); + } else { + // we don't have such a cell Xf, need to add + $workbook->addCellXf($pCellStyle); + $xfIndex = $pCellStyle->getIndex(); + } + + // Calculate range outer borders + list($rangeStart, $rangeEnd) = PHPExcel_Cell::rangeBoundaries($pRange . ':' . $pRange); + + // Make sure we can loop upwards on rows and columns + if ($rangeStart[0] > $rangeEnd[0] && $rangeStart[1] > $rangeEnd[1]) { + $tmp = $rangeStart; + $rangeStart = $rangeEnd; + $rangeEnd = $tmp; + } + + // Loop through cells and apply styles + for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) { + for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) { + $this->getCell(PHPExcel_Cell::stringFromColumnIndex($col - 1) . $row)->setXfIndex($xfIndex); + } + } + + return $this; + } + + /** + * Duplicate conditional style to a range of cells + * + * Please note that this will overwrite existing cell styles for cells in range! + * + * @param array of PHPExcel_Style_Conditional $pCellStyle Cell style to duplicate + * @param string $pRange Range of cells (i.e. "A1:B10"), or just one cell (i.e. "A1") + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function duplicateConditionalStyle(array $pCellStyle = null, $pRange = '') + { + foreach ($pCellStyle as $cellStyle) { + if (!($cellStyle instanceof PHPExcel_Style_Conditional)) { + throw new PHPExcel_Exception('Style is not a conditional style'); + } + } + + // Calculate range outer borders + list($rangeStart, $rangeEnd) = PHPExcel_Cell::rangeBoundaries($pRange . ':' . $pRange); + + // Make sure we can loop upwards on rows and columns + if ($rangeStart[0] > $rangeEnd[0] && $rangeStart[1] > $rangeEnd[1]) { + $tmp = $rangeStart; + $rangeStart = $rangeEnd; + $rangeEnd = $tmp; + } + + // Loop through cells and apply styles + for ($col = $rangeStart[0]; $col <= $rangeEnd[0]; ++$col) { + for ($row = $rangeStart[1]; $row <= $rangeEnd[1]; ++$row) { + $this->setConditionalStyles(PHPExcel_Cell::stringFromColumnIndex($col - 1) . $row, $pCellStyle); + } + } + + return $this; + } + + /** + * Duplicate cell style array to a range of cells + * + * Please note that this will overwrite existing cell styles for cells in range, + * if they are in the styles array. For example, if you decide to set a range of + * cells to font bold, only include font bold in the styles array. + * + * @deprecated + * @param array $pStyles Array containing style information + * @param string $pRange Range of cells (i.e. "A1:B10"), or just one cell (i.e. "A1") + * @param boolean $pAdvanced Advanced mode for setting borders. + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function duplicateStyleArray($pStyles = null, $pRange = '', $pAdvanced = true) + { + $this->getStyle($pRange)->applyFromArray($pStyles, $pAdvanced); + return $this; + } + + /** + * Set break on a cell + * + * @param string $pCell Cell coordinate (e.g. A1) + * @param int $pBreak Break type (type of PHPExcel_Worksheet::BREAK_*) + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function setBreak($pCell = 'A1', $pBreak = PHPExcel_Worksheet::BREAK_NONE) + { + // Uppercase coordinate + $pCell = strtoupper($pCell); + + if ($pCell != '') { + if ($pBreak == PHPExcel_Worksheet::BREAK_NONE) { + if (isset($this->breaks[$pCell])) { + unset($this->breaks[$pCell]); + } + } else { + $this->breaks[$pCell] = $pBreak; + } + } else { + throw new PHPExcel_Exception('No cell coordinate specified.'); + } + + return $this; + } + + /** + * Set break on a cell by using numeric cell coordinates + * + * @param integer $pColumn Numeric column coordinate of the cell + * @param integer $pRow Numeric row coordinate of the cell + * @param integer $pBreak Break type (type of PHPExcel_Worksheet::BREAK_*) + * @return PHPExcel_Worksheet + */ + public function setBreakByColumnAndRow($pColumn = 0, $pRow = 1, $pBreak = PHPExcel_Worksheet::BREAK_NONE) + { + return $this->setBreak(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow, $pBreak); + } + + /** + * Get breaks + * + * @return array[] + */ + public function getBreaks() + { + return $this->breaks; + } + + /** + * Set merge on a cell range + * + * @param string $pRange Cell range (e.g. A1:E1) + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function mergeCells($pRange = 'A1:A1') + { + // Uppercase coordinate + $pRange = strtoupper($pRange); + + if (strpos($pRange, ':') !== false) { + $this->mergeCells[$pRange] = $pRange; + + // make sure cells are created + + // get the cells in the range + $aReferences = PHPExcel_Cell::extractAllCellReferencesInRange($pRange); + + // create upper left cell if it does not already exist + $upperLeft = $aReferences[0]; + if (!$this->cellExists($upperLeft)) { + $this->getCell($upperLeft)->setValueExplicit(null, PHPExcel_Cell_DataType::TYPE_NULL); + } + + // Blank out the rest of the cells in the range (if they exist) + $count = count($aReferences); + for ($i = 1; $i < $count; $i++) { + if ($this->cellExists($aReferences[$i])) { + $this->getCell($aReferences[$i])->setValueExplicit(null, PHPExcel_Cell_DataType::TYPE_NULL); + } + } + } else { + throw new PHPExcel_Exception('Merge must be set on a range of cells.'); + } + + return $this; + } + + /** + * Set merge on a cell range by using numeric cell coordinates + * + * @param int $pColumn1 Numeric column coordinate of the first cell + * @param int $pRow1 Numeric row coordinate of the first cell + * @param int $pColumn2 Numeric column coordinate of the last cell + * @param int $pRow2 Numeric row coordinate of the last cell + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function mergeCellsByColumnAndRow($pColumn1 = 0, $pRow1 = 1, $pColumn2 = 0, $pRow2 = 1) + { + $cellRange = PHPExcel_Cell::stringFromColumnIndex($pColumn1) . $pRow1 . ':' . PHPExcel_Cell::stringFromColumnIndex($pColumn2) . $pRow2; + return $this->mergeCells($cellRange); + } + + /** + * Remove merge on a cell range + * + * @param string $pRange Cell range (e.g. A1:E1) + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function unmergeCells($pRange = 'A1:A1') + { + // Uppercase coordinate + $pRange = strtoupper($pRange); + + if (strpos($pRange, ':') !== false) { + if (isset($this->mergeCells[$pRange])) { + unset($this->mergeCells[$pRange]); + } else { + throw new PHPExcel_Exception('Cell range ' . $pRange . ' not known as merged.'); + } + } else { + throw new PHPExcel_Exception('Merge can only be removed from a range of cells.'); + } + + return $this; + } + + /** + * Remove merge on a cell range by using numeric cell coordinates + * + * @param int $pColumn1 Numeric column coordinate of the first cell + * @param int $pRow1 Numeric row coordinate of the first cell + * @param int $pColumn2 Numeric column coordinate of the last cell + * @param int $pRow2 Numeric row coordinate of the last cell + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function unmergeCellsByColumnAndRow($pColumn1 = 0, $pRow1 = 1, $pColumn2 = 0, $pRow2 = 1) + { + $cellRange = PHPExcel_Cell::stringFromColumnIndex($pColumn1) . $pRow1 . ':' . PHPExcel_Cell::stringFromColumnIndex($pColumn2) . $pRow2; + return $this->unmergeCells($cellRange); + } + + /** + * Get merge cells array. + * + * @return array[] + */ + public function getMergeCells() + { + return $this->mergeCells; + } + + /** + * Set merge cells array for the entire sheet. Use instead mergeCells() to merge + * a single cell range. + * + * @param array + */ + public function setMergeCells($pValue = array()) + { + $this->mergeCells = $pValue; + return $this; + } + + /** + * Set protection on a cell range + * + * @param string $pRange Cell (e.g. A1) or cell range (e.g. A1:E1) + * @param string $pPassword Password to unlock the protection + * @param boolean $pAlreadyHashed If the password has already been hashed, set this to true + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function protectCells($pRange = 'A1', $pPassword = '', $pAlreadyHashed = false) + { + // Uppercase coordinate + $pRange = strtoupper($pRange); + + if (!$pAlreadyHashed) { + $pPassword = PHPExcel_Shared_PasswordHasher::hashPassword($pPassword); + } + $this->protectedCells[$pRange] = $pPassword; + + return $this; + } + + /** + * Set protection on a cell range by using numeric cell coordinates + * + * @param int $pColumn1 Numeric column coordinate of the first cell + * @param int $pRow1 Numeric row coordinate of the first cell + * @param int $pColumn2 Numeric column coordinate of the last cell + * @param int $pRow2 Numeric row coordinate of the last cell + * @param string $pPassword Password to unlock the protection + * @param boolean $pAlreadyHashed If the password has already been hashed, set this to true + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function protectCellsByColumnAndRow($pColumn1 = 0, $pRow1 = 1, $pColumn2 = 0, $pRow2 = 1, $pPassword = '', $pAlreadyHashed = false) + { + $cellRange = PHPExcel_Cell::stringFromColumnIndex($pColumn1) . $pRow1 . ':' . PHPExcel_Cell::stringFromColumnIndex($pColumn2) . $pRow2; + return $this->protectCells($cellRange, $pPassword, $pAlreadyHashed); + } + + /** + * Remove protection on a cell range + * + * @param string $pRange Cell (e.g. A1) or cell range (e.g. A1:E1) + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function unprotectCells($pRange = 'A1') + { + // Uppercase coordinate + $pRange = strtoupper($pRange); + + if (isset($this->protectedCells[$pRange])) { + unset($this->protectedCells[$pRange]); + } else { + throw new PHPExcel_Exception('Cell range ' . $pRange . ' not known as protected.'); + } + return $this; + } + + /** + * Remove protection on a cell range by using numeric cell coordinates + * + * @param int $pColumn1 Numeric column coordinate of the first cell + * @param int $pRow1 Numeric row coordinate of the first cell + * @param int $pColumn2 Numeric column coordinate of the last cell + * @param int $pRow2 Numeric row coordinate of the last cell + * @param string $pPassword Password to unlock the protection + * @param boolean $pAlreadyHashed If the password has already been hashed, set this to true + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function unprotectCellsByColumnAndRow($pColumn1 = 0, $pRow1 = 1, $pColumn2 = 0, $pRow2 = 1, $pPassword = '', $pAlreadyHashed = false) + { + $cellRange = PHPExcel_Cell::stringFromColumnIndex($pColumn1) . $pRow1 . ':' . PHPExcel_Cell::stringFromColumnIndex($pColumn2) . $pRow2; + return $this->unprotectCells($cellRange, $pPassword, $pAlreadyHashed); + } + + /** + * Get protected cells + * + * @return array[] + */ + public function getProtectedCells() + { + return $this->protectedCells; + } + + /** + * Get Autofilter + * + * @return PHPExcel_Worksheet_AutoFilter + */ + public function getAutoFilter() + { + return $this->autoFilter; + } + + /** + * Set AutoFilter + * + * @param PHPExcel_Worksheet_AutoFilter|string $pValue + * A simple string containing a Cell range like 'A1:E10' is permitted for backward compatibility + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function setAutoFilter($pValue) + { + $pRange = strtoupper($pValue); + if (is_string($pValue)) { + $this->autoFilter->setRange($pValue); + } elseif (is_object($pValue) && ($pValue instanceof PHPExcel_Worksheet_AutoFilter)) { + $this->autoFilter = $pValue; + } + return $this; + } + + /** + * Set Autofilter Range by using numeric cell coordinates + * + * @param integer $pColumn1 Numeric column coordinate of the first cell + * @param integer $pRow1 Numeric row coordinate of the first cell + * @param integer $pColumn2 Numeric column coordinate of the second cell + * @param integer $pRow2 Numeric row coordinate of the second cell + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function setAutoFilterByColumnAndRow($pColumn1 = 0, $pRow1 = 1, $pColumn2 = 0, $pRow2 = 1) + { + return $this->setAutoFilter( + PHPExcel_Cell::stringFromColumnIndex($pColumn1) . $pRow1 + . ':' . + PHPExcel_Cell::stringFromColumnIndex($pColumn2) . $pRow2 + ); + } + + /** + * Remove autofilter + * + * @return PHPExcel_Worksheet + */ + public function removeAutoFilter() + { + $this->autoFilter->setRange(null); + return $this; + } + + /** + * Get Freeze Pane + * + * @return string + */ + public function getFreezePane() + { + return $this->freezePane; + } + + /** + * Freeze Pane + * + * @param string $pCell Cell (i.e. A2) + * Examples: + * A2 will freeze the rows above cell A2 (i.e row 1) + * B1 will freeze the columns to the left of cell B1 (i.e column A) + * B2 will freeze the rows above and to the left of cell A2 + * (i.e row 1 and column A) + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function freezePane($pCell = '') + { + // Uppercase coordinate + $pCell = strtoupper($pCell); + if (strpos($pCell, ':') === false && strpos($pCell, ',') === false) { + $this->freezePane = $pCell; + } else { + throw new PHPExcel_Exception('Freeze pane can not be set on a range of cells.'); + } + return $this; + } + + /** + * Freeze Pane by using numeric cell coordinates + * + * @param int $pColumn Numeric column coordinate of the cell + * @param int $pRow Numeric row coordinate of the cell + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function freezePaneByColumnAndRow($pColumn = 0, $pRow = 1) + { + return $this->freezePane(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow); + } + + /** + * Unfreeze Pane + * + * @return PHPExcel_Worksheet + */ + public function unfreezePane() + { + return $this->freezePane(''); + } + + /** + * Insert a new row, updating all possible related data + * + * @param int $pBefore Insert before this one + * @param int $pNumRows Number of rows to insert + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function insertNewRowBefore($pBefore = 1, $pNumRows = 1) + { + if ($pBefore >= 1) { + $objReferenceHelper = PHPExcel_ReferenceHelper::getInstance(); + $objReferenceHelper->insertNewBefore('A' . $pBefore, 0, $pNumRows, $this); + } else { + throw new PHPExcel_Exception("Rows can only be inserted before at least row 1."); + } + return $this; + } + + /** + * Insert a new column, updating all possible related data + * + * @param int $pBefore Insert before this one + * @param int $pNumCols Number of columns to insert + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function insertNewColumnBefore($pBefore = 'A', $pNumCols = 1) + { + if (!is_numeric($pBefore)) { + $objReferenceHelper = PHPExcel_ReferenceHelper::getInstance(); + $objReferenceHelper->insertNewBefore($pBefore . '1', $pNumCols, 0, $this); + } else { + throw new PHPExcel_Exception("Column references should not be numeric."); + } + return $this; + } + + /** + * Insert a new column, updating all possible related data + * + * @param int $pBefore Insert before this one (numeric column coordinate of the cell) + * @param int $pNumCols Number of columns to insert + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function insertNewColumnBeforeByIndex($pBefore = 0, $pNumCols = 1) + { + if ($pBefore >= 0) { + return $this->insertNewColumnBefore(PHPExcel_Cell::stringFromColumnIndex($pBefore), $pNumCols); + } else { + throw new PHPExcel_Exception("Columns can only be inserted before at least column A (0)."); + } + } + + /** + * Delete a row, updating all possible related data + * + * @param int $pRow Remove starting with this one + * @param int $pNumRows Number of rows to remove + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function removeRow($pRow = 1, $pNumRows = 1) + { + if ($pRow >= 1) { + $highestRow = $this->getHighestDataRow(); + $objReferenceHelper = PHPExcel_ReferenceHelper::getInstance(); + $objReferenceHelper->insertNewBefore('A' . ($pRow + $pNumRows), 0, -$pNumRows, $this); + for ($r = 0; $r < $pNumRows; ++$r) { + $this->getCellCacheController()->removeRow($highestRow); + --$highestRow; + } + } else { + throw new PHPExcel_Exception("Rows to be deleted should at least start from row 1."); + } + return $this; + } + + /** + * Remove a column, updating all possible related data + * + * @param string $pColumn Remove starting with this one + * @param int $pNumCols Number of columns to remove + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function removeColumn($pColumn = 'A', $pNumCols = 1) + { + if (!is_numeric($pColumn)) { + $highestColumn = $this->getHighestDataColumn(); + $pColumn = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::columnIndexFromString($pColumn) - 1 + $pNumCols); + $objReferenceHelper = PHPExcel_ReferenceHelper::getInstance(); + $objReferenceHelper->insertNewBefore($pColumn . '1', -$pNumCols, 0, $this); + for ($c = 0; $c < $pNumCols; ++$c) { + $this->getCellCacheController()->removeColumn($highestColumn); + $highestColumn = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::columnIndexFromString($highestColumn) - 2); + } + } else { + throw new PHPExcel_Exception("Column references should not be numeric."); + } + return $this; + } + + /** + * Remove a column, updating all possible related data + * + * @param int $pColumn Remove starting with this one (numeric column coordinate of the cell) + * @param int $pNumCols Number of columns to remove + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function removeColumnByIndex($pColumn = 0, $pNumCols = 1) + { + if ($pColumn >= 0) { + return $this->removeColumn(PHPExcel_Cell::stringFromColumnIndex($pColumn), $pNumCols); + } else { + throw new PHPExcel_Exception("Columns to be deleted should at least start from column 0"); + } + } + + /** + * Show gridlines? + * + * @return boolean + */ + public function getShowGridlines() + { + return $this->showGridlines; + } + + /** + * Set show gridlines + * + * @param boolean $pValue Show gridlines (true/false) + * @return PHPExcel_Worksheet + */ + public function setShowGridlines($pValue = false) + { + $this->showGridlines = $pValue; + return $this; + } + + /** + * Print gridlines? + * + * @return boolean + */ + public function getPrintGridlines() + { + return $this->printGridlines; + } + + /** + * Set print gridlines + * + * @param boolean $pValue Print gridlines (true/false) + * @return PHPExcel_Worksheet + */ + public function setPrintGridlines($pValue = false) + { + $this->printGridlines = $pValue; + return $this; + } + + /** + * Show row and column headers? + * + * @return boolean + */ + public function getShowRowColHeaders() + { + return $this->showRowColHeaders; + } + + /** + * Set show row and column headers + * + * @param boolean $pValue Show row and column headers (true/false) + * @return PHPExcel_Worksheet + */ + public function setShowRowColHeaders($pValue = false) + { + $this->showRowColHeaders = $pValue; + return $this; + } + + /** + * Show summary below? (Row/Column outlining) + * + * @return boolean + */ + public function getShowSummaryBelow() + { + return $this->showSummaryBelow; + } + + /** + * Set show summary below + * + * @param boolean $pValue Show summary below (true/false) + * @return PHPExcel_Worksheet + */ + public function setShowSummaryBelow($pValue = true) + { + $this->showSummaryBelow = $pValue; + return $this; + } + + /** + * Show summary right? (Row/Column outlining) + * + * @return boolean + */ + public function getShowSummaryRight() + { + return $this->showSummaryRight; + } + + /** + * Set show summary right + * + * @param boolean $pValue Show summary right (true/false) + * @return PHPExcel_Worksheet + */ + public function setShowSummaryRight($pValue = true) + { + $this->showSummaryRight = $pValue; + return $this; + } + + /** + * Get comments + * + * @return PHPExcel_Comment[] + */ + public function getComments() + { + return $this->comments; + } + + /** + * Set comments array for the entire sheet. + * + * @param array of PHPExcel_Comment + * @return PHPExcel_Worksheet + */ + public function setComments($pValue = array()) + { + $this->comments = $pValue; + + return $this; + } + + /** + * Get comment for cell + * + * @param string $pCellCoordinate Cell coordinate to get comment for + * @return PHPExcel_Comment + * @throws PHPExcel_Exception + */ + public function getComment($pCellCoordinate = 'A1') + { + // Uppercase coordinate + $pCellCoordinate = strtoupper($pCellCoordinate); + + if (strpos($pCellCoordinate, ':') !== false || strpos($pCellCoordinate, ',') !== false) { + throw new PHPExcel_Exception('Cell coordinate string can not be a range of cells.'); + } elseif (strpos($pCellCoordinate, '$') !== false) { + throw new PHPExcel_Exception('Cell coordinate string must not be absolute.'); + } elseif ($pCellCoordinate == '') { + throw new PHPExcel_Exception('Cell coordinate can not be zero-length string.'); + } else { + // Check if we already have a comment for this cell. + // If not, create a new comment. + if (isset($this->comments[$pCellCoordinate])) { + return $this->comments[$pCellCoordinate]; + } else { + $newComment = new PHPExcel_Comment(); + $this->comments[$pCellCoordinate] = $newComment; + return $newComment; + } + } + } + + /** + * Get comment for cell by using numeric cell coordinates + * + * @param int $pColumn Numeric column coordinate of the cell + * @param int $pRow Numeric row coordinate of the cell + * @return PHPExcel_Comment + */ + public function getCommentByColumnAndRow($pColumn = 0, $pRow = 1) + { + return $this->getComment(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow); + } + + /** + * Get selected cell + * + * @deprecated + * @return string + */ + public function getSelectedCell() + { + return $this->getSelectedCells(); + } + + /** + * Get active cell + * + * @return string Example: 'A1' + */ + public function getActiveCell() + { + return $this->activeCell; + } + + /** + * Get selected cells + * + * @return string + */ + public function getSelectedCells() + { + return $this->selectedCells; + } + + /** + * Selected cell + * + * @param string $pCoordinate Cell (i.e. A1) + * @return PHPExcel_Worksheet + */ + public function setSelectedCell($pCoordinate = 'A1') + { + return $this->setSelectedCells($pCoordinate); + } + + /** + * Select a range of cells. + * + * @param string $pCoordinate Cell range, examples: 'A1', 'B2:G5', 'A:C', '3:6' + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function setSelectedCells($pCoordinate = 'A1') + { + // Uppercase coordinate + $pCoordinate = strtoupper($pCoordinate); + + // Convert 'A' to 'A:A' + $pCoordinate = preg_replace('/^([A-Z]+)$/', '${1}:${1}', $pCoordinate); + + // Convert '1' to '1:1' + $pCoordinate = preg_replace('/^([0-9]+)$/', '${1}:${1}', $pCoordinate); + + // Convert 'A:C' to 'A1:C1048576' + $pCoordinate = preg_replace('/^([A-Z]+):([A-Z]+)$/', '${1}1:${2}1048576', $pCoordinate); + + // Convert '1:3' to 'A1:XFD3' + $pCoordinate = preg_replace('/^([0-9]+):([0-9]+)$/', 'A${1}:XFD${2}', $pCoordinate); + + if (strpos($pCoordinate, ':') !== false || strpos($pCoordinate, ',') !== false) { + list($first, ) = PHPExcel_Cell::splitRange($pCoordinate); + $this->activeCell = $first[0]; + } else { + $this->activeCell = $pCoordinate; + } + $this->selectedCells = $pCoordinate; + return $this; + } + + /** + * Selected cell by using numeric cell coordinates + * + * @param int $pColumn Numeric column coordinate of the cell + * @param int $pRow Numeric row coordinate of the cell + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function setSelectedCellByColumnAndRow($pColumn = 0, $pRow = 1) + { + return $this->setSelectedCells(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow); + } + + /** + * Get right-to-left + * + * @return boolean + */ + public function getRightToLeft() + { + return $this->rightToLeft; + } + + /** + * Set right-to-left + * + * @param boolean $value Right-to-left true/false + * @return PHPExcel_Worksheet + */ + public function setRightToLeft($value = false) + { + $this->rightToLeft = $value; + return $this; + } + + /** + * Fill worksheet from values in array + * + * @param array $source Source array + * @param mixed $nullValue Value in source array that stands for blank cell + * @param string $startCell Insert array starting from this cell address as the top left coordinate + * @param boolean $strictNullComparison Apply strict comparison when testing for null values in the array + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet + */ + public function fromArray($source = null, $nullValue = null, $startCell = 'A1', $strictNullComparison = false) + { + if (is_array($source)) { + // Convert a 1-D array to 2-D (for ease of looping) + if (!is_array(end($source))) { + $source = array($source); + } + + // start coordinate + list ($startColumn, $startRow) = PHPExcel_Cell::coordinateFromString($startCell); + + // Loop through $source + foreach ($source as $rowData) { + $currentColumn = $startColumn; + foreach ($rowData as $cellValue) { + if ($strictNullComparison) { + if ($cellValue !== $nullValue) { + // Set cell value + $this->getCell($currentColumn . $startRow)->setValue($cellValue); + } + } else { + if ($cellValue != $nullValue) { + // Set cell value + $this->getCell($currentColumn . $startRow)->setValue($cellValue); + } + } + ++$currentColumn; + } + ++$startRow; + } + } else { + throw new PHPExcel_Exception("Parameter \$source should be an array."); + } + return $this; + } + + /** + * Create array from a range of cells + * + * @param string $pRange Range of cells (i.e. "A1:B10"), or just one cell (i.e. "A1") + * @param mixed $nullValue Value returned in the array entry if a cell doesn't exist + * @param boolean $calculateFormulas Should formulas be calculated? + * @param boolean $formatData Should formatting be applied to cell values? + * @param boolean $returnCellRef False - Return a simple array of rows and columns indexed by number counting from zero + * True - Return rows and columns indexed by their actual row and column IDs + * @return array + */ + public function rangeToArray($pRange = 'A1', $nullValue = null, $calculateFormulas = true, $formatData = true, $returnCellRef = false) + { + // Returnvalue + $returnValue = array(); + // Identify the range that we need to extract from the worksheet + list($rangeStart, $rangeEnd) = PHPExcel_Cell::rangeBoundaries($pRange); + $minCol = PHPExcel_Cell::stringFromColumnIndex($rangeStart[0] -1); + $minRow = $rangeStart[1]; + $maxCol = PHPExcel_Cell::stringFromColumnIndex($rangeEnd[0] -1); + $maxRow = $rangeEnd[1]; + + $maxCol++; + // Loop through rows + $r = -1; + for ($row = $minRow; $row <= $maxRow; ++$row) { + $rRef = ($returnCellRef) ? $row : ++$r; + $c = -1; + // Loop through columns in the current row + for ($col = $minCol; $col != $maxCol; ++$col) { + $cRef = ($returnCellRef) ? $col : ++$c; + // Using getCell() will create a new cell if it doesn't already exist. We don't want that to happen + // so we test and retrieve directly against cellCollection + if ($this->cellCollection->isDataSet($col.$row)) { + // Cell exists + $cell = $this->cellCollection->getCacheData($col.$row); + if ($cell->getValue() !== null) { + if ($cell->getValue() instanceof PHPExcel_RichText) { + $returnValue[$rRef][$cRef] = $cell->getValue()->getPlainText(); + } else { + if ($calculateFormulas) { + $returnValue[$rRef][$cRef] = $cell->getCalculatedValue(); + } else { + $returnValue[$rRef][$cRef] = $cell->getValue(); + } + } + + if ($formatData) { + $style = $this->parent->getCellXfByIndex($cell->getXfIndex()); + $returnValue[$rRef][$cRef] = PHPExcel_Style_NumberFormat::toFormattedString( + $returnValue[$rRef][$cRef], + ($style && $style->getNumberFormat()) ? $style->getNumberFormat()->getFormatCode() : PHPExcel_Style_NumberFormat::FORMAT_GENERAL + ); + } + } else { + // Cell holds a NULL + $returnValue[$rRef][$cRef] = $nullValue; + } + } else { + // Cell doesn't exist + $returnValue[$rRef][$cRef] = $nullValue; + } + } + } + + // Return + return $returnValue; + } + + + /** + * Create array from a range of cells + * + * @param string $pNamedRange Name of the Named Range + * @param mixed $nullValue Value returned in the array entry if a cell doesn't exist + * @param boolean $calculateFormulas Should formulas be calculated? + * @param boolean $formatData Should formatting be applied to cell values? + * @param boolean $returnCellRef False - Return a simple array of rows and columns indexed by number counting from zero + * True - Return rows and columns indexed by their actual row and column IDs + * @return array + * @throws PHPExcel_Exception + */ + public function namedRangeToArray($pNamedRange = '', $nullValue = null, $calculateFormulas = true, $formatData = true, $returnCellRef = false) + { + $namedRange = PHPExcel_NamedRange::resolveRange($pNamedRange, $this); + if ($namedRange !== null) { + $pWorkSheet = $namedRange->getWorksheet(); + $pCellRange = $namedRange->getRange(); + + return $pWorkSheet->rangeToArray($pCellRange, $nullValue, $calculateFormulas, $formatData, $returnCellRef); + } + + throw new PHPExcel_Exception('Named Range '.$pNamedRange.' does not exist.'); + } + + + /** + * Create array from worksheet + * + * @param mixed $nullValue Value returned in the array entry if a cell doesn't exist + * @param boolean $calculateFormulas Should formulas be calculated? + * @param boolean $formatData Should formatting be applied to cell values? + * @param boolean $returnCellRef False - Return a simple array of rows and columns indexed by number counting from zero + * True - Return rows and columns indexed by their actual row and column IDs + * @return array + */ + public function toArray($nullValue = null, $calculateFormulas = true, $formatData = true, $returnCellRef = false) + { + // Garbage collect... + $this->garbageCollect(); + + // Identify the range that we need to extract from the worksheet + $maxCol = $this->getHighestColumn(); + $maxRow = $this->getHighestRow(); + // Return + return $this->rangeToArray('A1:'.$maxCol.$maxRow, $nullValue, $calculateFormulas, $formatData, $returnCellRef); + } + + /** + * Get row iterator + * + * @param integer $startRow The row number at which to start iterating + * @param integer $endRow The row number at which to stop iterating + * + * @return PHPExcel_Worksheet_RowIterator + */ + public function getRowIterator($startRow = 1, $endRow = null) + { + return new PHPExcel_Worksheet_RowIterator($this, $startRow, $endRow); + } + + /** + * Get column iterator + * + * @param string $startColumn The column address at which to start iterating + * @param string $endColumn The column address at which to stop iterating + * + * @return PHPExcel_Worksheet_ColumnIterator + */ + public function getColumnIterator($startColumn = 'A', $endColumn = null) + { + return new PHPExcel_Worksheet_ColumnIterator($this, $startColumn, $endColumn); + } + + /** + * Run PHPExcel garabage collector. + * + * @return PHPExcel_Worksheet + */ + public function garbageCollect() + { + // Flush cache + $this->cellCollection->getCacheData('A1'); + // Build a reference table from images +// $imageCoordinates = array(); +// $iterator = $this->getDrawingCollection()->getIterator(); +// while ($iterator->valid()) { +// $imageCoordinates[$iterator->current()->getCoordinates()] = true; +// +// $iterator->next(); +// } +// + // Lookup highest column and highest row if cells are cleaned + $colRow = $this->cellCollection->getHighestRowAndColumn(); + $highestRow = $colRow['row']; + $highestColumn = PHPExcel_Cell::columnIndexFromString($colRow['column']); + + // Loop through column dimensions + foreach ($this->columnDimensions as $dimension) { + $highestColumn = max($highestColumn, PHPExcel_Cell::columnIndexFromString($dimension->getColumnIndex())); + } + + // Loop through row dimensions + foreach ($this->rowDimensions as $dimension) { + $highestRow = max($highestRow, $dimension->getRowIndex()); + } + + // Cache values + if ($highestColumn < 0) { + $this->cachedHighestColumn = 'A'; + } else { + $this->cachedHighestColumn = PHPExcel_Cell::stringFromColumnIndex(--$highestColumn); + } + $this->cachedHighestRow = $highestRow; + + // Return + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + if ($this->dirty) { + $this->hash = md5($this->title . $this->autoFilter . ($this->protection->isProtectionEnabled() ? 't' : 'f') . __CLASS__); + $this->dirty = false; + } + return $this->hash; + } + + /** + * Extract worksheet title from range. + * + * Example: extractSheetTitle("testSheet!A1") ==> 'A1' + * Example: extractSheetTitle("'testSheet 1'!A1", true) ==> array('testSheet 1', 'A1'); + * + * @param string $pRange Range to extract title from + * @param bool $returnRange Return range? (see example) + * @return mixed + */ + public static function extractSheetTitle($pRange, $returnRange = false) + { + // Sheet title included? + if (($sep = strpos($pRange, '!')) === false) { + return ''; + } + + if ($returnRange) { + return array(trim(substr($pRange, 0, $sep), "'"), substr($pRange, $sep + 1)); + } + + return substr($pRange, $sep + 1); + } + + /** + * Get hyperlink + * + * @param string $pCellCoordinate Cell coordinate to get hyperlink for + */ + public function getHyperlink($pCellCoordinate = 'A1') + { + // return hyperlink if we already have one + if (isset($this->hyperlinkCollection[$pCellCoordinate])) { + return $this->hyperlinkCollection[$pCellCoordinate]; + } + + // else create hyperlink + $this->hyperlinkCollection[$pCellCoordinate] = new PHPExcel_Cell_Hyperlink(); + return $this->hyperlinkCollection[$pCellCoordinate]; + } + + /** + * Set hyperlnk + * + * @param string $pCellCoordinate Cell coordinate to insert hyperlink + * @param PHPExcel_Cell_Hyperlink $pHyperlink + * @return PHPExcel_Worksheet + */ + public function setHyperlink($pCellCoordinate = 'A1', PHPExcel_Cell_Hyperlink $pHyperlink = null) + { + if ($pHyperlink === null) { + unset($this->hyperlinkCollection[$pCellCoordinate]); + } else { + $this->hyperlinkCollection[$pCellCoordinate] = $pHyperlink; + } + return $this; + } + + /** + * Hyperlink at a specific coordinate exists? + * + * @param string $pCoordinate + * @return boolean + */ + public function hyperlinkExists($pCoordinate = 'A1') + { + return isset($this->hyperlinkCollection[$pCoordinate]); + } + + /** + * Get collection of hyperlinks + * + * @return PHPExcel_Cell_Hyperlink[] + */ + public function getHyperlinkCollection() + { + return $this->hyperlinkCollection; + } + + /** + * Get data validation + * + * @param string $pCellCoordinate Cell coordinate to get data validation for + */ + public function getDataValidation($pCellCoordinate = 'A1') + { + // return data validation if we already have one + if (isset($this->dataValidationCollection[$pCellCoordinate])) { + return $this->dataValidationCollection[$pCellCoordinate]; + } + + // else create data validation + $this->dataValidationCollection[$pCellCoordinate] = new PHPExcel_Cell_DataValidation(); + return $this->dataValidationCollection[$pCellCoordinate]; + } + + /** + * Set data validation + * + * @param string $pCellCoordinate Cell coordinate to insert data validation + * @param PHPExcel_Cell_DataValidation $pDataValidation + * @return PHPExcel_Worksheet + */ + public function setDataValidation($pCellCoordinate = 'A1', PHPExcel_Cell_DataValidation $pDataValidation = null) + { + if ($pDataValidation === null) { + unset($this->dataValidationCollection[$pCellCoordinate]); + } else { + $this->dataValidationCollection[$pCellCoordinate] = $pDataValidation; + } + return $this; + } + + /** + * Data validation at a specific coordinate exists? + * + * @param string $pCoordinate + * @return boolean + */ + public function dataValidationExists($pCoordinate = 'A1') + { + return isset($this->dataValidationCollection[$pCoordinate]); + } + + /** + * Get collection of data validations + * + * @return PHPExcel_Cell_DataValidation[] + */ + public function getDataValidationCollection() + { + return $this->dataValidationCollection; + } + + /** + * Accepts a range, returning it as a range that falls within the current highest row and column of the worksheet + * + * @param string $range + * @return string Adjusted range value + */ + public function shrinkRangeToFit($range) + { + $maxCol = $this->getHighestColumn(); + $maxRow = $this->getHighestRow(); + $maxCol = PHPExcel_Cell::columnIndexFromString($maxCol); + + $rangeBlocks = explode(' ', $range); + foreach ($rangeBlocks as &$rangeSet) { + $rangeBoundaries = PHPExcel_Cell::getRangeBoundaries($rangeSet); + + if (PHPExcel_Cell::columnIndexFromString($rangeBoundaries[0][0]) > $maxCol) { + $rangeBoundaries[0][0] = PHPExcel_Cell::stringFromColumnIndex($maxCol); + } + if ($rangeBoundaries[0][1] > $maxRow) { + $rangeBoundaries[0][1] = $maxRow; + } + if (PHPExcel_Cell::columnIndexFromString($rangeBoundaries[1][0]) > $maxCol) { + $rangeBoundaries[1][0] = PHPExcel_Cell::stringFromColumnIndex($maxCol); + } + if ($rangeBoundaries[1][1] > $maxRow) { + $rangeBoundaries[1][1] = $maxRow; + } + $rangeSet = $rangeBoundaries[0][0].$rangeBoundaries[0][1].':'.$rangeBoundaries[1][0].$rangeBoundaries[1][1]; + } + unset($rangeSet); + $stRange = implode(' ', $rangeBlocks); + + return $stRange; + } + + /** + * Get tab color + * + * @return PHPExcel_Style_Color + */ + public function getTabColor() + { + if ($this->tabColor === null) { + $this->tabColor = new PHPExcel_Style_Color(); + } + return $this->tabColor; + } + + /** + * Reset tab color + * + * @return PHPExcel_Worksheet + */ + public function resetTabColor() + { + $this->tabColor = null; + unset($this->tabColor); + + return $this; + } + + /** + * Tab color set? + * + * @return boolean + */ + public function isTabColorSet() + { + return ($this->tabColor !== null); + } + + /** + * Copy worksheet (!= clone!) + * + * @return PHPExcel_Worksheet + */ + public function copy() + { + $copied = clone $this; + + return $copied; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + foreach ($this as $key => $val) { + if ($key == 'parent') { + continue; + } + + if (is_object($val) || (is_array($val))) { + if ($key == 'cellCollection') { + $newCollection = clone $this->cellCollection; + $newCollection->copyCellCollection($this); + $this->cellCollection = $newCollection; + } elseif ($key == 'drawingCollection') { + $newCollection = clone $this->drawingCollection; + $this->drawingCollection = $newCollection; + } elseif (($key == 'autoFilter') && ($this->autoFilter instanceof PHPExcel_Worksheet_AutoFilter)) { + $newAutoFilter = clone $this->autoFilter; + $this->autoFilter = $newAutoFilter; + $this->autoFilter->setParent($this); + } else { + $this->{$key} = unserialize(serialize($val)); + } + } + } + } +/** + * Define the code name of the sheet + * + * @param null|string Same rule as Title minus space not allowed (but, like Excel, change silently space to underscore) + * @return objWorksheet + * @throws PHPExcel_Exception + */ + public function setCodeName($pValue = null) + { + // Is this a 'rename' or not? + if ($this->getCodeName() == $pValue) { + return $this; + } + $pValue = str_replace(' ', '_', $pValue);//Excel does this automatically without flinching, we are doing the same + // Syntax check + // throw an exception if not valid + self::checkSheetCodeName($pValue); + + // We use the same code that setTitle to find a valid codeName else not using a space (Excel don't like) but a '_' + + if ($this->getParent()) { + // Is there already such sheet name? + if ($this->getParent()->sheetCodeNameExists($pValue)) { + // Use name, but append with lowest possible integer + + if (PHPExcel_Shared_String::CountCharacters($pValue) > 29) { + $pValue = PHPExcel_Shared_String::Substring($pValue, 0, 29); + } + $i = 1; + while ($this->getParent()->sheetCodeNameExists($pValue . '_' . $i)) { + ++$i; + if ($i == 10) { + if (PHPExcel_Shared_String::CountCharacters($pValue) > 28) { + $pValue = PHPExcel_Shared_String::Substring($pValue, 0, 28); + } + } elseif ($i == 100) { + if (PHPExcel_Shared_String::CountCharacters($pValue) > 27) { + $pValue = PHPExcel_Shared_String::Substring($pValue, 0, 27); + } + } + } + + $pValue = $pValue . '_' . $i;// ok, we have a valid name + //codeName is'nt used in formula : no need to call for an update + //return $this->setTitle($altTitle, $updateFormulaCellReferences); + } + } + + $this->codeName=$pValue; + return $this; + } + /** + * Return the code name of the sheet + * + * @return null|string + */ + public function getCodeName() + { + return $this->codeName; + } + /** + * Sheet has a code name ? + * @return boolean + */ + public function hasCodeName() + { + return !(is_null($this->codeName)); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/AutoFilter.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/AutoFilter.php new file mode 100644 index 0000000..6ec8a44 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/AutoFilter.php @@ -0,0 +1,846 @@ +<?php + +/** + * PHPExcel_Worksheet_AutoFilter + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Worksheet_AutoFilter +{ + /** + * Autofilter Worksheet + * + * @var PHPExcel_Worksheet + */ + private $workSheet; + + + /** + * Autofilter Range + * + * @var string + */ + private $range = ''; + + + /** + * Autofilter Column Ruleset + * + * @var array of PHPExcel_Worksheet_AutoFilter_Column + */ + private $columns = array(); + + + /** + * Create a new PHPExcel_Worksheet_AutoFilter + * + * @param string $pRange Cell range (i.e. A1:E10) + * @param PHPExcel_Worksheet $pSheet + */ + public function __construct($pRange = '', PHPExcel_Worksheet $pSheet = null) + { + $this->range = $pRange; + $this->workSheet = $pSheet; + } + + /** + * Get AutoFilter Parent Worksheet + * + * @return PHPExcel_Worksheet + */ + public function getParent() + { + return $this->workSheet; + } + + /** + * Set AutoFilter Parent Worksheet + * + * @param PHPExcel_Worksheet $pSheet + * @return PHPExcel_Worksheet_AutoFilter + */ + public function setParent(PHPExcel_Worksheet $pSheet = null) + { + $this->workSheet = $pSheet; + + return $this; + } + + /** + * Get AutoFilter Range + * + * @return string + */ + public function getRange() + { + return $this->range; + } + + /** + * Set AutoFilter Range + * + * @param string $pRange Cell range (i.e. A1:E10) + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_AutoFilter + */ + public function setRange($pRange = '') + { + // Uppercase coordinate + $cellAddress = explode('!', strtoupper($pRange)); + if (count($cellAddress) > 1) { + list($worksheet, $pRange) = $cellAddress; + } + + if (strpos($pRange, ':') !== false) { + $this->range = $pRange; + } elseif (empty($pRange)) { + $this->range = ''; + } else { + throw new PHPExcel_Exception('Autofilter must be set on a range of cells.'); + } + + if (empty($pRange)) { + // Discard all column rules + $this->columns = array(); + } else { + // Discard any column rules that are no longer valid within this range + list($rangeStart, $rangeEnd) = PHPExcel_Cell::rangeBoundaries($this->range); + foreach ($this->columns as $key => $value) { + $colIndex = PHPExcel_Cell::columnIndexFromString($key); + if (($rangeStart[0] > $colIndex) || ($rangeEnd[0] < $colIndex)) { + unset($this->columns[$key]); + } + } + } + + return $this; + } + + /** + * Get all AutoFilter Columns + * + * @throws PHPExcel_Exception + * @return array of PHPExcel_Worksheet_AutoFilter_Column + */ + public function getColumns() + { + return $this->columns; + } + + /** + * Validate that the specified column is in the AutoFilter range + * + * @param string $column Column name (e.g. A) + * @throws PHPExcel_Exception + * @return integer The column offset within the autofilter range + */ + public function testColumnInRange($column) + { + if (empty($this->range)) { + throw new PHPExcel_Exception("No autofilter range is defined."); + } + + $columnIndex = PHPExcel_Cell::columnIndexFromString($column); + list($rangeStart, $rangeEnd) = PHPExcel_Cell::rangeBoundaries($this->range); + if (($rangeStart[0] > $columnIndex) || ($rangeEnd[0] < $columnIndex)) { + throw new PHPExcel_Exception("Column is outside of current autofilter range."); + } + + return $columnIndex - $rangeStart[0]; + } + + /** + * Get a specified AutoFilter Column Offset within the defined AutoFilter range + * + * @param string $pColumn Column name (e.g. A) + * @throws PHPExcel_Exception + * @return integer The offset of the specified column within the autofilter range + */ + public function getColumnOffset($pColumn) + { + return $this->testColumnInRange($pColumn); + } + + /** + * Get a specified AutoFilter Column + * + * @param string $pColumn Column name (e.g. A) + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function getColumn($pColumn) + { + $this->testColumnInRange($pColumn); + + if (!isset($this->columns[$pColumn])) { + $this->columns[$pColumn] = new PHPExcel_Worksheet_AutoFilter_Column($pColumn, $this); + } + + return $this->columns[$pColumn]; + } + + /** + * Get a specified AutoFilter Column by it's offset + * + * @param integer $pColumnOffset Column offset within range (starting from 0) + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function getColumnByOffset($pColumnOffset = 0) + { + list($rangeStart, $rangeEnd) = PHPExcel_Cell::rangeBoundaries($this->range); + $pColumn = PHPExcel_Cell::stringFromColumnIndex($rangeStart[0] + $pColumnOffset - 1); + + return $this->getColumn($pColumn); + } + + /** + * Set AutoFilter + * + * @param PHPExcel_Worksheet_AutoFilter_Column|string $pColumn + * A simple string containing a Column ID like 'A' is permitted + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_AutoFilter + */ + public function setColumn($pColumn) + { + if ((is_string($pColumn)) && (!empty($pColumn))) { + $column = $pColumn; + } elseif (is_object($pColumn) && ($pColumn instanceof PHPExcel_Worksheet_AutoFilter_Column)) { + $column = $pColumn->getColumnIndex(); + } else { + throw new PHPExcel_Exception("Column is not within the autofilter range."); + } + $this->testColumnInRange($column); + + if (is_string($pColumn)) { + $this->columns[$pColumn] = new PHPExcel_Worksheet_AutoFilter_Column($pColumn, $this); + } elseif (is_object($pColumn) && ($pColumn instanceof PHPExcel_Worksheet_AutoFilter_Column)) { + $pColumn->setParent($this); + $this->columns[$column] = $pColumn; + } + ksort($this->columns); + + return $this; + } + + /** + * Clear a specified AutoFilter Column + * + * @param string $pColumn Column name (e.g. A) + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_AutoFilter + */ + public function clearColumn($pColumn) + { + $this->testColumnInRange($pColumn); + + if (isset($this->columns[$pColumn])) { + unset($this->columns[$pColumn]); + } + + return $this; + } + + /** + * Shift an AutoFilter Column Rule to a different column + * + * Note: This method bypasses validation of the destination column to ensure it is within this AutoFilter range. + * Nor does it verify whether any column rule already exists at $toColumn, but will simply overrideany existing value. + * Use with caution. + * + * @param string $fromColumn Column name (e.g. A) + * @param string $toColumn Column name (e.g. B) + * @return PHPExcel_Worksheet_AutoFilter + */ + public function shiftColumn($fromColumn = null, $toColumn = null) + { + $fromColumn = strtoupper($fromColumn); + $toColumn = strtoupper($toColumn); + + if (($fromColumn !== null) && (isset($this->columns[$fromColumn])) && ($toColumn !== null)) { + $this->columns[$fromColumn]->setParent(); + $this->columns[$fromColumn]->setColumnIndex($toColumn); + $this->columns[$toColumn] = $this->columns[$fromColumn]; + $this->columns[$toColumn]->setParent($this); + unset($this->columns[$fromColumn]); + + ksort($this->columns); + } + + return $this; + } + + + /** + * Test if cell value is in the defined set of values + * + * @param mixed $cellValue + * @param mixed[] $dataSet + * @return boolean + */ + private static function filterTestInSimpleDataSet($cellValue, $dataSet) + { + $dataSetValues = $dataSet['filterValues']; + $blanks = $dataSet['blanks']; + if (($cellValue == '') || ($cellValue === null)) { + return $blanks; + } + return in_array($cellValue, $dataSetValues); + } + + /** + * Test if cell value is in the defined set of Excel date values + * + * @param mixed $cellValue + * @param mixed[] $dataSet + * @return boolean + */ + private static function filterTestInDateGroupSet($cellValue, $dataSet) + { + $dateSet = $dataSet['filterValues']; + $blanks = $dataSet['blanks']; + if (($cellValue == '') || ($cellValue === null)) { + return $blanks; + } + + if (is_numeric($cellValue)) { + $dateValue = PHPExcel_Shared_Date::ExcelToPHP($cellValue); + if ($cellValue < 1) { + // Just the time part + $dtVal = date('His', $dateValue); + $dateSet = $dateSet['time']; + } elseif ($cellValue == floor($cellValue)) { + // Just the date part + $dtVal = date('Ymd', $dateValue); + $dateSet = $dateSet['date']; + } else { + // date and time parts + $dtVal = date('YmdHis', $dateValue); + $dateSet = $dateSet['dateTime']; + } + foreach ($dateSet as $dateValue) { + // Use of substr to extract value at the appropriate group level + if (substr($dtVal, 0, strlen($dateValue)) == $dateValue) { + return true; + } + } + } + return false; + } + + /** + * Test if cell value is within a set of values defined by a ruleset + * + * @param mixed $cellValue + * @param mixed[] $ruleSet + * @return boolean + */ + private static function filterTestInCustomDataSet($cellValue, $ruleSet) + { + $dataSet = $ruleSet['filterRules']; + $join = $ruleSet['join']; + $customRuleForBlanks = isset($ruleSet['customRuleForBlanks']) ? $ruleSet['customRuleForBlanks'] : false; + + if (!$customRuleForBlanks) { + // Blank cells are always ignored, so return a FALSE + if (($cellValue == '') || ($cellValue === null)) { + return false; + } + } + $returnVal = ($join == PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_AND); + foreach ($dataSet as $rule) { + if (is_numeric($rule['value'])) { + // Numeric values are tested using the appropriate operator + switch ($rule['operator']) { + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL: + $retVal = ($cellValue == $rule['value']); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_NOTEQUAL: + $retVal = ($cellValue != $rule['value']); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_GREATERTHAN: + $retVal = ($cellValue > $rule['value']); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL: + $retVal = ($cellValue >= $rule['value']); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_LESSTHAN: + $retVal = ($cellValue < $rule['value']); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL: + $retVal = ($cellValue <= $rule['value']); + break; + } + } elseif ($rule['value'] == '') { + switch ($rule['operator']) { + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL: + $retVal = (($cellValue == '') || ($cellValue === null)); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_NOTEQUAL: + $retVal = (($cellValue != '') && ($cellValue !== null)); + break; + default: + $retVal = true; + break; + } + } else { + // String values are always tested for equality, factoring in for wildcards (hence a regexp test) + $retVal = preg_match('/^'.$rule['value'].'$/i', $cellValue); + } + // If there are multiple conditions, then we need to test both using the appropriate join operator + switch ($join) { + case PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_OR: + $returnVal = $returnVal || $retVal; + // Break as soon as we have a TRUE match for OR joins, + // to avoid unnecessary additional code execution + if ($returnVal) { + return $returnVal; + } + break; + case PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_AND: + $returnVal = $returnVal && $retVal; + break; + } + } + + return $returnVal; + } + + /** + * Test if cell date value is matches a set of values defined by a set of months + * + * @param mixed $cellValue + * @param mixed[] $monthSet + * @return boolean + */ + private static function filterTestInPeriodDateSet($cellValue, $monthSet) + { + // Blank cells are always ignored, so return a FALSE + if (($cellValue == '') || ($cellValue === null)) { + return false; + } + + if (is_numeric($cellValue)) { + $dateValue = date('m', PHPExcel_Shared_Date::ExcelToPHP($cellValue)); + if (in_array($dateValue, $monthSet)) { + return true; + } + } + + return false; + } + + /** + * Search/Replace arrays to convert Excel wildcard syntax to a regexp syntax for preg_matching + * + * @var array + */ + private static $fromReplace = array('\*', '\?', '~~', '~.*', '~.?'); + private static $toReplace = array('.*', '.', '~', '\*', '\?'); + + + /** + * Convert a dynamic rule daterange to a custom filter range expression for ease of calculation + * + * @param string $dynamicRuleType + * @param PHPExcel_Worksheet_AutoFilter_Column &$filterColumn + * @return mixed[] + */ + private function dynamicFilterDateRange($dynamicRuleType, &$filterColumn) + { + $rDateType = PHPExcel_Calculation_Functions::getReturnDateType(); + PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC); + $val = $maxVal = null; + + $ruleValues = array(); + $baseDate = PHPExcel_Calculation_DateTime::DATENOW(); + // Calculate start/end dates for the required date range based on current date + switch ($dynamicRuleType) { + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTWEEK: + $baseDate = strtotime('-7 days', $baseDate); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTWEEK: + $baseDate = strtotime('-7 days', $baseDate); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTMONTH: + $baseDate = strtotime('-1 month', gmmktime(0, 0, 0, 1, date('m', $baseDate), date('Y', $baseDate))); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTMONTH: + $baseDate = strtotime('+1 month', gmmktime(0, 0, 0, 1, date('m', $baseDate), date('Y', $baseDate))); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTQUARTER: + $baseDate = strtotime('-3 month', gmmktime(0, 0, 0, 1, date('m', $baseDate), date('Y', $baseDate))); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTQUARTER: + $baseDate = strtotime('+3 month', gmmktime(0, 0, 0, 1, date('m', $baseDate), date('Y', $baseDate))); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTYEAR: + $baseDate = strtotime('-1 year', gmmktime(0, 0, 0, 1, date('m', $baseDate), date('Y', $baseDate))); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTYEAR: + $baseDate = strtotime('+1 year', gmmktime(0, 0, 0, 1, date('m', $baseDate), date('Y', $baseDate))); + break; + } + + switch ($dynamicRuleType) { + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_TODAY: + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_YESTERDAY: + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_TOMORROW: + $maxVal = (int) PHPExcel_Shared_Date::PHPtoExcel(strtotime('+1 day', $baseDate)); + $val = (int) PHPExcel_Shared_Date::PHPToExcel($baseDate); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_YEARTODATE: + $maxVal = (int) PHPExcel_Shared_Date::PHPtoExcel(strtotime('+1 day', $baseDate)); + $val = (int) PHPExcel_Shared_Date::PHPToExcel(gmmktime(0, 0, 0, 1, 1, date('Y', $baseDate))); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_THISYEAR: + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTYEAR: + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTYEAR: + $maxVal = (int) PHPExcel_Shared_Date::PHPToExcel(gmmktime(0, 0, 0, 31, 12, date('Y', $baseDate))); + ++$maxVal; + $val = (int) PHPExcel_Shared_Date::PHPToExcel(gmmktime(0, 0, 0, 1, 1, date('Y', $baseDate))); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_THISQUARTER: + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTQUARTER: + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTQUARTER: + $thisMonth = date('m', $baseDate); + $thisQuarter = floor(--$thisMonth / 3); + $maxVal = (int) PHPExcel_Shared_Date::PHPtoExcel(gmmktime(0, 0, 0, date('t', $baseDate), (1+$thisQuarter)*3, date('Y', $baseDate))); + ++$maxVal; + $val = (int) PHPExcel_Shared_Date::PHPToExcel(gmmktime(0, 0, 0, 1, 1+$thisQuarter*3, date('Y', $baseDate))); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_THISMONTH: + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTMONTH: + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTMONTH: + $maxVal = (int) PHPExcel_Shared_Date::PHPtoExcel(gmmktime(0, 0, 0, date('t', $baseDate), date('m', $baseDate), date('Y', $baseDate))); + ++$maxVal; + $val = (int) PHPExcel_Shared_Date::PHPToExcel(gmmktime(0, 0, 0, 1, date('m', $baseDate), date('Y', $baseDate))); + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_THISWEEK: + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_LASTWEEK: + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_NEXTWEEK: + $dayOfWeek = date('w', $baseDate); + $val = (int) PHPExcel_Shared_Date::PHPToExcel($baseDate) - $dayOfWeek; + $maxVal = $val + 7; + break; + } + + switch ($dynamicRuleType) { + // Adjust Today dates for Yesterday and Tomorrow + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_YESTERDAY: + --$maxVal; + --$val; + break; + case PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_TOMORROW: + ++$maxVal; + ++$val; + break; + } + + // Set the filter column rule attributes ready for writing + $filterColumn->setAttributes(array('val' => $val, 'maxVal' => $maxVal)); + + // Set the rules for identifying rows for hide/show + $ruleValues[] = array('operator' => PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL, 'value' => $val); + $ruleValues[] = array('operator' => PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_LESSTHAN, 'value' => $maxVal); + PHPExcel_Calculation_Functions::setReturnDateType($rDateType); + + return array('method' => 'filterTestInCustomDataSet', 'arguments' => array('filterRules' => $ruleValues, 'join' => PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_AND)); + } + + private function calculateTopTenValue($columnID, $startRow, $endRow, $ruleType, $ruleValue) + { + $range = $columnID.$startRow.':'.$columnID.$endRow; + $dataValues = PHPExcel_Calculation_Functions::flattenArray($this->workSheet->rangeToArray($range, null, true, false)); + + $dataValues = array_filter($dataValues); + if ($ruleType == PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP) { + rsort($dataValues); + } else { + sort($dataValues); + } + + return array_pop(array_slice($dataValues, 0, $ruleValue)); + } + + /** + * Apply the AutoFilter rules to the AutoFilter Range + * + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_AutoFilter + */ + public function showHideRows() + { + list($rangeStart, $rangeEnd) = PHPExcel_Cell::rangeBoundaries($this->range); + + // The heading row should always be visible +// echo 'AutoFilter Heading Row ', $rangeStart[1],' is always SHOWN',PHP_EOL; + $this->workSheet->getRowDimension($rangeStart[1])->setVisible(true); + + $columnFilterTests = array(); + foreach ($this->columns as $columnID => $filterColumn) { + $rules = $filterColumn->getRules(); + switch ($filterColumn->getFilterType()) { + case PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_FILTER: + $ruleValues = array(); + // Build a list of the filter value selections + foreach ($rules as $rule) { + $ruleType = $rule->getRuleType(); + $ruleValues[] = $rule->getValue(); + } + // Test if we want to include blanks in our filter criteria + $blanks = false; + $ruleDataSet = array_filter($ruleValues); + if (count($ruleValues) != count($ruleDataSet)) { + $blanks = true; + } + if ($ruleType == PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_FILTER) { + // Filter on absolute values + $columnFilterTests[$columnID] = array( + 'method' => 'filterTestInSimpleDataSet', + 'arguments' => array('filterValues' => $ruleDataSet, 'blanks' => $blanks) + ); + } else { + // Filter on date group values + $arguments = array( + 'date' => array(), + 'time' => array(), + 'dateTime' => array(), + ); + foreach ($ruleDataSet as $ruleValue) { + $date = $time = ''; + if ((isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_YEAR])) && + ($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_YEAR] !== '')) { + $date .= sprintf('%04d', $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_YEAR]); + } + if ((isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MONTH])) && + ($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MONTH] != '')) { + $date .= sprintf('%02d', $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MONTH]); + } + if ((isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_DAY])) && + ($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_DAY] !== '')) { + $date .= sprintf('%02d', $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_DAY]); + } + if ((isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_HOUR])) && + ($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_HOUR] !== '')) { + $time .= sprintf('%02d', $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_HOUR]); + } + if ((isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MINUTE])) && + ($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MINUTE] !== '')) { + $time .= sprintf('%02d', $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MINUTE]); + } + if ((isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_SECOND])) && + ($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_SECOND] !== '')) { + $time .= sprintf('%02d', $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_SECOND]); + } + $dateTime = $date . $time; + $arguments['date'][] = $date; + $arguments['time'][] = $time; + $arguments['dateTime'][] = $dateTime; + } + // Remove empty elements + $arguments['date'] = array_filter($arguments['date']); + $arguments['time'] = array_filter($arguments['time']); + $arguments['dateTime'] = array_filter($arguments['dateTime']); + $columnFilterTests[$columnID] = array( + 'method' => 'filterTestInDateGroupSet', + 'arguments' => array('filterValues' => $arguments, 'blanks' => $blanks) + ); + } + break; + case PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_CUSTOMFILTER: + $customRuleForBlanks = false; + $ruleValues = array(); + // Build a list of the filter value selections + foreach ($rules as $rule) { + $ruleType = $rule->getRuleType(); + $ruleValue = $rule->getValue(); + if (!is_numeric($ruleValue)) { + // Convert to a regexp allowing for regexp reserved characters, wildcards and escaped wildcards + $ruleValue = preg_quote($ruleValue); + $ruleValue = str_replace(self::$fromReplace, self::$toReplace, $ruleValue); + if (trim($ruleValue) == '') { + $customRuleForBlanks = true; + $ruleValue = trim($ruleValue); + } + } + $ruleValues[] = array('operator' => $rule->getOperator(), 'value' => $ruleValue); + } + $join = $filterColumn->getJoin(); + $columnFilterTests[$columnID] = array( + 'method' => 'filterTestInCustomDataSet', + 'arguments' => array('filterRules' => $ruleValues, 'join' => $join, 'customRuleForBlanks' => $customRuleForBlanks) + ); + break; + case PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_DYNAMICFILTER: + $ruleValues = array(); + foreach ($rules as $rule) { + // We should only ever have one Dynamic Filter Rule anyway + $dynamicRuleType = $rule->getGrouping(); + if (($dynamicRuleType == PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_ABOVEAVERAGE) || + ($dynamicRuleType == PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_BELOWAVERAGE)) { + // Number (Average) based + // Calculate the average + $averageFormula = '=AVERAGE('.$columnID.($rangeStart[1]+1).':'.$columnID.$rangeEnd[1].')'; + $average = PHPExcel_Calculation::getInstance()->calculateFormula($averageFormula, null, $this->workSheet->getCell('A1')); + // Set above/below rule based on greaterThan or LessTan + $operator = ($dynamicRuleType === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_ABOVEAVERAGE) + ? PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_GREATERTHAN + : PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_LESSTHAN; + $ruleValues[] = array('operator' => $operator, + 'value' => $average + ); + $columnFilterTests[$columnID] = array( + 'method' => 'filterTestInCustomDataSet', + 'arguments' => array('filterRules' => $ruleValues, 'join' => PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_OR) + ); + } else { + // Date based + if ($dynamicRuleType{0} == 'M' || $dynamicRuleType{0} == 'Q') { + // Month or Quarter + sscanf($dynamicRuleType, '%[A-Z]%d', $periodType, $period); + if ($periodType == 'M') { + $ruleValues = array($period); + } else { + --$period; + $periodEnd = (1+$period)*3; + $periodStart = 1+$period*3; + $ruleValues = range($periodStart, $periodEnd); + } + $columnFilterTests[$columnID] = array( + 'method' => 'filterTestInPeriodDateSet', + 'arguments' => $ruleValues + ); + $filterColumn->setAttributes(array()); + } else { + // Date Range + $columnFilterTests[$columnID] = $this->dynamicFilterDateRange($dynamicRuleType, $filterColumn); + break; + } + } + } + break; + case PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_TOPTENFILTER: + $ruleValues = array(); + $dataRowCount = $rangeEnd[1] - $rangeStart[1]; + foreach ($rules as $rule) { + // We should only ever have one Dynamic Filter Rule anyway + $toptenRuleType = $rule->getGrouping(); + $ruleValue = $rule->getValue(); + $ruleOperator = $rule->getOperator(); + } + if ($ruleOperator === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT) { + $ruleValue = floor($ruleValue * ($dataRowCount / 100)); + } + if ($ruleValue < 1) { + $ruleValue = 1; + } + if ($ruleValue > 500) { + $ruleValue = 500; + } + + $maxVal = $this->calculateTopTenValue($columnID, $rangeStart[1]+1, $rangeEnd[1], $toptenRuleType, $ruleValue); + + $operator = ($toptenRuleType == PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP) + ? PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL + : PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL; + $ruleValues[] = array('operator' => $operator, 'value' => $maxVal); + $columnFilterTests[$columnID] = array( + 'method' => 'filterTestInCustomDataSet', + 'arguments' => array('filterRules' => $ruleValues, 'join' => PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_OR) + ); + $filterColumn->setAttributes(array('maxVal' => $maxVal)); + break; + } + } + +// echo 'Column Filter Test CRITERIA',PHP_EOL; +// var_dump($columnFilterTests); +// + // Execute the column tests for each row in the autoFilter range to determine show/hide, + for ($row = $rangeStart[1]+1; $row <= $rangeEnd[1]; ++$row) { +// echo 'Testing Row = ', $row,PHP_EOL; + $result = true; + foreach ($columnFilterTests as $columnID => $columnFilterTest) { +// echo 'Testing cell ', $columnID.$row,PHP_EOL; + $cellValue = $this->workSheet->getCell($columnID.$row)->getCalculatedValue(); +// echo 'Value is ', $cellValue,PHP_EOL; + // Execute the filter test + $result = $result && + call_user_func_array( + array('PHPExcel_Worksheet_AutoFilter', $columnFilterTest['method']), + array($cellValue, $columnFilterTest['arguments']) + ); +// echo (($result) ? 'VALID' : 'INVALID'),PHP_EOL; + // If filter test has resulted in FALSE, exit the loop straightaway rather than running any more tests + if (!$result) { + break; + } + } + // Set show/hide for the row based on the result of the autoFilter result +// echo (($result) ? 'SHOW' : 'HIDE'),PHP_EOL; + $this->workSheet->getRowDimension($row)->setVisible($result); + } + + return $this; + } + + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + if ($key == 'workSheet') { + // Detach from worksheet + $this->{$key} = null; + } else { + $this->{$key} = clone $value; + } + } elseif ((is_array($value)) && ($key == 'columns')) { + // The columns array of PHPExcel_Worksheet_AutoFilter objects + $this->{$key} = array(); + foreach ($value as $k => $v) { + $this->{$key}[$k] = clone $v; + // attach the new cloned Column to this new cloned Autofilter object + $this->{$key}[$k]->setParent($this); + } + } else { + $this->{$key} = $value; + } + } + } + + /** + * toString method replicates previous behavior by returning the range if object is + * referenced as a property of its parent. + */ + public function __toString() + { + return (string) $this->range; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/AutoFilter/Column.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/AutoFilter/Column.php new file mode 100644 index 0000000..d64fd81 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/AutoFilter/Column.php @@ -0,0 +1,405 @@ +<?php + +/** + * PHPExcel_Worksheet_AutoFilter_Column + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Worksheet_AutoFilter_Column +{ + const AUTOFILTER_FILTERTYPE_FILTER = 'filters'; + const AUTOFILTER_FILTERTYPE_CUSTOMFILTER = 'customFilters'; + // Supports no more than 2 rules, with an And/Or join criteria + // if more than 1 rule is defined + const AUTOFILTER_FILTERTYPE_DYNAMICFILTER = 'dynamicFilter'; + // Even though the filter rule is constant, the filtered data can vary + // e.g. filtered by date = TODAY + const AUTOFILTER_FILTERTYPE_TOPTENFILTER = 'top10'; + + /** + * Types of autofilter rules + * + * @var string[] + */ + private static $filterTypes = array( + // Currently we're not handling + // colorFilter + // extLst + // iconFilter + self::AUTOFILTER_FILTERTYPE_FILTER, + self::AUTOFILTER_FILTERTYPE_CUSTOMFILTER, + self::AUTOFILTER_FILTERTYPE_DYNAMICFILTER, + self::AUTOFILTER_FILTERTYPE_TOPTENFILTER, + ); + + /* Multiple Rule Connections */ + const AUTOFILTER_COLUMN_JOIN_AND = 'and'; + const AUTOFILTER_COLUMN_JOIN_OR = 'or'; + + /** + * Join options for autofilter rules + * + * @var string[] + */ + private static $ruleJoins = array( + self::AUTOFILTER_COLUMN_JOIN_AND, + self::AUTOFILTER_COLUMN_JOIN_OR, + ); + + /** + * Autofilter + * + * @var PHPExcel_Worksheet_AutoFilter + */ + private $parent; + + + /** + * Autofilter Column Index + * + * @var string + */ + private $columnIndex = ''; + + + /** + * Autofilter Column Filter Type + * + * @var string + */ + private $filterType = self::AUTOFILTER_FILTERTYPE_FILTER; + + + /** + * Autofilter Multiple Rules And/Or + * + * @var string + */ + private $join = self::AUTOFILTER_COLUMN_JOIN_OR; + + + /** + * Autofilter Column Rules + * + * @var array of PHPExcel_Worksheet_AutoFilter_Column_Rule + */ + private $ruleset = array(); + + + /** + * Autofilter Column Dynamic Attributes + * + * @var array of mixed + */ + private $attributes = array(); + + + /** + * Create a new PHPExcel_Worksheet_AutoFilter_Column + * + * @param string $pColumn Column (e.g. A) + * @param PHPExcel_Worksheet_AutoFilter $pParent Autofilter for this column + */ + public function __construct($pColumn, PHPExcel_Worksheet_AutoFilter $pParent = null) + { + $this->columnIndex = $pColumn; + $this->parent = $pParent; + } + + /** + * Get AutoFilter Column Index + * + * @return string + */ + public function getColumnIndex() + { + return $this->columnIndex; + } + + /** + * Set AutoFilter Column Index + * + * @param string $pColumn Column (e.g. A) + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function setColumnIndex($pColumn) + { + // Uppercase coordinate + $pColumn = strtoupper($pColumn); + if ($this->parent !== null) { + $this->parent->testColumnInRange($pColumn); + } + + $this->columnIndex = $pColumn; + + return $this; + } + + /** + * Get this Column's AutoFilter Parent + * + * @return PHPExcel_Worksheet_AutoFilter + */ + public function getParent() + { + return $this->parent; + } + + /** + * Set this Column's AutoFilter Parent + * + * @param PHPExcel_Worksheet_AutoFilter + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function setParent(PHPExcel_Worksheet_AutoFilter $pParent = null) + { + $this->parent = $pParent; + + return $this; + } + + /** + * Get AutoFilter Type + * + * @return string + */ + public function getFilterType() + { + return $this->filterType; + } + + /** + * Set AutoFilter Type + * + * @param string $pFilterType + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function setFilterType($pFilterType = self::AUTOFILTER_FILTERTYPE_FILTER) + { + if (!in_array($pFilterType, self::$filterTypes)) { + throw new PHPExcel_Exception('Invalid filter type for column AutoFilter.'); + } + + $this->filterType = $pFilterType; + + return $this; + } + + /** + * Get AutoFilter Multiple Rules And/Or Join + * + * @return string + */ + public function getJoin() + { + return $this->join; + } + + /** + * Set AutoFilter Multiple Rules And/Or + * + * @param string $pJoin And/Or + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function setJoin($pJoin = self::AUTOFILTER_COLUMN_JOIN_OR) + { + // Lowercase And/Or + $pJoin = strtolower($pJoin); + if (!in_array($pJoin, self::$ruleJoins)) { + throw new PHPExcel_Exception('Invalid rule connection for column AutoFilter.'); + } + + $this->join = $pJoin; + + return $this; + } + + /** + * Set AutoFilter Attributes + * + * @param string[] $pAttributes + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function setAttributes($pAttributes = array()) + { + $this->attributes = $pAttributes; + + return $this; + } + + /** + * Set An AutoFilter Attribute + * + * @param string $pName Attribute Name + * @param string $pValue Attribute Value + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function setAttribute($pName, $pValue) + { + $this->attributes[$pName] = $pValue; + + return $this; + } + + /** + * Get AutoFilter Column Attributes + * + * @return string + */ + public function getAttributes() + { + return $this->attributes; + } + + /** + * Get specific AutoFilter Column Attribute + * + * @param string $pName Attribute Name + * @return string + */ + public function getAttribute($pName) + { + if (isset($this->attributes[$pName])) { + return $this->attributes[$pName]; + } + return null; + } + + /** + * Get all AutoFilter Column Rules + * + * @throws PHPExcel_Exception + * @return array of PHPExcel_Worksheet_AutoFilter_Column_Rule + */ + public function getRules() + { + return $this->ruleset; + } + + /** + * Get a specified AutoFilter Column Rule + * + * @param integer $pIndex Rule index in the ruleset array + * @return PHPExcel_Worksheet_AutoFilter_Column_Rule + */ + public function getRule($pIndex) + { + if (!isset($this->ruleset[$pIndex])) { + $this->ruleset[$pIndex] = new PHPExcel_Worksheet_AutoFilter_Column_Rule($this); + } + return $this->ruleset[$pIndex]; + } + + /** + * Create a new AutoFilter Column Rule in the ruleset + * + * @return PHPExcel_Worksheet_AutoFilter_Column_Rule + */ + public function createRule() + { + $this->ruleset[] = new PHPExcel_Worksheet_AutoFilter_Column_Rule($this); + + return end($this->ruleset); + } + + /** + * Add a new AutoFilter Column Rule to the ruleset + * + * @param PHPExcel_Worksheet_AutoFilter_Column_Rule $pRule + * @param boolean $returnRule Flag indicating whether the rule object or the column object should be returned + * @return PHPExcel_Worksheet_AutoFilter_Column|PHPExcel_Worksheet_AutoFilter_Column_Rule + */ + public function addRule(PHPExcel_Worksheet_AutoFilter_Column_Rule $pRule, $returnRule = true) + { + $pRule->setParent($this); + $this->ruleset[] = $pRule; + + return ($returnRule) ? $pRule : $this; + } + + /** + * Delete a specified AutoFilter Column Rule + * If the number of rules is reduced to 1, then we reset And/Or logic to Or + * + * @param integer $pIndex Rule index in the ruleset array + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function deleteRule($pIndex) + { + if (isset($this->ruleset[$pIndex])) { + unset($this->ruleset[$pIndex]); + // If we've just deleted down to a single rule, then reset And/Or joining to Or + if (count($this->ruleset) <= 1) { + $this->setJoin(self::AUTOFILTER_COLUMN_JOIN_OR); + } + } + + return $this; + } + + /** + * Delete all AutoFilter Column Rules + * + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function clearRules() + { + $this->ruleset = array(); + $this->setJoin(self::AUTOFILTER_COLUMN_JOIN_OR); + + return $this; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + if ($key == 'parent') { + // Detach from autofilter parent + $this->$key = null; + } else { + $this->$key = clone $value; + } + } elseif ((is_array($value)) && ($key == 'ruleset')) { + // The columns array of PHPExcel_Worksheet_AutoFilter objects + $this->$key = array(); + foreach ($value as $k => $v) { + $this->$key[$k] = clone $v; + // attach the new cloned Rule to this new cloned Autofilter Cloned object + $this->$key[$k]->setParent($this); + } + } else { + $this->$key = $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/AutoFilter/Column/Rule.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/AutoFilter/Column/Rule.php new file mode 100644 index 0000000..39ad18b --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/AutoFilter/Column/Rule.php @@ -0,0 +1,468 @@ +<?php + +/** + * PHPExcel_Worksheet_AutoFilter_Column_Rule + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Worksheet_AutoFilter_Column_Rule +{ + const AUTOFILTER_RULETYPE_FILTER = 'filter'; + const AUTOFILTER_RULETYPE_DATEGROUP = 'dateGroupItem'; + const AUTOFILTER_RULETYPE_CUSTOMFILTER = 'customFilter'; + const AUTOFILTER_RULETYPE_DYNAMICFILTER = 'dynamicFilter'; + const AUTOFILTER_RULETYPE_TOPTENFILTER = 'top10Filter'; + + private static $ruleTypes = array( + // Currently we're not handling + // colorFilter + // extLst + // iconFilter + self::AUTOFILTER_RULETYPE_FILTER, + self::AUTOFILTER_RULETYPE_DATEGROUP, + self::AUTOFILTER_RULETYPE_CUSTOMFILTER, + self::AUTOFILTER_RULETYPE_DYNAMICFILTER, + self::AUTOFILTER_RULETYPE_TOPTENFILTER, + ); + + const AUTOFILTER_RULETYPE_DATEGROUP_YEAR = 'year'; + const AUTOFILTER_RULETYPE_DATEGROUP_MONTH = 'month'; + const AUTOFILTER_RULETYPE_DATEGROUP_DAY = 'day'; + const AUTOFILTER_RULETYPE_DATEGROUP_HOUR = 'hour'; + const AUTOFILTER_RULETYPE_DATEGROUP_MINUTE = 'minute'; + const AUTOFILTER_RULETYPE_DATEGROUP_SECOND = 'second'; + + private static $dateTimeGroups = array( + self::AUTOFILTER_RULETYPE_DATEGROUP_YEAR, + self::AUTOFILTER_RULETYPE_DATEGROUP_MONTH, + self::AUTOFILTER_RULETYPE_DATEGROUP_DAY, + self::AUTOFILTER_RULETYPE_DATEGROUP_HOUR, + self::AUTOFILTER_RULETYPE_DATEGROUP_MINUTE, + self::AUTOFILTER_RULETYPE_DATEGROUP_SECOND, + ); + + const AUTOFILTER_RULETYPE_DYNAMIC_YESTERDAY = 'yesterday'; + const AUTOFILTER_RULETYPE_DYNAMIC_TODAY = 'today'; + const AUTOFILTER_RULETYPE_DYNAMIC_TOMORROW = 'tomorrow'; + const AUTOFILTER_RULETYPE_DYNAMIC_YEARTODATE = 'yearToDate'; + const AUTOFILTER_RULETYPE_DYNAMIC_THISYEAR = 'thisYear'; + const AUTOFILTER_RULETYPE_DYNAMIC_THISQUARTER = 'thisQuarter'; + const AUTOFILTER_RULETYPE_DYNAMIC_THISMONTH = 'thisMonth'; + const AUTOFILTER_RULETYPE_DYNAMIC_THISWEEK = 'thisWeek'; + const AUTOFILTER_RULETYPE_DYNAMIC_LASTYEAR = 'lastYear'; + const AUTOFILTER_RULETYPE_DYNAMIC_LASTQUARTER = 'lastQuarter'; + const AUTOFILTER_RULETYPE_DYNAMIC_LASTMONTH = 'lastMonth'; + const AUTOFILTER_RULETYPE_DYNAMIC_LASTWEEK = 'lastWeek'; + const AUTOFILTER_RULETYPE_DYNAMIC_NEXTYEAR = 'nextYear'; + const AUTOFILTER_RULETYPE_DYNAMIC_NEXTQUARTER = 'nextQuarter'; + const AUTOFILTER_RULETYPE_DYNAMIC_NEXTMONTH = 'nextMonth'; + const AUTOFILTER_RULETYPE_DYNAMIC_NEXTWEEK = 'nextWeek'; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_1 = 'M1'; + const AUTOFILTER_RULETYPE_DYNAMIC_JANUARY = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_1; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_2 = 'M2'; + const AUTOFILTER_RULETYPE_DYNAMIC_FEBRUARY = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_2; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_3 = 'M3'; + const AUTOFILTER_RULETYPE_DYNAMIC_MARCH = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_3; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_4 = 'M4'; + const AUTOFILTER_RULETYPE_DYNAMIC_APRIL = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_4; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_5 = 'M5'; + const AUTOFILTER_RULETYPE_DYNAMIC_MAY = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_5; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_6 = 'M6'; + const AUTOFILTER_RULETYPE_DYNAMIC_JUNE = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_6; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_7 = 'M7'; + const AUTOFILTER_RULETYPE_DYNAMIC_JULY = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_7; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_8 = 'M8'; + const AUTOFILTER_RULETYPE_DYNAMIC_AUGUST = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_8; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_9 = 'M9'; + const AUTOFILTER_RULETYPE_DYNAMIC_SEPTEMBER = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_9; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_10 = 'M10'; + const AUTOFILTER_RULETYPE_DYNAMIC_OCTOBER = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_10; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_11 = 'M11'; + const AUTOFILTER_RULETYPE_DYNAMIC_NOVEMBER = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_11; + const AUTOFILTER_RULETYPE_DYNAMIC_MONTH_12 = 'M12'; + const AUTOFILTER_RULETYPE_DYNAMIC_DECEMBER = self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_12; + const AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_1 = 'Q1'; + const AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_2 = 'Q2'; + const AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_3 = 'Q3'; + const AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_4 = 'Q4'; + const AUTOFILTER_RULETYPE_DYNAMIC_ABOVEAVERAGE = 'aboveAverage'; + const AUTOFILTER_RULETYPE_DYNAMIC_BELOWAVERAGE = 'belowAverage'; + + private static $dynamicTypes = array( + self::AUTOFILTER_RULETYPE_DYNAMIC_YESTERDAY, + self::AUTOFILTER_RULETYPE_DYNAMIC_TODAY, + self::AUTOFILTER_RULETYPE_DYNAMIC_TOMORROW, + self::AUTOFILTER_RULETYPE_DYNAMIC_YEARTODATE, + self::AUTOFILTER_RULETYPE_DYNAMIC_THISYEAR, + self::AUTOFILTER_RULETYPE_DYNAMIC_THISQUARTER, + self::AUTOFILTER_RULETYPE_DYNAMIC_THISMONTH, + self::AUTOFILTER_RULETYPE_DYNAMIC_THISWEEK, + self::AUTOFILTER_RULETYPE_DYNAMIC_LASTYEAR, + self::AUTOFILTER_RULETYPE_DYNAMIC_LASTQUARTER, + self::AUTOFILTER_RULETYPE_DYNAMIC_LASTMONTH, + self::AUTOFILTER_RULETYPE_DYNAMIC_LASTWEEK, + self::AUTOFILTER_RULETYPE_DYNAMIC_NEXTYEAR, + self::AUTOFILTER_RULETYPE_DYNAMIC_NEXTQUARTER, + self::AUTOFILTER_RULETYPE_DYNAMIC_NEXTMONTH, + self::AUTOFILTER_RULETYPE_DYNAMIC_NEXTWEEK, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_1, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_2, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_3, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_4, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_5, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_6, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_7, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_8, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_9, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_10, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_11, + self::AUTOFILTER_RULETYPE_DYNAMIC_MONTH_12, + self::AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_1, + self::AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_2, + self::AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_3, + self::AUTOFILTER_RULETYPE_DYNAMIC_QUARTER_4, + self::AUTOFILTER_RULETYPE_DYNAMIC_ABOVEAVERAGE, + self::AUTOFILTER_RULETYPE_DYNAMIC_BELOWAVERAGE, + ); + + /* + * The only valid filter rule operators for filter and customFilter types are: + * <xsd:enumeration value="equal"/> + * <xsd:enumeration value="lessThan"/> + * <xsd:enumeration value="lessThanOrEqual"/> + * <xsd:enumeration value="notEqual"/> + * <xsd:enumeration value="greaterThanOrEqual"/> + * <xsd:enumeration value="greaterThan"/> + */ + const AUTOFILTER_COLUMN_RULE_EQUAL = 'equal'; + const AUTOFILTER_COLUMN_RULE_NOTEQUAL = 'notEqual'; + const AUTOFILTER_COLUMN_RULE_GREATERTHAN = 'greaterThan'; + const AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL = 'greaterThanOrEqual'; + const AUTOFILTER_COLUMN_RULE_LESSTHAN = 'lessThan'; + const AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL = 'lessThanOrEqual'; + + private static $operators = array( + self::AUTOFILTER_COLUMN_RULE_EQUAL, + self::AUTOFILTER_COLUMN_RULE_NOTEQUAL, + self::AUTOFILTER_COLUMN_RULE_GREATERTHAN, + self::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL, + self::AUTOFILTER_COLUMN_RULE_LESSTHAN, + self::AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL, + ); + + const AUTOFILTER_COLUMN_RULE_TOPTEN_BY_VALUE = 'byValue'; + const AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT = 'byPercent'; + + private static $topTenValue = array( + self::AUTOFILTER_COLUMN_RULE_TOPTEN_BY_VALUE, + self::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT, + ); + + const AUTOFILTER_COLUMN_RULE_TOPTEN_TOP = 'top'; + const AUTOFILTER_COLUMN_RULE_TOPTEN_BOTTOM = 'bottom'; + + private static $topTenType = array( + self::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP, + self::AUTOFILTER_COLUMN_RULE_TOPTEN_BOTTOM, + ); + + + /* Rule Operators (Numeric, Boolean etc) */ +// const AUTOFILTER_COLUMN_RULE_BETWEEN = 'between'; // greaterThanOrEqual 1 && lessThanOrEqual 2 + /* Rule Operators (Numeric Special) which are translated to standard numeric operators with calculated values */ +// const AUTOFILTER_COLUMN_RULE_TOPTEN = 'topTen'; // greaterThan calculated value +// const AUTOFILTER_COLUMN_RULE_TOPTENPERCENT = 'topTenPercent'; // greaterThan calculated value +// const AUTOFILTER_COLUMN_RULE_ABOVEAVERAGE = 'aboveAverage'; // Value is calculated as the average +// const AUTOFILTER_COLUMN_RULE_BELOWAVERAGE = 'belowAverage'; // Value is calculated as the average + /* Rule Operators (String) which are set as wild-carded values */ +// const AUTOFILTER_COLUMN_RULE_BEGINSWITH = 'beginsWith'; // A* +// const AUTOFILTER_COLUMN_RULE_ENDSWITH = 'endsWith'; // *Z +// const AUTOFILTER_COLUMN_RULE_CONTAINS = 'contains'; // *B* +// const AUTOFILTER_COLUMN_RULE_DOESNTCONTAIN = 'notEqual'; // notEqual *B* + /* Rule Operators (Date Special) which are translated to standard numeric operators with calculated values */ +// const AUTOFILTER_COLUMN_RULE_BEFORE = 'lessThan'; +// const AUTOFILTER_COLUMN_RULE_AFTER = 'greaterThan'; +// const AUTOFILTER_COLUMN_RULE_YESTERDAY = 'yesterday'; +// const AUTOFILTER_COLUMN_RULE_TODAY = 'today'; +// const AUTOFILTER_COLUMN_RULE_TOMORROW = 'tomorrow'; +// const AUTOFILTER_COLUMN_RULE_LASTWEEK = 'lastWeek'; +// const AUTOFILTER_COLUMN_RULE_THISWEEK = 'thisWeek'; +// const AUTOFILTER_COLUMN_RULE_NEXTWEEK = 'nextWeek'; +// const AUTOFILTER_COLUMN_RULE_LASTMONTH = 'lastMonth'; +// const AUTOFILTER_COLUMN_RULE_THISMONTH = 'thisMonth'; +// const AUTOFILTER_COLUMN_RULE_NEXTMONTH = 'nextMonth'; +// const AUTOFILTER_COLUMN_RULE_LASTQUARTER = 'lastQuarter'; +// const AUTOFILTER_COLUMN_RULE_THISQUARTER = 'thisQuarter'; +// const AUTOFILTER_COLUMN_RULE_NEXTQUARTER = 'nextQuarter'; +// const AUTOFILTER_COLUMN_RULE_LASTYEAR = 'lastYear'; +// const AUTOFILTER_COLUMN_RULE_THISYEAR = 'thisYear'; +// const AUTOFILTER_COLUMN_RULE_NEXTYEAR = 'nextYear'; +// const AUTOFILTER_COLUMN_RULE_YEARTODATE = 'yearToDate'; // <dynamicFilter val="40909" type="yearToDate" maxVal="41113"/> +// const AUTOFILTER_COLUMN_RULE_ALLDATESINMONTH = 'allDatesInMonth'; // <dynamicFilter type="M2"/> for Month/February +// const AUTOFILTER_COLUMN_RULE_ALLDATESINQUARTER = 'allDatesInQuarter'; // <dynamicFilter type="Q2"/> for Quarter 2 + + /** + * Autofilter Column + * + * @var PHPExcel_Worksheet_AutoFilter_Column + */ + private $parent = null; + + + /** + * Autofilter Rule Type + * + * @var string + */ + private $ruleType = self::AUTOFILTER_RULETYPE_FILTER; + + + /** + * Autofilter Rule Value + * + * @var string + */ + private $value = ''; + + /** + * Autofilter Rule Operator + * + * @var string + */ + private $operator = self::AUTOFILTER_COLUMN_RULE_EQUAL; + + /** + * DateTimeGrouping Group Value + * + * @var string + */ + private $grouping = ''; + + + /** + * Create a new PHPExcel_Worksheet_AutoFilter_Column_Rule + * + * @param PHPExcel_Worksheet_AutoFilter_Column $pParent + */ + public function __construct(PHPExcel_Worksheet_AutoFilter_Column $pParent = null) + { + $this->parent = $pParent; + } + + /** + * Get AutoFilter Rule Type + * + * @return string + */ + public function getRuleType() + { + return $this->ruleType; + } + + /** + * Set AutoFilter Rule Type + * + * @param string $pRuleType + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function setRuleType($pRuleType = self::AUTOFILTER_RULETYPE_FILTER) + { + if (!in_array($pRuleType, self::$ruleTypes)) { + throw new PHPExcel_Exception('Invalid rule type for column AutoFilter Rule.'); + } + + $this->ruleType = $pRuleType; + + return $this; + } + + /** + * Get AutoFilter Rule Value + * + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * Set AutoFilter Rule Value + * + * @param string|string[] $pValue + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_AutoFilter_Column_Rule + */ + public function setValue($pValue = '') + { + if (is_array($pValue)) { + $grouping = -1; + foreach ($pValue as $key => $value) { + // Validate array entries + if (!in_array($key, self::$dateTimeGroups)) { + // Remove any invalid entries from the value array + unset($pValue[$key]); + } else { + // Work out what the dateTime grouping will be + $grouping = max($grouping, array_search($key, self::$dateTimeGroups)); + } + } + if (count($pValue) == 0) { + throw new PHPExcel_Exception('Invalid rule value for column AutoFilter Rule.'); + } + // Set the dateTime grouping that we've anticipated + $this->setGrouping(self::$dateTimeGroups[$grouping]); + } + $this->value = $pValue; + + return $this; + } + + /** + * Get AutoFilter Rule Operator + * + * @return string + */ + public function getOperator() + { + return $this->operator; + } + + /** + * Set AutoFilter Rule Operator + * + * @param string $pOperator + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_AutoFilter_Column_Rule + */ + public function setOperator($pOperator = self::AUTOFILTER_COLUMN_RULE_EQUAL) + { + if (empty($pOperator)) { + $pOperator = self::AUTOFILTER_COLUMN_RULE_EQUAL; + } + if ((!in_array($pOperator, self::$operators)) && + (!in_array($pOperator, self::$topTenValue))) { + throw new PHPExcel_Exception('Invalid operator for column AutoFilter Rule.'); + } + $this->operator = $pOperator; + + return $this; + } + + /** + * Get AutoFilter Rule Grouping + * + * @return string + */ + public function getGrouping() + { + return $this->grouping; + } + + /** + * Set AutoFilter Rule Grouping + * + * @param string $pGrouping + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_AutoFilter_Column_Rule + */ + public function setGrouping($pGrouping = null) + { + if (($pGrouping !== null) && + (!in_array($pGrouping, self::$dateTimeGroups)) && + (!in_array($pGrouping, self::$dynamicTypes)) && + (!in_array($pGrouping, self::$topTenType))) { + throw new PHPExcel_Exception('Invalid rule type for column AutoFilter Rule.'); + } + $this->grouping = $pGrouping; + + return $this; + } + + /** + * Set AutoFilter Rule + * + * @param string $pOperator + * @param string|string[] $pValue + * @param string $pGrouping + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_AutoFilter_Column_Rule + */ + public function setRule($pOperator = self::AUTOFILTER_COLUMN_RULE_EQUAL, $pValue = '', $pGrouping = null) + { + $this->setOperator($pOperator); + $this->setValue($pValue); + // Only set grouping if it's been passed in as a user-supplied argument, + // otherwise we're calculating it when we setValue() and don't want to overwrite that + // If the user supplies an argumnet for grouping, then on their own head be it + if ($pGrouping !== null) { + $this->setGrouping($pGrouping); + } + + return $this; + } + + /** + * Get this Rule's AutoFilter Column Parent + * + * @return PHPExcel_Worksheet_AutoFilter_Column + */ + public function getParent() + { + return $this->parent; + } + + /** + * Set this Rule's AutoFilter Column Parent + * + * @param PHPExcel_Worksheet_AutoFilter_Column + * @return PHPExcel_Worksheet_AutoFilter_Column_Rule + */ + public function setParent(PHPExcel_Worksheet_AutoFilter_Column $pParent = null) + { + $this->parent = $pParent; + + return $this; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + if ($key == 'parent') { + // Detach from autofilter column parent + $this->$key = null; + } else { + $this->$key = clone $value; + } + } else { + $this->$key = $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/BaseDrawing.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/BaseDrawing.php new file mode 100644 index 0000000..9ad15c7 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/BaseDrawing.php @@ -0,0 +1,507 @@ +<?php + +/** + * PHPExcel_Worksheet_BaseDrawing + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Worksheet_BaseDrawing implements PHPExcel_IComparable +{ + /** + * Image counter + * + * @var int + */ + private static $imageCounter = 0; + + /** + * Image index + * + * @var int + */ + private $imageIndex = 0; + + /** + * Name + * + * @var string + */ + protected $name; + + /** + * Description + * + * @var string + */ + protected $description; + + /** + * Worksheet + * + * @var PHPExcel_Worksheet + */ + protected $worksheet; + + /** + * Coordinates + * + * @var string + */ + protected $coordinates; + + /** + * Offset X + * + * @var int + */ + protected $offsetX; + + /** + * Offset Y + * + * @var int + */ + protected $offsetY; + + /** + * Width + * + * @var int + */ + protected $width; + + /** + * Height + * + * @var int + */ + protected $height; + + /** + * Proportional resize + * + * @var boolean + */ + protected $resizeProportional; + + /** + * Rotation + * + * @var int + */ + protected $rotation; + + /** + * Shadow + * + * @var PHPExcel_Worksheet_Drawing_Shadow + */ + protected $shadow; + + /** + * Create a new PHPExcel_Worksheet_BaseDrawing + */ + public function __construct() + { + // Initialise values + $this->name = ''; + $this->description = ''; + $this->worksheet = null; + $this->coordinates = 'A1'; + $this->offsetX = 0; + $this->offsetY = 0; + $this->width = 0; + $this->height = 0; + $this->resizeProportional = true; + $this->rotation = 0; + $this->shadow = new PHPExcel_Worksheet_Drawing_Shadow(); + + // Set image index + self::$imageCounter++; + $this->imageIndex = self::$imageCounter; + } + + /** + * Get image index + * + * @return int + */ + public function getImageIndex() + { + return $this->imageIndex; + } + + /** + * Get Name + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Set Name + * + * @param string $pValue + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setName($pValue = '') + { + $this->name = $pValue; + return $this; + } + + /** + * Get Description + * + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * Set Description + * + * @param string $pValue + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setDescription($pValue = '') + { + $this->description = $pValue; + return $this; + } + + /** + * Get Worksheet + * + * @return PHPExcel_Worksheet + */ + public function getWorksheet() + { + return $this->worksheet; + } + + /** + * Set Worksheet + * + * @param PHPExcel_Worksheet $pValue + * @param bool $pOverrideOld If a Worksheet has already been assigned, overwrite it and remove image from old Worksheet? + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setWorksheet(PHPExcel_Worksheet $pValue = null, $pOverrideOld = false) + { + if (is_null($this->worksheet)) { + // Add drawing to PHPExcel_Worksheet + $this->worksheet = $pValue; + $this->worksheet->getCell($this->coordinates); + $this->worksheet->getDrawingCollection()->append($this); + } else { + if ($pOverrideOld) { + // Remove drawing from old PHPExcel_Worksheet + $iterator = $this->worksheet->getDrawingCollection()->getIterator(); + + while ($iterator->valid()) { + if ($iterator->current()->getHashCode() == $this->getHashCode()) { + $this->worksheet->getDrawingCollection()->offsetUnset($iterator->key()); + $this->worksheet = null; + break; + } + } + + // Set new PHPExcel_Worksheet + $this->setWorksheet($pValue); + } else { + throw new PHPExcel_Exception("A PHPExcel_Worksheet has already been assigned. Drawings can only exist on one PHPExcel_Worksheet."); + } + } + return $this; + } + + /** + * Get Coordinates + * + * @return string + */ + public function getCoordinates() + { + return $this->coordinates; + } + + /** + * Set Coordinates + * + * @param string $pValue + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setCoordinates($pValue = 'A1') + { + $this->coordinates = $pValue; + return $this; + } + + /** + * Get OffsetX + * + * @return int + */ + public function getOffsetX() + { + return $this->offsetX; + } + + /** + * Set OffsetX + * + * @param int $pValue + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setOffsetX($pValue = 0) + { + $this->offsetX = $pValue; + return $this; + } + + /** + * Get OffsetY + * + * @return int + */ + public function getOffsetY() + { + return $this->offsetY; + } + + /** + * Set OffsetY + * + * @param int $pValue + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setOffsetY($pValue = 0) + { + $this->offsetY = $pValue; + return $this; + } + + /** + * Get Width + * + * @return int + */ + public function getWidth() + { + return $this->width; + } + + /** + * Set Width + * + * @param int $pValue + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setWidth($pValue = 0) + { + // Resize proportional? + if ($this->resizeProportional && $pValue != 0) { + $ratio = $this->height / ($this->width != 0 ? $this->width : 1); + $this->height = round($ratio * $pValue); + } + + // Set width + $this->width = $pValue; + + return $this; + } + + /** + * Get Height + * + * @return int + */ + public function getHeight() + { + return $this->height; + } + + /** + * Set Height + * + * @param int $pValue + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setHeight($pValue = 0) + { + // Resize proportional? + if ($this->resizeProportional && $pValue != 0) { + $ratio = $this->width / ($this->height != 0 ? $this->height : 1); + $this->width = round($ratio * $pValue); + } + + // Set height + $this->height = $pValue; + + return $this; + } + + /** + * Set width and height with proportional resize + * Example: + * <code> + * $objDrawing->setResizeProportional(true); + * $objDrawing->setWidthAndHeight(160,120); + * </code> + * + * @author Vincent@luo MSN:kele_100@hotmail.com + * @param int $width + * @param int $height + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setWidthAndHeight($width = 0, $height = 0) + { + $xratio = $width / ($this->width != 0 ? $this->width : 1); + $yratio = $height / ($this->height != 0 ? $this->height : 1); + if ($this->resizeProportional && !($width == 0 || $height == 0)) { + if (($xratio * $this->height) < $height) { + $this->height = ceil($xratio * $this->height); + $this->width = $width; + } else { + $this->width = ceil($yratio * $this->width); + $this->height = $height; + } + } else { + $this->width = $width; + $this->height = $height; + } + + return $this; + } + + /** + * Get ResizeProportional + * + * @return boolean + */ + public function getResizeProportional() + { + return $this->resizeProportional; + } + + /** + * Set ResizeProportional + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setResizeProportional($pValue = true) + { + $this->resizeProportional = $pValue; + return $this; + } + + /** + * Get Rotation + * + * @return int + */ + public function getRotation() + { + return $this->rotation; + } + + /** + * Set Rotation + * + * @param int $pValue + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setRotation($pValue = 0) + { + $this->rotation = $pValue; + return $this; + } + + /** + * Get Shadow + * + * @return PHPExcel_Worksheet_Drawing_Shadow + */ + public function getShadow() + { + return $this->shadow; + } + + /** + * Set Shadow + * + * @param PHPExcel_Worksheet_Drawing_Shadow $pValue + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_BaseDrawing + */ + public function setShadow(PHPExcel_Worksheet_Drawing_Shadow $pValue = null) + { + $this->shadow = $pValue; + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + return md5( + $this->name . + $this->description . + $this->worksheet->getHashCode() . + $this->coordinates . + $this->offsetX . + $this->offsetY . + $this->width . + $this->height . + $this->rotation . + $this->shadow->getHashCode() . + __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/CellIterator.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/CellIterator.php new file mode 100644 index 0000000..151c17f --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/CellIterator.php @@ -0,0 +1,88 @@ +<?php + +/** + * PHPExcel_Worksheet_CellIterator + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +abstract class PHPExcel_Worksheet_CellIterator +{ + /** + * PHPExcel_Worksheet to iterate + * + * @var PHPExcel_Worksheet + */ + protected $subject; + + /** + * Current iterator position + * + * @var mixed + */ + protected $position = null; + + /** + * Iterate only existing cells + * + * @var boolean + */ + protected $onlyExistingCells = false; + + /** + * Destructor + */ + public function __destruct() + { + unset($this->subject); + } + + /** + * Get loop only existing cells + * + * @return boolean + */ + public function getIterateOnlyExistingCells() + { + return $this->onlyExistingCells; + } + + /** + * Validate start/end values for "IterateOnlyExistingCells" mode, and adjust if necessary + * + * @throws PHPExcel_Exception + */ + abstract protected function adjustForExistingOnlyRange(); + + /** + * Set the iterator to loop only existing cells + * + * @param boolean $value + * @throws PHPExcel_Exception + */ + public function setIterateOnlyExistingCells($value = true) + { + $this->onlyExistingCells = (boolean) $value; + + $this->adjustForExistingOnlyRange(); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/Column.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/Column.php new file mode 100644 index 0000000..6d3f36d --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/Column.php @@ -0,0 +1,86 @@ +<?php + +/** + * PHPExcel_Worksheet_Column + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Worksheet_Column +{ + /** + * PHPExcel_Worksheet + * + * @var PHPExcel_Worksheet + */ + private $parent; + + /** + * Column index + * + * @var string + */ + private $columnIndex; + + /** + * Create a new column + * + * @param PHPExcel_Worksheet $parent + * @param string $columnIndex + */ + public function __construct(PHPExcel_Worksheet $parent = null, $columnIndex = 'A') + { + // Set parent and column index + $this->parent = $parent; + $this->columnIndex = $columnIndex; + } + + /** + * Destructor + */ + public function __destruct() + { + unset($this->parent); + } + + /** + * Get column index + * + * @return string + */ + public function getColumnIndex() + { + return $this->columnIndex; + } + + /** + * Get cell iterator + * + * @param integer $startRow The row number at which to start iterating + * @param integer $endRow Optionally, the row number at which to stop iterating + * @return PHPExcel_Worksheet_CellIterator + */ + public function getCellIterator($startRow = 1, $endRow = null) + { + return new PHPExcel_Worksheet_ColumnCellIterator($this->parent, $this->columnIndex, $startRow, $endRow); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/ColumnCellIterator.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/ColumnCellIterator.php new file mode 100644 index 0000000..7b8c219 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/ColumnCellIterator.php @@ -0,0 +1,216 @@ +<?php + +/** + * PHPExcel_Worksheet_ColumnCellIterator + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Worksheet_ColumnCellIterator extends PHPExcel_Worksheet_CellIterator implements Iterator +{ + /** + * Column index + * + * @var string + */ + protected $columnIndex; + + /** + * Start position + * + * @var int + */ + protected $startRow = 1; + + /** + * End position + * + * @var int + */ + protected $endRow = 1; + + /** + * Create a new row iterator + * + * @param PHPExcel_Worksheet $subject The worksheet to iterate over + * @param string $columnIndex The column that we want to iterate + * @param integer $startRow The row number at which to start iterating + * @param integer $endRow Optionally, the row number at which to stop iterating + */ + public function __construct(PHPExcel_Worksheet $subject = null, $columnIndex = 'A', $startRow = 1, $endRow = null) + { + // Set subject + $this->subject = $subject; + $this->columnIndex = PHPExcel_Cell::columnIndexFromString($columnIndex) - 1; + $this->resetEnd($endRow); + $this->resetStart($startRow); + } + + /** + * Destructor + */ + public function __destruct() + { + unset($this->subject); + } + + /** + * (Re)Set the start row and the current row pointer + * + * @param integer $startRow The row number at which to start iterating + * @return PHPExcel_Worksheet_ColumnCellIterator + * @throws PHPExcel_Exception + */ + public function resetStart($startRow = 1) + { + $this->startRow = $startRow; + $this->adjustForExistingOnlyRange(); + $this->seek($startRow); + + return $this; + } + + /** + * (Re)Set the end row + * + * @param integer $endRow The row number at which to stop iterating + * @return PHPExcel_Worksheet_ColumnCellIterator + * @throws PHPExcel_Exception + */ + public function resetEnd($endRow = null) + { + $this->endRow = ($endRow) ? $endRow : $this->subject->getHighestRow(); + $this->adjustForExistingOnlyRange(); + + return $this; + } + + /** + * Set the row pointer to the selected row + * + * @param integer $row The row number to set the current pointer at + * @return PHPExcel_Worksheet_ColumnCellIterator + * @throws PHPExcel_Exception + */ + public function seek($row = 1) + { + if (($row < $this->startRow) || ($row > $this->endRow)) { + throw new PHPExcel_Exception("Row $row is out of range ({$this->startRow} - {$this->endRow})"); + } elseif ($this->onlyExistingCells && !($this->subject->cellExistsByColumnAndRow($this->columnIndex, $row))) { + throw new PHPExcel_Exception('In "IterateOnlyExistingCells" mode and Cell does not exist'); + } + $this->position = $row; + + return $this; + } + + /** + * Rewind the iterator to the starting row + */ + public function rewind() + { + $this->position = $this->startRow; + } + + /** + * Return the current cell in this worksheet column + * + * @return PHPExcel_Worksheet_Row + */ + public function current() + { + return $this->subject->getCellByColumnAndRow($this->columnIndex, $this->position); + } + + /** + * Return the current iterator key + * + * @return int + */ + public function key() + { + return $this->position; + } + + /** + * Set the iterator to its next value + */ + public function next() + { + do { + ++$this->position; + } while (($this->onlyExistingCells) && + (!$this->subject->cellExistsByColumnAndRow($this->columnIndex, $this->position)) && + ($this->position <= $this->endRow)); + } + + /** + * Set the iterator to its previous value + */ + public function prev() + { + if ($this->position <= $this->startRow) { + throw new PHPExcel_Exception("Row is already at the beginning of range ({$this->startRow} - {$this->endRow})"); + } + + do { + --$this->position; + } while (($this->onlyExistingCells) && + (!$this->subject->cellExistsByColumnAndRow($this->columnIndex, $this->position)) && + ($this->position >= $this->startRow)); + } + + /** + * Indicate if more rows exist in the worksheet range of rows that we're iterating + * + * @return boolean + */ + public function valid() + { + return $this->position <= $this->endRow; + } + + /** + * Validate start/end values for "IterateOnlyExistingCells" mode, and adjust if necessary + * + * @throws PHPExcel_Exception + */ + protected function adjustForExistingOnlyRange() + { + if ($this->onlyExistingCells) { + while ((!$this->subject->cellExistsByColumnAndRow($this->columnIndex, $this->startRow)) && + ($this->startRow <= $this->endRow)) { + ++$this->startRow; + } + if ($this->startRow > $this->endRow) { + throw new PHPExcel_Exception('No cells exist within the specified range'); + } + while ((!$this->subject->cellExistsByColumnAndRow($this->columnIndex, $this->endRow)) && + ($this->endRow >= $this->startRow)) { + --$this->endRow; + } + if ($this->endRow < $this->startRow) { + throw new PHPExcel_Exception('No cells exist within the specified range'); + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/ColumnDimension.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/ColumnDimension.php new file mode 100644 index 0000000..405b825 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/ColumnDimension.php @@ -0,0 +1,132 @@ +<?php + +/** + * PHPExcel_Worksheet_ColumnDimension + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Worksheet_ColumnDimension extends PHPExcel_Worksheet_Dimension +{ + /** + * Column index + * + * @var int + */ + private $columnIndex; + + /** + * Column width + * + * When this is set to a negative value, the column width should be ignored by IWriter + * + * @var double + */ + private $width = -1; + + /** + * Auto size? + * + * @var bool + */ + private $autoSize = false; + + /** + * Create a new PHPExcel_Worksheet_ColumnDimension + * + * @param string $pIndex Character column index + */ + public function __construct($pIndex = 'A') + { + // Initialise values + $this->columnIndex = $pIndex; + + // set dimension as unformatted by default + parent::__construct(0); + } + + /** + * Get ColumnIndex + * + * @return string + */ + public function getColumnIndex() + { + return $this->columnIndex; + } + + /** + * Set ColumnIndex + * + * @param string $pValue + * @return PHPExcel_Worksheet_ColumnDimension + */ + public function setColumnIndex($pValue) + { + $this->columnIndex = $pValue; + return $this; + } + + /** + * Get Width + * + * @return double + */ + public function getWidth() + { + return $this->width; + } + + /** + * Set Width + * + * @param double $pValue + * @return PHPExcel_Worksheet_ColumnDimension + */ + public function setWidth($pValue = -1) + { + $this->width = $pValue; + return $this; + } + + /** + * Get Auto Size + * + * @return bool + */ + public function getAutoSize() + { + return $this->autoSize; + } + + /** + * Set Auto Size + * + * @param bool $pValue + * @return PHPExcel_Worksheet_ColumnDimension + */ + public function setAutoSize($pValue = false) + { + $this->autoSize = $pValue; + return $this; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/ColumnIterator.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/ColumnIterator.php new file mode 100644 index 0000000..0db3e53 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/ColumnIterator.php @@ -0,0 +1,201 @@ +<?php + +/** + * PHPExcel_Worksheet_ColumnIterator + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Worksheet_ColumnIterator implements Iterator +{ + /** + * PHPExcel_Worksheet to iterate + * + * @var PHPExcel_Worksheet + */ + private $subject; + + /** + * Current iterator position + * + * @var int + */ + private $position = 0; + + /** + * Start position + * + * @var int + */ + private $startColumn = 0; + + + /** + * End position + * + * @var int + */ + private $endColumn = 0; + + + /** + * Create a new column iterator + * + * @param PHPExcel_Worksheet $subject The worksheet to iterate over + * @param string $startColumn The column address at which to start iterating + * @param string $endColumn Optionally, the column address at which to stop iterating + */ + public function __construct(PHPExcel_Worksheet $subject = null, $startColumn = 'A', $endColumn = null) + { + // Set subject + $this->subject = $subject; + $this->resetEnd($endColumn); + $this->resetStart($startColumn); + } + + /** + * Destructor + */ + public function __destruct() + { + unset($this->subject); + } + + /** + * (Re)Set the start column and the current column pointer + * + * @param integer $startColumn The column address at which to start iterating + * @return PHPExcel_Worksheet_ColumnIterator + * @throws PHPExcel_Exception + */ + public function resetStart($startColumn = 'A') + { + $startColumnIndex = PHPExcel_Cell::columnIndexFromString($startColumn) - 1; + if ($startColumnIndex > PHPExcel_Cell::columnIndexFromString($this->subject->getHighestColumn()) - 1) { + throw new PHPExcel_Exception("Start column ({$startColumn}) is beyond highest column ({$this->subject->getHighestColumn()})"); + } + + $this->startColumn = $startColumnIndex; + if ($this->endColumn < $this->startColumn) { + $this->endColumn = $this->startColumn; + } + $this->seek($startColumn); + + return $this; + } + + /** + * (Re)Set the end column + * + * @param string $endColumn The column address at which to stop iterating + * @return PHPExcel_Worksheet_ColumnIterator + */ + public function resetEnd($endColumn = null) + { + $endColumn = ($endColumn) ? $endColumn : $this->subject->getHighestColumn(); + $this->endColumn = PHPExcel_Cell::columnIndexFromString($endColumn) - 1; + + return $this; + } + + /** + * Set the column pointer to the selected column + * + * @param string $column The column address to set the current pointer at + * @return PHPExcel_Worksheet_ColumnIterator + * @throws PHPExcel_Exception + */ + public function seek($column = 'A') + { + $column = PHPExcel_Cell::columnIndexFromString($column) - 1; + if (($column < $this->startColumn) || ($column > $this->endColumn)) { + throw new PHPExcel_Exception("Column $column is out of range ({$this->startColumn} - {$this->endColumn})"); + } + $this->position = $column; + + return $this; + } + + /** + * Rewind the iterator to the starting column + */ + public function rewind() + { + $this->position = $this->startColumn; + } + + /** + * Return the current column in this worksheet + * + * @return PHPExcel_Worksheet_Column + */ + public function current() + { + return new PHPExcel_Worksheet_Column($this->subject, PHPExcel_Cell::stringFromColumnIndex($this->position)); + } + + /** + * Return the current iterator key + * + * @return string + */ + public function key() + { + return PHPExcel_Cell::stringFromColumnIndex($this->position); + } + + /** + * Set the iterator to its next value + */ + public function next() + { + ++$this->position; + } + + /** + * Set the iterator to its previous value + * + * @throws PHPExcel_Exception + */ + public function prev() + { + if ($this->position <= $this->startColumn) { + throw new PHPExcel_Exception( + "Column is already at the beginning of range (" . + PHPExcel_Cell::stringFromColumnIndex($this->endColumn) . " - " . + PHPExcel_Cell::stringFromColumnIndex($this->endColumn) . ")" + ); + } + + --$this->position; + } + + /** + * Indicate if more columns exist in the worksheet range of columns that we're iterating + * + * @return boolean + */ + public function valid() + { + return $this->position <= $this->endColumn; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/Dimension.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/Dimension.php new file mode 100644 index 0000000..84f692c --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/Dimension.php @@ -0,0 +1,178 @@ +<?php + +/** + * PHPExcel_Worksheet_Dimension + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +abstract class PHPExcel_Worksheet_Dimension +{ + /** + * Visible? + * + * @var bool + */ + private $visible = true; + + /** + * Outline level + * + * @var int + */ + private $outlineLevel = 0; + + /** + * Collapsed + * + * @var bool + */ + private $collapsed = false; + + /** + * Index to cellXf. Null value means row has no explicit cellXf format. + * + * @var int|null + */ + private $xfIndex; + + /** + * Create a new PHPExcel_Worksheet_Dimension + * + * @param int $pIndex Numeric row index + */ + public function __construct($initialValue = null) + { + // set dimension as unformatted by default + $this->xfIndex = $initialValue; + } + + /** + * Get Visible + * + * @return bool + */ + public function getVisible() + { + return $this->visible; + } + + /** + * Set Visible + * + * @param bool $pValue + * @return PHPExcel_Worksheet_Dimension + */ + public function setVisible($pValue = true) + { + $this->visible = $pValue; + return $this; + } + + /** + * Get Outline Level + * + * @return int + */ + public function getOutlineLevel() + { + return $this->outlineLevel; + } + + /** + * Set Outline Level + * + * Value must be between 0 and 7 + * + * @param int $pValue + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_Dimension + */ + public function setOutlineLevel($pValue) + { + if ($pValue < 0 || $pValue > 7) { + throw new PHPExcel_Exception("Outline level must range between 0 and 7."); + } + + $this->outlineLevel = $pValue; + return $this; + } + + /** + * Get Collapsed + * + * @return bool + */ + public function getCollapsed() + { + return $this->collapsed; + } + + /** + * Set Collapsed + * + * @param bool $pValue + * @return PHPExcel_Worksheet_Dimension + */ + public function setCollapsed($pValue = true) + { + $this->collapsed = $pValue; + return $this; + } + + /** + * Get index to cellXf + * + * @return int + */ + public function getXfIndex() + { + return $this->xfIndex; + } + + /** + * Set index to cellXf + * + * @param int $pValue + * @return PHPExcel_Worksheet_Dimension + */ + public function setXfIndex($pValue = 0) + { + $this->xfIndex = $pValue; + return $this; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/Drawing.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/Drawing.php new file mode 100644 index 0000000..e39d3eb --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/Drawing.php @@ -0,0 +1,147 @@ +<?php + +/** + * PHPExcel_Worksheet_Drawing + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet_Drawing + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Worksheet_Drawing extends PHPExcel_Worksheet_BaseDrawing implements PHPExcel_IComparable +{ + /** + * Path + * + * @var string + */ + private $path; + + /** + * Create a new PHPExcel_Worksheet_Drawing + */ + public function __construct() + { + // Initialise values + $this->path = ''; + + // Initialize parent + parent::__construct(); + } + + /** + * Get Filename + * + * @return string + */ + public function getFilename() + { + return basename($this->path); + } + + /** + * Get indexed filename (using image index) + * + * @return string + */ + public function getIndexedFilename() + { + $fileName = $this->getFilename(); + $fileName = str_replace(' ', '_', $fileName); + return str_replace('.' . $this->getExtension(), '', $fileName) . $this->getImageIndex() . '.' . $this->getExtension(); + } + + /** + * Get Extension + * + * @return string + */ + public function getExtension() + { + $exploded = explode(".", basename($this->path)); + return $exploded[count($exploded) - 1]; + } + + /** + * Get Path + * + * @return string + */ + public function getPath() + { + return $this->path; + } + + /** + * Set Path + * + * @param string $pValue File path + * @param boolean $pVerifyFile Verify file + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_Drawing + */ + public function setPath($pValue = '', $pVerifyFile = true) + { + if ($pVerifyFile) { + if (file_exists($pValue)) { + $this->path = $pValue; + + if ($this->width == 0 && $this->height == 0) { + // Get width/height + list($this->width, $this->height) = getimagesize($pValue); + } + } else { + throw new PHPExcel_Exception("File $pValue not found!"); + } + } else { + $this->path = $pValue; + } + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + return md5( + $this->path . + parent::getHashCode() . + __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/Drawing/Shadow.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/Drawing/Shadow.php new file mode 100644 index 0000000..84db91d --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/Drawing/Shadow.php @@ -0,0 +1,296 @@ +<?php + +/** + * PHPExcel_Worksheet_Drawing_Shadow + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet_Drawing + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Worksheet_Drawing_Shadow implements PHPExcel_IComparable +{ + /* Shadow alignment */ + const SHADOW_BOTTOM = 'b'; + const SHADOW_BOTTOM_LEFT = 'bl'; + const SHADOW_BOTTOM_RIGHT = 'br'; + const SHADOW_CENTER = 'ctr'; + const SHADOW_LEFT = 'l'; + const SHADOW_TOP = 't'; + const SHADOW_TOP_LEFT = 'tl'; + const SHADOW_TOP_RIGHT = 'tr'; + + /** + * Visible + * + * @var boolean + */ + private $visible; + + /** + * Blur radius + * + * Defaults to 6 + * + * @var int + */ + private $blurRadius; + + /** + * Shadow distance + * + * Defaults to 2 + * + * @var int + */ + private $distance; + + /** + * Shadow direction (in degrees) + * + * @var int + */ + private $direction; + + /** + * Shadow alignment + * + * @var int + */ + private $alignment; + + /** + * Color + * + * @var PHPExcel_Style_Color + */ + private $color; + + /** + * Alpha + * + * @var int + */ + private $alpha; + + /** + * Create a new PHPExcel_Worksheet_Drawing_Shadow + */ + public function __construct() + { + // Initialise values + $this->visible = false; + $this->blurRadius = 6; + $this->distance = 2; + $this->direction = 0; + $this->alignment = PHPExcel_Worksheet_Drawing_Shadow::SHADOW_BOTTOM_RIGHT; + $this->color = new PHPExcel_Style_Color(PHPExcel_Style_Color::COLOR_BLACK); + $this->alpha = 50; + } + + /** + * Get Visible + * + * @return boolean + */ + public function getVisible() + { + return $this->visible; + } + + /** + * Set Visible + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Drawing_Shadow + */ + public function setVisible($pValue = false) + { + $this->visible = $pValue; + return $this; + } + + /** + * Get Blur radius + * + * @return int + */ + public function getBlurRadius() + { + return $this->blurRadius; + } + + /** + * Set Blur radius + * + * @param int $pValue + * @return PHPExcel_Worksheet_Drawing_Shadow + */ + public function setBlurRadius($pValue = 6) + { + $this->blurRadius = $pValue; + return $this; + } + + /** + * Get Shadow distance + * + * @return int + */ + public function getDistance() + { + return $this->distance; + } + + /** + * Set Shadow distance + * + * @param int $pValue + * @return PHPExcel_Worksheet_Drawing_Shadow + */ + public function setDistance($pValue = 2) + { + $this->distance = $pValue; + return $this; + } + + /** + * Get Shadow direction (in degrees) + * + * @return int + */ + public function getDirection() + { + return $this->direction; + } + + /** + * Set Shadow direction (in degrees) + * + * @param int $pValue + * @return PHPExcel_Worksheet_Drawing_Shadow + */ + public function setDirection($pValue = 0) + { + $this->direction = $pValue; + return $this; + } + + /** + * Get Shadow alignment + * + * @return int + */ + public function getAlignment() + { + return $this->alignment; + } + + /** + * Set Shadow alignment + * + * @param int $pValue + * @return PHPExcel_Worksheet_Drawing_Shadow + */ + public function setAlignment($pValue = 0) + { + $this->alignment = $pValue; + return $this; + } + + /** + * Get Color + * + * @return PHPExcel_Style_Color + */ + public function getColor() + { + return $this->color; + } + + /** + * Set Color + * + * @param PHPExcel_Style_Color $pValue + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_Drawing_Shadow + */ + public function setColor(PHPExcel_Style_Color $pValue = null) + { + $this->color = $pValue; + return $this; + } + + /** + * Get Alpha + * + * @return int + */ + public function getAlpha() + { + return $this->alpha; + } + + /** + * Set Alpha + * + * @param int $pValue + * @return PHPExcel_Worksheet_Drawing_Shadow + */ + public function setAlpha($pValue = 0) + { + $this->alpha = $pValue; + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + return md5( + ($this->visible ? 't' : 'f') . + $this->blurRadius . + $this->distance . + $this->direction . + $this->alignment . + $this->color->getHashCode() . + $this->alpha . + __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/HeaderFooter.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/HeaderFooter.php new file mode 100644 index 0000000..3a88923 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/HeaderFooter.php @@ -0,0 +1,494 @@ +<?php +/** + * PHPExcel_Worksheet_HeaderFooter + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not,241 write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + * + * <code> + * Header/Footer Formatting Syntax taken from Office Open XML Part 4 - Markup Language Reference, page 1970: + * + * There are a number of formatting codes that can be written inline with the actual header / footer text, which + * affect the formatting in the header or footer. + * + * Example: This example shows the text "Center Bold Header" on the first line (center section), and the date on + * the second line (center section). + * &CCenter &"-,Bold"Bold&"-,Regular"Header_x000A_&D + * + * General Rules: + * There is no required order in which these codes must appear. + * + * The first occurrence of the following codes turns the formatting ON, the second occurrence turns it OFF again: + * - strikethrough + * - superscript + * - subscript + * Superscript and subscript cannot both be ON at same time. Whichever comes first wins and the other is ignored, + * while the first is ON. + * &L - code for "left section" (there are three header / footer locations, "left", "center", and "right"). When + * two or more occurrences of this section marker exist, the contents from all markers are concatenated, in the + * order of appearance, and placed into the left section. + * &P - code for "current page #" + * &N - code for "total pages" + * &font size - code for "text font size", where font size is a font size in points. + * &K - code for "text font color" + * RGB Color is specified as RRGGBB + * Theme Color is specifed as TTSNN where TT is the theme color Id, S is either "+" or "-" of the tint/shade + * value, NN is the tint/shade value. + * &S - code for "text strikethrough" on / off + * &X - code for "text super script" on / off + * &Y - code for "text subscript" on / off + * &C - code for "center section". When two or more occurrences of this section marker exist, the contents + * from all markers are concatenated, in the order of appearance, and placed into the center section. + * + * &D - code for "date" + * &T - code for "time" + * &G - code for "picture as background" + * &U - code for "text single underline" + * &E - code for "double underline" + * &R - code for "right section". When two or more occurrences of this section marker exist, the contents + * from all markers are concatenated, in the order of appearance, and placed into the right section. + * &Z - code for "this workbook's file path" + * &F - code for "this workbook's file name" + * &A - code for "sheet tab name" + * &+ - code for add to page #. + * &- - code for subtract from page #. + * &"font name,font type" - code for "text font name" and "text font type", where font name and font type + * are strings specifying the name and type of the font, separated by a comma. When a hyphen appears in font + * name, it means "none specified". Both of font name and font type can be localized values. + * &"-,Bold" - code for "bold font style" + * &B - also means "bold font style". + * &"-,Regular" - code for "regular font style" + * &"-,Italic" - code for "italic font style" + * &I - also means "italic font style" + * &"-,Bold Italic" code for "bold italic font style" + * &O - code for "outline style" + * &H - code for "shadow style" + * </code> + * + */ +class PHPExcel_Worksheet_HeaderFooter +{ + /* Header/footer image location */ + const IMAGE_HEADER_LEFT = 'LH'; + const IMAGE_HEADER_CENTER = 'CH'; + const IMAGE_HEADER_RIGHT = 'RH'; + const IMAGE_FOOTER_LEFT = 'LF'; + const IMAGE_FOOTER_CENTER = 'CF'; + const IMAGE_FOOTER_RIGHT = 'RF'; + + /** + * OddHeader + * + * @var string + */ + private $oddHeader = ''; + + /** + * OddFooter + * + * @var string + */ + private $oddFooter = ''; + + /** + * EvenHeader + * + * @var string + */ + private $evenHeader = ''; + + /** + * EvenFooter + * + * @var string + */ + private $evenFooter = ''; + + /** + * FirstHeader + * + * @var string + */ + private $firstHeader = ''; + + /** + * FirstFooter + * + * @var string + */ + private $firstFooter = ''; + + /** + * Different header for Odd/Even, defaults to false + * + * @var boolean + */ + private $differentOddEven = false; + + /** + * Different header for first page, defaults to false + * + * @var boolean + */ + private $differentFirst = false; + + /** + * Scale with document, defaults to true + * + * @var boolean + */ + private $scaleWithDocument = true; + + /** + * Align with margins, defaults to true + * + * @var boolean + */ + private $alignWithMargins = true; + + /** + * Header/footer images + * + * @var PHPExcel_Worksheet_HeaderFooterDrawing[] + */ + private $headerFooterImages = array(); + + /** + * Create a new PHPExcel_Worksheet_HeaderFooter + */ + public function __construct() + { + } + + /** + * Get OddHeader + * + * @return string + */ + public function getOddHeader() + { + return $this->oddHeader; + } + + /** + * Set OddHeader + * + * @param string $pValue + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setOddHeader($pValue) + { + $this->oddHeader = $pValue; + return $this; + } + + /** + * Get OddFooter + * + * @return string + */ + public function getOddFooter() + { + return $this->oddFooter; + } + + /** + * Set OddFooter + * + * @param string $pValue + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setOddFooter($pValue) + { + $this->oddFooter = $pValue; + return $this; + } + + /** + * Get EvenHeader + * + * @return string + */ + public function getEvenHeader() + { + return $this->evenHeader; + } + + /** + * Set EvenHeader + * + * @param string $pValue + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setEvenHeader($pValue) + { + $this->evenHeader = $pValue; + return $this; + } + + /** + * Get EvenFooter + * + * @return string + */ + public function getEvenFooter() + { + return $this->evenFooter; + } + + /** + * Set EvenFooter + * + * @param string $pValue + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setEvenFooter($pValue) + { + $this->evenFooter = $pValue; + return $this; + } + + /** + * Get FirstHeader + * + * @return string + */ + public function getFirstHeader() + { + return $this->firstHeader; + } + + /** + * Set FirstHeader + * + * @param string $pValue + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setFirstHeader($pValue) + { + $this->firstHeader = $pValue; + return $this; + } + + /** + * Get FirstFooter + * + * @return string + */ + public function getFirstFooter() + { + return $this->firstFooter; + } + + /** + * Set FirstFooter + * + * @param string $pValue + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setFirstFooter($pValue) + { + $this->firstFooter = $pValue; + return $this; + } + + /** + * Get DifferentOddEven + * + * @return boolean + */ + public function getDifferentOddEven() + { + return $this->differentOddEven; + } + + /** + * Set DifferentOddEven + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setDifferentOddEven($pValue = false) + { + $this->differentOddEven = $pValue; + return $this; + } + + /** + * Get DifferentFirst + * + * @return boolean + */ + public function getDifferentFirst() + { + return $this->differentFirst; + } + + /** + * Set DifferentFirst + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setDifferentFirst($pValue = false) + { + $this->differentFirst = $pValue; + return $this; + } + + /** + * Get ScaleWithDocument + * + * @return boolean + */ + public function getScaleWithDocument() + { + return $this->scaleWithDocument; + } + + /** + * Set ScaleWithDocument + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setScaleWithDocument($pValue = true) + { + $this->scaleWithDocument = $pValue; + return $this; + } + + /** + * Get AlignWithMargins + * + * @return boolean + */ + public function getAlignWithMargins() + { + return $this->alignWithMargins; + } + + /** + * Set AlignWithMargins + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setAlignWithMargins($pValue = true) + { + $this->alignWithMargins = $pValue; + return $this; + } + + /** + * Add header/footer image + * + * @param PHPExcel_Worksheet_HeaderFooterDrawing $image + * @param string $location + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function addImage(PHPExcel_Worksheet_HeaderFooterDrawing $image = null, $location = self::IMAGE_HEADER_LEFT) + { + $this->headerFooterImages[$location] = $image; + return $this; + } + + /** + * Remove header/footer image + * + * @param string $location + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function removeImage($location = self::IMAGE_HEADER_LEFT) + { + if (isset($this->headerFooterImages[$location])) { + unset($this->headerFooterImages[$location]); + } + return $this; + } + + /** + * Set header/footer images + * + * @param PHPExcel_Worksheet_HeaderFooterDrawing[] $images + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setImages($images) + { + if (!is_array($images)) { + throw new PHPExcel_Exception('Invalid parameter!'); + } + + $this->headerFooterImages = $images; + return $this; + } + + /** + * Get header/footer images + * + * @return PHPExcel_Worksheet_HeaderFooterDrawing[] + */ + public function getImages() + { + // Sort array + $images = array(); + if (isset($this->headerFooterImages[self::IMAGE_HEADER_LEFT])) { + $images[self::IMAGE_HEADER_LEFT] = $this->headerFooterImages[self::IMAGE_HEADER_LEFT]; + } + if (isset($this->headerFooterImages[self::IMAGE_HEADER_CENTER])) { + $images[self::IMAGE_HEADER_CENTER] = $this->headerFooterImages[self::IMAGE_HEADER_CENTER]; + } + if (isset($this->headerFooterImages[self::IMAGE_HEADER_RIGHT])) { + $images[self::IMAGE_HEADER_RIGHT] = $this->headerFooterImages[self::IMAGE_HEADER_RIGHT]; + } + if (isset($this->headerFooterImages[self::IMAGE_FOOTER_LEFT])) { + $images[self::IMAGE_FOOTER_LEFT] = $this->headerFooterImages[self::IMAGE_FOOTER_LEFT]; + } + if (isset($this->headerFooterImages[self::IMAGE_FOOTER_CENTER])) { + $images[self::IMAGE_FOOTER_CENTER] = $this->headerFooterImages[self::IMAGE_FOOTER_CENTER]; + } + if (isset($this->headerFooterImages[self::IMAGE_FOOTER_RIGHT])) { + $images[self::IMAGE_FOOTER_RIGHT] = $this->headerFooterImages[self::IMAGE_FOOTER_RIGHT]; + } + $this->headerFooterImages = $images; + + return $this->headerFooterImages; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/HeaderFooterDrawing.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/HeaderFooterDrawing.php new file mode 100644 index 0000000..a491f4b --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/HeaderFooterDrawing.php @@ -0,0 +1,361 @@ +<?php + +/** + * PHPExcel_Worksheet_HeaderFooterDrawing + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Worksheet_HeaderFooterDrawing extends PHPExcel_Worksheet_Drawing implements PHPExcel_IComparable +{ + /** + * Path + * + * @var string + */ + private $path; + + /** + * Name + * + * @var string + */ + protected $name; + + /** + * Offset X + * + * @var int + */ + protected $offsetX; + + /** + * Offset Y + * + * @var int + */ + protected $offsetY; + + /** + * Width + * + * @var int + */ + protected $width; + + /** + * Height + * + * @var int + */ + protected $height; + + /** + * Proportional resize + * + * @var boolean + */ + protected $resizeProportional; + + /** + * Create a new PHPExcel_Worksheet_HeaderFooterDrawing + */ + public function __construct() + { + // Initialise values + $this->path = ''; + $this->name = ''; + $this->offsetX = 0; + $this->offsetY = 0; + $this->width = 0; + $this->height = 0; + $this->resizeProportional = true; + } + + /** + * Get Name + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Set Name + * + * @param string $pValue + * @return PHPExcel_Worksheet_HeaderFooterDrawing + */ + public function setName($pValue = '') + { + $this->name = $pValue; + return $this; + } + + /** + * Get OffsetX + * + * @return int + */ + public function getOffsetX() + { + return $this->offsetX; + } + + /** + * Set OffsetX + * + * @param int $pValue + * @return PHPExcel_Worksheet_HeaderFooterDrawing + */ + public function setOffsetX($pValue = 0) + { + $this->offsetX = $pValue; + return $this; + } + + /** + * Get OffsetY + * + * @return int + */ + public function getOffsetY() + { + return $this->offsetY; + } + + /** + * Set OffsetY + * + * @param int $pValue + * @return PHPExcel_Worksheet_HeaderFooterDrawing + */ + public function setOffsetY($pValue = 0) + { + $this->offsetY = $pValue; + return $this; + } + + /** + * Get Width + * + * @return int + */ + public function getWidth() + { + return $this->width; + } + + /** + * Set Width + * + * @param int $pValue + * @return PHPExcel_Worksheet_HeaderFooterDrawing + */ + public function setWidth($pValue = 0) + { + // Resize proportional? + if ($this->resizeProportional && $pValue != 0) { + $ratio = $this->width / $this->height; + $this->height = round($ratio * $pValue); + } + + // Set width + $this->width = $pValue; + + return $this; + } + + /** + * Get Height + * + * @return int + */ + public function getHeight() + { + return $this->height; + } + + /** + * Set Height + * + * @param int $pValue + * @return PHPExcel_Worksheet_HeaderFooterDrawing + */ + public function setHeight($pValue = 0) + { + // Resize proportional? + if ($this->resizeProportional && $pValue != 0) { + $ratio = $this->width / $this->height; + $this->width = round($ratio * $pValue); + } + + // Set height + $this->height = $pValue; + + return $this; + } + + /** + * Set width and height with proportional resize + * Example: + * <code> + * $objDrawing->setResizeProportional(true); + * $objDrawing->setWidthAndHeight(160,120); + * </code> + * + * @author Vincent@luo MSN:kele_100@hotmail.com + * @param int $width + * @param int $height + * @return PHPExcel_Worksheet_HeaderFooterDrawing + */ + public function setWidthAndHeight($width = 0, $height = 0) + { + $xratio = $width / $this->width; + $yratio = $height / $this->height; + if ($this->resizeProportional && !($width == 0 || $height == 0)) { + if (($xratio * $this->height) < $height) { + $this->height = ceil($xratio * $this->height); + $this->width = $width; + } else { + $this->width = ceil($yratio * $this->width); + $this->height = $height; + } + } + return $this; + } + + /** + * Get ResizeProportional + * + * @return boolean + */ + public function getResizeProportional() + { + return $this->resizeProportional; + } + + /** + * Set ResizeProportional + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_HeaderFooterDrawing + */ + public function setResizeProportional($pValue = true) + { + $this->resizeProportional = $pValue; + return $this; + } + + /** + * Get Filename + * + * @return string + */ + public function getFilename() + { + return basename($this->path); + } + + /** + * Get Extension + * + * @return string + */ + public function getExtension() + { + $parts = explode(".", basename($this->path)); + return end($parts); + } + + /** + * Get Path + * + * @return string + */ + public function getPath() + { + return $this->path; + } + + /** + * Set Path + * + * @param string $pValue File path + * @param boolean $pVerifyFile Verify file + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_HeaderFooterDrawing + */ + public function setPath($pValue = '', $pVerifyFile = true) + { + if ($pVerifyFile) { + if (file_exists($pValue)) { + $this->path = $pValue; + + if ($this->width == 0 && $this->height == 0) { + // Get width/height + list($this->width, $this->height) = getimagesize($pValue); + } + } else { + throw new PHPExcel_Exception("File $pValue not found!"); + } + } else { + $this->path = $pValue; + } + return $this; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + return md5( + $this->path . + $this->name . + $this->offsetX . + $this->offsetY . + $this->width . + $this->height . + __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/MemoryDrawing.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/MemoryDrawing.php new file mode 100644 index 0000000..438ed2c --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/MemoryDrawing.php @@ -0,0 +1,201 @@ +<?php + +/** + * PHPExcel_Worksheet_MemoryDrawing + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Worksheet_MemoryDrawing extends PHPExcel_Worksheet_BaseDrawing implements PHPExcel_IComparable +{ + /* Rendering functions */ + const RENDERING_DEFAULT = 'imagepng'; + const RENDERING_PNG = 'imagepng'; + const RENDERING_GIF = 'imagegif'; + const RENDERING_JPEG = 'imagejpeg'; + + /* MIME types */ + const MIMETYPE_DEFAULT = 'image/png'; + const MIMETYPE_PNG = 'image/png'; + const MIMETYPE_GIF = 'image/gif'; + const MIMETYPE_JPEG = 'image/jpeg'; + + /** + * Image resource + * + * @var resource + */ + private $imageResource; + + /** + * Rendering function + * + * @var string + */ + private $renderingFunction; + + /** + * Mime type + * + * @var string + */ + private $mimeType; + + /** + * Unique name + * + * @var string + */ + private $uniqueName; + + /** + * Create a new PHPExcel_Worksheet_MemoryDrawing + */ + public function __construct() + { + // Initialise values + $this->imageResource = null; + $this->renderingFunction = self::RENDERING_DEFAULT; + $this->mimeType = self::MIMETYPE_DEFAULT; + $this->uniqueName = md5(rand(0, 9999). time() . rand(0, 9999)); + + // Initialize parent + parent::__construct(); + } + + /** + * Get image resource + * + * @return resource + */ + public function getImageResource() + { + return $this->imageResource; + } + + /** + * Set image resource + * + * @param $value resource + * @return PHPExcel_Worksheet_MemoryDrawing + */ + public function setImageResource($value = null) + { + $this->imageResource = $value; + + if (!is_null($this->imageResource)) { + // Get width/height + $this->width = imagesx($this->imageResource); + $this->height = imagesy($this->imageResource); + } + return $this; + } + + /** + * Get rendering function + * + * @return string + */ + public function getRenderingFunction() + { + return $this->renderingFunction; + } + + /** + * Set rendering function + * + * @param string $value + * @return PHPExcel_Worksheet_MemoryDrawing + */ + public function setRenderingFunction($value = PHPExcel_Worksheet_MemoryDrawing::RENDERING_DEFAULT) + { + $this->renderingFunction = $value; + return $this; + } + + /** + * Get mime type + * + * @return string + */ + public function getMimeType() + { + return $this->mimeType; + } + + /** + * Set mime type + * + * @param string $value + * @return PHPExcel_Worksheet_MemoryDrawing + */ + public function setMimeType($value = PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_DEFAULT) + { + $this->mimeType = $value; + return $this; + } + + /** + * Get indexed filename (using image index) + * + * @return string + */ + public function getIndexedFilename() + { + $extension = strtolower($this->getMimeType()); + $extension = explode('/', $extension); + $extension = $extension[1]; + + return $this->uniqueName . $this->getImageIndex() . '.' . $extension; + } + + /** + * Get hash code + * + * @return string Hash code + */ + public function getHashCode() + { + return md5( + $this->renderingFunction . + $this->mimeType . + $this->uniqueName . + parent::getHashCode() . + __CLASS__ + ); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/PageMargins.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/PageMargins.php new file mode 100644 index 0000000..70f5ee0 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/PageMargins.php @@ -0,0 +1,233 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ + + +/** + * PHPExcel_Worksheet_PageMargins + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Worksheet_PageMargins +{ + /** + * Left + * + * @var double + */ + private $left = 0.7; + + /** + * Right + * + * @var double + */ + private $right = 0.7; + + /** + * Top + * + * @var double + */ + private $top = 0.75; + + /** + * Bottom + * + * @var double + */ + private $bottom = 0.75; + + /** + * Header + * + * @var double + */ + private $header = 0.3; + + /** + * Footer + * + * @var double + */ + private $footer = 0.3; + + /** + * Create a new PHPExcel_Worksheet_PageMargins + */ + public function __construct() + { + } + + /** + * Get Left + * + * @return double + */ + public function getLeft() + { + return $this->left; + } + + /** + * Set Left + * + * @param double $pValue + * @return PHPExcel_Worksheet_PageMargins + */ + public function setLeft($pValue) + { + $this->left = $pValue; + return $this; + } + + /** + * Get Right + * + * @return double + */ + public function getRight() + { + return $this->right; + } + + /** + * Set Right + * + * @param double $pValue + * @return PHPExcel_Worksheet_PageMargins + */ + public function setRight($pValue) + { + $this->right = $pValue; + return $this; + } + + /** + * Get Top + * + * @return double + */ + public function getTop() + { + return $this->top; + } + + /** + * Set Top + * + * @param double $pValue + * @return PHPExcel_Worksheet_PageMargins + */ + public function setTop($pValue) + { + $this->top = $pValue; + return $this; + } + + /** + * Get Bottom + * + * @return double + */ + public function getBottom() + { + return $this->bottom; + } + + /** + * Set Bottom + * + * @param double $pValue + * @return PHPExcel_Worksheet_PageMargins + */ + public function setBottom($pValue) + { + $this->bottom = $pValue; + return $this; + } + + /** + * Get Header + * + * @return double + */ + public function getHeader() + { + return $this->header; + } + + /** + * Set Header + * + * @param double $pValue + * @return PHPExcel_Worksheet_PageMargins + */ + public function setHeader($pValue) + { + $this->header = $pValue; + return $this; + } + + /** + * Get Footer + * + * @return double + */ + public function getFooter() + { + return $this->footer; + } + + /** + * Set Footer + * + * @param double $pValue + * @return PHPExcel_Worksheet_PageMargins + */ + public function setFooter($pValue) + { + $this->footer = $pValue; + return $this; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/PageSetup.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/PageSetup.php new file mode 100644 index 0000000..c67053e --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/PageSetup.php @@ -0,0 +1,839 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ + + +/** + * PHPExcel_Worksheet_PageSetup + * + * <code> + * Paper size taken from Office Open XML Part 4 - Markup Language Reference, page 1988: + * + * 1 = Letter paper (8.5 in. by 11 in.) + * 2 = Letter small paper (8.5 in. by 11 in.) + * 3 = Tabloid paper (11 in. by 17 in.) + * 4 = Ledger paper (17 in. by 11 in.) + * 5 = Legal paper (8.5 in. by 14 in.) + * 6 = Statement paper (5.5 in. by 8.5 in.) + * 7 = Executive paper (7.25 in. by 10.5 in.) + * 8 = A3 paper (297 mm by 420 mm) + * 9 = A4 paper (210 mm by 297 mm) + * 10 = A4 small paper (210 mm by 297 mm) + * 11 = A5 paper (148 mm by 210 mm) + * 12 = B4 paper (250 mm by 353 mm) + * 13 = B5 paper (176 mm by 250 mm) + * 14 = Folio paper (8.5 in. by 13 in.) + * 15 = Quarto paper (215 mm by 275 mm) + * 16 = Standard paper (10 in. by 14 in.) + * 17 = Standard paper (11 in. by 17 in.) + * 18 = Note paper (8.5 in. by 11 in.) + * 19 = #9 envelope (3.875 in. by 8.875 in.) + * 20 = #10 envelope (4.125 in. by 9.5 in.) + * 21 = #11 envelope (4.5 in. by 10.375 in.) + * 22 = #12 envelope (4.75 in. by 11 in.) + * 23 = #14 envelope (5 in. by 11.5 in.) + * 24 = C paper (17 in. by 22 in.) + * 25 = D paper (22 in. by 34 in.) + * 26 = E paper (34 in. by 44 in.) + * 27 = DL envelope (110 mm by 220 mm) + * 28 = C5 envelope (162 mm by 229 mm) + * 29 = C3 envelope (324 mm by 458 mm) + * 30 = C4 envelope (229 mm by 324 mm) + * 31 = C6 envelope (114 mm by 162 mm) + * 32 = C65 envelope (114 mm by 229 mm) + * 33 = B4 envelope (250 mm by 353 mm) + * 34 = B5 envelope (176 mm by 250 mm) + * 35 = B6 envelope (176 mm by 125 mm) + * 36 = Italy envelope (110 mm by 230 mm) + * 37 = Monarch envelope (3.875 in. by 7.5 in.). + * 38 = 6 3/4 envelope (3.625 in. by 6.5 in.) + * 39 = US standard fanfold (14.875 in. by 11 in.) + * 40 = German standard fanfold (8.5 in. by 12 in.) + * 41 = German legal fanfold (8.5 in. by 13 in.) + * 42 = ISO B4 (250 mm by 353 mm) + * 43 = Japanese double postcard (200 mm by 148 mm) + * 44 = Standard paper (9 in. by 11 in.) + * 45 = Standard paper (10 in. by 11 in.) + * 46 = Standard paper (15 in. by 11 in.) + * 47 = Invite envelope (220 mm by 220 mm) + * 50 = Letter extra paper (9.275 in. by 12 in.) + * 51 = Legal extra paper (9.275 in. by 15 in.) + * 52 = Tabloid extra paper (11.69 in. by 18 in.) + * 53 = A4 extra paper (236 mm by 322 mm) + * 54 = Letter transverse paper (8.275 in. by 11 in.) + * 55 = A4 transverse paper (210 mm by 297 mm) + * 56 = Letter extra transverse paper (9.275 in. by 12 in.) + * 57 = SuperA/SuperA/A4 paper (227 mm by 356 mm) + * 58 = SuperB/SuperB/A3 paper (305 mm by 487 mm) + * 59 = Letter plus paper (8.5 in. by 12.69 in.) + * 60 = A4 plus paper (210 mm by 330 mm) + * 61 = A5 transverse paper (148 mm by 210 mm) + * 62 = JIS B5 transverse paper (182 mm by 257 mm) + * 63 = A3 extra paper (322 mm by 445 mm) + * 64 = A5 extra paper (174 mm by 235 mm) + * 65 = ISO B5 extra paper (201 mm by 276 mm) + * 66 = A2 paper (420 mm by 594 mm) + * 67 = A3 transverse paper (297 mm by 420 mm) + * 68 = A3 extra transverse paper (322 mm by 445 mm) + * </code> + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Worksheet_PageSetup +{ + /* Paper size */ + const PAPERSIZE_LETTER = 1; + const PAPERSIZE_LETTER_SMALL = 2; + const PAPERSIZE_TABLOID = 3; + const PAPERSIZE_LEDGER = 4; + const PAPERSIZE_LEGAL = 5; + const PAPERSIZE_STATEMENT = 6; + const PAPERSIZE_EXECUTIVE = 7; + const PAPERSIZE_A3 = 8; + const PAPERSIZE_A4 = 9; + const PAPERSIZE_A4_SMALL = 10; + const PAPERSIZE_A5 = 11; + const PAPERSIZE_B4 = 12; + const PAPERSIZE_B5 = 13; + const PAPERSIZE_FOLIO = 14; + const PAPERSIZE_QUARTO = 15; + const PAPERSIZE_STANDARD_1 = 16; + const PAPERSIZE_STANDARD_2 = 17; + const PAPERSIZE_NOTE = 18; + const PAPERSIZE_NO9_ENVELOPE = 19; + const PAPERSIZE_NO10_ENVELOPE = 20; + const PAPERSIZE_NO11_ENVELOPE = 21; + const PAPERSIZE_NO12_ENVELOPE = 22; + const PAPERSIZE_NO14_ENVELOPE = 23; + const PAPERSIZE_C = 24; + const PAPERSIZE_D = 25; + const PAPERSIZE_E = 26; + const PAPERSIZE_DL_ENVELOPE = 27; + const PAPERSIZE_C5_ENVELOPE = 28; + const PAPERSIZE_C3_ENVELOPE = 29; + const PAPERSIZE_C4_ENVELOPE = 30; + const PAPERSIZE_C6_ENVELOPE = 31; + const PAPERSIZE_C65_ENVELOPE = 32; + const PAPERSIZE_B4_ENVELOPE = 33; + const PAPERSIZE_B5_ENVELOPE = 34; + const PAPERSIZE_B6_ENVELOPE = 35; + const PAPERSIZE_ITALY_ENVELOPE = 36; + const PAPERSIZE_MONARCH_ENVELOPE = 37; + const PAPERSIZE_6_3_4_ENVELOPE = 38; + const PAPERSIZE_US_STANDARD_FANFOLD = 39; + const PAPERSIZE_GERMAN_STANDARD_FANFOLD = 40; + const PAPERSIZE_GERMAN_LEGAL_FANFOLD = 41; + const PAPERSIZE_ISO_B4 = 42; + const PAPERSIZE_JAPANESE_DOUBLE_POSTCARD = 43; + const PAPERSIZE_STANDARD_PAPER_1 = 44; + const PAPERSIZE_STANDARD_PAPER_2 = 45; + const PAPERSIZE_STANDARD_PAPER_3 = 46; + const PAPERSIZE_INVITE_ENVELOPE = 47; + const PAPERSIZE_LETTER_EXTRA_PAPER = 48; + const PAPERSIZE_LEGAL_EXTRA_PAPER = 49; + const PAPERSIZE_TABLOID_EXTRA_PAPER = 50; + const PAPERSIZE_A4_EXTRA_PAPER = 51; + const PAPERSIZE_LETTER_TRANSVERSE_PAPER = 52; + const PAPERSIZE_A4_TRANSVERSE_PAPER = 53; + const PAPERSIZE_LETTER_EXTRA_TRANSVERSE_PAPER = 54; + const PAPERSIZE_SUPERA_SUPERA_A4_PAPER = 55; + const PAPERSIZE_SUPERB_SUPERB_A3_PAPER = 56; + const PAPERSIZE_LETTER_PLUS_PAPER = 57; + const PAPERSIZE_A4_PLUS_PAPER = 58; + const PAPERSIZE_A5_TRANSVERSE_PAPER = 59; + const PAPERSIZE_JIS_B5_TRANSVERSE_PAPER = 60; + const PAPERSIZE_A3_EXTRA_PAPER = 61; + const PAPERSIZE_A5_EXTRA_PAPER = 62; + const PAPERSIZE_ISO_B5_EXTRA_PAPER = 63; + const PAPERSIZE_A2_PAPER = 64; + const PAPERSIZE_A3_TRANSVERSE_PAPER = 65; + const PAPERSIZE_A3_EXTRA_TRANSVERSE_PAPER = 66; + + /* Page orientation */ + const ORIENTATION_DEFAULT = 'default'; + const ORIENTATION_LANDSCAPE = 'landscape'; + const ORIENTATION_PORTRAIT = 'portrait'; + + /* Print Range Set Method */ + const SETPRINTRANGE_OVERWRITE = 'O'; + const SETPRINTRANGE_INSERT = 'I'; + + + /** + * Paper size + * + * @var int + */ + private $paperSize = PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER; + + /** + * Orientation + * + * @var string + */ + private $orientation = PHPExcel_Worksheet_PageSetup::ORIENTATION_DEFAULT; + + /** + * Scale (Print Scale) + * + * Print scaling. Valid values range from 10 to 400 + * This setting is overridden when fitToWidth and/or fitToHeight are in use + * + * @var int? + */ + private $scale = 100; + + /** + * Fit To Page + * Whether scale or fitToWith / fitToHeight applies + * + * @var boolean + */ + private $fitToPage = false; + + /** + * Fit To Height + * Number of vertical pages to fit on + * + * @var int? + */ + private $fitToHeight = 1; + + /** + * Fit To Width + * Number of horizontal pages to fit on + * + * @var int? + */ + private $fitToWidth = 1; + + /** + * Columns to repeat at left + * + * @var array Containing start column and end column, empty array if option unset + */ + private $columnsToRepeatAtLeft = array('', ''); + + /** + * Rows to repeat at top + * + * @var array Containing start row number and end row number, empty array if option unset + */ + private $rowsToRepeatAtTop = array(0, 0); + + /** + * Center page horizontally + * + * @var boolean + */ + private $horizontalCentered = false; + + /** + * Center page vertically + * + * @var boolean + */ + private $verticalCentered = false; + + /** + * Print area + * + * @var string + */ + private $printArea = null; + + /** + * First page number + * + * @var int + */ + private $firstPageNumber = null; + + /** + * Create a new PHPExcel_Worksheet_PageSetup + */ + public function __construct() + { + } + + /** + * Get Paper Size + * + * @return int + */ + public function getPaperSize() + { + return $this->paperSize; + } + + /** + * Set Paper Size + * + * @param int $pValue + * @return PHPExcel_Worksheet_PageSetup + */ + public function setPaperSize($pValue = PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER) + { + $this->paperSize = $pValue; + return $this; + } + + /** + * Get Orientation + * + * @return string + */ + public function getOrientation() + { + return $this->orientation; + } + + /** + * Set Orientation + * + * @param string $pValue + * @return PHPExcel_Worksheet_PageSetup + */ + public function setOrientation($pValue = PHPExcel_Worksheet_PageSetup::ORIENTATION_DEFAULT) + { + $this->orientation = $pValue; + return $this; + } + + /** + * Get Scale + * + * @return int? + */ + public function getScale() + { + return $this->scale; + } + + /** + * Set Scale + * + * Print scaling. Valid values range from 10 to 400 + * This setting is overridden when fitToWidth and/or fitToHeight are in use + * + * @param int? $pValue + * @param boolean $pUpdate Update fitToPage so scaling applies rather than fitToHeight / fitToWidth + * @return PHPExcel_Worksheet_PageSetup + * @throws PHPExcel_Exception + */ + public function setScale($pValue = 100, $pUpdate = true) + { + // Microsoft Office Excel 2007 only allows setting a scale between 10 and 400 via the user interface, + // but it is apparently still able to handle any scale >= 0, where 0 results in 100 + if (($pValue >= 0) || is_null($pValue)) { + $this->scale = $pValue; + if ($pUpdate) { + $this->fitToPage = false; + } + } else { + throw new PHPExcel_Exception("Scale must not be negative"); + } + return $this; + } + + /** + * Get Fit To Page + * + * @return boolean + */ + public function getFitToPage() + { + return $this->fitToPage; + } + + /** + * Set Fit To Page + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_PageSetup + */ + public function setFitToPage($pValue = true) + { + $this->fitToPage = $pValue; + return $this; + } + + /** + * Get Fit To Height + * + * @return int? + */ + public function getFitToHeight() + { + return $this->fitToHeight; + } + + /** + * Set Fit To Height + * + * @param int? $pValue + * @param boolean $pUpdate Update fitToPage so it applies rather than scaling + * @return PHPExcel_Worksheet_PageSetup + */ + public function setFitToHeight($pValue = 1, $pUpdate = true) + { + $this->fitToHeight = $pValue; + if ($pUpdate) { + $this->fitToPage = true; + } + return $this; + } + + /** + * Get Fit To Width + * + * @return int? + */ + public function getFitToWidth() + { + return $this->fitToWidth; + } + + /** + * Set Fit To Width + * + * @param int? $pValue + * @param boolean $pUpdate Update fitToPage so it applies rather than scaling + * @return PHPExcel_Worksheet_PageSetup + */ + public function setFitToWidth($pValue = 1, $pUpdate = true) + { + $this->fitToWidth = $pValue; + if ($pUpdate) { + $this->fitToPage = true; + } + return $this; + } + + /** + * Is Columns to repeat at left set? + * + * @return boolean + */ + public function isColumnsToRepeatAtLeftSet() + { + if (is_array($this->columnsToRepeatAtLeft)) { + if ($this->columnsToRepeatAtLeft[0] != '' && $this->columnsToRepeatAtLeft[1] != '') { + return true; + } + } + + return false; + } + + /** + * Get Columns to repeat at left + * + * @return array Containing start column and end column, empty array if option unset + */ + public function getColumnsToRepeatAtLeft() + { + return $this->columnsToRepeatAtLeft; + } + + /** + * Set Columns to repeat at left + * + * @param array $pValue Containing start column and end column, empty array if option unset + * @return PHPExcel_Worksheet_PageSetup + */ + public function setColumnsToRepeatAtLeft($pValue = null) + { + if (is_array($pValue)) { + $this->columnsToRepeatAtLeft = $pValue; + } + return $this; + } + + /** + * Set Columns to repeat at left by start and end + * + * @param string $pStart + * @param string $pEnd + * @return PHPExcel_Worksheet_PageSetup + */ + public function setColumnsToRepeatAtLeftByStartAndEnd($pStart = 'A', $pEnd = 'A') + { + $this->columnsToRepeatAtLeft = array($pStart, $pEnd); + return $this; + } + + /** + * Is Rows to repeat at top set? + * + * @return boolean + */ + public function isRowsToRepeatAtTopSet() + { + if (is_array($this->rowsToRepeatAtTop)) { + if ($this->rowsToRepeatAtTop[0] != 0 && $this->rowsToRepeatAtTop[1] != 0) { + return true; + } + } + + return false; + } + + /** + * Get Rows to repeat at top + * + * @return array Containing start column and end column, empty array if option unset + */ + public function getRowsToRepeatAtTop() + { + return $this->rowsToRepeatAtTop; + } + + /** + * Set Rows to repeat at top + * + * @param array $pValue Containing start column and end column, empty array if option unset + * @return PHPExcel_Worksheet_PageSetup + */ + public function setRowsToRepeatAtTop($pValue = null) + { + if (is_array($pValue)) { + $this->rowsToRepeatAtTop = $pValue; + } + return $this; + } + + /** + * Set Rows to repeat at top by start and end + * + * @param int $pStart + * @param int $pEnd + * @return PHPExcel_Worksheet_PageSetup + */ + public function setRowsToRepeatAtTopByStartAndEnd($pStart = 1, $pEnd = 1) + { + $this->rowsToRepeatAtTop = array($pStart, $pEnd); + return $this; + } + + /** + * Get center page horizontally + * + * @return bool + */ + public function getHorizontalCentered() + { + return $this->horizontalCentered; + } + + /** + * Set center page horizontally + * + * @param bool $value + * @return PHPExcel_Worksheet_PageSetup + */ + public function setHorizontalCentered($value = false) + { + $this->horizontalCentered = $value; + return $this; + } + + /** + * Get center page vertically + * + * @return bool + */ + public function getVerticalCentered() + { + return $this->verticalCentered; + } + + /** + * Set center page vertically + * + * @param bool $value + * @return PHPExcel_Worksheet_PageSetup + */ + public function setVerticalCentered($value = false) + { + $this->verticalCentered = $value; + return $this; + } + + /** + * Get print area + * + * @param int $index Identifier for a specific print area range if several ranges have been set + * Default behaviour, or a index value of 0, will return all ranges as a comma-separated string + * Otherwise, the specific range identified by the value of $index will be returned + * Print areas are numbered from 1 + * @throws PHPExcel_Exception + * @return string + */ + public function getPrintArea($index = 0) + { + if ($index == 0) { + return $this->printArea; + } + $printAreas = explode(',', $this->printArea); + if (isset($printAreas[$index-1])) { + return $printAreas[$index-1]; + } + throw new PHPExcel_Exception("Requested Print Area does not exist"); + } + + /** + * Is print area set? + * + * @param int $index Identifier for a specific print area range if several ranges have been set + * Default behaviour, or an index value of 0, will identify whether any print range is set + * Otherwise, existence of the range identified by the value of $index will be returned + * Print areas are numbered from 1 + * @return boolean + */ + public function isPrintAreaSet($index = 0) + { + if ($index == 0) { + return !is_null($this->printArea); + } + $printAreas = explode(',', $this->printArea); + return isset($printAreas[$index-1]); + } + + /** + * Clear a print area + * + * @param int $index Identifier for a specific print area range if several ranges have been set + * Default behaviour, or an index value of 0, will clear all print ranges that are set + * Otherwise, the range identified by the value of $index will be removed from the series + * Print areas are numbered from 1 + * @return PHPExcel_Worksheet_PageSetup + */ + public function clearPrintArea($index = 0) + { + if ($index == 0) { + $this->printArea = null; + } else { + $printAreas = explode(',', $this->printArea); + if (isset($printAreas[$index-1])) { + unset($printAreas[$index-1]); + $this->printArea = implode(',', $printAreas); + } + } + + return $this; + } + + /** + * Set print area. e.g. 'A1:D10' or 'A1:D10,G5:M20' + * + * @param string $value + * @param int $index Identifier for a specific print area range allowing several ranges to be set + * When the method is "O"verwrite, then a positive integer index will overwrite that indexed + * entry in the print areas list; a negative index value will identify which entry to + * overwrite working bacward through the print area to the list, with the last entry as -1. + * Specifying an index value of 0, will overwrite <b>all</b> existing print ranges. + * When the method is "I"nsert, then a positive index will insert after that indexed entry in + * the print areas list, while a negative index will insert before the indexed entry. + * Specifying an index value of 0, will always append the new print range at the end of the + * list. + * Print areas are numbered from 1 + * @param string $method Determines the method used when setting multiple print areas + * Default behaviour, or the "O" method, overwrites existing print area + * The "I" method, inserts the new print area before any specified index, or at the end of the list + * @return PHPExcel_Worksheet_PageSetup + * @throws PHPExcel_Exception + */ + public function setPrintArea($value, $index = 0, $method = self::SETPRINTRANGE_OVERWRITE) + { + if (strpos($value, '!') !== false) { + throw new PHPExcel_Exception('Cell coordinate must not specify a worksheet.'); + } elseif (strpos($value, ':') === false) { + throw new PHPExcel_Exception('Cell coordinate must be a range of cells.'); + } elseif (strpos($value, '$') !== false) { + throw new PHPExcel_Exception('Cell coordinate must not be absolute.'); + } + $value = strtoupper($value); + + if ($method == self::SETPRINTRANGE_OVERWRITE) { + if ($index == 0) { + $this->printArea = $value; + } else { + $printAreas = explode(',', $this->printArea); + if ($index < 0) { + $index = count($printAreas) - abs($index) + 1; + } + if (($index <= 0) || ($index > count($printAreas))) { + throw new PHPExcel_Exception('Invalid index for setting print range.'); + } + $printAreas[$index-1] = $value; + $this->printArea = implode(',', $printAreas); + } + } elseif ($method == self::SETPRINTRANGE_INSERT) { + if ($index == 0) { + $this->printArea .= ($this->printArea == '') ? $value : ','.$value; + } else { + $printAreas = explode(',', $this->printArea); + if ($index < 0) { + $index = abs($index) - 1; + } + if ($index > count($printAreas)) { + throw new PHPExcel_Exception('Invalid index for setting print range.'); + } + $printAreas = array_merge(array_slice($printAreas, 0, $index), array($value), array_slice($printAreas, $index)); + $this->printArea = implode(',', $printAreas); + } + } else { + throw new PHPExcel_Exception('Invalid method for setting print range.'); + } + + return $this; + } + + /** + * Add a new print area (e.g. 'A1:D10' or 'A1:D10,G5:M20') to the list of print areas + * + * @param string $value + * @param int $index Identifier for a specific print area range allowing several ranges to be set + * A positive index will insert after that indexed entry in the print areas list, while a + * negative index will insert before the indexed entry. + * Specifying an index value of 0, will always append the new print range at the end of the + * list. + * Print areas are numbered from 1 + * @return PHPExcel_Worksheet_PageSetup + * @throws PHPExcel_Exception + */ + public function addPrintArea($value, $index = -1) + { + return $this->setPrintArea($value, $index, self::SETPRINTRANGE_INSERT); + } + + /** + * Set print area + * + * @param int $column1 Column 1 + * @param int $row1 Row 1 + * @param int $column2 Column 2 + * @param int $row2 Row 2 + * @param int $index Identifier for a specific print area range allowing several ranges to be set + * When the method is "O"verwrite, then a positive integer index will overwrite that indexed + * entry in the print areas list; a negative index value will identify which entry to + * overwrite working bacward through the print area to the list, with the last entry as -1. + * Specifying an index value of 0, will overwrite <b>all</b> existing print ranges. + * When the method is "I"nsert, then a positive index will insert after that indexed entry in + * the print areas list, while a negative index will insert before the indexed entry. + * Specifying an index value of 0, will always append the new print range at the end of the + * list. + * Print areas are numbered from 1 + * @param string $method Determines the method used when setting multiple print areas + * Default behaviour, or the "O" method, overwrites existing print area + * The "I" method, inserts the new print area before any specified index, or at the end of the list + * @return PHPExcel_Worksheet_PageSetup + * @throws PHPExcel_Exception + */ + public function setPrintAreaByColumnAndRow($column1, $row1, $column2, $row2, $index = 0, $method = self::SETPRINTRANGE_OVERWRITE) + { + return $this->setPrintArea( + PHPExcel_Cell::stringFromColumnIndex($column1) . $row1 . ':' . PHPExcel_Cell::stringFromColumnIndex($column2) . $row2, + $index, + $method + ); + } + + /** + * Add a new print area to the list of print areas + * + * @param int $column1 Start Column for the print area + * @param int $row1 Start Row for the print area + * @param int $column2 End Column for the print area + * @param int $row2 End Row for the print area + * @param int $index Identifier for a specific print area range allowing several ranges to be set + * A positive index will insert after that indexed entry in the print areas list, while a + * negative index will insert before the indexed entry. + * Specifying an index value of 0, will always append the new print range at the end of the + * list. + * Print areas are numbered from 1 + * @return PHPExcel_Worksheet_PageSetup + * @throws PHPExcel_Exception + */ + public function addPrintAreaByColumnAndRow($column1, $row1, $column2, $row2, $index = -1) + { + return $this->setPrintArea( + PHPExcel_Cell::stringFromColumnIndex($column1) . $row1 . ':' . PHPExcel_Cell::stringFromColumnIndex($column2) . $row2, + $index, + self::SETPRINTRANGE_INSERT + ); + } + + /** + * Get first page number + * + * @return int + */ + public function getFirstPageNumber() + { + return $this->firstPageNumber; + } + + /** + * Set first page number + * + * @param int $value + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function setFirstPageNumber($value = null) + { + $this->firstPageNumber = $value; + return $this; + } + + /** + * Reset first page number + * + * @return PHPExcel_Worksheet_HeaderFooter + */ + public function resetFirstPageNumber() + { + return $this->setFirstPageNumber(null); + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/Protection.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/Protection.php new file mode 100644 index 0000000..00633ee --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/Protection.php @@ -0,0 +1,581 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ + + +/** + * PHPExcel_Worksheet_Protection + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Worksheet_Protection +{ + /** + * Sheet + * + * @var boolean + */ + private $sheet = false; + + /** + * Objects + * + * @var boolean + */ + private $objects = false; + + /** + * Scenarios + * + * @var boolean + */ + private $scenarios = false; + + /** + * Format cells + * + * @var boolean + */ + private $formatCells = false; + + /** + * Format columns + * + * @var boolean + */ + private $formatColumns = false; + + /** + * Format rows + * + * @var boolean + */ + private $formatRows = false; + + /** + * Insert columns + * + * @var boolean + */ + private $insertColumns = false; + + /** + * Insert rows + * + * @var boolean + */ + private $insertRows = false; + + /** + * Insert hyperlinks + * + * @var boolean + */ + private $insertHyperlinks = false; + + /** + * Delete columns + * + * @var boolean + */ + private $deleteColumns = false; + + /** + * Delete rows + * + * @var boolean + */ + private $deleteRows = false; + + /** + * Select locked cells + * + * @var boolean + */ + private $selectLockedCells = false; + + /** + * Sort + * + * @var boolean + */ + private $sort = false; + + /** + * AutoFilter + * + * @var boolean + */ + private $autoFilter = false; + + /** + * Pivot tables + * + * @var boolean + */ + private $pivotTables = false; + + /** + * Select unlocked cells + * + * @var boolean + */ + private $selectUnlockedCells = false; + + /** + * Password + * + * @var string + */ + private $password = ''; + + /** + * Create a new PHPExcel_Worksheet_Protection + */ + public function __construct() + { + } + + /** + * Is some sort of protection enabled? + * + * @return boolean + */ + public function isProtectionEnabled() + { + return $this->sheet || + $this->objects || + $this->scenarios || + $this->formatCells || + $this->formatColumns || + $this->formatRows || + $this->insertColumns || + $this->insertRows || + $this->insertHyperlinks || + $this->deleteColumns || + $this->deleteRows || + $this->selectLockedCells || + $this->sort || + $this->autoFilter || + $this->pivotTables || + $this->selectUnlockedCells; + } + + /** + * Get Sheet + * + * @return boolean + */ + public function getSheet() + { + return $this->sheet; + } + + /** + * Set Sheet + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + public function setSheet($pValue = false) + { + $this->sheet = $pValue; + return $this; + } + + /** + * Get Objects + * + * @return boolean + */ + public function getObjects() + { + return $this->objects; + } + + /** + * Set Objects + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + public function setObjects($pValue = false) + { + $this->objects = $pValue; + return $this; + } + + /** + * Get Scenarios + * + * @return boolean + */ + public function getScenarios() + { + return $this->scenarios; + } + + /** + * Set Scenarios + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + public function setScenarios($pValue = false) + { + $this->scenarios = $pValue; + return $this; + } + + /** + * Get FormatCells + * + * @return boolean + */ + public function getFormatCells() + { + return $this->formatCells; + } + + /** + * Set FormatCells + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + public function setFormatCells($pValue = false) + { + $this->formatCells = $pValue; + return $this; + } + + /** + * Get FormatColumns + * + * @return boolean + */ + public function getFormatColumns() + { + return $this->formatColumns; + } + + /** + * Set FormatColumns + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + public function setFormatColumns($pValue = false) + { + $this->formatColumns = $pValue; + return $this; + } + + /** + * Get FormatRows + * + * @return boolean + */ + public function getFormatRows() + { + return $this->formatRows; + } + + /** + * Set FormatRows + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + public function setFormatRows($pValue = false) + { + $this->formatRows = $pValue; + return $this; + } + + /** + * Get InsertColumns + * + * @return boolean + */ + public function getInsertColumns() + { + return $this->insertColumns; + } + + /** + * Set InsertColumns + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + public function setInsertColumns($pValue = false) + { + $this->insertColumns = $pValue; + return $this; + } + + /** + * Get InsertRows + * + * @return boolean + */ + public function getInsertRows() + { + return $this->insertRows; + } + + /** + * Set InsertRows + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + public function setInsertRows($pValue = false) + { + $this->insertRows = $pValue; + return $this; + } + + /** + * Get InsertHyperlinks + * + * @return boolean + */ + public function getInsertHyperlinks() + { + return $this->insertHyperlinks; + } + + /** + * Set InsertHyperlinks + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + public function setInsertHyperlinks($pValue = false) + { + $this->insertHyperlinks = $pValue; + return $this; + } + + /** + * Get DeleteColumns + * + * @return boolean + */ + public function getDeleteColumns() + { + return $this->deleteColumns; + } + + /** + * Set DeleteColumns + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + public function setDeleteColumns($pValue = false) + { + $this->deleteColumns = $pValue; + return $this; + } + + /** + * Get DeleteRows + * + * @return boolean + */ + public function getDeleteRows() + { + return $this->deleteRows; + } + + /** + * Set DeleteRows + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + public function setDeleteRows($pValue = false) + { + $this->deleteRows = $pValue; + return $this; + } + + /** + * Get SelectLockedCells + * + * @return boolean + */ + public function getSelectLockedCells() + { + return $this->selectLockedCells; + } + + /** + * Set SelectLockedCells + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + public function setSelectLockedCells($pValue = false) + { + $this->selectLockedCells = $pValue; + return $this; + } + + /** + * Get Sort + * + * @return boolean + */ + public function getSort() + { + return $this->sort; + } + + /** + * Set Sort + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + public function setSort($pValue = false) + { + $this->sort = $pValue; + return $this; + } + + /** + * Get AutoFilter + * + * @return boolean + */ + public function getAutoFilter() + { + return $this->autoFilter; + } + + /** + * Set AutoFilter + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + public function setAutoFilter($pValue = false) + { + $this->autoFilter = $pValue; + return $this; + } + + /** + * Get PivotTables + * + * @return boolean + */ + public function getPivotTables() + { + return $this->pivotTables; + } + + /** + * Set PivotTables + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + public function setPivotTables($pValue = false) + { + $this->pivotTables = $pValue; + return $this; + } + + /** + * Get SelectUnlockedCells + * + * @return boolean + */ + public function getSelectUnlockedCells() + { + return $this->selectUnlockedCells; + } + + /** + * Set SelectUnlockedCells + * + * @param boolean $pValue + * @return PHPExcel_Worksheet_Protection + */ + public function setSelectUnlockedCells($pValue = false) + { + $this->selectUnlockedCells = $pValue; + return $this; + } + + /** + * Get Password (hashed) + * + * @return string + */ + public function getPassword() + { + return $this->password; + } + + /** + * Set Password + * + * @param string $pValue + * @param boolean $pAlreadyHashed If the password has already been hashed, set this to true + * @return PHPExcel_Worksheet_Protection + */ + public function setPassword($pValue = '', $pAlreadyHashed = false) + { + if (!$pAlreadyHashed) { + $pValue = PHPExcel_Shared_PasswordHasher::hashPassword($pValue); + } + $this->password = $pValue; + return $this; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/Row.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/Row.php new file mode 100644 index 0000000..4f6034f --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/Row.php @@ -0,0 +1,86 @@ +<?php + +/** + * PHPExcel_Worksheet_Row + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Worksheet_Row +{ + /** + * PHPExcel_Worksheet + * + * @var PHPExcel_Worksheet + */ + private $parent; + + /** + * Row index + * + * @var int + */ + private $rowIndex = 0; + + /** + * Create a new row + * + * @param PHPExcel_Worksheet $parent + * @param int $rowIndex + */ + public function __construct(PHPExcel_Worksheet $parent = null, $rowIndex = 1) + { + // Set parent and row index + $this->parent = $parent; + $this->rowIndex = $rowIndex; + } + + /** + * Destructor + */ + public function __destruct() + { + unset($this->parent); + } + + /** + * Get row index + * + * @return int + */ + public function getRowIndex() + { + return $this->rowIndex; + } + + /** + * Get cell iterator + * + * @param string $startColumn The column address at which to start iterating + * @param string $endColumn Optionally, the column address at which to stop iterating + * @return PHPExcel_Worksheet_CellIterator + */ + public function getCellIterator($startColumn = 'A', $endColumn = null) + { + return new PHPExcel_Worksheet_RowCellIterator($this->parent, $this->rowIndex, $startColumn, $endColumn); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/RowCellIterator.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/RowCellIterator.php new file mode 100644 index 0000000..90eb9c9 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/RowCellIterator.php @@ -0,0 +1,225 @@ +<?php + +/** + * PHPExcel_Worksheet_RowCellIterator + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Worksheet_RowCellIterator extends PHPExcel_Worksheet_CellIterator implements Iterator +{ + /** + * Row index + * + * @var int + */ + protected $rowIndex; + + /** + * Start position + * + * @var int + */ + protected $startColumn = 0; + + /** + * End position + * + * @var int + */ + protected $endColumn = 0; + + /** + * Create a new column iterator + * + * @param PHPExcel_Worksheet $subject The worksheet to iterate over + * @param integer $rowIndex The row that we want to iterate + * @param string $startColumn The column address at which to start iterating + * @param string $endColumn Optionally, the column address at which to stop iterating + */ + public function __construct(PHPExcel_Worksheet $subject = null, $rowIndex = 1, $startColumn = 'A', $endColumn = null) + { + // Set subject and row index + $this->subject = $subject; + $this->rowIndex = $rowIndex; + $this->resetEnd($endColumn); + $this->resetStart($startColumn); + } + + /** + * Destructor + */ + public function __destruct() + { + unset($this->subject); + } + + /** + * (Re)Set the start column and the current column pointer + * + * @param integer $startColumn The column address at which to start iterating + * @return PHPExcel_Worksheet_RowCellIterator + * @throws PHPExcel_Exception + */ + public function resetStart($startColumn = 'A') + { + $startColumnIndex = PHPExcel_Cell::columnIndexFromString($startColumn) - 1; + $this->startColumn = $startColumnIndex; + $this->adjustForExistingOnlyRange(); + $this->seek(PHPExcel_Cell::stringFromColumnIndex($this->startColumn)); + + return $this; + } + + /** + * (Re)Set the end column + * + * @param string $endColumn The column address at which to stop iterating + * @return PHPExcel_Worksheet_RowCellIterator + * @throws PHPExcel_Exception + */ + public function resetEnd($endColumn = null) + { + $endColumn = ($endColumn) ? $endColumn : $this->subject->getHighestColumn(); + $this->endColumn = PHPExcel_Cell::columnIndexFromString($endColumn) - 1; + $this->adjustForExistingOnlyRange(); + + return $this; + } + + /** + * Set the column pointer to the selected column + * + * @param string $column The column address to set the current pointer at + * @return PHPExcel_Worksheet_RowCellIterator + * @throws PHPExcel_Exception + */ + public function seek($column = 'A') + { + $column = PHPExcel_Cell::columnIndexFromString($column) - 1; + if (($column < $this->startColumn) || ($column > $this->endColumn)) { + throw new PHPExcel_Exception("Column $column is out of range ({$this->startColumn} - {$this->endColumn})"); + } elseif ($this->onlyExistingCells && !($this->subject->cellExistsByColumnAndRow($column, $this->rowIndex))) { + throw new PHPExcel_Exception('In "IterateOnlyExistingCells" mode and Cell does not exist'); + } + $this->position = $column; + + return $this; + } + + /** + * Rewind the iterator to the starting column + */ + public function rewind() + { + $this->position = $this->startColumn; + } + + /** + * Return the current cell in this worksheet row + * + * @return PHPExcel_Cell + */ + public function current() + { + return $this->subject->getCellByColumnAndRow($this->position, $this->rowIndex); + } + + /** + * Return the current iterator key + * + * @return string + */ + public function key() + { + return PHPExcel_Cell::stringFromColumnIndex($this->position); + } + + /** + * Set the iterator to its next value + */ + public function next() + { + do { + ++$this->position; + } while (($this->onlyExistingCells) && + (!$this->subject->cellExistsByColumnAndRow($this->position, $this->rowIndex)) && + ($this->position <= $this->endColumn)); + } + + /** + * Set the iterator to its previous value + * + * @throws PHPExcel_Exception + */ + public function prev() + { + if ($this->position <= $this->startColumn) { + throw new PHPExcel_Exception( + "Column is already at the beginning of range (" . + PHPExcel_Cell::stringFromColumnIndex($this->endColumn) . " - " . + PHPExcel_Cell::stringFromColumnIndex($this->endColumn) . ")" + ); + } + + do { + --$this->position; + } while (($this->onlyExistingCells) && + (!$this->subject->cellExistsByColumnAndRow($this->position, $this->rowIndex)) && + ($this->position >= $this->startColumn)); + } + + /** + * Indicate if more columns exist in the worksheet range of columns that we're iterating + * + * @return boolean + */ + public function valid() + { + return $this->position <= $this->endColumn; + } + + /** + * Validate start/end values for "IterateOnlyExistingCells" mode, and adjust if necessary + * + * @throws PHPExcel_Exception + */ + protected function adjustForExistingOnlyRange() + { + if ($this->onlyExistingCells) { + while ((!$this->subject->cellExistsByColumnAndRow($this->startColumn, $this->rowIndex)) && + ($this->startColumn <= $this->endColumn)) { + ++$this->startColumn; + } + if ($this->startColumn > $this->endColumn) { + throw new PHPExcel_Exception('No cells exist within the specified range'); + } + while ((!$this->subject->cellExistsByColumnAndRow($this->endColumn, $this->rowIndex)) && + ($this->endColumn >= $this->startColumn)) { + --$this->endColumn; + } + if ($this->endColumn < $this->startColumn) { + throw new PHPExcel_Exception('No cells exist within the specified range'); + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/RowDimension.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/RowDimension.php new file mode 100644 index 0000000..c147486 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/RowDimension.php @@ -0,0 +1,132 @@ +<?php + +/** + * PHPExcel_Worksheet_RowDimension + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Worksheet_RowDimension extends PHPExcel_Worksheet_Dimension +{ + /** + * Row index + * + * @var int + */ + private $rowIndex; + + /** + * Row height (in pt) + * + * When this is set to a negative value, the row height should be ignored by IWriter + * + * @var double + */ + private $height = -1; + + /** + * ZeroHeight for Row? + * + * @var bool + */ + private $zeroHeight = false; + + /** + * Create a new PHPExcel_Worksheet_RowDimension + * + * @param int $pIndex Numeric row index + */ + public function __construct($pIndex = 0) + { + // Initialise values + $this->rowIndex = $pIndex; + + // set dimension as unformatted by default + parent::__construct(null); + } + + /** + * Get Row Index + * + * @return int + */ + public function getRowIndex() + { + return $this->rowIndex; + } + + /** + * Set Row Index + * + * @param int $pValue + * @return PHPExcel_Worksheet_RowDimension + */ + public function setRowIndex($pValue) + { + $this->rowIndex = $pValue; + return $this; + } + + /** + * Get Row Height + * + * @return double + */ + public function getRowHeight() + { + return $this->height; + } + + /** + * Set Row Height + * + * @param double $pValue + * @return PHPExcel_Worksheet_RowDimension + */ + public function setRowHeight($pValue = -1) + { + $this->height = $pValue; + return $this; + } + + /** + * Get ZeroHeight + * + * @return bool + */ + public function getZeroHeight() + { + return $this->zeroHeight; + } + + /** + * Set ZeroHeight + * + * @param bool $pValue + * @return PHPExcel_Worksheet_RowDimension + */ + public function setZeroHeight($pValue = false) + { + $this->zeroHeight = $pValue; + return $this; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/RowIterator.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/RowIterator.php new file mode 100644 index 0000000..9ddb3e0 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/RowIterator.php @@ -0,0 +1,192 @@ +<?php + +/** + * PHPExcel_Worksheet_RowIterator + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Worksheet_RowIterator implements Iterator +{ + /** + * PHPExcel_Worksheet to iterate + * + * @var PHPExcel_Worksheet + */ + private $subject; + + /** + * Current iterator position + * + * @var int + */ + private $position = 1; + + /** + * Start position + * + * @var int + */ + private $startRow = 1; + + + /** + * End position + * + * @var int + */ + private $endRow = 1; + + + /** + * Create a new row iterator + * + * @param PHPExcel_Worksheet $subject The worksheet to iterate over + * @param integer $startRow The row number at which to start iterating + * @param integer $endRow Optionally, the row number at which to stop iterating + */ + public function __construct(PHPExcel_Worksheet $subject, $startRow = 1, $endRow = null) + { + // Set subject + $this->subject = $subject; + $this->resetEnd($endRow); + $this->resetStart($startRow); + } + + /** + * Destructor + */ + public function __destruct() + { + unset($this->subject); + } + + /** + * (Re)Set the start row and the current row pointer + * + * @param integer $startRow The row number at which to start iterating + * @return PHPExcel_Worksheet_RowIterator + * @throws PHPExcel_Exception + */ + public function resetStart($startRow = 1) + { + if ($startRow > $this->subject->getHighestRow()) { + throw new PHPExcel_Exception("Start row ({$startRow}) is beyond highest row ({$this->subject->getHighestRow()})"); + } + + $this->startRow = $startRow; + if ($this->endRow < $this->startRow) { + $this->endRow = $this->startRow; + } + $this->seek($startRow); + + return $this; + } + + /** + * (Re)Set the end row + * + * @param integer $endRow The row number at which to stop iterating + * @return PHPExcel_Worksheet_RowIterator + */ + public function resetEnd($endRow = null) + { + $this->endRow = ($endRow) ? $endRow : $this->subject->getHighestRow(); + + return $this; + } + + /** + * Set the row pointer to the selected row + * + * @param integer $row The row number to set the current pointer at + * @return PHPExcel_Worksheet_RowIterator + * @throws PHPExcel_Exception + */ + public function seek($row = 1) + { + if (($row < $this->startRow) || ($row > $this->endRow)) { + throw new PHPExcel_Exception("Row $row is out of range ({$this->startRow} - {$this->endRow})"); + } + $this->position = $row; + + return $this; + } + + /** + * Rewind the iterator to the starting row + */ + public function rewind() + { + $this->position = $this->startRow; + } + + /** + * Return the current row in this worksheet + * + * @return PHPExcel_Worksheet_Row + */ + public function current() + { + return new PHPExcel_Worksheet_Row($this->subject, $this->position); + } + + /** + * Return the current iterator key + * + * @return int + */ + public function key() + { + return $this->position; + } + + /** + * Set the iterator to its next value + */ + public function next() + { + ++$this->position; + } + + /** + * Set the iterator to its previous value + */ + public function prev() + { + if ($this->position <= $this->startRow) { + throw new PHPExcel_Exception("Row is already at the beginning of range ({$this->startRow} - {$this->endRow})"); + } + + --$this->position; + } + + /** + * Indicate if more rows exist in the worksheet range of rows that we're iterating + * + * @return boolean + */ + public function valid() + { + return $this->position <= $this->endRow; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Worksheet/SheetView.php b/application/third_party/PHPExcel/PHPExcel/Worksheet/SheetView.php new file mode 100644 index 0000000..5aaef3b --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Worksheet/SheetView.php @@ -0,0 +1,187 @@ +<?php + +/** + * PHPExcel_Worksheet_SheetView + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Worksheet + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Worksheet_SheetView +{ + + /* Sheet View types */ + const SHEETVIEW_NORMAL = 'normal'; + const SHEETVIEW_PAGE_LAYOUT = 'pageLayout'; + const SHEETVIEW_PAGE_BREAK_PREVIEW = 'pageBreakPreview'; + + private static $sheetViewTypes = array( + self::SHEETVIEW_NORMAL, + self::SHEETVIEW_PAGE_LAYOUT, + self::SHEETVIEW_PAGE_BREAK_PREVIEW, + ); + + /** + * ZoomScale + * + * Valid values range from 10 to 400. + * + * @var int + */ + private $zoomScale = 100; + + /** + * ZoomScaleNormal + * + * Valid values range from 10 to 400. + * + * @var int + */ + private $zoomScaleNormal = 100; + + /** + * View + * + * Valid values range from 10 to 400. + * + * @var string + */ + private $sheetviewType = self::SHEETVIEW_NORMAL; + + /** + * Create a new PHPExcel_Worksheet_SheetView + */ + public function __construct() + { + } + + /** + * Get ZoomScale + * + * @return int + */ + public function getZoomScale() + { + return $this->zoomScale; + } + + /** + * Set ZoomScale + * + * Valid values range from 10 to 400. + * + * @param int $pValue + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_SheetView + */ + public function setZoomScale($pValue = 100) + { + // Microsoft Office Excel 2007 only allows setting a scale between 10 and 400 via the user interface, + // but it is apparently still able to handle any scale >= 1 + if (($pValue >= 1) || is_null($pValue)) { + $this->zoomScale = $pValue; + } else { + throw new PHPExcel_Exception("Scale must be greater than or equal to 1."); + } + return $this; + } + + /** + * Get ZoomScaleNormal + * + * @return int + */ + public function getZoomScaleNormal() + { + return $this->zoomScaleNormal; + } + + /** + * Set ZoomScale + * + * Valid values range from 10 to 400. + * + * @param int $pValue + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_SheetView + */ + public function setZoomScaleNormal($pValue = 100) + { + if (($pValue >= 1) || is_null($pValue)) { + $this->zoomScaleNormal = $pValue; + } else { + throw new PHPExcel_Exception("Scale must be greater than or equal to 1."); + } + return $this; + } + + /** + * Get View + * + * @return string + */ + public function getView() + { + return $this->sheetviewType; + } + + /** + * Set View + * + * Valid values are + * 'normal' self::SHEETVIEW_NORMAL + * 'pageLayout' self::SHEETVIEW_PAGE_LAYOUT + * 'pageBreakPreview' self::SHEETVIEW_PAGE_BREAK_PREVIEW + * + * @param string $pValue + * @throws PHPExcel_Exception + * @return PHPExcel_Worksheet_SheetView + */ + public function setView($pValue = null) + { + // MS Excel 2007 allows setting the view to 'normal', 'pageLayout' or 'pageBreakPreview' via the user interface + if ($pValue === null) { + $pValue = self::SHEETVIEW_NORMAL; + } + if (in_array($pValue, self::$sheetViewTypes)) { + $this->sheetviewType = $pValue; + } else { + throw new PHPExcel_Exception("Invalid sheetview layout type."); + } + + return $this; + } + + /** + * Implement PHP __clone to create a deep clone, not just a shallow copy. + */ + public function __clone() + { + $vars = get_object_vars($this); + foreach ($vars as $key => $value) { + if (is_object($value)) { + $this->$key = clone $value; + } else { + $this->$key = $value; + } + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/WorksheetIterator.php b/application/third_party/PHPExcel/PHPExcel/WorksheetIterator.php new file mode 100644 index 0000000..cb1b281 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/WorksheetIterator.php @@ -0,0 +1,108 @@ +<?php + +/** + * PHPExcel_WorksheetIterator + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_WorksheetIterator implements Iterator +{ + /** + * Spreadsheet to iterate + * + * @var PHPExcel + */ + private $subject; + + /** + * Current iterator position + * + * @var int + */ + private $position = 0; + + /** + * Create a new worksheet iterator + * + * @param PHPExcel $subject + */ + public function __construct(PHPExcel $subject = null) + { + // Set subject + $this->subject = $subject; + } + + /** + * Destructor + */ + public function __destruct() + { + unset($this->subject); + } + + /** + * Rewind iterator + */ + public function rewind() + { + $this->position = 0; + } + + /** + * Current PHPExcel_Worksheet + * + * @return PHPExcel_Worksheet + */ + public function current() + { + return $this->subject->getSheet($this->position); + } + + /** + * Current key + * + * @return int + */ + public function key() + { + return $this->position; + } + + /** + * Next value + */ + public function next() + { + ++$this->position; + } + + /** + * More PHPExcel_Worksheet instances available? + * + * @return boolean + */ + public function valid() + { + return $this->position < $this->subject->getSheetCount(); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Abstract.php b/application/third_party/PHPExcel/PHPExcel/Writer/Abstract.php new file mode 100644 index 0000000..2a797a9 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Abstract.php @@ -0,0 +1,157 @@ +<?php + +/** + * PHPExcel_Writer_Abstract + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +abstract class PHPExcel_Writer_Abstract implements PHPExcel_Writer_IWriter +{ + /** + * Write charts that are defined in the workbook? + * Identifies whether the Writer should write definitions for any charts that exist in the PHPExcel object; + * + * @var boolean + */ + protected $includeCharts = false; + + /** + * Pre-calculate formulas + * Forces PHPExcel to recalculate all formulae in a workbook when saving, so that the pre-calculated values are + * immediately available to MS Excel or other office spreadsheet viewer when opening the file + * + * @var boolean + */ + protected $preCalculateFormulas = true; + + /** + * Use disk caching where possible? + * + * @var boolean + */ + protected $_useDiskCaching = false; + + /** + * Disk caching directory + * + * @var string + */ + protected $_diskCachingDirectory = './'; + + /** + * Write charts in workbook? + * If this is true, then the Writer will write definitions for any charts that exist in the PHPExcel object. + * If false (the default) it will ignore any charts defined in the PHPExcel object. + * + * @return boolean + */ + public function getIncludeCharts() + { + return $this->includeCharts; + } + + /** + * Set write charts in workbook + * Set to true, to advise the Writer to include any charts that exist in the PHPExcel object. + * Set to false (the default) to ignore charts. + * + * @param boolean $pValue + * @return PHPExcel_Writer_IWriter + */ + public function setIncludeCharts($pValue = false) + { + $this->includeCharts = (boolean) $pValue; + return $this; + } + + /** + * Get Pre-Calculate Formulas flag + * If this is true (the default), then the writer will recalculate all formulae in a workbook when saving, + * so that the pre-calculated values are immediately available to MS Excel or other office spreadsheet + * viewer when opening the file + * If false, then formulae are not calculated on save. This is faster for saving in PHPExcel, but slower + * when opening the resulting file in MS Excel, because Excel has to recalculate the formulae itself + * + * @return boolean + */ + public function getPreCalculateFormulas() + { + return $this->preCalculateFormulas; + } + + /** + * Set Pre-Calculate Formulas + * Set to true (the default) to advise the Writer to calculate all formulae on save + * Set to false to prevent precalculation of formulae on save. + * + * @param boolean $pValue Pre-Calculate Formulas? + * @return PHPExcel_Writer_IWriter + */ + public function setPreCalculateFormulas($pValue = true) + { + $this->preCalculateFormulas = (boolean) $pValue; + return $this; + } + + /** + * Get use disk caching where possible? + * + * @return boolean + */ + public function getUseDiskCaching() + { + return $this->_useDiskCaching; + } + + /** + * Set use disk caching where possible? + * + * @param boolean $pValue + * @param string $pDirectory Disk caching directory + * @throws PHPExcel_Writer_Exception when directory does not exist + * @return PHPExcel_Writer_Excel2007 + */ + public function setUseDiskCaching($pValue = false, $pDirectory = null) + { + $this->_useDiskCaching = $pValue; + + if ($pDirectory !== null) { + if (is_dir($pDirectory)) { + $this->_diskCachingDirectory = $pDirectory; + } else { + throw new PHPExcel_Writer_Exception("Directory does not exist: $pDirectory"); + } + } + return $this; + } + + /** + * Get disk caching directory + * + * @return string + */ + public function getDiskCachingDirectory() + { + return $this->_diskCachingDirectory; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/CSV.php b/application/third_party/PHPExcel/PHPExcel/Writer/CSV.php new file mode 100644 index 0000000..e59c301 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/CSV.php @@ -0,0 +1,352 @@ +<?php + +/** + * PHPExcel_Writer_CSV + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_CSV + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_CSV extends PHPExcel_Writer_Abstract implements PHPExcel_Writer_IWriter +{ + /** + * PHPExcel object + * + * @var PHPExcel + */ + private $phpExcel; + + /** + * Delimiter + * + * @var string + */ + private $delimiter = ','; + + /** + * Enclosure + * + * @var string + */ + private $enclosure = '"'; + + /** + * Line ending + * + * @var string + */ + private $lineEnding = PHP_EOL; + + /** + * Sheet index to write + * + * @var int + */ + private $sheetIndex = 0; + + /** + * Whether to write a BOM (for UTF8). + * + * @var boolean + */ + private $useBOM = false; + + /** + * Whether to write a Separator line as the first line of the file + * sep=x + * + * @var boolean + */ + private $includeSeparatorLine = false; + + /** + * Whether to write a fully Excel compatible CSV file. + * + * @var boolean + */ + private $excelCompatibility = false; + + /** + * Create a new PHPExcel_Writer_CSV + * + * @param PHPExcel $phpExcel PHPExcel object + */ + public function __construct(PHPExcel $phpExcel) + { + $this->phpExcel = $phpExcel; + } + + /** + * Save PHPExcel to file + * + * @param string $pFilename + * @throws PHPExcel_Writer_Exception + */ + public function save($pFilename = null) + { + // Fetch sheet + $sheet = $this->phpExcel->getSheet($this->sheetIndex); + + $saveDebugLog = PHPExcel_Calculation::getInstance($this->phpExcel)->getDebugLog()->getWriteDebugLog(); + PHPExcel_Calculation::getInstance($this->phpExcel)->getDebugLog()->setWriteDebugLog(false); + $saveArrayReturnType = PHPExcel_Calculation::getArrayReturnType(); + PHPExcel_Calculation::setArrayReturnType(PHPExcel_Calculation::RETURN_ARRAY_AS_VALUE); + + // Open file + $fileHandle = fopen($pFilename, 'wb+'); + if ($fileHandle === false) { + throw new PHPExcel_Writer_Exception("Could not open file $pFilename for writing."); + } + + if ($this->excelCompatibility) { + $this->setUseBOM(true); // Enforce UTF-8 BOM Header + $this->setIncludeSeparatorLine(true); // Set separator line + $this->setEnclosure('"'); // Set enclosure to " + $this->setDelimiter(";"); // Set delimiter to a semi-colon + $this->setLineEnding("\r\n"); + } + if ($this->useBOM) { + // Write the UTF-8 BOM code if required + fwrite($fileHandle, "\xEF\xBB\xBF"); + } + if ($this->includeSeparatorLine) { + // Write the separator line if required + fwrite($fileHandle, 'sep=' . $this->getDelimiter() . $this->lineEnding); + } + + // Identify the range that we need to extract from the worksheet + $maxCol = $sheet->getHighestDataColumn(); + $maxRow = $sheet->getHighestDataRow(); + + // Write rows to file + for ($row = 1; $row <= $maxRow; ++$row) { + // Convert the row to an array... + $cellsArray = $sheet->rangeToArray('A'.$row.':'.$maxCol.$row, '', $this->preCalculateFormulas); + // ... and write to the file + $this->writeLine($fileHandle, $cellsArray[0]); + } + + // Close file + fclose($fileHandle); + + PHPExcel_Calculation::setArrayReturnType($saveArrayReturnType); + PHPExcel_Calculation::getInstance($this->phpExcel)->getDebugLog()->setWriteDebugLog($saveDebugLog); + } + + /** + * Get delimiter + * + * @return string + */ + public function getDelimiter() + { + return $this->delimiter; + } + + /** + * Set delimiter + * + * @param string $pValue Delimiter, defaults to , + * @return PHPExcel_Writer_CSV + */ + public function setDelimiter($pValue = ',') + { + $this->delimiter = $pValue; + return $this; + } + + /** + * Get enclosure + * + * @return string + */ + public function getEnclosure() + { + return $this->enclosure; + } + + /** + * Set enclosure + * + * @param string $pValue Enclosure, defaults to " + * @return PHPExcel_Writer_CSV + */ + public function setEnclosure($pValue = '"') + { + if ($pValue == '') { + $pValue = null; + } + $this->enclosure = $pValue; + return $this; + } + + /** + * Get line ending + * + * @return string + */ + public function getLineEnding() + { + return $this->lineEnding; + } + + /** + * Set line ending + * + * @param string $pValue Line ending, defaults to OS line ending (PHP_EOL) + * @return PHPExcel_Writer_CSV + */ + public function setLineEnding($pValue = PHP_EOL) + { + $this->lineEnding = $pValue; + return $this; + } + + /** + * Get whether BOM should be used + * + * @return boolean + */ + public function getUseBOM() + { + return $this->useBOM; + } + + /** + * Set whether BOM should be used + * + * @param boolean $pValue Use UTF-8 byte-order mark? Defaults to false + * @return PHPExcel_Writer_CSV + */ + public function setUseBOM($pValue = false) + { + $this->useBOM = $pValue; + return $this; + } + + /** + * Get whether a separator line should be included + * + * @return boolean + */ + public function getIncludeSeparatorLine() + { + return $this->includeSeparatorLine; + } + + /** + * Set whether a separator line should be included as the first line of the file + * + * @param boolean $pValue Use separator line? Defaults to false + * @return PHPExcel_Writer_CSV + */ + public function setIncludeSeparatorLine($pValue = false) + { + $this->includeSeparatorLine = $pValue; + return $this; + } + + /** + * Get whether the file should be saved with full Excel Compatibility + * + * @return boolean + */ + public function getExcelCompatibility() + { + return $this->excelCompatibility; + } + + /** + * Set whether the file should be saved with full Excel Compatibility + * + * @param boolean $pValue Set the file to be written as a fully Excel compatible csv file + * Note that this overrides other settings such as useBOM, enclosure and delimiter + * @return PHPExcel_Writer_CSV + */ + public function setExcelCompatibility($pValue = false) + { + $this->excelCompatibility = $pValue; + return $this; + } + + /** + * Get sheet index + * + * @return int + */ + public function getSheetIndex() + { + return $this->sheetIndex; + } + + /** + * Set sheet index + * + * @param int $pValue Sheet index + * @return PHPExcel_Writer_CSV + */ + public function setSheetIndex($pValue = 0) + { + $this->sheetIndex = $pValue; + return $this; + } + + /** + * Write line to CSV file + * + * @param mixed $pFileHandle PHP filehandle + * @param array $pValues Array containing values in a row + * @throws PHPExcel_Writer_Exception + */ + private function writeLine($pFileHandle = null, $pValues = null) + { + if (is_array($pValues)) { + // No leading delimiter + $writeDelimiter = false; + + // Build the line + $line = ''; + + foreach ($pValues as $element) { + // Escape enclosures + $element = str_replace($this->enclosure, $this->enclosure . $this->enclosure, $element); + + // Add delimiter + if ($writeDelimiter) { + $line .= $this->delimiter; + } else { + $writeDelimiter = true; + } + + // Add enclosed string + $line .= $this->enclosure . $element . $this->enclosure; + } + + // Add line ending + $line .= $this->lineEnding; + + // Write to file + fwrite($pFileHandle, $line); + } else { + throw new PHPExcel_Writer_Exception("Invalid data row passed to CSV writer."); + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007.php new file mode 100644 index 0000000..11d354b --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007.php @@ -0,0 +1,533 @@ +<?php + +/** + * PHPExcel_Writer_Excel2007 + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_Excel2007 extends PHPExcel_Writer_Abstract implements PHPExcel_Writer_IWriter +{ + /** + * Pre-calculate formulas + * Forces PHPExcel to recalculate all formulae in a workbook when saving, so that the pre-calculated values are + * immediately available to MS Excel or other office spreadsheet viewer when opening the file + * + * Overrides the default TRUE for this specific writer for performance reasons + * + * @var boolean + */ + protected $preCalculateFormulas = false; + + /** + * Office2003 compatibility + * + * @var boolean + */ + private $office2003compatibility = false; + + /** + * Private writer parts + * + * @var PHPExcel_Writer_Excel2007_WriterPart[] + */ + private $writerParts = array(); + + /** + * Private PHPExcel + * + * @var PHPExcel + */ + private $spreadSheet; + + /** + * Private string table + * + * @var string[] + */ + private $stringTable = array(); + + /** + * Private unique PHPExcel_Style_Conditional HashTable + * + * @var PHPExcel_HashTable + */ + private $stylesConditionalHashTable; + + /** + * Private unique PHPExcel_Style HashTable + * + * @var PHPExcel_HashTable + */ + private $styleHashTable; + + /** + * Private unique PHPExcel_Style_Fill HashTable + * + * @var PHPExcel_HashTable + */ + private $fillHashTable; + + /** + * Private unique PHPExcel_Style_Font HashTable + * + * @var PHPExcel_HashTable + */ + private $fontHashTable; + + /** + * Private unique PHPExcel_Style_Borders HashTable + * + * @var PHPExcel_HashTable + */ + private $bordersHashTable ; + + /** + * Private unique PHPExcel_Style_NumberFormat HashTable + * + * @var PHPExcel_HashTable + */ + private $numFmtHashTable; + + /** + * Private unique PHPExcel_Worksheet_BaseDrawing HashTable + * + * @var PHPExcel_HashTable + */ + private $drawingHashTable; + + /** + * Create a new PHPExcel_Writer_Excel2007 + * + * @param PHPExcel $pPHPExcel + */ + public function __construct(PHPExcel $pPHPExcel = null) + { + // Assign PHPExcel + $this->setPHPExcel($pPHPExcel); + + $writerPartsArray = array( 'stringtable' => 'PHPExcel_Writer_Excel2007_StringTable', + 'contenttypes' => 'PHPExcel_Writer_Excel2007_ContentTypes', + 'docprops' => 'PHPExcel_Writer_Excel2007_DocProps', + 'rels' => 'PHPExcel_Writer_Excel2007_Rels', + 'theme' => 'PHPExcel_Writer_Excel2007_Theme', + 'style' => 'PHPExcel_Writer_Excel2007_Style', + 'workbook' => 'PHPExcel_Writer_Excel2007_Workbook', + 'worksheet' => 'PHPExcel_Writer_Excel2007_Worksheet', + 'drawing' => 'PHPExcel_Writer_Excel2007_Drawing', + 'comments' => 'PHPExcel_Writer_Excel2007_Comments', + 'chart' => 'PHPExcel_Writer_Excel2007_Chart', + 'relsvba' => 'PHPExcel_Writer_Excel2007_RelsVBA', + 'relsribbonobjects' => 'PHPExcel_Writer_Excel2007_RelsRibbon' + ); + + // Initialise writer parts + // and Assign their parent IWriters + foreach ($writerPartsArray as $writer => $class) { + $this->writerParts[$writer] = new $class($this); + } + + $hashTablesArray = array( 'stylesConditionalHashTable', 'fillHashTable', 'fontHashTable', + 'bordersHashTable', 'numFmtHashTable', 'drawingHashTable', + 'styleHashTable' + ); + + // Set HashTable variables + foreach ($hashTablesArray as $tableName) { + $this->$tableName = new PHPExcel_HashTable(); + } + } + + /** + * Get writer part + * + * @param string $pPartName Writer part name + * @return PHPExcel_Writer_Excel2007_WriterPart + */ + public function getWriterPart($pPartName = '') + { + if ($pPartName != '' && isset($this->writerParts[strtolower($pPartName)])) { + return $this->writerParts[strtolower($pPartName)]; + } else { + return null; + } + } + + /** + * Save PHPExcel to file + * + * @param string $pFilename + * @throws PHPExcel_Writer_Exception + */ + public function save($pFilename = null) + { + if ($this->spreadSheet !== null) { + // garbage collect + $this->spreadSheet->garbageCollect(); + + // If $pFilename is php://output or php://stdout, make it a temporary file... + $originalFilename = $pFilename; + if (strtolower($pFilename) == 'php://output' || strtolower($pFilename) == 'php://stdout') { + $pFilename = @tempnam(PHPExcel_Shared_File::sys_get_temp_dir(), 'phpxltmp'); + if ($pFilename == '') { + $pFilename = $originalFilename; + } + } + + $saveDebugLog = PHPExcel_Calculation::getInstance($this->spreadSheet)->getDebugLog()->getWriteDebugLog(); + PHPExcel_Calculation::getInstance($this->spreadSheet)->getDebugLog()->setWriteDebugLog(false); + $saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType(); + PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL); + + // Create string lookup table + $this->stringTable = array(); + for ($i = 0; $i < $this->spreadSheet->getSheetCount(); ++$i) { + $this->stringTable = $this->getWriterPart('StringTable')->createStringTable($this->spreadSheet->getSheet($i), $this->stringTable); + } + + // Create styles dictionaries + $this->styleHashTable->addFromSource($this->getWriterPart('Style')->allStyles($this->spreadSheet)); + $this->stylesConditionalHashTable->addFromSource($this->getWriterPart('Style')->allConditionalStyles($this->spreadSheet)); + $this->fillHashTable->addFromSource($this->getWriterPart('Style')->allFills($this->spreadSheet)); + $this->fontHashTable->addFromSource($this->getWriterPart('Style')->allFonts($this->spreadSheet)); + $this->bordersHashTable->addFromSource($this->getWriterPart('Style')->allBorders($this->spreadSheet)); + $this->numFmtHashTable->addFromSource($this->getWriterPart('Style')->allNumberFormats($this->spreadSheet)); + + // Create drawing dictionary + $this->drawingHashTable->addFromSource($this->getWriterPart('Drawing')->allDrawings($this->spreadSheet)); + + // Create new ZIP file and open it for writing + $zipClass = PHPExcel_Settings::getZipClass(); + $objZip = new $zipClass(); + + // Retrieve OVERWRITE and CREATE constants from the instantiated zip class + // This method of accessing constant values from a dynamic class should work with all appropriate versions of PHP + $ro = new ReflectionObject($objZip); + $zipOverWrite = $ro->getConstant('OVERWRITE'); + $zipCreate = $ro->getConstant('CREATE'); + + if (file_exists($pFilename)) { + unlink($pFilename); + } + // Try opening the ZIP file + if ($objZip->open($pFilename, $zipOverWrite) !== true) { + if ($objZip->open($pFilename, $zipCreate) !== true) { + throw new PHPExcel_Writer_Exception("Could not open " . $pFilename . " for writing."); + } + } + + // Add [Content_Types].xml to ZIP file + $objZip->addFromString('[Content_Types].xml', $this->getWriterPart('ContentTypes')->writeContentTypes($this->spreadSheet, $this->includeCharts)); + + //if hasMacros, add the vbaProject.bin file, Certificate file(if exists) + if ($this->spreadSheet->hasMacros()) { + $macrosCode=$this->spreadSheet->getMacrosCode(); + if (!is_null($macrosCode)) {// we have the code ? + $objZip->addFromString('xl/vbaProject.bin', $macrosCode);//allways in 'xl', allways named vbaProject.bin + if ($this->spreadSheet->hasMacrosCertificate()) {//signed macros ? + // Yes : add the certificate file and the related rels file + $objZip->addFromString('xl/vbaProjectSignature.bin', $this->spreadSheet->getMacrosCertificate()); + $objZip->addFromString('xl/_rels/vbaProject.bin.rels', $this->getWriterPart('RelsVBA')->writeVBARelationships($this->spreadSheet)); + } + } + } + //a custom UI in this workbook ? add it ("base" xml and additional objects (pictures) and rels) + if ($this->spreadSheet->hasRibbon()) { + $tmpRibbonTarget=$this->spreadSheet->getRibbonXMLData('target'); + $objZip->addFromString($tmpRibbonTarget, $this->spreadSheet->getRibbonXMLData('data')); + if ($this->spreadSheet->hasRibbonBinObjects()) { + $tmpRootPath=dirname($tmpRibbonTarget).'/'; + $ribbonBinObjects=$this->spreadSheet->getRibbonBinObjects('data');//the files to write + foreach ($ribbonBinObjects as $aPath => $aContent) { + $objZip->addFromString($tmpRootPath.$aPath, $aContent); + } + //the rels for files + $objZip->addFromString($tmpRootPath.'_rels/'.basename($tmpRibbonTarget).'.rels', $this->getWriterPart('RelsRibbonObjects')->writeRibbonRelationships($this->spreadSheet)); + } + } + + // Add relationships to ZIP file + $objZip->addFromString('_rels/.rels', $this->getWriterPart('Rels')->writeRelationships($this->spreadSheet)); + $objZip->addFromString('xl/_rels/workbook.xml.rels', $this->getWriterPart('Rels')->writeWorkbookRelationships($this->spreadSheet)); + + // Add document properties to ZIP file + $objZip->addFromString('docProps/app.xml', $this->getWriterPart('DocProps')->writeDocPropsApp($this->spreadSheet)); + $objZip->addFromString('docProps/core.xml', $this->getWriterPart('DocProps')->writeDocPropsCore($this->spreadSheet)); + $customPropertiesPart = $this->getWriterPart('DocProps')->writeDocPropsCustom($this->spreadSheet); + if ($customPropertiesPart !== null) { + $objZip->addFromString('docProps/custom.xml', $customPropertiesPart); + } + + // Add theme to ZIP file + $objZip->addFromString('xl/theme/theme1.xml', $this->getWriterPart('Theme')->writeTheme($this->spreadSheet)); + + // Add string table to ZIP file + $objZip->addFromString('xl/sharedStrings.xml', $this->getWriterPart('StringTable')->writeStringTable($this->stringTable)); + + // Add styles to ZIP file + $objZip->addFromString('xl/styles.xml', $this->getWriterPart('Style')->writeStyles($this->spreadSheet)); + + // Add workbook to ZIP file + $objZip->addFromString('xl/workbook.xml', $this->getWriterPart('Workbook')->writeWorkbook($this->spreadSheet, $this->preCalculateFormulas)); + + $chartCount = 0; + // Add worksheets + for ($i = 0; $i < $this->spreadSheet->getSheetCount(); ++$i) { + $objZip->addFromString('xl/worksheets/sheet' . ($i + 1) . '.xml', $this->getWriterPart('Worksheet')->writeWorksheet($this->spreadSheet->getSheet($i), $this->stringTable, $this->includeCharts)); + if ($this->includeCharts) { + $charts = $this->spreadSheet->getSheet($i)->getChartCollection(); + if (count($charts) > 0) { + foreach ($charts as $chart) { + $objZip->addFromString('xl/charts/chart' . ($chartCount + 1) . '.xml', $this->getWriterPart('Chart')->writeChart($chart, $this->preCalculateFormulas)); + $chartCount++; + } + } + } + } + + $chartRef1 = $chartRef2 = 0; + // Add worksheet relationships (drawings, ...) + for ($i = 0; $i < $this->spreadSheet->getSheetCount(); ++$i) { + // Add relationships + $objZip->addFromString('xl/worksheets/_rels/sheet' . ($i + 1) . '.xml.rels', $this->getWriterPart('Rels')->writeWorksheetRelationships($this->spreadSheet->getSheet($i), ($i + 1), $this->includeCharts)); + + $drawings = $this->spreadSheet->getSheet($i)->getDrawingCollection(); + $drawingCount = count($drawings); + if ($this->includeCharts) { + $chartCount = $this->spreadSheet->getSheet($i)->getChartCount(); + } + + // Add drawing and image relationship parts + if (($drawingCount > 0) || ($chartCount > 0)) { + // Drawing relationships + $objZip->addFromString('xl/drawings/_rels/drawing' . ($i + 1) . '.xml.rels', $this->getWriterPart('Rels')->writeDrawingRelationships($this->spreadSheet->getSheet($i), $chartRef1, $this->includeCharts)); + + // Drawings + $objZip->addFromString('xl/drawings/drawing' . ($i + 1) . '.xml', $this->getWriterPart('Drawing')->writeDrawings($this->spreadSheet->getSheet($i), $chartRef2, $this->includeCharts)); + } + + // Add comment relationship parts + if (count($this->spreadSheet->getSheet($i)->getComments()) > 0) { + // VML Comments + $objZip->addFromString('xl/drawings/vmlDrawing' . ($i + 1) . '.vml', $this->getWriterPart('Comments')->writeVMLComments($this->spreadSheet->getSheet($i))); + + // Comments + $objZip->addFromString('xl/comments' . ($i + 1) . '.xml', $this->getWriterPart('Comments')->writeComments($this->spreadSheet->getSheet($i))); + } + + // Add header/footer relationship parts + if (count($this->spreadSheet->getSheet($i)->getHeaderFooter()->getImages()) > 0) { + // VML Drawings + $objZip->addFromString('xl/drawings/vmlDrawingHF' . ($i + 1) . '.vml', $this->getWriterPart('Drawing')->writeVMLHeaderFooterImages($this->spreadSheet->getSheet($i))); + + // VML Drawing relationships + $objZip->addFromString('xl/drawings/_rels/vmlDrawingHF' . ($i + 1) . '.vml.rels', $this->getWriterPart('Rels')->writeHeaderFooterDrawingRelationships($this->spreadSheet->getSheet($i))); + + // Media + foreach ($this->spreadSheet->getSheet($i)->getHeaderFooter()->getImages() as $image) { + $objZip->addFromString('xl/media/' . $image->getIndexedFilename(), file_get_contents($image->getPath())); + } + } + } + + // Add media + for ($i = 0; $i < $this->getDrawingHashTable()->count(); ++$i) { + if ($this->getDrawingHashTable()->getByIndex($i) instanceof PHPExcel_Worksheet_Drawing) { + $imageContents = null; + $imagePath = $this->getDrawingHashTable()->getByIndex($i)->getPath(); + if (strpos($imagePath, 'zip://') !== false) { + $imagePath = substr($imagePath, 6); + $imagePathSplitted = explode('#', $imagePath); + + $imageZip = new ZipArchive(); + $imageZip->open($imagePathSplitted[0]); + $imageContents = $imageZip->getFromName($imagePathSplitted[1]); + $imageZip->close(); + unset($imageZip); + } else { + $imageContents = file_get_contents($imagePath); + } + + $objZip->addFromString('xl/media/' . str_replace(' ', '_', $this->getDrawingHashTable()->getByIndex($i)->getIndexedFilename()), $imageContents); + } elseif ($this->getDrawingHashTable()->getByIndex($i) instanceof PHPExcel_Worksheet_MemoryDrawing) { + ob_start(); + call_user_func( + $this->getDrawingHashTable()->getByIndex($i)->getRenderingFunction(), + $this->getDrawingHashTable()->getByIndex($i)->getImageResource() + ); + $imageContents = ob_get_contents(); + ob_end_clean(); + + $objZip->addFromString('xl/media/' . str_replace(' ', '_', $this->getDrawingHashTable()->getByIndex($i)->getIndexedFilename()), $imageContents); + } + } + + PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType); + PHPExcel_Calculation::getInstance($this->spreadSheet)->getDebugLog()->setWriteDebugLog($saveDebugLog); + + // Close file + if ($objZip->close() === false) { + throw new PHPExcel_Writer_Exception("Could not close zip file $pFilename."); + } + + // If a temporary file was used, copy it to the correct file stream + if ($originalFilename != $pFilename) { + if (copy($pFilename, $originalFilename) === false) { + throw new PHPExcel_Writer_Exception("Could not copy temporary zip file $pFilename to $originalFilename."); + } + @unlink($pFilename); + } + } else { + throw new PHPExcel_Writer_Exception("PHPExcel object unassigned."); + } + } + + /** + * Get PHPExcel object + * + * @return PHPExcel + * @throws PHPExcel_Writer_Exception + */ + public function getPHPExcel() + { + if ($this->spreadSheet !== null) { + return $this->spreadSheet; + } else { + throw new PHPExcel_Writer_Exception("No PHPExcel object assigned."); + } + } + + /** + * Set PHPExcel object + * + * @param PHPExcel $pPHPExcel PHPExcel object + * @throws PHPExcel_Writer_Exception + * @return PHPExcel_Writer_Excel2007 + */ + public function setPHPExcel(PHPExcel $pPHPExcel = null) + { + $this->spreadSheet = $pPHPExcel; + return $this; + } + + /** + * Get string table + * + * @return string[] + */ + public function getStringTable() + { + return $this->stringTable; + } + + /** + * Get PHPExcel_Style HashTable + * + * @return PHPExcel_HashTable + */ + public function getStyleHashTable() + { + return $this->styleHashTable; + } + + /** + * Get PHPExcel_Style_Conditional HashTable + * + * @return PHPExcel_HashTable + */ + public function getStylesConditionalHashTable() + { + return $this->stylesConditionalHashTable; + } + + /** + * Get PHPExcel_Style_Fill HashTable + * + * @return PHPExcel_HashTable + */ + public function getFillHashTable() + { + return $this->fillHashTable; + } + + /** + * Get PHPExcel_Style_Font HashTable + * + * @return PHPExcel_HashTable + */ + public function getFontHashTable() + { + return $this->fontHashTable; + } + + /** + * Get PHPExcel_Style_Borders HashTable + * + * @return PHPExcel_HashTable + */ + public function getBordersHashTable() + { + return $this->bordersHashTable; + } + + /** + * Get PHPExcel_Style_NumberFormat HashTable + * + * @return PHPExcel_HashTable + */ + public function getNumFmtHashTable() + { + return $this->numFmtHashTable; + } + + /** + * Get PHPExcel_Worksheet_BaseDrawing HashTable + * + * @return PHPExcel_HashTable + */ + public function getDrawingHashTable() + { + return $this->drawingHashTable; + } + + /** + * Get Office2003 compatibility + * + * @return boolean + */ + public function getOffice2003Compatibility() + { + return $this->office2003compatibility; + } + + /** + * Set Office2003 compatibility + * + * @param boolean $pValue Office2003 compatibility? + * @return PHPExcel_Writer_Excel2007 + */ + public function setOffice2003Compatibility($pValue = false) + { + $this->office2003compatibility = $pValue; + return $this; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Chart.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Chart.php new file mode 100644 index 0000000..92fa215 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Chart.php @@ -0,0 +1,1520 @@ +<?php + +/** + * PHPExcel_Writer_Excel2007_Chart + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_Excel2007_Chart extends PHPExcel_Writer_Excel2007_WriterPart +{ + protected $calculateCellValues; + + /** + * Write charts to XML format + * + * @param PHPExcel_Chart $pChart + * + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeChart(PHPExcel_Chart $pChart = null, $calculateCellValues = true) + { + $this->calculateCellValues = $calculateCellValues; + + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + // Ensure that data series values are up-to-date before we save + if ($this->calculateCellValues) { + $pChart->refresh(); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + // c:chartSpace + $objWriter->startElement('c:chartSpace'); + $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart'); + $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main'); + $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); + + $objWriter->startElement('c:date1904'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + $objWriter->startElement('c:lang'); + $objWriter->writeAttribute('val', "en-GB"); + $objWriter->endElement(); + $objWriter->startElement('c:roundedCorners'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + + $this->writeAlternateContent($objWriter); + + $objWriter->startElement('c:chart'); + + $this->writeTitle($pChart->getTitle(), $objWriter); + + $objWriter->startElement('c:autoTitleDeleted'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + + $this->writePlotArea($pChart->getPlotArea(), $pChart->getXAxisLabel(), $pChart->getYAxisLabel(), $objWriter, $pChart->getWorksheet(), $pChart->getChartAxisX(), $pChart->getChartAxisY(), $pChart->getMajorGridlines(), $pChart->getMinorGridlines()); + + $this->writeLegend($pChart->getLegend(), $objWriter); + + $objWriter->startElement('c:plotVisOnly'); + $objWriter->writeAttribute('val', 1); + $objWriter->endElement(); + + $objWriter->startElement('c:dispBlanksAs'); + $objWriter->writeAttribute('val', "gap"); + $objWriter->endElement(); + + $objWriter->startElement('c:showDLblsOverMax'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + + $objWriter->endElement(); + + $this->writePrintSettings($objWriter); + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write Chart Title + * + * @param PHPExcel_Chart_Title $title + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * + * @throws PHPExcel_Writer_Exception + */ + private function writeTitle(PHPExcel_Chart_Title $title = null, $objWriter) + { + if (is_null($title)) { + return; + } + + $objWriter->startElement('c:title'); + $objWriter->startElement('c:tx'); + $objWriter->startElement('c:rich'); + + $objWriter->startElement('a:bodyPr'); + $objWriter->endElement(); + + $objWriter->startElement('a:lstStyle'); + $objWriter->endElement(); + + $objWriter->startElement('a:p'); + + $caption = $title->getCaption(); + if ((is_array($caption)) && (count($caption) > 0)) { + $caption = $caption[0]; + } + $this->getParentWriter()->getWriterPart('stringtable')->writeRichTextForCharts($objWriter, $caption, 'a'); + + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + + $this->writeLayout($title->getLayout(), $objWriter); + + $objWriter->startElement('c:overlay'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + + $objWriter->endElement(); + } + + /** + * Write Chart Legend + * + * @param PHPExcel_Chart_Legend $legend + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * + * @throws PHPExcel_Writer_Exception + */ + private function writeLegend(PHPExcel_Chart_Legend $legend = null, $objWriter) + { + if (is_null($legend)) { + return; + } + + $objWriter->startElement('c:legend'); + + $objWriter->startElement('c:legendPos'); + $objWriter->writeAttribute('val', $legend->getPosition()); + $objWriter->endElement(); + + $this->writeLayout($legend->getLayout(), $objWriter); + + $objWriter->startElement('c:overlay'); + $objWriter->writeAttribute('val', ($legend->getOverlay()) ? '1' : '0'); + $objWriter->endElement(); + + $objWriter->startElement('c:txPr'); + $objWriter->startElement('a:bodyPr'); + $objWriter->endElement(); + + $objWriter->startElement('a:lstStyle'); + $objWriter->endElement(); + + $objWriter->startElement('a:p'); + $objWriter->startElement('a:pPr'); + $objWriter->writeAttribute('rtl', 0); + + $objWriter->startElement('a:defRPr'); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('a:endParaRPr'); + $objWriter->writeAttribute('lang', "en-US"); + $objWriter->endElement(); + + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->endElement(); + } + + /** + * Write Chart Plot Area + * + * @param PHPExcel_Chart_PlotArea $plotArea + * @param PHPExcel_Chart_Title $xAxisLabel + * @param PHPExcel_Chart_Title $yAxisLabel + * @param PHPExcel_Chart_Axis $xAxis + * @param PHPExcel_Chart_Axis $yAxis + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * + * @throws PHPExcel_Writer_Exception + */ + private function writePlotArea(PHPExcel_Chart_PlotArea $plotArea, PHPExcel_Chart_Title $xAxisLabel = null, PHPExcel_Chart_Title $yAxisLabel = null, $objWriter, PHPExcel_Worksheet $pSheet, PHPExcel_Chart_Axis $xAxis, PHPExcel_Chart_Axis $yAxis, PHPExcel_Chart_GridLines $majorGridlines, PHPExcel_Chart_GridLines $minorGridlines) + { + if (is_null($plotArea)) { + return; + } + + $id1 = $id2 = 0; + $this->_seriesIndex = 0; + $objWriter->startElement('c:plotArea'); + + $layout = $plotArea->getLayout(); + + $this->writeLayout($layout, $objWriter); + + $chartTypes = self::getChartType($plotArea); + $catIsMultiLevelSeries = $valIsMultiLevelSeries = false; + $plotGroupingType = ''; + foreach ($chartTypes as $chartType) { + $objWriter->startElement('c:' . $chartType); + + $groupCount = $plotArea->getPlotGroupCount(); + for ($i = 0; $i < $groupCount; ++$i) { + $plotGroup = $plotArea->getPlotGroupByIndex($i); + $groupType = $plotGroup->getPlotType(); + if ($groupType == $chartType) { + $plotStyle = $plotGroup->getPlotStyle(); + if ($groupType === PHPExcel_Chart_DataSeries::TYPE_RADARCHART) { + $objWriter->startElement('c:radarStyle'); + $objWriter->writeAttribute('val', $plotStyle); + $objWriter->endElement(); + } elseif ($groupType === PHPExcel_Chart_DataSeries::TYPE_SCATTERCHART) { + $objWriter->startElement('c:scatterStyle'); + $objWriter->writeAttribute('val', $plotStyle); + $objWriter->endElement(); + } + + $this->writePlotGroup($plotGroup, $chartType, $objWriter, $catIsMultiLevelSeries, $valIsMultiLevelSeries, $plotGroupingType, $pSheet); + } + } + + $this->writeDataLabels($objWriter, $layout); + + if ($chartType === PHPExcel_Chart_DataSeries::TYPE_LINECHART) { + // Line only, Line3D can't be smoothed + + $objWriter->startElement('c:smooth'); + $objWriter->writeAttribute('val', (integer) $plotGroup->getSmoothLine()); + $objWriter->endElement(); + } elseif (($chartType === PHPExcel_Chart_DataSeries::TYPE_BARCHART) ||($chartType === PHPExcel_Chart_DataSeries::TYPE_BARCHART_3D)) { + $objWriter->startElement('c:gapWidth'); + $objWriter->writeAttribute('val', 150); + $objWriter->endElement(); + + if ($plotGroupingType == 'percentStacked' || $plotGroupingType == 'stacked') { + $objWriter->startElement('c:overlap'); + $objWriter->writeAttribute('val', 100); + $objWriter->endElement(); + } + } elseif ($chartType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) { + $objWriter->startElement('c:bubbleScale'); + $objWriter->writeAttribute('val', 25); + $objWriter->endElement(); + + $objWriter->startElement('c:showNegBubbles'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + } elseif ($chartType === PHPExcel_Chart_DataSeries::TYPE_STOCKCHART) { + $objWriter->startElement('c:hiLowLines'); + $objWriter->endElement(); + + $objWriter->startElement('c:upDownBars'); + + $objWriter->startElement('c:gapWidth'); + $objWriter->writeAttribute('val', 300); + $objWriter->endElement(); + + $objWriter->startElement('c:upBars'); + $objWriter->endElement(); + + $objWriter->startElement('c:downBars'); + $objWriter->endElement(); + + $objWriter->endElement(); + } + + // Generate 2 unique numbers to use for axId values + // $id1 = $id2 = rand(10000000,99999999); + // do { + // $id2 = rand(10000000,99999999); + // } while ($id1 == $id2); + $id1 = '75091328'; + $id2 = '75089408'; + + if (($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART) && ($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) && ($chartType !== PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) { + $objWriter->startElement('c:axId'); + $objWriter->writeAttribute('val', $id1); + $objWriter->endElement(); + $objWriter->startElement('c:axId'); + $objWriter->writeAttribute('val', $id2); + $objWriter->endElement(); + } else { + $objWriter->startElement('c:firstSliceAng'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + + if ($chartType === PHPExcel_Chart_DataSeries::TYPE_DONUTCHART) { + $objWriter->startElement('c:holeSize'); + $objWriter->writeAttribute('val', 50); + $objWriter->endElement(); + } + } + + $objWriter->endElement(); + } + + if (($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART) && ($chartType !== PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) && ($chartType !== PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) { + if ($chartType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) { + $this->writeValueAxis($objWriter, $plotArea, $xAxisLabel, $chartType, $id1, $id2, $catIsMultiLevelSeries, $xAxis, $yAxis, $majorGridlines, $minorGridlines); + } else { + $this->writeCategoryAxis($objWriter, $plotArea, $xAxisLabel, $chartType, $id1, $id2, $catIsMultiLevelSeries, $xAxis, $yAxis); + } + + $this->writeValueAxis($objWriter, $plotArea, $yAxisLabel, $chartType, $id1, $id2, $valIsMultiLevelSeries, $xAxis, $yAxis, $majorGridlines, $minorGridlines); + } + + $objWriter->endElement(); + } + + /** + * Write Data Labels + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Chart_Layout $chartLayout Chart layout + * + * @throws PHPExcel_Writer_Exception + */ + private function writeDataLabels($objWriter, $chartLayout) + { + $objWriter->startElement('c:dLbls'); + + $objWriter->startElement('c:showLegendKey'); + $showLegendKey = (empty($chartLayout)) ? 0 : $chartLayout->getShowLegendKey(); + $objWriter->writeAttribute('val', ((empty($showLegendKey)) ? 0 : 1)); + $objWriter->endElement(); + + $objWriter->startElement('c:showVal'); + $showVal = (empty($chartLayout)) ? 0 : $chartLayout->getShowVal(); + $objWriter->writeAttribute('val', ((empty($showVal)) ? 0 : 1)); + $objWriter->endElement(); + + $objWriter->startElement('c:showCatName'); + $showCatName = (empty($chartLayout)) ? 0 : $chartLayout->getShowCatName(); + $objWriter->writeAttribute('val', ((empty($showCatName)) ? 0 : 1)); + $objWriter->endElement(); + + $objWriter->startElement('c:showSerName'); + $showSerName = (empty($chartLayout)) ? 0 : $chartLayout->getShowSerName(); + $objWriter->writeAttribute('val', ((empty($showSerName)) ? 0 : 1)); + $objWriter->endElement(); + + $objWriter->startElement('c:showPercent'); + $showPercent = (empty($chartLayout)) ? 0 : $chartLayout->getShowPercent(); + $objWriter->writeAttribute('val', ((empty($showPercent)) ? 0 : 1)); + $objWriter->endElement(); + + $objWriter->startElement('c:showBubbleSize'); + $showBubbleSize = (empty($chartLayout)) ? 0 : $chartLayout->getShowBubbleSize(); + $objWriter->writeAttribute('val', ((empty($showBubbleSize)) ? 0 : 1)); + $objWriter->endElement(); + + $objWriter->startElement('c:showLeaderLines'); + $showLeaderLines = (empty($chartLayout)) ? 1 : $chartLayout->getShowLeaderLines(); + $objWriter->writeAttribute('val', ((empty($showLeaderLines)) ? 0 : 1)); + $objWriter->endElement(); + + $objWriter->endElement(); + } + + /** + * Write Category Axis + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Chart_PlotArea $plotArea + * @param PHPExcel_Chart_Title $xAxisLabel + * @param string $groupType Chart type + * @param string $id1 + * @param string $id2 + * @param boolean $isMultiLevelSeries + * + * @throws PHPExcel_Writer_Exception + */ + private function writeCategoryAxis($objWriter, PHPExcel_Chart_PlotArea $plotArea, $xAxisLabel, $groupType, $id1, $id2, $isMultiLevelSeries, $xAxis, $yAxis) + { + $objWriter->startElement('c:catAx'); + + if ($id1 > 0) { + $objWriter->startElement('c:axId'); + $objWriter->writeAttribute('val', $id1); + $objWriter->endElement(); + } + + $objWriter->startElement('c:scaling'); + $objWriter->startElement('c:orientation'); + $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('orientation')); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('c:delete'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + + $objWriter->startElement('c:axPos'); + $objWriter->writeAttribute('val', "b"); + $objWriter->endElement(); + + if (!is_null($xAxisLabel)) { + $objWriter->startElement('c:title'); + $objWriter->startElement('c:tx'); + $objWriter->startElement('c:rich'); + + $objWriter->startElement('a:bodyPr'); + $objWriter->endElement(); + + $objWriter->startElement('a:lstStyle'); + $objWriter->endElement(); + + $objWriter->startElement('a:p'); + $objWriter->startElement('a:r'); + + $caption = $xAxisLabel->getCaption(); + if (is_array($caption)) { + $caption = $caption[0]; + } + $objWriter->startElement('a:t'); + // $objWriter->writeAttribute('xml:space', 'preserve'); + $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML($caption)); + $objWriter->endElement(); + + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + + $layout = $xAxisLabel->getLayout(); + $this->writeLayout($layout, $objWriter); + + $objWriter->startElement('c:overlay'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + + $objWriter->endElement(); + } + + $objWriter->startElement('c:numFmt'); + $objWriter->writeAttribute('formatCode', $yAxis->getAxisNumberFormat()); + $objWriter->writeAttribute('sourceLinked', $yAxis->getAxisNumberSourceLinked()); + $objWriter->endElement(); + + $objWriter->startElement('c:majorTickMark'); + $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('major_tick_mark')); + $objWriter->endElement(); + + $objWriter->startElement('c:minorTickMark'); + $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('minor_tick_mark')); + $objWriter->endElement(); + + $objWriter->startElement('c:tickLblPos'); + $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('axis_labels')); + $objWriter->endElement(); + + if ($id2 > 0) { + $objWriter->startElement('c:crossAx'); + $objWriter->writeAttribute('val', $id2); + $objWriter->endElement(); + + $objWriter->startElement('c:crosses'); + $objWriter->writeAttribute('val', $yAxis->getAxisOptionsProperty('horizontal_crosses')); + $objWriter->endElement(); + } + + $objWriter->startElement('c:auto'); + $objWriter->writeAttribute('val', 1); + $objWriter->endElement(); + + $objWriter->startElement('c:lblAlgn'); + $objWriter->writeAttribute('val', "ctr"); + $objWriter->endElement(); + + $objWriter->startElement('c:lblOffset'); + $objWriter->writeAttribute('val', 100); + $objWriter->endElement(); + + if ($isMultiLevelSeries) { + $objWriter->startElement('c:noMultiLvlLbl'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + } + $objWriter->endElement(); + } + + /** + * Write Value Axis + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Chart_PlotArea $plotArea + * @param PHPExcel_Chart_Title $yAxisLabel + * @param string $groupType Chart type + * @param string $id1 + * @param string $id2 + * @param boolean $isMultiLevelSeries + * + * @throws PHPExcel_Writer_Exception + */ + private function writeValueAxis($objWriter, PHPExcel_Chart_PlotArea $plotArea, $yAxisLabel, $groupType, $id1, $id2, $isMultiLevelSeries, $xAxis, $yAxis, $majorGridlines, $minorGridlines) + { + $objWriter->startElement('c:valAx'); + + if ($id2 > 0) { + $objWriter->startElement('c:axId'); + $objWriter->writeAttribute('val', $id2); + $objWriter->endElement(); + } + + $objWriter->startElement('c:scaling'); + + if (!is_null($xAxis->getAxisOptionsProperty('maximum'))) { + $objWriter->startElement('c:max'); + $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('maximum')); + $objWriter->endElement(); + } + + if (!is_null($xAxis->getAxisOptionsProperty('minimum'))) { + $objWriter->startElement('c:min'); + $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('minimum')); + $objWriter->endElement(); + } + + $objWriter->startElement('c:orientation'); + $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('orientation')); + + + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('c:delete'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + + $objWriter->startElement('c:axPos'); + $objWriter->writeAttribute('val', "l"); + $objWriter->endElement(); + + $objWriter->startElement('c:majorGridlines'); + $objWriter->startElement('c:spPr'); + + if (!is_null($majorGridlines->getLineColorProperty('value'))) { + $objWriter->startElement('a:ln'); + $objWriter->writeAttribute('w', $majorGridlines->getLineStyleProperty('width')); + $objWriter->startElement('a:solidFill'); + $objWriter->startElement("a:{$majorGridlines->getLineColorProperty('type')}"); + $objWriter->writeAttribute('val', $majorGridlines->getLineColorProperty('value')); + $objWriter->startElement('a:alpha'); + $objWriter->writeAttribute('val', $majorGridlines->getLineColorProperty('alpha')); + $objWriter->endElement(); //end alpha + $objWriter->endElement(); //end srgbClr + $objWriter->endElement(); //end solidFill + + $objWriter->startElement('a:prstDash'); + $objWriter->writeAttribute('val', $majorGridlines->getLineStyleProperty('dash')); + $objWriter->endElement(); + + if ($majorGridlines->getLineStyleProperty('join') == 'miter') { + $objWriter->startElement('a:miter'); + $objWriter->writeAttribute('lim', '800000'); + $objWriter->endElement(); + } else { + $objWriter->startElement('a:bevel'); + $objWriter->endElement(); + } + + if (!is_null($majorGridlines->getLineStyleProperty(array('arrow', 'head', 'type')))) { + $objWriter->startElement('a:headEnd'); + $objWriter->writeAttribute('type', $majorGridlines->getLineStyleProperty(array('arrow', 'head', 'type'))); + $objWriter->writeAttribute('w', $majorGridlines->getLineStyleArrowParameters('head', 'w')); + $objWriter->writeAttribute('len', $majorGridlines->getLineStyleArrowParameters('head', 'len')); + $objWriter->endElement(); + } + + if (!is_null($majorGridlines->getLineStyleProperty(array('arrow', 'end', 'type')))) { + $objWriter->startElement('a:tailEnd'); + $objWriter->writeAttribute('type', $majorGridlines->getLineStyleProperty(array('arrow', 'end', 'type'))); + $objWriter->writeAttribute('w', $majorGridlines->getLineStyleArrowParameters('end', 'w')); + $objWriter->writeAttribute('len', $majorGridlines->getLineStyleArrowParameters('end', 'len')); + $objWriter->endElement(); + } + $objWriter->endElement(); //end ln + } + $objWriter->startElement('a:effectLst'); + + if (!is_null($majorGridlines->getGlowSize())) { + $objWriter->startElement('a:glow'); + $objWriter->writeAttribute('rad', $majorGridlines->getGlowSize()); + $objWriter->startElement("a:{$majorGridlines->getGlowColor('type')}"); + $objWriter->writeAttribute('val', $majorGridlines->getGlowColor('value')); + $objWriter->startElement('a:alpha'); + $objWriter->writeAttribute('val', $majorGridlines->getGlowColor('alpha')); + $objWriter->endElement(); //end alpha + $objWriter->endElement(); //end schemeClr + $objWriter->endElement(); //end glow + } + + if (!is_null($majorGridlines->getShadowProperty('presets'))) { + $objWriter->startElement("a:{$majorGridlines->getShadowProperty('effect')}"); + if (!is_null($majorGridlines->getShadowProperty('blur'))) { + $objWriter->writeAttribute('blurRad', $majorGridlines->getShadowProperty('blur')); + } + if (!is_null($majorGridlines->getShadowProperty('distance'))) { + $objWriter->writeAttribute('dist', $majorGridlines->getShadowProperty('distance')); + } + if (!is_null($majorGridlines->getShadowProperty('direction'))) { + $objWriter->writeAttribute('dir', $majorGridlines->getShadowProperty('direction')); + } + if (!is_null($majorGridlines->getShadowProperty('algn'))) { + $objWriter->writeAttribute('algn', $majorGridlines->getShadowProperty('algn')); + } + if (!is_null($majorGridlines->getShadowProperty(array('size', 'sx')))) { + $objWriter->writeAttribute('sx', $majorGridlines->getShadowProperty(array('size', 'sx'))); + } + if (!is_null($majorGridlines->getShadowProperty(array('size', 'sy')))) { + $objWriter->writeAttribute('sy', $majorGridlines->getShadowProperty(array('size', 'sy'))); + } + if (!is_null($majorGridlines->getShadowProperty(array('size', 'kx')))) { + $objWriter->writeAttribute('kx', $majorGridlines->getShadowProperty(array('size', 'kx'))); + } + if (!is_null($majorGridlines->getShadowProperty('rotWithShape'))) { + $objWriter->writeAttribute('rotWithShape', $majorGridlines->getShadowProperty('rotWithShape')); + } + $objWriter->startElement("a:{$majorGridlines->getShadowProperty(array('color', 'type'))}"); + $objWriter->writeAttribute('val', $majorGridlines->getShadowProperty(array('color', 'value'))); + + $objWriter->startElement('a:alpha'); + $objWriter->writeAttribute('val', $majorGridlines->getShadowProperty(array('color', 'alpha'))); + $objWriter->endElement(); //end alpha + + $objWriter->endElement(); //end color:type + $objWriter->endElement(); //end shadow + } + + if (!is_null($majorGridlines->getSoftEdgesSize())) { + $objWriter->startElement('a:softEdge'); + $objWriter->writeAttribute('rad', $majorGridlines->getSoftEdgesSize()); + $objWriter->endElement(); //end softEdge + } + + $objWriter->endElement(); //end effectLst + $objWriter->endElement(); //end spPr + $objWriter->endElement(); //end majorGridLines + + if ($minorGridlines->getObjectState()) { + $objWriter->startElement('c:minorGridlines'); + $objWriter->startElement('c:spPr'); + + if (!is_null($minorGridlines->getLineColorProperty('value'))) { + $objWriter->startElement('a:ln'); + $objWriter->writeAttribute('w', $minorGridlines->getLineStyleProperty('width')); + $objWriter->startElement('a:solidFill'); + $objWriter->startElement("a:{$minorGridlines->getLineColorProperty('type')}"); + $objWriter->writeAttribute('val', $minorGridlines->getLineColorProperty('value')); + $objWriter->startElement('a:alpha'); + $objWriter->writeAttribute('val', $minorGridlines->getLineColorProperty('alpha')); + $objWriter->endElement(); //end alpha + $objWriter->endElement(); //end srgbClr + $objWriter->endElement(); //end solidFill + + $objWriter->startElement('a:prstDash'); + $objWriter->writeAttribute('val', $minorGridlines->getLineStyleProperty('dash')); + $objWriter->endElement(); + + if ($minorGridlines->getLineStyleProperty('join') == 'miter') { + $objWriter->startElement('a:miter'); + $objWriter->writeAttribute('lim', '800000'); + $objWriter->endElement(); + } else { + $objWriter->startElement('a:bevel'); + $objWriter->endElement(); + } + + if (!is_null($minorGridlines->getLineStyleProperty(array('arrow', 'head', 'type')))) { + $objWriter->startElement('a:headEnd'); + $objWriter->writeAttribute('type', $minorGridlines->getLineStyleProperty(array('arrow', 'head', 'type'))); + $objWriter->writeAttribute('w', $minorGridlines->getLineStyleArrowParameters('head', 'w')); + $objWriter->writeAttribute('len', $minorGridlines->getLineStyleArrowParameters('head', 'len')); + $objWriter->endElement(); + } + + if (!is_null($minorGridlines->getLineStyleProperty(array('arrow', 'end', 'type')))) { + $objWriter->startElement('a:tailEnd'); + $objWriter->writeAttribute('type', $minorGridlines->getLineStyleProperty(array('arrow', 'end', 'type'))); + $objWriter->writeAttribute('w', $minorGridlines->getLineStyleArrowParameters('end', 'w')); + $objWriter->writeAttribute('len', $minorGridlines->getLineStyleArrowParameters('end', 'len')); + $objWriter->endElement(); + } + $objWriter->endElement(); //end ln + } + + $objWriter->startElement('a:effectLst'); + + if (!is_null($minorGridlines->getGlowSize())) { + $objWriter->startElement('a:glow'); + $objWriter->writeAttribute('rad', $minorGridlines->getGlowSize()); + $objWriter->startElement("a:{$minorGridlines->getGlowColor('type')}"); + $objWriter->writeAttribute('val', $minorGridlines->getGlowColor('value')); + $objWriter->startElement('a:alpha'); + $objWriter->writeAttribute('val', $minorGridlines->getGlowColor('alpha')); + $objWriter->endElement(); //end alpha + $objWriter->endElement(); //end schemeClr + $objWriter->endElement(); //end glow + } + + if (!is_null($minorGridlines->getShadowProperty('presets'))) { + $objWriter->startElement("a:{$minorGridlines->getShadowProperty('effect')}"); + if (!is_null($minorGridlines->getShadowProperty('blur'))) { + $objWriter->writeAttribute('blurRad', $minorGridlines->getShadowProperty('blur')); + } + if (!is_null($minorGridlines->getShadowProperty('distance'))) { + $objWriter->writeAttribute('dist', $minorGridlines->getShadowProperty('distance')); + } + if (!is_null($minorGridlines->getShadowProperty('direction'))) { + $objWriter->writeAttribute('dir', $minorGridlines->getShadowProperty('direction')); + } + if (!is_null($minorGridlines->getShadowProperty('algn'))) { + $objWriter->writeAttribute('algn', $minorGridlines->getShadowProperty('algn')); + } + if (!is_null($minorGridlines->getShadowProperty(array('size', 'sx')))) { + $objWriter->writeAttribute('sx', $minorGridlines->getShadowProperty(array('size', 'sx'))); + } + if (!is_null($minorGridlines->getShadowProperty(array('size', 'sy')))) { + $objWriter->writeAttribute('sy', $minorGridlines->getShadowProperty(array('size', 'sy'))); + } + if (!is_null($minorGridlines->getShadowProperty(array('size', 'kx')))) { + $objWriter->writeAttribute('kx', $minorGridlines->getShadowProperty(array('size', 'kx'))); + } + if (!is_null($minorGridlines->getShadowProperty('rotWithShape'))) { + $objWriter->writeAttribute('rotWithShape', $minorGridlines->getShadowProperty('rotWithShape')); + } + $objWriter->startElement("a:{$minorGridlines->getShadowProperty(array('color', 'type'))}"); + $objWriter->writeAttribute('val', $minorGridlines->getShadowProperty(array('color', 'value'))); + $objWriter->startElement('a:alpha'); + $objWriter->writeAttribute('val', $minorGridlines->getShadowProperty(array('color', 'alpha'))); + $objWriter->endElement(); //end alpha + $objWriter->endElement(); //end color:type + $objWriter->endElement(); //end shadow + } + + if (!is_null($minorGridlines->getSoftEdgesSize())) { + $objWriter->startElement('a:softEdge'); + $objWriter->writeAttribute('rad', $minorGridlines->getSoftEdgesSize()); + $objWriter->endElement(); //end softEdge + } + + $objWriter->endElement(); //end effectLst + $objWriter->endElement(); //end spPr + $objWriter->endElement(); //end minorGridLines + } + + if (!is_null($yAxisLabel)) { + $objWriter->startElement('c:title'); + $objWriter->startElement('c:tx'); + $objWriter->startElement('c:rich'); + + $objWriter->startElement('a:bodyPr'); + $objWriter->endElement(); + + $objWriter->startElement('a:lstStyle'); + $objWriter->endElement(); + + $objWriter->startElement('a:p'); + $objWriter->startElement('a:r'); + + $caption = $yAxisLabel->getCaption(); + if (is_array($caption)) { + $caption = $caption[0]; + } + + $objWriter->startElement('a:t'); + // $objWriter->writeAttribute('xml:space', 'preserve'); + $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML($caption)); + $objWriter->endElement(); + + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + + if ($groupType !== PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) { + $layout = $yAxisLabel->getLayout(); + $this->writeLayout($layout, $objWriter); + } + + $objWriter->startElement('c:overlay'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + + $objWriter->endElement(); + } + + $objWriter->startElement('c:numFmt'); + $objWriter->writeAttribute('formatCode', $xAxis->getAxisNumberFormat()); + $objWriter->writeAttribute('sourceLinked', $xAxis->getAxisNumberSourceLinked()); + $objWriter->endElement(); + + $objWriter->startElement('c:majorTickMark'); + $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('major_tick_mark')); + $objWriter->endElement(); + + $objWriter->startElement('c:minorTickMark'); + $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('minor_tick_mark')); + $objWriter->endElement(); + + $objWriter->startElement('c:tickLblPos'); + $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('axis_labels')); + $objWriter->endElement(); + + $objWriter->startElement('c:spPr'); + + if (!is_null($xAxis->getFillProperty('value'))) { + $objWriter->startElement('a:solidFill'); + $objWriter->startElement("a:" . $xAxis->getFillProperty('type')); + $objWriter->writeAttribute('val', $xAxis->getFillProperty('value')); + $objWriter->startElement('a:alpha'); + $objWriter->writeAttribute('val', $xAxis->getFillProperty('alpha')); + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + } + + $objWriter->startElement('a:ln'); + + $objWriter->writeAttribute('w', $xAxis->getLineStyleProperty('width')); + $objWriter->writeAttribute('cap', $xAxis->getLineStyleProperty('cap')); + $objWriter->writeAttribute('cmpd', $xAxis->getLineStyleProperty('compound')); + + if (!is_null($xAxis->getLineProperty('value'))) { + $objWriter->startElement('a:solidFill'); + $objWriter->startElement("a:" . $xAxis->getLineProperty('type')); + $objWriter->writeAttribute('val', $xAxis->getLineProperty('value')); + $objWriter->startElement('a:alpha'); + $objWriter->writeAttribute('val', $xAxis->getLineProperty('alpha')); + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + } + + $objWriter->startElement('a:prstDash'); + $objWriter->writeAttribute('val', $xAxis->getLineStyleProperty('dash')); + $objWriter->endElement(); + + if ($xAxis->getLineStyleProperty('join') == 'miter') { + $objWriter->startElement('a:miter'); + $objWriter->writeAttribute('lim', '800000'); + $objWriter->endElement(); + } else { + $objWriter->startElement('a:bevel'); + $objWriter->endElement(); + } + + if (!is_null($xAxis->getLineStyleProperty(array('arrow', 'head', 'type')))) { + $objWriter->startElement('a:headEnd'); + $objWriter->writeAttribute('type', $xAxis->getLineStyleProperty(array('arrow', 'head', 'type'))); + $objWriter->writeAttribute('w', $xAxis->getLineStyleArrowWidth('head')); + $objWriter->writeAttribute('len', $xAxis->getLineStyleArrowLength('head')); + $objWriter->endElement(); + } + + if (!is_null($xAxis->getLineStyleProperty(array('arrow', 'end', 'type')))) { + $objWriter->startElement('a:tailEnd'); + $objWriter->writeAttribute('type', $xAxis->getLineStyleProperty(array('arrow', 'end', 'type'))); + $objWriter->writeAttribute('w', $xAxis->getLineStyleArrowWidth('end')); + $objWriter->writeAttribute('len', $xAxis->getLineStyleArrowLength('end')); + $objWriter->endElement(); + } + + $objWriter->endElement(); + + $objWriter->startElement('a:effectLst'); + + if (!is_null($xAxis->getGlowProperty('size'))) { + $objWriter->startElement('a:glow'); + $objWriter->writeAttribute('rad', $xAxis->getGlowProperty('size')); + $objWriter->startElement("a:{$xAxis->getGlowProperty(array('color','type'))}"); + $objWriter->writeAttribute('val', $xAxis->getGlowProperty(array('color','value'))); + $objWriter->startElement('a:alpha'); + $objWriter->writeAttribute('val', $xAxis->getGlowProperty(array('color','alpha'))); + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + } + + if (!is_null($xAxis->getShadowProperty('presets'))) { + $objWriter->startElement("a:{$xAxis->getShadowProperty('effect')}"); + + if (!is_null($xAxis->getShadowProperty('blur'))) { + $objWriter->writeAttribute('blurRad', $xAxis->getShadowProperty('blur')); + } + if (!is_null($xAxis->getShadowProperty('distance'))) { + $objWriter->writeAttribute('dist', $xAxis->getShadowProperty('distance')); + } + if (!is_null($xAxis->getShadowProperty('direction'))) { + $objWriter->writeAttribute('dir', $xAxis->getShadowProperty('direction')); + } + if (!is_null($xAxis->getShadowProperty('algn'))) { + $objWriter->writeAttribute('algn', $xAxis->getShadowProperty('algn')); + } + if (!is_null($xAxis->getShadowProperty(array('size','sx')))) { + $objWriter->writeAttribute('sx', $xAxis->getShadowProperty(array('size','sx'))); + } + if (!is_null($xAxis->getShadowProperty(array('size','sy')))) { + $objWriter->writeAttribute('sy', $xAxis->getShadowProperty(array('size','sy'))); + } + if (!is_null($xAxis->getShadowProperty(array('size','kx')))) { + $objWriter->writeAttribute('kx', $xAxis->getShadowProperty(array('size','kx'))); + } + if (!is_null($xAxis->getShadowProperty('rotWithShape'))) { + $objWriter->writeAttribute('rotWithShape', $xAxis->getShadowProperty('rotWithShape')); + } + + $objWriter->startElement("a:{$xAxis->getShadowProperty(array('color','type'))}"); + $objWriter->writeAttribute('val', $xAxis->getShadowProperty(array('color','value'))); + $objWriter->startElement('a:alpha'); + $objWriter->writeAttribute('val', $xAxis->getShadowProperty(array('color','alpha'))); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->endElement(); + } + + if (!is_null($xAxis->getSoftEdgesSize())) { + $objWriter->startElement('a:softEdge'); + $objWriter->writeAttribute('rad', $xAxis->getSoftEdgesSize()); + $objWriter->endElement(); + } + + $objWriter->endElement(); //effectList + $objWriter->endElement(); //end spPr + + if ($id1 > 0) { + $objWriter->startElement('c:crossAx'); + $objWriter->writeAttribute('val', $id2); + $objWriter->endElement(); + + if (!is_null($xAxis->getAxisOptionsProperty('horizontal_crosses_value'))) { + $objWriter->startElement('c:crossesAt'); + $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('horizontal_crosses_value')); + $objWriter->endElement(); + } else { + $objWriter->startElement('c:crosses'); + $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('horizontal_crosses')); + $objWriter->endElement(); + } + + $objWriter->startElement('c:crossBetween'); + $objWriter->writeAttribute('val', "midCat"); + $objWriter->endElement(); + + if (!is_null($xAxis->getAxisOptionsProperty('major_unit'))) { + $objWriter->startElement('c:majorUnit'); + $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('major_unit')); + $objWriter->endElement(); + } + + if (!is_null($xAxis->getAxisOptionsProperty('minor_unit'))) { + $objWriter->startElement('c:minorUnit'); + $objWriter->writeAttribute('val', $xAxis->getAxisOptionsProperty('minor_unit')); + $objWriter->endElement(); + } + } + + if ($isMultiLevelSeries) { + if ($groupType !== PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) { + $objWriter->startElement('c:noMultiLvlLbl'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + } + } + + $objWriter->endElement(); + } + + /** + * Get the data series type(s) for a chart plot series + * + * @param PHPExcel_Chart_PlotArea $plotArea + * + * @return string|array + * @throws PHPExcel_Writer_Exception + */ + private static function getChartType($plotArea) + { + $groupCount = $plotArea->getPlotGroupCount(); + + if ($groupCount == 1) { + $chartType = array($plotArea->getPlotGroupByIndex(0)->getPlotType()); + } else { + $chartTypes = array(); + for ($i = 0; $i < $groupCount; ++$i) { + $chartTypes[] = $plotArea->getPlotGroupByIndex($i)->getPlotType(); + } + $chartType = array_unique($chartTypes); + if (count($chartTypes) == 0) { + throw new PHPExcel_Writer_Exception('Chart is not yet implemented'); + } + } + + return $chartType; + } + + /** + * Write Plot Group (series of related plots) + * + * @param PHPExcel_Chart_DataSeries $plotGroup + * @param string $groupType Type of plot for dataseries + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param boolean &$catIsMultiLevelSeries Is category a multi-series category + * @param boolean &$valIsMultiLevelSeries Is value set a multi-series set + * @param string &$plotGroupingType Type of grouping for multi-series values + * @param PHPExcel_Worksheet $pSheet + * + * @throws PHPExcel_Writer_Exception + */ + private function writePlotGroup($plotGroup, $groupType, $objWriter, &$catIsMultiLevelSeries, &$valIsMultiLevelSeries, &$plotGroupingType, PHPExcel_Worksheet $pSheet) + { + if (is_null($plotGroup)) { + return; + } + + if (($groupType == PHPExcel_Chart_DataSeries::TYPE_BARCHART) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_BARCHART_3D)) { + $objWriter->startElement('c:barDir'); + $objWriter->writeAttribute('val', $plotGroup->getPlotDirection()); + $objWriter->endElement(); + } + + if (!is_null($plotGroup->getPlotGrouping())) { + $plotGroupingType = $plotGroup->getPlotGrouping(); + $objWriter->startElement('c:grouping'); + $objWriter->writeAttribute('val', $plotGroupingType); + $objWriter->endElement(); + } + + // Get these details before the loop, because we can use the count to check for varyColors + $plotSeriesOrder = $plotGroup->getPlotOrder(); + $plotSeriesCount = count($plotSeriesOrder); + + if (($groupType !== PHPExcel_Chart_DataSeries::TYPE_RADARCHART) && ($groupType !== PHPExcel_Chart_DataSeries::TYPE_STOCKCHART)) { + if ($groupType !== PHPExcel_Chart_DataSeries::TYPE_LINECHART) { + if (($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_DONUTCHART) || ($plotSeriesCount > 1)) { + $objWriter->startElement('c:varyColors'); + $objWriter->writeAttribute('val', 1); + $objWriter->endElement(); + } else { + $objWriter->startElement('c:varyColors'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + } + } + } + + foreach ($plotSeriesOrder as $plotSeriesIdx => $plotSeriesRef) { + $objWriter->startElement('c:ser'); + + $objWriter->startElement('c:idx'); + $objWriter->writeAttribute('val', $this->_seriesIndex + $plotSeriesIdx); + $objWriter->endElement(); + + $objWriter->startElement('c:order'); + $objWriter->writeAttribute('val', $this->_seriesIndex + $plotSeriesRef); + $objWriter->endElement(); + + if (($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) { + $objWriter->startElement('c:dPt'); + $objWriter->startElement('c:idx'); + $objWriter->writeAttribute('val', 3); + $objWriter->endElement(); + + $objWriter->startElement('c:bubble3D'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + + $objWriter->startElement('c:spPr'); + $objWriter->startElement('a:solidFill'); + $objWriter->startElement('a:srgbClr'); + $objWriter->writeAttribute('val', 'FF9900'); + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + } + + // Labels + $plotSeriesLabel = $plotGroup->getPlotLabelByIndex($plotSeriesRef); + if ($plotSeriesLabel && ($plotSeriesLabel->getPointCount() > 0)) { + $objWriter->startElement('c:tx'); + $objWriter->startElement('c:strRef'); + $this->writePlotSeriesLabel($plotSeriesLabel, $objWriter); + $objWriter->endElement(); + $objWriter->endElement(); + } + + // Formatting for the points + if (($groupType == PHPExcel_Chart_DataSeries::TYPE_LINECHART) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_STOCKCHART)) { + $objWriter->startElement('c:spPr'); + $objWriter->startElement('a:ln'); + $objWriter->writeAttribute('w', 12700); + if ($groupType == PHPExcel_Chart_DataSeries::TYPE_STOCKCHART) { + $objWriter->startElement('a:noFill'); + $objWriter->endElement(); + } + $objWriter->endElement(); + $objWriter->endElement(); + } + + $plotSeriesValues = $plotGroup->getPlotValuesByIndex($plotSeriesRef); + if ($plotSeriesValues) { + $plotSeriesMarker = $plotSeriesValues->getPointMarker(); + if ($plotSeriesMarker) { + $objWriter->startElement('c:marker'); + $objWriter->startElement('c:symbol'); + $objWriter->writeAttribute('val', $plotSeriesMarker); + $objWriter->endElement(); + + if ($plotSeriesMarker !== 'none') { + $objWriter->startElement('c:size'); + $objWriter->writeAttribute('val', 3); + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + } + + if (($groupType === PHPExcel_Chart_DataSeries::TYPE_BARCHART) || ($groupType === PHPExcel_Chart_DataSeries::TYPE_BARCHART_3D) || ($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART)) { + $objWriter->startElement('c:invertIfNegative'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + } + + // Category Labels + $plotSeriesCategory = $plotGroup->getPlotCategoryByIndex($plotSeriesRef); + if ($plotSeriesCategory && ($plotSeriesCategory->getPointCount() > 0)) { + $catIsMultiLevelSeries = $catIsMultiLevelSeries || $plotSeriesCategory->isMultiLevelSeries(); + + if (($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) || ($groupType == PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) { + if (!is_null($plotGroup->getPlotStyle())) { + $plotStyle = $plotGroup->getPlotStyle(); + if ($plotStyle) { + $objWriter->startElement('c:explosion'); + $objWriter->writeAttribute('val', 25); + $objWriter->endElement(); + } + } + } + + if (($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) || ($groupType === PHPExcel_Chart_DataSeries::TYPE_SCATTERCHART)) { + $objWriter->startElement('c:xVal'); + } else { + $objWriter->startElement('c:cat'); + } + + $this->writePlotSeriesValues($plotSeriesCategory, $objWriter, $groupType, 'str', $pSheet); + $objWriter->endElement(); + } + + // Values + if ($plotSeriesValues) { + $valIsMultiLevelSeries = $valIsMultiLevelSeries || $plotSeriesValues->isMultiLevelSeries(); + + if (($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) || ($groupType === PHPExcel_Chart_DataSeries::TYPE_SCATTERCHART)) { + $objWriter->startElement('c:yVal'); + } else { + $objWriter->startElement('c:val'); + } + + $this->writePlotSeriesValues($plotSeriesValues, $objWriter, $groupType, 'num', $pSheet); + $objWriter->endElement(); + } + + if ($groupType === PHPExcel_Chart_DataSeries::TYPE_BUBBLECHART) { + $this->writeBubbles($plotSeriesValues, $objWriter, $pSheet); + } + + $objWriter->endElement(); + } + + $this->_seriesIndex += $plotSeriesIdx + 1; + } + + /** + * Write Plot Series Label + * + * @param PHPExcel_Chart_DataSeriesValues $plotSeriesLabel + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * + * @throws PHPExcel_Writer_Exception + */ + private function writePlotSeriesLabel($plotSeriesLabel, $objWriter) + { + if (is_null($plotSeriesLabel)) { + return; + } + + $objWriter->startElement('c:f'); + $objWriter->writeRawData($plotSeriesLabel->getDataSource()); + $objWriter->endElement(); + + $objWriter->startElement('c:strCache'); + $objWriter->startElement('c:ptCount'); + $objWriter->writeAttribute('val', $plotSeriesLabel->getPointCount()); + $objWriter->endElement(); + + foreach ($plotSeriesLabel->getDataValues() as $plotLabelKey => $plotLabelValue) { + $objWriter->startElement('c:pt'); + $objWriter->writeAttribute('idx', $plotLabelKey); + + $objWriter->startElement('c:v'); + $objWriter->writeRawData($plotLabelValue); + $objWriter->endElement(); + $objWriter->endElement(); + } + $objWriter->endElement(); + } + + /** + * Write Plot Series Values + * + * @param PHPExcel_Chart_DataSeriesValues $plotSeriesValues + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param string $groupType Type of plot for dataseries + * @param string $dataType Datatype of series values + * @param PHPExcel_Worksheet $pSheet + * + * @throws PHPExcel_Writer_Exception + */ + private function writePlotSeriesValues($plotSeriesValues, $objWriter, $groupType, $dataType = 'str', PHPExcel_Worksheet $pSheet) + { + if (is_null($plotSeriesValues)) { + return; + } + + if ($plotSeriesValues->isMultiLevelSeries()) { + $levelCount = $plotSeriesValues->multiLevelCount(); + + $objWriter->startElement('c:multiLvlStrRef'); + + $objWriter->startElement('c:f'); + $objWriter->writeRawData($plotSeriesValues->getDataSource()); + $objWriter->endElement(); + + $objWriter->startElement('c:multiLvlStrCache'); + + $objWriter->startElement('c:ptCount'); + $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount()); + $objWriter->endElement(); + + for ($level = 0; $level < $levelCount; ++$level) { + $objWriter->startElement('c:lvl'); + + foreach ($plotSeriesValues->getDataValues() as $plotSeriesKey => $plotSeriesValue) { + if (isset($plotSeriesValue[$level])) { + $objWriter->startElement('c:pt'); + $objWriter->writeAttribute('idx', $plotSeriesKey); + + $objWriter->startElement('c:v'); + $objWriter->writeRawData($plotSeriesValue[$level]); + $objWriter->endElement(); + $objWriter->endElement(); + } + } + + $objWriter->endElement(); + } + + $objWriter->endElement(); + + $objWriter->endElement(); + } else { + $objWriter->startElement('c:' . $dataType . 'Ref'); + + $objWriter->startElement('c:f'); + $objWriter->writeRawData($plotSeriesValues->getDataSource()); + $objWriter->endElement(); + + $objWriter->startElement('c:' . $dataType . 'Cache'); + + if (($groupType != PHPExcel_Chart_DataSeries::TYPE_PIECHART) && ($groupType != PHPExcel_Chart_DataSeries::TYPE_PIECHART_3D) && ($groupType != PHPExcel_Chart_DataSeries::TYPE_DONUTCHART)) { + if (($plotSeriesValues->getFormatCode() !== null) && ($plotSeriesValues->getFormatCode() !== '')) { + $objWriter->startElement('c:formatCode'); + $objWriter->writeRawData($plotSeriesValues->getFormatCode()); + $objWriter->endElement(); + } + } + + $objWriter->startElement('c:ptCount'); + $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount()); + $objWriter->endElement(); + + $dataValues = $plotSeriesValues->getDataValues(); + if (!empty($dataValues)) { + if (is_array($dataValues)) { + foreach ($dataValues as $plotSeriesKey => $plotSeriesValue) { + $objWriter->startElement('c:pt'); + $objWriter->writeAttribute('idx', $plotSeriesKey); + + $objWriter->startElement('c:v'); + $objWriter->writeRawData($plotSeriesValue); + $objWriter->endElement(); + $objWriter->endElement(); + } + } + } + + $objWriter->endElement(); + + $objWriter->endElement(); + } + } + + /** + * Write Bubble Chart Details + * + * @param PHPExcel_Chart_DataSeriesValues $plotSeriesValues + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * + * @throws PHPExcel_Writer_Exception + */ + private function writeBubbles($plotSeriesValues, $objWriter, PHPExcel_Worksheet $pSheet) + { + if (is_null($plotSeriesValues)) { + return; + } + + $objWriter->startElement('c:bubbleSize'); + $objWriter->startElement('c:numLit'); + + $objWriter->startElement('c:formatCode'); + $objWriter->writeRawData('General'); + $objWriter->endElement(); + + $objWriter->startElement('c:ptCount'); + $objWriter->writeAttribute('val', $plotSeriesValues->getPointCount()); + $objWriter->endElement(); + + $dataValues = $plotSeriesValues->getDataValues(); + if (!empty($dataValues)) { + if (is_array($dataValues)) { + foreach ($dataValues as $plotSeriesKey => $plotSeriesValue) { + $objWriter->startElement('c:pt'); + $objWriter->writeAttribute('idx', $plotSeriesKey); + $objWriter->startElement('c:v'); + $objWriter->writeRawData(1); + $objWriter->endElement(); + $objWriter->endElement(); + } + } + } + + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('c:bubble3D'); + $objWriter->writeAttribute('val', 0); + $objWriter->endElement(); + } + + /** + * Write Layout + * + * @param PHPExcel_Chart_Layout $layout + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * + * @throws PHPExcel_Writer_Exception + */ + private function writeLayout(PHPExcel_Chart_Layout $layout = null, $objWriter) + { + $objWriter->startElement('c:layout'); + + if (!is_null($layout)) { + $objWriter->startElement('c:manualLayout'); + + $layoutTarget = $layout->getLayoutTarget(); + if (!is_null($layoutTarget)) { + $objWriter->startElement('c:layoutTarget'); + $objWriter->writeAttribute('val', $layoutTarget); + $objWriter->endElement(); + } + + $xMode = $layout->getXMode(); + if (!is_null($xMode)) { + $objWriter->startElement('c:xMode'); + $objWriter->writeAttribute('val', $xMode); + $objWriter->endElement(); + } + + $yMode = $layout->getYMode(); + if (!is_null($yMode)) { + $objWriter->startElement('c:yMode'); + $objWriter->writeAttribute('val', $yMode); + $objWriter->endElement(); + } + + $x = $layout->getXPosition(); + if (!is_null($x)) { + $objWriter->startElement('c:x'); + $objWriter->writeAttribute('val', $x); + $objWriter->endElement(); + } + + $y = $layout->getYPosition(); + if (!is_null($y)) { + $objWriter->startElement('c:y'); + $objWriter->writeAttribute('val', $y); + $objWriter->endElement(); + } + + $w = $layout->getWidth(); + if (!is_null($w)) { + $objWriter->startElement('c:w'); + $objWriter->writeAttribute('val', $w); + $objWriter->endElement(); + } + + $h = $layout->getHeight(); + if (!is_null($h)) { + $objWriter->startElement('c:h'); + $objWriter->writeAttribute('val', $h); + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + + /** + * Write Alternate Content block + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * + * @throws PHPExcel_Writer_Exception + */ + private function writeAlternateContent($objWriter) + { + $objWriter->startElement('mc:AlternateContent'); + $objWriter->writeAttribute('xmlns:mc', 'http://schemas.openxmlformats.org/markup-compatibility/2006'); + + $objWriter->startElement('mc:Choice'); + $objWriter->writeAttribute('xmlns:c14', 'http://schemas.microsoft.com/office/drawing/2007/8/2/chart'); + $objWriter->writeAttribute('Requires', 'c14'); + + $objWriter->startElement('c14:style'); + $objWriter->writeAttribute('val', '102'); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('mc:Fallback'); + $objWriter->startElement('c:style'); + $objWriter->writeAttribute('val', '2'); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->endElement(); + } + + /** + * Write Printer Settings + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * + * @throws PHPExcel_Writer_Exception + */ + private function writePrintSettings($objWriter) + { + $objWriter->startElement('c:printSettings'); + + $objWriter->startElement('c:headerFooter'); + $objWriter->endElement(); + + $objWriter->startElement('c:pageMargins'); + $objWriter->writeAttribute('footer', 0.3); + $objWriter->writeAttribute('header', 0.3); + $objWriter->writeAttribute('r', 0.7); + $objWriter->writeAttribute('l', 0.7); + $objWriter->writeAttribute('t', 0.75); + $objWriter->writeAttribute('b', 0.75); + $objWriter->endElement(); + + $objWriter->startElement('c:pageSetup'); + $objWriter->writeAttribute('orientation', "portrait"); + $objWriter->endElement(); + + $objWriter->endElement(); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Comments.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Comments.php new file mode 100644 index 0000000..7139f6c --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Comments.php @@ -0,0 +1,260 @@ +<?php + +/** + * PHPExcel_Writer_Excel2007_Comments + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_Excel2007_Comments extends PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Write comments to XML format + * + * @param PHPExcel_Worksheet $pWorksheet + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeComments(PHPExcel_Worksheet $pWorksheet = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + // Comments cache + $comments = $pWorksheet->getComments(); + + // Authors cache + $authors = array(); + $authorId = 0; + foreach ($comments as $comment) { + if (!isset($authors[$comment->getAuthor()])) { + $authors[$comment->getAuthor()] = $authorId++; + } + } + + // comments + $objWriter->startElement('comments'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'); + + // Loop through authors + $objWriter->startElement('authors'); + foreach ($authors as $author => $index) { + $objWriter->writeElement('author', $author); + } + $objWriter->endElement(); + + // Loop through comments + $objWriter->startElement('commentList'); + foreach ($comments as $key => $value) { + $this->writeComment($objWriter, $key, $value, $authors); + } + $objWriter->endElement(); + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write comment to XML format + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param string $pCellReference Cell reference + * @param PHPExcel_Comment $pComment Comment + * @param array $pAuthors Array of authors + * @throws PHPExcel_Writer_Exception + */ + private function writeComment(PHPExcel_Shared_XMLWriter $objWriter = null, $pCellReference = 'A1', PHPExcel_Comment $pComment = null, $pAuthors = null) + { + // comment + $objWriter->startElement('comment'); + $objWriter->writeAttribute('ref', $pCellReference); + $objWriter->writeAttribute('authorId', $pAuthors[$pComment->getAuthor()]); + + // text + $objWriter->startElement('text'); + $this->getParentWriter()->getWriterPart('stringtable')->writeRichText($objWriter, $pComment->getText()); + $objWriter->endElement(); + + $objWriter->endElement(); + } + + /** + * Write VML comments to XML format + * + * @param PHPExcel_Worksheet $pWorksheet + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeVMLComments(PHPExcel_Worksheet $pWorksheet = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + // Comments cache + $comments = $pWorksheet->getComments(); + + // xml + $objWriter->startElement('xml'); + $objWriter->writeAttribute('xmlns:v', 'urn:schemas-microsoft-com:vml'); + $objWriter->writeAttribute('xmlns:o', 'urn:schemas-microsoft-com:office:office'); + $objWriter->writeAttribute('xmlns:x', 'urn:schemas-microsoft-com:office:excel'); + + // o:shapelayout + $objWriter->startElement('o:shapelayout'); + $objWriter->writeAttribute('v:ext', 'edit'); + + // o:idmap + $objWriter->startElement('o:idmap'); + $objWriter->writeAttribute('v:ext', 'edit'); + $objWriter->writeAttribute('data', '1'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // v:shapetype + $objWriter->startElement('v:shapetype'); + $objWriter->writeAttribute('id', '_x0000_t202'); + $objWriter->writeAttribute('coordsize', '21600,21600'); + $objWriter->writeAttribute('o:spt', '202'); + $objWriter->writeAttribute('path', 'm,l,21600r21600,l21600,xe'); + + // v:stroke + $objWriter->startElement('v:stroke'); + $objWriter->writeAttribute('joinstyle', 'miter'); + $objWriter->endElement(); + + // v:path + $objWriter->startElement('v:path'); + $objWriter->writeAttribute('gradientshapeok', 't'); + $objWriter->writeAttribute('o:connecttype', 'rect'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // Loop through comments + foreach ($comments as $key => $value) { + $this->writeVMLComment($objWriter, $key, $value); + } + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write VML comment to XML format + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param string $pCellReference Cell reference + * @param PHPExcel_Comment $pComment Comment + * @throws PHPExcel_Writer_Exception + */ + private function writeVMLComment(PHPExcel_Shared_XMLWriter $objWriter = null, $pCellReference = 'A1', PHPExcel_Comment $pComment = null) + { + // Metadata + list($column, $row) = PHPExcel_Cell::coordinateFromString($pCellReference); + $column = PHPExcel_Cell::columnIndexFromString($column); + $id = 1024 + $column + $row; + $id = substr($id, 0, 4); + + // v:shape + $objWriter->startElement('v:shape'); + $objWriter->writeAttribute('id', '_x0000_s' . $id); + $objWriter->writeAttribute('type', '#_x0000_t202'); + $objWriter->writeAttribute('style', 'position:absolute;margin-left:' . $pComment->getMarginLeft() . ';margin-top:' . $pComment->getMarginTop() . ';width:' . $pComment->getWidth() . ';height:' . $pComment->getHeight() . ';z-index:1;visibility:' . ($pComment->getVisible() ? 'visible' : 'hidden')); + $objWriter->writeAttribute('fillcolor', '#' . $pComment->getFillColor()->getRGB()); + $objWriter->writeAttribute('o:insetmode', 'auto'); + + // v:fill + $objWriter->startElement('v:fill'); + $objWriter->writeAttribute('color2', '#' . $pComment->getFillColor()->getRGB()); + $objWriter->endElement(); + + // v:shadow + $objWriter->startElement('v:shadow'); + $objWriter->writeAttribute('on', 't'); + $objWriter->writeAttribute('color', 'black'); + $objWriter->writeAttribute('obscured', 't'); + $objWriter->endElement(); + + // v:path + $objWriter->startElement('v:path'); + $objWriter->writeAttribute('o:connecttype', 'none'); + $objWriter->endElement(); + + // v:textbox + $objWriter->startElement('v:textbox'); + $objWriter->writeAttribute('style', 'mso-direction-alt:auto'); + + // div + $objWriter->startElement('div'); + $objWriter->writeAttribute('style', 'text-align:left'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // x:ClientData + $objWriter->startElement('x:ClientData'); + $objWriter->writeAttribute('ObjectType', 'Note'); + + // x:MoveWithCells + $objWriter->writeElement('x:MoveWithCells', ''); + + // x:SizeWithCells + $objWriter->writeElement('x:SizeWithCells', ''); + + // x:Anchor + //$objWriter->writeElement('x:Anchor', $column . ', 15, ' . ($row - 2) . ', 10, ' . ($column + 4) . ', 15, ' . ($row + 5) . ', 18'); + + // x:AutoFill + $objWriter->writeElement('x:AutoFill', 'False'); + + // x:Row + $objWriter->writeElement('x:Row', ($row - 1)); + + // x:Column + $objWriter->writeElement('x:Column', ($column - 1)); + + $objWriter->endElement(); + + $objWriter->endElement(); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/ContentTypes.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/ContentTypes.php new file mode 100644 index 0000000..0d91189 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/ContentTypes.php @@ -0,0 +1,240 @@ +<?php + +/** + * PHPExcel_Writer_Excel2007_ContentTypes + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_Excel2007_ContentTypes extends PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Write content types to XML format + * + * @param PHPExcel $pPHPExcel + * @param boolean $includeCharts Flag indicating if we should include drawing details for charts + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeContentTypes(PHPExcel $pPHPExcel = null, $includeCharts = false) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + // Types + $objWriter->startElement('Types'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/content-types'); + + // Theme + $this->writeOverrideContentType($objWriter, '/xl/theme/theme1.xml', 'application/vnd.openxmlformats-officedocument.theme+xml'); + + // Styles + $this->writeOverrideContentType($objWriter, '/xl/styles.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml'); + + // Rels + $this->writeDefaultContentType($objWriter, 'rels', 'application/vnd.openxmlformats-package.relationships+xml'); + + // XML + $this->writeDefaultContentType($objWriter, 'xml', 'application/xml'); + + // VML + $this->writeDefaultContentType($objWriter, 'vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'); + + // Workbook + if ($pPHPExcel->hasMacros()) { //Macros in workbook ? + // Yes : not standard content but "macroEnabled" + $this->writeOverrideContentType($objWriter, '/xl/workbook.xml', 'application/vnd.ms-excel.sheet.macroEnabled.main+xml'); + //... and define a new type for the VBA project + $this->writeDefaultContentType($objWriter, 'bin', 'application/vnd.ms-office.vbaProject'); + if ($pPHPExcel->hasMacrosCertificate()) {// signed macros ? + // Yes : add needed information + $this->writeOverrideContentType($objWriter, '/xl/vbaProjectSignature.bin', 'application/vnd.ms-office.vbaProjectSignature'); + } + } else {// no macros in workbook, so standard type + $this->writeOverrideContentType($objWriter, '/xl/workbook.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml'); + } + + // DocProps + $this->writeOverrideContentType($objWriter, '/docProps/app.xml', 'application/vnd.openxmlformats-officedocument.extended-properties+xml'); + + $this->writeOverrideContentType($objWriter, '/docProps/core.xml', 'application/vnd.openxmlformats-package.core-properties+xml'); + + $customPropertyList = $pPHPExcel->getProperties()->getCustomProperties(); + if (!empty($customPropertyList)) { + $this->writeOverrideContentType($objWriter, '/docProps/custom.xml', 'application/vnd.openxmlformats-officedocument.custom-properties+xml'); + } + + // Worksheets + $sheetCount = $pPHPExcel->getSheetCount(); + for ($i = 0; $i < $sheetCount; ++$i) { + $this->writeOverrideContentType($objWriter, '/xl/worksheets/sheet' . ($i + 1) . '.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml'); + } + + // Shared strings + $this->writeOverrideContentType($objWriter, '/xl/sharedStrings.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml'); + + // Add worksheet relationship content types + $chart = 1; + for ($i = 0; $i < $sheetCount; ++$i) { + $drawings = $pPHPExcel->getSheet($i)->getDrawingCollection(); + $drawingCount = count($drawings); + $chartCount = ($includeCharts) ? $pPHPExcel->getSheet($i)->getChartCount() : 0; + + // We need a drawing relationship for the worksheet if we have either drawings or charts + if (($drawingCount > 0) || ($chartCount > 0)) { + $this->writeOverrideContentType($objWriter, '/xl/drawings/drawing' . ($i + 1) . '.xml', 'application/vnd.openxmlformats-officedocument.drawing+xml'); + } + + // If we have charts, then we need a chart relationship for every individual chart + if ($chartCount > 0) { + for ($c = 0; $c < $chartCount; ++$c) { + $this->writeOverrideContentType($objWriter, '/xl/charts/chart' . $chart++ . '.xml', 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml'); + } + } + } + + // Comments + for ($i = 0; $i < $sheetCount; ++$i) { + if (count($pPHPExcel->getSheet($i)->getComments()) > 0) { + $this->writeOverrideContentType($objWriter, '/xl/comments' . ($i + 1) . '.xml', 'application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml'); + } + } + + // Add media content-types + $aMediaContentTypes = array(); + $mediaCount = $this->getParentWriter()->getDrawingHashTable()->count(); + for ($i = 0; $i < $mediaCount; ++$i) { + $extension = ''; + $mimeType = ''; + + if ($this->getParentWriter()->getDrawingHashTable()->getByIndex($i) instanceof PHPExcel_Worksheet_Drawing) { + $extension = strtolower($this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getExtension()); + $mimeType = $this->getImageMimeType($this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getPath()); + } elseif ($this->getParentWriter()->getDrawingHashTable()->getByIndex($i) instanceof PHPExcel_Worksheet_MemoryDrawing) { + $extension = strtolower($this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getMimeType()); + $extension = explode('/', $extension); + $extension = $extension[1]; + + $mimeType = $this->getParentWriter()->getDrawingHashTable()->getByIndex($i)->getMimeType(); + } + + if (!isset( $aMediaContentTypes[$extension])) { + $aMediaContentTypes[$extension] = $mimeType; + + $this->writeDefaultContentType($objWriter, $extension, $mimeType); + } + } + if ($pPHPExcel->hasRibbonBinObjects()) { + // Some additional objects in the ribbon ? + // we need to write "Extension" but not already write for media content + $tabRibbonTypes=array_diff($pPHPExcel->getRibbonBinObjects('types'), array_keys($aMediaContentTypes)); + foreach ($tabRibbonTypes as $aRibbonType) { + $mimeType='image/.'.$aRibbonType;//we wrote $mimeType like customUI Editor + $this->writeDefaultContentType($objWriter, $aRibbonType, $mimeType); + } + } + $sheetCount = $pPHPExcel->getSheetCount(); + for ($i = 0; $i < $sheetCount; ++$i) { + if (count($pPHPExcel->getSheet()->getHeaderFooter()->getImages()) > 0) { + foreach ($pPHPExcel->getSheet()->getHeaderFooter()->getImages() as $image) { + if (!isset( $aMediaContentTypes[strtolower($image->getExtension())])) { + $aMediaContentTypes[strtolower($image->getExtension())] = $this->getImageMimeType($image->getPath()); + + $this->writeDefaultContentType($objWriter, strtolower($image->getExtension()), $aMediaContentTypes[strtolower($image->getExtension())]); + } + } + } + } + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Get image mime type + * + * @param string $pFile Filename + * @return string Mime Type + * @throws PHPExcel_Writer_Exception + */ + private function getImageMimeType($pFile = '') + { + if (PHPExcel_Shared_File::file_exists($pFile)) { + $image = getimagesize($pFile); + return image_type_to_mime_type($image[2]); + } else { + throw new PHPExcel_Writer_Exception("File $pFile does not exist"); + } + } + + /** + * Write Default content type + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param string $pPartname Part name + * @param string $pContentType Content type + * @throws PHPExcel_Writer_Exception + */ + private function writeDefaultContentType(PHPExcel_Shared_XMLWriter $objWriter = null, $pPartname = '', $pContentType = '') + { + if ($pPartname != '' && $pContentType != '') { + // Write content type + $objWriter->startElement('Default'); + $objWriter->writeAttribute('Extension', $pPartname); + $objWriter->writeAttribute('ContentType', $pContentType); + $objWriter->endElement(); + } else { + throw new PHPExcel_Writer_Exception("Invalid parameters passed."); + } + } + + /** + * Write Override content type + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param string $pPartname Part name + * @param string $pContentType Content type + * @throws PHPExcel_Writer_Exception + */ + private function writeOverrideContentType(PHPExcel_Shared_XMLWriter $objWriter = null, $pPartname = '', $pContentType = '') + { + if ($pPartname != '' && $pContentType != '') { + // Write content type + $objWriter->startElement('Override'); + $objWriter->writeAttribute('PartName', $pPartname); + $objWriter->writeAttribute('ContentType', $pContentType); + $objWriter->endElement(); + } else { + throw new PHPExcel_Writer_Exception("Invalid parameters passed."); + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/DocProps.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/DocProps.php new file mode 100644 index 0000000..fef3d93 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/DocProps.php @@ -0,0 +1,262 @@ +<?php + +/** + * PHPExcel_Writer_Excel2007_DocProps + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_Excel2007_DocProps extends PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Write docProps/app.xml to XML format + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeDocPropsApp(PHPExcel $pPHPExcel = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + // Properties + $objWriter->startElement('Properties'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties'); + $objWriter->writeAttribute('xmlns:vt', 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes'); + + // Application + $objWriter->writeElement('Application', 'Microsoft Excel'); + + // DocSecurity + $objWriter->writeElement('DocSecurity', '0'); + + // ScaleCrop + $objWriter->writeElement('ScaleCrop', 'false'); + + // HeadingPairs + $objWriter->startElement('HeadingPairs'); + + // Vector + $objWriter->startElement('vt:vector'); + $objWriter->writeAttribute('size', '2'); + $objWriter->writeAttribute('baseType', 'variant'); + + // Variant + $objWriter->startElement('vt:variant'); + $objWriter->writeElement('vt:lpstr', 'Worksheets'); + $objWriter->endElement(); + + // Variant + $objWriter->startElement('vt:variant'); + $objWriter->writeElement('vt:i4', $pPHPExcel->getSheetCount()); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // TitlesOfParts + $objWriter->startElement('TitlesOfParts'); + + // Vector + $objWriter->startElement('vt:vector'); + $objWriter->writeAttribute('size', $pPHPExcel->getSheetCount()); + $objWriter->writeAttribute('baseType', 'lpstr'); + + $sheetCount = $pPHPExcel->getSheetCount(); + for ($i = 0; $i < $sheetCount; ++$i) { + $objWriter->writeElement('vt:lpstr', $pPHPExcel->getSheet($i)->getTitle()); + } + + $objWriter->endElement(); + + $objWriter->endElement(); + + // Company + $objWriter->writeElement('Company', $pPHPExcel->getProperties()->getCompany()); + + // Company + $objWriter->writeElement('Manager', $pPHPExcel->getProperties()->getManager()); + + // LinksUpToDate + $objWriter->writeElement('LinksUpToDate', 'false'); + + // SharedDoc + $objWriter->writeElement('SharedDoc', 'false'); + + // HyperlinksChanged + $objWriter->writeElement('HyperlinksChanged', 'false'); + + // AppVersion + $objWriter->writeElement('AppVersion', '12.0000'); + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write docProps/core.xml to XML format + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeDocPropsCore(PHPExcel $pPHPExcel = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + // cp:coreProperties + $objWriter->startElement('cp:coreProperties'); + $objWriter->writeAttribute('xmlns:cp', 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties'); + $objWriter->writeAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/'); + $objWriter->writeAttribute('xmlns:dcterms', 'http://purl.org/dc/terms/'); + $objWriter->writeAttribute('xmlns:dcmitype', 'http://purl.org/dc/dcmitype/'); + $objWriter->writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); + + // dc:creator + $objWriter->writeElement('dc:creator', $pPHPExcel->getProperties()->getCreator()); + + // cp:lastModifiedBy + $objWriter->writeElement('cp:lastModifiedBy', $pPHPExcel->getProperties()->getLastModifiedBy()); + + // dcterms:created + $objWriter->startElement('dcterms:created'); + $objWriter->writeAttribute('xsi:type', 'dcterms:W3CDTF'); + $objWriter->writeRawData(date(DATE_W3C, $pPHPExcel->getProperties()->getCreated())); + $objWriter->endElement(); + + // dcterms:modified + $objWriter->startElement('dcterms:modified'); + $objWriter->writeAttribute('xsi:type', 'dcterms:W3CDTF'); + $objWriter->writeRawData(date(DATE_W3C, $pPHPExcel->getProperties()->getModified())); + $objWriter->endElement(); + + // dc:title + $objWriter->writeElement('dc:title', $pPHPExcel->getProperties()->getTitle()); + + // dc:description + $objWriter->writeElement('dc:description', $pPHPExcel->getProperties()->getDescription()); + + // dc:subject + $objWriter->writeElement('dc:subject', $pPHPExcel->getProperties()->getSubject()); + + // cp:keywords + $objWriter->writeElement('cp:keywords', $pPHPExcel->getProperties()->getKeywords()); + + // cp:category + $objWriter->writeElement('cp:category', $pPHPExcel->getProperties()->getCategory()); + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write docProps/custom.xml to XML format + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeDocPropsCustom(PHPExcel $pPHPExcel = null) + { + $customPropertyList = $pPHPExcel->getProperties()->getCustomProperties(); + if (empty($customPropertyList)) { + return; + } + + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + // cp:coreProperties + $objWriter->startElement('Properties'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/officeDocument/2006/custom-properties'); + $objWriter->writeAttribute('xmlns:vt', 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes'); + + + foreach ($customPropertyList as $key => $customProperty) { + $propertyValue = $pPHPExcel->getProperties()->getCustomPropertyValue($customProperty); + $propertyType = $pPHPExcel->getProperties()->getCustomPropertyType($customProperty); + + $objWriter->startElement('property'); + $objWriter->writeAttribute('fmtid', '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}'); + $objWriter->writeAttribute('pid', $key+2); + $objWriter->writeAttribute('name', $customProperty); + + switch ($propertyType) { + case 'i': + $objWriter->writeElement('vt:i4', $propertyValue); + break; + case 'f': + $objWriter->writeElement('vt:r8', $propertyValue); + break; + case 'b': + $objWriter->writeElement('vt:bool', ($propertyValue) ? 'true' : 'false'); + break; + case 'd': + $objWriter->startElement('vt:filetime'); + $objWriter->writeRawData(date(DATE_W3C, $propertyValue)); + $objWriter->endElement(); + break; + default: + $objWriter->writeElement('vt:lpwstr', $propertyValue); + break; + } + + $objWriter->endElement(); + } + + + $objWriter->endElement(); + + return $objWriter->getData(); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Drawing.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Drawing.php new file mode 100644 index 0000000..2814388 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Drawing.php @@ -0,0 +1,589 @@ +<?php + +/** + * PHPExcel_Writer_Excel2007_Drawing + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_Excel2007_Drawing extends PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Write drawings to XML format + * + * @param PHPExcel_Worksheet $pWorksheet + * @param int &$chartRef Chart ID + * @param boolean $includeCharts Flag indicating if we should include drawing details for charts + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeDrawings(PHPExcel_Worksheet $pWorksheet = null, &$chartRef, $includeCharts = false) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + // xdr:wsDr + $objWriter->startElement('xdr:wsDr'); + $objWriter->writeAttribute('xmlns:xdr', 'http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing'); + $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main'); + + // Loop through images and write drawings + $i = 1; + $iterator = $pWorksheet->getDrawingCollection()->getIterator(); + while ($iterator->valid()) { + $this->writeDrawing($objWriter, $iterator->current(), $i); + + $iterator->next(); + ++$i; + } + + if ($includeCharts) { + $chartCount = $pWorksheet->getChartCount(); + // Loop through charts and write the chart position + if ($chartCount > 0) { + for ($c = 0; $c < $chartCount; ++$c) { + $this->writeChart($objWriter, $pWorksheet->getChartByIndex($c), $c+$i); + } + } + } + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write drawings to XML format + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Chart $pChart + * @param int $pRelationId + * @throws PHPExcel_Writer_Exception + */ + public function writeChart(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Chart $pChart = null, $pRelationId = -1) + { + $tl = $pChart->getTopLeftPosition(); + $tl['colRow'] = PHPExcel_Cell::coordinateFromString($tl['cell']); + $br = $pChart->getBottomRightPosition(); + $br['colRow'] = PHPExcel_Cell::coordinateFromString($br['cell']); + + $objWriter->startElement('xdr:twoCellAnchor'); + + $objWriter->startElement('xdr:from'); + $objWriter->writeElement('xdr:col', PHPExcel_Cell::columnIndexFromString($tl['colRow'][0]) - 1); + $objWriter->writeElement('xdr:colOff', PHPExcel_Shared_Drawing::pixelsToEMU($tl['xOffset'])); + $objWriter->writeElement('xdr:row', $tl['colRow'][1] - 1); + $objWriter->writeElement('xdr:rowOff', PHPExcel_Shared_Drawing::pixelsToEMU($tl['yOffset'])); + $objWriter->endElement(); + $objWriter->startElement('xdr:to'); + $objWriter->writeElement('xdr:col', PHPExcel_Cell::columnIndexFromString($br['colRow'][0]) - 1); + $objWriter->writeElement('xdr:colOff', PHPExcel_Shared_Drawing::pixelsToEMU($br['xOffset'])); + $objWriter->writeElement('xdr:row', $br['colRow'][1] - 1); + $objWriter->writeElement('xdr:rowOff', PHPExcel_Shared_Drawing::pixelsToEMU($br['yOffset'])); + $objWriter->endElement(); + + $objWriter->startElement('xdr:graphicFrame'); + $objWriter->writeAttribute('macro', ''); + $objWriter->startElement('xdr:nvGraphicFramePr'); + $objWriter->startElement('xdr:cNvPr'); + $objWriter->writeAttribute('name', 'Chart '.$pRelationId); + $objWriter->writeAttribute('id', 1025 * $pRelationId); + $objWriter->endElement(); + $objWriter->startElement('xdr:cNvGraphicFramePr'); + $objWriter->startElement('a:graphicFrameLocks'); + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('xdr:xfrm'); + $objWriter->startElement('a:off'); + $objWriter->writeAttribute('x', '0'); + $objWriter->writeAttribute('y', '0'); + $objWriter->endElement(); + $objWriter->startElement('a:ext'); + $objWriter->writeAttribute('cx', '0'); + $objWriter->writeAttribute('cy', '0'); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('a:graphic'); + $objWriter->startElement('a:graphicData'); + $objWriter->writeAttribute('uri', 'http://schemas.openxmlformats.org/drawingml/2006/chart'); + $objWriter->startElement('c:chart'); + $objWriter->writeAttribute('xmlns:c', 'http://schemas.openxmlformats.org/drawingml/2006/chart'); + $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); + $objWriter->writeAttribute('r:id', 'rId'.$pRelationId); + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + + $objWriter->startElement('xdr:clientData'); + $objWriter->endElement(); + + $objWriter->endElement(); + } + + /** + * Write drawings to XML format + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet_BaseDrawing $pDrawing + * @param int $pRelationId + * @throws PHPExcel_Writer_Exception + */ + public function writeDrawing(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet_BaseDrawing $pDrawing = null, $pRelationId = -1) + { + if ($pRelationId >= 0) { + // xdr:oneCellAnchor + $objWriter->startElement('xdr:oneCellAnchor'); + // Image location + $aCoordinates = PHPExcel_Cell::coordinateFromString($pDrawing->getCoordinates()); + $aCoordinates[0] = PHPExcel_Cell::columnIndexFromString($aCoordinates[0]); + + // xdr:from + $objWriter->startElement('xdr:from'); + $objWriter->writeElement('xdr:col', $aCoordinates[0] - 1); + $objWriter->writeElement('xdr:colOff', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getOffsetX())); + $objWriter->writeElement('xdr:row', $aCoordinates[1] - 1); + $objWriter->writeElement('xdr:rowOff', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getOffsetY())); + $objWriter->endElement(); + + // xdr:ext + $objWriter->startElement('xdr:ext'); + $objWriter->writeAttribute('cx', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getWidth())); + $objWriter->writeAttribute('cy', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getHeight())); + $objWriter->endElement(); + + // xdr:pic + $objWriter->startElement('xdr:pic'); + + // xdr:nvPicPr + $objWriter->startElement('xdr:nvPicPr'); + + // xdr:cNvPr + $objWriter->startElement('xdr:cNvPr'); + $objWriter->writeAttribute('id', $pRelationId); + $objWriter->writeAttribute('name', $pDrawing->getName()); + $objWriter->writeAttribute('descr', $pDrawing->getDescription()); + $objWriter->endElement(); + + // xdr:cNvPicPr + $objWriter->startElement('xdr:cNvPicPr'); + + // a:picLocks + $objWriter->startElement('a:picLocks'); + $objWriter->writeAttribute('noChangeAspect', '1'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // xdr:blipFill + $objWriter->startElement('xdr:blipFill'); + + // a:blip + $objWriter->startElement('a:blip'); + $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); + $objWriter->writeAttribute('r:embed', 'rId' . $pRelationId); + $objWriter->endElement(); + + // a:stretch + $objWriter->startElement('a:stretch'); + $objWriter->writeElement('a:fillRect', null); + $objWriter->endElement(); + + $objWriter->endElement(); + + // xdr:spPr + $objWriter->startElement('xdr:spPr'); + + // a:xfrm + $objWriter->startElement('a:xfrm'); + $objWriter->writeAttribute('rot', PHPExcel_Shared_Drawing::degreesToAngle($pDrawing->getRotation())); + $objWriter->endElement(); + + // a:prstGeom + $objWriter->startElement('a:prstGeom'); + $objWriter->writeAttribute('prst', 'rect'); + + // a:avLst + $objWriter->writeElement('a:avLst', null); + + $objWriter->endElement(); + +// // a:solidFill +// $objWriter->startElement('a:solidFill'); + +// // a:srgbClr +// $objWriter->startElement('a:srgbClr'); +// $objWriter->writeAttribute('val', 'FFFFFF'); + +///* SHADE +// // a:shade +// $objWriter->startElement('a:shade'); +// $objWriter->writeAttribute('val', '85000'); +// $objWriter->endElement(); +//*/ + +// $objWriter->endElement(); + +// $objWriter->endElement(); +/* + // a:ln + $objWriter->startElement('a:ln'); + $objWriter->writeAttribute('w', '88900'); + $objWriter->writeAttribute('cap', 'sq'); + + // a:solidFill + $objWriter->startElement('a:solidFill'); + + // a:srgbClr + $objWriter->startElement('a:srgbClr'); + $objWriter->writeAttribute('val', 'FFFFFF'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:miter + $objWriter->startElement('a:miter'); + $objWriter->writeAttribute('lim', '800000'); + $objWriter->endElement(); + + $objWriter->endElement(); +*/ + + if ($pDrawing->getShadow()->getVisible()) { + // a:effectLst + $objWriter->startElement('a:effectLst'); + + // a:outerShdw + $objWriter->startElement('a:outerShdw'); + $objWriter->writeAttribute('blurRad', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getShadow()->getBlurRadius())); + $objWriter->writeAttribute('dist', PHPExcel_Shared_Drawing::pixelsToEMU($pDrawing->getShadow()->getDistance())); + $objWriter->writeAttribute('dir', PHPExcel_Shared_Drawing::degreesToAngle($pDrawing->getShadow()->getDirection())); + $objWriter->writeAttribute('algn', $pDrawing->getShadow()->getAlignment()); + $objWriter->writeAttribute('rotWithShape', '0'); + + // a:srgbClr + $objWriter->startElement('a:srgbClr'); + $objWriter->writeAttribute('val', $pDrawing->getShadow()->getColor()->getRGB()); + + // a:alpha + $objWriter->startElement('a:alpha'); + $objWriter->writeAttribute('val', $pDrawing->getShadow()->getAlpha() * 1000); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + } +/* + + // a:scene3d + $objWriter->startElement('a:scene3d'); + + // a:camera + $objWriter->startElement('a:camera'); + $objWriter->writeAttribute('prst', 'orthographicFront'); + $objWriter->endElement(); + + // a:lightRig + $objWriter->startElement('a:lightRig'); + $objWriter->writeAttribute('rig', 'twoPt'); + $objWriter->writeAttribute('dir', 't'); + + // a:rot + $objWriter->startElement('a:rot'); + $objWriter->writeAttribute('lat', '0'); + $objWriter->writeAttribute('lon', '0'); + $objWriter->writeAttribute('rev', '0'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); +*/ +/* + // a:sp3d + $objWriter->startElement('a:sp3d'); + + // a:bevelT + $objWriter->startElement('a:bevelT'); + $objWriter->writeAttribute('w', '25400'); + $objWriter->writeAttribute('h', '19050'); + $objWriter->endElement(); + + // a:contourClr + $objWriter->startElement('a:contourClr'); + + // a:srgbClr + $objWriter->startElement('a:srgbClr'); + $objWriter->writeAttribute('val', 'FFFFFF'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); +*/ + $objWriter->endElement(); + + $objWriter->endElement(); + + // xdr:clientData + $objWriter->writeElement('xdr:clientData', null); + + $objWriter->endElement(); + } else { + throw new PHPExcel_Writer_Exception("Invalid parameters passed."); + } + } + + /** + * Write VML header/footer images to XML format + * + * @param PHPExcel_Worksheet $pWorksheet + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeVMLHeaderFooterImages(PHPExcel_Worksheet $pWorksheet = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + // Header/footer images + $images = $pWorksheet->getHeaderFooter()->getImages(); + + // xml + $objWriter->startElement('xml'); + $objWriter->writeAttribute('xmlns:v', 'urn:schemas-microsoft-com:vml'); + $objWriter->writeAttribute('xmlns:o', 'urn:schemas-microsoft-com:office:office'); + $objWriter->writeAttribute('xmlns:x', 'urn:schemas-microsoft-com:office:excel'); + + // o:shapelayout + $objWriter->startElement('o:shapelayout'); + $objWriter->writeAttribute('v:ext', 'edit'); + + // o:idmap + $objWriter->startElement('o:idmap'); + $objWriter->writeAttribute('v:ext', 'edit'); + $objWriter->writeAttribute('data', '1'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // v:shapetype + $objWriter->startElement('v:shapetype'); + $objWriter->writeAttribute('id', '_x0000_t75'); + $objWriter->writeAttribute('coordsize', '21600,21600'); + $objWriter->writeAttribute('o:spt', '75'); + $objWriter->writeAttribute('o:preferrelative', 't'); + $objWriter->writeAttribute('path', 'm@4@5l@4@11@9@11@9@5xe'); + $objWriter->writeAttribute('filled', 'f'); + $objWriter->writeAttribute('stroked', 'f'); + + // v:stroke + $objWriter->startElement('v:stroke'); + $objWriter->writeAttribute('joinstyle', 'miter'); + $objWriter->endElement(); + + // v:formulas + $objWriter->startElement('v:formulas'); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'if lineDrawn pixelLineWidth 0'); + $objWriter->endElement(); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'sum @0 1 0'); + $objWriter->endElement(); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'sum 0 0 @1'); + $objWriter->endElement(); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'prod @2 1 2'); + $objWriter->endElement(); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'prod @3 21600 pixelWidth'); + $objWriter->endElement(); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'prod @3 21600 pixelHeight'); + $objWriter->endElement(); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'sum @0 0 1'); + $objWriter->endElement(); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'prod @6 1 2'); + $objWriter->endElement(); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'prod @7 21600 pixelWidth'); + $objWriter->endElement(); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'sum @8 21600 0'); + $objWriter->endElement(); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'prod @7 21600 pixelHeight'); + $objWriter->endElement(); + + // v:f + $objWriter->startElement('v:f'); + $objWriter->writeAttribute('eqn', 'sum @10 21600 0'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // v:path + $objWriter->startElement('v:path'); + $objWriter->writeAttribute('o:extrusionok', 'f'); + $objWriter->writeAttribute('gradientshapeok', 't'); + $objWriter->writeAttribute('o:connecttype', 'rect'); + $objWriter->endElement(); + + // o:lock + $objWriter->startElement('o:lock'); + $objWriter->writeAttribute('v:ext', 'edit'); + $objWriter->writeAttribute('aspectratio', 't'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // Loop through images + foreach ($images as $key => $value) { + $this->writeVMLHeaderFooterImage($objWriter, $key, $value); + } + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write VML comment to XML format + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param string $pReference Reference + * @param PHPExcel_Worksheet_HeaderFooterDrawing $pImage Image + * @throws PHPExcel_Writer_Exception + */ + private function writeVMLHeaderFooterImage(PHPExcel_Shared_XMLWriter $objWriter = null, $pReference = '', PHPExcel_Worksheet_HeaderFooterDrawing $pImage = null) + { + // Calculate object id + preg_match('{(\d+)}', md5($pReference), $m); + $id = 1500 + (substr($m[1], 0, 2) * 1); + + // Calculate offset + $width = $pImage->getWidth(); + $height = $pImage->getHeight(); + $marginLeft = $pImage->getOffsetX(); + $marginTop = $pImage->getOffsetY(); + + // v:shape + $objWriter->startElement('v:shape'); + $objWriter->writeAttribute('id', $pReference); + $objWriter->writeAttribute('o:spid', '_x0000_s' . $id); + $objWriter->writeAttribute('type', '#_x0000_t75'); + $objWriter->writeAttribute('style', "position:absolute;margin-left:{$marginLeft}px;margin-top:{$marginTop}px;width:{$width}px;height:{$height}px;z-index:1"); + + // v:imagedata + $objWriter->startElement('v:imagedata'); + $objWriter->writeAttribute('o:relid', 'rId' . $pReference); + $objWriter->writeAttribute('o:title', $pImage->getName()); + $objWriter->endElement(); + + // o:lock + $objWriter->startElement('o:lock'); + $objWriter->writeAttribute('v:ext', 'edit'); + $objWriter->writeAttribute('rotation', 't'); + $objWriter->endElement(); + + $objWriter->endElement(); + } + + + /** + * Get an array of all drawings + * + * @param PHPExcel $pPHPExcel + * @return PHPExcel_Worksheet_Drawing[] All drawings in PHPExcel + * @throws PHPExcel_Writer_Exception + */ + public function allDrawings(PHPExcel $pPHPExcel = null) + { + // Get an array of all drawings + $aDrawings = array(); + + // Loop through PHPExcel + $sheetCount = $pPHPExcel->getSheetCount(); + for ($i = 0; $i < $sheetCount; ++$i) { + // Loop through images and add to array + $iterator = $pPHPExcel->getSheet($i)->getDrawingCollection()->getIterator(); + while ($iterator->valid()) { + $aDrawings[] = $iterator->current(); + + $iterator->next(); + } + } + + return $aDrawings; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Rels.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Rels.php new file mode 100644 index 0000000..14ff337 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Rels.php @@ -0,0 +1,424 @@ +<?php + +/** + * PHPExcel_Writer_Excel2007_Rels + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_Excel2007_Rels extends PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Write relationships to XML format + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeRelationships(PHPExcel $pPHPExcel = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + // Relationships + $objWriter->startElement('Relationships'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); + + $customPropertyList = $pPHPExcel->getProperties()->getCustomProperties(); + if (!empty($customPropertyList)) { + // Relationship docProps/app.xml + $this->writeRelationship( + $objWriter, + 4, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties', + 'docProps/custom.xml' + ); + + } + + // Relationship docProps/app.xml + $this->writeRelationship( + $objWriter, + 3, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties', + 'docProps/app.xml' + ); + + // Relationship docProps/core.xml + $this->writeRelationship( + $objWriter, + 2, + 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties', + 'docProps/core.xml' + ); + + // Relationship xl/workbook.xml + $this->writeRelationship( + $objWriter, + 1, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument', + 'xl/workbook.xml' + ); + // a custom UI in workbook ? + if ($pPHPExcel->hasRibbon()) { + $this->writeRelationShip( + $objWriter, + 5, + 'http://schemas.microsoft.com/office/2006/relationships/ui/extensibility', + $pPHPExcel->getRibbonXMLData('target') + ); + } + + $objWriter->endElement(); + + return $objWriter->getData(); + } + + /** + * Write workbook relationships to XML format + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeWorkbookRelationships(PHPExcel $pPHPExcel = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + // Relationships + $objWriter->startElement('Relationships'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); + + // Relationship styles.xml + $this->writeRelationship( + $objWriter, + 1, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles', + 'styles.xml' + ); + + // Relationship theme/theme1.xml + $this->writeRelationship( + $objWriter, + 2, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme', + 'theme/theme1.xml' + ); + + // Relationship sharedStrings.xml + $this->writeRelationship( + $objWriter, + 3, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings', + 'sharedStrings.xml' + ); + + // Relationships with sheets + $sheetCount = $pPHPExcel->getSheetCount(); + for ($i = 0; $i < $sheetCount; ++$i) { + $this->writeRelationship( + $objWriter, + ($i + 1 + 3), + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet', + 'worksheets/sheet' . ($i + 1) . '.xml' + ); + } + // Relationships for vbaProject if needed + // id : just after the last sheet + if ($pPHPExcel->hasMacros()) { + $this->writeRelationShip( + $objWriter, + ($i + 1 + 3), + 'http://schemas.microsoft.com/office/2006/relationships/vbaProject', + 'vbaProject.bin' + ); + ++$i;//increment i if needed for an another relation + } + + $objWriter->endElement(); + + return $objWriter->getData(); + } + + /** + * Write worksheet relationships to XML format + * + * Numbering is as follows: + * rId1 - Drawings + * rId_hyperlink_x - Hyperlinks + * + * @param PHPExcel_Worksheet $pWorksheet + * @param int $pWorksheetId + * @param boolean $includeCharts Flag indicating if we should write charts + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeWorksheetRelationships(PHPExcel_Worksheet $pWorksheet = null, $pWorksheetId = 1, $includeCharts = false) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + // Relationships + $objWriter->startElement('Relationships'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); + + // Write drawing relationships? + $d = 0; + if ($includeCharts) { + $charts = $pWorksheet->getChartCollection(); + } else { + $charts = array(); + } + if (($pWorksheet->getDrawingCollection()->count() > 0) || + (count($charts) > 0)) { + $this->writeRelationship( + $objWriter, + ++$d, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing', + '../drawings/drawing' . $pWorksheetId . '.xml' + ); + } + + // Write chart relationships? +// $chartCount = 0; +// $charts = $pWorksheet->getChartCollection(); +// echo 'Chart Rels: ' , count($charts) , '<br />'; +// if (count($charts) > 0) { +// foreach ($charts as $chart) { +// $this->writeRelationship( +// $objWriter, +// ++$d, +// 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart', +// '../charts/chart' . ++$chartCount . '.xml' +// ); +// } +// } +// + // Write hyperlink relationships? + $i = 1; + foreach ($pWorksheet->getHyperlinkCollection() as $hyperlink) { + if (!$hyperlink->isInternal()) { + $this->writeRelationship( + $objWriter, + '_hyperlink_' . $i, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink', + $hyperlink->getUrl(), + 'External' + ); + + ++$i; + } + } + + // Write comments relationship? + $i = 1; + if (count($pWorksheet->getComments()) > 0) { + $this->writeRelationship( + $objWriter, + '_comments_vml' . $i, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing', + '../drawings/vmlDrawing' . $pWorksheetId . '.vml' + ); + + $this->writeRelationship( + $objWriter, + '_comments' . $i, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments', + '../comments' . $pWorksheetId . '.xml' + ); + } + + // Write header/footer relationship? + $i = 1; + if (count($pWorksheet->getHeaderFooter()->getImages()) > 0) { + $this->writeRelationship( + $objWriter, + '_headerfooter_vml' . $i, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing', + '../drawings/vmlDrawingHF' . $pWorksheetId . '.vml' + ); + } + + $objWriter->endElement(); + + return $objWriter->getData(); + } + + /** + * Write drawing relationships to XML format + * + * @param PHPExcel_Worksheet $pWorksheet + * @param int &$chartRef Chart ID + * @param boolean $includeCharts Flag indicating if we should write charts + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeDrawingRelationships(PHPExcel_Worksheet $pWorksheet = null, &$chartRef, $includeCharts = false) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + // Relationships + $objWriter->startElement('Relationships'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); + + // Loop through images and write relationships + $i = 1; + $iterator = $pWorksheet->getDrawingCollection()->getIterator(); + while ($iterator->valid()) { + if ($iterator->current() instanceof PHPExcel_Worksheet_Drawing + || $iterator->current() instanceof PHPExcel_Worksheet_MemoryDrawing) { + // Write relationship for image drawing + $this->writeRelationship( + $objWriter, + $i, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image', + '../media/' . str_replace(' ', '', $iterator->current()->getIndexedFilename()) + ); + } + + $iterator->next(); + ++$i; + } + + if ($includeCharts) { + // Loop through charts and write relationships + $chartCount = $pWorksheet->getChartCount(); + if ($chartCount > 0) { + for ($c = 0; $c < $chartCount; ++$c) { + $this->writeRelationship( + $objWriter, + $i++, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart', + '../charts/chart' . ++$chartRef . '.xml' + ); + } + } + } + + $objWriter->endElement(); + + return $objWriter->getData(); + } + + /** + * Write header/footer drawing relationships to XML format + * + * @param PHPExcel_Worksheet $pWorksheet + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeHeaderFooterDrawingRelationships(PHPExcel_Worksheet $pWorksheet = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + // Relationships + $objWriter->startElement('Relationships'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); + + // Loop through images and write relationships + foreach ($pWorksheet->getHeaderFooter()->getImages() as $key => $value) { + // Write relationship for image drawing + $this->writeRelationship( + $objWriter, + $key, + 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image', + '../media/' . $value->getIndexedFilename() + ); + } + + $objWriter->endElement(); + + return $objWriter->getData(); + } + + /** + * Write Override content type + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param int $pId Relationship ID. rId will be prepended! + * @param string $pType Relationship type + * @param string $pTarget Relationship target + * @param string $pTargetMode Relationship target mode + * @throws PHPExcel_Writer_Exception + */ + private function writeRelationship(PHPExcel_Shared_XMLWriter $objWriter = null, $pId = 1, $pType = '', $pTarget = '', $pTargetMode = '') + { + if ($pType != '' && $pTarget != '') { + // Write relationship + $objWriter->startElement('Relationship'); + $objWriter->writeAttribute('Id', 'rId' . $pId); + $objWriter->writeAttribute('Type', $pType); + $objWriter->writeAttribute('Target', $pTarget); + + if ($pTargetMode != '') { + $objWriter->writeAttribute('TargetMode', $pTargetMode); + } + + $objWriter->endElement(); + } else { + throw new PHPExcel_Writer_Exception("Invalid parameters passed."); + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/RelsRibbon.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/RelsRibbon.php new file mode 100644 index 0000000..5a4a9fc --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/RelsRibbon.php @@ -0,0 +1,67 @@ +<?php + +/** + * PHPExcel_Writer_Excel2007_RelsRibbon + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_Excel2007_RelsRibbon extends PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Write relationships for additional objects of custom UI (ribbon) + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeRibbonRelationships(PHPExcel $pPHPExcel = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + // Relationships + $objWriter->startElement('Relationships'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); + $localRels = $pPHPExcel->getRibbonBinObjects('names'); + if (is_array($localRels)) { + foreach ($localRels as $aId => $aTarget) { + $objWriter->startElement('Relationship'); + $objWriter->writeAttribute('Id', $aId); + $objWriter->writeAttribute('Type', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image'); + $objWriter->writeAttribute('Target', $aTarget); + $objWriter->endElement(); + } + } + $objWriter->endElement(); + + return $objWriter->getData(); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/RelsVBA.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/RelsVBA.php new file mode 100644 index 0000000..bee0e64 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/RelsVBA.php @@ -0,0 +1,63 @@ +<?php + +/** + * PHPExcel_Writer_Excel2007_RelsVBA + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_Excel2007_RelsVBA extends PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Write relationships for a signed VBA Project + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeVBARelationships(PHPExcel $pPHPExcel = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + // Relationships + $objWriter->startElement('Relationships'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships'); + $objWriter->startElement('Relationship'); + $objWriter->writeAttribute('Id', 'rId1'); + $objWriter->writeAttribute('Type', 'http://schemas.microsoft.com/office/2006/relationships/vbaProjectSignature'); + $objWriter->writeAttribute('Target', 'vbaProjectSignature.bin'); + $objWriter->endElement(); + $objWriter->endElement(); + + return $objWriter->getData(); + + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/StringTable.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/StringTable.php new file mode 100644 index 0000000..fccec66 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/StringTable.php @@ -0,0 +1,313 @@ +<?php + +/** + * PHPExcel_Writer_Excel2007_StringTable + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_Excel2007_StringTable extends PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Create worksheet stringtable + * + * @param PHPExcel_Worksheet $pSheet Worksheet + * @param string[] $pExistingTable Existing table to eventually merge with + * @return string[] String table for worksheet + * @throws PHPExcel_Writer_Exception + */ + public function createStringTable($pSheet = null, $pExistingTable = null) + { + if ($pSheet !== null) { + // Create string lookup table + $aStringTable = array(); + $cellCollection = null; + $aFlippedStringTable = null; // For faster lookup + + // Is an existing table given? + if (($pExistingTable !== null) && is_array($pExistingTable)) { + $aStringTable = $pExistingTable; + } + + // Fill index array + $aFlippedStringTable = $this->flipStringTable($aStringTable); + + // Loop through cells + foreach ($pSheet->getCellCollection() as $cellID) { + $cell = $pSheet->getCell($cellID); + $cellValue = $cell->getValue(); + if (!is_object($cellValue) && + ($cellValue !== null) && + $cellValue !== '' && + !isset($aFlippedStringTable[$cellValue]) && + ($cell->getDataType() == PHPExcel_Cell_DataType::TYPE_STRING || $cell->getDataType() == PHPExcel_Cell_DataType::TYPE_STRING2 || $cell->getDataType() == PHPExcel_Cell_DataType::TYPE_NULL)) { + $aStringTable[] = $cellValue; + $aFlippedStringTable[$cellValue] = true; + } elseif ($cellValue instanceof PHPExcel_RichText && + ($cellValue !== null) && + !isset($aFlippedStringTable[$cellValue->getHashCode()])) { + $aStringTable[] = $cellValue; + $aFlippedStringTable[$cellValue->getHashCode()] = true; + } + } + + return $aStringTable; + } else { + throw new PHPExcel_Writer_Exception("Invalid PHPExcel_Worksheet object passed."); + } + } + + /** + * Write string table to XML format + * + * @param string[] $pStringTable + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeStringTable($pStringTable = null) + { + if ($pStringTable !== null) { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + // String table + $objWriter->startElement('sst'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'); + $objWriter->writeAttribute('uniqueCount', count($pStringTable)); + + // Loop through string table + foreach ($pStringTable as $textElement) { + $objWriter->startElement('si'); + + if (! $textElement instanceof PHPExcel_RichText) { + $textToWrite = PHPExcel_Shared_String::ControlCharacterPHP2OOXML($textElement); + $objWriter->startElement('t'); + if ($textToWrite !== trim($textToWrite)) { + $objWriter->writeAttribute('xml:space', 'preserve'); + } + $objWriter->writeRawData($textToWrite); + $objWriter->endElement(); + } elseif ($textElement instanceof PHPExcel_RichText) { + $this->writeRichText($objWriter, $textElement); + } + + $objWriter->endElement(); + } + + $objWriter->endElement(); + + return $objWriter->getData(); + } else { + throw new PHPExcel_Writer_Exception("Invalid string table array passed."); + } + } + + /** + * Write Rich Text + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_RichText $pRichText Rich text + * @param string $prefix Optional Namespace prefix + * @throws PHPExcel_Writer_Exception + */ + public function writeRichText(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_RichText $pRichText = null, $prefix = null) + { + if ($prefix !== null) { + $prefix .= ':'; + } + + // Loop through rich text elements + $elements = $pRichText->getRichTextElements(); + foreach ($elements as $element) { + // r + $objWriter->startElement($prefix.'r'); + + // rPr + if ($element instanceof PHPExcel_RichText_Run) { + // rPr + $objWriter->startElement($prefix.'rPr'); + + // rFont + $objWriter->startElement($prefix.'rFont'); + $objWriter->writeAttribute('val', $element->getFont()->getName()); + $objWriter->endElement(); + + // Bold + $objWriter->startElement($prefix.'b'); + $objWriter->writeAttribute('val', ($element->getFont()->getBold() ? 'true' : 'false')); + $objWriter->endElement(); + + // Italic + $objWriter->startElement($prefix.'i'); + $objWriter->writeAttribute('val', ($element->getFont()->getItalic() ? 'true' : 'false')); + $objWriter->endElement(); + + // Superscript / subscript + if ($element->getFont()->getSuperScript() || $element->getFont()->getSubScript()) { + $objWriter->startElement($prefix.'vertAlign'); + if ($element->getFont()->getSuperScript()) { + $objWriter->writeAttribute('val', 'superscript'); + } elseif ($element->getFont()->getSubScript()) { + $objWriter->writeAttribute('val', 'subscript'); + } + $objWriter->endElement(); + } + + // Strikethrough + $objWriter->startElement($prefix.'strike'); + $objWriter->writeAttribute('val', ($element->getFont()->getStrikethrough() ? 'true' : 'false')); + $objWriter->endElement(); + + // Color + $objWriter->startElement($prefix.'color'); + $objWriter->writeAttribute('rgb', $element->getFont()->getColor()->getARGB()); + $objWriter->endElement(); + + // Size + $objWriter->startElement($prefix.'sz'); + $objWriter->writeAttribute('val', $element->getFont()->getSize()); + $objWriter->endElement(); + + // Underline + $objWriter->startElement($prefix.'u'); + $objWriter->writeAttribute('val', $element->getFont()->getUnderline()); + $objWriter->endElement(); + + $objWriter->endElement(); + } + + // t + $objWriter->startElement($prefix.'t'); + $objWriter->writeAttribute('xml:space', 'preserve'); + $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML($element->getText())); + $objWriter->endElement(); + + $objWriter->endElement(); + } + } + + /** + * Write Rich Text + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param string|PHPExcel_RichText $pRichText text string or Rich text + * @param string $prefix Optional Namespace prefix + * @throws PHPExcel_Writer_Exception + */ + public function writeRichTextForCharts(PHPExcel_Shared_XMLWriter $objWriter = null, $pRichText = null, $prefix = null) + { + if (!$pRichText instanceof PHPExcel_RichText) { + $textRun = $pRichText; + $pRichText = new PHPExcel_RichText(); + $pRichText->createTextRun($textRun); + } + + if ($prefix !== null) { + $prefix .= ':'; + } + + // Loop through rich text elements + $elements = $pRichText->getRichTextElements(); + foreach ($elements as $element) { + // r + $objWriter->startElement($prefix.'r'); + + // rPr + $objWriter->startElement($prefix.'rPr'); + + // Bold + $objWriter->writeAttribute('b', ($element->getFont()->getBold() ? 1 : 0)); + // Italic + $objWriter->writeAttribute('i', ($element->getFont()->getItalic() ? 1 : 0)); + // Underline + $underlineType = $element->getFont()->getUnderline(); + switch ($underlineType) { + case 'single': + $underlineType = 'sng'; + break; + case 'double': + $underlineType = 'dbl'; + break; + } + $objWriter->writeAttribute('u', $underlineType); + // Strikethrough + $objWriter->writeAttribute('strike', ($element->getFont()->getStrikethrough() ? 'sngStrike' : 'noStrike')); + + // rFont + $objWriter->startElement($prefix.'latin'); + $objWriter->writeAttribute('typeface', $element->getFont()->getName()); + $objWriter->endElement(); + + // Superscript / subscript +// if ($element->getFont()->getSuperScript() || $element->getFont()->getSubScript()) { +// $objWriter->startElement($prefix.'vertAlign'); +// if ($element->getFont()->getSuperScript()) { +// $objWriter->writeAttribute('val', 'superscript'); +// } elseif ($element->getFont()->getSubScript()) { +// $objWriter->writeAttribute('val', 'subscript'); +// } +// $objWriter->endElement(); +// } +// + $objWriter->endElement(); + + // t + $objWriter->startElement($prefix.'t'); +// $objWriter->writeAttribute('xml:space', 'preserve'); // Excel2010 accepts, Excel2007 complains + $objWriter->writeRawData(PHPExcel_Shared_String::ControlCharacterPHP2OOXML($element->getText())); + $objWriter->endElement(); + + $objWriter->endElement(); + } + } + + /** + * Flip string table (for index searching) + * + * @param array $stringTable Stringtable + * @return array + */ + public function flipStringTable($stringTable = array()) + { + // Return value + $returnValue = array(); + + // Loop through stringtable and add flipped items to $returnValue + foreach ($stringTable as $key => $value) { + if (! $value instanceof PHPExcel_RichText) { + $returnValue[$value] = $key; + } elseif ($value instanceof PHPExcel_RichText) { + $returnValue[$value->getHashCode()] = $key; + } + } + + return $returnValue; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Style.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Style.php new file mode 100644 index 0000000..d3f0af7 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Style.php @@ -0,0 +1,696 @@ +<?php + +/** + * PHPExcel_Writer_Excel2007_Style + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_Excel2007_Style extends PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Write styles to XML format + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeStyles(PHPExcel $pPHPExcel = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + // styleSheet + $objWriter->startElement('styleSheet'); + $objWriter->writeAttribute('xml:space', 'preserve'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'); + + // numFmts + $objWriter->startElement('numFmts'); + $objWriter->writeAttribute('count', $this->getParentWriter()->getNumFmtHashTable()->count()); + + // numFmt + for ($i = 0; $i < $this->getParentWriter()->getNumFmtHashTable()->count(); ++$i) { + $this->writeNumFmt($objWriter, $this->getParentWriter()->getNumFmtHashTable()->getByIndex($i), $i); + } + + $objWriter->endElement(); + + // fonts + $objWriter->startElement('fonts'); + $objWriter->writeAttribute('count', $this->getParentWriter()->getFontHashTable()->count()); + + // font + for ($i = 0; $i < $this->getParentWriter()->getFontHashTable()->count(); ++$i) { + $this->writeFont($objWriter, $this->getParentWriter()->getFontHashTable()->getByIndex($i)); + } + + $objWriter->endElement(); + + // fills + $objWriter->startElement('fills'); + $objWriter->writeAttribute('count', $this->getParentWriter()->getFillHashTable()->count()); + + // fill + for ($i = 0; $i < $this->getParentWriter()->getFillHashTable()->count(); ++$i) { + $this->writeFill($objWriter, $this->getParentWriter()->getFillHashTable()->getByIndex($i)); + } + + $objWriter->endElement(); + + // borders + $objWriter->startElement('borders'); + $objWriter->writeAttribute('count', $this->getParentWriter()->getBordersHashTable()->count()); + + // border + for ($i = 0; $i < $this->getParentWriter()->getBordersHashTable()->count(); ++$i) { + $this->writeBorder($objWriter, $this->getParentWriter()->getBordersHashTable()->getByIndex($i)); + } + + $objWriter->endElement(); + + // cellStyleXfs + $objWriter->startElement('cellStyleXfs'); + $objWriter->writeAttribute('count', 1); + + // xf + $objWriter->startElement('xf'); + $objWriter->writeAttribute('numFmtId', 0); + $objWriter->writeAttribute('fontId', 0); + $objWriter->writeAttribute('fillId', 0); + $objWriter->writeAttribute('borderId', 0); + $objWriter->endElement(); + + $objWriter->endElement(); + + // cellXfs + $objWriter->startElement('cellXfs'); + $objWriter->writeAttribute('count', count($pPHPExcel->getCellXfCollection())); + + // xf + foreach ($pPHPExcel->getCellXfCollection() as $cellXf) { + $this->writeCellStyleXf($objWriter, $cellXf, $pPHPExcel); + } + + $objWriter->endElement(); + + // cellStyles + $objWriter->startElement('cellStyles'); + $objWriter->writeAttribute('count', 1); + + // cellStyle + $objWriter->startElement('cellStyle'); + $objWriter->writeAttribute('name', 'Normal'); + $objWriter->writeAttribute('xfId', 0); + $objWriter->writeAttribute('builtinId', 0); + $objWriter->endElement(); + + $objWriter->endElement(); + + // dxfs + $objWriter->startElement('dxfs'); + $objWriter->writeAttribute('count', $this->getParentWriter()->getStylesConditionalHashTable()->count()); + + // dxf + for ($i = 0; $i < $this->getParentWriter()->getStylesConditionalHashTable()->count(); ++$i) { + $this->writeCellStyleDxf($objWriter, $this->getParentWriter()->getStylesConditionalHashTable()->getByIndex($i)->getStyle()); + } + + $objWriter->endElement(); + + // tableStyles + $objWriter->startElement('tableStyles'); + $objWriter->writeAttribute('defaultTableStyle', 'TableStyleMedium9'); + $objWriter->writeAttribute('defaultPivotStyle', 'PivotTableStyle1'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write Fill + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Style_Fill $pFill Fill style + * @throws PHPExcel_Writer_Exception + */ + private function writeFill(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_Fill $pFill = null) + { + // Check if this is a pattern type or gradient type + if ($pFill->getFillType() === PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR || + $pFill->getFillType() === PHPExcel_Style_Fill::FILL_GRADIENT_PATH) { + // Gradient fill + $this->writeGradientFill($objWriter, $pFill); + } elseif ($pFill->getFillType() !== null) { + // Pattern fill + $this->writePatternFill($objWriter, $pFill); + } + } + + /** + * Write Gradient Fill + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Style_Fill $pFill Fill style + * @throws PHPExcel_Writer_Exception + */ + private function writeGradientFill(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_Fill $pFill = null) + { + // fill + $objWriter->startElement('fill'); + + // gradientFill + $objWriter->startElement('gradientFill'); + $objWriter->writeAttribute('type', $pFill->getFillType()); + $objWriter->writeAttribute('degree', $pFill->getRotation()); + + // stop + $objWriter->startElement('stop'); + $objWriter->writeAttribute('position', '0'); + + // color + $objWriter->startElement('color'); + $objWriter->writeAttribute('rgb', $pFill->getStartColor()->getARGB()); + $objWriter->endElement(); + + $objWriter->endElement(); + + // stop + $objWriter->startElement('stop'); + $objWriter->writeAttribute('position', '1'); + + // color + $objWriter->startElement('color'); + $objWriter->writeAttribute('rgb', $pFill->getEndColor()->getARGB()); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + } + + /** + * Write Pattern Fill + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Style_Fill $pFill Fill style + * @throws PHPExcel_Writer_Exception + */ + private function writePatternFill(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_Fill $pFill = null) + { + // fill + $objWriter->startElement('fill'); + + // patternFill + $objWriter->startElement('patternFill'); + $objWriter->writeAttribute('patternType', $pFill->getFillType()); + + if ($pFill->getFillType() !== PHPExcel_Style_Fill::FILL_NONE) { + // fgColor + if ($pFill->getStartColor()->getARGB()) { + $objWriter->startElement('fgColor'); + $objWriter->writeAttribute('rgb', $pFill->getStartColor()->getARGB()); + $objWriter->endElement(); + } + } + if ($pFill->getFillType() !== PHPExcel_Style_Fill::FILL_NONE) { + // bgColor + if ($pFill->getEndColor()->getARGB()) { + $objWriter->startElement('bgColor'); + $objWriter->writeAttribute('rgb', $pFill->getEndColor()->getARGB()); + $objWriter->endElement(); + } + } + + $objWriter->endElement(); + + $objWriter->endElement(); + } + + /** + * Write Font + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Style_Font $pFont Font style + * @throws PHPExcel_Writer_Exception + */ + private function writeFont(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_Font $pFont = null) + { + // font + $objWriter->startElement('font'); + // Weird! The order of these elements actually makes a difference when opening Excel2007 + // files in Excel2003 with the compatibility pack. It's not documented behaviour, + // and makes for a real WTF! + + // Bold. We explicitly write this element also when false (like MS Office Excel 2007 does + // for conditional formatting). Otherwise it will apparently not be picked up in conditional + // formatting style dialog + if ($pFont->getBold() !== null) { + $objWriter->startElement('b'); + $objWriter->writeAttribute('val', $pFont->getBold() ? '1' : '0'); + $objWriter->endElement(); + } + + // Italic + if ($pFont->getItalic() !== null) { + $objWriter->startElement('i'); + $objWriter->writeAttribute('val', $pFont->getItalic() ? '1' : '0'); + $objWriter->endElement(); + } + + // Strikethrough + if ($pFont->getStrikethrough() !== null) { + $objWriter->startElement('strike'); + $objWriter->writeAttribute('val', $pFont->getStrikethrough() ? '1' : '0'); + $objWriter->endElement(); + } + + // Underline + if ($pFont->getUnderline() !== null) { + $objWriter->startElement('u'); + $objWriter->writeAttribute('val', $pFont->getUnderline()); + $objWriter->endElement(); + } + + // Superscript / subscript + if ($pFont->getSuperScript() === true || $pFont->getSubScript() === true) { + $objWriter->startElement('vertAlign'); + if ($pFont->getSuperScript() === true) { + $objWriter->writeAttribute('val', 'superscript'); + } elseif ($pFont->getSubScript() === true) { + $objWriter->writeAttribute('val', 'subscript'); + } + $objWriter->endElement(); + } + + // Size + if ($pFont->getSize() !== null) { + $objWriter->startElement('sz'); + $objWriter->writeAttribute('val', $pFont->getSize()); + $objWriter->endElement(); + } + + // Foreground color + if ($pFont->getColor()->getARGB() !== null) { + $objWriter->startElement('color'); + $objWriter->writeAttribute('rgb', $pFont->getColor()->getARGB()); + $objWriter->endElement(); + } + + // Name + if ($pFont->getName() !== null) { + $objWriter->startElement('name'); + $objWriter->writeAttribute('val', $pFont->getName()); + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + + /** + * Write Border + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Style_Borders $pBorders Borders style + * @throws PHPExcel_Writer_Exception + */ + private function writeBorder(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_Borders $pBorders = null) + { + // Write border + $objWriter->startElement('border'); + // Diagonal? + switch ($pBorders->getDiagonalDirection()) { + case PHPExcel_Style_Borders::DIAGONAL_UP: + $objWriter->writeAttribute('diagonalUp', 'true'); + $objWriter->writeAttribute('diagonalDown', 'false'); + break; + case PHPExcel_Style_Borders::DIAGONAL_DOWN: + $objWriter->writeAttribute('diagonalUp', 'false'); + $objWriter->writeAttribute('diagonalDown', 'true'); + break; + case PHPExcel_Style_Borders::DIAGONAL_BOTH: + $objWriter->writeAttribute('diagonalUp', 'true'); + $objWriter->writeAttribute('diagonalDown', 'true'); + break; + } + + // BorderPr + $this->writeBorderPr($objWriter, 'left', $pBorders->getLeft()); + $this->writeBorderPr($objWriter, 'right', $pBorders->getRight()); + $this->writeBorderPr($objWriter, 'top', $pBorders->getTop()); + $this->writeBorderPr($objWriter, 'bottom', $pBorders->getBottom()); + $this->writeBorderPr($objWriter, 'diagonal', $pBorders->getDiagonal()); + $objWriter->endElement(); + } + + /** + * Write Cell Style Xf + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Style $pStyle Style + * @param PHPExcel $pPHPExcel Workbook + * @throws PHPExcel_Writer_Exception + */ + private function writeCellStyleXf(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style $pStyle = null, PHPExcel $pPHPExcel = null) + { + // xf + $objWriter->startElement('xf'); + $objWriter->writeAttribute('xfId', 0); + $objWriter->writeAttribute('fontId', (int)$this->getParentWriter()->getFontHashTable()->getIndexForHashCode($pStyle->getFont()->getHashCode())); + if ($pStyle->getQuotePrefix()) { + $objWriter->writeAttribute('quotePrefix', 1); + } + + if ($pStyle->getNumberFormat()->getBuiltInFormatCode() === false) { + $objWriter->writeAttribute('numFmtId', (int)($this->getParentWriter()->getNumFmtHashTable()->getIndexForHashCode($pStyle->getNumberFormat()->getHashCode()) + 164)); + } else { + $objWriter->writeAttribute('numFmtId', (int)$pStyle->getNumberFormat()->getBuiltInFormatCode()); + } + + $objWriter->writeAttribute('fillId', (int)$this->getParentWriter()->getFillHashTable()->getIndexForHashCode($pStyle->getFill()->getHashCode())); + $objWriter->writeAttribute('borderId', (int)$this->getParentWriter()->getBordersHashTable()->getIndexForHashCode($pStyle->getBorders()->getHashCode())); + + // Apply styles? + $objWriter->writeAttribute('applyFont', ($pPHPExcel->getDefaultStyle()->getFont()->getHashCode() != $pStyle->getFont()->getHashCode()) ? '1' : '0'); + $objWriter->writeAttribute('applyNumberFormat', ($pPHPExcel->getDefaultStyle()->getNumberFormat()->getHashCode() != $pStyle->getNumberFormat()->getHashCode()) ? '1' : '0'); + $objWriter->writeAttribute('applyFill', ($pPHPExcel->getDefaultStyle()->getFill()->getHashCode() != $pStyle->getFill()->getHashCode()) ? '1' : '0'); + $objWriter->writeAttribute('applyBorder', ($pPHPExcel->getDefaultStyle()->getBorders()->getHashCode() != $pStyle->getBorders()->getHashCode()) ? '1' : '0'); + $objWriter->writeAttribute('applyAlignment', ($pPHPExcel->getDefaultStyle()->getAlignment()->getHashCode() != $pStyle->getAlignment()->getHashCode()) ? '1' : '0'); + if ($pStyle->getProtection()->getLocked() != PHPExcel_Style_Protection::PROTECTION_INHERIT || $pStyle->getProtection()->getHidden() != PHPExcel_Style_Protection::PROTECTION_INHERIT) { + $objWriter->writeAttribute('applyProtection', 'true'); + } + + // alignment + $objWriter->startElement('alignment'); + $objWriter->writeAttribute('horizontal', $pStyle->getAlignment()->getHorizontal()); + $objWriter->writeAttribute('vertical', $pStyle->getAlignment()->getVertical()); + + $textRotation = 0; + if ($pStyle->getAlignment()->getTextRotation() >= 0) { + $textRotation = $pStyle->getAlignment()->getTextRotation(); + } elseif ($pStyle->getAlignment()->getTextRotation() < 0) { + $textRotation = 90 - $pStyle->getAlignment()->getTextRotation(); + } + $objWriter->writeAttribute('textRotation', $textRotation); + + $objWriter->writeAttribute('wrapText', ($pStyle->getAlignment()->getWrapText() ? 'true' : 'false')); + $objWriter->writeAttribute('shrinkToFit', ($pStyle->getAlignment()->getShrinkToFit() ? 'true' : 'false')); + + if ($pStyle->getAlignment()->getIndent() > 0) { + $objWriter->writeAttribute('indent', $pStyle->getAlignment()->getIndent()); + } + if ($pStyle->getAlignment()->getReadorder() > 0) { + $objWriter->writeAttribute('readingOrder', $pStyle->getAlignment()->getReadorder()); + } + $objWriter->endElement(); + + // protection + if ($pStyle->getProtection()->getLocked() != PHPExcel_Style_Protection::PROTECTION_INHERIT || $pStyle->getProtection()->getHidden() != PHPExcel_Style_Protection::PROTECTION_INHERIT) { + $objWriter->startElement('protection'); + if ($pStyle->getProtection()->getLocked() != PHPExcel_Style_Protection::PROTECTION_INHERIT) { + $objWriter->writeAttribute('locked', ($pStyle->getProtection()->getLocked() == PHPExcel_Style_Protection::PROTECTION_PROTECTED ? 'true' : 'false')); + } + if ($pStyle->getProtection()->getHidden() != PHPExcel_Style_Protection::PROTECTION_INHERIT) { + $objWriter->writeAttribute('hidden', ($pStyle->getProtection()->getHidden() == PHPExcel_Style_Protection::PROTECTION_PROTECTED ? 'true' : 'false')); + } + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + + /** + * Write Cell Style Dxf + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Style $pStyle Style + * @throws PHPExcel_Writer_Exception + */ + private function writeCellStyleDxf(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style $pStyle = null) + { + // dxf + $objWriter->startElement('dxf'); + + // font + $this->writeFont($objWriter, $pStyle->getFont()); + + // numFmt + $this->writeNumFmt($objWriter, $pStyle->getNumberFormat()); + + // fill + $this->writeFill($objWriter, $pStyle->getFill()); + + // alignment + $objWriter->startElement('alignment'); + if ($pStyle->getAlignment()->getHorizontal() !== null) { + $objWriter->writeAttribute('horizontal', $pStyle->getAlignment()->getHorizontal()); + } + if ($pStyle->getAlignment()->getVertical() !== null) { + $objWriter->writeAttribute('vertical', $pStyle->getAlignment()->getVertical()); + } + + if ($pStyle->getAlignment()->getTextRotation() !== null) { + $textRotation = 0; + if ($pStyle->getAlignment()->getTextRotation() >= 0) { + $textRotation = $pStyle->getAlignment()->getTextRotation(); + } elseif ($pStyle->getAlignment()->getTextRotation() < 0) { + $textRotation = 90 - $pStyle->getAlignment()->getTextRotation(); + } + $objWriter->writeAttribute('textRotation', $textRotation); + } + $objWriter->endElement(); + + // border + $this->writeBorder($objWriter, $pStyle->getBorders()); + + // protection + if (($pStyle->getProtection()->getLocked() !== null) || ($pStyle->getProtection()->getHidden() !== null)) { + if ($pStyle->getProtection()->getLocked() !== PHPExcel_Style_Protection::PROTECTION_INHERIT || + $pStyle->getProtection()->getHidden() !== PHPExcel_Style_Protection::PROTECTION_INHERIT) { + $objWriter->startElement('protection'); + if (($pStyle->getProtection()->getLocked() !== null) && + ($pStyle->getProtection()->getLocked() !== PHPExcel_Style_Protection::PROTECTION_INHERIT)) { + $objWriter->writeAttribute('locked', ($pStyle->getProtection()->getLocked() == PHPExcel_Style_Protection::PROTECTION_PROTECTED ? 'true' : 'false')); + } + if (($pStyle->getProtection()->getHidden() !== null) && + ($pStyle->getProtection()->getHidden() !== PHPExcel_Style_Protection::PROTECTION_INHERIT)) { + $objWriter->writeAttribute('hidden', ($pStyle->getProtection()->getHidden() == PHPExcel_Style_Protection::PROTECTION_PROTECTED ? 'true' : 'false')); + } + $objWriter->endElement(); + } + } + + $objWriter->endElement(); + } + + /** + * Write BorderPr + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param string $pName Element name + * @param PHPExcel_Style_Border $pBorder Border style + * @throws PHPExcel_Writer_Exception + */ + private function writeBorderPr(PHPExcel_Shared_XMLWriter $objWriter = null, $pName = 'left', PHPExcel_Style_Border $pBorder = null) + { + // Write BorderPr + if ($pBorder->getBorderStyle() != PHPExcel_Style_Border::BORDER_NONE) { + $objWriter->startElement($pName); + $objWriter->writeAttribute('style', $pBorder->getBorderStyle()); + + // color + $objWriter->startElement('color'); + $objWriter->writeAttribute('rgb', $pBorder->getColor()->getARGB()); + $objWriter->endElement(); + + $objWriter->endElement(); + } + } + + /** + * Write NumberFormat + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Style_NumberFormat $pNumberFormat Number Format + * @param int $pId Number Format identifier + * @throws PHPExcel_Writer_Exception + */ + private function writeNumFmt(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Style_NumberFormat $pNumberFormat = null, $pId = 0) + { + // Translate formatcode + $formatCode = $pNumberFormat->getFormatCode(); + + // numFmt + if ($formatCode !== null) { + $objWriter->startElement('numFmt'); + $objWriter->writeAttribute('numFmtId', ($pId + 164)); + $objWriter->writeAttribute('formatCode', $formatCode); + $objWriter->endElement(); + } + } + + /** + * Get an array of all styles + * + * @param PHPExcel $pPHPExcel + * @return PHPExcel_Style[] All styles in PHPExcel + * @throws PHPExcel_Writer_Exception + */ + public function allStyles(PHPExcel $pPHPExcel = null) + { + return $pPHPExcel->getCellXfCollection(); + } + + /** + * Get an array of all conditional styles + * + * @param PHPExcel $pPHPExcel + * @return PHPExcel_Style_Conditional[] All conditional styles in PHPExcel + * @throws PHPExcel_Writer_Exception + */ + public function allConditionalStyles(PHPExcel $pPHPExcel = null) + { + // Get an array of all styles + $aStyles = array(); + + $sheetCount = $pPHPExcel->getSheetCount(); + for ($i = 0; $i < $sheetCount; ++$i) { + foreach ($pPHPExcel->getSheet($i)->getConditionalStylesCollection() as $conditionalStyles) { + foreach ($conditionalStyles as $conditionalStyle) { + $aStyles[] = $conditionalStyle; + } + } + } + + return $aStyles; + } + + /** + * Get an array of all fills + * + * @param PHPExcel $pPHPExcel + * @return PHPExcel_Style_Fill[] All fills in PHPExcel + * @throws PHPExcel_Writer_Exception + */ + public function allFills(PHPExcel $pPHPExcel = null) + { + // Get an array of unique fills + $aFills = array(); + + // Two first fills are predefined + $fill0 = new PHPExcel_Style_Fill(); + $fill0->setFillType(PHPExcel_Style_Fill::FILL_NONE); + $aFills[] = $fill0; + + $fill1 = new PHPExcel_Style_Fill(); + $fill1->setFillType(PHPExcel_Style_Fill::FILL_PATTERN_GRAY125); + $aFills[] = $fill1; + // The remaining fills + $aStyles = $this->allStyles($pPHPExcel); + foreach ($aStyles as $style) { + if (!array_key_exists($style->getFill()->getHashCode(), $aFills)) { + $aFills[ $style->getFill()->getHashCode() ] = $style->getFill(); + } + } + + return $aFills; + } + + /** + * Get an array of all fonts + * + * @param PHPExcel $pPHPExcel + * @return PHPExcel_Style_Font[] All fonts in PHPExcel + * @throws PHPExcel_Writer_Exception + */ + public function allFonts(PHPExcel $pPHPExcel = null) + { + // Get an array of unique fonts + $aFonts = array(); + $aStyles = $this->allStyles($pPHPExcel); + + foreach ($aStyles as $style) { + if (!array_key_exists($style->getFont()->getHashCode(), $aFonts)) { + $aFonts[ $style->getFont()->getHashCode() ] = $style->getFont(); + } + } + + return $aFonts; + } + + /** + * Get an array of all borders + * + * @param PHPExcel $pPHPExcel + * @return PHPExcel_Style_Borders[] All borders in PHPExcel + * @throws PHPExcel_Writer_Exception + */ + public function allBorders(PHPExcel $pPHPExcel = null) + { + // Get an array of unique borders + $aBorders = array(); + $aStyles = $this->allStyles($pPHPExcel); + + foreach ($aStyles as $style) { + if (!array_key_exists($style->getBorders()->getHashCode(), $aBorders)) { + $aBorders[ $style->getBorders()->getHashCode() ] = $style->getBorders(); + } + } + + return $aBorders; + } + + /** + * Get an array of all number formats + * + * @param PHPExcel $pPHPExcel + * @return PHPExcel_Style_NumberFormat[] All number formats in PHPExcel + * @throws PHPExcel_Writer_Exception + */ + public function allNumberFormats(PHPExcel $pPHPExcel = null) + { + // Get an array of unique number formats + $aNumFmts = array(); + $aStyles = $this->allStyles($pPHPExcel); + + foreach ($aStyles as $style) { + if ($style->getNumberFormat()->getBuiltInFormatCode() === false && !array_key_exists($style->getNumberFormat()->getHashCode(), $aNumFmts)) { + $aNumFmts[ $style->getNumberFormat()->getHashCode() ] = $style->getNumberFormat(); + } + } + + return $aNumFmts; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Theme.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Theme.php new file mode 100644 index 0000000..223e402 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Theme.php @@ -0,0 +1,869 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ + + +/** + * PHPExcel_Writer_Excel2007_Theme + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel2007_Theme extends PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Map of Major fonts to write + * @static array of string + * + */ + private static $majorFonts = array( + 'Jpan' => 'MS Pゴシック', + 'Hang' => '맑은 고딕', + 'Hans' => '宋体', + 'Hant' => '新細明體', + 'Arab' => 'Times New Roman', + 'Hebr' => 'Times New Roman', + 'Thai' => 'Tahoma', + 'Ethi' => 'Nyala', + 'Beng' => 'Vrinda', + 'Gujr' => 'Shruti', + 'Khmr' => 'MoolBoran', + 'Knda' => 'Tunga', + 'Guru' => 'Raavi', + 'Cans' => 'Euphemia', + 'Cher' => 'Plantagenet Cherokee', + 'Yiii' => 'Microsoft Yi Baiti', + 'Tibt' => 'Microsoft Himalaya', + 'Thaa' => 'MV Boli', + 'Deva' => 'Mangal', + 'Telu' => 'Gautami', + 'Taml' => 'Latha', + 'Syrc' => 'Estrangelo Edessa', + 'Orya' => 'Kalinga', + 'Mlym' => 'Kartika', + 'Laoo' => 'DokChampa', + 'Sinh' => 'Iskoola Pota', + 'Mong' => 'Mongolian Baiti', + 'Viet' => 'Times New Roman', + 'Uigh' => 'Microsoft Uighur', + 'Geor' => 'Sylfaen', + ); + + /** + * Map of Minor fonts to write + * @static array of string + * + */ + private static $minorFonts = array( + 'Jpan' => 'MS Pゴシック', + 'Hang' => '맑은 고딕', + 'Hans' => '宋体', + 'Hant' => '新細明體', + 'Arab' => 'Arial', + 'Hebr' => 'Arial', + 'Thai' => 'Tahoma', + 'Ethi' => 'Nyala', + 'Beng' => 'Vrinda', + 'Gujr' => 'Shruti', + 'Khmr' => 'DaunPenh', + 'Knda' => 'Tunga', + 'Guru' => 'Raavi', + 'Cans' => 'Euphemia', + 'Cher' => 'Plantagenet Cherokee', + 'Yiii' => 'Microsoft Yi Baiti', + 'Tibt' => 'Microsoft Himalaya', + 'Thaa' => 'MV Boli', + 'Deva' => 'Mangal', + 'Telu' => 'Gautami', + 'Taml' => 'Latha', + 'Syrc' => 'Estrangelo Edessa', + 'Orya' => 'Kalinga', + 'Mlym' => 'Kartika', + 'Laoo' => 'DokChampa', + 'Sinh' => 'Iskoola Pota', + 'Mong' => 'Mongolian Baiti', + 'Viet' => 'Arial', + 'Uigh' => 'Microsoft Uighur', + 'Geor' => 'Sylfaen', + ); + + /** + * Map of core colours + * @static array of string + * + */ + private static $colourScheme = array( + 'dk2' => '1F497D', + 'lt2' => 'EEECE1', + 'accent1' => '4F81BD', + 'accent2' => 'C0504D', + 'accent3' => '9BBB59', + 'accent4' => '8064A2', + 'accent5' => '4BACC6', + 'accent6' => 'F79646', + 'hlink' => '0000FF', + 'folHlink' => '800080', + ); + + /** + * Write theme to XML format + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeTheme(PHPExcel $pPHPExcel = null) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + // a:theme + $objWriter->startElement('a:theme'); + $objWriter->writeAttribute('xmlns:a', 'http://schemas.openxmlformats.org/drawingml/2006/main'); + $objWriter->writeAttribute('name', 'Office Theme'); + + // a:themeElements + $objWriter->startElement('a:themeElements'); + + // a:clrScheme + $objWriter->startElement('a:clrScheme'); + $objWriter->writeAttribute('name', 'Office'); + + // a:dk1 + $objWriter->startElement('a:dk1'); + + // a:sysClr + $objWriter->startElement('a:sysClr'); + $objWriter->writeAttribute('val', 'windowText'); + $objWriter->writeAttribute('lastClr', '000000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:lt1 + $objWriter->startElement('a:lt1'); + + // a:sysClr + $objWriter->startElement('a:sysClr'); + $objWriter->writeAttribute('val', 'window'); + $objWriter->writeAttribute('lastClr', 'FFFFFF'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:dk2 + $this->writeColourScheme($objWriter); + + $objWriter->endElement(); + + // a:fontScheme + $objWriter->startElement('a:fontScheme'); + $objWriter->writeAttribute('name', 'Office'); + + // a:majorFont + $objWriter->startElement('a:majorFont'); + $this->writeFonts($objWriter, 'Cambria', self::$majorFonts); + $objWriter->endElement(); + + // a:minorFont + $objWriter->startElement('a:minorFont'); + $this->writeFonts($objWriter, 'Calibri', self::$minorFonts); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:fmtScheme + $objWriter->startElement('a:fmtScheme'); + $objWriter->writeAttribute('name', 'Office'); + + // a:fillStyleLst + $objWriter->startElement('a:fillStyleLst'); + + // a:solidFill + $objWriter->startElement('a:solidFill'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:gradFill + $objWriter->startElement('a:gradFill'); + $objWriter->writeAttribute('rotWithShape', '1'); + + // a:gsLst + $objWriter->startElement('a:gsLst'); + + // a:gs + $objWriter->startElement('a:gs'); + $objWriter->writeAttribute('pos', '0'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:tint + $objWriter->startElement('a:tint'); + $objWriter->writeAttribute('val', '50000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '300000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:gs + $objWriter->startElement('a:gs'); + $objWriter->writeAttribute('pos', '35000'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:tint + $objWriter->startElement('a:tint'); + $objWriter->writeAttribute('val', '37000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '300000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:gs + $objWriter->startElement('a:gs'); + $objWriter->writeAttribute('pos', '100000'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:tint + $objWriter->startElement('a:tint'); + $objWriter->writeAttribute('val', '15000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '350000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:lin + $objWriter->startElement('a:lin'); + $objWriter->writeAttribute('ang', '16200000'); + $objWriter->writeAttribute('scaled', '1'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:gradFill + $objWriter->startElement('a:gradFill'); + $objWriter->writeAttribute('rotWithShape', '1'); + + // a:gsLst + $objWriter->startElement('a:gsLst'); + + // a:gs + $objWriter->startElement('a:gs'); + $objWriter->writeAttribute('pos', '0'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:shade + $objWriter->startElement('a:shade'); + $objWriter->writeAttribute('val', '51000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '130000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:gs + $objWriter->startElement('a:gs'); + $objWriter->writeAttribute('pos', '80000'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:shade + $objWriter->startElement('a:shade'); + $objWriter->writeAttribute('val', '93000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '130000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:gs + $objWriter->startElement('a:gs'); + $objWriter->writeAttribute('pos', '100000'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:shade + $objWriter->startElement('a:shade'); + $objWriter->writeAttribute('val', '94000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '135000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:lin + $objWriter->startElement('a:lin'); + $objWriter->writeAttribute('ang', '16200000'); + $objWriter->writeAttribute('scaled', '0'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:lnStyleLst + $objWriter->startElement('a:lnStyleLst'); + + // a:ln + $objWriter->startElement('a:ln'); + $objWriter->writeAttribute('w', '9525'); + $objWriter->writeAttribute('cap', 'flat'); + $objWriter->writeAttribute('cmpd', 'sng'); + $objWriter->writeAttribute('algn', 'ctr'); + + // a:solidFill + $objWriter->startElement('a:solidFill'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:shade + $objWriter->startElement('a:shade'); + $objWriter->writeAttribute('val', '95000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '105000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:prstDash + $objWriter->startElement('a:prstDash'); + $objWriter->writeAttribute('val', 'solid'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:ln + $objWriter->startElement('a:ln'); + $objWriter->writeAttribute('w', '25400'); + $objWriter->writeAttribute('cap', 'flat'); + $objWriter->writeAttribute('cmpd', 'sng'); + $objWriter->writeAttribute('algn', 'ctr'); + + // a:solidFill + $objWriter->startElement('a:solidFill'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:prstDash + $objWriter->startElement('a:prstDash'); + $objWriter->writeAttribute('val', 'solid'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:ln + $objWriter->startElement('a:ln'); + $objWriter->writeAttribute('w', '38100'); + $objWriter->writeAttribute('cap', 'flat'); + $objWriter->writeAttribute('cmpd', 'sng'); + $objWriter->writeAttribute('algn', 'ctr'); + + // a:solidFill + $objWriter->startElement('a:solidFill'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:prstDash + $objWriter->startElement('a:prstDash'); + $objWriter->writeAttribute('val', 'solid'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + + + // a:effectStyleLst + $objWriter->startElement('a:effectStyleLst'); + + // a:effectStyle + $objWriter->startElement('a:effectStyle'); + + // a:effectLst + $objWriter->startElement('a:effectLst'); + + // a:outerShdw + $objWriter->startElement('a:outerShdw'); + $objWriter->writeAttribute('blurRad', '40000'); + $objWriter->writeAttribute('dist', '20000'); + $objWriter->writeAttribute('dir', '5400000'); + $objWriter->writeAttribute('rotWithShape', '0'); + + // a:srgbClr + $objWriter->startElement('a:srgbClr'); + $objWriter->writeAttribute('val', '000000'); + + // a:alpha + $objWriter->startElement('a:alpha'); + $objWriter->writeAttribute('val', '38000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:effectStyle + $objWriter->startElement('a:effectStyle'); + + // a:effectLst + $objWriter->startElement('a:effectLst'); + + // a:outerShdw + $objWriter->startElement('a:outerShdw'); + $objWriter->writeAttribute('blurRad', '40000'); + $objWriter->writeAttribute('dist', '23000'); + $objWriter->writeAttribute('dir', '5400000'); + $objWriter->writeAttribute('rotWithShape', '0'); + + // a:srgbClr + $objWriter->startElement('a:srgbClr'); + $objWriter->writeAttribute('val', '000000'); + + // a:alpha + $objWriter->startElement('a:alpha'); + $objWriter->writeAttribute('val', '35000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:effectStyle + $objWriter->startElement('a:effectStyle'); + + // a:effectLst + $objWriter->startElement('a:effectLst'); + + // a:outerShdw + $objWriter->startElement('a:outerShdw'); + $objWriter->writeAttribute('blurRad', '40000'); + $objWriter->writeAttribute('dist', '23000'); + $objWriter->writeAttribute('dir', '5400000'); + $objWriter->writeAttribute('rotWithShape', '0'); + + // a:srgbClr + $objWriter->startElement('a:srgbClr'); + $objWriter->writeAttribute('val', '000000'); + + // a:alpha + $objWriter->startElement('a:alpha'); + $objWriter->writeAttribute('val', '35000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:scene3d + $objWriter->startElement('a:scene3d'); + + // a:camera + $objWriter->startElement('a:camera'); + $objWriter->writeAttribute('prst', 'orthographicFront'); + + // a:rot + $objWriter->startElement('a:rot'); + $objWriter->writeAttribute('lat', '0'); + $objWriter->writeAttribute('lon', '0'); + $objWriter->writeAttribute('rev', '0'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:lightRig + $objWriter->startElement('a:lightRig'); + $objWriter->writeAttribute('rig', 'threePt'); + $objWriter->writeAttribute('dir', 't'); + + // a:rot + $objWriter->startElement('a:rot'); + $objWriter->writeAttribute('lat', '0'); + $objWriter->writeAttribute('lon', '0'); + $objWriter->writeAttribute('rev', '1200000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:sp3d + $objWriter->startElement('a:sp3d'); + + // a:bevelT + $objWriter->startElement('a:bevelT'); + $objWriter->writeAttribute('w', '63500'); + $objWriter->writeAttribute('h', '25400'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:bgFillStyleLst + $objWriter->startElement('a:bgFillStyleLst'); + + // a:solidFill + $objWriter->startElement('a:solidFill'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:gradFill + $objWriter->startElement('a:gradFill'); + $objWriter->writeAttribute('rotWithShape', '1'); + + // a:gsLst + $objWriter->startElement('a:gsLst'); + + // a:gs + $objWriter->startElement('a:gs'); + $objWriter->writeAttribute('pos', '0'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:tint + $objWriter->startElement('a:tint'); + $objWriter->writeAttribute('val', '40000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '350000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:gs + $objWriter->startElement('a:gs'); + $objWriter->writeAttribute('pos', '40000'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:tint + $objWriter->startElement('a:tint'); + $objWriter->writeAttribute('val', '45000'); + $objWriter->endElement(); + + // a:shade + $objWriter->startElement('a:shade'); + $objWriter->writeAttribute('val', '99000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '350000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:gs + $objWriter->startElement('a:gs'); + $objWriter->writeAttribute('pos', '100000'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:shade + $objWriter->startElement('a:shade'); + $objWriter->writeAttribute('val', '20000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '255000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:path + $objWriter->startElement('a:path'); + $objWriter->writeAttribute('path', 'circle'); + + // a:fillToRect + $objWriter->startElement('a:fillToRect'); + $objWriter->writeAttribute('l', '50000'); + $objWriter->writeAttribute('t', '-80000'); + $objWriter->writeAttribute('r', '50000'); + $objWriter->writeAttribute('b', '180000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:gradFill + $objWriter->startElement('a:gradFill'); + $objWriter->writeAttribute('rotWithShape', '1'); + + // a:gsLst + $objWriter->startElement('a:gsLst'); + + // a:gs + $objWriter->startElement('a:gs'); + $objWriter->writeAttribute('pos', '0'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:tint + $objWriter->startElement('a:tint'); + $objWriter->writeAttribute('val', '80000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '300000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:gs + $objWriter->startElement('a:gs'); + $objWriter->writeAttribute('pos', '100000'); + + // a:schemeClr + $objWriter->startElement('a:schemeClr'); + $objWriter->writeAttribute('val', 'phClr'); + + // a:shade + $objWriter->startElement('a:shade'); + $objWriter->writeAttribute('val', '30000'); + $objWriter->endElement(); + + // a:satMod + $objWriter->startElement('a:satMod'); + $objWriter->writeAttribute('val', '200000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:path + $objWriter->startElement('a:path'); + $objWriter->writeAttribute('path', 'circle'); + + // a:fillToRect + $objWriter->startElement('a:fillToRect'); + $objWriter->writeAttribute('l', '50000'); + $objWriter->writeAttribute('t', '50000'); + $objWriter->writeAttribute('r', '50000'); + $objWriter->writeAttribute('b', '50000'); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + // a:objectDefaults + $objWriter->writeElement('a:objectDefaults', null); + + // a:extraClrSchemeLst + $objWriter->writeElement('a:extraClrSchemeLst', null); + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write fonts to XML format + * + * @param PHPExcel_Shared_XMLWriter $objWriter + * @param string $latinFont + * @param array of string $fontSet + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + private function writeFonts($objWriter, $latinFont, $fontSet) + { + // a:latin + $objWriter->startElement('a:latin'); + $objWriter->writeAttribute('typeface', $latinFont); + $objWriter->endElement(); + + // a:ea + $objWriter->startElement('a:ea'); + $objWriter->writeAttribute('typeface', ''); + $objWriter->endElement(); + + // a:cs + $objWriter->startElement('a:cs'); + $objWriter->writeAttribute('typeface', ''); + $objWriter->endElement(); + + foreach ($fontSet as $fontScript => $typeface) { + $objWriter->startElement('a:font'); + $objWriter->writeAttribute('script', $fontScript); + $objWriter->writeAttribute('typeface', $typeface); + $objWriter->endElement(); + } + } + + /** + * Write colour scheme to XML format + * + * @param PHPExcel_Shared_XMLWriter $objWriter + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + private function writeColourScheme($objWriter) + { + foreach (self::$colourScheme as $colourName => $colourValue) { + $objWriter->startElement('a:'.$colourName); + + $objWriter->startElement('a:srgbClr'); + $objWriter->writeAttribute('val', $colourValue); + $objWriter->endElement(); + + $objWriter->endElement(); + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Workbook.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Workbook.php new file mode 100644 index 0000000..87c877e --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Workbook.php @@ -0,0 +1,448 @@ +<?php + +/** + * PHPExcel_Writer_Excel2007_Workbook + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_Excel2007_Workbook extends PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Write workbook to XML format + * + * @param PHPExcel $pPHPExcel + * @param boolean $recalcRequired Indicate whether formulas should be recalculated before writing + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeWorkbook(PHPExcel $pPHPExcel = null, $recalcRequired = false) + { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + // workbook + $objWriter->startElement('workbook'); + $objWriter->writeAttribute('xml:space', 'preserve'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'); + $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); + + // fileVersion + $this->writeFileVersion($objWriter); + + // workbookPr + $this->writeWorkbookPr($objWriter); + + // workbookProtection + $this->writeWorkbookProtection($objWriter, $pPHPExcel); + + // bookViews + if ($this->getParentWriter()->getOffice2003Compatibility() === false) { + $this->writeBookViews($objWriter, $pPHPExcel); + } + + // sheets + $this->writeSheets($objWriter, $pPHPExcel); + + // definedNames + $this->writeDefinedNames($objWriter, $pPHPExcel); + + // calcPr + $this->writeCalcPr($objWriter, $recalcRequired); + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } + + /** + * Write file version + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @throws PHPExcel_Writer_Exception + */ + private function writeFileVersion(PHPExcel_Shared_XMLWriter $objWriter = null) + { + $objWriter->startElement('fileVersion'); + $objWriter->writeAttribute('appName', 'xl'); + $objWriter->writeAttribute('lastEdited', '4'); + $objWriter->writeAttribute('lowestEdited', '4'); + $objWriter->writeAttribute('rupBuild', '4505'); + $objWriter->endElement(); + } + + /** + * Write WorkbookPr + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @throws PHPExcel_Writer_Exception + */ + private function writeWorkbookPr(PHPExcel_Shared_XMLWriter $objWriter = null) + { + $objWriter->startElement('workbookPr'); + + if (PHPExcel_Shared_Date::getExcelCalendar() == PHPExcel_Shared_Date::CALENDAR_MAC_1904) { + $objWriter->writeAttribute('date1904', '1'); + } + + $objWriter->writeAttribute('codeName', 'ThisWorkbook'); + + $objWriter->endElement(); + } + + /** + * Write BookViews + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel $pPHPExcel + * @throws PHPExcel_Writer_Exception + */ + private function writeBookViews(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel $pPHPExcel = null) + { + // bookViews + $objWriter->startElement('bookViews'); + + // workbookView + $objWriter->startElement('workbookView'); + + $objWriter->writeAttribute('activeTab', $pPHPExcel->getActiveSheetIndex()); + $objWriter->writeAttribute('autoFilterDateGrouping', '1'); + $objWriter->writeAttribute('firstSheet', '0'); + $objWriter->writeAttribute('minimized', '0'); + $objWriter->writeAttribute('showHorizontalScroll', '1'); + $objWriter->writeAttribute('showSheetTabs', '1'); + $objWriter->writeAttribute('showVerticalScroll', '1'); + $objWriter->writeAttribute('tabRatio', '600'); + $objWriter->writeAttribute('visibility', 'visible'); + + $objWriter->endElement(); + + $objWriter->endElement(); + } + + /** + * Write WorkbookProtection + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel $pPHPExcel + * @throws PHPExcel_Writer_Exception + */ + private function writeWorkbookProtection(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel $pPHPExcel = null) + { + if ($pPHPExcel->getSecurity()->isSecurityEnabled()) { + $objWriter->startElement('workbookProtection'); + $objWriter->writeAttribute('lockRevision', ($pPHPExcel->getSecurity()->getLockRevision() ? 'true' : 'false')); + $objWriter->writeAttribute('lockStructure', ($pPHPExcel->getSecurity()->getLockStructure() ? 'true' : 'false')); + $objWriter->writeAttribute('lockWindows', ($pPHPExcel->getSecurity()->getLockWindows() ? 'true' : 'false')); + + if ($pPHPExcel->getSecurity()->getRevisionsPassword() != '') { + $objWriter->writeAttribute('revisionsPassword', $pPHPExcel->getSecurity()->getRevisionsPassword()); + } + + if ($pPHPExcel->getSecurity()->getWorkbookPassword() != '') { + $objWriter->writeAttribute('workbookPassword', $pPHPExcel->getSecurity()->getWorkbookPassword()); + } + + $objWriter->endElement(); + } + } + + /** + * Write calcPr + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param boolean $recalcRequired Indicate whether formulas should be recalculated before writing + * @throws PHPExcel_Writer_Exception + */ + private function writeCalcPr(PHPExcel_Shared_XMLWriter $objWriter = null, $recalcRequired = true) + { + $objWriter->startElement('calcPr'); + + // Set the calcid to a higher value than Excel itself will use, otherwise Excel will always recalc + // If MS Excel does do a recalc, then users opening a file in MS Excel will be prompted to save on exit + // because the file has changed + $objWriter->writeAttribute('calcId', '999999'); + $objWriter->writeAttribute('calcMode', 'auto'); + // fullCalcOnLoad isn't needed if we've recalculating for the save + $objWriter->writeAttribute('calcCompleted', ($recalcRequired) ? 1 : 0); + $objWriter->writeAttribute('fullCalcOnLoad', ($recalcRequired) ? 0 : 1); + + $objWriter->endElement(); + } + + /** + * Write sheets + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel $pPHPExcel + * @throws PHPExcel_Writer_Exception + */ + private function writeSheets(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel $pPHPExcel = null) + { + // Write sheets + $objWriter->startElement('sheets'); + $sheetCount = $pPHPExcel->getSheetCount(); + for ($i = 0; $i < $sheetCount; ++$i) { + // sheet + $this->writeSheet( + $objWriter, + $pPHPExcel->getSheet($i)->getTitle(), + ($i + 1), + ($i + 1 + 3), + $pPHPExcel->getSheet($i)->getSheetState() + ); + } + + $objWriter->endElement(); + } + + /** + * Write sheet + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param string $pSheetname Sheet name + * @param int $pSheetId Sheet id + * @param int $pRelId Relationship ID + * @param string $sheetState Sheet state (visible, hidden, veryHidden) + * @throws PHPExcel_Writer_Exception + */ + private function writeSheet(PHPExcel_Shared_XMLWriter $objWriter = null, $pSheetname = '', $pSheetId = 1, $pRelId = 1, $sheetState = 'visible') + { + if ($pSheetname != '') { + // Write sheet + $objWriter->startElement('sheet'); + $objWriter->writeAttribute('name', $pSheetname); + $objWriter->writeAttribute('sheetId', $pSheetId); + if ($sheetState != 'visible' && $sheetState != '') { + $objWriter->writeAttribute('state', $sheetState); + } + $objWriter->writeAttribute('r:id', 'rId' . $pRelId); + $objWriter->endElement(); + } else { + throw new PHPExcel_Writer_Exception("Invalid parameters passed."); + } + } + + /** + * Write Defined Names + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel $pPHPExcel + * @throws PHPExcel_Writer_Exception + */ + private function writeDefinedNames(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel $pPHPExcel = null) + { + // Write defined names + $objWriter->startElement('definedNames'); + + // Named ranges + if (count($pPHPExcel->getNamedRanges()) > 0) { + // Named ranges + $this->writeNamedRanges($objWriter, $pPHPExcel); + } + + // Other defined names + $sheetCount = $pPHPExcel->getSheetCount(); + for ($i = 0; $i < $sheetCount; ++$i) { + // definedName for autoFilter + $this->writeDefinedNameForAutofilter($objWriter, $pPHPExcel->getSheet($i), $i); + + // definedName for Print_Titles + $this->writeDefinedNameForPrintTitles($objWriter, $pPHPExcel->getSheet($i), $i); + + // definedName for Print_Area + $this->writeDefinedNameForPrintArea($objWriter, $pPHPExcel->getSheet($i), $i); + } + + $objWriter->endElement(); + } + + /** + * Write named ranges + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel $pPHPExcel + * @throws PHPExcel_Writer_Exception + */ + private function writeNamedRanges(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel $pPHPExcel) + { + // Loop named ranges + $namedRanges = $pPHPExcel->getNamedRanges(); + foreach ($namedRanges as $namedRange) { + $this->writeDefinedNameForNamedRange($objWriter, $namedRange); + } + } + + /** + * Write Defined Name for named range + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_NamedRange $pNamedRange + * @throws PHPExcel_Writer_Exception + */ + private function writeDefinedNameForNamedRange(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_NamedRange $pNamedRange) + { + // definedName for named range + $objWriter->startElement('definedName'); + $objWriter->writeAttribute('name', $pNamedRange->getName()); + if ($pNamedRange->getLocalOnly()) { + $objWriter->writeAttribute('localSheetId', $pNamedRange->getScope()->getParent()->getIndex($pNamedRange->getScope())); + } + + // Create absolute coordinate and write as raw text + $range = PHPExcel_Cell::splitRange($pNamedRange->getRange()); + for ($i = 0; $i < count($range); $i++) { + $range[$i][0] = '\'' . str_replace("'", "''", $pNamedRange->getWorksheet()->getTitle()) . '\'!' . PHPExcel_Cell::absoluteReference($range[$i][0]); + if (isset($range[$i][1])) { + $range[$i][1] = PHPExcel_Cell::absoluteReference($range[$i][1]); + } + } + $range = PHPExcel_Cell::buildRange($range); + + $objWriter->writeRawData($range); + + $objWriter->endElement(); + } + + /** + * Write Defined Name for autoFilter + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet + * @param int $pSheetId + * @throws PHPExcel_Writer_Exception + */ + private function writeDefinedNameForAutofilter(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pSheetId = 0) + { + // definedName for autoFilter + $autoFilterRange = $pSheet->getAutoFilter()->getRange(); + if (!empty($autoFilterRange)) { + $objWriter->startElement('definedName'); + $objWriter->writeAttribute('name', '_xlnm._FilterDatabase'); + $objWriter->writeAttribute('localSheetId', $pSheetId); + $objWriter->writeAttribute('hidden', '1'); + + // Create absolute coordinate and write as raw text + $range = PHPExcel_Cell::splitRange($autoFilterRange); + $range = $range[0]; + // Strip any worksheet ref so we can make the cell ref absolute + if (strpos($range[0], '!') !== false) { + list($ws, $range[0]) = explode('!', $range[0]); + } + + $range[0] = PHPExcel_Cell::absoluteCoordinate($range[0]); + $range[1] = PHPExcel_Cell::absoluteCoordinate($range[1]); + $range = implode(':', $range); + + $objWriter->writeRawData('\'' . str_replace("'", "''", $pSheet->getTitle()) . '\'!' . $range); + + $objWriter->endElement(); + } + } + + /** + * Write Defined Name for PrintTitles + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet + * @param int $pSheetId + * @throws PHPExcel_Writer_Exception + */ + private function writeDefinedNameForPrintTitles(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pSheetId = 0) + { + // definedName for PrintTitles + if ($pSheet->getPageSetup()->isColumnsToRepeatAtLeftSet() || $pSheet->getPageSetup()->isRowsToRepeatAtTopSet()) { + $objWriter->startElement('definedName'); + $objWriter->writeAttribute('name', '_xlnm.Print_Titles'); + $objWriter->writeAttribute('localSheetId', $pSheetId); + + // Setting string + $settingString = ''; + + // Columns to repeat + if ($pSheet->getPageSetup()->isColumnsToRepeatAtLeftSet()) { + $repeat = $pSheet->getPageSetup()->getColumnsToRepeatAtLeft(); + + $settingString .= '\'' . str_replace("'", "''", $pSheet->getTitle()) . '\'!$' . $repeat[0] . ':$' . $repeat[1]; + } + + // Rows to repeat + if ($pSheet->getPageSetup()->isRowsToRepeatAtTopSet()) { + if ($pSheet->getPageSetup()->isColumnsToRepeatAtLeftSet()) { + $settingString .= ','; + } + + $repeat = $pSheet->getPageSetup()->getRowsToRepeatAtTop(); + + $settingString .= '\'' . str_replace("'", "''", $pSheet->getTitle()) . '\'!$' . $repeat[0] . ':$' . $repeat[1]; + } + + $objWriter->writeRawData($settingString); + + $objWriter->endElement(); + } + } + + /** + * Write Defined Name for PrintTitles + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet + * @param int $pSheetId + * @throws PHPExcel_Writer_Exception + */ + private function writeDefinedNameForPrintArea(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pSheetId = 0) + { + // definedName for PrintArea + if ($pSheet->getPageSetup()->isPrintAreaSet()) { + $objWriter->startElement('definedName'); + $objWriter->writeAttribute('name', '_xlnm.Print_Area'); + $objWriter->writeAttribute('localSheetId', $pSheetId); + + // Setting string + $settingString = ''; + + // Print area + $printArea = PHPExcel_Cell::splitRange($pSheet->getPageSetup()->getPrintArea()); + + $chunks = array(); + foreach ($printArea as $printAreaRect) { + $printAreaRect[0] = PHPExcel_Cell::absoluteReference($printAreaRect[0]); + $printAreaRect[1] = PHPExcel_Cell::absoluteReference($printAreaRect[1]); + $chunks[] = '\'' . str_replace("'", "''", $pSheet->getTitle()) . '\'!' . implode(':', $printAreaRect); + } + + $objWriter->writeRawData(implode(',', $chunks)); + + $objWriter->endElement(); + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Worksheet.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Worksheet.php new file mode 100644 index 0000000..c211403 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/Worksheet.php @@ -0,0 +1,1219 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ + + +/** + * PHPExcel_Writer_Excel2007_Worksheet + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel2007_Worksheet extends PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Write worksheet to XML format + * + * @param PHPExcel_Worksheet $pSheet + * @param string[] $pStringTable + * @param boolean $includeCharts Flag indicating if we should write charts + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeWorksheet($pSheet = null, $pStringTable = null, $includeCharts = false) + { + if (!is_null($pSheet)) { + // Create XML writer + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8', 'yes'); + + // Worksheet + $objWriter->startElement('worksheet'); + $objWriter->writeAttribute('xml:space', 'preserve'); + $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'); + $objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'); + + // sheetPr + $this->writeSheetPr($objWriter, $pSheet); + + // Dimension + $this->writeDimension($objWriter, $pSheet); + + // sheetViews + $this->writeSheetViews($objWriter, $pSheet); + + // sheetFormatPr + $this->writeSheetFormatPr($objWriter, $pSheet); + + // cols + $this->writeCols($objWriter, $pSheet); + + // sheetData + $this->writeSheetData($objWriter, $pSheet, $pStringTable); + + // sheetProtection + $this->writeSheetProtection($objWriter, $pSheet); + + // protectedRanges + $this->writeProtectedRanges($objWriter, $pSheet); + + // autoFilter + $this->writeAutoFilter($objWriter, $pSheet); + + // mergeCells + $this->writeMergeCells($objWriter, $pSheet); + + // conditionalFormatting + $this->writeConditionalFormatting($objWriter, $pSheet); + + // dataValidations + $this->writeDataValidations($objWriter, $pSheet); + + // hyperlinks + $this->writeHyperlinks($objWriter, $pSheet); + + // Print options + $this->writePrintOptions($objWriter, $pSheet); + + // Page margins + $this->writePageMargins($objWriter, $pSheet); + + // Page setup + $this->writePageSetup($objWriter, $pSheet); + + // Header / footer + $this->writeHeaderFooter($objWriter, $pSheet); + + // Breaks + $this->writeBreaks($objWriter, $pSheet); + + // Drawings and/or Charts + $this->writeDrawings($objWriter, $pSheet, $includeCharts); + + // LegacyDrawing + $this->writeLegacyDrawing($objWriter, $pSheet); + + // LegacyDrawingHF + $this->writeLegacyDrawingHF($objWriter, $pSheet); + + $objWriter->endElement(); + + // Return + return $objWriter->getData(); + } else { + throw new PHPExcel_Writer_Exception("Invalid PHPExcel_Worksheet object passed."); + } + } + + /** + * Write SheetPr + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws PHPExcel_Writer_Exception + */ + private function writeSheetPr(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // sheetPr + $objWriter->startElement('sheetPr'); + //$objWriter->writeAttribute('codeName', $pSheet->getTitle()); + if ($pSheet->getParent()->hasMacros()) {//if the workbook have macros, we need to have codeName for the sheet + if ($pSheet->hasCodeName()==false) { + $pSheet->setCodeName($pSheet->getTitle()); + } + $objWriter->writeAttribute('codeName', $pSheet->getCodeName()); + } + $autoFilterRange = $pSheet->getAutoFilter()->getRange(); + if (!empty($autoFilterRange)) { + $objWriter->writeAttribute('filterMode', 1); + $pSheet->getAutoFilter()->showHideRows(); + } + + // tabColor + if ($pSheet->isTabColorSet()) { + $objWriter->startElement('tabColor'); + $objWriter->writeAttribute('rgb', $pSheet->getTabColor()->getARGB()); + $objWriter->endElement(); + } + + // outlinePr + $objWriter->startElement('outlinePr'); + $objWriter->writeAttribute('summaryBelow', ($pSheet->getShowSummaryBelow() ? '1' : '0')); + $objWriter->writeAttribute('summaryRight', ($pSheet->getShowSummaryRight() ? '1' : '0')); + $objWriter->endElement(); + + // pageSetUpPr + if ($pSheet->getPageSetup()->getFitToPage()) { + $objWriter->startElement('pageSetUpPr'); + $objWriter->writeAttribute('fitToPage', '1'); + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + + /** + * Write Dimension + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws PHPExcel_Writer_Exception + */ + private function writeDimension(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // dimension + $objWriter->startElement('dimension'); + $objWriter->writeAttribute('ref', $pSheet->calculateWorksheetDimension()); + $objWriter->endElement(); + } + + /** + * Write SheetViews + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws PHPExcel_Writer_Exception + */ + private function writeSheetViews(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // sheetViews + $objWriter->startElement('sheetViews'); + + // Sheet selected? + $sheetSelected = false; + if ($this->getParentWriter()->getPHPExcel()->getIndex($pSheet) == $this->getParentWriter()->getPHPExcel()->getActiveSheetIndex()) { + $sheetSelected = true; + } + + // sheetView + $objWriter->startElement('sheetView'); + $objWriter->writeAttribute('tabSelected', $sheetSelected ? '1' : '0'); + $objWriter->writeAttribute('workbookViewId', '0'); + + // Zoom scales + if ($pSheet->getSheetView()->getZoomScale() != 100) { + $objWriter->writeAttribute('zoomScale', $pSheet->getSheetView()->getZoomScale()); + } + if ($pSheet->getSheetView()->getZoomScaleNormal() != 100) { + $objWriter->writeAttribute('zoomScaleNormal', $pSheet->getSheetView()->getZoomScaleNormal()); + } + + // View Layout Type + if ($pSheet->getSheetView()->getView() !== PHPExcel_Worksheet_SheetView::SHEETVIEW_NORMAL) { + $objWriter->writeAttribute('view', $pSheet->getSheetView()->getView()); + } + + // Gridlines + if ($pSheet->getShowGridlines()) { + $objWriter->writeAttribute('showGridLines', 'true'); + } else { + $objWriter->writeAttribute('showGridLines', 'false'); + } + + // Row and column headers + if ($pSheet->getShowRowColHeaders()) { + $objWriter->writeAttribute('showRowColHeaders', '1'); + } else { + $objWriter->writeAttribute('showRowColHeaders', '0'); + } + + // Right-to-left + if ($pSheet->getRightToLeft()) { + $objWriter->writeAttribute('rightToLeft', 'true'); + } + + $activeCell = $pSheet->getActiveCell(); + + // Pane + $pane = ''; + $topLeftCell = $pSheet->getFreezePane(); + if (($topLeftCell != '') && ($topLeftCell != 'A1')) { + $activeCell = empty($activeCell) ? $topLeftCell : $activeCell; + // Calculate freeze coordinates + $xSplit = $ySplit = 0; + + list($xSplit, $ySplit) = PHPExcel_Cell::coordinateFromString($topLeftCell); + $xSplit = PHPExcel_Cell::columnIndexFromString($xSplit); + + // pane + $pane = 'topRight'; + $objWriter->startElement('pane'); + if ($xSplit > 1) { + $objWriter->writeAttribute('xSplit', $xSplit - 1); + } + if ($ySplit > 1) { + $objWriter->writeAttribute('ySplit', $ySplit - 1); + $pane = ($xSplit > 1) ? 'bottomRight' : 'bottomLeft'; + } + $objWriter->writeAttribute('topLeftCell', $topLeftCell); + $objWriter->writeAttribute('activePane', $pane); + $objWriter->writeAttribute('state', 'frozen'); + $objWriter->endElement(); + + if (($xSplit > 1) && ($ySplit > 1)) { + // Write additional selections if more than two panes (ie both an X and a Y split) + $objWriter->startElement('selection'); + $objWriter->writeAttribute('pane', 'topRight'); + $objWriter->endElement(); + $objWriter->startElement('selection'); + $objWriter->writeAttribute('pane', 'bottomLeft'); + $objWriter->endElement(); + } + } + + // Selection +// if ($pane != '') { + // Only need to write selection element if we have a split pane + // We cheat a little by over-riding the active cell selection, setting it to the split cell + $objWriter->startElement('selection'); + if ($pane != '') { + $objWriter->writeAttribute('pane', $pane); + } + $objWriter->writeAttribute('activeCell', $activeCell); + $objWriter->writeAttribute('sqref', $activeCell); + $objWriter->endElement(); +// } + + $objWriter->endElement(); + + $objWriter->endElement(); + } + + /** + * Write SheetFormatPr + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws PHPExcel_Writer_Exception + */ + private function writeSheetFormatPr(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // sheetFormatPr + $objWriter->startElement('sheetFormatPr'); + + // Default row height + if ($pSheet->getDefaultRowDimension()->getRowHeight() >= 0) { + $objWriter->writeAttribute('customHeight', 'true'); + $objWriter->writeAttribute('defaultRowHeight', PHPExcel_Shared_String::FormatNumber($pSheet->getDefaultRowDimension()->getRowHeight())); + } else { + $objWriter->writeAttribute('defaultRowHeight', '14.4'); + } + + // Set Zero Height row + if ((string)$pSheet->getDefaultRowDimension()->getZeroHeight() == '1' || + strtolower((string)$pSheet->getDefaultRowDimension()->getZeroHeight()) == 'true') { + $objWriter->writeAttribute('zeroHeight', '1'); + } + + // Default column width + if ($pSheet->getDefaultColumnDimension()->getWidth() >= 0) { + $objWriter->writeAttribute('defaultColWidth', PHPExcel_Shared_String::FormatNumber($pSheet->getDefaultColumnDimension()->getWidth())); + } + + // Outline level - row + $outlineLevelRow = 0; + foreach ($pSheet->getRowDimensions() as $dimension) { + if ($dimension->getOutlineLevel() > $outlineLevelRow) { + $outlineLevelRow = $dimension->getOutlineLevel(); + } + } + $objWriter->writeAttribute('outlineLevelRow', (int)$outlineLevelRow); + + // Outline level - column + $outlineLevelCol = 0; + foreach ($pSheet->getColumnDimensions() as $dimension) { + if ($dimension->getOutlineLevel() > $outlineLevelCol) { + $outlineLevelCol = $dimension->getOutlineLevel(); + } + } + $objWriter->writeAttribute('outlineLevelCol', (int)$outlineLevelCol); + + $objWriter->endElement(); + } + + /** + * Write Cols + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws PHPExcel_Writer_Exception + */ + private function writeCols(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // cols + if (count($pSheet->getColumnDimensions()) > 0) { + $objWriter->startElement('cols'); + + $pSheet->calculateColumnWidths(); + + // Loop through column dimensions + foreach ($pSheet->getColumnDimensions() as $colDimension) { + // col + $objWriter->startElement('col'); + $objWriter->writeAttribute('min', PHPExcel_Cell::columnIndexFromString($colDimension->getColumnIndex())); + $objWriter->writeAttribute('max', PHPExcel_Cell::columnIndexFromString($colDimension->getColumnIndex())); + + if ($colDimension->getWidth() < 0) { + // No width set, apply default of 10 + $objWriter->writeAttribute('width', '9.10'); + } else { + // Width set + $objWriter->writeAttribute('width', PHPExcel_Shared_String::FormatNumber($colDimension->getWidth())); + } + + // Column visibility + if ($colDimension->getVisible() == false) { + $objWriter->writeAttribute('hidden', 'true'); + } + + // Auto size? + if ($colDimension->getAutoSize()) { + $objWriter->writeAttribute('bestFit', 'true'); + } + + // Custom width? + if ($colDimension->getWidth() != $pSheet->getDefaultColumnDimension()->getWidth()) { + $objWriter->writeAttribute('customWidth', 'true'); + } + + // Collapsed + if ($colDimension->getCollapsed() == true) { + $objWriter->writeAttribute('collapsed', 'true'); + } + + // Outline level + if ($colDimension->getOutlineLevel() > 0) { + $objWriter->writeAttribute('outlineLevel', $colDimension->getOutlineLevel()); + } + + // Style + $objWriter->writeAttribute('style', $colDimension->getXfIndex()); + + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + } + + /** + * Write SheetProtection + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws PHPExcel_Writer_Exception + */ + private function writeSheetProtection(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // sheetProtection + $objWriter->startElement('sheetProtection'); + + if ($pSheet->getProtection()->getPassword() != '') { + $objWriter->writeAttribute('password', $pSheet->getProtection()->getPassword()); + } + + $objWriter->writeAttribute('sheet', ($pSheet->getProtection()->getSheet() ? 'true' : 'false')); + $objWriter->writeAttribute('objects', ($pSheet->getProtection()->getObjects() ? 'true' : 'false')); + $objWriter->writeAttribute('scenarios', ($pSheet->getProtection()->getScenarios() ? 'true' : 'false')); + $objWriter->writeAttribute('formatCells', ($pSheet->getProtection()->getFormatCells() ? 'true' : 'false')); + $objWriter->writeAttribute('formatColumns', ($pSheet->getProtection()->getFormatColumns() ? 'true' : 'false')); + $objWriter->writeAttribute('formatRows', ($pSheet->getProtection()->getFormatRows() ? 'true' : 'false')); + $objWriter->writeAttribute('insertColumns', ($pSheet->getProtection()->getInsertColumns() ? 'true' : 'false')); + $objWriter->writeAttribute('insertRows', ($pSheet->getProtection()->getInsertRows() ? 'true' : 'false')); + $objWriter->writeAttribute('insertHyperlinks', ($pSheet->getProtection()->getInsertHyperlinks() ? 'true' : 'false')); + $objWriter->writeAttribute('deleteColumns', ($pSheet->getProtection()->getDeleteColumns() ? 'true' : 'false')); + $objWriter->writeAttribute('deleteRows', ($pSheet->getProtection()->getDeleteRows() ? 'true' : 'false')); + $objWriter->writeAttribute('selectLockedCells', ($pSheet->getProtection()->getSelectLockedCells() ? 'true' : 'false')); + $objWriter->writeAttribute('sort', ($pSheet->getProtection()->getSort() ? 'true' : 'false')); + $objWriter->writeAttribute('autoFilter', ($pSheet->getProtection()->getAutoFilter() ? 'true' : 'false')); + $objWriter->writeAttribute('pivotTables', ($pSheet->getProtection()->getPivotTables() ? 'true' : 'false')); + $objWriter->writeAttribute('selectUnlockedCells', ($pSheet->getProtection()->getSelectUnlockedCells() ? 'true' : 'false')); + $objWriter->endElement(); + } + + /** + * Write ConditionalFormatting + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws PHPExcel_Writer_Exception + */ + private function writeConditionalFormatting(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // Conditional id + $id = 1; + + // Loop through styles in the current worksheet + foreach ($pSheet->getConditionalStylesCollection() as $cellCoordinate => $conditionalStyles) { + foreach ($conditionalStyles as $conditional) { + // WHY was this again? + // if ($this->getParentWriter()->getStylesConditionalHashTable()->getIndexForHashCode($conditional->getHashCode()) == '') { + // continue; + // } + if ($conditional->getConditionType() != PHPExcel_Style_Conditional::CONDITION_NONE) { + // conditionalFormatting + $objWriter->startElement('conditionalFormatting'); + $objWriter->writeAttribute('sqref', $cellCoordinate); + + // cfRule + $objWriter->startElement('cfRule'); + $objWriter->writeAttribute('type', $conditional->getConditionType()); + $objWriter->writeAttribute('dxfId', $this->getParentWriter()->getStylesConditionalHashTable()->getIndexForHashCode($conditional->getHashCode())); + $objWriter->writeAttribute('priority', $id++); + + if (($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CELLIS || $conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT) + && $conditional->getOperatorType() != PHPExcel_Style_Conditional::OPERATOR_NONE) { + $objWriter->writeAttribute('operator', $conditional->getOperatorType()); + } + + if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT + && !is_null($conditional->getText())) { + $objWriter->writeAttribute('text', $conditional->getText()); + } + + if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT + && $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_CONTAINSTEXT + && !is_null($conditional->getText())) { + $objWriter->writeElement('formula', 'NOT(ISERROR(SEARCH("' . $conditional->getText() . '",' . $cellCoordinate . ')))'); + } elseif ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT + && $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_BEGINSWITH + && !is_null($conditional->getText())) { + $objWriter->writeElement('formula', 'LEFT(' . $cellCoordinate . ',' . strlen($conditional->getText()) . ')="' . $conditional->getText() . '"'); + } elseif ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT + && $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_ENDSWITH + && !is_null($conditional->getText())) { + $objWriter->writeElement('formula', 'RIGHT(' . $cellCoordinate . ',' . strlen($conditional->getText()) . ')="' . $conditional->getText() . '"'); + } elseif ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT + && $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_NOTCONTAINS + && !is_null($conditional->getText())) { + $objWriter->writeElement('formula', 'ISERROR(SEARCH("' . $conditional->getText() . '",' . $cellCoordinate . '))'); + } elseif ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CELLIS + || $conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT + || $conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_EXPRESSION) { + foreach ($conditional->getConditions() as $formula) { + // Formula + $objWriter->writeElement('formula', $formula); + } + } + + $objWriter->endElement(); + + $objWriter->endElement(); + } + } + } + } + + /** + * Write DataValidations + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws PHPExcel_Writer_Exception + */ + private function writeDataValidations(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // Datavalidation collection + $dataValidationCollection = $pSheet->getDataValidationCollection(); + + // Write data validations? + if (!empty($dataValidationCollection)) { + $objWriter->startElement('dataValidations'); + $objWriter->writeAttribute('count', count($dataValidationCollection)); + + foreach ($dataValidationCollection as $coordinate => $dv) { + $objWriter->startElement('dataValidation'); + + if ($dv->getType() != '') { + $objWriter->writeAttribute('type', $dv->getType()); + } + + if ($dv->getErrorStyle() != '') { + $objWriter->writeAttribute('errorStyle', $dv->getErrorStyle()); + } + + if ($dv->getOperator() != '') { + $objWriter->writeAttribute('operator', $dv->getOperator()); + } + + $objWriter->writeAttribute('allowBlank', ($dv->getAllowBlank() ? '1' : '0')); + $objWriter->writeAttribute('showDropDown', (!$dv->getShowDropDown() ? '1' : '0')); + $objWriter->writeAttribute('showInputMessage', ($dv->getShowInputMessage() ? '1' : '0')); + $objWriter->writeAttribute('showErrorMessage', ($dv->getShowErrorMessage() ? '1' : '0')); + + if ($dv->getErrorTitle() !== '') { + $objWriter->writeAttribute('errorTitle', $dv->getErrorTitle()); + } + if ($dv->getError() !== '') { + $objWriter->writeAttribute('error', $dv->getError()); + } + if ($dv->getPromptTitle() !== '') { + $objWriter->writeAttribute('promptTitle', $dv->getPromptTitle()); + } + if ($dv->getPrompt() !== '') { + $objWriter->writeAttribute('prompt', $dv->getPrompt()); + } + + $objWriter->writeAttribute('sqref', $coordinate); + + if ($dv->getFormula1() !== '') { + $objWriter->writeElement('formula1', $dv->getFormula1()); + } + if ($dv->getFormula2() !== '') { + $objWriter->writeElement('formula2', $dv->getFormula2()); + } + + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + } + + /** + * Write Hyperlinks + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws PHPExcel_Writer_Exception + */ + private function writeHyperlinks(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // Hyperlink collection + $hyperlinkCollection = $pSheet->getHyperlinkCollection(); + + // Relation ID + $relationId = 1; + + // Write hyperlinks? + if (!empty($hyperlinkCollection)) { + $objWriter->startElement('hyperlinks'); + + foreach ($hyperlinkCollection as $coordinate => $hyperlink) { + $objWriter->startElement('hyperlink'); + + $objWriter->writeAttribute('ref', $coordinate); + if (!$hyperlink->isInternal()) { + $objWriter->writeAttribute('r:id', 'rId_hyperlink_' . $relationId); + ++$relationId; + } else { + $objWriter->writeAttribute('location', str_replace('sheet://', '', $hyperlink->getUrl())); + } + + if ($hyperlink->getTooltip() != '') { + $objWriter->writeAttribute('tooltip', $hyperlink->getTooltip()); + } + + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + } + + /** + * Write ProtectedRanges + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws PHPExcel_Writer_Exception + */ + private function writeProtectedRanges(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + if (count($pSheet->getProtectedCells()) > 0) { + // protectedRanges + $objWriter->startElement('protectedRanges'); + + // Loop protectedRanges + foreach ($pSheet->getProtectedCells() as $protectedCell => $passwordHash) { + // protectedRange + $objWriter->startElement('protectedRange'); + $objWriter->writeAttribute('name', 'p' . md5($protectedCell)); + $objWriter->writeAttribute('sqref', $protectedCell); + if (!empty($passwordHash)) { + $objWriter->writeAttribute('password', $passwordHash); + } + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + } + + /** + * Write MergeCells + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws PHPExcel_Writer_Exception + */ + private function writeMergeCells(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + if (count($pSheet->getMergeCells()) > 0) { + // mergeCells + $objWriter->startElement('mergeCells'); + + // Loop mergeCells + foreach ($pSheet->getMergeCells() as $mergeCell) { + // mergeCell + $objWriter->startElement('mergeCell'); + $objWriter->writeAttribute('ref', $mergeCell); + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + } + + /** + * Write PrintOptions + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws PHPExcel_Writer_Exception + */ + private function writePrintOptions(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // printOptions + $objWriter->startElement('printOptions'); + + $objWriter->writeAttribute('gridLines', ($pSheet->getPrintGridlines() ? 'true': 'false')); + $objWriter->writeAttribute('gridLinesSet', 'true'); + + if ($pSheet->getPageSetup()->getHorizontalCentered()) { + $objWriter->writeAttribute('horizontalCentered', 'true'); + } + + if ($pSheet->getPageSetup()->getVerticalCentered()) { + $objWriter->writeAttribute('verticalCentered', 'true'); + } + + $objWriter->endElement(); + } + + /** + * Write PageMargins + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws PHPExcel_Writer_Exception + */ + private function writePageMargins(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // pageMargins + $objWriter->startElement('pageMargins'); + $objWriter->writeAttribute('left', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getLeft())); + $objWriter->writeAttribute('right', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getRight())); + $objWriter->writeAttribute('top', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getTop())); + $objWriter->writeAttribute('bottom', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getBottom())); + $objWriter->writeAttribute('header', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getHeader())); + $objWriter->writeAttribute('footer', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getFooter())); + $objWriter->endElement(); + } + + /** + * Write AutoFilter + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws PHPExcel_Writer_Exception + */ + private function writeAutoFilter(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + $autoFilterRange = $pSheet->getAutoFilter()->getRange(); + if (!empty($autoFilterRange)) { + // autoFilter + $objWriter->startElement('autoFilter'); + + // Strip any worksheet reference from the filter coordinates + $range = PHPExcel_Cell::splitRange($autoFilterRange); + $range = $range[0]; + // Strip any worksheet ref + if (strpos($range[0], '!') !== false) { + list($ws, $range[0]) = explode('!', $range[0]); + } + $range = implode(':', $range); + + $objWriter->writeAttribute('ref', str_replace('$', '', $range)); + + $columns = $pSheet->getAutoFilter()->getColumns(); + if (count($columns > 0)) { + foreach ($columns as $columnID => $column) { + $rules = $column->getRules(); + if (count($rules) > 0) { + $objWriter->startElement('filterColumn'); + $objWriter->writeAttribute('colId', $pSheet->getAutoFilter()->getColumnOffset($columnID)); + + $objWriter->startElement($column->getFilterType()); + if ($column->getJoin() == PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_AND) { + $objWriter->writeAttribute('and', 1); + } + + foreach ($rules as $rule) { + if (($column->getFilterType() === PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_FILTER) && + ($rule->getOperator() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL) && + ($rule->getValue() === '')) { + // Filter rule for Blanks + $objWriter->writeAttribute('blank', 1); + } elseif ($rule->getRuleType() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMICFILTER) { + // Dynamic Filter Rule + $objWriter->writeAttribute('type', $rule->getGrouping()); + $val = $column->getAttribute('val'); + if ($val !== null) { + $objWriter->writeAttribute('val', $val); + } + $maxVal = $column->getAttribute('maxVal'); + if ($maxVal !== null) { + $objWriter->writeAttribute('maxVal', $maxVal); + } + } elseif ($rule->getRuleType() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_TOPTENFILTER) { + // Top 10 Filter Rule + $objWriter->writeAttribute('val', $rule->getValue()); + $objWriter->writeAttribute('percent', (($rule->getOperator() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT) ? '1' : '0')); + $objWriter->writeAttribute('top', (($rule->getGrouping() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP) ? '1': '0')); + } else { + // Filter, DateGroupItem or CustomFilter + $objWriter->startElement($rule->getRuleType()); + + if ($rule->getOperator() !== PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL) { + $objWriter->writeAttribute('operator', $rule->getOperator()); + } + if ($rule->getRuleType() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP) { + // Date Group filters + foreach ($rule->getValue() as $key => $value) { + if ($value > '') { + $objWriter->writeAttribute($key, $value); + } + } + $objWriter->writeAttribute('dateTimeGrouping', $rule->getGrouping()); + } else { + $objWriter->writeAttribute('val', $rule->getValue()); + } + + $objWriter->endElement(); + } + } + + $objWriter->endElement(); + + $objWriter->endElement(); + } + } + } + $objWriter->endElement(); + } + } + + /** + * Write PageSetup + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws PHPExcel_Writer_Exception + */ + private function writePageSetup(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // pageSetup + $objWriter->startElement('pageSetup'); + $objWriter->writeAttribute('paperSize', $pSheet->getPageSetup()->getPaperSize()); + $objWriter->writeAttribute('orientation', $pSheet->getPageSetup()->getOrientation()); + + if (!is_null($pSheet->getPageSetup()->getScale())) { + $objWriter->writeAttribute('scale', $pSheet->getPageSetup()->getScale()); + } + if (!is_null($pSheet->getPageSetup()->getFitToHeight())) { + $objWriter->writeAttribute('fitToHeight', $pSheet->getPageSetup()->getFitToHeight()); + } else { + $objWriter->writeAttribute('fitToHeight', '0'); + } + if (!is_null($pSheet->getPageSetup()->getFitToWidth())) { + $objWriter->writeAttribute('fitToWidth', $pSheet->getPageSetup()->getFitToWidth()); + } else { + $objWriter->writeAttribute('fitToWidth', '0'); + } + if (!is_null($pSheet->getPageSetup()->getFirstPageNumber())) { + $objWriter->writeAttribute('firstPageNumber', $pSheet->getPageSetup()->getFirstPageNumber()); + $objWriter->writeAttribute('useFirstPageNumber', '1'); + } + + $objWriter->endElement(); + } + + /** + * Write Header / Footer + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws PHPExcel_Writer_Exception + */ + private function writeHeaderFooter(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // headerFooter + $objWriter->startElement('headerFooter'); + $objWriter->writeAttribute('differentOddEven', ($pSheet->getHeaderFooter()->getDifferentOddEven() ? 'true' : 'false')); + $objWriter->writeAttribute('differentFirst', ($pSheet->getHeaderFooter()->getDifferentFirst() ? 'true' : 'false')); + $objWriter->writeAttribute('scaleWithDoc', ($pSheet->getHeaderFooter()->getScaleWithDocument() ? 'true' : 'false')); + $objWriter->writeAttribute('alignWithMargins', ($pSheet->getHeaderFooter()->getAlignWithMargins() ? 'true' : 'false')); + + $objWriter->writeElement('oddHeader', $pSheet->getHeaderFooter()->getOddHeader()); + $objWriter->writeElement('oddFooter', $pSheet->getHeaderFooter()->getOddFooter()); + $objWriter->writeElement('evenHeader', $pSheet->getHeaderFooter()->getEvenHeader()); + $objWriter->writeElement('evenFooter', $pSheet->getHeaderFooter()->getEvenFooter()); + $objWriter->writeElement('firstHeader', $pSheet->getHeaderFooter()->getFirstHeader()); + $objWriter->writeElement('firstFooter', $pSheet->getHeaderFooter()->getFirstFooter()); + $objWriter->endElement(); + } + + /** + * Write Breaks + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws PHPExcel_Writer_Exception + */ + private function writeBreaks(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // Get row and column breaks + $aRowBreaks = array(); + $aColumnBreaks = array(); + foreach ($pSheet->getBreaks() as $cell => $breakType) { + if ($breakType == PHPExcel_Worksheet::BREAK_ROW) { + $aRowBreaks[] = $cell; + } elseif ($breakType == PHPExcel_Worksheet::BREAK_COLUMN) { + $aColumnBreaks[] = $cell; + } + } + + // rowBreaks + if (!empty($aRowBreaks)) { + $objWriter->startElement('rowBreaks'); + $objWriter->writeAttribute('count', count($aRowBreaks)); + $objWriter->writeAttribute('manualBreakCount', count($aRowBreaks)); + + foreach ($aRowBreaks as $cell) { + $coords = PHPExcel_Cell::coordinateFromString($cell); + + $objWriter->startElement('brk'); + $objWriter->writeAttribute('id', $coords[1]); + $objWriter->writeAttribute('man', '1'); + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + + // Second, write column breaks + if (!empty($aColumnBreaks)) { + $objWriter->startElement('colBreaks'); + $objWriter->writeAttribute('count', count($aColumnBreaks)); + $objWriter->writeAttribute('manualBreakCount', count($aColumnBreaks)); + + foreach ($aColumnBreaks as $cell) { + $coords = PHPExcel_Cell::coordinateFromString($cell); + + $objWriter->startElement('brk'); + $objWriter->writeAttribute('id', PHPExcel_Cell::columnIndexFromString($coords[0]) - 1); + $objWriter->writeAttribute('man', '1'); + $objWriter->endElement(); + } + + $objWriter->endElement(); + } + } + + /** + * Write SheetData + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @param string[] $pStringTable String table + * @throws PHPExcel_Writer_Exception + */ + private function writeSheetData(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pStringTable = null) + { + if (is_array($pStringTable)) { + // Flipped stringtable, for faster index searching + $aFlippedStringTable = $this->getParentWriter()->getWriterPart('stringtable')->flipStringTable($pStringTable); + + // sheetData + $objWriter->startElement('sheetData'); + + // Get column count + $colCount = PHPExcel_Cell::columnIndexFromString($pSheet->getHighestColumn()); + + // Highest row number + $highestRow = $pSheet->getHighestRow(); + + // Loop through cells + $cellsByRow = array(); + foreach ($pSheet->getCellCollection() as $cellID) { + $cellAddress = PHPExcel_Cell::coordinateFromString($cellID); + $cellsByRow[$cellAddress[1]][] = $cellID; + } + + $currentRow = 0; + while ($currentRow++ < $highestRow) { + // Get row dimension + $rowDimension = $pSheet->getRowDimension($currentRow); + + // Write current row? + $writeCurrentRow = isset($cellsByRow[$currentRow]) || $rowDimension->getRowHeight() >= 0 || $rowDimension->getVisible() == false || $rowDimension->getCollapsed() == true || $rowDimension->getOutlineLevel() > 0 || $rowDimension->getXfIndex() !== null; + + if ($writeCurrentRow) { + // Start a new row + $objWriter->startElement('row'); + $objWriter->writeAttribute('r', $currentRow); + $objWriter->writeAttribute('spans', '1:' . $colCount); + + // Row dimensions + if ($rowDimension->getRowHeight() >= 0) { + $objWriter->writeAttribute('customHeight', '1'); + $objWriter->writeAttribute('ht', PHPExcel_Shared_String::FormatNumber($rowDimension->getRowHeight())); + } + + // Row visibility + if ($rowDimension->getVisible() == false) { + $objWriter->writeAttribute('hidden', 'true'); + } + + // Collapsed + if ($rowDimension->getCollapsed() == true) { + $objWriter->writeAttribute('collapsed', 'true'); + } + + // Outline level + if ($rowDimension->getOutlineLevel() > 0) { + $objWriter->writeAttribute('outlineLevel', $rowDimension->getOutlineLevel()); + } + + // Style + if ($rowDimension->getXfIndex() !== null) { + $objWriter->writeAttribute('s', $rowDimension->getXfIndex()); + $objWriter->writeAttribute('customFormat', '1'); + } + + // Write cells + if (isset($cellsByRow[$currentRow])) { + foreach ($cellsByRow[$currentRow] as $cellAddress) { + // Write cell + $this->writeCell($objWriter, $pSheet, $cellAddress, $pStringTable, $aFlippedStringTable); + } + } + + // End row + $objWriter->endElement(); + } + } + + $objWriter->endElement(); + } else { + throw new PHPExcel_Writer_Exception("Invalid parameters passed."); + } + } + + /** + * Write Cell + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @param PHPExcel_Cell $pCellAddress Cell Address + * @param string[] $pStringTable String table + * @param string[] $pFlippedStringTable String table (flipped), for faster index searching + * @throws PHPExcel_Writer_Exception + */ + private function writeCell(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pCellAddress = null, $pStringTable = null, $pFlippedStringTable = null) + { + if (is_array($pStringTable) && is_array($pFlippedStringTable)) { + // Cell + $pCell = $pSheet->getCell($pCellAddress); + $objWriter->startElement('c'); + $objWriter->writeAttribute('r', $pCellAddress); + + // Sheet styles + if ($pCell->getXfIndex() != '') { + $objWriter->writeAttribute('s', $pCell->getXfIndex()); + } + + // If cell value is supplied, write cell value + $cellValue = $pCell->getValue(); + if (is_object($cellValue) || $cellValue !== '') { + // Map type + $mappedType = $pCell->getDataType(); + + // Write data type depending on its type + switch (strtolower($mappedType)) { + case 'inlinestr': // Inline string + case 's': // String + case 'b': // Boolean + $objWriter->writeAttribute('t', $mappedType); + break; + case 'f': // Formula + $calculatedValue = ($this->getParentWriter()->getPreCalculateFormulas()) ? + $pCell->getCalculatedValue() : + $cellValue; + if (is_string($calculatedValue)) { + $objWriter->writeAttribute('t', 'str'); + } + break; + case 'e': // Error + $objWriter->writeAttribute('t', $mappedType); + } + + // Write data depending on its type + switch (strtolower($mappedType)) { + case 'inlinestr': // Inline string + if (! $cellValue instanceof PHPExcel_RichText) { + $objWriter->writeElement('t', PHPExcel_Shared_String::ControlCharacterPHP2OOXML(htmlspecialchars($cellValue))); + } elseif ($cellValue instanceof PHPExcel_RichText) { + $objWriter->startElement('is'); + $this->getParentWriter()->getWriterPart('stringtable')->writeRichText($objWriter, $cellValue); + $objWriter->endElement(); + } + + break; + case 's': // String + if (! $cellValue instanceof PHPExcel_RichText) { + if (isset($pFlippedStringTable[$cellValue])) { + $objWriter->writeElement('v', $pFlippedStringTable[$cellValue]); + } + } elseif ($cellValue instanceof PHPExcel_RichText) { + $objWriter->writeElement('v', $pFlippedStringTable[$cellValue->getHashCode()]); + } + + break; + case 'f': // Formula + $attributes = $pCell->getFormulaAttributes(); + if ($attributes['t'] == 'array') { + $objWriter->startElement('f'); + $objWriter->writeAttribute('t', 'array'); + $objWriter->writeAttribute('ref', $pCellAddress); + $objWriter->writeAttribute('aca', '1'); + $objWriter->writeAttribute('ca', '1'); + $objWriter->text(substr($cellValue, 1)); + $objWriter->endElement(); + } else { + $objWriter->writeElement('f', substr($cellValue, 1)); + } + if ($this->getParentWriter()->getOffice2003Compatibility() === false) { + if ($this->getParentWriter()->getPreCalculateFormulas()) { +// $calculatedValue = $pCell->getCalculatedValue(); + if (!is_array($calculatedValue) && substr($calculatedValue, 0, 1) != '#') { + $objWriter->writeElement('v', PHPExcel_Shared_String::FormatNumber($calculatedValue)); + } else { + $objWriter->writeElement('v', '0'); + } + } else { + $objWriter->writeElement('v', '0'); + } + } + break; + case 'n': // Numeric + // force point as decimal separator in case current locale uses comma + $objWriter->writeElement('v', str_replace(',', '.', $cellValue)); + break; + case 'b': // Boolean + $objWriter->writeElement('v', ($cellValue ? '1' : '0')); + break; + case 'e': // Error + if (substr($cellValue, 0, 1) == '=') { + $objWriter->writeElement('f', substr($cellValue, 1)); + $objWriter->writeElement('v', substr($cellValue, 1)); + } else { + $objWriter->writeElement('v', $cellValue); + } + + break; + } + } + + $objWriter->endElement(); + } else { + throw new PHPExcel_Writer_Exception("Invalid parameters passed."); + } + } + + /** + * Write Drawings + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @param boolean $includeCharts Flag indicating if we should include drawing details for charts + * @throws PHPExcel_Writer_Exception + */ + private function writeDrawings(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $includeCharts = false) + { + $chartCount = ($includeCharts) ? $pSheet->getChartCollection()->count() : 0; + // If sheet contains drawings, add the relationships + if (($pSheet->getDrawingCollection()->count() > 0) || + ($chartCount > 0)) { + $objWriter->startElement('drawing'); + $objWriter->writeAttribute('r:id', 'rId1'); + $objWriter->endElement(); + } + } + + /** + * Write LegacyDrawing + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws PHPExcel_Writer_Exception + */ + private function writeLegacyDrawing(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // If sheet contains comments, add the relationships + if (count($pSheet->getComments()) > 0) { + $objWriter->startElement('legacyDrawing'); + $objWriter->writeAttribute('r:id', 'rId_comments_vml1'); + $objWriter->endElement(); + } + } + + /** + * Write LegacyDrawingHF + * + * @param PHPExcel_Shared_XMLWriter $objWriter XML Writer + * @param PHPExcel_Worksheet $pSheet Worksheet + * @throws PHPExcel_Writer_Exception + */ + private function writeLegacyDrawingHF(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null) + { + // If sheet contains images, add the relationships + if (count($pSheet->getHeaderFooter()->getImages()) > 0) { + $objWriter->startElement('legacyDrawingHF'); + $objWriter->writeAttribute('r:id', 'rId_headerfooter_vml1'); + $objWriter->endElement(); + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/WriterPart.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/WriterPart.php new file mode 100644 index 0000000..806ebe5 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel2007/WriterPart.php @@ -0,0 +1,75 @@ +<?php + +/** + * PHPExcel_Writer_Excel2007_WriterPart + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel2007 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +abstract class PHPExcel_Writer_Excel2007_WriterPart +{ + /** + * Parent IWriter object + * + * @var PHPExcel_Writer_IWriter + */ + private $parentWriter; + + /** + * Set parent IWriter object + * + * @param PHPExcel_Writer_IWriter $pWriter + * @throws PHPExcel_Writer_Exception + */ + public function setParentWriter(PHPExcel_Writer_IWriter $pWriter = null) + { + $this->parentWriter = $pWriter; + } + + /** + * Get parent IWriter object + * + * @return PHPExcel_Writer_IWriter + * @throws PHPExcel_Writer_Exception + */ + public function getParentWriter() + { + if (!is_null($this->parentWriter)) { + return $this->parentWriter; + } else { + throw new PHPExcel_Writer_Exception("No parent PHPExcel_Writer_IWriter assigned."); + } + } + + /** + * Set parent IWriter object + * + * @param PHPExcel_Writer_IWriter $pWriter + * @throws PHPExcel_Writer_Exception + */ + public function __construct(PHPExcel_Writer_IWriter $pWriter = null) + { + if (!is_null($pWriter)) { + $this->parentWriter = $pWriter; + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel5.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel5.php new file mode 100644 index 0000000..2dede81 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel5.php @@ -0,0 +1,904 @@ +<?php + +/** + * PHPExcel_Writer_Excel5 + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_Excel5 extends PHPExcel_Writer_Abstract implements PHPExcel_Writer_IWriter +{ + /** + * PHPExcel object + * + * @var PHPExcel + */ + private $phpExcel; + + /** + * Total number of shared strings in workbook + * + * @var int + */ + private $strTotal = 0; + + /** + * Number of unique shared strings in workbook + * + * @var int + */ + private $strUnique = 0; + + /** + * Array of unique shared strings in workbook + * + * @var array + */ + private $strTable = array(); + + /** + * Color cache. Mapping between RGB value and color index. + * + * @var array + */ + private $colors; + + /** + * Formula parser + * + * @var PHPExcel_Writer_Excel5_Parser + */ + private $parser; + + /** + * Identifier clusters for drawings. Used in MSODRAWINGGROUP record. + * + * @var array + */ + private $IDCLs; + + /** + * Basic OLE object summary information + * + * @var array + */ + private $summaryInformation; + + /** + * Extended OLE object document summary information + * + * @var array + */ + private $documentSummaryInformation; + + /** + * Create a new PHPExcel_Writer_Excel5 + * + * @param PHPExcel $phpExcel PHPExcel object + */ + public function __construct(PHPExcel $phpExcel) + { + $this->phpExcel = $phpExcel; + + $this->parser = new PHPExcel_Writer_Excel5_Parser(); + } + + /** + * Save PHPExcel to file + * + * @param string $pFilename + * @throws PHPExcel_Writer_Exception + */ + public function save($pFilename = null) + { + + // garbage collect + $this->phpExcel->garbageCollect(); + + $saveDebugLog = PHPExcel_Calculation::getInstance($this->phpExcel)->getDebugLog()->getWriteDebugLog(); + PHPExcel_Calculation::getInstance($this->phpExcel)->getDebugLog()->setWriteDebugLog(false); + $saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType(); + PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL); + + // initialize colors array + $this->colors = array(); + + // Initialise workbook writer + $this->writerWorkbook = new PHPExcel_Writer_Excel5_Workbook($this->phpExcel, $this->strTotal, $this->strUnique, $this->strTable, $this->colors, $this->parser); + + // Initialise worksheet writers + $countSheets = $this->phpExcel->getSheetCount(); + for ($i = 0; $i < $countSheets; ++$i) { + $this->writerWorksheets[$i] = new PHPExcel_Writer_Excel5_Worksheet($this->strTotal, $this->strUnique, $this->strTable, $this->colors, $this->parser, $this->preCalculateFormulas, $this->phpExcel->getSheet($i)); + } + + // build Escher objects. Escher objects for workbooks needs to be build before Escher object for workbook. + $this->buildWorksheetEschers(); + $this->buildWorkbookEscher(); + + // add 15 identical cell style Xfs + // for now, we use the first cellXf instead of cellStyleXf + $cellXfCollection = $this->phpExcel->getCellXfCollection(); + for ($i = 0; $i < 15; ++$i) { + $this->writerWorkbook->addXfWriter($cellXfCollection[0], true); + } + + // add all the cell Xfs + foreach ($this->phpExcel->getCellXfCollection() as $style) { + $this->writerWorkbook->addXfWriter($style, false); + } + + // add fonts from rich text eleemnts + for ($i = 0; $i < $countSheets; ++$i) { + foreach ($this->writerWorksheets[$i]->phpSheet->getCellCollection() as $cellID) { + $cell = $this->writerWorksheets[$i]->phpSheet->getCell($cellID); + $cVal = $cell->getValue(); + if ($cVal instanceof PHPExcel_RichText) { + $elements = $cVal->getRichTextElements(); + foreach ($elements as $element) { + if ($element instanceof PHPExcel_RichText_Run) { + $font = $element->getFont(); + $this->writerWorksheets[$i]->fontHashIndex[$font->getHashCode()] = $this->writerWorkbook->addFont($font); + } + } + } + } + } + + // initialize OLE file + $workbookStreamName = 'Workbook'; + $OLE = new PHPExcel_Shared_OLE_PPS_File(PHPExcel_Shared_OLE::Asc2Ucs($workbookStreamName)); + + // Write the worksheet streams before the global workbook stream, + // because the byte sizes of these are needed in the global workbook stream + $worksheetSizes = array(); + for ($i = 0; $i < $countSheets; ++$i) { + $this->writerWorksheets[$i]->close(); + $worksheetSizes[] = $this->writerWorksheets[$i]->_datasize; + } + + // add binary data for global workbook stream + $OLE->append($this->writerWorkbook->writeWorkbook($worksheetSizes)); + + // add binary data for sheet streams + for ($i = 0; $i < $countSheets; ++$i) { + $OLE->append($this->writerWorksheets[$i]->getData()); + } + + $this->documentSummaryInformation = $this->writeDocumentSummaryInformation(); + // initialize OLE Document Summary Information + if (isset($this->documentSummaryInformation) && !empty($this->documentSummaryInformation)) { + $OLE_DocumentSummaryInformation = new PHPExcel_Shared_OLE_PPS_File(PHPExcel_Shared_OLE::Asc2Ucs(chr(5) . 'DocumentSummaryInformation')); + $OLE_DocumentSummaryInformation->append($this->documentSummaryInformation); + } + + $this->summaryInformation = $this->writeSummaryInformation(); + // initialize OLE Summary Information + if (isset($this->summaryInformation) && !empty($this->summaryInformation)) { + $OLE_SummaryInformation = new PHPExcel_Shared_OLE_PPS_File(PHPExcel_Shared_OLE::Asc2Ucs(chr(5) . 'SummaryInformation')); + $OLE_SummaryInformation->append($this->summaryInformation); + } + + // define OLE Parts + $arrRootData = array($OLE); + // initialize OLE Properties file + if (isset($OLE_SummaryInformation)) { + $arrRootData[] = $OLE_SummaryInformation; + } + // initialize OLE Extended Properties file + if (isset($OLE_DocumentSummaryInformation)) { + $arrRootData[] = $OLE_DocumentSummaryInformation; + } + + $root = new PHPExcel_Shared_OLE_PPS_Root(time(), time(), $arrRootData); + // save the OLE file + $res = $root->save($pFilename); + + PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType); + PHPExcel_Calculation::getInstance($this->phpExcel)->getDebugLog()->setWriteDebugLog($saveDebugLog); + } + + /** + * Set temporary storage directory + * + * @deprecated + * @param string $pValue Temporary storage directory + * @throws PHPExcel_Writer_Exception when directory does not exist + * @return PHPExcel_Writer_Excel5 + */ + public function setTempDir($pValue = '') + { + return $this; + } + + /** + * Build the Worksheet Escher objects + * + */ + private function buildWorksheetEschers() + { + // 1-based index to BstoreContainer + $blipIndex = 0; + $lastReducedSpId = 0; + $lastSpId = 0; + + foreach ($this->phpExcel->getAllsheets() as $sheet) { + // sheet index + $sheetIndex = $sheet->getParent()->getIndex($sheet); + + $escher = null; + + // check if there are any shapes for this sheet + $filterRange = $sheet->getAutoFilter()->getRange(); + if (count($sheet->getDrawingCollection()) == 0 && empty($filterRange)) { + continue; + } + + // create intermediate Escher object + $escher = new PHPExcel_Shared_Escher(); + + // dgContainer + $dgContainer = new PHPExcel_Shared_Escher_DgContainer(); + + // set the drawing index (we use sheet index + 1) + $dgId = $sheet->getParent()->getIndex($sheet) + 1; + $dgContainer->setDgId($dgId); + $escher->setDgContainer($dgContainer); + + // spgrContainer + $spgrContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer(); + $dgContainer->setSpgrContainer($spgrContainer); + + // add one shape which is the group shape + $spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer(); + $spContainer->setSpgr(true); + $spContainer->setSpType(0); + $spContainer->setSpId(($sheet->getParent()->getIndex($sheet) + 1) << 10); + $spgrContainer->addChild($spContainer); + + // add the shapes + + $countShapes[$sheetIndex] = 0; // count number of shapes (minus group shape), in sheet + + foreach ($sheet->getDrawingCollection() as $drawing) { + ++$blipIndex; + + ++$countShapes[$sheetIndex]; + + // add the shape + $spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer(); + + // set the shape type + $spContainer->setSpType(0x004B); + // set the shape flag + $spContainer->setSpFlag(0x02); + + // set the shape index (we combine 1-based sheet index and $countShapes to create unique shape index) + $reducedSpId = $countShapes[$sheetIndex]; + $spId = $reducedSpId + | ($sheet->getParent()->getIndex($sheet) + 1) << 10; + $spContainer->setSpId($spId); + + // keep track of last reducedSpId + $lastReducedSpId = $reducedSpId; + + // keep track of last spId + $lastSpId = $spId; + + // set the BLIP index + $spContainer->setOPT(0x4104, $blipIndex); + + // set coordinates and offsets, client anchor + $coordinates = $drawing->getCoordinates(); + $offsetX = $drawing->getOffsetX(); + $offsetY = $drawing->getOffsetY(); + $width = $drawing->getWidth(); + $height = $drawing->getHeight(); + + $twoAnchor = PHPExcel_Shared_Excel5::oneAnchor2twoAnchor($sheet, $coordinates, $offsetX, $offsetY, $width, $height); + + $spContainer->setStartCoordinates($twoAnchor['startCoordinates']); + $spContainer->setStartOffsetX($twoAnchor['startOffsetX']); + $spContainer->setStartOffsetY($twoAnchor['startOffsetY']); + $spContainer->setEndCoordinates($twoAnchor['endCoordinates']); + $spContainer->setEndOffsetX($twoAnchor['endOffsetX']); + $spContainer->setEndOffsetY($twoAnchor['endOffsetY']); + + $spgrContainer->addChild($spContainer); + } + + // AutoFilters + if (!empty($filterRange)) { + $rangeBounds = PHPExcel_Cell::rangeBoundaries($filterRange); + $iNumColStart = $rangeBounds[0][0]; + $iNumColEnd = $rangeBounds[1][0]; + + $iInc = $iNumColStart; + while ($iInc <= $iNumColEnd) { + ++$countShapes[$sheetIndex]; + + // create an Drawing Object for the dropdown + $oDrawing = new PHPExcel_Worksheet_BaseDrawing(); + // get the coordinates of drawing + $cDrawing = PHPExcel_Cell::stringFromColumnIndex($iInc - 1) . $rangeBounds[0][1]; + $oDrawing->setCoordinates($cDrawing); + $oDrawing->setWorksheet($sheet); + + // add the shape + $spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer(); + // set the shape type + $spContainer->setSpType(0x00C9); + // set the shape flag + $spContainer->setSpFlag(0x01); + + // set the shape index (we combine 1-based sheet index and $countShapes to create unique shape index) + $reducedSpId = $countShapes[$sheetIndex]; + $spId = $reducedSpId + | ($sheet->getParent()->getIndex($sheet) + 1) << 10; + $spContainer->setSpId($spId); + + // keep track of last reducedSpId + $lastReducedSpId = $reducedSpId; + + // keep track of last spId + $lastSpId = $spId; + + $spContainer->setOPT(0x007F, 0x01040104); // Protection -> fLockAgainstGrouping + $spContainer->setOPT(0x00BF, 0x00080008); // Text -> fFitTextToShape + $spContainer->setOPT(0x01BF, 0x00010000); // Fill Style -> fNoFillHitTest + $spContainer->setOPT(0x01FF, 0x00080000); // Line Style -> fNoLineDrawDash + $spContainer->setOPT(0x03BF, 0x000A0000); // Group Shape -> fPrint + + // set coordinates and offsets, client anchor + $endCoordinates = PHPExcel_Cell::stringFromColumnIndex(PHPExcel_Cell::stringFromColumnIndex($iInc - 1)); + $endCoordinates .= $rangeBounds[0][1] + 1; + + $spContainer->setStartCoordinates($cDrawing); + $spContainer->setStartOffsetX(0); + $spContainer->setStartOffsetY(0); + $spContainer->setEndCoordinates($endCoordinates); + $spContainer->setEndOffsetX(0); + $spContainer->setEndOffsetY(0); + + $spgrContainer->addChild($spContainer); + $iInc++; + } + } + + // identifier clusters, used for workbook Escher object + $this->IDCLs[$dgId] = $lastReducedSpId; + + // set last shape index + $dgContainer->setLastSpId($lastSpId); + + // set the Escher object + $this->writerWorksheets[$sheetIndex]->setEscher($escher); + } + } + + /** + * Build the Escher object corresponding to the MSODRAWINGGROUP record + */ + private function buildWorkbookEscher() + { + $escher = null; + + // any drawings in this workbook? + $found = false; + foreach ($this->phpExcel->getAllSheets() as $sheet) { + if (count($sheet->getDrawingCollection()) > 0) { + $found = true; + break; + } + } + + // nothing to do if there are no drawings + if (!$found) { + return; + } + + // if we reach here, then there are drawings in the workbook + $escher = new PHPExcel_Shared_Escher(); + + // dggContainer + $dggContainer = new PHPExcel_Shared_Escher_DggContainer(); + $escher->setDggContainer($dggContainer); + + // set IDCLs (identifier clusters) + $dggContainer->setIDCLs($this->IDCLs); + + // this loop is for determining maximum shape identifier of all drawing + $spIdMax = 0; + $totalCountShapes = 0; + $countDrawings = 0; + + foreach ($this->phpExcel->getAllsheets() as $sheet) { + $sheetCountShapes = 0; // count number of shapes (minus group shape), in sheet + + if (count($sheet->getDrawingCollection()) > 0) { + ++$countDrawings; + + foreach ($sheet->getDrawingCollection() as $drawing) { + ++$sheetCountShapes; + ++$totalCountShapes; + + $spId = $sheetCountShapes | ($this->phpExcel->getIndex($sheet) + 1) << 10; + $spIdMax = max($spId, $spIdMax); + } + } + } + + $dggContainer->setSpIdMax($spIdMax + 1); + $dggContainer->setCDgSaved($countDrawings); + $dggContainer->setCSpSaved($totalCountShapes + $countDrawings); // total number of shapes incl. one group shapes per drawing + + // bstoreContainer + $bstoreContainer = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer(); + $dggContainer->setBstoreContainer($bstoreContainer); + + // the BSE's (all the images) + foreach ($this->phpExcel->getAllsheets() as $sheet) { + foreach ($sheet->getDrawingCollection() as $drawing) { + if ($drawing instanceof PHPExcel_Worksheet_Drawing) { + $filename = $drawing->getPath(); + + list($imagesx, $imagesy, $imageFormat) = getimagesize($filename); + + switch ($imageFormat) { + case 1: // GIF, not supported by BIFF8, we convert to PNG + $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG; + ob_start(); + imagepng(imagecreatefromgif($filename)); + $blipData = ob_get_contents(); + ob_end_clean(); + break; + case 2: // JPEG + $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG; + $blipData = file_get_contents($filename); + break; + case 3: // PNG + $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG; + $blipData = file_get_contents($filename); + break; + case 6: // Windows DIB (BMP), we convert to PNG + $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG; + ob_start(); + imagepng(PHPExcel_Shared_Drawing::imagecreatefrombmp($filename)); + $blipData = ob_get_contents(); + ob_end_clean(); + break; + default: + continue 2; + } + + $blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip(); + $blip->setData($blipData); + + $BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE(); + $BSE->setBlipType($blipType); + $BSE->setBlip($blip); + + $bstoreContainer->addBSE($BSE); + } elseif ($drawing instanceof PHPExcel_Worksheet_MemoryDrawing) { + switch ($drawing->getRenderingFunction()) { + case PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG: + $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG; + $renderingFunction = 'imagejpeg'; + break; + case PHPExcel_Worksheet_MemoryDrawing::RENDERING_GIF: + case PHPExcel_Worksheet_MemoryDrawing::RENDERING_PNG: + case PHPExcel_Worksheet_MemoryDrawing::RENDERING_DEFAULT: + $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG; + $renderingFunction = 'imagepng'; + break; + } + + ob_start(); + call_user_func($renderingFunction, $drawing->getImageResource()); + $blipData = ob_get_contents(); + ob_end_clean(); + + $blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip(); + $blip->setData($blipData); + + $BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE(); + $BSE->setBlipType($blipType); + $BSE->setBlip($blip); + + $bstoreContainer->addBSE($BSE); + } + } + } + + // Set the Escher object + $this->writerWorkbook->setEscher($escher); + } + + /** + * Build the OLE Part for DocumentSummary Information + * @return string + */ + private function writeDocumentSummaryInformation() + { + // offset: 0; size: 2; must be 0xFE 0xFF (UTF-16 LE byte order mark) + $data = pack('v', 0xFFFE); + // offset: 2; size: 2; + $data .= pack('v', 0x0000); + // offset: 4; size: 2; OS version + $data .= pack('v', 0x0106); + // offset: 6; size: 2; OS indicator + $data .= pack('v', 0x0002); + // offset: 8; size: 16 + $data .= pack('VVVV', 0x00, 0x00, 0x00, 0x00); + // offset: 24; size: 4; section count + $data .= pack('V', 0x0001); + + // offset: 28; size: 16; first section's class id: 02 d5 cd d5 9c 2e 1b 10 93 97 08 00 2b 2c f9 ae + $data .= pack('vvvvvvvv', 0xD502, 0xD5CD, 0x2E9C, 0x101B, 0x9793, 0x0008, 0x2C2B, 0xAEF9); + // offset: 44; size: 4; offset of the start + $data .= pack('V', 0x30); + + // SECTION + $dataSection = array(); + $dataSection_NumProps = 0; + $dataSection_Summary = ''; + $dataSection_Content = ''; + + // GKPIDDSI_CODEPAGE: CodePage + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x01), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x02), // 2 byte signed integer + 'data' => array('data' => 1252)); + $dataSection_NumProps++; + + // GKPIDDSI_CATEGORY : Category + if ($this->phpExcel->getProperties()->getCategory()) { + $dataProp = $this->phpExcel->getProperties()->getCategory(); + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x02), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x1E), + 'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); + $dataSection_NumProps++; + } + // GKPIDDSI_VERSION :Version of the application that wrote the property storage + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x17), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x03), + 'data' => array('pack' => 'V', 'data' => 0x000C0000)); + $dataSection_NumProps++; + // GKPIDDSI_SCALE : FALSE + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0B), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x0B), + 'data' => array('data' => false)); + $dataSection_NumProps++; + // GKPIDDSI_LINKSDIRTY : True if any of the values for the linked properties have changed outside of the application + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x10), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x0B), + 'data' => array('data' => false)); + $dataSection_NumProps++; + // GKPIDDSI_SHAREDOC : FALSE + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x13), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x0B), + 'data' => array('data' => false)); + $dataSection_NumProps++; + // GKPIDDSI_HYPERLINKSCHANGED : True if any of the values for the _PID_LINKS (hyperlink text) have changed outside of the application + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x16), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x0B), + 'data' => array('data' => false)); + $dataSection_NumProps++; + + // GKPIDDSI_DOCSPARTS + // MS-OSHARED p75 (2.3.3.2.2.1) + // Structure is VtVecUnalignedLpstrValue (2.3.3.1.9) + // cElements + $dataProp = pack('v', 0x0001); + $dataProp .= pack('v', 0x0000); + // array of UnalignedLpstr + // cch + $dataProp .= pack('v', 0x000A); + $dataProp .= pack('v', 0x0000); + // value + $dataProp .= 'Worksheet'.chr(0); + + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0D), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x101E), + 'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); + $dataSection_NumProps++; + + // GKPIDDSI_HEADINGPAIR + // VtVecHeadingPairValue + // cElements + $dataProp = pack('v', 0x0002); + $dataProp .= pack('v', 0x0000); + // Array of vtHeadingPair + // vtUnalignedString - headingString + // stringType + $dataProp .= pack('v', 0x001E); + // padding + $dataProp .= pack('v', 0x0000); + // UnalignedLpstr + // cch + $dataProp .= pack('v', 0x0013); + $dataProp .= pack('v', 0x0000); + // value + $dataProp .= 'Feuilles de calcul'; + // vtUnalignedString - headingParts + // wType : 0x0003 = 32 bit signed integer + $dataProp .= pack('v', 0x0300); + // padding + $dataProp .= pack('v', 0x0000); + // value + $dataProp .= pack('v', 0x0100); + $dataProp .= pack('v', 0x0000); + $dataProp .= pack('v', 0x0000); + $dataProp .= pack('v', 0x0000); + + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0C), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x100C), + 'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); + $dataSection_NumProps++; + + // 4 Section Length + // 4 Property count + // 8 * $dataSection_NumProps (8 = ID (4) + OffSet(4)) + $dataSection_Content_Offset = 8 + $dataSection_NumProps * 8; + foreach ($dataSection as $dataProp) { + // Summary + $dataSection_Summary .= pack($dataProp['summary']['pack'], $dataProp['summary']['data']); + // Offset + $dataSection_Summary .= pack($dataProp['offset']['pack'], $dataSection_Content_Offset); + // DataType + $dataSection_Content .= pack($dataProp['type']['pack'], $dataProp['type']['data']); + // Data + if ($dataProp['type']['data'] == 0x02) { // 2 byte signed integer + $dataSection_Content .= pack('V', $dataProp['data']['data']); + + $dataSection_Content_Offset += 4 + 4; + } elseif ($dataProp['type']['data'] == 0x03) { // 4 byte signed integer + $dataSection_Content .= pack('V', $dataProp['data']['data']); + + $dataSection_Content_Offset += 4 + 4; + } elseif ($dataProp['type']['data'] == 0x0B) { // Boolean + if ($dataProp['data']['data'] == false) { + $dataSection_Content .= pack('V', 0x0000); + } else { + $dataSection_Content .= pack('V', 0x0001); + } + $dataSection_Content_Offset += 4 + 4; + } elseif ($dataProp['type']['data'] == 0x1E) { // null-terminated string prepended by dword string length + // Null-terminated string + $dataProp['data']['data'] .= chr(0); + $dataProp['data']['length'] += 1; + // Complete the string with null string for being a %4 + $dataProp['data']['length'] = $dataProp['data']['length'] + ((4 - $dataProp['data']['length'] % 4)==4 ? 0 : (4 - $dataProp['data']['length'] % 4)); + $dataProp['data']['data'] = str_pad($dataProp['data']['data'], $dataProp['data']['length'], chr(0), STR_PAD_RIGHT); + + $dataSection_Content .= pack('V', $dataProp['data']['length']); + $dataSection_Content .= $dataProp['data']['data']; + + $dataSection_Content_Offset += 4 + 4 + strlen($dataProp['data']['data']); + } elseif ($dataProp['type']['data'] == 0x40) { // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601) + $dataSection_Content .= $dataProp['data']['data']; + + $dataSection_Content_Offset += 4 + 8; + } else { + // Data Type Not Used at the moment + $dataSection_Content .= $dataProp['data']['data']; + + $dataSection_Content_Offset += 4 + $dataProp['data']['length']; + } + } + // Now $dataSection_Content_Offset contains the size of the content + + // section header + // offset: $secOffset; size: 4; section length + // + x Size of the content (summary + content) + $data .= pack('V', $dataSection_Content_Offset); + // offset: $secOffset+4; size: 4; property count + $data .= pack('V', $dataSection_NumProps); + // Section Summary + $data .= $dataSection_Summary; + // Section Content + $data .= $dataSection_Content; + + return $data; + } + + /** + * Build the OLE Part for Summary Information + * @return string + */ + private function writeSummaryInformation() + { + // offset: 0; size: 2; must be 0xFE 0xFF (UTF-16 LE byte order mark) + $data = pack('v', 0xFFFE); + // offset: 2; size: 2; + $data .= pack('v', 0x0000); + // offset: 4; size: 2; OS version + $data .= pack('v', 0x0106); + // offset: 6; size: 2; OS indicator + $data .= pack('v', 0x0002); + // offset: 8; size: 16 + $data .= pack('VVVV', 0x00, 0x00, 0x00, 0x00); + // offset: 24; size: 4; section count + $data .= pack('V', 0x0001); + + // offset: 28; size: 16; first section's class id: e0 85 9f f2 f9 4f 68 10 ab 91 08 00 2b 27 b3 d9 + $data .= pack('vvvvvvvv', 0x85E0, 0xF29F, 0x4FF9, 0x1068, 0x91AB, 0x0008, 0x272B, 0xD9B3); + // offset: 44; size: 4; offset of the start + $data .= pack('V', 0x30); + + // SECTION + $dataSection = array(); + $dataSection_NumProps = 0; + $dataSection_Summary = ''; + $dataSection_Content = ''; + + // CodePage : CP-1252 + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x01), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x02), // 2 byte signed integer + 'data' => array('data' => 1252)); + $dataSection_NumProps++; + + // Title + if ($this->phpExcel->getProperties()->getTitle()) { + $dataProp = $this->phpExcel->getProperties()->getTitle(); + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x02), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length + 'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); + $dataSection_NumProps++; + } + // Subject + if ($this->phpExcel->getProperties()->getSubject()) { + $dataProp = $this->phpExcel->getProperties()->getSubject(); + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x03), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length + 'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); + $dataSection_NumProps++; + } + // Author (Creator) + if ($this->phpExcel->getProperties()->getCreator()) { + $dataProp = $this->phpExcel->getProperties()->getCreator(); + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x04), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length + 'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); + $dataSection_NumProps++; + } + // Keywords + if ($this->phpExcel->getProperties()->getKeywords()) { + $dataProp = $this->phpExcel->getProperties()->getKeywords(); + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x05), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length + 'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); + $dataSection_NumProps++; + } + // Comments (Description) + if ($this->phpExcel->getProperties()->getDescription()) { + $dataProp = $this->phpExcel->getProperties()->getDescription(); + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x06), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length + 'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); + $dataSection_NumProps++; + } + // Last Saved By (LastModifiedBy) + if ($this->phpExcel->getProperties()->getLastModifiedBy()) { + $dataProp = $this->phpExcel->getProperties()->getLastModifiedBy(); + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x08), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length + 'data' => array('data' => $dataProp, 'length' => strlen($dataProp))); + $dataSection_NumProps++; + } + // Created Date/Time + if ($this->phpExcel->getProperties()->getCreated()) { + $dataProp = $this->phpExcel->getProperties()->getCreated(); + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0C), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x40), // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601) + 'data' => array('data' => PHPExcel_Shared_OLE::LocalDate2OLE($dataProp))); + $dataSection_NumProps++; + } + // Modified Date/Time + if ($this->phpExcel->getProperties()->getModified()) { + $dataProp = $this->phpExcel->getProperties()->getModified(); + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0D), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x40), // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601) + 'data' => array('data' => PHPExcel_Shared_OLE::LocalDate2OLE($dataProp))); + $dataSection_NumProps++; + } + // Security + $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x13), + 'offset' => array('pack' => 'V'), + 'type' => array('pack' => 'V', 'data' => 0x03), // 4 byte signed integer + 'data' => array('data' => 0x00)); + $dataSection_NumProps++; + + + // 4 Section Length + // 4 Property count + // 8 * $dataSection_NumProps (8 = ID (4) + OffSet(4)) + $dataSection_Content_Offset = 8 + $dataSection_NumProps * 8; + foreach ($dataSection as $dataProp) { + // Summary + $dataSection_Summary .= pack($dataProp['summary']['pack'], $dataProp['summary']['data']); + // Offset + $dataSection_Summary .= pack($dataProp['offset']['pack'], $dataSection_Content_Offset); + // DataType + $dataSection_Content .= pack($dataProp['type']['pack'], $dataProp['type']['data']); + // Data + if ($dataProp['type']['data'] == 0x02) { // 2 byte signed integer + $dataSection_Content .= pack('V', $dataProp['data']['data']); + + $dataSection_Content_Offset += 4 + 4; + } elseif ($dataProp['type']['data'] == 0x03) { // 4 byte signed integer + $dataSection_Content .= pack('V', $dataProp['data']['data']); + + $dataSection_Content_Offset += 4 + 4; + } elseif ($dataProp['type']['data'] == 0x1E) { // null-terminated string prepended by dword string length + // Null-terminated string + $dataProp['data']['data'] .= chr(0); + $dataProp['data']['length'] += 1; + // Complete the string with null string for being a %4 + $dataProp['data']['length'] = $dataProp['data']['length'] + ((4 - $dataProp['data']['length'] % 4)==4 ? 0 : (4 - $dataProp['data']['length'] % 4)); + $dataProp['data']['data'] = str_pad($dataProp['data']['data'], $dataProp['data']['length'], chr(0), STR_PAD_RIGHT); + + $dataSection_Content .= pack('V', $dataProp['data']['length']); + $dataSection_Content .= $dataProp['data']['data']; + + $dataSection_Content_Offset += 4 + 4 + strlen($dataProp['data']['data']); + } elseif ($dataProp['type']['data'] == 0x40) { // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601) + $dataSection_Content .= $dataProp['data']['data']; + + $dataSection_Content_Offset += 4 + 8; + } else { + // Data Type Not Used at the moment + } + } + // Now $dataSection_Content_Offset contains the size of the content + + // section header + // offset: $secOffset; size: 4; section length + // + x Size of the content (summary + content) + $data .= pack('V', $dataSection_Content_Offset); + // offset: $secOffset+4; size: 4; property count + $data .= pack('V', $dataSection_NumProps); + // Section Summary + $data .= $dataSection_Summary; + // Section Content + $data .= $dataSection_Content; + + return $data; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel5/BIFFwriter.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel5/BIFFwriter.php new file mode 100644 index 0000000..a795752 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel5/BIFFwriter.php @@ -0,0 +1,246 @@ +<?php + +/** + * PHPExcel_Writer_Excel5_BIFFwriter + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ + +// Original file header of PEAR::Spreadsheet_Excel_Writer_BIFFwriter (used as the base for this class): +// ----------------------------------------------------------------------------------------- +// * Module written/ported by Xavier Noguer <xnoguer@rezebra.com> +// * +// * The majority of this is _NOT_ my code. I simply ported it from the +// * PERL Spreadsheet::WriteExcel module. +// * +// * The author of the Spreadsheet::WriteExcel module is John McNamara +// * <jmcnamara@cpan.org> +// * +// * I _DO_ maintain this code, and John McNamara has nothing to do with the +// * porting of this code to PHP. Any questions directly related to this +// * class library should be directed to me. +// * +// * License Information: +// * +// * Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +// * Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +// * +// * This library is free software; you can redistribute it and/or +// * modify it under the terms of the GNU Lesser General Public +// * License as published by the Free Software Foundation; either +// * version 2.1 of the License, or (at your option) any later version. +// * +// * This library is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// * Lesser General Public License for more details. +// * +// * You should have received a copy of the GNU Lesser General Public +// * License along with this library; if not, write to the Free Software +// * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// */ +class PHPExcel_Writer_Excel5_BIFFwriter +{ + /** + * The byte order of this architecture. 0 => little endian, 1 => big endian + * @var integer + */ + private static $byteOrder; + + /** + * The string containing the data of the BIFF stream + * @var string + */ + public $_data; + + /** + * The size of the data in bytes. Should be the same as strlen($this->_data) + * @var integer + */ + public $_datasize; + + /** + * The maximum length for a BIFF record (excluding record header and length field). See addContinue() + * @var integer + * @see addContinue() + */ + private $limit = 8224; + + /** + * Constructor + */ + public function __construct() + { + $this->_data = ''; + $this->_datasize = 0; +// $this->limit = 8224; + } + + /** + * Determine the byte order and store it as class data to avoid + * recalculating it for each call to new(). + * + * @return int + */ + public static function getByteOrder() + { + if (!isset(self::$byteOrder)) { + // Check if "pack" gives the required IEEE 64bit float + $teststr = pack("d", 1.2345); + $number = pack("C8", 0x8D, 0x97, 0x6E, 0x12, 0x83, 0xC0, 0xF3, 0x3F); + if ($number == $teststr) { + $byte_order = 0; // Little Endian + } elseif ($number == strrev($teststr)) { + $byte_order = 1; // Big Endian + } else { + // Give up. I'll fix this in a later version. + throw new PHPExcel_Writer_Exception("Required floating point format not supported on this platform."); + } + self::$byteOrder = $byte_order; + } + + return self::$byteOrder; + } + + /** + * General storage function + * + * @param string $data binary data to append + * @access private + */ + protected function append($data) + { + if (strlen($data) - 4 > $this->limit) { + $data = $this->addContinue($data); + } + $this->_data .= $data; + $this->_datasize += strlen($data); + } + + /** + * General storage function like append, but returns string instead of modifying $this->_data + * + * @param string $data binary data to write + * @return string + */ + public function writeData($data) + { + if (strlen($data) - 4 > $this->limit) { + $data = $this->addContinue($data); + } + $this->_datasize += strlen($data); + + return $data; + } + + /** + * Writes Excel BOF record to indicate the beginning of a stream or + * sub-stream in the BIFF file. + * + * @param integer $type Type of BIFF file to write: 0x0005 Workbook, + * 0x0010 Worksheet. + * @access private + */ + protected function storeBof($type) + { + $record = 0x0809; // Record identifier (BIFF5-BIFF8) + $length = 0x0010; + + // by inspection of real files, MS Office Excel 2007 writes the following + $unknown = pack("VV", 0x000100D1, 0x00000406); + + $build = 0x0DBB; // Excel 97 + $year = 0x07CC; // Excel 97 + + $version = 0x0600; // BIFF8 + + $header = pack("vv", $record, $length); + $data = pack("vvvv", $version, $type, $build, $year); + $this->append($header . $data . $unknown); + } + + /** + * Writes Excel EOF record to indicate the end of a BIFF stream. + * + * @access private + */ + protected function storeEof() + { + $record = 0x000A; // Record identifier + $length = 0x0000; // Number of bytes to follow + + $header = pack("vv", $record, $length); + $this->append($header); + } + + /** + * Writes Excel EOF record to indicate the end of a BIFF stream. + * + * @access private + */ + public function writeEof() + { + $record = 0x000A; // Record identifier + $length = 0x0000; // Number of bytes to follow + $header = pack("vv", $record, $length); + return $this->writeData($header); + } + + /** + * Excel limits the size of BIFF records. In Excel 5 the limit is 2084 bytes. In + * Excel 97 the limit is 8228 bytes. Records that are longer than these limits + * must be split up into CONTINUE blocks. + * + * This function takes a long BIFF record and inserts CONTINUE records as + * necessary. + * + * @param string $data The original binary data to be written + * @return string A very convenient string of continue blocks + * @access private + */ + private function addContinue($data) + { + $limit = $this->limit; + $record = 0x003C; // Record identifier + + // The first 2080/8224 bytes remain intact. However, we have to change + // the length field of the record. + $tmp = substr($data, 0, 2) . pack("v", $limit) . substr($data, 4, $limit); + + $header = pack("vv", $record, $limit); // Headers for continue records + + // Retrieve chunks of 2080/8224 bytes +4 for the header. + $data_length = strlen($data); + for ($i = $limit + 4; $i < ($data_length - $limit); $i += $limit) { + $tmp .= $header; + $tmp .= substr($data, $i, $limit); + } + + // Retrieve the last chunk of data + $header = pack("vv", $record, strlen($data) - $i); + $tmp .= $header; + $tmp .= substr($data, $i, strlen($data) - $i); + + return $tmp; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel5/Escher.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel5/Escher.php new file mode 100644 index 0000000..c37fda9 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel5/Escher.php @@ -0,0 +1,523 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ + + +/** + * PHPExcel_Shared_Escher_DggContainer_BstoreContainer + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + */ +class PHPExcel_Writer_Excel5_Escher +{ + /** + * The object we are writing + */ + private $object; + + /** + * The written binary data + */ + private $data; + + /** + * Shape offsets. Positions in binary stream where a new shape record begins + * + * @var array + */ + private $spOffsets; + + /** + * Shape types. + * + * @var array + */ + private $spTypes; + + /** + * Constructor + * + * @param mixed + */ + public function __construct($object) + { + $this->object = $object; + } + + /** + * Process the object to be written + */ + public function close() + { + // initialize + $this->data = ''; + + switch (get_class($this->object)) { + case 'PHPExcel_Shared_Escher': + if ($dggContainer = $this->object->getDggContainer()) { + $writer = new PHPExcel_Writer_Excel5_Escher($dggContainer); + $this->data = $writer->close(); + } elseif ($dgContainer = $this->object->getDgContainer()) { + $writer = new PHPExcel_Writer_Excel5_Escher($dgContainer); + $this->data = $writer->close(); + $this->spOffsets = $writer->getSpOffsets(); + $this->spTypes = $writer->getSpTypes(); + } + break; + case 'PHPExcel_Shared_Escher_DggContainer': + // this is a container record + + // initialize + $innerData = ''; + + // write the dgg + $recVer = 0x0; + $recInstance = 0x0000; + $recType = 0xF006; + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + // dgg data + $dggData = + pack( + 'VVVV', + $this->object->getSpIdMax(), // maximum shape identifier increased by one + $this->object->getCDgSaved() + 1, // number of file identifier clusters increased by one + $this->object->getCSpSaved(), + $this->object->getCDgSaved() // count total number of drawings saved + ); + + // add file identifier clusters (one per drawing) + $IDCLs = $this->object->getIDCLs(); + + foreach ($IDCLs as $dgId => $maxReducedSpId) { + $dggData .= pack('VV', $dgId, $maxReducedSpId + 1); + } + + $header = pack('vvV', $recVerInstance, $recType, strlen($dggData)); + $innerData .= $header . $dggData; + + // write the bstoreContainer + if ($bstoreContainer = $this->object->getBstoreContainer()) { + $writer = new PHPExcel_Writer_Excel5_Escher($bstoreContainer); + $innerData .= $writer->close(); + } + + // write the record + $recVer = 0xF; + $recInstance = 0x0000; + $recType = 0xF000; + $length = strlen($innerData); + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + + $this->data = $header . $innerData; + break; + case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer': + // this is a container record + + // initialize + $innerData = ''; + + // treat the inner data + if ($BSECollection = $this->object->getBSECollection()) { + foreach ($BSECollection as $BSE) { + $writer = new PHPExcel_Writer_Excel5_Escher($BSE); + $innerData .= $writer->close(); + } + } + + // write the record + $recVer = 0xF; + $recInstance = count($this->object->getBSECollection()); + $recType = 0xF001; + $length = strlen($innerData); + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + + $this->data = $header . $innerData; + break; + case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE': + // this is a semi-container record + + // initialize + $innerData = ''; + + // here we treat the inner data + if ($blip = $this->object->getBlip()) { + $writer = new PHPExcel_Writer_Excel5_Escher($blip); + $innerData .= $writer->close(); + } + + // initialize + $data = ''; + + $btWin32 = $this->object->getBlipType(); + $btMacOS = $this->object->getBlipType(); + $data .= pack('CC', $btWin32, $btMacOS); + + $rgbUid = pack('VVVV', 0, 0, 0, 0); // todo + $data .= $rgbUid; + + $tag = 0; + $size = strlen($innerData); + $cRef = 1; + $foDelay = 0; //todo + $unused1 = 0x0; + $cbName = 0x0; + $unused2 = 0x0; + $unused3 = 0x0; + $data .= pack('vVVVCCCC', $tag, $size, $cRef, $foDelay, $unused1, $cbName, $unused2, $unused3); + + $data .= $innerData; + + // write the record + $recVer = 0x2; + $recInstance = $this->object->getBlipType(); + $recType = 0xF007; + $length = strlen($data); + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + + $this->data = $header; + + $this->data .= $data; + break; + case 'PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip': + // this is an atom record + + // write the record + switch ($this->object->getParent()->getBlipType()) { + case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG: + // initialize + $innerData = ''; + + $rgbUid1 = pack('VVVV', 0, 0, 0, 0); // todo + $innerData .= $rgbUid1; + + $tag = 0xFF; // todo + $innerData .= pack('C', $tag); + + $innerData .= $this->object->getData(); + + $recVer = 0x0; + $recInstance = 0x46A; + $recType = 0xF01D; + $length = strlen($innerData); + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + + $this->data = $header; + + $this->data .= $innerData; + break; + + case PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG: + // initialize + $innerData = ''; + + $rgbUid1 = pack('VVVV', 0, 0, 0, 0); // todo + $innerData .= $rgbUid1; + + $tag = 0xFF; // todo + $innerData .= pack('C', $tag); + + $innerData .= $this->object->getData(); + + $recVer = 0x0; + $recInstance = 0x6E0; + $recType = 0xF01E; + $length = strlen($innerData); + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + + $this->data = $header; + + $this->data .= $innerData; + break; + } + break; + case 'PHPExcel_Shared_Escher_DgContainer': + // this is a container record + + // initialize + $innerData = ''; + + // write the dg + $recVer = 0x0; + $recInstance = $this->object->getDgId(); + $recType = 0xF008; + $length = 8; + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + + // number of shapes in this drawing (including group shape) + $countShapes = count($this->object->getSpgrContainer()->getChildren()); + $innerData .= $header . pack('VV', $countShapes, $this->object->getLastSpId()); + //$innerData .= $header . pack('VV', 0, 0); + + // write the spgrContainer + if ($spgrContainer = $this->object->getSpgrContainer()) { + $writer = new PHPExcel_Writer_Excel5_Escher($spgrContainer); + $innerData .= $writer->close(); + + // get the shape offsets relative to the spgrContainer record + $spOffsets = $writer->getSpOffsets(); + $spTypes = $writer->getSpTypes(); + + // save the shape offsets relative to dgContainer + foreach ($spOffsets as & $spOffset) { + $spOffset += 24; // add length of dgContainer header data (8 bytes) plus dg data (16 bytes) + } + + $this->spOffsets = $spOffsets; + $this->spTypes = $spTypes; + } + + // write the record + $recVer = 0xF; + $recInstance = 0x0000; + $recType = 0xF002; + $length = strlen($innerData); + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + + $this->data = $header . $innerData; + break; + case 'PHPExcel_Shared_Escher_DgContainer_SpgrContainer': + // this is a container record + + // initialize + $innerData = ''; + + // initialize spape offsets + $totalSize = 8; + $spOffsets = array(); + $spTypes = array(); + + // treat the inner data + foreach ($this->object->getChildren() as $spContainer) { + $writer = new PHPExcel_Writer_Excel5_Escher($spContainer); + $spData = $writer->close(); + $innerData .= $spData; + + // save the shape offsets (where new shape records begin) + $totalSize += strlen($spData); + $spOffsets[] = $totalSize; + + $spTypes = array_merge($spTypes, $writer->getSpTypes()); + } + + // write the record + $recVer = 0xF; + $recInstance = 0x0000; + $recType = 0xF003; + $length = strlen($innerData); + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + + $this->data = $header . $innerData; + $this->spOffsets = $spOffsets; + $this->spTypes = $spTypes; + break; + case 'PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer': + // initialize + $data = ''; + + // build the data + + // write group shape record, if necessary? + if ($this->object->getSpgr()) { + $recVer = 0x1; + $recInstance = 0x0000; + $recType = 0xF009; + $length = 0x00000010; + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + + $data .= $header . pack('VVVV', 0, 0, 0, 0); + } + $this->spTypes[] = ($this->object->getSpType()); + + // write the shape record + $recVer = 0x2; + $recInstance = $this->object->getSpType(); // shape type + $recType = 0xF00A; + $length = 0x00000008; + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + + $data .= $header . pack('VV', $this->object->getSpId(), $this->object->getSpgr() ? 0x0005 : 0x0A00); + + + // the options + if ($this->object->getOPTCollection()) { + $optData = ''; + + $recVer = 0x3; + $recInstance = count($this->object->getOPTCollection()); + $recType = 0xF00B; + foreach ($this->object->getOPTCollection() as $property => $value) { + $optData .= pack('vV', $property, $value); + } + $length = strlen($optData); + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + $data .= $header . $optData; + } + + // the client anchor + if ($this->object->getStartCoordinates()) { + $clientAnchorData = ''; + + $recVer = 0x0; + $recInstance = 0x0; + $recType = 0xF010; + + // start coordinates + list($column, $row) = PHPExcel_Cell::coordinateFromString($this->object->getStartCoordinates()); + $c1 = PHPExcel_Cell::columnIndexFromString($column) - 1; + $r1 = $row - 1; + + // start offsetX + $startOffsetX = $this->object->getStartOffsetX(); + + // start offsetY + $startOffsetY = $this->object->getStartOffsetY(); + + // end coordinates + list($column, $row) = PHPExcel_Cell::coordinateFromString($this->object->getEndCoordinates()); + $c2 = PHPExcel_Cell::columnIndexFromString($column) - 1; + $r2 = $row - 1; + + // end offsetX + $endOffsetX = $this->object->getEndOffsetX(); + + // end offsetY + $endOffsetY = $this->object->getEndOffsetY(); + + $clientAnchorData = pack('vvvvvvvvv', $this->object->getSpFlag(), $c1, $startOffsetX, $r1, $startOffsetY, $c2, $endOffsetX, $r2, $endOffsetY); + + $length = strlen($clientAnchorData); + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + $data .= $header . $clientAnchorData; + } + + // the client data, just empty for now + if (!$this->object->getSpgr()) { + $clientDataData = ''; + + $recVer = 0x0; + $recInstance = 0x0; + $recType = 0xF011; + + $length = strlen($clientDataData); + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + $data .= $header . $clientDataData; + } + + // write the record + $recVer = 0xF; + $recInstance = 0x0000; + $recType = 0xF004; + $length = strlen($data); + + $recVerInstance = $recVer; + $recVerInstance |= $recInstance << 4; + + $header = pack('vvV', $recVerInstance, $recType, $length); + + $this->data = $header . $data; + break; + } + + return $this->data; + } + + /** + * Gets the shape offsets + * + * @return array + */ + public function getSpOffsets() + { + return $this->spOffsets; + } + + /** + * Gets the shape types + * + * @return array + */ + public function getSpTypes() + { + return $this->spTypes; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel5/Font.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel5/Font.php new file mode 100644 index 0000000..ed85ff4 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel5/Font.php @@ -0,0 +1,166 @@ +<?php + +/** + * PHPExcel_Writer_Excel5_Font + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_Excel5_Font +{ + /** + * Color index + * + * @var int + */ + private $colorIndex; + + /** + * Font + * + * @var PHPExcel_Style_Font + */ + private $font; + + /** + * Constructor + * + * @param PHPExcel_Style_Font $font + */ + public function __construct(PHPExcel_Style_Font $font = null) + { + $this->colorIndex = 0x7FFF; + $this->font = $font; + } + + /** + * Set the color index + * + * @param int $colorIndex + */ + public function setColorIndex($colorIndex) + { + $this->colorIndex = $colorIndex; + } + + /** + * Get font record data + * + * @return string + */ + public function writeFont() + { + $font_outline = 0; + $font_shadow = 0; + + $icv = $this->colorIndex; // Index to color palette + if ($this->font->getSuperScript()) { + $sss = 1; + } elseif ($this->font->getSubScript()) { + $sss = 2; + } else { + $sss = 0; + } + $bFamily = 0; // Font family + $bCharSet = PHPExcel_Shared_Font::getCharsetFromFontName($this->font->getName()); // Character set + + $record = 0x31; // Record identifier + $reserved = 0x00; // Reserved + $grbit = 0x00; // Font attributes + if ($this->font->getItalic()) { + $grbit |= 0x02; + } + if ($this->font->getStrikethrough()) { + $grbit |= 0x08; + } + if ($font_outline) { + $grbit |= 0x10; + } + if ($font_shadow) { + $grbit |= 0x20; + } + + $data = pack( + "vvvvvCCCC", + // Fontsize (in twips) + $this->font->getSize() * 20, + $grbit, + // Colour + $icv, + // Font weight + self::mapBold($this->font->getBold()), + // Superscript/Subscript + $sss, + self::mapUnderline($this->font->getUnderline()), + $bFamily, + $bCharSet, + $reserved + ); + $data .= PHPExcel_Shared_String::UTF8toBIFF8UnicodeShort($this->font->getName()); + + $length = strlen($data); + $header = pack("vv", $record, $length); + + return($header . $data); + } + + /** + * Map to BIFF5-BIFF8 codes for bold + * + * @param boolean $bold + * @return int + */ + private static function mapBold($bold) + { + if ($bold) { + return 0x2BC; // 700 = Bold font weight + } + return 0x190; // 400 = Normal font weight + } + + /** + * Map of BIFF2-BIFF8 codes for underline styles + * @static array of int + * + */ + private static $mapUnderline = array( + PHPExcel_Style_Font::UNDERLINE_NONE => 0x00, + PHPExcel_Style_Font::UNDERLINE_SINGLE => 0x01, + PHPExcel_Style_Font::UNDERLINE_DOUBLE => 0x02, + PHPExcel_Style_Font::UNDERLINE_SINGLEACCOUNTING => 0x21, + PHPExcel_Style_Font::UNDERLINE_DOUBLEACCOUNTING => 0x22, + ); + + /** + * Map underline + * + * @param string + * @return int + */ + private static function mapUnderline($underline) + { + if (isset(self::$mapUnderline[$underline])) { + return self::$mapUnderline[$underline]; + } + return 0x00; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel5/Parser.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel5/Parser.php new file mode 100644 index 0000000..0cf1c1d --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel5/Parser.php @@ -0,0 +1,1531 @@ +<?php + +/** + * PHPExcel_Writer_Excel5_Parser + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ + +// Original file header of PEAR::Spreadsheet_Excel_Writer_Parser (used as the base for this class): +// ----------------------------------------------------------------------------------------- +// * Class for parsing Excel formulas +// * +// * License Information: +// * +// * Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +// * Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +// * +// * This library is free software; you can redistribute it and/or +// * modify it under the terms of the GNU Lesser General Public +// * License as published by the Free Software Foundation; either +// * version 2.1 of the License, or (at your option) any later version. +// * +// * This library is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// * Lesser General Public License for more details. +// * +// * You should have received a copy of the GNU Lesser General Public +// * License along with this library; if not, write to the Free Software +// * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// */ +class PHPExcel_Writer_Excel5_Parser +{ + /** Constants */ + // Sheet title in unquoted form + // Invalid sheet title characters cannot occur in the sheet title: + // *:/\?[] + // Moreover, there are valid sheet title characters that cannot occur in unquoted form (there may be more?) + // +-% '^&<>=,;#()"{} + const REGEX_SHEET_TITLE_UNQUOTED = '[^\*\:\/\\\\\?\[\]\+\-\% \\\'\^\&\<\>\=\,\;\#\(\)\"\{\}]+'; + + // Sheet title in quoted form (without surrounding quotes) + // Invalid sheet title characters cannot occur in the sheet title: + // *:/\?[] (usual invalid sheet title characters) + // Single quote is represented as a pair '' + const REGEX_SHEET_TITLE_QUOTED = '(([^\*\:\/\\\\\?\[\]\\\'])+|(\\\'\\\')+)+'; + + /** + * The index of the character we are currently looking at + * @var integer + */ + public $currentCharacter; + + /** + * The token we are working on. + * @var string + */ + public $currentToken; + + /** + * The formula to parse + * @var string + */ + private $formula; + + /** + * The character ahead of the current char + * @var string + */ + public $lookAhead; + + /** + * The parse tree to be generated + * @var string + */ + private $parseTree; + + /** + * Array of external sheets + * @var array + */ + private $externalSheets; + + /** + * Array of sheet references in the form of REF structures + * @var array + */ + public $references; + + /** + * The class constructor + * + */ + public function __construct() + { + $this->currentCharacter = 0; + $this->currentToken = ''; // The token we are working on. + $this->formula = ''; // The formula to parse. + $this->lookAhead = ''; // The character ahead of the current char. + $this->parseTree = ''; // The parse tree to be generated. + $this->initializeHashes(); // Initialize the hashes: ptg's and function's ptg's + $this->externalSheets = array(); + $this->references = array(); + } + + /** + * Initialize the ptg and function hashes. + * + * @access private + */ + private function initializeHashes() + { + // The Excel ptg indices + $this->ptg = array( + 'ptgExp' => 0x01, + 'ptgTbl' => 0x02, + 'ptgAdd' => 0x03, + 'ptgSub' => 0x04, + 'ptgMul' => 0x05, + 'ptgDiv' => 0x06, + 'ptgPower' => 0x07, + 'ptgConcat' => 0x08, + 'ptgLT' => 0x09, + 'ptgLE' => 0x0A, + 'ptgEQ' => 0x0B, + 'ptgGE' => 0x0C, + 'ptgGT' => 0x0D, + 'ptgNE' => 0x0E, + 'ptgIsect' => 0x0F, + 'ptgUnion' => 0x10, + 'ptgRange' => 0x11, + 'ptgUplus' => 0x12, + 'ptgUminus' => 0x13, + 'ptgPercent' => 0x14, + 'ptgParen' => 0x15, + 'ptgMissArg' => 0x16, + 'ptgStr' => 0x17, + 'ptgAttr' => 0x19, + 'ptgSheet' => 0x1A, + 'ptgEndSheet' => 0x1B, + 'ptgErr' => 0x1C, + 'ptgBool' => 0x1D, + 'ptgInt' => 0x1E, + 'ptgNum' => 0x1F, + 'ptgArray' => 0x20, + 'ptgFunc' => 0x21, + 'ptgFuncVar' => 0x22, + 'ptgName' => 0x23, + 'ptgRef' => 0x24, + 'ptgArea' => 0x25, + 'ptgMemArea' => 0x26, + 'ptgMemErr' => 0x27, + 'ptgMemNoMem' => 0x28, + 'ptgMemFunc' => 0x29, + 'ptgRefErr' => 0x2A, + 'ptgAreaErr' => 0x2B, + 'ptgRefN' => 0x2C, + 'ptgAreaN' => 0x2D, + 'ptgMemAreaN' => 0x2E, + 'ptgMemNoMemN' => 0x2F, + 'ptgNameX' => 0x39, + 'ptgRef3d' => 0x3A, + 'ptgArea3d' => 0x3B, + 'ptgRefErr3d' => 0x3C, + 'ptgAreaErr3d' => 0x3D, + 'ptgArrayV' => 0x40, + 'ptgFuncV' => 0x41, + 'ptgFuncVarV' => 0x42, + 'ptgNameV' => 0x43, + 'ptgRefV' => 0x44, + 'ptgAreaV' => 0x45, + 'ptgMemAreaV' => 0x46, + 'ptgMemErrV' => 0x47, + 'ptgMemNoMemV' => 0x48, + 'ptgMemFuncV' => 0x49, + 'ptgRefErrV' => 0x4A, + 'ptgAreaErrV' => 0x4B, + 'ptgRefNV' => 0x4C, + 'ptgAreaNV' => 0x4D, + 'ptgMemAreaNV' => 0x4E, + 'ptgMemNoMemN' => 0x4F, + 'ptgFuncCEV' => 0x58, + 'ptgNameXV' => 0x59, + 'ptgRef3dV' => 0x5A, + 'ptgArea3dV' => 0x5B, + 'ptgRefErr3dV' => 0x5C, + 'ptgAreaErr3d' => 0x5D, + 'ptgArrayA' => 0x60, + 'ptgFuncA' => 0x61, + 'ptgFuncVarA' => 0x62, + 'ptgNameA' => 0x63, + 'ptgRefA' => 0x64, + 'ptgAreaA' => 0x65, + 'ptgMemAreaA' => 0x66, + 'ptgMemErrA' => 0x67, + 'ptgMemNoMemA' => 0x68, + 'ptgMemFuncA' => 0x69, + 'ptgRefErrA' => 0x6A, + 'ptgAreaErrA' => 0x6B, + 'ptgRefNA' => 0x6C, + 'ptgAreaNA' => 0x6D, + 'ptgMemAreaNA' => 0x6E, + 'ptgMemNoMemN' => 0x6F, + 'ptgFuncCEA' => 0x78, + 'ptgNameXA' => 0x79, + 'ptgRef3dA' => 0x7A, + 'ptgArea3dA' => 0x7B, + 'ptgRefErr3dA' => 0x7C, + 'ptgAreaErr3d' => 0x7D + ); + + // Thanks to Michael Meeks and Gnumeric for the initial arg values. + // + // The following hash was generated by "function_locale.pl" in the distro. + // Refer to function_locale.pl for non-English function names. + // + // The array elements are as follow: + // ptg: The Excel function ptg code. + // args: The number of arguments that the function takes: + // >=0 is a fixed number of arguments. + // -1 is a variable number of arguments. + // class: The reference, value or array class of the function args. + // vol: The function is volatile. + // + $this->functions = array( + // function ptg args class vol + 'COUNT' => array( 0, -1, 0, 0 ), + 'IF' => array( 1, -1, 1, 0 ), + 'ISNA' => array( 2, 1, 1, 0 ), + 'ISERROR' => array( 3, 1, 1, 0 ), + 'SUM' => array( 4, -1, 0, 0 ), + 'AVERAGE' => array( 5, -1, 0, 0 ), + 'MIN' => array( 6, -1, 0, 0 ), + 'MAX' => array( 7, -1, 0, 0 ), + 'ROW' => array( 8, -1, 0, 0 ), + 'COLUMN' => array( 9, -1, 0, 0 ), + 'NA' => array( 10, 0, 0, 0 ), + 'NPV' => array( 11, -1, 1, 0 ), + 'STDEV' => array( 12, -1, 0, 0 ), + 'DOLLAR' => array( 13, -1, 1, 0 ), + 'FIXED' => array( 14, -1, 1, 0 ), + 'SIN' => array( 15, 1, 1, 0 ), + 'COS' => array( 16, 1, 1, 0 ), + 'TAN' => array( 17, 1, 1, 0 ), + 'ATAN' => array( 18, 1, 1, 0 ), + 'PI' => array( 19, 0, 1, 0 ), + 'SQRT' => array( 20, 1, 1, 0 ), + 'EXP' => array( 21, 1, 1, 0 ), + 'LN' => array( 22, 1, 1, 0 ), + 'LOG10' => array( 23, 1, 1, 0 ), + 'ABS' => array( 24, 1, 1, 0 ), + 'INT' => array( 25, 1, 1, 0 ), + 'SIGN' => array( 26, 1, 1, 0 ), + 'ROUND' => array( 27, 2, 1, 0 ), + 'LOOKUP' => array( 28, -1, 0, 0 ), + 'INDEX' => array( 29, -1, 0, 1 ), + 'REPT' => array( 30, 2, 1, 0 ), + 'MID' => array( 31, 3, 1, 0 ), + 'LEN' => array( 32, 1, 1, 0 ), + 'VALUE' => array( 33, 1, 1, 0 ), + 'TRUE' => array( 34, 0, 1, 0 ), + 'FALSE' => array( 35, 0, 1, 0 ), + 'AND' => array( 36, -1, 0, 0 ), + 'OR' => array( 37, -1, 0, 0 ), + 'NOT' => array( 38, 1, 1, 0 ), + 'MOD' => array( 39, 2, 1, 0 ), + 'DCOUNT' => array( 40, 3, 0, 0 ), + 'DSUM' => array( 41, 3, 0, 0 ), + 'DAVERAGE' => array( 42, 3, 0, 0 ), + 'DMIN' => array( 43, 3, 0, 0 ), + 'DMAX' => array( 44, 3, 0, 0 ), + 'DSTDEV' => array( 45, 3, 0, 0 ), + 'VAR' => array( 46, -1, 0, 0 ), + 'DVAR' => array( 47, 3, 0, 0 ), + 'TEXT' => array( 48, 2, 1, 0 ), + 'LINEST' => array( 49, -1, 0, 0 ), + 'TREND' => array( 50, -1, 0, 0 ), + 'LOGEST' => array( 51, -1, 0, 0 ), + 'GROWTH' => array( 52, -1, 0, 0 ), + 'PV' => array( 56, -1, 1, 0 ), + 'FV' => array( 57, -1, 1, 0 ), + 'NPER' => array( 58, -1, 1, 0 ), + 'PMT' => array( 59, -1, 1, 0 ), + 'RATE' => array( 60, -1, 1, 0 ), + 'MIRR' => array( 61, 3, 0, 0 ), + 'IRR' => array( 62, -1, 0, 0 ), + 'RAND' => array( 63, 0, 1, 1 ), + 'MATCH' => array( 64, -1, 0, 0 ), + 'DATE' => array( 65, 3, 1, 0 ), + 'TIME' => array( 66, 3, 1, 0 ), + 'DAY' => array( 67, 1, 1, 0 ), + 'MONTH' => array( 68, 1, 1, 0 ), + 'YEAR' => array( 69, 1, 1, 0 ), + 'WEEKDAY' => array( 70, -1, 1, 0 ), + 'HOUR' => array( 71, 1, 1, 0 ), + 'MINUTE' => array( 72, 1, 1, 0 ), + 'SECOND' => array( 73, 1, 1, 0 ), + 'NOW' => array( 74, 0, 1, 1 ), + 'AREAS' => array( 75, 1, 0, 1 ), + 'ROWS' => array( 76, 1, 0, 1 ), + 'COLUMNS' => array( 77, 1, 0, 1 ), + 'OFFSET' => array( 78, -1, 0, 1 ), + 'SEARCH' => array( 82, -1, 1, 0 ), + 'TRANSPOSE' => array( 83, 1, 1, 0 ), + 'TYPE' => array( 86, 1, 1, 0 ), + 'ATAN2' => array( 97, 2, 1, 0 ), + 'ASIN' => array( 98, 1, 1, 0 ), + 'ACOS' => array( 99, 1, 1, 0 ), + 'CHOOSE' => array( 100, -1, 1, 0 ), + 'HLOOKUP' => array( 101, -1, 0, 0 ), + 'VLOOKUP' => array( 102, -1, 0, 0 ), + 'ISREF' => array( 105, 1, 0, 0 ), + 'LOG' => array( 109, -1, 1, 0 ), + 'CHAR' => array( 111, 1, 1, 0 ), + 'LOWER' => array( 112, 1, 1, 0 ), + 'UPPER' => array( 113, 1, 1, 0 ), + 'PROPER' => array( 114, 1, 1, 0 ), + 'LEFT' => array( 115, -1, 1, 0 ), + 'RIGHT' => array( 116, -1, 1, 0 ), + 'EXACT' => array( 117, 2, 1, 0 ), + 'TRIM' => array( 118, 1, 1, 0 ), + 'REPLACE' => array( 119, 4, 1, 0 ), + 'SUBSTITUTE' => array( 120, -1, 1, 0 ), + 'CODE' => array( 121, 1, 1, 0 ), + 'FIND' => array( 124, -1, 1, 0 ), + 'CELL' => array( 125, -1, 0, 1 ), + 'ISERR' => array( 126, 1, 1, 0 ), + 'ISTEXT' => array( 127, 1, 1, 0 ), + 'ISNUMBER' => array( 128, 1, 1, 0 ), + 'ISBLANK' => array( 129, 1, 1, 0 ), + 'T' => array( 130, 1, 0, 0 ), + 'N' => array( 131, 1, 0, 0 ), + 'DATEVALUE' => array( 140, 1, 1, 0 ), + 'TIMEVALUE' => array( 141, 1, 1, 0 ), + 'SLN' => array( 142, 3, 1, 0 ), + 'SYD' => array( 143, 4, 1, 0 ), + 'DDB' => array( 144, -1, 1, 0 ), + 'INDIRECT' => array( 148, -1, 1, 1 ), + 'CALL' => array( 150, -1, 1, 0 ), + 'CLEAN' => array( 162, 1, 1, 0 ), + 'MDETERM' => array( 163, 1, 2, 0 ), + 'MINVERSE' => array( 164, 1, 2, 0 ), + 'MMULT' => array( 165, 2, 2, 0 ), + 'IPMT' => array( 167, -1, 1, 0 ), + 'PPMT' => array( 168, -1, 1, 0 ), + 'COUNTA' => array( 169, -1, 0, 0 ), + 'PRODUCT' => array( 183, -1, 0, 0 ), + 'FACT' => array( 184, 1, 1, 0 ), + 'DPRODUCT' => array( 189, 3, 0, 0 ), + 'ISNONTEXT' => array( 190, 1, 1, 0 ), + 'STDEVP' => array( 193, -1, 0, 0 ), + 'VARP' => array( 194, -1, 0, 0 ), + 'DSTDEVP' => array( 195, 3, 0, 0 ), + 'DVARP' => array( 196, 3, 0, 0 ), + 'TRUNC' => array( 197, -1, 1, 0 ), + 'ISLOGICAL' => array( 198, 1, 1, 0 ), + 'DCOUNTA' => array( 199, 3, 0, 0 ), + 'USDOLLAR' => array( 204, -1, 1, 0 ), + 'FINDB' => array( 205, -1, 1, 0 ), + 'SEARCHB' => array( 206, -1, 1, 0 ), + 'REPLACEB' => array( 207, 4, 1, 0 ), + 'LEFTB' => array( 208, -1, 1, 0 ), + 'RIGHTB' => array( 209, -1, 1, 0 ), + 'MIDB' => array( 210, 3, 1, 0 ), + 'LENB' => array( 211, 1, 1, 0 ), + 'ROUNDUP' => array( 212, 2, 1, 0 ), + 'ROUNDDOWN' => array( 213, 2, 1, 0 ), + 'ASC' => array( 214, 1, 1, 0 ), + 'DBCS' => array( 215, 1, 1, 0 ), + 'RANK' => array( 216, -1, 0, 0 ), + 'ADDRESS' => array( 219, -1, 1, 0 ), + 'DAYS360' => array( 220, -1, 1, 0 ), + 'TODAY' => array( 221, 0, 1, 1 ), + 'VDB' => array( 222, -1, 1, 0 ), + 'MEDIAN' => array( 227, -1, 0, 0 ), + 'SUMPRODUCT' => array( 228, -1, 2, 0 ), + 'SINH' => array( 229, 1, 1, 0 ), + 'COSH' => array( 230, 1, 1, 0 ), + 'TANH' => array( 231, 1, 1, 0 ), + 'ASINH' => array( 232, 1, 1, 0 ), + 'ACOSH' => array( 233, 1, 1, 0 ), + 'ATANH' => array( 234, 1, 1, 0 ), + 'DGET' => array( 235, 3, 0, 0 ), + 'INFO' => array( 244, 1, 1, 1 ), + 'DB' => array( 247, -1, 1, 0 ), + 'FREQUENCY' => array( 252, 2, 0, 0 ), + 'ERROR.TYPE' => array( 261, 1, 1, 0 ), + 'REGISTER.ID' => array( 267, -1, 1, 0 ), + 'AVEDEV' => array( 269, -1, 0, 0 ), + 'BETADIST' => array( 270, -1, 1, 0 ), + 'GAMMALN' => array( 271, 1, 1, 0 ), + 'BETAINV' => array( 272, -1, 1, 0 ), + 'BINOMDIST' => array( 273, 4, 1, 0 ), + 'CHIDIST' => array( 274, 2, 1, 0 ), + 'CHIINV' => array( 275, 2, 1, 0 ), + 'COMBIN' => array( 276, 2, 1, 0 ), + 'CONFIDENCE' => array( 277, 3, 1, 0 ), + 'CRITBINOM' => array( 278, 3, 1, 0 ), + 'EVEN' => array( 279, 1, 1, 0 ), + 'EXPONDIST' => array( 280, 3, 1, 0 ), + 'FDIST' => array( 281, 3, 1, 0 ), + 'FINV' => array( 282, 3, 1, 0 ), + 'FISHER' => array( 283, 1, 1, 0 ), + 'FISHERINV' => array( 284, 1, 1, 0 ), + 'FLOOR' => array( 285, 2, 1, 0 ), + 'GAMMADIST' => array( 286, 4, 1, 0 ), + 'GAMMAINV' => array( 287, 3, 1, 0 ), + 'CEILING' => array( 288, 2, 1, 0 ), + 'HYPGEOMDIST' => array( 289, 4, 1, 0 ), + 'LOGNORMDIST' => array( 290, 3, 1, 0 ), + 'LOGINV' => array( 291, 3, 1, 0 ), + 'NEGBINOMDIST' => array( 292, 3, 1, 0 ), + 'NORMDIST' => array( 293, 4, 1, 0 ), + 'NORMSDIST' => array( 294, 1, 1, 0 ), + 'NORMINV' => array( 295, 3, 1, 0 ), + 'NORMSINV' => array( 296, 1, 1, 0 ), + 'STANDARDIZE' => array( 297, 3, 1, 0 ), + 'ODD' => array( 298, 1, 1, 0 ), + 'PERMUT' => array( 299, 2, 1, 0 ), + 'POISSON' => array( 300, 3, 1, 0 ), + 'TDIST' => array( 301, 3, 1, 0 ), + 'WEIBULL' => array( 302, 4, 1, 0 ), + 'SUMXMY2' => array( 303, 2, 2, 0 ), + 'SUMX2MY2' => array( 304, 2, 2, 0 ), + 'SUMX2PY2' => array( 305, 2, 2, 0 ), + 'CHITEST' => array( 306, 2, 2, 0 ), + 'CORREL' => array( 307, 2, 2, 0 ), + 'COVAR' => array( 308, 2, 2, 0 ), + 'FORECAST' => array( 309, 3, 2, 0 ), + 'FTEST' => array( 310, 2, 2, 0 ), + 'INTERCEPT' => array( 311, 2, 2, 0 ), + 'PEARSON' => array( 312, 2, 2, 0 ), + 'RSQ' => array( 313, 2, 2, 0 ), + 'STEYX' => array( 314, 2, 2, 0 ), + 'SLOPE' => array( 315, 2, 2, 0 ), + 'TTEST' => array( 316, 4, 2, 0 ), + 'PROB' => array( 317, -1, 2, 0 ), + 'DEVSQ' => array( 318, -1, 0, 0 ), + 'GEOMEAN' => array( 319, -1, 0, 0 ), + 'HARMEAN' => array( 320, -1, 0, 0 ), + 'SUMSQ' => array( 321, -1, 0, 0 ), + 'KURT' => array( 322, -1, 0, 0 ), + 'SKEW' => array( 323, -1, 0, 0 ), + 'ZTEST' => array( 324, -1, 0, 0 ), + 'LARGE' => array( 325, 2, 0, 0 ), + 'SMALL' => array( 326, 2, 0, 0 ), + 'QUARTILE' => array( 327, 2, 0, 0 ), + 'PERCENTILE' => array( 328, 2, 0, 0 ), + 'PERCENTRANK' => array( 329, -1, 0, 0 ), + 'MODE' => array( 330, -1, 2, 0 ), + 'TRIMMEAN' => array( 331, 2, 0, 0 ), + 'TINV' => array( 332, 2, 1, 0 ), + 'CONCATENATE' => array( 336, -1, 1, 0 ), + 'POWER' => array( 337, 2, 1, 0 ), + 'RADIANS' => array( 342, 1, 1, 0 ), + 'DEGREES' => array( 343, 1, 1, 0 ), + 'SUBTOTAL' => array( 344, -1, 0, 0 ), + 'SUMIF' => array( 345, -1, 0, 0 ), + 'COUNTIF' => array( 346, 2, 0, 0 ), + 'COUNTBLANK' => array( 347, 1, 0, 0 ), + 'ISPMT' => array( 350, 4, 1, 0 ), + 'DATEDIF' => array( 351, 3, 1, 0 ), + 'DATESTRING' => array( 352, 1, 1, 0 ), + 'NUMBERSTRING' => array( 353, 2, 1, 0 ), + 'ROMAN' => array( 354, -1, 1, 0 ), + 'GETPIVOTDATA' => array( 358, -1, 0, 0 ), + 'HYPERLINK' => array( 359, -1, 1, 0 ), + 'PHONETIC' => array( 360, 1, 0, 0 ), + 'AVERAGEA' => array( 361, -1, 0, 0 ), + 'MAXA' => array( 362, -1, 0, 0 ), + 'MINA' => array( 363, -1, 0, 0 ), + 'STDEVPA' => array( 364, -1, 0, 0 ), + 'VARPA' => array( 365, -1, 0, 0 ), + 'STDEVA' => array( 366, -1, 0, 0 ), + 'VARA' => array( 367, -1, 0, 0 ), + 'BAHTTEXT' => array( 368, 1, 0, 0 ), + ); + } + + /** + * Convert a token to the proper ptg value. + * + * @access private + * @param mixed $token The token to convert. + * @return mixed the converted token on success + */ + private function convert($token) + { + if (preg_match("/\"([^\"]|\"\"){0,255}\"/", $token)) { + return $this->convertString($token); + + } elseif (is_numeric($token)) { + return $this->convertNumber($token); + + // match references like A1 or $A$1 + } elseif (preg_match('/^\$?([A-Ia-i]?[A-Za-z])\$?(\d+)$/', $token)) { + return $this->convertRef2d($token); + + // match external references like Sheet1!A1 or Sheet1:Sheet2!A1 or Sheet1!$A$1 or Sheet1:Sheet2!$A$1 + } elseif (preg_match("/^" . self::REGEX_SHEET_TITLE_UNQUOTED . "(\:" . self::REGEX_SHEET_TITLE_UNQUOTED . ")?\!\\$?[A-Ia-i]?[A-Za-z]\\$?(\d+)$/u", $token)) { + return $this->convertRef3d($token); + + // match external references like 'Sheet1'!A1 or 'Sheet1:Sheet2'!A1 or 'Sheet1'!$A$1 or 'Sheet1:Sheet2'!$A$1 + } elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . "(\:" . self::REGEX_SHEET_TITLE_QUOTED . ")?'\!\\$?[A-Ia-i]?[A-Za-z]\\$?(\d+)$/u", $token)) { + return $this->convertRef3d($token); + + // match ranges like A1:B2 or $A$1:$B$2 + } elseif (preg_match('/^(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)\:(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)$/', $token)) { + return $this->convertRange2d($token); + + // match external ranges like Sheet1!A1:B2 or Sheet1:Sheet2!A1:B2 or Sheet1!$A$1:$B$2 or Sheet1:Sheet2!$A$1:$B$2 + } elseif (preg_match("/^" . self::REGEX_SHEET_TITLE_UNQUOTED . "(\:" . self::REGEX_SHEET_TITLE_UNQUOTED . ")?\!\\$?([A-Ia-i]?[A-Za-z])?\\$?(\d+)\:\\$?([A-Ia-i]?[A-Za-z])?\\$?(\d+)$/u", $token)) { + return $this->convertRange3d($token); + + // match external ranges like 'Sheet1'!A1:B2 or 'Sheet1:Sheet2'!A1:B2 or 'Sheet1'!$A$1:$B$2 or 'Sheet1:Sheet2'!$A$1:$B$2 + } elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . "(\:" . self::REGEX_SHEET_TITLE_QUOTED . ")?'\!\\$?([A-Ia-i]?[A-Za-z])?\\$?(\d+)\:\\$?([A-Ia-i]?[A-Za-z])?\\$?(\d+)$/u", $token)) { + return $this->convertRange3d($token); + + // operators (including parentheses) + } elseif (isset($this->ptg[$token])) { + return pack("C", $this->ptg[$token]); + + // match error codes + } elseif (preg_match("/^#[A-Z0\/]{3,5}[!?]{1}$/", $token) or $token == '#N/A') { + return $this->convertError($token); + + // commented so argument number can be processed correctly. See toReversePolish(). + /*elseif (preg_match("/[A-Z0-9\xc0-\xdc\.]+/", $token)) + { + return($this->convertFunction($token, $this->_func_args)); + }*/ + + // if it's an argument, ignore the token (the argument remains) + } elseif ($token == 'arg') { + return ''; + } + + // TODO: use real error codes + throw new PHPExcel_Writer_Exception("Unknown token $token"); + } + + /** + * Convert a number token to ptgInt or ptgNum + * + * @access private + * @param mixed $num an integer or double for conversion to its ptg value + */ + private function convertNumber($num) + { + // Integer in the range 0..2**16-1 + if ((preg_match("/^\d+$/", $num)) and ($num <= 65535)) { + return pack("Cv", $this->ptg['ptgInt'], $num); + } else { // A float + if (PHPExcel_Writer_Excel5_BIFFwriter::getByteOrder()) { // if it's Big Endian + $num = strrev($num); + } + return pack("Cd", $this->ptg['ptgNum'], $num); + } + } + + /** + * Convert a string token to ptgStr + * + * @access private + * @param string $string A string for conversion to its ptg value. + * @return mixed the converted token on success + */ + private function convertString($string) + { + // chop away beggining and ending quotes + $string = substr($string, 1, strlen($string) - 2); + if (strlen($string) > 255) { + throw new PHPExcel_Writer_Exception("String is too long"); + } + + return pack('C', $this->ptg['ptgStr']) . PHPExcel_Shared_String::UTF8toBIFF8UnicodeShort($string); + } + + /** + * Convert a function to a ptgFunc or ptgFuncVarV depending on the number of + * args that it takes. + * + * @access private + * @param string $token The name of the function for convertion to ptg value. + * @param integer $num_args The number of arguments the function receives. + * @return string The packed ptg for the function + */ + private function convertFunction($token, $num_args) + { + $args = $this->functions[$token][1]; +// $volatile = $this->functions[$token][3]; + + // Fixed number of args eg. TIME($i, $j, $k). + if ($args >= 0) { + return pack("Cv", $this->ptg['ptgFuncV'], $this->functions[$token][0]); + } + // Variable number of args eg. SUM($i, $j, $k, ..). + if ($args == -1) { + return pack("CCv", $this->ptg['ptgFuncVarV'], $num_args, $this->functions[$token][0]); + } + } + + /** + * Convert an Excel range such as A1:D4 to a ptgRefV. + * + * @access private + * @param string $range An Excel range in the A1:A2 + * @param int $class + */ + private function convertRange2d($range, $class = 0) + { + + // TODO: possible class value 0,1,2 check Formula.pm + // Split the range into 2 cell refs + if (preg_match('/^(\$)?([A-Ia-i]?[A-Za-z])(\$)?(\d+)\:(\$)?([A-Ia-i]?[A-Za-z])(\$)?(\d+)$/', $range)) { + list($cell1, $cell2) = explode(':', $range); + } else { + // TODO: use real error codes + throw new PHPExcel_Writer_Exception("Unknown range separator"); + } + + // Convert the cell references + list($row1, $col1) = $this->cellToPackedRowcol($cell1); + list($row2, $col2) = $this->cellToPackedRowcol($cell2); + + // The ptg value depends on the class of the ptg. + if ($class == 0) { + $ptgArea = pack("C", $this->ptg['ptgArea']); + } elseif ($class == 1) { + $ptgArea = pack("C", $this->ptg['ptgAreaV']); + } elseif ($class == 2) { + $ptgArea = pack("C", $this->ptg['ptgAreaA']); + } else { + // TODO: use real error codes + throw new PHPExcel_Writer_Exception("Unknown class $class"); + } + return $ptgArea . $row1 . $row2 . $col1. $col2; + } + + /** + * Convert an Excel 3d range such as "Sheet1!A1:D4" or "Sheet1:Sheet2!A1:D4" to + * a ptgArea3d. + * + * @access private + * @param string $token An Excel range in the Sheet1!A1:A2 format. + * @return mixed The packed ptgArea3d token on success. + */ + private function convertRange3d($token) + { +// $class = 0; // formulas like Sheet1!$A$1:$A$2 in list type data validation need this class (0x3B) + + // Split the ref at the ! symbol + list($ext_ref, $range) = explode('!', $token); + + // Convert the external reference part (different for BIFF8) + $ext_ref = $this->getRefIndex($ext_ref); + + // Split the range into 2 cell refs + list($cell1, $cell2) = explode(':', $range); + + // Convert the cell references + if (preg_match("/^(\\$)?[A-Ia-i]?[A-Za-z](\\$)?(\d+)$/", $cell1)) { + list($row1, $col1) = $this->cellToPackedRowcol($cell1); + list($row2, $col2) = $this->cellToPackedRowcol($cell2); + } else { // It's a rows range (like 26:27) + list($row1, $col1, $row2, $col2) = $this->rangeToPackedRange($cell1.':'.$cell2); + } + + // The ptg value depends on the class of the ptg. +// if ($class == 0) { + $ptgArea = pack("C", $this->ptg['ptgArea3d']); +// } elseif ($class == 1) { +// $ptgArea = pack("C", $this->ptg['ptgArea3dV']); +// } elseif ($class == 2) { +// $ptgArea = pack("C", $this->ptg['ptgArea3dA']); +// } else { +// throw new PHPExcel_Writer_Exception("Unknown class $class"); +// } + + return $ptgArea . $ext_ref . $row1 . $row2 . $col1. $col2; + } + + /** + * Convert an Excel reference such as A1, $B2, C$3 or $D$4 to a ptgRefV. + * + * @access private + * @param string $cell An Excel cell reference + * @return string The cell in packed() format with the corresponding ptg + */ + private function convertRef2d($cell) + { +// $class = 2; // as far as I know, this is magick. + + // Convert the cell reference + $cell_array = $this->cellToPackedRowcol($cell); + list($row, $col) = $cell_array; + + // The ptg value depends on the class of the ptg. +// if ($class == 0) { +// $ptgRef = pack("C", $this->ptg['ptgRef']); +// } elseif ($class == 1) { +// $ptgRef = pack("C", $this->ptg['ptgRefV']); +// } elseif ($class == 2) { + $ptgRef = pack("C", $this->ptg['ptgRefA']); +// } else { +// // TODO: use real error codes +// throw new PHPExcel_Writer_Exception("Unknown class $class"); +// } + return $ptgRef.$row.$col; + } + + /** + * Convert an Excel 3d reference such as "Sheet1!A1" or "Sheet1:Sheet2!A1" to a + * ptgRef3d. + * + * @access private + * @param string $cell An Excel cell reference + * @return mixed The packed ptgRef3d token on success. + */ + private function convertRef3d($cell) + { +// $class = 2; // as far as I know, this is magick. + + // Split the ref at the ! symbol + list($ext_ref, $cell) = explode('!', $cell); + + // Convert the external reference part (different for BIFF8) + $ext_ref = $this->getRefIndex($ext_ref); + + // Convert the cell reference part + list($row, $col) = $this->cellToPackedRowcol($cell); + + // The ptg value depends on the class of the ptg. +// if ($class == 0) { +// $ptgRef = pack("C", $this->ptg['ptgRef3d']); +// } elseif ($class == 1) { +// $ptgRef = pack("C", $this->ptg['ptgRef3dV']); +// } elseif ($class == 2) { + $ptgRef = pack("C", $this->ptg['ptgRef3dA']); +// } else { +// throw new PHPExcel_Writer_Exception("Unknown class $class"); +// } + + return $ptgRef . $ext_ref. $row . $col; + } + + /** + * Convert an error code to a ptgErr + * + * @access private + * @param string $errorCode The error code for conversion to its ptg value + * @return string The error code ptgErr + */ + private function convertError($errorCode) + { + switch ($errorCode) { + case '#NULL!': + return pack("C", 0x00); + case '#DIV/0!': + return pack("C", 0x07); + case '#VALUE!': + return pack("C", 0x0F); + case '#REF!': + return pack("C", 0x17); + case '#NAME?': + return pack("C", 0x1D); + case '#NUM!': + return pack("C", 0x24); + case '#N/A': + return pack("C", 0x2A); + } + return pack("C", 0xFF); + } + + /** + * Convert the sheet name part of an external reference, for example "Sheet1" or + * "Sheet1:Sheet2", to a packed structure. + * + * @access private + * @param string $ext_ref The name of the external reference + * @return string The reference index in packed() format + */ + private function packExtRef($ext_ref) + { + $ext_ref = preg_replace("/^'/", '', $ext_ref); // Remove leading ' if any. + $ext_ref = preg_replace("/'$/", '', $ext_ref); // Remove trailing ' if any. + + // Check if there is a sheet range eg., Sheet1:Sheet2. + if (preg_match("/:/", $ext_ref)) { + list($sheet_name1, $sheet_name2) = explode(':', $ext_ref); + + $sheet1 = $this->getSheetIndex($sheet_name1); + if ($sheet1 == -1) { + throw new PHPExcel_Writer_Exception("Unknown sheet name $sheet_name1 in formula"); + } + $sheet2 = $this->getSheetIndex($sheet_name2); + if ($sheet2 == -1) { + throw new PHPExcel_Writer_Exception("Unknown sheet name $sheet_name2 in formula"); + } + + // Reverse max and min sheet numbers if necessary + if ($sheet1 > $sheet2) { + list($sheet1, $sheet2) = array($sheet2, $sheet1); + } + } else { // Single sheet name only. + $sheet1 = $this->getSheetIndex($ext_ref); + if ($sheet1 == -1) { + throw new PHPExcel_Writer_Exception("Unknown sheet name $ext_ref in formula"); + } + $sheet2 = $sheet1; + } + + // References are stored relative to 0xFFFF. + $offset = -1 - $sheet1; + + return pack('vdvv', $offset, 0x00, $sheet1, $sheet2); + } + + /** + * Look up the REF index that corresponds to an external sheet name + * (or range). If it doesn't exist yet add it to the workbook's references + * array. It assumes all sheet names given must exist. + * + * @access private + * @param string $ext_ref The name of the external reference + * @return mixed The reference index in packed() format on success + */ + private function getRefIndex($ext_ref) + { + $ext_ref = preg_replace("/^'/", '', $ext_ref); // Remove leading ' if any. + $ext_ref = preg_replace("/'$/", '', $ext_ref); // Remove trailing ' if any. + $ext_ref = str_replace('\'\'', '\'', $ext_ref); // Replace escaped '' with ' + + // Check if there is a sheet range eg., Sheet1:Sheet2. + if (preg_match("/:/", $ext_ref)) { + list($sheet_name1, $sheet_name2) = explode(':', $ext_ref); + + $sheet1 = $this->getSheetIndex($sheet_name1); + if ($sheet1 == -1) { + throw new PHPExcel_Writer_Exception("Unknown sheet name $sheet_name1 in formula"); + } + $sheet2 = $this->getSheetIndex($sheet_name2); + if ($sheet2 == -1) { + throw new PHPExcel_Writer_Exception("Unknown sheet name $sheet_name2 in formula"); + } + + // Reverse max and min sheet numbers if necessary + if ($sheet1 > $sheet2) { + list($sheet1, $sheet2) = array($sheet2, $sheet1); + } + } else { // Single sheet name only. + $sheet1 = $this->getSheetIndex($ext_ref); + if ($sheet1 == -1) { + throw new PHPExcel_Writer_Exception("Unknown sheet name $ext_ref in formula"); + } + $sheet2 = $sheet1; + } + + // assume all references belong to this document + $supbook_index = 0x00; + $ref = pack('vvv', $supbook_index, $sheet1, $sheet2); + $totalreferences = count($this->references); + $index = -1; + for ($i = 0; $i < $totalreferences; ++$i) { + if ($ref == $this->references[$i]) { + $index = $i; + break; + } + } + // if REF was not found add it to references array + if ($index == -1) { + $this->references[$totalreferences] = $ref; + $index = $totalreferences; + } + + return pack('v', $index); + } + + /** + * Look up the index that corresponds to an external sheet name. The hash of + * sheet names is updated by the addworksheet() method of the + * PHPExcel_Writer_Excel5_Workbook class. + * + * @access private + * @param string $sheet_name Sheet name + * @return integer The sheet index, -1 if the sheet was not found + */ + private function getSheetIndex($sheet_name) + { + if (!isset($this->externalSheets[$sheet_name])) { + return -1; + } else { + return $this->externalSheets[$sheet_name]; + } + } + + /** + * This method is used to update the array of sheet names. It is + * called by the addWorksheet() method of the + * PHPExcel_Writer_Excel5_Workbook class. + * + * @access public + * @see PHPExcel_Writer_Excel5_Workbook::addWorksheet() + * @param string $name The name of the worksheet being added + * @param integer $index The index of the worksheet being added + */ + public function setExtSheet($name, $index) + { + $this->externalSheets[$name] = $index; + } + + /** + * pack() row and column into the required 3 or 4 byte format. + * + * @access private + * @param string $cell The Excel cell reference to be packed + * @return array Array containing the row and column in packed() format + */ + private function cellToPackedRowcol($cell) + { + $cell = strtoupper($cell); + list($row, $col, $row_rel, $col_rel) = $this->cellToRowcol($cell); + if ($col >= 256) { + throw new PHPExcel_Writer_Exception("Column in: $cell greater than 255"); + } + if ($row >= 65536) { + throw new PHPExcel_Writer_Exception("Row in: $cell greater than 65536 "); + } + + // Set the high bits to indicate if row or col are relative. + $col |= $col_rel << 14; + $col |= $row_rel << 15; + $col = pack('v', $col); + + $row = pack('v', $row); + + return array($row, $col); + } + + /** + * pack() row range into the required 3 or 4 byte format. + * Just using maximum col/rows, which is probably not the correct solution + * + * @access private + * @param string $range The Excel range to be packed + * @return array Array containing (row1,col1,row2,col2) in packed() format + */ + private function rangeToPackedRange($range) + { + preg_match('/(\$)?(\d+)\:(\$)?(\d+)/', $range, $match); + // return absolute rows if there is a $ in the ref + $row1_rel = empty($match[1]) ? 1 : 0; + $row1 = $match[2]; + $row2_rel = empty($match[3]) ? 1 : 0; + $row2 = $match[4]; + // Convert 1-index to zero-index + --$row1; + --$row2; + // Trick poor inocent Excel + $col1 = 0; + $col2 = 65535; // FIXME: maximum possible value for Excel 5 (change this!!!) + + // FIXME: this changes for BIFF8 + if (($row1 >= 65536) or ($row2 >= 65536)) { + throw new PHPExcel_Writer_Exception("Row in: $range greater than 65536 "); + } + + // Set the high bits to indicate if rows are relative. + $col1 |= $row1_rel << 15; + $col2 |= $row2_rel << 15; + $col1 = pack('v', $col1); + $col2 = pack('v', $col2); + + $row1 = pack('v', $row1); + $row2 = pack('v', $row2); + + return array($row1, $col1, $row2, $col2); + } + + /** + * Convert an Excel cell reference such as A1 or $B2 or C$3 or $D$4 to a zero + * indexed row and column number. Also returns two (0,1) values to indicate + * whether the row or column are relative references. + * + * @access private + * @param string $cell The Excel cell reference in A1 format. + * @return array + */ + private function cellToRowcol($cell) + { + preg_match('/(\$)?([A-I]?[A-Z])(\$)?(\d+)/', $cell, $match); + // return absolute column if there is a $ in the ref + $col_rel = empty($match[1]) ? 1 : 0; + $col_ref = $match[2]; + $row_rel = empty($match[3]) ? 1 : 0; + $row = $match[4]; + + // Convert base26 column string to a number. + $expn = strlen($col_ref) - 1; + $col = 0; + $col_ref_length = strlen($col_ref); + for ($i = 0; $i < $col_ref_length; ++$i) { + $col += (ord($col_ref{$i}) - 64) * pow(26, $expn); + --$expn; + } + + // Convert 1-index to zero-index + --$row; + --$col; + + return array($row, $col, $row_rel, $col_rel); + } + + /** + * Advance to the next valid token. + * + * @access private + */ + private function advance() + { + $i = $this->currentCharacter; + $formula_length = strlen($this->formula); + // eat up white spaces + if ($i < $formula_length) { + while ($this->formula{$i} == " ") { + ++$i; + } + + if ($i < ($formula_length - 1)) { + $this->lookAhead = $this->formula{$i+1}; + } + $token = ''; + } + + while ($i < $formula_length) { + $token .= $this->formula{$i}; + + if ($i < ($formula_length - 1)) { + $this->lookAhead = $this->formula{$i+1}; + } else { + $this->lookAhead = ''; + } + + if ($this->match($token) != '') { + //if ($i < strlen($this->formula) - 1) { + // $this->lookAhead = $this->formula{$i+1}; + //} + $this->currentCharacter = $i + 1; + $this->currentToken = $token; + return 1; + } + + if ($i < ($formula_length - 2)) { + $this->lookAhead = $this->formula{$i+2}; + } else { // if we run out of characters lookAhead becomes empty + $this->lookAhead = ''; + } + ++$i; + } + //die("Lexical error ".$this->currentCharacter); + } + + /** + * Checks if it's a valid token. + * + * @access private + * @param mixed $token The token to check. + * @return mixed The checked token or false on failure + */ + private function match($token) + { + switch ($token) { + case "+": + case "-": + case "*": + case "/": + case "(": + case ")": + case ",": + case ";": + case ">=": + case "<=": + case "=": + case "<>": + case "^": + case "&": + case "%": + return $token; + break; + case ">": + if ($this->lookAhead == '=') { // it's a GE token + break; + } + return $token; + break; + case "<": + // it's a LE or a NE token + if (($this->lookAhead == '=') or ($this->lookAhead == '>')) { + break; + } + return $token; + break; + default: + // if it's a reference A1 or $A$1 or $A1 or A$1 + if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?[0-9]+$/', $token) and !preg_match("/[0-9]/", $this->lookAhead) and ($this->lookAhead != ':') and ($this->lookAhead != '.') and ($this->lookAhead != '!')) { + return $token; + } elseif (preg_match("/^" . self::REGEX_SHEET_TITLE_UNQUOTED . "(\:" . self::REGEX_SHEET_TITLE_UNQUOTED . ")?\!\\$?[A-Ia-i]?[A-Za-z]\\$?[0-9]+$/u", $token) and !preg_match("/[0-9]/", $this->lookAhead) and ($this->lookAhead != ':') and ($this->lookAhead != '.')) { + // If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1 or Sheet1!$A$1 or Sheet1:Sheet2!$A$1) + return $token; + } elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . "(\:" . self::REGEX_SHEET_TITLE_QUOTED . ")?'\!\\$?[A-Ia-i]?[A-Za-z]\\$?[0-9]+$/u", $token) and !preg_match("/[0-9]/", $this->lookAhead) and ($this->lookAhead != ':') and ($this->lookAhead != '.')) { + // If it's an external reference ('Sheet1'!A1 or 'Sheet1:Sheet2'!A1 or 'Sheet1'!$A$1 or 'Sheet1:Sheet2'!$A$1) + return $token; + } elseif (preg_match('/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+:(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/', $token) && !preg_match("/[0-9]/", $this->lookAhead)) { + // if it's a range A1:A2 or $A$1:$A$2 + return $token; + } elseif (preg_match("/^" . self::REGEX_SHEET_TITLE_UNQUOTED . "(\:" . self::REGEX_SHEET_TITLE_UNQUOTED . ")?\!\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+:\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+$/u", $token) and !preg_match("/[0-9]/", $this->lookAhead)) { + // If it's an external range like Sheet1!A1:B2 or Sheet1:Sheet2!A1:B2 or Sheet1!$A$1:$B$2 or Sheet1:Sheet2!$A$1:$B$2 + return $token; + } elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . "(\:" . self::REGEX_SHEET_TITLE_QUOTED . ")?'\!\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+:\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+$/u", $token) and !preg_match("/[0-9]/", $this->lookAhead)) { + // If it's an external range like 'Sheet1'!A1:B2 or 'Sheet1:Sheet2'!A1:B2 or 'Sheet1'!$A$1:$B$2 or 'Sheet1:Sheet2'!$A$1:$B$2 + return $token; + } elseif (is_numeric($token) and (!is_numeric($token.$this->lookAhead) or ($this->lookAhead == '')) and ($this->lookAhead != '!') and ($this->lookAhead != ':')) { + // If it's a number (check that it's not a sheet name or range) + return $token; + } elseif (preg_match("/\"([^\"]|\"\"){0,255}\"/", $token) and $this->lookAhead != '"' and (substr_count($token, '"')%2 == 0)) { + // If it's a string (of maximum 255 characters) + return $token; + } elseif (preg_match("/^#[A-Z0\/]{3,5}[!?]{1}$/", $token) or $token == '#N/A') { + // If it's an error code + return $token; + } elseif (preg_match("/^[A-Z0-9\xc0-\xdc\.]+$/i", $token) and ($this->lookAhead == "(")) { + // if it's a function call + return $token; + } elseif (substr($token, -1) == ')') { + // It's an argument of some description (e.g. a named range), + // precise nature yet to be determined + return $token; + } + return ''; + } + } + + /** + * The parsing method. It parses a formula. + * + * @access public + * @param string $formula The formula to parse, without the initial equal + * sign (=). + * @return mixed true on success + */ + public function parse($formula) + { + $this->currentCharacter = 0; + $this->formula = $formula; + $this->lookAhead = isset($formula{1}) ? $formula{1} : ''; + $this->advance(); + $this->parseTree = $this->condition(); + return true; + } + + /** + * It parses a condition. It assumes the following rule: + * Cond -> Expr [(">" | "<") Expr] + * + * @access private + * @return mixed The parsed ptg'd tree on success + */ + private function condition() + { + $result = $this->expression(); + if ($this->currentToken == "<") { + $this->advance(); + $result2 = $this->expression(); + $result = $this->createTree('ptgLT', $result, $result2); + } elseif ($this->currentToken == ">") { + $this->advance(); + $result2 = $this->expression(); + $result = $this->createTree('ptgGT', $result, $result2); + } elseif ($this->currentToken == "<=") { + $this->advance(); + $result2 = $this->expression(); + $result = $this->createTree('ptgLE', $result, $result2); + } elseif ($this->currentToken == ">=") { + $this->advance(); + $result2 = $this->expression(); + $result = $this->createTree('ptgGE', $result, $result2); + } elseif ($this->currentToken == "=") { + $this->advance(); + $result2 = $this->expression(); + $result = $this->createTree('ptgEQ', $result, $result2); + } elseif ($this->currentToken == "<>") { + $this->advance(); + $result2 = $this->expression(); + $result = $this->createTree('ptgNE', $result, $result2); + } elseif ($this->currentToken == "&") { + $this->advance(); + $result2 = $this->expression(); + $result = $this->createTree('ptgConcat', $result, $result2); + } + return $result; + } + + /** + * It parses a expression. It assumes the following rule: + * Expr -> Term [("+" | "-") Term] + * -> "string" + * -> "-" Term : Negative value + * -> "+" Term : Positive value + * -> Error code + * + * @access private + * @return mixed The parsed ptg'd tree on success + */ + private function expression() + { + // If it's a string return a string node + if (preg_match("/\"([^\"]|\"\"){0,255}\"/", $this->currentToken)) { + $tmp = str_replace('""', '"', $this->currentToken); + if (($tmp == '"') || ($tmp == '')) { + // Trap for "" that has been used for an empty string + $tmp = '""'; + } + $result = $this->createTree($tmp, '', ''); + $this->advance(); + return $result; + // If it's an error code + } elseif (preg_match("/^#[A-Z0\/]{3,5}[!?]{1}$/", $this->currentToken) or $this->currentToken == '#N/A') { + $result = $this->createTree($this->currentToken, 'ptgErr', ''); + $this->advance(); + return $result; + // If it's a negative value + } elseif ($this->currentToken == "-") { + // catch "-" Term + $this->advance(); + $result2 = $this->expression(); + $result = $this->createTree('ptgUminus', $result2, ''); + return $result; + // If it's a positive value + } elseif ($this->currentToken == "+") { + // catch "+" Term + $this->advance(); + $result2 = $this->expression(); + $result = $this->createTree('ptgUplus', $result2, ''); + return $result; + } + $result = $this->term(); + while (($this->currentToken == "+") or + ($this->currentToken == "-") or + ($this->currentToken == "^")) { + /**/ + if ($this->currentToken == "+") { + $this->advance(); + $result2 = $this->term(); + $result = $this->createTree('ptgAdd', $result, $result2); + } elseif ($this->currentToken == "-") { + $this->advance(); + $result2 = $this->term(); + $result = $this->createTree('ptgSub', $result, $result2); + } else { + $this->advance(); + $result2 = $this->term(); + $result = $this->createTree('ptgPower', $result, $result2); + } + } + return $result; + } + + /** + * This function just introduces a ptgParen element in the tree, so that Excel + * doesn't get confused when working with a parenthesized formula afterwards. + * + * @access private + * @see fact() + * @return array The parsed ptg'd tree + */ + private function parenthesizedExpression() + { + $result = $this->createTree('ptgParen', $this->expression(), ''); + return $result; + } + + /** + * It parses a term. It assumes the following rule: + * Term -> Fact [("*" | "/") Fact] + * + * @access private + * @return mixed The parsed ptg'd tree on success + */ + private function term() + { + $result = $this->fact(); + while (($this->currentToken == "*") or + ($this->currentToken == "/")) { + /**/ + if ($this->currentToken == "*") { + $this->advance(); + $result2 = $this->fact(); + $result = $this->createTree('ptgMul', $result, $result2); + } else { + $this->advance(); + $result2 = $this->fact(); + $result = $this->createTree('ptgDiv', $result, $result2); + } + } + return $result; + } + + /** + * It parses a factor. It assumes the following rule: + * Fact -> ( Expr ) + * | CellRef + * | CellRange + * | Number + * | Function + * + * @access private + * @return mixed The parsed ptg'd tree on success + */ + private function fact() + { + if ($this->currentToken == "(") { + $this->advance(); // eat the "(" + $result = $this->parenthesizedExpression(); + if ($this->currentToken != ")") { + throw new PHPExcel_Writer_Exception("')' token expected."); + } + $this->advance(); // eat the ")" + return $result; + } + // if it's a reference + if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?[0-9]+$/', $this->currentToken)) { + $result = $this->createTree($this->currentToken, '', ''); + $this->advance(); + return $result; + } elseif (preg_match("/^" . self::REGEX_SHEET_TITLE_UNQUOTED . "(\:" . self::REGEX_SHEET_TITLE_UNQUOTED . ")?\!\\$?[A-Ia-i]?[A-Za-z]\\$?[0-9]+$/u", $this->currentToken)) { + // If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1 or Sheet1!$A$1 or Sheet1:Sheet2!$A$1) + $result = $this->createTree($this->currentToken, '', ''); + $this->advance(); + return $result; + } elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . "(\:" . self::REGEX_SHEET_TITLE_QUOTED . ")?'\!\\$?[A-Ia-i]?[A-Za-z]\\$?[0-9]+$/u", $this->currentToken)) { + // If it's an external reference ('Sheet1'!A1 or 'Sheet1:Sheet2'!A1 or 'Sheet1'!$A$1 or 'Sheet1:Sheet2'!$A$1) + $result = $this->createTree($this->currentToken, '', ''); + $this->advance(); + return $result; + } elseif (preg_match('/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+:(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/', $this->currentToken) or + preg_match('/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+\.\.(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/', $this->currentToken)) { + // if it's a range A1:B2 or $A$1:$B$2 + // must be an error? + $result = $this->createTree($this->currentToken, '', ''); + $this->advance(); + return $result; + } elseif (preg_match("/^" . self::REGEX_SHEET_TITLE_UNQUOTED . "(\:" . self::REGEX_SHEET_TITLE_UNQUOTED . ")?\!\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+:\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+$/u", $this->currentToken)) { + // If it's an external range (Sheet1!A1:B2 or Sheet1:Sheet2!A1:B2 or Sheet1!$A$1:$B$2 or Sheet1:Sheet2!$A$1:$B$2) + // must be an error? + //$result = $this->currentToken; + $result = $this->createTree($this->currentToken, '', ''); + $this->advance(); + return $result; + } elseif (preg_match("/^'" . self::REGEX_SHEET_TITLE_QUOTED . "(\:" . self::REGEX_SHEET_TITLE_QUOTED . ")?'\!\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+:\\$?([A-Ia-i]?[A-Za-z])?\\$?[0-9]+$/u", $this->currentToken)) { + // If it's an external range ('Sheet1'!A1:B2 or 'Sheet1'!A1:B2 or 'Sheet1'!$A$1:$B$2 or 'Sheet1'!$A$1:$B$2) + // must be an error? + //$result = $this->currentToken; + $result = $this->createTree($this->currentToken, '', ''); + $this->advance(); + return $result; + } elseif (is_numeric($this->currentToken)) { + // If it's a number or a percent + if ($this->lookAhead == '%') { + $result = $this->createTree('ptgPercent', $this->currentToken, ''); + $this->advance(); // Skip the percentage operator once we've pre-built that tree + } else { + $result = $this->createTree($this->currentToken, '', ''); + } + $this->advance(); + return $result; + } elseif (preg_match("/^[A-Z0-9\xc0-\xdc\.]+$/i", $this->currentToken)) { + // if it's a function call + $result = $this->func(); + return $result; + } + throw new PHPExcel_Writer_Exception("Syntax error: ".$this->currentToken.", lookahead: ".$this->lookAhead.", current char: ".$this->currentCharacter); + } + + /** + * It parses a function call. It assumes the following rule: + * Func -> ( Expr [,Expr]* ) + * + * @access private + * @return mixed The parsed ptg'd tree on success + */ + private function func() + { + $num_args = 0; // number of arguments received + $function = strtoupper($this->currentToken); + $result = ''; // initialize result + $this->advance(); + $this->advance(); // eat the "(" + while ($this->currentToken != ')') { + /**/ + if ($num_args > 0) { + if ($this->currentToken == "," || $this->currentToken == ";") { + $this->advance(); // eat the "," or ";" + } else { + throw new PHPExcel_Writer_Exception("Syntax error: comma expected in function $function, arg #{$num_args}"); + } + $result2 = $this->condition(); + $result = $this->createTree('arg', $result, $result2); + } else { // first argument + $result2 = $this->condition(); + $result = $this->createTree('arg', '', $result2); + } + ++$num_args; + } + if (!isset($this->functions[$function])) { + throw new PHPExcel_Writer_Exception("Function $function() doesn't exist"); + } + $args = $this->functions[$function][1]; + // If fixed number of args eg. TIME($i, $j, $k). Check that the number of args is valid. + if (($args >= 0) and ($args != $num_args)) { + throw new PHPExcel_Writer_Exception("Incorrect number of arguments in function $function() "); + } + + $result = $this->createTree($function, $result, $num_args); + $this->advance(); // eat the ")" + return $result; + } + + /** + * Creates a tree. In fact an array which may have one or two arrays (sub-trees) + * as elements. + * + * @access private + * @param mixed $value The value of this node. + * @param mixed $left The left array (sub-tree) or a final node. + * @param mixed $right The right array (sub-tree) or a final node. + * @return array A tree + */ + private function createTree($value, $left, $right) + { + return array('value' => $value, 'left' => $left, 'right' => $right); + } + + /** + * Builds a string containing the tree in reverse polish notation (What you + * would use in a HP calculator stack). + * The following tree: + * + * + + * / \ + * 2 3 + * + * produces: "23+" + * + * The following tree: + * + * + + * / \ + * 3 * + * / \ + * 6 A1 + * + * produces: "36A1*+" + * + * In fact all operands, functions, references, etc... are written as ptg's + * + * @access public + * @param array $tree The optional tree to convert. + * @return string The tree in reverse polish notation + */ + public function toReversePolish($tree = array()) + { + $polish = ""; // the string we are going to return + if (empty($tree)) { // If it's the first call use parseTree + $tree = $this->parseTree; + } + + if (is_array($tree['left'])) { + $converted_tree = $this->toReversePolish($tree['left']); + $polish .= $converted_tree; + } elseif ($tree['left'] != '') { // It's a final node + $converted_tree = $this->convert($tree['left']); + $polish .= $converted_tree; + } + if (is_array($tree['right'])) { + $converted_tree = $this->toReversePolish($tree['right']); + $polish .= $converted_tree; + } elseif ($tree['right'] != '') { // It's a final node + $converted_tree = $this->convert($tree['right']); + $polish .= $converted_tree; + } + // if it's a function convert it here (so we can set it's arguments) + if (preg_match("/^[A-Z0-9\xc0-\xdc\.]+$/", $tree['value']) and + !preg_match('/^([A-Ia-i]?[A-Za-z])(\d+)$/', $tree['value']) and + !preg_match("/^[A-Ia-i]?[A-Za-z](\d+)\.\.[A-Ia-i]?[A-Za-z](\d+)$/", $tree['value']) and + !is_numeric($tree['value']) and + !isset($this->ptg[$tree['value']])) { + // left subtree for a function is always an array. + if ($tree['left'] != '') { + $left_tree = $this->toReversePolish($tree['left']); + } else { + $left_tree = ''; + } + // add it's left subtree and return. + return $left_tree.$this->convertFunction($tree['value'], $tree['right']); + } else { + $converted_tree = $this->convert($tree['value']); + } + $polish .= $converted_tree; + return $polish; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel5/Workbook.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel5/Workbook.php new file mode 100644 index 0000000..8b06843 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel5/Workbook.php @@ -0,0 +1,1444 @@ +<?php + +/** + * PHPExcel_Writer_Excel5_Workbook + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ + +// Original file header of PEAR::Spreadsheet_Excel_Writer_Workbook (used as the base for this class): +// ----------------------------------------------------------------------------------------- +// /* +// * Module written/ported by Xavier Noguer <xnoguer@rezebra.com> +// * +// * The majority of this is _NOT_ my code. I simply ported it from the +// * PERL Spreadsheet::WriteExcel module. +// * +// * The author of the Spreadsheet::WriteExcel module is John McNamara +// * <jmcnamara@cpan.org> +// * +// * I _DO_ maintain this code, and John McNamara has nothing to do with the +// * porting of this code to PHP. Any questions directly related to this +// * class library should be directed to me. +// * +// * License Information: +// * +// * Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +// * Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +// * +// * This library is free software; you can redistribute it and/or +// * modify it under the terms of the GNU Lesser General Public +// * License as published by the Free Software Foundation; either +// * version 2.1 of the License, or (at your option) any later version. +// * +// * This library is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// * Lesser General Public License for more details. +// * +// * You should have received a copy of the GNU Lesser General Public +// * License along with this library; if not, write to the Free Software +// * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// */ +class PHPExcel_Writer_Excel5_Workbook extends PHPExcel_Writer_Excel5_BIFFwriter +{ + /** + * Formula parser + * + * @var PHPExcel_Writer_Excel5_Parser + */ + private $parser; + + /** + * The BIFF file size for the workbook. + * @var integer + * @see calcSheetOffsets() + */ + private $biffSize; + + /** + * XF Writers + * @var PHPExcel_Writer_Excel5_Xf[] + */ + private $xfWriters = array(); + + /** + * Array containing the colour palette + * @var array + */ + private $palette; + + /** + * The codepage indicates the text encoding used for strings + * @var integer + */ + private $codepage; + + /** + * The country code used for localization + * @var integer + */ + private $countryCode; + + /** + * Workbook + * @var PHPExcel + */ + private $phpExcel; + + /** + * Fonts writers + * + * @var PHPExcel_Writer_Excel5_Font[] + */ + private $fontWriters = array(); + + /** + * Added fonts. Maps from font's hash => index in workbook + * + * @var array + */ + private $addedFonts = array(); + + /** + * Shared number formats + * + * @var array + */ + private $numberFormats = array(); + + /** + * Added number formats. Maps from numberFormat's hash => index in workbook + * + * @var array + */ + private $addedNumberFormats = array(); + + /** + * Sizes of the binary worksheet streams + * + * @var array + */ + private $worksheetSizes = array(); + + /** + * Offsets of the binary worksheet streams relative to the start of the global workbook stream + * + * @var array + */ + private $worksheetOffsets = array(); + + /** + * Total number of shared strings in workbook + * + * @var int + */ + private $stringTotal; + + /** + * Number of unique shared strings in workbook + * + * @var int + */ + private $stringUnique; + + /** + * Array of unique shared strings in workbook + * + * @var array + */ + private $stringTable; + + /** + * Color cache + */ + private $colors; + + /** + * Escher object corresponding to MSODRAWINGGROUP + * + * @var PHPExcel_Shared_Escher + */ + private $escher; + + + /** + * Class constructor + * + * @param PHPExcel $phpExcel The Workbook + * @param int &$str_total Total number of strings + * @param int &$str_unique Total number of unique strings + * @param array &$str_table String Table + * @param array &$colors Colour Table + * @param mixed $parser The formula parser created for the Workbook + */ + public function __construct(PHPExcel $phpExcel = null, &$str_total, &$str_unique, &$str_table, &$colors, $parser) + { + // It needs to call its parent's constructor explicitly + parent::__construct(); + + $this->parser = $parser; + $this->biffSize = 0; + $this->palette = array(); + $this->countryCode = -1; + + $this->stringTotal = &$str_total; + $this->stringUnique = &$str_unique; + $this->stringTable = &$str_table; + $this->colors = &$colors; + $this->setPaletteXl97(); + + $this->phpExcel = $phpExcel; + + // set BIFFwriter limit for CONTINUE records + // $this->_limit = 8224; + $this->codepage = 0x04B0; + + // Add empty sheets and Build color cache + $countSheets = $phpExcel->getSheetCount(); + for ($i = 0; $i < $countSheets; ++$i) { + $phpSheet = $phpExcel->getSheet($i); + + $this->parser->setExtSheet($phpSheet->getTitle(), $i); // Register worksheet name with parser + + $supbook_index = 0x00; + $ref = pack('vvv', $supbook_index, $i, $i); + $this->parser->references[] = $ref; // Register reference with parser + + // Sheet tab colors? + if ($phpSheet->isTabColorSet()) { + $this->addColor($phpSheet->getTabColor()->getRGB()); + } + } + + } + + /** + * Add a new XF writer + * + * @param PHPExcel_Style + * @param boolean Is it a style XF? + * @return int Index to XF record + */ + public function addXfWriter($style, $isStyleXf = false) + { + $xfWriter = new PHPExcel_Writer_Excel5_Xf($style); + $xfWriter->setIsStyleXf($isStyleXf); + + // Add the font if not already added + $fontIndex = $this->addFont($style->getFont()); + + // Assign the font index to the xf record + $xfWriter->setFontIndex($fontIndex); + + // Background colors, best to treat these after the font so black will come after white in custom palette + $xfWriter->setFgColor($this->addColor($style->getFill()->getStartColor()->getRGB())); + $xfWriter->setBgColor($this->addColor($style->getFill()->getEndColor()->getRGB())); + $xfWriter->setBottomColor($this->addColor($style->getBorders()->getBottom()->getColor()->getRGB())); + $xfWriter->setTopColor($this->addColor($style->getBorders()->getTop()->getColor()->getRGB())); + $xfWriter->setRightColor($this->addColor($style->getBorders()->getRight()->getColor()->getRGB())); + $xfWriter->setLeftColor($this->addColor($style->getBorders()->getLeft()->getColor()->getRGB())); + $xfWriter->setDiagColor($this->addColor($style->getBorders()->getDiagonal()->getColor()->getRGB())); + + // Add the number format if it is not a built-in one and not already added + if ($style->getNumberFormat()->getBuiltInFormatCode() === false) { + $numberFormatHashCode = $style->getNumberFormat()->getHashCode(); + + if (isset($this->addedNumberFormats[$numberFormatHashCode])) { + $numberFormatIndex = $this->addedNumberFormats[$numberFormatHashCode]; + } else { + $numberFormatIndex = 164 + count($this->numberFormats); + $this->numberFormats[$numberFormatIndex] = $style->getNumberFormat(); + $this->addedNumberFormats[$numberFormatHashCode] = $numberFormatIndex; + } + } else { + $numberFormatIndex = (int) $style->getNumberFormat()->getBuiltInFormatCode(); + } + + // Assign the number format index to xf record + $xfWriter->setNumberFormatIndex($numberFormatIndex); + + $this->xfWriters[] = $xfWriter; + + $xfIndex = count($this->xfWriters) - 1; + return $xfIndex; + } + + /** + * Add a font to added fonts + * + * @param PHPExcel_Style_Font $font + * @return int Index to FONT record + */ + public function addFont(PHPExcel_Style_Font $font) + { + $fontHashCode = $font->getHashCode(); + if (isset($this->addedFonts[$fontHashCode])) { + $fontIndex = $this->addedFonts[$fontHashCode]; + } else { + $countFonts = count($this->fontWriters); + $fontIndex = ($countFonts < 4) ? $countFonts : $countFonts + 1; + + $fontWriter = new PHPExcel_Writer_Excel5_Font($font); + $fontWriter->setColorIndex($this->addColor($font->getColor()->getRGB())); + $this->fontWriters[] = $fontWriter; + + $this->addedFonts[$fontHashCode] = $fontIndex; + } + return $fontIndex; + } + + /** + * Alter color palette adding a custom color + * + * @param string $rgb E.g. 'FF00AA' + * @return int Color index + */ + private function addColor($rgb) + { + if (!isset($this->colors[$rgb])) { + if (count($this->colors) < 57) { + // then we add a custom color altering the palette + $colorIndex = 8 + count($this->colors); + $this->palette[$colorIndex] = + array( + hexdec(substr($rgb, 0, 2)), + hexdec(substr($rgb, 2, 2)), + hexdec(substr($rgb, 4)), + 0 + ); + $this->colors[$rgb] = $colorIndex; + } else { + // no room for more custom colors, just map to black + $colorIndex = 0; + } + } else { + // fetch already added custom color + $colorIndex = $this->colors[$rgb]; + } + + return $colorIndex; + } + + /** + * Sets the colour palette to the Excel 97+ default. + * + * @access private + */ + private function setPaletteXl97() + { + $this->palette = array( + 0x08 => array(0x00, 0x00, 0x00, 0x00), + 0x09 => array(0xff, 0xff, 0xff, 0x00), + 0x0A => array(0xff, 0x00, 0x00, 0x00), + 0x0B => array(0x00, 0xff, 0x00, 0x00), + 0x0C => array(0x00, 0x00, 0xff, 0x00), + 0x0D => array(0xff, 0xff, 0x00, 0x00), + 0x0E => array(0xff, 0x00, 0xff, 0x00), + 0x0F => array(0x00, 0xff, 0xff, 0x00), + 0x10 => array(0x80, 0x00, 0x00, 0x00), + 0x11 => array(0x00, 0x80, 0x00, 0x00), + 0x12 => array(0x00, 0x00, 0x80, 0x00), + 0x13 => array(0x80, 0x80, 0x00, 0x00), + 0x14 => array(0x80, 0x00, 0x80, 0x00), + 0x15 => array(0x00, 0x80, 0x80, 0x00), + 0x16 => array(0xc0, 0xc0, 0xc0, 0x00), + 0x17 => array(0x80, 0x80, 0x80, 0x00), + 0x18 => array(0x99, 0x99, 0xff, 0x00), + 0x19 => array(0x99, 0x33, 0x66, 0x00), + 0x1A => array(0xff, 0xff, 0xcc, 0x00), + 0x1B => array(0xcc, 0xff, 0xff, 0x00), + 0x1C => array(0x66, 0x00, 0x66, 0x00), + 0x1D => array(0xff, 0x80, 0x80, 0x00), + 0x1E => array(0x00, 0x66, 0xcc, 0x00), + 0x1F => array(0xcc, 0xcc, 0xff, 0x00), + 0x20 => array(0x00, 0x00, 0x80, 0x00), + 0x21 => array(0xff, 0x00, 0xff, 0x00), + 0x22 => array(0xff, 0xff, 0x00, 0x00), + 0x23 => array(0x00, 0xff, 0xff, 0x00), + 0x24 => array(0x80, 0x00, 0x80, 0x00), + 0x25 => array(0x80, 0x00, 0x00, 0x00), + 0x26 => array(0x00, 0x80, 0x80, 0x00), + 0x27 => array(0x00, 0x00, 0xff, 0x00), + 0x28 => array(0x00, 0xcc, 0xff, 0x00), + 0x29 => array(0xcc, 0xff, 0xff, 0x00), + 0x2A => array(0xcc, 0xff, 0xcc, 0x00), + 0x2B => array(0xff, 0xff, 0x99, 0x00), + 0x2C => array(0x99, 0xcc, 0xff, 0x00), + 0x2D => array(0xff, 0x99, 0xcc, 0x00), + 0x2E => array(0xcc, 0x99, 0xff, 0x00), + 0x2F => array(0xff, 0xcc, 0x99, 0x00), + 0x30 => array(0x33, 0x66, 0xff, 0x00), + 0x31 => array(0x33, 0xcc, 0xcc, 0x00), + 0x32 => array(0x99, 0xcc, 0x00, 0x00), + 0x33 => array(0xff, 0xcc, 0x00, 0x00), + 0x34 => array(0xff, 0x99, 0x00, 0x00), + 0x35 => array(0xff, 0x66, 0x00, 0x00), + 0x36 => array(0x66, 0x66, 0x99, 0x00), + 0x37 => array(0x96, 0x96, 0x96, 0x00), + 0x38 => array(0x00, 0x33, 0x66, 0x00), + 0x39 => array(0x33, 0x99, 0x66, 0x00), + 0x3A => array(0x00, 0x33, 0x00, 0x00), + 0x3B => array(0x33, 0x33, 0x00, 0x00), + 0x3C => array(0x99, 0x33, 0x00, 0x00), + 0x3D => array(0x99, 0x33, 0x66, 0x00), + 0x3E => array(0x33, 0x33, 0x99, 0x00), + 0x3F => array(0x33, 0x33, 0x33, 0x00), + ); + } + + /** + * Assemble worksheets into a workbook and send the BIFF data to an OLE + * storage. + * + * @param array $pWorksheetSizes The sizes in bytes of the binary worksheet streams + * @return string Binary data for workbook stream + */ + public function writeWorkbook($pWorksheetSizes = null) + { + $this->worksheetSizes = $pWorksheetSizes; + + // Calculate the number of selected worksheet tabs and call the finalization + // methods for each worksheet + $total_worksheets = $this->phpExcel->getSheetCount(); + + // Add part 1 of the Workbook globals, what goes before the SHEET records + $this->storeBof(0x0005); + $this->writeCodepage(); + $this->writeWindow1(); + + $this->writeDateMode(); + $this->writeAllFonts(); + $this->writeAllNumberFormats(); + $this->writeAllXfs(); + $this->writeAllStyles(); + $this->writePalette(); + + // Prepare part 3 of the workbook global stream, what goes after the SHEET records + $part3 = ''; + if ($this->countryCode != -1) { + $part3 .= $this->writeCountry(); + } + $part3 .= $this->writeRecalcId(); + + $part3 .= $this->writeSupbookInternal(); + /* TODO: store external SUPBOOK records and XCT and CRN records + in case of external references for BIFF8 */ + $part3 .= $this->writeExternalsheetBiff8(); + $part3 .= $this->writeAllDefinedNamesBiff8(); + $part3 .= $this->writeMsoDrawingGroup(); + $part3 .= $this->writeSharedStringsTable(); + + $part3 .= $this->writeEof(); + + // Add part 2 of the Workbook globals, the SHEET records + $this->calcSheetOffsets(); + for ($i = 0; $i < $total_worksheets; ++$i) { + $this->writeBoundSheet($this->phpExcel->getSheet($i), $this->worksheetOffsets[$i]); + } + + // Add part 3 of the Workbook globals + $this->_data .= $part3; + + return $this->_data; + } + + /** + * Calculate offsets for Worksheet BOF records. + * + * @access private + */ + private function calcSheetOffsets() + { + $boundsheet_length = 10; // fixed length for a BOUNDSHEET record + + // size of Workbook globals part 1 + 3 + $offset = $this->_datasize; + + // add size of Workbook globals part 2, the length of the SHEET records + $total_worksheets = count($this->phpExcel->getAllSheets()); + foreach ($this->phpExcel->getWorksheetIterator() as $sheet) { + $offset += $boundsheet_length + strlen(PHPExcel_Shared_String::UTF8toBIFF8UnicodeShort($sheet->getTitle())); + } + + // add the sizes of each of the Sheet substreams, respectively + for ($i = 0; $i < $total_worksheets; ++$i) { + $this->worksheetOffsets[$i] = $offset; + $offset += $this->worksheetSizes[$i]; + } + $this->biffSize = $offset; + } + + /** + * Store the Excel FONT records. + */ + private function writeAllFonts() + { + foreach ($this->fontWriters as $fontWriter) { + $this->append($fontWriter->writeFont()); + } + } + + /** + * Store user defined numerical formats i.e. FORMAT records + */ + private function writeAllNumberFormats() + { + foreach ($this->numberFormats as $numberFormatIndex => $numberFormat) { + $this->writeNumberFormat($numberFormat->getFormatCode(), $numberFormatIndex); + } + } + + /** + * Write all XF records. + */ + private function writeAllXfs() + { + foreach ($this->xfWriters as $xfWriter) { + $this->append($xfWriter->writeXf()); + } + } + + /** + * Write all STYLE records. + */ + private function writeAllStyles() + { + $this->writeStyle(); + } + + /** + * Write the EXTERNCOUNT and EXTERNSHEET records. These are used as indexes for + * the NAME records. + */ + private function writeExternals() + { + $countSheets = $this->phpExcel->getSheetCount(); + // Create EXTERNCOUNT with number of worksheets + $this->writeExternalCount($countSheets); + + // Create EXTERNSHEET for each worksheet + for ($i = 0; $i < $countSheets; ++$i) { + $this->writeExternalSheet($this->phpExcel->getSheet($i)->getTitle()); + } + } + + /** + * Write the NAME record to define the print area and the repeat rows and cols. + */ + private function writeNames() + { + // total number of sheets + $total_worksheets = $this->phpExcel->getSheetCount(); + + // Create the print area NAME records + for ($i = 0; $i < $total_worksheets; ++$i) { + $sheetSetup = $this->phpExcel->getSheet($i)->getPageSetup(); + // Write a Name record if the print area has been defined + if ($sheetSetup->isPrintAreaSet()) { + // Print area + $printArea = PHPExcel_Cell::splitRange($sheetSetup->getPrintArea()); + $printArea = $printArea[0]; + $printArea[0] = PHPExcel_Cell::coordinateFromString($printArea[0]); + $printArea[1] = PHPExcel_Cell::coordinateFromString($printArea[1]); + + $print_rowmin = $printArea[0][1] - 1; + $print_rowmax = $printArea[1][1] - 1; + $print_colmin = PHPExcel_Cell::columnIndexFromString($printArea[0][0]) - 1; + $print_colmax = PHPExcel_Cell::columnIndexFromString($printArea[1][0]) - 1; + + $this->writeNameShort( + $i, // sheet index + 0x06, // NAME type + $print_rowmin, + $print_rowmax, + $print_colmin, + $print_colmax + ); + } + } + + // Create the print title NAME records + for ($i = 0; $i < $total_worksheets; ++$i) { + $sheetSetup = $this->phpExcel->getSheet($i)->getPageSetup(); + + // simultaneous repeatColumns repeatRows + if ($sheetSetup->isColumnsToRepeatAtLeftSet() && $sheetSetup->isRowsToRepeatAtTopSet()) { + $repeat = $sheetSetup->getColumnsToRepeatAtLeft(); + $colmin = PHPExcel_Cell::columnIndexFromString($repeat[0]) - 1; + $colmax = PHPExcel_Cell::columnIndexFromString($repeat[1]) - 1; + + $repeat = $sheetSetup->getRowsToRepeatAtTop(); + $rowmin = $repeat[0] - 1; + $rowmax = $repeat[1] - 1; + + $this->writeNameLong( + $i, // sheet index + 0x07, // NAME type + $rowmin, + $rowmax, + $colmin, + $colmax + ); + + // (exclusive) either repeatColumns or repeatRows + } elseif ($sheetSetup->isColumnsToRepeatAtLeftSet() || $sheetSetup->isRowsToRepeatAtTopSet()) { + // Columns to repeat + if ($sheetSetup->isColumnsToRepeatAtLeftSet()) { + $repeat = $sheetSetup->getColumnsToRepeatAtLeft(); + $colmin = PHPExcel_Cell::columnIndexFromString($repeat[0]) - 1; + $colmax = PHPExcel_Cell::columnIndexFromString($repeat[1]) - 1; + } else { + $colmin = 0; + $colmax = 255; + } + + // Rows to repeat + if ($sheetSetup->isRowsToRepeatAtTopSet()) { + $repeat = $sheetSetup->getRowsToRepeatAtTop(); + $rowmin = $repeat[0] - 1; + $rowmax = $repeat[1] - 1; + } else { + $rowmin = 0; + $rowmax = 65535; + } + + $this->writeNameShort( + $i, // sheet index + 0x07, // NAME type + $rowmin, + $rowmax, + $colmin, + $colmax + ); + } + } + } + + /** + * Writes all the DEFINEDNAME records (BIFF8). + * So far this is only used for repeating rows/columns (print titles) and print areas + */ + private function writeAllDefinedNamesBiff8() + { + $chunk = ''; + + // Named ranges + if (count($this->phpExcel->getNamedRanges()) > 0) { + // Loop named ranges + $namedRanges = $this->phpExcel->getNamedRanges(); + foreach ($namedRanges as $namedRange) { + // Create absolute coordinate + $range = PHPExcel_Cell::splitRange($namedRange->getRange()); + for ($i = 0; $i < count($range); $i++) { + $range[$i][0] = '\'' . str_replace("'", "''", $namedRange->getWorksheet()->getTitle()) . '\'!' . PHPExcel_Cell::absoluteCoordinate($range[$i][0]); + if (isset($range[$i][1])) { + $range[$i][1] = PHPExcel_Cell::absoluteCoordinate($range[$i][1]); + } + } + $range = PHPExcel_Cell::buildRange($range); // e.g. Sheet1!$A$1:$B$2 + + // parse formula + try { + $error = $this->parser->parse($range); + $formulaData = $this->parser->toReversePolish(); + + // make sure tRef3d is of type tRef3dR (0x3A) + if (isset($formulaData{0}) and ($formulaData{0} == "\x7A" or $formulaData{0} == "\x5A")) { + $formulaData = "\x3A" . substr($formulaData, 1); + } + + if ($namedRange->getLocalOnly()) { + // local scope + $scope = $this->phpExcel->getIndex($namedRange->getScope()) + 1; + } else { + // global scope + $scope = 0; + } + $chunk .= $this->writeData($this->writeDefinedNameBiff8($namedRange->getName(), $formulaData, $scope, false)); + + } catch (PHPExcel_Exception $e) { + // do nothing + } + } + } + + // total number of sheets + $total_worksheets = $this->phpExcel->getSheetCount(); + + // write the print titles (repeating rows, columns), if any + for ($i = 0; $i < $total_worksheets; ++$i) { + $sheetSetup = $this->phpExcel->getSheet($i)->getPageSetup(); + // simultaneous repeatColumns repeatRows + if ($sheetSetup->isColumnsToRepeatAtLeftSet() && $sheetSetup->isRowsToRepeatAtTopSet()) { + $repeat = $sheetSetup->getColumnsToRepeatAtLeft(); + $colmin = PHPExcel_Cell::columnIndexFromString($repeat[0]) - 1; + $colmax = PHPExcel_Cell::columnIndexFromString($repeat[1]) - 1; + + $repeat = $sheetSetup->getRowsToRepeatAtTop(); + $rowmin = $repeat[0] - 1; + $rowmax = $repeat[1] - 1; + + // construct formula data manually + $formulaData = pack('Cv', 0x29, 0x17); // tMemFunc + $formulaData .= pack('Cvvvvv', 0x3B, $i, 0, 65535, $colmin, $colmax); // tArea3d + $formulaData .= pack('Cvvvvv', 0x3B, $i, $rowmin, $rowmax, 0, 255); // tArea3d + $formulaData .= pack('C', 0x10); // tList + + // store the DEFINEDNAME record + $chunk .= $this->writeData($this->writeDefinedNameBiff8(pack('C', 0x07), $formulaData, $i + 1, true)); + + // (exclusive) either repeatColumns or repeatRows + } elseif ($sheetSetup->isColumnsToRepeatAtLeftSet() || $sheetSetup->isRowsToRepeatAtTopSet()) { + // Columns to repeat + if ($sheetSetup->isColumnsToRepeatAtLeftSet()) { + $repeat = $sheetSetup->getColumnsToRepeatAtLeft(); + $colmin = PHPExcel_Cell::columnIndexFromString($repeat[0]) - 1; + $colmax = PHPExcel_Cell::columnIndexFromString($repeat[1]) - 1; + } else { + $colmin = 0; + $colmax = 255; + } + // Rows to repeat + if ($sheetSetup->isRowsToRepeatAtTopSet()) { + $repeat = $sheetSetup->getRowsToRepeatAtTop(); + $rowmin = $repeat[0] - 1; + $rowmax = $repeat[1] - 1; + } else { + $rowmin = 0; + $rowmax = 65535; + } + + // construct formula data manually because parser does not recognize absolute 3d cell references + $formulaData = pack('Cvvvvv', 0x3B, $i, $rowmin, $rowmax, $colmin, $colmax); + + // store the DEFINEDNAME record + $chunk .= $this->writeData($this->writeDefinedNameBiff8(pack('C', 0x07), $formulaData, $i + 1, true)); + } + } + + // write the print areas, if any + for ($i = 0; $i < $total_worksheets; ++$i) { + $sheetSetup = $this->phpExcel->getSheet($i)->getPageSetup(); + if ($sheetSetup->isPrintAreaSet()) { + // Print area, e.g. A3:J6,H1:X20 + $printArea = PHPExcel_Cell::splitRange($sheetSetup->getPrintArea()); + $countPrintArea = count($printArea); + + $formulaData = ''; + for ($j = 0; $j < $countPrintArea; ++$j) { + $printAreaRect = $printArea[$j]; // e.g. A3:J6 + $printAreaRect[0] = PHPExcel_Cell::coordinateFromString($printAreaRect[0]); + $printAreaRect[1] = PHPExcel_Cell::coordinateFromString($printAreaRect[1]); + + $print_rowmin = $printAreaRect[0][1] - 1; + $print_rowmax = $printAreaRect[1][1] - 1; + $print_colmin = PHPExcel_Cell::columnIndexFromString($printAreaRect[0][0]) - 1; + $print_colmax = PHPExcel_Cell::columnIndexFromString($printAreaRect[1][0]) - 1; + + // construct formula data manually because parser does not recognize absolute 3d cell references + $formulaData .= pack('Cvvvvv', 0x3B, $i, $print_rowmin, $print_rowmax, $print_colmin, $print_colmax); + + if ($j > 0) { + $formulaData .= pack('C', 0x10); // list operator token ',' + } + } + + // store the DEFINEDNAME record + $chunk .= $this->writeData($this->writeDefinedNameBiff8(pack('C', 0x06), $formulaData, $i + 1, true)); + } + } + + // write autofilters, if any + for ($i = 0; $i < $total_worksheets; ++$i) { + $sheetAutoFilter = $this->phpExcel->getSheet($i)->getAutoFilter(); + $autoFilterRange = $sheetAutoFilter->getRange(); + if (!empty($autoFilterRange)) { + $rangeBounds = PHPExcel_Cell::rangeBoundaries($autoFilterRange); + + //Autofilter built in name + $name = pack('C', 0x0D); + + $chunk .= $this->writeData($this->writeShortNameBiff8($name, $i + 1, $rangeBounds, true)); + } + } + + return $chunk; + } + + /** + * Write a DEFINEDNAME record for BIFF8 using explicit binary formula data + * + * @param string $name The name in UTF-8 + * @param string $formulaData The binary formula data + * @param string $sheetIndex 1-based sheet index the defined name applies to. 0 = global + * @param boolean $isBuiltIn Built-in name? + * @return string Complete binary record data + */ + private function writeDefinedNameBiff8($name, $formulaData, $sheetIndex = 0, $isBuiltIn = false) + { + $record = 0x0018; + + // option flags + $options = $isBuiltIn ? 0x20 : 0x00; + + // length of the name, character count + $nlen = PHPExcel_Shared_String::CountCharacters($name); + + // name with stripped length field + $name = substr(PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($name), 2); + + // size of the formula (in bytes) + $sz = strlen($formulaData); + + // combine the parts + $data = pack('vCCvvvCCCC', $options, 0, $nlen, $sz, 0, $sheetIndex, 0, 0, 0, 0) + . $name . $formulaData; + $length = strlen($data); + + $header = pack('vv', $record, $length); + + return $header . $data; + } + + /** + * Write a short NAME record + * + * @param string $name + * @param string $sheetIndex 1-based sheet index the defined name applies to. 0 = global + * @param integer[][] $rangeBounds range boundaries + * @param boolean $isHidden + * @return string Complete binary record data + * */ + private function writeShortNameBiff8($name, $sheetIndex = 0, $rangeBounds, $isHidden = false) + { + $record = 0x0018; + + // option flags + $options = ($isHidden ? 0x21 : 0x00); + + $extra = pack( + 'Cvvvvv', + 0x3B, + $sheetIndex - 1, + $rangeBounds[0][1] - 1, + $rangeBounds[1][1] - 1, + $rangeBounds[0][0] - 1, + $rangeBounds[1][0] - 1 + ); + + // size of the formula (in bytes) + $sz = strlen($extra); + + // combine the parts + $data = pack('vCCvvvCCCCC', $options, 0, 1, $sz, 0, $sheetIndex, 0, 0, 0, 0, 0) + . $name . $extra; + $length = strlen($data); + + $header = pack('vv', $record, $length); + + return $header . $data; + } + + /** + * Stores the CODEPAGE biff record. + */ + private function writeCodepage() + { + $record = 0x0042; // Record identifier + $length = 0x0002; // Number of bytes to follow + $cv = $this->codepage; // The code page + + $header = pack('vv', $record, $length); + $data = pack('v', $cv); + + $this->append($header . $data); + } + + /** + * Write Excel BIFF WINDOW1 record. + */ + private function writeWindow1() + { + $record = 0x003D; // Record identifier + $length = 0x0012; // Number of bytes to follow + + $xWn = 0x0000; // Horizontal position of window + $yWn = 0x0000; // Vertical position of window + $dxWn = 0x25BC; // Width of window + $dyWn = 0x1572; // Height of window + + $grbit = 0x0038; // Option flags + + // not supported by PHPExcel, so there is only one selected sheet, the active + $ctabsel = 1; // Number of workbook tabs selected + + $wTabRatio = 0x0258; // Tab to scrollbar ratio + + // not supported by PHPExcel, set to 0 + $itabFirst = 0; // 1st displayed worksheet + $itabCur = $this->phpExcel->getActiveSheetIndex(); // Active worksheet + + $header = pack("vv", $record, $length); + $data = pack("vvvvvvvvv", $xWn, $yWn, $dxWn, $dyWn, $grbit, $itabCur, $itabFirst, $ctabsel, $wTabRatio); + $this->append($header . $data); + } + + /** + * Writes Excel BIFF BOUNDSHEET record. + * + * @param PHPExcel_Worksheet $sheet Worksheet name + * @param integer $offset Location of worksheet BOF + */ + private function writeBoundSheet($sheet, $offset) + { + $sheetname = $sheet->getTitle(); + $record = 0x0085; // Record identifier + + // sheet state + switch ($sheet->getSheetState()) { + case PHPExcel_Worksheet::SHEETSTATE_VISIBLE: + $ss = 0x00; + break; + case PHPExcel_Worksheet::SHEETSTATE_HIDDEN: + $ss = 0x01; + break; + case PHPExcel_Worksheet::SHEETSTATE_VERYHIDDEN: + $ss = 0x02; + break; + default: + $ss = 0x00; + break; + } + + // sheet type + $st = 0x00; + + $grbit = 0x0000; // Visibility and sheet type + + $data = pack("VCC", $offset, $ss, $st); + $data .= PHPExcel_Shared_String::UTF8toBIFF8UnicodeShort($sheetname); + + $length = strlen($data); + $header = pack("vv", $record, $length); + $this->append($header . $data); + } + + /** + * Write Internal SUPBOOK record + */ + private function writeSupbookInternal() + { + $record = 0x01AE; // Record identifier + $length = 0x0004; // Bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("vv", $this->phpExcel->getSheetCount(), 0x0401); + return $this->writeData($header . $data); + } + + /** + * Writes the Excel BIFF EXTERNSHEET record. These references are used by + * formulas. + * + */ + private function writeExternalsheetBiff8() + { + $totalReferences = count($this->parser->references); + $record = 0x0017; // Record identifier + $length = 2 + 6 * $totalReferences; // Number of bytes to follow + + $supbook_index = 0; // FIXME: only using internal SUPBOOK record + $header = pack("vv", $record, $length); + $data = pack('v', $totalReferences); + for ($i = 0; $i < $totalReferences; ++$i) { + $data .= $this->parser->references[$i]; + } + return $this->writeData($header . $data); + } + + /** + * Write Excel BIFF STYLE records. + */ + private function writeStyle() + { + $record = 0x0293; // Record identifier + $length = 0x0004; // Bytes to follow + + $ixfe = 0x8000; // Index to cell style XF + $BuiltIn = 0x00; // Built-in style + $iLevel = 0xff; // Outline style level + + $header = pack("vv", $record, $length); + $data = pack("vCC", $ixfe, $BuiltIn, $iLevel); + $this->append($header . $data); + } + + /** + * Writes Excel FORMAT record for non "built-in" numerical formats. + * + * @param string $format Custom format string + * @param integer $ifmt Format index code + */ + private function writeNumberFormat($format, $ifmt) + { + $record = 0x041E; // Record identifier + + $numberFormatString = PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($format); + $length = 2 + strlen($numberFormatString); // Number of bytes to follow + + + $header = pack("vv", $record, $length); + $data = pack("v", $ifmt) . $numberFormatString; + $this->append($header . $data); + } + + /** + * Write DATEMODE record to indicate the date system in use (1904 or 1900). + */ + private function writeDateMode() + { + $record = 0x0022; // Record identifier + $length = 0x0002; // Bytes to follow + + $f1904 = (PHPExcel_Shared_Date::getExcelCalendar() == PHPExcel_Shared_Date::CALENDAR_MAC_1904) + ? 1 + : 0; // Flag for 1904 date system + + $header = pack("vv", $record, $length); + $data = pack("v", $f1904); + $this->append($header . $data); + } + + /** + * Write BIFF record EXTERNCOUNT to indicate the number of external sheet + * references in the workbook. + * + * Excel only stores references to external sheets that are used in NAME. + * The workbook NAME record is required to define the print area and the repeat + * rows and columns. + * + * A similar method is used in Worksheet.php for a slightly different purpose. + * + * @param integer $cxals Number of external references + */ + private function writeExternalCount($cxals) + { + $record = 0x0016; // Record identifier + $length = 0x0002; // Number of bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("v", $cxals); + $this->append($header . $data); + } + + /** + * Writes the Excel BIFF EXTERNSHEET record. These references are used by + * formulas. NAME record is required to define the print area and the repeat + * rows and columns. + * + * A similar method is used in Worksheet.php for a slightly different purpose. + * + * @param string $sheetname Worksheet name + */ + private function writeExternalSheet($sheetname) + { + $record = 0x0017; // Record identifier + $length = 0x02 + strlen($sheetname); // Number of bytes to follow + + $cch = strlen($sheetname); // Length of sheet name + $rgch = 0x03; // Filename encoding + + $header = pack("vv", $record, $length); + $data = pack("CC", $cch, $rgch); + $this->append($header . $data . $sheetname); + } + + /** + * Store the NAME record in the short format that is used for storing the print + * area, repeat rows only and repeat columns only. + * + * @param integer $index Sheet index + * @param integer $type Built-in name type + * @param integer $rowmin Start row + * @param integer $rowmax End row + * @param integer $colmin Start colum + * @param integer $colmax End column + */ + private function writeNameShort($index, $type, $rowmin, $rowmax, $colmin, $colmax) + { + $record = 0x0018; // Record identifier + $length = 0x0024; // Number of bytes to follow + + $grbit = 0x0020; // Option flags + $chKey = 0x00; // Keyboard shortcut + $cch = 0x01; // Length of text name + $cce = 0x0015; // Length of text definition + $ixals = $index + 1; // Sheet index + $itab = $ixals; // Equal to ixals + $cchCustMenu = 0x00; // Length of cust menu text + $cchDescription = 0x00; // Length of description text + $cchHelptopic = 0x00; // Length of help topic text + $cchStatustext = 0x00; // Length of status bar text + $rgch = $type; // Built-in name type + + $unknown03 = 0x3b; + $unknown04 = 0xffff - $index; + $unknown05 = 0x0000; + $unknown06 = 0x0000; + $unknown07 = 0x1087; + $unknown08 = 0x8005; + + $header = pack("vv", $record, $length); + $data = pack("v", $grbit); + $data .= pack("C", $chKey); + $data .= pack("C", $cch); + $data .= pack("v", $cce); + $data .= pack("v", $ixals); + $data .= pack("v", $itab); + $data .= pack("C", $cchCustMenu); + $data .= pack("C", $cchDescription); + $data .= pack("C", $cchHelptopic); + $data .= pack("C", $cchStatustext); + $data .= pack("C", $rgch); + $data .= pack("C", $unknown03); + $data .= pack("v", $unknown04); + $data .= pack("v", $unknown05); + $data .= pack("v", $unknown06); + $data .= pack("v", $unknown07); + $data .= pack("v", $unknown08); + $data .= pack("v", $index); + $data .= pack("v", $index); + $data .= pack("v", $rowmin); + $data .= pack("v", $rowmax); + $data .= pack("C", $colmin); + $data .= pack("C", $colmax); + $this->append($header . $data); + } + + /** + * Store the NAME record in the long format that is used for storing the repeat + * rows and columns when both are specified. This shares a lot of code with + * writeNameShort() but we use a separate method to keep the code clean. + * Code abstraction for reuse can be carried too far, and I should know. ;-) + * + * @param integer $index Sheet index + * @param integer $type Built-in name type + * @param integer $rowmin Start row + * @param integer $rowmax End row + * @param integer $colmin Start colum + * @param integer $colmax End column + */ + private function writeNameLong($index, $type, $rowmin, $rowmax, $colmin, $colmax) + { + $record = 0x0018; // Record identifier + $length = 0x003d; // Number of bytes to follow + $grbit = 0x0020; // Option flags + $chKey = 0x00; // Keyboard shortcut + $cch = 0x01; // Length of text name + $cce = 0x002e; // Length of text definition + $ixals = $index + 1; // Sheet index + $itab = $ixals; // Equal to ixals + $cchCustMenu = 0x00; // Length of cust menu text + $cchDescription = 0x00; // Length of description text + $cchHelptopic = 0x00; // Length of help topic text + $cchStatustext = 0x00; // Length of status bar text + $rgch = $type; // Built-in name type + + $unknown01 = 0x29; + $unknown02 = 0x002b; + $unknown03 = 0x3b; + $unknown04 = 0xffff-$index; + $unknown05 = 0x0000; + $unknown06 = 0x0000; + $unknown07 = 0x1087; + $unknown08 = 0x8008; + + $header = pack("vv", $record, $length); + $data = pack("v", $grbit); + $data .= pack("C", $chKey); + $data .= pack("C", $cch); + $data .= pack("v", $cce); + $data .= pack("v", $ixals); + $data .= pack("v", $itab); + $data .= pack("C", $cchCustMenu); + $data .= pack("C", $cchDescription); + $data .= pack("C", $cchHelptopic); + $data .= pack("C", $cchStatustext); + $data .= pack("C", $rgch); + $data .= pack("C", $unknown01); + $data .= pack("v", $unknown02); + // Column definition + $data .= pack("C", $unknown03); + $data .= pack("v", $unknown04); + $data .= pack("v", $unknown05); + $data .= pack("v", $unknown06); + $data .= pack("v", $unknown07); + $data .= pack("v", $unknown08); + $data .= pack("v", $index); + $data .= pack("v", $index); + $data .= pack("v", 0x0000); + $data .= pack("v", 0x3fff); + $data .= pack("C", $colmin); + $data .= pack("C", $colmax); + // Row definition + $data .= pack("C", $unknown03); + $data .= pack("v", $unknown04); + $data .= pack("v", $unknown05); + $data .= pack("v", $unknown06); + $data .= pack("v", $unknown07); + $data .= pack("v", $unknown08); + $data .= pack("v", $index); + $data .= pack("v", $index); + $data .= pack("v", $rowmin); + $data .= pack("v", $rowmax); + $data .= pack("C", 0x00); + $data .= pack("C", 0xff); + // End of data + $data .= pack("C", 0x10); + $this->append($header . $data); + } + + /** + * Stores the COUNTRY record for localization + * + * @return string + */ + private function writeCountry() + { + $record = 0x008C; // Record identifier + $length = 4; // Number of bytes to follow + + $header = pack('vv', $record, $length); + /* using the same country code always for simplicity */ + $data = pack('vv', $this->countryCode, $this->countryCode); + //$this->append($header . $data); + return $this->writeData($header . $data); + } + + /** + * Write the RECALCID record + * + * @return string + */ + private function writeRecalcId() + { + $record = 0x01C1; // Record identifier + $length = 8; // Number of bytes to follow + + $header = pack('vv', $record, $length); + + // by inspection of real Excel files, MS Office Excel 2007 writes this + $data = pack('VV', 0x000001C1, 0x00001E667); + + return $this->writeData($header . $data); + } + + /** + * Stores the PALETTE biff record. + */ + private function writePalette() + { + $aref = $this->palette; + + $record = 0x0092; // Record identifier + $length = 2 + 4 * count($aref); // Number of bytes to follow + $ccv = count($aref); // Number of RGB values to follow + $data = ''; // The RGB data + + // Pack the RGB data + foreach ($aref as $color) { + foreach ($color as $byte) { + $data .= pack("C", $byte); + } + } + + $header = pack("vvv", $record, $length, $ccv); + $this->append($header . $data); + } + + /** + * Handling of the SST continue blocks is complicated by the need to include an + * additional continuation byte depending on whether the string is split between + * blocks or whether it starts at the beginning of the block. (There are also + * additional complications that will arise later when/if Rich Strings are + * supported). + * + * The Excel documentation says that the SST record should be followed by an + * EXTSST record. The EXTSST record is a hash table that is used to optimise + * access to SST. However, despite the documentation it doesn't seem to be + * required so we will ignore it. + * + * @return string Binary data + */ + private function writeSharedStringsTable() + { + // maximum size of record data (excluding record header) + $continue_limit = 8224; + + // initialize array of record data blocks + $recordDatas = array(); + + // start SST record data block with total number of strings, total number of unique strings + $recordData = pack("VV", $this->stringTotal, $this->stringUnique); + + // loop through all (unique) strings in shared strings table + foreach (array_keys($this->stringTable) as $string) { + // here $string is a BIFF8 encoded string + + // length = character count + $headerinfo = unpack("vlength/Cencoding", $string); + + // currently, this is always 1 = uncompressed + $encoding = $headerinfo["encoding"]; + + // initialize finished writing current $string + $finished = false; + + while ($finished === false) { + // normally, there will be only one cycle, but if string cannot immediately be written as is + // there will be need for more than one cylcle, if string longer than one record data block, there + // may be need for even more cycles + + if (strlen($recordData) + strlen($string) <= $continue_limit) { + // then we can write the string (or remainder of string) without any problems + $recordData .= $string; + + if (strlen($recordData) + strlen($string) == $continue_limit) { + // we close the record data block, and initialize a new one + $recordDatas[] = $recordData; + $recordData = ''; + } + + // we are finished writing this string + $finished = true; + } else { + // special treatment writing the string (or remainder of the string) + // If the string is very long it may need to be written in more than one CONTINUE record. + + // check how many bytes more there is room for in the current record + $space_remaining = $continue_limit - strlen($recordData); + + // minimum space needed + // uncompressed: 2 byte string length length field + 1 byte option flags + 2 byte character + // compressed: 2 byte string length length field + 1 byte option flags + 1 byte character + $min_space_needed = ($encoding == 1) ? 5 : 4; + + // We have two cases + // 1. space remaining is less than minimum space needed + // here we must waste the space remaining and move to next record data block + // 2. space remaining is greater than or equal to minimum space needed + // here we write as much as we can in the current block, then move to next record data block + + // 1. space remaining is less than minimum space needed + if ($space_remaining < $min_space_needed) { + // we close the block, store the block data + $recordDatas[] = $recordData; + + // and start new record data block where we start writing the string + $recordData = ''; + + // 2. space remaining is greater than or equal to minimum space needed + } else { + // initialize effective remaining space, for Unicode strings this may need to be reduced by 1, see below + $effective_space_remaining = $space_remaining; + + // for uncompressed strings, sometimes effective space remaining is reduced by 1 + if ($encoding == 1 && (strlen($string) - $space_remaining) % 2 == 1) { + --$effective_space_remaining; + } + + // one block fininshed, store the block data + $recordData .= substr($string, 0, $effective_space_remaining); + + $string = substr($string, $effective_space_remaining); // for next cycle in while loop + $recordDatas[] = $recordData; + + // start new record data block with the repeated option flags + $recordData = pack('C', $encoding); + } + } + } + } + + // Store the last record data block unless it is empty + // if there was no need for any continue records, this will be the for SST record data block itself + if (strlen($recordData) > 0) { + $recordDatas[] = $recordData; + } + + // combine into one chunk with all the blocks SST, CONTINUE,... + $chunk = ''; + foreach ($recordDatas as $i => $recordData) { + // first block should have the SST record header, remaing should have CONTINUE header + $record = ($i == 0) ? 0x00FC : 0x003C; + + $header = pack("vv", $record, strlen($recordData)); + $data = $header . $recordData; + + $chunk .= $this->writeData($data); + } + + return $chunk; + } + + /** + * Writes the MSODRAWINGGROUP record if needed. Possibly split using CONTINUE records. + */ + private function writeMsoDrawingGroup() + { + // write the Escher stream if necessary + if (isset($this->escher)) { + $writer = new PHPExcel_Writer_Excel5_Escher($this->escher); + $data = $writer->close(); + + $record = 0x00EB; + $length = strlen($data); + $header = pack("vv", $record, $length); + + return $this->writeData($header . $data); + } else { + return ''; + } + } + + /** + * Get Escher object + * + * @return PHPExcel_Shared_Escher + */ + public function getEscher() + { + return $this->escher; + } + + /** + * Set Escher object + * + * @param PHPExcel_Shared_Escher $pValue + */ + public function setEscher(PHPExcel_Shared_Escher $pValue = null) + { + $this->escher = $pValue; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel5/Worksheet.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel5/Worksheet.php new file mode 100644 index 0000000..be965e2 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel5/Worksheet.php @@ -0,0 +1,4240 @@ +<?php + +/** + * PHPExcel_Writer_Excel5_Worksheet + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ + +// Original file header of PEAR::Spreadsheet_Excel_Writer_Worksheet (used as the base for this class): +// ----------------------------------------------------------------------------------------- +// /* +// * Module written/ported by Xavier Noguer <xnoguer@rezebra.com> +// * +// * The majority of this is _NOT_ my code. I simply ported it from the +// * PERL Spreadsheet::WriteExcel module. +// * +// * The author of the Spreadsheet::WriteExcel module is John McNamara +// * <jmcnamara@cpan.org> +// * +// * I _DO_ maintain this code, and John McNamara has nothing to do with the +// * porting of this code to PHP. Any questions directly related to this +// * class library should be directed to me. +// * +// * License Information: +// * +// * Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +// * Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +// * +// * This library is free software; you can redistribute it and/or +// * modify it under the terms of the GNU Lesser General Public +// * License as published by the Free Software Foundation; either +// * version 2.1 of the License, or (at your option) any later version. +// * +// * This library is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// * Lesser General Public License for more details. +// * +// * You should have received a copy of the GNU Lesser General Public +// * License along with this library; if not, write to the Free Software +// * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// */ +class PHPExcel_Writer_Excel5_Worksheet extends PHPExcel_Writer_Excel5_BIFFwriter +{ + /** + * Formula parser + * + * @var PHPExcel_Writer_Excel5_Parser + */ + private $parser; + + /** + * Maximum number of characters for a string (LABEL record in BIFF5) + * @var integer + */ + private $xlsStringMaxLength; + + /** + * Array containing format information for columns + * @var array + */ + private $columnInfo; + + /** + * Array containing the selected area for the worksheet + * @var array + */ + private $selection; + + /** + * The active pane for the worksheet + * @var integer + */ + private $activePane; + + /** + * Whether to use outline. + * @var integer + */ + private $outlineOn; + + /** + * Auto outline styles. + * @var bool + */ + private $outlineStyle; + + /** + * Whether to have outline summary below. + * @var bool + */ + private $outlineBelow; + + /** + * Whether to have outline summary at the right. + * @var bool + */ + private $outlineRight; + + /** + * Reference to the total number of strings in the workbook + * @var integer + */ + private $stringTotal; + + /** + * Reference to the number of unique strings in the workbook + * @var integer + */ + private $stringUnique; + + /** + * Reference to the array containing all the unique strings in the workbook + * @var array + */ + private $stringTable; + + /** + * Color cache + */ + private $colors; + + /** + * Index of first used row (at least 0) + * @var int + */ + private $firstRowIndex; + + /** + * Index of last used row. (no used rows means -1) + * @var int + */ + private $lastRowIndex; + + /** + * Index of first used column (at least 0) + * @var int + */ + private $firstColumnIndex; + + /** + * Index of last used column (no used columns means -1) + * @var int + */ + private $lastColumnIndex; + + /** + * Sheet object + * @var PHPExcel_Worksheet + */ + public $phpSheet; + + /** + * Count cell style Xfs + * + * @var int + */ + private $countCellStyleXfs; + + /** + * Escher object corresponding to MSODRAWING + * + * @var PHPExcel_Shared_Escher + */ + private $escher; + + /** + * Array of font hashes associated to FONT records index + * + * @var array + */ + public $fontHashIndex; + + /** + * Constructor + * + * @param int &$str_total Total number of strings + * @param int &$str_unique Total number of unique strings + * @param array &$str_table String Table + * @param array &$colors Colour Table + * @param mixed $parser The formula parser created for the Workbook + * @param boolean $preCalculateFormulas Flag indicating whether formulas should be calculated or just written + * @param string $phpSheet The worksheet to write + * @param PHPExcel_Worksheet $phpSheet + */ + public function __construct(&$str_total, &$str_unique, &$str_table, &$colors, $parser, $preCalculateFormulas, $phpSheet) + { + // It needs to call its parent's constructor explicitly + parent::__construct(); + + // change BIFFwriter limit for CONTINUE records +// $this->_limit = 8224; + + + $this->_preCalculateFormulas = $preCalculateFormulas; + $this->stringTotal = &$str_total; + $this->stringUnique = &$str_unique; + $this->stringTable = &$str_table; + $this->colors = &$colors; + $this->parser = $parser; + + $this->phpSheet = $phpSheet; + + //$this->ext_sheets = array(); + //$this->offset = 0; + $this->xlsStringMaxLength = 255; + $this->columnInfo = array(); + $this->selection = array(0,0,0,0); + $this->activePane = 3; + + $this->_print_headers = 0; + + $this->outlineStyle = 0; + $this->outlineBelow = 1; + $this->outlineRight = 1; + $this->outlineOn = 1; + + $this->fontHashIndex = array(); + + // calculate values for DIMENSIONS record + $minR = 1; + $minC = 'A'; + + $maxR = $this->phpSheet->getHighestRow(); + $maxC = $this->phpSheet->getHighestColumn(); + + // Determine lowest and highest column and row +// $this->firstRowIndex = ($minR > 65535) ? 65535 : $minR; + $this->lastRowIndex = ($maxR > 65535) ? 65535 : $maxR ; + + $this->firstColumnIndex = PHPExcel_Cell::columnIndexFromString($minC); + $this->lastColumnIndex = PHPExcel_Cell::columnIndexFromString($maxC); + +// if ($this->firstColumnIndex > 255) $this->firstColumnIndex = 255; + if ($this->lastColumnIndex > 255) { + $this->lastColumnIndex = 255; + } + + $this->countCellStyleXfs = count($phpSheet->getParent()->getCellStyleXfCollection()); + } + + /** + * Add data to the beginning of the workbook (note the reverse order) + * and to the end of the workbook. + * + * @access public + * @see PHPExcel_Writer_Excel5_Workbook::storeWorkbook() + */ + public function close() + { + $phpSheet = $this->phpSheet; + + $num_sheets = $phpSheet->getParent()->getSheetCount(); + + // Write BOF record + $this->storeBof(0x0010); + + // Write PRINTHEADERS + $this->writePrintHeaders(); + + // Write PRINTGRIDLINES + $this->writePrintGridlines(); + + // Write GRIDSET + $this->writeGridset(); + + // Calculate column widths + $phpSheet->calculateColumnWidths(); + + // Column dimensions + if (($defaultWidth = $phpSheet->getDefaultColumnDimension()->getWidth()) < 0) { + $defaultWidth = PHPExcel_Shared_Font::getDefaultColumnWidthByFont($phpSheet->getParent()->getDefaultStyle()->getFont()); + } + + $columnDimensions = $phpSheet->getColumnDimensions(); + $maxCol = $this->lastColumnIndex -1; + for ($i = 0; $i <= $maxCol; ++$i) { + $hidden = 0; + $level = 0; + $xfIndex = 15; // there are 15 cell style Xfs + + $width = $defaultWidth; + + $columnLetter = PHPExcel_Cell::stringFromColumnIndex($i); + if (isset($columnDimensions[$columnLetter])) { + $columnDimension = $columnDimensions[$columnLetter]; + if ($columnDimension->getWidth() >= 0) { + $width = $columnDimension->getWidth(); + } + $hidden = $columnDimension->getVisible() ? 0 : 1; + $level = $columnDimension->getOutlineLevel(); + $xfIndex = $columnDimension->getXfIndex() + 15; // there are 15 cell style Xfs + } + + // Components of columnInfo: + // $firstcol first column on the range + // $lastcol last column on the range + // $width width to set + // $xfIndex The optional cell style Xf index to apply to the columns + // $hidden The optional hidden atribute + // $level The optional outline level + $this->columnInfo[] = array($i, $i, $width, $xfIndex, $hidden, $level); + } + + // Write GUTS + $this->writeGuts(); + + // Write DEFAULTROWHEIGHT + $this->writeDefaultRowHeight(); + // Write WSBOOL + $this->writeWsbool(); + // Write horizontal and vertical page breaks + $this->writeBreaks(); + // Write page header + $this->writeHeader(); + // Write page footer + $this->writeFooter(); + // Write page horizontal centering + $this->writeHcenter(); + // Write page vertical centering + $this->writeVcenter(); + // Write left margin + $this->writeMarginLeft(); + // Write right margin + $this->writeMarginRight(); + // Write top margin + $this->writeMarginTop(); + // Write bottom margin + $this->writeMarginBottom(); + // Write page setup + $this->writeSetup(); + // Write sheet protection + $this->writeProtect(); + // Write SCENPROTECT + $this->writeScenProtect(); + // Write OBJECTPROTECT + $this->writeObjectProtect(); + // Write sheet password + $this->writePassword(); + // Write DEFCOLWIDTH record + $this->writeDefcol(); + + // Write the COLINFO records if they exist + if (!empty($this->columnInfo)) { + $colcount = count($this->columnInfo); + for ($i = 0; $i < $colcount; ++$i) { + $this->writeColinfo($this->columnInfo[$i]); + } + } + $autoFilterRange = $phpSheet->getAutoFilter()->getRange(); + if (!empty($autoFilterRange)) { + // Write AUTOFILTERINFO + $this->writeAutoFilterInfo(); + } + + // Write sheet dimensions + $this->writeDimensions(); + + // Row dimensions + foreach ($phpSheet->getRowDimensions() as $rowDimension) { + $xfIndex = $rowDimension->getXfIndex() + 15; // there are 15 cellXfs + $this->writeRow($rowDimension->getRowIndex() - 1, $rowDimension->getRowHeight(), $xfIndex, ($rowDimension->getVisible() ? '0' : '1'), $rowDimension->getOutlineLevel()); + } + + // Write Cells + foreach ($phpSheet->getCellCollection() as $cellID) { + $cell = $phpSheet->getCell($cellID); + $row = $cell->getRow() - 1; + $column = PHPExcel_Cell::columnIndexFromString($cell->getColumn()) - 1; + + // Don't break Excel! +// if ($row + 1 > 65536 or $column + 1 > 256) { + if ($row > 65535 || $column > 255) { + break; + } + + // Write cell value + $xfIndex = $cell->getXfIndex() + 15; // there are 15 cell style Xfs + + $cVal = $cell->getValue(); + if ($cVal instanceof PHPExcel_RichText) { + // $this->writeString($row, $column, $cVal->getPlainText(), $xfIndex); + $arrcRun = array(); + $str_len = PHPExcel_Shared_String::CountCharacters($cVal->getPlainText(), 'UTF-8'); + $str_pos = 0; + $elements = $cVal->getRichTextElements(); + foreach ($elements as $element) { + // FONT Index + if ($element instanceof PHPExcel_RichText_Run) { + $str_fontidx = $this->fontHashIndex[$element->getFont()->getHashCode()]; + } else { + $str_fontidx = 0; + } + $arrcRun[] = array('strlen' => $str_pos, 'fontidx' => $str_fontidx); + // Position FROM + $str_pos += PHPExcel_Shared_String::CountCharacters($element->getText(), 'UTF-8'); + } + $this->writeRichTextString($row, $column, $cVal->getPlainText(), $xfIndex, $arrcRun); + } else { + switch ($cell->getDatatype()) { + case PHPExcel_Cell_DataType::TYPE_STRING: + case PHPExcel_Cell_DataType::TYPE_NULL: + if ($cVal === '' || $cVal === null) { + $this->writeBlank($row, $column, $xfIndex); + } else { + $this->writeString($row, $column, $cVal, $xfIndex); + } + break; + + case PHPExcel_Cell_DataType::TYPE_NUMERIC: + $this->writeNumber($row, $column, $cVal, $xfIndex); + break; + + case PHPExcel_Cell_DataType::TYPE_FORMULA: + $calculatedValue = $this->_preCalculateFormulas ? + $cell->getCalculatedValue() : null; + $this->writeFormula($row, $column, $cVal, $xfIndex, $calculatedValue); + break; + + case PHPExcel_Cell_DataType::TYPE_BOOL: + $this->writeBoolErr($row, $column, $cVal, 0, $xfIndex); + break; + + case PHPExcel_Cell_DataType::TYPE_ERROR: + $this->writeBoolErr($row, $column, self::mapErrorCode($cVal), 1, $xfIndex); + break; + + } + } + } + + // Append + $this->writeMsoDrawing(); + + // Write WINDOW2 record + $this->writeWindow2(); + + // Write PLV record + $this->writePageLayoutView(); + + // Write ZOOM record + $this->writeZoom(); + if ($phpSheet->getFreezePane()) { + $this->writePanes(); + } + + // Write SELECTION record + $this->writeSelection(); + + // Write MergedCellsTable Record + $this->writeMergedCells(); + + // Hyperlinks + foreach ($phpSheet->getHyperLinkCollection() as $coordinate => $hyperlink) { + list($column, $row) = PHPExcel_Cell::coordinateFromString($coordinate); + + $url = $hyperlink->getUrl(); + + if (strpos($url, 'sheet://') !== false) { + // internal to current workbook + $url = str_replace('sheet://', 'internal:', $url); + + } elseif (preg_match('/^(http:|https:|ftp:|mailto:)/', $url)) { + // URL + // $url = $url; + + } else { + // external (local file) + $url = 'external:' . $url; + } + + $this->writeUrl($row - 1, PHPExcel_Cell::columnIndexFromString($column) - 1, $url); + } + + $this->writeDataValidity(); + $this->writeSheetLayout(); + + // Write SHEETPROTECTION record + $this->writeSheetProtection(); + $this->writeRangeProtection(); + + $arrConditionalStyles = $phpSheet->getConditionalStylesCollection(); + if (!empty($arrConditionalStyles)) { + $arrConditional = array(); + // @todo CFRule & CFHeader + // Write CFHEADER record + $this->writeCFHeader(); + // Write ConditionalFormattingTable records + foreach ($arrConditionalStyles as $cellCoordinate => $conditionalStyles) { + foreach ($conditionalStyles as $conditional) { + if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_EXPRESSION + || $conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CELLIS) { + if (!in_array($conditional->getHashCode(), $arrConditional)) { + $arrConditional[] = $conditional->getHashCode(); + // Write CFRULE record + $this->writeCFRule($conditional); + } + } + } + } + } + + $this->storeEof(); + } + + /** + * Write a cell range address in BIFF8 + * always fixed range + * See section 2.5.14 in OpenOffice.org's Documentation of the Microsoft Excel File Format + * + * @param string $range E.g. 'A1' or 'A1:B6' + * @return string Binary data + */ + private function writeBIFF8CellRangeAddressFixed($range = 'A1') + { + $explodes = explode(':', $range); + + // extract first cell, e.g. 'A1' + $firstCell = $explodes[0]; + + // extract last cell, e.g. 'B6' + if (count($explodes) == 1) { + $lastCell = $firstCell; + } else { + $lastCell = $explodes[1]; + } + + $firstCellCoordinates = PHPExcel_Cell::coordinateFromString($firstCell); // e.g. array(0, 1) + $lastCellCoordinates = PHPExcel_Cell::coordinateFromString($lastCell); // e.g. array(1, 6) + + return pack('vvvv', $firstCellCoordinates[1] - 1, $lastCellCoordinates[1] - 1, PHPExcel_Cell::columnIndexFromString($firstCellCoordinates[0]) - 1, PHPExcel_Cell::columnIndexFromString($lastCellCoordinates[0]) - 1); + } + + /** + * Retrieves data from memory in one chunk, or from disk in $buffer + * sized chunks. + * + * @return string The data + */ + public function getData() + { + $buffer = 4096; + + // Return data stored in memory + if (isset($this->_data)) { + $tmp = $this->_data; + unset($this->_data); + return $tmp; + } + // No data to return + return false; + } + + /** + * Set the option to print the row and column headers on the printed page. + * + * @access public + * @param integer $print Whether to print the headers or not. Defaults to 1 (print). + */ + public function printRowColHeaders($print = 1) + { + $this->_print_headers = $print; + } + + /** + * This method sets the properties for outlining and grouping. The defaults + * correspond to Excel's defaults. + * + * @param bool $visible + * @param bool $symbols_below + * @param bool $symbols_right + * @param bool $auto_style + */ + public function setOutline($visible = true, $symbols_below = true, $symbols_right = true, $auto_style = false) + { + $this->outlineOn = $visible; + $this->outlineBelow = $symbols_below; + $this->outlineRight = $symbols_right; + $this->outlineStyle = $auto_style; + + // Ensure this is a boolean vale for Window2 + if ($this->outlineOn) { + $this->outlineOn = 1; + } + } + + /** + * Write a double to the specified row and column (zero indexed). + * An integer can be written as a double. Excel will display an + * integer. $format is optional. + * + * Returns 0 : normal termination + * -2 : row or column out of range + * + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param float $num The number to write + * @param mixed $xfIndex The optional XF format + * @return integer + */ + private function writeNumber($row, $col, $num, $xfIndex) + { + $record = 0x0203; // Record identifier + $length = 0x000E; // Number of bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("vvv", $row, $col, $xfIndex); + $xl_double = pack("d", $num); + if (self::getByteOrder()) { // if it's Big Endian + $xl_double = strrev($xl_double); + } + + $this->append($header.$data.$xl_double); + return(0); + } + + /** + * Write a LABELSST record or a LABEL record. Which one depends on BIFF version + * + * @param int $row Row index (0-based) + * @param int $col Column index (0-based) + * @param string $str The string + * @param int $xfIndex Index to XF record + */ + private function writeString($row, $col, $str, $xfIndex) + { + $this->writeLabelSst($row, $col, $str, $xfIndex); + } + + /** + * Write a LABELSST record or a LABEL record. Which one depends on BIFF version + * It differs from writeString by the writing of rich text strings. + * @param int $row Row index (0-based) + * @param int $col Column index (0-based) + * @param string $str The string + * @param mixed $xfIndex The XF format index for the cell + * @param array $arrcRun Index to Font record and characters beginning + */ + private function writeRichTextString($row, $col, $str, $xfIndex, $arrcRun) + { + $record = 0x00FD; // Record identifier + $length = 0x000A; // Bytes to follow + $str = PHPExcel_Shared_String::UTF8toBIFF8UnicodeShort($str, $arrcRun); + + /* check if string is already present */ + if (!isset($this->stringTable[$str])) { + $this->stringTable[$str] = $this->stringUnique++; + } + $this->stringTotal++; + + $header = pack('vv', $record, $length); + $data = pack('vvvV', $row, $col, $xfIndex, $this->stringTable[$str]); + $this->append($header.$data); + } + + /** + * Write a string to the specified row and column (zero indexed). + * NOTE: there is an Excel 5 defined limit of 255 characters. + * $format is optional. + * Returns 0 : normal termination + * -2 : row or column out of range + * -3 : long string truncated to 255 chars + * + * @access public + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param string $str The string to write + * @param mixed $xfIndex The XF format index for the cell + * @return integer + */ + private function writeLabel($row, $col, $str, $xfIndex) + { + $strlen = strlen($str); + $record = 0x0204; // Record identifier + $length = 0x0008 + $strlen; // Bytes to follow + + $str_error = 0; + + if ($strlen > $this->xlsStringMaxLength) { // LABEL must be < 255 chars + $str = substr($str, 0, $this->xlsStringMaxLength); + $length = 0x0008 + $this->xlsStringMaxLength; + $strlen = $this->xlsStringMaxLength; + $str_error = -3; + } + + $header = pack("vv", $record, $length); + $data = pack("vvvv", $row, $col, $xfIndex, $strlen); + $this->append($header . $data . $str); + return($str_error); + } + + /** + * Write a string to the specified row and column (zero indexed). + * This is the BIFF8 version (no 255 chars limit). + * $format is optional. + * Returns 0 : normal termination + * -2 : row or column out of range + * -3 : long string truncated to 255 chars + * + * @access public + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param string $str The string to write + * @param mixed $xfIndex The XF format index for the cell + * @return integer + */ + private function writeLabelSst($row, $col, $str, $xfIndex) + { + $record = 0x00FD; // Record identifier + $length = 0x000A; // Bytes to follow + + $str = PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($str); + + /* check if string is already present */ + if (!isset($this->stringTable[$str])) { + $this->stringTable[$str] = $this->stringUnique++; + } + $this->stringTotal++; + + $header = pack('vv', $record, $length); + $data = pack('vvvV', $row, $col, $xfIndex, $this->stringTable[$str]); + $this->append($header.$data); + } + + /** + * Writes a note associated with the cell given by the row and column. + * NOTE records don't have a length limit. + * + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param string $note The note to write + */ + private function writeNote($row, $col, $note) + { + $note_length = strlen($note); + $record = 0x001C; // Record identifier + $max_length = 2048; // Maximun length for a NOTE record + + // Length for this record is no more than 2048 + 6 + $length = 0x0006 + min($note_length, 2048); + $header = pack("vv", $record, $length); + $data = pack("vvv", $row, $col, $note_length); + $this->append($header . $data . substr($note, 0, 2048)); + + for ($i = $max_length; $i < $note_length; $i += $max_length) { + $chunk = substr($note, $i, $max_length); + $length = 0x0006 + strlen($chunk); + $header = pack("vv", $record, $length); + $data = pack("vvv", -1, 0, strlen($chunk)); + $this->append($header.$data.$chunk); + } + return(0); + } + + /** + * Write a blank cell to the specified row and column (zero indexed). + * A blank cell is used to specify formatting without adding a string + * or a number. + * + * A blank cell without a format serves no purpose. Therefore, we don't write + * a BLANK record unless a format is specified. + * + * Returns 0 : normal termination (including no format) + * -1 : insufficient number of arguments + * -2 : row or column out of range + * + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param mixed $xfIndex The XF format index + */ + public function writeBlank($row, $col, $xfIndex) + { + $record = 0x0201; // Record identifier + $length = 0x0006; // Number of bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("vvv", $row, $col, $xfIndex); + $this->append($header . $data); + return 0; + } + + /** + * Write a boolean or an error type to the specified row and column (zero indexed) + * + * @param int $row Row index (0-based) + * @param int $col Column index (0-based) + * @param int $value + * @param boolean $isError Error or Boolean? + * @param int $xfIndex + */ + private function writeBoolErr($row, $col, $value, $isError, $xfIndex) + { + $record = 0x0205; + $length = 8; + + $header = pack("vv", $record, $length); + $data = pack("vvvCC", $row, $col, $xfIndex, $value, $isError); + $this->append($header . $data); + return 0; + } + + /** + * Write a formula to the specified row and column (zero indexed). + * The textual representation of the formula is passed to the parser in + * Parser.php which returns a packed binary string. + * + * Returns 0 : normal termination + * -1 : formula errors (bad formula) + * -2 : row or column out of range + * + * @param integer $row Zero indexed row + * @param integer $col Zero indexed column + * @param string $formula The formula text string + * @param mixed $xfIndex The XF format index + * @param mixed $calculatedValue Calculated value + * @return integer + */ + private function writeFormula($row, $col, $formula, $xfIndex, $calculatedValue) + { + $record = 0x0006; // Record identifier + + // Initialize possible additional value for STRING record that should be written after the FORMULA record? + $stringValue = null; + + // calculated value + if (isset($calculatedValue)) { + // Since we can't yet get the data type of the calculated value, + // we use best effort to determine data type + if (is_bool($calculatedValue)) { + // Boolean value + $num = pack('CCCvCv', 0x01, 0x00, (int)$calculatedValue, 0x00, 0x00, 0xFFFF); + } elseif (is_int($calculatedValue) || is_float($calculatedValue)) { + // Numeric value + $num = pack('d', $calculatedValue); + } elseif (is_string($calculatedValue)) { + if (array_key_exists($calculatedValue, PHPExcel_Cell_DataType::getErrorCodes())) { + // Error value + $num = pack('CCCvCv', 0x02, 0x00, self::mapErrorCode($calculatedValue), 0x00, 0x00, 0xFFFF); + } elseif ($calculatedValue === '') { + // Empty string (and BIFF8) + $num = pack('CCCvCv', 0x03, 0x00, 0x00, 0x00, 0x00, 0xFFFF); + } else { + // Non-empty string value (or empty string BIFF5) + $stringValue = $calculatedValue; + $num = pack('CCCvCv', 0x00, 0x00, 0x00, 0x00, 0x00, 0xFFFF); + } + } else { + // We are really not supposed to reach here + $num = pack('d', 0x00); + } + } else { + $num = pack('d', 0x00); + } + + $grbit = 0x03; // Option flags + $unknown = 0x0000; // Must be zero + + // Strip the '=' or '@' sign at the beginning of the formula string + if ($formula{0} == '=') { + $formula = substr($formula, 1); + } else { + // Error handling + $this->writeString($row, $col, 'Unrecognised character for formula'); + return -1; + } + + // Parse the formula using the parser in Parser.php + try { + $error = $this->parser->parse($formula); + $formula = $this->parser->toReversePolish(); + + $formlen = strlen($formula); // Length of the binary string + $length = 0x16 + $formlen; // Length of the record data + + $header = pack("vv", $record, $length); + + $data = pack("vvv", $row, $col, $xfIndex) + . $num + . pack("vVv", $grbit, $unknown, $formlen); + $this->append($header . $data . $formula); + + // Append also a STRING record if necessary + if ($stringValue !== null) { + $this->writeStringRecord($stringValue); + } + + return 0; + + } catch (PHPExcel_Exception $e) { + // do nothing + } + + } + + /** + * Write a STRING record. This + * + * @param string $stringValue + */ + private function writeStringRecord($stringValue) + { + $record = 0x0207; // Record identifier + $data = PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($stringValue); + + $length = strlen($data); + $header = pack('vv', $record, $length); + + $this->append($header . $data); + } + + /** + * Write a hyperlink. + * This is comprised of two elements: the visible label and + * the invisible link. The visible label is the same as the link unless an + * alternative string is specified. The label is written using the + * writeString() method. Therefore the 255 characters string limit applies. + * $string and $format are optional. + * + * The hyperlink can be to a http, ftp, mail, internal sheet (not yet), or external + * directory url. + * + * Returns 0 : normal termination + * -2 : row or column out of range + * -3 : long string truncated to 255 chars + * + * @param integer $row Row + * @param integer $col Column + * @param string $url URL string + * @return integer + */ + private function writeUrl($row, $col, $url) + { + // Add start row and col to arg list + return($this->writeUrlRange($row, $col, $row, $col, $url)); + } + + /** + * This is the more general form of writeUrl(). It allows a hyperlink to be + * written to a range of cells. This function also decides the type of hyperlink + * to be written. These are either, Web (http, ftp, mailto), Internal + * (Sheet1!A1) or external ('c:\temp\foo.xls#Sheet1!A1'). + * + * @access private + * @see writeUrl() + * @param integer $row1 Start row + * @param integer $col1 Start column + * @param integer $row2 End row + * @param integer $col2 End column + * @param string $url URL string + * @return integer + */ + public function writeUrlRange($row1, $col1, $row2, $col2, $url) + { + // Check for internal/external sheet links or default to web link + if (preg_match('[^internal:]', $url)) { + return($this->writeUrlInternal($row1, $col1, $row2, $col2, $url)); + } + if (preg_match('[^external:]', $url)) { + return($this->writeUrlExternal($row1, $col1, $row2, $col2, $url)); + } + return($this->writeUrlWeb($row1, $col1, $row2, $col2, $url)); + } + + /** + * Used to write http, ftp and mailto hyperlinks. + * The link type ($options) is 0x03 is the same as absolute dir ref without + * sheet. However it is differentiated by the $unknown2 data stream. + * + * @access private + * @see writeUrl() + * @param integer $row1 Start row + * @param integer $col1 Start column + * @param integer $row2 End row + * @param integer $col2 End column + * @param string $url URL string + * @return integer + */ + public function writeUrlWeb($row1, $col1, $row2, $col2, $url) + { + $record = 0x01B8; // Record identifier + $length = 0x00000; // Bytes to follow + + // Pack the undocumented parts of the hyperlink stream + $unknown1 = pack("H*", "D0C9EA79F9BACE118C8200AA004BA90B02000000"); + $unknown2 = pack("H*", "E0C9EA79F9BACE118C8200AA004BA90B"); + + // Pack the option flags + $options = pack("V", 0x03); + + // Convert URL to a null terminated wchar string + $url = join("\0", preg_split("''", $url, -1, PREG_SPLIT_NO_EMPTY)); + $url = $url . "\0\0\0"; + + // Pack the length of the URL + $url_len = pack("V", strlen($url)); + + // Calculate the data length + $length = 0x34 + strlen($url); + + // Pack the header data + $header = pack("vv", $record, $length); + $data = pack("vvvv", $row1, $row2, $col1, $col2); + + // Write the packed data + $this->append($header . $data . + $unknown1 . $options . + $unknown2 . $url_len . $url); + return 0; + } + + /** + * Used to write internal reference hyperlinks such as "Sheet1!A1". + * + * @access private + * @see writeUrl() + * @param integer $row1 Start row + * @param integer $col1 Start column + * @param integer $row2 End row + * @param integer $col2 End column + * @param string $url URL string + * @return integer + */ + public function writeUrlInternal($row1, $col1, $row2, $col2, $url) + { + $record = 0x01B8; // Record identifier + $length = 0x00000; // Bytes to follow + + // Strip URL type + $url = preg_replace('/^internal:/', '', $url); + + // Pack the undocumented parts of the hyperlink stream + $unknown1 = pack("H*", "D0C9EA79F9BACE118C8200AA004BA90B02000000"); + + // Pack the option flags + $options = pack("V", 0x08); + + // Convert the URL type and to a null terminated wchar string + $url .= "\0"; + + // character count + $url_len = PHPExcel_Shared_String::CountCharacters($url); + $url_len = pack('V', $url_len); + + $url = PHPExcel_Shared_String::ConvertEncoding($url, 'UTF-16LE', 'UTF-8'); + + // Calculate the data length + $length = 0x24 + strlen($url); + + // Pack the header data + $header = pack("vv", $record, $length); + $data = pack("vvvv", $row1, $row2, $col1, $col2); + + // Write the packed data + $this->append($header . $data . + $unknown1 . $options . + $url_len . $url); + return 0; + } + + /** + * Write links to external directory names such as 'c:\foo.xls', + * c:\foo.xls#Sheet1!A1', '../../foo.xls'. and '../../foo.xls#Sheet1!A1'. + * + * Note: Excel writes some relative links with the $dir_long string. We ignore + * these cases for the sake of simpler code. + * + * @access private + * @see writeUrl() + * @param integer $row1 Start row + * @param integer $col1 Start column + * @param integer $row2 End row + * @param integer $col2 End column + * @param string $url URL string + * @return integer + */ + public function writeUrlExternal($row1, $col1, $row2, $col2, $url) + { + // Network drives are different. We will handle them separately + // MS/Novell network drives and shares start with \\ + if (preg_match('[^external:\\\\]', $url)) { + return; //($this->writeUrlExternal_net($row1, $col1, $row2, $col2, $url, $str, $format)); + } + + $record = 0x01B8; // Record identifier + $length = 0x00000; // Bytes to follow + + // Strip URL type and change Unix dir separator to Dos style (if needed) + // + $url = preg_replace('/^external:/', '', $url); + $url = preg_replace('/\//', "\\", $url); + + // Determine if the link is relative or absolute: + // relative if link contains no dir separator, "somefile.xls" + // relative if link starts with up-dir, "..\..\somefile.xls" + // otherwise, absolute + + $absolute = 0x00; // relative path + if (preg_match('/^[A-Z]:/', $url)) { + $absolute = 0x02; // absolute path on Windows, e.g. C:\... + } + $link_type = 0x01 | $absolute; + + // Determine if the link contains a sheet reference and change some of the + // parameters accordingly. + // Split the dir name and sheet name (if it exists) + $dir_long = $url; + if (preg_match("/\#/", $url)) { + $link_type |= 0x08; + } + + + // Pack the link type + $link_type = pack("V", $link_type); + + // Calculate the up-level dir count e.g.. (..\..\..\ == 3) + $up_count = preg_match_all("/\.\.\\\/", $dir_long, $useless); + $up_count = pack("v", $up_count); + + // Store the short dos dir name (null terminated) + $dir_short = preg_replace("/\.\.\\\/", '', $dir_long) . "\0"; + + // Store the long dir name as a wchar string (non-null terminated) + $dir_long = $dir_long . "\0"; + + // Pack the lengths of the dir strings + $dir_short_len = pack("V", strlen($dir_short)); + $dir_long_len = pack("V", strlen($dir_long)); + $stream_len = pack("V", 0); //strlen($dir_long) + 0x06); + + // Pack the undocumented parts of the hyperlink stream + $unknown1 = pack("H*", 'D0C9EA79F9BACE118C8200AA004BA90B02000000'); + $unknown2 = pack("H*", '0303000000000000C000000000000046'); + $unknown3 = pack("H*", 'FFFFADDE000000000000000000000000000000000000000'); + $unknown4 = pack("v", 0x03); + + // Pack the main data stream + $data = pack("vvvv", $row1, $row2, $col1, $col2) . + $unknown1 . + $link_type . + $unknown2 . + $up_count . + $dir_short_len. + $dir_short . + $unknown3 . + $stream_len ;/*. + $dir_long_len . + $unknown4 . + $dir_long . + $sheet_len . + $sheet ;*/ + + // Pack the header data + $length = strlen($data); + $header = pack("vv", $record, $length); + + // Write the packed data + $this->append($header. $data); + return 0; + } + + /** + * This method is used to set the height and format for a row. + * + * @param integer $row The row to set + * @param integer $height Height we are giving to the row. + * Use null to set XF without setting height + * @param integer $xfIndex The optional cell style Xf index to apply to the columns + * @param bool $hidden The optional hidden attribute + * @param integer $level The optional outline level for row, in range [0,7] + */ + private function writeRow($row, $height, $xfIndex, $hidden = false, $level = 0) + { + $record = 0x0208; // Record identifier + $length = 0x0010; // Number of bytes to follow + + $colMic = 0x0000; // First defined column + $colMac = 0x0000; // Last defined column + $irwMac = 0x0000; // Used by Excel to optimise loading + $reserved = 0x0000; // Reserved + $grbit = 0x0000; // Option flags + $ixfe = $xfIndex; + + if ($height < 0) { + $height = null; + } + + // Use writeRow($row, null, $XF) to set XF format without setting height + if ($height != null) { + $miyRw = $height * 20; // row height + } else { + $miyRw = 0xff; // default row height is 256 + } + + // Set the options flags. fUnsynced is used to show that the font and row + // heights are not compatible. This is usually the case for WriteExcel. + // The collapsed flag 0x10 doesn't seem to be used to indicate that a row + // is collapsed. Instead it is used to indicate that the previous row is + // collapsed. The zero height flag, 0x20, is used to collapse a row. + + $grbit |= $level; + if ($hidden) { + $grbit |= 0x0030; + } + if ($height !== null) { + $grbit |= 0x0040; // fUnsynced + } + if ($xfIndex !== 0xF) { + $grbit |= 0x0080; + } + $grbit |= 0x0100; + + $header = pack("vv", $record, $length); + $data = pack("vvvvvvvv", $row, $colMic, $colMac, $miyRw, $irwMac, $reserved, $grbit, $ixfe); + $this->append($header.$data); + } + + /** + * Writes Excel DIMENSIONS to define the area in which there is data. + */ + private function writeDimensions() + { + $record = 0x0200; // Record identifier + + $length = 0x000E; + $data = pack('VVvvv', $this->firstRowIndex, $this->lastRowIndex + 1, $this->firstColumnIndex, $this->lastColumnIndex + 1, 0x0000); // reserved + + $header = pack("vv", $record, $length); + $this->append($header.$data); + } + + /** + * Write BIFF record Window2. + */ + private function writeWindow2() + { + $record = 0x023E; // Record identifier + $length = 0x0012; + + $grbit = 0x00B6; // Option flags + $rwTop = 0x0000; // Top row visible in window + $colLeft = 0x0000; // Leftmost column visible in window + + + // The options flags that comprise $grbit + $fDspFmla = 0; // 0 - bit + $fDspGrid = $this->phpSheet->getShowGridlines() ? 1 : 0; // 1 + $fDspRwCol = $this->phpSheet->getShowRowColHeaders() ? 1 : 0; // 2 + $fFrozen = $this->phpSheet->getFreezePane() ? 1 : 0; // 3 + $fDspZeros = 1; // 4 + $fDefaultHdr = 1; // 5 + $fArabic = $this->phpSheet->getRightToLeft() ? 1 : 0; // 6 + $fDspGuts = $this->outlineOn; // 7 + $fFrozenNoSplit = 0; // 0 - bit + // no support in PHPExcel for selected sheet, therefore sheet is only selected if it is the active sheet + $fSelected = ($this->phpSheet === $this->phpSheet->getParent()->getActiveSheet()) ? 1 : 0; + $fPaged = 1; // 2 + $fPageBreakPreview = $this->phpSheet->getSheetView()->getView() === PHPExcel_Worksheet_SheetView::SHEETVIEW_PAGE_BREAK_PREVIEW; + + $grbit = $fDspFmla; + $grbit |= $fDspGrid << 1; + $grbit |= $fDspRwCol << 2; + $grbit |= $fFrozen << 3; + $grbit |= $fDspZeros << 4; + $grbit |= $fDefaultHdr << 5; + $grbit |= $fArabic << 6; + $grbit |= $fDspGuts << 7; + $grbit |= $fFrozenNoSplit << 8; + $grbit |= $fSelected << 9; + $grbit |= $fPaged << 10; + $grbit |= $fPageBreakPreview << 11; + + $header = pack("vv", $record, $length); + $data = pack("vvv", $grbit, $rwTop, $colLeft); + + // FIXME !!! + $rgbHdr = 0x0040; // Row/column heading and gridline color index + $zoom_factor_page_break = ($fPageBreakPreview ? $this->phpSheet->getSheetView()->getZoomScale() : 0x0000); + $zoom_factor_normal = $this->phpSheet->getSheetView()->getZoomScaleNormal(); + + $data .= pack("vvvvV", $rgbHdr, 0x0000, $zoom_factor_page_break, $zoom_factor_normal, 0x00000000); + + $this->append($header.$data); + } + + /** + * Write BIFF record DEFAULTROWHEIGHT. + */ + private function writeDefaultRowHeight() + { + $defaultRowHeight = $this->phpSheet->getDefaultRowDimension()->getRowHeight(); + + if ($defaultRowHeight < 0) { + return; + } + + // convert to twips + $defaultRowHeight = (int) 20 * $defaultRowHeight; + + $record = 0x0225; // Record identifier + $length = 0x0004; // Number of bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("vv", 1, $defaultRowHeight); + $this->append($header . $data); + } + + /** + * Write BIFF record DEFCOLWIDTH if COLINFO records are in use. + */ + private function writeDefcol() + { + $defaultColWidth = 8; + + $record = 0x0055; // Record identifier + $length = 0x0002; // Number of bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("v", $defaultColWidth); + $this->append($header . $data); + } + + /** + * Write BIFF record COLINFO to define column widths + * + * Note: The SDK says the record length is 0x0B but Excel writes a 0x0C + * length record. + * + * @param array $col_array This is the only parameter received and is composed of the following: + * 0 => First formatted column, + * 1 => Last formatted column, + * 2 => Col width (8.43 is Excel default), + * 3 => The optional XF format of the column, + * 4 => Option flags. + * 5 => Optional outline level + */ + private function writeColinfo($col_array) + { + if (isset($col_array[0])) { + $colFirst = $col_array[0]; + } + if (isset($col_array[1])) { + $colLast = $col_array[1]; + } + if (isset($col_array[2])) { + $coldx = $col_array[2]; + } else { + $coldx = 8.43; + } + if (isset($col_array[3])) { + $xfIndex = $col_array[3]; + } else { + $xfIndex = 15; + } + if (isset($col_array[4])) { + $grbit = $col_array[4]; + } else { + $grbit = 0; + } + if (isset($col_array[5])) { + $level = $col_array[5]; + } else { + $level = 0; + } + $record = 0x007D; // Record identifier + $length = 0x000C; // Number of bytes to follow + + $coldx *= 256; // Convert to units of 1/256 of a char + + $ixfe = $xfIndex; + $reserved = 0x0000; // Reserved + + $level = max(0, min($level, 7)); + $grbit |= $level << 8; + + $header = pack("vv", $record, $length); + $data = pack("vvvvvv", $colFirst, $colLast, $coldx, $ixfe, $grbit, $reserved); + $this->append($header.$data); + } + + /** + * Write BIFF record SELECTION. + */ + private function writeSelection() + { + // look up the selected cell range + $selectedCells = $this->phpSheet->getSelectedCells(); + $selectedCells = PHPExcel_Cell::splitRange($this->phpSheet->getSelectedCells()); + $selectedCells = $selectedCells[0]; + if (count($selectedCells) == 2) { + list($first, $last) = $selectedCells; + } else { + $first = $selectedCells[0]; + $last = $selectedCells[0]; + } + + list($colFirst, $rwFirst) = PHPExcel_Cell::coordinateFromString($first); + $colFirst = PHPExcel_Cell::columnIndexFromString($colFirst) - 1; // base 0 column index + --$rwFirst; // base 0 row index + + list($colLast, $rwLast) = PHPExcel_Cell::coordinateFromString($last); + $colLast = PHPExcel_Cell::columnIndexFromString($colLast) - 1; // base 0 column index + --$rwLast; // base 0 row index + + // make sure we are not out of bounds + $colFirst = min($colFirst, 255); + $colLast = min($colLast, 255); + + $rwFirst = min($rwFirst, 65535); + $rwLast = min($rwLast, 65535); + + $record = 0x001D; // Record identifier + $length = 0x000F; // Number of bytes to follow + + $pnn = $this->activePane; // Pane position + $rwAct = $rwFirst; // Active row + $colAct = $colFirst; // Active column + $irefAct = 0; // Active cell ref + $cref = 1; // Number of refs + + if (!isset($rwLast)) { + $rwLast = $rwFirst; // Last row in reference + } + if (!isset($colLast)) { + $colLast = $colFirst; // Last col in reference + } + + // Swap last row/col for first row/col as necessary + if ($rwFirst > $rwLast) { + list($rwFirst, $rwLast) = array($rwLast, $rwFirst); + } + + if ($colFirst > $colLast) { + list($colFirst, $colLast) = array($colLast, $colFirst); + } + + $header = pack("vv", $record, $length); + $data = pack("CvvvvvvCC", $pnn, $rwAct, $colAct, $irefAct, $cref, $rwFirst, $rwLast, $colFirst, $colLast); + $this->append($header . $data); + } + + /** + * Store the MERGEDCELLS records for all ranges of merged cells + */ + private function writeMergedCells() + { + $mergeCells = $this->phpSheet->getMergeCells(); + $countMergeCells = count($mergeCells); + + if ($countMergeCells == 0) { + return; + } + + // maximum allowed number of merged cells per record + $maxCountMergeCellsPerRecord = 1027; + + // record identifier + $record = 0x00E5; + + // counter for total number of merged cells treated so far by the writer + $i = 0; + + // counter for number of merged cells written in record currently being written + $j = 0; + + // initialize record data + $recordData = ''; + + // loop through the merged cells + foreach ($mergeCells as $mergeCell) { + ++$i; + ++$j; + + // extract the row and column indexes + $range = PHPExcel_Cell::splitRange($mergeCell); + list($first, $last) = $range[0]; + list($firstColumn, $firstRow) = PHPExcel_Cell::coordinateFromString($first); + list($lastColumn, $lastRow) = PHPExcel_Cell::coordinateFromString($last); + + $recordData .= pack('vvvv', $firstRow - 1, $lastRow - 1, PHPExcel_Cell::columnIndexFromString($firstColumn) - 1, PHPExcel_Cell::columnIndexFromString($lastColumn) - 1); + + // flush record if we have reached limit for number of merged cells, or reached final merged cell + if ($j == $maxCountMergeCellsPerRecord or $i == $countMergeCells) { + $recordData = pack('v', $j) . $recordData; + $length = strlen($recordData); + $header = pack('vv', $record, $length); + $this->append($header . $recordData); + + // initialize for next record, if any + $recordData = ''; + $j = 0; + } + } + } + + /** + * Write SHEETLAYOUT record + */ + private function writeSheetLayout() + { + if (!$this->phpSheet->isTabColorSet()) { + return; + } + + $recordData = pack( + 'vvVVVvv', + 0x0862, + 0x0000, // unused + 0x00000000, // unused + 0x00000000, // unused + 0x00000014, // size of record data + $this->colors[$this->phpSheet->getTabColor()->getRGB()], // color index + 0x0000 // unused + ); + + $length = strlen($recordData); + + $record = 0x0862; // Record identifier + $header = pack('vv', $record, $length); + $this->append($header . $recordData); + } + + /** + * Write SHEETPROTECTION + */ + private function writeSheetProtection() + { + // record identifier + $record = 0x0867; + + // prepare options + $options = (int) !$this->phpSheet->getProtection()->getObjects() + | (int) !$this->phpSheet->getProtection()->getScenarios() << 1 + | (int) !$this->phpSheet->getProtection()->getFormatCells() << 2 + | (int) !$this->phpSheet->getProtection()->getFormatColumns() << 3 + | (int) !$this->phpSheet->getProtection()->getFormatRows() << 4 + | (int) !$this->phpSheet->getProtection()->getInsertColumns() << 5 + | (int) !$this->phpSheet->getProtection()->getInsertRows() << 6 + | (int) !$this->phpSheet->getProtection()->getInsertHyperlinks() << 7 + | (int) !$this->phpSheet->getProtection()->getDeleteColumns() << 8 + | (int) !$this->phpSheet->getProtection()->getDeleteRows() << 9 + | (int) !$this->phpSheet->getProtection()->getSelectLockedCells() << 10 + | (int) !$this->phpSheet->getProtection()->getSort() << 11 + | (int) !$this->phpSheet->getProtection()->getAutoFilter() << 12 + | (int) !$this->phpSheet->getProtection()->getPivotTables() << 13 + | (int) !$this->phpSheet->getProtection()->getSelectUnlockedCells() << 14 ; + + // record data + $recordData = pack( + 'vVVCVVvv', + 0x0867, // repeated record identifier + 0x0000, // not used + 0x0000, // not used + 0x00, // not used + 0x01000200, // unknown data + 0xFFFFFFFF, // unknown data + $options, // options + 0x0000 // not used + ); + + $length = strlen($recordData); + $header = pack('vv', $record, $length); + + $this->append($header . $recordData); + } + + /** + * Write BIFF record RANGEPROTECTION + * + * Openoffice.org's Documentaion of the Microsoft Excel File Format uses term RANGEPROTECTION for these records + * Microsoft Office Excel 97-2007 Binary File Format Specification uses term FEAT for these records + */ + private function writeRangeProtection() + { + foreach ($this->phpSheet->getProtectedCells() as $range => $password) { + // number of ranges, e.g. 'A1:B3 C20:D25' + $cellRanges = explode(' ', $range); + $cref = count($cellRanges); + + $recordData = pack( + 'vvVVvCVvVv', + 0x0868, + 0x00, + 0x0000, + 0x0000, + 0x02, + 0x0, + 0x0000, + $cref, + 0x0000, + 0x00 + ); + + foreach ($cellRanges as $cellRange) { + $recordData .= $this->writeBIFF8CellRangeAddressFixed($cellRange); + } + + // the rgbFeat structure + $recordData .= pack( + 'VV', + 0x0000, + hexdec($password) + ); + + $recordData .= PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong('p' . md5($recordData)); + + $length = strlen($recordData); + + $record = 0x0868; // Record identifier + $header = pack("vv", $record, $length); + $this->append($header . $recordData); + } + } + + /** + * Write BIFF record EXTERNCOUNT to indicate the number of external sheet + * references in a worksheet. + * + * Excel only stores references to external sheets that are used in formulas. + * For simplicity we store references to all the sheets in the workbook + * regardless of whether they are used or not. This reduces the overall + * complexity and eliminates the need for a two way dialogue between the formula + * parser the worksheet objects. + * + * @param integer $count The number of external sheet references in this worksheet + */ + private function writeExterncount($count) + { + $record = 0x0016; // Record identifier + $length = 0x0002; // Number of bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("v", $count); + $this->append($header . $data); + } + + /** + * Writes the Excel BIFF EXTERNSHEET record. These references are used by + * formulas. A formula references a sheet name via an index. Since we store a + * reference to all of the external worksheets the EXTERNSHEET index is the same + * as the worksheet index. + * + * @param string $sheetname The name of a external worksheet + */ + private function writeExternsheet($sheetname) + { + $record = 0x0017; // Record identifier + + // References to the current sheet are encoded differently to references to + // external sheets. + // + if ($this->phpSheet->getTitle() == $sheetname) { + $sheetname = ''; + $length = 0x02; // The following 2 bytes + $cch = 1; // The following byte + $rgch = 0x02; // Self reference + } else { + $length = 0x02 + strlen($sheetname); + $cch = strlen($sheetname); + $rgch = 0x03; // Reference to a sheet in the current workbook + } + + $header = pack("vv", $record, $length); + $data = pack("CC", $cch, $rgch); + $this->append($header . $data . $sheetname); + } + + /** + * Writes the Excel BIFF PANE record. + * The panes can either be frozen or thawed (unfrozen). + * Frozen panes are specified in terms of an integer number of rows and columns. + * Thawed panes are specified in terms of Excel's units for rows and columns. + */ + private function writePanes() + { + $panes = array(); + if ($freezePane = $this->phpSheet->getFreezePane()) { + list($column, $row) = PHPExcel_Cell::coordinateFromString($freezePane); + $panes[0] = $row - 1; + $panes[1] = PHPExcel_Cell::columnIndexFromString($column) - 1; + } else { + // thaw panes + return; + } + + $y = isset($panes[0]) ? $panes[0] : null; + $x = isset($panes[1]) ? $panes[1] : null; + $rwTop = isset($panes[2]) ? $panes[2] : null; + $colLeft = isset($panes[3]) ? $panes[3] : null; + if (count($panes) > 4) { // if Active pane was received + $pnnAct = $panes[4]; + } else { + $pnnAct = null; + } + $record = 0x0041; // Record identifier + $length = 0x000A; // Number of bytes to follow + + // Code specific to frozen or thawed panes. + if ($this->phpSheet->getFreezePane()) { + // Set default values for $rwTop and $colLeft + if (!isset($rwTop)) { + $rwTop = $y; + } + if (!isset($colLeft)) { + $colLeft = $x; + } + } else { + // Set default values for $rwTop and $colLeft + if (!isset($rwTop)) { + $rwTop = 0; + } + if (!isset($colLeft)) { + $colLeft = 0; + } + + // Convert Excel's row and column units to the internal units. + // The default row height is 12.75 + // The default column width is 8.43 + // The following slope and intersection values were interpolated. + // + $y = 20*$y + 255; + $x = 113.879*$x + 390; + } + + + // Determine which pane should be active. There is also the undocumented + // option to override this should it be necessary: may be removed later. + // + if (!isset($pnnAct)) { + if ($x != 0 && $y != 0) { + $pnnAct = 0; // Bottom right + } + if ($x != 0 && $y == 0) { + $pnnAct = 1; // Top right + } + if ($x == 0 && $y != 0) { + $pnnAct = 2; // Bottom left + } + if ($x == 0 && $y == 0) { + $pnnAct = 3; // Top left + } + } + + $this->activePane = $pnnAct; // Used in writeSelection + + $header = pack("vv", $record, $length); + $data = pack("vvvvv", $x, $y, $rwTop, $colLeft, $pnnAct); + $this->append($header . $data); + } + + /** + * Store the page setup SETUP BIFF record. + */ + private function writeSetup() + { + $record = 0x00A1; // Record identifier + $length = 0x0022; // Number of bytes to follow + + $iPaperSize = $this->phpSheet->getPageSetup()->getPaperSize(); // Paper size + + $iScale = $this->phpSheet->getPageSetup()->getScale() ? + $this->phpSheet->getPageSetup()->getScale() : 100; // Print scaling factor + + $iPageStart = 0x01; // Starting page number + $iFitWidth = (int) $this->phpSheet->getPageSetup()->getFitToWidth(); // Fit to number of pages wide + $iFitHeight = (int) $this->phpSheet->getPageSetup()->getFitToHeight(); // Fit to number of pages high + $grbit = 0x00; // Option flags + $iRes = 0x0258; // Print resolution + $iVRes = 0x0258; // Vertical print resolution + + $numHdr = $this->phpSheet->getPageMargins()->getHeader(); // Header Margin + + $numFtr = $this->phpSheet->getPageMargins()->getFooter(); // Footer Margin + $iCopies = 0x01; // Number of copies + + $fLeftToRight = 0x0; // Print over then down + + // Page orientation + $fLandscape = ($this->phpSheet->getPageSetup()->getOrientation() == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) ? + 0x0 : 0x1; + + $fNoPls = 0x0; // Setup not read from printer + $fNoColor = 0x0; // Print black and white + $fDraft = 0x0; // Print draft quality + $fNotes = 0x0; // Print notes + $fNoOrient = 0x0; // Orientation not set + $fUsePage = 0x0; // Use custom starting page + + $grbit = $fLeftToRight; + $grbit |= $fLandscape << 1; + $grbit |= $fNoPls << 2; + $grbit |= $fNoColor << 3; + $grbit |= $fDraft << 4; + $grbit |= $fNotes << 5; + $grbit |= $fNoOrient << 6; + $grbit |= $fUsePage << 7; + + $numHdr = pack("d", $numHdr); + $numFtr = pack("d", $numFtr); + if (self::getByteOrder()) { // if it's Big Endian + $numHdr = strrev($numHdr); + $numFtr = strrev($numFtr); + } + + $header = pack("vv", $record, $length); + $data1 = pack("vvvvvvvv", $iPaperSize, $iScale, $iPageStart, $iFitWidth, $iFitHeight, $grbit, $iRes, $iVRes); + $data2 = $numHdr.$numFtr; + $data3 = pack("v", $iCopies); + $this->append($header . $data1 . $data2 . $data3); + } + + /** + * Store the header caption BIFF record. + */ + private function writeHeader() + { + $record = 0x0014; // Record identifier + + /* removing for now + // need to fix character count (multibyte!) + if (strlen($this->phpSheet->getHeaderFooter()->getOddHeader()) <= 255) { + $str = $this->phpSheet->getHeaderFooter()->getOddHeader(); // header string + } else { + $str = ''; + } + */ + + $recordData = PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($this->phpSheet->getHeaderFooter()->getOddHeader()); + $length = strlen($recordData); + + $header = pack("vv", $record, $length); + + $this->append($header . $recordData); + } + + /** + * Store the footer caption BIFF record. + */ + private function writeFooter() + { + $record = 0x0015; // Record identifier + + /* removing for now + // need to fix character count (multibyte!) + if (strlen($this->phpSheet->getHeaderFooter()->getOddFooter()) <= 255) { + $str = $this->phpSheet->getHeaderFooter()->getOddFooter(); + } else { + $str = ''; + } + */ + + $recordData = PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($this->phpSheet->getHeaderFooter()->getOddFooter()); + $length = strlen($recordData); + + $header = pack("vv", $record, $length); + + $this->append($header . $recordData); + } + + /** + * Store the horizontal centering HCENTER BIFF record. + * + * @access private + */ + private function writeHcenter() + { + $record = 0x0083; // Record identifier + $length = 0x0002; // Bytes to follow + + $fHCenter = $this->phpSheet->getPageSetup()->getHorizontalCentered() ? 1 : 0; // Horizontal centering + + $header = pack("vv", $record, $length); + $data = pack("v", $fHCenter); + + $this->append($header.$data); + } + + /** + * Store the vertical centering VCENTER BIFF record. + */ + private function writeVcenter() + { + $record = 0x0084; // Record identifier + $length = 0x0002; // Bytes to follow + + $fVCenter = $this->phpSheet->getPageSetup()->getVerticalCentered() ? 1 : 0; // Horizontal centering + + $header = pack("vv", $record, $length); + $data = pack("v", $fVCenter); + $this->append($header . $data); + } + + /** + * Store the LEFTMARGIN BIFF record. + */ + private function writeMarginLeft() + { + $record = 0x0026; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->phpSheet->getPageMargins()->getLeft(); // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + if (self::getByteOrder()) { // if it's Big Endian + $data = strrev($data); + } + + $this->append($header . $data); + } + + /** + * Store the RIGHTMARGIN BIFF record. + */ + private function writeMarginRight() + { + $record = 0x0027; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->phpSheet->getPageMargins()->getRight(); // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + if (self::getByteOrder()) { // if it's Big Endian + $data = strrev($data); + } + + $this->append($header . $data); + } + + /** + * Store the TOPMARGIN BIFF record. + */ + private function writeMarginTop() + { + $record = 0x0028; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->phpSheet->getPageMargins()->getTop(); // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + if (self::getByteOrder()) { // if it's Big Endian + $data = strrev($data); + } + + $this->append($header . $data); + } + + /** + * Store the BOTTOMMARGIN BIFF record. + */ + private function writeMarginBottom() + { + $record = 0x0029; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->phpSheet->getPageMargins()->getBottom(); // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + if (self::getByteOrder()) { // if it's Big Endian + $data = strrev($data); + } + + $this->append($header . $data); + } + + /** + * Write the PRINTHEADERS BIFF record. + */ + private function writePrintHeaders() + { + $record = 0x002a; // Record identifier + $length = 0x0002; // Bytes to follow + + $fPrintRwCol = $this->_print_headers; // Boolean flag + + $header = pack("vv", $record, $length); + $data = pack("v", $fPrintRwCol); + $this->append($header . $data); + } + + /** + * Write the PRINTGRIDLINES BIFF record. Must be used in conjunction with the + * GRIDSET record. + */ + private function writePrintGridlines() + { + $record = 0x002b; // Record identifier + $length = 0x0002; // Bytes to follow + + $fPrintGrid = $this->phpSheet->getPrintGridlines() ? 1 : 0; // Boolean flag + + $header = pack("vv", $record, $length); + $data = pack("v", $fPrintGrid); + $this->append($header . $data); + } + + /** + * Write the GRIDSET BIFF record. Must be used in conjunction with the + * PRINTGRIDLINES record. + */ + private function writeGridset() + { + $record = 0x0082; // Record identifier + $length = 0x0002; // Bytes to follow + + $fGridSet = !$this->phpSheet->getPrintGridlines(); // Boolean flag + + $header = pack("vv", $record, $length); + $data = pack("v", $fGridSet); + $this->append($header . $data); + } + + /** + * Write the AUTOFILTERINFO BIFF record. This is used to configure the number of autofilter select used in the sheet. + */ + private function writeAutoFilterInfo() + { + $record = 0x009D; // Record identifier + $length = 0x0002; // Bytes to follow + + $rangeBounds = PHPExcel_Cell::rangeBoundaries($this->phpSheet->getAutoFilter()->getRange()); + $iNumFilters = 1 + $rangeBounds[1][0] - $rangeBounds[0][0]; + + $header = pack("vv", $record, $length); + $data = pack("v", $iNumFilters); + $this->append($header . $data); + } + + /** + * Write the GUTS BIFF record. This is used to configure the gutter margins + * where Excel outline symbols are displayed. The visibility of the gutters is + * controlled by a flag in WSBOOL. + * + * @see writeWsbool() + */ + private function writeGuts() + { + $record = 0x0080; // Record identifier + $length = 0x0008; // Bytes to follow + + $dxRwGut = 0x0000; // Size of row gutter + $dxColGut = 0x0000; // Size of col gutter + + // determine maximum row outline level + $maxRowOutlineLevel = 0; + foreach ($this->phpSheet->getRowDimensions() as $rowDimension) { + $maxRowOutlineLevel = max($maxRowOutlineLevel, $rowDimension->getOutlineLevel()); + } + + $col_level = 0; + + // Calculate the maximum column outline level. The equivalent calculation + // for the row outline level is carried out in writeRow(). + $colcount = count($this->columnInfo); + for ($i = 0; $i < $colcount; ++$i) { + $col_level = max($this->columnInfo[$i][5], $col_level); + } + + // Set the limits for the outline levels (0 <= x <= 7). + $col_level = max(0, min($col_level, 7)); + + // The displayed level is one greater than the max outline levels + if ($maxRowOutlineLevel) { + ++$maxRowOutlineLevel; + } + if ($col_level) { + ++$col_level; + } + + $header = pack("vv", $record, $length); + $data = pack("vvvv", $dxRwGut, $dxColGut, $maxRowOutlineLevel, $col_level); + + $this->append($header.$data); + } + + /** + * Write the WSBOOL BIFF record, mainly for fit-to-page. Used in conjunction + * with the SETUP record. + */ + private function writeWsbool() + { + $record = 0x0081; // Record identifier + $length = 0x0002; // Bytes to follow + $grbit = 0x0000; + + // The only option that is of interest is the flag for fit to page. So we + // set all the options in one go. + // + // Set the option flags + $grbit |= 0x0001; // Auto page breaks visible + if ($this->outlineStyle) { + $grbit |= 0x0020; // Auto outline styles + } + if ($this->phpSheet->getShowSummaryBelow()) { + $grbit |= 0x0040; // Outline summary below + } + if ($this->phpSheet->getShowSummaryRight()) { + $grbit |= 0x0080; // Outline summary right + } + if ($this->phpSheet->getPageSetup()->getFitToPage()) { + $grbit |= 0x0100; // Page setup fit to page + } + if ($this->outlineOn) { + $grbit |= 0x0400; // Outline symbols displayed + } + + $header = pack("vv", $record, $length); + $data = pack("v", $grbit); + $this->append($header . $data); + } + + /** + * Write the HORIZONTALPAGEBREAKS and VERTICALPAGEBREAKS BIFF records. + */ + private function writeBreaks() + { + // initialize + $vbreaks = array(); + $hbreaks = array(); + + foreach ($this->phpSheet->getBreaks() as $cell => $breakType) { + // Fetch coordinates + $coordinates = PHPExcel_Cell::coordinateFromString($cell); + + // Decide what to do by the type of break + switch ($breakType) { + case PHPExcel_Worksheet::BREAK_COLUMN: + // Add to list of vertical breaks + $vbreaks[] = PHPExcel_Cell::columnIndexFromString($coordinates[0]) - 1; + break; + case PHPExcel_Worksheet::BREAK_ROW: + // Add to list of horizontal breaks + $hbreaks[] = $coordinates[1]; + break; + case PHPExcel_Worksheet::BREAK_NONE: + default: + // Nothing to do + break; + } + } + + //horizontal page breaks + if (!empty($hbreaks)) { + // Sort and filter array of page breaks + sort($hbreaks, SORT_NUMERIC); + if ($hbreaks[0] == 0) { // don't use first break if it's 0 + array_shift($hbreaks); + } + + $record = 0x001b; // Record identifier + $cbrk = count($hbreaks); // Number of page breaks + $length = 2 + 6 * $cbrk; // Bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("v", $cbrk); + + // Append each page break + foreach ($hbreaks as $hbreak) { + $data .= pack("vvv", $hbreak, 0x0000, 0x00ff); + } + + $this->append($header . $data); + } + + // vertical page breaks + if (!empty($vbreaks)) { + // 1000 vertical pagebreaks appears to be an internal Excel 5 limit. + // It is slightly higher in Excel 97/200, approx. 1026 + $vbreaks = array_slice($vbreaks, 0, 1000); + + // Sort and filter array of page breaks + sort($vbreaks, SORT_NUMERIC); + if ($vbreaks[0] == 0) { // don't use first break if it's 0 + array_shift($vbreaks); + } + + $record = 0x001a; // Record identifier + $cbrk = count($vbreaks); // Number of page breaks + $length = 2 + 6 * $cbrk; // Bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("v", $cbrk); + + // Append each page break + foreach ($vbreaks as $vbreak) { + $data .= pack("vvv", $vbreak, 0x0000, 0xffff); + } + + $this->append($header . $data); + } + } + + /** + * Set the Biff PROTECT record to indicate that the worksheet is protected. + */ + private function writeProtect() + { + // Exit unless sheet protection has been specified + if (!$this->phpSheet->getProtection()->getSheet()) { + return; + } + + $record = 0x0012; // Record identifier + $length = 0x0002; // Bytes to follow + + $fLock = 1; // Worksheet is protected + + $header = pack("vv", $record, $length); + $data = pack("v", $fLock); + + $this->append($header.$data); + } + + /** + * Write SCENPROTECT + */ + private function writeScenProtect() + { + // Exit if sheet protection is not active + if (!$this->phpSheet->getProtection()->getSheet()) { + return; + } + + // Exit if scenarios are not protected + if (!$this->phpSheet->getProtection()->getScenarios()) { + return; + } + + $record = 0x00DD; // Record identifier + $length = 0x0002; // Bytes to follow + + $header = pack('vv', $record, $length); + $data = pack('v', 1); + + $this->append($header . $data); + } + + /** + * Write OBJECTPROTECT + */ + private function writeObjectProtect() + { + // Exit if sheet protection is not active + if (!$this->phpSheet->getProtection()->getSheet()) { + return; + } + + // Exit if objects are not protected + if (!$this->phpSheet->getProtection()->getObjects()) { + return; + } + + $record = 0x0063; // Record identifier + $length = 0x0002; // Bytes to follow + + $header = pack('vv', $record, $length); + $data = pack('v', 1); + + $this->append($header . $data); + } + + /** + * Write the worksheet PASSWORD record. + */ + private function writePassword() + { + // Exit unless sheet protection and password have been specified + if (!$this->phpSheet->getProtection()->getSheet() || !$this->phpSheet->getProtection()->getPassword()) { + return; + } + + $record = 0x0013; // Record identifier + $length = 0x0002; // Bytes to follow + + $wPassword = hexdec($this->phpSheet->getProtection()->getPassword()); // Encoded password + + $header = pack("vv", $record, $length); + $data = pack("v", $wPassword); + + $this->append($header . $data); + } + + /** + * Insert a 24bit bitmap image in a worksheet. + * + * @access public + * @param integer $row The row we are going to insert the bitmap into + * @param integer $col The column we are going to insert the bitmap into + * @param mixed $bitmap The bitmap filename or GD-image resource + * @param integer $x The horizontal position (offset) of the image inside the cell. + * @param integer $y The vertical position (offset) of the image inside the cell. + * @param float $scale_x The horizontal scale + * @param float $scale_y The vertical scale + */ + public function insertBitmap($row, $col, $bitmap, $x = 0, $y = 0, $scale_x = 1, $scale_y = 1) + { + $bitmap_array = (is_resource($bitmap) ? $this->processBitmapGd($bitmap) : $this->processBitmap($bitmap)); + list($width, $height, $size, $data) = $bitmap_array; //$this->processBitmap($bitmap); + + // Scale the frame of the image. + $width *= $scale_x; + $height *= $scale_y; + + // Calculate the vertices of the image and write the OBJ record + $this->positionImage($col, $row, $x, $y, $width, $height); + + // Write the IMDATA record to store the bitmap data + $record = 0x007f; + $length = 8 + $size; + $cf = 0x09; + $env = 0x01; + $lcb = $size; + + $header = pack("vvvvV", $record, $length, $cf, $env, $lcb); + $this->append($header.$data); + } + + /** + * Calculate the vertices that define the position of the image as required by + * the OBJ record. + * + * +------------+------------+ + * | A | B | + * +-----+------------+------------+ + * | |(x1,y1) | | + * | 1 |(A1)._______|______ | + * | | | | | + * | | | | | + * +-----+----| BITMAP |-----+ + * | | | | | + * | 2 | |______________. | + * | | | (B2)| + * | | | (x2,y2)| + * +---- +------------+------------+ + * + * Example of a bitmap that covers some of the area from cell A1 to cell B2. + * + * Based on the width and height of the bitmap we need to calculate 8 vars: + * $col_start, $row_start, $col_end, $row_end, $x1, $y1, $x2, $y2. + * The width and height of the cells are also variable and have to be taken into + * account. + * The values of $col_start and $row_start are passed in from the calling + * function. The values of $col_end and $row_end are calculated by subtracting + * the width and height of the bitmap from the width and height of the + * underlying cells. + * The vertices are expressed as a percentage of the underlying cell width as + * follows (rhs values are in pixels): + * + * x1 = X / W *1024 + * y1 = Y / H *256 + * x2 = (X-1) / W *1024 + * y2 = (Y-1) / H *256 + * + * Where: X is distance from the left side of the underlying cell + * Y is distance from the top of the underlying cell + * W is the width of the cell + * H is the height of the cell + * The SDK incorrectly states that the height should be expressed as a + * percentage of 1024. + * + * @access private + * @param integer $col_start Col containing upper left corner of object + * @param integer $row_start Row containing top left corner of object + * @param integer $x1 Distance to left side of object + * @param integer $y1 Distance to top of object + * @param integer $width Width of image frame + * @param integer $height Height of image frame + */ + public function positionImage($col_start, $row_start, $x1, $y1, $width, $height) + { + // Initialise end cell to the same as the start cell + $col_end = $col_start; // Col containing lower right corner of object + $row_end = $row_start; // Row containing bottom right corner of object + + // Zero the specified offset if greater than the cell dimensions + if ($x1 >= PHPExcel_Shared_Excel5::sizeCol($this->phpSheet, PHPExcel_Cell::stringFromColumnIndex($col_start))) { + $x1 = 0; + } + if ($y1 >= PHPExcel_Shared_Excel5::sizeRow($this->phpSheet, $row_start + 1)) { + $y1 = 0; + } + + $width = $width + $x1 -1; + $height = $height + $y1 -1; + + // Subtract the underlying cell widths to find the end cell of the image + while ($width >= PHPExcel_Shared_Excel5::sizeCol($this->phpSheet, PHPExcel_Cell::stringFromColumnIndex($col_end))) { + $width -= PHPExcel_Shared_Excel5::sizeCol($this->phpSheet, PHPExcel_Cell::stringFromColumnIndex($col_end)); + ++$col_end; + } + + // Subtract the underlying cell heights to find the end cell of the image + while ($height >= PHPExcel_Shared_Excel5::sizeRow($this->phpSheet, $row_end + 1)) { + $height -= PHPExcel_Shared_Excel5::sizeRow($this->phpSheet, $row_end + 1); + ++$row_end; + } + + // Bitmap isn't allowed to start or finish in a hidden cell, i.e. a cell + // with zero eight or width. + // + if (PHPExcel_Shared_Excel5::sizeCol($this->phpSheet, PHPExcel_Cell::stringFromColumnIndex($col_start)) == 0) { + return; + } + if (PHPExcel_Shared_Excel5::sizeCol($this->phpSheet, PHPExcel_Cell::stringFromColumnIndex($col_end)) == 0) { + return; + } + if (PHPExcel_Shared_Excel5::sizeRow($this->phpSheet, $row_start + 1) == 0) { + return; + } + if (PHPExcel_Shared_Excel5::sizeRow($this->phpSheet, $row_end + 1) == 0) { + return; + } + + // Convert the pixel values to the percentage value expected by Excel + $x1 = $x1 / PHPExcel_Shared_Excel5::sizeCol($this->phpSheet, PHPExcel_Cell::stringFromColumnIndex($col_start)) * 1024; + $y1 = $y1 / PHPExcel_Shared_Excel5::sizeRow($this->phpSheet, $row_start + 1) * 256; + $x2 = $width / PHPExcel_Shared_Excel5::sizeCol($this->phpSheet, PHPExcel_Cell::stringFromColumnIndex($col_end)) * 1024; // Distance to right side of object + $y2 = $height / PHPExcel_Shared_Excel5::sizeRow($this->phpSheet, $row_end + 1) * 256; // Distance to bottom of object + + $this->writeObjPicture($col_start, $x1, $row_start, $y1, $col_end, $x2, $row_end, $y2); + } + + /** + * Store the OBJ record that precedes an IMDATA record. This could be generalise + * to support other Excel objects. + * + * @param integer $colL Column containing upper left corner of object + * @param integer $dxL Distance from left side of cell + * @param integer $rwT Row containing top left corner of object + * @param integer $dyT Distance from top of cell + * @param integer $colR Column containing lower right corner of object + * @param integer $dxR Distance from right of cell + * @param integer $rwB Row containing bottom right corner of object + * @param integer $dyB Distance from bottom of cell + */ + private function writeObjPicture($colL, $dxL, $rwT, $dyT, $colR, $dxR, $rwB, $dyB) + { + $record = 0x005d; // Record identifier + $length = 0x003c; // Bytes to follow + + $cObj = 0x0001; // Count of objects in file (set to 1) + $OT = 0x0008; // Object type. 8 = Picture + $id = 0x0001; // Object ID + $grbit = 0x0614; // Option flags + + $cbMacro = 0x0000; // Length of FMLA structure + $Reserved1 = 0x0000; // Reserved + $Reserved2 = 0x0000; // Reserved + + $icvBack = 0x09; // Background colour + $icvFore = 0x09; // Foreground colour + $fls = 0x00; // Fill pattern + $fAuto = 0x00; // Automatic fill + $icv = 0x08; // Line colour + $lns = 0xff; // Line style + $lnw = 0x01; // Line weight + $fAutoB = 0x00; // Automatic border + $frs = 0x0000; // Frame style + $cf = 0x0009; // Image format, 9 = bitmap + $Reserved3 = 0x0000; // Reserved + $cbPictFmla = 0x0000; // Length of FMLA structure + $Reserved4 = 0x0000; // Reserved + $grbit2 = 0x0001; // Option flags + $Reserved5 = 0x0000; // Reserved + + + $header = pack("vv", $record, $length); + $data = pack("V", $cObj); + $data .= pack("v", $OT); + $data .= pack("v", $id); + $data .= pack("v", $grbit); + $data .= pack("v", $colL); + $data .= pack("v", $dxL); + $data .= pack("v", $rwT); + $data .= pack("v", $dyT); + $data .= pack("v", $colR); + $data .= pack("v", $dxR); + $data .= pack("v", $rwB); + $data .= pack("v", $dyB); + $data .= pack("v", $cbMacro); + $data .= pack("V", $Reserved1); + $data .= pack("v", $Reserved2); + $data .= pack("C", $icvBack); + $data .= pack("C", $icvFore); + $data .= pack("C", $fls); + $data .= pack("C", $fAuto); + $data .= pack("C", $icv); + $data .= pack("C", $lns); + $data .= pack("C", $lnw); + $data .= pack("C", $fAutoB); + $data .= pack("v", $frs); + $data .= pack("V", $cf); + $data .= pack("v", $Reserved3); + $data .= pack("v", $cbPictFmla); + $data .= pack("v", $Reserved4); + $data .= pack("v", $grbit2); + $data .= pack("V", $Reserved5); + + $this->append($header . $data); + } + + /** + * Convert a GD-image into the internal format. + * + * @access private + * @param resource $image The image to process + * @return array Array with data and properties of the bitmap + */ + public function processBitmapGd($image) + { + $width = imagesx($image); + $height = imagesy($image); + + $data = pack("Vvvvv", 0x000c, $width, $height, 0x01, 0x18); + for ($j=$height; $j--;) { + for ($i=0; $i < $width; ++$i) { + $color = imagecolorsforindex($image, imagecolorat($image, $i, $j)); + foreach (array("red", "green", "blue") as $key) { + $color[$key] = $color[$key] + round((255 - $color[$key]) * $color["alpha"] / 127); + } + $data .= chr($color["blue"]) . chr($color["green"]) . chr($color["red"]); + } + if (3*$width % 4) { + $data .= str_repeat("\x00", 4 - 3*$width % 4); + } + } + + return array($width, $height, strlen($data), $data); + } + + /** + * Convert a 24 bit bitmap into the modified internal format used by Windows. + * This is described in BITMAPCOREHEADER and BITMAPCOREINFO structures in the + * MSDN library. + * + * @access private + * @param string $bitmap The bitmap to process + * @return array Array with data and properties of the bitmap + */ + public function processBitmap($bitmap) + { + // Open file. + $bmp_fd = @fopen($bitmap, "rb"); + if (!$bmp_fd) { + throw new PHPExcel_Writer_Exception("Couldn't import $bitmap"); + } + + // Slurp the file into a string. + $data = fread($bmp_fd, filesize($bitmap)); + + // Check that the file is big enough to be a bitmap. + if (strlen($data) <= 0x36) { + throw new PHPExcel_Writer_Exception("$bitmap doesn't contain enough data.\n"); + } + + // The first 2 bytes are used to identify the bitmap. + $identity = unpack("A2ident", $data); + if ($identity['ident'] != "BM") { + throw new PHPExcel_Writer_Exception("$bitmap doesn't appear to be a valid bitmap image.\n"); + } + + // Remove bitmap data: ID. + $data = substr($data, 2); + + // Read and remove the bitmap size. This is more reliable than reading + // the data size at offset 0x22. + // + $size_array = unpack("Vsa", substr($data, 0, 4)); + $size = $size_array['sa']; + $data = substr($data, 4); + $size -= 0x36; // Subtract size of bitmap header. + $size += 0x0C; // Add size of BIFF header. + + // Remove bitmap data: reserved, offset, header length. + $data = substr($data, 12); + + // Read and remove the bitmap width and height. Verify the sizes. + $width_and_height = unpack("V2", substr($data, 0, 8)); + $width = $width_and_height[1]; + $height = $width_and_height[2]; + $data = substr($data, 8); + if ($width > 0xFFFF) { + throw new PHPExcel_Writer_Exception("$bitmap: largest image width supported is 65k.\n"); + } + if ($height > 0xFFFF) { + throw new PHPExcel_Writer_Exception("$bitmap: largest image height supported is 65k.\n"); + } + + // Read and remove the bitmap planes and bpp data. Verify them. + $planes_and_bitcount = unpack("v2", substr($data, 0, 4)); + $data = substr($data, 4); + if ($planes_and_bitcount[2] != 24) { // Bitcount + throw new PHPExcel_Writer_Exception("$bitmap isn't a 24bit true color bitmap.\n"); + } + if ($planes_and_bitcount[1] != 1) { + throw new PHPExcel_Writer_Exception("$bitmap: only 1 plane supported in bitmap image.\n"); + } + + // Read and remove the bitmap compression. Verify compression. + $compression = unpack("Vcomp", substr($data, 0, 4)); + $data = substr($data, 4); + + //$compression = 0; + if ($compression['comp'] != 0) { + throw new PHPExcel_Writer_Exception("$bitmap: compression not supported in bitmap image.\n"); + } + + // Remove bitmap data: data size, hres, vres, colours, imp. colours. + $data = substr($data, 20); + + // Add the BITMAPCOREHEADER data + $header = pack("Vvvvv", 0x000c, $width, $height, 0x01, 0x18); + $data = $header . $data; + + return (array($width, $height, $size, $data)); + } + + /** + * Store the window zoom factor. This should be a reduced fraction but for + * simplicity we will store all fractions with a numerator of 100. + */ + private function writeZoom() + { + // If scale is 100 we don't need to write a record + if ($this->phpSheet->getSheetView()->getZoomScale() == 100) { + return; + } + + $record = 0x00A0; // Record identifier + $length = 0x0004; // Bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("vv", $this->phpSheet->getSheetView()->getZoomScale(), 100); + $this->append($header . $data); + } + + /** + * Get Escher object + * + * @return PHPExcel_Shared_Escher + */ + public function getEscher() + { + return $this->escher; + } + + /** + * Set Escher object + * + * @param PHPExcel_Shared_Escher $pValue + */ + public function setEscher(PHPExcel_Shared_Escher $pValue = null) + { + $this->escher = $pValue; + } + + /** + * Write MSODRAWING record + */ + private function writeMsoDrawing() + { + // write the Escher stream if necessary + if (isset($this->escher)) { + $writer = new PHPExcel_Writer_Excel5_Escher($this->escher); + $data = $writer->close(); + $spOffsets = $writer->getSpOffsets(); + $spTypes = $writer->getSpTypes(); + // write the neccesary MSODRAWING, OBJ records + + // split the Escher stream + $spOffsets[0] = 0; + $nm = count($spOffsets) - 1; // number of shapes excluding first shape + for ($i = 1; $i <= $nm; ++$i) { + // MSODRAWING record + $record = 0x00EC; // Record identifier + + // chunk of Escher stream for one shape + $dataChunk = substr($data, $spOffsets[$i -1], $spOffsets[$i] - $spOffsets[$i - 1]); + + $length = strlen($dataChunk); + $header = pack("vv", $record, $length); + + $this->append($header . $dataChunk); + + // OBJ record + $record = 0x005D; // record identifier + $objData = ''; + + // ftCmo + if ($spTypes[$i] == 0x00C9) { + // Add ftCmo (common object data) subobject + $objData .= + pack( + 'vvvvvVVV', + 0x0015, // 0x0015 = ftCmo + 0x0012, // length of ftCmo data + 0x0014, // object type, 0x0014 = filter + $i, // object id number, Excel seems to use 1-based index, local for the sheet + 0x2101, // option flags, 0x2001 is what OpenOffice.org uses + 0, // reserved + 0, // reserved + 0 // reserved + ); + + // Add ftSbs Scroll bar subobject + $objData .= pack('vv', 0x00C, 0x0014); + $objData .= pack('H*', '0000000000000000640001000A00000010000100'); + // Add ftLbsData (List box data) subobject + $objData .= pack('vv', 0x0013, 0x1FEE); + $objData .= pack('H*', '00000000010001030000020008005700'); + } else { + // Add ftCmo (common object data) subobject + $objData .= + pack( + 'vvvvvVVV', + 0x0015, // 0x0015 = ftCmo + 0x0012, // length of ftCmo data + 0x0008, // object type, 0x0008 = picture + $i, // object id number, Excel seems to use 1-based index, local for the sheet + 0x6011, // option flags, 0x6011 is what OpenOffice.org uses + 0, // reserved + 0, // reserved + 0 // reserved + ); + } + + // ftEnd + $objData .= + pack( + 'vv', + 0x0000, // 0x0000 = ftEnd + 0x0000 // length of ftEnd data + ); + + $length = strlen($objData); + $header = pack('vv', $record, $length); + $this->append($header . $objData); + } + } + } + + /** + * Store the DATAVALIDATIONS and DATAVALIDATION records. + */ + private function writeDataValidity() + { + // Datavalidation collection + $dataValidationCollection = $this->phpSheet->getDataValidationCollection(); + + // Write data validations? + if (!empty($dataValidationCollection)) { + // DATAVALIDATIONS record + $record = 0x01B2; // Record identifier + $length = 0x0012; // Bytes to follow + + $grbit = 0x0000; // Prompt box at cell, no cached validity data at DV records + $horPos = 0x00000000; // Horizontal position of prompt box, if fixed position + $verPos = 0x00000000; // Vertical position of prompt box, if fixed position + $objId = 0xFFFFFFFF; // Object identifier of drop down arrow object, or -1 if not visible + + $header = pack('vv', $record, $length); + $data = pack('vVVVV', $grbit, $horPos, $verPos, $objId, count($dataValidationCollection)); + $this->append($header.$data); + + // DATAVALIDATION records + $record = 0x01BE; // Record identifier + + foreach ($dataValidationCollection as $cellCoordinate => $dataValidation) { + // initialize record data + $data = ''; + + // options + $options = 0x00000000; + + // data type + $type = $dataValidation->getType(); + switch ($type) { + case PHPExcel_Cell_DataValidation::TYPE_NONE: + $type = 0x00; + break; + case PHPExcel_Cell_DataValidation::TYPE_WHOLE: + $type = 0x01; + break; + case PHPExcel_Cell_DataValidation::TYPE_DECIMAL: + $type = 0x02; + break; + case PHPExcel_Cell_DataValidation::TYPE_LIST: + $type = 0x03; + break; + case PHPExcel_Cell_DataValidation::TYPE_DATE: + $type = 0x04; + break; + case PHPExcel_Cell_DataValidation::TYPE_TIME: + $type = 0x05; + break; + case PHPExcel_Cell_DataValidation::TYPE_TEXTLENGTH: + $type = 0x06; + break; + case PHPExcel_Cell_DataValidation::TYPE_CUSTOM: + $type = 0x07; + break; + } + $options |= $type << 0; + + // error style + $errorStyle = $dataValidation->getType(); + switch ($errorStyle) { + case PHPExcel_Cell_DataValidation::STYLE_STOP: + $errorStyle = 0x00; + break; + case PHPExcel_Cell_DataValidation::STYLE_WARNING: + $errorStyle = 0x01; + break; + case PHPExcel_Cell_DataValidation::STYLE_INFORMATION: + $errorStyle = 0x02; + break; + } + $options |= $errorStyle << 4; + + // explicit formula? + if ($type == 0x03 && preg_match('/^\".*\"$/', $dataValidation->getFormula1())) { + $options |= 0x01 << 7; + } + + // empty cells allowed + $options |= $dataValidation->getAllowBlank() << 8; + + // show drop down + $options |= (!$dataValidation->getShowDropDown()) << 9; + + // show input message + $options |= $dataValidation->getShowInputMessage() << 18; + + // show error message + $options |= $dataValidation->getShowErrorMessage() << 19; + + // condition operator + $operator = $dataValidation->getOperator(); + switch ($operator) { + case PHPExcel_Cell_DataValidation::OPERATOR_BETWEEN: + $operator = 0x00; + break; + case PHPExcel_Cell_DataValidation::OPERATOR_NOTBETWEEN: + $operator = 0x01; + break; + case PHPExcel_Cell_DataValidation::OPERATOR_EQUAL: + $operator = 0x02; + break; + case PHPExcel_Cell_DataValidation::OPERATOR_NOTEQUAL: + $operator = 0x03; + break; + case PHPExcel_Cell_DataValidation::OPERATOR_GREATERTHAN: + $operator = 0x04; + break; + case PHPExcel_Cell_DataValidation::OPERATOR_LESSTHAN: + $operator = 0x05; + break; + case PHPExcel_Cell_DataValidation::OPERATOR_GREATERTHANOREQUAL: + $operator = 0x06; + break; + case PHPExcel_Cell_DataValidation::OPERATOR_LESSTHANOREQUAL: + $operator = 0x07; + break; + } + $options |= $operator << 20; + + $data = pack('V', $options); + + // prompt title + $promptTitle = $dataValidation->getPromptTitle() !== '' ? + $dataValidation->getPromptTitle() : chr(0); + $data .= PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($promptTitle); + + // error title + $errorTitle = $dataValidation->getErrorTitle() !== '' ? + $dataValidation->getErrorTitle() : chr(0); + $data .= PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($errorTitle); + + // prompt text + $prompt = $dataValidation->getPrompt() !== '' ? + $dataValidation->getPrompt() : chr(0); + $data .= PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($prompt); + + // error text + $error = $dataValidation->getError() !== '' ? + $dataValidation->getError() : chr(0); + $data .= PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($error); + + // formula 1 + try { + $formula1 = $dataValidation->getFormula1(); + if ($type == 0x03) { // list type + $formula1 = str_replace(',', chr(0), $formula1); + } + $this->parser->parse($formula1); + $formula1 = $this->parser->toReversePolish(); + $sz1 = strlen($formula1); + } catch (PHPExcel_Exception $e) { + $sz1 = 0; + $formula1 = ''; + } + $data .= pack('vv', $sz1, 0x0000); + $data .= $formula1; + + // formula 2 + try { + $formula2 = $dataValidation->getFormula2(); + if ($formula2 === '') { + throw new PHPExcel_Writer_Exception('No formula2'); + } + $this->parser->parse($formula2); + $formula2 = $this->parser->toReversePolish(); + $sz2 = strlen($formula2); + } catch (PHPExcel_Exception $e) { + $sz2 = 0; + $formula2 = ''; + } + $data .= pack('vv', $sz2, 0x0000); + $data .= $formula2; + + // cell range address list + $data .= pack('v', 0x0001); + $data .= $this->writeBIFF8CellRangeAddressFixed($cellCoordinate); + + $length = strlen($data); + $header = pack("vv", $record, $length); + + $this->append($header . $data); + } + } + } + + /** + * Map Error code + * + * @param string $errorCode + * @return int + */ + private static function mapErrorCode($errorCode) + { + switch ($errorCode) { + case '#NULL!': + return 0x00; + case '#DIV/0!': + return 0x07; + case '#VALUE!': + return 0x0F; + case '#REF!': + return 0x17; + case '#NAME?': + return 0x1D; + case '#NUM!': + return 0x24; + case '#N/A': + return 0x2A; + } + + return 0; + } + + /** + * Write PLV Record + */ + private function writePageLayoutView() + { + $record = 0x088B; // Record identifier + $length = 0x0010; // Bytes to follow + + $rt = 0x088B; // 2 + $grbitFrt = 0x0000; // 2 + $reserved = 0x0000000000000000; // 8 + $wScalvePLV = $this->phpSheet->getSheetView()->getZoomScale(); // 2 + + // The options flags that comprise $grbit + if ($this->phpSheet->getSheetView()->getView() == PHPExcel_Worksheet_SheetView::SHEETVIEW_PAGE_LAYOUT) { + $fPageLayoutView = 1; + } else { + $fPageLayoutView = 0; + } + $fRulerVisible = 0; + $fWhitespaceHidden = 0; + + $grbit = $fPageLayoutView; // 2 + $grbit |= $fRulerVisible << 1; + $grbit |= $fWhitespaceHidden << 3; + + $header = pack("vv", $record, $length); + $data = pack("vvVVvv", $rt, $grbitFrt, 0x00000000, 0x00000000, $wScalvePLV, $grbit); + $this->append($header . $data); + } + + /** + * Write CFRule Record + * @param PHPExcel_Style_Conditional $conditional + */ + private function writeCFRule(PHPExcel_Style_Conditional $conditional) + { + $record = 0x01B1; // Record identifier + + // $type : Type of the CF + // $operatorType : Comparison operator + if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_EXPRESSION) { + $type = 0x02; + $operatorType = 0x00; + } elseif ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CELLIS) { + $type = 0x01; + + switch ($conditional->getOperatorType()) { + case PHPExcel_Style_Conditional::OPERATOR_NONE: + $operatorType = 0x00; + break; + case PHPExcel_Style_Conditional::OPERATOR_EQUAL: + $operatorType = 0x03; + break; + case PHPExcel_Style_Conditional::OPERATOR_GREATERTHAN: + $operatorType = 0x05; + break; + case PHPExcel_Style_Conditional::OPERATOR_GREATERTHANOREQUAL: + $operatorType = 0x07; + break; + case PHPExcel_Style_Conditional::OPERATOR_LESSTHAN: + $operatorType = 0x06; + break; + case PHPExcel_Style_Conditional::OPERATOR_LESSTHANOREQUAL: + $operatorType = 0x08; + break; + case PHPExcel_Style_Conditional::OPERATOR_NOTEQUAL: + $operatorType = 0x04; + break; + case PHPExcel_Style_Conditional::OPERATOR_BETWEEN: + $operatorType = 0x01; + break; + // not OPERATOR_NOTBETWEEN 0x02 + } + } + + // $szValue1 : size of the formula data for first value or formula + // $szValue2 : size of the formula data for second value or formula + $arrConditions = $conditional->getConditions(); + $numConditions = sizeof($arrConditions); + if ($numConditions == 1) { + $szValue1 = ($arrConditions[0] <= 65535 ? 3 : 0x0000); + $szValue2 = 0x0000; + $operand1 = pack('Cv', 0x1E, $arrConditions[0]); + $operand2 = null; + } elseif ($numConditions == 2 && ($conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_BETWEEN)) { + $szValue1 = ($arrConditions[0] <= 65535 ? 3 : 0x0000); + $szValue2 = ($arrConditions[1] <= 65535 ? 3 : 0x0000); + $operand1 = pack('Cv', 0x1E, $arrConditions[0]); + $operand2 = pack('Cv', 0x1E, $arrConditions[1]); + } else { + $szValue1 = 0x0000; + $szValue2 = 0x0000; + $operand1 = null; + $operand2 = null; + } + + // $flags : Option flags + // Alignment + $bAlignHz = ($conditional->getStyle()->getAlignment()->getHorizontal() == null ? 1 : 0); + $bAlignVt = ($conditional->getStyle()->getAlignment()->getVertical() == null ? 1 : 0); + $bAlignWrapTx = ($conditional->getStyle()->getAlignment()->getWrapText() == false ? 1 : 0); + $bTxRotation = ($conditional->getStyle()->getAlignment()->getTextRotation() == null ? 1 : 0); + $bIndent = ($conditional->getStyle()->getAlignment()->getIndent() == 0 ? 1 : 0); + $bShrinkToFit = ($conditional->getStyle()->getAlignment()->getShrinkToFit() == false ? 1 : 0); + if ($bAlignHz == 0 || $bAlignVt == 0 || $bAlignWrapTx == 0 || $bTxRotation == 0 || $bIndent == 0 || $bShrinkToFit == 0) { + $bFormatAlign = 1; + } else { + $bFormatAlign = 0; + } + // Protection + $bProtLocked = ($conditional->getStyle()->getProtection()->getLocked() == null ? 1 : 0); + $bProtHidden = ($conditional->getStyle()->getProtection()->getHidden() == null ? 1 : 0); + if ($bProtLocked == 0 || $bProtHidden == 0) { + $bFormatProt = 1; + } else { + $bFormatProt = 0; + } + // Border + $bBorderLeft = ($conditional->getStyle()->getBorders()->getLeft()->getColor()->getARGB() == PHPExcel_Style_Color::COLOR_BLACK + && $conditional->getStyle()->getBorders()->getLeft()->getBorderStyle() == PHPExcel_Style_Border::BORDER_NONE ? 1 : 0); + $bBorderRight = ($conditional->getStyle()->getBorders()->getRight()->getColor()->getARGB() == PHPExcel_Style_Color::COLOR_BLACK + && $conditional->getStyle()->getBorders()->getRight()->getBorderStyle() == PHPExcel_Style_Border::BORDER_NONE ? 1 : 0); + $bBorderTop = ($conditional->getStyle()->getBorders()->getTop()->getColor()->getARGB() == PHPExcel_Style_Color::COLOR_BLACK + && $conditional->getStyle()->getBorders()->getTop()->getBorderStyle() == PHPExcel_Style_Border::BORDER_NONE ? 1 : 0); + $bBorderBottom = ($conditional->getStyle()->getBorders()->getBottom()->getColor()->getARGB() == PHPExcel_Style_Color::COLOR_BLACK + && $conditional->getStyle()->getBorders()->getBottom()->getBorderStyle() == PHPExcel_Style_Border::BORDER_NONE ? 1 : 0); + if ($bBorderLeft == 0 || $bBorderRight == 0 || $bBorderTop == 0 || $bBorderBottom == 0) { + $bFormatBorder = 1; + } else { + $bFormatBorder = 0; + } + // Pattern + $bFillStyle = ($conditional->getStyle()->getFill()->getFillType() == null ? 0 : 1); + $bFillColor = ($conditional->getStyle()->getFill()->getStartColor()->getARGB() == null ? 0 : 1); + $bFillColorBg = ($conditional->getStyle()->getFill()->getEndColor()->getARGB() == null ? 0 : 1); + if ($bFillStyle == 0 || $bFillColor == 0 || $bFillColorBg == 0) { + $bFormatFill = 1; + } else { + $bFormatFill = 0; + } + // Font + if ($conditional->getStyle()->getFont()->getName() != null + || $conditional->getStyle()->getFont()->getSize() != null + || $conditional->getStyle()->getFont()->getBold() != null + || $conditional->getStyle()->getFont()->getItalic() != null + || $conditional->getStyle()->getFont()->getSuperScript() != null + || $conditional->getStyle()->getFont()->getSubScript() != null + || $conditional->getStyle()->getFont()->getUnderline() != null + || $conditional->getStyle()->getFont()->getStrikethrough() != null + || $conditional->getStyle()->getFont()->getColor()->getARGB() != null) { + $bFormatFont = 1; + } else { + $bFormatFont = 0; + } + // Alignment + $flags = 0; + $flags |= (1 == $bAlignHz ? 0x00000001 : 0); + $flags |= (1 == $bAlignVt ? 0x00000002 : 0); + $flags |= (1 == $bAlignWrapTx ? 0x00000004 : 0); + $flags |= (1 == $bTxRotation ? 0x00000008 : 0); + // Justify last line flag + $flags |= (1 == 1 ? 0x00000010 : 0); + $flags |= (1 == $bIndent ? 0x00000020 : 0); + $flags |= (1 == $bShrinkToFit ? 0x00000040 : 0); + // Default + $flags |= (1 == 1 ? 0x00000080 : 0); + // Protection + $flags |= (1 == $bProtLocked ? 0x00000100 : 0); + $flags |= (1 == $bProtHidden ? 0x00000200 : 0); + // Border + $flags |= (1 == $bBorderLeft ? 0x00000400 : 0); + $flags |= (1 == $bBorderRight ? 0x00000800 : 0); + $flags |= (1 == $bBorderTop ? 0x00001000 : 0); + $flags |= (1 == $bBorderBottom ? 0x00002000 : 0); + $flags |= (1 == 1 ? 0x00004000 : 0); // Top left to Bottom right border + $flags |= (1 == 1 ? 0x00008000 : 0); // Bottom left to Top right border + // Pattern + $flags |= (1 == $bFillStyle ? 0x00010000 : 0); + $flags |= (1 == $bFillColor ? 0x00020000 : 0); + $flags |= (1 == $bFillColorBg ? 0x00040000 : 0); + $flags |= (1 == 1 ? 0x00380000 : 0); + // Font + $flags |= (1 == $bFormatFont ? 0x04000000 : 0); + // Alignment: + $flags |= (1 == $bFormatAlign ? 0x08000000 : 0); + // Border + $flags |= (1 == $bFormatBorder ? 0x10000000 : 0); + // Pattern + $flags |= (1 == $bFormatFill ? 0x20000000 : 0); + // Protection + $flags |= (1 == $bFormatProt ? 0x40000000 : 0); + // Text direction + $flags |= (1 == 0 ? 0x80000000 : 0); + + // Data Blocks + if ($bFormatFont == 1) { + // Font Name + if ($conditional->getStyle()->getFont()->getName() == null) { + $dataBlockFont = pack('VVVVVVVV', 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000); + $dataBlockFont .= pack('VVVVVVVV', 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000); + } else { + $dataBlockFont = PHPExcel_Shared_String::UTF8toBIFF8UnicodeLong($conditional->getStyle()->getFont()->getName()); + } + // Font Size + if ($conditional->getStyle()->getFont()->getSize() == null) { + $dataBlockFont .= pack('V', 20 * 11); + } else { + $dataBlockFont .= pack('V', 20 * $conditional->getStyle()->getFont()->getSize()); + } + // Font Options + $dataBlockFont .= pack('V', 0); + // Font weight + if ($conditional->getStyle()->getFont()->getBold() == true) { + $dataBlockFont .= pack('v', 0x02BC); + } else { + $dataBlockFont .= pack('v', 0x0190); + } + // Escapement type + if ($conditional->getStyle()->getFont()->getSubScript() == true) { + $dataBlockFont .= pack('v', 0x02); + $fontEscapement = 0; + } elseif ($conditional->getStyle()->getFont()->getSuperScript() == true) { + $dataBlockFont .= pack('v', 0x01); + $fontEscapement = 0; + } else { + $dataBlockFont .= pack('v', 0x00); + $fontEscapement = 1; + } + // Underline type + switch ($conditional->getStyle()->getFont()->getUnderline()) { + case PHPExcel_Style_Font::UNDERLINE_NONE: + $dataBlockFont .= pack('C', 0x00); + $fontUnderline = 0; + break; + case PHPExcel_Style_Font::UNDERLINE_DOUBLE: + $dataBlockFont .= pack('C', 0x02); + $fontUnderline = 0; + break; + case PHPExcel_Style_Font::UNDERLINE_DOUBLEACCOUNTING: + $dataBlockFont .= pack('C', 0x22); + $fontUnderline = 0; + break; + case PHPExcel_Style_Font::UNDERLINE_SINGLE: + $dataBlockFont .= pack('C', 0x01); + $fontUnderline = 0; + break; + case PHPExcel_Style_Font::UNDERLINE_SINGLEACCOUNTING: + $dataBlockFont .= pack('C', 0x21); + $fontUnderline = 0; + break; + default: $dataBlockFont .= pack('C', 0x00); + $fontUnderline = 1; + break; + } + // Not used (3) + $dataBlockFont .= pack('vC', 0x0000, 0x00); + // Font color index + switch ($conditional->getStyle()->getFont()->getColor()->getRGB()) { + case '000000': + $colorIdx = 0x08; + break; + case 'FFFFFF': + $colorIdx = 0x09; + break; + case 'FF0000': + $colorIdx = 0x0A; + break; + case '00FF00': + $colorIdx = 0x0B; + break; + case '0000FF': + $colorIdx = 0x0C; + break; + case 'FFFF00': + $colorIdx = 0x0D; + break; + case 'FF00FF': + $colorIdx = 0x0E; + break; + case '00FFFF': + $colorIdx = 0x0F; + break; + case '800000': + $colorIdx = 0x10; + break; + case '008000': + $colorIdx = 0x11; + break; + case '000080': + $colorIdx = 0x12; + break; + case '808000': + $colorIdx = 0x13; + break; + case '800080': + $colorIdx = 0x14; + break; + case '008080': + $colorIdx = 0x15; + break; + case 'C0C0C0': + $colorIdx = 0x16; + break; + case '808080': + $colorIdx = 0x17; + break; + case '9999FF': + $colorIdx = 0x18; + break; + case '993366': + $colorIdx = 0x19; + break; + case 'FFFFCC': + $colorIdx = 0x1A; + break; + case 'CCFFFF': + $colorIdx = 0x1B; + break; + case '660066': + $colorIdx = 0x1C; + break; + case 'FF8080': + $colorIdx = 0x1D; + break; + case '0066CC': + $colorIdx = 0x1E; + break; + case 'CCCCFF': + $colorIdx = 0x1F; + break; + case '000080': + $colorIdx = 0x20; + break; + case 'FF00FF': + $colorIdx = 0x21; + break; + case 'FFFF00': + $colorIdx = 0x22; + break; + case '00FFFF': + $colorIdx = 0x23; + break; + case '800080': + $colorIdx = 0x24; + break; + case '800000': + $colorIdx = 0x25; + break; + case '008080': + $colorIdx = 0x26; + break; + case '0000FF': + $colorIdx = 0x27; + break; + case '00CCFF': + $colorIdx = 0x28; + break; + case 'CCFFFF': + $colorIdx = 0x29; + break; + case 'CCFFCC': + $colorIdx = 0x2A; + break; + case 'FFFF99': + $colorIdx = 0x2B; + break; + case '99CCFF': + $colorIdx = 0x2C; + break; + case 'FF99CC': + $colorIdx = 0x2D; + break; + case 'CC99FF': + $colorIdx = 0x2E; + break; + case 'FFCC99': + $colorIdx = 0x2F; + break; + case '3366FF': + $colorIdx = 0x30; + break; + case '33CCCC': + $colorIdx = 0x31; + break; + case '99CC00': + $colorIdx = 0x32; + break; + case 'FFCC00': + $colorIdx = 0x33; + break; + case 'FF9900': + $colorIdx = 0x34; + break; + case 'FF6600': + $colorIdx = 0x35; + break; + case '666699': + $colorIdx = 0x36; + break; + case '969696': + $colorIdx = 0x37; + break; + case '003366': + $colorIdx = 0x38; + break; + case '339966': + $colorIdx = 0x39; + break; + case '003300': + $colorIdx = 0x3A; + break; + case '333300': + $colorIdx = 0x3B; + break; + case '993300': + $colorIdx = 0x3C; + break; + case '993366': + $colorIdx = 0x3D; + break; + case '333399': + $colorIdx = 0x3E; + break; + case '333333': + $colorIdx = 0x3F; + break; + default: + $colorIdx = 0x00; + break; + } + $dataBlockFont .= pack('V', $colorIdx); + // Not used (4) + $dataBlockFont .= pack('V', 0x00000000); + // Options flags for modified font attributes + $optionsFlags = 0; + $optionsFlagsBold = ($conditional->getStyle()->getFont()->getBold() == null ? 1 : 0); + $optionsFlags |= (1 == $optionsFlagsBold ? 0x00000002 : 0); + $optionsFlags |= (1 == 1 ? 0x00000008 : 0); + $optionsFlags |= (1 == 1 ? 0x00000010 : 0); + $optionsFlags |= (1 == 0 ? 0x00000020 : 0); + $optionsFlags |= (1 == 1 ? 0x00000080 : 0); + $dataBlockFont .= pack('V', $optionsFlags); + // Escapement type + $dataBlockFont .= pack('V', $fontEscapement); + // Underline type + $dataBlockFont .= pack('V', $fontUnderline); + // Always + $dataBlockFont .= pack('V', 0x00000000); + // Always + $dataBlockFont .= pack('V', 0x00000000); + // Not used (8) + $dataBlockFont .= pack('VV', 0x00000000, 0x00000000); + // Always + $dataBlockFont .= pack('v', 0x0001); + } + if ($bFormatAlign == 1) { + $blockAlign = 0; + // Alignment and text break + switch ($conditional->getStyle()->getAlignment()->getHorizontal()) { + case PHPExcel_Style_Alignment::HORIZONTAL_GENERAL: + $blockAlign = 0; + break; + case PHPExcel_Style_Alignment::HORIZONTAL_LEFT: + $blockAlign = 1; + break; + case PHPExcel_Style_Alignment::HORIZONTAL_RIGHT: + $blockAlign = 3; + break; + case PHPExcel_Style_Alignment::HORIZONTAL_CENTER: + $blockAlign = 2; + break; + case PHPExcel_Style_Alignment::HORIZONTAL_CENTER_CONTINUOUS: + $blockAlign = 6; + break; + case PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY: + $blockAlign = 5; + break; + } + if ($conditional->getStyle()->getAlignment()->getWrapText() == true) { + $blockAlign |= 1 << 3; + } else { + $blockAlign |= 0 << 3; + } + switch ($conditional->getStyle()->getAlignment()->getVertical()) { + case PHPExcel_Style_Alignment::VERTICAL_BOTTOM: + $blockAlign = 2 << 4; + break; + case PHPExcel_Style_Alignment::VERTICAL_TOP: + $blockAlign = 0 << 4; + break; + case PHPExcel_Style_Alignment::VERTICAL_CENTER: + $blockAlign = 1 << 4; + break; + case PHPExcel_Style_Alignment::VERTICAL_JUSTIFY: + $blockAlign = 3 << 4; + break; + } + $blockAlign |= 0 << 7; + + // Text rotation angle + $blockRotation = $conditional->getStyle()->getAlignment()->getTextRotation(); + + // Indentation + $blockIndent = $conditional->getStyle()->getAlignment()->getIndent(); + if ($conditional->getStyle()->getAlignment()->getShrinkToFit() == true) { + $blockIndent |= 1 << 4; + } else { + $blockIndent |= 0 << 4; + } + $blockIndent |= 0 << 6; + + // Relative indentation + $blockIndentRelative = 255; + + $dataBlockAlign = pack('CCvvv', $blockAlign, $blockRotation, $blockIndent, $blockIndentRelative, 0x0000); + } + if ($bFormatBorder == 1) { + $blockLineStyle = 0; + switch ($conditional->getStyle()->getBorders()->getLeft()->getBorderStyle()) { + case PHPExcel_Style_Border::BORDER_NONE: + $blockLineStyle |= 0x00; + break; + case PHPExcel_Style_Border::BORDER_THIN: + $blockLineStyle |= 0x01; + break; + case PHPExcel_Style_Border::BORDER_MEDIUM: + $blockLineStyle |= 0x02; + break; + case PHPExcel_Style_Border::BORDER_DASHED: + $blockLineStyle |= 0x03; + break; + case PHPExcel_Style_Border::BORDER_DOTTED: + $blockLineStyle |= 0x04; + break; + case PHPExcel_Style_Border::BORDER_THICK: + $blockLineStyle |= 0x05; + break; + case PHPExcel_Style_Border::BORDER_DOUBLE: + $blockLineStyle |= 0x06; + break; + case PHPExcel_Style_Border::BORDER_HAIR: + $blockLineStyle |= 0x07; + break; + case PHPExcel_Style_Border::BORDER_MEDIUMDASHED: + $blockLineStyle |= 0x08; + break; + case PHPExcel_Style_Border::BORDER_DASHDOT: + $blockLineStyle |= 0x09; + break; + case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT: + $blockLineStyle |= 0x0A; + break; + case PHPExcel_Style_Border::BORDER_DASHDOTDOT: + $blockLineStyle |= 0x0B; + break; + case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT: + $blockLineStyle |= 0x0C; + break; + case PHPExcel_Style_Border::BORDER_SLANTDASHDOT: + $blockLineStyle |= 0x0D; + break; + } + switch ($conditional->getStyle()->getBorders()->getRight()->getBorderStyle()) { + case PHPExcel_Style_Border::BORDER_NONE: + $blockLineStyle |= 0x00 << 4; + break; + case PHPExcel_Style_Border::BORDER_THIN: + $blockLineStyle |= 0x01 << 4; + break; + case PHPExcel_Style_Border::BORDER_MEDIUM: + $blockLineStyle |= 0x02 << 4; + break; + case PHPExcel_Style_Border::BORDER_DASHED: + $blockLineStyle |= 0x03 << 4; + break; + case PHPExcel_Style_Border::BORDER_DOTTED: + $blockLineStyle |= 0x04 << 4; + break; + case PHPExcel_Style_Border::BORDER_THICK: + $blockLineStyle |= 0x05 << 4; + break; + case PHPExcel_Style_Border::BORDER_DOUBLE: + $blockLineStyle |= 0x06 << 4; + break; + case PHPExcel_Style_Border::BORDER_HAIR: + $blockLineStyle |= 0x07 << 4; + break; + case PHPExcel_Style_Border::BORDER_MEDIUMDASHED: + $blockLineStyle |= 0x08 << 4; + break; + case PHPExcel_Style_Border::BORDER_DASHDOT: + $blockLineStyle |= 0x09 << 4; + break; + case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT: + $blockLineStyle |= 0x0A << 4; + break; + case PHPExcel_Style_Border::BORDER_DASHDOTDOT: + $blockLineStyle |= 0x0B << 4; + break; + case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT: + $blockLineStyle |= 0x0C << 4; + break; + case PHPExcel_Style_Border::BORDER_SLANTDASHDOT: + $blockLineStyle |= 0x0D << 4; + break; + } + switch ($conditional->getStyle()->getBorders()->getTop()->getBorderStyle()) { + case PHPExcel_Style_Border::BORDER_NONE: + $blockLineStyle |= 0x00 << 8; + break; + case PHPExcel_Style_Border::BORDER_THIN: + $blockLineStyle |= 0x01 << 8; + break; + case PHPExcel_Style_Border::BORDER_MEDIUM: + $blockLineStyle |= 0x02 << 8; + break; + case PHPExcel_Style_Border::BORDER_DASHED: + $blockLineStyle |= 0x03 << 8; + break; + case PHPExcel_Style_Border::BORDER_DOTTED: + $blockLineStyle |= 0x04 << 8; + break; + case PHPExcel_Style_Border::BORDER_THICK: + $blockLineStyle |= 0x05 << 8; + break; + case PHPExcel_Style_Border::BORDER_DOUBLE: + $blockLineStyle |= 0x06 << 8; + break; + case PHPExcel_Style_Border::BORDER_HAIR: + $blockLineStyle |= 0x07 << 8; + break; + case PHPExcel_Style_Border::BORDER_MEDIUMDASHED: + $blockLineStyle |= 0x08 << 8; + break; + case PHPExcel_Style_Border::BORDER_DASHDOT: + $blockLineStyle |= 0x09 << 8; + break; + case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT: + $blockLineStyle |= 0x0A << 8; + break; + case PHPExcel_Style_Border::BORDER_DASHDOTDOT: + $blockLineStyle |= 0x0B << 8; + break; + case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT: + $blockLineStyle |= 0x0C << 8; + break; + case PHPExcel_Style_Border::BORDER_SLANTDASHDOT: + $blockLineStyle |= 0x0D << 8; + break; + } + switch ($conditional->getStyle()->getBorders()->getBottom()->getBorderStyle()) { + case PHPExcel_Style_Border::BORDER_NONE: + $blockLineStyle |= 0x00 << 12; + break; + case PHPExcel_Style_Border::BORDER_THIN: + $blockLineStyle |= 0x01 << 12; + break; + case PHPExcel_Style_Border::BORDER_MEDIUM: + $blockLineStyle |= 0x02 << 12; + break; + case PHPExcel_Style_Border::BORDER_DASHED: + $blockLineStyle |= 0x03 << 12; + break; + case PHPExcel_Style_Border::BORDER_DOTTED: + $blockLineStyle |= 0x04 << 12; + break; + case PHPExcel_Style_Border::BORDER_THICK: + $blockLineStyle |= 0x05 << 12; + break; + case PHPExcel_Style_Border::BORDER_DOUBLE: + $blockLineStyle |= 0x06 << 12; + break; + case PHPExcel_Style_Border::BORDER_HAIR: + $blockLineStyle |= 0x07 << 12; + break; + case PHPExcel_Style_Border::BORDER_MEDIUMDASHED: + $blockLineStyle |= 0x08 << 12; + break; + case PHPExcel_Style_Border::BORDER_DASHDOT: + $blockLineStyle |= 0x09 << 12; + break; + case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT: + $blockLineStyle |= 0x0A << 12; + break; + case PHPExcel_Style_Border::BORDER_DASHDOTDOT: + $blockLineStyle |= 0x0B << 12; + break; + case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT: + $blockLineStyle |= 0x0C << 12; + break; + case PHPExcel_Style_Border::BORDER_SLANTDASHDOT: + $blockLineStyle |= 0x0D << 12; + break; + } + //@todo writeCFRule() => $blockLineStyle => Index Color for left line + //@todo writeCFRule() => $blockLineStyle => Index Color for right line + //@todo writeCFRule() => $blockLineStyle => Top-left to bottom-right on/off + //@todo writeCFRule() => $blockLineStyle => Bottom-left to top-right on/off + $blockColor = 0; + //@todo writeCFRule() => $blockColor => Index Color for top line + //@todo writeCFRule() => $blockColor => Index Color for bottom line + //@todo writeCFRule() => $blockColor => Index Color for diagonal line + switch ($conditional->getStyle()->getBorders()->getDiagonal()->getBorderStyle()) { + case PHPExcel_Style_Border::BORDER_NONE: + $blockColor |= 0x00 << 21; + break; + case PHPExcel_Style_Border::BORDER_THIN: + $blockColor |= 0x01 << 21; + break; + case PHPExcel_Style_Border::BORDER_MEDIUM: + $blockColor |= 0x02 << 21; + break; + case PHPExcel_Style_Border::BORDER_DASHED: + $blockColor |= 0x03 << 21; + break; + case PHPExcel_Style_Border::BORDER_DOTTED: + $blockColor |= 0x04 << 21; + break; + case PHPExcel_Style_Border::BORDER_THICK: + $blockColor |= 0x05 << 21; + break; + case PHPExcel_Style_Border::BORDER_DOUBLE: + $blockColor |= 0x06 << 21; + break; + case PHPExcel_Style_Border::BORDER_HAIR: + $blockColor |= 0x07 << 21; + break; + case PHPExcel_Style_Border::BORDER_MEDIUMDASHED: + $blockColor |= 0x08 << 21; + break; + case PHPExcel_Style_Border::BORDER_DASHDOT: + $blockColor |= 0x09 << 21; + break; + case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT: + $blockColor |= 0x0A << 21; + break; + case PHPExcel_Style_Border::BORDER_DASHDOTDOT: + $blockColor |= 0x0B << 21; + break; + case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT: + $blockColor |= 0x0C << 21; + break; + case PHPExcel_Style_Border::BORDER_SLANTDASHDOT: + $blockColor |= 0x0D << 21; + break; + } + $dataBlockBorder = pack('vv', $blockLineStyle, $blockColor); + } + if ($bFormatFill == 1) { + // Fill Patern Style + $blockFillPatternStyle = 0; + switch ($conditional->getStyle()->getFill()->getFillType()) { + case PHPExcel_Style_Fill::FILL_NONE: + $blockFillPatternStyle = 0x00; + break; + case PHPExcel_Style_Fill::FILL_SOLID: + $blockFillPatternStyle = 0x01; + break; + case PHPExcel_Style_Fill::FILL_PATTERN_MEDIUMGRAY: + $blockFillPatternStyle = 0x02; + break; + case PHPExcel_Style_Fill::FILL_PATTERN_DARKGRAY: + $blockFillPatternStyle = 0x03; + break; + case PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRAY: + $blockFillPatternStyle = 0x04; + break; + case PHPExcel_Style_Fill::FILL_PATTERN_DARKHORIZONTAL: + $blockFillPatternStyle = 0x05; + break; + case PHPExcel_Style_Fill::FILL_PATTERN_DARKVERTICAL: + $blockFillPatternStyle = 0x06; + break; + case PHPExcel_Style_Fill::FILL_PATTERN_DARKDOWN: + $blockFillPatternStyle = 0x07; + break; + case PHPExcel_Style_Fill::FILL_PATTERN_DARKUP: + $blockFillPatternStyle = 0x08; + break; + case PHPExcel_Style_Fill::FILL_PATTERN_DARKGRID: + $blockFillPatternStyle = 0x09; + break; + case PHPExcel_Style_Fill::FILL_PATTERN_DARKTRELLIS: + $blockFillPatternStyle = 0x0A; + break; + case PHPExcel_Style_Fill::FILL_PATTERN_LIGHTHORIZONTAL: + $blockFillPatternStyle = 0x0B; + break; + case PHPExcel_Style_Fill::FILL_PATTERN_LIGHTVERTICAL: + $blockFillPatternStyle = 0x0C; + break; + case PHPExcel_Style_Fill::FILL_PATTERN_LIGHTDOWN: + $blockFillPatternStyle = 0x0D; + break; + case PHPExcel_Style_Fill::FILL_PATTERN_LIGHTUP: + $blockFillPatternStyle = 0x0E; + break; + case PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRID: + $blockFillPatternStyle = 0x0F; + break; + case PHPExcel_Style_Fill::FILL_PATTERN_LIGHTTRELLIS: + $blockFillPatternStyle = 0x10; + break; + case PHPExcel_Style_Fill::FILL_PATTERN_GRAY125: + $blockFillPatternStyle = 0x11; + break; + case PHPExcel_Style_Fill::FILL_PATTERN_GRAY0625: + $blockFillPatternStyle = 0x12; + break; + case PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR: + $blockFillPatternStyle = 0x00; + break; // does not exist in BIFF8 + case PHPExcel_Style_Fill::FILL_GRADIENT_PATH: + $blockFillPatternStyle = 0x00; + break; // does not exist in BIFF8 + default: + $blockFillPatternStyle = 0x00; + break; + } + // Color + switch ($conditional->getStyle()->getFill()->getStartColor()->getRGB()) { + case '000000': + $colorIdxBg = 0x08; + break; + case 'FFFFFF': + $colorIdxBg = 0x09; + break; + case 'FF0000': + $colorIdxBg = 0x0A; + break; + case '00FF00': + $colorIdxBg = 0x0B; + break; + case '0000FF': + $colorIdxBg = 0x0C; + break; + case 'FFFF00': + $colorIdxBg = 0x0D; + break; + case 'FF00FF': + $colorIdxBg = 0x0E; + break; + case '00FFFF': + $colorIdxBg = 0x0F; + break; + case '800000': + $colorIdxBg = 0x10; + break; + case '008000': + $colorIdxBg = 0x11; + break; + case '000080': + $colorIdxBg = 0x12; + break; + case '808000': + $colorIdxBg = 0x13; + break; + case '800080': + $colorIdxBg = 0x14; + break; + case '008080': + $colorIdxBg = 0x15; + break; + case 'C0C0C0': + $colorIdxBg = 0x16; + break; + case '808080': + $colorIdxBg = 0x17; + break; + case '9999FF': + $colorIdxBg = 0x18; + break; + case '993366': + $colorIdxBg = 0x19; + break; + case 'FFFFCC': + $colorIdxBg = 0x1A; + break; + case 'CCFFFF': + $colorIdxBg = 0x1B; + break; + case '660066': + $colorIdxBg = 0x1C; + break; + case 'FF8080': + $colorIdxBg = 0x1D; + break; + case '0066CC': + $colorIdxBg = 0x1E; + break; + case 'CCCCFF': + $colorIdxBg = 0x1F; + break; + case '000080': + $colorIdxBg = 0x20; + break; + case 'FF00FF': + $colorIdxBg = 0x21; + break; + case 'FFFF00': + $colorIdxBg = 0x22; + break; + case '00FFFF': + $colorIdxBg = 0x23; + break; + case '800080': + $colorIdxBg = 0x24; + break; + case '800000': + $colorIdxBg = 0x25; + break; + case '008080': + $colorIdxBg = 0x26; + break; + case '0000FF': + $colorIdxBg = 0x27; + break; + case '00CCFF': + $colorIdxBg = 0x28; + break; + case 'CCFFFF': + $colorIdxBg = 0x29; + break; + case 'CCFFCC': + $colorIdxBg = 0x2A; + break; + case 'FFFF99': + $colorIdxBg = 0x2B; + break; + case '99CCFF': + $colorIdxBg = 0x2C; + break; + case 'FF99CC': + $colorIdxBg = 0x2D; + break; + case 'CC99FF': + $colorIdxBg = 0x2E; + break; + case 'FFCC99': + $colorIdxBg = 0x2F; + break; + case '3366FF': + $colorIdxBg = 0x30; + break; + case '33CCCC': + $colorIdxBg = 0x31; + break; + case '99CC00': + $colorIdxBg = 0x32; + break; + case 'FFCC00': + $colorIdxBg = 0x33; + break; + case 'FF9900': + $colorIdxBg = 0x34; + break; + case 'FF6600': + $colorIdxBg = 0x35; + break; + case '666699': + $colorIdxBg = 0x36; + break; + case '969696': + $colorIdxBg = 0x37; + break; + case '003366': + $colorIdxBg = 0x38; + break; + case '339966': + $colorIdxBg = 0x39; + break; + case '003300': + $colorIdxBg = 0x3A; + break; + case '333300': + $colorIdxBg = 0x3B; + break; + case '993300': + $colorIdxBg = 0x3C; + break; + case '993366': + $colorIdxBg = 0x3D; + break; + case '333399': + $colorIdxBg = 0x3E; + break; + case '333333': + $colorIdxBg = 0x3F; + break; + default: + $colorIdxBg = 0x41; + break; + } + // Fg Color + switch ($conditional->getStyle()->getFill()->getEndColor()->getRGB()) { + case '000000': + $colorIdxFg = 0x08; + break; + case 'FFFFFF': + $colorIdxFg = 0x09; + break; + case 'FF0000': + $colorIdxFg = 0x0A; + break; + case '00FF00': + $colorIdxFg = 0x0B; + break; + case '0000FF': + $colorIdxFg = 0x0C; + break; + case 'FFFF00': + $colorIdxFg = 0x0D; + break; + case 'FF00FF': + $colorIdxFg = 0x0E; + break; + case '00FFFF': + $colorIdxFg = 0x0F; + break; + case '800000': + $colorIdxFg = 0x10; + break; + case '008000': + $colorIdxFg = 0x11; + break; + case '000080': + $colorIdxFg = 0x12; + break; + case '808000': + $colorIdxFg = 0x13; + break; + case '800080': + $colorIdxFg = 0x14; + break; + case '008080': + $colorIdxFg = 0x15; + break; + case 'C0C0C0': + $colorIdxFg = 0x16; + break; + case '808080': + $colorIdxFg = 0x17; + break; + case '9999FF': + $colorIdxFg = 0x18; + break; + case '993366': + $colorIdxFg = 0x19; + break; + case 'FFFFCC': + $colorIdxFg = 0x1A; + break; + case 'CCFFFF': + $colorIdxFg = 0x1B; + break; + case '660066': + $colorIdxFg = 0x1C; + break; + case 'FF8080': + $colorIdxFg = 0x1D; + break; + case '0066CC': + $colorIdxFg = 0x1E; + break; + case 'CCCCFF': + $colorIdxFg = 0x1F; + break; + case '000080': + $colorIdxFg = 0x20; + break; + case 'FF00FF': + $colorIdxFg = 0x21; + break; + case 'FFFF00': + $colorIdxFg = 0x22; + break; + case '00FFFF': + $colorIdxFg = 0x23; + break; + case '800080': + $colorIdxFg = 0x24; + break; + case '800000': + $colorIdxFg = 0x25; + break; + case '008080': + $colorIdxFg = 0x26; + break; + case '0000FF': + $colorIdxFg = 0x27; + break; + case '00CCFF': + $colorIdxFg = 0x28; + break; + case 'CCFFFF': + $colorIdxFg = 0x29; + break; + case 'CCFFCC': + $colorIdxFg = 0x2A; + break; + case 'FFFF99': + $colorIdxFg = 0x2B; + break; + case '99CCFF': + $colorIdxFg = 0x2C; + break; + case 'FF99CC': + $colorIdxFg = 0x2D; + break; + case 'CC99FF': + $colorIdxFg = 0x2E; + break; + case 'FFCC99': + $colorIdxFg = 0x2F; + break; + case '3366FF': + $colorIdxFg = 0x30; + break; + case '33CCCC': + $colorIdxFg = 0x31; + break; + case '99CC00': + $colorIdxFg = 0x32; + break; + case 'FFCC00': + $colorIdxFg = 0x33; + break; + case 'FF9900': + $colorIdxFg = 0x34; + break; + case 'FF6600': + $colorIdxFg = 0x35; + break; + case '666699': + $colorIdxFg = 0x36; + break; + case '969696': + $colorIdxFg = 0x37; + break; + case '003366': + $colorIdxFg = 0x38; + break; + case '339966': + $colorIdxFg = 0x39; + break; + case '003300': + $colorIdxFg = 0x3A; + break; + case '333300': + $colorIdxFg = 0x3B; + break; + case '993300': + $colorIdxFg = 0x3C; + break; + case '993366': + $colorIdxFg = 0x3D; + break; + case '333399': + $colorIdxFg = 0x3E; + break; + case '333333': + $colorIdxFg = 0x3F; + break; + default: + $colorIdxFg = 0x40; + break; + } + $dataBlockFill = pack('v', $blockFillPatternStyle); + $dataBlockFill .= pack('v', $colorIdxFg | ($colorIdxBg << 7)); + } + if ($bFormatProt == 1) { + $dataBlockProtection = 0; + if ($conditional->getStyle()->getProtection()->getLocked() == PHPExcel_Style_Protection::PROTECTION_PROTECTED) { + $dataBlockProtection = 1; + } + if ($conditional->getStyle()->getProtection()->getHidden() == PHPExcel_Style_Protection::PROTECTION_PROTECTED) { + $dataBlockProtection = 1 << 1; + } + } + + $data = pack('CCvvVv', $type, $operatorType, $szValue1, $szValue2, $flags, 0x0000); + if ($bFormatFont == 1) { // Block Formatting : OK + $data .= $dataBlockFont; + } + if ($bFormatAlign == 1) { + $data .= $dataBlockAlign; + } + if ($bFormatBorder == 1) { + $data .= $dataBlockBorder; + } + if ($bFormatFill == 1) { // Block Formatting : OK + $data .= $dataBlockFill; + } + if ($bFormatProt == 1) { + $data .= $dataBlockProtection; + } + if (!is_null($operand1)) { + $data .= $operand1; + } + if (!is_null($operand2)) { + $data .= $operand2; + } + $header = pack('vv', $record, strlen($data)); + $this->append($header . $data); + } + + /** + * Write CFHeader record + */ + private function writeCFHeader() + { + $record = 0x01B0; // Record identifier + $length = 0x0016; // Bytes to follow + + $numColumnMin = null; + $numColumnMax = null; + $numRowMin = null; + $numRowMax = null; + $arrConditional = array(); + foreach ($this->phpSheet->getConditionalStylesCollection() as $cellCoordinate => $conditionalStyles) { + foreach ($conditionalStyles as $conditional) { + if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_EXPRESSION + || $conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CELLIS) { + if (!in_array($conditional->getHashCode(), $arrConditional)) { + $arrConditional[] = $conditional->getHashCode(); + } + // Cells + $arrCoord = PHPExcel_Cell::coordinateFromString($cellCoordinate); + if (!is_numeric($arrCoord[0])) { + $arrCoord[0] = PHPExcel_Cell::columnIndexFromString($arrCoord[0]); + } + if (is_null($numColumnMin) || ($numColumnMin > $arrCoord[0])) { + $numColumnMin = $arrCoord[0]; + } + if (is_null($numColumnMax) || ($numColumnMax < $arrCoord[0])) { + $numColumnMax = $arrCoord[0]; + } + if (is_null($numRowMin) || ($numRowMin > $arrCoord[1])) { + $numRowMin = $arrCoord[1]; + } + if (is_null($numRowMax) || ($numRowMax < $arrCoord[1])) { + $numRowMax = $arrCoord[1]; + } + } + } + } + $needRedraw = 1; + $cellRange = pack('vvvv', $numRowMin-1, $numRowMax-1, $numColumnMin-1, $numColumnMax-1); + + $header = pack('vv', $record, $length); + $data = pack('vv', count($arrConditional), $needRedraw); + $data .= $cellRange; + $data .= pack('v', 0x0001); + $data .= $cellRange; + $this->append($header . $data); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Excel5/Xf.php b/application/third_party/PHPExcel/PHPExcel/Writer/Excel5/Xf.php new file mode 100644 index 0000000..e41589a --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Excel5/Xf.php @@ -0,0 +1,557 @@ +<?php + +/** + * PHPExcel_Writer_Excel5_Xf + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_Excel5 + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ + +// Original file header of PEAR::Spreadsheet_Excel_Writer_Format (used as the base for this class): +// ----------------------------------------------------------------------------------------- +// /* +// * Module written/ported by Xavier Noguer <xnoguer@rezebra.com> +// * +// * The majority of this is _NOT_ my code. I simply ported it from the +// * PERL Spreadsheet::WriteExcel module. +// * +// * The author of the Spreadsheet::WriteExcel module is John McNamara +// * <jmcnamara@cpan.org> +// * +// * I _DO_ maintain this code, and John McNamara has nothing to do with the +// * porting of this code to PHP. Any questions directly related to this +// * class library should be directed to me. +// * +// * License Information: +// * +// * Spreadsheet_Excel_Writer: A library for generating Excel Spreadsheets +// * Copyright (c) 2002-2003 Xavier Noguer xnoguer@rezebra.com +// * +// * This library is free software; you can redistribute it and/or +// * modify it under the terms of the GNU Lesser General Public +// * License as published by the Free Software Foundation; either +// * version 2.1 of the License, or (at your option) any later version. +// * +// * This library is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// * Lesser General Public License for more details. +// * +// * You should have received a copy of the GNU Lesser General Public +// * License along with this library; if not, write to the Free Software +// * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// */ +class PHPExcel_Writer_Excel5_Xf +{ + /** + * Style XF or a cell XF ? + * + * @var boolean + */ + private $isStyleXf; + + /** + * Index to the FONT record. Index 4 does not exist + * @var integer + */ + private $fontIndex; + + /** + * An index (2 bytes) to a FORMAT record (number format). + * @var integer + */ + private $numberFormatIndex; + + /** + * 1 bit, apparently not used. + * @var integer + */ + private $textJustLast; + + /** + * The cell's foreground color. + * @var integer + */ + private $foregroundColor; + + /** + * The cell's background color. + * @var integer + */ + private $backgroundColor; + + /** + * Color of the bottom border of the cell. + * @var integer + */ + private $bottomBorderColor; + + /** + * Color of the top border of the cell. + * @var integer + */ + private $topBorderColor; + + /** + * Color of the left border of the cell. + * @var integer + */ + private $leftBorderColor; + + /** + * Color of the right border of the cell. + * @var integer + */ + private $rightBorderColor; + + /** + * Constructor + * + * @access public + * @param PHPExcel_Style The XF format + */ + public function __construct(PHPExcel_Style $style = null) + { + $this->isStyleXf = false; + $this->fontIndex = 0; + + $this->numberFormatIndex = 0; + + $this->textJustLast = 0; + + $this->foregroundColor = 0x40; + $this->backgroundColor = 0x41; + + $this->_diag = 0; + + $this->bottomBorderColor = 0x40; + $this->topBorderColor = 0x40; + $this->leftBorderColor = 0x40; + $this->rightBorderColor = 0x40; + $this->_diag_color = 0x40; + $this->_style = $style; + + } + + + /** + * Generate an Excel BIFF XF record (style or cell). + * + * @return string The XF record + */ + public function writeXf() + { + // Set the type of the XF record and some of the attributes. + if ($this->isStyleXf) { + $style = 0xFFF5; + } else { + $style = self::mapLocked($this->_style->getProtection()->getLocked()); + $style |= self::mapHidden($this->_style->getProtection()->getHidden()) << 1; + } + + // Flags to indicate if attributes have been set. + $atr_num = ($this->numberFormatIndex != 0)?1:0; + $atr_fnt = ($this->fontIndex != 0)?1:0; + $atr_alc = ((int) $this->_style->getAlignment()->getWrapText()) ? 1 : 0; + $atr_bdr = (self::mapBorderStyle($this->_style->getBorders()->getBottom()->getBorderStyle()) || + self::mapBorderStyle($this->_style->getBorders()->getTop()->getBorderStyle()) || + self::mapBorderStyle($this->_style->getBorders()->getLeft()->getBorderStyle()) || + self::mapBorderStyle($this->_style->getBorders()->getRight()->getBorderStyle()))?1:0; + $atr_pat = (($this->foregroundColor != 0x40) || + ($this->backgroundColor != 0x41) || + self::mapFillType($this->_style->getFill()->getFillType()))?1:0; + $atr_prot = self::mapLocked($this->_style->getProtection()->getLocked()) + | self::mapHidden($this->_style->getProtection()->getHidden()); + + // Zero the default border colour if the border has not been set. + if (self::mapBorderStyle($this->_style->getBorders()->getBottom()->getBorderStyle()) == 0) { + $this->bottomBorderColor = 0; + } + if (self::mapBorderStyle($this->_style->getBorders()->getTop()->getBorderStyle()) == 0) { + $this->topBorderColor = 0; + } + if (self::mapBorderStyle($this->_style->getBorders()->getRight()->getBorderStyle()) == 0) { + $this->rightBorderColor = 0; + } + if (self::mapBorderStyle($this->_style->getBorders()->getLeft()->getBorderStyle()) == 0) { + $this->leftBorderColor = 0; + } + if (self::mapBorderStyle($this->_style->getBorders()->getDiagonal()->getBorderStyle()) == 0) { + $this->_diag_color = 0; + } + + $record = 0x00E0; // Record identifier + $length = 0x0014; // Number of bytes to follow + + $ifnt = $this->fontIndex; // Index to FONT record + $ifmt = $this->numberFormatIndex; // Index to FORMAT record + + $align = $this->mapHAlign($this->_style->getAlignment()->getHorizontal()); // Alignment + $align |= (int) $this->_style->getAlignment()->getWrapText() << 3; + $align |= self::mapVAlign($this->_style->getAlignment()->getVertical()) << 4; + $align |= $this->textJustLast << 7; + + $used_attrib = $atr_num << 2; + $used_attrib |= $atr_fnt << 3; + $used_attrib |= $atr_alc << 4; + $used_attrib |= $atr_bdr << 5; + $used_attrib |= $atr_pat << 6; + $used_attrib |= $atr_prot << 7; + + $icv = $this->foregroundColor; // fg and bg pattern colors + $icv |= $this->backgroundColor << 7; + + $border1 = self::mapBorderStyle($this->_style->getBorders()->getLeft()->getBorderStyle()); // Border line style and color + $border1 |= self::mapBorderStyle($this->_style->getBorders()->getRight()->getBorderStyle()) << 4; + $border1 |= self::mapBorderStyle($this->_style->getBorders()->getTop()->getBorderStyle()) << 8; + $border1 |= self::mapBorderStyle($this->_style->getBorders()->getBottom()->getBorderStyle()) << 12; + $border1 |= $this->leftBorderColor << 16; + $border1 |= $this->rightBorderColor << 23; + + $diagonalDirection = $this->_style->getBorders()->getDiagonalDirection(); + $diag_tl_to_rb = $diagonalDirection == PHPExcel_Style_Borders::DIAGONAL_BOTH + || $diagonalDirection == PHPExcel_Style_Borders::DIAGONAL_DOWN; + $diag_tr_to_lb = $diagonalDirection == PHPExcel_Style_Borders::DIAGONAL_BOTH + || $diagonalDirection == PHPExcel_Style_Borders::DIAGONAL_UP; + $border1 |= $diag_tl_to_rb << 30; + $border1 |= $diag_tr_to_lb << 31; + + $border2 = $this->topBorderColor; // Border color + $border2 |= $this->bottomBorderColor << 7; + $border2 |= $this->_diag_color << 14; + $border2 |= self::mapBorderStyle($this->_style->getBorders()->getDiagonal()->getBorderStyle()) << 21; + $border2 |= self::mapFillType($this->_style->getFill()->getFillType()) << 26; + + $header = pack("vv", $record, $length); + + //BIFF8 options: identation, shrinkToFit and text direction + $biff8_options = $this->_style->getAlignment()->getIndent(); + $biff8_options |= (int) $this->_style->getAlignment()->getShrinkToFit() << 4; + + $data = pack("vvvC", $ifnt, $ifmt, $style, $align); + $data .= pack("CCC", self::mapTextRotation($this->_style->getAlignment()->getTextRotation()), $biff8_options, $used_attrib); + $data .= pack("VVv", $border1, $border2, $icv); + + return($header . $data); + } + + /** + * Is this a style XF ? + * + * @param boolean $value + */ + public function setIsStyleXf($value) + { + $this->isStyleXf = $value; + } + + /** + * Sets the cell's bottom border color + * + * @access public + * @param int $colorIndex Color index + */ + public function setBottomColor($colorIndex) + { + $this->bottomBorderColor = $colorIndex; + } + + /** + * Sets the cell's top border color + * + * @access public + * @param int $colorIndex Color index + */ + public function setTopColor($colorIndex) + { + $this->topBorderColor = $colorIndex; + } + + /** + * Sets the cell's left border color + * + * @access public + * @param int $colorIndex Color index + */ + public function setLeftColor($colorIndex) + { + $this->leftBorderColor = $colorIndex; + } + + /** + * Sets the cell's right border color + * + * @access public + * @param int $colorIndex Color index + */ + public function setRightColor($colorIndex) + { + $this->rightBorderColor = $colorIndex; + } + + /** + * Sets the cell's diagonal border color + * + * @access public + * @param int $colorIndex Color index + */ + public function setDiagColor($colorIndex) + { + $this->_diag_color = $colorIndex; + } + + + /** + * Sets the cell's foreground color + * + * @access public + * @param int $colorIndex Color index + */ + public function setFgColor($colorIndex) + { + $this->foregroundColor = $colorIndex; + } + + /** + * Sets the cell's background color + * + * @access public + * @param int $colorIndex Color index + */ + public function setBgColor($colorIndex) + { + $this->backgroundColor = $colorIndex; + } + + /** + * Sets the index to the number format record + * It can be date, time, currency, etc... + * + * @access public + * @param integer $numberFormatIndex Index to format record + */ + public function setNumberFormatIndex($numberFormatIndex) + { + $this->numberFormatIndex = $numberFormatIndex; + } + + /** + * Set the font index. + * + * @param int $value Font index, note that value 4 does not exist + */ + public function setFontIndex($value) + { + $this->fontIndex = $value; + } + + /** + * Map of BIFF2-BIFF8 codes for border styles + * @static array of int + * + */ + private static $mapBorderStyles = array( + PHPExcel_Style_Border::BORDER_NONE => 0x00, + PHPExcel_Style_Border::BORDER_THIN => 0x01, + PHPExcel_Style_Border::BORDER_MEDIUM => 0x02, + PHPExcel_Style_Border::BORDER_DASHED => 0x03, + PHPExcel_Style_Border::BORDER_DOTTED => 0x04, + PHPExcel_Style_Border::BORDER_THICK => 0x05, + PHPExcel_Style_Border::BORDER_DOUBLE => 0x06, + PHPExcel_Style_Border::BORDER_HAIR => 0x07, + PHPExcel_Style_Border::BORDER_MEDIUMDASHED => 0x08, + PHPExcel_Style_Border::BORDER_DASHDOT => 0x09, + PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT => 0x0A, + PHPExcel_Style_Border::BORDER_DASHDOTDOT => 0x0B, + PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT => 0x0C, + PHPExcel_Style_Border::BORDER_SLANTDASHDOT => 0x0D, + ); + + /** + * Map border style + * + * @param string $borderStyle + * @return int + */ + private static function mapBorderStyle($borderStyle) + { + if (isset(self::$mapBorderStyles[$borderStyle])) { + return self::$mapBorderStyles[$borderStyle]; + } + return 0x00; + } + + /** + * Map of BIFF2-BIFF8 codes for fill types + * @static array of int + * + */ + private static $mapFillTypes = array( + PHPExcel_Style_Fill::FILL_NONE => 0x00, + PHPExcel_Style_Fill::FILL_SOLID => 0x01, + PHPExcel_Style_Fill::FILL_PATTERN_MEDIUMGRAY => 0x02, + PHPExcel_Style_Fill::FILL_PATTERN_DARKGRAY => 0x03, + PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRAY => 0x04, + PHPExcel_Style_Fill::FILL_PATTERN_DARKHORIZONTAL => 0x05, + PHPExcel_Style_Fill::FILL_PATTERN_DARKVERTICAL => 0x06, + PHPExcel_Style_Fill::FILL_PATTERN_DARKDOWN => 0x07, + PHPExcel_Style_Fill::FILL_PATTERN_DARKUP => 0x08, + PHPExcel_Style_Fill::FILL_PATTERN_DARKGRID => 0x09, + PHPExcel_Style_Fill::FILL_PATTERN_DARKTRELLIS => 0x0A, + PHPExcel_Style_Fill::FILL_PATTERN_LIGHTHORIZONTAL => 0x0B, + PHPExcel_Style_Fill::FILL_PATTERN_LIGHTVERTICAL => 0x0C, + PHPExcel_Style_Fill::FILL_PATTERN_LIGHTDOWN => 0x0D, + PHPExcel_Style_Fill::FILL_PATTERN_LIGHTUP => 0x0E, + PHPExcel_Style_Fill::FILL_PATTERN_LIGHTGRID => 0x0F, + PHPExcel_Style_Fill::FILL_PATTERN_LIGHTTRELLIS => 0x10, + PHPExcel_Style_Fill::FILL_PATTERN_GRAY125 => 0x11, + PHPExcel_Style_Fill::FILL_PATTERN_GRAY0625 => 0x12, + PHPExcel_Style_Fill::FILL_GRADIENT_LINEAR => 0x00, // does not exist in BIFF8 + PHPExcel_Style_Fill::FILL_GRADIENT_PATH => 0x00, // does not exist in BIFF8 + ); + + /** + * Map fill type + * + * @param string $fillType + * @return int + */ + private static function mapFillType($fillType) + { + if (isset(self::$mapFillTypes[$fillType])) { + return self::$mapFillTypes[$fillType]; + } + return 0x00; + } + + /** + * Map of BIFF2-BIFF8 codes for horizontal alignment + * @static array of int + * + */ + private static $mapHAlignments = array( + PHPExcel_Style_Alignment::HORIZONTAL_GENERAL => 0, + PHPExcel_Style_Alignment::HORIZONTAL_LEFT => 1, + PHPExcel_Style_Alignment::HORIZONTAL_CENTER => 2, + PHPExcel_Style_Alignment::HORIZONTAL_RIGHT => 3, + PHPExcel_Style_Alignment::HORIZONTAL_FILL => 4, + PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY => 5, + PHPExcel_Style_Alignment::HORIZONTAL_CENTER_CONTINUOUS => 6, + ); + + /** + * Map to BIFF2-BIFF8 codes for horizontal alignment + * + * @param string $hAlign + * @return int + */ + private function mapHAlign($hAlign) + { + if (isset(self::$mapHAlignments[$hAlign])) { + return self::$mapHAlignments[$hAlign]; + } + return 0; + } + + /** + * Map of BIFF2-BIFF8 codes for vertical alignment + * @static array of int + * + */ + private static $mapVAlignments = array( + PHPExcel_Style_Alignment::VERTICAL_TOP => 0, + PHPExcel_Style_Alignment::VERTICAL_CENTER => 1, + PHPExcel_Style_Alignment::VERTICAL_BOTTOM => 2, + PHPExcel_Style_Alignment::VERTICAL_JUSTIFY => 3, + ); + + /** + * Map to BIFF2-BIFF8 codes for vertical alignment + * + * @param string $vAlign + * @return int + */ + private static function mapVAlign($vAlign) + { + if (isset(self::$mapVAlignments[$vAlign])) { + return self::$mapVAlignments[$vAlign]; + } + return 2; + } + + /** + * Map to BIFF8 codes for text rotation angle + * + * @param int $textRotation + * @return int + */ + private static function mapTextRotation($textRotation) + { + if ($textRotation >= 0) { + return $textRotation; + } elseif ($textRotation == -165) { + return 255; + } elseif ($textRotation < 0) { + return 90 - $textRotation; + } + } + + /** + * Map locked + * + * @param string + * @return int + */ + private static function mapLocked($locked) + { + switch ($locked) { + case PHPExcel_Style_Protection::PROTECTION_INHERIT: + return 1; + case PHPExcel_Style_Protection::PROTECTION_PROTECTED: + return 1; + case PHPExcel_Style_Protection::PROTECTION_UNPROTECTED: + return 0; + default: + return 1; + } + } + + /** + * Map hidden + * + * @param string + * @return int + */ + private static function mapHidden($hidden) + { + switch ($hidden) { + case PHPExcel_Style_Protection::PROTECTION_INHERIT: + return 0; + case PHPExcel_Style_Protection::PROTECTION_PROTECTED: + return 1; + case PHPExcel_Style_Protection::PROTECTION_UNPROTECTED: + return 0; + default: + return 0; + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/Exception.php b/application/third_party/PHPExcel/PHPExcel/Writer/Exception.php new file mode 100644 index 0000000..bfa0056 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/Exception.php @@ -0,0 +1,46 @@ +<?php + +/** + * PHPExcel_Writer_Exception + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_Exception extends PHPExcel_Exception +{ + /** + * Error handler callback + * + * @param mixed $code + * @param mixed $string + * @param mixed $file + * @param mixed $line + * @param mixed $context + */ + public static function errorHandlerCallback($code, $string, $file, $line, $context) + { + $e = new self($string, $code); + $e->line = $line; + $e->file = $file; + throw $e; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/HTML.php b/application/third_party/PHPExcel/PHPExcel/Writer/HTML.php new file mode 100644 index 0000000..31d7c63 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/HTML.php @@ -0,0 +1,1612 @@ +<?php + +/** + * PHPExcel_Writer_HTML + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_HTML + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_HTML extends PHPExcel_Writer_Abstract implements PHPExcel_Writer_IWriter +{ + /** + * PHPExcel object + * + * @var PHPExcel + */ + protected $phpExcel; + + /** + * Sheet index to write + * + * @var int + */ + private $sheetIndex = 0; + + /** + * Images root + * + * @var string + */ + private $imagesRoot = '.'; + + /** + * embed images, or link to images + * + * @var boolean + */ + private $embedImages = false; + + /** + * Use inline CSS? + * + * @var boolean + */ + private $useInlineCss = false; + + /** + * Array of CSS styles + * + * @var array + */ + private $cssStyles; + + /** + * Array of column widths in points + * + * @var array + */ + private $columnWidths; + + /** + * Default font + * + * @var PHPExcel_Style_Font + */ + private $defaultFont; + + /** + * Flag whether spans have been calculated + * + * @var boolean + */ + private $spansAreCalculated = false; + + /** + * Excel cells that should not be written as HTML cells + * + * @var array + */ + private $isSpannedCell = array(); + + /** + * Excel cells that are upper-left corner in a cell merge + * + * @var array + */ + private $isBaseCell = array(); + + /** + * Excel rows that should not be written as HTML rows + * + * @var array + */ + private $isSpannedRow = array(); + + /** + * Is the current writer creating PDF? + * + * @var boolean + */ + protected $isPdf = false; + + /** + * Generate the Navigation block + * + * @var boolean + */ + private $generateSheetNavigationBlock = true; + + /** + * Create a new PHPExcel_Writer_HTML + * + * @param PHPExcel $phpExcel PHPExcel object + */ + public function __construct(PHPExcel $phpExcel) + { + $this->phpExcel = $phpExcel; + $this->defaultFont = $this->phpExcel->getDefaultStyle()->getFont(); + } + + /** + * Save PHPExcel to file + * + * @param string $pFilename + * @throws PHPExcel_Writer_Exception + */ + public function save($pFilename = null) + { + // garbage collect + $this->phpExcel->garbageCollect(); + + $saveDebugLog = PHPExcel_Calculation::getInstance($this->phpExcel)->getDebugLog()->getWriteDebugLog(); + PHPExcel_Calculation::getInstance($this->phpExcel)->getDebugLog()->setWriteDebugLog(false); + $saveArrayReturnType = PHPExcel_Calculation::getArrayReturnType(); + PHPExcel_Calculation::setArrayReturnType(PHPExcel_Calculation::RETURN_ARRAY_AS_VALUE); + + // Build CSS + $this->buildCSS(!$this->useInlineCss); + + // Open file + $fileHandle = fopen($pFilename, 'wb+'); + if ($fileHandle === false) { + throw new PHPExcel_Writer_Exception("Could not open file $pFilename for writing."); + } + + // Write headers + fwrite($fileHandle, $this->generateHTMLHeader(!$this->useInlineCss)); + + // Write navigation (tabs) + if ((!$this->isPdf) && ($this->generateSheetNavigationBlock)) { + fwrite($fileHandle, $this->generateNavigation()); + } + + // Write data + fwrite($fileHandle, $this->generateSheetData()); + + // Write footer + fwrite($fileHandle, $this->generateHTMLFooter()); + + // Close file + fclose($fileHandle); + + PHPExcel_Calculation::setArrayReturnType($saveArrayReturnType); + PHPExcel_Calculation::getInstance($this->phpExcel)->getDebugLog()->setWriteDebugLog($saveDebugLog); + } + + /** + * Map VAlign + * + * @param string $vAlign Vertical alignment + * @return string + */ + private function mapVAlign($vAlign) + { + switch ($vAlign) { + case PHPExcel_Style_Alignment::VERTICAL_BOTTOM: + return 'bottom'; + case PHPExcel_Style_Alignment::VERTICAL_TOP: + return 'top'; + case PHPExcel_Style_Alignment::VERTICAL_CENTER: + case PHPExcel_Style_Alignment::VERTICAL_JUSTIFY: + return 'middle'; + default: + return 'baseline'; + } + } + + /** + * Map HAlign + * + * @param string $hAlign Horizontal alignment + * @return string|false + */ + private function mapHAlign($hAlign) + { + switch ($hAlign) { + case PHPExcel_Style_Alignment::HORIZONTAL_GENERAL: + return false; + case PHPExcel_Style_Alignment::HORIZONTAL_LEFT: + return 'left'; + case PHPExcel_Style_Alignment::HORIZONTAL_RIGHT: + return 'right'; + case PHPExcel_Style_Alignment::HORIZONTAL_CENTER: + case PHPExcel_Style_Alignment::HORIZONTAL_CENTER_CONTINUOUS: + return 'center'; + case PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY: + return 'justify'; + default: + return false; + } + } + + /** + * Map border style + * + * @param int $borderStyle Sheet index + * @return string + */ + private function mapBorderStyle($borderStyle) + { + switch ($borderStyle) { + case PHPExcel_Style_Border::BORDER_NONE: + return 'none'; + case PHPExcel_Style_Border::BORDER_DASHDOT: + return '1px dashed'; + case PHPExcel_Style_Border::BORDER_DASHDOTDOT: + return '1px dotted'; + case PHPExcel_Style_Border::BORDER_DASHED: + return '1px dashed'; + case PHPExcel_Style_Border::BORDER_DOTTED: + return '1px dotted'; + case PHPExcel_Style_Border::BORDER_DOUBLE: + return '3px double'; + case PHPExcel_Style_Border::BORDER_HAIR: + return '1px solid'; + case PHPExcel_Style_Border::BORDER_MEDIUM: + return '2px solid'; + case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT: + return '2px dashed'; + case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT: + return '2px dotted'; + case PHPExcel_Style_Border::BORDER_MEDIUMDASHED: + return '2px dashed'; + case PHPExcel_Style_Border::BORDER_SLANTDASHDOT: + return '2px dashed'; + case PHPExcel_Style_Border::BORDER_THICK: + return '3px solid'; + case PHPExcel_Style_Border::BORDER_THIN: + return '1px solid'; + default: + // map others to thin + return '1px solid'; + } + } + + /** + * Get sheet index + * + * @return int + */ + public function getSheetIndex() + { + return $this->sheetIndex; + } + + /** + * Set sheet index + * + * @param int $pValue Sheet index + * @return PHPExcel_Writer_HTML + */ + public function setSheetIndex($pValue = 0) + { + $this->sheetIndex = $pValue; + return $this; + } + + /** + * Get sheet index + * + * @return boolean + */ + public function getGenerateSheetNavigationBlock() + { + return $this->generateSheetNavigationBlock; + } + + /** + * Set sheet index + * + * @param boolean $pValue Flag indicating whether the sheet navigation block should be generated or not + * @return PHPExcel_Writer_HTML + */ + public function setGenerateSheetNavigationBlock($pValue = true) + { + $this->generateSheetNavigationBlock = (bool) $pValue; + return $this; + } + + /** + * Write all sheets (resets sheetIndex to NULL) + */ + public function writeAllSheets() + { + $this->sheetIndex = null; + return $this; + } + + /** + * Generate HTML header + * + * @param boolean $pIncludeStyles Include styles? + * @return string + * @throws PHPExcel_Writer_Exception + */ + public function generateHTMLHeader($pIncludeStyles = false) + { + // PHPExcel object known? + if (is_null($this->phpExcel)) { + throw new PHPExcel_Writer_Exception('Internal PHPExcel object not set to an instance of an object.'); + } + + // Construct HTML + $properties = $this->phpExcel->getProperties(); + $html = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">' . PHP_EOL; + $html .= '<!-- Generated by PHPExcel - http://www.phpexcel.net -->' . PHP_EOL; + $html .= '<html>' . PHP_EOL; + $html .= ' <head>' . PHP_EOL; + $html .= ' <meta http-equiv="Content-Type" content="text/html; charset=utf-8">' . PHP_EOL; + if ($properties->getTitle() > '') { + $html .= ' <title>' . htmlspecialchars($properties->getTitle()) . '</title>' . PHP_EOL; + } + if ($properties->getCreator() > '') { + $html .= ' <meta name="author" content="' . htmlspecialchars($properties->getCreator()) . '" />' . PHP_EOL; + } + if ($properties->getTitle() > '') { + $html .= ' <meta name="title" content="' . htmlspecialchars($properties->getTitle()) . '" />' . PHP_EOL; + } + if ($properties->getDescription() > '') { + $html .= ' <meta name="description" content="' . htmlspecialchars($properties->getDescription()) . '" />' . PHP_EOL; + } + if ($properties->getSubject() > '') { + $html .= ' <meta name="subject" content="' . htmlspecialchars($properties->getSubject()) . '" />' . PHP_EOL; + } + if ($properties->getKeywords() > '') { + $html .= ' <meta name="keywords" content="' . htmlspecialchars($properties->getKeywords()) . '" />' . PHP_EOL; + } + if ($properties->getCategory() > '') { + $html .= ' <meta name="category" content="' . htmlspecialchars($properties->getCategory()) . '" />' . PHP_EOL; + } + if ($properties->getCompany() > '') { + $html .= ' <meta name="company" content="' . htmlspecialchars($properties->getCompany()) . '" />' . PHP_EOL; + } + if ($properties->getManager() > '') { + $html .= ' <meta name="manager" content="' . htmlspecialchars($properties->getManager()) . '" />' . PHP_EOL; + } + + if ($pIncludeStyles) { + $html .= $this->generateStyles(true); + } + + $html .= ' </head>' . PHP_EOL; + $html .= '' . PHP_EOL; + $html .= ' <body>' . PHP_EOL; + + return $html; + } + + /** + * Generate sheet data + * + * @return string + * @throws PHPExcel_Writer_Exception + */ + public function generateSheetData() + { + // PHPExcel object known? + if (is_null($this->phpExcel)) { + throw new PHPExcel_Writer_Exception('Internal PHPExcel object not set to an instance of an object.'); + } + + // Ensure that Spans have been calculated? + if ($this->sheetIndex !== null || !$this->spansAreCalculated) { + $this->calculateSpans(); + } + + // Fetch sheets + $sheets = array(); + if (is_null($this->sheetIndex)) { + $sheets = $this->phpExcel->getAllSheets(); + } else { + $sheets[] = $this->phpExcel->getSheet($this->sheetIndex); + } + + // Construct HTML + $html = ''; + + // Loop all sheets + $sheetId = 0; + foreach ($sheets as $sheet) { + // Write table header + $html .= $this->generateTableHeader($sheet); + + // Get worksheet dimension + $dimension = explode(':', $sheet->calculateWorksheetDimension()); + $dimension[0] = PHPExcel_Cell::coordinateFromString($dimension[0]); + $dimension[0][0] = PHPExcel_Cell::columnIndexFromString($dimension[0][0]) - 1; + $dimension[1] = PHPExcel_Cell::coordinateFromString($dimension[1]); + $dimension[1][0] = PHPExcel_Cell::columnIndexFromString($dimension[1][0]) - 1; + + // row min,max + $rowMin = $dimension[0][1]; + $rowMax = $dimension[1][1]; + + // calculate start of <tbody>, <thead> + $tbodyStart = $rowMin; + $theadStart = $theadEnd = 0; // default: no <thead> no </thead> + if ($sheet->getPageSetup()->isRowsToRepeatAtTopSet()) { + $rowsToRepeatAtTop = $sheet->getPageSetup()->getRowsToRepeatAtTop(); + + // we can only support repeating rows that start at top row + if ($rowsToRepeatAtTop[0] == 1) { + $theadStart = $rowsToRepeatAtTop[0]; + $theadEnd = $rowsToRepeatAtTop[1]; + $tbodyStart = $rowsToRepeatAtTop[1] + 1; + } + } + + // Loop through cells + $row = $rowMin-1; + while ($row++ < $rowMax) { + // <thead> ? + if ($row == $theadStart) { + $html .= ' <thead>' . PHP_EOL; + $cellType = 'th'; + } + + // <tbody> ? + if ($row == $tbodyStart) { + $html .= ' <tbody>' . PHP_EOL; + $cellType = 'td'; + } + + // Write row if there are HTML table cells in it + if (!isset($this->isSpannedRow[$sheet->getParent()->getIndex($sheet)][$row])) { + // Start a new rowData + $rowData = array(); + // Loop through columns + $column = $dimension[0][0] - 1; + while ($column++ < $dimension[1][0]) { + // Cell exists? + if ($sheet->cellExistsByColumnAndRow($column, $row)) { + $rowData[$column] = PHPExcel_Cell::stringFromColumnIndex($column) . $row; + } else { + $rowData[$column] = ''; + } + } + $html .= $this->generateRow($sheet, $rowData, $row - 1, $cellType); + } + + // </thead> ? + if ($row == $theadEnd) { + $html .= ' </thead>' . PHP_EOL; + } + } + $html .= $this->extendRowsForChartsAndImages($sheet, $row); + + // Close table body. + $html .= ' </tbody>' . PHP_EOL; + + // Write table footer + $html .= $this->generateTableFooter(); + + // Writing PDF? + if ($this->isPdf) { + if (is_null($this->sheetIndex) && $sheetId + 1 < $this->phpExcel->getSheetCount()) { + $html .= '<div style="page-break-before:always" />'; + } + } + + // Next sheet + ++$sheetId; + } + + return $html; + } + + /** + * Generate sheet tabs + * + * @return string + * @throws PHPExcel_Writer_Exception + */ + public function generateNavigation() + { + // PHPExcel object known? + if (is_null($this->phpExcel)) { + throw new PHPExcel_Writer_Exception('Internal PHPExcel object not set to an instance of an object.'); + } + + // Fetch sheets + $sheets = array(); + if (is_null($this->sheetIndex)) { + $sheets = $this->phpExcel->getAllSheets(); + } else { + $sheets[] = $this->phpExcel->getSheet($this->sheetIndex); + } + + // Construct HTML + $html = ''; + + // Only if there are more than 1 sheets + if (count($sheets) > 1) { + // Loop all sheets + $sheetId = 0; + + $html .= '<ul class="navigation">' . PHP_EOL; + + foreach ($sheets as $sheet) { + $html .= ' <li class="sheet' . $sheetId . '"><a href="#sheet' . $sheetId . '">' . $sheet->getTitle() . '</a></li>' . PHP_EOL; + ++$sheetId; + } + + $html .= '</ul>' . PHP_EOL; + } + + return $html; + } + + private function extendRowsForChartsAndImages(PHPExcel_Worksheet $pSheet, $row) + { + $rowMax = $row; + $colMax = 'A'; + if ($this->includeCharts) { + foreach ($pSheet->getChartCollection() as $chart) { + if ($chart instanceof PHPExcel_Chart) { + $chartCoordinates = $chart->getTopLeftPosition(); + $chartTL = PHPExcel_Cell::coordinateFromString($chartCoordinates['cell']); + $chartCol = PHPExcel_Cell::columnIndexFromString($chartTL[0]); + if ($chartTL[1] > $rowMax) { + $rowMax = $chartTL[1]; + if ($chartCol > PHPExcel_Cell::columnIndexFromString($colMax)) { + $colMax = $chartTL[0]; + } + } + } + } + } + + foreach ($pSheet->getDrawingCollection() as $drawing) { + if ($drawing instanceof PHPExcel_Worksheet_Drawing) { + $imageTL = PHPExcel_Cell::coordinateFromString($drawing->getCoordinates()); + $imageCol = PHPExcel_Cell::columnIndexFromString($imageTL[0]); + if ($imageTL[1] > $rowMax) { + $rowMax = $imageTL[1]; + if ($imageCol > PHPExcel_Cell::columnIndexFromString($colMax)) { + $colMax = $imageTL[0]; + } + } + } + } + + $html = ''; + $colMax++; + while ($row <= $rowMax) { + $html .= '<tr>'; + for ($col = 'A'; $col != $colMax; ++$col) { + $html .= '<td>'; + $html .= $this->writeImageInCell($pSheet, $col.$row); + if ($this->includeCharts) { + $html .= $this->writeChartInCell($pSheet, $col.$row); + } + $html .= '</td>'; + } + ++$row; + $html .= '</tr>'; + } + return $html; + } + + + /** + * Generate image tag in cell + * + * @param PHPExcel_Worksheet $pSheet PHPExcel_Worksheet + * @param string $coordinates Cell coordinates + * @return string + * @throws PHPExcel_Writer_Exception + */ + private function writeImageInCell(PHPExcel_Worksheet $pSheet, $coordinates) + { + // Construct HTML + $html = ''; + + // Write images + foreach ($pSheet->getDrawingCollection() as $drawing) { + if ($drawing instanceof PHPExcel_Worksheet_Drawing) { + if ($drawing->getCoordinates() == $coordinates) { + $filename = $drawing->getPath(); + + // Strip off eventual '.' + if (substr($filename, 0, 1) == '.') { + $filename = substr($filename, 1); + } + + // Prepend images root + $filename = $this->getImagesRoot() . $filename; + + // Strip off eventual '.' + if (substr($filename, 0, 1) == '.' && substr($filename, 0, 2) != './') { + $filename = substr($filename, 1); + } + + // Convert UTF8 data to PCDATA + $filename = htmlspecialchars($filename); + + $html .= PHP_EOL; + if ((!$this->embedImages) || ($this->isPdf)) { + $imageData = $filename; + } else { + $imageDetails = getimagesize($filename); + if ($fp = fopen($filename, "rb", 0)) { + $picture = fread($fp, filesize($filename)); + fclose($fp); + // base64 encode the binary data, then break it + // into chunks according to RFC 2045 semantics + $base64 = chunk_split(base64_encode($picture)); + $imageData = 'data:'.$imageDetails['mime'].';base64,' . $base64; + } else { + $imageData = $filename; + } + } + + $html .= '<div style="position: relative;">'; + $html .= '<img style="position: absolute; z-index: 1; left: ' . + $drawing->getOffsetX() . 'px; top: ' . $drawing->getOffsetY() . 'px; width: ' . + $drawing->getWidth() . 'px; height: ' . $drawing->getHeight() . 'px;" src="' . + $imageData . '" border="0" />'; + $html .= '</div>'; + } + } elseif ($drawing instanceof PHPExcel_Worksheet_MemoryDrawing) { + if ($drawing->getCoordinates() != $coordinates) { + continue; + } + ob_start(); // Let's start output buffering. + imagepng($drawing->getImageResource()); // This will normally output the image, but because of ob_start(), it won't. + $contents = ob_get_contents(); // Instead, output above is saved to $contents + ob_end_clean(); // End the output buffer. + + $dataUri = "data:image/jpeg;base64," . base64_encode($contents); + + // Because of the nature of tables, width is more important than height. + // max-width: 100% ensures that image doesnt overflow containing cell + // width: X sets width of supplied image. + // As a result, images bigger than cell will be contained and images smaller will not get stretched + $html .= '<img src="'.$dataUri.'" style="max-width:100%;width:'.$drawing->getWidth().'px;" />'; + } + } + + return $html; + } + + /** + * Generate chart tag in cell + * + * @param PHPExcel_Worksheet $pSheet PHPExcel_Worksheet + * @param string $coordinates Cell coordinates + * @return string + * @throws PHPExcel_Writer_Exception + */ + private function writeChartInCell(PHPExcel_Worksheet $pSheet, $coordinates) + { + // Construct HTML + $html = ''; + + // Write charts + foreach ($pSheet->getChartCollection() as $chart) { + if ($chart instanceof PHPExcel_Chart) { + $chartCoordinates = $chart->getTopLeftPosition(); + if ($chartCoordinates['cell'] == $coordinates) { + $chartFileName = PHPExcel_Shared_File::sys_get_temp_dir().'/'.uniqid().'.png'; + if (!$chart->render($chartFileName)) { + return; + } + + $html .= PHP_EOL; + $imageDetails = getimagesize($chartFileName); + if ($fp = fopen($chartFileName, "rb", 0)) { + $picture = fread($fp, filesize($chartFileName)); + fclose($fp); + // base64 encode the binary data, then break it + // into chunks according to RFC 2045 semantics + $base64 = chunk_split(base64_encode($picture)); + $imageData = 'data:'.$imageDetails['mime'].';base64,' . $base64; + + $html .= '<div style="position: relative;">'; + $html .= '<img style="position: absolute; z-index: 1; left: ' . $chartCoordinates['xOffset'] . 'px; top: ' . $chartCoordinates['yOffset'] . 'px; width: ' . $imageDetails[0] . 'px; height: ' . $imageDetails[1] . 'px;" src="' . $imageData . '" border="0" />' . PHP_EOL; + $html .= '</div>'; + + unlink($chartFileName); + } + } + } + } + + // Return + return $html; + } + + /** + * Generate CSS styles + * + * @param boolean $generateSurroundingHTML Generate surrounding HTML tags? (&lt;style&gt; and &lt;/style&gt;) + * @return string + * @throws PHPExcel_Writer_Exception + */ + public function generateStyles($generateSurroundingHTML = true) + { + // PHPExcel object known? + if (is_null($this->phpExcel)) { + throw new PHPExcel_Writer_Exception('Internal PHPExcel object not set to an instance of an object.'); + } + + // Build CSS + $css = $this->buildCSS($generateSurroundingHTML); + + // Construct HTML + $html = ''; + + // Start styles + if ($generateSurroundingHTML) { + $html .= ' <style type="text/css">' . PHP_EOL; + $html .= ' html { ' . $this->assembleCSS($css['html']) . ' }' . PHP_EOL; + } + + // Write all other styles + foreach ($css as $styleName => $styleDefinition) { + if ($styleName != 'html') { + $html .= ' ' . $styleName . ' { ' . $this->assembleCSS($styleDefinition) . ' }' . PHP_EOL; + } + } + + // End styles + if ($generateSurroundingHTML) { + $html .= ' </style>' . PHP_EOL; + } + + // Return + return $html; + } + + /** + * Build CSS styles + * + * @param boolean $generateSurroundingHTML Generate surrounding HTML style? (html { }) + * @return array + * @throws PHPExcel_Writer_Exception + */ + public function buildCSS($generateSurroundingHTML = true) + { + // PHPExcel object known? + if (is_null($this->phpExcel)) { + throw new PHPExcel_Writer_Exception('Internal PHPExcel object not set to an instance of an object.'); + } + + // Cached? + if (!is_null($this->cssStyles)) { + return $this->cssStyles; + } + + // Ensure that spans have been calculated + if (!$this->spansAreCalculated) { + $this->calculateSpans(); + } + + // Construct CSS + $css = array(); + + // Start styles + if ($generateSurroundingHTML) { + // html { } + $css['html']['font-family'] = 'Calibri, Arial, Helvetica, sans-serif'; + $css['html']['font-size'] = '11pt'; + $css['html']['background-color'] = 'white'; + } + + + // table { } + $css['table']['border-collapse'] = 'collapse'; + if (!$this->isPdf) { + $css['table']['page-break-after'] = 'always'; + } + + // .gridlines td { } + $css['.gridlines td']['border'] = '1px dotted black'; + $css['.gridlines th']['border'] = '1px dotted black'; + + // .b {} + $css['.b']['text-align'] = 'center'; // BOOL + + // .e {} + $css['.e']['text-align'] = 'center'; // ERROR + + // .f {} + $css['.f']['text-align'] = 'right'; // FORMULA + + // .inlineStr {} + $css['.inlineStr']['text-align'] = 'left'; // INLINE + + // .n {} + $css['.n']['text-align'] = 'right'; // NUMERIC + + // .s {} + $css['.s']['text-align'] = 'left'; // STRING + + // Calculate cell style hashes + foreach ($this->phpExcel->getCellXfCollection() as $index => $style) { + $css['td.style' . $index] = $this->createCSSStyle($style); + $css['th.style' . $index] = $this->createCSSStyle($style); + } + + // Fetch sheets + $sheets = array(); + if (is_null($this->sheetIndex)) { + $sheets = $this->phpExcel->getAllSheets(); + } else { + $sheets[] = $this->phpExcel->getSheet($this->sheetIndex); + } + + // Build styles per sheet + foreach ($sheets as $sheet) { + // Calculate hash code + $sheetIndex = $sheet->getParent()->getIndex($sheet); + + // Build styles + // Calculate column widths + $sheet->calculateColumnWidths(); + + // col elements, initialize + $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn()) - 1; + $column = -1; + while ($column++ < $highestColumnIndex) { + $this->columnWidths[$sheetIndex][$column] = 42; // approximation + $css['table.sheet' . $sheetIndex . ' col.col' . $column]['width'] = '42pt'; + } + + // col elements, loop through columnDimensions and set width + foreach ($sheet->getColumnDimensions() as $columnDimension) { + if (($width = PHPExcel_Shared_Drawing::cellDimensionToPixels($columnDimension->getWidth(), $this->defaultFont)) >= 0) { + $width = PHPExcel_Shared_Drawing::pixelsToPoints($width); + $column = PHPExcel_Cell::columnIndexFromString($columnDimension->getColumnIndex()) - 1; + $this->columnWidths[$sheetIndex][$column] = $width; + $css['table.sheet' . $sheetIndex . ' col.col' . $column]['width'] = $width . 'pt'; + + if ($columnDimension->getVisible() === false) { + $css['table.sheet' . $sheetIndex . ' col.col' . $column]['visibility'] = 'collapse'; + $css['table.sheet' . $sheetIndex . ' col.col' . $column]['*display'] = 'none'; // target IE6+7 + } + } + } + + // Default row height + $rowDimension = $sheet->getDefaultRowDimension(); + + // table.sheetN tr { } + $css['table.sheet' . $sheetIndex . ' tr'] = array(); + + if ($rowDimension->getRowHeight() == -1) { + $pt_height = PHPExcel_Shared_Font::getDefaultRowHeightByFont($this->phpExcel->getDefaultStyle()->getFont()); + } else { + $pt_height = $rowDimension->getRowHeight(); + } + $css['table.sheet' . $sheetIndex . ' tr']['height'] = $pt_height . 'pt'; + if ($rowDimension->getVisible() === false) { + $css['table.sheet' . $sheetIndex . ' tr']['display'] = 'none'; + $css['table.sheet' . $sheetIndex . ' tr']['visibility'] = 'hidden'; + } + + // Calculate row heights + foreach ($sheet->getRowDimensions() as $rowDimension) { + $row = $rowDimension->getRowIndex() - 1; + + // table.sheetN tr.rowYYYYYY { } + $css['table.sheet' . $sheetIndex . ' tr.row' . $row] = array(); + + if ($rowDimension->getRowHeight() == -1) { + $pt_height = PHPExcel_Shared_Font::getDefaultRowHeightByFont($this->phpExcel->getDefaultStyle()->getFont()); + } else { + $pt_height = $rowDimension->getRowHeight(); + } + $css['table.sheet' . $sheetIndex . ' tr.row' . $row]['height'] = $pt_height . 'pt'; + if ($rowDimension->getVisible() === false) { + $css['table.sheet' . $sheetIndex . ' tr.row' . $row]['display'] = 'none'; + $css['table.sheet' . $sheetIndex . ' tr.row' . $row]['visibility'] = 'hidden'; + } + } + } + + // Cache + if (is_null($this->cssStyles)) { + $this->cssStyles = $css; + } + + // Return + return $css; + } + + /** + * Create CSS style + * + * @param PHPExcel_Style $pStyle PHPExcel_Style + * @return array + */ + private function createCSSStyle(PHPExcel_Style $pStyle) + { + // Construct CSS + $css = ''; + + // Create CSS + $css = array_merge( + $this->createCSSStyleAlignment($pStyle->getAlignment()), + $this->createCSSStyleBorders($pStyle->getBorders()), + $this->createCSSStyleFont($pStyle->getFont()), + $this->createCSSStyleFill($pStyle->getFill()) + ); + + // Return + return $css; + } + + /** + * Create CSS style (PHPExcel_Style_Alignment) + * + * @param PHPExcel_Style_Alignment $pStyle PHPExcel_Style_Alignment + * @return array + */ + private function createCSSStyleAlignment(PHPExcel_Style_Alignment $pStyle) + { + // Construct CSS + $css = array(); + + // Create CSS + $css['vertical-align'] = $this->mapVAlign($pStyle->getVertical()); + if ($textAlign = $this->mapHAlign($pStyle->getHorizontal())) { + $css['text-align'] = $textAlign; + if (in_array($textAlign, array('left', 'right'))) { + $css['padding-'.$textAlign] = (string)((int)$pStyle->getIndent() * 9).'px'; + } + } + + return $css; + } + + /** + * Create CSS style (PHPExcel_Style_Font) + * + * @param PHPExcel_Style_Font $pStyle PHPExcel_Style_Font + * @return array + */ + private function createCSSStyleFont(PHPExcel_Style_Font $pStyle) + { + // Construct CSS + $css = array(); + + // Create CSS + if ($pStyle->getBold()) { + $css['font-weight'] = 'bold'; + } + if ($pStyle->getUnderline() != PHPExcel_Style_Font::UNDERLINE_NONE && $pStyle->getStrikethrough()) { + $css['text-decoration'] = 'underline line-through'; + } elseif ($pStyle->getUnderline() != PHPExcel_Style_Font::UNDERLINE_NONE) { + $css['text-decoration'] = 'underline'; + } elseif ($pStyle->getStrikethrough()) { + $css['text-decoration'] = 'line-through'; + } + if ($pStyle->getItalic()) { + $css['font-style'] = 'italic'; + } + + $css['color'] = '#' . $pStyle->getColor()->getRGB(); + $css['font-family'] = '\'' . $pStyle->getName() . '\''; + $css['font-size'] = $pStyle->getSize() . 'pt'; + + return $css; + } + + /** + * Create CSS style (PHPExcel_Style_Borders) + * + * @param PHPExcel_Style_Borders $pStyle PHPExcel_Style_Borders + * @return array + */ + private function createCSSStyleBorders(PHPExcel_Style_Borders $pStyle) + { + // Construct CSS + $css = array(); + + // Create CSS + $css['border-bottom'] = $this->createCSSStyleBorder($pStyle->getBottom()); + $css['border-top'] = $this->createCSSStyleBorder($pStyle->getTop()); + $css['border-left'] = $this->createCSSStyleBorder($pStyle->getLeft()); + $css['border-right'] = $this->createCSSStyleBorder($pStyle->getRight()); + + return $css; + } + + /** + * Create CSS style (PHPExcel_Style_Border) + * + * @param PHPExcel_Style_Border $pStyle PHPExcel_Style_Border + * @return string + */ + private function createCSSStyleBorder(PHPExcel_Style_Border $pStyle) + { + // Create CSS +// $css = $this->mapBorderStyle($pStyle->getBorderStyle()) . ' #' . $pStyle->getColor()->getRGB(); + // Create CSS - add !important to non-none border styles for merged cells + $borderStyle = $this->mapBorderStyle($pStyle->getBorderStyle()); + $css = $borderStyle . ' #' . $pStyle->getColor()->getRGB() . (($borderStyle == 'none') ? '' : ' !important'); + + return $css; + } + + /** + * Create CSS style (PHPExcel_Style_Fill) + * + * @param PHPExcel_Style_Fill $pStyle PHPExcel_Style_Fill + * @return array + */ + private function createCSSStyleFill(PHPExcel_Style_Fill $pStyle) + { + // Construct HTML + $css = array(); + + // Create CSS + $value = $pStyle->getFillType() == PHPExcel_Style_Fill::FILL_NONE ? + 'white' : '#' . $pStyle->getStartColor()->getRGB(); + $css['background-color'] = $value; + + return $css; + } + + /** + * Generate HTML footer + */ + public function generateHTMLFooter() + { + // Construct HTML + $html = ''; + $html .= ' </body>' . PHP_EOL; + $html .= '</html>' . PHP_EOL; + + return $html; + } + + /** + * Generate table header + * + * @param PHPExcel_Worksheet $pSheet The worksheet for the table we are writing + * @return string + * @throws PHPExcel_Writer_Exception + */ + private function generateTableHeader($pSheet) + { + $sheetIndex = $pSheet->getParent()->getIndex($pSheet); + + // Construct HTML + $html = ''; + $html .= $this->setMargins($pSheet); + + if (!$this->useInlineCss) { + $gridlines = $pSheet->getShowGridlines() ? ' gridlines' : ''; + $html .= ' <table border="0" cellpadding="0" cellspacing="0" id="sheet' . $sheetIndex . '" class="sheet' . $sheetIndex . $gridlines . '">' . PHP_EOL; + } else { + $style = isset($this->cssStyles['table']) ? + $this->assembleCSS($this->cssStyles['table']) : ''; + + if ($this->isPdf && $pSheet->getShowGridlines()) { + $html .= ' <table border="1" cellpadding="1" id="sheet' . $sheetIndex . '" cellspacing="1" style="' . $style . '">' . PHP_EOL; + } else { + $html .= ' <table border="0" cellpadding="1" id="sheet' . $sheetIndex . '" cellspacing="0" style="' . $style . '">' . PHP_EOL; + } + } + + // Write <col> elements + $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($pSheet->getHighestColumn()) - 1; + $i = -1; + while ($i++ < $highestColumnIndex) { + if (!$this->isPdf) { + if (!$this->useInlineCss) { + $html .= ' <col class="col' . $i . '">' . PHP_EOL; + } else { + $style = isset($this->cssStyles['table.sheet' . $sheetIndex . ' col.col' . $i]) ? + $this->assembleCSS($this->cssStyles['table.sheet' . $sheetIndex . ' col.col' . $i]) : ''; + $html .= ' <col style="' . $style . '">' . PHP_EOL; + } + } + } + + return $html; + } + + /** + * Generate table footer + * + * @throws PHPExcel_Writer_Exception + */ + private function generateTableFooter() + { + $html = ' </table>' . PHP_EOL; + + return $html; + } + + /** + * Generate row + * + * @param PHPExcel_Worksheet $pSheet PHPExcel_Worksheet + * @param array $pValues Array containing cells in a row + * @param int $pRow Row number (0-based) + * @return string + * @throws PHPExcel_Writer_Exception + */ + private function generateRow(PHPExcel_Worksheet $pSheet, $pValues = null, $pRow = 0, $cellType = 'td') + { + if (is_array($pValues)) { + // Construct HTML + $html = ''; + + // Sheet index + $sheetIndex = $pSheet->getParent()->getIndex($pSheet); + + // DomPDF and breaks + if ($this->isPdf && count($pSheet->getBreaks()) > 0) { + $breaks = $pSheet->getBreaks(); + + // check if a break is needed before this row + if (isset($breaks['A' . $pRow])) { + // close table: </table> + $html .= $this->generateTableFooter(); + + // insert page break + $html .= '<div style="page-break-before:always" />'; + + // open table again: <table> + <col> etc. + $html .= $this->generateTableHeader($pSheet); + } + } + + // Write row start + if (!$this->useInlineCss) { + $html .= ' <tr class="row' . $pRow . '">' . PHP_EOL; + } else { + $style = isset($this->cssStyles['table.sheet' . $sheetIndex . ' tr.row' . $pRow]) + ? $this->assembleCSS($this->cssStyles['table.sheet' . $sheetIndex . ' tr.row' . $pRow]) : ''; + + $html .= ' <tr style="' . $style . '">' . PHP_EOL; + } + + // Write cells + $colNum = 0; + foreach ($pValues as $cellAddress) { + $cell = ($cellAddress > '') ? $pSheet->getCell($cellAddress) : ''; + $coordinate = PHPExcel_Cell::stringFromColumnIndex($colNum) . ($pRow + 1); + if (!$this->useInlineCss) { + $cssClass = ''; + $cssClass = 'column' . $colNum; + } else { + $cssClass = array(); + if ($cellType == 'th') { + if (isset($this->cssStyles['table.sheet' . $sheetIndex . ' th.column' . $colNum])) { + $this->cssStyles['table.sheet' . $sheetIndex . ' th.column' . $colNum]; + } + } else { + if (isset($this->cssStyles['table.sheet' . $sheetIndex . ' td.column' . $colNum])) { + $this->cssStyles['table.sheet' . $sheetIndex . ' td.column' . $colNum]; + } + } + } + $colSpan = 1; + $rowSpan = 1; + + // initialize + $cellData = '&nbsp;'; + + // PHPExcel_Cell + if ($cell instanceof PHPExcel_Cell) { + $cellData = ''; + if (is_null($cell->getParent())) { + $cell->attach($pSheet); + } + // Value + if ($cell->getValue() instanceof PHPExcel_RichText) { + // Loop through rich text elements + $elements = $cell->getValue()->getRichTextElements(); + foreach ($elements as $element) { + // Rich text start? + if ($element instanceof PHPExcel_RichText_Run) { + $cellData .= '<span style="' . $this->assembleCSS($this->createCSSStyleFont($element->getFont())) . '">'; + + if ($element->getFont()->getSuperScript()) { + $cellData .= '<sup>'; + } elseif ($element->getFont()->getSubScript()) { + $cellData .= '<sub>'; + } + } + + // Convert UTF8 data to PCDATA + $cellText = $element->getText(); + $cellData .= htmlspecialchars($cellText); + + if ($element instanceof PHPExcel_RichText_Run) { + if ($element->getFont()->getSuperScript()) { + $cellData .= '</sup>'; + } elseif ($element->getFont()->getSubScript()) { + $cellData .= '</sub>'; + } + + $cellData .= '</span>'; + } + } + } else { + if ($this->preCalculateFormulas) { + $cellData = PHPExcel_Style_NumberFormat::toFormattedString( + $cell->getCalculatedValue(), + $pSheet->getParent()->getCellXfByIndex($cell->getXfIndex())->getNumberFormat()->getFormatCode(), + array($this, 'formatColor') + ); + } else { + $cellData = PHPExcel_Style_NumberFormat::toFormattedString( + $cell->getValue(), + $pSheet->getParent()->getCellXfByIndex($cell->getXfIndex())->getNumberFormat()->getFormatCode(), + array($this, 'formatColor') + ); + } + $cellData = htmlspecialchars($cellData); + if ($pSheet->getParent()->getCellXfByIndex($cell->getXfIndex())->getFont()->getSuperScript()) { + $cellData = '<sup>'.$cellData.'</sup>'; + } elseif ($pSheet->getParent()->getCellXfByIndex($cell->getXfIndex())->getFont()->getSubScript()) { + $cellData = '<sub>'.$cellData.'</sub>'; + } + } + + // Converts the cell content so that spaces occuring at beginning of each new line are replaced by &nbsp; + // Example: " Hello\n to the world" is converted to "&nbsp;&nbsp;Hello\n&nbsp;to the world" + $cellData = preg_replace("/(?m)(?:^|\\G) /", '&nbsp;', $cellData); + + // convert newline "\n" to '<br>' + $cellData = nl2br($cellData); + + // Extend CSS class? + if (!$this->useInlineCss) { + $cssClass .= ' style' . $cell->getXfIndex(); + $cssClass .= ' ' . $cell->getDataType(); + } else { + if ($cellType == 'th') { + if (isset($this->cssStyles['th.style' . $cell->getXfIndex()])) { + $cssClass = array_merge($cssClass, $this->cssStyles['th.style' . $cell->getXfIndex()]); + } + } else { + if (isset($this->cssStyles['td.style' . $cell->getXfIndex()])) { + $cssClass = array_merge($cssClass, $this->cssStyles['td.style' . $cell->getXfIndex()]); + } + } + + // General horizontal alignment: Actual horizontal alignment depends on dataType + $sharedStyle = $pSheet->getParent()->getCellXfByIndex($cell->getXfIndex()); + if ($sharedStyle->getAlignment()->getHorizontal() == PHPExcel_Style_Alignment::HORIZONTAL_GENERAL + && isset($this->cssStyles['.' . $cell->getDataType()]['text-align'])) { + $cssClass['text-align'] = $this->cssStyles['.' . $cell->getDataType()]['text-align']; + } + } + } + + // Hyperlink? + if ($pSheet->hyperlinkExists($coordinate) && !$pSheet->getHyperlink($coordinate)->isInternal()) { + $cellData = '<a href="' . htmlspecialchars($pSheet->getHyperlink($coordinate)->getUrl()) . '" title="' . htmlspecialchars($pSheet->getHyperlink($coordinate)->getTooltip()) . '">' . $cellData . '</a>'; + } + + // Should the cell be written or is it swallowed by a rowspan or colspan? + $writeCell = !(isset($this->isSpannedCell[$pSheet->getParent()->getIndex($pSheet)][$pRow + 1][$colNum]) + && $this->isSpannedCell[$pSheet->getParent()->getIndex($pSheet)][$pRow + 1][$colNum]); + + // Colspan and Rowspan + $colspan = 1; + $rowspan = 1; + if (isset($this->isBaseCell[$pSheet->getParent()->getIndex($pSheet)][$pRow + 1][$colNum])) { + $spans = $this->isBaseCell[$pSheet->getParent()->getIndex($pSheet)][$pRow + 1][$colNum]; + $rowSpan = $spans['rowspan']; + $colSpan = $spans['colspan']; + + // Also apply style from last cell in merge to fix borders - + // relies on !important for non-none border declarations in createCSSStyleBorder + $endCellCoord = PHPExcel_Cell::stringFromColumnIndex($colNum + $colSpan - 1) . ($pRow + $rowSpan); + if (!$this->useInlineCss) { + $cssClass .= ' style' . $pSheet->getCell($endCellCoord)->getXfIndex(); + } + } + + // Write + if ($writeCell) { + // Column start + $html .= ' <' . $cellType; + if (!$this->useInlineCss) { + $html .= ' class="' . $cssClass . '"'; + } else { + //** Necessary redundant code for the sake of PHPExcel_Writer_PDF ** + // We must explicitly write the width of the <td> element because TCPDF + // does not recognize e.g. <col style="width:42pt"> + $width = 0; + $i = $colNum - 1; + $e = $colNum + $colSpan - 1; + while ($i++ < $e) { + if (isset($this->columnWidths[$sheetIndex][$i])) { + $width += $this->columnWidths[$sheetIndex][$i]; + } + } + $cssClass['width'] = $width . 'pt'; + + // We must also explicitly write the height of the <td> element because TCPDF + // does not recognize e.g. <tr style="height:50pt"> + if (isset($this->cssStyles['table.sheet' . $sheetIndex . ' tr.row' . $pRow]['height'])) { + $height = $this->cssStyles['table.sheet' . $sheetIndex . ' tr.row' . $pRow]['height']; + $cssClass['height'] = $height; + } + //** end of redundant code ** + + $html .= ' style="' . $this->assembleCSS($cssClass) . '"'; + } + if ($colSpan > 1) { + $html .= ' colspan="' . $colSpan . '"'; + } + if ($rowSpan > 1) { + $html .= ' rowspan="' . $rowSpan . '"'; + } + $html .= '>'; + + // Image? + $html .= $this->writeImageInCell($pSheet, $coordinate); + + // Chart? + if ($this->includeCharts) { + $html .= $this->writeChartInCell($pSheet, $coordinate); + } + + // Cell data + $html .= $cellData; + + // Column end + $html .= '</'.$cellType.'>' . PHP_EOL; + } + + // Next column + ++$colNum; + } + + // Write row end + $html .= ' </tr>' . PHP_EOL; + + // Return + return $html; + } else { + throw new PHPExcel_Writer_Exception("Invalid parameters passed."); + } + } + + /** + * Takes array where of CSS properties / values and converts to CSS string + * + * @param array + * @return string + */ + private function assembleCSS($pValue = array()) + { + $pairs = array(); + foreach ($pValue as $property => $value) { + $pairs[] = $property . ':' . $value; + } + $string = implode('; ', $pairs); + + return $string; + } + + /** + * Get images root + * + * @return string + */ + public function getImagesRoot() + { + return $this->imagesRoot; + } + + /** + * Set images root + * + * @param string $pValue + * @return PHPExcel_Writer_HTML + */ + public function setImagesRoot($pValue = '.') + { + $this->imagesRoot = $pValue; + return $this; + } + + /** + * Get embed images + * + * @return boolean + */ + public function getEmbedImages() + { + return $this->embedImages; + } + + /** + * Set embed images + * + * @param boolean $pValue + * @return PHPExcel_Writer_HTML + */ + public function setEmbedImages($pValue = '.') + { + $this->embedImages = $pValue; + return $this; + } + + /** + * Get use inline CSS? + * + * @return boolean + */ + public function getUseInlineCss() + { + return $this->useInlineCss; + } + + /** + * Set use inline CSS? + * + * @param boolean $pValue + * @return PHPExcel_Writer_HTML + */ + public function setUseInlineCss($pValue = false) + { + $this->useInlineCss = $pValue; + return $this; + } + + /** + * Add color to formatted string as inline style + * + * @param string $pValue Plain formatted value without color + * @param string $pFormat Format code + * @return string + */ + public function formatColor($pValue, $pFormat) + { + // Color information, e.g. [Red] is always at the beginning + $color = null; // initialize + $matches = array(); + + $color_regex = '/^\\[[a-zA-Z]+\\]/'; + if (preg_match($color_regex, $pFormat, $matches)) { + $color = str_replace('[', '', $matches[0]); + $color = str_replace(']', '', $color); + $color = strtolower($color); + } + + // convert to PCDATA + $value = htmlspecialchars($pValue); + + // color span tag + if ($color !== null) { + $value = '<span style="color:' . $color . '">' . $value . '</span>'; + } + + return $value; + } + + /** + * Calculate information about HTML colspan and rowspan which is not always the same as Excel's + */ + private function calculateSpans() + { + // Identify all cells that should be omitted in HTML due to cell merge. + // In HTML only the upper-left cell should be written and it should have + // appropriate rowspan / colspan attribute + $sheetIndexes = $this->sheetIndex !== null ? + array($this->sheetIndex) : range(0, $this->phpExcel->getSheetCount() - 1); + + foreach ($sheetIndexes as $sheetIndex) { + $sheet = $this->phpExcel->getSheet($sheetIndex); + + $candidateSpannedRow = array(); + + // loop through all Excel merged cells + foreach ($sheet->getMergeCells() as $cells) { + list($cells,) = PHPExcel_Cell::splitRange($cells); + $first = $cells[0]; + $last = $cells[1]; + + list($fc, $fr) = PHPExcel_Cell::coordinateFromString($first); + $fc = PHPExcel_Cell::columnIndexFromString($fc) - 1; + + list($lc, $lr) = PHPExcel_Cell::coordinateFromString($last); + $lc = PHPExcel_Cell::columnIndexFromString($lc) - 1; + + // loop through the individual cells in the individual merge + $r = $fr - 1; + while ($r++ < $lr) { + // also, flag this row as a HTML row that is candidate to be omitted + $candidateSpannedRow[$r] = $r; + + $c = $fc - 1; + while ($c++ < $lc) { + if (!($c == $fc && $r == $fr)) { + // not the upper-left cell (should not be written in HTML) + $this->isSpannedCell[$sheetIndex][$r][$c] = array( + 'baseCell' => array($fr, $fc), + ); + } else { + // upper-left is the base cell that should hold the colspan/rowspan attribute + $this->isBaseCell[$sheetIndex][$r][$c] = array( + 'xlrowspan' => $lr - $fr + 1, // Excel rowspan + 'rowspan' => $lr - $fr + 1, // HTML rowspan, value may change + 'xlcolspan' => $lc - $fc + 1, // Excel colspan + 'colspan' => $lc - $fc + 1, // HTML colspan, value may change + ); + } + } + } + } + + // Identify which rows should be omitted in HTML. These are the rows where all the cells + // participate in a merge and the where base cells are somewhere above. + $countColumns = PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn()); + foreach ($candidateSpannedRow as $rowIndex) { + if (isset($this->isSpannedCell[$sheetIndex][$rowIndex])) { + if (count($this->isSpannedCell[$sheetIndex][$rowIndex]) == $countColumns) { + $this->isSpannedRow[$sheetIndex][$rowIndex] = $rowIndex; + }; + } + } + + // For each of the omitted rows we found above, the affected rowspans should be subtracted by 1 + if (isset($this->isSpannedRow[$sheetIndex])) { + foreach ($this->isSpannedRow[$sheetIndex] as $rowIndex) { + $adjustedBaseCells = array(); + $c = -1; + $e = $countColumns - 1; + while ($c++ < $e) { + $baseCell = $this->isSpannedCell[$sheetIndex][$rowIndex][$c]['baseCell']; + + if (!in_array($baseCell, $adjustedBaseCells)) { + // subtract rowspan by 1 + --$this->isBaseCell[$sheetIndex][ $baseCell[0] ][ $baseCell[1] ]['rowspan']; + $adjustedBaseCells[] = $baseCell; + } + } + } + } + + // TODO: Same for columns + } + + // We have calculated the spans + $this->spansAreCalculated = true; + } + + private function setMargins(PHPExcel_Worksheet $pSheet) + { + $htmlPage = '@page { '; + $htmlBody = 'body { '; + + $left = PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getLeft()) . 'in; '; + $htmlPage .= 'margin-left: ' . $left; + $htmlBody .= 'margin-left: ' . $left; + $right = PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getRight()) . 'in; '; + $htmlPage .= 'margin-right: ' . $right; + $htmlBody .= 'margin-right: ' . $right; + $top = PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getTop()) . 'in; '; + $htmlPage .= 'margin-top: ' . $top; + $htmlBody .= 'margin-top: ' . $top; + $bottom = PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getBottom()) . 'in; '; + $htmlPage .= 'margin-bottom: ' . $bottom; + $htmlBody .= 'margin-bottom: ' . $bottom; + + $htmlPage .= "}\n"; + $htmlBody .= "}\n"; + + return "<style>\n" . $htmlPage . $htmlBody . "</style>\n"; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/IWriter.php b/application/third_party/PHPExcel/PHPExcel/Writer/IWriter.php new file mode 100644 index 0000000..c7cfe74 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/IWriter.php @@ -0,0 +1,37 @@ +<?php + +/** + * PHPExcel_Writer_IWriter + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +interface PHPExcel_Writer_IWriter +{ + /** + * Save PHPExcel to file + * + * @param string $pFilename Name of the file to save + * @throws PHPExcel_Writer_Exception + */ + public function save($pFilename = null); +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument.php b/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument.php new file mode 100644 index 0000000..912ba9d --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument.php @@ -0,0 +1,190 @@ +<?php + +/** + * PHPExcel_Writer_OpenDocument + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_OpenDocument + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_OpenDocument extends PHPExcel_Writer_Abstract implements PHPExcel_Writer_IWriter +{ + /** + * Private writer parts + * + * @var PHPExcel_Writer_OpenDocument_WriterPart[] + */ + private $writerParts = array(); + + /** + * Private PHPExcel + * + * @var PHPExcel + */ + private $spreadSheet; + + /** + * Create a new PHPExcel_Writer_OpenDocument + * + * @param PHPExcel $pPHPExcel + */ + public function __construct(PHPExcel $pPHPExcel = null) + { + $this->setPHPExcel($pPHPExcel); + + $writerPartsArray = array( + 'content' => 'PHPExcel_Writer_OpenDocument_Content', + 'meta' => 'PHPExcel_Writer_OpenDocument_Meta', + 'meta_inf' => 'PHPExcel_Writer_OpenDocument_MetaInf', + 'mimetype' => 'PHPExcel_Writer_OpenDocument_Mimetype', + 'settings' => 'PHPExcel_Writer_OpenDocument_Settings', + 'styles' => 'PHPExcel_Writer_OpenDocument_Styles', + 'thumbnails' => 'PHPExcel_Writer_OpenDocument_Thumbnails' + ); + + foreach ($writerPartsArray as $writer => $class) { + $this->writerParts[$writer] = new $class($this); + } + } + + /** + * Get writer part + * + * @param string $pPartName Writer part name + * @return PHPExcel_Writer_Excel2007_WriterPart + */ + public function getWriterPart($pPartName = '') + { + if ($pPartName != '' && isset($this->writerParts[strtolower($pPartName)])) { + return $this->writerParts[strtolower($pPartName)]; + } else { + return null; + } + } + + /** + * Save PHPExcel to file + * + * @param string $pFilename + * @throws PHPExcel_Writer_Exception + */ + public function save($pFilename = null) + { + if (!$this->spreadSheet) { + throw new PHPExcel_Writer_Exception('PHPExcel object unassigned.'); + } + + // garbage collect + $this->spreadSheet->garbageCollect(); + + // If $pFilename is php://output or php://stdout, make it a temporary file... + $originalFilename = $pFilename; + if (strtolower($pFilename) == 'php://output' || strtolower($pFilename) == 'php://stdout') { + $pFilename = @tempnam(PHPExcel_Shared_File::sys_get_temp_dir(), 'phpxltmp'); + if ($pFilename == '') { + $pFilename = $originalFilename; + } + } + + $objZip = $this->createZip($pFilename); + + $objZip->addFromString('META-INF/manifest.xml', $this->getWriterPart('meta_inf')->writeManifest()); + $objZip->addFromString('Thumbnails/thumbnail.png', $this->getWriterPart('thumbnails')->writeThumbnail()); + $objZip->addFromString('content.xml', $this->getWriterPart('content')->write()); + $objZip->addFromString('meta.xml', $this->getWriterPart('meta')->write()); + $objZip->addFromString('mimetype', $this->getWriterPart('mimetype')->write()); + $objZip->addFromString('settings.xml', $this->getWriterPart('settings')->write()); + $objZip->addFromString('styles.xml', $this->getWriterPart('styles')->write()); + + // Close file + if ($objZip->close() === false) { + throw new PHPExcel_Writer_Exception("Could not close zip file $pFilename."); + } + + // If a temporary file was used, copy it to the correct file stream + if ($originalFilename != $pFilename) { + if (copy($pFilename, $originalFilename) === false) { + throw new PHPExcel_Writer_Exception("Could not copy temporary zip file $pFilename to $originalFilename."); + } + @unlink($pFilename); + } + } + + /** + * Create zip object + * + * @param string $pFilename + * @throws PHPExcel_Writer_Exception + * @return ZipArchive + */ + private function createZip($pFilename) + { + // Create new ZIP file and open it for writing + $zipClass = PHPExcel_Settings::getZipClass(); + $objZip = new $zipClass(); + + // Retrieve OVERWRITE and CREATE constants from the instantiated zip class + // This method of accessing constant values from a dynamic class should work with all appropriate versions of PHP + $ro = new ReflectionObject($objZip); + $zipOverWrite = $ro->getConstant('OVERWRITE'); + $zipCreate = $ro->getConstant('CREATE'); + + if (file_exists($pFilename)) { + unlink($pFilename); + } + // Try opening the ZIP file + if ($objZip->open($pFilename, $zipOverWrite) !== true) { + if ($objZip->open($pFilename, $zipCreate) !== true) { + throw new PHPExcel_Writer_Exception("Could not open $pFilename for writing."); + } + } + + return $objZip; + } + + /** + * Get PHPExcel object + * + * @return PHPExcel + * @throws PHPExcel_Writer_Exception + */ + public function getPHPExcel() + { + if ($this->spreadSheet !== null) { + return $this->spreadSheet; + } else { + throw new PHPExcel_Writer_Exception('No PHPExcel assigned.'); + } + } + + /** + * Set PHPExcel object + * + * @param PHPExcel $pPHPExcel PHPExcel object + * @throws PHPExcel_Writer_Exception + * @return PHPExcel_Writer_Excel2007 + */ + public function setPHPExcel(PHPExcel $pPHPExcel = null) + { + $this->spreadSheet = $pPHPExcel; + return $this; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/Cell/Comment.php b/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/Cell/Comment.php new file mode 100644 index 0000000..f1e98a1 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/Cell/Comment.php @@ -0,0 +1,63 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_OpenDocument + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ + + +/** + * PHPExcel_Writer_OpenDocument_Cell_Comment + * + * @category PHPExcel + * @package PHPExcel_Writer_OpenDocument + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @author Alexander Pervakov <frost-nzcr4@jagmort.com> + */ +class PHPExcel_Writer_OpenDocument_Cell_Comment +{ + public static function write(PHPExcel_Shared_XMLWriter $objWriter, PHPExcel_Cell $cell) + { + $comments = $cell->getWorksheet()->getComments(); + if (!isset($comments[$cell->getCoordinate()])) { + return; + } + $comment = $comments[$cell->getCoordinate()]; + + $objWriter->startElement('office:annotation'); + //$objWriter->writeAttribute('draw:style-name', 'gr1'); + //$objWriter->writeAttribute('draw:text-style-name', 'P1'); + $objWriter->writeAttribute('svg:width', $comment->getWidth()); + $objWriter->writeAttribute('svg:height', $comment->getHeight()); + $objWriter->writeAttribute('svg:x', $comment->getMarginLeft()); + $objWriter->writeAttribute('svg:y', $comment->getMarginTop()); + //$objWriter->writeAttribute('draw:caption-point-x', $comment->getMarginLeft()); + //$objWriter->writeAttribute('draw:caption-point-y', $comment->getMarginTop()); + $objWriter->writeElement('dc:creator', $comment->getAuthor()); + // TODO: Not realized in PHPExcel_Comment yet. + //$objWriter->writeElement('dc:date', $comment->getDate()); + $objWriter->writeElement('text:p', $comment->getText()->getPlainText()); + //$objWriter->writeAttribute('draw:text-style-name', 'P1'); + $objWriter->endElement(); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/Content.php b/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/Content.php new file mode 100644 index 0000000..a34b167 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/Content.php @@ -0,0 +1,272 @@ +<?php +/** + * PHPExcel + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_OpenDocument + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ + + +/** + * PHPExcel_Writer_OpenDocument_Content + * + * @category PHPExcel + * @package PHPExcel_Writer_OpenDocument + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @author Alexander Pervakov <frost-nzcr4@jagmort.com> + */ +class PHPExcel_Writer_OpenDocument_Content extends PHPExcel_Writer_OpenDocument_WriterPart +{ + const NUMBER_COLS_REPEATED_MAX = 1024; + const NUMBER_ROWS_REPEATED_MAX = 1048576; + + /** + * Write content.xml to XML format + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function write(PHPExcel $pPHPExcel = null) + { + if (!$pPHPExcel) { + $pPHPExcel = $this->getParentWriter()->getPHPExcel(); /* @var $pPHPExcel PHPExcel */ + } + + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8'); + + // Content + $objWriter->startElement('office:document-content'); + $objWriter->writeAttribute('xmlns:office', 'urn:oasis:names:tc:opendocument:xmlns:office:1.0'); + $objWriter->writeAttribute('xmlns:style', 'urn:oasis:names:tc:opendocument:xmlns:style:1.0'); + $objWriter->writeAttribute('xmlns:text', 'urn:oasis:names:tc:opendocument:xmlns:text:1.0'); + $objWriter->writeAttribute('xmlns:table', 'urn:oasis:names:tc:opendocument:xmlns:table:1.0'); + $objWriter->writeAttribute('xmlns:draw', 'urn:oasis:names:tc:opendocument:xmlns:drawing:1.0'); + $objWriter->writeAttribute('xmlns:fo', 'urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0'); + $objWriter->writeAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink'); + $objWriter->writeAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/'); + $objWriter->writeAttribute('xmlns:meta', 'urn:oasis:names:tc:opendocument:xmlns:meta:1.0'); + $objWriter->writeAttribute('xmlns:number', 'urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0'); + $objWriter->writeAttribute('xmlns:presentation', 'urn:oasis:names:tc:opendocument:xmlns:presentation:1.0'); + $objWriter->writeAttribute('xmlns:svg', 'urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0'); + $objWriter->writeAttribute('xmlns:chart', 'urn:oasis:names:tc:opendocument:xmlns:chart:1.0'); + $objWriter->writeAttribute('xmlns:dr3d', 'urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0'); + $objWriter->writeAttribute('xmlns:math', 'http://www.w3.org/1998/Math/MathML'); + $objWriter->writeAttribute('xmlns:form', 'urn:oasis:names:tc:opendocument:xmlns:form:1.0'); + $objWriter->writeAttribute('xmlns:script', 'urn:oasis:names:tc:opendocument:xmlns:script:1.0'); + $objWriter->writeAttribute('xmlns:ooo', 'http://openoffice.org/2004/office'); + $objWriter->writeAttribute('xmlns:ooow', 'http://openoffice.org/2004/writer'); + $objWriter->writeAttribute('xmlns:oooc', 'http://openoffice.org/2004/calc'); + $objWriter->writeAttribute('xmlns:dom', 'http://www.w3.org/2001/xml-events'); + $objWriter->writeAttribute('xmlns:xforms', 'http://www.w3.org/2002/xforms'); + $objWriter->writeAttribute('xmlns:xsd', 'http://www.w3.org/2001/XMLSchema'); + $objWriter->writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); + $objWriter->writeAttribute('xmlns:rpt', 'http://openoffice.org/2005/report'); + $objWriter->writeAttribute('xmlns:of', 'urn:oasis:names:tc:opendocument:xmlns:of:1.2'); + $objWriter->writeAttribute('xmlns:xhtml', 'http://www.w3.org/1999/xhtml'); + $objWriter->writeAttribute('xmlns:grddl', 'http://www.w3.org/2003/g/data-view#'); + $objWriter->writeAttribute('xmlns:tableooo', 'http://openoffice.org/2009/table'); + $objWriter->writeAttribute('xmlns:field', 'urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0'); + $objWriter->writeAttribute('xmlns:formx', 'urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0'); + $objWriter->writeAttribute('xmlns:css3t', 'http://www.w3.org/TR/css3-text/'); + $objWriter->writeAttribute('office:version', '1.2'); + + $objWriter->writeElement('office:scripts'); + $objWriter->writeElement('office:font-face-decls'); + $objWriter->writeElement('office:automatic-styles'); + + $objWriter->startElement('office:body'); + $objWriter->startElement('office:spreadsheet'); + $objWriter->writeElement('table:calculation-settings'); + $this->writeSheets($objWriter); + $objWriter->writeElement('table:named-expressions'); + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + + return $objWriter->getData(); + } + + /** + * Write sheets + * + * @param PHPExcel_Shared_XMLWriter $objWriter + */ + private function writeSheets(PHPExcel_Shared_XMLWriter $objWriter) + { + $pPHPExcel = $this->getParentWriter()->getPHPExcel(); /* @var $pPHPExcel PHPExcel */ + + $sheet_count = $pPHPExcel->getSheetCount(); + for ($i = 0; $i < $sheet_count; $i++) { + //$this->getWriterPart('Worksheet')->writeWorksheet()); + $objWriter->startElement('table:table'); + $objWriter->writeAttribute('table:name', $pPHPExcel->getSheet($i)->getTitle()); + $objWriter->writeElement('office:forms'); + $objWriter->startElement('table:table-column'); + $objWriter->writeAttribute('table:number-columns-repeated', self::NUMBER_COLS_REPEATED_MAX); + $objWriter->endElement(); + $this->writeRows($objWriter, $pPHPExcel->getSheet($i)); + $objWriter->endElement(); + } + } + + /** + * Write rows of the specified sheet + * + * @param PHPExcel_Shared_XMLWriter $objWriter + * @param PHPExcel_Worksheet $sheet + */ + private function writeRows(PHPExcel_Shared_XMLWriter $objWriter, PHPExcel_Worksheet $sheet) + { + $number_rows_repeated = self::NUMBER_ROWS_REPEATED_MAX; + $span_row = 0; + $rows = $sheet->getRowIterator(); + while ($rows->valid()) { + $number_rows_repeated--; + $row = $rows->current(); + if ($row->getCellIterator()->valid()) { + if ($span_row) { + $objWriter->startElement('table:table-row'); + if ($span_row > 1) { + $objWriter->writeAttribute('table:number-rows-repeated', $span_row); + } + $objWriter->startElement('table:table-cell'); + $objWriter->writeAttribute('table:number-columns-repeated', self::NUMBER_COLS_REPEATED_MAX); + $objWriter->endElement(); + $objWriter->endElement(); + $span_row = 0; + } + $objWriter->startElement('table:table-row'); + $this->writeCells($objWriter, $row); + $objWriter->endElement(); + } else { + $span_row++; + } + $rows->next(); + } + } + + /** + * Write cells of the specified row + * + * @param PHPExcel_Shared_XMLWriter $objWriter + * @param PHPExcel_Worksheet_Row $row + * @throws PHPExcel_Writer_Exception + */ + private function writeCells(PHPExcel_Shared_XMLWriter $objWriter, PHPExcel_Worksheet_Row $row) + { + $number_cols_repeated = self::NUMBER_COLS_REPEATED_MAX; + $prev_column = -1; + $cells = $row->getCellIterator(); + while ($cells->valid()) { + $cell = $cells->current(); + $column = PHPExcel_Cell::columnIndexFromString($cell->getColumn()) - 1; + + $this->writeCellSpan($objWriter, $column, $prev_column); + $objWriter->startElement('table:table-cell'); + + switch ($cell->getDataType()) { + case PHPExcel_Cell_DataType::TYPE_BOOL: + $objWriter->writeAttribute('office:value-type', 'boolean'); + $objWriter->writeAttribute('office:value', $cell->getValue()); + $objWriter->writeElement('text:p', $cell->getValue()); + break; + + case PHPExcel_Cell_DataType::TYPE_ERROR: + throw new PHPExcel_Writer_Exception('Writing of error not implemented yet.'); + break; + + case PHPExcel_Cell_DataType::TYPE_FORMULA: + try { + $formula_value = $cell->getCalculatedValue(); + } catch (Exception $e) { + $formula_value = $cell->getValue(); + } + $objWriter->writeAttribute('table:formula', 'of:' . $cell->getValue()); + if (is_numeric($formula_value)) { + $objWriter->writeAttribute('office:value-type', 'float'); + } else { + $objWriter->writeAttribute('office:value-type', 'string'); + } + $objWriter->writeAttribute('office:value', $formula_value); + $objWriter->writeElement('text:p', $formula_value); + break; + + case PHPExcel_Cell_DataType::TYPE_INLINE: + throw new PHPExcel_Writer_Exception('Writing of inline not implemented yet.'); + break; + + case PHPExcel_Cell_DataType::TYPE_NUMERIC: + $objWriter->writeAttribute('office:value-type', 'float'); + $objWriter->writeAttribute('office:value', $cell->getValue()); + $objWriter->writeElement('text:p', $cell->getValue()); + break; + + case PHPExcel_Cell_DataType::TYPE_STRING: + $objWriter->writeAttribute('office:value-type', 'string'); + $objWriter->writeElement('text:p', $cell->getValue()); + break; + } + PHPExcel_Writer_OpenDocument_Cell_Comment::write($objWriter, $cell); + $objWriter->endElement(); + $prev_column = $column; + $cells->next(); + } + $number_cols_repeated = $number_cols_repeated - $prev_column - 1; + if ($number_cols_repeated > 0) { + if ($number_cols_repeated > 1) { + $objWriter->startElement('table:table-cell'); + $objWriter->writeAttribute('table:number-columns-repeated', $number_cols_repeated); + $objWriter->endElement(); + } else { + $objWriter->writeElement('table:table-cell'); + } + } + } + + /** + * Write span + * + * @param PHPExcel_Shared_XMLWriter $objWriter + * @param integer $curColumn + * @param integer $prevColumn + */ + private function writeCellSpan(PHPExcel_Shared_XMLWriter $objWriter, $curColumn, $prevColumn) + { + $diff = $curColumn - $prevColumn - 1; + if (1 === $diff) { + $objWriter->writeElement('table:table-cell'); + } elseif ($diff > 1) { + $objWriter->startElement('table:table-cell'); + $objWriter->writeAttribute('table:number-columns-repeated', $diff); + $objWriter->endElement(); + } + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/Meta.php b/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/Meta.php new file mode 100644 index 0000000..1a5c5fd --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/Meta.php @@ -0,0 +1,95 @@ +<?php + +/** + * PHPExcel_Writer_OpenDocument_Meta + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_OpenDocument + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_OpenDocument_Meta extends PHPExcel_Writer_OpenDocument_WriterPart +{ + /** + * Write meta.xml to XML format + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function write(PHPExcel $pPHPExcel = null) + { + if (!$pPHPExcel) { + $pPHPExcel = $this->getParentWriter()->getPHPExcel(); + } + + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8'); + + // Meta + $objWriter->startElement('office:document-meta'); + + $objWriter->writeAttribute('xmlns:office', 'urn:oasis:names:tc:opendocument:xmlns:office:1.0'); + $objWriter->writeAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink'); + $objWriter->writeAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/'); + $objWriter->writeAttribute('xmlns:meta', 'urn:oasis:names:tc:opendocument:xmlns:meta:1.0'); + $objWriter->writeAttribute('xmlns:ooo', 'http://openoffice.org/2004/office'); + $objWriter->writeAttribute('xmlns:grddl', 'http://www.w3.org/2003/g/data-view#'); + $objWriter->writeAttribute('office:version', '1.2'); + + $objWriter->startElement('office:meta'); + + $objWriter->writeElement('meta:initial-creator', $pPHPExcel->getProperties()->getCreator()); + $objWriter->writeElement('dc:creator', $pPHPExcel->getProperties()->getCreator()); + $objWriter->writeElement('meta:creation-date', date(DATE_W3C, $pPHPExcel->getProperties()->getCreated())); + $objWriter->writeElement('dc:date', date(DATE_W3C, $pPHPExcel->getProperties()->getCreated())); + $objWriter->writeElement('dc:title', $pPHPExcel->getProperties()->getTitle()); + $objWriter->writeElement('dc:description', $pPHPExcel->getProperties()->getDescription()); + $objWriter->writeElement('dc:subject', $pPHPExcel->getProperties()->getSubject()); + $keywords = explode(' ', $pPHPExcel->getProperties()->getKeywords()); + foreach ($keywords as $keyword) { + $objWriter->writeElement('meta:keyword', $keyword); + } + + //<meta:document-statistic meta:table-count="XXX" meta:cell-count="XXX" meta:object-count="XXX"/> + $objWriter->startElement('meta:user-defined'); + $objWriter->writeAttribute('meta:name', 'Company'); + $objWriter->writeRaw($pPHPExcel->getProperties()->getCompany()); + $objWriter->endElement(); + + $objWriter->startElement('meta:user-defined'); + $objWriter->writeAttribute('meta:name', 'category'); + $objWriter->writeRaw($pPHPExcel->getProperties()->getCategory()); + $objWriter->endElement(); + + $objWriter->endElement(); + + $objWriter->endElement(); + + return $objWriter->getData(); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/MetaInf.php b/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/MetaInf.php new file mode 100644 index 0000000..c43b723 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/MetaInf.php @@ -0,0 +1,87 @@ +<?php + +/** + * PHPExcel_Writer_OpenDocument_MetaInf + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_OpenDocument + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_OpenDocument_MetaInf extends PHPExcel_Writer_OpenDocument_WriterPart +{ + /** + * Write META-INF/manifest.xml to XML format + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeManifest(PHPExcel $pPHPExcel = null) + { + if (!$pPHPExcel) { + $pPHPExcel = $this->getParentWriter()->getPHPExcel(); + } + + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8'); + + // Manifest + $objWriter->startElement('manifest:manifest'); + $objWriter->writeAttribute('xmlns:manifest', 'urn:oasis:names:tc:opendocument:xmlns:manifest:1.0'); + $objWriter->writeAttribute('manifest:version', '1.2'); + + $objWriter->startElement('manifest:file-entry'); + $objWriter->writeAttribute('manifest:full-path', '/'); + $objWriter->writeAttribute('manifest:version', '1.2'); + $objWriter->writeAttribute('manifest:media-type', 'application/vnd.oasis.opendocument.spreadsheet'); + $objWriter->endElement(); + $objWriter->startElement('manifest:file-entry'); + $objWriter->writeAttribute('manifest:full-path', 'meta.xml'); + $objWriter->writeAttribute('manifest:media-type', 'text/xml'); + $objWriter->endElement(); + $objWriter->startElement('manifest:file-entry'); + $objWriter->writeAttribute('manifest:full-path', 'settings.xml'); + $objWriter->writeAttribute('manifest:media-type', 'text/xml'); + $objWriter->endElement(); + $objWriter->startElement('manifest:file-entry'); + $objWriter->writeAttribute('manifest:full-path', 'content.xml'); + $objWriter->writeAttribute('manifest:media-type', 'text/xml'); + $objWriter->endElement(); + $objWriter->startElement('manifest:file-entry'); + $objWriter->writeAttribute('manifest:full-path', 'Thumbnails/thumbnail.png'); + $objWriter->writeAttribute('manifest:media-type', 'image/png'); + $objWriter->endElement(); + $objWriter->startElement('manifest:file-entry'); + $objWriter->writeAttribute('manifest:full-path', 'styles.xml'); + $objWriter->writeAttribute('manifest:media-type', 'text/xml'); + $objWriter->endElement(); + $objWriter->endElement(); + + return $objWriter->getData(); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/Mimetype.php b/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/Mimetype.php new file mode 100644 index 0000000..d51a8b9 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/Mimetype.php @@ -0,0 +1,41 @@ +<?php + +/** + * PHPExcel + * + * PHPExcel_Writer_OpenDocument_Mimetype + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_OpenDocument + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_OpenDocument_Mimetype extends PHPExcel_Writer_OpenDocument_WriterPart +{ + /** + * Write mimetype to plain text format + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function write(PHPExcel $pPHPExcel = null) + { + return 'application/vnd.oasis.opendocument.spreadsheet'; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/Settings.php b/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/Settings.php new file mode 100644 index 0000000..84161b6 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/Settings.php @@ -0,0 +1,76 @@ +<?php + +/** + * PHPExcel_Writer_OpenDocument_Settings + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_OpenDocument + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_OpenDocument_Settings extends PHPExcel_Writer_OpenDocument_WriterPart +{ + /** + * Write settings.xml to XML format + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function write(PHPExcel $pPHPExcel = null) + { + if (!$pPHPExcel) { + $pPHPExcel = $this->getParentWriter()->getPHPExcel(); + } + + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8'); + + // Settings + $objWriter->startElement('office:document-settings'); + $objWriter->writeAttribute('xmlns:office', 'urn:oasis:names:tc:opendocument:xmlns:office:1.0'); + $objWriter->writeAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink'); + $objWriter->writeAttribute('xmlns:config', 'urn:oasis:names:tc:opendocument:xmlns:config:1.0'); + $objWriter->writeAttribute('xmlns:ooo', 'http://openoffice.org/2004/office'); + $objWriter->writeAttribute('office:version', '1.2'); + + $objWriter->startElement('office:settings'); + $objWriter->startElement('config:config-item-set'); + $objWriter->writeAttribute('config:name', 'ooo:view-settings'); + $objWriter->startElement('config:config-item-map-indexed'); + $objWriter->writeAttribute('config:name', 'Views'); + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->startElement('config:config-item-set'); + $objWriter->writeAttribute('config:name', 'ooo:configuration-settings'); + $objWriter->endElement(); + $objWriter->endElement(); + $objWriter->endElement(); + + return $objWriter->getData(); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/Styles.php b/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/Styles.php new file mode 100644 index 0000000..cc6e25b --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/Styles.php @@ -0,0 +1,92 @@ +<?php + +/** + * PHPExcel_Writer_OpenDocument_Styles + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_OpenDocument + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_OpenDocument_Styles extends PHPExcel_Writer_OpenDocument_WriterPart +{ + /** + * Write styles.xml to XML format + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function write(PHPExcel $pPHPExcel = null) + { + if (!$pPHPExcel) { + $pPHPExcel = $this->getParentWriter()->getPHPExcel(); + } + + $objWriter = null; + if ($this->getParentWriter()->getUseDiskCaching()) { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); + } else { + $objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY); + } + + // XML header + $objWriter->startDocument('1.0', 'UTF-8'); + + // Content + $objWriter->startElement('office:document-styles'); + $objWriter->writeAttribute('xmlns:office', 'urn:oasis:names:tc:opendocument:xmlns:office:1.0'); + $objWriter->writeAttribute('xmlns:style', 'urn:oasis:names:tc:opendocument:xmlns:style:1.0'); + $objWriter->writeAttribute('xmlns:text', 'urn:oasis:names:tc:opendocument:xmlns:text:1.0'); + $objWriter->writeAttribute('xmlns:table', 'urn:oasis:names:tc:opendocument:xmlns:table:1.0'); + $objWriter->writeAttribute('xmlns:draw', 'urn:oasis:names:tc:opendocument:xmlns:drawing:1.0'); + $objWriter->writeAttribute('xmlns:fo', 'urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0'); + $objWriter->writeAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink'); + $objWriter->writeAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/'); + $objWriter->writeAttribute('xmlns:meta', 'urn:oasis:names:tc:opendocument:xmlns:meta:1.0'); + $objWriter->writeAttribute('xmlns:number', 'urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0'); + $objWriter->writeAttribute('xmlns:presentation', 'urn:oasis:names:tc:opendocument:xmlns:presentation:1.0'); + $objWriter->writeAttribute('xmlns:svg', 'urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0'); + $objWriter->writeAttribute('xmlns:chart', 'urn:oasis:names:tc:opendocument:xmlns:chart:1.0'); + $objWriter->writeAttribute('xmlns:dr3d', 'urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0'); + $objWriter->writeAttribute('xmlns:math', 'http://www.w3.org/1998/Math/MathML'); + $objWriter->writeAttribute('xmlns:form', 'urn:oasis:names:tc:opendocument:xmlns:form:1.0'); + $objWriter->writeAttribute('xmlns:script', 'urn:oasis:names:tc:opendocument:xmlns:script:1.0'); + $objWriter->writeAttribute('xmlns:ooo', 'http://openoffice.org/2004/office'); + $objWriter->writeAttribute('xmlns:ooow', 'http://openoffice.org/2004/writer'); + $objWriter->writeAttribute('xmlns:oooc', 'http://openoffice.org/2004/calc'); + $objWriter->writeAttribute('xmlns:dom', 'http://www.w3.org/2001/xml-events'); + $objWriter->writeAttribute('xmlns:rpt', 'http://openoffice.org/2005/report'); + $objWriter->writeAttribute('xmlns:of', 'urn:oasis:names:tc:opendocument:xmlns:of:1.2'); + $objWriter->writeAttribute('xmlns:xhtml', 'http://www.w3.org/1999/xhtml'); + $objWriter->writeAttribute('xmlns:grddl', 'http://www.w3.org/2003/g/data-view#'); + $objWriter->writeAttribute('xmlns:tableooo', 'http://openoffice.org/2009/table'); + $objWriter->writeAttribute('xmlns:css3t', 'http://www.w3.org/TR/css3-text/'); + $objWriter->writeAttribute('office:version', '1.2'); + + $objWriter->writeElement('office:font-face-decls'); + $objWriter->writeElement('office:styles'); + $objWriter->writeElement('office:automatic-styles'); + $objWriter->writeElement('office:master-styles'); + $objWriter->endElement(); + + return $objWriter->getData(); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/Thumbnails.php b/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/Thumbnails.php new file mode 100644 index 0000000..54247ae --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/Thumbnails.php @@ -0,0 +1,41 @@ +<?php + +/** + * PHPExcel_Writer_OpenDocument_Thumbnails + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_OpenDocument + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_OpenDocument_Thumbnails extends PHPExcel_Writer_OpenDocument_WriterPart +{ + /** + * Write Thumbnails/thumbnail.png to PNG format + * + * @param PHPExcel $pPHPExcel + * @return string XML Output + * @throws PHPExcel_Writer_Exception + */ + public function writeThumbnail(PHPExcel $pPHPExcel = null) + { + return ''; + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/WriterPart.php b/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/WriterPart.php new file mode 100644 index 0000000..562787a --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/OpenDocument/WriterPart.php @@ -0,0 +1,30 @@ +<?php + +/** + * PHPExcel_Writer_OpenDocument_WriterPart + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_OpenDocument + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +abstract class PHPExcel_Writer_OpenDocument_WriterPart extends PHPExcel_Writer_Excel2007_WriterPart +{ +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/PDF.php b/application/third_party/PHPExcel/PHPExcel/Writer/PDF.php new file mode 100644 index 0000000..579edfa --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/PDF.php @@ -0,0 +1,89 @@ +<?php + +/** + * PHPExcel_Writer_PDF + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_PDF + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_PDF implements PHPExcel_Writer_IWriter +{ + + /** + * The wrapper for the requested PDF rendering engine + * + * @var PHPExcel_Writer_PDF_Core + */ + private $renderer = null; + + /** + * Instantiate a new renderer of the configured type within this container class + * + * @param PHPExcel $phpExcel PHPExcel object + * @throws PHPExcel_Writer_Exception when PDF library is not configured + */ + public function __construct(PHPExcel $phpExcel) + { + $pdfLibraryName = PHPExcel_Settings::getPdfRendererName(); + if (is_null($pdfLibraryName)) { + throw new PHPExcel_Writer_Exception("PDF Rendering library has not been defined."); + } + + $pdfLibraryPath = PHPExcel_Settings::getPdfRendererPath(); + if (is_null($pdfLibraryName)) { + throw new PHPExcel_Writer_Exception("PDF Rendering library path has not been defined."); + } + $includePath = str_replace('\\', '/', get_include_path()); + $rendererPath = str_replace('\\', '/', $pdfLibraryPath); + if (strpos($rendererPath, $includePath) === false) { + set_include_path(get_include_path() . PATH_SEPARATOR . $pdfLibraryPath); + } + + $rendererName = 'PHPExcel_Writer_PDF_' . $pdfLibraryName; + $this->renderer = new $rendererName($phpExcel); + } + + + /** + * Magic method to handle direct calls to the configured PDF renderer wrapper class. + * + * @param string $name Renderer library method name + * @param mixed[] $arguments Array of arguments to pass to the renderer method + * @return mixed Returned data from the PDF renderer wrapper method + */ + public function __call($name, $arguments) + { + if ($this->renderer === null) { + throw new PHPExcel_Writer_Exception("PDF Rendering library has not been defined."); + } + + return call_user_func_array(array($this->renderer, $name), $arguments); + } + + /** + * {@inheritdoc} + */ + public function save($pFilename = null) + { + $this->renderer->save($pFilename); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/PDF/Core.php b/application/third_party/PHPExcel/PHPExcel/Writer/PDF/Core.php new file mode 100644 index 0000000..4fed84a --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/PDF/Core.php @@ -0,0 +1,355 @@ +<?php + +/** + * PHPExcel_Writer_PDF_Core + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_PDF + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +abstract class PHPExcel_Writer_PDF_Core extends PHPExcel_Writer_HTML +{ + /** + * Temporary storage directory + * + * @var string + */ + protected $tempDir = ''; + + /** + * Font + * + * @var string + */ + protected $font = 'freesans'; + + /** + * Orientation (Over-ride) + * + * @var string + */ + protected $orientation; + + /** + * Paper size (Over-ride) + * + * @var int + */ + protected $paperSize; + + + /** + * Temporary storage for Save Array Return type + * + * @var string + */ + private $saveArrayReturnType; + + /** + * Paper Sizes xRef List + * + * @var array + */ + protected static $paperSizes = array( + PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER + => 'LETTER', // (8.5 in. by 11 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER_SMALL + => 'LETTER', // (8.5 in. by 11 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_TABLOID + => array(792.00, 1224.00), // (11 in. by 17 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_LEDGER + => array(1224.00, 792.00), // (17 in. by 11 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_LEGAL + => 'LEGAL', // (8.5 in. by 14 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_STATEMENT + => array(396.00, 612.00), // (5.5 in. by 8.5 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_EXECUTIVE + => 'EXECUTIVE', // (7.25 in. by 10.5 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A3 + => 'A3', // (297 mm by 420 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4 + => 'A4', // (210 mm by 297 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4_SMALL + => 'A4', // (210 mm by 297 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A5 + => 'A5', // (148 mm by 210 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_B4 + => 'B4', // (250 mm by 353 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_B5 + => 'B5', // (176 mm by 250 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_FOLIO + => 'FOLIO', // (8.5 in. by 13 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_QUARTO + => array(609.45, 779.53), // (215 mm by 275 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_STANDARD_1 + => array(720.00, 1008.00), // (10 in. by 14 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_STANDARD_2 + => array(792.00, 1224.00), // (11 in. by 17 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_NOTE + => 'LETTER', // (8.5 in. by 11 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_NO9_ENVELOPE + => array(279.00, 639.00), // (3.875 in. by 8.875 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_NO10_ENVELOPE + => array(297.00, 684.00), // (4.125 in. by 9.5 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_NO11_ENVELOPE + => array(324.00, 747.00), // (4.5 in. by 10.375 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_NO12_ENVELOPE + => array(342.00, 792.00), // (4.75 in. by 11 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_NO14_ENVELOPE + => array(360.00, 828.00), // (5 in. by 11.5 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_C + => array(1224.00, 1584.00), // (17 in. by 22 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_D + => array(1584.00, 2448.00), // (22 in. by 34 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_E + => array(2448.00, 3168.00), // (34 in. by 44 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_DL_ENVELOPE + => array(311.81, 623.62), // (110 mm by 220 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_C5_ENVELOPE + => 'C5', // (162 mm by 229 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_C3_ENVELOPE + => 'C3', // (324 mm by 458 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_C4_ENVELOPE + => 'C4', // (229 mm by 324 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_C6_ENVELOPE + => 'C6', // (114 mm by 162 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_C65_ENVELOPE + => array(323.15, 649.13), // (114 mm by 229 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_B4_ENVELOPE + => 'B4', // (250 mm by 353 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_B5_ENVELOPE + => 'B5', // (176 mm by 250 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_B6_ENVELOPE + => array(498.90, 354.33), // (176 mm by 125 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_ITALY_ENVELOPE + => array(311.81, 651.97), // (110 mm by 230 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_MONARCH_ENVELOPE + => array(279.00, 540.00), // (3.875 in. by 7.5 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_6_3_4_ENVELOPE + => array(261.00, 468.00), // (3.625 in. by 6.5 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_US_STANDARD_FANFOLD + => array(1071.00, 792.00), // (14.875 in. by 11 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_GERMAN_STANDARD_FANFOLD + => array(612.00, 864.00), // (8.5 in. by 12 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_GERMAN_LEGAL_FANFOLD + => 'FOLIO', // (8.5 in. by 13 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_ISO_B4 + => 'B4', // (250 mm by 353 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_JAPANESE_DOUBLE_POSTCARD + => array(566.93, 419.53), // (200 mm by 148 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_STANDARD_PAPER_1 + => array(648.00, 792.00), // (9 in. by 11 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_STANDARD_PAPER_2 + => array(720.00, 792.00), // (10 in. by 11 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_STANDARD_PAPER_3 + => array(1080.00, 792.00), // (15 in. by 11 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_INVITE_ENVELOPE + => array(623.62, 623.62), // (220 mm by 220 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER_EXTRA_PAPER + => array(667.80, 864.00), // (9.275 in. by 12 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_LEGAL_EXTRA_PAPER + => array(667.80, 1080.00), // (9.275 in. by 15 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_TABLOID_EXTRA_PAPER + => array(841.68, 1296.00), // (11.69 in. by 18 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4_EXTRA_PAPER + => array(668.98, 912.76), // (236 mm by 322 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER_TRANSVERSE_PAPER + => array(595.80, 792.00), // (8.275 in. by 11 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4_TRANSVERSE_PAPER + => 'A4', // (210 mm by 297 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER_EXTRA_TRANSVERSE_PAPER + => array(667.80, 864.00), // (9.275 in. by 12 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_SUPERA_SUPERA_A4_PAPER + => array(643.46, 1009.13), // (227 mm by 356 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_SUPERB_SUPERB_A3_PAPER + => array(864.57, 1380.47), // (305 mm by 487 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER_PLUS_PAPER + => array(612.00, 913.68), // (8.5 in. by 12.69 in.) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A4_PLUS_PAPER + => array(595.28, 935.43), // (210 mm by 330 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A5_TRANSVERSE_PAPER + => 'A5', // (148 mm by 210 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_JIS_B5_TRANSVERSE_PAPER + => array(515.91, 728.50), // (182 mm by 257 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A3_EXTRA_PAPER + => array(912.76, 1261.42), // (322 mm by 445 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A5_EXTRA_PAPER + => array(493.23, 666.14), // (174 mm by 235 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_ISO_B5_EXTRA_PAPER + => array(569.76, 782.36), // (201 mm by 276 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A2_PAPER + => 'A2', // (420 mm by 594 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A3_TRANSVERSE_PAPER + => 'A3', // (297 mm by 420 mm) + PHPExcel_Worksheet_PageSetup::PAPERSIZE_A3_EXTRA_TRANSVERSE_PAPER + => array(912.76, 1261.42) // (322 mm by 445 mm) + ); + + /** + * Create a new PHPExcel_Writer_PDF + * + * @param PHPExcel $phpExcel PHPExcel object + */ + public function __construct(PHPExcel $phpExcel) + { + parent::__construct($phpExcel); + $this->setUseInlineCss(true); + $this->tempDir = PHPExcel_Shared_File::sys_get_temp_dir(); + } + + /** + * Get Font + * + * @return string + */ + public function getFont() + { + return $this->font; + } + + /** + * Set font. Examples: + * 'arialunicid0-chinese-simplified' + * 'arialunicid0-chinese-traditional' + * 'arialunicid0-korean' + * 'arialunicid0-japanese' + * + * @param string $fontName + */ + public function setFont($fontName) + { + $this->font = $fontName; + return $this; + } + + /** + * Get Paper Size + * + * @return int + */ + public function getPaperSize() + { + return $this->paperSize; + } + + /** + * Set Paper Size + * + * @param string $pValue Paper size + * @return PHPExcel_Writer_PDF + */ + public function setPaperSize($pValue = PHPExcel_Worksheet_PageSetup::PAPERSIZE_LETTER) + { + $this->paperSize = $pValue; + return $this; + } + + /** + * Get Orientation + * + * @return string + */ + public function getOrientation() + { + return $this->orientation; + } + + /** + * Set Orientation + * + * @param string $pValue Page orientation + * @return PHPExcel_Writer_PDF + */ + public function setOrientation($pValue = PHPExcel_Worksheet_PageSetup::ORIENTATION_DEFAULT) + { + $this->orientation = $pValue; + return $this; + } + + /** + * Get temporary storage directory + * + * @return string + */ + public function getTempDir() + { + return $this->tempDir; + } + + /** + * Set temporary storage directory + * + * @param string $pValue Temporary storage directory + * @throws PHPExcel_Writer_Exception when directory does not exist + * @return PHPExcel_Writer_PDF + */ + public function setTempDir($pValue = '') + { + if (is_dir($pValue)) { + $this->tempDir = $pValue; + } else { + throw new PHPExcel_Writer_Exception("Directory does not exist: $pValue"); + } + return $this; + } + + /** + * Save PHPExcel to PDF file, pre-save + * + * @param string $pFilename Name of the file to save as + * @throws PHPExcel_Writer_Exception + */ + protected function prepareForSave($pFilename = null) + { + // garbage collect + $this->phpExcel->garbageCollect(); + + $this->saveArrayReturnType = PHPExcel_Calculation::getArrayReturnType(); + PHPExcel_Calculation::setArrayReturnType(PHPExcel_Calculation::RETURN_ARRAY_AS_VALUE); + + // Open file + $fileHandle = fopen($pFilename, 'w'); + if ($fileHandle === false) { + throw new PHPExcel_Writer_Exception("Could not open file $pFilename for writing."); + } + + // Set PDF + $this->isPdf = true; + // Build CSS + $this->buildCSS(true); + + return $fileHandle; + } + + /** + * Save PHPExcel to PDF file, post-save + * + * @param resource $fileHandle + * @throws PHPExcel_Writer_Exception + */ + protected function restoreStateAfterSave($fileHandle) + { + // Close file + fclose($fileHandle); + + PHPExcel_Calculation::setArrayReturnType($this->saveArrayReturnType); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/PDF/DomPDF.php b/application/third_party/PHPExcel/PHPExcel/Writer/PDF/DomPDF.php new file mode 100644 index 0000000..83761ac --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/PDF/DomPDF.php @@ -0,0 +1,108 @@ +<?php + +/** Require DomPDF library */ +$pdfRendererClassFile = PHPExcel_Settings::getPdfRendererPath() . '/dompdf_config.inc.php'; +if (file_exists($pdfRendererClassFile)) { + require_once $pdfRendererClassFile; +} else { + throw new PHPExcel_Writer_Exception('Unable to load PDF Rendering library'); +} + +/** + * PHPExcel_Writer_PDF_DomPDF + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_PDF + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_PDF_DomPDF extends PHPExcel_Writer_PDF_Core implements PHPExcel_Writer_IWriter +{ + /** + * Create a new PHPExcel_Writer_PDF + * + * @param PHPExcel $phpExcel PHPExcel object + */ + public function __construct(PHPExcel $phpExcel) + { + parent::__construct($phpExcel); + } + + /** + * Save PHPExcel to file + * + * @param string $pFilename Name of the file to save as + * @throws PHPExcel_Writer_Exception + */ + public function save($pFilename = null) + { + $fileHandle = parent::prepareForSave($pFilename); + + // Default PDF paper size + $paperSize = 'LETTER'; // Letter (8.5 in. by 11 in.) + + // Check for paper size and page orientation + if (is_null($this->getSheetIndex())) { + $orientation = ($this->phpExcel->getSheet(0)->getPageSetup()->getOrientation() + == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P'; + $printPaperSize = $this->phpExcel->getSheet(0)->getPageSetup()->getPaperSize(); + $printMargins = $this->phpExcel->getSheet(0)->getPageMargins(); + } else { + $orientation = ($this->phpExcel->getSheet($this->getSheetIndex())->getPageSetup()->getOrientation() + == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P'; + $printPaperSize = $this->phpExcel->getSheet($this->getSheetIndex())->getPageSetup()->getPaperSize(); + $printMargins = $this->phpExcel->getSheet($this->getSheetIndex())->getPageMargins(); + } + + $orientation = ($orientation == 'L') ? 'landscape' : 'portrait'; + + // Override Page Orientation + if (!is_null($this->getOrientation())) { + $orientation = ($this->getOrientation() == PHPExcel_Worksheet_PageSetup::ORIENTATION_DEFAULT) + ? PHPExcel_Worksheet_PageSetup::ORIENTATION_PORTRAIT + : $this->getOrientation(); + } + // Override Paper Size + if (!is_null($this->getPaperSize())) { + $printPaperSize = $this->getPaperSize(); + } + + if (isset(self::$paperSizes[$printPaperSize])) { + $paperSize = self::$paperSizes[$printPaperSize]; + } + + + // Create PDF + $pdf = new DOMPDF(); + $pdf->set_paper(strtolower($paperSize), $orientation); + + $pdf->load_html( + $this->generateHTMLHeader(false) . + $this->generateSheetData() . + $this->generateHTMLFooter() + ); + $pdf->render(); + + // Write to file + fwrite($fileHandle, $pdf->output()); + + parent::restoreStateAfterSave($fileHandle); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/PDF/mPDF.php b/application/third_party/PHPExcel/PHPExcel/Writer/PDF/mPDF.php new file mode 100644 index 0000000..e4e6057 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/PDF/mPDF.php @@ -0,0 +1,118 @@ +<?php + +/** Require mPDF library */ +$pdfRendererClassFile = PHPExcel_Settings::getPdfRendererPath() . '/mpdf.php'; +if (file_exists($pdfRendererClassFile)) { + require_once $pdfRendererClassFile; +} else { + throw new PHPExcel_Writer_Exception('Unable to load PDF Rendering library'); +} + +/** + * PHPExcel_Writer_PDF_mPDF + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_PDF + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_PDF_mPDF extends PHPExcel_Writer_PDF_Core implements PHPExcel_Writer_IWriter +{ + /** + * Create a new PHPExcel_Writer_PDF + * + * @param PHPExcel $phpExcel PHPExcel object + */ + public function __construct(PHPExcel $phpExcel) + { + parent::__construct($phpExcel); + } + + /** + * Save PHPExcel to file + * + * @param string $pFilename Name of the file to save as + * @throws PHPExcel_Writer_Exception + */ + public function save($pFilename = null) + { + $fileHandle = parent::prepareForSave($pFilename); + + // Default PDF paper size + $paperSize = 'LETTER'; // Letter (8.5 in. by 11 in.) + + // Check for paper size and page orientation + if (is_null($this->getSheetIndex())) { + $orientation = ($this->phpExcel->getSheet(0)->getPageSetup()->getOrientation() + == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P'; + $printPaperSize = $this->phpExcel->getSheet(0)->getPageSetup()->getPaperSize(); + $printMargins = $this->phpExcel->getSheet(0)->getPageMargins(); + } else { + $orientation = ($this->phpExcel->getSheet($this->getSheetIndex())->getPageSetup()->getOrientation() + == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P'; + $printPaperSize = $this->phpExcel->getSheet($this->getSheetIndex())->getPageSetup()->getPaperSize(); + $printMargins = $this->phpExcel->getSheet($this->getSheetIndex())->getPageMargins(); + } + $this->setOrientation($orientation); + + // Override Page Orientation + if (!is_null($this->getOrientation())) { + $orientation = ($this->getOrientation() == PHPExcel_Worksheet_PageSetup::ORIENTATION_DEFAULT) + ? PHPExcel_Worksheet_PageSetup::ORIENTATION_PORTRAIT + : $this->getOrientation(); + } + $orientation = strtoupper($orientation); + + // Override Paper Size + if (!is_null($this->getPaperSize())) { + $printPaperSize = $this->getPaperSize(); + } + + if (isset(self::$paperSizes[$printPaperSize])) { + $paperSize = self::$paperSizes[$printPaperSize]; + } + + + // Create PDF + $pdf = new mpdf(); + $ortmp = $orientation; + $pdf->_setPageSize(strtoupper($paperSize), $ortmp); + $pdf->DefOrientation = $orientation; + $pdf->AddPage($orientation); + + // Document info + $pdf->SetTitle($this->phpExcel->getProperties()->getTitle()); + $pdf->SetAuthor($this->phpExcel->getProperties()->getCreator()); + $pdf->SetSubject($this->phpExcel->getProperties()->getSubject()); + $pdf->SetKeywords($this->phpExcel->getProperties()->getKeywords()); + $pdf->SetCreator($this->phpExcel->getProperties()->getCreator()); + + $pdf->WriteHTML( + $this->generateHTMLHeader(false) . + $this->generateSheetData() . + $this->generateHTMLFooter() + ); + + // Write to file + fwrite($fileHandle, $pdf->Output('', 'S')); + + parent::restoreStateAfterSave($fileHandle); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/Writer/PDF/tcPDF.php b/application/third_party/PHPExcel/PHPExcel/Writer/PDF/tcPDF.php new file mode 100644 index 0000000..dea33a3 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/Writer/PDF/tcPDF.php @@ -0,0 +1,123 @@ +<?php + +/** Require tcPDF library */ +$pdfRendererClassFile = PHPExcel_Settings::getPdfRendererPath() . '/tcpdf.php'; +if (file_exists($pdfRendererClassFile)) { + $k_path_url = PHPExcel_Settings::getPdfRendererPath(); + require_once $pdfRendererClassFile; +} else { + throw new PHPExcel_Writer_Exception('Unable to load PDF Rendering library'); +} + +/** + * PHPExcel_Writer_PDF_tcPDF + * + * Copyright (c) 2006 - 2015 PHPExcel + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * @category PHPExcel + * @package PHPExcel_Writer_PDF + * @copyright Copyright (c) 2006 - 2015 PHPExcel (http://www.codeplex.com/PHPExcel) + * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL + * @version ##VERSION##, ##DATE## + */ +class PHPExcel_Writer_PDF_tcPDF extends PHPExcel_Writer_PDF_Core implements PHPExcel_Writer_IWriter +{ + /** + * Create a new PHPExcel_Writer_PDF + * + * @param PHPExcel $phpExcel PHPExcel object + */ + public function __construct(PHPExcel $phpExcel) + { + parent::__construct($phpExcel); + } + + /** + * Save PHPExcel to file + * + * @param string $pFilename Name of the file to save as + * @throws PHPExcel_Writer_Exception + */ + public function save($pFilename = null) + { + $fileHandle = parent::prepareForSave($pFilename); + + // Default PDF paper size + $paperSize = 'LETTER'; // Letter (8.5 in. by 11 in.) + + // Check for paper size and page orientation + if (is_null($this->getSheetIndex())) { + $orientation = ($this->phpExcel->getSheet(0)->getPageSetup()->getOrientation() + == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P'; + $printPaperSize = $this->phpExcel->getSheet(0)->getPageSetup()->getPaperSize(); + $printMargins = $this->phpExcel->getSheet(0)->getPageMargins(); + } else { + $orientation = ($this->phpExcel->getSheet($this->getSheetIndex())->getPageSetup()->getOrientation() + == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) ? 'L' : 'P'; + $printPaperSize = $this->phpExcel->getSheet($this->getSheetIndex())->getPageSetup()->getPaperSize(); + $printMargins = $this->phpExcel->getSheet($this->getSheetIndex())->getPageMargins(); + } + + // Override Page Orientation + if (!is_null($this->getOrientation())) { + $orientation = ($this->getOrientation() == PHPExcel_Worksheet_PageSetup::ORIENTATION_LANDSCAPE) + ? 'L' + : 'P'; + } + // Override Paper Size + if (!is_null($this->getPaperSize())) { + $printPaperSize = $this->getPaperSize(); + } + + if (isset(self::$paperSizes[$printPaperSize])) { + $paperSize = self::$paperSizes[$printPaperSize]; + } + + + // Create PDF + $pdf = new TCPDF($orientation, 'pt', $paperSize); + $pdf->setFontSubsetting(false); + // Set margins, converting inches to points (using 72 dpi) + $pdf->SetMargins($printMargins->getLeft() * 72, $printMargins->getTop() * 72, $printMargins->getRight() * 72); + $pdf->SetAutoPageBreak(true, $printMargins->getBottom() * 72); + + $pdf->setPrintHeader(false); + $pdf->setPrintFooter(false); + + $pdf->AddPage(); + + // Set the appropriate font + $pdf->SetFont($this->getFont()); + $pdf->writeHTML( + $this->generateHTMLHeader(false) . + $this->generateSheetData() . + $this->generateHTMLFooter() + ); + + // Document info + $pdf->SetTitle($this->phpExcel->getProperties()->getTitle()); + $pdf->SetAuthor($this->phpExcel->getProperties()->getCreator()); + $pdf->SetSubject($this->phpExcel->getProperties()->getSubject()); + $pdf->SetKeywords($this->phpExcel->getProperties()->getKeywords()); + $pdf->SetCreator($this->phpExcel->getProperties()->getCreator()); + + // Write to file + fwrite($fileHandle, $pdf->output($pFilename, 'S')); + + parent::restoreStateAfterSave($fileHandle); + } +} diff --git a/application/third_party/PHPExcel/PHPExcel/locale/bg/config b/application/third_party/PHPExcel/PHPExcel/locale/bg/config new file mode 100644 index 0000000..4cecddb --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/bg/config @@ -0,0 +1,49 @@ +## +## PHPExcel +## + +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = лв + + +## +## Excel Error Codes (For future use) + +## +NULL = #ПРАЗНО! +DIV0 = #ДЕЛ/0! +VALUE = #СТОЙНОСТ! +REF = #РЕФ! +NAME = #ИМЕ? +NUM = #ЧИСЛО! +NA = #Н/Д diff --git a/application/third_party/PHPExcel/PHPExcel/locale/cs/config b/application/third_party/PHPExcel/PHPExcel/locale/cs/config new file mode 100644 index 0000000..42cdf32 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/cs/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = Kč + + +## +## Excel Error Codes (For future use) +## +NULL = #NULL! +DIV0 = #DIV/0! +VALUE = #HODNOTA! +REF = #REF! +NAME = #NÁZEV? +NUM = #NUM! +NA = #N/A diff --git a/application/third_party/PHPExcel/PHPExcel/locale/cs/functions b/application/third_party/PHPExcel/PHPExcel/locale/cs/functions new file mode 100644 index 0000000..c0a3cbb --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/cs/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Funkce doplňků a automatizace +## +GETPIVOTDATA = ZÍSKATKONTDATA ## Vrátí data uložená v kontingenční tabulce. Pomocí funkce ZÍSKATKONTDATA můžete načíst souhrnná data z kontingenční tabulky, pokud jsou tato data v kontingenční sestavě zobrazena. + + +## +## Cube functions Funkce pro práci s krychlemi +## +CUBEKPIMEMBER = CUBEKPIMEMBER ## Vrátí název, vlastnost a velikost klíčového ukazatele výkonu (KUV) a zobrazí v buňce název a vlastnost. Klíčový ukazatel výkonu je kvantifikovatelná veličina, například hrubý měsíční zisk nebo čtvrtletní obrat na zaměstnance, která se používá pro sledování výkonnosti organizace. +CUBEMEMBER = CUBEMEMBER ## Vrátí člen nebo n-tici v hierarchii krychle. Slouží k ověření, zda v krychli existuje člen nebo n-tice. +CUBEMEMBERPROPERTY = CUBEMEMBERPROPERTY ## Vrátí hodnotu vlastnosti člena v krychli. Slouží k ověření, zda v krychli existuje člen s daným názvem, a k vrácení konkrétní vlastnosti tohoto člena. +CUBERANKEDMEMBER = CUBERANKEDMEMBER ## Vrátí n-tý nebo pořadový člen sady. Použijte ji pro vrácení jednoho nebo více prvků sady, například obchodníka s nejvyšším obratem nebo deseti nejlepších studentů. +CUBESET = CUBESET ## Definuje vypočtenou sadu členů nebo n-tic odesláním výrazu sady do krychle na serveru, který vytvoří sadu a potom ji vrátí do aplikace Microsoft Office Excel. +CUBESETCOUNT = CUBESETCOUNT ## Vrátí počet položek v množině +CUBEVALUE = CUBEVALUE ## Vrátí úhrnnou hodnotu z krychle. + + +## +## Database functions Funkce databáze +## +DAVERAGE = DPRŮMĚR ## Vrátí průměr vybraných položek databáze. +DCOUNT = DPOČET ## Spočítá buňky databáze obsahující čísla. +DCOUNTA = DPOČET2 ## Spočítá buňky databáze, které nejsou prázdné. +DGET = DZÍSKAT ## Extrahuje z databáze jeden záznam splňující zadaná kritéria. +DMAX = DMAX ## Vrátí maximální hodnotu z vybraných položek databáze. +DMIN = DMIN ## Vrátí minimální hodnotu z vybraných položek databáze. +DPRODUCT = DSOUČIN ## Vynásobí hodnoty určitého pole záznamů v databázi, které splňují daná kritéria. +DSTDEV = DSMODCH.VÝBĚR ## Odhadne směrodatnou odchylku výběru vybraných položek databáze. +DSTDEVP = DSMODCH ## Vypočte směrodatnou odchylku základního souboru vybraných položek databáze. +DSUM = DSUMA ## Sečte čísla ve sloupcovém poli záznamů databáze, která splňují daná kritéria. +DVAR = DVAR.VÝBĚR ## Odhadne rozptyl výběru vybraných položek databáze. +DVARP = DVAR ## Vypočte rozptyl základního souboru vybraných položek databáze. + + +## +## Date and time functions Funkce data a času +## +DATE = DATUM ## Vrátí pořadové číslo určitého data. +DATEVALUE = DATUMHODN ## Převede datum ve formě textu na pořadové číslo. +DAY = DEN ## Převede pořadové číslo na den v měsíci. +DAYS360 = ROK360 ## Vrátí počet dní mezi dvěma daty na základě roku s 360 dny. +EDATE = EDATE ## Vrátí pořadové číslo data, které označuje určený počet měsíců před nebo po počátečním datu. +EOMONTH = EOMONTH ## Vrátí pořadové číslo posledního dne měsíce před nebo po zadaném počtu měsíců. +HOUR = HODINA ## Převede pořadové číslo na hodinu. +MINUTE = MINUTA ## Převede pořadové číslo na minutu. +MONTH = MĚSÍC ## Převede pořadové číslo na měsíc. +NETWORKDAYS = NETWORKDAYS ## Vrátí počet celých pracovních dní mezi dvěma daty. +NOW = NYNÍ ## Vrátí pořadové číslo aktuálního data a času. +SECOND = SEKUNDA ## Převede pořadové číslo na sekundu. +TIME = ČAS ## Vrátí pořadové číslo určitého času. +TIMEVALUE = ČASHODN ## Převede čas ve formě textu na pořadové číslo. +TODAY = DNES ## Vrátí pořadové číslo dnešního data. +WEEKDAY = DENTÝDNE ## Převede pořadové číslo na den v týdnu. +WEEKNUM = WEEKNUM ## Převede pořadové číslo na číslo představující číselnou pozici týdne v roce. +WORKDAY = WORKDAY ## Vrátí pořadové číslo data před nebo po zadaném počtu pracovních dní. +YEAR = ROK ## Převede pořadové číslo na rok. +YEARFRAC = YEARFRAC ## Vrátí část roku vyjádřenou zlomkem a představující počet celých dní mezi počátečním a koncovým datem. + + +## +## Engineering functions Inženýrské funkce (Technické funkce) +## +BESSELI = BESSELI ## Vrátí modifikovanou Besselovu funkci In(x). +BESSELJ = BESSELJ ## Vrátí modifikovanou Besselovu funkci Jn(x). +BESSELK = BESSELK ## Vrátí modifikovanou Besselovu funkci Kn(x). +BESSELY = BESSELY ## Vrátí Besselovu funkci Yn(x). +BIN2DEC = BIN2DEC ## Převede binární číslo na desítkové. +BIN2HEX = BIN2HEX ## Převede binární číslo na šestnáctkové. +BIN2OCT = BIN2OCT ## Převede binární číslo na osmičkové. +COMPLEX = COMPLEX ## Převede reálnou a imaginární část na komplexní číslo. +CONVERT = CONVERT ## Převede číslo do jiného jednotkového měrného systému. +DEC2BIN = DEC2BIN ## Převede desítkového čísla na dvojkové +DEC2HEX = DEC2HEX ## Převede desítkové číslo na šestnáctkové. +DEC2OCT = DEC2OCT ## Převede desítkové číslo na osmičkové. +DELTA = DELTA ## Testuje rovnost dvou hodnot. +ERF = ERF ## Vrátí chybovou funkci. +ERFC = ERFC ## Vrátí doplňkovou chybovou funkci. +GESTEP = GESTEP ## Testuje, zda je číslo větší než mezní hodnota. +HEX2BIN = HEX2BIN ## Převede šestnáctkové číslo na binární. +HEX2DEC = HEX2DEC ## Převede šestnáctkové číslo na desítkové. +HEX2OCT = HEX2OCT ## Převede šestnáctkové číslo na osmičkové. +IMABS = IMABS ## Vrátí absolutní hodnotu (modul) komplexního čísla. +IMAGINARY = IMAGINARY ## Vrátí imaginární část komplexního čísla. +IMARGUMENT = IMARGUMENT ## Vrátí argument théta, úhel vyjádřený v radiánech. +IMCONJUGATE = IMCONJUGATE ## Vrátí komplexně sdružené číslo ke komplexnímu číslu. +IMCOS = IMCOS ## Vrátí kosinus komplexního čísla. +IMDIV = IMDIV ## Vrátí podíl dvou komplexních čísel. +IMEXP = IMEXP ## Vrátí exponenciální tvar komplexního čísla. +IMLN = IMLN ## Vrátí přirozený logaritmus komplexního čísla. +IMLOG10 = IMLOG10 ## Vrátí dekadický logaritmus komplexního čísla. +IMLOG2 = IMLOG2 ## Vrátí logaritmus komplexního čísla při základu 2. +IMPOWER = IMPOWER ## Vrátí komplexní číslo umocněné na celé číslo. +IMPRODUCT = IMPRODUCT ## Vrátí součin komplexních čísel. +IMREAL = IMREAL ## Vrátí reálnou část komplexního čísla. +IMSIN = IMSIN ## Vrátí sinus komplexního čísla. +IMSQRT = IMSQRT ## Vrátí druhou odmocninu komplexního čísla. +IMSUB = IMSUB ## Vrátí rozdíl mezi dvěma komplexními čísly. +IMSUM = IMSUM ## Vrátí součet dvou komplexních čísel. +OCT2BIN = OCT2BIN ## Převede osmičkové číslo na binární. +OCT2DEC = OCT2DEC ## Převede osmičkové číslo na desítkové. +OCT2HEX = OCT2HEX ## Převede osmičkové číslo na šestnáctkové. + + +## +## Financial functions Finanční funkce +## +ACCRINT = ACCRINT ## Vrátí nahromaděný úrok z cenného papíru, ze kterého je úrok placen v pravidelných termínech. +ACCRINTM = ACCRINTM ## Vrátí nahromaděný úrok z cenného papíru, ze kterého je úrok placen k datu splatnosti. +AMORDEGRC = AMORDEGRC ## Vrátí lineární amortizaci v každém účetním období pomocí koeficientu amortizace. +AMORLINC = AMORLINC ## Vrátí lineární amortizaci v každém účetním období. +COUPDAYBS = COUPDAYBS ## Vrátí počet dnů od začátku období placení kupónů do data splatnosti. +COUPDAYS = COUPDAYS ## Vrátí počet dnů v období placení kupónů, které obsahuje den zúčtování. +COUPDAYSNC = COUPDAYSNC ## Vrátí počet dnů od data zúčtování do následujícího data placení kupónu. +COUPNCD = COUPNCD ## Vrátí následující datum placení kupónu po datu zúčtování. +COUPNUM = COUPNUM ## Vrátí počet kupónů splatných mezi datem zúčtování a datem splatnosti. +COUPPCD = COUPPCD ## Vrátí předchozí datum placení kupónu před datem zúčtování. +CUMIPMT = CUMIPMT ## Vrátí kumulativní úrok splacený mezi dvěma obdobími. +CUMPRINC = CUMPRINC ## Vrátí kumulativní jistinu splacenou mezi dvěma obdobími půjčky. +DB = ODPIS.ZRYCH ## Vrátí odpis aktiva za určité období pomocí degresivní metody odpisu s pevným zůstatkem. +DDB = ODPIS.ZRYCH2 ## Vrátí odpis aktiva za určité období pomocí dvojité degresivní metody odpisu nebo jiné metody, kterou zadáte. +DISC = DISC ## Vrátí diskontní sazbu cenného papíru. +DOLLARDE = DOLLARDE ## Převede částku v korunách vyjádřenou zlomkem na částku v korunách vyjádřenou desetinným číslem. +DOLLARFR = DOLLARFR ## Převede částku v korunách vyjádřenou desetinným číslem na částku v korunách vyjádřenou zlomkem. +DURATION = DURATION ## Vrátí roční dobu cenného papíru s pravidelnými úrokovými sazbami. +EFFECT = EFFECT ## Vrátí efektivní roční úrokovou sazbu. +FV = BUDHODNOTA ## Vrátí budoucí hodnotu investice. +FVSCHEDULE = FVSCHEDULE ## Vrátí budoucí hodnotu počáteční jistiny po použití série sazeb složitého úroku. +INTRATE = INTRATE ## Vrátí úrokovou sazbu plně investovaného cenného papíru. +IPMT = PLATBA.ÚROK ## Vrátí výšku úroku investice za dané období. +IRR = MÍRA.VÝNOSNOSTI ## Vrátí vnitřní výnosové procento série peněžních toků. +ISPMT = ISPMT ## Vypočte výši úroku z investice zaplaceného během určitého období. +MDURATION = MDURATION ## Vrátí Macauleyho modifikovanou dobu cenného papíru o nominální hodnotě 100 Kč. +MIRR = MOD.MÍRA.VÝNOSNOSTI ## Vrátí vnitřní sazbu výnosu, přičemž kladné a záporné hodnoty peněžních prostředků jsou financovány podle různých sazeb. +NOMINAL = NOMINAL ## Vrátí nominální roční úrokovou sazbu. +NPER = POČET.OBDOBÍ ## Vrátí počet období pro investici. +NPV = ČISTÁ.SOUČHODNOTA ## Vrátí čistou současnou hodnotu investice vypočítanou na základě série pravidelných peněžních toků a diskontní sazby. +ODDFPRICE = ODDFPRICE ## Vrátí cenu cenného papíru o nominální hodnotě 100 Kč s odlišným prvním obdobím. +ODDFYIELD = ODDFYIELD ## Vrátí výnos cenného papíru s odlišným prvním obdobím. +ODDLPRICE = ODDLPRICE ## Vrátí cenu cenného papíru o nominální hodnotě 100 Kč s odlišným posledním obdobím. +ODDLYIELD = ODDLYIELD ## Vrátí výnos cenného papíru s odlišným posledním obdobím. +PMT = PLATBA ## Vrátí hodnotu pravidelné splátky anuity. +PPMT = PLATBA.ZÁKLAD ## Vrátí hodnotu splátky jistiny pro zadanou investici za dané období. +PRICE = PRICE ## Vrátí cenu cenného papíru o nominální hodnotě 100 Kč, ze kterého je úrok placen v pravidelných termínech. +PRICEDISC = PRICEDISC ## Vrátí cenu diskontního cenného papíru o nominální hodnotě 100 Kč. +PRICEMAT = PRICEMAT ## Vrátí cenu cenného papíru o nominální hodnotě 100 Kč, ze kterého je úrok placen k datu splatnosti. +PV = SOUČHODNOTA ## Vrátí současnou hodnotu investice. +RATE = ÚROKOVÁ.MÍRA ## Vrátí úrokovou sazbu vztaženou na období anuity. +RECEIVED = RECEIVED ## Vrátí částku obdrženou k datu splatnosti plně investovaného cenného papíru. +SLN = ODPIS.LIN ## Vrátí přímé odpisy aktiva pro jedno období. +SYD = ODPIS.NELIN ## Vrátí směrné číslo ročních odpisů aktiva pro zadané období. +TBILLEQ = TBILLEQ ## Vrátí výnos směnky státní pokladny ekvivalentní výnosu obligace. +TBILLPRICE = TBILLPRICE ## Vrátí cenu směnky státní pokladny o nominální hodnotě 100 Kč. +TBILLYIELD = TBILLYIELD ## Vrátí výnos směnky státní pokladny. +VDB = ODPIS.ZA.INT ## Vrátí odpis aktiva pro určité období nebo část období pomocí degresivní metody odpisu. +XIRR = XIRR ## Vrátí vnitřní výnosnost pro harmonogram peněžních toků, který nemusí být nutně periodický. +XNPV = XNPV ## Vrátí čistou současnou hodnotu pro harmonogram peněžních toků, který nemusí být nutně periodický. +YIELD = YIELD ## Vrátí výnos cenného papíru, ze kterého je úrok placen v pravidelných termínech. +YIELDDISC = YIELDDISC ## Vrátí roční výnos diskontního cenného papíru, například směnky státní pokladny. +YIELDMAT = YIELDMAT ## Vrátí roční výnos cenného papíru, ze kterého je úrok placen k datu splatnosti. + + +## +## Information functions Informační funkce +## +CELL = POLÍČKO ## Vrátí informace o formátování, umístění nebo obsahu buňky. +ERROR.TYPE = CHYBA.TYP ## Vrátí číslo odpovídající typu chyby. +INFO = O.PROSTŘEDÍ ## Vrátí informace o aktuálním pracovním prostředí. +ISBLANK = JE.PRÁZDNÉ ## Vrátí hodnotu PRAVDA, pokud se argument hodnota odkazuje na prázdnou buňku. +ISERR = JE.CHYBA ## Vrátí hodnotu PRAVDA, pokud je argument hodnota libovolná chybová hodnota (kromě #N/A). +ISERROR = JE.CHYBHODN ## Vrátí hodnotu PRAVDA, pokud je argument hodnota libovolná chybová hodnota. +ISEVEN = ISEVEN ## Vrátí hodnotu PRAVDA, pokud je číslo sudé. +ISLOGICAL = JE.LOGHODN ## Vrátí hodnotu PRAVDA, pokud je argument hodnota logická hodnota. +ISNA = JE.NEDEF ## Vrátí hodnotu PRAVDA, pokud je argument hodnota chybová hodnota #N/A. +ISNONTEXT = JE.NETEXT ## Vrátí hodnotu PRAVDA, pokud argument hodnota není text. +ISNUMBER = JE.ČÍSLO ## Vrátí hodnotu PRAVDA, pokud je argument hodnota číslo. +ISODD = ISODD ## Vrátí hodnotu PRAVDA, pokud je číslo liché. +ISREF = JE.ODKAZ ## Vrátí hodnotu PRAVDA, pokud je argument hodnota odkaz. +ISTEXT = JE.TEXT ## Vrátí hodnotu PRAVDA, pokud je argument hodnota text. +N = N ## Vrátí hodnotu převedenou na číslo. +NA = NEDEF ## Vrátí chybovou hodnotu #N/A. +TYPE = TYP ## Vrátí číslo označující datový typ hodnoty. + + +## +## Logical functions Logické funkce +## +AND = A ## Vrátí hodnotu PRAVDA, mají-li všechny argumenty hodnotu PRAVDA. +FALSE = NEPRAVDA ## Vrátí logickou hodnotu NEPRAVDA. +IF = KDYŽ ## Určí, který logický test má proběhnout. +IFERROR = IFERROR ## Pokud je vzorec vyhodnocen jako chyba, vrátí zadanou hodnotu. V opačném případě vrátí výsledek vzorce. +NOT = NE ## Provede logickou negaci argumentu funkce. +OR = NEBO ## Vrátí hodnotu PRAVDA, je-li alespoň jeden argument roven hodnotě PRAVDA. +TRUE = PRAVDA ## Vrátí logickou hodnotu PRAVDA. + + +## +## Lookup and reference functions Vyhledávací funkce +## +ADDRESS = ODKAZ ## Vrátí textový odkaz na jednu buňku listu. +AREAS = POČET.BLOKŮ ## Vrátí počet oblastí v odkazu. +CHOOSE = ZVOLIT ## Zvolí hodnotu ze seznamu hodnot. +COLUMN = SLOUPEC ## Vrátí číslo sloupce odkazu. +COLUMNS = SLOUPCE ## Vrátí počet sloupců v odkazu. +HLOOKUP = VVYHLEDAT ## Prohledá horní řádek matice a vrátí hodnotu určené buňky. +HYPERLINK = HYPERTEXTOVÝ.ODKAZ ## Vytvoří zástupce nebo odkaz, který otevře dokument uložený na síťovém serveru, v síti intranet nebo Internet. +INDEX = INDEX ## Pomocí rejstříku zvolí hodnotu z odkazu nebo matice. +INDIRECT = NEPŘÍMÝ.ODKAZ ## Vrátí odkaz určený textovou hodnotou. +LOOKUP = VYHLEDAT ## Vyhledá hodnoty ve vektoru nebo matici. +MATCH = POZVYHLEDAT ## Vyhledá hodnoty v odkazu nebo matici. +OFFSET = POSUN ## Vrátí posun odkazu od zadaného odkazu. +ROW = ŘÁDEK ## Vrátí číslo řádku odkazu. +ROWS = ŘÁDKY ## Vrátí počet řádků v odkazu. +RTD = RTD ## Načte data reálného času z programu, který podporuje automatizaci modelu COM (Automatizace: Způsob práce s objekty určité aplikace z jiné aplikace nebo nástroje pro vývoj. Automatizace (dříve nazývaná automatizace OLE) je počítačovým standardem a je funkcí modelu COM (Component Object Model).). +TRANSPOSE = TRANSPOZICE ## Vrátí transponovanou matici. +VLOOKUP = SVYHLEDAT ## Prohledá první sloupec matice, přesune kurzor v řádku a vrátí hodnotu buňky. + + +## +## Math and trigonometry functions Matematické a trigonometrické funkce +## +ABS = ABS ## Vrátí absolutní hodnotu čísla. +ACOS = ARCCOS ## Vrátí arkuskosinus čísla. +ACOSH = ARCCOSH ## Vrátí hyperbolický arkuskosinus čísla. +ASIN = ARCSIN ## Vrátí arkussinus čísla. +ASINH = ARCSINH ## Vrátí hyperbolický arkussinus čísla. +ATAN = ARCTG ## Vrátí arkustangens čísla. +ATAN2 = ARCTG2 ## Vrátí arkustangens x-ové a y-ové souřadnice. +ATANH = ARCTGH ## Vrátí hyperbolický arkustangens čísla. +CEILING = ZAOKR.NAHORU ## Zaokrouhlí číslo na nejbližší celé číslo nebo na nejbližší násobek zadané hodnoty. +COMBIN = KOMBINACE ## Vrátí počet kombinací pro daný počet položek. +COS = COS ## Vrátí kosinus čísla. +COSH = COSH ## Vrátí hyperbolický kosinus čísla. +DEGREES = DEGREES ## Převede radiány na stupně. +EVEN = ZAOKROUHLIT.NA.SUDÉ ## Zaokrouhlí číslo nahoru na nejbližší celé sudé číslo. +EXP = EXP ## Vrátí základ přirozeného logaritmu e umocněný na zadané číslo. +FACT = FAKTORIÁL ## Vrátí faktoriál čísla. +FACTDOUBLE = FACTDOUBLE ## Vrátí dvojitý faktoriál čísla. +FLOOR = ZAOKR.DOLŮ ## Zaokrouhlí číslo dolů, směrem k nule. +GCD = GCD ## Vrátí největší společný dělitel. +INT = CELÁ.ČÁST ## Zaokrouhlí číslo dolů na nejbližší celé číslo. +LCM = LCM ## Vrátí nejmenší společný násobek. +LN = LN ## Vrátí přirozený logaritmus čísla. +LOG = LOGZ ## Vrátí logaritmus čísla při zadaném základu. +LOG10 = LOG ## Vrátí dekadický logaritmus čísla. +MDETERM = DETERMINANT ## Vrátí determinant matice. +MINVERSE = INVERZE ## Vrátí inverzní matici. +MMULT = SOUČIN.MATIC ## Vrátí součin dvou matic. +MOD = MOD ## Vrátí zbytek po dělení. +MROUND = MROUND ## Vrátí číslo zaokrouhlené na požadovaný násobek. +MULTINOMIAL = MULTINOMIAL ## Vrátí mnohočlen z množiny čísel. +ODD = ZAOKROUHLIT.NA.LICHÉ ## Zaokrouhlí číslo nahoru na nejbližší celé liché číslo. +PI = PI ## Vrátí hodnotu čísla pí. +POWER = POWER ## Umocní číslo na zadanou mocninu. +PRODUCT = SOUČIN ## Vynásobí argumenty funkce. +QUOTIENT = QUOTIENT ## Vrátí celou část dělení. +RADIANS = RADIANS ## Převede stupně na radiány. +RAND = NÁHČÍSLO ## Vrátí náhodné číslo mezi 0 a 1. +RANDBETWEEN = RANDBETWEEN ## Vrátí náhodné číslo mezi zadanými čísly. +ROMAN = ROMAN ## Převede arabskou číslici na římskou ve formátu textu. +ROUND = ZAOKROUHLIT ## Zaokrouhlí číslo na zadaný počet číslic. +ROUNDDOWN = ROUNDDOWN ## Zaokrouhlí číslo dolů, směrem k nule. +ROUNDUP = ROUNDUP ## Zaokrouhlí číslo nahoru, směrem od nuly. +SERIESSUM = SERIESSUM ## Vrátí součet mocninné řady určené podle vzorce. +SIGN = SIGN ## Vrátí znaménko čísla. +SIN = SIN ## Vrátí sinus daného úhlu. +SINH = SINH ## Vrátí hyperbolický sinus čísla. +SQRT = ODMOCNINA ## Vrátí kladnou druhou odmocninu. +SQRTPI = SQRTPI ## Vrátí druhou odmocninu výrazu (číslo * pí). +SUBTOTAL = SUBTOTAL ## Vrátí souhrn v seznamu nebo databázi. +SUM = SUMA ## Sečte argumenty funkce. +SUMIF = SUMIF ## Sečte buňky vybrané podle zadaných kritérií. +SUMIFS = SUMIFS ## Sečte buňky určené více zadanými podmínkami. +SUMPRODUCT = SOUČIN.SKALÁRNÍ ## Vrátí součet součinů odpovídajících prvků matic. +SUMSQ = SUMA.ČTVERCŮ ## Vrátí součet čtverců argumentů. +SUMX2MY2 = SUMX2MY2 ## Vrátí součet rozdílu čtverců odpovídajících hodnot ve dvou maticích. +SUMX2PY2 = SUMX2PY2 ## Vrátí součet součtu čtverců odpovídajících hodnot ve dvou maticích. +SUMXMY2 = SUMXMY2 ## Vrátí součet čtverců rozdílů odpovídajících hodnot ve dvou maticích. +TAN = TGTG ## Vrátí tangens čísla. +TANH = TGH ## Vrátí hyperbolický tangens čísla. +TRUNC = USEKNOUT ## Zkrátí číslo na celé číslo. + + +## +## Statistical functions Statistické funkce +## +AVEDEV = PRŮMODCHYLKA ## Vrátí průměrnou hodnotu absolutních odchylek datových bodů od jejich střední hodnoty. +AVERAGE = PRŮMĚR ## Vrátí průměrnou hodnotu argumentů. +AVERAGEA = AVERAGEA ## Vrátí průměrnou hodnotu argumentů včetně čísel, textu a logických hodnot. +AVERAGEIF = AVERAGEIF ## Vrátí průměrnou hodnotu (aritmetický průměr) všech buněk v oblasti, které vyhovují příslušné podmínce. +AVERAGEIFS = AVERAGEIFS ## Vrátí průměrnou hodnotu (aritmetický průměr) všech buněk vyhovujících několika podmínkám. +BETADIST = BETADIST ## Vrátí hodnotu součtového rozdělení beta. +BETAINV = BETAINV ## Vrátí inverzní hodnotu součtového rozdělení pro zadané rozdělení beta. +BINOMDIST = BINOMDIST ## Vrátí hodnotu binomického rozdělení pravděpodobnosti jednotlivých veličin. +CHIDIST = CHIDIST ## Vrátí jednostrannou pravděpodobnost rozdělení chí-kvadrát. +CHIINV = CHIINV ## Vrátí hodnotu funkce inverzní k distribuční funkci jednostranné pravděpodobnosti rozdělení chí-kvadrát. +CHITEST = CHITEST ## Vrátí test nezávislosti. +CONFIDENCE = CONFIDENCE ## Vrátí interval spolehlivosti pro střední hodnotu základního souboru. +CORREL = CORREL ## Vrátí korelační koeficient mezi dvěma množinami dat. +COUNT = POČET ## Vrátí počet čísel v seznamu argumentů. +COUNTA = POČET2 ## Vrátí počet hodnot v seznamu argumentů. +COUNTBLANK = COUNTBLANK ## Spočítá počet prázdných buněk v oblasti. +COUNTIF = COUNTIF ## Spočítá buňky v oblasti, které odpovídají zadaným kritériím. +COUNTIFS = COUNTIFS ## Spočítá buňky v oblasti, které odpovídají více kritériím. +COVAR = COVAR ## Vrátí hodnotu kovariance, průměrnou hodnotu součinů párových odchylek +CRITBINOM = CRITBINOM ## Vrátí nejmenší hodnotu, pro kterou má součtové binomické rozdělení hodnotu větší nebo rovnu hodnotě kritéria. +DEVSQ = DEVSQ ## Vrátí součet čtverců odchylek. +EXPONDIST = EXPONDIST ## Vrátí hodnotu exponenciálního rozdělení. +FDIST = FDIST ## Vrátí hodnotu rozdělení pravděpodobnosti F. +FINV = FINV ## Vrátí hodnotu inverzní funkce k distribuční funkci rozdělení F. +FISHER = FISHER ## Vrátí hodnotu Fisherovy transformace. +FISHERINV = FISHERINV ## Vrátí hodnotu inverzní funkce k Fisherově transformaci. +FORECAST = FORECAST ## Vrátí hodnotu lineárního trendu. +FREQUENCY = ČETNOSTI ## Vrátí četnost rozdělení jako svislou matici. +FTEST = FTEST ## Vrátí výsledek F-testu. +GAMMADIST = GAMMADIST ## Vrátí hodnotu rozdělení gama. +GAMMAINV = GAMMAINV ## Vrátí hodnotu inverzní funkce k distribuční funkci součtového rozdělení gama. +GAMMALN = GAMMALN ## Vrátí přirozený logaritmus funkce gama, Γ(x). +GEOMEAN = GEOMEAN ## Vrátí geometrický průměr. +GROWTH = LOGLINTREND ## Vrátí hodnoty exponenciálního trendu. +HARMEAN = HARMEAN ## Vrátí harmonický průměr. +HYPGEOMDIST = HYPGEOMDIST ## Vrátí hodnotu hypergeometrického rozdělení. +INTERCEPT = INTERCEPT ## Vrátí úsek lineární regresní čáry. +KURT = KURT ## Vrátí hodnotu excesu množiny dat. +LARGE = LARGE ## Vrátí k-tou největší hodnotu množiny dat. +LINEST = LINREGRESE ## Vrátí parametry lineárního trendu. +LOGEST = LOGLINREGRESE ## Vrátí parametry exponenciálního trendu. +LOGINV = LOGINV ## Vrátí inverzní funkci k distribuční funkci logaritmicko-normálního rozdělení. +LOGNORMDIST = LOGNORMDIST ## Vrátí hodnotu součtového logaritmicko-normálního rozdělení. +MAX = MAX ## Vrátí maximální hodnotu seznamu argumentů. +MAXA = MAXA ## Vrátí maximální hodnotu seznamu argumentů včetně čísel, textu a logických hodnot. +MEDIAN = MEDIAN ## Vrátí střední hodnotu zadaných čísel. +MIN = MIN ## Vrátí minimální hodnotu seznamu argumentů. +MINA = MINA ## Vrátí nejmenší hodnotu v seznamu argumentů včetně čísel, textu a logických hodnot. +MODE = MODE ## Vrátí hodnotu, která se v množině dat vyskytuje nejčastěji. +NEGBINOMDIST = NEGBINOMDIST ## Vrátí hodnotu negativního binomického rozdělení. +NORMDIST = NORMDIST ## Vrátí hodnotu normálního součtového rozdělení. +NORMINV = NORMINV ## Vrátí inverzní funkci k funkci normálního součtového rozdělení. +NORMSDIST = NORMSDIST ## Vrátí hodnotu standardního normálního součtového rozdělení. +NORMSINV = NORMSINV ## Vrátí inverzní funkci k funkci standardního normálního součtového rozdělení. +PEARSON = PEARSON ## Vrátí Pearsonův výsledný momentový korelační koeficient. +PERCENTILE = PERCENTIL ## Vrátí hodnotu k-tého percentilu hodnot v oblasti. +PERCENTRANK = PERCENTRANK ## Vrátí pořadí hodnoty v množině dat vyjádřené procentuální částí množiny dat. +PERMUT = PERMUTACE ## Vrátí počet permutací pro zadaný počet objektů. +POISSON = POISSON ## Vrátí hodnotu distribuční funkce Poissonova rozdělení. +PROB = PROB ## Vrátí pravděpodobnost výskytu hodnot v oblasti mezi dvěma mezními hodnotami. +QUARTILE = QUARTIL ## Vrátí hodnotu kvartilu množiny dat. +RANK = RANK ## Vrátí pořadí čísla v seznamu čísel. +RSQ = RKQ ## Vrátí druhou mocninu Pearsonova výsledného momentového korelačního koeficientu. +SKEW = SKEW ## Vrátí zešikmení rozdělení. +SLOPE = SLOPE ## Vrátí směrnici lineární regresní čáry. +SMALL = SMALL ## Vrátí k-tou nejmenší hodnotu množiny dat. +STANDARDIZE = STANDARDIZE ## Vrátí normalizovanou hodnotu. +STDEV = SMODCH.VÝBĚR ## Vypočte směrodatnou odchylku výběru. +STDEVA = STDEVA ## Vypočte směrodatnou odchylku výběru včetně čísel, textu a logických hodnot. +STDEVP = SMODCH ## Vypočte směrodatnou odchylku základního souboru. +STDEVPA = STDEVPA ## Vypočte směrodatnou odchylku základního souboru včetně čísel, textu a logických hodnot. +STEYX = STEYX ## Vrátí standardní chybu předpovězené hodnoty y pro každou hodnotu x v regresi. +TDIST = TDIST ## Vrátí hodnotu Studentova t-rozdělení. +TINV = TINV ## Vrátí inverzní funkci k distribuční funkci Studentova t-rozdělení. +TREND = LINTREND ## Vrátí hodnoty lineárního trendu. +TRIMMEAN = TRIMMEAN ## Vrátí střední hodnotu vnitřní části množiny dat. +TTEST = TTEST ## Vrátí pravděpodobnost spojenou se Studentovým t-testem. +VAR = VAR.VÝBĚR ## Vypočte rozptyl výběru. +VARA = VARA ## Vypočte rozptyl výběru včetně čísel, textu a logických hodnot. +VARP = VAR ## Vypočte rozptyl základního souboru. +VARPA = VARPA ## Vypočte rozptyl základního souboru včetně čísel, textu a logických hodnot. +WEIBULL = WEIBULL ## Vrátí hodnotu Weibullova rozdělení. +ZTEST = ZTEST ## Vrátí jednostrannou P-hodnotu z-testu. + + +## +## Text functions Textové funkce +## +ASC = ASC ## Změní znaky s plnou šířkou (dvoubajtové)v řetězci znaků na znaky s poloviční šířkou (jednobajtové). +BAHTTEXT = BAHTTEXT ## Převede číslo na text ve formátu, měny ß (baht). +CHAR = ZNAK ## Vrátí znak určený číslem kódu. +CLEAN = VYČISTIT ## Odebere z textu všechny netisknutelné znaky. +CODE = KÓD ## Vrátí číselný kód prvního znaku zadaného textového řetězce. +CONCATENATE = CONCATENATE ## Spojí několik textových položek do jedné. +DOLLAR = KČ ## Převede číslo na text ve formátu měny Kč (česká koruna). +EXACT = STEJNÉ ## Zkontroluje, zda jsou dvě textové hodnoty shodné. +FIND = NAJÍT ## Nalezne textovou hodnotu uvnitř jiné (rozlišuje malá a velká písmena). +FINDB = FINDB ## Nalezne textovou hodnotu uvnitř jiné (rozlišuje malá a velká písmena). +FIXED = ZAOKROUHLIT.NA.TEXT ## Zformátuje číslo jako text s pevným počtem desetinných míst. +JIS = JIS ## Změní znaky s poloviční šířkou (jednobajtové) v řetězci znaků na znaky s plnou šířkou (dvoubajtové). +LEFT = ZLEVA ## Vrátí první znaky textové hodnoty umístěné nejvíce vlevo. +LEFTB = LEFTB ## Vrátí první znaky textové hodnoty umístěné nejvíce vlevo. +LEN = DÉLKA ## Vrátí počet znaků textového řetězce. +LENB = LENB ## Vrátí počet znaků textového řetězce. +LOWER = MALÁ ## Převede text na malá písmena. +MID = ČÁST ## Vrátí určitý počet znaků textového řetězce počínaje zadaným místem. +MIDB = MIDB ## Vrátí určitý počet znaků textového řetězce počínaje zadaným místem. +PHONETIC = ZVUKOVÉ ## Extrahuje fonetické znaky (furigana) z textového řetězce. +PROPER = VELKÁ2 ## Převede první písmeno každého slova textové hodnoty na velké. +REPLACE = NAHRADIT ## Nahradí znaky uvnitř textu. +REPLACEB = NAHRADITB ## Nahradí znaky uvnitř textu. +REPT = OPAKOVAT ## Zopakuje text podle zadaného počtu opakování. +RIGHT = ZPRAVA ## Vrátí první znaky textové hodnoty umístěné nejvíce vpravo. +RIGHTB = RIGHTB ## Vrátí první znaky textové hodnoty umístěné nejvíce vpravo. +SEARCH = HLEDAT ## Nalezne textovou hodnotu uvnitř jiné (malá a velká písmena nejsou rozlišována). +SEARCHB = SEARCHB ## Nalezne textovou hodnotu uvnitř jiné (malá a velká písmena nejsou rozlišována). +SUBSTITUTE = DOSADIT ## V textovém řetězci nahradí starý text novým. +T = T ## Převede argumenty na text. +TEXT = HODNOTA.NA.TEXT ## Zformátuje číslo a převede ho na text. +TRIM = PROČISTIT ## Odstraní z textu mezery. +UPPER = VELKÁ ## Převede text na velká písmena. +VALUE = HODNOTA ## Převede textový argument na číslo. diff --git a/application/third_party/PHPExcel/PHPExcel/locale/da/config b/application/third_party/PHPExcel/PHPExcel/locale/da/config new file mode 100644 index 0000000..ae59003 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/da/config @@ -0,0 +1,48 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = kr + + + +## +## Excel Error Codes (For future use) +## +NULL = #NUL! +DIV0 = #DIVISION/0! +VALUE = #VÆRDI! +REF = #REFERENCE! +NAME = #NAVN? +NUM = #NUM! +NA = #I/T diff --git a/application/third_party/PHPExcel/PHPExcel/locale/da/functions b/application/third_party/PHPExcel/PHPExcel/locale/da/functions new file mode 100644 index 0000000..26e0310 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/da/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Tilføjelsesprogram- og automatiseringsfunktioner +## +GETPIVOTDATA = HENTPIVOTDATA ## Returnerer data, der er lagret i en pivottabelrapport + + +## +## Cube functions Kubefunktioner +## +CUBEKPIMEMBER = KUBE.KPI.MEDLEM ## Returnerer navn, egenskab og mål for en KPI-indikator og viser navnet og egenskaben i cellen. En KPI-indikator er en målbar størrelse, f.eks. bruttooverskud pr. måned eller personaleudskiftning pr. kvartal, der bruges til at overvåge en organisations præstationer. +CUBEMEMBER = KUBE.MEDLEM ## Returnerer et medlem eller en tupel fra kubehierarkiet. Bruges til at validere, om et medlem eller en tupel findes i kuben. +CUBEMEMBERPROPERTY = KUBEMEDLEM.EGENSKAB ## Returnerer værdien af en egenskab for et medlem i kuben. Bruges til at validere, om et medlemsnavn findes i kuben, og returnere den angivne egenskab for medlemmet. +CUBERANKEDMEMBER = KUBEMEDLEM.RANG ## Returnerer det n'te eller rangordnede medlem i et sæt. Bruges til at returnere et eller flere elementer i et sæt, f.eks. topsælgere eller de 10 bedste elever. +CUBESET = KUBESÆT ## Definerer et beregnet sæt medlemmer eller tupler ved at sende et sætudtryk til kuben på serveren, som opretter sættet og returnerer det til Microsoft Office Excel. +CUBESETCOUNT = KUBESÆT.TÆL ## Returnerer antallet af elementer i et sæt. +CUBEVALUE = KUBEVÆRDI ## Returnerer en sammenlagt (aggregeret) værdi fra en kube. + + +## +## Database functions Databasefunktioner +## +DAVERAGE = DMIDDEL ## Returnerer gennemsnittet af markerede databaseposter +DCOUNT = DTÆL ## Tæller de celler, der indeholder tal, i en database +DCOUNTA = DTÆLV ## Tæller udfyldte celler i en database +DGET = DHENT ## Uddrager en enkelt post, der opfylder de angivne kriterier, fra en database +DMAX = DMAKS ## Returnerer den største værdi blandt markerede databaseposter +DMIN = DMIN ## Returnerer den mindste værdi blandt markerede databaseposter +DPRODUCT = DPRODUKT ## Ganger værdierne i et bestemt felt med poster, der opfylder kriterierne i en database +DSTDEV = DSTDAFV ## Beregner et skøn over standardafvigelsen baseret på en stikprøve af markerede databaseposter +DSTDEVP = DSTDAFVP ## Beregner standardafvigelsen baseret på hele populationen af markerede databaseposter +DSUM = DSUM ## Sammenlægger de tal i feltkolonnen i databasen, der opfylder kriterierne +DVAR = DVARIANS ## Beregner varians baseret på en stikprøve af markerede databaseposter +DVARP = DVARIANSP ## Beregner varians baseret på hele populationen af markerede databaseposter + + +## +## Date and time functions Dato- og klokkeslætsfunktioner +## +DATE = DATO ## Returnerer serienummeret for en bestemt dato +DATEVALUE = DATOVÆRDI ## Konverterer en dato i form af tekst til et serienummer +DAY = DAG ## Konverterer et serienummer til en dag i måneden +DAYS360 = DAGE360 ## Beregner antallet af dage mellem to datoer på grundlag af et år med 360 dage +EDATE = EDATO ## Returnerer serienummeret for den dato, der ligger det angivne antal måneder før eller efter startdatoen +EOMONTH = SLUT.PÅ.MÅNED ## Returnerer serienummeret på den sidste dag i måneden før eller efter et angivet antal måneder +HOUR = TIME ## Konverterer et serienummer til en time +MINUTE = MINUT ## Konverterer et serienummer til et minut +MONTH = MÅNED ## Konverterer et serienummer til en måned +NETWORKDAYS = ANTAL.ARBEJDSDAGE ## Returnerer antallet af hele arbejdsdage mellem to datoer +NOW = NU ## Returnerer serienummeret for den aktuelle dato eller det aktuelle klokkeslæt +SECOND = SEKUND ## Konverterer et serienummer til et sekund +TIME = KLOKKESLÆT ## Returnerer serienummeret for et bestemt klokkeslæt +TIMEVALUE = TIDSVÆRDI ## Konverterer et klokkeslæt i form af tekst til et serienummer +TODAY = IDAG ## Returnerer serienummeret for dags dato +WEEKDAY = UGEDAG ## Konverterer et serienummer til en ugedag +WEEKNUM = UGE.NR ## Konverterer et serienummer til et tal, der angiver ugenummeret i året +WORKDAY = ARBEJDSDAG ## Returnerer serienummeret for dagen før eller efter det angivne antal arbejdsdage +YEAR = ÅR ## Konverterer et serienummer til et år +YEARFRAC = ÅR.BRØK ## Returnerer årsbrøken, der repræsenterer antallet af hele dage mellem startdato og slutdato + + +## +## Engineering functions Tekniske funktioner +## +BESSELI = BESSELI ## Returnerer den modificerede Bessel-funktion In(x) +BESSELJ = BESSELJ ## Returnerer Bessel-funktionen Jn(x) +BESSELK = BESSELK ## Returnerer den modificerede Bessel-funktion Kn(x) +BESSELY = BESSELY ## Returnerer Bessel-funktionen Yn(x) +BIN2DEC = BIN.TIL.DEC ## Konverterer et binært tal til et decimaltal +BIN2HEX = BIN.TIL.HEX ## Konverterer et binært tal til et heksadecimalt tal +BIN2OCT = BIN.TIL.OKT ## Konverterer et binært tal til et oktaltal. +COMPLEX = KOMPLEKS ## Konverterer reelle og imaginære koefficienter til et komplekst tal +CONVERT = KONVERTER ## Konverterer et tal fra én måleenhed til en anden +DEC2BIN = DEC.TIL.BIN ## Konverterer et decimaltal til et binært tal +DEC2HEX = DEC.TIL.HEX ## Konverterer et decimaltal til et heksadecimalt tal +DEC2OCT = DEC.TIL.OKT ## Konverterer et decimaltal til et oktaltal +DELTA = DELTA ## Tester, om to værdier er ens +ERF = FEJLFUNK ## Returner fejlfunktionen +ERFC = FEJLFUNK.KOMP ## Returnerer den komplementære fejlfunktion +GESTEP = GETRIN ## Tester, om et tal er større end en grænseværdi +HEX2BIN = HEX.TIL.BIN ## Konverterer et heksadecimalt tal til et binært tal +HEX2DEC = HEX.TIL.DEC ## Konverterer et decimaltal til et heksadecimalt tal +HEX2OCT = HEX.TIL.OKT ## Konverterer et heksadecimalt tal til et oktaltal +IMABS = IMAGABS ## Returnerer den absolutte værdi (modulus) for et komplekst tal +IMAGINARY = IMAGINÆR ## Returnerer den imaginære koefficient for et komplekst tal +IMARGUMENT = IMAGARGUMENT ## Returnerer argumentet theta, en vinkel udtrykt i radianer +IMCONJUGATE = IMAGKONJUGERE ## Returnerer den komplekse konjugation af et komplekst tal +IMCOS = IMAGCOS ## Returnerer et komplekst tals cosinus +IMDIV = IMAGDIV ## Returnerer kvotienten for to komplekse tal +IMEXP = IMAGEKSP ## Returnerer et komplekst tals eksponentialfunktion +IMLN = IMAGLN ## Returnerer et komplekst tals naturlige logaritme +IMLOG10 = IMAGLOG10 ## Returnerer et komplekst tals sædvanlige logaritme (titalslogaritme) +IMLOG2 = IMAGLOG2 ## Returnerer et komplekst tals sædvanlige logaritme (totalslogaritme) +IMPOWER = IMAGPOTENS ## Returnerer et komplekst tal opløftet i en heltalspotens +IMPRODUCT = IMAGPRODUKT ## Returnerer produktet af komplekse tal +IMREAL = IMAGREELT ## Returnerer den reelle koefficient for et komplekst tal +IMSIN = IMAGSIN ## Returnerer et komplekst tals sinus +IMSQRT = IMAGKVROD ## Returnerer et komplekst tals kvadratrod +IMSUB = IMAGSUB ## Returnerer forskellen mellem to komplekse tal +IMSUM = IMAGSUM ## Returnerer summen af komplekse tal +OCT2BIN = OKT.TIL.BIN ## Konverterer et oktaltal til et binært tal +OCT2DEC = OKT.TIL.DEC ## Konverterer et oktaltal til et decimaltal +OCT2HEX = OKT.TIL.HEX ## Konverterer et oktaltal til et heksadecimalt tal + + +## +## Financial functions Finansielle funktioner +## +ACCRINT = PÅLØBRENTE ## Returnerer den påløbne rente for et værdipapir med periodiske renteudbetalinger +ACCRINTM = PÅLØBRENTE.UDLØB ## Returnerer den påløbne rente for et værdipapir, hvor renteudbetalingen finder sted ved papirets udløb +AMORDEGRC = AMORDEGRC ## Returnerer afskrivningsbeløbet for hver regnskabsperiode ved hjælp af en afskrivningskoefficient +AMORLINC = AMORLINC ## Returnerer afskrivningsbeløbet for hver regnskabsperiode +COUPDAYBS = KUPONDAGE.SA ## Returnerer antallet af dage fra starten af kuponperioden til afregningsdatoen +COUPDAYS = KUPONDAGE.A ## Returnerer antallet af dage fra begyndelsen af kuponperioden til afregningsdatoen +COUPDAYSNC = KUPONDAGE.ANK ## Returnerer antallet af dage i den kuponperiode, der indeholder afregningsdatoen +COUPNCD = KUPONDAG.NÆSTE ## Returnerer den næste kupondato efter afregningsdatoen +COUPNUM = KUPONBETALINGER ## Returnerer antallet af kuponudbetalinger mellem afregnings- og udløbsdatoen +COUPPCD = KUPONDAG.FORRIGE ## Returnerer den forrige kupondato før afregningsdatoen +CUMIPMT = AKKUM.RENTE ## Returnerer den akkumulerede rente, der betales på et lån mellem to perioder +CUMPRINC = AKKUM.HOVEDSTOL ## Returnerer den akkumulerede nedbringelse af hovedstol mellem to perioder +DB = DB ## Returnerer afskrivningen på et aktiv i en angivet periode ved anvendelse af saldometoden +DDB = DSA ## Returnerer afskrivningsbeløbet for et aktiv over en bestemt periode ved anvendelse af dobbeltsaldometoden eller en anden afskrivningsmetode, som du angiver +DISC = DISKONTO ## Returnerer et værdipapirs diskonto +DOLLARDE = KR.DECIMAL ## Konverterer en kronepris udtrykt som brøk til en kronepris udtrykt som decimaltal +DOLLARFR = KR.BRØK ## Konverterer en kronepris udtrykt som decimaltal til en kronepris udtrykt som brøk +DURATION = VARIGHED ## Returnerer den årlige løbetid for et værdipapir med periodiske renteudbetalinger +EFFECT = EFFEKTIV.RENTE ## Returnerer den årlige effektive rente +FV = FV ## Returnerer fremtidsværdien af en investering +FVSCHEDULE = FVTABEL ## Returnerer den fremtidige værdi af en hovedstol, når der er tilskrevet rente og rentes rente efter forskellige rentesatser +INTRATE = RENTEFOD ## Returnerer renten på et fuldt ud investeret værdipapir +IPMT = R.YDELSE ## Returnerer renten fra en investering for en given periode +IRR = IA ## Returnerer den interne rente for en række pengestrømme +ISPMT = ISPMT ## Beregner den betalte rente i løbet af en bestemt investeringsperiode +MDURATION = MVARIGHED ## Returnerer Macauleys modificerede løbetid for et værdipapir med en formodet pari på kr. 100 +MIRR = MIA ## Returnerer den interne forrentning, hvor positive og negative pengestrømme finansieres til forskellig rente +NOMINAL = NOMINEL ## Returnerer den årlige nominelle rente +NPER = NPER ## Returnerer antallet af perioder for en investering +NPV = NUTIDSVÆRDI ## Returnerer nettonutidsværdien for en investering baseret på en række periodiske pengestrømme og en diskonteringssats +ODDFPRICE = ULIGE.KURS.PÅLYDENDE ## Returnerer kursen pr. kr. 100 nominel værdi for et værdipapir med en ulige (kort eller lang) første periode +ODDFYIELD = ULIGE.FØRSTE.AFKAST ## Returnerer afkastet for et værdipapir med ulige første periode +ODDLPRICE = ULIGE.SIDSTE.KURS ## Returnerer kursen pr. kr. 100 nominel værdi for et værdipapir med ulige sidste periode +ODDLYIELD = ULIGE.SIDSTE.AFKAST ## Returnerer afkastet for et værdipapir med ulige sidste periode +PMT = YDELSE ## Returnerer renten fra en investering for en given periode +PPMT = H.YDELSE ## Returnerer ydelsen på hovedstolen for en investering i en given periode +PRICE = KURS ## Returnerer kursen pr. kr 100 nominel værdi for et værdipapir med periodiske renteudbetalinger +PRICEDISC = KURS.DISKONTO ## Returnerer kursen pr. kr 100 nominel værdi for et diskonteret værdipapir +PRICEMAT = KURS.UDLØB ## Returnerer kursen pr. kr 100 nominel værdi for et værdipapir, hvor renten udbetales ved papirets udløb +PV = NV ## Returnerer den nuværende værdi af en investering +RATE = RENTE ## Returnerer renten i hver periode for en annuitet +RECEIVED = MODTAGET.VED.UDLØB ## Returnerer det beløb, der modtages ved udløbet af et fuldt ud investeret værdipapir +SLN = LA ## Returnerer den lineære afskrivning for et aktiv i en enkelt periode +SYD = ÅRSAFSKRIVNING ## Returnerer den årlige afskrivning på et aktiv i en bestemt periode +TBILLEQ = STATSOBLIGATION ## Returnerer det obligationsækvivalente afkast for en statsobligation +TBILLPRICE = STATSOBLIGATION.KURS ## Returnerer kursen pr. kr 100 nominel værdi for en statsobligation +TBILLYIELD = STATSOBLIGATION.AFKAST ## Returnerer en afkastet på en statsobligation +VDB = VSA ## Returnerer afskrivningen på et aktiv i en angivet periode, herunder delperioder, ved brug af dobbeltsaldometoden +XIRR = INTERN.RENTE ## Returnerer den interne rente for en plan over pengestrømme, der ikke behøver at være periodiske +XNPV = NETTO.NUTIDSVÆRDI ## Returnerer nutidsværdien for en plan over pengestrømme, der ikke behøver at være periodiske +YIELD = AFKAST ## Returnerer afkastet for et værdipapir med periodiske renteudbetalinger +YIELDDISC = AFKAST.DISKONTO ## Returnerer det årlige afkast for et diskonteret værdipapir, f.eks. en statsobligation +YIELDMAT = AFKAST.UDLØBSDATO ## Returnerer det årlige afkast for et værdipapir, hvor renten udbetales ved papirets udløb + + +## +## Information functions Informationsfunktioner +## +CELL = CELLE ## Returnerer oplysninger om formatering, placering eller indhold af en celle +ERROR.TYPE = FEJLTYPE ## Returnerer et tal, der svarer til en fejltype +INFO = INFO ## Returnerer oplysninger om det aktuelle operativmiljø +ISBLANK = ER.TOM ## Returnerer SAND, hvis værdien er tom +ISERR = ER.FJL ## Returnerer SAND, hvis værdien er en fejlværdi undtagen #I/T +ISERROR = ER.FEJL ## Returnerer SAND, hvis værdien er en fejlværdi +ISEVEN = ER.LIGE ## Returnerer SAND, hvis tallet er lige +ISLOGICAL = ER.LOGISK ## Returnerer SAND, hvis værdien er en logisk værdi +ISNA = ER.IKKE.TILGÆNGELIG ## Returnerer SAND, hvis værdien er fejlværdien #I/T +ISNONTEXT = ER.IKKE.TEKST ## Returnerer SAND, hvis værdien ikke er tekst +ISNUMBER = ER.TAL ## Returnerer SAND, hvis værdien er et tal +ISODD = ER.ULIGE ## Returnerer SAND, hvis tallet er ulige +ISREF = ER.REFERENCE ## Returnerer SAND, hvis værdien er en reference +ISTEXT = ER.TEKST ## Returnerer SAND, hvis værdien er tekst +N = TAL ## Returnerer en værdi konverteret til et tal +NA = IKKE.TILGÆNGELIG ## Returnerer fejlværdien #I/T +TYPE = VÆRDITYPE ## Returnerer et tal, der angiver datatypen for en værdi + + +## +## Logical functions Logiske funktioner +## +AND = OG ## Returnerer SAND, hvis alle argumenterne er sande +FALSE = FALSK ## Returnerer den logiske værdi FALSK +IF = HVIS ## Angiver en logisk test, der skal udføres +IFERROR = HVIS.FEJL ## Returnerer en værdi, du angiver, hvis en formel evauleres som en fejl. Returnerer i modsat fald resultatet af formlen +NOT = IKKE ## Vender argumentets logik om +OR = ELLER ## Returneret værdien SAND, hvis mindst ét argument er sandt +TRUE = SAND ## Returnerer den logiske værdi SAND + + +## +## Lookup and reference functions Opslags- og referencefunktioner +## +ADDRESS = ADRESSE ## Returnerer en reference som tekst til en enkelt celle i et regneark +AREAS = OMRÅDER ## Returnerer antallet af områder i en reference +CHOOSE = VÆLG ## Vælger en værdi på en liste med værdier +COLUMN = KOLONNE ## Returnerer kolonnenummeret i en reference +COLUMNS = KOLONNER ## Returnerer antallet af kolonner i en reference +HLOOKUP = VOPSLAG ## Søger i den øverste række af en matrix og returnerer værdien af den angivne celle +HYPERLINK = HYPERLINK ## Opretter en genvej kaldet et hyperlink, der åbner et dokument, som er lagret på en netværksserver, på et intranet eller på internettet +INDEX = INDEKS ## Anvender et indeks til at vælge en værdi fra en reference eller en matrix +INDIRECT = INDIREKTE ## Returnerer en reference, der er angivet af en tekstværdi +LOOKUP = SLÅ.OP ## Søger værdier i en vektor eller en matrix +MATCH = SAMMENLIGN ## Søger værdier i en reference eller en matrix +OFFSET = FORSKYDNING ## Returnerer en reference forskudt i forhold til en given reference +ROW = RÆKKE ## Returnerer rækkenummeret for en reference +ROWS = RÆKKER ## Returnerer antallet af rækker i en reference +RTD = RTD ## Henter realtidsdata fra et program, der understøtter COM-automatisering (Automation: En metode til at arbejde med objekter fra et andet program eller udviklingsværktøj. Automation, som tidligere blev kaldt OLE Automation, er en industristandard og en funktion i COM (Component Object Model).) +TRANSPOSE = TRANSPONER ## Returnerer en transponeret matrix +VLOOKUP = LOPSLAG ## Søger i øverste række af en matrix og flytter på tværs af rækken for at returnere en celleværdi + + +## +## Math and trigonometry functions Matematiske og trigonometriske funktioner +## +ABS = ABS ## Returnerer den absolutte værdi af et tal +ACOS = ARCCOS ## Returnerer et tals arcus cosinus +ACOSH = ARCCOSH ## Returnerer den inverse hyperbolske cosinus af tal +ASIN = ARCSIN ## Returnerer et tals arcus sinus +ASINH = ARCSINH ## Returnerer den inverse hyperbolske sinus for tal +ATAN = ARCTAN ## Returnerer et tals arcus tangens +ATAN2 = ARCTAN2 ## Returnerer de angivne x- og y-koordinaters arcus tangens +ATANH = ARCTANH ## Returnerer et tals inverse hyperbolske tangens +CEILING = AFRUND.LOFT ## Afrunder et tal til nærmeste heltal eller til nærmeste multiplum af betydning +COMBIN = KOMBIN ## Returnerer antallet af kombinationer for et givet antal objekter +COS = COS ## Returnerer et tals cosinus +COSH = COSH ## Returnerer den inverse hyperbolske cosinus af et tal +DEGREES = GRADER ## Konverterer radianer til grader +EVEN = LIGE ## Runder et tal op til nærmeste lige heltal +EXP = EKSP ## Returnerer e opløftet til en potens af et angivet tal +FACT = FAKULTET ## Returnerer et tals fakultet +FACTDOUBLE = DOBBELT.FAKULTET ## Returnerer et tals dobbelte fakultet +FLOOR = AFRUND.GULV ## Runder et tal ned mod nul +GCD = STØRSTE.FÆLLES.DIVISOR ## Returnerer den største fælles divisor +INT = HELTAL ## Nedrunder et tal til det nærmeste heltal +LCM = MINDSTE.FÆLLES.MULTIPLUM ## Returnerer det mindste fælles multiplum +LN = LN ## Returnerer et tals naturlige logaritme +LOG = LOG ## Returnerer logaritmen for et tal på grundlag af et angivet grundtal +LOG10 = LOG10 ## Returnerer titalslogaritmen af et tal +MDETERM = MDETERM ## Returnerer determinanten for en matrix +MINVERSE = MINVERT ## Returnerer den inverse matrix for en matrix +MMULT = MPRODUKT ## Returnerer matrixproduktet af to matrixer +MOD = REST ## Returnerer restværdien fra division +MROUND = MAFRUND ## Returnerer et tal afrundet til det ønskede multiplum +MULTINOMIAL = MULTINOMIAL ## Returnerer et multinomialt talsæt +ODD = ULIGE ## Runder et tal op til nærmeste ulige heltal +PI = PI ## Returnerer værdien af pi +POWER = POTENS ## Returnerer resultatet af et tal opløftet til en potens +PRODUCT = PRODUKT ## Multiplicerer argumenterne +QUOTIENT = KVOTIENT ## Returnerer heltalsdelen ved division +RADIANS = RADIANER ## Konverterer grader til radianer +RAND = SLUMP ## Returnerer et tilfældigt tal mellem 0 og 1 +RANDBETWEEN = SLUMP.MELLEM ## Returnerer et tilfældigt tal mellem de tal, der angives +ROMAN = ROMERTAL ## Konverterer et arabertal til romertal som tekst +ROUND = AFRUND ## Afrunder et tal til et angivet antal decimaler +ROUNDDOWN = RUND.NED ## Runder et tal ned mod nul +ROUNDUP = RUND.OP ## Runder et tal op, væk fra 0 (nul) +SERIESSUM = SERIESUM ## Returnerer summen af en potensserie baseret på en formel +SIGN = FORTEGN ## Returnerer et tals fortegn +SIN = SIN ## Returnerer en given vinkels sinusværdi +SINH = SINH ## Returnerer den hyperbolske sinus af et tal +SQRT = KVROD ## Returnerer en positiv kvadratrod +SQRTPI = KVRODPI ## Returnerer kvadratroden af (tal * pi;) +SUBTOTAL = SUBTOTAL ## Returnerer en subtotal på en liste eller i en database +SUM = SUM ## Lægger argumenterne sammen +SUMIF = SUM.HVIS ## Lægger de celler sammen, der er specificeret af et givet kriterium. +SUMIFS = SUM.HVISER ## Lægger de celler i et område sammen, der opfylder flere kriterier. +SUMPRODUCT = SUMPRODUKT ## Returnerer summen af produkter af ens matrixkomponenter +SUMSQ = SUMKV ## Returnerer summen af argumenternes kvadrater +SUMX2MY2 = SUMX2MY2 ## Returnerer summen af differensen mellem kvadrater af ens værdier i to matrixer +SUMX2PY2 = SUMX2PY2 ## Returnerer summen af summen af kvadrater af tilsvarende værdier i to matrixer +SUMXMY2 = SUMXMY2 ## Returnerer summen af kvadrater af differenser mellem ens værdier i to matrixer +TAN = TAN ## Returnerer et tals tangens +TANH = TANH ## Returnerer et tals hyperbolske tangens +TRUNC = AFKORT ## Afkorter et tal til et heltal + + +## +## Statistical functions Statistiske funktioner +## +AVEDEV = MAD ## Returnerer den gennemsnitlige numeriske afvigelse fra stikprøvens middelværdi +AVERAGE = MIDDEL ## Returnerer middelværdien af argumenterne +AVERAGEA = MIDDELV ## Returnerer middelværdien af argumenterne og medtager tal, tekst og logiske værdier +AVERAGEIF = MIDDEL.HVIS ## Returnerer gennemsnittet (den aritmetiske middelværdi) af alle de celler, der opfylder et givet kriterium, i et område +AVERAGEIFS = MIDDEL.HVISER ## Returnerer gennemsnittet (den aritmetiske middelværdi) af alle de celler, der opfylder flere kriterier. +BETADIST = BETAFORDELING ## Returnerer den kumulative betafordelingsfunktion +BETAINV = BETAINV ## Returnerer den inverse kumulative fordelingsfunktion for en angivet betafordeling +BINOMDIST = BINOMIALFORDELING ## Returnerer punktsandsynligheden for binomialfordelingen +CHIDIST = CHIFORDELING ## Returnerer fraktilsandsynligheden for en chi2-fordeling +CHIINV = CHIINV ## Returnerer den inverse fraktilsandsynlighed for en chi2-fordeling +CHITEST = CHITEST ## Foretager en test for uafhængighed +CONFIDENCE = KONFIDENSINTERVAL ## Returnerer et konfidensinterval for en population +CORREL = KORRELATION ## Returnerer korrelationskoefficienten mellem to datasæt +COUNT = TÆL ## Tæller antallet af tal på en liste med argumenter +COUNTA = TÆLV ## Tæller antallet af værdier på en liste med argumenter +COUNTBLANK = ANTAL.BLANKE ## Tæller antallet af tomme celler i et område +COUNTIF = TÆLHVIS ## Tæller antallet af celler, som opfylder de givne kriterier, i et område +COUNTIFS = TÆL.HVISER ## Tæller antallet af de celler, som opfylder flere kriterier, i et område +COVAR = KOVARIANS ## Beregner kovariansen mellem to stokastiske variabler +CRITBINOM = KRITBINOM ## Returnerer den mindste værdi for x, for hvilken det gælder, at fordelingsfunktionen er mindre end eller lig med kriterieværdien. +DEVSQ = SAK ## Returnerer summen af de kvadrerede afvigelser fra middelværdien +EXPONDIST = EKSPFORDELING ## Returnerer eksponentialfordelingen +FDIST = FFORDELING ## Returnerer fraktilsandsynligheden for F-fordelingen +FINV = FINV ## Returnerer den inverse fraktilsandsynlighed for F-fordelingen +FISHER = FISHER ## Returnerer Fisher-transformationen +FISHERINV = FISHERINV ## Returnerer den inverse Fisher-transformation +FORECAST = PROGNOSE ## Returnerer en prognoseværdi baseret på lineær tendens +FREQUENCY = FREKVENS ## Returnerer en frekvensfordeling i en søjlevektor +FTEST = FTEST ## Returnerer resultatet af en F-test til sammenligning af varians +GAMMADIST = GAMMAFORDELING ## Returnerer fordelingsfunktionen for gammafordelingen +GAMMAINV = GAMMAINV ## Returnerer den inverse fordelingsfunktion for gammafordelingen +GAMMALN = GAMMALN ## Returnerer den naturlige logaritme til gammafordelingen, G(x) +GEOMEAN = GEOMIDDELVÆRDI ## Returnerer det geometriske gennemsnit +GROWTH = FORØGELSE ## Returnerer værdier langs en eksponentiel tendens +HARMEAN = HARMIDDELVÆRDI ## Returnerer det harmoniske gennemsnit +HYPGEOMDIST = HYPGEOFORDELING ## Returnerer punktsandsynligheden i en hypergeometrisk fordeling +INTERCEPT = SKÆRING ## Returnerer afskæringsværdien på y-aksen i en lineær regression +KURT = TOPSTEJL ## Returnerer kurtosisværdien for en stokastisk variabel +LARGE = STOR ## Returnerer den k'te største værdi i et datasæt +LINEST = LINREGR ## Returnerer parameterestimaterne for en lineær tendens +LOGEST = LOGREGR ## Returnerer parameterestimaterne for en eksponentiel tendens +LOGINV = LOGINV ## Returnerer den inverse fordelingsfunktion for lognormalfordelingen +LOGNORMDIST = LOGNORMFORDELING ## Returnerer fordelingsfunktionen for lognormalfordelingen +MAX = MAKS ## Returnerer den maksimale værdi på en liste med argumenter. +MAXA = MAKSV ## Returnerer den maksimale værdi på en liste med argumenter og medtager tal, tekst og logiske værdier +MEDIAN = MEDIAN ## Returnerer medianen for de angivne tal +MIN = MIN ## Returnerer den mindste værdi på en liste med argumenter. +MINA = MINV ## Returnerer den mindste værdi på en liste med argumenter og medtager tal, tekst og logiske værdier +MODE = HYPPIGST ## Returnerer den hyppigste værdi i et datasæt +NEGBINOMDIST = NEGBINOMFORDELING ## Returnerer den negative binomialfordeling +NORMDIST = NORMFORDELING ## Returnerer fordelingsfunktionen for normalfordelingen +NORMINV = NORMINV ## Returnerer den inverse fordelingsfunktion for normalfordelingen +NORMSDIST = STANDARDNORMFORDELING ## Returnerer fordelingsfunktionen for standardnormalfordelingen +NORMSINV = STANDARDNORMINV ## Returnerer den inverse fordelingsfunktion for standardnormalfordelingen +PEARSON = PEARSON ## Returnerer Pearsons korrelationskoefficient +PERCENTILE = FRAKTIL ## Returnerer den k'te fraktil for datasættet +PERCENTRANK = PROCENTPLADS ## Returnerer den procentuelle rang for en given værdi i et datasæt +PERMUT = PERMUT ## Returnerer antallet af permutationer for et givet sæt objekter +POISSON = POISSON ## Returnerer fordelingsfunktionen for en Poisson-fordeling +PROB = SANDSYNLIGHED ## Returnerer intervalsandsynligheden +QUARTILE = KVARTIL ## Returnerer kvartilen i et givet datasæt +RANK = PLADS ## Returnerer rangen for et tal på en liste med tal +RSQ = FORKLARINGSGRAD ## Returnerer R2-værdien fra en simpel lineær regression +SKEW = SKÆVHED ## Returnerer skævheden for en stokastisk variabel +SLOPE = HÆLDNING ## Returnerer estimatet på hældningen fra en simpel lineær regression +SMALL = MINDSTE ## Returnerer den k'te mindste værdi i datasættet +STANDARDIZE = STANDARDISER ## Returnerer en standardiseret værdi +STDEV = STDAFV ## Estimerer standardafvigelsen på basis af en stikprøve +STDEVA = STDAFVV ## Beregner standardafvigelsen på basis af en prøve og medtager tal, tekst og logiske værdier +STDEVP = STDAFVP ## Beregner standardafvigelsen på basis af en hel population +STDEVPA = STDAFVPV ## Beregner standardafvigelsen på basis af en hel population og medtager tal, tekst og logiske værdier +STEYX = STFYX ## Returnerer standardafvigelsen for de estimerede y-værdier i den simple lineære regression +TDIST = TFORDELING ## Returnerer fordelingsfunktionen for Student's t-fordeling +TINV = TINV ## Returnerer den inverse fordelingsfunktion for Student's t-fordeling +TREND = TENDENS ## Returnerer værdi under antagelse af en lineær tendens +TRIMMEAN = TRIMMIDDELVÆRDI ## Returnerer den trimmede middelværdi for datasættet +TTEST = TTEST ## Returnerer den sandsynlighed, der er forbundet med Student's t-test +VAR = VARIANS ## Beregner variansen på basis af en prøve +VARA = VARIANSV ## Beregner variansen på basis af en prøve og medtager tal, tekst og logiske værdier +VARP = VARIANSP ## Beregner variansen på basis af hele populationen +VARPA = VARIANSPV ## Beregner variansen på basis af hele populationen og medtager tal, tekst og logiske værdier +WEIBULL = WEIBULL ## Returnerer fordelingsfunktionen for Weibull-fordelingen +ZTEST = ZTEST ## Returnerer sandsynlighedsværdien ved en en-sidet z-test + + +## +## Text functions Tekstfunktioner +## +ASC = ASC ## Ændrer engelske tegn i fuld bredde (dobbelt-byte) eller katakana i en tegnstreng til tegn i halv bredde (enkelt-byte) +BAHTTEXT = BAHTTEKST ## Konverterer et tal til tekst ved hjælp af valutaformatet ß (baht) +CHAR = TEGN ## Returnerer det tegn, der svarer til kodenummeret +CLEAN = RENS ## Fjerner alle tegn, der ikke kan udskrives, fra tekst +CODE = KODE ## Returnerer en numerisk kode for det første tegn i en tekststreng +CONCATENATE = SAMMENKÆDNING ## Sammenkæder adskillige tekstelementer til ét tekstelement +DOLLAR = KR ## Konverterer et tal til tekst ved hjælp af valutaformatet kr. (kroner) +EXACT = EKSAKT ## Kontrollerer, om to tekstværdier er identiske +FIND = FIND ## Søger efter en tekstværdi i en anden tekstværdi (der skelnes mellem store og små bogstaver) +FINDB = FINDB ## Søger efter en tekstværdi i en anden tekstværdi (der skelnes mellem store og små bogstaver) +FIXED = FAST ## Formaterer et tal som tekst med et fast antal decimaler +JIS = JIS ## Ændrer engelske tegn i halv bredde (enkelt-byte) eller katakana i en tegnstreng til tegn i fuld bredde (dobbelt-byte) +LEFT = VENSTRE ## Returnerer tegnet længst til venstre i en tekstværdi +LEFTB = VENSTREB ## Returnerer tegnet længst til venstre i en tekstværdi +LEN = LÆNGDE ## Returnerer antallet af tegn i en tekststreng +LENB = LÆNGDEB ## Returnerer antallet af tegn i en tekststreng +LOWER = SMÅ.BOGSTAVER ## Konverterer tekst til små bogstaver +MID = MIDT ## Returnerer et bestemt antal tegn fra en tekststreng fra og med den angivne startposition +MIDB = MIDTB ## Returnerer et bestemt antal tegn fra en tekststreng fra og med den angivne startposition +PHONETIC = FONETISK ## Uddrager de fonetiske (furigana) tegn fra en tekststreng +PROPER = STORT.FORBOGSTAV ## Konverterer første bogstav i hvert ord i teksten til stort bogstav +REPLACE = ERSTAT ## Erstatter tegn i tekst +REPLACEB = ERSTATB ## Erstatter tegn i tekst +REPT = GENTAG ## Gentager tekst et givet antal gange +RIGHT = HØJRE ## Returnerer tegnet længste til højre i en tekstværdi +RIGHTB = HØJREB ## Returnerer tegnet længste til højre i en tekstværdi +SEARCH = SØG ## Søger efter en tekstværdi i en anden tekstværdi (der skelnes ikke mellem store og små bogstaver) +SEARCHB = SØGB ## Søger efter en tekstværdi i en anden tekstværdi (der skelnes ikke mellem store og små bogstaver) +SUBSTITUTE = UDSKIFT ## Udskifter gammel tekst med ny tekst i en tekststreng +T = T ## Konverterer argumenterne til tekst +TEXT = TEKST ## Formaterer et tal og konverterer det til tekst +TRIM = FJERN.OVERFLØDIGE.BLANKE ## Fjerner mellemrum fra tekst +UPPER = STORE.BOGSTAVER ## Konverterer tekst til store bogstaver +VALUE = VÆRDI ## Konverterer et tekstargument til et tal diff --git a/application/third_party/PHPExcel/PHPExcel/locale/de/config b/application/third_party/PHPExcel/PHPExcel/locale/de/config new file mode 100644 index 0000000..aa0228e --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/de/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = € + + +## +## Excel Error Codes (For future use) +## +NULL = #NULL! +DIV0 = #DIV/0! +VALUE = #WERT! +REF = #BEZUG! +NAME = #NAME? +NUM = #ZAHL! +NA = #NV diff --git a/application/third_party/PHPExcel/PHPExcel/locale/de/functions b/application/third_party/PHPExcel/PHPExcel/locale/de/functions new file mode 100644 index 0000000..3147f9c --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/de/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Add-In- und Automatisierungsfunktionen +## +GETPIVOTDATA = PIVOTDATENZUORDNEN ## In einem PivotTable-Bericht gespeicherte Daten werden zurückgegeben. + + +## +## Cube functions Cubefunktionen +## +CUBEKPIMEMBER = CUBEKPIELEMENT ## Gibt Name, Eigenschaft und Measure eines Key Performance Indicators (KPI) zurück und zeigt den Namen und die Eigenschaft in der Zelle an. Ein KPI ist ein quantifizierbares Maß, wie z. B. der monatliche Bruttogewinn oder die vierteljährliche Mitarbeiterfluktuation, mit dessen Hilfe das Leistungsverhalten eines Unternehmens überwacht werden kann. +CUBEMEMBER = CUBEELEMENT ## Gibt ein Element oder ein Tuple in einer Cubehierarchie zurück. Wird verwendet, um zu überprüfen, ob das Element oder Tuple im Cube vorhanden ist. +CUBEMEMBERPROPERTY = CUBEELEMENTEIGENSCHAFT ## Gibt den Wert einer Elementeigenschaft im Cube zurück. Wird verwendet, um zu überprüfen, ob ein Elementname im Cube vorhanden ist, und um die für dieses Element angegebene Eigenschaft zurückzugeben. +CUBERANKEDMEMBER = CUBERANGELEMENT ## Gibt das n-te oder n-rangige Element in einer Menge zurück. Wird verwendet, um mindestens ein Element in einer Menge zurückzugeben, wie z. B. bester Vertriebsmitarbeiter oder 10 beste Kursteilnehmer. +CUBESET = CUBEMENGE ## Definiert eine berechnete Menge Elemente oder Tuples durch Senden eines Mengenausdrucks an den Cube auf dem Server, der die Menge erstellt und an Microsoft Office Excel zurückgibt. +CUBESETCOUNT = CUBEMENGENANZAHL ## Gibt die Anzahl der Elemente in einer Menge zurück. +CUBEVALUE = CUBEWERT ## Gibt einen Aggregatwert aus einem Cube zurück. + + +## +## Database functions Datenbankfunktionen +## +DAVERAGE = DBMITTELWERT ## Gibt den Mittelwert der ausgewählten Datenbankeinträge zurück +DCOUNT = DBANZAHL ## Zählt die Zellen mit Zahlen in einer Datenbank +DCOUNTA = DBANZAHL2 ## Zählt nicht leere Zellen in einer Datenbank +DGET = DBAUSZUG ## Extrahiert aus einer Datenbank einen einzelnen Datensatz, der den angegebenen Kriterien entspricht +DMAX = DBMAX ## Gibt den größten Wert aus ausgewählten Datenbankeinträgen zurück +DMIN = DBMIN ## Gibt den kleinsten Wert aus ausgewählten Datenbankeinträgen zurück +DPRODUCT = DBPRODUKT ## Multipliziert die Werte in einem bestimmten Feld mit Datensätzen, die den Kriterien in einer Datenbank entsprechen +DSTDEV = DBSTDABW ## Schätzt die Standardabweichung auf der Grundlage einer Stichprobe aus ausgewählten Datenbankeinträgen +DSTDEVP = DBSTDABWN ## Berechnet die Standardabweichung auf der Grundlage der Grundgesamtheit ausgewählter Datenbankeinträge +DSUM = DBSUMME ## Addiert die Zahlen in der Feldspalte mit Datensätzen in der Datenbank, die den Kriterien entsprechen +DVAR = DBVARIANZ ## Schätzt die Varianz auf der Grundlage ausgewählter Datenbankeinträge +DVARP = DBVARIANZEN ## Berechnet die Varianz auf der Grundlage der Grundgesamtheit ausgewählter Datenbankeinträge + + +## +## Date and time functions Datums- und Zeitfunktionen +## +DATE = DATUM ## Gibt die fortlaufende Zahl eines bestimmten Datums zurück +DATEVALUE = DATWERT ## Wandelt ein Datum in Form von Text in eine fortlaufende Zahl um +DAY = TAG ## Wandelt eine fortlaufende Zahl in den Tag des Monats um +DAYS360 = TAGE360 ## Berechnet die Anzahl der Tage zwischen zwei Datumsangaben ausgehend von einem Jahr, das 360 Tage hat +EDATE = EDATUM ## Gibt die fortlaufende Zahl des Datums zurück, bei dem es sich um die angegebene Anzahl von Monaten vor oder nach dem Anfangstermin handelt +EOMONTH = MONATSENDE ## Gibt die fortlaufende Zahl des letzten Tags des Monats vor oder nach einer festgelegten Anzahl von Monaten zurück +HOUR = STUNDE ## Wandelt eine fortlaufende Zahl in eine Stunde um +MINUTE = MINUTE ## Wandelt eine fortlaufende Zahl in eine Minute um +MONTH = MONAT ## Wandelt eine fortlaufende Zahl in einen Monat um +NETWORKDAYS = NETTOARBEITSTAGE ## Gibt die Anzahl von ganzen Arbeitstagen zwischen zwei Datumswerten zurück +NOW = JETZT ## Gibt die fortlaufende Zahl des aktuellen Datums und der aktuellen Uhrzeit zurück +SECOND = SEKUNDE ## Wandelt eine fortlaufende Zahl in eine Sekunde um +TIME = ZEIT ## Gibt die fortlaufende Zahl einer bestimmten Uhrzeit zurück +TIMEVALUE = ZEITWERT ## Wandelt eine Uhrzeit in Form von Text in eine fortlaufende Zahl um +TODAY = HEUTE ## Gibt die fortlaufende Zahl des heutigen Datums zurück +WEEKDAY = WOCHENTAG ## Wandelt eine fortlaufende Zahl in den Wochentag um +WEEKNUM = KALENDERWOCHE ## Wandelt eine fortlaufende Zahl in eine Zahl um, die angibt, in welche Woche eines Jahres das angegebene Datum fällt +WORKDAY = ARBEITSTAG ## Gibt die fortlaufende Zahl des Datums vor oder nach einer bestimmten Anzahl von Arbeitstagen zurück +YEAR = JAHR ## Wandelt eine fortlaufende Zahl in ein Jahr um +YEARFRAC = BRTEILJAHRE ## Gibt die Anzahl der ganzen Tage zwischen Ausgangsdatum und Enddatum in Bruchteilen von Jahren zurück + + +## +## Engineering functions Konstruktionsfunktionen +## +BESSELI = BESSELI ## Gibt die geänderte Besselfunktion In(x) zurück +BESSELJ = BESSELJ ## Gibt die Besselfunktion Jn(x) zurück +BESSELK = BESSELK ## Gibt die geänderte Besselfunktion Kn(x) zurück +BESSELY = BESSELY ## Gibt die Besselfunktion Yn(x) zurück +BIN2DEC = BININDEZ ## Wandelt eine binäre Zahl (Dualzahl) in eine dezimale Zahl um +BIN2HEX = BININHEX ## Wandelt eine binäre Zahl (Dualzahl) in eine hexadezimale Zahl um +BIN2OCT = BININOKT ## Wandelt eine binäre Zahl (Dualzahl) in eine oktale Zahl um +COMPLEX = KOMPLEXE ## Wandelt den Real- und Imaginärteil in eine komplexe Zahl um +CONVERT = UMWANDELN ## Wandelt eine Zahl von einem Maßsystem in ein anderes um +DEC2BIN = DEZINBIN ## Wandelt eine dezimale Zahl in eine binäre Zahl (Dualzahl) um +DEC2HEX = DEZINHEX ## Wandelt eine dezimale Zahl in eine hexadezimale Zahl um +DEC2OCT = DEZINOKT ## Wandelt eine dezimale Zahl in eine oktale Zahl um +DELTA = DELTA ## Überprüft, ob zwei Werte gleich sind +ERF = GAUSSFEHLER ## Gibt die Gauss'sche Fehlerfunktion zurück +ERFC = GAUSSFKOMPL ## Gibt das Komplement zur Gauss'schen Fehlerfunktion zurück +GESTEP = GGANZZAHL ## Überprüft, ob eine Zahl größer als ein gegebener Schwellenwert ist +HEX2BIN = HEXINBIN ## Wandelt eine hexadezimale Zahl in eine Binärzahl um +HEX2DEC = HEXINDEZ ## Wandelt eine hexadezimale Zahl in eine dezimale Zahl um +HEX2OCT = HEXINOKT ## Wandelt eine hexadezimale Zahl in eine Oktalzahl um +IMABS = IMABS ## Gibt den Absolutbetrag (Modulo) einer komplexen Zahl zurück +IMAGINARY = IMAGINÄRTEIL ## Gibt den Imaginärteil einer komplexen Zahl zurück +IMARGUMENT = IMARGUMENT ## Gibt das Argument Theta zurück, einen Winkel, der als Bogenmaß ausgedrückt wird +IMCONJUGATE = IMKONJUGIERTE ## Gibt die konjugierte komplexe Zahl zu einer komplexen Zahl zurück +IMCOS = IMCOS ## Gibt den Kosinus einer komplexen Zahl zurück +IMDIV = IMDIV ## Gibt den Quotienten zweier komplexer Zahlen zurück +IMEXP = IMEXP ## Gibt die algebraische Form einer in exponentieller Schreibweise vorliegenden komplexen Zahl zurück +IMLN = IMLN ## Gibt den natürlichen Logarithmus einer komplexen Zahl zurück +IMLOG10 = IMLOG10 ## Gibt den Logarithmus einer komplexen Zahl zur Basis 10 zurück +IMLOG2 = IMLOG2 ## Gibt den Logarithmus einer komplexen Zahl zur Basis 2 zurück +IMPOWER = IMAPOTENZ ## Potenziert eine komplexe Zahl mit einer ganzen Zahl +IMPRODUCT = IMPRODUKT ## Gibt das Produkt von komplexen Zahlen zurück +IMREAL = IMREALTEIL ## Gibt den Realteil einer komplexen Zahl zurück +IMSIN = IMSIN ## Gibt den Sinus einer komplexen Zahl zurück +IMSQRT = IMWURZEL ## Gibt die Quadratwurzel einer komplexen Zahl zurück +IMSUB = IMSUB ## Gibt die Differenz zwischen zwei komplexen Zahlen zurück +IMSUM = IMSUMME ## Gibt die Summe von komplexen Zahlen zurück +OCT2BIN = OKTINBIN ## Wandelt eine oktale Zahl in eine binäre Zahl (Dualzahl) um +OCT2DEC = OKTINDEZ ## Wandelt eine oktale Zahl in eine dezimale Zahl um +OCT2HEX = OKTINHEX ## Wandelt eine oktale Zahl in eine hexadezimale Zahl um + + +## +## Financial functions Finanzmathematische Funktionen +## +ACCRINT = AUFGELZINS ## Gibt die aufgelaufenen Zinsen (Stückzinsen) eines Wertpapiers mit periodischen Zinszahlungen zurück +ACCRINTM = AUFGELZINSF ## Gibt die aufgelaufenen Zinsen (Stückzinsen) eines Wertpapiers zurück, die bei Fälligkeit ausgezahlt werden +AMORDEGRC = AMORDEGRK ## Gibt die Abschreibung für die einzelnen Abschreibungszeiträume mithilfe eines Abschreibungskoeffizienten zurück +AMORLINC = AMORLINEARK ## Gibt die Abschreibung für die einzelnen Abschreibungszeiträume zurück +COUPDAYBS = ZINSTERMTAGVA ## Gibt die Anzahl der Tage vom Anfang des Zinstermins bis zum Abrechnungstermin zurück +COUPDAYS = ZINSTERMTAGE ## Gibt die Anzahl der Tage der Zinsperiode zurück, die den Abrechnungstermin einschließt +COUPDAYSNC = ZINSTERMTAGNZ ## Gibt die Anzahl der Tage vom Abrechnungstermin bis zum nächsten Zinstermin zurück +COUPNCD = ZINSTERMNZ ## Gibt das Datum des ersten Zinstermins nach dem Abrechnungstermin zurück +COUPNUM = ZINSTERMZAHL ## Gibt die Anzahl der Zinstermine zwischen Abrechnungs- und Fälligkeitsdatum zurück +COUPPCD = ZINSTERMVZ ## Gibt das Datum des letzten Zinstermins vor dem Abrechnungstermin zurück +CUMIPMT = KUMZINSZ ## Berechnet die kumulierten Zinsen, die zwischen zwei Perioden zu zahlen sind +CUMPRINC = KUMKAPITAL ## Berechnet die aufgelaufene Tilgung eines Darlehens, die zwischen zwei Perioden zu zahlen ist +DB = GDA2 ## Gibt die geometrisch-degressive Abschreibung eines Wirtschaftsguts für eine bestimmte Periode zurück +DDB = GDA ## Gibt die Abschreibung eines Anlageguts für einen angegebenen Zeitraum unter Verwendung der degressiven Doppelraten-Abschreibung oder eines anderen von Ihnen angegebenen Abschreibungsverfahrens zurück +DISC = DISAGIO ## Gibt den in Prozent ausgedrückten Abzinsungssatz eines Wertpapiers zurück +DOLLARDE = NOTIERUNGDEZ ## Wandelt eine Notierung, die als Dezimalbruch ausgedrückt wurde, in eine Dezimalzahl um +DOLLARFR = NOTIERUNGBRU ## Wandelt eine Notierung, die als Dezimalzahl ausgedrückt wurde, in einen Dezimalbruch um +DURATION = DURATION ## Gibt die jährliche Duration eines Wertpapiers mit periodischen Zinszahlungen zurück +EFFECT = EFFEKTIV ## Gibt die jährliche Effektivverzinsung zurück +FV = ZW ## Gibt den zukünftigen Wert (Endwert) einer Investition zurück +FVSCHEDULE = ZW2 ## Gibt den aufgezinsten Wert des Anfangskapitals für eine Reihe periodisch unterschiedlicher Zinssätze zurück +INTRATE = ZINSSATZ ## Gibt den Zinssatz eines voll investierten Wertpapiers zurück +IPMT = ZINSZ ## Gibt die Zinszahlung einer Investition für die angegebene Periode zurück +IRR = IKV ## Gibt den internen Zinsfuß einer Investition ohne Finanzierungskosten oder Reinvestitionsgewinne zurück +ISPMT = ISPMT ## Berechnet die während eines bestimmten Zeitraums für eine Investition gezahlten Zinsen +MDURATION = MDURATION ## Gibt die geänderte Dauer für ein Wertpapier mit einem angenommenen Nennwert von 100 € zurück +MIRR = QIKV ## Gibt den internen Zinsfuß zurück, wobei positive und negative Zahlungen zu unterschiedlichen Sätzen finanziert werden +NOMINAL = NOMINAL ## Gibt die jährliche Nominalverzinsung zurück +NPER = ZZR ## Gibt die Anzahl der Zahlungsperioden einer Investition zurück +NPV = NBW ## Gibt den Nettobarwert einer Investition auf Basis periodisch anfallender Zahlungen und eines Abzinsungsfaktors zurück +ODDFPRICE = UNREGER.KURS ## Gibt den Kurs pro 100 € Nennwert eines Wertpapiers mit einem unregelmäßigen ersten Zinstermin zurück +ODDFYIELD = UNREGER.REND ## Gibt die Rendite eines Wertpapiers mit einem unregelmäßigen ersten Zinstermin zurück +ODDLPRICE = UNREGLE.KURS ## Gibt den Kurs pro 100 € Nennwert eines Wertpapiers mit einem unregelmäßigen letzten Zinstermin zurück +ODDLYIELD = UNREGLE.REND ## Gibt die Rendite eines Wertpapiers mit einem unregelmäßigen letzten Zinstermin zurück +PMT = RMZ ## Gibt die periodische Zahlung für eine Annuität zurück +PPMT = KAPZ ## Gibt die Kapitalrückzahlung einer Investition für eine angegebene Periode zurück +PRICE = KURS ## Gibt den Kurs pro 100 € Nennwert eines Wertpapiers zurück, das periodisch Zinsen auszahlt +PRICEDISC = KURSDISAGIO ## Gibt den Kurs pro 100 € Nennwert eines unverzinslichen Wertpapiers zurück +PRICEMAT = KURSFÄLLIG ## Gibt den Kurs pro 100 € Nennwert eines Wertpapiers zurück, das Zinsen am Fälligkeitsdatum auszahlt +PV = BW ## Gibt den Barwert einer Investition zurück +RATE = ZINS ## Gibt den Zinssatz pro Zeitraum einer Annuität zurück +RECEIVED = AUSZAHLUNG ## Gibt den Auszahlungsbetrag eines voll investierten Wertpapiers am Fälligkeitstermin zurück +SLN = LIA ## Gibt die lineare Abschreibung eines Wirtschaftsguts pro Periode zurück +SYD = DIA ## Gibt die arithmetisch-degressive Abschreibung eines Wirtschaftsguts für eine bestimmte Periode zurück +TBILLEQ = TBILLÄQUIV ## Gibt die Rendite für ein Wertpapier zurück +TBILLPRICE = TBILLKURS ## Gibt den Kurs pro 100 € Nennwert eines Wertpapiers zurück +TBILLYIELD = TBILLRENDITE ## Gibt die Rendite für ein Wertpapier zurück +VDB = VDB ## Gibt die degressive Abschreibung eines Wirtschaftsguts für eine bestimmte Periode oder Teilperiode zurück +XIRR = XINTZINSFUSS ## Gibt den internen Zinsfuß einer Reihe nicht periodisch anfallender Zahlungen zurück +XNPV = XKAPITALWERT ## Gibt den Nettobarwert (Kapitalwert) einer Reihe nicht periodisch anfallender Zahlungen zurück +YIELD = RENDITE ## Gibt die Rendite eines Wertpapiers zurück, das periodisch Zinsen auszahlt +YIELDDISC = RENDITEDIS ## Gibt die jährliche Rendite eines unverzinslichen Wertpapiers zurück +YIELDMAT = RENDITEFÄLL ## Gibt die jährliche Rendite eines Wertpapiers zurück, das Zinsen am Fälligkeitsdatum auszahlt + + +## +## Information functions Informationsfunktionen +## +CELL = ZELLE ## Gibt Informationen zu Formatierung, Position oder Inhalt einer Zelle zurück +ERROR.TYPE = FEHLER.TYP ## Gibt eine Zahl zurück, die einem Fehlertyp entspricht +INFO = INFO ## Gibt Informationen zur aktuellen Betriebssystemumgebung zurück +ISBLANK = ISTLEER ## Gibt WAHR zurück, wenn der Wert leer ist +ISERR = ISTFEHL ## Gibt WAHR zurück, wenn der Wert ein beliebiger Fehlerwert außer #N/V ist +ISERROR = ISTFEHLER ## Gibt WAHR zurück, wenn der Wert ein beliebiger Fehlerwert ist +ISEVEN = ISTGERADE ## Gibt WAHR zurück, wenn es sich um eine gerade Zahl handelt +ISLOGICAL = ISTLOG ## Gibt WAHR zurück, wenn der Wert ein Wahrheitswert ist +ISNA = ISTNV ## Gibt WAHR zurück, wenn der Wert der Fehlerwert #N/V ist +ISNONTEXT = ISTKTEXT ## Gibt WAHR zurück, wenn der Wert ein Element ist, das keinen Text enthält +ISNUMBER = ISTZAHL ## Gibt WAHR zurück, wenn der Wert eine Zahl ist +ISODD = ISTUNGERADE ## Gibt WAHR zurück, wenn es sich um eine ungerade Zahl handelt +ISREF = ISTBEZUG ## Gibt WAHR zurück, wenn der Wert ein Bezug ist +ISTEXT = ISTTEXT ## Gibt WAHR zurück, wenn der Wert ein Element ist, das Text enthält +N = N ## Gibt den in eine Zahl umgewandelten Wert zurück +NA = NV ## Gibt den Fehlerwert #NV zurück +TYPE = TYP ## Gibt eine Zahl zurück, die den Datentyp des angegebenen Werts anzeigt + + +## +## Logical functions Logische Funktionen +## +AND = UND ## Gibt WAHR zurück, wenn alle zugehörigen Argumente WAHR sind +FALSE = FALSCH ## Gibt den Wahrheitswert FALSCH zurück +IF = WENN ## Gibt einen logischen Test zum Ausführen an +IFERROR = WENNFEHLER ## Gibt einen von Ihnen festgelegten Wert zurück, wenn die Auswertung der Formel zu einem Fehler führt; andernfalls wird das Ergebnis der Formel zurückgegeben +NOT = NICHT ## Kehrt den Wahrheitswert der zugehörigen Argumente um +OR = ODER ## Gibt WAHR zurück, wenn ein Argument WAHR ist +TRUE = WAHR ## Gibt den Wahrheitswert WAHR zurück + + +## +## Lookup and reference functions Nachschlage- und Verweisfunktionen +## +ADDRESS = ADRESSE ## Gibt einen Bezug auf eine einzelne Zelle in einem Tabellenblatt als Text zurück +AREAS = BEREICHE ## Gibt die Anzahl der innerhalb eines Bezugs aufgeführten Bereiche zurück +CHOOSE = WAHL ## Wählt einen Wert aus eine Liste mit Werten aus +COLUMN = SPALTE ## Gibt die Spaltennummer eines Bezugs zurück +COLUMNS = SPALTEN ## Gibt die Anzahl der Spalten in einem Bezug zurück +HLOOKUP = HVERWEIS ## Sucht in der obersten Zeile einer Matrix und gibt den Wert der angegebenen Zelle zurück +HYPERLINK = HYPERLINK ## Erstellt eine Verknüpfung, über die ein auf einem Netzwerkserver, in einem Intranet oder im Internet gespeichertes Dokument geöffnet wird +INDEX = INDEX ## Verwendet einen Index, um einen Wert aus einem Bezug oder einer Matrix auszuwählen +INDIRECT = INDIREKT ## Gibt einen Bezug zurück, der von einem Textwert angegeben wird +LOOKUP = LOOKUP ## Sucht Werte in einem Vektor oder einer Matrix +MATCH = VERGLEICH ## Sucht Werte in einem Bezug oder einer Matrix +OFFSET = BEREICH.VERSCHIEBEN ## Gibt einen Bezugoffset aus einem gegebenen Bezug zurück +ROW = ZEILE ## Gibt die Zeilennummer eines Bezugs zurück +ROWS = ZEILEN ## Gibt die Anzahl der Zeilen in einem Bezug zurück +RTD = RTD ## Ruft Echtzeitdaten von einem Programm ab, das die COM-Automatisierung (Automatisierung: Ein Verfahren, bei dem aus einer Anwendung oder einem Entwicklungstool heraus mit den Objekten einer anderen Anwendung gearbeitet wird. Die früher als OLE-Automatisierung bezeichnete Automatisierung ist ein Industriestandard und eine Funktion von COM (Component Object Model).) unterstützt +TRANSPOSE = MTRANS ## Gibt die transponierte Matrix einer Matrix zurück +VLOOKUP = SVERWEIS ## Sucht in der ersten Spalte einer Matrix und arbeitet sich durch die Zeile, um den Wert einer Zelle zurückzugeben + + +## +## Math and trigonometry functions Mathematische und trigonometrische Funktionen +## +ABS = ABS ## Gibt den Absolutwert einer Zahl zurück +ACOS = ARCCOS ## Gibt den Arkuskosinus einer Zahl zurück +ACOSH = ARCCOSHYP ## Gibt den umgekehrten hyperbolischen Kosinus einer Zahl zurück +ASIN = ARCSIN ## Gibt den Arkussinus einer Zahl zurück +ASINH = ARCSINHYP ## Gibt den umgekehrten hyperbolischen Sinus einer Zahl zurück +ATAN = ARCTAN ## Gibt den Arkustangens einer Zahl zurück +ATAN2 = ARCTAN2 ## Gibt den Arkustangens einer x- und einer y-Koordinate zurück +ATANH = ARCTANHYP ## Gibt den umgekehrten hyperbolischen Tangens einer Zahl zurück +CEILING = OBERGRENZE ## Rundet eine Zahl auf die nächste ganze Zahl oder das nächste Vielfache von Schritt +COMBIN = KOMBINATIONEN ## Gibt die Anzahl der Kombinationen für eine bestimmte Anzahl von Objekten zurück +COS = COS ## Gibt den Kosinus einer Zahl zurück +COSH = COSHYP ## Gibt den hyperbolischen Kosinus einer Zahl zurück +DEGREES = GRAD ## Wandelt Bogenmaß (Radiant) in Grad um +EVEN = GERADE ## Rundet eine Zahl auf die nächste gerade ganze Zahl auf +EXP = EXP ## Potenziert die Basis e mit der als Argument angegebenen Zahl +FACT = FAKULTÄT ## Gibt die Fakultät einer Zahl zurück +FACTDOUBLE = ZWEIFAKULTÄT ## Gibt die Fakultät zu Zahl mit Schrittlänge 2 zurück +FLOOR = UNTERGRENZE ## Rundet die Zahl auf Anzahl_Stellen ab +GCD = GGT ## Gibt den größten gemeinsamen Teiler zurück +INT = GANZZAHL ## Rundet eine Zahl auf die nächstkleinere ganze Zahl ab +LCM = KGV ## Gibt das kleinste gemeinsame Vielfache zurück +LN = LN ## Gibt den natürlichen Logarithmus einer Zahl zurück +LOG = LOG ## Gibt den Logarithmus einer Zahl zu der angegebenen Basis zurück +LOG10 = LOG10 ## Gibt den Logarithmus einer Zahl zur Basis 10 zurück +MDETERM = MDET ## Gibt die Determinante einer Matrix zurück +MINVERSE = MINV ## Gibt die inverse Matrix einer Matrix zurück +MMULT = MMULT ## Gibt das Produkt zweier Matrizen zurück +MOD = REST ## Gibt den Rest einer Division zurück +MROUND = VRUNDEN ## Gibt eine auf das gewünschte Vielfache gerundete Zahl zurück +MULTINOMIAL = POLYNOMIAL ## Gibt den Polynomialkoeffizienten einer Gruppe von Zahlen zurück +ODD = UNGERADE ## Rundet eine Zahl auf die nächste ungerade ganze Zahl auf +PI = PI ## Gibt den Wert Pi zurück +POWER = POTENZ ## Gibt als Ergebnis eine potenzierte Zahl zurück +PRODUCT = PRODUKT ## Multipliziert die zugehörigen Argumente +QUOTIENT = QUOTIENT ## Gibt den ganzzahligen Anteil einer Division zurück +RADIANS = BOGENMASS ## Wandelt Grad in Bogenmaß (Radiant) um +RAND = ZUFALLSZAHL ## Gibt eine Zufallszahl zwischen 0 und 1 zurück +RANDBETWEEN = ZUFALLSBEREICH ## Gibt eine Zufallszahl aus dem festgelegten Bereich zurück +ROMAN = RÖMISCH ## Wandelt eine arabische Zahl in eine römische Zahl als Text um +ROUND = RUNDEN ## Rundet eine Zahl auf eine bestimmte Anzahl von Dezimalstellen +ROUNDDOWN = ABRUNDEN ## Rundet die Zahl auf Anzahl_Stellen ab +ROUNDUP = AUFRUNDEN ## Rundet die Zahl auf Anzahl_Stellen auf +SERIESSUM = POTENZREIHE ## Gibt die Summe von Potenzen (zur Berechnung von Potenzreihen und dichotomen Wahrscheinlichkeiten) zurück +SIGN = VORZEICHEN ## Gibt das Vorzeichen einer Zahl zurück +SIN = SIN ## Gibt den Sinus einer Zahl zurück +SINH = SINHYP ## Gibt den hyperbolischen Sinus einer Zahl zurück +SQRT = WURZEL ## Gibt die Quadratwurzel einer Zahl zurück +SQRTPI = WURZELPI ## Gibt die Wurzel aus der mit Pi (pi) multiplizierten Zahl zurück +SUBTOTAL = TEILERGEBNIS ## Gibt ein Teilergebnis in einer Liste oder Datenbank zurück +SUM = SUMME ## Addiert die zugehörigen Argumente +SUMIF = SUMMEWENN ## Addiert Zahlen, die mit den Suchkriterien übereinstimmen +SUMIFS = SUMMEWENNS ## Die Zellen, die mehrere Kriterien erfüllen, werden in einem Bereich hinzugefügt +SUMPRODUCT = SUMMENPRODUKT ## Gibt die Summe der Produkte zusammengehöriger Matrixkomponenten zurück +SUMSQ = QUADRATESUMME ## Gibt die Summe der quadrierten Argumente zurück +SUMX2MY2 = SUMMEX2MY2 ## Gibt die Summe der Differenzen der Quadrate für zusammengehörige Komponenten zweier Matrizen zurück +SUMX2PY2 = SUMMEX2PY2 ## Gibt die Summe der Quadrate für zusammengehörige Komponenten zweier Matrizen zurück +SUMXMY2 = SUMMEXMY2 ## Gibt die Summe der quadrierten Differenzen für zusammengehörige Komponenten zweier Matrizen zurück +TAN = TAN ## Gibt den Tangens einer Zahl zurück +TANH = TANHYP ## Gibt den hyperbolischen Tangens einer Zahl zurück +TRUNC = KÜRZEN ## Schneidet die Kommastellen einer Zahl ab und gibt als Ergebnis eine ganze Zahl zurück + + +## +## Statistical functions Statistische Funktionen +## +AVEDEV = MITTELABW ## Gibt die durchschnittliche absolute Abweichung einer Reihe von Merkmalsausprägungen und ihrem Mittelwert zurück +AVERAGE = MITTELWERT ## Gibt den Mittelwert der zugehörigen Argumente zurück +AVERAGEA = MITTELWERTA ## Gibt den Mittelwert der zugehörigen Argumente, die Zahlen, Text und Wahrheitswerte enthalten, zurück +AVERAGEIF = MITTELWERTWENN ## Der Durchschnittswert (arithmetisches Mittel) für alle Zellen in einem Bereich, die einem angegebenen Kriterium entsprechen, wird zurückgegeben +AVERAGEIFS = MITTELWERTWENNS ## Gibt den Durchschnittswert (arithmetisches Mittel) aller Zellen zurück, die mehreren Kriterien entsprechen +BETADIST = BETAVERT ## Gibt die Werte der kumulierten Betaverteilungsfunktion zurück +BETAINV = BETAINV ## Gibt das Quantil der angegebenen Betaverteilung zurück +BINOMDIST = BINOMVERT ## Gibt Wahrscheinlichkeiten einer binomialverteilten Zufallsvariablen zurück +CHIDIST = CHIVERT ## Gibt Werte der Verteilungsfunktion (1-Alpha) einer Chi-Quadrat-verteilten Zufallsgröße zurück +CHIINV = CHIINV ## Gibt Quantile der Verteilungsfunktion (1-Alpha) der Chi-Quadrat-Verteilung zurück +CHITEST = CHITEST ## Gibt die Teststatistik eines Unabhängigkeitstests zurück +CONFIDENCE = KONFIDENZ ## Ermöglicht die Berechnung des 1-Alpha Konfidenzintervalls für den Erwartungswert einer Zufallsvariablen +CORREL = KORREL ## Gibt den Korrelationskoeffizienten zweier Reihen von Merkmalsausprägungen zurück +COUNT = ANZAHL ## Gibt die Anzahl der Zahlen in der Liste mit Argumenten an +COUNTA = ANZAHL2 ## Gibt die Anzahl der Werte in der Liste mit Argumenten an +COUNTBLANK = ANZAHLLEEREZELLEN ## Gibt die Anzahl der leeren Zellen in einem Bereich an +COUNTIF = ZÄHLENWENN ## Gibt die Anzahl der Zellen in einem Bereich an, deren Inhalte mit den Suchkriterien übereinstimmen +COUNTIFS = ZÄHLENWENNS ## Gibt die Anzahl der Zellen in einem Bereich an, deren Inhalte mit mehreren Suchkriterien übereinstimmen +COVAR = KOVAR ## Gibt die Kovarianz zurück, den Mittelwert der für alle Datenpunktpaare gebildeten Produkte der Abweichungen +CRITBINOM = KRITBINOM ## Gibt den kleinsten Wert zurück, für den die kumulierten Wahrscheinlichkeiten der Binomialverteilung kleiner oder gleich einer Grenzwahrscheinlichkeit sind +DEVSQ = SUMQUADABW ## Gibt die Summe der quadrierten Abweichungen der Datenpunkte von ihrem Stichprobenmittelwert zurück +EXPONDIST = EXPONVERT ## Gibt Wahrscheinlichkeiten einer exponential verteilten Zufallsvariablen zurück +FDIST = FVERT ## Gibt Werte der Verteilungsfunktion (1-Alpha) einer F-verteilten Zufallsvariablen zurück +FINV = FINV ## Gibt Quantile der F-Verteilung zurück +FISHER = FISHER ## Gibt die Fisher-Transformation zurück +FISHERINV = FISHERINV ## Gibt die Umkehrung der Fisher-Transformation zurück +FORECAST = PROGNOSE ## Gibt einen Wert zurück, der sich aus einem linearen Trend ergibt +FREQUENCY = HÄUFIGKEIT ## Gibt eine Häufigkeitsverteilung als vertikale Matrix zurück +FTEST = FTEST ## Gibt die Teststatistik eines F-Tests zurück +GAMMADIST = GAMMAVERT ## Gibt Wahrscheinlichkeiten einer gammaverteilten Zufallsvariablen zurück +GAMMAINV = GAMMAINV ## Gibt Quantile der Gammaverteilung zurück +GAMMALN = GAMMALN ## Gibt den natürlichen Logarithmus der Gammafunktion zurück, Γ(x) +GEOMEAN = GEOMITTEL ## Gibt das geometrische Mittel zurück +GROWTH = VARIATION ## Gibt Werte zurück, die sich aus einem exponentiellen Trend ergeben +HARMEAN = HARMITTEL ## Gibt das harmonische Mittel zurück +HYPGEOMDIST = HYPGEOMVERT ## Gibt Wahrscheinlichkeiten einer hypergeometrisch-verteilten Zufallsvariablen zurück +INTERCEPT = ACHSENABSCHNITT ## Gibt den Schnittpunkt der Regressionsgeraden zurück +KURT = KURT ## Gibt die Kurtosis (Exzess) einer Datengruppe zurück +LARGE = KGRÖSSTE ## Gibt den k-größten Wert einer Datengruppe zurück +LINEST = RGP ## Gibt die Parameter eines linearen Trends zurück +LOGEST = RKP ## Gibt die Parameter eines exponentiellen Trends zurück +LOGINV = LOGINV ## Gibt Quantile der Lognormalverteilung zurück +LOGNORMDIST = LOGNORMVERT ## Gibt Werte der Verteilungsfunktion einer lognormalverteilten Zufallsvariablen zurück +MAX = MAX ## Gibt den Maximalwert einer Liste mit Argumenten zurück +MAXA = MAXA ## Gibt den Maximalwert einer Liste mit Argumenten zurück, die Zahlen, Text und Wahrheitswerte enthalten +MEDIAN = MEDIAN ## Gibt den Median der angegebenen Zahlen zurück +MIN = MIN ## Gibt den Minimalwert einer Liste mit Argumenten zurück +MINA = MINA ## Gibt den kleinsten Wert einer Liste mit Argumenten zurück, die Zahlen, Text und Wahrheitswerte enthalten +MODE = MODALWERT ## Gibt den am häufigsten vorkommenden Wert in einer Datengruppe zurück +NEGBINOMDIST = NEGBINOMVERT ## Gibt Wahrscheinlichkeiten einer negativen, binominal verteilten Zufallsvariablen zurück +NORMDIST = NORMVERT ## Gibt Wahrscheinlichkeiten einer normal verteilten Zufallsvariablen zurück +NORMINV = NORMINV ## Gibt Quantile der Normalverteilung zurück +NORMSDIST = STANDNORMVERT ## Gibt Werte der Verteilungsfunktion einer standardnormalverteilten Zufallsvariablen zurück +NORMSINV = STANDNORMINV ## Gibt Quantile der Standardnormalverteilung zurück +PEARSON = PEARSON ## Gibt den Pearsonschen Korrelationskoeffizienten zurück +PERCENTILE = QUANTIL ## Gibt das Alpha-Quantil einer Gruppe von Daten zurück +PERCENTRANK = QUANTILSRANG ## Gibt den prozentualen Rang (Alpha) eines Werts in einer Datengruppe zurück +PERMUT = VARIATIONEN ## Gibt die Anzahl der Möglichkeiten zurück, um k Elemente aus einer Menge von n Elementen ohne Zurücklegen zu ziehen +POISSON = POISSON ## Gibt Wahrscheinlichkeiten einer poissonverteilten Zufallsvariablen zurück +PROB = WAHRSCHBEREICH ## Gibt die Wahrscheinlichkeit für ein von zwei Werten eingeschlossenes Intervall zurück +QUARTILE = QUARTILE ## Gibt die Quartile der Datengruppe zurück +RANK = RANG ## Gibt den Rang zurück, den eine Zahl innerhalb einer Liste von Zahlen einnimmt +RSQ = BESTIMMTHEITSMASS ## Gibt das Quadrat des Pearsonschen Korrelationskoeffizienten zurück +SKEW = SCHIEFE ## Gibt die Schiefe einer Verteilung zurück +SLOPE = STEIGUNG ## Gibt die Steigung der Regressionsgeraden zurück +SMALL = KKLEINSTE ## Gibt den k-kleinsten Wert einer Datengruppe zurück +STANDARDIZE = STANDARDISIERUNG ## Gibt den standardisierten Wert zurück +STDEV = STABW ## Schätzt die Standardabweichung ausgehend von einer Stichprobe +STDEVA = STABWA ## Schätzt die Standardabweichung ausgehend von einer Stichprobe, die Zahlen, Text und Wahrheitswerte enthält +STDEVP = STABWN ## Berechnet die Standardabweichung ausgehend von der Grundgesamtheit +STDEVPA = STABWNA ## Berechnet die Standardabweichung ausgehend von der Grundgesamtheit, die Zahlen, Text und Wahrheitswerte enthält +STEYX = STFEHLERYX ## Gibt den Standardfehler der geschätzten y-Werte für alle x-Werte der Regression zurück +TDIST = TVERT ## Gibt Werte der Verteilungsfunktion (1-Alpha) einer (Student) t-verteilten Zufallsvariablen zurück +TINV = TINV ## Gibt Quantile der t-Verteilung zurück +TREND = TREND ## Gibt Werte zurück, die sich aus einem linearen Trend ergeben +TRIMMEAN = GESTUTZTMITTEL ## Gibt den Mittelwert einer Datengruppe zurück, ohne die Randwerte zu berücksichtigen +TTEST = TTEST ## Gibt die Teststatistik eines Student'schen t-Tests zurück +VAR = VARIANZ ## Schätzt die Varianz ausgehend von einer Stichprobe +VARA = VARIANZA ## Schätzt die Varianz ausgehend von einer Stichprobe, die Zahlen, Text und Wahrheitswerte enthält +VARP = VARIANZEN ## Berechnet die Varianz ausgehend von der Grundgesamtheit +VARPA = VARIANZENA ## Berechnet die Varianz ausgehend von der Grundgesamtheit, die Zahlen, Text und Wahrheitswerte enthält +WEIBULL = WEIBULL ## Gibt Wahrscheinlichkeiten einer weibullverteilten Zufallsvariablen zurück +ZTEST = GTEST ## Gibt den einseitigen Wahrscheinlichkeitswert für einen Gausstest (Normalverteilung) zurück + + +## +## Text functions Textfunktionen +## +ASC = ASC ## Konvertiert DB-Text in einer Zeichenfolge (lateinische Buchstaben oder Katakana) in SB-Text +BAHTTEXT = BAHTTEXT ## Wandelt eine Zahl in Text im Währungsformat ß (Baht) um +CHAR = ZEICHEN ## Gibt das der Codezahl entsprechende Zeichen zurück +CLEAN = SÄUBERN ## Löscht alle nicht druckbaren Zeichen aus einem Text +CODE = CODE ## Gibt die Codezahl des ersten Zeichens in einem Text zurück +CONCATENATE = VERKETTEN ## Verknüpft mehrere Textelemente zu einem Textelement +DOLLAR = DM ## Wandelt eine Zahl in Text im Währungsformat € (Euro) um +EXACT = IDENTISCH ## Prüft, ob zwei Textwerte identisch sind +FIND = FINDEN ## Sucht nach einem Textwert, der in einem anderen Textwert enthalten ist (Groß-/Kleinschreibung wird unterschieden) +FINDB = FINDENB ## Sucht nach einem Textwert, der in einem anderen Textwert enthalten ist (Groß-/Kleinschreibung wird unterschieden) +FIXED = FEST ## Formatiert eine Zahl als Text mit einer festen Anzahl von Dezimalstellen +JIS = JIS ## Konvertiert SB-Text in einer Zeichenfolge (lateinische Buchstaben oder Katakana) in DB-Text +LEFT = LINKS ## Gibt die Zeichen ganz links in einem Textwert zurück +LEFTB = LINKSB ## Gibt die Zeichen ganz links in einem Textwert zurück +LEN = LÄNGE ## Gibt die Anzahl der Zeichen in einer Zeichenfolge zurück +LENB = LÄNGEB ## Gibt die Anzahl der Zeichen in einer Zeichenfolge zurück +LOWER = KLEIN ## Wandelt Text in Kleinbuchstaben um +MID = TEIL ## Gibt eine bestimmte Anzahl Zeichen aus einer Zeichenfolge ab der von Ihnen angegebenen Stelle zurück +MIDB = TEILB ## Gibt eine bestimmte Anzahl Zeichen aus einer Zeichenfolge ab der von Ihnen angegebenen Stelle zurück +PHONETIC = PHONETIC ## Extrahiert die phonetischen (Furigana-)Zeichen aus einer Textzeichenfolge +PROPER = GROSS2 ## Wandelt den ersten Buchstaben aller Wörter eines Textwerts in Großbuchstaben um +REPLACE = ERSETZEN ## Ersetzt Zeichen in Text +REPLACEB = ERSETZENB ## Ersetzt Zeichen in Text +REPT = WIEDERHOLEN ## Wiederholt einen Text so oft wie angegeben +RIGHT = RECHTS ## Gibt die Zeichen ganz rechts in einem Textwert zurück +RIGHTB = RECHTSB ## Gibt die Zeichen ganz rechts in einem Textwert zurück +SEARCH = SUCHEN ## Sucht nach einem Textwert, der in einem anderen Textwert enthalten ist (Groß-/Kleinschreibung wird nicht unterschieden) +SEARCHB = SUCHENB ## Sucht nach einem Textwert, der in einem anderen Textwert enthalten ist (Groß-/Kleinschreibung wird nicht unterschieden) +SUBSTITUTE = WECHSELN ## Ersetzt in einer Zeichenfolge neuen Text gegen alten +T = T ## Wandelt die zugehörigen Argumente in Text um +TEXT = TEXT ## Formatiert eine Zahl und wandelt sie in Text um +TRIM = GLÄTTEN ## Entfernt Leerzeichen aus Text +UPPER = GROSS ## Wandelt Text in Großbuchstaben um +VALUE = WERT ## Wandelt ein Textargument in eine Zahl um diff --git a/application/third_party/PHPExcel/PHPExcel/locale/en/uk/config b/application/third_party/PHPExcel/PHPExcel/locale/en/uk/config new file mode 100644 index 0000000..532080b --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/en/uk/config @@ -0,0 +1,32 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## + + +## +## (For future use) +## +currencySymbol = £ diff --git a/application/third_party/PHPExcel/PHPExcel/locale/es/config b/application/third_party/PHPExcel/PHPExcel/locale/es/config new file mode 100644 index 0000000..96cfa69 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/es/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = $ ## I'm surprised that the Excel Documentation suggests $ rather than € + + +## +## Excel Error Codes (For future use) +## +NULL = #¡NULO! +DIV0 = #¡DIV/0! +VALUE = #¡VALOR! +REF = #¡REF! +NAME = #¿NOMBRE? +NUM = #¡NÚM! +NA = #N/A diff --git a/application/third_party/PHPExcel/PHPExcel/locale/es/functions b/application/third_party/PHPExcel/PHPExcel/locale/es/functions new file mode 100644 index 0000000..4876269 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/es/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Funciones de complementos y automatización +## +GETPIVOTDATA = IMPORTARDATOSDINAMICOS ## Devuelve los datos almacenados en un informe de tabla dinámica. + + +## +## Cube functions Funciones de cubo +## +CUBEKPIMEMBER = MIEMBROKPICUBO ## Devuelve un nombre, propiedad y medida de indicador de rendimiento clave (KPI) y muestra el nombre y la propiedad en la celda. Un KPI es una medida cuantificable, como los beneficios brutos mensuales o la facturación trimestral por empleado, que se usa para supervisar el rendimiento de una organización. +CUBEMEMBER = MIEMBROCUBO ## Devuelve un miembro o tupla en una jerarquía de cubo. Se usa para validar la existencia del miembro o la tupla en el cubo. +CUBEMEMBERPROPERTY = PROPIEDADMIEMBROCUBO ## Devuelve el valor de una propiedad de miembro del cubo Se usa para validar la existencia de un nombre de miembro en el cubo y para devolver la propiedad especificada para este miembro. +CUBERANKEDMEMBER = MIEMBRORANGOCUBO ## Devuelve el miembro n, o clasificado, de un conjunto. Se usa para devolver uno o más elementos de un conjunto, por ejemplo, el representante con mejores ventas o los diez mejores alumnos. +CUBESET = CONJUNTOCUBO ## Define un conjunto calculado de miembros o tuplas mediante el envío de una expresión de conjunto al cubo en el servidor, lo que crea el conjunto y, después, devuelve dicho conjunto a Microsoft Office Excel. +CUBESETCOUNT = RECUENTOCONJUNTOCUBO ## Devuelve el número de elementos de un conjunto. +CUBEVALUE = VALORCUBO ## Devuelve un valor agregado de un cubo. + + +## +## Database functions Funciones de base de datos +## +DAVERAGE = BDPROMEDIO ## Devuelve el promedio de las entradas seleccionadas en la base de datos. +DCOUNT = BDCONTAR ## Cuenta el número de celdas que contienen números en una base de datos. +DCOUNTA = BDCONTARA ## Cuenta el número de celdas no vacías en una base de datos. +DGET = BDEXTRAER ## Extrae de una base de datos un único registro que cumple los criterios especificados. +DMAX = BDMAX ## Devuelve el valor máximo de las entradas seleccionadas de la base de datos. +DMIN = BDMIN ## Devuelve el valor mínimo de las entradas seleccionadas de la base de datos. +DPRODUCT = BDPRODUCTO ## Multiplica los valores de un campo concreto de registros de una base de datos que cumplen los criterios especificados. +DSTDEV = BDDESVEST ## Calcula la desviación estándar a partir de una muestra de entradas seleccionadas en la base de datos. +DSTDEVP = BDDESVESTP ## Calcula la desviación estándar en función de la población total de las entradas seleccionadas de la base de datos. +DSUM = BDSUMA ## Suma los números de la columna de campo de los registros de la base de datos que cumplen los criterios. +DVAR = BDVAR ## Calcula la varianza a partir de una muestra de entradas seleccionadas de la base de datos. +DVARP = BDVARP ## Calcula la varianza a partir de la población total de entradas seleccionadas de la base de datos. + + +## +## Date and time functions Funciones de fecha y hora +## +DATE = FECHA ## Devuelve el número de serie correspondiente a una fecha determinada. +DATEVALUE = FECHANUMERO ## Convierte una fecha con formato de texto en un valor de número de serie. +DAY = DIA ## Convierte un número de serie en un valor de día del mes. +DAYS360 = DIAS360 ## Calcula el número de días entre dos fechas a partir de un año de 360 días. +EDATE = FECHA.MES ## Devuelve el número de serie de la fecha equivalente al número indicado de meses anteriores o posteriores a la fecha inicial. +EOMONTH = FIN.MES ## Devuelve el número de serie correspondiente al último día del mes anterior o posterior a un número de meses especificado. +HOUR = HORA ## Convierte un número de serie en un valor de hora. +MINUTE = MINUTO ## Convierte un número de serie en un valor de minuto. +MONTH = MES ## Convierte un número de serie en un valor de mes. +NETWORKDAYS = DIAS.LAB ## Devuelve el número de todos los días laborables existentes entre dos fechas. +NOW = AHORA ## Devuelve el número de serie correspondiente a la fecha y hora actuales. +SECOND = SEGUNDO ## Convierte un número de serie en un valor de segundo. +TIME = HORA ## Devuelve el número de serie correspondiente a una hora determinada. +TIMEVALUE = HORANUMERO ## Convierte una hora con formato de texto en un valor de número de serie. +TODAY = HOY ## Devuelve el número de serie correspondiente al día actual. +WEEKDAY = DIASEM ## Convierte un número de serie en un valor de día de la semana. +WEEKNUM = NUM.DE.SEMANA ## Convierte un número de serie en un número que representa el lugar numérico correspondiente a una semana de un año. +WORKDAY = DIA.LAB ## Devuelve el número de serie de la fecha que tiene lugar antes o después de un número determinado de días laborables. +YEAR = AÑO ## Convierte un número de serie en un valor de año. +YEARFRAC = FRAC.AÑO ## Devuelve la fracción de año que representa el número total de días existentes entre el valor de fecha_inicial y el de fecha_final. + + +## +## Engineering functions Funciones de ingeniería +## +BESSELI = BESSELI ## Devuelve la función Bessel In(x) modificada. +BESSELJ = BESSELJ ## Devuelve la función Bessel Jn(x). +BESSELK = BESSELK ## Devuelve la función Bessel Kn(x) modificada. +BESSELY = BESSELY ## Devuelve la función Bessel Yn(x). +BIN2DEC = BIN.A.DEC ## Convierte un número binario en decimal. +BIN2HEX = BIN.A.HEX ## Convierte un número binario en hexadecimal. +BIN2OCT = BIN.A.OCT ## Convierte un número binario en octal. +COMPLEX = COMPLEJO ## Convierte coeficientes reales e imaginarios en un número complejo. +CONVERT = CONVERTIR ## Convierte un número de un sistema de medida a otro. +DEC2BIN = DEC.A.BIN ## Convierte un número decimal en binario. +DEC2HEX = DEC.A.HEX ## Convierte un número decimal en hexadecimal. +DEC2OCT = DEC.A.OCT ## Convierte un número decimal en octal. +DELTA = DELTA ## Comprueba si dos valores son iguales. +ERF = FUN.ERROR ## Devuelve la función de error. +ERFC = FUN.ERROR.COMPL ## Devuelve la función de error complementario. +GESTEP = MAYOR.O.IGUAL ## Comprueba si un número es mayor que un valor de umbral. +HEX2BIN = HEX.A.BIN ## Convierte un número hexadecimal en binario. +HEX2DEC = HEX.A.DEC ## Convierte un número hexadecimal en decimal. +HEX2OCT = HEX.A.OCT ## Convierte un número hexadecimal en octal. +IMABS = IM.ABS ## Devuelve el valor absoluto (módulo) de un número complejo. +IMAGINARY = IMAGINARIO ## Devuelve el coeficiente imaginario de un número complejo. +IMARGUMENT = IM.ANGULO ## Devuelve el argumento theta, un ángulo expresado en radianes. +IMCONJUGATE = IM.CONJUGADA ## Devuelve la conjugada compleja de un número complejo. +IMCOS = IM.COS ## Devuelve el coseno de un número complejo. +IMDIV = IM.DIV ## Devuelve el cociente de dos números complejos. +IMEXP = IM.EXP ## Devuelve el valor exponencial de un número complejo. +IMLN = IM.LN ## Devuelve el logaritmo natural (neperiano) de un número complejo. +IMLOG10 = IM.LOG10 ## Devuelve el logaritmo en base 10 de un número complejo. +IMLOG2 = IM.LOG2 ## Devuelve el logaritmo en base 2 de un número complejo. +IMPOWER = IM.POT ## Devuelve un número complejo elevado a una potencia entera. +IMPRODUCT = IM.PRODUCT ## Devuelve el producto de números complejos. +IMREAL = IM.REAL ## Devuelve el coeficiente real de un número complejo. +IMSIN = IM.SENO ## Devuelve el seno de un número complejo. +IMSQRT = IM.RAIZ2 ## Devuelve la raíz cuadrada de un número complejo. +IMSUB = IM.SUSTR ## Devuelve la diferencia entre dos números complejos. +IMSUM = IM.SUM ## Devuelve la suma de números complejos. +OCT2BIN = OCT.A.BIN ## Convierte un número octal en binario. +OCT2DEC = OCT.A.DEC ## Convierte un número octal en decimal. +OCT2HEX = OCT.A.HEX ## Convierte un número octal en hexadecimal. + + +## +## Financial functions Funciones financieras +## +ACCRINT = INT.ACUM ## Devuelve el interés acumulado de un valor bursátil con pagos de interés periódicos. +ACCRINTM = INT.ACUM.V ## Devuelve el interés acumulado de un valor bursátil con pagos de interés al vencimiento. +AMORDEGRC = AMORTIZ.PROGRE ## Devuelve la amortización de cada período contable mediante el uso de un coeficiente de amortización. +AMORLINC = AMORTIZ.LIN ## Devuelve la amortización de cada uno de los períodos contables. +COUPDAYBS = CUPON.DIAS.L1 ## Devuelve el número de días desde el principio del período de un cupón hasta la fecha de liquidación. +COUPDAYS = CUPON.DIAS ## Devuelve el número de días del período (entre dos cupones) donde se encuentra la fecha de liquidación. +COUPDAYSNC = CUPON.DIAS.L2 ## Devuelve el número de días desde la fecha de liquidación hasta la fecha del próximo cupón. +COUPNCD = CUPON.FECHA.L2 ## Devuelve la fecha del próximo cupón después de la fecha de liquidación. +COUPNUM = CUPON.NUM ## Devuelve el número de pagos de cupón entre la fecha de liquidación y la fecha de vencimiento. +COUPPCD = CUPON.FECHA.L1 ## Devuelve la fecha de cupón anterior a la fecha de liquidación. +CUMIPMT = PAGO.INT.ENTRE ## Devuelve el interés acumulado pagado entre dos períodos. +CUMPRINC = PAGO.PRINC.ENTRE ## Devuelve el capital acumulado pagado de un préstamo entre dos períodos. +DB = DB ## Devuelve la amortización de un bien durante un período específico a través del método de amortización de saldo fijo. +DDB = DDB ## Devuelve la amortización de un bien durante un período específico a través del método de amortización por doble disminución de saldo u otro método que se especifique. +DISC = TASA.DESC ## Devuelve la tasa de descuento de un valor bursátil. +DOLLARDE = MONEDA.DEC ## Convierte una cotización de un valor bursátil expresada en forma fraccionaria en una cotización de un valor bursátil expresada en forma decimal. +DOLLARFR = MONEDA.FRAC ## Convierte una cotización de un valor bursátil expresada en forma decimal en una cotización de un valor bursátil expresada en forma fraccionaria. +DURATION = DURACION ## Devuelve la duración anual de un valor bursátil con pagos de interés periódico. +EFFECT = INT.EFECTIVO ## Devuelve la tasa de interés anual efectiva. +FV = VF ## Devuelve el valor futuro de una inversión. +FVSCHEDULE = VF.PLAN ## Devuelve el valor futuro de un capital inicial después de aplicar una serie de tasas de interés compuesto. +INTRATE = TASA.INT ## Devuelve la tasa de interés para la inversión total de un valor bursátil. +IPMT = PAGOINT ## Devuelve el pago de intereses de una inversión durante un período determinado. +IRR = TIR ## Devuelve la tasa interna de retorno para una serie de flujos de efectivo periódicos. +ISPMT = INT.PAGO.DIR ## Calcula el interés pagado durante un período específico de una inversión. +MDURATION = DURACION.MODIF ## Devuelve la duración de Macauley modificada de un valor bursátil con un valor nominal supuesto de 100 $. +MIRR = TIRM ## Devuelve la tasa interna de retorno donde se financian flujos de efectivo positivos y negativos a tasas diferentes. +NOMINAL = TASA.NOMINAL ## Devuelve la tasa nominal de interés anual. +NPER = NPER ## Devuelve el número de períodos de una inversión. +NPV = VNA ## Devuelve el valor neto actual de una inversión en función de una serie de flujos periódicos de efectivo y una tasa de descuento. +ODDFPRICE = PRECIO.PER.IRREGULAR.1 ## Devuelve el precio por un valor nominal de 100 $ de un valor bursátil con un primer período impar. +ODDFYIELD = RENDTO.PER.IRREGULAR.1 ## Devuelve el rendimiento de un valor bursátil con un primer período impar. +ODDLPRICE = PRECIO.PER.IRREGULAR.2 ## Devuelve el precio por un valor nominal de 100 $ de un valor bursátil con un último período impar. +ODDLYIELD = RENDTO.PER.IRREGULAR.2 ## Devuelve el rendimiento de un valor bursátil con un último período impar. +PMT = PAGO ## Devuelve el pago periódico de una anualidad. +PPMT = PAGOPRIN ## Devuelve el pago de capital de una inversión durante un período determinado. +PRICE = PRECIO ## Devuelve el precio por un valor nominal de 100 $ de un valor bursátil que paga una tasa de interés periódico. +PRICEDISC = PRECIO.DESCUENTO ## Devuelve el precio por un valor nominal de 100 $ de un valor bursátil con descuento. +PRICEMAT = PRECIO.VENCIMIENTO ## Devuelve el precio por un valor nominal de 100 $ de un valor bursátil que paga interés a su vencimiento. +PV = VALACT ## Devuelve el valor actual de una inversión. +RATE = TASA ## Devuelve la tasa de interés por período de una anualidad. +RECEIVED = CANTIDAD.RECIBIDA ## Devuelve la cantidad recibida al vencimiento de un valor bursátil completamente invertido. +SLN = SLN ## Devuelve la amortización por método directo de un bien en un período dado. +SYD = SYD ## Devuelve la amortización por suma de dígitos de los años de un bien durante un período especificado. +TBILLEQ = LETRA.DE.TES.EQV.A.BONO ## Devuelve el rendimiento de un bono equivalente a una letra del Tesoro (de EE.UU.) +TBILLPRICE = LETRA.DE.TES.PRECIO ## Devuelve el precio por un valor nominal de 100 $ de una letra del Tesoro (de EE.UU.) +TBILLYIELD = LETRA.DE.TES.RENDTO ## Devuelve el rendimiento de una letra del Tesoro (de EE.UU.) +VDB = DVS ## Devuelve la amortización de un bien durante un período específico o parcial a través del método de cálculo del saldo en disminución. +XIRR = TIR.NO.PER ## Devuelve la tasa interna de retorno para un flujo de efectivo que no es necesariamente periódico. +XNPV = VNA.NO.PER ## Devuelve el valor neto actual para un flujo de efectivo que no es necesariamente periódico. +YIELD = RENDTO ## Devuelve el rendimiento de un valor bursátil que paga intereses periódicos. +YIELDDISC = RENDTO.DESC ## Devuelve el rendimiento anual de un valor bursátil con descuento; por ejemplo, una letra del Tesoro (de EE.UU.) +YIELDMAT = RENDTO.VENCTO ## Devuelve el rendimiento anual de un valor bursátil que paga intereses al vencimiento. + + +## +## Information functions Funciones de información +## +CELL = CELDA ## Devuelve información acerca del formato, la ubicación o el contenido de una celda. +ERROR.TYPE = TIPO.DE.ERROR ## Devuelve un número que corresponde a un tipo de error. +INFO = INFO ## Devuelve información acerca del entorno operativo en uso. +ISBLANK = ESBLANCO ## Devuelve VERDADERO si el valor está en blanco. +ISERR = ESERR ## Devuelve VERDADERO si el valor es cualquier valor de error excepto #N/A. +ISERROR = ESERROR ## Devuelve VERDADERO si el valor es cualquier valor de error. +ISEVEN = ES.PAR ## Devuelve VERDADERO si el número es par. +ISLOGICAL = ESLOGICO ## Devuelve VERDADERO si el valor es un valor lógico. +ISNA = ESNOD ## Devuelve VERDADERO si el valor es el valor de error #N/A. +ISNONTEXT = ESNOTEXTO ## Devuelve VERDADERO si el valor no es texto. +ISNUMBER = ESNUMERO ## Devuelve VERDADERO si el valor es un número. +ISODD = ES.IMPAR ## Devuelve VERDADERO si el número es impar. +ISREF = ESREF ## Devuelve VERDADERO si el valor es una referencia. +ISTEXT = ESTEXTO ## Devuelve VERDADERO si el valor es texto. +N = N ## Devuelve un valor convertido en un número. +NA = ND ## Devuelve el valor de error #N/A. +TYPE = TIPO ## Devuelve un número que indica el tipo de datos de un valor. + + +## +## Logical functions Funciones lógicas +## +AND = Y ## Devuelve VERDADERO si todos sus argumentos son VERDADERO. +FALSE = FALSO ## Devuelve el valor lógico FALSO. +IF = SI ## Especifica una prueba lógica que realizar. +IFERROR = SI.ERROR ## Devuelve un valor que se especifica si una fórmula lo evalúa como un error; de lo contrario, devuelve el resultado de la fórmula. +NOT = NO ## Invierte el valor lógico del argumento. +OR = O ## Devuelve VERDADERO si cualquier argumento es VERDADERO. +TRUE = VERDADERO ## Devuelve el valor lógico VERDADERO. + + +## +## Lookup and reference functions Funciones de búsqueda y referencia +## +ADDRESS = DIRECCION ## Devuelve una referencia como texto a una sola celda de una hoja de cálculo. +AREAS = AREAS ## Devuelve el número de áreas de una referencia. +CHOOSE = ELEGIR ## Elige un valor de una lista de valores. +COLUMN = COLUMNA ## Devuelve el número de columna de una referencia. +COLUMNS = COLUMNAS ## Devuelve el número de columnas de una referencia. +HLOOKUP = BUSCARH ## Busca en la fila superior de una matriz y devuelve el valor de la celda indicada. +HYPERLINK = HIPERVINCULO ## Crea un acceso directo o un salto que abre un documento almacenado en un servidor de red, en una intranet o en Internet. +INDEX = INDICE ## Usa un índice para elegir un valor de una referencia o matriz. +INDIRECT = INDIRECTO ## Devuelve una referencia indicada por un valor de texto. +LOOKUP = BUSCAR ## Busca valores de un vector o una matriz. +MATCH = COINCIDIR ## Busca valores de una referencia o matriz. +OFFSET = DESREF ## Devuelve un desplazamiento de referencia respecto a una referencia dada. +ROW = FILA ## Devuelve el número de fila de una referencia. +ROWS = FILAS ## Devuelve el número de filas de una referencia. +RTD = RDTR ## Recupera datos en tiempo real desde un programa compatible con la automatización COM (automatización: modo de trabajar con los objetos de una aplicación desde otra aplicación o herramienta de entorno. La automatización, antes denominada automatización OLE, es un estándar de la industria y una función del Modelo de objetos componentes (COM).). +TRANSPOSE = TRANSPONER ## Devuelve la transposición de una matriz. +VLOOKUP = BUSCARV ## Busca en la primera columna de una matriz y se mueve en horizontal por la fila para devolver el valor de una celda. + + +## +## Math and trigonometry functions Funciones matemáticas y trigonométricas +## +ABS = ABS ## Devuelve el valor absoluto de un número. +ACOS = ACOS ## Devuelve el arcocoseno de un número. +ACOSH = ACOSH ## Devuelve el coseno hiperbólico inverso de un número. +ASIN = ASENO ## Devuelve el arcoseno de un número. +ASINH = ASENOH ## Devuelve el seno hiperbólico inverso de un número. +ATAN = ATAN ## Devuelve la arcotangente de un número. +ATAN2 = ATAN2 ## Devuelve la arcotangente de las coordenadas "x" e "y". +ATANH = ATANH ## Devuelve la tangente hiperbólica inversa de un número. +CEILING = MULTIPLO.SUPERIOR ## Redondea un número al entero más próximo o al múltiplo significativo más cercano. +COMBIN = COMBINAT ## Devuelve el número de combinaciones para un número determinado de objetos. +COS = COS ## Devuelve el coseno de un número. +COSH = COSH ## Devuelve el coseno hiperbólico de un número. +DEGREES = GRADOS ## Convierte radianes en grados. +EVEN = REDONDEA.PAR ## Redondea un número hasta el entero par más próximo. +EXP = EXP ## Devuelve e elevado a la potencia de un número dado. +FACT = FACT ## Devuelve el factorial de un número. +FACTDOUBLE = FACT.DOBLE ## Devuelve el factorial doble de un número. +FLOOR = MULTIPLO.INFERIOR ## Redondea un número hacia abajo, en dirección hacia cero. +GCD = M.C.D ## Devuelve el máximo común divisor. +INT = ENTERO ## Redondea un número hacia abajo hasta el entero más próximo. +LCM = M.C.M ## Devuelve el mínimo común múltiplo. +LN = LN ## Devuelve el logaritmo natural (neperiano) de un número. +LOG = LOG ## Devuelve el logaritmo de un número en una base especificada. +LOG10 = LOG10 ## Devuelve el logaritmo en base 10 de un número. +MDETERM = MDETERM ## Devuelve la determinante matricial de una matriz. +MINVERSE = MINVERSA ## Devuelve la matriz inversa de una matriz. +MMULT = MMULT ## Devuelve el producto de matriz de dos matrices. +MOD = RESIDUO ## Devuelve el resto de la división. +MROUND = REDOND.MULT ## Devuelve un número redondeado al múltiplo deseado. +MULTINOMIAL = MULTINOMIAL ## Devuelve el polinomio de un conjunto de números. +ODD = REDONDEA.IMPAR ## Redondea un número hacia arriba hasta el entero impar más próximo. +PI = PI ## Devuelve el valor de pi. +POWER = POTENCIA ## Devuelve el resultado de elevar un número a una potencia. +PRODUCT = PRODUCTO ## Multiplica sus argumentos. +QUOTIENT = COCIENTE ## Devuelve la parte entera de una división. +RADIANS = RADIANES ## Convierte grados en radianes. +RAND = ALEATORIO ## Devuelve un número aleatorio entre 0 y 1. +RANDBETWEEN = ALEATORIO.ENTRE ## Devuelve un número aleatorio entre los números que especifique. +ROMAN = NUMERO.ROMANO ## Convierte un número arábigo en número romano, con formato de texto. +ROUND = REDONDEAR ## Redondea un número al número de decimales especificado. +ROUNDDOWN = REDONDEAR.MENOS ## Redondea un número hacia abajo, en dirección hacia cero. +ROUNDUP = REDONDEAR.MAS ## Redondea un número hacia arriba, en dirección contraria a cero. +SERIESSUM = SUMA.SERIES ## Devuelve la suma de una serie de potencias en función de la fórmula. +SIGN = SIGNO ## Devuelve el signo de un número. +SIN = SENO ## Devuelve el seno de un ángulo determinado. +SINH = SENOH ## Devuelve el seno hiperbólico de un número. +SQRT = RAIZ ## Devuelve la raíz cuadrada positiva de un número. +SQRTPI = RAIZ2PI ## Devuelve la raíz cuadrada de un número multiplicado por PI (número * pi). +SUBTOTAL = SUBTOTALES ## Devuelve un subtotal en una lista o base de datos. +SUM = SUMA ## Suma sus argumentos. +SUMIF = SUMAR.SI ## Suma las celdas especificadas que cumplen unos criterios determinados. +SUMIFS = SUMAR.SI.CONJUNTO ## Suma las celdas de un rango que cumplen varios criterios. +SUMPRODUCT = SUMAPRODUCTO ## Devuelve la suma de los productos de los correspondientes componentes de matriz. +SUMSQ = SUMA.CUADRADOS ## Devuelve la suma de los cuadrados de los argumentos. +SUMX2MY2 = SUMAX2MENOSY2 ## Devuelve la suma de la diferencia de los cuadrados de los valores correspondientes de dos matrices. +SUMX2PY2 = SUMAX2MASY2 ## Devuelve la suma de la suma de los cuadrados de los valores correspondientes de dos matrices. +SUMXMY2 = SUMAXMENOSY2 ## Devuelve la suma de los cuadrados de las diferencias de los valores correspondientes de dos matrices. +TAN = TAN ## Devuelve la tangente de un número. +TANH = TANH ## Devuelve la tangente hiperbólica de un número. +TRUNC = TRUNCAR ## Trunca un número a un entero. + + +## +## Statistical functions Funciones estadísticas +## +AVEDEV = DESVPROM ## Devuelve el promedio de las desviaciones absolutas de la media de los puntos de datos. +AVERAGE = PROMEDIO ## Devuelve el promedio de sus argumentos. +AVERAGEA = PROMEDIOA ## Devuelve el promedio de sus argumentos, incluidos números, texto y valores lógicos. +AVERAGEIF = PROMEDIO.SI ## Devuelve el promedio (media aritmética) de todas las celdas de un rango que cumplen unos criterios determinados. +AVERAGEIFS = PROMEDIO.SI.CONJUNTO ## Devuelve el promedio (media aritmética) de todas las celdas que cumplen múltiples criterios. +BETADIST = DISTR.BETA ## Devuelve la función de distribución beta acumulativa. +BETAINV = DISTR.BETA.INV ## Devuelve la función inversa de la función de distribución acumulativa de una distribución beta especificada. +BINOMDIST = DISTR.BINOM ## Devuelve la probabilidad de una variable aleatoria discreta siguiendo una distribución binomial. +CHIDIST = DISTR.CHI ## Devuelve la probabilidad de una variable aleatoria continua siguiendo una distribución chi cuadrado de una sola cola. +CHIINV = PRUEBA.CHI.INV ## Devuelve la función inversa de la probabilidad de una variable aleatoria continua siguiendo una distribución chi cuadrado de una sola cola. +CHITEST = PRUEBA.CHI ## Devuelve la prueba de independencia. +CONFIDENCE = INTERVALO.CONFIANZA ## Devuelve el intervalo de confianza de la media de una población. +CORREL = COEF.DE.CORREL ## Devuelve el coeficiente de correlación entre dos conjuntos de datos. +COUNT = CONTAR ## Cuenta cuántos números hay en la lista de argumentos. +COUNTA = CONTARA ## Cuenta cuántos valores hay en la lista de argumentos. +COUNTBLANK = CONTAR.BLANCO ## Cuenta el número de celdas en blanco de un rango. +COUNTIF = CONTAR.SI ## Cuenta el número de celdas, dentro del rango, que cumplen el criterio especificado. +COUNTIFS = CONTAR.SI.CONJUNTO ## Cuenta el número de celdas, dentro del rango, que cumplen varios criterios. +COVAR = COVAR ## Devuelve la covarianza, que es el promedio de los productos de las desviaciones para cada pareja de puntos de datos. +CRITBINOM = BINOM.CRIT ## Devuelve el menor valor cuya distribución binomial acumulativa es menor o igual a un valor de criterio. +DEVSQ = DESVIA2 ## Devuelve la suma de los cuadrados de las desviaciones. +EXPONDIST = DISTR.EXP ## Devuelve la distribución exponencial. +FDIST = DISTR.F ## Devuelve la distribución de probabilidad F. +FINV = DISTR.F.INV ## Devuelve la función inversa de la distribución de probabilidad F. +FISHER = FISHER ## Devuelve la transformación Fisher. +FISHERINV = PRUEBA.FISHER.INV ## Devuelve la función inversa de la transformación Fisher. +FORECAST = PRONOSTICO ## Devuelve un valor en una tendencia lineal. +FREQUENCY = FRECUENCIA ## Devuelve una distribución de frecuencia como una matriz vertical. +FTEST = PRUEBA.F ## Devuelve el resultado de una prueba F. +GAMMADIST = DISTR.GAMMA ## Devuelve la distribución gamma. +GAMMAINV = DISTR.GAMMA.INV ## Devuelve la función inversa de la distribución gamma acumulativa. +GAMMALN = GAMMA.LN ## Devuelve el logaritmo natural de la función gamma, G(x). +GEOMEAN = MEDIA.GEOM ## Devuelve la media geométrica. +GROWTH = CRECIMIENTO ## Devuelve valores en una tendencia exponencial. +HARMEAN = MEDIA.ARMO ## Devuelve la media armónica. +HYPGEOMDIST = DISTR.HIPERGEOM ## Devuelve la distribución hipergeométrica. +INTERCEPT = INTERSECCION.EJE ## Devuelve la intersección de la línea de regresión lineal. +KURT = CURTOSIS ## Devuelve la curtosis de un conjunto de datos. +LARGE = K.ESIMO.MAYOR ## Devuelve el k-ésimo mayor valor de un conjunto de datos. +LINEST = ESTIMACION.LINEAL ## Devuelve los parámetros de una tendencia lineal. +LOGEST = ESTIMACION.LOGARITMICA ## Devuelve los parámetros de una tendencia exponencial. +LOGINV = DISTR.LOG.INV ## Devuelve la función inversa de la distribución logarítmico-normal. +LOGNORMDIST = DISTR.LOG.NORM ## Devuelve la distribución logarítmico-normal acumulativa. +MAX = MAX ## Devuelve el valor máximo de una lista de argumentos. +MAXA = MAXA ## Devuelve el valor máximo de una lista de argumentos, incluidos números, texto y valores lógicos. +MEDIAN = MEDIANA ## Devuelve la mediana de los números dados. +MIN = MIN ## Devuelve el valor mínimo de una lista de argumentos. +MINA = MINA ## Devuelve el valor mínimo de una lista de argumentos, incluidos números, texto y valores lógicos. +MODE = MODA ## Devuelve el valor más común de un conjunto de datos. +NEGBINOMDIST = NEGBINOMDIST ## Devuelve la distribución binomial negativa. +NORMDIST = DISTR.NORM ## Devuelve la distribución normal acumulativa. +NORMINV = DISTR.NORM.INV ## Devuelve la función inversa de la distribución normal acumulativa. +NORMSDIST = DISTR.NORM.ESTAND ## Devuelve la distribución normal estándar acumulativa. +NORMSINV = DISTR.NORM.ESTAND.INV ## Devuelve la función inversa de la distribución normal estándar acumulativa. +PEARSON = PEARSON ## Devuelve el coeficiente de momento de correlación de producto Pearson. +PERCENTILE = PERCENTIL ## Devuelve el k-ésimo percentil de los valores de un rango. +PERCENTRANK = RANGO.PERCENTIL ## Devuelve el rango porcentual de un valor de un conjunto de datos. +PERMUT = PERMUTACIONES ## Devuelve el número de permutaciones de un número determinado de objetos. +POISSON = POISSON ## Devuelve la distribución de Poisson. +PROB = PROBABILIDAD ## Devuelve la probabilidad de que los valores de un rango se encuentren entre dos límites. +QUARTILE = CUARTIL ## Devuelve el cuartil de un conjunto de datos. +RANK = JERARQUIA ## Devuelve la jerarquía de un número en una lista de números. +RSQ = COEFICIENTE.R2 ## Devuelve el cuadrado del coeficiente de momento de correlación de producto Pearson. +SKEW = COEFICIENTE.ASIMETRIA ## Devuelve la asimetría de una distribución. +SLOPE = PENDIENTE ## Devuelve la pendiente de la línea de regresión lineal. +SMALL = K.ESIMO.MENOR ## Devuelve el k-ésimo menor valor de un conjunto de datos. +STANDARDIZE = NORMALIZACION ## Devuelve un valor normalizado. +STDEV = DESVEST ## Calcula la desviación estándar a partir de una muestra. +STDEVA = DESVESTA ## Calcula la desviación estándar a partir de una muestra, incluidos números, texto y valores lógicos. +STDEVP = DESVESTP ## Calcula la desviación estándar en función de toda la población. +STDEVPA = DESVESTPA ## Calcula la desviación estándar en función de toda la población, incluidos números, texto y valores lógicos. +STEYX = ERROR.TIPICO.XY ## Devuelve el error estándar del valor de "y" previsto para cada "x" de la regresión. +TDIST = DISTR.T ## Devuelve la distribución de t de Student. +TINV = DISTR.T.INV ## Devuelve la función inversa de la distribución de t de Student. +TREND = TENDENCIA ## Devuelve valores en una tendencia lineal. +TRIMMEAN = MEDIA.ACOTADA ## Devuelve la media del interior de un conjunto de datos. +TTEST = PRUEBA.T ## Devuelve la probabilidad asociada a una prueba t de Student. +VAR = VAR ## Calcula la varianza en función de una muestra. +VARA = VARA ## Calcula la varianza en función de una muestra, incluidos números, texto y valores lógicos. +VARP = VARP ## Calcula la varianza en función de toda la población. +VARPA = VARPA ## Calcula la varianza en función de toda la población, incluidos números, texto y valores lógicos. +WEIBULL = DIST.WEIBULL ## Devuelve la distribución de Weibull. +ZTEST = PRUEBA.Z ## Devuelve el valor de una probabilidad de una cola de una prueba z. + + +## +## Text functions Funciones de texto +## +ASC = ASC ## Convierte las letras inglesas o katakana de ancho completo (de dos bytes) dentro de una cadena de caracteres en caracteres de ancho medio (de un byte). +BAHTTEXT = TEXTOBAHT ## Convierte un número en texto, con el formato de moneda ß (Baht). +CHAR = CARACTER ## Devuelve el carácter especificado por el número de código. +CLEAN = LIMPIAR ## Quita del texto todos los caracteres no imprimibles. +CODE = CODIGO ## Devuelve un código numérico del primer carácter de una cadena de texto. +CONCATENATE = CONCATENAR ## Concatena varios elementos de texto en uno solo. +DOLLAR = MONEDA ## Convierte un número en texto, con el formato de moneda $ (dólar). +EXACT = IGUAL ## Comprueba si dos valores de texto son idénticos. +FIND = ENCONTRAR ## Busca un valor de texto dentro de otro (distingue mayúsculas de minúsculas). +FINDB = ENCONTRARB ## Busca un valor de texto dentro de otro (distingue mayúsculas de minúsculas). +FIXED = DECIMAL ## Da formato a un número como texto con un número fijo de decimales. +JIS = JIS ## Convierte las letras inglesas o katakana de ancho medio (de un byte) dentro de una cadena de caracteres en caracteres de ancho completo (de dos bytes). +LEFT = IZQUIERDA ## Devuelve los caracteres del lado izquierdo de un valor de texto. +LEFTB = IZQUIERDAB ## Devuelve los caracteres del lado izquierdo de un valor de texto. +LEN = LARGO ## Devuelve el número de caracteres de una cadena de texto. +LENB = LARGOB ## Devuelve el número de caracteres de una cadena de texto. +LOWER = MINUSC ## Pone el texto en minúsculas. +MID = EXTRAE ## Devuelve un número específico de caracteres de una cadena de texto que comienza en la posición que se especifique. +MIDB = EXTRAEB ## Devuelve un número específico de caracteres de una cadena de texto que comienza en la posición que se especifique. +PHONETIC = FONETICO ## Extrae los caracteres fonéticos (furigana) de una cadena de texto. +PROPER = NOMPROPIO ## Pone en mayúscula la primera letra de cada palabra de un valor de texto. +REPLACE = REEMPLAZAR ## Reemplaza caracteres de texto. +REPLACEB = REEMPLAZARB ## Reemplaza caracteres de texto. +REPT = REPETIR ## Repite el texto un número determinado de veces. +RIGHT = DERECHA ## Devuelve los caracteres del lado derecho de un valor de texto. +RIGHTB = DERECHAB ## Devuelve los caracteres del lado derecho de un valor de texto. +SEARCH = HALLAR ## Busca un valor de texto dentro de otro (no distingue mayúsculas de minúsculas). +SEARCHB = HALLARB ## Busca un valor de texto dentro de otro (no distingue mayúsculas de minúsculas). +SUBSTITUTE = SUSTITUIR ## Sustituye texto nuevo por texto antiguo en una cadena de texto. +T = T ## Convierte sus argumentos a texto. +TEXT = TEXTO ## Da formato a un número y lo convierte en texto. +TRIM = ESPACIOS ## Quita los espacios del texto. +UPPER = MAYUSC ## Pone el texto en mayúsculas. +VALUE = VALOR ## Convierte un argumento de texto en un número. diff --git a/application/third_party/PHPExcel/PHPExcel/locale/fi/config b/application/third_party/PHPExcel/PHPExcel/locale/fi/config new file mode 100644 index 0000000..498cf4c --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/fi/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = $ # Symbol not known, should it be a € (Euro)? + + +## +## Excel Error Codes (For future use) +## +NULL = #TYHJÄ! +DIV0 = #JAKO/0! +VALUE = #ARVO! +REF = #VIITTAUS! +NAME = #NIMI? +NUM = #LUKU! +NA = #PUUTTUU diff --git a/application/third_party/PHPExcel/PHPExcel/locale/fi/functions b/application/third_party/PHPExcel/PHPExcel/locale/fi/functions new file mode 100644 index 0000000..6a7c2b3 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/fi/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Apuohjelma- ja automaatiofunktiot +## +GETPIVOTDATA = NOUDA.PIVOT.TIEDOT ## Palauttaa pivot-taulukkoraporttiin tallennettuja tietoja. + + +## +## Cube functions Kuutiofunktiot +## +CUBEKPIMEMBER = KUUTIOKPIJÄSEN ## Palauttaa suorituskykyilmaisimen (KPI) nimen, ominaisuuden sekä mitan ja näyttää nimen sekä ominaisuuden solussa. KPI on mitattavissa oleva suure, kuten kuukauden bruttotuotto tai vuosineljänneksen työntekijäkohtainen liikevaihto, joiden avulla tarkkaillaan organisaation suorituskykyä. +CUBEMEMBER = KUUTIONJÄSEN ## Palauttaa kuutiohierarkian jäsenen tai monikon. Tällä funktiolla voit tarkistaa, että jäsen tai monikko on olemassa kuutiossa. +CUBEMEMBERPROPERTY = KUUTIONJÄSENENOMINAISUUS ## Palauttaa kuution jäsenominaisuuden arvon. Tällä funktiolla voit tarkistaa, että nimi on olemassa kuutiossa, ja palauttaa tämän jäsenen määritetyn ominaisuuden. +CUBERANKEDMEMBER = KUUTIONLUOKITELTUJÄSEN ## Palauttaa joukon n:nnen jäsenen. Tällä funktiolla voit palauttaa joukosta elementtejä, kuten parhaan myyjän tai 10 parasta opiskelijaa. +CUBESET = KUUTIOJOUKKO ## Määrittää lasketun jäsen- tai monikkojoukon lähettämällä joukon lausekkeita palvelimessa olevalle kuutiolle. Palvelin luo joukon ja palauttaa sen Microsoft Office Excelille. +CUBESETCOUNT = KUUTIOJOUKKOJENMÄÄRÄ ## Palauttaa joukon kohteiden määrän. +CUBEVALUE = KUUTIONARVO ## Palauttaa koostetun arvon kuutiosta. + + +## +## Database functions Tietokantafunktiot +## +DAVERAGE = TKESKIARVO ## Palauttaa valittujen tietokantamerkintöjen keskiarvon. +DCOUNT = TLASKE ## Laskee tietokannan lukuja sisältävien solujen määrän. +DCOUNTA = TLASKEA ## Laskee tietokannan tietoja sisältävien solujen määrän. +DGET = TNOUDA ## Hakee määritettyjä ehtoja vastaavan tietueen tietokannasta. +DMAX = TMAKS ## Palauttaa suurimman arvon tietokannasta valittujen arvojen joukosta. +DMIN = TMIN ## Palauttaa pienimmän arvon tietokannasta valittujen arvojen joukosta. +DPRODUCT = TTULO ## Kertoo määritetyn ehdon täyttävien tietokannan tietueiden tietyssä kentässä olevat arvot. +DSTDEV = TKESKIHAJONTA ## Laskee keskihajonnan tietokannasta valituista arvoista muodostuvan otoksen perusteella. +DSTDEVP = TKESKIHAJONTAP ## Laskee keskihajonnan tietokannasta valittujen arvojen koko populaation perusteella. +DSUM = TSUMMA ## Lisää luvut määritetyn ehdon täyttävien tietokannan tietueiden kenttäsarakkeeseen. +DVAR = TVARIANSSI ## Laskee varianssin tietokannasta valittujen arvojen otoksen perusteella. +DVARP = TVARIANSSIP ## Laskee varianssin tietokannasta valittujen arvojen koko populaation perusteella. + + +## +## Date and time functions Päivämäärä- ja aikafunktiot +## +DATE = PÄIVÄYS ## Palauttaa annetun päivämäärän järjestysluvun. +DATEVALUE = PÄIVÄYSARVO ## Muuntaa tekstimuodossa olevan päivämäärän järjestysluvuksi. +DAY = PÄIVÄ ## Muuntaa järjestysluvun kuukauden päiväksi. +DAYS360 = PÄIVÄT360 ## Laskee kahden päivämäärän välisten päivien määrän käyttäen perustana 360-päiväistä vuotta. +EDATE = PÄIVÄ.KUUKAUSI ## Palauttaa järjestyslukuna päivämäärän, joka poikkeaa aloituspäivän päivämäärästä annetun kuukausimäärän verran joko eteen- tai taaksepäin. +EOMONTH = KUUKAUSI.LOPPU ## Palauttaa järjestyslukuna sen kuukauden viimeisen päivämäärän, joka poikkeaa annetun kuukausimäärän verran eteen- tai taaksepäin. +HOUR = TUNNIT ## Muuntaa järjestysluvun tunneiksi. +MINUTE = MINUUTIT ## Muuntaa järjestysluvun minuuteiksi. +MONTH = KUUKAUSI ## Muuntaa järjestysluvun kuukausiksi. +NETWORKDAYS = TYÖPÄIVÄT ## Palauttaa kahden päivämäärän välissä olevien täysien työpäivien määrän. +NOW = NYT ## Palauttaa kuluvan päivämäärän ja ajan järjestysnumeron. +SECOND = SEKUNNIT ## Muuntaa järjestysluvun sekunneiksi. +TIME = AIKA ## Palauttaa annetun kellonajan järjestysluvun. +TIMEVALUE = AIKA_ARVO ## Muuntaa tekstimuodossa olevan kellonajan järjestysluvuksi. +TODAY = TÄMÄ.PÄIVÄ ## Palauttaa kuluvan päivän päivämäärän järjestysluvun. +WEEKDAY = VIIKONPÄIVÄ ## Muuntaa järjestysluvun viikonpäiväksi. +WEEKNUM = VIIKKO.NRO ## Muuntaa järjestysluvun luvuksi, joka ilmaisee viikon järjestysluvun vuoden alusta laskettuna. +WORKDAY = TYÖPÄIVÄ ## Palauttaa järjestysluvun päivämäärälle, joka sijaitsee annettujen työpäivien verran eteen tai taaksepäin. +YEAR = VUOSI ## Muuntaa järjestysluvun vuosiksi. +YEARFRAC = VUOSI.OSA ## Palauttaa määritettyjen päivämäärien (aloituspäivä ja lopetuspäivä) välisen osan vuodesta. + + +## +## Engineering functions Tekniset funktiot +## +BESSELI = BESSELI ## Palauttaa muunnetun Bessel-funktion In(x). +BESSELJ = BESSELJ ## Palauttaa Bessel-funktion Jn(x). +BESSELK = BESSELK ## Palauttaa muunnetun Bessel-funktion Kn(x). +BESSELY = BESSELY ## Palauttaa Bessel-funktion Yn(x). +BIN2DEC = BINDES ## Muuntaa binaariluvun desimaaliluvuksi. +BIN2HEX = BINHEKSA ## Muuntaa binaariluvun heksadesimaaliluvuksi. +BIN2OCT = BINOKT ## Muuntaa binaariluvun oktaaliluvuksi. +COMPLEX = KOMPLEKSI ## Muuntaa reaali- ja imaginaariosien kertoimet kompleksiluvuksi. +CONVERT = MUUNNA ## Muuntaa luvun toisen mittajärjestelmän mukaiseksi. +DEC2BIN = DESBIN ## Muuntaa desimaaliluvun binaariluvuksi. +DEC2HEX = DESHEKSA ## Muuntaa kymmenjärjestelmän luvun heksadesimaaliluvuksi. +DEC2OCT = DESOKT ## Muuntaa kymmenjärjestelmän luvun oktaaliluvuksi. +DELTA = SAMA.ARVO ## Tarkistaa, ovatko kaksi arvoa yhtä suuria. +ERF = VIRHEFUNKTIO ## Palauttaa virhefunktion. +ERFC = VIRHEFUNKTIO.KOMPLEMENTTI ## Palauttaa komplementtivirhefunktion. +GESTEP = RAJA ## Testaa, onko luku suurempi kuin kynnysarvo. +HEX2BIN = HEKSABIN ## Muuntaa heksadesimaaliluvun binaariluvuksi. +HEX2DEC = HEKSADES ## Muuntaa heksadesimaaliluvun desimaaliluvuksi. +HEX2OCT = HEKSAOKT ## Muuntaa heksadesimaaliluvun oktaaliluvuksi. +IMABS = KOMPLEKSI.ITSEISARVO ## Palauttaa kompleksiluvun itseisarvon (moduluksen). +IMAGINARY = KOMPLEKSI.IMAG ## Palauttaa kompleksiluvun imaginaariosan kertoimen. +IMARGUMENT = KOMPLEKSI.ARG ## Palauttaa theeta-argumentin, joka on radiaaneina annettu kulma. +IMCONJUGATE = KOMPLEKSI.KONJ ## Palauttaa kompleksiluvun konjugaattiluvun. +IMCOS = KOMPLEKSI.COS ## Palauttaa kompleksiluvun kosinin. +IMDIV = KOMPLEKSI.OSAM ## Palauttaa kahden kompleksiluvun osamäärän. +IMEXP = KOMPLEKSI.EKSP ## Palauttaa kompleksiluvun eksponentin. +IMLN = KOMPLEKSI.LN ## Palauttaa kompleksiluvun luonnollisen logaritmin. +IMLOG10 = KOMPLEKSI.LOG10 ## Palauttaa kompleksiluvun kymmenkantaisen logaritmin. +IMLOG2 = KOMPLEKSI.LOG2 ## Palauttaa kompleksiluvun kaksikantaisen logaritmin. +IMPOWER = KOMPLEKSI.POT ## Palauttaa kokonaislukupotenssiin korotetun kompleksiluvun. +IMPRODUCT = KOMPLEKSI.TULO ## Palauttaa kompleksilukujen tulon. +IMREAL = KOMPLEKSI.REAALI ## Palauttaa kompleksiluvun reaaliosan kertoimen. +IMSIN = KOMPLEKSI.SIN ## Palauttaa kompleksiluvun sinin. +IMSQRT = KOMPLEKSI.NELIÖJ ## Palauttaa kompleksiluvun neliöjuuren. +IMSUB = KOMPLEKSI.EROTUS ## Palauttaa kahden kompleksiluvun erotuksen. +IMSUM = KOMPLEKSI.SUM ## Palauttaa kompleksilukujen summan. +OCT2BIN = OKTBIN ## Muuntaa oktaaliluvun binaariluvuksi. +OCT2DEC = OKTDES ## Muuntaa oktaaliluvun desimaaliluvuksi. +OCT2HEX = OKTHEKSA ## Muuntaa oktaaliluvun heksadesimaaliluvuksi. + + +## +## Financial functions Rahoitusfunktiot +## +ACCRINT = KERTYNYT.KORKO ## Laskee arvopaperille kertyneen koron, kun korko kertyy säännöllisin väliajoin. +ACCRINTM = KERTYNYT.KORKO.LOPUSSA ## Laskee arvopaperille kertyneen koron, kun korko maksetaan eräpäivänä. +AMORDEGRC = AMORDEGRC ## Laskee kunkin laskentakauden poiston poistokerrointa käyttämällä. +AMORLINC = AMORLINC ## Palauttaa kunkin laskentakauden poiston. +COUPDAYBS = KORKOPÄIVÄT.ALUSTA ## Palauttaa koronmaksukauden aloituspäivän ja tilityspäivän välisen ajanjakson päivien määrän. +COUPDAYS = KORKOPÄIVÄT ## Palauttaa päivien määrän koronmaksukaudelta, johon tilityspäivä kuuluu. +COUPDAYSNC = KORKOPÄIVÄT.SEURAAVA ## Palauttaa tilityspäivän ja seuraavan koronmaksupäivän välisen ajanjakson päivien määrän. +COUPNCD = KORKOMAKSU.SEURAAVA ## Palauttaa tilityspäivän jälkeisen seuraavan koronmaksupäivän. +COUPNUM = KORKOPÄIVÄJAKSOT ## Palauttaa arvopaperin ostopäivän ja erääntymispäivän välisten koronmaksupäivien määrän. +COUPPCD = KORKOPÄIVÄ.EDELLINEN ## Palauttaa tilityspäivää edeltävän koronmaksupäivän. +CUMIPMT = MAKSETTU.KORKO ## Palauttaa kahden jakson välisenä aikana kertyneen koron. +CUMPRINC = MAKSETTU.LYHENNYS ## Palauttaa lainalle kahden jakson välisenä aikana kertyneen lyhennyksen. +DB = DB ## Palauttaa kauden kirjanpidollisen poiston amerikkalaisen DB-menetelmän (Fixed-declining balance) mukaan. +DDB = DDB ## Palauttaa kauden kirjanpidollisen poiston amerikkalaisen DDB-menetelmän (Double-Declining Balance) tai jonkin muun määrittämäsi menetelmän mukaan. +DISC = DISKONTTOKORKO ## Palauttaa arvopaperin diskonttokoron. +DOLLARDE = VALUUTTA.DES ## Muuntaa murtolukuna ilmoitetun valuuttamäärän desimaaliluvuksi. +DOLLARFR = VALUUTTA.MURTO ## Muuntaa desimaalilukuna ilmaistun valuuttamäärän murtoluvuksi. +DURATION = KESTO ## Palauttaa keston arvopaperille, jonka koronmaksu tapahtuu säännöllisesti. +EFFECT = KORKO.EFEKT ## Palauttaa todellisen vuosikoron. +FV = TULEVA.ARVO ## Palauttaa sijoituksen tulevan arvon. +FVSCHEDULE = TULEVA.ARVO.ERIKORKO ## Palauttaa pääoman tulevan arvon, kun pääomalle on kertynyt korkoa vaihtelevasti. +INTRATE = KORKO.ARVOPAPERI ## Palauttaa arvopaperin korkokannan täysin sijoitetulle arvopaperille. +IPMT = IPMT ## Laskee sijoitukselle tai lainalle tiettynä ajanjaksona kertyvän koron. +IRR = SISÄINEN.KORKO ## Laskee sisäisen korkokannan kassavirrasta muodostuvalle sarjalle. +ISPMT = ONMAKSU ## Laskee sijoituksen maksetun koron tietyllä jaksolla. +MDURATION = KESTO.MUUNN ## Palauttaa muunnetun Macauley-keston arvopaperille, jonka oletettu nimellisarvo on 100 euroa. +MIRR = MSISÄINEN ## Palauttaa sisäisen korkokannan, kun positiivisten ja negatiivisten kassavirtojen rahoituskorko on erilainen. +NOMINAL = KORKO.VUOSI ## Palauttaa vuosittaisen nimelliskoron. +NPER = NJAKSO ## Palauttaa sijoituksen jaksojen määrän. +NPV = NNA ## Palauttaa sijoituksen nykyarvon toistuvista kassavirroista muodostuvan sarjan ja diskonttokoron perusteella. +ODDFPRICE = PARITON.ENS.NIMELLISARVO ## Palauttaa arvopaperin hinnan tilanteessa, jossa ensimmäinen jakso on pariton. +ODDFYIELD = PARITON.ENS.TUOTTO ## Palauttaa arvopaperin tuoton tilanteessa, jossa ensimmäinen jakso on pariton. +ODDLPRICE = PARITON.VIIM.NIMELLISARVO ## Palauttaa arvopaperin hinnan tilanteessa, jossa viimeinen jakso on pariton. +ODDLYIELD = PARITON.VIIM.TUOTTO ## Palauttaa arvopaperin tuoton tilanteessa, jossa viimeinen jakso on pariton. +PMT = MAKSU ## Palauttaa annuiteetin kausittaisen maksuerän. +PPMT = PPMT ## Laskee sijoitukselle tai lainalle tiettynä ajanjaksona maksettavan lyhennyksen. +PRICE = HINTA ## Palauttaa hinnan 100 euron nimellisarvoa kohden arvopaperille, jonka korko maksetaan säännöllisin väliajoin. +PRICEDISC = HINTA.DISK ## Palauttaa diskontatun arvopaperin hinnan 100 euron nimellisarvoa kohden. +PRICEMAT = HINTA.LUNASTUS ## Palauttaa hinnan 100 euron nimellisarvoa kohden arvopaperille, jonka korko maksetaan erääntymispäivänä. +PV = NA ## Palauttaa sijoituksen nykyarvon. +RATE = KORKO ## Palauttaa annuiteetin kausittaisen korkokannan. +RECEIVED = SAATU.HINTA ## Palauttaa arvopaperin tuoton erääntymispäivänä kokonaan maksetulle sijoitukselle. +SLN = STP ## Palauttaa sijoituksen tasapoiston yhdeltä jaksolta. +SYD = VUOSIPOISTO ## Palauttaa sijoituksen vuosipoiston annettuna kautena amerikkalaisen SYD-menetelmän (Sum-of-Year's Digits) avulla. +TBILLEQ = OBLIG.TUOTTOPROS ## Palauttaa valtion obligaation tuoton vastaavana joukkovelkakirjan tuottona. +TBILLPRICE = OBLIG.HINTA ## Palauttaa obligaation hinnan 100 euron nimellisarvoa kohden. +TBILLYIELD = OBLIG.TUOTTO ## Palauttaa obligaation tuoton. +VDB = VDB ## Palauttaa annetun kauden tai kauden osan kirjanpidollisen poiston amerikkalaisen DB-menetelmän (Fixed-declining balance) mukaan. +XIRR = SISÄINEN.KORKO.JAKSOTON ## Palauttaa sisäisen korkokannan kassavirtojen sarjoille, jotka eivät välttämättä ole säännöllisiä. +XNPV = NNA.JAKSOTON ## Palauttaa nettonykyarvon kassavirtasarjalle, joka ei välttämättä ole kausittainen. +YIELD = TUOTTO ## Palauttaa tuoton arvopaperille, jonka korko maksetaan säännöllisin väliajoin. +YIELDDISC = TUOTTO.DISK ## Palauttaa diskontatun arvopaperin, kuten obligaation, vuosittaisen tuoton. +YIELDMAT = TUOTTO.ERÄP ## Palauttaa erääntymispäivänään korkoa tuottavan arvopaperin vuosittaisen tuoton. + + +## +## Information functions Erikoisfunktiot +## +CELL = SOLU ## Palauttaa tietoja solun muotoilusta, sijainnista ja sisällöstä. +ERROR.TYPE = VIRHEEN.LAJI ## Palauttaa virhetyyppiä vastaavan luvun. +INFO = KUVAUS ## Palauttaa tietoja nykyisestä käyttöympäristöstä. +ISBLANK = ONTYHJÄ ## Palauttaa arvon TOSI, jos arvo on tyhjä. +ISERR = ONVIRH ## Palauttaa arvon TOSI, jos arvo on mikä tahansa virhearvo paitsi arvo #PUUTTUU!. +ISERROR = ONVIRHE ## Palauttaa arvon TOSI, jos arvo on mikä tahansa virhearvo. +ISEVEN = ONPARILLINEN ## Palauttaa arvon TOSI, jos arvo on parillinen. +ISLOGICAL = ONTOTUUS ## Palauttaa arvon TOSI, jos arvo on mikä tahansa looginen arvo. +ISNA = ONPUUTTUU ## Palauttaa arvon TOSI, jos virhearvo on #PUUTTUU!. +ISNONTEXT = ONEI_TEKSTI ## Palauttaa arvon TOSI, jos arvo ei ole teksti. +ISNUMBER = ONLUKU ## Palauttaa arvon TOSI, jos arvo on luku. +ISODD = ONPARITON ## Palauttaa arvon TOSI, jos arvo on pariton. +ISREF = ONVIITT ## Palauttaa arvon TOSI, jos arvo on viittaus. +ISTEXT = ONTEKSTI ## Palauttaa arvon TOSI, jos arvo on teksti. +N = N ## Palauttaa arvon luvuksi muunnettuna. +NA = PUUTTUU ## Palauttaa virhearvon #PUUTTUU!. +TYPE = TYYPPI ## Palauttaa luvun, joka ilmaisee arvon tietotyypin. + + +## +## Logical functions Loogiset funktiot +## +AND = JA ## Palauttaa arvon TOSI, jos kaikkien argumenttien arvo on TOSI. +FALSE = EPÄTOSI ## Palauttaa totuusarvon EPÄTOSI. +IF = JOS ## Määrittää suoritettavan loogisen testin. +IFERROR = JOSVIRHE ## Palauttaa määrittämäsi arvon, jos kaavan tulos on virhe; muussa tapauksessa palauttaa kaavan tuloksen. +NOT = EI ## Kääntää argumentin loogisen arvon. +OR = TAI ## Palauttaa arvon TOSI, jos minkä tahansa argumentin arvo on TOSI. +TRUE = TOSI ## Palauttaa totuusarvon TOSI. + + +## +## Lookup and reference functions Haku- ja viitefunktiot +## +ADDRESS = OSOITE ## Palauttaa laskentataulukon soluun osoittavan viittauksen tekstinä. +AREAS = ALUEET ## Palauttaa viittauksessa olevien alueiden määrän. +CHOOSE = VALITSE.INDEKSI ## Valitsee arvon arvoluettelosta. +COLUMN = SARAKE ## Palauttaa viittauksen sarakenumeron. +COLUMNS = SARAKKEET ## Palauttaa viittauksessa olevien sarakkeiden määrän. +HLOOKUP = VHAKU ## Suorittaa haun matriisin ylimmältä riviltä ja palauttaa määritetyn solun arvon. +HYPERLINK = HYPERLINKKI ## Luo pikakuvakkeen tai tekstin, joka avaa verkkopalvelimeen, intranetiin tai Internetiin tallennetun tiedoston. +INDEX = INDEKSI ## Valitsee arvon viittauksesta tai matriisista indeksin mukaan. +INDIRECT = EPÄSUORA ## Palauttaa tekstiarvona ilmaistun viittauksen. +LOOKUP = HAKU ## Etsii arvoja vektorista tai matriisista. +MATCH = VASTINE ## Etsii arvoja viittauksesta tai matriisista. +OFFSET = SIIRTYMÄ ## Palauttaa annetun viittauksen siirtymän. +ROW = RIVI ## Palauttaa viittauksen rivinumeron. +ROWS = RIVIT ## Palauttaa viittauksessa olevien rivien määrän. +RTD = RTD ## Noutaa COM-automaatiota (automaatio: Tapa käsitellä sovelluksen objekteja toisesta sovelluksesta tai kehitystyökalusta. Automaatio, jota aiemmin kutsuttiin OLE-automaatioksi, on teollisuusstandardi ja COM-mallin (Component Object Model) ominaisuus.) tukevasta ohjelmasta reaaliaikaisia tietoja. +TRANSPOSE = TRANSPONOI ## Palauttaa matriisin käänteismatriisin. +VLOOKUP = PHAKU ## Suorittaa haun matriisin ensimmäisestä sarakkeesta ja palauttaa rivillä olevan solun arvon. + + +## +## Math and trigonometry functions Matemaattiset ja trigonometriset funktiot +## +ABS = ITSEISARVO ## Palauttaa luvun itseisarvon. +ACOS = ACOS ## Palauttaa luvun arkuskosinin. +ACOSH = ACOSH ## Palauttaa luvun käänteisen hyperbolisen kosinin. +ASIN = ASIN ## Palauttaa luvun arkussinin. +ASINH = ASINH ## Palauttaa luvun käänteisen hyperbolisen sinin. +ATAN = ATAN ## Palauttaa luvun arkustangentin. +ATAN2 = ATAN2 ## Palauttaa arkustangentin x- ja y-koordinaatin perusteella. +ATANH = ATANH ## Palauttaa luvun käänteisen hyperbolisen tangentin. +CEILING = PYÖRISTÄ.KERR.YLÖS ## Pyöristää luvun lähimpään kokonaislukuun tai tarkkuusargumentin lähimpään kerrannaiseen. +COMBIN = KOMBINAATIO ## Palauttaa mahdollisten kombinaatioiden määrän annetulle objektien määrälle. +COS = COS ## Palauttaa luvun kosinin. +COSH = COSH ## Palauttaa luvun hyperbolisen kosinin. +DEGREES = ASTEET ## Muuntaa radiaanit asteiksi. +EVEN = PARILLINEN ## Pyöristää luvun ylöspäin lähimpään parilliseen kokonaislukuun. +EXP = EKSPONENTTI ## Palauttaa e:n korotettuna annetun luvun osoittamaan potenssiin. +FACT = KERTOMA ## Palauttaa luvun kertoman. +FACTDOUBLE = KERTOMA.OSA ## Palauttaa luvun osakertoman. +FLOOR = PYÖRISTÄ.KERR.ALAS ## Pyöristää luvun alaspäin (nollaa kohti). +GCD = SUURIN.YHT.TEKIJÄ ## Palauttaa suurimman yhteisen tekijän. +INT = KOKONAISLUKU ## Pyöristää luvun alaspäin lähimpään kokonaislukuun. +LCM = PIENIN.YHT.JAETTAVA ## Palauttaa pienimmän yhteisen tekijän. +LN = LUONNLOG ## Palauttaa luvun luonnollisen logaritmin. +LOG = LOG ## Laskee luvun logaritmin käyttämällä annettua kantalukua. +LOG10 = LOG10 ## Palauttaa luvun kymmenkantaisen logaritmin. +MDETERM = MDETERM ## Palauttaa matriisin matriisideterminantin. +MINVERSE = MKÄÄNTEINEN ## Palauttaa matriisin käänteismatriisin. +MMULT = MKERRO ## Palauttaa kahden matriisin tulon. +MOD = JAKOJ ## Palauttaa jakolaskun jäännöksen. +MROUND = PYÖRISTÄ.KERR ## Palauttaa luvun pyöristettynä annetun luvun kerrannaiseen. +MULTINOMIAL = MULTINOMI ## Palauttaa lukujoukon multinomin. +ODD = PARITON ## Pyöristää luvun ylöspäin lähimpään parittomaan kokonaislukuun. +PI = PII ## Palauttaa piin arvon. +POWER = POTENSSI ## Palauttaa luvun korotettuna haluttuun potenssiin. +PRODUCT = TULO ## Kertoo annetut argumentit. +QUOTIENT = OSAMÄÄRÄ ## Palauttaa osamäärän kokonaislukuosan. +RADIANS = RADIAANIT ## Muuntaa asteet radiaaneiksi. +RAND = SATUNNAISLUKU ## Palauttaa satunnaisluvun väliltä 0–1. +RANDBETWEEN = SATUNNAISLUKU.VÄLILTÄ ## Palauttaa satunnaisluvun määritettyjen lukujen väliltä. +ROMAN = ROMAN ## Muuntaa arabialaisen numeron tekstimuotoiseksi roomalaiseksi numeroksi. +ROUND = PYÖRISTÄ ## Pyöristää luvun annettuun määrään desimaaleja. +ROUNDDOWN = PYÖRISTÄ.DES.ALAS ## Pyöristää luvun alaspäin (nollaa kohti). +ROUNDUP = PYÖRISTÄ.DES.YLÖS ## Pyöristää luvun ylöspäin (poispäin nollasta). +SERIESSUM = SARJA.SUMMA ## Palauttaa kaavaan perustuvan potenssisarjan arvon. +SIGN = ETUMERKKI ## Palauttaa luvun etumerkin. +SIN = SIN ## Palauttaa annetun kulman sinin. +SINH = SINH ## Palauttaa luvun hyperbolisen sinin. +SQRT = NELIÖJUURI ## Palauttaa positiivisen neliöjuuren. +SQRTPI = NELIÖJUURI.PII ## Palauttaa tulon (luku * pii) neliöjuuren. +SUBTOTAL = VÄLISUMMA ## Palauttaa luettelon tai tietokannan välisumman. +SUM = SUMMA ## Laskee yhteen annetut argumentit. +SUMIF = SUMMA.JOS ## Laskee ehdot täyttävien solujen summan. +SUMIFS = SUMMA.JOS.JOUKKO ## Laskee yhteen solualueen useita ehtoja vastaavat solut. +SUMPRODUCT = TULOJEN.SUMMA ## Palauttaa matriisin toisiaan vastaavien osien tulojen summan. +SUMSQ = NELIÖSUMMA ## Palauttaa argumenttien neliöiden summan. +SUMX2MY2 = NELIÖSUMMIEN.EROTUS ## Palauttaa kahden matriisin toisiaan vastaavien arvojen laskettujen neliösummien erotuksen. +SUMX2PY2 = NELIÖSUMMIEN.SUMMA ## Palauttaa kahden matriisin toisiaan vastaavien arvojen neliösummien summan. +SUMXMY2 = EROTUSTEN.NELIÖSUMMA ## Palauttaa kahden matriisin toisiaan vastaavien arvojen erotusten neliösumman. +TAN = TAN ## Palauttaa luvun tangentin. +TANH = TANH ## Palauttaa luvun hyperbolisen tangentin. +TRUNC = KATKAISE ## Katkaisee luvun kokonaisluvuksi. + + +## +## Statistical functions Tilastolliset funktiot +## +AVEDEV = KESKIPOIKKEAMA ## Palauttaa hajontojen itseisarvojen keskiarvon. +AVERAGE = KESKIARVO ## Palauttaa argumenttien keskiarvon. +AVERAGEA = KESKIARVOA ## Palauttaa argumenttien, mukaan lukien lukujen, tekstin ja loogisten arvojen, keskiarvon. +AVERAGEIF = KESKIARVO.JOS ## Palauttaa alueen niiden solujen keskiarvon (aritmeettisen keskiarvon), jotka täyttävät annetut ehdot. +AVERAGEIFS = KESKIARVO.JOS.JOUKKO ## Palauttaa niiden solujen keskiarvon (aritmeettisen keskiarvon), jotka vastaavat useita ehtoja. +BETADIST = BEETAJAKAUMA ## Palauttaa kumulatiivisen beetajakaumafunktion arvon. +BETAINV = BEETAJAKAUMA.KÄÄNT ## Palauttaa määritetyn beetajakauman käänteisen kumulatiivisen jakaumafunktion arvon. +BINOMDIST = BINOMIJAKAUMA ## Palauttaa yksittäisen termin binomijakaumatodennäköisyyden. +CHIDIST = CHIJAKAUMA ## Palauttaa yksisuuntaisen chi-neliön jakauman todennäköisyyden. +CHIINV = CHIJAKAUMA.KÄÄNT ## Palauttaa yksisuuntaisen chi-neliön jakauman todennäköisyyden käänteisarvon. +CHITEST = CHITESTI ## Palauttaa riippumattomuustestin tuloksen. +CONFIDENCE = LUOTTAMUSVÄLI ## Palauttaa luottamusvälin populaation keskiarvolle. +CORREL = KORRELAATIO ## Palauttaa kahden arvojoukon korrelaatiokertoimen. +COUNT = LASKE ## Laskee argumenttiluettelossa olevien lukujen määrän. +COUNTA = LASKE.A ## Laskee argumenttiluettelossa olevien arvojen määrän. +COUNTBLANK = LASKE.TYHJÄT ## Laskee alueella olevien tyhjien solujen määrän. +COUNTIF = LASKE.JOS ## Laskee alueella olevien sellaisten solujen määrän, joiden sisältö vastaa annettuja ehtoja. +COUNTIFS = LASKE.JOS.JOUKKO ## Laskee alueella olevien sellaisten solujen määrän, joiden sisältö vastaa useita ehtoja. +COVAR = KOVARIANSSI ## Palauttaa kovarianssin, joka on keskiarvo havaintoaineiston kunkin pisteparin poikkeamien tuloista. +CRITBINOM = BINOMIJAKAUMA.KRIT ## Palauttaa pienimmän arvon, jossa binomijakauman kertymäfunktion arvo on pienempi tai yhtä suuri kuin vertailuarvo. +DEVSQ = OIKAISTU.NELIÖSUMMA ## Palauttaa keskipoikkeamien neliösumman. +EXPONDIST = EKSPONENTIAALIJAKAUMA ## Palauttaa eksponentiaalijakauman. +FDIST = FJAKAUMA ## Palauttaa F-todennäköisyysjakauman. +FINV = FJAKAUMA.KÄÄNT ## Palauttaa F-todennäköisyysjakauman käänteisfunktion. +FISHER = FISHER ## Palauttaa Fisher-muunnoksen. +FISHERINV = FISHER.KÄÄNT ## Palauttaa käänteisen Fisher-muunnoksen. +FORECAST = ENNUSTE ## Palauttaa lineaarisen trendin arvon. +FREQUENCY = TAAJUUS ## Palauttaa frekvenssijakautuman pystysuuntaisena matriisina. +FTEST = FTESTI ## Palauttaa F-testin tuloksen. +GAMMADIST = GAMMAJAKAUMA ## Palauttaa gammajakauman. +GAMMAINV = GAMMAJAKAUMA.KÄÄNT ## Palauttaa käänteisen gammajakauman kertymäfunktion. +GAMMALN = GAMMALN ## Palauttaa gammafunktion luonnollisen logaritmin G(x). +GEOMEAN = KESKIARVO.GEOM ## Palauttaa geometrisen keskiarvon. +GROWTH = KASVU ## Palauttaa eksponentiaalisen trendin arvon. +HARMEAN = KESKIARVO.HARM ## Palauttaa harmonisen keskiarvon. +HYPGEOMDIST = HYPERGEOM.JAKAUMA ## Palauttaa hypergeometrisen jakauman. +INTERCEPT = LEIKKAUSPISTE ## Palauttaa lineaarisen regressiosuoran leikkauspisteen. +KURT = KURT ## Palauttaa tietoalueen vinous-arvon eli huipukkuuden. +LARGE = SUURI ## Palauttaa tietojoukon k:nneksi suurimman arvon. +LINEST = LINREGR ## Palauttaa lineaarisen trendin parametrit. +LOGEST = LOGREGR ## Palauttaa eksponentiaalisen trendin parametrit. +LOGINV = LOGNORM.JAKAUMA.KÄÄNT ## Palauttaa lognormeeratun jakauman käänteisfunktion. +LOGNORMDIST = LOGNORM.JAKAUMA ## Palauttaa lognormaalisen jakauman kertymäfunktion. +MAX = MAKS ## Palauttaa suurimman arvon argumenttiluettelosta. +MAXA = MAKSA ## Palauttaa argumenttien, mukaan lukien lukujen, tekstin ja loogisten arvojen, suurimman arvon. +MEDIAN = MEDIAANI ## Palauttaa annettujen lukujen mediaanin. +MIN = MIN ## Palauttaa pienimmän arvon argumenttiluettelosta. +MINA = MINA ## Palauttaa argumenttien, mukaan lukien lukujen, tekstin ja loogisten arvojen, pienimmän arvon. +MODE = MOODI ## Palauttaa tietojoukossa useimmin esiintyvän arvon. +NEGBINOMDIST = BINOMIJAKAUMA.NEG ## Palauttaa negatiivisen binomijakauman. +NORMDIST = NORM.JAKAUMA ## Palauttaa normaalijakauman kertymäfunktion. +NORMINV = NORM.JAKAUMA.KÄÄNT ## Palauttaa käänteisen normaalijakauman kertymäfunktion. +NORMSDIST = NORM.JAKAUMA.NORMIT ## Palauttaa normitetun normaalijakauman kertymäfunktion. +NORMSINV = NORM.JAKAUMA.NORMIT.KÄÄNT ## Palauttaa normitetun normaalijakauman kertymäfunktion käänteisarvon. +PEARSON = PEARSON ## Palauttaa Pearsonin tulomomenttikorrelaatiokertoimen. +PERCENTILE = PROSENTTIPISTE ## Palauttaa alueen arvojen k:nnen prosenttipisteen. +PERCENTRANK = PROSENTTIJÄRJESTYS ## Palauttaa tietojoukon arvon prosentuaalisen järjestysluvun. +PERMUT = PERMUTAATIO ## Palauttaa mahdollisten permutaatioiden määrän annetulle objektien määrälle. +POISSON = POISSON ## Palauttaa Poissonin todennäköisyysjakauman. +PROB = TODENNÄKÖISYYS ## Palauttaa todennäköisyyden sille, että arvot ovat tietyltä väliltä. +QUARTILE = NELJÄNNES ## Palauttaa tietoalueen neljänneksen. +RANK = ARVON.MUKAAN ## Palauttaa luvun paikan lukuarvoluettelossa. +RSQ = PEARSON.NELIÖ ## Palauttaa Pearsonin tulomomenttikorrelaatiokertoimen neliön. +SKEW = JAKAUMAN.VINOUS ## Palauttaa jakauman vinouden. +SLOPE = KULMAKERROIN ## Palauttaa lineaarisen regressiosuoran kulmakertoimen. +SMALL = PIENI ## Palauttaa tietojoukon k:nneksi pienimmän arvon. +STANDARDIZE = NORMITA ## Palauttaa normitetun arvon. +STDEV = KESKIHAJONTA ## Laskee populaation keskihajonnan otoksen perusteella. +STDEVA = KESKIHAJONTAA ## Laskee populaation keskihajonnan otoksen perusteella, mukaan lukien luvut, tekstin ja loogiset arvot. +STDEVP = KESKIHAJONTAP ## Laskee normaalijakautuman koko populaation perusteella. +STDEVPA = KESKIHAJONTAPA ## Laskee populaation keskihajonnan koko populaation perusteella, mukaan lukien luvut, tekstin ja totuusarvot. +STEYX = KESKIVIRHE ## Palauttaa regression kutakin x-arvoa vastaavan ennustetun y-arvon keskivirheen. +TDIST = TJAKAUMA ## Palauttaa t-jakautuman. +TINV = TJAKAUMA.KÄÄNT ## Palauttaa käänteisen t-jakauman. +TREND = SUUNTAUS ## Palauttaa lineaarisen trendin arvoja. +TRIMMEAN = KESKIARVO.TASATTU ## Palauttaa tietojoukon tasatun keskiarvon. +TTEST = TTESTI ## Palauttaa t-testiin liittyvän todennäköisyyden. +VAR = VAR ## Arvioi populaation varianssia otoksen perusteella. +VARA = VARA ## Laskee populaation varianssin otoksen perusteella, mukaan lukien luvut, tekstin ja loogiset arvot. +VARP = VARP ## Laskee varianssin koko populaation perusteella. +VARPA = VARPA ## Laskee populaation varianssin koko populaation perusteella, mukaan lukien luvut, tekstin ja totuusarvot. +WEIBULL = WEIBULL ## Palauttaa Weibullin jakauman. +ZTEST = ZTESTI ## Palauttaa z-testin yksisuuntaisen todennäköisyysarvon. + + +## +## Text functions Tekstifunktiot +## +ASC = ASC ## Muuntaa merkkijonossa olevat englanninkieliset DBCS- tai katakana-merkit SBCS-merkeiksi. +BAHTTEXT = BAHTTEKSTI ## Muuntaa luvun tekstiksi ß (baht) -valuuttamuotoa käyttämällä. +CHAR = MERKKI ## Palauttaa koodin lukua vastaavan merkin. +CLEAN = SIIVOA ## Poistaa tekstistä kaikki tulostumattomat merkit. +CODE = KOODI ## Palauttaa tekstimerkkijonon ensimmäisen merkin numerokoodin. +CONCATENATE = KETJUTA ## Yhdistää useat merkkijonot yhdeksi merkkijonoksi. +DOLLAR = VALUUTTA ## Muuntaa luvun tekstiksi $ (dollari) -valuuttamuotoa käyttämällä. +EXACT = VERTAA ## Tarkistaa, ovatko kaksi tekstiarvoa samanlaiset. +FIND = ETSI ## Etsii tekstiarvon toisen tekstin sisältä (tunnistaa isot ja pienet kirjaimet). +FINDB = ETSIB ## Etsii tekstiarvon toisen tekstin sisältä (tunnistaa isot ja pienet kirjaimet). +FIXED = KIINTEÄ ## Muotoilee luvun tekstiksi, jossa on kiinteä määrä desimaaleja. +JIS = JIS ## Muuntaa merkkijonossa olevat englanninkieliset SBCS- tai katakana-merkit DBCS-merkeiksi. +LEFT = VASEN ## Palauttaa tekstiarvon vasemmanpuoliset merkit. +LEFTB = VASENB ## Palauttaa tekstiarvon vasemmanpuoliset merkit. +LEN = PITUUS ## Palauttaa tekstimerkkijonon merkkien määrän. +LENB = PITUUSB ## Palauttaa tekstimerkkijonon merkkien määrän. +LOWER = PIENET ## Muuntaa tekstin pieniksi kirjaimiksi. +MID = POIMI.TEKSTI ## Palauttaa määritetyn määrän merkkejä merkkijonosta alkaen annetusta kohdasta. +MIDB = POIMI.TEKSTIB ## Palauttaa määritetyn määrän merkkejä merkkijonosta alkaen annetusta kohdasta. +PHONETIC = FONEETTINEN ## Hakee foneettiset (furigana) merkit merkkijonosta. +PROPER = ERISNIMI ## Muuttaa merkkijonon kunkin sanan ensimmäisen kirjaimen isoksi. +REPLACE = KORVAA ## Korvaa tekstissä olevat merkit. +REPLACEB = KORVAAB ## Korvaa tekstissä olevat merkit. +REPT = TOISTA ## Toistaa tekstin annetun määrän kertoja. +RIGHT = OIKEA ## Palauttaa tekstiarvon oikeanpuoliset merkit. +RIGHTB = OIKEAB ## Palauttaa tekstiarvon oikeanpuoliset merkit. +SEARCH = KÄY.LÄPI ## Etsii tekstiarvon toisen tekstin sisältä (isot ja pienet kirjaimet tulkitaan samoiksi merkeiksi). +SEARCHB = KÄY.LÄPIB ## Etsii tekstiarvon toisen tekstin sisältä (isot ja pienet kirjaimet tulkitaan samoiksi merkeiksi). +SUBSTITUTE = VAIHDA ## Korvaa merkkijonossa olevan tekstin toisella. +T = T ## Muuntaa argumentit tekstiksi. +TEXT = TEKSTI ## Muotoilee luvun ja muuntaa sen tekstiksi. +TRIM = POISTA.VÄLIT ## Poistaa välilyönnit tekstistä. +UPPER = ISOT ## Muuntaa tekstin isoiksi kirjaimiksi. +VALUE = ARVO ## Muuntaa tekstiargumentin luvuksi. diff --git a/application/third_party/PHPExcel/PHPExcel/locale/fr/config b/application/third_party/PHPExcel/PHPExcel/locale/fr/config new file mode 100644 index 0000000..1f5db88 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/fr/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = € + + +## +## Excel Error Codes (For future use) +## +NULL = #NUL! +DIV0 = #DIV/0! +VALUE = #VALEUR! +REF = #REF! +NAME = #NOM? +NUM = #NOMBRE! +NA = #N/A diff --git a/application/third_party/PHPExcel/PHPExcel/locale/fr/functions b/application/third_party/PHPExcel/PHPExcel/locale/fr/functions new file mode 100644 index 0000000..03b80e5 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/fr/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Fonctions de complément et d’automatisation +## +GETPIVOTDATA = LIREDONNEESTABCROISDYNAMIQUE ## Renvoie les données stockées dans un rapport de tableau croisé dynamique. + + +## +## Cube functions Fonctions Cube +## +CUBEKPIMEMBER = MEMBREKPICUBE ## Renvoie un nom, une propriété et une mesure d’indicateur de performance clé et affiche le nom et la propriété dans la cellule. Un indicateur de performance clé est une mesure quantifiable, telle que la marge bénéficiaire brute mensuelle ou la rotation trimestrielle du personnel, utilisée pour évaluer les performances d’une entreprise. +CUBEMEMBER = MEMBRECUBE ## Renvoie un membre ou un uplet dans une hiérarchie de cubes. Utilisez cette fonction pour valider l’existence du membre ou de l’uplet dans le cube. +CUBEMEMBERPROPERTY = PROPRIETEMEMBRECUBE ## Renvoie la valeur d’une propriété de membre du cube. Utilisez cette fonction pour valider l’existence d’un nom de membre dans le cube et pour renvoyer la propriété spécifiée pour ce membre. +CUBERANKEDMEMBER = RANGMEMBRECUBE ## Renvoie le nième membre ou le membre placé à un certain rang dans un ensemble. Utilisez cette fonction pour renvoyer un ou plusieurs éléments d’un ensemble, tels que les meilleurs vendeurs ou les 10 meilleurs étudiants. +CUBESET = JEUCUBE ## Définit un ensemble calculé de membres ou d’uplets en envoyant une expression définie au cube sur le serveur qui crée l’ensemble et le renvoie à Microsoft Office Excel. +CUBESETCOUNT = NBJEUCUBE ## Renvoie le nombre d’éléments dans un jeu. +CUBEVALUE = VALEURCUBE ## Renvoie une valeur d’agrégation issue d’un cube. + + +## +## Database functions Fonctions de base de données +## +DAVERAGE = BDMOYENNE ## Renvoie la moyenne des entrées de base de données sélectionnées. +DCOUNT = BCOMPTE ## Compte le nombre de cellules d’une base de données qui contiennent des nombres. +DCOUNTA = BDNBVAL ## Compte les cellules non vides d’une base de données. +DGET = BDLIRE ## Extrait d’une base de données un enregistrement unique répondant aux critères spécifiés. +DMAX = BDMAX ## Renvoie la valeur maximale des entrées de base de données sélectionnées. +DMIN = BDMIN ## Renvoie la valeur minimale des entrées de base de données sélectionnées. +DPRODUCT = BDPRODUIT ## Multiplie les valeurs d’un champ particulier des enregistrements d’une base de données, qui répondent aux critères spécifiés. +DSTDEV = BDECARTYPE ## Calcule l’écart type pour un échantillon d’entrées de base de données sélectionnées. +DSTDEVP = BDECARTYPEP ## Calcule l’écart type pour l’ensemble d’une population d’entrées de base de données sélectionnées. +DSUM = BDSOMME ## Ajoute les nombres dans la colonne de champ des enregistrements de la base de données, qui répondent aux critères. +DVAR = BDVAR ## Calcule la variance pour un échantillon d’entrées de base de données sélectionnées. +DVARP = BDVARP ## Calcule la variance pour l’ensemble d’une population d’entrées de base de données sélectionnées. + + +## +## Date and time functions Fonctions de date et d’heure +## +DATE = DATE ## Renvoie le numéro de série d’une date précise. +DATEVALUE = DATEVAL ## Convertit une date représentée sous forme de texte en numéro de série. +DAY = JOUR ## Convertit un numéro de série en jour du mois. +DAYS360 = JOURS360 ## Calcule le nombre de jours qui séparent deux dates sur la base d’une année de 360 jours. +EDATE = MOIS.DECALER ## Renvoie le numéro séquentiel de la date qui représente une date spécifiée (l’argument date_départ), corrigée en plus ou en moins du nombre de mois indiqué. +EOMONTH = FIN.MOIS ## Renvoie le numéro séquentiel de la date du dernier jour du mois précédant ou suivant la date_départ du nombre de mois indiqué. +HOUR = HEURE ## Convertit un numéro de série en heure. +MINUTE = MINUTE ## Convertit un numéro de série en minute. +MONTH = MOIS ## Convertit un numéro de série en mois. +NETWORKDAYS = NB.JOURS.OUVRES ## Renvoie le nombre de jours ouvrés entiers compris entre deux dates. +NOW = MAINTENANT ## Renvoie le numéro de série de la date et de l’heure du jour. +SECOND = SECONDE ## Convertit un numéro de série en seconde. +TIME = TEMPS ## Renvoie le numéro de série d’une heure précise. +TIMEVALUE = TEMPSVAL ## Convertit une date représentée sous forme de texte en numéro de série. +TODAY = AUJOURDHUI ## Renvoie le numéro de série de la date du jour. +WEEKDAY = JOURSEM ## Convertit un numéro de série en jour de la semaine. +WEEKNUM = NO.SEMAINE ## Convertit un numéro de série en un numéro représentant l’ordre de la semaine dans l’année. +WORKDAY = SERIE.JOUR.OUVRE ## Renvoie le numéro de série de la date avant ou après le nombre de jours ouvrés spécifiés. +YEAR = ANNEE ## Convertit un numéro de série en année. +YEARFRAC = FRACTION.ANNEE ## Renvoie la fraction de l’année représentant le nombre de jours entre la date de début et la date de fin. + + +## +## Engineering functions Fonctions d’ingénierie +## +BESSELI = BESSELI ## Renvoie la fonction Bessel modifiée In(x). +BESSELJ = BESSELJ ## Renvoie la fonction Bessel Jn(x). +BESSELK = BESSELK ## Renvoie la fonction Bessel modifiée Kn(x). +BESSELY = BESSELY ## Renvoie la fonction Bessel Yn(x). +BIN2DEC = BINDEC ## Convertit un nombre binaire en nombre décimal. +BIN2HEX = BINHEX ## Convertit un nombre binaire en nombre hexadécimal. +BIN2OCT = BINOCT ## Convertit un nombre binaire en nombre octal. +COMPLEX = COMPLEXE ## Convertit des coefficients réel et imaginaire en un nombre complexe. +CONVERT = CONVERT ## Convertit un nombre d’une unité de mesure à une autre. +DEC2BIN = DECBIN ## Convertit un nombre décimal en nombre binaire. +DEC2HEX = DECHEX ## Convertit un nombre décimal en nombre hexadécimal. +DEC2OCT = DECOCT ## Convertit un nombre décimal en nombre octal. +DELTA = DELTA ## Teste l’égalité de deux nombres. +ERF = ERF ## Renvoie la valeur de la fonction d’erreur. +ERFC = ERFC ## Renvoie la valeur de la fonction d’erreur complémentaire. +GESTEP = SUP.SEUIL ## Teste si un nombre est supérieur à une valeur de seuil. +HEX2BIN = HEXBIN ## Convertit un nombre hexadécimal en nombre binaire. +HEX2DEC = HEXDEC ## Convertit un nombre hexadécimal en nombre décimal. +HEX2OCT = HEXOCT ## Convertit un nombre hexadécimal en nombre octal. +IMABS = COMPLEXE.MODULE ## Renvoie la valeur absolue (module) d’un nombre complexe. +IMAGINARY = COMPLEXE.IMAGINAIRE ## Renvoie le coefficient imaginaire d’un nombre complexe. +IMARGUMENT = COMPLEXE.ARGUMENT ## Renvoie l’argument thêta, un angle exprimé en radians. +IMCONJUGATE = COMPLEXE.CONJUGUE ## Renvoie le nombre complexe conjugué d’un nombre complexe. +IMCOS = IMCOS ## Renvoie le cosinus d’un nombre complexe. +IMDIV = COMPLEXE.DIV ## Renvoie le quotient de deux nombres complexes. +IMEXP = COMPLEXE.EXP ## Renvoie la fonction exponentielle d’un nombre complexe. +IMLN = COMPLEXE.LN ## Renvoie le logarithme népérien d’un nombre complexe. +IMLOG10 = COMPLEXE.LOG10 ## Calcule le logarithme en base 10 d’un nombre complexe. +IMLOG2 = COMPLEXE.LOG2 ## Calcule le logarithme en base 2 d’un nombre complexe. +IMPOWER = COMPLEXE.PUISSANCE ## Renvoie un nombre complexe élevé à une puissance entière. +IMPRODUCT = COMPLEXE.PRODUIT ## Renvoie le produit de plusieurs nombres complexes. +IMREAL = COMPLEXE.REEL ## Renvoie le coefficient réel d’un nombre complexe. +IMSIN = COMPLEXE.SIN ## Renvoie le sinus d’un nombre complexe. +IMSQRT = COMPLEXE.RACINE ## Renvoie la racine carrée d’un nombre complexe. +IMSUB = COMPLEXE.DIFFERENCE ## Renvoie la différence entre deux nombres complexes. +IMSUM = COMPLEXE.SOMME ## Renvoie la somme de plusieurs nombres complexes. +OCT2BIN = OCTBIN ## Convertit un nombre octal en nombre binaire. +OCT2DEC = OCTDEC ## Convertit un nombre octal en nombre décimal. +OCT2HEX = OCTHEX ## Convertit un nombre octal en nombre hexadécimal. + + +## +## Financial functions Fonctions financières +## +ACCRINT = INTERET.ACC ## Renvoie l’intérêt couru non échu d’un titre dont l’intérêt est perçu périodiquement. +ACCRINTM = INTERET.ACC.MAT ## Renvoie l’intérêt couru non échu d’un titre dont l’intérêt est perçu à l’échéance. +AMORDEGRC = AMORDEGRC ## Renvoie l’amortissement correspondant à chaque période comptable en utilisant un coefficient d’amortissement. +AMORLINC = AMORLINC ## Renvoie l’amortissement d’un bien à la fin d’une période fiscale donnée. +COUPDAYBS = NB.JOURS.COUPON.PREC ## Renvoie le nombre de jours entre le début de la période de coupon et la date de liquidation. +COUPDAYS = NB.JOURS.COUPONS ## Renvoie le nombre de jours pour la période du coupon contenant la date de liquidation. +COUPDAYSNC = NB.JOURS.COUPON.SUIV ## Renvoie le nombre de jours entre la date de liquidation et la date du coupon suivant la date de liquidation. +COUPNCD = DATE.COUPON.SUIV ## Renvoie la première date de coupon ultérieure à la date de règlement. +COUPNUM = NB.COUPONS ## Renvoie le nombre de coupons dus entre la date de règlement et la date d’échéance. +COUPPCD = DATE.COUPON.PREC ## Renvoie la date de coupon précédant la date de règlement. +CUMIPMT = CUMUL.INTER ## Renvoie l’intérêt cumulé payé sur un emprunt entre deux périodes. +CUMPRINC = CUMUL.PRINCPER ## Renvoie le montant cumulé des remboursements du capital d’un emprunt effectués entre deux périodes. +DB = DB ## Renvoie l’amortissement d’un bien pour une période spécifiée en utilisant la méthode de l’amortissement dégressif à taux fixe. +DDB = DDB ## Renvoie l’amortissement d’un bien pour toute période spécifiée, en utilisant la méthode de l’amortissement dégressif à taux double ou selon un coefficient à spécifier. +DISC = TAUX.ESCOMPTE ## Calcule le taux d’escompte d’une transaction. +DOLLARDE = PRIX.DEC ## Convertit un prix en euros, exprimé sous forme de fraction, en un prix en euros exprimé sous forme de nombre décimal. +DOLLARFR = PRIX.FRAC ## Convertit un prix en euros, exprimé sous forme de nombre décimal, en un prix en euros exprimé sous forme de fraction. +DURATION = DUREE ## Renvoie la durée, en années, d’un titre dont l’intérêt est perçu périodiquement. +EFFECT = TAUX.EFFECTIF ## Renvoie le taux d’intérêt annuel effectif. +FV = VC ## Renvoie la valeur future d’un investissement. +FVSCHEDULE = VC.PAIEMENTS ## Calcule la valeur future d’un investissement en appliquant une série de taux d’intérêt composites. +INTRATE = TAUX.INTERET ## Affiche le taux d’intérêt d’un titre totalement investi. +IPMT = INTPER ## Calcule le montant des intérêts d’un investissement pour une période donnée. +IRR = TRI ## Calcule le taux de rentabilité interne d’un investissement pour une succession de trésoreries. +ISPMT = ISPMT ## Calcule le montant des intérêts d’un investissement pour une période donnée. +MDURATION = DUREE.MODIFIEE ## Renvoie la durée de Macauley modifiée pour un titre ayant une valeur nominale hypothétique de 100_euros. +MIRR = TRIM ## Calcule le taux de rentabilité interne lorsque les paiements positifs et négatifs sont financés à des taux différents. +NOMINAL = TAUX.NOMINAL ## Calcule le taux d’intérêt nominal annuel. +NPER = NPM ## Renvoie le nombre de versements nécessaires pour rembourser un emprunt. +NPV = VAN ## Calcule la valeur actuelle nette d’un investissement basé sur une série de décaissements et un taux d’escompte. +ODDFPRICE = PRIX.PCOUPON.IRREG ## Renvoie le prix par tranche de valeur nominale de 100 euros d’un titre dont la première période de coupon est irrégulière. +ODDFYIELD = REND.PCOUPON.IRREG ## Renvoie le taux de rendement d’un titre dont la première période de coupon est irrégulière. +ODDLPRICE = PRIX.DCOUPON.IRREG ## Renvoie le prix par tranche de valeur nominale de 100 euros d’un titre dont la première période de coupon est irrégulière. +ODDLYIELD = REND.DCOUPON.IRREG ## Renvoie le taux de rendement d’un titre dont la dernière période de coupon est irrégulière. +PMT = VPM ## Calcule le paiement périodique d’un investissement donné. +PPMT = PRINCPER ## Calcule, pour une période donnée, la part de remboursement du principal d’un investissement. +PRICE = PRIX.TITRE ## Renvoie le prix d’un titre rapportant des intérêts périodiques, pour une valeur nominale de 100 euros. +PRICEDISC = VALEUR.ENCAISSEMENT ## Renvoie la valeur d’encaissement d’un escompte commercial, pour une valeur nominale de 100 euros. +PRICEMAT = PRIX.TITRE.ECHEANCE ## Renvoie le prix d’un titre dont la valeur nominale est 100 euros et qui rapporte des intérêts à l’échéance. +PV = PV ## Calcule la valeur actuelle d’un investissement. +RATE = TAUX ## Calcule le taux d’intérêt par période pour une annuité. +RECEIVED = VALEUR.NOMINALE ## Renvoie la valeur nominale à échéance d’un effet de commerce. +SLN = AMORLIN ## Calcule l’amortissement linéaire d’un bien pour une période donnée. +SYD = SYD ## Calcule l’amortissement d’un bien pour une période donnée sur la base de la méthode américaine Sum-of-Years Digits (amortissement dégressif à taux décroissant appliqué à une valeur constante). +TBILLEQ = TAUX.ESCOMPTE.R ## Renvoie le taux d’escompte rationnel d’un bon du Trésor. +TBILLPRICE = PRIX.BON.TRESOR ## Renvoie le prix d’un bon du Trésor d’une valeur nominale de 100 euros. +TBILLYIELD = RENDEMENT.BON.TRESOR ## Calcule le taux de rendement d’un bon du Trésor. +VDB = VDB ## Renvoie l’amortissement d’un bien pour une période spécifiée ou partielle en utilisant une méthode de l’amortissement dégressif à taux fixe. +XIRR = TRI.PAIEMENTS ## Calcule le taux de rentabilité interne d’un ensemble de paiements non périodiques. +XNPV = VAN.PAIEMENTS ## Renvoie la valeur actuelle nette d’un ensemble de paiements non périodiques. +YIELD = RENDEMENT.TITRE ## Calcule le rendement d’un titre rapportant des intérêts périodiquement. +YIELDDISC = RENDEMENT.SIMPLE ## Calcule le taux de rendement d’un emprunt à intérêt simple (par exemple, un bon du Trésor). +YIELDMAT = RENDEMENT.TITRE.ECHEANCE ## Renvoie le rendement annuel d’un titre qui rapporte des intérêts à l’échéance. + + +## +## Information functions Fonctions d’information +## +CELL = CELLULE ## Renvoie des informations sur la mise en forme, l’emplacement et le contenu d’une cellule. +ERROR.TYPE = TYPE.ERREUR ## Renvoie un nombre correspondant à un type d’erreur. +INFO = INFORMATIONS ## Renvoie des informations sur l’environnement d’exploitation actuel. +ISBLANK = ESTVIDE ## Renvoie VRAI si l’argument valeur est vide. +ISERR = ESTERR ## Renvoie VRAI si l’argument valeur fait référence à une valeur d’erreur, sauf #N/A. +ISERROR = ESTERREUR ## Renvoie VRAI si l’argument valeur fait référence à une valeur d’erreur. +ISEVEN = EST.PAIR ## Renvoie VRAI si le chiffre est pair. +ISLOGICAL = ESTLOGIQUE ## Renvoie VRAI si l’argument valeur fait référence à une valeur logique. +ISNA = ESTNA ## Renvoie VRAI si l’argument valeur fait référence à la valeur d’erreur #N/A. +ISNONTEXT = ESTNONTEXTE ## Renvoie VRAI si l’argument valeur ne se présente pas sous forme de texte. +ISNUMBER = ESTNUM ## Renvoie VRAI si l’argument valeur représente un nombre. +ISODD = EST.IMPAIR ## Renvoie VRAI si le chiffre est impair. +ISREF = ESTREF ## Renvoie VRAI si l’argument valeur est une référence. +ISTEXT = ESTTEXTE ## Renvoie VRAI si l’argument valeur se présente sous forme de texte. +N = N ## Renvoie une valeur convertie en nombre. +NA = NA ## Renvoie la valeur d’erreur #N/A. +TYPE = TYPE ## Renvoie un nombre indiquant le type de données d’une valeur. + + +## +## Logical functions Fonctions logiques +## +AND = ET ## Renvoie VRAI si tous ses arguments sont VRAI. +FALSE = FAUX ## Renvoie la valeur logique FAUX. +IF = SI ## Spécifie un test logique à effectuer. +IFERROR = SIERREUR ## Renvoie une valeur que vous spécifiez si une formule génère une erreur ; sinon, elle renvoie le résultat de la formule. +NOT = NON ## Inverse la logique de cet argument. +OR = OU ## Renvoie VRAI si un des arguments est VRAI. +TRUE = VRAI ## Renvoie la valeur logique VRAI. + + +## +## Lookup and reference functions Fonctions de recherche et de référence +## +ADDRESS = ADRESSE ## Renvoie une référence sous forme de texte à une seule cellule d’une feuille de calcul. +AREAS = ZONES ## Renvoie le nombre de zones dans une référence. +CHOOSE = CHOISIR ## Choisit une valeur dans une liste. +COLUMN = COLONNE ## Renvoie le numéro de colonne d’une référence. +COLUMNS = COLONNES ## Renvoie le nombre de colonnes dans une référence. +HLOOKUP = RECHERCHEH ## Effectue une recherche dans la première ligne d’une matrice et renvoie la valeur de la cellule indiquée. +HYPERLINK = LIEN_HYPERTEXTE ## Crée un raccourci ou un renvoi qui ouvre un document stocké sur un serveur réseau, sur un réseau Intranet ou sur Internet. +INDEX = INDEX ## Utilise un index pour choisir une valeur provenant d’une référence ou d’une matrice. +INDIRECT = INDIRECT ## Renvoie une référence indiquée par une valeur de texte. +LOOKUP = RECHERCHE ## Recherche des valeurs dans un vecteur ou une matrice. +MATCH = EQUIV ## Recherche des valeurs dans une référence ou une matrice. +OFFSET = DECALER ## Renvoie une référence décalée par rapport à une référence donnée. +ROW = LIGNE ## Renvoie le numéro de ligne d’une référence. +ROWS = LIGNES ## Renvoie le nombre de lignes dans une référence. +RTD = RTD ## Extrait les données en temps réel à partir d’un programme prenant en charge l’automation COM (Automation : utilisation des objets d'une application à partir d'une autre application ou d'un autre outil de développement. Autrefois appelée OLE Automation, Automation est une norme industrielle et une fonctionnalité du modèle d'objet COM (Component Object Model).). +TRANSPOSE = TRANSPOSE ## Renvoie la transposition d’une matrice. +VLOOKUP = RECHERCHEV ## Effectue une recherche dans la première colonne d’une matrice et se déplace sur la ligne pour renvoyer la valeur d’une cellule. + + +## +## Math and trigonometry functions Fonctions mathématiques et trigonométriques +## +ABS = ABS ## Renvoie la valeur absolue d’un nombre. +ACOS = ACOS ## Renvoie l’arccosinus d’un nombre. +ACOSH = ACOSH ## Renvoie le cosinus hyperbolique inverse d’un nombre. +ASIN = ASIN ## Renvoie l’arcsinus d’un nombre. +ASINH = ASINH ## Renvoie le sinus hyperbolique inverse d’un nombre. +ATAN = ATAN ## Renvoie l’arctangente d’un nombre. +ATAN2 = ATAN2 ## Renvoie l’arctangente des coordonnées x et y. +ATANH = ATANH ## Renvoie la tangente hyperbolique inverse d’un nombre. +CEILING = PLAFOND ## Arrondit un nombre au nombre entier le plus proche ou au multiple le plus proche de l’argument précision en s’éloignant de zéro. +COMBIN = COMBIN ## Renvoie le nombre de combinaisons que l’on peut former avec un nombre donné d’objets. +COS = COS ## Renvoie le cosinus d’un nombre. +COSH = COSH ## Renvoie le cosinus hyperbolique d’un nombre. +DEGREES = DEGRES ## Convertit des radians en degrés. +EVEN = PAIR ## Arrondit un nombre au nombre entier pair le plus proche en s’éloignant de zéro. +EXP = EXP ## Renvoie e élevé à la puissance d’un nombre donné. +FACT = FACT ## Renvoie la factorielle d’un nombre. +FACTDOUBLE = FACTDOUBLE ## Renvoie la factorielle double d’un nombre. +FLOOR = PLANCHER ## Arrondit un nombre en tendant vers 0 (zéro). +GCD = PGCD ## Renvoie le plus grand commun diviseur. +INT = ENT ## Arrondit un nombre à l’entier immédiatement inférieur. +LCM = PPCM ## Renvoie le plus petit commun multiple. +LN = LN ## Renvoie le logarithme népérien d’un nombre. +LOG = LOG ## Renvoie le logarithme d’un nombre dans la base spécifiée. +LOG10 = LOG10 ## Calcule le logarithme en base 10 d’un nombre. +MDETERM = DETERMAT ## Renvoie le déterminant d’une matrice. +MINVERSE = INVERSEMAT ## Renvoie la matrice inverse d’une matrice. +MMULT = PRODUITMAT ## Renvoie le produit de deux matrices. +MOD = MOD ## Renvoie le reste d’une division. +MROUND = ARRONDI.AU.MULTIPLE ## Donne l’arrondi d’un nombre au multiple spécifié. +MULTINOMIAL = MULTINOMIALE ## Calcule la multinomiale d’un ensemble de nombres. +ODD = IMPAIR ## Renvoie le nombre, arrondi à la valeur du nombre entier impair le plus proche en s’éloignant de zéro. +PI = PI ## Renvoie la valeur de pi. +POWER = PUISSANCE ## Renvoie la valeur du nombre élevé à une puissance. +PRODUCT = PRODUIT ## Multiplie ses arguments. +QUOTIENT = QUOTIENT ## Renvoie la partie entière du résultat d’une division. +RADIANS = RADIANS ## Convertit des degrés en radians. +RAND = ALEA ## Renvoie un nombre aléatoire compris entre 0 et 1. +RANDBETWEEN = ALEA.ENTRE.BORNES ## Renvoie un nombre aléatoire entre les nombres que vous spécifiez. +ROMAN = ROMAIN ## Convertit des chiffres arabes en chiffres romains, sous forme de texte. +ROUND = ARRONDI ## Arrondit un nombre au nombre de chiffres indiqué. +ROUNDDOWN = ARRONDI.INF ## Arrondit un nombre en tendant vers 0 (zéro). +ROUNDUP = ARRONDI.SUP ## Arrondit un nombre à l’entier supérieur, en s’éloignant de zéro. +SERIESSUM = SOMME.SERIES ## Renvoie la somme d’une série géométrique en s’appuyant sur la formule suivante : +SIGN = SIGNE ## Renvoie le signe d’un nombre. +SIN = SIN ## Renvoie le sinus d’un angle donné. +SINH = SINH ## Renvoie le sinus hyperbolique d’un nombre. +SQRT = RACINE ## Renvoie la racine carrée d’un nombre. +SQRTPI = RACINE.PI ## Renvoie la racine carrée de (nombre * pi). +SUBTOTAL = SOUS.TOTAL ## Renvoie un sous-total dans une liste ou une base de données. +SUM = SOMME ## Calcule la somme de ses arguments. +SUMIF = SOMME.SI ## Additionne les cellules spécifiées si elles répondent à un critère donné. +SUMIFS = SOMME.SI.ENS ## Ajoute les cellules d’une plage qui répondent à plusieurs critères. +SUMPRODUCT = SOMMEPROD ## Multiplie les valeurs correspondantes des matrices spécifiées et calcule la somme de ces produits. +SUMSQ = SOMME.CARRES ## Renvoie la somme des carrés des arguments. +SUMX2MY2 = SOMME.X2MY2 ## Renvoie la somme de la différence des carrés des valeurs correspondantes de deux matrices. +SUMX2PY2 = SOMME.X2PY2 ## Renvoie la somme de la somme des carrés des valeurs correspondantes de deux matrices. +SUMXMY2 = SOMME.XMY2 ## Renvoie la somme des carrés des différences entre les valeurs correspondantes de deux matrices. +TAN = TAN ## Renvoie la tangente d’un nombre. +TANH = TANH ## Renvoie la tangente hyperbolique d’un nombre. +TRUNC = TRONQUE ## Renvoie la partie entière d’un nombre. + + +## +## Statistical functions Fonctions statistiques +## +AVEDEV = ECART.MOYEN ## Renvoie la moyenne des écarts absolus observés dans la moyenne des points de données. +AVERAGE = MOYENNE ## Renvoie la moyenne de ses arguments. +AVERAGEA = AVERAGEA ## Renvoie la moyenne de ses arguments, nombres, texte et valeurs logiques inclus. +AVERAGEIF = MOYENNE.SI ## Renvoie la moyenne (arithmétique) de toutes les cellules d’une plage qui répondent à des critères donnés. +AVERAGEIFS = MOYENNE.SI.ENS ## Renvoie la moyenne (arithmétique) de toutes les cellules qui répondent à plusieurs critères. +BETADIST = LOI.BETA ## Renvoie la fonction de distribution cumulée. +BETAINV = BETA.INVERSE ## Renvoie l’inverse de la fonction de distribution cumulée pour une distribution bêta spécifiée. +BINOMDIST = LOI.BINOMIALE ## Renvoie la probabilité d’une variable aléatoire discrète suivant la loi binomiale. +CHIDIST = LOI.KHIDEUX ## Renvoie la probabilité unilatérale de la distribution khi-deux. +CHIINV = KHIDEUX.INVERSE ## Renvoie l’inverse de la probabilité unilatérale de la distribution khi-deux. +CHITEST = TEST.KHIDEUX ## Renvoie le test d’indépendance. +CONFIDENCE = INTERVALLE.CONFIANCE ## Renvoie l’intervalle de confiance pour une moyenne de population. +CORREL = COEFFICIENT.CORRELATION ## Renvoie le coefficient de corrélation entre deux séries de données. +COUNT = NB ## Détermine les nombres compris dans la liste des arguments. +COUNTA = NBVAL ## Détermine le nombre de valeurs comprises dans la liste des arguments. +COUNTBLANK = NB.VIDE ## Compte le nombre de cellules vides dans une plage. +COUNTIF = NB.SI ## Compte le nombre de cellules qui répondent à un critère donné dans une plage. +COUNTIFS = NB.SI.ENS ## Compte le nombre de cellules à l’intérieur d’une plage qui répondent à plusieurs critères. +COVAR = COVARIANCE ## Renvoie la covariance, moyenne des produits des écarts pour chaque série d’observations. +CRITBINOM = CRITERE.LOI.BINOMIALE ## Renvoie la plus petite valeur pour laquelle la distribution binomiale cumulée est inférieure ou égale à une valeur de critère. +DEVSQ = SOMME.CARRES.ECARTS ## Renvoie la somme des carrés des écarts. +EXPONDIST = LOI.EXPONENTIELLE ## Renvoie la distribution exponentielle. +FDIST = LOI.F ## Renvoie la distribution de probabilité F. +FINV = INVERSE.LOI.F ## Renvoie l’inverse de la distribution de probabilité F. +FISHER = FISHER ## Renvoie la transformation de Fisher. +FISHERINV = FISHER.INVERSE ## Renvoie l’inverse de la transformation de Fisher. +FORECAST = PREVISION ## Calcule une valeur par rapport à une tendance linéaire. +FREQUENCY = FREQUENCE ## Calcule la fréquence d’apparition des valeurs dans une plage de valeurs, puis renvoie des nombres sous forme de matrice verticale. +FTEST = TEST.F ## Renvoie le résultat d’un test F. +GAMMADIST = LOI.GAMMA ## Renvoie la probabilité d’une variable aléatoire suivant une loi Gamma. +GAMMAINV = LOI.GAMMA.INVERSE ## Renvoie, pour une probabilité donnée, la valeur d’une variable aléatoire suivant une loi Gamma. +GAMMALN = LNGAMMA ## Renvoie le logarithme népérien de la fonction Gamma, G(x) +GEOMEAN = MOYENNE.GEOMETRIQUE ## Renvoie la moyenne géométrique. +GROWTH = CROISSANCE ## Calcule des valeurs par rapport à une tendance exponentielle. +HARMEAN = MOYENNE.HARMONIQUE ## Renvoie la moyenne harmonique. +HYPGEOMDIST = LOI.HYPERGEOMETRIQUE ## Renvoie la probabilité d’une variable aléatoire discrète suivant une loi hypergéométrique. +INTERCEPT = ORDONNEE.ORIGINE ## Renvoie l’ordonnée à l’origine d’une droite de régression linéaire. +KURT = KURTOSIS ## Renvoie le kurtosis d’une série de données. +LARGE = GRANDE.VALEUR ## Renvoie la k-ième plus grande valeur d’une série de données. +LINEST = DROITEREG ## Renvoie les paramètres d’une tendance linéaire. +LOGEST = LOGREG ## Renvoie les paramètres d’une tendance exponentielle. +LOGINV = LOI.LOGNORMALE.INVERSE ## Renvoie l’inverse de la probabilité pour une variable aléatoire suivant la loi lognormale. +LOGNORMDIST = LOI.LOGNORMALE ## Renvoie la probabilité d’une variable aléatoire continue suivant une loi lognormale. +MAX = MAX ## Renvoie la valeur maximale contenue dans une liste d’arguments. +MAXA = MAXA ## Renvoie la valeur maximale d’une liste d’arguments, nombres, texte et valeurs logiques inclus. +MEDIAN = MEDIANE ## Renvoie la valeur médiane des nombres donnés. +MIN = MIN ## Renvoie la valeur minimale contenue dans une liste d’arguments. +MINA = MINA ## Renvoie la plus petite valeur d’une liste d’arguments, nombres, texte et valeurs logiques inclus. +MODE = MODE ## Renvoie la valeur la plus courante d’une série de données. +NEGBINOMDIST = LOI.BINOMIALE.NEG ## Renvoie la probabilité d’une variable aléatoire discrète suivant une loi binomiale négative. +NORMDIST = LOI.NORMALE ## Renvoie la probabilité d’une variable aléatoire continue suivant une loi normale. +NORMINV = LOI.NORMALE.INVERSE ## Renvoie, pour une probabilité donnée, la valeur d’une variable aléatoire suivant une loi normale standard. +NORMSDIST = LOI.NORMALE.STANDARD ## Renvoie la probabilité d’une variable aléatoire continue suivant une loi normale standard. +NORMSINV = LOI.NORMALE.STANDARD.INVERSE ## Renvoie l’inverse de la distribution cumulée normale standard. +PEARSON = PEARSON ## Renvoie le coefficient de corrélation d’échantillonnage de Pearson. +PERCENTILE = CENTILE ## Renvoie le k-ième centile des valeurs d’une plage. +PERCENTRANK = RANG.POURCENTAGE ## Renvoie le rang en pourcentage d’une valeur d’une série de données. +PERMUT = PERMUTATION ## Renvoie le nombre de permutations pour un nombre donné d’objets. +POISSON = LOI.POISSON ## Renvoie la probabilité d’une variable aléatoire suivant une loi de Poisson. +PROB = PROBABILITE ## Renvoie la probabilité que des valeurs d’une plage soient comprises entre deux limites. +QUARTILE = QUARTILE ## Renvoie le quartile d’une série de données. +RANK = RANG ## Renvoie le rang d’un nombre contenu dans une liste. +RSQ = COEFFICIENT.DETERMINATION ## Renvoie la valeur du coefficient de détermination R^2 d’une régression linéaire. +SKEW = COEFFICIENT.ASYMETRIE ## Renvoie l’asymétrie d’une distribution. +SLOPE = PENTE ## Renvoie la pente d’une droite de régression linéaire. +SMALL = PETITE.VALEUR ## Renvoie la k-ième plus petite valeur d’une série de données. +STANDARDIZE = CENTREE.REDUITE ## Renvoie une valeur centrée réduite. +STDEV = ECARTYPE ## Évalue l’écart type d’une population en se basant sur un échantillon de cette population. +STDEVA = STDEVA ## Évalue l’écart type d’une population en se basant sur un échantillon de cette population, nombres, texte et valeurs logiques inclus. +STDEVP = ECARTYPEP ## Calcule l’écart type d’une population à partir de la population entière. +STDEVPA = STDEVPA ## Calcule l’écart type d’une population à partir de l’ensemble de la population, nombres, texte et valeurs logiques inclus. +STEYX = ERREUR.TYPE.XY ## Renvoie l’erreur type de la valeur y prévue pour chaque x de la régression. +TDIST = LOI.STUDENT ## Renvoie la probabilité d’une variable aléatoire suivant une loi T de Student. +TINV = LOI.STUDENT.INVERSE ## Renvoie, pour une probabilité donnée, la valeur d’une variable aléatoire suivant une loi T de Student. +TREND = TENDANCE ## Renvoie des valeurs par rapport à une tendance linéaire. +TRIMMEAN = MOYENNE.REDUITE ## Renvoie la moyenne de l’intérieur d’une série de données. +TTEST = TEST.STUDENT ## Renvoie la probabilité associée à un test T de Student. +VAR = VAR ## Calcule la variance sur la base d’un échantillon. +VARA = VARA ## Estime la variance d’une population en se basant sur un échantillon de cette population, nombres, texte et valeurs logiques incluses. +VARP = VAR.P ## Calcule la variance sur la base de l’ensemble de la population. +VARPA = VARPA ## Calcule la variance d’une population en se basant sur la population entière, nombres, texte et valeurs logiques inclus. +WEIBULL = LOI.WEIBULL ## Renvoie la probabilité d’une variable aléatoire suivant une loi de Weibull. +ZTEST = TEST.Z ## Renvoie la valeur de probabilité unilatérale d’un test z. + + +## +## Text functions Fonctions de texte +## +ASC = ASC ## Change les caractères anglais ou katakana à pleine chasse (codés sur deux octets) à l’intérieur d’une chaîne de caractères en caractères à demi-chasse (codés sur un octet). +BAHTTEXT = BAHTTEXT ## Convertit un nombre en texte en utilisant le format monétaire ß (baht). +CHAR = CAR ## Renvoie le caractère spécifié par le code numérique. +CLEAN = EPURAGE ## Supprime tous les caractères de contrôle du texte. +CODE = CODE ## Renvoie le numéro de code du premier caractère du texte. +CONCATENATE = CONCATENER ## Assemble plusieurs éléments textuels de façon à n’en former qu’un seul. +DOLLAR = EURO ## Convertit un nombre en texte en utilisant le format monétaire € (euro). +EXACT = EXACT ## Vérifie si deux valeurs de texte sont identiques. +FIND = TROUVE ## Trouve un valeur textuelle dans une autre, en respectant la casse. +FINDB = TROUVERB ## Trouve un valeur textuelle dans une autre, en respectant la casse. +FIXED = CTXT ## Convertit un nombre au format texte avec un nombre de décimales spécifié. +JIS = JIS ## Change les caractères anglais ou katakana à demi-chasse (codés sur un octet) à l’intérieur d’une chaîne de caractères en caractères à à pleine chasse (codés sur deux octets). +LEFT = GAUCHE ## Renvoie des caractères situés à l’extrême gauche d’une chaîne de caractères. +LEFTB = GAUCHEB ## Renvoie des caractères situés à l’extrême gauche d’une chaîne de caractères. +LEN = NBCAR ## Renvoie le nombre de caractères contenus dans une chaîne de texte. +LENB = LENB ## Renvoie le nombre de caractères contenus dans une chaîne de texte. +LOWER = MINUSCULE ## Convertit le texte en minuscules. +MID = STXT ## Renvoie un nombre déterminé de caractères d’une chaîne de texte à partir de la position que vous indiquez. +MIDB = STXTB ## Renvoie un nombre déterminé de caractères d’une chaîne de texte à partir de la position que vous indiquez. +PHONETIC = PHONETIQUE ## Extrait les caractères phonétiques (furigana) d’une chaîne de texte. +PROPER = NOMPROPRE ## Met en majuscules la première lettre de chaque mot dans une chaîne textuelle. +REPLACE = REMPLACER ## Remplace des caractères dans un texte. +REPLACEB = REMPLACERB ## Remplace des caractères dans un texte. +REPT = REPT ## Répète un texte un certain nombre de fois. +RIGHT = DROITE ## Renvoie des caractères situés à l’extrême droite d’une chaîne de caractères. +RIGHTB = DROITEB ## Renvoie des caractères situés à l’extrême droite d’une chaîne de caractères. +SEARCH = CHERCHE ## Trouve un texte dans un autre texte (sans respecter la casse). +SEARCHB = CHERCHERB ## Trouve un texte dans un autre texte (sans respecter la casse). +SUBSTITUTE = SUBSTITUE ## Remplace l’ancien texte d’une chaîne de caractères par un nouveau. +T = T ## Convertit ses arguments en texte. +TEXT = TEXTE ## Convertit un nombre au format texte. +TRIM = SUPPRESPACE ## Supprime les espaces du texte. +UPPER = MAJUSCULE ## Convertit le texte en majuscules. +VALUE = CNUM ## Convertit un argument textuel en nombre diff --git a/application/third_party/PHPExcel/PHPExcel/locale/hu/config b/application/third_party/PHPExcel/PHPExcel/locale/hu/config new file mode 100644 index 0000000..080b201 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/hu/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = Ft + + +## +## Excel Error Codes (For future use) +## +NULL = #NULLA! +DIV0 = #ZÉRÓOSZTÓ! +VALUE = #ÉRTÉK! +REF = #HIV! +NAME = #NÉV? +NUM = #SZÁM! +NA = #HIÁNYZIK diff --git a/application/third_party/PHPExcel/PHPExcel/locale/hu/functions b/application/third_party/PHPExcel/PHPExcel/locale/hu/functions new file mode 100644 index 0000000..200d3f7 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/hu/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Bővítmények és automatizálási függvények +## +GETPIVOTDATA = KIMUTATÁSADATOT.VESZ ## A kimutatásokban tárolt adatok visszaadására használható. + + +## +## Cube functions Kockafüggvények +## +CUBEKPIMEMBER = KOCKA.FŐTELJMUT ## Egy fő teljesítménymutató (KPI) nevét, tulajdonságát és mértékegységét adja eredményül, a nevet és a tulajdonságot megjeleníti a cellában. A KPI-k számszerűsíthető mérési lehetőséget jelentenek – ilyen mutató például a havi bruttó nyereség vagy az egy alkalmazottra jutó negyedéves forgalom –, egy szervezet teljesítményének nyomonkövetésére használhatók. +CUBEMEMBER = KOCKA.TAG ## Kockahierachia tagját vagy rekordját adja eredményül. Ellenőrizhető vele, hogy szerepel-e a kockában az adott tag vagy rekord. +CUBEMEMBERPROPERTY = KOCKA.TAG.TUL ## A kocka egyik tagtulajdonságának értékét adja eredményül. Használatával ellenőrizhető, hogy szerepel-e egy tagnév a kockában, eredménye pedig az erre a tagra vonatkozó, megadott tulajdonság. +CUBERANKEDMEMBER = KOCKA.HALM.ELEM ## Egy halmaz rangsor szerinti n-edik tagját adja eredményül. Használatával egy halmaz egy vagy több elemét kaphatja meg, például a legnagyobb teljesítményű üzletkötőt vagy a 10 legjobb tanulót. +CUBESET = KOCKA.HALM ## Számított tagok vagy rekordok halmazát adja eredményül, ehhez egy beállított kifejezést elküld a kiszolgálón található kockának, majd ezt a halmazt adja vissza a Microsoft Office Excel alkalmazásnak. +CUBESETCOUNT = KOCKA.HALM.DB ## Egy halmaz elemszámát adja eredményül. +CUBEVALUE = KOCKA.ÉRTÉK ## Kockából összesített értéket ad eredményül. + + +## +## Database functions Adatbázis-kezelő függvények +## +DAVERAGE = AB.ÁTLAG ## A kijelölt adatbáziselemek átlagát számítja ki. +DCOUNT = AB.DARAB ## Megszámolja, hogy az adatbázisban hány cella tartalmaz számokat. +DCOUNTA = AB.DARAB2 ## Megszámolja az adatbázisban lévő nem üres cellákat. +DGET = AB.MEZŐ ## Egy adatbázisból egyetlen olyan rekordot ad vissza, amely megfelel a megadott feltételeknek. +DMAX = AB.MAX ## A kiválasztott adatbáziselemek közül a legnagyobb értéket adja eredményül. +DMIN = AB.MIN ## A kijelölt adatbáziselemek közül a legkisebb értéket adja eredményül. +DPRODUCT = AB.SZORZAT ## Az adatbázis megadott feltételeknek eleget tevő rekordjaira összeszorozza a megadott mezőben található számértékeket, és eredményül ezt a szorzatot adja. +DSTDEV = AB.SZÓRÁS ## A kijelölt adatbáziselemek egy mintája alapján megbecsüli a szórást. +DSTDEVP = AB.SZÓRÁS2 ## A kijelölt adatbáziselemek teljes sokasága alapján kiszámítja a szórást. +DSUM = AB.SZUM ## Összeadja a feltételnek megfelelő adatbázisrekordok mezőoszlopában a számokat. +DVAR = AB.VAR ## A kijelölt adatbáziselemek mintája alapján becslést ad a szórásnégyzetre. +DVARP = AB.VAR2 ## A kijelölt adatbáziselemek teljes sokasága alapján kiszámítja a szórásnégyzetet. + + +## +## Date and time functions Dátumfüggvények +## +DATE = DÁTUM ## Adott dátum dátumértékét adja eredményül. +DATEVALUE = DÁTUMÉRTÉK ## Szövegként megadott dátumot dátumértékké alakít át. +DAY = NAP ## Dátumértéket a hónap egy napjává (0-31) alakít. +DAYS360 = NAP360 ## Két dátum közé eső napok számát számítja ki a 360 napos év alapján. +EDATE = EDATE ## Adott dátumnál adott számú hónappal korábbi vagy későbbi dátum dátumértékét adja eredményül. +EOMONTH = EOMONTH ## Adott dátumnál adott számú hónappal korábbi vagy későbbi hónap utolsó napjának dátumértékét adja eredményül. +HOUR = ÓRA ## Időértéket órákká alakít. +MINUTE = PERC ## Időértéket percekké alakít. +MONTH = HÓNAP ## Időértéket hónapokká alakít. +NETWORKDAYS = NETWORKDAYS ## Két dátum között a teljes munkanapok számát adja meg. +NOW = MOST ## A napi dátum dátumértékét és a pontos idő időértékét adja eredményül. +SECOND = MPERC ## Időértéket másodpercekké alakít át. +TIME = IDŐ ## Adott időpont időértékét adja meg. +TIMEVALUE = IDŐÉRTÉK ## Szövegként megadott időpontot időértékké alakít át. +TODAY = MA ## A napi dátum dátumértékét adja eredményül. +WEEKDAY = HÉT.NAPJA ## Dátumértéket a hét napjává alakítja át. +WEEKNUM = WEEKNUM ## Visszatérési értéke egy szám, amely azt mutatja meg, hogy a megadott dátum az év hányadik hetére esik. +WORKDAY = WORKDAY ## Adott dátumnál adott munkanappal korábbi vagy későbbi dátum dátumértékét adja eredményül. +YEAR = ÉV ## Sorszámot évvé alakít át. +YEARFRAC = YEARFRAC ## Az adott dátumok közötti teljes napok számát törtévként adja meg. + + +## +## Engineering functions Mérnöki függvények +## +BESSELI = BESSELI ## Az In(x) módosított Bessel-függvény értékét adja eredményül. +BESSELJ = BESSELJ ## A Jn(x) Bessel-függvény értékét adja eredményül. +BESSELK = BESSELK ## A Kn(x) módosított Bessel-függvény értékét adja eredményül. +BESSELY = BESSELY ## Az Yn(x) módosított Bessel-függvény értékét adja eredményül. +BIN2DEC = BIN2DEC ## Bináris számot decimálissá alakít át. +BIN2HEX = BIN2HEX ## Bináris számot hexadecimálissá alakít át. +BIN2OCT = BIN2OCT ## Bináris számot oktálissá alakít át. +COMPLEX = COMPLEX ## Valós és képzetes részből komplex számot képez. +CONVERT = CONVERT ## Mértékegységeket vált át. +DEC2BIN = DEC2BIN ## Decimális számot binárissá alakít át. +DEC2HEX = DEC2HEX ## Decimális számot hexadecimálissá alakít át. +DEC2OCT = DEC2OCT ## Decimális számot oktálissá alakít át. +DELTA = DELTA ## Azt vizsgálja, hogy két érték egyenlő-e. +ERF = ERF ## A hibafüggvény értékét adja eredményül. +ERFC = ERFC ## A kiegészített hibafüggvény értékét adja eredményül. +GESTEP = GESTEP ## Azt vizsgálja, hogy egy szám nagyobb-e adott küszöbértéknél. +HEX2BIN = HEX2BIN ## Hexadecimális számot binárissá alakít át. +HEX2DEC = HEX2DEC ## Hexadecimális számot decimálissá alakít át. +HEX2OCT = HEX2OCT ## Hexadecimális számot oktálissá alakít át. +IMABS = IMABS ## Komplex szám abszolút értékét (modulusát) adja eredményül. +IMAGINARY = IMAGINARY ## Komplex szám képzetes részét adja eredményül. +IMARGUMENT = IMARGUMENT ## A komplex szám radiánban kifejezett théta argumentumát adja eredményül. +IMCONJUGATE = IMCONJUGATE ## Komplex szám komplex konjugáltját adja eredményül. +IMCOS = IMCOS ## Komplex szám koszinuszát adja eredményül. +IMDIV = IMDIV ## Két komplex szám hányadosát adja eredményül. +IMEXP = IMEXP ## Az e szám komplex kitevőjű hatványát adja eredményül. +IMLN = IMLN ## Komplex szám természetes logaritmusát adja eredményül. +IMLOG10 = IMLOG10 ## Komplex szám tízes alapú logaritmusát adja eredményül. +IMLOG2 = IMLOG2 ## Komplex szám kettes alapú logaritmusát adja eredményül. +IMPOWER = IMPOWER ## Komplex szám hatványát adja eredményül. +IMPRODUCT = IMPRODUCT ## Komplex számok szorzatát adja eredményül. +IMREAL = IMREAL ## Komplex szám valós részét adja eredményül. +IMSIN = IMSIN ## Komplex szám szinuszát adja eredményül. +IMSQRT = IMSQRT ## Komplex szám négyzetgyökét adja eredményül. +IMSUB = IMSUB ## Két komplex szám különbségét adja eredményül. +IMSUM = IMSUM ## Komplex számok összegét adja eredményül. +OCT2BIN = OCT2BIN ## Oktális számot binárissá alakít át. +OCT2DEC = OCT2DEC ## Oktális számot decimálissá alakít át. +OCT2HEX = OCT2HEX ## Oktális számot hexadecimálissá alakít át. + + +## +## Financial functions Pénzügyi függvények +## +ACCRINT = ACCRINT ## Periodikusan kamatozó értékpapír felszaporodott kamatát adja eredményül. +ACCRINTM = ACCRINTM ## Lejáratkor kamatozó értékpapír felszaporodott kamatát adja eredményül. +AMORDEGRC = AMORDEGRC ## Állóeszköz lineáris értékcsökkenését adja meg az egyes könyvelési időszakokra vonatkozóan. +AMORLINC = AMORLINC ## Az egyes könyvelési időszakokban az értékcsökkenést adja meg. +COUPDAYBS = COUPDAYBS ## A szelvényidőszak kezdetétől a kifizetés időpontjáig eltelt napokat adja vissza. +COUPDAYS = COUPDAYS ## A kifizetés időpontját magában foglaló szelvényperiódus hosszát adja meg napokban. +COUPDAYSNC = COUPDAYSNC ## A kifizetés időpontja és a legközelebbi szelvénydátum közötti napok számát adja meg. +COUPNCD = COUPNCD ## A kifizetést követő legelső szelvénydátumot adja eredményül. +COUPNUM = COUPNUM ## A kifizetés és a lejárat időpontja között kifizetendő szelvények számát adja eredményül. +COUPPCD = COUPPCD ## A kifizetés előtti utolsó szelvénydátumot adja eredményül. +CUMIPMT = CUMIPMT ## Két fizetési időszak között kifizetett kamat halmozott értékét adja eredményül. +CUMPRINC = CUMPRINC ## Két fizetési időszak között kifizetett részletek halmozott (kamatot nem tartalmazó) értékét adja eredményül. +DB = KCS2 ## Eszköz adott időszak alatti értékcsökkenését számítja ki a lineáris leírási modell alkalmazásával. +DDB = KCSA ## Eszköz értékcsökkenését számítja ki adott időszakra vonatkozóan a progresszív vagy egyéb megadott leírási modell alkalmazásával. +DISC = DISC ## Értékpapír leszámítolási kamatlábát adja eredményül. +DOLLARDE = DOLLARDE ## Egy közönséges törtként megadott számot tizedes törtté alakít át. +DOLLARFR = DOLLARFR ## Tizedes törtként megadott számot közönséges törtté alakít át. +DURATION = DURATION ## Periodikus kamatfizetésű értékpapír éves kamatérzékenységét adja eredményül. +EFFECT = EFFECT ## Az éves tényleges kamatláb értékét adja eredményül. +FV = JBÉ ## Befektetés jövőbeli értékét számítja ki. +FVSCHEDULE = FVSCHEDULE ## A kezdőtőke adott kamatlábak szerint megnövelt jövőbeli értékét adja eredményül. +INTRATE = INTRATE ## A lejáratig teljesen lekötött értékpapír kamatrátáját adja eredményül. +IPMT = RRÉSZLET ## Hiteltörlesztésen belül a tőketörlesztés nagyságát számítja ki adott időszakra. +IRR = BMR ## A befektetés belső megtérülési rátáját számítja ki pénzáramláshoz. +ISPMT = LRÉSZLETKAMAT ## A befektetés adott időszakára fizetett kamatot számítja ki. +MDURATION = MDURATION ## Egy 100 Ft névértékű értékpapír Macauley-féle módosított kamatérzékenységét adja eredményül. +MIRR = MEGTÉRÜLÉS ## A befektetés belső megtérülési rátáját számítja ki a költségek és a bevételek különböző kamatlába mellett. +NOMINAL = NOMINAL ## Az éves névleges kamatláb értékét adja eredményül. +NPER = PER.SZÁM ## A törlesztési időszakok számát adja meg. +NPV = NMÉ ## Befektetéshez kapcsolódó pénzáramlás nettó jelenértékét számítja ki ismert pénzáramlás és kamatláb mellett. +ODDFPRICE = ODDFPRICE ## Egy 100 Ft névértékű, a futamidő elején töredék-időszakos értékpapír árát adja eredményül. +ODDFYIELD = ODDFYIELD ## A futamidő elején töredék-időszakos értékpapír hozamát adja eredményül. +ODDLPRICE = ODDLPRICE ## Egy 100 Ft névértékű, a futamidő végén töredék-időszakos értékpapír árát adja eredményül. +ODDLYIELD = ODDLYIELD ## A futamidő végén töredék-időszakos értékpapír hozamát adja eredményül. +PMT = RÉSZLET ## A törlesztési időszakra vonatkozó törlesztési összeget számítja ki. +PPMT = PRÉSZLET ## Hiteltörlesztésen belül a tőketörlesztés nagyságát számítja ki adott időszakra. +PRICE = PRICE ## Egy 100 Ft névértékű, periodikusan kamatozó értékpapír árát adja eredményül. +PRICEDISC = PRICEDISC ## Egy 100 Ft névértékű leszámítolt értékpapír árát adja eredményül. +PRICEMAT = PRICEMAT ## Egy 100 Ft névértékű, a lejáratkor kamatozó értékpapír árát adja eredményül. +PV = MÉ ## Befektetés jelenlegi értékét számítja ki. +RATE = RÁTA ## Egy törlesztési időszakban az egy időszakra eső kamatláb nagyságát számítja ki. +RECEIVED = RECEIVED ## A lejáratig teljesen lekötött értékpapír lejáratakor kapott összegét adja eredményül. +SLN = LCSA ## Tárgyi eszköz egy időszakra eső amortizációját adja meg bruttó érték szerinti lineáris leírási kulcsot alkalmazva. +SYD = SYD ## Tárgyi eszköz értékcsökkenését számítja ki adott időszakra az évek számjegyösszegével dolgozó módszer alapján. +TBILLEQ = TBILLEQ ## Kincstárjegy kötvény-egyenértékű hozamát adja eredményül. +TBILLPRICE = TBILLPRICE ## Egy 100 Ft névértékű kincstárjegy árát adja eredményül. +TBILLYIELD = TBILLYIELD ## Kincstárjegy hozamát adja eredményül. +VDB = ÉCSRI ## Tárgyi eszköz amortizációját számítja ki megadott vagy részidőszakra a csökkenő egyenleg módszerének alkalmazásával. +XIRR = XIRR ## Ütemezett készpénzforgalom (cash flow) belső megtérülési kamatrátáját adja eredményül. +XNPV = XNPV ## Ütemezett készpénzforgalom (cash flow) nettó jelenlegi értékét adja eredményül. +YIELD = YIELD ## Periodikusan kamatozó értékpapír hozamát adja eredményül. +YIELDDISC = YIELDDISC ## Leszámítolt értékpapír (például kincstárjegy) éves hozamát adja eredményül. +YIELDMAT = YIELDMAT ## Lejáratkor kamatozó értékpapír éves hozamát adja eredményül. + + +## +## Information functions Információs függvények +## +CELL = CELLA ## Egy cella formátumára, elhelyezkedésére vagy tartalmára vonatkozó adatokat ad eredményül. +ERROR.TYPE = HIBA.TÍPUS ## Egy hibatípushoz tartozó számot ad eredményül. +INFO = INFÓ ## A rendszer- és munkakörnyezet pillanatnyi állapotáról ad felvilágosítást. +ISBLANK = ÜRES ## Eredménye IGAZ, ha az érték üres. +ISERR = HIBA ## Eredménye IGAZ, ha az érték valamelyik hibaérték a #HIÁNYZIK kivételével. +ISERROR = HIBÁS ## Eredménye IGAZ, ha az érték valamelyik hibaérték. +ISEVEN = ISEVEN ## Eredménye IGAZ, ha argumentuma páros szám. +ISLOGICAL = LOGIKAI ## Eredménye IGAZ, ha az érték logikai érték. +ISNA = NINCS ## Eredménye IGAZ, ha az érték a #HIÁNYZIK hibaérték. +ISNONTEXT = NEM.SZÖVEG ## Eredménye IGAZ, ha az érték nem szöveg. +ISNUMBER = SZÁM ## Eredménye IGAZ, ha az érték szám. +ISODD = ISODD ## Eredménye IGAZ, ha argumentuma páratlan szám. +ISREF = HIVATKOZÁS ## Eredménye IGAZ, ha az érték hivatkozás. +ISTEXT = SZÖVEG.E ## Eredménye IGAZ, ha az érték szöveg. +N = N ## Argumentumának értékét számmá alakítja. +NA = HIÁNYZIK ## Eredménye a #HIÁNYZIK hibaérték. +TYPE = TÍPUS ## Érték adattípusának azonosítószámát adja eredményül. + + +## +## Logical functions Logikai függvények +## +AND = ÉS ## Eredménye IGAZ, ha minden argumentuma IGAZ. +FALSE = HAMIS ## A HAMIS logikai értéket adja eredményül. +IF = HA ## Logikai vizsgálatot hajt végre. +IFERROR = HAHIBA ## A megadott értéket adja vissza, ha egy képlet hibához vezet; más esetben a képlet értékét adja eredményül. +NOT = NEM ## Argumentuma értékének ellentettjét adja eredményül. +OR = VAGY ## Eredménye IGAZ, ha bármely argumentuma IGAZ. +TRUE = IGAZ ## Az IGAZ logikai értéket adja eredményül. + + +## +## Lookup and reference functions Keresési és hivatkozási függvények +## +ADDRESS = CÍM ## A munkalap egy cellájára való hivatkozást adja szövegként eredményül. +AREAS = TERÜLET ## Hivatkozásban a területek számát adja eredményül. +CHOOSE = VÁLASZT ## Értékek listájából választ ki egy elemet. +COLUMN = OSZLOP ## Egy hivatkozás oszlopszámát adja eredményül. +COLUMNS = OSZLOPOK ## A hivatkozásban található oszlopok számát adja eredményül. +HLOOKUP = VKERES ## A megadott tömb felső sorában adott értékű elemet keres, és a megtalált elem oszlopából adott sorban elhelyezkedő értékkel tér vissza. +HYPERLINK = HIPERHIVATKOZÁS ## Hálózati kiszolgálón, intraneten vagy az interneten tárolt dokumentumot megnyitó parancsikont vagy hivatkozást hoz létre. +INDEX = INDEX ## Tömb- vagy hivatkozás indexszel megadott értékét adja vissza. +INDIRECT = INDIREKT ## Szöveg megadott hivatkozást ad eredményül. +LOOKUP = KERES ## Vektorban vagy tömbben keres meg értékeket. +MATCH = HOL.VAN ## Hivatkozásban vagy tömbben értékeket keres. +OFFSET = OFSZET ## Hivatkozás egy másik hivatkozástól számított távolságát adja meg. +ROW = SOR ## Egy hivatkozás sorának számát adja meg. +ROWS = SOROK ## Egy hivatkozás sorainak számát adja meg. +RTD = RTD ## Valós idejű adatokat keres vissza a COM automatizmust (automatizálás: Egy alkalmazás objektumaival való munka másik alkalmazásból vagy fejlesztőeszközből. A korábban OLE automatizmusnak nevezett automatizálás iparági szabvány, a Component Object Model (COM) szolgáltatása.) támogató programból. +TRANSPOSE = TRANSZPONÁLÁS ## Egy tömb transzponáltját adja eredményül. +VLOOKUP = FKERES ## A megadott tömb bal szélső oszlopában megkeres egy értéket, majd annak sora és a megadott oszlop metszéspontjában levő értéked adja eredményül. + + +## +## Math and trigonometry functions Matematikai és trigonometrikus függvények +## +ABS = ABS ## Egy szám abszolút értékét adja eredményül. +ACOS = ARCCOS ## Egy szám arkusz koszinuszát számítja ki. +ACOSH = ACOSH ## Egy szám inverz koszinusz hiperbolikuszát számítja ki. +ASIN = ARCSIN ## Egy szám arkusz szinuszát számítja ki. +ASINH = ASINH ## Egy szám inverz szinusz hiperbolikuszát számítja ki. +ATAN = ARCTAN ## Egy szám arkusz tangensét számítja ki. +ATAN2 = ARCTAN2 ## X és y koordináták alapján számítja ki az arkusz tangens értéket. +ATANH = ATANH ## A szám inverz tangens hiperbolikuszát számítja ki. +CEILING = PLAFON ## Egy számot a legközelebbi egészre vagy a pontosságként megadott érték legközelebb eső többszörösére kerekít. +COMBIN = KOMBINÁCIÓK ## Adott számú objektum összes lehetséges kombinációinak számát számítja ki. +COS = COS ## Egy szám koszinuszát számítja ki. +COSH = COSH ## Egy szám koszinusz hiperbolikuszát számítja ki. +DEGREES = FOK ## Radiánt fokká alakít át. +EVEN = PÁROS ## Egy számot a legközelebbi páros egész számra kerekít. +EXP = KITEVŐ ## Az e adott kitevőjű hatványát adja eredményül. +FACT = FAKT ## Egy szám faktoriálisát számítja ki. +FACTDOUBLE = FACTDOUBLE ## Egy szám dupla faktoriálisát adja eredményül. +FLOOR = PADLÓ ## Egy számot lefelé, a nulla felé kerekít. +GCD = GCD ## A legnagyobb közös osztót adja eredményül. +INT = INT ## Egy számot lefelé kerekít a legközelebbi egészre. +LCM = LCM ## A legkisebb közös többszöröst adja eredményül. +LN = LN ## Egy szám természetes logaritmusát számítja ki. +LOG = LOG ## Egy szám adott alapú logaritmusát számítja ki. +LOG10 = LOG10 ## Egy szám 10-es alapú logaritmusát számítja ki. +MDETERM = MDETERM ## Egy tömb mátrix-determinánsát számítja ki. +MINVERSE = INVERZ.MÁTRIX ## Egy tömb mátrix inverzét adja eredményül. +MMULT = MSZORZAT ## Két tömb mátrix-szorzatát adja meg. +MOD = MARADÉK ## Egy szám osztási maradékát adja eredményül. +MROUND = MROUND ## A kívánt többszörösére kerekített értéket ad eredményül. +MULTINOMIAL = MULTINOMIAL ## Számhalmaz multinomiálisát adja eredményül. +ODD = PÁRATLAN ## Egy számot a legközelebbi páratlan számra kerekít. +PI = PI ## A pi matematikai állandót adja vissza. +POWER = HATVÁNY ## Egy szám adott kitevőjű hatványát számítja ki. +PRODUCT = SZORZAT ## Argumentumai szorzatát számítja ki. +QUOTIENT = QUOTIENT ## Egy hányados egész részét adja eredményül. +RADIANS = RADIÁN ## Fokot radiánná alakít át. +RAND = VÉL ## Egy 0 és 1 közötti véletlen számot ad eredményül. +RANDBETWEEN = RANDBETWEEN ## Megadott számok közé eső véletlen számot állít elő. +ROMAN = RÓMAI ## Egy számot római számokkal kifejezve szövegként ad eredményül. +ROUND = KEREKÍTÉS ## Egy számot adott számú számjegyre kerekít. +ROUNDDOWN = KEREKÍTÉS.LE ## Egy számot lefelé, a nulla felé kerekít. +ROUNDUP = KEREKÍTÉS.FEL ## Egy számot felfelé, a nullától távolabbra kerekít. +SERIESSUM = SERIESSUM ## Hatványsor összegét adja eredményül. +SIGN = ELŐJEL ## Egy szám előjelét adja meg. +SIN = SIN ## Egy szög szinuszát számítja ki. +SINH = SINH ## Egy szám szinusz hiperbolikuszát számítja ki. +SQRT = GYÖK ## Egy szám pozitív négyzetgyökét számítja ki. +SQRTPI = SQRTPI ## A (szám*pi) négyzetgyökét adja eredményül. +SUBTOTAL = RÉSZÖSSZEG ## Lista vagy adatbázis részösszegét adja eredményül. +SUM = SZUM ## Összeadja az argumentumlistájában lévő számokat. +SUMIF = SZUMHA ## A megadott feltételeknek eleget tevő cellákban található értékeket adja össze. +SUMIFS = SZUMHATÖBB ## Több megadott feltételnek eleget tévő tartománycellák összegét adja eredményül. +SUMPRODUCT = SZORZATÖSSZEG ## A megfelelő tömbelemek szorzatának összegét számítja ki. +SUMSQ = NÉGYZETÖSSZEG ## Argumentumai négyzetének összegét számítja ki. +SUMX2MY2 = SZUMX2BŐLY2 ## Két tömb megfelelő elemei négyzetének különbségét összegzi. +SUMX2PY2 = SZUMX2MEGY2 ## Két tömb megfelelő elemei négyzetének összegét összegzi. +SUMXMY2 = SZUMXBŐLY2 ## Két tömb megfelelő elemei különbségének négyzetösszegét számítja ki. +TAN = TAN ## Egy szám tangensét számítja ki. +TANH = TANH ## Egy szám tangens hiperbolikuszát számítja ki. +TRUNC = CSONK ## Egy számot egésszé csonkít. + + +## +## Statistical functions Statisztikai függvények +## +AVEDEV = ÁTL.ELTÉRÉS ## Az adatpontoknak átlaguktól való átlagos abszolút eltérését számítja ki. +AVERAGE = ÁTLAG ## Argumentumai átlagát számítja ki. +AVERAGEA = ÁTLAGA ## Argumentumai átlagát számítja ki (beleértve a számokat, szöveget és logikai értékeket). +AVERAGEIF = ÁTLAGHA ## A megadott feltételnek eleget tévő tartomány celláinak átlagát (számtani közepét) adja eredményül. +AVERAGEIFS = ÁTLAGHATÖBB ## A megadott feltételeknek eleget tévő cellák átlagát (számtani közepét) adja eredményül. +BETADIST = BÉTA.ELOSZLÁS ## A béta-eloszlás függvényt számítja ki. +BETAINV = INVERZ.BÉTA ## Adott béta-eloszláshoz kiszámítja a béta eloszlásfüggvény inverzét. +BINOMDIST = BINOM.ELOSZLÁS ## A diszkrét binomiális eloszlás valószínűségértékét számítja ki. +CHIDIST = KHI.ELOSZLÁS ## A khi-négyzet-eloszlás egyszélű valószínűségértékét számítja ki. +CHIINV = INVERZ.KHI ## A khi-négyzet-eloszlás egyszélű valószínűségértékének inverzét számítja ki. +CHITEST = KHI.PRÓBA ## Függetlenségvizsgálatot hajt végre. +CONFIDENCE = MEGBÍZHATÓSÁG ## Egy statisztikai sokaság várható értékének megbízhatósági intervallumát adja eredményül. +CORREL = KORREL ## Két adathalmaz korrelációs együtthatóját számítja ki. +COUNT = DARAB ## Megszámolja, hogy argumentumlistájában hány szám található. +COUNTA = DARAB2 ## Megszámolja, hogy argumentumlistájában hány érték található. +COUNTBLANK = DARABÜRES ## Egy tartományban összeszámolja az üres cellákat. +COUNTIF = DARABTELI ## Egy tartományban összeszámolja azokat a cellákat, amelyek eleget tesznek a megadott feltételnek. +COUNTIFS = DARABHATÖBB ## Egy tartományban összeszámolja azokat a cellákat, amelyek eleget tesznek több feltételnek. +COVAR = KOVAR ## A kovarianciát, azaz a páronkénti eltérések szorzatának átlagát számítja ki. +CRITBINOM = KRITBINOM ## Azt a legkisebb számot adja eredményül, amelyre a binomiális eloszlásfüggvény értéke nem kisebb egy adott határértéknél. +DEVSQ = SQ ## Az átlagtól való eltérések négyzetének összegét számítja ki. +EXPONDIST = EXP.ELOSZLÁS ## Az exponenciális eloszlás értékét számítja ki. +FDIST = F.ELOSZLÁS ## Az F-eloszlás értékét számítja ki. +FINV = INVERZ.F ## Az F-eloszlás inverzének értékét számítja ki. +FISHER = FISHER ## Fisher-transzformációt hajt végre. +FISHERINV = INVERZ.FISHER ## A Fisher-transzformáció inverzét hajtja végre. +FORECAST = ELŐREJELZÉS ## Az ismert értékek alapján lineáris regresszióval becsült értéket ad eredményül. +FREQUENCY = GYAKORISÁG ## A gyakorisági vagy empirikus eloszlás értékét függőleges tömbként adja eredményül. +FTEST = F.PRÓBA ## Az F-próba értékét adja eredményül. +GAMMADIST = GAMMA.ELOSZLÁS ## A gamma-eloszlás értékét számítja ki. +GAMMAINV = INVERZ.GAMMA ## A gamma-eloszlás eloszlásfüggvénye inverzének értékét számítja ki. +GAMMALN = GAMMALN ## A gamma-függvény természetes logaritmusát számítja ki. +GEOMEAN = MÉRTANI.KÖZÉP ## Argumentumai mértani középértékét számítja ki. +GROWTH = NÖV ## Exponenciális regresszió alapján ad becslést. +HARMEAN = HARM.KÖZÉP ## Argumentumai harmonikus átlagát számítja ki. +HYPGEOMDIST = HIPERGEOM.ELOSZLÁS ## A hipergeometriai eloszlás értékét számítja ki. +INTERCEPT = METSZ ## A regressziós egyenes y tengellyel való metszéspontját határozza meg. +KURT = CSÚCSOSSÁG ## Egy adathalmaz csúcsosságát számítja ki. +LARGE = NAGY ## Egy adathalmaz k-adik legnagyobb elemét adja eredményül. +LINEST = LIN.ILL ## A legkisebb négyzetek módszerével az adatokra illesztett egyenes paramétereit határozza meg. +LOGEST = LOG.ILL ## Az adatokra illesztett exponenciális görbe paramétereit határozza meg. +LOGINV = INVERZ.LOG.ELOSZLÁS ## A lognormális eloszlás inverzét számítja ki. +LOGNORMDIST = LOG.ELOSZLÁS ## A lognormális eloszlásfüggvény értékét számítja ki. +MAX = MAX ## Az argumentumai között szereplő legnagyobb számot adja meg. +MAXA = MAX2 ## Az argumentumai között szereplő legnagyobb számot adja meg (beleértve a számokat, szöveget és logikai értékeket). +MEDIAN = MEDIÁN ## Adott számhalmaz mediánját számítja ki. +MIN = MIN ## Az argumentumai között szereplő legkisebb számot adja meg. +MINA = MIN2 ## Az argumentumai között szereplő legkisebb számot adja meg, beleértve a számokat, szöveget és logikai értékeket. +MODE = MÓDUSZ ## Egy adathalmazból kiválasztja a leggyakrabban előforduló számot. +NEGBINOMDIST = NEGBINOM.ELOSZL ## A negatív binomiális eloszlás értékét számítja ki. +NORMDIST = NORM.ELOSZL ## A normális eloszlás értékét számítja ki. +NORMINV = INVERZ.NORM ## A normális eloszlás eloszlásfüggvénye inverzének értékét számítja ki. +NORMSDIST = STNORMELOSZL ## A standard normális eloszlás eloszlásfüggvényének értékét számítja ki. +NORMSINV = INVERZ.STNORM ## A standard normális eloszlás eloszlásfüggvénye inverzének értékét számítja ki. +PEARSON = PEARSON ## A Pearson-féle korrelációs együtthatót számítja ki. +PERCENTILE = PERCENTILIS ## Egy tartományban található értékek k-adik percentilisét, azaz százalékosztályát adja eredményül. +PERCENTRANK = SZÁZALÉKRANG ## Egy értéknek egy adathalmazon belül vett százalékos rangját (elhelyezkedését) számítja ki. +PERMUT = VARIÁCIÓK ## Adott számú objektum k-ad osztályú ismétlés nélküli variációinak számát számítja ki. +POISSON = POISSON ## A Poisson-eloszlás értékét számítja ki. +PROB = VALÓSZÍNŰSÉG ## Annak valószínűségét számítja ki, hogy adott értékek két határérték közé esnek. +QUARTILE = KVARTILIS ## Egy adathalmaz kvartilisét (negyedszintjét) számítja ki. +RANK = SORSZÁM ## Kiszámítja, hogy egy szám hányadik egy számsorozatban. +RSQ = RNÉGYZET ## Kiszámítja a Pearson-féle szorzatmomentum korrelációs együtthatójának négyzetét. +SKEW = FERDESÉG ## Egy eloszlás ferdeségét határozza meg. +SLOPE = MEREDEKSÉG ## Egy lineáris regressziós egyenes meredekségét számítja ki. +SMALL = KICSI ## Egy adathalmaz k-adik legkisebb elemét adja meg. +STANDARDIZE = NORMALIZÁLÁS ## Normalizált értéket ad eredményül. +STDEV = SZÓRÁS ## Egy statisztikai sokaság mintájából kiszámítja annak szórását. +STDEVA = SZÓRÁSA ## Egy statisztikai sokaság mintájából kiszámítja annak szórását (beleértve a számokat, szöveget és logikai értékeket). +STDEVP = SZÓRÁSP ## Egy statisztikai sokaság egészéből kiszámítja annak szórását. +STDEVPA = SZÓRÁSPA ## Egy statisztikai sokaság egészéből kiszámítja annak szórását (beleértve számokat, szöveget és logikai értékeket). +STEYX = STHIBAYX ## Egy regresszió esetén az egyes x-értékek alapján meghatározott y-értékek standard hibáját számítja ki. +TDIST = T.ELOSZLÁS ## A Student-féle t-eloszlás értékét számítja ki. +TINV = INVERZ.T ## A Student-féle t-eloszlás inverzét számítja ki. +TREND = TREND ## Lineáris trend értékeit számítja ki. +TRIMMEAN = RÉSZÁTLAG ## Egy adathalmaz középső részének átlagát számítja ki. +TTEST = T.PRÓBA ## A Student-féle t-próbához tartozó valószínűséget számítja ki. +VAR = VAR ## Minta alapján becslést ad a varianciára. +VARA = VARA ## Minta alapján becslést ad a varianciára (beleértve számokat, szöveget és logikai értékeket). +VARP = VARP ## Egy statisztikai sokaság varianciáját számítja ki. +VARPA = VARPA ## Egy statisztikai sokaság varianciáját számítja ki (beleértve számokat, szöveget és logikai értékeket). +WEIBULL = WEIBULL ## A Weibull-féle eloszlás értékét számítja ki. +ZTEST = Z.PRÓBA ## Az egyszélű z-próbával kapott valószínűségértéket számítja ki. + + +## +## Text functions Szövegműveletekhez használható függvények +## +ASC = ASC ## Szöveg teljes szélességű (kétbájtos) latin és katakana karaktereit félszélességű (egybájtos) karakterekké alakítja. +BAHTTEXT = BAHTSZÖVEG ## Számot szöveggé alakít a ß (baht) pénznemformátum használatával. +CHAR = KARAKTER ## A kódszámmal meghatározott karaktert adja eredményül. +CLEAN = TISZTÍT ## A szövegből eltávolítja az összes nem nyomtatható karaktert. +CODE = KÓD ## Karaktersorozat első karakterének numerikus kódját adja eredményül. +CONCATENATE = ÖSSZEFŰZ ## Több szövegelemet egyetlen szöveges elemmé fűz össze. +DOLLAR = FORINT ## Számot pénznem formátumú szöveggé alakít át. +EXACT = AZONOS ## Megvizsgálja, hogy két érték azonos-e. +FIND = SZÖVEG.TALÁL ## Karaktersorozatot keres egy másikban (a kis- és nagybetűk megkülönböztetésével). +FINDB = SZÖVEG.TALÁL2 ## Karaktersorozatot keres egy másikban (a kis- és nagybetűk megkülönböztetésével). +FIXED = FIX ## Számot szöveges formátumúra alakít adott számú tizedesjegyre kerekítve. +JIS = JIS ## A félszélességű (egybájtos) latin és a katakana karaktereket teljes szélességű (kétbájtos) karakterekké alakítja. +LEFT = BAL ## Szöveg bal szélső karaktereit adja eredményül. +LEFTB = BAL2 ## Szöveg bal szélső karaktereit adja eredményül. +LEN = HOSSZ ## Szöveg karakterekben mért hosszát adja eredményül. +LENB = HOSSZ2 ## Szöveg karakterekben mért hosszát adja eredményül. +LOWER = KISBETŰ ## Szöveget kisbetűssé alakít át. +MID = KÖZÉP ## A szöveg adott pozíciójától kezdve megadott számú karaktert ad vissza eredményként. +MIDB = KÖZÉP2 ## A szöveg adott pozíciójától kezdve megadott számú karaktert ad vissza eredményként. +PHONETIC = PHONETIC ## Szöveg furigana (fonetikus) karaktereit adja vissza. +PROPER = TNÉV ## Szöveg minden szavának kezdőbetűjét nagybetűsre cseréli. +REPLACE = CSERE ## A szövegen belül karaktereket cserél. +REPLACEB = CSERE2 ## A szövegen belül karaktereket cserél. +REPT = SOKSZOR ## Megadott számú alkalommal megismétel egy szövegrészt. +RIGHT = JOBB ## Szövegrész jobb szélső karaktereit adja eredményül. +RIGHTB = JOBB2 ## Szövegrész jobb szélső karaktereit adja eredményül. +SEARCH = SZÖVEG.KERES ## Karaktersorozatot keres egy másikban (a kis- és nagybetűk között nem tesz különbséget). +SEARCHB = SZÖVEG.KERES2 ## Karaktersorozatot keres egy másikban (a kis- és nagybetűk között nem tesz különbséget). +SUBSTITUTE = HELYETTE ## Szövegben adott karaktereket másikra cserél. +T = T ## Argumentumát szöveggé alakítja át. +TEXT = SZÖVEG ## Számértéket alakít át adott számformátumú szöveggé. +TRIM = TRIM ## A szövegből eltávolítja a szóközöket. +UPPER = NAGYBETŰS ## Szöveget nagybetűssé alakít át. +VALUE = ÉRTÉK ## Szöveget számmá alakít át. diff --git a/application/third_party/PHPExcel/PHPExcel/locale/it/config b/application/third_party/PHPExcel/PHPExcel/locale/it/config new file mode 100644 index 0000000..c3afa75 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/it/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = € + + +## +## Excel Error Codes (For future use) +## +NULL = #NULLO! +DIV0 = #DIV/0! +VALUE = #VALORE! +REF = #RIF! +NAME = #NOME? +NUM = #NUM! +NA = #N/D diff --git a/application/third_party/PHPExcel/PHPExcel/locale/it/functions b/application/third_party/PHPExcel/PHPExcel/locale/it/functions new file mode 100644 index 0000000..d371f3d --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/it/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Funzioni di automazione e dei componenti aggiuntivi +## +GETPIVOTDATA = INFO.DATI.TAB.PIVOT ## Restituisce i dati memorizzati in un rapporto di tabella pivot + + +## +## Cube functions Funzioni cubo +## +CUBEKPIMEMBER = MEMBRO.KPI.CUBO ## Restituisce il nome, la proprietà e la misura di un indicatore di prestazioni chiave (KPI) e visualizza il nome e la proprietà nella cella. Un KPI è una misura quantificabile, ad esempio l'utile lordo mensile o il fatturato trimestrale dei dipendenti, utilizzata per il monitoraggio delle prestazioni di un'organizzazione. +CUBEMEMBER = MEMBRO.CUBO ## Restituisce un membro o una tupla in una gerarchia di cubi. Consente di verificare l'esistenza del membro o della tupla nel cubo. +CUBEMEMBERPROPERTY = PROPRIETÀ.MEMBRO.CUBO ## Restituisce il valore di una proprietà di un membro del cubo. Consente di verificare l'esistenza di un nome di membro all'interno del cubo e di restituire la proprietà specificata per tale membro. +CUBERANKEDMEMBER = MEMBRO.CUBO.CON.RANGO ## Restituisce l'n-esimo membro o il membro ordinato di un insieme. Consente di restituire uno o più elementi in un insieme, ad esempio l'agente di vendita migliore o i primi 10 studenti. +CUBESET = SET.CUBO ## Definisce un insieme di tuple o membri calcolati mediante l'invio di un'espressione di insieme al cubo sul server. In questo modo l'insieme viene creato e restituito a Microsoft Office Excel. +CUBESETCOUNT = CONTA.SET.CUBO ## Restituisce il numero di elementi di un insieme. +CUBEVALUE = VALORE.CUBO ## Restituisce un valore aggregato da un cubo. + + +## +## Database functions Funzioni di database +## +DAVERAGE = DB.MEDIA ## Restituisce la media di voci del database selezionate +DCOUNT = DB.CONTA.NUMERI ## Conta le celle di un database contenenti numeri +DCOUNTA = DB.CONTA.VALORI ## Conta le celle non vuote in un database +DGET = DB.VALORI ## Estrae da un database un singolo record che soddisfa i criteri specificati +DMAX = DB.MAX ## Restituisce il valore massimo dalle voci selezionate in un database +DMIN = DB.MIN ## Restituisce il valore minimo dalle voci di un database selezionate +DPRODUCT = DB.PRODOTTO ## Moltiplica i valori in un determinato campo di record che soddisfano i criteri del database +DSTDEV = DB.DEV.ST ## Restituisce una stima della deviazione standard sulla base di un campione di voci di un database selezionate +DSTDEVP = DB.DEV.ST.POP ## Calcola la deviazione standard sulla base di tutte le voci di un database selezionate +DSUM = DB.SOMMA ## Aggiunge i numeri nel campo colonna di record del database che soddisfa determinati criteri +DVAR = DB.VAR ## Restituisce una stima della varianza sulla base di un campione da voci di un database selezionate +DVARP = DB.VAR.POP ## Calcola la varianza sulla base di tutte le voci di un database selezionate + + +## +## Date and time functions Funzioni data e ora +## +DATE = DATA ## Restituisce il numero seriale di una determinata data +DATEVALUE = DATA.VALORE ## Converte una data sotto forma di testo in un numero seriale +DAY = GIORNO ## Converte un numero seriale in un giorno del mese +DAYS360 = GIORNO360 ## Calcola il numero di giorni compreso tra due date basandosi su un anno di 360 giorni +EDATE = DATA.MESE ## Restituisce il numero seriale della data che rappresenta il numero di mesi prima o dopo la data di inizio +EOMONTH = FINE.MESE ## Restituisce il numero seriale dell'ultimo giorno del mese, prima o dopo un determinato numero di mesi +HOUR = ORA ## Converte un numero seriale in un'ora +MINUTE = MINUTO ## Converte un numero seriale in un minuto +MONTH = MESE ## Converte un numero seriale in un mese +NETWORKDAYS = GIORNI.LAVORATIVI.TOT ## Restituisce il numero di tutti i giorni lavorativi compresi fra due date +NOW = ADESSO ## Restituisce il numero seriale della data e dell'ora corrente +SECOND = SECONDO ## Converte un numero seriale in un secondo +TIME = ORARIO ## Restituisce il numero seriale di una determinata ora +TIMEVALUE = ORARIO.VALORE ## Converte un orario in forma di testo in un numero seriale +TODAY = OGGI ## Restituisce il numero seriale relativo alla data odierna +WEEKDAY = GIORNO.SETTIMANA ## Converte un numero seriale in un giorno della settimana +WEEKNUM = NUM.SETTIMANA ## Converte un numero seriale in un numero che rappresenta la posizione numerica di una settimana nell'anno +WORKDAY = GIORNO.LAVORATIVO ## Restituisce il numero della data prima o dopo un determinato numero di giorni lavorativi +YEAR = ANNO ## Converte un numero seriale in un anno +YEARFRAC = FRAZIONE.ANNO ## Restituisce la frazione dell'anno che rappresenta il numero dei giorni compresi tra una data_ iniziale e una data_finale + + +## +## Engineering functions Funzioni ingegneristiche +## +BESSELI = BESSEL.I ## Restituisce la funzione di Bessel modificata In(x) +BESSELJ = BESSEL.J ## Restituisce la funzione di Bessel Jn(x) +BESSELK = BESSEL.K ## Restituisce la funzione di Bessel modificata Kn(x) +BESSELY = BESSEL.Y ## Restituisce la funzione di Bessel Yn(x) +BIN2DEC = BINARIO.DECIMALE ## Converte un numero binario in decimale +BIN2HEX = BINARIO.HEX ## Converte un numero binario in esadecimale +BIN2OCT = BINARIO.OCT ## Converte un numero binario in ottale +COMPLEX = COMPLESSO ## Converte i coefficienti reali e immaginari in numeri complessi +CONVERT = CONVERTI ## Converte un numero da un sistema di misura in un altro +DEC2BIN = DECIMALE.BINARIO ## Converte un numero decimale in binario +DEC2HEX = DECIMALE.HEX ## Converte un numero decimale in esadecimale +DEC2OCT = DECIMALE.OCT ## Converte un numero decimale in ottale +DELTA = DELTA ## Verifica se due valori sono uguali +ERF = FUNZ.ERRORE ## Restituisce la funzione di errore +ERFC = FUNZ.ERRORE.COMP ## Restituisce la funzione di errore complementare +GESTEP = SOGLIA ## Verifica se un numero è maggiore del valore di soglia +HEX2BIN = HEX.BINARIO ## Converte un numero esadecimale in binario +HEX2DEC = HEX.DECIMALE ## Converte un numero esadecimale in decimale +HEX2OCT = HEX.OCT ## Converte un numero esadecimale in ottale +IMABS = COMP.MODULO ## Restituisce il valore assoluto (modulo) di un numero complesso +IMAGINARY = COMP.IMMAGINARIO ## Restituisce il coefficiente immaginario di un numero complesso +IMARGUMENT = COMP.ARGOMENTO ## Restituisce l'argomento theta, un angolo espresso in radianti +IMCONJUGATE = COMP.CONIUGATO ## Restituisce il complesso coniugato del numero complesso +IMCOS = COMP.COS ## Restituisce il coseno di un numero complesso +IMDIV = COMP.DIV ## Restituisce il quoziente di due numeri complessi +IMEXP = COMP.EXP ## Restituisce il valore esponenziale di un numero complesso +IMLN = COMP.LN ## Restituisce il logaritmo naturale di un numero complesso +IMLOG10 = COMP.LOG10 ## Restituisce il logaritmo in base 10 di un numero complesso +IMLOG2 = COMP.LOG2 ## Restituisce un logaritmo in base 2 di un numero complesso +IMPOWER = COMP.POTENZA ## Restituisce il numero complesso elevato a una potenza intera +IMPRODUCT = COMP.PRODOTTO ## Restituisce il prodotto di numeri complessi compresi tra 2 e 29 +IMREAL = COMP.PARTE.REALE ## Restituisce il coefficiente reale di un numero complesso +IMSIN = COMP.SEN ## Restituisce il seno di un numero complesso +IMSQRT = COMP.RADQ ## Restituisce la radice quadrata di un numero complesso +IMSUB = COMP.DIFF ## Restituisce la differenza fra due numeri complessi +IMSUM = COMP.SOMMA ## Restituisce la somma di numeri complessi +OCT2BIN = OCT.BINARIO ## Converte un numero ottale in binario +OCT2DEC = OCT.DECIMALE ## Converte un numero ottale in decimale +OCT2HEX = OCT.HEX ## Converte un numero ottale in esadecimale + + +## +## Financial functions Funzioni finanziarie +## +ACCRINT = INT.MATURATO.PER ## Restituisce l'interesse maturato di un titolo che paga interessi periodici +ACCRINTM = INT.MATURATO.SCAD ## Restituisce l'interesse maturato di un titolo che paga interessi alla scadenza +AMORDEGRC = AMMORT.DEGR ## Restituisce l'ammortamento per ogni periodo contabile utilizzando un coefficiente di ammortamento +AMORLINC = AMMORT.PER ## Restituisce l'ammortamento per ogni periodo contabile +COUPDAYBS = GIORNI.CED.INIZ.LIQ ## Restituisce il numero dei giorni che vanno dall'inizio del periodo di durata della cedola alla data di liquidazione +COUPDAYS = GIORNI.CED ## Restituisce il numero dei giorni relativi al periodo della cedola che contiene la data di liquidazione +COUPDAYSNC = GIORNI.CED.NUOVA ## Restituisce il numero di giorni che vanno dalla data di liquidazione alla data della cedola successiva +COUPNCD = DATA.CED.SUCC ## Restituisce un numero che rappresenta la data della cedola successiva alla data di liquidazione +COUPNUM = NUM.CED ## Restituisce il numero di cedole pagabili fra la data di liquidazione e la data di scadenza +COUPPCD = DATA.CED.PREC ## Restituisce un numero che rappresenta la data della cedola precedente alla data di liquidazione +CUMIPMT = INT.CUMUL ## Restituisce l'interesse cumulativo pagato fra due periodi +CUMPRINC = CAP.CUM ## Restituisce il capitale cumulativo pagato per estinguere un debito fra due periodi +DB = DB ## Restituisce l'ammortamento di un bene per un periodo specificato utilizzando il metodo di ammortamento a quote fisse decrescenti +DDB = AMMORT ## Restituisce l'ammortamento di un bene per un periodo specificato utilizzando il metodo di ammortamento a doppie quote decrescenti o altri metodi specificati +DISC = TASSO.SCONTO ## Restituisce il tasso di sconto per un titolo +DOLLARDE = VALUTA.DEC ## Converte un prezzo valuta, espresso come frazione, in prezzo valuta, espresso come numero decimale +DOLLARFR = VALUTA.FRAZ ## Converte un prezzo valuta, espresso come numero decimale, in prezzo valuta, espresso come frazione +DURATION = DURATA ## Restituisce la durata annuale di un titolo con i pagamenti di interesse periodico +EFFECT = EFFETTIVO ## Restituisce l'effettivo tasso di interesse annuo +FV = VAL.FUT ## Restituisce il valore futuro di un investimento +FVSCHEDULE = VAL.FUT.CAPITALE ## Restituisce il valore futuro di un capitale iniziale dopo aver applicato una serie di tassi di interesse composti +INTRATE = TASSO.INT ## Restituisce il tasso di interesse per un titolo interamente investito +IPMT = INTERESSI ## Restituisce il valore degli interessi per un investimento relativo a un periodo specifico +IRR = TIR.COST ## Restituisce il tasso di rendimento interno per una serie di flussi di cassa +ISPMT = INTERESSE.RATA ## Calcola l'interesse di un investimento pagato durante un periodo specifico +MDURATION = DURATA.M ## Restituisce la durata Macauley modificata per un titolo con un valore presunto di € 100 +MIRR = TIR.VAR ## Restituisce il tasso di rendimento interno in cui i flussi di cassa positivi e negativi sono finanziati a tassi differenti +NOMINAL = NOMINALE ## Restituisce il tasso di interesse nominale annuale +NPER = NUM.RATE ## Restituisce un numero di periodi relativi a un investimento +NPV = VAN ## Restituisce il valore attuale netto di un investimento basato su una serie di flussi di cassa periodici e sul tasso di sconto +ODDFPRICE = PREZZO.PRIMO.IRR ## Restituisce il prezzo di un titolo dal valore nominale di € 100 avente il primo periodo di durata irregolare +ODDFYIELD = REND.PRIMO.IRR ## Restituisce il rendimento di un titolo avente il primo periodo di durata irregolare +ODDLPRICE = PREZZO.ULTIMO.IRR ## Restituisce il prezzo di un titolo dal valore nominale di € 100 avente l'ultimo periodo di durata irregolare +ODDLYIELD = REND.ULTIMO.IRR ## Restituisce il rendimento di un titolo avente l'ultimo periodo di durata irregolare +PMT = RATA ## Restituisce il pagamento periodico di una rendita annua +PPMT = P.RATA ## Restituisce il pagamento sul capitale di un investimento per un dato periodo +PRICE = PREZZO ## Restituisce il prezzo di un titolo dal valore nominale di € 100 che paga interessi periodici +PRICEDISC = PREZZO.SCONT ## Restituisce il prezzo di un titolo scontato dal valore nominale di € 100 +PRICEMAT = PREZZO.SCAD ## Restituisce il prezzo di un titolo dal valore nominale di € 100 che paga gli interessi alla scadenza +PV = VA ## Restituisce il valore attuale di un investimento +RATE = TASSO ## Restituisce il tasso di interesse per un periodo di un'annualità +RECEIVED = RICEV.SCAD ## Restituisce l'ammontare ricevuto alla scadenza di un titolo interamente investito +SLN = AMMORT.COST ## Restituisce l'ammortamento a quote costanti di un bene per un singolo periodo +SYD = AMMORT.ANNUO ## Restituisce l'ammortamento a somma degli anni di un bene per un periodo specificato +TBILLEQ = BOT.EQUIV ## Restituisce il rendimento equivalente ad un'obbligazione per un Buono ordinario del Tesoro +TBILLPRICE = BOT.PREZZO ## Restituisce il prezzo di un Buono del Tesoro dal valore nominale di € 100 +TBILLYIELD = BOT.REND ## Restituisce il rendimento di un Buono del Tesoro +VDB = AMMORT.VAR ## Restituisce l'ammortamento di un bene per un periodo specificato o parziale utilizzando il metodo a doppie quote proporzionali ai valori residui +XIRR = TIR.X ## Restituisce il tasso di rendimento interno di un impiego di flussi di cassa +XNPV = VAN.X ## Restituisce il valore attuale netto di un impiego di flussi di cassa non necessariamente periodici +YIELD = REND ## Restituisce il rendimento di un titolo che frutta interessi periodici +YIELDDISC = REND.TITOLI.SCONT ## Restituisce il rendimento annuale di un titolo scontato, ad esempio un Buono del Tesoro +YIELDMAT = REND.SCAD ## Restituisce il rendimento annuo di un titolo che paga interessi alla scadenza + + +## +## Information functions Funzioni relative alle informazioni +## +CELL = CELLA ## Restituisce le informazioni sulla formattazione, la posizione o i contenuti di una cella +ERROR.TYPE = ERRORE.TIPO ## Restituisce un numero che corrisponde a un tipo di errore +INFO = INFO ## Restituisce le informazioni sull'ambiente operativo corrente +ISBLANK = VAL.VUOTO ## Restituisce VERO se il valore è vuoto +ISERR = VAL.ERR ## Restituisce VERO se il valore è un valore di errore qualsiasi tranne #N/D +ISERROR = VAL.ERRORE ## Restituisce VERO se il valore è un valore di errore qualsiasi +ISEVEN = VAL.PARI ## Restituisce VERO se il numero è pari +ISLOGICAL = VAL.LOGICO ## Restituisce VERO se il valore è un valore logico +ISNA = VAL.NON.DISP ## Restituisce VERO se il valore è un valore di errore #N/D +ISNONTEXT = VAL.NON.TESTO ## Restituisce VERO se il valore non è in formato testo +ISNUMBER = VAL.NUMERO ## Restituisce VERO se il valore è un numero +ISODD = VAL.DISPARI ## Restituisce VERO se il numero è dispari +ISREF = VAL.RIF ## Restituisce VERO se il valore è un riferimento +ISTEXT = VAL.TESTO ## Restituisce VERO se il valore è in formato testo +N = NUM ## Restituisce un valore convertito in numero +NA = NON.DISP ## Restituisce il valore di errore #N/D +TYPE = TIPO ## Restituisce un numero che indica il tipo di dati relativi a un valore + + +## +## Logical functions Funzioni logiche +## +AND = E ## Restituisce VERO se tutti gli argomenti sono VERO +FALSE = FALSO ## Restituisce il valore logico FALSO +IF = SE ## Specifica un test logico da eseguire +IFERROR = SE.ERRORE ## Restituisce un valore specificato se una formula fornisce un errore come risultato; in caso contrario, restituisce il risultato della formula +NOT = NON ## Inverte la logica degli argomenti +OR = O ## Restituisce VERO se un argomento qualsiasi è VERO +TRUE = VERO ## Restituisce il valore logico VERO + + +## +## Lookup and reference functions Funzioni di ricerca e di riferimento +## +ADDRESS = INDIRIZZO ## Restituisce un riferimento come testo in una singola cella di un foglio di lavoro +AREAS = AREE ## Restituisce il numero di aree in un riferimento +CHOOSE = SCEGLI ## Sceglie un valore da un elenco di valori +COLUMN = RIF.COLONNA ## Restituisce il numero di colonna di un riferimento +COLUMNS = COLONNE ## Restituisce il numero di colonne in un riferimento +HLOOKUP = CERCA.ORIZZ ## Effettua una ricerca nella riga superiore di una matrice e restituisce il valore della cella specificata +HYPERLINK = COLLEG.IPERTESTUALE ## Crea un collegamento che apre un documento memorizzato in un server di rete, una rete Intranet o Internet +INDEX = INDICE ## Utilizza un indice per scegliere un valore da un riferimento o da una matrice +INDIRECT = INDIRETTO ## Restituisce un riferimento specificato da un valore testo +LOOKUP = CERCA ## Ricerca i valori in un vettore o in una matrice +MATCH = CONFRONTA ## Ricerca i valori in un riferimento o in una matrice +OFFSET = SCARTO ## Restituisce uno scarto di riferimento da un riferimento dato +ROW = RIF.RIGA ## Restituisce il numero di riga di un riferimento +ROWS = RIGHE ## Restituisce il numero delle righe in un riferimento +RTD = DATITEMPOREALE ## Recupera dati in tempo reale da un programma che supporta l'automazione COM (automazione: Metodo per utilizzare gli oggetti di un'applicazione da un'altra applicazione o da un altro strumento di sviluppo. Precedentemente nota come automazione OLE, l'automazione è uno standard del settore e una caratteristica del modello COM (Component Object Model).) +TRANSPOSE = MATR.TRASPOSTA ## Restituisce la trasposizione di una matrice +VLOOKUP = CERCA.VERT ## Effettua una ricerca nella prima colonna di una matrice e si sposta attraverso la riga per restituire il valore di una cella + + +## +## Math and trigonometry functions Funzioni matematiche e trigonometriche +## +ABS = ASS ## Restituisce il valore assoluto di un numero. +ACOS = ARCCOS ## Restituisce l'arcocoseno di un numero +ACOSH = ARCCOSH ## Restituisce l'inverso del coseno iperbolico di un numero +ASIN = ARCSEN ## Restituisce l'arcoseno di un numero +ASINH = ARCSENH ## Restituisce l'inverso del seno iperbolico di un numero +ATAN = ARCTAN ## Restituisce l'arcotangente di un numero +ATAN2 = ARCTAN.2 ## Restituisce l'arcotangente delle coordinate x e y specificate +ATANH = ARCTANH ## Restituisce l'inverso della tangente iperbolica di un numero +CEILING = ARROTONDA.ECCESSO ## Arrotonda un numero per eccesso all'intero più vicino o al multiplo più vicino a peso +COMBIN = COMBINAZIONE ## Restituisce il numero di combinazioni possibili per un numero assegnato di elementi +COS = COS ## Restituisce il coseno dell'angolo specificato +COSH = COSH ## Restituisce il coseno iperbolico di un numero +DEGREES = GRADI ## Converte i radianti in gradi +EVEN = PARI ## Arrotonda il valore assoluto di un numero per eccesso al più vicino intero pari +EXP = ESP ## Restituisce il numero e elevato alla potenza di num +FACT = FATTORIALE ## Restituisce il fattoriale di un numero +FACTDOUBLE = FATT.DOPPIO ## Restituisce il fattoriale doppio di un numero +FLOOR = ARROTONDA.DIFETTO ## Arrotonda un numero per difetto al multiplo più vicino a zero +GCD = MCD ## Restituisce il massimo comune divisore +INT = INT ## Arrotonda un numero per difetto al numero intero più vicino +LCM = MCM ## Restituisce il minimo comune multiplo +LN = LN ## Restituisce il logaritmo naturale di un numero +LOG = LOG ## Restituisce il logaritmo di un numero in una specificata base +LOG10 = LOG10 ## Restituisce il logaritmo in base 10 di un numero +MDETERM = MATR.DETERM ## Restituisce il determinante di una matrice +MINVERSE = MATR.INVERSA ## Restituisce l'inverso di una matrice +MMULT = MATR.PRODOTTO ## Restituisce il prodotto di due matrici +MOD = RESTO ## Restituisce il resto della divisione +MROUND = ARROTONDA.MULTIPLO ## Restituisce un numero arrotondato al multiplo desiderato +MULTINOMIAL = MULTINOMIALE ## Restituisce il multinomiale di un insieme di numeri +ODD = DISPARI ## Arrotonda un numero per eccesso al più vicino intero dispari +PI = PI.GRECO ## Restituisce il valore di pi greco +POWER = POTENZA ## Restituisce il risultato di un numero elevato a potenza +PRODUCT = PRODOTTO ## Moltiplica i suoi argomenti +QUOTIENT = QUOZIENTE ## Restituisce la parte intera di una divisione +RADIANS = RADIANTI ## Converte i gradi in radianti +RAND = CASUALE ## Restituisce un numero casuale compreso tra 0 e 1 +RANDBETWEEN = CASUALE.TRA ## Restituisce un numero casuale compreso tra i numeri specificati +ROMAN = ROMANO ## Restituisce il numero come numero romano sotto forma di testo +ROUND = ARROTONDA ## Arrotonda il numero al numero di cifre specificato +ROUNDDOWN = ARROTONDA.PER.DIF ## Arrotonda il valore assoluto di un numero per difetto +ROUNDUP = ARROTONDA.PER.ECC ## Arrotonda il valore assoluto di un numero per eccesso +SERIESSUM = SOMMA.SERIE ## Restituisce la somma di una serie di potenze in base alla formula +SIGN = SEGNO ## Restituisce il segno di un numero +SIN = SEN ## Restituisce il seno di un dato angolo +SINH = SENH ## Restituisce il seno iperbolico di un numero +SQRT = RADQ ## Restituisce una radice quadrata +SQRTPI = RADQ.PI.GRECO ## Restituisce la radice quadrata di un numero (numero * pi greco) +SUBTOTAL = SUBTOTALE ## Restituisce un subtotale in un elenco o in un database +SUM = SOMMA ## Somma i suoi argomenti +SUMIF = SOMMA.SE ## Somma le celle specificate da un dato criterio +SUMIFS = SOMMA.PIÙ.SE ## Somma le celle in un intervallo che soddisfano più criteri +SUMPRODUCT = MATR.SOMMA.PRODOTTO ## Restituisce la somma dei prodotti dei componenti corrispondenti della matrice +SUMSQ = SOMMA.Q ## Restituisce la somma dei quadrati degli argomenti +SUMX2MY2 = SOMMA.DIFF.Q ## Restituisce la somma della differenza dei quadrati dei corrispondenti elementi in due matrici +SUMX2PY2 = SOMMA.SOMMA.Q ## Restituisce la somma della somma dei quadrati dei corrispondenti elementi in due matrici +SUMXMY2 = SOMMA.Q.DIFF ## Restituisce la somma dei quadrati delle differenze dei corrispondenti elementi in due matrici +TAN = TAN ## Restituisce la tangente di un numero +TANH = TANH ## Restituisce la tangente iperbolica di un numero +TRUNC = TRONCA ## Tronca la parte decimale di un numero + + +## +## Statistical functions Funzioni statistiche +## +AVEDEV = MEDIA.DEV ## Restituisce la media delle deviazioni assolute delle coordinate rispetto alla loro media +AVERAGE = MEDIA ## Restituisce la media degli argomenti +AVERAGEA = MEDIA.VALORI ## Restituisce la media degli argomenti, inclusi i numeri, il testo e i valori logici +AVERAGEIF = MEDIA.SE ## Restituisce la media aritmetica di tutte le celle in un intervallo che soddisfano un determinato criterio +AVERAGEIFS = MEDIA.PIÙ.SE ## Restituisce la media aritmetica di tutte le celle che soddisfano più criteri +BETADIST = DISTRIB.BETA ## Restituisce la funzione di distribuzione cumulativa beta +BETAINV = INV.BETA ## Restituisce l'inverso della funzione di distribuzione cumulativa per una distribuzione beta specificata +BINOMDIST = DISTRIB.BINOM ## Restituisce la distribuzione binomiale per il termine individuale +CHIDIST = DISTRIB.CHI ## Restituisce la probabilità a una coda per la distribuzione del chi quadrato +CHIINV = INV.CHI ## Restituisce l'inverso della probabilità ad una coda per la distribuzione del chi quadrato +CHITEST = TEST.CHI ## Restituisce il test per l'indipendenza +CONFIDENCE = CONFIDENZA ## Restituisce l'intervallo di confidenza per una popolazione +CORREL = CORRELAZIONE ## Restituisce il coefficiente di correlazione tra due insiemi di dati +COUNT = CONTA.NUMERI ## Conta la quantità di numeri nell'elenco di argomenti +COUNTA = CONTA.VALORI ## Conta il numero di valori nell'elenco di argomenti +COUNTBLANK = CONTA.VUOTE ## Conta il numero di celle vuote all'interno di un intervallo +COUNTIF = CONTA.SE ## Conta il numero di celle all'interno di un intervallo che soddisfa i criteri specificati +COUNTIFS = CONTA.PIÙ.SE ## Conta il numero di celle in un intervallo che soddisfano più criteri. +COVAR = COVARIANZA ## Calcola la covarianza, la media dei prodotti delle deviazioni accoppiate +CRITBINOM = CRIT.BINOM ## Restituisce il più piccolo valore per il quale la distribuzione cumulativa binomiale risulta maggiore o uguale ad un valore di criterio +DEVSQ = DEV.Q ## Restituisce la somma dei quadrati delle deviazioni +EXPONDIST = DISTRIB.EXP ## Restituisce la distribuzione esponenziale +FDIST = DISTRIB.F ## Restituisce la distribuzione di probabilità F +FINV = INV.F ## Restituisce l'inverso della distribuzione della probabilità F +FISHER = FISHER ## Restituisce la trasformazione di Fisher +FISHERINV = INV.FISHER ## Restituisce l'inverso della trasformazione di Fisher +FORECAST = PREVISIONE ## Restituisce i valori lungo una tendenza lineare +FREQUENCY = FREQUENZA ## Restituisce la distribuzione di frequenza come matrice verticale +FTEST = TEST.F ## Restituisce il risultato di un test F +GAMMADIST = DISTRIB.GAMMA ## Restituisce la distribuzione gamma +GAMMAINV = INV.GAMMA ## Restituisce l'inverso della distribuzione cumulativa gamma +GAMMALN = LN.GAMMA ## Restituisce il logaritmo naturale della funzione gamma, G(x) +GEOMEAN = MEDIA.GEOMETRICA ## Restituisce la media geometrica +GROWTH = CRESCITA ## Restituisce i valori lungo una linea di tendenza esponenziale +HARMEAN = MEDIA.ARMONICA ## Restituisce la media armonica +HYPGEOMDIST = DISTRIB.IPERGEOM ## Restituisce la distribuzione ipergeometrica +INTERCEPT = INTERCETTA ## Restituisce l'intercetta della retta di regressione lineare +KURT = CURTOSI ## Restituisce la curtosi di un insieme di dati +LARGE = GRANDE ## Restituisce il k-esimo valore più grande in un insieme di dati +LINEST = REGR.LIN ## Restituisce i parametri di una tendenza lineare +LOGEST = REGR.LOG ## Restituisce i parametri di una linea di tendenza esponenziale +LOGINV = INV.LOGNORM ## Restituisce l'inverso di una distribuzione lognormale +LOGNORMDIST = DISTRIB.LOGNORM ## Restituisce la distribuzione lognormale cumulativa +MAX = MAX ## Restituisce il valore massimo in un elenco di argomenti +MAXA = MAX.VALORI ## Restituisce il valore massimo in un elenco di argomenti, inclusi i numeri, il testo e i valori logici +MEDIAN = MEDIANA ## Restituisce la mediana dei numeri specificati +MIN = MIN ## Restituisce il valore minimo in un elenco di argomenti +MINA = MIN.VALORI ## Restituisce il più piccolo valore in un elenco di argomenti, inclusi i numeri, il testo e i valori logici +MODE = MODA ## Restituisce il valore più comune in un insieme di dati +NEGBINOMDIST = DISTRIB.BINOM.NEG ## Restituisce la distribuzione binomiale negativa +NORMDIST = DISTRIB.NORM ## Restituisce la distribuzione cumulativa normale +NORMINV = INV.NORM ## Restituisce l'inverso della distribuzione cumulativa normale standard +NORMSDIST = DISTRIB.NORM.ST ## Restituisce la distribuzione cumulativa normale standard +NORMSINV = INV.NORM.ST ## Restituisce l'inverso della distribuzione cumulativa normale +PEARSON = PEARSON ## Restituisce il coefficiente del momento di correlazione di Pearson +PERCENTILE = PERCENTILE ## Restituisce il k-esimo dato percentile di valori in un intervallo +PERCENTRANK = PERCENT.RANGO ## Restituisce il rango di un valore in un insieme di dati come percentuale +PERMUT = PERMUTAZIONE ## Restituisce il numero delle permutazioni per un determinato numero di oggetti +POISSON = POISSON ## Restituisce la distribuzione di Poisson +PROB = PROBABILITÀ ## Calcola la probabilità che dei valori in un intervallo siano compresi tra due limiti +QUARTILE = QUARTILE ## Restituisce il quartile di un insieme di dati +RANK = RANGO ## Restituisce il rango di un numero in un elenco di numeri +RSQ = RQ ## Restituisce la radice quadrata del coefficiente di momento di correlazione di Pearson +SKEW = ASIMMETRIA ## Restituisce il grado di asimmetria di una distribuzione +SLOPE = PENDENZA ## Restituisce la pendenza di una retta di regressione lineare +SMALL = PICCOLO ## Restituisce il k-esimo valore più piccolo in un insieme di dati +STANDARDIZE = NORMALIZZA ## Restituisce un valore normalizzato +STDEV = DEV.ST ## Restituisce una stima della deviazione standard sulla base di un campione +STDEVA = DEV.ST.VALORI ## Restituisce una stima della deviazione standard sulla base di un campione, inclusi i numeri, il testo e i valori logici +STDEVP = DEV.ST.POP ## Calcola la deviazione standard sulla base di un'intera popolazione +STDEVPA = DEV.ST.POP.VALORI ## Calcola la deviazione standard sulla base sull'intera popolazione, inclusi i numeri, il testo e i valori logici +STEYX = ERR.STD.YX ## Restituisce l'errore standard del valore previsto per y per ogni valore x nella regressione +TDIST = DISTRIB.T ## Restituisce la distribuzione t di Student +TINV = INV.T ## Restituisce l'inversa della distribuzione t di Student +TREND = TENDENZA ## Restituisce i valori lungo una linea di tendenza lineare +TRIMMEAN = MEDIA.TRONCATA ## Restituisce la media della parte interna di un insieme di dati +TTEST = TEST.T ## Restituisce la probabilità associata ad un test t di Student +VAR = VAR ## Stima la varianza sulla base di un campione +VARA = VAR.VALORI ## Stima la varianza sulla base di un campione, inclusi i numeri, il testo e i valori logici +VARP = VAR.POP ## Calcola la varianza sulla base dell'intera popolazione +VARPA = VAR.POP.VALORI ## Calcola la deviazione standard sulla base sull'intera popolazione, inclusi i numeri, il testo e i valori logici +WEIBULL = WEIBULL ## Restituisce la distribuzione di Weibull +ZTEST = TEST.Z ## Restituisce il valore di probabilità a una coda per un test z + + +## +## Text functions Funzioni di testo +## +ASC = ASC ## Modifica le lettere inglesi o il katakana a doppio byte all'interno di una stringa di caratteri in caratteri a singolo byte +BAHTTEXT = BAHTTESTO ## Converte un numero in testo, utilizzando il formato valuta ß (baht) +CHAR = CODICE.CARATT ## Restituisce il carattere specificato dal numero di codice +CLEAN = LIBERA ## Elimina dal testo tutti i caratteri che non è possibile stampare +CODE = CODICE ## Restituisce il codice numerico del primo carattere di una stringa di testo +CONCATENATE = CONCATENA ## Unisce diversi elementi di testo in un unico elemento di testo +DOLLAR = VALUTA ## Converte un numero in testo, utilizzando il formato valuta € (euro) +EXACT = IDENTICO ## Verifica se due valori di testo sono uguali +FIND = TROVA ## Rileva un valore di testo all'interno di un altro (distinzione tra maiuscole e minuscole) +FINDB = TROVA.B ## Rileva un valore di testo all'interno di un altro (distinzione tra maiuscole e minuscole) +FIXED = FISSO ## Formatta un numero come testo con un numero fisso di decimali +JIS = ORDINAMENTO.JIS ## Modifica le lettere inglesi o i caratteri katakana a byte singolo all'interno di una stringa di caratteri in caratteri a byte doppio. +LEFT = SINISTRA ## Restituisce il carattere più a sinistra di un valore di testo +LEFTB = SINISTRA.B ## Restituisce il carattere più a sinistra di un valore di testo +LEN = LUNGHEZZA ## Restituisce il numero di caratteri di una stringa di testo +LENB = LUNB ## Restituisce il numero di caratteri di una stringa di testo +LOWER = MINUSC ## Converte il testo in lettere minuscole +MID = MEDIA ## Restituisce un numero specifico di caratteri di una stringa di testo a partire dalla posizione specificata +MIDB = MEDIA.B ## Restituisce un numero specifico di caratteri di una stringa di testo a partire dalla posizione specificata +PHONETIC = FURIGANA ## Estrae i caratteri fonetici (furigana) da una stringa di testo. +PROPER = MAIUSC.INIZ ## Converte in maiuscolo la prima lettera di ogni parola di un valore di testo +REPLACE = RIMPIAZZA ## Sostituisce i caratteri all'interno di un testo +REPLACEB = SOSTITUISCI.B ## Sostituisce i caratteri all'interno di un testo +REPT = RIPETI ## Ripete un testo per un dato numero di volte +RIGHT = DESTRA ## Restituisce il carattere più a destra di un valore di testo +RIGHTB = DESTRA.B ## Restituisce il carattere più a destra di un valore di testo +SEARCH = RICERCA ## Rileva un valore di testo all'interno di un altro (non è sensibile alle maiuscole e minuscole) +SEARCHB = CERCA.B ## Rileva un valore di testo all'interno di un altro (non è sensibile alle maiuscole e minuscole) +SUBSTITUTE = SOSTITUISCI ## Sostituisce il nuovo testo al testo contenuto in una stringa +T = T ## Converte gli argomenti in testo +TEXT = TESTO ## Formatta un numero e lo converte in testo +TRIM = ANNULLA.SPAZI ## Elimina gli spazi dal testo +UPPER = MAIUSC ## Converte il testo in lettere maiuscole +VALUE = VALORE ## Converte un argomento di testo in numero diff --git a/application/third_party/PHPExcel/PHPExcel/locale/nl/config b/application/third_party/PHPExcel/PHPExcel/locale/nl/config new file mode 100644 index 0000000..48dcc15 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/nl/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = € + + +## +## Excel Error Codes (For future use) +## +NULL = #LEEG! +DIV0 = #DEEL/0! +VALUE = #WAARDE! +REF = #VERW! +NAME = #NAAM? +NUM = #GETAL! +NA = #N/B diff --git a/application/third_party/PHPExcel/PHPExcel/locale/nl/functions b/application/third_party/PHPExcel/PHPExcel/locale/nl/functions new file mode 100644 index 0000000..573600a --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/nl/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Automatiseringsfuncties en functies in invoegtoepassingen +## +GETPIVOTDATA = DRAAITABEL.OPHALEN ## Geeft gegevens uit een draaitabelrapport als resultaat + + +## +## Cube functions Kubusfuncties +## +CUBEKPIMEMBER = KUBUSKPILID ## Retourneert de naam, eigenschap en waarde van een KPI (prestatie-indicator) en geeft de naam en de eigenschap in de cel weer. Een KPI is een meetbare waarde, zoals de maandelijkse brutowinst of de omzet per kwartaal per werknemer, die wordt gebruikt om de prestaties van een organisatie te bewaken +CUBEMEMBER = KUBUSLID ## Retourneert een lid of tupel in een kubushiërarchie. Wordt gebruikt om te controleren of het lid of de tupel in de kubus aanwezig is +CUBEMEMBERPROPERTY = KUBUSLIDEIGENSCHAP ## Retourneert de waarde van een lideigenschap in de kubus. Wordt gebruikt om te controleren of de lidnaam in de kubus bestaat en retourneert de opgegeven eigenschap voor dit lid +CUBERANKEDMEMBER = KUBUSGERANGCHIKTLID ## Retourneert het zoveelste, gerangschikte lid in een set. Wordt gebruikt om een of meer elementen in een set te retourneren, zoals de tien beste verkopers of de tien beste studenten +CUBESET = KUBUSSET ## Definieert een berekende set leden of tupels door een ingestelde expressie naar de kubus op de server te sturen, alwaar de set wordt gemaakt en vervolgens wordt geretourneerd naar Microsoft Office Excel +CUBESETCOUNT = KUBUSSETAANTAL ## Retourneert het aantal onderdelen in een set +CUBEVALUE = KUBUSWAARDE ## Retourneert een samengestelde waarde van een kubus + + +## +## Database functions Databasefuncties +## +DAVERAGE = DBGEMIDDELDE ## Berekent de gemiddelde waarde in geselecteerde databasegegevens +DCOUNT = DBAANTAL ## Telt de cellen met getallen in een database +DCOUNTA = DBAANTALC ## Telt de niet-lege cellen in een database +DGET = DBLEZEN ## Retourneert één record dat voldoet aan de opgegeven criteria uit een database +DMAX = DBMAX ## Retourneert de maximumwaarde in de geselecteerde databasegegevens +DMIN = DBMIN ## Retourneert de minimumwaarde in de geselecteerde databasegegevens +DPRODUCT = DBPRODUCT ## Vermenigvuldigt de waarden in een bepaald veld van de records die voldoen aan de criteria in een database +DSTDEV = DBSTDEV ## Maakt een schatting van de standaarddeviatie op basis van een steekproef uit geselecteerde databasegegevens +DSTDEVP = DBSTDEVP ## Berekent de standaarddeviatie op basis van de volledige populatie van geselecteerde databasegegevens +DSUM = DBSOM ## Telt de getallen uit een kolom records in de database op die voldoen aan de criteria +DVAR = DBVAR ## Maakt een schatting van de variantie op basis van een steekproef uit geselecteerde databasegegevens +DVARP = DBVARP ## Berekent de variantie op basis van de volledige populatie van geselecteerde databasegegevens + + +## +## Date and time functions Datum- en tijdfuncties +## +DATE = DATUM ## Geeft als resultaat het seriële getal van een opgegeven datum +DATEVALUE = DATUMWAARDE ## Converteert een datum in de vorm van tekst naar een serieel getal +DAY = DAG ## Converteert een serieel getal naar een dag van de maand +DAYS360 = DAGEN360 ## Berekent het aantal dagen tussen twee datums op basis van een jaar met 360 dagen +EDATE = ZELFDE.DAG ## Geeft als resultaat het seriële getal van een datum die het opgegeven aantal maanden voor of na de begindatum ligt +EOMONTH = LAATSTE.DAG ## Geeft als resultaat het seriële getal van de laatste dag van de maand voor of na het opgegeven aantal maanden +HOUR = UUR ## Converteert een serieel getal naar uren +MINUTE = MINUUT ## Converteert een serieel naar getal minuten +MONTH = MAAND ## Converteert een serieel getal naar een maand +NETWORKDAYS = NETTO.WERKDAGEN ## Geeft als resultaat het aantal hele werkdagen tussen twee datums +NOW = NU ## Geeft als resultaat het seriële getal van de huidige datum en tijd +SECOND = SECONDE ## Converteert een serieel getal naar seconden +TIME = TIJD ## Geeft als resultaat het seriële getal van een bepaald tijdstip +TIMEVALUE = TIJDWAARDE ## Converteert de tijd in de vorm van tekst naar een serieel getal +TODAY = VANDAAG ## Geeft als resultaat het seriële getal van de huidige datum +WEEKDAY = WEEKDAG ## Converteert een serieel getal naar een weekdag +WEEKNUM = WEEKNUMMER ## Converteert een serieel getal naar een weeknummer +WORKDAY = WERKDAG ## Geeft als resultaat het seriële getal van de datum voor of na een bepaald aantal werkdagen +YEAR = JAAR ## Converteert een serieel getal naar een jaar +YEARFRAC = JAAR.DEEL ## Geeft als resultaat het gedeelte van het jaar, uitgedrukt in het aantal hele dagen tussen begindatum en einddatum + + +## +## Engineering functions Technische functies +## +BESSELI = BESSEL.Y ## Geeft als resultaat de gewijzigde Bessel-functie In(x) +BESSELJ = BESSEL.J ## Geeft als resultaat de Bessel-functie Jn(x) +BESSELK = BESSEL.K ## Geeft als resultaat de gewijzigde Bessel-functie Kn(x) +BESSELY = BESSEL.Y ## Geeft als resultaat de gewijzigde Bessel-functie Yn(x) +BIN2DEC = BIN.N.DEC ## Converteert een binair getal naar een decimaal getal +BIN2HEX = BIN.N.HEX ## Converteert een binair getal naar een hexadecimaal getal +BIN2OCT = BIN.N.OCT ## Converteert een binair getal naar een octaal getal +COMPLEX = COMPLEX ## Converteert reële en imaginaire coëfficiënten naar een complex getal +CONVERT = CONVERTEREN ## Converteert een getal in de ene maateenheid naar een getal in een andere maateenheid +DEC2BIN = DEC.N.BIN ## Converteert een decimaal getal naar een binair getal +DEC2HEX = DEC.N.HEX ## Converteert een decimaal getal naar een hexadecimaal getal +DEC2OCT = DEC.N.OCT ## Converteert een decimaal getal naar een octaal getal +DELTA = DELTA ## Test of twee waarden gelijk zijn +ERF = FOUTFUNCTIE ## Geeft als resultaat de foutfunctie +ERFC = FOUT.COMPLEMENT ## Geeft als resultaat de complementaire foutfunctie +GESTEP = GROTER.DAN ## Test of een getal groter is dan de drempelwaarde +HEX2BIN = HEX.N.BIN ## Converteert een hexadecimaal getal naar een binair getal +HEX2DEC = HEX.N.DEC ## Converteert een hexadecimaal getal naar een decimaal getal +HEX2OCT = HEX.N.OCT ## Converteert een hexadecimaal getal naar een octaal getal +IMABS = C.ABS ## Geeft als resultaat de absolute waarde (modulus) van een complex getal +IMAGINARY = C.IM.DEEL ## Geeft als resultaat de imaginaire coëfficiënt van een complex getal +IMARGUMENT = C.ARGUMENT ## Geeft als resultaat het argument thèta, een hoek uitgedrukt in radialen +IMCONJUGATE = C.TOEGEVOEGD ## Geeft als resultaat het complexe toegevoegde getal van een complex getal +IMCOS = C.COS ## Geeft als resultaat de cosinus van een complex getal +IMDIV = C.QUOTIENT ## Geeft als resultaat het quotiënt van twee complexe getallen +IMEXP = C.EXP ## Geeft als resultaat de exponent van een complex getal +IMLN = C.LN ## Geeft als resultaat de natuurlijke logaritme van een complex getal +IMLOG10 = C.LOG10 ## Geeft als resultaat de logaritme met grondtal 10 van een complex getal +IMLOG2 = C.LOG2 ## Geeft als resultaat de logaritme met grondtal 2 van een complex getal +IMPOWER = C.MACHT ## Geeft als resultaat een complex getal dat is verheven tot de macht van een geheel getal +IMPRODUCT = C.PRODUCT ## Geeft als resultaat het product van complexe getallen +IMREAL = C.REEEL.DEEL ## Geeft als resultaat de reële coëfficiënt van een complex getal +IMSIN = C.SIN ## Geeft als resultaat de sinus van een complex getal +IMSQRT = C.WORTEL ## Geeft als resultaat de vierkantswortel van een complex getal +IMSUB = C.VERSCHIL ## Geeft als resultaat het verschil tussen twee complexe getallen +IMSUM = C.SOM ## Geeft als resultaat de som van complexe getallen +OCT2BIN = OCT.N.BIN ## Converteert een octaal getal naar een binair getal +OCT2DEC = OCT.N.DEC ## Converteert een octaal getal naar een decimaal getal +OCT2HEX = OCT.N.HEX ## Converteert een octaal getal naar een hexadecimaal getal + + +## +## Financial functions Financiële functies +## +ACCRINT = SAMENG.RENTE ## Berekent de opgelopen rente voor een waardepapier waarvan de rente periodiek wordt uitgekeerd +ACCRINTM = SAMENG.RENTE.V ## Berekent de opgelopen rente voor een waardepapier waarvan de rente op de vervaldatum wordt uitgekeerd +AMORDEGRC = AMORDEGRC ## Geeft als resultaat de afschrijving voor elke boekingsperiode door een afschrijvingscoëfficiënt toe te passen +AMORLINC = AMORLINC ## Berekent de afschrijving voor elke boekingsperiode +COUPDAYBS = COUP.DAGEN.BB ## Berekent het aantal dagen vanaf het begin van de coupontermijn tot de stortingsdatum +COUPDAYS = COUP.DAGEN ## Geeft als resultaat het aantal dagen in de coupontermijn waarin de stortingsdatum valt +COUPDAYSNC = COUP.DAGEN.VV ## Geeft als resultaat het aantal dagen vanaf de stortingsdatum tot de volgende couponvervaldatum +COUPNCD = COUP.DATUM.NB ## Geeft als resultaat de volgende coupondatum na de stortingsdatum +COUPNUM = COUP.AANTAL ## Geeft als resultaat het aantal coupons dat nog moet worden uitbetaald tussen de stortingsdatum en de vervaldatum +COUPPCD = COUP.DATUM.VB ## Geeft als resultaat de vorige couponvervaldatum vóór de stortingsdatum +CUMIPMT = CUM.RENTE ## Geeft als resultaat de cumulatieve rente die tussen twee termijnen is uitgekeerd +CUMPRINC = CUM.HOOFDSOM ## Geeft als resultaat de cumulatieve hoofdsom van een lening die tussen twee termijnen is terugbetaald +DB = DB ## Geeft als resultaat de afschrijving van activa voor een bepaalde periode met behulp van de 'fixed declining balance'-methode +DDB = DDB ## Geeft als resultaat de afschrijving van activa over een bepaalde termijn met behulp van de 'double declining balance'-methode of een andere methode die u opgeeft +DISC = DISCONTO ## Geeft als resultaat het discontopercentage voor een waardepapier +DOLLARDE = EURO.DE ## Converteert een prijs in euro's, uitgedrukt in een breuk, naar een prijs in euro's, uitgedrukt in een decimaal getal +DOLLARFR = EURO.BR ## Converteert een prijs in euro's, uitgedrukt in een decimaal getal, naar een prijs in euro's, uitgedrukt in een breuk +DURATION = DUUR ## Geeft als resultaat de gewogen gemiddelde looptijd voor een waardepapier met periodieke rentebetalingen +EFFECT = EFFECT.RENTE ## Geeft als resultaat het effectieve jaarlijkse rentepercentage +FV = TW ## Geeft als resultaat de toekomstige waarde van een investering +FVSCHEDULE = TOEK.WAARDE2 ## Geeft als resultaat de toekomstige waarde van een bepaalde hoofdsom na het toepassen van een reeks samengestelde rentepercentages +INTRATE = RENTEPERCENTAGE ## Geeft als resultaat het rentepercentage voor een volgestort waardepapier +IPMT = IBET ## Geeft als resultaat de te betalen rente voor een investering over een bepaalde termijn +IRR = IR ## Geeft als resultaat de interne rentabiliteit voor een reeks cashflows +ISPMT = ISBET ## Geeft als resultaat de rente die is betaald tijdens een bepaalde termijn van een investering +MDURATION = AANG.DUUR ## Geeft als resultaat de aangepaste Macauley-looptijd voor een waardepapier, aangenomen dat de nominale waarde € 100 bedraagt +MIRR = GIR ## Geeft als resultaat de interne rentabiliteit voor een serie cashflows, waarbij voor betalingen een ander rentepercentage geldt dan voor inkomsten +NOMINAL = NOMINALE.RENTE ## Geeft als resultaat het nominale jaarlijkse rentepercentage +NPER = NPER ## Geeft als resultaat het aantal termijnen van een investering +NPV = NHW ## Geeft als resultaat de netto huidige waarde van een investering op basis van een reeks periodieke cashflows en een discontopercentage +ODDFPRICE = AFW.ET.PRIJS ## Geeft als resultaat de prijs per € 100 nominale waarde voor een waardepapier met een afwijkende eerste termijn +ODDFYIELD = AFW.ET.REND ## Geeft als resultaat het rendement voor een waardepapier met een afwijkende eerste termijn +ODDLPRICE = AFW.LT.PRIJS ## Geeft als resultaat de prijs per € 100 nominale waarde voor een waardepapier met een afwijkende laatste termijn +ODDLYIELD = AFW.LT.REND ## Geeft als resultaat het rendement voor een waardepapier met een afwijkende laatste termijn +PMT = BET ## Geeft als resultaat de periodieke betaling voor een annuïteit +PPMT = PBET ## Geeft als resultaat de afbetaling op de hoofdsom voor een bepaalde termijn +PRICE = PRIJS.NOM ## Geeft als resultaat de prijs per € 100 nominale waarde voor een waardepapier waarvan de rente periodiek wordt uitgekeerd +PRICEDISC = PRIJS.DISCONTO ## Geeft als resultaat de prijs per € 100 nominale waarde voor een verdisconteerd waardepapier +PRICEMAT = PRIJS.VERVALDAG ## Geeft als resultaat de prijs per € 100 nominale waarde voor een waardepapier waarvan de rente wordt uitgekeerd op de vervaldatum +PV = HW ## Geeft als resultaat de huidige waarde van een investering +RATE = RENTE ## Geeft als resultaat het periodieke rentepercentage voor een annuïteit +RECEIVED = OPBRENGST ## Geeft als resultaat het bedrag dat op de vervaldatum wordt uitgekeerd voor een volgestort waardepapier +SLN = LIN.AFSCHR ## Geeft als resultaat de lineaire afschrijving van activa over één termijn +SYD = SYD ## Geeft als resultaat de afschrijving van activa over een bepaalde termijn met behulp van de 'Sum-Of-Years-Digits'-methode +TBILLEQ = SCHATK.OBL ## Geeft als resultaat het rendement op schatkistpapier, dat op dezelfde manier wordt berekend als het rendement op obligaties +TBILLPRICE = SCHATK.PRIJS ## Bepaalt de prijs per € 100 nominale waarde voor schatkistpapier +TBILLYIELD = SCHATK.REND ## Berekent het rendement voor schatkistpapier +VDB = VDB ## Geeft als resultaat de afschrijving van activa over een gehele of gedeeltelijke termijn met behulp van de 'declining balance'-methode +XIRR = IR.SCHEMA ## Berekent de interne rentabiliteit voor een betalingsschema van cashflows +XNPV = NHW2 ## Berekent de huidige nettowaarde voor een betalingsschema van cashflows +YIELD = RENDEMENT ## Geeft als resultaat het rendement voor een waardepapier waarvan de rente periodiek wordt uitgekeerd +YIELDDISC = REND.DISCONTO ## Geeft als resultaat het jaarlijkse rendement voor een verdisconteerd waardepapier, bijvoorbeeld schatkistpapier +YIELDMAT = REND.VERVAL ## Geeft als resultaat het jaarlijkse rendement voor een waardepapier waarvan de rente wordt uitgekeerd op de vervaldatum + + +## +## Information functions Informatiefuncties +## +CELL = CEL ## Geeft als resultaat informatie over de opmaak, locatie of inhoud van een cel +ERROR.TYPE = TYPE.FOUT ## Geeft als resultaat een getal dat overeenkomt met een van de foutwaarden van Microsoft Excel +INFO = INFO ## Geeft als resultaat informatie over de huidige besturingsomgeving +ISBLANK = ISLEEG ## Geeft als resultaat WAAR als de waarde leeg is +ISERR = ISFOUT2 ## Geeft als resultaat WAAR als de waarde een foutwaarde is, met uitzondering van #N/B +ISERROR = ISFOUT ## Geeft als resultaat WAAR als de waarde een foutwaarde is +ISEVEN = IS.EVEN ## Geeft als resultaat WAAR als het getal even is +ISLOGICAL = ISLOGISCH ## Geeft als resultaat WAAR als de waarde een logische waarde is +ISNA = ISNB ## Geeft als resultaat WAAR als de waarde de foutwaarde #N/B is +ISNONTEXT = ISGEENTEKST ## Geeft als resultaat WAAR als de waarde geen tekst is +ISNUMBER = ISGETAL ## Geeft als resultaat WAAR als de waarde een getal is +ISODD = IS.ONEVEN ## Geeft als resultaat WAAR als het getal oneven is +ISREF = ISVERWIJZING ## Geeft als resultaat WAAR als de waarde een verwijzing is +ISTEXT = ISTEKST ## Geeft als resultaat WAAR als de waarde tekst is +N = N ## Geeft als resultaat een waarde die is geconverteerd naar een getal +NA = NB ## Geeft als resultaat de foutwaarde #N/B +TYPE = TYPE ## Geeft als resultaat een getal dat het gegevenstype van een waarde aangeeft + + +## +## Logical functions Logische functies +## +AND = EN ## Geeft als resultaat WAAR als alle argumenten WAAR zijn +FALSE = ONWAAR ## Geeft als resultaat de logische waarde ONWAAR +IF = ALS ## Geeft een logische test aan +IFERROR = ALS.FOUT ## Retourneert een waarde die u opgeeft als een formule een fout oplevert, anders wordt het resultaat van de formule geretourneerd +NOT = NIET ## Keert de logische waarde van het argument om +OR = OF ## Geeft als resultaat WAAR als minimaal een van de argumenten WAAR is +TRUE = WAAR ## Geeft als resultaat de logische waarde WAAR + + +## +## Lookup and reference functions Zoek- en verwijzingsfuncties +## +ADDRESS = ADRES ## Geeft als resultaat een verwijzing, in de vorm van tekst, naar één bepaalde cel in een werkblad +AREAS = BEREIKEN ## Geeft als resultaat het aantal bereiken in een verwijzing +CHOOSE = KIEZEN ## Kiest een waarde uit een lijst met waarden +COLUMN = KOLOM ## Geeft als resultaat het kolomnummer van een verwijzing +COLUMNS = KOLOMMEN ## Geeft als resultaat het aantal kolommen in een verwijzing +HLOOKUP = HORIZ.ZOEKEN ## Zoekt in de bovenste rij van een matrix naar een bepaalde waarde en geeft als resultaat de gevonden waarde in de opgegeven cel +HYPERLINK = HYPERLINK ## Maakt een snelkoppeling of een sprong waarmee een document wordt geopend dat is opgeslagen op een netwerkserver, een intranet of op internet +INDEX = INDEX ## Kiest met een index een waarde uit een verwijzing of een matrix +INDIRECT = INDIRECT ## Geeft als resultaat een verwijzing die wordt aangegeven met een tekstwaarde +LOOKUP = ZOEKEN ## Zoekt naar bepaalde waarden in een vector of een matrix +MATCH = VERGELIJKEN ## Zoekt naar bepaalde waarden in een verwijzing of een matrix +OFFSET = VERSCHUIVING ## Geeft als resultaat een nieuwe verwijzing die is verschoven ten opzichte van een bepaalde verwijzing +ROW = RIJ ## Geeft als resultaat het rijnummer van een verwijzing +ROWS = RIJEN ## Geeft als resultaat het aantal rijen in een verwijzing +RTD = RTG ## Haalt realtimegegevens op uit een programma dat COM-automatisering (automatisering: een methode waarmee de ene toepassing objecten van een andere toepassing of ontwikkelprogramma kan besturen. Automatisering werd vroeger OLE-automatisering genoemd. Automatisering is een industrienorm die deel uitmaakt van het Component Object Model (COM).) ondersteunt +TRANSPOSE = TRANSPONEREN ## Geeft als resultaat de getransponeerde van een matrix +VLOOKUP = VERT.ZOEKEN ## Zoekt in de meest linkse kolom van een matrix naar een bepaalde waarde en geeft als resultaat de waarde in de opgegeven cel + + +## +## Math and trigonometry functions Wiskundige en trigonometrische functies +## +ABS = ABS ## Geeft als resultaat de absolute waarde van een getal +ACOS = BOOGCOS ## Geeft als resultaat de boogcosinus van een getal +ACOSH = BOOGCOSH ## Geeft als resultaat de inverse cosinus hyperbolicus van een getal +ASIN = BOOGSIN ## Geeft als resultaat de boogsinus van een getal +ASINH = BOOGSINH ## Geeft als resultaat de inverse sinus hyperbolicus van een getal +ATAN = BOOGTAN ## Geeft als resultaat de boogtangens van een getal +ATAN2 = BOOGTAN2 ## Geeft als resultaat de boogtangens van de x- en y-coördinaten +ATANH = BOOGTANH ## Geeft als resultaat de inverse tangens hyperbolicus van een getal +CEILING = AFRONDEN.BOVEN ## Rondt de absolute waarde van een getal naar boven af op het dichtstbijzijnde gehele getal of het dichtstbijzijnde significante veelvoud +COMBIN = COMBINATIES ## Geeft als resultaat het aantal combinaties voor een bepaald aantal objecten +COS = COS ## Geeft als resultaat de cosinus van een getal +COSH = COSH ## Geeft als resultaat de cosinus hyperbolicus van een getal +DEGREES = GRADEN ## Converteert radialen naar graden +EVEN = EVEN ## Rondt het getal af op het dichtstbijzijnde gehele even getal +EXP = EXP ## Verheft e tot de macht van een bepaald getal +FACT = FACULTEIT ## Geeft als resultaat de faculteit van een getal +FACTDOUBLE = DUBBELE.FACULTEIT ## Geeft als resultaat de dubbele faculteit van een getal +FLOOR = AFRONDEN.BENEDEN ## Rondt de absolute waarde van een getal naar beneden af +GCD = GGD ## Geeft als resultaat de grootste gemene deler +INT = INTEGER ## Rondt een getal naar beneden af op het dichtstbijzijnde gehele getal +LCM = KGV ## Geeft als resultaat het kleinste gemene veelvoud +LN = LN ## Geeft als resultaat de natuurlijke logaritme van een getal +LOG = LOG ## Geeft als resultaat de logaritme met het opgegeven grondtal van een getal +LOG10 = LOG10 ## Geeft als resultaat de logaritme met grondtal 10 van een getal +MDETERM = DETERMINANTMAT ## Geeft als resultaat de determinant van een matrix +MINVERSE = INVERSEMAT ## Geeft als resultaat de inverse van een matrix +MMULT = PRODUCTMAT ## Geeft als resultaat het product van twee matrices +MOD = REST ## Geeft als resultaat het restgetal van een deling +MROUND = AFRONDEN.N.VEELVOUD ## Geeft als resultaat een getal afgerond op het gewenste veelvoud +MULTINOMIAL = MULTINOMIAAL ## Geeft als resultaat de multinomiaalcoëfficiënt van een reeks getallen +ODD = ONEVEN ## Rondt de absolute waarde van het getal naar boven af op het dichtstbijzijnde gehele oneven getal +PI = PI ## Geeft als resultaat de waarde van pi +POWER = MACHT ## Verheft een getal tot een macht +PRODUCT = PRODUCT ## Vermenigvuldigt de argumenten met elkaar +QUOTIENT = QUOTIENT ## Geeft als resultaat de uitkomst van een deling als geheel getal +RADIANS = RADIALEN ## Converteert graden naar radialen +RAND = ASELECT ## Geeft als resultaat een willekeurig getal tussen 0 en 1 +RANDBETWEEN = ASELECTTUSSEN ## Geeft een willekeurig getal tussen de getallen die u hebt opgegeven +ROMAN = ROMEINS ## Converteert een Arabisch getal naar een Romeins getal en geeft het resultaat weer in de vorm van tekst +ROUND = AFRONDEN ## Rondt een getal af op het opgegeven aantal decimalen +ROUNDDOWN = AFRONDEN.NAAR.BENEDEN ## Rondt de absolute waarde van een getal naar beneden af +ROUNDUP = AFRONDEN.NAAR.BOVEN ## Rondt de absolute waarde van een getal naar boven af +SERIESSUM = SOM.MACHTREEKS ## Geeft als resultaat de som van een machtreeks die is gebaseerd op de formule +SIGN = POS.NEG ## Geeft als resultaat het teken van een getal +SIN = SIN ## Geeft als resultaat de sinus van de opgegeven hoek +SINH = SINH ## Geeft als resultaat de sinus hyperbolicus van een getal +SQRT = WORTEL ## Geeft als resultaat de positieve vierkantswortel van een getal +SQRTPI = WORTEL.PI ## Geeft als resultaat de vierkantswortel van (getal * pi) +SUBTOTAL = SUBTOTAAL ## Geeft als resultaat een subtotaal voor een bereik +SUM = SOM ## Telt de argumenten op +SUMIF = SOM.ALS ## Telt de getallen bij elkaar op die voldoen aan een bepaald criterium +SUMIFS = SOMMEN.ALS ## Telt de cellen in een bereik op die aan meerdere criteria voldoen +SUMPRODUCT = SOMPRODUCT ## Geeft als resultaat de som van de producten van de corresponderende matrixelementen +SUMSQ = KWADRATENSOM ## Geeft als resultaat de som van de kwadraten van de argumenten +SUMX2MY2 = SOM.X2MINY2 ## Geeft als resultaat de som van het verschil tussen de kwadraten van corresponderende waarden in twee matrices +SUMX2PY2 = SOM.X2PLUSY2 ## Geeft als resultaat de som van de kwadratensom van corresponderende waarden in twee matrices +SUMXMY2 = SOM.XMINY.2 ## Geeft als resultaat de som van de kwadraten van de verschillen tussen de corresponderende waarden in twee matrices +TAN = TAN ## Geeft als resultaat de tangens van een getal +TANH = TANH ## Geeft als resultaat de tangens hyperbolicus van een getal +TRUNC = GEHEEL ## Kapt een getal af tot een geheel getal + + +## +## Statistical functions Statistische functies +## +AVEDEV = GEM.DEVIATIE ## Geeft als resultaat het gemiddelde van de absolute deviaties van gegevenspunten ten opzichte van hun gemiddelde waarde +AVERAGE = GEMIDDELDE ## Geeft als resultaat het gemiddelde van de argumenten +AVERAGEA = GEMIDDELDEA ## Geeft als resultaat het gemiddelde van de argumenten, inclusief getallen, tekst en logische waarden +AVERAGEIF = GEMIDDELDE.ALS ## Geeft het gemiddelde (rekenkundig gemiddelde) als resultaat van alle cellen in een bereik die voldoen aan de opgegeven criteria +AVERAGEIFS = GEMIDDELDEN.ALS ## Geeft het gemiddelde (rekenkundig gemiddelde) als resultaat van alle cellen die aan meerdere criteria voldoen +BETADIST = BETA.VERD ## Geeft als resultaat de cumulatieve bèta-verdelingsfunctie +BETAINV = BETA.INV ## Geeft als resultaat de inverse van de cumulatieve verdelingsfunctie voor een gegeven bèta-verdeling +BINOMDIST = BINOMIALE.VERD ## Geeft als resultaat de binomiale verdeling +CHIDIST = CHI.KWADRAAT ## Geeft als resultaat de eenzijdige kans van de chi-kwadraatverdeling +CHIINV = CHI.KWADRAAT.INV ## Geeft als resultaat de inverse van een eenzijdige kans van de chi-kwadraatverdeling +CHITEST = CHI.TOETS ## Geeft als resultaat de onafhankelijkheidstoets +CONFIDENCE = BETROUWBAARHEID ## Geeft als resultaat het betrouwbaarheidsinterval van een gemiddelde waarde voor de elementen van een populatie +CORREL = CORRELATIE ## Geeft als resultaat de correlatiecoëfficiënt van twee gegevensverzamelingen +COUNT = AANTAL ## Telt het aantal getallen in de argumentenlijst +COUNTA = AANTALARG ## Telt het aantal waarden in de argumentenlijst +COUNTBLANK = AANTAL.LEGE.CELLEN ## Telt het aantal lege cellen in een bereik +COUNTIF = AANTAL.ALS ## Telt in een bereik het aantal cellen die voldoen aan een bepaald criterium +COUNTIFS = AANTALLEN.ALS ## Telt in een bereik het aantal cellen die voldoen aan meerdere criteria +COVAR = COVARIANTIE ## Geeft als resultaat de covariantie, het gemiddelde van de producten van de gepaarde deviaties +CRITBINOM = CRIT.BINOM ## Geeft als resultaat de kleinste waarde waarvoor de binomiale verdeling kleiner is dan of gelijk is aan het criterium +DEVSQ = DEV.KWAD ## Geeft als resultaat de som van de deviaties in het kwadraat +EXPONDIST = EXPON.VERD ## Geeft als resultaat de exponentiële verdeling +FDIST = F.VERDELING ## Geeft als resultaat de F-verdeling +FINV = F.INVERSE ## Geeft als resultaat de inverse van de F-verdeling +FISHER = FISHER ## Geeft als resultaat de Fisher-transformatie +FISHERINV = FISHER.INV ## Geeft als resultaat de inverse van de Fisher-transformatie +FORECAST = VOORSPELLEN ## Geeft als resultaat een waarde op basis van een lineaire trend +FREQUENCY = FREQUENTIE ## Geeft als resultaat een frequentieverdeling in de vorm van een verticale matrix +FTEST = F.TOETS ## Geeft als resultaat een F-toets +GAMMADIST = GAMMA.VERD ## Geeft als resultaat de gamma-verdeling +GAMMAINV = GAMMA.INV ## Geeft als resultaat de inverse van de cumulatieve gamma-verdeling +GAMMALN = GAMMA.LN ## Geeft als resultaat de natuurlijke logaritme van de gamma-functie, G(x) +GEOMEAN = MEETK.GEM ## Geeft als resultaat het meetkundige gemiddelde +GROWTH = GROEI ## Geeft als resultaat de waarden voor een exponentiële trend +HARMEAN = HARM.GEM ## Geeft als resultaat het harmonische gemiddelde +HYPGEOMDIST = HYPERGEO.VERD ## Geeft als resultaat de hypergeometrische verdeling +INTERCEPT = SNIJPUNT ## Geeft als resultaat het snijpunt van de lineaire regressielijn met de y-as +KURT = KURTOSIS ## Geeft als resultaat de kurtosis van een gegevensverzameling +LARGE = GROOTSTE ## Geeft als resultaat de op k-1 na grootste waarde in een gegevensverzameling +LINEST = LIJNSCH ## Geeft als resultaat de parameters van een lineaire trend +LOGEST = LOGSCH ## Geeft als resultaat de parameters van een exponentiële trend +LOGINV = LOG.NORM.INV ## Geeft als resultaat de inverse van de logaritmische normale verdeling +LOGNORMDIST = LOG.NORM.VERD ## Geeft als resultaat de cumulatieve logaritmische normale verdeling +MAX = MAX ## Geeft als resultaat de maximumwaarde in een lijst met argumenten +MAXA = MAXA ## Geeft als resultaat de maximumwaarde in een lijst met argumenten, inclusief getallen, tekst en logische waarden +MEDIAN = MEDIAAN ## Geeft als resultaat de mediaan van de opgegeven getallen +MIN = MIN ## Geeft als resultaat de minimumwaarde in een lijst met argumenten +MINA = MINA ## Geeft als resultaat de minimumwaarde in een lijst met argumenten, inclusief getallen, tekst en logische waarden +MODE = MODUS ## Geeft als resultaat de meest voorkomende waarde in een gegevensverzameling +NEGBINOMDIST = NEG.BINOM.VERD ## Geeft als resultaat de negatieve binomiaalverdeling +NORMDIST = NORM.VERD ## Geeft als resultaat de cumulatieve normale verdeling +NORMINV = NORM.INV ## Geeft als resultaat de inverse van de cumulatieve standaardnormale verdeling +NORMSDIST = STAND.NORM.VERD ## Geeft als resultaat de cumulatieve standaardnormale verdeling +NORMSINV = STAND.NORM.INV ## Geeft als resultaat de inverse van de cumulatieve normale verdeling +PEARSON = PEARSON ## Geeft als resultaat de correlatiecoëfficiënt van Pearson +PERCENTILE = PERCENTIEL ## Geeft als resultaat het k-de percentiel van waarden in een bereik +PERCENTRANK = PERCENT.RANG ## Geeft als resultaat de positie, in procenten uitgedrukt, van een waarde in de rangorde van een gegevensverzameling +PERMUT = PERMUTATIES ## Geeft als resultaat het aantal permutaties voor een gegeven aantal objecten +POISSON = POISSON ## Geeft als resultaat de Poisson-verdeling +PROB = KANS ## Geeft als resultaat de kans dat waarden zich tussen twee grenzen bevinden +QUARTILE = KWARTIEL ## Geeft als resultaat het kwartiel van een gegevensverzameling +RANK = RANG ## Geeft als resultaat het rangnummer van een getal in een lijst getallen +RSQ = R.KWADRAAT ## Geeft als resultaat het kwadraat van de Pearson-correlatiecoëfficiënt +SKEW = SCHEEFHEID ## Geeft als resultaat de mate van asymmetrie van een verdeling +SLOPE = RICHTING ## Geeft als resultaat de richtingscoëfficiënt van een lineaire regressielijn +SMALL = KLEINSTE ## Geeft als resultaat de op k-1 na kleinste waarde in een gegevensverzameling +STANDARDIZE = NORMALISEREN ## Geeft als resultaat een genormaliseerde waarde +STDEV = STDEV ## Maakt een schatting van de standaarddeviatie op basis van een steekproef +STDEVA = STDEVA ## Maakt een schatting van de standaarddeviatie op basis van een steekproef, inclusief getallen, tekst en logische waarden +STDEVP = STDEVP ## Berekent de standaarddeviatie op basis van de volledige populatie +STDEVPA = STDEVPA ## Berekent de standaarddeviatie op basis van de volledige populatie, inclusief getallen, tekst en logische waarden +STEYX = STAND.FOUT.YX ## Geeft als resultaat de standaardfout in de voorspelde y-waarde voor elke x in een regressie +TDIST = T.VERD ## Geeft als resultaat de Student T-verdeling +TINV = T.INV ## Geeft als resultaat de inverse van de Student T-verdeling +TREND = TREND ## Geeft als resultaat de waarden voor een lineaire trend +TRIMMEAN = GETRIMD.GEM ## Geeft als resultaat het gemiddelde van waarden in een gegevensverzameling +TTEST = T.TOETS ## Geeft als resultaat de kans met behulp van de Student T-toets +VAR = VAR ## Maakt een schatting van de variantie op basis van een steekproef +VARA = VARA ## Maakt een schatting van de variantie op basis van een steekproef, inclusief getallen, tekst en logische waarden +VARP = VARP ## Berekent de variantie op basis van de volledige populatie +VARPA = VARPA ## Berekent de standaarddeviatie op basis van de volledige populatie, inclusief getallen, tekst en logische waarden +WEIBULL = WEIBULL ## Geeft als resultaat de Weibull-verdeling +ZTEST = Z.TOETS ## Geeft als resultaat de eenzijdige kanswaarde van een Z-toets + + +## +## Text functions Tekstfuncties +## +ASC = ASC ## Wijzigt Nederlandse letters of katakanatekens over de volle breedte (dubbel-bytetekens) binnen een tekenreeks in tekens over de halve breedte (enkel-bytetekens) +BAHTTEXT = BAHT.TEKST ## Converteert een getal naar tekst met de valutanotatie ß (baht) +CHAR = TEKEN ## Geeft als resultaat het teken dat hoort bij de opgegeven code +CLEAN = WISSEN.CONTROL ## Verwijdert alle niet-afdrukbare tekens uit een tekst +CODE = CODE ## Geeft als resultaat de numerieke code voor het eerste teken in een tekenreeks +CONCATENATE = TEKST.SAMENVOEGEN ## Voegt verschillende tekstfragmenten samen tot één tekstfragment +DOLLAR = EURO ## Converteert een getal naar tekst met de valutanotatie € (euro) +EXACT = GELIJK ## Controleert of twee tekenreeksen identiek zijn +FIND = VIND.ALLES ## Zoekt een bepaalde tekenreeks in een tekst (waarbij onderscheid wordt gemaakt tussen hoofdletters en kleine letters) +FINDB = VIND.ALLES.B ## Zoekt een bepaalde tekenreeks in een tekst (waarbij onderscheid wordt gemaakt tussen hoofdletters en kleine letters) +FIXED = VAST ## Maakt een getal als tekst met een vast aantal decimalen op +JIS = JIS ## Wijzigt Nederlandse letters of katakanatekens over de halve breedte (enkel-bytetekens) binnen een tekenreeks in tekens over de volle breedte (dubbel-bytetekens) +LEFT = LINKS ## Geeft als resultaat de meest linkse tekens in een tekenreeks +LEFTB = LINKSB ## Geeft als resultaat de meest linkse tekens in een tekenreeks +LEN = LENGTE ## Geeft als resultaat het aantal tekens in een tekenreeks +LENB = LENGTEB ## Geeft als resultaat het aantal tekens in een tekenreeks +LOWER = KLEINE.LETTERS ## Zet tekst om in kleine letters +MID = MIDDEN ## Geeft als resultaat een bepaald aantal tekens van een tekenreeks vanaf de positie die u opgeeft +MIDB = DEELB ## Geeft als resultaat een bepaald aantal tekens van een tekenreeks vanaf de positie die u opgeeft +PHONETIC = FONETISCH ## Haalt de fonetische tekens (furigana) uit een tekenreeks op +PROPER = BEGINLETTERS ## Zet de eerste letter van elk woord in een tekst om in een hoofdletter +REPLACE = VERVANG ## Vervangt tekens binnen een tekst +REPLACEB = VERVANGENB ## Vervangt tekens binnen een tekst +REPT = HERHALING ## Herhaalt een tekst een aantal malen +RIGHT = RECHTS ## Geeft als resultaat de meest rechtse tekens in een tekenreeks +RIGHTB = RECHTSB ## Geeft als resultaat de meest rechtse tekens in een tekenreeks +SEARCH = VIND.SPEC ## Zoekt een bepaalde tekenreeks in een tekst (waarbij geen onderscheid wordt gemaakt tussen hoofdletters en kleine letters) +SEARCHB = VIND.SPEC.B ## Zoekt een bepaalde tekenreeks in een tekst (waarbij geen onderscheid wordt gemaakt tussen hoofdletters en kleine letters) +SUBSTITUTE = SUBSTITUEREN ## Vervangt oude tekst door nieuwe tekst in een tekenreeks +T = T ## Converteert de argumenten naar tekst +TEXT = TEKST ## Maakt een getal op en converteert het getal naar tekst +TRIM = SPATIES.WISSEN ## Verwijdert de spaties uit een tekst +UPPER = HOOFDLETTERS ## Zet tekst om in hoofdletters +VALUE = WAARDE ## Converteert tekst naar een getal diff --git a/application/third_party/PHPExcel/PHPExcel/locale/no/config b/application/third_party/PHPExcel/PHPExcel/locale/no/config new file mode 100644 index 0000000..bf2d34a --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/no/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = kr + + +## +## Excel Error Codes (For future use) +## +NULL = #NULL! +DIV0 = #DIV/0! +VALUE = #VERDI! +REF = #REF! +NAME = #NAVN? +NUM = #NUM! +NA = #I/T diff --git a/application/third_party/PHPExcel/PHPExcel/locale/no/functions b/application/third_party/PHPExcel/PHPExcel/locale/no/functions new file mode 100644 index 0000000..10d0a20 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/no/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Funksjonene Tillegg og Automatisering +## +GETPIVOTDATA = HENTPIVOTDATA ## Returnerer data som er lagret i en pivottabellrapport + + +## +## Cube functions Kubefunksjoner +## +CUBEKPIMEMBER = KUBEKPIMEDLEM ## Returnerer navnet, egenskapen og målet for en viktig ytelsesindikator (KPI), og viser navnet og egenskapen i cellen. En KPI er en målbar enhet, for eksempel månedlig bruttoinntjening eller kvartalsvis inntjening per ansatt, og brukes til å overvåke ytelsen i en organisasjon. +CUBEMEMBER = KUBEMEDLEM ## Returnerer et medlem eller en tuppel i et kubehierarki. Brukes til å validere at medlemmet eller tuppelen finnes i kuben. +CUBEMEMBERPROPERTY = KUBEMEDLEMEGENSKAP ## Returnerer verdien til en medlemsegenskap i kuben. Brukes til å validere at et medlemsnavn finnes i kuben, og til å returnere den angitte egenskapen for dette medlemmet. +CUBERANKEDMEMBER = KUBERANGERTMEDLEM ## Returnerer det n-te, eller rangerte, medlemmet i et sett. Brukes til å returnere ett eller flere elementer i et sett, for eksempel de 10 beste studentene. +CUBESET = KUBESETT ## Definerer et beregnet sett av medlemmer eller tuppeler ved å sende et settuttrykk til kuben på serveren, noe som oppretter settet og deretter returnerer dette settet til Microsoft Office Excel. +CUBESETCOUNT = KUBESETTANTALL ## Returnerer antallet elementer i et sett. +CUBEVALUE = KUBEVERDI ## Returnerer en aggregert verdi fra en kube. + + +## +## Database functions Databasefunksjoner +## +DAVERAGE = DGJENNOMSNITT ## Returnerer gjennomsnittet av merkede databaseposter +DCOUNT = DANTALL ## Teller celler som inneholder tall i en database +DCOUNTA = DANTALLA ## Teller celler som ikke er tomme i en database +DGET = DHENT ## Trekker ut fra en database en post som oppfyller angitte vilkår +DMAX = DMAKS ## Returnerer maksimumsverdien fra merkede databaseposter +DMIN = DMIN ## Returnerer minimumsverdien fra merkede databaseposter +DPRODUCT = DPRODUKT ## Multipliserer verdiene i et bestemt felt med poster som oppfyller vilkårene i en database +DSTDEV = DSTDAV ## Estimerer standardavviket basert på et utvalg av merkede databaseposter +DSTDEVP = DSTAVP ## Beregner standardavviket basert på at merkede databaseposter utgjør hele populasjonen +DSUM = DSUMMER ## Legger til tallene i feltkolonnen med poster, i databasen som oppfyller vilkårene +DVAR = DVARIANS ## Estimerer variansen basert på et utvalg av merkede databaseposter +DVARP = DVARIANSP ## Beregner variansen basert på at merkede databaseposter utgjør hele populasjonen + + +## +## Date and time functions Dato- og tidsfunksjoner +## +DATE = DATO ## Returnerer serienummeret som svarer til en bestemt dato +DATEVALUE = DATOVERDI ## Konverterer en dato med tekstformat til et serienummer +DAY = DAG ## Konverterer et serienummer til en dag i måneden +DAYS360 = DAGER360 ## Beregner antall dager mellom to datoer basert på et år med 360 dager +EDATE = DAG.ETTER ## Returnerer serienummeret som svarer til datoen som er det indikerte antall måneder før eller etter startdatoen +EOMONTH = MÅNEDSSLUTT ## Returnerer serienummeret som svarer til siste dag i måneden, før eller etter et angitt antall måneder +HOUR = TIME ## Konverterer et serienummer til en time +MINUTE = MINUTT ## Konverterer et serienummer til et minutt +MONTH = MÅNED ## Konverterer et serienummer til en måned +NETWORKDAYS = NETT.ARBEIDSDAGER ## Returnerer antall hele arbeidsdager mellom to datoer +NOW = NÅ ## Returnerer serienummeret som svarer til gjeldende dato og klokkeslett +SECOND = SEKUND ## Konverterer et serienummer til et sekund +TIME = TID ## Returnerer serienummeret som svarer til et bestemt klokkeslett +TIMEVALUE = TIDSVERDI ## Konverterer et klokkeslett i tekstformat til et serienummer +TODAY = IDAG ## Returnerer serienummeret som svarer til dagens dato +WEEKDAY = UKEDAG ## Konverterer et serienummer til en ukedag +WEEKNUM = UKENR ## Konverterer et serienummer til et tall som representerer hvilket nummer uken har i et år +WORKDAY = ARBEIDSDAG ## Returnerer serienummeret som svarer til datoen før eller etter et angitt antall arbeidsdager +YEAR = ÅR ## Konverterer et serienummer til et år +YEARFRAC = ÅRDEL ## Returnerer brøkdelen for året, som svarer til antall hele dager mellom startdato og sluttdato + + +## +## Engineering functions Tekniske funksjoner +## +BESSELI = BESSELI ## Returnerer den endrede Bessel-funksjonen In(x) +BESSELJ = BESSELJ ## Returnerer Bessel-funksjonen Jn(x) +BESSELK = BESSELK ## Returnerer den endrede Bessel-funksjonen Kn(x) +BESSELY = BESSELY ## Returnerer Bessel-funksjonen Yn(x) +BIN2DEC = BINTILDES ## Konverterer et binært tall til et desimaltall +BIN2HEX = BINTILHEKS ## Konverterer et binært tall til et heksadesimaltall +BIN2OCT = BINTILOKT ## Konverterer et binært tall til et oktaltall +COMPLEX = KOMPLEKS ## Konverterer reelle og imaginære koeffisienter til et komplekst tall +CONVERT = KONVERTER ## Konverterer et tall fra ett målsystem til et annet +DEC2BIN = DESTILBIN ## Konverterer et desimaltall til et binærtall +DEC2HEX = DESTILHEKS ## Konverterer et heltall i 10-tallsystemet til et heksadesimalt tall +DEC2OCT = DESTILOKT ## Konverterer et heltall i 10-tallsystemet til et oktaltall +DELTA = DELTA ## Undersøker om to verdier er like +ERF = FEILF ## Returnerer feilfunksjonen +ERFC = FEILFK ## Returnerer den komplementære feilfunksjonen +GESTEP = GRENSEVERDI ## Tester om et tall er større enn en terskelverdi +HEX2BIN = HEKSTILBIN ## Konverterer et heksadesimaltall til et binært tall +HEX2DEC = HEKSTILDES ## Konverterer et heksadesimalt tall til et heltall i 10-tallsystemet +HEX2OCT = HEKSTILOKT ## Konverterer et heksadesimalt tall til et oktaltall +IMABS = IMABS ## Returnerer absoluttverdien (koeffisienten) til et komplekst tall +IMAGINARY = IMAGINÆR ## Returnerer den imaginære koeffisienten til et komplekst tall +IMARGUMENT = IMARGUMENT ## Returnerer argumentet theta, som er en vinkel uttrykt i radianer +IMCONJUGATE = IMKONJUGERT ## Returnerer den komplekse konjugaten til et komplekst tall +IMCOS = IMCOS ## Returnerer cosinus til et komplekst tall +IMDIV = IMDIV ## Returnerer kvotienten til to komplekse tall +IMEXP = IMEKSP ## Returnerer eksponenten til et komplekst tall +IMLN = IMLN ## Returnerer den naturlige logaritmen for et komplekst tall +IMLOG10 = IMLOG10 ## Returnerer logaritmen med grunntall 10 for et komplekst tall +IMLOG2 = IMLOG2 ## Returnerer logaritmen med grunntall 2 for et komplekst tall +IMPOWER = IMOPPHØY ## Returnerer et komplekst tall opphøyd til en heltallspotens +IMPRODUCT = IMPRODUKT ## Returnerer produktet av komplekse tall +IMREAL = IMREELL ## Returnerer den reelle koeffisienten til et komplekst tall +IMSIN = IMSIN ## Returnerer sinus til et komplekst tall +IMSQRT = IMROT ## Returnerer kvadratroten av et komplekst tall +IMSUB = IMSUB ## Returnerer differansen mellom to komplekse tall +IMSUM = IMSUMMER ## Returnerer summen av komplekse tall +OCT2BIN = OKTTILBIN ## Konverterer et oktaltall til et binært tall +OCT2DEC = OKTTILDES ## Konverterer et oktaltall til et desimaltall +OCT2HEX = OKTTILHEKS ## Konverterer et oktaltall til et heksadesimaltall + + +## +## Financial functions Økonomiske funksjoner +## +ACCRINT = PÅLØPT.PERIODISK.RENTE ## Returnerer påløpte renter for et verdipapir som betaler periodisk rente +ACCRINTM = PÅLØPT.FORFALLSRENTE ## Returnerer den påløpte renten for et verdipapir som betaler rente ved forfall +AMORDEGRC = AMORDEGRC ## Returnerer avskrivningen for hver regnskapsperiode ved hjelp av en avskrivingskoeffisient +AMORLINC = AMORLINC ## Returnerer avskrivingen for hver regnskapsperiode +COUPDAYBS = OBLIG.DAGER.FF ## Returnerer antall dager fra begynnelsen av den rentebærende perioden til innløsningsdatoen +COUPDAYS = OBLIG.DAGER ## Returnerer antall dager i den rentebærende perioden som inneholder innløsningsdatoen +COUPDAYSNC = OBLIG.DAGER.NF ## Returnerer antall dager fra betalingsdato til neste renteinnbetalingsdato +COUPNCD = OBLIG.DAGER.EF ## Returnerer obligasjonsdatoen som kommer etter oppgjørsdatoen +COUPNUM = OBLIG.ANTALL ## Returnerer antall obligasjoner som skal betales mellom oppgjørsdatoen og forfallsdatoen +COUPPCD = OBLIG.DAG.FORRIGE ## Returnerer obligasjonsdatoen som kommer før oppgjørsdatoen +CUMIPMT = SAMLET.RENTE ## Returnerer den kumulative renten som er betalt mellom to perioder +CUMPRINC = SAMLET.HOVEDSTOL ## Returnerer den kumulative hovedstolen som er betalt for et lån mellom to perioder +DB = DAVSKR ## Returnerer avskrivningen for et aktivum i en angitt periode, foretatt med fast degressiv avskrivning +DDB = DEGRAVS ## Returnerer avskrivningen for et aktivum for en gitt periode, ved hjelp av dobbel degressiv avskrivning eller en metode som du selv angir +DISC = DISKONTERT ## Returnerer diskonteringsraten for et verdipapir +DOLLARDE = DOLLARDE ## Konverterer en valutapris uttrykt som en brøk, til en valutapris uttrykt som et desimaltall +DOLLARFR = DOLLARBR ## Konverterer en valutapris uttrykt som et desimaltall, til en valutapris uttrykt som en brøk +DURATION = VARIGHET ## Returnerer årlig varighet for et verdipapir med renter som betales periodisk +EFFECT = EFFEKTIV.RENTE ## Returnerer den effektive årlige rentesatsen +FV = SLUTTVERDI ## Returnerer fremtidig verdi for en investering +FVSCHEDULE = SVPLAN ## Returnerer den fremtidige verdien av en inngående hovedstol etter å ha anvendt en serie med sammensatte rentesatser +INTRATE = RENTESATS ## Returnerer rentefoten av et fullfinansiert verdipapir +IPMT = RAVDRAG ## Returnerer betalte renter på en investering for en gitt periode +IRR = IR ## Returnerer internrenten for en serie kontantstrømmer +ISPMT = ER.AVDRAG ## Beregner renten som er betalt for en investering i løpet av en bestemt periode +MDURATION = MVARIGHET ## Returnerer Macauleys modifiserte varighet for et verdipapir med en antatt pålydende verdi på kr 100,00 +MIRR = MODIR ## Returnerer internrenten der positive og negative kontantstrømmer finansieres med forskjellige satser +NOMINAL = NOMINELL ## Returnerer årlig nominell rentesats +NPER = PERIODER ## Returnerer antall perioder for en investering +NPV = NNV ## Returnerer netto nåverdi for en investering, basert på en serie periodiske kontantstrømmer og en rentesats +ODDFPRICE = AVVIKFP.PRIS ## Returnerer pris pålydende kr 100 for et verdipapir med en odde første periode +ODDFYIELD = AVVIKFP.AVKASTNING ## Returnerer avkastingen for et verdipapir med en odde første periode +ODDLPRICE = AVVIKSP.PRIS ## Returnerer pris pålydende kr 100 for et verdipapir med en odde siste periode +ODDLYIELD = AVVIKSP.AVKASTNING ## Returnerer avkastingen for et verdipapir med en odde siste periode +PMT = AVDRAG ## Returnerer periodisk betaling for en annuitet +PPMT = AMORT ## Returnerer betalingen på hovedstolen for en investering i en gitt periode +PRICE = PRIS ## Returnerer prisen per pålydende kr 100 for et verdipapir som gir periodisk avkastning +PRICEDISC = PRIS.DISKONTERT ## Returnerer prisen per pålydende kr 100 for et diskontert verdipapir +PRICEMAT = PRIS.FORFALL ## Returnerer prisen per pålydende kr 100 av et verdipapir som betaler rente ved forfall +PV = NÅVERDI ## Returnerer nåverdien av en investering +RATE = RENTE ## Returnerer rentesatsen per periode for en annuitet +RECEIVED = MOTTATT.AVKAST ## Returnerer summen som mottas ved forfallsdato for et fullinvestert verdipapir +SLN = LINAVS ## Returnerer den lineære avskrivningen for et aktivum i én periode +SYD = ÅRSAVS ## Returnerer årsavskrivningen for et aktivum i en angitt periode +TBILLEQ = TBILLEKV ## Returnerer den obligasjonsekvivalente avkastningen for en statsobligasjon +TBILLPRICE = TBILLPRIS ## Returnerer prisen per pålydende kr 100 for en statsobligasjon +TBILLYIELD = TBILLAVKASTNING ## Returnerer avkastningen til en statsobligasjon +VDB = VERDIAVS ## Returnerer avskrivningen for et aktivum i en angitt periode eller delperiode, ved hjelp av degressiv avskrivning +XIRR = XIR ## Returnerer internrenten for en serie kontantstrømmer som ikke nødvendigvis er periodiske +XNPV = XNNV ## Returnerer netto nåverdi for en serie kontantstrømmer som ikke nødvendigvis er periodiske +YIELD = AVKAST ## Returnerer avkastningen på et verdipapir som betaler periodisk rente +YIELDDISC = AVKAST.DISKONTERT ## Returnerer årlig avkastning for et diskontert verdipapir, for eksempel en statskasseveksel +YIELDMAT = AVKAST.FORFALL ## Returnerer den årlige avkastningen for et verdipapir som betaler rente ved forfallsdato + + +## +## Information functions Informasjonsfunksjoner +## +CELL = CELLE ## Returnerer informasjon om formatering, plassering eller innholdet til en celle +ERROR.TYPE = FEIL.TYPE ## Returnerer et tall som svarer til en feiltype +INFO = INFO ## Returnerer informasjon om gjeldende operativmiljø +ISBLANK = ERTOM ## Returnerer SANN hvis verdien er tom +ISERR = ERFEIL ## Returnerer SANN hvis verdien er en hvilken som helst annen feilverdi enn #I/T +ISERROR = ERFEIL ## Returnerer SANN hvis verdien er en hvilken som helst feilverdi +ISEVEN = ERPARTALL ## Returnerer SANN hvis tallet er et partall +ISLOGICAL = ERLOGISK ## Returnerer SANN hvis verdien er en logisk verdi +ISNA = ERIT ## Returnerer SANN hvis verdien er feilverdien #I/T +ISNONTEXT = ERIKKETEKST ## Returnerer SANN hvis verdien ikke er tekst +ISNUMBER = ERTALL ## Returnerer SANN hvis verdien er et tall +ISODD = ERODDETALL ## Returnerer SANN hvis tallet er et oddetall +ISREF = ERREF ## Returnerer SANN hvis verdien er en referanse +ISTEXT = ERTEKST ## Returnerer SANN hvis verdien er tekst +N = N ## Returnerer en verdi som er konvertert til et tall +NA = IT ## Returnerer feilverdien #I/T +TYPE = VERDITYPE ## Returnerer et tall som indikerer datatypen til en verdi + + +## +## Logical functions Logiske funksjoner +## +AND = OG ## Returnerer SANN hvis alle argumentene er lik SANN +FALSE = USANN ## Returnerer den logiske verdien USANN +IF = HVIS ## Angir en logisk test som skal utføres +IFERROR = HVISFEIL ## Returnerer en verdi du angir hvis en formel evaluerer til en feil. Ellers returnerer den resultatet av formelen. +NOT = IKKE ## Reverserer logikken til argumentet +OR = ELLER ## Returnerer SANN hvis ett eller flere argumenter er lik SANN +TRUE = SANN ## Returnerer den logiske verdien SANN + + +## +## Lookup and reference functions Oppslag- og referansefunksjoner +## +ADDRESS = ADRESSE ## Returnerer en referanse som tekst til en enkelt celle i et regneark +AREAS = OMRÅDER ## Returnerer antall områder i en referanse +CHOOSE = VELG ## Velger en verdi fra en liste med verdier +COLUMN = KOLONNE ## Returnerer kolonnenummeret for en referanse +COLUMNS = KOLONNER ## Returnerer antall kolonner i en referanse +HLOOKUP = FINN.KOLONNE ## Leter i den øverste raden i en matrise og returnerer verdien for den angitte cellen +HYPERLINK = HYPERKOBLING ## Oppretter en snarvei eller et hopp som åpner et dokument som er lagret på en nettverksserver, et intranett eller Internett +INDEX = INDEKS ## Bruker en indeks til å velge en verdi fra en referanse eller matrise +INDIRECT = INDIREKTE ## Returnerer en referanse angitt av en tekstverdi +LOOKUP = SLÅ.OPP ## Slår opp verdier i en vektor eller matrise +MATCH = SAMMENLIGNE ## Slår opp verdier i en referanse eller matrise +OFFSET = FORSKYVNING ## Returnerer en referanseforskyvning fra en gitt referanse +ROW = RAD ## Returnerer radnummeret for en referanse +ROWS = RADER ## Returnerer antall rader i en referanse +RTD = RTD ## Henter sanntidsdata fra et program som støtter COM-automatisering (automatisering: En måte å arbeide på med programobjekter fra et annet program- eller utviklingsverktøy. Tidligere kalt OLE-automatisering. Automatisering er en bransjestandard og en funksjon i Component Object Model (COM).) +TRANSPOSE = TRANSPONER ## Returnerer transponeringen av en matrise +VLOOKUP = FINN.RAD ## Leter i den første kolonnen i en matrise og flytter bortover raden for å returnere verdien til en celle + + +## +## Math and trigonometry functions Matematikk- og trigonometrifunksjoner +## +ABS = ABS ## Returnerer absoluttverdien til et tall +ACOS = ARCCOS ## Returnerer arcus cosinus til et tall +ACOSH = ARCCOSH ## Returnerer den inverse hyperbolske cosinus til et tall +ASIN = ARCSIN ## Returnerer arcus sinus til et tall +ASINH = ARCSINH ## Returnerer den inverse hyperbolske sinus til et tall +ATAN = ARCTAN ## Returnerer arcus tangens til et tall +ATAN2 = ARCTAN2 ## Returnerer arcus tangens fra x- og y-koordinater +ATANH = ARCTANH ## Returnerer den inverse hyperbolske tangens til et tall +CEILING = AVRUND.GJELDENDE.MULTIPLUM ## Runder av et tall til nærmeste heltall eller til nærmeste signifikante multiplum +COMBIN = KOMBINASJON ## Returnerer antall kombinasjoner for ett gitt antall objekter +COS = COS ## Returnerer cosinus til et tall +COSH = COSH ## Returnerer den hyperbolske cosinus til et tall +DEGREES = GRADER ## Konverterer radianer til grader +EVEN = AVRUND.TIL.PARTALL ## Runder av et tall oppover til nærmeste heltall som er et partall +EXP = EKSP ## Returnerer e opphøyd i en angitt potens +FACT = FAKULTET ## Returnerer fakultet til et tall +FACTDOUBLE = DOBBELFAKT ## Returnerer et talls doble fakultet +FLOOR = AVRUND.GJELDENDE.MULTIPLUM.NED ## Avrunder et tall nedover, mot null +GCD = SFF ## Returnerer høyeste felles divisor +INT = HELTALL ## Avrunder et tall nedover til nærmeste heltall +LCM = MFM ## Returnerer minste felles multiplum +LN = LN ## Returnerer den naturlige logaritmen til et tall +LOG = LOG ## Returnerer logaritmen for et tall til et angitt grunntall +LOG10 = LOG10 ## Returnerer logaritmen med grunntall 10 for et tall +MDETERM = MDETERM ## Returnerer matrisedeterminanten til en matrise +MINVERSE = MINVERS ## Returnerer den inverse matrisen til en matrise +MMULT = MMULT ## Returnerer matriseproduktet av to matriser +MOD = REST ## Returnerer resten fra en divisjon +MROUND = MRUND ## Returnerer et tall avrundet til det ønskede multiplum +MULTINOMIAL = MULTINOMINELL ## Returnerer det multinominelle for et sett med tall +ODD = AVRUND.TIL.ODDETALL ## Runder av et tall oppover til nærmeste heltall som er et oddetall +PI = PI ## Returnerer verdien av pi +POWER = OPPHØYD.I ## Returnerer resultatet av et tall opphøyd i en potens +PRODUCT = PRODUKT ## Multipliserer argumentene +QUOTIENT = KVOTIENT ## Returnerer heltallsdelen av en divisjon +RADIANS = RADIANER ## Konverterer grader til radianer +RAND = TILFELDIG ## Returnerer et tilfeldig tall mellom 0 og 1 +RANDBETWEEN = TILFELDIGMELLOM ## Returnerer et tilfeldig tall innenfor et angitt område +ROMAN = ROMERTALL ## Konverterer vanlige tall til romertall, som tekst +ROUND = AVRUND ## Avrunder et tall til et angitt antall sifre +ROUNDDOWN = AVRUND.NED ## Avrunder et tall nedover, mot null +ROUNDUP = AVRUND.OPP ## Runder av et tall oppover, bort fra null +SERIESSUM = SUMMER.REKKE ## Returnerer summen av en geometrisk rekke, basert på formelen +SIGN = FORTEGN ## Returnerer fortegnet for et tall +SIN = SIN ## Returnerer sinus til en gitt vinkel +SINH = SINH ## Returnerer den hyperbolske sinus til et tall +SQRT = ROT ## Returnerer en positiv kvadratrot +SQRTPI = ROTPI ## Returnerer kvadratroten av (tall * pi) +SUBTOTAL = DELSUM ## Returnerer en delsum i en liste eller database +SUM = SUMMER ## Legger sammen argumentene +SUMIF = SUMMERHVIS ## Legger sammen cellene angitt ved et gitt vilkår +SUMIFS = SUMMER.HVIS.SETT ## Legger sammen cellene i et område som oppfyller flere vilkår +SUMPRODUCT = SUMMERPRODUKT ## Returnerer summen av produktene av tilsvarende matrisekomponenter +SUMSQ = SUMMERKVADRAT ## Returnerer kvadratsummen av argumentene +SUMX2MY2 = SUMMERX2MY2 ## Returnerer summen av differansen av kvadratene for tilsvarende verdier i to matriser +SUMX2PY2 = SUMMERX2PY2 ## Returnerer summen av kvadratsummene for tilsvarende verdier i to matriser +SUMXMY2 = SUMMERXMY2 ## Returnerer summen av kvadratene av differansen for tilsvarende verdier i to matriser +TAN = TAN ## Returnerer tangens for et tall +TANH = TANH ## Returnerer den hyperbolske tangens for et tall +TRUNC = AVKORT ## Korter av et tall til et heltall + + +## +## Statistical functions Statistiske funksjoner +## +AVEDEV = GJENNOMSNITTSAVVIK ## Returnerer datapunktenes gjennomsnittlige absoluttavvik fra middelverdien +AVERAGE = GJENNOMSNITT ## Returnerer gjennomsnittet for argumentene +AVERAGEA = GJENNOMSNITTA ## Returnerer gjennomsnittet for argumentene, inkludert tall, tekst og logiske verdier +AVERAGEIF = GJENNOMSNITTHVIS ## Returnerer gjennomsnittet (aritmetisk gjennomsnitt) av alle cellene i et område som oppfyller et bestemt vilkår +AVERAGEIFS = GJENNOMSNITT.HVIS.SETT ## Returnerer gjennomsnittet (aritmetisk middelverdi) av alle celler som oppfyller flere vilkår. +BETADIST = BETA.FORDELING ## Returnerer den kumulative betafordelingsfunksjonen +BETAINV = INVERS.BETA.FORDELING ## Returnerer den inverse verdien til fordelingsfunksjonen for en angitt betafordeling +BINOMDIST = BINOM.FORDELING ## Returnerer den individuelle binomiske sannsynlighetsfordelingen +CHIDIST = KJI.FORDELING ## Returnerer den ensidige sannsynligheten for en kjikvadrert fordeling +CHIINV = INVERS.KJI.FORDELING ## Returnerer den inverse av den ensidige sannsynligheten for den kjikvadrerte fordelingen +CHITEST = KJI.TEST ## Utfører testen for uavhengighet +CONFIDENCE = KONFIDENS ## Returnerer konfidensintervallet til gjennomsnittet for en populasjon +CORREL = KORRELASJON ## Returnerer korrelasjonskoeffisienten mellom to datasett +COUNT = ANTALL ## Teller hvor mange tall som er i argumentlisten +COUNTA = ANTALLA ## Teller hvor mange verdier som er i argumentlisten +COUNTBLANK = TELLBLANKE ## Teller antall tomme celler i et område. +COUNTIF = ANTALL.HVIS ## Teller antall celler i et område som oppfyller gitte vilkår +COUNTIFS = ANTALL.HVIS.SETT ## Teller antallet ikke-tomme celler i et område som oppfyller flere vilkår +COVAR = KOVARIANS ## Returnerer kovariansen, gjennomsnittet av produktene av parvise avvik +CRITBINOM = GRENSE.BINOM ## Returnerer den minste verdien der den kumulative binomiske fordelingen er mindre enn eller lik en vilkårsverdi +DEVSQ = AVVIK.KVADRERT ## Returnerer summen av kvadrerte avvik +EXPONDIST = EKSP.FORDELING ## Returnerer eksponentialfordelingen +FDIST = FFORDELING ## Returnerer F-sannsynlighetsfordelingen +FINV = FFORDELING.INVERS ## Returnerer den inverse av den sannsynlige F-fordelingen +FISHER = FISHER ## Returnerer Fisher-transformasjonen +FISHERINV = FISHERINV ## Returnerer den inverse av Fisher-transformasjonen +FORECAST = PROGNOSE ## Returnerer en verdi langs en lineær trend +FREQUENCY = FREKVENS ## Returnerer en frekvensdistribusjon som en loddrett matrise +FTEST = FTEST ## Returnerer resultatet av en F-test +GAMMADIST = GAMMAFORDELING ## Returnerer gammafordelingen +GAMMAINV = GAMMAINV ## Returnerer den inverse av den gammakumulative fordelingen +GAMMALN = GAMMALN ## Returnerer den naturlige logaritmen til gammafunksjonen G(x) +GEOMEAN = GJENNOMSNITT.GEOMETRISK ## Returnerer den geometriske middelverdien +GROWTH = VEKST ## Returnerer verdier langs en eksponentiell trend +HARMEAN = GJENNOMSNITT.HARMONISK ## Returnerer den harmoniske middelverdien +HYPGEOMDIST = HYPGEOM.FORDELING ## Returnerer den hypergeometriske fordelingen +INTERCEPT = SKJÆRINGSPUNKT ## Returnerer skjæringspunktet til den lineære regresjonslinjen +KURT = KURT ## Returnerer kurtosen til et datasett +LARGE = N.STØRST ## Returnerer den n-te største verdien i et datasett +LINEST = RETTLINJE ## Returnerer parameterne til en lineær trend +LOGEST = KURVE ## Returnerer parameterne til en eksponentiell trend +LOGINV = LOGINV ## Returnerer den inverse lognormale fordelingen +LOGNORMDIST = LOGNORMFORD ## Returnerer den kumulative lognormale fordelingen +MAX = STØRST ## Returnerer maksimumsverdien i en argumentliste +MAXA = MAKSA ## Returnerer maksimumsverdien i en argumentliste, inkludert tall, tekst og logiske verdier +MEDIAN = MEDIAN ## Returnerer medianen til tallene som er gitt +MIN = MIN ## Returnerer minimumsverdien i en argumentliste +MINA = MINA ## Returnerer den minste verdien i en argumentliste, inkludert tall, tekst og logiske verdier +MODE = MODUS ## Returnerer den vanligste verdien i et datasett +NEGBINOMDIST = NEGBINOM.FORDELING ## Returnerer den negative binomiske fordelingen +NORMDIST = NORMALFORDELING ## Returnerer den kumulative normalfordelingen +NORMINV = NORMINV ## Returnerer den inverse kumulative normalfordelingen +NORMSDIST = NORMSFORDELING ## Returnerer standard kumulativ normalfordeling +NORMSINV = NORMSINV ## Returnerer den inverse av den den kumulative standard normalfordelingen +PEARSON = PEARSON ## Returnerer produktmomentkorrelasjonskoeffisienten, Pearson +PERCENTILE = PERSENTIL ## Returnerer den n-te persentil av verdiene i et område +PERCENTRANK = PROSENTDEL ## Returnerer prosentrangeringen av en verdi i et datasett +PERMUT = PERMUTER ## Returnerer antall permutasjoner for et gitt antall objekter +POISSON = POISSON ## Returnerer Poissons sannsynlighetsfordeling +PROB = SANNSYNLIG ## Returnerer sannsynligheten for at verdier i et område ligger mellom to grenser +QUARTILE = KVARTIL ## Returnerer kvartilen til et datasett +RANK = RANG ## Returnerer rangeringen av et tall, eller plassen tallet har i en rekke +RSQ = RKVADRAT ## Returnerer kvadratet av produktmomentkorrelasjonskoeffisienten (Pearsons r) +SKEW = SKJEVFORDELING ## Returnerer skjevheten i en fordeling +SLOPE = STIGNINGSTALL ## Returnerer stigningtallet for den lineære regresjonslinjen +SMALL = N.MINST ## Returnerer den n-te minste verdien i et datasett +STANDARDIZE = NORMALISER ## Returnerer en normalisert verdi +STDEV = STDAV ## Estimere standardavvik på grunnlag av et utvalg +STDEVA = STDAVVIKA ## Estimerer standardavvik basert på et utvalg, inkludert tall, tekst og logiske verdier +STDEVP = STDAVP ## Beregner standardavvik basert på hele populasjonen +STDEVPA = STDAVVIKPA ## Beregner standardavvik basert på hele populasjonen, inkludert tall, tekst og logiske verdier +STEYX = STANDARDFEIL ## Returnerer standardfeilen for den predikerte y-verdien for hver x i regresjonen +TDIST = TFORDELING ## Returnerer en Student t-fordeling +TINV = TINV ## Returnerer den inverse Student t-fordelingen +TREND = TREND ## Returnerer verdier langs en lineær trend +TRIMMEAN = TRIMMET.GJENNOMSNITT ## Returnerer den interne middelverdien til et datasett +TTEST = TTEST ## Returnerer sannsynligheten assosiert med en Student t-test +VAR = VARIANS ## Estimerer varians basert på et utvalg +VARA = VARIANSA ## Estimerer varians basert på et utvalg, inkludert tall, tekst og logiske verdier +VARP = VARIANSP ## Beregner varians basert på hele populasjonen +VARPA = VARIANSPA ## Beregner varians basert på hele populasjonen, inkludert tall, tekst og logiske verdier +WEIBULL = WEIBULL.FORDELING ## Returnerer Weibull-fordelingen +ZTEST = ZTEST ## Returnerer den ensidige sannsynlighetsverdien for en z-test + + +## +## Text functions Tekstfunksjoner +## +ASC = STIGENDE ## Endrer fullbreddes (dobbeltbyte) engelske bokstaver eller katakana i en tegnstreng, til halvbreddes (enkeltbyte) tegn +BAHTTEXT = BAHTTEKST ## Konverterer et tall til tekst, og bruker valutaformatet ß (baht) +CHAR = TEGNKODE ## Returnerer tegnet som svarer til kodenummeret +CLEAN = RENSK ## Fjerner alle tegn som ikke kan skrives ut, fra teksten +CODE = KODE ## Returnerer en numerisk kode for det første tegnet i en tekststreng +CONCATENATE = KJEDE.SAMMEN ## Slår sammen flere tekstelementer til ett tekstelement +DOLLAR = VALUTA ## Konverterer et tall til tekst, og bruker valutaformatet $ (dollar) +EXACT = EKSAKT ## Kontrollerer om to tekstverdier er like +FIND = FINN ## Finner en tekstverdi inne i en annen (skiller mellom store og små bokstaver) +FINDB = FINNB ## Finner en tekstverdi inne i en annen (skiller mellom store og små bokstaver) +FIXED = FASTSATT ## Formaterer et tall som tekst med et bestemt antall desimaler +JIS = JIS ## Endrer halvbreddes (enkeltbyte) engelske bokstaver eller katakana i en tegnstreng, til fullbreddes (dobbeltbyte) tegn +LEFT = VENSTRE ## Returnerer tegnene lengst til venstre i en tekstverdi +LEFTB = VENSTREB ## Returnerer tegnene lengst til venstre i en tekstverdi +LEN = LENGDE ## Returnerer antall tegn i en tekststreng +LENB = LENGDEB ## Returnerer antall tegn i en tekststreng +LOWER = SMÅ ## Konverterer tekst til små bokstaver +MID = DELTEKST ## Returnerer et angitt antall tegn fra en tekststreng, og begynner fra posisjonen du angir +MIDB = DELTEKSTB ## Returnerer et angitt antall tegn fra en tekststreng, og begynner fra posisjonen du angir +PHONETIC = FURIGANA ## Trekker ut fonetiske tegn (furigana) fra en tekststreng +PROPER = STOR.FORBOKSTAV ## Gir den første bokstaven i hvert ord i en tekstverdi stor forbokstav +REPLACE = ERSTATT ## Erstatter tegn i en tekst +REPLACEB = ERSTATTB ## Erstatter tegn i en tekst +REPT = GJENTA ## Gjentar tekst et gitt antall ganger +RIGHT = HØYRE ## Returnerer tegnene lengst til høyre i en tekstverdi +RIGHTB = HØYREB ## Returnerer tegnene lengst til høyre i en tekstverdi +SEARCH = SØK ## Finner en tekstverdi inne i en annen (skiller ikke mellom store og små bokstaver) +SEARCHB = SØKB ## Finner en tekstverdi inne i en annen (skiller ikke mellom store og små bokstaver) +SUBSTITUTE = BYTT.UT ## Bytter ut gammel tekst med ny tekst i en tekststreng +T = T ## Konverterer argumentene til tekst +TEXT = TEKST ## Formaterer et tall og konverterer det til tekst +TRIM = TRIMME ## Fjerner mellomrom fra tekst +UPPER = STORE ## Konverterer tekst til store bokstaver +VALUE = VERDI ## Konverterer et tekstargument til et tall diff --git a/application/third_party/PHPExcel/PHPExcel/locale/pl/config b/application/third_party/PHPExcel/PHPExcel/locale/pl/config new file mode 100644 index 0000000..4dd75be --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/pl/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = zł + + +## +## Excel Error Codes (For future use) +## +NULL = #ZERO! +DIV0 = #DZIEL/0! +VALUE = #ARG! +REF = #ADR! +NAME = #NAZWA? +NUM = #LICZBA! +NA = #N/D! diff --git a/application/third_party/PHPExcel/PHPExcel/locale/pl/functions b/application/third_party/PHPExcel/PHPExcel/locale/pl/functions new file mode 100644 index 0000000..1881a71 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/pl/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Funkcje dodatków i automatyzacji +## +GETPIVOTDATA = WEŹDANETABELI ## Zwraca dane przechowywane w raporcie tabeli przestawnej. + + +## +## Cube functions Funkcje modułów +## +CUBEKPIMEMBER = ELEMENT.KPI.MODUŁU ## Zwraca nazwę, właściwość i miarę kluczowego wskaźnika wydajności (KPI) oraz wyświetla nazwę i właściwość w komórce. Wskaźnik KPI jest miarą ilościową, taką jak miesięczny zysk brutto lub kwartalna fluktuacja pracowników, używaną do monitorowania wydajności organizacji. +CUBEMEMBER = ELEMENT.MODUŁU ## Zwraca element lub krotkę z hierarchii modułu. Służy do sprawdzania, czy element lub krotka istnieje w module. +CUBEMEMBERPROPERTY = WŁAŚCIWOŚĆ.ELEMENTU.MODUŁU ## Zwraca wartość właściwości elementu w module. Służy do sprawdzania, czy nazwa elementu istnieje w module, i zwracania określonej właściwości dla tego elementu. +CUBERANKEDMEMBER = USZEREGOWANY.ELEMENT.MODUŁU ## Zwraca n-ty (albo uszeregowany) element zestawu. Służy do zwracania elementu lub elementów zestawu, na przykład najlepszego sprzedawcy lub 10 najlepszych studentów. +CUBESET = ZESTAW.MODUŁÓW ## Definiuje obliczony zestaw elementów lub krotek, wysyłając wyrażenie zestawu do serwera modułu, który tworzy zestaw i zwraca go do programu Microsoft Office Excel. +CUBESETCOUNT = LICZNIK.MODUŁÓW.ZESTAWU ## Zwraca liczbę elementów zestawu. +CUBEVALUE = WARTOŚĆ.MODUŁU ## Zwraca zagregowaną wartość z modułu. + + +## +## Database functions Funkcje baz danych +## +DAVERAGE = BD.ŚREDNIA ## Zwraca wartość średniej wybranych wpisów bazy danych. +DCOUNT = BD.ILE.REKORDÓW ## Zlicza komórki zawierające liczby w bazie danych. +DCOUNTA = BD.ILE.REKORDÓW.A ## Zlicza niepuste komórki w bazie danych. +DGET = BD.POLE ## Wyodrębnia z bazy danych jeden rekord spełniający określone kryteria. +DMAX = BD.MAX ## Zwraca wartość maksymalną z wybranych wpisów bazy danych. +DMIN = BD.MIN ## Zwraca wartość minimalną z wybranych wpisów bazy danych. +DPRODUCT = BD.ILOCZYN ## Mnoży wartości w konkretnym, spełniającym kryteria polu rekordów bazy danych. +DSTDEV = BD.ODCH.STANDARD ## Szacuje odchylenie standardowe na podstawie próbki z wybranych wpisów bazy danych. +DSTDEVP = BD.ODCH.STANDARD.POPUL ## Oblicza odchylenie standardowe na podstawie całej populacji wybranych wpisów bazy danych. +DSUM = BD.SUMA ## Dodaje liczby w kolumnie pól rekordów bazy danych, które spełniają kryteria. +DVAR = BD.WARIANCJA ## Szacuje wariancję na podstawie próbki z wybranych wpisów bazy danych. +DVARP = BD.WARIANCJA.POPUL ## Oblicza wariancję na podstawie całej populacji wybranych wpisów bazy danych. + + +## +## Date and time functions Funkcje dat, godzin i czasu +## +DATE = DATA ## Zwraca liczbę seryjną dla wybranej daty. +DATEVALUE = DATA.WARTOŚĆ ## Konwertuje datę w formie tekstu na liczbę seryjną. +DAY = DZIEŃ ## Konwertuje liczbę seryjną na dzień miesiąca. +DAYS360 = DNI.360 ## Oblicza liczbę dni między dwiema datami na podstawie roku 360-dniowego. +EDATE = UPŁDNI ## Zwraca liczbę seryjną daty jako wskazaną liczbę miesięcy przed określoną datą początkową lub po niej. +EOMONTH = EOMONTH ## Zwraca liczbę seryjną ostatniego dnia miesiąca przed określoną liczbą miesięcy lub po niej. +HOUR = GODZINA ## Konwertuje liczbę seryjną na godzinę. +MINUTE = MINUTA ## Konwertuje liczbę seryjną na minutę. +MONTH = MIESIĄC ## Konwertuje liczbę seryjną na miesiąc. +NETWORKDAYS = NETWORKDAYS ## Zwraca liczbę pełnych dni roboczych między dwiema datami. +NOW = TERAZ ## Zwraca liczbę seryjną bieżącej daty i godziny. +SECOND = SEKUNDA ## Konwertuje liczbę seryjną na sekundę. +TIME = CZAS ## Zwraca liczbę seryjną określonego czasu. +TIMEVALUE = CZAS.WARTOŚĆ ## Konwertuje czas w formie tekstu na liczbę seryjną. +TODAY = DZIŚ ## Zwraca liczbę seryjną dla daty bieżącej. +WEEKDAY = DZIEŃ.TYG ## Konwertuje liczbę seryjną na dzień tygodnia. +WEEKNUM = WEEKNUM ## Konwertuje liczbę seryjną na liczbę reprezentującą numer tygodnia w roku. +WORKDAY = WORKDAY ## Zwraca liczbę seryjną dla daty przed określoną liczbą dni roboczych lub po niej. +YEAR = ROK ## Konwertuje liczbę seryjną na rok. +YEARFRAC = YEARFRAC ## Zwraca część roku reprezentowaną przez pełną liczbę dni między datą początkową a datą końcową. + + +## +## Engineering functions Funkcje inżynierskie +## +BESSELI = BESSELI ## Zwraca wartość zmodyfikowanej funkcji Bessela In(x). +BESSELJ = BESSELJ ## Zwraca wartość funkcji Bessela Jn(x). +BESSELK = BESSELK ## Zwraca wartość zmodyfikowanej funkcji Bessela Kn(x). +BESSELY = BESSELY ## Zwraca wartość funkcji Bessela Yn(x). +BIN2DEC = BIN2DEC ## Konwertuje liczbę w postaci dwójkowej na liczbę w postaci dziesiętnej. +BIN2HEX = BIN2HEX ## Konwertuje liczbę w postaci dwójkowej na liczbę w postaci szesnastkowej. +BIN2OCT = BIN2OCT ## Konwertuje liczbę w postaci dwójkowej na liczbę w postaci ósemkowej. +COMPLEX = COMPLEX ## Konwertuje część rzeczywistą i urojoną na liczbę zespoloną. +CONVERT = CONVERT ## Konwertuje liczbę z jednego systemu miar na inny. +DEC2BIN = DEC2BIN ## Konwertuje liczbę w postaci dziesiętnej na postać dwójkową. +DEC2HEX = DEC2HEX ## Konwertuje liczbę w postaci dziesiętnej na liczbę w postaci szesnastkowej. +DEC2OCT = DEC2OCT ## Konwertuje liczbę w postaci dziesiętnej na liczbę w postaci ósemkowej. +DELTA = DELTA ## Sprawdza, czy dwie wartości są równe. +ERF = ERF ## Zwraca wartość funkcji błędu. +ERFC = ERFC ## Zwraca wartość komplementarnej funkcji błędu. +GESTEP = GESTEP ## Sprawdza, czy liczba jest większa niż wartość progowa. +HEX2BIN = HEX2BIN ## Konwertuje liczbę w postaci szesnastkowej na liczbę w postaci dwójkowej. +HEX2DEC = HEX2DEC ## Konwertuje liczbę w postaci szesnastkowej na liczbę w postaci dziesiętnej. +HEX2OCT = HEX2OCT ## Konwertuje liczbę w postaci szesnastkowej na liczbę w postaci ósemkowej. +IMABS = IMABS ## Zwraca wartość bezwzględną (moduł) liczby zespolonej. +IMAGINARY = IMAGINARY ## Zwraca wartość części urojonej liczby zespolonej. +IMARGUMENT = IMARGUMENT ## Zwraca wartość argumentu liczby zespolonej, przy czym kąt wyrażony jest w radianach. +IMCONJUGATE = IMCONJUGATE ## Zwraca wartość liczby sprzężonej danej liczby zespolonej. +IMCOS = IMCOS ## Zwraca wartość cosinusa liczby zespolonej. +IMDIV = IMDIV ## Zwraca wartość ilorazu dwóch liczb zespolonych. +IMEXP = IMEXP ## Zwraca postać wykładniczą liczby zespolonej. +IMLN = IMLN ## Zwraca wartość logarytmu naturalnego liczby zespolonej. +IMLOG10 = IMLOG10 ## Zwraca wartość logarytmu dziesiętnego liczby zespolonej. +IMLOG2 = IMLOG2 ## Zwraca wartość logarytmu liczby zespolonej przy podstawie 2. +IMPOWER = IMPOWER ## Zwraca wartość liczby zespolonej podniesionej do potęgi całkowitej. +IMPRODUCT = IMPRODUCT ## Zwraca wartość iloczynu liczb zespolonych. +IMREAL = IMREAL ## Zwraca wartość części rzeczywistej liczby zespolonej. +IMSIN = IMSIN ## Zwraca wartość sinusa liczby zespolonej. +IMSQRT = IMSQRT ## Zwraca wartość pierwiastka kwadratowego z liczby zespolonej. +IMSUB = IMSUB ## Zwraca wartość różnicy dwóch liczb zespolonych. +IMSUM = IMSUM ## Zwraca wartość sumy liczb zespolonych. +OCT2BIN = OCT2BIN ## Konwertuje liczbę w postaci ósemkowej na liczbę w postaci dwójkowej. +OCT2DEC = OCT2DEC ## Konwertuje liczbę w postaci ósemkowej na liczbę w postaci dziesiętnej. +OCT2HEX = OCT2HEX ## Konwertuje liczbę w postaci ósemkowej na liczbę w postaci szesnastkowej. + + +## +## Financial functions Funkcje finansowe +## +ACCRINT = ACCRINT ## Zwraca narosłe odsetki dla papieru wartościowego z oprocentowaniem okresowym. +ACCRINTM = ACCRINTM ## Zwraca narosłe odsetki dla papieru wartościowego z oprocentowaniem w terminie wykupu. +AMORDEGRC = AMORDEGRC ## Zwraca amortyzację dla każdego okresu rozliczeniowego z wykorzystaniem współczynnika amortyzacji. +AMORLINC = AMORLINC ## Zwraca amortyzację dla każdego okresu rozliczeniowego. +COUPDAYBS = COUPDAYBS ## Zwraca liczbę dni od początku okresu dywidendy do dnia rozliczeniowego. +COUPDAYS = COUPDAYS ## Zwraca liczbę dni w okresie dywidendy, z uwzględnieniem dnia rozliczeniowego. +COUPDAYSNC = COUPDAYSNC ## Zwraca liczbę dni od dnia rozliczeniowego do daty następnego dnia dywidendy. +COUPNCD = COUPNCD ## Zwraca dzień następnej dywidendy po dniu rozliczeniowym. +COUPNUM = COUPNUM ## Zwraca liczbę dywidend płatnych między dniem rozliczeniowym a dniem wykupu. +COUPPCD = COUPPCD ## Zwraca dzień poprzedniej dywidendy przed dniem rozliczeniowym. +CUMIPMT = CUMIPMT ## Zwraca wartość procentu składanego płatnego między dwoma okresami. +CUMPRINC = CUMPRINC ## Zwraca wartość kapitału skumulowanego spłaty pożyczki między dwoma okresami. +DB = DB ## Zwraca amortyzację środka trwałego w danym okresie metodą degresywną z zastosowaniem stałej bazowej. +DDB = DDB ## Zwraca amortyzację środka trwałego za podany okres metodą degresywną z zastosowaniem podwójnej bazowej lub metodą określoną przez użytkownika. +DISC = DISC ## Zwraca wartość stopy dyskontowej papieru wartościowego. +DOLLARDE = DOLLARDE ## Konwertuje cenę w postaci ułamkowej na cenę wyrażoną w postaci dziesiętnej. +DOLLARFR = DOLLARFR ## Konwertuje cenę wyrażoną w postaci dziesiętnej na cenę wyrażoną w postaci ułamkowej. +DURATION = DURATION ## Zwraca wartość rocznego przychodu z papieru wartościowego o okresowych wypłatach oprocentowania. +EFFECT = EFFECT ## Zwraca wartość efektywnej rocznej stopy procentowej. +FV = FV ## Zwraca przyszłą wartość lokaty. +FVSCHEDULE = FVSCHEDULE ## Zwraca przyszłą wartość kapitału początkowego wraz z szeregiem procentów składanych. +INTRATE = INTRATE ## Zwraca wartość stopy procentowej papieru wartościowego całkowicie ulokowanego. +IPMT = IPMT ## Zwraca wysokość spłaty oprocentowania lokaty za dany okres. +IRR = IRR ## Zwraca wartość wewnętrznej stopy zwrotu dla serii przepływów gotówkowych. +ISPMT = ISPMT ## Oblicza wysokość spłaty oprocentowania za dany okres lokaty. +MDURATION = MDURATION ## Zwraca wartość zmodyfikowanego okresu Macauleya dla papieru wartościowego o założonej wartości nominalnej 100 zł. +MIRR = MIRR ## Zwraca wartość wewnętrznej stopy zwrotu dla przypadku, gdy dodatnie i ujemne przepływy gotówkowe mają różne stopy. +NOMINAL = NOMINAL ## Zwraca wysokość nominalnej rocznej stopy procentowej. +NPER = NPER ## Zwraca liczbę okresów dla lokaty. +NPV = NPV ## Zwraca wartość bieżącą netto lokaty na podstawie szeregu okresowych przepływów gotówkowych i stopy dyskontowej. +ODDFPRICE = ODDFPRICE ## Zwraca cenę za 100 zł wartości nominalnej papieru wartościowego z nietypowym pierwszym okresem. +ODDFYIELD = ODDFYIELD ## Zwraca rentowność papieru wartościowego z nietypowym pierwszym okresem. +ODDLPRICE = ODDLPRICE ## Zwraca cenę za 100 zł wartości nominalnej papieru wartościowego z nietypowym ostatnim okresem. +ODDLYIELD = ODDLYIELD ## Zwraca rentowność papieru wartościowego z nietypowym ostatnim okresem. +PMT = PMT ## Zwraca wartość okresowej płatności raty rocznej. +PPMT = PPMT ## Zwraca wysokość spłaty kapitału w przypadku lokaty dla danego okresu. +PRICE = PRICE ## Zwraca cenę za 100 zł wartości nominalnej papieru wartościowego z oprocentowaniem okresowym. +PRICEDISC = PRICEDISC ## Zwraca cenę za 100 zł wartości nominalnej papieru wartościowego zdyskontowanego. +PRICEMAT = PRICEMAT ## Zwraca cenę za 100 zł wartości nominalnej papieru wartościowego z oprocentowaniem w terminie wykupu. +PV = PV ## Zwraca wartość bieżącą lokaty. +RATE = RATE ## Zwraca wysokość stopy procentowej w okresie raty rocznej. +RECEIVED = RECEIVED ## Zwraca wartość kapitału otrzymanego przy wykupie papieru wartościowego całkowicie ulokowanego. +SLN = SLN ## Zwraca amortyzację środka trwałego za jeden okres metodą liniową. +SYD = SYD ## Zwraca amortyzację środka trwałego za dany okres metodą sumy cyfr lat amortyzacji. +TBILLEQ = TBILLEQ ## Zwraca rentowność ekwiwalentu obligacji dla bonu skarbowego. +TBILLPRICE = TBILLPRICE ## Zwraca cenę za 100 zł wartości nominalnej bonu skarbowego. +TBILLYIELD = TBILLYIELD ## Zwraca rentowność bonu skarbowego. +VDB = VDB ## Oblicza amortyzację środka trwałego w danym okresie lub jego części metodą degresywną. +XIRR = XIRR ## Zwraca wartość wewnętrznej stopy zwrotu dla serii rozłożonych w czasie przepływów gotówkowych, niekoniecznie okresowych. +XNPV = XNPV ## Zwraca wartość bieżącą netto dla serii rozłożonych w czasie przepływów gotówkowych, niekoniecznie okresowych. +YIELD = YIELD ## Zwraca rentowność papieru wartościowego z oprocentowaniem okresowym. +YIELDDISC = YIELDDISC ## Zwraca roczną rentowność zdyskontowanego papieru wartościowego, na przykład bonu skarbowego. +YIELDMAT = YIELDMAT ## Zwraca roczną rentowność papieru wartościowego oprocentowanego przy wykupie. + + +## +## Information functions Funkcje informacyjne +## +CELL = KOMÓRKA ## Zwraca informacje o formacie, położeniu lub zawartości komórki. +ERROR.TYPE = NR.BŁĘDU ## Zwraca liczbę odpowiadającą typowi błędu. +INFO = INFO ## Zwraca informację o aktualnym środowisku pracy. +ISBLANK = CZY.PUSTA ## Zwraca wartość PRAWDA, jeśli wartość jest pusta. +ISERR = CZY.BŁ ## Zwraca wartość PRAWDA, jeśli wartość jest dowolną wartością błędu, z wyjątkiem #N/D!. +ISERROR = CZY.BŁĄD ## Zwraca wartość PRAWDA, jeśli wartość jest dowolną wartością błędu. +ISEVEN = ISEVEN ## Zwraca wartość PRAWDA, jeśli liczba jest parzysta. +ISLOGICAL = CZY.LOGICZNA ## Zwraca wartość PRAWDA, jeśli wartość jest wartością logiczną. +ISNA = CZY.BRAK ## Zwraca wartość PRAWDA, jeśli wartość jest wartością błędu #N/D!. +ISNONTEXT = CZY.NIE.TEKST ## Zwraca wartość PRAWDA, jeśli wartość nie jest tekstem. +ISNUMBER = CZY.LICZBA ## Zwraca wartość PRAWDA, jeśli wartość jest liczbą. +ISODD = ISODD ## Zwraca wartość PRAWDA, jeśli liczba jest nieparzysta. +ISREF = CZY.ADR ## Zwraca wartość PRAWDA, jeśli wartość jest odwołaniem. +ISTEXT = CZY.TEKST ## Zwraca wartość PRAWDA, jeśli wartość jest tekstem. +N = L ## Zwraca wartość przekonwertowaną na postać liczbową. +NA = BRAK ## Zwraca wartość błędu #N/D!. +TYPE = TYP ## Zwraca liczbę wskazującą typ danych wartości. + + +## +## Logical functions Funkcje logiczne +## +AND = ORAZ ## Zwraca wartość PRAWDA, jeśli wszystkie argumenty mają wartość PRAWDA. +FALSE = FAŁSZ ## Zwraca wartość logiczną FAŁSZ. +IF = JEŻELI ## Określa warunek logiczny do sprawdzenia. +IFERROR = JEŻELI.BŁĄD ## Zwraca określoną wartość, jeśli wynikiem obliczenia formuły jest błąd; w przeciwnym przypadku zwraca wynik formuły. +NOT = NIE ## Odwraca wartość logiczną argumentu. +OR = LUB ## Zwraca wartość PRAWDA, jeśli co najmniej jeden z argumentów ma wartość PRAWDA. +TRUE = PRAWDA ## Zwraca wartość logiczną PRAWDA. + + +## +## Lookup and reference functions Funkcje wyszukiwania i odwołań +## +ADDRESS = ADRES ## Zwraca odwołanie do jednej komórki w arkuszu jako wartość tekstową. +AREAS = OBSZARY ## Zwraca liczbę obszarów występujących w odwołaniu. +CHOOSE = WYBIERZ ## Wybiera wartość z listy wartości. +COLUMN = NR.KOLUMNY ## Zwraca numer kolumny z odwołania. +COLUMNS = LICZBA.KOLUMN ## Zwraca liczbę kolumn dla danego odwołania. +HLOOKUP = WYSZUKAJ.POZIOMO ## Przegląda górny wiersz tablicy i zwraca wartość wskazanej komórki. +HYPERLINK = HIPERŁĄCZE ## Tworzy skrót lub skok, który pozwala otwierać dokument przechowywany na serwerze sieciowym, w sieci intranet lub w Internecie. +INDEX = INDEKS ## Używa indeksu do wybierania wartości z odwołania lub tablicy. +INDIRECT = ADR.POŚR ## Zwraca odwołanie określone przez wartość tekstową. +LOOKUP = WYSZUKAJ ## Wyszukuje wartości w wektorze lub tablicy. +MATCH = PODAJ.POZYCJĘ ## Wyszukuje wartości w odwołaniu lub w tablicy. +OFFSET = PRZESUNIĘCIE ## Zwraca adres przesunięty od danego odwołania. +ROW = WIERSZ ## Zwraca numer wiersza odwołania. +ROWS = ILE.WIERSZY ## Zwraca liczbę wierszy dla danego odwołania. +RTD = RTD ## Pobiera dane w czasie rzeczywistym z programu obsługującego automatyzację COM (Automatyzacja: Sposób pracy z obiektami aplikacji pochodzącymi z innej aplikacji lub narzędzia projektowania. Nazywana wcześniej Automatyzacją OLE, Automatyzacja jest standardem przemysłowym i funkcją obiektowego modelu składników (COM, Component Object Model).). +TRANSPOSE = TRANSPONUJ ## Zwraca transponowaną tablicę. +VLOOKUP = WYSZUKAJ.PIONOWO ## Przeszukuje pierwszą kolumnę tablicy i przechodzi wzdłuż wiersza, aby zwrócić wartość komórki. + + +## +## Math and trigonometry functions Funkcje matematyczne i trygonometryczne +## +ABS = MODUŁ.LICZBY ## Zwraca wartość absolutną liczby. +ACOS = ACOS ## Zwraca arcus cosinus liczby. +ACOSH = ACOSH ## Zwraca arcus cosinus hiperboliczny liczby. +ASIN = ASIN ## Zwraca arcus sinus liczby. +ASINH = ASINH ## Zwraca arcus sinus hiperboliczny liczby. +ATAN = ATAN ## Zwraca arcus tangens liczby. +ATAN2 = ATAN2 ## Zwraca arcus tangens liczby na podstawie współrzędnych x i y. +ATANH = ATANH ## Zwraca arcus tangens hiperboliczny liczby. +CEILING = ZAOKR.W.GÓRĘ ## Zaokrągla liczbę do najbliższej liczby całkowitej lub do najbliższej wielokrotności dokładności. +COMBIN = KOMBINACJE ## Zwraca liczbę kombinacji dla danej liczby obiektów. +COS = COS ## Zwraca cosinus liczby. +COSH = COSH ## Zwraca cosinus hiperboliczny liczby. +DEGREES = STOPNIE ## Konwertuje radiany na stopnie. +EVEN = ZAOKR.DO.PARZ ## Zaokrągla liczbę w górę do najbliższej liczby parzystej. +EXP = EXP ## Zwraca wartość liczby e podniesionej do potęgi określonej przez podaną liczbę. +FACT = SILNIA ## Zwraca silnię liczby. +FACTDOUBLE = FACTDOUBLE ## Zwraca podwójną silnię liczby. +FLOOR = ZAOKR.W.DÓŁ ## Zaokrągla liczbę w dół, w kierunku zera. +GCD = GCD ## Zwraca największy wspólny dzielnik. +INT = ZAOKR.DO.CAŁK ## Zaokrągla liczbę w dół do najbliższej liczby całkowitej. +LCM = LCM ## Zwraca najmniejszą wspólną wielokrotność. +LN = LN ## Zwraca logarytm naturalny podanej liczby. +LOG = LOG ## Zwraca logarytm danej liczby przy zadanej podstawie. +LOG10 = LOG10 ## Zwraca logarytm dziesiętny liczby. +MDETERM = WYZNACZNIK.MACIERZY ## Zwraca wyznacznik macierzy tablicy. +MINVERSE = MACIERZ.ODW ## Zwraca odwrotność macierzy tablicy. +MMULT = MACIERZ.ILOCZYN ## Zwraca iloczyn macierzy dwóch tablic. +MOD = MOD ## Zwraca resztę z dzielenia. +MROUND = MROUND ## Zwraca liczbę zaokrągloną do żądanej wielokrotności. +MULTINOMIAL = MULTINOMIAL ## Zwraca wielomian dla zbioru liczb. +ODD = ZAOKR.DO.NPARZ ## Zaokrągla liczbę w górę do najbliższej liczby nieparzystej. +PI = PI ## Zwraca wartość liczby Pi. +POWER = POTĘGA ## Zwraca liczbę podniesioną do potęgi. +PRODUCT = ILOCZYN ## Mnoży argumenty. +QUOTIENT = QUOTIENT ## Zwraca iloraz (całkowity). +RADIANS = RADIANY ## Konwertuje stopnie na radiany. +RAND = LOS ## Zwraca liczbę pseudolosową z zakresu od 0 do 1. +RANDBETWEEN = RANDBETWEEN ## Zwraca liczbę pseudolosową z zakresu określonego przez podane argumenty. +ROMAN = RZYMSKIE ## Konwertuje liczbę arabską na rzymską jako tekst. +ROUND = ZAOKR ## Zaokrągla liczbę do określonej liczby cyfr. +ROUNDDOWN = ZAOKR.DÓŁ ## Zaokrągla liczbę w dół, w kierunku zera. +ROUNDUP = ZAOKR.GÓRA ## Zaokrągla liczbę w górę, w kierunku od zera. +SERIESSUM = SERIESSUM ## Zwraca sumę szeregu potęgowego na podstawie wzoru. +SIGN = ZNAK.LICZBY ## Zwraca znak liczby. +SIN = SIN ## Zwraca sinus danego kąta. +SINH = SINH ## Zwraca sinus hiperboliczny liczby. +SQRT = PIERWIASTEK ## Zwraca dodatni pierwiastek kwadratowy. +SQRTPI = SQRTPI ## Zwraca pierwiastek kwadratowy iloczynu (liczba * Pi). +SUBTOTAL = SUMY.POŚREDNIE ## Zwraca sumę częściową listy lub bazy danych. +SUM = SUMA ## Dodaje argumenty. +SUMIF = SUMA.JEŻELI ## Dodaje komórki określone przez podane kryterium. +SUMIFS = SUMA.WARUNKÓW ## Dodaje komórki w zakresie, które spełniają wiele kryteriów. +SUMPRODUCT = SUMA.ILOCZYNÓW ## Zwraca sumę iloczynów odpowiednich elementów tablicy. +SUMSQ = SUMA.KWADRATÓW ## Zwraca sumę kwadratów argumentów. +SUMX2MY2 = SUMA.X2.M.Y2 ## Zwraca sumę różnic kwadratów odpowiednich wartości w dwóch tablicach. +SUMX2PY2 = SUMA.X2.P.Y2 ## Zwraca sumę sum kwadratów odpowiednich wartości w dwóch tablicach. +SUMXMY2 = SUMA.XMY.2 ## Zwraca sumę kwadratów różnic odpowiednich wartości w dwóch tablicach. +TAN = TAN ## Zwraca tangens liczby. +TANH = TANH ## Zwraca tangens hiperboliczny liczby. +TRUNC = LICZBA.CAŁK ## Przycina liczbę do wartości całkowitej. + + +## +## Statistical functions Funkcje statystyczne +## +AVEDEV = ODCH.ŚREDNIE ## Zwraca średnią wartość odchyleń absolutnych punktów danych od ich wartości średniej. +AVERAGE = ŚREDNIA ## Zwraca wartość średnią argumentów. +AVERAGEA = ŚREDNIA.A ## Zwraca wartość średnią argumentów, z uwzględnieniem liczb, tekstów i wartości logicznych. +AVERAGEIF = ŚREDNIA.JEŻELI ## Zwraca średnią (średnią arytmetyczną) wszystkich komórek w zakresie, które spełniają podane kryteria. +AVERAGEIFS = ŚREDNIA.WARUNKÓW ## Zwraca średnią (średnią arytmetyczną) wszystkich komórek, które spełniają jedno lub więcej kryteriów. +BETADIST = ROZKŁAD.BETA ## Zwraca skumulowaną funkcję gęstości prawdopodobieństwa beta. +BETAINV = ROZKŁAD.BETA.ODW ## Zwraca odwrotność skumulowanej funkcji gęstości prawdopodobieństwa beta. +BINOMDIST = ROZKŁAD.DWUM ## Zwraca pojedynczy składnik dwumianowego rozkładu prawdopodobieństwa. +CHIDIST = ROZKŁAD.CHI ## Zwraca wartość jednostronnego prawdopodobieństwa rozkładu chi-kwadrat. +CHIINV = ROZKŁAD.CHI.ODW ## Zwraca odwrotność wartości jednostronnego prawdopodobieństwa rozkładu chi-kwadrat. +CHITEST = TEST.CHI ## Zwraca test niezależności. +CONFIDENCE = UFNOŚĆ ## Zwraca interwał ufności dla średniej populacji. +CORREL = WSP.KORELACJI ## Zwraca współczynnik korelacji dwóch zbiorów danych. +COUNT = ILE.LICZB ## Zlicza liczby znajdujące się na liście argumentów. +COUNTA = ILE.NIEPUSTYCH ## Zlicza wartości znajdujące się na liście argumentów. +COUNTBLANK = LICZ.PUSTE ## Zwraca liczbę pustych komórek w pewnym zakresie. +COUNTIF = LICZ.JEŻELI ## Zlicza komórki wewnątrz zakresu, które spełniają podane kryteria. +COUNTIFS = LICZ.WARUNKI ## Zlicza komórki wewnątrz zakresu, które spełniają wiele kryteriów. +COVAR = KOWARIANCJA ## Zwraca kowariancję, czyli średnią wartość iloczynów odpowiednich odchyleń. +CRITBINOM = PRÓG.ROZKŁAD.DWUM ## Zwraca najmniejszą wartość, dla której skumulowany rozkład dwumianowy jest mniejszy niż wartość kryterium lub równy jej. +DEVSQ = ODCH.KWADRATOWE ## Zwraca sumę kwadratów odchyleń. +EXPONDIST = ROZKŁAD.EXP ## Zwraca rozkład wykładniczy. +FDIST = ROZKŁAD.F ## Zwraca rozkład prawdopodobieństwa F. +FINV = ROZKŁAD.F.ODW ## Zwraca odwrotność rozkładu prawdopodobieństwa F. +FISHER = ROZKŁAD.FISHER ## Zwraca transformację Fishera. +FISHERINV = ROZKŁAD.FISHER.ODW ## Zwraca odwrotność transformacji Fishera. +FORECAST = REGLINX ## Zwraca wartość trendu liniowego. +FREQUENCY = CZĘSTOŚĆ ## Zwraca rozkład częstotliwości jako tablicę pionową. +FTEST = TEST.F ## Zwraca wynik testu F. +GAMMADIST = ROZKŁAD.GAMMA ## Zwraca rozkład gamma. +GAMMAINV = ROZKŁAD.GAMMA.ODW ## Zwraca odwrotność skumulowanego rozkładu gamma. +GAMMALN = ROZKŁAD.LIN.GAMMA ## Zwraca logarytm naturalny funkcji gamma, Γ(x). +GEOMEAN = ŚREDNIA.GEOMETRYCZNA ## Zwraca średnią geometryczną. +GROWTH = REGEXPW ## Zwraca wartości trendu wykładniczego. +HARMEAN = ŚREDNIA.HARMONICZNA ## Zwraca średnią harmoniczną. +HYPGEOMDIST = ROZKŁAD.HIPERGEOM ## Zwraca rozkład hipergeometryczny. +INTERCEPT = ODCIĘTA ## Zwraca punkt przecięcia osi pionowej z linią regresji liniowej. +KURT = KURTOZA ## Zwraca kurtozę zbioru danych. +LARGE = MAX.K ## Zwraca k-tą największą wartość ze zbioru danych. +LINEST = REGLINP ## Zwraca parametry trendu liniowego. +LOGEST = REGEXPP ## Zwraca parametry trendu wykładniczego. +LOGINV = ROZKŁAD.LOG.ODW ## Zwraca odwrotność rozkładu logarytmu naturalnego. +LOGNORMDIST = ROZKŁAD.LOG ## Zwraca skumulowany rozkład logarytmu naturalnego. +MAX = MAX ## Zwraca maksymalną wartość listy argumentów. +MAXA = MAX.A ## Zwraca maksymalną wartość listy argumentów, z uwzględnieniem liczb, tekstów i wartości logicznych. +MEDIAN = MEDIANA ## Zwraca medianę podanych liczb. +MIN = MIN ## Zwraca minimalną wartość listy argumentów. +MINA = MIN.A ## Zwraca najmniejszą wartość listy argumentów, z uwzględnieniem liczb, tekstów i wartości logicznych. +MODE = WYST.NAJCZĘŚCIEJ ## Zwraca wartość najczęściej występującą w zbiorze danych. +NEGBINOMDIST = ROZKŁAD.DWUM.PRZEC ## Zwraca ujemny rozkład dwumianowy. +NORMDIST = ROZKŁAD.NORMALNY ## Zwraca rozkład normalny skumulowany. +NORMINV = ROZKŁAD.NORMALNY.ODW ## Zwraca odwrotność rozkładu normalnego skumulowanego. +NORMSDIST = ROZKŁAD.NORMALNY.S ## Zwraca standardowy rozkład normalny skumulowany. +NORMSINV = ROZKŁAD.NORMALNY.S.ODW ## Zwraca odwrotność standardowego rozkładu normalnego skumulowanego. +PEARSON = PEARSON ## Zwraca współczynnik korelacji momentu iloczynu Pearsona. +PERCENTILE = PERCENTYL ## Wyznacza k-ty percentyl wartości w zakresie. +PERCENTRANK = PROCENT.POZYCJA ## Zwraca procentową pozycję wartości w zbiorze danych. +PERMUT = PERMUTACJE ## Zwraca liczbę permutacji dla danej liczby obiektów. +POISSON = ROZKŁAD.POISSON ## Zwraca rozkład Poissona. +PROB = PRAWDPD ## Zwraca prawdopodobieństwo, że wartości w zakresie leżą pomiędzy dwiema granicami. +QUARTILE = KWARTYL ## Wyznacza kwartyl zbioru danych. +RANK = POZYCJA ## Zwraca pozycję liczby na liście liczb. +RSQ = R.KWADRAT ## Zwraca kwadrat współczynnika korelacji momentu iloczynu Pearsona. +SKEW = SKOŚNOŚĆ ## Zwraca skośność rozkładu. +SLOPE = NACHYLENIE ## Zwraca nachylenie linii regresji liniowej. +SMALL = MIN.K ## Zwraca k-tą najmniejszą wartość ze zbioru danych. +STANDARDIZE = NORMALIZUJ ## Zwraca wartość znormalizowaną. +STDEV = ODCH.STANDARDOWE ## Szacuje odchylenie standardowe na podstawie próbki. +STDEVA = ODCH.STANDARDOWE.A ## Szacuje odchylenie standardowe na podstawie próbki, z uwzględnieniem liczb, tekstów i wartości logicznych. +STDEVP = ODCH.STANDARD.POPUL ## Oblicza odchylenie standardowe na podstawie całej populacji. +STDEVPA = ODCH.STANDARD.POPUL.A ## Oblicza odchylenie standardowe na podstawie całej populacji, z uwzględnieniem liczb, teksów i wartości logicznych. +STEYX = REGBŁSTD ## Zwraca błąd standardowy przewidzianej wartości y dla każdej wartości x w regresji. +TDIST = ROZKŁAD.T ## Zwraca rozkład t-Studenta. +TINV = ROZKŁAD.T.ODW ## Zwraca odwrotność rozkładu t-Studenta. +TREND = REGLINW ## Zwraca wartości trendu liniowego. +TRIMMEAN = ŚREDNIA.WEWN ## Zwraca średnią wartość dla wnętrza zbioru danych. +TTEST = TEST.T ## Zwraca prawdopodobieństwo związane z testem t-Studenta. +VAR = WARIANCJA ## Szacuje wariancję na podstawie próbki. +VARA = WARIANCJA.A ## Szacuje wariancję na podstawie próbki, z uwzględnieniem liczb, tekstów i wartości logicznych. +VARP = WARIANCJA.POPUL ## Oblicza wariancję na podstawie całej populacji. +VARPA = WARIANCJA.POPUL.A ## Oblicza wariancję na podstawie całej populacji, z uwzględnieniem liczb, tekstów i wartości logicznych. +WEIBULL = ROZKŁAD.WEIBULL ## Zwraca rozkład Weibulla. +ZTEST = TEST.Z ## Zwraca wartość jednostronnego prawdopodobieństwa testu z. + + +## +## Text functions Funkcje tekstowe +## +ASC = ASC ## Zamienia litery angielskie lub katakana o pełnej szerokości (dwubajtowe) w ciągu znaków na znaki o szerokości połówkowej (jednobajtowe). +BAHTTEXT = BAHTTEXT ## Konwertuje liczbę na tekst, stosując format walutowy ß (baht). +CHAR = ZNAK ## Zwraca znak o podanym numerze kodu. +CLEAN = OCZYŚĆ ## Usuwa z tekstu wszystkie znaki, które nie mogą być drukowane. +CODE = KOD ## Zwraca kod numeryczny pierwszego znaku w ciągu tekstowym. +CONCATENATE = ZŁĄCZ.TEKSTY ## Łączy kilka oddzielnych tekstów w jeden tekst. +DOLLAR = KWOTA ## Konwertuje liczbę na tekst, stosując format walutowy $ (dolar). +EXACT = PORÓWNAJ ## Sprawdza identyczność dwóch wartości tekstowych. +FIND = ZNAJDŹ ## Znajduje jedną wartość tekstową wewnątrz innej (z uwzględnieniem wielkich i małych liter). +FINDB = ZNAJDŹB ## Znajduje jedną wartość tekstową wewnątrz innej (z uwzględnieniem wielkich i małych liter). +FIXED = ZAOKR.DO.TEKST ## Formatuje liczbę jako tekst przy stałej liczbie miejsc dziesiętnych. +JIS = JIS ## Zmienia litery angielskie lub katakana o szerokości połówkowej (jednobajtowe) w ciągu znaków na znaki o pełnej szerokości (dwubajtowe). +LEFT = LEWY ## Zwraca skrajne lewe znaki z wartości tekstowej. +LEFTB = LEWYB ## Zwraca skrajne lewe znaki z wartości tekstowej. +LEN = DŁ ## Zwraca liczbę znaków ciągu tekstowego. +LENB = DŁ.B ## Zwraca liczbę znaków ciągu tekstowego. +LOWER = LITERY.MAŁE ## Konwertuje wielkie litery tekstu na małe litery. +MID = FRAGMENT.TEKSTU ## Zwraca określoną liczbę znaków z ciągu tekstowego, zaczynając od zadanej pozycji. +MIDB = FRAGMENT.TEKSTU.B ## Zwraca określoną liczbę znaków z ciągu tekstowego, zaczynając od zadanej pozycji. +PHONETIC = PHONETIC ## Wybiera znaki fonetyczne (furigana) z ciągu tekstowego. +PROPER = Z.WIELKIEJ.LITERY ## Zastępuje pierwszą literę każdego wyrazu tekstu wielką literą. +REPLACE = ZASTĄP ## Zastępuje znaki w tekście. +REPLACEB = ZASTĄP.B ## Zastępuje znaki w tekście. +REPT = POWT ## Powiela tekst daną liczbę razy. +RIGHT = PRAWY ## Zwraca skrajne prawe znaki z wartości tekstowej. +RIGHTB = PRAWYB ## Zwraca skrajne prawe znaki z wartości tekstowej. +SEARCH = SZUKAJ.TEKST ## Wyszukuje jedną wartość tekstową wewnątrz innej (bez uwzględniania wielkości liter). +SEARCHB = SZUKAJ.TEKST.B ## Wyszukuje jedną wartość tekstową wewnątrz innej (bez uwzględniania wielkości liter). +SUBSTITUTE = PODSTAW ## Podstawia nowy tekst w miejsce poprzedniego tekstu w ciągu tekstowym. +T = T ## Konwertuje argumenty na tekst. +TEXT = TEKST ## Formatuje liczbę i konwertuje ją na tekst. +TRIM = USUŃ.ZBĘDNE.ODSTĘPY ## Usuwa spacje z tekstu. +UPPER = LITERY.WIELKIE ## Konwertuje znaki tekstu na wielkie litery. +VALUE = WARTOŚĆ ## Konwertuje argument tekstowy na liczbę. diff --git a/application/third_party/PHPExcel/PHPExcel/locale/pt/br/config b/application/third_party/PHPExcel/PHPExcel/locale/pt/br/config new file mode 100644 index 0000000..45b6fbd --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/pt/br/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = R$ + + +## +## Excel Error Codes (For future use) +## +NULL = #NULO! +DIV0 = #DIV/0! +VALUE = #VALOR! +REF = #REF! +NAME = #NOME? +NUM = #NÚM! +NA = #N/D diff --git a/application/third_party/PHPExcel/PHPExcel/locale/pt/br/functions b/application/third_party/PHPExcel/PHPExcel/locale/pt/br/functions new file mode 100644 index 0000000..f3ba3a3 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/pt/br/functions @@ -0,0 +1,408 @@ +## +## Add-in and Automation functions Funções Suplemento e Automação +## +GETPIVOTDATA = INFODADOSTABELADINÂMICA ## Retorna os dados armazenados em um relatório de tabela dinâmica + + +## +## Cube functions Funções de Cubo +## +CUBEKPIMEMBER = MEMBROKPICUBO ## Retorna o nome de um KPI (indicador de desempenho-chave), uma propriedade e uma medida e exibe o nome e a propriedade na célula. Um KPI é uma medida quantificável, como o lucro bruto mensal ou a rotatividade trimestral dos funcionários, usada para monitorar o desempenho de uma organização. +CUBEMEMBER = MEMBROCUBO ## Retorna um membro ou tupla em uma hierarquia de cubo. Use para validar se o membro ou tupla existe no cubo. +CUBEMEMBERPROPERTY = PROPRIEDADEMEMBROCUBO ## Retorna o valor da propriedade de um membro no cubo. Usada para validar a existência do nome do membro no cubo e para retornar a propriedade especificada para esse membro. +CUBERANKEDMEMBER = MEMBROCLASSIFICADOCUBO ## Retorna o enésimo membro, ou o membro ordenado, em um conjunto. Use para retornar um ou mais elementos em um conjunto, assim como o melhor vendedor ou os dez melhores alunos. +CUBESET = CONJUNTOCUBO ## Define um conjunto calculado de membros ou tuplas enviando uma expressão do conjunto para o cubo no servidor, que cria o conjunto e o retorna para o Microsoft Office Excel. +CUBESETCOUNT = CONTAGEMCONJUNTOCUBO ## Retorna o número de itens em um conjunto. +CUBEVALUE = VALORCUBO ## Retorna um valor agregado de um cubo. + + +## +## Database functions Funções de banco de dados +## +DAVERAGE = BDMÉDIA ## Retorna a média das entradas selecionadas de um banco de dados +DCOUNT = BDCONTAR ## Conta as células que contêm números em um banco de dados +DCOUNTA = BDCONTARA ## Conta células não vazias em um banco de dados +DGET = BDEXTRAIR ## Extrai de um banco de dados um único registro que corresponde a um critério específico +DMAX = BDMÁX ## Retorna o valor máximo de entradas selecionadas de um banco de dados +DMIN = BDMÍN ## Retorna o valor mínimo de entradas selecionadas de um banco de dados +DPRODUCT = BDMULTIPL ## Multiplica os valores em um campo específico de registros que correspondem ao critério em um banco de dados +DSTDEV = BDEST ## Estima o desvio padrão com base em uma amostra de entradas selecionadas de um banco de dados +DSTDEVP = BDDESVPA ## Calcula o desvio padrão com base na população inteira de entradas selecionadas de um banco de dados +DSUM = BDSOMA ## Adiciona os números à coluna de campos de registros do banco de dados que correspondem ao critério +DVAR = BDVAREST ## Estima a variância com base em uma amostra de entradas selecionadas de um banco de dados +DVARP = BDVARP ## Calcula a variância com base na população inteira de entradas selecionadas de um banco de dados + + +## +## Date and time functions Funções de data e hora +## +DATE = DATA ## Retorna o número de série de uma data específica +DATEVALUE = DATA.VALOR ## Converte uma data na forma de texto para um número de série +DAY = DIA ## Converte um número de série em um dia do mês +DAYS360 = DIAS360 ## Calcula o número de dias entre duas datas com base em um ano de 360 dias +EDATE = DATAM ## Retorna o número de série da data que é o número indicado de meses antes ou depois da data inicial +EOMONTH = FIMMÊS ## Retorna o número de série do último dia do mês antes ou depois de um número especificado de meses +HOUR = HORA ## Converte um número de série em uma hora +MINUTE = MINUTO ## Converte um número de série em um minuto +MONTH = MÊS ## Converte um número de série em um mês +NETWORKDAYS = DIATRABALHOTOTAL ## Retorna o número de dias úteis inteiros entre duas datas +NOW = AGORA ## Retorna o número de série seqüencial da data e hora atuais +SECOND = SEGUNDO ## Converte um número de série em um segundo +TIME = HORA ## Retorna o número de série de uma hora específica +TIMEVALUE = VALOR.TEMPO ## Converte um horário na forma de texto para um número de série +TODAY = HOJE ## Retorna o número de série da data de hoje +WEEKDAY = DIA.DA.SEMANA ## Converte um número de série em um dia da semana +WEEKNUM = NÚMSEMANA ## Converte um número de série em um número que representa onde a semana cai numericamente em um ano +WORKDAY = DIATRABALHO ## Retorna o número de série da data antes ou depois de um número específico de dias úteis +YEAR = ANO ## Converte um número de série em um ano +YEARFRAC = FRAÇÃOANO ## Retorna a fração do ano que representa o número de dias entre data_inicial e data_final + + +## +## Engineering functions Funções de engenharia +## +BESSELI = BESSELI ## Retorna a função de Bessel In(x) modificada +BESSELJ = BESSELJ ## Retorna a função de Bessel Jn(x) +BESSELK = BESSELK ## Retorna a função de Bessel Kn(x) modificada +BESSELY = BESSELY ## Retorna a função de Bessel Yn(x) +BIN2DEC = BIN2DEC ## Converte um número binário em decimal +BIN2HEX = BIN2HEX ## Converte um número binário em hexadecimal +BIN2OCT = BIN2OCT ## Converte um número binário em octal +COMPLEX = COMPLEX ## Converte coeficientes reais e imaginários e um número complexo +CONVERT = CONVERTER ## Converte um número de um sistema de medida para outro +DEC2BIN = DECABIN ## Converte um número decimal em binário +DEC2HEX = DECAHEX ## Converte um número decimal em hexadecimal +DEC2OCT = DECAOCT ## Converte um número decimal em octal +DELTA = DELTA ## Testa se dois valores são iguais +ERF = FUNERRO ## Retorna a função de erro +ERFC = FUNERROCOMPL ## Retorna a função de erro complementar +GESTEP = DEGRAU ## Testa se um número é maior do que um valor limite +HEX2BIN = HEXABIN ## Converte um número hexadecimal em binário +HEX2DEC = HEXADEC ## Converte um número hexadecimal em decimal +HEX2OCT = HEXAOCT ## Converte um número hexadecimal em octal +IMABS = IMABS ## Retorna o valor absoluto (módulo) de um número complexo +IMAGINARY = IMAGINÁRIO ## Retorna o coeficiente imaginário de um número complexo +IMARGUMENT = IMARG ## Retorna o argumento teta, um ângulo expresso em radianos +IMCONJUGATE = IMCONJ ## Retorna o conjugado complexo de um número complexo +IMCOS = IMCOS ## Retorna o cosseno de um número complexo +IMDIV = IMDIV ## Retorna o quociente de dois números complexos +IMEXP = IMEXP ## Retorna o exponencial de um número complexo +IMLN = IMLN ## Retorna o logaritmo natural de um número complexo +IMLOG10 = IMLOG10 ## Retorna o logaritmo de base 10 de um número complexo +IMLOG2 = IMLOG2 ## Retorna o logaritmo de base 2 de um número complexo +IMPOWER = IMPOT ## Retorna um número complexo elevado a uma potência inteira +IMPRODUCT = IMPROD ## Retorna o produto de números complexos +IMREAL = IMREAL ## Retorna o coeficiente real de um número complexo +IMSIN = IMSENO ## Retorna o seno de um número complexo +IMSQRT = IMRAIZ ## Retorna a raiz quadrada de um número complexo +IMSUB = IMSUBTR ## Retorna a diferença entre dois números complexos +IMSUM = IMSOMA ## Retorna a soma de números complexos +OCT2BIN = OCTABIN ## Converte um número octal em binário +OCT2DEC = OCTADEC ## Converte um número octal em decimal +OCT2HEX = OCTAHEX ## Converte um número octal em hexadecimal + + +## +## Financial functions Funções financeiras +## +ACCRINT = JUROSACUM ## Retorna a taxa de juros acumulados de um título que paga uma taxa periódica de juros +ACCRINTM = JUROSACUMV ## Retorna os juros acumulados de um título que paga juros no vencimento +AMORDEGRC = AMORDEGRC ## Retorna a depreciação para cada período contábil usando o coeficiente de depreciação +AMORLINC = AMORLINC ## Retorna a depreciação para cada período contábil +COUPDAYBS = CUPDIASINLIQ ## Retorna o número de dias do início do período de cupom até a data de liquidação +COUPDAYS = CUPDIAS ## Retorna o número de dias no período de cupom que contém a data de quitação +COUPDAYSNC = CUPDIASPRÓX ## Retorna o número de dias da data de liquidação até a data do próximo cupom +COUPNCD = CUPDATAPRÓX ## Retorna a próxima data de cupom após a data de quitação +COUPNUM = CUPNÚM ## Retorna o número de cupons pagáveis entre as datas de quitação e vencimento +COUPPCD = CUPDATAANT ## Retorna a data de cupom anterior à data de quitação +CUMIPMT = PGTOJURACUM ## Retorna os juros acumulados pagos entre dois períodos +CUMPRINC = PGTOCAPACUM ## Retorna o capital acumulado pago sobre um empréstimo entre dois períodos +DB = BD ## Retorna a depreciação de um ativo para um período especificado, usando o método de balanço de declínio fixo +DDB = BDD ## Retorna a depreciação de um ativo com relação a um período especificado usando o método de saldos decrescentes duplos ou qualquer outro método especificado por você +DISC = DESC ## Retorna a taxa de desconto de um título +DOLLARDE = MOEDADEC ## Converte um preço em formato de moeda, na forma fracionária, em um preço na forma decimal +DOLLARFR = MOEDAFRA ## Converte um preço, apresentado na forma decimal, em um preço apresentado na forma fracionária +DURATION = DURAÇÃO ## Retorna a duração anual de um título com pagamentos de juros periódicos +EFFECT = EFETIVA ## Retorna a taxa de juros anual efetiva +FV = VF ## Retorna o valor futuro de um investimento +FVSCHEDULE = VFPLANO ## Retorna o valor futuro de um capital inicial após a aplicação de uma série de taxas de juros compostas +INTRATE = TAXAJUROS ## Retorna a taxa de juros de um título totalmente investido +IPMT = IPGTO ## Retorna o pagamento de juros para um investimento em um determinado período +IRR = TIR ## Retorna a taxa interna de retorno de uma série de fluxos de caixa +ISPMT = ÉPGTO ## Calcula os juros pagos durante um período específico de um investimento +MDURATION = MDURAÇÃO ## Retorna a duração de Macauley modificada para um título com um valor de paridade equivalente a R$ 100 +MIRR = MTIR ## Calcula a taxa interna de retorno em que fluxos de caixa positivos e negativos são financiados com diferentes taxas +NOMINAL = NOMINAL ## Retorna a taxa de juros nominal anual +NPER = NPER ## Retorna o número de períodos de um investimento +NPV = VPL ## Retorna o valor líquido atual de um investimento com base em uma série de fluxos de caixa periódicos e em uma taxa de desconto +ODDFPRICE = PREÇOPRIMINC ## Retorna o preço por R$ 100 de valor nominal de um título com um primeiro período indefinido +ODDFYIELD = LUCROPRIMINC ## Retorna o rendimento de um título com um primeiro período indefinido +ODDLPRICE = PREÇOÚLTINC ## Retorna o preço por R$ 100 de valor nominal de um título com um último período de cupom indefinido +ODDLYIELD = LUCROÚLTINC ## Retorna o rendimento de um título com um último período indefinido +PMT = PGTO ## Retorna o pagamento periódico de uma anuidade +PPMT = PPGTO ## Retorna o pagamento de capital para determinado período de investimento +PRICE = PREÇO ## Retorna a preço por R$ 100,00 de valor nominal de um título que paga juros periódicos +PRICEDISC = PREÇODESC ## Retorna o preço por R$ 100,00 de valor nominal de um título descontado +PRICEMAT = PREÇOVENC ## Retorna o preço por R$ 100,00 de valor nominal de um título que paga juros no vencimento +PV = VP ## Retorna o valor presente de um investimento +RATE = TAXA ## Retorna a taxa de juros por período de uma anuidade +RECEIVED = RECEBER ## Retorna a quantia recebida no vencimento de um título totalmente investido +SLN = DPD ## Retorna a depreciação em linha reta de um ativo durante um período +SYD = SDA ## Retorna a depreciação dos dígitos da soma dos anos de um ativo para um período especificado +TBILLEQ = OTN ## Retorna o rendimento de um título equivalente a uma obrigação do Tesouro +TBILLPRICE = OTNVALOR ## Retorna o preço por R$ 100,00 de valor nominal de uma obrigação do Tesouro +TBILLYIELD = OTNLUCRO ## Retorna o rendimento de uma obrigação do Tesouro +VDB = BDV ## Retorna a depreciação de um ativo para um período especificado ou parcial usando um método de balanço declinante +XIRR = XTIR ## Fornece a taxa interna de retorno para um programa de fluxos de caixa que não é necessariamente periódico +XNPV = XVPL ## Retorna o valor presente líquido de um programa de fluxos de caixa que não é necessariamente periódico +YIELD = LUCRO ## Retorna o lucro de um título que paga juros periódicos +YIELDDISC = LUCRODESC ## Retorna o rendimento anual de um título descontado. Por exemplo, uma obrigação do Tesouro +YIELDMAT = LUCROVENC ## Retorna o lucro anual de um título que paga juros no vencimento + + +## +## Information functions Funções de informação +## +CELL = CÉL ## Retorna informações sobre formatação, localização ou conteúdo de uma célula +ERROR.TYPE = TIPO.ERRO ## Retorna um número correspondente a um tipo de erro +INFO = INFORMAÇÃO ## Retorna informações sobre o ambiente operacional atual +ISBLANK = ÉCÉL.VAZIA ## Retorna VERDADEIRO se o valor for vazio +ISERR = ÉERRO ## Retorna VERDADEIRO se o valor for um valor de erro diferente de #N/D +ISERROR = ÉERROS ## Retorna VERDADEIRO se o valor for um valor de erro +ISEVEN = ÉPAR ## Retorna VERDADEIRO se o número for par +ISLOGICAL = ÉLÓGICO ## Retorna VERDADEIRO se o valor for um valor lógico +ISNA = É.NÃO.DISP ## Retorna VERDADEIRO se o valor for o valor de erro #N/D +ISNONTEXT = É.NÃO.TEXTO ## Retorna VERDADEIRO se o valor for diferente de texto +ISNUMBER = ÉNÚM ## Retorna VERDADEIRO se o valor for um número +ISODD = ÉIMPAR ## Retorna VERDADEIRO se o número for ímpar +ISREF = ÉREF ## Retorna VERDADEIRO se o valor for uma referência +ISTEXT = ÉTEXTO ## Retorna VERDADEIRO se o valor for texto +N = N ## Retorna um valor convertido em um número +NA = NÃO.DISP ## Retorna o valor de erro #N/D +TYPE = TIPO ## Retorna um número indicando o tipo de dados de um valor + + +## +## Logical functions Funções lógicas +## +AND = E ## Retorna VERDADEIRO se todos os seus argumentos forem VERDADEIROS +FALSE = FALSO ## Retorna o valor lógico FALSO +IF = SE ## Especifica um teste lógico a ser executado +IFERROR = SEERRO ## Retornará um valor que você especifica se uma fórmula for avaliada para um erro; do contrário, retornará o resultado da fórmula +NOT = NÃO ## Inverte o valor lógico do argumento +OR = OU ## Retorna VERDADEIRO se um dos argumentos for VERDADEIRO +TRUE = VERDADEIRO ## Retorna o valor lógico VERDADEIRO + + +## +## Lookup and reference functions Funções de pesquisa e referência +## +ADDRESS = ENDEREÇO ## Retorna uma referência como texto para uma única célula em uma planilha +AREAS = ÁREAS ## Retorna o número de áreas em uma referência +CHOOSE = ESCOLHER ## Escolhe um valor a partir de uma lista de valores +COLUMN = COL ## Retorna o número da coluna de uma referência +COLUMNS = COLS ## Retorna o número de colunas em uma referência +HLOOKUP = PROCH ## Procura na linha superior de uma matriz e retorna o valor da célula especificada +HYPERLINK = HYPERLINK ## Cria um atalho ou salto que abre um documento armazenado em um servidor de rede, uma intranet ou na Internet +INDEX = ÍNDICE ## Usa um índice para escolher um valor de uma referência ou matriz +INDIRECT = INDIRETO ## Retorna uma referência indicada por um valor de texto +LOOKUP = PROC ## Procura valores em um vetor ou em uma matriz +MATCH = CORRESP ## Procura valores em uma referência ou em uma matriz +OFFSET = DESLOC ## Retorna um deslocamento de referência com base em uma determinada referência +ROW = LIN ## Retorna o número da linha de uma referência +ROWS = LINS ## Retorna o número de linhas em uma referência +RTD = RTD ## Recupera dados em tempo real de um programa que ofereça suporte a automação COM (automação: uma forma de trabalhar com objetos de um aplicativo a partir de outro aplicativo ou ferramenta de desenvolvimento. Chamada inicialmente de automação OLE, a automação é um padrão industrial e um recurso do modelo de objeto componente (COM).) +TRANSPOSE = TRANSPOR ## Retorna a transposição de uma matriz +VLOOKUP = PROCV ## Procura na primeira coluna de uma matriz e move ao longo da linha para retornar o valor de uma célula + + +## +## Math and trigonometry functions Funções matemáticas e trigonométricas +## +ABS = ABS ## Retorna o valor absoluto de um número +ACOS = ACOS ## Retorna o arco cosseno de um número +ACOSH = ACOSH ## Retorna o cosseno hiperbólico inverso de um número +ASIN = ASEN ## Retorna o arco seno de um número +ASINH = ASENH ## Retorna o seno hiperbólico inverso de um número +ATAN = ATAN ## Retorna o arco tangente de um número +ATAN2 = ATAN2 ## Retorna o arco tangente das coordenadas x e y especificadas +ATANH = ATANH ## Retorna a tangente hiperbólica inversa de um número +CEILING = TETO ## Arredonda um número para o inteiro mais próximo ou para o múltiplo mais próximo de significância +COMBIN = COMBIN ## Retorna o número de combinações de um determinado número de objetos +COS = COS ## Retorna o cosseno de um número +COSH = COSH ## Retorna o cosseno hiperbólico de um número +DEGREES = GRAUS ## Converte radianos em graus +EVEN = PAR ## Arredonda um número para cima até o inteiro par mais próximo +EXP = EXP ## Retorna e elevado à potência de um número especificado +FACT = FATORIAL ## Retorna o fatorial de um número +FACTDOUBLE = FATDUPLO ## Retorna o fatorial duplo de um número +FLOOR = ARREDMULTB ## Arredonda um número para baixo até zero +GCD = MDC ## Retorna o máximo divisor comum +INT = INT ## Arredonda um número para baixo até o número inteiro mais próximo +LCM = MMC ## Retorna o mínimo múltiplo comum +LN = LN ## Retorna o logaritmo natural de um número +LOG = LOG ## Retorna o logaritmo de um número de uma base especificada +LOG10 = LOG10 ## Retorna o logaritmo de base 10 de um número +MDETERM = MATRIZ.DETERM ## Retorna o determinante de uma matriz de uma variável do tipo matriz +MINVERSE = MATRIZ.INVERSO ## Retorna a matriz inversa de uma matriz +MMULT = MATRIZ.MULT ## Retorna o produto de duas matrizes +MOD = RESTO ## Retorna o resto da divisão +MROUND = MARRED ## Retorna um número arredondado ao múltiplo desejado +MULTINOMIAL = MULTINOMIAL ## Retorna o multinomial de um conjunto de números +ODD = ÍMPAR ## Arredonda um número para cima até o inteiro ímpar mais próximo +PI = PI ## Retorna o valor de Pi +POWER = POTÊNCIA ## Fornece o resultado de um número elevado a uma potência +PRODUCT = MULT ## Multiplica seus argumentos +QUOTIENT = QUOCIENTE ## Retorna a parte inteira de uma divisão +RADIANS = RADIANOS ## Converte graus em radianos +RAND = ALEATÓRIO ## Retorna um número aleatório entre 0 e 1 +RANDBETWEEN = ALEATÓRIOENTRE ## Retorna um número aleatório entre os números especificados +ROMAN = ROMANO ## Converte um algarismo arábico em romano, como texto +ROUND = ARRED ## Arredonda um número até uma quantidade especificada de dígitos +ROUNDDOWN = ARREDONDAR.PARA.BAIXO ## Arredonda um número para baixo até zero +ROUNDUP = ARREDONDAR.PARA.CIMA ## Arredonda um número para cima, afastando-o de zero +SERIESSUM = SOMASEQÜÊNCIA ## Retorna a soma de uma série polinomial baseada na fórmula +SIGN = SINAL ## Retorna o sinal de um número +SIN = SEN ## Retorna o seno de um ângulo dado +SINH = SENH ## Retorna o seno hiperbólico de um número +SQRT = RAIZ ## Retorna uma raiz quadrada positiva +SQRTPI = RAIZPI ## Retorna a raiz quadrada de (núm* pi) +SUBTOTAL = SUBTOTAL ## Retorna um subtotal em uma lista ou em um banco de dados +SUM = SOMA ## Soma seus argumentos +SUMIF = SOMASE ## Adiciona as células especificadas por um determinado critério +SUMIFS = SOMASE ## Adiciona as células em um intervalo que atende a vários critérios +SUMPRODUCT = SOMARPRODUTO ## Retorna a soma dos produtos de componentes correspondentes de matrizes +SUMSQ = SOMAQUAD ## Retorna a soma dos quadrados dos argumentos +SUMX2MY2 = SOMAX2DY2 ## Retorna a soma da diferença dos quadrados dos valores correspondentes em duas matrizes +SUMX2PY2 = SOMAX2SY2 ## Retorna a soma da soma dos quadrados dos valores correspondentes em duas matrizes +SUMXMY2 = SOMAXMY2 ## Retorna a soma dos quadrados das diferenças dos valores correspondentes em duas matrizes +TAN = TAN ## Retorna a tangente de um número +TANH = TANH ## Retorna a tangente hiperbólica de um número +TRUNC = TRUNCAR ## Trunca um número para um inteiro + + +## +## Statistical functions Funções estatísticas +## +AVEDEV = DESV.MÉDIO ## Retorna a média aritmética dos desvios médios dos pontos de dados a partir de sua média +AVERAGE = MÉDIA ## Retorna a média dos argumentos +AVERAGEA = MÉDIAA ## Retorna a média dos argumentos, inclusive números, texto e valores lógicos +AVERAGEIF = MÉDIASE ## Retorna a média (média aritmética) de todas as células em um intervalo que atendem a um determinado critério +AVERAGEIFS = MÉDIASES ## Retorna a média (média aritmética) de todas as células que atendem a múltiplos critérios. +BETADIST = DISTBETA ## Retorna a função de distribuição cumulativa beta +BETAINV = BETA.ACUM.INV ## Retorna o inverso da função de distribuição cumulativa para uma distribuição beta especificada +BINOMDIST = DISTRBINOM ## Retorna a probabilidade de distribuição binomial do termo individual +CHIDIST = DIST.QUI ## Retorna a probabilidade unicaudal da distribuição qui-quadrada +CHIINV = INV.QUI ## Retorna o inverso da probabilidade uni-caudal da distribuição qui-quadrada +CHITEST = TESTE.QUI ## Retorna o teste para independência +CONFIDENCE = INT.CONFIANÇA ## Retorna o intervalo de confiança para uma média da população +CORREL = CORREL ## Retorna o coeficiente de correlação entre dois conjuntos de dados +COUNT = CONT.NÚM ## Calcula quantos números há na lista de argumentos +COUNTA = CONT.VALORES ## Calcula quantos valores há na lista de argumentos +COUNTBLANK = CONTAR.VAZIO ## Conta o número de células vazias no intervalo especificado +COUNTIF = CONT.SE ## Calcula o número de células não vazias em um intervalo que corresponde a determinados critérios +COUNTIFS = CONT.SES ## Conta o número de células dentro de um intervalo que atende a múltiplos critérios +COVAR = COVAR ## Retorna a covariância, a média dos produtos dos desvios pares +CRITBINOM = CRIT.BINOM ## Retorna o menor valor para o qual a distribuição binomial cumulativa é menor ou igual ao valor padrão +DEVSQ = DESVQ ## Retorna a soma dos quadrados dos desvios +EXPONDIST = DISTEXPON ## Retorna a distribuição exponencial +FDIST = DISTF ## Retorna a distribuição de probabilidade F +FINV = INVF ## Retorna o inverso da distribuição de probabilidades F +FISHER = FISHER ## Retorna a transformação Fisher +FISHERINV = FISHERINV ## Retorna o inverso da transformação Fisher +FORECAST = PREVISÃO ## Retorna um valor ao longo de uma linha reta +FREQUENCY = FREQÜÊNCIA ## Retorna uma distribuição de freqüência como uma matriz vertical +FTEST = TESTEF ## Retorna o resultado de um teste F +GAMMADIST = DISTGAMA ## Retorna a distribuição gama +GAMMAINV = INVGAMA ## Retorna o inverso da distribuição cumulativa gama +GAMMALN = LNGAMA ## Retorna o logaritmo natural da função gama, G(x) +GEOMEAN = MÉDIA.GEOMÉTRICA ## Retorna a média geométrica +GROWTH = CRESCIMENTO ## Retorna valores ao longo de uma tendência exponencial +HARMEAN = MÉDIA.HARMÔNICA ## Retorna a média harmônica +HYPGEOMDIST = DIST.HIPERGEOM ## Retorna a distribuição hipergeométrica +INTERCEPT = INTERCEPÇÃO ## Retorna a intercepção da linha de regressão linear +KURT = CURT ## Retorna a curtose de um conjunto de dados +LARGE = MAIOR ## Retorna o maior valor k-ésimo de um conjunto de dados +LINEST = PROJ.LIN ## Retorna os parâmetros de uma tendência linear +LOGEST = PROJ.LOG ## Retorna os parâmetros de uma tendência exponencial +LOGINV = INVLOG ## Retorna o inverso da distribuição lognormal +LOGNORMDIST = DIST.LOGNORMAL ## Retorna a distribuição lognormal cumulativa +MAX = MÁXIMO ## Retorna o valor máximo em uma lista de argumentos +MAXA = MÁXIMOA ## Retorna o maior valor em uma lista de argumentos, inclusive números, texto e valores lógicos +MEDIAN = MED ## Retorna a mediana dos números indicados +MIN = MÍNIMO ## Retorna o valor mínimo em uma lista de argumentos +MINA = MÍNIMOA ## Retorna o menor valor em uma lista de argumentos, inclusive números, texto e valores lógicos +MODE = MODO ## Retorna o valor mais comum em um conjunto de dados +NEGBINOMDIST = DIST.BIN.NEG ## Retorna a distribuição binomial negativa +NORMDIST = DIST.NORM ## Retorna a distribuição cumulativa normal +NORMINV = INV.NORM ## Retorna o inverso da distribuição cumulativa normal +NORMSDIST = DIST.NORMP ## Retorna a distribuição cumulativa normal padrão +NORMSINV = INV.NORMP ## Retorna o inverso da distribuição cumulativa normal padrão +PEARSON = PEARSON ## Retorna o coeficiente de correlação do momento do produto Pearson +PERCENTILE = PERCENTIL ## Retorna o k-ésimo percentil de valores em um intervalo +PERCENTRANK = ORDEM.PORCENTUAL ## Retorna a ordem percentual de um valor em um conjunto de dados +PERMUT = PERMUT ## Retorna o número de permutações de um determinado número de objetos +POISSON = POISSON ## Retorna a distribuição Poisson +PROB = PROB ## Retorna a probabilidade de valores em um intervalo estarem entre dois limites +QUARTILE = QUARTIL ## Retorna o quartil do conjunto de dados +RANK = ORDEM ## Retorna a posição de um número em uma lista de números +RSQ = RQUAD ## Retorna o quadrado do coeficiente de correlação do momento do produto de Pearson +SKEW = DISTORÇÃO ## Retorna a distorção de uma distribuição +SLOPE = INCLINAÇÃO ## Retorna a inclinação da linha de regressão linear +SMALL = MENOR ## Retorna o menor valor k-ésimo do conjunto de dados +STANDARDIZE = PADRONIZAR ## Retorna um valor normalizado +STDEV = DESVPAD ## Estima o desvio padrão com base em uma amostra +STDEVA = DESVPADA ## Estima o desvio padrão com base em uma amostra, inclusive números, texto e valores lógicos +STDEVP = DESVPADP ## Calcula o desvio padrão com base na população total +STDEVPA = DESVPADPA ## Calcula o desvio padrão com base na população total, inclusive números, texto e valores lógicos +STEYX = EPADYX ## Retorna o erro padrão do valor-y previsto para cada x da regressão +TDIST = DISTT ## Retorna a distribuição t de Student +TINV = INVT ## Retorna o inverso da distribuição t de Student +TREND = TENDÊNCIA ## Retorna valores ao longo de uma tendência linear +TRIMMEAN = MÉDIA.INTERNA ## Retorna a média do interior de um conjunto de dados +TTEST = TESTET ## Retorna a probabilidade associada ao teste t de Student +VAR = VAR ## Estima a variância com base em uma amostra +VARA = VARA ## Estima a variância com base em uma amostra, inclusive números, texto e valores lógicos +VARP = VARP ## Calcula a variância com base na população inteira +VARPA = VARPA ## Calcula a variância com base na população total, inclusive números, texto e valores lógicos +WEIBULL = WEIBULL ## Retorna a distribuição Weibull +ZTEST = TESTEZ ## Retorna o valor de probabilidade uni-caudal de um teste-z + + +## +## Text functions Funções de texto +## +ASC = ASC ## Altera letras do inglês ou katakana de largura total (bytes duplos) dentro de uma seqüência de caracteres para caracteres de meia largura (byte único) +BAHTTEXT = BAHTTEXT ## Converte um número em um texto, usando o formato de moeda ß (baht) +CHAR = CARACT ## Retorna o caractere especificado pelo número de código +CLEAN = TIRAR ## Remove todos os caracteres do texto que não podem ser impressos +CODE = CÓDIGO ## Retorna um código numérico para o primeiro caractere de uma seqüência de caracteres de texto +CONCATENATE = CONCATENAR ## Agrupa vários itens de texto em um único item de texto +DOLLAR = MOEDA ## Converte um número em texto, usando o formato de moeda $ (dólar) +EXACT = EXATO ## Verifica se dois valores de texto são idênticos +FIND = PROCURAR ## Procura um valor de texto dentro de outro (diferencia maiúsculas de minúsculas) +FINDB = PROCURARB ## Procura um valor de texto dentro de outro (diferencia maiúsculas de minúsculas) +FIXED = DEF.NÚM.DEC ## Formata um número como texto com um número fixo de decimais +JIS = JIS ## Altera letras do inglês ou katakana de meia largura (byte único) dentro de uma seqüência de caracteres para caracteres de largura total (bytes duplos) +LEFT = ESQUERDA ## Retorna os caracteres mais à esquerda de um valor de texto +LEFTB = ESQUERDAB ## Retorna os caracteres mais à esquerda de um valor de texto +LEN = NÚM.CARACT ## Retorna o número de caracteres em uma seqüência de texto +LENB = NÚM.CARACTB ## Retorna o número de caracteres em uma seqüência de texto +LOWER = MINÚSCULA ## Converte texto para minúsculas +MID = EXT.TEXTO ## Retorna um número específico de caracteres de uma seqüência de texto começando na posição especificada +MIDB = EXT.TEXTOB ## Retorna um número específico de caracteres de uma seqüência de texto começando na posição especificada +PHONETIC = FONÉTICA ## Extrai os caracteres fonéticos (furigana) de uma seqüência de caracteres de texto +PROPER = PRI.MAIÚSCULA ## Coloca a primeira letra de cada palavra em maiúscula em um valor de texto +REPLACE = MUDAR ## Muda os caracteres dentro do texto +REPLACEB = MUDARB ## Muda os caracteres dentro do texto +REPT = REPT ## Repete o texto um determinado número de vezes +RIGHT = DIREITA ## Retorna os caracteres mais à direita de um valor de texto +RIGHTB = DIREITAB ## Retorna os caracteres mais à direita de um valor de texto +SEARCH = LOCALIZAR ## Localiza um valor de texto dentro de outro (não diferencia maiúsculas de minúsculas) +SEARCHB = LOCALIZARB ## Localiza um valor de texto dentro de outro (não diferencia maiúsculas de minúsculas) +SUBSTITUTE = SUBSTITUIR ## Substitui um novo texto por um texto antigo em uma seqüência de texto +T = T ## Converte os argumentos em texto +TEXT = TEXTO ## Formata um número e o converte em texto +TRIM = ARRUMAR ## Remove espaços do texto +UPPER = MAIÚSCULA ## Converte o texto em maiúsculas +VALUE = VALOR ## Converte um argumento de texto em um número diff --git a/application/third_party/PHPExcel/PHPExcel/locale/pt/config b/application/third_party/PHPExcel/PHPExcel/locale/pt/config new file mode 100644 index 0000000..8bb8d8b --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/pt/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = € + + +## +## Excel Error Codes (For future use) +## +NULL = #NULO! +DIV0 = #DIV/0! +VALUE = #VALOR! +REF = #REF! +NAME = #NOME? +NUM = #NÚM! +NA = #N/D diff --git a/application/third_party/PHPExcel/PHPExcel/locale/pt/functions b/application/third_party/PHPExcel/PHPExcel/locale/pt/functions new file mode 100644 index 0000000..7fe9e3b --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/pt/functions @@ -0,0 +1,408 @@ +## +## Add-in and Automation functions Funções de Suplemento e Automatização +## +GETPIVOTDATA = OBTERDADOSDIN ## Devolve dados armazenados num relatório de Tabela Dinâmica + + +## +## Cube functions Funções de cubo +## +CUBEKPIMEMBER = MEMBROKPICUBO ## Devolve o nome, propriedade e medição de um KPI (key performance indicator) e apresenta o nome e a propriedade na célula. Um KPI é uma medida quantificável, como, por exemplo, o lucro mensal bruto ou a rotatividade trimestral de pessoal, utilizada para monitorizar o desempenho de uma organização. +CUBEMEMBER = MEMBROCUBO ## Devolve um membro ou cadeia de identificação numa hierarquia de cubo. Utilizada para validar a existência do membro ou cadeia de identificação no cubo. +CUBEMEMBERPROPERTY = PROPRIEDADEMEMBROCUBO ## Devolve o valor de uma propriedade de membro no cubo. Utilizada para validar a existência de um nome de membro no cubo e para devolver a propriedade especificada para esse membro. +CUBERANKEDMEMBER = MEMBROCLASSIFICADOCUBO ## Devolve o enésimo ou a classificação mais alta num conjunto. Utilizada para devolver um ou mais elementos num conjunto, tal como o melhor vendedor ou os 10 melhores alunos. +CUBESET = CONJUNTOCUBO ## Define um conjunto calculado de membros ou cadeias de identificação enviando uma expressão de conjunto para o cubo no servidor, que cria o conjunto e, em seguida, devolve o conjunto ao Microsoft Office Excel. +CUBESETCOUNT = CONTARCONJUNTOCUBO ## Devolve o número de itens num conjunto. +CUBEVALUE = VALORCUBO ## Devolve um valor agregado do cubo. + + +## +## Database functions Funções de base de dados +## +DAVERAGE = BDMÉDIA ## Devolve a média das entradas da base de dados seleccionadas +DCOUNT = BDCONTAR ## Conta as células que contêm números numa base de dados +DCOUNTA = BDCONTAR.VAL ## Conta as células que não estejam em branco numa base de dados +DGET = BDOBTER ## Extrai de uma base de dados um único registo que corresponde aos critérios especificados +DMAX = BDMÁX ## Devolve o valor máximo das entradas da base de dados seleccionadas +DMIN = BDMÍN ## Devolve o valor mínimo das entradas da base de dados seleccionadas +DPRODUCT = BDMULTIPL ## Multiplica os valores de um determinado campo de registos que correspondem aos critérios numa base de dados +DSTDEV = BDDESVPAD ## Calcula o desvio-padrão com base numa amostra de entradas da base de dados seleccionadas +DSTDEVP = BDDESVPADP ## Calcula o desvio-padrão com base na população total das entradas da base de dados seleccionadas +DSUM = BDSOMA ## Adiciona os números na coluna de campo dos registos de base de dados que correspondem aos critérios +DVAR = BDVAR ## Calcula a variância com base numa amostra das entradas de base de dados seleccionadas +DVARP = BDVARP ## Calcula a variância com base na população total das entradas de base de dados seleccionadas + + +## +## Date and time functions Funções de data e hora +## +DATE = DATA ## Devolve o número de série de uma determinada data +DATEVALUE = DATA.VALOR ## Converte uma data em forma de texto num número de série +DAY = DIA ## Converte um número de série num dia do mês +DAYS360 = DIAS360 ## Calcula o número de dias entre duas datas com base num ano com 360 dias +EDATE = DATAM ## Devolve um número de série de data que corresponde ao número de meses indicado antes ou depois da data de início +EOMONTH = FIMMÊS ## Devolve o número de série do último dia do mês antes ou depois de um número de meses especificado +HOUR = HORA ## Converte um número de série numa hora +MINUTE = MINUTO ## Converte um número de série num minuto +MONTH = MÊS ## Converte um número de série num mês +NETWORKDAYS = DIATRABALHOTOTAL ## Devolve o número total de dias úteis entre duas datas +NOW = AGORA ## Devolve o número de série da data e hora actuais +SECOND = SEGUNDO ## Converte um número de série num segundo +TIME = TEMPO ## Devolve o número de série de um determinado tempo +TIMEVALUE = VALOR.TEMPO ## Converte um tempo em forma de texto num número de série +TODAY = HOJE ## Devolve o número de série da data actual +WEEKDAY = DIA.SEMANA ## Converte um número de série num dia da semana +WEEKNUM = NÚMSEMANA ## Converte um número de série num número que representa o número da semana num determinado ano +WORKDAY = DIA.TRABALHO ## Devolve o número de série da data antes ou depois de um número de dias úteis especificado +YEAR = ANO ## Converte um número de série num ano +YEARFRAC = FRACÇÃOANO ## Devolve a fracção de ano que representa o número de dias inteiros entre a data_de_início e a data_de_fim + + +## +## Engineering functions Funções de engenharia +## +BESSELI = BESSELI ## Devolve a função de Bessel modificada In(x) +BESSELJ = BESSELJ ## Devolve a função de Bessel Jn(x) +BESSELK = BESSELK ## Devolve a função de Bessel modificada Kn(x) +BESSELY = BESSELY ## Devolve a função de Bessel Yn(x) +BIN2DEC = BINADEC ## Converte um número binário em decimal +BIN2HEX = BINAHEX ## Converte um número binário em hexadecimal +BIN2OCT = BINAOCT ## Converte um número binário em octal +COMPLEX = COMPLEXO ## Converte coeficientes reais e imaginários num número complexo +CONVERT = CONVERTER ## Converte um número de um sistema de medida noutro +DEC2BIN = DECABIN ## Converte um número decimal em binário +DEC2HEX = DECAHEX ## Converte um número decimal em hexadecimal +DEC2OCT = DECAOCT ## Converte um número decimal em octal +DELTA = DELTA ## Testa se dois valores são iguais +ERF = FUNCERRO ## Devolve a função de erro +ERFC = FUNCERROCOMPL ## Devolve a função de erro complementar +GESTEP = DEGRAU ## Testa se um número é maior do que um valor limite +HEX2BIN = HEXABIN ## Converte um número hexadecimal em binário +HEX2DEC = HEXADEC ## Converte um número hexadecimal em decimal +HEX2OCT = HEXAOCT ## Converte um número hexadecimal em octal +IMABS = IMABS ## Devolve o valor absoluto (módulo) de um número complexo +IMAGINARY = IMAGINÁRIO ## Devolve o coeficiente imaginário de um número complexo +IMARGUMENT = IMARG ## Devolve o argumento Teta, um ângulo expresso em radianos +IMCONJUGATE = IMCONJ ## Devolve o conjugado complexo de um número complexo +IMCOS = IMCOS ## Devolve o co-seno de um número complexo +IMDIV = IMDIV ## Devolve o quociente de dois números complexos +IMEXP = IMEXP ## Devolve o exponencial de um número complexo +IMLN = IMLN ## Devolve o logaritmo natural de um número complexo +IMLOG10 = IMLOG10 ## Devolve o logaritmo de base 10 de um número complexo +IMLOG2 = IMLOG2 ## Devolve o logaritmo de base 2 de um número complexo +IMPOWER = IMPOT ## Devolve um número complexo elevado a uma potência inteira +IMPRODUCT = IMPROD ## Devolve o produto de números complexos +IMREAL = IMREAL ## Devolve o coeficiente real de um número complexo +IMSIN = IMSENO ## Devolve o seno de um número complexo +IMSQRT = IMRAIZ ## Devolve a raiz quadrada de um número complexo +IMSUB = IMSUBTR ## Devolve a diferença entre dois números complexos +IMSUM = IMSOMA ## Devolve a soma de números complexos +OCT2BIN = OCTABIN ## Converte um número octal em binário +OCT2DEC = OCTADEC ## Converte um número octal em decimal +OCT2HEX = OCTAHEX ## Converte um número octal em hexadecimal + + +## +## Financial functions Funções financeiras +## +ACCRINT = JUROSACUM ## Devolve os juros acumulados de um título que paga juros periódicos +ACCRINTM = JUROSACUMV ## Devolve os juros acumulados de um título que paga juros no vencimento +AMORDEGRC = AMORDEGRC ## Devolve a depreciação correspondente a cada período contabilístico utilizando um coeficiente de depreciação +AMORLINC = AMORLINC ## Devolve a depreciação correspondente a cada período contabilístico +COUPDAYBS = CUPDIASINLIQ ## Devolve o número de dias entre o início do período do cupão e a data de regularização +COUPDAYS = CUPDIAS ## Devolve o número de dias no período do cupão que contém a data de regularização +COUPDAYSNC = CUPDIASPRÓX ## Devolve o número de dias entre a data de regularização e a data do cupão seguinte +COUPNCD = CUPDATAPRÓX ## Devolve a data do cupão seguinte após a data de regularização +COUPNUM = CUPNÚM ## Devolve o número de cupões a serem pagos entre a data de regularização e a data de vencimento +COUPPCD = CUPDATAANT ## Devolve a data do cupão anterior antes da data de regularização +CUMIPMT = PGTOJURACUM ## Devolve os juros cumulativos pagos entre dois períodos +CUMPRINC = PGTOCAPACUM ## Devolve o capital cumulativo pago a título de empréstimo entre dois períodos +DB = BD ## Devolve a depreciação de um activo relativo a um período especificado utilizando o método das quotas degressivas fixas +DDB = BDD ## Devolve a depreciação de um activo relativo a um período especificado utilizando o método das quotas degressivas duplas ou qualquer outro método especificado +DISC = DESC ## Devolve a taxa de desconto de um título +DOLLARDE = MOEDADEC ## Converte um preço em unidade monetária, expresso como uma fracção, num preço em unidade monetária, expresso como um número decimal +DOLLARFR = MOEDAFRA ## Converte um preço em unidade monetária, expresso como um número decimal, num preço em unidade monetária, expresso como uma fracção +DURATION = DURAÇÃO ## Devolve a duração anual de um título com pagamentos de juros periódicos +EFFECT = EFECTIVA ## Devolve a taxa de juros anual efectiva +FV = VF ## Devolve o valor futuro de um investimento +FVSCHEDULE = VFPLANO ## Devolve o valor futuro de um capital inicial após a aplicação de uma série de taxas de juro compostas +INTRATE = TAXAJUROS ## Devolve a taxa de juros de um título investido na totalidade +IPMT = IPGTO ## Devolve o pagamento dos juros de um investimento durante um determinado período +IRR = TIR ## Devolve a taxa de rentabilidade interna para uma série de fluxos monetários +ISPMT = É.PGTO ## Calcula os juros pagos durante um período específico de um investimento +MDURATION = MDURAÇÃO ## Devolve a duração modificada de Macauley de um título com um valor de paridade equivalente a € 100 +MIRR = MTIR ## Devolve a taxa interna de rentabilidade em que os fluxos monetários positivos e negativos são financiados com taxas diferentes +NOMINAL = NOMINAL ## Devolve a taxa de juros nominal anual +NPER = NPER ## Devolve o número de períodos de um investimento +NPV = VAL ## Devolve o valor actual líquido de um investimento com base numa série de fluxos monetários periódicos e numa taxa de desconto +ODDFPRICE = PREÇOPRIMINC ## Devolve o preço por € 100 do valor nominal de um título com um período inicial incompleto +ODDFYIELD = LUCROPRIMINC ## Devolve o lucro de um título com um período inicial incompleto +ODDLPRICE = PREÇOÚLTINC ## Devolve o preço por € 100 do valor nominal de um título com um período final incompleto +ODDLYIELD = LUCROÚLTINC ## Devolve o lucro de um título com um período final incompleto +PMT = PGTO ## Devolve o pagamento periódico de uma anuidade +PPMT = PPGTO ## Devolve o pagamento sobre o capital de um investimento num determinado período +PRICE = PREÇO ## Devolve o preço por € 100 do valor nominal de um título que paga juros periódicos +PRICEDISC = PREÇODESC ## Devolve o preço por € 100 do valor nominal de um título descontado +PRICEMAT = PREÇOVENC ## Devolve o preço por € 100 do valor nominal de um título que paga juros no vencimento +PV = VA ## Devolve o valor actual de um investimento +RATE = TAXA ## Devolve a taxa de juros por período de uma anuidade +RECEIVED = RECEBER ## Devolve o montante recebido no vencimento de um título investido na totalidade +SLN = AMORT ## Devolve uma depreciação linear de um activo durante um período +SYD = AMORTD ## Devolve a depreciação por algarismos da soma dos anos de um activo durante um período especificado +TBILLEQ = OTN ## Devolve o lucro de um título equivalente a uma Obrigação do Tesouro +TBILLPRICE = OTNVALOR ## Devolve o preço por € 100 de valor nominal de uma Obrigação do Tesouro +TBILLYIELD = OTNLUCRO ## Devolve o lucro de uma Obrigação do Tesouro +VDB = BDV ## Devolve a depreciação de um activo relativo a um período específico ou parcial utilizando um método de quotas degressivas +XIRR = XTIR ## Devolve a taxa interna de rentabilidade de um plano de fluxos monetários que não seja necessariamente periódica +XNPV = XVAL ## Devolve o valor actual líquido de um plano de fluxos monetários que não seja necessariamente periódico +YIELD = LUCRO ## Devolve o lucro de um título que paga juros periódicos +YIELDDISC = LUCRODESC ## Devolve o lucro anual de um título emitido abaixo do valor nominal, por exemplo, uma Obrigação do Tesouro +YIELDMAT = LUCROVENC ## Devolve o lucro anual de um título que paga juros na data de vencimento + + +## +## Information functions Funções de informação +## +CELL = CÉL ## Devolve informações sobre a formatação, localização ou conteúdo de uma célula +ERROR.TYPE = TIPO.ERRO ## Devolve um número correspondente a um tipo de erro +INFO = INFORMAÇÃO ## Devolve informações sobre o ambiente de funcionamento actual +ISBLANK = É.CÉL.VAZIA ## Devolve VERDADEIRO se o valor estiver em branco +ISERR = É.ERROS ## Devolve VERDADEIRO se o valor for um valor de erro diferente de #N/D +ISERROR = É.ERRO ## Devolve VERDADEIRO se o valor for um valor de erro +ISEVEN = ÉPAR ## Devolve VERDADEIRO se o número for par +ISLOGICAL = É.LÓGICO ## Devolve VERDADEIRO se o valor for lógico +ISNA = É.NÃO.DISP ## Devolve VERDADEIRO se o valor for o valor de erro #N/D +ISNONTEXT = É.NÃO.TEXTO ## Devolve VERDADEIRO se o valor não for texto +ISNUMBER = É.NÚM ## Devolve VERDADEIRO se o valor for um número +ISODD = ÉÍMPAR ## Devolve VERDADEIRO se o número for ímpar +ISREF = É.REF ## Devolve VERDADEIRO se o valor for uma referência +ISTEXT = É.TEXTO ## Devolve VERDADEIRO se o valor for texto +N = N ## Devolve um valor convertido num número +NA = NÃO.DISP ## Devolve o valor de erro #N/D +TYPE = TIPO ## Devolve um número que indica o tipo de dados de um valor + + +## +## Logical functions Funções lógicas +## +AND = E ## Devolve VERDADEIRO se todos os respectivos argumentos corresponderem a VERDADEIRO +FALSE = FALSO ## Devolve o valor lógico FALSO +IF = SE ## Especifica um teste lógico a ser executado +IFERROR = SE.ERRO ## Devolve um valor definido pelo utilizador se ocorrer um erro na fórmula, e devolve o resultado da fórmula se não ocorrer nenhum erro +NOT = NÃO ## Inverte a lógica do respectivo argumento +OR = OU ## Devolve VERDADEIRO se qualquer argumento for VERDADEIRO +TRUE = VERDADEIRO ## Devolve o valor lógico VERDADEIRO + + +## +## Lookup and reference functions Funções de pesquisa e referência +## +ADDRESS = ENDEREÇO ## Devolve uma referência a uma única célula numa folha de cálculo como texto +AREAS = ÁREAS ## Devolve o número de áreas numa referência +CHOOSE = SELECCIONAR ## Selecciona um valor a partir de uma lista de valores +COLUMN = COL ## Devolve o número da coluna de uma referência +COLUMNS = COLS ## Devolve o número de colunas numa referência +HLOOKUP = PROCH ## Procura na linha superior de uma matriz e devolve o valor da célula indicada +HYPERLINK = HIPERLIGAÇÃO ## Cria um atalho ou hiperligação que abre um documento armazenado num servidor de rede, numa intranet ou na Internet +INDEX = ÍNDICE ## Utiliza um índice para escolher um valor de uma referência ou de uma matriz +INDIRECT = INDIRECTO ## Devolve uma referência indicada por um valor de texto +LOOKUP = PROC ## Procura valores num vector ou numa matriz +MATCH = CORRESP ## Procura valores numa referência ou numa matriz +OFFSET = DESLOCAMENTO ## Devolve o deslocamento de referência de uma determinada referência +ROW = LIN ## Devolve o número da linha de uma referência +ROWS = LINS ## Devolve o número de linhas numa referência +RTD = RTD ## Obtém dados em tempo real a partir de um programa que suporte automatização COM (automatização: modo de trabalhar com objectos de uma aplicação a partir de outra aplicação ou ferramenta de desenvolvimento. Anteriormente conhecida como automatização OLE, a automatização é uma norma da indústria de software e uma funcionalidade COM (Component Object Model).) +TRANSPOSE = TRANSPOR ## Devolve a transposição de uma matriz +VLOOKUP = PROCV ## Procura na primeira coluna de uma matriz e percorre a linha para devolver o valor de uma célula + + +## +## Math and trigonometry functions Funções matemáticas e trigonométricas +## +ABS = ABS ## Devolve o valor absoluto de um número +ACOS = ACOS ## Devolve o arco de co-seno de um número +ACOSH = ACOSH ## Devolve o co-seno hiperbólico inverso de um número +ASIN = ASEN ## Devolve o arco de seno de um número +ASINH = ASENH ## Devolve o seno hiperbólico inverso de um número +ATAN = ATAN ## Devolve o arco de tangente de um número +ATAN2 = ATAN2 ## Devolve o arco de tangente das coordenadas x e y +ATANH = ATANH ## Devolve a tangente hiperbólica inversa de um número +CEILING = ARRED.EXCESSO ## Arredonda um número para o número inteiro mais próximo ou para o múltiplo de significância mais próximo +COMBIN = COMBIN ## Devolve o número de combinações de um determinado número de objectos +COS = COS ## Devolve o co-seno de um número +COSH = COSH ## Devolve o co-seno hiperbólico de um número +DEGREES = GRAUS ## Converte radianos em graus +EVEN = PAR ## Arredonda um número por excesso para o número inteiro mais próximo +EXP = EXP ## Devolve e elevado à potência de um determinado número +FACT = FACTORIAL ## Devolve o factorial de um número +FACTDOUBLE = FACTDUPLO ## Devolve o factorial duplo de um número +FLOOR = ARRED.DEFEITO ## Arredonda um número por defeito até zero +GCD = MDC ## Devolve o maior divisor comum +INT = INT ## Arredonda um número por defeito para o número inteiro mais próximo +LCM = MMC ## Devolve o mínimo múltiplo comum +LN = LN ## Devolve o logaritmo natural de um número +LOG = LOG ## Devolve o logaritmo de um número com uma base especificada +LOG10 = LOG10 ## Devolve o logaritmo de base 10 de um número +MDETERM = MATRIZ.DETERM ## Devolve o determinante matricial de uma matriz +MINVERSE = MATRIZ.INVERSA ## Devolve o inverso matricial de uma matriz +MMULT = MATRIZ.MULT ## Devolve o produto matricial de duas matrizes +MOD = RESTO ## Devolve o resto da divisão +MROUND = MARRED ## Devolve um número arredondado para o múltiplo pretendido +MULTINOMIAL = POLINOMIAL ## Devolve o polinomial de um conjunto de números +ODD = ÍMPAR ## Arredonda por excesso um número para o número inteiro ímpar mais próximo +PI = PI ## Devolve o valor de pi +POWER = POTÊNCIA ## Devolve o resultado de um número elevado a uma potência +PRODUCT = PRODUTO ## Multiplica os respectivos argumentos +QUOTIENT = QUOCIENTE ## Devolve a parte inteira de uma divisão +RADIANS = RADIANOS ## Converte graus em radianos +RAND = ALEATÓRIO ## Devolve um número aleatório entre 0 e 1 +RANDBETWEEN = ALEATÓRIOENTRE ## Devolve um número aleatório entre os números especificados +ROMAN = ROMANO ## Converte um número árabe em romano, como texto +ROUND = ARRED ## Arredonda um número para um número de dígitos especificado +ROUNDDOWN = ARRED.PARA.BAIXO ## Arredonda um número por defeito até zero +ROUNDUP = ARRED.PARA.CIMA ## Arredonda um número por excesso, afastando-o de zero +SERIESSUM = SOMASÉRIE ## Devolve a soma de uma série de potências baseada na fórmula +SIGN = SINAL ## Devolve o sinal de um número +SIN = SEN ## Devolve o seno de um determinado ângulo +SINH = SENH ## Devolve o seno hiperbólico de um número +SQRT = RAIZQ ## Devolve uma raiz quadrada positiva +SQRTPI = RAIZPI ## Devolve a raiz quadrada de (núm * pi) +SUBTOTAL = SUBTOTAL ## Devolve um subtotal numa lista ou base de dados +SUM = SOMA ## Adiciona os respectivos argumentos +SUMIF = SOMA.SE ## Adiciona as células especificadas por um determinado critério +SUMIFS = SOMA.SE.S ## Adiciona as células num intervalo que cumpre vários critérios +SUMPRODUCT = SOMARPRODUTO ## Devolve a soma dos produtos de componentes de matrizes correspondentes +SUMSQ = SOMARQUAD ## Devolve a soma dos quadrados dos argumentos +SUMX2MY2 = SOMAX2DY2 ## Devolve a soma da diferença dos quadrados dos valores correspondentes em duas matrizes +SUMX2PY2 = SOMAX2SY2 ## Devolve a soma da soma dos quadrados dos valores correspondentes em duas matrizes +SUMXMY2 = SOMAXMY2 ## Devolve a soma dos quadrados da diferença dos valores correspondentes em duas matrizes +TAN = TAN ## Devolve a tangente de um número +TANH = TANH ## Devolve a tangente hiperbólica de um número +TRUNC = TRUNCAR ## Trunca um número para um número inteiro + + +## +## Statistical functions Funções estatísticas +## +AVEDEV = DESV.MÉDIO ## Devolve a média aritmética dos desvios absolutos à média dos pontos de dados +AVERAGE = MÉDIA ## Devolve a média dos respectivos argumentos +AVERAGEA = MÉDIAA ## Devolve uma média dos respectivos argumentos, incluindo números, texto e valores lógicos +AVERAGEIF = MÉDIA.SE ## Devolve a média aritmética de todas as células num intervalo que cumprem determinado critério +AVERAGEIFS = MÉDIA.SE.S ## Devolve a média aritmética de todas as células que cumprem múltiplos critérios +BETADIST = DISTBETA ## Devolve a função de distribuição cumulativa beta +BETAINV = BETA.ACUM.INV ## Devolve o inverso da função de distribuição cumulativa relativamente a uma distribuição beta específica +BINOMDIST = DISTRBINOM ## Devolve a probabilidade de distribuição binomial de termo individual +CHIDIST = DIST.CHI ## Devolve a probabilidade unicaudal da distribuição qui-quadrada +CHIINV = INV.CHI ## Devolve o inverso da probabilidade unicaudal da distribuição qui-quadrada +CHITEST = TESTE.CHI ## Devolve o teste para independência +CONFIDENCE = INT.CONFIANÇA ## Devolve o intervalo de confiança correspondente a uma média de população +CORREL = CORREL ## Devolve o coeficiente de correlação entre dois conjuntos de dados +COUNT = CONTAR ## Conta os números que existem na lista de argumentos +COUNTA = CONTAR.VAL ## Conta os valores que existem na lista de argumentos +COUNTBLANK = CONTAR.VAZIO ## Conta o número de células em branco num intervalo +COUNTIF = CONTAR.SE ## Calcula o número de células num intervalo que corresponde aos critérios determinados +COUNTIFS = CONTAR.SE.S ## Conta o número de células num intervalo que cumprem múltiplos critérios +COVAR = COVAR ## Devolve a covariância, que é a média dos produtos de desvios de pares +CRITBINOM = CRIT.BINOM ## Devolve o menor valor em que a distribuição binomial cumulativa é inferior ou igual a um valor de critério +DEVSQ = DESVQ ## Devolve a soma dos quadrados dos desvios +EXPONDIST = DISTEXPON ## Devolve a distribuição exponencial +FDIST = DISTF ## Devolve a distribuição da probabilidade F +FINV = INVF ## Devolve o inverso da distribuição da probabilidade F +FISHER = FISHER ## Devolve a transformação Fisher +FISHERINV = FISHERINV ## Devolve o inverso da transformação Fisher +FORECAST = PREVISÃO ## Devolve um valor ao longo de uma tendência linear +FREQUENCY = FREQUÊNCIA ## Devolve uma distribuição de frequência como uma matriz vertical +FTEST = TESTEF ## Devolve o resultado de um teste F +GAMMADIST = DISTGAMA ## Devolve a distribuição gama +GAMMAINV = INVGAMA ## Devolve o inverso da distribuição gama cumulativa +GAMMALN = LNGAMA ## Devolve o logaritmo natural da função gama, Γ(x) +GEOMEAN = MÉDIA.GEOMÉTRICA ## Devolve a média geométrica +GROWTH = CRESCIMENTO ## Devolve valores ao longo de uma tendência exponencial +HARMEAN = MÉDIA.HARMÓNICA ## Devolve a média harmónica +HYPGEOMDIST = DIST.HIPERGEOM ## Devolve a distribuição hipergeométrica +INTERCEPT = INTERCEPTAR ## Devolve a intercepção da linha de regressão linear +KURT = CURT ## Devolve a curtose de um conjunto de dados +LARGE = MAIOR ## Devolve o maior valor k-ésimo de um conjunto de dados +LINEST = PROJ.LIN ## Devolve os parâmetros de uma tendência linear +LOGEST = PROJ.LOG ## Devolve os parâmetros de uma tendência exponencial +LOGINV = INVLOG ## Devolve o inverso da distribuição normal logarítmica +LOGNORMDIST = DIST.NORMALLOG ## Devolve a distribuição normal logarítmica cumulativa +MAX = MÁXIMO ## Devolve o valor máximo numa lista de argumentos +MAXA = MÁXIMOA ## Devolve o valor máximo numa lista de argumentos, incluindo números, texto e valores lógicos +MEDIAN = MED ## Devolve a mediana dos números indicados +MIN = MÍNIMO ## Devolve o valor mínimo numa lista de argumentos +MINA = MÍNIMOA ## Devolve o valor mínimo numa lista de argumentos, incluindo números, texto e valores lógicos +MODE = MODA ## Devolve o valor mais comum num conjunto de dados +NEGBINOMDIST = DIST.BIN.NEG ## Devolve a distribuição binominal negativa +NORMDIST = DIST.NORM ## Devolve a distribuição cumulativa normal +NORMINV = INV.NORM ## Devolve o inverso da distribuição cumulativa normal +NORMSDIST = DIST.NORMP ## Devolve a distribuição cumulativa normal padrão +NORMSINV = INV.NORMP ## Devolve o inverso da distribuição cumulativa normal padrão +PEARSON = PEARSON ## Devolve o coeficiente de correlação momento/produto de Pearson +PERCENTILE = PERCENTIL ## Devolve o k-ésimo percentil de valores num intervalo +PERCENTRANK = ORDEM.PERCENTUAL ## Devolve a ordem percentual de um valor num conjunto de dados +PERMUT = PERMUTAR ## Devolve o número de permutações de um determinado número de objectos +POISSON = POISSON ## Devolve a distribuição de Poisson +PROB = PROB ## Devolve a probabilidade dos valores num intervalo se encontrarem entre dois limites +QUARTILE = QUARTIL ## Devolve o quartil de um conjunto de dados +RANK = ORDEM ## Devolve a ordem de um número numa lista numérica +RSQ = RQUAD ## Devolve o quadrado do coeficiente de correlação momento/produto de Pearson +SKEW = DISTORÇÃO ## Devolve a distorção de uma distribuição +SLOPE = DECLIVE ## Devolve o declive da linha de regressão linear +SMALL = MENOR ## Devolve o menor valor de k-ésimo de um conjunto de dados +STANDARDIZE = NORMALIZAR ## Devolve um valor normalizado +STDEV = DESVPAD ## Calcula o desvio-padrão com base numa amostra +STDEVA = DESVPADA ## Calcula o desvio-padrão com base numa amostra, incluindo números, texto e valores lógicos +STDEVP = DESVPADP ## Calcula o desvio-padrão com base na população total +STDEVPA = DESVPADPA ## Calcula o desvio-padrão com base na população total, incluindo números, texto e valores lógicos +STEYX = EPADYX ## Devolve o erro-padrão do valor de y previsto para cada x na regressão +TDIST = DISTT ## Devolve a distribuição t de Student +TINV = INVT ## Devolve o inverso da distribuição t de Student +TREND = TENDÊNCIA ## Devolve valores ao longo de uma tendência linear +TRIMMEAN = MÉDIA.INTERNA ## Devolve a média do interior de um conjunto de dados +TTEST = TESTET ## Devolve a probabilidade associada ao teste t de Student +VAR = VAR ## Calcula a variância com base numa amostra +VARA = VARA ## Calcula a variância com base numa amostra, incluindo números, texto e valores lógicos +VARP = VARP ## Calcula a variância com base na população total +VARPA = VARPA ## Calcula a variância com base na população total, incluindo números, texto e valores lógicos +WEIBULL = WEIBULL ## Devolve a distribuição Weibull +ZTEST = TESTEZ ## Devolve o valor de probabilidade unicaudal de um teste-z + + +## +## Text functions Funções de texto +## +ASC = ASC ## Altera letras ou katakana de largura total (byte duplo) numa cadeia de caracteres para caracteres de largura média (byte único) +BAHTTEXT = TEXTO.BAHT ## Converte um número em texto, utilizando o formato monetário ß (baht) +CHAR = CARÁCT ## Devolve o carácter especificado pelo número de código +CLEAN = LIMPAR ## Remove do texto todos os caracteres não imprimíveis +CODE = CÓDIGO ## Devolve um código numérico correspondente ao primeiro carácter numa cadeia de texto +CONCATENATE = CONCATENAR ## Agrupa vários itens de texto num único item de texto +DOLLAR = MOEDA ## Converte um número em texto, utilizando o formato monetário € (Euro) +EXACT = EXACTO ## Verifica se dois valores de texto são idênticos +FIND = LOCALIZAR ## Localiza um valor de texto dentro de outro (sensível às maiúsculas e minúsculas) +FINDB = LOCALIZARB ## Localiza um valor de texto dentro de outro (sensível às maiúsculas e minúsculas) +FIXED = FIXA ## Formata um número como texto com um número fixo de decimais +JIS = JIS ## Altera letras ou katakana de largura média (byte único) numa cadeia de caracteres para caracteres de largura total (byte duplo) +LEFT = ESQUERDA ## Devolve os caracteres mais à esquerda de um valor de texto +LEFTB = ESQUERDAB ## Devolve os caracteres mais à esquerda de um valor de texto +LEN = NÚM.CARACT ## Devolve o número de caracteres de uma cadeia de texto +LENB = NÚM.CARACTB ## Devolve o número de caracteres de uma cadeia de texto +LOWER = MINÚSCULAS ## Converte o texto em minúsculas +MID = SEG.TEXTO ## Devolve um número específico de caracteres de uma cadeia de texto, a partir da posição especificada +MIDB = SEG.TEXTOB ## Devolve um número específico de caracteres de uma cadeia de texto, a partir da posição especificada +PHONETIC = FONÉTICA ## Retira os caracteres fonéticos (furigana) de uma cadeia de texto +PROPER = INICIAL.MAIÚSCULA ## Coloca em maiúsculas a primeira letra de cada palavra de um valor de texto +REPLACE = SUBSTITUIR ## Substitui caracteres no texto +REPLACEB = SUBSTITUIRB ## Substitui caracteres no texto +REPT = REPETIR ## Repete texto um determinado número de vezes +RIGHT = DIREITA ## Devolve os caracteres mais à direita de um valor de texto +RIGHTB = DIREITAB ## Devolve os caracteres mais à direita de um valor de texto +SEARCH = PROCURAR ## Localiza um valor de texto dentro de outro (não sensível a maiúsculas e minúsculas) +SEARCHB = PROCURARB ## Localiza um valor de texto dentro de outro (não sensível a maiúsculas e minúsculas) +SUBSTITUTE = SUBST ## Substitui texto novo por texto antigo numa cadeia de texto +T = T ## Converte os respectivos argumentos em texto +TEXT = TEXTO ## Formata um número e converte-o em texto +TRIM = COMPACTAR ## Remove espaços do texto +UPPER = MAIÚSCULAS ## Converte texto em maiúsculas +VALUE = VALOR ## Converte um argumento de texto num número diff --git a/application/third_party/PHPExcel/PHPExcel/locale/ru/config b/application/third_party/PHPExcel/PHPExcel/locale/ru/config new file mode 100644 index 0000000..56e45bf --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/ru/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = р + + +## +## Excel Error Codes (For future use) +## +NULL = #ПУСТО! +DIV0 = #ДЕЛ/0! +VALUE = #ЗНАЧ! +REF = #ССЫЛ! +NAME = #ИМЯ? +NUM = #ЧИСЛО! +NA = #Н/Д diff --git a/application/third_party/PHPExcel/PHPExcel/locale/ru/functions b/application/third_party/PHPExcel/PHPExcel/locale/ru/functions new file mode 100644 index 0000000..5ff6d4f --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/ru/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## Data in this file derived from information provided by web-junior (http://www.web-junior.net/) +## +## + + +## +## Add-in and Automation functions Функции надстроек и автоматизации +## +GETPIVOTDATA = ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ ## Возвращает данные, хранящиеся в отчете сводной таблицы. + + +## +## Cube functions Функции Куб +## +CUBEKPIMEMBER = КУБЭЛЕМЕНТКИП ## Возвращает свойство ключевого индикатора производительности «(КИП)» и отображает имя «КИП» в ячейке. «КИП» представляет собой количественную величину, такую как ежемесячная валовая прибыль или ежеквартальная текучесть кадров, используемой для контроля эффективности работы организации. +CUBEMEMBER = КУБЭЛЕМЕНТ ## Возвращает элемент или кортеж из куба. Используется для проверки существования элемента или кортежа в кубе. +CUBEMEMBERPROPERTY = КУБСВОЙСТВОЭЛЕМЕНТА ## Возвращает значение свойства элемента из куба. Используется для проверки существования имени элемента в кубе и возвращает указанное свойство для этого элемента. +CUBERANKEDMEMBER = КУБПОРЭЛЕМЕНТ ## Возвращает n-ый или ранжированный элемент в множество. Используется для возвращения одного или нескольких элементов в множество, например, лучшего продавца или 10 лучших студентов. +CUBESET = КУБМНОЖ ## Определяет вычислительное множество элементов или кортежей, отправляя на сервер выражение, которое создает множество, а затем возвращает его в Microsoft Office Excel. +CUBESETCOUNT = КУБЧИСЛОЭЛМНОЖ ## Возвращает число элементов множества. +CUBEVALUE = КУБЗНАЧЕНИЕ ## Возвращает обобщенное значение из куба. + + +## +## Database functions Функции для работы с базами данных +## +DAVERAGE = ДСРЗНАЧ ## Возвращает среднее значение выбранных записей базы данных. +DCOUNT = БСЧЁТ ## Подсчитывает количество числовых ячеек в базе данных. +DCOUNTA = БСЧЁТА ## Подсчитывает количество непустых ячеек в базе данных. +DGET = БИЗВЛЕЧЬ ## Извлекает из базы данных одну запись, удовлетворяющую заданному условию. +DMAX = ДМАКС ## Возвращает максимальное значение среди выделенных записей базы данных. +DMIN = ДМИН ## Возвращает минимальное значение среди выделенных записей базы данных. +DPRODUCT = БДПРОИЗВЕД ## Перемножает значения определенного поля в записях базы данных, удовлетворяющих условию. +DSTDEV = ДСТАНДОТКЛ ## Оценивает стандартное отклонение по выборке для выделенных записей базы данных. +DSTDEVP = ДСТАНДОТКЛП ## Вычисляет стандартное отклонение по генеральной совокупности для выделенных записей базы данных +DSUM = БДСУММ ## Суммирует числа в поле для записей базы данных, удовлетворяющих условию. +DVAR = БДДИСП ## Оценивает дисперсию по выборке из выделенных записей базы данных +DVARP = БДДИСПП ## Вычисляет дисперсию по генеральной совокупности для выделенных записей базы данных + + +## +## Date and time functions Функции даты и времени +## +DATE = ДАТА ## Возвращает заданную дату в числовом формате. +DATEVALUE = ДАТАЗНАЧ ## Преобразует дату из текстового формата в числовой формат. +DAY = ДЕНЬ ## Преобразует дату в числовом формате в день месяца. +DAYS360 = ДНЕЙ360 ## Вычисляет количество дней между двумя датами на основе 360-дневного года. +EDATE = ДАТАМЕС ## Возвращает дату в числовом формате, отстоящую на заданное число месяцев вперед или назад от начальной даты. +EOMONTH = КОНМЕСЯЦА ## Возвращает дату в числовом формате для последнего дня месяца, отстоящего вперед или назад на заданное число месяцев. +HOUR = ЧАС ## Преобразует дату в числовом формате в часы. +MINUTE = МИНУТЫ ## Преобразует дату в числовом формате в минуты. +MONTH = МЕСЯЦ ## Преобразует дату в числовом формате в месяцы. +NETWORKDAYS = ЧИСТРАБДНИ ## Возвращает количество рабочих дней между двумя датами. +NOW = ТДАТА ## Возвращает текущую дату и время в числовом формате. +SECOND = СЕКУНДЫ ## Преобразует дату в числовом формате в секунды. +TIME = ВРЕМЯ ## Возвращает заданное время в числовом формате. +TIMEVALUE = ВРЕМЗНАЧ ## Преобразует время из текстового формата в числовой формат. +TODAY = СЕГОДНЯ ## Возвращает текущую дату в числовом формате. +WEEKDAY = ДЕНЬНЕД ## Преобразует дату в числовом формате в день недели. +WEEKNUM = НОМНЕДЕЛИ ## Преобразует числовое представление в число, которое указывает, на какую неделю года приходится указанная дата. +WORKDAY = РАБДЕНЬ ## Возвращает дату в числовом формате, отстоящую вперед или назад на заданное количество рабочих дней. +YEAR = ГОД ## Преобразует дату в числовом формате в год. +YEARFRAC = ДОЛЯГОДА ## Возвращает долю года, которую составляет количество дней между начальной и конечной датами. + + +## +## Engineering functions Инженерные функции +## +BESSELI = БЕССЕЛЬ.I ## Возвращает модифицированную функцию Бесселя In(x). +BESSELJ = БЕССЕЛЬ.J ## Возвращает функцию Бесселя Jn(x). +BESSELK = БЕССЕЛЬ.K ## Возвращает модифицированную функцию Бесселя Kn(x). +BESSELY = БЕССЕЛЬ.Y ## Возвращает функцию Бесселя Yn(x). +BIN2DEC = ДВ.В.ДЕС ## Преобразует двоичное число в десятичное. +BIN2HEX = ДВ.В.ШЕСТН ## Преобразует двоичное число в шестнадцатеричное. +BIN2OCT = ДВ.В.ВОСЬМ ## Преобразует двоичное число в восьмеричное. +COMPLEX = КОМПЛЕКСН ## Преобразует коэффициенты при вещественной и мнимой частях комплексного числа в комплексное число. +CONVERT = ПРЕОБР ## Преобразует число из одной системы единиц измерения в другую. +DEC2BIN = ДЕС.В.ДВ ## Преобразует десятичное число в двоичное. +DEC2HEX = ДЕС.В.ШЕСТН ## Преобразует десятичное число в шестнадцатеричное. +DEC2OCT = ДЕС.В.ВОСЬМ ## Преобразует десятичное число в восьмеричное. +DELTA = ДЕЛЬТА ## Проверяет равенство двух значений. +ERF = ФОШ ## Возвращает функцию ошибки. +ERFC = ДФОШ ## Возвращает дополнительную функцию ошибки. +GESTEP = ПОРОГ ## Проверяет, не превышает ли данное число порогового значения. +HEX2BIN = ШЕСТН.В.ДВ ## Преобразует шестнадцатеричное число в двоичное. +HEX2DEC = ШЕСТН.В.ДЕС ## Преобразует шестнадцатеричное число в десятичное. +HEX2OCT = ШЕСТН.В.ВОСЬМ ## Преобразует шестнадцатеричное число в восьмеричное. +IMABS = МНИМ.ABS ## Возвращает абсолютную величину (модуль) комплексного числа. +IMAGINARY = МНИМ.ЧАСТЬ ## Возвращает коэффициент при мнимой части комплексного числа. +IMARGUMENT = МНИМ.АРГУМЕНТ ## Возвращает значение аргумента комплексного числа (тета) — угол, выраженный в радианах. +IMCONJUGATE = МНИМ.СОПРЯЖ ## Возвращает комплексно-сопряженное комплексное число. +IMCOS = МНИМ.COS ## Возвращает косинус комплексного числа. +IMDIV = МНИМ.ДЕЛ ## Возвращает частное от деления двух комплексных чисел. +IMEXP = МНИМ.EXP ## Возвращает экспоненту комплексного числа. +IMLN = МНИМ.LN ## Возвращает натуральный логарифм комплексного числа. +IMLOG10 = МНИМ.LOG10 ## Возвращает обычный (десятичный) логарифм комплексного числа. +IMLOG2 = МНИМ.LOG2 ## Возвращает двоичный логарифм комплексного числа. +IMPOWER = МНИМ.СТЕПЕНЬ ## Возвращает комплексное число, возведенное в целую степень. +IMPRODUCT = МНИМ.ПРОИЗВЕД ## Возвращает произведение от 2 до 29 комплексных чисел. +IMREAL = МНИМ.ВЕЩ ## Возвращает коэффициент при вещественной части комплексного числа. +IMSIN = МНИМ.SIN ## Возвращает синус комплексного числа. +IMSQRT = МНИМ.КОРЕНЬ ## Возвращает значение квадратного корня из комплексного числа. +IMSUB = МНИМ.РАЗН ## Возвращает разность двух комплексных чисел. +IMSUM = МНИМ.СУММ ## Возвращает сумму комплексных чисел. +OCT2BIN = ВОСЬМ.В.ДВ ## Преобразует восьмеричное число в двоичное. +OCT2DEC = ВОСЬМ.В.ДЕС ## Преобразует восьмеричное число в десятичное. +OCT2HEX = ВОСЬМ.В.ШЕСТН ## Преобразует восьмеричное число в шестнадцатеричное. + + +## +## Financial functions Финансовые функции +## +ACCRINT = НАКОПДОХОД ## Возвращает накопленный процент по ценным бумагам с периодической выплатой процентов. +ACCRINTM = НАКОПДОХОДПОГАШ ## Возвращает накопленный процент по ценным бумагам, проценты по которым выплачиваются в срок погашения. +AMORDEGRC = АМОРУМ ## Возвращает величину амортизации для каждого периода, используя коэффициент амортизации. +AMORLINC = АМОРУВ ## Возвращает величину амортизации для каждого периода. +COUPDAYBS = ДНЕЙКУПОНДО ## Возвращает количество дней от начала действия купона до даты соглашения. +COUPDAYS = ДНЕЙКУПОН ## Возвращает число дней в периоде купона, содержащем дату соглашения. +COUPDAYSNC = ДНЕЙКУПОНПОСЛЕ ## Возвращает число дней от даты соглашения до срока следующего купона. +COUPNCD = ДАТАКУПОНПОСЛЕ ## Возвращает следующую дату купона после даты соглашения. +COUPNUM = ЧИСЛКУПОН ## Возвращает количество купонов, которые могут быть оплачены между датой соглашения и сроком вступления в силу. +COUPPCD = ДАТАКУПОНДО ## Возвращает предыдущую дату купона перед датой соглашения. +CUMIPMT = ОБЩПЛАТ ## Возвращает общую выплату, произведенную между двумя периодическими выплатами. +CUMPRINC = ОБЩДОХОД ## Возвращает общую выплату по займу между двумя периодами. +DB = ФУО ## Возвращает величину амортизации актива для заданного периода, рассчитанную методом фиксированного уменьшения остатка. +DDB = ДДОБ ## Возвращает величину амортизации актива за данный период, используя метод двойного уменьшения остатка или иной явно указанный метод. +DISC = СКИДКА ## Возвращает норму скидки для ценных бумаг. +DOLLARDE = РУБЛЬ.ДЕС ## Преобразует цену в рублях, выраженную в виде дроби, в цену в рублях, выраженную десятичным числом. +DOLLARFR = РУБЛЬ.ДРОБЬ ## Преобразует цену в рублях, выраженную десятичным числом, в цену в рублях, выраженную в виде дроби. +DURATION = ДЛИТ ## Возвращает ежегодную продолжительность действия ценных бумаг с периодическими выплатами по процентам. +EFFECT = ЭФФЕКТ ## Возвращает действующие ежегодные процентные ставки. +FV = БС ## Возвращает будущую стоимость инвестиции. +FVSCHEDULE = БЗРАСПИС ## Возвращает будущую стоимость первоначальной основной суммы после начисления ряда сложных процентов. +INTRATE = ИНОРМА ## Возвращает процентную ставку для полностью инвестированных ценных бумаг. +IPMT = ПРПЛТ ## Возвращает величину выплаты прибыли на вложения за данный период. +IRR = ВСД ## Возвращает внутреннюю ставку доходности для ряда потоков денежных средств. +ISPMT = ПРОЦПЛАТ ## Вычисляет выплаты за указанный период инвестиции. +MDURATION = МДЛИТ ## Возвращает модифицированную длительность Маколея для ценных бумаг с предполагаемой номинальной стоимостью 100 рублей. +MIRR = МВСД ## Возвращает внутреннюю ставку доходности, при которой положительные и отрицательные денежные потоки имеют разные значения ставки. +NOMINAL = НОМИНАЛ ## Возвращает номинальную годовую процентную ставку. +NPER = КПЕР ## Возвращает общее количество периодов выплаты для данного вклада. +NPV = ЧПС ## Возвращает чистую приведенную стоимость инвестиции, основанной на серии периодических денежных потоков и ставке дисконтирования. +ODDFPRICE = ЦЕНАПЕРВНЕРЕГ ## Возвращает цену за 100 рублей нарицательной стоимости ценных бумаг с нерегулярным первым периодом. +ODDFYIELD = ДОХОДПЕРВНЕРЕГ ## Возвращает доход по ценным бумагам с нерегулярным первым периодом. +ODDLPRICE = ЦЕНАПОСЛНЕРЕГ ## Возвращает цену за 100 рублей нарицательной стоимости ценных бумаг с нерегулярным последним периодом. +ODDLYIELD = ДОХОДПОСЛНЕРЕГ ## Возвращает доход по ценным бумагам с нерегулярным последним периодом. +PMT = ПЛТ ## Возвращает величину выплаты за один период аннуитета. +PPMT = ОСПЛТ ## Возвращает величину выплат в погашение основной суммы по инвестиции за заданный период. +PRICE = ЦЕНА ## Возвращает цену за 100 рублей нарицательной стоимости ценных бумаг, по которым производится периодическая выплата процентов. +PRICEDISC = ЦЕНАСКИДКА ## Возвращает цену за 100 рублей номинальной стоимости ценных бумаг, на которые сделана скидка. +PRICEMAT = ЦЕНАПОГАШ ## Возвращает цену за 100 рублей номинальной стоимости ценных бумаг, проценты по которым выплачиваются в срок погашения. +PV = ПС ## Возвращает приведенную (к текущему моменту) стоимость инвестиции. +RATE = СТАВКА ## Возвращает процентную ставку по аннуитету за один период. +RECEIVED = ПОЛУЧЕНО ## Возвращает сумму, полученную к сроку погашения полностью обеспеченных ценных бумаг. +SLN = АПЛ ## Возвращает величину линейной амортизации актива за один период. +SYD = АСЧ ## Возвращает величину амортизации актива за данный период, рассчитанную методом суммы годовых чисел. +TBILLEQ = РАВНОКЧЕК ## Возвращает эквивалентный облигации доход по казначейскому чеку. +TBILLPRICE = ЦЕНАКЧЕК ## Возвращает цену за 100 рублей нарицательной стоимости для казначейского чека. +TBILLYIELD = ДОХОДКЧЕК ## Возвращает доход по казначейскому чеку. +VDB = ПУО ## Возвращает величину амортизации актива для указанного или частичного периода при использовании метода сокращающегося баланса. +XIRR = ЧИСТВНДОХ ## Возвращает внутреннюю ставку доходности для графика денежных потоков, которые не обязательно носят периодический характер. +XNPV = ЧИСТНЗ ## Возвращает чистую приведенную стоимость для денежных потоков, которые не обязательно являются периодическими. +YIELD = ДОХОД ## Возвращает доход от ценных бумаг, по которым производятся периодические выплаты процентов. +YIELDDISC = ДОХОДСКИДКА ## Возвращает годовой доход по ценным бумагам, на которые сделана скидка (пример — казначейские чеки). +YIELDMAT = ДОХОДПОГАШ ## Возвращает годовой доход от ценных бумаг, проценты по которым выплачиваются в срок погашения. + + +## +## Information functions Информационные функции +## +CELL = ЯЧЕЙКА ## Возвращает информацию о формате, расположении или содержимом ячейки. +ERROR.TYPE = ТИП.ОШИБКИ ## Возвращает числовой код, соответствующий типу ошибки. +INFO = ИНФОРМ ## Возвращает информацию о текущей операционной среде. +ISBLANK = ЕПУСТО ## Возвращает значение ИСТИНА, если аргумент является ссылкой на пустую ячейку. +ISERR = ЕОШ ## Возвращает значение ИСТИНА, если аргумент ссылается на любое значение ошибки, кроме #Н/Д. +ISERROR = ЕОШИБКА ## Возвращает значение ИСТИНА, если аргумент ссылается на любое значение ошибки. +ISEVEN = ЕЧЁТН ## Возвращает значение ИСТИНА, если значение аргумента является четным числом. +ISLOGICAL = ЕЛОГИЧ ## Возвращает значение ИСТИНА, если аргумент ссылается на логическое значение. +ISNA = ЕНД ## Возвращает значение ИСТИНА, если аргумент ссылается на значение ошибки #Н/Д. +ISNONTEXT = ЕНЕТЕКСТ ## Возвращает значение ИСТИНА, если значение аргумента не является текстом. +ISNUMBER = ЕЧИСЛО ## Возвращает значение ИСТИНА, если аргумент ссылается на число. +ISODD = ЕНЕЧЁТ ## Возвращает значение ИСТИНА, если значение аргумента является нечетным числом. +ISREF = ЕССЫЛКА ## Возвращает значение ИСТИНА, если значение аргумента является ссылкой. +ISTEXT = ЕТЕКСТ ## Возвращает значение ИСТИНА, если значение аргумента является текстом. +N = Ч ## Возвращает значение, преобразованное в число. +NA = НД ## Возвращает значение ошибки #Н/Д. +TYPE = ТИП ## Возвращает число, обозначающее тип данных значения. + + +## +## Logical functions Логические функции +## +AND = И ## Renvoie VRAI si tous ses arguments sont VRAI. +FALSE = ЛОЖЬ ## Возвращает логическое значение ЛОЖЬ. +IF = ЕСЛИ ## Выполняет проверку условия. +IFERROR = ЕСЛИОШИБКА ## Возвращает введённое значение, если вычисление по формуле вызывает ошибку; в противном случае функция возвращает результат вычисления. +NOT = НЕ ## Меняет логическое значение своего аргумента на противоположное. +OR = ИЛИ ## Возвращает значение ИСТИНА, если хотя бы один аргумент имеет значение ИСТИНА. +TRUE = ИСТИНА ## Возвращает логическое значение ИСТИНА. + + +## +## Lookup and reference functions Функции ссылки и поиска +## +ADDRESS = АДРЕС ## Возвращает ссылку на отдельную ячейку листа в виде текста. +AREAS = ОБЛАСТИ ## Возвращает количество областей в ссылке. +CHOOSE = ВЫБОР ## Выбирает значение из списка значений по индексу. +COLUMN = СТОЛБЕЦ ## Возвращает номер столбца, на который указывает ссылка. +COLUMNS = ЧИСЛСТОЛБ ## Возвращает количество столбцов в ссылке. +HLOOKUP = ГПР ## Ищет в первой строке массива и возвращает значение отмеченной ячейки +HYPERLINK = ГИПЕРССЫЛКА ## Создает ссылку, открывающую документ, который находится на сервере сети, в интрасети или в Интернете. +INDEX = ИНДЕКС ## Использует индекс для выбора значения из ссылки или массива. +INDIRECT = ДВССЫЛ ## Возвращает ссылку, заданную текстовым значением. +LOOKUP = ПРОСМОТР ## Ищет значения в векторе или массиве. +MATCH = ПОИСКПОЗ ## Ищет значения в ссылке или массиве. +OFFSET = СМЕЩ ## Возвращает смещение ссылки относительно заданной ссылки. +ROW = СТРОКА ## Возвращает номер строки, определяемой ссылкой. +ROWS = ЧСТРОК ## Возвращает количество строк в ссылке. +RTD = ДРВ ## Извлекает данные реального времени из программ, поддерживающих автоматизацию COM (Программирование объектов. Стандартное средство для работы с объектами некоторого приложения из другого приложения или средства разработки. Программирование объектов (ранее называемое программированием OLE) является функцией модели COM (Component Object Model, модель компонентных объектов).). +TRANSPOSE = ТРАНСП ## Возвращает транспонированный массив. +VLOOKUP = ВПР ## Ищет значение в первом столбце массива и возвращает значение из ячейки в найденной строке и указанном столбце. + + +## +## Math and trigonometry functions Математические и тригонометрические функции +## +ABS = ABS ## Возвращает модуль (абсолютную величину) числа. +ACOS = ACOS ## Возвращает арккосинус числа. +ACOSH = ACOSH ## Возвращает гиперболический арккосинус числа. +ASIN = ASIN ## Возвращает арксинус числа. +ASINH = ASINH ## Возвращает гиперболический арксинус числа. +ATAN = ATAN ## Возвращает арктангенс числа. +ATAN2 = ATAN2 ## Возвращает арктангенс для заданных координат x и y. +ATANH = ATANH ## Возвращает гиперболический арктангенс числа. +CEILING = ОКРВВЕРХ ## Округляет число до ближайшего целого или до ближайшего кратного указанному значению. +COMBIN = ЧИСЛКОМБ ## Возвращает количество комбинаций для заданного числа объектов. +COS = COS ## Возвращает косинус числа. +COSH = COSH ## Возвращает гиперболический косинус числа. +DEGREES = ГРАДУСЫ ## Преобразует радианы в градусы. +EVEN = ЧЁТН ## Округляет число до ближайшего четного целого. +EXP = EXP ## Возвращает число e, возведенное в указанную степень. +FACT = ФАКТР ## Возвращает факториал числа. +FACTDOUBLE = ДВФАКТР ## Возвращает двойной факториал числа. +FLOOR = ОКРВНИЗ ## Округляет число до ближайшего меньшего по модулю значения. +GCD = НОД ## Возвращает наибольший общий делитель. +INT = ЦЕЛОЕ ## Округляет число до ближайшего меньшего целого. +LCM = НОК ## Возвращает наименьшее общее кратное. +LN = LN ## Возвращает натуральный логарифм числа. +LOG = LOG ## Возвращает логарифм числа по заданному основанию. +LOG10 = LOG10 ## Возвращает десятичный логарифм числа. +MDETERM = МОПРЕД ## Возвращает определитель матрицы массива. +MINVERSE = МОБР ## Возвращает обратную матрицу массива. +MMULT = МУМНОЖ ## Возвращает произведение матриц двух массивов. +MOD = ОСТАТ ## Возвращает остаток от деления. +MROUND = ОКРУГЛТ ## Возвращает число, округленное с требуемой точностью. +MULTINOMIAL = МУЛЬТИНОМ ## Возвращает мультиномиальный коэффициент множества чисел. +ODD = НЕЧЁТ ## Округляет число до ближайшего нечетного целого. +PI = ПИ ## Возвращает число пи. +POWER = СТЕПЕНЬ ## Возвращает результат возведения числа в степень. +PRODUCT = ПРОИЗВЕД ## Возвращает произведение аргументов. +QUOTIENT = ЧАСТНОЕ ## Возвращает целую часть частного при делении. +RADIANS = РАДИАНЫ ## Преобразует градусы в радианы. +RAND = СЛЧИС ## Возвращает случайное число в интервале от 0 до 1. +RANDBETWEEN = СЛУЧМЕЖДУ ## Возвращает случайное число в интервале между двумя заданными числами. +ROMAN = РИМСКОЕ ## Преобразует арабские цифры в римские в виде текста. +ROUND = ОКРУГЛ ## Округляет число до указанного количества десятичных разрядов. +ROUNDDOWN = ОКРУГЛВНИЗ ## Округляет число до ближайшего меньшего по модулю значения. +ROUNDUP = ОКРУГЛВВЕРХ ## Округляет число до ближайшего большего по модулю значения. +SERIESSUM = РЯД.СУММ ## Возвращает сумму степенного ряда, вычисленную по формуле. +SIGN = ЗНАК ## Возвращает знак числа. +SIN = SIN ## Возвращает синус заданного угла. +SINH = SINH ## Возвращает гиперболический синус числа. +SQRT = КОРЕНЬ ## Возвращает положительное значение квадратного корня. +SQRTPI = КОРЕНЬПИ ## Возвращает квадратный корень из значения выражения (число * ПИ). +SUBTOTAL = ПРОМЕЖУТОЧНЫЕ.ИТОГИ ## Возвращает промежуточный итог в списке или базе данных. +SUM = СУММ ## Суммирует аргументы. +SUMIF = СУММЕСЛИ ## Суммирует ячейки, удовлетворяющие заданному условию. +SUMIFS = СУММЕСЛИМН ## Суммирует диапазон ячеек, удовлетворяющих нескольким условиям. +SUMPRODUCT = СУММПРОИЗВ ## Возвращает сумму произведений соответствующих элементов массивов. +SUMSQ = СУММКВ ## Возвращает сумму квадратов аргументов. +SUMX2MY2 = СУММРАЗНКВ ## Возвращает сумму разностей квадратов соответствующих значений в двух массивах. +SUMX2PY2 = СУММСУММКВ ## Возвращает сумму сумм квадратов соответствующих элементов двух массивов. +SUMXMY2 = СУММКВРАЗН ## Возвращает сумму квадратов разностей соответствующих значений в двух массивах. +TAN = TAN ## Возвращает тангенс числа. +TANH = TANH ## Возвращает гиперболический тангенс числа. +TRUNC = ОТБР ## Отбрасывает дробную часть числа. + + +## +## Statistical functions Статистические функции +## +AVEDEV = СРОТКЛ ## Возвращает среднее арифметическое абсолютных значений отклонений точек данных от среднего. +AVERAGE = СРЗНАЧ ## Возвращает среднее арифметическое аргументов. +AVERAGEA = СРЗНАЧА ## Возвращает среднее арифметическое аргументов, включая числа, текст и логические значения. +AVERAGEIF = СРЗНАЧЕСЛИ ## Возвращает среднее значение (среднее арифметическое) всех ячеек в диапазоне, которые удовлетворяют данному условию. +AVERAGEIFS = СРЗНАЧЕСЛИМН ## Возвращает среднее значение (среднее арифметическое) всех ячеек, которые удовлетворяют нескольким условиям. +BETADIST = БЕТАРАСП ## Возвращает интегральную функцию бета-распределения. +BETAINV = БЕТАОБР ## Возвращает обратную интегральную функцию указанного бета-распределения. +BINOMDIST = БИНОМРАСП ## Возвращает отдельное значение биномиального распределения. +CHIDIST = ХИ2РАСП ## Возвращает одностороннюю вероятность распределения хи-квадрат. +CHIINV = ХИ2ОБР ## Возвращает обратное значение односторонней вероятности распределения хи-квадрат. +CHITEST = ХИ2ТЕСТ ## Возвращает тест на независимость. +CONFIDENCE = ДОВЕРИТ ## Возвращает доверительный интервал для среднего значения по генеральной совокупности. +CORREL = КОРРЕЛ ## Возвращает коэффициент корреляции между двумя множествами данных. +COUNT = СЧЁТ ## Подсчитывает количество чисел в списке аргументов. +COUNTA = СЧЁТЗ ## Подсчитывает количество значений в списке аргументов. +COUNTBLANK = СЧИТАТЬПУСТОТЫ ## Подсчитывает количество пустых ячеек в диапазоне +COUNTIF = СЧЁТЕСЛИ ## Подсчитывает количество ячеек в диапазоне, удовлетворяющих заданному условию +COUNTIFS = СЧЁТЕСЛИМН ## Подсчитывает количество ячеек внутри диапазона, удовлетворяющих нескольким условиям. +COVAR = КОВАР ## Возвращает ковариацию, среднее произведений парных отклонений +CRITBINOM = КРИТБИНОМ ## Возвращает наименьшее значение, для которого интегральное биномиальное распределение меньше или равно заданному критерию. +DEVSQ = КВАДРОТКЛ ## Возвращает сумму квадратов отклонений. +EXPONDIST = ЭКСПРАСП ## Возвращает экспоненциальное распределение. +FDIST = FРАСП ## Возвращает F-распределение вероятности. +FINV = FРАСПОБР ## Возвращает обратное значение для F-распределения вероятности. +FISHER = ФИШЕР ## Возвращает преобразование Фишера. +FISHERINV = ФИШЕРОБР ## Возвращает обратное преобразование Фишера. +FORECAST = ПРЕДСКАЗ ## Возвращает значение линейного тренда. +FREQUENCY = ЧАСТОТА ## Возвращает распределение частот в виде вертикального массива. +FTEST = ФТЕСТ ## Возвращает результат F-теста. +GAMMADIST = ГАММАРАСП ## Возвращает гамма-распределение. +GAMMAINV = ГАММАОБР ## Возвращает обратное гамма-распределение. +GAMMALN = ГАММАНЛОГ ## Возвращает натуральный логарифм гамма функции, Γ(x). +GEOMEAN = СРГЕОМ ## Возвращает среднее геометрическое. +GROWTH = РОСТ ## Возвращает значения в соответствии с экспоненциальным трендом. +HARMEAN = СРГАРМ ## Возвращает среднее гармоническое. +HYPGEOMDIST = ГИПЕРГЕОМЕТ ## Возвращает гипергеометрическое распределение. +INTERCEPT = ОТРЕЗОК ## Возвращает отрезок, отсекаемый на оси линией линейной регрессии. +KURT = ЭКСЦЕСС ## Возвращает эксцесс множества данных. +LARGE = НАИБОЛЬШИЙ ## Возвращает k-ое наибольшее значение в множестве данных. +LINEST = ЛИНЕЙН ## Возвращает параметры линейного тренда. +LOGEST = ЛГРФПРИБЛ ## Возвращает параметры экспоненциального тренда. +LOGINV = ЛОГНОРМОБР ## Возвращает обратное логарифмическое нормальное распределение. +LOGNORMDIST = ЛОГНОРМРАСП ## Возвращает интегральное логарифмическое нормальное распределение. +MAX = МАКС ## Возвращает наибольшее значение в списке аргументов. +MAXA = МАКСА ## Возвращает наибольшее значение в списке аргументов, включая числа, текст и логические значения. +MEDIAN = МЕДИАНА ## Возвращает медиану заданных чисел. +MIN = МИН ## Возвращает наименьшее значение в списке аргументов. +MINA = МИНА ## Возвращает наименьшее значение в списке аргументов, включая числа, текст и логические значения. +MODE = МОДА ## Возвращает значение моды множества данных. +NEGBINOMDIST = ОТРБИНОМРАСП ## Возвращает отрицательное биномиальное распределение. +NORMDIST = НОРМРАСП ## Возвращает нормальную функцию распределения. +NORMINV = НОРМОБР ## Возвращает обратное нормальное распределение. +NORMSDIST = НОРМСТРАСП ## Возвращает стандартное нормальное интегральное распределение. +NORMSINV = НОРМСТОБР ## Возвращает обратное значение стандартного нормального распределения. +PEARSON = ПИРСОН ## Возвращает коэффициент корреляции Пирсона. +PERCENTILE = ПЕРСЕНТИЛЬ ## Возвращает k-ую персентиль для значений диапазона. +PERCENTRANK = ПРОЦЕНТРАНГ ## Возвращает процентную норму значения в множестве данных. +PERMUT = ПЕРЕСТ ## Возвращает количество перестановок для заданного числа объектов. +POISSON = ПУАССОН ## Возвращает распределение Пуассона. +PROB = ВЕРОЯТНОСТЬ ## Возвращает вероятность того, что значение из диапазона находится внутри заданных пределов. +QUARTILE = КВАРТИЛЬ ## Возвращает квартиль множества данных. +RANK = РАНГ ## Возвращает ранг числа в списке чисел. +RSQ = КВПИРСОН ## Возвращает квадрат коэффициента корреляции Пирсона. +SKEW = СКОС ## Возвращает асимметрию распределения. +SLOPE = НАКЛОН ## Возвращает наклон линии линейной регрессии. +SMALL = НАИМЕНЬШИЙ ## Возвращает k-ое наименьшее значение в множестве данных. +STANDARDIZE = НОРМАЛИЗАЦИЯ ## Возвращает нормализованное значение. +STDEV = СТАНДОТКЛОН ## Оценивает стандартное отклонение по выборке. +STDEVA = СТАНДОТКЛОНА ## Оценивает стандартное отклонение по выборке, включая числа, текст и логические значения. +STDEVP = СТАНДОТКЛОНП ## Вычисляет стандартное отклонение по генеральной совокупности. +STDEVPA = СТАНДОТКЛОНПА ## Вычисляет стандартное отклонение по генеральной совокупности, включая числа, текст и логические значения. +STEYX = СТОШYX ## Возвращает стандартную ошибку предсказанных значений y для каждого значения x в регрессии. +TDIST = СТЬЮДРАСП ## Возвращает t-распределение Стьюдента. +TINV = СТЬЮДРАСПОБР ## Возвращает обратное t-распределение Стьюдента. +TREND = ТЕНДЕНЦИЯ ## Возвращает значения в соответствии с линейным трендом. +TRIMMEAN = УРЕЗСРЕДНЕЕ ## Возвращает среднее внутренности множества данных. +TTEST = ТТЕСТ ## Возвращает вероятность, соответствующую критерию Стьюдента. +VAR = ДИСП ## Оценивает дисперсию по выборке. +VARA = ДИСПА ## Оценивает дисперсию по выборке, включая числа, текст и логические значения. +VARP = ДИСПР ## Вычисляет дисперсию для генеральной совокупности. +VARPA = ДИСПРА ## Вычисляет дисперсию для генеральной совокупности, включая числа, текст и логические значения. +WEIBULL = ВЕЙБУЛЛ ## Возвращает распределение Вейбулла. +ZTEST = ZТЕСТ ## Возвращает двустороннее P-значение z-теста. + + +## +## Text functions Текстовые функции +## +ASC = ASC ## Для языков с двухбайтовыми наборами знаков (например, катакана) преобразует полноширинные (двухбайтовые) знаки в полуширинные (однобайтовые). +BAHTTEXT = БАТТЕКСТ ## Преобразует число в текст, используя денежный формат ß (БАТ). +CHAR = СИМВОЛ ## Возвращает знак с заданным кодом. +CLEAN = ПЕЧСИМВ ## Удаляет все непечатаемые знаки из текста. +CODE = КОДСИМВ ## Возвращает числовой код первого знака в текстовой строке. +CONCATENATE = СЦЕПИТЬ ## Объединяет несколько текстовых элементов в один. +DOLLAR = РУБЛЬ ## Преобразует число в текст, используя денежный формат. +EXACT = СОВПАД ## Проверяет идентичность двух текстовых значений. +FIND = НАЙТИ ## Ищет вхождения одного текстового значения в другом (с учетом регистра). +FINDB = НАЙТИБ ## Ищет вхождения одного текстового значения в другом (с учетом регистра). +FIXED = ФИКСИРОВАННЫЙ ## Форматирует число и преобразует его в текст с заданным числом десятичных знаков. +JIS = JIS ## Для языков с двухбайтовыми наборами знаков (например, катакана) преобразует полуширинные (однобайтовые) знаки в текстовой строке в полноширинные (двухбайтовые). +LEFT = ЛЕВСИМВ ## Возвращает крайние слева знаки текстового значения. +LEFTB = ЛЕВБ ## Возвращает крайние слева знаки текстового значения. +LEN = ДЛСТР ## Возвращает количество знаков в текстовой строке. +LENB = ДЛИНБ ## Возвращает количество знаков в текстовой строке. +LOWER = СТРОЧН ## Преобразует все буквы текста в строчные. +MID = ПСТР ## Возвращает заданное число знаков из строки текста, начиная с указанной позиции. +MIDB = ПСТРБ ## Возвращает заданное число знаков из строки текста, начиная с указанной позиции. +PHONETIC = PHONETIC ## Извлекает фонетические (фуригана) знаки из текстовой строки. +PROPER = ПРОПНАЧ ## Преобразует первую букву в каждом слове текста в прописную. +REPLACE = ЗАМЕНИТЬ ## Заменяет знаки в тексте. +REPLACEB = ЗАМЕНИТЬБ ## Заменяет знаки в тексте. +REPT = ПОВТОР ## Повторяет текст заданное число раз. +RIGHT = ПРАВСИМВ ## Возвращает крайние справа знаки текстовой строки. +RIGHTB = ПРАВБ ## Возвращает крайние справа знаки текстовой строки. +SEARCH = ПОИСК ## Ищет вхождения одного текстового значения в другом (без учета регистра). +SEARCHB = ПОИСКБ ## Ищет вхождения одного текстового значения в другом (без учета регистра). +SUBSTITUTE = ПОДСТАВИТЬ ## Заменяет в текстовой строке старый текст новым. +T = Т ## Преобразует аргументы в текст. +TEXT = ТЕКСТ ## Форматирует число и преобразует его в текст. +TRIM = СЖПРОБЕЛЫ ## Удаляет из текста пробелы. +UPPER = ПРОПИСН ## Преобразует все буквы текста в прописные. +VALUE = ЗНАЧЕН ## Преобразует текстовый аргумент в число. diff --git a/application/third_party/PHPExcel/PHPExcel/locale/sv/config b/application/third_party/PHPExcel/PHPExcel/locale/sv/config new file mode 100644 index 0000000..726f771 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/sv/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = kr + + +## +## Excel Error Codes (For future use) +## +NULL = #Skärning! +DIV0 = #Division/0! +VALUE = #Värdefel! +REF = #Referens! +NAME = #Namn? +NUM = #Ogiltigt! +NA = #Saknas! diff --git a/application/third_party/PHPExcel/PHPExcel/locale/sv/functions b/application/third_party/PHPExcel/PHPExcel/locale/sv/functions new file mode 100644 index 0000000..9af37d8 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/sv/functions @@ -0,0 +1,408 @@ +## +## Add-in and Automation functions Tilläggs- och automatiseringsfunktioner +## +GETPIVOTDATA = HÄMTA.PIVOTDATA ## Returnerar data som lagrats i en pivottabellrapport + + +## +## Cube functions Kubfunktioner +## +CUBEKPIMEMBER = KUBKPIMEDLEM ## Returnerar namn, egenskap och mått för en KPI och visar namnet och egenskapen i cellen. En KPI, eller prestandaindikator, är ett kvantifierbart mått, t.ex. månatlig bruttovinst eller personalomsättning per kvartal, som används för att analysera ett företags resultat. +CUBEMEMBER = KUBMEDLEM ## Returnerar en medlem eller ett par i en kubhierarki. Används för att verifiera att medlemmen eller paret finns i kuben. +CUBEMEMBERPROPERTY = KUBMEDLEMSEGENSKAP ## Returnerar värdet för en medlemsegenskap i kuben. Används för att verifiera att ett medlemsnamn finns i kuben, samt för att returnera den angivna egenskapen för medlemmen. +CUBERANKEDMEMBER = KUBRANGORDNADMEDLEM ## Returnerar den n:te, eller rangordnade, medlemmen i en uppsättning. Används för att returnera ett eller flera element i en uppsättning, till exempelvis den bästa försäljaren eller de tio bästa eleverna. +CUBESET = KUBINSTÄLLNING ## Definierar en beräknad uppsättning medlemmar eller par genom att skicka ett bestämt uttryck till kuben på servern, som skapar uppsättningen och sedan returnerar den till Microsoft Office Excel. +CUBESETCOUNT = KUBINSTÄLLNINGANTAL ## Returnerar antalet objekt i en uppsättning. +CUBEVALUE = KUBVÄRDE ## Returnerar ett mängdvärde från en kub. + + +## +## Database functions Databasfunktioner +## +DAVERAGE = DMEDEL ## Returnerar medelvärdet av databasposterna +DCOUNT = DANTAL ## Räknar antalet celler som innehåller tal i en databas +DCOUNTA = DANTALV ## Räknar ifyllda celler i en databas +DGET = DHÄMTA ## Hämtar en enstaka post från en databas som uppfyller de angivna villkoren +DMAX = DMAX ## Returnerar det största värdet från databasposterna +DMIN = DMIN ## Returnerar det minsta värdet från databasposterna +DPRODUCT = DPRODUKT ## Multiplicerar värdena i ett visst fält i poster som uppfyller villkoret +DSTDEV = DSTDAV ## Uppskattar standardavvikelsen baserat på ett urval av databasposterna +DSTDEVP = DSTDAVP ## Beräknar standardavvikelsen utifrån hela populationen av valda databasposter +DSUM = DSUMMA ## Summerar talen i kolumnfält i databasposter som uppfyller villkoret +DVAR = DVARIANS ## Uppskattar variansen baserat på ett urval av databasposterna +DVARP = DVARIANSP ## Beräknar variansen utifrån hela populationen av valda databasposter + + +## +## Date and time functions Tid- och datumfunktioner +## +DATE = DATUM ## Returnerar ett serienummer för ett visst datum +DATEVALUE = DATUMVÄRDE ## Konverterar ett datum i textformat till ett serienummer +DAY = DAG ## Konverterar ett serienummer till dag i månaden +DAYS360 = DAGAR360 ## Beräknar antalet dagar mellan två datum baserat på ett 360-dagarsår +EDATE = EDATUM ## Returnerar serienumret för ett datum som infaller ett visst antal månader före eller efter startdatumet +EOMONTH = SLUTMÅNAD ## Returnerar serienumret för sista dagen i månaden ett visst antal månader tidigare eller senare +HOUR = TIMME ## Konverterar ett serienummer till en timme +MINUTE = MINUT ## Konverterar ett serienummer till en minut +MONTH = MÅNAD ## Konverterar ett serienummer till en månad +NETWORKDAYS = NETTOARBETSDAGAR ## Returnerar antalet hela arbetsdagar mellan två datum +NOW = NU ## Returnerar serienumret för dagens datum och aktuell tid +SECOND = SEKUND ## Konverterar ett serienummer till en sekund +TIME = KLOCKSLAG ## Returnerar serienumret för en viss tid +TIMEVALUE = TIDVÄRDE ## Konverterar en tid i textformat till ett serienummer +TODAY = IDAG ## Returnerar serienumret för dagens datum +WEEKDAY = VECKODAG ## Konverterar ett serienummer till en dag i veckan +WEEKNUM = VECKONR ## Konverterar ett serienummer till ett veckonummer +WORKDAY = ARBETSDAGAR ## Returnerar serienumret för ett datum ett visst antal arbetsdagar tidigare eller senare +YEAR = ÅR ## Konverterar ett serienummer till ett år +YEARFRAC = ÅRDEL ## Returnerar en del av ett år som representerar antalet hela dagar mellan start- och slutdatum + + +## +## Engineering functions Tekniska funktioner +## +BESSELI = BESSELI ## Returnerar den modifierade Bessel-funktionen In(x) +BESSELJ = BESSELJ ## Returnerar Bessel-funktionen Jn(x) +BESSELK = BESSELK ## Returnerar den modifierade Bessel-funktionen Kn(x) +BESSELY = BESSELY ## Returnerar Bessel-funktionen Yn(x) +BIN2DEC = BIN.TILL.DEC ## Omvandlar ett binärt tal till decimalt +BIN2HEX = BIN.TILL.HEX ## Omvandlar ett binärt tal till hexadecimalt +BIN2OCT = BIN.TILL.OKT ## Omvandlar ett binärt tal till oktalt +COMPLEX = KOMPLEX ## Omvandlar reella och imaginära koefficienter till ett komplext tal +CONVERT = KONVERTERA ## Omvandlar ett tal från ett måttsystem till ett annat +DEC2BIN = DEC.TILL.BIN ## Omvandlar ett decimalt tal till binärt +DEC2HEX = DEC.TILL.HEX ## Omvandlar ett decimalt tal till hexadecimalt +DEC2OCT = DEC.TILL.OKT ## Omvandlar ett decimalt tal till oktalt +DELTA = DELTA ## Testar om två värden är lika +ERF = FELF ## Returnerar felfunktionen +ERFC = FELFK ## Returnerar den komplementära felfunktionen +GESTEP = SLSTEG ## Testar om ett tal är större än ett tröskelvärde +HEX2BIN = HEX.TILL.BIN ## Omvandlar ett hexadecimalt tal till binärt +HEX2DEC = HEX.TILL.DEC ## Omvandlar ett hexadecimalt tal till decimalt +HEX2OCT = HEX.TILL.OKT ## Omvandlar ett hexadecimalt tal till oktalt +IMABS = IMABS ## Returnerar absolutvärdet (modulus) för ett komplext tal +IMAGINARY = IMAGINÄR ## Returnerar den imaginära koefficienten för ett komplext tal +IMARGUMENT = IMARGUMENT ## Returnerar det komplexa talets argument, en vinkel uttryckt i radianer +IMCONJUGATE = IMKONJUGAT ## Returnerar det komplexa talets konjugat +IMCOS = IMCOS ## Returnerar cosinus för ett komplext tal +IMDIV = IMDIV ## Returnerar kvoten för två komplexa tal +IMEXP = IMEUPPHÖJT ## Returnerar exponenten för ett komplext tal +IMLN = IMLN ## Returnerar den naturliga logaritmen för ett komplext tal +IMLOG10 = IMLOG10 ## Returnerar 10-logaritmen för ett komplext tal +IMLOG2 = IMLOG2 ## Returnerar 2-logaritmen för ett komplext tal +IMPOWER = IMUPPHÖJT ## Returnerar ett komplext tal upphöjt till en exponent +IMPRODUCT = IMPRODUKT ## Returnerar produkten av komplexa tal +IMREAL = IMREAL ## Returnerar den reella koefficienten för ett komplext tal +IMSIN = IMSIN ## Returnerar sinus för ett komplext tal +IMSQRT = IMROT ## Returnerar kvadratroten av ett komplext tal +IMSUB = IMDIFF ## Returnerar differensen mellan två komplexa tal +IMSUM = IMSUM ## Returnerar summan av komplexa tal +OCT2BIN = OKT.TILL.BIN ## Omvandlar ett oktalt tal till binärt +OCT2DEC = OKT.TILL.DEC ## Omvandlar ett oktalt tal till decimalt +OCT2HEX = OKT.TILL.HEX ## Omvandlar ett oktalt tal till hexadecimalt + + +## +## Financial functions Finansiella funktioner +## +ACCRINT = UPPLRÄNTA ## Returnerar den upplupna räntan för värdepapper med periodisk ränta +ACCRINTM = UPPLOBLRÄNTA ## Returnerar den upplupna räntan för ett värdepapper som ger avkastning på förfallodagen +AMORDEGRC = AMORDEGRC ## Returnerar avskrivningen för varje redovisningsperiod med hjälp av en avskrivningskoefficient +AMORLINC = AMORLINC ## Returnerar avskrivningen för varje redovisningsperiod +COUPDAYBS = KUPDAGBB ## Returnerar antal dagar från början av kupongperioden till likviddagen +COUPDAYS = KUPDAGARS ## Returnerar antalet dagar i kupongperioden som innehåller betalningsdatumet +COUPDAYSNC = KUPDAGNK ## Returnerar antalet dagar från betalningsdatumet till nästa kupongdatum +COUPNCD = KUPNKD ## Returnerar nästa kupongdatum efter likviddagen +COUPNUM = KUPANT ## Returnerar kuponger som förfaller till betalning mellan likviddagen och förfallodagen +COUPPCD = KUPFKD ## Returnerar föregående kupongdatum före likviddagen +CUMIPMT = KUMRÄNTA ## Returnerar den ackumulerade räntan som betalats mellan två perioder +CUMPRINC = KUMPRIS ## Returnerar det ackumulerade kapitalbeloppet som betalats på ett lån mellan två perioder +DB = DB ## Returnerar avskrivningen för en tillgång under en angiven tid enligt metoden för fast degressiv avskrivning +DDB = DEGAVSKR ## Returnerar en tillgångs värdeminskning under en viss period med hjälp av dubbel degressiv avskrivning eller någon annan metod som du anger +DISC = DISK ## Returnerar diskonteringsräntan för ett värdepapper +DOLLARDE = DECTAL ## Omvandlar ett pris uttryckt som ett bråk till ett decimaltal +DOLLARFR = BRÅK ## Omvandlar ett pris i kronor uttryckt som ett decimaltal till ett bråk +DURATION = LÖPTID ## Returnerar den årliga löptiden för en säkerhet med periodiska räntebetalningar +EFFECT = EFFRÄNTA ## Returnerar den årliga effektiva räntesatsen +FV = SLUTVÄRDE ## Returnerar det framtida värdet på en investering +FVSCHEDULE = FÖRRÄNTNING ## Returnerar det framtida värdet av ett begynnelsekapital beräknat på olika räntenivåer +INTRATE = ÅRSRÄNTA ## Returnerar räntesatsen för ett betalt värdepapper +IPMT = RBETALNING ## Returnerar räntedelen av en betalning för en given period +IRR = IR ## Returnerar internräntan för en serie betalningar +ISPMT = RALÅN ## Beräknar räntan som har betalats under en specifik betalningsperiod +MDURATION = MLÖPTID ## Returnerar den modifierade Macauley-löptiden för ett värdepapper med det antagna nominella värdet 100 kr +MIRR = MODIR ## Returnerar internräntan där positiva och negativa betalningar finansieras med olika räntor +NOMINAL = NOMRÄNTA ## Returnerar den årliga nominella räntesatsen +NPER = PERIODER ## Returnerar antalet perioder för en investering +NPV = NETNUVÄRDE ## Returnerar nuvärdet av en serie periodiska betalningar vid en given diskonteringsränta +ODDFPRICE = UDDAFPRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper med en udda första period +ODDFYIELD = UDDAFAVKASTNING ## Returnerar avkastningen för en säkerhet med en udda första period +ODDLPRICE = UDDASPRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper med en udda sista period +ODDLYIELD = UDDASAVKASTNING ## Returnerar avkastningen för en säkerhet med en udda sista period +PMT = BETALNING ## Returnerar den periodiska betalningen för en annuitet +PPMT = AMORT ## Returnerar amorteringsdelen av en annuitetsbetalning för en given period +PRICE = PRIS ## Returnerar priset per 100 kr nominellt värde för ett värdepapper som ger periodisk ränta +PRICEDISC = PRISDISK ## Returnerar priset per 100 kr nominellt värde för ett diskonterat värdepapper +PRICEMAT = PRISFÖRF ## Returnerar priset per 100 kr nominellt värde för ett värdepapper som ger ränta på förfallodagen +PV = PV ## Returnerar nuvärdet av en serie lika stora periodiska betalningar +RATE = RÄNTA ## Returnerar räntesatsen per period i en annuitet +RECEIVED = BELOPP ## Returnerar beloppet som utdelas på förfallodagen för ett betalat värdepapper +SLN = LINAVSKR ## Returnerar den linjära avskrivningen för en tillgång under en period +SYD = ÅRSAVSKR ## Returnerar den årliga avskrivningssumman för en tillgång under en angiven period +TBILLEQ = SSVXEKV ## Returnerar avkastningen motsvarande en obligation för en statsskuldväxel +TBILLPRICE = SSVXPRIS ## Returnerar priset per 100 kr nominellt värde för en statsskuldväxel +TBILLYIELD = SSVXRÄNTA ## Returnerar avkastningen för en statsskuldväxel +VDB = VDEGRAVSKR ## Returnerar avskrivningen för en tillgång under en angiven period (med degressiv avskrivning) +XIRR = XIRR ## Returnerar internräntan för en serie betalningar som inte nödvändigtvis är periodiska +XNPV = XNUVÄRDE ## Returnerar det nuvarande nettovärdet för en serie betalningar som inte nödvändigtvis är periodiska +YIELD = NOMAVK ## Returnerar avkastningen för ett värdepapper som ger periodisk ränta +YIELDDISC = NOMAVKDISK ## Returnerar den årliga avkastningen för diskonterade värdepapper, exempelvis en statsskuldväxel +YIELDMAT = NOMAVKFÖRF ## Returnerar den årliga avkastningen för ett värdepapper som ger ränta på förfallodagen + + +## +## Information functions Informationsfunktioner +## +CELL = CELL ## Returnerar information om formatering, plats och innehåll i en cell +ERROR.TYPE = FEL.TYP ## Returnerar ett tal som motsvarar ett felvärde +INFO = INFO ## Returnerar information om operativsystemet +ISBLANK = ÄRREF ## Returnerar SANT om värdet är tomt +ISERR = Ä ## Returnerar SANT om värdet är ett felvärde annat än #SAKNAS! +ISERROR = ÄRFEL ## Returnerar SANT om värdet är ett felvärde +ISEVEN = ÄRJÄMN ## Returnerar SANT om talet är jämnt +ISLOGICAL = ÄREJTEXT ## Returnerar SANT om värdet är ett logiskt värde +ISNA = ÄRLOGISK ## Returnerar SANT om värdet är felvärdet #SAKNAS! +ISNONTEXT = ÄRSAKNAD ## Returnerar SANT om värdet inte är text +ISNUMBER = ÄRTAL ## Returnerar SANT om värdet är ett tal +ISODD = ÄRUDDA ## Returnerar SANT om talet är udda +ISREF = ÄRTOM ## Returnerar SANT om värdet är en referens +ISTEXT = ÄRTEXT ## Returnerar SANT om värdet är text +N = N ## Returnerar ett värde omvandlat till ett tal +NA = SAKNAS ## Returnerar felvärdet #SAKNAS! +TYPE = VÄRDETYP ## Returnerar ett tal som anger värdets datatyp + + +## +## Logical functions Logiska funktioner +## +AND = OCH ## Returnerar SANT om alla argument är sanna +FALSE = FALSKT ## Returnerar det logiska värdet FALSKT +IF = OM ## Anger vilket logiskt test som ska utföras +IFERROR = OMFEL ## Returnerar ett värde som du anger om en formel utvärderar till ett fel; annars returneras resultatet av formeln +NOT = ICKE ## Inverterar logiken för argumenten +OR = ELLER ## Returnerar SANT om något argument är SANT +TRUE = SANT ## Returnerar det logiska värdet SANT + + +## +## Lookup and reference functions Sök- och referensfunktioner +## +ADDRESS = ADRESS ## Returnerar en referens som text till en enstaka cell i ett kalkylblad +AREAS = OMRÅDEN ## Returnerar antalet områden i en referens +CHOOSE = VÄLJ ## Väljer ett värde i en lista över värden +COLUMN = KOLUMN ## Returnerar kolumnnumret för en referens +COLUMNS = KOLUMNER ## Returnerar antalet kolumner i en referens +HLOOKUP = LETAKOLUMN ## Söker i den översta raden i en matris och returnerar värdet för angiven cell +HYPERLINK = HYPERLÄNK ## Skapar en genväg eller ett hopp till ett dokument i nätverket, i ett intranät eller på Internet +INDEX = INDEX ## Använder ett index för ett välja ett värde i en referens eller matris +INDIRECT = INDIREKT ## Returnerar en referens som anges av ett textvärde +LOOKUP = LETAUPP ## Letar upp värden i en vektor eller matris +MATCH = PASSA ## Letar upp värden i en referens eller matris +OFFSET = FÖRSKJUTNING ## Returnerar en referens förskjuten i förhållande till en given referens +ROW = RAD ## Returnerar radnumret för en referens +ROWS = RADER ## Returnerar antalet rader i en referens +RTD = RTD ## Hämtar realtidsdata från ett program som stöder COM-automation (Automation: Ett sätt att arbeta med ett programs objekt från ett annat program eller utvecklingsverktyg. Detta kallades tidigare för OLE Automation, och är en branschstandard och ingår i Component Object Model (COM).) +TRANSPOSE = TRANSPONERA ## Transponerar en matris +VLOOKUP = LETARAD ## Letar i den första kolumnen i en matris och flyttar över raden för att returnera värdet för en cell + + +## +## Math and trigonometry functions Matematiska och trigonometriska funktioner +## +ABS = ABS ## Returnerar absolutvärdet av ett tal +ACOS = ARCCOS ## Returnerar arcus cosinus för ett tal +ACOSH = ARCCOSH ## Returnerar inverterad hyperbolisk cosinus för ett tal +ASIN = ARCSIN ## Returnerar arcus cosinus för ett tal +ASINH = ARCSINH ## Returnerar hyperbolisk arcus sinus för ett tal +ATAN = ARCTAN ## Returnerar arcus tangens för ett tal +ATAN2 = ARCTAN2 ## Returnerar arcus tangens för en x- och en y- koordinat +ATANH = ARCTANH ## Returnerar hyperbolisk arcus tangens för ett tal +CEILING = RUNDA.UPP ## Avrundar ett tal till närmaste heltal eller närmaste signifikanta multipel +COMBIN = KOMBIN ## Returnerar antalet kombinationer för ett givet antal objekt +COS = COS ## Returnerar cosinus för ett tal +COSH = COSH ## Returnerar hyperboliskt cosinus för ett tal +DEGREES = GRADER ## Omvandlar radianer till grader +EVEN = JÄMN ## Avrundar ett tal uppåt till närmaste heltal +EXP = EXP ## Returnerar e upphöjt till ett givet tal +FACT = FAKULTET ## Returnerar fakulteten för ett tal +FACTDOUBLE = DUBBELFAKULTET ## Returnerar dubbelfakulteten för ett tal +FLOOR = RUNDA.NED ## Avrundar ett tal nedåt mot noll +GCD = SGD ## Returnerar den största gemensamma nämnaren +INT = HELTAL ## Avrundar ett tal nedåt till närmaste heltal +LCM = MGM ## Returnerar den minsta gemensamma multipeln +LN = LN ## Returnerar den naturliga logaritmen för ett tal +LOG = LOG ## Returnerar logaritmen för ett tal för en given bas +LOG10 = LOG10 ## Returnerar 10-logaritmen för ett tal +MDETERM = MDETERM ## Returnerar matrisen som är avgörandet av en matris +MINVERSE = MINVERT ## Returnerar matrisinversen av en matris +MMULT = MMULT ## Returnerar matrisprodukten av två matriser +MOD = REST ## Returnerar resten vid en division +MROUND = MAVRUNDA ## Returnerar ett tal avrundat till en given multipel +MULTINOMIAL = MULTINOMIAL ## Returnerar multinomialen för en uppsättning tal +ODD = UDDA ## Avrundar ett tal uppåt till närmaste udda heltal +PI = PI ## Returnerar värdet pi +POWER = UPPHÖJT.TILL ## Returnerar resultatet av ett tal upphöjt till en exponent +PRODUCT = PRODUKT ## Multiplicerar argumenten +QUOTIENT = KVOT ## Returnerar heltalsdelen av en division +RADIANS = RADIANER ## Omvandlar grader till radianer +RAND = SLUMP ## Returnerar ett slumptal mellan 0 och 1 +RANDBETWEEN = SLUMP.MELLAN ## Returnerar ett slumptal mellan de tal som du anger +ROMAN = ROMERSK ## Omvandlar vanliga (arabiska) siffror till romerska som text +ROUND = AVRUNDA ## Avrundar ett tal till ett angivet antal siffror +ROUNDDOWN = AVRUNDA.NEDÅT ## Avrundar ett tal nedåt mot noll +ROUNDUP = AVRUNDA.UPPÅT ## Avrundar ett tal uppåt, från noll +SERIESSUM = SERIESUMMA ## Returnerar summan av en potensserie baserat på formeln +SIGN = TECKEN ## Returnerar tecknet för ett tal +SIN = SIN ## Returnerar sinus för en given vinkel +SINH = SINH ## Returnerar hyperbolisk sinus för ett tal +SQRT = ROT ## Returnerar den positiva kvadratroten +SQRTPI = ROTPI ## Returnerar kvadratroten för (tal * pi) +SUBTOTAL = DELSUMMA ## Returnerar en delsumma i en lista eller databas +SUM = SUMMA ## Summerar argumenten +SUMIF = SUMMA.OM ## Summerar celler enligt ett angivet villkor +SUMIFS = SUMMA.OMF ## Lägger till cellerna i ett område som uppfyller flera kriterier +SUMPRODUCT = PRODUKTSUMMA ## Returnerar summan av produkterna i motsvarande matriskomponenter +SUMSQ = KVADRATSUMMA ## Returnerar summan av argumentens kvadrater +SUMX2MY2 = SUMMAX2MY2 ## Returnerar summan av differensen mellan kvadraterna för motsvarande värden i två matriser +SUMX2PY2 = SUMMAX2PY2 ## Returnerar summan av summan av kvadraterna av motsvarande värden i två matriser +SUMXMY2 = SUMMAXMY2 ## Returnerar summan av kvadraten av skillnaden mellan motsvarande värden i två matriser +TAN = TAN ## Returnerar tangens för ett tal +TANH = TANH ## Returnerar hyperbolisk tangens för ett tal +TRUNC = AVKORTA ## Avkortar ett tal till ett heltal + + +## +## Statistical functions Statistiska funktioner +## +AVEDEV = MEDELAVV ## Returnerar medelvärdet för datapunkters absoluta avvikelse från deras medelvärde +AVERAGE = MEDEL ## Returnerar medelvärdet av argumenten +AVERAGEA = AVERAGEA ## Returnerar medelvärdet av argumenten, inklusive tal, text och logiska värden +AVERAGEIF = MEDELOM ## Returnerar medelvärdet (aritmetiskt medelvärde) för alla celler i ett område som uppfyller ett givet kriterium +AVERAGEIFS = MEDELOMF ## Returnerar medelvärdet (det aritmetiska medelvärdet) för alla celler som uppfyller flera villkor. +BETADIST = BETAFÖRD ## Returnerar den kumulativa betafördelningsfunktionen +BETAINV = BETAINV ## Returnerar inversen till den kumulativa fördelningsfunktionen för en viss betafördelning +BINOMDIST = BINOMFÖRD ## Returnerar den individuella binomialfördelningen +CHIDIST = CHI2FÖRD ## Returnerar den ensidiga sannolikheten av c2-fördelningen +CHIINV = CHI2INV ## Returnerar inversen av chi2-fördelningen +CHITEST = CHI2TEST ## Returnerar oberoendetesten +CONFIDENCE = KONFIDENS ## Returnerar konfidensintervallet för en populations medelvärde +CORREL = KORREL ## Returnerar korrelationskoefficienten mellan två datamängder +COUNT = ANTAL ## Räknar hur många tal som finns bland argumenten +COUNTA = ANTALV ## Räknar hur många värden som finns bland argumenten +COUNTBLANK = ANTAL.TOMMA ## Räknar antalet tomma celler i ett område +COUNTIF = ANTAL.OM ## Räknar antalet celler i ett område som uppfyller angivna villkor. +COUNTIFS = ANTAL.OMF ## Räknar antalet celler i ett område som uppfyller flera villkor. +COVAR = KOVAR ## Returnerar kovariansen, d.v.s. medelvärdet av produkterna för parade avvikelser +CRITBINOM = KRITBINOM ## Returnerar det minsta värdet för vilket den kumulativa binomialfördelningen är mindre än eller lika med ett villkorsvärde +DEVSQ = KVADAVV ## Returnerar summan av kvadrater på avvikelser +EXPONDIST = EXPONFÖRD ## Returnerar exponentialfördelningen +FDIST = FFÖRD ## Returnerar F-sannolikhetsfördelningen +FINV = FINV ## Returnerar inversen till F-sannolikhetsfördelningen +FISHER = FISHER ## Returnerar Fisher-transformationen +FISHERINV = FISHERINV ## Returnerar inversen till Fisher-transformationen +FORECAST = PREDIKTION ## Returnerar ett värde längs en linjär trendlinje +FREQUENCY = FREKVENS ## Returnerar en frekvensfördelning som en lodrät matris +FTEST = FTEST ## Returnerar resultatet av en F-test +GAMMADIST = GAMMAFÖRD ## Returnerar gammafördelningen +GAMMAINV = GAMMAINV ## Returnerar inversen till den kumulativa gammafördelningen +GAMMALN = GAMMALN ## Returnerar den naturliga logaritmen för gammafunktionen, G(x) +GEOMEAN = GEOMEDEL ## Returnerar det geometriska medelvärdet +GROWTH = EXPTREND ## Returnerar värden längs en exponentiell trend +HARMEAN = HARMMEDEL ## Returnerar det harmoniska medelvärdet +HYPGEOMDIST = HYPGEOMFÖRD ## Returnerar den hypergeometriska fördelningen +INTERCEPT = SKÄRNINGSPUNKT ## Returnerar skärningspunkten för en linjär regressionslinje +KURT = TOPPIGHET ## Returnerar toppigheten av en mängd data +LARGE = STÖRSTA ## Returnerar det n:te största värdet i en mängd data +LINEST = REGR ## Returnerar parametrar till en linjär trendlinje +LOGEST = EXPREGR ## Returnerar parametrarna i en exponentiell trend +LOGINV = LOGINV ## Returnerar inversen till den lognormala fördelningen +LOGNORMDIST = LOGNORMFÖRD ## Returnerar den kumulativa lognormala fördelningen +MAX = MAX ## Returnerar det största värdet i en lista av argument +MAXA = MAXA ## Returnerar det största värdet i en lista av argument, inklusive tal, text och logiska värden +MEDIAN = MEDIAN ## Returnerar medianen för angivna tal +MIN = MIN ## Returnerar det minsta värdet i en lista med argument +MINA = MINA ## Returnerar det minsta värdet i en lista över argument, inklusive tal, text och logiska värden +MODE = TYPVÄRDE ## Returnerar det vanligaste värdet i en datamängd +NEGBINOMDIST = NEGBINOMFÖRD ## Returnerar den negativa binomialfördelningen +NORMDIST = NORMFÖRD ## Returnerar den kumulativa normalfördelningen +NORMINV = NORMINV ## Returnerar inversen till den kumulativa normalfördelningen +NORMSDIST = NORMSFÖRD ## Returnerar den kumulativa standardnormalfördelningen +NORMSINV = NORMSINV ## Returnerar inversen till den kumulativa standardnormalfördelningen +PEARSON = PEARSON ## Returnerar korrelationskoefficienten till Pearsons momentprodukt +PERCENTILE = PERCENTIL ## Returnerar den n:te percentilen av värden i ett område +PERCENTRANK = PROCENTRANG ## Returnerar procentrangen för ett värde i en datamängd +PERMUT = PERMUT ## Returnerar antal permutationer för ett givet antal objekt +POISSON = POISSON ## Returnerar Poisson-fördelningen +PROB = SANNOLIKHET ## Returnerar sannolikheten att värden i ett område ligger mellan två gränser +QUARTILE = KVARTIL ## Returnerar kvartilen av en mängd data +RANK = RANG ## Returnerar rangordningen för ett tal i en lista med tal +RSQ = RKV ## Returnerar kvadraten av Pearsons produktmomentkorrelationskoefficient +SKEW = SNEDHET ## Returnerar snedheten för en fördelning +SLOPE = LUTNING ## Returnerar lutningen på en linjär regressionslinje +SMALL = MINSTA ## Returnerar det n:te minsta värdet i en mängd data +STANDARDIZE = STANDARDISERA ## Returnerar ett normaliserat värde +STDEV = STDAV ## Uppskattar standardavvikelsen baserat på ett urval +STDEVA = STDEVA ## Uppskattar standardavvikelsen baserat på ett urval, inklusive tal, text och logiska värden +STDEVP = STDAVP ## Beräknar standardavvikelsen baserat på hela populationen +STDEVPA = STDEVPA ## Beräknar standardavvikelsen baserat på hela populationen, inklusive tal, text och logiska värden +STEYX = STDFELYX ## Returnerar standardfelet för ett förutspått y-värde för varje x-värde i regressionen +TDIST = TFÖRD ## Returnerar Students t-fördelning +TINV = TINV ## Returnerar inversen till Students t-fördelning +TREND = TREND ## Returnerar värden längs en linjär trend +TRIMMEAN = TRIMMEDEL ## Returnerar medelvärdet av mittpunkterna i en datamängd +TTEST = TTEST ## Returnerar sannolikheten beräknad ur Students t-test +VAR = VARIANS ## Uppskattar variansen baserat på ett urval +VARA = VARA ## Uppskattar variansen baserat på ett urval, inklusive tal, text och logiska värden +VARP = VARIANSP ## Beräknar variansen baserat på hela populationen +VARPA = VARPA ## Beräknar variansen baserat på hela populationen, inklusive tal, text och logiska värden +WEIBULL = WEIBULL ## Returnerar Weibull-fördelningen +ZTEST = ZTEST ## Returnerar det ensidiga sannolikhetsvärdet av ett z-test + + +## +## Text functions Textfunktioner +## +ASC = ASC ## Ändrar helbredds (dubbel byte) engelska bokstäver eller katakana inom en teckensträng till tecken med halvt breddsteg (enkel byte) +BAHTTEXT = BAHTTEXT ## Omvandlar ett tal till text med valutaformatet ß (baht) +CHAR = TECKENKOD ## Returnerar tecknet som anges av kod +CLEAN = STÄDA ## Tar bort alla icke utskrivbara tecken i en text +CODE = KOD ## Returnerar en numerisk kod för det första tecknet i en textsträng +CONCATENATE = SAMMANFOGA ## Sammanfogar flera textdelar till en textsträng +DOLLAR = VALUTA ## Omvandlar ett tal till text med valutaformat +EXACT = EXAKT ## Kontrollerar om två textvärden är identiska +FIND = HITTA ## Hittar en text i en annan (skiljer på gemener och versaler) +FINDB = HITTAB ## Hittar en text i en annan (skiljer på gemener och versaler) +FIXED = FASTTAL ## Formaterar ett tal som text med ett fast antal decimaler +JIS = JIS ## Ändrar halvbredds (enkel byte) engelska bokstäver eller katakana inom en teckensträng till tecken med helt breddsteg (dubbel byte) +LEFT = VÄNSTER ## Returnerar tecken längst till vänster i en sträng +LEFTB = VÄNSTERB ## Returnerar tecken längst till vänster i en sträng +LEN = LÄNGD ## Returnerar antalet tecken i en textsträng +LENB = LÄNGDB ## Returnerar antalet tecken i en textsträng +LOWER = GEMENER ## Omvandlar text till gemener +MID = EXTEXT ## Returnerar angivet antal tecken från en text med början vid den position som du anger +MIDB = EXTEXTB ## Returnerar angivet antal tecken från en text med början vid den position som du anger +PHONETIC = PHONETIC ## Returnerar de fonetiska (furigana) tecknen i en textsträng +PROPER = INITIAL ## Ändrar första bokstaven i varje ord i ett textvärde till versal +REPLACE = ERSÄTT ## Ersätter tecken i text +REPLACEB = ERSÄTTB ## Ersätter tecken i text +REPT = REP ## Upprepar en text ett bestämt antal gånger +RIGHT = HÖGER ## Returnerar tecken längst till höger i en sträng +RIGHTB = HÖGERB ## Returnerar tecken längst till höger i en sträng +SEARCH = SÖK ## Hittar ett textvärde i ett annat (skiljer inte på gemener och versaler) +SEARCHB = SÖKB ## Hittar ett textvärde i ett annat (skiljer inte på gemener och versaler) +SUBSTITUTE = BYT.UT ## Ersätter gammal text med ny text i en textsträng +T = T ## Omvandlar argumenten till text +TEXT = TEXT ## Formaterar ett tal och omvandlar det till text +TRIM = RENSA ## Tar bort blanksteg från text +UPPER = VERSALER ## Omvandlar text till versaler +VALUE = TEXTNUM ## Omvandlar ett textargument till ett tal diff --git a/application/third_party/PHPExcel/PHPExcel/locale/tr/config b/application/third_party/PHPExcel/PHPExcel/locale/tr/config new file mode 100644 index 0000000..b69d425 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/tr/config @@ -0,0 +1,47 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Settings +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## + + +ArgumentSeparator = ; + + +## +## (For future use) +## +currencySymbol = YTL + + +## +## Excel Error Codes (For future use) +## +NULL = #BOŞ! +DIV0 = #SAYI/0! +VALUE = #DEĞER! +REF = #BAŞV! +NAME = #AD? +NUM = #SAYI! +NA = #YOK diff --git a/application/third_party/PHPExcel/PHPExcel/locale/tr/functions b/application/third_party/PHPExcel/PHPExcel/locale/tr/functions new file mode 100644 index 0000000..45d7df1 --- /dev/null +++ b/application/third_party/PHPExcel/PHPExcel/locale/tr/functions @@ -0,0 +1,438 @@ +## +## PHPExcel +## +## Copyright (c) 2006 - 2013 PHPExcel +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; either +## version 2.1 of the License, or (at your option) any later version. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## @category PHPExcel +## @package PHPExcel_Calculation +## @copyright Copyright (c) 2006 - 2013 PHPExcel (http://www.codeplex.com/PHPExcel) +## @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL +## @version ##VERSION##, ##DATE## +## +## Data in this file derived from http://www.piuha.fi/excel-function-name-translation/ +## +## + + +## +## Add-in and Automation functions Eklenti ve Otomasyon fonksiyonları +## +GETPIVOTDATA = ÖZETVERİAL ## Bir Özet Tablo raporunda saklanan verileri verir. + + +## +## Cube functions Küp işlevleri +## +CUBEKPIMEMBER = KÜPKPIÜYE ## Kilit performans göstergesi (KPI-Key Performance Indicator) adını, özelliğini ve ölçüsünü verir ve hücredeki ad ve özelliği gösterir. KPI, bir kurumun performansını izlemek için kullanılan aylık brüt kâr ya da üç aylık çalışan giriş çıkışları gibi ölçülebilen bir birimdir. +CUBEMEMBER = KÜPÜYE ## Bir küp hiyerarşisinde bir üyeyi veya kaydı verir. Üye veya kaydın küpte varolduğunu doğrulamak için kullanılır. +CUBEMEMBERPROPERTY = KÜPÜYEÖZELLİĞİ ## Bir küpte bir üyenin özelliğinin değerini verir. Küp içinde üye adının varlığını doğrulamak ve bu üyenin belli özelliklerini getirmek için kullanılır. +CUBERANKEDMEMBER = KÜPÜYESIRASI ## Bir küme içindeki üyenin derecesini veya kaçıncı olduğunu verir. En iyi satış elemanı, veya en iyi on öğrenci gibi bir kümedeki bir veya daha fazla öğeyi getirmek için kullanılır. +CUBESET = KÜPKÜME ## Kümeyi oluşturan ve ardından bu kümeyi Microsoft Office Excel'e getiren sunucudaki küpe küme ifadelerini göndererek hesaplanan üye veya kayıt kümesini tanımlar. +CUBESETCOUNT = KÜPKÜMESAY ## Bir kümedeki öğelerin sayısını getirir. +CUBEVALUE = KÜPDEĞER ## Bir küpten toplam değeri getirir. + + +## +## Database functions Veritabanı işlevleri +## +DAVERAGE = VSEÇORT ## Seçili veritabanı girdilerinin ortalamasını verir. +DCOUNT = VSEÇSAY ## Veritabanında sayı içeren hücre sayısını hesaplar. +DCOUNTA = VSEÇSAYDOLU ## Veritabanındaki boş olmayan hücreleri sayar. +DGET = VAL ## Veritabanından, belirtilen ölçütlerle eşleşen tek bir rapor çıkarır. +DMAX = VSEÇMAK ## Seçili veritabanı girişlerinin en yüksek değerini verir. +DMIN = VSEÇMİN ## Seçili veritabanı girişlerinin en düşük değerini verir. +DPRODUCT = VSEÇÇARP ## Kayıtların belli bir alanında bulunan, bir veritabanındaki ölçütlerle eşleşen değerleri çarpar. +DSTDEV = VSEÇSTDSAPMA ## Seçili veritabanı girişlerinden oluşan bir örneğe dayanarak, standart sapmayı tahmin eder. +DSTDEVP = VSEÇSTDSAPMAS ## Standart sapmayı, seçili veritabanı girişlerinin tüm popülasyonunu esas alarak hesaplar. +DSUM = VSEÇTOPLA ## Kayıtların alan sütununda bulunan, ölçütle eşleşen sayıları toplar. +DVAR = VSEÇVAR ## Seçili veritabanı girişlerinden oluşan bir örneği esas alarak farkı tahmin eder. +DVARP = VSEÇVARS ## Seçili veritabanı girişlerinin tüm popülasyonunu esas alarak farkı hesaplar. + + +## +## Date and time functions Tarih ve saat işlevleri +## +DATE = TARİH ## Belirli bir tarihin seri numarasını verir. +DATEVALUE = TARİHSAYISI ## Metin biçimindeki bir tarihi seri numarasına dönüştürür. +DAY = GÜN ## Seri numarasını, ayın bir gününe dönüştürür. +DAYS360 = GÜN360 ## İki tarih arasındaki gün sayısını, 360 günlük yılı esas alarak hesaplar. +EDATE = SERİTARİH ## Başlangıç tarihinden itibaren, belirtilen ay sayısından önce veya sonraki tarihin seri numarasını verir. +EOMONTH = SERİAY ## Belirtilen sayıda ay önce veya sonraki ayın son gününün seri numarasını verir. +HOUR = SAAT ## Bir seri numarasını saate dönüştürür. +MINUTE = DAKİKA ## Bir seri numarasını dakikaya dönüştürür. +MONTH = AY ## Bir seri numarasını aya dönüştürür. +NETWORKDAYS = TAMİŞGÜNÜ ## İki tarih arasındaki tam çalışma günlerinin sayısını verir. +NOW = ŞİMDİ ## Geçerli tarihin ve saatin seri numarasını verir. +SECOND = SANİYE ## Bir seri numarasını saniyeye dönüştürür. +TIME = ZAMAN ## Belirli bir zamanın seri numarasını verir. +TIMEVALUE = ZAMANSAYISI ## Metin biçimindeki zamanı seri numarasına dönüştürür. +TODAY = BUGÜN ## Bugünün tarihini seri numarasına dönüştürür. +WEEKDAY = HAFTANINGÜNÜ ## Bir seri numarasını, haftanın gününe dönüştürür. +WEEKNUM = HAFTASAY ## Dizisel değerini, haftanın yıl içinde bulunduğu konumu sayısal olarak gösteren sayıya dönüştürür. +WORKDAY = İŞGÜNÜ ## Belirtilen sayıda çalışma günü öncesinin ya da sonrasının tarihinin seri numarasını verir. +YEAR = YIL ## Bir seri numarasını yıla dönüştürür. +YEARFRAC = YILORAN ## Başlangıç_tarihi ve bitiş_tarihi arasındaki tam günleri gösteren yıl kesrini verir. + + +## +## Engineering functions Mühendislik işlevleri +## +BESSELI = BESSELI ## Değiştirilmiş Bessel fonksiyonu In(x)'i verir. +BESSELJ = BESSELJ ## Bessel fonksiyonu Jn(x)'i verir. +BESSELK = BESSELK ## Değiştirilmiş Bessel fonksiyonu Kn(x)'i verir. +BESSELY = BESSELY ## Bessel fonksiyonu Yn(x)'i verir. +BIN2DEC = BIN2DEC ## İkili bir sayıyı, ondalık sayıya dönüştürür. +BIN2HEX = BIN2HEX ## İkili bir sayıyı, onaltılıya dönüştürür. +BIN2OCT = BIN2OCT ## İkili bir sayıyı, sekizliye dönüştürür. +COMPLEX = KARMAŞIK ## Gerçek ve sanal katsayıları, karmaşık sayıya dönüştürür. +CONVERT = ÇEVİR ## Bir sayıyı, bir ölçüm sisteminden bir başka ölçüm sistemine dönüştürür. +DEC2BIN = DEC2BIN ## Ondalık bir sayıyı, ikiliye dönüştürür. +DEC2HEX = DEC2HEX ## Ondalık bir sayıyı, onaltılıya dönüştürür. +DEC2OCT = DEC2OCT ## Ondalık bir sayıyı sekizliğe dönüştürür. +DELTA = DELTA ## İki değerin eşit olup olmadığını sınar. +ERF = HATAİŞLEV ## Hata işlevini verir. +ERFC = TÜMHATAİŞLEV ## Tümleyici hata işlevini verir. +GESTEP = BESINIR ## Bir sayının eşik değerinden büyük olup olmadığını sınar. +HEX2BIN = HEX2BIN ## Onaltılı bir sayıyı ikiliye dönüştürür. +HEX2DEC = HEX2DEC ## Onaltılı bir sayıyı ondalığa dönüştürür. +HEX2OCT = HEX2OCT ## Onaltılı bir sayıyı sekizliğe dönüştürür. +IMABS = SANMUTLAK ## Karmaşık bir sayının mutlak değerini (modül) verir. +IMAGINARY = SANAL ## Karmaşık bir sayının sanal katsayısını verir. +IMARGUMENT = SANBAĞ_DEĞİŞKEN ## Radyanlarla belirtilen bir açı olan teta bağımsız değişkenini verir. +IMCONJUGATE = SANEŞLENEK ## Karmaşık bir sayının karmaşık eşleniğini verir. +IMCOS = SANCOS ## Karmaşık bir sayının kosinüsünü verir. +IMDIV = SANBÖL ## İki karmaşık sayının bölümünü verir. +IMEXP = SANÜS ## Karmaşık bir sayının üssünü verir. +IMLN = SANLN ## Karmaşık bir sayının doğal logaritmasını verir. +IMLOG10 = SANLOG10 ## Karmaşık bir sayının, 10 tabanında logaritmasını verir. +IMLOG2 = SANLOG2 ## Karmaşık bir sayının 2 tabanında logaritmasını verir. +IMPOWER = SANÜSSÜ ## Karmaşık bir sayıyı, bir tamsayı üssüne yükseltilmiş olarak verir. +IMPRODUCT = SANÇARP ## Karmaşık sayıların çarpımını verir. +IMREAL = SANGERÇEK ## Karmaşık bir sayının, gerçek katsayısını verir. +IMSIN = SANSIN ## Karmaşık bir sayının sinüsünü verir. +IMSQRT = SANKAREKÖK ## Karmaşık bir sayının karekökünü verir. +IMSUB = SANÇIKAR ## İki karmaşık sayının farkını verir. +IMSUM = SANTOPLA ## Karmaşık sayıların toplamını verir. +OCT2BIN = OCT2BIN ## Sekizli bir sayıyı ikiliye dönüştürür. +OCT2DEC = OCT2DEC ## Sekizli bir sayıyı ondalığa dönüştürür. +OCT2HEX = OCT2HEX ## Sekizli bir sayıyı onaltılıya dönüştürür. + + +## +## Financial functions Finansal fonksiyonlar +## +ACCRINT = GERÇEKFAİZ ## Dönemsel faiz ödeyen hisse senedine ilişkin tahakkuk eden faizi getirir. +ACCRINTM = GERÇEKFAİZV ## Vadesinde ödeme yapan bir tahvilin tahakkuk etmiş faizini verir. +AMORDEGRC = AMORDEGRC ## Yıpranma katsayısı kullanarak her hesap döneminin değer kaybını verir. +AMORLINC = AMORLINC ## Her hesap dönemi içindeki yıpranmayı verir. +COUPDAYBS = KUPONGÜNBD ## Kupon süresinin başlangıcından alış tarihine kadar olan süredeki gün sayısını verir. +COUPDAYS = KUPONGÜN ## Kupon süresindeki, gün sayısını, alış tarihini de içermek üzere, verir. +COUPDAYSNC = KUPONGÜNDSK ## Alış tarihinden bir sonraki kupon tarihine kadar olan gün sayısını verir. +COUPNCD = KUPONGÜNSKT ## Alış tarihinden bir sonraki kupon tarihini verir. +COUPNUM = KUPONSAYI ## Alış tarihiyle vade tarihi arasında ödenecek kuponların sayısını verir. +COUPPCD = KUPONGÜNÖKT ## Alış tarihinden bir önceki kupon tarihini verir. +CUMIPMT = AİÇVERİMORANI ## İki dönem arasında ödenen kümülatif faizi verir. +CUMPRINC = ANA_PARA_ÖDEMESİ ## İki dönem arasında bir borç üzerine ödenen birikimli temeli verir. +DB = AZALANBAKİYE ## Bir malın belirtilen bir süre içindeki yıpranmasını, sabit azalan bakiye yöntemini kullanarak verir. +DDB = ÇİFTAZALANBAKİYE ## Bir malın belirtilen bir süre içindeki yıpranmasını, çift azalan bakiye yöntemi ya da sizin belirttiğiniz başka bir yöntemi kullanarak verir. +DISC = İNDİRİM ## Bir tahvilin indirim oranını verir. +DOLLARDE = LİRAON ## Kesir olarak tanımlanmış lira fiyatını, ondalık sayı olarak tanımlanmış lira fiyatına dönüştürür. +DOLLARFR = LİRAKES ## Ondalık sayı olarak tanımlanmış lira fiyatını, kesir olarak tanımlanmış lira fiyatına dönüştürür. +DURATION = SÜRE ## Belli aralıklarla faiz ödemesi yapan bir tahvilin yıllık süresini verir. +EFFECT = ETKİN ## Efektif yıllık faiz oranını verir. +FV = ANBD ## Bir yatırımın gelecekteki değerini verir. +FVSCHEDULE = GDPROGRAM ## Bir seri birleşik faiz oranı uyguladıktan sonra, bir başlangıçtaki anaparanın gelecekteki değerini verir. +INTRATE = FAİZORANI ## Tam olarak yatırım yapılmış bir tahvilin faiz oranını verir. +IPMT = FAİZTUTARI ## Bir yatırımın verilen bir süre için faiz ödemesini verir. +IRR = İÇ_VERİM_ORANI ## Bir para akışı serisi için, iç verim oranını verir. +ISPMT = ISPMT ## Yatırımın belirli bir dönemi boyunca ödenen faizi hesaplar. +MDURATION = MSÜRE ## Varsayılan par değeri 10.000.000 lira olan bir tahvil için Macauley değiştirilmiş süreyi verir. +MIRR = D_İÇ_VERİM_ORANI ## Pozitif ve negatif para akışlarının farklı oranlarda finanse edildiği durumlarda, iç verim oranını verir. +NOMINAL = NOMİNAL ## Yıllık nominal faiz oranını verir. +NPER = DÖNEM_SAYISI ## Bir yatırımın dönem sayısını verir. +NPV = NBD ## Bir yatırımın bugünkü net değerini, bir dönemsel para akışları serisine ve bir indirim oranına bağlı olarak verir. +ODDFPRICE = TEKYDEĞER ## Tek bir ilk dönemi olan bir tahvilin değerini, her 100.000.000 lirada bir verir. +ODDFYIELD = TEKYÖDEME ## Tek bir ilk dönemi olan bir tahvilin ödemesini verir. +ODDLPRICE = TEKSDEĞER ## Tek bir son dönemi olan bir tahvilin fiyatını her 10.000.000 lirada bir verir. +ODDLYIELD = TEKSÖDEME ## Tek bir son dönemi olan bir tahvilin ödemesini verir. +PMT = DEVRESEL_ÖDEME ## Bir yıllık dönemsel ödemeyi verir. +PPMT = ANA_PARA_ÖDEMESİ ## Verilen bir süre için, bir yatırımın anaparasına dayanan ödemeyi verir. +PRICE = DEĞER ## Dönemsel faiz ödeyen bir tahvilin fiyatını 10.000.00 liralık değer başına verir. +PRICEDISC = DEĞERİND ## İndirimli bir tahvilin fiyatını 10.000.000 liralık nominal değer başına verir. +PRICEMAT = DEĞERVADE ## Faizini vade sonunda ödeyen bir tahvilin fiyatını 10.000.000 nominal değer başına verir. +PV = BD ## Bir yatırımın bugünkü değerini verir. +RATE = FAİZ_ORANI ## Bir yıllık dönem başına düşen faiz oranını verir. +RECEIVED = GETİRİ ## Tam olarak yatırılmış bir tahvilin vadesinin bitiminde alınan miktarı verir. +SLN = DA ## Bir malın bir dönem içindeki doğrusal yıpranmasını verir. +SYD = YAT ## Bir malın belirli bir dönem için olan amortismanını verir. +TBILLEQ = HTAHEŞ ## Bir Hazine bonosunun bono eşdeğeri ödemesini verir. +TBILLPRICE = HTAHDEĞER ## Bir Hazine bonosunun değerini, 10.000.000 liralık nominal değer başına verir. +TBILLYIELD = HTAHÖDEME ## Bir Hazine bonosunun ödemesini verir. +VDB = DAB ## Bir malın amortismanını, belirlenmiş ya da kısmi bir dönem için, bir azalan bakiye yöntemi kullanarak verir. +XIRR = AİÇVERİMORANI ## Dönemsel olması gerekmeyen bir para akışları programı için, iç verim oranını verir. +XNPV = ANBD ## Dönemsel olması gerekmeyen bir para akışları programı için, bugünkü net değeri verir. +YIELD = ÖDEME ## Belirli aralıklarla faiz ödeyen bir tahvilin ödemesini verir. +YIELDDISC = ÖDEMEİND ## İndirimli bir tahvilin yıllık ödemesini verir; örneğin, bir Hazine bonosunun. +YIELDMAT = ÖDEMEVADE ## Vadesinin bitiminde faiz ödeyen bir tahvilin yıllık ödemesini verir. + + +## +## Information functions Bilgi fonksiyonları +## +CELL = HÜCRE ## Bir hücrenin biçimlendirmesi, konumu ya da içeriği hakkında bilgi verir. +ERROR.TYPE = HATA.TİPİ ## Bir hata türüne ilişkin sayıları verir. +INFO = BİLGİ ## Geçerli işletim ortamı hakkında bilgi verir. +ISBLANK = EBOŞSA ## Değer boşsa, DOĞRU verir. +ISERR = EHATA ## Değer, #YOK dışındaki bir hata değeriyse, DOĞRU verir. +ISERROR = EHATALIYSA ## Değer, herhangi bir hata değeriyse, DOĞRU verir. +ISEVEN = ÇİFTTİR ## Sayı çiftse, DOĞRU verir. +ISLOGICAL = EMANTIKSALSA ## Değer, mantıksal bir değerse, DOĞRU verir. +ISNA = EYOKSA ## Değer, #YOK hata değeriyse, DOĞRU verir. +ISNONTEXT = EMETİNDEĞİLSE ## Değer, metin değilse, DOĞRU verir. +ISNUMBER = ESAYIYSA ## Değer, bir sayıysa, DOĞRU verir. +ISODD = TEKTİR ## Sayı tekse, DOĞRU verir. +ISREF = EREFSE ## Değer bir başvuruysa, DOĞRU verir. +ISTEXT = EMETİNSE ## Değer bir metinse DOĞRU verir. +N = N ## Sayıya dönüştürülmüş bir değer verir. +NA = YOKSAY ## #YOK hata değerini verir. +TYPE = TİP ## Bir değerin veri türünü belirten bir sayı verir. + + +## +## Logical functions Mantıksal fonksiyonlar +## +AND = VE ## Bütün bağımsız değişkenleri DOĞRU ise, DOĞRU verir. +FALSE = YANLIŞ ## YANLIŞ mantıksal değerini verir. +IF = EĞER ## Gerçekleştirilecek bir mantıksal sınama belirtir. +IFERROR = EĞERHATA ## Formül hatalıysa belirttiğiniz değeri verir; bunun dışındaki durumlarda formülün sonucunu verir. +NOT = DEĞİL ## Bağımsız değişkeninin mantığını tersine çevirir. +OR = YADA ## Bağımsız değişkenlerden herhangi birisi DOĞRU ise, DOĞRU verir. +TRUE = DOĞRU ## DOĞRU mantıksal değerini verir. + + +## +## Lookup and reference functions Arama ve Başvuru fonksiyonları +## +ADDRESS = ADRES ## Bir başvuruyu, çalışma sayfasındaki tek bir hücreye metin olarak verir. +AREAS = ALANSAY ## Renvoie le nombre de zones dans une référence. +CHOOSE = ELEMAN ## Değerler listesinden bir değer seçer. +COLUMN = SÜTUN ## Bir başvurunun sütun sayısını verir. +COLUMNS = SÜTUNSAY ## Bir başvurudaki sütunların sayısını verir. +HLOOKUP = YATAYARA ## Bir dizinin en üst satırına bakar ve belirtilen hücrenin değerini verir. +HYPERLINK = KÖPRÜ ## Bir ağ sunucusunda, bir intranette ya da Internet'te depolanan bir belgeyi açan bir kısayol ya da atlama oluşturur. +INDEX = İNDİS ## Başvurudan veya diziden bir değer seçmek için, bir dizin kullanır. +INDIRECT = DOLAYLI ## Metin değeriyle belirtilen bir başvuru verir. +LOOKUP = ARA ## Bir vektördeki veya dizideki değerleri arar. +MATCH = KAÇINCI ## Bir başvurudaki veya dizideki değerleri arar. +OFFSET = KAYDIR ## Verilen bir başvurudan, bir başvuru kaydırmayı verir. +ROW = SATIR ## Bir başvurunun satır sayısını verir. +ROWS = SATIRSAY ## Bir başvurudaki satırların sayısını verir. +RTD = RTD ## COM otomasyonunu destekleyen programdan gerçek zaman verileri alır. +TRANSPOSE = DEVRİK_DÖNÜŞÜM ## Bir dizinin devrik dönüşümünü verir. +VLOOKUP = DÜŞEYARA ## Bir dizinin ilk sütununa bakar ve bir hücrenin değerini vermek için satır boyunca hareket eder. + + +## +## Math and trigonometry functions Matematik ve trigonometri fonksiyonları +## +ABS = MUTLAK ## Bir sayının mutlak değerini verir. +ACOS = ACOS ## Bir sayının ark kosinüsünü verir. +ACOSH = ACOSH ## Bir sayının ters hiperbolik kosinüsünü verir. +ASIN = ASİN ## Bir sayının ark sinüsünü verir. +ASINH = ASİNH ## Bir sayının ters hiperbolik sinüsünü verir. +ATAN = ATAN ## Bir sayının ark tanjantını verir. +ATAN2 = ATAN2 ## Ark tanjantı, x- ve y- koordinatlarından verir. +ATANH = ATANH ## Bir sayının ters hiperbolik tanjantını verir. +CEILING = TAVANAYUVARLA ## Bir sayıyı, en yakın tamsayıya ya da en yakın katına yuvarlar. +COMBIN = KOMBİNASYON ## Verilen sayıda öğenin kombinasyon sayısını verir. +COS = COS ## Bir sayının kosinüsünü verir. +COSH = COSH ## Bir sayının hiperbolik kosinüsünü verir. +DEGREES = DERECE ## Radyanları dereceye dönüştürür. +EVEN = ÇİFT ## Bir sayıyı, en yakın daha büyük çift tamsayıya yuvarlar. +EXP = ÜS ## e'yi, verilen bir sayının üssüne yükseltilmiş olarak verir. +FACT = ÇARPINIM ## Bir sayının faktörünü verir. +FACTDOUBLE = ÇİFTFAKTÖR ## Bir sayının çift çarpınımını verir. +FLOOR = TABANAYUVARLA ## Bir sayıyı, daha küçük sayıya, sıfıra yakınsayarak yuvarlar. +GCD = OBEB ## En büyük ortak böleni verir. +INT = TAMSAYI ## Bir sayıyı aşağıya doğru en yakın tamsayıya yuvarlar. +LCM = OKEK ## En küçük ortak katı verir. +LN = LN ## Bir sayının doğal logaritmasını verir. +LOG = LOG ## Bir sayının, belirtilen bir tabandaki logaritmasını verir. +LOG10 = LOG10 ## Bir sayının 10 tabanında logaritmasını verir. +MDETERM = DETERMİNANT ## Bir dizinin dizey determinantını verir. +MINVERSE = DİZEY_TERS ## Bir dizinin dizey tersini verir. +MMULT = DÇARP ## İki dizinin dizey çarpımını verir. +MOD = MODÜLO ## Bölmeden kalanı verir. +MROUND = KYUVARLA ## İstenen kata yuvarlanmış bir sayı verir. +MULTINOMIAL = ÇOKTERİMLİ ## Bir sayılar kümesinin çok terimlisini verir. +ODD = TEK ## Bir sayıyı en yakın daha büyük tek sayıya yuvarlar. +PI = Pİ ## Pi değerini verir. +POWER = KUVVET ## Bir üsse yükseltilmiş sayının sonucunu verir. +PRODUCT = ÇARPIM ## Bağımsız değişkenlerini çarpar. +QUOTIENT = BÖLÜM ## Bir bölme işleminin tamsayı kısmını verir. +RADIANS = RADYAN ## Dereceleri radyanlara dönüştürür. +RAND = S_SAYI_ÜRET ## 0 ile 1 arasında rastgele bir sayı verir. +RANDBETWEEN = RASTGELEARALIK ## Belirttiğiniz sayılar arasında rastgele bir sayı verir. +ROMAN = ROMEN ## Bir normal rakamı, metin olarak, romen rakamına çevirir. +ROUND = YUVARLA ## Bir sayıyı, belirtilen basamak sayısına yuvarlar. +ROUNDDOWN = AŞAĞIYUVARLA ## Bir sayıyı, daha küçük sayıya, sıfıra yakınsayarak yuvarlar. +ROUNDUP = YUKARIYUVARLA ## Bir sayıyı daha büyük sayıya, sıfırdan ıraksayarak yuvarlar. +SERIESSUM = SERİTOPLA ## Bir üs serisinin toplamını, formüle bağlı olarak verir. +SIGN = İŞARET ## Bir sayının işaretini verir. +SIN = SİN ## Verilen bir açının sinüsünü verir. +SINH = SİNH ## Bir sayının hiperbolik sinüsünü verir. +SQRT = KAREKÖK ## Pozitif bir karekök verir. +SQRTPI = KAREKÖKPİ ## (* Pi sayısının) kare kökünü verir. +SUBTOTAL = ALTTOPLAM ## Bir listedeki ya da veritabanındaki bir alt toplamı verir. +SUM = TOPLA ## Bağımsız değişkenlerini toplar. +SUMIF = ETOPLA ## Verilen ölçütle belirlenen hücreleri toplar. +SUMIFS = SUMIFS ## Bir aralıktaki, birden fazla ölçüte uyan hücreleri ekler. +SUMPRODUCT = TOPLA.ÇARPIM ## İlişkili dizi bileşenlerinin çarpımlarının toplamını verir. +SUMSQ = TOPKARE ## Bağımsız değişkenlerin karelerinin toplamını verir. +SUMX2MY2 = TOPX2EY2 ## İki dizideki ilişkili değerlerin farkının toplamını verir. +SUMX2PY2 = TOPX2AY2 ## İki dizideki ilişkili değerlerin karelerinin toplamının toplamını verir. +SUMXMY2 = TOPXEY2 ## İki dizideki ilişkili değerlerin farklarının karelerinin toplamını verir. +TAN = TAN ## Bir sayının tanjantını verir. +TANH = TANH ## Bir sayının hiperbolik tanjantını verir. +TRUNC = NSAT ## Bir sayının, tamsayı durumuna gelecek şekilde, fazlalıklarını atar. + + +## +## Statistical functions İstatistiksel fonksiyonlar +## +AVEDEV = ORTSAP ## Veri noktalarının ortalamalarından mutlak sapmalarının ortalamasını verir. +AVERAGE = ORTALAMA ## Bağımsız değişkenlerinin ortalamasını verir. +AVERAGEA = ORTALAMAA ## Bağımsız değişkenlerinin, sayılar, metin ve mantıksal değerleri içermek üzere ortalamasını verir. +AVERAGEIF = EĞERORTALAMA ## Verili ölçütü karşılayan bir aralıktaki bütün hücrelerin ortalamasını (aritmetik ortalama) hesaplar. +AVERAGEIFS = EĞERLERORTALAMA ## Birden çok ölçüte uyan tüm hücrelerin ortalamasını (aritmetik ortalama) hesaplar. +BETADIST = BETADAĞ ## Beta birikimli dağılım fonksiyonunu verir. +BETAINV = BETATERS ## Belirli bir beta dağılımı için birikimli dağılım fonksiyonunun tersini verir. +BINOMDIST = BİNOMDAĞ ## Tek terimli binom dağılımı olasılığını verir. +CHIDIST = KİKAREDAĞ ## Kikare dağılımın tek kuyruklu olasılığını verir. +CHIINV = KİKARETERS ## Kikare dağılımın kuyruklu olasılığının tersini verir. +CHITEST = KİKARETEST ## Bağımsızlık sınamalarını verir. +CONFIDENCE = GÜVENİRLİK ## Bir popülasyon ortalaması için güvenirlik aralığını verir. +CORREL = KORELASYON ## İki veri kümesi arasındaki bağlantı katsayısını verir. +COUNT = BAĞ_DEĞ_SAY ## Bağımsız değişkenler listesinde kaç tane sayı bulunduğunu sayar. +COUNTA = BAĞ_DEĞ_DOLU_SAY ## Bağımsız değişkenler listesinde kaç tane değer bulunduğunu sayar. +COUNTBLANK = BOŞLUKSAY ## Aralıktaki boş hücre sayısını hesaplar. +COUNTIF = EĞERSAY ## Verilen ölçütlere uyan bir aralık içindeki hücreleri sayar. +COUNTIFS = ÇOKEĞERSAY ## Birden çok ölçüte uyan bir aralık içindeki hücreleri sayar. +COVAR = KOVARYANS ## Eşleştirilmiş sapmaların ortalaması olan kovaryansı verir. +CRITBINOM = KRİTİKBİNOM ## Birikimli binom dağılımının bir ölçüt değerinden küçük veya ölçüt değerine eşit olduğu en küçük değeri verir. +DEVSQ = SAPKARE ## Sapmaların karelerinin toplamını verir. +EXPONDIST = ÜSTELDAĞ ## Üstel dağılımı verir. +FDIST = FDAĞ ## F olasılık dağılımını verir. +FINV = FTERS ## F olasılık dağılımının tersini verir. +FISHER = FISHER ## Fisher dönüşümünü verir. +FISHERINV = FISHERTERS ## Fisher dönüşümünün tersini verir. +FORECAST = TAHMİN ## Bir doğrusal eğilim boyunca bir değer verir. +FREQUENCY = SIKLIK ## Bir sıklık dağılımını, dikey bir dizi olarak verir. +FTEST = FTEST ## Bir F-test'in sonucunu verir. +GAMMADIST = GAMADAĞ ## Gama dağılımını verir. +GAMMAINV = GAMATERS ## Gama kümülatif dağılımının tersini verir. +GAMMALN = GAMALN ## Gama fonksiyonunun (?(x)) doğal logaritmasını verir. +GEOMEAN = GEOORT ## Geometrik ortayı verir. +GROWTH = BÜYÜME ## Üstel bir eğilim boyunca değerler verir. +HARMEAN = HARORT ## Harmonik ortayı verir. +HYPGEOMDIST = HİPERGEOMDAĞ ## Hipergeometrik dağılımı verir. +INTERCEPT = KESMENOKTASI ## Doğrusal çakıştırma çizgisinin kesişme noktasını verir. +KURT = BASIKLIK ## Bir veri kümesinin basıklığını verir. +LARGE = BÜYÜK ## Bir veri kümesinde k. en büyük değeri verir. +LINEST = DOT ## Doğrusal bir eğilimin parametrelerini verir. +LOGEST = LOT ## Üstel bir eğilimin parametrelerini verir. +LOGINV = LOGTERS ## Bir lognormal dağılımının tersini verir. +LOGNORMDIST = LOGNORMDAĞ ## Birikimli lognormal dağılımını verir. +MAX = MAK ## Bir bağımsız değişkenler listesindeki en büyük değeri verir. +MAXA = MAKA ## Bir bağımsız değişkenler listesindeki, sayılar, metin ve mantıksal değerleri içermek üzere, en büyük değeri verir. +MEDIAN = ORTANCA ## Belirtilen sayıların orta değerini verir. +MIN = MİN ## Bir bağımsız değişkenler listesindeki en küçük değeri verir. +MINA = MİNA ## Bir bağımsız değişkenler listesindeki, sayılar, metin ve mantıksal değerleri de içermek üzere, en küçük değeri verir. +MODE = ENÇOK_OLAN ## Bir veri kümesindeki en sık rastlanan değeri verir. +NEGBINOMDIST = NEGBİNOMDAĞ ## Negatif binom dağılımını verir. +NORMDIST = NORMDAĞ ## Normal birikimli dağılımı verir. +NORMINV = NORMTERS ## Normal kümülatif dağılımın tersini verir. +NORMSDIST = NORMSDAĞ ## Standart normal birikimli dağılımı verir. +NORMSINV = NORMSTERS ## Standart normal birikimli dağılımın tersini verir. +PEARSON = PEARSON ## Pearson çarpım moment korelasyon katsayısını verir. +PERCENTILE = YÜZDEBİRLİK ## Bir aralık içerisinde bulunan değerlerin k. frekans toplamını verir. +PERCENTRANK = YÜZDERANK ## Bir veri kümesindeki bir değerin yüzde mertebesini verir. +PERMUT = PERMÜTASYON ## Verilen sayıda nesne için permütasyon sayısını verir. +POISSON = POISSON ## Poisson dağılımını verir. +PROB = OLASILIK ## Bir aralıktaki değerlerin iki sınır arasında olması olasılığını verir. +QUARTILE = DÖRTTEBİRLİK ## Bir veri kümesinin dörtte birliğini verir. +RANK = RANK ## Bir sayılar listesinde bir sayının mertebesini verir. +RSQ = RKARE ## Pearson çarpım moment korelasyon katsayısının karesini verir. +SKEW = ÇARPIKLIK ## Bir dağılımın çarpıklığını verir. +SLOPE = EĞİM ## Doğrusal çakışma çizgisinin eğimini verir. +SMALL = KÜÇÜK ## Bir veri kümesinde k. en küçük değeri verir. +STANDARDIZE = STANDARTLAŞTIRMA ## Normalleştirilmiş bir değer verir. +STDEV = STDSAPMA ## Bir örneğe dayanarak standart sapmayı tahmin eder. +STDEVA = STDSAPMAA ## Standart sapmayı, sayılar, metin ve mantıksal değerleri içermek üzere, bir örneğe bağlı olarak tahmin eder. +STDEVP = STDSAPMAS ## Standart sapmayı, tüm popülasyona bağlı olarak hesaplar. +STDEVPA = STDSAPMASA ## Standart sapmayı, sayılar, metin ve mantıksal değerleri içermek üzere, tüm popülasyona bağlı olarak hesaplar. +STEYX = STHYX ## Regresyondaki her x için tahmini y değerinin standart hatasını verir. +TDIST = TDAĞ ## T-dağılımını verir. +TINV = TTERS ## T-dağılımının tersini verir. +TREND = EĞİLİM ## Doğrusal bir eğilim boyunca değerler verir. +TRIMMEAN = KIRPORTALAMA ## Bir veri kümesinin içinin ortalamasını verir. +TTEST = TTEST ## T-test'le ilişkilendirilmiş olasılığı verir. +VAR = VAR ## Varyansı, bir örneğe bağlı olarak tahmin eder. +VARA = VARA ## Varyansı, sayılar, metin ve mantıksal değerleri içermek üzere, bir örneğe bağlı olarak tahmin eder. +VARP = VARS ## Varyansı, tüm popülasyona dayanarak hesaplar. +VARPA = VARSA ## Varyansı, sayılar, metin ve mantıksal değerleri içermek üzere, tüm popülasyona bağlı olarak hesaplar. +WEIBULL = WEIBULL ## Weibull dağılımını hesaplar. +ZTEST = ZTEST ## Z-testinin tek kuyruklu olasılık değerini hesaplar. + + +## +## Text functions Metin fonksiyonları +## +ASC = ASC ## Bir karakter dizesindeki çift enli (iki bayt) İngilizce harfleri veya katakanayı yarım enli (tek bayt) karakterlerle değiştirir. +BAHTTEXT = BAHTTEXT ## Sayıyı, ß (baht) para birimi biçimini kullanarak metne dönüştürür. +CHAR = DAMGA ## Kod sayısıyla belirtilen karakteri verir. +CLEAN = TEMİZ ## Metindeki bütün yazdırılamaz karakterleri kaldırır. +CODE = KOD ## Bir metin dizesindeki ilk karakter için sayısal bir kod verir. +CONCATENATE = BİRLEŞTİR ## Pek çok metin öğesini bir metin öğesi olarak birleştirir. +DOLLAR = LİRA ## Bir sayıyı YTL (yeni Türk lirası) para birimi biçimini kullanarak metne dönüştürür. +EXACT = ÖZDEŞ ## İki metin değerinin özdeş olup olmadığını anlamak için, değerleri denetler. +FIND = BUL ## Bir metin değerini, bir başkasının içinde bulur (büyük küçük harf duyarlıdır). +FINDB = BULB ## Bir metin değerini, bir başkasının içinde bulur (büyük küçük harf duyarlıdır). +FIXED = SAYIDÜZENLE ## Bir sayıyı, sabit sayıda ondalıkla, metin olarak biçimlendirir. +JIS = JIS ## Bir karakter dizesindeki tek enli (tek bayt) İngilizce harfleri veya katakanayı çift enli (iki bayt) karakterlerle değiştirir. +LEFT = SOL ## Bir metin değerinden en soldaki karakterleri verir. +LEFTB = SOLB ## Bir metin değerinden en soldaki karakterleri verir. +LEN = UZUNLUK ## Bir metin dizesindeki karakter sayısını verir. +LENB = UZUNLUKB ## Bir metin dizesindeki karakter sayısını verir. +LOWER = KÜÇÜKHARF ## Metni küçük harfe çevirir. +MID = ORTA ## Bir metin dizesinden belirli sayıda karakteri, belirttiğiniz konumdan başlamak üzere verir. +MIDB = ORTAB ## Bir metin dizesinden belirli sayıda karakteri, belirttiğiniz konumdan başlamak üzere verir. +PHONETIC = SES ## Metin dizesinden ses (furigana) karakterlerini ayıklar. +PROPER = YAZIM.DÜZENİ ## Bir metin değerinin her bir sözcüğünün ilk harfini büyük harfe çevirir. +REPLACE = DEĞİŞTİR ## Metnin içindeki karakterleri değiştirir. +REPLACEB = DEĞİŞTİRB ## Metnin içindeki karakterleri değiştirir. +REPT = YİNELE ## Metni belirtilen sayıda yineler. +RIGHT = SAĞ ## Bir metin değerinden en sağdaki karakterleri verir. +RIGHTB = SAĞB ## Bir metin değerinden en sağdaki karakterleri verir. +SEARCH = BUL ## Bir metin değerini, bir başkasının içinde bulur (büyük küçük harf duyarlı değildir). +SEARCHB = BULB ## Bir metin değerini, bir başkasının içinde bulur (büyük küçük harf duyarlı değildir). +SUBSTITUTE = YERİNEKOY ## Bir metin dizesinde, eski metnin yerine yeni metin koyar. +T = M ## Bağımsız değerlerini metne dönüştürür. +TEXT = METNEÇEVİR ## Bir sayıyı biçimlendirir ve metne dönüştürür. +TRIM = KIRP ## Metindeki boşlukları kaldırır. +UPPER = BÜYÜKHARF ## Metni büyük harfe çevirir. +VALUE = SAYIYAÇEVİR ## Bir metin bağımsız değişkenini sayıya dönüştürür. diff --git a/application/third_party/index.html b/application/third_party/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/application/third_party/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/application/third_party/mpdf/CHANGELOG.txt b/application/third_party/mpdf/CHANGELOG.txt new file mode 100644 index 0000000..1f15f5e --- /dev/null +++ b/application/third_party/mpdf/CHANGELOG.txt @@ -0,0 +1,2895 @@ +=========================== +mPDF 5.7 +14/07/2013 +=========================== + +Files changed +------------- +config.php +mpdf.php +classes/tocontents.php +classes/cssmgr.php +classes/svg.php +includes/functions.php +includes/out.php +examples/formsubmit.php [Important - Security update] + +Updated Example Files in /examples/ +----------------------------------- +All example files +mpdfstyleA4.css + + +config.php +---------- +Removed: + $this->hyphenateTables + $this->hyphenate + $this->orphansAllowed +Edited: + "hyphens: manual" - Added to $this->defaultCSS + $this->allowedCSStags now includes '|TEXTCIRCLE|DOTTAB' +New: + $this->decimal_align = array('DP'=>'.', 'DC'=>',', 'DM'=>"\xc2\xb7", 'DA'=>"\xd9\xab", 'DD'=>'-'); + $this->h2toc = array('H1'=>0, 'H2'=>1, 'H3'=>2); + $this->h2bookmarks = array('H1'=>0, 'H2'=>1, 'H3'=>2); + $this->CJKforceend = false; // Forces overflowng punctuation to hang outside right margin (used with CJK script) + + +Backwards compatability +----------------------- +Changes in mPDF 5.7 may cause some changes to the way your documents appear. There are two main differences: +1) Hyphenation. To retain appearance compatible with earlier versions, set the CSS property "hyphens: auto" whenever + you previously used $mpdf->hyphenate=true; +2) Table of Contents - appearance can now be controlled with CSS styles. By default, in mPDF 5.7, no styling is applied so you will get: + - No indent (previous default of 5mm) - ($tocindent is ignored) + - Any font, font-size set ($tocfont or $tocfontsize) will not work + - HyperLinks will appear with your default appearance - usually blue and underlined + - line spacing will be narrower (can use line-height or margin-top in CSS) + + +New features / Improvements +--------------------------- +Layout of Table of Content ToC now controlled using CSS styles +Text alignment on decimal mark inside tables +Automatically generated bookmarks and/or ToC entries from H1 - H6 tags +Support for unit of "rem" as size e.g. font-size: 1rem; +Origin and clipping for background images and gradients controlled by CSS i.e. background-origin, background-size, background-clip +Text-outline controlled by CSS (compatible with CSS3 spec.) +Use of <dottab> enhanced by custom CSS "outdent" property +Image HTML attributes <img> added: max-height, max-width, min-height and min-width +Spotcolor can now be defined as it is used e.g. color: spot(PANTONE 534 EC, 100%, 85, 65, 47, 9); +Lists - added support for "start" attribute in <ol> e.g. <ol start="5"> +Hyphenation controlled using CSS, consistent with CSS3 spec. +Line breaking improved to avoid breaks within words where HTML tags are used e.g. H<sub>2<sub>0 +Line breaking in CJK scripts improved (and ability to force hanging punctuation) +Numerals in a CJK script are kept together +RTL improved support for phrases containing numerals and \ and / +Bidi override codes supported - Right-to-Left Embedding [RLE] U+202B, Left-to-Right Embedding [LRE] U+202A, + U+202C POP DIRECTIONAL FORMATTING (PDF) +Support for <base href=""> in HTML - uses it to SetBasePath for relative URLs. +HTML tag - added support for <wbr> or <wbr /> - converted to a soft-hyphen +CSS now takes precedence over HTML attribute e.g. <table bgcolor="black" style="background-color:yellow"> + + + +Added CSS support +----------------- +- max-height, max-width, min-height and min-width for images <img> +- "hyphens: none|manual|auto" as per CSS3 spec. +- Decimal mark alignment e.g. text-align: "." center; +- "rem" accepted as a valid (font)size in CSS e.g. font-size: 1.5rem +- text-outline, text-outline-width and text-outline-color supported everywhere except in tables (blur not supported) +- background-origin, background-size, background-clip are now supported everywhere except in tables +- "visibility: hidden|visible|printonly|screenonly" for inline elements e.g. <span> +- Colors: device-cmyk(c,m,y,k) as per CSS3 spec. For consistency, device-cmyka also supported (not CSS3 spec) +- "z-index" can be used to utilise layers in the PDF document +- Custom CSS property added: "outdent" - opposite of indent + +The HTML elements <dottab> and <textcircle> can now have CSS properties applied to them. + + +Bug fixes +--------- +- SVG images - path including e.g. 1.234E-15 incorrectly parsed (not recognising capital E) +- Tables - if a table starts when the Y position on page is below bottom margin caused endless loop +- Float-ing DIVs - starting a float at bottom of page and it causes page break before anything output, second new page is forced +- Tables - Warning notice now given in Table footer or header if <tfoot> placed after <tbody> and table spans page +- Columns - block with border-width wider than the length of the border line, line overflows +- Columns - block with no padding containing a block with borders but no backgound colour, borders not printed +- Table in Columns - when background color set by surrounding block element - colour missing for height of half bottom border. +- TOCpagebreakByArray() when called by function was not adding the pagebreak +- Border around block element - dashed not showing correctly (not resetting linewidth between different edges) +- Double border in table - when background colour set in surrounding block element - shows as black line between the 2 bits of double +- Borders around DIVs - "double" border problem if not all 4 sides equally - fixed +- Borders around DIVs - solid (and double) borders overlap as in tables - now fixed so mitred joins as in browser + [Inadvertently improves borders in Columns because of change in LineCap] +- Page numbering - $mpdf->pagenumSuffix etc not suppressed in HTML headers/footers if number suppressed +- Page numbering - Page number total {nbpg} incorrect - e.g. showing decreasing numbers through document, when ToC present +- RTL numerals - incorrectly reversing a number followed by a comma +- Transform to uppercase/lowercase not working for chars > ASCII 128 when using core fonts +- TOCpagebreak - Not setting TOC-FOOTER +- TOCpagebreak - toc-even-header-name etc. not working +- Parsing some relative URLs incorrectly +- Textcircle - when moved to next page by "page-break-inside: avoid" +- Bookmarks will now work if jump more than one level e.g. 0,2,1 Inserts a new blank entry at level 1 +- Paths to img or stylesheets - incorrectly reading "//www.domain.com" i.e. when starting with two / +- data:image as background url() - incorrectly adjusting path on server if MPDF_PATH not specified (included in release mPDF 5.6.1) +- Image problem if spaces or commas in path using http:// URL (included in release mPDF 5.6.1) +- Image URL parsing rewritten to handle both urlencoded URLs and not urlencoded (included in release mPDF 5.6.1) +- <dottab> fixed to allow color, font-size and font-family to be correctly used, avoid dots being moved to new page, and to work in RTL +- Table {colsum} summed figures in table header +- list-style-type (custom) colour not working +- <tocpagebreak> toc-preHTML and toc-postHTML can now contain quotes + + + +=========================== +mPDF 5.6 +20/01/2013 +=========================== + +Files changed +------------- +mpdf.php +config.php +includes/functions.php +classes/meter.php +classes/directw.php + + +config.php changes +------------------ +$this->allowedCSStags - added HTML5 tags + textcircle AND +$this->outerblocktags - added HTML5 tags +$this->defaultCSS - added default CSS properties + + +New features / Improvements +--------------------------- +CSS support added for for min-height, min-width, max-height and max-width in <img> + +Images embedded in CSS + <img src="data:image/gif;base64,...."> improved to make it more robust, and + background: url(data:image... now added to work + +HTML5 tags supported +- as generic block elements: <article><aside><details><figure><figcaption><footer><header><hgroup><nav><section><summary> +- as in-line elements: <mark><time><meter><progress> +- <mark> has a default CSS set in config.php to yellow highlight +- <meter> and <progress> support attributes as for HTML5 +- custom appearances for <meter> and <progress> can be made by editing classes/meter.php file +- <meter> and <progress> suppress text inside the tags + +Textcircle/Circular +font: "auto" added: automatically sizes text to fill semicircle (if both set) or full circle (if only one set) + NB for this AND ALL CSS on <textcircle>: does not inherit CSS styles +attribute: divider="[characters including HTML entities]" added +<textcircle r="30mm" top-text="Text Circular Text Circular" bottom-text="Text Circular Text Circular" + divider="&nbsp;&bull;&nbsp;" style="font-size: auto" /> + +&raquo; &rsquo; &sbquo; &bdquo; are now included in "orphan"-management at the end of lines + +Improved CJK line wrapping (if CJK character at end of line, breaks there rather than previous wordspace) + +NB mPDF 5.5 added support for <fieldset> and <legend> (omitted from ChangeLog) + +Bug fixes +--------- +- embedded fonts: Panose string incorrectly output as decimals - changed to hexadecimal + Only a problem in limited circumstances. + *****Need to delete all ttfontdata/ files in order for fix to have effect. +- <textCircle> background white even when set to none/transparent +- border="0" causing mPDF to add border to table CELLS as well as table +- iteration counter in THEAD crashed in some circumstances +- CSS color now supports spaces in the rgb() format e.g. border: 1px solid rgb(170, 170, 170); +- CJK not working in table following changes made in v5.4 +- images fixed to work with Google Chart API (now mPDF does not urldecode the query part of the src) +- CSS <style> within HTML page crashed if CSS is too large (? > 32Kb) +- SVG image nested int eht HTML failed to show if code too large (? > 32Kb) +- cyrillic character p &#1088; at end of table cell caused cell height to be incorrectly calculated + + +=========================== +mPDF 5.5 +02/03/2012 +=========================== + +Files changed +------------- +mpdf.php +classes/ttfontsuni.php +classes/svg.php +classes/tocontents.php +config.php +config_fonts.php +utils/font_collections.php +utils/font_coverage.php +utils/font_dump.php + +Files added +----------- +classes/ttfontsuni_analysis.php + +config.php changes +------------------ +To avoid just the border/background-color of the (empty) end of a block being moved on to next page (</div></div>) +$this->margBuffer = 0; // Allow an (empty) end of block to extend beyond the bottom margin by this amount (mm) + +config_fonts.php changes +------------------------ +Added to (arabic) fonts to allow "use non-mapped Arabic Glyphs" e.g. for Pashto + 'unAGlyphs' => true, + +Arabic text +----------- +Arabic text (RTL) rewritten with improved support for Pashto/Sindhi/Urdu/Kurdish + Presentation forms added: + U+0649, U+0681, U+0682, U+0685, U+069A-U+069E, U+06A0, U+06A2, U+06A3, U+06A5, U+06AB-U+06AE, + U+06B0-U+06B4, U+06B5-U+06B9, U+06BB, U+06BC, U+06BE, U+06BF, U+06C0, U+06CD, U+06CE, U+06D1, U+06D3, U+0678 + Joining improved: + U+0672, U+0675, U+0676, U+0677, U+0679-U+067D, U+067F, U+0680, U+0683, U+0684, U+0687, U+0687, U+0688-U+0692, + U+0694, U+0695, U+0697, U+0699, U+068F, U+06A1, U+06A4, U+06A6, U+06A7, U+06A8, U+06AA, U+06BA, U+06C2-U+06CB, U+06CF + +Note - +Some characters in Pashto/Sindhi/Urdu/Kurdish do not have Unicode values for the final/initial/medial forms of the characters. +However, some fonts include these characters "un-mapped" to Unicode (including XB Zar and XB Riyaz, which are bundled with mPDF). + 'unAGlyphs' => true, +added to the config_fonts.php file for appropriate fonts will + +This requires the font file to include a Format 2.0 POST table which references the glyphs as e.g. uni067C.med or uni067C.medi: + e.g. XB Riyaz, XB Zar, Arabic Typesetting (MS), Arial (MS) +NB If you want to know if a font file is suitable, you can open a .ttf file in a text editor and search for "uni067C.med" + - if it exists, it may work! +Using "unAGlyphs" forces subsetting of fonts, and will not work with SIP/SMP fonts (using characters beyond the Unicode BMP Plane). + +mPDF maps these characters to part of the Private Use Area allocated by Unicode U+F500-F7FF. This could interfere with correct use + if the font already utilises these codes (unlikely). + +mPDF now deletes U+200C,U+200D,U+200E,U+200F zero-widthjoiner/non-joiner, LTR and RTL marks so they will not appear + even though some fonts contain glyphs for these characters. + + +Other New features / Improvements +--------------------------------- +Avoid just the border/background-color of the (empty) end of a block being moved on to next page (</div></div>) + using configurable variable: $this->margBuffer; + + +The TTFontsUni class contained a long function (extractcoreinfo) which is not used routinely in mPDF + This has been moved to a new file: classes/ttfontsuni_analysis.php + The 3 utility scripts have been updated to use the new extended class: + - utils/font_collections.php + - utils/font_coverage.php + - utils/font_dump.php + + +Bug fixes +--------- +- Border & background when closing 2 blocks (e.g. </div></div>) incorrectly being moved to next page because incorrectly + calculating how much space required +- Fixed/Absolute-positioned elements not inheriting letter-spacing style +- Rotated cell - error if text-rotate set on a table cell, but no text content in cell +- SVG images, text-anchor not working +- Nested table - not resetting cell style (font, color etc) after nested table, if text follows immediately +- Nested table - font-size 70% set in extenal style sheet; if repeated nested tables, sets 70% of 70% etc etc +- SVG setting font-size as percent on successive <text> elements gives progressively smaller text +- mPDF will check if magic_quotes_runtime set ON even >= PHP 5.3 (will now cause an error message) +- not resetting after 2 nested tags of same type e.g. <b><b>bold</b></b> still bold +- When using charset_in other than utf-8, HTML Footers using tags e.g. <htmlpageheader> do not decode correctly +- ToC if nested > 3 levels, line spacing reduces and starts to overlap + + + + +=========================== +mPDF 5.4 +14/02/2012 +=========================== +Files changed +------------- +mpdf.php +config.php +compress.php +classes/ttfontsuni.php +classes/barcode.php +classes/indic.php +classes/svg.php +examples/show_code.php ----- SECURITY RISK** +examples/example49_changelog.php +examples/example57_new_mPDF_v5-3_active_forms_b (replace example57_new_mPDF_v5-3_active_forms) +includes/out.php +mpdfi/fpdi_pdf_parser.php + +Files added +----------- +classes/bmp.php +classes/directw.php +classes/form.php +classes/grad.php +classes/tocontents.php +classes/wmf.php +examples/example58_new_mPDF_v5-4_features + +config.php changes +------------------ +Edited: $this->allowedCSStags, $this->innerblocktags, $this->defaultCSS; (CAPTION added in each case) +Moved: Numerous $form_.. variables are now in /classes/form.php + +New config variables +-------------------- +$this->bookmarkStyles = array(); +$this->cacheTables = true; + +New methods +----------- +function CircularText() +function SetVisibility() + +New/Extended CSS +---------------- +box-shadow (block elements - does NOT support "inset") +text-shadow (all text elements - does NOT support "blur") +visibility: visible|hidden|printonly|screenonly (block-level elements and images IMG only) +text-transform: capitalize|uppercase|lowercase (extended to support TD/TH) +tr|td|th:nth-child(odd|even|2n+1) +color, strikethrough, underline and background-color (extended to support rotated TD/TH) +underline and strike-through (extended to support TD/TH) +underline (line colour) (extended to work correctly in watermark) +page-break-after: left|right|always (block elements and tables) + NB respects $mpdf->restoreBlockPagebreaks = true; i.e. will make pagebreak act like formfeed +background[-color]: extended to support rgba|cmyka|cmyk|hsla|hsl|spot +border(extended to support inline elements) + + +New HTML +-------- +<caption> +<textcircle /> + + +New features / Improvements +--------------------------- +Tables - Zebra Stripes +Tables: overlapping rowspans (partially) supported +Tables - Disk caching +Using progress bars (or $showStats) now reports 'real' memory usage i.e. get_memory_usage(true) +Support for query string in the URLs for external stylesheets e.g. @import url("style.css?ltcyy7"); +Table caption partially supported +CircularText +BookMark styling +Spread tables i.e. can split table (columns) across several pages width. +Can use chelvetica, ctimes and ccourier to specify core fonts in a non-core font document +Spread tables i.e. can split table (columns) across several pages width. +{colsum} in <tfoot> cell will insert a column total per page. +SVG embedded as island in HTML supported +Active Forms + textarea and input (text types) now accept javascript as: + onKeystroke, onValidate, onCalculate and onFormat + onChange is depracated but works as onCalculate (for textarea and input) + (PS Select still accepts onChange cf. 5.3.37) +Ledger and Tabloid added as page formats recognised. NB Ledger is same as tabloid but landscape. In mPDF, both give the same size (portrait) +so need to add -L e.g. Ledger-L for landscape. + + +Internal script changes +----------------------- +Changed this->k to _MPDFK throughout all scripts +Changes to color (packed binary data in string rather than array) to reduce memory usage esp in tables +Internal variables Removed + $usetableheader; + $tableheadernrows; + $tablefooternrows; +vars $ChangePage, $p_bottom_border, $img_margin_top(+) $issetcolor + other similar removed + +Removed a whole load of // comments +Updates to remove some more Warning Notices (not all marked in text) +Border set on TR - changed so set on each cell, rather than retrospectively at end of TR +All references to table['text'] removed as not needed - uses ['textbuffer'] instead +OpenTag(TD) changes to reduce memory usage with tables +Includes different method to set a default timezone +fn _smallCaps does not need (undefined) $space +this->chrs and this->ords replaced by chr() and ord() +Headers in out.php updated to match those used in Output() +Change to SetFont() to improve performance time +Change to GetStringWidth() to improve performance time +Corrected copying of Glyphs 0,1,2, to all subset fonts (non-SMP/SIP), and only setting 32->127 in subset +Subset fonts (non-SMP/SIP) have additionally Unicode CMap tables (0,0,4 and 0,3,4) as well as Microsoft (3,1,4) +Subset fonts (SMP/SIP) have CMap tables (1,0,6 and 3,0,4) - rather than 1,0,6 and 3,0,6 +Subset fonts (SMP/SIP) have 'name' table changed to give 1,0 and 3,0. As it is a symbol font (not Unicode encoded) : + needs to have a name entry in 3,0 (e.g. symbol) - original font will have 3,1 (i.e. Unicode) +Automatically checks for HTML code length > 100000 characters and gives error warning if + PHP < 5.2.0 (as not configurable) or increases pcre.backtrack_limit if PHP < 5.3.7 + +Removed/Depracated +------------------ +function UseTableHeader($opt=true) fn removed / depracated +function UsePRE($opt=true) removed +$attr['REPEAT_HEADER'] == true CSS removed / depracated +$this->usepre=true; removed / depracated as never needed - always respects PRE whitespace + +ToC: NB Values can no longer be set directly e.g. as in example + $mpdf->TOCheader = array(); // array as for setting header/footer + $mpdf->TOCfooter = array(); // array as for setting header/footer + $mpdf->TOCpreHTML = '<h2>Contents - Portrait</h2>'; // HTML text to appear before table of contents + $mpdf->TOCpostHTML = ''; // HTML text to appear after table of contents + $mpdf->TOCbookmarkText = 'Content list'; // Text as it will appear in the Bookmarks (leave blank for none) +Need to use TOCpagebreak either direct (or array version) or as HTML +OR if absolutley necessary, could use: + $mpdf->tocontents->TOCheader = array(); // array as for setting header/footer + $mpdf->tocontents->TOCfooter = array(); // array as for setting header/footer + $mpdf->tocontents->TOCpreHTML = '<h2>Contents - Portrait</h2>'; // HTML text to appear before table of contents + $mpdf->tocontents->TOCpostHTML = ''; // HTML text to appear after table of contents + $mpdf->tocontents->TOCbookmarkText = 'Content list'; // Text as it will appear in the Bookmarks (leave blank for none) + + + +Further Details +=============== + +CSS border on inline elements +----------------------------- +Support for CSS border (and variants) on inline elements e.g. <span style="border-bottom: 1px dashed #000000;"> +Border styles solid|dotted|dashed|double only are supported. Border radius not supported. +Nested inline elements will have repeat left|right borders on the nested content (unlike browsers) + +Tables - Zebra Stripes +---------------------- +TABLE - striped rows cf. http://dev.opera.com/articles/view/zebra-striping-tables-with-css3/ +tr:nth-child(odd) { background-color: #99ff99; } +thead tr:nth-child(3n+2) { background-color: #FFBBFF; } +td:nth-child(2n+1) { background-color: #BBBBFF; } +table.zebraTable td:nth-child(2n+1) { background-color: #BBBBFF; } +table.zebraTable th:nth-child(2n+1) { background-color: #BBBBFF; } + +NB mPDF does NOT correctly apply specificity to all CSS +table.zebra tbody tr:nth-child(2n+1) td { background-color: #FFFFBB; } +table.zebra tbody td:nth-child(odd) { background-color: #BBBBFF; } + +should make every odd row yellow, and every odd coloumn blue, but with the row/yellow overriding the column/blue. +In mPDF the td:nth-child(odd) trumps the plain td, so the column colour wins out. You can force the effect you want by using +table.zebra tbody tr:nth-child(2n+1) td:nth-child(1n+0) { background-color: #FFFFBB; } + +(The :nth-child(1n+0) selector just selects every td cell.) + + + +Tables - Disk caching +--------------------- +TABLES: using disk caching +// Using disk to cache table data can reduce memory usage dramatically, but at a cost of increased +// executon time and disk access (read and write) +$this->cacheTables = true; +NB $this->packTableData will be overridden to => true; // required for cacheTables + $this->simpleTables will be overridden to => false; // Cannot co-exist with cacheTables + + +Table caption +------------- +Must come immediately after <table...> +CSS caption-side and HTML align attribute of top|bottom supported (not attribute left|right) +Handled as a separate block element brought outside the table, so: + CSS will not cascade correctly on the table + width of caption block is that of page or of the block element containing the table + so alignment will be to the page-width not the table width + if table page-break-after: always, the caption will follow the pagebreak. +This does work: +<style> +.tablecaption { caption-side: bottom; text-align: left; font-weight: bold; color: green; } +</style> +... +<table> +<caption class="tablecaption">Caption title here</caption> +<tbody> + +CSS visibility: printonly, screenonly +------------------------------------- +Roughly based on CSS + +Works on Block elements P, DIV etc, or Image +Cannot nest / layer. +Inner blocks/image with set visibility are ignored if already set on enclosing block element. +(Block element) does not work inside table (image does) +So 'visible' does nothing but is set as default +(NB Changes output to PDF version 1.5) +Incompatible with PDFA / PDFX + +'visibility' + Value: visible | hidden | (collapse | inherit) + Initial: visible + Applies to: all elements + Inherited: yes + +The 'visibility' property specifies whether the boxes generated by an element are rendered. +Invisible boxes still affect layout (set the 'display' property to 'none' to suppress box generation altogether). +Values have the following meanings: + +visible + The generated box is visible. +hidden + The generated box is invisible (fully transparent, nothing is drawn), but still affects layout. + Furthermore, descendants of the element will be visible if they have 'visibility: visible'. +collapse | inherit + NOT supported in mPDF + +CUSTOM: +printonly | screenonly + + +Added VISIBILITY function +$mpdf->SetVisibility('screenonly'); or 'printonly' 'visible' or 'hidden' +(NB Changes output to PDF version 1.5) +Incompatible with PDFA / PDFX + +CircularText +------------ +function CircularText($x, $y, $r, $text, $align='top', $kerning=120, $fontwidth=100) { +x: abscissa of center +y: ordinate of center +r: radius of circle +text: text to be printed +align: text alignment: top or bottom. Default value: top +kerning: spacing between letters in percentage. Default value: 120. Zero is not allowed. +fontwidth: width of letters in percentage. Default value: 100. Zero is not allowed + +- now uses Kerning between letters if useKerning == true (set manually see example) + +BookMark styling +---------------- +New configurable variable to control appearance of Bookmarks e.g. +$this->bookmarkStyles = array( + 0 => array('color'=> array(0,64,128), 'style'=>'B'), + 1 => array('color'=> array(128,0,0), 'style'=>''), + 2 => array('color'=> array(0,128,0), 'style'=>'I'), +); + +Column sums +----------- +(Also changed some preg_replace to str_replace to improve performance) +To use: just add {colsum} to any cells of the table footer <tfoot> +Add a number to specify a fixed number of decimal points e.g. <td>{colsum2}</td> will give you 123.40 +The width of the column will be calculated using the actual string {colsum} as a placeholder. +If you need the column to be wider, use underscores "_" to pad it e.g. {colsum2_____} + + +Spread tables +------------- +i.e. can split table (columns) across several pages width. +CSS <table style="overflow: visible"> +Cannot use with: +$this->kwt - ignored +$this->table_rotate - ignored +$this->table_keep_together - ignored +$this->ColActive - cancels spread tables + +Messes up with: +$mpdf->forcePortraitHeaders = true; +$mpdf->forcePortraitMargins = true; +Problems with CJK, and RTL + +Will do no resizing of fonts at all. +Maximum width of column = page width i.e. will not split columns across pages - NB will keep colspan>1 on one page +If table row too high for page will die with error message. +Will override some specs for width if this creates conflicts +Recommended to specify absolute value of width on each column. + + + + +Bug fixes +========= +Dottab - if text after dottab is hyperlinked <a></a> then dots are underlined + +page-break-before now respects $mpdf->restoreBlockPagebreaks = true; i.e. will make pagebreak act like formfeed +Annotation() function called directly with colorarray(r,g,b) + +Added urldecode to _getImage to cope with ../name%20of%20image.jpg +Added urldecode AND htmlspecials_decode to href in <a> link e.g. https://www.google.com/search?hl=en&amp;q=mpdf&amp;filename=name%20of%20file +[barcode.php] Allow &nbsp; in C39 codes - will be changed to spaces + +<table> inside a <div position:fixed, left:300px;> not calculating table width correctly + - leading to either upside down table or error width less than 1 character + +Depracated magic_quotes_runtime() in compress.php + +DIRECTW included twice in compress.php +FORMS mark up for compress.php corrected + +double backslashes not preserved inside <pre> or <textarea> + +font-weight and font-style not recognised in <pageheader> + +Progress bars causing corrupt PDF file (out.php) changed fopen from "r" mode to "rb" (binary) +Target around image - <a href="#internaltarget"><img ... /></a> - not working + +SmallCaps in <thead> error + +Fonts with "name" table in format 1 not recognised correctly +Rotated table which does not fit on remaining page, forces a new page even if already at top of page + +Locale causing problems - all instances of sprintf() using %.3f changed to %.3F so not locale aware + +CSS border radius not implemented on fixed/absolute positioned block element + +Background color in rotated table extending way beyond bottom of table + +Nested table containing <thead> or <tfoot> was confused with <thead> or <tfoot> of parent table + +Correct handling of spaces, < or & in textarea + +<option> and <input ..> attributes value/title decoded with fn lesser_entity_decode instead of htmlspecialchars_decode to include &apos; + +line width not restored to correct value after "line-through" text in Cell() + +Kannada - incorrect positioning of Reph + +Forms - In <input> or <option> (select) not correctly handling HTML named entities e.g. &lt; in value or title +Active forms - &nbsp; as Value or Title incorrectly showing as Euro - PDFDocEncoding fixed + +Unicode data in embedded fonts not encrypted when doc encrypted + +Nested block elements which are empty including innermost one, top margin of innermost block was ignored + +font-size: xx% inside a block was setting on block's parent font-size + +Active forms - radio buttons (removed name from Widget - leave on Radio group) + causing problems accessing field for radio buttons + +When using simple tables and border-collapse, if table border set, but cell borders not set, should display table border (fixed) +position:fixed block - if neither top nor bottom nor height specified, was positioned incorrectly (y) +Leave - if top, bottom, margin-top, margiin-bottom and height are all left unspecified (or auto), will centre vertically +on the page (specific to mPDF - not consistent with CSS2.1) +But if any one of them are specified (including e.g. margin-top=0), follows CSS spec, so top is the current "static" position + +background-image-opacity=0 not working on BODY or BLOCK + +Lists - if LI continues after a nested List, would add as a new LI item (should continue as part of earlier LI item) + +fn WriteCell() converts to 'windows-1252' when required +if multiple calls to mPDF used, cannot redefine function cmp() +internal link targets <a name="xx" /> in ToC not moved when using: page-break-inside:avoid +internal link targets <a name="xx" /> not moved when using: columns, page-break-inside:avoid, keep-with-table or table rotate + +Active Forms - onChange not working for SELECT (cf. 5.3.25) Example 57 only worked by chance as JS was carried over from Select to Text field +Bug is fixed, but example file needed updating to onCalculate for the display field. + +Table cell: if height set as %, currently sets it as % of page-width; instead this now ignores it. + +Bengali letter Khanda Ta (U+09CE) character not recognised; was added in Unicode v4.1 and prior to this, (U+09A4 U+09CD U+200D) + so mPDF converts to this string and seems to work. + +OCR characters wrong size in barcodes if using different ocr font - fixed + +=========================== +mPDF v5.3 (21/07/2011) +=========================== + +New Features +------------ +- Active forms (see on-line manual for details) +- 128-bit encryption (optional) with additional user-permissions (see on-line manual) + +PLEASE READ - Change in Font management +--------------------------------------- +The font name imported from the font and included by mPDF in the PDF file was stripping any '-' in the name. +This is the PostScript name which is utilised by some PostScript programmes. +mPDF has been changed to leave the PostScript font name unchanged. In 99% cases no difference will be noted, but +you MUST delete all the temporary font data files cached in the /ttfontdata/ folder for this to be effective. + + +Minor changes +------------- +If @page CSS is used to select a first page with settings different from the default, mPDF did create a blank page + then pagebreak to the new @page settings - this has been changed so it now will start with the new page settings. + +New function added: DeletePages($start_page, $end_page=-1) e.g. $mpdf->DeletePages(1); + Can be used just before calling Output() + +compress.php utility extended to exclude active forms and images-svg + + +Bug fixes +--------- +- list-style-type: (custom version, user-defined bullet) colour change not working if colour is set on the list item line +- background-image: SVG or WMF images as background-images in tables/tr/cells not working +- font-weight: bold font not always reset after inline <b>...</b> thus miscalculating width +- forms (inactive) in 'c' core fonts using unicode characters 127-255 incorrect display in input text and button text +- form elements (inactive) if in-line with mixed size fonts, error in vertical positioning of text related to box +- ToC: wrapped lines in ToC not retaining formatting e.g. bold style +- HTMLHeaders: using setAutoTopMargin="pad"; not correctly setting top margin for first page +- output headers changed: Content-length not used if server uses output compression +- embedded font subsets from fonts which contain non-BMP plane 0 characters (incl. e.g. dejavusanscondensed) + - causing Adobe Reader to create a CJK encoded font subset internally when loading interactive Forms + - Changed so unsets the flag in the subset font to show no non-BMP characters. + + +Configurable variables added (see config.php file): +-------------------------------------------------- +All for Active Forms: +$this->useActiveForms +$this->formExportType +$this->formSubmitNoValueFields +$this->formSelectDefaultOption +$this->form_border_color +$this->form_background_color +$this->form_border_width +$this->form_border_style +$this->form_button_border_color +$this->form_button_background_color +$this->form_button_border_width +$this->form_button_border_style +$this->form_radio_color +$this->form_radio_background_color + +PLUS: see additional values added to $this->allowedCSStags close to bottom of file - required for Active forms + + +Updated files +------------- +mpdf.php +config.php (NB as well as form stuff at top, 5.2.07 $this->allowedCSStags close to bottom of file) +compress.php +classes/ttfontsuni.php +examples/example57... +examples/formsubmit.php + + + +=========================== +mPDF v5.2 (18/06/2011) +=========================== + +New Features +------------------ +Improvements in font handling resulting in clearer display of fonts on screen, and improved compatibility with PostScript drivers + (e.g. use with GSView/GhostScript, see below) + +CJK line-breaking implemented (roughly) according to rules. Configurable variables allow control of behaviour (except in tables). + +Viewer preferences: added options for initial 2 page display where you can specify whether + 1st page is on left or right (cf. SetDisplayMode). + +Custom list-style-type for a list (ul,ol) or a list-item (li) in which you can determine the character and colour of the bullet: + list-style-type: U+263Argb(255,0,0); - where U+263A is the Unicode HEX value of the character you want for the bullet + - character MUST be included in the font used for that list item. rgb() bit is optional + + +Bug fixes +--------- +- Fonts: embedding a BMP TTC font (e.g. Cambria) as a full font caused error +- Table: If cell width set by CSS as %, and page-break-inside avoid requires a new page, was losing the sizing +- Table: table borders CSS parsing error; if border-width, border-style, border-color set, not inherited correctly +- Table: Table background image or gradient not working in HTMLHeader/Footer +- Table: background color set on table (anywhere) will overwrite image/gradient +- Table Background image/gradient: If left/right margin is set on table, gradient/image set on table is too wide +- Table: rotated table - height (after first page does not correctly allow for thead i.e. too much) +- Table: blank <tr></tr> causes error +- Table/Letter-spacing: If letter-spacing set inside table, not calculating table width correctly, and if oversized, freezes +- ToC: ToC at top of page (non-mirrored or already ODD) did not reset page_number if told +- Character subsititutions: characters missed if first element in a $html code e.g. WriteHTML('Not in a tag &#10003;'); +- Kerning: kerning info: if reading font file for first time (or if not cached in ttfontdata/) did not register kerning info +- Textarea: multiple new lines run into only one newline +- QRCode - colors wrong because QRcode class only accepts RGB input (hardcoded now to always give black on white) +- QRCode always producing "Your message here" +- Columns: if transforming height of column, not always closing transform Q +- CakePHP compatibility +- compress.php - error due to markup comments in mpdf.php script file + +Backwards compatibility +----------------------- +Changes in mPDF 5.2 are backwards compatible with version 5.1 +Your document fonts may appear slightly different in the PDF viewer because of the changes to embedded font subsets (cf.) +The new Indic fonts may result in a change in spacing (due to the different character width of the space character from the original font) + +PostScript e.g. GSView/GhostScript +---------------------------------- +A number of errors have been reported when opening mPDF-created PDF files with a PostScript programme. Some of the errors were due to mPDF, +but others were due to peculiarities of GSView/GhostScript. +- Diacritic Characters were not displayed when embedding a font subset +- Fonts containing SIP/SMP characters (supplementary Unicode planes) caused errors +- Error with text justification (word-spacing) when embedding a full font can occur in some fonts* +The first 2 problems should now be fixed in v5.2 +*The error with text justification can be optionally fixed by setting the configurable variable in config.php: + $this->repackageTTF = true; + When mPDF embeds a full font, it simply embeds the whole original TTF file into the PDF document. For some fonts (containing + a GSUB table) this was causing problems. $this->repackageTTF forces mPDF to repackage the original TTF file excluding some of + the tables like GSUB. +(See ADDITIONAL INFO FONTS.txt in downloaded files) + + +Font appearance in PDF viewer +----------------------------- +Font subsetting has been improved to include additional information in the embedded file. Overall the effects are of greater clarity +when viewing the document on a screen (it will not affect print output), but the changes are dependent on: +- the original TTF font i.e. the options that the font's author has built into the file +- the PDF viewer i.e. whether the programme chooses to use the available information +- the resolution (zoom) of the page you are viewing +(See ADDITIONAL INFO FONTS.txt in downloaded files) + + +Indic fonts +----------- +A new set of Indic fonts (ind_xx_1_001) is distributed with version 5.2 containing the additional font information as described above. +In addition, some changes have been made to the ASCII characters in the font from the files previously distributed: +The original files (Raghu font files) do not contain the characters a-z and A-Z. When the first version indic files were created for mPDF, +ALL of the ASCII characters (32-127) were inserted/overwritten from DejaVuSansCondensed to make the font more usable. +In the latest version, only the missing characters are taken from DejaVuSansCondensed, leaving punctuation and numerals from the original +fonts. This also means that the space character has a different width, and this will cause slight changes to the word spacing in documents. +(See ADDITIONAL INFO FONTS.txt in downloaded files) + + +CJK line-breaking (text wrapping) +--------------------------------- +CJK (chinese-japanese-korean) text often contains no spaces. mPDF previously has wrapped text whenever a character reached the end of +the line. mPDF version 5.2 attempts to follow the line-breaking rules described for each of the languages. Configurable variables +allow some control over this behaviour, especially whether to squeeze a character into the space available at the end of a line, or +whether to allow it to overflow the right margin. + + +Configurable variables (see config.php file): +---------------------- +Control wrapping of CJK text: + $this->allowCJKorphans = true; // FALSE=always wrap to next line; TRUE=squeeze or overflow + $this->allowCJKoverflow = false; // FALSE=squeeze; TRUE=overflow (only selected) +When Embedding full TTF font files, remakes the font file using only core tables +May improve function with PostScript printers + $this->repackageTTF = false; + +Updated files +------------- +mpdf.php +compress.php +utils/font_dump.php +classes/ttfontsuni.php +config.php (3 new variables - see above) + +All ttfonts/ind_* +New set of Indic fonts for PostScript compatibilty - and clearer font display + + + +=========================== +mPDF v5.1 (27/02/2011) +=========================== + +New Features +------------ +- CSS background (images, colours or gradients) on <TR> and <TABLE> +- CSS border on <TR> (only in border-collapsed mode) +- support for Mozilla and CSS3 gradient syntax: + -moz-linear-gradient, linear-gradient + -moz-radial-gradient, radial-gradient + -moz-repeating-linear-gradient, linear-repeating-gradient + -moz-repeating-radial-gradient, radial-repeating-gradient +- expanded support for gradients (including in SVG images): + - multiple colour 'stops' + - opacity (transparency) + - angle and/or position can be specified +- gradient can be used as an image mask (custom mPDF styles: gradient-mask) +- image-orientation supported for <IMG> (similar to existing custom mPDF attribute: rotate) [CSS3] +- image-resolution supported for <IMG> [CSS3] +- background-image-resolution (custom mPDF CSS-type style) to define resolution of background images +- improved support for SVG images +- SVG and WMF images supported in background-image +- file attachments +- numeric list-styles added e.g. arabic-indic, bengali, devanagari, persian, thai [CSS3] +- font kerning supported (inter-character spacing between specific pairs) +- letter-spacing and word-spacing supported [CSS3] +- colors supported as rgb(), rgba(), hsl(), hsla(), cmyk(), cmyka(), or spot() +- spot colors supported e.g PANTONE 310 EC +- PDF/X compatible files +- optionally force use of grayscale, RGB or CMYK colorspace +- automatic colour conversion for most objects between grayscale, RGB and CMYK + +Backwards compatibility +----------------------- +Most changes in mPDF 5.1 are backwards compatible with version 5.0 i.e. your documents should +look the same running 5.1 However some changes may alter display from previous versions: +- RTL (right-to-left) languages - see below +- bleed margins when using @page CSS - see below +- Default distance for "cross" from inner margin changed 10->5mm [hardcoded in fn. Footer()] +- If height set on a block element, will force a new page if set-height will not fit on page +- If table rotated, 5mm margin at bottom is now reduced to 1mm +- If image is too big for page and automatically sixed to maximum height of page, 10mm margin at bottom reduced to 1mm + +Colours may appear more vibrant +------------------------------- +Unless specifically set, Adobe Reader uses the RGB colorSpace by default when displaying documents. However +if an image or gradient using transparency (or alpha channel) is included in the document, Adobe Reader +automatically sets the default colorSpace to CMYK - which makes the colours look less vibrant/bright on screen. +mPDF 5.1 now specifies by default a colorSpace RGB for each page, and this will maintain the more +vibrant colours. This is overridden if you use on of the options to restrict the colorSpace (cf.) + +RTL +--- +**** IMPORTANT - PLEASE READ IF USING RTL SCRIPTS **** +Handling of RTL (right-to-left) languages has been significantly rewritten, and is likely to cause +changes to the resulting files if you have previously been using mPDF. The changes have made mPDF +act more like a browser, respecting the HTML/CSS rules. +Changes include: +- the document now has a baseline direction; this determines the + - behaviour of blocks for which text-align has not been specifically set + - layout of mirrored page-margins, columns, ToC and Indexes, headers and footers + - base direction can be set by any of: + - $mpdf->SetDirectionality('rtl'); + - <html dir="rtl" or style="direction: rtl;"> + - <body dir="rtl" or style="direction: rtl;"> + - base direction is an inherited CSS property, so will affect all content, unless... +- direction can be set for all HTML block elements e.g. <DIV><P><TABLE><UL> etc using + - CSS property < style="direction: rtl;"> + - direction can only be set on the top-level element of nested lists + - direction can only be set on <TABLE>, NOT on THEAD, TBODY, TD etc. + - nested tables CAN have different directions +- NOTE that block/table margins/paddings are NOT reversed by direction + NB mPDF <5.1 reversed the margins/paddings for blocks when RTL set. +- language (either CSS "lang", using Autofont, or through initial set-up e.g. $mpdf = new mPDF('ar') ) + no longer affects direction in any way. + NB config_cp.php has been changed as a result; any values of "dir" set here are now ineffective +- default text-align is now as per CSS spec: "a nameless value which is dependent on direction" + NB default text-align removed in default stylesheet in config.php +- once text-align is specified, it is respected and inherited + NB mPDF <5.1 reversed the text-align property for all blocks when RTL set. +- the configurable value $rtlcss is depracated, as it is no longer required +- improved algorithm for dtermining text direction + - english word blocks are handled in text reversal as one block i.e. dir="rtl" + [arabic text] this will not be reversed [arabic text] + - arabic numerals 0-9 handled correctly + +Although the control of direction for block elements is now more configurable, the control of +text direction (RTL arabic characters) remains fully automatic and unconfigurable. +<BDO> etc has no effect. Enclosing text in silent tags can sometimes help e.g. + content<span>[arabic text]</span>content + +Justified text +-------------- +Text-align: justify - no longer uses configurable variable $jSpacing= C | W | '' +The default value is for mixed letter- and word-spacing, set by jSWord and jSmaxChar +If a line contains a cursive script (RTL or Indic [devanagari, punjabi, bengali]) then it prevents letter-spacing +for justification on that line - effectively the same as setting letter-spacing:0 +Spacing values have been removed from the config_cp.php configuration file, so the "lang" property +(in config_cp) no longer determines justification behaviour (this includes the use of Autofont()). +When using RTL or Indic [devanagari, punjabi, bengali] scripts, you should set CSS letter-spacing:0 +whenever you use text-align:justify. + + +@page media +----------- +When using @page to create a print publication with page-size less than sheet-size +- bleed margin is now configurable (also crop- and cross-mark margins) +- backgrounds/gradients/images now use the bleed box as their "container box" +- odd-header-name: supports the value "_default" - allows current non-HTML header to remain unchanged +- marks: crop cross; i.e. both together supported +- background-image-opacity and background-image-resize now work with @page CSS + + +SVG images - extended support +----------------------------- +- support for spreadMethod property for gradients (repeat and reflect) +- support for style="font-family; font-size; font-style; font-weight" i.e. inline CSS +- when viewPort="" and width="" height="" all specified, uses width to set SVG size of a "pixel" +- support for opacity and multiple "stops" (and colorspace) in gradients + + + +Minor Enhancements +------------------ +- support for colors as rgb(87%, 56%, 25%) [used especially in SVG] +- added option of "NoPrintScaling" in SetDisplayPreferences +- compress.php - now combines BACKGROUND-IMAGES and GRADIENTS as BACKGROUNDS, and added PROGRESS-BAR +- table with THEAD row will force a new page if no room for the THEAD AND a row from TBODY +- Small-Caps now works properly together with text-align justify +- embedded font subsets restructured (minor) for greater compatibility e.g. with Postscript printers +- PDF/A will convert everything except grayscale to RGB (by default) or CMYK (optionally) + + + + +Bug fixes +--------- +- Display changed to CMYK colour gamut when document contained an object with transparency set. + Now will retain RGB colorspace (brighter colours) +- If using dir="rtl", tables containing nested tables were not properly reversed +- "text-rotate: 0" set in CSS stylesheet did not 'undo' any text-rotate set on the row (TR) +- Malayalam - character re-ordering +- If height set on a block element, was not taking account of padding top/bottom +- embedded font subsets: error in array of Font Widths fixed +- <style>..</style> containing /* import url() */ the comments were not ignored +- If call mPDF class more than once, error using multiple barcodes or gif files because classes not reinstantiated +- Floating blocks were collapsing bottom/top margins - incorrectly +- Table: if colspan>1 contents are wider than the width of the included columns, did not increase column width(s) to accommodate +- Resizing table - script hanging and new page forced when not required (still) +- If a table style="page-break-inside:avoid" not fit on the page, was adding new page before resizing EVEN IF on a blank page +- End of 2 blocks (e.g. </div></div>) at very bottom of page, forcing unwanted pagebreak +- Corrected handling of tags inside <pre> +- RTL left-aligned text - line ending with <br /> not correctly left-aligned +- <input type=submit|reset etc name="xxx" e.g. Google button showed as I&039;m feeling lucky +- Annotations all linked to Page 1 (parent object) +- Error "division by zero" using columns +- MultiCell() and Write() [direct writing functions] - miscalculating length of line in non-core fonts (+ other bugs) +- error if CJK space at end or beginning of line with 0x20 spaces in as well + +Configurable variables (see config.php file): +---------------------- +$this->printers_info +$this->bleedMargin +$this->crossMarkMargin +$this->cropMarkMargin +$this->cropMarkLength +$this->nonPrintMargin +$this->restrictColorSpace +$this->PDFX +$this->PDFXauto; +$this->useKerning +[$this->rtlcss removed] + +Updated files +------------- +mpdf.php +config.php +config_cp.php (removed references to dir - but not essential to update - just redundant information) +compress.php +includes/out.php +includes/functions.php +classes/svg.php +classes/ttfontsuni.php +classes/indic.php +/font/helvetica*.php and /times*.php + +Added CSS support +================= +All Block elements including <BODY> <TABLE> <TR> +------------------------------------------------ +background-image-resolution: normal | [ from-image || <dpi> ] +direction: [ rtl | ltr ] (HTML attribute dir also supported) +background: [ gradients ] +background-image: [gradients ] + +For [ gradients ] syntax see: +- Mozilla linear - https://developer.mozilla.org/en/CSS/-moz-linear-gradient +- Mozilla radial - https://developer.mozilla.org/en/CSS/-moz-radial-gradient +- Mozilla gradients use - https://developer.mozilla.org/en/Using_gradients +- CSS3 linear gradients - http://dev.w3.org/csswg/css3-images/#linear-gradients +- CSS3 radial gradients - http://dev.w3.org/csswg/css3-images/#radial-gradients + + +Almost all elements - block and in-line +--------------------------------------- +font-kerning: auto | normal | none // need to set $mpdf->useKerning = true; +letter-spacing: normal | <length> +word-spacing: normal | <length> + +Colours +------- +Anywhere that color is specified (e.g. color, background-color, borders) +- rgb(255,255,255) +- rgba(255,255,255,1) // last value is transparency (alpha) - between 0-1 +- rgb(100%,100%,100%) +- hsl(360,100%,100%) // H: 0-360; S/L: 0-100%; a:0-1 +- hsla(360,100%,100%,1) +- cmyk(100,100,100,100) // or 0-100% +- spot(COLOR NAME, 100%) // e.g PANTONE 310 EC; use AddSpotColor() to define first + +<TR> +border: + +<TABLE> <TR> +background: +background-color: +background-image: + +<IMG> +gradient-mask: [can use any of the gradient syntax] +image-orientation: <angle> - supports deg, rad or grad +image-resolution: normal | [ from-image || <dpi> ] + +<OL|UL> +list-style: arabic-indic | bengali | devanagari | gujarati | gurmukhi | kannada | malayalam | oriya | + persian | telugu | thai | urdu | tamil + + +@page +marks: [ crop || cross ] - i.e. crop and cross can be used together +odd-header-name: "_default" - allows current non-HTML header to remain unchanged +background-image-opacity: [ 0-1 ] +background-image-resize: [ 1-6 ] - see Manual + + +=========================== +mPDF v5.0 (30/09/2010) +=========================== + +New Features +------------ +- Font handling simplified, reads TrueType font files directly + + +Minor Enhancements +------------------ +- rotation of fixed-position block elements (see example 10 and manual for supported CSS) +- support for CSS Small-Caps font-variant added +- utility scripts in /utils/ folder to help font management +- new simplified functions AddPageByArray() and TOCPageBreakByArray() added +- progress bar simplified and customisable +- improved word-wrapping for CJK langauges +- improved recognition of CJK/Indic/Arabic characters +- invalid UTF-8 input now outputs a meaningful error by displaying input html with errors marked +- GIF or PNG images with transparency/interlaced/non-standard compression handled as internal data + if /tmp/ folder is not present or writeable +- support for <html dir="rtl"> +- support for "display: none" on inline elements +- annotations supported in fixed-position block elements + + +Bug fixes +--------- +- <br /> preceded by space does not correctly text-align to right +- zero-width character in middle of line caused line-break (e.g. diacritic or U+200C = ZWNJ) +- HTML attributes not recognised if spaces e.g. 'src = "..."' +- Headers changed for output - problem reported on IE8 64-bit using SSL +- using SetAutoPageBreak(false) used caused unexpected behaviour with table rows at page break +- (from Beta) incorrect check for temporary font data folder causing errors +- artificial Bold/Italic not working in table cell when using rotated text +- allow <dottab> to inherit font color correctly +- SVG now works with Adobe 7 +- background in header overwriting text +- vertical text in table header not correctly horizontally positioned when repeated +- compatibility with PHP >= 4.3 (htmlspecialchars_decode, stripos) +- updated depracated script PHP 5.3.0 ($string{1} to $string[1], $var =& new Object(), set_magic_quotes_runtime) +- index (CreateIndex) number string incorrect if arabic(rtl) text anywhere in document +- MultiCell incorrectly calculate string length/width when using core fonts +- page-break-inside:avoid - used with non-HTML footer had space inserted for footer height +- page-break-inside:avoid - error if more than 1 page height but not enough to trigger second pagebreak +- page-break-inside:avoid - incorrectly layering page backgrounds (headers and content brought forward) + + +Changes from 5.0 Beta +--------------------- +If you are upgrading from the Beta version - you MUST delete all files in the /ttfontdata/ temporary directory +- config.php file has been changed (extra CJK characters to recognise CJK blocks) +- $this->backupSubsFont (in config_fonts.php) optionally now takes an array +- no need to define 'cjk'=>true or 'sip|smp'=>true in config_fonts.php (ignored; cf. $this->BMPonly) +- Indic language fonts have been altered to add Latin and Latin-1 Supplement characters +- progress bars now has an external progbar.css and configurable main heading +- added initial parameter new mPDF('+aCJK') or '-aCJK' to override default useAdobeCJK at runtime +- QRCode is not included in main download (but as an extra package) + +BACKWARD COMPATIBILITY +---------------------- +If you have been using earlier versions of mPDF, most scripts should work as before. But note: +- Arial, Helvetica, Times and Courier are now treated like any other font +- the whole CSS font string is parsed e.g. style="font-family:'Lucida Grande';" will look for a font 'lucidagrande' +and not 'lucida' + +Configurable variables (see config.php file): +---------------------- +- $mpdf->useSubstitutionsMB is now depracated, but will work as an alias for $mpdf->useSubstitutions +The initial parameters e.g. new mPDF('utf-8') have all changed. Old ones may be recognised, or will be ignored. +- $mpdf->useOnlyCoreFonts is now depracated and is ignored. Use new mPDF('c') +- $this->use_CJK_only is now depracated and is ignored. See $this->useAdobeCJK and new mPDF('+aCJK') or '-aCJK' +Control SmallCaps appearance +- $mpdf->smCapsScale = 0.75; // Factor of 1 to scale capital letters +- $mpdf->smCapsStretch = 115; // % to stretch small caps horizontally +Customisable Progress bar +- $mpdf->progbar_heading = 'mPDF file progress'; +- $mpdf->progbar_altHTML = ''; +Control fonts/subsetting +- $mpdf->maxTTFFilesize = 2000; +- $mpdf->percentSubset = 30; +- $mpdf->debugfonts // show font errors and warnings +Replaceable alias +- $mpdf->iterationCounter = false; // Allow use of {iteration varname} in THEAD + + +=========================== +mPDF v5.0Beta (21/07/2010) +=========================== + +New features +------------ +The main change in mPDF v5 is the handling of TTF and TTC fonts directly. +See README.txt and FONT INFO.txt for more information + + +QR-code (2-dimensional barcode) Added +------------------------------------- +type="QR" +Size=1 is an arbitrary 25mm widthxheight. error="L|M|H|Q" +text="" can be numeric, alphanumeric or binary(?) +Required whitespace is always included around it + + +Enhancements +------------ +- progress-bar is simplified (no javascript class) +- dir="rtl" supported in <html> or <body> tag + +Bug fixes +--------- +- artificial Bold/Italic now working in table cells with rotated text +- "-" is now allowed in a font name e.g. sun-exta +- <dottab> now inherits font color correctly +- SVG class bugs fixed (was crashing in Adobe Reader v 7) +- background color/image in header no longer overwrites the header text + +Changed Config variables +------------------------ +$this->useSubstitutionsMB is depracated +Character substitution always occurs when using core fonts. +Use $this->useSubstitutions for all cases. + + +New Configurable variables +-------------------------- +$this->useAdobeCJK = true; // Uses Adobe CJK fonts for CJK languages + // default TRUE; only set false if you have defined some available fonts that support CJK + // If true this will not stop other CJK fonts if specified by font-family: + // and vice versa i.e. only dictates behaviour when specified by lang="" incl. AutoFont() + +// Set maximum size of TTF font file to allow non-subsets - in kB +// Used to avoid e.g. Arial Unicode MS (perhaps used for substituteCharsMB) to ever be fully embedded +// NB Free serif is 1.5MB, most files are <= 600kB (most 200-400KB) +$this->maxTTFFilesize = 2000; + +// If not -s (i.e. forced subset) this value determines whether to subset or not +// 0 - 100 = percent characters +// i.e. if ==40, mPDF will embed whole font if >40% characters in that font +// or embed subset if <40% characters +// 0 will force whole file to be embedded +// 100 will force always to subset +$this->percentSubset = 30; + +$this->debugfonts - show errors and warnings for font parsing + +Config variables removed +------------------------ +$this->use_CJK_only +$this->useOnlyCoreFonts + +================================================================================ + +==== +4.6 +==== + +mPDF + +files changed: +mpdf.php +config.php +makefonts/makefonts.php +class/t1asm.php +class/svg.php +graph.php + +examples_04 (images) + +config var added: +$this->tableMinSizePriority + +4.5.015 +Bug fix: +Complex page with ToC entries ++ (example_ToC_bug4_5_015.php) caused Apache to crash +AdjustHTML() preg_pattern for matching <hx>... </hx> <table for keep-together - altered and fixed ? matching +Seemed to crash when content="Graph 12" between the <h> - 2 numbers (12) crash, 1 didn't!!! + + +4.5.014 +Bug fix: +Using TrueType fonts, unused font is not embedded in the PDF doc. This was fine except an error message appeared after printing in Adobe Reader, +because Font reference /F1 still present in doc pointing to non-existent resource. +Edited so that the reference is now removed from the page if font unused. + + +4.5.013 +Enhancement +TrueTypeUnicode fonts width array inserted as shortened form array (smaller file size) + +4.5.012 +Bug fix: Incorrect handling orphan characters in table +(cf. http://mpdf.bpm1.com/forum/comments.php?DiscussionID=193 fixed in 4.2 - but going back to it still problems) +If xxxxx. fits but xxxxx.. doesn't: WriteFlowingBlock wraps it to next line, TableWordWrap sqeezed it onto one line +TableWordWrap fixed to only allow one orphan char. even if it fits with that one. + + +4.5.011 +Added Windows BMP image support + +4.5.010 +SVG class: +- improved recognition of lineargradients/radialgradients referenced by xlink:href +- does not die if empty text string +- support for many text properties as style="" as well as currently as attributes (bold, fill etc) +- if using MB font, was respecting "Times" and "Courier" from the SVG file but using as ANSI not utf-8 + +4.5.009 +graph.php updated to include SVG - need to define in graph.php (as well as set up TTF fonts) +(SVG graph does not include CSIM, 3D skew.) + +4.5.008 +t1asm.php has an error in the error message if .dat fontfile not found (".char.dat") + +4.5.007 +Bug fix: Using page-break-inside:avoid, if nothing would have been printed on page 1 before next page, elements going all over the place! + Also problem shifting images - fixed + Also wasn't shifting WMF/SVG images - fixed + +4.5.006 +New config var +$this->tableMinSizePriority = false; +If page-break-inside:avoid but cannot fit on full page without +exceeding autosize; setting this value to true will force respsect for +autosize, and disable the page-break-inside:avoid +[NB edit Manual Table>>autolayout algorithm] + + +4.5.005 +Bug fix +Table set to avoid page-break-inside: in some circumstances entered loop with recalculating size +Fudge factor added of 0.001 in tbsqrt to calculate shrink factor + +4.5.004 +Bug fix +If table set to avoid page-break-inside and table height (resized) exactly==remaining page - was triggering page break +Fudge factor added of 0.001 in tablewrite to query pagebreak + +4.5.003 +Bug fix in makefonts/makefonts.php +Also changed the links in Step4 & 8 which move the newly created files to the font directory - will now show error message if error - +will NOT overwrite existing files. (Put in manual already) + +4.5.002 +Bug fix in class/t1asm.php +If you have magic_quotes_runtime set On - problems using embedded subset. + +4.5.001 +JPG "Exif" file recognised from header, and handled much more quickly and efficiently (not using GD) + + + +=========================== +mPDF v4.5 (21/04/2010) +=========================== + +New Features +------------ +The main change in 4.5 is the improved class for importing SVG images. (See details below) + +Font files +---------- +Some bugs in the "makefonts" utility caused some errors in the files produced for embedding font subsets. +Surprisingly these are not easily detectable (I have yet to find one!). +All the font files used for embedding font subsets (the .dat and .dat.php files in /unifont/ folder) +have been re-generated. Download them if you are having problems with any fonts - otherwise, you probably +don't need to bother. + +Minor Enhancements +------------------ +If keepColumns = true (i.e. disable readjustment of column length), mPDF will now reproduce +table header/footer rows in each column [4.4.015] + +A number of changes to improve processing time [4.4.012] +[Thanks to carlholmberg http://mpdf.bpm1.com/forum/comments.php?DiscussionID=274&page=1#Item_3] + +JPG files with header marked as "progressive DCT-based JPEG" are now supported [4.4.004] + +Configurable variable (config.php) $dpi can be set to vary size interpreted from "px" values in HTML/CSS +NB Recommended that $dpi should always be set the same as $img_dpi + +Support added for "ex" as a size value (approximates "ex" as half of font height) + +Configurable variable (config.php) $watermarkImgAlphaBlend will determine how watermark images +will blend with underlying objects. + + +Bug fixes +--------- +- Make-fonts utility : makefonts/makefonts.php [4.4.016] + (All font files have been updated) +- Table header of only one column width - not printing right border [4.4.014] +- WMF and SVG images not rotating correctly to 90 or -90 degrees [4.4.013] +- Using templates, error if imported doc contains templates itself [4.4.001] + + +Updated Files +------------- +mpdf.php +config.php +classes/svg.php +makefonts/makefonts.php +ALL subset font files (/unifont/ .dat and .dat.php files), and all garuda and norasi files + +New files +--------- +None + +New config variables +-------------------- +$this->watermarkImgAlphaBlend +$this->dpi + +BACKWARD COMPATIBILITY +---------------------- +All but one changes in mPDF 4.5 are fully backwards compatible. +The configurable variable $this->watermarkImgBehind was introduced in v4.4 and was unintentionally set to TRUE +In v4.5 this is set to FALSE in the config.php file. + + +SVG Images +---------- +[svg.php CHANGED] +- Text stroke-width default changed to 1 [4.4.011] +- Text stroke - line-join type changed [4.4.010] +- Default value for fill changed to "black" [4.4.008] +- Bug fixes: + * to correct calculation of text-length (and therefore alignment R and C) [4.4.009] + * Corrected errors in path implementation esp. quadratic Bezier curves + * rounded corners to rectangles - error corrected + * Recognition of font-family improved + * remove \n (and other non-printable chars) from text + * zero length shapes are not output e.g. zero-width rectangle, zero-length line, zero-radius circle +- Support added for: + * gradient stop offsets and gradientUnits="userSpaceOnUse" [4.4.007] + In mpdf.php enabled define inner radius for radial gradients - only used internally by SVG at present + * user defined <ENTITY /> cf. 'render-elems-03-t.svg' in SVG Test Suite [4.4.006] + * "color" attribute and "currentColor" value for fill and stroke [4.4.005] + * fill:url(#...) in a style as well as attribute + * xlink:href for gradients + * 1.3002e-005 in svg path + * text-style changes (e.g. text-anchor) set on <g> element - not just on <text> + * fill-rule=evenodd|nozero + * dashed lines / stroke-dasharray & stroke-dashoffset + * gradientUnits=userSpaceOnUse; + * units e.g. 3mm or 14pt in Rectangle, Circle, Ellipse, Line and Text position + * transform on <text> element + * stroke as well as fill on text + +NB The following are still NOT supported for SVG +- filters +- <marker> +- images +- DOM +- <pattern> +- textlength; lengthadjust; tspan, tref, toap, textPath; +- <use ../> +- gradient on stroke/text; +- <clipPath> +- text-underline and strikethrough +- text opacity +- colors as rgb(87%, 56%, 25%) +- rect using units for dimensions +- Only uses default spreadMethod = "pad" for gradients + + + + + +=========================== +mPDF v4.4 (24/03/2010) +=========================== + +New Features +------------ +- Support SVG image files (partial) +- Rotate images or graphs (by multiples of 90 degrees) +- Set opacity (transparency) for background images +- Control resizing of background images +- Set whether to print watermark images behind or in front of page contents +- Reduced memory usage when printing tables (partly configurable) +- Option to set path to folder for temporary files +- Improved compliance for CSS text-align justify +- Increased support for CSS "media" +- Improved performance when accessing local image files + + +Minor Enhancements +------------------ +- Allows space in output file name e.g. $mpdf->Output('t est.pdf','D'); [4.3.007B] +- Header changed in Output to improve compatability with IE6 (affects 'D' and 'I') [4.3.012B] +- background-images do not show noimage.jpg if missing [4.3.012D] +- simpleTables (which improves performance) now also allows: background-color, -gradient and -image, padding + and rotated text to be set for each cell. Only borders are not supported cell-by-cell. [4.3.006] + + +Bug fixes +--------- +- Page width not correctly reset when defining default page margins (L/R) by @page [4.3.007C] +- Table row <TR> with a background-color, paints the whole row, including the spaces between cells [4.3.005] + NB This should have been fixed in [4.2.028] but got left out! +- UseSubstitutionsMB causes errors inside <textarea> and <select> so now disabled in these 2 situations [4.3.004] +- CSS background: 'none' did not cancel background-image/background-color if it comes later [4.3.002, 4.3.011] +- Warning message 'depracated' (as of PHP 5.3) when using Templates [4.3.007] +- AutoFont incorrectly altering multibyte characters ending in \xa0 [4.3.012C] +- "Initial" default value for border-width changed from 1px to 'medium' e.g. border-top: solid #000000; [4.3.010] +- WMF image sometimes inverted [4.3.016] + +Updated Files +------------- +mpdf.php +config.php +changelog.txt + + +New files +--------- +classes/svg.php + + +New config variables +-------------------- +$this->justifyB4br=false; +$this->CSSselectMedia='print'; +$this->watermarkImgBehind = false; + +BACKWARD COMPATIBILITY +---------------------- +All changes are backwards compatible except the handling of some background-images - please see notes below. + + +Watermark Image z-order +----------------------- +By default mPDF prints watermarks on top of the page contents to ensure that they are not hidden by backgrounds +(especially table cells). +You can specify watermark images to be printed behind page contents by setting a configurable variable: +$this->watermarkImgBehind = true; // default=false +[4.3.018] + + +Rotating Images and Graphs +-------------------------- +Images or graphs can be rotated (by multiples of 90 degrees) using a custom HTML attribute e.g. +<img rotate="90|-90|180" ... /> +<jpgraph rotate="90" ... /> +Valid options are: 90|-90|180. +Positive values are clockwise. +If width is specified e.g. width="3cm" this is applied to the rotated image i.e. will be width 3cm after rotating +[4.3.016] + + +Background Image Opacity +------------------------ +A custom CSS property "background-image-opacity": is now supported on BODY, DIV+ (block elements) and TD +Takes values between 0 and 1.0 + + +Resizing Background Images +-------------------------- +A custom CSS property "background-image-resize": is now supported on BODY, DIV+ (block elements) and TD +0 - No resizing (default) +1 - Shrink-to-fit w (keep aspect ratio) +2 - Shrink-to-fit h (keep aspect ratio) +3 - Shrink-to-fit w and/or h (keep aspect ratio) +4 - Resize-to-fit w (keep aspect ratio) +5 - Resize-to-fit h (keep aspect ratio) +6 - Resize-to-fit w and h + +N.B. Prior to v4.4 background-images were incorrectly constrained to maximum width of the containing block. +The default is now to do NO resizing on background-images. Setting "background-image-resize:3" should be used +for backwards compatibility. +[4.3.015, 4.3.012D] + + +SVG Image files +--------------- +SVG image files are now partially supported (but as for WMF - not as background-images). +viewBox (preserveAspectRatio is not supported) viewBox="0 0 400 200" width="400" height="200" +Takes viewBox in preference to width/height if present on <svg> +If neither present, will size to width of page (square) as the containing box. +Units are interpreted as pixels if undefined. +Doesn't recognise internal CSS <style> elements +Gradients only take 2 colours which are taken as stop-offset 0% and 100% +[4.3.013 & 4.3.017] + + +Reduced Memory Usage printing Tables +------------------------------------ +mPDF uses a lot of memory when processing large tables. Parts of the script have been rewritten to +reduce memory consumption when writing tables which use collapsed borders (10-25% saving). + +Memory usage can be reduced further by setting a configurable variable: +$this->packTableData = true; // default=false +but note that this causes a significant increase in processing time. +[4.3.008, 4.3.019, 4.3.014] + + + +User-defined path to Temporary folder +------------------------------------- +mPDF uses a folder to write and store temporary files when processing images. By default this is the +[your_path_to_mpdf]/tmp/ +This is now user-definable by defining the constant _MPDF_TEMP_PATH before including mpdf.php script. + + +Text Justification +------------------ +In a justified text block, an inline image, textarea, input, or select causing a new line will now force +the previous line to be justified. HR and BR do NOT force justification (as in browsers). +For optional compliance of MS Word behaviour, there is a new configurable variable: +$this->justifyB4br = false; // Change to true to force justification before a <BR> (as in MS Word) +[4.3.003] + + +CSS support for @media +---------------------- +Now supports media-dependent CSS styles e.g. +@media print { + p { color: red; } +} +as well as +<style media="...">...</style> and +<link rel="stylesheet" media="print" href="..." /> +Proper matching of CSS media to select using configurable variable: +$this->CSSselectMedia='print'; // default="print" set in config.php : screen, print, or any other CSS @media type (not "all") +N.B. $this->disablePrintCSS in now depracated +[4.3.001] + + + + +=========================== +mPDF v4.3 (28/02/2010) +=========================== + +NEW FEATURES +------------ +- Page (sheet) size can be reset within document (http://mpdf1.com/manual/index.php?tid=436) [4.2.024, 4.2.025] +- PDF/A1-b compliant files (http://mpdf1.com/manual/index.php?tid=420) +- Improve performance using simpleTables (http://mpdf1.com/manual/index.php?tid=430) +- mPDFI incorporated into main mPDF class (http://mpdf1.com/manual/index.php?tid=432) +- <dottab> added as custom HTML tag: inserts dots to the following text, which is right-aligned [4.2.031] + +See Example files 38 and 39 for PDFA compliant file and <dottab> + +BACKWARD COMPATIBILITY +---------------------- +All changes are backwards compatible except the use of mPDFI. You will need to make minor changes to your scripts. +See the manual http://mpdf1.com/manual/index.php?tid=432 for details. + +BUG FIXES +--------- +- When using Table of Contents and not resetting page numbers: HTML headers/footers showed incorrect page number [4.2.020] +- Table of Contents: last page not printing page background-color [4.2.023] +- Image file with space " " in the file name failing [4.2.016] +- Image file path unnecessarily resolved to full URI - changed to use relative path if possible [4.2.029] *** +- Table - not calculating height of cell correctly [4.2.015, 4.2.012, 4.2.011, 4.2.009] +- Table row breaking after/during cell when image in cell taller than font-height [4.2.008] +- When Table row(cell) greater height than the page-height but requiring resizing greater than allowed by autosize - not resizing [4.2.005] +- Table cell border not resized correctly [4.2.002] +- Table row <TR> with a background-color, paints the whole row, including the spaces between cells [4.2.028] **** +- Background-image in HTMLFooter not correctly setting 0,0 origin [4.2.014] +- Background-image set as an in-line style not working [4.2.013] +- Background-image set in CSS @page or <body> was being constrained to less than page size [4.2.032] +- Imported Templates overwriting Headers (with images or gradients) [4.2.004] +- When using imports/templates, HTML header with background-image causing page to disappear [4.2.001] +- block-style element breaking over more than 2 pages incorrectly adjusting L/R margins [4.2.022] +- CSS @page property "size" set on :left :right or :first pseudo-selectors - disabled [4.2.022] +- Annotations default colour incorrectly set in PDF as [100 100 0] corrected to [1 1 0] (seemed to work ok?) [4.2.026] +- Overwrite() now parses input file more tolerantly recognising more source files [4.2.030] + +**** Bug fix 4.2.028 never got into the release of v4.3 Included in next release [4.3.005] +**** Bug fix 4.2.029 never not fully implmented in v4.3 Included in next release [4.3.012] + +Changed files +------------- +mpdf.php +compress.php +config.php +classes/t1asm.php +includes/functions.php +mpdfi/fpdi_pdf_parser.php +Added files/folder: /mpdfi/filters/*.* +Added file/folder: /iccprofiles/sRGB_IEC61966-2-1.icc +mpdfi/mpdfi.php (no longer required) + +New Configuration variables +--------------------------- +[config.php] +$this->enableImports +$this->simpleTables +$this->PDFA +$this->ICCProfile +$this->PDFAauto + + +Minor changes +------------- +Increased PDF file compatibility with spec 1.4 +- PDF version changed to 1.4 +- A binary file marker (a comment line with 4 characters > 127 ASCII) is added just after the first line +- %%EOF no longer has line break after it [4.2.010] +- /ID object is added to trailer object when not encrypted [4.2.010] + +When using progress bars, one of the JS scripts is now referenced as an external file + to allow it to be cached by user's browser and improve performance for end-user [4.2.007] + +Importing external PDF files: LZW encoded PDF files are now supported + +When adding an annotation, the popup window can be set be either open or closed when the document is opened [4.2.027] +- size and position of the popup can also be specified + + + +=========================== +mPDF v4.2 (27/01/2010) +=========================== + +NEW FEATURES +------------ +- image handling improved +- table layout - additional control over resizing +- vertical-alignment of images - better support for all CSS types +- top and bottom margins collapse between block elements +- improved support for CSS line-height +- display progress bar whilst generating file +- CSS @page selector can be specified when adding a pagebreak +- CSS @page selector allows different margins, backgrounds, headers/footers on :first :left and :right pages +- PNG images with alpha channel fully supported +- ability to generate italic and bold font variants from base font file +- CJK fonts to embed as subsets +- "double" border on block elements +- character substitution for missing characters in UTF-8 fonts +- direct passing of dynamically produced image data +- background-gradient and background-image can now co-exist + + + +Bug fixes +--------- +- empty variable (undefined var, false, null, array() etc.) sent to WriteHTML produced error message "Invalid UTF-8" +- CJK in tables when not using CJK (utf-8-s) autosized very small as characters did not word-wrap +- parsing stylesheets: background image not recognised if containbed uppercase characters in file name +- "double" border on table used white between the lines instead of current background colour +- $this->shrink_tables_to_fit = 0 or false caused fatal errors +- background color or images not printing correctly when breaking across pages +- background not printed for List inside a block element +- columns starting near end of page with no room for a line triggering column change (resulting in text misplaced) not page break +- table cell not calculating cell height correctly when "orphan" characters (;:,.?! etc.) at end of line +- table breaking page in column 2 when col 1 is rowspan'ned +- margin-collapse at top of page not working if bookmark/annotation/indexentry/toc +- column break triggered by HR triggering a second column break +- an empty 'position:fixed' element with no/auto width or height caused fatal error +- mPDFI: template documents were overwriting HTML headers +- mPDFI: function Overwrite (to change text in existing PDF) - fatal error if using with encrypted file + +Bug - not fixed +- WriteHTML('',2) with '2' parameter not recognising 'margin-collapse:collapse' for DIVs or 'line-height' set in default CSS 'BODY' + + + +New or Updated Files +-------------------- +mpdf.php +compress.php +config.php +config_cp.php +config_fonts.php +mpdf.css +classes/gif.php +classes/indic.php +includes/subs_core.php +mpdfi/mpdfi.php +unifont/ar_k_001.uni2gn.php +All files in new folder: /progress/*.* + +NEW FOLDER /tmp/ required with read/write permissions - used for temporary image files or progress bars + + + + +=========================== +mPDF v4.1.1 (21/12/2009) +=========================== +Error corrected in /makefont/makefonts.php file (moved completed Unicode files to font folder instead of unifont) + +=========================== +mPDF v4.1 (20/12/2009) +=========================== +MySQL support for embedded font subsets abandoned, and replaced with file-based. + + +Files no longer required +------------------------ +config_db.php +/unifont/RUNME.php +/unifont/*.ufm and /unifont/*.t1a font files + +MySQL Database no longer required + +Files Updated +------------- +mpdf.php +/classes/t1asm.php +/makefont/makefonts.php + +New files +--------- +/unifont/*.dat and /unifont/*.dat.php font files + + +Bug-fixes +--------- +- Image - If automatically resizing to fit maximum page size incorrectly subtracted margin-header +- Annotation and textarea in same HTML chunk causes mPDF to crash (preg_replace textarea with /u modifier in AdjustHTML) +- set_magic_quotes_runtime error ($mgr not $mqr) +- Table align did not reverse when using RTL document + +Alteration: Image - if writing Image in fixedpos div position:absolute - to allow Image to be resized to full page size + + +=========================== +mPDF v4.0 (17/12/2009) +=========================== + +Major additions +--------------- +- Ability to embed font subsets (creating much smaller files) +- Much improved support for Arabic languages +- Support for Indic languages including consonant conjuncts +- Support for Fixed position block elements +- New utility to help create your own fonts +- PNG alpha channel transparency supported +- New utility to create smaller mpdf script with reduced functionality (less memory) +- Multiple Barcode types supported + +********************************************************************************************** +* For more details see the documentation manual: http://mpdf1.com/manual/index.php?tid=410 * +********************************************************************************************** + +Bug fixes (parsing CSS) +----------------------- +- <link href="" ... was not recognised if > 1 space between words +- #Content p em { font-style:italic; } was applied to "#Content p" +- @import url() embedded in a stylesheet file requires path fixed relative to stylesheet file +- background-image url() embedded in a stylesheet file requires path fixed relative to stylesheet file +- comment tags inside CSS <style> embedded in the HTML were removed + Now fixed so <style><!-- ... --></style> works; <!-- <style>...</style> --> is removed + +Bug fixes (other) +----------------- +- clear (CSS property for floating elements) caused properties for that element to reset to defaults +- width: auto caused collapse of border and padding on L & R of ordinary block elements +- text-indent not inherited correctly (including em and % values) +- named colour "steelblue" corrected RRGGBB hex code +- table cell widths in %: if width of table cells set to >=100%, and not all columns are set + This was fixed in 3.2 but led to problem where 2 cols: 1) 80% and 2) not set (see Table sizing test) + Now fixed again to work for both(?) +- parse PNG error fixed +- bachground-image not correctly positioned in HTMLFooter and HTMLHeader (Not fixed properly in 3.2!) +- fonts not supported with 0-9 in the name +- font list in GetCodepage() in htmltoolkit.php (now config_cp.php) containing space " " not recognised +- list number positioning +- list font size set in CSS for UL/OL not working for first level list +- table width (real value, not %) not working in nested table +- GIF file failed if PDF file not compressed +- list-style-type incorrectly inherited +- line-height inheritance in lists +- SetColumns added a new line - not required if at start of document/page +- footer_line_spacing did not work +- table cellPadding="" overwrote cell padding set on cell CSS +- could not turn off Default non-HTML foter LINE +- border specified as "em" +- default values set in mpdf.css overriden by inherited properties e.g. <div><h1>Here</h1></div> lost font-size for H1 + + + +=========================== +mPDF v3.2 (25/10/2009) +=========================== +Bug fixes +--------- +- Table cell widths in %: if width of table cells set to >=100%, and not all columns are set -> froze, because tries to produce a column of no width +- Ouput download file changed to allow compatability with IE6 (http://mpdf.bpm1.com/forum/comments.php?DiscussionID=120&page=1#Item_4) +- Image error if relative path used on domain root (e.g. img src="image.png" and basepath is http://www.yourdomain.com) [attempted fix in 3.1 not working] +- Table: if font changed in cell, font was not retoring properly afterwards causing errors (restoreInlineProperties()) +- Lists: list items containing <br />, font not restoring after bullet +- Graceful support for block elements inside list items e.g. <li><p>... (not supported, but tolerated) +- Index: Created dividing letters separately for Uppercase and lowercase +- Incorrectly changing input character set when encountering e.g. charset=iso-8859-1 in the text of the document + - Changed so only detects it if within <head>...</head> +- If Keep-with-table (i.e. H1-6 before table and use_kwt true), if pagebreak forced anyway, borders did not print on previous page +- Background-image used in HTML footer not appearing (correctly) +- RTL tables: nested tables will not automatically transpose L->R +- "Keep heading with table" - changed to allow <h1 style=".."> not just <h1> +- "Keep heading with table" - backgrounds (bgcolor, image or gradient) incorrectly handled - now removed +- Rotated table spread over more than 1 page caused enclosing block background colours to be be rotated along with table +- CSS text-indent % now correctly suported (% of containing block width) +- CSS width em on a block element e.g. DIV now correctly suported +- calculating _tableheight, if remainingpage==0, get error (div by zero) +- Table moved to next page with page-break-inside=avoid, produced an enlarged table (font) +- RTL text-align override on BODY text was not working consistently +- Arab characters: Character &#x647; (HEH) appearing in Final presentation form instead of Isolated +- Vertical position of background-image on whole page incorrect +- SetProtection can now be used with no permissions set (was not working unless at least one permission set) + + +Developers +---------- +Some more undefined indexes and variables declared (courtesy of DSmart http://mpdf.bpm1.com/forum/comments.php?DiscussionID=117&page=1#Item_0 ) +Comment lines removed for < v3.0 to tidy up code + + +Enhancements +------------ +CSS style height now partially supported on block elements DIV, P, H1 etc. --IF-- + - block is all on one page + - will extend the block but not shorten it + - will not force a pagebreak (max. at bottom of page) + - % is interpreted as % of printable page height (inside margins) +<TFOOT> now supported (placed at start as in HTML spec) displays at end of table, and repeats as a footer +Background-image and background-gradient now supported in TD and TH (works in all cases except: background-image is not rotated or + positioned correctly if table is rotated) +NB Background images and background-gradients do not work if Columns are being used, or if $use_kwt is TRUE (keep-with-table), + or if page-break-inside:avoid is active. + + +Updated files +------------- +mpdf.php +htmltoolkit.php + + + + +=========================== +mPDF v3.1 (30/08/2009) +=========================== + +Bug fixes +--------- +- Image error if relative path used on domain root (e.g. img src="image.png" and basepath is http://www.yourdomain.com +was giving http://www.yourdomain.com//image.png) [3.1] +- Errors in parsing background CSS (background-repeat, background-position etc) [3.1] +- Textarea did not corectly convert width or height in units relating to font e.g. em [3.0beta_01] +- If page margin-bottom set to zero, SetHTMLfooter() crashes with "Division by zero" error [3.0beta_01] +- Table with header row and rowspan in tbody, not calculating maxrowheightcorrectly +- Prevent Index breaking column just after a dividing letter +- Select or input form field when text around it is justified had text in the form field justified +- TocBookMarkText needs to be htmlspecialchar-ed - decoded when entered inside <tocpagebreak> +- <img src="" /> caused crash +- DisplayPreferences used as a variable name and a function: function renamed to SetDisplayPreferences() +- Image with src file not including a "." incorrectly parsed (e.g. http://www.domain.com/imagegenerator?params=23) + +New Features +------------ +- var $debug (true|false) default false; show or hide error reporting at output stage [3.1] +- var $autoPageBreak (true|false) default true; allows overriding of automatic page breaks [3.0beta_02] +- <indexinsert /> HTML equivalent of CreateIndex() [was CreateReference()] +- 2nd attribute/parameter "xref" in IndexEntry() and <indexentry> - works like IndexEntrySee() as cross-reference entry +- function SetWatermarkText allows null parameters to be passed i.e. SetWatermarkText() - will clear the WatermarkText +- <watermarktext content="" alpha="" /> - HTML equivalent of SetWatermarkText() +- <watermarkimage src="" alpha="" position="" size="" /> - HTML equivalent of SetWatermarkImage() + +Documentation +------------- +See Manual at http://mpdf.bpm1.com/manual/ for more information - especially: +- User's Guide>>What Else Can I Do?>>Backgrounds & Borders +- User's Guide>>What Else Can I Do?>>Floating blocks + +Files updated: +------------- +mpdf.php +htmltoolkit.php +graph.php + + +Developers only +--------------- +mPDF<=3.1 generated a large number of warning "Notices" if run with full eror_reporting on, due to array indexes not being initiated e.g. +$arr = array(); +... +if ($arr['index'] == 5 ) {...} + +To prevent this, lines were added at the start of the mpdf.php script to turn error notices OFF. +In a move towards making mPDF able to run with full error_reporting on, a large amount of the script has been altered +e.g. the line above would be changed to: +if (isset($arr['index'] && $arr['index'] == 5 ) {...} + +Although I have tested this with a number of examples, it is almost certainly not complete. Therefore the error_reporting for Notices is still turned +off in mPDF 3.1 +If you care to test it, please uncomment line 43 (//error_reporting(E_ALL);) and report any warning notices that you get. +NB This has added about 40kB to the script size. + + + +=========================== +mPDF v3.0beta (14/06/2009) +=========================== + + +New Features +------------ +- CSS "float" partially supported (as well as clear:left|right|both) +- CSS "background-image" "background-position" "background-repeat" "background-color" "background" supported for block-level elements +- CSS background-color and background-image for <body > element added: this covers the whole page i.e. not just inside the "margins" +- CSS background-color and background-image can be defined for CSS @page{} +- Background gradients (linear or radial) can be defined using a custom CSS style property +- Border radius can be defined to give rounded edges to block elements (uses draft CSS3 spec.) +- page number can be reset to any value during the document (in AddPage() <pagebreak> etc.) +- PNG images: Interlaced and alpha-channel-set PNG images now supported +- internal links supported in Indexes (parameter added to CreateIndex()/CreateReference(): $useLinking=true;) +- HTML Headers and footers now support hyperlinks +- improved handling of <br>, block elements, and text lines inside table - approximates better to browser handling +- borders of block-level elements & table cell borders supported (partially) in columns +- optional error reporting for problems with Images ($showImageErrors) +- ToC will word-wrap long entries +- internal links (Bookmarks, IndexEntry and ToCEntry) rewritten to give more accurate positioning (when used as <tag>) +- autofont algorithm improved for CJK languages +- define text before and after page numbers ($pagenumPrefix; $pagenumSuffix; $nbpgPrefix; $nbpgSuffix;) +- Additional color names supported - full list from SVG1.0 + +Bug fixes +--------- +- Column width not resetting after an automatic pagebreak, or after setting HTMLheader +- using AutoFont unnecssarily changed htmlspecialchars to code causing errors +- Lists inside a table - incorrectly calculating table cell height +- CJK - 4-byte utf-8 chars not displaying properly (includes HKCS characters) +- mailto: links incorrectly handled +- TOCpagebreak() - usePaging default clarified: true unless specified as '', 0, '0' or false; (null ->true) +- <tocpagebreak> (as html tag) with no "name" defined, used at start of page, added a further blank page(s) +- Lists - inaccurate calculation of space required for numbers in certain circumstances +- Generated images (.php) only working if cURL enabled - (fixed, but rquires allow_url_fopen if remote file) +- flag added to turn off error reporting when buffering used ($allow_output_buffering = false;) +- RTL text in Bookmark, Title, Author, Creator, Keywords, and Subject was reversed - Adobe Reader 9 now correctly handles RTL text ( which Reader 8 did not) +- TOC - if not using ODD/EVEN paging, did not add extra page and messed up +- Rotated table which did not fit on remaining page resized to bigger than default +- HR of width less than 100% - text continued on line after it +- HR alignment not working (fixed so both CSS text-align and margin: 0 0 0 auto etc work) +- HR in table did not correctly re-size when necessary +- characters in symbols/zapfdingbats which in non-utf-8 mode are represented as chr(173) incorrectly handled as soft-hyphens + (bug introduced 2.5 with soft-hyphens - affects symbols &#8593; arrow-up and Zapfdingbats &#9313; encircled 2) +- Internal links (anchors) - Annotation/Bookmarks etc. incorrectly positioned when page orientation changed +- ToC - when using multiple ToCs, internal links were not correctly adjusted +- anchor (a name="") used inside a table was incorrectly positioned at the end of table +- Tables: cell height calculated incorrectly when BR used +- Table rotated with "page-break-inside:avoid" not kept on one page +- Table rotated and split over > 1 page - vertical alignment inaccurate +- Headers/Footers (non_html) when no style set caused errors +- Table: breaking page when using rowspan error (line 17142) +- ToC: If no indent defined in HTML tag <tocpagebreak> or defined as 0 gave error + +Note +---- +In mPDF 3.0 the following sections of code have been significantly rewritten: +- painting of borders and background colours for block-elements +- table of contents +- Index +- vertical justification in columns (uses scaling to stretch vertically) + +NB changed htmltoolkit AdjustHTML - does not now remove <br> before </div> + Warning - may display differently in normal text as well as tables + + +Files updated: +------------- +mpdf.php +htmltoolkit.php + + +Developers only +--------------- +- Background-color handling in CSS changed so only inherited/cascaded when Columns active or Keep-block-together + - otherwise would overwrite background image with inherited color +- all %.2f used in sprintf() changed to %.3f in htmltoolkit.php and mpdf.php to increase accuracy of div border lines in columns etc. +- variable $use_embeddedfonts_1252 renamed to $useOnlyCoreFonts as more precise: depracated but still supported. +- this version included quite abit of tidying up/future-proofing some code: + $var{0} changed to substr($var,0,1) etc. (due to go in PHP6) + ereg_ changed to preg_ (depracated in PHP5.3) - (NB mainly in htmltoolkit.php) + + + +=========================== +mPDF v2.5 (01/05/2009) +=========================== + +New Features +------------ +- Automatic Hyphenation added, and support for soft-hyphens +- Encryption works now for CJK language documents +- Improved text justification +- Support for 'generated' images e.g. "../ontheflyimage.php" + + +Bug fixes +--------- +- Tables: cell height did not reduce if font-size used was smaller than table default +- Columns: if setcolumns() to the same number already active - did not print out last bit of previous columns +- Page-break in the middle of a block caused incorrect margin and padding on next lines until end of block ($cMargin reset to 0 in AddPage) +- <HR> in table cell was printing in incorrect position (bug introduced in mPDF 2.4) +- Justification + - if only one word on line, did not respect maximum character spacing + - last character of line incorrectly had character spacing applied + - Space at the end of last line of a Right Justify block - e.g. "end. </p>" now correctly ignored + - &nbsp; incorrectly treated as a character when justifying text with word/char spacing + - CJK punctuation (.,) added as 'orphans' to keep at end of line +- PNG files - was still buggy reading larger PNG files (due to fread) + + +Files updated: +------------- +mpdf.php +htmltoolkit.php +CJKdata.php +/patterns/.. (new files) + + +Developers only +--------------- +Variables renamed as more accurate or appropriate: +- var $isunicode renamed as $is_MB +- var $usingembeddedfonts renamed as $usingCoreFont +CJK changed to act internally as UTF-8 encoded +- (NB CJK Half-widths not supported from 2.5+ i.e. big5-hw gb-hw) + + + +=========================== +mPDF v2.4 (23/04/2009) +=========================== +Files updated +------------- +mpdf.php +htmltoolkit.php +mpdfi/mpdfi.php + +New files +--------- +graph.php +Graphs - Requires new folder: path_to_mpdf/graph_cache/ (must be writeable) + +New features +------------ +Annotations improved so they appear as a pop-up +Re-use Document Templates (cf. RestartDocTemplate() in manual) +Limited support for CSS float property on an IMG element allowing text wrapping e.g. <img style="float: right;"> (cf. Images in manual) +Utility function PreparePreText() allows output of a text file which may include <pre> +Automatic generation of graphs from data in tables (requires integration with JPGraph) (cf. Graphs in manual) + +Other Changes +------------- +IMPORTANT - User rights removed as not working with newer version of Adobe Reader 9 (affects Active forms and ability for users to modify annotations) +Corrects text alignment when using {nb} or {nbpg} in (non-HTML) headers/footers +Sets default timezone if not already set (at top of mpdf.php) to prevent E_STRICT ERROR message +Suppresses E_NOTICE error reporting (at top of mpdf.php) +Error capture in Output() to avoid PDF header being sent when error messages generated +A function str_ireplace added to htmltoolkit to allow PHP4 to function + +Bug fixes +--------- +WMF images incorrectly positioned when in-line +PNG images > 8kB failed to load - (fix in 2.3 didn't work - fixed properly this time) +Annotations containing a new line (\n) causing an error +Evaluation of <pre> text: "<code>[TAB] " evaluated incorrect number of spaces to follow to align tabs, because < was calculated as 4 chars (&lt;) + + + +=========================== +mPDF v2.3 (22/03/2009) +=========================== + +New Features +------------ +- Optionally detect language and when to use special fonts i.e. RTL (arabic), CJK (chinese), Thai (see SetAutoFont() etc.) +- Supports HTML attribute "lang" in all tags and uses special fonts when required (see $useLang) +- Joins Arabic and Farsi/Persian text into presentation forms +- Import another PDF file and use as templates in your document (see UseTemplate() and mPDFI in the manual.) +- Replace specified text strings in an existing PDF file (see OverWrite() etc.) +- More than one Table of Contents can be used in a document (see tocpagebreak etc.) +- Restore properties of open HTML block elements after a page break (variable $restoreBlockPagebreaks or new tag <formfeed>) +- <annotation> <bookmark> <indexentry> <tocentry> can now accept characters <>'"& as htmlentities - htmlspecialchars(..., ENT_QUOTES) +- <annotation> can now accept "\n" for new line +- support for opacity (CSS3 property) for images +- specify the number of spaces to substitute for TAB when parsing <pre> tags +- greater control over margins and display when changing page orientation during document (see $forcePortraitMargins and $displayDefaultOrientation) + + + +Bug fixes +--------- +Fonts in CSS - Not parsing font-family: Trebuchet MS; correctly as trebuchet +Fonts in CSS - CSS font-family: [unknown]; setting first $available_unifont rather than ignoring +Images - not displaying on IIS platform +Images - .wmf not displaying if (allow_url_fopen) not set +Table borders - in defaultCSS, 'MARGIN-COLLAPSE'=> collapase not quoted therefore not working +Line-break inside table - printing a blank background across page rather than just going down a line +Form fields inside tables - will now resize if the table is autosized (shrunk) +<pre> containing a '<' was changed to '&lt;' +Tabs inside <pre> were all changed to 8 spaces, not the remainder following a string +Header on first page was inset by 1mm left and right ($cMarginL and $cMarginR not set to zero) +Table nested inside a cell with colspan > 1 was incorrectly handled +PNG file crashed (?incorrectly defined PNG file) [adapted _parsepng to account for unexpected] +Table or Cell - if font-size not recognised, mPDF set font-size to zero +Font-sizes - [xx-small|x-small|small|medium|large|x-large|xx-large] were not recognised in tables + + +=========================== +mPDF v2.2.1 (17/02/2009) +=========================== +Bug fix - (bug introduced in 2.2) +Table - header row did not return to top of page when repeating across pages. + + +=========================== +mPDF v2.2 (15/02/2009) +=========================== +Updated files from mPDF 2.1 +mpdf.php +htmltoolkit.php +mpdf.css (new) +=========================== +New files from mPDF <2.0 (only required for EAN Barcodes) +font/ocrb.xx (several) +unifont/ocrb.xx (several) +IMPORTANT - you need to make sure the ocrb font is added to the config.php file + - add 'ocrb' to the end of 3 arrays: $this->available_fonts $this->available_unifonts and $this->mono_fonts +=========================== + +Summary of changes +- external stylesheet file (mpdf.css) is used to configure default values ($useDefaultCSS2 and $defaultCSS2 are no longer used) +- special comment tags to hide mPDF tags from browsers: <!--mpdf ... mpdf--> +- AddColumn() function added (equivalent to <columnbreak>) +- annotations - pop-up messages the reader can move or delete (if you set permissions) +- support for WMF images as well as GIF, JPG, PNG +- watermark image can be set instead of, or as well as text +- nested tables can include other content +- improved control over table layout +- margin: auto now supported for table and block elements + +A number of methods and variables have been renamed or reCapitalised for consistency. +Changes should be backwards comaptible. +All user methods start with a Capital, all user-defined variables start with lowercase. +Affected: +Reference() -> IndexEntry() +CreateReference() -> CreateIndex() +$TopicIsUnvalidated -> $showWatermark +setUnvalidatedText() -> SetWatermarkText() + +PHP appears at present to be case-insensitive for function/method names +All the following functions have been renamed in the script with a capital first letter: +setUserRights() +setBasePath() +setAnchor2Bookmark() +setHeader() +setFooter() +defHeaderByName() +defFooterByName() +setHeaderByName() +setFooterByName() +setHTMLHeader() +setHTMLFooter() +defHTMLHeaderByName() +defHTMLFooterByName() +setHTMLHeaderByName() +setHTMLFooterByName() +shaded_box() +writeBarcode() + +Variable names changed to lowercase first letter: +(Variables are case-sensitive therefore aliases have been set up) +Anchor2Bookmark +BiDirectional +KeepColumns +AliasNbPg +AliasNbPgGp + +========= +Bug fixes +========= +Columns - $keepColumns=true was incorrectly calculating the place to continue printing after 1 and half columns (of 3) +Table cell height - incorrectly setting table cell height when cell contained a line of text of large size which wrapped to more than one line +HR in Table cell - if table cell contains only HR (and column otherwise empty), HR was printed outside cell +HR in Table cell - if table cell ended with a HR, height was one line too much +Table page-break-inside:avoid - caused mPDF into permanent loop in some circumstances +Paging - Total Pages/Group {nb} and {nbgp} didn't work in CJK +CSS - Border size thin, medium and thick were only recognised in lowercase +Table-header - rowspan not correctly output in THEAD +Default CSS - table empty-cell:hide changed to show (CSS specification) + +=========================== +mPDF v2.1 (24/01/2009) +=========================== + +New Features in Version 2.1 +--------------------------- +- CSS support improved generally (especially for cascading CSS, lists) +- TableHeader changed to allow multiple rows in THEAD + + +CSS changes +----------- +- display: none (block elements only - not lists or tables, nor HR) +- width (TD/TH) +- list-style-type (will also recognise the list-style-type from list-style) (OL/UL) + recognised values: disc|circle|square|decimal|lower-roman|upper-roman|lower-latin|upper-latin|lower-alpha|upper-alpha|none +- CSS support for <LI>: font-family, font-size, font-style, font-weight, color, background-color, text-decoration, text-transform, and list-style-type (will also recognise the list-style-type from list-style) +- table cell borders - CSS rules have been adapted slightly - if a coloured/black line conflicts with a white line, and is the same width, coloured/black will overwrite even if Bottom or Right + + +Numbered Lists +-------------- +Variables set at the top of mpdf.php can be set to change: +- text alignment of numbers in numbered lists (default Right) + var $list_align_style = 'R'; +- content to follow a numbered list marker e.g. '.' gives 1. or IV. whereas ')' gives 1) or a) + var $list_number_suffix = '.'; +(These can be altered at run time, but are not changeable through stylesheets or in-line style) + + +Writing broken segments of HTML +------------------------------- +2 new parameters have been added to WriteHTML() +function WriteHTML($html,$sub=0,$init=true,$close=true) { +$close - Leaves buffers/variables etc. in current state, so that it can continue to write the HTML where it leaves off +$init - Clears and resets buffers/variables +(N.B. You must end with a WriteHTML that calls $close=true) +Example: +$mpdf->WriteHTML('<p>This is the beginning...', 2, true, false); +$mpdf->WriteHTML('...this is the middle...', 2, false, false); +$mpdf->WriteHTML('...and this is the end</p>', 2, false, true); + + +Rotated text in table cells +--------------------------- +NB This UPDATE will change expected output from previous versions****** + +Prior to v2.1 any cell set to rotate text anticlockwise was forced to vertical align = bottom. +This has been changed so that it only overrides when the rotate angle is between 45 and 89 degrees: text rotated exactly 90 degrees will respect the set value for vertical-align. + + +========= +Bug fixes +========= +- List - list starting after "<div>Then some text not in a block element<ol>" incorrectly output +- Tables - if cell font-size set smaller than default for the table, does not shrink the cell height +- Columns (tables) - columns breaking across rows e.g. in the middle of a table cell +- Tables - if table width set to e.g. 100% but cols are less, was not making up to set width +- Watermark - was not printing if using HTMLFooter +- Lists - not aligning numbering correctly if different font sizes used for bullet & text etc. +- Lists - indent of text did not correctly allow for Maximum number in <ol> list +- Table does not always move correctly to a new page +- Table cell incorrectly calculated height causing text to overflow cell when printed +- Table borders in columns not being correctly handled (bug since 2.0 introduced a buffer to save the borders and print at the end of the table - fixed so does not use buffer if in columns - potentially does not deal with conflicting borders as well, but works in columns) +- Table cell width if set as a percent was being downsized when autosizing table +- Table CSS was buggy - improved +- SetBasePath (when fetching remote website) - now handles string with query string on it e.g. http://www.domain.com/index.php?tid=42 +- Table cells with Rotated text - text not positioned correctly +- Page number totals not working in utf-8 mode + + +============================ +Code efficiency improvements +============================ +- BIG speed improvement (compared with 2.0) with tables (especially large tables) +- considerable increase in speed if writing long HTML segments to mPDF +- speed improvement for tables (may be very significant if some cells have a lot of text in them causing uneven column widths) + +NB To speed up program more, consider setting $mpdf->useSubstitutions=false; if you do not use any characters outside the codepage selected + + +=============== +Keep-with-table +=============== +(This was introduced in v2.0 but I forgot to document it) +If you set $this->use_kwt = true; +All H1-H6 elements will try to keep with a table that follows immediately afterwards - (this is done in htmltoolkit, by adding an attribute KEEP-WITH-TABLE) +See Known Issues re: Using kwt inside a div with border/background (doesn't work) + + + + +=========================== +mPDF v2.0 (07/12/2008) +=========================== +Main New Features in Version 2.0 +- nested tables are supported +- supports both models of table border: separate and collapsed +- improved parsing of CSS stylesheets, and better handling of styles throughout +- additional recognised CSS styles +- page orientation, size, and margins can be changed within the document, using PHP script or custom HTML +- some limited support for @page CSS to define page-box areas, with crop/cross marks for printing +- improved control over headers and footers (including HTML headers/footers) +- improved presentation of Form elements including image-type input fields +- generates an EAN barcode suitable for a book/printed publication +- active forms can be generated - EXPERIMENTAL at present +- change document permissions to allow the user to make annotations - EXPERIMENTAL at present + +NB Lines are commented in mPDF script as changes for mPDF 1.4 - this became v2.0 + +========= +UPGRADING +========= +IMPORTANT - Before Upgrading: Please note that some of the changes will cause mPDF 2.0 to render the pages differently from earlier versions i.e. it is not totally backwards comaptible. Read the notes on Backward compatibility before deleting your original set-up. + +To upgrade from v<=1.3 to v2.0 you only need to copy and overwrite the following 2 files: +mpdf.php +htmltoolkit.php + +Plus (optionally) if you want to use the EAN Barcode function, you will also need: +font/ocrb.xx (several) +unifont/ocrb.xx (several) +IMPORTANT - you need to make sure the ocrb font is added to the config.php file + - add 'ocrb' to the end of 3 arrays: $this->available_fonts $this->available_unifonts and $this->mono_fonts + + +========== +Bug Fixes +========== +<columns column-count="0"> did not turn off columns - Fixed + +Margins as % - e.g. margin-right: 50% set from CSS incorrectly applied 50% of the fontsize +(Fixed - adding parameter to fn. ConvertSize in htmltoolkit.php and in calls to that function) + +DIV Width - e.g. div style="width: 50% was not working +(Fixed - fn.SetCSS and OpenTag()'DIV') + +CSS values as Zero - p { margin: 0; } did not work in stylesheet unless 0 had a unit + +Multiple Non-breaking spaces collapsed - e.g. "1&nbsp; &nbsp; &nbsp;2" - was contracted to "1 2" +(Fixed - fn.adjustHTML in htmltoolkit.php) + +Table cell too narrow causing incorrect printing - If two characters are too wide to print (only likely within a table cf. example tables - Periodic table) the first character was not printed, just a new line +(Fixed in fn.WriteFlowingBlock) + +Font size by inline style for form elements <input> <textarea> gave wrong size when using a relative size 0.9em +(Fixed - fn.ConvertSize in htmltoolkit.php) + +Creation Date not correctly showing +(Fixed - did not need to convert to UTF16) + +New block element started at end of page - block borders not painted +(Fixed - fn.AddPage) + +DL did not close block correctly +(Fixed - mistype in fn. CloseTag) + +Transparent not recognised as color/background-color +(Attempted a fix by setting to ignore it! - fn. convertcolor in htmltoolkit.php) + +Zero (0) not displaying if only thing in table cell or tags e.g. <td>0</td> <p>0</p> +(Fixed - fn.WriteHTML) + +Page Headers/Footers - Simple Headers or Footers defined as e.g. '|{PAGENO}|' were not split into 3 components, but output |6| in the outer margin. +(Fixed) + +Could not copy from a completed PDF doc to clipboard when using a TrueTypeUnicode font +(Fixed - fn._puttruetypeunicode - added CIDToGIDMap) + +Creating an Index (confusing called CreateReference in mPDF) based on only 1 column (i.e. columns off) caused it to print FAIL +(Fixed - fn. CreateReference()) + +Table of Contents - If a ToC entry reached other side of page a warning notice was produced +Fixed - printing is now suppressed and it is moved down a line (but not when using rtl) + +"Keep Block Together" (i.e. page-break-inside: avoid for a block element) +If this property causes some text to be moved to the next page, internal link targets (i.e. <a name="xxx">) were incremented pagenumber by +1 - as this used the calculated document page number, didn't work if using e.g. roman numerals +(Fixed) +NB This is now ALWAYS disabled when it meets a table - can use page-break-inside:avoid for the table + +@import url(style.css) without quotation marks "" was not picked up, although it is valid HTML +(Fixed - fn.ReadCSS()) + +Reading CSS from external style sheets included all media +Now set by default to ignore media="aural|braille" +Allows media="print" but can exclude by: $mpdf->disablePrintCSS = true; (default = false) +Works on both <link... and <style media="print">@import... +See the web page example - this stops the CSS stylesheets specifically marked for "print" to be ignored + +Table borders (in collapsed model) incorrectly calculated which border had dominance (mPDF <=1.3 determined the overriding border by its color) +(Fixed to follow CSS 2.1 specifications: width >> CSS dominance (cell>table) >> T & L > B & R) +In the border-collapse=collapse mode, the following rules determine which border style "wins" in case of a conflict: +1. Borders with the 'border-style' of 'hidden' take precedence over all other conflicting borders. +2. narrow borders are discarded in favor of wider ones. +3. styles are preferred in this order: 'double', 'solid', 'dashed', 'dotted', 'ridge', 'outset', 'groove', and the lowest: 'inset'. +4. If border styles differ only in color, then a style set on a cell wins over one on a table. +5. When two elements of the same type conflict, then the one further to the left or top wins out. + +Parsing CSS, a missed level would not be picked up i.e. CSS = div.refstr1 p {...} would not pick up: +<div class="refstr1"> <div class="another"> <p>... +(Fixed - fn. MergeCSS by carrying everything forwards) + Note: I removed - && !$this->blk[$this->blklvl-1]['cascadeCSS']['CLASS>>'.$attr['CLASS']]['depth'] + Not sure why I put it there in the first place! + In a later bit of function - && $this->blk[$this->blklvl-1]['cascadeCSS'][$tag]['depth']>1 + Haven't removed this, but is it needed??? + +CSS inline style set in TD/TH (font-size, color, weight, font-family or italic) didn't turn off at the end of the cell (and also formatted the top left cell) +(Fixed) + +CSS properties color, font-weight, and font-style set on a table were not inherited by the table cells +(Fixed - var $base_table_properties) + +When rotating a table, the text following was positioned incorrectly +(Fixed - fn. printtablebuffer) + +When rotating a table, links were not adjusted in position e.g. <a href="">... +(Fixed - fn. printtablebuffer) + +If a larger border-thickness was set for a cell in the middle of a table, cells before that inaccurately calculated the cell wdith needed +(Fixed) + +Text in a table cell which was not in a block and followed a list, there was no line break e.g. </ol>Text following</td> +(Fixed - var $listjustfinished;) + +Setting the default font-family from the body tag using in-line CSS did not work e.g. <body style="font-family:mono"> (did work in external stylesheets) +(Fixed - fn.WriteHTML) + +<link href="..." rel="stylesheet"> was not recognised (because the href comes before the rel) +(Fixed) + +Read linked CSS stylesheet OR @import stylesheet - now includes both. + +<tag class="class1 class2"> did not set either class1 or class2. Fixed so that it will now pick out class1 (better than nothing!) + +CSS line-height as % - interpreted 120% as 120 (x the font-size) - Fixed so it now accepts % and numbers + +Setting the basepath (used for relative links/external stylesheets etc) with $mpdf->setBasePath() was generally buggy! +Now allows a domain e.g. $mpdf->setBasePath("http://www.domain.com"); (previously needed slash on end) +(Fixed - hopefully!) + +If you were repeatedly calling mPDF in a loop to produce more than one PDF file, it would crash with error: "You have restricted the number of available fonts to 0". Fixed by editing line 751 require(_MPDF_PATH.'mpdf_config.php'); to require(... + + +============= +Improvements(?) +============= +Unsupported image files - mPDF died with an error message if image files didn't meet expected format e.g. an interlaced PNG file +Changed so images are now replaced by the NOIMG image. + +Footer margin (HTML and normal footers) now determines the lowest point that is printed (rather than the place to start printing the footer) +NB IMPORTANT CHANGE - not backwards comaptible + +Tabs in <pre> or <textarea> are now replaced by 8 spaces rather than 6 (consistent with http://www.w3.org/TR/1998/REC-html40-19980424/struct/text.html#edef-PRE) [fn. AdjustHTML() in htmltoolkit.php] + +To insert the total number of pages in the document anywhere in the doc, just use '{nb}' +The line: $mpdf->AliasNbPages(); +has now been uncommented allowing {nb} to be used +NB This will always give the total no. of pages in the whole document regardless of any changes you have made to page numbering. +You can change the default placeholder '{nb}' to any string using: $mpdf->AliasNbPages('[**my Chars**]'); + +$mpdf->AliasNbPageGroups(); default="{nbpg}" +Can be used to set the total number of pages in the current group i.e. between where page numbering is reset + +CSS border correctly fixes "solid 3mm #000000" i.e. (style width color) - (not a bug, but this is often incorrectly specified) + +Can now print div background behind a rotated table. + +You can keep columns as they are i.e. 1st column will finish page then start on second, by setting +$mpdf->KeepColumns = true; + +Image constrain +=============== +Image size is constrained to current margins and page position. Extra parameter added to end of fn. allows you to override this. +$mpdf->Image('files/images/frontcover.jpg',0,0,210,297,'jpg','',true, false); // e.g. the last "false" allows a full page picture +Useful for e.g. a cover page for your document + +Cumulative CSS +============== +In version <=1.3, if you call: +$mpdf->WriteHTML($stylesheet,1); +$mpdf->WriteHTML($html); // this one cleared the array $this->cascadeCSS; conatining cascaded CSS information from stylesheets +You were meant to call: +$mpdf->WriteHTML($html,2); // which doesn't re-parse the CSS information +v2.0 changed so that +$mpdf->WriteHTML($html); no longers clears the array $this->cascadeCSS and so can be used repeatedly; + + + +================================================ +Additional CSSstyles & HTML attributes supported +================================================ +<BODY> - font-style, font-weight, color + +<IMG> - html attributes width="" and height="" + +<TABLE|TD|TH> - border: 'thin' 'medium' and 'thick' are now converted to 1px, 3px and 5px +<TABLE|TD|TH> - border now respects all types - e.g. 'double', 'solid', 'dashed', 'dotted', 'ridge', 'outset', 'groove', and 'inset' +(NB mPDF only supports a full declaration of border e.g. "border: thin double #000000;") + +<TD|TH> - CSS style="white-space: nowrap" and HTML attribute nowrap="nowrap" +<TABLE> - page-break-inside: avoid +<TABLE> - border-collapse: separate|collapse +<TABLE> - border-spacing: 2px 2px; (horizontal/vertical) or just one figure (both) NB same as cellSpacing +<TABLE> - empty-cells: hide|show (border-collapse:separate only) +<TABLE> - margin-left and margin-right (previously only supported top and bottom) +<TABLE> - padding: (this was incorrectly used for TD/TH before) (border-collapse:separate only) +<TD|TH> - padding: +<TABLE|TD|TH> - inline style "background" works (with a color only) the same as "background-color" + +NB Table page-break-inside, autosize values and rotate are only respected for that set on first level table of nested tables + +<TABLE> - cellSpacing and cellPadding HTML attributes: +NB cellSpacing is the same as CSS style "border-spacing" +NB cellPadding is a <table> attribute, but sets the cell padding - not table padding + +<TABLE> - align="..." now works with a rotated table - but sets the alignment ignoring the rotation i.e. align=right sets the table to the right side of the page (looking as though it is bottom-aligned) + +<BLOCK ELEMENTS> - page-break-before: always|left|right - NB any surrounding block tags will be closed before the new page is inserted. + +@page - see notes on Paged Media + +========================== +Unsupported HTML attribute +========================== +<TD border="1"> - not valid HTML - no longer supported + + +========= +Additions +========= +"Keep-with-table" +$mpdf->use_kwt = true; // default=false +If set to true, will force any H1-H6 header immediately preceding a table to be kept together with the table +- automatically sets the table to fit on one page (i.e. page-break-inside=avoid) if it is a rotated table +- ignored if: Columns on, Keep-block-together active (page-break-inside=avoid for surrounding BLOCK), active Forms + + +===== +Notes +===== + +NB Not a change - but note you can use this to allow you to feed html code encoded in other than utf-8: +$mpdf->allow_charset_conversion=true; +$mpdf->charset_in='windows-1252'; (needs suitable codes for iconv i.e. windows-1252 not win-1252) + +Fixing Optional tags +==================== +php.net website has illegal nesting of <dt>.. <dd> .. </dd> .. </dt> and <p>.. <div> .. </div> .. </p> +The example wich parses the php.net webpage will not show correctly unless you change: $mpdf->allow_html_optional_endtags=false; +Trying to fix incorrect (X)HTML with $mpdf->allow_html_optional_endtags==true cancels the P when it meets a DIV etc. + + + +EAN barcode +=========== +An EAN barcode can be generated +function writeBarcode($code, $showisbn=1, $x='', $y='', $size=1, $border=0, $paddingL=1, $paddingR=1, $paddingT=2, $paddingB=2) { +It accepts 12 or 13 digits with or without - hyphens as $code e.g. +$mpdf->writeBarcode('978-1234-567-890', 1, $mpdf->x, $mpdf->y); +NB - IMPORTANT*** +A new font - OCR-B font/unifont is required, and needs to be added to the config.php file +cf. http://www.gs1uk.org/downloads/bar_code/Bar coding getting it right.pdf +Barcode size must be between 0.8 and 2.0 (80% to 200%) + +CMYK Colors +=========== +Functions - SetDrawColor, SetTextColor and SetFillColor all now take an optional 4th parameter. +If defined this will interpret the input as CMYK color i.e. +SetDrawColor(15,82,0,10) // NB all values out of 100 - not 255 as for RGB + +htmltoolkit.php fn.ConvertColor() - now interprets custom color definition: cmyk(15,82,0,10) +like rgb(r,g,b) except values out of 100 +Intended to be used for calling the functions separately - BUT works in a limited way with CSS - does not get reset or inherited correctly +<p style="color:cmyk(215,31,15,10)"> does work + + +DEFAULT CSS +=========== +$defaultCSS has been updated to reflect better the standard HTML default e.g. using serif, table borders separate, cell vertical-align top +To keep mPDF 1.3 (my favourites) I have introduced: +$mpdf->useDefaultCSS2 = true; + + +=================================== +Permissions - forms and Annotations - Experimental! +=================================== +You can set the Permissions for the PDF file to allow the user to make Comments (annotations) +$mpdf->setUserRights($enabled=true[default]|false, $annots="/Create/Delete/Modify/Copy/Import/Export", + $form="/Add/Delete/FillIn/Import/Export/SubmitStandalone/SpawnTemplate", $signature="/Modify") ) + +If you encrypt the file, make sure the permissions match e.g.: +$mpdf->setUserRights(); +$mpdf->SetProtection(array('print','annots'),'yourPassword','myPassword'); + +To allow this, changed the PDF-file version to %PDF1.5 (NB Probably needs PDF version > 1.5 but can't test for this...) + +NOTE: If you output the PDF file straight to the browser, it will only allow annotations after you save the document + + +=========================== +Active Forms - Experimental! +=========================== +At present , using active forms will prevent any internal and external links - that appear before active forms(?) - from working (why?) +May need to save form for proper use - see example, when scroll forwards and back, the form disappears?? +Need to set Userrights (see above), and $mpdf->useActiveForms=true; +For Output options, see separate notes. + + + +============================ +Internal Programming changes +============================ +NB fn. tablerotate in htmltoolkit no longer used; now uses a 'transform' to shift the whole block of PDF code + +Graphics State +============== +ExtGState does not need to be redefined - e.g. if a watermark added on every page, turning on and off alpha/transparency +Unnecessary file size. +function AddExtGState() edited to check if graphics state already exists before adding new one + +ASCII-proof code +================ +"" used as a special identifier in the program changed to "\xbb\xa4\xac" to make the mpdf.php script file immune from someone saving it as a utf-8 encoded file + +Images +====== +1) When copying remote images locally - incorrectly used "unset" now changed to "unlink" +2) When parsing image files - was using CURL for any image src="http://... - even if this was on the local server - edited so it only uses CURL if necessary/appropriate. +NB Handling images was updated in v1.3 because my ISP changed allow_url_fopen to false +Fixed so mPDF tests if the file is available as a local call e.g. getimage('images/test.jpg') even if it is defined as a full URI e.g. http://www.mydomain.com/images/test.jpg as this is quicker(?), and permitted even if allow_url_fopen is false. +If not available as a local file (and allow_url_fopen is set) mPDF tries to use fopen/file_get_contents using an http wrapper; +Else, if CURL is available and allow_url_fopen is false: then tries using CURL. +(Clear as mud???!!) + + +=========================== +mPDF v1.3 (21/09/2008) +=========================== +-------------- +Page Numbering +-------------- +Program changes: +fn. startPageNums() replaced with blank function +fn. stopPageNums() - deleted +fn. numPageNo() - deleted (all it did was return this->page anyway). +var $_numbering - deleted +var $_numberingFooter - deleted +var $_numPageNum - deleted + +NEW +New: fn. AddPages() (as for AddPage but with type=NEXT-ODD or NEXT-EVEN see below) +Edited: fn. AddPage() - new parameters added +AddPage(orientation(NO),type="E|O", resetpagenum="1|0", pagenumstyle="I|i|A|a|1", suppress="on|off") +New: fn. docPageNum() - returns the document page number (or '') based on... +New : PageNumSubstitutions(array) +New attributes: +<pagebreak resetpagenum="1" // resets document page numbering to 1 from the new page onwards +<pagebreak suppress="on" // turns on suppression of page numbering i.e. in headers and footers, {PAGENO} is replaced by blank string + // ="0" turns suppression off +<pagebreak pagenumstyle="I|i|A|a|1" // (re)sets page number stle/type from the new page onwards - as for lists + // 1 - decimal; A/a - alpha (uppercase/lowercase); I/i - Roman (uppercase/lowercase) +<pagebreak type="NEXT-ODD" // always adds a page + another if required to make odd +<pagebreak type="NEXT-EVEN" // always adds a page + another if required to make even + +Edited: fn. TOC() // sets the marker for a Table of Contents +New parameters allow the page-numbering details to be set +NB the page-numbering details set are for the page which follows on after the TOC marker is inserted. The page-numbering for the actual ToC is set later, when the ToC is generated and inserted here +new parameters as above for pagebreak resetpagenum="1|0", pagenumstyle="I|i|A|a|1", suppress="on|off" + +Can also be set by attribute in the <TOC> +<TOC resetpagenum="1" pagenumstyle="I|i|A|a|1", suppress="on|off" /> + +-------------------------------------------- +Changes to allow Rotated Text in table Cells +-------------------------------------------- +Edited: +fn. OpenTag() +fn. _tableColumnWidth() +fn. _tableHeight() +fn. _tableWrite() +fn. tableHeader() + +New custom style or attribute -- "text-rotate" -- can be set for either <tr> or <th|td> +Allowed values: 45 - 90 (written as integers) - rotates text anticlockwise, and -90 (clockwise) +Positive values less than 90 force cell to: vertical-align:bottom + +Limitations: +Only allows single line of text; +Font, font-size, and style are determined by those set fro the cell, and cannot be changed; +No changes in font (or any other in-line changes e.g. <sup>) are supported within the text + +Example: <tr style="text-rotate:90">... + +--------- +Bug fixes +--------- +1) HTML footer containing table was triggering page break. +Added $this->InHTMLFooter as flag to prevent page triggering in footers containing table +Set in fn.writeHTMLFooters() -> in fn.tableWrite() stops the pageBreak being reset + +2) Crashing when libcurl not installed. +Edited OpenTag() curl_init - added if (function_exists) to exclude crash when libcurl not installed + +3) Single cell with borders not showing the borders. +e.g. <table><tr><td style="border:1px solid #000000?>Hi</td></tr></table> +Problem: mPDF overrides cell border properties with table border properties for external borders. $defaultCSS had CSS defined for table as '0px solid #000000' +Quick fix - line 273 removed. A more complete fix will require reprogramming to distinguish between "border property not set" and border property set as "none". + +4) Empty textarea incorrectly handled (the following HTML code being output in the textarea) +The html code for an empty textarea was incorrectly handled in htmltoolkit fn. AdjustHTML which has been edited + + +=========================== +mPDF v1.2 (2008-05-01) +=========================== +// Added v1.2 option to continue if invalid UTF-8 chars - used in function is_utf8() +var $ignore_invalid_utf8 = false; + +Reading CSS in fn. ReadCSS() and applying in fn. MergeCSS() - + Edited to allow Tags, class and id with the same name to be distinct i.e. h5 {...} .h5 {...} #h5 {...} +* mPDF 1.2 This version supports: .class {...} / #id { .... } +* ADDED p {...} h1[-h6] {...} a {...} table {...} thead {...} th {...} td {...} hr {...} +* body {...} sets default font and fontsize +* It supports some cascaded CSS e.g. div.topic table.type1 td +* Does not support non-block level e.g. a#hover { ... } + +Table: font-size, weight, style, family and color should all work +TD/TH: font-size, weight, style, family and color should all work + +Added to htmltoolkit - fn.array_merge_recursive_unique() + +memory_opt Removed in mPDF v1.2 - not working properly + +fn. _begindoc() - changed to %PDF1.4 (was 1.3) as PDF version + +Write HTML Headers and Footers +------------------------------ +fn. Close() - calls writeHTMLHeaders/Footers() before finishing doc +fn. WriteHTML() - added parameter +fn. _out - writes to outputbuffer when writing HTML footers/headers + +New +fn. writeHTMLHeaders() +fn. writeHTMLFooters() + + + + +======================= +mPDF v1.1 (2008-05-01) +======================= + +Programming changes to increase efficiency +------------------------------------------ +fn. WriteHTML() - added lines to combine substituted characters <tta> etc + +Memory Optimization added (script from FPDF site) - edited fn. _putpages() and fn. _endpage() + +fn. SetFont() edited to return val quicker if font already set (increase efficiency) + +new vars chrs and ords are used to store chr() and ord() - quicker than using functions + +fn.setMBencoding() - only call mb_internal_encoding if need to change + +Bugs +---- +fn. SetDefaultFontSize() - edited to allow to override that set in defaultCSS + +fn. Output() - Added temporary(?) disablement of encryption in CJK as it doesn't work! + +fn. OpenTag() [LI] $this->blockjustfinished=false to prevents newline after first bullet of list within table + +Uses of mb_ereg_replace removed, and mb_split changed - requires regex_encoding (regex_encoding only used as UTF-8) + +fn. WriteHTML: attributes are trimmed with trim() to allow correct handling of e.g. class="bpmBook " + +fn. printbuffer() and fn. openTag() to ensure + <div><div><p> outputs top margins/padding for both 1st and 2nd div + and </p></div></div> ... + +fn. SetFont() added line - bug fixing in CJK fonts + +CSS functionality +----------------- +Added special CSS 'thead-underline' (similar to topntail) + +var $thead_font_weight; added (openTag) to enable setting of font-weight for <TH> cells + +Fixed table border inheritance: Table border inherits border="1" to cells, but not table style="border..." + +"page-break-inside: avoid" added (var keep_block_together) to allow a DIV or P to be kept on one page + - not compatible with table autosize or table rotate + - only works over maximum of 2 pages + +Enhancements +------------ +Orphans in line justification: R. Bracket ) added to defined list of orphans + +allow_url_open +-------------- +Following a change in the PHP ini config set on my website by my ISP, changes made to allow mPDF to work with allow_url_open=OFF. + - file_get_contents() changed to use libcurl (for CSS files) + - openTag('IMG') @fopen() and 3 functions _parsegif, _parseJPG, _parsePNG, edited to copy remote image files to local file to include images + +FlowChart +--------- +Changes to enable mPDF work with a custom script producing Flowcharts: + - WriteHTML() second parameter=3 will allow HTML to be parsed but not output + - fn. Arrow() added + - TableWordWrap() added parameter to force array return diff --git a/application/third_party/mpdf/CREDITS.txt b/application/third_party/mpdf/CREDITS.txt new file mode 100644 index 0000000..cdeac76 --- /dev/null +++ b/application/third_party/mpdf/CREDITS.txt @@ -0,0 +1,92 @@ + + +/******************************************************************************* +* Software: FPDF * +* Version: 1.53 * +* Date: 2004-12-31 * +* Author: Olivier PLATHEY * +* License: Freeware * +* * +* You may use and modify this software as you wish. * +*******************************************************************************/ + +/******************************************************************************* +* HTML2FPDF is a php script to read a HTML text and generate a PDF file. * +* Copyright (C) 2004-2005 Renato Coelho * +* * +* html2fpdf.php, htmltoolkit.php * +*******************************************************************************/ + +CREDITS From HTML2FPDF: + +-Olivier Plathey for the fpdf.php class [http://www.fpdf.org] +-Damon Kohler for the Flowing Block script [mailto:damonkohler@yahoo.com] +-Clment Lavoillotte for HTML-oriented FPDF idea +-Yamasoft for the gif.php class [http://www.yamasoft.com/] +-Jrme Fenal for the _parsegif() function +-"VIETCOM" for the PDFTable code [http://www.freepgs.com/vietcom/tool/pdftable/] [mailto:vncommando@yahoo.com] +-Yukihiro O. for the SetDash() function [mailto:yukihiro_o@infoseek.jp] +-Ron Korving for the WordWrap() function +-Michel Poulain for the DisplayPreferences() function +-Patrick Benny for the MultiCellBlt() function idea [no longer in use] +-Seb for the _SetTextRendering() and SetTextOutline() functions [mailto:captainseb@wanadoo.fr] +-MorphSoft for the colornames list idea +-W3SCHOOLS for HTML-related reference info [http://www.w3schools.com/] + + + +/**************************************************************************** +* Software: FPDF_Protection * +* Version: 1.02 * +* Date: 2005/05/08 * +* Author: Klemen VODOPIVEC * +* License: Freeware * +* * +* You may use and modify this software as you wish as stated in original * +* FPDF package. * +****************************************************************************/ + +/**************************************************************************** +// FPDI - Version 1.2 +// +// Copyright 2004-2007 Setasign - Jan Slabon +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +****************************************************************************/ + +/**************************************************************************** + * @copyright Khaled Al-Shamaa 2008 + * @link http://www.ar-php.org + * @author Khaled Al-Shamaa <khaled@ar-php.org> + * @desc Set of PHP5 / UTF-8 Classes developed to enhance Arabic web + * applications by providing set of tools includes stem-based searching, + * translitiration, soundex, Hijri calendar, charset detection and + * converter, spell numbers, keyboard language, Muslim prayer time, + * auto-summarization, and more... + * @package Arabic + * + * @version 1.8 released in Feb 15, 2009 + * + * @license LGPL +****************************************************************************/ + + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. +[http://www.opensource.org/licenses/lgpl-license.php] + diff --git a/application/third_party/mpdf/FONT INFO.txt b/application/third_party/mpdf/FONT INFO.txt new file mode 100644 index 0000000..ad625fb --- /dev/null +++ b/application/third_party/mpdf/FONT INFO.txt @@ -0,0 +1,164 @@ + +================= +Open Source Fonts +================= +mPDF should be able to read most TrueType Unicode font files with a .ttf extension +Truetype fonts with .ttf or .otf extension and .ttc TrueType collections should also work OK. + +You will probably therefore have access to any number of fonts, but here are some useful sources for +open-source or free-use fonts. Many of these were included with earlier versions of mPDF: + +General collections +------------------- +- DejaVu font collection from: http://dejavu-fonts.org/wiki/Main_Page (included in the release) +- GNU FreeFont from: http://www.gnu.org/software/freefont/ +- Linux Libertine from: http://www.linuxlibertine.org (use the .ttf files - not the .otf) +- Liberation Fonts from: https://fedorahosted.org/liberation-fonts/ or directly https://fedorahosted.org/releases/l/i/liberation-fonts/ + +Thai fonts +---------- +- Collection of Thai fonts from: ftp://linux.thai.net/pub/thailinux/software/thai-ttf/ + + +OCR-B +----- +OCRB (ocrb10) font: http://ansuz.sooke.bc.ca/software/ocrb.php + Useful for barcodes (included in the release) + +Pan-Unicode fonts (fonts containing most characters defined in Unicode) +----------------------------------------------------------------------- +- BitStream Cyberbit from: http://aol-4.vo.llnwd.net/pub/communicator/extras/fonts/windows/ + Cyberbit.ZIP (or just Google it) + (NB if run with $debug_fonts gives warning of invalid table checksum - just turn it off!) +- Code2000 (NB shareware) from: http://www.code2000.net/code2000_page.htm +- Quivira from: http://www.quivira-font.com/ (combining diacritics are not placed correctly, but has a very full set of glyphs) + + +CJK (Chinese-Japanese-Korean) +----------------------------- +HanNomA and B from: http://vietunicode.sourceforge.net/fonts/fonts_hannom.html +unBatang_0613 from: http://people.ktug.or.kr/~nomos/mine/UnBatang_0613.ttf +Sun-ExtA and Sun-ExtB from: http://www.alanwood.net/unicode/fonts-east-asian.html + (http://www.alanwood.net/downloads/index.html) +Fonts which contain both Unicode BMP and SIP (Supplementary Ideographic Plane) + characters in one file e.g. "AR PL UMing" and "AR PL UKai" + from: http://www.freedesktop.org + http://www.freedesktop.org/wiki/Software/CJKUnifonts/Download +[MS Windows fonts such as MS Mincho and MingLiU also work] +Japanese IPA fonts: http://ossipedia.ipa.go.jp/ipafont/index.html + +Arabic/Eastern fonts +-------------------- +- XW Zar fonts can be downloaded from: http://www.redlers.com/downloadfont.html + (2 of these fonts are included in the release) + (original site in Farsi: http://wiki.irmug.org/index.php/XWZar) +- See below for more details and font names of the fonts used in mPDF 4.x + + +Other sources +------------- +http://www.unifont.org/fontguide/ +http://www.alanwood.net/unicode/fonts.html +http://cooltext.com (e.g. http://cooltext.com/Fonts-Unicode+Arabic) +ApparatusSIL, DoulosSIL, Padauk from SIL: http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&cat_id=FontDownloads +DaiBanna (Tai Le) + +Mediaeval & Ancient Scripts +--------------------------- +Junicode: http://junicode.sourceforge.net/ +Cardo: http://scholarsfonts.net/cardofnt.html + +Syriac fonts +------------ +http://www.bethmardutho.org/meltho/ + + + + +============ +ARABIC FONTS +============ +You can use any appropriate Unicode-encoded .ttf or .ttc font file for arabic text, but +the font file must include the Arabic Presentation Forms-B (U+FE70U+FEFF). +2 of the XW Zar fonts are included in the release. + + + +=========== +INDIC FONTS +=========== +Indic scripts e.g. Hindi, Bengali etc. use conjuct forms which have no Unicode assignment. You +cannot therefore use any standard .ttf font files with mPDF. + +A set of fonts has been adapted to use specifically with mPDF. They are based on a set of fonts from: + +http://www.cdacmumbai.in/projects/indix/e_introduction.shtml + +NB These fonts are released under GNU GPL Version 2 license + +You need these adapted fonts (ind_bn_1_001.ttf etc.) to work with mPDF, as the glyphs have been +assigned to Unicode values in the Private Use area (U+E000 ->). These are included in the +mPDF download. + + + +Users of mPDF v4.x +------------------ +The original indic font files do not contain a full set of even basic ASCII +characters. The fonts supplied have been "fixed" to include those extra +characters. This now works whether the font is subset or not. + + + +========= +CJK Fonts +========= + + +Supplemental Ideographic Plane +============================== +SIP = Supplemental Ideographic Plane ( = Plane 2) = U+20000 - U+2FFFF (131072 - 196607) +These characters are required for the HKSCS Hong Kong Supplementary Character Set. Fonts with +SIP characters are commonly divided into a second file e.g. MingLiU and MingLiU-ExtB + +mPDF requires 2 fonts and they should be cross-referenced in config_fonts.php e.g. + "sun-exta" => array( + 'R' => "Sun-ExtA.ttf", + 'sip-ext' => 'sun-extb', + ), + "sun-extb" => array( + 'R' => "Sun-ExtB.ttf", + ), + +--OR-- +(NB these ones also define the font number within the TTC Collection as TTCfontID) + 'mingliu' => array ( + 'R' => 'mingliu.ttc', + 'TTCfontID' => array ( + 'R' => 1, + ), + 'sip-ext' => 'mingliu-extb', + ), + 'mingliu-extb' => array ( + 'R' => 'mingliub.ttc', + 'TTCfontID' => array ( + 'R' => 1, + ), + ), + 'mingliu_hkscs' => array ( + 'R' => 'mingliu.ttc', + 'TTCfontID' => array ( + 'R' => 3, + ), + 'sip-ext' => 'mingliu_hkscs-extb', + ), + 'mingliu_hkscs-extb' => array ( + 'R' => 'mingliub.ttc', + 'TTCfontID' => array ( + 'R' => 3, + ), + ), + + + + diff --git a/application/third_party/mpdf/LICENSE.txt b/application/third_party/mpdf/LICENSE.txt new file mode 100644 index 0000000..45645b4 --- /dev/null +++ b/application/third_party/mpdf/LICENSE.txt @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/application/third_party/mpdf/README.txt b/application/third_party/mpdf/README.txt new file mode 100644 index 0000000..719155a --- /dev/null +++ b/application/third_party/mpdf/README.txt @@ -0,0 +1,148 @@ +Installation +============ + * Download the .zip file and unzip it + * Create a folder e.g. /mpdf on your server + * Upload all of the files to the server, maintaining the folders as they are + * Ensure that you have write permissions set (CHMOD 6xx or 7xx) for the following folders: + /ttfontdata/ - used to cache font data; improves performance a lot + /tmp/ - used for some images and ProgressBar + /graph_cache/ - if you are using JpGraph in conjunction with mPDF + +To test the installation, point your browser to the basic example file : [path_to_mpdf_folder]/mpdf/examples/example_basic.php + +If you wish to define a different folder for temporary files rather than /tmp/ see the note on 'Folder for temporary files' in + the section on Installation & Setup in the manual (http://mpdf1.com/manual/). + +If you have problems, please read the section on troubleshooting in the manual. + + +Fonts +===== +I will refer to font names in 2 ways: +"CSS font-family name" - mPDF is designed primarily to read HTML and CSS. This is the name used in CSS e.g. + <p style="font-family: 'Trebuchet MS';"> + +"mPDF font-family name" - the name used internally to process fonts. This could be anything you like, + but by default mPDF will convert CSS font-family names by removing any spaces and changing + to lowercase. Reading the name above, mPDF will look for a "mPDF font-family name" of + 'trebuchetms'. + +The configurable values referred to below are set in the config_fonts.php file + +When parsing HTML/CSS, mPDF will read the CSS font-family name (e.g. 'Trebuchet MS') and convert +by removing any spaces and changing to lowercase, to look for a mPDF font-family name (trebuchetms). + +Next it will look for a translation (if set) e.g.: +$this->fonttrans = array( + 'trebuchetms' => 'trebuchet' +) + +Now the mPDF font-family name to be used is 'trebuchet' + +If you wish to make this font available, you need to specify the Truetype .ttf font files for each variant. +These should be defined in the array: +$this->fontdata = array( + "trebuchet" => array( + 'R' => "trebuc.ttf", + 'B' => "trebucbd.ttf", + 'I' => "trebucit.ttf", + 'BI' => "trebucbi.ttf", + ) +) + +This is the array which determines whether a font is available to mPDF. Each font-family must have a +Regular ['R'] file defined - the others (bold, italic, bold-italic) are optional. + +mPDF will try to load the font-file. If you have defined _MPDF_SYSTEM_TTFONTS at the top of the +config_fonts.php file, it will first look for the font-file there. This is useful if you are running +mPDF on a computer which already has a folder with TTF fonts in (e.g. on Windows) + +If the font-file is not there, or _MPDF_SYSTEM_TTFONTS is not defined, mPDF will look in the folder +/[your_path_to_mpdf]/ttfonts/ + +Note that the font-file names are case-sensitive and can contain capitals. + +If the folder /ttfontdata/ is writeable (CHMOD 644 or 755), mPDF will save files there which it can +re-use next time it accesses a particular font. This will significantly improve processing time +and is strongly recommended. + +mPDF should be able to read most TrueType Unicode font files with a .ttf extension +Truetype fonts with .ttf extension that are OpenType also work OK. +TrueType collections (.ttc) will also work if they contain TrueType Unicode fonts. + + +Character substitution +---------------------- +Most people will have access to a Pan-Unicode font with most Unicode characters in it such as +Arial Unicode MS. Set $this->backupSubsFont = array('arialunicodems'); at the top of the config_fonts.php file +to use this font when substituting any characters not found in the specific font being used. + +Example: +You can set $mpdf->useSubstitutions = true; at runtime +or $this->useSubstitutions = true; in the config.php file + +<p style="font-family: 'Comic Sans MS'">This text contains a Thai character &#3617; which does not exist +in the Comic Sans MS font file</p> + +When useSubstitutions is true, mPDF will try to find substitutions for any missing characters: +1) firstly looks if the character is available in the inbuilt Symbols or ZapfDingbats fonts; +2) [If defined] looks in each of the the font(s) set by $this->backupSubsFont array + +NB There is an increase in processing time when using substitutions, and even more so if +a backupSubsFont is defined. + +Controlling mPDF mode +===================== +The first parameter of new mPDF('') works as follows: +new mPDF('c') - forces mPDF to only use the built-in [c]ore Adobe fonts (Helvetica, Times etc) + +new mPDF('') - default - font subsetting behaviour is determined by the configurable variables + $this->maxTTFFilesize and $this->percentSubset (see below) + Default values are set so that: 1) very large font files are always subset + 2) Fonts are embedded as subsets if < 30% of the characters are used + +new mPDF('..-x') - used together with a language or language/country code, this will cause + mPDF to use only in-built core fonts (Helvetica, Times) if the language specified is appropiate; + otherwise it will force subsetting (equivalent to using "") + e.g. new mPDF('de-x') or new mPDF('pt-BR-x') will use in-built core fonts + and new mPDF('ru-x') will use subsets of any available TrueType fonts + The languages that use core fonts are defined in config_cp.php (using the value $coreSuitable). + +new mPDF('..+aCJK') new mPDF('+aCJK') +new mPDF('..-aCJK') new mPDF('-aCJK') + - used optionally together with a language or language/country code, +aCJK will force mPDF + to use the Adobe non-embedded CJK fonts when a passage is marked with e.g. "lang: ja" + This can be used at runtime to override the value set for $mpdf->useAdobeCJK in config.php + Use in conjunction with settings in config_cp.php + +For backwards compatibility, new mPDF('-s') and new mPDF('s') will force subsetting by + setting $this->percentSubset=100 (see below) + new mPDF('utf-8-s') and new mPDF('ar-s') are also recognised + +Language/Country (ll-cc) +------------------------ +You can use a language code ('en') or language/country code ('en-GB') to control which +mode/fonts are used. The behaviour is set up in config_cp.php file. +The default settings show some of the things you can do: +new mPDF('de') - as German is a Western European langauge, it is suitable to use the Adobe core fonts. + Using 'de' alone will do nothing, but if you use ('de-x'), this will use core fonts. +new mPDF('th') - many fonts do not contain the characters necessary for Thai script. The value $unifonts + defines a restricted list of fonts available for mPDF to use. + +NB <html dir="rtl"> or <body dir="rtl"> are supported. + + + +Configuration variables changed +=============================== +Configuration variables are documented in the on-line manual (http://mpdf1.com/manual/). + + +Font folders +============ +If you wish to define your own font file folders (perhaps to share), +you can define the 2 constants in your script before including the mpdf.php script e.g.: + +define('_MPDF_TTFONTPATH','your_path/ttfonts/'); +define('_MPDF_TTFONTDATAPATH','your_path/ttfontdata/'); // should be writeable + diff --git a/application/third_party/mpdf/classes/barcode.php b/application/third_party/mpdf/classes/barcode.php new file mode 100644 index 0000000..ad9ef8c --- /dev/null +++ b/application/third_party/mpdf/classes/barcode.php @@ -0,0 +1,1965 @@ +<?php + +// Adapted for mPDF from TCPDF barcode. Original Details left below. + +//============================================================+ +// File name : barcodes.php +// Begin : 2008-06-09 +// Last Update : 2009-04-15 +// Version : 1.0.008 +// License : GNU LGPL (http://www.gnu.org/copyleft/lesser.html) +// ---------------------------------------------------------------------------- +// Copyright (C) 2008-2009 Nicola Asuni - Tecnick.com S.r.l. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 2.1 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. +// +// See LICENSE.TXT file for more information. +// ---------------------------------------------------------------------------- +// +// Description : PHP class to creates array representations for +// common 1D barcodes to be used with TCPDF. +// +// Author: Nicola Asuni +// +// (c) Copyright: +// Nicola Asuni +// Tecnick.com S.r.l. +// Via della Pace, 11 +// 09044 Quartucciu (CA) +// ITALY +// www.tecnick.com +// info@tecnick.com +//============================================================+ + +class PDFBarcode { + + protected $barcode_array; + protected $gapwidth; + protected $print_ratio; + protected $daft; + + public function __construct() { + + } + + public function getBarcodeArray($code, $type, $pr='') { + $this->setBarcode($code, $type, $pr); + return $this->barcode_array; + } + public function getChecksum($code, $type) { + $this->setBarcode($code, $type); + if (!$this->barcode_array) { return ''; } + else { return $this->barcode_array['checkdigit']; } + } + + public function setBarcode($code, $type, $pr='') { + $this->print_ratio = 1; + switch (strtoupper($type)) { + case 'ISBN': + case 'ISSN': + case 'EAN13': { // EAN 13 + $arrcode = $this->barcode_eanupc($code, 13); + $arrcode['lightmL'] = 11; // LEFT light margin = x X-dim (http://www.gs1uk.org) + $arrcode['lightmR'] = 7; // RIGHT light margin = x X-dim (http://www.gs1uk.org) + $arrcode['nom-X'] = 0.33; // Nominal value for X-dim in mm (http://www.gs1uk.org) + $arrcode['nom-H'] = 25.93; // Nominal bar height in mm incl. numerals (http://www.gs1uk.org) + break; + } + case 'UPCA': { // UPC-A + $arrcode = $this->barcode_eanupc($code, 12); + $arrcode['lightmL'] = 9; // LEFT light margin = x X-dim (http://www.gs1uk.org) + $arrcode['lightmR'] = 9; // RIGHT light margin = x X-dim (http://www.gs1uk.org) + $arrcode['nom-X'] = 0.33; // Nominal value for X-dim in mm (http://www.gs1uk.org) + $arrcode['nom-H'] = 25.91; // Nominal bar height in mm incl. numerals (http://www.gs1uk.org) + break; + } + case 'UPCE': { // UPC-E + $arrcode = $this->barcode_eanupc($code, 6); + $arrcode['lightmL'] = 9; // LEFT light margin = x X-dim (http://www.gs1uk.org) + $arrcode['lightmR'] = 7; // RIGHT light margin = x X-dim (http://www.gs1uk.org) + $arrcode['nom-X'] = 0.33; // Nominal value for X-dim in mm (http://www.gs1uk.org) + $arrcode['nom-H'] = 25.93; // Nominal bar height in mm incl. numerals (http://www.gs1uk.org) + break; + } + case 'EAN8': { // EAN 8 + $arrcode = $this->barcode_eanupc($code, 8); + $arrcode['lightmL'] = 7; // LEFT light margin = x X-dim (http://www.gs1uk.org) + $arrcode['lightmR'] = 7; // RIGHT light margin = x X-dim (http://www.gs1uk.org) + $arrcode['nom-X'] = 0.33; // Nominal value for X-dim in mm (http://www.gs1uk.org) + $arrcode['nom-H'] = 21.64; // Nominal bar height in mm incl. numerals (http://www.gs1uk.org) + break; + } + case 'EAN2': { // 2-Digits UPC-Based Extention + $arrcode = $this->barcode_eanext($code, 2); + $arrcode['lightmL'] = 7; // LEFT light margin = x X-dim (estimated) + $arrcode['lightmR'] = 7; // RIGHT light margin = x X-dim (estimated) + $arrcode['sepM'] = 9; // SEPARATION margin = x X-dim (http://web.archive.org/web/19990501035133/http://www.uc-council.org/d36-d.htm) + $arrcode['nom-X'] = 0.33; // Nominal value for X-dim in mm (http://www.gs1uk.org) + $arrcode['nom-H'] = 20; // Nominal bar height in mm incl. numerals (estimated) not used when combined + break; + } + case 'EAN5': { // 5-Digits UPC-Based Extention + $arrcode = $this->barcode_eanext($code, 5); + $arrcode['lightmL'] = 7; // LEFT light margin = x X-dim (estimated) + $arrcode['lightmR'] = 7; // RIGHT light margin = x X-dim (estimated) + $arrcode['sepM'] = 9; // SEPARATION margin = x X-dim (http://web.archive.org/web/19990501035133/http://www.uc-council.org/d36-d.htm) + $arrcode['nom-X'] = 0.33; // Nominal value for X-dim in mm (http://www.gs1uk.org) + $arrcode['nom-H'] = 20; // Nominal bar height in mm incl. numerals (estimated) not used when combined + break; + } + + case 'IMB': { // IMB - Intelligent Mail Barcode - Onecode - USPS-B-3200 + $xdim = 0.508; // Nominal value for X-dim (bar width) in mm (spec.) + $bpi = 22; // Bars per inch + // Ratio of Nominal value for width of spaces in mm / Nominal value for X-dim (bar width) in mm based on bars per inch + $this->gapwidth = ((25.4/$bpi) - $xdim)/$xdim; + $this->daft = array('D'=>2, 'A'=>2, 'F'=>3, 'T'=>1); // Descender; Ascender; Full; Tracker bar heights + $arrcode = $this->barcode_imb($code); + $arrcode['nom-X'] = $xdim ; + $arrcode['nom-H'] = 3.68; // Nominal value for Height of Full bar in mm (spec.) + // USPS-B-3200 Revision C = 4.623 + // USPS-B-3200 Revision E = 3.68 + $arrcode['quietL'] = 3.175; // LEFT Quiet margin = mm (spec.) + $arrcode['quietR'] = 3.175; // RIGHT Quiet margin = mm (spec.) + $arrcode['quietTB'] = 0.711; // TOP/BOTTOM Quiet margin = mm (spec.) + break; + } + case 'RM4SCC': { // RM4SCC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code) + $xdim = 0.508; // Nominal value for X-dim (bar width) in mm (spec.) + $bpi = 22; // Bars per inch + // Ratio of Nominal value for width of spaces in mm / Nominal value for X-dim (bar width) in mm based on bars per inch + $this->gapwidth = ((25.4/$bpi) - $xdim)/$xdim; + $this->daft = array('D'=>5, 'A'=>5, 'F'=>8, 'T'=>2); // Descender; Ascender; Full; Tracker bar heights + $arrcode = $this->barcode_rm4scc($code, false); + $arrcode['nom-X'] = $xdim ; + $arrcode['nom-H'] = 5.0; // Nominal value for Height of Full bar in mm (spec.) + $arrcode['quietL'] = 2; // LEFT Quiet margin = mm (spec.) + $arrcode['quietR'] = 2; // RIGHT Quiet margin = mm (spec.) + $arrcode['quietTB'] = 2; // TOP/BOTTOM Quiet margin = mm (spec?) + break; + } + case 'KIX': { // KIX (Klant index - Customer index) + $xdim = 0.508; // Nominal value for X-dim (bar width) in mm (spec.) + $bpi = 22; // Bars per inch + // Ratio of Nominal value for width of spaces in mm / Nominal value for X-dim (bar width) in mm based on bars per inch + $this->gapwidth = ((25.4/$bpi) - $xdim)/$xdim; + $this->daft = array('D'=>5, 'A'=>5, 'F'=>8, 'T'=>2); // Descender; Ascender; Full; Tracker bar heights + $arrcode = $this->barcode_rm4scc($code, true); + $arrcode['nom-X'] = $xdim ; + $arrcode['nom-H'] = 5.0; // Nominal value for Height of Full bar in mm (? spec.) + $arrcode['quietL'] = 2; // LEFT Quiet margin = mm (spec.) + $arrcode['quietR'] = 2; // RIGHT Quiet margin = mm (spec.) + $arrcode['quietTB'] = 2; // TOP/BOTTOM Quiet margin = mm (spec.) + break; + } + case 'POSTNET': { // POSTNET + $xdim = 0.508; // Nominal value for X-dim (bar width) in mm (spec.) + $bpi = 22; // Bars per inch + // Ratio of Nominal value for width of spaces in mm / Nominal value for X-dim (bar width) in mm based on bars per inch + $this->gapwidth = ((25.4/$bpi) - $xdim)/$xdim; + $arrcode = $this->barcode_postnet($code, false); + $arrcode['nom-X'] = $xdim ; + $arrcode['nom-H'] = 3.175; // Nominal value for Height of Full bar in mm (spec.) + $arrcode['quietL'] = 3.175; // LEFT Quiet margin = mm (?spec.) + $arrcode['quietR'] = 3.175; // RIGHT Quiet margin = mm (?spec.) + $arrcode['quietTB'] = 1.016; // TOP/BOTTOM Quiet margin = mm (?spec.) + break; + } + case 'PLANET': { // PLANET + $xdim = 0.508; // Nominal value for X-dim (bar width) in mm (spec.) + $bpi = 22; // Bars per inch + // Ratio of Nominal value for width of spaces in mm / Nominal value for X-dim (bar width) in mm based on bars per inch + $this->gapwidth = ((25.4/$bpi) - $xdim)/$xdim; + $arrcode = $this->barcode_postnet($code, true); + $arrcode['nom-X'] = $xdim ; + $arrcode['nom-H'] = 3.175; // Nominal value for Height of Full bar in mm (spec.) + $arrcode['quietL'] = 3.175; // LEFT Quiet margin = mm (?spec.) + $arrcode['quietR'] = 3.175; // RIGHT Quiet margin = mm (?spec.) + $arrcode['quietTB'] = 1.016; // TOP/BOTTOM Quiet margin = mm (?spec.) + break; + } + + case 'C93': { // CODE 93 - USS-93 + $arrcode = $this->barcode_code93($code); + if ($arrcode == false) { break; } + $arrcode['nom-X'] = 0.381; // Nominal value for X-dim (bar width) in mm (2 X min. spec.) + $arrcode['nom-H'] = 10; // Nominal value for Height of Full bar in mm (non-spec.) + $arrcode['lightmL'] = 10; // LEFT light margin = x X-dim (spec.) + $arrcode['lightmR'] = 10; // RIGHT light margin = x X-dim (spec.) + $arrcode['lightTB'] = 0; // TOP/BOTTOM light margin = x X-dim (non-spec.) + break; + } + case 'CODE11': { // CODE 11 + if ($pr > 0) { $this->print_ratio = $pr; } + else { $this->print_ratio = 3; } // spec: Pr= 1:2.24 - 1:3.5 + $arrcode = $this->barcode_code11($code); + if ($arrcode == false) { break; } + $arrcode['nom-X'] = 0.381; // Nominal value for X-dim (bar width) in mm (2 X min. spec.) + $arrcode['nom-H'] = 10; // Nominal value for Height of Full bar in mm (non-spec.) + $arrcode['lightmL'] = 10; // LEFT light margin = x X-dim (spec.) + $arrcode['lightmR'] = 10; // RIGHT light margin = x X-dim (spec.) + $arrcode['lightTB'] = 0; // TOP/BOTTOM light margin = x X-dim (non-spec.) + break; + } + case 'MSI': // MSI (Variation of Plessey code) + case 'MSI+': { // MSI + CHECKSUM (modulo 11) + if (strtoupper($type)=='MSI') { $arrcode = $this->barcode_msi($code, false); } + if (strtoupper($type)=='MSI+') { $arrcode = $this->barcode_msi($code, true); } + if ($arrcode == false) { break; } + $arrcode['nom-X'] = 0.381; // Nominal value for X-dim (bar width) in mm (2 X min. spec.) + $arrcode['nom-H'] = 10; // Nominal value for Height of Full bar in mm (non-spec.) + $arrcode['lightmL'] = 12; // LEFT light margin = x X-dim (spec.) + $arrcode['lightmR'] = 12; // RIGHT light margin = x X-dim (spec.) + $arrcode['lightTB'] = 0; // TOP/BOTTOM light margin = x X-dim (non-spec.) + break; + } + case 'CODABAR': { // CODABAR + if ($pr > 0) { $this->print_ratio = $pr; } + else { $this->print_ratio = 2.5; } // spec: Pr= 1:2 - 1:3 (>2.2 if X<0.50) + if (strtoupper($type)=='CODABAR') { $arrcode = $this->barcode_codabar($code); } + if ($arrcode == false) { break; } + $arrcode['nom-X'] = 0.381; // Nominal value for X-dim (bar width) in mm (2 X min. spec.) + $arrcode['nom-H'] = 10; // Nominal value for Height of Full bar in mm (non-spec.) + $arrcode['lightmL'] = 10; // LEFT light margin = x X-dim (spec.) + $arrcode['lightmR'] = 10; // RIGHT light margin = x X-dim (spec.) + $arrcode['lightTB'] = 0; // TOP/BOTTOM light margin = x X-dim (non-spec.) + break; + } + case 'C128A': // CODE 128 A + case 'C128B': // CODE 128 B + case 'C128C': // CODE 128 C + case 'EAN128A': // EAN 128 A + case 'EAN128B': // EAN 128 B + case 'EAN128C': { // EAN 128 C + if (strtoupper($type)=='C128A') { $arrcode = $this->barcode_c128($code, 'A'); } + if (strtoupper($type)=='C128B') { $arrcode = $this->barcode_c128($code, 'B'); } + if (strtoupper($type)=='C128C') { $arrcode = $this->barcode_c128($code, 'C'); } + if (strtoupper($type)=='EAN128A') { $arrcode = $this->barcode_c128($code, 'A', true); } + if (strtoupper($type)=='EAN128B') { $arrcode = $this->barcode_c128($code, 'B', true); } + if (strtoupper($type)=='EAN128C') { $arrcode = $this->barcode_c128($code, 'C', true); } + if ($arrcode == false) { break; } + $arrcode['nom-X'] = 0.381; // Nominal value for X-dim (bar width) in mm (2 X min. spec.) + $arrcode['nom-H'] = 10; // Nominal value for Height of Full bar in mm (non-spec.) + $arrcode['lightmL'] = 10; // LEFT light margin = x X-dim (spec.) + $arrcode['lightmR'] = 10; // RIGHT light margin = x X-dim (spec.) + $arrcode['lightTB'] = 0; // TOP/BOTTOM light margin = x X-dim (non-spec.) + break; + } + case 'C39': // CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9. + case 'C39+': // CODE 39 with checksum + case 'C39E': // CODE 39 EXTENDED + case 'C39E+': { // CODE 39 EXTENDED + CHECKSUM + if ($pr > 0) { $this->print_ratio = $pr; } + else { $this->print_ratio = 2.5; } // spec: Pr= 1:2 - 1:3 (>2.2 if X<0.50) + $code = str_replace(chr(194).chr(160), ' ', $code); // mPDF 5.3.95 (for utf-8 encoded) + $code = str_replace(chr(160), ' ', $code); // mPDF 5.3.95 (for win-1252) + if (strtoupper($type)=='C39') { $arrcode = $this->barcode_code39($code, false, false); } + if (strtoupper($type)=='C39+') { $arrcode = $this->barcode_code39($code, false, true); } + if (strtoupper($type)=='C39E') { $arrcode = $this->barcode_code39($code, true, false); } + if (strtoupper($type)=='C39E+') { $arrcode = $this->barcode_code39($code, true, true); } + if ($arrcode == false) { break; } + $arrcode['nom-X'] = 0.381; // Nominal value for X-dim (bar width) in mm (2 X min. spec.) + $arrcode['nom-H'] = 10; // Nominal value for Height of Full bar in mm (non-spec.) + $arrcode['lightmL'] = 10; // LEFT light margin = x X-dim (spec.) + $arrcode['lightmR'] = 10; // RIGHT light margin = x X-dim (spec.) + $arrcode['lightTB'] = 0; // TOP/BOTTOM light margin = x X-dim (non-spec.) + break; + } + case 'S25': // Standard 2 of 5 + case 'S25+': { // Standard 2 of 5 + CHECKSUM + if ($pr > 0) { $this->print_ratio = $pr; } + else { $this->print_ratio = 3; } // spec: Pr=1:3/1:4.5 + if (strtoupper($type)=='S25') { $arrcode = $this->barcode_s25($code, false); } + if (strtoupper($type)=='S25+') { $arrcode = $this->barcode_s25($code, true); } + if ($arrcode == false) { break; } + $arrcode['nom-X'] = 0.381; // Nominal value for X-dim (bar width) in mm (2 X min. spec.) + $arrcode['nom-H'] = 10; // Nominal value for Height of Full bar in mm (non-spec.) + $arrcode['lightmL'] = 10; // LEFT light margin = x X-dim (spec.) + $arrcode['lightmR'] = 10; // RIGHT light margin = x X-dim (spec.) + $arrcode['lightTB'] = 0; // TOP/BOTTOM light margin = x X-dim (non-spec.) + break; + } + case 'I25': // Interleaved 2 of 5 + case 'I25+': { // Interleaved 2 of 5 + CHECKSUM + if ($pr > 0) { $this->print_ratio = $pr; } + else { $this->print_ratio = 2.5; } // spec: Pr= 1:2 - 1:3 (>2.2 if X<0.50) + if (strtoupper($type)=='I25') { $arrcode = $this->barcode_i25($code, false); } + if (strtoupper($type)=='I25+') { $arrcode = $this->barcode_i25($code, true); } + if ($arrcode == false) { break; } + $arrcode['nom-X'] = 0.381; // Nominal value for X-dim (bar width) in mm (2 X min. spec.) + $arrcode['nom-H'] = 10; // Nominal value for Height of Full bar in mm (non-spec.) + $arrcode['lightmL'] = 10; // LEFT light margin = x X-dim (spec.) + $arrcode['lightmR'] = 10; // RIGHT light margin = x X-dim (spec.) + $arrcode['lightTB'] = 0; // TOP/BOTTOM light margin = x X-dim (non-spec.) + break; + } + case 'I25B': // Interleaved 2 of 5 + Bearer bars + case 'I25B+': { // Interleaved 2 of 5 + CHECKSUM + Bearer bars + if ($pr > 0) { $this->print_ratio = $pr; } + else { $this->print_ratio = 2.5; } // spec: Pr= 1:2 - 1:3 (>2.2 if X<0.50) + if (strtoupper($type)=='I25B') { $arrcode = $this->barcode_i25($code, false); } + if (strtoupper($type)=='I25B+') { $arrcode = $this->barcode_i25($code, true); } + if ($arrcode == false) { break; } + $arrcode['nom-X'] = 0.381; // Nominal value for X-dim (bar width) in mm (2 X min. spec.) + $arrcode['nom-H'] = 10; // Nominal value for Height of Full bar in mm (non-spec.) + $arrcode['lightmL'] = 10; // LEFT light margin = x X-dim (spec.) + $arrcode['lightmR'] = 10; // RIGHT light margin = x X-dim (spec.) + $arrcode['lightTB'] = 2; // TOP/BOTTOM light margin = x X-dim (non-spec.) - used for bearer bars + break; + } + default: { + $this->barcode_array = false; + } + } + $this->barcode_array = $arrcode; + } + + /** + * CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9. + */ + protected function barcode_code39($code, $extended=false, $checksum=false) { + $chr['0'] = '111221211'; + $chr['1'] = '211211112'; + $chr['2'] = '112211112'; + $chr['3'] = '212211111'; + $chr['4'] = '111221112'; + $chr['5'] = '211221111'; + $chr['6'] = '112221111'; + $chr['7'] = '111211212'; + $chr['8'] = '211211211'; + $chr['9'] = '112211211'; + $chr['A'] = '211112112'; + $chr['B'] = '112112112'; + $chr['C'] = '212112111'; + $chr['D'] = '111122112'; + $chr['E'] = '211122111'; + $chr['F'] = '112122111'; + $chr['G'] = '111112212'; + $chr['H'] = '211112211'; + $chr['I'] = '112112211'; + $chr['J'] = '111122211'; + $chr['K'] = '211111122'; + $chr['L'] = '112111122'; + $chr['M'] = '212111121'; + $chr['N'] = '111121122'; + $chr['O'] = '211121121'; + $chr['P'] = '112121121'; + $chr['Q'] = '111111222'; + $chr['R'] = '211111221'; + $chr['S'] = '112111221'; + $chr['T'] = '111121221'; + $chr['U'] = '221111112'; + $chr['V'] = '122111112'; + $chr['W'] = '222111111'; + $chr['X'] = '121121112'; + $chr['Y'] = '221121111'; + $chr['Z'] = '122121111'; + $chr['-'] = '121111212'; + $chr['.'] = '221111211'; + $chr[' '] = '122111211'; + $chr['$'] = '121212111'; + $chr['/'] = '121211121'; + $chr['+'] = '121112121'; + $chr['%'] = '111212121'; + $chr['*'] = '121121211'; + + $code = strtoupper($code); + if ($extended) { + // extended mode + $code = $this->encode_code39_ext($code); + } + if ($code === false) { + return false; + } + if ($checksum) { + // checksum + $checkdigit = $this->checksum_code39($code); + $code .= $checkdigit ; + } + // add start and stop codes + $code = '*'.$code.'*'; + + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + $k = 0; + $clen = strlen($code); + for ($i = 0; $i < $clen; ++$i) { + $char = $code[$i]; + if(!isset($chr[$char])) { + // invalid character + return false; + } + for ($j = 0; $j < 9; ++$j) { + if (($j % 2) == 0) { + $t = true; // bar + } else { + $t = false; // space + } + $x = $chr[$char][$j]; + if ($x == 2) { $w = $this->print_ratio; } + else { $w = 1; } + + $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); + $bararray['maxw'] += $w; + ++$k; + } + $bararray['bcode'][$k] = array('t' => false, 'w' => 1, 'h' => 1, 'p' => 0); + $bararray['maxw'] += 1; + ++$k; + } + $bararray['checkdigit'] = $checkdigit; + return $bararray; + } + + /** + * Encode a string to be used for CODE 39 Extended mode. + */ + protected function encode_code39_ext($code) { + $encode = array( + chr(0) => '%U', chr(1) => '$A', chr(2) => '$B', chr(3) => '$C', + chr(4) => '$D', chr(5) => '$E', chr(6) => '$F', chr(7) => '$G', + chr(8) => '$H', chr(9) => '$I', chr(10) => '$J', chr(11) => '£K', + chr(12) => '$L', chr(13) => '$M', chr(14) => '$N', chr(15) => '$O', + chr(16) => '$P', chr(17) => '$Q', chr(18) => '$R', chr(19) => '$S', + chr(20) => '$T', chr(21) => '$U', chr(22) => '$V', chr(23) => '$W', + chr(24) => '$X', chr(25) => '$Y', chr(26) => '$Z', chr(27) => '%A', + chr(28) => '%B', chr(29) => '%C', chr(30) => '%D', chr(31) => '%E', + chr(32) => ' ', chr(33) => '/A', chr(34) => '/B', chr(35) => '/C', + chr(36) => '/D', chr(37) => '/E', chr(38) => '/F', chr(39) => '/G', + chr(40) => '/H', chr(41) => '/I', chr(42) => '/J', chr(43) => '/K', + chr(44) => '/L', chr(45) => '-', chr(46) => '.', chr(47) => '/O', + chr(48) => '0', chr(49) => '1', chr(50) => '2', chr(51) => '3', + chr(52) => '4', chr(53) => '5', chr(54) => '6', chr(55) => '7', + chr(56) => '8', chr(57) => '9', chr(58) => '/Z', chr(59) => '%F', + chr(60) => '%G', chr(61) => '%H', chr(62) => '%I', chr(63) => '%J', + chr(64) => '%V', chr(65) => 'A', chr(66) => 'B', chr(67) => 'C', + chr(68) => 'D', chr(69) => 'E', chr(70) => 'F', chr(71) => 'G', + chr(72) => 'H', chr(73) => 'I', chr(74) => 'J', chr(75) => 'K', + chr(76) => 'L', chr(77) => 'M', chr(78) => 'N', chr(79) => 'O', + chr(80) => 'P', chr(81) => 'Q', chr(82) => 'R', chr(83) => 'S', + chr(84) => 'T', chr(85) => 'U', chr(86) => 'V', chr(87) => 'W', + chr(88) => 'X', chr(89) => 'Y', chr(90) => 'Z', chr(91) => '%K', + chr(92) => '%L', chr(93) => '%M', chr(94) => '%N', chr(95) => '%O', + chr(96) => '%W', chr(97) => '+A', chr(98) => '+B', chr(99) => '+C', + chr(100) => '+D', chr(101) => '+E', chr(102) => '+F', chr(103) => '+G', + chr(104) => '+H', chr(105) => '+I', chr(106) => '+J', chr(107) => '+K', + chr(108) => '+L', chr(109) => '+M', chr(110) => '+N', chr(111) => '+O', + chr(112) => '+P', chr(113) => '+Q', chr(114) => '+R', chr(115) => '+S', + chr(116) => '+T', chr(117) => '+U', chr(118) => '+V', chr(119) => '+W', + chr(120) => '+X', chr(121) => '+Y', chr(122) => '+Z', chr(123) => '%P', + chr(124) => '%Q', chr(125) => '%R', chr(126) => '%S', chr(127) => '%T'); + $code_ext = ''; + $clen = strlen($code); + for ($i = 0 ; $i < $clen; ++$i) { + if (ord($code[$i]) > 127) { + return false; + } + $code_ext .= $encode[$code[$i]]; + } + return $code_ext; + } + + /** + * Calculate CODE 39 checksum (modulo 43). + */ + protected function checksum_code39($code) { + $chars = array( + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', + 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', + 'W', 'X', 'Y', 'Z', '-', '.', ' ', '$', '/', '+', '%'); + $sum = 0; + $clen = strlen($code); + for ($i = 0 ; $i < $clen; ++$i) { + $k = array_keys($chars, $code[$i]); + $sum += $k[0]; + } + $j = ($sum % 43); + return $chars[$j]; + } + + /** + * CODE 93 - USS-93 + * Compact code similar to Code 39 + */ + protected function barcode_code93($code) { + $chr['0'] = '131112'; + $chr['1'] = '111213'; + $chr['2'] = '111312'; + $chr['3'] = '111411'; + $chr['4'] = '121113'; + $chr['5'] = '121212'; + $chr['6'] = '121311'; + $chr['7'] = '111114'; + $chr['8'] = '131211'; + $chr['9'] = '141111'; + $chr['A'] = '211113'; + $chr['B'] = '211212'; + $chr['C'] = '211311'; + $chr['D'] = '221112'; + $chr['E'] = '221211'; + $chr['F'] = '231111'; + $chr['G'] = '112113'; + $chr['H'] = '112212'; + $chr['I'] = '112311'; + $chr['J'] = '122112'; + $chr['K'] = '132111'; + $chr['L'] = '111123'; + $chr['M'] = '111222'; + $chr['N'] = '111321'; + $chr['O'] = '121122'; + $chr['P'] = '131121'; + $chr['Q'] = '212112'; + $chr['R'] = '212211'; + $chr['S'] = '211122'; + $chr['T'] = '211221'; + $chr['U'] = '221121'; + $chr['V'] = '222111'; + $chr['W'] = '112122'; + $chr['X'] = '112221'; + $chr['Y'] = '122121'; + $chr['Z'] = '123111'; + $chr['-'] = '121131'; + $chr['.'] = '311112'; + $chr[' '] = '311211'; + $chr['$'] = '321111'; + $chr['/'] = '112131'; + $chr['+'] = '113121'; + $chr['%'] = '211131'; + $chr[128] = '121221'; // ($) + $chr[129] = '311121'; // (/) + $chr[130] = '122211'; // (+) + $chr[131] = '312111'; // (%) + $chr['*'] = '111141'; + $code = strtoupper($code); + $encode = array( + chr(0) => chr(131).'U', chr(1) => chr(128).'A', chr(2) => chr(128).'B', chr(3) => chr(128).'C', + chr(4) => chr(128).'D', chr(5) => chr(128).'E', chr(6) => chr(128).'F', chr(7) => chr(128).'G', + chr(8) => chr(128).'H', chr(9) => chr(128).'I', chr(10) => chr(128).'J', chr(11) => '£K', + chr(12) => chr(128).'L', chr(13) => chr(128).'M', chr(14) => chr(128).'N', chr(15) => chr(128).'O', + chr(16) => chr(128).'P', chr(17) => chr(128).'Q', chr(18) => chr(128).'R', chr(19) => chr(128).'S', + chr(20) => chr(128).'T', chr(21) => chr(128).'U', chr(22) => chr(128).'V', chr(23) => chr(128).'W', + chr(24) => chr(128).'X', chr(25) => chr(128).'Y', chr(26) => chr(128).'Z', chr(27) => chr(131).'A', + chr(28) => chr(131).'B', chr(29) => chr(131).'C', chr(30) => chr(131).'D', chr(31) => chr(131).'E', + chr(32) => ' ', chr(33) => chr(129).'A', chr(34) => chr(129).'B', chr(35) => chr(129).'C', + chr(36) => chr(129).'D', chr(37) => chr(129).'E', chr(38) => chr(129).'F', chr(39) => chr(129).'G', + chr(40) => chr(129).'H', chr(41) => chr(129).'I', chr(42) => chr(129).'J', chr(43) => chr(129).'K', + chr(44) => chr(129).'L', chr(45) => '-', chr(46) => '.', chr(47) => chr(129).'O', + chr(48) => '0', chr(49) => '1', chr(50) => '2', chr(51) => '3', + chr(52) => '4', chr(53) => '5', chr(54) => '6', chr(55) => '7', + chr(56) => '8', chr(57) => '9', chr(58) => chr(129).'Z', chr(59) => chr(131).'F', + chr(60) => chr(131).'G', chr(61) => chr(131).'H', chr(62) => chr(131).'I', chr(63) => chr(131).'J', + chr(64) => chr(131).'V', chr(65) => 'A', chr(66) => 'B', chr(67) => 'C', + chr(68) => 'D', chr(69) => 'E', chr(70) => 'F', chr(71) => 'G', + chr(72) => 'H', chr(73) => 'I', chr(74) => 'J', chr(75) => 'K', + chr(76) => 'L', chr(77) => 'M', chr(78) => 'N', chr(79) => 'O', + chr(80) => 'P', chr(81) => 'Q', chr(82) => 'R', chr(83) => 'S', + chr(84) => 'T', chr(85) => 'U', chr(86) => 'V', chr(87) => 'W', + chr(88) => 'X', chr(89) => 'Y', chr(90) => 'Z', chr(91) => chr(131).'K', + chr(92) => chr(131).'L', chr(93) => chr(131).'M', chr(94) => chr(131).'N', chr(95) => chr(131).'O', + chr(96) => chr(131).'W', chr(97) => chr(130).'A', chr(98) => chr(130).'B', chr(99) => chr(130).'C', + chr(100) => chr(130).'D', chr(101) => chr(130).'E', chr(102) => chr(130).'F', chr(103) => chr(130).'G', + chr(104) => chr(130).'H', chr(105) => chr(130).'I', chr(106) => chr(130).'J', chr(107) => chr(130).'K', + chr(108) => chr(130).'L', chr(109) => chr(130).'M', chr(110) => chr(130).'N', chr(111) => chr(130).'O', + chr(112) => chr(130).'P', chr(113) => chr(130).'Q', chr(114) => chr(130).'R', chr(115) => chr(130).'S', + chr(116) => chr(130).'T', chr(117) => chr(130).'U', chr(118) => chr(130).'V', chr(119) => chr(130).'W', + chr(120) => chr(130).'X', chr(121) => chr(130).'Y', chr(122) => chr(130).'Z', chr(123) => chr(131).'P', + chr(124) => chr(131).'Q', chr(125) => chr(131).'R', chr(126) => chr(131).'S', chr(127) => chr(131).'T'); + $code_ext = ''; + $clen = strlen($code); + for ($i = 0 ; $i < $clen; ++$i) { + if (ord($code[$i]) > 127) { + return false; + } + $code_ext .= $encode[$code[$i]]; + } + // checksum + $checkdigit = $this->checksum_code93($code); + $code .= $checkdigit ; + // add start and stop codes + $code = '*'.$code.'*'; + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + $k = 0; + $clen = strlen($code); + for ($i = 0; $i < $clen; ++$i) { + $char = $code[$i]; + if(!isset($chr[$char])) { + // invalid character + return false; + } + for ($j = 0; $j < 6; ++$j) { + if (($j % 2) == 0) { + $t = true; // bar + } else { + $t = false; // space + } + $w = $chr[$char][$j]; + $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); + $bararray['maxw'] += $w; + ++$k; + } + } + $bararray['bcode'][$k] = array('t' => true, 'w' => 1, 'h' => 1, 'p' => 0); + $bararray['maxw'] += 1; + ++$k; + $bararray['checkdigit'] = $checkdigit; + return $bararray; + } + + /** + * Calculate CODE 93 checksum (modulo 47). + */ + protected function checksum_code93($code) { + $chars = array( + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', + 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', + 'W', 'X', 'Y', 'Z', '-', '.', ' ', '$', '/', '+', '%'); + // translate special characters + $code = strtr($code, chr(128).chr(129).chr(130).chr(131), '$/+%'); + $len = strlen($code); + // calculate check digit C + $p = 1; + $check = 0; + for ($i = ($len - 1); $i >= 0; --$i) { + $k = array_keys($chars, $code[$i]); + $check += ($k[0] * $p); + ++$p; + if ($p > 20) { + $p = 1; + } + } + $check %= 47; + $c = $chars[$check]; + $code .= $c; + // calculate check digit K + $p = 1; + $check = 0; + for ($i = $len; $i >= 0; --$i) { + $k = array_keys($chars, $code[$i]); + $check += ($k[0] * $p); + ++$p; + if ($p > 15) { + $p = 1; + } + } + $check %= 47; + $k = $chars[$check]; + return $c.$k; + } + + /** + * Checksum for standard 2 of 5 barcodes. + */ + protected function checksum_s25($code) { + $len = strlen($code); + $sum = 0; + for ($i = 0; $i < $len; $i+=2) { + $sum += $code[$i]; + } + $sum *= 3; + for ($i = 1; $i < $len; $i+=2) { + $sum += ($code[$i]); + } + $r = $sum % 10; + if($r > 0) { + $r = (10 - $r); + } + return $r; + } + + /** + * MSI. + * Variation of Plessey code, with similar applications + * Contains digits (0 to 9) and encodes the data only in the width of bars. + */ + protected function barcode_msi($code, $checksum=false) { + $chr['0'] = '100100100100'; + $chr['1'] = '100100100110'; + $chr['2'] = '100100110100'; + $chr['3'] = '100100110110'; + $chr['4'] = '100110100100'; + $chr['5'] = '100110100110'; + $chr['6'] = '100110110100'; + $chr['7'] = '100110110110'; + $chr['8'] = '110100100100'; + $chr['9'] = '110100100110'; + $chr['A'] = '110100110100'; + $chr['B'] = '110100110110'; + $chr['C'] = '110110100100'; + $chr['D'] = '110110100110'; + $chr['E'] = '110110110100'; + $chr['F'] = '110110110110'; + if ($checksum) { + // add checksum + $clen = strlen($code); + $p = 2; + $check = 0; + for ($i = ($clen - 1); $i >= 0; --$i) { + $check += (hexdec($code[$i]) * $p); + ++$p; + if ($p > 7) { + $p = 2; + } + } + $check %= 11; + if ($check > 0) { + $check = 11 - $check; + } + $code .= $check; + $checkdigit = $check; + } + $seq = '110'; // left guard + $clen = strlen($code); + for ($i = 0; $i < $clen; ++$i) { + $digit = $code[$i]; + if (!isset($chr[$digit])) { + // invalid character + return false; + } + $seq .= $chr[$digit]; + } + $seq .= '1001'; // right guard + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + $bararray['checkdigit'] = $checkdigit; + return $this->binseq_to_array($seq, $bararray); + } + + /** + * Standard 2 of 5 barcodes. + * Used in airline ticket marking, photofinishing + * Contains digits (0 to 9) and encodes the data only in the width of bars. + */ + protected function barcode_s25($code, $checksum=false) { + $chr['0'] = '10101110111010'; + $chr['1'] = '11101010101110'; + $chr['2'] = '10111010101110'; + $chr['3'] = '11101110101010'; + $chr['4'] = '10101110101110'; + $chr['5'] = '11101011101010'; + $chr['6'] = '10111011101010'; + $chr['7'] = '10101011101110'; + $chr['8'] = '10101110111010'; + $chr['9'] = '10111010111010'; + if ($checksum) { + // add checksum + $checkdigit = $this->checksum_s25($code); + $code .= $checkdigit ; + } + if((strlen($code) % 2) != 0) { + // add leading zero if code-length is odd + $code = '0'.$code; + } + $seq = '11011010'; + $clen = strlen($code); + for ($i = 0; $i < $clen; ++$i) { + $digit = $code[$i]; + if (!isset($chr[$digit])) { + // invalid character + return false; + } + $seq .= $chr[$digit]; + } + $seq .= '1101011'; + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + $bararray['checkdigit'] = $checkdigit; + return $this->binseq_to_array($seq, $bararray); + } + + /** + * Convert binary barcode sequence to barcode array + */ + protected function binseq_to_array($seq, $bararray) { + $len = strlen($seq); + $w = 0; + $k = 0; + for ($i = 0; $i < $len; ++$i) { + $w += 1; + if (($i == ($len - 1)) OR (($i < ($len - 1)) AND ($seq[$i] != $seq[($i+1)]))) { + if ($seq[$i] == '1') { + $t = true; // bar + } else { + $t = false; // space + } + $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); + $bararray['maxw'] += $w; + ++$k; + $w = 0; + } + } + return $bararray; + } + + /** + * Interleaved 2 of 5 barcodes. + * Compact numeric code, widely used in industry, air cargo + * Contains digits (0 to 9) and encodes the data in the width of both bars and spaces. + */ + protected function barcode_i25($code, $checksum=false) { + $chr['0'] = '11221'; + $chr['1'] = '21112'; + $chr['2'] = '12112'; + $chr['3'] = '22111'; + $chr['4'] = '11212'; + $chr['5'] = '21211'; + $chr['6'] = '12211'; + $chr['7'] = '11122'; + $chr['8'] = '21121'; + $chr['9'] = '12121'; + $chr['A'] = '11'; + $chr['Z'] = '21'; + if ($checksum) { + // add checksum + $checkdigit = $this->checksum_s25($code); + $code .= $checkdigit ; + } + if((strlen($code) % 2) != 0) { + // add leading zero if code-length is odd + $code = '0'.$code; + } + // add start and stop codes + $code = 'AA'.strtolower($code).'ZA'; + + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + $k = 0; + $clen = strlen($code); + for ($i = 0; $i < $clen; $i = ($i + 2)) { + $char_bar = $code[$i]; + $char_space = $code[$i+1]; + if((!isset($chr[$char_bar])) OR (!isset($chr[$char_space]))) { + // invalid character + return false; + } + // create a bar-space sequence + $seq = ''; + $chrlen = strlen($chr[$char_bar]); + for ($s = 0; $s < $chrlen; $s++){ + $seq .= $chr[$char_bar][$s] . $chr[$char_space][$s]; + } + $seqlen = strlen($seq); + for ($j = 0; $j < $seqlen; ++$j) { + if (($j % 2) == 0) { + $t = true; // bar + } else { + $t = false; // space + } + $x = $seq[$j]; + if ($x == 2) { $w = $this->print_ratio; } + else { $w = 1; } + + $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); + $bararray['maxw'] += $w; + ++$k; + } + } + $bararray['checkdigit'] = $checkdigit; + return $bararray; + } + + /** + * C128 barcodes. + * Very capable code, excellent density, high reliability; in very wide use world-wide + */ + protected function barcode_c128($code, $type='B', $ean=false) { + $chr = array( + '212222', /* 00 */ + '222122', /* 01 */ + '222221', /* 02 */ + '121223', /* 03 */ + '121322', /* 04 */ + '131222', /* 05 */ + '122213', /* 06 */ + '122312', /* 07 */ + '132212', /* 08 */ + '221213', /* 09 */ + '221312', /* 10 */ + '231212', /* 11 */ + '112232', /* 12 */ + '122132', /* 13 */ + '122231', /* 14 */ + '113222', /* 15 */ + '123122', /* 16 */ + '123221', /* 17 */ + '223211', /* 18 */ + '221132', /* 19 */ + '221231', /* 20 */ + '213212', /* 21 */ + '223112', /* 22 */ + '312131', /* 23 */ + '311222', /* 24 */ + '321122', /* 25 */ + '321221', /* 26 */ + '312212', /* 27 */ + '322112', /* 28 */ + '322211', /* 29 */ + '212123', /* 30 */ + '212321', /* 31 */ + '232121', /* 32 */ + '111323', /* 33 */ + '131123', /* 34 */ + '131321', /* 35 */ + '112313', /* 36 */ + '132113', /* 37 */ + '132311', /* 38 */ + '211313', /* 39 */ + '231113', /* 40 */ + '231311', /* 41 */ + '112133', /* 42 */ + '112331', /* 43 */ + '132131', /* 44 */ + '113123', /* 45 */ + '113321', /* 46 */ + '133121', /* 47 */ + '313121', /* 48 */ + '211331', /* 49 */ + '231131', /* 50 */ + '213113', /* 51 */ + '213311', /* 52 */ + '213131', /* 53 */ + '311123', /* 54 */ + '311321', /* 55 */ + '331121', /* 56 */ + '312113', /* 57 */ + '312311', /* 58 */ + '332111', /* 59 */ + '314111', /* 60 */ + '221411', /* 61 */ + '431111', /* 62 */ + '111224', /* 63 */ + '111422', /* 64 */ + '121124', /* 65 */ + '121421', /* 66 */ + '141122', /* 67 */ + '141221', /* 68 */ + '112214', /* 69 */ + '112412', /* 70 */ + '122114', /* 71 */ + '122411', /* 72 */ + '142112', /* 73 */ + '142211', /* 74 */ + '241211', /* 75 */ + '221114', /* 76 */ + '413111', /* 77 */ + '241112', /* 78 */ + '134111', /* 79 */ + '111242', /* 80 */ + '121142', /* 81 */ + '121241', /* 82 */ + '114212', /* 83 */ + '124112', /* 84 */ + '124211', /* 85 */ + '411212', /* 86 */ + '421112', /* 87 */ + '421211', /* 88 */ + '212141', /* 89 */ + '214121', /* 90 */ + '412121', /* 91 */ + '111143', /* 92 */ + '111341', /* 93 */ + '131141', /* 94 */ + '114113', /* 95 */ + '114311', /* 96 */ + '411113', /* 97 */ + '411311', /* 98 */ + '113141', /* 99 */ + '114131', /* 100 */ + '311141', /* 101 */ + '411131', /* 102 */ + '211412', /* 103 START A */ + '211214', /* 104 START B */ + '211232', /* 105 START C */ + '233111', /* STOP */ + '200000' /* END */ + ); + $keys = ''; + switch(strtoupper($type)) { + case 'A': { + $startid = 103; + $keys = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'; + for ($i = 0; $i < 32; ++$i) { + $keys .= chr($i); + } + break; + } + case 'B': { + $startid = 104; + $keys = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'.chr(127); + break; + } + case 'C': { + $startid = 105; + $keys = ''; + if ((strlen($code) % 2) != 0) { + // The length of barcode value must be even ($code). You must pad the number with zeros + return false; + } + for ($i = 0; $i <= 99; ++$i) { + $keys .= chr($i); + } + $new_code = ''; + $hclen = (strlen($code) / 2); + for ($i = 0; $i < $hclen; ++$i) { + $new_code .= chr(intval($code{(2 * $i)}.$code{(2 * $i + 1)})); + } + $code = $new_code; + break; + } + default: { + return false; + } + } + + // calculate check character + $sum = $startid; + if ($ean) { $code = chr(102) . $code; } // Add FNC 1 - which identifies it as EAN-128 + $clen = strlen($code); + for ($i = 0; $i < $clen; ++$i) { + if ($ean && $i==0) { $sum += 102; } + else { $sum += (strpos($keys, $code[$i]) * ($i+1)); } + } + $check = ($sum % 103); + $checkdigit = $check ; + // add start, check and stop codes + $code = chr($startid).$code.chr($check).chr(106).chr(107); + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + $k = 0; + $len = strlen($code); + for ($i = 0; $i < $len; ++$i) { + $ck = strpos($keys, $code[$i]); + if (($i == 0) || ($ean && $i==1) | ($i > ($len-4))) { + $char_num = ord($code[$i]); + $seq = $chr[$char_num]; + } elseif(($ck >= 0) AND isset($chr[$ck])) { + $seq = $chr[$ck]; + } else { + // invalid character + return false; + } + for ($j = 0; $j < 6; ++$j) { + if (($j % 2) == 0) { + $t = true; // bar + } else { + $t = false; // space + } + $w = $seq[$j]; + $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); + $bararray['maxw'] += $w; + ++$k; + } + } + $bararray['checkdigit'] = $checkdigit; + return $bararray; + } + + /** + * EAN13 and UPC-A barcodes. + * EAN13: European Article Numbering international retail product code + * UPC-A: Universal product code seen on almost all retail products in the USA and Canada + * UPC-E: Short version of UPC symbol + */ + protected function barcode_eanupc($code, $len=13) { + $upce = false; + $checkdigit = false; + if ($len == 6) { + $len = 12; // UPC-A + $upce = true; // UPC-E mode + } + $data_len = $len - 1; + //Padding + $code = str_pad($code, $data_len, '0', STR_PAD_LEFT); + $code_len = strlen($code); + // calculate check digit + $sum_a = 0; + for ($i = 1; $i < $data_len; $i+=2) { + $sum_a += $code[$i]; + } + if ($len > 12) { + $sum_a *= 3; + } + $sum_b = 0; + for ($i = 0; $i < $data_len; $i+=2) { + $sum_b += ($code[$i]); + } + if ($len < 13) { + $sum_b *= 3; + } + $r = ($sum_a + $sum_b) % 10; + if($r > 0) { + $r = (10 - $r); + } + if ($code_len == $data_len) { + // add check digit + $code .= $r; + $checkdigit = $r; + } elseif ($r !== intval($code[$data_len])) { + // wrong checkdigit + return false; + } + if ($len == 12) { + // UPC-A + $code = '0'.$code; + ++$len; + } + if ($upce) { + // convert UPC-A to UPC-E + $tmp = substr($code, 4, 3); + $prod_code = intval(substr($code,7,5)); // product code + $invalid_upce = false; + if (($tmp == '000') OR ($tmp == '100') OR ($tmp == '200')) { + // manufacturer code ends in 000, 100, or 200 + $upce_code = substr($code, 2, 2).substr($code, 9, 3).substr($code, 4, 1); + if ($prod_code > 999) { $invalid_upce = true; } + } else { + $tmp = substr($code, 5, 2); + if ($tmp == '00') { + // manufacturer code ends in 00 + $upce_code = substr($code, 2, 3).substr($code, 10, 2).'3'; + if ($prod_code > 99) { $invalid_upce = true; } + } else { + $tmp = substr($code, 6, 1); + if ($tmp == '0') { + // manufacturer code ends in 0 + $upce_code = substr($code, 2, 4).substr($code, 11, 1).'4'; + if ($prod_code > 9) { $invalid_upce = true; } + } else { + // manufacturer code does not end in zero + $upce_code = substr($code, 2, 5).substr($code, 11, 1); + if ($prod_code > 9) { $invalid_upce = true; } + } + } + } + if ($invalid_upce) { die("Error - UPC-A cannot produce a valid UPC-E barcode"); } // Error generating a UPCE code + } + //Convert digits to bars + $codes = array( + 'A'=>array( // left odd parity + '0'=>'0001101', + '1'=>'0011001', + '2'=>'0010011', + '3'=>'0111101', + '4'=>'0100011', + '5'=>'0110001', + '6'=>'0101111', + '7'=>'0111011', + '8'=>'0110111', + '9'=>'0001011'), + 'B'=>array( // left even parity + '0'=>'0100111', + '1'=>'0110011', + '2'=>'0011011', + '3'=>'0100001', + '4'=>'0011101', + '5'=>'0111001', + '6'=>'0000101', + '7'=>'0010001', + '8'=>'0001001', + '9'=>'0010111'), + 'C'=>array( // right + '0'=>'1110010', + '1'=>'1100110', + '2'=>'1101100', + '3'=>'1000010', + '4'=>'1011100', + '5'=>'1001110', + '6'=>'1010000', + '7'=>'1000100', + '8'=>'1001000', + '9'=>'1110100') + ); + $parities = array( + '0'=>array('A','A','A','A','A','A'), + '1'=>array('A','A','B','A','B','B'), + '2'=>array('A','A','B','B','A','B'), + '3'=>array('A','A','B','B','B','A'), + '4'=>array('A','B','A','A','B','B'), + '5'=>array('A','B','B','A','A','B'), + '6'=>array('A','B','B','B','A','A'), + '7'=>array('A','B','A','B','A','B'), + '8'=>array('A','B','A','B','B','A'), + '9'=>array('A','B','B','A','B','A') + ); + $upce_parities = array(); + $upce_parities[0] = array( + '0'=>array('B','B','B','A','A','A'), + '1'=>array('B','B','A','B','A','A'), + '2'=>array('B','B','A','A','B','A'), + '3'=>array('B','B','A','A','A','B'), + '4'=>array('B','A','B','B','A','A'), + '5'=>array('B','A','A','B','B','A'), + '6'=>array('B','A','A','A','B','B'), + '7'=>array('B','A','B','A','B','A'), + '8'=>array('B','A','B','A','A','B'), + '9'=>array('B','A','A','B','A','B') + ); + $upce_parities[1] = array( + '0'=>array('A','A','A','B','B','B'), + '1'=>array('A','A','B','A','B','B'), + '2'=>array('A','A','B','B','A','B'), + '3'=>array('A','A','B','B','B','A'), + '4'=>array('A','B','A','A','B','B'), + '5'=>array('A','B','B','A','A','B'), + '6'=>array('A','B','B','B','A','A'), + '7'=>array('A','B','A','B','A','B'), + '8'=>array('A','B','A','B','B','A'), + '9'=>array('A','B','B','A','B','A') + ); + $k = 0; + $seq = '101'; // left guard bar + if ($upce) { + $bararray = array('code' => $upce_code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + $p = $upce_parities[$code{1}][$r]; + for ($i = 0; $i < 6; ++$i) { + $seq .= $codes[$p[$i]][$upce_code[$i]]; + } + $seq .= '010101'; // right guard bar + } else { + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + $half_len = ceil($len / 2); + if ($len == 8) { + for ($i = 0; $i < $half_len; ++$i) { + $seq .= $codes['A'][$code[$i]]; + } + } else { + $p = $parities[$code{0}]; + for ($i = 1; $i < $half_len; ++$i) { + $seq .= $codes[$p[$i-1]][$code[$i]]; + } + } + $seq .= '01010'; // center guard bar + for ($i = $half_len; $i < $len; ++$i) { + $seq .= $codes['C'][$code[$i]]; + } + $seq .= '101'; // right guard bar + } + $clen = strlen($seq); + $w = 0; + for ($i = 0; $i < $clen; ++$i) { + $w += 1; + if (($i == ($clen - 1)) OR (($i < ($clen - 1)) AND ($seq[$i] != $seq[($i+1)]))) { + if ($seq[$i] == '1') { + $t = true; // bar + } else { + $t = false; // space + } + $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); + $bararray['maxw'] += $w; + ++$k; + $w = 0; + } + } + $bararray['checkdigit'] = $checkdigit; + return $bararray; + } + + /** + * UPC-Based Extentions + * 2-Digit Ext.: Used to indicate magazines and newspaper issue numbers + * 5-Digit Ext.: Used to mark suggested retail price of books + */ + protected function barcode_eanext($code, $len=5) { + //Padding + $code = str_pad($code, $len, '0', STR_PAD_LEFT); + // calculate check digit + if ($len == 2) { + $r = $code % 4; + } elseif ($len == 5) { + $r = (3 * ($code{0} + $code{2} + $code{4})) + (9 * ($code{1} + $code{3})); + $r %= 10; + } else { + return false; + } + //Convert digits to bars + $codes = array( + 'A'=>array( // left odd parity + '0'=>'0001101', + '1'=>'0011001', + '2'=>'0010011', + '3'=>'0111101', + '4'=>'0100011', + '5'=>'0110001', + '6'=>'0101111', + '7'=>'0111011', + '8'=>'0110111', + '9'=>'0001011'), + 'B'=>array( // left even parity + '0'=>'0100111', + '1'=>'0110011', + '2'=>'0011011', + '3'=>'0100001', + '4'=>'0011101', + '5'=>'0111001', + '6'=>'0000101', + '7'=>'0010001', + '8'=>'0001001', + '9'=>'0010111') + ); + $parities = array(); + $parities[2] = array( + '0'=>array('A','A'), + '1'=>array('A','B'), + '2'=>array('B','A'), + '3'=>array('B','B') + ); + $parities[5] = array( + '0'=>array('B','B','A','A','A'), + '1'=>array('B','A','B','A','A'), + '2'=>array('B','A','A','B','A'), + '3'=>array('B','A','A','A','B'), + '4'=>array('A','B','B','A','A'), + '5'=>array('A','A','B','B','A'), + '6'=>array('A','A','A','B','B'), + '7'=>array('A','B','A','B','A'), + '8'=>array('A','B','A','A','B'), + '9'=>array('A','A','B','A','B') + ); + $p = $parities[$len][$r]; + $seq = '1011'; // left guard bar + $seq .= $codes[$p[0]][$code{0}]; + for ($i = 1; $i < $len; ++$i) { + $seq .= '01'; // separator + $seq .= $codes[$p[$i]][$code[$i]]; + } + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + return $this->binseq_to_array($seq, $bararray); + } + + /** + * POSTNET and PLANET barcodes. + * Used by U.S. Postal Service for automated mail sorting + */ + protected function barcode_postnet($code, $planet=false) { + // bar lenght + if ($planet) { + $barlen = Array( + 0 => Array(1,1,2,2,2), + 1 => Array(2,2,2,1,1), + 2 => Array(2,2,1,2,1), + 3 => Array(2,2,1,1,2), + 4 => Array(2,1,2,2,1), + 5 => Array(2,1,2,1,2), + 6 => Array(2,1,1,2,2), + 7 => Array(1,2,2,2,1), + 8 => Array(1,2,2,1,2), + 9 => Array(1,2,1,2,2) + ); + } else { + $barlen = Array( + 0 => Array(2,2,1,1,1), + 1 => Array(1,1,1,2,2), + 2 => Array(1,1,2,1,2), + 3 => Array(1,1,2,2,1), + 4 => Array(1,2,1,1,2), + 5 => Array(1,2,1,2,1), + 6 => Array(1,2,2,1,1), + 7 => Array(2,1,1,1,2), + 8 => Array(2,1,1,2,1), + 9 => Array(2,1,2,1,1) + ); + } + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 5, 'bcode' => array()); + $k = 0; + $code = str_replace('-', '', $code); + $code = str_replace(' ', '', $code); + $len = strlen($code); + // calculate checksum + $sum = 0; + for ($i = 0; $i < $len; ++$i) { + $sum += intval($code[$i]); + } + $chkd = ($sum % 10); + if($chkd > 0) { + $chkd = (10 - $chkd); + } + $code .= $chkd; + $checkdigit = $chkd; + $len = strlen($code); + // start bar + $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => 5, 'p' => 0); + $bararray['bcode'][$k++] = array('t' => 0, 'w' => $this->gapwidth , 'h' => 5, 'p' => 0); + $bararray['maxw'] += (1 + $this->gapwidth ); + for ($i = 0; $i < $len; ++$i) { + for ($j = 0; $j < 5; ++$j) { + $bh = $barlen[$code[$i]][$j]; + if ($bh == 2) { + $h = 5; + $p = 0; + } + else { + $h = 2; + $p = 3; + } + $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => $h, 'p' => $p); + $bararray['bcode'][$k++] = array('t' => 0, 'w' => $this->gapwidth , 'h' => 2, 'p' => 0); + $bararray['maxw'] += (1 + $this->gapwidth ); + } + } + // end bar + $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => 5, 'p' => 0); + $bararray['maxw'] += 1; + $bararray['checkdigit'] = $checkdigit; + return $bararray; + } + + /** + * RM4SCC - CBC - KIX + * RM4SCC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code) - KIX (Klant index - Customer index) + * RM4SCC is the name of the barcode symbology used by the Royal Mail for its Cleanmail service. + */ + protected function barcode_rm4scc($code, $kix=false) { + $notkix = !$kix; + // bar mode + // 1 = pos 1, length 2 + // 2 = pos 1, length 3 + // 3 = pos 2, length 1 + // 4 = pos 2, length 2 + $barmode = array( + '0' => array(3,3,2,2), + '1' => array(3,4,1,2), + '2' => array(3,4,2,1), + '3' => array(4,3,1,2), + '4' => array(4,3,2,1), + '5' => array(4,4,1,1), + '6' => array(3,1,4,2), + '7' => array(3,2,3,2), + '8' => array(3,2,4,1), + '9' => array(4,1,3,2), + 'A' => array(4,1,4,1), + 'B' => array(4,2,3,1), + 'C' => array(3,1,2,4), + 'D' => array(3,2,1,4), + 'E' => array(3,2,2,3), + 'F' => array(4,1,1,4), + 'G' => array(4,1,2,3), + 'H' => array(4,2,1,3), + 'I' => array(1,3,4,2), + 'J' => array(1,4,3,2), + 'K' => array(1,4,4,1), + 'L' => array(2,3,3,2), + 'M' => array(2,3,4,1), + 'N' => array(2,4,3,1), + 'O' => array(1,3,2,4), + 'P' => array(1,4,1,4), + 'Q' => array(1,4,2,3), + 'R' => array(2,3,1,4), + 'S' => array(2,3,2,3), + 'T' => array(2,4,1,3), + 'U' => array(1,1,4,4), + 'V' => array(1,2,3,4), + 'W' => array(1,2,4,3), + 'X' => array(2,1,3,4), + 'Y' => array(2,1,4,3), + 'Z' => array(2,2,3,3) + ); + $code = strtoupper($code); + $len = strlen($code); + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => $this->daft['F'], 'bcode' => array()); + if ($notkix) { + // table for checksum calculation (row,col) + $checktable = array( + '0' => array(1,1), + '1' => array(1,2), + '2' => array(1,3), + '3' => array(1,4), + '4' => array(1,5), + '5' => array(1,0), + '6' => array(2,1), + '7' => array(2,2), + '8' => array(2,3), + '9' => array(2,4), + 'A' => array(2,5), + 'B' => array(2,0), + 'C' => array(3,1), + 'D' => array(3,2), + 'E' => array(3,3), + 'F' => array(3,4), + 'G' => array(3,5), + 'H' => array(3,0), + 'I' => array(4,1), + 'J' => array(4,2), + 'K' => array(4,3), + 'L' => array(4,4), + 'M' => array(4,5), + 'N' => array(4,0), + 'O' => array(5,1), + 'P' => array(5,2), + 'Q' => array(5,3), + 'R' => array(5,4), + 'S' => array(5,5), + 'T' => array(5,0), + 'U' => array(0,1), + 'V' => array(0,2), + 'W' => array(0,3), + 'X' => array(0,4), + 'Y' => array(0,5), + 'Z' => array(0,0) + ); + $row = 0; + $col = 0; + for ($i = 0; $i < $len; ++$i) { + $row += $checktable[$code[$i]][0]; + $col += $checktable[$code[$i]][1]; + } + $row %= 6; + $col %= 6; + $chk = array_keys($checktable, array($row,$col)); + $code .= $chk[0]; + $bararray['checkdigit'] = $chk[0]; + ++$len; + } + $k = 0; + if ($notkix) { + // start bar + $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => $this->daft['A'] , 'p' => 0); + $bararray['bcode'][$k++] = array('t' => 0, 'w' => $this->gapwidth , 'h' => $this->daft['A'] , 'p' => 0); + $bararray['maxw'] += (1 + $this->gapwidth) ; + } + for ($i = 0; $i < $len; ++$i) { + for ($j = 0; $j < 4; ++$j) { + switch ($barmode[$code[$i]][$j]) { + case 1: { + // ascender (A) + $p = 0; + $h = $this->daft['A']; + break; + } + case 2: { + // full bar (F) + $p = 0; + $h = $this->daft['F']; + break; + } + case 3: { + // tracker (T) + $p = ($this->daft['F'] - $this->daft['T'])/2; + $h = $this->daft['T']; + break; + } + case 4: { + // descender (D) + $p = $this->daft['F'] - $this->daft['D']; + $h = $this->daft['D']; + break; + } + } + + $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => $h, 'p' => $p); + $bararray['bcode'][$k++] = array('t' => 0, 'w' => $this->gapwidth, 'h' => 2, 'p' => 0); + $bararray['maxw'] += (1 + $this->gapwidth) ; + } + } + if ($notkix) { + // stop bar + $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => $this->daft['F'], 'p' => 0); + $bararray['maxw'] += 1; + } + return $bararray; + } + + /** + * CODABAR barcodes. + * Older code often used in library systems, sometimes in blood banks + */ + protected function barcode_codabar($code) { + $chr = array( + '0' => '11111221', + '1' => '11112211', + '2' => '11121121', + '3' => '22111111', + '4' => '11211211', + '5' => '21111211', + '6' => '12111121', + '7' => '12112111', + '8' => '12211111', + '9' => '21121111', + '-' => '11122111', + '$' => '11221111', + ':' => '21112121', + '/' => '21211121', + '.' => '21212111', + '+' => '11222221', + 'A' => '11221211', + 'B' => '12121121', + 'C' => '11121221', + 'D' => '11122211' + ); + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + $k = 0; + $w = 0; + $seq = ''; + $code = strtoupper($code); + $len = strlen($code); + for ($i = 0; $i < $len; ++$i) { + if (!isset($chr[$code[$i]])) { + return false; + } + $seq = $chr[$code[$i]]; + for ($j = 0; $j < 8; ++$j) { + if (($j % 2) == 0) { + $t = true; // bar + } else { + $t = false; // space + } + $x = $seq[$j]; + if ($x == 2) { $w = $this->print_ratio; } + else { $w = 1; } + $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); + $bararray['maxw'] += $w; + ++$k; + } + } + return $bararray; + } + + /** + * CODE11 barcodes. + * Used primarily for labeling telecommunications equipment + */ + protected function barcode_code11($code) { + $chr = array( + '0' => '111121', + '1' => '211121', + '2' => '121121', + '3' => '221111', + '4' => '112121', + '5' => '212111', + '6' => '122111', + '7' => '111221', + '8' => '211211', + '9' => '211111', + '-' => '112111', + 'S' => '112211' + ); + + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + $k = 0; + $w = 0; + $seq = ''; + $len = strlen($code); + // calculate check digit C + $p = 1; + $check = 0; + for ($i = ($len - 1); $i >= 0; --$i) { + $digit = $code[$i]; + if ($digit == '-') { + $dval = 10; + } else { + $dval = intval($digit); + } + $check += ($dval * $p); + ++$p; + if ($p > 10) { + $p = 1; + } + } + $check %= 11; + if ($check == 10) { + $check = '-'; + } + $code .= $check; + $checkdigit = $check; + if ($len > 10) { + // calculate check digit K + $p = 1; + $check = 0; + for ($i = $len; $i >= 0; --$i) { + $digit = $code[$i]; + if ($digit == '-') { + $dval = 10; + } else { + $dval = intval($digit); + } + $check += ($dval * $p); + ++$p; + if ($p > 9) { + $p = 1; + } + } + $check %= 11; + $code .= $check; + $checkdigit .= $check; + ++$len; + } + $code = 'S'.$code.'S'; + $len += 3; + for ($i = 0; $i < $len; ++$i) { + if (!isset($chr[$code[$i]])) { + return false; + } + $seq = $chr[$code[$i]]; + for ($j = 0; $j < 6; ++$j) { + if (($j % 2) == 0) { + $t = true; // bar + } else { + $t = false; // space + } + $x = $seq[$j]; + if ($x == 2) { $w = $this->print_ratio; } + else { $w = 1; } + $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); + $bararray['maxw'] += $w; + ++$k; + } + } + $bararray['checkdigit'] = $checkdigit; + return $bararray; + } + + + /** + * IMB - Intelligent Mail Barcode - Onecode - USPS-B-3200 + * (requires PHP bcmath extension) + * Intelligent Mail barcode is a 65-bar code for use on mail in the United States. + * The fields are described as follows:<ul><li>The Barcode Identifier shall be assigned by USPS to encode the presort identification that is currently printed in human readable form on the optional endorsement line (OEL) as well as for future USPS use. This shall be two digits, with the second digit in the range of 0-4. The allowable encoding ranges shall be 00-04, 10-14, 20-24, 30-34, 40-44, 50-54, 60-64, 70-74, 80-84, and 90-94.</li><li>The Service Type Identifier shall be assigned by USPS for any combination of services requested on the mailpiece. The allowable encoding range shall be 000-999. Each 3-digit value shall correspond to a particular mail class with a particular combination of service(s). Each service program, such as OneCode Confirm and OneCode ACS, shall provide the list of Service Type Identifier values.</li><li>The Mailer or Customer Identifier shall be assigned by USPS as a unique, 6 or 9 digit number that identifies a business entity. The allowable encoding range for the 6 digit Mailer ID shall be 000000- 899999, while the allowable encoding range for the 9 digit Mailer ID shall be 900000000-999999999.</li><li>The Serial or Sequence Number shall be assigned by the mailer for uniquely identifying and tracking mailpieces. The allowable encoding range shall be 000000000-999999999 when used with a 6 digit Mailer ID and 000000-999999 when used with a 9 digit Mailer ID. e. The Delivery Point ZIP Code shall be assigned by the mailer for routing the mailpiece. This shall replace POSTNET for routing the mailpiece to its final delivery point. The length may be 0, 5, 9, or 11 digits. The allowable encoding ranges shall be no ZIP Code, 00000-99999, 000000000-999999999, and 00000000000-99999999999.</li></ul> + */ + protected function barcode_imb($code) { + $asc_chr = array(4,0,2,6,3,5,1,9,8,7,1,2,0,6,4,8,2,9,5,3,0,1,3,7,4,6,8,9,2,0,5,1,9,4,3,8,6,7,1,2,4,3,9,5,7,8,3,0,2,1,4,0,9,1,7,0,2,4,6,3,7,1,9,5,8); + $dsc_chr = array(7,1,9,5,8,0,2,4,6,3,5,8,9,7,3,0,6,1,7,4,6,8,9,2,5,1,7,5,4,3,8,7,6,0,2,5,4,9,3,0,1,6,8,2,0,4,5,9,6,7,5,2,6,3,8,5,1,9,8,7,4,0,2,6,3); + $asc_pos = array(3,0,8,11,1,12,8,11,10,6,4,12,2,7,9,6,7,9,2,8,4,0,12,7,10,9,0,7,10,5,7,9,6,8,2,12,1,4,2,0,1,5,4,6,12,1,0,9,4,7,5,10,2,6,9,11,2,12,6,7,5,11,0,3,2); + $dsc_pos = array(2,10,12,5,9,1,5,4,3,9,11,5,10,1,6,3,4,1,10,0,2,11,8,6,1,12,3,8,6,4,4,11,0,6,1,9,11,5,3,7,3,10,7,11,8,2,10,3,5,8,0,3,12,11,8,4,5,1,3,0,7,12,9,8,10); + $code_arr = explode('-', $code); + $tracking_number = $code_arr[0]; + if (isset($code_arr[1])) { + $routing_code = $code_arr[1]; + } else { + $routing_code = ''; + } + // Conversion of Routing Code + switch (strlen($routing_code)) { + case 0: { + $binary_code = 0; + break; + } + case 5: { + $binary_code = bcadd($routing_code, '1'); + break; + } + case 9: { + $binary_code = bcadd($routing_code, '100001'); + break; + } + case 11: { + $binary_code = bcadd($routing_code, '1000100001'); + break; + } + default: { + return false; + break; + } + } + $binary_code = bcmul($binary_code, 10); + $binary_code = bcadd($binary_code, $tracking_number{0}); + $binary_code = bcmul($binary_code, 5); + $binary_code = bcadd($binary_code, $tracking_number{1}); + $binary_code .= substr($tracking_number, 2, 18); + // convert to hexadecimal + $binary_code = $this->dec_to_hex($binary_code); + // pad to get 13 bytes + $binary_code = str_pad($binary_code, 26, '0', STR_PAD_LEFT); + // convert string to array of bytes + $binary_code_arr = chunk_split($binary_code, 2, "\r"); + $binary_code_arr = substr($binary_code_arr, 0, -1); + $binary_code_arr = explode("\r", $binary_code_arr); + // calculate frame check sequence + $fcs = $this->imb_crc11fcs($binary_code_arr); + // exclude first 2 bits from first byte + $first_byte = sprintf('%2s', dechex((hexdec($binary_code_arr[0]) << 2) >> 2)); + $binary_code_102bit = $first_byte.substr($binary_code, 2); + // convert binary data to codewords + $codewords = array(); + $data = $this->hex_to_dec($binary_code_102bit); + $codewords[0] = bcmod($data, 636) * 2; + $data = bcdiv($data, 636); + for ($i = 1; $i < 9; ++$i) { + $codewords[$i] = bcmod($data, 1365); + $data = bcdiv($data, 1365); + } + $codewords[9] = $data; + if (($fcs >> 10) == 1) { + $codewords[9] += 659; + } + // generate lookup tables + $table2of13 = $this->imb_tables(2, 78); + $table5of13 = $this->imb_tables(5, 1287); + // convert codewords to characters + $characters = array(); + $bitmask = 512; + foreach($codewords as $k => $val) { + if ($val <= 1286) { + $chrcode = $table5of13[$val]; + } else { + $chrcode = $table2of13[($val - 1287)]; + } + if (($fcs & $bitmask) > 0) { + // bitwise invert + $chrcode = ((~$chrcode) & 8191); + } + $characters[] = $chrcode; + $bitmask /= 2; + } + $characters = array_reverse($characters); + // build bars + $k = 0; + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => $this->daft['F'], 'bcode' => array()); + for ($i = 0; $i < 65; ++$i) { + $asc = (($characters[$asc_chr[$i]] & pow(2, $asc_pos[$i])) > 0); + $dsc = (($characters[$dsc_chr[$i]] & pow(2, $dsc_pos[$i])) > 0); + if ($asc AND $dsc) { + // full bar (F) + $p = 0; + $h = $this->daft['F']; + } elseif ($asc) { + // ascender (A) + $p = 0; + $h = $this->daft['A']; + } elseif ($dsc) { + // descender (D) + $p = $this->daft['F'] - $this->daft['D']; + $h = $this->daft['D']; + } else { + // tracker (T) + $p = ($this->daft['F'] - $this->daft['T'])/2; + $h = $this->daft['T']; + } + $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => $h, 'p' => $p); + // Gap + $bararray['bcode'][$k++] = array('t' => 0, 'w' => $this->gapwidth , 'h' => 1, 'p' => 0); + $bararray['maxw'] += (1 + $this->gapwidth ); + } + unset($bararray['bcode'][($k - 1)]); + $bararray['maxw'] -= $this->gapwidth ; + return $bararray; + } + + /** + * Convert large integer number to hexadecimal representation. + * (requires PHP bcmath extension) + */ + public function dec_to_hex($number) { + $i = 0; + $hex = array(); + if($number == 0) { + return '00'; + } + while($number > 0) { + if($number == 0) { + array_push($hex, '0'); + } else { + array_push($hex, strtoupper(dechex(bcmod($number, '16')))); + $number = bcdiv($number, '16', 0); + } + } + $hex = array_reverse($hex); + return implode($hex); + } + + /** + * Convert large hexadecimal number to decimal representation (string). + * (requires PHP bcmath extension) + */ + public function hex_to_dec($hex) { + $dec = 0; + $bitval = 1; + $len = strlen($hex); + for($pos = ($len - 1); $pos >= 0; --$pos) { + $dec = bcadd($dec, bcmul(hexdec($hex[$pos]), $bitval)); + $bitval = bcmul($bitval, 16); + } + return $dec; + } + + /** + * Intelligent Mail Barcode calculation of Frame Check Sequence + */ + protected function imb_crc11fcs($code_arr) { + $genpoly = 0x0F35; // generator polynomial + $fcs = 0x07FF; // Frame Check Sequence + // do most significant byte skipping the 2 most significant bits + $data = hexdec($code_arr[0]) << 5; + for ($bit = 2; $bit < 8; ++$bit) { + if (($fcs ^ $data) & 0x400) { + $fcs = ($fcs << 1) ^ $genpoly; + } else { + $fcs = ($fcs << 1); + } + $fcs &= 0x7FF; + $data <<= 1; + } + // do rest of bytes + for ($byte = 1; $byte < 13; ++$byte) { + $data = hexdec($code_arr[$byte]) << 3; + for ($bit = 0; $bit < 8; ++$bit) { + if (($fcs ^ $data) & 0x400) { + $fcs = ($fcs << 1) ^ $genpoly; + } else { + $fcs = ($fcs << 1); + } + $fcs &= 0x7FF; + $data <<= 1; + } + } + return $fcs; + } + + /** + * Reverse unsigned short value + */ + protected function imb_reverse_us($num) { + $rev = 0; + for ($i = 0; $i < 16; ++$i) { + $rev <<= 1; + $rev |= ($num & 1); + $num >>= 1; + } + return $rev; + } + + /** + * generate Nof13 tables used for Intelligent Mail Barcode + */ + protected function imb_tables($n, $size) { + $table = array(); + $lli = 0; // LUT lower index + $lui = $size - 1; // LUT upper index + for ($count = 0; $count < 8192; ++$count) { + $bit_count = 0; + for ($bit_index = 0; $bit_index < 13; ++$bit_index) { + $bit_count += intval(($count & (1 << $bit_index)) != 0); + } + // if we don't have the right number of bits on, go on to the next value + if ($bit_count == $n) { + $reverse = ($this->imb_reverse_us($count) >> 3); + // if the reverse is less than count, we have already visited this pair before + if ($reverse >= $count) { + // If count is symmetric, place it at the first free slot from the end of the list. + // Otherwise, place it at the first free slot from the beginning of the list AND place $reverse ath the next free slot from the beginning of the list + if ($reverse == $count) { + $table[$lui] = $count; + --$lui; + } else { + $table[$lli] = $count; + ++$lli; + $table[$lli] = $reverse; + ++$lli; + } + } + } + } + return $table; + } + +} // end of class + +//============================================================+ +// END OF FILE +//============================================================+ +?> \ No newline at end of file diff --git a/application/third_party/mpdf/classes/bmp.php b/application/third_party/mpdf/classes/bmp.php new file mode 100644 index 0000000..acf7f80 --- /dev/null +++ b/application/third_party/mpdf/classes/bmp.php @@ -0,0 +1,248 @@ +<?php + +class bmp { + +var $mpdf = null; + +function bmp(&$mpdf) { + $this->mpdf = $mpdf; +} + + +function _getBMPimage($data, $file) { + $info = array(); + // Adapted from script by Valentin Schmidt + // http://staff.dasdeck.de/valentin/fpdf/fpdf_bmp/ + $bfOffBits=$this->_fourbytes2int_le(substr($data,10,4)); + $width=$this->_fourbytes2int_le(substr($data,18,4)); + $height=$this->_fourbytes2int_le(substr($data,22,4)); + $flip = ($height<0); + if ($flip) $height =-$height; + $biBitCount=$this->_twobytes2int_le(substr($data,28,2)); + $biCompression=$this->_fourbytes2int_le(substr($data,30,4)); + $info = array('w'=>$width, 'h'=>$height); + if ($biBitCount<16){ + $info['cs'] = 'Indexed'; + $info['bpc'] = $biBitCount; + $palStr = substr($data,54,($bfOffBits-54)); + $pal = ''; + $cnt = strlen($palStr)/4; + for ($i=0;$i<$cnt;$i++){ + $n = 4*$i; + $pal .= $palStr[$n+2].$palStr[$n+1].$palStr[$n]; + } + $info['pal'] = $pal; + } + else{ + $info['cs'] = 'DeviceRGB'; + $info['bpc'] = 8; + } + + if ($this->mpdf->restrictColorSpace==1 || $this->mpdf->PDFX || $this->mpdf->restrictColorSpace==3) { + if (($this->mpdf->PDFA && !$this->mpdf->PDFAauto) || ($this->mpdf->PDFX && !$this->mpdf->PDFXauto)) { $this->mpdf->PDFAXwarnings[] = "Image cannot be converted to suitable colour space for PDFA or PDFX file - ".$file." - (Image replaced by 'no-image'.)"; } + return array('error' => "BMP Image cannot be converted to suitable colour space - ".$file." - (Image replaced by 'no-image'.)"); + } + + $biXPelsPerMeter=$this->_fourbytes2int_le(substr($data,38,4)); // horizontal pixels per meter, usually set to zero + //$biYPelsPerMeter=$this->_fourbytes2int_le(substr($data,42,4)); // vertical pixels per meter, usually set to zero + $biXPelsPerMeter=round($biXPelsPerMeter/1000 *25.4); + //$biYPelsPerMeter=round($biYPelsPerMeter/1000 *25.4); + $info['set-dpi'] = $biXPelsPerMeter; + + switch ($biCompression){ + case 0: + $str = substr($data,$bfOffBits); + break; + case 1: # BI_RLE8 + $str = $this->rle8_decode(substr($data,$bfOffBits), $width); + break; + case 2: # BI_RLE4 + $str = $this->rle4_decode(substr($data,$bfOffBits), $width); + break; + } + $bmpdata = ''; + $padCnt = (4-ceil(($width/(8/$biBitCount)))%4)%4; + switch ($biBitCount){ + case 1: + case 4: + case 8: + $w = floor($width/(8/$biBitCount)) + ($width%(8/$biBitCount)?1:0); + $w_row = $w + $padCnt; + if ($flip){ + for ($y=0;$y<$height;$y++){ + $y0 = $y*$w_row; + for ($x=0;$x<$w;$x++) + $bmpdata .= $str[$y0+$x]; + } + }else{ + for ($y=$height-1;$y>=0;$y--){ + $y0 = $y*$w_row; + for ($x=0;$x<$w;$x++) + $bmpdata .= $str[$y0+$x]; + } + } + break; + + case 16: + $w_row = $width*2 + $padCnt; + if ($flip){ + for ($y=0;$y<$height;$y++){ + $y0 = $y*$w_row; + for ($x=0;$x<$width;$x++){ + $n = (ord( $str[$y0 + 2*$x + 1])*256 + ord( $str[$y0 + 2*$x])); + $b = ($n & 31)<<3; $g = ($n & 992)>>2; $r = ($n & 31744)>>7128; + $bmpdata .= chr($r) . chr($g) . chr($b); + } + } + }else{ + for ($y=$height-1;$y>=0;$y--){ + $y0 = $y*$w_row; + for ($x=0;$x<$width;$x++){ + $n = (ord( $str[$y0 + 2*$x + 1])*256 + ord( $str[$y0 + 2*$x])); + $b = ($n & 31)<<3; $g = ($n & 992)>>2; $r = ($n & 31744)>>7; + $bmpdata .= chr($r) . chr($g) . chr($b); + } + } + } + break; + + case 24: + case 32: + $byteCnt = $biBitCount/8; + $w_row = $width*$byteCnt + $padCnt; + + if ($flip){ + for ($y=0;$y<$height;$y++){ + $y0 = $y*$w_row; + for ($x=0;$x<$width;$x++){ + $i = $y0 + $x*$byteCnt ; # + 1 + $bmpdata .= $str[$i+2].$str[$i+1].$str[$i]; + } + } + }else{ + for ($y=$height-1;$y>=0;$y--){ + $y0 = $y*$w_row; + for ($x=0;$x<$width;$x++){ + $i = $y0 + $x*$byteCnt ; # + 1 + $bmpdata .= $str[$i+2].$str[$i+1].$str[$i]; + } + } + } + break; + + default: + return array('error' => 'Error parsing BMP image - Unsupported image biBitCount'); + } + if ($this->mpdf->compress) { + $bmpdata=gzcompress($bmpdata); + $info['f']='FlateDecode'; + } + $info['data']=$bmpdata; + $info['type']='bmp'; + return $info; +} + +function _fourbytes2int_le($s) { + //Read a 4-byte integer from string + return (ord($s[3])<<24) + (ord($s[2])<<16) + (ord($s[1])<<8) + ord($s[0]); +} + +function _twobytes2int_le($s) { + //Read a 2-byte integer from string + return (ord(substr($s, 1, 1))<<8) + ord(substr($s, 0, 1)); +} + + +# Decoder for RLE8 compression in windows bitmaps +# see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_6x0u.asp +function rle8_decode ($str, $width){ + $lineWidth = $width + (3 - ($width-1) % 4); + $out = ''; + $cnt = strlen($str); + for ($i=0;$i<$cnt;$i++){ + $o = ord($str[$i]); + switch ($o){ + case 0: # ESCAPE + $i++; + switch (ord($str[$i])){ + case 0: # NEW LINE + $padCnt = $lineWidth - strlen($out)%$lineWidth; + if ($padCnt<$lineWidth) $out .= str_repeat(chr(0), $padCnt); # pad line + break; + case 1: # END OF FILE + $padCnt = $lineWidth - strlen($out)%$lineWidth; + if ($padCnt<$lineWidth) $out .= str_repeat(chr(0), $padCnt); # pad line + break 3; + case 2: # DELTA + $i += 2; + break; + default: # ABSOLUTE MODE + $num = ord($str[$i]); + for ($j=0;$j<$num;$j++) + $out .= $str[++$i]; + if ($num % 2) $i++; + } + break; + default: + $out .= str_repeat($str[++$i], $o); + } + } + return $out; +} + +# Decoder for RLE4 compression in windows bitmaps +# see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_6x0u.asp +function rle4_decode ($str, $width){ + $w = floor($width/2) + ($width % 2); + $lineWidth = $w + (3 - ( ($width-1) / 2) % 4); + $pixels = array(); + $cnt = strlen($str); + for ($i=0;$i<$cnt;$i++){ + $o = ord($str[$i]); + switch ($o){ + case 0: # ESCAPE + $i++; + switch (ord($str[$i])){ + case 0: # NEW LINE + while (count($pixels)%$lineWidth!=0) + $pixels[]=0; + break; + case 1: # END OF FILE + while (count($pixels)%$lineWidth!=0) + $pixels[]=0; + break 3; + case 2: # DELTA + $i += 2; + break; + default: # ABSOLUTE MODE + $num = ord($str[$i]); + for ($j=0;$j<$num;$j++){ + if ($j%2==0){ + $c = ord($str[++$i]); + $pixels[] = ($c & 240)>>4; + } else + $pixels[] = $c & 15; + } + if ($num % 2) $i++; + } + break; + default: + $c = ord($str[++$i]); + for ($j=0;$j<$o;$j++) + $pixels[] = ($j%2==0 ? ($c & 240)>>4 : $c & 15); + } + } + + $out = ''; + if (count($pixels)%2) $pixels[]=0; + $cnt = count($pixels)/2; + for ($i=0;$i<$cnt;$i++) + $out .= chr(16*$pixels[2*$i] + $pixels[2*$i+1]); + return $out; +} + + + +} + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/classes/cssmgr.php b/application/third_party/mpdf/classes/cssmgr.php new file mode 100644 index 0000000..c6eff8e --- /dev/null +++ b/application/third_party/mpdf/classes/cssmgr.php @@ -0,0 +1,1566 @@ +<?php + +class cssmgr { + +var $mpdf = null; + +var $tablecascadeCSS; +var $listcascadeCSS; +var $cascadeCSS; +var $CSS; +var $tbCSSlvl; +var $listCSSlvl; + + +function cssmgr(&$mpdf) { + $this->mpdf = $mpdf; + $this->tablecascadeCSS = array(); + $this->listcascadeCSS = array(); + $this->CSS=array(); + $this->cascadeCSS = array(); + $this->tbCSSlvl = 0; + $this->listCSSlvl = 0; +} + + +function ReadDefaultCSS($CSSstr) { + $CSS = array(); + $CSSstr = preg_replace('|/\*.*?\*/|s',' ',$CSSstr); + $CSSstr = preg_replace('/[\s\n\r\t\f]/s',' ',$CSSstr); + $CSSstr = preg_replace('/(<\!\-\-|\-\->)/s',' ',$CSSstr); + if ($CSSstr ) { + preg_match_all('/(.*?)\{(.*?)\}/',$CSSstr,$styles); + for($i=0; $i < count($styles[1]) ; $i++) { + $stylestr= trim($styles[2][$i]); + $stylearr = explode(';',$stylestr); + foreach($stylearr AS $sta) { + if (trim($sta)) { + // Changed to allow style="background: url('http://www.bpm1.com/bg.jpg')" + list($property,$value) = explode(':',$sta,2); + $property = trim($property); + $value = preg_replace('/\s*!important/i','',$value); + $value = trim($value); + if ($property && ($value || $value==='0')) { + $classproperties[strtoupper($property)] = $value; + } + } + } + $classproperties = $this->fixCSS($classproperties); + $tagstr = strtoupper(trim($styles[1][$i])); + $tagarr = explode(',',$tagstr); + foreach($tagarr AS $tg) { + $tags = preg_split('/\s+/',trim($tg)); + $level = count($tags); + if ($level == 1) { // e.g. p or .class or #id or p.class or p#id + $t = trim($tags[0]); + if ($t) { + $tag = ''; + if (preg_match('/^('.$this->mpdf->allowedCSStags.')$/',$t)) { $tag= $t; } + if ($this->CSS[$tag] && $tag) { $CSS[$tag] = $this->array_merge_recursive_unique($CSS[$tag], $classproperties); } + else if ($tag) { $CSS[$tag] = $classproperties; } + } + } + } + $properties = array(); + $values = array(); + $classproperties = array(); + } + + } // end of if + return $CSS; +} + + + +function ReadCSS($html) { + preg_match_all('/<style[^>]*media=["\']([^"\'>]*)["\'].*?<\/style>/is',$html,$m); + for($i=0; $i<count($m[0]); $i++) { + if ($this->mpdf->CSSselectMedia && !preg_match('/('.trim($this->mpdf->CSSselectMedia).'|all)/i',$m[1][$i])) { + $html = preg_replace('/'.preg_quote($m[0][$i],'/').'/','',$html); + } + } + preg_match_all('/<link[^>]*media=["\']([^"\'>]*)["\'].*?>/is',$html,$m); + for($i=0; $i<count($m[0]); $i++) { + if ($this->mpdf->CSSselectMedia && !preg_match('/('.trim($this->mpdf->CSSselectMedia).'|all)/i',$m[1][$i])) { + $html = preg_replace('/'.preg_quote($m[0][$i],'/').'/','',$html); + } + } + + // mPDF 5.5.02 + // Remove Comment tags <!-- ... --> inside CSS as <style> in HTML document + // Remove Comment tags /* ... */ inside CSS as <style> in HTML document + // But first, we replace upper and mixed case closing style tag with lower + // case so we can use str_replace later. + preg_replace('/<\/style>/i', '</style>', $html); + preg_match_all('/<style.*?>(.*?)<\/style>/si',$html,$m); + if (count($m[1])) { + for($i=0;$i<count($m[1]);$i++) { + // Remove comment tags + $sub = preg_replace('/(<\!\-\-|\-\->)/s',' ',$m[1][$i]); + $sub = '>'.preg_replace('|/\*.*?\*/|s',' ',$sub).'</style>'; + $html = str_replace('>'.$m[1][$i].'</style>', $sub, $html); + } + } + + + $html = preg_replace('/<!--mpdf/i','',$html); + $html = preg_replace('/mpdf-->/i','',$html); + $html = preg_replace('/<\!\-\-.*?\-\->/s',' ',$html); + + $match = 0; // no match for instance + $regexp = ''; // This helps debugging: showing what is the REAL string being processed + $CSSext = array(); + + //CSS inside external files + $regexp = '/<link[^>]*rel=["\']stylesheet["\'][^>]*href=["\']([^>"\']*)["\'].*?>/si'; + $x = preg_match_all($regexp,$html,$cxt); + if ($x) { + $match += $x; + $CSSext = $cxt[1]; + } + + $regexp = '/<link[^>]*href=["\']([^>"\']*)["\'][^>]*?rel=["\']stylesheet["\'].*?>/si'; + $x = preg_match_all($regexp,$html,$cxt); + if ($x) { + $match += $x; + $CSSext = array_merge($CSSext,$cxt[1]); + } + + // look for @import stylesheets + //$regexp = '/@import url\([\'\"]{0,1}([^\)]*?\.css)[\'\"]{0,1}\)/si'; + $regexp = '/@import url\([\'\"]{0,1}([^\)]*?\.css(\?\S+)?)[\'\"]{0,1}\)/si'; + $x = preg_match_all($regexp,$html,$cxt); + if ($x) { + $match += $x; + $CSSext = array_merge($CSSext,$cxt[1]); + } + + // look for @import without the url() + //$regexp = '/@import [\'\"]{0,1}([^;]*?\.css)[\'\"]{0,1}/si'; + $regexp = '/@import [\'\"]{0,1}([^;]*?\.css(\?\S+)?)[\'\"]{0,1}/si'; + $x = preg_match_all($regexp,$html,$cxt); + if ($x) { + $match += $x; + $CSSext = array_merge($CSSext,$cxt[1]); + } + + $ind = 0; + $CSSstr = ''; + + if (!is_array($this->cascadeCSS)) $this->cascadeCSS = array(); + + while($match){ + $path = $CSSext[$ind]; + $this->mpdf->GetFullPath($path); + $CSSextblock = $this->mpdf->_get_file($path); + if ($CSSextblock) { + // look for embedded @import stylesheets in other stylesheets + // and fix url paths (including background-images) relative to stylesheet + //$regexpem = '/@import url\([\'\"]{0,1}(.*?\.css)[\'\"]{0,1}\)/si'; + $regexpem = '/@import url\([\'\"]{0,1}(.*?\.css(\?\S+)?)[\'\"]{0,1}\)/si'; + $xem = preg_match_all($regexpem,$CSSextblock,$cxtem); + $cssBasePath = preg_replace('/\/[^\/]*$/','',$path) . '/'; + if ($xem) { + foreach($cxtem[1] AS $cxtembedded) { + // path is relative to original stlyesheet!! + $this->mpdf->GetFullPath($cxtembedded, $cssBasePath ); + $match++; + $CSSext[] = $cxtembedded; + } + } + $regexpem = '/(background[^;]*url\s*\(\s*[\'\"]{0,1})([^\)\'\"]*)([\'\"]{0,1}\s*\))/si'; + $xem = preg_match_all($regexpem,$CSSextblock,$cxtem); + if ($xem) { + for ($i=0;$i<count($cxtem[0]);$i++) { + // path is relative to original stlyesheet!! + $embedded = $cxtem[2][$i]; + if (!preg_match('/^data:image/i', $embedded)) { // mPDF 5.5.13 + $this->mpdf->GetFullPath($embedded, $cssBasePath ); + $CSSextblock = preg_replace('/'.preg_quote($cxtem[0][$i],'/').'/', ($cxtem[1][$i].$embedded.$cxtem[3][$i]), $CSSextblock); + } + } + } + $CSSstr .= ' '.$CSSextblock; + } + $match--; + $ind++; + } //end of match + + $match = 0; // reset value, if needed + // CSS as <style> in HTML document + $regexp = '/<style.*?>(.*?)<\/style>/si'; + $match = preg_match_all($regexp,$html,$CSSblock); + if ($match) { + $tmpCSSstr = implode(' ',$CSSblock[1]); + $regexpem = '/(background[^;]*url\s*\(\s*[\'\"]{0,1})([^\)\'\"]*)([\'\"]{0,1}\s*\))/si'; + $xem = preg_match_all($regexpem,$tmpCSSstr ,$cxtem); + if ($xem) { + for ($i=0;$i<count($cxtem[0]);$i++) { + $embedded = $cxtem[2][$i]; + if (!preg_match('/^data:image/i', $embedded)) { // mPDF 5.5.13 + $this->mpdf->GetFullPath($embedded); + $tmpCSSstr = preg_replace('/'.preg_quote($cxtem[0][$i],'/').'/', ($cxtem[1][$i].$embedded.$cxtem[3][$i]), $tmpCSSstr ); + } + } + } + $CSSstr .= ' '.$tmpCSSstr; + } + // Remove comments + $CSSstr = preg_replace('|/\*.*?\*/|s',' ',$CSSstr); + $CSSstr = preg_replace('/[\s\n\r\t\f]/s',' ',$CSSstr); + + if (preg_match('/@media/',$CSSstr)) { + preg_match_all('/@media(.*?)\{(([^\{\}]*\{[^\{\}]*\})+)\s*\}/is',$CSSstr,$m); + for($i=0; $i<count($m[0]); $i++) { + if ($this->mpdf->CSSselectMedia && !preg_match('/('.trim($this->mpdf->CSSselectMedia).'|all)/i',$m[1][$i])) { + $CSSstr = preg_replace('/'.preg_quote($m[0][$i],'/').'/','',$CSSstr); + } + else { + $CSSstr = preg_replace('/'.preg_quote($m[0][$i],'/').'/',' '.$m[2][$i].' ',$CSSstr); + } + } + } + + // mPDF 5.5.13 + // Replace any background: url(data:image... with temporary image file reference + preg_match_all("/(url\(data:image\/(jpeg|gif|png);base64,(.*)\))/si", $CSSstr, $idata); + if (count($idata[0])) { + for($i=0;$i<count($idata[0]);$i++) { + $file = _MPDF_TEMP_PATH.'_tempCSSidata'.RAND(1,10000).'_'.$i.'.'.$idata[2][$i]; + //Save to local file + file_put_contents($file, base64_decode($idata[3][$i])); + // $this->mpdf->GetFullPath($file); // ? is this needed - NO mPDF 5.6.03 + $CSSstr = str_replace($idata[0][$i], 'url("'.$file.'")', $CSSstr); // mPDF 5.5.17 + } + } + + $CSSstr = preg_replace('/(<\!\-\-|\-\->)/s',' ',$CSSstr); + if ($CSSstr ) { + preg_match_all('/(.*?)\{(.*?)\}/',$CSSstr,$styles); + for($i=0; $i < count($styles[1]) ; $i++) { + // SET array e.g. $classproperties['COLOR'] = '#ffffff'; + $stylestr= trim($styles[2][$i]); + $stylearr = explode(';',$stylestr); + foreach($stylearr AS $sta) { + if (trim($sta)) { + // Changed to allow style="background: url('http://www.bpm1.com/bg.jpg')" + list($property,$value) = explode(':',$sta,2); + $property = trim($property); + $value = preg_replace('/\s*!important/i','',$value); + $value = trim($value); + if ($property && ($value || $value==='0')) { + // Ignores -webkit-gradient so doesn't override -moz- + if ((strtoupper($property)=='BACKGROUND-IMAGE' || strtoupper($property)=='BACKGROUND') && preg_match('/-webkit-gradient/i',$value)) { + continue; + } + $classproperties[strtoupper($property)] = $value; + } + } + } + $classproperties = $this->fixCSS($classproperties); + $tagstr = strtoupper(trim($styles[1][$i])); + $tagarr = explode(',',$tagstr); + $pageselectors = false; // used to turn on $this->mpdf->mirrorMargins + foreach($tagarr AS $tg) { + $tags = preg_split('/\s+/',trim($tg)); + $level = count($tags); + $t = ''; + $t2 = ''; + $t3 = ''; + if (trim($tags[0])=='@PAGE') { + if (isset($tags[0])) { $t = trim($tags[0]); } + if (isset($tags[1])) { $t2 = trim($tags[1]); } + if (isset($tags[2])) { $t3 = trim($tags[2]); } + $tag = ''; + if ($level==1) { $tag = $t; } + else if ($level==2 && preg_match('/^[:](.*)$/',$t2,$m)) { + $tag = $t.'>>PSEUDO>>'.$m[1]; + if ($m[1]=='LEFT' || $m[1]=='RIGHT') { $pageselectors = true; } // used to turn on $this->mpdf->mirrorMargins + } + else if ($level==2) { $tag = $t.'>>NAMED>>'.$t2; } + else if ($level==3 && preg_match('/^[:](.*)$/',$t3,$m)) { + $tag = $t.'>>NAMED>>'.$t2.'>>PSEUDO>>'.$m[1]; + if ($m[1]=='LEFT' || $m[1]=='RIGHT') { $pageselectors = true; } // used to turn on $this->mpdf->mirrorMargins + } + if (isset($this->CSS[$tag]) && $tag) { $this->CSS[$tag] = $this->array_merge_recursive_unique($this->CSS[$tag], $classproperties); } + else if ($tag) { $this->CSS[$tag] = $classproperties; } + } + + else if ($level == 1) { // e.g. p or .class or #id or p.class or p#id + if (isset($tags[0])) { $t = trim($tags[0]); } + if ($t) { + $tag = ''; + if (preg_match('/^[.](.*)$/',$t,$m)) { $tag = 'CLASS>>'.$m[1]; } + else if (preg_match('/^[#](.*)$/',$t,$m)) { $tag = 'ID>>'.$m[1]; } + else if (preg_match('/^('.$this->mpdf->allowedCSStags.')[.](.*)$/',$t,$m)) { $tag = $m[1].'>>CLASS>>'.$m[2]; } + else if (preg_match('/^('.$this->mpdf->allowedCSStags.')\s*:NTH-CHILD\((.*)\)$/',$t,$m)) { $tag = $m[1].'>>SELECTORNTHCHILD>>'.$m[2]; } + else if (preg_match('/^('.$this->mpdf->allowedCSStags.')[#](.*)$/',$t,$m)) { $tag = $m[1].'>>ID>>'.$m[2]; } + else if (preg_match('/^('.$this->mpdf->allowedCSStags.')$/',$t)) { $tag= $t; } + if (isset($this->CSS[$tag]) && $tag) { $this->CSS[$tag] = $this->array_merge_recursive_unique($this->CSS[$tag], $classproperties); } + else if ($tag) { $this->CSS[$tag] = $classproperties; } + } + } + else { + $tmp = array(); + for($n=0;$n<$level;$n++) { + if (isset($tags[$n])) { $t = trim($tags[$n]); } + else { $t = ''; } + if ($t) { + $tag = ''; + if (preg_match('/^[.](.*)$/',$t,$m)) { $tag = 'CLASS>>'.$m[1]; } + else if (preg_match('/^[#](.*)$/',$t,$m)) { $tag = 'ID>>'.$m[1]; } + else if (preg_match('/^('.$this->mpdf->allowedCSStags.')[.](.*)$/',$t,$m)) { $tag = $m[1].'>>CLASS>>'.$m[2]; } + else if (preg_match('/^('.$this->mpdf->allowedCSStags.')\s*:NTH-CHILD\((.*)\)$/',$t,$m)) { $tag = $m[1].'>>SELECTORNTHCHILD>>'.$m[2]; } + else if (preg_match('/^('.$this->mpdf->allowedCSStags.')[#](.*)$/',$t,$m)) { $tag = $m[1].'>>ID>>'.$m[2]; } + else if (preg_match('/^('.$this->mpdf->allowedCSStags.')$/',$t)) { $tag= $t; } + + if ($tag) $tmp[] = $tag; + else { break; } + } + } + + if ($tag) { + $x = &$this->cascadeCSS; + foreach($tmp AS $tp) { $x = &$x[$tp]; } + $x = $this->array_merge_recursive_unique($x, $classproperties); + $x['depth'] = $level; + } + } + } + if ($pageselectors) { $this->mpdf->mirrorMargins = true; } + $properties = array(); + $values = array(); + $classproperties = array(); + } + } // end of if + //Remove CSS (tags and content), if any + $regexp = '/<style.*?>(.*?)<\/style>/si'; // it can be <style> or <style type="txt/css"> + $html = preg_replace($regexp,'',$html); +//print_r($this->CSS); exit; +//print_r($this->cascadeCSS); exit; + return $html; +} + + + +function readInlineCSS($html) { + //Fix incomplete CSS code + $size = strlen($html)-1; + if (substr($html,$size,1) != ';') $html .= ';'; + //Make CSS[Name-of-the-class] = array(key => value) + $regexp = '|\\s*?(\\S+?):(.+?);|i'; + preg_match_all( $regexp, $html, $styleinfo); + $properties = $styleinfo[1]; + $values = $styleinfo[2]; + //Array-properties and Array-values must have the SAME SIZE! + $classproperties = array(); + for($i = 0; $i < count($properties) ; $i++) { + // Ignores -webkit-gradient so doesn't override -moz- + if ((strtoupper($properties[$i])=='BACKGROUND-IMAGE' || strtoupper($properties[$i])=='BACKGROUND') && preg_match('/-webkit-gradient/i',$values[$i])) { + continue; + } + $classproperties[strtoupper($properties[$i])] = trim($values[$i]); + } + return $this->fixCSS($classproperties); +} + + + +function _fix_borderStr($bd) { + preg_match_all("/\((.*?)\)/", $bd, $m); + if (count($m[1])) { + for($i=0;$i<count($m[1]);$i++) { + $sub = preg_replace("/ /", "", $m[1][$i]); + $bd = preg_replace('/'.preg_quote($m[1][$i], '/').'/si', $sub, $bd); + } + } + + $prop = preg_split('/\s+/',trim($bd)); + $w = 'medium'; + $c = '#000000'; + $s = 'none'; + + if ( count($prop) == 1 ) { + // solid + if (in_array($prop[0],$this->mpdf->borderstyles) || $prop[0] == 'none' || $prop[0] == 'hidden' ) { $s = $prop[0]; } + // #000000 + else if (is_array($this->mpdf->ConvertColor($prop[0]))) { $c = $prop[0]; } + // 1px + else { $w = $prop[0]; } + } + else if (count($prop) == 2 ) { + // 1px solid + if (in_array($prop[1],$this->mpdf->borderstyles) || $prop[1] == 'none' || $prop[1] == 'hidden' ) { $w = $prop[0]; $s = $prop[1]; } + // solid #000000 + else if (in_array($prop[0],$this->mpdf->borderstyles) || $prop[0] == 'none' || $prop[0] == 'hidden' ) { $s = $prop[0]; $c = $prop[1]; } + // 1px #000000 + else { $w = $prop[0]; $c = $prop[1]; } + } + else if ( count($prop) == 3 ) { + // Change #000000 1px solid to 1px solid #000000 (proper) + if (substr($prop[0],0,1) == '#') { $c = $prop[0]; $w = $prop[1]; $s = $prop[2]; } + // Change solid #000000 1px to 1px solid #000000 (proper) + else if (substr($prop[0],1,1) == '#') { $s = $prop[0]; $c = $prop[1]; $w = $prop[2]; } + // Change solid 1px #000000 to 1px solid #000000 (proper) + else if (in_array($prop[0],$this->mpdf->borderstyles) || $prop[0] == 'none' || $prop[0] == 'hidden' ) { + $s = $prop[0]; $w = $prop[1]; $c = $prop[2]; + } + else { $w = $prop[0]; $s = $prop[1]; $c = $prop[2]; } + } + else { return ''; } + $s = strtolower($s); + return $w.' '.$s.' '.$c; +} + + + +function fixCSS($prop) { + if (!is_array($prop) || (count($prop)==0)) return array(); + $newprop = array(); + foreach($prop AS $k => $v) { + if ($k != 'BACKGROUND-IMAGE' && $k != 'BACKGROUND' && $k != 'ODD-HEADER-NAME' && $k != 'EVEN-HEADER-NAME' && $k != 'ODD-FOOTER-NAME' && $k != 'EVEN-FOOTER-NAME' && $k != 'HEADER' && $k != 'FOOTER') { + $v = strtolower($v); + } + + if ($k == 'FONT') { + $s = trim($v); + preg_match_all('/\"(.*?)\"/',$s,$ff); + if (count($ff[1])) { + foreach($ff[1] AS $ffp) { + $w = preg_split('/\s+/',$ffp); + $s = preg_replace('/\"'.$ffp.'\"/',$w[0],$s); + } + } + preg_match_all('/\'(.*?)\'/',$s,$ff); + if (count($ff[1])) { + foreach($ff[1] AS $ffp) { + $w = preg_split('/\s+/',$ffp); + $s = preg_replace('/\''.$ffp.'\'/',$w[0],$s); + } + } + $s = preg_replace('/\s*,\s*/',',',$s); + $bits = preg_split('/\s+/',$s); + if (count($bits)>1) { + $k = 'FONT-FAMILY'; $v = $bits[(count($bits)-1)]; + $fs = $bits[(count($bits)-2)]; + if (preg_match('/(.*?)\/(.*)/',$fs, $fsp)) { + $newprop['FONT-SIZE'] = $fsp[1]; + $newprop['LINE-HEIGHT'] = $fsp[2]; + } + else { $newprop['FONT-SIZE'] = $fs; } + if (preg_match('/(italic|oblique)/i',$s)) { $newprop['FONT-STYLE'] = 'italic'; } + else { $newprop['FONT-STYLE'] = 'normal'; } + if (preg_match('/bold/i',$s)) { $newprop['FONT-WEIGHT'] = 'bold'; } + else { $newprop['FONT-WEIGHT'] = 'normal'; } + if (preg_match('/small-caps/i',$s)) { $newprop['TEXT-TRANSFORM'] = 'uppercase'; } + } + } + if ($k == 'FONT-FAMILY') { + $aux_fontlist = explode(",",$v); + $found = 0; + foreach($aux_fontlist AS $f) { + $fonttype = trim($f); + $fonttype = preg_replace('/["\']*(.*?)["\']*/','\\1',$fonttype); + $fonttype = preg_replace('/ /','',$fonttype); + $v = strtolower(trim($fonttype)); + if (isset($this->mpdf->fonttrans[$v]) && $this->mpdf->fonttrans[$v]) { $v = $this->mpdf->fonttrans[$v]; } + if ((!$this->mpdf->onlyCoreFonts && in_array($v,$this->mpdf->available_unifonts)) || + in_array($v,array('ccourier','ctimes','chelvetica')) || + ($this->mpdf->onlyCoreFonts && in_array($v,array('courier','times','helvetica','arial'))) || + in_array($v, array('sjis','uhc','big5','gb'))) { + $newprop[$k] = $v; + $found = 1; + break; + } + } + if (!$found) { + foreach($aux_fontlist AS $f) { + $fonttype = trim($f); + $fonttype = preg_replace('/["\']*(.*?)["\']*/','\\1',$fonttype); + $fonttype = preg_replace('/ /','',$fonttype); + $v = strtolower(trim($fonttype)); + if (isset($this->mpdf->fonttrans[$v]) && $this->mpdf->fonttrans[$v]) { $v = $this->mpdf->fonttrans[$v]; } + if (in_array($v,$this->mpdf->sans_fonts) || in_array($v,$this->mpdf->serif_fonts) || in_array($v,$this->mpdf->mono_fonts) ) { + $newprop[$k] = $v; + break; + } + } + } + } + else if ($k == 'MARGIN') { + $tmp = $this->expand24($v); + $newprop['MARGIN-TOP'] = $tmp['T']; + $newprop['MARGIN-RIGHT'] = $tmp['R']; + $newprop['MARGIN-BOTTOM'] = $tmp['B']; + $newprop['MARGIN-LEFT'] = $tmp['L']; + } +/*-- BORDER-RADIUS --*/ + else if ($k == 'BORDER-RADIUS' || $k == 'BORDER-TOP-LEFT-RADIUS' || $k == 'BORDER-TOP-RIGHT-RADIUS' || $k == 'BORDER-BOTTOM-LEFT-RADIUS' || $k == 'BORDER-BOTTOM-RIGHT-RADIUS') { + $tmp = $this->border_radius_expand($v,$k); + if (isset($tmp['TL-H'])) $newprop['BORDER-TOP-LEFT-RADIUS-H'] = $tmp['TL-H']; + if (isset($tmp['TL-V'])) $newprop['BORDER-TOP-LEFT-RADIUS-V'] = $tmp['TL-V']; + if (isset($tmp['TR-H'])) $newprop['BORDER-TOP-RIGHT-RADIUS-H'] = $tmp['TR-H']; + if (isset($tmp['TR-V'])) $newprop['BORDER-TOP-RIGHT-RADIUS-V'] = $tmp['TR-V']; + if (isset($tmp['BL-H'])) $newprop['BORDER-BOTTOM-LEFT-RADIUS-H'] = $tmp['BL-H']; + if (isset($tmp['BL-V'])) $newprop['BORDER-BOTTOM-LEFT-RADIUS-V'] = $tmp['BL-V']; + if (isset($tmp['BR-H'])) $newprop['BORDER-BOTTOM-RIGHT-RADIUS-H'] = $tmp['BR-H']; + if (isset($tmp['BR-V'])) $newprop['BORDER-BOTTOM-RIGHT-RADIUS-V'] = $tmp['BR-V']; + } +/*-- END BORDER-RADIUS --*/ + else if ($k == 'PADDING') { + $tmp = $this->expand24($v); + $newprop['PADDING-TOP'] = $tmp['T']; + $newprop['PADDING-RIGHT'] = $tmp['R']; + $newprop['PADDING-BOTTOM'] = $tmp['B']; + $newprop['PADDING-LEFT'] = $tmp['L']; + } + else if ($k == 'BORDER') { + if ($v == '1') { $v = '1px solid #000000'; } + else { $v = $this->_fix_borderStr($v); } + $newprop['BORDER-TOP'] = $v; + $newprop['BORDER-RIGHT'] = $v; + $newprop['BORDER-BOTTOM'] = $v; + $newprop['BORDER-LEFT'] = $v; + } + else if ($k == 'BORDER-TOP') { + $newprop['BORDER-TOP'] = $this->_fix_borderStr($v); + } + else if ($k == 'BORDER-RIGHT') { + $newprop['BORDER-RIGHT'] = $this->_fix_borderStr($v); + } + else if ($k == 'BORDER-BOTTOM') { + $newprop['BORDER-BOTTOM'] = $this->_fix_borderStr($v); + } + else if ($k == 'BORDER-LEFT') { + $newprop['BORDER-LEFT'] = $this->_fix_borderStr($v); + } + else if ($k == 'BORDER-STYLE') { + $e = $this->expand24($v); + $newprop['BORDER-TOP-STYLE'] = $e['T']; + $newprop['BORDER-RIGHT-STYLE'] = $e['R']; + $newprop['BORDER-BOTTOM-STYLE'] = $e['B']; + $newprop['BORDER-LEFT-STYLE'] = $e['L']; + } + else if ($k == 'BORDER-WIDTH') { + $e = $this->expand24($v); + $newprop['BORDER-TOP-WIDTH'] = $e['T']; + $newprop['BORDER-RIGHT-WIDTH'] = $e['R']; + $newprop['BORDER-BOTTOM-WIDTH'] = $e['B']; + $newprop['BORDER-LEFT-WIDTH'] = $e['L']; + } + else if ($k == 'BORDER-COLOR') { + $e = $this->expand24($v); + $newprop['BORDER-TOP-COLOR'] = $e['T']; + $newprop['BORDER-RIGHT-COLOR'] = $e['R']; + $newprop['BORDER-BOTTOM-COLOR'] = $e['B']; + $newprop['BORDER-LEFT-COLOR'] = $e['L']; + } + + else if ($k == 'BORDER-SPACING') { + $prop = preg_split('/\s+/',trim($v)); + if (count($prop) == 1 ) { + $newprop['BORDER-SPACING-H'] = $prop[0]; + $newprop['BORDER-SPACING-V'] = $prop[0]; + } + else if (count($prop) == 2 ) { + $newprop['BORDER-SPACING-H'] = $prop[0]; + $newprop['BORDER-SPACING-V'] = $prop[1]; + } + } + else if ($k == 'TEXT-OUTLINE') { // mPDF 5.6.07 + $prop = preg_split('/\s+/',trim($v)); + if (trim(strtolower($v)) == 'none' ) { + $newprop['TEXT-OUTLINE'] = 'none'; + } + else if (count($prop) == 2 ) { + $newprop['TEXT-OUTLINE-WIDTH'] = $prop[0]; + $newprop['TEXT-OUTLINE-COLOR'] = $prop[1]; + } + else if (count($prop) == 3 ) { + $newprop['TEXT-OUTLINE-WIDTH'] = $prop[0]; + $newprop['TEXT-OUTLINE-COLOR'] = $prop[2]; + } + } + else if ($k == 'SIZE') { + $prop = preg_split('/\s+/',trim($v)); + if (preg_match('/(auto|portrait|landscape)/',$prop[0])) { + $newprop['SIZE'] = strtoupper($prop[0]); + } + else if (count($prop) == 1 ) { + $newprop['SIZE']['W'] = $this->mpdf->ConvertSize($prop[0]); + $newprop['SIZE']['H'] = $this->mpdf->ConvertSize($prop[0]); + } + else if (count($prop) == 2 ) { + $newprop['SIZE']['W'] = $this->mpdf->ConvertSize($prop[0]); + $newprop['SIZE']['H'] = $this->mpdf->ConvertSize($prop[1]); + } + } + else if ($k == 'SHEET-SIZE') { + $prop = preg_split('/\s+/',trim($v)); + if (count($prop) == 2 ) { + $newprop['SHEET-SIZE'] = array($this->mpdf->ConvertSize($prop[0]), $this->mpdf->ConvertSize($prop[1])); + } + else { + if(preg_match('/([0-9a-zA-Z]*)-L/i',$v,$m)) { // e.g. A4-L = A$ landscape + $ft = $this->mpdf->_getPageFormat($m[1]); + $format = array($ft[1],$ft[0]); + } + else { $format = $this->mpdf->_getPageFormat($v); } + if ($format) { $newprop['SHEET-SIZE'] = array($format[0]/_MPDFK, $format[1]/_MPDFK); } + } + } + else if ($k == 'BACKGROUND') { + $bg = $this->parseCSSbackground($v); + if ($bg['c']) { $newprop['BACKGROUND-COLOR'] = $bg['c']; } + else { $newprop['BACKGROUND-COLOR'] = 'transparent'; } +/*-- BACKGROUNDS --*/ + if ($bg['i']) { + $newprop['BACKGROUND-IMAGE'] = $bg['i']; + if ($bg['r']) { $newprop['BACKGROUND-REPEAT'] = $bg['r']; } + if ($bg['p']) { $newprop['BACKGROUND-POSITION'] = $bg['p']; } + } + else { $newprop['BACKGROUND-IMAGE'] = ''; } +/*-- END BACKGROUNDS --*/ + } +/*-- BACKGROUNDS --*/ + else if ($k == 'BACKGROUND-IMAGE') { + if (preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient\(.*\)/i',$v,$m)) { + $newprop['BACKGROUND-IMAGE'] = $m[0]; + continue; + } + if (preg_match('/url\([\'\"]{0,1}(.*?)[\'\"]{0,1}\)/i',$v,$m)) { + $newprop['BACKGROUND-IMAGE'] = $m[1]; + } + + else if (strtolower($v)=='none') { $newprop['BACKGROUND-IMAGE'] = ''; } + + } + else if ($k == 'BACKGROUND-REPEAT') { + if (preg_match('/(repeat-x|repeat-y|no-repeat|repeat)/i',$v,$m)) { + $newprop['BACKGROUND-REPEAT'] = strtolower($m[1]); + } + } + else if ($k == 'BACKGROUND-POSITION') { + $s = $v; + $bits = preg_split('/\s+/',trim($s)); + // These should be Position x1 or x2 + if (count($bits)==1) { + if (preg_match('/bottom/',$bits[0])) { $bg['p'] = '50% 100%'; } + else if (preg_match('/top/',$bits[0])) { $bg['p'] = '50% 0%'; } + else { $bg['p'] = $bits[0] . ' 50%'; } + } + else if (count($bits)==2) { + // Can be either right center or center right + if (preg_match('/(top|bottom)/',$bits[0]) || preg_match('/(left|right)/',$bits[1])) { + $bg['p'] = $bits[1] . ' '.$bits[0]; + } + else { + $bg['p'] = $bits[0] . ' '.$bits[1]; + } + } + if ($bg['p']) { + $bg['p'] = preg_replace('/(left|top)/','0%',$bg['p']); + $bg['p'] = preg_replace('/(right|bottom)/','100%',$bg['p']); + $bg['p'] = preg_replace('/(center)/','50%',$bg['p']); + if (!preg_match('/[\-]{0,1}\d+(in|cm|mm|pt|pc|em|ex|px|%)* [\-]{0,1}\d+(in|cm|mm|pt|pc|em|ex|px|%)*/',$bg['p'])) { + $bg['p'] = false; + } + } + if ($bg['p']) { $newprop['BACKGROUND-POSITION'] = $bg['p']; } + } +/*-- END BACKGROUNDS --*/ + else if ($k == 'IMAGE-ORIENTATION') { + if (preg_match('/([\-]*[0-9\.]+)(deg|grad|rad)/i',$v,$m)) { + $angle = $m[1] + 0; + if (strtolower($m[2])=='deg') { $angle = $angle; } + else if (strtolower($m[2])=='grad') { $angle *= (360/400); } + else if (strtolower($m[2])=='rad') { $angle = rad2deg($angle); } + while($angle < 0) { $angle += 360; } + $angle = ($angle % 360); + $angle /= 90; + $angle = round($angle) * 90; + $newprop['IMAGE-ORIENTATION'] = $angle; + } + } + // mPDF 5.6.13 + else if ($k == 'TEXT-ALIGN') { + if (preg_match('/["\'](.){1}["\']/i',$v,$m)) { + $d = array_search($m[1],$this->mpdf->decimal_align); + if ($d !== false) { $newprop['TEXT-ALIGN'] = $d; } + if (preg_match('/(center|left|right)/i',$v,$m)) { $newprop['TEXT-ALIGN'] .= strtoupper(substr($m[1],0,1)); } + else { $newprop['TEXT-ALIGN'] .= 'R'; } // default = R + } + else if (preg_match('/["\'](\\\[a-fA-F0-9]{1,6})["\']/i',$v,$m)) { + $utf8 = codeHex2utf(substr($m[1],1,6)); + $d = array_search($utf8,$this->mpdf->decimal_align); + if ($d !== false) { $newprop['TEXT-ALIGN'] = $d; } + if (preg_match('/(center|left|right)/i',$v,$m)) { $newprop['TEXT-ALIGN'] .= strtoupper(substr($m[1],0,1)); } + else { $newprop['TEXT-ALIGN'] .= 'R'; } // default = R + } + else { $newprop[$k] = $v; } + } + + else { + $newprop[$k] = $v; + } + } + + return $newprop; +} + +function setCSSboxshadow($v) { + $sh = array(); + $c = preg_match_all('/(rgba|rgb|device-cmyka|cmyka|device-cmyk|cmyk|hsla|hsl)\(.*?\)/',$v,$x); // mPDF 5.6.05 + for($i=0; $i<$c; $i++) { + $col = preg_replace('/,/','*',$x[0][$i]); + $v = preg_replace('/'.preg_quote($x[0][$i],'/').'/',$col,$v); + } + $ss = explode(',',$v); + foreach ($ss AS $s) { + $new = array('inset'=>false, 'blur'=>0, 'spread'=>0); + if (preg_match('/inset/i',$s)) { $new['inset'] = true; $s = preg_replace('/\s*inset\s*/','',$s); } + $p = explode(' ',trim($s)); + if (isset($p[0])) { $new['x'] = $this->mpdf->ConvertSize(trim($p[0]),$this->mpdf->blk[$this->mpdf->blklvl-1]['inner_width'],$this->mpdf->FontSize,false); } + if (isset($p[1])) { $new['y'] = $this->mpdf->ConvertSize(trim($p[1]),$this->mpdf->blk[$this->mpdf->blklvl-1]['inner_width'],$this->mpdf->FontSize,false); } + if (isset($p[2])) { + if (preg_match('/^\s*[\.\-0-9]/',$p[2])) { + $new['blur'] = $this->mpdf->ConvertSize(trim($p[2]),$this->mpdf->blk[$this->mpdf->blklvl-1]['inner_width'],$this->mpdf->FontSize,false); + } + else { $new['col'] = $this->mpdf->ConvertColor(preg_replace('/\*/',',',$p[2])); } + if (isset($p[3])) { + if (preg_match('/^\s*[\.\-0-9]/',$p[3])) { + $new['spread'] = $this->mpdf->ConvertSize(trim($p[3]),$this->mpdf->blk[$this->mpdf->blklvl-1]['inner_width'],$this->mpdf->FontSize,false); + } + else { $new['col'] = $this->mpdf->ConvertColor(preg_replace('/\*/',',',$p[3])); } + if (isset($p[4])) { + $new['col'] = $this->mpdf->ConvertColor(preg_replace('/\*/',',',$p[4])); + } + } + } + if (!$new['col']) { $new['col'] = $this->mpdf->ConvertColor('#888888'); } + if (isset($new['y'])) { array_unshift($sh, $new); } + } + return $sh; +} + +function setCSStextshadow($v) { + $sh = array(); + $c = preg_match_all('/(rgba|rgb|device-cmyka|cmyka|device-cmyk|cmyk|hsla|hsl)\(.*?\)/',$v,$x); // mPDF 5.6.05 + for($i=0; $i<$c; $i++) { + $col = preg_replace('/,/','*',$x[0][$i]); + $v = preg_replace('/'.preg_quote($x[0][$i],'/').'/',$col,$v); + } + $ss = explode(',',$v); + foreach ($ss AS $s) { + $new = array('blur'=>0); + $p = explode(' ',trim($s)); + if (isset($p[0])) { $new['x'] = $this->mpdf->ConvertSize(trim($p[0]),$this->mpdf->blk[$this->mpdf->blklvl-1]['inner_width'],$this->mpdf->FontSize,false); } + if (isset($p[1])) { $new['y'] = $this->mpdf->ConvertSize(trim($p[1]),$this->mpdf->blk[$this->mpdf->blklvl-1]['inner_width'],$this->mpdf->FontSize,false); } + if (isset($p[2])) { + if (preg_match('/^\s*[\.\-0-9]/',$p[2])) { + $new['blur'] = $this->mpdf->ConvertSize(trim($p[2]),$this->mpdf->blk[$this->mpdf->blklvl-1]['inner_width'],$this->mpdf->FontSize,false); + } + else { $new['col'] = $this->mpdf->ConvertColor(preg_replace('/\*/',',',$p[2])); } + if (isset($p[3])) { + $new['col'] = $this->mpdf->ConvertColor(preg_replace('/\*/',',',$p[3])); + } + } + if (!$new['col']) { $new['col'] = $this->mpdf->ConvertColor('#888888'); } + if (isset($new['y'])) { array_unshift($sh, $new); } + } + return $sh; +} + +function parseCSSbackground($s) { + $bg = array('c'=>false, 'i'=>false, 'r'=>false, 'p'=>false, ); +/*-- BACKGROUNDS --*/ + if (preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient\(.*\)/i',$s,$m)) { + $bg['i'] = $m[0]; + } + else +/*-- END BACKGROUNDS --*/ + if (preg_match('/url\(/i',$s)) { + // If color, set and strip it off + // mPDF 5.6.05 + if (preg_match('/^\s*(#[0-9a-fA-F]{3,6}|(rgba|rgb|device-cmyka|cmyka|device-cmyk|cmyk|hsla|hsl|spot)\(.*?\)|[a-zA-Z]{3,})\s+(url\(.*)/i',$s,$m)) { + $bg['c'] = strtolower($m[1]); + $s = $m[3]; + } +/*-- BACKGROUNDS --*/ + if (preg_match('/url\([\'\"]{0,1}(.*?)[\'\"]{0,1}\)\s*(.*)/i',$s,$m)) { + $bg['i'] = $m[1]; + $s = strtolower($m[2]); + if (preg_match('/(repeat-x|repeat-y|no-repeat|repeat)/',$s,$m)) { + $bg['r'] = $m[1]; + } + // Remove repeat, attachment (discarded) and also any inherit + $s = preg_replace('/(repeat-x|repeat-y|no-repeat|repeat|scroll|fixed|inherit)/','',$s); + $bits = preg_split('/\s+/',trim($s)); + // These should be Position x1 or x2 + if (count($bits)==1) { + if (preg_match('/bottom/',$bits[0])) { $bg['p'] = '50% 100%'; } + else if (preg_match('/top/',$bits[0])) { $bg['p'] = '50% 0%'; } + else { $bg['p'] = $bits[0] . ' 50%'; } + } + else if (count($bits)==2) { + // Can be either right center or center right + if (preg_match('/(top|bottom)/',$bits[0]) || preg_match('/(left|right)/',$bits[1])) { + $bg['p'] = $bits[1] . ' '.$bits[0]; + } + else { + $bg['p'] = $bits[0] . ' '.$bits[1]; + } + } + if ($bg['p']) { + $bg['p'] = preg_replace('/(left|top)/','0%',$bg['p']); + $bg['p'] = preg_replace('/(right|bottom)/','100%',$bg['p']); + $bg['p'] = preg_replace('/(center)/','50%',$bg['p']); + if (!preg_match('/[\-]{0,1}\d+(in|cm|mm|pt|pc|em|ex|px|%)* [\-]{0,1}\d+(in|cm|mm|pt|pc|em|ex|px|%)*/',$bg['p'])) { + $bg['p'] = false; + } + } + } +/*-- END BACKGROUNDS --*/ + } + else if (preg_match('/^\s*(#[0-9a-fA-F]{3,6}|(rgba|rgb|device-cmyka|cmyka|device-cmyk|cmyk|hsla|hsl|spot)\(.*?\)|[a-zA-Z]{3,})/i',$s,$m)) { $bg['c'] = strtolower($m[1]); } // mPDF 5.6.05 + return ($bg); +} + + +function expand24($mp) { + $prop = preg_split('/\s+/',trim($mp)); + if (count($prop) == 1 ) { + return array('T' => $prop[0], 'R' => $prop[0], 'B' => $prop[0], 'L'=> $prop[0]); + } + if (count($prop) == 2 ) { + return array('T' => $prop[0], 'R' => $prop[1], 'B' => $prop[0], 'L'=> $prop[1]); + } + + if (count($prop) == 3 ) { + return array('T' => $prop[0], 'R' => $prop[1], 'B' => $prop[2], 'L'=> $prop[1]); + } + if (count($prop) == 4 ) { + return array('T' => $prop[0], 'R' => $prop[1], 'B' => $prop[2], 'L'=> $prop[3]); + } + return array(); +} + +/*-- BORDER-RADIUS --*/ +function border_radius_expand($val,$k) { + $b = array(); + if ($k == 'BORDER-RADIUS') { + $hv = explode('/',trim($val)); + $prop = preg_split('/\s+/',trim($hv[0])); + if (count($prop)==1) { + $b['TL-H'] = $b['TR-H'] = $b['BR-H'] = $b['BL-H'] = $prop[0]; + } + else if (count($prop)==2) { + $b['TL-H'] = $b['BR-H'] = $prop[0]; + $b['TR-H'] = $b['BL-H'] = $prop[1]; + } + else if (count($prop)==3) { + $b['TL-H'] = $prop[0]; + $b['TR-H'] = $b['BL-H'] = $prop[1]; + $b['BR-H'] = $prop[2]; + } + else if (count($prop)==4) { + $b['TL-H'] = $prop[0]; + $b['TR-H'] = $prop[1]; + $b['BR-H'] = $prop[2]; + $b['BL-H'] = $prop[3]; + } + if (count($hv)==2) { + $prop = preg_split('/\s+/',trim($hv[1])); + if (count($prop)==1) { + $b['TL-V'] = $b['TR-V'] = $b['BR-V'] = $b['BL-V'] = $prop[0]; + } + else if (count($prop)==2) { + $b['TL-V'] = $b['BR-V'] = $prop[0]; + $b['TR-V'] = $b['BL-V'] = $prop[1]; + } + else if (count($prop)==3) { + $b['TL-V'] = $prop[0]; + $b['TR-V'] = $b['BL-V'] = $prop[1]; + $b['BR-V'] = $prop[2]; + } + else if (count($prop)==4) { + $b['TL-V'] = $prop[0]; + $b['TR-V'] = $prop[1]; + $b['BR-V'] = $prop[2]; + $b['BL-V'] = $prop[3]; + } + } + else { + $b['TL-V'] = $b['TL-H']; + $b['TR-V'] = $b['TR-H']; + $b['BL-V'] = $b['BL-H']; + $b['BR-V'] = $b['BR-H']; + } + return $b; + } + + // Parse 2 + $h = 0; + $v = 0; + $prop = preg_split('/\s+/',trim($val)); + if (count($prop)==1) { $h = $v = $val; } + else { $h = $prop[0]; $v = $prop[1]; } + if ($h==0 || $v==0) { $h = $v = 0; } + if ($k == 'BORDER-TOP-LEFT-RADIUS') { + $b['TL-H'] = $h; + $b['TL-V'] = $v; + } + else if ($k == 'BORDER-TOP-RIGHT-RADIUS') { + $b['TR-H'] = $h; + $b['TR-V'] = $v; + } + else if ($k == 'BORDER-BOTTOM-LEFT-RADIUS') { + $b['BL-H'] = $h; + $b['BL-V'] = $v; + } + else if ($k == 'BORDER-BOTTOM-RIGHT-RADIUS') { + $b['BR-H'] = $h; + $b['BR-V'] = $v; + } + return $b; + +} +/*-- END BORDER-RADIUS --*/ + +function _mergeCSS($p, &$t) { + // Save Cascading CSS e.g. "div.topic p" at this block level + if (isset($p) && $p) { + if ($t) { + $t = $this->array_merge_recursive_unique($t, $p); + } + else { $t = $p; } + } +} + +// for CSS handling +function array_merge_recursive_unique($array1, $array2) { + $arrays = func_get_args(); + $narrays = count($arrays); + $ret = $arrays[0]; + for ($i = 1; $i < $narrays; $i ++) { + foreach ($arrays[$i] as $key => $value) { + if (((string) $key) === ((string) intval($key))) { // integer or string as integer key - append + $ret[] = $value; + } + else { // string key - merge + if (is_array($value) && isset($ret[$key])) { + $ret[$key] = $this->array_merge_recursive_unique($ret[$key], $value); + } + else { + $ret[$key] = $value; + } + } + } + } + return $ret; +} + + + +function _mergeFullCSS($p, &$t, $tag, $classes, $id) { + $this->_mergeCSS($p[$tag], $t); + // STYLESHEET CLASS e.g. .smallone{} .redletter{} + foreach($classes AS $class) { + $this->_mergeCSS($p['CLASS>>'.$class], $t); + } + // STYLESHEET nth-child SELECTOR e.g. tr:nth-child(odd) td:nth-child(2n+1) + if ($tag=='TR' && isset($p) && $p) { + foreach($p AS $k=>$val) { + if (preg_match('/'.$tag.'>>SELECTORNTHCHILD>>(.*)/',$k, $m)) { + $select = false; + if ($tag=='TR') { + $row = $this->mpdf->row; + $thnr = (isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_thead']) ? count($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_thead']) : 0); + $tfnr = (isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot']) ? count($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot']) : 0); + if ($this->mpdf->tabletfoot) { $row -= $thnr; } + else if (!$this->mpdf->tablethead) { $row -= ($thnr + $tfnr); } + if ($m[1]=='ODD' && ($row % 2) == 0) { $select = true; } + else if ($m[1]=='EVEN' && ($row % 2) == 1) { $select = true; } + else if (preg_match('/(\d+)N\+(\d+)/',$m[1],$a)) { + if ((($row + 1) % $a[1]) == $a[2]) { $select = true; } + } + } + else if ($tag=='TD' || $tag=='TH') { + if ($m[1]=='ODD' && ($this->mpdf->col % 2) == 0) { $select = true; } + else if ($m[1]=='EVEN' && ($this->mpdf->col % 2) == 1) { $select = true; } + else if (preg_match('/(\d+)N\+(\d+)/',$m[1],$a)) { + if ((($this->mpdf->col + 1) % $a[1]) == $a[2]) { $select = true; } + } + } + if ($select) { + $this->_mergeCSS($p[$tag.'>>SELECTORNTHCHILD>>'.$m[1]], $t); + } + } + } + } + // STYLESHEET CLASS e.g. #smallone{} #redletter{} + if (isset($id) && $id) { + $this->_mergeCSS($p['ID>>'.$id], $t); + } + // STYLESHEET CLASS e.g. .smallone{} .redletter{} + foreach($classes AS $class) { + $this->_mergeCSS($p[$tag.'>>CLASS>>'.$class], $t); + } + // STYLESHEET CLASS e.g. #smallone{} #redletter{} + if (isset($id)) { + $this->_mergeCSS($p[$tag.'>>ID>>'.$id], $t); + } +} + +function setBorderDominance($prop, $val) { + if (isset($prop['BORDER-LEFT']) && $prop['BORDER-LEFT']) { $this->cell_border_dominance_L = $val; } + if (isset($prop['BORDER-RIGHT']) && $prop['BORDER-RIGHT']) { $this->cell_border_dominance_R = $val; } + if (isset($prop['BORDER-TOP']) && $prop['BORDER-TOP']) { $this->cell_border_dominance_T = $val; } + if (isset($prop['BORDER-BOTTOM']) && $prop['BORDER-BOTTOM']) { $this->cell_border_dominance_B = $val; } +} + +function _set_mergedCSS(&$m, &$p, $d=true, $bd=false) { + if (isset($m)) { + if ((isset($m['depth']) && $m['depth']>1) || $d==false) { // include check for 'depth' + if ($bd) { $this->setBorderDominance($m, $bd); } // *TABLES* + if (is_array($m)) { + $p = array_merge($p,$m); + $this->_mergeBorders($p,$m); + } + } + } +} + + +function _mergeBorders(&$b, &$a) { // Merges $a['BORDER-TOP-STYLE'] to $b['BORDER-TOP'] etc. + foreach(array('TOP','RIGHT','BOTTOM','LEFT') AS $side) { + foreach(array('STYLE','WIDTH','COLOR') AS $el) { + if (isset($a['BORDER-'.$side.'-'.$el])) { // e.g. $b['BORDER-TOP-STYLE'] + $s = trim($a['BORDER-'.$side.'-'.$el]); + if (isset($b['BORDER-'.$side])) { // e.g. $b['BORDER-TOP'] + $p = trim($b['BORDER-'.$side]); + } + else { $p = ''; } + if ($el=='STYLE') { + if ($p) { $b['BORDER-'.$side] = preg_replace('/(\S+)\s+(\S+)\s+(\S+)/', '\\1 '.$s.' \\3', $p); } + else { $b['BORDER-'.$side] = '0px '.$s.' #000000'; } + } + else if ($el=='WIDTH') { + if ($p) { $b['BORDER-'.$side] = preg_replace('/(\S+)\s+(\S+)\s+(\S+)/', $s.' \\2 \\3', $p); } + else { $b['BORDER-'.$side] = $s.' none #000000'; } + } + else if ($el=='COLOR') { + if ($p) { $b['BORDER-'.$side] = preg_replace('/(\S+)\s+(\S+)\s+(\S+)/', '\\1 \\2 '.$s, $p); } + else { $b['BORDER-'.$side] = '0px none '.$s; } + } + } + } + } +} + + +function MergeCSS($inherit,$tag,$attr) { + $p = array(); + $zp = array(); + + $classes = array(); + if (isset($attr['CLASS'])) { + $classes = preg_split('/\s+/',$attr['CLASS']); + } + if (!isset($attr['ID'])) { $attr['ID']=''; } + //=============================================== +/*-- TABLES --*/ + // Set Inherited properties + if ($inherit == 'TOPTABLE') { // $tag = TABLE + //=============================================== + // Save Cascading CSS e.g. "div.topic p" at this block level + + if (isset($this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS'])) { + $this->tablecascadeCSS[0] = $this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS']; + } + else { + $this->tablecascadeCSS[0] = $this->cascadeCSS; + } + } + //=============================================== + // Set Inherited properties + if ($inherit == 'TOPTABLE' || $inherit == 'TABLE') { + //Cascade everything from last level that is not an actual property, or defined by current tag/attributes + if (isset($this->tablecascadeCSS[$this->tbCSSlvl-1]) && is_array($this->tablecascadeCSS[$this->tbCSSlvl-1])) { + foreach($this->tablecascadeCSS[$this->tbCSSlvl-1] AS $k=>$v) { + $this->tablecascadeCSS[$this->tbCSSlvl][$k] = $v; + } + } + $this->_mergeFullCSS($this->cascadeCSS, $this->tablecascadeCSS[$this->tbCSSlvl], $tag, $classes, $attr['ID']); + //=============================================== + // Cascading forward CSS e.g. "table.topic td" for this table in $this->tablecascadeCSS + //=============================================== + // STYLESHEET TAG e.g. table + $this->_mergeFullCSS($this->tablecascadeCSS[$this->tbCSSlvl-1], $this->tablecascadeCSS[$this->tbCSSlvl], $tag, $classes, $attr['ID']); + //=============================================== + } +/*-- END TABLES --*/ + //=============================================== +/*-- LISTS --*/ + // Set Inherited properties + if ($inherit == 'TOPLIST') { // $tag = UL,OL + //=============================================== + // Save Cascading CSS e.g. "div.topic p" at this block level + if (isset($this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS'])) { + $this->listcascadeCSS[0] = $this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS']; + } + else { + $this->listcascadeCSS[0] = $this->cascadeCSS; + } + } + //=============================================== + // Set Inherited properties + if ($inherit == 'TOPLIST' || $inherit == 'LIST') { + //Cascade everything from last level that is not an actual property, or defined by current tag/attributes + if (isset($this->listcascadeCSS[$this->listCSSlvl-1]) && is_array($this->listcascadeCSS[$this->listCSSlvl-1])) { + foreach($this->listcascadeCSS[$this->listCSSlvl-1] AS $k=>$v) { + $this->listcascadeCSS[$this->listCSSlvl][$k] = $v; + } + } + $this->_mergeFullCSS($this->cascadeCSS, $this->listcascadeCSS[$this->listCSSlvl], $tag, $classes, $attr['ID']); + //=============================================== + // Cascading forward CSS e.g. "table.topic td" for this list in $this->listcascadeCSS + //=============================================== + // STYLESHEET TAG e.g. table + $this->_mergeFullCSS($this->listcascadeCSS[$this->listCSSlvl-1], $this->listcascadeCSS[$this->listCSSlvl], $tag, $classes, $attr['ID']); + //=============================================== + } +/*-- END LISTS --*/ + //=============================================== + // Set Inherited properties + if ($inherit == 'BLOCK') { + if (isset($this->mpdf->blk[$this->mpdf->blklvl-1]['cascadeCSS']) && is_array($this->mpdf->blk[$this->mpdf->blklvl-1]['cascadeCSS'])) { + foreach($this->mpdf->blk[$this->mpdf->blklvl-1]['cascadeCSS'] AS $k=>$v) { + $this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS'][$k] = $v; + + } + } + + //=============================================== + // Save Cascading CSS e.g. "div.topic p" at this block level + $this->_mergeFullCSS($this->cascadeCSS, $this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS'], $tag, $classes, $attr['ID']); + //=============================================== + // Cascading forward CSS + //=============================================== + $this->_mergeFullCSS($this->mpdf->blk[$this->mpdf->blklvl-1]['cascadeCSS'], $this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS'], $tag, $classes, $attr['ID']); + //=============================================== + // Block properties + if (isset($this->mpdf->blk[$this->mpdf->blklvl-1]['margin_collapse']) && $this->mpdf->blk[$this->mpdf->blklvl-1]['margin_collapse']) { $p['MARGIN-COLLAPSE'] = 'COLLAPSE'; } // custom tag, but follows CSS principle that border-collapse is inherited + if (isset($this->mpdf->blk[$this->mpdf->blklvl-1]['line_height']) && $this->mpdf->blk[$this->mpdf->blklvl-1]['line_height']) { $p['LINE-HEIGHT'] = $this->mpdf->blk[$this->mpdf->blklvl-1]['line_height']; } + + if (isset($this->mpdf->blk[$this->mpdf->blklvl-1]['direction']) && $this->mpdf->blk[$this->mpdf->blklvl-1]['direction']) { $p['DIRECTION'] = $this->mpdf->blk[$this->mpdf->blklvl-1]['direction']; } + + if (isset($this->mpdf->blk[$this->mpdf->blklvl-1]['align']) && $this->mpdf->blk[$this->mpdf->blklvl-1]['align']) { + if ($this->mpdf->blk[$this->mpdf->blklvl-1]['align'] == 'L') { $p['TEXT-ALIGN'] = 'left'; } + else if ($this->mpdf->blk[$this->mpdf->blklvl-1]['align'] == 'J') { $p['TEXT-ALIGN'] = 'justify'; } + else if ($this->mpdf->blk[$this->mpdf->blklvl-1]['align'] == 'R') { $p['TEXT-ALIGN'] = 'right'; } + else if ($this->mpdf->blk[$this->mpdf->blklvl-1]['align'] == 'C') { $p['TEXT-ALIGN'] = 'center'; } + } + if ($this->mpdf->ColActive || $this->mpdf->keep_block_together) { + if (isset($this->mpdf->blk[$this->mpdf->blklvl-1]['bgcolor']) && $this->mpdf->blk[$this->mpdf->blklvl-1]['bgcolor']) { // Doesn't officially inherit, but default value is transparent (?=inherited) + $cor = $this->mpdf->blk[$this->mpdf->blklvl-1]['bgcolorarray' ]; + $p['BACKGROUND-COLOR'] = $this->mpdf->_colAtoString($cor); + } + } + + if (isset($this->mpdf->blk[$this->mpdf->blklvl-1]['text_indent']) && ($this->mpdf->blk[$this->mpdf->blklvl-1]['text_indent'] || $this->mpdf->blk[$this->mpdf->blklvl-1]['text_indent']===0)) { $p['TEXT-INDENT'] = $this->mpdf->blk[$this->mpdf->blklvl-1]['text_indent']; } + if (isset($this->mpdf->blk[$this->mpdf->blklvl-1]['InlineProperties'])) { + $biilp = $this->mpdf->blk[$this->mpdf->blklvl-1]['InlineProperties']; + } + else { $biilp = null; } + if (isset($biilp[ 'family' ]) && $biilp[ 'family' ]) { $p['FONT-FAMILY'] = $biilp[ 'family' ]; } + if (isset($biilp[ 'I' ]) && $biilp[ 'I' ]) { $p['FONT-STYLE'] = 'italic'; } + if (isset($biilp[ 'sizePt' ]) && $biilp[ 'sizePt' ]) { $p['FONT-SIZE'] = $biilp[ 'sizePt' ] . 'pt'; } + if (isset($biilp[ 'B' ]) && $biilp[ 'B' ]) { $p['FONT-WEIGHT'] = 'bold'; } + if (isset($biilp[ 'colorarray' ]) && $biilp[ 'colorarray' ]) { + $cor = $biilp[ 'colorarray' ]; + $p['COLOR'] = $this->mpdf->_colAtoString($cor); + } + if (isset($biilp[ 'fontkerning' ])) { + if ($biilp[ 'fontkerning' ]) { $p['FONT-KERNING'] = 'normal'; } + else { $p['FONT-KERNING'] = 'none'; } + } + if (isset($biilp[ 'lSpacingCSS' ]) && $biilp[ 'lSpacingCSS' ]) { $p['LETTER-SPACING'] = $biilp[ 'lSpacingCSS' ]; } + if (isset($biilp[ 'wSpacingCSS' ]) && $biilp[ 'wSpacingCSS' ]) { $p['WORD-SPACING'] = $biilp[ 'wSpacingCSS' ]; } + if (isset($biilp[ 'toupper' ]) && $biilp[ 'toupper' ]) { $p['TEXT-TRANSFORM'] = 'uppercase'; } + else if (isset($biilp[ 'tolower' ]) && $biilp[ 'tolower' ]) { $p['TEXT-TRANSFORM'] = 'lowercase'; } + else if (isset($biilp[ 'capitalize' ]) && $biilp[ 'capitalize' ]) { $p['TEXT-TRANSFORM'] = 'capitalize'; } + // CSS says text-decoration is not inherited, but IE7 does?? + if (isset($biilp[ 'underline' ]) && $biilp[ 'underline' ]) { $p['TEXT-DECORATION'] = 'underline'; } + if (isset($biilp[ 'smCaps' ]) && $biilp[ 'smCaps' ]) { $p['FONT-VARIANT'] = 'small-caps'; } + + } + //=============================================== + //=============================================== +/*-- LISTS --*/ + // Set Inherited properties + if ($inherit == 'TOPLIST') { + if ($this->listCSSlvl == 1) { + $bilp = $this->mpdf->blk[$this->mpdf->blklvl]['InlineProperties']; + if (isset($bilp[ 'family' ]) && $bilp[ 'family' ]) { $p['FONT-FAMILY'] = $bilp[ 'family' ]; } + if (isset($bilp[ 'I' ]) && $bilp[ 'I' ]) { $p['FONT-STYLE'] = 'italic'; } + if (isset($bilp[ 'sizePt' ]) && $bilp[ 'sizePt' ]) { $p['FONT-SIZE'] = $bilp[ 'sizePt' ] . 'pt'; } + if (isset($bilp[ 'B' ]) && $bilp[ 'B' ]) { $p['FONT-WEIGHT'] = 'bold'; } + if (isset($bilp[ 'colorarray' ]) && $bilp[ 'colorarray' ]) { + $cor = $bilp[ 'colorarray' ]; + $p['COLOR'] = $this->mpdf->_colAtoString($cor); + } + if (isset($bilp[ 'toupper' ]) && $bilp[ 'toupper' ]) { $p['TEXT-TRANSFORM'] = 'uppercase'; } + else if (isset($bilp[ 'tolower' ]) && $bilp[ 'tolower' ]) { $p['TEXT-TRANSFORM'] = 'lowercase'; } + else if (isset($bilp[ 'capitalize' ]) && $bilp[ 'capitalize' ]) { $p['TEXT-TRANSFORM'] = 'capitalize'; } + if (isset($bilp[ 'fontkerning' ])) { + if ($bilp[ 'fontkerning' ]) { $p['FONT-KERNING'] = 'normal'; } + else { $p['FONT-KERNING'] = 'none'; } + } + if (isset($bilp[ 'lSpacingCSS' ]) && $bilp[ 'lSpacingCSS' ]) { $p['LETTER-SPACING'] = $bilp[ 'lSpacingCSS' ]; } + if (isset($bilp[ 'wSpacingCSS' ]) && $bilp[ 'wSpacingCSS' ]) { $p['WORD-SPACING'] = $bilp[ 'wSpacingCSS' ]; } + // CSS says text-decoration is not inherited, but IE7 does?? + if (isset($bilp[ 'underline' ]) && $bilp[ 'underline' ]) { $p['TEXT-DECORATION'] = 'underline'; } + if (isset($bilp[ 'smCaps' ]) && $bilp[ 'smCaps' ]) { $p['FONT-VARIANT'] = 'small-caps'; } + if ($tag=='LI') { + // Note to self - this should never work, as TOPLIST is not called when LI (see code removed in v5.3) + $this->mpdf->Error("If you see this message, please report this as a bug to the mPDF Forum."); + } + } + } +/*-- END LISTS --*/ + //=============================================== + //=============================================== + // DEFAULT for this TAG set in DefaultCSS + if (isset($this->mpdf->defaultCSS[$tag])) { + $zp = $this->fixCSS($this->mpdf->defaultCSS[$tag]); + if (is_array($zp)) { // Default overwrites Inherited + $p = array_merge($p,$zp); // !! Note other way round !! + $this->_mergeBorders($p,$zp); + } + } + //=============================================== +/*-- TABLES --*/ + // cellPadding overwrites TD/TH default but not specific CSS set on cell + if (($tag=='TD' || $tag=='TH') && isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cell_padding']) && ($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cell_padding'] || $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cell_padding']===0)) { + $p['PADDING-LEFT'] = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cell_padding']; + $p['PADDING-RIGHT'] = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cell_padding']; + $p['PADDING-TOP'] = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cell_padding']; + $p['PADDING-BOTTOM'] = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cell_padding']; + } +/*-- END TABLES --*/ + //=============================================== + // STYLESHEET TAG e.g. h1 p div table + if (isset($this->CSS[$tag]) && $this->CSS[$tag]) { + $zp = $this->CSS[$tag]; + if ($tag=='TD' || $tag=='TH') { $this->setBorderDominance($zp, 9); } // *TABLES* // *TABLES-ADVANCED-BORDERS* + if (is_array($zp)) { + $p = array_merge($p,$zp); + $this->_mergeBorders($p,$zp); + } + } + //=============================================== + // STYLESHEET CLASS e.g. .smallone{} .redletter{} + foreach($classes AS $class) { + $zp = array(); + if (isset($this->CSS['CLASS>>'.$class]) && $this->CSS['CLASS>>'.$class]) { $zp = $this->CSS['CLASS>>'.$class]; } + if ($tag=='TD' || $tag=='TH') { $this->setBorderDominance($zp, 9); } // *TABLES* // *TABLES-ADVANCED-BORDERS* + if (is_array($zp)) { + $p = array_merge($p,$zp); + $this->_mergeBorders($p,$zp); + } + } + //=============================================== +/*-- TABLES --*/ + // STYLESHEET nth-child SELECTOR e.g. tr:nth-child(odd) td:nth-child(2n+1) + if ($tag=='TR' || $tag=='TD' || $tag=='TH') { + foreach($this->CSS AS $k=>$val) { + if (preg_match('/'.$tag.'>>SELECTORNTHCHILD>>(.*)/',$k, $m)) { + $select = false; + if ($tag=='TR') { + $row = $this->mpdf->row; + $thnr = (isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_thead']) ? count($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_thead']) : 0); + $tfnr = (isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot']) ? count($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot']) : 0); + if ($this->mpdf->tabletfoot) { $row -= $thnr; } + else if (!$this->mpdf->tablethead) { $row -= ($thnr + $tfnr); } + if ($m[1]=='ODD' && ($row % 2) == 0) { $select = true; } + else if ($m[1]=='EVEN' && ($row % 2) == 1) { $select = true; } + else if (preg_match('/(\d+)N\+(\d+)/',$m[1],$a)) { + if ((($row + 1) % $a[1]) == $a[2]) { $select = true; } + } + } + else if ($tag=='TD' || $tag=='TH') { + if ($m[1]=='ODD' && ($this->mpdf->col % 2) == 0) { $select = true; } + else if ($m[1]=='EVEN' && ($this->mpdf->col % 2) == 1) { $select = true; } + else if (preg_match('/(\d+)N\+(\d+)/',$m[1],$a)) { + if ((($this->mpdf->col+1) % $a[1]) == $a[2]) { $select = true; } + } + } + if ($select) { + $zp = $this->CSS[$tag.'>>SELECTORNTHCHILD>>'.$m[1]]; + if ($tag=='TD' || $tag=='TH') { $this->setBorderDominance($zp, 9); } + if (is_array($zp)) { + $p = array_merge($p,$zp); + $this->_mergeBorders($p,$zp); + } + } + } + } + } +/*-- END TABLES --*/ + //=============================================== + // STYLESHEET ID e.g. #smallone{} #redletter{} + if (isset($attr['ID']) && isset($this->CSS['ID>>'.$attr['ID']]) && $this->CSS['ID>>'.$attr['ID']]) { + $zp = $this->CSS['ID>>'.$attr['ID']]; + if ($tag=='TD' || $tag=='TH') { $this->setBorderDominance($zp, 9); } // *TABLES* // *TABLES-ADVANCED-BORDERS* + if (is_array($zp)) { + $p = array_merge($p,$zp); + $this->_mergeBorders($p,$zp); + } + } + //=============================================== + // STYLESHEET CLASS e.g. p.smallone{} div.redletter{} + foreach($classes AS $class) { + $zp = array(); + if (isset($this->CSS[$tag.'>>CLASS>>'.$class]) && $this->CSS[$tag.'>>CLASS>>'.$class]) { $zp = $this->CSS[$tag.'>>CLASS>>'.$class]; } + if ($tag=='TD' || $tag=='TH') { $this->setBorderDominance($zp, 9); } // *TABLES* // *TABLES-ADVANCED-BORDERS* + if (is_array($zp)) { + $p = array_merge($p,$zp); + $this->_mergeBorders($p,$zp); + } + } + //=============================================== + // STYLESHEET CLASS e.g. p#smallone{} div#redletter{} + if (isset($attr['ID']) && isset($this->CSS[$tag.'>>ID>>'.$attr['ID']]) && $this->CSS[$tag.'>>ID>>'.$attr['ID']]) { + $zp = $this->CSS[$tag.'>>ID>>'.$attr['ID']]; + if ($tag=='TD' || $tag=='TH') { $this->setBorderDominance($zp, 9); } // *TABLES* // *TABLES-ADVANCED-BORDERS* + if (is_array($zp)) { + $p = array_merge($p,$zp); + $this->_mergeBorders($p,$zp); + } + } + //=============================================== + // Cascaded e.g. div.class p only works for block level + if ($inherit == 'BLOCK') { + $this->_set_mergedCSS($this->mpdf->blk[$this->mpdf->blklvl-1]['cascadeCSS'][$tag], $p); + foreach($classes AS $class) { + $this->_set_mergedCSS($this->mpdf->blk[$this->mpdf->blklvl-1]['cascadeCSS']['CLASS>>'.$class], $p); + } + $this->_set_mergedCSS($this->mpdf->blk[$this->mpdf->blklvl-1]['cascadeCSS']['ID>>'.$attr['ID']], $p); + foreach($classes AS $class) { + $this->_set_mergedCSS($this->mpdf->blk[$this->mpdf->blklvl-1]['cascadeCSS'][$tag.'>>CLASS>>'.$class], $p); + } + $this->_set_mergedCSS($this->mpdf->blk[$this->mpdf->blklvl-1]['cascadeCSS'][$tag.'>>ID>>'.$attr['ID']], $p); + } + else if ($inherit == 'INLINE') { + $this->_set_mergedCSS($this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS'][$tag], $p); + foreach($classes AS $class) { + $this->_set_mergedCSS($this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS']['CLASS>>'.$class], $p); + } + $this->_set_mergedCSS($this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS']['ID>>'.$attr['ID']], $p); + foreach($classes AS $class) { + $this->_set_mergedCSS($this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS'][$tag.'>>CLASS>>'.$class], $p); + } + $this->_set_mergedCSS($this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS'][$tag.'>>ID>>'.$attr['ID']], $p); + } +/*-- TABLES --*/ + else if ($inherit == 'TOPTABLE' || $inherit == 'TABLE') { // NB looks at $this->tablecascadeCSS-1 for cascading CSS + // false, 9 = don't check for 'depth' and do set border dominance + $this->_set_mergedCSS($this->tablecascadeCSS[$this->tbCSSlvl-1][$tag], $p, false, 9); + foreach($classes AS $class) { + $this->_set_mergedCSS($this->tablecascadeCSS[$this->tbCSSlvl-1]['CLASS>>'.$class], $p, false, 9); + } + // STYLESHEET nth-child SELECTOR e.g. tr:nth-child(odd) td:nth-child(2n+1) + if ($tag=='TR' || $tag=='TD' || $tag=='TH') { + foreach($this->tablecascadeCSS[$this->tbCSSlvl-1] AS $k=>$val) { + if (preg_match('/'.$tag.'>>SELECTORNTHCHILD>>(.*)/',$k, $m)) { + $select = false; + if ($tag=='TR') { + $row = $this->mpdf->row; + $thnr = (isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_thead']) ? count($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_thead']) : 0); + $tfnr = (isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot']) ? count($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot']) : 0); + if ($this->mpdf->tabletfoot) { $row -= $thnr; } + else if (!$this->mpdf->tablethead) { $row -= ($thnr + $tfnr); } + if ($m[1]=='ODD' && ($row % 2) == 0) { $select = true; } + else if ($m[1]=='EVEN' && ($row % 2) == 1) { $select = true; } + else if (preg_match('/(\d+)N\+(\d+)/',$m[1],$a)) { + if ((($row + 1) % $a[1]) == $a[2]) { $select = true; } + } + } + else if ($tag=='TD' || $tag=='TH') { + if ($m[1]=='ODD' && ($this->mpdf->col % 2) == 0) { $select = true; } + else if ($m[1]=='EVEN' && ($this->mpdf->col % 2) == 1) { $select = true; } + else if (preg_match('/(\d+)N\+(\d+)/',$m[1],$a)) { + if ((($this->mpdf->col + 1) % $a[1]) == $a[2]) { $select = true; } + } + } + if ($select) { + $this->_set_mergedCSS($this->tablecascadeCSS[$this->tbCSSlvl-1][$tag.'>>SELECTORNTHCHILD>>'.$m[1]], $p, false, 9); + } + } + } + } + $this->_set_mergedCSS($this->tablecascadeCSS[$this->tbCSSlvl-1]['ID>>'.$attr['ID']], $p, false, 9); + foreach($classes AS $class) { + $this->_set_mergedCSS($this->tablecascadeCSS[$this->tbCSSlvl-1][$tag.'>>CLASS>>'.$class], $p, false, 9); + } + $this->_set_mergedCSS($this->tablecascadeCSS[$this->tbCSSlvl-1][$tag.'>>ID>>'.$attr['ID']], $p, false, 9); + } +/*-- END TABLES --*/ + //=============================================== +/*-- LISTS --*/ + else if ($inherit == 'TOPLIST' || $inherit == 'LIST') { // NB looks at $this->listcascadeCSS-1 for cascading CSS + // false = don't check for 'depth' + $this->_set_mergedCSS($this->listcascadeCSS[$this->listCSSlvl-1][$tag], $p, false); + foreach($classes AS $class) { + $this->_set_mergedCSS($this->listcascadeCSS[$this->listCSSlvl-1]['CLASS>>'.$class], $p, false); + } + $this->_set_mergedCSS($this->listcascadeCSS[$this->listCSSlvl-1]['ID>>'.$attr['ID']], $p, false); + foreach($classes AS $class) { + $this->_set_mergedCSS($this->listcascadeCSS[$this->listCSSlvl-1][$tag.'>>CLASS>>'.$class], $p, false); + } + $this->_set_mergedCSS($this->listcascadeCSS[$this->listCSSlvl-1][$tag.'>>ID>>'.$attr['ID']], $p, false); + } +/*-- END LISTS --*/ + //=============================================== + //=============================================== + // INLINE STYLE e.g. style="CSS:property" + if (isset($attr['STYLE'])) { + $zp = $this->readInlineCSS($attr['STYLE']); + if ($tag=='TD' || $tag=='TH') { $this->setBorderDominance($zp, 9); } // *TABLES* // *TABLES-ADVANCED-BORDERS* + if (is_array($zp)) { + $p = array_merge($p,$zp); + $this->_mergeBorders($p,$zp); + } + } + //=============================================== + //=============================================== + // INLINE ATTRIBUTES e.g. .. ALIGN="CENTER"> + if (isset($attr['LANG']) and $attr['LANG']!='') { + $p['LANG'] = $attr['LANG']; + } + if (isset($attr['COLOR']) and $attr['COLOR']!='') { + $p['COLOR'] = $attr['COLOR']; + } + if ($tag != 'INPUT') { + if (isset($attr['WIDTH']) and $attr['WIDTH']!='') { + $p['WIDTH'] = $attr['WIDTH']; + } + if (isset($attr['HEIGHT']) and $attr['HEIGHT']!='') { + $p['HEIGHT'] = $attr['HEIGHT']; + } + } + if ($tag == 'FONT') { + if (isset($attr['FACE'])) { + $p['FONT-FAMILY'] = $attr['FACE']; + } + if (isset($attr['SIZE']) and $attr['SIZE']!='') { + $s = ''; + if ($attr['SIZE'] === '+1') { $s = '120%'; } + else if ($attr['SIZE'] === '-1') { $s = '86%'; } + else if ($attr['SIZE'] === '1') { $s = 'XX-SMALL'; } + else if ($attr['SIZE'] == '2') { $s = 'X-SMALL'; } + else if ($attr['SIZE'] == '3') { $s = 'SMALL'; } + else if ($attr['SIZE'] == '4') { $s = 'MEDIUM'; } + else if ($attr['SIZE'] == '5') { $s = 'LARGE'; } + else if ($attr['SIZE'] == '6') { $s = 'X-LARGE'; } + else if ($attr['SIZE'] == '7') { $s = 'XX-LARGE'; } + if ($s) $p['FONT-SIZE'] = $s; + } + } + if (isset($attr['VALIGN']) and $attr['VALIGN']!='') { + $p['VERTICAL-ALIGN'] = $attr['VALIGN']; + } + if (isset($attr['VSPACE']) and $attr['VSPACE']!='') { + $p['MARGIN-TOP'] = $attr['VSPACE']; + $p['MARGIN-BOTTOM'] = $attr['VSPACE']; + } + if (isset($attr['HSPACE']) and $attr['HSPACE']!='') { + $p['MARGIN-LEFT'] = $attr['HSPACE']; + $p['MARGIN-RIGHT'] = $attr['HSPACE']; + } + //=============================================== + return $p; +} + +function PreviewBlockCSS($tag,$attr) { + // Looks ahead from current block level to a new level + $p = array(); + $zp = array(); + $oldcascadeCSS = $this->mpdf->blk[$this->mpdf->blklvl]['cascadeCSS']; + $classes = array(); + if (isset($attr['CLASS'])) { $classes = preg_split('/\s+/',$attr['CLASS']); } + //=============================================== + // DEFAULT for this TAG set in DefaultCSS + if (isset($this->mpdf->defaultCSS[$tag])) { + $zp = $this->fixCSS($this->mpdf->defaultCSS[$tag]); + if (is_array($zp)) { $p = array_merge($zp,$p); } // Inherited overwrites default + } + // STYLESHEET TAG e.g. h1 p div table + if (isset($this->CSS[$tag])) { + $zp = $this->CSS[$tag]; + if (is_array($zp)) { $p = array_merge($p,$zp); } + } + // STYLESHEET CLASS e.g. .smallone{} .redletter{} + foreach($classes AS $class) { + $zp = array(); + if (isset($this->CSS['CLASS>>'.$class])) { $zp = $this->CSS['CLASS>>'.$class]; } + if (is_array($zp)) { $p = array_merge($p,$zp); } + } + // STYLESHEET ID e.g. #smallone{} #redletter{} + if (isset($attr['ID']) && isset($this->CSS['ID>>'.$attr['ID']])) { + $zp = $this->CSS['ID>>'.$attr['ID']]; + if (is_array($zp)) { $p = array_merge($p,$zp); } + } + // STYLESHEET CLASS e.g. p.smallone{} div.redletter{} + foreach($classes AS $class) { + $zp = array(); + if (isset($this->CSS[$tag.'>>CLASS>>'.$class])) { $zp = $this->CSS[$tag.'>>CLASS>>'.$class]; } + if (is_array($zp)) { $p = array_merge($p,$zp); } + } + // STYLESHEET CLASS e.g. p#smallone{} div#redletter{} + if (isset($attr['ID']) && isset($this->CSS[$tag.'>>ID>>'.$attr['ID']])) { + $zp = $this->CSS[$tag.'>>ID>>'.$attr['ID']]; + if (is_array($zp)) { $p = array_merge($p,$zp); } + } + //=============================================== + // STYLESHEET TAG e.g. div h1 div p + + $this->_set_mergedCSS($oldcascadeCSS[$tag], $p); + // STYLESHEET CLASS e.g. .smallone{} .redletter{} + foreach($classes AS $class) { + + $this->_set_mergedCSS($oldcascadeCSS['CLASS>>'.$class], $p); + } + // STYLESHEET CLASS e.g. #smallone{} #redletter{} + if (isset($attr['ID'])) { + + $this->_set_mergedCSS($oldcascadeCSS['ID>>'.$attr['ID']], $p); + } + // STYLESHEET CLASS e.g. div.smallone{} p.redletter{} + foreach($classes AS $class) { + + $this->_set_mergedCSS($oldcascadeCSS[$tag.'>>CLASS>>'.$class], $p); + } + // STYLESHEET CLASS e.g. div#smallone{} p#redletter{} + if (isset($attr['ID'])) { + + $this->_set_mergedCSS($oldcascadeCSS[$tag.'>>ID>>'.$attr['ID']], $p); + } + //=============================================== + // INLINE STYLE e.g. style="CSS:property" + if (isset($attr['STYLE'])) { + $zp = $this->readInlineCSS($attr['STYLE']); + if (is_array($zp)) { $p = array_merge($p,$zp); } + } + //=============================================== + return $p; +} + + + + + +} // end of class + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/classes/directw.php b/application/third_party/mpdf/classes/directw.php new file mode 100644 index 0000000..04c9dfc --- /dev/null +++ b/application/third_party/mpdf/classes/directw.php @@ -0,0 +1,408 @@ +<?php + +class directw { + +var $mpdf = null; + +function directw(&$mpdf) { + $this->mpdf = $mpdf; +} + + +function Write($h,$txt,$currentx=0,$link='',$directionality='ltr',$align='') { + if (!$align) { + if ($directionality=='rtl') { $align = 'R'; } + else { $align = 'L'; } + } + if ($h == 0) { $this->mpdf->SetLineHeight(); $h = $this->mpdf->lineheight; } + //Output text in flowing mode + $w = $this->mpdf->w - $this->mpdf->rMargin - $this->mpdf->x; + + $wmax = ($w - ($this->mpdf->cMarginL+$this->mpdf->cMarginR)); + $s=str_replace("\r",'',$txt); + if ($this->mpdf->usingCoreFont) { $nb=strlen($s); } + else { + $nb=mb_strlen($s, $this->mpdf->mb_enc ); + // handle single space character + if(($nb==1) && $s == " ") { + $this->mpdf->x += $this->mpdf->GetStringWidth($s); + return; + } + } + $sep=-1; + $i=0; + $j=0; + $l=0; + $nl=1; + if (!$this->mpdf->usingCoreFont) { + if (preg_match("/([".$this->mpdf->pregRTLchars."])/u", $txt)) { $this->mpdf->biDirectional = true; } // *RTL* + $checkCursive=false; + if ($this->mpdf->biDirectional) { $checkCursive=true; } // *RTL* + else if (isset($this->mpdf->CurrentFont['indic']) && $this->mpdf->CurrentFont['indic']) { $checkCursive=true; } // *INDIC* + while($i<$nb) { + //Get next character + $c = mb_substr($s,$i,1,$this->mpdf->mb_enc ); + if($c == "\n") { + // WORD SPACING + $this->mpdf->ResetSpacing(); + //Explicit line break + $tmp = rtrim(mb_substr($s,$j,$i-$j,$this->mpdf->mb_enc)); + if ($directionality == 'rtl' && $align == 'J') { $align = 'R'; } // *RTL* + $this->mpdf->magic_reverse_dir($tmp, true, $directionality); // *RTL* + $this->mpdf->Cell($w, $h, $tmp, 0, 2, $align, $fill, $link); + $i++; + $sep = -1; + $j = $i; + $l = 0; + if($nl == 1) { + if ($currentx != 0) $this->mpdf->x=$currentx; + else $this->mpdf->x=$this->mpdf->lMargin; + $w = $this->mpdf->w - $this->mpdf->rMargin - $this->mpdf->x; + $wmax = ($w - ($this->mpdf->cMarginL+$this->mpdf->cMarginR)); + } + $nl++; + continue; + } + if($c == " ") { $sep= $i; } + $l += $this->mpdf->GetCharWidthNonCore($c); // mPDF 5.3.04 + if($l > $wmax) { + //Automatic line break (word wrapping) + if($sep == -1) { + // WORD SPACING + $this->mpdf->ResetSpacing(); + if($this->mpdf->x > $this->mpdf->lMargin) { + //Move to next line + if ($currentx != 0) $this->mpdf->x=$currentx; + else $this->mpdf->x=$this->mpdf->lMargin; + $this->mpdf->y+=$h; + $w=$this->mpdf->w-$this->mpdf->rMargin-$this->mpdf->x; + $wmax = ($w - ($this->mpdf->cMarginL+$this->mpdf->cMarginR)); + $i++; + $nl++; + continue; + } + if($i==$j) { $i++; } + $tmp = rtrim(mb_substr($s,$j,$i-$j,$this->mpdf->mb_enc)); + if ($directionality == 'rtl' && $align == 'J') { $align = 'R'; } // *RTL* + $this->mpdf->magic_reverse_dir($tmp, true, $directionality); // *RTL* + $this->mpdf->Cell($w, $h, $tmp, 0, 2, $align, $fill, $link); + } + else { + $tmp = rtrim(mb_substr($s,$j,$sep-$j,$this->mpdf->mb_enc)); + if ($directionality == 'rtl' && $align == 'J') { $align = 'R'; } // *RTL* + $this->mpdf->magic_reverse_dir($tmp, true, $directionality); // *RTL* + + if($align=='J') { + ////////////////////////////////////////// + // JUSTIFY J using Unicode fonts (Word spacing doesn't work) + // WORD SPACING + // Change NON_BREAKING SPACE to spaces so they are 'spaced' properly + $tmp = str_replace(chr(194).chr(160),chr(32),$tmp ); + $len_ligne = $this->mpdf->GetStringWidth($tmp ); + $nb_carac = mb_strlen( $tmp , $this->mpdf->mb_enc ) ; + $nb_spaces = mb_substr_count( $tmp ,' ', $this->mpdf->mb_enc ) ; + $inclCursive=false; + if ($checkCursive) { + if (preg_match("/([".$this->mpdf->pregRTLchars."])/u", $tmp)) { $inclCursive = true; } // *RTL* + if (preg_match("/([".$this->mpdf->pregHIchars.$this->mpdf->pregBNchars.$this->mpdf->pregPAchars."])/u", $tmp)) { $inclCursive = true; } // *INDIC* + } + list($charspacing,$ws) = $this->mpdf->GetJspacing($nb_carac,$nb_spaces,((($w-2) - $len_ligne) * _MPDFK),$inclCursive); + $this->mpdf->SetSpacing($charspacing,$ws); + ////////////////////////////////////////// + } + $this->mpdf->Cell($w, $h, $tmp, 0, 2, $align, $fill, $link); + $i=$sep+1; + } + $sep = -1; + $j = $i; + $l = 0; + if($nl==1) { + if ($currentx != 0) $this->mpdf->x=$currentx; + else $this->mpdf->x=$this->mpdf->lMargin; + $w=$this->mpdf->w-$this->mpdf->rMargin-$this->mpdf->x; + $wmax = ($w - ($this->mpdf->cMarginL+$this->mpdf->cMarginR)); + } + $nl++; + } + else { $i++; } + } + //Last chunk + // WORD SPACING + $this->mpdf->ResetSpacing(); + } + else { + while($i<$nb) { + //Get next character + $c=$s[$i]; + if($c == "\n") { + //Explicit line break + // WORD SPACING + $this->mpdf->ResetSpacing(); + $this->mpdf->Cell($w, $h, substr($s, $j, $i-$j), 0, 2, $align, $fill, $link); + $i++; + $sep = -1; + $j = $i; + $l = 0; + if($nl == 1) { + if ($currentx != 0) $this->mpdf->x=$currentx; + else $this->mpdf->x=$this->mpdf->lMargin; + $w = $this->mpdf->w - $this->mpdf->rMargin - $this->mpdf->x; + $wmax=$w-($this->mpdf->cMarginL+$this->mpdf->cMarginR); + } + $nl++; + continue; + } + if($c == " ") { $sep= $i; } + $l += $this->mpdf->GetCharWidthCore($c); // mPDF 5.3.04 + if($l > $wmax) { + //Automatic line break (word wrapping) + if($sep == -1) { + // WORD SPACING + $this->mpdf->ResetSpacing(); + if($this->mpdf->x > $this->mpdf->lMargin) { + //Move to next line + if ($currentx != 0) $this->mpdf->x=$currentx; + else $this->mpdf->x=$this->mpdf->lMargin; + $this->mpdf->y+=$h; + $w=$this->mpdf->w-$this->mpdf->rMargin-$this->mpdf->x; + $wmax=$w-($this->mpdf->cMarginL+$this->mpdf->cMarginR); + $i++; + $nl++; + continue; + } + if($i==$j) { $i++; } + $this->mpdf->Cell($w, $h, substr($s, $j, $i-$j), 0, 2, $align, $fill, $link); + } + else { + $tmp = substr($s, $j, $sep-$j); + if($align=='J') { + ////////////////////////////////////////// + // JUSTIFY J using Unicode fonts (Word spacing doesn't work) + // WORD SPACING + // Change NON_BREAKING SPACE to spaces so they are 'spaced' properly + $tmp = str_replace(chr(160),chr(32),$tmp ); + $len_ligne = $this->mpdf->GetStringWidth($tmp ); + $nb_carac = strlen( $tmp ) ; + $nb_spaces = substr_count( $tmp ,' ' ) ; + list($charspacing,$ws) = $this->mpdf->GetJspacing($nb_carac,$nb_spaces,((($w-2) - $len_ligne) * _MPDFK),$false); + $this->mpdf->SetSpacing($charspacing,$ws); + ////////////////////////////////////////// + } + $this->mpdf->Cell($w, $h, $tmp, 0, 2, $align, $fill, $link); + $i=$sep+1; + } + $sep = -1; + $j = $i; + $l = 0; + if($nl==1) { + if ($currentx != 0) $this->mpdf->x=$currentx; + else $this->mpdf->x=$this->mpdf->lMargin; + $w=$this->mpdf->w-$this->mpdf->rMargin-$this->mpdf->x; + $wmax=$w-($this->mpdf->cMarginL+$this->mpdf->cMarginR); + } + $nl++; + } + else { + $i++; + } + } + // WORD SPACING + $this->mpdf->ResetSpacing(); + } + //Last chunk + if($i!=$j) { + if ($currentx != 0) $this->mpdf->x=$currentx; + else $this->mpdf->x=$this->mpdf->lMargin; + if ($this->mpdf->usingCoreFont) { $tmp = substr($s,$j,$i-$j); } + else { + $tmp = mb_substr($s,$j,$i-$j,$this->mpdf->mb_enc); + if ($directionality == 'rtl' && $align == 'J') { $align = 'R'; } // *RTL* + $this->mpdf->magic_reverse_dir($tmp, true, $directionality); // *RTL* + } + $this->mpdf->Cell($w,$h,$tmp,0,0,$align,$fill,$link); + } +} + + +function CircularText($x, $y, $r, $text, $align='top', $fontfamily='', $fontsizePt=0, $fontstyle='', $kerning=120, $fontwidth=100, $divider='') { // mPDF 5.5.23 + if ($font || $fontstyle || $fontsizePt) $this->mpdf->SetFont($fontfamily,$fontstyle,$fontsizePt); + $kerning/=100; + $fontwidth/=100; + if($kerning==0) $this->mpdf->Error('Please use values unequal to zero for kerning (CircularText)'); + if($fontwidth==0) $this->mpdf->Error('Please use values unequal to zero for font width (CircularText)'); + $text=str_replace("\r",'',$text); + //circumference + $u=($r*2)*M_PI; + // mPDF 5.5.23 + $checking = true; + $autoset = false; + while($checking) { + $t=0; + $w = array(); + if ($this->mpdf->usingCoreFont) { + $nb=strlen($text); + for($i=0; $i<$nb; $i++){ + $w[$i]=$this->mpdf->GetStringWidth($text[$i]); + $w[$i]*=$kerning*$fontwidth; + $t+=$w[$i]; + } + } + else { + $nb=mb_strlen($text, $this->mpdf->mb_enc ); + $lastchar = ''; + $unicode = $this->mpdf->UTF8StringToArray($text); + for($i=0; $i<$nb; $i++){ + $c = mb_substr($text,$i,1,$this->mpdf->mb_enc ); + $w[$i]=$this->mpdf->GetStringWidth($c); + $w[$i]*=$kerning*$fontwidth; + $char = $unicode[$i]; + if ($this->mpdf->useKerning && $lastchar) { + if (isset($this->mpdf->CurrentFont['kerninfo'][$lastchar][$char])) { + $tk = $this->mpdf->CurrentFont['kerninfo'][$lastchar][$char] * ($this->mpdf->FontSize/ 1000) * $kerning * $fontwidth; + $w[$i] += $tk/2; + $w[$i-1] += $tk/2; + $t+=$tk; + } + } + $lastchar = $char; + $t+=$w[$i]; + } + } + if ($fontsizePt>=0 || $autoset) { $checking = false; } + else { + $t+=$this->mpdf->GetStringWidth(' '); + if ($divider) + $t+=$this->mpdf->GetStringWidth(' '); + if ($fontsizePt==-2) + $fontsizePt = $this->mpdf->FontSizePt * 0.5 * $u/$t; + else + $fontsizePt = $this->mpdf->FontSizePt * $u/$t; + $this->mpdf->SetFontSize($fontsizePt); + $autoset = true; + } + } + + //total width of string in degrees + $d=($t/$u)*360; + + $this->mpdf->StartTransform(); + // rotate matrix for the first letter to center the text + // (half of total degrees) + if($align=='top'){ + $this->mpdf->transformRotate(-$d/2, $x, $y); + } + else{ + $this->mpdf->transformRotate($d/2, $x, $y); + } + //run through the string + for($i=0; $i<$nb; $i++){ + if($align=='top'){ + //rotate matrix half of the width of current letter + half of the width of preceding letter + if($i==0){ + $this->mpdf->transformRotate((($w[$i]/2)/$u)*360, $x, $y); + } + else{ + $this->mpdf->transformRotate((($w[$i]/2+$w[$i-1]/2)/$u)*360, $x, $y); + } + if($fontwidth!=1){ + $this->mpdf->StartTransform(); + $this->mpdf->transformScale($fontwidth*100, 100, $x, $y); + } + $this->mpdf->SetXY($x-$w[$i]/2, $y-$r); + } + else{ + //rotate matrix half of the width of current letter + half of the width of preceding letter + if($i==0){ + $this->mpdf->transformRotate(-(($w[$i]/2)/$u)*360, $x, $y); + } + else{ + $this->mpdf->transformRotate(-(($w[$i]/2+$w[$i-1]/2)/$u)*360, $x, $y); + } + if($fontwidth!=1){ + $this->mpdf->StartTransform(); + $this->mpdf->transformScale($fontwidth*100, 100, $x, $y); + } + $this->mpdf->SetXY($x-$w[$i]/2, $y+$r-($this->mpdf->FontSize)); + } + if ($this->mpdf->usingCoreFont) { $c=$text[$i]; } + else { $c = mb_substr($text,$i,1,$this->mpdf->mb_enc ); } + $this->mpdf->Cell(($w[$i]),$this->mpdf->FontSize,$c,0,0,'C'); // mPDF 5.3.53 + if($fontwidth!=1){ + $this->mpdf->StopTransform(); + } + } + $this->mpdf->StopTransform(); + + // mPDF 5.5.23 + if($align=='top' && $divider!=''){ + $wc=$this->mpdf->GetStringWidth($divider); + $wc*=$kerning*$fontwidth; + + $this->mpdf->StartTransform(); + $this->mpdf->transformRotate(90, $x, $y); + $this->mpdf->SetXY($x-$wc/2, $y-$r); + $this->mpdf->Cell(($wc),$this->mpdf->FontSize,$divider,0,0,'C'); + $this->mpdf->StopTransform(); + + $this->mpdf->StartTransform(); + $this->mpdf->transformRotate(-90, $x, $y); + $this->mpdf->SetXY($x-$wc/2, $y-$r); + $this->mpdf->Cell(($wc),$this->mpdf->FontSize,$divider,0,0,'C'); + $this->mpdf->StopTransform(); + } +} + +function Shaded_box( $text,$font='',$fontstyle='B',$szfont='',$width='70%',$style='DF',$radius=2.5,$fill='#FFFFFF',$color='#000000',$pad=2 ) +{ +// F (shading - no line),S (line, no shading),DF (both) + if (!$font) { $font= $this->mpdf->default_font; } + if (!$szfont) { $szfont = ($this->mpdf->default_font_size * 1.8); } + + $text = $this->mpdf->purify_utf8_text($text); + if ($this->mpdf->text_input_as_HTML) { + $text = $this->mpdf->all_entities_to_utf8($text); + } + if ($this->mpdf->usingCoreFont) { $text = mb_convert_encoding($text,$this->mpdf->mb_enc,'UTF-8'); } + // DIRECTIONALITY + $this->mpdf->magic_reverse_dir($text, true, $this->mpdf->directionality); // *RTL* + // Font-specific ligature substitution for Indic fonts + if (isset($this->mpdf->CurrentFont['indic']) && $this->mpdf->CurrentFont['indic']) $this->mpdf->ConvertIndic($text); // *INDIC* + $text = ' '.$text.' '; + if (!$width) { $width = $this->mpdf->pgwidth; } else { $width=$this->mpdf->ConvertSize($width,$this->mpdf->pgwidth); } + $midpt = $this->mpdf->lMargin+($this->mpdf->pgwidth/2); + $r1 = $midpt-($width/2); //($this->mpdf->w / 2) - 40; + $r2 = $r1 + $width; //$r1 + 80; + $y1 = $this->mpdf->y; + + + $mid = ($r1 + $r2 ) / 2; + $loop = 0; + + while ( $loop == 0 ) + { + $this->mpdf->SetFont( $font, $fontstyle, $szfont ); + $sz = $this->mpdf->GetStringWidth( $text ); + if ( ($r1+$sz) > $r2 ) + $szfont --; + else + $loop ++; + } + + $y2 = $this->mpdf->FontSize+($pad*2); + + $this->mpdf->SetLineWidth(0.1); + $fc = $this->mpdf->ConvertColor($fill); + $tc = $this->mpdf->ConvertColor($color); + $this->mpdf->SetFColor($fc); + $this->mpdf->SetTColor($tc); + $this->mpdf->RoundedRect($r1, $y1, ($r2 - $r1), $y2, $radius, $style); + $this->mpdf->SetX( $r1); + $this->mpdf->Cell($r2-$r1, $y2, $text, 0, 1, "C" ); + $this->mpdf->SetY($y1+$y2+2); // +2 = mm margin below shaded box + $this->mpdf->Reset(); +} + + +} + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/classes/form.php b/application/third_party/mpdf/classes/form.php new file mode 100644 index 0000000..3699b7b --- /dev/null +++ b/application/third_party/mpdf/classes/form.php @@ -0,0 +1,1498 @@ +<?php + +class form { + +var $mpdf = null; + +var $forms; +var $formn; + +//Active Forms +var $formSubmitNoValueFields; +var $formExportType; +var $formSelectDefaultOption; +var $formUseZapD; +/* Form Styles */ +var $form_border_color; +var $form_background_color; +var $form_border_width; +var $form_border_style; +var $form_button_border_color; +var $form_button_background_color; +var $form_button_border_width; +var $form_button_border_style; +var $form_radio_color; +var $form_radio_background_color; + +var $form_element_spacing; + +// Active forms +var $formMethod; +var $formAction; +var $form_fonts; +var $form_radio_groups; +var $form_checkboxes; +var $pdf_acro_array; + +var $pdf_array_co; +var $array_form_button_js; +var $array_form_choice_js; +var $array_form_text_js; + +/* Button Text */ +var $form_button_text; +var $form_button_text_over; +var $form_button_text_click; +var $form_button_icon; + + +// FORMS +var $textarea_lineheight; + +function form(&$mpdf) { + $this->mpdf = $mpdf; + + // ACTIVE FORMS + $this->formExportType = 'xfdf'; // 'xfdf' or 'html' + $this->formSubmitNoValueFields = true; // Whether to include blank fields when submitting data + $this->formSelectDefaultOption = true; // for Select drop down box; if no option is explicitly maked as selected, + // this determines whether to select 1st option (as per browser) + // - affects whether "required" attribute is relevant + $this->formUseZapD = true; // Determine whether to use ZapfDingbat icons for radio/checkboxes + + // FORM STYLES + // These can alternatively use a 4 number string to represent CMYK colours + $this->form_border_color = '0.6 0.6 0.72'; // RGB + $this->form_background_color = '0.975 0.975 0.975'; // RGB + $this->form_border_width = '1'; // 0 doesn't seem to work as it should + $this->form_border_style = 'S'; // B - Bevelled; D - Double + $this->form_button_border_color = '0.2 0.2 0.55'; + $this->form_button_background_color = '0.941 0.941 0.941'; + $this->form_button_border_width = '1'; + $this->form_button_border_style = 'S'; + $this->form_radio_color = '0.0 0.0 0.4'; // radio and checkbox + $this->form_radio_background_color = '0.9 0.9 0.9'; + + // FORMS + $this->textarea_lineheight = 1.25; + + // FORM ELEMENT SPACING + $this->form_element_spacing['select']['outer']['h'] = 0.5; // Horizontal spacing around SELECT + $this->form_element_spacing['select']['outer']['v'] = 0.5; // Vertical spacing around SELECT + $this->form_element_spacing['select']['inner']['h'] = 0.7; // Horizontal padding around SELECT + $this->form_element_spacing['select']['inner']['v'] = 0.7; // Vertical padding around SELECT + $this->form_element_spacing['input']['outer']['h'] = 0.5; + $this->form_element_spacing['input']['outer']['v'] = 0.5; + $this->form_element_spacing['input']['inner']['h'] = 0.7; + $this->form_element_spacing['input']['inner']['v'] = 0.7; + $this->form_element_spacing['textarea']['outer']['h'] = 0.5; + $this->form_element_spacing['textarea']['outer']['v'] = 0.5; + $this->form_element_spacing['textarea']['inner']['h'] = 1; + $this->form_element_spacing['textarea']['inner']['v'] = 0.5; + $this->form_element_spacing['button']['outer']['h'] = 0.5; + $this->form_element_spacing['button']['outer']['v'] = 0.5; + $this->form_element_spacing['button']['inner']['h'] = 2; + $this->form_element_spacing['button']['inner']['v'] = 1; + + // INITIALISE non-configurable + $this->formMethod = 'POST'; + $this->formAction = ''; + $this->form_fonts = array(); + $this->form_radio_groups = array(); + $this->form_checkboxes = false; + $this->forms = array(); + $this->pdf_array_co = ''; + + +} + + +function print_ob_text($objattr,$w,$h,$texto,$rtlalign,$k,$blockdir) { + // TEXT/PASSWORD INPUT + if ($this->mpdf->useActiveForms) { + // Flags: 1 - Readonly; 2 - Required; 3 - No export; 13 - textarea; 14 - Password + $flags = array(); + if ($objattr['disabled'] || $objattr['readonly']) { $flags[] = 1; } // readonly + if ($objattr['disabled']) { $flags[] = 3; } // no export + if ($objattr['disabled']) { $objattr['color'] = array(3,128,128,128); } // gray out disabled + if ($objattr['required']) { $flags[] = 2; } // required + if (!$objattr['spellcheck']) { $flags[] = 23; } // DoNotSpellCheck + if ($objattr['subtype']=='PASSWORD') { $flags[] = 14; } + $this->mpdf->SetTColor($objattr['color']); + $fieldalign = $rtlalign; + if ($objattr['text_align']) { $fieldalign = $objattr['text_align']; } + if ($objattr['subtype']=='PASSWORD') { $val = $objattr['value']; } + else { $val = $objattr['text']; } + // mPDF 5.3.25 + $js = array(); + if ($objattr['onCalculate']) { $js[] = array('C', $objattr['onCalculate']); } + if ($objattr['onValidate']) { $js[] = array('V', $objattr['onValidate']); } + if ($objattr['onFormat']) { $js[] = array('F', $objattr['onFormat']); } + if ($objattr['onKeystroke']) { $js[] = array('K', $objattr['onKeystroke']); } + $this->SetFormText( $w, $h, $objattr['fieldname'], $val, $val, $objattr['title'], $flags, $fieldalign, false, $objattr['maxlength'], $js, $objattr['background-col'], $objattr['border-col'] ); + $this->mpdf->SetTColor($this->mpdf->ConvertColor(0)); + } + else { + $w -= $this->form_element_spacing['input']['outer']['h']*2 /$k; + $h -= $this->form_element_spacing['input']['outer']['v']*2 /$k; + $this->mpdf->x += $this->form_element_spacing['input']['outer']['h'] /$k; + $this->mpdf->y += $this->form_element_spacing['input']['outer']['v'] /$k; + // Chop texto to max length $w-inner-padding + while ($this->mpdf->GetStringWidth($texto) > $w-($this->form_element_spacing['input']['inner']['h']*2)) { + $texto = mb_substr($texto,0,mb_strlen($texto,$this->mpdf->mb_enc)-1,$this->mpdf->mb_enc); + } + $save_linemaxfontsize = $this->mpdf->linemaxfontsize; + $this->mpdf->linemaxfontsize = $this->mpdf->FontSize; + $this->mpdf->SetLineWidth(0.2 /$k ); + $this->mpdf->magic_reverse_dir($texto, false, $blockdir); // *RTL* + if (isset($objattr['disabled']) && $objattr['disabled']) { + $this->mpdf->SetFColor($this->mpdf->ConvertColor(225)); + $this->mpdf->SetTColor($this->mpdf->ConvertColor(127)); + } + else if (isset($objattr['readonly']) && $objattr['readonly']) { + $this->mpdf->SetFColor($this->mpdf->ConvertColor(225)); + $this->mpdf->SetTColor($this->mpdf->ConvertColor(0)); + } + else { + $this->mpdf->SetFColor($this->mpdf->ConvertColor(250)); + $this->mpdf->SetTColor($this->mpdf->ConvertColor(0)); + } + $this->mpdf->Cell($w,$h,$texto,1,0,$rtlalign,1,'',0,$this->form_element_spacing['input']['inner']['h'] /$k ,$this->form_element_spacing['input']['inner']['h'] /$k , 'M'); + $this->mpdf->SetFColor($this->mpdf->ConvertColor(255)); + $this->mpdf->SetTColor($this->mpdf->ConvertColor(0)); + $this->mpdf->linemaxfontsize = $save_linemaxfontsize; + } +} + +function print_ob_textarea($objattr,$w,$h,$texto,$rtlalign,$k,$blockdir) { + // TEXTAREA + if ($this->mpdf->useActiveForms) { + // Flags: 1 - Readonly; 2 - Required; 3 - No export; 13 - textarea; 14 - Password + $flags = array(); + $flags = array(13); // textarea + if ($objattr['disabled'] || $objattr['readonly']) { $flags[] = 1; } // readonly + if ($objattr['disabled']) { $flags[] = 3; } // no export + if ($objattr['disabled']) { $objattr['color'] = array(3,128,128,128); } // gray out disabled + if ($objattr['required']) { $flags[] = 2; } // required + if (!$objattr['spellcheck']) { $flags[] = 23; } // DoNotSpellCheck + if ($objattr['donotscroll']) { $flags[] = 24; } // DoNotScroll + $this->mpdf->SetTColor($objattr['color']); + $fieldalign = $rtlalign; + if ($texto == ' ') { $texto = ''; } // mPDF 5.3.24 + if ($objattr['text_align']) { $fieldalign = $objattr['text_align']; } + // mPDF 5.3.25 + $js = array(); + if ($objattr['onCalculate']) { $js[] = array('C', $objattr['onCalculate']); } + if ($objattr['onValidate']) { $js[] = array('V', $objattr['onValidate']); } + if ($objattr['onFormat']) { $js[] = array('F', $objattr['onFormat']); } + if ($objattr['onKeystroke']) { $js[] = array('K', $objattr['onKeystroke']); } + $this->SetFormText( $w, $h, $objattr['fieldname'], $texto, $texto, $objattr['title'], $flags, $fieldalign , false, -1, $js, $objattr['background-col'], $objattr['border-col'] ); + $this->mpdf->SetTColor($this->mpdf->ConvertColor(0)); + } + else { + $w -= $this->form_element_spacing['textarea']['outer']['h']*2 /$k ; + $h -= $this->form_element_spacing['textarea']['outer']['v']*2 /$k ; + $this->mpdf->x += $this->form_element_spacing['textarea']['outer']['h'] /$k ; + $this->mpdf->y += $this->form_element_spacing['textarea']['outer']['v'] /$k ; + $this->mpdf->SetLineWidth(0.2 /$k ); + if (isset($objattr['disabled']) && $objattr['disabled']) { + $this->mpdf->SetFColor($this->mpdf->ConvertColor(225)); + $this->mpdf->SetTColor($this->mpdf->ConvertColor(127)); + } + else if (isset($objattr['readonly']) && $objattr['readonly']) { + $this->mpdf->SetFColor($this->mpdf->ConvertColor(225)); + $this->mpdf->SetTColor($this->mpdf->ConvertColor(0)); + } + else { + $this->mpdf->SetFColor($this->mpdf->ConvertColor(250)); + $this->mpdf->SetTColor($this->mpdf->ConvertColor(0)); + } + $this->mpdf->Rect($this->mpdf->x,$this->mpdf->y,$w,$h,'DF'); + $w -= $this->form_element_spacing['textarea']['inner']['h']*2 /$k ; + $this->mpdf->x += $this->form_element_spacing['textarea']['inner']['h'] /$k ; + $this->mpdf->y += $this->form_element_spacing['textarea']['inner']['v'] /$k ; + $linesneeded = $this->mpdf->WordWrap($texto,$w); + if ($linesneeded > $objattr['rows']) { //Too many words inside textarea + $textoaux = explode("\n",$texto); + $texto = ''; + for($i=0;$i<$objattr['rows'];$i++) { + if ($i == ($objattr['rows']-1)) $texto .= $textoaux[$i]; + else $texto .= $textoaux[$i] . "\n"; + } + $texto = mb_substr($texto,0,mb_strlen($texto,$this->mpdf->mb_enc)-4,$this->mpdf->mb_enc) . "..."; + } + if ($texto != '') $this->mpdf->MultiCell($w,$this->mpdf->FontSize*$this->textarea_lineheight,$texto,0,'',0,'',$blockdir,true); + $this->mpdf->SetFColor($this->mpdf->ConvertColor(255)); + $this->mpdf->SetTColor($this->mpdf->ConvertColor(0)); + } +} + +function print_ob_select($objattr,$w,$h,$texto,$rtlalign,$k,$blockdir) { + // SELECT + if ($this->mpdf->useActiveForms) { + // Flags: 1 - Readonly; 2 - Required; 3 - No export; 19 - edit (only if combo) + $flags = array(); + if ($objattr['disabled']) { $flags[] = 1; } // readonly + if ($objattr['disabled']) { $flags[] = 3; } // no export + if ($objattr['disabled']) { $objattr['color'] = array(3,128,128,128); } // gray out disabled + if ($objattr['required']) { $flags[] = 2; } // required + if ($objattr['multiple'] && $objattr['size']>1) { $flags[] = 22; } //flag 22 = multiselect (listbox) + if ($objattr['size']<2) { + $flags[] = 18; //flag 18 = combobox (else a listbox) + if ($objattr['editable']) { $flags[] = 19; } // editable + } + // only spellcheck if combo and editable + if (!$objattr['spellcheck'] || $objattr['size']>1 || !$objattr['editable']) { $flags[] = 23; } // DoNotSpellCheck + if ($objattr['subtype']=='PASSWORD') { $flags[] = 14; } + if ($objattr['onChange']) { $js = $objattr['onChange']; } + else { $js = ''; } // mPDF 5.3.37 + $data = array('VAL' => array(), 'OPT' => array(), 'SEL' => array(), ); + for($i=0; $i<count($objattr['items']); $i++) { + $item = $objattr['items'][$i]; + $data['VAL'][] = $item['exportValue']; + $data['OPT'][] = $item['content']; + if ($item['selected']) { $data['SEL'][] = $i; } + } + if (count($data['SEL'])==0 && $this->formSelectDefaultOption) {$data['SEL'][] = 0; } + $this->mpdf->SetTColor($objattr['color']); + $this->SetFormChoice( $w, $h, $objattr['fieldname'], $flags, $data, $rtlalign, $js ); + $this->mpdf->SetTColor($this->mpdf->ConvertColor(0)); + } + else { + $save_linemaxfontsize = $this->mpdf->linemaxfontsize; + $this->mpdf->linemaxfontsize = $this->mpdf->FontSize; + $this->mpdf->magic_reverse_dir($texto, false, $blockdir); // *RTL* + $this->mpdf->SetLineWidth(0.2 /$k ); + if (isset($objattr['disabled']) && $objattr['disabled']) { + $this->mpdf->SetFColor($this->mpdf->ConvertColor(225)); + $this->mpdf->SetTColor($this->mpdf->ConvertColor(127)); + } + else { + $this->mpdf->SetFColor($this->mpdf->ConvertColor(250)); + $this->mpdf->SetTColor($this->mpdf->ConvertColor(0)); + } + $w -= $this->form_element_spacing['select']['outer']['h']*2 /$k ; + $h -= $this->form_element_spacing['select']['outer']['v']*2 /$k ; + $this->mpdf->x += $this->form_element_spacing['select']['outer']['h'] /$k ; + $this->mpdf->y += $this->form_element_spacing['select']['outer']['v'] /$k ; + $this->mpdf->Cell($w-($this->mpdf->FontSize*1.4),$h,$texto,1,0,$rtlalign,1,'',0,$this->form_element_spacing['select']['inner']['h'] /$k,$this->form_element_spacing['select']['inner']['h'] /$k , 'M') ; + $this->mpdf->SetFColor($this->mpdf->ConvertColor(190)); + $save_font = $this->mpdf->FontFamily; + $save_currentfont = $this->mpdf->currentfontfamily; + if ($this->mpdf->PDFA || $this->mpdf->PDFX) { + if (($this->mpdf->PDFA && !$this->mpdf->PDFAauto) || ($this->mpdf->PDFX && !$this->mpdf->PDFXauto)) { $this->mpdf->PDFAXwarnings[] = "Core Adobe font Zapfdingbats cannot be embedded in mPDF - used in Form element: Select - which is required for PDFA1-b or PDFX/1-a. (Different character/font will be substituted.)"; } + $this->mpdf->SetFont('sans'); + if ($this->mpdf->_charDefined($this->mpdf->CurrentFont['cw'], 9660)) { $down = "\xe2\x96\xbc"; } + else { $down = '='; } + $this->mpdf->Cell(($this->mpdf->FontSize*1.4),$h,$down,1,0,'C',1,'',0,0,0, 'M') ; + } + else { + $this->mpdf->SetFont('czapfdingbats','',0); + $this->mpdf->Cell(($this->mpdf->FontSize*1.4),$h,chr(116),1,0,'C',1,'',0,0,0, 'M') ; + } + $this->mpdf->SetFont($save_font,'',0); + $this->mpdf->currentfontfamily = $save_currentfont; + $this->mpdf->linemaxfontsize = $save_linemaxfontsize; + $this->mpdf->SetFColor($this->mpdf->ConvertColor(255)); + $this->mpdf->SetTColor($this->mpdf->ConvertColor(0)); + } +} + +function print_ob_imageinput($objattr,$w,$h,$texto,$rtlalign,$k,$blockdir) { + // INPUT/BUTTON as IMAGE + if ($this->mpdf->useActiveForms) { + // Flags: 1 - Readonly; 3 - No export; + $flags = array(); + if ($objattr['disabled']) { $flags[] = 1; } // readonly + if ($objattr['disabled']) { $flags[] = 3; } // no export + if ($objattr['onClick']) { $js = $objattr['onClick']; } + else { $js = ''; } + $this->SetJSButton( $w, $h, $objattr['fieldname'], $objattr['value'], $js, $objattr['ID'], $objattr['title'], $flags, $objattr['Indexed']); + } + else { + $this->mpdf->y = $objattr['INNER-Y']; + $this->mpdf->_out( sprintf("q %.3F 0 0 %.3F %.3F %.3F cm /I%d Do Q",$objattr['INNER-WIDTH'] *_MPDFK,$objattr['INNER-HEIGHT'] *_MPDFK,$objattr['INNER-X'] *_MPDFK,($this->mpdf->h-($objattr['INNER-Y'] +$objattr['INNER-HEIGHT'] ))*_MPDFK,$objattr['ID'] ) ); + if (isset($objattr['BORDER-WIDTH']) && $objattr['BORDER-WIDTH']) { $this->mpdf->PaintImgBorder($objattr,$is_table); } + } +} + +function print_ob_button($objattr,$w,$h,$texto,$rtlalign,$k,$blockdir) { + // BUTTON + if ($this->mpdf->useActiveForms) { + // Flags: 1 - Readonly; 3 - No export; + $flags = array(); + if ($objattr['disabled']) { $flags[] = 1; } // readonly + if ($objattr['disabled']) { $flags[] = 3; } // no export + if ($objattr['disabled']) { $objattr['color'] = array(3,128,128,128); } + $this->mpdf->SetTColor($objattr['color']); + if ($objattr['subtype'] == 'RESET') { + $this->SetFormButtonText( $objattr['value'] ); + $this->SetFormReset( $w, $h, $objattr['fieldname'], $objattr['value'], $objattr['title'], $flags, $objattr['background-col'], $objattr['border-col'], $objattr['noprint'] ); + } + else if ($objattr['subtype'] == 'SUBMIT') { + $url = $this->formAction; + $type = $this->formExportType; + $method = $this->formMethod; + $this->SetFormButtonText( $objattr['value'] ); + $this->SetFormSubmit( $w, $h, $objattr['fieldname'], $objattr['value'], $url, $objattr['title'], $type, $method, $flags, $objattr['background-col'], $objattr['border-col'], $objattr['noprint'] ); + } + else if ($objattr['subtype'] == 'BUTTON') { + $this->SetFormButtonText( $objattr['value'] ); + if ($objattr['onClick']) { $js = $objattr['onClick']; } + else { $js = ''; } + $this->SetJSButton( $w, $h, $objattr['fieldname'], $objattr['value'], $js, 0, $objattr['title'], $flags, false, $objattr['background-col'], $objattr['border-col'], $objattr['noprint'] ); + } + $this->mpdf->SetTColor($this->mpdf->ConvertColor(0)); + } + else { + $this->mpdf->SetLineWidth(0.2 /$k ); + $this->mpdf->SetFColor($this->mpdf->ConvertColor(190)); + $w -= $this->form_element_spacing['button']['outer']['h']*2 /$k ; + $h -= $this->form_element_spacing['button']['outer']['v']*2 /$k ; + $this->mpdf->x += $this->form_element_spacing['button']['outer']['h'] /$k ; + $this->mpdf->y += $this->form_element_spacing['button']['outer']['v'] /$k ; + $this->mpdf->RoundedRect($this->mpdf->x, $this->mpdf->y, $w, $h, 0.5 /$k , 'DF'); + $w -= $this->form_element_spacing['button']['inner']['h']*2 /$k ; + $h -= $this->form_element_spacing['button']['inner']['v']*2 /$k ; + $this->mpdf->x += $this->form_element_spacing['button']['inner']['h'] /$k ; + $this->mpdf->y += $this->form_element_spacing['button']['inner']['v'] /$k ; + $save_linemaxfontsize = $this->mpdf->linemaxfontsize; + $this->mpdf->linemaxfontsize = $this->mpdf->FontSize; + $this->mpdf->magic_reverse_dir($texto, false, $blockdir); // *RTL* + $this->mpdf->Cell($w,$h,$texto,'',0,'C',0,'',0,0,0, 'M') ; + $this->mpdf->SetFColor($this->mpdf->ConvertColor(0)); + $this->mpdf->linemaxfontsize = $save_linemaxfontsize; + } +} + +function print_ob_checkbox($objattr,$w,$h,$texto,$rtlalign,$k,$blockdir,$x,$y) { + // CHECKBOX + if ($this->mpdf->useActiveForms) { + // Flags: 1 - Readonly; 2 - Required; 3 - No export; + $flags = array(); + if ($objattr['disabled']) { $flags[] = 1; } // readonly + if ($objattr['disabled']) { $flags[] = 3; } // no export + $checked = false; + if ($objattr['checked']) { $checked = true; } + if ($this->formUseZapD) { + $save_font = $this->mpdf->FontFamily; + $save_currentfont = $this->mpdf->currentfontfamily; + $this->mpdf->SetFont('czapfdingbats','',0); + } + $this->SetCheckBox( $w, $h, $objattr['fieldname'], $objattr['value'], $objattr['title'], $checked, $flags, $objattr['disabled'] ); + if ($this->formUseZapD) { + $this->mpdf->SetFont($save_font,'',0); + $this->mpdf->currentfontfamily = $save_currentfont; + } + } + else { + $iw = $w * 0.7; + $ih = $h * 0.7; + $lx = $x + (($w-$iw)/2); + $ty = $y + (($h-$ih)/2); + $rx = $lx + $iw; + $by = $ty + $ih; + $this->mpdf->SetLineWidth(0.2 /$k ); + if (isset($objattr['disabled']) && $objattr['disabled']) { + $this->mpdf->SetFColor($this->mpdf->ConvertColor(225)); + $this->mpdf->SetDColor($this->mpdf->ConvertColor(127)); + } + else { + $this->mpdf->SetFColor($this->mpdf->ConvertColor(250)); + $this->mpdf->SetDColor($this->mpdf->ConvertColor(0)); + } + $this->mpdf->Rect($lx,$ty,$iw,$ih,'DF'); + if (isset($objattr['checked']) && $objattr['checked']) { + //Round join and cap + $this->mpdf->SetLineCap(1); + $this->mpdf->Line($lx,$ty,$rx,$by); + $this->mpdf->Line($lx,$by,$rx,$ty); + //Set line cap style back to square + $this->mpdf->SetLineCap(2); + } + $this->mpdf->SetFColor($this->mpdf->ConvertColor(255)); + $this->mpdf->SetDColor($this->mpdf->ConvertColor(0)); + } +} + +function print_ob_radio($objattr,$w,$h,$texto,$rtlalign,$k,$blockdir,$x,$y) { + // RADIO + if ($this->mpdf->useActiveForms) { + // Flags: 1 - Readonly; 2 - Required; 3 - No export; + $flags = array(); + if ($objattr['disabled']) { $flags[] = 1; } // readonly + if ($objattr['disabled']) { $flags[] = 3; } // no export + $checked = false; + if ($objattr['checked']) { $checked = true; } + if ($this->formUseZapD) { + $save_font = $this->mpdf->FontFamily; + $save_currentfont = $this->mpdf->currentfontfamily; + $this->mpdf->SetFont('czapfdingbats','',0); + } + $this->SetRadio( $w, $h, $objattr['fieldname'], $objattr['value'], $objattr['title'], $checked, $flags, $objattr['disabled'] ); + if ($this->formUseZapD) { + $this->mpdf->SetFont($save_font,'',0); + $this->mpdf->currentfontfamily = $save_currentfont; + } + } + else { + $this->mpdf->SetLineWidth(0.2 /$k ); + $radius = $this->mpdf->FontSize *0.35; + $cx = $x + ($w/2); + $cy = $y + ($h/2); + if (isset($objattr['disabled']) && $objattr['disabled']) { + $this->mpdf->SetFColor($this->mpdf->ConvertColor(127)); + $this->mpdf->SetDColor($this->mpdf->ConvertColor(127)); + } + else { + $this->mpdf->SetFColor($this->mpdf->ConvertColor(0)); + $this->mpdf->SetDColor($this->mpdf->ConvertColor(0)); + } + $this->mpdf->Circle($cx,$cy,$radius,'D'); + if (isset($objattr['checked']) && $objattr['checked']) { + $this->mpdf->Circle($cx,$cy,$radius*0.4,'DF'); + } + $this->mpdf->SetFColor($this->mpdf->ConvertColor(255)); + $this->mpdf->SetDColor($this->mpdf->ConvertColor(0)); + + } +} + + +// In _putpages +function countPageForms($n, &$totaladdnum) { + foreach( $this->forms as $form ) { + if ( $form['page'] == $n ) { + $totaladdnum++; + if ( $form['typ'] == 'Tx' ) { + if ( isset($this->array_form_text_js[$form['T']]) ) { + if ( isset($this->array_form_text_js[$form['T']]['F']) ) { $totaladdnum++; } + if ( isset($this->array_form_text_js[$form['T']]['K']) ) { $totaladdnum++; } + if ( isset($this->array_form_text_js[$form['T']]['V']) ) { $totaladdnum++; } + if ( isset($this->array_form_text_js[$form['T']]['C']) ) { $totaladdnum++; } + } + } + if ( $form['typ'] == 'Bt' ) { + if ( isset($this->array_form_button_js[$form['T']]) ) { $totaladdnum++; } + if ( isset($this->form_button_icon[$form['T']]) ) { + $totaladdnum++; + if ( $this->form_button_icon[$form['T']]['Indexed'] ) { $totaladdnum++; } + } + if ( $form['subtype'] == 'radio' ) { $totaladdnum+=2; } + else if ( $form['subtype'] == 'checkbox' && $this->formUseZapD ) { $totaladdnum++; } + else if ( $form['subtype'] == 'checkbox' && !$this->formUseZapD ) { $totaladdnum+=2; } + } + if ( $form['typ'] == 'Ch' ) { + if ( isset($this->array_form_choice_js[$form['T']]) ) { $totaladdnum++; } + } + } + } +} + +// In _putpages +function addFormIds($n, &$s, &$annotid) { + foreach( $this->forms as $form ) { + if ( $form['page'] == $n ) { + $s .= ($annotid) . ' 0 R '; + $annotid++; + if ( $form['typ'] == 'Tx' ) { + if ( isset($this->array_form_text_js[$form['T']]) ) { + if ( isset($this->array_form_text_js[$form['T']]['F']) ) { $annotid++; } + if ( isset($this->array_form_text_js[$form['T']]['K']) ) { $annotid++; } + if ( isset($this->array_form_text_js[$form['T']]['V']) ) { $annotid++; } + if ( isset($this->array_form_text_js[$form['T']]['C']) ) { $annotid++; } + } + } + if ( $form['typ'] == 'Bt' ) { + if ( isset($this->array_form_button_js[$form['T']]) ) { $annotid++; } + if ( isset($this->form_button_icon[$form['T']]) ) { + $annotid++; + if ( $this->form_button_icon[$form['T']]['Indexed'] ) { $annotid++; } + } + if ( $form['subtype'] == 'radio' ) { $annotid+=2; } + else if ( $form['subtype'] == 'checkbox' && $this->formUseZapD ) { $annotid++; } + else if ( $form['subtype'] == 'checkbox' && !$this->formUseZapD ) { $annotid+=2; } + } + if ( $form['typ'] == 'Ch' ) { + if ( isset($this->array_form_choice_js[$form['T']]) ) { $annotid++; } + } + } + } +} + +// In _putannots +function _putFormItems($n, $hPt) { + foreach( $this->forms as $val) { + if ( $val['page'] == $n ) { + if ( $val['typ'] == 'Tx' ) $this->_putform_tx( $val, $hPt ); + if ( $val['typ'] == 'Ch' ) $this->_putform_ch( $val, $hPt ); + if ( $val['typ'] == 'Bt' ) $this->_putform_bt( $val, $hPt ); + } + } +} + +// In _putannots +function _putRadioItems($n) { + // Output Radio Groups + $key = 1; + foreach($this->form_radio_groups AS $name=>$frg) { + $this->mpdf->_newobj(); + $this->pdf_acro_array .= $this->mpdf->n.' 0 R '; + $this->mpdf->_out('<<'); + $this->mpdf->_out('/Type /Annot '); + $this->mpdf->_out('/Subtype /Widget'); + $this->mpdf->_out('/NM '.$this->mpdf->_textstring(sprintf('%04u-%04u', $n, (3000 + $key++)))); + $this->mpdf->_out('/M '.$this->mpdf->_textstring('D:'.date('YmdHis'))); + $this->mpdf->_out('/Rect [0 0 0 0] '); + $this->mpdf->_out('/FT /Btn '); + if ($frg['disabled']) { $flags=array(1,3,15,16); } // NoExport and readonly + else { $flags=array(15,16); } // Flags for Radiobutton, and NoToggleToOff + $this->mpdf->_out('/Ff '.$this->_setflag($flags) ); + $kstr = ''; + $optstr = ''; + foreach($frg['kids'] AS $kid) { + $kstr .= $this->forms[$kid['n']]['obj'].' 0 R '; + // $optstr .= ' '.$this->mpdf->_textstring($kid['OPT']).' '; + } + $this->mpdf->_out('/Kids [ '.$kstr.' ] '); // 11 0 R 12 0 R etc. + // $this->mpdf->_out('/Opt [ '.$optstr.' ] '); + + //V entry holds index corresponding to the appearance state of + //whichever child field is currently in the on state = or Off + if (isset($frg['on'])) { $state = $frg['on']; } + else { $state = 'Off'; } + $this->mpdf->_out('/V /'.$state.' '); + $this->mpdf->_out('/DV /'.$state.' '); + $this->mpdf->_out('/T '.$this->mpdf->_textstring($name).' '); + $this->mpdf->_out('>>'); + $this->mpdf->_out('endobj'); + } +} + +function _putFormsCatalog() { + if (isset($this->pdf_acro_array) ) { + $this->mpdf->_out('/AcroForm << /DA (/F1 0 Tf 0 g )'); + $this->mpdf->_out('/Q 0'); + $this->mpdf->_out('/Fields ['.$this->pdf_acro_array.']'); + $f = ''; + foreach($this->form_fonts AS $fn) { + if (is_array($this->mpdf->fonts[$fn]['n'])) { $this->mpdf->Error("Cannot use fonts with SMP or SIP characters for interactive Form elements"); } + $f .= '/F'.$this->mpdf->fonts[$fn]['i'].' '.$this->mpdf->fonts[$fn]['n'].' 0 R '; + } + $this->mpdf->_out('/DR << /Font << '.$f.' >> >>'); + // CO Calculation Order + if ( $this->pdf_array_co ) { + $this->mpdf->_out('/CO ['.$this->pdf_array_co.']'); + } + $this->mpdf->_out('/NeedAppearances true'); + $this->mpdf->_out('>>'); + } +} + + + +function SetFormButtonJS( $name, $js ) { + $js = str_replace("\t",' ', trim($js) ); + if ( isset($name) && isset($js) ) { + $this->array_form_button_js[$this->mpdf->_escape($name)] = array( + 'js' => $js + ); + } +} + +function SetFormChoiceJS( $name, $js ) { + $js = str_replace("\t",' ', trim($js) ); + if ( isset($name) && isset($js) ) { + $this->array_form_choice_js[$this->mpdf->_escape($name)] = array( + 'js' => $js + ); + } +} + +function SetFormTextJS( $name, $js) { + for ($i=0; $i<count($js); $i++) { + $j = str_replace("\t",' ', trim($js[$i][1]) ); + $format = $js[$i][0]; + if ($name) { + $this->array_form_text_js[$this->mpdf->_escape($name)][$format] = array('js' => $j); + } + } +} + + +function Win1252ToPDFDocEncoding($txt) { + $Win1252ToPDFDocEncoding = array( + chr(0200) => chr(0240), chr(0214) => chr(0226), chr(0212) => chr(0227), chr(0237) => chr(0230), + chr(0225) => chr(0200), chr(0210) => chr(0032), chr(0206) => chr(0201), chr(0207) => chr(0202), + chr(0205) => chr(0203), chr(0227) => chr(0204), chr(0226) => chr(0205), chr(0203) => chr(0206), + chr(0213) => chr(0210), chr(0233) => chr(0211), chr(0211) => chr(0213), chr(0204) => chr(0214), + chr(0223) => chr(0215), chr(0224) => chr(0216), chr(0221) => chr(0217), chr(0222) => chr(0220), + chr(0202) => chr(0221), chr(0232) => chr(0235), chr(0230) => chr(0037), chr(0231) => chr(0222), + chr(0216) => chr(0231), chr(0240) => chr(0040) + ); // mPDF 5.3.46 + return strtr($txt, $Win1252ToPDFDocEncoding ); +} + + +function SetFormText( $w, $h, $name, $value = '', $default = '', $title = '', $flags = array(), $align='L', $hidden = false, $maxlen=-1, $js='', $background_col=false, $border_col=false ) { + // Flags: 1 - Readonly; 2 - Required; 3 - No export; 13 - textarea; 14 - Password + $this->formn++; + if( $align == 'C' ) { $align = '1'; } + else if( $align == 'R' ) { $align = '2'; } + else { $align = '0'; } + if ($maxlen < 1) { $maxlen = false; } + if (!preg_match('/^[a-zA-Z0-9_:\-]+$/', $name)) { + $this->mpdf->Error("Field [".$name."] must have a name attribute, which can only contain letters, numbers, colon(:), undersore(_) or hyphen(-)"); + } + if ($this->mpdf->onlyCoreFonts) { + $value = $this->Win1252ToPDFDocEncoding($value); + $default = $this->Win1252ToPDFDocEncoding($default); + $title = $this->Win1252ToPDFDocEncoding($title); + } + else { + if (isset($this->mpdf->CurrentFont['subset'])) { + $this->mpdf->UTF8StringToArray($value, true); // Add characters to font subset + $this->mpdf->UTF8StringToArray($default, true); // Add characters to font subset + $this->mpdf->UTF8StringToArray($title, true); // Add characters to font subset + } + if ($value) $value = $this->mpdf->UTF8ToUTF16BE($value, true); + if ($default ) $default = $this->mpdf->UTF8ToUTF16BE($default, true); + $title = $this->mpdf->UTF8ToUTF16BE($title, true); + } + if ($background_col) { $bg_c = $this->mpdf->SetColor($background_col, 'CodeOnly'); } + else { $bg_c = $this->form_background_color; } + if ($border_col) { $bc_c = $this->mpdf->SetColor($border_col, 'CodeOnly'); } + else { $bc_c = $this->form_border_color; } + $f = array( 'n' => $this->formn, + 'typ' => 'Tx', + 'page' => $this->mpdf->page, + 'x' => $this->mpdf->x, + 'y' => $this->mpdf->y, + 'w' => $w, + 'h' => $h, + 'T' => $name, + 'FF' => $flags, + 'V' => $value, + 'DV' => $default, + 'TU' => $title, + 'hidden' => $hidden, + 'Q' => $align, + 'maxlen' => $maxlen, + 'BS_W' => $this->form_border_width, + 'BS_S' => $this->form_border_style, + 'BC_C' => $bc_c, + 'BG_C' => $bg_c, + 'style' => array( + 'font' => $this->mpdf->FontFamily, + 'fontsize' => $this->mpdf->FontSizePt, + 'fontcolor' => $this->mpdf->TextColor, + ) + ); + if (is_array($js) && count($js)>0) { $this->SetFormTextJS( $name, $js); } // mPDF 5.3.25 + if ($this->mpdf->keep_block_together) { $this->mpdf->ktForms[]= $f; } + else if ($this->mpdf->writingHTMLheader || $this->mpdf->writingHTMLfooter) { $this->mpdf->HTMLheaderPageForms[]= $f; } + else { + if ($this->mpdf->ColActive) { + $this->mpdf->columnbuffer[] = array('s' => 'ACROFORM', 'col' => $this->mpdf->CurrCol, 'x' => $this->mpdf->x, 'y' => $this->mpdf->y, + 'h' => $h); + $this->mpdf->columnForms[$this->mpdf->CurrCol][INTVAL($this->mpdf->x)][INTVAL($this->mpdf->y)] = $this->formn; + } + $this->forms[$this->formn] = $f; + } + if (!in_array($this->mpdf->FontFamily, $this->form_fonts)) { + $this->form_fonts[] = $this->mpdf->FontFamily; + $this->mpdf->fonts[$this->mpdf->FontFamily]['used'] = true; + } + if ( !$hidden ) $this->mpdf->x += $w; + +} + + + function SetFormChoice( $w, $h, $name, $flags, $array, $align='L', $js = '' ) { + $this->formn++; + if( $this->mpdf->blk[$this->mpdf->blklvl]['direction'] == 'rtl' ) { $align = '2'; } + else { $align = '0'; } + if (!preg_match('/^[a-zA-Z0-9_:\-]+$/', $name)) { + $this->mpdf->Error("Field [".$name."] must have a name attribute, which can only contain letters, numbers, colon(:), undersore(_) or hyphen(-)"); + } + if ($this->mpdf->onlyCoreFonts) { + for($i=0;$i<count($array['VAL']);$i++) { + $array['VAL'][$i] = $this->Win1252ToPDFDocEncoding($array['VAL'][$i]); + $array['OPT'][$i] = $this->Win1252ToPDFDocEncoding($array['OPT'][$i]); + } + } + else { + for($i=0;$i<count($array['VAL']);$i++) { + if (isset($this->mpdf->CurrentFont['subset'])) { + $this->mpdf->UTF8StringToArray($array['VAL'][$i], true); // Add characters to font subset + $this->mpdf->UTF8StringToArray($array['OPT'][$i], true); // Add characters to font subset + } + if ($array['VAL'][$i] ) $array['VAL'][$i] = $this->mpdf->UTF8ToUTF16BE($array['VAL'][$i], true); + if ($array['OPT'][$i] ) $array['OPT'][$i] = $this->mpdf->UTF8ToUTF16BE($array['OPT'][$i], true); + } + } + $f = array( 'n' => $this->formn, + 'typ' => 'Ch', + 'page' => $this->mpdf->page, + 'x' => $this->mpdf->x, + 'y' => $this->mpdf->y, + 'w' => $w, + 'h' => $h, + 'T' => $name, + 'OPT' => $array, + 'FF' => $flags, + 'Q' => $align, + 'BS_W' => $this->form_border_width, + 'BS_S' => $this->form_border_style, + 'BC_C' => $this->form_border_color, + 'BG_C' => $this->form_background_color, + 'style' => array( + 'font' => $this->mpdf->FontFamily, + 'fontsize' => $this->mpdf->FontSizePt, + 'fontcolor' => $this->mpdf->TextColor, + ) + ); + if ($js) { $this->SetFormChoiceJS( $name, $js ); } + if ($this->mpdf->keep_block_together) { $this->mpdf->ktForms[]= $f; } + else if ($this->mpdf->writingHTMLheader || $this->mpdf->writingHTMLfooter) { $this->mpdf->HTMLheaderPageForms[]= $f; } + else { + if ($this->mpdf->ColActive) { + $this->mpdf->columnbuffer[] = array('s' => 'ACROFORM', 'col' => $this->mpdf->CurrCol, 'x' => $this->mpdf->x, 'y' => $this->mpdf->y, + 'h' => $h); + $this->mpdf->columnForms[$this->mpdf->CurrCol][INTVAL($this->mpdf->x)][INTVAL($this->mpdf->y)] = $this->formn; + } + $this->forms[$this->formn] = $f; + } + if (!in_array($this->mpdf->FontFamily, $this->form_fonts)) { + $this->form_fonts[] = $this->mpdf->FontFamily; + $this->mpdf->fonts[$this->mpdf->FontFamily]['used'] = true; + } + $this->mpdf->x += $w; + } + + // CHECKBOX + function SetCheckBox( $w, $h, $name, $value, $title = '', $checked = false, $flags = array(), $disabled=false ) { + $this->SetFormButton( $w, $h, $name, $value, 'checkbox', $title, $flags, $checked, $disabled ); + $this->mpdf->x += $w; + } + + + // RADIO + function SetRadio( $w, $h, $name, $value, $title = '', $checked = false, $flags = array(), $disabled=false ) { + $this->SetFormButton( $w, $h, $name, $value, 'radio', $title, $flags, $checked, $disabled ); + $this->mpdf->x += $w; + } + + + function SetFormReset( $w, $h, $name, $value = 'Reset', $title = '', $flags = array(), $background_col=false, $border_col=false, $noprint=false ) { + if (!$name) { $name = 'Reset'; } + $this->SetFormButton( $w, $h, $name, $value, 'reset', $title, $flags, false, false, $background_col, $border_col, $noprint); + $this->mpdf->x += $w; + } + + + function SetJSButton( $w, $h, $name, $value, $js, $image_id = 0, $title = '', $flags = array(), $indexed=false , $background_col=false, $border_col=false, $noprint=false ) { + $this->SetFormButton( $w, $h, $name, $value, 'js_button', $title, $flags, false, false, $background_col, $border_col, $noprint); + // pos => 1 = no caption, icon only; 0 = caption only + if ($image_id) { + $this->form_button_icon[$this->mpdf->_escape($name)] = array( + 'pos' => 1, + 'image_id' => $image_id, + 'Indexed' => $indexed, + ); + } + if ($js) { $this->SetFormButtonJS( $name, $js ); } + $this->mpdf->x += $w; + } + + + function SetFormSubmit( $w, $h, $name, $value = 'Submit', $url, $title = '', $typ = 'html', $method = 'POST', $flags = array(), $background_col=false, $border_col=false, $noprint=false) { + if (!$name) { $name = 'Submit'; } + $this->SetFormButton( $w, $h, $name, $value, 'submit', $title, $flags, false, false, $background_col, $border_col, $noprint); + $this->forms[$this->formn]['URL'] = $url; + $this->forms[$this->formn]['method'] = $method; + $this->forms[$this->formn]['exporttype'] = $typ; + $this->mpdf->x += $w; + } + + + function SetFormButtonText( $ca, $rc = '', $ac = '' ) { + if ($this->mpdf->onlyCoreFonts) { + $ca = $this->Win1252ToPDFDocEncoding($ca); + if ($rc) $rc = $this->Win1252ToPDFDocEncoding($rc); + if ($ac) $ac = $this->Win1252ToPDFDocEncoding($ac); + } + else { + if (isset($this->mpdf->CurrentFont['subset'])) { + $this->mpdf->UTF8StringToArray($ca, true); // Add characters to font subset + } + $ca = $this->mpdf->UTF8ToUTF16BE($ca, true); + if ($rc) { + if (isset($this->mpdf->CurrentFont['subset'])) { $this->mpdf->UTF8StringToArray($rc, true); } + $rc = $this->mpdf->UTF8ToUTF16BE($rc, true); + } + if ($ac) { + if (isset($this->mpdf->CurrentFont['subset'])) { $this->mpdf->UTF8StringToArray($ac, true); } + $ac = $this->mpdf->UTF8ToUTF16BE($ac, true); + } + } + $this->form_button_text = $ca; + $this->form_button_text_over = $rc ? $rc : $ca; + $this->form_button_text_click = $ac ? $ac : $ca; + } + + + function SetFormButton( $bb, $hh, $name, $value, $type, $title = '', $flags = array(), $checked=false, $disabled=false, $background_col=false, $border_col=false, $noprint=false ) { + $this->formn++; + if (!preg_match('/^[a-zA-Z0-9_:\-]+$/', $name)) { + $this->mpdf->Error("Field [".$name."] must have a name attribute, which can only contain letters, numbers, colon(:), undersore(_) or hyphen(-)"); + } + if (!$this->mpdf->onlyCoreFonts) { + if (isset($this->mpdf->CurrentFont['subset'])) { + $this->mpdf->UTF8StringToArray($title, true); // Add characters to font subset + $this->mpdf->UTF8StringToArray($value, true); // Add characters to font subset + } + $title = $this->mpdf->UTF8ToUTF16BE($title, true); + if ($type == 'checkbox') { + $uvalue = $this->mpdf->UTF8ToUTF16BE($value, true); + } + else if ($type == 'radio') { + $uvalue = $this->mpdf->UTF8ToUTF16BE($value, true); + $value = mb_convert_encoding($value, 'Windows-1252', 'UTF-8'); + } + else { + $value = $this->mpdf->UTF8ToUTF16BE($value, true); + $uvalue = $value; + } + } + else { + $title = $this->Win1252ToPDFDocEncoding($title); + $value = $this->Win1252ToPDFDocEncoding($value); //// ??? not needed + $uvalue = mb_convert_encoding($value, 'UTF-8', 'Windows-1252'); + $uvalue = $this->mpdf->UTF8ToUTF16BE($uvalue, true); + } + if ($type == 'radio' || $type == 'checkbox') { + if (!preg_match('/^[a-zA-Z0-9_:\-\.]+$/', $value)) { + $this->mpdf->Error("Field '".$name."' must have a value, which can only contain letters, numbers, colon(:), undersore(_), hyphen(-) or period(.)"); + } + } + if ($type == 'radio') { + if (!isset($this->form_radio_groups[$name])) { + $this->form_radio_groups[$name] = array( + 'page' => $this->mpdf->page, + 'kids' => array(), + ); + } + $this->form_radio_groups[$name]['kids'][] = array( + 'n' => $this->formn, 'V'=> $value, 'OPT'=>$uvalue, 'disabled'=>$disabled + ); + if ( $checked ) { $this->form_radio_groups[$name]['on'] = $value; } + // Disable the whole radio group if one is disabled, because of inconsistency in PDF readers + if ( $disabled ) { $this->form_radio_groups[$name]['disabled'] = true; } + } + if ($type == 'checkbox') { + $this->form_checkboxes = true; + } + if ( $checked ) { $activ = 1; } + else { $activ = 0; } + if ($background_col) { $bg_c = $this->mpdf->SetColor($background_col, 'CodeOnly'); } + else { $bg_c = $this->form_button_background_color; } + if ($border_col) { $bc_c = $this->mpdf->SetColor($border_col, 'CodeOnly'); } + else { $bc_c = $this->form_button_border_color; } + $f = array( 'n' => $this->formn, + 'typ' => 'Bt', + 'page' => $this->mpdf->page, + 'subtype' => $type, + 'x' => $this->mpdf->x, + 'y' => $this->mpdf->y, + 'w' => $bb, + 'h' => $hh, + 'T' => $name, + 'V' => $value, + 'OPT' => $uvalue, + 'TU' => $title, + 'FF' => $flags, + 'CA' => $this->form_button_text, + 'RC' => $this->form_button_text_over, + 'AC' => $this->form_button_text_click, + 'BS_W' => $this->form_button_border_width, + 'BS_S' => $this->form_button_border_style, + 'BC_C' => $bc_c, + 'BG_C' => $bg_c, + 'activ' => $activ, + 'disabled' => $disabled, + 'noprint' => $noprint, + 'style' => array( + 'font' => $this->mpdf->FontFamily, + 'fontsize' => $this->mpdf->FontSizePt, + 'fontcolor' => $this->mpdf->TextColor, + ) + ); + if ($this->mpdf->keep_block_together) { $this->mpdf->ktForms[]= $f; } + else if ($this->mpdf->writingHTMLheader || $this->mpdf->writingHTMLfooter) { $this->mpdf->HTMLheaderPageForms[]= $f; } + else { + if ($this->mpdf->ColActive) { + $this->mpdf->columnbuffer[] = array('s' => 'ACROFORM', 'col' => $this->mpdf->CurrCol, 'x' => $this->mpdf->x, 'y' => $this->mpdf->y, + 'h' => $hh); + $this->mpdf->columnForms[$this->mpdf->CurrCol][INTVAL($this->mpdf->x)][INTVAL($this->mpdf->y)] = $this->formn; + } + $this->forms[$this->formn] = $f; + } + if (!in_array($this->mpdf->FontFamily, $this->form_fonts)) { + $this->form_fonts[] = $this->mpdf->FontFamily; + $this->mpdf->fonts[$this->mpdf->FontFamily]['used'] = true; + } + + $this->form_button_text = NULL; + $this->form_button_text_over = NULL; + $this->form_button_text_click = NULL; + } + + + +function SetFormBorderWidth ( $string ) { + switch( $string ) { + case 'S': $this->form_border_width = '1'; + break; + case 'M': $this->form_border_width = '2'; + break; + case 'B': $this->form_border_width = '3'; + break; + case '0': $this->form_border_width = '0'; + break; + default: $this->form_border_width = '0'; + break; + } +} + + +function SetFormBorderStyle ( $string ) { + switch( $string ) { + case 'S': $this->form_border_style = 'S'; + break; + case 'D': $this->form_border_style = 'D /D [3]'; + break; + case 'B': $this->form_border_style = 'B'; + break; + case 'I': $this->form_border_style = 'I'; + break; + case 'U': $this->form_border_style = 'U'; + break; + default: $this->form_border_style = 'B'; + break; + } +} + +function SetFormBorderColor ( $r, $g=-1, $b=-1 ) { + if ( ($r==0 and $g==0 and $b==0) || $g==-1 ) + $this->form_border_color = sprintf('%.3F', $r/255); + else + $this->form_border_color = sprintf('%.3F %.3F %.3F', $r/255, $g/255, $b/255); +} + +function SetFormBackgroundColor ( $r, $g=-1, $b=-1 ) { + if ( ($r==0 and $g==0 and $b==0) || $g==-1 ) + $this->form_background_color = sprintf('%.3F', $r/255); + else + $this->form_background_color = sprintf('%.3F %.3F %.3F', $r/255, $g/255, $b/255); +} + +function SetFormD ( $W, $S, $BC, $BG ) { + $this->SetFormBorderWidth ( $W ); + $this->SetFormBorderStyle ( $S ); + $this->SetFormBorderColor ( $BC ); + $this->SetFormBackgroundColor ( $BG ); +} + +function _setflag( $array ) { + $flag = 0; + foreach($array as $val) { $flag += 1 << ($val-1); } + return $flag; +} + +function _form_rect( $x, $y, $w, $h, $hPt ) { + $x = $x * _MPDFK; + $y = $hPt - ($y * _MPDFK); + $x2 = $x + ($w * _MPDFK); + $y2 = $y - ($h * _MPDFK); + $rect = sprintf('%.3F %.3F %.3F %.3F', $x, $y2, $x2, $y ); + return $rect; +} + + +function _put_button_icon( $array , $w, $h ) { + if (isset($array['image_id'])) { + $info = false; + foreach($this->mpdf->images AS $iid=>$img) { + if ($img['i'] == $array['image_id']) { + $info = $this->mpdf->images[$iid]; + break; + } + } + } + if (!$info) { die("Cannot find Button image"); } + $this->mpdf->_newobj(); + $this->mpdf->_out('<<'); + $this->mpdf->_out('/Type /XObject'); + $this->mpdf->_out('/Subtype /Image'); + $this->mpdf->_out('/BBox [0 0 1 1]'); + $this->mpdf->_out('/Length '.strlen($info['data'])); + $this->mpdf->_out('/BitsPerComponent '.$info['bpc']); + if ($info['cs']=='Indexed') { + $this->mpdf->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->mpdf->n+1).' 0 R]'); + } + else { + $this->mpdf->_out('/ColorSpace /'.$info['cs']); + if ($info['cs']=='DeviceCMYK') + if($info['type']=='jpg') { $this->mpdf->_out('/Decode [1 0 1 0 1 0 1 0]'); } + } + if ( isset($info['f']) ) + $this->mpdf->_out('/Filter /'.$info['f']); + if ( isset($info['parms']) ) + $this->mpdf->_out($info['parms']); + $this->mpdf->_out('/Width '.$info['w']); + $this->mpdf->_out('/Height '.$info['h']); + $this->mpdf->_out('>>'); + $this->mpdf->_putstream($info['data']); + $this->mpdf->_out('endobj'); + unset($array); + //Palette + if($info['cs']=='Indexed') { + $filter=($this->mpdf->compress) ? '/Filter /FlateDecode ' : ''; + $this->mpdf->_newobj(); + $pal=($this->mpdf->compress) ? gzcompress($info['pal']) : $info['pal']; + $this->mpdf->_out('<<'.$filter.'/Length '.strlen($pal).'>>'); + $this->mpdf->_putstream($pal); + $this->mpdf->_out('endobj'); + } + +} + + +function _putform_bt( $form, $hPt ) { + $cc = 0; + $put_xobject = 0; + $put_js = 0; + $put_icon = 0; + $this->mpdf->_newobj(); + $n = $this->mpdf->n; + if ($form['subtype'] != 'radio') $this->pdf_acro_array .= $n.' 0 R '; // Add to /Field element + $this->forms[ $form['n'] ]['obj'] = $n; + $this->mpdf->_out('<<'); + $this->mpdf->_out('/Type /Annot '); + $this->mpdf->_out('/Subtype /Widget'); + $this->mpdf->_out('/NM '.$this->mpdf->_textstring(sprintf('%04u-%04u', $n, (7000 + $form['n'])))); + $this->mpdf->_out('/M '.$this->mpdf->_textstring('D:'.date('YmdHis'))); + $this->mpdf->_out('/Rect [ '.$this->_form_rect($form['x'],$form['y'],$form['w'],$form['h'], $hPt).' ]'); + $form['noprint'] ? $this->mpdf->_out('/F 0 ') : $this->mpdf->_out('/F 4 '); + $this->mpdf->_out('/FT /Btn '); + $this->mpdf->_out('/H /P '); + if ( $form['subtype'] != 'radio' ) // mPDF 5.3.23 + $this->mpdf->_out('/T '.$this->mpdf->_textstring($form['T']) ); + $this->mpdf->_out('/TU '.$this->mpdf->_textstring($form['TU']) ); + if ( isset( $this->form_button_icon[ $form['T'] ] ) ) { $form['BS_W'] = 0; } + if ($form['BS_W'] == 0) { $form['BC_C'] = $form['BG_C']; } + $bstemp = ''; + $bstemp .= '/W '.$form['BS_W'].' '; + $bstemp .= '/S /'.$form['BS_S'].' '; + $temp = ''; + $temp .= '/BC [ '.$form['BC_C']." ] "; + $temp .= '/BG [ '.$form['BG_C']." ] "; + if ( $form['subtype'] == 'checkbox' ) { + if ($form['disabled']) { + $radio_color = '0.5 0.5 0.5'; + $radio_background_color = '0.9 0.9 0.9'; + } + else { + $radio_color = $this->form_radio_color; + $radio_background_color = $this->form_radio_background_color; + } + $temp = ''; + $temp .= '/BC [ '.$radio_color." ] "; + $temp .= '/BG [ '.$radio_background_color." ] "; + $this->mpdf->_out("/BS << /W 1 /S /S >>"); + $this->mpdf->_out("/MK << $temp >>"); + $this->mpdf->_out('/Ff '.$this->_setflag($form['FF']) ); + if ( $form['activ'] ) { + $this->mpdf->_out('/V /'.$this->mpdf->_escape($form['V']).' '); + $this->mpdf->_out('/DV /'.$this->mpdf->_escape($form['V']).' '); + $this->mpdf->_out('/AS /'.$this->mpdf->_escape($form['V']).' '); + } else { + $this->mpdf->_out('/AS /Off '); + } + if ($this->formUseZapD) { + $this->mpdf->_out('/DA (/F'.$this->mpdf->fonts['czapfdingbats']['i'].' 0 Tf '.$radio_color.' rg)'); + $this->mpdf->_out("/AP << /N << /".$this->mpdf->_escape($form['V'])." ".($this->mpdf->n+1)." 0 R /Off /Off >> >>"); + } + else { + $this->mpdf->_out('/DA (/F'.$this->mpdf->fonts[$this->mpdf->CurrentFont['fontkey']]['i'].' 0 Tf '.$radio_color.' rg)'); + $this->mpdf->_out("/AP << /N << /".$this->mpdf->_escape($form['V'])." ".($this->mpdf->n+1)." 0 R /Off ".($this->mpdf->n+2)." 0 R >> >>"); + } + $this->mpdf->_out('/Opt [ '.$this->mpdf->_textstring($form['OPT']).' '.$this->mpdf->_textstring($form['OPT']).' ]'); + } + + + if ( $form['subtype'] == 'radio' ) { + if ($form['disabled'] || $this->form_radio_groups[$form['T']]['disabled']) { + $radio_color = '0.5 0.5 0.5'; + $radio_background_color = '0.9 0.9 0.9'; + } + else { + $radio_color = $this->form_radio_color; + $radio_background_color = $this->form_radio_background_color; + } + $this->mpdf->_out('/Parent '.$this->form_radio_groups[$form['T']]['obj_id'].' 0 R '); + $temp = ''; + $temp .= '/BC [ '.$radio_color." ] "; + $temp .= '/BG [ '.$radio_background_color." ] "; + $this->mpdf->_out("/BS << /W 1 /S /S >>"); + $this->mpdf->_out('/MK << '.$temp.' >> '); + $form['FF'][] = 16; // Radiobutton + $form['FF'][] = 15; // NoToggleOff - must be same as radio button group setting? + $this->mpdf->_out('/Ff '.$this->_setflag($form['FF']) ); + if ($this->formUseZapD) + $this->mpdf->_out('/DA (/F'.$this->mpdf->fonts['czapfdingbats']['i'].' 0 Tf '.$radio_color.' rg)'); + else + $this->mpdf->_out('/DA (/F'.$this->mpdf->fonts[$this->mpdf->CurrentFont['fontkey']]['i'].' 0 Tf '.$radio_color.' rg)'); + $this->mpdf->_out("/AP << /N << /".$this->mpdf->_escape($form['V'])." ".($this->mpdf->n+1)." 0 R /Off ".($this->mpdf->n+2)." 0 R >> >>"); + if ( $form['activ'] ) { + $this->mpdf->_out('/V /'.$this->mpdf->_escape($form['V']).' '); + $this->mpdf->_out('/DV /'.$this->mpdf->_escape($form['V']).' '); + $this->mpdf->_out('/AS /'.$this->mpdf->_escape($form['V']).' '); + } + else { + $this->mpdf->_out('/AS /Off '); + } + $this->mpdf->_out("/AP << /N << /".$this->mpdf->_escape($form['V'])." ".($this->mpdf->n+1)." 0 R /Off ".($this->mpdf->n+2)." 0 R >> >>"); + // $this->mpdf->_out('/Opt [ '.$this->mpdf->_textstring($form['OPT']).' '.$this->mpdf->_textstring($form['OPT']).' ]'); + } + + if ( $form['subtype'] == 'reset' ) { + $temp .= $form['CA'] ? '/CA '.$this->mpdf->_textstring($form['CA']).' ' : '/CA '.$this->mpdf->_textstring($form['T']).' '; + $temp .= $form['RC'] ? '/RC '.$this->mpdf->_textstring($form['RC']).' ' : '/RC '.$this->mpdf->_textstring($form['T']).' '; + $temp .= $form['AC'] ? '/AC '.$this->mpdf->_textstring($form['AC']).' ' : '/AC '.$this->mpdf->_textstring($form['T']).' '; + $this->mpdf->_out("/BS << $bstemp >>"); + $this->mpdf->_out('/MK << '.$temp.' >>'); + $this->mpdf->_out('/DA (/F'.$this->mpdf->fonts[$form['style']['font']]['i'].' '.$form['style']['fontsize'].' Tf '.$form['style']['fontcolor'].')'); + $this->mpdf->_out('/AA << /D << /S /ResetForm /Flags 1 >> >>'); + $form['FF'][] = 17; + $this->mpdf->_out('/Ff '.$this->_setflag($form['FF']) ); + } + + + if ( $form['subtype'] == 'submit' ) { + $temp .= $form['CA'] ? '/CA '.$this->mpdf->_textstring($form['CA']).' ' : '/CA '.$this->mpdf->_textstring($form['T']).' '; + $temp .= $form['RC'] ? '/RC '.$this->mpdf->_textstring($form['RC']).' ' : '/RC '.$this->mpdf->_textstring($form['T']).' '; + $temp .= $form['AC'] ? '/AC '.$this->mpdf->_textstring($form['AC']).' ' : '/AC '.$this->mpdf->_textstring($form['T']).' '; + $this->mpdf->_out("/BS << $bstemp >>"); + $this->mpdf->_out("/MK << $temp >>"); + $this->mpdf->_out('/DA (/F'.$this->mpdf->fonts[$form['style']['font']]['i'].' '.$form['style']['fontsize'].' Tf '.$form['style']['fontcolor'].')'); + // Bit 4 (8) = useGETmethod else use POST + // Bit 3 (4) = HTML export format (charset chosen by Adobe)--- OR --- + // Bit 6 (32) = XFDF export format (form of XML in UTF-8) + if ($form['exporttype'] == 'xfdf') { $flag = 32; } // 'xfdf' or 'html' + else { + if ($form['method'] == 'GET') { $flag = 12; } + else { $flag = 4; } + } + // Bit 2 (2) = IncludeNoValueFields + if ($this->formSubmitNoValueFields) $flag += 2; + // To submit a value, needs to be in /AP dictionary, AND this object must contain a /Fields entry + // listing all fields to output + $this->mpdf->_out('/AA << /D << /S /SubmitForm /F ('.$form['URL'].') /Flags '.$flag.' >> >>'); + $form['FF'][] = 17; + $this->mpdf->_out('/Ff '.$this->_setflag($form['FF']) ); + } + + if ( $form['subtype'] == 'js_button' ) { + // Icon / image + if ( isset( $this->form_button_icon[ $form['T'] ] ) ) { + $cc++; + $temp .= '/TP '.$this->form_button_icon[$form['T']]['pos'].' '; + $temp .= '/I '.($cc + $this->mpdf->n).' 0 R '; // Normal icon + $temp .= '/RI '.($cc + $this->mpdf->n).' 0 R '; // onMouseOver + $temp .= '/IX '.($cc + $this->mpdf->n).' 0 R '; // onClick / onMouseDown + $temp .= '/IF << /SW /A /S /A /A [0.0 0.0] >> '; // Icon fit dictionary + if ($this->form_button_icon[ $form['T'] ]['Indexed']) { $cc++; } + $put_icon = 1; + } + $temp .= $form['CA'] ? '/CA '.$this->mpdf->_textstring($form['CA']).' ' : '/CA '.$this->mpdf->_textstring($form['T']).' '; + $temp .= $form['RC'] ? '/RC '.$this->mpdf->_textstring($form['RC']).' ' : '/RC '.$this->mpdf->_textstring($form['T']).' '; + $temp .= $form['AC'] ? '/AC '.$this->mpdf->_textstring($form['AC']).' ' : '/AC '.$this->mpdf->_textstring($form['T']).' '; + $this->mpdf->_out("/BS << $bstemp >>"); + $this->mpdf->_out("/MK << $temp >>"); + $this->mpdf->_out('/DA (/F'.$this->mpdf->fonts[$form['style']['font']]['i'].' '.$form['style']['fontsize'].' Tf '.$form['style']['fontcolor'].')'); + $form['FF'][] = 17; + $this->mpdf->_out('/Ff '.$this->_setflag($form['FF']) ); + // Javascript + if ( isset($this->array_form_button_js[$form['T']]) ) { + $cc++; + $this->mpdf->_out("/AA << /D ".($cc + $this->mpdf->n)." 0 R >>"); + $put_js = 1; + } + } + + $this->mpdf->_out('>>'); + $this->mpdf->_out('endobj'); + + // additional objects + // obj icon + if ( $put_icon == 1 ) { + $this->_put_button_icon( $this->form_button_icon[ $form['T'] ], $form['w'], $form['h'] ); + $put_icon = NULL; + } + // obj + 1 + if ( $put_js == 1 ) { + $this->mpdf->_set_object_javascript( $this->array_form_button_js[$form['T']]['js'] ); + unset( $this->array_form_button_js[$form['T']] ); + $put_js = NULL; + } + + // RADIO and CHECK BOX appearance streams + $filter=($this->mpdf->compress) ? '/Filter /FlateDecode ' : ''; + if ( $form['subtype'] == 'radio' ) { + // output 2 appearance streams for radio buttons on/off + if ($this->formUseZapD) { + $fs = sprintf('%.3F', $form['style']['fontsize']*1.25); + $fi = 'czapfdingbats'; + $r_on = 'q '.$radio_color .' rg BT /F'.$this->mpdf->fonts[$fi]['i'].' '.$fs.' Tf 0 0 Td (4) Tj ET Q'; + $r_off = 'q '.$radio_color .' rg BT /F'.$this->mpdf->fonts[$fi]['i'].' '.$fs.' Tf 0 0 Td (8) Tj ET Q'; + } + else { + $matrix = sprintf('%.3F 0 0 %.3F 0 %.3F', $form['style']['fontsize']*1.33/10, $form['style']['fontsize']*1.25/10, $form['style']['fontsize']); + $fill = $radio_background_color.' rg 3.778 -7.410 m 2.800 -7.410 1.947 -7.047 1.225 -6.322 c 0.500 -5.600 0.138 -4.747 0.138 -3.769 c 0.138 -2.788 0.500 -1.938 1.225 -1.213 c 1.947 -0.491 2.800 -0.128 3.778 -0.128 c 4.757 -0.128 5.610 -0.491 6.334 -1.213 c 7.056 -1.938 7.419 -2.788 7.419 -3.769 c 7.419 -4.747 7.056 -5.600 6.334 -6.322 c 5.610 -7.047 4.757 -7.410 3.778 -7.410 c h f '; + $circle = '3.778 -6.963 m 4.631 -6.963 5.375 -6.641 6.013 -6.004 c 6.653 -5.366 6.972 -4.619 6.972 -3.769 c 6.972 -2.916 6.653 -2.172 6.013 -1.532 c 5.375 -0.894 4.631 -0.576 3.778 -0.576 c 2.928 -0.576 2.182 -0.894 1.544 -1.532 c 0.904 -2.172 0.585 -2.916 0.585 -3.769 c 0.585 -4.619 0.904 -5.366 1.544 -6.004 c 2.182 -6.641 2.928 -6.963 3.778 -6.963 c h 3.778 -7.410 m 2.800 -7.410 1.947 -7.047 1.225 -6.322 c 0.500 -5.600 0.138 -4.747 0.138 -3.769 c 0.138 -2.788 0.500 -1.938 1.225 -1.213 c 1.947 -0.491 2.800 -0.128 3.778 -0.128 c 4.757 -0.128 5.610 -0.491 6.334 -1.213 c 7.056 -1.938 7.419 -2.788 7.419 -3.769 c 7.419 -4.747 7.056 -5.600 6.334 -6.322 c 5.610 -7.047 4.757 -7.410 3.778 -7.410 c h f '; + $r_on = 'q '.$matrix.' cm '.$fill .$radio_color.' rg '.$circle.' '.$radio_color.' rg +5.184 -5.110 m 4.800 -5.494 4.354 -5.685 3.841 -5.685 c 3.331 -5.685 2.885 -5.494 2.501 -5.110 c 2.119 -4.725 1.925 -4.279 1.925 -3.769 c 1.925 -3.257 2.119 -2.810 2.501 -2.429 c 2.885 -2.044 3.331 -1.853 3.841 -1.853 c 4.354 -1.853 4.800 -2.044 5.184 -2.429 c 5.566 -2.810 5.760 -3.257 5.760 -3.769 c 5.760 -4.279 5.566 -4.725 5.184 -5.110 c h +f Q '; + $r_off = 'q '.$matrix.' cm '.$fill .$radio_color.' rg '.$circle.' Q '; + } + + $this->mpdf->_newobj(); + $p=($this->mpdf->compress) ? gzcompress($r_on) : $r_on; + $this->mpdf->_out('<<'.$filter.'/Length '.strlen($p).' /Resources 2 0 R>>'); + $this->mpdf->_putstream($p); + $this->mpdf->_out('endobj'); + + $this->mpdf->_newobj(); + $p=($this->mpdf->compress) ? gzcompress($r_off) : $r_off; + $this->mpdf->_out('<<'.$filter.'/Length '.strlen($p).' /Resources 2 0 R>>'); + $this->mpdf->_putstream($p); + $this->mpdf->_out('endobj'); + } + if ( $form['subtype'] == 'checkbox' ) { + // First output appearance stream for check box on + if ($this->formUseZapD) { + $fs = sprintf('%.3F', $form['style']['fontsize']*1.25); + $fi = 'czapfdingbats'; + $cb_on = 'q '.$radio_color .' rg BT /F'.$this->mpdf->fonts[$fi]['i'].' '.$fs.' Tf 0 0 Td (4) Tj ET Q'; + $cb_off = 'q '.$radio_color .' rg BT /F'.$this->mpdf->fonts[$fi]['i'].' '.$fs.' Tf 0 0 Td (8) Tj ET Q'; + } + else { + $matrix = sprintf('%.3F 0 0 %.3F 0 %.3F', $form['style']['fontsize']*1.33/10, $form['style']['fontsize']*1.25/10, $form['style']['fontsize']); + $fill = $radio_background_color.' rg 7.395 -0.070 m 7.395 -7.344 l 0.121 -7.344 l 0.121 -0.070 l 7.395 -0.070 l h f '; + $square = '0.508 -6.880 m 6.969 -6.880 l 6.969 -0.534 l 0.508 -0.534 l 0.508 -6.880 l h 7.395 -0.070 m 7.395 -7.344 l 0.121 -7.344 l 0.121 -0.070 l 7.395 -0.070 l h '; + $cb_on = 'q '.$matrix.' cm '.$fill. $radio_color.' rg '.$square.' f '.$radio_color.' rg +6.321 -1.352 m 5.669 -2.075 5.070 -2.801 4.525 -3.532 c 3.979 -4.262 3.508 -4.967 3.112 -5.649 c 3.080 -5.706 3.039 -5.779 2.993 -5.868 c 2.858 -6.118 2.638 -6.243 2.334 -6.243 c 2.194 -6.243 2.100 -6.231 2.052 -6.205 c 2.003 -6.180 1.954 -6.118 1.904 -6.020 c 1.787 -5.788 1.688 -5.523 1.604 -5.226 c 1.521 -4.930 1.480 -4.721 1.480 -4.600 c 1.480 -4.535 1.491 -4.484 1.512 -4.447 c 1.535 -4.410 1.579 -4.367 1.647 -4.319 c 1.733 -4.259 1.828 -4.210 1.935 -4.172 c 2.040 -4.134 2.131 -4.115 2.205 -4.115 c 2.267 -4.115 2.341 -4.232 2.429 -4.469 c 2.437 -4.494 2.444 -4.511 2.448 -4.522 c 2.451 -4.531 2.456 -4.546 2.465 -4.568 c 2.546 -4.795 2.614 -4.910 2.668 -4.910 c 2.714 -4.910 2.898 -4.652 3.219 -4.136 c 3.539 -3.620 3.866 -3.136 4.197 -2.683 c 4.426 -2.367 4.633 -2.103 4.816 -1.889 c 4.998 -1.676 5.131 -1.544 5.211 -1.493 c 5.329 -1.426 5.483 -1.368 5.670 -1.319 c 5.856 -1.271 6.066 -1.238 6.296 -1.217 c 6.321 -1.352 l h f Q '; + $cb_off = 'q '.$matrix.' cm '.$fill. $radio_color.' rg '.$square.' f Q '; + + } + $this->mpdf->_newobj(); + $p=($this->mpdf->compress) ? gzcompress($cb_on) : $cb_on; + $this->mpdf->_out('<<'.$filter.'/Length '.strlen($p).' /Resources 2 0 R>>'); + $this->mpdf->_putstream($p); + $this->mpdf->_out('endobj'); + + // output appearance stream for check box off (only if not using ZapfDingbats) + if (!$this->formUseZapD) { + $this->mpdf->_newobj(); + $p=($this->mpdf->compress) ? gzcompress($cb_off) : $cb_off; + $this->mpdf->_out('<<'.$filter.'/Length '.strlen($p).' /Resources 2 0 R>>'); + $this->mpdf->_putstream($p); + $this->mpdf->_out('endobj'); + } + + } + return $n; +} + + +function _putform_ch( $form, $hPt ) { + $put_js = 0; + $this->mpdf->_newobj(); + $n = $this->mpdf->n; + $this->pdf_acro_array .= $n.' 0 R '; + $this->forms[ $form['n'] ]['obj'] = $n; + + $this->mpdf->_out('<<'); + $this->mpdf->_out('/Type /Annot '); + $this->mpdf->_out('/Subtype /Widget'); + $this->mpdf->_out('/Rect [ '.$this->_form_rect($form['x'],$form['y'],$form['w'],$form['h'], $hPt).' ]'); + $this->mpdf->_out('/F 4'); + $this->mpdf->_out('/FT /Ch'); + if ($form['Q']) $this->mpdf->_out('/Q '.$form['Q'].''); + $temp = ''; + $temp .= '/W '.$form['BS_W'].' '; + $temp .= '/S /'.$form['BS_S'].' '; + $this->mpdf->_out("/BS << $temp >>"); + + $temp = ''; + $temp .= '/BC [ '.$form['BC_C']." ] "; + $temp .= '/BG [ '.$form['BG_C']." ] "; + $this->mpdf->_out('/MK << '.$temp.' >>'); + + $this->mpdf->_out('/NM '.$this->mpdf->_textstring(sprintf('%04u-%04u', $n, (6000 + $form['n'])))); + $this->mpdf->_out('/M '.$this->mpdf->_textstring('D:'.date('YmdHis'))); + + $this->mpdf->_out('/T '.$this->mpdf->_textstring($form['T']) ); + $this->mpdf->_out('/DA (/F'.$this->mpdf->fonts[$form['style']['font']]['i'].' '.$form['style']['fontsize'].' Tf '.$form['style']['fontcolor'].')'); + + $opt = ''; + for( $i = 0; $i < count($form['OPT']['VAL']) ; $i++ ) { + $opt .= '[ '.$this->mpdf->_textstring($form['OPT']['VAL'][$i]).' '.$this->mpdf->_textstring($form['OPT']['OPT'][$i]).' ] '; + } + $this->mpdf->_out('/Opt [ '.$opt.']'); + + // selected + $selectItem = false; + $selectIndex = false; + foreach ( $form['OPT']['SEL'] as $selectKey => $selectVal ) { + $selectName = $this->mpdf->_textstring($form['OPT']['VAL'][$selectVal]); + $selectItem .= ' '.$selectName.' '; + $selectIndex .= ' '.$selectVal.' '; + } + if ( $selectItem ) { + if (count($form['OPT']['SEL']) < 2) { + $this->mpdf->_out('/V '.$selectItem.' '); + $this->mpdf->_out('/DV '.$selectItem.' '); + } + else { + $this->mpdf->_out('/V ['.$selectItem.'] '); + $this->mpdf->_out('/DV ['.$selectItem.'] '); + } + $this->mpdf->_out('/I ['.$selectIndex.'] '); + } + + if ( is_array($form['FF']) && count($form['FF'])>0 ) { + $this->mpdf->_out('/Ff '.$this->_setflag($form['FF']).' '); + } + // Javascript + if ( isset($this->array_form_choice_js[$form['T']]) ) { + $this->mpdf->_out("/AA << /V ".($this->mpdf->n+1)." 0 R >>"); + $put_js = 1; + } + + $this->mpdf->_out('>>'); + $this->mpdf->_out('endobj'); + // obj + 1 + if ( $put_js == 1 ) { + $this->mpdf->_set_object_javascript( $this->array_form_choice_js[$form['T']]['js'] ); + unset( $this->array_form_choice_js[$form['T']] ); + $put_js = NULL; + } + + return $n; +} + + +function _putform_tx( $form, $hPt ) { + $put_js = 0; + $this->mpdf->_newobj(); + $n = $this->mpdf->n; + $this->pdf_acro_array .= $n.' 0 R '; + $this->forms[ $form['n'] ]['obj'] = $n; + + $this->mpdf->_out('<<'); + $this->mpdf->_out('/Type /Annot '); + $this->mpdf->_out('/Subtype /Widget '); + + $this->mpdf->_out('/Rect [ '.$this->_form_rect($form['x'],$form['y'],$form['w'],$form['h'], $hPt).' ] '); + $form['hidden'] ? $this->mpdf->_out('/F 2 ') : $this->mpdf->_out('/F 4 '); + $this->mpdf->_out('/FT /Tx '); + + $this->mpdf->_out('/H /N '); + $this->mpdf->_out('/R 0 '); + + if ( is_array($form['FF']) && count($form['FF'])>0 ) { + $this->mpdf->_out('/Ff '.$this->_setflag($form['FF']).' '); + } + if ( isset($form['maxlen']) && $form['maxlen']>0 ) { + $this->mpdf->_out('/MaxLen '.$form['maxlen']); + } + + $temp = ''; + $temp .= '/W '.$form['BS_W'].' '; + $temp .= '/S /'.$form['BS_S'].' '; + $this->mpdf->_out("/BS << $temp >>"); + + $temp = ''; + $temp .= '/BC [ '.$form['BC_C']." ] "; + $temp .= '/BG [ '.$form['BG_C']." ] "; + $this->mpdf->_out('/MK <<'.$temp.' >>'); + + $this->mpdf->_out('/T '.$this->mpdf->_textstring($form['T']) ); + $this->mpdf->_out('/TU '.$this->mpdf->_textstring($form['TU']) ); + if ($form['V'] || $form['V']==='0') + $this->mpdf->_out('/V '.$this->mpdf->_textstring($form['V']) ); + $this->mpdf->_out('/DV '.$this->mpdf->_textstring($form['DV']) ); + $this->mpdf->_out('/DA (/F'.$this->mpdf->fonts[$form['style']['font']]['i'].' '.$form['style']['fontsize'].' Tf '.$form['style']['fontcolor'].')'); + if ( $form['Q'] ) $this->mpdf->_out('/Q '.$form['Q'].''); + + $this->mpdf->_out('/NM '.$this->mpdf->_textstring(sprintf('%04u-%04u', $n, (5000 + $form['n'])))); + $this->mpdf->_out('/M '.$this->mpdf->_textstring('D:'.date('YmdHis'))); + + + if ( isset($this->array_form_text_js[$form['T']]) ) { + $put_js = 1; + $cc = 0; + $js_str = ''; + + if ( isset($this->array_form_text_js[$form['T']]['F']) ) { + $cc++; + $js_str .= '/F '.($cc + $this->mpdf->n).' 0 R '; + } + if ( isset($this->array_form_text_js[$form['T']]['K']) ) { + $cc++; + $js_str .= '/K '.($cc + $this->mpdf->n).' 0 R '; + } + if ( isset($this->array_form_text_js[$form['T']]['V']) ) { + $cc++; + $js_str .= '/V '.($cc + $this->mpdf->n).' 0 R '; + } + if ( isset($this->array_form_text_js[$form['T']]['C']) ) { + $cc++; + $js_str .= '/C '.($cc + $this->mpdf->n).' 0 R '; + $this->pdf_array_co .= $this->mpdf->n.' 0 R '; + } + $this->mpdf->_out('/AA << '.$js_str.' >>'); + } + + $this->mpdf->_out('>>'); + $this->mpdf->_out('endobj'); + + if ( $put_js == 1 ) { + if ( isset($this->array_form_text_js[$form['T']]['F']) ) { + $this->mpdf->_set_object_javascript( $this->array_form_text_js[$form['T']]['F']['js'] ); + unset( $this->array_form_text_js[$form['T']]['F'] ); + } + if ( isset($this->array_form_text_js[$form['T']]['K']) ) { + $this->mpdf->_set_object_javascript( $this->array_form_text_js[$form['T']]['K']['js'] ); + unset( $this->array_form_text_js[$form['T']]['K'] ); + } + if ( isset($this->array_form_text_js[$form['T']]['V']) ) { + $this->mpdf->_set_object_javascript( $this->array_form_text_js[$form['T']]['V']['js'] ); + unset( $this->array_form_text_js[$form['T']]['V'] ); + } + if ( isset($this->array_form_text_js[$form['T']]['C']) ) { + $this->mpdf->_set_object_javascript( $this->array_form_text_js[$form['T']]['C']['js'] ); + unset( $this->array_form_text_js[$form['T']]['C'] ); + } + } + return $n; +} + + + +} + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/classes/gif.php b/application/third_party/mpdf/classes/gif.php new file mode 100644 index 0000000..582de0d --- /dev/null +++ b/application/third_party/mpdf/classes/gif.php @@ -0,0 +1,700 @@ +<?php +/////////////////////////////////////////////////////////////////////////////////////////////////// +// 2009-12-22 Adapted for mPDF 4.2 +/////////////////////////////////////////////////////////////////////////////////////////////////// +// GIF Util - (C) 2003 Yamasoft (S/C) +// http://www.yamasoft.com +// All Rights Reserved +// This file can be freely copied, distributed, modified, updated by anyone under the only +// condition to leave the original address (Yamasoft, http://www.yamasoft.com) and this header. +/////////////////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////////// +// 2009-12-22 Adapted INB +// Functions calling functionname($x, $len = 0) were not working on PHP5.1.5 as pass by reference +// All edited to $len = 0; then call function. +/////////////////////////////////////////////////////////////////////////////////////////////////// + + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +class CGIFLZW +{ + var $MAX_LZW_BITS; + var $Fresh, $CodeSize, $SetCodeSize, $MaxCode, $MaxCodeSize, $FirstCode, $OldCode; + var $ClearCode, $EndCode, $Next, $Vals, $Stack, $sp, $Buf, $CurBit, $LastBit, $Done, $LastByte; + + /////////////////////////////////////////////////////////////////////////// + + // CONSTRUCTOR + function CGIFLZW() + { + $this->MAX_LZW_BITS = 12; + unSet($this->Next); + unSet($this->Vals); + unSet($this->Stack); + unSet($this->Buf); + + $this->Next = range(0, (1 << $this->MAX_LZW_BITS) - 1); + $this->Vals = range(0, (1 << $this->MAX_LZW_BITS) - 1); + $this->Stack = range(0, (1 << ($this->MAX_LZW_BITS + 1)) - 1); + $this->Buf = range(0, 279); + } + + /////////////////////////////////////////////////////////////////////////// + + function deCompress($data, &$datLen) + { + $stLen = strlen($data); + $datLen = 0; + $ret = ""; + $dp = 0; // data pointer + + // INITIALIZATION + $this->LZWCommandInit($data, $dp); + + while(($iIndex = $this->LZWCommand($data, $dp)) >= 0) { + $ret .= chr($iIndex); + } + + $datLen = $dp; + + if($iIndex != -2) { + return false; + } + + return $ret; + } + + /////////////////////////////////////////////////////////////////////////// + function LZWCommandInit(&$data, &$dp) + { + $this->SetCodeSize = ord($data[0]); + $dp += 1; + + $this->CodeSize = $this->SetCodeSize + 1; + $this->ClearCode = 1 << $this->SetCodeSize; + $this->EndCode = $this->ClearCode + 1; + $this->MaxCode = $this->ClearCode + 2; + $this->MaxCodeSize = $this->ClearCode << 1; + + $this->GetCodeInit($data, $dp); + + $this->Fresh = 1; + for($i = 0; $i < $this->ClearCode; $i++) { + $this->Next[$i] = 0; + $this->Vals[$i] = $i; + } + + for(; $i < (1 << $this->MAX_LZW_BITS); $i++) { + $this->Next[$i] = 0; + $this->Vals[$i] = 0; + } + + $this->sp = 0; + return 1; + } + + function LZWCommand(&$data, &$dp) + { + if($this->Fresh) { + $this->Fresh = 0; + do { + $this->FirstCode = $this->GetCode($data, $dp); + $this->OldCode = $this->FirstCode; + } + while($this->FirstCode == $this->ClearCode); + + return $this->FirstCode; + } + + if($this->sp > 0) { + $this->sp--; + return $this->Stack[$this->sp]; + } + + while(($Code = $this->GetCode($data, $dp)) >= 0) { + if($Code == $this->ClearCode) { + for($i = 0; $i < $this->ClearCode; $i++) { + $this->Next[$i] = 0; + $this->Vals[$i] = $i; + } + + for(; $i < (1 << $this->MAX_LZW_BITS); $i++) { + $this->Next[$i] = 0; + $this->Vals[$i] = 0; + } + + $this->CodeSize = $this->SetCodeSize + 1; + $this->MaxCodeSize = $this->ClearCode << 1; + $this->MaxCode = $this->ClearCode + 2; + $this->sp = 0; + $this->FirstCode = $this->GetCode($data, $dp); + $this->OldCode = $this->FirstCode; + + return $this->FirstCode; + } + + if($Code == $this->EndCode) { + return -2; + } + + $InCode = $Code; + if($Code >= $this->MaxCode) { + $this->Stack[$this->sp++] = $this->FirstCode; + $Code = $this->OldCode; + } + + while($Code >= $this->ClearCode) { + $this->Stack[$this->sp++] = $this->Vals[$Code]; + + if($Code == $this->Next[$Code]) // Circular table entry, big GIF Error! + return -1; + + $Code = $this->Next[$Code]; + } + + $this->FirstCode = $this->Vals[$Code]; + $this->Stack[$this->sp++] = $this->FirstCode; + + if(($Code = $this->MaxCode) < (1 << $this->MAX_LZW_BITS)) { + $this->Next[$Code] = $this->OldCode; + $this->Vals[$Code] = $this->FirstCode; + $this->MaxCode++; + + if(($this->MaxCode >= $this->MaxCodeSize) && ($this->MaxCodeSize < (1 << $this->MAX_LZW_BITS))) { + $this->MaxCodeSize *= 2; + $this->CodeSize++; + } + } + + $this->OldCode = $InCode; + if($this->sp > 0) { + $this->sp--; + return $this->Stack[$this->sp]; + } + } + + return $Code; + } + + /////////////////////////////////////////////////////////////////////////// + + function GetCodeInit(&$data, &$dp) + { + $this->CurBit = 0; + $this->LastBit = 0; + $this->Done = 0; + $this->LastByte = 2; + return 1; + } + + function GetCode(&$data, &$dp) + { + if(($this->CurBit + $this->CodeSize) >= $this->LastBit) { + if($this->Done) { + if($this->CurBit >= $this->LastBit) { + // Ran off the end of my bits + return 0; + } + return -1; + } + + $this->Buf[0] = $this->Buf[$this->LastByte - 2]; + $this->Buf[1] = $this->Buf[$this->LastByte - 1]; + + $Count = ord($data[$dp]); + $dp += 1; + + if($Count) { + for($i = 0; $i < $Count; $i++) { + $this->Buf[2 + $i] = ord($data[$dp+$i]); + } + $dp += $Count; + } + else { + $this->Done = 1; + } + + $this->LastByte = 2 + $Count; + $this->CurBit = ($this->CurBit - $this->LastBit) + 16; + $this->LastBit = (2 + $Count) << 3; + } + + $iRet = 0; + for($i = $this->CurBit, $j = 0; $j < $this->CodeSize; $i++, $j++) { + $iRet |= (($this->Buf[intval($i / 8)] & (1 << ($i % 8))) != 0) << $j; + } + + $this->CurBit += $this->CodeSize; + return $iRet; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +class CGIFCOLORTABLE +{ + var $m_nColors; + var $m_arColors; + + /////////////////////////////////////////////////////////////////////////// + + // CONSTRUCTOR + function CGIFCOLORTABLE() + { + unSet($this->m_nColors); + unSet($this->m_arColors); + } + + /////////////////////////////////////////////////////////////////////////// + + function load($lpData, $num) + { + $this->m_nColors = 0; + $this->m_arColors = array(); + + for($i = 0; $i < $num; $i++) { + $rgb = substr($lpData, $i * 3, 3); + if(strlen($rgb) < 3) { + return false; + } + + $this->m_arColors[] = (ord($rgb[2]) << 16) + (ord($rgb[1]) << 8) + ord($rgb[0]); + $this->m_nColors++; + } + + return true; + } + + /////////////////////////////////////////////////////////////////////////// + + function toString() + { + $ret = ""; + + for($i = 0; $i < $this->m_nColors; $i++) { + $ret .= + chr(($this->m_arColors[$i] & 0x000000FF)) . // R + chr(($this->m_arColors[$i] & 0x0000FF00) >> 8) . // G + chr(($this->m_arColors[$i] & 0x00FF0000) >> 16); // B + } + + return $ret; + } + + + /////////////////////////////////////////////////////////////////////////// + + function colorIndex($rgb) + { + $rgb = intval($rgb) & 0xFFFFFF; + $r1 = ($rgb & 0x0000FF); + $g1 = ($rgb & 0x00FF00) >> 8; + $b1 = ($rgb & 0xFF0000) >> 16; + $idx = -1; + + for($i = 0; $i < $this->m_nColors; $i++) { + $r2 = ($this->m_arColors[$i] & 0x000000FF); + $g2 = ($this->m_arColors[$i] & 0x0000FF00) >> 8; + $b2 = ($this->m_arColors[$i] & 0x00FF0000) >> 16; + $d = abs($r2 - $r1) + abs($g2 - $g1) + abs($b2 - $b1); + + if(($idx == -1) || ($d < $dif)) { + $idx = $i; + $dif = $d; + } + } + + return $idx; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +class CGIFFILEHEADER +{ + var $m_lpVer; + var $m_nWidth; + var $m_nHeight; + var $m_bGlobalClr; + var $m_nColorRes; + var $m_bSorted; + var $m_nTableSize; + var $m_nBgColor; + var $m_nPixelRatio; + var $m_colorTable; + + /////////////////////////////////////////////////////////////////////////// + + // CONSTRUCTOR + function CGIFFILEHEADER() + { + unSet($this->m_lpVer); + unSet($this->m_nWidth); + unSet($this->m_nHeight); + unSet($this->m_bGlobalClr); + unSet($this->m_nColorRes); + unSet($this->m_bSorted); + unSet($this->m_nTableSize); + unSet($this->m_nBgColor); + unSet($this->m_nPixelRatio); + unSet($this->m_colorTable); + } + + /////////////////////////////////////////////////////////////////////////// + + function load($lpData, &$hdrLen) + { + $hdrLen = 0; + + $this->m_lpVer = substr($lpData, 0, 6); + if(($this->m_lpVer <> "GIF87a") && ($this->m_lpVer <> "GIF89a")) { + return false; + } + + $this->m_nWidth = $this->w2i(substr($lpData, 6, 2)); + $this->m_nHeight = $this->w2i(substr($lpData, 8, 2)); + if(!$this->m_nWidth || !$this->m_nHeight) { + return false; + } + + $b = ord(substr($lpData, 10, 1)); + $this->m_bGlobalClr = ($b & 0x80) ? true : false; + $this->m_nColorRes = ($b & 0x70) >> 4; + $this->m_bSorted = ($b & 0x08) ? true : false; + $this->m_nTableSize = 2 << ($b & 0x07); + $this->m_nBgColor = ord(substr($lpData, 11, 1)); + $this->m_nPixelRatio = ord(substr($lpData, 12, 1)); + $hdrLen = 13; + + if($this->m_bGlobalClr) { + $this->m_colorTable = new CGIFCOLORTABLE(); + if(!$this->m_colorTable->load(substr($lpData, $hdrLen), $this->m_nTableSize)) { + return false; + } + $hdrLen += 3 * $this->m_nTableSize; + } + + return true; + } + + /////////////////////////////////////////////////////////////////////////// + + function w2i($str) + { + return ord(substr($str, 0, 1)) + (ord(substr($str, 1, 1)) << 8); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +class CGIFIMAGEHEADER +{ + var $m_nLeft; + var $m_nTop; + var $m_nWidth; + var $m_nHeight; + var $m_bLocalClr; + var $m_bInterlace; + var $m_bSorted; + var $m_nTableSize; + var $m_colorTable; + + /////////////////////////////////////////////////////////////////////////// + + // CONSTRUCTOR + function CGIFIMAGEHEADER() + { + unSet($this->m_nLeft); + unSet($this->m_nTop); + unSet($this->m_nWidth); + unSet($this->m_nHeight); + unSet($this->m_bLocalClr); + unSet($this->m_bInterlace); + unSet($this->m_bSorted); + unSet($this->m_nTableSize); + unSet($this->m_colorTable); + } + + /////////////////////////////////////////////////////////////////////////// + + function load($lpData, &$hdrLen) + { + $hdrLen = 0; + + $this->m_nLeft = $this->w2i(substr($lpData, 0, 2)); + $this->m_nTop = $this->w2i(substr($lpData, 2, 2)); + $this->m_nWidth = $this->w2i(substr($lpData, 4, 2)); + $this->m_nHeight = $this->w2i(substr($lpData, 6, 2)); + + if(!$this->m_nWidth || !$this->m_nHeight) { + return false; + } + + $b = ord($lpData{8}); + $this->m_bLocalClr = ($b & 0x80) ? true : false; + $this->m_bInterlace = ($b & 0x40) ? true : false; + $this->m_bSorted = ($b & 0x20) ? true : false; + $this->m_nTableSize = 2 << ($b & 0x07); + $hdrLen = 9; + + if($this->m_bLocalClr) { + $this->m_colorTable = new CGIFCOLORTABLE(); + if(!$this->m_colorTable->load(substr($lpData, $hdrLen), $this->m_nTableSize)) { + return false; + } + $hdrLen += 3 * $this->m_nTableSize; + } + + return true; + } + + /////////////////////////////////////////////////////////////////////////// + + function w2i($str) + { + return ord(substr($str, 0, 1)) + (ord(substr($str, 1, 1)) << 8); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +class CGIFIMAGE +{ + var $m_disp; + var $m_bUser; + var $m_bTrans; + var $m_nDelay; + var $m_nTrans; + var $m_lpComm; + var $m_gih; + var $m_data; + var $m_lzw; + + /////////////////////////////////////////////////////////////////////////// + + function CGIFIMAGE() + { + unSet($this->m_disp); + unSet($this->m_bUser); + unSet($this->m_bTrans); + unSet($this->m_nDelay); + unSet($this->m_nTrans); + unSet($this->m_lpComm); + unSet($this->m_data); + $this->m_gih = new CGIFIMAGEHEADER(); + $this->m_lzw = new CGIFLZW(); + } + + /////////////////////////////////////////////////////////////////////////// + + function load($data, &$datLen) + { + $datLen = 0; + + while(true) { + $b = ord($data[0]); + $data = substr($data, 1); + $datLen++; + + switch($b) { + case 0x21: // Extension + $len = 0; + if(!$this->skipExt($data, $len)) { + return false; + } + $datLen += $len; + break; + + case 0x2C: // Image + // LOAD HEADER & COLOR TABLE + $len = 0; + if(!$this->m_gih->load($data, $len)) { + return false; + } + $data = substr($data, $len); + $datLen += $len; + + // ALLOC BUFFER + $len = 0; + + if(!($this->m_data = $this->m_lzw->deCompress($data, $len))) { + return false; + } + + $data = substr($data, $len); + $datLen += $len; + + if($this->m_gih->m_bInterlace) { + $this->deInterlace(); + } + + return true; + + case 0x3B: // EOF + default: + return false; + } + } + return false; + } + + /////////////////////////////////////////////////////////////////////////// + + function skipExt(&$data, &$extLen) + { + $extLen = 0; + + $b = ord($data[0]); + $data = substr($data, 1); + $extLen++; + + switch($b) { + case 0xF9: // Graphic Control + $b = ord($data[1]); + $this->m_disp = ($b & 0x1C) >> 2; + $this->m_bUser = ($b & 0x02) ? true : false; + $this->m_bTrans = ($b & 0x01) ? true : false; + $this->m_nDelay = $this->w2i(substr($data, 2, 2)); + $this->m_nTrans = ord($data[4]); + break; + + case 0xFE: // Comment + $this->m_lpComm = substr($data, 1, ord($data[0])); + break; + + case 0x01: // Plain text + break; + + case 0xFF: // Application + break; + } + + // SKIP DEFAULT AS DEFS MAY CHANGE + $b = ord($data[0]); + $data = substr($data, 1); + $extLen++; + while($b > 0) { + $data = substr($data, $b); + $extLen += $b; + $b = ord($data[0]); + $data = substr($data, 1); + $extLen++; + } + return true; + } + + /////////////////////////////////////////////////////////////////////////// + + function w2i($str) + { + return ord(substr($str, 0, 1)) + (ord(substr($str, 1, 1)) << 8); + } + + /////////////////////////////////////////////////////////////////////////// + + function deInterlace() + { + $data = $this->m_data; + + for($i = 0; $i < 4; $i++) { + switch($i) { + case 0: + $s = 8; + $y = 0; + break; + + case 1: + $s = 8; + $y = 4; + break; + + case 2: + $s = 4; + $y = 2; + break; + + case 3: + $s = 2; + $y = 1; + break; + } + + for(; $y < $this->m_gih->m_nHeight; $y += $s) { + $lne = substr($this->m_data, 0, $this->m_gih->m_nWidth); + $this->m_data = substr($this->m_data, $this->m_gih->m_nWidth); + + $data = + substr($data, 0, $y * $this->m_gih->m_nWidth) . + $lne . + substr($data, ($y + 1) * $this->m_gih->m_nWidth); + } + } + + $this->m_data = $data; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +class CGIF +{ + var $m_gfh; + var $m_lpData; + var $m_img; + var $m_bLoaded; + + /////////////////////////////////////////////////////////////////////////// + + // CONSTRUCTOR + function CGIF() + { + $this->m_gfh = new CGIFFILEHEADER(); + $this->m_img = new CGIFIMAGE(); + $this->m_lpData = ""; + $this->m_bLoaded = false; + } + + /////////////////////////////////////////////////////////////////////////// + function ClearData() { + $this->m_lpData = ''; + unSet($this->m_img->m_data); + unSet($this->m_img->m_lzw->Next); + unSet($this->m_img->m_lzw->Vals); + unSet($this->m_img->m_lzw->Stack); + unSet($this->m_img->m_lzw->Buf); + } + + function loadFile(&$data, $iIndex) + { + if($iIndex < 0) { + return false; + } + $this->m_lpData = $data; + + // GET FILE HEADER + $len = 0; + if(!$this->m_gfh->load($this->m_lpData, $len)) { + return false; + } + + $this->m_lpData = substr($this->m_lpData, $len); + + do { + $imgLen = 0; + if(!$this->m_img->load($this->m_lpData, $imgLen)) { + return false; + } + $this->m_lpData = substr($this->m_lpData, $imgLen); + } + while($iIndex-- > 0); + + $this->m_bLoaded = true; + return true; + } + +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/classes/grad.php b/application/third_party/mpdf/classes/grad.php new file mode 100644 index 0000000..b5db602 --- /dev/null +++ b/application/third_party/mpdf/classes/grad.php @@ -0,0 +1,723 @@ +<?php + +class grad { + +var $mpdf = null; + +function grad(&$mpdf) { + $this->mpdf = $mpdf; +} + +// mPDF 5.3.A1 +function CoonsPatchMesh($x, $y, $w, $h, $patch_array=array(), $x_min=0, $x_max=1, $y_min=0, $y_max=1, $colspace='RGB', $return=false){ + $s=' q '; + $s.=sprintf(' %.3F %.3F %.3F %.3F re W n ', $x*_MPDFK, ($this->mpdf->h-$y)*_MPDFK, $w*_MPDFK, -$h*_MPDFK); + $s.=sprintf(' %.3F 0 0 %.3F %.3F %.3F cm ', $w*_MPDFK, $h*_MPDFK, $x*_MPDFK, ($this->mpdf->h-($y+$h))*_MPDFK); + $n = count($this->mpdf->gradients)+1; + $this->mpdf->gradients[$n]['type'] = 6; //coons patch mesh + $this->mpdf->gradients[$n]['colorspace'] = $colspace; //coons patch mesh + $bpcd=65535; //16 BitsPerCoordinate + $trans = false; + $this->mpdf->gradients[$n]['stream']=''; + for($i=0;$i<count($patch_array);$i++){ + $this->mpdf->gradients[$n]['stream'].=chr($patch_array[$i]['f']); //start with the edge flag as 8 bit + for($j=0;$j<count($patch_array[$i]['points']);$j++){ + //each point as 16 bit + if (($j % 2) == 1) { // Y coordinate (adjusted as input is From top left) + $patch_array[$i]['points'][$j]=(($patch_array[$i]['points'][$j]-$y_min)/($y_max-$y_min))*$bpcd; + $patch_array[$i]['points'][$j]=$bpcd-$patch_array[$i]['points'][$j]; + } + else { + $patch_array[$i]['points'][$j]=(($patch_array[$i]['points'][$j]-$x_min)/($x_max-$x_min))*$bpcd; + } + if($patch_array[$i]['points'][$j]<0) $patch_array[$i]['points'][$j]=0; + if($patch_array[$i]['points'][$j]>$bpcd) $patch_array[$i]['points'][$j]=$bpcd; + $this->mpdf->gradients[$n]['stream'].=chr(floor($patch_array[$i]['points'][$j]/256)); + $this->mpdf->gradients[$n]['stream'].=chr(floor($patch_array[$i]['points'][$j]%256)); + } + for($j=0;$j<count($patch_array[$i]['colors']);$j++){ + //each color component as 8 bit + if ($colspace=='RGB') { + $this->mpdf->gradients[$n]['stream'].=($patch_array[$i]['colors'][$j][1]); + $this->mpdf->gradients[$n]['stream'].=($patch_array[$i]['colors'][$j][2]); + $this->mpdf->gradients[$n]['stream'].=($patch_array[$i]['colors'][$j][3]); + if (isset($patch_array[$i]['colors'][$j][4]) && ord($patch_array[$i]['colors'][$j][4])<100) { $trans = true; } + } + else if ($colspace=='CMYK') { + $this->mpdf->gradients[$n]['stream'].=chr(ord($patch_array[$i]['colors'][$j][1])*2.55); + $this->mpdf->gradients[$n]['stream'].=chr(ord($patch_array[$i]['colors'][$j][2])*2.55); + $this->mpdf->gradients[$n]['stream'].=chr(ord($patch_array[$i]['colors'][$j][3])*2.55); + $this->mpdf->gradients[$n]['stream'].=chr(ord($patch_array[$i]['colors'][$j][4])*2.55); + if (isset($patch_array[$i]['colors'][$j][5]) && ord($patch_array[$i]['colors'][$j][5])<100) { $trans = true; } + } + else if ($colspace=='Gray') { + $this->mpdf->gradients[$n]['stream'].=($patch_array[$i]['colors'][$j][1]); + if ($patch_array[$i]['colors'][$j][2]==1) { $trans = true; } // transparency converted from rgba or cmyka() + } + } + } + // TRANSPARENCY + if ($trans) { + $this->mpdf->gradients[$n]['stream_trans']=''; + for($i=0;$i<count($patch_array);$i++){ + $this->mpdf->gradients[$n]['stream_trans'].=chr($patch_array[$i]['f']); + for($j=0;$j<count($patch_array[$i]['points']);$j++){ + //each point as 16 bit + $this->mpdf->gradients[$n]['stream_trans'].=chr(floor($patch_array[$i]['points'][$j]/256)); + $this->mpdf->gradients[$n]['stream_trans'].=chr(floor($patch_array[$i]['points'][$j]%256)); + } + for($j=0;$j<count($patch_array[$i]['colors']);$j++){ + //each color component as 8 bit // OPACITY + if ($colspace=='RGB') { + $this->mpdf->gradients[$n]['stream_trans'].=chr(intval(ord($patch_array[$i]['colors'][$j][4])*2.55)); + } + else if ($colspace=='CMYK') { + $this->mpdf->gradients[$n]['stream_trans'].=chr(intval(ord($patch_array[$i]['colors'][$j][5])*2.55)); + } + else if ($colspace=='Gray') { + $this->mpdf->gradients[$n]['stream_trans'].=chr(intval(ord($patch_array[$i]['colors'][$j][3])*2.55)); + } + } + } + $this->mpdf->gradients[$n]['trans'] = true; + $s .= ' /TGS'.$n.' gs '; + } + //paint the gradient + $s .= '/Sh'.$n.' sh'."\n"; + //restore previous Graphic State + $s .= 'Q'."\n"; + if ($return) { return $s; } + else { $this->mpdf->_out($s); } +} + + +// type = linear:2; radial: 3; +// Linear: $coords - array of the form (x1, y1, x2, y2) which defines the gradient vector (see linear_gradient_coords.jpg). +// The default value is from left to right (x1=0, y1=0, x2=1, y2=0). +// Radial: $coords - array of the form (fx, fy, cx, cy, r) where (fx, fy) is the starting point of the gradient with color1, +// (cx, cy) is the center of the circle with color2, and r is the radius of the circle (see radial_gradient_coords.jpg). +// (fx, fy) should be inside the circle, otherwise some areas will not be defined +// $col = array(R,G,B/255); or array(G/255); or array(C,M,Y,K/100) +// $stops = array('col'=>$col [, 'opacity'=>0-1] [, 'offset'=>0-1]) +function Gradient($x, $y, $w, $h, $type, $stops=array(), $colorspace='RGB', $coords='', $extend='', $return=false, $is_mask=false) { + if (strtoupper(substr($type,0,1)) == 'L') { $type = 2; } // linear + else if (strtoupper(substr($type,0,1)) == 'R') { $type = 3; } // radial + if ($colorspace != 'CMYK' && $colorspace != 'Gray') { + $colorspace = 'RGB'; + } + $bboxw = $w; + $bboxh = $h; + $usex = $x; + $usey = $y; + $usew = $bboxw; + $useh = $bboxh; + if ($type < 1) { $type = 2; } + if ($coords[0]!==false && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i',$coords[0],$m)) { + $tmp = $this->mpdf->ConvertSize($m[1],$this->mpdf->w,$this->mpdf->FontSize,false); + if ($tmp) { $coords[0] = $tmp/$w; } + } + if ($coords[1]!==false && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i',$coords[1],$m)) { + $tmp = $this->mpdf->ConvertSize($m[1],$this->mpdf->w,$this->mpdf->FontSize,false); + if ($tmp) { $coords[1] = 1-($tmp/$h); } + } + // LINEAR + if ($type == 2) { + $angle = $coords[4]; + $repeat = $coords[5]; + // ALL POINTS SET (default for custom mPDF linear gradient) - no -moz + if ($coords[0]!==false && $coords[1]!==false && $coords[2]!==false && $coords[3]!==false) { + // do nothing - coords used as they are + } + + // If both a <point> and <angle> are defined, the gradient axis starts from the point and runs along the angle. The end point is + // defined as before - in this case start points may not be in corners, and axis may not correctly fall in the right quadrant. + // NO end points (Angle defined & Start points) + else if ($angle!==false && $coords[0]!==false && $coords[1]!==false && $coords[2]===false && $coords[3]===false) { + if ($angle==0 || $angle==360) { $coords[3]=$coords[1]; if ($coords[0]==1) $coords[2]=2; else $coords[2]=1; } + else if ($angle==90) { $coords[2]=$coords[0]; $coords[3]=1; if ($coords[1]==1) $coords[3]=2; else $coords[3]=1; } + else if ($angle==180) { if ($coords[4]==0) $coords[2]=-1; else $coords[2]=0; $coords[3]=$coords[1]; } + else if ($angle==270) { $coords[2]=$coords[0]; if ($coords[1]==0) $coords[3]=-1; else $coords[3]=0; } + else { + $endx=1; $endy=1; + if ($angle <=90) { + if ($angle <=45) { $endy=tan(deg2rad($angle)); } + else { $endx=tan(deg2rad(90-$angle)); } + $b = atan2(($endy*$bboxh), ($endx*$bboxw)); + $ny = 1 - $coords[1] - (tan($b) * (1-$coords[0])); + $tx = sin($b) * cos($b) * $ny; + $ty = cos($b) * cos($b) * $ny; + $coords[2] = 1+$tx; $coords[3] = 1-$ty; + } + else if ($angle <=180) { + if ($angle <=135) { $endx=tan(deg2rad($angle-90)); } + else { $endy=tan(deg2rad(180-$angle)); } + $b = atan2(($endy*$bboxh), ($endx*$bboxw)); + $ny = 1 - $coords[1] - (tan($b) * ($coords[0])); + $tx = sin($b) * cos($b) * $ny; + $ty = cos($b) * cos($b) * $ny; + $coords[2] = -$tx; $coords[3] = 1-$ty; + } + else if ($angle <=270) { + if ($angle <=225) { $endy=tan(deg2rad($angle-180)); } + else { $endx=tan(deg2rad(270-$angle)); } + $b = atan2(($endy*$bboxh), ($endx*$bboxw)); + $ny = $coords[1] - (tan($b) * ($coords[0])); + $tx = sin($b) * cos($b) * $ny; + $ty = cos($b) * cos($b) * $ny; + $coords[2] = -$tx; $coords[3] = $ty; + } + else { + if ($angle <=315) { $endx=tan(deg2rad($angle-270)); } + else { $endy=tan(deg2rad(360-$angle)); } + $b = atan2(($endy*$bboxh), ($endx*$bboxw)); + $ny = $coords[1] - (tan($b) * (1-$coords[0])); + $tx = sin($b) * cos($b) * $ny; + $ty = cos($b) * cos($b) * $ny; + $coords[2] = 1+$tx; $coords[3] = $ty; + + } + } + } + + // -moz If the first parameter is only an <angle>, the gradient axis starts from the box's corner that would ensure the + // axis goes through the box. The axis runs along the specified angle. The end point of the axis is defined such that the + // farthest corner of the box from the starting point is perpendicular to the gradient axis at that point. + // NO end points or Start points (Angle defined) + else if ($angle!==false && $coords[0]===false && $coords[1]===false) { + if ($angle==0 || $angle==360) { $coords[0]=0; $coords[1]=0; $coords[2]=1; $coords[3]=0; } + else if ($angle==90) { $coords[0]=0; $coords[1]=0; $coords[2]=0; $coords[3]=1; } + else if ($angle==180) { $coords[0]=1; $coords[1]=0; $coords[2]=0; $coords[3]=0; } + else if ($angle==270) { $coords[0]=0; $coords[1]=1; $coords[2]=0; $coords[3]=0; } + else { + if ($angle <=90) { + $coords[0]=0; $coords[1]=0; + if ($angle <=45) { $endx=1; $endy=tan(deg2rad($angle)); } + else { $endx=tan(deg2rad(90-$angle)); $endy=1; } + } + else if ($angle <=180) { + $coords[0]=1; $coords[1]=0; + if ($angle <=135) { $endx=tan(deg2rad($angle-90)); $endy=1; } + else { $endx=1; $endy=tan(deg2rad(180-$angle)); } + } + else if ($angle <=270) { + $coords[0]=1; $coords[1]=1; + if ($angle <=225) { $endx=1; $endy=tan(deg2rad($angle-180)); } + else { $endx=tan(deg2rad(270-$angle)); $endy=1; } + } + else { + $coords[0]=0; $coords[1]=1; + if ($angle <=315) { $endx=tan(deg2rad($angle-270)); $endy=1; } + else { $endx=1; $endy=tan(deg2rad(360-$angle)); } + } + $b = atan2(($endy*$bboxh), ($endx*$bboxw)); + $h2 = $bboxh - ($bboxh * tan($b)); + $px = $bboxh + ($h2 * sin($b) * cos($b)); + $py = ($bboxh * tan($b)) + ($h2 * sin($b) * sin($b)); + $x1 = $px / $bboxh; + $y1 = $py / $bboxh; + if ($angle <=90) { $coords[2] = $x1; $coords[3] = $y1; } + else if ($angle <=180) { $coords[2] = 1-$x1; $coords[3] = $y1; } + else if ($angle <=270) { $coords[2] = 1-$x1; $coords[3] = 1-$y1; } + else { $coords[2] = $x1; $coords[3] = 1-$y1; } + } + } + // -moz If the first parameter to the gradient function is only a <point>, the gradient axis starts from the specified point, + // and ends at the point you would get if you rotated the starting point by 180 degrees about the center of the box that the + // gradient is to be applied to. + // NO angle and NO end points (Start points defined) + else if ((!isset($angle) || $angle===false) && $coords[0]!==false && $coords[1]!==false) { // should have start and end defined + $coords[2] = 1-$coords[0]; $coords[3] = 1-$coords[1]; + $angle = rad2deg(atan2($coords[3]-$coords[1],$coords[2]-$coords[0])); + if ($angle < 0) { $angle += 360; } + else if ($angle > 360) { $angle -= 360; } + if ($angle!=0 && $angle!=360 && $angle!=90 && $angle!=180 && $angle!=270) { + if ($w >= $h) { + $coords[1] *= $h/$w ; + $coords[3] *= $h/$w ; + $usew = $useh = $bboxw; + $usey -= ($w-$h); + } + else { + $coords[0] *= $w/$h ; + $coords[2] *= $w/$h ; + $usew = $useh = $bboxh; + } + } + } + + // -moz If neither a <point> or <angle> is specified, i.e. the entire function consists of only <stop> values, the gradient + // axis starts from the top of the box and runs vertically downwards, ending at the bottom of the box. + else { // default values T2B + // All values are set in parseMozGradient - so won't appear here + $coords = array(0,0,1,0); // default for original linear gradient (L2R) + } + $s = ' q'; + $s .= sprintf(' %.3F %.3F %.3F %.3F re W n', $x*_MPDFK, ($this->mpdf->h-$y)*_MPDFK, $w*_MPDFK, -$h*_MPDFK)."\n"; + $s .= sprintf(' %.3F 0 0 %.3F %.3F %.3F cm', $usew*_MPDFK, $useh*_MPDFK, $usex*_MPDFK, ($this->mpdf->h-($usey+$useh))*_MPDFK)."\n"; + } + + // RADIAL + else if ($type == 3) { + $radius = $coords[4]; + $angle = $coords[5]; // ?? no effect + $shape = $coords[6]; + $size = $coords[7]; + $repeat = $coords[8]; + // ALL POINTS AND RADIUS SET (default for custom mPDF radial gradient) - no -moz + if ($coords[0]!==false && $coords[1]!==false && $coords[2]!==false && $coords[3]!==false && $coords[4]!==false) { + // do nothing - coords used as they are + } + // If a <point> is defined + else if ($shape!==false && $size!==false) { + if ($coords[2]==false) { $coords[2] = $coords[0]; } + if ($coords[3]==false) { $coords[3] = $coords[1]; } + // ELLIPSE + if ($shape=='ellipse') { + $corner1 = sqrt(pow($coords[0],2) + pow($coords[1],2)); + $corner2 = sqrt(pow($coords[0],2) + pow((1-$coords[1]),2)); + $corner3 = sqrt(pow((1-$coords[0]),2) + pow($coords[1],2)); + $corner4 = sqrt(pow((1-$coords[0]),2) + pow((1-$coords[1]),2)); + if ($size=='closest-side') { $radius = min($coords[0], $coords[1], (1-$coords[0]), (1-$coords[1])); } + else if ($size=='closest-corner') { $radius = min($corner1, $corner2, $corner3, $corner4); } + else if ($size=='farthest-side') { $radius = max($coords[0], $coords[1], (1-$coords[0]), (1-$coords[1])); } + else { $radius = max($corner1, $corner2, $corner3, $corner4); } // farthest corner (default) + } + // CIRCLE + else if ($shape=='circle') { + if ($w >= $h) { + $coords[1] = $coords[3] = ($coords[1] * $h/$w) ; + $corner1 = sqrt(pow($coords[0],2) + pow($coords[1],2)); + $corner2 = sqrt(pow($coords[0],2) + pow((($h/$w)-$coords[1]),2)); + $corner3 = sqrt(pow((1-$coords[0]),2) + pow($coords[1],2)); + $corner4 = sqrt(pow((1-$coords[0]),2) + pow((($h/$w)-$coords[1]),2)); + if ($size=='closest-side') { $radius = min($coords[0], $coords[1], (1-$coords[0]), (($h/$w)-$coords[1])); } + else if ($size=='closest-corner') { $radius = min($corner1, $corner2, $corner3, $corner4); } + else if ($size=='farthest-side') { $radius = max($coords[0], $coords[1], (1-$coords[0]), (($h/$w)-$coords[1])); } + else if ($size=='farthest-corner') { $radius = max($corner1, $corner2, $corner3, $corner4); } // farthest corner (default) + $usew = $useh = $bboxw; + $usey -= ($w-$h); + } + else { + $coords[0] = $coords[2] = ($coords[0] * $w/$h) ; + $corner1 = sqrt(pow($coords[0],2) + pow($coords[1],2)); + $corner2 = sqrt(pow($coords[0],2) + pow((1-$coords[1]),2)); + $corner3 = sqrt(pow((($w/$h)-$coords[0]),2) + pow($coords[1],2)); + $corner4 = sqrt(pow((($w/$h)-$coords[0]),2) + pow((1-$coords[1]),2)); + if ($size=='closest-side') { $radius = min($coords[0], $coords[1], (($w/$h)-$coords[0]), (1-$coords[1])); } + else if ($size=='closest-corner') { $radius = min($corner1, $corner2, $corner3, $corner4); } + else if ($size=='farthest-side') { $radius = max($coords[0], $coords[1], (($w/$h)-$coords[0]), (1-$coords[1])); } + else if ($size=='farthest-corner') { $radius = max($corner1, $corner2, $corner3, $corner4); } // farthest corner (default) + $usew = $useh = $bboxh; + } + } + if ($radius==0) { $radius=0.001; } // to prevent error + $coords[4] = $radius; + } + + // -moz If entire function consists of only <stop> values + else { // default values + // All values are set in parseMozGradient - so won't appear here + $coords = array(0.5,0.5,0.5,0.5); // default for radial gradient (centred) + } + $s = ' q'; + $s .= sprintf(' %.3F %.3F %.3F %.3F re W n', $x*_MPDFK, ($this->mpdf->h-$y)*_MPDFK, $w*_MPDFK, -$h*_MPDFK)."\n"; + $s .= sprintf(' %.3F 0 0 %.3F %.3F %.3F cm', $usew*_MPDFK, $useh*_MPDFK, $usex*_MPDFK, ($this->mpdf->h-($usey+$useh))*_MPDFK)."\n"; + } + + $n = count($this->mpdf->gradients) + 1; + $this->mpdf->gradients[$n]['type'] = $type; + $this->mpdf->gradients[$n]['colorspace'] = $colorspace; + $trans = false; + $this->mpdf->gradients[$n]['is_mask'] = $is_mask; + if ($is_mask) { $trans = true; } + if (count($stops) == 1) { $stops[1] = $stops[0]; } + if (!isset($stops[0]['offset'])) { $stops[0]['offset'] = 0; } + if (!isset($stops[(count($stops)-1)]['offset'])) { $stops[(count($stops)-1)]['offset'] = 1; } + + // Fix stop-offsets set as absolute lengths + if ($type==2) { + $axisx = ($coords[2]-$coords[0])*$usew; + $axisy = ($coords[3]-$coords[1])*$useh; + $axis_length = sqrt(pow($axisx,2) + pow($axisy,2)); + } + else { $axis_length = $coords[4]*$usew; } // Absolute lengths are meaningless for an ellipse - Firefox uses Width as reference + + for($i=0;$i<count($stops);$i++) { + if (isset($stops[$i]['offset']) && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i',$stops[$i]['offset'],$m)) { + $tmp = $this->mpdf->ConvertSize($m[1],$this->mpdf->w,$this->mpdf->FontSize,false); + $stops[$i]['offset'] = $tmp/$axis_length; + } + } + + + if (isset($stops[0]['offset']) && $stops[0]['offset']>0) { + $firststop = $stops[0]; + $firststop['offset'] = 0; + array_unshift($stops, $firststop); + } + if (!$repeat && isset($stops[(count($stops)-1)]['offset']) && $stops[(count($stops)-1)]['offset']<1) { + $endstop = $stops[(count($stops)-1)]; + $endstop['offset'] = 1; + $stops[] = $endstop; + } + if ($stops[0]['offset'] > $stops[(count($stops)-1)]['offset']) { + $stops[0]['offset'] = 0; + $stops[(count($stops)-1)]['offset'] = 1; + } + + for($i=0;$i<count($stops);$i++) { + // mPDF 5.3.74 + if ($colorspace == 'CMYK') { + $this->mpdf->gradients[$n]['stops'][$i]['col'] = sprintf('%.3F %.3F %.3F %.3F', (ord($stops[$i]['col']{1})/100), (ord($stops[$i]['col']{2})/100), (ord($stops[$i]['col']{3})/100), (ord($stops[$i]['col']{4})/100)); + } + else if ($colorspace == 'Gray') { + $this->mpdf->gradients[$n]['stops'][$i]['col'] = sprintf('%.3F', (ord($stops[$i]['col']{1})/255)); + } + else { + $this->mpdf->gradients[$n]['stops'][$i]['col'] = sprintf('%.3F %.3F %.3F', (ord($stops[$i]['col']{1})/255), (ord($stops[$i]['col']{2})/255), (ord($stops[$i]['col']{3})/255)); + } + if (!isset($stops[$i]['opacity'])) { $stops[$i]['opacity'] = 1; } + else if ($stops[$i]['opacity'] > 1 || $stops[$i]['opacity'] < 0) { $stops[$i]['opacity'] = 1; } + else if ($stops[$i]['opacity'] < 1) { + $trans = true; + } + $this->mpdf->gradients[$n]['stops'][$i]['opacity'] = $stops[$i]['opacity']; + // OFFSET + if ($i>0 && $i<(count($stops)-1)) { + if (!isset($stops[$i]['offset']) || (isset($stops[$i+1]['offset']) && $stops[$i]['offset']>$stops[$i+1]['offset']) || $stops[$i]['offset']<$stops[$i-1]['offset']) { + if (isset($stops[$i-1]['offset']) && isset($stops[$i+1]['offset'])) { + $stops[$i]['offset'] = ($stops[$i-1]['offset']+$stops[$i+1]['offset'])/2; + } + else { + for($j=($i+1);$j<count($stops);$j++) { + if(isset($stops[$j]['offset'])) { break; } + } + $int = ($stops[$j]['offset'] - $stops[($i-1)]['offset'])/($j-$i+1); + for($f=0;$f<($j-$i-1);$f++) { + $stops[($i+$f)]['offset'] = $stops[($i+$f-1)]['offset'] + ($int); + } + } + } + } + $this->mpdf->gradients[$n]['stops'][$i]['offset'] = $stops[$i]['offset']; + $this->mpdf->gradients[$n]['stops'][$i]['offset'] = $stops[$i]['offset']; + } + + if ($repeat) { + $ns = count($this->mpdf->gradients[$n]['stops']); + $offs = array(); + for($i=0;$i<$ns;$i++) { + $offs[$i] = $this->mpdf->gradients[$n]['stops'][$i]['offset']; + } + $gp = 0; + $inside=true; + while($inside) { + $gp++; + for($i=0;$i<$ns;$i++) { + $this->mpdf->gradients[$n]['stops'][(($ns*$gp)+$i)] = $this->mpdf->gradients[$n]['stops'][(($ns*($gp-1))+$i)]; + $tmp = $this->mpdf->gradients[$n]['stops'][(($ns*($gp-1))+($ns-1))]['offset']+$offs[$i] ; + if ($tmp < 1) { $this->mpdf->gradients[$n]['stops'][(($ns*$gp)+$i)]['offset'] = $tmp; } + else { + $this->mpdf->gradients[$n]['stops'][(($ns*$gp)+$i)]['offset'] = 1; + $inside = false; + break(2); + } + } + } + } + + if ($trans) { + $this->mpdf->gradients[$n]['trans'] = true; + $s .= ' /TGS'.$n.' gs '; + } + if (!is_array($extend) || count($extend) <1) { + $extend=array('true', 'true'); // These are supposed to be quoted - appear in PDF file as text + } + $this->mpdf->gradients[$n]['coords'] = $coords; + $this->mpdf->gradients[$n]['extend'] = $extend; + //paint the gradient + $s .= '/Sh'.$n.' sh '."\n"; + //restore previous Graphic State + $s .= ' Q '."\n"; + if ($return) { return $s; } + else { $this->mpdf->_out($s); } +} + + +function parseMozGradient($bg) { + // background[-image]: -moz-linear-gradient(left, #c7Fdde 20%, #FF0000 ); + // background[-image]: linear-gradient(left, #c7Fdde 20%, #FF0000 ); // CSS3 + if (preg_match('/repeating-/',$bg)) { $repeat = true; } + else { $repeat = false; } + if (preg_match('/linear-gradient\((.*)\)/',$bg,$m)) { + $g = array(); + $g['type'] = 2; + $g['colorspace'] = 'RGB'; + $g['extend'] = array('true','true'); + $v = trim($m[1]); + // Change commas inside e.g. rgb(x,x,x) + while(preg_match('/(\([^\)]*?),/',$v)) { $v = preg_replace('/(\([^\)]*?),/','\\1@',$v); } + // Remove spaces inside e.g. rgb(x, x, x) + while(preg_match('/(\([^\)]*?)[ ]/',$v)) { $v = preg_replace('/(\([^\)]*?)[ ]/','\\1',$v); } + $bgr = preg_split('/\s*,\s*/',$v); + for($i=0;$i<count($bgr);$i++) { $bgr[$i] = preg_replace('/@/', ',', $bgr[$i]); } + // Is first part $bgr[0] a valid point/angle? + $first = preg_split('/\s+/',trim($bgr[0])); + if (preg_match('/(left|center|right|bottom|top|deg|grad|rad)/i',$bgr[0]) && !preg_match('/(<#|rgb|rgba|hsl|hsla)/i',$bgr[0])) { + $startStops = 1; + } + else if (trim($first[(count($first)-1)]) === "0") { + $startStops = 1; + } + else { + $check = $this->mpdf->ConvertColor($first[0]); + if ($check) $startStops = 0; + else $startStops = 1; + } + // first part a valid point/angle? + if ($startStops == 1) { // default values + // [<point> || <angle>,] = [<% em px left center right bottom top> || <deg grad rad 0>,] + if (preg_match('/([\-]*[0-9\.]+)(deg|grad|rad)/i',$bgr[0],$m)) { + $angle = $m[1] + 0; + if (strtolower($m[2])=='deg') { $angle = $angle; } + else if (strtolower($m[2])=='grad') { $angle *= (360/400); } + else if (strtolower($m[2])=='rad') { $angle = rad2deg($angle); } + while($angle < 0) { $angle += 360; } + $angle = ($angle % 360); + } + else if (trim($first[(count($first)-1)]) === "0") { $angle = 0; } + if (preg_match('/left/i',$bgr[0])) { $startx = 0; } + else if (preg_match('/right/i',$bgr[0])) { $startx = 1; } + if (preg_match('/top/i',$bgr[0])) { $starty = 1; } + else if (preg_match('/bottom/i',$bgr[0])) { $starty = 0; } + // Check for %? ?% or %% + if (preg_match('/(\d+)[%]/i',$first[0],$m)) { $startx = $m[1]/100; } + else if (!isset($startx) && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i',$first[0],$m)) { + $tmp = $this->mpdf->ConvertSize($m[1],$this->mpdf->w,$this->mpdf->FontSize,false); + if ($tmp) { $startx = $m[1]; } + } + if (isset($first[1]) && preg_match('/(\d+)[%]/i',$first[1],$m)) { $starty = 1 - ($m[1]/100); } + else if (!isset($starty) && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i',$first[1],$m)) { + $tmp = $this->mpdf->ConvertSize($m[1],$this->mpdf->w,$this->mpdf->FontSize,false); + if ($tmp) { $starty = $m[1]; } + } + if (isset($startx) && !isset($starty)) { $starty = 0.5; } + if (!isset($startx) && isset($starty)) { $startx = 0.5; } + + } + // If neither a <point> or <angle> is specified, i.e. the entire function consists of only <stop> values, the gradient axis starts from the top of the box and runs vertically downwards, ending at the bottom of the box. + else { // default values T2B + $starty = 1; $startx = 0.5; + $endy = 0; $endx = 0.5; + } + $coords = array(); + if (!isset($startx)) { $startx = false; } + if (!isset($starty)) { $starty = false; } + if (!isset($endx)) { $endx = false; } + if (!isset($endy)) { $endy = false; } + if (!isset($angle)) { $angle = false; } + $g['coords'] = array($startx ,$starty ,$endx ,$endy, $angle, $repeat ); + $g['stops'] = array(); + for($i=$startStops;$i<count($bgr);$i++) { + $stop = array(); + // parse stops + $el = preg_split('/\s+/',trim($bgr[$i])); + // mPDF 5.3.74 + $col = $this->mpdf->ConvertColor($el[0]); + if ($col) { $stop['col'] = $col; } + else { $stop['col'] = $col = $this->mpdf->ConvertColor(255); } + if ($col{0}==1) $g['colorspace'] = 'Gray'; + else if ($col{0}==4 || $col{0}==6) $g['colorspace'] = 'CMYK'; + if ($col{0}==5) { $stop['opacity'] = ord($col{4})/100; } // transparency from rgba() + else if ($col{0}==6) { $stop['opacity'] = ord($col{5})/100; } // transparency from cmyka() + else if ($col{0}==1 && $col{2}==1) { $stop['opacity'] = ord($col{3})/100; } // transparency converted from rgba or cmyka() + + if (isset($el[1]) && preg_match('/(\d+)[%]/',$el[1],$m)) { + $stop['offset'] = $m[1]/100; + if ($stop['offset']>1) { unset($stop['offset']); } + } + else if (isset($el[1]) && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i',$el[1],$m)) { + $tmp = $this->mpdf->ConvertSize($m[1],$this->mpdf->w,$this->mpdf->FontSize,false); + if ($tmp) { $stop['offset'] = $m[1]; } + } + $g['stops'][] = $stop; + } + if (count($g['stops'] )) { return $g; } + } + else if (preg_match('/radial-gradient\((.*)\)/',$bg,$m)) { + $g = array(); + $g['type'] = 3; + $g['colorspace'] = 'RGB'; + $g['extend'] = array('true','true'); + $v = trim($m[1]); + // Change commas inside e.g. rgb(x,x,x) + while(preg_match('/(\([^\)]*?),/',$v)) { $v = preg_replace('/(\([^\)]*?),/','\\1@',$v); } + // Remove spaces inside e.g. rgb(x, x, x) + while(preg_match('/(\([^\)]*?)[ ]/',$v)) { $v = preg_replace('/(\([^\)]*?)[ ]/','\\1',$v); } + $bgr = preg_split('/\s*,\s*/',$v); + for($i=0;$i<count($bgr);$i++) { $bgr[$i] = preg_replace('/@/', ',', $bgr[$i]); } + + // Is first part $bgr[0] a valid point/angle? + $startStops = 0; + $pos_angle = false; + $shape_size = false; + $first = preg_split('/\s+/',trim($bgr[0])); + $checkCol = $this->mpdf->ConvertColor($first[0]); + if (preg_match('/(left|center|right|bottom|top|deg|grad|rad)/i',$bgr[0]) && !preg_match('/(<#|rgb|rgba|hsl|hsla)/i',$bgr[0])) { + $startStops=1; + $pos_angle = $bgr[0]; + } + else if (trim($first[(count($first)-1)]) === "0") { + $startStops=1; + $pos_angle = $bgr[0]; + } + else if (preg_match('/(circle|ellipse|closest-side|closest-corner|farthest-side|farthest-corner|contain|cover)/i',$bgr[0])) { + $startStops=1; + $shape_size = $bgr[0]; + } + else if (!$checkCol) { + $startStops=1; + $pos_angle = $bgr[0]; + } + if (preg_match('/(circle|ellipse|closest-side|closest-corner|farthest-side|farthest-corner|contain|cover)/i',$bgr[1])) { + $startStops=2; + $shape_size = $bgr[1]; + } + + // If valid point/angle? + if ($pos_angle) { // default values + // [<point> || <angle>,] = [<% em px left center right bottom top> || <deg grad rad 0>,] + if (preg_match('/left/i',$pos_angle)) { $startx = 0; } + else if (preg_match('/right/i',$pos_angle)) { $startx = 1; } + if (preg_match('/top/i',$pos_angle)) { $starty = 1; } + else if (preg_match('/bottom/i',$pos_angle)) { $starty = 0; } + // Check for %? ?% or %% + if (preg_match('/(\d+)[%]/i',$first[0],$m)) { $startx = $m[1]/100; } + else if (!isset($startx) && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i',$first[0],$m)) { + $tmp = $this->mpdf->ConvertSize($m[1],$this->mpdf->w,$this->mpdf->FontSize,false); + if ($tmp) { $startx = $m[1]; } + } + if (isset($first[1]) && preg_match('/(\d+)[%]/i',$first[1],$m)) { $starty = 1 - ($m[1]/100); } + else if (!isset($starty) && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i',$first[1],$m)) { + $tmp = $this->mpdf->ConvertSize($m[1],$this->mpdf->w,$this->mpdf->FontSize,false); + if ($tmp) { $starty = $m[1]; } + } + +/* + // ?? Angle has no effect in radial gradient (does not exist in CSS3 spec.) + if (preg_match('/([\-]*[0-9\.]+)(deg|grad|rad)/i',$pos_angle,$m)) { + $angle = $m[1] + 0; + if (strtolower($m[2])=='deg') { $angle = $angle; } + else if (strtolower($m[2])=='grad') { $angle *= (360/400); } + else if (strtolower($m[2])=='rad') { $angle = rad2deg($angle); } + while($angle < 0) { $angle += 360; } + $angle = ($angle % 360); + } +*/ + if (!isset($starty)) { $starty = 0.5; } + if (!isset($startx)) { $startx = 0.5; } + + } + // If neither a <point> or <angle> is specified, i.e. the entire function consists of only <stop> values, the gradient axis starts from the top of the box and runs vertically downwards, ending at the bottom of the box. + else { // default values Center + $starty = 0.5; $startx = 0.5; + $endy = 0.5; $endx = 0.5; + } + + // If valid shape/size? + $shape = 'ellipse'; // default + $size = 'farthest-corner'; // default + if ($shape_size) { // default values + if (preg_match('/(circle|ellipse)/i',$shape_size, $m)) { + $shape = $m[1]; + } + if (preg_match('/(closest-side|closest-corner|farthest-side|farthest-corner|contain|cover)/i',$shape_size, $m)) { + $size = $m[1]; + if ($size=='contain') { $size = 'closest-side'; } + else if ($size=='cover') { $size = 'farthest-corner'; } + } + } + + $coords = array(); + if (!isset($startx)) { $startx = false; } + if (!isset($starty)) { $starty = false; } + if (!isset($endx)) { $endx = false; } + if (!isset($endy)) { $endy = false; } + if (!isset($radius)) { $radius = false; } + if (!isset($angle)) { $angle = 0; } + $g['coords'] = array($startx ,$starty ,$endx ,$endy, $radius, $angle, $shape, $size, $repeat ); + + $g['stops'] = array(); + for($i=$startStops;$i<count($bgr);$i++) { + $stop = array(); + // parse stops + $el = preg_split('/\s+/',trim($bgr[$i])); + // mPDF 5.3.74 + $col = $this->mpdf->ConvertColor($el[0]); + if ($col) { $stop['col'] = $col; } + else { $stop['col'] = $col = $this->mpdf->ConvertColor(255); } + if ($col{0}==1) $g['colorspace'] = 'Gray'; + else if ($col{0}==4 || $col{0}==6) $g['colorspace'] = 'CMYK'; + if ($col{0}==5) { $stop['opacity'] = ord($col{4})/100; } // transparency from rgba() + else if ($col{0}==6) { $stop['opacity'] = ord($col{5})/100; } // transparency from cmyka() + else if ($col{0}==1 && $col{2}==1) { $stop['opacity'] = ord($col{3})/100; } // transparency converted from rgba or cmyka() + + if (isset($el[1]) && preg_match('/(\d+)[%]/',$el[1],$m)) { + $stop['offset'] = $m[1]/100; + if ($stop['offset']>1) { unset($stop['offset']); } + } + else if (isset($el[1]) && preg_match('/([0-9.]+(px|em|ex|pc|pt|cm|mm|in))/i',$el[1],$m)) { + $tmp = $this->mpdf->ConvertSize($m[1],$this->mpdf->w,$this->mpdf->FontSize,false); + $stop['offset'] = $el[1]; + } + $g['stops'][] = $stop; + } + if (count($g['stops'] )) { return $g; } + } + return array(); +} + +function parseBackgroundGradient($bg) { + // background-gradient: linear #00FFFF #FFFF00 0 0.5 1 0.5; or + // background-gradient: radial #00FFFF #FFFF00 0.5 0.5 1 1 1.2; + + $v = trim($bg); + $bgr = preg_split('/\s+/',$v); + $g = array(); + if (count($bgr)> 6) { + if (strtoupper(substr($bgr[0],0,1)) == 'L' && count($bgr)==7) { // linear + $g['type'] = 2; + //$coords = array(0,0,1,1 ); // 0 0 1 0 or 0 1 1 1 is L 2 R; 1,1,0,1 is R2L; 1,1,1,0 is T2B; 1,0,1,1 is B2T + // Linear: $coords - array of the form (x1, y1, x2, y2) which defines the gradient vector (see linear_gradient_coords.jpg). + // The default value is from left to right (x1=0, y1=0, x2=1, y2=0). + $g['coords'] = array($bgr[3], $bgr[4], $bgr[5], $bgr[6]); + } + else if (count($bgr)==8) { // radial + $g['type'] = 3; + // Radial: $coords - array of the form (fx, fy, cx, cy, r) where (fx, fy) is the starting point of the gradient with color1, + // (cx, cy) is the center of the circle with color2, and r is the radius of the circle (see radial_gradient_coords.jpg). + // (fx, fy) should be inside the circle, otherwise some areas will not be defined + $g['coords'] = array($bgr[3], $bgr[4], $bgr[5], $bgr[6], $bgr[7]); + } + $g['colorspace'] = 'RGB'; + // mPDF 5.3.74 + $cor = $this->mpdf->ConvertColor($bgr[1]); + if ($cor{0}==1) $g['colorspace'] = 'Gray'; + else if ($cor{0}==4 || $cor{0}==6) $g['colorspace'] = 'CMYK'; + if ($cor) { $g['col'] = $cor; } + else { $g['col'] = $this->mpdf->ConvertColor(255); } + $cor = $this->mpdf->ConvertColor($bgr[2]); + if ($cor) { $g['col2'] = $cor; } + else { $g['col2'] = $this->mpdf->ConvertColor(255); } + $g['extend'] = array('true','true'); + $g['stops'] = array(array('col'=>$g['col'], 'opacity'=>1, 'offset'=>0), array('col'=>$g['col2'], 'opacity'=>1, 'offset'=>1)); + return $g; + } + return false; +} + + + +} + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/classes/indic.php b/application/third_party/mpdf/classes/indic.php new file mode 100644 index 0000000..e747ded --- /dev/null +++ b/application/third_party/mpdf/classes/indic.php @@ -0,0 +1,433 @@ +<?php + +class indic { + +function indic() { + +} + + +function substituteIndic($earr, $lang, $font) { + global $voltdata; + + if (!isset($voltdata[$font])) { + include_once(_MPDF_PATH.'includes/'.$font.'.volt.php'); + $voltdata[$font] = $volt; + } + + foreach($earr as $eid=>$char) { + $earr[$eid] = sprintf("%04s", strtoupper(dechex($char))); + } + $vstr = "0020 ".implode(" ",$earr)." 0020"; + //============================ + // Common Indic Punctuation marks + // If NOT devanagari + if ($lang!='hi') { + $vstr = str_replace('0964','007C', $vstr); // U+0964 replace with "|" + $vstr = str_replace('0965','007C 007C', $vstr); // U+0964 replace with "|" + } + //============================ + // Tamil numeral for Zero missing Added mPDF 4.2 + if ($lang=='ta') { + $vstr = str_replace('0BE6','0030', $vstr); // U+0BEB replace with "0" + } + + //============================ + // Re-order vowels + + // DEVANAGARI vowel sign matraI[093F] before consonant + if ($lang=='hi') { + $prebasedvowels = "(093F)"; + $nukta = "093C"; + $halant = "094D"; + $vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.'/','\\2 \\1', $vstr); // vowel sign pre-based shift left + $vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.' '.$nukta.'/','\\2 \\1 '.$nukta, $vstr); // before NUKTA + $vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$prebasedvowels.'/','\\2 \\1 '.$halant, $vstr); // before CHAR HALANT == VIRAMA + } + + // BENGALI vowels [09BF 09C7 09C8] + else if ($lang=='bn') { + + // Khanda Ta 09CE not in font -> replace with 09A4|09CD + $vstr = preg_replace('/09CE/','09A4 09CD 200D', $vstr); // mPDF 5.3.09 + + // BENGALI double-part vowels [09CB 09C7 09BE][09CC 09C7 09D7] + $vstr = str_replace('09CB','09C7 09BE', $vstr); // convert to 2 parts + $vstr = str_replace('09CC','09C7 09D7', $vstr); // 09C7 pre-based is then shifted below + $prebasedvowels = "(09BF|09C7|09C8)"; + $nukta = "09BC"; + $halant = "09CD"; + // mPDF 5.0.044 + $bnfullcons = "0995|0996|0997|0998|0999|099A|099B|099C|099D|099F|09A0|09A1|09A2|09A3|09A4|09A5|09A6|09A7|09A8|09AA|09AB|09AC|09AD|09AE|09AF|09B0|09B2|09B6|09B7|09B8|09B9|09DC|09DD|09DF"; + $vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.'/','\\2 \\1', $vstr); // vowel sign pre-based shift left + $vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.' '.$nukta.'/','\\2 \\1 '.$nukta, $vstr); // before NUKTA + $vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$prebasedvowels.'/','\\2 \\1 '.$halant, $vstr); // before CHAR HALANT + // mPDF 5.0.044 + // .. and shifting left-based vowel further to the left in case 3 consonants together. + $vstr = preg_replace('/('.$bnfullcons.') '.$halant.' '.$prebasedvowels.'/','\\2 \\1 '.$halant, $vstr); + + // mPDF 5.0.044 + // If left-based vowel has now been shifted to left of RA/Halant (09B0/09CD) + // Convert here to above-line form (E068) as it would get missed later + // e.g. 09B0 09CD 09AD 09C7 would be changed above => + // e.g. 09C7 09B0 09CD 09AD. The 09B0 09CD should => E068 + // ??? need to add 09BF as well (09BF|09C7|09C8) + $vstr = preg_replace('/(09C7|09C8) 09B0 09CD/', '\\1 E068', $vstr); + + } + + // GUJARATI pre-based vowel [0ABF] + else if ($lang=='gu') { + $prebasedvowels = "(0ABF)"; + $nukta = "0ABC"; + $halant = "0ACD"; + $vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.'/','\\2 \\1', $vstr); // vowel sign pre-based shift left + $vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.' '.$nukta.'/','\\2 \\1 '.$nukta, $vstr); // before NUKTA + $vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$prebasedvowels.'/','\\2 \\1 '.$halant, $vstr); // before CHAR HALANT + } + + // GURMUKHI/PUNJABI pre-based vowel [0ABF] + else if ($lang=='pa') { + $prebasedvowels = "(0A3F)"; + $nukta = "0A3C"; + $halant = "0A4D"; + $vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.'/','\\2 \\1', $vstr); // vowel sign pre-based shift left + $vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.' '.$nukta.'/','\\2 \\1 '.$nukta, $vstr); // before NUKTA + $vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$prebasedvowels.'/','\\2 \\1 '.$halant, $vstr); // before CHAR HALANT + } + + // TAMIL pre-based vowel [0ABF] + else if ($lang=='ta') { + // Shrii (Shree) + $vstr = preg_replace('/0BB6 0BCD 0BB0 0BC0/','E04B', $vstr); + + // TAMIL double-part vowels [0BCA 0BC6 0BBE][0BCB 0BC7 0BBE][0BCC 0BC6 0BD7] + $vstr = preg_replace('/0BCA/','0BC6 0BBE', $vstr); // convert to 2 parts + $vstr = preg_replace('/0BCB/','0BC7 0BBE', $vstr); // pre-based is then shifted below + $vstr = preg_replace('/0BCC/','0BC6 0BD7', $vstr); + $prebasedvowels = "(0BC6|0BC7|0BC8)"; + // No nukta + $halant = "0BCD"; // Doesn't seem to move most in front of halanted consonants + $vstr = preg_replace('/([A-F0-9]{4}) '.$prebasedvowels.'/','\\2 \\1', $vstr); // vowel sign pre-based shift left + // ? Only for special case KSS (already moved to left of 0BB7) + $vstr = preg_replace('/0B95 '.$halant.' '.$prebasedvowels.' 0BB7/','\\1 0B95 '.$halant.' 0BB7', $vstr); + } + + // ORIYA + else if ($lang=='or') { + // ORIYA double-part vowels [] + $vstr = str_replace('0B48','0B47 0B56', $vstr); // 2-part Vowel + $vstr = str_replace('0B4B','0B47 0B3E', $vstr); // 2-part Vowel + $vstr = str_replace('0B4C','0B47 0B57', $vstr); // 2-part Vowel + $orprebasedvowels = "(0B47)"; + // No nukta + $halant = "0B4D"; + $vstr = preg_replace('/([A-F0-9]{4}) '.$orprebasedvowels.'/','\\2 \\1', $vstr); // vowel sign pre-based shift left + $vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$orprebasedvowels.'/','\\2 \\1 '.$halant, $vstr); // before CHAR HALANT + $vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$orprebasedvowels.'/','\\2 \\1 '.$halant, $vstr); // before CHAR HALANT + } + + // MALAYALAM + else if ($lang=='ml') { + // Chillus - old forms - remove ZWNJ after + // This font Volt rules recognises e.g. "Na Halant(Virama)" as ChilluN + $vstr = preg_replace('/(0D23 0D4D|0D28 0D4D|0D30 0D4D|0D32 0D4D|0D33 0D4D) 200D/','\\1', $vstr); + // See Chillus in Unicode [http://en.wikipedia.org/wiki/Malayalam_script] + $vstr = str_replace('0D7A','0D23 0D4D', $vstr); // [mlymChilluNn] + $vstr = str_replace('0D7B','0D28 0D4D', $vstr); // [mlymChilluN] + $vstr = str_replace('0D7C','0D30 0D4D', $vstr); // [mlymChilluR] + $vstr = str_replace('0D7D','0D32 0D4D', $vstr); // [mlymChilluL] + $vstr = str_replace('0D7E','0D33 0D4D', $vstr); // [mlymChilluLl] +/* + // Chillus - 0D7A-0D7E not in font directly, but as E005-E009 + $vstr = preg_replace('/0D23 0D4D 200D/','0D7A', $vstr); + $vstr = preg_replace('/0D28 0D4D 200D/','0D7B', $vstr); + $vstr = preg_replace('/0D30 0D4D 200D/','0D7C', $vstr); + $vstr = preg_replace('/0D32 0D4D 200D/','0D7D', $vstr); + $vstr = preg_replace('/0D33 0D4D 200D/','0D7E', $vstr); + + $vstr = preg_replace('/0D7F/','E004', $vstr); // [mlymChilluK] + $vstr = preg_replace('/0D7A/','E005', $vstr); // [mlymChilluNn] + $vstr = preg_replace('/0D7B/','E006', $vstr); // [mlymChilluN] + $vstr = preg_replace('/0D7C/','E007', $vstr); // [mlymChilluR] + $vstr = preg_replace('/0D7D/','E008', $vstr); // [mlymChilluL] + $vstr = preg_replace('/0D7E/','E009', $vstr); // [mlymChilluLl] +*/ + + // MALAYALAM double-part vowels [] + $vstr = str_replace('0D4A','0D46 0D3E', $vstr); // 2-part Vowel + $vstr = str_replace('0D4B','0D47 0D3E', $vstr); // 2-part Vowel + $vstr = str_replace('0D4C','0D46 0D57', $vstr); // 2-part Vowel + $mlprebasedvowels = "(0D46|0D47|0D48)"; + // No nukta + $halant = "0D4D"; + $vstr = preg_replace('/([A-F0-9]{4}) '.$mlprebasedvowels.'/','\\2 \\1', $vstr); // vowel sign pre-based shift left + $vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$mlprebasedvowels.'/','\\2 \\1 '.$halant, $vstr); // before CHAR HALANT + } + + // TELUGU + else if ($lang=='te') { + // TELUGU double-part vowels [0C48 -> 0C46 0C56] + $vstr = str_replace('0C48','0C46 0C56', $vstr); // 2-part Vowel + $prebasedvowels = "(0C46)"; + $abvvowels = "(0C3E|0C3F|0C40|0C46|0C47|0C4A|0C4B|0C4C|0C55)"; + // No nukta + $halant = "0C4D"; + $tefullforms = "0C15|0C17|0C18|0C1A|0C1B|0C1C|0C1D|0C20|0C21|0C22|0C24|0C25|0C26|0C27|0C28|0C2A|0C2B|0C2D|0C2E|0C2F|0C30|0C33|0C35|0C36|0C37|0C38|0C39|E028|E029|E02A|E02B|E078|E07A|E07B"; + $vstr = preg_replace('/('.$tefullforms .') '.$halant.' ('.$tefullforms .') '.$abvvowels .'/','\\1 \\3 '.$halant.' \\2', $vstr); // before HALANT + } + + + // KANNADA + else if ($lang=='kn') { + // KANNADA double-part vowels [0CC8 -> 0CC6 0CD6] + $vstr = str_replace('0CC0','0CBF 0CD5', $vstr); // 2-part Vowel + $vstr = str_replace('0CC7','0CC6 0CD5', $vstr); // 2-part Vowel + $vstr = str_replace('0CC8','0CC6 0CD6', $vstr); // 2-part Vowel AI - no glyph for single + $vstr = str_replace('0CCA','0CC6 0CC2', $vstr); // 2-part Vowel + $vstr = str_replace('0CCB','0CC6 0CC2 0CD5', $vstr); // 2-part Vowel + $prebasedvowels = "(0CBF|0CC6)"; + $halant = "0CCD"; + } + + + //============================ + + // SPECIALS + + // DEVANAGARI Ra Halant Ra + if ($lang=='hi') { + $vstr = str_replace('0930 094D 0930','E05D 0930', $vstr); // Ra Halant Ra => halfRa FullRa + } + + // GUJARATI + if ($lang=='gu') { + $vstr = str_replace('0AB0 0AC2','E02E', $vstr); // Ra VowelUu => SpecialForm RaUu + } + + // TELUGU Ra Halant <Consonant> Halant => halfRa Halant<Consonant> Halant + if ($lang=='te') { + $vstr = preg_replace('/0C30 0C4D ([A-F0-9]{4}) 0C4D/','E021 0C4D \\1 0C4D', $vstr); + } + + // KANNADA + // Reph at end of word becomes E0CC instead of E00B + if ($lang=='kn') { + $vstr = str_replace('0CB0 0CCD 0020','E0CC 0020', $vstr); // mPDF 5.3.87 + } + + + //============================ + // MAIN BIT FROM VOLT RULES + foreach($voltdata[$font] AS $rid=>$reps) { +//echo $rid . ': ' . $vstr.'<br />'; + $vstr = preg_replace('/'.$reps['match'].'/',$reps['replace'], $vstr); + } +//echo $vstr.'<br />'; exit; + + + //============================ + + // SPECIALS + + // KANNADA + // <Base> <BelowBase1> [<BelowBase2> ] MatraI -> <Base/MatraI ligature> <Belowbase1> etc + if ($lang=='kn') { + $matraI = "0CBF"; + $knbase = preg_split('/\|/', "0C95|0C96|0C97|0C98|0C9A|0C9B|0C9C|0C9D|0CA0|0CA1|0CA2|0CA3|0CA4|0CA5|0CA6|0CA7|0CA8|0CAA|0CAB|0CAC|0CAD|0CAE|0CAF|0CB0|0CB2|0CB3|0CB5|0CB6|0CB7|0CB8|0CB9|E0A3|E07D|E07E"); + $knmatraIligature = preg_split('/\|/', "E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A4|E0A1|E0A2"); + $belowbase1 = "E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081"; + $belowbase2 = "E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081"; + for ($i=0; $i<count($knbase);$i++) { + $vstr = preg_replace('/'.$knbase[$i].' ('.$belowbase1.') ('.$belowbase2.') '.$matraI.'/', $knmatraIligature[$i].' \\1 \\2', $vstr); + $vstr = preg_replace('/'.$knbase[$i].' ('.$belowbase1.') '.$matraI.'/', $knmatraIligature[$i].' \\1', $vstr); + } + } + + // KANNADA + // [KanTtaFull] [matraI] => [KanTtaPartial] [matraI] + if ($lang=='kn') { + $vstr = preg_replace('/0C9F '.$matraI.'/', 'E015 '.$matraI, $vstr); + } + + // ORIYA + if ($lang=='or') { + // SpecialCase Ra[0B30] Halant still left before [oryaFullNnNna] => E00F + $vstr = preg_replace('/0B30 '.$halant.' E00F/','E00F E069', $vstr); // convert to Reph + } + + //============================ + // SHIFT REPH + + // DEVANAGARI Shift Reph [E015] + if ($lang=='hi') { + // FIRSTLY - halfRa = E05D - Change this to Reph [E015] + $himatchhalfforms = "E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E0D3|E0D4|E0D5|E0D6|E0D7|E0D8|E0D9|E0DA|E0DB|E0DC|E0DD|E0DE|E0DF|E0E0|E0E1|E0E2|E0E3|E0E4|E0E5|E0E6|E0E7|E0E8|E0E9|E0EA|E0EB|E0EC|E0ED|E0EE|E0EF|E0F0|E0F1|E0F2|E0F3|E0F4|E0F5|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FC|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145"; + $himatchfullforms = "0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029|0958|0959|095A|E02A|E02B|E02C|E02D|095B|E02E|E02F|E030|E031|095C|095D|E032|E033|E034|E035|E036|0929|E037|095E|E038|E039|E03A|095F|0931|E03B|0934|E03C|E03D|E03E|E03F|E040|E041|E042|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E0A6|E0A7|E0A8|E0A9|E0AA|E0AB|E0AC|E0AD|E0AE|E0AF|E0B0|E0B1|E0B2|E0B3|E0B4|E0B5|E0B6|E0B7|E0B8|E0B9|E0BA|E0BB|E0BC|E0BD|E0BE|E0BF|E0C0|E0C1|E0C2|E0C3|E0C4|E0C5|E0C6|E0C7|E0C8|E0C9|E0CA|E0CB|E0CC|E0CD|E0CE|E0CF|E0D0|E0D1|E0D2|E11E|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E129|E12A|E12B|E12C|E12D|E12E|E12F|E130|E131|E132|E133"; + $vstr = preg_replace('/E05D ('.$himatchhalfforms.'|'.$himatchfullforms.')/', 'E015 \\1', $vstr); + + // Reph = E015 - Shift Right to just after end of syllable + // FullAllForms + HalfAllForms + 093E matraA + while(preg_match('/E015 ('.$himatchhalfforms.')/', $vstr)) { + $vstr = preg_replace('/E015 ('.$himatchhalfforms.')/', '\\1 E015', $vstr); + } + $vstr = preg_replace('/E015 ('.$himatchfullforms.')/', '\\1 E015', $vstr); + + // Now shift it beyond post-based vowels // ??? Need to add others e.g. 0949,094A,094B,094C + presentation forms like E198 + $vstr = str_replace('E015 093E', '093E E015', $vstr); + $vstr = preg_replace('/E015 (0940|E194|E195|E196|E197|E198)/', '\\1 E014', $vstr); // (Small) reph [E014] to Right of matraI + $vstr = str_replace('E015 0947', '0947 E014', $vstr); // (Small) reph [E014] to Right of matraI + } + + // BENGALI Shift Reph [E068] + else if ($lang=='bn') { + $bnfullconjuncts = "E002|E003|E004|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E0A6|E0A7|E0A8|E0A9|E0AA|E0AB|E0AC|E0AD|E0AE|E0AF|E0B0|E0B1|E0B2|E0B3|E0B4|E0B5|E0B6|E0B7|E0B8|E0B9|E0BA|E0BB|E0BC|E0BD|E0BE|E0BF|E0C0|E0C1|E0C2|E0C3|E0C4|E0C5|E0C6|E0C7|E0C8|E0C9|E0CA|E0CB|E0CC|E0CD|E0CE|E0CF|E0D0|E0D1|E0D2|E0D3|E0D4|E0D5|E0D6|E0D7|E0D8|E0D9|E0DA|E0DB|E0DC|E0DD|E0DE|E0DF|E0E0|E0E1|E0E2|E0E3|E0E4|E0E5|E0E6|E0E7|E0E8|E0E9|E0EA|E0EB|E0EC|E0ED|E0EE|E0EF|E0F0|E0F1|E0F2|E0F3|E0F4|E0F5|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FC|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E129|E12A|E12B|E12C|E12D|E12E|E12F|E130|E131|E132|E133|E134|E135|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E|E15F|E160|E161|E162|E163|E164|E165|E166|E167|E168|E169|E16A|E16B|E16C|E16D|E16E|E16F|E170|E171|E172|E173|E174|E175|E176|E177|E178|E179|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E182|E183|E184|E185|E186|E187|E188|E189|E18A|E18B|E18C|E18D|E18E|E18F|E190|E191|E192|E193|E194|E195|E196|E197|E198|E199|E19A"; + // $bnfullcons - set above; + $vstr = preg_replace('/E068 ('.$bnfullconjuncts.'|'.$bnfullcons.')/', '\\1 E068', $vstr); + // ? Need to shift it beyond post-base vowels 09BE, 09C0, 09D7 haven't found so can't test?? + $vstr = preg_replace('/E068 (09BE|09C0|09D7)/', '\\1 E068', $vstr); + } + + // GUJARATI Shift Reph [E032] + else if ($lang=='gu') { + $gufullforms = "0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5"; + $vstr = preg_replace('/E032 ('.$gufullforms.')/', '\\1 E032', $vstr); + // Now shift it beyond post-based vowels // ??? Need to add others e.g. 0949,094A,094B,094C + presentation forms like E198 + // ? Need to shift it beyond post-base vowels 0ABE, 0AC0 haven't found so can't test?? + $vstr = preg_replace('/E032 (0ABE|0AC0)/', '\\1 E032', $vstr); + } + + + // TELUGU Shift Reph to LEFT [E046|E069|E077] [TelRaSmallOne] => E046 [TelRaSmallTwo] => E069 [TelRaSmallThree] => E077 + else if ($lang=='te') { + // tefullforms defined earlier + $tepartialforms = "E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E07C|E07D|E07E"; + $matraligs = "E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E0A6|E0A7|E0A8|E0A9|E0AA|E0AB|E0AC|E0AD|E0AE|E0AF"; + $tevowels = "0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C" + ."|0C41|0C42|0C43|0C44"; // post matras + $vstr = preg_replace('/('.$tevowels.') (E046|E069|E077)/', '\\2 \\1', $vstr); + while(preg_match('/('.$tepartialforms.') (E046|E069|E077)/', $vstr)) { + $vstr = preg_replace('/('.$tepartialforms.') (E046|E069|E077)/', '\\2 \\1', $vstr); + } + $vstr = preg_replace('/('.$tefullforms .'|'.$matraligs.') (E046|E069|E077)/', '\\2 \\1', $vstr); + } + + + // KANNADA Shift Reph to RIGHT [E00B] + else if ($lang=='kn') { + $knfullforms = "0C95|0C96|0C97|0C98|0C99|0C9A|0C9B|0C9C|0C9D|0C9E|0C9F|0CA0|0CA1|0CA2|0CA3|0CA4|0CA5|0CA6|0CA7|0CA8|0CAA|0CAB|0CAC|0CAD|0CAE|0CAF|0CB0|0CB1|0CB2|0CB3|0CB5|0CB6|0CB7|0CB8|0CB9|E07D|E07E|E0A3"; + $knpartialforms = "E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|0C9E|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E07F"; + while(preg_match('/E00B ('.$knpartialforms.')/', $vstr)) { + $vstr = preg_replace('/E00B ('.$knpartialforms.')/', '\\1 E00B', $vstr); + } + // mPDF 5.3.47 Also move Reph to right of matraIligatures + $knfullforms .= "|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A4|E0A1|E0A2"; + $vstr = preg_replace('/E00B ('.$knfullforms.')/', '\\1 E00B', $vstr); + + // ? Need to shift it beyond base or below-base forms - haven't found so can't test?? + // mPDF 5.3.87 + // E004 added to list (which is a transformed version of 0CBE) + $knvowels = "0CBE|0CC0|0CC1|0CC2|0CC3|0CC4|0CC7|0CC8|0CCA|0CCB|0CD5|0CD6|E004"; + $vstr = preg_replace('/E00B ('.$knvowels.')/', '\\1 E00B', $vstr); + } + + + // ORIYA Shift Reph to RIGHT [E069|E06A|E06B|E06C] + else if ($lang=='or') { + $orrephs = "E069|E06A|E06B|E06C"; + $orfullforms = "0B15|0B16|0B17|0B18|0B19|0B1A|0B1B|0B1C|0B1D|0B1E|0B1F|0B20|0B21|0B22|0B23|0B24|0B25|0B26|0B27|0B28|0B29|0B2A|0B2B|0B2C|0B2D|0B2E|0B2F|0B30|0B31|0B32|0B33|0B34|0B35|0B36|0B37|0B38|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037"; + // E123 - E147 FullHalant forms ? add to FullForms + $orpartialforms = "E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E0A6|E0A7|E0A8|E0A9|E0AA|E0AB|E0AC|E0AD|E0AE|E0AF|E0B0|E0B1|E0B2|E0B3|E0B4|E0B5|E0B6|E0B7|E0B8|E0B9|E0BA|E0BB|E0BC|E0BD|E0BE|E0BF|E0C0|E0C1|E0C2|E0C3|E0C4|E0C5|E0C6|E0C7|E0C8|E0C9|E0CA|E0CB|E0CC|E0CD|E0CE|E0CF|E0D0|E0D1|E0D2|E0D3|E0D4|E0D5|E0D6|E0D7|E0D8|E0D9|E0DA|E0DB|E0DC|E0DD|E0DE|E0DF|E0E0|E0E1|E0E2|E0E3|E0E4|E0E5|E0E6|E0E7|E0E8|E0E9|E0EA|E0EB|E0EC|E0ED|E0EE|E0EF|E0F0|E0F1|E0F2|E0F3|E0F4|E0F5"; + + // Combined MatraIReph[E06D] split [0B3F & E069] to allow reph to be shifted forwards + $vstr = preg_replace('/('.$orfullforms.') E06D ('.$orfullforms.') 0B3E/', '\\1 0B3F E069 \\2 0B3E', $vstr); + + + while(preg_match('/('.$orrephs.') ('.$orpartialforms.')/', $vstr)) { + $vstr = preg_replace('/('.$orrephs.') ('.$orpartialforms.')/', '\\2 \\1', $vstr); + } + $vstr = preg_replace('/('.$orrephs.') ('.$orfullforms.')/', '\\2 \\1', $vstr); + + + // Combine Reph and MatraI + $vstr = str_replace('E069 0B3F', 'E06D', $vstr); // Reph and MatraI -> MatraIReph + $vstr = str_replace('E06A 0B3F', 'E06E', $vstr); // Reph and MatraI -> MatraIReph + $vstr = str_replace('E06B 0B3F', 'E06F', $vstr); // Reph and MatraI -> MatraIReph + } + + + // MALAYALAM Shift Reph to LEFT [E00E] (mlylmRaVattu) + else if ($lang=='ml') { + $halant = "0D4D"; + $vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' 0D30/','E00E \\1', $vstr); // 0D30 = Ra + $vstr = preg_replace('/([A-F0-9]{4}) '.$halant.' '.$mlprebasedvowels .' 0D30/','\\2 E00E \\1', $vstr); // 0D30 = Ra + + $mlfullforms = "0D15|0D16|0D17|0D18|0D19|0D1A|0D1B|0D1C|0D1D|0D1E|0D1F|0D20|0D21|0D22|0D23|0D24|0D25|0D26|0D27|0D28|0D2A|0D2B|0D2C|0D2D|0D2E|0D2F|0D30|0D31|0D32|0D33|0D34|0D35|0D36|0D37|0D38|0D39" + ."|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D"; + // = FullConsonants + FullConjuncts + + // = Add Chillu characters // mPDF 5.0.024 + $mlfullforms .= "|E004|E005|E006|E007|E008|E009"; + while(preg_match('/('.$mlfullforms.') E00E/', $vstr)) + $vstr = preg_replace('/('.$mlfullforms.') E00E/', 'E00E \\1', $vstr); + } + + //============================ + + // SHIFT post-based vowels to Left of SmallForms (NOT to left of full forms) + + // TELUGU Shift + if ($lang=='te') { + // NB $tevowels defined above + // NB $tefullforms defined above + $tebelowbase1 = "E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E"; //'Small1KaToHa' + $tebelowbase2 = "E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071"; // 'Small2KaToHa' + $vstr = preg_replace('/('.$tebelowbase2.') ('.$tevowels.')/', '\\2 \\1', $vstr); + $vstr = preg_replace('/('.$tebelowbase1.') ('.$tevowels.')/', '\\2 \\1', $vstr); + } + + + // KANNADA Shift + else if ($lang=='kn') { + $knvowels = "0CBE|0CC0|0CC1|0CC2|0CC3|0CC4|0CC7|0CC8|0CCA|0CCB|0CD5|0CD6" + // mPDF 5.3.87 Shouldn't swop E082 and E047 (belowbase1) below + // E082 is a matraIligature + // ."|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E0A6|E0A7|E0A8|E0A9|E0AA|E0AB" + ."|E004|E007|E008|E009|E00A"; + + + // NB $knvowels defined above + // NB $fullforms defined above + // $belowbase1/2 defined above + $vstr = preg_replace('/('.$belowbase2.') ('.$knvowels.')/', '\\2 \\1', $vstr); + // mPDF 5.3.87 + $vstr = preg_replace('/('.$belowbase1.') ('.$knvowels.')/', '\\2 \\1', $vstr); + + //$vstr = preg_replace('/('.$fullforms.') ('.$knvowels.')/', '\\2 \\1', $vstr); + } + + //============================ + // Clear unwanted ZWJ, ZWNJ + // MALAYALAM + if ($lang=='ml') { + $vstr = preg_replace('/(200C|200D) /','', $vstr); + } + + //============================ + // END & PUT IT BACK TOGETHER + $vstr = preg_replace('/^0020 (.*) 0020$/', '\\1', $vstr); + + $varr = explode(" ",$vstr); + $e = ''; + foreach($varr AS $v) { + $e.=code2utf(hexdec($v)); + } + //============================ + + return $e; +} + + +} + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/classes/meter.php b/application/third_party/mpdf/classes/meter.php new file mode 100644 index 0000000..1a59d6b --- /dev/null +++ b/application/third_party/mpdf/classes/meter.php @@ -0,0 +1,224 @@ +<?php + +class meter { + + +function __construct() { + +} + +function makeSVG($tag, $type, $value, $max, $min, $optimum, $low, $high) { + $svg = ''; + if ($tag == 'meter') { + + if ($type=='2') { + ///////////////////////////////////////////////////////////////////////////////////// + ///////// CUSTOM <meter type="2"> + ///////////////////////////////////////////////////////////////////////////////////// + $h = 10; + $w = 160; + $border_radius = 0.143; // Factor of Height + + $svg = '<?xml version="1.0" encoding="UTF-8"?> + <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> + <svg width="'.$w.'px" height="'.$h.'px" viewBox="0 0 '.$w.' '.$h.'" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" ><g> + + + <defs> + <linearGradient id="GrGRAY" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox"> + <stop offset="0%" stop-color="rgb(222, 222, 222)" /> + <stop offset="20%" stop-color="rgb(232, 232, 232)" /> + <stop offset="25%" stop-color="rgb(232, 232, 232)" /> + <stop offset="100%" stop-color="rgb(182, 182, 182)" /> + </linearGradient> + + </defs> +'; + $svg .= '<rect x="0" y="0" width="'.$w.'" height="'.$h.'" fill="#f4f4f4" stroke="none" />'; + + // LOW to HIGH region + //if ($low && $high && ($low != $min || $high != $max)) { + if ($low && $high) { + $barx = (($low-$min) / ($max-$min) ) * $w; + $barw = (($high-$low) / ($max-$min) ) * $w; + $svg .= '<rect x="'.$barx.'" y="0" width="'.$barw.'" height="'.$h.'" fill="url(#GrGRAY)" stroke="#888888" stroke-width="0.5px" />'; + } + + // OPTIMUM Marker (? AVERAGE) + if ($optimum) { + $barx = (($optimum-$min) / ($max-$min) ) * $w; + $barw = $h/2; + $barcol = '#888888'; + $svg .= '<rect x="'.$barx.'" y="0" rx="'.($h*$border_radius).'px" ry="'.($h*$border_radius).'px" width="'.$barw.'" height="'.$h.'" fill="'.$barcol.'" stroke="none" />'; + } + + // VALUE Marker + if ($value) { + if ($min != $low && $value < $low) { $col = 'orange'; } + else if ($max != $high && $value > $high) { $col = 'orange'; } + else { $col = '#008800'; } + $cx = (($value-$min) / ($max-$min) ) * $w; + $cy = $h/2; + $rx = $h/3.5; + $ry = $h/2.2; + $svg .= '<ellipse fill="'.$col.'" stroke="#000000" stroke-width="0.5px" cx="'.$cx.'" cy="'.$cy.'" rx="'.$rx.'" ry="'.$ry.'"/>'; + } + + // BoRDER + $svg .= '<rect x="0" y="0" width="'.$w.'" height="'.$h.'" fill="none" stroke="#888888" stroke-width="0.5px" />'; + + $svg .= '</g></svg>'; + } + else { + ///////////////////////////////////////////////////////////////////////////////////// + ///////// DEFAULT <meter> + ///////////////////////////////////////////////////////////////////////////////////// + $h = 10; + $w = 50; + $border_radius = 0.143; // Factor of Height + + $svg = '<?xml version="1.0" encoding="UTF-8"?> + <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> + <svg width="'.$w.'px" height="'.$h.'px" viewBox="0 0 '.$w.' '.$h.'" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" ><g> + + <defs> + <linearGradient id="GrGRAY" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox"> + <stop offset="0%" stop-color="rgb(222, 222, 222)" /> + <stop offset="20%" stop-color="rgb(232, 232, 232)" /> + <stop offset="25%" stop-color="rgb(232, 232, 232)" /> + <stop offset="100%" stop-color="rgb(182, 182, 182)" /> + </linearGradient> + + <linearGradient id="GrRED" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox"> + <stop offset="0%" stop-color="rgb(255, 162, 162)" /> + <stop offset="20%" stop-color="rgb(255, 218, 218)" /> + <stop offset="25%" stop-color="rgb(255, 218, 218)" /> + <stop offset="100%" stop-color="rgb(255, 0, 0)" /> + </linearGradient> + + <linearGradient id="GrGREEN" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox"> + <stop offset="0%" stop-color="rgb(102, 230, 102)" /> + <stop offset="20%" stop-color="rgb(218, 255, 218)" /> + <stop offset="25%" stop-color="rgb(218, 255, 218)" /> + <stop offset="100%" stop-color="rgb(0, 148, 0)" /> + </linearGradient> + + <linearGradient id="GrBLUE" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox"> + <stop offset="0%" stop-color="rgb(102, 102, 230)" /> + <stop offset="20%" stop-color="rgb(238, 238, 238)" /> + <stop offset="25%" stop-color="rgb(238, 238, 238)" /> + <stop offset="100%" stop-color="rgb(0, 0, 128)" /> + </linearGradient> + + <linearGradient id="GrORANGE" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox"> + <stop offset="0%" stop-color="rgb(255, 186, 0)" /> + <stop offset="20%" stop-color="rgb(255, 238, 168)" /> + <stop offset="25%" stop-color="rgb(255, 238, 168)" /> + <stop offset="100%" stop-color="rgb(255, 155, 0)" /> + </linearGradient> + </defs> + + <rect x="0" y="0" rx="'.($h*$border_radius).'px" ry="'.($h*$border_radius).'px" width="'.$w.'" height="'.$h.'" fill="url(#GrGRAY)" stroke="none" /> +'; + + if ($value) { + $barw = (($value-$min) / ($max-$min) ) * $w; + if ($optimum < $low) { + if ($value < $low) { $barcol = 'url(#GrGREEN)'; } + else if ($value > $high) { $barcol = 'url(#GrRED)'; } + else { $barcol = 'url(#GrORANGE)'; } + } + else if ($optimum > $high) { + if ($value < $low) { $barcol = 'url(#GrRED)'; } + else if ($value > $high) { $barcol = 'url(#GrGREEN)'; } + else { $barcol = 'url(#GrORANGE)'; } + } + else { + if ($value < $low) { $barcol = 'url(#GrORANGE)'; } + else if ($value > $high) { $barcol = 'url(#GrORANGE)'; } + else { $barcol = 'url(#GrGREEN)'; } + } + $svg .= '<rect x="0" y="0" rx="'.($h*$border_radius).'px" ry="'.($h*$border_radius).'px" width="'.$barw.'" height="'.$h.'" fill="'.$barcol.'" stroke="none" />'; + } + + + // Borders + //$svg .= '<rect x="0" y="0" rx="'.($h*$border_radius).'px" ry="'.($h*$border_radius).'px" width="'.$w.'" height="'.$h.'" fill="none" stroke="#888888" stroke-width="0.5px" />'; + if ($value) { + // $svg .= '<rect x="0" y="0" rx="'.($h*$border_radius).'px" ry="'.($h*$border_radius).'px" width="'.$barw.'" height="'.$h.'" fill="none" stroke="#888888" stroke-width="0.5px" />'; + } + + + $svg .= '</g></svg>'; + } + } + else { // $tag == 'progress' + + if ($type=='2') { + ///////////////////////////////////////////////////////////////////////////////////// + ///////// CUSTOM <progress type="2"> + ///////////////////////////////////////////////////////////////////////////////////// + } + else { + ///////////////////////////////////////////////////////////////////////////////////// + ///////// DEFAULT <progress> + ///////////////////////////////////////////////////////////////////////////////////// + $h = 10; + $w = 100; + $border_radius = 0.143; // Factor of Height + + if ($value or $value==='0') { + $fill = 'url(#GrGRAY)'; + } + else { + $fill = '#f8f8f8'; + } + + $svg = '<svg width="'.$w.'px" height="'.$h.'px" viewBox="0 0 '.$w.' '.$h.'"><g> + + <defs> + <linearGradient id="GrGRAY" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox"> + <stop offset="0%" stop-color="rgb(222, 222, 222)" /> + <stop offset="20%" stop-color="rgb(232, 232, 232)" /> + <stop offset="25%" stop-color="rgb(232, 232, 232)" /> + <stop offset="100%" stop-color="rgb(182, 182, 182)" /> + </linearGradient> + + <linearGradient id="GrGREEN" x1="0" y1="0" x2="0" y2="1" gradientUnits="boundingBox"> + <stop offset="0%" stop-color="rgb(102, 230, 102)" /> + <stop offset="20%" stop-color="rgb(218, 255, 218)" /> + <stop offset="25%" stop-color="rgb(218, 255, 218)" /> + <stop offset="100%" stop-color="rgb(0, 148, 0)" /> + </linearGradient> + + </defs> + + <rect x="0" y="0" rx="'.($h*$border_radius).'px" ry="'.($h*$border_radius).'px" width="'.$w.'" height="'.$h.'" fill="'.$fill.'" stroke="none" /> +'; + + if ($value) { + $barw = (($value-$min) / ($max-$min) ) * $w; + $barcol = 'url(#GrGREEN)'; + $svg .= '<rect x="0" y="0" rx="'.($h*$border_radius).'px" ry="'.($h*$border_radius).'px" width="'.$barw.'" height="'.$h.'" fill="'.$barcol.'" stroke="none" />'; + } + + + // Borders + $svg .= '<rect x="0" y="0" rx="'.($h*$border_radius).'px" ry="'.($h*$border_radius).'px" width="'.$w.'" height="'.$h.'" fill="none" stroke="#888888" stroke-width="0.5px" />'; + if ($value) { + // $svg .= '<rect x="0" y="0" rx="'.($h*$border_radius).'px" ry="'.($h*$border_radius).'px" width="'.$barw.'" height="'.$h.'" fill="none" stroke="#888888" stroke-width="0.5px" />'; + } + + + $svg .= '</g></svg>'; + + } + } + + return $svg; +} + + +} // end of class + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/classes/svg.php b/application/third_party/mpdf/classes/svg.php new file mode 100644 index 0000000..40abd76 --- /dev/null +++ b/application/third_party/mpdf/classes/svg.php @@ -0,0 +1,2600 @@ +<?php +// svg class modified for mPDF version 4.4.003 by Ian Back: based on - +// svg2pdf fpdf class +// sylvain briand (syb@godisaduck.com), modified by rick trevino (rtrevino1@yahoo.com) +// http://www.godisaduck.com/svg2pdf_with_fpdf +// http://rhodopsin.blogspot.com +// +// cette class etendue est open source, toute modification devra cependant etre repertorie~ + + +// NB UNITS - Works in pixels as main units - converting to PDF units when outputing to PDF string +// and on returning size + +class SVG { + + var $svg_gradient; // array - contient les infos sur les gradient fill du svg class par id du svg + var $svg_shadinglist; // array - contient les ids des objet shading + var $svg_info; // array contenant les infos du svg voulue par l'utilisateur + var $svg_attribs; // array - holds all attributes of root <svg> tag + var $svg_style; // array contenant les style de groupes du svg + var $svg_string; // String contenant le tracage du svg en lui mme. + var $txt_data; // array - holds string info to write txt to image + var $txt_style; // array - current text style + var $mpdf_ref; + var $xbase; // mPDF 4.4.003 + var $ybase; // mPDF 4.4.003 + var $svg_error; // mPDF 4.4.003 + var $subPathInit; // mPDF 4.4.003 + var $spxstart; // mPDF 4.4.003 + var $spystart; // mPDF 4.4.003 + var $kp; // mPDF 4.4.003 convert pixels to PDF units + var $pathBBox; // mPDF 5.0.039 + + function SVG(&$mpdf){ + $this->svg_gradient = array(); + $this->svg_shadinglist = array(); + $this->txt_data = array(); + $this->svg_string = ''; + $this->svg_info = array(); + $this->svg_attribs = array(); + $this->xbase = 0; + $this->ybase = 0; + $this->svg_error = false; + $this->subPathInit = false; // mPDF 4.4.003 + $this->dashesUsed = false; // mPDF 5.0 + $this->mpdf_ref =& $mpdf; + + $this->kp = 72 / $mpdf->img_dpi; // mPDF 4.4.003 constant To convert pixels to pts/PDF units + $this->kf = 1; // mPDF 5.0.039 constant To convert font size if re-mapped + $this->pathBBox = array(); // mPDF 5.0.039 + + $this->svg_style = array( + array( + 'fill' => 'black', // mPDF 4.4.008 + 'fill-opacity' => 1, // remplissage opaque par defaut + 'fill-rule' => 'nonzero', // mode de remplissage par defaut + 'stroke' => 'none', // pas de trait par defaut + 'stroke-linecap' => 'butt', // style de langle par defaut + 'stroke-linejoin' => 'miter', // + 'stroke-miterlimit' => 4, // limite de langle par defaut + 'stroke-opacity' => 1, // trait opaque par defaut + 'stroke-width' => 1, // mPDF 4.4.011 + 'stroke-dasharray' => 0, // mPDF 4.4.003 + 'stroke-dashoffset' => 0, // mPDF 4.4.003 + 'color' => '' // mPDF 4.4.005 + ) + ); + + $this->txt_style = array( + array( + 'fill' => 'black', // pas de remplissage par defaut + 'font-family' => $mpdf->default_font, + 'font-size' => $mpdf->default_font_size, // ****** this is pts + 'font-weight' => 'normal', // normal | bold + 'font-style' => 'normal', // italic | normal + 'text-anchor' => 'start', // alignment: start, middle, end +/* mPDF 5.0.041 */ + 'fill-opacity' => 1, // remplissage opaque par defaut + 'fill-rule' => 'nonzero', // mode de remplissage par defaut + 'stroke' => 'none', // pas de trait par defaut + 'stroke-opacity' => 1, // trait opaque par defaut + 'stroke-width' => 1, // mPDF 4.4.011 + 'color' => '' // mPDF 4.4.005 + ) + ); + + + + } + + function svgGradient($gradient_info, $attribs, $element){ + $n = count($this->mpdf_ref->gradients)+1; + + // Get bounding dimensions of element + $w = 100; + $h = 100; + $x_offset = 0; + $y_offset = 0; + if ($element=='rect') { + $w = $attribs['width']; + $h = $attribs['height']; + $x_offset = $attribs['x']; + $y_offset = $attribs['y']; + } + else if ($element=='ellipse') { + $w = $attribs['rx']*2; + $h = $attribs['ry']*2; + $x_offset = $attribs['cx']-$attribs['rx']; + $y_offset = $attribs['cy']-$attribs['ry']; + } + else if ($element=='circle') { + $w = $attribs['r']*2; + $h = $attribs['r']*2; + $x_offset = $attribs['cx']-$attribs['r']; + $y_offset = $attribs['cy']-$attribs['r']; + } + else if ($element=='polygon') { + $pts = preg_split('/[ ,]+/', trim($attribs['points'])); + $maxr=$maxb=0; + $minl=$mint=999999; + for ($i=0;$i<count($pts); $i++) { + if ($i % 2 == 0) { // x values + $minl = min($minl,$pts[$i]); + $maxr = max($maxr,$pts[$i]); + } + else { // y values + $mint = min($mint,$pts[$i]); + $maxb = max($maxb,$pts[$i]); + } + } + $w = $maxr-$minl; + $h = $maxb-$mint; + $x_offset = $minl; + $y_offset = $mint; + } + else if ($element=='path') { + // mPDF 5.0.039 + if (is_array($this->pathBBox) && $this->pathBBox[2]>0) { + $w = $this->pathBBox[2]; + $h = $this->pathBBox[3]; + $x_offset = $this->pathBBox[0]; + $y_offset = $this->pathBBox[1]; + } + else { + preg_match_all('/([a-z]|[A-Z])([ ,\-.\d]+)*/', $attribs['d'], $commands, PREG_SET_ORDER); + $maxr=$maxb=0; + $minl=$mint=999999; + foreach($commands as $c){ + if(count($c)==3){ + list($tmp, $cmd, $arg) = $c; + if ($cmd=='M' || $cmd=='L' || $cmd=='C' || $cmd=='S' || $cmd=='Q' || $cmd=='T') { + $pts = preg_split('/[ ,]+/', trim($arg)); + for ($i=0;$i<count($pts); $i++) { + if ($i % 2 == 0) { // x values + $minl = min($minl,$pts[$i]); + $maxr = max($maxr,$pts[$i]); + } + else { // y values + $mint = min($mint,$pts[$i]); + $maxb = max($maxb,$pts[$i]); + } + } + } + if ($cmd=='H') { // sets new x + $minl = min($minl,$arg); + $maxr = max($maxr,$arg); + } + if ($cmd=='V') { // sets new y + $mint = min($mint,$arg); + $maxb = max($maxb,$arg); + } + } + } + $w = $maxr-$minl; + $h = $maxb-$mint; + $x_offset = $minl; + $y_offset = $mint; + } + } + if (!$w || $w==-999999) { $w = 100; } + if (!$h || $h==-999999) { $h = 100; } + if ($x_offset==999999) { $x_offset = 0; } + if ($y_offset==999999) { $y_offset = 0; } + + // mPDF 4.5.010 + // TRANSFORMATIONS + $transformations = ''; + if (isset($gradient_info['transform'])){ + preg_match_all('/(matrix|translate|scale|rotate|skewX|skewY)\((.*?)\)/is',$gradient_info['transform'],$m); + if (count($m[0])) { + for($i=0; $i<count($m[0]); $i++) { + $c = strtolower($m[1][$i]); + $v = trim($m[2][$i]); + $vv = preg_split('/[ ,]+/',$v); + if ($c=='matrix' && count($vv)==6) { + // mPDF 5.0.039 + // Note angle of rotation is reversed (from SVG to PDF), so vv[1] and vv[2] are negated + // cf svgDefineStyle() + $transformations .= sprintf(' %.3F %.3F %.3F %.3F %.3F %.3F cm ', $vv[0], -$vv[1], -$vv[2], $vv[3], $vv[4]*$this->kp, -$vv[5]*$this->kp); + } + else if ($c=='translate' && count($vv)) { + $tm[4] = $vv[0]; + if (count($vv)==2) { $t_y = -$vv[1]; } + else { $t_y = 0; } + $tm[5] = $t_y; + $transformations .= sprintf(' 1 0 0 1 %.3F %.3F cm ', $tm[4]*$this->kp, $tm[5]*$this->kp); + } + else if ($c=='scale' && count($vv)) { + if (count($vv)==2) { $s_y = $vv[1]; } + else { $s_y = $vv[0]; } + $tm[0] = $vv[0]; + $tm[3] = $s_y; + $transformations .= sprintf(' %.3F 0 0 %.3F 0 0 cm ', $tm[0], $tm[3]); + } + else if ($c=='rotate' && count($vv)) { + $tm[0] = cos(deg2rad(-$vv[0])); + $tm[1] = sin(deg2rad(-$vv[0])); + $tm[2] = -$tm[1]; + $tm[3] = $tm[0]; + if (count($vv)==3) { + $transformations .= sprintf(' 1 0 0 1 %.3F %.3F cm ', $vv[1]*$this->kp, -$vv[2]*$this->kp); + } + $transformations .= sprintf(' %.3F %.3F %.3F %.3F 0 0 cm ', $tm[0], $tm[1], $tm[2], $tm[3]); + if (count($vv)==3) { + $transformations .= sprintf(' 1 0 0 1 %.3F %.3F cm ', -$vv[1]*$this->kp, $vv[2]*$this->kp); + } + } + else if ($c=='skewx' && count($vv)) { + $tm[2] = tan(deg2rad(-$vv[0])); + $transformations .= sprintf(' 1 0 %.3F 1 0 0 cm ', $tm[2]); + } + else if ($c=='skewy' && count($vv)) { + $tm[1] = tan(deg2rad(-$vv[0])); + $transformations .= sprintf(' 1 %.3F 0 1 0 0 cm ', $tm[1]); + } + + } + } + } + + + $return = ""; + + // mPDF 5.0.039 + if (isset($gradient_info['units']) && strtolower($gradient_info['units'])=='userspaceonuse') { + if ($transformations) { $return .= $transformations; } + } + // mPDF 5.0.040 + $spread = 'P'; // pad + if (isset($gradient_info['spread'])) { + if (strtolower($gradient_info['spread'])=='reflect') { $spread = 'F'; } // reflect + else if (strtolower($gradient_info['spread'])=='repeat') { $spread = 'R'; } // repeat + } + + + for ($i=0; $i<(count($gradient_info['color'])); $i++) { + if (stristr($gradient_info['color'][$i]['offset'], '%')!== false) { $gradient_info['color'][$i]['offset'] = ($gradient_info['color'][$i]['offset']+0)/100; } + if (stristr($gradient_info['color'][($i+1)]['offset'], '%')!== false) { $gradient_info['color'][($i+1)]['offset'] = ($gradient_info['color'][($i+1)]['offset']+0)/100; } + if ($gradient_info['color'][$i]['offset']<0) { $gradient_info['color'][$i]['offset'] = 0; } + if ($gradient_info['color'][$i]['offset']>1) { $gradient_info['color'][$i]['offset'] = 1; } + if ($i>0) { + if ($gradient_info['color'][$i]['offset']<$gradient_info['color'][($i-1)]['offset']) { + $gradient_info['color'][$i]['offset']=$gradient_info['color'][($i-1)]['offset']; + } + } + } + + if ($gradient_info['color'][0]['offset']>0) { + array_unshift($gradient_info['color'], $gradient_info['color'][0]); + $gradient_info['color'][0]['offset'] = 0; + } + $ns = count($gradient_info['color']); + if ($gradient_info['color'][($ns-1)]['offset']<1) { + $gradient_info['color'][] = $gradient_info['color'][($ns-1)]; + $gradient_info['color'][($ns)]['offset'] = 1; + } + $ns = count($gradient_info['color']); + + + + + if ($gradient_info['type'] == 'linear'){ + // mPDF 4.4.003 + if (isset($gradient_info['units']) && strtolower($gradient_info['units'])=='userspaceonuse') { + if (isset($gradient_info['info']['x1'])) { $gradient_info['info']['x1'] = ($gradient_info['info']['x1']-$x_offset) / $w; } + if (isset($gradient_info['info']['y1'])) { $gradient_info['info']['y1'] = ($gradient_info['info']['y1']-$y_offset) / $h; } + if (isset($gradient_info['info']['x2'])) { $gradient_info['info']['x2'] = ($gradient_info['info']['x2']-$x_offset) / $w; } + if (isset($gradient_info['info']['y2'])) { $gradient_info['info']['y2'] = ($gradient_info['info']['y2']-$y_offset) / $h; } + } + if (isset($gradient_info['info']['x1'])) { $x1 = $gradient_info['info']['x1']; } + else { $x1 = 0; } + if (isset($gradient_info['info']['y1'])) { $y1 = $gradient_info['info']['y1']; } + else { $y1 = 0; } + if (isset($gradient_info['info']['x2'])) { $x2 = $gradient_info['info']['x2']; } + else { $x2 = 1; } + if (isset($gradient_info['info']['y2'])) { $y2 = $gradient_info['info']['y2']; } + else { $y2 = 0; } + + if (stristr($x1, '%')!== false) { $x1 = ($x1+0)/100; } + if (stristr($x2, '%')!== false) { $x2 = ($x2+0)/100; } + if (stristr($y1, '%')!== false) { $y1 = ($y1+0)/100; } + if (stristr($y2, '%')!== false) { $y2 = ($y2+0)/100; } + + // mPDF 5.0.042 + $bboxw = $w; + $bboxh = $h; + $usex = $x_offset; + $usey = $y_offset; + $usew = $bboxw; + $useh = $bboxh; + if (isset($gradient_info['units']) && strtolower($gradient_info['units'])=='userspaceonuse') { + $angle = rad2deg(atan2(($gradient_info['info']['y2']-$gradient_info['info']['y1']), ($gradient_info['info']['x2']-$gradient_info['info']['x1']))); + if ($angle < 0) { $angle += 360; } + else if ($angle > 360) { $angle -= 360; } + if ($angle!=0 && $angle!=360 && $angle!=90 && $angle!=180 && $angle!=270) { + if ($w >= $h) { + $y1 *= $h/$w ; + $y2 *= $h/$w ; + $usew = $useh = $bboxw; + } + else { + $x1 *= $w/$h ; + $x2 *= $w/$h ; + $usew = $useh = $bboxh; + } + } + } + $a = $usew; // width + $d = -$useh; // height + $e = $usex; // x- offset + $f = -$usey; // -y-offset + + $return .= sprintf('%.3F 0 0 %.3F %.3F %.3F cm ', $a*$this->kp, $d*$this->kp, $e*$this->kp, $f*$this->kp); + + // mPDF 5.0.039 + if (isset($gradient_info['units']) && strtolower($gradient_info['units'])=='objectboundingbox') { + if ($transformations) { $return .= $transformations; } + } + + // mPDF 5.0.020 + $trans = false; + + // mPDF 5.0.040 + if ($spread=='R' || $spread=='F') { // Repeat / Reflect + $offs = array(); + for($i=0;$i<$ns;$i++) { + $offs[$i] = $gradient_info['color'][$i]['offset']; + } + $gp = 0; + $inside=true; + while($inside) { + $gp++; + for($i=0;$i<$ns;$i++) { + if ($spread=='F' && ($gp % 2) == 1) { // Reflect + $gradient_info['color'][(($ns*$gp)+$i)] = $gradient_info['color'][(($ns*($gp-1))+($ns-$i-1))]; + $tmp = $gp+(1-$offs[($ns-$i-1)]) ; + $gradient_info['color'][(($ns*$gp)+$i)]['offset'] = $tmp; + } + else { // Reflect + $gradient_info['color'][(($ns*$gp)+$i)] = $gradient_info['color'][$i]; + $tmp = $gp+$offs[$i] ; + $gradient_info['color'][(($ns*$gp)+$i)]['offset'] = $tmp; + } + // IF STILL INSIDE BOX OR STILL VALID + // Point on axis to test + $px1 = $x1 + ($x2-$x1)*$tmp; + $py1 = $y1 + ($y2-$y1)*$tmp; + // Get perpendicular axis + $alpha = atan2($y2-$y1, $x2-$x1); + $alpha += M_PI/2; // rotate 90 degrees + // Get arbitrary point to define line perpendicular to axis + $px2 = $px1+cos($alpha); + $py2 = $py1+sin($alpha); + + $res1 = _testIntersect($px1, $py1, $px2, $py2, 0, 0, 0, 1); // $x=0 vert axis + $res2 = _testIntersect($px1, $py1, $px2, $py2, 1, 0, 1, 1); // $x=1 vert axis + $res3 = _testIntersect($px1, $py1, $px2, $py2, 0, 0, 1, 0); // $y=0 horiz axis + $res4 = _testIntersect($px1, $py1, $px2, $py2, 0, 1, 1, 1); // $y=1 horiz axis + if (!$res1 && !$res2 && !$res3 && !$res4) { $inside = false; } + } + } + + $inside=true; + $gp = 0; + while($inside) { + $gp++; + $newarr = array(); + for($i=0;$i<$ns;$i++) { + if ($spread=='F') { // Reflect + $newarr[$i] = $gradient_info['color'][($ns-$i-1)]; + if (($gp % 2) == 1) { + $tmp = -$gp+(1-$offs[($ns-$i-1)]); + $newarr[$i]['offset'] = $tmp; + } + else { + $tmp = -$gp+$offs[$i]; + $newarr[$i]['offset'] = $tmp; + } + } + else { // Reflect + $newarr[$i] = $gradient_info['color'][$i]; + $tmp = -$gp+$offs[$i]; + $newarr[$i]['offset'] = $tmp; + } + + // IF STILL INSIDE BOX OR STILL VALID + // Point on axis to test + $px1 = $x1 + ($x2-$x1)*$tmp; + $py1 = $y1 + ($y2-$y1)*$tmp; + // Get perpendicular axis + $alpha = atan2($y2-$y1, $x2-$x1); + $alpha += M_PI/2; // rotate 90 degrees + // Get arbitrary point to define line perpendicular to axis + $px2 = $px1+cos($alpha); + $py2 = $py1+sin($alpha); + + $res1 = _testIntersect($px1, $py1, $px2, $py2, 0, 0, 0, 1); // $x=0 vert axis + $res2 = _testIntersect($px1, $py1, $px2, $py2, 1, 0, 1, 1); // $x=1 vert axis + $res3 = _testIntersect($px1, $py1, $px2, $py2, 0, 0, 1, 0); // $y=0 horiz axis + $res4 = _testIntersect($px1, $py1, $px2, $py2, 0, 1, 1, 1); // $y=1 horiz axis + if (!$res1 && !$res2 && !$res3 && !$res4) { $inside = false; } + } + for($i=($ns-1);$i>=0;$i--) { + if (isset($newarr[$i]['offset'])) array_unshift($gradient_info['color'], $newarr[$i]); + } + } + } + + // mPDF 4.4.007 Gradient STOPs + $stops = count($gradient_info['color']); + if ($stops < 2) { return ''; } + + // mPDF 5.0.042 + $range = $gradient_info['color'][count($gradient_info['color'])-1]['offset']-$gradient_info['color'][0]['offset']; + $min = $gradient_info['color'][0]['offset']; + + for ($i=0; $i<($stops); $i++) { + // mPDF 5.0.051 + if (!$gradient_info['color'][$i]['color']) { + if ($gradient_info['colorspace']=='RGB') $gradient_info['color'][$i]['color'] = '0 0 0'; + else if ($gradient_info['colorspace']=='Gray') $gradient_info['color'][$i]['color'] = '0'; + else if ($gradient_info['colorspace']=='CMYK') $gradient_info['color'][$i]['color'] = '1 1 1 1'; + } + $offset = ($gradient_info['color'][$i]['offset'] - $min)/$range; + $this->mpdf_ref->gradients[$n]['stops'][] = array( + 'col' => $gradient_info['color'][$i]['color'], + 'opacity' => $gradient_info['color'][$i]['opacity'], + 'offset' => $offset); + if ($gradient_info['color'][$i]['opacity']<1) { $trans = true; } + } + $grx1 = $x1 + ($x2-$x1)*$gradient_info['color'][0]['offset']; + $gry1 = $y1 + ($y2-$y1)*$gradient_info['color'][0]['offset']; + $grx2 = $x1 + ($x2-$x1)*$gradient_info['color'][count($gradient_info['color'])-1]['offset']; + $gry2 = $y1 + ($y2-$y1)*$gradient_info['color'][count($gradient_info['color'])-1]['offset']; + + $this->mpdf_ref->gradients[$n]['coords']=array($grx1, $gry1, $grx2, $gry2); + + $this->mpdf_ref->gradients[$n]['colorspace'] = $gradient_info['colorspace']; // mPDF 5.0.051 + + $this->mpdf_ref->gradients[$n]['type'] = 2; + $this->mpdf_ref->gradients[$n]['fo'] = true; + + $this->mpdf_ref->gradients[$n]['extend']=array('true','true'); + if ($trans) { + $this->mpdf_ref->gradients[$n]['trans'] = true; + $return .= ' /TGS'.($n).' gs '; + } + $return .= ' /Sh'.($n).' sh '; + $return .= " Q\n"; + } + else if ($gradient_info['type'] == 'radial'){ + // mPDF 4.4.003 + if (isset($gradient_info['units']) && strtolower($gradient_info['units'])=='userspaceonuse') { + if ($w > $h) { $h = $w; } + else { $w = $h; } + if (isset($gradient_info['info']['x0'])) { $gradient_info['info']['x0'] = ($gradient_info['info']['x0']-$x_offset) / $w; } + if (isset($gradient_info['info']['y0'])) { $gradient_info['info']['y0'] = ($gradient_info['info']['y0']-$y_offset) / $h; } + if (isset($gradient_info['info']['x1'])) { $gradient_info['info']['x1'] = ($gradient_info['info']['x1']-$x_offset) / $w; } + if (isset($gradient_info['info']['y1'])) { $gradient_info['info']['y1'] = ($gradient_info['info']['y1']-$y_offset) / $h; } + if (isset($gradient_info['info']['r'])) { $gradient_info['info']['rx'] = $gradient_info['info']['r'] / $w; } + if (isset($gradient_info['info']['r'])) { $gradient_info['info']['ry'] = $gradient_info['info']['r'] / $h; } + } + + if ($gradient_info['info']['x0'] || $gradient_info['info']['x0']===0) { $x0 = $gradient_info['info']['x0']; } + else { $x0 = 0.5; } + if ($gradient_info['info']['y0'] || $gradient_info['info']['y0']===0) { $y0 = $gradient_info['info']['y0']; } + else { $y0 = 0.5; } + if ($gradient_info['info']['rx'] || $gradient_info['info']['rx']===0) { $rx = $gradient_info['info']['rx']; } + else if ($gradient_info['info']['r'] || $gradient_info['info']['r']===0) { $rx = $gradient_info['info']['r']; } + else { $rx = 0.5; } + if ($gradient_info['info']['ry'] || $gradient_info['info']['ry']===0) { $ry = $gradient_info['info']['ry']; } + else if ($gradient_info['info']['r'] || $gradient_info['info']['r']===0) { $ry = $gradient_info['info']['r']; } + else { $ry = 0.5; } + if ($gradient_info['info']['x1'] || $gradient_info['info']['x1']===0) { $x1 = $gradient_info['info']['x1']; } + else { $x1 = $x0; } + if ($gradient_info['info']['y1'] || $gradient_info['info']['y1']===0) { $y1 = $gradient_info['info']['y1']; } + else { $y1 = $y0; } + + if (stristr($x1, '%')!== false) { $x1 = ($x1+0)/100; } + if (stristr($x0, '%')!== false) { $x0 = ($x0+0)/100; } + if (stristr($y1, '%')!== false) { $y1 = ($y1+0)/100; } + if (stristr($y0, '%')!== false) { $y0 = ($y0+0)/100; } + if (stristr($rx, '%')!== false) { $rx = ($rx+0)/100; } + if (stristr($ry, '%')!== false) { $ry = ($ry+0)/100; } + + // mPDF 5.0.043 + $bboxw = $w; + $bboxh = $h; + $usex = $x_offset; + $usey = $y_offset; + $usew = $bboxw; + $useh = $bboxh; + if (isset($gradient_info['units']) && strtolower($gradient_info['units'])=='userspaceonuse') { + $angle = rad2deg(atan2(($gradient_info['info']['y0']-$gradient_info['info']['y1']), ($gradient_info['info']['x0']-$gradient_info['info']['x1']))); + if ($angle < 0) { $angle += 360; } + else if ($angle > 360) { $angle -= 360; } + if ($angle!=0 && $angle!=360 && $angle!=90 && $angle!=180 && $angle!=270) { + if ($w >= $h) { + $y1 *= $h/$w ; + $y0 *= $h/$w ; + $rx *= $h/$w ; + $ry *= $h/$w ; + $usew = $useh = $bboxw; + } + else { + $x1 *= $w/$h ; + $x0 *= $w/$h ; + $rx *= $w/$h ; + $ry *= $w/$h ; + $usew = $useh = $bboxh; + } + } + } + $a = $usew; // width + $d = -$useh; // height + $e = $usex; // x- offset + $f = -$usey; // -y-offset + + $r = $rx; + + + $return .= sprintf('%.3F 0 0 %.3F %.3F %.3F cm ', $a*$this->kp, $d*$this->kp, $e*$this->kp, $f*$this->kp); + + // mPDF 5.0.039 + if (isset($gradient_info['units']) && strtolower($gradient_info['units'])=='objectboundingbox') { + if ($transformations) { $return .= $transformations; } + } + + // x1 and y1 (fx, fy) should be inside the circle defined by x0 y0 and r else error in mPDF + while (pow(($x1-$x0),2) + pow(($y1 - $y0),2) >= pow($r,2)) { $r += 0.05; } + + // mPDF 5.0.040 + if ($spread=='R' || $spread=='F') { // Repeat / Reflect + $offs = array(); + for($i=0;$i<$ns;$i++) { + $offs[$i] = $gradient_info['color'][$i]['offset']; + } + $gp = 0; + $inside=true; + while($inside) { + $gp++; + for($i=0;$i<$ns;$i++) { + if ($spread=='F' && ($gp % 2) == 1) { // Reflect + $gradient_info['color'][(($ns*$gp)+$i)] = $gradient_info['color'][(($ns*($gp-1))+($ns-$i-1))]; + $tmp = $gp+(1-$offs[($ns-$i-1)]) ; + $gradient_info['color'][(($ns*$gp)+$i)]['offset'] = $tmp; + } + else { // Reflect + $gradient_info['color'][(($ns*$gp)+$i)] = $gradient_info['color'][$i]; + $tmp = $gp+$offs[$i] ; + $gradient_info['color'][(($ns*$gp)+$i)]['offset'] = $tmp; + } + // IF STILL INSIDE BOX OR STILL VALID + // TEST IF circle (perimeter) intersects with + // or is enclosed + // Point on axis to test + $px = $x1 + ($x0-$x1)*$tmp; + $py = $y1 + ($y0-$y1)*$tmp; + $pr = $r*$tmp; + $res = _testIntersectCircle($px, $py, $pr); + if (!$res) { $inside = false; } + } + } + } + + // mPDF 4.4.007 Gradient STOPs + $stops = count($gradient_info['color']); + if ($stops < 2) { return ''; } + + // mPDF 5.0.043 + $range = $gradient_info['color'][count($gradient_info['color'])-1]['offset']-$gradient_info['color'][0]['offset']; + $min = $gradient_info['color'][0]['offset']; + + for ($i=0; $i<($stops); $i++) { + // mPDF 5.0.051 + if (!$gradient_info['color'][$i]['color']) { + if ($gradient_info['colorspace']=='RGB') $gradient_info['color'][$i]['color'] = '0 0 0'; + else if ($gradient_info['colorspace']=='Gray') $gradient_info['color'][$i]['color'] = '0'; + else if ($gradient_info['colorspace']=='CMYK') $gradient_info['color'][$i]['color'] = '1 1 1 1'; + } + $offset = ($gradient_info['color'][$i]['offset'] - $min)/$range; + $this->mpdf_ref->gradients[$n]['stops'][] = array( + 'col' => $gradient_info['color'][$i]['color'], + 'opacity' => $gradient_info['color'][$i]['opacity'], + 'offset' => $offset); + if ($gradient_info['color'][$i]['opacity']<1) { $trans = true; } + } + $grx1 = $x1 + ($x0-$x1)*$gradient_info['color'][0]['offset']; + $gry1 = $y1 + ($y0-$y1)*$gradient_info['color'][0]['offset']; + $grx2 = $x1 + ($x0-$x1)*$gradient_info['color'][count($gradient_info['color'])-1]['offset']; + $gry2 = $y1 + ($y0-$y1)*$gradient_info['color'][count($gradient_info['color'])-1]['offset']; + $grir = $r*$gradient_info['color'][0]['offset']; + $grr = $r*$gradient_info['color'][count($gradient_info['color'])-1]['offset']; + + $this->mpdf_ref->gradients[$n]['coords']=array($grx1, $gry1, $grx2, $gry2, abs($grr), abs($grir) ); + + $grx1 = $x1 + ($x0-$x1)*$first_stop; + $gry1 = $y1 + ($y0-$y1)*$first_stop; + $grx2 = $x1 + ($x0-$x1)*$last_stop; + $gry2 = $y1 + ($y0-$y1)*$last_stop; + $grir = $r*$first_stop; + $grr = $r*$last_stop; + $this->mpdf_ref->gradients[$n]['colorspace'] = $gradient_info['colorspace']; // mPDF 5.0.051 + + $this->mpdf_ref->gradients[$n]['type'] = 3; + $this->mpdf_ref->gradients[$n]['fo'] = true; + + $this->mpdf_ref->gradients[$n]['extend']=array('true','true'); + if ($trans) { + $this->mpdf_ref->gradients[$n]['trans'] = true; + $return .= ' /TGS'.($n).' gs '; + } + $return .= ' /Sh'.($n).' sh '; + $return .= " Q\n"; + + + } + + return $return; + } + + + function svgOffset ($attribs){ + // save all <svg> tag attributes + $this->svg_attribs = $attribs; + if(isset($this->svg_attribs['viewBox'])) { + $vb = preg_split('/\s+/is', trim($this->svg_attribs['viewBox'])); + if (count($vb)==4) { + $this->svg_info['x'] = $vb[0]; + $this->svg_info['y'] = $vb[1]; + $this->svg_info['w'] = $vb[2]; + $this->svg_info['h'] = $vb[3]; +// return; // mPDF 5.0.005 + } + } + + $svg_w = $this->mpdf_ref->ConvertSize($attribs['width']); // mm (interprets numbers as pixels) + $svg_h = $this->mpdf_ref->ConvertSize($attribs['height']); // mm + +///* + // mPDF 5.0.005 + if ($this->svg_info['w']) { // if 'w' set by viewBox + if ($svg_w) { // if width also set, use these values to determine to set size of "pixel" + $this->kp *= ($svg_w/0.2645) / $this->svg_info['w']; + $this->kf = ($svg_w/0.2645) / $this->svg_info['w']; // mPDF 5.0.039 + } + else if ($svg_h) { + $this->kp *= ($svg_h/0.2645) / $this->svg_info['h']; + $this->kf = ($svg_h/0.2645) / $this->svg_info['h']; // mPDF 5.0.039 + } + return; + } +//*/ + + // Added to handle file without height or width specified + if (!$svg_w && !$svg_h) { $svg_w = $svg_h = $this->mpdf_ref->blk[$this->mpdf_ref->blklvl]['inner_width'] ; } // DEFAULT + if (!$svg_w) { $svg_w = $svg_h; } + if (!$svg_h) { $svg_h = $svg_w; } + + $this->svg_info['x'] = 0; + $this->svg_info['y'] = 0; + $this->svg_info['w'] = $svg_w/0.2645; // mm->pixels + $this->svg_info['h'] = $svg_h/0.2645; // mm->pixels + + } + + + // + // check if points are within svg, if not, set to max + function svg_overflow($x,$y) + { + $x2 = $x; + $y2 = $y; + if(isset($this->svg_attribs['overflow'])) + { + if($this->svg_attribs['overflow'] == 'hidden') + { + // Not sure if this is supposed to strip off units, but since I dont use any I will omlt this step + $svg_w = preg_replace("/([0-9\.]*)(.*)/i","$1",$this->svg_attribs['width']); + $svg_h = preg_replace("/([0-9\.]*)(.*)/i","$1",$this->svg_attribs['height']); + + // $xmax = floor($this->svg_attribs['width']); + $xmax = floor($svg_w); + $xmin = 0; + // $ymax = floor(($this->svg_attribs['height'] * -1)); + $ymax = floor(($svg_h * -1)); + $ymin = 0; + + if($x > $xmax) $x2 = $xmax; // right edge + if($x < $xmin) $x2 = $xmin; // left edge + if($y < $ymax) $y2 = $ymax; // bottom + if($y > $ymin) $y2 = $ymin; // top + + } + } + + + return array( 'x' => $x2, 'y' => $y2); + } + + + + function svgDefineStyle($critere_style){ + + $tmp = count($this->svg_style)-1; + $current_style = $this->svg_style[$tmp]; + + unset($current_style['transformations']); + + // TRANSFORM SCALE + $transformations = ''; + if (isset($critere_style['transform'])){ + preg_match_all('/(matrix|translate|scale|rotate|skewX|skewY)\((.*?)\)/is',$critere_style['transform'],$m); + if (count($m[0])) { + for($i=0; $i<count($m[0]); $i++) { + $c = strtolower($m[1][$i]); + $v = trim($m[2][$i]); + $vv = preg_split('/[ ,]+/',$v); + if ($c=='matrix' && count($vv)==6) { + // mPDF 5.0.039 + // Note angle of rotation is reversed (from SVG to PDF), so vv[1] and vv[2] are negated + $transformations .= sprintf(' %.3F %.3F %.3F %.3F %.3F %.3F cm ', $vv[0], -$vv[1], -$vv[2], $vv[3], $vv[4]*$this->kp, -$vv[5]*$this->kp); + +/* +// The long way of doing this?? +// need to reverse angle of rotation from SVG to PDF +$sx=sqrt(pow($vv[0],2)+pow($vv[2],2)); +if ($vv[0] < 0) { $sx *= -1; } // change sign +$sy=sqrt(pow($vv[1],2)+pow($vv[3],2)); +if ($vv[3] < 0) { $sy *= -1; } // change sign + +// rotation angle is +$t=atan2($vv[1],$vv[3]); +$t=atan2(-$vv[2],$vv[0]); // Should be the same value or skew has been applied + +// Reverse angle +$t *= -1; + +// Rebuild matrix +$ma = $sx * cos($t); +$mb = $sy * sin($t); +$mc = -$sx * sin($t); +$md = $sy * cos($t); + +// $transformations .= sprintf(' %.3F %.3F %.3F %.3F %.3F %.3F cm ', $ma, $mb, $mc, $md, $vv[4]*$this->kp, -$vv[5]*$this->kp); +*/ + + } + else if ($c=='translate' && count($vv)) { + $tm[4] = $vv[0]; + if (count($vv)==2) { $t_y = -$vv[1]; } + else { $t_y = 0; } + $tm[5] = $t_y; + $transformations .= sprintf(' 1 0 0 1 %.3F %.3F cm ', $tm[4]*$this->kp, $tm[5]*$this->kp); + } + else if ($c=='scale' && count($vv)) { + if (count($vv)==2) { $s_y = $vv[1]; } + else { $s_y = $vv[0]; } + $tm[0] = $vv[0]; + $tm[3] = $s_y; + $transformations .= sprintf(' %.3F 0 0 %.3F 0 0 cm ', $tm[0], $tm[3]); + } + else if ($c=='rotate' && count($vv)) { + $tm[0] = cos(deg2rad(-$vv[0])); + $tm[1] = sin(deg2rad(-$vv[0])); + $tm[2] = -$tm[1]; + $tm[3] = $tm[0]; + if (count($vv)==3) { + $transformations .= sprintf(' 1 0 0 1 %.3F %.3F cm ', $vv[1]*$this->kp, -$vv[2]*$this->kp); + } + $transformations .= sprintf(' %.3F %.3F %.3F %.3F 0 0 cm ', $tm[0], $tm[1], $tm[2], $tm[3]); + if (count($vv)==3) { + $transformations .= sprintf(' 1 0 0 1 %.3F %.3F cm ', -$vv[1]*$this->kp, $vv[2]*$this->kp); + } + } + else if ($c=='skewx' && count($vv)) { + $tm[2] = tan(deg2rad(-$vv[0])); + $transformations .= sprintf(' 1 0 %.3F 1 0 0 cm ', $tm[2]); + } + else if ($c=='skewy' && count($vv)) { + $tm[1] = tan(deg2rad(-$vv[0])); + $transformations .= sprintf(' 1 %.3F 0 1 0 0 cm ', $tm[1]); + } + + } + } + $current_style['transformations'] = $transformations; + } + + if (isset($critere_style['style'])){ + if (preg_match('/fill:\s*rgb\((\d+),\s*(\d+),\s*(\d+)\)/',$critere_style['style'], $m)) { + $current_style['fill'] = '#'.str_pad(dechex($m[1]), 2, "0", STR_PAD_LEFT).str_pad(dechex($m[2]), 2, "0", STR_PAD_LEFT).str_pad(dechex($m[3]), 2, "0", STR_PAD_LEFT); + } + else { $tmp = preg_replace("/(.*)fill:\s*([a-z0-9#_()]*|none)(.*)/i","$2",$critere_style['style']); // mPDF 4.4.003 + if ($tmp != $critere_style['style']){ $current_style['fill'] = $tmp; } + } + + $tmp = preg_replace("/(.*)fill-opacity:\s*([a-z0-9.]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $current_style['fill-opacity'] = $tmp;} + + $tmp = preg_replace("/(.*)fill-rule:\s*([a-z0-9#]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $current_style['fill-rule'] = $tmp;} + + if (preg_match('/stroke:\s*rgb\((\d+),\s*(\d+),\s*(\d+)\)/',$critere_style['style'], $m)) { + $current_style['stroke'] = '#'.str_pad(dechex($m[1]), 2, "0", STR_PAD_LEFT).str_pad(dechex($m[2]), 2, "0", STR_PAD_LEFT).str_pad(dechex($m[3]), 2, "0", STR_PAD_LEFT); + } + else { $tmp = preg_replace("/(.*)stroke:\s*([a-z0-9#]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $current_style['stroke'] = $tmp; } + } + + $tmp = preg_replace("/(.*)stroke-linecap:\s*([a-z0-9#]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $current_style['stroke-linecap'] = $tmp;} + + $tmp = preg_replace("/(.*)stroke-linejoin:\s*([a-z0-9#]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $current_style['stroke-linejoin'] = $tmp;} + + $tmp = preg_replace("/(.*)stroke-miterlimit:\s*([a-z0-9#]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $current_style['stroke-miterlimit'] = $tmp;} + + $tmp = preg_replace("/(.*)stroke-opacity:\s*([a-z0-9.]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $current_style['stroke-opacity'] = $tmp; } + + $tmp = preg_replace("/(.*)stroke-width:\s*([a-z0-9.]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $current_style['stroke-width'] = $tmp;} + + // mPDF 4.4.003 + $tmp = preg_replace("/(.*)stroke-dasharray:\s*([a-z0-9., ]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $current_style['stroke-dasharray'] = $tmp;} + + // mPDF 4.4.003 + $tmp = preg_replace("/(.*)stroke-dashoffset:\s*([a-z0-9.]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $current_style['stroke-dashoffset'] = $tmp;} + + } + if(isset($critere_style['fill'])){ + $current_style['fill'] = $critere_style['fill']; + } + + if(isset($critere_style['fill-opacity'])){ + $current_style['fill-opacity'] = $critere_style['fill-opacity']; + } + + if(isset($critere_style['fill-rule'])){ + $current_style['fill-rule'] = $critere_style['fill-rule']; + } + + if(isset($critere_style['stroke'])){ + $current_style['stroke'] = $critere_style['stroke']; + } + + if(isset($critere_style['stroke-linecap'])){ + $current_style['stroke-linecap'] = $critere_style['stroke-linecap']; + } + + if(isset($critere_style['stroke-linejoin'])){ + $current_style['stroke-linejoin'] = $critere_style['stroke-linejoin']; + } + + if(isset($critere_style['stroke-miterlimit'])){ + $current_style['stroke-miterlimit'] = $critere_style['stroke-miterlimit']; + } + + if(isset($critere_style['stroke-opacity'])){ + $current_style['stroke-opacity'] = $critere_style['stroke-opacity']; + } + + if(isset($critere_style['stroke-width'])){ + $current_style['stroke-width'] = $critere_style['stroke-width']; + } + + // mPDF 4.4.003 + if(isset($critere_style['stroke-dasharray'])){ + $current_style['stroke-dasharray'] = $critere_style['stroke-dasharray']; + } + if(isset($critere_style['stroke-dashoffset'])){ + $current_style['stroke-dashoffset'] = $critere_style['stroke-dashoffset']; + } + + // mPDF 4.4.005 Used as indirect setting for currentColor + if(isset($critere_style['color']) && $critere_style['color'] != 'inherit'){ + $current_style['color'] = $critere_style['color']; + } + + return $current_style; + + } + + // + // Cette fonction ecrit le style dans le stream svg. + function svgStyle($critere_style, $attribs, $element){ + $path_style = ''; + if (substr_count($critere_style['fill'],'url')>0){ + // + // couleur degrad + $id_gradient = preg_replace("/url\(#([\w_]*)\)/i","$1",$critere_style['fill']); + if ($id_gradient != $critere_style['fill']) { + if (isset($this->svg_gradient[$id_gradient])) { + $fill_gradient = $this->svgGradient($this->svg_gradient[$id_gradient], $attribs, $element); + if ($fill_gradient) { // mPDF 4.4.003 + $path_style = "q "; + $w = "W"; + $style .= 'N'; + } + } + } + + } + // mPDF 4.4.005 Used as indirect setting for currentColor + else if (strtolower($critere_style['fill']) == 'currentcolor'){ + $col = $this->mpdf_ref->ConvertColor($critere_style['color']); + if ($col) { + // mPDF 5.0.051 + // mPDF 5.3.74 + if ($col{0}==5) { $critere_style['fill-opacity'] = ord($col{4}/100); } // RGBa + if ($col{0}==6) { $critere_style['fill-opacity'] = ord($col{5}/100); } // CMYKa + $path_style .= $this->mpdf_ref->SetFColor($col, true).' '; // mPDF 5.0.051 + $style .= 'F'; + } + } + else if ($critere_style['fill'] != 'none'){ + $col = $this->mpdf_ref->ConvertColor($critere_style['fill']); + if ($col) { + // mPDF 5.0.051 + // mPDF 5.3.74 + if ($col{0}==5) { $critere_style['fill-opacity'] = ord($col{4}/100); } // RGBa + if ($col{0}==6) { $critere_style['fill-opacity'] = ord($col{5}/100); } // CMYKa + $path_style .= $this->mpdf_ref->SetFColor($col, true).' '; // mPDF 5.0.051 + $style .= 'F'; + } + } + + // mPDF 5.0.040 + if (substr_count($critere_style['stroke'],'url')>0){ +/* + // Cannot put a gradient on a "stroke" in PDF? + $id_gradient = preg_replace("/url\(#([\w_]*)\)/i","$1",$critere_style['stroke']); + if ($id_gradient != $critere_style['stroke']) { + if (isset($this->svg_gradient[$id_gradient])) { + $fill_gradient = $this->svgGradient($this->svg_gradient[$id_gradient], $attribs, $element); + if ($fill_gradient) { + $path_style = "q "; + $w = "W"; + $style .= 'D'; + } + } + } +*/ + } + // mPDF 4.4.005 Used as indirect setting for currentColor + else if (strtolower($critere_style['stroke']) == 'currentcolor'){ + $col = $this->mpdf_ref->ConvertColor($critere_style['color']); + if ($col) { + // mPDF 5.0.051 + // mPDF 5.3.74 + if ($col{0}==5) { $critere_style['stroke-opacity'] = ord($col{4}/100); } // RGBa + if ($col{0}==6) { $critere_style['stroke-opacity'] = ord($col{5}/100); } // CMYKa + $path_style .= $this->mpdf_ref->SetDColor($col, true).' '; // mPDF 5.0.051 + $style .= 'D'; + $lw = $this->ConvertSVGSizePixels($critere_style['stroke-width']); + $path_style .= sprintf('%.3F w ',$lw*$this->kp); + } + } + else if ($critere_style['stroke'] != 'none'){ + $col = $this->mpdf_ref->ConvertColor($critere_style['stroke']); + if ($col) { + // mPDF 5.0.051 + // mPDF 5.3.74 + if ($col{0}==5) { $critere_style['stroke-opacity'] = ord($col{4}/100); } // RGBa + if ($col{0}==6) { $critere_style['stroke-opacity'] = ord($col{5}/100); } // CMYKa + $path_style .= $this->mpdf_ref->SetDColor($col, true).' '; // mPDF 5.0.051 + $style .= 'D'; + $lw = $this->ConvertSVGSizePixels($critere_style['stroke-width']); // mPDF 4.4.003 + $path_style .= sprintf('%.3F w ',$lw*$this->kp); + } + } + + + if ($critere_style['stroke'] != 'none'){ + if ($critere_style['stroke-linejoin'] == 'miter'){ + $path_style .= ' 0 j '; + } + else if ($critere_style['stroke-linejoin'] == 'round'){ + $path_style .= ' 1 j '; + } + else if ($critere_style['stroke-linejoin'] == 'bevel'){ + $path_style .= ' 2 j '; + } + + if ($critere_style['stroke-linecap'] == 'butt'){ + $path_style .= ' 0 J '; + } + else if ($critere_style['stroke-linecap'] == 'round'){ + $path_style .= ' 1 J '; + } + else if ($critere_style['stroke-linecap'] == 'square'){ + $path_style .= ' 2 J '; + } + + if (isset($critere_style['stroke-miterlimit'])){ + if ($critere_style['stroke-miterlimit'] == 'none'){ + } + else if (preg_match('/^[\d.]+$/',$critere_style['stroke-miterlimit'])) { + $path_style .= sprintf('%.2F M ',$critere_style['stroke-miterlimit']); + } + } + // mPDF 4.4.003 + if (isset($critere_style['stroke-dasharray'])){ + $off = 0; + $d = preg_split('/[ ,]/',$critere_style['stroke-dasharray']); + if (count($d) == 1 && $d[0]==0) { + $path_style .= '[] 0 d '; + } + else { + if (count($d) % 2 == 1) { $d = array_merge($d, $d); } // 5, 3, 1 => 5,3,1,5,3,1 OR 3 => 3,3 + $arr = ''; + for($i=0; $i<count($d); $i+=2) { + $arr .= sprintf('%.3F %.3F ', $d[$i]*$this->kp, $d[$i+1]*$this->kp); + } + if (isset($critere_style['stroke-dashoffset'])){ $off = $critere_style['stroke-dashoffset'] + 0; } + $path_style .= sprintf('[%s] %.3F d ', $arr, $off*$this->kp); + } + } + } + + // mPDF 4.4.003 + if ($critere_style['fill-rule']=='evenodd') { $fr = '*'; } + else { $fr = ''; } + + // mPDF 4.4.003 + if (isset($critere_style['fill-opacity'])) { + $opacity = 1; + if ($critere_style['fill-opacity'] == 0) { $opacity = 0; } + else if ($critere_style['fill-opacity'] > 1) { $opacity = 1; } + else if ($critere_style['fill-opacity'] > 0) { $opacity = $critere_style['fill-opacity']; } + else if ($critere_style['fill-opacity'] < 0) { $opacity = 0; } + $gs = $this->mpdf_ref->AddExtGState(array('ca'=>$opacity, 'BM'=>'/Normal')); + $this->mpdf_ref->extgstates[$gs]['fo'] = true; // mPDF 5.0.039 + $path_style .= sprintf(' /GS%d gs ', $gs); + } + + // mPDF 4.4.003 + if (isset($critere_style['stroke-opacity'])) { + $opacity = 1; + if ($critere_style['stroke-opacity'] == 0) { $opacity = 0; } + else if ($critere_style['stroke-opacity'] > 1) { $opacity = 1; } + else if ($critere_style['stroke-opacity'] > 0) { $opacity = $critere_style['stroke-opacity']; } + else if ($critere_style['stroke-opacity'] < 0) { $opacity = 0; } + $gs = $this->mpdf_ref->AddExtGState(array('CA'=>$opacity, 'BM'=>'/Normal')); + $this->mpdf_ref->extgstates[$gs]['fo'] = true; // mPDF 5.0.039 + $path_style .= sprintf(' /GS%d gs ', $gs); + } + + switch ($style){ + case 'F': + $op = 'f'; + break; + case 'FD': + $op = 'B'; + break; + case 'ND': + $op = 'S'; + break; + case 'D': + $op = 'S'; + break; + default: + $op = 'n'; + } + + // mPDF 5.0 + $prestyle = $path_style.' '; + $poststyle = $w.' '. $op.$fr.' '.$fill_gradient."\n"; + return array($prestyle,$poststyle); + + } + + // + // fonction retracant les <path /> + function svgPath($command, $arguments){ + $path_cmd = ''; + $newsubpath = false; // mPDF 4.4.003 + // mPDF 5.0.039 + $minl = $this->pathBBox[0]; + $mint = $this->pathBBox[1]; + $maxr = $this->pathBBox[2]+$this->pathBBox[0]; + $maxb = $this->pathBBox[3]+$this->pathBBox[1]; + // mPDF 5.0.040 + $start = array($this->xbase, -$this->ybase); + + // mPDF 4.4.003 + preg_match_all('/[\-^]?[\d.]+(e[\-]?[\d]+){0,1}/i', $arguments, $a, PREG_SET_ORDER); + + // if the command is a capital letter, the coords go absolute, otherwise relative + if(strtolower($command) == $command) $relative = true; + else $relative = false; + + + $ile_argumentow = count($a); + + // each command may have different needs for arguments [1 to 8] + + switch(strtolower($command)){ + case 'm': // move + for($i = 0; $i<$ile_argumentow; $i+=2){ + $x = $a[$i][0]; + $y = $a[$i+1][0]; + if($relative){ + $pdfx = ($this->xbase + $x); + $pdfy = ($this->ybase - $y); + $this->xbase += $x; + $this->ybase += -$y; + } + else{ + $pdfx = $x; + $pdfy = -$y ; + $this->xbase = $x; + $this->ybase = -$y; + } + $pdf_pt = $this->svg_overflow($pdfx,$pdfy); + // mPDF 5.0.039 + $minl = min($minl,$pdf_pt['x']); + $maxr = max($maxr,$pdf_pt['x']); + $mint = min($mint,-$pdf_pt['y']); + $maxb = max($maxb,-$pdf_pt['y']); + if($i == 0) $path_cmd .= sprintf('%.3F %.3F m ', $pdf_pt['x']*$this->kp, $pdf_pt['y']*$this->kp); + else $path_cmd .= sprintf('%.3F %.3F l ', $pdf_pt['x']*$this->kp, $pdf_pt['y']*$this->kp); + // mPDF 4.4.003 Save start points of subpath + if ($this->subPathInit) { + $this->spxstart = $this->xbase; + $this->spystart = $this->ybase; + $this->subPathInit = false; + } + } + break; + case 'l': // a simple line + for($i = 0; $i<$ile_argumentow; $i+=2){ + $x = ($a[$i][0]); + $y = ($a[$i+1][0]); + if($relative){ + $pdfx = ($this->xbase + $x); + $pdfy = ($this->ybase - $y); + $this->xbase += $x; + $this->ybase += -$y; + } + else{ + $pdfx = $x ; + $pdfy = -$y ; + $this->xbase = $x; + $this->ybase = -$y; + } + $pdf_pt = $this->svg_overflow($pdfx,$pdfy); + // mPDF 5.0.039 + $minl = min($minl,$pdf_pt['x']); + $maxr = max($maxr,$pdf_pt['x']); + $mint = min($mint,-$pdf_pt['y']); + $maxb = max($maxb,-$pdf_pt['y']); + $path_cmd .= sprintf('%.3F %.3F l ', $pdf_pt['x']*$this->kp, $pdf_pt['y']*$this->kp); + } + break; + case 'h': // a very simple horizontal line + for($i = 0; $i<$ile_argumentow; $i++){ + $x = ($a[$i][0]); + if($relative){ + $y = 0; + $pdfx = ($this->xbase + $x) ; + $pdfy = ($this->ybase - $y) ; + $this->xbase += $x; + $this->ybase += -$y; + } + else{ + $y = -$this->ybase; + $pdfx = $x; + $pdfy = -$y; + $this->xbase = $x; + $this->ybase = -$y; + } + $pdf_pt = $this->svg_overflow($pdfx,$pdfy); + // mPDF 5.0.039 + $minl = min($minl,$pdf_pt['x']); + $maxr = max($maxr,$pdf_pt['x']); + $mint = min($mint,-$pdf_pt['y']); + $maxb = max($maxb,-$pdf_pt['y']); + $path_cmd .= sprintf('%.3F %.3F l ', $pdf_pt['x']*$this->kp, $pdf_pt['y']*$this->kp); + } + break; + case 'v': // the simplest line, vertical + for($i = 0; $i<$ile_argumentow; $i++){ + $y = ($a[$i][0]); + if($relative){ + $x = 0; + $pdfx = ($this->xbase + $x); + $pdfy = ($this->ybase - $y); + $this->xbase += $x; + $this->ybase += -$y; + } + else{ + $x = $this->xbase; + $pdfx = $x; + $pdfy = -$y; + $this->xbase = $x; + $this->ybase = -$y; + } + $pdf_pt = $this->svg_overflow($pdfx,$pdfy); + // mPDF 5.0.039 + $minl = min($minl,$pdf_pt['x']); + $maxr = max($maxr,$pdf_pt['x']); + $mint = min($mint,-$pdf_pt['y']); + $maxb = max($maxb,-$pdf_pt['y']); + $path_cmd .= sprintf('%.3F %.3F l ', $pdf_pt['x']*$this->kp, $pdf_pt['y']*$this->kp); + } + break; + case 's': // bezier with first vertex equal first control + // mPDF 4.4.003 + if (!($this->lastcommand == 'C' || $this->lastcommand == 'c' || $this->lastcommand == 'S' || $this->lastcommand == 's')) { + $this->lastcontrolpoints = array(0,0); + } + for($i = 0; $i<$ile_argumentow; $i += 4){ + $x1 = $this->lastcontrolpoints[0]; + $y1 = $this->lastcontrolpoints[1]; + $x2 = ($a[$i][0]); + $y2 = ($a[$i+1][0]); + $x = ($a[$i+2][0]); + $y = ($a[$i+3][0]); + if($relative){ + $pdfx1 = ($this->xbase + $x1); + $pdfy1 = ($this->ybase - $y1); + $pdfx2 = ($this->xbase + $x2); + $pdfy2 = ($this->ybase - $y2); + $pdfx = ($this->xbase + $x); + $pdfy = ($this->ybase - $y); + $this->xbase += $x; + $this->ybase += -$y; + } + else{ + $pdfx1 = $this->xbase + $x1; + $pdfy1 = $this->ybase -$y1; + $pdfx2 = $x2; + $pdfy2 = -$y2; + $pdfx = $x; + $pdfy = -$y; + $this->xbase = $x; + $this->ybase = -$y; + } + $this->lastcontrolpoints = array(($pdfx-$pdfx2),-($pdfy-$pdfy2)); // mPDF 4.4.003 always relative + + $pdf_pt = $this->svg_overflow($pdfx,$pdfy); + + // mPDF 5.0.040 + $curves = array($pdfx1,-$pdfy1,$pdfx2,-$pdfy2,$pdfx,-$pdfy); + $bx = calc_bezier_bbox($start, $curves); + $minl = min($minl,$bx[0]); + $maxr = max($maxr,$bx[2]); + $mint = min($mint,$bx[1]); + $maxb = max($maxb,$bx[3]); + + if( ($pdf_pt['x'] != $pdfx) || ($pdf_pt['y'] != $pdfy) ) + { + $path_cmd .= sprintf('%.3F %.3F l ', $pdf_pt['x']*$this->kp, $pdf_pt['y']*$this->kp); + } + else + { + $path_cmd .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', $pdfx1*$this->kp, $pdfy1*$this->kp, $pdfx2*$this->kp, $pdfy2*$this->kp, $pdfx*$this->kp, $pdfy*$this->kp); + } + + } + break; + case 'c': // bezier with second vertex equal second control + for($i = 0; $i<$ile_argumentow; $i += 6){ + $x1 = ($a[$i][0]); + $y1 = ($a[$i+1][0]); + $x2 = ($a[$i+2][0]); + $y2 = ($a[$i+3][0]); + $x = ($a[$i+4][0]); + $y = ($a[$i+5][0]); + + + if($relative){ + $pdfx1 = ($this->xbase + $x1); + $pdfy1 = ($this->ybase - $y1); + $pdfx2 = ($this->xbase + $x2); + $pdfy2 = ($this->ybase - $y2); + $pdfx = ($this->xbase + $x); + $pdfy = ($this->ybase - $y); + $this->xbase += $x; + $this->ybase += -$y; + } + else{ + $pdfx1 = $x1; + $pdfy1 = -$y1; + $pdfx2 = $x2; + $pdfy2 = -$y2; + $pdfx = $x; + $pdfy = -$y; + $this->xbase = $x; + $this->ybase = -$y; + } + $this->lastcontrolpoints = array(($pdfx-$pdfx2),-($pdfy-$pdfy2)); // mPDF 4.4.003 always relative + // $pdf_pt2 = $this->svg_overflow($pdfx2,$pdfy2); + // $pdf_pt1 = $this->svg_overflow($pdfx1,$pdfy1); + $pdf_pt = $this->svg_overflow($pdfx,$pdfy); + + // mPDF 5.0.040 + $curves = array($pdfx1,-$pdfy1,$pdfx2,-$pdfy2,$pdfx,-$pdfy); + $bx = calc_bezier_bbox($start, $curves); + $minl = min($minl,$bx[0]); + $maxr = max($maxr,$bx[2]); + $mint = min($mint,$bx[1]); + $maxb = max($maxb,$bx[3]); + + if( ($pdf_pt['x'] != $pdfx) || ($pdf_pt['y'] != $pdfy) ) + { + $path_cmd .= sprintf('%.3F %.3F l ', $pdf_pt['x']*$this->kp, $pdf_pt['y']*$this->kp); + } + else + { + $path_cmd .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', $pdfx1*$this->kp, $pdfy1*$this->kp, $pdfx2*$this->kp, $pdfy2*$this->kp, $pdfx*$this->kp, $pdfy*$this->kp); + } + + } + break; + + case 'q': // bezier quadratic avec point de control + for($i = 0; $i<$ile_argumentow; $i += 4){ + $x1 = ($a[$i][0]); + $y1 = ($a[$i+1][0]); + $x = ($a[$i+2][0]); + $y = ($a[$i+3][0]); + if($relative){ + $pdfx = ($this->xbase + $x); + $pdfy = ($this->ybase - $y); + + $pdfx1 = ($this->xbase + ($x1*2/3)); + $pdfy1 = ($this->ybase - ($y1*2/3)); + // mPDF 4.4.003 + $pdfx2 = $pdfx1 + 1/3 *($x); + $pdfy2 = $pdfy1 + 1/3 *(-$y) ; + + $this->xbase += $x; + $this->ybase += -$y; + } + else{ + $pdfx = $x; + $pdfy = -$y; + + $pdfx1 = ($this->xbase+(($x1-$this->xbase)*2/3)); + $pdfy1 = ($this->ybase-(($y1+$this->ybase)*2/3)); + + $pdfx2 = ($x+(($x1-$x)*2/3)); + $pdfy2 = (-$y-(($y1-$y)*2/3)); + + // mPDF 4.4.003 + $pdfx2 = $pdfx1 + 1/3 *($x - $this->xbase); + $pdfy2 = $pdfy1 + 1/3 *(-$y - $this->ybase) ; + + $this->xbase = $x; + $this->ybase = -$y; + } + $this->lastcontrolpoints = array(($pdfx-$pdfx2),-($pdfy-$pdfy2)); // mPDF 4.4.003 always relative + + $pdf_pt = $this->svg_overflow($pdfx,$pdfy); + + // mPDF 5.0.040 + $curves = array($pdfx1,-$pdfy1,$pdfx2,-$pdfy2,$pdfx,-$pdfy); + $bx = calc_bezier_bbox($start, $curves); + $minl = min($minl,$bx[0]); + $maxr = max($maxr,$bx[2]); + $mint = min($mint,$bx[1]); + $maxb = max($maxb,$bx[3]); + + if( ($pdf_pt['x'] != $pdfx) || ($pdf_pt['y'] != $pdfy) ) + { + $path_cmd .= sprintf('%.3F %.3F l ', $pdf_pt['x']*$this->kp, $pdf_pt['y']*$this->kp); + } + else + { + $path_cmd .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', $pdfx1*$this->kp, $pdfy1*$this->kp, $pdfx2*$this->kp, $pdfy2*$this->kp, $pdfx*$this->kp, $pdfy*$this->kp); + } + } + break; + case 't': // bezier quadratic avec point de control simetrique a lancien point de control + // mPDF 4.4.003 + if (!($this->lastcommand == 'Q' || $this->lastcommand == 'q' || $this->lastcommand == 'T' || $this->lastcommand == 't')) { + $this->lastcontrolpoints = array(0,0); + } + for($i = 0; $i<$ile_argumentow; $i += 2){ + $x = ($a[$i][0]); + $y = ($a[$i+1][0]); + + $x1 = $this->lastcontrolpoints[0]; + $y1 = $this->lastcontrolpoints[1]; + + if($relative){ + $pdfx = ($this->xbase + $x); + $pdfy = ($this->ybase - $y); + + $pdfx1 = ($this->xbase + ($x1)); // mPDF 4.4.003 + $pdfy1 = ($this->ybase - ($y1)); // mPDF 4.4.003 + // mPDF 4.4.003 + $pdfx2 = $pdfx1 + 1/3 *($x); + $pdfy2 = $pdfy1 + 1/3 *(-$y) ; + + $this->xbase += $x; + $this->ybase += -$y; + } + else{ + $pdfx = $x; + $pdfy = -$y; + + $pdfx1 = ($this->xbase + ($x1)); // mPDF 4.4.003 + $pdfy1 = ($this->ybase - ($y1)); // mPDF 4.4.003 + // mPDF 4.4.003 + $pdfx2 = $pdfx1 + 1/3 *($x - $this->xbase); + $pdfy2 = $pdfy1 + 1/3 *(-$y - $this->ybase) ; + + $this->xbase = $x; + $this->ybase = -$y; + } + + $this->lastcontrolpoints = array(($pdfx-$pdfx2),-($pdfy-$pdfy2)); // mPDF 4.4.003 always relative + + // mPDF 5.0.040 + $curves = array($pdfx1,-$pdfy1,$pdfx2,-$pdfy2,$pdfx,-$pdfy); + $bx = calc_bezier_bbox($start, $curves); + $minl = min($minl,$bx[0]); + $maxr = max($maxr,$bx[2]); + $mint = min($mint,$bx[1]); + $maxb = max($maxb,$bx[3]); + + $path_cmd .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', $pdfx1*$this->kp, $pdfy1*$this->kp, $pdfx2*$this->kp, $pdfy2*$this->kp, $pdfx*$this->kp, $pdfy*$this->kp); + } + + break; + case 'a': // Elliptical arc + for($i = 0; $i<$ile_argumentow; $i += 7){ + $rx = ($a[$i][0]); + $ry = ($a[$i+1][0]); + $angle = ($a[$i+2][0]); //x-axis-rotation + $largeArcFlag = ($a[$i+3][0]); + $sweepFlag = ($a[$i+4][0]); + $x2 = ($a[$i+5][0]); + $y2 = ($a[$i+6][0]); + $x1 = $this->xbase; + $y1 = -$this->ybase; + if($relative){ + $x2 = $this->xbase + $x2; + $y2 = -$this->ybase + $y2; + $this->xbase += ($a[$i+5][0]); + $this->ybase += -($a[$i+6][0]); + } + else{ + $this->xbase = $x2; + $this->ybase = -$y2; + } + // mPDF 5.0.039 // mPDF 5.0.040 + list($pcmd, $bounds) = $this->Arcto($x1, $y1, $x2, $y2, $rx, $ry, $angle, $largeArcFlag, $sweepFlag); + $minl = min($minl,$x2,min($bounds[0])); + $maxr = max($maxr,$x2,max($bounds[0])); + $mint = min($mint,$y2,min($bounds[1])); + $maxb = max($maxb,$y2,max($bounds[1])); + $path_cmd .= $pcmd; + + } + break; + case'z': + $path_cmd .= 'h '; + // mPDF 4.4.003 + $this->subPathInit = true; + $newsubpath = true; + $this->xbase = $this->spxstart; + $this->ybase = $this->spystart; + break; + default: + break; + } + + if (!$newsubpath) { $this->subPathInit = false; } // mPDF 4.4.003 + $this->lastcommand = $command; + // mPDF 5.0.039 + $this->pathBBox[0] = $minl; + $this->pathBBox[1] = $mint; + $this->pathBBox[2] = $maxr - $this->pathBBox[0]; + $this->pathBBox[3] = $maxb - $this->pathBBox[1]; + return $path_cmd; + + } + +function Arcto($x1, $y1, $x2, $y2, $rx, $ry, $angle, $largeArcFlag, $sweepFlag) { + + // mPDF 5.0.040 + $bounds = array(0=>array($x1,$x2),1=>array($y1,$y2)); + // 1. Treat out-of-range parameters as described in + // http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes + // If the endpoints (x1, y1) and (x2, y2) are identical, then this + // is equivalent to omitting the elliptical arc segment entirely + if ($x1 == $x2 && $y1 == $y2) return array('', $bounds); // mPD 5.0.040 + + // If rX = 0 or rY = 0 then this arc is treated as a straight line + // segment (a "lineto") joining the endpoints. + if ($rx == 0.0 || $ry == 0.0) { + // return array(Lineto(x2, y2), $bounds); // mPD 5.0.040 + } + + // If rX or rY have negative signs, these are dropped; the absolute + // value is used instead. + if ($rx<0.0) $rx = -$rx; + if ($ry<0.0) $ry = -$ry; + + // 2. convert to center parameterization as shown in + // http://www.w3.org/TR/SVG/implnote.html + $sinPhi = sin(deg2rad($angle)); + $cosPhi = cos(deg2rad($angle)); + + $x1dash = $cosPhi * ($x1-$x2)/2.0 + $sinPhi * ($y1-$y2)/2.0; + $y1dash = -$sinPhi * ($x1-$x2)/2.0 + $cosPhi * ($y1-$y2)/2.0; + + + $numerator = $rx*$rx*$ry*$ry - $rx*$rx*$y1dash*$y1dash - $ry*$ry*$x1dash*$x1dash; + + if ($numerator < 0.0) { + // If rX , rY and are such that there is no solution (basically, + // the ellipse is not big enough to reach from (x1, y1) to (x2, + // y2)) then the ellipse is scaled up uniformly until there is + // exactly one solution (until the ellipse is just big enough). + + // -> find factor s, such that numerator' with rx'=s*rx and + // ry'=s*ry becomes 0 : + $s = sqrt(1.0 - $numerator/($rx*$rx*$ry*$ry)); + + $rx *= $s; + $ry *= $s; + $root = 0.0; + + } + else { + $root = ($largeArcFlag == $sweepFlag ? -1.0 : 1.0) * sqrt( $numerator/($rx*$rx*$y1dash*$y1dash+$ry*$ry*$x1dash*$x1dash) ); + } + + $cxdash = $root*$rx*$y1dash/$ry; + $cydash = -$root*$ry*$x1dash/$rx; + + $cx = $cosPhi * $cxdash - $sinPhi * $cydash + ($x1+$x2)/2.0; + $cy = $sinPhi * $cxdash + $cosPhi * $cydash + ($y1+$y2)/2.0; + + + $theta1 = $this->CalcVectorAngle(1.0, 0.0, ($x1dash-$cxdash)/$rx, ($y1dash-$cydash)/$ry); + $dtheta = $this->CalcVectorAngle(($x1dash-$cxdash)/$rx, ($y1dash-$cydash)/$ry, (-$x1dash-$cxdash)/$rx, (-$y1dash-$cydash)/$ry); + if (!$sweepFlag && $dtheta>0) + $dtheta -= 2.0*M_PI; + else if ($sweepFlag && $dtheta<0) + $dtheta += 2.0*M_PI; + + // 3. convert into cubic bezier segments <= 90deg + $segments = ceil(abs($dtheta/(M_PI/2.0))); + $delta = $dtheta/$segments; + $t = 8.0/3.0 * sin($delta/4.0) * sin($delta/4.0) / sin($delta/2.0); + $coords = array(); + for ($i = 0; $i < $segments; $i++) { + $cosTheta1 = cos($theta1); + $sinTheta1 = sin($theta1); + $theta2 = $theta1 + $delta; + $cosTheta2 = cos($theta2); + $sinTheta2 = sin($theta2); + + // a) calculate endpoint of the segment: + $xe = $cosPhi * $rx*$cosTheta2 - $sinPhi * $ry*$sinTheta2 + $cx; + $ye = $sinPhi * $rx*$cosTheta2 + $cosPhi * $ry*$sinTheta2 + $cy; + + // b) calculate gradients at start/end points of segment: + $dx1 = $t * ( - $cosPhi * $rx*$sinTheta1 - $sinPhi * $ry*$cosTheta1); + $dy1 = $t * ( - $sinPhi * $rx*$sinTheta1 + $cosPhi * $ry*$cosTheta1); + + $dxe = $t * ( $cosPhi * $rx*$sinTheta2 + $sinPhi * $ry*$cosTheta2); + $dye = $t * ( $sinPhi * $rx*$sinTheta2 - $cosPhi * $ry*$cosTheta2); + + // c) draw the cubic bezier: + $coords[$i] = array(($x1+$dx1), ($y1+$dy1), ($xe+$dxe), ($ye+$dye), $xe, $ye); + + // do next segment + $theta1 = $theta2; + $x1 = $xe; + $y1 = $ye; + } + $path = ' '; + foreach($coords AS $c) { + $cpx1 = $c[0]; + $cpy1 = $c[1]; + $cpx2 = $c[2]; + $cpy2 = $c[3]; + $x2 = $c[4]; + $y2 = $c[5]; + $path .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', $cpx1*$this->kp, -$cpy1*$this->kp, $cpx2*$this->kp, -$cpy2*$this->kp, $x2*$this->kp, -$y2*$this->kp) ."\n"; + + // mPDF 5.0.040 + $bounds[0][] = $c[4]; + $bounds[1][] = $c[5]; + } + return array($path, $bounds); // mPD 5.0.040 +} + + + function CalcVectorAngle($ux, $uy, $vx, $vy) { + $ta = atan2($uy, $ux); + $tb = atan2($vy, $vx); + if ($tb >= $ta) + return ($tb-$ta); + return (6.28318530718 - ($ta-$tb)); + } + + + // mPDF 4.4.003 + function ConvertSVGSizePixels($size=5,$maxsize='x'){ + // maxsize in pixels (user units) or 'y' or 'x' + // e.g. $w = $this->ConvertSVGSizePixels($arguments['w'],$this->svg_info['w']*(25.4/$this->mpdf_ref->dpi)); + // usefontsize - setfalse for e.g. margins - will ignore fontsize for % values + // Depends of maxsize value to make % work properly. Usually maxsize == pagewidth + // For text $maxsize = Fontsize + // Setting e.g. margin % will use maxsize (pagewidth) and em will use fontsize + + if ($maxsize == 'y') { $maxsize = $this->svg_info['h']; } + else if ($maxsize == 'x') { $maxsize = $this->svg_info['w']; } + $maxsize *= (25.4/$this->mpdf_ref->dpi); // convert pixels to mm + $fontsize=$this->mpdf_ref->FontSize; + //Return as pixels + $size = $this->mpdf_ref->ConvertSize($size,$maxsize,$fontsize,false) * 1/(25.4/$this->mpdf_ref->dpi); + return $size; + } + + // mPDF 4.4.003 + function ConvertSVGSizePts($size=5){ + // usefontsize - setfalse for e.g. margins - will ignore fontsize for % values + // Depends of maxsize value to make % work properly. Usually maxsize == pagewidth + // For text $maxsize = Fontsize + // Setting e.g. margin % will use maxsize (pagewidth) and em will use fontsize + $maxsize=$this->mpdf_ref->FontSize; + //Return as pts + $size = $this->mpdf_ref->ConvertSize($size,$maxsize,false,true) * 72/25.4; + return $size; + } + + + // + // fonction retracant les <rect /> + function svgRect($arguments){ + + if ($arguments['h']==0 || $arguments['w']==0) { return ''; } // mPDF 4.4.003 + + $x = $this->ConvertSVGSizePixels($arguments['x'],'x'); // mPDF 4.4.003 + $y = $this->ConvertSVGSizePixels($arguments['y'],'y'); // mPDF 4.4.003 + $h = $this->ConvertSVGSizePixels($arguments['h'],'y'); // mPDF 4.4.003 + $w = $this->ConvertSVGSizePixels($arguments['w'],'x'); // mPDF 4.4.003 + $rx = $this->ConvertSVGSizePixels($arguments['rx'],'x'); // mPDF 4.4.003 + $ry = $this->ConvertSVGSizePixels($arguments['ry'],'y'); // mPDF 4.4.003 + + if ($rx > $w/2) { $rx = $w/2; } // mPDF 4.4.003 + if ($ry > $h/2) { $ry = $h/2; } // mPDF 4.4.003 + + if ($rx>0 and $ry == 0){$ry = $rx;} + if ($ry>0 and $rx == 0){$rx = $ry;} + + if ($rx == 0 and $ry == 0){ + // trace un rectangle sans angle arrondit + $path_cmd = sprintf('%.3F %.3F m ', ($x*$this->kp), -($y*$this->kp)); + $path_cmd .= sprintf('%.3F %.3F l ', (($x+$w)*$this->kp), -($y*$this->kp)); + $path_cmd .= sprintf('%.3F %.3F l ', (($x+$w)*$this->kp), -(($y+$h)*$this->kp)); + $path_cmd .= sprintf('%.3F %.3F l ', ($x)*$this->kp, -(($y+$h)*$this->kp)); + $path_cmd .= sprintf('%.3F %.3F l h ', ($x*$this->kp), -($y*$this->kp)); + + + } + else { + // trace un rectangle avec les arrondit + // les points de controle du bezier sont deduis grace a la constante kappa + $kappa = 4*(sqrt(2)-1)/3; + + $kx = $kappa*$rx; + $ky = $kappa*$ry; + + $path_cmd = sprintf('%.3F %.3F m ', ($x+$rx)*$this->kp, -$y*$this->kp); + $path_cmd .= sprintf('%.3F %.3F l ', ($x+($w-$rx))*$this->kp, -$y*$this->kp); + $path_cmd .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', ($x+($w-$rx+$kx))*$this->kp, -$y*$this->kp, ($x+$w)*$this->kp, (-$y+(-$ry+$ky))*$this->kp, ($x+$w)*$this->kp, (-$y+(-$ry))*$this->kp ); + $path_cmd .= sprintf('%.3F %.3F l ', ($x+$w)*$this->kp, (-$y+(-$h+$ry))*$this->kp); + $path_cmd .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', ($x+$w)*$this->kp, (-$y+(-$h-$ky+$ry))*$this->kp, ($x+($w-$rx+$kx))*$this->kp, (-$y+(-$h))*$this->kp, ($x+($w-$rx))*$this->kp, (-$y+(-$h))*$this->kp ); + + $path_cmd .= sprintf('%.3F %.3F l ', ($x+$rx)*$this->kp, (-$y+(-$h))*$this->kp); + $path_cmd .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', ($x+($rx-$kx))*$this->kp, (-$y+(-$h))*$this->kp, $x*$this->kp, (-$y+(-$h-$ky+$ry))*$this->kp, $x*$this->kp, (-$y+(-$h+$ry))*$this->kp ); + $path_cmd .= sprintf('%.3F %.3F l ', $x*$this->kp, (-$y+(-$ry))*$this->kp); + $path_cmd .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c h ', $x*$this->kp, (-$y+(-$ry+$ky))*$this->kp, ($x+($rx-$kx))*$this->kp, -$y*$this->kp, ($x+$rx)*$this->kp, -$y*$this->kp ); + + + } + return $path_cmd; + } + + // + // fonction retracant les <ellipse /> et <circle /> + // le cercle est trac grave a 4 bezier cubic, les poitn de controles + // sont deduis grace a la constante kappa * rayon + function svgEllipse($arguments){ + if ($arguments['rx']==0 || $arguments['ry']==0) { return ''; } // mPDF 4.4.003 + + $kappa = 4*(sqrt(2)-1)/3; + + $cx = $this->ConvertSVGSizePixels($arguments['cx'],'x'); // mPDF 4.4.003 + $cy = $this->ConvertSVGSizePixels($arguments['cy'],'y'); // mPDF 4.4.003 + $rx = $this->ConvertSVGSizePixels($arguments['rx'],'x'); // mPDF 4.4.003 + $ry = $this->ConvertSVGSizePixels($arguments['ry'],'y'); // mPDF 4.4.003 + + $x1 = $cx; + $y1 = -$cy+$ry; + + $x2 = $cx+$rx; + $y2 = -$cy; + + $x3 = $cx; + $y3 = -$cy-$ry; + + $x4 = $cx-$rx; + $y4 = -$cy; + + $path_cmd = sprintf('%.3F %.3F m ', $x1*$this->kp, $y1*$this->kp); + $path_cmd .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', ($x1+($rx*$kappa))*$this->kp, $y1*$this->kp, $x2*$this->kp, ($y2+($ry*$kappa))*$this->kp, $x2*$this->kp, $y2*$this->kp); + $path_cmd .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', $x2*$this->kp, ($y2-($ry*$kappa))*$this->kp, ($x3+($rx*$kappa))*$this->kp, $y3*$this->kp, $x3*$this->kp, $y3*$this->kp); + $path_cmd .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', ($x3-($rx*$kappa))*$this->kp, $y3*$this->kp, $x4*$this->kp, ($y4-($ry*$kappa))*$this->kp, $x4*$this->kp, $y4*$this->kp); + $path_cmd .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', $x4*$this->kp, ($y4+($ry*$kappa))*$this->kp, ($x1-($rx*$kappa))*$this->kp, $y1*$this->kp, $x1*$this->kp, $y1*$this->kp); + $path_cmd .= 'h '; + + return $path_cmd; + + } + + // + // fonction retracant les <polyline /> et les <line /> + function svgPolyline($arguments,$ispolyline=true){ + if ($ispolyline) { + $xbase = $arguments[0] ; + $ybase = - $arguments[1] ; + } + else { + if ($arguments[0]==$arguments[2] && $arguments[1]==$arguments[3]) { return ''; } // mPDF 4.4.003 Zero length line + $xbase = $this->ConvertSVGSizePixels($arguments[0],'x'); // mPDF 4.4.003 + $ybase = - $this->ConvertSVGSizePixels($arguments[1],'y'); // mPDF 4.4.003 + } + $path_cmd = sprintf('%.3F %.3F m ', $xbase*$this->kp, $ybase*$this->kp); + for ($i = 2; $i<count($arguments);$i += 2) { + if ($ispolyline) { + $tmp_x = $arguments[$i] ; + $tmp_y = - $arguments[($i+1)] ; + } + else { + $tmp_x = $this->ConvertSVGSizePixels($arguments[$i],'x') ; // mPDF 4.4.003 + $tmp_y = - $this->ConvertSVGSizePixels($arguments[($i+1)],'y') ; // mPDF 4.4.003 + } + $path_cmd .= sprintf('%.3F %.3F l ', $tmp_x*$this->kp, $tmp_y*$this->kp); + } + + // $path_cmd .= 'h '; // ?? In error - don't close subpath here + return $path_cmd; + + } + + // + // fonction retracant les <polygone /> + function svgPolygon($arguments){ + $xbase = $arguments[0] ; + $ybase = - $arguments[1] ; + $path_cmd = sprintf('%.3F %.3F m ', $xbase*$this->kp, $ybase*$this->kp); + for ($i = 2; $i<count($arguments);$i += 2) { + $tmp_x = $arguments[$i] ; + $tmp_y = - $arguments[($i+1)] ; + + $path_cmd .= sprintf('%.3F %.3F l ', $tmp_x*$this->kp, $tmp_y*$this->kp); + + } + $path_cmd .= sprintf('%.3F %.3F l ', $xbase*$this->kp, $ybase*$this->kp); + $path_cmd .= 'h '; + return $path_cmd; + + } + + // + // write string to image + function svgText() { + // $tmp = count($this->txt_style)-1; + $current_style = array_pop($this->txt_style); + $style = ''; + $render = -1; + if(isset($this->txt_data[2])) + { + // select font + $style .= ($current_style['font-weight'] == 'bold')?'B':''; + $style .= ($current_style['font-style'] == 'italic')?'I':''; + $size = $current_style['font-size']*$this->kf; // mPDF 5.0.039 + + // mPDF 5.0 + $current_style['font-family'] = $this->mpdf_ref->SetFont($current_style['font-family'],$style,$size,false); + $this->mpdf_ref->CurrentFont['fo'] = true; // mPDF 5.0.039 + + + // mPDF 5.0.041 + $opacitystr = ''; + $opacity = 1; + if (isset($current_style['fill-opacity'])) { + if ($current_style['fill-opacity'] == 0) { $opacity = 0; } + else if ($current_style['fill-opacity'] > 1) { $opacity = 1; } + else if ($current_style['fill-opacity'] > 0) { $opacity = $current_style['fill-opacity']; } + else if ($current_style['fill-opacity'] < 0) { $opacity = 0; } + } + $gs = $this->mpdf_ref->AddExtGState(array('ca'=>$opacity, 'BM'=>'/Normal')); + $this->mpdf_ref->extgstates[$gs]['fo'] = true; // mPDF 5.0.039 + $opacitystr = sprintf(' /GS%d gs ', $gs); + + // mPDF 5.0.051 + $fillstr = ''; + if (isset($current_style['fill']) && $current_style['fill']!='none') { + $col = $this->mpdf_ref->ConvertColor($current_style['fill']); + // mPDF 5.0.051 + $fillstr = $this->mpdf_ref->SetFColor($col, true); + $render = "0"; // Fill (only) + } + $strokestr = ''; + if (isset($current_style['stroke-width']) && $current_style['stroke-width']>0 && $current_style['stroke']!='none') { + $scol = $this->mpdf_ref->ConvertColor($current_style['stroke']); + if ($scol) { + $strokestr .= $this->mpdf_ref->SetDColor($scol, true).' '; // mPDF 5.0.051 + } + $linewidth = $this->ConvertSVGSizePixels($current_style['stroke-width']); + if ($linewidth > 0) { + $strokestr .= sprintf('%.3F w 1 J 1 j ',$linewidth*$this->kp); + if ($render == -1) { $render = "1"; } // stroke only + else { $render = "2"; } // fill and stroke + } + } + if ($render == -1) { return ''; } + + $x = $this->ConvertSVGSizePixels($this->txt_data[0],'x'); // mPDF 4.4.003 + $y = $this->ConvertSVGSizePixels($this->txt_data[1],'y'); // mPDF 4.4.003 + $txt = $this->txt_data[2]; + + // mPDF 4.4.003 + $txt = preg_replace('/\f/','',$txt); + $txt = preg_replace('/\r/','',$txt); + $txt = preg_replace('/\n/',' ',$txt); + $txt = preg_replace('/\t/',' ',$txt); + $txt = preg_replace("/[ ]+/u",' ',$txt); + + $txt = trim($txt); + + $txt = $this->mpdf_ref->purify_utf8_text($txt); + if ($this->mpdf_ref->text_input_as_HTML) { + $txt = $this->mpdf_ref->all_entities_to_utf8($txt); + } + + // mPDF 5.0 + if ($this->mpdf_ref->usingCoreFont) { $txt = mb_convert_encoding($txt,$this->mpdf_ref->mb_enc,'UTF-8'); } + if (preg_match("/([".$this->mpdf_ref->pregRTLchars."])/u", $txt)) { $this->mpdf_ref->biDirectional = true; } // mPDF 4.4.003 + + $this->mpdf_ref->magic_reverse_dir($txt, true, 'ltr'); // mPDF 5.0.054 + $this->mpdf_ref->ConvertIndic($txt); + + + if ($current_style['text-anchor']=='middle') { + $tw = $this->mpdf_ref->GetStringWidth($txt)*_MPDFK/2; // mPDF 4.4.003 // mPDF 5.4.09 + } + else if ($current_style['text-anchor']=='end') { + $tw = $this->mpdf_ref->GetStringWidth($txt)*_MPDFK; // mPDF 4.4.003 // mPDF 5.4.09 + } + else $tw = 0; + + if (!$this->mpdf_ref->usingCoreFont) { + $this->mpdf_ref->UTF8StringToArray($txt); // mPDF 5.0 adds chars to subset list + $txt= $this->mpdf_ref->UTF8ToUTF16BE($txt, false); + } + $txt='('.$this->mpdf_ref->_escape($txt).')'; + $this->mpdf_ref->CurrentFont['used']= true; + + $pdfx = $x - $tw/$this->kp; // mPDF 4.4.009 + $pdfy = -$y ; + $xbase = $x; + $ybase = -$y; + + // mPDF 5.0.041 + // mPDF 5.0.051 + $path_cmd = sprintf('q BT /F%d %s %.3F Tf %.3F %.3F Td %s Tr %s %s %s Tj ET Q ',$this->mpdf_ref->CurrentFont['i'],$opacitystr, $this->mpdf_ref->FontSizePt,$pdfx*$this->kp,$pdfy*$this->kp,$render,$fillstr,$strokestr,$txt)."\n"; + unset($this->txt_data[0], $this->txt_data[1],$this->txt_data[2]); + + // mPDF 5.4.12 + if (isset($current_style['font-size-parent'])) { + $this->mpdf_ref->SetFontSize($current_style['font-size-parent']); + } + } + else + { + return ' '; + } +// $path_cmd .= 'h '; // mPDF 5.0 + return $path_cmd; + } + + +function svgDefineTxtStyle($critere_style) +{ + // get copy of current/default txt style, and modify it with supplied attributes + $tmp = count($this->txt_style)-1; + $current_style = $this->txt_style[$tmp]; + if (isset($critere_style['style'])){ + if (preg_match('/fill:\s*rgb\((\d+),\s*(\d+),\s*(\d+)\)/',$critere_style['style'], $m)) { + $current_style['fill'] = '#'.str_pad(dechex($m[1]), 2, "0", STR_PAD_LEFT).str_pad(dechex($m[2]), 2, "0", STR_PAD_LEFT).str_pad(dechex($m[3]), 2, "0", STR_PAD_LEFT); + } + else { $tmp = preg_replace("/(.*)fill:\s*([a-z0-9#_()]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $current_style['fill'] = $tmp; } + } + + $tmp = preg_replace("/(.*)fill-opacity:\s*([a-z0-9.]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $current_style['fill-opacity'] = $tmp;} + + $tmp = preg_replace("/(.*)fill-rule:\s*([a-z0-9#]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $current_style['fill-rule'] = $tmp;} + + if (preg_match('/stroke:\s*rgb\((\d+),\s*(\d+),\s*(\d+)\)/',$critere_style['style'], $m)) { + $current_style['stroke'] = '#'.str_pad(dechex($m[1]), 2, "0", STR_PAD_LEFT).str_pad(dechex($m[2]), 2, "0", STR_PAD_LEFT).str_pad(dechex($m[3]), 2, "0", STR_PAD_LEFT); + } + else { $tmp = preg_replace("/(.*)stroke:\s*([a-z0-9#]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $current_style['stroke'] = $tmp; } + } + + $tmp = preg_replace("/(.*)stroke-linecap:\s*([a-z0-9#]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $current_style['stroke-linecap'] = $tmp;} + + $tmp = preg_replace("/(.*)stroke-linejoin:\s*([a-z0-9#]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $current_style['stroke-linejoin'] = $tmp;} + + $tmp = preg_replace("/(.*)stroke-miterlimit:\s*([a-z0-9#]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $current_style['stroke-miterlimit'] = $tmp;} + + $tmp = preg_replace("/(.*)stroke-opacity:\s*([a-z0-9.]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $current_style['stroke-opacity'] = $tmp; } + + $tmp = preg_replace("/(.*)stroke-width:\s*([a-z0-9.]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $current_style['stroke-width'] = $tmp;} + + $tmp = preg_replace("/(.*)stroke-dasharray:\s*([a-z0-9., ]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $current_style['stroke-dasharray'] = $tmp;} + + $tmp = preg_replace("/(.*)stroke-dashoffset:\s*([a-z0-9.]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $current_style['stroke-dashoffset'] = $tmp;} + + // mPDF 5.0.039 + $tmp = preg_replace("/(.*)font-family:\s*([a-z0-9.]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $critere_style['font-family'] = $tmp;} + + $tmp = preg_replace("/(.*)font-size:\s*([a-z0-9.]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $critere_style['font-size'] = $tmp;} + + $tmp = preg_replace("/(.*)font-weight:\s*([a-z0-9.]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $critere_style['font-weight'] = $tmp;} + + $tmp = preg_replace("/(.*)font-style:\s*([a-z0-9.]*|none)(.*)/i","$2",$critere_style['style']); + if ($tmp != $critere_style['style']){ $critere_style['font-style'] = $tmp;} + + } + + if (isset($critere_style['font'])){ + + // [ [ <'font-style'> || <'font-variant'> || <'font-weight'> ]?<'font-size'> [ / <'line-height'> ]? <'font-family'> ] + + $tmp = preg_replace("/(.*)(italic|oblique)(.*)/i","$2",$critere_style['font']); + if ($tmp != $critere_style['font']){ + if($tmp == 'oblique'){ + $tmp = 'italic'; + } + $current_style['font-style'] = $tmp; + } + $tmp = preg_replace("/(.*)(bold|bolder)(.*)/i","$2",$critere_style['font']); + if ($tmp != $critere_style['font']){ + if($tmp == 'bolder'){ + $tmp = 'bold'; + } + $current_style['font-weight'] = $tmp; + } + + // select digits not followed by percent sign nor preceeded by forward slash + $tmp = preg_replace("/(.*)\b(\d+)[\b|\/](.*)/i","$2",$critere_style['font']); + if ($tmp != $critere_style['font']){ + $current_style['font-size'] = $this->ConvertSVGSizePts($tmp); + $this->mpdf_ref->SetFont('','',$current_style['font-size'],false); + } + + } + + if(isset($critere_style['fill'])){ + $current_style['fill'] = $critere_style['fill']; + } + if(isset($critere_style['stroke'])){ + $current_style['stroke'] = $critere_style['stroke']; + } + if(isset($critere_style['stroke-width'])){ + $current_style['stroke-width'] = $critere_style['stroke-width']; + } + + if(isset($critere_style['font-style'])){ + if(strtolower($critere_style['font-style']) == 'oblique') + { + $critere_style['font-style'] = 'italic'; + } + $current_style['font-style'] = $critere_style['font-style']; + } + + if(isset($critere_style['font-weight'])){ + if(strtolower($critere_style['font-weight']) == 'bolder') + { + $critere_style['font-weight'] = 'bold'; + } + $current_style['font-weight'] = $critere_style['font-weight']; + } + + if(isset($critere_style['font-size'])){ + // mPDF 5.4.12 + if (strpos($critere_style['font-size'], '%')!==false) { + $current_style['font-size-parent'] = $current_style['font-size']; + } + $current_style['font-size'] = $this->ConvertSVGSizePts($critere_style['font-size']); + $this->mpdf_ref->SetFont('','',$current_style['font-size'],false); + } + + if(isset($critere_style['font-family'])){ + $v = $critere_style['font-family']; + $aux_fontlist = explode(",",$v); + $found = 0; + foreach($aux_fontlist AS $f) { + $fonttype = trim($f); + $fonttype = preg_replace('/["\']*(.*?)["\']*/','\\1',$fonttype); + $fonttype = preg_replace('/ /','',$fonttype); + $v = strtolower(trim($fonttype)); + if (isset($this->mpdf_ref->fonttrans[$v]) && $this->mpdf_ref->fonttrans[$v]) { $v = $this->mpdf_ref->fonttrans[$v]; } + if ((!$this->mpdf_ref->usingCoreFont && in_array($v,$this->mpdf_ref->available_unifonts)) || + ($this->mpdf_ref->usingCoreFont && in_array($v,array('courier','times','helvetica','arial'))) || + in_array($v, array('sjis','uhc','big5','gb'))) { + $current_style['font-family'] = $v; + $found = 1; + break; + } + } + if (!$found) { + foreach($aux_fontlist AS $f) { + $fonttype = trim($f); + $fonttype = preg_replace('/["\']*(.*?)["\']*/','\\1',$fonttype); + $fonttype = preg_replace('/ /','',$fonttype); + $v = strtolower(trim($fonttype)); + if (isset($this->mpdf_ref->fonttrans[$v]) && $this->mpdf_ref->fonttrans[$v]) { $v = $this->mpdf_ref->fonttrans[$v]; } + if (in_array($v,$this->mpdf_ref->sans_fonts) || in_array($v,$this->mpdf_ref->serif_fonts) || in_array($v,$this->mpdf_ref->mono_fonts) ) { + $current_style['font-family'] = $v; + break; + } + } + } + } + + if(isset($critere_style['text-anchor'])){ + $current_style['text-anchor'] = $critere_style['text-anchor']; + } + + // add current style to text style array (will remove it later after writing text to svg_string) + array_push($this->txt_style,$current_style); +} + + + + // + // fonction ajoutant un gradient + function svgAddGradient($id,$array_gradient){ + + $this->svg_gradient[$id] = $array_gradient; + + } + // + // Ajoute une couleur dans le gradient correspondant + + // + // function ecrivant dans le svgstring + function svgWriteString($content){ + + $this->svg_string .= $content; + + } + + + + // analise le svg et renvoie aux fonctions precedente our le traitement + function ImageSVG($data){ + $this->svg_info = array(); + + // mPDF 4.4.006 + if (preg_match('/<!ENTITY/si',$data)) { + // Get User-defined entities + preg_match_all('/<!ENTITY\s+([a-z]+)\s+\"(.*?)\">/si',$data, $ent); + // Replace entities + for ($i=0; $i<count($ent[0]); $i++) { + $data = preg_replace('/&'.preg_quote($ent[1][$i],'/').';/is', $ent[2][$i], $data); + } + } + + + // mPDF 4.4.003 + if (preg_match('/xlink:href=/si',$data)) { + // Get links + preg_match_all('/(<(linearGradient|radialgradient)[^>]*)xlink:href=["\']#(.*?)["\'](.*?)\/>/si',$data, $links); + if (count($links[0])) { $links[5] = array(); } // mPDF 4.5.010 + // Delete links from data - keeping in $links + for ($i=0; $i<count($links[0]); $i++) { + $links[5][$i] = 'tmpLink'.RAND(100000,9999999); // mPDF 4.5.010 + $data = preg_replace('/'.preg_quote($links[0][$i],'/').'/is', '<MYLINKS'.$links[5][$i].'>' , $data); // mPDF 4.5.010 + } + // Get targets + preg_match_all('/<(linearGradient|radialgradient)([^>]*)id=["\'](.*?)["\'](.*?)>(.*?)<\/(linearGradient|radialgradient)>/si',$data, $m); + $targets = array(); + $stops = array(); + // keeping in $targets + for ($i=0; $i<count($m[0]); $i++) { + $stops[$m[3][$i]] = $m[5][$i]; + } + // Add back links this time as targets (gradients) + for ($i=0; $i<count($links[0]); $i++) { + $def = $links[1][$i] .' '.$links[4][$i].'>'. $stops[$links[3][$i]].'</'.$links[2][$i] .'>' ; // mPDF 4.5.010 + $data = preg_replace('/<MYLINKS'.$links[5][$i].'>/is', $def , $data); // mPDF 4.5.010 + } + } + // mPDF 4.4.003 - Removes <pattern> + $data = preg_replace('/<pattern.*?<\/pattern>/is', '', $data); + // mPDF 4.4.003 - Removes <marker> + $data = preg_replace('/<marker.*?<\/marker>/is', '', $data); + + $this->svg_info['data'] = $data; + + $this->svg_string = ''; + + // + // chargement unique des fonctions + if(!function_exists("xml_svg2pdf_start")){ // mPDF 5.3.76 + + function xml_svg2pdf_start($parser, $name, $attribs){ + // + // definition + global $svg_class, $last_gradid; + + // mPDF 4.4.003 + $svg_class->xbase = 0; + $svg_class->ybase = 0; + switch (strtolower($name)){ + + // mPDF 5.0.039 - Don't output stuff inside <defs> + case 'defs': + $svg_class->inDefs = true; + return; + + case 'svg': + $svg_class->svgOffset($attribs); + break; + + case 'path': + $path = $attribs['d']; + // mPDF 5.6.65 + preg_match_all('/([MZLHVCSQTAmzlhvcsqta])([eE ,\-.\d]+)*/', $path, $commands, PREG_SET_ORDER); + $path_cmd = ''; + $svg_class->subPathInit = true; + // mPDF 5.0.039 + $svg_class->pathBBox = array(999999,999999,-999999,-999999); + foreach($commands as $c){ + if(count($c)==3 || $c[2]==''){ + list($tmp, $command, $arguments) = $c; + } + else{ + list($tmp, $command) = $c; + $arguments = ''; + } + + $path_cmd .= $svg_class->svgPath($command, $arguments); + } + // mPDF 5.0.039 + if ($svg_class->pathBBox[2]==-1999998) { $svg_class->pathBBox[2] = 100; } + if ($svg_class->pathBBox[3]==-1999998) { $svg_class->pathBBox[3] = 100; } + if ($svg_class->pathBBox[0]==999999) { $svg_class->pathBBox[0] = 0; } + if ($svg_class->pathBBox[1]==999999) { $svg_class->pathBBox[1] = 0; } + $critere_style = $attribs; + unset($critere_style['d']); + $path_style = $svg_class->svgDefineStyle($critere_style); + break; + + case 'rect': + if (!isset($attribs['x'])) {$attribs['x'] = 0;} + if (!isset($attribs['y'])) {$attribs['y'] = 0;} + if (!isset($attribs['rx'])) {$attribs['rx'] = 0;} + if (!isset($attribs['ry'])) {$attribs['ry'] = 0;} + $arguments = array( + 'x' => $attribs['x'], + 'y' => $attribs['y'], + 'w' => $attribs['width'], + 'h' => $attribs['height'], + 'rx' => $attribs['rx'], + 'ry' => $attribs['ry'] + ); + $path_cmd = $svg_class->svgRect($arguments); + $critere_style = $attribs; + unset($critere_style['x'],$critere_style['y'],$critere_style['rx'],$critere_style['ry'],$critere_style['height'],$critere_style['width']); + $path_style = $svg_class->svgDefineStyle($critere_style); + break; + + case 'circle': + if (!isset($attribs['cx'])) {$attribs['cx'] = 0;} + if (!isset($attribs['cy'])) {$attribs['cy'] = 0;} + $arguments = array( + 'cx' => $attribs['cx'], + 'cy' => $attribs['cy'], + 'rx' => $attribs['r'], + 'ry' => $attribs['r'] + ); + $path_cmd = $svg_class->svgEllipse($arguments); + $critere_style = $attribs; + unset($critere_style['cx'],$critere_style['cy'],$critere_style['r']); + $path_style = $svg_class->svgDefineStyle($critere_style); + break; + + case 'ellipse': + if (!isset($attribs['cx'])) {$attribs['cx'] = 0;} + if (!isset($attribs['cy'])) {$attribs['cy'] = 0;} + $arguments = array( + 'cx' => $attribs['cx'], + 'cy' => $attribs['cy'], + 'rx' => $attribs['rx'], + 'ry' => $attribs['ry'] + ); + $path_cmd = $svg_class->svgEllipse($arguments); + $critere_style = $attribs; + unset($critere_style['cx'],$critere_style['cy'],$critere_style['rx'],$critere_style['ry']); + $path_style = $svg_class->svgDefineStyle($critere_style); + break; + + case 'line': + $arguments = array($attribs['x1'],$attribs['y1'],$attribs['x2'],$attribs['y2']); + $path_cmd = $svg_class->svgPolyline($arguments,false); // mPDF 4.4.003 + $critere_style = $attribs; + unset($critere_style['x1'],$critere_style['y1'],$critere_style['x2'],$critere_style['y2']); + $path_style = $svg_class->svgDefineStyle($critere_style); + break; + + case 'polyline': + $path = $attribs['points']; + preg_match_all('/[0-9\-\.]*/',$path, $tmp, PREG_SET_ORDER); + $arguments = array(); + for ($i=0;$i<count($tmp);$i++){ + if ($tmp[$i][0] !=''){ + array_push($arguments, $tmp[$i][0]); + } + } + $path_cmd = $svg_class->svgPolyline($arguments); + $critere_style = $attribs; + unset($critere_style['points']); + $path_style = $svg_class->svgDefineStyle($critere_style); + break; + + case 'polygon': + $path = $attribs['points']; + preg_match_all('/([\-]*[0-9\.]+)/',$path, $tmp); + $arguments = array(); + for ($i=0;$i<count($tmp[0]);$i++){ + if ($tmp[0][$i] !=''){ + array_push($arguments, $tmp[0][$i]); + } + } + $path_cmd = $svg_class->svgPolygon($arguments); + // definition du style de la forme: + $critere_style = $attribs; + unset($critere_style['points']); + $path_style = $svg_class->svgDefineStyle($critere_style); + break; + + case 'lineargradient': + $tmp_gradient = array( + 'type' => 'linear', + 'info' => array( + 'x1' => $attribs['x1'], + 'y1' => $attribs['y1'], + 'x2' => $attribs['x2'], + 'y2' => $attribs['y2'] + ), + 'transform' => $attribs['gradientTransform'], + 'units' => $attribs['gradientUnits'], /* mPDF 4.4.003 */ + 'spread' => $attribs['spreadMethod'], /* mPDF 5.0.040 */ + 'color' => array() + ); + + $last_gradid = $attribs['id']; + $svg_class->svgAddGradient($attribs['id'],$tmp_gradient); + break; + + case 'radialgradient': + $tmp_gradient = array( + 'type' => 'radial', + 'info' => array( + 'x0' => $attribs['cx'], + 'y0' => $attribs['cy'], + 'x1' => $attribs['fx'], + 'y1' => $attribs['fy'], + 'r' => $attribs['r'] + ), + 'transform' => $attribs['gradientTransform'], + 'units' => $attribs['gradientUnits'], /* mPDF 4.4.003 */ + 'spread' => $attribs['spreadMethod'], /* mPDF 5.0.040 */ + 'color' => array() + ); + + $last_gradid = $attribs['id']; + + $svg_class->svgAddGradient($attribs['id'],$tmp_gradient); + + break; + + case 'stop': + if (!$last_gradid) break; + // mPDF 4.4.003 // mPDF 5.0.040 + if (isset($attribs['style']) AND preg_match('/stop-color:\s*([^;]*)/i',$attribs['style'],$m)) { + $color = trim($m[1]); + } else if (isset($attribs['stop-color'])) { + $color = $attribs['stop-color']; + } + $col = $svg_class->mpdf_ref->ConvertColor($color); + + // mPDF 5.0.051 + // mPDF 5.3.74 + if ($col{0}==3 || $col{0}==5) { // RGB + $color_final = sprintf('%.3F %.3F %.3F',ord($col{1})/255,ord($col{2})/255,ord($col{3})/255); + $svg_class->svg_gradient[$last_gradid]['colorspace']='RGB'; + } + else if ($col{0}==4 || $col{0}==6) { // CMYK + $color_final = sprintf('%.3F %.3F %.3F %.3F',ord($col{1})/100,ord($col{2})/100,ord($col{3})/100,ord($col{4})/100); + $svg_class->svg_gradient[$last_gradid]['colorspace']='CMYK'; + } + else if ($col{0}==1) { // Grayscale + $color_final = sprintf('%.3F',ord($col{1})/255); + $svg_class->svg_gradient[$last_gradid]['colorspace']='Gray'; + } + + + // mPDF 5.0.020 + $stop_opacity = 1; + // mPDF 4.4.003 + if (isset($attribs['style']) AND preg_match('/stop-opacity:\s*([0-9.]*)/i',$attribs['style'],$m)) { + $stop_opacity = $m[1]; + } else if (isset($attribs['stop-opacity'])) { + $stop_opacity = $attribs['stop-opacity']; + } + // mPDF 5.0.051 + // mPDF 5.3.74 + else if ($col{0}==5) { // RGBa + $stop_opacity = ord($col{4}/100); + } + else if ($col{0}==6) { // CMYKa + $stop_opacity = ord($col{5}/100); + } + + $tmp_color = array( + 'color' => $color_final, + 'offset' => $attribs['offset'], + 'opacity' => $stop_opacity + ); + array_push($svg_class->svg_gradient[$last_gradid]['color'],$tmp_color); + break; + + + case 'a': + if (isset($attribs['xlink:href'])) { + unset($attribs['xlink:href']); // this should be a hyperlink + // not handled like a xlink:href in other elements + } // then continue like a <g> + case 'g': + $array_style = $svg_class->svgDefineStyle($attribs); + if ($array_style['transformations']) { + $svg_class->svgWriteString(' q '.$array_style['transformations']); + } + array_push($svg_class->svg_style,$array_style); + + $svg_class->svgDefineTxtStyle($attribs); // mPDF 4.4.003 + + break; + + case 'text': + // mPDF 4.4.003 + $array_style = $svg_class->svgDefineStyle($attribs); + if ($array_style['transformations']) { + $svg_class->svgWriteString(' q '.$array_style['transformations']); + } + array_push($svg_class->svg_style,$array_style); + + $svg_class->txt_data = array(); + $svg_class->txt_data[0] = $attribs['x']; + $svg_class->txt_data[1] = $attribs['y']; + $critere_style = $attribs; + unset($critere_style['x'], $critere_style['y']); + $svg_class->svgDefineTxtStyle($critere_style); + break; + } + + // + //insertion des path et du style dans le flux de donn general. + if (isset($path_cmd) && $path_cmd) { // mPDF 4.4.003 + // mPDF 5.0 + list($prestyle,$poststyle) = $svg_class->svgStyle($path_style, $attribs, strtolower($name)); + if ($path_style['transformations']) { // transformation on an element + $svg_class->svgWriteString(" q ".$path_style['transformations']. " $prestyle $path_cmd $poststyle" . " Q\n"); + } + else { + $svg_class->svgWriteString("$prestyle $path_cmd $poststyle\n"); + } + } + } + + function characterData($parser, $data) + { + global $svg_class; + if(isset($svg_class->txt_data[2])) { + $svg_class->txt_data[2] .= $data; + } + else { + $svg_class->txt_data[2] = $data; + } + } + + + function xml_svg2pdf_end($parser, $name){ + global $svg_class; + switch($name){ + + case "g": + case "a": + $tmp = count($svg_class->svg_style)-1; + $current_style = $svg_class->svg_style[$tmp]; + if ($current_style['transformations']) { + $svg_class->svgWriteString(" Q\n"); + } + array_pop($svg_class->svg_style); + + array_pop($svg_class->txt_style); // mPDF 4.4.003 + + break; + case 'radialgradient': + case 'lineargradient': + $last_gradid = ''; + break; + case "text": + $path_cmd = $svg_class->svgText(); + // echo 'path >> '.$path_cmd."<br><br>"; + // echo "style >> ".$get_style[1]."<br><br>"; + $svg_class->svgWriteString($path_cmd); + // mPDF 4.4.003 + $tmp = count($svg_class->svg_style)-1; + $current_style = $svg_class->svg_style[$tmp]; + if ($current_style['transformations']) { + $svg_class->svgWriteString(" Q\n"); + } + array_pop($svg_class->svg_style); + + break; + } + // mPDF 5.0.039 - Don't output stuff inside <defs> + if ($name == 'defs') { + $svg_class->inDefs = false; + } + + } + + } + + $svg2pdf_xml=''; + global $svg_class; + $svg_class = $this; + // mPDF 5.0.039 - Don't output stuff inside <defs> + $svg_class->inDefs = false; + $svg2pdf_xml_parser = xml_parser_create("utf-8"); + xml_parser_set_option($svg2pdf_xml_parser, XML_OPTION_CASE_FOLDING, false); + xml_set_element_handler($svg2pdf_xml_parser, "xml_svg2pdf_start", "xml_svg2pdf_end"); + xml_set_character_data_handler($svg2pdf_xml_parser, "characterData"); + xml_parse($svg2pdf_xml_parser, $data); + // mPDF 4.4.003 + if ($this->svg_error) { return false; } + else { + return array('x'=>$this->svg_info['x']*$this->kp,'y'=>-$this->svg_info['y']*$this->kp,'w'=>$this->svg_info['w']*$this->kp,'h'=>-$this->svg_info['h']*$this->kp,'data'=>$svg_class->svg_string); + } + + } + +} + +// END OF CLASS + + +// mPDF 5.0.040 +function calc_bezier_bbox($start, $c) { + $P0 = array($start[0],$start[1]); + $P1 = array($c[0],$c[1]); + $P2 = array($c[2],$c[3]); + $P3 = array($c[4],$c[5]); + $bounds = array(); + $bounds[0][] = $P0[0]; + $bounds[1][] = $P0[1]; + $bounds[0][] = $P3[0]; + $bounds[1][] = $P3[1]; + for ($i=0;$i<=1;$i++) { + $b = 6 * $P0[$i] - 12 * $P1[$i] + 6 * $P2[$i]; + $a = -3 * $P0[$i] + 9 * $P1[$i] - 9 * $P2[$i] + 3 * $P3[$i]; + $c = 3 * $P1[$i] - 3 * $P0[$i]; + if ($a == 0) { + if ($b == 0) { continue; } + $t = -$c / $b; + if ($t>0 && $t<1) { + $bounds[$i][] = (pow((1-$t),3) * $P0[$i] + 3 * pow((1-$t),2) * $t * $P1[$i] + 3 * (1-$t) * pow($t,2) * $P2[$i] + pow($t,3) * $P3[$i]); + } + continue; + } + $b2ac = pow($b, 2) - 4 * $c * $a; + if ($b2ac < 0) { continue; } + $t1 = (-$b + sqrt($b2ac))/(2 * $a); + if ($t1>0 && $t1<1) { + $bounds[$i][] = (pow((1-$t1),3) * $P0[$i] + 3 * pow((1-$t1),2) * $t1 * $P1[$i] + 3 * (1-$t1) * pow($t1,2) * $P2[$i] + pow($t1,3) * $P3[$i]); + } + $t2 = (-$b - sqrt($b2ac))/(2 * $a); + if ($t2>0 && $t2<1) { + $bounds[$i][] = (pow((1-$t2),3) * $P0[$i] + 3 * pow((1-$t2),2) * $t2 * $P1[$i] + 3 * (1-$t2) * pow($t2,2) * $P2[$i] + pow($t2,3) * $P3[$i]); + } + } + $x = min($bounds[0]); + $x2 = max($bounds[0]); + $y = min($bounds[1]); + $y2 = max($bounds[1]); + return array($x, $y, $x2, $y2); +} + +// mPDF 5.0.040 +function _testIntersectCircle($cx, $cy, $cr) { + // Tests whether a circle fully encloses a rectangle 0,0,1,1 + // to see if any further radial gradients need adding (SVG) + // If centre of circle is inside 0,0,1,1 square + if ($cx >= 0 && $cx <= 1 && $cy >= 0 && $cy <= 1) { + $maxd = 1.5; + } + // distance to four corners + else { + $d1 = sqrt(pow(($cy-0),2) + pow(($cx-0),2)); + $d2 = sqrt(pow(($cy-1),2) + pow(($cx-0),2)); + $d3 = sqrt(pow(($cy-0),2) + pow(($cx-1),2)); + $d4 = sqrt(pow(($cy-1),2) + pow(($cx-1),2)); + $maxd = max($d1,$d2,$d3,$d4); + } + if ($cr < $maxd) { return true; } + else { return false; } +} + +// mPDF 5.0.040 +function _testIntersect($x1, $y1, $x2, $y2, $x3, $y3, $x4, $y4) { + // Tests whether line (x1, y1) and (x2, y2) [a gradient axis (perpendicular)] + // intersects with a specific line segment (x3, y3) and (x4, y4) + $a1 = $y2-$y1; + $b1 = $x1-$x2; + $c1 = $a1*$x1+$b1*$y1; + $a2 = $y4-$y3; + $b2 = $x3-$x4; + $c2 = $a2*$x3+$b2*$y3; + $det = $a1*$b2 - $a2*$b1; + if($det == 0){ //Lines are parallel + return false; + } + else{ + $x = ($b2*$c1 - $b1*$c2)/$det; + $y = ($a1*$c2 - $a2*$c1)/$det; + if ($x >= $x3 && $x <= $x4 && $y >= $y3 && $y <= $y4) { return true; } + } + return false; +} + + + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/classes/tocontents.php b/application/third_party/mpdf/classes/tocontents.php new file mode 100644 index 0000000..7b75547 --- /dev/null +++ b/application/third_party/mpdf/classes/tocontents.php @@ -0,0 +1,468 @@ +<?php + +class tocontents { + +var $mpdf = null; +var $_toc; +var $TOCmark; +var $TOCoutdent; // mPDF 5.6.31 +var $TOCpreHTML; +var $TOCpostHTML; +var $TOCbookmarkText; +var $TOCusePaging; +var $TOCuseLinking; +var $TOCorientation; +var $TOC_margin_left; +var $TOC_margin_right; +var $TOC_margin_top; +var $TOC_margin_bottom; +var $TOC_margin_header; +var $TOC_margin_footer; +var $TOC_odd_header_name; +var $TOC_even_header_name; +var $TOC_odd_footer_name; +var $TOC_even_footer_name; +var $TOC_odd_header_value; +var $TOC_even_header_value; +var $TOC_odd_footer_value; +var $TOC_even_footer_value; +var $TOC_page_selector; +var $m_TOC; + +function tocontents(&$mpdf) { + $this->mpdf = $mpdf; + $this->_toc=array(); + $this->TOCmark = 0; + $this->m_TOC=array(); +} + +function TOCpagebreak($tocfont='', $tocfontsize='', $tocindent='', $TOCusePaging=true, $TOCuseLinking='', $toc_orientation='', $toc_mgl='',$toc_mgr='',$toc_mgt='',$toc_mgb='',$toc_mgh='',$toc_mgf='',$toc_ohname='',$toc_ehname='',$toc_ofname='',$toc_efname='',$toc_ohvalue=0,$toc_ehvalue=0,$toc_ofvalue=0, $toc_efvalue=0, $toc_preHTML='', $toc_postHTML='', $toc_bookmarkText='', $resetpagenum='', $pagenumstyle='', $suppress='', $orientation='', $mgl='',$mgr='',$mgt='',$mgb='',$mgh='',$mgf='',$ohname='',$ehname='',$ofname='',$efname='',$ohvalue=0,$ehvalue=0,$ofvalue=0,$efvalue=0, $toc_id=0, $pagesel='', $toc_pagesel='', $sheetsize='', $toc_sheetsize='', $tocoutdent='') { // mPDF 5.6.19 + if (strtoupper($toc_id)=='ALL') { $toc_id = '_mpdf_all'; } + else if (!$toc_id) { $toc_id = 0; } + else { $toc_id = strtolower($toc_id); } + + if ($TOCusePaging === false || strtolower($TOCusePaging) == "off" || $TOCusePaging === 0 || $TOCusePaging === "0" || $TOCusePaging === "") { $TOCusePaging = false; } + else { $TOCusePaging = true; } + if (!$TOCuseLinking) { $TOCuseLinking = false; } + if ($toc_id) { + $this->m_TOC[$toc_id]['TOCmark'] = $this->mpdf->page; + $this->m_TOC[$toc_id]['TOCoutdent'] = $tocoutdent; + $this->m_TOC[$toc_id]['TOCorientation'] = $toc_orientation; + $this->m_TOC[$toc_id]['TOCuseLinking'] = $TOCuseLinking; + $this->m_TOC[$toc_id]['TOCusePaging'] = $TOCusePaging; + + if ($toc_preHTML) { $this->m_TOC[$toc_id]['TOCpreHTML'] = $toc_preHTML; } + if ($toc_postHTML) { $this->m_TOC[$toc_id]['TOCpostHTML'] = $toc_postHTML; } + if ($toc_bookmarkText) { $this->m_TOC[$toc_id]['TOCbookmarkText'] = $toc_bookmarkText; } + + $this->m_TOC[$toc_id]['TOC_margin_left'] = $toc_mgl; + $this->m_TOC[$toc_id]['TOC_margin_right'] = $toc_mgr; + $this->m_TOC[$toc_id]['TOC_margin_top'] = $toc_mgt; + $this->m_TOC[$toc_id]['TOC_margin_bottom'] = $toc_mgb; + $this->m_TOC[$toc_id]['TOC_margin_header'] = $toc_mgh; + $this->m_TOC[$toc_id]['TOC_margin_footer'] = $toc_mgf; + $this->m_TOC[$toc_id]['TOC_odd_header_name'] = $toc_ohname; + $this->m_TOC[$toc_id]['TOC_even_header_name'] = $toc_ehname; + $this->m_TOC[$toc_id]['TOC_odd_footer_name'] = $toc_ofname; + $this->m_TOC[$toc_id]['TOC_even_footer_name'] = $toc_efname; + $this->m_TOC[$toc_id]['TOC_odd_header_value'] = $toc_ohvalue; + $this->m_TOC[$toc_id]['TOC_even_header_value'] = $toc_ehvalue; + $this->m_TOC[$toc_id]['TOC_odd_footer_value'] = $toc_ofvalue; + $this->m_TOC[$toc_id]['TOC_even_footer_value'] = $toc_efvalue; + $this->m_TOC[$toc_id]['TOC_page_selector'] = $toc_pagesel; + $this->m_TOC[$toc_id]['TOCsheetsize'] = $toc_sheetsize; + } + else { + $this->TOCmark = $this->mpdf->page; + $this->TOCoutdent = $tocoutdent; + $this->TOCorientation = $toc_orientation; + $this->TOCuseLinking = $TOCuseLinking; + $this->TOCusePaging = $TOCusePaging; + + if ($toc_preHTML) { $this->TOCpreHTML = $toc_preHTML; } + if ($toc_postHTML) { $this->TOCpostHTML = $toc_postHTML; } + if ($toc_bookmarkText) { $this->TOCbookmarkText = $toc_bookmarkText; } + + $this->TOC_margin_left = $toc_mgl; + $this->TOC_margin_right = $toc_mgr; + $this->TOC_margin_top = $toc_mgt; + $this->TOC_margin_bottom = $toc_mgb; + $this->TOC_margin_header = $toc_mgh; + $this->TOC_margin_footer = $toc_mgf; + $this->TOC_odd_header_name = $toc_ohname; + $this->TOC_even_header_name = $toc_ehname; + $this->TOC_odd_footer_name = $toc_ofname; + $this->TOC_even_footer_name = $toc_efname; + $this->TOC_odd_header_value = $toc_ohvalue; + $this->TOC_even_header_value = $toc_ehvalue; + $this->TOC_odd_footer_value = $toc_ofvalue; + $this->TOC_even_footer_value = $toc_efvalue; + $this->TOC_page_selector = $toc_pagesel; + $this->TOCsheetsize = $toc_sheetsize; + } +} + +// Initiate, and Mark a place for the Table of Contents to be inserted +function TOC($tocfont='', $tocfontsize=0, $tocindent=0, $resetpagenum='', $pagenumstyle='', $suppress='', $toc_orientation='', $TOCusePaging=true, $TOCuseLinking=false, $toc_id=0, $tocoutdent='') { // mPDF 5.6.19) { + if (strtoupper($toc_id)=='ALL') { $toc_id = '_mpdf_all'; } + else if (!$toc_id) { $toc_id = 0; } + else { $toc_id = strtolower($toc_id); } + // To use odd and even pages + // Cannot start table of contents on an even page + if (($this->mpdf->mirrorMargins) && (($this->mpdf->page)%2==0)) { // EVEN + if ($this->mpdf->ColActive) { + if (count($this->mpdf->columnbuffer)) { $this->mpdf->printcolumnbuffer(); } + } + $this->mpdf->AddPage($this->mpdf->CurOrientation,'',$resetpagenum, $pagenumstyle, $suppress); + } + else { + $this->mpdf->PageNumSubstitutions[] = array('from'=>$this->mpdf->page, 'reset'=> $resetpagenum, 'type'=>$pagenumstyle, 'suppress'=>$suppress); + } + if ($toc_id) { + $this->m_TOC[$toc_id]['TOCmark'] = $this->mpdf->page; + $this->m_TOC[$toc_id]['TOCoutdent'] = $tocoutdent; + $this->m_TOC[$toc_id]['TOCorientation'] = $toc_orientation; + $this->m_TOC[$toc_id]['TOCuseLinking'] = $TOCuseLinking; + $this->m_TOC[$toc_id]['TOCusePaging'] = $TOCusePaging; + } + else { + $this->TOCmark = $this->mpdf->page; + $this->TOCoutdent = $tocoutdent; + $this->TOCorientation = $toc_orientation; + $this->TOCuseLinking = $TOCuseLinking; + $this->TOCusePaging = $TOCusePaging; + } +} + + +function insertTOC() { + $notocs = 0; + if ($this->TOCmark) { $notocs = 1; } + $notocs += count($this->m_TOC); + + if ($notocs==0) { return; } + + if (count($this->m_TOC)) { reset($this->m_TOC); } + $added_toc_pages = 0; + + if ($this->mpdf->ColActive) { $this->mpdf->SetColumns(0); } + if (($this->mpdf->mirrorMargins) && (($this->mpdf->page)%2==1)) { // ODD + $this->mpdf->AddPage($this->mpdf->CurOrientation); + $extrapage = true; + } + else { $extrapage = false; } + + for ($toci = 0; $toci<$notocs; $toci++) { + if ($toci==0 && $this->TOCmark) { + $toc_id = 0; + $toc_page = $this->TOCmark; + $tocoutdent = $this->TOCoutdent; + $toc_orientation = $this->TOCorientation; + $TOCuseLinking = $this->TOCuseLinking; + $TOCusePaging = $this->TOCusePaging; + $toc_preHTML = $this->TOCpreHTML; + $toc_postHTML = $this->TOCpostHTML; + $toc_bookmarkText = $this->TOCbookmarkText; + $toc_mgl = $this->TOC_margin_left; + $toc_mgr = $this->TOC_margin_right; + $toc_mgt = $this->TOC_margin_top; + $toc_mgb = $this->TOC_margin_bottom; + $toc_mgh = $this->TOC_margin_header; + $toc_mgf = $this->TOC_margin_footer; + $toc_ohname = $this->TOC_odd_header_name; + $toc_ehname = $this->TOC_even_header_name; + $toc_ofname = $this->TOC_odd_footer_name; + $toc_efname = $this->TOC_even_footer_name; + $toc_ohvalue = $this->TOC_odd_header_value; + $toc_ehvalue = $this->TOC_even_header_value; + $toc_ofvalue = $this->TOC_odd_footer_value; + $toc_efvalue = $this->TOC_even_footer_value; + $toc_page_selector = $this->TOC_page_selector; + $toc_sheet_size = $this->TOCsheetsize; + } + else { + $arr = current($this->m_TOC); + + $toc_id = key($this->m_TOC); + $toc_page = $this->m_TOC[$toc_id]['TOCmark']; + $tocoutdent = $this->m_TOC[$toc_id]['TOCoutdent']; + $toc_orientation = $this->m_TOC[$toc_id]['TOCorientation']; + $TOCuseLinking = $this->m_TOC[$toc_id]['TOCuseLinking']; + $TOCusePaging = $this->m_TOC[$toc_id]['TOCusePaging']; + if (isset($this->m_TOC[$toc_id]['TOCpreHTML'])) { $toc_preHTML = $this->m_TOC[$toc_id]['TOCpreHTML']; } + else { $toc_preHTML = ''; } + if (isset($this->m_TOC[$toc_id]['TOCpostHTML'])) { $toc_postHTML = $this->m_TOC[$toc_id]['TOCpostHTML']; } + else { $toc_postHTML = ''; } + if (isset($this->m_TOC[$toc_id]['TOCbookmarkText'])) { $toc_bookmarkText = $this->m_TOC[$toc_id]['TOCbookmarkText']; } + else { $toc_bookmarkText = ''; } // *BOOKMARKS* + $toc_mgl = $this->m_TOC[$toc_id]['TOC_margin_left']; + $toc_mgr = $this->m_TOC[$toc_id]['TOC_margin_right']; + $toc_mgt = $this->m_TOC[$toc_id]['TOC_margin_top']; + $toc_mgb = $this->m_TOC[$toc_id]['TOC_margin_bottom']; + $toc_mgh = $this->m_TOC[$toc_id]['TOC_margin_header']; + $toc_mgf = $this->m_TOC[$toc_id]['TOC_margin_footer']; + $toc_ohname = $this->m_TOC[$toc_id]['TOC_odd_header_name']; + $toc_ehname = $this->m_TOC[$toc_id]['TOC_even_header_name']; + $toc_ofname = $this->m_TOC[$toc_id]['TOC_odd_footer_name']; + $toc_efname = $this->m_TOC[$toc_id]['TOC_even_footer_name']; + $toc_ohvalue = $this->m_TOC[$toc_id]['TOC_odd_header_value']; + $toc_ehvalue = $this->m_TOC[$toc_id]['TOC_even_header_value']; + $toc_ofvalue = $this->m_TOC[$toc_id]['TOC_odd_footer_value']; + $toc_efvalue = $this->m_TOC[$toc_id]['TOC_even_footer_value']; + $toc_page_selector = $this->m_TOC[$toc_id]['TOC_page_selector']; + $toc_sheet_size = $this->m_TOC[$toc_id]['TOCsheetsize']; + next($this->m_TOC); + } + + // mPDF 5.6.31 + + if (!$toc_orientation) { $toc_orientation= $this->mpdf->DefOrientation; } + $this->mpdf->AddPage($toc_orientation, '', '', '', "on", $toc_mgl, $toc_mgr, $toc_mgt, $toc_mgb, $toc_mgh, $toc_mgf, $toc_ohname, $toc_ehname, $toc_ofname, $toc_efname, $toc_ohvalue, $toc_ehvalue, $toc_ofvalue, $toc_efvalue, $toc_page_selector, $toc_sheet_size ); + + $this->mpdf->writingToC = true; // mPDF 5.6.38 + // mPDF 5.6.31 + $tocstart=count($this->mpdf->pages); + if ($toc_preHTML) { $this->mpdf->WriteHTML($toc_preHTML); } + + + // mPDF 5.6.19 + $html ='<div class="mpdf_toc" id="mpdf_toc_'.$toc_id.'">'; + foreach($this->_toc as $t) { + if ($t['toc_id']==='_mpdf_all' || $t['toc_id']===$toc_id ) { + $html .= '<div class="mpdf_toc_level_'.$t['l'].'">'; + if ($TOCuseLinking) { $html .= '<a class="mpdf_toc_a" href="#__mpdfinternallink_'.$t['link'].'">'; } + $html .= '<span class="mpdf_toc_t_level_'.$t['l'].'">'.$t['t'].'</span>'; + if ($TOCuseLinking) { $html .= '</a>'; } + if (!$tocoutdent) { $tocoutdent = '0'; } + if ($TOCusePaging) { $html .= ' <dottab outdent="'.$tocoutdent.'" /> '; + if ($TOCuseLinking) { $html .= '<a class="mpdf_toc_a" href="#__mpdfinternallink_'.$t['link'].'">'; } + $html .= '<span class="mpdf_toc_p_level_'.$t['l'].'">'.$this->mpdf->docPageNum($t['p']).'</span>'; + if ($TOCuseLinking) { $html .= '</a>'; } + } + $html .= '</div>'; + } + } + $html .= '</div>'; + $this->mpdf->WriteHTML($html); + + if ($toc_postHTML) { $this->mpdf->WriteHTML($toc_postHTML); } + $this->mpdf->writingToC = false; // mPDF 5.6.38 + $this->mpdf->AddPage($toc_orientation,'E'); + + $n_toc = $this->mpdf->page - $tocstart + 1; + + if ($toci==0 && $this->TOCmark) { + $TOC_start = $tocstart ; + $TOC_end = $this->mpdf->page; + $TOC_npages = $n_toc; + } + else { + $this->m_TOC[$toc_id]['start'] = $tocstart ; + $this->m_TOC[$toc_id]['end'] = $this->mpdf->page; + $this->m_TOC[$toc_id]['npages'] = $n_toc; + } + } + + $s = ''; + + $s .= $this->mpdf->PrintBodyBackgrounds(); + + $s .= $this->mpdf->PrintPageBackgrounds(); + $this->mpdf->pages[$this->mpdf->page] = preg_replace('/(___BACKGROUND___PATTERNS'.date('jY').')/', "\n".$s."\n".'\\1', $this->mpdf->pages[$this->mpdf->page]); + $this->mpdf->pageBackgrounds = array(); + + //Page footer + $this->mpdf->InFooter=true; + $this->mpdf->Footer(); + $this->mpdf->InFooter=false; + + // 2nd time through to move pages etc. + $added_toc_pages = 0; + if (count($this->m_TOC)) { reset($this->m_TOC); } + + for ($toci = 0; $toci<$notocs; $toci++) { + if ($toci==0 && $this->TOCmark) { + $toc_id = 0; + $toc_page = $this->TOCmark + $added_toc_pages; + $toc_orientation = $this->TOCorientation; + $TOCuseLinking = $this->TOCuseLinking; + $TOCusePaging = $this->TOCusePaging; + $toc_bookmarkText = $this->TOCbookmarkText; // *BOOKMARKS* + + $tocstart = $TOC_start ; + $tocend = $n = $TOC_end; + $n_toc = $TOC_npages; + } + else { + $arr = current($this->m_TOC); + + $toc_id = key($this->m_TOC); + $toc_page = $this->m_TOC[$toc_id]['TOCmark'] + $added_toc_pages; + $toc_orientation = $this->m_TOC[$toc_id]['TOCorientation']; + $TOCuseLinking = $this->m_TOC[$toc_id]['TOCuseLinking']; + $TOCusePaging = $this->m_TOC[$toc_id]['TOCusePaging']; + $toc_bookmarkText = $this->m_TOC[$toc_id]['TOCbookmarkText']; // *BOOKMARKS* + + $tocstart = $this->m_TOC[$toc_id]['start'] ; + $tocend = $n = $this->m_TOC[$toc_id]['end'] ; + $n_toc = $this->m_TOC[$toc_id]['npages'] ; + + next($this->m_TOC); + } + + // Now pages moved + $added_toc_pages += $n_toc; + + $this->mpdf->MovePages($toc_page, $tocstart, $tocend) ; + $this->mpdf->pgsIns[$toc_page] = $tocend - $tocstart + 1; + +/*-- BOOKMARKS --*/ + // Insert new Bookmark for Bookmark + if ($toc_bookmarkText) { + $insert = -1; + foreach($this->mpdf->BMoutlines as $i=>$o) { + if($o['p']<$toc_page) { // i.e. before point of insertion + $insert = $i; + } + } + $txt = $this->mpdf->purify_utf8_text($toc_bookmarkText); + if ($this->mpdf->text_input_as_HTML) { + $txt = $this->mpdf->all_entities_to_utf8($txt); + } + $newBookmark[0] = array('t'=>$txt,'l'=>0,'y'=>0,'p'=>$toc_page ); + array_splice($this->mpdf->BMoutlines,($insert+1),0,$newBookmark); + } +/*-- END BOOKMARKS --*/ + + } + + // Delete empty page that was inserted earlier + if ($extrapage) { + unset($this->mpdf->pages[count($this->mpdf->pages)]); + $this->mpdf->page--; // Reset page pointer + } + + +} + + +function openTagTOC($attr) { + if (isset($attr['OUTDENT']) && $attr['OUTDENT']) { $tocoutdent = $attr['OUTDENT']; } else { $tocoutdent = ''; } // mPDF 5.6.19 + if (isset($attr['RESETPAGENUM']) && $attr['RESETPAGENUM']) { $resetpagenum = $attr['RESETPAGENUM']; } else { $resetpagenum = ''; } + if (isset($attr['PAGENUMSTYLE']) && $attr['PAGENUMSTYLE']) { $pagenumstyle = $attr['PAGENUMSTYLE']; } else { $pagenumstyle= ''; } + if (isset($attr['SUPPRESS']) && $attr['SUPPRESS']) { $suppress = $attr['SUPPRESS']; } else { $suppress = ''; } + if (isset($attr['TOC-ORIENTATION']) && $attr['TOC-ORIENTATION']) { $toc_orientation = $attr['TOC-ORIENTATION']; } else { $toc_orientation = ''; } + if (isset($attr['PAGING']) && (strtoupper($attr['PAGING'])=='OFF' || $attr['PAGING']==='0')) { $paging = false; } + else { $paging = true; } + if (isset($attr['LINKS']) && (strtoupper($attr['LINKS'])=='ON' || $attr['LINKS']==1)) { $links = true; } + else { $links = false; } + if (isset($attr['NAME']) && $attr['NAME']) { $toc_id = strtolower($attr['NAME']); } else { $toc_id = 0; } + $this->TOC('',0,0,$resetpagenum, $pagenumstyle, $suppress, $toc_orientation, $paging, $links, $toc_id, $tocoutdent); // mPDF 5.6.19 5.6.31 +} + + +function openTagTOCPAGEBREAK($attr) { + if (isset($attr['NAME']) && $attr['NAME']) { $toc_id = strtolower($attr['NAME']); } else { $toc_id = 0; } + if ($toc_id) { + if (isset($attr['OUTDENT']) && $attr['OUTDENT']) { $this->m_TOC[$toc_id]['TOCoutdent'] = $attr['OUTDENT']; } else { $this->m_TOC[$toc_id]['TOCoutdent'] = ''; } // mPDF 5.6.19 + if (isset($attr['TOC-ORIENTATION']) && $attr['TOC-ORIENTATION']) { $this->m_TOC[$toc_id]['TOCorientation'] = $attr['TOC-ORIENTATION']; } else { $this->m_TOC[$toc_id]['TOCorientation'] = ''; } + if (isset($attr['PAGING']) && (strtoupper($attr['PAGING'])=='OFF' || $attr['PAGING']==='0')) { $this->m_TOC[$toc_id]['TOCusePaging'] = false; } + else { $this->m_TOC[$toc_id]['TOCusePaging'] = true; } + if (isset($attr['LINKS']) && (strtoupper($attr['LINKS'])=='ON' || $attr['LINKS']==1)) { $this->m_TOC[$toc_id]['TOCuseLinking'] = true; } + else { $this->m_TOC[$toc_id]['TOCuseLinking'] = false; } + + $this->m_TOC[$toc_id]['TOC_margin_left'] = $this->m_TOC[$toc_id]['TOC_margin_right'] = $this->m_TOC[$toc_id]['TOC_margin_top'] = $this->m_TOC[$toc_id]['TOC_margin_bottom'] = $this->m_TOC[$toc_id]['TOC_margin_header'] = $this->m_TOC[$toc_id]['TOC_margin_footer'] = ''; + if (isset($attr['TOC-MARGIN-RIGHT'])) { $this->m_TOC[$toc_id]['TOC_margin_right'] = $this->mpdf->ConvertSize($attr['TOC-MARGIN-RIGHT'],$this->mpdf->w,$this->mpdf->FontSize,false); } + if (isset($attr['TOC-MARGIN-LEFT'])) { $this->m_TOC[$toc_id]['TOC_margin_left'] = $this->mpdf->ConvertSize($attr['TOC-MARGIN-LEFT'],$this->mpdf->w,$this->mpdf->FontSize,false); } + if (isset($attr['TOC-MARGIN-TOP'])) { $this->m_TOC[$toc_id]['TOC_margin_top'] = $this->mpdf->ConvertSize($attr['TOC-MARGIN-TOP'],$this->mpdf->w,$this->mpdf->FontSize,false); } + if (isset($attr['TOC-MARGIN-BOTTOM'])) { $this->m_TOC[$toc_id]['TOC_margin_bottom'] = $this->mpdf->ConvertSize($attr['TOC-MARGIN-BOTTOM'],$this->mpdf->w,$this->mpdf->FontSize,false); } + if (isset($attr['TOC-MARGIN-HEADER'])) { $this->m_TOC[$toc_id]['TOC_margin_header'] = $this->mpdf->ConvertSize($attr['TOC-MARGIN-HEADER'],$this->mpdf->w,$this->mpdf->FontSize,false); } + if (isset($attr['TOC-MARGIN-FOOTER'])) { $this->m_TOC[$toc_id]['TOC_margin_footer'] = $this->mpdf->ConvertSize($attr['TOC-MARGIN-FOOTER'],$this->mpdf->w,$this->mpdf->FontSize,false); } + $this->m_TOC[$toc_id]['TOC_odd_header_name'] = $this->m_TOC[$toc_id]['TOC_even_header_name'] = $this->m_TOC[$toc_id]['TOC_odd_footer_name'] = $this->m_TOC[$toc_id]['TOC_even_footer_name'] = ''; + if (isset($attr['TOC-ODD-HEADER-NAME']) && $attr['TOC-ODD-HEADER-NAME']) { $this->m_TOC[$toc_id]['TOC_odd_header_name'] = $attr['TOC-ODD-HEADER-NAME']; } + if (isset($attr['TOC-EVEN-HEADER-NAME']) && $attr['TOC-EVEN-HEADER-NAME']) { $this->m_TOC[$toc_id]['TOC_even_header_name'] = $attr['TOC-EVEN-HEADER-NAME']; } + if (isset($attr['TOC-ODD-FOOTER-NAME']) && $attr['TOC-ODD-FOOTER-NAME']) { $this->m_TOC[$toc_id]['TOC_odd_footer_name'] = $attr['TOC-ODD-FOOTER-NAME']; } + if (isset($attr['TOC-EVEN-FOOTER-NAME']) && $attr['TOC-EVEN-FOOTER-NAME']) { $this->m_TOC[$toc_id]['TOC_even_footer_name'] = $attr['TOC-EVEN-FOOTER-NAME']; } + $this->m_TOC[$toc_id]['TOC_odd_header_value'] = $this->m_TOC[$toc_id]['TOC_even_header_value'] = $this->m_TOC[$toc_id]['TOC_odd_footer_value'] = $this->m_TOC[$toc_id]['TOC_even_footer_value'] = 0; + if (isset($attr['TOC-ODD-HEADER-VALUE']) && ($attr['TOC-ODD-HEADER-VALUE']=='1' || strtoupper($attr['TOC-ODD-HEADER-VALUE'])=='ON')) { $this->m_TOC[$toc_id]['TOC_odd_header_value'] = 1; } + else if (isset($attr['TOC-ODD-HEADER-VALUE']) && ($attr['TOC-ODD-HEADER-VALUE']=='-1' || strtoupper($attr['TOC-ODD-HEADER-VALUE'])=='OFF')) { $this->m_TOC[$toc_id]['TOC_odd_header_value'] = -1; } + if (isset($attr['TOC-EVEN-HEADER-VALUE']) && ($attr['TOC-EVEN-HEADER-VALUE']=='1' || strtoupper($attr['TOC-EVEN-HEADER-VALUE'])=='ON')) { $this->m_TOC[$toc_id]['TOC_even_header_value'] = 1; } + else if (isset($attr['TOC-EVEN-HEADER-VALUE']) && ($attr['TOC-EVEN-HEADER-VALUE']=='-1' || strtoupper($attr['TOC-EVEN-HEADER-VALUE'])=='OFF')) { $this->m_TOC[$toc_id]['TOC_even_header_value'] = -1; } + if (isset($attr['TOC-ODD-FOOTER-VALUE']) && ($attr['TOC-ODD-FOOTER-VALUE']=='1' || strtoupper($attr['TOC-ODD-FOOTER-VALUE'])=='ON')) { $this->m_TOC[$toc_id]['TOC_odd_footer_value'] = 1; } + else if (isset($attr['TOC-ODD-FOOTER-VALUE']) && ($attr['TOC-ODD-FOOTER-VALUE']=='-1' || strtoupper($attr['TOC-ODD-FOOTER-VALUE'])=='OFF')) { $this->m_TOC[$toc_id]['TOC_odd_footer_value'] = -1; } + if (isset($attr['TOC-EVEN-FOOTER-VALUE']) && ($attr['TOC-EVEN-FOOTER-VALUE']=='1' || strtoupper($attr['TOC-EVEN-FOOTER-VALUE'])=='ON')) { $this->m_TOC[$toc_id]['TOC_even_footer_value'] = 1; } + else if (isset($attr['TOC-EVEN-FOOTER-VALUE']) && ($attr['TOC-EVEN-FOOTER-VALUE']=='-1' || strtoupper($attr['TOC-EVEN-FOOTER-VALUE'])=='OFF')) { $this->m_TOC[$toc_id]['TOC_even_footer_value'] = -1; } + if (isset($attr['TOC-PAGE-SELECTOR']) && $attr['TOC-PAGE-SELECTOR']) { $this->m_TOC[$toc_id]['TOC_page_selector'] = $attr['TOC-PAGE-SELECTOR']; } + else { $this->m_TOC[$toc_id]['TOC_page_selector'] = ''; } + if (isset($attr['TOC-SHEET-SIZE']) && $attr['TOC-SHEET-SIZE']) { $this->m_TOC[$toc_id]['TOCsheetsize'] = $attr['TOC-SHEET-SIZE']; } else { $this->m_TOC[$toc_id]['TOCsheetsize'] = ''; } + + + if (isset($attr['TOC-PREHTML']) && $attr['TOC-PREHTML']) { $this->m_TOC[$toc_id]['TOCpreHTML'] = htmlspecialchars_decode($attr['TOC-PREHTML'],ENT_QUOTES); } + if (isset($attr['TOC-POSTHTML']) && $attr['TOC-POSTHTML']) { $this->m_TOC[$toc_id]['TOCpostHTML'] = htmlspecialchars_decode($attr['TOC-POSTHTML'],ENT_QUOTES); } + + if (isset($attr['TOC-BOOKMARKTEXT']) && $attr['TOC-BOOKMARKTEXT']) { $this->m_TOC[$toc_id]['TOCbookmarkText'] = htmlspecialchars_decode($attr['TOC-BOOKMARKTEXT'],ENT_QUOTES); } // *BOOKMARKS* + } + else { + if (isset($attr['OUTDENT']) && $attr['OUTDENT']) { $this->TOCoutdent = $attr['OUTDENT']; } else { $this->TOCoutdent = ''; } // mPDF 5.6.19 + if (isset($attr['TOC-ORIENTATION']) && $attr['TOC-ORIENTATION']) { $this->TOCorientation = $attr['TOC-ORIENTATION']; } else { $this->TOCorientation = ''; } + if (isset($attr['PAGING']) && (strtoupper($attr['PAGING'])=='OFF' || $attr['PAGING']==='0')) { $this->TOCusePaging = false; } + else { $this->TOCusePaging = true; } + if (isset($attr['LINKS']) && (strtoupper($attr['LINKS'])=='ON' || $attr['LINKS']==1)) { $this->TOCuseLinking = true; } + else { $this->TOCuseLinking = false; } + + $this->TOC_margin_left = $this->TOC_margin_right = $this->TOC_margin_top = $this->TOC_margin_bottom = $this->TOC_margin_header = $this->TOC_margin_footer = ''; + if (isset($attr['TOC-MARGIN-RIGHT'])) { $this->TOC_margin_right = $this->mpdf->ConvertSize($attr['TOC-MARGIN-RIGHT'],$this->mpdf->w,$this->mpdf->FontSize,false); } + if (isset($attr['TOC-MARGIN-LEFT'])) { $this->TOC_margin_left = $this->mpdf->ConvertSize($attr['TOC-MARGIN-LEFT'],$this->mpdf->w,$this->mpdf->FontSize,false); } + if (isset($attr['TOC-MARGIN-TOP'])) { $this->TOC_margin_top = $this->mpdf->ConvertSize($attr['TOC-MARGIN-TOP'],$this->mpdf->w,$this->mpdf->FontSize,false); } + if (isset($attr['TOC-MARGIN-BOTTOM'])) { $this->TOC_margin_bottom = $this->mpdf->ConvertSize($attr['TOC-MARGIN-BOTTOM'],$this->mpdf->w,$this->mpdf->FontSize,false); } + if (isset($attr['TOC-MARGIN-HEADER'])) { $this->TOC_margin_header = $this->mpdf->ConvertSize($attr['TOC-MARGIN-HEADER'],$this->mpdf->w,$this->mpdf->FontSize,false); } + if (isset($attr['TOC-MARGIN-FOOTER'])) { $this->TOC_margin_footer = $this->mpdf->ConvertSize($attr['TOC-MARGIN-FOOTER'],$this->mpdf->w,$this->mpdf->FontSize,false); } + $this->TOC_odd_header_name = $this->TOC_even_header_name = $this->TOC_odd_footer_name = $this->TOC_even_footer_name = ''; + if (isset($attr['TOC-ODD-HEADER-NAME']) && $attr['TOC-ODD-HEADER-NAME']) { $this->TOC_odd_header_name = $attr['TOC-ODD-HEADER-NAME']; } + if (isset($attr['TOC-EVEN-HEADER-NAME']) && $attr['TOC-EVEN-HEADER-NAME']) { $this->TOC_even_header_name = $attr['TOC-EVEN-HEADER-NAME']; } + if (isset($attr['TOC-ODD-FOOTER-NAME']) && $attr['TOC-ODD-FOOTER-NAME']) { $this->TOC_odd_footer_name = $attr['TOC-ODD-FOOTER-NAME']; } + if (isset($attr['TOC-EVEN-FOOTER-NAME']) && $attr['TOC-EVEN-FOOTER-NAME']) { $this->TOC_even_footer_name = $attr['TOC-EVEN-FOOTER-NAME']; } + $this->TOC_odd_header_value = $this->TOC_even_header_value = $this->TOC_odd_footer_value = $this->TOC_even_footer_value = 0; + if (isset($attr['TOC-ODD-HEADER-VALUE']) && ($attr['TOC-ODD-HEADER-VALUE']=='1' || strtoupper($attr['TOC-ODD-HEADER-VALUE'])=='ON')) { $this->TOC_odd_header_value = 1; } + else if (isset($attr['TOC-ODD-HEADER-VALUE']) && ($attr['TOC-ODD-HEADER-VALUE']=='-1' || strtoupper($attr['TOC-ODD-HEADER-VALUE'])=='OFF')) { $this->TOC_odd_header_value = -1; } + if (isset($attr['TOC-EVEN-HEADER-VALUE']) && ($attr['TOC-EVEN-HEADER-VALUE']=='1' || strtoupper($attr['TOC-EVEN-HEADER-VALUE'])=='ON')) { $this->TOC_even_header_value = 1; } + else if (isset($attr['TOC-EVEN-HEADER-VALUE']) && ($attr['TOC-EVEN-HEADER-VALUE']=='-1' || strtoupper($attr['TOC-EVEN-HEADER-VALUE'])=='OFF')) { $this->TOC_even_header_value = -1; } + + if (isset($attr['TOC-ODD-FOOTER-VALUE']) && ($attr['TOC-ODD-FOOTER-VALUE']=='1' || strtoupper($attr['TOC-ODD-FOOTER-VALUE'])=='ON')) { $this->TOC_odd_footer_value = 1; } + else if (isset($attr['TOC-ODD-FOOTER-VALUE']) && ($attr['TOC-ODD-FOOTER-VALUE']=='-1' || strtoupper($attr['TOC-ODD-FOOTER-VALUE'])=='OFF')) { $this->TOC_odd_footer_value = -1; } + if (isset($attr['TOC-EVEN-FOOTER-VALUE']) && ($attr['TOC-EVEN-FOOTER-VALUE']=='1' || strtoupper($attr['TOC-EVEN-FOOTER-VALUE'])=='ON')) { $this->TOC_even_footer_value = 1; } + else if (isset($attr['TOC-EVEN-FOOTER-VALUE']) && ($attr['TOC-EVEN-FOOTER-VALUE']=='-1' || strtoupper($attr['TOC-EVEN-FOOTER-VALUE'])=='OFF')) { $this->TOC_even_footer_value = -1; } + if (isset($attr['TOC-PAGE-SELECTOR']) && $attr['TOC-PAGE-SELECTOR']) { $this->TOC_page_selector = $attr['TOC-PAGE-SELECTOR']; } + else { $this->TOC_page_selector = ''; } + if (isset($attr['TOC-SHEET-SIZE']) && $attr['TOC-SHEET-SIZE']) { $this->TOCsheetsize = $attr['TOC-SHEET-SIZE']; } else { $this->TOCsheetsize = ''; } + + if (isset($attr['TOC-PREHTML']) && $attr['TOC-PREHTML']) { $this->TOCpreHTML = htmlspecialchars_decode($attr['TOC-PREHTML'],ENT_QUOTES); } + if (isset($attr['TOC-POSTHTML']) && $attr['TOC-POSTHTML']) { $this->TOCpostHTML = htmlspecialchars_decode($attr['TOC-POSTHTML'],ENT_QUOTES); } + if (isset($attr['TOC-BOOKMARKTEXT']) && $attr['TOC-BOOKMARKTEXT']) { $this->TOCbookmarkText = htmlspecialchars_decode($attr['TOC-BOOKMARKTEXT'],ENT_QUOTES); } + } + + if ($this->mpdf->y == $this->mpdf->tMargin && (!$this->mpdf->mirrorMargins ||($this->mpdf->mirrorMargins && $this->mpdf->page % 2==1))) { + if ($toc_id) { $this->m_TOC[$toc_id]['TOCmark'] = $this->mpdf->page; } + else { $this->TOCmark = $this->mpdf->page; } + // Don't add a page + if ($this->mpdf->page==1 && count($this->mpdf->PageNumSubstitutions)==0) { + $resetpagenum = ''; + $pagenumstyle = ''; + $suppress = ''; + if (isset($attr['RESETPAGENUM'])) { $resetpagenum = $attr['RESETPAGENUM']; } + if (isset($attr['PAGENUMSTYLE'])) { $pagenumstyle = $attr['PAGENUMSTYLE']; } + if (isset($attr['SUPPRESS'])) { $suppress = $attr['SUPPRESS']; } + if (!$suppress) { $suppress = 'off'; } + if (!$resetpagenum) { $resetpagenum= 1; } + $this->mpdf->PageNumSubstitutions[] = array('from'=>1, 'reset'=> $resetpagenum, 'type'=>$pagenumstyle, 'suppress'=> $suppress); + } + return array(true, $toc_id); + } + // No break - continues as PAGEBREAK... + return array(false, $toc_id); +} + + +} + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/classes/ttfontsuni.php b/application/third_party/mpdf/classes/ttfontsuni.php new file mode 100644 index 0000000..f639b00 --- /dev/null +++ b/application/third_party/mpdf/classes/ttfontsuni.php @@ -0,0 +1,2065 @@ +<?php + +/******************************************************************************* +* TTFontFile class * +* * +* Version: 2.01 * +* Date: 2012-02-25 * +* Author: Ian Back <ianb@bpm1.com> * +* License: LGPL * +* Copyright (c) Ian Back, 2010 * +* This class is based on The ReportLab Open Source PDF library * +* written in Python - http://www.reportlab.com/software/opensource/ * +* together with ideas from the OpenOffice source code and others. * +* This header must be retained in any redistribution or * +* modification of the file. * +* * +*******************************************************************************/ + +// Define the value used in the "head" table of a created TTF file +// 0x74727565 "true" for Mac +// 0x00010000 for Windows +// Either seems to work for a font embedded in a PDF file +// when read by Adobe Reader on a Windows PC(!) +if (!defined('_TTF_MAC_HEADER')) define("_TTF_MAC_HEADER", false); + +// Recalculate correct metadata/profiles when making subset fonts (not SIP/SMP) +// e.g. xMin, xMax, maxNContours +if (!defined('_RECALC_PROFILE')) define("_RECALC_PROFILE", false); + +// TrueType Font Glyph operators +define("GF_WORDS",(1 << 0)); +define("GF_SCALE",(1 << 3)); +define("GF_MORE",(1 << 5)); +define("GF_XYSCALE",(1 << 6)); +define("GF_TWOBYTWO",(1 << 7)); + + + +class TTFontFile { + +var $unAGlyphs; // mPDF 5.4.05 +var $panose; +var $maxUni; +var $sFamilyClass; +var $sFamilySubClass; +var $sipset; +var $smpset; +var $_pos; +var $numTables; +var $searchRange; +var $entrySelector; +var $rangeShift; +var $tables; +var $otables; +var $filename; +var $fh; +var $glyphPos; +var $charToGlyph; +var $ascent; +var $descent; +var $name; +var $familyName; +var $styleName; +var $fullName; +var $uniqueFontID; +var $unitsPerEm; +var $bbox; +var $capHeight; +var $stemV; +var $italicAngle; +var $flags; +var $underlinePosition; +var $underlineThickness; +var $charWidths; +var $defaultWidth; +var $maxStrLenRead; +var $numTTCFonts; +var $TTCFonts; +var $maxUniChar; +var $kerninfo; + + function TTFontFile() { + $this->maxStrLenRead = 200000; // Maximum size of glyf table to read in as string (otherwise reads each glyph from file) + } + + + function getMetrics($file, $TTCfontID=0, $debug=false, $BMPonly=false, $kerninfo=false, $unAGlyphs=false) { // mPDF 5.4.05 + $this->unAGlyphs = $unAGlyphs; // mPDF 5.4.05 + $this->filename = $file; + $this->fh = fopen($file,'rb') or die('Can\'t open file ' . $file); + $this->_pos = 0; + $this->charWidths = ''; + $this->glyphPos = array(); + $this->charToGlyph = array(); + $this->tables = array(); + $this->otables = array(); + $this->kerninfo = array(); + $this->ascent = 0; + $this->descent = 0; + $this->numTTCFonts = 0; + $this->TTCFonts = array(); + $this->version = $version = $this->read_ulong(); + $this->panose = array(); + if ($version==0x4F54544F) + die("Postscript outlines are not supported"); + if ($version==0x74746366 && !$TTCfontID) + die("ERROR - You must define the TTCfontID for a TrueType Collection in config_fonts.php (". $file.")"); + if (!in_array($version, array(0x00010000,0x74727565)) && !$TTCfontID) + die("Not a TrueType font: version=".$version); + if ($TTCfontID > 0) { + $this->version = $version = $this->read_ulong(); // TTC Header version now + if (!in_array($version, array(0x00010000,0x00020000))) + die("ERROR - Error parsing TrueType Collection: version=".$version." - " . $file); + $this->numTTCFonts = $this->read_ulong(); + for ($i=1; $i<=$this->numTTCFonts; $i++) { + $this->TTCFonts[$i]['offset'] = $this->read_ulong(); + } + $this->seek($this->TTCFonts[$TTCfontID]['offset']); + $this->version = $version = $this->read_ulong(); // TTFont version again now + } + $this->readTableDirectory($debug); + $this->extractInfo($debug, $BMPonly, $kerninfo); + fclose($this->fh); + } + + + function readTableDirectory($debug=false) { + $this->numTables = $this->read_ushort(); + $this->searchRange = $this->read_ushort(); + $this->entrySelector = $this->read_ushort(); + $this->rangeShift = $this->read_ushort(); + $this->tables = array(); + for ($i=0;$i<$this->numTables;$i++) { + $record = array(); + $record['tag'] = $this->read_tag(); + $record['checksum'] = array($this->read_ushort(),$this->read_ushort()); + $record['offset'] = $this->read_ulong(); + $record['length'] = $this->read_ulong(); + $this->tables[$record['tag']] = $record; + } + if ($debug) $this->checksumTables(); + } + + function checksumTables() { + // Check the checksums for all tables + foreach($this->tables AS $t) { + if ($t['length'] > 0 && $t['length'] < $this->maxStrLenRead) { // 1.02 + $table = $this->get_chunk($t['offset'], $t['length']); + $checksum = $this->calcChecksum($table); + if ($t['tag'] == 'head') { + $up = unpack('n*', substr($table,8,4)); + $adjustment[0] = $up[1]; + $adjustment[1] = $up[2]; + $checksum = $this->sub32($checksum, $adjustment); + } + $xchecksum = $t['checksum']; + if ($xchecksum != $checksum) + die(sprintf('TTF file "%s": invalid checksum %s table: %s (expected %s)', $this->filename,dechex($checksum[0]).dechex($checksum[1]),$t['tag'],dechex($xchecksum[0]).dechex($xchecksum[1]))); + } + } + } + + function sub32($x, $y) { + $xlo = $x[1]; + $xhi = $x[0]; + $ylo = $y[1]; + $yhi = $y[0]; + if ($ylo > $xlo) { $xlo += 1 << 16; $yhi += 1; } + $reslo = $xlo-$ylo; + if ($yhi > $xhi) { $xhi += 1 << 16; } + $reshi = $xhi-$yhi; + $reshi = $reshi & 0xFFFF; + return array($reshi, $reslo); + } + + function calcChecksum($data) { + if (strlen($data) % 4) { $data .= str_repeat("\0",(4-(strlen($data) % 4))); } + $len = strlen($data); + $hi=0x0000; + $lo=0x0000; + for($i=0;$i<$len;$i+=4) { + $hi += (ord($data[$i])<<8) + ord($data[$i+1]); + $lo += (ord($data[$i+2])<<8) + ord($data[$i+3]); + $hi += ($lo >> 16) & 0xFFFF; + $lo = $lo & 0xFFFF; + } + return array($hi, $lo); + } + + function get_table_pos($tag) { + $offset = $this->tables[$tag]['offset']; + $length = $this->tables[$tag]['length']; + return array($offset, $length); + } + + function seek($pos) { + $this->_pos = $pos; + fseek($this->fh,$this->_pos); + } + + function skip($delta) { + $this->_pos = $this->_pos + $delta; + fseek($this->fh,$delta,SEEK_CUR); + } + + function seek_table($tag, $offset_in_table = 0) { + $tpos = $this->get_table_pos($tag); + $this->_pos = $tpos[0] + $offset_in_table; + fseek($this->fh, $this->_pos); + return $this->_pos; + } + + function read_tag() { + $this->_pos += 4; + return fread($this->fh,4); + } + + function read_short() { + $this->_pos += 2; + $s = fread($this->fh,2); + $a = (ord($s[0])<<8) + ord($s[1]); + if ($a & (1 << 15) ) { + $a = ($a - (1 << 16)); + } + return $a; + } + + function unpack_short($s) { + $a = (ord($s[0])<<8) + ord($s[1]); + if ($a & (1 << 15) ) { + $a = ($a - (1 << 16)); + } + return $a; + } + + function read_ushort() { + $this->_pos += 2; + $s = fread($this->fh,2); + return (ord($s[0])<<8) + ord($s[1]); + } + + function read_ulong() { + $this->_pos += 4; + $s = fread($this->fh,4); + // if large uInt32 as an integer, PHP converts it to -ve + return (ord($s[0])*16777216) + (ord($s[1])<<16) + (ord($s[2])<<8) + ord($s[3]); // 16777216 = 1<<24 + } + + function get_ushort($pos) { + fseek($this->fh,$pos); + $s = fread($this->fh,2); + return (ord($s[0])<<8) + ord($s[1]); + } + + function get_ulong($pos) { + fseek($this->fh,$pos); + $s = fread($this->fh,4); + // iF large uInt32 as an integer, PHP converts it to -ve + return (ord($s[0])*16777216) + (ord($s[1])<<16) + (ord($s[2])<<8) + ord($s[3]); // 16777216 = 1<<24 + } + + function pack_short($val) { + if ($val<0) { + $val = abs($val); + $val = ~$val; + $val += 1; + } + return pack("n",$val); + } + + function splice($stream, $offset, $value) { + return substr($stream,0,$offset) . $value . substr($stream,$offset+strlen($value)); + } + + function _set_ushort($stream, $offset, $value) { + $up = pack("n", $value); + return $this->splice($stream, $offset, $up); + } + + function _set_short($stream, $offset, $val) { + if ($val<0) { + $val = abs($val); + $val = ~$val; + $val += 1; + } + $up = pack("n",$val); + return $this->splice($stream, $offset, $up); + } + + function get_chunk($pos, $length) { + fseek($this->fh,$pos); + if ($length <1) { return ''; } + return (fread($this->fh,$length)); + } + + function get_table($tag) { + list($pos, $length) = $this->get_table_pos($tag); + if ($length == 0) { return ''; } + fseek($this->fh,$pos); + return (fread($this->fh,$length)); + } + + function add($tag, $data) { + if ($tag == 'head') { + $data = $this->splice($data, 8, "\0\0\0\0"); + } + $this->otables[$tag] = $data; + } + + + +///////////////////////////////////////////////////////////////////////////////////////// + function getCTG($file, $TTCfontID=0, $debug=false, $unAGlyphs=false) { // mPDF 5.4.05 + $this->unAGlyphs = $unAGlyphs; // mPDF 5.4.05 + $this->filename = $file; + $this->fh = fopen($file,'rb') or die('Can\'t open file ' . $file); + $this->_pos = 0; + $this->charWidths = ''; + $this->glyphPos = array(); + $this->charToGlyph = array(); + $this->tables = array(); + $this->numTTCFonts = 0; + $this->TTCFonts = array(); + $this->skip(4); + if ($TTCfontID > 0) { + $this->version = $version = $this->read_ulong(); // TTC Header version now + if (!in_array($version, array(0x00010000,0x00020000))) + die("ERROR - Error parsing TrueType Collection: version=".$version." - " . $file); + $this->numTTCFonts = $this->read_ulong(); + for ($i=1; $i<=$this->numTTCFonts; $i++) { + $this->TTCFonts[$i]['offset'] = $this->read_ulong(); + } + $this->seek($this->TTCFonts[$TTCfontID]['offset']); + $this->version = $version = $this->read_ulong(); // TTFont version again now + } + $this->readTableDirectory($debug); + + + // cmap - Character to glyph index mapping table + $cmap_offset = $this->seek_table("cmap"); + $this->skip(2); + $cmapTableCount = $this->read_ushort(); + $unicode_cmap_offset = 0; + for ($i=0;$i<$cmapTableCount;$i++) { + $platformID = $this->read_ushort(); + $encodingID = $this->read_ushort(); + $offset = $this->read_ulong(); + $save_pos = $this->_pos; + if ($platformID == 3 && $encodingID == 1) { // Microsoft, Unicode + $format = $this->get_ushort($cmap_offset + $offset); + if ($format == 4) { + $unicode_cmap_offset = $cmap_offset + $offset; + break; + } + } + else if ($platformID == 0) { // Unicode -- assume all encodings are compatible + $format = $this->get_ushort($cmap_offset + $offset); + if ($format == 4) { + $unicode_cmap_offset = $cmap_offset + $offset; + break; + } + } + $this->seek($save_pos ); + } + + $glyphToChar = array(); + $charToGlyph = array(); + $this->getCMAP4($unicode_cmap_offset, $glyphToChar, $charToGlyph ); + + fclose($this->fh); + return ($charToGlyph); + } + +///////////////////////////////////////////////////////////////////////////////////////// + function getTTCFonts($file) { + $this->filename = $file; + $this->fh = fopen($file,'rb'); + if (!$this->fh) { return ('ERROR - Can\'t open file ' . $file); } + $this->numTTCFonts = 0; + $this->TTCFonts = array(); + $this->version = $version = $this->read_ulong(); + if ($version==0x74746366) { + $this->version = $version = $this->read_ulong(); // TTC Header version now + if (!in_array($version, array(0x00010000,0x00020000))) + return("ERROR - Error parsing TrueType Collection: version=".$version." - " . $file); + } + else { + return("ERROR - Not a TrueType Collection: version=".$version." - " . $file); + } + $this->numTTCFonts = $this->read_ulong(); + for ($i=1; $i<=$this->numTTCFonts; $i++) { + $this->TTCFonts[$i]['offset'] = $this->read_ulong(); + } + } + + + +///////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////// + + function extractInfo($debug=false, $BMPonly=false, $kerninfo=false) { + $this->panose = array(); + $this->sFamilyClass = 0; + $this->sFamilySubClass = 0; + /////////////////////////////////// + // name - Naming table + /////////////////////////////////// + $name_offset = $this->seek_table("name"); + $format = $this->read_ushort(); + if ($format != 0 && $format != 1) + die("Unknown name table format ".$format); + $numRecords = $this->read_ushort(); + $string_data_offset = $name_offset + $this->read_ushort(); + $names = array(1=>'',2=>'',3=>'',4=>'',6=>''); + $K = array_keys($names); + $nameCount = count($names); + for ($i=0;$i<$numRecords; $i++) { + $platformId = $this->read_ushort(); + $encodingId = $this->read_ushort(); + $languageId = $this->read_ushort(); + $nameId = $this->read_ushort(); + $length = $this->read_ushort(); + $offset = $this->read_ushort(); + if (!in_array($nameId,$K)) continue; + $N = ''; + if ($platformId == 3 && $encodingId == 1 && $languageId == 0x409) { // Microsoft, Unicode, US English, PS Name + $opos = $this->_pos; + $this->seek($string_data_offset + $offset); + if ($length % 2 != 0) + die("PostScript name is UTF-16BE string of odd length"); + $length /= 2; + $N = ''; + while ($length > 0) { + $char = $this->read_ushort(); + $N .= (chr($char)); + $length -= 1; + } + $this->_pos = $opos; + $this->seek($opos); + } + else if ($platformId == 1 && $encodingId == 0 && $languageId == 0) { // Macintosh, Roman, English, PS Name + $opos = $this->_pos; + $N = $this->get_chunk($string_data_offset + $offset, $length); + $this->_pos = $opos; + $this->seek($opos); + } + if ($N && $names[$nameId]=='') { + $names[$nameId] = $N; + $nameCount -= 1; + if ($nameCount==0) break; + } + } + if ($names[6]) + $psName = $names[6]; + else if ($names[4]) + $psName = preg_replace('/ /','-',$names[4]); + else if ($names[1]) + $psName = preg_replace('/ /','-',$names[1]); + else + $psName = ''; + if (!$psName) + die("Could not find PostScript font name: ".$this->filename); + if ($debug) { + for ($i=0;$i<count($psName);$i++) { + $c = $psName[$i]; + $oc = ord($c); + if ($oc>126 || strpos(' [](){}<>/%',$c)!==false) + die("psName=".$psName." contains invalid character ".$c." ie U+".ord(c)); + } + } + $this->name = $psName; + if ($names[1]) { $this->familyName = $names[1]; } else { $this->familyName = $psName; } + if ($names[2]) { $this->styleName = $names[2]; } else { $this->styleName = 'Regular'; } + if ($names[4]) { $this->fullName = $names[4]; } else { $this->fullName = $psName; } + if ($names[3]) { $this->uniqueFontID = $names[3]; } else { $this->uniqueFontID = $psName; } + + if ($names[6]) { $this->fullName = $names[6]; } + + /////////////////////////////////// + // head - Font header table + /////////////////////////////////// + $this->seek_table("head"); + if ($debug) { + $ver_maj = $this->read_ushort(); + $ver_min = $this->read_ushort(); + if ($ver_maj != 1) + die('Unknown head table version '. $ver_maj .'.'. $ver_min); + $this->fontRevision = $this->read_ushort() . $this->read_ushort(); + + $this->skip(4); + $magic = $this->read_ulong(); + if ($magic != 0x5F0F3CF5) + die('Invalid head table magic ' .$magic); + $this->skip(2); + } + else { + $this->skip(18); + } + $this->unitsPerEm = $unitsPerEm = $this->read_ushort(); + $scale = 1000 / $unitsPerEm; + $this->skip(16); + $xMin = $this->read_short(); + $yMin = $this->read_short(); + $xMax = $this->read_short(); + $yMax = $this->read_short(); + $this->bbox = array(($xMin*$scale), ($yMin*$scale), ($xMax*$scale), ($yMax*$scale)); + $this->skip(3*2); + $indexToLocFormat = $this->read_ushort(); + $glyphDataFormat = $this->read_ushort(); + if ($glyphDataFormat != 0) + die('Unknown glyph data format '.$glyphDataFormat); + + /////////////////////////////////// + // hhea metrics table + /////////////////////////////////// + // ttf2t1 seems to use this value rather than the one in OS/2 - so put in for compatibility + if (isset($this->tables["hhea"])) { + $this->seek_table("hhea"); + $this->skip(4); + $hheaAscender = $this->read_short(); + $hheaDescender = $this->read_short(); + $this->ascent = ($hheaAscender *$scale); + $this->descent = ($hheaDescender *$scale); + } + + /////////////////////////////////// + // OS/2 - OS/2 and Windows metrics table + /////////////////////////////////// + if (isset($this->tables["OS/2"])) { + $this->seek_table("OS/2"); + $version = $this->read_ushort(); + $this->skip(2); + $usWeightClass = $this->read_ushort(); + $this->skip(2); + $fsType = $this->read_ushort(); + if ($fsType == 0x0002 || ($fsType & 0x0300) != 0) { + global $overrideTTFFontRestriction; + if (!$overrideTTFFontRestriction) die('ERROR - Font file '.$this->filename.' cannot be embedded due to copyright restrictions.'); + $this->restrictedUse = true; + } + $this->skip(20); + $sF = $this->read_short(); + $this->sFamilyClass = ($sF >> 8); + $this->sFamilySubClass = ($sF & 0xFF); + $this->_pos += 10; //PANOSE = 10 byte length + $panose = fread($this->fh,10); + $this->panose = array(); + for ($p=0;$p<strlen($panose);$p++) { $this->panose[] = ord($panose[$p]); } + $this->skip(26); + $sTypoAscender = $this->read_short(); + $sTypoDescender = $this->read_short(); + if (!$this->ascent) $this->ascent = ($sTypoAscender*$scale); + if (!$this->descent) $this->descent = ($sTypoDescender*$scale); + if ($version > 1) { + $this->skip(16); + $sCapHeight = $this->read_short(); + $this->capHeight = ($sCapHeight*$scale); + } + else { + $this->capHeight = $this->ascent; + } + } + else { + $usWeightClass = 500; + if (!$this->ascent) $this->ascent = ($yMax*$scale); + if (!$this->descent) $this->descent = ($yMin*$scale); + $this->capHeight = $this->ascent; + } + $this->stemV = 50 + intval(pow(($usWeightClass / 65.0),2)); + + /////////////////////////////////// + // post - PostScript table + /////////////////////////////////// + $this->seek_table("post"); + if ($debug) { + $ver_maj = $this->read_ushort(); + $ver_min = $this->read_ushort(); + if ($ver_maj <1 || $ver_maj >4) + die('Unknown post table version '.$ver_maj); + } + else { + $this->skip(4); + } + $this->italicAngle = $this->read_short() + $this->read_ushort() / 65536.0; + $this->underlinePosition = $this->read_short() * $scale; + $this->underlineThickness = $this->read_short() * $scale; + $isFixedPitch = $this->read_ulong(); + + $this->flags = 4; + + if ($this->italicAngle!= 0) + $this->flags = $this->flags | 64; + if ($usWeightClass >= 600) + $this->flags = $this->flags | 262144; + if ($isFixedPitch) + $this->flags = $this->flags | 1; + + /////////////////////////////////// + // hhea - Horizontal header table + /////////////////////////////////// + $this->seek_table("hhea"); + if ($debug) { + $ver_maj = $this->read_ushort(); + $ver_min = $this->read_ushort(); + if ($ver_maj != 1) + die('Unknown hhea table version '.$ver_maj); + $this->skip(28); + } + else { + $this->skip(32); + } + $metricDataFormat = $this->read_ushort(); + if ($metricDataFormat != 0) + die('Unknown horizontal metric data format '.$metricDataFormat); + $numberOfHMetrics = $this->read_ushort(); + if ($numberOfHMetrics == 0) + die('Number of horizontal metrics is 0'); + + /////////////////////////////////// + // maxp - Maximum profile table + /////////////////////////////////// + $this->seek_table("maxp"); + if ($debug) { + $ver_maj = $this->read_ushort(); + $ver_min = $this->read_ushort(); + if ($ver_maj != 1) + die('Unknown maxp table version '.$ver_maj); + } + else { + $this->skip(4); + } + $numGlyphs = $this->read_ushort(); + + + /////////////////////////////////// + // cmap - Character to glyph index mapping table + /////////////////////////////////// + $cmap_offset = $this->seek_table("cmap"); + $this->skip(2); + $cmapTableCount = $this->read_ushort(); + $unicode_cmap_offset = 0; + for ($i=0;$i<$cmapTableCount;$i++) { + $platformID = $this->read_ushort(); + $encodingID = $this->read_ushort(); + $offset = $this->read_ulong(); + $save_pos = $this->_pos; + if (($platformID == 3 && $encodingID == 1) || $platformID == 0) { // Microsoft, Unicode + $format = $this->get_ushort($cmap_offset + $offset); + if ($format == 4) { + if (!$unicode_cmap_offset) $unicode_cmap_offset = $cmap_offset + $offset; + if ($BMPonly) break; + } + } + // Microsoft, Unicode Format 12 table HKCS + else if ((($platformID == 3 && $encodingID == 10) || $platformID == 0) && !$BMPonly) { + $format = $this->get_ushort($cmap_offset + $offset); + if ($format == 12) { + $unicode_cmap_offset = $cmap_offset + $offset; + break; + } + } + $this->seek($save_pos ); + } + if (!$unicode_cmap_offset) + die('Font ('.$this->filename .') does not have cmap for Unicode (platform 3, encoding 1, format 4, or platform 0, any encoding, format 4)'); + + + $sipset = false; + $smpset = false; + // Format 12 CMAP does characters above Unicode BMP i.e. some HKCS characters U+20000 and above + if ($format == 12 && !$BMPonly) { + $this->maxUniChar = 0; + $this->seek($unicode_cmap_offset + 4); + $length = $this->read_ulong(); + $limit = $unicode_cmap_offset + $length; + $this->skip(4); + + $nGroups = $this->read_ulong(); + + $glyphToChar = array(); + $charToGlyph = array(); + for($i=0; $i<$nGroups ; $i++) { + $startCharCode = $this->read_ulong(); + $endCharCode = $this->read_ulong(); + $startGlyphCode = $this->read_ulong(); + if (($endCharCode > 0x20000 && $endCharCode < 0x2A6DF) || ($endCharCode > 0x2F800 && $endCharCode < 0x2FA1F)) { + $sipset = true; + } + else if ($endCharCode > 0x10000 && $endCharCode < 0x1FFFF) { + $smpset = true; + } + $offset = 0; + for ($unichar=$startCharCode;$unichar<=$endCharCode;$unichar++) { + $glyph = $startGlyphCode + $offset ; + $offset++; + $charToGlyph[$unichar] = $glyph; + if ($unichar < 196608) { $this->maxUniChar = max($unichar,$this->maxUniChar); } + $glyphToChar[$glyph][] = $unichar; + } + } + } + else { + + $glyphToChar = array(); + $charToGlyph = array(); + $this->getCMAP4($unicode_cmap_offset, $glyphToChar, $charToGlyph ); + + } + $this->sipset = $sipset ; + $this->smpset = $smpset ; + + /////////////////////////////////// + // hmtx - Horizontal metrics table + /////////////////////////////////// + $this->getHMTX($numberOfHMetrics, $numGlyphs, $glyphToChar, $scale); + + /////////////////////////////////// + // kern - Kerning pair table + /////////////////////////////////// + if ($kerninfo) { + // Recognises old form of Kerning table - as required by Windows - Format 0 only + $kern_offset = $this->seek_table("kern"); + $version = $this->read_ushort(); + $nTables = $this->read_ushort(); + // subtable header + $sversion = $this->read_ushort(); + $slength = $this->read_ushort(); + $scoverage = $this->read_ushort(); + $format = $scoverage >> 8; + if ($kern_offset && $version==0 && $format==0) { + // Format 0 + $nPairs = $this->read_ushort(); + $this->skip(6); + for ($i=0; $i<$nPairs; $i++) { + $left = $this->read_ushort(); + $right = $this->read_ushort(); + $val = $this->read_short(); + if (count($glyphToChar[$left])==1 && count($glyphToChar[$right])==1) { + if ($left != 32 && $right != 32) { + $this->kerninfo[$glyphToChar[$left][0]][$glyphToChar[$right][0]] = intval($val*$scale); + } + } + } + } + } + } + + +///////////////////////////////////////////////////////////////////////////////////////// + + + function makeSubset($file, &$subset, $TTCfontID=0, $debug=false, $unAGlyphs=false) { // mPDF 5.4.05 + $this->unAGlyphs = $unAGlyphs; // mPDF 5.4.05 + $this->filename = $file; + $this->fh = fopen($file ,'rb') or die('Can\'t open file ' . $file); + $this->_pos = 0; + $this->charWidths = ''; + $this->glyphPos = array(); + $this->charToGlyph = array(); + $this->tables = array(); + $this->otables = array(); + $this->ascent = 0; + $this->descent = 0; + $this->numTTCFonts = 0; + $this->TTCFonts = array(); + $this->skip(4); + $this->maxUni = 0; + if ($TTCfontID > 0) { + $this->version = $version = $this->read_ulong(); // TTC Header version now + if (!in_array($version, array(0x00010000,0x00020000))) + die("ERROR - Error parsing TrueType Collection: version=".$version." - " . $file); + $this->numTTCFonts = $this->read_ulong(); + for ($i=1; $i<=$this->numTTCFonts; $i++) { + $this->TTCFonts[$i]['offset'] = $this->read_ulong(); + } + $this->seek($this->TTCFonts[$TTCfontID]['offset']); + $this->version = $version = $this->read_ulong(); // TTFont version again now + } + $this->readTableDirectory($debug); + + /////////////////////////////////// + // head - Font header table + /////////////////////////////////// + $this->seek_table("head"); + $this->skip(50); + $indexToLocFormat = $this->read_ushort(); + $glyphDataFormat = $this->read_ushort(); + + /////////////////////////////////// + // hhea - Horizontal header table + /////////////////////////////////// + $this->seek_table("hhea"); + $this->skip(32); + $metricDataFormat = $this->read_ushort(); + $orignHmetrics = $numberOfHMetrics = $this->read_ushort(); + + /////////////////////////////////// + // maxp - Maximum profile table + /////////////////////////////////// + $this->seek_table("maxp"); + $this->skip(4); + $numGlyphs = $this->read_ushort(); + + + /////////////////////////////////// + // cmap - Character to glyph index mapping table + /////////////////////////////////// + $cmap_offset = $this->seek_table("cmap"); + $this->skip(2); + $cmapTableCount = $this->read_ushort(); + $unicode_cmap_offset = 0; + for ($i=0;$i<$cmapTableCount;$i++) { + $platformID = $this->read_ushort(); + $encodingID = $this->read_ushort(); + $offset = $this->read_ulong(); + $save_pos = $this->_pos; + if (($platformID == 3 && $encodingID == 1) || $platformID == 0) { // Microsoft, Unicode + $format = $this->get_ushort($cmap_offset + $offset); + if ($format == 4) { + $unicode_cmap_offset = $cmap_offset + $offset; + break; + } + } + $this->seek($save_pos ); + } + + if (!$unicode_cmap_offset) + die('Font ('.$this->filename .') does not have Unicode cmap (platform 3, encoding 1, format 4, or platform 0 [any encoding] format 4)'); + + + $glyphToChar = array(); + $charToGlyph = array(); + $this->getCMAP4($unicode_cmap_offset, $glyphToChar, $charToGlyph ); + + $this->charToGlyph = $charToGlyph; + + + /////////////////////////////////// + // hmtx - Horizontal metrics table + /////////////////////////////////// + $scale = 1; // not used + $this->getHMTX($numberOfHMetrics, $numGlyphs, $glyphToChar, $scale); + + /////////////////////////////////// + // loca - Index to location + /////////////////////////////////// + $this->getLOCA($indexToLocFormat, $numGlyphs); + + $subsetglyphs = array(0=>0, 1=>1, 2=>2); + $subsetCharToGlyph = array(); + foreach($subset AS $code) { + if (isset($this->charToGlyph[$code])) { + $subsetglyphs[$this->charToGlyph[$code]] = $code; // Old Glyph ID => Unicode + $subsetCharToGlyph[$code] = $this->charToGlyph[$code]; // Unicode to old GlyphID + + } + $this->maxUni = max($this->maxUni, $code); + } + + list($start,$dummy) = $this->get_table_pos('glyf'); + + $glyphSet = array(); + ksort($subsetglyphs); + $n = 0; + $fsLastCharIndex = 0; // maximum Unicode index (character code) in this font, according to the cmap subtable for platform ID 3 and platform- specific encoding ID 0 or 1. + foreach($subsetglyphs AS $originalGlyphIdx => $uni) { + $fsLastCharIndex = max($fsLastCharIndex , $uni); + $glyphSet[$originalGlyphIdx] = $n; // old glyphID to new glyphID + $n++; + } + + ksort($subsetCharToGlyph); + foreach($subsetCharToGlyph AS $uni => $originalGlyphIdx) { + $codeToGlyph[$uni] = $glyphSet[$originalGlyphIdx] ; + } + $this->codeToGlyph = $codeToGlyph; + + ksort($subsetglyphs); + foreach($subsetglyphs AS $originalGlyphIdx => $uni) { + $this->getGlyphs($originalGlyphIdx, $start, $glyphSet, $subsetglyphs); + } + + $numGlyphs = $numberOfHMetrics = count($subsetglyphs ); + + /////////////////////////////////// + // name - table copied from the original + /////////////////////////////////// + $this->add('name', $this->get_table('name')); + + /////////////////////////////////// + //tables copied from the original + /////////////////////////////////// + $tags = array ('cvt ', 'fpgm', 'prep', 'gasp'); + foreach($tags AS $tag) { + if (isset($this->tables[$tag])) { $this->add($tag, $this->get_table($tag)); } + } + + /////////////////////////////////// + // post - PostScript + /////////////////////////////////// + if (isset($this->tables['post'])) { + $opost = $this->get_table('post'); + $post = "\x00\x03\x00\x00" . substr($opost,4,12) . "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; + $this->add('post', $post); + } + + /////////////////////////////////// + // Sort CID2GID map into segments of contiguous codes + /////////////////////////////////// + ksort($codeToGlyph); + unset($codeToGlyph[0]); + //unset($codeToGlyph[65535]); + $rangeid = 0; + $range = array(); + $prevcid = -2; + $prevglidx = -1; + // for each character + foreach ($codeToGlyph as $cid => $glidx) { + if ($cid == ($prevcid + 1) && $glidx == ($prevglidx + 1)) { + $range[$rangeid][] = $glidx; + } else { + // new range + $rangeid = $cid; + $range[$rangeid] = array(); + $range[$rangeid][] = $glidx; + } + $prevcid = $cid; + $prevglidx = $glidx; + } + + + + /////////////////////////////////// + // CMap table + /////////////////////////////////// + // cmap - Character to glyph mapping + $segCount = count($range) + 1; // + 1 Last segment has missing character 0xFFFF + $searchRange = 1; + $entrySelector = 0; + while ($searchRange * 2 <= $segCount ) { + $searchRange = $searchRange * 2; + $entrySelector = $entrySelector + 1; + } + $searchRange = $searchRange * 2; + $rangeShift = $segCount * 2 - $searchRange; + $length = 16 + (8*$segCount ) + ($numGlyphs+1); + $cmap = array(0, 3, // Index : version, number of encoding subtables + 0, 0, // Encoding Subtable : platform (UNI=0), encoding 0 + 0, 28, // Encoding Subtable : offset (hi,lo) + 0, 3, // Encoding Subtable : platform (UNI=0), encoding 3 + 0, 28, // Encoding Subtable : offset (hi,lo) + 3, 1, // Encoding Subtable : platform (MS=3), encoding 1 + 0, 28, // Encoding Subtable : offset (hi,lo) + 4, $length, 0, // Format 4 Mapping subtable: format, length, language + $segCount*2, + $searchRange, + $entrySelector, + $rangeShift); + + // endCode(s) + foreach($range AS $start=>$subrange) { + $endCode = $start + (count($subrange)-1); + $cmap[] = $endCode; // endCode(s) + } + $cmap[] = 0xFFFF; // endCode of last Segment + $cmap[] = 0; // reservedPad + + // startCode(s) + foreach($range AS $start=>$subrange) { + $cmap[] = $start; // startCode(s) + } + $cmap[] = 0xFFFF; // startCode of last Segment + // idDelta(s) + foreach($range AS $start=>$subrange) { + $idDelta = -($start-$subrange[0]); + $n += count($subrange); + $cmap[] = $idDelta; // idDelta(s) + } + $cmap[] = 1; // idDelta of last Segment + // idRangeOffset(s) + foreach($range AS $subrange) { + $cmap[] = 0; // idRangeOffset[segCount] Offset in bytes to glyph indexArray, or 0 + + } + $cmap[] = 0; // idRangeOffset of last Segment + foreach($range AS $subrange) { + foreach($subrange AS $glidx) { + $cmap[] = $glidx; + } + } + $cmap[] = 0; // Mapping for last character + $cmapstr = ''; + foreach($cmap AS $cm) { $cmapstr .= pack("n",$cm); } + $this->add('cmap', $cmapstr); + + + /////////////////////////////////// + // glyf - Glyph data + /////////////////////////////////// + list($glyfOffset,$glyfLength) = $this->get_table_pos('glyf'); + if ($glyfLength < $this->maxStrLenRead) { + $glyphData = $this->get_table('glyf'); + } + + $offsets = array(); + $glyf = ''; + $pos = 0; + $hmtxstr = ''; + $xMinT = 0; + $yMinT = 0; + $xMaxT = 0; + $yMaxT = 0; + $advanceWidthMax = 0; + $minLeftSideBearing = 0; + $minRightSideBearing = 0; + $xMaxExtent = 0; + $maxPoints = 0; // points in non-compound glyph + $maxContours = 0; // contours in non-compound glyph + $maxComponentPoints = 0; // points in compound glyph + $maxComponentContours = 0; // contours in compound glyph + $maxComponentElements = 0; // number of glyphs referenced at top level + $maxComponentDepth = 0; // levels of recursion, set to 0 if font has only simple glyphs + $this->glyphdata = array(); + + foreach($subsetglyphs AS $originalGlyphIdx => $uni) { + // hmtx - Horizontal Metrics + $hm = $this->getHMetric($orignHmetrics, $originalGlyphIdx); + $hmtxstr .= $hm; + + $offsets[] = $pos; + $glyphPos = $this->glyphPos[$originalGlyphIdx]; + $glyphLen = $this->glyphPos[$originalGlyphIdx + 1] - $glyphPos; + if ($glyfLength < $this->maxStrLenRead) { + $data = substr($glyphData,$glyphPos,$glyphLen); + } + else { + if ($glyphLen > 0) $data = $this->get_chunk($glyfOffset+$glyphPos,$glyphLen); + else $data = ''; + } + + if ($glyphLen > 0) { + if (_RECALC_PROFILE) { + $xMin = $this->unpack_short(substr($data,2,2)); + $yMin = $this->unpack_short(substr($data,4,2)); + $xMax = $this->unpack_short(substr($data,6,2)); + $yMax = $this->unpack_short(substr($data,8,2)); + $xMinT = min($xMinT,$xMin); + $yMinT = min($yMinT,$yMin); + $xMaxT = max($xMaxT,$xMax); + $yMaxT = max($yMaxT,$yMax); + $aw = $this->unpack_short(substr($hm,0,2)); + $lsb = $this->unpack_short(substr($hm,2,2)); + $advanceWidthMax = max($advanceWidthMax,$aw); + $minLeftSideBearing = min($minLeftSideBearing,$lsb); + $minRightSideBearing = min($minRightSideBearing,($aw - $lsb - ($xMax - $xMin))); + $xMaxExtent = max($xMaxExtent,($lsb + ($xMax - $xMin))); + } + $up = unpack("n", substr($data,0,2)); + } + if ($glyphLen > 2 && ($up[1] & (1 << 15)) ) { // If number of contours <= -1 i.e. composiste glyph + $pos_in_glyph = 10; + $flags = GF_MORE; + $nComponentElements = 0; + while ($flags & GF_MORE) { + $nComponentElements += 1; // number of glyphs referenced at top level + $up = unpack("n", substr($data,$pos_in_glyph,2)); + $flags = $up[1]; + $up = unpack("n", substr($data,$pos_in_glyph+2,2)); + $glyphIdx = $up[1]; + $this->glyphdata[$originalGlyphIdx]['compGlyphs'][] = $glyphIdx; + $data = $this->_set_ushort($data, $pos_in_glyph + 2, $glyphSet[$glyphIdx]); + $pos_in_glyph += 4; + if ($flags & GF_WORDS) { $pos_in_glyph += 4; } + else { $pos_in_glyph += 2; } + if ($flags & GF_SCALE) { $pos_in_glyph += 2; } + else if ($flags & GF_XYSCALE) { $pos_in_glyph += 4; } + else if ($flags & GF_TWOBYTWO) { $pos_in_glyph += 8; } + } + $maxComponentElements = max($maxComponentElements, $nComponentElements); + } + // Simple Glyph + else if (_RECALC_PROFILE && $glyphLen > 2 && $up[1] < (1 << 15) && $up[1] > 0) { // Number of contours > 0 simple glyph + $nContours = $up[1]; + $this->glyphdata[$originalGlyphIdx]['nContours'] = $nContours; + $maxContours = max($maxContours, $nContours); + + // Count number of points in simple glyph + $pos_in_glyph = 10 + ($nContours * 2) - 2; // Last endContourPoint + $up = unpack("n", substr($data,$pos_in_glyph,2)); + $points = $up[1]+1; + $this->glyphdata[$originalGlyphIdx]['nPoints'] = $points; + $maxPoints = max($maxPoints, $points); + } + + $glyf .= $data; + $pos += $glyphLen; + if ($pos % 4 != 0) { + $padding = 4 - ($pos % 4); + $glyf .= str_repeat("\0",$padding); + $pos += $padding; + } + } + + if (_RECALC_PROFILE) { + foreach($this->glyphdata AS $originalGlyphIdx => $val) { + $maxdepth = $depth = -1; + $points = 0; + $contours = 0; + $this->getGlyphData($originalGlyphIdx, $maxdepth, $depth, $points, $contours) ; + $maxComponentDepth = max($maxComponentDepth , $maxdepth); + $maxComponentPoints = max($maxComponentPoints , $points); + $maxComponentContours = max($maxComponentContours , $contours); + } + } + + + $offsets[] = $pos; + $this->add('glyf', $glyf); + + /////////////////////////////////// + // hmtx - Horizontal Metrics + /////////////////////////////////// + $this->add('hmtx', $hmtxstr); + + + /////////////////////////////////// + // loca - Index to location + /////////////////////////////////// + $locastr = ''; + if ((($pos + 1) >> 1) > 0xFFFF) { + $indexToLocFormat = 1; // long format + foreach($offsets AS $offset) { $locastr .= pack("N",$offset); } + } + else { + $indexToLocFormat = 0; // short format + foreach($offsets AS $offset) { $locastr .= pack("n",($offset/2)); } + } + $this->add('loca', $locastr); + + /////////////////////////////////// + // head - Font header + /////////////////////////////////// + $head = $this->get_table('head'); + $head = $this->_set_ushort($head, 50, $indexToLocFormat); + if (_RECALC_PROFILE) { + $head = $this->_set_short($head, 36, $xMinT); // for all glyph bounding boxes + $head = $this->_set_short($head, 38, $yMinT); // for all glyph bounding boxes + $head = $this->_set_short($head, 40, $xMaxT); // for all glyph bounding boxes + $head = $this->_set_short($head, 42, $yMaxT); // for all glyph bounding boxes + $head[17] = chr($head[17] & ~(1 << 4)); // Unset Bit 4 (as hdmx/LTSH tables not included) + } + $this->add('head', $head); + + + /////////////////////////////////// + // hhea - Horizontal Header + /////////////////////////////////// + $hhea = $this->get_table('hhea'); + $hhea = $this->_set_ushort($hhea, 34, $numberOfHMetrics); + if (_RECALC_PROFILE) { + $hhea = $this->_set_ushort($hhea, 10, $advanceWidthMax); + $hhea = $this->_set_short($hhea, 12, $minLeftSideBearing); + $hhea = $this->_set_short($hhea, 14, $minRightSideBearing); + $hhea = $this->_set_short($hhea, 16, $xMaxExtent); + } + $this->add('hhea', $hhea); + + /////////////////////////////////// + // maxp - Maximum Profile + /////////////////////////////////// + $maxp = $this->get_table('maxp'); + $maxp = $this->_set_ushort($maxp, 4, $numGlyphs); + if (_RECALC_PROFILE) { + $maxp = $this->_set_ushort($maxp, 6, $maxPoints); // points in non-compound glyph + $maxp = $this->_set_ushort($maxp, 8, $maxContours); // contours in non-compound glyph + $maxp = $this->_set_ushort($maxp, 10, $maxComponentPoints); // points in compound glyph + $maxp = $this->_set_ushort($maxp, 12, $maxComponentContours); // contours in compound glyph + $maxp = $this->_set_ushort($maxp, 28, $maxComponentElements); // number of glyphs referenced at top level + $maxp = $this->_set_ushort($maxp, 30, $maxComponentDepth); // levels of recursion, set to 0 if font has only simple glyphs + } + $this->add('maxp', $maxp); + + + /////////////////////////////////// + // OS/2 - OS/2 + /////////////////////////////////// + if (isset($this->tables['OS/2'])) { + $os2_offset = $this->seek_table("OS/2"); + if (_RECALC_PROFILE) { + $fsSelection = $this->get_ushort($os2_offset+62); + $fsSelection = ($fsSelection & ~(1 << 6)); // 2-byte bit field containing information concerning the nature of the font patterns + // bit#0 = Italic; bit#5=Bold + // Match name table's font subfamily string + // Clear bit#6 used for 'Regular' and optional + } + + // NB Currently this method never subsets characters above BMP + // Could set nonBMP bit according to $this->maxUni + $nonBMP = $this->get_ushort($os2_offset+46); + $nonBMP = ($nonBMP & ~(1 << 9)); // Unset Bit 57 (indicates non-BMP) - for interactive forms + + $os2 = $this->get_table('OS/2'); + if (_RECALC_PROFILE) { + $os2 = $this->_set_ushort($os2, 62, $fsSelection); + $os2 = $this->_set_ushort($os2, 66, $fsLastCharIndex); + $os2 = $this->_set_ushort($os2, 42, 0x0000); // ulCharRange (ulUnicodeRange) bits 24-31 | 16-23 + $os2 = $this->_set_ushort($os2, 44, 0x0000); // ulCharRange (Unicode ranges) bits 8-15 | 0-7 + $os2 = $this->_set_ushort($os2, 46, $nonBMP); // ulCharRange (Unicode ranges) bits 56-63 | 48-55 + $os2 = $this->_set_ushort($os2, 48, 0x0000); // ulCharRange (Unicode ranges) bits 40-47 | 32-39 + $os2 = $this->_set_ushort($os2, 50, 0x0000); // ulCharRange (Unicode ranges) bits 88-95 | 80-87 + $os2 = $this->_set_ushort($os2, 52, 0x0000); // ulCharRange (Unicode ranges) bits 72-79 | 64-71 + $os2 = $this->_set_ushort($os2, 54, 0x0000); // ulCharRange (Unicode ranges) bits 120-127 | 112-119 + $os2 = $this->_set_ushort($os2, 56, 0x0000); // ulCharRange (Unicode ranges) bits 104-111 | 96-103 + } + $os2 = $this->_set_ushort($os2, 46, $nonBMP); // Unset Bit 57 (indicates non-BMP) - for interactive forms + + $this->add('OS/2', $os2 ); + } + + fclose($this->fh); + // Put the TTF file together + $stm = ''; + $this->endTTFile($stm); + //file_put_contents('testfont.ttf', $stm); exit; + return $stm ; + } + +//================================================================================ + + // Also does SMP + function makeSubsetSIP($file, &$subset, $TTCfontID=0, $debug=false) { + $this->fh = fopen($file ,'rb') or die('Can\'t open file ' . $file); + $this->filename = $file; + $this->_pos = 0; + $this->unAGlyphs = false; // mPDF 5.4.05 + $this->charWidths = ''; + $this->glyphPos = array(); + $this->charToGlyph = array(); + $this->tables = array(); + $this->otables = array(); + $this->ascent = 0; + $this->descent = 0; + $this->numTTCFonts = 0; + $this->TTCFonts = array(); + $this->skip(4); + if ($TTCfontID > 0) { + $this->version = $version = $this->read_ulong(); // TTC Header version now + if (!in_array($version, array(0x00010000,0x00020000))) + die("ERROR - Error parsing TrueType Collection: version=".$version." - " . $file); + $this->numTTCFonts = $this->read_ulong(); + for ($i=1; $i<=$this->numTTCFonts; $i++) { + $this->TTCFonts[$i]['offset'] = $this->read_ulong(); + } + $this->seek($this->TTCFonts[$TTCfontID]['offset']); + $this->version = $version = $this->read_ulong(); // TTFont version again now + } + $this->readTableDirectory($debug); + + + + /////////////////////////////////// + // head - Font header table + /////////////////////////////////// + $this->seek_table("head"); + $this->skip(50); + $indexToLocFormat = $this->read_ushort(); + $glyphDataFormat = $this->read_ushort(); + + /////////////////////////////////// + // hhea - Horizontal header table + /////////////////////////////////// + $this->seek_table("hhea"); + $this->skip(32); + $metricDataFormat = $this->read_ushort(); + $orignHmetrics = $numberOfHMetrics = $this->read_ushort(); + + /////////////////////////////////// + // maxp - Maximum profile table + /////////////////////////////////// + $this->seek_table("maxp"); + $this->skip(4); + $numGlyphs = $this->read_ushort(); + + + /////////////////////////////////// + // cmap - Character to glyph index mapping table + /////////////////////////////////// + + $cmap_offset = $this->seek_table("cmap"); + $this->skip(2); + $cmapTableCount = $this->read_ushort(); + $unicode_cmap_offset = 0; + for ($i=0;$i<$cmapTableCount;$i++) { + $platformID = $this->read_ushort(); + $encodingID = $this->read_ushort(); + $offset = $this->read_ulong(); + $save_pos = $this->_pos; + if (($platformID == 3 && $encodingID == 10) || $platformID == 0) { // Microsoft, Unicode Format 12 table HKCS + $format = $this->get_ushort($cmap_offset + $offset); + if ($format == 12) { + $unicode_cmap_offset = $cmap_offset + $offset; + break; + } + } + $this->seek($save_pos ); + } + + if (!$unicode_cmap_offset) + die('Font does not have cmap for Unicode (platform 3, encoding 1, format 4, or platform 0, any encoding, format 4)'); + // Format 12 CMAP does characters above Unicode BMP i.e. some HKCS characters U+20000 and above + if ($format == 12) { + $this->maxUniChar = 0; + $this->seek($unicode_cmap_offset + 4); + $length = $this->read_ulong(); + $limit = $unicode_cmap_offset + $length; + $this->skip(4); + + $nGroups = $this->read_ulong(); + + $glyphToChar = array(); + $charToGlyph = array(); + for($i=0; $i<$nGroups ; $i++) { + $startCharCode = $this->read_ulong(); + $endCharCode = $this->read_ulong(); + $startGlyphCode = $this->read_ulong(); + $offset = 0; + for ($unichar=$startCharCode;$unichar<=$endCharCode;$unichar++) { + $glyph = $startGlyphCode + $offset ; + $offset++; + $charToGlyph[$unichar] = $glyph; + if ($unichar < 196608) { $this->maxUniChar = max($unichar,$this->maxUniChar); } + $glyphToChar[$glyph][] = $unichar; + } + } + } + else + die('Font does not have cmap for Unicode (format 12)'); + + + /////////////////////////////////// + // hmtx - Horizontal metrics table + /////////////////////////////////// + $scale = 1; // not used here + $this->getHMTX($numberOfHMetrics, $numGlyphs, $glyphToChar, $scale); + + /////////////////////////////////// + // loca - Index to location + /////////////////////////////////// + $this->getLOCA($indexToLocFormat, $numGlyphs); + + /////////////////////////////////////////////////////////////////// + + $glyphMap = array(0=>0); + $glyphSet = array(0=>0); + $codeToGlyph = array(); + // Set a substitute if ASCII characters do not have glyphs + if (isset($charToGlyph[0x3F])) { $subs = $charToGlyph[0x3F]; } // Question mark + else { $subs = $charToGlyph[32]; } + foreach($subset AS $code) { + if (isset($charToGlyph[$code])) + $originalGlyphIdx = $charToGlyph[$code]; + else if ($code<128) { + $originalGlyphIdx = $subs; + } + else { $originalGlyphIdx = 0; } + if (!isset($glyphSet[$originalGlyphIdx])) { + $glyphSet[$originalGlyphIdx] = count($glyphMap); + $glyphMap[] = $originalGlyphIdx; + } + $codeToGlyph[$code] = $glyphSet[$originalGlyphIdx]; + } + + list($start,$dummy) = $this->get_table_pos('glyf'); + + $n = 0; + while ($n < count($glyphMap)) { + $originalGlyphIdx = $glyphMap[$n]; + $glyphPos = $this->glyphPos[$originalGlyphIdx]; + $glyphLen = $this->glyphPos[$originalGlyphIdx + 1] - $glyphPos; + $n += 1; + if (!$glyphLen) continue; + $this->seek($start + $glyphPos); + $numberOfContours = $this->read_short(); + if ($numberOfContours < 0) { + $this->skip(8); + $flags = GF_MORE; + while ($flags & GF_MORE) { + $flags = $this->read_ushort(); + $glyphIdx = $this->read_ushort(); + if (!isset($glyphSet[$glyphIdx])) { + $glyphSet[$glyphIdx] = count($glyphMap); + $glyphMap[] = $glyphIdx; + } + if ($flags & GF_WORDS) + $this->skip(4); + else + $this->skip(2); + if ($flags & GF_SCALE) + $this->skip(2); + else if ($flags & GF_XYSCALE) + $this->skip(4); + else if ($flags & GF_TWOBYTWO) + $this->skip(8); + } + } + } + + $numGlyphs = $n = count($glyphMap); + $numberOfHMetrics = $n; + + /////////////////////////////////// + // name + /////////////////////////////////// + // Needs to have a name entry in 3,0 (e.g. symbol) - original font will be 3,1 (i.e. Unicode) + $name = $this->get_table('name'); + $name_offset = $this->seek_table("name"); + $format = $this->read_ushort(); + $numRecords = $this->read_ushort(); + $string_data_offset = $name_offset + $this->read_ushort(); + for ($i=0;$i<$numRecords; $i++) { + $platformId = $this->read_ushort(); + $encodingId = $this->read_ushort(); + if ($platformId == 3 && $encodingId == 1) { + $pos = 6 + ($i * 12) + 2; + $name = $this->_set_ushort($name, $pos, 0x00); // Change encoding to 3,0 rather than 3,1 + } + $this->skip(8); + } + $this->add('name', $name); + + /////////////////////////////////// + // OS/2 + /////////////////////////////////// + if (isset($this->tables['OS/2'])) { + $os2 = $this->get_table('OS/2'); + $os2 = $this->_set_ushort($os2, 42, 0x00); // ulCharRange (Unicode ranges) + $os2 = $this->_set_ushort($os2, 44, 0x00); // ulCharRange (Unicode ranges) + $os2 = $this->_set_ushort($os2, 46, 0x00); // ulCharRange (Unicode ranges) + $os2 = $this->_set_ushort($os2, 48, 0x00); // ulCharRange (Unicode ranges) + + $os2 = $this->_set_ushort($os2, 50, 0x00); // ulCharRange (Unicode ranges) + $os2 = $this->_set_ushort($os2, 52, 0x00); // ulCharRange (Unicode ranges) + $os2 = $this->_set_ushort($os2, 54, 0x00); // ulCharRange (Unicode ranges) + $os2 = $this->_set_ushort($os2, 56, 0x00); // ulCharRange (Unicode ranges) + // Set Symbol character only in ulCodePageRange + $os2 = $this->_set_ushort($os2, 78, 0x8000); // ulCodePageRange = Bit #31 Symbol **** 78 = Bit 16-31 + $os2 = $this->_set_ushort($os2, 80, 0x0000); // ulCodePageRange = Bit #31 Symbol **** 80 = Bit 0-15 + $os2 = $this->_set_ushort($os2, 82, 0x0000); // ulCodePageRange = Bit #32- Symbol **** 82 = Bits 48-63 + $os2 = $this->_set_ushort($os2, 84, 0x0000); // ulCodePageRange = Bit #32- Symbol **** 84 = Bits 32-47 + + $os2 = $this->_set_ushort($os2, 64, 0x01); // FirstCharIndex + $os2 = $this->_set_ushort($os2, 66, count($subset)); // LastCharIndex + // Set PANOSE first bit to 5 for Symbol + $os2 = $this->splice($os2, 32, chr(5).chr(0).chr(1).chr(0).chr(1).chr(0).chr(0).chr(0).chr(0).chr(0)); + $this->add('OS/2', $os2 ); + } + + + /////////////////////////////////// + //tables copied from the original + /////////////////////////////////// + $tags = array ('cvt ', 'fpgm', 'prep', 'gasp'); + foreach($tags AS $tag) { // 1.02 + if (isset($this->tables[$tag])) { $this->add($tag, $this->get_table($tag)); } + } + + /////////////////////////////////// + // post - PostScript + /////////////////////////////////// + if (isset($this->tables['post'])) { + $opost = $this->get_table('post'); + $post = "\x00\x03\x00\x00" . substr($opost,4,12) . "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; + } + $this->add('post', $post); + + /////////////////////////////////// + // hhea - Horizontal Header + /////////////////////////////////// + $hhea = $this->get_table('hhea'); + $hhea = $this->_set_ushort($hhea, 34, $numberOfHMetrics); + $this->add('hhea', $hhea); + + /////////////////////////////////// + // maxp - Maximum Profile + /////////////////////////////////// + $maxp = $this->get_table('maxp'); + $maxp = $this->_set_ushort($maxp, 4, $numGlyphs); + $this->add('maxp', $maxp); + + + /////////////////////////////////// + // CMap table Formats [1,0,]6 and [3,0,]4 + /////////////////////////////////// + /////////////////////////////////// + // Sort CID2GID map into segments of contiguous codes + /////////////////////////////////// + $rangeid = 0; + $range = array(); + $prevcid = -2; + $prevglidx = -1; + // for each character + foreach ($subset as $cid => $code) { + $glidx = $codeToGlyph[$code]; + if ($cid == ($prevcid + 1) && $glidx == ($prevglidx + 1)) { + $range[$rangeid][] = $glidx; + } else { + // new range + $rangeid = $cid; + $range[$rangeid] = array(); + $range[$rangeid][] = $glidx; + } + $prevcid = $cid; + $prevglidx = $glidx; + } + // cmap - Character to glyph mapping + $segCount = count($range) + 1; // + 1 Last segment has missing character 0xFFFF + $searchRange = 1; + $entrySelector = 0; + while ($searchRange * 2 <= $segCount ) { + $searchRange = $searchRange * 2; + $entrySelector = $entrySelector + 1; + } + $searchRange = $searchRange * 2; + $rangeShift = $segCount * 2 - $searchRange; + $length = 16 + (8*$segCount ) + ($numGlyphs+1); + $cmap = array( + 4, $length, 0, // Format 4 Mapping subtable: format, length, language + $segCount*2, + $searchRange, + $entrySelector, + $rangeShift); + + // endCode(s) + foreach($range AS $start=>$subrange) { + $endCode = $start + (count($subrange)-1); + $cmap[] = $endCode; // endCode(s) + } + $cmap[] = 0xFFFF; // endCode of last Segment + $cmap[] = 0; // reservedPad + + // startCode(s) + foreach($range AS $start=>$subrange) { + $cmap[] = $start; // startCode(s) + } + $cmap[] = 0xFFFF; // startCode of last Segment + // idDelta(s) + foreach($range AS $start=>$subrange) { + $idDelta = -($start-$subrange[0]); + $n += count($subrange); + $cmap[] = $idDelta; // idDelta(s) + } + $cmap[] = 1; // idDelta of last Segment + // idRangeOffset(s) + foreach($range AS $subrange) { + $cmap[] = 0; // idRangeOffset[segCount] Offset in bytes to glyph indexArray, or 0 + + } + $cmap[] = 0; // idRangeOffset of last Segment + foreach($range AS $subrange) { + foreach($subrange AS $glidx) { + $cmap[] = $glidx; + } + } + $cmap[] = 0; // Mapping for last character + $cmapstr4 = ''; + foreach($cmap AS $cm) { $cmapstr4 .= pack("n",$cm); } + + /////////////////////////////////// + // cmap - Character to glyph mapping + /////////////////////////////////// + $entryCount = count($subset); + $length = 10 + $entryCount * 2; + + $off = 20 + $length; + $hoff = $off >> 16; + $loff = $off & 0xFFFF; + + $cmap = array(0, 2, // Index : version, number of subtables + 1, 0, // Subtable : platform, encoding + 0, 20, // offset (hi,lo) + 3, 0, // Subtable : platform, encoding + $hoff, $loff, // offset (hi,lo) + 6, $length, // Format 6 Mapping table: format, length + 0, 1, // language, First char code + $entryCount + ); + $cmapstr = ''; + foreach($subset AS $code) { $cmap[] = $codeToGlyph[$code]; } + foreach($cmap AS $cm) { $cmapstr .= pack("n",$cm); } + $cmapstr .= $cmapstr4; + $this->add('cmap', $cmapstr); + + /////////////////////////////////// + // hmtx - Horizontal Metrics + /////////////////////////////////// + $hmtxstr = ''; + for($n=0;$n<$numGlyphs;$n++) { + $originalGlyphIdx = $glyphMap[$n]; + $hm = $this->getHMetric($orignHmetrics, $originalGlyphIdx); + $hmtxstr .= $hm; + } + $this->add('hmtx', $hmtxstr); + + /////////////////////////////////// + // glyf - Glyph data + /////////////////////////////////// + list($glyfOffset,$glyfLength) = $this->get_table_pos('glyf'); + if ($glyfLength < $this->maxStrLenRead) { + $glyphData = $this->get_table('glyf'); + } + + $offsets = array(); + $glyf = ''; + $pos = 0; + for ($n=0;$n<$numGlyphs;$n++) { + $offsets[] = $pos; + $originalGlyphIdx = $glyphMap[$n]; + $glyphPos = $this->glyphPos[$originalGlyphIdx]; + $glyphLen = $this->glyphPos[$originalGlyphIdx + 1] - $glyphPos; + if ($glyfLength < $this->maxStrLenRead) { + $data = substr($glyphData,$glyphPos,$glyphLen); + } + else { + if ($glyphLen > 0) $data = $this->get_chunk($glyfOffset+$glyphPos,$glyphLen); + else $data = ''; + } + if ($glyphLen > 0) $up = unpack("n", substr($data,0,2)); + if ($glyphLen > 2 && ($up[1] & (1 << 15)) ) { + $pos_in_glyph = 10; + $flags = GF_MORE; + while ($flags & GF_MORE) { + $up = unpack("n", substr($data,$pos_in_glyph,2)); + $flags = $up[1]; + $up = unpack("n", substr($data,$pos_in_glyph+2,2)); + $glyphIdx = $up[1]; + $data = $this->_set_ushort($data, $pos_in_glyph + 2, $glyphSet[$glyphIdx]); + $pos_in_glyph += 4; + if ($flags & GF_WORDS) { $pos_in_glyph += 4; } + else { $pos_in_glyph += 2; } + if ($flags & GF_SCALE) { $pos_in_glyph += 2; } + else if ($flags & GF_XYSCALE) { $pos_in_glyph += 4; } + else if ($flags & GF_TWOBYTWO) { $pos_in_glyph += 8; } + } + } + $glyf .= $data; + $pos += $glyphLen; + if ($pos % 4 != 0) { + $padding = 4 - ($pos % 4); + $glyf .= str_repeat("\0",$padding); + $pos += $padding; + } + } + $offsets[] = $pos; + $this->add('glyf', $glyf); + + /////////////////////////////////// + // loca - Index to location + /////////////////////////////////// + $locastr = ''; + if ((($pos + 1) >> 1) > 0xFFFF) { + $indexToLocFormat = 1; // long format + foreach($offsets AS $offset) { $locastr .= pack("N",$offset); } + } + else { + $indexToLocFormat = 0; // short format + foreach($offsets AS $offset) { $locastr .= pack("n",($offset/2)); } + } + $this->add('loca', $locastr); + + /////////////////////////////////// + // head - Font header + /////////////////////////////////// + $head = $this->get_table('head'); + $head = $this->_set_ushort($head, 50, $indexToLocFormat); + $this->add('head', $head); + + fclose($this->fh); + + // Put the TTF file together + $stm = ''; + $this->endTTFile($stm); + //file_put_contents('testfont.ttf', $stm); exit; + return $stm ; + } + + ////////////////////////////////////////////////////////////////////////////////// + // Recursively get composite glyph data + function getGlyphData($originalGlyphIdx, &$maxdepth, &$depth, &$points, &$contours) { + $depth++; + $maxdepth = max($maxdepth, $depth); + if (count($this->glyphdata[$originalGlyphIdx]['compGlyphs'])) { + foreach($this->glyphdata[$originalGlyphIdx]['compGlyphs'] AS $glyphIdx) { + $this->getGlyphData($glyphIdx, $maxdepth, $depth, $points, $contours); + } + } + else if (($this->glyphdata[$originalGlyphIdx]['nContours'] > 0) && $depth > 0) { // simple + $contours += $this->glyphdata[$originalGlyphIdx]['nContours']; + $points += $this->glyphdata[$originalGlyphIdx]['nPoints']; + } + $depth--; + } + + + ////////////////////////////////////////////////////////////////////////////////// + // Recursively get composite glyphs + function getGlyphs($originalGlyphIdx, &$start, &$glyphSet, &$subsetglyphs) { + $glyphPos = $this->glyphPos[$originalGlyphIdx]; + $glyphLen = $this->glyphPos[$originalGlyphIdx + 1] - $glyphPos; + if (!$glyphLen) { + return; + } + $this->seek($start + $glyphPos); + $numberOfContours = $this->read_short(); + if ($numberOfContours < 0) { + $this->skip(8); + $flags = GF_MORE; + while ($flags & GF_MORE) { + $flags = $this->read_ushort(); + $glyphIdx = $this->read_ushort(); + if (!isset($glyphSet[$glyphIdx])) { + $glyphSet[$glyphIdx] = count($subsetglyphs); // old glyphID to new glyphID + $subsetglyphs[$glyphIdx] = true; + } + $savepos = ftell($this->fh); + $this->getGlyphs($glyphIdx, $start, $glyphSet, $subsetglyphs); + $this->seek($savepos); + if ($flags & GF_WORDS) + $this->skip(4); + else + $this->skip(2); + if ($flags & GF_SCALE) + $this->skip(2); + else if ($flags & GF_XYSCALE) + $this->skip(4); + else if ($flags & GF_TWOBYTWO) + $this->skip(8); + } + } + } + + ////////////////////////////////////////////////////////////////////////////////// + + function getHMTX($numberOfHMetrics, $numGlyphs, &$glyphToChar, $scale) { + $start = $this->seek_table("hmtx"); + $aw = 0; + $this->charWidths = str_pad('', 256*256*2, "\x00"); + if ($this->maxUniChar > 65536) { $this->charWidths .= str_pad('', 256*256*2, "\x00"); } // Plane 1 SMP + if ($this->maxUniChar > 131072) { $this->charWidths .= str_pad('', 256*256*2, "\x00"); } // Plane 2 SMP + $nCharWidths = 0; + if (($numberOfHMetrics*4) < $this->maxStrLenRead) { + $data = $this->get_chunk($start,($numberOfHMetrics*4)); + $arr = unpack("n*", $data); + } + else { $this->seek($start); } + for( $glyph=0; $glyph<$numberOfHMetrics; $glyph++) { + if (($numberOfHMetrics*4) < $this->maxStrLenRead) { + $aw = $arr[($glyph*2)+1]; + } + else { + $aw = $this->read_ushort(); + $lsb = $this->read_ushort(); + } + if (isset($glyphToChar[$glyph]) || $glyph == 0) { + + if ($aw >= (1 << 15) ) { $aw = 0; } // 1.03 Some (arabic) fonts have -ve values for width + // although should be unsigned value - comes out as e.g. 65108 (intended -50) + if ($glyph == 0) { + $this->defaultWidth = $scale*$aw; + continue; + } + foreach($glyphToChar[$glyph] AS $char) { + //$this->charWidths[$char] = intval(round($scale*$aw)); + if ($char != 0 && $char != 65535) { + $w = intval(round($scale*$aw)); + if ($w == 0) { $w = 65535; } + if ($char < 196608) { + $this->charWidths[$char*2] = chr($w >> 8); + $this->charWidths[$char*2 + 1] = chr($w & 0xFF); + $nCharWidths++; + } + } + } + } + } + $data = $this->get_chunk(($start+$numberOfHMetrics*4),($numGlyphs*2)); + $arr = unpack("n*", $data); + $diff = $numGlyphs-$numberOfHMetrics; + $w = intval(round($scale*$aw)); + if ($w == 0) { $w = 65535; } + for( $pos=0; $pos<$diff; $pos++) { + $glyph = $pos + $numberOfHMetrics; + if (isset($glyphToChar[$glyph])) { + foreach($glyphToChar[$glyph] AS $char) { + if ($char != 0 && $char != 65535) { + if ($char < 196608) { + $this->charWidths[$char*2] = chr($w >> 8); + $this->charWidths[$char*2 + 1] = chr($w & 0xFF); + $nCharWidths++; + } + } + } + } + } + // NB 65535 is a set width of 0 + // First bytes define number of chars in font + $this->charWidths[0] = chr($nCharWidths >> 8); + $this->charWidths[1] = chr($nCharWidths & 0xFF); + } + + function getHMetric($numberOfHMetrics, $gid) { + $start = $this->seek_table("hmtx"); + if ($gid < $numberOfHMetrics) { + $this->seek($start+($gid*4)); + $hm = fread($this->fh,4); + } + else { + $this->seek($start+(($numberOfHMetrics-1)*4)); + $hm = fread($this->fh,2); + $this->seek($start+($numberOfHMetrics*2)+($gid*2)); + $hm .= fread($this->fh,2); + } + return $hm; + } + + function getLOCA($indexToLocFormat, $numGlyphs) { + $start = $this->seek_table('loca'); + $this->glyphPos = array(); + if ($indexToLocFormat == 0) { + $data = $this->get_chunk($start,($numGlyphs*2)+2); + $arr = unpack("n*", $data); + for ($n=0; $n<=$numGlyphs; $n++) { + $this->glyphPos[] = ($arr[$n+1] * 2); + } + } + else if ($indexToLocFormat == 1) { + $data = $this->get_chunk($start,($numGlyphs*4)+4); + $arr = unpack("N*", $data); + for ($n=0; $n<=$numGlyphs; $n++) { + $this->glyphPos[] = ($arr[$n+1]); + } + } + else + die('Unknown location table format '.$indexToLocFormat); + } + + + // CMAP Format 4 + function getCMAP4($unicode_cmap_offset, &$glyphToChar, &$charToGlyph ) { + $this->maxUniChar = 0; + $this->seek($unicode_cmap_offset + 2); + $length = $this->read_ushort(); + $limit = $unicode_cmap_offset + $length; + $this->skip(2); + + $segCount = $this->read_ushort() / 2; + $this->skip(6); + $endCount = array(); + for($i=0; $i<$segCount; $i++) { $endCount[] = $this->read_ushort(); } + $this->skip(2); + $startCount = array(); + for($i=0; $i<$segCount; $i++) { $startCount[] = $this->read_ushort(); } + $idDelta = array(); + for($i=0; $i<$segCount; $i++) { $idDelta[] = $this->read_short(); } // ???? was unsigned short + $idRangeOffset_start = $this->_pos; + $idRangeOffset = array(); + for($i=0; $i<$segCount; $i++) { $idRangeOffset[] = $this->read_ushort(); } + + for ($n=0;$n<$segCount;$n++) { + $endpoint = ($endCount[$n] + 1); + for ($unichar=$startCount[$n];$unichar<$endpoint;$unichar++) { + if ($idRangeOffset[$n] == 0) + $glyph = ($unichar + $idDelta[$n]) & 0xFFFF; + else { + $offset = ($unichar - $startCount[$n]) * 2 + $idRangeOffset[$n]; + $offset = $idRangeOffset_start + 2 * $n + $offset; + if ($offset >= $limit) + $glyph = 0; + else { + $glyph = $this->get_ushort($offset); + if ($glyph != 0) + $glyph = ($glyph + $idDelta[$n]) & 0xFFFF; + } + } + $charToGlyph[$unichar] = $glyph; + if ($unichar < 196608) { $this->maxUniChar = max($unichar,$this->maxUniChar); } + $glyphToChar[$glyph][] = $unichar; + } + } + + // mPDF 5.4.05 + if ($this->unAGlyphs) { + if (isset($this->tables['post'])) { + $this->seek_table("post"); + $formata = $this->read_ushort(); + $formatb = $this->read_ushort(); + // Only works on Format 2.0 + if ($formata != 2 || $formatb != 0) { die("Cannot set unAGlyphs for this font (".$file."). POST table must be in Format 2."); } + $this->skip(28); + $nGlyfs = $this->read_ushort(); + $glyphNameIndex = array(); + for ($i=0; $i<$nGlyfs; $i++) { + $glyphNameIndex[($this->read_ushort())] = $i; + } + + $opost = $this->get_table('post'); + $ptr = 34+($nGlyfs*2); + for ($i=0; $i<$nGlyfs; $i++) { + $len = ord(substr($opost,$ptr,1)); + $ptr++; + $name = substr($opost,$ptr,$len); + $gid = $glyphNameIndex[$i+258]; + // Select uni0600.xxx(x) - uni06FF.xxx(x) + if (preg_match('/^uni(06[0-9a-f]{2})\.(fina|medi|init|fin|med|ini)$/i',$name,$m)) { + if (!isset($glyphToChar[$gid]) || (isset($glyphToChar[$gid]) && is_array($glyphToChar[$gid]) && count($glyphToChar[$gid])==1 && $glyphToChar[$gid][0]>57343 && $glyphToChar[$gid][0]<63489)) { // if set in PUA private use area E000-F8FF, or NOT Unicode mapped + $uni = hexdec($m[1]); + $form = strtoupper(substr($m[2],0,1)); + // Assign new PUA Unicode between F500 - F7FF + $bit = $uni & 0xFF; + if ($form == 'I') { $bit += 0xF600; } + else if ($form == 'M') { $bit += 0xF700; } + else { $bit += 0xF500; } + // ADD TO CMAP + $glyphToChar[$gid][] = $bit; + $charToGlyph[$bit] = $gid; + } + } + // LAM with ALEF ligatures (Mandatory ligatures) + else if (preg_match('/^uni064406(22|23|25|27)(\.fina|\.fin){0,1}$/i',$name,$m)) { + if ($m[1]=='22') { + if ($m[2]) { $uni = hexdec('FEF6'); } else { $uni = hexdec('FEF5'); } + } + else if ($m[1]=='23') { + if ($m[2]) { $uni = hexdec('FEF8'); } else { $uni = hexdec('FEF7'); } + } + else if ($m[1]=='25') { + if ($m[2]) { $uni = hexdec('FEFA'); } else { $uni = hexdec('FEF9'); } + } + else if ($m[1]=='27') { + if ($m[2]) { $uni = hexdec('FEFC'); } else { $uni = hexdec('FEFB'); } + } + if (!isset($glyphToChar[$gid]) || (isset($glyphToChar[$gid]) && is_array($glyphToChar[$gid]) && count($glyphToChar[$gid])==1 && $glyphToChar[$gid][0]>57343 && $glyphToChar[$gid][0]<63489)) { // if set in PUA private use area E000-F8FF, or NOT Unicode mapped + // ADD TO CMAP + $glyphToChar[$gid][] = $uni; + $charToGlyph[$uni] = $gid; + } + } + $ptr += $len; + } + } + } + + } + + + // Put the TTF file together + function endTTFile(&$stm) { + $stm = ''; + $numTables = count($this->otables); + $searchRange = 1; + $entrySelector = 0; + while ($searchRange * 2 <= $numTables) { + $searchRange = $searchRange * 2; + $entrySelector = $entrySelector + 1; + } + $searchRange = $searchRange * 16; + $rangeShift = $numTables * 16 - $searchRange; + + // Header + if (_TTF_MAC_HEADER) { + $stm .= (pack("Nnnnn", 0x74727565, $numTables, $searchRange, $entrySelector, $rangeShift)); // Mac + } + else { + $stm .= (pack("Nnnnn", 0x00010000 , $numTables, $searchRange, $entrySelector, $rangeShift)); // Windows + } + + // Table directory + $tables = $this->otables; + ksort ($tables); + $offset = 12 + $numTables * 16; + foreach ($tables AS $tag=>$data) { + if ($tag == 'head') { $head_start = $offset; } + $stm .= $tag; + $checksum = $this->calcChecksum($data); + $stm .= pack("nn", $checksum[0],$checksum[1]); + $stm .= pack("NN", $offset, strlen($data)); + $paddedLength = (strlen($data)+3)&~3; + $offset = $offset + $paddedLength; + } + + // Table data + foreach ($tables AS $tag=>$data) { + $data .= "\0\0\0"; + $stm .= substr($data,0,(strlen($data)&~3)); + } + + $checksum = $this->calcChecksum($stm); + $checksum = $this->sub32(array(0xB1B0,0xAFBA), $checksum); + $chk = pack("nn", $checksum[0],$checksum[1]); + $stm = $this->splice($stm,($head_start + 8),$chk); + return $stm ; + } + + + function repackageTTF($file, $TTCfontID=0, $debug=false, $unAGlyphs=false) { // mPDF 5.4.05 + $this->unAGlyphs = $unAGlyphs; // mPDF 5.4.05 + $this->filename = $file; + $this->fh = fopen($file ,'rb') or die('Can\'t open file ' . $file); + $this->_pos = 0; + $this->charWidths = ''; + $this->glyphPos = array(); + $this->charToGlyph = array(); + $this->tables = array(); + $this->otables = array(); + $this->ascent = 0; + $this->descent = 0; + $this->numTTCFonts = 0; + $this->TTCFonts = array(); + $this->skip(4); + $this->maxUni = 0; + if ($TTCfontID > 0) { + $this->version = $version = $this->read_ulong(); // TTC Header version now + if (!in_array($version, array(0x00010000,0x00020000))) + die("ERROR - Error parsing TrueType Collection: version=".$version." - " . $file); + $this->numTTCFonts = $this->read_ulong(); + for ($i=1; $i<=$this->numTTCFonts; $i++) { + $this->TTCFonts[$i]['offset'] = $this->read_ulong(); + } + $this->seek($this->TTCFonts[$TTCfontID]['offset']); + $this->version = $version = $this->read_ulong(); // TTFont version again now + } + $this->readTableDirectory($debug); + $tags = array ('OS/2', 'cmap', 'glyf', 'head', 'hhea', 'hmtx', 'loca', 'maxp', 'name', 'post', 'cvt ', 'fpgm', 'gasp', 'prep'); +/* +Tables which require glyphIndex +hdmx +kern +LTSH + +Tables which do NOT require glyphIndex +VDMX + +GDEF +GPOS +GSUB +JSTF + +DSIG +PCLT - not recommended +*/ + + foreach($tags AS $tag) { + if (isset($this->tables[$tag])) { $this->add($tag, $this->get_table($tag)); } + } + fclose($this->fh); + $stm = ''; + $this->endTTFile($stm); + return $stm ; + } + + +} + + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/classes/ttfontsuni_analysis.php b/application/third_party/mpdf/classes/ttfontsuni_analysis.php new file mode 100644 index 0000000..ffd8786 --- /dev/null +++ b/application/third_party/mpdf/classes/ttfontsuni_analysis.php @@ -0,0 +1,463 @@ +<?php + +require_once(_MPDF_PATH.'classes/ttfontsuni.php'); + +class TTFontFile_Analysis EXTENDS TTFontFile { + + // Used to get font information from files in directory + function extractCoreInfo($file, $TTCfontID=0) { + $this->filename = $file; + $this->fh = fopen($file,'rb'); + if (!$this->fh) { return ('ERROR - Can\'t open file ' . $file); } + $this->_pos = 0; + $this->charWidths = ''; + $this->glyphPos = array(); + $this->charToGlyph = array(); + $this->tables = array(); + $this->otables = array(); + $this->ascent = 0; + $this->descent = 0; + $this->numTTCFonts = 0; + $this->TTCFonts = array(); + $this->version = $version = $this->read_ulong(); + $this->panose = array(); // mPDF 5.0 + if ($version==0x4F54544F) + return("ERROR - NOT ADDED as Postscript outlines are not supported - " . $file); + if ($version==0x74746366) { + if ($TTCfontID > 0) { + $this->version = $version = $this->read_ulong(); // TTC Header version now + if (!in_array($version, array(0x00010000,0x00020000))) + return("ERROR - NOT ADDED as Error parsing TrueType Collection: version=".$version." - " . $file); + } + else return("ERROR - Error parsing TrueType Collection - " . $file); + $this->numTTCFonts = $this->read_ulong(); + for ($i=1; $i<=$this->numTTCFonts; $i++) { + $this->TTCFonts[$i]['offset'] = $this->read_ulong(); + } + $this->seek($this->TTCFonts[$TTCfontID]['offset']); + $this->version = $version = $this->read_ulong(); // TTFont version again now + $this->readTableDirectory(false); + } + else { + if (!in_array($version, array(0x00010000,0x74727565))) + return("ERROR - NOT ADDED as Not a TrueType font: version=".$version." - " . $file); + $this->readTableDirectory(false); + } + +/* Included for testing... + $cmap_offset = $this->seek_table("cmap"); + $this->skip(2); + $cmapTableCount = $this->read_ushort(); + $unicode_cmap_offset = 0; + for ($i=0;$i<$cmapTableCount;$i++) { + $x[$i]['platformId'] = $this->read_ushort(); + $x[$i]['encodingId'] = $this->read_ushort(); + $x[$i]['offset'] = $this->read_ulong(); + $save_pos = $this->_pos; + $x[$i]['format'] = $this->get_ushort($cmap_offset + $x[$i]['offset'] ); + $this->seek($save_pos ); + } + print_r($x); exit; +*/ + /////////////////////////////////// + // name - Naming table + /////////////////////////////////// + +/* Test purposes - displays table of names + $name_offset = $this->seek_table("name"); + $format = $this->read_ushort(); + if ($format != 0 && $format != 1) // mPDF 5.3.73 + die("Unknown name table format ".$format); + $numRecords = $this->read_ushort(); + $string_data_offset = $name_offset + $this->read_ushort(); + for ($i=0;$i<$numRecords; $i++) { + $x[$i]['platformId'] = $this->read_ushort(); + $x[$i]['encodingId'] = $this->read_ushort(); + $x[$i]['languageId'] = $this->read_ushort(); + $x[$i]['nameId'] = $this->read_ushort(); + $x[$i]['length'] = $this->read_ushort(); + $x[$i]['offset'] = $this->read_ushort(); + + $N = ''; + if ($x[$i]['platformId'] == 1 && $x[$i]['encodingId'] == 0 && $x[$i]['languageId'] == 0) { // Roman + $opos = $this->_pos; + $N = $this->get_chunk($string_data_offset + $x[$i]['offset'] , $x[$i]['length'] ); + $this->_pos = $opos; + $this->seek($opos); + } + else { // Unicode + $opos = $this->_pos; + $this->seek($string_data_offset + $x[$i]['offset'] ); + $length = $x[$i]['length'] ; + if ($length % 2 != 0) + $length -= 1; + // die("PostScript name is UTF-16BE string of odd length"); + $length /= 2; + $N = ''; + while ($length > 0) { + $char = $this->read_ushort(); + $N .= (chr($char)); + $length -= 1; + } + $this->_pos = $opos; + $this->seek($opos); + } + $x[$i]['names'][$nameId] = $N; + } + print_r($x); exit; +*/ + + $name_offset = $this->seek_table("name"); + $format = $this->read_ushort(); + if ($format != 0 && $format != 1) // mPDF 5.3.73 + return("ERROR - NOT ADDED as Unknown name table format ".$format." - " . $file); + $numRecords = $this->read_ushort(); + $string_data_offset = $name_offset + $this->read_ushort(); + $names = array(1=>'',2=>'',3=>'',4=>'',6=>''); + $K = array_keys($names); + $nameCount = count($names); + for ($i=0;$i<$numRecords; $i++) { + $platformId = $this->read_ushort(); + $encodingId = $this->read_ushort(); + $languageId = $this->read_ushort(); + $nameId = $this->read_ushort(); + $length = $this->read_ushort(); + $offset = $this->read_ushort(); + if (!in_array($nameId,$K)) continue; + $N = ''; + if ($platformId == 3 && $encodingId == 1 && $languageId == 0x409) { // Microsoft, Unicode, US English, PS Name + $opos = $this->_pos; + $this->seek($string_data_offset + $offset); + if ($length % 2 != 0) + $length += 1; + $length /= 2; + $N = ''; + while ($length > 0) { + $char = $this->read_ushort(); + $N .= (chr($char)); + $length -= 1; + } + $this->_pos = $opos; + $this->seek($opos); + } + else if ($platformId == 1 && $encodingId == 0 && $languageId == 0) { // Macintosh, Roman, English, PS Name + $opos = $this->_pos; + $N = $this->get_chunk($string_data_offset + $offset, $length); + $this->_pos = $opos; + $this->seek($opos); + } + if ($N && $names[$nameId]=='') { + $names[$nameId] = $N; + $nameCount -= 1; + if ($nameCount==0) break; + } + } + if ($names[6]) + $psName = preg_replace('/ /','-',$names[6]); + else if ($names[4]) + $psName = preg_replace('/ /','-',$names[4]); + else if ($names[1]) + $psName = preg_replace('/ /','-',$names[1]); + else + $psName = ''; + if (!$names[1] && !$psName) + return("ERROR - NOT ADDED as Could not find valid font name - " . $file); + $this->name = $psName; + if ($names[1]) { $this->familyName = $names[1]; } else { $this->familyName = $psName; } + if ($names[2]) { $this->styleName = $names[2]; } else { $this->styleName = 'Regular'; } + + /////////////////////////////////// + // head - Font header table + /////////////////////////////////// + $this->seek_table("head"); + $ver_maj = $this->read_ushort(); + $ver_min = $this->read_ushort(); + if ($ver_maj != 1) + return('ERROR - NOT ADDED as Unknown head table version '. $ver_maj .'.'. $ver_min." - " . $file); + $this->fontRevision = $this->read_ushort() . $this->read_ushort(); + $this->skip(4); + $magic = $this->read_ulong(); + if ($magic != 0x5F0F3CF5) + return('ERROR - NOT ADDED as Invalid head table magic ' .$magic." - " . $file); + $this->skip(2); + $this->unitsPerEm = $unitsPerEm = $this->read_ushort(); + $scale = 1000 / $unitsPerEm; + $this->skip(24); + $macStyle = $this->read_short(); + $this->skip(4); + $indexLocFormat = $this->read_short(); + + /////////////////////////////////// + // OS/2 - OS/2 and Windows metrics table + /////////////////////////////////// + $sFamily = ''; + $panose = ''; + $fsSelection = ''; + if (isset($this->tables["OS/2"])) { + $this->seek_table("OS/2"); + $this->skip(30); + $sF = $this->read_short(); + $sFamily = ($sF >> 8); + $this->_pos += 10; //PANOSE = 10 byte length + $panose = fread($this->fh,10); + $this->panose = array(); + for ($p=0;$p<strlen($panose);$p++) { $this->panose[] = ord($panose[$p]); } + $this->skip(20); + $fsSelection = $this->read_short(); + } + + /////////////////////////////////// + // post - PostScript table + /////////////////////////////////// + $this->seek_table("post"); + $this->skip(4); + $this->italicAngle = $this->read_short() + $this->read_ushort() / 65536.0; + $this->skip(4); + $isFixedPitch = $this->read_ulong(); + + + + /////////////////////////////////// + // cmap - Character to glyph index mapping table + /////////////////////////////////// + $cmap_offset = $this->seek_table("cmap"); + $this->skip(2); + $cmapTableCount = $this->read_ushort(); + $unicode_cmap_offset = 0; + for ($i=0;$i<$cmapTableCount;$i++) { + $platformID = $this->read_ushort(); + $encodingID = $this->read_ushort(); + $offset = $this->read_ulong(); + $save_pos = $this->_pos; + if (($platformID == 3 && $encodingID == 1) || $platformID == 0) { // Microsoft, Unicode + $format = $this->get_ushort($cmap_offset + $offset); + if ($format == 4) { + if (!$unicode_cmap_offset) $unicode_cmap_offset = $cmap_offset + $offset; + } + } + else if ((($platformID == 3 && $encodingID == 10) || $platformID == 0)) { // Microsoft, Unicode Format 12 table HKCS + $format = $this->get_ushort($cmap_offset + $offset); + if ($format == 12) { + $unicode_cmap_offset = $cmap_offset + $offset; + break; + } + } + $this->seek($save_pos ); + } + + if (!$unicode_cmap_offset) + return('ERROR - Font ('.$this->filename .') NOT ADDED as it is not Unicode encoded, and cannot be used by mPDF'); + + $rtl = false; + $indic = false; + $cjk = false; + $sip = false; + $smp = false; + $pua = false; + $puaag = false; + $glyphToChar = array(); + $unAGlyphs = ''; + // Format 12 CMAP does characters above Unicode BMP i.e. some HKCS characters U+20000 and above + if ($format == 12) { + $this->seek($unicode_cmap_offset + 4); + $length = $this->read_ulong(); + $limit = $unicode_cmap_offset + $length; + $this->skip(4); + $nGroups = $this->read_ulong(); + for($i=0; $i<$nGroups ; $i++) { + $startCharCode = $this->read_ulong(); + $endCharCode = $this->read_ulong(); + $startGlyphCode = $this->read_ulong(); + if (($endCharCode > 0x20000 && $endCharCode < 0x2A6DF) || ($endCharCode > 0x2F800 && $endCharCode < 0x2FA1F)) { + $sip = true; + } + if ($endCharCode > 0x10000 && $endCharCode < 0x1FFFF) { + $smp = true; + } + if (($endCharCode > 0x0590 && $endCharCode < 0x077F) || ($endCharCode > 0xFE70 && $endCharCode < 0xFEFF) || ($endCharCode > 0xFB50 && $endCharCode < 0xFDFF)) { + $rtl = true; + } + if ($endCharCode > 0x0900 && $endCharCode < 0x0DFF) { + $indic = true; + } + if ($endCharCode > 0xE000 && $endCharCode < 0xF8FF) { + $pua = true; + if ($endCharCode > 0xF500 && $endCharCode < 0xF7FF) { + $puaag = true; + } + } + if (($endCharCode > 0x2E80 && $endCharCode < 0x4DC0) || ($endCharCode > 0x4E00 && $endCharCode < 0xA4CF) || ($endCharCode > 0xAC00 && $endCharCode < 0xD7AF) || ($endCharCode > 0xF900 && $endCharCode < 0xFAFF) || ($endCharCode > 0xFE30 && $endCharCode < 0xFE4F)) { + $cjk = true; + } + + $offset = 0; + // Get each glyphToChar - only point if going to analyse un-mapped Arabic Glyphs + if (isset($this->tables['post'])) { + for ($unichar=$startCharCode;$unichar<=$endCharCode;$unichar++) { + $glyph = $startGlyphCode + $offset ; + $offset++; + $glyphToChar[$glyph][] = $unichar; + } + } + + + } + } + + else { // Format 4 CMap + $this->seek($unicode_cmap_offset + 2); + $length = $this->read_ushort(); + $limit = $unicode_cmap_offset + $length; + $this->skip(2); + + $segCount = $this->read_ushort() / 2; + $this->skip(6); + $endCount = array(); + for($i=0; $i<$segCount; $i++) { $endCount[] = $this->read_ushort(); } + $this->skip(2); + $startCount = array(); + for($i=0; $i<$segCount; $i++) { $startCount[] = $this->read_ushort(); } + $idDelta = array(); + for($i=0; $i<$segCount; $i++) { $idDelta[] = $this->read_short(); } + $idRangeOffset_start = $this->_pos; + $idRangeOffset = array(); + for($i=0; $i<$segCount; $i++) { $idRangeOffset[] = $this->read_ushort(); } + + for ($n=0;$n<$segCount;$n++) { + if (($endCount[$n] > 0x0590 && $endCount[$n] < 0x077F) || ($endCount[$n] > 0xFE70 && $endCount[$n] < 0xFEFF) || ($endCount[$n] > 0xFB50 && $endCount[$n] < 0xFDFF)) { + $rtl = true; + } + if ($endCount[$n] > 0x0900 && $endCount[$n] < 0x0DFF) { + $indic = true; + } + if (($endCount[$n] > 0x2E80 && $endCount[$n] < 0x4DC0) || ($endCount[$n] > 0x4E00 && $endCount[$n] < 0xA4CF) || ($endCount[$n] > 0xAC00 && $endCount[$n] < 0xD7AF) || ($endCount[$n] > 0xF900 && $endCount[$n] < 0xFAFF) || ($endCount[$n] > 0xFE30 && $endCount[$n] < 0xFE4F)) { + $cjk = true; + } + if ($endCount[$n] > 0xE000 && $endCount[$n] < 0xF8FF) { + $pua = true; + if ($endCount[$n] > 0xF500 && $endCount[$n] < 0xF7FF) { + $puaag = true; + } + } + // Get each glyphToChar - only point if going to analyse un-mapped Arabic Glyphs + if (isset($this->tables['post'])) { + $endpoint = ($endCount[$n] + 1); + for ($unichar=$startCount[$n];$unichar<$endpoint;$unichar++) { + if ($idRangeOffset[$n] == 0) + $glyph = ($unichar + $idDelta[$n]) & 0xFFFF; + else { + $offset = ($unichar - $startCount[$n]) * 2 + $idRangeOffset[$n]; + $offset = $idRangeOffset_start + 2 * $n + $offset; + if ($offset >= $limit) + $glyph = 0; + else { + $glyph = $this->get_ushort($offset); + if ($glyph != 0) + $glyph = ($glyph + $idDelta[$n]) & 0xFFFF; + } + } + $glyphToChar[$glyph][] = $unichar; + } + } + + } + } + // 'POST' table for un-mapped arabic glyphs + if (isset($this->tables['post'])) { + $this->seek_table("post"); + // Only works on Format 2.0 + $formata = $this->read_ushort(); + $formatb = $this->read_ushort(); + if ($formata == 2 && $formatb == 0) { + $this->skip(28); + $nGlyfs = $this->read_ushort(); + $glyphNameIndex = array(); + for ($i=0; $i<$nGlyfs; $i++) { + $glyphNameIndex[($this->read_ushort())] = $i; + } + + $opost = $this->get_table('post'); + $ptr = 34+($nGlyfs*2); + for ($i=0; $i<$nGlyfs; $i++) { + $len = ord(substr($opost,$ptr,1)); + $ptr++; + $name = substr($opost,$ptr,$len); + $gid = $glyphNameIndex[$i+258]; + // Select uni0600.xxx(x) - uni06FF.xxx(x) + if (preg_match('/^uni(06[0-9a-f]{2})\.(fina|medi|init|fin|med|ini)$/i',$name,$m)) { + if (!isset($glyphToChar[$gid]) || (isset($glyphToChar[$gid]) && is_array($glyphToChar[$gid]) && count($glyphToChar[$gid])==1 && $glyphToChar[$gid][0]>57343 && $glyphToChar[$gid][0]<63489)) { // if set in PUA private use area E000-F8FF, or NOT Unicode mapped + $uni = hexdec($m[1]); + $form = strtoupper(substr($m[2],0,1)); + // Assign new PUA Unicode between F500 - F7FF + $bit = $uni & 0xFF; + if ($form == 'I') { $bit += 0xF600; } + else if ($form == 'M') { $bit += 0xF700; } + else { $bit += 0xF500; } + $unAGlyphs .= $gid; + $name = 'uni'.strtoupper($m[1]).'.'.strtolower($m[2]); + $unAGlyphs .= ' : '.$name; + $unihexstr = $m[1]; + $unAGlyphs .= ' : '.$unihexstr; + $unAGlyphs .= ' : '.$uni; + $unAGlyphs .= ' : '.$form; + // if already set in PUA private use area E000-F8FF + if (isset($glyphToChar[$gid]) && $glyphToChar[$gid][0]>57343 && $glyphToChar[$gid][0]<63489) { + $unAGlyphs .= ' : '.$glyphToChar[$gid][0].' {'.dechex($glyphToChar[$gid][0]).'}'; + } + //else $unAGlyphs .= ':'; + $unAGlyphs .= ' : '.strtoupper(dechex($bit)); + $unAGlyphs .= '<br />'; + } + } + $ptr += $len; + } + if ($unAGlyphs) { + $unAGlyphs = 'GID:Name:Unicode base Hex:Dec:Form:PUA Unicode<br />'.$unAGlyphs ; + } + } + } + + + + $bold = false; + $italic = false; + $ftype = ''; + if ($macStyle & (1 << 0)) { $bold = true; } // bit 0 bold + else if ($fsSelection & (1 << 5)) { $bold = true; } // 5 BOLD Characters are emboldened + + if ($macStyle & (1 << 1)) { $italic = true; } // bit 1 italic + else if ($fsSelection & (1 << 0)) { $italic = true; } // 0 ITALIC Font contains Italic characters, otherwise they are upright + else if ($this->italicAngle <> 0) { $italic = true; } + + if ($isFixedPitch ) { $ftype = 'mono'; } + else if ($sFamily >0 && $sFamily <8) { $ftype = 'serif'; } + else if ($sFamily ==8) { $ftype = 'sans'; } + else if ($sFamily ==10) { $ftype = 'cursive'; } + // Use PANOSE + if ($panose) { + $bFamilyType=ord($panose[0]); + if ($bFamilyType==2) { + $bSerifStyle=ord($panose[1]); + if (!$ftype) { + if ($bSerifStyle>1 && $bSerifStyle<11) { $ftype = 'serif'; } + else if ($bSerifStyle>10) { $ftype = 'sans'; } + } + $bProportion=ord($panose[3]); + if ($bProportion==9 || $bProportion==1) { $ftype = 'mono'; } // ==1 i.e. No Fit needed for OCR-a and -b + } + else if ($bFamilyType==3) { + $ftype = 'cursive'; + } + } + + fclose($this->fh); + return array($this->familyName, $bold, $italic, $ftype, $TTCfontID, $rtl, $indic, $cjk, $sip, $smp, $puaag, $pua, $unAGlyphs); + } + + + + +} + + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/classes/wmf.php b/application/third_party/mpdf/classes/wmf.php new file mode 100644 index 0000000..e5f5e3c --- /dev/null +++ b/application/third_party/mpdf/classes/wmf.php @@ -0,0 +1,236 @@ +<?php + +class wmf { + +var $mpdf = null; +var $gdiObjectArray; + +function wmf(&$mpdf) { + $this->mpdf = $mpdf; +} + + +function _getWMFimage($data) { + $k = _MPDFK; + + $this->gdiObjectArray = array(); + $a=unpack('stest',"\1\0"); + if ($a['test']!=1) + return array(0, 'Error parsing WMF image - Big-endian architecture not supported'); + // check for Aldus placeable metafile header + $key = unpack('Lmagic', substr($data, 0, 4)); + $p = 18; // WMF header + if ($key['magic'] == (int)0x9AC6CDD7) { $p +=22; } // Aldus header + // define some state variables + $wo=null; // window origin + $we=null; // window extent + $polyFillMode = 0; + $nullPen = false; + $nullBrush = false; + $endRecord = false; + $wmfdata = ''; + while ($p < strlen($data) && !$endRecord) { + $recordInfo = unpack('Lsize/Sfunc', substr($data, $p, 6)); $p += 6; + // size of record given in WORDs (= 2 bytes) + $size = $recordInfo['size']; + // func is number of GDI function + $func = $recordInfo['func']; + if ($size > 3) { + $parms = substr($data, $p, 2*($size-3)); $p += 2*($size-3); + } + switch ($func) { + case 0x020b: // SetWindowOrg + // do not allow window origin to be changed + // after drawing has begun + if (!$wmfdata) + $wo = array_reverse(unpack('s2', $parms)); + break; + case 0x020c: // SetWindowExt + // do not allow window extent to be changed + // after drawing has begun + if (!$wmfdata) + $we = array_reverse(unpack('s2', $parms)); + break; + case 0x02fc: // CreateBrushIndirect + $brush = unpack('sstyle/Cr/Cg/Cb/Ca/Shatch', $parms); + $brush['type'] = 'B'; + $this->_AddGDIObject($brush); + break; + case 0x02fa: // CreatePenIndirect + $pen = unpack('Sstyle/swidth/sdummy/Cr/Cg/Cb/Ca', $parms); + // convert width from twips to user unit + $pen['width'] /= (20 * $k); + $pen['type'] = 'P'; + $this->_AddGDIObject($pen); + break; + + // MUST create other GDI objects even if we don't handle them + case 0x06fe: // CreateBitmap + case 0x02fd: // CreateBitmapIndirect + case 0x00f8: // CreateBrush + case 0x02fb: // CreateFontIndirect + case 0x00f7: // CreatePalette + case 0x01f9: // CreatePatternBrush + case 0x06ff: // CreateRegion + case 0x0142: // DibCreatePatternBrush + $dummyObject = array('type'=>'D'); + $this->_AddGDIObject($dummyObject); + break; + case 0x0106: // SetPolyFillMode + $polyFillMode = unpack('smode', $parms); + $polyFillMode = $polyFillMode['mode']; + break; + case 0x01f0: // DeleteObject + $idx = unpack('Sidx', $parms); + $idx = $idx['idx']; + $this->_DeleteGDIObject($idx); + break; + case 0x012d: // SelectObject + $idx = unpack('Sidx', $parms); + $idx = $idx['idx']; + $obj = $this->_GetGDIObject($idx); + switch ($obj['type']) { + case 'B': + $nullBrush = false; + if ($obj['style'] == 1) { $nullBrush = true; } + else { + $wmfdata .= $this->mpdf->SetFColor($this->mpdf->ConvertColor('rgb('.$obj['r'].','.$obj['g'].','.$obj['b'].')'), true)."\n"; + } + break; + case 'P': + $nullPen = false; + $dashArray = array(); + // dash parameters are custom + switch ($obj['style']) { + case 0: // PS_SOLID + break; + case 1: // PS_DASH + $dashArray = array(3,1); + break; + case 2: // PS_DOT + $dashArray = array(0.5,0.5); + break; + case 3: // PS_DASHDOT + $dashArray = array(2,1,0.5,1); + break; + case 4: // PS_DASHDOTDOT + $dashArray = array(2,1,0.5,1,0.5,1); + break; + case 5: // PS_NULL + $nullPen = true; + break; + } + if (!$nullPen) { + $wmfdata .= $this->mpdf->SetDColor($this->mpdf->ConvertColor('rgb('.$obj['r'].','.$obj['g'].','.$obj['b'].')'), true)."\n"; + $wmfdata .= sprintf("%.3F w\n",$obj['width']*$k); + } + if (!empty($dashArray)) { + $s = '['; + for ($i=0; $i<count($dashArray);$i++) { + $s .= $dashArray[$i] * $k; + if ($i != count($dashArray)-1) { $s .= ' '; } + } + $s .= '] 0 d'; + $wmfdata .= $s."\n"; + } + break; + } + break; + case 0x0325: // Polyline + case 0x0324: // Polygon + $coords = unpack('s'.($size-3), $parms); + $numpoints = $coords[1]; + for ($i = $numpoints; $i > 0; $i--) { + $px = $coords[2*$i]; + $py = $coords[2*$i+1]; + + if ($i < $numpoints) { $wmfdata .= $this->_LineTo($px, $py); } + else { $wmfdata .= $this->_MoveTo($px, $py); } + } + if ($func == 0x0325) { $op = 's'; } + else if ($func == 0x0324) { + if ($nullPen) { + if ($nullBrush) { $op = 'n'; } // no op + else { $op = 'f'; } // fill + } + else { + if ($nullBrush) { $op = 's'; } // stroke + else { $op = 'b'; } // stroke and fill + } + if ($polyFillMode==1 && ($op=='b' || $op=='f')) { $op .= '*'; } // use even-odd fill rule + } + $wmfdata .= $op."\n"; + break; + case 0x0538: // PolyPolygon + $coords = unpack('s'.($size-3), $parms); + $numpolygons = $coords[1]; + $adjustment = $numpolygons; + for ($j = 1; $j <= $numpolygons; $j++) { + $numpoints = $coords[$j + 1]; + for ($i = $numpoints; $i > 0; $i--) { + $px = $coords[2*$i + $adjustment]; + $py = $coords[2*$i+1 + $adjustment]; + if ($i == $numpoints) { $wmfdata .= $this->_MoveTo($px, $py); } + else { $wmfdata .= $this->_LineTo($px, $py); } + } + $adjustment += $numpoints * 2; + } + + if ($nullPen) { + if ($nullBrush) { $op = 'n'; } // no op + else { $op = 'f'; } // fill + } + else { + if ($nullBrush) { $op = 's'; } // stroke + else { $op = 'b'; } // stroke and fill + } + if ($polyFillMode==1 && ($op=='b' || $op=='f')) { $op .= '*'; } // use even-odd fill rule + $wmfdata .= $op."\n"; + break; + case 0x0000: + $endRecord = true; + break; + } + } + + + return array(1,$wmfdata,$wo,$we); +} + + +function _MoveTo($x, $y) { + return "$x $y m\n"; +} + +// a line must have been started using _MoveTo() first +function _LineTo($x, $y) { + return "$x $y l\n"; +} + +function _AddGDIObject($obj) { + // find next available slot + $idx = 0; + if (!empty($this->gdiObjectArray)) { + $empty = false; + $i = 0; + while (!$empty) { + $empty = !isset($this->gdiObjectArray[$i]); + $i++; + } + $idx = $i-1; + } + $this->gdiObjectArray[$idx] = $obj; +} + +function _GetGDIObject($idx) { + return $this->gdiObjectArray[$idx]; +} + +function _DeleteGDIObject($idx) { + unset($this->gdiObjectArray[$idx]); +} + + +} + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/compress.php b/application/third_party/mpdf/compress.php new file mode 100644 index 0000000..785bf6a --- /dev/null +++ b/application/third_party/mpdf/compress.php @@ -0,0 +1,172 @@ +<?php + +$excl = array( 'HTML-CSS', 'DIRECTW', 'TABLES', 'LISTS', 'IMAGES-CORE', +'IMAGES-BMP', 'IMAGES-WMF', 'TABLES-ADVANCED-BORDERS', 'HTMLHEADERS-FOOTERS', 'COLUMNS', 'TOC', 'INDEX', 'BOOKMARKS', 'BARCODES', 'FORMS', 'WATERMARK', 'CJK-FONTS', 'RTL', 'INDIC', 'ANNOTATIONS', 'BACKGROUNDS', 'CSS-FLOAT', 'CSS-IMAGE-FLOAT', 'CSS-POSITION', 'CSS-PAGE', 'BORDER-RADIUS', 'HYPHENATION', 'ENCRYPTION', 'IMPORTS', 'PROGRESS-BAR'); + + + // *DIRECTW* = Write, WriteText, WriteCell, Text, Shaded_box, AutosizeText + // IMAGES-CORE = [PNG, GIF, and JPG] NB background-images and watermark images + + // Excluding 'HTML-CSS' will also exclude: 'TABLES', 'LISTS', 'TABLES-ADVANCED-BORDERS', 'HTMLHEADERS-FOOTERS', 'FORMS', 'BACKGROUNDS', 'CSS-FLOAT', 'CSS-IMAGE-FLOAT', 'CSS-POSITION', 'CSS-PAGE', 'BORDER-RADIUS' + +// Text is marked in mpdf_source.php with e.g. : +/*-- TABLES-ADVANCED-BORDERS --*/ +/*-- END TABLES-ADVANCED-BORDERS --*/ + // *TABLES-ADVANCED-BORDERS* + + +if (!isset($_POST['generate']) || $_POST['generate']!='generate') { + + +if (!file_exists('mpdf_source.php')) { + die("ERROR - Could not find mpdf_source.php file in current directory. Please rename mpdf.php as mpdf_source.php"); +} + + + + +echo '<html> +<head> +<script language=javascript> +checked=false; +function checkedAll (frm1) { + var aa= document.getElementById("frm1"); + if (checked == false) + { + checked = true + } + else + { + checked = false + } + for (var i =0; i < aa.elements.length; i++) + { + aa.elements[i].checked = checked; + } + } +</script> +</head> +<body> +<p><span style="color:red; font-weight: bold;">WARNING</span>: This utility will OVERWRITE mpdf.php file in the current directory.</p> +<p>Select the functions you wish to INCLUDE in your mpdf.php program. When you click generate, a new mpdf.php file will be written to the current directory.</p> +<div><b>Notes</b> +<ul> +<li>HTML-CSS is required for many of the other functions to work including: Tables, Lists, Backgrounds, Forms, Border-radius and all other CSS</li> +<li>DIRECTW includes the functions to Write directly to the PDF file e.g. Write, WriteText, WriteCell, Text, Shaded_box, AutosizeText</li> +<li>You must include either HTML-CSS or DIRECTW</li> +<li>JPG, PNG and JPG images are supported with IMAGES-CORE</li> +<li>For WMF Images, you must include both IMAGES-CORE and IMAGES-WMF</li> +<li>IMAGES-CORE are required for BACKGROUNDS (IMAGES) or WATERMARKS to work</li> +</ul> +</div> +<input type="checkbox" name="checkall" onclick="checkedAll(frm1);"> <i>Select/Unselect All</i><br /><br /> + +<form id="frm1" action="compress.php" method="POST"> +'; +foreach($excl AS $k=>$ex) { + echo '<input type="checkbox" value="1" name="inc['.$ex.']"'; + if ($k==0 || ($k > 1 && $k < 5)) { + echo ' checked="checked"'; + } + echo ' /> '.$ex.'<br />'; +} + +echo '<br /> +<input type="submit" name="generate" value="generate" /> +</form> +</body> +</html>'; +exit; +} + +$inc = $_POST['inc']; +if (is_array($inc) && count($inc)>0 ) { + foreach($inc AS $i=>$v) { + $key = array_search($i, $excl); + unset($excl[$key]); + } +} + +if (!defined('PHP_VERSION_ID')) { + $version = explode('.', PHP_VERSION); + define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2])); +} +if (PHP_VERSION_ID < 50300) { $mqr = @get_magic_quotes_runtime(); } + else { $mqr=0; } +if ($mqr) { set_magic_quotes_runtime(0); } + +$l = file('mpdf_source.php'); +if (!count($l)) { die("ERROR - Could not find mpdf_source.php file in current directory"); } +$exclflags = array(); +$x = ''; + + // Excluding 'HTML-CSS' will also exclude: 'TABLES', 'LISTS', 'TABLES-ADVANCED-BORDERS', 'HTMLHEADERS-FOOTERS', 'FORMS', 'BACKGROUNDS', 'CSS-FLOAT', 'CSS-IMAGE-FLOAT', 'CSS-POSITION', 'CSS-PAGE', 'BORDER-RADIUS' +if ($excl[0]=='HTML-CSS') { + $excl[] = 'TABLES'; + $excl[] = 'LISTS'; + $excl[] = 'TABLES-ADVANCED-BORDERS'; + $excl[] = 'HTMLHEADERS-FOOTERS'; + $excl[] = 'FORMS'; + $excl[] = 'BACKGROUNDS'; + $excl[] = 'CSS-FLOAT'; + $excl[] = 'CSS-IMAGE-FLOAT'; + $excl[] = 'CSS-POSITION'; + $excl[] = 'CSS-PAGE'; + $excl[] = 'BORDER-RADIUS'; +} +$excl = array_unique($excl); + +foreach($l AS $k=>$ln) { + $exclude = false; + // *XXXXX* + preg_match_all("/\/\/ \*([A-Za-z\-]+)\*/", $ln, $m); + foreach($m[1] AS $mm) { + if (in_array($mm, $excl)) { + $exclude = true; + } + } + /*-- XXXXX --*/ + preg_match_all("/\/\*-- ([A-Za-z\-]+) --\*\//", $ln, $m); + foreach($m[1] AS $mm) { + if (in_array($mm, $excl)) { + $exclflags[$mm] = true; + } + $exclude = true; + } + $exclflags = array_unique($exclflags); + /*-- END XXXX --*/ + preg_match_all("/\/\*-- END ([A-Za-z\-]+) --\*\//", $ln, $m); + foreach($m[1] AS $mm) { + if (in_array($mm, $excl)) { + unset($exclflags[$mm]); + } + $exclude = true; + } + if (count($exclflags)==0 && !$exclude) { + $x .= $ln; + } +} +// mPDF 5.0 +if (function_exists('file_put_contents')) { + $check = file_put_contents('mpdf.php', $x); +} +else { + $f=fopen('mpdf.php', 'w'); + $check = fwrite($f, $x); + fclose($f); +} +if (!$check) { die("ERROR - Could not write to mpdf.php file. Are permissions correctly set?"); } +echo '<p><b>mPDF file generated successfully!</b></p>'; +echo '<div>mPDF file size '.number_format((strlen($x)/1024)).' kB</div>'; + +unset($l); +unset($x); + +include('mpdf.php'); +$mpdf = new mPDF(); + +echo '<div>Memory usage on loading mPDF class '.number_format((memory_get_usage(true)/(1024*1024)),2).' MB</div>'; + +exit; + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/config.php b/application/third_party/mpdf/config.php new file mode 100644 index 0000000..1657677 --- /dev/null +++ b/application/third_party/mpdf/config.php @@ -0,0 +1,572 @@ +<?php + +// mPDF 5.7 +// Specify whether to automatically generate bookmarks or ToC entries from h1 - h6 tags +$this->h2bookmarks = array(); +$this->h2toc = array(); +/* Define arrays with e.g. the tag=>ToC-level +Remember bookmark and ToC levels start at 0 +(does not work inside tables) +Only the default ToC will be used if > 1 ToCs are defined for the document +H1 - H6 must be uppercase +$this->h2toc = array('H1'=>0, 'H2'=>1, 'H3'=>2); +$this->h2bookmarks = array('H1'=>0, 'H2'=>1, 'H3'=>2); +*/ + +// mPDF 5.7 +// Text-align on decimal marks +// Allowed characters for alignment on decimal marks. Additional codes must start with D +// Non-ASCII characters should be in utf-8 encoding +// DM - middot U+00B7 +// DA - arabic decimal mark U+066B +$this->decimal_align = array('DP'=>'.', 'DC'=>',', 'DM'=>"\xc2\xb7", 'DA'=>"\xd9\xab", 'DD'=>'-'); + +// PAGING +$this->mirrorMargins = 0; +$this->restoreBlockPagebreaks = false; +$this->forcePortraitMargins = false; +$this->displayDefaultOrientation = false; +$this->printers_info = false; // Adds date and page info for printer when using @page and "marks:crop;" +$this->bleedMargin = 5; +$this->crossMarkMargin = 5; // Distance of cross mark from margin in mm +$this->cropMarkMargin = 8; // Distance of crop mark from margin in mm +$this->cropMarkLength = 18; // Default length in mm of crop line +$this->nonPrintMargin = 8; // Non-printable border at edge of paper sheet in mm +// mPDF 5.5 +// Avoid just the border/background-color of the end of a block being moved on to next page +$this->margBuffer = 2; // Allows an (empty) end of block to extend beyond the bottom margin by this amount (mm) + + +// PAGE NUMBERING +$this->pagenumPrefix; +$this->pagenumSuffix; +$this->nbpgPrefix; +$this->nbpgSuffix; + + +// FONTS, LANGUAGES & CHARACTER SETS +// Set maximum size of TTF font file to allow non-subsets - in kB +// Used to avoid e.g. Arial Unicode MS (perhaps used for substitutions) to ever be fully embedded +// NB Free serif is 1.5MB, most files are <= 600kB (most 200-400KB) +$this->maxTTFFilesize = 2000; + +// this value determines whether to subset or not +// 0 - 100 = percent characters +// i.e. if ==40, mPDF will embed whole font if >40% characters in that font +// or embed subset if <40% characters +// 0 will force whole file to be embedded (NO subsetting) +// 100 will force always to subset +// This value is overridden if you set new mPDF('s) +// and/or Can set at runtime +$this->percentSubset = 30; + +$this->useAdobeCJK = false; // Uses Adobe CJK fonts for CJK languages + // default TRUE; only set false if you have defined some available fonts that support CJK + // If true this will not stop use of other CJK fonts if specified by font-family: + // and vice versa i.e. only dictates behaviour when specified by lang="" incl. AutoFont() + +// When embedding full TTF font files, remakes the font file using only core tables +// May improve function with some PostScript printers (GhostScript/GSView) +// Does not work with TTC font collections +// Slightly smaller file; increased processing time +$this->repackageTTF = false; + +// Allows automatic character set conversion if "charset=xxx" detected in html header (WriteHTML() ) +$this->allow_charset_conversion = true; +$this->biDirectional=false; // automatically determine BIDI text in LTR page +$this->autoFontGroupSize = 2; // 1: individual words are spanned; 2: words+; 3: as big chunks as possible. +$this->useLang = true; // Default changed in mPDF 4.0 + +$this->useSubstitutions = false; // Substitute missing characters in UTF-8(multibyte) documents - from other fonts +$this->falseBoldWeight = 5; // Weight for bold text when using an artificial (outline) bold; value 0 (off) - 10 (rec. max) + +// CONFIGURATION +$this->allow_output_buffering = false; + +$this->enableImports = false; // Adding mPDFI functions + +$this->collapseBlockMargins = true; // Allows top and bottom margins to collapse between block elements +$this->progressBar = 0; // Shows progress-bars whilst generating file 0 off, 1 simple, 2 advanced +$this->progbar_heading = 'mPDF file progress'; +$this->progbar_altHTML = ''; // Should include <html> and <body> but NOT end tags + // Can incude <head> and link to stylesheet etc. + // e.g. '<html><body><p><img src="loading.gif" /> Creating PDF file. Please wait...</p>'; + +$this->dpi = 96; // To interpret "px" pixel values in HTML/CSS (see img_dpi below) + +// Automatically correct for tags where HTML specifies optional end tags e.g. P,LI,DD,TD +// If you are confident input html is valid XHTML, turning this off may make it more reliable(?) +$this->allow_html_optional_endtags = true; + +$this->ignore_invalid_utf8 = false; +$this->text_input_as_HTML = false; // Converts all entities in Text inputs to UTF-8 before encoding +$this->useGraphs = false; + + +// When writing a block element with position:fixed and overflow:auto, mPDF scales it down to fit in the space +// by repeatedly rewriting it and making adjustments. These values give the adjustments used, depending how far out +// the previous guess was. The lower the number, the quicker it will finish, but the less accurate the fit may be. +// FPR1 is for coarse adjustments, and FPR4 for fine adjustments when it is getting closer. +$this->incrementFPR1 = 10; // i.e. will alter by 1/[10]th of width and try again until within closer limits +$this->incrementFPR2 = 20; +$this->incrementFPR3 = 30; +$this->incrementFPR4 = 50; // i.e. will alter by 1/[50]th of width and try again when it nearly fits + + +// COLORSPACE +// 1 - allow GRAYSCALE only [convert CMYK/RGB->gray] +// 2 - allow RGB / SPOT COLOR / Grayscale [convert CMYK->RGB] +// 3 - allow CMYK / SPOT COLOR / Grayscale [convert RGB->CMYK] +$this->restrictColorSpace = 0; + +// PDFX/1-a Compliant files +$this->PDFX = false; // true=Forces compliance with PDFX-1a spec + // Cannot be used with $this->restrictColorSpace (i.e. no RGB) +$this->PDFXauto = false; // Overrides warnings making changes when possible to force PDFX1-a compliance + + +// PDFA1-b Compliant files +$this->PDFA = false; // true=Forces compliance with PDFA-1b spec + // Can use with $this->restrictColorSpace=3 (for a CMYK file) + // Any other settings, uses RGB profile +$this->PDFAauto = false; // Overrides warnings making changes when possible to force PDFA1-b compliance +$this->ICCProfile = ''; // Colour profile OutputIntent + // sRGB_IEC61966-2-1 (=default if blank and PDFA), or other added .icc profile + // Must be CMYK for PDFX, or appropriate type for PDFA(RGB or CMYK) + + + +// DEBUGGING & DEVELOPERS +$this->showStats = false; +$this->debug = false; +$this->debugfonts = false; // Checks and reports on errors when parsing TTF files - adds significantly to processing time +$this->showImageErrors = false; +$this->table_error_report = false; // Die and report error if table is too wide to contain whole words +$this->table_error_report_param = ''; // Parameter which can be passed to show in error report i.e. chapter number being processed// + + +// ANNOTATIONS +$this->title2annots = false; +$this->annotSize = 0.5; // default mm for Adobe annotations - nominal +$this->annotMargin; // default position for Annotations +$this->annotOpacity = 0.5; // default opacity for Annotations + +// BOOKMARKS +$this->anchor2Bookmark = 0; // makes <a name=""> into a bookmark as well as internal link target; 1 = just name; 2 = name (p.34) +// Set an optional array to specify appearance of Bookmarks (by level) +// Default values are Black and normal style +/* + Example: +$this->bookmarkStyles = array( + 0 => array('color'=> array(0,64,128), 'style'=>'B'), + 1 => array('color'=> array(128,0,0), 'style'=>''), + 2 => array('color'=> array(0,128,0), 'style'=>'I'), +); +*/ +$this->bookmarkStyles = array(); + + +// CSS & STYLES +$this->CSSselectMedia='print'; // screen, print, or any other CSS @media type (not "all") + + +// PAGE HEADERS & FOOTERS +$this->forcePortraitHeaders = false; +// Values used if simple FOOTER/HEADER given i.e. not array +$this->defaultheaderfontsize = 8; // pt +$this->defaultheaderfontstyle = 'BI'; // '', or 'B' or 'I' or 'BI' +$this->defaultheaderline = 1; // 1 or 0 - line under the header +$this->defaultfooterfontsize = 8; // pt +$this->defaultfooterfontstyle = 'BI'; // '', or 'B' or 'I' or 'BI' +$this->defaultfooterline = 1; // 1 or 0 - line over the footer +$this->header_line_spacing = 0.25; // spacing between bottom of header and line (if present) - function of fontsize +$this->footer_line_spacing = 0.25; // spacing between bottom of header and line (if present) - function of fontsize +// If 'pad' margin-top sets fixed distance in mm (padding) between bottom of header and top of text. +// If 'stretch' margin-top sets a minimum distance in mm between top of page and top of text, which expands if header is too large to fit. +$this->setAutoTopMargin = false; +$this->setAutoBottomMargin = false; +$this->autoMarginPadding = 2; // distance in mm used as padding if 'stretch' mode is used + + + +// TABLES +$this->simpleTables = false; // Forces all cells to have same border, background etc. Improves performance +$this->packTableData = false; // Reduce memory usage processing tables (but with increased processing time) +// Using disk to cache table data can reduce memory usage dramatically, but at a cost of increased +// executon time and disk access (read and write) +$this->cacheTables = false; + +$this->ignore_table_percents = false; +$this->ignore_table_widths = false; +$this->keep_table_proportions = false; // If table width set > page width, force resizing but keep relative sizes + // Also forces respect of cell widths set by % +$this->shrink_tables_to_fit = 1.4; // automatically reduce fontsize in table if words would have to split ( not in CJK) + // 0 or false to disable; value (if set) gives maximum factor to reduce fontsize + +$this->tableMinSizePriority = false; // If page-break-inside:avoid but cannot fit on full page without + // exceeding autosize; setting this value to true will force respsect for + // autosize, and disable the page-break-inside:avoid + +$this->use_kwt = false; // "Keep-with-table" +$this->iterationCounter = false; // Set to TRUE to use table Head iteration counter +$this->splitTableBorderWidth = 0; // Use table border (using this width in mm) when table breaks across pages + // Recommended to use small value e.g. 0.01 + + +// IMAGES +$this->img_dpi = 96; // Default dpi to output images if size not defined + // See also above "dpi" + +// TEXT SPACING & JUSTIFICATION +$this->useKerning = false; // true to use kerning +$this->justifyB4br = false; // In justified text, <BR> does not cause the preceding text to be justified in browsers + // Change to true to force justification (as in MS Word) + +$this->tabSpaces = 8; // Number of spaces to replace for a TAB in <pre> sections + // Notepad uses 6, HTML specification recommends 8 +$this->jSWord = 0.4; // Proportion (/1) of space (when justifying margins) to allocate to Word vs. Character +$this->jSmaxChar = 2; // Maximum spacing to allocate to character spacing. (0 = no maximum) + +$this->jSmaxCharLast = 1; // Maximum character spacing allowed (carried over) when finishing a last line +$this->jSmaxWordLast = 2; // Maximum word spacing allowed (carried over) when finishing a last line +$this->normalLineheight = 1.33; // Value used for line-height when CSS specified as 'normal' (default) + +// Small Caps +$this->smCapsScale = 0.75; // Factor of 1 to scale capital letters +$this->smCapsStretch = 110; // % to stretch small caps horizontally (i.e. 100 = no stretch) + +// CJK Line-breaking +$this->allowCJKorphans = true; // FALSE=always wrap to next line; TRUE=squeeze or overflow +$this->allowCJKoverflow = false; // FALSE=squeeze; TRUE=overflow (only some characters, and disabled in tables) +$this->CJKforceend = false; // Forces overflowng punctuation to hang outside right margin mPDF 5.6.40 + +// HYPHENATION +$this->SHYlang = "en"; // Should be one of: 'en','de','es','fi','fr','it','nl','pl','ru','sv' +$this->SHYleftmin = 2; +$this->SHYrightmin = 2; +$this->SHYcharmin = 2; +$this->SHYcharmax = 10; + +// COLUMNS +$this->keepColumns = false; // Set to go to the second column only when the first is full of text etc. +$this->max_colH_correction = 1.15; // Maximum ratio to adjust column height when justifying - too large a value can give ugly results +$this->ColGap=5; + + +// LISTS +$this->list_align_style = 'R'; // Determines alignment of numbers in numbered lists +$this->list_indent_first_level = 0; // 1/0 yex/no to indent first level of list +$this->list_number_suffix = '.'; // Content to follow a numbered list marker e.g. '.' gives 1. or IV.; ')' gives 1) or a) + +// ACTIVE FORMS +$this->useActiveForms = false; + +// WATERMARKS +$this->watermarkImgBehind = false; +$this->showWatermarkText = 0; +$this->showWatermarkImage = 0; +$this->watermarkText = ''; +$this->watermarkImage = ''; +$this->watermark_font = ''; +$this->watermarkTextAlpha = 0.2; +$this->watermarkImageAlpha = 0.2; +$this->watermarkImgAlphaBlend = 'Normal'; + // Accepts any PDF spec. value: Normal, Multiply, Screen, Overlay, Darken, Lighten, ColorDodge, ColorBurn, + // HardLight, SoftLight, Difference, Exclusion + // "Multiply" works well for watermark image on top + +// BORDERS +$this->autoPadding = false; // Automatically increases padding in block elements when border-radius set - if required + + +////////////////////////////////////////////// + +// Default values if no style sheet offered (cf. http://www.w3.org/TR/CSS21/sample.html) +$this->defaultCSS = array( + 'BODY' => array( + 'FONT-FAMILY' => 'serif', + 'FONT-SIZE' => '11pt', + 'TEXT-INDENT' => '0pt', + 'LINE-HEIGHT' => 'normal', + 'MARGIN-COLLAPSE' => 'collapse', /* Custom property to collapse top/bottom margins at top/bottom of page - ignored in tables/lists */ + 'HYPHENS' => 'manual', /* mPDF 5.6.08 */ + ), + 'P' => array( + 'MARGIN' => '1.12em 0', + ), + 'H1' => array( + 'FONT-SIZE' => '2em', + 'FONT-WEIGHT' => 'bold', + 'MARGIN' => '0.67em 0', + 'PAGE-BREAK-AFTER' => 'avoid', + ), + 'H2' => array( + 'FONT-SIZE' => '1.5em', + 'FONT-WEIGHT' => 'bold', + 'MARGIN' => '0.75em 0', + 'PAGE-BREAK-AFTER' => 'avoid', + ), + 'H3' => array( + 'FONT-SIZE' => '1.17em', + 'FONT-WEIGHT' => 'bold', + 'MARGIN' => '0.83em 0', + 'PAGE-BREAK-AFTER' => 'avoid', + ), + 'H4' => array( + 'FONT-WEIGHT' => 'bold', + 'MARGIN' => '1.12em 0', + 'PAGE-BREAK-AFTER' => 'avoid', + ), + 'H5' => array( + 'FONT-SIZE' => '0.83em', + 'FONT-WEIGHT' => 'bold', + 'MARGIN' => '1.5em 0', + 'PAGE-BREAK-AFTER' => 'avoid', + ), + 'H6' => array( + 'FONT-SIZE' => '0.75em', + 'FONT-WEIGHT' => 'bold', + 'MARGIN' => '1.67em 0', + 'PAGE-BREAK-AFTER' => 'avoid', + ), + 'HR' => array( + 'COLOR' => '#888888', + 'TEXT-ALIGN' => 'center', + 'WIDTH' => '100%', + 'HEIGHT' => '0.2mm', + 'MARGIN-TOP' => '0.83em', + 'MARGIN-BOTTOM' => '0.83em', + ), + 'PRE' => array( + 'MARGIN' => '0.83em 0', + 'FONT-FAMILY' => 'monospace', + ), + 'S' => array( + 'TEXT-DECORATION' => 'line-through', + ), + 'STRIKE' => array( + 'TEXT-DECORATION' => 'line-through', + ), + 'DEL' => array( + 'TEXT-DECORATION' => 'line-through', + ), + 'SUB' => array( + 'VERTICAL-ALIGN' => 'sub', + 'FONT-SIZE' => '55%', /* Recommended 0.83em */ + ), + 'SUP' => array( + 'VERTICAL-ALIGN' => 'super', + 'FONT-SIZE' => '55%', /* Recommended 0.83em */ + ), + 'U' => array( + 'TEXT-DECORATION' => 'underline', + ), + 'INS' => array( + 'TEXT-DECORATION' => 'underline', + ), + 'B' => array( + 'FONT-WEIGHT' => 'bold', + ), + 'STRONG' => array( + 'FONT-WEIGHT' => 'bold', + ), + 'I' => array( + 'FONT-STYLE' => 'italic', + ), + 'CITE' => array( + 'FONT-STYLE' => 'italic', + ), + 'Q' => array( + 'FONT-STYLE' => 'italic', + ), + 'EM' => array( + 'FONT-STYLE' => 'italic', + ), + 'VAR' => array( + 'FONT-STYLE' => 'italic', + ), + 'SAMP' => array( + 'FONT-FAMILY' => 'monospace', + ), + 'CODE' => array( + 'FONT-FAMILY' => 'monospace', + ), + 'KBD' => array( + 'FONT-FAMILY' => 'monospace', + ), + 'TT' => array( + 'FONT-FAMILY' => 'monospace', + ), + 'SMALL' => array( + 'FONT-SIZE' => '83%', + ), + 'BIG' => array( + 'FONT-SIZE' => '117%', + ), + 'ACRONYM' => array( + 'FONT-SIZE' => '77%', + 'FONT-WEIGHT' => 'bold', + ), + 'ADDRESS' => array( + 'FONT-STYLE' => 'italic', + ), + 'BLOCKQUOTE' => array( + 'MARGIN-LEFT' => '40px', + 'MARGIN-RIGHT' => '40px', + 'MARGIN-TOP' => '1.12em', + 'MARGIN-BOTTOM' => '1.12em', + ), + 'A' => array( + 'COLOR' => '#0000FF', + 'TEXT-DECORATION' => 'underline', + ), + 'UL' => array( + 'MARGIN' => '0.83em 0', /* only applied to top-level of nested lists */ + 'TEXT-INDENT' => '1.3em', /* Custom effect - list indent */ + ), + 'OL' => array( + 'MARGIN' => '0.83em 0', /* only applied to top-level of nested lists */ + 'TEXT-INDENT' => '1.3em', /* Custom effect - list indent */ + ), + 'DL' => array( + 'MARGIN' => '1.67em 0', + ), + 'DT' => array( + ), + 'DD' => array( + 'PADDING-LEFT' => '40px', + ), + 'TABLE' => array( + 'MARGIN' => '0', + 'BORDER-COLLAPSE' => 'separate', + 'BORDER-SPACING' => '2px', + 'EMPTY-CELLS' => 'show', + 'LINE-HEIGHT' => '1.2', + 'VERTICAL-ALIGN' => 'middle', + ), + 'THEAD' => array( + ), + 'TFOOT' => array( + ), + 'TH' => array( + 'FONT-WEIGHT' => 'bold', + 'TEXT-ALIGN' => 'center', + 'PADDING-LEFT' => '0.1em', + 'PADDING-RIGHT' => '0.1em', + 'PADDING-TOP' => '0.1em', + 'PADDING-BOTTOM' => '0.1em', + ), + 'TD' => array( + 'PADDING-LEFT' => '0.1em', + 'PADDING-RIGHT' => '0.1em', + 'PADDING-TOP' => '0.1em', + 'PADDING-BOTTOM' => '0.1em', + ), + 'CAPTION' => array( + 'TEXT-ALIGN' => 'center', + ), + 'IMG' => array( + 'MARGIN' => '0', + 'VERTICAL-ALIGN' => 'baseline', + ), + 'INPUT' => array( + 'FONT-FAMILY' => 'sans-serif', + 'VERTICAL-ALIGN' => 'middle', + 'FONT-SIZE' => '0.9em', + ), + 'SELECT' => array( + 'FONT-FAMILY' => 'sans-serif', + 'FONT-SIZE' => '0.9em', + 'VERTICAL-ALIGN' => 'middle', + ), + 'TEXTAREA' => array( + 'FONT-FAMILY' => 'monospace', + 'FONT-SIZE' => '0.9em', + 'VERTICAL-ALIGN' => 'text-bottom', + ), + 'MARK' => array( /* mPDF 5.5.09 */ + 'BACKGROUND-COLOR' => 'yellow', + ), +); + + +////////////////////////////////////////////////// +// VALUES ONLY LIKELY TO BE CHANGED BY DEVELOPERS +////////////////////////////////////////////////// +$this->pdf_version = '1.4'; + +// Hyphenation +$this->SHYlanguages = array('en','de','es','fi','fr','it','nl','pl','ru','sv'); // existing defined patterns + +$this->default_lineheight_correction=1.2; // Value 1 sets lineheight=fontsize height; + // Value used if line-height not set by CSS (usuallly is) + +$this->fontsizes = array('XX-SMALL'=>0.7, 'X-SMALL'=>0.77, 'SMALL'=>0.86, 'MEDIUM'=>1, 'LARGE'=>1.2, 'X-LARGE'=>1.5, 'XX-LARGE'=>2); + +// CHARACTER PATTERN MATCHES TO DETECT LANGUAGES + // pattern used to detect RTL characters -> force RTL + $this->pregRTLchars = "\x{0590}-\x{06FF}\x{0700}-\x{083E}\x{FB00}-\x{FDFD}\x{FE70}-\x{FEFF}"; + + // CJK Chars which require changing and are distinctive of specific charset + $this->pregUHCchars = "\x{1100}-\x{11FF}\x{3130}-\x{318F}\x{AC00}-\x{D7AF}"; + $this->pregSJISchars = "\x{3040}-\x{309F}\x{30A0}-\x{30FF}\x{3190}-\x{319F}\x{31F0}-\x{31FF}"; + + // Chars which distinguish CJK but not between different + $this->pregCJKchars = "\x{1100}-\x{11FF}\x{2E80}-\x{A4CF}\x{A800}-\x{D7AF}\x{F900}-\x{FAFF}\x{FE30}-\x{FE6F}\x{FF00}-\x{FFEF}\x{20000}-\x{2FA1F}"; + + // For CJK Line-breaking + //Leading characters - Not allowed at end of line + $this->CJKleading = "\$\(\*\[\{\x{00a3}\x{00a5}\x{00ab}\x{00b7}\x{2018}\x{201c}\x{2035}\x{3005}\x{3007}\x{3008}\x{300a}\x{300c}\x{300e}\x{3010}\x{3014}\x{3016}\x{3018}\x{301d}\x{fe34}\x{fe57}\x{fe59}\x{fe5b}\x{ff04}\x{ff08}\x{ff0e}\x{ff3b}\x{ff5b}\x{ff5f}\x{ffe1}\x{ffe5}\x{ffe6}"; + // Following characters - Not allowed at start + $this->CJKfollowing = "!%\),\.:;>\?\]\}\x{00a2}\x{00a8}\x{00b0}\x{00b7}\x{00bb}\x{02c7}\x{02c9}\x{2010}\x{2013}-\x{2016}\x{2019}\x{201d}-\x{201f}\x{2020}-\x{2022}\x{2025}\x{2027}\x{203a}\x{203c}\x{2047}-\x{2049}\x{2103}\x{2236}\x{2574}\x{3001}-\x{3003}\x{3005}\x{3006}\x{3009}\x{300b}\x{300d}\x{300f}\x{3011}\x{3015}\x{3017}\x{3019}\x{301c}\x{301e}\x{301f}\x{303b}\x{3041}\x{3043}\x{3045}\x{3047}\x{3049}\x{3063}\x{3083}\x{3085}\x{3087}\x{308e}\x{3095}\x{3096}\x{30a0}\x{30a1}\x{30a3}\x{30a5}\x{30a7}\x{30a9}\x{30c3}\x{30e3}\x{30e5}\x{30e7}\x{30ee}\x{30f5}\x{30f6}\x{30fb}-\x{30fe}\x{31f0}-\x{31ff}\x{fe30}-\x{fe33}\x{fe50}-\x{fe56}\x{fe58}\x{fe5a}\x{fe5c}\x{ff01}\x{ff02}\x{ff05}\x{ff07}\x{ff09}\x{ff0c}\x{ff0e}\x{ff1a}\x{ff1b}\x{ff1f}\x{ff3d}\x{ff40}\x{ff5c}-\x{ff5e}\x{ff60}\x{ff64}"; + // Characters which are allowed to overflow the right margin + $this->CJKoverflow = "\.,\x{ff61}\x{ff64}\x{3001}\x{3002}\x{ff0c}\x{ff0e}"; + + + + // ASCII Chars which shouldn't break string + // Use for very specific words + $this->pregASCIIchars1 = "\x{0021}-\x{002E}\x{0030}-\x{003B}?"; // no [SPACE] + // Use for words+ + $this->pregASCIIchars2 = "\x{0020}-\x{002E}\x{0030}-\x{003B}?"; // [SPACE] punctuation and 0-9 + // Use for chunks > words + $this->pregASCIIchars3 = "\x{0000}-\x{002E}\x{0030}-\x{003B}\x{003F}-\x{007E}"; // all except <> + // Vietnamese - specific + $this->pregVIETchars = "\x{01A0}\x{01A1}\x{01AF}\x{01B0}\x{1EA0}-\x{1EF1}"; + // Vietnamese - Chars which shouldn't break string + $this->pregVIETPluschars = "\x{0000}-\x{003B}\x{003F}-\x{00FF}\x{0300}-\x{036F}\x{0102}\x{0103}\x{0110}\x{0111}\x{0128}\x{0129}\x{0168}\x{0169}\x{1EF1}-\x{1EF9}"; // omits < > + + // Arabic + $this->pregARABICchars = "\x{0600}-\x{06FF}\x{0750}-\x{077F}\x{FB50}-\x{FDFD}\x{FE70}-\x{FEFF}"; + // Characters of Urdu, Pashto, Sindhi (but NOT arabic or persian/farsi) [not covered by DejavuSans font] + $this->pregNonARABICchars = "\x{0671}-\x{067D}\x{067F}-\x{0685}\x{0687}-\x{0697}\x{0699}-\x{06A8}\x{06AA}-\x{06AE}\x{06B0}-\x{06CB}\x{06CD}-\x{06D3}"; + + $this->pregHEBchars = "\x{0590}-\x{05FF}\x{FB00}-\x{FB49}"; // Hebrew + + // INDIC + $this->pregHIchars = "\x{0900}-\x{0963}\x{0966}-\x{097F}"; // Devanagari (Hindi) minus the common indic punctuation 0964,0965 + $this->pregBNchars = "\x{0980}-\x{09FF}"; // Bengali + $this->pregPAchars = "\x{0A00}-\x{0A7F}"; // Gurmukhi (Punjabi) + $this->pregGUchars = "\x{0A80}-\x{0AFF}"; // Gujarati + $this->pregORchars = "\x{0B00}-\x{0B7F}"; // Oriya + $this->pregTAchars = "\x{0B80}-\x{0BFF}"; // Tamil + $this->pregTEchars = "\x{0C00}-\x{0C7F}"; // Telugu + $this->pregKNchars = "\x{0C80}-\x{0CFF}"; // Kannada + $this->pregMLchars = "\x{0D00}-\x{0D7F}"; // Malayalam + $this->pregSHchars = "\x{0D80}-\x{0DFF}"; // Sinhala + + $this->pregINDextra = "\x{200B}-\x{200D}\x{0964}\x{0965}\x{0020}-\x{0022}\x{0024}-\x{002E}\x{003A}-\x{003F}\x{005B}-\x{0060}\x{007B}-\x{007E}\x{00A0}"; + // 200B-D=Zero-width joiners; 0964,0965=Generic Indic punctuation; NBSP & general punctuation (excludes # and / so can use in autoFont() ) + +$this->allowedCSStags = 'DIV|P|H1|H2|H3|H4|H5|H6|FORM|IMG|A|BODY|TABLE|HR|THEAD|TFOOT|TBODY|TH|TR|TD|UL|OL|LI|PRE|BLOCKQUOTE|ADDRESS|DL|DT|DD'; +$this->allowedCSStags .= '|ARTICLE|ASIDE|FIGURE|FIGCAPTION|FOOTER|HEADER|HGROUP|NAV|SECTION|MARK|DETAILS|SUMMARY|METER|PROGRESS|TIME'; // mPDF 5.5.09 +$this->allowedCSStags .= '|SPAN|TT|I|B|BIG|SMALL|EM|STRONG|DFN|CODE|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|STRIKE|S|U|DEL|INS|Q|FONT'; +$this->allowedCSStags .= '|SELECT|INPUT|TEXTAREA|CAPTION|FIELDSET|LEGEND'; // mPDF 5.4.18 +$this->allowedCSStags .= '|TEXTCIRCLE|DOTTAB'; // mPDF 5.5.23 // mPDF 5.6.33 + +$this->outerblocktags = array('DIV','FORM','CENTER','DL','FIELDSET','ARTICLE','ASIDE','FIGURE','FIGCAPTION', 'FOOTER','HEADER','HGROUP','NAV','SECTION','DETAILS','SUMMARY'); // mPDF 5.5.09 // mPDF 5.5.22 +$this->innerblocktags = array('P','BLOCKQUOTE','ADDRESS','PRE','H1','H2','H3','H4','H5','H6','DT','DD','CAPTION'); + + + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/config_cp.php b/application/third_party/mpdf/config_cp.php new file mode 100644 index 0000000..d854e5b --- /dev/null +++ b/application/third_party/mpdf/config_cp.php @@ -0,0 +1,153 @@ +<?php + + +function GetLangOpts($llcc, $adobeCJK) { + if (strlen($llcc) == 5) { + $lang = substr(strtolower($llcc),0,2); + $country = substr(strtoupper($llcc),3,2); + } + else { $lang = strtolower($llcc); $country = ''; } + $unifonts = ""; + $coreSuitable = false; + + switch($lang){ + CASE "en": + CASE "ca": + CASE "cy": + CASE "da": + CASE "de": + CASE "es": + CASE "eu": + CASE "fr": + CASE "ga": + CASE "fi": + CASE "is": + CASE "it": + CASE "nl": + CASE "no": + CASE "pt": + CASE "sv": + // Edit this value to define how mPDF behaves when using new mPDF('-x') + // If set to TRUE, mPDF will use Adobe core fonts only when it recognises the languages above + $coreSuitable = true; break; + + + + // RTL Languages + CASE "he": + CASE "yi": + $unifonts = "dejavusans,dejavusansB,dejavusansI,dejavusansBI"; break; + + // Arabic + CASE "ar": + $unifonts = "xbriyaz,xbriyazB,xbriyazI,xbriyazBI,xbzar,xbzarB,xbzarI,xbzarBI"; break; + CASE "fa": + $unifonts = "xbriyaz,xbriyazB,xbriyazI,xbriyazBI,xbzar,xbzarB,xbzarI,xbzarBI"; break; + CASE "ps": + $unifonts = "xbriyaz,xbriyazB,xbriyazI,xbriyazBI,xbzar,xbzarB,xbzarI,xbzarBI"; break; + CASE "ur": + $unifonts = "xbriyaz,xbriyazB,xbriyazI,xbriyazBI,xbzar,xbzarB,xbzarI,xbzarBI"; break; + + // Sindhi (can be Arabic or Devanagari) + CASE "sd": + if ($country == "IN") { $unifonts = "ind_hi_1_001"; } + // else if ($country == "PK") { $unifonts = ""; } + // else { $unifonts = ""; } + break; + + + // INDIC + // Assamese + CASE "as": $unifonts = "ind_bn_1_001"; break; + // Bengali + CASE "bn": $unifonts = "ind_bn_1_001"; break; + // Gujarati + CASE "gu": $unifonts = "ind_gu_1_001"; break; + // Hindi (Devanagari) + CASE "hi": $unifonts = "ind_hi_1_001"; break; + // Kannada + CASE "kn": $unifonts = "ind_kn_1_001"; break; + // Kashmiri + CASE "ks": $unifonts = "ind_hi_1_001"; break; + // Malayalam + CASE "ml": $unifonts = "ind_ml_1_001"; break; + // Nepali (Devanagari) + CASE "ne": $unifonts = "ind_hi_1_001"; break; + // Oriya + CASE "or": $unifonts = "ind_or_1_001"; break; + // Punjabi (Gurmukhi) + CASE "pa": $unifonts = "ind_pa_1_001"; break; + // Tamil + CASE "ta": $unifonts = "ind_ta_1_001"; break; + // Telegu + CASE "te": $unifonts = "ind_te_1_001"; break; + + // THAI + CASE "th": $unifonts = "garuda,garudaB,garudaI,garudaBI,norasi,norasiB,norasiI,norasiBI"; break; + + // VIETNAMESE + CASE "vi": + $unifonts = "dejavusanscondensed,dejavusanscondensedB,dejavusanscondensedI,dejavusanscondensedBI,dejavusans,dejavusansB,dejavusansI,dejavusansBI"; break; + + // CJK Langauges + CASE "ja": + if ($adobeCJK) { + $unifonts = "sjis,sjisB,sjisI,sjisBI"; + } +/* Uncomment these lines if CJK fonts available */ +// else { +// $unifonts = "sun-exta,sun-extb,hannoma,hannomb"; +// } + break; + + CASE "ko": + if ($adobeCJK) { + $unifonts = "uhc,uhcB,uhcI,uhcBI"; + } +/* Uncomment these lines if CJK fonts available */ +// else { +// $unifonts = "unbatang_0613"; +// } + break; + + CASE "zh": + if ($country == "HK" || $country == "TW") { + if ($adobeCJK) { + $unifonts = "big5,big5B,big5I,big5BI"; + } +/* Uncomment these lines if CJK fonts available */ +// else { +// $unifonts = "sun-exta,sun-extb,hannoma,hannomb"; +// } + } + else if ($country == "CN") { + if ($adobeCJK) { + $unifonts = "gb,gbB,gbI,gbBI"; + } +/* Uncomment these lines if CJK fonts available */ +// else { +// $unifonts = "sun-exta,sun-extb,hannoma,hannomb"; +// } + } + else { + if ($adobeCJK) { + $unifonts = "gb,gbB,gbI,gbBI"; + } +/* Uncomment these lines if CJK fonts available */ +// else { +// $unifonts = "sun-exta,sun-extb,hannoma,hannomb"; +// } + } + break; + + } + + + $unifonts_arr = array(); + if ($unifonts) { + $unifonts_arr = preg_split('/\s*,\s*/',$unifonts); + } + return array($coreSuitable ,$unifonts_arr); +} + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/config_fonts.php b/application/third_party/mpdf/config_fonts.php new file mode 100644 index 0000000..ab6c8a7 --- /dev/null +++ b/application/third_party/mpdf/config_fonts.php @@ -0,0 +1,304 @@ +<?php + + +// Optionally define a folder which contains TTF fonts +// mPDF will look here before looking in the usual _MPDF_TTFONTPATH +// Useful if you already have a folder for your fonts +// e.g. on Windows: define("_MPDF_SYSTEM_TTFONTS", 'C:/Windows/Fonts/'); +// Leave undefined if not required + +// define("_MPDF_SYSTEM_TTFONTS", ''); + + +// Optionally set font(s) (names as defined below in $this->fontdata) to use for missing characters +// when using useSubstitutions. Use a font with wide coverage - dejavusanscondensed is a good start +// only works using subsets (otherwise would add very large file) +// doesn't do Indic or arabic +// More than 1 font can be specified but each will add to the processing time of the script + +$this->backupSubsFont = array('dejavusanscondensed'); + + +// Optionally set a font (name as defined below in $this->fontdata) to use for CJK characters +// in Plane 2 Unicode (> U+20000) when using useSubstitutions. +// Use a font like hannomb or sun-extb if available +// only works using subsets (otherwise would add very large file) +// Leave undefined or blank if not not required + +// $this->backupSIPFont = 'sun-extb'; + + +/* +This array defines translations from font-family in CSS or HTML +to the internal font-family name used in mPDF. +Can include as many as want, regardless of which fonts are installed. +By default mPDF will take a CSS/HTML font-family and remove spaces +and change to lowercase e.g. "Arial Unicode MS" will be recognised as +"arialunicodems" +You only need to define additional translations. +You can also use it to define specific substitutions e.g. +'frutiger55roman' => 'arial' +Generic substitutions (i.e. to a sans-serif or serif font) are set +by including the font-family in $this->sans_fonts below +To aid backwards compatability some are included: +*/ +$this->fonttrans = array( + 'helvetica' => 'arial', + 'times' => 'timesnewroman', + 'courier' => 'couriernew', + 'trebuchet' => 'trebuchetms', + 'comic' => 'comicsansms', + 'franklin' => 'franklingothicbook', + 'albertus' => 'albertusmedium', + 'arialuni' => 'arialunicodems', + 'zn_hannom_a' => 'hannoma', + 'ocr-b' => 'ocrb', + 'ocr-b10bt' => 'ocrb', + + +); + +/* +This array lists the file names of the TrueType .ttf or .otf font files +for each variant of the (internal mPDF) font-family name. +['R'] = Regular (Normal), others are Bold, Italic, and Bold-Italic +Each entry must contain an ['R'] entry, but others are optional. +Only the font (files) entered here will be available to use in mPDF. +Put preferred default first in order. +This will be used if a named font cannot be found in any of +$this->sans_fonts, $this->serif_fonts or $this->mono_fonts + +['indic'] = true; for special mPDF fonts containing Indic characters +['sip-ext'] = 'hannomb'; name a related font file containing SIP characters + +If a .ttc TrueType collection file is referenced, the number of the font +within the collection is required. Fonts in the collection are numbered +starting at 1, as they appear in the .ttc file e.g. + "cambria" => array( + 'R' => "cambria.ttc", + 'B' => "cambriab.ttf", + 'I' => "cambriai.ttf", + 'BI' => "cambriaz.ttf", + 'TTCfontID' => array( + 'R' => 1, + ), + ), + "cambriamath" => array( + 'R' => "cambria.ttc", + 'TTCfontID' => array( + 'R' => 2, + ), + ), +*/ + +$this->fontdata = array( + "dejavusanscondensed" => array( + 'R' => "DejaVuSansCondensed.ttf", + 'B' => "DejaVuSansCondensed-Bold.ttf", + 'I' => "DejaVuSansCondensed-Oblique.ttf", + 'BI' => "DejaVuSansCondensed-BoldOblique.ttf", + ), + "dejavusans" => array( + 'R' => "DejaVuSans.ttf", + 'B' => "DejaVuSans-Bold.ttf", + 'I' => "DejaVuSans-Oblique.ttf", + 'BI' => "DejaVuSans-BoldOblique.ttf", + ), + "dejavuserif" => array( + 'R' => "DejaVuSerif.ttf", + 'B' => "DejaVuSerif-Bold.ttf", + 'I' => "DejaVuSerif-Italic.ttf", + 'BI' => "DejaVuSerif-BoldItalic.ttf", + ), + "dejavuserifcondensed" => array( + 'R' => "DejaVuSerifCondensed.ttf", + 'B' => "DejaVuSerifCondensed-Bold.ttf", + 'I' => "DejaVuSerifCondensed-Italic.ttf", + 'BI' => "DejaVuSerifCondensed-BoldItalic.ttf", + ), + "dejavusansmono" => array( + 'R' => "DejaVuSansMono.ttf", + 'B' => "DejaVuSansMono-Bold.ttf", + 'I' => "DejaVuSansMono-Oblique.ttf", + 'BI' => "DejaVuSansMono-BoldOblique.ttf", + ), + + +/* OCR-B font for Barcodes */ + "ocrb" => array( + 'R' => "ocrb10.ttf", + ), + +/* Thai fonts */ + "garuda" => array( + 'R' => "Garuda.ttf", + 'B' => "Garuda-Bold.ttf", + 'I' => "Garuda-Oblique.ttf", + 'BI' => "Garuda-BoldOblique.ttf", + ), + "norasi" => array( + 'R' => "Norasi.ttf", + 'B' => "Norasi-Bold.ttf", + 'I' => "Norasi-Oblique.ttf", + 'BI' => "Norasi-BoldOblique.ttf", + ), + + +/* Indic fonts */ + "ind_bn_1_001" => array( + 'R' => "ind_bn_1_001.ttf", + 'indic' => true, + ), + "ind_hi_1_001" => array( + 'R' => "ind_hi_1_001.ttf", + 'indic' => true, + ), + "ind_ml_1_001" => array( + 'R' => "ind_ml_1_001.ttf", + 'indic' => true, + ), + "ind_kn_1_001" => array( + 'R' => "ind_kn_1_001.ttf", + 'indic' => true, + ), + "ind_gu_1_001" => array( + 'R' => "ind_gu_1_001.ttf", + 'indic' => true, + ), + "ind_or_1_001" => array( + 'R' => "ind_or_1_001.ttf", + 'indic' => true, + ), + "ind_ta_1_001" => array( + 'R' => "ind_ta_1_001.ttf", + 'indic' => true, + ), + "ind_te_1_001" => array( + 'R' => "ind_te_1_001.ttf", + 'indic' => true, + ), + "ind_pa_1_001" => array( + 'R' => "ind_pa_1_001.ttf", + 'indic' => true, + ), + + +/* XW Zar Arabic fonts */ + "xbriyaz" => array( + 'R' => "XB Riyaz.ttf", + 'B' => "XB RiyazBd.ttf", + 'I' => "XB RiyazIt.ttf", + 'BI' => "XB RiyazBdIt.ttf", + 'unAGlyphs' => true, + ), + "xbzar" => array( + 'R' => "XB Zar.ttf", + 'B' => "XB Zar Bd.ttf", + 'I' => "XB Zar It.ttf", + 'BI' => "XB Zar BdIt.ttf", + 'unAGlyphs' => true, + ), + + + + +/* Examples of some CJK fonts */ +/* + "unbatang_0613" => array( + 'R' => "UnBatang_0613.ttf", + ), + "sun-exta" => array( + 'R' => "Sun-ExtA.ttf", + 'sip-ext' => 'sun-extb', + ), + "sun-extb" => array( + 'R' => "Sun-ExtB.ttf", + ), + "hannoma" => array( + 'R' => "HAN NOM A.ttf", + 'sip-ext' => 'hannomb', + ), + "hannomb" => array( + 'R' => "HAN NOM B.ttf", + ), + + + 'mingliu' => array ( + 'R' => 'mingliu.ttc', + 'TTCfontID' => array ( + 'R' => 1, + ), + 'sip-ext' => 'mingliu-extb', + ), + 'pmingliu' => array ( + 'R' => 'mingliu.ttc', + 'TTCfontID' => array ( + 'R' => 2, + ), + 'sip-ext' => 'pmingliu-extb', + ), + 'mingliu_hkscs' => array ( + 'R' => 'mingliu.ttc', + 'TTCfontID' => array ( + 'R' => 3, + ), + 'sip-ext' => 'mingliu_hkscs-extb', + ), + 'mingliu-extb' => array ( + 'R' => 'mingliub.ttc', + 'TTCfontID' => array ( + 'R' => 1, + ), + ), + 'pmingliu-extb' => array ( + 'R' => 'mingliub.ttc', + 'TTCfontID' => array ( + 'R' => 2, + ), + ), + 'mingliu_hkscs-extb' => array ( + 'R' => 'mingliub.ttc', + 'TTCfontID' => array ( + 'R' => 3, + ), + ), +*/ + +); + + +// Add fonts to this array if they contain characters in the SIP or SMP Unicode planes +// but you do not require them. This allows a more efficient form of subsetting to be used. +$this->BMPonly = array( + "dejavusanscondensed", + "dejavusans", + "dejavuserifcondensed", + "dejavuserif", + "dejavusansmono", + ); + +// These next 3 arrays do two things: +// 1. If a font referred to in HTML/CSS is not available to mPDF, these arrays will determine whether +// a serif/sans-serif or monospace font is substituted +// 2. The first font in each array will be the font which is substituted in circumstances as above +// (Otherwise the order is irrelevant) +// Use the mPDF font-family names i.e. lowercase and no spaces (after any translations in $fonttrans) +// Always include "sans-serif", "serif" and "monospace" etc. +$this->sans_fonts = array('dejavusanscondensed','dejavusans','freesans','liberationsans','sans','sans-serif','cursive','fantasy', + 'arial','helvetica','verdana','geneva','lucida','arialnarrow','arialblack','arialunicodems', + 'franklin','franklingothicbook','tahoma','garuda','calibri','trebuchet','lucidagrande','microsoftsansserif', + 'trebuchetms','lucidasansunicode','franklingothicmedium','albertusmedium','xbriyaz','albasuper','quillscript' + +); + +$this->serif_fonts = array('dejavuserifcondensed','dejavuserif','freeserif','liberationserif','serif', + 'timesnewroman','times','centuryschoolbookl','palatinolinotype','centurygothic', + 'bookmanoldstyle','bookantiqua','cyberbit','cambria', + 'norasi','charis','palatino','constantia','georgia','albertus','xbzar','algerian','garamond', +); + +$this->mono_fonts = array('dejavusansmono','freemono','liberationmono','courier', 'mono','monospace','ocrb','ocr-b','lucidaconsole', + 'couriernew','monotypecorsiva' +); + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/font/ccourier.php b/application/third_party/mpdf/font/ccourier.php new file mode 100644 index 0000000..9f8b85e --- /dev/null +++ b/application/third_party/mpdf/font/ccourier.php @@ -0,0 +1,9 @@ +<?php +for($i=0;$i<=255;$i++) + $cw[chr($i)]=600; + +$desc=array('Ascent'=>629,'Descent'=>-157,'CapHeight'=>562,'FontBBox'=>'[-23 -250 715 805]'); +$up=-100; +$ut=50; + +?> diff --git a/application/third_party/mpdf/font/ccourierb.php b/application/third_party/mpdf/font/ccourierb.php new file mode 100644 index 0000000..4a0e61e --- /dev/null +++ b/application/third_party/mpdf/font/ccourierb.php @@ -0,0 +1,9 @@ +<?php +for($i=0;$i<=255;$i++) + $cw[chr($i)]=600; +$desc=array('Ascent'=>629,'Descent'=>-157,'CapHeight'=>562,'FontBBox'=>'[-113 -250 749 801]'); +$up=-100; +$ut=50; + + +?> diff --git a/application/third_party/mpdf/font/ccourierbi.php b/application/third_party/mpdf/font/ccourierbi.php new file mode 100644 index 0000000..8797ca5 --- /dev/null +++ b/application/third_party/mpdf/font/ccourierbi.php @@ -0,0 +1,9 @@ +<?php +for($i=0;$i<=255;$i++) + $cw[chr($i)]=600; +$desc=array('Ascent'=>629,'Descent'=>-157,'CapHeight'=>562,'FontBBox'=>'[-57 -250 869 801]'); +$up=-100; +$ut=50; + + +?> diff --git a/application/third_party/mpdf/font/ccourieri.php b/application/third_party/mpdf/font/ccourieri.php new file mode 100644 index 0000000..fd2a769 --- /dev/null +++ b/application/third_party/mpdf/font/ccourieri.php @@ -0,0 +1,9 @@ +<?php +for($i=0;$i<=255;$i++) + $cw[chr($i)]=600; +$desc=array('Ascent'=>629,'Descent'=>-157,'CapHeight'=>562,'FontBBox'=>'[-27 -250 849 805]'); +$up=-100; +$ut=50; + + +?> diff --git a/application/third_party/mpdf/font/chelvetica.php b/application/third_party/mpdf/font/chelvetica.php new file mode 100644 index 0000000..c99facc --- /dev/null +++ b/application/third_party/mpdf/font/chelvetica.php @@ -0,0 +1,20 @@ +<?php +$cw=array( + chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833, + 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556, + chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556, + chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); + +$desc=array('Ascent'=>718,'Descent'=>-207,'CapHeight'=>718,'FontBBox'=>'[-166 -225 1000 931]'); +$up=-100; +$ut=50; +$kerninfo=array ( chr(49)=> array ( chr(49)=> -74, ), chr(65)=> array ( chr(84)=> -74, chr(86)=> -74, chr(87)=> -37, chr(89)=> -74, chr(118)=> -18, chr(119)=> -18, chr(121)=> -18, chr(146)=> -74, ), chr(70)=> array ( chr(44)=> -110, chr(46)=> -110, chr(65)=> -55, ), chr(76)=> array ( chr(84)=> -74, chr(86)=> -74, chr(87)=> -74, chr(89)=> -74, chr(121)=> -37, chr(146)=> -55, ), chr(80)=> array ( chr(44)=> -128, chr(46)=> -128, chr(65)=> -74, ), chr(82)=> array ( chr(84)=> -18, chr(86)=> -18, chr(87)=> -18, chr(89)=> -18, ), chr(84)=> array ( chr(44)=> -110, chr(46)=> -110, chr(58)=> -110, chr(65)=> -74, chr(79)=> -18, chr(97)=> -110, chr(99)=> -110, chr(101)=> -110, chr(105)=> -37, chr(111)=> -110, chr(114)=> -37, chr(115)=> -110, chr(117)=> -37, chr(119)=> -55, chr(121)=> -55, ), chr(86)=> array ( chr(44)=> -91, chr(46)=> -91, chr(58)=> -37, chr(65)=> -74, chr(97)=> -74, chr(101)=> -55, chr(105)=> -18, chr(111)=> -55, chr(114)=> -37, chr(117)=> -37, chr(121)=> -37, ), chr(87)=> array ( chr(44)=> -55, chr(46)=> -55, chr(58)=> -18, chr(65)=> -37, chr(97)=> -37, chr(101)=> -18, chr(105)=> 0, chr(111)=> -18, chr(114)=> -18, chr(117)=> -18, chr(121)=> -8, ), chr(89)=> array ( chr(44)=> -128, chr(46)=> -128, chr(58)=> -55, chr(65)=> -74, chr(97)=> -74, chr(101)=> -91, chr(105)=> -37, chr(111)=> -91, chr(112)=> -74, chr(113)=> -91, chr(117)=> -55, chr(118)=> -55, ), chr(102)=> array ( chr(102)=> -18, chr(146)=> 18, ), chr(114)=> array ( chr(44)=> -55, chr(46)=> -55, chr(146)=> 37, ), chr(118)=> array ( chr(44)=> -74, chr(46)=> -74, ), chr(119)=> array ( chr(44)=> -55, chr(46)=> -55, ), chr(121)=> array ( chr(44)=> -74, chr(46)=> -74, ), chr(145)=> array ( chr(145)=> -18, ), chr(146)=> array ( chr(115)=> -18, chr(146)=> -18, ), ); +?> \ No newline at end of file diff --git a/application/third_party/mpdf/font/chelveticab.php b/application/third_party/mpdf/font/chelveticab.php new file mode 100644 index 0000000..73d9dc8 --- /dev/null +++ b/application/third_party/mpdf/font/chelveticab.php @@ -0,0 +1,21 @@ +<?php +$cw=array( + chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, + 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, + 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556, + chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611, + chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556); + +$desc=array('Ascent'=>718,'Descent'=>-207,'CapHeight'=>718,'FontBBox'=>'[-170 -228 1003 962]'); +$up=-100; +$ut=50; +$kerninfo=array ( chr(49)=> array ( chr(49)=> -55, ), chr(65)=> array ( chr(84)=> -74, chr(86)=> -74, chr(87)=> -55, chr(89)=> -91, chr(118)=> -37, chr(119)=> -18, chr(121)=> -37, chr(146)=> -55, ), chr(70)=> array ( chr(44)=> -110, chr(46)=> -110, chr(65)=> -55, ), chr(76)=> array ( chr(84)=> -74, chr(86)=> -74, chr(87)=> -55, chr(89)=> -91, chr(121)=> -37, chr(146)=> -55, ), chr(80)=> array ( chr(44)=> -128, chr(46)=> -128, chr(65)=> -74, ), chr(82)=> array ( chr(86)=> -18, chr(87)=> -18, chr(89)=> -37, ), chr(84)=> array ( chr(44)=> -110, chr(46)=> -110, chr(58)=> -110, chr(65)=> -74, chr(79)=> -18, chr(97)=> -74, chr(99)=> -74, chr(101)=> -74, chr(105)=> -18, chr(111)=> -74, chr(114)=> -55, chr(115)=> -74, chr(117)=> -74, chr(119)=> -74, chr(121)=> -74, ), chr(86)=> array ( chr(44)=> -91, chr(46)=> -91, chr(58)=> -55, chr(65)=> -74, chr(97)=> -55, chr(101)=> -55, chr(105)=> -18, chr(111)=> -74, chr(114)=> -55, chr(117)=> -37, chr(121)=> -37, ), chr(87)=> array ( chr(44)=> -55, chr(46)=> -55, chr(58)=> -18, chr(65)=> -55, chr(97)=> -37, chr(101)=> -18, chr(105)=> -8, chr(111)=> -18, chr(114)=> -18, chr(117)=> -18, chr(121)=> -18, ), chr(89)=> array ( chr(44)=> -110, chr(46)=> -110, chr(58)=> -74, chr(65)=> -91, chr(97)=> -55, chr(101)=> -55, chr(105)=> -37, chr(111)=> -74, chr(112)=> -55, chr(113)=> -74, chr(117)=> -55, chr(118)=> -55, ), chr(102)=> array ( chr(146)=> 18, ), chr(114)=> array ( chr(44)=> -55, chr(46)=> -55, chr(146)=> 37, ), chr(118)=> array ( chr(44)=> -74, chr(46)=> -74, ), chr(119)=> array ( chr(44)=> -37, chr(46)=> -37, ), chr(121)=> array ( chr(44)=> -74, chr(46)=> -74, ), chr(145)=> array ( chr(145)=> -37, ), chr(146)=> array ( chr(115)=> -37, chr(146)=> -37, ), ); + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/font/chelveticabi.php b/application/third_party/mpdf/font/chelveticabi.php new file mode 100644 index 0000000..b6837f0 --- /dev/null +++ b/application/third_party/mpdf/font/chelveticabi.php @@ -0,0 +1,21 @@ +<?php +$cw=array( + chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, + 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, + 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556, + chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611, + chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556); + +$desc=array('Ascent'=>718,'Descent'=>-207,'CapHeight'=>718,'FontBBox'=>'[-174 -228 1114 962]'); +$up=-100; +$ut=50; +$kerninfo=array ( chr(49)=> array ( chr(49)=> -74, ), chr(65)=> array ( chr(84)=> -74, chr(86)=> -74, chr(87)=> -55, chr(89)=> -74, chr(146)=> -55, ), chr(70)=> array ( chr(44)=> -110, chr(46)=> -110, chr(65)=> -55, ), chr(76)=> array ( chr(84)=> -74, chr(86)=> -55, chr(87)=> -55, chr(89)=> -74, chr(146)=> -74, ), chr(80)=> array ( chr(44)=> -128, chr(46)=> -128, chr(65)=> -74, ), chr(82)=> array ( chr(84)=> -18, chr(87)=> -18, chr(89)=> -18, ), chr(84)=> array ( chr(44)=> -74, chr(46)=> -74, chr(58)=> -74, chr(65)=> -74, chr(79)=> -18, chr(97)=> -37, chr(99)=> -37, chr(101)=> -37, chr(105)=> -18, chr(111)=> -37, chr(114)=> -18, chr(115)=> -37, chr(117)=> -18, chr(119)=> -37, chr(121)=> -37, ), chr(86)=> array ( chr(44)=> -91, chr(46)=> -91, chr(58)=> -37, chr(65)=> -74, chr(97)=> -37, chr(101)=> -37, chr(105)=> -37, chr(111)=> -37, chr(114)=> -18, chr(117)=> -18, chr(121)=> -18, ), chr(87)=> array ( chr(44)=> -74, chr(46)=> -74, chr(58)=> -37, chr(65)=> -55, chr(97)=> -18, chr(101)=> -18, chr(105)=> -8, chr(111)=> -18, chr(114)=> -18, chr(117)=> -18, chr(121)=> -18, ), chr(89)=> array ( chr(44)=> -91, chr(46)=> -91, chr(58)=> -55, chr(65)=> -74, chr(97)=> -37, chr(101)=> -37, chr(105)=> -37, chr(111)=> -37, chr(112)=> -37, chr(113)=> -37, chr(117)=> -37, chr(118)=> -37, ), chr(102)=> array ( chr(102)=> -18, chr(146)=> 18, ), chr(114)=> array ( chr(44)=> -55, chr(46)=> -55, chr(146)=> 37, ), chr(118)=> array ( chr(44)=> -55, chr(46)=> -55, ), chr(119)=> array ( chr(44)=> -37, chr(46)=> -37, ), chr(121)=> array ( chr(44)=> -37, chr(46)=> -37, ), chr(145)=> array ( chr(145)=> -37, ), chr(146)=> array ( chr(115)=> -18, chr(116)=> 18, chr(146)=> -37, ), ); + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/font/chelveticai.php b/application/third_party/mpdf/font/chelveticai.php new file mode 100644 index 0000000..e4fdf28 --- /dev/null +++ b/application/third_party/mpdf/font/chelveticai.php @@ -0,0 +1,21 @@ +<?php +$cw=array( + chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833, + 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556, + chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556, + chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); + +$desc=array('Ascent'=>718,'Descent'=>-207,'CapHeight'=>718,'FontBBox'=>'[-170 -225 1116 931]'); +$up=-100; +$ut=50; +$kerninfo=array ( chr(49)=> array ( chr(49)=> -74, ), chr(65)=> array ( chr(84)=> -74, chr(86)=> -55, chr(87)=> -18, chr(89)=> -74, chr(118)=> -18, chr(119)=> -18, chr(121)=> -8, chr(146)=> -37, ), chr(70)=> array ( chr(44)=> -128, chr(46)=> -128, chr(65)=> -74, ), chr(76)=> array ( chr(84)=> -74, chr(86)=> -55, chr(87)=> -37, chr(89)=> -91, chr(121)=> -18, chr(146)=> -55, ), chr(80)=> array ( chr(44)=> -128, chr(46)=> -128, chr(65)=> -74, ), chr(82)=> array ( chr(84)=> -18, chr(86)=> -18, chr(87)=> -18, chr(89)=> -37, ), chr(84)=> array ( chr(44)=> -91, chr(46)=> -91, chr(58)=> -74, chr(65)=> -74, chr(79)=> -18, chr(97)=> -91, chr(99)=> -91, chr(101)=> -91, chr(105)=> -8, chr(111)=> -91, chr(114)=> -74, chr(115)=> -91, chr(117)=> -74, chr(119)=> -74, chr(121)=> -74, ), chr(86)=> array ( chr(44)=> -74, chr(46)=> -74, chr(58)=> -18, chr(65)=> -55, chr(97)=> -37, chr(101)=> -37, chr(105)=> -18, chr(111)=> -37, chr(114)=> -18, chr(117)=> -18, chr(121)=> -18, ), chr(87)=> array ( chr(44)=> -37, chr(46)=> -37, chr(65)=> -18, chr(97)=> -18, chr(101)=> -18, chr(105)=> -8, ), chr(89)=> array ( chr(44)=> -91, chr(46)=> -91, chr(58)=> -37, chr(65)=> -55, chr(97)=> -74, chr(101)=> -55, chr(105)=> -18, chr(111)=> -55, chr(112)=> -55, chr(113)=> -55, chr(117)=> -37, chr(118)=> -37, ), chr(102)=> array ( chr(146)=> 37, ), chr(114)=> array ( chr(44)=> -55, chr(46)=> -37, chr(146)=> 37, ), chr(118)=> array ( chr(44)=> -74, chr(46)=> -74, ), chr(119)=> array ( chr(44)=> -55, chr(46)=> -55, ), chr(121)=> array ( chr(44)=> -74, chr(46)=> -74, ), chr(145)=> array ( chr(145)=> -37, ), chr(146)=> array ( chr(115)=> -18, chr(146)=> -37, ), ); + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/font/csymbol.php b/application/third_party/mpdf/font/csymbol.php new file mode 100644 index 0000000..771052a --- /dev/null +++ b/application/third_party/mpdf/font/csymbol.php @@ -0,0 +1,21 @@ +<?php +$cw=array( + chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>713,'#'=>500,'$'=>549,'%'=>833,'&'=>778,'\''=>439,'('=>333,')'=>333,'*'=>500,'+'=>549, + ','=>250,'-'=>549,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>549,'='=>549,'>'=>549,'?'=>444,'@'=>549,'A'=>722, + 'B'=>667,'C'=>722,'D'=>612,'E'=>611,'F'=>763,'G'=>603,'H'=>722,'I'=>333,'J'=>631,'K'=>722,'L'=>686,'M'=>889,'N'=>722,'O'=>722,'P'=>768,'Q'=>741,'R'=>556,'S'=>592,'T'=>611,'U'=>690,'V'=>439,'W'=>768, + 'X'=>645,'Y'=>795,'Z'=>611,'['=>333,'\\'=>863,']'=>333,'^'=>658,'_'=>500,'`'=>500,'a'=>631,'b'=>549,'c'=>549,'d'=>494,'e'=>439,'f'=>521,'g'=>411,'h'=>603,'i'=>329,'j'=>603,'k'=>549,'l'=>549,'m'=>576, + 'n'=>521,'o'=>549,'p'=>549,'q'=>521,'r'=>549,'s'=>603,'t'=>439,'u'=>576,'v'=>713,'w'=>686,'x'=>493,'y'=>686,'z'=>494,'{'=>480,'|'=>200,'}'=>480,'~'=>549,chr(127)=>0,chr(128)=>0,chr(129)=>0,chr(130)=>0,chr(131)=>0, + chr(132)=>0,chr(133)=>0,chr(134)=>0,chr(135)=>0,chr(136)=>0,chr(137)=>0,chr(138)=>0,chr(139)=>0,chr(140)=>0,chr(141)=>0,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0, + chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>750,chr(161)=>620,chr(162)=>247,chr(163)=>549,chr(164)=>167,chr(165)=>713,chr(166)=>500,chr(167)=>753,chr(168)=>753,chr(169)=>753,chr(170)=>753,chr(171)=>1042,chr(172)=>987,chr(173)=>603,chr(174)=>987,chr(175)=>603, + chr(176)=>400,chr(177)=>549,chr(178)=>411,chr(179)=>549,chr(180)=>549,chr(181)=>713,chr(182)=>494,chr(183)=>460,chr(184)=>549,chr(185)=>549,chr(186)=>549,chr(187)=>549,chr(188)=>1000,chr(189)=>603,chr(190)=>1000,chr(191)=>658,chr(192)=>823,chr(193)=>686,chr(194)=>795,chr(195)=>987,chr(196)=>768,chr(197)=>768, + chr(198)=>823,chr(199)=>768,chr(200)=>768,chr(201)=>713,chr(202)=>713,chr(203)=>713,chr(204)=>713,chr(205)=>713,chr(206)=>713,chr(207)=>713,chr(208)=>768,chr(209)=>713,chr(210)=>790,chr(211)=>790,chr(212)=>890,chr(213)=>823,chr(214)=>549,chr(215)=>250,chr(216)=>713,chr(217)=>603,chr(218)=>603,chr(219)=>1042, + chr(220)=>987,chr(221)=>603,chr(222)=>987,chr(223)=>603,chr(224)=>494,chr(225)=>329,chr(226)=>790,chr(227)=>790,chr(228)=>786,chr(229)=>713,chr(230)=>384,chr(231)=>384,chr(232)=>384,chr(233)=>384,chr(234)=>384,chr(235)=>384,chr(236)=>494,chr(237)=>494,chr(238)=>494,chr(239)=>494,chr(240)=>0,chr(241)=>329, + chr(242)=>274,chr(243)=>686,chr(244)=>686,chr(245)=>686,chr(246)=>384,chr(247)=>384,chr(248)=>384,chr(249)=>384,chr(250)=>384,chr(251)=>384,chr(252)=>494,chr(253)=>494,chr(254)=>494,chr(255)=>0); + +$desc=array('FontBBox'=>'[-180 -293 1090 1010]'); +$up=-100; +$ut=50; + + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/font/ctimes.php b/application/third_party/mpdf/font/ctimes.php new file mode 100644 index 0000000..76f28d8 --- /dev/null +++ b/application/third_party/mpdf/font/ctimes.php @@ -0,0 +1,21 @@ +<?php +$cw=array( + chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>408,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>180,'('=>333,')'=>333,'*'=>500,'+'=>564, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>564,'='=>564,'>'=>564,'?'=>444,'@'=>921,'A'=>722, + 'B'=>667,'C'=>667,'D'=>722,'E'=>611,'F'=>556,'G'=>722,'H'=>722,'I'=>333,'J'=>389,'K'=>722,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>556,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>722,'W'=>944, + 'X'=>722,'Y'=>722,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>469,'_'=>500,'`'=>333,'a'=>444,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778, + 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>333,'s'=>389,'t'=>278,'u'=>500,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>480,'|'=>200,'}'=>480,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>444,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>889,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>444,chr(148)=>444,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>980, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>200,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>564,chr(173)=>333,chr(174)=>760,chr(175)=>333, + chr(176)=>400,chr(177)=>564,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>453,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>444,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>564,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>722,chr(222)=>556,chr(223)=>500,chr(224)=>444,chr(225)=>444,chr(226)=>444,chr(227)=>444,chr(228)=>444,chr(229)=>444,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>564,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>500,chr(254)=>500,chr(255)=>500); + +$desc=array('Ascent'=>683,'Descent'=>-217,'CapHeight'=>662,'FontBBox'=>'[-168 -218 1000 898]'); +$up=-100; +$ut=50; +$kerninfo=array ( chr(49)=> array ( chr(49)=> -37, ), chr(65)=> array ( chr(84)=> -110, chr(86)=> -128, chr(87)=> -80, chr(89)=> -91, chr(118)=> -74, chr(119)=> -91, chr(121)=> -91, chr(146)=> -110, ), chr(70)=> array ( chr(44)=> -80, chr(46)=> -80, chr(65)=> -74, ), chr(76)=> array ( chr(84)=> -91, chr(86)=> -91, chr(87)=> -74, chr(89)=> -100, chr(121)=> -55, chr(146)=> -91, ), chr(80)=> array ( chr(44)=> -110, chr(46)=> -110, chr(65)=> -91, ), chr(82)=> array ( chr(84)=> -60, chr(86)=> -80, chr(87)=> -55, chr(89)=> -55, chr(121)=> -40, ), chr(84)=> array ( chr(44)=> -74, chr(46)=> -74, chr(58)=> -49, chr(65)=> -80, chr(79)=> -18, chr(97)=> -69, chr(99)=> -69, chr(101)=> -69, chr(105)=> -35, chr(111)=> -69, chr(114)=> -35, chr(115)=> -69, chr(117)=> -35, chr(119)=> -69, chr(121)=> -69, ), chr(86)=> array ( chr(44)=> -128, chr(46)=> -128, chr(58)=> -74, chr(65)=> -128, chr(97)=> -110, chr(101)=> -110, chr(105)=> -60, chr(111)=> -128, chr(114)=> -60, chr(117)=> -60, chr(121)=> -110, ), chr(87)=> array ( chr(44)=> -91, chr(46)=> -91, chr(58)=> -37, chr(65)=> -110, chr(97)=> -80, chr(101)=> -80, chr(105)=> -40, chr(111)=> -80, chr(114)=> -40, chr(117)=> -40, chr(121)=> -60, ), chr(89)=> array ( chr(44)=> -128, chr(46)=> -128, chr(58)=> -91, chr(65)=> -110, chr(97)=> -100, chr(101)=> -100, chr(105)=> -55, chr(111)=> -100, chr(112)=> -91, chr(113)=> -110, chr(117)=> -110, chr(118)=> -100, ), chr(102)=> array ( chr(102)=> -18, chr(146)=> 55, ), chr(114)=> array ( chr(44)=> -40, chr(46)=> -55, chr(103)=> -18, chr(146)=> 37, ), chr(118)=> array ( chr(44)=> -64, chr(46)=> -64, ), chr(119)=> array ( chr(44)=> -64, chr(46)=> -64, ), chr(121)=> array ( chr(44)=> -64, chr(46)=> -64, ), chr(145)=> array ( chr(145)=> -74, ), chr(146)=> array ( chr(115)=> -55, chr(116)=> -18, chr(146)=> -74, ), ); + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/font/ctimesb.php b/application/third_party/mpdf/font/ctimesb.php new file mode 100644 index 0000000..ca4d2b1 --- /dev/null +++ b/application/third_party/mpdf/font/ctimesb.php @@ -0,0 +1,21 @@ +<?php +$cw=array( + chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>555,'#'=>500,'$'=>500,'%'=>1000,'&'=>833,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>930,'A'=>722, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>778,'I'=>389,'J'=>500,'K'=>778,'L'=>667,'M'=>944,'N'=>722,'O'=>778,'P'=>611,'Q'=>778,'R'=>722,'S'=>556,'T'=>667,'U'=>722,'V'=>722,'W'=>1000, + 'X'=>722,'Y'=>722,'Z'=>667,'['=>333,'\\'=>278,']'=>333,'^'=>581,'_'=>500,'`'=>333,'a'=>500,'b'=>556,'c'=>444,'d'=>556,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>333,'k'=>556,'l'=>278,'m'=>833, + 'n'=>556,'o'=>500,'p'=>556,'q'=>556,'r'=>444,'s'=>389,'t'=>333,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>394,'|'=>220,'}'=>394,'~'=>520,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>667,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>300,chr(171)=>500,chr(172)=>570,chr(173)=>333,chr(174)=>747,chr(175)=>333, + chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>556,chr(182)=>540,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>330,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>570,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>722,chr(222)=>611,chr(223)=>556,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); + +$desc=array('Ascent'=>683,'Descent'=>-217,'CapHeight'=>676,'FontBBox'=>'[-168 -218 1000 935]'); +$up=-100; +$ut=50; +$kerninfo=array ( chr(49)=> array ( chr(49)=> -55, ), chr(65)=> array ( chr(84)=> -74, chr(86)=> -128, chr(87)=> -110, chr(89)=> -91, chr(118)=> -74, chr(119)=> -74, chr(121)=> -74, chr(146)=> -74, ), chr(70)=> array ( chr(44)=> -91, chr(46)=> -91, chr(65)=> -74, ), chr(76)=> array ( chr(84)=> -91, chr(86)=> -91, chr(87)=> -91, chr(89)=> -91, chr(121)=> -55, chr(146)=> -91, ), chr(80)=> array ( chr(44)=> -91, chr(46)=> -91, chr(65)=> -74, ), chr(82)=> array ( chr(84)=> -35, chr(86)=> -35, chr(87)=> -35, chr(89)=> -35, chr(121)=> -35, ), chr(84)=> array ( chr(44)=> -74, chr(46)=> -74, chr(58)=> -74, chr(65)=> -74, chr(79)=> -18, chr(97)=> -91, chr(99)=> -91, chr(101)=> -91, chr(105)=> -18, chr(111)=> -91, chr(114)=> -74, chr(115)=> -91, chr(117)=> -91, chr(119)=> -74, chr(121)=> -74, ), chr(86)=> array ( chr(44)=> -128, chr(46)=> -128, chr(58)=> -91, chr(65)=> -128, chr(79)=> -20, chr(97)=> -91, chr(101)=> -91, chr(105)=> -37, chr(111)=> -91, chr(114)=> -74, chr(117)=> -91, chr(121)=> -91, ), chr(87)=> array ( chr(44)=> -91, chr(46)=> -91, chr(58)=> -55, chr(65)=> -110, chr(97)=> -55, chr(101)=> -55, chr(105)=> -18, chr(111)=> -55, chr(114)=> -18, chr(117)=> -18, chr(121)=> -37, ), chr(89)=> array ( chr(44)=> -91, chr(46)=> -91, chr(58)=> -91, chr(65)=> -91, chr(97)=> -110, chr(101)=> -110, chr(105)=> -37, chr(111)=> -110, chr(112)=> -91, chr(113)=> -110, chr(117)=> -91, chr(118)=> -110, ), chr(102)=> array ( chr(102)=> 0, chr(146)=> 55, ), chr(114)=> array ( chr(44)=> -91, chr(46)=> -91, chr(99)=> -18, chr(101)=> -18, chr(104)=> 0, chr(111)=> -18, chr(113)=> -18, chr(116)=> 0, chr(119)=> 0, chr(120)=> 0, chr(121)=> 0, chr(122)=> 0, chr(146)=> 18, ), chr(118)=> array ( chr(44)=> -55, chr(46)=> -55, ), chr(119)=> array ( chr(44)=> -55, chr(46)=> -55, ), chr(121)=> array ( chr(44)=> -55, chr(46)=> -55, ), chr(145)=> array ( chr(145)=> -74, ), chr(146)=> array ( chr(115)=> -37, chr(146)=> -74, ), ); + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/font/ctimesbi.php b/application/third_party/mpdf/font/ctimesbi.php new file mode 100644 index 0000000..c7c7fc2 --- /dev/null +++ b/application/third_party/mpdf/font/ctimesbi.php @@ -0,0 +1,21 @@ +<?php +$cw=array( + chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>389,'"'=>555,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>832,'A'=>667, + 'B'=>667,'C'=>667,'D'=>722,'E'=>667,'F'=>667,'G'=>722,'H'=>778,'I'=>389,'J'=>500,'K'=>667,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>611,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>667,'W'=>889, + 'X'=>667,'Y'=>611,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>570,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778, + 'n'=>556,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>556,'v'=>444,'w'=>667,'x'=>500,'y'=>444,'z'=>389,'{'=>348,'|'=>220,'}'=>348,'~'=>570,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>389,chr(159)=>611,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>266,chr(171)=>500,chr(172)=>606,chr(173)=>333,chr(174)=>747,chr(175)=>333, + chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>576,chr(182)=>500,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>300,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>944,chr(199)=>667,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>570,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>611,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>444,chr(254)=>500,chr(255)=>444); + +$desc=array('Ascent'=>683,'Descent'=>-217,'CapHeight'=>669,'FontBBox'=>'[-200 -218 996 921]'); +$up=-100; +$ut=50; +$kerninfo=array ( chr(49)=> array ( chr(49)=> -55, ), chr(65)=> array ( chr(84)=> -55, chr(86)=> -74, chr(87)=> -91, chr(89)=> -55, chr(118)=> -74, chr(119)=> -74, chr(121)=> -74, chr(146)=> -74, ), chr(70)=> array ( chr(44)=> -128, chr(46)=> -128, chr(65)=> -91, ), chr(76)=> array ( chr(84)=> -18, chr(86)=> -37, chr(87)=> -37, chr(89)=> -37, chr(121)=> -37, chr(146)=> -55, ), chr(80)=> array ( chr(44)=> -128, chr(46)=> -128, chr(65)=> -74, ), chr(82)=> array ( chr(86)=> -18, chr(87)=> -18, chr(89)=> -18, chr(121)=> -18, ), chr(84)=> array ( chr(44)=> -91, chr(46)=> -91, chr(58)=> -74, chr(65)=> -55, chr(79)=> -18, chr(97)=> -91, chr(99)=> -91, chr(101)=> -91, chr(105)=> -37, chr(111)=> -91, chr(114)=> -37, chr(115)=> -91, chr(117)=> -37, chr(119)=> -37, chr(121)=> -37, ), chr(86)=> array ( chr(44)=> -128, chr(46)=> -128, chr(58)=> -74, chr(65)=> -74, chr(97)=> -110, chr(101)=> -110, chr(105)=> -55, chr(111)=> -110, chr(114)=> -55, chr(117)=> -55, chr(121)=> -74, ), chr(87)=> array ( chr(44)=> -74, chr(46)=> -74, chr(58)=> -55, chr(65)=> -74, chr(97)=> -74, chr(101)=> -74, chr(105)=> -37, chr(111)=> -74, chr(114)=> -74, chr(117)=> -55, chr(121)=> -55, ), chr(89)=> array ( chr(44)=> -91, chr(46)=> -74, chr(58)=> -91, chr(65)=> -74, chr(97)=> -91, chr(101)=> -110, chr(105)=> -55, chr(111)=> -110, chr(112)=> -74, chr(113)=> -110, chr(117)=> -91, chr(118)=> -91, ), chr(102)=> array ( chr(102)=> -18, chr(146)=> 55, ), chr(114)=> array ( chr(44)=> -55, chr(46)=> -55, chr(146)=> 37, ), chr(118)=> array ( chr(44)=> -37, chr(46)=> -37, ), chr(119)=> array ( chr(44)=> -37, chr(46)=> -37, ), chr(121)=> array ( chr(44)=> -37, chr(46)=> -37, ), chr(145)=> array ( chr(145)=> -74, ), chr(146)=> array ( chr(115)=> -74, chr(116)=> -37, chr(146)=> -74, ), ); + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/font/ctimesi.php b/application/third_party/mpdf/font/ctimesi.php new file mode 100644 index 0000000..2b959c8 --- /dev/null +++ b/application/third_party/mpdf/font/ctimesi.php @@ -0,0 +1,21 @@ +<?php +$cw=array( + chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>420,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>214,'('=>333,')'=>333,'*'=>500,'+'=>675, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>675,'='=>675,'>'=>675,'?'=>500,'@'=>920,'A'=>611, + 'B'=>611,'C'=>667,'D'=>722,'E'=>611,'F'=>611,'G'=>722,'H'=>722,'I'=>333,'J'=>444,'K'=>667,'L'=>556,'M'=>833,'N'=>667,'O'=>722,'P'=>611,'Q'=>722,'R'=>611,'S'=>500,'T'=>556,'U'=>722,'V'=>611,'W'=>833, + 'X'=>611,'Y'=>556,'Z'=>556,'['=>389,'\\'=>278,']'=>389,'^'=>422,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>278,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>444,'l'=>278,'m'=>722, + 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>500,'v'=>444,'w'=>667,'x'=>444,'y'=>444,'z'=>389,'{'=>400,'|'=>275,'}'=>400,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>556,chr(133)=>889,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>500,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>556,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>556,chr(148)=>556,chr(149)=>350,chr(150)=>500,chr(151)=>889,chr(152)=>333,chr(153)=>980, + chr(154)=>389,chr(155)=>333,chr(156)=>667,chr(157)=>350,chr(158)=>389,chr(159)=>556,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>275,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>675,chr(173)=>333,chr(174)=>760,chr(175)=>333, + chr(176)=>400,chr(177)=>675,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>523,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>611,chr(193)=>611,chr(194)=>611,chr(195)=>611,chr(196)=>611,chr(197)=>611, + chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>667,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>675,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>556,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>675,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>444,chr(254)=>500,chr(255)=>444); + +$desc=array('Ascent'=>683,'Descent'=>-217,'CapHeight'=>653,'FontBBox'=>'[-169 -217 1010 883]'); +$up=-100; +$ut=50; +$kerninfo=array ( chr(49)=> array ( chr(49)=> -74, ), chr(65)=> array ( chr(84)=> -37, chr(86)=> -49, chr(87)=> -37, chr(89)=> -55, chr(118)=> -55, chr(119)=> -55, chr(121)=> -55, chr(146)=> -37, ), chr(70)=> array ( chr(44)=> -128, chr(46)=> -128, chr(65)=> -128, ), chr(76)=> array ( chr(84)=> -20, chr(86)=> -37, chr(87)=> -37, chr(89)=> -20, chr(121)=> -29, chr(146)=> -37, ), chr(80)=> array ( chr(44)=> -128, chr(46)=> -128, chr(65)=> -128, ), chr(82)=> array ( chr(84)=> 0, chr(86)=> -18, chr(87)=> -18, chr(89)=> -18, chr(121)=> -18, ), chr(84)=> array ( chr(44)=> -74, chr(46)=> -74, chr(58)=> -55, chr(65)=> -74, chr(79)=> -18, chr(97)=> -91, chr(99)=> -91, chr(101)=> -91, chr(105)=> -55, chr(111)=> -91, chr(114)=> -55, chr(115)=> -91, chr(117)=> -55, chr(119)=> -74, chr(121)=> -74, ), chr(86)=> array ( chr(44)=> -128, chr(46)=> -128, chr(58)=> -64, chr(65)=> -74, chr(79)=> -29, chr(97)=> -110, chr(101)=> -110, chr(105)=> -74, chr(111)=> -110, chr(114)=> -74, chr(117)=> -74, chr(121)=> -91, ), chr(87)=> array ( chr(44)=> -91, chr(46)=> -91, chr(58)=> -64, chr(65)=> -69, chr(97)=> -91, chr(101)=> -91, chr(105)=> -55, chr(111)=> -91, chr(114)=> -55, chr(117)=> -55, chr(121)=> -91, ), chr(89)=> array ( chr(44)=> -91, chr(46)=> -91, chr(58)=> -64, chr(65)=> -69, chr(97)=> -91, chr(101)=> -91, chr(105)=> -74, chr(111)=> -91, chr(112)=> -91, chr(113)=> -110, chr(117)=> -91, chr(118)=> -91, ), chr(102)=> array ( chr(146)=> 91, ), chr(114)=> array ( chr(44)=> -110, chr(46)=> -110, chr(99)=> -37, chr(100)=> -37, chr(101)=> -37, chr(103)=> -37, chr(104)=> -18, chr(111)=> -37, chr(113)=> -37, chr(114)=> 0, chr(116)=> 0, chr(117)=> 0, chr(118)=> 0, chr(119)=> 0, chr(120)=> 0, chr(121)=> 0, chr(146)=> 37, ), chr(118)=> array ( chr(44)=> -74, chr(46)=> -74, ), chr(119)=> array ( chr(44)=> -74, chr(46)=> -74, ), chr(121)=> array ( chr(44)=> -55, chr(46)=> -55, ), chr(145)=> array ( chr(145)=> -110, ), chr(146)=> array ( chr(115)=> -128, chr(116)=> -110, chr(146)=> -110, ), ); + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/font/czapfdingbats.php b/application/third_party/mpdf/font/czapfdingbats.php new file mode 100644 index 0000000..099d34b --- /dev/null +++ b/application/third_party/mpdf/font/czapfdingbats.php @@ -0,0 +1,21 @@ +<?php +$cw=array( + chr(0)=>0,chr(1)=>0,chr(2)=>0,chr(3)=>0,chr(4)=>0,chr(5)=>0,chr(6)=>0,chr(7)=>0,chr(8)=>0,chr(9)=>0,chr(10)=>0,chr(11)=>0,chr(12)=>0,chr(13)=>0,chr(14)=>0,chr(15)=>0,chr(16)=>0,chr(17)=>0,chr(18)=>0,chr(19)=>0,chr(20)=>0,chr(21)=>0, + chr(22)=>0,chr(23)=>0,chr(24)=>0,chr(25)=>0,chr(26)=>0,chr(27)=>0,chr(28)=>0,chr(29)=>0,chr(30)=>0,chr(31)=>0,' '=>278,'!'=>974,'"'=>961,'#'=>974,'$'=>980,'%'=>719,'&'=>789,'\''=>790,'('=>791,')'=>690,'*'=>960,'+'=>939, + ','=>549,'-'=>855,'.'=>911,'/'=>933,'0'=>911,'1'=>945,'2'=>974,'3'=>755,'4'=>846,'5'=>762,'6'=>761,'7'=>571,'8'=>677,'9'=>763,':'=>760,';'=>759,'<'=>754,'='=>494,'>'=>552,'?'=>537,'@'=>577,'A'=>692, + 'B'=>786,'C'=>788,'D'=>788,'E'=>790,'F'=>793,'G'=>794,'H'=>816,'I'=>823,'J'=>789,'K'=>841,'L'=>823,'M'=>833,'N'=>816,'O'=>831,'P'=>923,'Q'=>744,'R'=>723,'S'=>749,'T'=>790,'U'=>792,'V'=>695,'W'=>776, + 'X'=>768,'Y'=>792,'Z'=>759,'['=>707,'\\'=>708,']'=>682,'^'=>701,'_'=>826,'`'=>815,'a'=>789,'b'=>789,'c'=>707,'d'=>687,'e'=>696,'f'=>689,'g'=>786,'h'=>787,'i'=>713,'j'=>791,'k'=>785,'l'=>791,'m'=>873, + 'n'=>761,'o'=>762,'p'=>762,'q'=>759,'r'=>759,'s'=>892,'t'=>892,'u'=>788,'v'=>784,'w'=>438,'x'=>138,'y'=>277,'z'=>415,'{'=>392,'|'=>392,'}'=>668,'~'=>668,chr(127)=>0,chr(128)=>390,chr(129)=>390,chr(130)=>317,chr(131)=>317, + chr(132)=>276,chr(133)=>276,chr(134)=>509,chr(135)=>509,chr(136)=>410,chr(137)=>410,chr(138)=>234,chr(139)=>234,chr(140)=>334,chr(141)=>334,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0, + chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>0,chr(161)=>732,chr(162)=>544,chr(163)=>544,chr(164)=>910,chr(165)=>667,chr(166)=>760,chr(167)=>760,chr(168)=>776,chr(169)=>595,chr(170)=>694,chr(171)=>626,chr(172)=>788,chr(173)=>788,chr(174)=>788,chr(175)=>788, + chr(176)=>788,chr(177)=>788,chr(178)=>788,chr(179)=>788,chr(180)=>788,chr(181)=>788,chr(182)=>788,chr(183)=>788,chr(184)=>788,chr(185)=>788,chr(186)=>788,chr(187)=>788,chr(188)=>788,chr(189)=>788,chr(190)=>788,chr(191)=>788,chr(192)=>788,chr(193)=>788,chr(194)=>788,chr(195)=>788,chr(196)=>788,chr(197)=>788, + chr(198)=>788,chr(199)=>788,chr(200)=>788,chr(201)=>788,chr(202)=>788,chr(203)=>788,chr(204)=>788,chr(205)=>788,chr(206)=>788,chr(207)=>788,chr(208)=>788,chr(209)=>788,chr(210)=>788,chr(211)=>788,chr(212)=>894,chr(213)=>838,chr(214)=>1016,chr(215)=>458,chr(216)=>748,chr(217)=>924,chr(218)=>748,chr(219)=>918, + chr(220)=>927,chr(221)=>928,chr(222)=>928,chr(223)=>834,chr(224)=>873,chr(225)=>828,chr(226)=>924,chr(227)=>924,chr(228)=>917,chr(229)=>930,chr(230)=>931,chr(231)=>463,chr(232)=>883,chr(233)=>836,chr(234)=>836,chr(235)=>867,chr(236)=>867,chr(237)=>696,chr(238)=>696,chr(239)=>874,chr(240)=>0,chr(241)=>874, + chr(242)=>760,chr(243)=>946,chr(244)=>771,chr(245)=>865,chr(246)=>771,chr(247)=>888,chr(248)=>967,chr(249)=>888,chr(250)=>831,chr(251)=>873,chr(252)=>927,chr(253)=>970,chr(254)=>918,chr(255)=>0); + +$desc=array('FontBBox'=>'[-1 -143 981 820]'); +$up=-100; +$ut=50; + + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/graph.php b/application/third_party/mpdf/graph.php new file mode 100644 index 0000000..31a1ab3 --- /dev/null +++ b/application/third_party/mpdf/graph.php @@ -0,0 +1,721 @@ +<?php + + +// mPDF 4.5.009 +define("FF_USERFONT", 15); // See jpgraph_ttf.inc.php for font IDs +global $JpgUseSVGFormat; +$JpgUseSVGFormat = true; + +//====================================================================================================== +// DELETE OLD GRAPH FILES FIRST - Housekeeping +// First clear any files in directory that are >1 hrs old + $interval = 3600; + if ($handle = opendir(_MPDF_PATH.'graph_cache')) { + while (false !== ($file = readdir($handle))) { + if (((filemtime(_MPDF_PATH.'graph_cache/'.$file)+$interval) < time()) && ($file != "..") && ($file != ".")) { + @unlink(_MPDF_PATH.'graph_cache/'.$file); // mPDF 4.0 + } + } + closedir($handle); + } +//============================================================================================================== +// LOAD GRAPHS + + include_once(_JPGRAPH_PATH.'jpgraph.php'); + include_once(_JPGRAPH_PATH.'jpgraph_line.php' ); + include_once(_JPGRAPH_PATH.'jpgraph_log.php' ); + include_once(_JPGRAPH_PATH.'jpgraph_scatter.php' ); + include_once(_JPGRAPH_PATH.'jpgraph_regstat.php' ); + include_once(_JPGRAPH_PATH.'jpgraph_pie.php'); + include_once(_JPGRAPH_PATH.'jpgraph_pie3d.php'); + include_once(_JPGRAPH_PATH.'jpgraph_bar.php'); + include_once(_JPGRAPH_PATH.'jpgraph_radar.php'); + + +//====================================================================================================== +//***************************************************************************************************** +//***************************************************************************************************** +//***************************************************************************************************** +//***************************************************************************************************** +//***************************************************************************************************** +//***************************************************************************************************** +//====================================================================================================== +//====================================================================================================== + +//====================================================================================================== +//====================================================================================================== + +//====================================================================================================== +function print_graph($g,$pgwidth) { + $splines = false; + $bandw = false; + $percent = false; + $show_percent = false; + $stacked = false; + $h = false; + $show_values = false; + $hide_grid = false; + $hide_y_axis = false; + + if (isset($g['attr']['TYPE']) && $g['attr']['TYPE']) { $type = strtolower($g['attr']['TYPE']); } + if (!in_array($type,array('bar','horiz_bar','line','radar','pie','pie3d','xy','scatter'))) { $type = 'bar'; } // Default=bar + + if (isset($g['attr']['STACKED']) && $g['attr']['STACKED']) { $stacked = true; } // stacked for bar or horiz_bar + if (isset($g['attr']['SPLINES']) && $g['attr']['SPLINES'] && $type=='xy') { $splines = true; } // splines for XY line graphs + if (isset($g['attr']['BANDW']) && $g['attr']['BANDW']) { $bandw = true; } // black and white + if (isset($g['attr']['LEGEND-OVERLAP']) && $g['attr']['LEGEND-OVERLAP']) { $overlap = true; } // avoid overlap of Legends over graph (line, bar, horiz_bar only) + if (isset($g['attr']['PERCENT']) && $g['attr']['PERCENT'] && $type != 'xy' && $type != 'scatter') { $percent = true; } // Show data series as percent of total in series + if (isset($g['attr']['SHOW-VALUES']) && $g['attr']['SHOW-VALUES']) { $show_values = true; } // Show the individual data values + if (isset($g['attr']['HIDE-GRID']) && $g['attr']['HIDE-GRID']) { $hide_grid = true; } // Hide the y-axis gridlines + if (isset($g['attr']['HIDE-Y-AXIS']) && $g['attr']['HIDE-Y-AXIS']) { $hide_y_axis = true; } // Hide the y-axis + + + // Antialias: If true - better quality curves, but graph line will only be 1px even in PDF 300dpi + // default=true for most except line and radar + if (isset($g['attr']['ANTIALIAS']) && ($g['attr']['ANTIALIAS']=='' || $g['attr']['ANTIALIAS']==0)) { $antialias = false; } + else if (isset($g['attr']['ANTIALIAS']) && $g['attr']['ANTIALIAS'] > 0) { $antialias = true; } + else if ($type=='line' || $type=='radar') { $antialias = false; } + else { $antialias = true; } + + if ($g['attr']['DPI']) { $dpi = intval($g['attr']['DPI']); } + if (!$dpi || $dpi < 50 || $dpi > 2400) { $dpi = 150; } // Default dpi 150 + $k = (0.2645/25.4 * $dpi); + + // mPDF 4.5.009 + global $JpgUseSVGFormat; + if (isset($JpgUseSVGFormat) && $JpgUseSVGFormat) { + $img_type = 'svg'; + $k = 1; // Overrides as Vector scale does not need DPI + } + else { + $img_type = 'png'; + } + + if (isset($g['attr']['TITLE']) && $g['attr']['TITLE']) { $title = $g['attr']['TITLE']; } + + if (isset($g['attr']['LABEL-X']) && $g['attr']['LABEL-X']) { $xlabel = $g['attr']['LABEL-X']; } // NOT IMPLEMENTED?????? + if (isset($g['attr']['LABEL-Y']) && $g['attr']['LABEL-Y']) { $ylabel = $g['attr']['LABEL-Y']; } + + if (isset($g['attr']['AXIS-X']) && $g['attr']['AXIS-X']) { $xaxis = strtolower($g['attr']['AXIS-X']); } + if (!in_array($xaxis,array('text','lin','linear','log'))) { $xaxis = 'text'; } // Default=text + if ($xaxis == 'linear') { $xaxis = 'lin'; } + + if (isset($g['attr']['AXIS-Y']) && $g['attr']['AXIS-Y']) { $yaxis = strtolower($g['attr']['AXIS-Y']); } + if (!in_array($yaxis,array('lin','linear','log','percent'))) { $yaxis = 'lin'; } // Default=lin + if ($yaxis == 'percent') { $show_percent = true; $yaxis = 'lin'; } // Show percent sign on scales + if ($yaxis == 'linear') { $yaxis = 'lin'; } + + if ($splines) { $xaxis = 'lin'; } + $axes = $xaxis.$yaxis; // e.g.textlin, textlog, loglog, loglin, linlog (XY) + + // mPDF 4.0 + if (isset($g['attr']['cWIDTH']) && $g['attr']['cWIDTH']) { $w=($g['attr']['cWIDTH'] / 0.2645); } // pixels + if (isset($g['attr']['cHEIGHT']) && $g['attr']['cHEIGHT']) { $h=($g['attr']['cHEIGHT'] / 0.2645); } + + + if (isset($g['attr']['SERIES']) && strtolower($g['attr']['SERIES']) == 'rows') { $dataseries = 'rows'; } + else { $dataseries = 'cols'; } + + // Defaults - define data + $rowbegin = 2; + $colbegin = 2; + if($type=='scatter' || $type=='xy') { + if ($dataseries == 'rows') { $rowbegin = 1; } + else { $colbegin = 1; } + } + $rowend = 0; + $colend = 0; + + if (isset($g['attr']['DATA-ROW-BEGIN']) && ($g['attr']['DATA-ROW-BEGIN'] === '0' || $g['attr']['DATA-ROW-BEGIN'] > 0)) { $rowbegin = $g['attr']['DATA-ROW-BEGIN']; } + + if (isset($g['attr']['DATA-COL-BEGIN']) && ($g['attr']['DATA-COL-BEGIN'] === '0' || $g['attr']['DATA-COL-BEGIN'] > 0)) { $colbegin = $g['attr']['DATA-COL-BEGIN']; } + + if (isset($g['attr']['DATA-ROW-END']) && ($g['attr']['DATA-ROW-END'] === '0' || $g['attr']['DATA-ROW-END'] <> 0)) { $rowend = $g['attr']['DATA-ROW-END']; } + if (isset($g['attr']['DATA-COL-END']) && ($g['attr']['DATA-COL-END'] === '0' || $g['attr']['DATA-COL-END'] <> 0)) { $colend = $g['attr']['DATA-COL-END']; } + + $nr = count($g['data']); + $nc = 0; + foreach($g['data'] AS $r) { + $cc=0; + foreach($r AS $c) { $cc++; } + $nc = max($nc,$cc); + } + if ($colend == 0) { $colend = $nc; } + else if ($colend < 0) { $colend = $nc+$colend; } + + if ($rowend == 0) { $rowend = $nr; } + else if ($rowend < 0) { $rowend = $nr+$rowend; } + + if ($colend < $colbegin) { $colend = $colbegin; } + if ($rowend < $rowbegin) { $rowend = $rowbegin; } + +// if ($type == 'xy' || $type=='scatter') { $colstart=0; } + + // Get Data + Totals + $data = array(); + $totals = array(); + for ($r=($rowbegin-1);$r<$rowend;$r++) { + for ($c=($colbegin-1);$c<$colend;$c++) { + if (isset($g['data'][$r][$c])) { $g['data'][$r][$c] = floatval($g['data'][$r][$c] ); } + else { $g['data'][$r][$c] = 0; } + if ($dataseries=='rows') { + $data[($r+1-$rowbegin)][($c+1-$colbegin)] = $g['data'][$r][$c] ; + $totals[($r+1-$rowbegin)] += $g['data'][$r][$c] ; + } + else { + $data[($c+1-$colbegin)][($r+1-$rowbegin)] = $g['data'][$r][$c] ; + if (isset($totals[($c+1-$colbegin)])) { $totals[($c+1-$colbegin)] += $g['data'][$r][$c] ; } + else { $totals[($c+1-$colbegin)] = $g['data'][$r][$c] ; } + } + } + } + // PERCENT + if ($percent && $type != 'pie' && $type != 'pie3d') { + for ($r=0;$r<count($data);$r++) { + for ($c=0;$c<count($data[$r]);$c++) { + $data[$r][$c] = $data[$r][$c]/$totals[$r] * 100; + } + } + } + // Get Legends and labels + $legends = array(); + $labels = array(); + $longestlegend = 0; + $longestlabel = 0; + if ($dataseries=='cols') { + if ($colbegin>1) { + for ($r=($rowbegin-1);$r<$rowend;$r++) { + $legends[($r+1-$rowbegin)] = $g['data'][$r][0] ; + $longestlegend = max($longestlegend, strlen( $g['data'][$r][0] )); + } + } + if ($rowbegin>1) { + for ($c=($colbegin-1);$c<$colend;$c++) { + $labels[($c+1-$colbegin)] = $g['data'][0][$c] ; + $longestlabel = max($longestlabel , strlen( $g['data'][0][$c] )); + } + } + } + else if ($dataseries=='rows') { + if ($colbegin>1) { + for ($r=($rowbegin-1);$r<$rowend;$r++) { + $labels[($r+1-$rowbegin)] = $g['data'][$r][0] ; + $longestlabel = max($longestlabel , strlen( $g['data'][$r][0] )); + } + } + if ($rowbegin>1) { + for ($c=($colbegin-1);$c<$colend;$c++) { + $legends[($c+1-$colbegin)] = $g['data'][0][$c] ; + $longestlegend = max($longestlegend, strlen( $g['data'][0][$c] )); + } + } + } + // Default sizes + $defsize = array(); + $defsize['pie'] = array('w' => 600, 'h' => 300); + $defsize['pie3d'] = array('w' => 600, 'h' => 300); + $defsize['radar'] = array('w' => 600, 'h' => 300); + $defsize['line'] = array('w' => 600, 'h' => 400); + $defsize['xy'] = array('w' => 600, 'h' => 400); + $defsize['scatter'] = array('w' => 600, 'h' => 400); + $defsize['bar'] = array('w' => 600, 'h' => 400); + $defsize['horiz_bar'] = array('w' => 600, 'h' => 500); + + + // Use default ratios + if ($w && !$h) { $h = $w*$defsize[$type]['h']/$defsize[$type]['w']; } + if ($h && !$w) { $w = $h*$defsize[$type]['w']/$defsize[$type]['h']; } + if (!$h && !$w) { $w = $defsize[$type]['w']; $h = $defsize[$type]['h']; } + + + if (count($data)>0 && $type) { + $figure_file = "graph_cache/".rand(11111,999999999).".".$img_type; + if ($bandw) { $colours = array('snow1','black','snow4','snow3','snow2','cadetblue4','cadetblue3','cadetblue1','bisque4','bisque2','beige'); } + else { $colours = array('cyan','darkorchid4','cadetblue3','khaki1','darkolivegreen2','cadetblue4','coral','cyan4','rosybrown3','wheat1'); } + $fills = array('navy','orange','red','yellow','purple','navy','orange','red','yellow','purple'); + $patterns = array(PATTERN_DIAG1,PATTERN_CROSS1,PATTERN_STRIPE1,PATTERN_DIAG3,PATTERN_CROSS2,PATTERN_DIAG2,PATTERN_DIAG4,PATTERN_CROSS3, PATTERN_CROSS4,PATTERN_STRIPE1); + $markers = array(MARK_DIAMOND, MARK_SQUARE, MARK_CIRCLE, MARK_UTRIANGLE, MARK_DTRIANGLE, MARK_FILLEDCIRCLE, MARK_CROSS, MARK_STAR, MARK_X); + + // LEGENDS + if ($type == 'pie' || $type == 'pie3d') { + $graph = new PieGraph (($w*$k),($h*$k)); + } + else if ($type == 'radar') { + $graph = new RadarGraph(($w*$k),($h*$k)); + } + else { + $graph = new Graph(($w*$k),($h*$k)); + } + +// mPDF 4.5.009 +// $graph->img->SetImgFormat($img_type) ; +// if (strtoupper($img_type)=='JPEG') { $graph->img->SetQuality(90); } + if ($antialias) { $graph->img->SetAntiAliasing(); } + $graph->SetShadow(true, 2*$k); + $graph->SetMarginColor("white"); + // TITLE + $graph->title->Set($title); + $graph->title->SetMargin(10*$k); + $graph->title->SetFont(FF_USERFONT,FS_BOLD,11*$k); + $graph->title->SetColor("black"); + $graph->legend->SetLineSpacing(3*$k); + $graph->legend->SetMarkAbsSize(6*$k); + $graph->legend->SetFont(FF_USERFONT,FS_NORMAL,8*$k); + + // Set GRAPH IMAGE MARGINS + if ($type == 'pie' || $type == 'pie3d') { + $psize = 0.3; + $pposxabs = ($w/2); + $pposy = 0.55; + if ($longestlegend) { // if legend showing + $pposxabs -= ((($longestlegend * 5) + 20) / 2); + } + $pposx = ($pposxabs / $w); + $graph->legend->Pos(0.02,0.5,'right','center'); + } + else if ($type == 'radar') { + $psize = 0.5; + $pposxabs = ($w/2); + $pposy = 0.55; + if ($longestlabel) { // if legend showing + $pposxabs -= ((($longestlabel * 5) + 20) / 2); + } + $pposx = ($pposxabs / $w); + $graph->legend->Pos(0.02,0.5,'right','center'); + } + else if ($type == 'xy' || $type == 'scatter') { + $pml = 50; + $pmr = 20; + $pmt = 60; + $pmb = 50; + $xaxislblmargin = $pmb - 30; + $yaxislblmargin = $pml - 15; + $graph->legend->Pos(0.02,0.1,'right','top'); + } + else if ($type == 'line' || $type == 'bar') { + $pml = 50; + $pmr = 20; + $pmt = 60; + $pmb = 50; + $xlangle = 0; + $ll = ($longestlegend * 5); // 45 degrees 8pt fontsize + if ($ll > 5 || ($ll>3 && count($data)>10)) { + $pmb = max($pmb, $ll + 30); + $xlangle = 50; + } + $xaxislblmargin = $pmb - 30; + $yaxislblmargin = $pml - 15; + if ($longestlabel && !$overlap) { // if legend showing + $pmr = ((($longestlabel * 5) + 40)); + } + $graph->legend->Pos(0.02,0.1,'right','top'); + } + else if ($type == 'horiz_bar') { + $pml = 50; + $pmr = 20; + $pmt = 50; + $pmb = 45; + $ll = ($longestlegend * 6.5); // 8pt fontsize + $pml = max($pml, $ll + 20); + $xaxislblmargin = $pml - 20; + $yaxislblmargin = $pmb - 15; + if ($longestlabel && !$overlap) { // if legend showing + $pmr = ((($longestlabel * 5) + 40)); + } + $graph->legend->Pos(0.02,0.1,'right','top'); + } + + + // DRAW THE GRAPHS + if ($type == 'pie') { + $p1 = new PiePlot($data[0]); + $p1->SetSliceColors($colours); + + if ($show_values) { + $p1->value->SetFont(FF_USERFONT,FS_NORMAL,8*$k); + if ($percent) { $p1->SetLabelType(PIE_VALUE_PERADJ); } //PIE_VAL_PER = default + else { $p1->SetLabelType(PIE_VALUE_ABS); } + if ($percent || $show_percent) { $p1->value->SetFormat("%d%%"); } + else { $p1->value->SetFormat("%s"); } + // Enable and set policy for guide-lines. Make labels line up vertically + $p1->SetGuideLines(true); + $p1->SetGuideLinesAdjust(1.5); + } + else { $p1->value->Show(false); } + $p1->SetLegends($legends); + $p1->SetSize($psize); + $p1->SetCenter($pposx, $pposy); + if ($labels[0]) { + $graph->subtitle->Set($labels[0]); + $graph->subtitle->SetMargin(10*$k); + $graph->subtitle->SetFont(FF_USERFONT,FS_BOLD,11*$k); + $graph->subtitle->SetColor("black"); + } + $graph->Add($p1); + } + else if ($type == 'pie3d') { + $p1 = new PiePlot3d($data[0]); + $p1->SetSliceColors($colours); + if ($show_values) { + $p1->value->SetFont(FF_USERFONT,FS_NORMAL,8*$k); + if ($percent) { $p1->SetLabelType(PIE_VALUE_PERADJ); } //PIE_VAL_PER = default + else { $p1->SetLabelType(PIE_VALUE_ABS); } + if ($percent || $show_percent) { $p1->value->SetFormat("%d%%"); } + else { $p1->value->SetFormat("%s"); } + } + else { $p1->value->Show(false); } + $p1->SetLegends($legends); + $p1->SetEdge(); + $p1->SetSize($psize); + $p1->SetCenter($pposx, $pposy); + + if ($labels[0]) { + $graph->subtitle->Set($labels[0]); + $graph->subtitle->SetMargin(10*$k); + $graph->subtitle->SetFont(FF_USERFONT,FS_BOLD,11*$k); + $graph->subtitle->SetColor("black"); + } + + $graph->Add( $p1); + } + // RADAR + else if ($type == 'radar') { + $graph->SetSize($psize); + $graph->SetPos($pposx, $pposy); + + $graph->SetTitles( $legends); // labels each axis + + $graph->axis->title->SetFont(FF_USERFONT,FS_NORMAL,8*$k); + $graph->axis->title->SetMargin(5*$k); + $graph->axis->SetWeight(1*$k); + $graph->axis->HideLabels(); + $graph->axis->SetFont(FF_USERFONT,FS_NORMAL,6*$k); + $graph->HideTickMarks(); + + $group = array(); + foreach($data AS $series => $dat) { + $rdata = array(); + foreach($data[$series] AS $row) { $rdata[] = $row; } + if (count($rdata)<3) { die("ERROR::Graph::Cannot create a Radar Plot with less than 3 data points."); } + // Create the radar plot + $bplot = new RadarPlot($rdata); + $bplot->mark->SetType($markers[$series]); + $bplot->mark->SetFillColor($colours[$series]); + $bplot->mark->SetWidth(3*$k); + $bplot->SetColor($colours[$series]); + if ($series == 0) { $bplot->SetFillColor('lightred'); } + else { $bplot->SetFill(false); } + $bplot->SetLineWeight(1*$k); + $bplot->SetLegend($labels[$series]); + if ($bandw) { $bplot->SetShadow("gray5"); } + $graph->Add($bplot); + } + } + // LINE + else if ($type == 'line') { + // Setup the graph. + $graph->img->SetMargin($pml*$k,$pmr*$k,$pmt*$k,$pmb*$k); // LRTB + $graph->SetScale($axes); + $graph->yaxis->SetFont(FF_USERFONT,FS_NORMAL,8*$k); + + if ($ylabel) { + $graph->yaxis->title->SetFont(FF_USERFONT,FS_NORMAL,8*$k); + $graph->yaxis->SetTitle($ylabel,'middle'); + $graph->yaxis->SetTitleMargin($yaxislblmargin*$k); + } + + $graph->yaxis->SetLabelMargin(4*$k); + if ($percent || $show_percent) { $graph->yaxis->SetLabelFormat('%d%%'); } // Percent + + // Show 0 label on Y-axis (default is not to show) + $graph->yscale->ticks->SupressZeroLabel(true); + if ($hide_y_axis) { $graph->yaxis->Hide(); } + if ($hide_grid) { $graph->ygrid->Show(false); } + + // Setup X-axis labels + $graph->xaxis->SetFont(FF_USERFONT,FS_NORMAL,8*$k); + $graph->xaxis->SetTickLabels($legends); + $graph->xaxis->SetLabelAngle($xlangle); + $graph->xaxis->SetLabelMargin(4*$k); + // X-axis title + if ($xlabel) { + $graph->xaxis->title->SetFont(FF_USERFONT,FS_NORMAL,8*$k); + $graph->xaxis->SetTitle($xlabel,'middle'); + $graph->xaxis->SetTitleMargin($xaxislblmargin*$k); + } + foreach($data AS $series => $rdata) { + $bplot = new LinePlot($rdata); + $bplot->mark->SetType($markers[$series]); + $bplot->mark->SetFillColor($colours[$series]); + $bplot->mark->SetWidth(4*$k); + if ($show_values) { + $bplot->value-> Show(); // Not if scatter + $bplot->value->SetMargin(6*$k); + $bplot->value->SetColor("darkred"); + $bplot->value->SetFont( FF_USERFONT, FS_NORMAL, 8*$k); + if ($percent || $show_percent) { $bplot->value->SetFormat( '%d%%'); } + else { $bplot->value->SetFormat("%s"); } + } + // Set color for each line + $bplot->SetColor($colours[$series]); + $bplot->SetWeight(2*$k); + $bplot->SetLegend($labels[$series]); + if ($bandw) { $bplot->SetShadow("gray5"); } + // Indent the X-scale so the first and last point doesn't fall on the edges + $bplot->SetCenter(); + $graph->Add($bplot); + } + + } + // XY or SCATTER + else if ($type == 'xy' || $type == 'scatter') { + // Setup the graph. + $graph->img->SetMargin($pml*$k,$pmr*$k,$pmt*$k,$pmb*$k); // LRTB + $graph->SetScale($axes); + // Setup font for axis + $graph->yaxis->SetFont(FF_USERFONT,FS_NORMAL,8*$k); + // Y-axis title + if ($labels[1]) { + $graph->yaxis->title->SetFont(FF_USERFONT,FS_NORMAL,8*$k); + $graph->yaxis->SetTitleMargin($yaxislblmargin*$k); + $graph->yaxis->SetTitle($labels[1],'middle'); + } + + + $graph->yaxis->SetLabelMargin(4*$k); + if ($percent || $show_percent) { $graph->yaxis->SetLabelFormat('%d%%'); } // Percent + + // Show 0 label on Y-axis (default is not to show) + $graph->yscale->ticks->SupressZeroLabel(true); + // Just let the maximum be autoscaled + $graph->yaxis->scale->SetAutoMin(0); + if ($hide_y_axis) { $graph->yaxis->Hide(); } + if ($hide_grid) { $graph->ygrid->Show(false); } + + // Setup X-axis labels + $graph->xaxis->SetFont(FF_USERFONT,FS_NORMAL,8*$k); +// mPDF 2.5 Corrects labelling of x-axis +// $graph->xaxis->SetTickLabels($legends); + $graph->xaxis->SetLabelAngle(50); + $graph->xaxis->SetLabelMargin(4*$k); + // X-axis title + if ($labels[0]) { + $graph->xaxis->title->SetFont(FF_USERFONT,FS_NORMAL,8*$k); + $graph->xaxis->SetTitleMargin($xaxislblmargin*$k); + $graph->xaxis->SetTitle($labels[0],'middle'); + } + + // Create the bar plot + // SPLINES + if ($splines && $type=='xy') { + $spline = new Spline($data[0],$data[1]); + list($newx,$newy) = $spline->Get(100); + } + else { + $newx = $data[0]; + $newy = $data[1]; + } + + if ($type=='xy') { + // LINE PLOT + $bplot = new LinePlot($newy, $newx); + // Set color for each line + $bplot->SetColor($fills[0]); + $bplot->SetWeight(4*$k); + if ($bandw) { $bplot->SetShadow("gray5"); } + $graph->Add($bplot); + } + + // SCATTER PLOT + $cplot = new ScatterPlot($data[1], $data[0]); + + $cplot->mark->SetType($markers[0]); + $cplot->mark->SetFillColor($fills[0]); + $cplot->mark->SetWidth(8*$k); + if ($show_values) { +// mPDF 2.5 + if ($type=='xy') { $cplot->value->Show(); } // Not if scatter + $cplot->value->SetMargin(8*$k); + $cplot->value->SetColor("darkred"); + $cplot->value->SetFont( FF_USERFONT, FS_NORMAL, 6*$k); + + if ($percent || $show_percent) { $cplot->value->SetFormat( '%d%%'); } + else { $cplot->value->SetFormat("%s"); } + } + + // Set color for each line + $cplot->SetColor($fills[0]); + $cplot->SetWeight(4*$k); + if ($bandw) { $cplot->SetShadow("gray5"); } + $graph->Add($cplot); + + } + // BAR + else if ($type == 'bar') { + // Setup the graph. + $graph->img->SetMargin($pml*$k,$pmr*$k,$pmt*$k,$pmb*$k); // LRTB + $graph->SetScale($axes); + // Setup y-axis + $graph->yaxis->SetFont(FF_USERFONT,FS_NORMAL,8*$k); + if ($hide_y_axis) { $graph->yaxis->Hide(); } + if ($hide_grid) { $graph->ygrid->Show(false); } + $graph->yaxis->SetLabelMargin(4*$k); + if ($ylabel) { + $graph->yaxis->title->SetFont(FF_USERFONT,FS_NORMAL,8*$k); + $graph->yaxis->SetTitle($ylabel,'middle'); + $graph->yaxis->SetTitleMargin($yaxislblmargin*$k); + } + // Show 0 label on Y-axis (default is not to show) + $graph->yscale->ticks->SupressZeroLabel(false); + // Setup X-axis labels + $graph->xaxis->SetFont(FF_USERFONT,FS_NORMAL,8*$k); + $graph->xaxis->SetTickLabels($legends); + $graph->xaxis->SetLabelAngle($xlangle); + $graph->xaxis->SetLabelMargin(4*$k); + // X-axis title + if ($xlabel) { + $graph->xaxis->title->SetFont(FF_USERFONT,FS_NORMAL,8*$k); + $graph->xaxis->SetTitle($xlabel,'middle'); + $graph->xaxis->SetTitleMargin($xaxislblmargin*$k); + } + + $group = array(); + foreach($data AS $series => $dat) { + $rdata = array(); + foreach($data[$series] AS $row) { $rdata[] = $row; } + + // Create the bar plot + $bplot = new BarPlot($rdata); + $bplot->SetWidth(0.6); // for SINGLE?? + // Setup color for gradient fill style + if ($bandw) { $bplot->SetPattern( $patterns[$series]); } + else { $bplot->SetFillGradient($fills[$series],"#EEEEEE",GRAD_LEFT_REFLECTION); } + + // Set color for the frame of each bar + $bplot->SetColor("darkgray"); + $bplot->SetLegend($labels[$series]); + if ($bandw) { $bplot->SetShadow("gray5"); } + if ($show_values) { + $bplot->value->Show(); + $bplot->value->SetMargin(6*$k); + $bplot->value->SetColor("darkred"); + $bplot->value->SetFont( FF_USERFONT, FS_NORMAL, 8*$k); + if ($percent || $show_percent) { $bplot->value->SetFormat( '%d%%'); } + else { $bplot->value->SetFormat("%s"); } + } + + $group[] = $bplot; + } + if (count($data)==1) { + $graph->Add($group[0]); + } + else { + // Create the grouped bar plot + if ($stacked) { + $gbplot = new AccBarPlot ($group); + } + else { + $gbplot = new GroupBarPlot ($group); + } + $graph->Add($gbplot); + } + } + else if ($type == 'horiz_bar') { + $graph->SetScale($axes); + $graph->Set90AndMargin($pml*$k,$pmr*$k,$pmt*$k,$pmb*$k); // LRTB + + // Setup y-axis + $graph->yaxis->SetFont(FF_USERFONT,FS_NORMAL,8*$k); + $graph->yaxis->SetLabelMargin(4*$k); + + $graph->yaxis->SetPos('max'); // Intersect at top of x-axis i.e. y axis is at bottom + // First make the labels look right + $graph->yaxis->SetLabelAlign('center','top'); + if ($percent || $show_percent) { $graph->yaxis->SetLabelFormat('%d%%'); } + $graph->yaxis->SetLabelSide(SIDE_RIGHT); + $graph->yaxis->scale->SetGrace(10); // sets 10% headroom + if ($hide_y_axis) { $graph->yaxis->Hide(); } + if ($hide_grid) { $graph->ygrid->Show(false); } + + // The fix the tick marks + $graph->yaxis->SetTickSide(SIDE_LEFT); + if ($ylabel) { + $graph->yaxis->title->SetFont(FF_USERFONT,FS_NORMAL,8*$k); + $graph->yaxis->SetTitle($ylabel,'middle'); + $graph->yaxis->SetTitleMargin($yaxislblmargin*$k); + // Finally setup the title + $graph->yaxis->SetTitleSide(SIDE_RIGHT); + // To align the title to the right use : + $graph->yaxis->title->Align('right'); + $graph->yaxis->title->SetAngle(0); + + } + + // Show 0 label on Y-axis (default is not to show) + $graph->yscale->ticks->SupressZeroLabel(false); + // Setup X-axis labels + $graph->xaxis->SetFont(FF_USERFONT,FS_NORMAL,8*$k); + $graph->xaxis->title->SetAngle(90); + $graph->xaxis->SetTickLabels($legends); + $graph->xaxis->SetLabelMargin(4*$k); + // X-axis title + if ($xlabel) { + $graph->xaxis->title->SetFont(FF_USERFONT,FS_NORMAL,8*$k); + $graph->xaxis->SetTitleMargin($xaxislblmargin*$k); + $graph->xaxis->SetTitle($xlabel,'middle'); + } + $group = array(); + foreach($data AS $series => $dat) { + $rdata = array(); + foreach($data[$series] AS $row) { $rdata[] = $row; } + // Create the bar pot + $bplot = new BarPlot($rdata); + $bplot->SetWidth(0.6); // for SINGLE?? + // Setup color for gradient fill style + if ($bandw) { $bplot->SetPattern( $patterns[$series]); } + else { $bplot->SetFillGradient($fills[$series],"#EEEEEE",GRAD_LEFT_REFLECTION); } + + // Set color for the frame of each bar + $bplot->SetColor("darkgray"); + $bplot->SetLegend($labels[$series]); + if ($bandw) { $bplot->SetShadow("gray5"); } + if ($show_values) { + $bplot->value-> Show(); + $bplot->value->SetMargin(6*$k); + $bplot->value->SetColor("darkred"); + $bplot->value->SetFont( FF_USERFONT, FS_NORMAL, 8*$k); + if ($percent || $show_percent) { $bplot->value->SetFormat( '%d%%'); } + else { $bplot->value->SetFormat("%s"); } + } + + $group[] = $bplot; + } + if (count($data)==1) { + $graph->Add($group[0]); + } + else { + // Create the grouped bar plot + if ($stacked) { + $gbplot = new AccBarPlot ($group); + } + else { + $gbplot = new GroupBarPlot ($group); + } + $graph->Add($gbplot); + } + } + if ($graph) { + $graph->Stroke( _MPDF_PATH.$figure_file); + $srcpath = str_replace("\\","/",dirname(__FILE__)) . "/"; + $srcpath .= $figure_file; + return array('file'=>$srcpath, 'w'=>$w, 'h'=>$h); + } + } + return false; +} +//====================================================================================================== +//====================================================================================================== +//====================================================================================================== +//====================================================================================================== + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/graph_cache/dummy.txt b/application/third_party/mpdf/graph_cache/dummy.txt new file mode 100644 index 0000000..8977335 --- /dev/null +++ b/application/third_party/mpdf/graph_cache/dummy.txt @@ -0,0 +1,2 @@ +This is just a placeholder file so that the folder is created on install. +It can be deleted once installed. \ No newline at end of file diff --git a/application/third_party/mpdf/iccprofiles/SWOP2006_Coated5v2.icc b/application/third_party/mpdf/iccprofiles/SWOP2006_Coated5v2.icc new file mode 100644 index 0000000..0d06cd5 Binary files /dev/null and b/application/third_party/mpdf/iccprofiles/SWOP2006_Coated5v2.icc differ diff --git a/application/third_party/mpdf/iccprofiles/sRGB_IEC61966-2-1.icc b/application/third_party/mpdf/iccprofiles/sRGB_IEC61966-2-1.icc new file mode 100644 index 0000000..d0ef573 Binary files /dev/null and b/application/third_party/mpdf/iccprofiles/sRGB_IEC61966-2-1.icc differ diff --git a/application/third_party/mpdf/includes/CJKdata.php b/application/third_party/mpdf/includes/CJKdata.php new file mode 100644 index 0000000..15f34d3 --- /dev/null +++ b/application/third_party/mpdf/includes/CJKdata.php @@ -0,0 +1,101 @@ +<?php +// mPDF 2.5 + +// BIG 5 +$cw = array( + 32 => 250, 33 => 250, 34 => 408, 35 => 668, 36 => 490, 37 => 875, 38 => 698, 39 => 250, 40 => 240, 41 => 240, + 42 => 417, 43 => 667, 44 => 250, 45 => 313, 46 => 250, 47 => 520, 48 => 500, 49 => 500, 50 => 500, 51 => 500, + 52 => 500, 53 => 500, 54 => 500, 55 => 500, 56 => 500, 57 => 500, 58 => 250, 59 => 250, 60 => 667, 61 => 667, + 62 => 667, 63 => 396, 64 => 921, 65 => 677, 66 => 615, 67 => 719, 68 => 760, 69 => 625, 70 => 552, 71 => 771, + 72 => 802, 73 => 354, 74 => 354, 75 => 781, 76 => 604, 77 => 927, 78 => 750, 79 => 823, 80 => 563, 81 => 823, + 82 => 729, 83 => 542, 84 => 698, 85 => 771, 86 => 729, 87 => 948, 88 => 771, 89 => 677, 90 => 635, 91 => 344, + 92 => 520, 93 => 344, 94 => 469, 95 => 500, 96 => 250, 97 => 469, 98 => 521, 99 => 427, 100 => 521, 101 => 438, + 102 => 271, 103 => 469, 104 => 531, 105 => 250, 106 => 250, 107 => 458, 108 => 240, 109 => 802, 110 => 531, 111 => 500, + 112 => 521, 113 => 521, 114 => 365, 115 => 333, 116 => 292, 117 => 521, 118 => 458, 119 => 677, 120 => 479, 121 => 458, + 122 => 427, 123 => 480, 124 => 496, 125 => 480, 126 => 667, + 17601 => 500, +); +$this->Big5_widths=$cw; + + +// GB +$cw = array( + 32 => 207, 33 => 270, 34 => 342, 35 => 467, 36 => 462, 37 => 797, 38 => 710, 39 => 239, 40 => 374, 41 => 374, + 42 => 423, 43 => 605, 44 => 238, 45 => 375, 46 => 238, 47 => 334, 48 => 462, 49 => 462, 50 => 462, 51 => 462, + 52 => 462, 53 => 462, 54 => 462, 55 => 462, 56 => 462, 57 => 462, 58 => 238, 59 => 238, 60 => 605, 61 => 605, + 62 => 605, 63 => 344, 64 => 748, 65 => 684, 66 => 560, 67 => 695, 68 => 739, 69 => 563, 70 => 511, 71 => 729, + 72 => 793, 73 => 318, 74 => 312, 75 => 666, 76 => 526, 77 => 896, 78 => 758, 79 => 772, 80 => 544, 81 => 772, + 82 => 628, 83 => 465, 84 => 607, 85 => 753, 86 => 711, 87 => 972, 88 => 647, 89 => 620, 90 => 607, 91 => 374, + 92 => 333, 93 => 374, 94 => 606, 95 => 500, 96 => 239, 97 => 417, 98 => 503, 99 => 427, 100 => 529, 101 => 415, + 102 => 264, 103 => 444, 104 => 518, 105 => 241, 106 => 230, 107 => 495, 108 => 228, 109 => 793, 110 => 527, 111 => 524, + 112 => 524, 113 => 504, 114 => 338, 115 => 336, 116 => 277, 117 => 517, 118 => 450, 119 => 652, 120 => 466, 121 => 452, + 122 => 407, 123 => 370, 124 => 258, 125 => 370, 126 => 605, +); +$this->GB_widths=$cw; + +// Japanese +$cw = array( + 32 => 278, 33 => 299, 34 => 353, 35 => 614, 36 => 614, 37 => 721, 38 => 735, 39 => 216, 40 => 323, 41 => 323, + 42 => 449, 43 => 529, 44 => 219, 45 => 306, 46 => 219, 47 => 453, 48 => 614, 49 => 614, 50 => 614, 51 => 614, + 52 => 614, 53 => 614, 54 => 614, 55 => 614, 56 => 614, 57 => 614, 58 => 219, 59 => 219, 60 => 529, 61 => 529, + 62 => 529, 63 => 486, 64 => 744, 65 => 646, 66 => 604, 67 => 617, 68 => 681, 69 => 567, 70 => 537, 71 => 647, + 72 => 738, 73 => 320, 74 => 433, 75 => 637, 76 => 566, 77 => 904, 78 => 710, 79 => 716, 80 => 605, 81 => 716, + 82 => 623, 83 => 517, 84 => 601, 85 => 690, 86 => 668, 87 => 990, 88 => 681, 89 => 634, 90 => 578, 91 => 316, + 92 => 614, 93 => 316, 94 => 529, 95 => 500, 96 => 387, 97 => 509, 98 => 566, 99 => 478, 100 => 565, 101 => 503, + 102 => 337, 103 => 549, 104 => 580, 105 => 275, 106 => 266, 107 => 544, 108 => 276, 109 => 854, 110 => 579, 111 => 550, + 112 => 578, 113 => 566, 114 => 410, 115 => 444, 116 => 340, 117 => 575, 118 => 512, 119 => 760, 120 => 503, 121 => 529, + 122 => 453, 123 => 326, 124 => 380, 125 => 326, 126 => 387, 127 => 216, 128 => 453, 129 => 216, 130 => 380, 131 => 529, + 132 => 299, 133 => 614, 134 => 614, 135 => 265, 136 => 614, 137 => 475, 138 => 614, 139 => 353, 140 => 451, 141 => 291, + 142 => 291, 143 => 588, 144 => 589, 145 => 500, 146 => 476, 147 => 476, 148 => 219, 149 => 494, 150 => 452, 151 => 216, + 152 => 353, 153 => 353, 154 => 451, 156 => 1075, 157 => 486, 158 => 387, 159 => 387, 160 => 387, 161 => 387, + 162 => 387, 163 => 387, 164 => 387, 165 => 387, 166 => 387, 167 => 387, 168 => 387, 170 => 880, 171 => 448, + 172 => 566, 173 => 716, 174 => 903, 175 => 460, 176 => 805, 177 => 275, 178 => 276, 179 => 550, 180 => 886, 181 => 582, + 182 => 529, 183 => 738, 184 => 529, 185 => 738, 186 => 357, 187 => 529, 188 => 406, 189 => 406, 190 => 575, 191 => 406, + 192 => 934, 193 => 934, 194 => 934, 195 => 646, 196 => 646, 197 => 646, 198 => 646, 199 => 646, 200 => 646, 201 => 617, + 202 => 567, 203 => 567, 204 => 567, 205 => 567, 206 => 320, 207 => 320, 208 => 320, 209 => 320, 210 => 681, 211 => 710, + 212 => 716, 213 => 716, 214 => 716, 215 => 716, 216 => 716, 217 => 529, 218 => 690, 219 => 690, 220 => 690, 221 => 690, + 222 => 634, 223 => 605, 224 => 509, 225 => 509, 226 => 509, 227 => 509, 228 => 509, 229 => 509, 230 => 478, 231 => 503, + 232 => 503, 233 => 503, 234 => 503, 235 => 275, 236 => 275, 237 => 275, 238 => 275, 239 => 550, 240 => 579, 241 => 550, + 242 => 550, 243 => 550, 244 => 550, 245 => 550, 246 => 529, 247 => 575, 248 => 575, 249 => 575, 250 => 575, 251 => 529, + 252 => 578, 253 => 529, 254 => 517, 255 => 634, 256 => 578, 257 => 445, 258 => 444, 259 => 842, 260 => 453, 261 => 614, +); + + +$_cr = array( + array(231, 632, 500), // half-width + array(8718, 8718, 500), + array(9738, 9757, 250), // quarter-width + array(9758, 9778, 333), // third-width + array(12063, 12087, 500), +); +foreach($_cr as $_r) { + for($i = $_r[0]; $i <= $_r[1]; $i++) { + $cw[$i+31] = $_r[2]; + } +} +$this->SJIS_widths=$cw; + +// Korean +$cw = array( + 32 => 333, 33 => 416, 34 => 416, 35 => 833, 36 => 625, 37 => 916, 38 => 833, 39 => 250, 40 => 500, 41 => 500, + 42 => 500, 43 => 833, 44 => 291, 45 => 450, 46 => 291, 47 => 375, 48 => 625, 49 => 625, 50 => 625, 51 => 625, + 52 => 625, 53 => 625, 54 => 625, 55 => 625, 56 => 625, 57 => 625, 58 => 333, 59 => 333, 60 => 833, 61 => 833, + 62 => 916, 63 => 500, 64 => 1000, 65 => 791, 66 => 708, 67 => 708, 68 => 750, 69 => 708, 70 => 666, 71 => 750, + 72 => 791, 73 => 375, 74 => 500, 75 => 791, 76 => 666, 77 => 916, 78 => 791, 79 => 750, 80 => 666, 81 => 750, + 82 => 708, 83 => 666, 84 => 791, 85 => 791, 86 => 750, 87 => 1000, 88 => 708, 89 => 708, 90 => 666, 91 => 500, + 92 => 375, 93 => 500, 94 => 500, 95 => 500, 96 => 333, 97 => 541, 98 => 583, 99 => 541, 100 => 583, 101 => 583, + 102 => 375, 103 => 583, 104 => 583, 105 => 291, 106 => 333, 107 => 583, 108 => 291, 109 => 875, 110 => 583, 111 => 583, + 112 => 583, 113 => 583, 114 => 458, 115 => 541, 116 => 375, 117 => 583, 118 => 583, 119 => 833, 120 => 625, 121 => 625, + 122 => 500, 123 => 583, 124 => 583, 125 => 583, 126 => 750, +); +$_cr = array( + array(8094, 8190, 500) +); +foreach($_cr as $_r) { + for($i = $_r[0]; $i <= $_r[1]; $i++) { + $cw[$i+31] = $_r[2]; + } +} +$this->UHC_widths=$cw; + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/includes/Thumbs.db b/application/third_party/mpdf/includes/Thumbs.db new file mode 100644 index 0000000..19beded Binary files /dev/null and b/application/third_party/mpdf/includes/Thumbs.db differ diff --git a/application/third_party/mpdf/includes/functions.php b/application/third_party/mpdf/includes/functions.php new file mode 100644 index 0000000..a6f6749 --- /dev/null +++ b/application/third_party/mpdf/includes/functions.php @@ -0,0 +1,126 @@ +<?php + +// mPDF 5.6.23 +function array_insert(&$array, $value, $offset) { + if (is_array($array)) { + $array = array_values($array); + $offset = intval($offset); + if ($offset < 0 || $offset >= count($array)) { array_push($array, $value); } + else if ($offset == 0) { array_unshift($array, $value); } + else { + $temp = array_slice($array, 0, $offset); + array_push($temp, $value); + $array = array_slice($array, $offset); + $array = array_merge($temp, $array); + } + } + else { $array = array($value); } + return count($array); +} + +function urlencode_part($url) { // mPDF 5.6.02 + if (!preg_match('/^[a-z]+:\/\//i',$url)) { return $url; } + $file=$url; + $query=''; + if (preg_match('/[?]/',$url)) { + $bits = preg_split('/[?]/',$url,2); + $file=$bits[0]; + $query='?'.$bits[1]; + } + $file = str_replace(array(" ","!","$","&","'","(",")","*","+",",",";","="),array("%20","%21","%24","%26","%27","%28","%29","%2A","%2B","%2C","%3B","%3D"),$file); + return $file.$query; +} + + +function _strspn($str1, $str2, $start=null, $length=null) { + $numargs = func_num_args(); + if ($numargs == 2) { + return strspn($str1, $str2); + } + else if ($numargs == 3) { + return strspn($str1, $str2, $start); + } + else { + return strspn($str1, $str2, $start, $length); + } +} + + +function _strcspn($str1, $str2, $start=null, $length=null) { + $numargs = func_num_args(); + if ($numargs == 2) { + return strcspn($str1, $str2); + } + else if ($numargs == 3) { + return strcspn($str1, $str2, $start); + } + else { + return strcspn($str1, $str2, $start, $length); + } +} + +function _fgets (&$h, $force=false) { + $startpos = ftell($h); + $s = fgets($h, 1024); + if ($force && preg_match("/^([^\r\n]*[\r\n]{1,2})(.)/",trim($s), $ns)) { + $s = $ns[1]; + fseek($h,$startpos+strlen($s)); + } + return $s; +} + + +// For PHP4 compatability +if(!function_exists('str_ireplace')) { + function str_ireplace($search,$replace,$subject) { + $search = preg_quote($search, "/"); + return preg_replace("/".$search."/i", $replace, $subject); + } +} +if(!function_exists('htmlspecialchars_decode')) { + function htmlspecialchars_decode ($str) { + return strtr($str, array_flip(get_html_translation_table(HTML_SPECIALCHARS))); + } +} + +function PreparePreText($text,$ff='//FF//') { + $text = htmlspecialchars($text); + if ($ff) { $text = str_replace($ff,'</pre><formfeed /><pre>',$text); } + return ('<pre>'.$text.'</pre>'); +} + +if(!function_exists('strcode2utf')){ + function strcode2utf($str,$lo=true) { + //converts all the &#nnn; and &#xhhh; in a string to Unicode + if ($lo) { $lo = 1; } else { $lo = 0; } + $str = @preg_replace('/\&\#([0-9]+)\;/me', "code2utf('\\1',{$lo})",$str); + $str = @preg_replace('/\&\#x([0-9a-fA-F]+)\;/me', "codeHex2utf('\\1',{$lo})",$str); + return $str; + } +} + +if(!function_exists('code2utf')){ + function code2utf($num,$lo=true){ + //Returns the utf string corresponding to the unicode value + if ($num<128) { + if ($lo) return chr($num); + else return '&#'.$num.';'; + } + if ($num<2048) return chr(($num>>6)+192).chr(($num&63)+128); + if ($num<65536) return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128); + if ($num<2097152) return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128) .chr(($num&63)+128); + return '?'; + } +} + + +if(!function_exists('codeHex2utf')){ + function codeHex2utf($hex,$lo=true){ + $num = hexdec($hex); + if (($num<128) && !$lo) return '&#x'.$hex.';'; + return code2utf($num,$lo); + } +} + + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/includes/ind_bn_1_001.volt.php b/application/third_party/mpdf/includes/ind_bn_1_001.volt.php new file mode 100644 index 0000000..a1031c2 --- /dev/null +++ b/application/third_party/mpdf/includes/ind_bn_1_001.volt.php @@ -0,0 +1,3164 @@ +<?php + $volt = array ( + 0 => + array ( + 'match' => '0995 09CD 09B7', + 'replace' => 'E002', + ), + 1 => + array ( + 'match' => '099C 09CD 099E', + 'replace' => 'E003', + ), + 2 => + array ( + 'match' => '09CD 200D', + 'replace' => '007E', + ), + 3 => + array ( + 'match' => '09CD 200C', + 'replace' => '200C', + ), + 4 => + array ( + 'match' => '200D 09CD', + 'replace' => '00D0', + ), + 5 => + array ( + 'match' => '((0995|0996|0997|0998|0999|099A|099B|099C|099D|099E|099F|09A0|09A1|09A2|09A3|09A4|09A5|09A6|09A7|09A8|09AA|09AB|09AC|09AD|09AE|09AF|09B0|09B2|09B6|09B7|09B8|09B9)) 09CD 09B0', + 'replace' => '\\1 E1CD', + ), + 6 => + array ( + 'match' => '((0995|0996|0997|0998|0999|099A|099B|099C|099D|099E|099F|09A0|09A1|09A2|09A3|09A4|09A5|09A6|09A7|09A8|09AA|09AB|09AC|09AD|09AE|09AF|09B0|09B2|09B6|09B7|09B8|09B9)) 09B0 09CD', + 'replace' => '\\1 E068', + ), + 7 => + array ( + 'match' => '((09BE|09C0|09C1|09C2|09C3|09C4|09CB|09CC|09D7|09BC)) 09CD 09B0', + 'replace' => '\\1 E1CD', + ), + 8 => + array ( + 'match' => '((09BE|09C0|09C1|09C2|09C3|09C4|09CB|09CC|09D7|09BC)) 09B0 09CD', + 'replace' => '\\1 E068', + ), + 9 => + array ( + 'match' => '(0020) 09CD 09B0', + 'replace' => '\\1 E1CD', + ), + 10 => + array ( + 'match' => '(0020) 09B0 09CD', + 'replace' => '\\1 E068', + ), + 11 => + array ( + 'match' => '(25CC) 09CD 09B0', + 'replace' => '\\1 E1CD', + ), + 12 => + array ( + 'match' => '(25CC) 09B0 09CD', + 'replace' => '\\1 E068', + ), + 13 => + array ( + 'match' => '((09B0|E042|E043|E044|E048|E049|E04E|E04F|E050|E051|E052|E053|E054|E056|E057|E058|E059|E05B|E05C|E05D|E05E|E062|E063|E064|E065|E0A8|E0BC|E0EF|E0FD|E101|E11C|E11E|E14F|E151|E152|E164|E17D|E18E|E190)) 09C1', + 'replace' => '\\1 E03C', + ), + 14 => + array ( + 'match' => '((09B0|E042|E043|E044|E048|E049|E04E|E04F|E050|E051|E052|E053|E054|E056|E057|E058|E059|E05B|E05C|E05D|E05E|E062|E063|E064|E065|E0A8|E0BC|E0EF|E0FD|E101|E11C|E11E|E14F|E151|E152|E164|E17D|E18E|E190)) 09C2', + 'replace' => '\\1 E03E', + ), + 15 => + array ( + 'match' => '((E045|E046|E047|E04A|E04B|E04C|E04D|E05F|E060|E061|E07C|E07D|E0B1|E0E8|E0E9|E11A|E11B|E163|E17B|E18D)) 09C1', + 'replace' => '\\1 E03D', + ), + 16 => + array ( + 'match' => 'E068 0981', + 'replace' => 'E069', + ), + 17 => + array ( + 'match' => '0995 09CD 0995', + 'replace' => 'E06A', + ), + 18 => + array ( + 'match' => '0995 09CD 0996', + 'replace' => 'E06B', + ), + 19 => + array ( + 'match' => '0995 09CD 099A', + 'replace' => 'E06C', + ), + 20 => + array ( + 'match' => '0995 09CD 099B', + 'replace' => 'E06D', + ), + 21 => + array ( + 'match' => '0995 09CD 099F', + 'replace' => 'E06E', + ), + 22 => + array ( + 'match' => '0995 09CD 09A0', + 'replace' => 'E06F', + ), + 23 => + array ( + 'match' => '0995 09CD 09A3', + 'replace' => 'E070', + ), + 24 => + array ( + 'match' => '0995 09CD 09A4', + 'replace' => 'E071', + ), + 25 => + array ( + 'match' => '0995 09CD 09A5', + 'replace' => 'E072', + ), + 26 => + array ( + 'match' => '0995 09CD 09A8', + 'replace' => 'E073', + ), + 27 => + array ( + 'match' => '0995 09CD 09AA', + 'replace' => 'E074', + ), + 28 => + array ( + 'match' => '0995 09CD 09AB', + 'replace' => 'E075', + ), + 29 => + array ( + 'match' => '0995 09CD 09AE', + 'replace' => 'E076', + ), + 30 => + array ( + 'match' => '0995 09CD 09B2', + 'replace' => 'E077', + ), + 31 => + array ( + 'match' => '0995 09CD 09AC', + 'replace' => 'E078', + ), + 32 => + array ( + 'match' => '0995 09CD 09B6', + 'replace' => 'E079', + ), + 33 => + array ( + 'match' => '0995 09CD 09B8', + 'replace' => 'E07A', + ), + 34 => + array ( + 'match' => '0996 09CD 0996', + 'replace' => 'E083', + ), + 35 => + array ( + 'match' => '0996 09CD 09A4', + 'replace' => 'E084', + ), + 36 => + array ( + 'match' => '0996 09CD 09A8', + 'replace' => 'E085', + ), + 37 => + array ( + 'match' => '0996 09CD 09AE', + 'replace' => 'E086', + ), + 38 => + array ( + 'match' => '0996 09CD 09AC', + 'replace' => 'E087', + ), + 39 => + array ( + 'match' => '0997 09CD 0997', + 'replace' => 'E088', + ), + 40 => + array ( + 'match' => '0997 09CD 0998', + 'replace' => 'E089', + ), + 41 => + array ( + 'match' => '0997 09CD 099C', + 'replace' => 'E08A', + ), + 42 => + array ( + 'match' => '0997 09CD 099D', + 'replace' => 'E08B', + ), + 43 => + array ( + 'match' => '0997 09CD 09A1', + 'replace' => 'E08C', + ), + 44 => + array ( + 'match' => '0997 09CD 09A2', + 'replace' => 'E08D', + ), + 45 => + array ( + 'match' => '0997 09CD 09A3', + 'replace' => 'E08E', + ), + 46 => + array ( + 'match' => '0997 09CD 09A6', + 'replace' => 'E08F', + ), + 47 => + array ( + 'match' => '0997 09CD 09A7', + 'replace' => 'E090', + ), + 48 => + array ( + 'match' => '0997 09CD 09A8', + 'replace' => 'E091', + ), + 49 => + array ( + 'match' => '0997 09CD 09AB', + 'replace' => 'E092', + ), + 50 => + array ( + 'match' => '0997 09CD 09AC', + 'replace' => 'E093', + ), + 51 => + array ( + 'match' => '0997 09CD 09AD', + 'replace' => 'E094', + ), + 52 => + array ( + 'match' => '0997 09CD 09AE', + 'replace' => 'E095', + ), + 53 => + array ( + 'match' => '0997 09CD 09B2', + 'replace' => 'E096', + ), + 54 => + array ( + 'match' => '0998 09CD 09A8', + 'replace' => 'E099', + ), + 55 => + array ( + 'match' => '0998 09CD 09AE', + 'replace' => 'E09A', + ), + 56 => + array ( + 'match' => '0998 09CD 09AC', + 'replace' => 'E09B', + ), + 57 => + array ( + 'match' => '0999 09CD 0995', + 'replace' => 'E09C', + ), + 58 => + array ( + 'match' => '0999 09CD 0996', + 'replace' => 'E09D', + ), + 59 => + array ( + 'match' => '0999 09CD 0997', + 'replace' => 'E09E', + ), + 60 => + array ( + 'match' => '0999 09CD 0998', + 'replace' => 'E09F', + ), + 61 => + array ( + 'match' => '0999 09CD 09A8', + 'replace' => 'E0A0', + ), + 62 => + array ( + 'match' => '0999 09CD 09AD', + 'replace' => 'E0A1', + ), + 63 => + array ( + 'match' => '0999 09CD 09AE', + 'replace' => 'E0A2', + ), + 64 => + array ( + 'match' => '0999 09CD 09AC', + 'replace' => 'E0A3', + ), + 65 => + array ( + 'match' => '0999 09CD 09B6', + 'replace' => 'E0A4', + ), + 66 => + array ( + 'match' => '0999 09CD 09B7', + 'replace' => 'E0A5', + ), + 67 => + array ( + 'match' => '0999 09CD 09B9', + 'replace' => 'E0A6', + ), + 68 => + array ( + 'match' => '099A 09CD 099A', + 'replace' => 'E0AC', + ), + 69 => + array ( + 'match' => '099A 09CD 099B', + 'replace' => 'E0AD', + ), + 70 => + array ( + 'match' => '099A 09CD 099E', + 'replace' => 'E0AE', + ), + 71 => + array ( + 'match' => '099A 09CD 09AE', + 'replace' => 'E0AF', + ), + 72 => + array ( + 'match' => '099A 09CD 09AC', + 'replace' => 'E0B0', + ), + 73 => + array ( + 'match' => '099B 09CD 099B', + 'replace' => 'E0B4', + ), + 74 => + array ( + 'match' => '099B 09CD 09B2', + 'replace' => 'E0B5', + ), + 75 => + array ( + 'match' => '099B 09CD 09AC', + 'replace' => 'E0B6', + ), + 76 => + array ( + 'match' => '099C 09CD 099C', + 'replace' => 'E0B7', + ), + 77 => + array ( + 'match' => '099C 09CD 099D', + 'replace' => 'E0B8', + ), + 78 => + array ( + 'match' => '099C 09CD 09A6', + 'replace' => 'E0B9', + ), + 79 => + array ( + 'match' => '099C 09CD 09AC', + 'replace' => 'E0BA', + ), + 80 => + array ( + 'match' => '099C 09CD 09AE', + 'replace' => 'E0BB', + ), + 81 => + array ( + 'match' => '099D 09CD 099D', + 'replace' => 'E0BE', + ), + 82 => + array ( + 'match' => '099D 09CD 09AE', + 'replace' => 'E0BF', + ), + 83 => + array ( + 'match' => '099D 09CD 09AC', + 'replace' => 'E0C0', + ), + 84 => + array ( + 'match' => '099E 09CD 099A', + 'replace' => 'E0C1', + ), + 85 => + array ( + 'match' => '099E 09CD 099B', + 'replace' => 'E0C2', + ), + 86 => + array ( + 'match' => '099E 09CD 099C', + 'replace' => 'E0C3', + ), + 87 => + array ( + 'match' => '099E 09CD 099D', + 'replace' => 'E0C4', + ), + 88 => + array ( + 'match' => '099E 09CD 09B6', + 'replace' => 'E0C5', + ), + 89 => + array ( + 'match' => '099F 09CD 0995', + 'replace' => 'E0C6', + ), + 90 => + array ( + 'match' => '099F 09CD 0996', + 'replace' => 'E0C7', + ), + 91 => + array ( + 'match' => '099F 09CD 099A', + 'replace' => 'E0C8', + ), + 92 => + array ( + 'match' => '099F 09CD 099B', + 'replace' => 'E0C9', + ), + 93 => + array ( + 'match' => '099F 09CD 099F', + 'replace' => 'E0CA', + ), + 94 => + array ( + 'match' => '099F 09CD 09A0', + 'replace' => 'E0CB', + ), + 95 => + array ( + 'match' => '099F 09CD 09A4', + 'replace' => 'E0CC', + ), + 96 => + array ( + 'match' => '099F 09CD 09A5', + 'replace' => 'E0CD', + ), + 97 => + array ( + 'match' => '099F 09CD 09AA', + 'replace' => 'E0CE', + ), + 98 => + array ( + 'match' => '099F 09CD 09AB', + 'replace' => 'E0CF', + ), + 99 => + array ( + 'match' => '099F 09CD 09AC', + 'replace' => 'E0D0', + ), + 100 => + array ( + 'match' => '099F 09CD 09AE', + 'replace' => 'E0D1', + ), + 101 => + array ( + 'match' => '099F 09CD 09B6', + 'replace' => 'E0D2', + ), + 102 => + array ( + 'match' => '099F 09CD 09B7', + 'replace' => 'E0D3', + ), + 103 => + array ( + 'match' => '099F 09CD 09B8', + 'replace' => 'E0D4', + ), + 104 => + array ( + 'match' => '09A0 09CD 09A0', + 'replace' => 'E0D5', + ), + 105 => + array ( + 'match' => '09A0 09CD 09A3', + 'replace' => 'E0D6', + ), + 106 => + array ( + 'match' => '09A0 09CD 09AC', + 'replace' => 'E0D7', + ), + 107 => + array ( + 'match' => '09A1 09CD 0997', + 'replace' => 'E0D8', + ), + 108 => + array ( + 'match' => '09A1 09CD 09A1', + 'replace' => 'E0D9', + ), + 109 => + array ( + 'match' => '09A1 09CD 09A2', + 'replace' => 'E0DA', + ), + 110 => + array ( + 'match' => '09A1 09CD 09AE', + 'replace' => 'E0DB', + ), + 111 => + array ( + 'match' => '09A1 09CD 09AC', + 'replace' => 'E0DC', + ), + 112 => + array ( + 'match' => '09A2 09CD 09A2', + 'replace' => 'E0DD', + ), + 113 => + array ( + 'match' => '09A2 09CD 09A3', + 'replace' => 'E0DE', + ), + 114 => + array ( + 'match' => '09A2 09CD 09AC', + 'replace' => 'E0DF', + ), + 115 => + array ( + 'match' => '09A3 09CD 099F', + 'replace' => 'E0E0', + ), + 116 => + array ( + 'match' => '09A3 09CD 09A0', + 'replace' => 'E0E1', + ), + 117 => + array ( + 'match' => '09A3 09CD 09A1', + 'replace' => 'E0E2', + ), + 118 => + array ( + 'match' => '09A3 09CD 09A2', + 'replace' => 'E0E3', + ), + 119 => + array ( + 'match' => '09A3 09CD 09A3', + 'replace' => 'E0E4', + ), + 120 => + array ( + 'match' => '09A3 09CD 09AE', + 'replace' => 'E0E5', + ), + 121 => + array ( + 'match' => '09A3 09CD 09AC', + 'replace' => 'E0E6', + ), + 122 => + array ( + 'match' => '09A3 09CD 09B8', + 'replace' => 'E0E7', + ), + 123 => + array ( + 'match' => '09A4 09CD 09A4', + 'replace' => 'E0EA', + ), + 124 => + array ( + 'match' => '09A4 09CD 09A5', + 'replace' => 'E0EB', + ), + 125 => + array ( + 'match' => '09A4 09CD 09A8', + 'replace' => 'E0EC', + ), + 126 => + array ( + 'match' => '09A4 09CD 09AE', + 'replace' => 'E0ED', + ), + 127 => + array ( + 'match' => '09A4 09CD 09AC', + 'replace' => 'E0EE', + ), + 128 => + array ( + 'match' => '09A5 09CD 09A5', + 'replace' => 'E0F1', + ), + 129 => + array ( + 'match' => '09A5 09CD 09A8', + 'replace' => 'E0F2', + ), + 130 => + array ( + 'match' => '09A5 09CD 09AC', + 'replace' => 'E0F3', + ), + 131 => + array ( + 'match' => '09A6 09CD 0997', + 'replace' => 'E0F4', + ), + 132 => + array ( + 'match' => '09A6 09CD 0998', + 'replace' => 'E0F5', + ), + 133 => + array ( + 'match' => '09A6 09CD 09A6', + 'replace' => 'E0F6', + ), + 134 => + array ( + 'match' => '09A6 09CD 09A7', + 'replace' => 'E0F7', + ), + 135 => + array ( + 'match' => '09A6 09CD 09A8', + 'replace' => 'E0F8', + ), + 136 => + array ( + 'match' => '09A6 09CD 09AC', + 'replace' => 'E0F9', + ), + 137 => + array ( + 'match' => '09A6 09CD 09AE', + 'replace' => 'E0FB', + ), + 138 => + array ( + 'match' => '09A6 09CD 09AF', + 'replace' => 'E0FC', + ), + 139 => + array ( + 'match' => '09A7 09CD 09A7', + 'replace' => 'E102', + ), + 140 => + array ( + 'match' => '09A7 09CD 09A8', + 'replace' => 'E103', + ), + 141 => + array ( + 'match' => '09A7 09CD 09AE', + 'replace' => 'E104', + ), + 142 => + array ( + 'match' => '09A7 09CD 09AC', + 'replace' => 'E105', + ), + 143 => + array ( + 'match' => '09A8 09CD 0995', + 'replace' => 'E106', + ), + 144 => + array ( + 'match' => '09A8 09CD 0997', + 'replace' => 'E107', + ), + 145 => + array ( + 'match' => '09A8 09CD 099A', + 'replace' => 'E108', + ), + 146 => + array ( + 'match' => '09A8 09CD 099C', + 'replace' => 'E109', + ), + 147 => + array ( + 'match' => '09A8 09CD 099F', + 'replace' => 'E10A', + ), + 148 => + array ( + 'match' => '09A8 09CD 09A0', + 'replace' => 'E10B', + ), + 149 => + array ( + 'match' => '09A8 09CD 09A1', + 'replace' => 'E10C', + ), + 150 => + array ( + 'match' => '09A8 09CD 09A4', + 'replace' => 'E10D', + ), + 151 => + array ( + 'match' => '09A8 09CD 09A5', + 'replace' => 'E10E', + ), + 152 => + array ( + 'match' => '09A8 09CD 09A6', + 'replace' => 'E10F', + ), + 153 => + array ( + 'match' => '09A8 09CD 09A7', + 'replace' => 'E110', + ), + 154 => + array ( + 'match' => '09A8 09CD 09A8', + 'replace' => 'E111', + ), + 155 => + array ( + 'match' => '09A8 09CD 09AB', + 'replace' => 'E112', + ), + 156 => + array ( + 'match' => '09A8 09CD 09AD', + 'replace' => 'E113', + ), + 157 => + array ( + 'match' => '09A8 09CD 09AE', + 'replace' => 'E114', + ), + 158 => + array ( + 'match' => '09A8 09CD 09AF', + 'replace' => 'E115', + ), + 159 => + array ( + 'match' => '09A8 09CD 09AC', + 'replace' => 'E116', + ), + 160 => + array ( + 'match' => '09A8 09CD 09B6', + 'replace' => 'E117', + ), + 161 => + array ( + 'match' => '09A8 09CD 09B7', + 'replace' => 'E118', + ), + 162 => + array ( + 'match' => '09A8 09CD 09B8', + 'replace' => 'E119', + ), + 163 => + array ( + 'match' => '09AA 09CD 0995', + 'replace' => 'E122', + ), + 164 => + array ( + 'match' => '09AA 09CD 0996', + 'replace' => 'E123', + ), + 165 => + array ( + 'match' => '09AA 09CD 099A', + 'replace' => 'E124', + ), + 166 => + array ( + 'match' => '09AA 09CD 099B', + 'replace' => 'E125', + ), + 167 => + array ( + 'match' => '09AA 09CD 099F', + 'replace' => 'E126', + ), + 168 => + array ( + 'match' => '09AA 09CD 09A0', + 'replace' => 'E127', + ), + 169 => + array ( + 'match' => '09AA 09CD 09A4', + 'replace' => 'E128', + ), + 170 => + array ( + 'match' => '09AA 09CD 09A8', + 'replace' => 'E129', + ), + 171 => + array ( + 'match' => '09AA 09CD 09AA', + 'replace' => 'E12A', + ), + 172 => + array ( + 'match' => '09AA 09CD 09AB', + 'replace' => 'E12B', + ), + 173 => + array ( + 'match' => '09AA 09CD 09AE', + 'replace' => 'E12C', + ), + 174 => + array ( + 'match' => '09AA 09CD 09B2', + 'replace' => 'E12D', + ), + 175 => + array ( + 'match' => '09AA 09CD 09AC', + 'replace' => 'E12E', + ), + 176 => + array ( + 'match' => '09AA 09CD 09B6', + 'replace' => 'E12F', + ), + 177 => + array ( + 'match' => '09AA 09CD 09B7', + 'replace' => 'E130', + ), + 178 => + array ( + 'match' => '09AA 09CD 09B8', + 'replace' => 'E131', + ), + 179 => + array ( + 'match' => '09AB 09CD 099F', + 'replace' => 'E132', + ), + 180 => + array ( + 'match' => '09AB 09CD 09A4', + 'replace' => 'E133', + ), + 181 => + array ( + 'match' => '09AB 09CD 09AA', + 'replace' => 'E134', + ), + 182 => + array ( + 'match' => '09AB 09CD 09AB', + 'replace' => 'E135', + ), + 183 => + array ( + 'match' => '09AB 09CD 09B2', + 'replace' => 'E136', + ), + 184 => + array ( + 'match' => '09AC 09CD 099C', + 'replace' => 'E137', + ), + 185 => + array ( + 'match' => '09AC 09CD 099D', + 'replace' => 'E138', + ), + 186 => + array ( + 'match' => '09AC 09CD 09A1', + 'replace' => 'E139', + ), + 187 => + array ( + 'match' => '09AC 09CD 09A2', + 'replace' => 'E13A', + ), + 188 => + array ( + 'match' => '09AC 09CD 09A6', + 'replace' => 'E13B', + ), + 189 => + array ( + 'match' => '09AC 09CD 09A7', + 'replace' => 'E13C', + ), + 190 => + array ( + 'match' => '09AC 09CD 09A8', + 'replace' => 'E13D', + ), + 191 => + array ( + 'match' => '09AC 09CD 09B2', + 'replace' => 'E13E', + ), + 192 => + array ( + 'match' => '09AC 09CD 09AC', + 'replace' => 'E13F', + ), + 193 => + array ( + 'match' => '09AD 09CD 09A3', + 'replace' => 'E141', + ), + 194 => + array ( + 'match' => '09AD 09CD 09A8', + 'replace' => 'E142', + ), + 195 => + array ( + 'match' => '09AD 09CD 09AD', + 'replace' => 'E143', + ), + 196 => + array ( + 'match' => '09AD 09CD 09AE', + 'replace' => 'E144', + ), + 197 => + array ( + 'match' => '09AD 09CD 09B2', + 'replace' => 'E145', + ), + 198 => + array ( + 'match' => '09AD 09CD 09AC', + 'replace' => 'E146', + ), + 199 => + array ( + 'match' => '09AE 09CD 09A3', + 'replace' => 'E147', + ), + 200 => + array ( + 'match' => '09AE 09CD 09A8', + 'replace' => 'E148', + ), + 201 => + array ( + 'match' => '09AE 09CD 09AA', + 'replace' => 'E149', + ), + 202 => + array ( + 'match' => '09AE 09CD 09AB', + 'replace' => 'E14A', + ), + 203 => + array ( + 'match' => '09AE 09CD 09AC', + 'replace' => 'E14B', + ), + 204 => + array ( + 'match' => '09AE 09CD 09AD', + 'replace' => 'E14C', + ), + 205 => + array ( + 'match' => '09AE 09CD 09AE', + 'replace' => 'E14D', + ), + 206 => + array ( + 'match' => '09AE 09CD 09B2', + 'replace' => 'E14E', + ), + 207 => + array ( + 'match' => '09B2 09CD 0995', + 'replace' => 'E153', + ), + 208 => + array ( + 'match' => '09B2 09CD 0996', + 'replace' => 'E154', + ), + 209 => + array ( + 'match' => '09B2 09CD 0997', + 'replace' => 'E155', + ), + 210 => + array ( + 'match' => '09B2 09CD 099A', + 'replace' => 'E156', + ), + 211 => + array ( + 'match' => '09B2 09CD 099C', + 'replace' => 'E157', + ), + 212 => + array ( + 'match' => '09B2 09CD 099F', + 'replace' => 'E158', + ), + 213 => + array ( + 'match' => '09B2 09CD 09A1', + 'replace' => 'E159', + ), + 214 => + array ( + 'match' => '09B2 09CD 09A6', + 'replace' => 'E15A', + ), + 215 => + array ( + 'match' => '09B2 09CD 09AA', + 'replace' => 'E15B', + ), + 216 => + array ( + 'match' => '09B2 09CD 09AB', + 'replace' => 'E15C', + ), + 217 => + array ( + 'match' => '09B2 09CD 09AC', + 'replace' => 'E15D', + ), + 218 => + array ( + 'match' => '09B2 09CD 09AE', + 'replace' => 'E15E', + ), + 219 => + array ( + 'match' => '09B2 09CD 09B2', + 'replace' => 'E15F', + ), + 220 => + array ( + 'match' => '09B2 09CD 09B6', + 'replace' => 'E160', + ), + 221 => + array ( + 'match' => '09B2 09CD 09B8', + 'replace' => 'E161', + ), + 222 => + array ( + 'match' => '09B2 09CD 09B9', + 'replace' => 'E162', + ), + 223 => + array ( + 'match' => '09B6 09CD 0995', + 'replace' => 'E166', + ), + 224 => + array ( + 'match' => '09B6 09CD 099A', + 'replace' => 'E167', + ), + 225 => + array ( + 'match' => '09B6 09CD 099B', + 'replace' => 'E168', + ), + 226 => + array ( + 'match' => '09B6 09CD 09A4', + 'replace' => 'E169', + ), + 227 => + array ( + 'match' => '09B6 09CD 09A8', + 'replace' => 'E16A', + ), + 228 => + array ( + 'match' => '09B6 09CD 09AA', + 'replace' => 'E16B', + ), + 229 => + array ( + 'match' => '09B6 09CD 09AE', + 'replace' => 'E16C', + ), + 230 => + array ( + 'match' => '09B6 09CD 09AF', + 'replace' => 'E16D', + ), + 231 => + array ( + 'match' => '09B6 09CD 09B2', + 'replace' => 'E16E', + ), + 232 => + array ( + 'match' => '09B6 09CD 09AC', + 'replace' => 'E16F', + ), + 233 => + array ( + 'match' => '09B6 09CD 09B6', + 'replace' => 'E170', + ), + 234 => + array ( + 'match' => '09B7 09CD 0995', + 'replace' => 'E171', + ), + 235 => + array ( + 'match' => '09B7 09CD 099F', + 'replace' => 'E172', + ), + 236 => + array ( + 'match' => '09B7 09CD 09A0', + 'replace' => 'E173', + ), + 237 => + array ( + 'match' => '09B7 09CD 09A3', + 'replace' => 'E174', + ), + 238 => + array ( + 'match' => '09B7 09CD 09AA', + 'replace' => 'E175', + ), + 239 => + array ( + 'match' => '09B7 09CD 09AB', + 'replace' => 'E176', + ), + 240 => + array ( + 'match' => '09B7 09CD 09AE', + 'replace' => 'E177', + ), + 241 => + array ( + 'match' => '09B7 09CD 09AF', + 'replace' => 'E178', + ), + 242 => + array ( + 'match' => '09B7 09CD 09AC', + 'replace' => 'E179', + ), + 243 => + array ( + 'match' => '09B8 09CD 0995', + 'replace' => 'E17E', + ), + 244 => + array ( + 'match' => '09B8 09CD 0996', + 'replace' => 'E17F', + ), + 245 => + array ( + 'match' => '09B8 09CD 099C', + 'replace' => 'E180', + ), + 246 => + array ( + 'match' => '09B8 09CD 099F', + 'replace' => 'E181', + ), + 247 => + array ( + 'match' => '09B8 09CD 09A4', + 'replace' => 'E182', + ), + 248 => + array ( + 'match' => '09B8 09CD 09A5', + 'replace' => 'E183', + ), + 249 => + array ( + 'match' => '09B8 09CD 09A8', + 'replace' => 'E184', + ), + 250 => + array ( + 'match' => '09B8 09CD 09AA', + 'replace' => 'E185', + ), + 251 => + array ( + 'match' => '09B8 09CD 09AB', + 'replace' => 'E186', + ), + 252 => + array ( + 'match' => '09B8 09CD 09AE', + 'replace' => 'E187', + ), + 253 => + array ( + 'match' => '09B8 09CD 09AF', + 'replace' => 'E188', + ), + 254 => + array ( + 'match' => '09B8 09CD 09B2', + 'replace' => 'E189', + ), + 255 => + array ( + 'match' => '09B8 09CD 09AC', + 'replace' => 'E18A', + ), + 256 => + array ( + 'match' => '09B8 09CD 09B8', + 'replace' => 'E18B', + ), + 257 => + array ( + 'match' => '09B9 09CD 09A3', + 'replace' => 'E192', + ), + 258 => + array ( + 'match' => '09B9 09CD 09A8', + 'replace' => 'E193', + ), + 259 => + array ( + 'match' => '09B9 09CD 09AE', + 'replace' => 'E194', + ), + 260 => + array ( + 'match' => '09B9 09CD 09AF', + 'replace' => 'E195', + ), + 261 => + array ( + 'match' => '09B9 09CD 09B2', + 'replace' => 'E196', + ), + 262 => + array ( + 'match' => '09B9 09CD 09AC', + 'replace' => 'E197', + ), + 263 => + array ( + 'match' => '09DC 09CD 0997', + 'replace' => 'E198', + ), + 264 => + array ( + 'match' => '09DC 09CD 099C', + 'replace' => 'E199', + ), + 265 => + array ( + 'match' => '09DC 09CD 09A7', + 'replace' => 'E19A', + ), + 266 => + array ( + 'match' => '0995 E1CD', + 'replace' => 'E041', + ), + 267 => + array ( + 'match' => '0996 E1CD', + 'replace' => 'E042', + ), + 268 => + array ( + 'match' => '0997 E1CD', + 'replace' => 'E043', + ), + 269 => + array ( + 'match' => '0998 E1CD', + 'replace' => 'E044', + ), + 270 => + array ( + 'match' => '0999 E1CD', + 'replace' => 'E045', + ), + 271 => + array ( + 'match' => '099A E1CD', + 'replace' => 'E046', + ), + 272 => + array ( + 'match' => '099B E1CD', + 'replace' => 'E047', + ), + 273 => + array ( + 'match' => '099C E1CD', + 'replace' => 'E048', + ), + 274 => + array ( + 'match' => '099D E1CD', + 'replace' => 'E049', + ), + 275 => + array ( + 'match' => '099F E1CD', + 'replace' => 'E04A', + ), + 276 => + array ( + 'match' => '09A0 E1CD', + 'replace' => 'E04B', + ), + 277 => + array ( + 'match' => '09A1 E1CD', + 'replace' => 'E04C', + ), + 278 => + array ( + 'match' => '09A2 E1CD', + 'replace' => 'E04D', + ), + 279 => + array ( + 'match' => '09A3 E1CD', + 'replace' => 'E04E', + ), + 280 => + array ( + 'match' => '09A4 E1CD', + 'replace' => 'E04F', + ), + 281 => + array ( + 'match' => '09A5 E1CD', + 'replace' => 'E050', + ), + 282 => + array ( + 'match' => '09A6 E1CD', + 'replace' => 'E051', + ), + 283 => + array ( + 'match' => '09A7 E1CD', + 'replace' => 'E052', + ), + 284 => + array ( + 'match' => '09A8 E1CD', + 'replace' => 'E053', + ), + 285 => + array ( + 'match' => '09AA E1CD', + 'replace' => 'E054', + ), + 286 => + array ( + 'match' => '09AB E1CD', + 'replace' => 'E055', + ), + 287 => + array ( + 'match' => '09AC E1CD', + 'replace' => 'E056', + ), + 288 => + array ( + 'match' => '09AD E1CD', + 'replace' => 'E057', + ), + 289 => + array ( + 'match' => '09AE E1CD', + 'replace' => 'E058', + ), + 290 => + array ( + 'match' => '09AF E1CD', + 'replace' => 'E059', + ), + 291 => + array ( + 'match' => '09B0 E1CD', + 'replace' => 'E05A', + ), + 292 => + array ( + 'match' => '09B2 E1CD', + 'replace' => 'E05B', + ), + 293 => + array ( + 'match' => '09B6 E1CD', + 'replace' => 'E05C', + ), + 294 => + array ( + 'match' => '09B7 E1CD', + 'replace' => 'E05D', + ), + 295 => + array ( + 'match' => '09B8 E1CD', + 'replace' => 'E05E', + ), + 296 => + array ( + 'match' => '09B9 E1CD', + 'replace' => 'E05F', + ), + 297 => + array ( + 'match' => '09DC E1CD', + 'replace' => 'E060', + ), + 298 => + array ( + 'match' => '09DD E1CD', + 'replace' => 'E061', + ), + 299 => + array ( + 'match' => '09DF E1CD', + 'replace' => 'E062', + ), + 300 => + array ( + 'match' => '00D0 09B0', + 'replace' => 'E1CD', + ), + 301 => + array ( + 'match' => 'E06A E1CD', + 'replace' => 'E07B', + ), + 302 => + array ( + 'match' => 'E06E E1CD', + 'replace' => 'E07C', + ), + 303 => + array ( + 'match' => 'E071 E1CD', + 'replace' => 'E07D', + ), + 304 => + array ( + 'match' => 'E071 09CD 09AC', + 'replace' => 'E07E', + ), + 305 => + array ( + 'match' => 'E002 09CD 09A3', + 'replace' => 'E07F', + ), + 306 => + array ( + 'match' => 'E002 09CD 09AE', + 'replace' => 'E080', + ), + 307 => + array ( + 'match' => 'E002 E1CD', + 'replace' => 'E081', + ), + 308 => + array ( + 'match' => 'E002 09CD 09AC', + 'replace' => 'E082', + ), + 309 => + array ( + 'match' => 'E090 E1CD', + 'replace' => 'E097', + ), + 310 => + array ( + 'match' => 'E090 09CD 09AC', + 'replace' => 'E098', + ), + 311 => + array ( + 'match' => 'E09C E1CD', + 'replace' => 'E0A7', + ), + 312 => + array ( + 'match' => 'E09F E1CD', + 'replace' => 'E0A8', + ), + 313 => + array ( + 'match' => '0999 09CD E002', + 'replace' => 'E0A9', + ), + 314 => + array ( + 'match' => 'E0AD E1CD', + 'replace' => 'E0B1', + ), + 315 => + array ( + 'match' => 'E0AD 09CD 09B2', + 'replace' => 'E0B2', + ), + 316 => + array ( + 'match' => 'E0AD 09CD 09AC', + 'replace' => 'E0B3', + ), + 317 => + array ( + 'match' => 'E0B7 E1CD', + 'replace' => 'E0BC', + ), + 318 => + array ( + 'match' => 'E0B7 09CD 09AC', + 'replace' => 'E0BD', + ), + 319 => + array ( + 'match' => 'E0E0 E1CD', + 'replace' => 'E0E8', + ), + 320 => + array ( + 'match' => 'E0E2 E1CD', + 'replace' => 'E0E9', + ), + 321 => + array ( + 'match' => 'E0EA E1CD', + 'replace' => 'E0EF', + ), + 322 => + array ( + 'match' => 'E0EA 09CD 09AC', + 'replace' => 'E0F0', + ), + 323 => + array ( + 'match' => 'E0F6 E1CD', + 'replace' => 'E0FD', + ), + 324 => + array ( + 'match' => 'E0F6 09CD 09AC', + 'replace' => 'E0FE', + ), + 325 => + array ( + 'match' => 'E0F7 E1CD', + 'replace' => 'E0FF', + ), + 326 => + array ( + 'match' => 'E0F7 09CD 09AC', + 'replace' => 'E100', + ), + 327 => + array ( + 'match' => 'E0FA E1CD', + 'replace' => 'E101', + ), + 328 => + array ( + 'match' => 'E10A E1CD', + 'replace' => 'E11A', + ), + 329 => + array ( + 'match' => 'E10C E1CD', + 'replace' => 'E11B', + ), + 330 => + array ( + 'match' => 'E10D E1CD', + 'replace' => 'E11C', + ), + 331 => + array ( + 'match' => 'E10D 09CD 09AC', + 'replace' => 'E11D', + ), + 332 => + array ( + 'match' => 'E10F E1CD', + 'replace' => 'E11E', + ), + 333 => + array ( + 'match' => 'E10F 09CD 09AC', + 'replace' => 'E11F', + ), + 334 => + array ( + 'match' => 'E110 E1CD', + 'replace' => 'E120', + ), + 335 => + array ( + 'match' => 'E110 09CD 09AC', + 'replace' => 'E121', + ), + 336 => + array ( + 'match' => 'E13C 09CD 09AC', + 'replace' => 'E140', + ), + 337 => + array ( + 'match' => 'E149 E1CD', + 'replace' => 'E14F', + ), + 338 => + array ( + 'match' => 'E14A E1CD', + 'replace' => 'E150', + ), + 339 => + array ( + 'match' => 'E14B E1CD', + 'replace' => 'E151', + ), + 340 => + array ( + 'match' => 'E14C E1CD', + 'replace' => 'E152', + ), + 341 => + array ( + 'match' => 'E158 E1CD', + 'replace' => 'E163', + ), + 342 => + array ( + 'match' => 'E15B E1CD', + 'replace' => 'E164', + ), + 343 => + array ( + 'match' => 'E161 09CD 099F', + 'replace' => 'E165', + ), + 344 => + array ( + 'match' => 'E171 E1CD', + 'replace' => 'E17A', + ), + 345 => + array ( + 'match' => 'E172 E1CD', + 'replace' => 'E17B', + ), + 346 => + array ( + 'match' => 'E172 09CD 09AC', + 'replace' => 'E17C', + ), + 347 => + array ( + 'match' => 'E175 E1CD', + 'replace' => 'E17D', + ), + 348 => + array ( + 'match' => 'E17E E1CD', + 'replace' => 'E18C', + ), + 349 => + array ( + 'match' => 'E181 E1CD', + 'replace' => 'E18D', + ), + 350 => + array ( + 'match' => 'E182 E1CD', + 'replace' => 'E18E', + ), + 351 => + array ( + 'match' => 'E182 09CD 09AC', + 'replace' => 'E18F', + ), + 352 => + array ( + 'match' => 'E185 E1CD', + 'replace' => 'E190', + ), + 353 => + array ( + 'match' => 'E185 09CD 09B2', + 'replace' => 'E191', + ), + 354 => + array ( + 'match' => '((0995|0996|0997|0998|0999|099A|099B|099C|099D|099F|09A0|09A1|09A2|09A3|09A4|09A5|09A6|09A7|09A8|09AA|09AB|09AC|09AD|09AE|09AF|09B0|09B2|09B6|09B7|09B8|09B9|09DC|09DD|09DF)) 09CD 09AF', + 'replace' => '\\1 E067', + ), + 355 => + array ( + 'match' => '((E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062)) 09CD 09AF', + 'replace' => '\\1 E067', + ), + 356 => + array ( + 'match' => '((E002|E003|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E079|E07A|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E086|E089|E08A|E08B|E08C|E08D|E08F|E090|E092|E095|E097|E098|E09A|E09B|E09D|E09F|E0A2|E0A4|E0A5|E0A6|E0A7|E0A8|E0A9|E0AA|E0AB|E0AC|E0AD|E0AE|E0AF|E0B1|E0B2|E0B3|E0B4|E0B7|E0B8|E0B9|E0BB|E0BC|E0BD|E0BE|E0BF|E0C5|E0C6|E0C7|E0C8|E0C9|E0CB|E0CC|E0CD|E0CE|E0CF|E0D2|E0D3|E0D5|E0D6|E0D8|E0D9|E0DA|E0DB|E0E0|E0E1|E0E3|E0E5|E0E7|E0E8|E0ED|E0F1|E0F5|E0F6|E0FB|E0FC|E0FD|E0FE|E102|E104|E105|E106|E108|E109|E10A|E10B|E10C|E10F|E110|E112|E114|E115|E117|E118|E119|E11A|E11B|E11E|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E12B|E12C|E130|E131|E132|E133|E134|E135|E136|E137|E139|E13A|E13B|E13F|E144|E149|E14A|E14D|E14F|E150|E153|E154|E156|E157|E158|E159|E15A|E15C|E161|E162|E163|E165|E166|E167|E168|E16C|E16D|E174|E175|E176|E177|E178|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E185|E186|E187|E188|E18B|E18C|E18D|E190|E191|E193|E194|E195|E198|E199|E19A|0995|0999|099A|099B|099E|09A1|09A2|09A4|09AB|09AD|09B9|E002|E003|E06A|E073|E074|E077|E078|E07B|E07D|E07E|E07F|E081|E082|E084|E08A|E08C|E08D|E090|E092|E094|E097|E098|E09C|E0A0|E0A1|E0A6|E0A7|E0A9|E0AA|E0AB|E0AC|E0AD|E0AE|E0B1|E0B2|E0B3|E0B4|E0B5|E0B6|E0C1|E0C2|E0C3|E0C4|E0C6|E0C8|E0C9|E0CC|E0CF|E0D9|E0DA|E0DC|E0DD|E0DF|E0E2|E0E3|E0E9|E0EA|E0F0|E108|E109|E10C|E10D|E10E|E110|E112|E113|E11B|E120|E121|E122|E124|E125|E128|E12B|E133|E134|E135|E136|E137|E139|E13A|E13C|E140|E143|E14A|E14C|E153|E156|E157|E159|E15C|E162|E166|E167|E168|E169|E171|E174|E176|E17A|E17E|E180|E182|E183|E18C|E192|E193|E194|E195|E196|E197|09A6|E08F|E0B9|E0F4|E0F6|E0F7|E0F8|E0F9|E0FA|E0FD|E0DC|E0FF|E100|E101|E10F|E11E|E11F|E13B|E15A|099F|09A0|E06E|E06F|E07C|E0CA|E0CB|E0D0|E0D1|E0D4|E0D5|E0D7|E0E0|E0E1|E0E8|E10A|E10B|E11A|E126|E127|E132|E158|E163|E165|E172|E173|E17B|E17C|E181|E18D)) 09CD 09AF', + 'replace' => '\\1 E067', + ), + 357 => + array ( + 'match' => '(200C) 09CD 09AF', + 'replace' => '\\1 E067', + ), + 358 => + array ( + 'match' => 'E0A9 E1CD', + 'replace' => 'E0AA', + ), + 359 => + array ( + 'match' => 'E0A9 E1CD', + 'replace' => 'E0AB', + ), + 360 => + array ( + 'match' => '(09BF (0995|0996|0997|0998|0999|099A|099B|099C|099D|099F|09A0|09A1|09A2|09A3|09A4|09A5|09A6|09A7|09A8|09AA|09AB|09AC|09AD|09AE|09AF|09B0|09B2|09B6|09B7|09B8|09B9|09DC|09DD|09DF)) 09CD', + 'replace' => '\\1 09CD 09BF', + ), + 361 => + array ( + 'match' => '(09BF (0995|0996|0997|0998|0999|099A|099B|099C|099D|099F|09A0|09A1|09A2|09A3|09A4|09A5|09A6|09A7|09A8|09AA|09AB|09AC|09AD|09AE|09AF|09B0|09B2|09B6|09B7|09B8|09B9|09DC|09DD|09DF)) 007E', + 'replace' => '\\1 007E 09BF', + ), + 362 => + array ( + 'match' => '(09C7 (0995|0996|0997|0998|0999|099A|099B|099C|099D|099F|09A0|09A1|09A2|09A3|09A4|09A5|09A6|09A7|09A8|09AA|09AB|09AC|09AD|09AE|09AF|09B0|09B2|09B6|09B7|09B8|09B9|09DC|09DD|09DF)) 09CD', + 'replace' => '\\1 09CD 09C7', + ), + 363 => + array ( + 'match' => '(09C7 (0995|0996|0997|0998|0999|099A|099B|099C|099D|099F|09A0|09A1|09A2|09A3|09A4|09A5|09A6|09A7|09A8|09AA|09AB|09AC|09AD|09AE|09AF|09B0|09B2|09B6|09B7|09B8|09B9|09DC|09DD|09DF)) 007E', + 'replace' => '\\1 007E 09C7', + ), + 364 => + array ( + 'match' => '(09C8 (0995|0996|0997|0998|0999|099A|099B|099C|099D|099F|09A0|09A1|09A2|09A3|09A4|09A5|09A6|09A7|09A8|09AA|09AB|09AC|09AD|09AE|09AF|09B0|09B2|09B6|09B7|09B8|09B9|09DC|09DD|09DF)) 09CD', + 'replace' => '\\1 09CD 09C8', + ), + 365 => + array ( + 'match' => '(09C8 (0995|0996|0997|0998|0999|099A|099B|099C|099D|099F|09A0|09A1|09A2|09A3|09A4|09A5|09A6|09A7|09A8|09AA|09AB|09AC|09AD|09AE|09AF|09B0|09B2|09B6|09B7|09B8|09B9|09DC|09DD|09DF)) 007E', + 'replace' => '\\1 007E 09C8', + ), + 366 => + array ( + 'match' => '09BF 0995 (09CD (09BF|09C7|09C8))', + 'replace' => '0995 \\1', + ), + 367 => + array ( + 'match' => '09BF 0996 (09CD (09BF|09C7|09C8))', + 'replace' => '0996 \\1', + ), + 368 => + array ( + 'match' => '09BF 0997 (09CD (09BF|09C7|09C8))', + 'replace' => '0997 \\1', + ), + 369 => + array ( + 'match' => '09BF 0998 (09CD (09BF|09C7|09C8))', + 'replace' => '0998 \\1', + ), + 370 => + array ( + 'match' => '09BF 0999 (09CD (09BF|09C7|09C8))', + 'replace' => '0999 \\1', + ), + 371 => + array ( + 'match' => '09BF 099A (09CD (09BF|09C7|09C8))', + 'replace' => '099A \\1', + ), + 372 => + array ( + 'match' => '09BF 099B (09CD (09BF|09C7|09C8))', + 'replace' => '099B \\1', + ), + 373 => + array ( + 'match' => '09BF 099C (09CD (09BF|09C7|09C8))', + 'replace' => '099C \\1', + ), + 374 => + array ( + 'match' => '09BF 099D (09CD (09BF|09C7|09C8))', + 'replace' => '099D \\1', + ), + 375 => + array ( + 'match' => '09BF 099F (09CD (09BF|09C7|09C8))', + 'replace' => '099F \\1', + ), + 376 => + array ( + 'match' => '09BF 09A0 (09CD (09BF|09C7|09C8))', + 'replace' => '09A0 \\1', + ), + 377 => + array ( + 'match' => '09BF 09A1 (09CD (09BF|09C7|09C8))', + 'replace' => '09A1 \\1', + ), + 378 => + array ( + 'match' => '09BF 09A2 (09CD (09BF|09C7|09C8))', + 'replace' => '09A2 \\1', + ), + 379 => + array ( + 'match' => '09BF 09A3 (09CD (09BF|09C7|09C8))', + 'replace' => '09A3 \\1', + ), + 380 => + array ( + 'match' => '09BF 09A4 (09CD (09BF|09C7|09C8))', + 'replace' => '09A4 \\1', + ), + 381 => + array ( + 'match' => '09BF 09A5 (09CD (09BF|09C7|09C8))', + 'replace' => '09A5 \\1', + ), + 382 => + array ( + 'match' => '09BF 09A6 (09CD (09BF|09C7|09C8))', + 'replace' => '09A6 \\1', + ), + 383 => + array ( + 'match' => '09BF 09A7 (09CD (09BF|09C7|09C8))', + 'replace' => '09A7 \\1', + ), + 384 => + array ( + 'match' => '09BF 09A8 (09CD (09BF|09C7|09C8))', + 'replace' => '09A8 \\1', + ), + 385 => + array ( + 'match' => '09BF 09AA (09CD (09BF|09C7|09C8))', + 'replace' => '09AA \\1', + ), + 386 => + array ( + 'match' => '09BF 09AB (09CD (09BF|09C7|09C8))', + 'replace' => '09AB \\1', + ), + 387 => + array ( + 'match' => '09BF 09AC (09CD (09BF|09C7|09C8))', + 'replace' => '09AC \\1', + ), + 388 => + array ( + 'match' => '09BF 09AD (09CD (09BF|09C7|09C8))', + 'replace' => '09AD \\1', + ), + 389 => + array ( + 'match' => '09BF 09AE (09CD (09BF|09C7|09C8))', + 'replace' => '09AE \\1', + ), + 390 => + array ( + 'match' => '09BF 09AF (09CD (09BF|09C7|09C8))', + 'replace' => '09AF \\1', + ), + 391 => + array ( + 'match' => '09BF 09B0 (09CD (09BF|09C7|09C8))', + 'replace' => '09B0 \\1', + ), + 392 => + array ( + 'match' => '09BF 09B2 (09CD (09BF|09C7|09C8))', + 'replace' => '09B2 \\1', + ), + 393 => + array ( + 'match' => '09BF 09B6 (09CD (09BF|09C7|09C8))', + 'replace' => '09B6 \\1', + ), + 394 => + array ( + 'match' => '09BF 09B7 (09CD (09BF|09C7|09C8))', + 'replace' => '09B7 \\1', + ), + 395 => + array ( + 'match' => '09BF 09B8 (09CD (09BF|09C7|09C8))', + 'replace' => '09B8 \\1', + ), + 396 => + array ( + 'match' => '09BF 09B9 (09CD (09BF|09C7|09C8))', + 'replace' => '09B9 \\1', + ), + 397 => + array ( + 'match' => '09BF 09DC (09CD (09BF|09C7|09C8))', + 'replace' => '09DC \\1', + ), + 398 => + array ( + 'match' => '09BF 09DD (09CD (09BF|09C7|09C8))', + 'replace' => '09DD \\1', + ), + 399 => + array ( + 'match' => '09BF 09DF (09CD (09BF|09C7|09C8))', + 'replace' => '09DF \\1', + ), + 400 => + array ( + 'match' => '09C7 0995 (09CD (09BF|09C7|09C8))', + 'replace' => '0995 \\1', + ), + 401 => + array ( + 'match' => '09C7 0996 (09CD (09BF|09C7|09C8))', + 'replace' => '0996 \\1', + ), + 402 => + array ( + 'match' => '09C7 0997 (09CD (09BF|09C7|09C8))', + 'replace' => '0997 \\1', + ), + 403 => + array ( + 'match' => '09C7 0998 (09CD (09BF|09C7|09C8))', + 'replace' => '0998 \\1', + ), + 404 => + array ( + 'match' => '09C7 0999 (09CD (09BF|09C7|09C8))', + 'replace' => '0999 \\1', + ), + 405 => + array ( + 'match' => '09C7 099A (09CD (09BF|09C7|09C8))', + 'replace' => '099A \\1', + ), + 406 => + array ( + 'match' => '09C7 099B (09CD (09BF|09C7|09C8))', + 'replace' => '099B \\1', + ), + 407 => + array ( + 'match' => '09C7 099C (09CD (09BF|09C7|09C8))', + 'replace' => '099C \\1', + ), + 408 => + array ( + 'match' => '09C7 099D (09CD (09BF|09C7|09C8))', + 'replace' => '099D \\1', + ), + 409 => + array ( + 'match' => '09C7 099F (09CD (09BF|09C7|09C8))', + 'replace' => '099F \\1', + ), + 410 => + array ( + 'match' => '09C7 09A0 (09CD (09BF|09C7|09C8))', + 'replace' => '09A0 \\1', + ), + 411 => + array ( + 'match' => '09C7 09A1 (09CD (09BF|09C7|09C8))', + 'replace' => '09A1 \\1', + ), + 412 => + array ( + 'match' => '09C7 09A2 (09CD (09BF|09C7|09C8))', + 'replace' => '09A2 \\1', + ), + 413 => + array ( + 'match' => '09C7 09A3 (09CD (09BF|09C7|09C8))', + 'replace' => '09A3 \\1', + ), + 414 => + array ( + 'match' => '09C7 09A4 (09CD (09BF|09C7|09C8))', + 'replace' => '09A4 \\1', + ), + 415 => + array ( + 'match' => '09C7 09A5 (09CD (09BF|09C7|09C8))', + 'replace' => '09A5 \\1', + ), + 416 => + array ( + 'match' => '09C7 09A6 (09CD (09BF|09C7|09C8))', + 'replace' => '09A6 \\1', + ), + 417 => + array ( + 'match' => '09C7 09A7 (09CD (09BF|09C7|09C8))', + 'replace' => '09A7 \\1', + ), + 418 => + array ( + 'match' => '09C7 09A8 (09CD (09BF|09C7|09C8))', + 'replace' => '09A8 \\1', + ), + 419 => + array ( + 'match' => '09C7 09AA (09CD (09BF|09C7|09C8))', + 'replace' => '09AA \\1', + ), + 420 => + array ( + 'match' => '09C7 09AB (09CD (09BF|09C7|09C8))', + 'replace' => '09AB \\1', + ), + 421 => + array ( + 'match' => '09C7 09AC (09CD (09BF|09C7|09C8))', + 'replace' => '09AC \\1', + ), + 422 => + array ( + 'match' => '09C7 09AD (09CD (09BF|09C7|09C8))', + 'replace' => '09AD \\1', + ), + 423 => + array ( + 'match' => '09C7 09AE (09CD (09BF|09C7|09C8))', + 'replace' => '09AE \\1', + ), + 424 => + array ( + 'match' => '09C7 09AF (09CD (09BF|09C7|09C8))', + 'replace' => '09AF \\1', + ), + 425 => + array ( + 'match' => '09C7 09B0 (09CD (09BF|09C7|09C8))', + 'replace' => '09B0 \\1', + ), + 426 => + array ( + 'match' => '09C7 09B2 (09CD (09BF|09C7|09C8))', + 'replace' => '09B2 \\1', + ), + 427 => + array ( + 'match' => '09C7 09B6 (09CD (09BF|09C7|09C8))', + 'replace' => '09B6 \\1', + ), + 428 => + array ( + 'match' => '09C7 09B7 (09CD (09BF|09C7|09C8))', + 'replace' => '09B7 \\1', + ), + 429 => + array ( + 'match' => '09C7 09B8 (09CD (09BF|09C7|09C8))', + 'replace' => '09B8 \\1', + ), + 430 => + array ( + 'match' => '09C7 09B9 (09CD (09BF|09C7|09C8))', + 'replace' => '09B9 \\1', + ), + 431 => + array ( + 'match' => '09C7 09DC (09CD (09BF|09C7|09C8))', + 'replace' => '09DC \\1', + ), + 432 => + array ( + 'match' => '09C7 09DD (09CD (09BF|09C7|09C8))', + 'replace' => '09DD \\1', + ), + 433 => + array ( + 'match' => '09C7 09DF (09CD (09BF|09C7|09C8))', + 'replace' => '09DF \\1', + ), + 434 => + array ( + 'match' => '09C8 0995 (09CD (09BF|09C7|09C8))', + 'replace' => '0995 \\1', + ), + 435 => + array ( + 'match' => '09C8 0996 (09CD (09BF|09C7|09C8))', + 'replace' => '0996 \\1', + ), + 436 => + array ( + 'match' => '09C8 0997 (09CD (09BF|09C7|09C8))', + 'replace' => '0997 \\1', + ), + 437 => + array ( + 'match' => '09C8 0998 (09CD (09BF|09C7|09C8))', + 'replace' => '0998 \\1', + ), + 438 => + array ( + 'match' => '09C8 0999 (09CD (09BF|09C7|09C8))', + 'replace' => '0999 \\1', + ), + 439 => + array ( + 'match' => '09C8 099A (09CD (09BF|09C7|09C8))', + 'replace' => '099A \\1', + ), + 440 => + array ( + 'match' => '09C8 099B (09CD (09BF|09C7|09C8))', + 'replace' => '099B \\1', + ), + 441 => + array ( + 'match' => '09C8 099C (09CD (09BF|09C7|09C8))', + 'replace' => '099C \\1', + ), + 442 => + array ( + 'match' => '09C8 099D (09CD (09BF|09C7|09C8))', + 'replace' => '099D \\1', + ), + 443 => + array ( + 'match' => '09C8 099F (09CD (09BF|09C7|09C8))', + 'replace' => '099F \\1', + ), + 444 => + array ( + 'match' => '09C8 09A0 (09CD (09BF|09C7|09C8))', + 'replace' => '09A0 \\1', + ), + 445 => + array ( + 'match' => '09C8 09A1 (09CD (09BF|09C7|09C8))', + 'replace' => '09A1 \\1', + ), + 446 => + array ( + 'match' => '09C8 09A2 (09CD (09BF|09C7|09C8))', + 'replace' => '09A2 \\1', + ), + 447 => + array ( + 'match' => '09C8 09A3 (09CD (09BF|09C7|09C8))', + 'replace' => '09A3 \\1', + ), + 448 => + array ( + 'match' => '09C8 09A4 (09CD (09BF|09C7|09C8))', + 'replace' => '09A4 \\1', + ), + 449 => + array ( + 'match' => '09C8 09A5 (09CD (09BF|09C7|09C8))', + 'replace' => '09A5 \\1', + ), + 450 => + array ( + 'match' => '09C8 09A6 (09CD (09BF|09C7|09C8))', + 'replace' => '09A6 \\1', + ), + 451 => + array ( + 'match' => '09C8 09A7 (09CD (09BF|09C7|09C8))', + 'replace' => '09A7 \\1', + ), + 452 => + array ( + 'match' => '09C8 09A8 (09CD (09BF|09C7|09C8))', + 'replace' => '09A8 \\1', + ), + 453 => + array ( + 'match' => '09C8 09AA (09CD (09BF|09C7|09C8))', + 'replace' => '09AA \\1', + ), + 454 => + array ( + 'match' => '09C8 09AB (09CD (09BF|09C7|09C8))', + 'replace' => '09AB \\1', + ), + 455 => + array ( + 'match' => '09C8 09AC (09CD (09BF|09C7|09C8))', + 'replace' => '09AC \\1', + ), + 456 => + array ( + 'match' => '09C8 09AD (09CD (09BF|09C7|09C8))', + 'replace' => '09AD \\1', + ), + 457 => + array ( + 'match' => '09C8 09AE (09CD (09BF|09C7|09C8))', + 'replace' => '09AE \\1', + ), + 458 => + array ( + 'match' => '09C8 09AF (09CD (09BF|09C7|09C8))', + 'replace' => '09AF \\1', + ), + 459 => + array ( + 'match' => '09C8 09B0 (09CD (09BF|09C7|09C8))', + 'replace' => '09B0 \\1', + ), + 460 => + array ( + 'match' => '09C8 09B2 (09CD (09BF|09C7|09C8))', + 'replace' => '09B2 \\1', + ), + 461 => + array ( + 'match' => '09C8 09B6 (09CD (09BF|09C7|09C8))', + 'replace' => '09B6 \\1', + ), + 462 => + array ( + 'match' => '09C8 09B7 (09CD (09BF|09C7|09C8))', + 'replace' => '09B7 \\1', + ), + 463 => + array ( + 'match' => '09C8 09B8 (09CD (09BF|09C7|09C8))', + 'replace' => '09B8 \\1', + ), + 464 => + array ( + 'match' => '09C8 09B9 (09CD (09BF|09C7|09C8))', + 'replace' => '09B9 \\1', + ), + 465 => + array ( + 'match' => '09C8 09DC (09CD (09BF|09C7|09C8))', + 'replace' => '09DC \\1', + ), + 466 => + array ( + 'match' => '09C8 09DD (09CD (09BF|09C7|09C8))', + 'replace' => '09DD \\1', + ), + 467 => + array ( + 'match' => '09C8 09DF (09CD (09BF|09C7|09C8))', + 'replace' => '09DF \\1', + ), + 468 => + array ( + 'match' => '09BF 0995 (007E (09BF|09C7|09C8))', + 'replace' => '0995 \\1', + ), + 469 => + array ( + 'match' => '09BF 0996 (007E (09BF|09C7|09C8))', + 'replace' => '0996 \\1', + ), + 470 => + array ( + 'match' => '09BF 0997 (007E (09BF|09C7|09C8))', + 'replace' => '0997 \\1', + ), + 471 => + array ( + 'match' => '09BF 0998 (007E (09BF|09C7|09C8))', + 'replace' => '0998 \\1', + ), + 472 => + array ( + 'match' => '09BF 0999 (007E (09BF|09C7|09C8))', + 'replace' => '0999 \\1', + ), + 473 => + array ( + 'match' => '09BF 099A (007E (09BF|09C7|09C8))', + 'replace' => '099A \\1', + ), + 474 => + array ( + 'match' => '09BF 099B (007E (09BF|09C7|09C8))', + 'replace' => '099B \\1', + ), + 475 => + array ( + 'match' => '09BF 099C (007E (09BF|09C7|09C8))', + 'replace' => '099C \\1', + ), + 476 => + array ( + 'match' => '09BF 099D (007E (09BF|09C7|09C8))', + 'replace' => '099D \\1', + ), + 477 => + array ( + 'match' => '09BF 099F (007E (09BF|09C7|09C8))', + 'replace' => '099F \\1', + ), + 478 => + array ( + 'match' => '09BF 09A0 (007E (09BF|09C7|09C8))', + 'replace' => '09A0 \\1', + ), + 479 => + array ( + 'match' => '09BF 09A1 (007E (09BF|09C7|09C8))', + 'replace' => '09A1 \\1', + ), + 480 => + array ( + 'match' => '09BF 09A2 (007E (09BF|09C7|09C8))', + 'replace' => '09A2 \\1', + ), + 481 => + array ( + 'match' => '09BF 09A3 (007E (09BF|09C7|09C8))', + 'replace' => '09A3 \\1', + ), + 482 => + array ( + 'match' => '09BF 09A4 (007E (09BF|09C7|09C8))', + 'replace' => '09A4 \\1', + ), + 483 => + array ( + 'match' => '09BF 09A5 (007E (09BF|09C7|09C8))', + 'replace' => '09A5 \\1', + ), + 484 => + array ( + 'match' => '09BF 09A6 (007E (09BF|09C7|09C8))', + 'replace' => '09A6 \\1', + ), + 485 => + array ( + 'match' => '09BF 09A7 (007E (09BF|09C7|09C8))', + 'replace' => '09A7 \\1', + ), + 486 => + array ( + 'match' => '09BF 09A8 (007E (09BF|09C7|09C8))', + 'replace' => '09A8 \\1', + ), + 487 => + array ( + 'match' => '09BF 09AA (007E (09BF|09C7|09C8))', + 'replace' => '09AA \\1', + ), + 488 => + array ( + 'match' => '09BF 09AB (007E (09BF|09C7|09C8))', + 'replace' => '09AB \\1', + ), + 489 => + array ( + 'match' => '09BF 09AC (007E (09BF|09C7|09C8))', + 'replace' => '09AC \\1', + ), + 490 => + array ( + 'match' => '09BF 09AD (007E (09BF|09C7|09C8))', + 'replace' => '09AD \\1', + ), + 491 => + array ( + 'match' => '09BF 09AE (007E (09BF|09C7|09C8))', + 'replace' => '09AE \\1', + ), + 492 => + array ( + 'match' => '09BF 09AF (007E (09BF|09C7|09C8))', + 'replace' => '09AF \\1', + ), + 493 => + array ( + 'match' => '09BF 09B0 (007E (09BF|09C7|09C8))', + 'replace' => '09B0 \\1', + ), + 494 => + array ( + 'match' => '09BF 09B2 (007E (09BF|09C7|09C8))', + 'replace' => '09B2 \\1', + ), + 495 => + array ( + 'match' => '09BF 09B6 (007E (09BF|09C7|09C8))', + 'replace' => '09B6 \\1', + ), + 496 => + array ( + 'match' => '09BF 09B7 (007E (09BF|09C7|09C8))', + 'replace' => '09B7 \\1', + ), + 497 => + array ( + 'match' => '09BF 09B8 (007E (09BF|09C7|09C8))', + 'replace' => '09B8 \\1', + ), + 498 => + array ( + 'match' => '09BF 09B9 (007E (09BF|09C7|09C8))', + 'replace' => '09B9 \\1', + ), + 499 => + array ( + 'match' => '09BF 09DC (007E (09BF|09C7|09C8))', + 'replace' => '09DC \\1', + ), + 500 => + array ( + 'match' => '09BF 09DD (007E (09BF|09C7|09C8))', + 'replace' => '09DD \\1', + ), + 501 => + array ( + 'match' => '09BF 09DF (007E (09BF|09C7|09C8))', + 'replace' => '09DF \\1', + ), + 502 => + array ( + 'match' => '09C7 0995 (007E (09BF|09C7|09C8))', + 'replace' => '0995 \\1', + ), + 503 => + array ( + 'match' => '09C7 0996 (007E (09BF|09C7|09C8))', + 'replace' => '0996 \\1', + ), + 504 => + array ( + 'match' => '09C7 0997 (007E (09BF|09C7|09C8))', + 'replace' => '0997 \\1', + ), + 505 => + array ( + 'match' => '09C7 0998 (007E (09BF|09C7|09C8))', + 'replace' => '0998 \\1', + ), + 506 => + array ( + 'match' => '09C7 0999 (007E (09BF|09C7|09C8))', + 'replace' => '0999 \\1', + ), + 507 => + array ( + 'match' => '09C7 099A (007E (09BF|09C7|09C8))', + 'replace' => '099A \\1', + ), + 508 => + array ( + 'match' => '09C7 099B (007E (09BF|09C7|09C8))', + 'replace' => '099B \\1', + ), + 509 => + array ( + 'match' => '09C7 099C (007E (09BF|09C7|09C8))', + 'replace' => '099C \\1', + ), + 510 => + array ( + 'match' => '09C7 099D (007E (09BF|09C7|09C8))', + 'replace' => '099D \\1', + ), + 511 => + array ( + 'match' => '09C7 099F (007E (09BF|09C7|09C8))', + 'replace' => '099F \\1', + ), + 512 => + array ( + 'match' => '09C7 09A0 (007E (09BF|09C7|09C8))', + 'replace' => '09A0 \\1', + ), + 513 => + array ( + 'match' => '09C7 09A1 (007E (09BF|09C7|09C8))', + 'replace' => '09A1 \\1', + ), + 514 => + array ( + 'match' => '09C7 09A2 (007E (09BF|09C7|09C8))', + 'replace' => '09A2 \\1', + ), + 515 => + array ( + 'match' => '09C7 09A3 (007E (09BF|09C7|09C8))', + 'replace' => '09A3 \\1', + ), + 516 => + array ( + 'match' => '09C7 09A4 (007E (09BF|09C7|09C8))', + 'replace' => '09A4 \\1', + ), + 517 => + array ( + 'match' => '09C7 09A5 (007E (09BF|09C7|09C8))', + 'replace' => '09A5 \\1', + ), + 518 => + array ( + 'match' => '09C7 09A6 (007E (09BF|09C7|09C8))', + 'replace' => '09A6 \\1', + ), + 519 => + array ( + 'match' => '09C7 09A7 (007E (09BF|09C7|09C8))', + 'replace' => '09A7 \\1', + ), + 520 => + array ( + 'match' => '09C7 09A8 (007E (09BF|09C7|09C8))', + 'replace' => '09A8 \\1', + ), + 521 => + array ( + 'match' => '09C7 09AA (007E (09BF|09C7|09C8))', + 'replace' => '09AA \\1', + ), + 522 => + array ( + 'match' => '09C7 09AB (007E (09BF|09C7|09C8))', + 'replace' => '09AB \\1', + ), + 523 => + array ( + 'match' => '09C7 09AC (007E (09BF|09C7|09C8))', + 'replace' => '09AC \\1', + ), + 524 => + array ( + 'match' => '09C7 09AD (007E (09BF|09C7|09C8))', + 'replace' => '09AD \\1', + ), + 525 => + array ( + 'match' => '09C7 09AE (007E (09BF|09C7|09C8))', + 'replace' => '09AE \\1', + ), + 526 => + array ( + 'match' => '09C7 09AF (007E (09BF|09C7|09C8))', + 'replace' => '09AF \\1', + ), + 527 => + array ( + 'match' => '09C7 09B0 (007E (09BF|09C7|09C8))', + 'replace' => '09B0 \\1', + ), + 528 => + array ( + 'match' => '09C7 09B2 (007E (09BF|09C7|09C8))', + 'replace' => '09B2 \\1', + ), + 529 => + array ( + 'match' => '09C7 09B6 (007E (09BF|09C7|09C8))', + 'replace' => '09B6 \\1', + ), + 530 => + array ( + 'match' => '09C7 09B7 (007E (09BF|09C7|09C8))', + 'replace' => '09B7 \\1', + ), + 531 => + array ( + 'match' => '09C7 09B8 (007E (09BF|09C7|09C8))', + 'replace' => '09B8 \\1', + ), + 532 => + array ( + 'match' => '09C7 09B9 (007E (09BF|09C7|09C8))', + 'replace' => '09B9 \\1', + ), + 533 => + array ( + 'match' => '09C7 09DC (007E (09BF|09C7|09C8))', + 'replace' => '09DC \\1', + ), + 534 => + array ( + 'match' => '09C7 09DD (007E (09BF|09C7|09C8))', + 'replace' => '09DD \\1', + ), + 535 => + array ( + 'match' => '09C7 09DF (007E (09BF|09C7|09C8))', + 'replace' => '09DF \\1', + ), + 536 => + array ( + 'match' => '09C8 0995 (007E (09BF|09C7|09C8))', + 'replace' => '0995 \\1', + ), + 537 => + array ( + 'match' => '09C8 0996 (007E (09BF|09C7|09C8))', + 'replace' => '0996 \\1', + ), + 538 => + array ( + 'match' => '09C8 0997 (007E (09BF|09C7|09C8))', + 'replace' => '0997 \\1', + ), + 539 => + array ( + 'match' => '09C8 0998 (007E (09BF|09C7|09C8))', + 'replace' => '0998 \\1', + ), + 540 => + array ( + 'match' => '09C8 0999 (007E (09BF|09C7|09C8))', + 'replace' => '0999 \\1', + ), + 541 => + array ( + 'match' => '09C8 099A (007E (09BF|09C7|09C8))', + 'replace' => '099A \\1', + ), + 542 => + array ( + 'match' => '09C8 099B (007E (09BF|09C7|09C8))', + 'replace' => '099B \\1', + ), + 543 => + array ( + 'match' => '09C8 099C (007E (09BF|09C7|09C8))', + 'replace' => '099C \\1', + ), + 544 => + array ( + 'match' => '09C8 099D (007E (09BF|09C7|09C8))', + 'replace' => '099D \\1', + ), + 545 => + array ( + 'match' => '09C8 099F (007E (09BF|09C7|09C8))', + 'replace' => '099F \\1', + ), + 546 => + array ( + 'match' => '09C8 09A0 (007E (09BF|09C7|09C8))', + 'replace' => '09A0 \\1', + ), + 547 => + array ( + 'match' => '09C8 09A1 (007E (09BF|09C7|09C8))', + 'replace' => '09A1 \\1', + ), + 548 => + array ( + 'match' => '09C8 09A2 (007E (09BF|09C7|09C8))', + 'replace' => '09A2 \\1', + ), + 549 => + array ( + 'match' => '09C8 09A3 (007E (09BF|09C7|09C8))', + 'replace' => '09A3 \\1', + ), + 550 => + array ( + 'match' => '09C8 09A4 (007E (09BF|09C7|09C8))', + 'replace' => '09A4 \\1', + ), + 551 => + array ( + 'match' => '09C8 09A5 (007E (09BF|09C7|09C8))', + 'replace' => '09A5 \\1', + ), + 552 => + array ( + 'match' => '09C8 09A6 (007E (09BF|09C7|09C8))', + 'replace' => '09A6 \\1', + ), + 553 => + array ( + 'match' => '09C8 09A7 (007E (09BF|09C7|09C8))', + 'replace' => '09A7 \\1', + ), + 554 => + array ( + 'match' => '09C8 09A8 (007E (09BF|09C7|09C8))', + 'replace' => '09A8 \\1', + ), + 555 => + array ( + 'match' => '09C8 09AA (007E (09BF|09C7|09C8))', + 'replace' => '09AA \\1', + ), + 556 => + array ( + 'match' => '09C8 09AB (007E (09BF|09C7|09C8))', + 'replace' => '09AB \\1', + ), + 557 => + array ( + 'match' => '09C8 09AC (007E (09BF|09C7|09C8))', + 'replace' => '09AC \\1', + ), + 558 => + array ( + 'match' => '09C8 09AD (007E (09BF|09C7|09C8))', + 'replace' => '09AD \\1', + ), + 559 => + array ( + 'match' => '09C8 09AE (007E (09BF|09C7|09C8))', + 'replace' => '09AE \\1', + ), + 560 => + array ( + 'match' => '09C8 09AF (007E (09BF|09C7|09C8))', + 'replace' => '09AF \\1', + ), + 561 => + array ( + 'match' => '09C8 09B0 (007E (09BF|09C7|09C8))', + 'replace' => '09B0 \\1', + ), + 562 => + array ( + 'match' => '09C8 09B2 (007E (09BF|09C7|09C8))', + 'replace' => '09B2 \\1', + ), + 563 => + array ( + 'match' => '09C8 09B6 (007E (09BF|09C7|09C8))', + 'replace' => '09B6 \\1', + ), + 564 => + array ( + 'match' => '09C8 09B7 (007E (09BF|09C7|09C8))', + 'replace' => '09B7 \\1', + ), + 565 => + array ( + 'match' => '09C8 09B8 (007E (09BF|09C7|09C8))', + 'replace' => '09B8 \\1', + ), + 566 => + array ( + 'match' => '09C8 09B9 (007E (09BF|09C7|09C8))', + 'replace' => '09B9 \\1', + ), + 567 => + array ( + 'match' => '09C8 09DC (007E (09BF|09C7|09C8))', + 'replace' => '09DC \\1', + ), + 568 => + array ( + 'match' => '09C8 09DD (007E (09BF|09C7|09C8))', + 'replace' => '09DD \\1', + ), + 569 => + array ( + 'match' => '09C8 09DF (007E (09BF|09C7|09C8))', + 'replace' => '09DF \\1', + ), + 570 => + array ( + 'match' => '09A4 09CD', + 'replace' => 'E066', + ), + 571 => + array ( + 'match' => '09A4 007E', + 'replace' => 'E066', + ), + 572 => + array ( + 'match' => 'E066 200D', + 'replace' => 'E066', + ), + 573 => + array ( + 'match' => '09BF 200D', + 'replace' => '09BF', + ), + 574 => + array ( + 'match' => '09C7 200D', + 'replace' => '09C7', + ), + 575 => + array ( + 'match' => '09C8 200D', + 'replace' => '09C8', + ), + 576 => + array ( + 'match' => '007E', + 'replace' => '09CD', + ), + 577 => + array ( + 'match' => '200C', + 'replace' => '09CD', + ), + 578 => + array ( + 'match' => '00D0', + 'replace' => '09CD', + ), + 579 => + array ( + 'match' => '0997 09C1', + 'replace' => 'E00A', + ), + 580 => + array ( + 'match' => '09DC 09C1', + 'replace' => 'E012', + ), + 581 => + array ( + 'match' => '09DC 09C2', + 'replace' => 'E013', + ), + 582 => + array ( + 'match' => '09DC 09C3', + 'replace' => 'E014', + ), + 583 => + array ( + 'match' => '09DC 09C4', + 'replace' => 'E015', + ), + 584 => + array ( + 'match' => '09DD 09C1', + 'replace' => 'E016', + ), + 585 => + array ( + 'match' => '09DD 09C2', + 'replace' => 'E017', + ), + 586 => + array ( + 'match' => '09DD 09C3', + 'replace' => 'E018', + ), + 587 => + array ( + 'match' => '09DD 09C4', + 'replace' => 'E019', + ), + 588 => + array ( + 'match' => '09B6 09C1', + 'replace' => 'E00F', + ), + 589 => + array ( + 'match' => '09B9 09C1', + 'replace' => 'E010', + ), + 590 => + array ( + 'match' => '09B9 09C3', + 'replace' => 'E011', + ), + 591 => + array ( + 'match' => 'E084 09C1', + 'replace' => 'E19B', + ), + 592 => + array ( + 'match' => 'E0F4 09C1', + 'replace' => 'E19C', + ), + 593 => + array ( + 'match' => 'E10D 09C1', + 'replace' => 'E19D', + ), + 594 => + array ( + 'match' => 'E128 09C1', + 'replace' => 'E19E', + ), + 595 => + array ( + 'match' => 'E133 09C1', + 'replace' => 'E19F', + ), + 596 => + array ( + 'match' => 'E155 09C1', + 'replace' => 'E1A0', + ), + 597 => + array ( + 'match' => 'E169 09C1', + 'replace' => 'E1A1', + ), + 598 => + array ( + 'match' => 'E182 09C1', + 'replace' => 'E1A2', + ), + 599 => + array ( + 'match' => '09BF ((E002|E003|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E079|E07A|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E086|E089|E08A|E08B|E08C|E08D|E08F|E090|E092|E095|E097|E098|E09A|E09B|E09D|E09F|E0A2|E0A4|E0A5|E0A6|E0A7|E0A8|E0A9|E0AA|E0AB|E0AC|E0AD|E0AE|E0AF|E0B1|E0B2|E0B3|E0B4|E0B7|E0B8|E0B9|E0BB|E0BC|E0BD|E0BE|E0BF|E0C5|E0C6|E0C7|E0C8|E0C9|E0CB|E0CC|E0CD|E0CE|E0CF|E0D2|E0D3|E0D5|E0D6|E0D8|E0D9|E0DA|E0DB|E0E0|E0E1|E0E3|E0E5|E0E7|E0E8|E0ED|E0F1|E0F5|E0F6|E0FB|E0FC|E0FD|E0FE|E102|E104|E105|E106|E108|E109|E10A|E10B|E10C|E10F|E110|E112|E114|E115|E117|E118|E119|E11A|E11B|E11E|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E12B|E12C|E130|E131|E132|E133|E134|E135|E136|E137|E139|E13A|E13B|E13F|E144|E149|E14A|E14D|E14F|E150|E153|E154|E156|E157|E158|E159|E15A|E15C|E161|E162|E163|E165|E166|E167|E168|E16C|E16D|E174|E175|E176|E177|E178|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E185|E186|E187|E188|E18B|E18C|E18D|E190|E191|E193|E194|E195|E198|E199|E19A))', + 'replace' => 'E01C \\1', + ), + 600 => + array ( + 'match' => '((0995|0999|099A|099B|099F|09A0|09A1|09A2|09A4|09AB|09AD|09B9)) 09BE', + 'replace' => '\\1 E01A', + ), + 601 => + array ( + 'match' => '((0995|0999|099A|099B|099F|09A0|09A1|09A2|09A4|09AB|09AD|09B9)) 09D7', + 'replace' => '\\1 E03F', + ), + 602 => + array ( + 'match' => '((09A6)) 09BE', + 'replace' => '\\1 E01B', + ), + 603 => + array ( + 'match' => '((09A6)) 09D7', + 'replace' => '\\1 E040', + ), + 604 => + array ( + 'match' => '09C0 0981', + 'replace' => 'E1B4', + ), + 605 => + array ( + 'match' => '09D7 0981', + 'replace' => 'E1B5', + ), + 606 => + array ( + 'match' => 'E01D 0981', + 'replace' => 'E1B6', + ), + 607 => + array ( + 'match' => 'E01E 0981', + 'replace' => 'E1B7', + ), + 608 => + array ( + 'match' => 'E01F 0981', + 'replace' => 'E1B8', + ), + 609 => + array ( + 'match' => 'E03F 0981', + 'replace' => 'E1B9', + ), + 610 => + array ( + 'match' => 'E040 0981', + 'replace' => 'E1BA', + ), + 611 => + array ( + 'match' => '09C0 E069', + 'replace' => 'E1BB', + ), + 612 => + array ( + 'match' => '09D7 E069', + 'replace' => 'E1BC', + ), + 613 => + array ( + 'match' => 'E01D E069', + 'replace' => 'E1BD', + ), + 614 => + array ( + 'match' => 'E01E E069', + 'replace' => 'E1BE', + ), + 615 => + array ( + 'match' => 'E01F E069', + 'replace' => 'E1BF', + ), + 616 => + array ( + 'match' => 'E03F E069', + 'replace' => 'E1C0', + ), + 617 => + array ( + 'match' => 'E040 E069', + 'replace' => 'E1C1', + ), + 618 => + array ( + 'match' => '0987 0981', + 'replace' => 'E1C2', + ), + 619 => + array ( + 'match' => '0988 0981', + 'replace' => 'E1C3', + ), + 620 => + array ( + 'match' => '098A 0981', + 'replace' => 'E1C4', + ), + 621 => + array ( + 'match' => '0990 0981', + 'replace' => 'E1C5', + ), + 622 => + array ( + 'match' => '0994 0981', + 'replace' => 'E1C6', + ), + 623 => + array ( + 'match' => '099F 0981', + 'replace' => 'E1C7', + ), + 624 => + array ( + 'match' => '09A0 0981', + 'replace' => 'E1C8', + ), + 625 => + array ( + 'match' => '099F E068', + 'replace' => 'E1C9', + ), + 626 => + array ( + 'match' => '09A0 E068', + 'replace' => 'E1CA', + ), + 627 => + array ( + 'match' => '099F E069', + 'replace' => 'E1CB', + ), + 628 => + array ( + 'match' => '09A0 E069', + 'replace' => 'E1CC', + ), + 629 => + array ( + 'match' => '((0995|0999|099A|099B|099E|09A1|09A2|09A4|09AB|09AD|09B9|E002|E003|E06A|E073|E074|E077|E078|E07B|E07D|E07E|E07F|E081|E082|E084|E08A|E08C|E08D|E090|E092|E094|E097|E098|E09C|E0A0|E0A1|E0A6|E0A7|E0A9|E0AA|E0AB|E0AC|E0AD|E0AE|E0B1|E0B2|E0B3|E0B4|E0B5|E0B6|E0C1|E0C2|E0C3|E0C4|E0C6|E0C8|E0C9|E0CC|E0CF|E0D9|E0DA|E0DC|E0DD|E0DF|E0E2|E0E3|E0E9|E0EA|E0F0|E108|E109|E10C|E10D|E10E|E110|E112|E113|E11B|E120|E121|E122|E124|E125|E128|E12B|E133|E134|E135|E136|E137|E139|E13A|E13C|E140|E143|E14A|E14C|E153|E156|E157|E159|E15C|E162|E166|E167|E168|E169|E171|E174|E176|E17A|E17E|E180|E182|E183|E18C|E192|E193|E194|E195|E196|E197)) 09C0', + 'replace' => '\\1 E01D', + ), + 630 => + array ( + 'match' => '((09A6|E08F|E0B9|E0F4|E0F6|E0F7|E0F8|E0F9|E0FA|E0FD|E0DC|E0FF|E100|E101|E10F|E11E|E11F|E13B|E15A)) 09C0', + 'replace' => '\\1 E01E', + ), + 631 => + array ( + 'match' => '((099F|09A0|E06E|E06F|E07C|E0CA|E0CB|E0D0|E0D1|E0D4|E0D5|E0D7|E0E0|E0E1|E0E8|E10A|E10B|E11A|E126|E127|E132|E158|E163|E165|E172|E173|E17B|E17C|E181|E18D)) 09C0', + 'replace' => '\\1 E01F', + ), +); +?> \ No newline at end of file diff --git a/application/third_party/mpdf/includes/ind_gu_1_001.volt.php b/application/third_party/mpdf/includes/ind_gu_1_001.volt.php new file mode 100644 index 0000000..ee52a97 --- /dev/null +++ b/application/third_party/mpdf/includes/ind_gu_1_001.volt.php @@ -0,0 +1,3314 @@ +<?php + $volt = array ( + 0 => + array ( + 'match' => '0A95 0ACD 0AB7', + 'replace' => 'E002', + ), + 1 => + array ( + 'match' => '0A9C 0ACD 0A9E', + 'replace' => 'E003', + ), + 2 => + array ( + 'match' => '0ACD 200C', + 'replace' => 'E163', + ), + 3 => + array ( + 'match' => '0A95 0ABC', + 'replace' => 'E004', + ), + 4 => + array ( + 'match' => '0A96 0ABC', + 'replace' => 'E005', + ), + 5 => + array ( + 'match' => '0A97 0ABC', + 'replace' => 'E006', + ), + 6 => + array ( + 'match' => '0A98 0ABC', + 'replace' => 'E007', + ), + 7 => + array ( + 'match' => '0A99 0ABC', + 'replace' => 'E008', + ), + 8 => + array ( + 'match' => '0A9A 0ABC', + 'replace' => 'E009', + ), + 9 => + array ( + 'match' => '0A9B 0ABC', + 'replace' => 'E00A', + ), + 10 => + array ( + 'match' => '0A9C 0ABC', + 'replace' => 'E00B', + ), + 11 => + array ( + 'match' => '0A9D 0ABC', + 'replace' => 'E00C', + ), + 12 => + array ( + 'match' => '0A9E 0ABC', + 'replace' => 'E00D', + ), + 13 => + array ( + 'match' => '0A9F 0ABC', + 'replace' => 'E00E', + ), + 14 => + array ( + 'match' => '0AA0 0ABC', + 'replace' => 'E00F', + ), + 15 => + array ( + 'match' => '0AA1 0ABC', + 'replace' => 'E010', + ), + 16 => + array ( + 'match' => '0AA2 0ABC', + 'replace' => 'E011', + ), + 17 => + array ( + 'match' => '0AA3 0ABC', + 'replace' => 'E012', + ), + 18 => + array ( + 'match' => '0AA4 0ABC', + 'replace' => 'E013', + ), + 19 => + array ( + 'match' => '0AA5 0ABC', + 'replace' => 'E014', + ), + 20 => + array ( + 'match' => '0AA6 0ABC', + 'replace' => 'E015', + ), + 21 => + array ( + 'match' => '0AA7 0ABC', + 'replace' => 'E016', + ), + 22 => + array ( + 'match' => '0AA8 0ABC', + 'replace' => 'E017', + ), + 23 => + array ( + 'match' => '0AAA 0ABC', + 'replace' => 'E018', + ), + 24 => + array ( + 'match' => '0AAB 0ABC', + 'replace' => 'E019', + ), + 25 => + array ( + 'match' => '0AAC 0ABC', + 'replace' => 'E01A', + ), + 26 => + array ( + 'match' => '0AAD 0ABC', + 'replace' => 'E01B', + ), + 27 => + array ( + 'match' => '0AAE 0ABC', + 'replace' => 'E01C', + ), + 28 => + array ( + 'match' => '0AAF 0ABC', + 'replace' => 'E01D', + ), + 29 => + array ( + 'match' => '0AB0 0ABC', + 'replace' => 'E01E', + ), + 30 => + array ( + 'match' => '0AB2 0ABC', + 'replace' => 'E01F', + ), + 31 => + array ( + 'match' => '0AB3 0ABC', + 'replace' => 'E020', + ), + 32 => + array ( + 'match' => '0AB5 0ABC', + 'replace' => 'E021', + ), + 33 => + array ( + 'match' => '0AB6 0ABC', + 'replace' => 'E022', + ), + 34 => + array ( + 'match' => '0AB7 0ABC', + 'replace' => 'E023', + ), + 35 => + array ( + 'match' => '0AB8 0ABC', + 'replace' => 'E024', + ), + 36 => + array ( + 'match' => '0AB9 0ABC', + 'replace' => 'E025', + ), + 37 => + array ( + 'match' => 'E002 0ABC', + 'replace' => 'E026', + ), + 38 => + array ( + 'match' => 'E003 0ABC', + 'replace' => 'E027', + ), + 39 => + array ( + 'match' => '((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E)) 0ACD 0AB0', + 'replace' => '\\1 E05D', + ), + 40 => + array ( + 'match' => '(25CC) 0ACD 0AB0', + 'replace' => '\\1 E05D', + ), + 41 => + array ( + 'match' => '(200D) 0ACD 0AB0', + 'replace' => '\\1 E05D', + ), + 42 => + array ( + 'match' => '(0020) 0ACD 0AB0', + 'replace' => '\\1 E05D', + ), + 43 => + array ( + 'match' => '((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E)) 0AB0 0ACD', + 'replace' => '\\1 E032', + ), + 44 => + array ( + 'match' => '((0ABE|0AC0|0AC1|0AC2|0AC3|0AC4|0AC5|0AC7|0AC8|0AC9|0ACB|0ACC)) 0AB0 0ACD', + 'replace' => '\\1 E032', + ), + 45 => + array ( + 'match' => '(E05D) 0AB0 0ACD', + 'replace' => '\\1 E032', + ), + 46 => + array ( + 'match' => '(25CC) 0AB0 0ACD', + 'replace' => '\\1 E032', + ), + 47 => + array ( + 'match' => '0A95 E05D', + 'replace' => 'E05E', + ), + 48 => + array ( + 'match' => '0A96 E05D', + 'replace' => 'E05F', + ), + 49 => + array ( + 'match' => '0A97 E05D', + 'replace' => 'E060', + ), + 50 => + array ( + 'match' => '0A98 E05D', + 'replace' => 'E061', + ), + 51 => + array ( + 'match' => '0A99 E05D', + 'replace' => 'E062', + ), + 52 => + array ( + 'match' => '0A9A E05D', + 'replace' => 'E063', + ), + 53 => + array ( + 'match' => '0A9B E05D', + 'replace' => 'E064', + ), + 54 => + array ( + 'match' => '0A9C E05D', + 'replace' => 'E065', + ), + 55 => + array ( + 'match' => '0A9D E05D', + 'replace' => 'E066', + ), + 56 => + array ( + 'match' => '0A9E E05D', + 'replace' => 'E067', + ), + 57 => + array ( + 'match' => '0A9F E05D', + 'replace' => 'E068', + ), + 58 => + array ( + 'match' => '0AA0 E05D', + 'replace' => 'E069', + ), + 59 => + array ( + 'match' => '0AA1 E05D', + 'replace' => 'E06A', + ), + 60 => + array ( + 'match' => '0AA2 E05D', + 'replace' => 'E06B', + ), + 61 => + array ( + 'match' => '0AA3 E05D', + 'replace' => 'E06C', + ), + 62 => + array ( + 'match' => '0AA4 E05D', + 'replace' => 'E06D', + ), + 63 => + array ( + 'match' => '0AA5 E05D', + 'replace' => 'E06E', + ), + 64 => + array ( + 'match' => '0AA6 E05D', + 'replace' => 'E06F', + ), + 65 => + array ( + 'match' => '0AA7 E05D', + 'replace' => 'E070', + ), + 66 => + array ( + 'match' => '0AA8 E05D', + 'replace' => 'E071', + ), + 67 => + array ( + 'match' => '0AAA E05D', + 'replace' => 'E072', + ), + 68 => + array ( + 'match' => '0AAB E05D', + 'replace' => 'E073', + ), + 69 => + array ( + 'match' => '0AAC E05D', + 'replace' => 'E074', + ), + 70 => + array ( + 'match' => '0AAD E05D', + 'replace' => 'E075', + ), + 71 => + array ( + 'match' => '0AAE E05D', + 'replace' => 'E076', + ), + 72 => + array ( + 'match' => '0AAF E05D', + 'replace' => 'E077', + ), + 73 => + array ( + 'match' => '0AB0 E05D', + 'replace' => 'E078', + ), + 74 => + array ( + 'match' => '0AB2 E05D', + 'replace' => 'E079', + ), + 75 => + array ( + 'match' => '0AB3 E05D', + 'replace' => 'E07A', + ), + 76 => + array ( + 'match' => '0AB5 E05D', + 'replace' => 'E07B', + ), + 77 => + array ( + 'match' => '0AB6 E05D', + 'replace' => 'E07C', + ), + 78 => + array ( + 'match' => '0AB7 E05D', + 'replace' => 'E07D', + ), + 79 => + array ( + 'match' => '0AB8 E05D', + 'replace' => 'E07E', + ), + 80 => + array ( + 'match' => '0AB9 E05D', + 'replace' => 'E07F', + ), + 81 => + array ( + 'match' => 'E002 E05D', + 'replace' => 'E080', + ), + 82 => + array ( + 'match' => 'E003 E05D', + 'replace' => 'E081', + ), + 83 => + array ( + 'match' => 'E004 E05D', + 'replace' => 'E082', + ), + 84 => + array ( + 'match' => 'E005 E05D', + 'replace' => 'E083', + ), + 85 => + array ( + 'match' => 'E006 E05D', + 'replace' => 'E084', + ), + 86 => + array ( + 'match' => 'E007 E05D', + 'replace' => 'E085', + ), + 87 => + array ( + 'match' => 'E008 E05D', + 'replace' => 'E086', + ), + 88 => + array ( + 'match' => 'E009 E05D', + 'replace' => 'E087', + ), + 89 => + array ( + 'match' => 'E00A E05D', + 'replace' => 'E088', + ), + 90 => + array ( + 'match' => 'E00B E05D', + 'replace' => 'E089', + ), + 91 => + array ( + 'match' => 'E00C E05D', + 'replace' => 'E08A', + ), + 92 => + array ( + 'match' => 'E00D E05D', + 'replace' => 'E08B', + ), + 93 => + array ( + 'match' => 'E00E E05D', + 'replace' => 'E08C', + ), + 94 => + array ( + 'match' => 'E00F E05D', + 'replace' => 'E08D', + ), + 95 => + array ( + 'match' => 'E010 E05D', + 'replace' => 'E08E', + ), + 96 => + array ( + 'match' => 'E011 E05D', + 'replace' => 'E08F', + ), + 97 => + array ( + 'match' => 'E012 E05D', + 'replace' => 'E090', + ), + 98 => + array ( + 'match' => 'E013 E05D', + 'replace' => 'E091', + ), + 99 => + array ( + 'match' => 'E014 E05D', + 'replace' => 'E092', + ), + 100 => + array ( + 'match' => 'E015 E05D', + 'replace' => 'E093', + ), + 101 => + array ( + 'match' => 'E016 E05D', + 'replace' => 'E094', + ), + 102 => + array ( + 'match' => 'E017 E05D', + 'replace' => 'E095', + ), + 103 => + array ( + 'match' => 'E018 E05D', + 'replace' => 'E096', + ), + 104 => + array ( + 'match' => 'E019 E05D', + 'replace' => 'E097', + ), + 105 => + array ( + 'match' => 'E01A E05D', + 'replace' => 'E098', + ), + 106 => + array ( + 'match' => 'E01B E05D', + 'replace' => 'E099', + ), + 107 => + array ( + 'match' => 'E01C E05D', + 'replace' => 'E09A', + ), + 108 => + array ( + 'match' => 'E01D E05D', + 'replace' => 'E09B', + ), + 109 => + array ( + 'match' => 'E01E E05D', + 'replace' => 'E09C', + ), + 110 => + array ( + 'match' => 'E01F E05D', + 'replace' => 'E09D', + ), + 111 => + array ( + 'match' => 'E020 E05D', + 'replace' => 'E09E', + ), + 112 => + array ( + 'match' => 'E021 E05D', + 'replace' => 'E09F', + ), + 113 => + array ( + 'match' => 'E022 E05D', + 'replace' => 'E0A0', + ), + 114 => + array ( + 'match' => 'E023 E05D', + 'replace' => 'E0A1', + ), + 115 => + array ( + 'match' => 'E024 E05D', + 'replace' => 'E0A2', + ), + 116 => + array ( + 'match' => 'E025 E05D', + 'replace' => 'E0A3', + ), + 117 => + array ( + 'match' => 'E026 E05D', + 'replace' => 'E0A4', + ), + 118 => + array ( + 'match' => 'E027 E05D', + 'replace' => 'E0A5', + ), + 119 => + array ( + 'match' => '0A95 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0A6 \\1', + ), + 120 => + array ( + 'match' => '0A96 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0A7 \\1', + ), + 121 => + array ( + 'match' => '0A97 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0A8 \\1', + ), + 122 => + array ( + 'match' => '0A98 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0A9 \\1', + ), + 123 => + array ( + 'match' => '0A99 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0AA \\1', + ), + 124 => + array ( + 'match' => '0A9A 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0AB \\1', + ), + 125 => + array ( + 'match' => '0A9B 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0AC \\1', + ), + 126 => + array ( + 'match' => '0A9C 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0AD \\1', + ), + 127 => + array ( + 'match' => '0A9D 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0AE \\1', + ), + 128 => + array ( + 'match' => '0A9E 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0AF \\1', + ), + 129 => + array ( + 'match' => '0A9F 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0B0 \\1', + ), + 130 => + array ( + 'match' => '0AA0 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0B1 \\1', + ), + 131 => + array ( + 'match' => '0AA1 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0B2 \\1', + ), + 132 => + array ( + 'match' => '0AA2 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0B3 \\1', + ), + 133 => + array ( + 'match' => '0AA3 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0B4 \\1', + ), + 134 => + array ( + 'match' => '0AA4 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0B5 \\1', + ), + 135 => + array ( + 'match' => '0AA5 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0B6 \\1', + ), + 136 => + array ( + 'match' => '0AA6 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0B7 \\1', + ), + 137 => + array ( + 'match' => '0AA7 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0B8 \\1', + ), + 138 => + array ( + 'match' => '0AA8 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0B9 \\1', + ), + 139 => + array ( + 'match' => '0AAA 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0BA \\1', + ), + 140 => + array ( + 'match' => '0AAB 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0BB \\1', + ), + 141 => + array ( + 'match' => '0AAC 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0BC \\1', + ), + 142 => + array ( + 'match' => '0AAD 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0BD \\1', + ), + 143 => + array ( + 'match' => '0AAE 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0BE \\1', + ), + 144 => + array ( + 'match' => '0AAF 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0BF \\1', + ), + 145 => + array ( + 'match' => '0AB0 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0C0 \\1', + ), + 146 => + array ( + 'match' => '0AB2 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0C1 \\1', + ), + 147 => + array ( + 'match' => '0AB3 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0C2 \\1', + ), + 148 => + array ( + 'match' => '0AB5 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0C3 \\1', + ), + 149 => + array ( + 'match' => '0AB6 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0C4 \\1', + ), + 150 => + array ( + 'match' => '0AB7 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0C5 \\1', + ), + 151 => + array ( + 'match' => '0AB8 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0C6 \\1', + ), + 152 => + array ( + 'match' => '0AB9 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0C7 \\1', + ), + 153 => + array ( + 'match' => 'E002 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0C8 \\1', + ), + 154 => + array ( + 'match' => 'E003 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0C9 \\1', + ), + 155 => + array ( + 'match' => 'E004 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0CA \\1', + ), + 156 => + array ( + 'match' => 'E005 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0CB \\1', + ), + 157 => + array ( + 'match' => 'E006 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0CC \\1', + ), + 158 => + array ( + 'match' => 'E007 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0CD \\1', + ), + 159 => + array ( + 'match' => 'E008 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0CE \\1', + ), + 160 => + array ( + 'match' => 'E009 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0CF \\1', + ), + 161 => + array ( + 'match' => 'E00A 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0D0 \\1', + ), + 162 => + array ( + 'match' => 'E00B 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0D1 \\1', + ), + 163 => + array ( + 'match' => 'E00C 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0D2 \\1', + ), + 164 => + array ( + 'match' => 'E00D 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0D3 \\1', + ), + 165 => + array ( + 'match' => 'E00E 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0D4 \\1', + ), + 166 => + array ( + 'match' => 'E00F 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0D5 \\1', + ), + 167 => + array ( + 'match' => 'E010 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0D6 \\1', + ), + 168 => + array ( + 'match' => 'E011 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0D7 \\1', + ), + 169 => + array ( + 'match' => 'E012 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0D8 \\1', + ), + 170 => + array ( + 'match' => 'E013 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0D9 \\1', + ), + 171 => + array ( + 'match' => 'E014 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0DA \\1', + ), + 172 => + array ( + 'match' => 'E015 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0DB \\1', + ), + 173 => + array ( + 'match' => 'E016 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0DC \\1', + ), + 174 => + array ( + 'match' => 'E017 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0DD \\1', + ), + 175 => + array ( + 'match' => 'E018 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0DE \\1', + ), + 176 => + array ( + 'match' => 'E019 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0DF \\1', + ), + 177 => + array ( + 'match' => 'E01A 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0E0 \\1', + ), + 178 => + array ( + 'match' => 'E01B 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0E1 \\1', + ), + 179 => + array ( + 'match' => 'E01C 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0E2 \\1', + ), + 180 => + array ( + 'match' => 'E01D 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0E3 \\1', + ), + 181 => + array ( + 'match' => 'E01E 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0E4 \\1', + ), + 182 => + array ( + 'match' => 'E01F 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0E5 \\1', + ), + 183 => + array ( + 'match' => 'E020 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0E6 \\1', + ), + 184 => + array ( + 'match' => 'E021 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0E7 \\1', + ), + 185 => + array ( + 'match' => 'E022 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0E8 \\1', + ), + 186 => + array ( + 'match' => 'E023 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0E9 \\1', + ), + 187 => + array ( + 'match' => 'E024 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0EA \\1', + ), + 188 => + array ( + 'match' => 'E025 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0EB \\1', + ), + 189 => + array ( + 'match' => 'E026 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0EC \\1', + ), + 190 => + array ( + 'match' => 'E027 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0ED \\1', + ), + 191 => + array ( + 'match' => 'E05E 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0EE \\1', + ), + 192 => + array ( + 'match' => 'E05F 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0EF \\1', + ), + 193 => + array ( + 'match' => 'E060 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0F0 \\1', + ), + 194 => + array ( + 'match' => 'E061 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0F1 \\1', + ), + 195 => + array ( + 'match' => 'E062 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0F2 \\1', + ), + 196 => + array ( + 'match' => 'E063 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0F3 \\1', + ), + 197 => + array ( + 'match' => 'E064 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0F4 \\1', + ), + 198 => + array ( + 'match' => 'E065 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0F5 \\1', + ), + 199 => + array ( + 'match' => 'E066 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0F6 \\1', + ), + 200 => + array ( + 'match' => 'E067 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0F7 \\1', + ), + 201 => + array ( + 'match' => 'E068 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0F8 \\1', + ), + 202 => + array ( + 'match' => 'E069 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0F9 \\1', + ), + 203 => + array ( + 'match' => 'E06A 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0FA \\1', + ), + 204 => + array ( + 'match' => 'E06B 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0FB \\1', + ), + 205 => + array ( + 'match' => 'E06C 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0FC \\1', + ), + 206 => + array ( + 'match' => 'E06D 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0FD \\1', + ), + 207 => + array ( + 'match' => 'E06E 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0FE \\1', + ), + 208 => + array ( + 'match' => 'E06F 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E0FF \\1', + ), + 209 => + array ( + 'match' => 'E070 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E100 \\1', + ), + 210 => + array ( + 'match' => 'E071 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E101 \\1', + ), + 211 => + array ( + 'match' => 'E072 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E102 \\1', + ), + 212 => + array ( + 'match' => 'E073 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E103 \\1', + ), + 213 => + array ( + 'match' => 'E074 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E104 \\1', + ), + 214 => + array ( + 'match' => 'E075 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E105 \\1', + ), + 215 => + array ( + 'match' => 'E076 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E106 \\1', + ), + 216 => + array ( + 'match' => 'E077 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E107 \\1', + ), + 217 => + array ( + 'match' => 'E078 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E108 \\1', + ), + 218 => + array ( + 'match' => 'E079 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E109 \\1', + ), + 219 => + array ( + 'match' => 'E07A 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E10A \\1', + ), + 220 => + array ( + 'match' => 'E07B 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E10B \\1', + ), + 221 => + array ( + 'match' => 'E07C 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E10C \\1', + ), + 222 => + array ( + 'match' => 'E07D 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E10D \\1', + ), + 223 => + array ( + 'match' => 'E07E 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E10E \\1', + ), + 224 => + array ( + 'match' => 'E07F 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E10F \\1', + ), + 225 => + array ( + 'match' => 'E080 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E110 \\1', + ), + 226 => + array ( + 'match' => 'E081 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E111 \\1', + ), + 227 => + array ( + 'match' => 'E082 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E112 \\1', + ), + 228 => + array ( + 'match' => 'E083 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E113 \\1', + ), + 229 => + array ( + 'match' => 'E084 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E114 \\1', + ), + 230 => + array ( + 'match' => 'E085 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E115 \\1', + ), + 231 => + array ( + 'match' => 'E086 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E116 \\1', + ), + 232 => + array ( + 'match' => 'E087 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E117 \\1', + ), + 233 => + array ( + 'match' => 'E088 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E118 \\1', + ), + 234 => + array ( + 'match' => 'E089 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E119 \\1', + ), + 235 => + array ( + 'match' => 'E08A 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E11A \\1', + ), + 236 => + array ( + 'match' => 'E08B 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E11B \\1', + ), + 237 => + array ( + 'match' => 'E08C 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E11C \\1', + ), + 238 => + array ( + 'match' => 'E08D 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E11D \\1', + ), + 239 => + array ( + 'match' => 'E08E 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E11E \\1', + ), + 240 => + array ( + 'match' => 'E08F 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E11F \\1', + ), + 241 => + array ( + 'match' => 'E090 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E120 \\1', + ), + 242 => + array ( + 'match' => 'E091 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E121 \\1', + ), + 243 => + array ( + 'match' => 'E092 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E122 \\1', + ), + 244 => + array ( + 'match' => 'E093 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E123 \\1', + ), + 245 => + array ( + 'match' => 'E094 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E124 \\1', + ), + 246 => + array ( + 'match' => 'E095 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E125 \\1', + ), + 247 => + array ( + 'match' => 'E096 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E126 \\1', + ), + 248 => + array ( + 'match' => 'E097 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E127 \\1', + ), + 249 => + array ( + 'match' => 'E098 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E128 \\1', + ), + 250 => + array ( + 'match' => 'E099 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E129 \\1', + ), + 251 => + array ( + 'match' => 'E09A 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E12A \\1', + ), + 252 => + array ( + 'match' => 'E09B 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E12B \\1', + ), + 253 => + array ( + 'match' => 'E09C 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E12C \\1', + ), + 254 => + array ( + 'match' => 'E09D 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E12D \\1', + ), + 255 => + array ( + 'match' => 'E09E 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E12E \\1', + ), + 256 => + array ( + 'match' => 'E09F 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E12F \\1', + ), + 257 => + array ( + 'match' => 'E0A0 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E130 \\1', + ), + 258 => + array ( + 'match' => 'E0A1 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E131 \\1', + ), + 259 => + array ( + 'match' => 'E0A2 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E132 \\1', + ), + 260 => + array ( + 'match' => 'E0A3 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E133 \\1', + ), + 261 => + array ( + 'match' => 'E0A4 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E134 \\1', + ), + 262 => + array ( + 'match' => 'E0A5 0ACD ((0A95|0A96|0A97|0A98|0A99|0A9A|0A9B|0A9C|0A9D|0A9E|0A9F|0AA0|0AA1|0AA2|0AA3|0AA4|0AA5|0AA6|0AA7|0AA8|0AAA|0AAB|0AAC|0AAD|0AAE|0AAF|0AB0|0AB2|0AB3|0AB5|0AB6|0AB7|0AB8|0AB9|E002|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E136|E137|E138|E139|E13A|E13B|E13C|E13D|E13E|E13F|E140|E141|E142|E143|E144|E145|E146|E147|E148|E149|E14A|E14B|E14C|E14D|E14E|E14F|E150|E151|E152|E153|E154|E155|E156|E157|E158|E159|E15A|E15B|E15C|E15D|E15E))', + 'replace' => 'E135 \\1', + ), + 263 => + array ( + 'match' => '0A95 0ACD (200D)', + 'replace' => 'E0A6 \\1', + ), + 264 => + array ( + 'match' => '0A96 0ACD (200D)', + 'replace' => 'E0A7 \\1', + ), + 265 => + array ( + 'match' => '0A97 0ACD (200D)', + 'replace' => 'E0A8 \\1', + ), + 266 => + array ( + 'match' => '0A98 0ACD (200D)', + 'replace' => 'E0A9 \\1', + ), + 267 => + array ( + 'match' => '0A99 0ACD (200D)', + 'replace' => 'E0AA \\1', + ), + 268 => + array ( + 'match' => '0A9A 0ACD (200D)', + 'replace' => 'E0AB \\1', + ), + 269 => + array ( + 'match' => '0A9B 0ACD (200D)', + 'replace' => 'E0AC \\1', + ), + 270 => + array ( + 'match' => '0A9C 0ACD (200D)', + 'replace' => 'E0AD \\1', + ), + 271 => + array ( + 'match' => '0A9D 0ACD (200D)', + 'replace' => 'E0AE \\1', + ), + 272 => + array ( + 'match' => '0A9E 0ACD (200D)', + 'replace' => 'E0AF \\1', + ), + 273 => + array ( + 'match' => '0A9F 0ACD (200D)', + 'replace' => 'E0B0 \\1', + ), + 274 => + array ( + 'match' => '0AA0 0ACD (200D)', + 'replace' => 'E0B1 \\1', + ), + 275 => + array ( + 'match' => '0AA1 0ACD (200D)', + 'replace' => 'E0B2 \\1', + ), + 276 => + array ( + 'match' => '0AA2 0ACD (200D)', + 'replace' => 'E0B3 \\1', + ), + 277 => + array ( + 'match' => '0AA3 0ACD (200D)', + 'replace' => 'E0B4 \\1', + ), + 278 => + array ( + 'match' => '0AA4 0ACD (200D)', + 'replace' => 'E0B5 \\1', + ), + 279 => + array ( + 'match' => '0AA5 0ACD (200D)', + 'replace' => 'E0B6 \\1', + ), + 280 => + array ( + 'match' => '0AA6 0ACD (200D)', + 'replace' => 'E0B7 \\1', + ), + 281 => + array ( + 'match' => '0AA7 0ACD (200D)', + 'replace' => 'E0B8 \\1', + ), + 282 => + array ( + 'match' => '0AA8 0ACD (200D)', + 'replace' => 'E0B9 \\1', + ), + 283 => + array ( + 'match' => '0AAA 0ACD (200D)', + 'replace' => 'E0BA \\1', + ), + 284 => + array ( + 'match' => '0AAB 0ACD (200D)', + 'replace' => 'E0BB \\1', + ), + 285 => + array ( + 'match' => '0AAC 0ACD (200D)', + 'replace' => 'E0BC \\1', + ), + 286 => + array ( + 'match' => '0AAD 0ACD (200D)', + 'replace' => 'E0BD \\1', + ), + 287 => + array ( + 'match' => '0AAE 0ACD (200D)', + 'replace' => 'E0BE \\1', + ), + 288 => + array ( + 'match' => '0AAF 0ACD (200D)', + 'replace' => 'E0BF \\1', + ), + 289 => + array ( + 'match' => '0AB0 0ACD (200D)', + 'replace' => 'E0C0 \\1', + ), + 290 => + array ( + 'match' => '0AB2 0ACD (200D)', + 'replace' => 'E0C1 \\1', + ), + 291 => + array ( + 'match' => '0AB3 0ACD (200D)', + 'replace' => 'E0C2 \\1', + ), + 292 => + array ( + 'match' => '0AB5 0ACD (200D)', + 'replace' => 'E0C3 \\1', + ), + 293 => + array ( + 'match' => '0AB6 0ACD (200D)', + 'replace' => 'E0C4 \\1', + ), + 294 => + array ( + 'match' => '0AB7 0ACD (200D)', + 'replace' => 'E0C5 \\1', + ), + 295 => + array ( + 'match' => '0AB8 0ACD (200D)', + 'replace' => 'E0C6 \\1', + ), + 296 => + array ( + 'match' => '0AB9 0ACD (200D)', + 'replace' => 'E0C7 \\1', + ), + 297 => + array ( + 'match' => 'E002 0ACD (200D)', + 'replace' => 'E0C8 \\1', + ), + 298 => + array ( + 'match' => 'E003 0ACD (200D)', + 'replace' => 'E0C9 \\1', + ), + 299 => + array ( + 'match' => 'E004 0ACD (200D)', + 'replace' => 'E0CA \\1', + ), + 300 => + array ( + 'match' => 'E005 0ACD (200D)', + 'replace' => 'E0CB \\1', + ), + 301 => + array ( + 'match' => 'E006 0ACD (200D)', + 'replace' => 'E0CC \\1', + ), + 302 => + array ( + 'match' => 'E007 0ACD (200D)', + 'replace' => 'E0CD \\1', + ), + 303 => + array ( + 'match' => 'E008 0ACD (200D)', + 'replace' => 'E0CE \\1', + ), + 304 => + array ( + 'match' => 'E009 0ACD (200D)', + 'replace' => 'E0CF \\1', + ), + 305 => + array ( + 'match' => 'E00A 0ACD (200D)', + 'replace' => 'E0D0 \\1', + ), + 306 => + array ( + 'match' => 'E00B 0ACD (200D)', + 'replace' => 'E0D1 \\1', + ), + 307 => + array ( + 'match' => 'E00C 0ACD (200D)', + 'replace' => 'E0D2 \\1', + ), + 308 => + array ( + 'match' => 'E00D 0ACD (200D)', + 'replace' => 'E0D3 \\1', + ), + 309 => + array ( + 'match' => 'E00E 0ACD (200D)', + 'replace' => 'E0D4 \\1', + ), + 310 => + array ( + 'match' => 'E00F 0ACD (200D)', + 'replace' => 'E0D5 \\1', + ), + 311 => + array ( + 'match' => 'E010 0ACD (200D)', + 'replace' => 'E0D6 \\1', + ), + 312 => + array ( + 'match' => 'E011 0ACD (200D)', + 'replace' => 'E0D7 \\1', + ), + 313 => + array ( + 'match' => 'E012 0ACD (200D)', + 'replace' => 'E0D8 \\1', + ), + 314 => + array ( + 'match' => 'E013 0ACD (200D)', + 'replace' => 'E0D9 \\1', + ), + 315 => + array ( + 'match' => 'E014 0ACD (200D)', + 'replace' => 'E0DA \\1', + ), + 316 => + array ( + 'match' => 'E015 0ACD (200D)', + 'replace' => 'E0DB \\1', + ), + 317 => + array ( + 'match' => 'E016 0ACD (200D)', + 'replace' => 'E0DC \\1', + ), + 318 => + array ( + 'match' => 'E017 0ACD (200D)', + 'replace' => 'E0DD \\1', + ), + 319 => + array ( + 'match' => 'E018 0ACD (200D)', + 'replace' => 'E0DE \\1', + ), + 320 => + array ( + 'match' => 'E019 0ACD (200D)', + 'replace' => 'E0DF \\1', + ), + 321 => + array ( + 'match' => 'E01A 0ACD (200D)', + 'replace' => 'E0E0 \\1', + ), + 322 => + array ( + 'match' => 'E01B 0ACD (200D)', + 'replace' => 'E0E1 \\1', + ), + 323 => + array ( + 'match' => 'E01C 0ACD (200D)', + 'replace' => 'E0E2 \\1', + ), + 324 => + array ( + 'match' => 'E01D 0ACD (200D)', + 'replace' => 'E0E3 \\1', + ), + 325 => + array ( + 'match' => 'E01E 0ACD (200D)', + 'replace' => 'E0E4 \\1', + ), + 326 => + array ( + 'match' => 'E01F 0ACD (200D)', + 'replace' => 'E0E5 \\1', + ), + 327 => + array ( + 'match' => 'E020 0ACD (200D)', + 'replace' => 'E0E6 \\1', + ), + 328 => + array ( + 'match' => 'E021 0ACD (200D)', + 'replace' => 'E0E7 \\1', + ), + 329 => + array ( + 'match' => 'E022 0ACD (200D)', + 'replace' => 'E0E8 \\1', + ), + 330 => + array ( + 'match' => 'E023 0ACD (200D)', + 'replace' => 'E0E9 \\1', + ), + 331 => + array ( + 'match' => 'E024 0ACD (200D)', + 'replace' => 'E0EA \\1', + ), + 332 => + array ( + 'match' => 'E025 0ACD (200D)', + 'replace' => 'E0EB \\1', + ), + 333 => + array ( + 'match' => 'E026 0ACD (200D)', + 'replace' => 'E0EC \\1', + ), + 334 => + array ( + 'match' => 'E027 0ACD (200D)', + 'replace' => 'E0ED \\1', + ), + 335 => + array ( + 'match' => 'E05E 0ACD (200D)', + 'replace' => 'E0EE \\1', + ), + 336 => + array ( + 'match' => 'E05F 0ACD (200D)', + 'replace' => 'E0EF \\1', + ), + 337 => + array ( + 'match' => 'E060 0ACD (200D)', + 'replace' => 'E0F0 \\1', + ), + 338 => + array ( + 'match' => 'E061 0ACD (200D)', + 'replace' => 'E0F1 \\1', + ), + 339 => + array ( + 'match' => 'E062 0ACD (200D)', + 'replace' => 'E0F2 \\1', + ), + 340 => + array ( + 'match' => 'E063 0ACD (200D)', + 'replace' => 'E0F3 \\1', + ), + 341 => + array ( + 'match' => 'E064 0ACD (200D)', + 'replace' => 'E0F4 \\1', + ), + 342 => + array ( + 'match' => 'E065 0ACD (200D)', + 'replace' => 'E0F5 \\1', + ), + 343 => + array ( + 'match' => 'E066 0ACD (200D)', + 'replace' => 'E0F6 \\1', + ), + 344 => + array ( + 'match' => 'E067 0ACD (200D)', + 'replace' => 'E0F7 \\1', + ), + 345 => + array ( + 'match' => 'E068 0ACD (200D)', + 'replace' => 'E0F8 \\1', + ), + 346 => + array ( + 'match' => 'E069 0ACD (200D)', + 'replace' => 'E0F9 \\1', + ), + 347 => + array ( + 'match' => 'E06A 0ACD (200D)', + 'replace' => 'E0FA \\1', + ), + 348 => + array ( + 'match' => 'E06B 0ACD (200D)', + 'replace' => 'E0FB \\1', + ), + 349 => + array ( + 'match' => 'E06C 0ACD (200D)', + 'replace' => 'E0FC \\1', + ), + 350 => + array ( + 'match' => 'E06D 0ACD (200D)', + 'replace' => 'E0FD \\1', + ), + 351 => + array ( + 'match' => 'E06E 0ACD (200D)', + 'replace' => 'E0FE \\1', + ), + 352 => + array ( + 'match' => 'E06F 0ACD (200D)', + 'replace' => 'E0FF \\1', + ), + 353 => + array ( + 'match' => 'E070 0ACD (200D)', + 'replace' => 'E100 \\1', + ), + 354 => + array ( + 'match' => 'E071 0ACD (200D)', + 'replace' => 'E101 \\1', + ), + 355 => + array ( + 'match' => 'E072 0ACD (200D)', + 'replace' => 'E102 \\1', + ), + 356 => + array ( + 'match' => 'E073 0ACD (200D)', + 'replace' => 'E103 \\1', + ), + 357 => + array ( + 'match' => 'E074 0ACD (200D)', + 'replace' => 'E104 \\1', + ), + 358 => + array ( + 'match' => 'E075 0ACD (200D)', + 'replace' => 'E105 \\1', + ), + 359 => + array ( + 'match' => 'E076 0ACD (200D)', + 'replace' => 'E106 \\1', + ), + 360 => + array ( + 'match' => 'E077 0ACD (200D)', + 'replace' => 'E107 \\1', + ), + 361 => + array ( + 'match' => 'E078 0ACD (200D)', + 'replace' => 'E108 \\1', + ), + 362 => + array ( + 'match' => 'E079 0ACD (200D)', + 'replace' => 'E109 \\1', + ), + 363 => + array ( + 'match' => 'E07A 0ACD (200D)', + 'replace' => 'E10A \\1', + ), + 364 => + array ( + 'match' => 'E07B 0ACD (200D)', + 'replace' => 'E10B \\1', + ), + 365 => + array ( + 'match' => 'E07C 0ACD (200D)', + 'replace' => 'E10C \\1', + ), + 366 => + array ( + 'match' => 'E07D 0ACD (200D)', + 'replace' => 'E10D \\1', + ), + 367 => + array ( + 'match' => 'E07E 0ACD (200D)', + 'replace' => 'E10E \\1', + ), + 368 => + array ( + 'match' => 'E07F 0ACD (200D)', + 'replace' => 'E10F \\1', + ), + 369 => + array ( + 'match' => 'E080 0ACD (200D)', + 'replace' => 'E110 \\1', + ), + 370 => + array ( + 'match' => 'E081 0ACD (200D)', + 'replace' => 'E111 \\1', + ), + 371 => + array ( + 'match' => 'E082 0ACD (200D)', + 'replace' => 'E112 \\1', + ), + 372 => + array ( + 'match' => 'E083 0ACD (200D)', + 'replace' => 'E113 \\1', + ), + 373 => + array ( + 'match' => 'E084 0ACD (200D)', + 'replace' => 'E114 \\1', + ), + 374 => + array ( + 'match' => 'E085 0ACD (200D)', + 'replace' => 'E115 \\1', + ), + 375 => + array ( + 'match' => 'E086 0ACD (200D)', + 'replace' => 'E116 \\1', + ), + 376 => + array ( + 'match' => 'E087 0ACD (200D)', + 'replace' => 'E117 \\1', + ), + 377 => + array ( + 'match' => 'E088 0ACD (200D)', + 'replace' => 'E118 \\1', + ), + 378 => + array ( + 'match' => 'E089 0ACD (200D)', + 'replace' => 'E119 \\1', + ), + 379 => + array ( + 'match' => 'E08A 0ACD (200D)', + 'replace' => 'E11A \\1', + ), + 380 => + array ( + 'match' => 'E08B 0ACD (200D)', + 'replace' => 'E11B \\1', + ), + 381 => + array ( + 'match' => 'E08C 0ACD (200D)', + 'replace' => 'E11C \\1', + ), + 382 => + array ( + 'match' => 'E08D 0ACD (200D)', + 'replace' => 'E11D \\1', + ), + 383 => + array ( + 'match' => 'E08E 0ACD (200D)', + 'replace' => 'E11E \\1', + ), + 384 => + array ( + 'match' => 'E08F 0ACD (200D)', + 'replace' => 'E11F \\1', + ), + 385 => + array ( + 'match' => 'E090 0ACD (200D)', + 'replace' => 'E120 \\1', + ), + 386 => + array ( + 'match' => 'E091 0ACD (200D)', + 'replace' => 'E121 \\1', + ), + 387 => + array ( + 'match' => 'E092 0ACD (200D)', + 'replace' => 'E122 \\1', + ), + 388 => + array ( + 'match' => 'E093 0ACD (200D)', + 'replace' => 'E123 \\1', + ), + 389 => + array ( + 'match' => 'E094 0ACD (200D)', + 'replace' => 'E124 \\1', + ), + 390 => + array ( + 'match' => 'E095 0ACD (200D)', + 'replace' => 'E125 \\1', + ), + 391 => + array ( + 'match' => 'E096 0ACD (200D)', + 'replace' => 'E126 \\1', + ), + 392 => + array ( + 'match' => 'E097 0ACD (200D)', + 'replace' => 'E127 \\1', + ), + 393 => + array ( + 'match' => 'E098 0ACD (200D)', + 'replace' => 'E128 \\1', + ), + 394 => + array ( + 'match' => 'E099 0ACD (200D)', + 'replace' => 'E129 \\1', + ), + 395 => + array ( + 'match' => 'E09A 0ACD (200D)', + 'replace' => 'E12A \\1', + ), + 396 => + array ( + 'match' => 'E09B 0ACD (200D)', + 'replace' => 'E12B \\1', + ), + 397 => + array ( + 'match' => 'E09C 0ACD (200D)', + 'replace' => 'E12C \\1', + ), + 398 => + array ( + 'match' => 'E09D 0ACD (200D)', + 'replace' => 'E12D \\1', + ), + 399 => + array ( + 'match' => 'E09E 0ACD (200D)', + 'replace' => 'E12E \\1', + ), + 400 => + array ( + 'match' => 'E09F 0ACD (200D)', + 'replace' => 'E12F \\1', + ), + 401 => + array ( + 'match' => 'E0A0 0ACD (200D)', + 'replace' => 'E130 \\1', + ), + 402 => + array ( + 'match' => 'E0A1 0ACD (200D)', + 'replace' => 'E131 \\1', + ), + 403 => + array ( + 'match' => 'E0A2 0ACD (200D)', + 'replace' => 'E132 \\1', + ), + 404 => + array ( + 'match' => 'E0A3 0ACD (200D)', + 'replace' => 'E133 \\1', + ), + 405 => + array ( + 'match' => 'E0A4 0ACD (200D)', + 'replace' => 'E134 \\1', + ), + 406 => + array ( + 'match' => 'E0A5 0ACD (200D)', + 'replace' => 'E135 \\1', + ), + 407 => + array ( + 'match' => 'E0A6 E0A6', + 'replace' => 'E221', + ), + 408 => + array ( + 'match' => 'E0B7 E0A8', + 'replace' => 'E223', + ), + 409 => + array ( + 'match' => 'E0C6 E0B5', + 'replace' => 'E222', + ), + 410 => + array ( + 'match' => 'E0AA 0A95', + 'replace' => 'E136', + ), + 411 => + array ( + 'match' => 'E0AA 0A96', + 'replace' => 'E137', + ), + 412 => + array ( + 'match' => 'E0AA 0A97', + 'replace' => 'E138', + ), + 413 => + array ( + 'match' => 'E0AA 0A98', + 'replace' => 'E139', + ), + 414 => + array ( + 'match' => 'E0AA 0AAE', + 'replace' => 'E13A', + ), + 415 => + array ( + 'match' => 'E0AA 0AB5', + 'replace' => 'E13B', + ), + 416 => + array ( + 'match' => 'E0AA E002', + 'replace' => 'E13C', + ), + 417 => + array ( + 'match' => 'E0AC 0AB5', + 'replace' => 'E13D', + ), + 418 => + array ( + 'match' => 'E0B0 0A9F', + 'replace' => 'E13E', + ), + 419 => + array ( + 'match' => 'E0B0 0AA0', + 'replace' => 'E13F', + ), + 420 => + array ( + 'match' => 'E0B1 0AA0', + 'replace' => 'E140', + ), + 421 => + array ( + 'match' => 'E0B2 0AA1', + 'replace' => 'E141', + ), + 422 => + array ( + 'match' => 'E0B2 0AA2', + 'replace' => 'E142', + ), + 423 => + array ( + 'match' => 'E0B3 0AA2', + 'replace' => 'E143', + ), + 424 => + array ( + 'match' => 'E0B7 0A97', + 'replace' => 'E145', + ), + 425 => + array ( + 'match' => 'E0B7 E060', + 'replace' => 'E146', + ), + 426 => + array ( + 'match' => 'E0B7 0A98', + 'replace' => 'E147', + ), + 427 => + array ( + 'match' => 'E0B7 0AA8', + 'replace' => 'E148', + ), + 428 => + array ( + 'match' => 'E0B7 0AA7', + 'replace' => 'E149', + ), + 429 => + array ( + 'match' => 'E0B7 0AB5', + 'replace' => 'E14A', + ), + 430 => + array ( + 'match' => 'E0B7 0AAC', + 'replace' => 'E14B', + ), + 431 => + array ( + 'match' => 'E0B7 0AAE', + 'replace' => 'E14C', + ), + 432 => + array ( + 'match' => 'E0B7 0AB2', + 'replace' => 'E14D', + ), + 433 => + array ( + 'match' => 'E0B7 0AA6', + 'replace' => 'E14E', + ), + 434 => + array ( + 'match' => 'E0C7 0AA8', + 'replace' => 'E14F', + ), + 435 => + array ( + 'match' => 'E0C7 0AA3', + 'replace' => 'E150', + ), + 436 => + array ( + 'match' => 'E0C7 0AAF', + 'replace' => 'E151', + ), + 437 => + array ( + 'match' => 'E0C7 0AB2', + 'replace' => 'E152', + ), + 438 => + array ( + 'match' => 'E0C7 0AB5', + 'replace' => 'E153', + ), + 439 => + array ( + 'match' => 'E0C7 0AAE', + 'replace' => 'E154', + ), + 440 => + array ( + 'match' => 'E0AF 0A9A', + 'replace' => 'E155', + ), + 441 => + array ( + 'match' => 'E0AF 0A9C', + 'replace' => 'E156', + ), + 442 => + array ( + 'match' => 'E0B9 0AA8', + 'replace' => 'E157', + ), + 443 => + array ( + 'match' => 'E0C4 0AA8', + 'replace' => 'E158', + ), + 444 => + array ( + 'match' => 'E0C4 0AB5', + 'replace' => 'E159', + ), + 445 => + array ( + 'match' => 'E0C4 0A9A', + 'replace' => 'E15A', + ), + 446 => + array ( + 'match' => 'E0B5 0AA4', + 'replace' => 'E15B', + ), + 447 => + array ( + 'match' => 'E0C6 E06D', + 'replace' => 'E15C', + ), + 448 => + array ( + 'match' => 'E0B7 0AAF', + 'replace' => 'E15D', + ), + 449 => + array ( + 'match' => 'E0FF 0AAF', + 'replace' => 'E15E', + ), + 450 => + array ( + 'match' => 'E0A6 0A95', + 'replace' => 'E21F', + ), + 451 => + array ( + 'match' => 'E0A6 E05E', + 'replace' => 'E220', + ), + 452 => + array ( + 'match' => 'E163', + 'replace' => '0ACD', + ), + 453 => + array ( + 'match' => 'E0A6 200D', + 'replace' => 'E0A6', + ), + 454 => + array ( + 'match' => 'E0A7 200D', + 'replace' => 'E0A7', + ), + 455 => + array ( + 'match' => 'E0A8 200D', + 'replace' => 'E0A8', + ), + 456 => + array ( + 'match' => 'E0A9 200D', + 'replace' => 'E0A9', + ), + 457 => + array ( + 'match' => 'E0AA 200D', + 'replace' => 'E0AA', + ), + 458 => + array ( + 'match' => 'E0AB 200D', + 'replace' => 'E0AB', + ), + 459 => + array ( + 'match' => 'E0AC 200D', + 'replace' => 'E0AC', + ), + 460 => + array ( + 'match' => 'E0AD 200D', + 'replace' => 'E0AD', + ), + 461 => + array ( + 'match' => 'E0AE 200D', + 'replace' => 'E0AE', + ), + 462 => + array ( + 'match' => 'E0AF 200D', + 'replace' => 'E0AF', + ), + 463 => + array ( + 'match' => 'E0B0 200D', + 'replace' => 'E0B0', + ), + 464 => + array ( + 'match' => 'E0B1 200D', + 'replace' => 'E0B1', + ), + 465 => + array ( + 'match' => 'E0B2 200D', + 'replace' => 'E0B2', + ), + 466 => + array ( + 'match' => 'E0B3 200D', + 'replace' => 'E0B3', + ), + 467 => + array ( + 'match' => 'E0B4 200D', + 'replace' => 'E0B4', + ), + 468 => + array ( + 'match' => 'E0B5 200D', + 'replace' => 'E0B5', + ), + 469 => + array ( + 'match' => 'E0B6 200D', + 'replace' => 'E0B6', + ), + 470 => + array ( + 'match' => 'E0B7 200D', + 'replace' => 'E0B7', + ), + 471 => + array ( + 'match' => 'E0B8 200D', + 'replace' => 'E0B8', + ), + 472 => + array ( + 'match' => 'E0B9 200D', + 'replace' => 'E0B9', + ), + 473 => + array ( + 'match' => 'E0BA 200D', + 'replace' => 'E0BA', + ), + 474 => + array ( + 'match' => 'E0BB 200D', + 'replace' => 'E0BB', + ), + 475 => + array ( + 'match' => 'E0BC 200D', + 'replace' => 'E0BC', + ), + 476 => + array ( + 'match' => 'E0BD 200D', + 'replace' => 'E0BD', + ), + 477 => + array ( + 'match' => 'E0BE 200D', + 'replace' => 'E0BE', + ), + 478 => + array ( + 'match' => 'E0BF 200D', + 'replace' => 'E0BF', + ), + 479 => + array ( + 'match' => 'E0C0 200D', + 'replace' => 'E0C0', + ), + 480 => + array ( + 'match' => 'E0C1 200D', + 'replace' => 'E0C1', + ), + 481 => + array ( + 'match' => 'E0C2 200D', + 'replace' => 'E0C2', + ), + 482 => + array ( + 'match' => 'E0C3 200D', + 'replace' => 'E0C3', + ), + 483 => + array ( + 'match' => 'E0C4 200D', + 'replace' => 'E0C4', + ), + 484 => + array ( + 'match' => 'E0C5 200D', + 'replace' => 'E0C5', + ), + 485 => + array ( + 'match' => 'E0C6 200D', + 'replace' => 'E0C6', + ), + 486 => + array ( + 'match' => 'E0C7 200D', + 'replace' => 'E0C7', + ), + 487 => + array ( + 'match' => 'E0C8 200D', + 'replace' => 'E0C8', + ), + 488 => + array ( + 'match' => 'E0C9 200D', + 'replace' => 'E0C9', + ), + 489 => + array ( + 'match' => 'E0CA 200D', + 'replace' => 'E0CA', + ), + 490 => + array ( + 'match' => 'E0CB 200D', + 'replace' => 'E0CB', + ), + 491 => + array ( + 'match' => 'E0CC 200D', + 'replace' => 'E0CC', + ), + 492 => + array ( + 'match' => 'E0CD 200D', + 'replace' => 'E0CD', + ), + 493 => + array ( + 'match' => 'E0CE 200D', + 'replace' => 'E0CE', + ), + 494 => + array ( + 'match' => 'E0CF 200D', + 'replace' => 'E0CF', + ), + 495 => + array ( + 'match' => 'E0D0 200D', + 'replace' => 'E0D0', + ), + 496 => + array ( + 'match' => 'E0D1 200D', + 'replace' => 'E0D1', + ), + 497 => + array ( + 'match' => 'E0D2 200D', + 'replace' => 'E0D2', + ), + 498 => + array ( + 'match' => 'E0D3 200D', + 'replace' => 'E0D3', + ), + 499 => + array ( + 'match' => 'E0D4 200D', + 'replace' => 'E0D4', + ), + 500 => + array ( + 'match' => 'E0D5 200D', + 'replace' => 'E0D5', + ), + 501 => + array ( + 'match' => 'E0D6 200D', + 'replace' => 'E0D6', + ), + 502 => + array ( + 'match' => 'E0D7 200D', + 'replace' => 'E0D7', + ), + 503 => + array ( + 'match' => 'E0D8 200D', + 'replace' => 'E0D8', + ), + 504 => + array ( + 'match' => 'E0D9 200D', + 'replace' => 'E0D9', + ), + 505 => + array ( + 'match' => 'E0DA 200D', + 'replace' => 'E0DA', + ), + 506 => + array ( + 'match' => 'E0DB 200D', + 'replace' => 'E0DB', + ), + 507 => + array ( + 'match' => 'E0DC 200D', + 'replace' => 'E0DC', + ), + 508 => + array ( + 'match' => 'E0DD 200D', + 'replace' => 'E0DD', + ), + 509 => + array ( + 'match' => 'E0DE 200D', + 'replace' => 'E0DE', + ), + 510 => + array ( + 'match' => 'E0DF 200D', + 'replace' => 'E0DF', + ), + 511 => + array ( + 'match' => 'E0E0 200D', + 'replace' => 'E0E0', + ), + 512 => + array ( + 'match' => 'E0E1 200D', + 'replace' => 'E0E1', + ), + 513 => + array ( + 'match' => 'E0E2 200D', + 'replace' => 'E0E2', + ), + 514 => + array ( + 'match' => 'E0E3 200D', + 'replace' => 'E0E3', + ), + 515 => + array ( + 'match' => 'E0E4 200D', + 'replace' => 'E0E4', + ), + 516 => + array ( + 'match' => 'E0E5 200D', + 'replace' => 'E0E5', + ), + 517 => + array ( + 'match' => 'E0E6 200D', + 'replace' => 'E0E6', + ), + 518 => + array ( + 'match' => 'E0E7 200D', + 'replace' => 'E0E7', + ), + 519 => + array ( + 'match' => 'E0E8 200D', + 'replace' => 'E0E8', + ), + 520 => + array ( + 'match' => 'E0E9 200D', + 'replace' => 'E0E9', + ), + 521 => + array ( + 'match' => 'E0EA 200D', + 'replace' => 'E0EA', + ), + 522 => + array ( + 'match' => 'E0EB 200D', + 'replace' => 'E0EB', + ), + 523 => + array ( + 'match' => 'E0EC 200D', + 'replace' => 'E0EC', + ), + 524 => + array ( + 'match' => 'E0ED 200D', + 'replace' => 'E0ED', + ), + 525 => + array ( + 'match' => 'E0EE 200D', + 'replace' => 'E0EE', + ), + 526 => + array ( + 'match' => 'E0EF 200D', + 'replace' => 'E0EF', + ), + 527 => + array ( + 'match' => 'E0F0 200D', + 'replace' => 'E0F0', + ), + 528 => + array ( + 'match' => 'E0F1 200D', + 'replace' => 'E0F1', + ), + 529 => + array ( + 'match' => 'E0F2 200D', + 'replace' => 'E0F2', + ), + 530 => + array ( + 'match' => 'E0F3 200D', + 'replace' => 'E0F3', + ), + 531 => + array ( + 'match' => 'E0F4 200D', + 'replace' => 'E0F4', + ), + 532 => + array ( + 'match' => 'E0F5 200D', + 'replace' => 'E0F5', + ), + 533 => + array ( + 'match' => 'E0F6 200D', + 'replace' => 'E0F6', + ), + 534 => + array ( + 'match' => 'E0F7 200D', + 'replace' => 'E0F7', + ), + 535 => + array ( + 'match' => 'E0F8 200D', + 'replace' => 'E0F8', + ), + 536 => + array ( + 'match' => 'E0F9 200D', + 'replace' => 'E0F9', + ), + 537 => + array ( + 'match' => 'E0FA 200D', + 'replace' => 'E0FA', + ), + 538 => + array ( + 'match' => 'E0FB 200D', + 'replace' => 'E0FB', + ), + 539 => + array ( + 'match' => 'E0FC 200D', + 'replace' => 'E0FC', + ), + 540 => + array ( + 'match' => 'E0FD 200D', + 'replace' => 'E0FD', + ), + 541 => + array ( + 'match' => 'E0FE 200D', + 'replace' => 'E0FE', + ), + 542 => + array ( + 'match' => 'E0FF 200D', + 'replace' => 'E0FF', + ), + 543 => + array ( + 'match' => 'E100 200D', + 'replace' => 'E100', + ), + 544 => + array ( + 'match' => 'E101 200D', + 'replace' => 'E101', + ), + 545 => + array ( + 'match' => 'E102 200D', + 'replace' => 'E102', + ), + 546 => + array ( + 'match' => 'E103 200D', + 'replace' => 'E103', + ), + 547 => + array ( + 'match' => 'E104 200D', + 'replace' => 'E104', + ), + 548 => + array ( + 'match' => 'E105 200D', + 'replace' => 'E105', + ), + 549 => + array ( + 'match' => 'E106 200D', + 'replace' => 'E106', + ), + 550 => + array ( + 'match' => 'E107 200D', + 'replace' => 'E107', + ), + 551 => + array ( + 'match' => 'E108 200D', + 'replace' => 'E108', + ), + 552 => + array ( + 'match' => 'E109 200D', + 'replace' => 'E109', + ), + 553 => + array ( + 'match' => 'E10A 200D', + 'replace' => 'E10A', + ), + 554 => + array ( + 'match' => 'E10B 200D', + 'replace' => 'E10B', + ), + 555 => + array ( + 'match' => 'E10C 200D', + 'replace' => 'E10C', + ), + 556 => + array ( + 'match' => 'E10D 200D', + 'replace' => 'E10D', + ), + 557 => + array ( + 'match' => 'E10E 200D', + 'replace' => 'E10E', + ), + 558 => + array ( + 'match' => 'E10F 200D', + 'replace' => 'E10F', + ), + 559 => + array ( + 'match' => 'E110 200D', + 'replace' => 'E110', + ), + 560 => + array ( + 'match' => 'E111 200D', + 'replace' => 'E111', + ), + 561 => + array ( + 'match' => 'E112 200D', + 'replace' => 'E112', + ), + 562 => + array ( + 'match' => 'E113 200D', + 'replace' => 'E113', + ), + 563 => + array ( + 'match' => 'E114 200D', + 'replace' => 'E114', + ), + 564 => + array ( + 'match' => 'E115 200D', + 'replace' => 'E115', + ), + 565 => + array ( + 'match' => 'E116 200D', + 'replace' => 'E116', + ), + 566 => + array ( + 'match' => 'E117 200D', + 'replace' => 'E117', + ), + 567 => + array ( + 'match' => 'E118 200D', + 'replace' => 'E118', + ), + 568 => + array ( + 'match' => 'E119 200D', + 'replace' => 'E119', + ), + 569 => + array ( + 'match' => 'E11A 200D', + 'replace' => 'E11A', + ), + 570 => + array ( + 'match' => 'E11B 200D', + 'replace' => 'E11B', + ), + 571 => + array ( + 'match' => 'E11C 200D', + 'replace' => 'E11C', + ), + 572 => + array ( + 'match' => 'E11D 200D', + 'replace' => 'E11D', + ), + 573 => + array ( + 'match' => 'E11E 200D', + 'replace' => 'E11E', + ), + 574 => + array ( + 'match' => 'E11F 200D', + 'replace' => 'E11F', + ), + 575 => + array ( + 'match' => 'E120 200D', + 'replace' => 'E120', + ), + 576 => + array ( + 'match' => 'E121 200D', + 'replace' => 'E121', + ), + 577 => + array ( + 'match' => 'E122 200D', + 'replace' => 'E122', + ), + 578 => + array ( + 'match' => 'E123 200D', + 'replace' => 'E123', + ), + 579 => + array ( + 'match' => 'E124 200D', + 'replace' => 'E124', + ), + 580 => + array ( + 'match' => 'E125 200D', + 'replace' => 'E125', + ), + 581 => + array ( + 'match' => 'E126 200D', + 'replace' => 'E126', + ), + 582 => + array ( + 'match' => 'E127 200D', + 'replace' => 'E127', + ), + 583 => + array ( + 'match' => 'E128 200D', + 'replace' => 'E128', + ), + 584 => + array ( + 'match' => 'E129 200D', + 'replace' => 'E129', + ), + 585 => + array ( + 'match' => 'E12A 200D', + 'replace' => 'E12A', + ), + 586 => + array ( + 'match' => 'E12B 200D', + 'replace' => 'E12B', + ), + 587 => + array ( + 'match' => 'E12C 200D', + 'replace' => 'E12C', + ), + 588 => + array ( + 'match' => 'E12D 200D', + 'replace' => 'E12D', + ), + 589 => + array ( + 'match' => 'E12E 200D', + 'replace' => 'E12E', + ), + 590 => + array ( + 'match' => 'E12F 200D', + 'replace' => 'E12F', + ), + 591 => + array ( + 'match' => 'E130 200D', + 'replace' => 'E130', + ), + 592 => + array ( + 'match' => 'E131 200D', + 'replace' => 'E131', + ), + 593 => + array ( + 'match' => 'E132 200D', + 'replace' => 'E132', + ), + 594 => + array ( + 'match' => 'E133 200D', + 'replace' => 'E133', + ), + 595 => + array ( + 'match' => 'E134 200D', + 'replace' => 'E134', + ), + 596 => + array ( + 'match' => 'E135 200D', + 'replace' => 'E135', + ), + 597 => + array ( + 'match' => '200D 0ACD', + 'replace' => '0ACD', + ), + 598 => + array ( + 'match' => '200D E05D', + 'replace' => 'E05D', + ), + 599 => + array ( + 'match' => '0A9C 0ABE', + 'replace' => 'E21B', + ), + 600 => + array ( + 'match' => '0A9C 0AC9', + 'replace' => 'E21C', + ), + 601 => + array ( + 'match' => '0A9C 0ACB', + 'replace' => 'E21D', + ), + 602 => + array ( + 'match' => '0A9C 0ACC', + 'replace' => 'E21E', + ), + 603 => + array ( + 'match' => '0ABF ((0A95|0A99|0AA1|0AA6|0AAB|0AB0|0AB9|E004|E008|E010|E015|E019|E01E|E025|E05E|E062|E06A|E06F|E073|E078|E07F|E082|E086|E08E|E093|E097|E09C|E0A3|E136|E137|E138|E139|E13A|E13B|E13C|E141|E142|E144|E145|E146|E148|E14A|E14B|E14E))', + 'replace' => 'E038 \\1', + ), + 604 => + array ( + 'match' => '0ABF ((0A9F|0AA0|0AA2|0A9C|E00E|E00F|E011|E00B|E068|E069|E06B|E065|E08C|E08D|E08F|E089|E14F|E150|E151|E152|E153|E154))', + 'replace' => 'E03A \\1', + ), + 605 => + array ( + 'match' => '0ABF ((0A96|0AA3|0AAC|0AAD|0AB3|E002|E003|E005|E012|E01A|E01B|E020|E026|E027|E05F|E06C|E074|E075|E07A|E080|E081|E083|E090|E098|E099|E09E|E0A4|E0A5|E15E))', + 'replace' => 'E039 \\1', + ), + 606 => + array ( + 'match' => '0ABF ((E13D))', + 'replace' => 'E03B \\1', + ), + 607 => + array ( + 'match' => '0ABF ((E13E|E13F|E140|E143))', + 'replace' => 'E03C \\1', + ), + 608 => + array ( + 'match' => '0ABF ((E15C))', + 'replace' => 'E03D \\1', + ), + 609 => + array ( + 'match' => '0ABF ((E0A7|E0BC|E0BD|E0C8|E0C9|E0C2) (0A97|0A98|0AAF|0A9B|0A9D|0A9E|0AA4|0AA5|0AA7|0AA8|0AAA|0AAE|0AAF|0AB2|0AB5|0AB6|0AB7|0AB8))', + 'replace' => 'E25C \\1', + ), + 610 => + array ( + 'match' => '0ABF ((E0A7|E0BC|E0BD|E0C8|E0C9|E0C2) (0A96|0AA3|0AAC|0AAD|0AB3|E002|E003))', + 'replace' => 'E25C \\1', + ), + 611 => + array ( + 'match' => '0ABF ((E0AB|E0B6|E0BA|E0BE|E0BF|E0C1|E0C3|E0C5|E0C6|E0A9|E0B8|E0AD|E0AF|E0B0|E0B3) (0A96|0AA3|0AAC|0AAD|0AB3|E002|E003))', + 'replace' => 'E25C \\1', + ), + 612 => + array ( + 'match' => '0ABF ((E0AC|E0AE) (0A97|0A98|0AAF|0A9B|0A9D|0A9E|0AA4|0AA5|0AA7|0AA8|0AAA|0AAE|0AAF|0AB2|0AB5|0AB6|0AB7|0AB8))', + 'replace' => 'E25C \\1', + ), + 613 => + array ( + 'match' => '0ABF ((E0AC|E0AE) (0A96|0AA3|0AAC|0AAD|0AB3|E002|E003))', + 'replace' => 'E25C \\1', + ), + 614 => + array ( + 'match' => '0ABF ((E0B4|E0B5|E0B9) (0A96|0AA3|0AAC|0AAD|0AB3|E002|E003))', + 'replace' => 'E25C \\1', + ), + 615 => + array ( + 'match' => '0ABF ((E0B1) (0A96|0AA3|0AAC|0AAD|0AB3|E002|E003))', + 'replace' => 'E25C \\1', + ), + 616 => + array ( + 'match' => '0ABF ((E0A6|E0A8|E0AA|E0B2|E0B7|E0BB|E0C4|E0C7) (0A9C|0A9F|0AA0|0AA2))', + 'replace' => 'E25D \\1', + ), + 617 => + array ( + 'match' => '0ABF ((E0AB|E0B6|E0BA|E0BE|E0BF|E0C1|E0C3|E0C5|E0C6|E0A9|E0B8|E0AD|E0AF|E0B0|E0B3) (0A95|0A99|0AA1|0AA6|0AAB|0AB9))', + 'replace' => 'E25D \\1', + ), + 618 => + array ( + 'match' => '0ABF ((E0AB|E0B6|E0BA|E0BE|E0BF|E0C1|E0C3|E0C5|E0C6|E0A9|E0B8|E0AD|E0AF|E0B0|E0B3) (0A9C|0A9F|0AA0|0AA2))', + 'replace' => 'E25D \\1', + ), + 619 => + array ( + 'match' => '0ABF ((E0B4|E0B5|E0B9) (0A95|0A99|0AA1|0AA6|0AAB|0AB9))', + 'replace' => 'E25D \\1', + ), + 620 => + array ( + 'match' => '0ABF ((E0B1) (0A95|0A99|0AA1|0AA6|0AAB|0AB9))', + 'replace' => 'E25D \\1', + ), + 621 => + array ( + 'match' => '0AB9 0AC3', + 'replace' => 'E02F', + ), + 622 => + array ( + 'match' => '0AB0 0AC1', + 'replace' => 'E15F', + ), + 623 => + array ( + 'match' => '0AC0 E032', + 'replace' => 'E043', + ), + 624 => + array ( + 'match' => '0AC7 E032', + 'replace' => 'E04D', + ), + 625 => + array ( + 'match' => '0AC8 E032', + 'replace' => 'E051', + ), + 626 => + array ( + 'match' => '0ACB E032', + 'replace' => 'E055', + ), + 627 => + array ( + 'match' => '0ACC E032', + 'replace' => 'E059', + ), + 628 => + array ( + 'match' => '0A87 0A82', + 'replace' => 'E160', + ), + 629 => + array ( + 'match' => '0A89 0A82', + 'replace' => 'E161', + ), + 630 => + array ( + 'match' => '0A8A 0A82', + 'replace' => 'E162', + ), + 631 => + array ( + 'match' => 'E032 0A81', + 'replace' => 'E034', + ), + 632 => + array ( + 'match' => 'E032 0A82', + 'replace' => 'E033', + ), + 633 => + array ( + 'match' => '0AC7 0A82', + 'replace' => 'E04C', + ), + 634 => + array ( + 'match' => '0AC8 0A82', + 'replace' => 'E050', + ), + 635 => + array ( + 'match' => '0AC0 0A82', + 'replace' => 'E040', + ), + 636 => + array ( + 'match' => '0ACB 0A82', + 'replace' => 'E054', + ), + 637 => + array ( + 'match' => '0ACC 0A82', + 'replace' => 'E058', + ), + 638 => + array ( + 'match' => 'E04D 0A82', + 'replace' => 'E04E', + ), + 639 => + array ( + 'match' => 'E051 0A82', + 'replace' => 'E052', + ), + 640 => + array ( + 'match' => 'E043 0A82', + 'replace' => 'E046', + ), + 641 => + array ( + 'match' => 'E055 0A82', + 'replace' => 'E056', + ), + 642 => + array ( + 'match' => 'E059 0A82', + 'replace' => 'E05A', + ), + 643 => + array ( + 'match' => 'E04D 0A81', + 'replace' => 'E04F', + ), + 644 => + array ( + 'match' => 'E051 0A81', + 'replace' => 'E053', + ), + 645 => + array ( + 'match' => 'E043 0A81', + 'replace' => 'E049', + ), + 646 => + array ( + 'match' => 'E055 0A81', + 'replace' => 'E057', + ), + 647 => + array ( + 'match' => 'E059 0A81', + 'replace' => 'E05B', + ), + 648 => + array ( + 'match' => '((0A8D|0A8F|0A90|0A91|0A93|0A94|0AC0|E03E|E03F|0AC5|0AC7|0AC8|0AC9|0ACB|0ACC)) 0A81', + 'replace' => '\\1 E031', + ), + 649 => + array ( + 'match' => '((0A95|0A99|0AA1|0AA6|0AAB|0AB9|E004|E008|E010|E015|E019|E025|E05E|E062|E06A|E06F|E073|E07F|E082|E086|E08E|E093|E097|E0A3|E136|E137|E138|E139|E13A|E13B|E13C|E141|E142)) 0AC0', + 'replace' => '\\1 E03E', + ), + 650 => + array ( + 'match' => '((0A95|0A99|0AA1|0AA6|0AAB|0AB9|E004|E008|E010|E015|E019|E025|E05E|E062|E06A|E06F|E073|E07F|E082|E086|E08E|E093|E097|E0A3|E136|E137|E138|E139|E13A|E13B|E13C|E141|E142)) E040', + 'replace' => '\\1 E041', + ), + 651 => + array ( + 'match' => '((0A95|0A99|0AA1|0AA6|0AAB|0AB9|E004|E008|E010|E015|E019|E025|E05E|E062|E06A|E06F|E073|E07F|E082|E086|E08E|E093|E097|E0A3|E136|E137|E138|E139|E13A|E13B|E13C|E141|E142)) E046', + 'replace' => '\\1 E047', + ), + 652 => + array ( + 'match' => '((0A95|0A99|0AA1|0AA6|0AAB|0AB9|E004|E008|E010|E015|E019|E025|E05E|E062|E06A|E06F|E073|E07F|E082|E086|E08E|E093|E097|E0A3|E136|E137|E138|E139|E13A|E13B|E13C|E141|E142)) E049', + 'replace' => '\\1 E04A', + ), + 653 => + array ( + 'match' => '((0A9F|0AA0|0AA2|0A9B|0AB0|E00E|E00F|E011|E00A|E01E|E068|E069|E06B|E064|E078|E08C|E08D|E08F|E088|E09C)) 0AC0', + 'replace' => '\\1 E03F', + ), + 654 => + array ( + 'match' => '((0A9F|0AA0|0AA2|0A9B|0AB0|E00E|E00F|E011|E00A|E01E|E068|E069|E06B|E064|E078|E08C|E08D|E08F|E088|E09C)) E040', + 'replace' => '\\1 E042', + ), + 655 => + array ( + 'match' => '((0A9F|0AA0|0AA2|0A9B|0AB0|E00E|E00F|E011|E00A|E01E|E068|E069|E06B|E064|E078|E08C|E08D|E08F|E088|E09C)) E046', + 'replace' => '\\1 E048', + ), + 656 => + array ( + 'match' => '((0A9F|0AA0|0AA2|0A9B|0AB0|E00E|E00F|E011|E00A|E01E|E068|E069|E06B|E064|E078|E08C|E08D|E08F|E088|E09C)) E049', + 'replace' => '\\1 E04B', + ), + 657 => + array ( + 'match' => '0A9C 0AC0', + 'replace' => 'E028', + ), + 658 => + array ( + 'match' => '0AB3 0AC0', + 'replace' => 'E02A', + ), + 659 => + array ( + 'match' => '0AB3 E043', + 'replace' => 'E02B', + ), + 660 => + array ( + 'match' => '0AB3 E046', + 'replace' => 'E02C', + ), + 661 => + array ( + 'match' => '0AB3 E049', + 'replace' => 'E02D', + ), +); +?> \ No newline at end of file diff --git a/application/third_party/mpdf/includes/ind_hi_1_001.volt.php b/application/third_party/mpdf/includes/ind_hi_1_001.volt.php new file mode 100644 index 0000000..e8b6d57 --- /dev/null +++ b/application/third_party/mpdf/includes/ind_hi_1_001.volt.php @@ -0,0 +1,4169 @@ +<?php + $volt = array ( + 0 => + array ( + 'match' => '0915 094D 0937', + 'replace' => 'E028', + ), + 1 => + array ( + 'match' => '091C 094D 091E', + 'replace' => 'E029', + ), + 2 => + array ( + 'match' => '0926 094D 092F', + 'replace' => 'E128', + ), + 3 => + array ( + 'match' => '094D (200D)', + 'replace' => 'E00E \\1', + ), + 4 => + array ( + 'match' => '094D ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029))', + 'replace' => 'E00E \\1', + ), + 5 => + array ( + 'match' => '094D (25CC)', + 'replace' => 'E00E \\1', + ), + 6 => + array ( + 'match' => '094D 200C', + 'replace' => 'E00C', + ), + 7 => + array ( + 'match' => '((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029|0958|0959|095A|E02A|E02B|E02C|E02D|095B|E02E|E02F|E030|E031|095C|095D|E032|E033|E034|E035|E036|0929|E037|095E|E038|E039|E03A|095F|0931|E03B|0934|E03C|E03D|E03E|E03F|E040|E041|E042|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E0A6|E0A7|E0A8|E0A9|E0AA|E0AB|E0AC|E0AD|E0AE|E0AF|E0B0|E0B1|E0B2|E0B3|E0B4|E0B5|E0B6|E0B7|E0B8|E0B9|E0BA|E0BB|E0BC|E0BD|E0BE|E0BF|E0C0|E0C1|E0C2|E0C3|E0C4|E0C5|E0C6|E0C7|E0C8|E0C9|E0CA|E0CB|E0CC|E0CD|E0CE|E0CF|E0D0|E0D1|E0D2|E11E|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E129|E12A|E12B|E12C|E12D|E12E|E12F|E130|E131|E132|E133)) E00E 0930', + 'replace' => '\\1 E013', + ), + 8 => + array ( + 'match' => '(093C) E00E 0930', + 'replace' => '\\1 E013', + ), + 9 => + array ( + 'match' => '(200D) E00E 0930', + 'replace' => '\\1 E013', + ), + 10 => + array ( + 'match' => '(25CC) E00E 0930', + 'replace' => '\\1 E013', + ), + 11 => + array ( + 'match' => '(0020) E00E 0930', + 'replace' => '\\1 E013', + ), + 12 => + array ( + 'match' => '((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029|0958|0959|095A|E02A|E02B|E02C|E02D|095B|E02E|E02F|E030|E031|095C|095D|E032|E033|E034|E035|E036|0929|E037|095E|E038|E039|E03A|095F|0931|E03B|0934|E03C|E03D|E03E|E03F|E040|E041|E042|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0A0|E0A1|E0A2|E0A3|E0A4|E0A5|E0A6|E0A7|E0A8|E0A9|E0AA|E0AB|E0AC|E0AD|E0AE|E0AF|E0B0|E0B1|E0B2|E0B3|E0B4|E0B5|E0B6|E0B7|E0B8|E0B9|E0BA|E0BB|E0BC|E0BD|E0BE|E0BF|E0C0|E0C1|E0C2|E0C3|E0C4|E0C5|E0C6|E0C7|E0C8|E0C9|E0CA|E0CB|E0CC|E0CD|E0CE|E0CF|E0D0|E0D1|E0D2|E11E|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E129|E12A|E12B|E12C|E12D|E12E|E12F|E130|E131|E132|E133)) 0930 094D', + 'replace' => '\\1 E015', + ), + 13 => + array ( + 'match' => '((E013|E015|0941|0942|0943|0962|093E|0940|0949|094A|094B|094C|0945|0946|0947|0948|0901)) 0930 094D', + 'replace' => '\\1 E015', + ), + 14 => + array ( + 'match' => '(093C) 0930 094D', + 'replace' => '\\1 E015', + ), + 15 => + array ( + 'match' => '(25CC) 0930 094D', + 'replace' => '\\1 E015', + ), + 16 => + array ( + 'match' => '(E128) 0930 094D', + 'replace' => '\\1 E015', + ), + 17 => + array ( + 'match' => '0915 093C', + 'replace' => '0958', + ), + 18 => + array ( + 'match' => '0916 093C', + 'replace' => '0959', + ), + 19 => + array ( + 'match' => '0917 093C', + 'replace' => '095A', + ), + 20 => + array ( + 'match' => '0918 093C', + 'replace' => 'E02A', + ), + 21 => + array ( + 'match' => '0919 093C', + 'replace' => 'E02B', + ), + 22 => + array ( + 'match' => '091A 093C', + 'replace' => 'E02C', + ), + 23 => + array ( + 'match' => '091B 093C', + 'replace' => 'E02D', + ), + 24 => + array ( + 'match' => '091C 093C', + 'replace' => '095B', + ), + 25 => + array ( + 'match' => '091D 093C', + 'replace' => 'E02E', + ), + 26 => + array ( + 'match' => '091E 093C', + 'replace' => 'E02F', + ), + 27 => + array ( + 'match' => '091F 093C', + 'replace' => 'E030', + ), + 28 => + array ( + 'match' => '0920 093C', + 'replace' => 'E031', + ), + 29 => + array ( + 'match' => '0921 093C', + 'replace' => '095C', + ), + 30 => + array ( + 'match' => '0922 093C', + 'replace' => '095D', + ), + 31 => + array ( + 'match' => '0923 093C', + 'replace' => 'E032', + ), + 32 => + array ( + 'match' => '0924 093C', + 'replace' => 'E033', + ), + 33 => + array ( + 'match' => '0925 093C', + 'replace' => 'E034', + ), + 34 => + array ( + 'match' => '0926 093C', + 'replace' => 'E035', + ), + 35 => + array ( + 'match' => '0927 093C', + 'replace' => 'E036', + ), + 36 => + array ( + 'match' => '0928 093C', + 'replace' => '0929', + ), + 37 => + array ( + 'match' => '092A 093C', + 'replace' => 'E037', + ), + 38 => + array ( + 'match' => '092B 093C', + 'replace' => '095E', + ), + 39 => + array ( + 'match' => '092C 093C', + 'replace' => 'E038', + ), + 40 => + array ( + 'match' => '092D 093C', + 'replace' => 'E039', + ), + 41 => + array ( + 'match' => '092E 093C', + 'replace' => 'E03A', + ), + 42 => + array ( + 'match' => '092F 093C', + 'replace' => '095F', + ), + 43 => + array ( + 'match' => '0930 093C', + 'replace' => '0931', + ), + 44 => + array ( + 'match' => '0932 093C', + 'replace' => 'E03B', + ), + 45 => + array ( + 'match' => '0933 093C', + 'replace' => '0934', + ), + 46 => + array ( + 'match' => '0935 093C', + 'replace' => 'E03C', + ), + 47 => + array ( + 'match' => '0936 093C', + 'replace' => 'E03D', + ), + 48 => + array ( + 'match' => '0937 093C', + 'replace' => 'E03E', + ), + 49 => + array ( + 'match' => '0938 093C', + 'replace' => 'E03F', + ), + 50 => + array ( + 'match' => '0939 093C', + 'replace' => 'E040', + ), + 51 => + array ( + 'match' => 'E028 093C', + 'replace' => 'E041', + ), + 52 => + array ( + 'match' => 'E029 093C', + 'replace' => 'E042', + ), + 53 => + array ( + 'match' => '0915 E013', + 'replace' => 'E08B', + ), + 54 => + array ( + 'match' => '0916 E013', + 'replace' => 'E08C', + ), + 55 => + array ( + 'match' => '0917 E013', + 'replace' => 'E08D', + ), + 56 => + array ( + 'match' => '0918 E013', + 'replace' => 'E08E', + ), + 57 => + array ( + 'match' => '0919 E013', + 'replace' => 'E08F', + ), + 58 => + array ( + 'match' => '091A E013', + 'replace' => 'E090', + ), + 59 => + array ( + 'match' => '091B E013', + 'replace' => 'E091', + ), + 60 => + array ( + 'match' => '091C E013', + 'replace' => 'E092', + ), + 61 => + array ( + 'match' => '091D E013', + 'replace' => 'E093', + ), + 62 => + array ( + 'match' => '091E E013', + 'replace' => 'E094', + ), + 63 => + array ( + 'match' => '091F E013', + 'replace' => 'E095', + ), + 64 => + array ( + 'match' => '0920 E013', + 'replace' => 'E096', + ), + 65 => + array ( + 'match' => '0921 E013', + 'replace' => 'E097', + ), + 66 => + array ( + 'match' => '0922 E013', + 'replace' => 'E098', + ), + 67 => + array ( + 'match' => '0923 E013', + 'replace' => 'E099', + ), + 68 => + array ( + 'match' => '0924 E013', + 'replace' => 'E09A', + ), + 69 => + array ( + 'match' => '0925 E013', + 'replace' => 'E09B', + ), + 70 => + array ( + 'match' => '0926 E013', + 'replace' => 'E09C', + ), + 71 => + array ( + 'match' => '0927 E013', + 'replace' => 'E09D', + ), + 72 => + array ( + 'match' => '0928 E013', + 'replace' => 'E09E', + ), + 73 => + array ( + 'match' => '092A E013', + 'replace' => 'E09F', + ), + 74 => + array ( + 'match' => '092B E013', + 'replace' => 'E0A0', + ), + 75 => + array ( + 'match' => '092C E013', + 'replace' => 'E0A1', + ), + 76 => + array ( + 'match' => '092D E013', + 'replace' => 'E0A2', + ), + 77 => + array ( + 'match' => '092E E013', + 'replace' => 'E0A3', + ), + 78 => + array ( + 'match' => '092F E013', + 'replace' => 'E0A4', + ), + 79 => + array ( + 'match' => '0930 E013', + 'replace' => 'E0A5', + ), + 80 => + array ( + 'match' => '0932 E013', + 'replace' => 'E0A6', + ), + 81 => + array ( + 'match' => '0933 E013', + 'replace' => 'E0A7', + ), + 82 => + array ( + 'match' => '0935 E013', + 'replace' => 'E0A8', + ), + 83 => + array ( + 'match' => '0936 E013', + 'replace' => 'E0A9', + ), + 84 => + array ( + 'match' => '0937 E013', + 'replace' => 'E0AA', + ), + 85 => + array ( + 'match' => '0938 E013', + 'replace' => 'E0AB', + ), + 86 => + array ( + 'match' => '0939 E013', + 'replace' => 'E0AC', + ), + 87 => + array ( + 'match' => 'E028 E013', + 'replace' => 'E0AD', + ), + 88 => + array ( + 'match' => 'E029 E013', + 'replace' => 'E0AE', + ), + 89 => + array ( + 'match' => '0958 E013', + 'replace' => 'E0AF', + ), + 90 => + array ( + 'match' => '0959 E013', + 'replace' => 'E0B0', + ), + 91 => + array ( + 'match' => '095A E013', + 'replace' => 'E0B1', + ), + 92 => + array ( + 'match' => 'E02A E013', + 'replace' => 'E0B2', + ), + 93 => + array ( + 'match' => 'E02B E013', + 'replace' => 'E0B3', + ), + 94 => + array ( + 'match' => 'E02C E013', + 'replace' => 'E0B4', + ), + 95 => + array ( + 'match' => 'E02D E013', + 'replace' => 'E0B5', + ), + 96 => + array ( + 'match' => '095B E013', + 'replace' => 'E0B6', + ), + 97 => + array ( + 'match' => 'E02E E013', + 'replace' => 'E0B7', + ), + 98 => + array ( + 'match' => 'E02F E013', + 'replace' => 'E0B8', + ), + 99 => + array ( + 'match' => 'E030 E013', + 'replace' => 'E0B9', + ), + 100 => + array ( + 'match' => 'E031 E013', + 'replace' => 'E0BA', + ), + 101 => + array ( + 'match' => '095C E013', + 'replace' => 'E0BB', + ), + 102 => + array ( + 'match' => '095D E013', + 'replace' => 'E0BC', + ), + 103 => + array ( + 'match' => 'E032 E013', + 'replace' => 'E0BD', + ), + 104 => + array ( + 'match' => 'E033 E013', + 'replace' => 'E0BE', + ), + 105 => + array ( + 'match' => 'E034 E013', + 'replace' => 'E0BF', + ), + 106 => + array ( + 'match' => 'E035 E013', + 'replace' => 'E0C0', + ), + 107 => + array ( + 'match' => 'E036 E013', + 'replace' => 'E0C1', + ), + 108 => + array ( + 'match' => '0929 E013', + 'replace' => 'E0C2', + ), + 109 => + array ( + 'match' => 'E037 E013', + 'replace' => 'E0C3', + ), + 110 => + array ( + 'match' => '095E E013', + 'replace' => 'E0C4', + ), + 111 => + array ( + 'match' => 'E038 E013', + 'replace' => 'E0C5', + ), + 112 => + array ( + 'match' => 'E039 E013', + 'replace' => 'E0C6', + ), + 113 => + array ( + 'match' => 'E03A E013', + 'replace' => 'E0C7', + ), + 114 => + array ( + 'match' => '095F E013', + 'replace' => 'E0C8', + ), + 115 => + array ( + 'match' => '0931 E013', + 'replace' => 'E0C9', + ), + 116 => + array ( + 'match' => 'E03B E013', + 'replace' => 'E0CA', + ), + 117 => + array ( + 'match' => '0934 E013', + 'replace' => 'E0CB', + ), + 118 => + array ( + 'match' => 'E03C E013', + 'replace' => 'E0CC', + ), + 119 => + array ( + 'match' => 'E03D E013', + 'replace' => 'E0CD', + ), + 120 => + array ( + 'match' => 'E03E E013', + 'replace' => 'E0CE', + ), + 121 => + array ( + 'match' => 'E03F E013', + 'replace' => 'E0CF', + ), + 122 => + array ( + 'match' => 'E040 E013', + 'replace' => 'E0D0', + ), + 123 => + array ( + 'match' => 'E041 E013', + 'replace' => 'E0D1', + ), + 124 => + array ( + 'match' => 'E042 E013', + 'replace' => 'E0D2', + ), + 125 => + array ( + 'match' => 'E028 E013', + 'replace' => 'E0AD', + ), + 126 => + array ( + 'match' => 'E029 E013', + 'replace' => 'E0AE', + ), + 127 => + array ( + 'match' => '0915 E00E', + 'replace' => 'E043', + ), + 128 => + array ( + 'match' => '0916 E00E', + 'replace' => 'E044', + ), + 129 => + array ( + 'match' => '0917 E00E', + 'replace' => 'E045', + ), + 130 => + array ( + 'match' => '0918 E00E', + 'replace' => 'E046', + ), + 131 => + array ( + 'match' => '0919 E00E', + 'replace' => 'E047', + ), + 132 => + array ( + 'match' => '091A E00E', + 'replace' => 'E048', + ), + 133 => + array ( + 'match' => '091B E00E', + 'replace' => 'E049', + ), + 134 => + array ( + 'match' => '091C E00E', + 'replace' => 'E04A', + ), + 135 => + array ( + 'match' => '091D E00E', + 'replace' => 'E04B', + ), + 136 => + array ( + 'match' => '091E E00E', + 'replace' => 'E04C', + ), + 137 => + array ( + 'match' => '091F E00E', + 'replace' => 'E04D', + ), + 138 => + array ( + 'match' => '0920 E00E', + 'replace' => 'E04E', + ), + 139 => + array ( + 'match' => '0921 E00E', + 'replace' => 'E04F', + ), + 140 => + array ( + 'match' => '0922 E00E', + 'replace' => 'E050', + ), + 141 => + array ( + 'match' => '0923 E00E', + 'replace' => 'E051', + ), + 142 => + array ( + 'match' => '0924 E00E', + 'replace' => 'E052', + ), + 143 => + array ( + 'match' => '0925 E00E', + 'replace' => 'E053', + ), + 144 => + array ( + 'match' => '0926 E00E', + 'replace' => 'E054', + ), + 145 => + array ( + 'match' => '0927 E00E', + 'replace' => 'E055', + ), + 146 => + array ( + 'match' => '0928 E00E', + 'replace' => 'E056', + ), + 147 => + array ( + 'match' => '092A E00E', + 'replace' => 'E057', + ), + 148 => + array ( + 'match' => '092B E00E', + 'replace' => 'E058', + ), + 149 => + array ( + 'match' => '092C E00E', + 'replace' => 'E059', + ), + 150 => + array ( + 'match' => '092D E00E', + 'replace' => 'E05A', + ), + 151 => + array ( + 'match' => '092E E00E', + 'replace' => 'E05B', + ), + 152 => + array ( + 'match' => '092F E00E', + 'replace' => 'E05C', + ), + 153 => + array ( + 'match' => '0930 E00E', + 'replace' => 'E05D', + ), + 154 => + array ( + 'match' => '0932 E00E', + 'replace' => 'E05E', + ), + 155 => + array ( + 'match' => '0933 E00E', + 'replace' => 'E05F', + ), + 156 => + array ( + 'match' => '0935 E00E', + 'replace' => 'E060', + ), + 157 => + array ( + 'match' => '0936 E00E', + 'replace' => 'E061', + ), + 158 => + array ( + 'match' => '0937 E00E', + 'replace' => 'E062', + ), + 159 => + array ( + 'match' => '0938 E00E', + 'replace' => 'E063', + ), + 160 => + array ( + 'match' => '0939 E00E', + 'replace' => 'E064', + ), + 161 => + array ( + 'match' => 'E028 E00E', + 'replace' => 'E065', + ), + 162 => + array ( + 'match' => 'E029 E00E', + 'replace' => 'E066', + ), + 163 => + array ( + 'match' => 'E08B E00E', + 'replace' => 'E0D3', + ), + 164 => + array ( + 'match' => 'E08C E00E', + 'replace' => 'E0D4', + ), + 165 => + array ( + 'match' => 'E08D E00E', + 'replace' => 'E0D5', + ), + 166 => + array ( + 'match' => 'E08E E00E', + 'replace' => 'E0D6', + ), + 167 => + array ( + 'match' => 'E08F E00E', + 'replace' => 'E0D7', + ), + 168 => + array ( + 'match' => 'E090 E00E', + 'replace' => 'E0D8', + ), + 169 => + array ( + 'match' => 'E091 E00E', + 'replace' => 'E0D9', + ), + 170 => + array ( + 'match' => 'E092 E00E', + 'replace' => 'E0DA', + ), + 171 => + array ( + 'match' => 'E093 E00E', + 'replace' => 'E0DB', + ), + 172 => + array ( + 'match' => 'E094 E00E', + 'replace' => 'E0DC', + ), + 173 => + array ( + 'match' => 'E095 E00E', + 'replace' => 'E0DD', + ), + 174 => + array ( + 'match' => 'E096 E00E', + 'replace' => 'E0DE', + ), + 175 => + array ( + 'match' => 'E097 E00E', + 'replace' => 'E0DF', + ), + 176 => + array ( + 'match' => 'E098 E00E', + 'replace' => 'E0E0', + ), + 177 => + array ( + 'match' => 'E099 E00E', + 'replace' => 'E0E1', + ), + 178 => + array ( + 'match' => 'E09A E00E', + 'replace' => 'E0E2', + ), + 179 => + array ( + 'match' => 'E09B E00E', + 'replace' => 'E0E3', + ), + 180 => + array ( + 'match' => 'E09C E00E', + 'replace' => 'E0E4', + ), + 181 => + array ( + 'match' => 'E09D E00E', + 'replace' => 'E0E5', + ), + 182 => + array ( + 'match' => 'E09E E00E', + 'replace' => 'E0E6', + ), + 183 => + array ( + 'match' => 'E09F E00E', + 'replace' => 'E0E7', + ), + 184 => + array ( + 'match' => 'E0A0 E00E', + 'replace' => 'E0E8', + ), + 185 => + array ( + 'match' => 'E0A1 E00E', + 'replace' => 'E0E9', + ), + 186 => + array ( + 'match' => 'E0A2 E00E', + 'replace' => 'E0EA', + ), + 187 => + array ( + 'match' => 'E0A3 E00E', + 'replace' => 'E0EB', + ), + 188 => + array ( + 'match' => 'E0A4 E00E', + 'replace' => 'E0EC', + ), + 189 => + array ( + 'match' => 'E0A5 E00E', + 'replace' => 'E0ED', + ), + 190 => + array ( + 'match' => 'E0A6 E00E', + 'replace' => 'E0EE', + ), + 191 => + array ( + 'match' => 'E0A7 E00E', + 'replace' => 'E0EF', + ), + 192 => + array ( + 'match' => 'E0A8 E00E', + 'replace' => 'E0F0', + ), + 193 => + array ( + 'match' => 'E0A9 E00E', + 'replace' => 'E0F1', + ), + 194 => + array ( + 'match' => 'E0AA E00E', + 'replace' => 'E0F2', + ), + 195 => + array ( + 'match' => 'E0AB E00E', + 'replace' => 'E0F3', + ), + 196 => + array ( + 'match' => 'E0AC E00E', + 'replace' => 'E0F4', + ), + 197 => + array ( + 'match' => 'E0AD E00E', + 'replace' => 'E0F5', + ), + 198 => + array ( + 'match' => 'E0AE E00E', + 'replace' => 'E0F6', + ), + 199 => + array ( + 'match' => 'E0AF E00E', + 'replace' => 'E0F7', + ), + 200 => + array ( + 'match' => 'E0B0 E00E', + 'replace' => 'E0F8', + ), + 201 => + array ( + 'match' => 'E0B1 E00E', + 'replace' => 'E0F9', + ), + 202 => + array ( + 'match' => 'E0B2 E00E', + 'replace' => 'E0FA', + ), + 203 => + array ( + 'match' => 'E0B3 E00E', + 'replace' => 'E0FB', + ), + 204 => + array ( + 'match' => 'E0B4 E00E', + 'replace' => 'E0FC', + ), + 205 => + array ( + 'match' => 'E0B5 E00E', + 'replace' => 'E0FD', + ), + 206 => + array ( + 'match' => 'E0B6 E00E', + 'replace' => 'E0FE', + ), + 207 => + array ( + 'match' => 'E0B7 E00E', + 'replace' => 'E0FF', + ), + 208 => + array ( + 'match' => 'E0B8 E00E', + 'replace' => 'E100', + ), + 209 => + array ( + 'match' => 'E0B9 E00E', + 'replace' => 'E101', + ), + 210 => + array ( + 'match' => 'E0BA E00E', + 'replace' => 'E102', + ), + 211 => + array ( + 'match' => 'E0BB E00E', + 'replace' => 'E103', + ), + 212 => + array ( + 'match' => 'E0BC E00E', + 'replace' => 'E104', + ), + 213 => + array ( + 'match' => 'E0BD E00E', + 'replace' => 'E105', + ), + 214 => + array ( + 'match' => 'E0BE E00E', + 'replace' => 'E106', + ), + 215 => + array ( + 'match' => 'E0BF E00E', + 'replace' => 'E107', + ), + 216 => + array ( + 'match' => 'E0C0 E00E', + 'replace' => 'E108', + ), + 217 => + array ( + 'match' => 'E0C1 E00E', + 'replace' => 'E109', + ), + 218 => + array ( + 'match' => 'E0C2 E00E', + 'replace' => 'E10A', + ), + 219 => + array ( + 'match' => 'E0C3 E00E', + 'replace' => 'E10B', + ), + 220 => + array ( + 'match' => 'E0C4 E00E', + 'replace' => 'E10C', + ), + 221 => + array ( + 'match' => 'E0C5 E00E', + 'replace' => 'E10D', + ), + 222 => + array ( + 'match' => 'E0C6 E00E', + 'replace' => 'E10E', + ), + 223 => + array ( + 'match' => 'E0C7 E00E', + 'replace' => 'E10F', + ), + 224 => + array ( + 'match' => 'E0C8 E00E', + 'replace' => 'E110', + ), + 225 => + array ( + 'match' => 'E0C9 E00E', + 'replace' => 'E111', + ), + 226 => + array ( + 'match' => 'E0CA E00E', + 'replace' => 'E112', + ), + 227 => + array ( + 'match' => 'E0CB E00E', + 'replace' => 'E113', + ), + 228 => + array ( + 'match' => 'E0CC E00E', + 'replace' => 'E114', + ), + 229 => + array ( + 'match' => 'E0CD E00E', + 'replace' => 'E115', + ), + 230 => + array ( + 'match' => 'E0CE E00E', + 'replace' => 'E116', + ), + 231 => + array ( + 'match' => 'E0CF E00E', + 'replace' => 'E117', + ), + 232 => + array ( + 'match' => 'E0D0 E00E', + 'replace' => 'E118', + ), + 233 => + array ( + 'match' => 'E0D1 E00E', + 'replace' => 'E119', + ), + 234 => + array ( + 'match' => 'E0D2 E00E', + 'replace' => 'E11A', + ), + 235 => + array ( + 'match' => '0958 E00E', + 'replace' => 'E067', + ), + 236 => + array ( + 'match' => '0959 E00E', + 'replace' => 'E068', + ), + 237 => + array ( + 'match' => '095A E00E', + 'replace' => 'E069', + ), + 238 => + array ( + 'match' => 'E02A E00E', + 'replace' => 'E06A', + ), + 239 => + array ( + 'match' => 'E02B E00E', + 'replace' => 'E06B', + ), + 240 => + array ( + 'match' => 'E02C E00E', + 'replace' => 'E06C', + ), + 241 => + array ( + 'match' => 'E02D E00E', + 'replace' => 'E06D', + ), + 242 => + array ( + 'match' => '095B E00E', + 'replace' => 'E06E', + ), + 243 => + array ( + 'match' => 'E02E E00E', + 'replace' => 'E06F', + ), + 244 => + array ( + 'match' => 'E02F E00E', + 'replace' => 'E070', + ), + 245 => + array ( + 'match' => 'E030 E00E', + 'replace' => 'E071', + ), + 246 => + array ( + 'match' => 'E031 E00E', + 'replace' => 'E072', + ), + 247 => + array ( + 'match' => '095C E00E', + 'replace' => 'E073', + ), + 248 => + array ( + 'match' => '095D E00E', + 'replace' => 'E074', + ), + 249 => + array ( + 'match' => 'E032 E00E', + 'replace' => 'E075', + ), + 250 => + array ( + 'match' => 'E033 E00E', + 'replace' => 'E076', + ), + 251 => + array ( + 'match' => 'E034 E00E', + 'replace' => 'E077', + ), + 252 => + array ( + 'match' => 'E035 E00E', + 'replace' => 'E078', + ), + 253 => + array ( + 'match' => 'E036 E00E', + 'replace' => 'E079', + ), + 254 => + array ( + 'match' => '0929 E00E', + 'replace' => 'E07A', + ), + 255 => + array ( + 'match' => 'E037 E00E', + 'replace' => 'E07B', + ), + 256 => + array ( + 'match' => '095E E00E', + 'replace' => 'E07C', + ), + 257 => + array ( + 'match' => 'E038 E00E', + 'replace' => 'E07D', + ), + 258 => + array ( + 'match' => 'E039 E00E', + 'replace' => 'E07E', + ), + 259 => + array ( + 'match' => 'E03A E00E', + 'replace' => 'E07F', + ), + 260 => + array ( + 'match' => '095F E00E', + 'replace' => 'E080', + ), + 261 => + array ( + 'match' => '0931 E00E', + 'replace' => 'E081', + ), + 262 => + array ( + 'match' => 'E03B E00E', + 'replace' => 'E082', + ), + 263 => + array ( + 'match' => '0934 E00E', + 'replace' => 'E083', + ), + 264 => + array ( + 'match' => 'E03C E00E', + 'replace' => 'E084', + ), + 265 => + array ( + 'match' => 'E03D E00E', + 'replace' => 'E085', + ), + 266 => + array ( + 'match' => 'E03E E00E', + 'replace' => 'E086', + ), + 267 => + array ( + 'match' => 'E03F E00E', + 'replace' => 'E087', + ), + 268 => + array ( + 'match' => 'E040 E00E', + 'replace' => 'E088', + ), + 269 => + array ( + 'match' => 'E041 E00E', + 'replace' => 'E089', + ), + 270 => + array ( + 'match' => 'E042 E00E', + 'replace' => 'E08A', + ), + 271 => + array ( + 'match' => 'E043 0924', + 'replace' => 'E11B', + ), + 272 => + array ( + 'match' => 'E044 0928', + 'replace' => 'E11C', + ), + 273 => + array ( + 'match' => 'E047 092E', + 'replace' => 'E11D', + ), + 274 => + array ( + 'match' => 'E052 0924', + 'replace' => 'E11E', + ), + 275 => + array ( + 'match' => 'E052 0928', + 'replace' => 'E11F', + ), + 276 => + array ( + 'match' => 'E054 0917', + 'replace' => 'E120', + ), + 277 => + array ( + 'match' => 'E054 0918', + 'replace' => 'E121', + ), + 278 => + array ( + 'match' => 'E054 0926', + 'replace' => 'E122', + ), + 279 => + array ( + 'match' => 'E054 0927', + 'replace' => 'E123', + ), + 280 => + array ( + 'match' => 'E054 0928', + 'replace' => 'E124', + ), + 281 => + array ( + 'match' => 'E054 092C', + 'replace' => 'E125', + ), + 282 => + array ( + 'match' => 'E054 092D', + 'replace' => 'E126', + ), + 283 => + array ( + 'match' => 'E054 E05C 092D', + 'replace' => 'E127', + ), + 284 => + array ( + 'match' => 'E054 092F', + 'replace' => 'E128', + ), + 285 => + array ( + 'match' => 'E054 0935', + 'replace' => 'E129', + ), + 286 => + array ( + 'match' => 'E057 0924', + 'replace' => 'E12A', + ), + 287 => + array ( + 'match' => 'E061 0928', + 'replace' => 'E12B', + ), + 288 => + array ( + 'match' => 'E061 091A', + 'replace' => 'E12C', + ), + 289 => + array ( + 'match' => 'E061 0932', + 'replace' => 'E12D', + ), + 290 => + array ( + 'match' => 'E061 0935', + 'replace' => 'E12E', + ), + 291 => + array ( + 'match' => 'E062 091F', + 'replace' => 'E12F', + ), + 292 => + array ( + 'match' => 'E062 0920', + 'replace' => 'E130', + ), + 293 => + array ( + 'match' => 'E062 E095', + 'replace' => 'E131', + ), + 294 => + array ( + 'match' => 'E062 E096', + 'replace' => 'E132', + ), + 295 => + array ( + 'match' => 'E063 E09A', + 'replace' => 'E133', + ), + 296 => + array ( + 'match' => 'E064 0928', + 'replace' => 'E134', + ), + 297 => + array ( + 'match' => 'E064 092E', + 'replace' => 'E135', + ), + 298 => + array ( + 'match' => 'E064 092F', + 'replace' => 'E136', + ), + 299 => + array ( + 'match' => 'E064 0923', + 'replace' => 'E137', + ), + 300 => + array ( + 'match' => 'E064 0932', + 'replace' => 'E138', + ), + 301 => + array ( + 'match' => 'E064 0935', + 'replace' => 'E139', + ), + 302 => + array ( + 'match' => 'E044 E056', + 'replace' => 'E13B', + ), + 303 => + array ( + 'match' => 'E052 E052', + 'replace' => 'E13D', + ), + 304 => + array ( + 'match' => 'E052 E056', + 'replace' => 'E13E', + ), + 305 => + array ( + 'match' => 'E054 E05B', + 'replace' => 'E13F', + ), + 306 => + array ( + 'match' => 'E057 E052', + 'replace' => 'E140', + ), + 307 => + array ( + 'match' => 'E061 E056', + 'replace' => 'E141', + ), + 308 => + array ( + 'match' => 'E061 E048', + 'replace' => 'E142', + ), + 309 => + array ( + 'match' => 'E061 E05E', + 'replace' => 'E143', + ), + 310 => + array ( + 'match' => 'E061 E060', + 'replace' => 'E144', + ), + 311 => + array ( + 'match' => 'E063 E0E2', + 'replace' => 'E145', + ), + 312 => + array ( + 'match' => 'E047 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) E015)', + 'replace' => 'E047 E015 \\1', + ), + 313 => + array ( + 'match' => 'E04D ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) E015)', + 'replace' => 'E04D E015 \\1', + ), + 314 => + array ( + 'match' => 'E04E ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) E015)', + 'replace' => 'E04E E015 \\1', + ), + 315 => + array ( + 'match' => 'E04F ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) E015)', + 'replace' => 'E04F E015 \\1', + ), + 316 => + array ( + 'match' => 'E050 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) E015)', + 'replace' => 'E050 E015 \\1', + ), + 317 => + array ( + 'match' => 'E054 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) E015)', + 'replace' => 'E054 E015 \\1', + ), + 318 => + array ( + 'match' => 'E06B ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) E015)', + 'replace' => 'E06B E015 \\1', + ), + 319 => + array ( + 'match' => 'E071 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) E015)', + 'replace' => 'E071 E015 \\1', + ), + 320 => + array ( + 'match' => 'E072 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) E015)', + 'replace' => 'E072 E015 \\1', + ), + 321 => + array ( + 'match' => 'E073 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) E015)', + 'replace' => 'E073 E015 \\1', + ), + 322 => + array ( + 'match' => 'E074 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) E015)', + 'replace' => 'E074 E015 \\1', + ), + 323 => + array ( + 'match' => 'E078 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) E015)', + 'replace' => 'E078 E015 \\1', + ), + 324 => + array ( + 'match' => 'E0FB ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) E015)', + 'replace' => 'E0FB E015 \\1', + ), + 325 => + array ( + 'match' => 'E101 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) E015)', + 'replace' => 'E101 E015 \\1', + ), + 326 => + array ( + 'match' => 'E102 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) E015)', + 'replace' => 'E102 E015 \\1', + ), + 327 => + array ( + 'match' => 'E103 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) E015)', + 'replace' => 'E103 E015 \\1', + ), + 328 => + array ( + 'match' => 'E104 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) E015)', + 'replace' => 'E104 E015 \\1', + ), + 329 => + array ( + 'match' => 'E108 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) E015)', + 'replace' => 'E108 E015 \\1', + ), + 330 => + array ( + 'match' => 'E047 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (E015|0947|E1A8|E1A7|E199|E1B2|E1B1|0946|E202|E201|E1A3|E1C6|E1C5|0945|E200|E1FF|0948|E1AA|E1A9|E19A|E1B4|E1B3|0902|E00F|0901|0953|0954|0951) E015)', + 'replace' => 'E047 E015 \\1', + ), + 331 => + array ( + 'match' => 'E04D ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (E015|0947|E1A8|E1A7|E199|E1B2|E1B1|0946|E202|E201|E1A3|E1C6|E1C5|0945|E200|E1FF|0948|E1AA|E1A9|E19A|E1B4|E1B3|0902|E00F|0901|0953|0954|0951) E015)', + 'replace' => 'E04D E015 \\1', + ), + 332 => + array ( + 'match' => 'E04E ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (E015|0947|E1A8|E1A7|E199|E1B2|E1B1|0946|E202|E201|E1A3|E1C6|E1C5|0945|E200|E1FF|0948|E1AA|E1A9|E19A|E1B4|E1B3|0902|E00F|0901|0953|0954|0951) E015)', + 'replace' => 'E04E E015 \\1', + ), + 333 => + array ( + 'match' => 'E04F ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (E015|0947|E1A8|E1A7|E199|E1B2|E1B1|0946|E202|E201|E1A3|E1C6|E1C5|0945|E200|E1FF|0948|E1AA|E1A9|E19A|E1B4|E1B3|0902|E00F|0901|0953|0954|0951) E015)', + 'replace' => 'E04F E015 \\1', + ), + 334 => + array ( + 'match' => 'E050 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (E015|0947|E1A8|E1A7|E199|E1B2|E1B1|0946|E202|E201|E1A3|E1C6|E1C5|0945|E200|E1FF|0948|E1AA|E1A9|E19A|E1B4|E1B3|0902|E00F|0901|0953|0954|0951) E015)', + 'replace' => 'E050 E015 \\1', + ), + 335 => + array ( + 'match' => 'E054 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (E015|0947|E1A8|E1A7|E199|E1B2|E1B1|0946|E202|E201|E1A3|E1C6|E1C5|0945|E200|E1FF|0948|E1AA|E1A9|E19A|E1B4|E1B3|0902|E00F|0901|0953|0954|0951) E015)', + 'replace' => 'E054 E015 \\1', + ), + 336 => + array ( + 'match' => 'E06B ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (E015|0947|E1A8|E1A7|E199|E1B2|E1B1|0946|E202|E201|E1A3|E1C6|E1C5|0945|E200|E1FF|0948|E1AA|E1A9|E19A|E1B4|E1B3|0902|E00F|0901|0953|0954|0951) E015)', + 'replace' => 'E06B E015 \\1', + ), + 337 => + array ( + 'match' => 'E071 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (E015|0947|E1A8|E1A7|E199|E1B2|E1B1|0946|E202|E201|E1A3|E1C6|E1C5|0945|E200|E1FF|0948|E1AA|E1A9|E19A|E1B4|E1B3|0902|E00F|0901|0953|0954|0951) E015)', + 'replace' => 'E071 E015 \\1', + ), + 338 => + array ( + 'match' => 'E072 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (E015|0947|E1A8|E1A7|E199|E1B2|E1B1|0946|E202|E201|E1A3|E1C6|E1C5|0945|E200|E1FF|0948|E1AA|E1A9|E19A|E1B4|E1B3|0902|E00F|0901|0953|0954|0951) E015)', + 'replace' => 'E072 E015 \\1', + ), + 339 => + array ( + 'match' => 'E073 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (E015|0947|E1A8|E1A7|E199|E1B2|E1B1|0946|E202|E201|E1A3|E1C6|E1C5|0945|E200|E1FF|0948|E1AA|E1A9|E19A|E1B4|E1B3|0902|E00F|0901|0953|0954|0951) E015)', + 'replace' => 'E073 E015 \\1', + ), + 340 => + array ( + 'match' => 'E074 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (E015|0947|E1A8|E1A7|E199|E1B2|E1B1|0946|E202|E201|E1A3|E1C6|E1C5|0945|E200|E1FF|0948|E1AA|E1A9|E19A|E1B4|E1B3|0902|E00F|0901|0953|0954|0951) E015)', + 'replace' => 'E074 E015 \\1', + ), + 341 => + array ( + 'match' => 'E078 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (E015|0947|E1A8|E1A7|E199|E1B2|E1B1|0946|E202|E201|E1A3|E1C6|E1C5|0945|E200|E1FF|0948|E1AA|E1A9|E19A|E1B4|E1B3|0902|E00F|0901|0953|0954|0951) E015)', + 'replace' => 'E078 E015 \\1', + ), + 342 => + array ( + 'match' => 'E0FB ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (E015|0947|E1A8|E1A7|E199|E1B2|E1B1|0946|E202|E201|E1A3|E1C6|E1C5|0945|E200|E1FF|0948|E1AA|E1A9|E19A|E1B4|E1B3|0902|E00F|0901|0953|0954|0951) E015)', + 'replace' => 'E0FB E015 \\1', + ), + 343 => + array ( + 'match' => 'E101 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (E015|0947|E1A8|E1A7|E199|E1B2|E1B1|0946|E202|E201|E1A3|E1C6|E1C5|0945|E200|E1FF|0948|E1AA|E1A9|E19A|E1B4|E1B3|0902|E00F|0901|0953|0954|0951) E015)', + 'replace' => 'E101 E015 \\1', + ), + 344 => + array ( + 'match' => 'E102 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (E015|0947|E1A8|E1A7|E199|E1B2|E1B1|0946|E202|E201|E1A3|E1C6|E1C5|0945|E200|E1FF|0948|E1AA|E1A9|E19A|E1B4|E1B3|0902|E00F|0901|0953|0954|0951) E015)', + 'replace' => 'E102 E015 \\1', + ), + 345 => + array ( + 'match' => 'E103 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (E015|0947|E1A8|E1A7|E199|E1B2|E1B1|0946|E202|E201|E1A3|E1C6|E1C5|0945|E200|E1FF|0948|E1AA|E1A9|E19A|E1B4|E1B3|0902|E00F|0901|0953|0954|0951) E015)', + 'replace' => 'E103 E015 \\1', + ), + 346 => + array ( + 'match' => 'E104 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (E015|0947|E1A8|E1A7|E199|E1B2|E1B1|0946|E202|E201|E1A3|E1C6|E1C5|0945|E200|E1FF|0948|E1AA|E1A9|E19A|E1B4|E1B3|0902|E00F|0901|0953|0954|0951) E015)', + 'replace' => 'E104 E015 \\1', + ), + 347 => + array ( + 'match' => 'E108 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (E015|0947|E1A8|E1A7|E199|E1B2|E1B1|0946|E202|E201|E1A3|E1C6|E1C5|0945|E200|E1FF|0948|E1AA|E1A9|E19A|E1B4|E1B3|0902|E00F|0901|0953|0954|0951) E015)', + 'replace' => 'E108 E015 \\1', + ), + 348 => + array ( + 'match' => 'E047 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (0941|0942|0943|0944|0952|E013) E015)', + 'replace' => 'E047 E015 \\1', + ), + 349 => + array ( + 'match' => 'E04D ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (0941|0942|0943|0944|0952|E013) E015)', + 'replace' => 'E04D E015 \\1', + ), + 350 => + array ( + 'match' => 'E04E ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (0941|0942|0943|0944|0952|E013) E015)', + 'replace' => 'E04E E015 \\1', + ), + 351 => + array ( + 'match' => 'E04F ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (0941|0942|0943|0944|0952|E013) E015)', + 'replace' => 'E04F E015 \\1', + ), + 352 => + array ( + 'match' => 'E050 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (0941|0942|0943|0944|0952|E013) E015)', + 'replace' => 'E050 E015 \\1', + ), + 353 => + array ( + 'match' => 'E054 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (0941|0942|0943|0944|0952|E013) E015)', + 'replace' => 'E054 E015 \\1', + ), + 354 => + array ( + 'match' => 'E06B ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (0941|0942|0943|0944|0952|E013) E015)', + 'replace' => 'E06B E015 \\1', + ), + 355 => + array ( + 'match' => 'E071 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (0941|0942|0943|0944|0952|E013) E015)', + 'replace' => 'E071 E015 \\1', + ), + 356 => + array ( + 'match' => 'E072 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (0941|0942|0943|0944|0952|E013) E015)', + 'replace' => 'E072 E015 \\1', + ), + 357 => + array ( + 'match' => 'E073 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (0941|0942|0943|0944|0952|E013) E015)', + 'replace' => 'E073 E015 \\1', + ), + 358 => + array ( + 'match' => 'E074 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (0941|0942|0943|0944|0952|E013) E015)', + 'replace' => 'E074 E015 \\1', + ), + 359 => + array ( + 'match' => 'E078 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (0941|0942|0943|0944|0952|E013) E015)', + 'replace' => 'E078 E015 \\1', + ), + 360 => + array ( + 'match' => 'E0FB ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (0941|0942|0943|0944|0952|E013) E015)', + 'replace' => 'E0FB E015 \\1', + ), + 361 => + array ( + 'match' => 'E101 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (0941|0942|0943|0944|0952|E013) E015)', + 'replace' => 'E101 E015 \\1', + ), + 362 => + array ( + 'match' => 'E102 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (0941|0942|0943|0944|0952|E013) E015)', + 'replace' => 'E102 E015 \\1', + ), + 363 => + array ( + 'match' => 'E103 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (0941|0942|0943|0944|0952|E013) E015)', + 'replace' => 'E103 E015 \\1', + ), + 364 => + array ( + 'match' => 'E104 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (0941|0942|0943|0944|0952|E013) E015)', + 'replace' => 'E104 E015 \\1', + ), + 365 => + array ( + 'match' => 'E108 ((0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029) (0941|0942|0943|0944|0952|E013) E015)', + 'replace' => 'E108 E015 \\1', + ), + 366 => + array ( + 'match' => '200D E00E', + 'replace' => '094D', + ), + 367 => + array ( + 'match' => 'E00C', + 'replace' => '094D', + ), + 368 => + array ( + 'match' => 'E00E', + 'replace' => '094D', + ), + 369 => + array ( + 'match' => 'E043 200D', + 'replace' => 'E043', + ), + 370 => + array ( + 'match' => 'E044 200D', + 'replace' => 'E044', + ), + 371 => + array ( + 'match' => 'E045 200D', + 'replace' => 'E045', + ), + 372 => + array ( + 'match' => 'E046 200D', + 'replace' => 'E046', + ), + 373 => + array ( + 'match' => 'E047 200D', + 'replace' => 'E047', + ), + 374 => + array ( + 'match' => 'E048 200D', + 'replace' => 'E048', + ), + 375 => + array ( + 'match' => 'E049 200D', + 'replace' => 'E049', + ), + 376 => + array ( + 'match' => 'E04A 200D', + 'replace' => 'E04A', + ), + 377 => + array ( + 'match' => 'E04B 200D', + 'replace' => 'E04B', + ), + 378 => + array ( + 'match' => 'E04C 200D', + 'replace' => 'E04C', + ), + 379 => + array ( + 'match' => 'E04D 200D', + 'replace' => 'E04D', + ), + 380 => + array ( + 'match' => 'E04E 200D', + 'replace' => 'E04E', + ), + 381 => + array ( + 'match' => 'E04F 200D', + 'replace' => 'E04F', + ), + 382 => + array ( + 'match' => 'E050 200D', + 'replace' => 'E050', + ), + 383 => + array ( + 'match' => 'E051 200D', + 'replace' => 'E051', + ), + 384 => + array ( + 'match' => 'E052 200D', + 'replace' => 'E052', + ), + 385 => + array ( + 'match' => 'E053 200D', + 'replace' => 'E053', + ), + 386 => + array ( + 'match' => 'E054 200D', + 'replace' => 'E054', + ), + 387 => + array ( + 'match' => 'E055 200D', + 'replace' => 'E055', + ), + 388 => + array ( + 'match' => 'E056 200D', + 'replace' => 'E056', + ), + 389 => + array ( + 'match' => 'E057 200D', + 'replace' => 'E057', + ), + 390 => + array ( + 'match' => 'E058 200D', + 'replace' => 'E058', + ), + 391 => + array ( + 'match' => 'E059 200D', + 'replace' => 'E059', + ), + 392 => + array ( + 'match' => 'E05A 200D', + 'replace' => 'E05A', + ), + 393 => + array ( + 'match' => 'E05B 200D', + 'replace' => 'E05B', + ), + 394 => + array ( + 'match' => 'E05C 200D', + 'replace' => 'E05C', + ), + 395 => + array ( + 'match' => 'E05D 200D', + 'replace' => 'E05D', + ), + 396 => + array ( + 'match' => 'E05E 200D', + 'replace' => 'E05E', + ), + 397 => + array ( + 'match' => 'E05F 200D', + 'replace' => 'E05F', + ), + 398 => + array ( + 'match' => 'E060 200D', + 'replace' => 'E060', + ), + 399 => + array ( + 'match' => 'E061 200D', + 'replace' => 'E061', + ), + 400 => + array ( + 'match' => 'E062 200D', + 'replace' => 'E062', + ), + 401 => + array ( + 'match' => 'E063 200D', + 'replace' => 'E063', + ), + 402 => + array ( + 'match' => 'E064 200D', + 'replace' => 'E064', + ), + 403 => + array ( + 'match' => 'E065 200D', + 'replace' => 'E065', + ), + 404 => + array ( + 'match' => 'E066 200D', + 'replace' => 'E066', + ), + 405 => + array ( + 'match' => 'E067 200D', + 'replace' => 'E067', + ), + 406 => + array ( + 'match' => 'E068 200D', + 'replace' => 'E068', + ), + 407 => + array ( + 'match' => 'E069 200D', + 'replace' => 'E069', + ), + 408 => + array ( + 'match' => 'E06A 200D', + 'replace' => 'E06A', + ), + 409 => + array ( + 'match' => 'E06B 200D', + 'replace' => 'E06B', + ), + 410 => + array ( + 'match' => 'E06C 200D', + 'replace' => 'E06C', + ), + 411 => + array ( + 'match' => 'E06D 200D', + 'replace' => 'E06D', + ), + 412 => + array ( + 'match' => 'E06E 200D', + 'replace' => 'E06E', + ), + 413 => + array ( + 'match' => 'E06F 200D', + 'replace' => 'E06F', + ), + 414 => + array ( + 'match' => 'E070 200D', + 'replace' => 'E070', + ), + 415 => + array ( + 'match' => 'E071 200D', + 'replace' => 'E071', + ), + 416 => + array ( + 'match' => 'E072 200D', + 'replace' => 'E072', + ), + 417 => + array ( + 'match' => 'E073 200D', + 'replace' => 'E073', + ), + 418 => + array ( + 'match' => 'E074 200D', + 'replace' => 'E074', + ), + 419 => + array ( + 'match' => 'E075 200D', + 'replace' => 'E075', + ), + 420 => + array ( + 'match' => 'E076 200D', + 'replace' => 'E076', + ), + 421 => + array ( + 'match' => 'E077 200D', + 'replace' => 'E077', + ), + 422 => + array ( + 'match' => 'E078 200D', + 'replace' => 'E078', + ), + 423 => + array ( + 'match' => 'E079 200D', + 'replace' => 'E079', + ), + 424 => + array ( + 'match' => 'E07A 200D', + 'replace' => 'E07A', + ), + 425 => + array ( + 'match' => 'E07B 200D', + 'replace' => 'E07B', + ), + 426 => + array ( + 'match' => 'E07C 200D', + 'replace' => 'E07C', + ), + 427 => + array ( + 'match' => 'E07D 200D', + 'replace' => 'E07D', + ), + 428 => + array ( + 'match' => 'E07E 200D', + 'replace' => 'E07E', + ), + 429 => + array ( + 'match' => 'E07F 200D', + 'replace' => 'E07F', + ), + 430 => + array ( + 'match' => 'E080 200D', + 'replace' => 'E080', + ), + 431 => + array ( + 'match' => 'E081 200D', + 'replace' => 'E081', + ), + 432 => + array ( + 'match' => 'E082 200D', + 'replace' => 'E082', + ), + 433 => + array ( + 'match' => 'E083 200D', + 'replace' => 'E083', + ), + 434 => + array ( + 'match' => 'E084 200D', + 'replace' => 'E084', + ), + 435 => + array ( + 'match' => 'E085 200D', + 'replace' => 'E085', + ), + 436 => + array ( + 'match' => 'E086 200D', + 'replace' => 'E086', + ), + 437 => + array ( + 'match' => 'E087 200D', + 'replace' => 'E087', + ), + 438 => + array ( + 'match' => 'E088 200D', + 'replace' => 'E088', + ), + 439 => + array ( + 'match' => 'E089 200D', + 'replace' => 'E089', + ), + 440 => + array ( + 'match' => 'E08A 200D', + 'replace' => 'E08A', + ), + 441 => + array ( + 'match' => 'E0D3 200D', + 'replace' => 'E0D3', + ), + 442 => + array ( + 'match' => 'E0D4 200D', + 'replace' => 'E0D4', + ), + 443 => + array ( + 'match' => 'E0D5 200D', + 'replace' => 'E0D5', + ), + 444 => + array ( + 'match' => 'E0D6 200D', + 'replace' => 'E0D6', + ), + 445 => + array ( + 'match' => 'E0D7 200D', + 'replace' => 'E0D7', + ), + 446 => + array ( + 'match' => 'E0D8 200D', + 'replace' => 'E0D8', + ), + 447 => + array ( + 'match' => 'E0D9 200D', + 'replace' => 'E0D9', + ), + 448 => + array ( + 'match' => 'E0DA 200D', + 'replace' => 'E0DA', + ), + 449 => + array ( + 'match' => 'E0DB 200D', + 'replace' => 'E0DB', + ), + 450 => + array ( + 'match' => 'E0DC 200D', + 'replace' => 'E0DC', + ), + 451 => + array ( + 'match' => 'E0DD 200D', + 'replace' => 'E0DD', + ), + 452 => + array ( + 'match' => 'E0DE 200D', + 'replace' => 'E0DE', + ), + 453 => + array ( + 'match' => 'E0DF 200D', + 'replace' => 'E0DF', + ), + 454 => + array ( + 'match' => 'E0E0 200D', + 'replace' => 'E0E0', + ), + 455 => + array ( + 'match' => 'E0E1 200D', + 'replace' => 'E0E1', + ), + 456 => + array ( + 'match' => 'E0E2 200D', + 'replace' => 'E0E2', + ), + 457 => + array ( + 'match' => 'E0E3 200D', + 'replace' => 'E0E3', + ), + 458 => + array ( + 'match' => 'E0E4 200D', + 'replace' => 'E0E4', + ), + 459 => + array ( + 'match' => 'E0E5 200D', + 'replace' => 'E0E5', + ), + 460 => + array ( + 'match' => 'E0E6 200D', + 'replace' => 'E0E6', + ), + 461 => + array ( + 'match' => 'E0E7 200D', + 'replace' => 'E0E7', + ), + 462 => + array ( + 'match' => 'E0E8 200D', + 'replace' => 'E0E8', + ), + 463 => + array ( + 'match' => 'E0E9 200D', + 'replace' => 'E0E9', + ), + 464 => + array ( + 'match' => 'E0EA 200D', + 'replace' => 'E0EA', + ), + 465 => + array ( + 'match' => 'E0EB 200D', + 'replace' => 'E0EB', + ), + 466 => + array ( + 'match' => 'E0EC 200D', + 'replace' => 'E0EC', + ), + 467 => + array ( + 'match' => 'E0ED 200D', + 'replace' => 'E0ED', + ), + 468 => + array ( + 'match' => 'E0EE 200D', + 'replace' => 'E0EE', + ), + 469 => + array ( + 'match' => 'E0EF 200D', + 'replace' => 'E0EF', + ), + 470 => + array ( + 'match' => 'E0F0 200D', + 'replace' => 'E0F0', + ), + 471 => + array ( + 'match' => 'E0F1 200D', + 'replace' => 'E0F1', + ), + 472 => + array ( + 'match' => 'E0F2 200D', + 'replace' => 'E0F2', + ), + 473 => + array ( + 'match' => 'E0F3 200D', + 'replace' => 'E0F3', + ), + 474 => + array ( + 'match' => 'E0F4 200D', + 'replace' => 'E0F4', + ), + 475 => + array ( + 'match' => 'E0F5 200D', + 'replace' => 'E0F5', + ), + 476 => + array ( + 'match' => 'E0F6 200D', + 'replace' => 'E0F6', + ), + 477 => + array ( + 'match' => 'E0F7 200D', + 'replace' => 'E0F7', + ), + 478 => + array ( + 'match' => 'E0F8 200D', + 'replace' => 'E0F8', + ), + 479 => + array ( + 'match' => 'E0F9 200D', + 'replace' => 'E0F9', + ), + 480 => + array ( + 'match' => 'E0FA 200D', + 'replace' => 'E0FA', + ), + 481 => + array ( + 'match' => 'E0FB 200D', + 'replace' => 'E0FB', + ), + 482 => + array ( + 'match' => 'E0FC 200D', + 'replace' => 'E0FC', + ), + 483 => + array ( + 'match' => 'E0FD 200D', + 'replace' => 'E0FD', + ), + 484 => + array ( + 'match' => 'E0FE 200D', + 'replace' => 'E0FE', + ), + 485 => + array ( + 'match' => 'E0FF 200D', + 'replace' => 'E0FF', + ), + 486 => + array ( + 'match' => 'E100 200D', + 'replace' => 'E100', + ), + 487 => + array ( + 'match' => 'E101 200D', + 'replace' => 'E101', + ), + 488 => + array ( + 'match' => 'E102 200D', + 'replace' => 'E102', + ), + 489 => + array ( + 'match' => 'E103 200D', + 'replace' => 'E103', + ), + 490 => + array ( + 'match' => 'E104 200D', + 'replace' => 'E104', + ), + 491 => + array ( + 'match' => 'E105 200D', + 'replace' => 'E105', + ), + 492 => + array ( + 'match' => 'E106 200D', + 'replace' => 'E106', + ), + 493 => + array ( + 'match' => 'E107 200D', + 'replace' => 'E107', + ), + 494 => + array ( + 'match' => 'E108 200D', + 'replace' => 'E108', + ), + 495 => + array ( + 'match' => 'E109 200D', + 'replace' => 'E109', + ), + 496 => + array ( + 'match' => 'E10A 200D', + 'replace' => 'E10A', + ), + 497 => + array ( + 'match' => 'E10B 200D', + 'replace' => 'E10B', + ), + 498 => + array ( + 'match' => 'E10C 200D', + 'replace' => 'E10C', + ), + 499 => + array ( + 'match' => 'E10D 200D', + 'replace' => 'E10D', + ), + 500 => + array ( + 'match' => 'E10E 200D', + 'replace' => 'E10E', + ), + 501 => + array ( + 'match' => 'E10F 200D', + 'replace' => 'E10F', + ), + 502 => + array ( + 'match' => 'E110 200D', + 'replace' => 'E110', + ), + 503 => + array ( + 'match' => 'E111 200D', + 'replace' => 'E111', + ), + 504 => + array ( + 'match' => 'E112 200D', + 'replace' => 'E112', + ), + 505 => + array ( + 'match' => 'E113 200D', + 'replace' => 'E113', + ), + 506 => + array ( + 'match' => 'E114 200D', + 'replace' => 'E114', + ), + 507 => + array ( + 'match' => 'E115 200D', + 'replace' => 'E115', + ), + 508 => + array ( + 'match' => 'E116 200D', + 'replace' => 'E116', + ), + 509 => + array ( + 'match' => 'E117 200D', + 'replace' => 'E117', + ), + 510 => + array ( + 'match' => 'E118 200D', + 'replace' => 'E118', + ), + 511 => + array ( + 'match' => 'E119 200D', + 'replace' => 'E119', + ), + 512 => + array ( + 'match' => 'E11A 200D', + 'replace' => 'E11A', + ), + 513 => + array ( + 'match' => 'E13D 200D', + 'replace' => 'E13D', + ), + 514 => + array ( + 'match' => 'E13E 200D', + 'replace' => 'E13E', + ), + 515 => + array ( + 'match' => 'E13F 200D', + 'replace' => 'E13F', + ), + 516 => + array ( + 'match' => 'E140 200D', + 'replace' => 'E140', + ), + 517 => + array ( + 'match' => 'E141 200D', + 'replace' => 'E141', + ), + 518 => + array ( + 'match' => 'E142 200D', + 'replace' => 'E142', + ), + 519 => + array ( + 'match' => 'E143 200D', + 'replace' => 'E143', + ), + 520 => + array ( + 'match' => 'E144 200D', + 'replace' => 'E144', + ), + 521 => + array ( + 'match' => 'E145 200D', + 'replace' => 'E145', + ), + 522 => + array ( + 'match' => '200D E013', + 'replace' => 'E013', + ), + 523 => + array ( + 'match' => '200D', + 'replace' => '200B', + ), + 524 => + array ( + 'match' => '200C', + 'replace' => '200B', + ), + 525 => + array ( + 'match' => '(093F) E047', + 'replace' => '\\1 E047 093F', + ), + 526 => + array ( + 'match' => '(093F) E04D', + 'replace' => '\\1 E04D 093F', + ), + 527 => + array ( + 'match' => '(093F) E04E', + 'replace' => '\\1 E04E 093F', + ), + 528 => + array ( + 'match' => '(093F) E04F', + 'replace' => '\\1 E04F 093F', + ), + 529 => + array ( + 'match' => '(093F) E050', + 'replace' => '\\1 E050 093F', + ), + 530 => + array ( + 'match' => '(093F) E054', + 'replace' => '\\1 E054 093F', + ), + 531 => + array ( + 'match' => '(093F) E06B', + 'replace' => '\\1 E06B 093F', + ), + 532 => + array ( + 'match' => '(093F) E071', + 'replace' => '\\1 E071 093F', + ), + 533 => + array ( + 'match' => '(093F) E072', + 'replace' => '\\1 E072 093F', + ), + 534 => + array ( + 'match' => '(093F) E073', + 'replace' => '\\1 E073 093F', + ), + 535 => + array ( + 'match' => '(093F) E074', + 'replace' => '\\1 E074 093F', + ), + 536 => + array ( + 'match' => '(093F) E078', + 'replace' => '\\1 E078 093F', + ), + 537 => + array ( + 'match' => '(093F) E0FB', + 'replace' => '\\1 E0FB 093F', + ), + 538 => + array ( + 'match' => '(093F) E101', + 'replace' => '\\1 E101 093F', + ), + 539 => + array ( + 'match' => '(093F) E102', + 'replace' => '\\1 E102 093F', + ), + 540 => + array ( + 'match' => '(093F) E103', + 'replace' => '\\1 E103 093F', + ), + 541 => + array ( + 'match' => '(093F) E104', + 'replace' => '\\1 E104 093F', + ), + 542 => + array ( + 'match' => '(093F) E108', + 'replace' => '\\1 E108 093F', + ), + 543 => + array ( + 'match' => '093F E047 (093F)', + 'replace' => 'E047 \\1', + ), + 544 => + array ( + 'match' => '093F E04D (093F)', + 'replace' => 'E04D \\1', + ), + 545 => + array ( + 'match' => '093F E04E (093F)', + 'replace' => 'E04E \\1', + ), + 546 => + array ( + 'match' => '093F E04F (093F)', + 'replace' => 'E04F \\1', + ), + 547 => + array ( + 'match' => '093F E050 (093F)', + 'replace' => 'E050 \\1', + ), + 548 => + array ( + 'match' => '093F E054 (093F)', + 'replace' => 'E054 \\1', + ), + 549 => + array ( + 'match' => '093F E06B (093F)', + 'replace' => 'E06B \\1', + ), + 550 => + array ( + 'match' => '093F E071 (093F)', + 'replace' => 'E071 \\1', + ), + 551 => + array ( + 'match' => '093F E072 (093F)', + 'replace' => 'E072 \\1', + ), + 552 => + array ( + 'match' => '093F E073 (093F)', + 'replace' => 'E073 \\1', + ), + 553 => + array ( + 'match' => '093F E074 (093F)', + 'replace' => 'E074 \\1', + ), + 554 => + array ( + 'match' => '093F E078 (093F)', + 'replace' => 'E078 \\1', + ), + 555 => + array ( + 'match' => '093F E0FB (093F)', + 'replace' => 'E0FB \\1', + ), + 556 => + array ( + 'match' => '093F E101 (093F)', + 'replace' => 'E101 \\1', + ), + 557 => + array ( + 'match' => '093F E102 (093F)', + 'replace' => 'E102 \\1', + ), + 558 => + array ( + 'match' => '093F E103 (093F)', + 'replace' => 'E103 \\1', + ), + 559 => + array ( + 'match' => '093F E104 (093F)', + 'replace' => 'E104 \\1', + ), + 560 => + array ( + 'match' => '093F E108 (093F)', + 'replace' => 'E108 \\1', + ), + 561 => + array ( + 'match' => '(E015) 0915 E015', + 'replace' => '\\1 0915', + ), + 562 => + array ( + 'match' => '(E015) 0916 E015', + 'replace' => '\\1 0916', + ), + 563 => + array ( + 'match' => '(E015) 0917 E015', + 'replace' => '\\1 0917', + ), + 564 => + array ( + 'match' => '(E015) 0918 E015', + 'replace' => '\\1 0918', + ), + 565 => + array ( + 'match' => '(E015) 0919 E015', + 'replace' => '\\1 0919', + ), + 566 => + array ( + 'match' => '(E015) 091A E015', + 'replace' => '\\1 091A', + ), + 567 => + array ( + 'match' => '(E015) 091B E015', + 'replace' => '\\1 091B', + ), + 568 => + array ( + 'match' => '(E015) 091C E015', + 'replace' => '\\1 091C', + ), + 569 => + array ( + 'match' => '(E015) 091D E015', + 'replace' => '\\1 091D', + ), + 570 => + array ( + 'match' => '(E015) 091E E015', + 'replace' => '\\1 091E', + ), + 571 => + array ( + 'match' => '(E015) 091F E015', + 'replace' => '\\1 091F', + ), + 572 => + array ( + 'match' => '(E015) 0920 E015', + 'replace' => '\\1 0920', + ), + 573 => + array ( + 'match' => '(E015) 0921 E015', + 'replace' => '\\1 0921', + ), + 574 => + array ( + 'match' => '(E015) 0922 E015', + 'replace' => '\\1 0922', + ), + 575 => + array ( + 'match' => '(E015) 0923 E015', + 'replace' => '\\1 0923', + ), + 576 => + array ( + 'match' => '(E015) 0924 E015', + 'replace' => '\\1 0924', + ), + 577 => + array ( + 'match' => '(E015) 0925 E015', + 'replace' => '\\1 0925', + ), + 578 => + array ( + 'match' => '(E015) 0926 E015', + 'replace' => '\\1 0926', + ), + 579 => + array ( + 'match' => '(E015) 0927 E015', + 'replace' => '\\1 0927', + ), + 580 => + array ( + 'match' => '(E015) 0928 E015', + 'replace' => '\\1 0928', + ), + 581 => + array ( + 'match' => '(E015) 092A E015', + 'replace' => '\\1 092A', + ), + 582 => + array ( + 'match' => '(E015) 092B E015', + 'replace' => '\\1 092B', + ), + 583 => + array ( + 'match' => '(E015) 092C E015', + 'replace' => '\\1 092C', + ), + 584 => + array ( + 'match' => '(E015) 092D E015', + 'replace' => '\\1 092D', + ), + 585 => + array ( + 'match' => '(E015) 092E E015', + 'replace' => '\\1 092E', + ), + 586 => + array ( + 'match' => '(E015) 092F E015', + 'replace' => '\\1 092F', + ), + 587 => + array ( + 'match' => '(E015) 0930 E015', + 'replace' => '\\1 0930', + ), + 588 => + array ( + 'match' => '(E015) 0932 E015', + 'replace' => '\\1 0932', + ), + 589 => + array ( + 'match' => '(E015) 0933 E015', + 'replace' => '\\1 0933', + ), + 590 => + array ( + 'match' => '(E015) 0935 E015', + 'replace' => '\\1 0935', + ), + 591 => + array ( + 'match' => '(E015) 0936 E015', + 'replace' => '\\1 0936', + ), + 592 => + array ( + 'match' => '(E015) 0937 E015', + 'replace' => '\\1 0937', + ), + 593 => + array ( + 'match' => '(E015) 0938 E015', + 'replace' => '\\1 0938', + ), + 594 => + array ( + 'match' => '(E015) 0939 E015', + 'replace' => '\\1 0939', + ), + 595 => + array ( + 'match' => '(E015) E028 E015', + 'replace' => '\\1 E028', + ), + 596 => + array ( + 'match' => '(E015) E029 E015', + 'replace' => '\\1 E029', + ), + 597 => + array ( + 'match' => '(E015) E015 E015', + 'replace' => '\\1 E015', + ), + 598 => + array ( + 'match' => '(E015) 0947 E015', + 'replace' => '\\1 0947', + ), + 599 => + array ( + 'match' => '(E015) E1A8 E015', + 'replace' => '\\1 E1A8', + ), + 600 => + array ( + 'match' => '(E015) E1A7 E015', + 'replace' => '\\1 E1A7', + ), + 601 => + array ( + 'match' => '(E015) E199 E015', + 'replace' => '\\1 E199', + ), + 602 => + array ( + 'match' => '(E015) E1B2 E015', + 'replace' => '\\1 E1B2', + ), + 603 => + array ( + 'match' => '(E015) E1B1 E015', + 'replace' => '\\1 E1B1', + ), + 604 => + array ( + 'match' => '(E015) 0946 E015', + 'replace' => '\\1 0946', + ), + 605 => + array ( + 'match' => '(E015) E202 E015', + 'replace' => '\\1 E202', + ), + 606 => + array ( + 'match' => '(E015) E201 E015', + 'replace' => '\\1 E201', + ), + 607 => + array ( + 'match' => '(E015) E1A3 E015', + 'replace' => '\\1 E1A3', + ), + 608 => + array ( + 'match' => '(E015) E1C6 E015', + 'replace' => '\\1 E1C6', + ), + 609 => + array ( + 'match' => '(E015) E1C5 E015', + 'replace' => '\\1 E1C5', + ), + 610 => + array ( + 'match' => '(E015) 0945 E015', + 'replace' => '\\1 0945', + ), + 611 => + array ( + 'match' => '(E015) E200 E015', + 'replace' => '\\1 E200', + ), + 612 => + array ( + 'match' => '(E015) E1FF E015', + 'replace' => '\\1 E1FF', + ), + 613 => + array ( + 'match' => '(E015) 0948 E015', + 'replace' => '\\1 0948', + ), + 614 => + array ( + 'match' => '(E015) E1AA E015', + 'replace' => '\\1 E1AA', + ), + 615 => + array ( + 'match' => '(E015) E1A9 E015', + 'replace' => '\\1 E1A9', + ), + 616 => + array ( + 'match' => '(E015) E19A E015', + 'replace' => '\\1 E19A', + ), + 617 => + array ( + 'match' => '(E015) E1B4 E015', + 'replace' => '\\1 E1B4', + ), + 618 => + array ( + 'match' => '(E015) E1B3 E015', + 'replace' => '\\1 E1B3', + ), + 619 => + array ( + 'match' => '(E015) 0902 E015', + 'replace' => '\\1 0902', + ), + 620 => + array ( + 'match' => '(E015) E00F E015', + 'replace' => '\\1 E00F', + ), + 621 => + array ( + 'match' => '(E015) 0901 E015', + 'replace' => '\\1 0901', + ), + 622 => + array ( + 'match' => '(E015) 0953 E015', + 'replace' => '\\1 0953', + ), + 623 => + array ( + 'match' => '(E015) 0954 E015', + 'replace' => '\\1 0954', + ), + 624 => + array ( + 'match' => '(E015) 0951 E015', + 'replace' => '\\1 0951', + ), + 625 => + array ( + 'match' => '(E015) 0941 E015', + 'replace' => '\\1 0941', + ), + 626 => + array ( + 'match' => '(E015) 0942 E015', + 'replace' => '\\1 0942', + ), + 627 => + array ( + 'match' => '(E015) 0943 E015', + 'replace' => '\\1 0943', + ), + 628 => + array ( + 'match' => '(E015) 0944 E015', + 'replace' => '\\1 0944', + ), + 629 => + array ( + 'match' => '(E015) 0952 E015', + 'replace' => '\\1 0952', + ), + 630 => + array ( + 'match' => '(E015) E013 E015', + 'replace' => '\\1 E013', + ), + 631 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0915 E015', + 'replace' => '\\1 0915', + ), + 632 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0916 E015', + 'replace' => '\\1 0916', + ), + 633 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0917 E015', + 'replace' => '\\1 0917', + ), + 634 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0918 E015', + 'replace' => '\\1 0918', + ), + 635 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0919 E015', + 'replace' => '\\1 0919', + ), + 636 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 091A E015', + 'replace' => '\\1 091A', + ), + 637 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 091B E015', + 'replace' => '\\1 091B', + ), + 638 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 091C E015', + 'replace' => '\\1 091C', + ), + 639 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 091D E015', + 'replace' => '\\1 091D', + ), + 640 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 091E E015', + 'replace' => '\\1 091E', + ), + 641 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 091F E015', + 'replace' => '\\1 091F', + ), + 642 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0920 E015', + 'replace' => '\\1 0920', + ), + 643 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0921 E015', + 'replace' => '\\1 0921', + ), + 644 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0922 E015', + 'replace' => '\\1 0922', + ), + 645 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0923 E015', + 'replace' => '\\1 0923', + ), + 646 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0924 E015', + 'replace' => '\\1 0924', + ), + 647 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0925 E015', + 'replace' => '\\1 0925', + ), + 648 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0926 E015', + 'replace' => '\\1 0926', + ), + 649 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0927 E015', + 'replace' => '\\1 0927', + ), + 650 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0928 E015', + 'replace' => '\\1 0928', + ), + 651 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 092A E015', + 'replace' => '\\1 092A', + ), + 652 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 092B E015', + 'replace' => '\\1 092B', + ), + 653 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 092C E015', + 'replace' => '\\1 092C', + ), + 654 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 092D E015', + 'replace' => '\\1 092D', + ), + 655 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 092E E015', + 'replace' => '\\1 092E', + ), + 656 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 092F E015', + 'replace' => '\\1 092F', + ), + 657 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0930 E015', + 'replace' => '\\1 0930', + ), + 658 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0932 E015', + 'replace' => '\\1 0932', + ), + 659 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0933 E015', + 'replace' => '\\1 0933', + ), + 660 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0935 E015', + 'replace' => '\\1 0935', + ), + 661 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0936 E015', + 'replace' => '\\1 0936', + ), + 662 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0937 E015', + 'replace' => '\\1 0937', + ), + 663 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0938 E015', + 'replace' => '\\1 0938', + ), + 664 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0939 E015', + 'replace' => '\\1 0939', + ), + 665 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) E028 E015', + 'replace' => '\\1 E028', + ), + 666 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) E029 E015', + 'replace' => '\\1 E029', + ), + 667 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) E015 E015', + 'replace' => '\\1 E015', + ), + 668 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0947 E015', + 'replace' => '\\1 0947', + ), + 669 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) E1A8 E015', + 'replace' => '\\1 E1A8', + ), + 670 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) E1A7 E015', + 'replace' => '\\1 E1A7', + ), + 671 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) E199 E015', + 'replace' => '\\1 E199', + ), + 672 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) E1B2 E015', + 'replace' => '\\1 E1B2', + ), + 673 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) E1B1 E015', + 'replace' => '\\1 E1B1', + ), + 674 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0946 E015', + 'replace' => '\\1 0946', + ), + 675 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) E202 E015', + 'replace' => '\\1 E202', + ), + 676 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) E201 E015', + 'replace' => '\\1 E201', + ), + 677 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) E1A3 E015', + 'replace' => '\\1 E1A3', + ), + 678 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) E1C6 E015', + 'replace' => '\\1 E1C6', + ), + 679 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) E1C5 E015', + 'replace' => '\\1 E1C5', + ), + 680 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0945 E015', + 'replace' => '\\1 0945', + ), + 681 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) E200 E015', + 'replace' => '\\1 E200', + ), + 682 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) E1FF E015', + 'replace' => '\\1 E1FF', + ), + 683 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0948 E015', + 'replace' => '\\1 0948', + ), + 684 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) E1AA E015', + 'replace' => '\\1 E1AA', + ), + 685 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) E1A9 E015', + 'replace' => '\\1 E1A9', + ), + 686 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) E19A E015', + 'replace' => '\\1 E19A', + ), + 687 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) E1B4 E015', + 'replace' => '\\1 E1B4', + ), + 688 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) E1B3 E015', + 'replace' => '\\1 E1B3', + ), + 689 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0902 E015', + 'replace' => '\\1 0902', + ), + 690 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) E00F E015', + 'replace' => '\\1 E00F', + ), + 691 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0901 E015', + 'replace' => '\\1 0901', + ), + 692 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0953 E015', + 'replace' => '\\1 0953', + ), + 693 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0954 E015', + 'replace' => '\\1 0954', + ), + 694 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0951 E015', + 'replace' => '\\1 0951', + ), + 695 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0941 E015', + 'replace' => '\\1 0941', + ), + 696 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0942 E015', + 'replace' => '\\1 0942', + ), + 697 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0943 E015', + 'replace' => '\\1 0943', + ), + 698 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0944 E015', + 'replace' => '\\1 0944', + ), + 699 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) 0952 E015', + 'replace' => '\\1 0952', + ), + 700 => + array ( + 'match' => '(E015 (0915|0916|0917|0918|0919|091A|091B|091C|091D|091E|091F|0920|0921|0922|0923|0924|0925|0926|0927|0928|092A|092B|092C|092D|092E|092F|0930|0932|0933|0935|0936|0937|0938|0939|E028|E029)) E013 E015', + 'replace' => '\\1 E013', + ), + 701 => + array ( + 'match' => '(093F) E015', + 'replace' => '\\1 E015 093F', + ), + 702 => + array ( + 'match' => '093F E015', + 'replace' => 'E015', + ), + 703 => + array ( + 'match' => '0915 0962', + 'replace' => 'E153', + ), + 704 => + array ( + 'match' => '0915 0963', + 'replace' => 'E154', + ), + 705 => + array ( + 'match' => 'E08F 0941', + 'replace' => 'E155', + ), + 706 => + array ( + 'match' => 'E08F 0942', + 'replace' => 'E156', + ), + 707 => + array ( + 'match' => 'E08F 0943', + 'replace' => 'E157', + ), + 708 => + array ( + 'match' => 'E08F 0944', + 'replace' => 'E158', + ), + 709 => + array ( + 'match' => 'E091 0941', + 'replace' => 'E159', + ), + 710 => + array ( + 'match' => 'E091 0942', + 'replace' => 'E15A', + ), + 711 => + array ( + 'match' => 'E091 0943', + 'replace' => 'E15B', + ), + 712 => + array ( + 'match' => 'E091 0944', + 'replace' => 'E15C', + ), + 713 => + array ( + 'match' => 'E095 0941', + 'replace' => 'E15D', + ), + 714 => + array ( + 'match' => 'E095 0942', + 'replace' => 'E15E', + ), + 715 => + array ( + 'match' => 'E095 0943', + 'replace' => 'E15F', + ), + 716 => + array ( + 'match' => 'E095 0944', + 'replace' => 'E160', + ), + 717 => + array ( + 'match' => 'E096 0941', + 'replace' => 'E161', + ), + 718 => + array ( + 'match' => 'E096 0942', + 'replace' => 'E162', + ), + 719 => + array ( + 'match' => 'E096 0943', + 'replace' => 'E163', + ), + 720 => + array ( + 'match' => 'E096 0944', + 'replace' => 'E164', + ), + 721 => + array ( + 'match' => 'E097 0941', + 'replace' => 'E165', + ), + 722 => + array ( + 'match' => 'E097 0942', + 'replace' => 'E166', + ), + 723 => + array ( + 'match' => 'E097 0943', + 'replace' => 'E167', + ), + 724 => + array ( + 'match' => 'E097 0944', + 'replace' => 'E168', + ), + 725 => + array ( + 'match' => 'E098 0941', + 'replace' => 'E169', + ), + 726 => + array ( + 'match' => 'E098 0942', + 'replace' => 'E16A', + ), + 727 => + array ( + 'match' => 'E098 0943', + 'replace' => 'E16B', + ), + 728 => + array ( + 'match' => 'E098 0944', + 'replace' => 'E16C', + ), + 729 => + array ( + 'match' => '0926 0943', + 'replace' => 'E16D', + ), + 730 => + array ( + 'match' => '092A 0962', + 'replace' => 'E16E', + ), + 731 => + array ( + 'match' => '092A 0963', + 'replace' => 'E16F', + ), + 732 => + array ( + 'match' => '0939 0943', + 'replace' => 'E172', + ), + 733 => + array ( + 'match' => '0939 0944', + 'replace' => 'E173', + ), + 734 => + array ( + 'match' => 'E0B3 0941', + 'replace' => 'E174', + ), + 735 => + array ( + 'match' => 'E0B3 0942', + 'replace' => 'E175', + ), + 736 => + array ( + 'match' => 'E0B3 0943', + 'replace' => 'E176', + ), + 737 => + array ( + 'match' => 'E0B3 0944', + 'replace' => 'E177', + ), + 738 => + array ( + 'match' => 'E0B5 0941', + 'replace' => 'E178', + ), + 739 => + array ( + 'match' => 'E0B5 0942', + 'replace' => 'E179', + ), + 740 => + array ( + 'match' => 'E0B5 0943', + 'replace' => 'E17A', + ), + 741 => + array ( + 'match' => 'E0B5 0944', + 'replace' => 'E17B', + ), + 742 => + array ( + 'match' => 'E0B9 0941', + 'replace' => 'E17C', + ), + 743 => + array ( + 'match' => 'E0B9 0942', + 'replace' => 'E17D', + ), + 744 => + array ( + 'match' => 'E0B9 0943', + 'replace' => 'E17E', + ), + 745 => + array ( + 'match' => 'E0B9 0944', + 'replace' => 'E17F', + ), + 746 => + array ( + 'match' => 'E0BA 0941', + 'replace' => 'E180', + ), + 747 => + array ( + 'match' => 'E0BA 0942', + 'replace' => 'E181', + ), + 748 => + array ( + 'match' => 'E0BA 0943', + 'replace' => 'E182', + ), + 749 => + array ( + 'match' => 'E0BA 0944', + 'replace' => 'E183', + ), + 750 => + array ( + 'match' => 'E0BB 0941', + 'replace' => 'E184', + ), + 751 => + array ( + 'match' => 'E0BB 0942', + 'replace' => 'E185', + ), + 752 => + array ( + 'match' => 'E0BB 0943', + 'replace' => 'E186', + ), + 753 => + array ( + 'match' => 'E0BB 0944', + 'replace' => 'E187', + ), + 754 => + array ( + 'match' => 'E0BC 0941', + 'replace' => 'E188', + ), + 755 => + array ( + 'match' => 'E0BC 0942', + 'replace' => 'E189', + ), + 756 => + array ( + 'match' => 'E0BC 0943', + 'replace' => 'E18A', + ), + 757 => + array ( + 'match' => 'E0BC 0944', + 'replace' => 'E18B', + ), + 758 => + array ( + 'match' => 'E131 0941', + 'replace' => 'E18C', + ), + 759 => + array ( + 'match' => 'E131 0942', + 'replace' => 'E18D', + ), + 760 => + array ( + 'match' => 'E131 0943', + 'replace' => 'E18E', + ), + 761 => + array ( + 'match' => 'E131 0944', + 'replace' => 'E18F', + ), + 762 => + array ( + 'match' => 'E132 0941', + 'replace' => 'E190', + ), + 763 => + array ( + 'match' => 'E132 0942', + 'replace' => 'E191', + ), + 764 => + array ( + 'match' => 'E132 0943', + 'replace' => 'E192', + ), + 765 => + array ( + 'match' => 'E132 0944', + 'replace' => 'E193', + ), + 766 => + array ( + 'match' => '((0930|0931|E0A5|E0C9)) 0941', + 'replace' => '\\1 E170', + ), + 767 => + array ( + 'match' => '((0930|0931|E0A5|E0C9)) 0942', + 'replace' => '\\1 E171', + ), + 768 => + array ( + 'match' => '0947 E015', + 'replace' => 'E199', + ), + 769 => + array ( + 'match' => '0948 E015', + 'replace' => 'E19A', + ), + 770 => + array ( + 'match' => '0940 E015', + 'replace' => 'E19B', + ), + 771 => + array ( + 'match' => 'E194 E015', + 'replace' => 'E19C', + ), + 772 => + array ( + 'match' => 'E195 E015', + 'replace' => 'E19D', + ), + 773 => + array ( + 'match' => 'E196 E015', + 'replace' => 'E19E', + ), + 774 => + array ( + 'match' => 'E197 E015', + 'replace' => 'E19F', + ), + 775 => + array ( + 'match' => 'E198 E015', + 'replace' => 'E1A0', + ), + 776 => + array ( + 'match' => '094B E015', + 'replace' => 'E1A1', + ), + 777 => + array ( + 'match' => '094C E015', + 'replace' => 'E1A2', + ), + 778 => + array ( + 'match' => '0946 E015', + 'replace' => 'E1A3', + ), + 779 => + array ( + 'match' => '094A E015', + 'replace' => 'E1A4', + ), + 780 => + array ( + 'match' => '0908 0901', + 'replace' => 'E1A5', + ), + 781 => + array ( + 'match' => '0908 0902', + 'replace' => 'E1A6', + ), + 782 => + array ( + 'match' => 'E12F 0901', + 'replace' => 'E1C9', + ), + 783 => + array ( + 'match' => 'E130 0901', + 'replace' => 'E1CA', + ), + 784 => + array ( + 'match' => '0945 0901', + 'replace' => 'E200', + ), + 785 => + array ( + 'match' => '0946 0901', + 'replace' => 'E202', + ), + 786 => + array ( + 'match' => '0947 0901', + 'replace' => 'E1A7', + ), + 787 => + array ( + 'match' => '0948 0901', + 'replace' => 'E1A9', + ), + 788 => + array ( + 'match' => '094B 0901', + 'replace' => 'E1AB', + ), + 789 => + array ( + 'match' => '094C 0901', + 'replace' => 'E1AD', + ), + 790 => + array ( + 'match' => '0945 0902', + 'replace' => 'E1FF', + ), + 791 => + array ( + 'match' => '0946 0902', + 'replace' => 'E201', + ), + 792 => + array ( + 'match' => '0947 0902', + 'replace' => 'E1A8', + ), + 793 => + array ( + 'match' => '0948 0902', + 'replace' => 'E1AA', + ), + 794 => + array ( + 'match' => '094B 0902', + 'replace' => 'E1AC', + ), + 795 => + array ( + 'match' => '094C 0902', + 'replace' => 'E1AE', + ), + 796 => + array ( + 'match' => 'E015 0902 0901', + 'replace' => 'E1B0 E1AF', + ), + 797 => + array ( + 'match' => 'E199 0902 0901', + 'replace' => 'E1B2 E1B1', + ), + 798 => + array ( + 'match' => 'E19A 0902 0901', + 'replace' => 'E1B4 E1B3', + ), + 799 => + array ( + 'match' => 'E1A1 0902 0901', + 'replace' => 'E1C2 E1C1', + ), + 800 => + array ( + 'match' => 'E1A3 0902 0901', + 'replace' => 'E1C6 E1C5', + ), + 801 => + array ( + 'match' => 'E1A4 0902 0901', + 'replace' => 'E1C8 E1C7', + ), + 802 => + array ( + 'match' => 'E1A2 0902 0901', + 'replace' => 'E1C4 E1C3', + ), + 803 => + array ( + 'match' => 'E19B 0901', + 'replace' => 'E1B5', + ), + 804 => + array ( + 'match' => 'E19C 0901', + 'replace' => 'E1B6', + ), + 805 => + array ( + 'match' => 'E19D 0901', + 'replace' => 'E1B7', + ), + 806 => + array ( + 'match' => 'E19E 0901', + 'replace' => 'E1B8', + ), + 807 => + array ( + 'match' => 'E19F 0901', + 'replace' => 'E1B9', + ), + 808 => + array ( + 'match' => 'E1A0 0901', + 'replace' => 'E1BA', + ), + 809 => + array ( + 'match' => 'E19B 0902', + 'replace' => 'E1BB', + ), + 810 => + array ( + 'match' => 'E19C 0902', + 'replace' => 'E1BC', + ), + 811 => + array ( + 'match' => 'E19D 0902', + 'replace' => 'E1BD', + ), + 812 => + array ( + 'match' => 'E19E 0902', + 'replace' => 'E1BE', + ), + 813 => + array ( + 'match' => 'E19F 0902', + 'replace' => 'E1BF', + ), + 814 => + array ( + 'match' => 'E1A0 0902', + 'replace' => 'E1C0', + ), + 815 => + array ( + 'match' => '((0908|E01B|090D|090E|E01F|0910|E021|0914|E025|E016|E017|0940|E194|E195|E196|E197|E198|E19B|E19C|E19D|E19E|E19F|E1A0|0949|094A|E1A4|094B|E1A1|094C|E1A2|E015|0947|E1A8|E1A7|E199|E1B2|E1B1|0946|E202|E201|E1A3|E1C6|E1C5|0945|E200|E1FF|0948|E1AA|E1A9|E19A|E1B4|E1B3|0902|E00F|0901|0953|0954|0951)) 0901', + 'replace' => '\\1 E00F', + ), + 816 => + array ( + 'match' => '093F ((0930|0931))', + 'replace' => 'E14B \\1', + ), + 817 => + array ( + 'match' => '093F ((0915|0958|E08B|E0AF|0919|E02B|E08F|E0B3|091F|E030|E095|E0B9|0920|E031|E096|E0BA|0921|095C|E097|E0BB|0922|095D|E098|E0BC|0926|E035|E09C|E0C0|092B|095E|E0A0|E0C4|0939|E040|E0AC|E0D0|E120|E122|E124|E125|E129|E134|E139))', + 'replace' => 'E14C \\1', + ), + 818 => + array ( + 'match' => '093F ((0924|E033|E09A|E0BE|092A|E037|E09F|E0C3|092C|E038|E0A1|E0C5|0935|E03C|E0A8|E0CC|0937|E03E|E0AA|E0CE|E11B|E11E|E121|E123|E126|E12F|E130|E131|E132|E137|E138))', + 'replace' => 'E14D \\1', + ), + 819 => + array ( + 'match' => '093F ((0917|095A|E08D|E0B1|0918|E02A|E08E|E0B2|091A|E02C|E090|E0B4|091B|E02D|E091|E0B5|091E|E02F|E094|E0B8|0925|E034|0927|E036|E09D|E0C1|0928|0929|E09E|E0C2|092D|E039|E0A2|E0C6|092E|E03A|E0A3|E0C7|092F|095F|E0A4|E0C8|0932|E03B|E0A6|E0CA|0933|0934|E0A7|E0CB|0936|E03D|E0A9|E0CD|0938|E03F|E0AB|E0CF|E127|E128|E12A|E135|E136))', + 'replace' => 'E14E \\1', + ), + 820 => + array ( + 'match' => '((0940|094A|094B|094C|0946|0947|0948)) E015', + 'replace' => '\\1 E014', + ), + 821 => + array ( + 'match' => '((0919|E02B|E08F|E0B3|091F|E030|E095|E0B9|0922|095D|E098|E0BC|0926|E035|E09C|E0C0|0930|0931|0932|E03B|E0A6|E0CA|0939|E040|E0AC|E0D0)) 0940', + 'replace' => '\\1 E194', + ), + 822 => + array ( + 'match' => '((0919|E02B|E08F|E0B3|091F|E030|E095|E0B9|0922|095D|E098|E0BC|0926|E035|E09C|E0C0|0930|0931|0932|E03B|E0A6|E0CA|0939|E040|E0AC|E0D0)) E19B', + 'replace' => '\\1 E19C', + ), + 823 => + array ( + 'match' => '((0919|E02B|E08F|E0B3|091F|E030|E095|E0B9|0922|095D|E098|E0BC|0926|E035|E09C|E0C0|0930|0931|0932|E03B|E0A6|E0CA|0939|E040|E0AC|E0D0)) E1B5', + 'replace' => '\\1 E1B6', + ), + 824 => + array ( + 'match' => '((0919|E02B|E08F|E0B3|091F|E030|E095|E0B9|0922|095D|E098|E0BC|0926|E035|E09C|E0C0|0930|0931|0932|E03B|E0A6|E0CA|0939|E040|E0AC|E0D0)) E1BB', + 'replace' => '\\1 E1BC', + ), + 825 => + array ( + 'match' => '((091B|E02D|E091|E0B5|0920|E031|E096|E0BA)) 0940', + 'replace' => '\\1 E195', + ), + 826 => + array ( + 'match' => '((091B|E02D|E091|E0B5|0920|E031|E096|E0BA)) E19B', + 'replace' => '\\1 E19D', + ), + 827 => + array ( + 'match' => '((091B|E02D|E091|E0B5|0920|E031|E096|E0BA)) E1B5', + 'replace' => '\\1 E1B7', + ), + 828 => + array ( + 'match' => '((091B|E02D|E091|E0B5|0920|E031|E096|E0BA)) E1BB', + 'replace' => '\\1 E1BD', + ), + 829 => + array ( + 'match' => '((0915|0958|E08B|E0AF|092B|095E|E0A0|E0C4)) 0940', + 'replace' => '\\1 E198', + ), + 830 => + array ( + 'match' => '((0915|0958|E08B|E0AF|092B|095E|E0A0|E0C4)) E19B', + 'replace' => '\\1 E1A0', + ), + 831 => + array ( + 'match' => '((0915|0958|E08B|E0AF|092B|095E|E0A0|E0C4)) E1B5', + 'replace' => '\\1 E1BA', + ), + 832 => + array ( + 'match' => '((0915|0958|E08B|E0AF|092B|095E|E0A0|E0C4)) E1BB', + 'replace' => '\\1 E1C0', + ), +); +?> \ No newline at end of file diff --git a/application/third_party/mpdf/includes/ind_kn_1_001.volt.php b/application/third_party/mpdf/includes/ind_kn_1_001.volt.php new file mode 100644 index 0000000..2e2589b --- /dev/null +++ b/application/third_party/mpdf/includes/ind_kn_1_001.volt.php @@ -0,0 +1,2994 @@ +<?php + $volt = array ( + 0 => + array ( + 'match' => '0CCD 200C', + 'replace' => 'E0AD', + ), + 1 => + array ( + 'match' => '200D 0CCD', + 'replace' => 'E0AC', + ), + 2 => + array ( + 'match' => '0CC6 0CC2', + 'replace' => '0CCA', + ), + 3 => + array ( + 'match' => '0C95 0CCD 0CB7', + 'replace' => 'E07D', + ), + 4 => + array ( + 'match' => '0C9C 0CCD 0C9E', + 'replace' => 'E07E', + ), + 5 => + array ( + 'match' => '0CB0 0CCD', + 'replace' => 'E00B', + ), + 6 => + array ( + 'match' => '((0C95|0C96|0C97|0C98|0C99|0C9A|0C9B|0C9C|0C9D|0C9E|0C9F|0CA0|0CA1|0CA2|0CA3|0CA4|0CA5|0CA6|0CA7|0CA8|0CAA|0CAB|0CAC|0CAD|0CAE|0CAF|0CB0|0CB1|0CB2|0CB3|0CB5|0CB6|0CB7|0CB8|0CB9|E07D|E07E|E0A3)) 0CCD', + 'replace' => '\\1 E0AC', + ), + 7 => + array ( + 'match' => '((0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) 0CCD', + 'replace' => '\\1 E0AC', + ), + 8 => + array ( + 'match' => '(0CBC) 0CCD', + 'replace' => '\\1 E0AC', + ), + 9 => + array ( + 'match' => '(0020) 0CCD', + 'replace' => '\\1 E0AC', + ), + 10 => + array ( + 'match' => '(25CC) 0CCD', + 'replace' => '\\1 E0AC', + ), + 11 => + array ( + 'match' => '0C95 0CBC', + 'replace' => 'E0E6', + ), + 12 => + array ( + 'match' => '0C96 0CBC', + 'replace' => 'E0E7', + ), + 13 => + array ( + 'match' => '0C97 0CBC', + 'replace' => 'E172', + ), + 14 => + array ( + 'match' => '0C98 0CBC', + 'replace' => 'E173', + ), + 15 => + array ( + 'match' => '0C99 0CBC', + 'replace' => 'E174', + ), + 16 => + array ( + 'match' => '0C9A 0CBC', + 'replace' => 'E175', + ), + 17 => + array ( + 'match' => '0C9B 0CBC', + 'replace' => 'E176', + ), + 18 => + array ( + 'match' => '0C9C 0CBC', + 'replace' => 'E0E8', + ), + 19 => + array ( + 'match' => '0C9D 0CBC', + 'replace' => 'E0E9', + ), + 20 => + array ( + 'match' => '0C9E 0CBC', + 'replace' => 'E177', + ), + 21 => + array ( + 'match' => '0C9F 0CBC', + 'replace' => 'E178', + ), + 22 => + array ( + 'match' => '0CA0 0CBC', + 'replace' => 'E179', + ), + 23 => + array ( + 'match' => '0CA1 0CBC', + 'replace' => 'E17A', + ), + 24 => + array ( + 'match' => '0CA2 0CBC', + 'replace' => 'E17B', + ), + 25 => + array ( + 'match' => '0CA3 0CBC', + 'replace' => 'E17C', + ), + 26 => + array ( + 'match' => '0CA4 0CBC', + 'replace' => 'E17D', + ), + 27 => + array ( + 'match' => '0CA5 0CBC', + 'replace' => 'E17E', + ), + 28 => + array ( + 'match' => '0CA6 0CBC', + 'replace' => 'E17F', + ), + 29 => + array ( + 'match' => '0CA7 0CBC', + 'replace' => 'E180', + ), + 30 => + array ( + 'match' => '0CA8 0CBC', + 'replace' => 'E181', + ), + 31 => + array ( + 'match' => '0CAA 0CBC', + 'replace' => 'E182', + ), + 32 => + array ( + 'match' => '0CAB 0CBC', + 'replace' => 'E0EA', + ), + 33 => + array ( + 'match' => '0CAC 0CBC', + 'replace' => 'E183', + ), + 34 => + array ( + 'match' => '0CAD 0CBC', + 'replace' => 'E184', + ), + 35 => + array ( + 'match' => '0CAE 0CBC', + 'replace' => 'E185', + ), + 36 => + array ( + 'match' => '0CAF 0CBC', + 'replace' => 'E186', + ), + 37 => + array ( + 'match' => '0CB0 0CBC', + 'replace' => 'E0EB', + ), + 38 => + array ( + 'match' => '0CB1 0CBC', + 'replace' => 'E187', + ), + 39 => + array ( + 'match' => '0CB2 0CBC', + 'replace' => 'E188', + ), + 40 => + array ( + 'match' => '0CB3 0CBC', + 'replace' => 'E189', + ), + 41 => + array ( + 'match' => '0CB5 0CBC', + 'replace' => 'E18A', + ), + 42 => + array ( + 'match' => '0CB6 0CBC', + 'replace' => 'E18B', + ), + 43 => + array ( + 'match' => '0CB7 0CBC', + 'replace' => 'E18C', + ), + 44 => + array ( + 'match' => '0CB8 0CBC', + 'replace' => 'E18D', + ), + 45 => + array ( + 'match' => '0CB9 0CBC', + 'replace' => 'E18E', + ), + 46 => + array ( + 'match' => 'E07D 0CBC', + 'replace' => 'E117', + ), + 47 => + array ( + 'match' => 'E07E 0CBC', + 'replace' => 'E118', + ), + 48 => + array ( + 'match' => 'E0A3 0CBC', + 'replace' => 'E136', + ), + 49 => + array ( + 'match' => 'E0AC 0C95', + 'replace' => 'E02E', + ), + 50 => + array ( + 'match' => 'E0AC 0C96', + 'replace' => 'E02F', + ), + 51 => + array ( + 'match' => 'E0AC 0C97', + 'replace' => 'E030', + ), + 52 => + array ( + 'match' => 'E0AC 0C98', + 'replace' => 'E031', + ), + 53 => + array ( + 'match' => 'E0AC 0C99', + 'replace' => 'E032', + ), + 54 => + array ( + 'match' => 'E0AC 0C9A', + 'replace' => 'E033', + ), + 55 => + array ( + 'match' => 'E0AC 0C9B', + 'replace' => 'E034', + ), + 56 => + array ( + 'match' => 'E0AC 0C9C', + 'replace' => 'E035', + ), + 57 => + array ( + 'match' => 'E0AC 0C9D', + 'replace' => 'E036', + ), + 58 => + array ( + 'match' => 'E0AC 0C9E', + 'replace' => 'E037', + ), + 59 => + array ( + 'match' => 'E0AC 0C9F', + 'replace' => 'E038', + ), + 60 => + array ( + 'match' => 'E0AC 0CA0', + 'replace' => 'E039', + ), + 61 => + array ( + 'match' => 'E0AC 0CA1', + 'replace' => 'E03A', + ), + 62 => + array ( + 'match' => 'E0AC 0CA2', + 'replace' => 'E03B', + ), + 63 => + array ( + 'match' => 'E0AC 0CA3', + 'replace' => 'E03C', + ), + 64 => + array ( + 'match' => 'E0AC 0CA4', + 'replace' => 'E03D', + ), + 65 => + array ( + 'match' => 'E0AC 0CA5', + 'replace' => 'E03E', + ), + 66 => + array ( + 'match' => 'E0AC 0CA6', + 'replace' => 'E03F', + ), + 67 => + array ( + 'match' => 'E0AC 0CA7', + 'replace' => 'E040', + ), + 68 => + array ( + 'match' => 'E0AC 0CA8', + 'replace' => 'E041', + ), + 69 => + array ( + 'match' => 'E0AC 0CAA', + 'replace' => 'E042', + ), + 70 => + array ( + 'match' => 'E0AC 0CAB', + 'replace' => 'E043', + ), + 71 => + array ( + 'match' => 'E0AC 0CAC', + 'replace' => 'E044', + ), + 72 => + array ( + 'match' => 'E0AC 0CAD', + 'replace' => 'E045', + ), + 73 => + array ( + 'match' => 'E0AC 0CAE', + 'replace' => 'E046', + ), + 74 => + array ( + 'match' => 'E0AC 0CAF', + 'replace' => 'E047', + ), + 75 => + array ( + 'match' => 'E0AC 0CB0', + 'replace' => 'E048', + ), + 76 => + array ( + 'match' => 'E0AC 0CB1', + 'replace' => 'E049', + ), + 77 => + array ( + 'match' => 'E0AC 0CB2', + 'replace' => 'E04A', + ), + 78 => + array ( + 'match' => 'E0AC 0CB3', + 'replace' => 'E04B', + ), + 79 => + array ( + 'match' => 'E0AC 0CB5', + 'replace' => 'E04C', + ), + 80 => + array ( + 'match' => 'E0AC 0CB6', + 'replace' => 'E04D', + ), + 81 => + array ( + 'match' => 'E0AC 0CB7', + 'replace' => 'E04E', + ), + 82 => + array ( + 'match' => 'E0AC 0CB8', + 'replace' => 'E04F', + ), + 83 => + array ( + 'match' => 'E0AC 0CB9', + 'replace' => 'E050', + ), + 84 => + array ( + 'match' => 'E0AC E07D', + 'replace' => 'E081', + ), + 85 => + array ( + 'match' => 'E07D E03C', + 'replace' => 'E0A3', + ), + 86 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E02E', + 'replace' => '\\1 E052', + ), + 87 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E02F', + 'replace' => '\\1 E053', + ), + 88 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E030', + 'replace' => '\\1 E054', + ), + 89 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E031', + 'replace' => '\\1 E055', + ), + 90 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E032', + 'replace' => '\\1 E056', + ), + 91 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E033', + 'replace' => '\\1 E057', + ), + 92 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E034', + 'replace' => '\\1 E058', + ), + 93 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E035', + 'replace' => '\\1 E059', + ), + 94 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E036', + 'replace' => '\\1 E05A', + ), + 95 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E037', + 'replace' => '\\1 E05B', + ), + 96 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E038', + 'replace' => '\\1 E05C', + ), + 97 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E039', + 'replace' => '\\1 E05D', + ), + 98 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E03A', + 'replace' => '\\1 E05E', + ), + 99 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E03B', + 'replace' => '\\1 E05F', + ), + 100 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E03C', + 'replace' => '\\1 E060', + ), + 101 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E03D', + 'replace' => '\\1 E061', + ), + 102 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E03E', + 'replace' => '\\1 E062', + ), + 103 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E03F', + 'replace' => '\\1 E063', + ), + 104 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E040', + 'replace' => '\\1 E064', + ), + 105 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E041', + 'replace' => '\\1 E065', + ), + 106 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E042', + 'replace' => '\\1 E066', + ), + 107 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E043', + 'replace' => '\\1 E067', + ), + 108 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E044', + 'replace' => '\\1 E068', + ), + 109 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E045', + 'replace' => '\\1 E069', + ), + 110 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E046', + 'replace' => '\\1 E06A', + ), + 111 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E047', + 'replace' => '\\1 E06B', + ), + 112 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E048', + 'replace' => '\\1 E06C', + ), + 113 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E049', + 'replace' => '\\1 E06D', + ), + 114 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E04A', + 'replace' => '\\1 E06E', + ), + 115 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E04B', + 'replace' => '\\1 E06F', + ), + 116 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E04C', + 'replace' => '\\1 E070', + ), + 117 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E04D', + 'replace' => '\\1 E071', + ), + 118 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E04E', + 'replace' => '\\1 E072', + ), + 119 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E04F', + 'replace' => '\\1 E073', + ), + 120 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E050', + 'replace' => '\\1 E074', + ), + 121 => + array ( + 'match' => '((E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E081)) E081', + 'replace' => '\\1 E081', + ), + 122 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E02E', + 'replace' => '\\1 E052', + ), + 123 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E02F', + 'replace' => '\\1 E053', + ), + 124 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E030', + 'replace' => '\\1 E054', + ), + 125 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E031', + 'replace' => '\\1 E055', + ), + 126 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E032', + 'replace' => '\\1 E056', + ), + 127 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E033', + 'replace' => '\\1 E057', + ), + 128 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E034', + 'replace' => '\\1 E058', + ), + 129 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E035', + 'replace' => '\\1 E059', + ), + 130 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E036', + 'replace' => '\\1 E05A', + ), + 131 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E037', + 'replace' => '\\1 E05B', + ), + 132 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E038', + 'replace' => '\\1 E05C', + ), + 133 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E039', + 'replace' => '\\1 E05D', + ), + 134 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E03A', + 'replace' => '\\1 E05E', + ), + 135 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E03B', + 'replace' => '\\1 E05F', + ), + 136 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E03C', + 'replace' => '\\1 E060', + ), + 137 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E03D', + 'replace' => '\\1 E061', + ), + 138 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E03E', + 'replace' => '\\1 E062', + ), + 139 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E03F', + 'replace' => '\\1 E063', + ), + 140 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E040', + 'replace' => '\\1 E064', + ), + 141 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E041', + 'replace' => '\\1 E065', + ), + 142 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E042', + 'replace' => '\\1 E066', + ), + 143 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E043', + 'replace' => '\\1 E067', + ), + 144 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E044', + 'replace' => '\\1 E068', + ), + 145 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E045', + 'replace' => '\\1 E069', + ), + 146 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E046', + 'replace' => '\\1 E06A', + ), + 147 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E047', + 'replace' => '\\1 E06B', + ), + 148 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E048', + 'replace' => '\\1 E06C', + ), + 149 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E049', + 'replace' => '\\1 E06D', + ), + 150 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E04A', + 'replace' => '\\1 E06E', + ), + 151 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E04B', + 'replace' => '\\1 E06F', + ), + 152 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E04C', + 'replace' => '\\1 E070', + ), + 153 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E04D', + 'replace' => '\\1 E071', + ), + 154 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E04E', + 'replace' => '\\1 E072', + ), + 155 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E04F', + 'replace' => '\\1 E073', + ), + 156 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E050', + 'replace' => '\\1 E074', + ), + 157 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E081', + 'replace' => '\\1 E081', + ), + 158 => + array ( + 'match' => '(E07D) E02E', + 'replace' => '\\1 E052', + ), + 159 => + array ( + 'match' => '(E07D) E02F', + 'replace' => '\\1 E053', + ), + 160 => + array ( + 'match' => '(E07D) E030', + 'replace' => '\\1 E054', + ), + 161 => + array ( + 'match' => '(E07D) E031', + 'replace' => '\\1 E055', + ), + 162 => + array ( + 'match' => '(E07D) E032', + 'replace' => '\\1 E056', + ), + 163 => + array ( + 'match' => '(E07D) E033', + 'replace' => '\\1 E057', + ), + 164 => + array ( + 'match' => '(E07D) E034', + 'replace' => '\\1 E058', + ), + 165 => + array ( + 'match' => '(E07D) E035', + 'replace' => '\\1 E059', + ), + 166 => + array ( + 'match' => '(E07D) E036', + 'replace' => '\\1 E05A', + ), + 167 => + array ( + 'match' => '(E07D) E037', + 'replace' => '\\1 E05B', + ), + 168 => + array ( + 'match' => '(E07D) E038', + 'replace' => '\\1 E05C', + ), + 169 => + array ( + 'match' => '(E07D) E039', + 'replace' => '\\1 E05D', + ), + 170 => + array ( + 'match' => '(E07D) E03A', + 'replace' => '\\1 E05E', + ), + 171 => + array ( + 'match' => '(E07D) E03B', + 'replace' => '\\1 E05F', + ), + 172 => + array ( + 'match' => '(E07D) E03C', + 'replace' => '\\1 E060', + ), + 173 => + array ( + 'match' => '(E07D) E03D', + 'replace' => '\\1 E061', + ), + 174 => + array ( + 'match' => '(E07D) E03E', + 'replace' => '\\1 E062', + ), + 175 => + array ( + 'match' => '(E07D) E03F', + 'replace' => '\\1 E063', + ), + 176 => + array ( + 'match' => '(E07D) E040', + 'replace' => '\\1 E064', + ), + 177 => + array ( + 'match' => '(E07D) E041', + 'replace' => '\\1 E065', + ), + 178 => + array ( + 'match' => '(E07D) E042', + 'replace' => '\\1 E066', + ), + 179 => + array ( + 'match' => '(E07D) E043', + 'replace' => '\\1 E067', + ), + 180 => + array ( + 'match' => '(E07D) E044', + 'replace' => '\\1 E068', + ), + 181 => + array ( + 'match' => '(E07D) E045', + 'replace' => '\\1 E069', + ), + 182 => + array ( + 'match' => '(E07D) E046', + 'replace' => '\\1 E06A', + ), + 183 => + array ( + 'match' => '(E07D) E047', + 'replace' => '\\1 E06B', + ), + 184 => + array ( + 'match' => '(E07D) E048', + 'replace' => '\\1 E06C', + ), + 185 => + array ( + 'match' => '(E07D) E049', + 'replace' => '\\1 E06D', + ), + 186 => + array ( + 'match' => '(E07D) E04A', + 'replace' => '\\1 E06E', + ), + 187 => + array ( + 'match' => '(E07D) E04B', + 'replace' => '\\1 E06F', + ), + 188 => + array ( + 'match' => '(E07D) E04C', + 'replace' => '\\1 E070', + ), + 189 => + array ( + 'match' => '(E07D) E04D', + 'replace' => '\\1 E071', + ), + 190 => + array ( + 'match' => '(E07D) E04E', + 'replace' => '\\1 E072', + ), + 191 => + array ( + 'match' => '(E07D) E04F', + 'replace' => '\\1 E073', + ), + 192 => + array ( + 'match' => '(E07D) E050', + 'replace' => '\\1 E074', + ), + 193 => + array ( + 'match' => '(E07D) E081', + 'replace' => '\\1 E081', + ), + 194 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E02E', + 'replace' => '\\1 E052', + ), + 195 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E02F', + 'replace' => '\\1 E053', + ), + 196 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E030', + 'replace' => '\\1 E054', + ), + 197 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E031', + 'replace' => '\\1 E055', + ), + 198 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E032', + 'replace' => '\\1 E056', + ), + 199 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E033', + 'replace' => '\\1 E057', + ), + 200 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E034', + 'replace' => '\\1 E058', + ), + 201 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E035', + 'replace' => '\\1 E059', + ), + 202 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E036', + 'replace' => '\\1 E05A', + ), + 203 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E037', + 'replace' => '\\1 E05B', + ), + 204 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E038', + 'replace' => '\\1 E05C', + ), + 205 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E039', + 'replace' => '\\1 E05D', + ), + 206 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E03A', + 'replace' => '\\1 E05E', + ), + 207 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E03B', + 'replace' => '\\1 E05F', + ), + 208 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E03C', + 'replace' => '\\1 E060', + ), + 209 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E03D', + 'replace' => '\\1 E061', + ), + 210 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E03E', + 'replace' => '\\1 E062', + ), + 211 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E03F', + 'replace' => '\\1 E063', + ), + 212 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E040', + 'replace' => '\\1 E064', + ), + 213 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E041', + 'replace' => '\\1 E065', + ), + 214 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E042', + 'replace' => '\\1 E066', + ), + 215 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E043', + 'replace' => '\\1 E067', + ), + 216 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E044', + 'replace' => '\\1 E068', + ), + 217 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E045', + 'replace' => '\\1 E069', + ), + 218 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E046', + 'replace' => '\\1 E06A', + ), + 219 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E047', + 'replace' => '\\1 E06B', + ), + 220 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E048', + 'replace' => '\\1 E06C', + ), + 221 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E049', + 'replace' => '\\1 E06D', + ), + 222 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E04A', + 'replace' => '\\1 E06E', + ), + 223 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E04B', + 'replace' => '\\1 E06F', + ), + 224 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E04C', + 'replace' => '\\1 E070', + ), + 225 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E04D', + 'replace' => '\\1 E071', + ), + 226 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E04E', + 'replace' => '\\1 E072', + ), + 227 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E04F', + 'replace' => '\\1 E073', + ), + 228 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E050', + 'replace' => '\\1 E074', + ), + 229 => + array ( + 'match' => '(E07D (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E081', + 'replace' => '\\1 E081', + ), + 230 => + array ( + 'match' => '(E07E) E02E', + 'replace' => '\\1 E052', + ), + 231 => + array ( + 'match' => '(E07E) E02F', + 'replace' => '\\1 E053', + ), + 232 => + array ( + 'match' => '(E07E) E030', + 'replace' => '\\1 E054', + ), + 233 => + array ( + 'match' => '(E07E) E031', + 'replace' => '\\1 E055', + ), + 234 => + array ( + 'match' => '(E07E) E032', + 'replace' => '\\1 E056', + ), + 235 => + array ( + 'match' => '(E07E) E033', + 'replace' => '\\1 E057', + ), + 236 => + array ( + 'match' => '(E07E) E034', + 'replace' => '\\1 E058', + ), + 237 => + array ( + 'match' => '(E07E) E035', + 'replace' => '\\1 E059', + ), + 238 => + array ( + 'match' => '(E07E) E036', + 'replace' => '\\1 E05A', + ), + 239 => + array ( + 'match' => '(E07E) E037', + 'replace' => '\\1 E05B', + ), + 240 => + array ( + 'match' => '(E07E) E038', + 'replace' => '\\1 E05C', + ), + 241 => + array ( + 'match' => '(E07E) E039', + 'replace' => '\\1 E05D', + ), + 242 => + array ( + 'match' => '(E07E) E03A', + 'replace' => '\\1 E05E', + ), + 243 => + array ( + 'match' => '(E07E) E03B', + 'replace' => '\\1 E05F', + ), + 244 => + array ( + 'match' => '(E07E) E03C', + 'replace' => '\\1 E060', + ), + 245 => + array ( + 'match' => '(E07E) E03D', + 'replace' => '\\1 E061', + ), + 246 => + array ( + 'match' => '(E07E) E03E', + 'replace' => '\\1 E062', + ), + 247 => + array ( + 'match' => '(E07E) E03F', + 'replace' => '\\1 E063', + ), + 248 => + array ( + 'match' => '(E07E) E040', + 'replace' => '\\1 E064', + ), + 249 => + array ( + 'match' => '(E07E) E041', + 'replace' => '\\1 E065', + ), + 250 => + array ( + 'match' => '(E07E) E042', + 'replace' => '\\1 E066', + ), + 251 => + array ( + 'match' => '(E07E) E043', + 'replace' => '\\1 E067', + ), + 252 => + array ( + 'match' => '(E07E) E044', + 'replace' => '\\1 E068', + ), + 253 => + array ( + 'match' => '(E07E) E045', + 'replace' => '\\1 E069', + ), + 254 => + array ( + 'match' => '(E07E) E046', + 'replace' => '\\1 E06A', + ), + 255 => + array ( + 'match' => '(E07E) E047', + 'replace' => '\\1 E06B', + ), + 256 => + array ( + 'match' => '(E07E) E048', + 'replace' => '\\1 E06C', + ), + 257 => + array ( + 'match' => '(E07E) E049', + 'replace' => '\\1 E06D', + ), + 258 => + array ( + 'match' => '(E07E) E04A', + 'replace' => '\\1 E06E', + ), + 259 => + array ( + 'match' => '(E07E) E04B', + 'replace' => '\\1 E06F', + ), + 260 => + array ( + 'match' => '(E07E) E04C', + 'replace' => '\\1 E070', + ), + 261 => + array ( + 'match' => '(E07E) E04D', + 'replace' => '\\1 E071', + ), + 262 => + array ( + 'match' => '(E07E) E04E', + 'replace' => '\\1 E072', + ), + 263 => + array ( + 'match' => '(E07E) E04F', + 'replace' => '\\1 E073', + ), + 264 => + array ( + 'match' => '(E07E) E050', + 'replace' => '\\1 E074', + ), + 265 => + array ( + 'match' => '(E07E) E081', + 'replace' => '\\1 E081', + ), + 266 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E02E', + 'replace' => '\\1 E052', + ), + 267 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E02F', + 'replace' => '\\1 E053', + ), + 268 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E030', + 'replace' => '\\1 E054', + ), + 269 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E031', + 'replace' => '\\1 E055', + ), + 270 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E032', + 'replace' => '\\1 E056', + ), + 271 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E033', + 'replace' => '\\1 E057', + ), + 272 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E034', + 'replace' => '\\1 E058', + ), + 273 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E035', + 'replace' => '\\1 E059', + ), + 274 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E036', + 'replace' => '\\1 E05A', + ), + 275 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E037', + 'replace' => '\\1 E05B', + ), + 276 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E038', + 'replace' => '\\1 E05C', + ), + 277 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E039', + 'replace' => '\\1 E05D', + ), + 278 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E03A', + 'replace' => '\\1 E05E', + ), + 279 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E03B', + 'replace' => '\\1 E05F', + ), + 280 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E03C', + 'replace' => '\\1 E060', + ), + 281 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E03D', + 'replace' => '\\1 E061', + ), + 282 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E03E', + 'replace' => '\\1 E062', + ), + 283 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E03F', + 'replace' => '\\1 E063', + ), + 284 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E040', + 'replace' => '\\1 E064', + ), + 285 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E041', + 'replace' => '\\1 E065', + ), + 286 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E042', + 'replace' => '\\1 E066', + ), + 287 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E043', + 'replace' => '\\1 E067', + ), + 288 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E044', + 'replace' => '\\1 E068', + ), + 289 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E045', + 'replace' => '\\1 E069', + ), + 290 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E046', + 'replace' => '\\1 E06A', + ), + 291 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E047', + 'replace' => '\\1 E06B', + ), + 292 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E048', + 'replace' => '\\1 E06C', + ), + 293 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E049', + 'replace' => '\\1 E06D', + ), + 294 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E04A', + 'replace' => '\\1 E06E', + ), + 295 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E04B', + 'replace' => '\\1 E06F', + ), + 296 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E04C', + 'replace' => '\\1 E070', + ), + 297 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E04D', + 'replace' => '\\1 E071', + ), + 298 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E04E', + 'replace' => '\\1 E072', + ), + 299 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E04F', + 'replace' => '\\1 E073', + ), + 300 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E050', + 'replace' => '\\1 E074', + ), + 301 => + array ( + 'match' => '(E07E (0CBE|0CBF|0CC6|0CC1|0CC2|0CCC|0CCA)) E081', + 'replace' => '\\1 E081', + ), + 302 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E03D', + 'replace' => '\\1 E076', + ), + 303 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E041', + 'replace' => '\\1 E077', + ), + 304 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E046', + 'replace' => '\\1 E078', + ), + 305 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E047', + 'replace' => '\\1 E079', + ), + 306 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E048', + 'replace' => '\\1 E07A', + ), + 307 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E04A', + 'replace' => '\\1 E07B', + ), + 308 => + array ( + 'match' => '((E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E081)) E04E', + 'replace' => '\\1 E07C', + ), + 309 => + array ( + 'match' => '((E0E6|E0E7|E172|E173|E174|E175|E176|E0E8|E0E9|E177|E178|E179|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E182|E0EA|E183|E184|E185|E186|E0EB|E187|E188|E189|E18A|E18B|E18C|E18D|E18E|E0F2|E0F3|E11B|E11C|E11D|E11E|E0F4|E0F5|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E0F9|E129|E12A|E12B|E12C|E0FD|E12D|E12E|E12F|E130|E131|E132|E133)) E030', + 'replace' => '\\1 E104', + ), + 310 => + array ( + 'match' => '((E0E6|E0E7|E172|E173|E174|E175|E176|E0E8|E0E9|E177|E178|E179|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E182|E0EA|E183|E184|E185|E186|E0EB|E187|E188|E189|E18A|E18B|E18C|E18D|E18E|E0F2|E0F3|E11B|E11C|E11D|E11E|E0F4|E0F5|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E0F9|E129|E12A|E12B|E12C|E0FD|E12D|E12E|E12F|E130|E131|E132|E133)) E032', + 'replace' => '\\1 E105', + ), + 311 => + array ( + 'match' => '((E0E6|E0E7|E172|E173|E174|E175|E176|E0E8|E0E9|E177|E178|E179|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E182|E0EA|E183|E184|E185|E186|E0EB|E187|E188|E189|E18A|E18B|E18C|E18D|E18E|E0F2|E0F3|E11B|E11C|E11D|E11E|E0F4|E0F5|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E0F9|E129|E12A|E12B|E12C|E0FD|E12D|E12E|E12F|E130|E131|E132|E133)) E034', + 'replace' => '\\1 E106', + ), + 312 => + array ( + 'match' => '((E0E6|E0E7|E172|E173|E174|E175|E176|E0E8|E0E9|E177|E178|E179|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E182|E0EA|E183|E184|E185|E186|E0EB|E187|E188|E189|E18A|E18B|E18C|E18D|E18E|E0F2|E0F3|E11B|E11C|E11D|E11E|E0F4|E0F5|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E0F9|E129|E12A|E12B|E12C|E0FD|E12D|E12E|E12F|E130|E131|E132|E133)) E035', + 'replace' => '\\1 E107', + ), + 313 => + array ( + 'match' => '((E0E6|E0E7|E172|E173|E174|E175|E176|E0E8|E0E9|E177|E178|E179|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E182|E0EA|E183|E184|E185|E186|E0EB|E187|E188|E189|E18A|E18B|E18C|E18D|E18E|E0F2|E0F3|E11B|E11C|E11D|E11E|E0F4|E0F5|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E0F9|E129|E12A|E12B|E12C|E0FD|E12D|E12E|E12F|E130|E131|E132|E133)) E036', + 'replace' => '\\1 E108', + ), + 314 => + array ( + 'match' => '((E0E6|E0E7|E172|E173|E174|E175|E176|E0E8|E0E9|E177|E178|E179|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E182|E0EA|E183|E184|E185|E186|E0EB|E187|E188|E189|E18A|E18B|E18C|E18D|E18E|E0F2|E0F3|E11B|E11C|E11D|E11E|E0F4|E0F5|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E0F9|E129|E12A|E12B|E12C|E0FD|E12D|E12E|E12F|E130|E131|E132|E133)) E037', + 'replace' => '\\1 E109', + ), + 315 => + array ( + 'match' => '((E0E6|E0E7|E172|E173|E174|E175|E176|E0E8|E0E9|E177|E178|E179|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E182|E0EA|E183|E184|E185|E186|E0EB|E187|E188|E189|E18A|E18B|E18C|E18D|E18E|E0F2|E0F3|E11B|E11C|E11D|E11E|E0F4|E0F5|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E0F9|E129|E12A|E12B|E12C|E0FD|E12D|E12E|E12F|E130|E131|E132|E133)) E039', + 'replace' => '\\1 E10A', + ), + 316 => + array ( + 'match' => '((E0E6|E0E7|E172|E173|E174|E175|E176|E0E8|E0E9|E177|E178|E179|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E182|E0EA|E183|E184|E185|E186|E0EB|E187|E188|E189|E18A|E18B|E18C|E18D|E18E|E0F2|E0F3|E11B|E11C|E11D|E11E|E0F4|E0F5|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E0F9|E129|E12A|E12B|E12C|E0FD|E12D|E12E|E12F|E130|E131|E132|E133)) E03A', + 'replace' => '\\1 E10B', + ), + 317 => + array ( + 'match' => '((E0E6|E0E7|E172|E173|E174|E175|E176|E0E8|E0E9|E177|E178|E179|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E182|E0EA|E183|E184|E185|E186|E0EB|E187|E188|E189|E18A|E18B|E18C|E18D|E18E|E0F2|E0F3|E11B|E11C|E11D|E11E|E0F4|E0F5|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E0F9|E129|E12A|E12B|E12C|E0FD|E12D|E12E|E12F|E130|E131|E132|E133)) E03B', + 'replace' => '\\1 E10C', + ), + 318 => + array ( + 'match' => '((E0E6|E0E7|E172|E173|E174|E175|E176|E0E8|E0E9|E177|E178|E179|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E182|E0EA|E183|E184|E185|E186|E0EB|E187|E188|E189|E18A|E18B|E18C|E18D|E18E|E0F2|E0F3|E11B|E11C|E11D|E11E|E0F4|E0F5|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E0F9|E129|E12A|E12B|E12C|E0FD|E12D|E12E|E12F|E130|E131|E132|E133)) E03C', + 'replace' => '\\1 E10D', + ), + 319 => + array ( + 'match' => '((E0E6|E0E7|E172|E173|E174|E175|E176|E0E8|E0E9|E177|E178|E179|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E182|E0EA|E183|E184|E185|E186|E0EB|E187|E188|E189|E18A|E18B|E18C|E18D|E18E|E0F2|E0F3|E11B|E11C|E11D|E11E|E0F4|E0F5|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E0F9|E129|E12A|E12B|E12C|E0FD|E12D|E12E|E12F|E130|E131|E132|E133)) E03E', + 'replace' => '\\1 E10E', + ), + 320 => + array ( + 'match' => '((E0E6|E0E7|E172|E173|E174|E175|E176|E0E8|E0E9|E177|E178|E179|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E182|E0EA|E183|E184|E185|E186|E0EB|E187|E188|E189|E18A|E18B|E18C|E18D|E18E|E0F2|E0F3|E11B|E11C|E11D|E11E|E0F4|E0F5|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E0F9|E129|E12A|E12B|E12C|E0FD|E12D|E12E|E12F|E130|E131|E132|E133)) E03F', + 'replace' => '\\1 E10F', + ), + 321 => + array ( + 'match' => '((E0E6|E0E7|E172|E173|E174|E175|E176|E0E8|E0E9|E177|E178|E179|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E182|E0EA|E183|E184|E185|E186|E0EB|E187|E188|E189|E18A|E18B|E18C|E18D|E18E|E0F2|E0F3|E11B|E11C|E11D|E11E|E0F4|E0F5|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E0F9|E129|E12A|E12B|E12C|E0FD|E12D|E12E|E12F|E130|E131|E132|E133)) E040', + 'replace' => '\\1 E110', + ), + 322 => + array ( + 'match' => '((E0E6|E0E7|E172|E173|E174|E175|E176|E0E8|E0E9|E177|E178|E179|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E182|E0EA|E183|E184|E185|E186|E0EB|E187|E188|E189|E18A|E18B|E18C|E18D|E18E|E0F2|E0F3|E11B|E11C|E11D|E11E|E0F4|E0F5|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E0F9|E129|E12A|E12B|E12C|E0FD|E12D|E12E|E12F|E130|E131|E132|E133)) E049', + 'replace' => '\\1 E111', + ), + 323 => + array ( + 'match' => '((E0E6|E0E7|E172|E173|E174|E175|E176|E0E8|E0E9|E177|E178|E179|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E182|E0EA|E183|E184|E185|E186|E0EB|E187|E188|E189|E18A|E18B|E18C|E18D|E18E|E0F2|E0F3|E11B|E11C|E11D|E11E|E0F4|E0F5|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E0F9|E129|E12A|E12B|E12C|E0FD|E12D|E12E|E12F|E130|E131|E132|E133)) E04A', + 'replace' => '\\1 E112', + ), + 324 => + array ( + 'match' => '((E0E6|E0E7|E172|E173|E174|E175|E176|E0E8|E0E9|E177|E178|E179|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E182|E0EA|E183|E184|E185|E186|E0EB|E187|E188|E189|E18A|E18B|E18C|E18D|E18E|E0F2|E0F3|E11B|E11C|E11D|E11E|E0F4|E0F5|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E0F9|E129|E12A|E12B|E12C|E0FD|E12D|E12E|E12F|E130|E131|E132|E133)) E04C', + 'replace' => '\\1 E113', + ), + 325 => + array ( + 'match' => '((E0E6|E0E7|E172|E173|E174|E175|E176|E0E8|E0E9|E177|E178|E179|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E182|E0EA|E183|E184|E185|E186|E0EB|E187|E188|E189|E18A|E18B|E18C|E18D|E18E|E0F2|E0F3|E11B|E11C|E11D|E11E|E0F4|E0F5|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E0F9|E129|E12A|E12B|E12C|E0FD|E12D|E12E|E12F|E130|E131|E132|E133)) E04E', + 'replace' => '\\1 E114', + ), + 326 => + array ( + 'match' => '((E0E6|E0E7|E172|E173|E174|E175|E176|E0E8|E0E9|E177|E178|E179|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E182|E0EA|E183|E184|E185|E186|E0EB|E187|E188|E189|E18A|E18B|E18C|E18D|E18E|E0F2|E0F3|E11B|E11C|E11D|E11E|E0F4|E0F5|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E0F9|E129|E12A|E12B|E12C|E0FD|E12D|E12E|E12F|E130|E131|E132|E133)) E050', + 'replace' => '\\1 E115', + ), + 327 => + array ( + 'match' => '((E0E6|E0E7|E172|E173|E174|E175|E176|E0E8|E0E9|E177|E178|E179|E17A|E17B|E17C|E17D|E17E|E17F|E180|E181|E182|E0EA|E183|E184|E185|E186|E0EB|E187|E188|E189|E18A|E18B|E18C|E18D|E18E|E0F2|E0F3|E11B|E11C|E11D|E11E|E0F4|E0F5|E11F|E120|E121|E122|E123|E124|E125|E126|E127|E128|E0F9|E129|E12A|E12B|E12C|E0FD|E12D|E12E|E12F|E130|E131|E132|E133)) E051', + 'replace' => '\\1 E116', + ), + 328 => + array ( + 'match' => '((0CAA|0CAB|0CB5|E182|E0EA|E18A)) 0CC1', + 'replace' => '\\1 E007', + ), + 329 => + array ( + 'match' => '((0CAA|0CAB|0CB5|E182|E0EA|E18A)) 0CC2', + 'replace' => '\\1 E009', + ), + 330 => + array ( + 'match' => '((0CB3|E189)) 0CC1', + 'replace' => '\\1 E008', + ), + 331 => + array ( + 'match' => '((0CB3|E189)) 0CC2', + 'replace' => '\\1 E00A', + ), + 332 => + array ( + 'match' => '0C98 0CC1', + 'replace' => 'E0A5', + ), + 333 => + array ( + 'match' => '0C98 0CC6', + 'replace' => 'E0A6', + ), + 334 => + array ( + 'match' => '0C98 0CCA', + 'replace' => 'E0A7', + ), + 335 => + array ( + 'match' => '0C98 0CCB', + 'replace' => 'E0A8', + ), + 336 => + array ( + 'match' => '0C99 0CC6', + 'replace' => 'E0A9', + ), + 337 => + array ( + 'match' => '0C99 0CCA', + 'replace' => 'E0AA', + ), + 338 => + array ( + 'match' => '0C99 0CCB', + 'replace' => 'E0AB', + ), + 339 => + array ( + 'match' => '0C9E 0CC1', + 'replace' => 'E0D8', + ), + 340 => + array ( + 'match' => '0C9E 0CC2', + 'replace' => 'E0D9', + ), + 341 => + array ( + 'match' => '0C9E 0CC6', + 'replace' => 'E0DA', + ), + 342 => + array ( + 'match' => '0C9E 0CCA', + 'replace' => 'E0DB', + ), + 343 => + array ( + 'match' => '0CB1 0CC6', + 'replace' => 'E0AC', + ), + 344 => + array ( + 'match' => '0CB1 0CCA', + 'replace' => 'E0AD', + ), + 345 => + array ( + 'match' => '0CB1 0CCB', + 'replace' => 'E0AE', + ), + 346 => + array ( + 'match' => '0CAA 0CCA', + 'replace' => 'E0AF', + ), + 347 => + array ( + 'match' => '0CAB 0CCA', + 'replace' => 'E0B0', + ), + 348 => + array ( + 'match' => '0CB5 0CCA', + 'replace' => 'E0B1', + ), + 349 => + array ( + 'match' => '0C9D 0CC6', + 'replace' => 'E0DD', + ), + 350 => + array ( + 'match' => '0C9D 0CCA', + 'replace' => 'E0DE', + ), + 351 => + array ( + 'match' => '0C9D 0CCB', + 'replace' => 'E0DF', + ), + 352 => + array ( + 'match' => '0CAE 0CC6', + 'replace' => 'E0E0', + ), + 353 => + array ( + 'match' => '0CAE 0CCA', + 'replace' => 'E0E1', + ), + 354 => + array ( + 'match' => '0CAE 0CCB', + 'replace' => 'E0E2', + ), + 355 => + array ( + 'match' => '0CAF 0CC6', + 'replace' => 'E0E3', + ), + 356 => + array ( + 'match' => '0CAF 0CCA', + 'replace' => 'E0E4', + ), + 357 => + array ( + 'match' => '0CAF 0CCB', + 'replace' => 'E0E5', + ), + 358 => + array ( + 'match' => '0CB3 0CCA', + 'replace' => 'E0DC', + ), + 359 => + array ( + 'match' => 'E173 0CC1', + 'replace' => 'E138', + ), + 360 => + array ( + 'match' => 'E173 0CC6', + 'replace' => 'E139', + ), + 361 => + array ( + 'match' => 'E173 0CCA', + 'replace' => 'E13A', + ), + 362 => + array ( + 'match' => 'E174 0CC6', + 'replace' => 'E13C', + ), + 363 => + array ( + 'match' => 'E174 0CCA', + 'replace' => 'E13D', + ), + 364 => + array ( + 'match' => 'E187 0CC6', + 'replace' => 'E13F', + ), + 365 => + array ( + 'match' => 'E187 0CCA', + 'replace' => 'E140', + ), + 366 => + array ( + 'match' => 'E182 0CCA', + 'replace' => 'E142', + ), + 367 => + array ( + 'match' => 'E0EA 0CCA', + 'replace' => 'E0FC', + ), + 368 => + array ( + 'match' => 'E18A 0CCA', + 'replace' => 'E143', + ), + 369 => + array ( + 'match' => 'E177 0CC1', + 'replace' => 'E164', + ), + 370 => + array ( + 'match' => 'E177 0CC2', + 'replace' => 'E165', + ), + 371 => + array ( + 'match' => 'E177 0CC6', + 'replace' => 'E166', + ), + 372 => + array ( + 'match' => 'E177 0CCA', + 'replace' => 'E167', + ), + 373 => + array ( + 'match' => 'E189 0CCA', + 'replace' => 'E168', + ), + 374 => + array ( + 'match' => 'E0E9 0CC6', + 'replace' => 'E0F6', + ), + 375 => + array ( + 'match' => 'E0E9 0CCA', + 'replace' => 'E0F8', + ), + 376 => + array ( + 'match' => 'E185 0CC6', + 'replace' => 'E16C', + ), + 377 => + array ( + 'match' => 'E185 0CCA', + 'replace' => 'E16D', + ), + 378 => + array ( + 'match' => 'E186 0CC6', + 'replace' => 'E16F', + ), + 379 => + array ( + 'match' => 'E186 0CCA', + 'replace' => 'E170', + ), + 380 => + array ( + 'match' => '0C95 0CBF', + 'replace' => 'E082', + ), + 381 => + array ( + 'match' => '0C96 0CBF', + 'replace' => 'E083', + ), + 382 => + array ( + 'match' => '0C97 0CBF', + 'replace' => 'E084', + ), + 383 => + array ( + 'match' => '0C98 0CBF', + 'replace' => 'E085', + ), + 384 => + array ( + 'match' => '0C9A 0CBF', + 'replace' => 'E086', + ), + 385 => + array ( + 'match' => '0C9B 0CBF', + 'replace' => 'E087', + ), + 386 => + array ( + 'match' => '0C9C 0CBF', + 'replace' => 'E088', + ), + 387 => + array ( + 'match' => '0C9D 0CBF', + 'replace' => 'E089', + ), + 388 => + array ( + 'match' => '0CA0 0CBF', + 'replace' => 'E08A', + ), + 389 => + array ( + 'match' => '0CA1 0CBF', + 'replace' => 'E08B', + ), + 390 => + array ( + 'match' => '0CA2 0CBF', + 'replace' => 'E08C', + ), + 391 => + array ( + 'match' => '0CA3 0CBF', + 'replace' => 'E08D', + ), + 392 => + array ( + 'match' => '0CA4 0CBF', + 'replace' => 'E08E', + ), + 393 => + array ( + 'match' => '0CA5 0CBF', + 'replace' => 'E08F', + ), + 394 => + array ( + 'match' => '0CA6 0CBF', + 'replace' => 'E090', + ), + 395 => + array ( + 'match' => '0CA7 0CBF', + 'replace' => 'E091', + ), + 396 => + array ( + 'match' => '0CA8 0CBF', + 'replace' => 'E092', + ), + 397 => + array ( + 'match' => '0CAA 0CBF', + 'replace' => 'E093', + ), + 398 => + array ( + 'match' => '0CAB 0CBF', + 'replace' => 'E094', + ), + 399 => + array ( + 'match' => '0CAC 0CBF', + 'replace' => 'E095', + ), + 400 => + array ( + 'match' => '0CAD 0CBF', + 'replace' => 'E096', + ), + 401 => + array ( + 'match' => '0CAE 0CBF', + 'replace' => 'E097', + ), + 402 => + array ( + 'match' => '0CAF 0CBF', + 'replace' => 'E098', + ), + 403 => + array ( + 'match' => '0CB0 0CBF', + 'replace' => 'E099', + ), + 404 => + array ( + 'match' => '0CB2 0CBF', + 'replace' => 'E09A', + ), + 405 => + array ( + 'match' => '0CB3 0CBF', + 'replace' => 'E09B', + ), + 406 => + array ( + 'match' => '0CB5 0CBF', + 'replace' => 'E09C', + ), + 407 => + array ( + 'match' => '0CB6 0CBF', + 'replace' => 'E09D', + ), + 408 => + array ( + 'match' => '0CB7 0CBF', + 'replace' => 'E09E', + ), + 409 => + array ( + 'match' => '0CB8 0CBF', + 'replace' => 'E09F', + ), + 410 => + array ( + 'match' => '0CB9 0CBF', + 'replace' => 'E0A0', + ), + 411 => + array ( + 'match' => 'E07D 0CBF', + 'replace' => 'E0A1', + ), + 412 => + array ( + 'match' => 'E07E 0CBF', + 'replace' => 'E0A2', + ), + 413 => + array ( + 'match' => 'E0E6 0CBF', + 'replace' => 'E0F2', + ), + 414 => + array ( + 'match' => 'E0E7 0CBF', + 'replace' => 'E0F3', + ), + 415 => + array ( + 'match' => 'E172 0CBF', + 'replace' => 'E11B', + ), + 416 => + array ( + 'match' => 'E173 0CBF', + 'replace' => 'E11C', + ), + 417 => + array ( + 'match' => 'E175 0CBF', + 'replace' => 'E11D', + ), + 418 => + array ( + 'match' => 'E176 0CBF', + 'replace' => 'E11E', + ), + 419 => + array ( + 'match' => 'E0E8 0CBF', + 'replace' => 'E0F4', + ), + 420 => + array ( + 'match' => 'E0E9 0CBF', + 'replace' => 'E0F5', + ), + 421 => + array ( + 'match' => 'E179 0CBF', + 'replace' => 'E11F', + ), + 422 => + array ( + 'match' => 'E17A 0CBF', + 'replace' => 'E120', + ), + 423 => + array ( + 'match' => 'E17B 0CBF', + 'replace' => 'E121', + ), + 424 => + array ( + 'match' => 'E17C 0CBF', + 'replace' => 'E122', + ), + 425 => + array ( + 'match' => 'E17D 0CBF', + 'replace' => 'E123', + ), + 426 => + array ( + 'match' => 'E17E 0CBF', + 'replace' => 'E124', + ), + 427 => + array ( + 'match' => 'E17F 0CBF', + 'replace' => 'E125', + ), + 428 => + array ( + 'match' => 'E180 0CBF', + 'replace' => 'E126', + ), + 429 => + array ( + 'match' => 'E181 0CBF', + 'replace' => 'E127', + ), + 430 => + array ( + 'match' => 'E182 0CBF', + 'replace' => 'E128', + ), + 431 => + array ( + 'match' => 'E0EA 0CBF', + 'replace' => 'E0F9', + ), + 432 => + array ( + 'match' => 'E183 0CBF', + 'replace' => 'E129', + ), + 433 => + array ( + 'match' => 'E184 0CBF', + 'replace' => 'E12A', + ), + 434 => + array ( + 'match' => 'E185 0CBF', + 'replace' => 'E12B', + ), + 435 => + array ( + 'match' => 'E186 0CBF', + 'replace' => 'E12C', + ), + 436 => + array ( + 'match' => 'E0EB 0CBF', + 'replace' => 'E0FD', + ), + 437 => + array ( + 'match' => 'E188 0CBF', + 'replace' => 'E12D', + ), + 438 => + array ( + 'match' => 'E189 0CBF', + 'replace' => 'E12E', + ), + 439 => + array ( + 'match' => 'E18A 0CBF', + 'replace' => 'E12F', + ), + 440 => + array ( + 'match' => 'E18B 0CBF', + 'replace' => 'E130', + ), + 441 => + array ( + 'match' => 'E18C 0CBF', + 'replace' => 'E131', + ), + 442 => + array ( + 'match' => 'E18D 0CBF', + 'replace' => 'E132', + ), + 443 => + array ( + 'match' => 'E18E 0CBF', + 'replace' => 'E133', + ), + 444 => + array ( + 'match' => 'E117 0CBF', + 'replace' => 'E134', + ), + 445 => + array ( + 'match' => 'E118 0CBF', + 'replace' => 'E135', + ), + 446 => + array ( + 'match' => 'E136 0CBF', + 'replace' => 'E137', + ), + 447 => + array ( + 'match' => 'E0AD', + 'replace' => '0CCD', + ), + 448 => + array ( + 'match' => 'E0AC', + 'replace' => '0CCD', + ), + 449 => + array ( + 'match' => '0C95 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E00C \\1', + ), + 450 => + array ( + 'match' => '0C96 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E00D \\1', + ), + 451 => + array ( + 'match' => '0C97 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E00E \\1', + ), + 452 => + array ( + 'match' => '0C98 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E00F \\1', + ), + 453 => + array ( + 'match' => '0C99 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E010 \\1', + ), + 454 => + array ( + 'match' => '0C9A ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E011 \\1', + ), + 455 => + array ( + 'match' => '0C9B ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E012 \\1', + ), + 456 => + array ( + 'match' => '0C9C ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E013 \\1', + ), + 457 => + array ( + 'match' => '0C9D ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E014 \\1', + ), + 458 => + array ( + 'match' => '0C9F ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E015 \\1', + ), + 459 => + array ( + 'match' => '0CA0 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E016 \\1', + ), + 460 => + array ( + 'match' => '0CA1 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E017 \\1', + ), + 461 => + array ( + 'match' => '0CA2 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E018 \\1', + ), + 462 => + array ( + 'match' => '0CA3 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E019 \\1', + ), + 463 => + array ( + 'match' => '0CA4 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E01A \\1', + ), + 464 => + array ( + 'match' => '0CA5 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E01B \\1', + ), + 465 => + array ( + 'match' => '0CA6 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E01C \\1', + ), + 466 => + array ( + 'match' => '0CA7 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E01D \\1', + ), + 467 => + array ( + 'match' => '0CA8 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E01E \\1', + ), + 468 => + array ( + 'match' => '0CAA ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E01F \\1', + ), + 469 => + array ( + 'match' => '0CAB ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E020 \\1', + ), + 470 => + array ( + 'match' => '0CAC ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E021 \\1', + ), + 471 => + array ( + 'match' => '0CAD ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E022 \\1', + ), + 472 => + array ( + 'match' => '0CAE ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E023 \\1', + ), + 473 => + array ( + 'match' => '0CAF ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E024 \\1', + ), + 474 => + array ( + 'match' => '0CB0 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E025 \\1', + ), + 475 => + array ( + 'match' => '0CB1 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E026 \\1', + ), + 476 => + array ( + 'match' => '0CB2 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E027 \\1', + ), + 477 => + array ( + 'match' => '0CB3 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E028 \\1', + ), + 478 => + array ( + 'match' => '0CB5 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E029 \\1', + ), + 479 => + array ( + 'match' => '0CB6 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E02A \\1', + ), + 480 => + array ( + 'match' => '0CB7 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E02B \\1', + ), + 481 => + array ( + 'match' => '0CB8 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E02C \\1', + ), + 482 => + array ( + 'match' => '0CB9 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E02D \\1', + ), + 483 => + array ( + 'match' => 'E07D ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E07F \\1', + ), + 484 => + array ( + 'match' => 'E07E ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E080 \\1', + ), + 485 => + array ( + 'match' => 'E0E6 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E0EC \\1', + ), + 486 => + array ( + 'match' => 'E0E7 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E0ED \\1', + ), + 487 => + array ( + 'match' => 'E172 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E18F \\1', + ), + 488 => + array ( + 'match' => 'E173 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E190 \\1', + ), + 489 => + array ( + 'match' => 'E174 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E191 \\1', + ), + 490 => + array ( + 'match' => 'E175 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E192 \\1', + ), + 491 => + array ( + 'match' => 'E176 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E193 \\1', + ), + 492 => + array ( + 'match' => 'E0E8 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E0EE \\1', + ), + 493 => + array ( + 'match' => 'E0E9 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E0EF \\1', + ), + 494 => + array ( + 'match' => 'E178 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E194 \\1', + ), + 495 => + array ( + 'match' => 'E179 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E195 \\1', + ), + 496 => + array ( + 'match' => 'E17A ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E196 \\1', + ), + 497 => + array ( + 'match' => 'E17B ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E197 \\1', + ), + 498 => + array ( + 'match' => 'E17C ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E198 \\1', + ), + 499 => + array ( + 'match' => 'E17D ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E199 \\1', + ), + 500 => + array ( + 'match' => 'E17E ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E19A \\1', + ), + 501 => + array ( + 'match' => 'E17F ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E19B \\1', + ), + 502 => + array ( + 'match' => 'E180 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E19C \\1', + ), + 503 => + array ( + 'match' => 'E181 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E19D \\1', + ), + 504 => + array ( + 'match' => 'E182 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E19E \\1', + ), + 505 => + array ( + 'match' => 'E0EA ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E0F0 \\1', + ), + 506 => + array ( + 'match' => 'E183 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E19F \\1', + ), + 507 => + array ( + 'match' => 'E184 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E1A0 \\1', + ), + 508 => + array ( + 'match' => 'E185 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E1A1 \\1', + ), + 509 => + array ( + 'match' => 'E186 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E1A2 \\1', + ), + 510 => + array ( + 'match' => 'E0EB ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E0F1 \\1', + ), + 511 => + array ( + 'match' => 'E187 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E1A3 \\1', + ), + 512 => + array ( + 'match' => 'E188 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E1A4 \\1', + ), + 513 => + array ( + 'match' => 'E189 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E1A5 \\1', + ), + 514 => + array ( + 'match' => 'E18A ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E1A6 \\1', + ), + 515 => + array ( + 'match' => 'E18B ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E1A7 \\1', + ), + 516 => + array ( + 'match' => 'E18C ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E1A8 \\1', + ), + 517 => + array ( + 'match' => 'E18D ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E1A9 \\1', + ), + 518 => + array ( + 'match' => 'E18E ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E1AA \\1', + ), + 519 => + array ( + 'match' => 'E117 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E119 \\1', + ), + 520 => + array ( + 'match' => 'E118 ((0CBE|0CC6|0CC7|E003|0CCA|0CCB|0CCC))', + 'replace' => 'E11A \\1', + ), + 521 => + array ( + 'match' => '0C95 (0CCD)', + 'replace' => 'E00C \\1', + ), + 522 => + array ( + 'match' => '0C96 (0CCD)', + 'replace' => 'E00D \\1', + ), + 523 => + array ( + 'match' => '0C97 (0CCD)', + 'replace' => 'E00E \\1', + ), + 524 => + array ( + 'match' => '0C98 (0CCD)', + 'replace' => 'E00F \\1', + ), + 525 => + array ( + 'match' => '0C99 (0CCD)', + 'replace' => 'E010 \\1', + ), + 526 => + array ( + 'match' => '0C9A (0CCD)', + 'replace' => 'E011 \\1', + ), + 527 => + array ( + 'match' => '0C9B (0CCD)', + 'replace' => 'E012 \\1', + ), + 528 => + array ( + 'match' => '0C9C (0CCD)', + 'replace' => 'E013 \\1', + ), + 529 => + array ( + 'match' => '0C9D (0CCD)', + 'replace' => 'E014 \\1', + ), + 530 => + array ( + 'match' => '0C9F (0CCD)', + 'replace' => 'E015 \\1', + ), + 531 => + array ( + 'match' => '0CA0 (0CCD)', + 'replace' => 'E016 \\1', + ), + 532 => + array ( + 'match' => '0CA1 (0CCD)', + 'replace' => 'E017 \\1', + ), + 533 => + array ( + 'match' => '0CA2 (0CCD)', + 'replace' => 'E018 \\1', + ), + 534 => + array ( + 'match' => '0CA3 (0CCD)', + 'replace' => 'E019 \\1', + ), + 535 => + array ( + 'match' => '0CA4 (0CCD)', + 'replace' => 'E01A \\1', + ), + 536 => + array ( + 'match' => '0CA5 (0CCD)', + 'replace' => 'E01B \\1', + ), + 537 => + array ( + 'match' => '0CA6 (0CCD)', + 'replace' => 'E01C \\1', + ), + 538 => + array ( + 'match' => '0CA7 (0CCD)', + 'replace' => 'E01D \\1', + ), + 539 => + array ( + 'match' => '0CA8 (0CCD)', + 'replace' => 'E01E \\1', + ), + 540 => + array ( + 'match' => '0CAA (0CCD)', + 'replace' => 'E01F \\1', + ), + 541 => + array ( + 'match' => '0CAB (0CCD)', + 'replace' => 'E020 \\1', + ), + 542 => + array ( + 'match' => '0CAC (0CCD)', + 'replace' => 'E021 \\1', + ), + 543 => + array ( + 'match' => '0CAD (0CCD)', + 'replace' => 'E022 \\1', + ), + 544 => + array ( + 'match' => '0CAE (0CCD)', + 'replace' => 'E023 \\1', + ), + 545 => + array ( + 'match' => '0CAF (0CCD)', + 'replace' => 'E024 \\1', + ), + 546 => + array ( + 'match' => '0CB0 (0CCD)', + 'replace' => 'E025 \\1', + ), + 547 => + array ( + 'match' => '0CB1 (0CCD)', + 'replace' => 'E026 \\1', + ), + 548 => + array ( + 'match' => '0CB2 (0CCD)', + 'replace' => 'E027 \\1', + ), + 549 => + array ( + 'match' => '0CB3 (0CCD)', + 'replace' => 'E028 \\1', + ), + 550 => + array ( + 'match' => '0CB5 (0CCD)', + 'replace' => 'E029 \\1', + ), + 551 => + array ( + 'match' => '0CB6 (0CCD)', + 'replace' => 'E02A \\1', + ), + 552 => + array ( + 'match' => '0CB7 (0CCD)', + 'replace' => 'E02B \\1', + ), + 553 => + array ( + 'match' => '0CB8 (0CCD)', + 'replace' => 'E02C \\1', + ), + 554 => + array ( + 'match' => '0CB9 (0CCD)', + 'replace' => 'E02D \\1', + ), + 555 => + array ( + 'match' => 'E07D (0CCD)', + 'replace' => 'E07F \\1', + ), + 556 => + array ( + 'match' => 'E07E (0CCD)', + 'replace' => 'E080 \\1', + ), + 557 => + array ( + 'match' => 'E0E6 (0CCD)', + 'replace' => 'E0EC \\1', + ), + 558 => + array ( + 'match' => 'E0E7 (0CCD)', + 'replace' => 'E0ED \\1', + ), + 559 => + array ( + 'match' => 'E172 (0CCD)', + 'replace' => 'E18F \\1', + ), + 560 => + array ( + 'match' => 'E173 (0CCD)', + 'replace' => 'E190 \\1', + ), + 561 => + array ( + 'match' => 'E174 (0CCD)', + 'replace' => 'E191 \\1', + ), + 562 => + array ( + 'match' => 'E175 (0CCD)', + 'replace' => 'E192 \\1', + ), + 563 => + array ( + 'match' => 'E176 (0CCD)', + 'replace' => 'E193 \\1', + ), + 564 => + array ( + 'match' => 'E0E8 (0CCD)', + 'replace' => 'E0EE \\1', + ), + 565 => + array ( + 'match' => 'E0E9 (0CCD)', + 'replace' => 'E0EF \\1', + ), + 566 => + array ( + 'match' => 'E178 (0CCD)', + 'replace' => 'E194 \\1', + ), + 567 => + array ( + 'match' => 'E179 (0CCD)', + 'replace' => 'E195 \\1', + ), + 568 => + array ( + 'match' => 'E17A (0CCD)', + 'replace' => 'E196 \\1', + ), + 569 => + array ( + 'match' => 'E17B (0CCD)', + 'replace' => 'E197 \\1', + ), + 570 => + array ( + 'match' => 'E17C (0CCD)', + 'replace' => 'E198 \\1', + ), + 571 => + array ( + 'match' => 'E17D (0CCD)', + 'replace' => 'E199 \\1', + ), + 572 => + array ( + 'match' => 'E17E (0CCD)', + 'replace' => 'E19A \\1', + ), + 573 => + array ( + 'match' => 'E17F (0CCD)', + 'replace' => 'E19B \\1', + ), + 574 => + array ( + 'match' => 'E180 (0CCD)', + 'replace' => 'E19C \\1', + ), + 575 => + array ( + 'match' => 'E181 (0CCD)', + 'replace' => 'E19D \\1', + ), + 576 => + array ( + 'match' => 'E182 (0CCD)', + 'replace' => 'E19E \\1', + ), + 577 => + array ( + 'match' => 'E0EA (0CCD)', + 'replace' => 'E0F0 \\1', + ), + 578 => + array ( + 'match' => 'E183 (0CCD)', + 'replace' => 'E19F \\1', + ), + 579 => + array ( + 'match' => 'E184 (0CCD)', + 'replace' => 'E1A0 \\1', + ), + 580 => + array ( + 'match' => 'E185 (0CCD)', + 'replace' => 'E1A1 \\1', + ), + 581 => + array ( + 'match' => 'E186 (0CCD)', + 'replace' => 'E1A2 \\1', + ), + 582 => + array ( + 'match' => 'E0EB (0CCD)', + 'replace' => 'E0F1 \\1', + ), + 583 => + array ( + 'match' => 'E187 (0CCD)', + 'replace' => 'E1A3 \\1', + ), + 584 => + array ( + 'match' => 'E188 (0CCD)', + 'replace' => 'E1A4 \\1', + ), + 585 => + array ( + 'match' => 'E189 (0CCD)', + 'replace' => 'E1A5 \\1', + ), + 586 => + array ( + 'match' => 'E18A (0CCD)', + 'replace' => 'E1A6 \\1', + ), + 587 => + array ( + 'match' => 'E18B (0CCD)', + 'replace' => 'E1A7 \\1', + ), + 588 => + array ( + 'match' => 'E18C (0CCD)', + 'replace' => 'E1A8 \\1', + ), + 589 => + array ( + 'match' => 'E18D (0CCD)', + 'replace' => 'E1A9 \\1', + ), + 590 => + array ( + 'match' => 'E18E (0CCD)', + 'replace' => 'E1AA \\1', + ), + 591 => + array ( + 'match' => 'E117 (0CCD)', + 'replace' => 'E119 \\1', + ), + 592 => + array ( + 'match' => 'E118 (0CCD)', + 'replace' => 'E11A \\1', + ), + 593 => + array ( + 'match' => '0C98 (0CBE)', + 'replace' => 'E00F \\1', + ), + 594 => + array ( + 'match' => '0CB1 (0CBE)', + 'replace' => 'E026 \\1', + ), + 595 => + array ( + 'match' => 'E173 (0CBE)', + 'replace' => 'E190 \\1', + ), + 596 => + array ( + 'match' => 'E187 (0CBE)', + 'replace' => 'E1A3 \\1', + ), + 597 => + array ( + 'match' => '((E00F|0C9E|E026|E190|E177|E1A3)) 0CBE', + 'replace' => '\\1 E004', + ), +); +?> \ No newline at end of file diff --git a/application/third_party/mpdf/includes/ind_ml_1_001.volt.php b/application/third_party/mpdf/includes/ind_ml_1_001.volt.php new file mode 100644 index 0000000..6d5f911 --- /dev/null +++ b/application/third_party/mpdf/includes/ind_ml_1_001.volt.php @@ -0,0 +1,1769 @@ +<?php + $volt = array ( + 0 => + array ( + 'match' => '0D4D 200D', + 'replace' => '007E', + ), + 1 => + array ( + 'match' => '0D4D 200C', + 'replace' => '2018', + ), + 2 => + array ( + 'match' => '200D 0D4D', + 'replace' => '2019', + ), + 3 => + array ( + 'match' => '0D15 0D4D 0D37', + 'replace' => 'E010', + ), + 4 => + array ( + 'match' => '0D1C 0D4D 0D1E', + 'replace' => 'E011', + ), + 5 => + array ( + 'match' => '0D1A 0D4D 0D1A', + 'replace' => 'E03E', + ), + 6 => + array ( + 'match' => '0D2C 0D4D 0D2C', + 'replace' => 'E04B', + ), + 7 => + array ( + 'match' => '0D24 0D4D 0D24', + 'replace' => 'E023', + ), + 8 => + array ( + 'match' => '0D28 0D4D 0D28', + 'replace' => 'E02A', + ), + 9 => + array ( + 'match' => '0D23 0D4D 0D23', + 'replace' => 'E043', + ), + 10 => + array ( + 'match' => '0D2E 0D4D 0D2E', + 'replace' => 'E030', + ), + 11 => + array ( + 'match' => '0D33 0D4D 0D33', + 'replace' => 'E036', + ), + 12 => + array ( + 'match' => '0D32 0D4D 0D32', + 'replace' => 'E05D', + ), + 13 => + array ( + 'match' => '0D26 0D4D 0D26', + 'replace' => 'E015', + ), + 14 => + array ( + 'match' => '0D1F 0D4D 0D1F', + 'replace' => 'E014', + ), + 15 => + array ( + 'match' => '0D1C 0D4D 0D1C', + 'replace' => 'E01B', + ), + 16 => + array ( + 'match' => '0D2A 0D4D 0D2A', + 'replace' => 'E046', + ), + 17 => + array ( + 'match' => '0D17 0D4D 0D17', + 'replace' => 'E03B', + ), + 18 => + array ( + 'match' => '0D15 0D4D 0D15', + 'replace' => 'E012', + ), + 19 => + array ( + 'match' => '0D31 0D4D 0D31', + 'replace' => 'E05C', + ), + 20 => + array ( + 'match' => '0D19 0D4D 0D15', + 'replace' => 'E013', + ), + 21 => + array ( + 'match' => '0D19 0D4D 0D19', + 'replace' => 'E016', + ), + 22 => + array ( + 'match' => '0D15 0D4D 0D24', + 'replace' => 'E017', + ), + 23 => + array ( + 'match' => '0D17 0D4D 0D2E', + 'replace' => 'E018', + ), + 24 => + array ( + 'match' => '0D17 0D4D E029', + 'replace' => 'E019', + ), + 25 => + array ( + 'match' => '0D17 0D4D 0D28', + 'replace' => 'E01A', + ), + 26 => + array ( + 'match' => '0D1E 0D4D 0D1C', + 'replace' => 'E01C', + ), + 27 => + array ( + 'match' => '0D1E 0D4D 0D1E', + 'replace' => 'E01D', + ), + 28 => + array ( + 'match' => '0D1E 0D4D 0D1A', + 'replace' => 'E01E', + ), + 29 => + array ( + 'match' => '0D1E 0D4D 0D1B', + 'replace' => 'E01F', + ), + 30 => + array ( + 'match' => '0D23 0D4D 0D2E', + 'replace' => 'E020', + ), + 31 => + array ( + 'match' => '0D23 0D4D 0D21', + 'replace' => 'E021', + ), + 32 => + array ( + 'match' => '0D23 0D4D 0D1F', + 'replace' => 'E022', + ), + 33 => + array ( + 'match' => '0D24 0D4D 0D38', + 'replace' => 'E024', + ), + 34 => + array ( + 'match' => '0D24 0D4D 0D25', + 'replace' => 'E025', + ), + 35 => + array ( + 'match' => '0D24 0D4D 0D2E', + 'replace' => 'E026', + ), + 36 => + array ( + 'match' => '0D24 0D4D 0D2D', + 'replace' => 'E027', + ), + 37 => + array ( + 'match' => '0D24 0D4D 0D28', + 'replace' => 'E028', + ), + 38 => + array ( + 'match' => '0D26 0D4D 0D27', + 'replace' => 'E029', + ), + 39 => + array ( + 'match' => '0D28 0D4D 0D26', + 'replace' => 'E02B', + ), + 40 => + array ( + 'match' => '0D28 0D4D 0D24', + 'replace' => 'E02C', + ), + 41 => + array ( + 'match' => '0D28 0D4D 0D27', + 'replace' => 'E02D', + ), + 42 => + array ( + 'match' => '0D28 0D4D 0D2A', + 'replace' => 'E031', + ), + 43 => + array ( + 'match' => '0D28 0D4D 0D2E', + 'replace' => 'E02E', + ), + 44 => + array ( + 'match' => '0D28 0D4D 0D25', + 'replace' => 'E02F', + ), + 45 => + array ( + 'match' => '0D2E 0D4D 0D2A', + 'replace' => 'E031', + ), + 46 => + array ( + 'match' => '0D36 0D4D 0D1A', + 'replace' => 'E032', + ), + 47 => + array ( + 'match' => '0D38 0D4D 0D25', + 'replace' => 'E033', + ), + 48 => + array ( + 'match' => '0D39 0D4D 0D28', + 'replace' => 'E034', + ), + 49 => + array ( + 'match' => '0D39 0D4D 0D2E', + 'replace' => 'E035', + ), + 50 => + array ( + 'match' => '0D15 0D4D 0D32', + 'replace' => 'E037', + ), + 51 => + array ( + 'match' => '0D15 0D4D 0D33', + 'replace' => 'E037', + ), + 52 => + array ( + 'match' => '0D15 0D4D 0D38', + 'replace' => 'E038', + ), + 53 => + array ( + 'match' => '0D15 0D4D 0D1F', + 'replace' => 'E039', + ), + 54 => + array ( + 'match' => '0D18 0D4D 0D28', + 'replace' => 'E03A', + ), + 55 => + array ( + 'match' => '0D17 0D4D 0D32', + 'replace' => 'E03C', + ), + 56 => + array ( + 'match' => '0D17 0D4D 0D33', + 'replace' => 'E03C', + ), + 57 => + array ( + 'match' => '0D1A 0D4D 0D1B', + 'replace' => 'E03F', + ), + 58 => + array ( + 'match' => '0D21 0D4D 0D21', + 'replace' => 'E040', + ), + 59 => + array ( + 'match' => '0D21 0D4D 0D22', + 'replace' => 'E041', + ), + 60 => + array ( + 'match' => '0D21 0D4D 0D1C', + 'replace' => 'E042', + ), + 61 => + array ( + 'match' => '0D23 0D4D 0D20', + 'replace' => 'E044', + ), + 62 => + array ( + 'match' => '0D24 0D4D 0D32', + 'replace' => 'E045', + ), + 63 => + array ( + 'match' => '0D2A 0D4D 0D28', + 'replace' => 'E047', + ), + 64 => + array ( + 'match' => '0D2A 0D4D 0D32', + 'replace' => 'E048', + ), + 65 => + array ( + 'match' => '0D2A 0D4D 0D33', + 'replace' => 'E048', + ), + 66 => + array ( + 'match' => '0D2A 0D4D 0D38', + 'replace' => 'E049', + ), + 67 => + array ( + 'match' => '0D2A 0D4D 0D24', + 'replace' => 'E04A', + ), + 68 => + array ( + 'match' => '0D2C 0D4D 0D32', + 'replace' => 'E04C', + ), + 69 => + array ( + 'match' => '0D2C 0D4D 0D33', + 'replace' => 'E04C', + ), + 70 => + array ( + 'match' => '0D2C 0D4D 0D26', + 'replace' => 'E04D', + ), + 71 => + array ( + 'match' => '0D2C 0D4D 0D27', + 'replace' => 'E04E', + ), + 72 => + array ( + 'match' => '0D2C 0D4D 0D15', + 'replace' => 'E04F', + ), + 73 => + array ( + 'match' => '0D2B 0D4D 0D32', + 'replace' => 'E050', + ), + 74 => + array ( + 'match' => '0D2B 0D4D 0D33', + 'replace' => 'E050', + ), + 75 => + array ( + 'match' => '0D2B 0D4D 0D15', + 'replace' => 'E051', + ), + 76 => + array ( + 'match' => '0D2B 0D4D 0D24', + 'replace' => 'E052', + ), + 77 => + array ( + 'match' => '0D2E 0D4D 0D32', + 'replace' => 'E053', + ), + 78 => + array ( + 'match' => '0D2E 0D4D 0D33', + 'replace' => 'E053', + ), + 79 => + array ( + 'match' => '0D2E 0D4D 0D28', + 'replace' => 'E054', + ), + 80 => + array ( + 'match' => '0D2F 0D4D 0D2F', + 'replace' => 'E055', + ), + 81 => + array ( + 'match' => '0D2F 0D4D 0D2E', + 'replace' => 'E056', + ), + 82 => + array ( + 'match' => '0D2F 0D4D 0D2A', + 'replace' => 'E057', + ), + 83 => + array ( + 'match' => '0D2F 0D4D 0D15', + 'replace' => 'E058', + ), + 84 => + array ( + 'match' => '0D2F 0D4D 0D24', + 'replace' => 'E05A', + ), + 85 => + array ( + 'match' => '0D32 0D4D 0D32', + 'replace' => 'E05D', + ), + 86 => + array ( + 'match' => '0D32 0D4D 0D2A', + 'replace' => 'E05E', + ), + 87 => + array ( + 'match' => '0D32 0D4D 0D15', + 'replace' => 'E05F', + ), + 88 => + array ( + 'match' => '0D32 0D4D 0D2E', + 'replace' => 'E060', + ), + 89 => + array ( + 'match' => '0D35 0D4D 0D35', + 'replace' => 'E061', + ), + 90 => + array ( + 'match' => '0D35 0D4D 0D32', + 'replace' => 'E062', + ), + 91 => + array ( + 'match' => '0D35 0D4D 0D33', + 'replace' => 'E062', + ), + 92 => + array ( + 'match' => '0D36 0D4D 0D36', + 'replace' => 'E063', + ), + 93 => + array ( + 'match' => '0D36 0D4D 0D32', + 'replace' => 'E064', + ), + 94 => + array ( + 'match' => '0D36 0D4D 0D33', + 'replace' => 'E064', + ), + 95 => + array ( + 'match' => '0D36 0D4D 0D28', + 'replace' => 'E065', + ), + 96 => + array ( + 'match' => '0D36 0D4D 0D2E', + 'replace' => 'E066', + ), + 97 => + array ( + 'match' => '0D37 0D4D 0D2A', + 'replace' => 'E067', + ), + 98 => + array ( + 'match' => '0D37 0D4D 0D15', + 'replace' => 'E068', + ), + 99 => + array ( + 'match' => '0D37 0D4D 0D23', + 'replace' => 'E069', + ), + 100 => + array ( + 'match' => '0D37 0D4D 0D1F', + 'replace' => 'E06A', + ), + 101 => + array ( + 'match' => '0D37 0D4D 0D2E', + 'replace' => 'E06B', + ), + 102 => + array ( + 'match' => '0D37 0D4D E05C', + 'replace' => 'E06C', + ), + 103 => + array ( + 'match' => '0D37 0D4D 0D2B', + 'replace' => 'E06D', + ), + 104 => + array ( + 'match' => '0D37 0D4D 0D20', + 'replace' => 'E06E', + ), + 105 => + array ( + 'match' => '0D37 0D4D 0D24', + 'replace' => 'E06F', + ), + 106 => + array ( + 'match' => '0D38 0D4D 0D38', + 'replace' => 'E070', + ), + 107 => + array ( + 'match' => '0D38 0D4D 0D32', + 'replace' => 'E071', + ), + 108 => + array ( + 'match' => '0D38 0D4D 0D33', + 'replace' => 'E071', + ), + 109 => + array ( + 'match' => '0D38 0D4D E05C', + 'replace' => 'E072', + ), + 110 => + array ( + 'match' => '0D38 0D4D 0D2A', + 'replace' => 'E073', + ), + 111 => + array ( + 'match' => '0D38 0D4D 0D24', + 'replace' => 'E074', + ), + 112 => + array ( + 'match' => '0D38 0D4D 0D15', + 'replace' => 'E075', + ), + 113 => + array ( + 'match' => '0D38 0D4D 0D28', + 'replace' => 'E076', + ), + 114 => + array ( + 'match' => '0D38 0D4D 0D2E', + 'replace' => 'E077', + ), + 115 => + array ( + 'match' => '0D39 0D4D 0D32', + 'replace' => 'E078', + ), + 116 => + array ( + 'match' => '0D39 0D4D 0D33', + 'replace' => 'E078', + ), + 117 => + array ( + 'match' => '0D34 0D4D 0D24', + 'replace' => 'E079', + ), + 118 => + array ( + 'match' => '0D34 0D4D 0D15', + 'replace' => 'E07A', + ), + 119 => + array ( + 'match' => '0D34 0D4D 0D2E', + 'replace' => 'E07C', + ), + 120 => + array ( + 'match' => 'E006 0D4D 0D31', + 'replace' => 'E07D', + ), + 121 => + array ( + 'match' => '0D28 0D4D 0D30', + 'replace' => 'E07D', + ), + 122 => + array ( + 'match' => '0D28 0D4D 0D31', + 'replace' => 'E07D', + ), + 123 => + array ( + 'match' => '0D34 0D4D E023', + 'replace' => 'E07B', + ), + 124 => + array ( + 'match' => '0D2F 0D4D E023', + 'replace' => 'E05B', + ), + 125 => + array ( + 'match' => '0D2F 0D4D E012', + 'replace' => 'E059', + ), + 126 => + array ( + 'match' => 'E010 0D4D 0D2E', + 'replace' => 'E03D', + ), + 127 => + array ( + 'match' => '2019 0D31', + 'replace' => 'E00E', + ), + 128 => + array ( + 'match' => '2019 0D31', + 'replace' => 'E00E', + ), + 129 => + array ( + 'match' => '2019 0D2F', + 'replace' => 'E00D', + ), + 130 => + array ( + 'match' => '2019 0D35', + 'replace' => 'E00F', + ), + 131 => + array ( + 'match' => '0D4D 0D31 ((0D15|0D16|0D17|0D18|0D19|0D1A|0D1B|0D1C|0D1D|0D1E|0D1F|0D20|0D21|0D22|0D23|0D24|0D25|0D26|0D27|0D28|0D2A|0D2B|0D2C|0D2D|0D2E|0D2F|0D30|0D31|0D32|0D33|0D34|0D35|0D36|0D37|0D38|0D39))', + 'replace' => 'E00E \\1', + ), + 132 => + array ( + 'match' => '0D4D 0D30 ((0D15|0D16|0D17|0D18|0D19|0D1A|0D1B|0D1C|0D1D|0D1E|0D1F|0D20|0D21|0D22|0D23|0D24|0D25|0D26|0D27|0D28|0D2A|0D2B|0D2C|0D2D|0D2E|0D2F|0D30|0D31|0D32|0D33|0D34|0D35|0D36|0D37|0D38|0D39))', + 'replace' => 'E00E \\1', + ), + 133 => + array ( + 'match' => '0D4D 0D31 ((E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D))', + 'replace' => 'E00E \\1', + ), + 134 => + array ( + 'match' => '0D4D 0D30 ((E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D))', + 'replace' => 'E00E \\1', + ), + 135 => + array ( + 'match' => '0D4D 0D31 ((0020|25CC))', + 'replace' => 'E00E \\1', + ), + 136 => + array ( + 'match' => '0D4D 0D30 ((0020|25CC))', + 'replace' => 'E00E \\1', + ), + 137 => + array ( + 'match' => '((0D15|0D16|0D17|0D18|0D19|0D1A|0D1B|0D1C|0D1D|0D1E|0D1F|0D20|0D21|0D22|0D23|0D24|0D25|0D26|0D27|0D28|0D2A|0D2B|0D2C|0D2D|0D2E|0D2F|0D30|0D31|0D32|0D33|0D34|0D35|0D36|0D37|0D38|0D39)) 0D4D 0D2F', + 'replace' => '\\1 E00D', + ), + 138 => + array ( + 'match' => '((0D15|0D16|0D17|0D18|0D19|0D1A|0D1B|0D1C|0D1D|0D1E|0D1F|0D20|0D21|0D22|0D23|0D24|0D25|0D26|0D27|0D28|0D2A|0D2B|0D2C|0D2D|0D2E|0D2F|0D30|0D31|0D32|0D33|0D34|0D35|0D36|0D37|0D38|0D39)) 2018 0D2F', + 'replace' => '\\1 E00D', + ), + 139 => + array ( + 'match' => '((E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D)) 0D4D 0D2F', + 'replace' => '\\1 E00D', + ), + 140 => + array ( + 'match' => '((E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D)) 2018 0D2F', + 'replace' => '\\1 E00D', + ), + 141 => + array ( + 'match' => '((0020|25CC)) 0D4D 0D2F', + 'replace' => '\\1 E00D', + ), + 142 => + array ( + 'match' => '((0020|25CC)) 2018 0D2F', + 'replace' => '\\1 E00D', + ), + 143 => + array ( + 'match' => '((0D15|0D16|0D17|0D18|0D19|0D1A|0D1B|0D1C|0D1D|0D1E|0D1F|0D20|0D21|0D22|0D23|0D24|0D25|0D26|0D27|0D28|0D2A|0D2B|0D2C|0D2D|0D2E|0D2F|0D30|0D31|0D32|0D33|0D34|0D35|0D36|0D37|0D38|0D39)) 0D4D 0D35', + 'replace' => '\\1 E00F', + ), + 144 => + array ( + 'match' => '((0D15|0D16|0D17|0D18|0D19|0D1A|0D1B|0D1C|0D1D|0D1E|0D1F|0D20|0D21|0D22|0D23|0D24|0D25|0D26|0D27|0D28|0D2A|0D2B|0D2C|0D2D|0D2E|0D2F|0D30|0D31|0D32|0D33|0D34|0D35|0D36|0D37|0D38|0D39)) 2018 0D35', + 'replace' => '\\1 E00F', + ), + 145 => + array ( + 'match' => '((E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D)) 0D4D 0D35', + 'replace' => '\\1 E00F', + ), + 146 => + array ( + 'match' => '((E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E07B|E07C|E07D)) 2018 0D35', + 'replace' => '\\1 E00F', + ), + 147 => + array ( + 'match' => '((0020|25CC)) 0D4D 0D35', + 'replace' => '\\1 E00F', + ), + 148 => + array ( + 'match' => '((0020|25CC)) 2018 0D35', + 'replace' => '\\1 E00F', + ), + 149 => + array ( + 'match' => '0D28 0D4D', + 'replace' => 'E006', + ), + 150 => + array ( + 'match' => '0D28 007E', + 'replace' => 'E006', + ), + 151 => + array ( + 'match' => '0D23 0D4D', + 'replace' => 'E005', + ), + 152 => + array ( + 'match' => '0D23 007E', + 'replace' => 'E005', + ), + 153 => + array ( + 'match' => '0D32 0D4D', + 'replace' => 'E008', + ), + 154 => + array ( + 'match' => '0D32 007E', + 'replace' => 'E008', + ), + 155 => + array ( + 'match' => '0D33 0D4D', + 'replace' => 'E009', + ), + 156 => + array ( + 'match' => '0D33 007E', + 'replace' => 'E009', + ), + 157 => + array ( + 'match' => '0D31 0D4D', + 'replace' => 'E007', + ), + 158 => + array ( + 'match' => '0D31 007E', + 'replace' => 'E007', + ), + 159 => + array ( + 'match' => '0D30 0D4D', + 'replace' => 'E007', + ), + 160 => + array ( + 'match' => '0D30 007E', + 'replace' => 'E007', + ), + 161 => + array ( + 'match' => '(E00E) E005', + 'replace' => '\\1 E005 E00E', + ), + 162 => + array ( + 'match' => '(E00E) E006', + 'replace' => '\\1 E006 E00E', + ), + 163 => + array ( + 'match' => '(E00E) E007', + 'replace' => '\\1 E007 E00E', + ), + 164 => + array ( + 'match' => '(E00E) E008', + 'replace' => '\\1 E008 E00E', + ), + 165 => + array ( + 'match' => '(E00E) E009', + 'replace' => '\\1 E009 E00E', + ), + 166 => + array ( + 'match' => 'E00E E005 (E00E)', + 'replace' => 'E005 \\1', + ), + 167 => + array ( + 'match' => 'E00E E006 (E00E)', + 'replace' => 'E006 \\1', + ), + 168 => + array ( + 'match' => 'E00E E007 (E00E)', + 'replace' => 'E007 \\1', + ), + 169 => + array ( + 'match' => 'E00E E008 (E00E)', + 'replace' => 'E008 \\1', + ), + 170 => + array ( + 'match' => 'E00E E009 (E00E)', + 'replace' => 'E009 \\1', + ), + 171 => + array ( + 'match' => '(E00E (0D15|0D16|0D17|0D18|0D19|0D1A|0D1B|0D1C|0D1D|0D1E|0D1F|0D20|0D21|0D22|0D23|0D24|0D25|0D26|0D27|0D28|0D2A|0D2B|0D2C|0D2D|0D2E|0D2F|0D30|0D31|0D32|0D33|0D34|0D35|0D36|0D37|0D38|0D39)) 0D4D ((0D15|0D16|0D17|0D18|0D19|0D1A|0D1B|0D1C|0D1D|0D1E|0D1F|0D20|0D21|0D22|0D23|0D24|0D25|0D26|0D27|0D28|0D2A|0D2B|0D2C|0D2D|0D2E|0D2F|0D30|0D31|0D32|0D33|0D34|0D35|0D36|0D37|0D38|0D39))', + 'replace' => '\\1 0D4D E00E \\3', + ), + 172 => + array ( + 'match' => 'E00E 0D15 (0D4D E00E)', + 'replace' => '0D15 \\1', + ), + 173 => + array ( + 'match' => 'E00E 0D16 (0D4D E00E)', + 'replace' => '0D16 \\1', + ), + 174 => + array ( + 'match' => 'E00E 0D17 (0D4D E00E)', + 'replace' => '0D17 \\1', + ), + 175 => + array ( + 'match' => 'E00E 0D18 (0D4D E00E)', + 'replace' => '0D18 \\1', + ), + 176 => + array ( + 'match' => 'E00E 0D19 (0D4D E00E)', + 'replace' => '0D19 \\1', + ), + 177 => + array ( + 'match' => 'E00E 0D1A (0D4D E00E)', + 'replace' => '0D1A \\1', + ), + 178 => + array ( + 'match' => 'E00E 0D1B (0D4D E00E)', + 'replace' => '0D1B \\1', + ), + 179 => + array ( + 'match' => 'E00E 0D1C (0D4D E00E)', + 'replace' => '0D1C \\1', + ), + 180 => + array ( + 'match' => 'E00E 0D1D (0D4D E00E)', + 'replace' => '0D1D \\1', + ), + 181 => + array ( + 'match' => 'E00E 0D1E (0D4D E00E)', + 'replace' => '0D1E \\1', + ), + 182 => + array ( + 'match' => 'E00E 0D1F (0D4D E00E)', + 'replace' => '0D1F \\1', + ), + 183 => + array ( + 'match' => 'E00E 0D20 (0D4D E00E)', + 'replace' => '0D20 \\1', + ), + 184 => + array ( + 'match' => 'E00E 0D21 (0D4D E00E)', + 'replace' => '0D21 \\1', + ), + 185 => + array ( + 'match' => 'E00E 0D22 (0D4D E00E)', + 'replace' => '0D22 \\1', + ), + 186 => + array ( + 'match' => 'E00E 0D23 (0D4D E00E)', + 'replace' => '0D23 \\1', + ), + 187 => + array ( + 'match' => 'E00E 0D24 (0D4D E00E)', + 'replace' => '0D24 \\1', + ), + 188 => + array ( + 'match' => 'E00E 0D25 (0D4D E00E)', + 'replace' => '0D25 \\1', + ), + 189 => + array ( + 'match' => 'E00E 0D26 (0D4D E00E)', + 'replace' => '0D26 \\1', + ), + 190 => + array ( + 'match' => 'E00E 0D27 (0D4D E00E)', + 'replace' => '0D27 \\1', + ), + 191 => + array ( + 'match' => 'E00E 0D28 (0D4D E00E)', + 'replace' => '0D28 \\1', + ), + 192 => + array ( + 'match' => 'E00E 0D2A (0D4D E00E)', + 'replace' => '0D2A \\1', + ), + 193 => + array ( + 'match' => 'E00E 0D2B (0D4D E00E)', + 'replace' => '0D2B \\1', + ), + 194 => + array ( + 'match' => 'E00E 0D2C (0D4D E00E)', + 'replace' => '0D2C \\1', + ), + 195 => + array ( + 'match' => 'E00E 0D2D (0D4D E00E)', + 'replace' => '0D2D \\1', + ), + 196 => + array ( + 'match' => 'E00E 0D2E (0D4D E00E)', + 'replace' => '0D2E \\1', + ), + 197 => + array ( + 'match' => 'E00E 0D2F (0D4D E00E)', + 'replace' => '0D2F \\1', + ), + 198 => + array ( + 'match' => 'E00E 0D30 (0D4D E00E)', + 'replace' => '0D30 \\1', + ), + 199 => + array ( + 'match' => 'E00E 0D31 (0D4D E00E)', + 'replace' => '0D31 \\1', + ), + 200 => + array ( + 'match' => 'E00E 0D32 (0D4D E00E)', + 'replace' => '0D32 \\1', + ), + 201 => + array ( + 'match' => 'E00E 0D33 (0D4D E00E)', + 'replace' => '0D33 \\1', + ), + 202 => + array ( + 'match' => 'E00E 0D34 (0D4D E00E)', + 'replace' => '0D34 \\1', + ), + 203 => + array ( + 'match' => 'E00E 0D35 (0D4D E00E)', + 'replace' => '0D35 \\1', + ), + 204 => + array ( + 'match' => 'E00E 0D36 (0D4D E00E)', + 'replace' => '0D36 \\1', + ), + 205 => + array ( + 'match' => 'E00E 0D37 (0D4D E00E)', + 'replace' => '0D37 \\1', + ), + 206 => + array ( + 'match' => 'E00E 0D38 (0D4D E00E)', + 'replace' => '0D38 \\1', + ), + 207 => + array ( + 'match' => 'E00E 0D39 (0D4D E00E)', + 'replace' => '0D39 \\1', + ), + 208 => + array ( + 'match' => '(0D46) E005', + 'replace' => '\\1 E005 0D46', + ), + 209 => + array ( + 'match' => '(0D46) E006', + 'replace' => '\\1 E006 0D46', + ), + 210 => + array ( + 'match' => '(0D46) E007', + 'replace' => '\\1 E007 0D46', + ), + 211 => + array ( + 'match' => '(0D46) E008', + 'replace' => '\\1 E008 0D46', + ), + 212 => + array ( + 'match' => '(0D46) E009', + 'replace' => '\\1 E009 0D46', + ), + 213 => + array ( + 'match' => '(0D47) E005', + 'replace' => '\\1 E005 0D47', + ), + 214 => + array ( + 'match' => '(0D47) E006', + 'replace' => '\\1 E006 0D47', + ), + 215 => + array ( + 'match' => '(0D47) E007', + 'replace' => '\\1 E007 0D47', + ), + 216 => + array ( + 'match' => '(0D47) E008', + 'replace' => '\\1 E008 0D47', + ), + 217 => + array ( + 'match' => '(0D47) E009', + 'replace' => '\\1 E009 0D47', + ), + 218 => + array ( + 'match' => '(0D48) E005', + 'replace' => '\\1 E005 0D48', + ), + 219 => + array ( + 'match' => '(0D48) E006', + 'replace' => '\\1 E006 0D48', + ), + 220 => + array ( + 'match' => '(0D48) E007', + 'replace' => '\\1 E007 0D48', + ), + 221 => + array ( + 'match' => '(0D48) E008', + 'replace' => '\\1 E008 0D48', + ), + 222 => + array ( + 'match' => '(0D48) E009', + 'replace' => '\\1 E009 0D48', + ), + 223 => + array ( + 'match' => '0D46 E005', + 'replace' => 'E005', + ), + 224 => + array ( + 'match' => '0D46 E006', + 'replace' => 'E006', + ), + 225 => + array ( + 'match' => '0D46 E007', + 'replace' => 'E007', + ), + 226 => + array ( + 'match' => '0D46 E008', + 'replace' => 'E008', + ), + 227 => + array ( + 'match' => '0D46 E009', + 'replace' => 'E009', + ), + 228 => + array ( + 'match' => '0D47 E005', + 'replace' => 'E005', + ), + 229 => + array ( + 'match' => '0D47 E006', + 'replace' => 'E006', + ), + 230 => + array ( + 'match' => '0D47 E007', + 'replace' => 'E007', + ), + 231 => + array ( + 'match' => '0D47 E008', + 'replace' => 'E008', + ), + 232 => + array ( + 'match' => '0D47 E009', + 'replace' => 'E009', + ), + 233 => + array ( + 'match' => '0D48 E005', + 'replace' => 'E005', + ), + 234 => + array ( + 'match' => '0D48 E006', + 'replace' => 'E006', + ), + 235 => + array ( + 'match' => '0D48 E007', + 'replace' => 'E007', + ), + 236 => + array ( + 'match' => '0D48 E008', + 'replace' => 'E008', + ), + 237 => + array ( + 'match' => '0D48 E009', + 'replace' => 'E009', + ), + 238 => + array ( + 'match' => '(0D46 (0D15|0D16|0D17|0D18|0D19|0D1A|0D1B|0D1C|0D1D|0D1E|0D1F|0D20|0D21|0D22|0D23|0D24|0D25|0D26|0D27|0D28|0D2A|0D2B|0D2C|0D2D|0D2E|0D2F|0D30|0D31|0D32|0D33|0D34|0D35|0D36|0D37|0D38|0D39)) 0D4D', + 'replace' => '\\1 0D4D 0D46', + ), + 239 => + array ( + 'match' => '(0D47 (0D15|0D16|0D17|0D18|0D19|0D1A|0D1B|0D1C|0D1D|0D1E|0D1F|0D20|0D21|0D22|0D23|0D24|0D25|0D26|0D27|0D28|0D2A|0D2B|0D2C|0D2D|0D2E|0D2F|0D30|0D31|0D32|0D33|0D34|0D35|0D36|0D37|0D38|0D39)) 0D4D', + 'replace' => '\\1 0D4D 0D47', + ), + 240 => + array ( + 'match' => '(0D48 (0D15|0D16|0D17|0D18|0D19|0D1A|0D1B|0D1C|0D1D|0D1E|0D1F|0D20|0D21|0D22|0D23|0D24|0D25|0D26|0D27|0D28|0D2A|0D2B|0D2C|0D2D|0D2E|0D2F|0D30|0D31|0D32|0D33|0D34|0D35|0D36|0D37|0D38|0D39)) 0D4D', + 'replace' => '\\1 0D4D 0D48', + ), + 241 => + array ( + 'match' => '0D46 0D15 (0D4D)', + 'replace' => '0D15 \\1', + ), + 242 => + array ( + 'match' => '0D46 0D16 (0D4D)', + 'replace' => '0D16 \\1', + ), + 243 => + array ( + 'match' => '0D46 0D17 (0D4D)', + 'replace' => '0D17 \\1', + ), + 244 => + array ( + 'match' => '0D46 0D18 (0D4D)', + 'replace' => '0D18 \\1', + ), + 245 => + array ( + 'match' => '0D46 0D19 (0D4D)', + 'replace' => '0D19 \\1', + ), + 246 => + array ( + 'match' => '0D46 0D1A (0D4D)', + 'replace' => '0D1A \\1', + ), + 247 => + array ( + 'match' => '0D46 0D1B (0D4D)', + 'replace' => '0D1B \\1', + ), + 248 => + array ( + 'match' => '0D46 0D1C (0D4D)', + 'replace' => '0D1C \\1', + ), + 249 => + array ( + 'match' => '0D46 0D1D (0D4D)', + 'replace' => '0D1D \\1', + ), + 250 => + array ( + 'match' => '0D46 0D1E (0D4D)', + 'replace' => '0D1E \\1', + ), + 251 => + array ( + 'match' => '0D46 0D1F (0D4D)', + 'replace' => '0D1F \\1', + ), + 252 => + array ( + 'match' => '0D46 0D20 (0D4D)', + 'replace' => '0D20 \\1', + ), + 253 => + array ( + 'match' => '0D46 0D21 (0D4D)', + 'replace' => '0D21 \\1', + ), + 254 => + array ( + 'match' => '0D46 0D22 (0D4D)', + 'replace' => '0D22 \\1', + ), + 255 => + array ( + 'match' => '0D46 0D23 (0D4D)', + 'replace' => '0D23 \\1', + ), + 256 => + array ( + 'match' => '0D46 0D24 (0D4D)', + 'replace' => '0D24 \\1', + ), + 257 => + array ( + 'match' => '0D46 0D25 (0D4D)', + 'replace' => '0D25 \\1', + ), + 258 => + array ( + 'match' => '0D46 0D26 (0D4D)', + 'replace' => '0D26 \\1', + ), + 259 => + array ( + 'match' => '0D46 0D27 (0D4D)', + 'replace' => '0D27 \\1', + ), + 260 => + array ( + 'match' => '0D46 0D28 (0D4D)', + 'replace' => '0D28 \\1', + ), + 261 => + array ( + 'match' => '0D46 0D2A (0D4D)', + 'replace' => '0D2A \\1', + ), + 262 => + array ( + 'match' => '0D46 0D2B (0D4D)', + 'replace' => '0D2B \\1', + ), + 263 => + array ( + 'match' => '0D46 0D2C (0D4D)', + 'replace' => '0D2C \\1', + ), + 264 => + array ( + 'match' => '0D46 0D2D (0D4D)', + 'replace' => '0D2D \\1', + ), + 265 => + array ( + 'match' => '0D46 0D2E (0D4D)', + 'replace' => '0D2E \\1', + ), + 266 => + array ( + 'match' => '0D46 0D2F (0D4D)', + 'replace' => '0D2F \\1', + ), + 267 => + array ( + 'match' => '0D46 0D30 (0D4D)', + 'replace' => '0D30 \\1', + ), + 268 => + array ( + 'match' => '0D46 0D31 (0D4D)', + 'replace' => '0D31 \\1', + ), + 269 => + array ( + 'match' => '0D46 0D32 (0D4D)', + 'replace' => '0D32 \\1', + ), + 270 => + array ( + 'match' => '0D46 0D33 (0D4D)', + 'replace' => '0D33 \\1', + ), + 271 => + array ( + 'match' => '0D46 0D34 (0D4D)', + 'replace' => '0D34 \\1', + ), + 272 => + array ( + 'match' => '0D46 0D35 (0D4D)', + 'replace' => '0D35 \\1', + ), + 273 => + array ( + 'match' => '0D46 0D36 (0D4D)', + 'replace' => '0D36 \\1', + ), + 274 => + array ( + 'match' => '0D46 0D37 (0D4D)', + 'replace' => '0D37 \\1', + ), + 275 => + array ( + 'match' => '0D46 0D38 (0D4D)', + 'replace' => '0D38 \\1', + ), + 276 => + array ( + 'match' => '0D46 0D39 (0D4D)', + 'replace' => '0D39 \\1', + ), + 277 => + array ( + 'match' => '0D47 0D15 (0D4D)', + 'replace' => '0D15 \\1', + ), + 278 => + array ( + 'match' => '0D47 0D16 (0D4D)', + 'replace' => '0D16 \\1', + ), + 279 => + array ( + 'match' => '0D47 0D17 (0D4D)', + 'replace' => '0D17 \\1', + ), + 280 => + array ( + 'match' => '0D47 0D18 (0D4D)', + 'replace' => '0D18 \\1', + ), + 281 => + array ( + 'match' => '0D47 0D19 (0D4D)', + 'replace' => '0D19 \\1', + ), + 282 => + array ( + 'match' => '0D47 0D1A (0D4D)', + 'replace' => '0D1A \\1', + ), + 283 => + array ( + 'match' => '0D47 0D1B (0D4D)', + 'replace' => '0D1B \\1', + ), + 284 => + array ( + 'match' => '0D47 0D1C (0D4D)', + 'replace' => '0D1C \\1', + ), + 285 => + array ( + 'match' => '0D47 0D1D (0D4D)', + 'replace' => '0D1D \\1', + ), + 286 => + array ( + 'match' => '0D47 0D1E (0D4D)', + 'replace' => '0D1E \\1', + ), + 287 => + array ( + 'match' => '0D47 0D1F (0D4D)', + 'replace' => '0D1F \\1', + ), + 288 => + array ( + 'match' => '0D47 0D20 (0D4D)', + 'replace' => '0D20 \\1', + ), + 289 => + array ( + 'match' => '0D47 0D21 (0D4D)', + 'replace' => '0D21 \\1', + ), + 290 => + array ( + 'match' => '0D47 0D22 (0D4D)', + 'replace' => '0D22 \\1', + ), + 291 => + array ( + 'match' => '0D47 0D23 (0D4D)', + 'replace' => '0D23 \\1', + ), + 292 => + array ( + 'match' => '0D47 0D24 (0D4D)', + 'replace' => '0D24 \\1', + ), + 293 => + array ( + 'match' => '0D47 0D25 (0D4D)', + 'replace' => '0D25 \\1', + ), + 294 => + array ( + 'match' => '0D47 0D26 (0D4D)', + 'replace' => '0D26 \\1', + ), + 295 => + array ( + 'match' => '0D47 0D27 (0D4D)', + 'replace' => '0D27 \\1', + ), + 296 => + array ( + 'match' => '0D47 0D28 (0D4D)', + 'replace' => '0D28 \\1', + ), + 297 => + array ( + 'match' => '0D47 0D2A (0D4D)', + 'replace' => '0D2A \\1', + ), + 298 => + array ( + 'match' => '0D47 0D2B (0D4D)', + 'replace' => '0D2B \\1', + ), + 299 => + array ( + 'match' => '0D47 0D2C (0D4D)', + 'replace' => '0D2C \\1', + ), + 300 => + array ( + 'match' => '0D47 0D2D (0D4D)', + 'replace' => '0D2D \\1', + ), + 301 => + array ( + 'match' => '0D47 0D2E (0D4D)', + 'replace' => '0D2E \\1', + ), + 302 => + array ( + 'match' => '0D47 0D2F (0D4D)', + 'replace' => '0D2F \\1', + ), + 303 => + array ( + 'match' => '0D47 0D30 (0D4D)', + 'replace' => '0D30 \\1', + ), + 304 => + array ( + 'match' => '0D47 0D31 (0D4D)', + 'replace' => '0D31 \\1', + ), + 305 => + array ( + 'match' => '0D47 0D32 (0D4D)', + 'replace' => '0D32 \\1', + ), + 306 => + array ( + 'match' => '0D47 0D33 (0D4D)', + 'replace' => '0D33 \\1', + ), + 307 => + array ( + 'match' => '0D47 0D34 (0D4D)', + 'replace' => '0D34 \\1', + ), + 308 => + array ( + 'match' => '0D47 0D35 (0D4D)', + 'replace' => '0D35 \\1', + ), + 309 => + array ( + 'match' => '0D47 0D36 (0D4D)', + 'replace' => '0D36 \\1', + ), + 310 => + array ( + 'match' => '0D47 0D37 (0D4D)', + 'replace' => '0D37 \\1', + ), + 311 => + array ( + 'match' => '0D47 0D38 (0D4D)', + 'replace' => '0D38 \\1', + ), + 312 => + array ( + 'match' => '0D47 0D39 (0D4D)', + 'replace' => '0D39 \\1', + ), + 313 => + array ( + 'match' => '0D48 0D15 (0D4D)', + 'replace' => '0D15 \\1', + ), + 314 => + array ( + 'match' => '0D48 0D16 (0D4D)', + 'replace' => '0D16 \\1', + ), + 315 => + array ( + 'match' => '0D48 0D17 (0D4D)', + 'replace' => '0D17 \\1', + ), + 316 => + array ( + 'match' => '0D48 0D18 (0D4D)', + 'replace' => '0D18 \\1', + ), + 317 => + array ( + 'match' => '0D48 0D19 (0D4D)', + 'replace' => '0D19 \\1', + ), + 318 => + array ( + 'match' => '0D48 0D1A (0D4D)', + 'replace' => '0D1A \\1', + ), + 319 => + array ( + 'match' => '0D48 0D1B (0D4D)', + 'replace' => '0D1B \\1', + ), + 320 => + array ( + 'match' => '0D48 0D1C (0D4D)', + 'replace' => '0D1C \\1', + ), + 321 => + array ( + 'match' => '0D48 0D1D (0D4D)', + 'replace' => '0D1D \\1', + ), + 322 => + array ( + 'match' => '0D48 0D1E (0D4D)', + 'replace' => '0D1E \\1', + ), + 323 => + array ( + 'match' => '0D48 0D1F (0D4D)', + 'replace' => '0D1F \\1', + ), + 324 => + array ( + 'match' => '0D48 0D20 (0D4D)', + 'replace' => '0D20 \\1', + ), + 325 => + array ( + 'match' => '0D48 0D21 (0D4D)', + 'replace' => '0D21 \\1', + ), + 326 => + array ( + 'match' => '0D48 0D22 (0D4D)', + 'replace' => '0D22 \\1', + ), + 327 => + array ( + 'match' => '0D48 0D23 (0D4D)', + 'replace' => '0D23 \\1', + ), + 328 => + array ( + 'match' => '0D48 0D24 (0D4D)', + 'replace' => '0D24 \\1', + ), + 329 => + array ( + 'match' => '0D48 0D25 (0D4D)', + 'replace' => '0D25 \\1', + ), + 330 => + array ( + 'match' => '0D48 0D26 (0D4D)', + 'replace' => '0D26 \\1', + ), + 331 => + array ( + 'match' => '0D48 0D27 (0D4D)', + 'replace' => '0D27 \\1', + ), + 332 => + array ( + 'match' => '0D48 0D28 (0D4D)', + 'replace' => '0D28 \\1', + ), + 333 => + array ( + 'match' => '0D48 0D2A (0D4D)', + 'replace' => '0D2A \\1', + ), + 334 => + array ( + 'match' => '0D48 0D2B (0D4D)', + 'replace' => '0D2B \\1', + ), + 335 => + array ( + 'match' => '0D48 0D2C (0D4D)', + 'replace' => '0D2C \\1', + ), + 336 => + array ( + 'match' => '0D48 0D2D (0D4D)', + 'replace' => '0D2D \\1', + ), + 337 => + array ( + 'match' => '0D48 0D2E (0D4D)', + 'replace' => '0D2E \\1', + ), + 338 => + array ( + 'match' => '0D48 0D2F (0D4D)', + 'replace' => '0D2F \\1', + ), + 339 => + array ( + 'match' => '0D48 0D30 (0D4D)', + 'replace' => '0D30 \\1', + ), + 340 => + array ( + 'match' => '0D48 0D31 (0D4D)', + 'replace' => '0D31 \\1', + ), + 341 => + array ( + 'match' => '0D48 0D32 (0D4D)', + 'replace' => '0D32 \\1', + ), + 342 => + array ( + 'match' => '0D48 0D33 (0D4D)', + 'replace' => '0D33 \\1', + ), + 343 => + array ( + 'match' => '0D48 0D34 (0D4D)', + 'replace' => '0D34 \\1', + ), + 344 => + array ( + 'match' => '0D48 0D35 (0D4D)', + 'replace' => '0D35 \\1', + ), + 345 => + array ( + 'match' => '0D48 0D36 (0D4D)', + 'replace' => '0D36 \\1', + ), + 346 => + array ( + 'match' => '0D48 0D37 (0D4D)', + 'replace' => '0D37 \\1', + ), + 347 => + array ( + 'match' => '0D48 0D38 (0D4D)', + 'replace' => '0D38 \\1', + ), + 348 => + array ( + 'match' => '0D48 0D39 (0D4D)', + 'replace' => '0D39 \\1', + ), + 349 => + array ( + 'match' => '0D41 0D4D', + 'replace' => 'E003', + ), + 350 => + array ( + 'match' => '007E', + 'replace' => '0D4D', + ), + 351 => + array ( + 'match' => '2018', + 'replace' => '0D4D', + ), + 352 => + array ( + 'match' => '2019', + 'replace' => '0D4D', + ), +); +?> \ No newline at end of file diff --git a/application/third_party/mpdf/includes/ind_or_1_001.volt.php b/application/third_party/mpdf/includes/ind_or_1_001.volt.php new file mode 100644 index 0000000..b3c2769 --- /dev/null +++ b/application/third_party/mpdf/includes/ind_or_1_001.volt.php @@ -0,0 +1,2149 @@ +<?php + $volt = array ( + 0 => + array ( + 'match' => '0B4D 200C', + 'replace' => '2018', + ), + 1 => + array ( + 'match' => '0B15 0B4D 0B37', + 'replace' => 'E003', + ), + 2 => + array ( + 'match' => '0B1C 0B4D 0B1E', + 'replace' => 'E004', + ), + 3 => + array ( + 'match' => '((0B15|0B16|0B17|0B18|0B19|0B1A|0B1B|0B1C|0B1D|0B1E|0B1F|0B20|0B21|0B22|0B23|0B24|0B25|0B26|0B27|0B28|0B2A|0B2B|0B2C|0B2D|0B2E|0B2F|0B30|0B32|0B33|0B35|0B36|0B37|0B38|0B39|0B71|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037)) 0B30 0B4D', + 'replace' => '\\1 E069', + ), + 4 => + array ( + 'match' => '((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C)) 0B30 0B4D', + 'replace' => '\\1 E069', + ), + 5 => + array ( + 'match' => '((0B3E|0B40|E044|0B57|E068|E074|E08B|E08F)) 0B30 0B4D', + 'replace' => '\\1 E069', + ), + 6 => + array ( + 'match' => '(0B3C) 0B30 0B4D', + 'replace' => '\\1 E069', + ), + 7 => + array ( + 'match' => '(25CC) 0B30 0B4D', + 'replace' => '\\1 E069', + ), + 8 => + array ( + 'match' => '((0B15|0B19|0B1A|0B1B|0B1C|0B1D|0B1E|0B20|0B21|0B22|0B24|0B26|0B28|0B2C|0B2D|0B32|0B33|0B35|0B39|25CC)) E069', + 'replace' => '\\1 E06B', + ), + 9 => + array ( + 'match' => '((0B15|0B19|0B1A|0B1B|0B1C|0B1D|0B1E|0B20|0B21|0B22|0B24|0B26|0B28|0B2C|0B2D|0B32|0B33|0B35|0B39|25CC) 0B3C) E069', + 'replace' => '\\1 E06B', + ), + 10 => + array ( + 'match' => '0B38 0B4D 0B24 0B4D 0B30', + 'replace' => 'E01B', + ), + 11 => + array ( + 'match' => '0B28 0B4D 0B24 0B4D 0B30', + 'replace' => 'E01D', + ), + 12 => + array ( + 'match' => '0B28 0B4D 0B24 0B4D 0B30', + 'replace' => 'E01C', + ), + 13 => + array ( + 'match' => '0B56 E069', + 'replace' => 'E070', + ), + 14 => + array ( + 'match' => '0B57 E069', + 'replace' => 'E074', + ), + 15 => + array ( + 'match' => '0B3F E069', + 'replace' => 'E06D', + ), + 16 => + array ( + 'match' => '0B40 E069', + 'replace' => 'E14D', + ), + 17 => + array ( + 'match' => '0B24 0B4D 0B17 0B4D 0B27', + 'replace' => 'E036', + ), + 18 => + array ( + 'match' => '0B24 0B4D 0B38 0B4D 0B28', + 'replace' => 'E030', + ), + 19 => + array ( + 'match' => '0B19 0B4D 0B15', + 'replace' => 'E005', + ), + 20 => + array ( + 'match' => '0B19 0B4D 0B16', + 'replace' => 'E006', + ), + 21 => + array ( + 'match' => '0B19 0B4D 0B17', + 'replace' => 'E007', + ), + 22 => + array ( + 'match' => '0B19 0B4D 0B18', + 'replace' => 'E008', + ), + 23 => + array ( + 'match' => '0B1A 0B4D 0B1A', + 'replace' => 'E009', + ), + 24 => + array ( + 'match' => '0B1F 0B4D 0B1F', + 'replace' => 'E00A', + ), + 25 => + array ( + 'match' => '0B24 0B4D 0B24', + 'replace' => 'E00B', + ), + 26 => + array ( + 'match' => '0B26 0B4D 0B27', + 'replace' => 'E00C', + ), + 27 => + array ( + 'match' => '0B26 0B4D 0B26', + 'replace' => 'E00D', + ), + 28 => + array ( + 'match' => '0B23 0B4D 0B23', + 'replace' => 'E00F', + ), + 29 => + array ( + 'match' => '0B1E 0B4D 0B1A', + 'replace' => 'E011', + ), + 30 => + array ( + 'match' => '0B1E 0B4D 0B1D', + 'replace' => 'E012', + ), + 31 => + array ( + 'match' => '0B1E 0B4D 0B1C', + 'replace' => 'E013', + ), + 32 => + array ( + 'match' => '0B26 0B4D 0B2D', + 'replace' => 'E014', + ), + 33 => + array ( + 'match' => '0B27 0B4D 0B27', + 'replace' => 'E015', + ), + 34 => + array ( + 'match' => '0B2C 0B4D 0B26', + 'replace' => 'E016', + ), + 35 => + array ( + 'match' => '0B28 0B4D 0B26', + 'replace' => 'E017', + ), + 36 => + array ( + 'match' => '0B28 0B4D 0B27', + 'replace' => 'E018', + ), + 37 => + array ( + 'match' => '0B2E 0B4D 0B2B', + 'replace' => 'E019', + ), + 38 => + array ( + 'match' => '0B2E 0B4D 0B2A', + 'replace' => 'E01A', + ), + 39 => + array ( + 'match' => '0B37 0B4D 0B23', + 'replace' => 'E010', + ), + 40 => + array ( + 'match' => '0B39 0B4D 0B28', + 'replace' => 'E01E', + ), + 41 => + array ( + 'match' => '0B39 0B4D 0B35', + 'replace' => 'E01F', + ), + 42 => + array ( + 'match' => '0B39 0B4D 0B2E', + 'replace' => 'E020', + ), + 43 => + array ( + 'match' => '0B1A 0B4D 0B1B', + 'replace' => 'E021', + ), + 44 => + array ( + 'match' => '0B1E 0B4D 0B1B', + 'replace' => 'E023', + ), + 45 => + array ( + 'match' => '0B2E 0B4D 0B2D', + 'replace' => 'E024', + ), + 46 => + array ( + 'match' => '0B28 0B4D 0B24', + 'replace' => 'E025', + ), + 47 => + array ( + 'match' => '0B38 0B4D 0B24', + 'replace' => 'E026', + ), + 48 => + array ( + 'match' => '0B2A 0B4D 0B24', + 'replace' => 'E027', + ), + 49 => + array ( + 'match' => '0B15 0B4D 0B24', + 'replace' => 'E028', + ), + 50 => + array ( + 'match' => '0B23 0B4D 0B21', + 'replace' => 'E029', + ), + 51 => + array ( + 'match' => '0B24 0B4D 0B15', + 'replace' => 'E02A', + ), + 52 => + array ( + 'match' => '0B24 0B4D 0B38', + 'replace' => 'E02B', + ), + 53 => + array ( + 'match' => '0B24 0B4D 0B2A', + 'replace' => 'E02C', + ), + 54 => + array ( + 'match' => '0B23 0B4D 0B22', + 'replace' => 'E031', + ), + 55 => + array ( + 'match' => '0B36 0B4D 0B1B', + 'replace' => 'E032', + ), + 56 => + array ( + 'match' => '0B24 0B4D 0B28', + 'replace' => 'E033', + ), + 57 => + array ( + 'match' => '0B24 0B4D 0B2E', + 'replace' => 'E034', + ), + 58 => + array ( + 'match' => '0B17 0B4D 0B27', + 'replace' => 'E035', + ), + 59 => + array ( + 'match' => '0B24 0B4D 0B2B', + 'replace' => 'E037', + ), + 60 => + array ( + 'match' => '0B2E 0B4D 0B2E', + 'replace' => 'E14A', + ), + 61 => + array ( + 'match' => '0B21 0B3C', + 'replace' => '0B5C', + ), + 62 => + array ( + 'match' => '0B22 0B3C', + 'replace' => '0B5D', + ), + 63 => + array ( + 'match' => '((0B15|0B16|0B17|0B18|0B19|0B1A|0B1B|0B1C|0B1D|0B1E|0B1F|0B20|0B21|0B22|0B23|0B24|0B25|0B26|0B27|0B28|0B2A|0B2B|0B2C|0B2D|0B2E|0B2F|0B30|0B32|0B33|0B35|0B36|0B37|0B38|0B39|0B71|E003|E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037)) 0B4D', + 'replace' => '\\1 2019', + ), + 64 => + array ( + 'match' => '((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C)) 0B4D', + 'replace' => '\\1 2019', + ), + 65 => + array ( + 'match' => '(E069) 0B4D', + 'replace' => '\\1 2019', + ), + 66 => + array ( + 'match' => '((0B41|E045|0B42|0B43|E053|E056|E059|0B3C)) 0B4D', + 'replace' => '\\1 2019', + ), + 67 => + array ( + 'match' => '(200D) 0B4D', + 'replace' => '\\1 2019', + ), + 68 => + array ( + 'match' => '(25CC) 0B4D', + 'replace' => '\\1 2019', + ), + 69 => + array ( + 'match' => '(0020) 0B4D', + 'replace' => '\\1 2019', + ), + 70 => + array ( + 'match' => '200D 2019', + 'replace' => '2019', + ), + 71 => + array ( + 'match' => '2019 0B30', + 'replace' => 'E075', + ), + 72 => + array ( + 'match' => '2019 0B5F', + 'replace' => 'E077', + ), + 73 => + array ( + 'match' => '2019 0B35', + 'replace' => 'E078', + ), + 74 => + array ( + 'match' => '2019 0B32', + 'replace' => 'E110', + ), + 75 => + array ( + 'match' => '2019 0B33', + 'replace' => 'E111', + ), + 76 => + array ( + 'match' => '2019 0B2E', + 'replace' => 'E11C', + ), + 77 => + array ( + 'match' => '2019 0B15', + 'replace' => 'E0F6', + ), + 78 => + array ( + 'match' => '2019 0B16', + 'replace' => 'E0F7', + ), + 79 => + array ( + 'match' => '2019 0B17', + 'replace' => 'E0F8', + ), + 80 => + array ( + 'match' => '2019 0B18', + 'replace' => 'E0F9', + ), + 81 => + array ( + 'match' => '2019 0B19', + 'replace' => 'E0FA', + ), + 82 => + array ( + 'match' => '2019 0B1A', + 'replace' => 'E0FB', + ), + 83 => + array ( + 'match' => '2019 0B1B', + 'replace' => 'E0FC', + ), + 84 => + array ( + 'match' => '2019 0B1C', + 'replace' => 'E0FD', + ), + 85 => + array ( + 'match' => '2019 0B1D', + 'replace' => 'E0FE', + ), + 86 => + array ( + 'match' => '2019 0B1E', + 'replace' => 'E0FF', + ), + 87 => + array ( + 'match' => '2019 0B1F', + 'replace' => 'E100', + ), + 88 => + array ( + 'match' => '2019 0B20', + 'replace' => 'E101', + ), + 89 => + array ( + 'match' => '2019 0B21', + 'replace' => 'E102', + ), + 90 => + array ( + 'match' => '2019 0B22', + 'replace' => 'E103', + ), + 91 => + array ( + 'match' => '2019 0B23', + 'replace' => 'E104', + ), + 92 => + array ( + 'match' => '2019 0B24', + 'replace' => 'E105', + ), + 93 => + array ( + 'match' => '2019 0B25', + 'replace' => 'E106', + ), + 94 => + array ( + 'match' => '2019 0B26', + 'replace' => 'E107', + ), + 95 => + array ( + 'match' => '2019 0B27', + 'replace' => 'E108', + ), + 96 => + array ( + 'match' => '2019 0B28', + 'replace' => 'E109', + ), + 97 => + array ( + 'match' => '2019 0B2A', + 'replace' => 'E10A', + ), + 98 => + array ( + 'match' => '2019 0B2B', + 'replace' => 'E10B', + ), + 99 => + array ( + 'match' => '2019 0B2C', + 'replace' => 'E10C', + ), + 100 => + array ( + 'match' => '2019 0B2D', + 'replace' => 'E10D', + ), + 101 => + array ( + 'match' => '2019 0B2E', + 'replace' => 'E10E', + ), + 102 => + array ( + 'match' => '2019 0B2F', + 'replace' => 'E10F', + ), + 103 => + array ( + 'match' => '2019 0B32', + 'replace' => 'E110', + ), + 104 => + array ( + 'match' => '2019 0B33', + 'replace' => 'E111', + ), + 105 => + array ( + 'match' => '2019 0B35', + 'replace' => 'E112', + ), + 106 => + array ( + 'match' => '2019 0B36', + 'replace' => 'E113', + ), + 107 => + array ( + 'match' => '2019 0B37', + 'replace' => 'E114', + ), + 108 => + array ( + 'match' => '2019 0B38', + 'replace' => 'E115', + ), + 109 => + array ( + 'match' => '2019 0B39', + 'replace' => 'E116', + ), + 110 => + array ( + 'match' => '2019 E003', + 'replace' => 'E119', + ), + 111 => + array ( + 'match' => '2019 E004', + 'replace' => 'E11A', + ), + 112 => + array ( + 'match' => '2019 0B35', + 'replace' => 'E078', + ), + 113 => + array ( + 'match' => '2019 0B71', + 'replace' => 'E078', + ), + 114 => + array ( + 'match' => '0B15 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E090 \\1', + ), + 115 => + array ( + 'match' => '0B16 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E091 \\1', + ), + 116 => + array ( + 'match' => '0B17 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E092 \\1', + ), + 117 => + array ( + 'match' => '0B18 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E093 \\1', + ), + 118 => + array ( + 'match' => '0B19 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E094 \\1', + ), + 119 => + array ( + 'match' => '0B1A ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E095 \\1', + ), + 120 => + array ( + 'match' => '0B1B ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E096 \\1', + ), + 121 => + array ( + 'match' => '0B1C ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E097 \\1', + ), + 122 => + array ( + 'match' => '0B1D ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E098 \\1', + ), + 123 => + array ( + 'match' => '0B1E ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E099 \\1', + ), + 124 => + array ( + 'match' => '0B1F ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09A \\1', + ), + 125 => + array ( + 'match' => '0B20 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09B \\1', + ), + 126 => + array ( + 'match' => '0B21 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09C \\1', + ), + 127 => + array ( + 'match' => '0B22 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09D \\1', + ), + 128 => + array ( + 'match' => '0B23 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09E \\1', + ), + 129 => + array ( + 'match' => '0B24 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09F \\1', + ), + 130 => + array ( + 'match' => '0B25 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A0 \\1', + ), + 131 => + array ( + 'match' => '0B26 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A1 \\1', + ), + 132 => + array ( + 'match' => '0B27 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A2 \\1', + ), + 133 => + array ( + 'match' => '0B28 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A3 \\1', + ), + 134 => + array ( + 'match' => '0B2A ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A4 \\1', + ), + 135 => + array ( + 'match' => '0B2B ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A5 \\1', + ), + 136 => + array ( + 'match' => '0B2C ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A6 \\1', + ), + 137 => + array ( + 'match' => '0B2D ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A7 \\1', + ), + 138 => + array ( + 'match' => '0B2E ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A8 \\1', + ), + 139 => + array ( + 'match' => '0B2F ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A9 \\1', + ), + 140 => + array ( + 'match' => '0B32 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AA \\1', + ), + 141 => + array ( + 'match' => '0B33 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AB \\1', + ), + 142 => + array ( + 'match' => '0B35 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AC \\1', + ), + 143 => + array ( + 'match' => '0B36 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AD \\1', + ), + 144 => + array ( + 'match' => '0B37 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AE \\1', + ), + 145 => + array ( + 'match' => '0B38 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AF \\1', + ), + 146 => + array ( + 'match' => '0B39 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0B0 \\1', + ), + 147 => + array ( + 'match' => 'E003 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0B1 \\1', + ), + 148 => + array ( + 'match' => 'E004 ((E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0B2 \\1', + ), + 149 => + array ( + 'match' => '0B15 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E090 \\1', + ), + 150 => + array ( + 'match' => '0B16 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E091 \\1', + ), + 151 => + array ( + 'match' => '0B17 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E092 \\1', + ), + 152 => + array ( + 'match' => '0B18 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E093 \\1', + ), + 153 => + array ( + 'match' => '0B19 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E094 \\1', + ), + 154 => + array ( + 'match' => '0B1A ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E095 \\1', + ), + 155 => + array ( + 'match' => '0B1B ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E096 \\1', + ), + 156 => + array ( + 'match' => '0B1C ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E097 \\1', + ), + 157 => + array ( + 'match' => '0B1D ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E098 \\1', + ), + 158 => + array ( + 'match' => '0B1E ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E099 \\1', + ), + 159 => + array ( + 'match' => '0B1F ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09A \\1', + ), + 160 => + array ( + 'match' => '0B20 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09B \\1', + ), + 161 => + array ( + 'match' => '0B21 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09C \\1', + ), + 162 => + array ( + 'match' => '0B22 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09D \\1', + ), + 163 => + array ( + 'match' => '0B23 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09E \\1', + ), + 164 => + array ( + 'match' => '0B24 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09F \\1', + ), + 165 => + array ( + 'match' => '0B25 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A0 \\1', + ), + 166 => + array ( + 'match' => '0B26 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A1 \\1', + ), + 167 => + array ( + 'match' => '0B27 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A2 \\1', + ), + 168 => + array ( + 'match' => '0B28 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A3 \\1', + ), + 169 => + array ( + 'match' => '0B2A ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A4 \\1', + ), + 170 => + array ( + 'match' => '0B2B ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A5 \\1', + ), + 171 => + array ( + 'match' => '0B2C ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A6 \\1', + ), + 172 => + array ( + 'match' => '0B2D ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A7 \\1', + ), + 173 => + array ( + 'match' => '0B2E ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A8 \\1', + ), + 174 => + array ( + 'match' => '0B2F ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A9 \\1', + ), + 175 => + array ( + 'match' => '0B32 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AA \\1', + ), + 176 => + array ( + 'match' => '0B33 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AB \\1', + ), + 177 => + array ( + 'match' => '0B35 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AC \\1', + ), + 178 => + array ( + 'match' => '0B36 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AD \\1', + ), + 179 => + array ( + 'match' => '0B37 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AE \\1', + ), + 180 => + array ( + 'match' => '0B38 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AF \\1', + ), + 181 => + array ( + 'match' => '0B39 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0B0 \\1', + ), + 182 => + array ( + 'match' => 'E003 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0B1 \\1', + ), + 183 => + array ( + 'match' => 'E004 ((0B01|0B3F|0B56|E06B|E041|E064|E06D|E070|E089|E08C) (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0B2 \\1', + ), + 184 => + array ( + 'match' => '0B15 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E090 \\1', + ), + 185 => + array ( + 'match' => '0B16 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E091 \\1', + ), + 186 => + array ( + 'match' => '0B17 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E092 \\1', + ), + 187 => + array ( + 'match' => '0B18 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E093 \\1', + ), + 188 => + array ( + 'match' => '0B19 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E094 \\1', + ), + 189 => + array ( + 'match' => '0B1A (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E095 \\1', + ), + 190 => + array ( + 'match' => '0B1B (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E096 \\1', + ), + 191 => + array ( + 'match' => '0B1C (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E097 \\1', + ), + 192 => + array ( + 'match' => '0B1D (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E098 \\1', + ), + 193 => + array ( + 'match' => '0B1E (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E099 \\1', + ), + 194 => + array ( + 'match' => '0B1F (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09A \\1', + ), + 195 => + array ( + 'match' => '0B20 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09B \\1', + ), + 196 => + array ( + 'match' => '0B21 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09C \\1', + ), + 197 => + array ( + 'match' => '0B22 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09D \\1', + ), + 198 => + array ( + 'match' => '0B23 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09E \\1', + ), + 199 => + array ( + 'match' => '0B24 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09F \\1', + ), + 200 => + array ( + 'match' => '0B25 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A0 \\1', + ), + 201 => + array ( + 'match' => '0B26 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A1 \\1', + ), + 202 => + array ( + 'match' => '0B27 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A2 \\1', + ), + 203 => + array ( + 'match' => '0B28 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A3 \\1', + ), + 204 => + array ( + 'match' => '0B2A (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A4 \\1', + ), + 205 => + array ( + 'match' => '0B2B (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A5 \\1', + ), + 206 => + array ( + 'match' => '0B2C (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A6 \\1', + ), + 207 => + array ( + 'match' => '0B2D (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A7 \\1', + ), + 208 => + array ( + 'match' => '0B2E (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A8 \\1', + ), + 209 => + array ( + 'match' => '0B2F (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A9 \\1', + ), + 210 => + array ( + 'match' => '0B32 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AA \\1', + ), + 211 => + array ( + 'match' => '0B33 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AB \\1', + ), + 212 => + array ( + 'match' => '0B35 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AC \\1', + ), + 213 => + array ( + 'match' => '0B36 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AD \\1', + ), + 214 => + array ( + 'match' => '0B37 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AE \\1', + ), + 215 => + array ( + 'match' => '0B38 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AF \\1', + ), + 216 => + array ( + 'match' => '0B39 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0B0 \\1', + ), + 217 => + array ( + 'match' => 'E003 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0B1 \\1', + ), + 218 => + array ( + 'match' => 'E004 (0B3C (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0B2 \\1', + ), + 219 => + array ( + 'match' => '0B15 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E090 \\1', + ), + 220 => + array ( + 'match' => '0B16 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E091 \\1', + ), + 221 => + array ( + 'match' => '0B17 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E092 \\1', + ), + 222 => + array ( + 'match' => '0B18 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E093 \\1', + ), + 223 => + array ( + 'match' => '0B19 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E094 \\1', + ), + 224 => + array ( + 'match' => '0B1A (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E095 \\1', + ), + 225 => + array ( + 'match' => '0B1B (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E096 \\1', + ), + 226 => + array ( + 'match' => '0B1C (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E097 \\1', + ), + 227 => + array ( + 'match' => '0B1D (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E098 \\1', + ), + 228 => + array ( + 'match' => '0B1E (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E099 \\1', + ), + 229 => + array ( + 'match' => '0B1F (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09A \\1', + ), + 230 => + array ( + 'match' => '0B20 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09B \\1', + ), + 231 => + array ( + 'match' => '0B21 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09C \\1', + ), + 232 => + array ( + 'match' => '0B22 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09D \\1', + ), + 233 => + array ( + 'match' => '0B23 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09E \\1', + ), + 234 => + array ( + 'match' => '0B24 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E09F \\1', + ), + 235 => + array ( + 'match' => '0B25 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A0 \\1', + ), + 236 => + array ( + 'match' => '0B26 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A1 \\1', + ), + 237 => + array ( + 'match' => '0B27 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A2 \\1', + ), + 238 => + array ( + 'match' => '0B28 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A3 \\1', + ), + 239 => + array ( + 'match' => '0B2A (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A4 \\1', + ), + 240 => + array ( + 'match' => '0B2B (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A5 \\1', + ), + 241 => + array ( + 'match' => '0B2C (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A6 \\1', + ), + 242 => + array ( + 'match' => '0B2D (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A7 \\1', + ), + 243 => + array ( + 'match' => '0B2E (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A8 \\1', + ), + 244 => + array ( + 'match' => '0B2F (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0A9 \\1', + ), + 245 => + array ( + 'match' => '0B32 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AA \\1', + ), + 246 => + array ( + 'match' => '0B33 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AB \\1', + ), + 247 => + array ( + 'match' => '0B35 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AC \\1', + ), + 248 => + array ( + 'match' => '0B36 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AD \\1', + ), + 249 => + array ( + 'match' => '0B37 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AE \\1', + ), + 250 => + array ( + 'match' => '0B38 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0AF \\1', + ), + 251 => + array ( + 'match' => '0B39 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0B0 \\1', + ), + 252 => + array ( + 'match' => 'E003 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0B1 \\1', + ), + 253 => + array ( + 'match' => 'E004 (E069 (E07B|E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E11E|E11F|E120|E121|E122|E11B|E11C))', + 'replace' => 'E0B2 \\1', + ), + 254 => + array ( + 'match' => '0B25 0B3F', + 'replace' => 'E02D', + ), + 255 => + array ( + 'match' => '0B27 0B3F', + 'replace' => 'E02E', + ), + 256 => + array ( + 'match' => '0B16 0B3F', + 'replace' => 'E02F', + ), + 257 => + array ( + 'match' => '(0B3C) 0B4D', + 'replace' => '\\1 E063', + ), + 258 => + array ( + 'match' => '(0B3C) E075', + 'replace' => '\\1 E076', + ), + 259 => + array ( + 'match' => '2018', + 'replace' => '0B4D', + ), + 260 => + array ( + 'match' => '2019', + 'replace' => '0B4D', + ), + 261 => + array ( + 'match' => '((0B16|0B17|0B18|0B1F|0B23|0B25|0B27|0B2A|0B2B|0B2E|0B2F|0B37|0B38)) 0B01', + 'replace' => '\\1 E039', + ), + 262 => + array ( + 'match' => '((E003|E006|E007|E008|E019|E01A|E00F|E010|E015|E01B|E024|E026|E027|E029|E14A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E034|E035|E036|E037)) 0B01', + 'replace' => '\\1 E039', + ), + 263 => + array ( + 'match' => '0B3F 0B01', + 'replace' => 'E041', + ), + 264 => + array ( + 'match' => 'E03F 0B01', + 'replace' => 'E041', + ), + 265 => + array ( + 'match' => 'E040 0B01', + 'replace' => 'E042', + ), + 266 => + array ( + 'match' => '0B40 0B01', + 'replace' => 'E044', + ), + 267 => + array ( + 'match' => '0B57 0B01', + 'replace' => 'E068', + ), + 268 => + array ( + 'match' => '0B56 0B01', + 'replace' => 'E064', + ), + 269 => + array ( + 'match' => 'E05D 0B01', + 'replace' => 'E064', + ), + 270 => + array ( + 'match' => 'E05E 0B01', + 'replace' => 'E065', + ), + 271 => + array ( + 'match' => 'E05F 0B01', + 'replace' => 'E066', + ), + 272 => + array ( + 'match' => 'E060 0B01', + 'replace' => 'E067', + ), + 273 => + array ( + 'match' => 'E06D 0B01', + 'replace' => 'E089', + ), + 274 => + array ( + 'match' => 'E06E 0B01', + 'replace' => 'E08A', + ), + 275 => + array ( + 'match' => 'E070 0B01', + 'replace' => 'E08C', + ), + 276 => + array ( + 'match' => 'E071 0B01', + 'replace' => 'E08D', + ), + 277 => + array ( + 'match' => 'E072 0B01', + 'replace' => 'E08E', + ), + 278 => + array ( + 'match' => 'E074 0B01', + 'replace' => 'E08F', + ), + 279 => + array ( + 'match' => '((E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FC|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E07B|E084)) 0B3C', + 'replace' => '\\1 E03C', + ), + 280 => + array ( + 'match' => '((E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FC|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E07B|E084)) 0B41', + 'replace' => '\\1 E048', + ), + 281 => + array ( + 'match' => '((E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FC|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E07B|E084)) 0B42', + 'replace' => '\\1 E04B', + ), + 282 => + array ( + 'match' => '((E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FC|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E07B|E084)) 0B43', + 'replace' => '\\1 E04F', + ), + 283 => + array ( + 'match' => '((E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FC|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E07B|E084)) E053', + 'replace' => '\\1 E054', + ), + 284 => + array ( + 'match' => '((E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FC|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E07B|E084)) E056', + 'replace' => '\\1 E057', + ), + 285 => + array ( + 'match' => '((E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FC|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E07B|E084)) E059', + 'replace' => '\\1 E05A', + ), + 286 => + array ( + 'match' => '((E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FC|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E07B|E084)) 0B4D', + 'replace' => '\\1 E062', + ), + 287 => + array ( + 'match' => '((E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FC|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E07B|E084)) E075', + 'replace' => '\\1 E076', + ), + 288 => + array ( + 'match' => '((E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FC|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E07B|E084)) E07B', + 'replace' => '\\1 E07C', + ), + 289 => + array ( + 'match' => '((E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FC|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E07B|E084)) E07D', + 'replace' => '\\1 E07F', + ), + 290 => + array ( + 'match' => '((E0F6|E0F7|E0F8|E0F9|E0FA|E0FB|E0FC|E0FD|E0FE|E0FF|E100|E101|E102|E103|E104|E105|E106|E107|E108|E109|E10A|E10B|E10C|E10D|E10E|E10F|E110|E111|E112|E113|E114|E115|E116|E117|E118|E119|E11A|E11B|E11C|E11D|E07B|E084)) E082', + 'replace' => '\\1 E083', + ), + 291 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037)) 0B3C', + 'replace' => '\\1 E03C', + ), + 292 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037)) 0B41', + 'replace' => '\\1 E048', + ), + 293 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037)) 0B42', + 'replace' => '\\1 E04B', + ), + 294 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037)) 0B43', + 'replace' => '\\1 E04F', + ), + 295 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037)) E053', + 'replace' => '\\1 E054', + ), + 296 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037)) E056', + 'replace' => '\\1 E057', + ), + 297 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037)) E059', + 'replace' => '\\1 E05A', + ), + 298 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037)) 0B4D', + 'replace' => '\\1 E062', + ), + 299 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037)) E075', + 'replace' => '\\1 E076', + ), + 300 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037)) E07B', + 'replace' => '\\1 E07C', + ), + 301 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037)) E07D', + 'replace' => '\\1 E07F', + ), + 302 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037)) E082', + 'replace' => '\\1 E083', + ), + 303 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069) 0B3C', + 'replace' => '\\1 E03C', + ), + 304 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069) 0B41', + 'replace' => '\\1 E048', + ), + 305 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069) 0B42', + 'replace' => '\\1 E04B', + ), + 306 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069) 0B43', + 'replace' => '\\1 E04F', + ), + 307 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069) E053', + 'replace' => '\\1 E054', + ), + 308 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069) E056', + 'replace' => '\\1 E057', + ), + 309 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069) E059', + 'replace' => '\\1 E05A', + ), + 310 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069) 0B4D', + 'replace' => '\\1 E062', + ), + 311 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069) E075', + 'replace' => '\\1 E076', + ), + 312 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069) E07B', + 'replace' => '\\1 E07C', + ), + 313 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069) E07D', + 'replace' => '\\1 E07F', + ), + 314 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069) E082', + 'replace' => '\\1 E083', + ), + 315 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069 0B01) 0B3C', + 'replace' => '\\1 E03C', + ), + 316 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069 0B01) 0B41', + 'replace' => '\\1 E048', + ), + 317 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069 0B01) 0B42', + 'replace' => '\\1 E04B', + ), + 318 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069 0B01) 0B43', + 'replace' => '\\1 E04F', + ), + 319 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069 0B01) E053', + 'replace' => '\\1 E054', + ), + 320 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069 0B01) E056', + 'replace' => '\\1 E057', + ), + 321 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069 0B01) E059', + 'replace' => '\\1 E05A', + ), + 322 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069 0B01) 0B4D', + 'replace' => '\\1 E062', + ), + 323 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069 0B01) E075', + 'replace' => '\\1 E076', + ), + 324 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069 0B01) E07B', + 'replace' => '\\1 E07C', + ), + 325 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069 0B01) E07D', + 'replace' => '\\1 E07F', + ), + 326 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037) E069 0B01) E082', + 'replace' => '\\1 E083', + ), + 327 => + array ( + 'match' => '(E02B) 0B3C', + 'replace' => '\\1 E03C', + ), + 328 => + array ( + 'match' => '(E02B) 0B41', + 'replace' => '\\1 E048', + ), + 329 => + array ( + 'match' => '(E02B) 0B42', + 'replace' => '\\1 E04B', + ), + 330 => + array ( + 'match' => '(E02B) 0B43', + 'replace' => '\\1 E04F', + ), + 331 => + array ( + 'match' => '(E02B) E053', + 'replace' => '\\1 E054', + ), + 332 => + array ( + 'match' => '(E02B) E056', + 'replace' => '\\1 E057', + ), + 333 => + array ( + 'match' => '(E02B) E059', + 'replace' => '\\1 E05A', + ), + 334 => + array ( + 'match' => '(E02B) 0B4D', + 'replace' => '\\1 E062', + ), + 335 => + array ( + 'match' => '(E02B) E075', + 'replace' => '\\1 E076', + ), + 336 => + array ( + 'match' => '(E02B) E07B', + 'replace' => '\\1 E07C', + ), + 337 => + array ( + 'match' => '(E02B) E07D', + 'replace' => '\\1 E07F', + ), + 338 => + array ( + 'match' => '(E02B) E082', + 'replace' => '\\1 E083', + ), + 339 => + array ( + 'match' => '(E02C) 0B3C', + 'replace' => '\\1 E03C', + ), + 340 => + array ( + 'match' => '(E02C) 0B41', + 'replace' => '\\1 E048', + ), + 341 => + array ( + 'match' => '(E02C) 0B42', + 'replace' => '\\1 E04B', + ), + 342 => + array ( + 'match' => '(E02C) 0B43', + 'replace' => '\\1 E04F', + ), + 343 => + array ( + 'match' => '(E02C) E053', + 'replace' => '\\1 E054', + ), + 344 => + array ( + 'match' => '(E02C) E056', + 'replace' => '\\1 E057', + ), + 345 => + array ( + 'match' => '(E02C) E059', + 'replace' => '\\1 E05A', + ), + 346 => + array ( + 'match' => '(E02C) 0B4D', + 'replace' => '\\1 E062', + ), + 347 => + array ( + 'match' => '(E02C) E075', + 'replace' => '\\1 E076', + ), + 348 => + array ( + 'match' => '(E02C) E07B', + 'replace' => '\\1 E07C', + ), + 349 => + array ( + 'match' => '(E02C) E07D', + 'replace' => '\\1 E07F', + ), + 350 => + array ( + 'match' => '(E02C) E082', + 'replace' => '\\1 E083', + ), + 351 => + array ( + 'match' => '(E06B) 0B3C', + 'replace' => '\\1 E03C', + ), + 352 => + array ( + 'match' => '(E06B) 0B41', + 'replace' => '\\1 E048', + ), + 353 => + array ( + 'match' => '(E06B) 0B42', + 'replace' => '\\1 E04B', + ), + 354 => + array ( + 'match' => '(E06B) 0B43', + 'replace' => '\\1 E04F', + ), + 355 => + array ( + 'match' => '(E06B) E053', + 'replace' => '\\1 E054', + ), + 356 => + array ( + 'match' => '(E06B) E056', + 'replace' => '\\1 E057', + ), + 357 => + array ( + 'match' => '(E06B) E059', + 'replace' => '\\1 E05A', + ), + 358 => + array ( + 'match' => '(E06B) 0B4D', + 'replace' => '\\1 E062', + ), + 359 => + array ( + 'match' => '(E06B) E075', + 'replace' => '\\1 E076', + ), + 360 => + array ( + 'match' => '(E06B) E07B', + 'replace' => '\\1 E07C', + ), + 361 => + array ( + 'match' => '(E06B) E07D', + 'replace' => '\\1 E07F', + ), + 362 => + array ( + 'match' => '(E06B) E082', + 'replace' => '\\1 E083', + ), + 363 => + array ( + 'match' => '(0B3C) 0B3C', + 'replace' => '\\1 E03C', + ), + 364 => + array ( + 'match' => '(0B3C) 0B41', + 'replace' => '\\1 E048', + ), + 365 => + array ( + 'match' => '(0B3C) 0B42', + 'replace' => '\\1 E04B', + ), + 366 => + array ( + 'match' => '(0B3C) 0B43', + 'replace' => '\\1 E04F', + ), + 367 => + array ( + 'match' => '(0B3C) E053', + 'replace' => '\\1 E054', + ), + 368 => + array ( + 'match' => '(0B3C) E056', + 'replace' => '\\1 E057', + ), + 369 => + array ( + 'match' => '(0B3C) E059', + 'replace' => '\\1 E05A', + ), + 370 => + array ( + 'match' => '(0B3C) 0B4D', + 'replace' => '\\1 E062', + ), + 371 => + array ( + 'match' => '(0B3C) E075', + 'replace' => '\\1 E076', + ), + 372 => + array ( + 'match' => '(0B3C) E07B', + 'replace' => '\\1 E07C', + ), + 373 => + array ( + 'match' => '(0B3C) E07D', + 'replace' => '\\1 E07F', + ), + 374 => + array ( + 'match' => '(0B3C) E082', + 'replace' => '\\1 E083', + ), + 375 => + array ( + 'match' => '(E075) 0B3C', + 'replace' => '\\1 E03C', + ), + 376 => + array ( + 'match' => '(E075) 0B41', + 'replace' => '\\1 E048', + ), + 377 => + array ( + 'match' => '(E075) 0B42', + 'replace' => '\\1 E04B', + ), + 378 => + array ( + 'match' => '(E075) 0B43', + 'replace' => '\\1 E04F', + ), + 379 => + array ( + 'match' => '(E075) E053', + 'replace' => '\\1 E054', + ), + 380 => + array ( + 'match' => '(E075) E056', + 'replace' => '\\1 E057', + ), + 381 => + array ( + 'match' => '(E075) E059', + 'replace' => '\\1 E05A', + ), + 382 => + array ( + 'match' => '(E075) 0B4D', + 'replace' => '\\1 E062', + ), + 383 => + array ( + 'match' => '(E075) E075', + 'replace' => '\\1 E076', + ), + 384 => + array ( + 'match' => '(E075) E07B', + 'replace' => '\\1 E07C', + ), + 385 => + array ( + 'match' => '(E075) E07D', + 'replace' => '\\1 E07F', + ), + 386 => + array ( + 'match' => '(E075) E082', + 'replace' => '\\1 E083', + ), + 387 => + array ( + 'match' => '(E075) 0B41', + 'replace' => '\\1 E048', + ), + 388 => + array ( + 'match' => '(E075) 0B42', + 'replace' => '\\1 E04B', + ), + 389 => + array ( + 'match' => '(E075) 0B43', + 'replace' => '\\1 E04F', + ), + 390 => + array ( + 'match' => '(E075) E053', + 'replace' => '\\1 E054', + ), + 391 => + array ( + 'match' => '(E075) E056', + 'replace' => '\\1 E057', + ), + 392 => + array ( + 'match' => '(E075) E059', + 'replace' => '\\1 E05A', + ), + 393 => + array ( + 'match' => 'E14D 0B01', + 'replace' => 'E08B', + ), + 394 => + array ( + 'match' => 'E14D E038', + 'replace' => 'E08B', + ), + 395 => + array ( + 'match' => 'E14D E039', + 'replace' => 'E08B', + ), + 396 => + array ( + 'match' => 'E14D E149', + 'replace' => 'E08B', + ), + 397 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037)) E0FD', + 'replace' => '\\1 E11E', + ), + 398 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037)) E109', + 'replace' => '\\1 E121', + ), + 399 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037)) E110', + 'replace' => '\\1 E11F', + ), + 400 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037)) E111', + 'replace' => '\\1 E120', + ), + 401 => + array ( + 'match' => '((E00E|E00F|E010|E011|E012|E013|E01B|E01C|E01E|E01F|E020|E023|E024|E025|E026|E027|E028|E029|E02A|E02B|E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037)) E11C', + 'replace' => '\\1 E122', + ), + 402 => + array ( + 'match' => '(E076) 0B41', + 'replace' => '\\1 E048', + ), + 403 => + array ( + 'match' => '(E076) 0B42', + 'replace' => '\\1 E04B', + ), + 404 => + array ( + 'match' => '(E076) 0B43', + 'replace' => '\\1 E04F', + ), + 405 => + array ( + 'match' => '(E076) E053', + 'replace' => '\\1 E054', + ), + 406 => + array ( + 'match' => '(E076) E056', + 'replace' => '\\1 E057', + ), + 407 => + array ( + 'match' => '(E076) E059', + 'replace' => '\\1 E05A', + ), + 408 => + array ( + 'match' => '(E076) 0B4D', + 'replace' => '\\1 E062', + ), + 409 => + array ( + 'match' => '(E090) E10E', + 'replace' => '\\1 E11C', + ), + 410 => + array ( + 'match' => '(E0B1) E10E', + 'replace' => '\\1 E11C', + ), + 411 => + array ( + 'match' => '(E09F) E10E', + 'replace' => '\\1 E11C', + ), + 412 => + array ( + 'match' => '(E092) E10E', + 'replace' => '\\1 E11C', + ), + 413 => + array ( + 'match' => '(E0A8) E10E', + 'replace' => '\\1 E11C', + ), + 414 => + array ( + 'match' => '(E0A3) E106', + 'replace' => '\\1 E0FC', + ), + 415 => + array ( + 'match' => '(E0AF) E106', + 'replace' => '\\1 E0FC', + ), + 416 => + array ( + 'match' => '((0B16|0B17|0B18|0B1F|0B23|0B25|0B27|0B2A|0B2B|0B2E|0B2F|0B37|0B38)) 0B01', + 'replace' => '\\1 E039', + ), + 417 => + array ( + 'match' => '(0B10) 0B01', + 'replace' => '\\1 E149', + ), + 418 => + array ( + 'match' => '(0B14) 0B01', + 'replace' => '\\1 E149', + ), + 419 => + array ( + 'match' => '(E069) 0B01', + 'replace' => '\\1 E149', + ), + 420 => + array ( + 'match' => '(E06A) 0B01', + 'replace' => '\\1 E149', + ), + 421 => + array ( + 'match' => '(E06B) 0B01', + 'replace' => '\\1 E149', + ), + 422 => + array ( + 'match' => '(E06C) 0B01', + 'replace' => '\\1 E149', + ), + 423 => + array ( + 'match' => '0B21 0B4D (E035)', + 'replace' => 'E12F \\1', + ), + 424 => + array ( + 'match' => ' (E035)', + 'replace' => ' \\1', + ), + 425 => + array ( + 'match' => ' (E035)', + 'replace' => ' \\1', + ), + 426 => + array ( + 'match' => ' (E035)', + 'replace' => ' \\1', + ), + 427 => + array ( + 'match' => ' (E035)', + 'replace' => ' \\1', + ), + 428 => + array ( + 'match' => ' (E035)', + 'replace' => ' \\1', + ), +); +?> \ No newline at end of file diff --git a/application/third_party/mpdf/includes/ind_pa_1_001.volt.php b/application/third_party/mpdf/includes/ind_pa_1_001.volt.php new file mode 100644 index 0000000..8404deb --- /dev/null +++ b/application/third_party/mpdf/includes/ind_pa_1_001.volt.php @@ -0,0 +1,1444 @@ +<?php + $volt = array ( + 0 => + array ( + 'match' => '0A4D 200C', + 'replace' => 'E055', + ), + 1 => + array ( + 'match' => '0A4D 200D', + 'replace' => 'E057', + ), + 2 => + array ( + 'match' => '((0A15|0A16|0A17|0A18|0A19|0A1A|0A1B|0A1C|0A1D|0A1E|0A1F|0A20|0A21|0A22|0A23|0A24|0A25|0A26|0A27|0A28|0A2A|0A2B|0A2C|0A2D|0A2E|0A2F|0A30|0A32|0A33|0A35|0A36|0A38|0A39|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E051|E052|E053|E054|0A59|0A5A|0A5B|0A5C|0A5E)) 0A4D', + 'replace' => '\\1 E056', + ), + 3 => + array ( + 'match' => '(200D) 0A4D', + 'replace' => '\\1 E056', + ), + 4 => + array ( + 'match' => '(0020) 0A4D', + 'replace' => '\\1 E056', + ), + 5 => + array ( + 'match' => '(25CC) 0A4D', + 'replace' => '\\1 E056', + ), + 6 => + array ( + 'match' => '200D E056', + 'replace' => 'E056', + ), + 7 => + array ( + 'match' => '0A05 0A3C', + 'replace' => 'E02A', + ), + 8 => + array ( + 'match' => '0A06 0A3C', + 'replace' => 'E02B', + ), + 9 => + array ( + 'match' => '0A07 0A3C', + 'replace' => 'E02C', + ), + 10 => + array ( + 'match' => '0A08 0A3C', + 'replace' => 'E02D', + ), + 11 => + array ( + 'match' => '0A09 0A3C', + 'replace' => 'E02E', + ), + 12 => + array ( + 'match' => '0A0A 0A3C', + 'replace' => 'E02F', + ), + 13 => + array ( + 'match' => '0A0F 0A3C', + 'replace' => 'E030', + ), + 14 => + array ( + 'match' => '0A10 0A3C', + 'replace' => 'E031', + ), + 15 => + array ( + 'match' => '0A13 0A3C', + 'replace' => 'E032', + ), + 16 => + array ( + 'match' => '0A14 0A3C', + 'replace' => 'E033', + ), + 17 => + array ( + 'match' => '0A15 0A3C', + 'replace' => 'E034', + ), + 18 => + array ( + 'match' => '0A16 0A3C', + 'replace' => 'E035', + ), + 19 => + array ( + 'match' => '0A17 0A3C', + 'replace' => 'E036', + ), + 20 => + array ( + 'match' => '0A18 0A3C', + 'replace' => 'E037', + ), + 21 => + array ( + 'match' => '0A19 0A3C', + 'replace' => 'E038', + ), + 22 => + array ( + 'match' => '0A1A 0A3C', + 'replace' => 'E039', + ), + 23 => + array ( + 'match' => '0A1B 0A3C', + 'replace' => 'E03A', + ), + 24 => + array ( + 'match' => '0A1C 0A3C', + 'replace' => 'E03B', + ), + 25 => + array ( + 'match' => '0A1D 0A3C', + 'replace' => 'E03C', + ), + 26 => + array ( + 'match' => '0A1E 0A3C', + 'replace' => 'E03D', + ), + 27 => + array ( + 'match' => '0A1F 0A3C', + 'replace' => 'E03E', + ), + 28 => + array ( + 'match' => '0A20 0A3C', + 'replace' => 'E03F', + ), + 29 => + array ( + 'match' => '0A21 0A3C', + 'replace' => 'E040', + ), + 30 => + array ( + 'match' => '0A22 0A3C', + 'replace' => 'E041', + ), + 31 => + array ( + 'match' => '0A23 0A3C', + 'replace' => 'E042', + ), + 32 => + array ( + 'match' => '0A24 0A3C', + 'replace' => 'E043', + ), + 33 => + array ( + 'match' => '0A25 0A3C', + 'replace' => 'E044', + ), + 34 => + array ( + 'match' => '0A26 0A3C', + 'replace' => 'E045', + ), + 35 => + array ( + 'match' => '0A27 0A3C', + 'replace' => 'E046', + ), + 36 => + array ( + 'match' => '0A28 0A3C', + 'replace' => 'E047', + ), + 37 => + array ( + 'match' => '0A2A 0A3C', + 'replace' => 'E048', + ), + 38 => + array ( + 'match' => '0A2B 0A3C', + 'replace' => 'E049', + ), + 39 => + array ( + 'match' => '0A2C 0A3C', + 'replace' => 'E04A', + ), + 40 => + array ( + 'match' => '0A2D 0A3C', + 'replace' => 'E04B', + ), + 41 => + array ( + 'match' => '0A2E 0A3C', + 'replace' => 'E04C', + ), + 42 => + array ( + 'match' => '0A2F 0A3C', + 'replace' => 'E04D', + ), + 43 => + array ( + 'match' => '0A30 0A3C', + 'replace' => 'E04E', + ), + 44 => + array ( + 'match' => '0A32 0A3C', + 'replace' => 'E04F', + ), + 45 => + array ( + 'match' => '0A33 0A3C', + 'replace' => 'E050', + ), + 46 => + array ( + 'match' => '0A35 0A3C', + 'replace' => 'E051', + ), + 47 => + array ( + 'match' => '0A36 0A3C', + 'replace' => 'E052', + ), + 48 => + array ( + 'match' => '0A38 0A3C', + 'replace' => 'E053', + ), + 49 => + array ( + 'match' => '0A39 0A3C', + 'replace' => 'E054', + ), + 50 => + array ( + 'match' => 'E056 0A15', + 'replace' => 'E07B', + ), + 51 => + array ( + 'match' => 'E056 0A16', + 'replace' => 'E07C', + ), + 52 => + array ( + 'match' => 'E056 0A17', + 'replace' => 'E07D', + ), + 53 => + array ( + 'match' => 'E056 0A18', + 'replace' => 'E07E', + ), + 54 => + array ( + 'match' => 'E056 0A19', + 'replace' => 'E07F', + ), + 55 => + array ( + 'match' => 'E056 0A1A', + 'replace' => 'E080', + ), + 56 => + array ( + 'match' => 'E056 0A1B', + 'replace' => 'E081', + ), + 57 => + array ( + 'match' => 'E056 0A1C', + 'replace' => 'E082', + ), + 58 => + array ( + 'match' => 'E056 0A1D', + 'replace' => 'E083', + ), + 59 => + array ( + 'match' => 'E056 0A1E', + 'replace' => 'E084', + ), + 60 => + array ( + 'match' => 'E056 0A1F', + 'replace' => 'E085', + ), + 61 => + array ( + 'match' => 'E056 0A20', + 'replace' => 'E086', + ), + 62 => + array ( + 'match' => 'E056 0A21', + 'replace' => 'E087', + ), + 63 => + array ( + 'match' => 'E056 0A22', + 'replace' => 'E088', + ), + 64 => + array ( + 'match' => 'E056 0A23', + 'replace' => 'E089', + ), + 65 => + array ( + 'match' => 'E056 0A24', + 'replace' => 'E08A', + ), + 66 => + array ( + 'match' => 'E056 0A25', + 'replace' => 'E08B', + ), + 67 => + array ( + 'match' => 'E056 0A26', + 'replace' => 'E08C', + ), + 68 => + array ( + 'match' => 'E056 0A27', + 'replace' => 'E08D', + ), + 69 => + array ( + 'match' => 'E056 0A28', + 'replace' => 'E08E', + ), + 70 => + array ( + 'match' => 'E056 0A2A', + 'replace' => 'E08F', + ), + 71 => + array ( + 'match' => 'E056 0A2B', + 'replace' => 'E090', + ), + 72 => + array ( + 'match' => 'E056 0A2C', + 'replace' => 'E091', + ), + 73 => + array ( + 'match' => 'E056 0A2D', + 'replace' => 'E092', + ), + 74 => + array ( + 'match' => 'E056 0A2E', + 'replace' => 'E093', + ), + 75 => + array ( + 'match' => 'E056 0A2F', + 'replace' => 'E094', + ), + 76 => + array ( + 'match' => 'E056 0A30', + 'replace' => 'E095', + ), + 77 => + array ( + 'match' => 'E056 0A32', + 'replace' => 'E096', + ), + 78 => + array ( + 'match' => 'E056 0A35', + 'replace' => 'E097', + ), + 79 => + array ( + 'match' => 'E056 0A36', + 'replace' => 'E098', + ), + 80 => + array ( + 'match' => 'E056 0A38', + 'replace' => 'E099', + ), + 81 => + array ( + 'match' => 'E056 0A39', + 'replace' => 'E09A', + ), + 82 => + array ( + 'match' => 'E056 0A59', + 'replace' => 'E09B', + ), + 83 => + array ( + 'match' => 'E056 0A5A', + 'replace' => 'E09C', + ), + 84 => + array ( + 'match' => 'E056 0A5B', + 'replace' => 'E09D', + ), + 85 => + array ( + 'match' => 'E056 0A5C', + 'replace' => 'E09E', + ), + 86 => + array ( + 'match' => 'E056 0A5E', + 'replace' => 'E09F', + ), + 87 => + array ( + 'match' => 'E056 0A33', + 'replace' => 'E0BB', + ), + 88 => + array ( + 'match' => 'E07B ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A15 \\1', + ), + 89 => + array ( + 'match' => 'E07C ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A16 \\1', + ), + 90 => + array ( + 'match' => 'E07D ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A17 \\1', + ), + 91 => + array ( + 'match' => 'E07E ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A18 \\1', + ), + 92 => + array ( + 'match' => 'E07F ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A19 \\1', + ), + 93 => + array ( + 'match' => 'E080 ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A1A \\1', + ), + 94 => + array ( + 'match' => 'E081 ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A1B \\1', + ), + 95 => + array ( + 'match' => 'E082 ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A1C \\1', + ), + 96 => + array ( + 'match' => 'E083 ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A1D \\1', + ), + 97 => + array ( + 'match' => 'E084 ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A1E \\1', + ), + 98 => + array ( + 'match' => 'E085 ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A1F \\1', + ), + 99 => + array ( + 'match' => 'E086 ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A20 \\1', + ), + 100 => + array ( + 'match' => 'E087 ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A21 \\1', + ), + 101 => + array ( + 'match' => 'E088 ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A22 \\1', + ), + 102 => + array ( + 'match' => 'E089 ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A23 \\1', + ), + 103 => + array ( + 'match' => 'E08A ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A24 \\1', + ), + 104 => + array ( + 'match' => 'E08B ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A25 \\1', + ), + 105 => + array ( + 'match' => 'E08C ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A26 \\1', + ), + 106 => + array ( + 'match' => 'E08D ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A27 \\1', + ), + 107 => + array ( + 'match' => 'E08E ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A28 \\1', + ), + 108 => + array ( + 'match' => 'E08F ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A2A \\1', + ), + 109 => + array ( + 'match' => 'E090 ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A2B \\1', + ), + 110 => + array ( + 'match' => 'E091 ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A2C \\1', + ), + 111 => + array ( + 'match' => 'E092 ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A2D \\1', + ), + 112 => + array ( + 'match' => 'E093 ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A2E \\1', + ), + 113 => + array ( + 'match' => 'E094 ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A2F \\1', + ), + 114 => + array ( + 'match' => 'E095 ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A30 \\1', + ), + 115 => + array ( + 'match' => 'E096 ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A32 \\1', + ), + 116 => + array ( + 'match' => 'E097 ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A35 \\1', + ), + 117 => + array ( + 'match' => 'E098 ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A36 \\1', + ), + 118 => + array ( + 'match' => 'E099 ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A38 \\1', + ), + 119 => + array ( + 'match' => 'E09A ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A39 \\1', + ), + 120 => + array ( + 'match' => 'E09B ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A59 \\1', + ), + 121 => + array ( + 'match' => 'E09C ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A5A \\1', + ), + 122 => + array ( + 'match' => 'E09D ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A5B \\1', + ), + 123 => + array ( + 'match' => 'E09E ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A5C \\1', + ), + 124 => + array ( + 'match' => 'E09F ((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F))', + 'replace' => '0A4D 0A5E \\1', + ), + 125 => + array ( + 'match' => '(0A3F (0A15|0A16|0A17|0A18|0A19|0A1A|0A1B|0A1C|0A1D|0A1E|0A1F|0A20|0A21|0A22|0A23|0A24|0A25|0A26|0A27|0A28|0A2A|0A2B|0A2C|0A2D|0A2E|0A2F|0A30|0A32|0A33|0A35|0A36|0A38|0A39|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E051|E052|E053|E054|0A59|0A5A|0A5B|0A5C|0A5E)) 0A4D', + 'replace' => '\\1 0A4D 0A3F', + ), + 126 => + array ( + 'match' => '0A3F 0A15 (0A4D 0A3F)', + 'replace' => '0A15 \\1', + ), + 127 => + array ( + 'match' => '0A3F 0A16 (0A4D 0A3F)', + 'replace' => '0A16 \\1', + ), + 128 => + array ( + 'match' => '0A3F 0A17 (0A4D 0A3F)', + 'replace' => '0A17 \\1', + ), + 129 => + array ( + 'match' => '0A3F 0A18 (0A4D 0A3F)', + 'replace' => '0A18 \\1', + ), + 130 => + array ( + 'match' => '0A3F 0A19 (0A4D 0A3F)', + 'replace' => '0A19 \\1', + ), + 131 => + array ( + 'match' => '0A3F 0A1A (0A4D 0A3F)', + 'replace' => '0A1A \\1', + ), + 132 => + array ( + 'match' => '0A3F 0A1B (0A4D 0A3F)', + 'replace' => '0A1B \\1', + ), + 133 => + array ( + 'match' => '0A3F 0A1C (0A4D 0A3F)', + 'replace' => '0A1C \\1', + ), + 134 => + array ( + 'match' => '0A3F 0A1D (0A4D 0A3F)', + 'replace' => '0A1D \\1', + ), + 135 => + array ( + 'match' => '0A3F 0A1E (0A4D 0A3F)', + 'replace' => '0A1E \\1', + ), + 136 => + array ( + 'match' => '0A3F 0A1F (0A4D 0A3F)', + 'replace' => '0A1F \\1', + ), + 137 => + array ( + 'match' => '0A3F 0A20 (0A4D 0A3F)', + 'replace' => '0A20 \\1', + ), + 138 => + array ( + 'match' => '0A3F 0A21 (0A4D 0A3F)', + 'replace' => '0A21 \\1', + ), + 139 => + array ( + 'match' => '0A3F 0A22 (0A4D 0A3F)', + 'replace' => '0A22 \\1', + ), + 140 => + array ( + 'match' => '0A3F 0A23 (0A4D 0A3F)', + 'replace' => '0A23 \\1', + ), + 141 => + array ( + 'match' => '0A3F 0A24 (0A4D 0A3F)', + 'replace' => '0A24 \\1', + ), + 142 => + array ( + 'match' => '0A3F 0A25 (0A4D 0A3F)', + 'replace' => '0A25 \\1', + ), + 143 => + array ( + 'match' => '0A3F 0A26 (0A4D 0A3F)', + 'replace' => '0A26 \\1', + ), + 144 => + array ( + 'match' => '0A3F 0A27 (0A4D 0A3F)', + 'replace' => '0A27 \\1', + ), + 145 => + array ( + 'match' => '0A3F 0A28 (0A4D 0A3F)', + 'replace' => '0A28 \\1', + ), + 146 => + array ( + 'match' => '0A3F 0A2A (0A4D 0A3F)', + 'replace' => '0A2A \\1', + ), + 147 => + array ( + 'match' => '0A3F 0A2B (0A4D 0A3F)', + 'replace' => '0A2B \\1', + ), + 148 => + array ( + 'match' => '0A3F 0A2C (0A4D 0A3F)', + 'replace' => '0A2C \\1', + ), + 149 => + array ( + 'match' => '0A3F 0A2D (0A4D 0A3F)', + 'replace' => '0A2D \\1', + ), + 150 => + array ( + 'match' => '0A3F 0A2E (0A4D 0A3F)', + 'replace' => '0A2E \\1', + ), + 151 => + array ( + 'match' => '0A3F 0A2F (0A4D 0A3F)', + 'replace' => '0A2F \\1', + ), + 152 => + array ( + 'match' => '0A3F 0A30 (0A4D 0A3F)', + 'replace' => '0A30 \\1', + ), + 153 => + array ( + 'match' => '0A3F 0A32 (0A4D 0A3F)', + 'replace' => '0A32 \\1', + ), + 154 => + array ( + 'match' => '0A3F 0A33 (0A4D 0A3F)', + 'replace' => '0A33 \\1', + ), + 155 => + array ( + 'match' => '0A3F 0A35 (0A4D 0A3F)', + 'replace' => '0A35 \\1', + ), + 156 => + array ( + 'match' => '0A3F 0A36 (0A4D 0A3F)', + 'replace' => '0A36 \\1', + ), + 157 => + array ( + 'match' => '0A3F 0A38 (0A4D 0A3F)', + 'replace' => '0A38 \\1', + ), + 158 => + array ( + 'match' => '0A3F 0A39 (0A4D 0A3F)', + 'replace' => '0A39 \\1', + ), + 159 => + array ( + 'match' => '0A3F E034 (0A4D 0A3F)', + 'replace' => 'E034 \\1', + ), + 160 => + array ( + 'match' => '0A3F E035 (0A4D 0A3F)', + 'replace' => 'E035 \\1', + ), + 161 => + array ( + 'match' => '0A3F E036 (0A4D 0A3F)', + 'replace' => 'E036 \\1', + ), + 162 => + array ( + 'match' => '0A3F E037 (0A4D 0A3F)', + 'replace' => 'E037 \\1', + ), + 163 => + array ( + 'match' => '0A3F E038 (0A4D 0A3F)', + 'replace' => 'E038 \\1', + ), + 164 => + array ( + 'match' => '0A3F E039 (0A4D 0A3F)', + 'replace' => 'E039 \\1', + ), + 165 => + array ( + 'match' => '0A3F E03A (0A4D 0A3F)', + 'replace' => 'E03A \\1', + ), + 166 => + array ( + 'match' => '0A3F E03B (0A4D 0A3F)', + 'replace' => 'E03B \\1', + ), + 167 => + array ( + 'match' => '0A3F E03C (0A4D 0A3F)', + 'replace' => 'E03C \\1', + ), + 168 => + array ( + 'match' => '0A3F E03D (0A4D 0A3F)', + 'replace' => 'E03D \\1', + ), + 169 => + array ( + 'match' => '0A3F E03E (0A4D 0A3F)', + 'replace' => 'E03E \\1', + ), + 170 => + array ( + 'match' => '0A3F E03F (0A4D 0A3F)', + 'replace' => 'E03F \\1', + ), + 171 => + array ( + 'match' => '0A3F E040 (0A4D 0A3F)', + 'replace' => 'E040 \\1', + ), + 172 => + array ( + 'match' => '0A3F E041 (0A4D 0A3F)', + 'replace' => 'E041 \\1', + ), + 173 => + array ( + 'match' => '0A3F E042 (0A4D 0A3F)', + 'replace' => 'E042 \\1', + ), + 174 => + array ( + 'match' => '0A3F E043 (0A4D 0A3F)', + 'replace' => 'E043 \\1', + ), + 175 => + array ( + 'match' => '0A3F E044 (0A4D 0A3F)', + 'replace' => 'E044 \\1', + ), + 176 => + array ( + 'match' => '0A3F E045 (0A4D 0A3F)', + 'replace' => 'E045 \\1', + ), + 177 => + array ( + 'match' => '0A3F E046 (0A4D 0A3F)', + 'replace' => 'E046 \\1', + ), + 178 => + array ( + 'match' => '0A3F E047 (0A4D 0A3F)', + 'replace' => 'E047 \\1', + ), + 179 => + array ( + 'match' => '0A3F E048 (0A4D 0A3F)', + 'replace' => 'E048 \\1', + ), + 180 => + array ( + 'match' => '0A3F E049 (0A4D 0A3F)', + 'replace' => 'E049 \\1', + ), + 181 => + array ( + 'match' => '0A3F E04A (0A4D 0A3F)', + 'replace' => 'E04A \\1', + ), + 182 => + array ( + 'match' => '0A3F E04B (0A4D 0A3F)', + 'replace' => 'E04B \\1', + ), + 183 => + array ( + 'match' => '0A3F E04C (0A4D 0A3F)', + 'replace' => 'E04C \\1', + ), + 184 => + array ( + 'match' => '0A3F E04D (0A4D 0A3F)', + 'replace' => 'E04D \\1', + ), + 185 => + array ( + 'match' => '0A3F E04E (0A4D 0A3F)', + 'replace' => 'E04E \\1', + ), + 186 => + array ( + 'match' => '0A3F E04F (0A4D 0A3F)', + 'replace' => 'E04F \\1', + ), + 187 => + array ( + 'match' => '0A3F E050 (0A4D 0A3F)', + 'replace' => 'E050 \\1', + ), + 188 => + array ( + 'match' => '0A3F E051 (0A4D 0A3F)', + 'replace' => 'E051 \\1', + ), + 189 => + array ( + 'match' => '0A3F E052 (0A4D 0A3F)', + 'replace' => 'E052 \\1', + ), + 190 => + array ( + 'match' => '0A3F E053 (0A4D 0A3F)', + 'replace' => 'E053 \\1', + ), + 191 => + array ( + 'match' => '0A3F E054 (0A4D 0A3F)', + 'replace' => 'E054 \\1', + ), + 192 => + array ( + 'match' => '0A3F 0A59 (0A4D 0A3F)', + 'replace' => '0A59 \\1', + ), + 193 => + array ( + 'match' => '0A3F 0A5A (0A4D 0A3F)', + 'replace' => '0A5A \\1', + ), + 194 => + array ( + 'match' => '0A3F 0A5B (0A4D 0A3F)', + 'replace' => '0A5B \\1', + ), + 195 => + array ( + 'match' => '0A3F 0A5C (0A4D 0A3F)', + 'replace' => '0A5C \\1', + ), + 196 => + array ( + 'match' => '0A3F 0A5E (0A4D 0A3F)', + 'replace' => '0A5E \\1', + ), + 197 => + array ( + 'match' => 'E055', + 'replace' => '0A4D', + ), + 198 => + array ( + 'match' => 'E056', + 'replace' => '0A4D', + ), + 199 => + array ( + 'match' => 'E057', + 'replace' => '0A4D', + ), + 200 => + array ( + 'match' => '0A15 0A4D', + 'replace' => 'E004', + ), + 201 => + array ( + 'match' => '0A16 0A4D', + 'replace' => 'E005', + ), + 202 => + array ( + 'match' => '0A17 0A4D', + 'replace' => 'E006', + ), + 203 => + array ( + 'match' => '0A18 0A4D', + 'replace' => 'E007', + ), + 204 => + array ( + 'match' => '0A19 0A4D', + 'replace' => 'E008', + ), + 205 => + array ( + 'match' => '0A1A 0A4D', + 'replace' => 'E009', + ), + 206 => + array ( + 'match' => '0A1B 0A4D', + 'replace' => 'E00A', + ), + 207 => + array ( + 'match' => '0A1C 0A4D', + 'replace' => 'E00B', + ), + 208 => + array ( + 'match' => '0A1D 0A4D', + 'replace' => 'E00C', + ), + 209 => + array ( + 'match' => '0A1E 0A4D', + 'replace' => 'E00D', + ), + 210 => + array ( + 'match' => '0A1F 0A4D', + 'replace' => 'E00E', + ), + 211 => + array ( + 'match' => '0A20 0A4D', + 'replace' => 'E00F', + ), + 212 => + array ( + 'match' => '0A21 0A4D', + 'replace' => 'E010', + ), + 213 => + array ( + 'match' => '0A22 0A4D', + 'replace' => 'E011', + ), + 214 => + array ( + 'match' => '0A23 0A4D', + 'replace' => 'E012', + ), + 215 => + array ( + 'match' => '0A24 0A4D', + 'replace' => 'E013', + ), + 216 => + array ( + 'match' => '0A25 0A4D', + 'replace' => 'E014', + ), + 217 => + array ( + 'match' => '0A26 0A4D', + 'replace' => 'E015', + ), + 218 => + array ( + 'match' => '0A27 0A4D', + 'replace' => 'E016', + ), + 219 => + array ( + 'match' => '0A28 0A4D', + 'replace' => 'E017', + ), + 220 => + array ( + 'match' => '0A2A 0A4D', + 'replace' => 'E018', + ), + 221 => + array ( + 'match' => '0A2B 0A4D', + 'replace' => 'E019', + ), + 222 => + array ( + 'match' => '0A2C 0A4D', + 'replace' => 'E01A', + ), + 223 => + array ( + 'match' => '0A2D 0A4D', + 'replace' => 'E01B', + ), + 224 => + array ( + 'match' => '0A2E 0A4D', + 'replace' => 'E01C', + ), + 225 => + array ( + 'match' => '0A2F 0A4D', + 'replace' => 'E01D', + ), + 226 => + array ( + 'match' => '0A30 0A4D', + 'replace' => 'E01E', + ), + 227 => + array ( + 'match' => '0A32 0A4D', + 'replace' => 'E01F', + ), + 228 => + array ( + 'match' => '0A33 0A4D', + 'replace' => 'E020', + ), + 229 => + array ( + 'match' => '0A35 0A4D', + 'replace' => 'E021', + ), + 230 => + array ( + 'match' => '0A36 0A4D', + 'replace' => 'E022', + ), + 231 => + array ( + 'match' => '0A38 0A4D', + 'replace' => 'E023', + ), + 232 => + array ( + 'match' => '0A39 0A4D', + 'replace' => 'E024', + ), + 233 => + array ( + 'match' => '0A59 0A4D', + 'replace' => 'E025', + ), + 234 => + array ( + 'match' => '0A5A 0A4D', + 'replace' => 'E026', + ), + 235 => + array ( + 'match' => '0A5B 0A4D', + 'replace' => 'E027', + ), + 236 => + array ( + 'match' => '0A5C 0A4D', + 'replace' => 'E028', + ), + 237 => + array ( + 'match' => '0A5E 0A4D', + 'replace' => 'E029', + ), + 238 => + array ( + 'match' => '((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0BB)) 0A41', + 'replace' => '\\1 E002', + ), + 239 => + array ( + 'match' => '((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0BB)) 0A42', + 'replace' => '\\1 E003', + ), + 240 => + array ( + 'match' => '0A2F 0A4D', + 'replace' => 'E0A0', + ), + 241 => + array ( + 'match' => '0A09 0A02', + 'replace' => 'E0A1', + ), + 242 => + array ( + 'match' => '0A09 0A70', + 'replace' => 'E0A1', + ), + 243 => + array ( + 'match' => '0A0A 0A02', + 'replace' => 'E0A2', + ), + 244 => + array ( + 'match' => '0A0A 0A70', + 'replace' => 'E0A2', + ), + 245 => + array ( + 'match' => '0A13 0A02', + 'replace' => 'E0A3', + ), + 246 => + array ( + 'match' => '0A13 0A70', + 'replace' => 'E0A3', + ), + 247 => + array ( + 'match' => '0A05 0A02', + 'replace' => 'E0B4', + ), + 248 => + array ( + 'match' => '0A05 0A70', + 'replace' => 'E0B4', + ), + 249 => + array ( + 'match' => '0A06 0A02', + 'replace' => 'E0B5', + ), + 250 => + array ( + 'match' => '0A06 0A70', + 'replace' => 'E0B5', + ), + 251 => + array ( + 'match' => '0A07 0A02', + 'replace' => 'E0B6', + ), + 252 => + array ( + 'match' => '0A07 0A70', + 'replace' => 'E0B6', + ), + 253 => + array ( + 'match' => '0A08 0A02', + 'replace' => 'E0B7', + ), + 254 => + array ( + 'match' => '0A08 0A70', + 'replace' => 'E0B7', + ), + 255 => + array ( + 'match' => '0A0F 0A02', + 'replace' => 'E0B8', + ), + 256 => + array ( + 'match' => '0A0F 0A70', + 'replace' => 'E0B8', + ), + 257 => + array ( + 'match' => '0A10 0A02', + 'replace' => 'E0B9', + ), + 258 => + array ( + 'match' => '0A10 0A70', + 'replace' => 'E0B9', + ), + 259 => + array ( + 'match' => '0A14 0A02', + 'replace' => 'E0BA', + ), + 260 => + array ( + 'match' => '0A14 0A70', + 'replace' => 'E0BA', + ), + 261 => + array ( + 'match' => '((0A15|0A16|0A17|0A18|0A19|0A1A|0A1B|0A1C|0A1D|0A1E|0A1F|0A20|0A21|0A22|0A23|0A24|0A25|0A26|0A27|0A28|0A2A|0A2B|0A2C|0A2D|0A2E|0A2F|0A30|0A32|0A33|0A35|0A36|0A38|0A39|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E|E04F|E050|E051|E052|E053|E054|0A59|0A5A|0A5B|0A5C|0A5E)) 0A02', + 'replace' => '\\1 0A70', + ), + 262 => + array ( + 'match' => '((E004|E005|E006|E007|E008|E009|E00A|E00B|E00C|E00D|E00E|E00F|E010|E011|E012|E013|E014|E015|E016|E017|E018|E019|E01A|E01B|E01C|E01D|E01E|E01F|E020|E021|E022|E023|E024|E025|E026|E027|E028|E029|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071|E072|E073|E074|E075|E076|E077|E078|E079|E07A|E02A|E02C)) 0A02', + 'replace' => '\\1 0A70', + ), + 263 => + array ( + 'match' => '((E07B|E07C|E07D|E07E|E07F|E080|E081|E082|E083|E084|E085|E086|E087|E088|E089|E08A|E08B|E08C|E08D|E08E|E08F|E090|E091|E092|E093|E094|E095|E096|E097|E098|E099|E09A|E09B|E09C|E09D|E09E|E09F|E0BB)) 0A02', + 'replace' => '\\1 0A70', + ), + 264 => + array ( + 'match' => '(0A41) 0A02', + 'replace' => '\\1 0A70', + ), + 265 => + array ( + 'match' => '(0A42) 0A02', + 'replace' => '\\1 0A70', + ), + 266 => + array ( + 'match' => '(E002) 0A02', + 'replace' => '\\1 0A70', + ), + 267 => + array ( + 'match' => '(E003) 0A02', + 'replace' => '\\1 0A70', + ), + 268 => + array ( + 'match' => '0A3E 0A02', + 'replace' => 'E0A8', + ), + 269 => + array ( + 'match' => '0A3E 0A70', + 'replace' => 'E0A8', + ), + 270 => + array ( + 'match' => '0A40 0A02', + 'replace' => 'E0A9', + ), + 271 => + array ( + 'match' => '0A40 0A70', + 'replace' => 'E0A9', + ), + 272 => + array ( + 'match' => '0A47 0A02', + 'replace' => 'E0AA', + ), + 273 => + array ( + 'match' => '0A47 0A70', + 'replace' => 'E0AA', + ), + 274 => + array ( + 'match' => '0A48 0A02', + 'replace' => 'E0AB', + ), + 275 => + array ( + 'match' => '0A48 0A70', + 'replace' => 'E0AB', + ), + 276 => + array ( + 'match' => '0A4B 0A02', + 'replace' => 'E0AC', + ), + 277 => + array ( + 'match' => '0A4B 0A70', + 'replace' => 'E0AC', + ), + 278 => + array ( + 'match' => '0A4C 0A02', + 'replace' => 'E0AD', + ), + 279 => + array ( + 'match' => '0A4C 0A70', + 'replace' => 'E0AD', + ), + 280 => + array ( + 'match' => '0A3E 0A01', + 'replace' => 'E0AE', + ), + 281 => + array ( + 'match' => '0A40 0A01', + 'replace' => 'E0AF', + ), + 282 => + array ( + 'match' => '0A47 0A01', + 'replace' => 'E0B0', + ), + 283 => + array ( + 'match' => '0A48 0A01', + 'replace' => 'E0B1', + ), + 284 => + array ( + 'match' => '0A4B 0A01', + 'replace' => 'E0B2', + ), + 285 => + array ( + 'match' => '0A4C 0A01', + 'replace' => 'E0B3', + ), + 286 => + array ( + 'match' => '((0A08|0A0F|0A10|0A13|0A14|E0B6|E0B7|E0B8|E0B9|E0BA)) 0A01', + 'replace' => '\\1 E0A5', + ), + 287 => + array ( + 'match' => '((E0A8|E0A9|E0AA|E0AB|E0AC|E0AD)) 0A01', + 'replace' => '\\1 E0A5', + ), +); +?> \ No newline at end of file diff --git a/application/third_party/mpdf/includes/ind_ta_1_001.volt.php b/application/third_party/mpdf/includes/ind_ta_1_001.volt.php new file mode 100644 index 0000000..ea6e6f2 --- /dev/null +++ b/application/third_party/mpdf/includes/ind_ta_1_001.volt.php @@ -0,0 +1,394 @@ +<?php + $volt = array ( + 0 => + array ( + 'match' => '0BCD 200D', + 'replace' => '014B', + ), + 1 => + array ( + 'match' => '0BCD 200C', + 'replace' => 'E002', + ), + 2 => + array ( + 'match' => '200D 0BCD', + 'replace' => '014A', + ), + 3 => + array ( + 'match' => '0B95 0BCD 0BB7', + 'replace' => 'E005', + ), + 4 => + array ( + 'match' => '0BB8 0BCD 0BB0 0BC0', + 'replace' => 'E04B', + ), + 5 => + array ( + 'match' => '0B93 0BAE 0BCD', + 'replace' => 'E04C', + ), + 6 => + array ( + 'match' => '(0BB8) 0BC1', + 'replace' => '\\1 E00C', + ), + 7 => + array ( + 'match' => '(0BB8) 0BC2', + 'replace' => '\\1 E00D', + ), + 8 => + array ( + 'match' => '0B95 0BC2', + 'replace' => 'E00F', + ), + 9 => + array ( + 'match' => '0B9C 0BC1', + 'replace' => 'E014', + ), + 10 => + array ( + 'match' => '0B9C 0BC2', + 'replace' => 'E015', + ), + 11 => + array ( + 'match' => '0B9F 0BBF', + 'replace' => 'E018', + ), + 12 => + array ( + 'match' => '0BB2 0BBF', + 'replace' => 'E033', + ), + 13 => + array ( + 'match' => '0BB7 0BBF', + 'replace' => 'E03F', + ), + 14 => + array ( + 'match' => '0BB7 0BC1', + 'replace' => 'E041', + ), + 15 => + array ( + 'match' => '0BB7 0BC2', + 'replace' => 'E042', + ), + 16 => + array ( + 'match' => '0BB8 0BBF', + 'replace' => 'E043', + ), + 17 => + array ( + 'match' => '0BB9 0BC1', + 'replace' => 'E045', + ), + 18 => + array ( + 'match' => '0BB9 0BC2', + 'replace' => 'E046', + ), + 19 => + array ( + 'match' => 'E005 0BBF', + 'replace' => 'E047', + ), + 20 => + array ( + 'match' => 'E005 0BC1', + 'replace' => 'E049', + ), + 21 => + array ( + 'match' => 'E005 0BC2', + 'replace' => 'E04A', + ), + 22 => + array ( + 'match' => '((0BAA|0BAF|0B99|0BB5)) 0BC0', + 'replace' => '\\1 E00B', + ), + 23 => + array ( + 'match' => '((0BAE|0B9A|0BB9|0B9C|0BB4|0BB1)) 0BBF', + 'replace' => '\\1 E006', + ), + 24 => + array ( + 'match' => '((0BB0|0BB3|0BA3|0BA9)) 0BBF', + 'replace' => '\\1 E007', + ), + 25 => + array ( + 'match' => '((0B95|0BA4)) 0BBF', + 'replace' => '\\1 E008', + ), + 26 => + array ( + 'match' => '((0BAA|0BAF|0B99|0BB5)) 0BBF', + 'replace' => '\\1 E009', + ), + 27 => + array ( + 'match' => '((0BA8|0B9E)) 0BBF', + 'replace' => '\\1 E00A', + ), + 28 => + array ( + 'match' => '0BA3 200C 0BC8', + 'replace' => 'E01F', + ), + 29 => + array ( + 'match' => '0BA9 200C 0BC8', + 'replace' => 'E027', + ), + 30 => + array ( + 'match' => '0BB2 200C 0BC8', + 'replace' => 'E037', + ), + 31 => + array ( + 'match' => '0BB3 200C 0BC8', + 'replace' => 'E03A', + ), + 32 => + array ( + 'match' => '0B9F 0BC0', + 'replace' => 'E019', + ), + 33 => + array ( + 'match' => '0BB2 0BC0', + 'replace' => 'E034', + ), + 34 => + array ( + 'match' => '0BB7 0BC0', + 'replace' => 'E040', + ), + 35 => + array ( + 'match' => '0BB8 0BC0', + 'replace' => 'E044', + ), + 36 => + array ( + 'match' => 'E005 0BC0', + 'replace' => 'E048', + ), + 37 => + array ( + 'match' => '0B95 0BC1', + 'replace' => 'E00E', + ), + 38 => + array ( + 'match' => '0B99 0BC1', + 'replace' => 'E010', + ), + 39 => + array ( + 'match' => '0B99 0BC2', + 'replace' => 'E011', + ), + 40 => + array ( + 'match' => '0B9A 0BC1', + 'replace' => 'E012', + ), + 41 => + array ( + 'match' => '0B9A 0BC2', + 'replace' => 'E013', + ), + 42 => + array ( + 'match' => '0B9E 0BC1', + 'replace' => 'E016', + ), + 43 => + array ( + 'match' => '0B9E 0BC2', + 'replace' => 'E017', + ), + 44 => + array ( + 'match' => '0B9F 0BC1', + 'replace' => 'E01A', + ), + 45 => + array ( + 'match' => '0B9F 0BC2', + 'replace' => 'E01B', + ), + 46 => + array ( + 'match' => '0BA3 200C 0BBE', + 'replace' => 'E01C', + ), + 47 => + array ( + 'match' => '0BA3 0BC1', + 'replace' => 'E01D', + ), + 48 => + array ( + 'match' => '0BA3 0BC2', + 'replace' => 'E01E', + ), + 49 => + array ( + 'match' => '0BA4 0BC1', + 'replace' => 'E020', + ), + 50 => + array ( + 'match' => '0BA4 0BC2', + 'replace' => 'E021', + ), + 51 => + array ( + 'match' => '0BA8 0BC1', + 'replace' => 'E022', + ), + 52 => + array ( + 'match' => '0BA8 0BC2', + 'replace' => 'E023', + ), + 53 => + array ( + 'match' => '0BA9 200C 0BBE', + 'replace' => 'E024', + ), + 54 => + array ( + 'match' => '0BA9 0BC1', + 'replace' => 'E025', + ), + 55 => + array ( + 'match' => '0BA9 0BC2', + 'replace' => 'E026', + ), + 56 => + array ( + 'match' => '0BAA 0BC1', + 'replace' => 'E028', + ), + 57 => + array ( + 'match' => '0BAA 0BC2', + 'replace' => 'E029', + ), + 58 => + array ( + 'match' => '0BAE 0BC1', + 'replace' => 'E02A', + ), + 59 => + array ( + 'match' => '0BAE 0BC2', + 'replace' => 'E02B', + ), + 60 => + array ( + 'match' => '0BAF 0BC1', + 'replace' => 'E02C', + ), + 61 => + array ( + 'match' => '0BAF 0BC2', + 'replace' => 'E02D', + ), + 62 => + array ( + 'match' => '0BB0 0BC1', + 'replace' => 'E02E', + ), + 63 => + array ( + 'match' => '0BB0 0BC2', + 'replace' => 'E02F', + ), + 64 => + array ( + 'match' => '0BB1 200C 0BBE', + 'replace' => 'E030', + ), + 65 => + array ( + 'match' => '0BB1 0BC1', + 'replace' => 'E031', + ), + 66 => + array ( + 'match' => '0BB1 0BC2', + 'replace' => 'E032', + ), + 67 => + array ( + 'match' => '0BB2 0BC1', + 'replace' => 'E035', + ), + 68 => + array ( + 'match' => '0BB2 0BC2', + 'replace' => 'E036', + ), + 69 => + array ( + 'match' => '0BB3 0BC1', + 'replace' => 'E038', + ), + 70 => + array ( + 'match' => '0BB3 0BC2', + 'replace' => 'E039', + ), + 71 => + array ( + 'match' => '0BB4 0BC1', + 'replace' => 'E03B', + ), + 72 => + array ( + 'match' => '0BB4 0BC2', + 'replace' => 'E03C', + ), + 73 => + array ( + 'match' => '0BB5 0BC1', + 'replace' => 'E03D', + ), + 74 => + array ( + 'match' => '0BB5 0BC2', + 'replace' => 'E03E', + ), + 75 => + array ( + 'match' => '014B', + 'replace' => '0BCD', + ), + 76 => + array ( + 'match' => 'E002', + 'replace' => '0BCD', + ), + 77 => + array ( + 'match' => '014A', + 'replace' => '0BCD', + ), +); +?> \ No newline at end of file diff --git a/application/third_party/mpdf/includes/ind_te_1_001.volt.php b/application/third_party/mpdf/includes/ind_te_1_001.volt.php new file mode 100644 index 0000000..f46e83f --- /dev/null +++ b/application/third_party/mpdf/includes/ind_te_1_001.volt.php @@ -0,0 +1,1489 @@ +<?php + $volt = array ( + 0 => + array ( + 'match' => '0C4D 0C30 ((0C15|0C16|0C17|0C18|0C19|0C1A|0C1B|0C1C|0C1D|0C1E|0C1F|0C20|0C21|0C22|0C23|0C24|0C25|0C26|0C27|0C28|0C2A|0C2B|0C2C|0C2D|0C2E|0C2F|0C30|0C31|0C32|0C33|0C35|0C36|0C37|0C38|0C39))', + 'replace' => 'E046 \\1', + ), + 1 => + array ( + 'match' => '0C4D 200D', + 'replace' => '00C9', + ), + 2 => + array ( + 'match' => '0C4D 200C', + 'replace' => '00D0', + ), + 3 => + array ( + 'match' => '200D 0C4D', + 'replace' => '00D1', + ), + 4 => + array ( + 'match' => '((0C15|0C16|0C17|0C18|0C19|0C1A|0C1B|0C1C|0C1D|0C1E|0C1F|0C20|0C21|0C22|0C23|0C24|0C25|0C26|0C27|0C28|0C2A|0C2B|0C2C|0C2D|0C2E|0C2F|0C30|0C31|0C32|0C33|0C35|0C36|0C37|0C38|0C39)) 0C4D', + 'replace' => '\\1 00D1', + ), + 5 => + array ( + 'match' => '((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C)) 0C4D', + 'replace' => '\\1 00D1', + ), + 6 => + array ( + 'match' => '((0C41|0C42|0C43|0C44)) 0C4D', + 'replace' => '\\1 00D1', + ), + 7 => + array ( + 'match' => '(0020) 0C4D', + 'replace' => '\\1 00D1', + ), + 8 => + array ( + 'match' => '(25CC) 0C4D', + 'replace' => '\\1 00D1', + ), + 9 => + array ( + 'match' => '0C15 00D1 0C37', + 'replace' => 'E078', + ), + 10 => + array ( + 'match' => '0C36 00D1 0C1C', + 'replace' => 'E079', + ), + 11 => + array ( + 'match' => '00D1 0C15', + 'replace' => 'E02C', + ), + 12 => + array ( + 'match' => '00D1 0C16', + 'replace' => 'E02D', + ), + 13 => + array ( + 'match' => '00D1 0C17', + 'replace' => 'E02E', + ), + 14 => + array ( + 'match' => '00D1 0C18', + 'replace' => 'E02F', + ), + 15 => + array ( + 'match' => '00D1 0C19', + 'replace' => 'E030', + ), + 16 => + array ( + 'match' => '00D1 0C1A', + 'replace' => 'E031', + ), + 17 => + array ( + 'match' => '00D1 0C1B', + 'replace' => 'E032', + ), + 18 => + array ( + 'match' => '00D1 0C1C', + 'replace' => 'E033', + ), + 19 => + array ( + 'match' => '00D1 0C1D', + 'replace' => 'E034', + ), + 20 => + array ( + 'match' => '00D1 0C1E', + 'replace' => 'E035', + ), + 21 => + array ( + 'match' => '00D1 0C1F', + 'replace' => 'E036', + ), + 22 => + array ( + 'match' => '00D1 0C20', + 'replace' => 'E037', + ), + 23 => + array ( + 'match' => '00D1 0C21', + 'replace' => 'E038', + ), + 24 => + array ( + 'match' => '00D1 0C22', + 'replace' => 'E039', + ), + 25 => + array ( + 'match' => '00D1 0C23', + 'replace' => 'E03A', + ), + 26 => + array ( + 'match' => '00D1 0C24', + 'replace' => 'E03B', + ), + 27 => + array ( + 'match' => '00D1 0C25', + 'replace' => 'E03C', + ), + 28 => + array ( + 'match' => '00D1 0C26', + 'replace' => 'E03D', + ), + 29 => + array ( + 'match' => '00D1 0C27', + 'replace' => 'E03E', + ), + 30 => + array ( + 'match' => '00D1 0C28', + 'replace' => 'E03F', + ), + 31 => + array ( + 'match' => '00D1 0C2A', + 'replace' => 'E040', + ), + 32 => + array ( + 'match' => '00D1 0C2B', + 'replace' => 'E041', + ), + 33 => + array ( + 'match' => '00D1 0C2C', + 'replace' => 'E042', + ), + 34 => + array ( + 'match' => '00D1 0C2D', + 'replace' => 'E043', + ), + 35 => + array ( + 'match' => '00D1 0C2E', + 'replace' => 'E044', + ), + 36 => + array ( + 'match' => '00D1 0C2F', + 'replace' => 'E045', + ), + 37 => + array ( + 'match' => '00D1 0C30', + 'replace' => 'E046', + ), + 38 => + array ( + 'match' => '00D1 0C31', + 'replace' => 'E047', + ), + 39 => + array ( + 'match' => '00D1 0C32', + 'replace' => 'E048', + ), + 40 => + array ( + 'match' => '00D1 0C33', + 'replace' => 'E049', + ), + 41 => + array ( + 'match' => '00D1 0C35', + 'replace' => 'E04A', + ), + 42 => + array ( + 'match' => '00D1 0C36', + 'replace' => 'E04B', + ), + 43 => + array ( + 'match' => '00D1 0C37', + 'replace' => 'E04C', + ), + 44 => + array ( + 'match' => '00D1 0C38', + 'replace' => 'E04D', + ), + 45 => + array ( + 'match' => '00D1 0C39', + 'replace' => 'E04E', + ), + 46 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E02C', + 'replace' => '\\1 E04F', + ), + 47 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E02D', + 'replace' => '\\1 E050', + ), + 48 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E02E', + 'replace' => '\\1 E051', + ), + 49 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E02F', + 'replace' => '\\1 E052', + ), + 50 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E030', + 'replace' => '\\1 E053', + ), + 51 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E031', + 'replace' => '\\1 E054', + ), + 52 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E032', + 'replace' => '\\1 E055', + ), + 53 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E033', + 'replace' => '\\1 E056', + ), + 54 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E034', + 'replace' => '\\1 E057', + ), + 55 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E035', + 'replace' => '\\1 E058', + ), + 56 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E036', + 'replace' => '\\1 E059', + ), + 57 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E037', + 'replace' => '\\1 E05A', + ), + 58 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E038', + 'replace' => '\\1 E05B', + ), + 59 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E039', + 'replace' => '\\1 E05C', + ), + 60 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E03A', + 'replace' => '\\1 E05D', + ), + 61 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E03B', + 'replace' => '\\1 E05E', + ), + 62 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E03C', + 'replace' => '\\1 E05F', + ), + 63 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E03D', + 'replace' => '\\1 E060', + ), + 64 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E03E', + 'replace' => '\\1 E061', + ), + 65 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E03F', + 'replace' => '\\1 E062', + ), + 66 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E040', + 'replace' => '\\1 E063', + ), + 67 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E041', + 'replace' => '\\1 E064', + ), + 68 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E042', + 'replace' => '\\1 E065', + ), + 69 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E043', + 'replace' => '\\1 E066', + ), + 70 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E044', + 'replace' => '\\1 E067', + ), + 71 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E045', + 'replace' => '\\1 E068', + ), + 72 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E046', + 'replace' => '\\1 E069', + ), + 73 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E047', + 'replace' => '\\1 E06A', + ), + 74 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E048', + 'replace' => '\\1 E06B', + ), + 75 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E049', + 'replace' => '\\1 E06C', + ), + 76 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E04A', + 'replace' => '\\1 E06D', + ), + 77 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E04B', + 'replace' => '\\1 E06E', + ), + 78 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E04C', + 'replace' => '\\1 E06F', + ), + 79 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E04D', + 'replace' => '\\1 E070', + ), + 80 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) E04E', + 'replace' => '\\1 E071', + ), + 81 => + array ( + 'match' => '((E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071)) E02C', + 'replace' => '\\1 E072', + ), + 82 => + array ( + 'match' => '((E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071)) E03F', + 'replace' => '\\1 E073', + ), + 83 => + array ( + 'match' => '((E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071)) E044', + 'replace' => '\\1 E074', + ), + 84 => + array ( + 'match' => '((E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071)) E045', + 'replace' => '\\1 E075', + ), + 85 => + array ( + 'match' => '((E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071)) E04A', + 'replace' => '\\1 E076', + ), + 86 => + array ( + 'match' => '((E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071)) E046', + 'replace' => '\\1 E077', + ), + 87 => + array ( + 'match' => '00C9', + 'replace' => '0C4D', + ), + 88 => + array ( + 'match' => '00D0', + 'replace' => '0C4D', + ), + 89 => + array ( + 'match' => '00D1', + 'replace' => '0C4D', + ), + 90 => + array ( + 'match' => '0C2A ((0C3E|0C4A|0C4B|0C4C))', + 'replace' => 'E028 \\1', + ), + 91 => + array ( + 'match' => '0C2B ((0C3E|0C4A|0C4B|0C4C))', + 'replace' => 'E029 \\1', + ), + 92 => + array ( + 'match' => '0C37 ((0C3E|0C4A|0C4B|0C4C))', + 'replace' => 'E02A \\1', + ), + 93 => + array ( + 'match' => '0C38 ((0C3E|0C4A|0C4B|0C4C))', + 'replace' => 'E02B \\1', + ), + 94 => + array ( + 'match' => 'E07B ((0C3E|0C4A|0C4B|0C4C))', + 'replace' => 'E0B2 \\1', + ), + 95 => + array ( + 'match' => '((E028|E029|E02A|E02B)) 0C4A', + 'replace' => '\\1 E009', + ), + 96 => + array ( + 'match' => '((E028|E029|E02A|E02B)) 0C4B', + 'replace' => '\\1 E00A', + ), + 97 => + array ( + 'match' => '((E028|E029|E02A|E02B)) 0C4C', + 'replace' => '\\1 E00B', + ), + 98 => + array ( + 'match' => '0C15 0C41', + 'replace' => 'E07F', + ), + 99 => + array ( + 'match' => '0C15 0C42', + 'replace' => 'E080', + ), + 100 => + array ( + 'match' => '0C16 0C3F', + 'replace' => 'E081', + ), + 101 => + array ( + 'match' => '0C16 0C40', + 'replace' => 'E082', + ), + 102 => + array ( + 'match' => '0C18 0C4A', + 'replace' => 'E083', + ), + 103 => + array ( + 'match' => '0C18 0C4B', + 'replace' => 'E084', + ), + 104 => + array ( + 'match' => '0C19 0C41', + 'replace' => 'E085', + ), + 105 => + array ( + 'match' => '0C19 0C42', + 'replace' => 'E086', + ), + 106 => + array ( + 'match' => '0C1A 0C3F', + 'replace' => 'E087', + ), + 107 => + array ( + 'match' => '0C1A 0C40', + 'replace' => 'E088', + ), + 108 => + array ( + 'match' => '0C1B 0C3F', + 'replace' => 'E089', + ), + 109 => + array ( + 'match' => '0C1B 0C40', + 'replace' => 'E08A', + ), + 110 => + array ( + 'match' => '0C1C 0C3F', + 'replace' => 'E08B', + ), + 111 => + array ( + 'match' => '0C1C 0C40', + 'replace' => 'E08C', + ), + 112 => + array ( + 'match' => '0C1C 0C41', + 'replace' => 'E08D', + ), + 113 => + array ( + 'match' => '0C1C 0C42', + 'replace' => 'E08E', + ), + 114 => + array ( + 'match' => '0C1D 0C4A', + 'replace' => 'E08F', + ), + 115 => + array ( + 'match' => '0C1D 0C4B', + 'replace' => 'E090', + ), + 116 => + array ( + 'match' => '0C24 0C3F', + 'replace' => 'E091', + ), + 117 => + array ( + 'match' => '0C24 0C40', + 'replace' => 'E092', + ), + 118 => + array ( + 'match' => '0C28 0C3F', + 'replace' => 'E093', + ), + 119 => + array ( + 'match' => '0C28 0C40', + 'replace' => 'E094', + ), + 120 => + array ( + 'match' => '0C2C 0C3F', + 'replace' => 'E095', + ), + 121 => + array ( + 'match' => '0C2C 0C40', + 'replace' => 'E096', + ), + 122 => + array ( + 'match' => '0C2D 0C3F', + 'replace' => 'E097', + ), + 123 => + array ( + 'match' => '0C2D 0C40', + 'replace' => 'E098', + ), + 124 => + array ( + 'match' => '0C2E 0C3F', + 'replace' => 'E099', + ), + 125 => + array ( + 'match' => '0C2E 0C40', + 'replace' => 'E09A', + ), + 126 => + array ( + 'match' => '0C2E 0C4A', + 'replace' => 'E09B', + ), + 127 => + array ( + 'match' => '0C2E 0C4B', + 'replace' => 'E09C', + ), + 128 => + array ( + 'match' => '0C2F 0C3F', + 'replace' => 'E09D', + ), + 129 => + array ( + 'match' => '0C2F 0C40', + 'replace' => 'E09E', + ), + 130 => + array ( + 'match' => '0C2F 0C4A', + 'replace' => 'E09F', + ), + 131 => + array ( + 'match' => '0C2F 0C4B', + 'replace' => 'E0A0', + ), + 132 => + array ( + 'match' => '0C32 0C3F', + 'replace' => 'E0A1', + ), + 133 => + array ( + 'match' => '0C32 0C40', + 'replace' => 'E0A2', + ), + 134 => + array ( + 'match' => '0C33 0C3F', + 'replace' => 'E0A3', + ), + 135 => + array ( + 'match' => '0C33 0C40', + 'replace' => 'E0A4', + ), + 136 => + array ( + 'match' => '0C35 0C3F', + 'replace' => 'E0A5', + ), + 137 => + array ( + 'match' => '0C35 0C40', + 'replace' => 'E0A6', + ), + 138 => + array ( + 'match' => '0C36 0C41', + 'replace' => 'E0A7', + ), + 139 => + array ( + 'match' => '0C36 0C42', + 'replace' => 'E0A8', + ), + 140 => + array ( + 'match' => '0C36 0C3F', + 'replace' => 'E0A9', + ), + 141 => + array ( + 'match' => '0C36 0C40', + 'replace' => 'E0AA', + ), + 142 => + array ( + 'match' => '0C39 0C3E', + 'replace' => 'E0AB', + ), + 143 => + array ( + 'match' => '0C39 0C41', + 'replace' => 'E0AC', + ), + 144 => + array ( + 'match' => '0C39 0C42', + 'replace' => 'E0AD', + ), + 145 => + array ( + 'match' => 'E078 0C41', + 'replace' => 'E0AE', + ), + 146 => + array ( + 'match' => 'E078 0C42', + 'replace' => 'E0AF', + ), + 147 => + array ( + 'match' => 'E07A 0C48', + 'replace' => 'E0B0', + ), + 148 => + array ( + 'match' => 'E07B 0C48', + 'replace' => 'E0B1', + ), + 149 => + array ( + 'match' => 'E07A 0C3F', + 'replace' => 'E0DA', + ), + 150 => + array ( + 'match' => 'E07A 0C40', + 'replace' => 'E0DB', + ), + 151 => + array ( + 'match' => 'E07B 0C3F', + 'replace' => 'E0DC', + ), + 152 => + array ( + 'match' => 'E07B 0C40', + 'replace' => 'E0DD', + ), + 153 => + array ( + 'match' => '0C15 ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E00D \\1', + ), + 154 => + array ( + 'match' => '0C17 ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E00E \\1', + ), + 155 => + array ( + 'match' => '0C18 ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E00F \\1', + ), + 156 => + array ( + 'match' => '0C1A ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E010 \\1', + ), + 157 => + array ( + 'match' => '0C1B ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E011 \\1', + ), + 158 => + array ( + 'match' => '0C1C ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E012 \\1', + ), + 159 => + array ( + 'match' => '0C1D ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E013 \\1', + ), + 160 => + array ( + 'match' => '0C20 ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E014 \\1', + ), + 161 => + array ( + 'match' => '0C21 ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E015 \\1', + ), + 162 => + array ( + 'match' => '0C22 ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E016 \\1', + ), + 163 => + array ( + 'match' => '0C24 ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E017 \\1', + ), + 164 => + array ( + 'match' => '0C25 ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E018 \\1', + ), + 165 => + array ( + 'match' => '0C26 ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E019 \\1', + ), + 166 => + array ( + 'match' => '0C27 ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E01A \\1', + ), + 167 => + array ( + 'match' => '0C28 ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E01B \\1', + ), + 168 => + array ( + 'match' => '0C2A ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E01C \\1', + ), + 169 => + array ( + 'match' => '0C2B ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E01D \\1', + ), + 170 => + array ( + 'match' => '0C2D ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E01E \\1', + ), + 171 => + array ( + 'match' => '0C2E ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E01F \\1', + ), + 172 => + array ( + 'match' => '0C2F ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E020 \\1', + ), + 173 => + array ( + 'match' => '0C30 ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E021 \\1', + ), + 174 => + array ( + 'match' => '0C33 ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E022 \\1', + ), + 175 => + array ( + 'match' => '0C35 ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E023 \\1', + ), + 176 => + array ( + 'match' => '0C36 ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E024 \\1', + ), + 177 => + array ( + 'match' => '0C37 ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E025 \\1', + ), + 178 => + array ( + 'match' => '0C38 ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E026 \\1', + ), + 179 => + array ( + 'match' => '0C39 ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E027 \\1', + ), + 180 => + array ( + 'match' => 'E078 ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E07C \\1', + ), + 181 => + array ( + 'match' => 'E07A ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E07D \\1', + ), + 182 => + array ( + 'match' => 'E07B ((0C3E|0C3F|0C40|0C46|0C47|0C56|0C4A|0C4B|0C4C))', + 'replace' => 'E07E \\1', + ), + 183 => + array ( + 'match' => '0C15 (0C3E)', + 'replace' => 'E00D \\1', + ), + 184 => + array ( + 'match' => '0C17 (0C3E)', + 'replace' => 'E00E \\1', + ), + 185 => + array ( + 'match' => '0C18 (0C3E)', + 'replace' => 'E00F \\1', + ), + 186 => + array ( + 'match' => '0C1A (0C3E)', + 'replace' => 'E010 \\1', + ), + 187 => + array ( + 'match' => '0C1B (0C3E)', + 'replace' => 'E011 \\1', + ), + 188 => + array ( + 'match' => '0C1C (0C3E)', + 'replace' => 'E012 \\1', + ), + 189 => + array ( + 'match' => '0C1D (0C3E)', + 'replace' => 'E013 \\1', + ), + 190 => + array ( + 'match' => '0C20 (0C3E)', + 'replace' => 'E014 \\1', + ), + 191 => + array ( + 'match' => '0C21 (0C3E)', + 'replace' => 'E015 \\1', + ), + 192 => + array ( + 'match' => '0C22 (0C3E)', + 'replace' => 'E016 \\1', + ), + 193 => + array ( + 'match' => '0C24 (0C3E)', + 'replace' => 'E017 \\1', + ), + 194 => + array ( + 'match' => '0C25 (0C3E)', + 'replace' => 'E018 \\1', + ), + 195 => + array ( + 'match' => '0C26 (0C3E)', + 'replace' => 'E019 \\1', + ), + 196 => + array ( + 'match' => '0C27 (0C3E)', + 'replace' => 'E01A \\1', + ), + 197 => + array ( + 'match' => '0C28 (0C3E)', + 'replace' => 'E01B \\1', + ), + 198 => + array ( + 'match' => '0C2A (0C3E)', + 'replace' => 'E01C \\1', + ), + 199 => + array ( + 'match' => '0C2B (0C3E)', + 'replace' => 'E01D \\1', + ), + 200 => + array ( + 'match' => '0C2D (0C3E)', + 'replace' => 'E01E \\1', + ), + 201 => + array ( + 'match' => '0C2E (0C3E)', + 'replace' => 'E01F \\1', + ), + 202 => + array ( + 'match' => '0C2F (0C3E)', + 'replace' => 'E020 \\1', + ), + 203 => + array ( + 'match' => '0C30 (0C3E)', + 'replace' => 'E021 \\1', + ), + 204 => + array ( + 'match' => '0C33 (0C3E)', + 'replace' => 'E022 \\1', + ), + 205 => + array ( + 'match' => '0C35 (0C3E)', + 'replace' => 'E023 \\1', + ), + 206 => + array ( + 'match' => '0C36 (0C3E)', + 'replace' => 'E024 \\1', + ), + 207 => + array ( + 'match' => '0C37 (0C3E)', + 'replace' => 'E025 \\1', + ), + 208 => + array ( + 'match' => '0C38 (0C3E)', + 'replace' => 'E026 \\1', + ), + 209 => + array ( + 'match' => '0C39 (0C3E)', + 'replace' => 'E027 \\1', + ), + 210 => + array ( + 'match' => 'E078 (0C3E)', + 'replace' => 'E07C \\1', + ), + 211 => + array ( + 'match' => 'E07A (0C3E)', + 'replace' => 'E07D \\1', + ), + 212 => + array ( + 'match' => 'E07B (0C3E)', + 'replace' => 'E07E \\1', + ), + 213 => + array ( + 'match' => '0C15 (0C4C)', + 'replace' => 'E00D \\1', + ), + 214 => + array ( + 'match' => '0C17 (0C4C)', + 'replace' => 'E00E \\1', + ), + 215 => + array ( + 'match' => '0C18 (0C4C)', + 'replace' => 'E00F \\1', + ), + 216 => + array ( + 'match' => '0C1A (0C4C)', + 'replace' => 'E010 \\1', + ), + 217 => + array ( + 'match' => '0C1B (0C4C)', + 'replace' => 'E011 \\1', + ), + 218 => + array ( + 'match' => '0C1C (0C4C)', + 'replace' => 'E012 \\1', + ), + 219 => + array ( + 'match' => '0C1D (0C4C)', + 'replace' => 'E013 \\1', + ), + 220 => + array ( + 'match' => '0C20 (0C4C)', + 'replace' => 'E014 \\1', + ), + 221 => + array ( + 'match' => '0C21 (0C4C)', + 'replace' => 'E015 \\1', + ), + 222 => + array ( + 'match' => '0C22 (0C4C)', + 'replace' => 'E016 \\1', + ), + 223 => + array ( + 'match' => '0C24 (0C4C)', + 'replace' => 'E017 \\1', + ), + 224 => + array ( + 'match' => '0C25 (0C4C)', + 'replace' => 'E018 \\1', + ), + 225 => + array ( + 'match' => '0C26 (0C4C)', + 'replace' => 'E019 \\1', + ), + 226 => + array ( + 'match' => '0C27 (0C4C)', + 'replace' => 'E01A \\1', + ), + 227 => + array ( + 'match' => '0C28 (0C4C)', + 'replace' => 'E01B \\1', + ), + 228 => + array ( + 'match' => '0C2A (0C4C)', + 'replace' => 'E01C \\1', + ), + 229 => + array ( + 'match' => '0C2B (0C4C)', + 'replace' => 'E01D \\1', + ), + 230 => + array ( + 'match' => '0C2D (0C4C)', + 'replace' => 'E01E \\1', + ), + 231 => + array ( + 'match' => '0C2E (0C4C)', + 'replace' => 'E01F \\1', + ), + 232 => + array ( + 'match' => '0C2F (0C4C)', + 'replace' => 'E020 \\1', + ), + 233 => + array ( + 'match' => '0C30 (0C4C)', + 'replace' => 'E021 \\1', + ), + 234 => + array ( + 'match' => '0C33 (0C4C)', + 'replace' => 'E022 \\1', + ), + 235 => + array ( + 'match' => '0C35 (0C4C)', + 'replace' => 'E023 \\1', + ), + 236 => + array ( + 'match' => '0C36 (0C4C)', + 'replace' => 'E024 \\1', + ), + 237 => + array ( + 'match' => '0C37 (0C4C)', + 'replace' => 'E025 \\1', + ), + 238 => + array ( + 'match' => '0C38 (0C4C)', + 'replace' => 'E026 \\1', + ), + 239 => + array ( + 'match' => '0C39 (0C4C)', + 'replace' => 'E027 \\1', + ), + 240 => + array ( + 'match' => 'E078 (0C4C)', + 'replace' => 'E07C \\1', + ), + 241 => + array ( + 'match' => 'E07A (0C4C)', + 'replace' => 'E07D \\1', + ), + 242 => + array ( + 'match' => 'E07B (0C4C)', + 'replace' => 'E07E \\1', + ), + 243 => + array ( + 'match' => '0C15 (0C4D)', + 'replace' => 'E00D \\1', + ), + 244 => + array ( + 'match' => '0C17 (0C4D)', + 'replace' => 'E00E \\1', + ), + 245 => + array ( + 'match' => '0C18 (0C4D)', + 'replace' => 'E00F \\1', + ), + 246 => + array ( + 'match' => '0C1A (0C4D)', + 'replace' => 'E010 \\1', + ), + 247 => + array ( + 'match' => '0C1B (0C4D)', + 'replace' => 'E011 \\1', + ), + 248 => + array ( + 'match' => '0C1C (0C4D)', + 'replace' => 'E012 \\1', + ), + 249 => + array ( + 'match' => '0C1D (0C4D)', + 'replace' => 'E013 \\1', + ), + 250 => + array ( + 'match' => '0C20 (0C4D)', + 'replace' => 'E014 \\1', + ), + 251 => + array ( + 'match' => '0C21 (0C4D)', + 'replace' => 'E015 \\1', + ), + 252 => + array ( + 'match' => '0C22 (0C4D)', + 'replace' => 'E016 \\1', + ), + 253 => + array ( + 'match' => '0C24 (0C4D)', + 'replace' => 'E017 \\1', + ), + 254 => + array ( + 'match' => '0C25 (0C4D)', + 'replace' => 'E018 \\1', + ), + 255 => + array ( + 'match' => '0C26 (0C4D)', + 'replace' => 'E019 \\1', + ), + 256 => + array ( + 'match' => '0C27 (0C4D)', + 'replace' => 'E01A \\1', + ), + 257 => + array ( + 'match' => '0C28 (0C4D)', + 'replace' => 'E01B \\1', + ), + 258 => + array ( + 'match' => '0C2A (0C4D)', + 'replace' => 'E01C \\1', + ), + 259 => + array ( + 'match' => '0C2B (0C4D)', + 'replace' => 'E01D \\1', + ), + 260 => + array ( + 'match' => '0C2D (0C4D)', + 'replace' => 'E01E \\1', + ), + 261 => + array ( + 'match' => '0C2E (0C4D)', + 'replace' => 'E01F \\1', + ), + 262 => + array ( + 'match' => '0C2F (0C4D)', + 'replace' => 'E020 \\1', + ), + 263 => + array ( + 'match' => '0C30 (0C4D)', + 'replace' => 'E021 \\1', + ), + 264 => + array ( + 'match' => '0C33 (0C4D)', + 'replace' => 'E022 \\1', + ), + 265 => + array ( + 'match' => '0C35 (0C4D)', + 'replace' => 'E023 \\1', + ), + 266 => + array ( + 'match' => '0C36 (0C4D)', + 'replace' => 'E024 \\1', + ), + 267 => + array ( + 'match' => '0C37 (0C4D)', + 'replace' => 'E025 \\1', + ), + 268 => + array ( + 'match' => '0C38 (0C4D)', + 'replace' => 'E026 \\1', + ), + 269 => + array ( + 'match' => '0C39 (0C4D)', + 'replace' => 'E027 \\1', + ), + 270 => + array ( + 'match' => 'E078 (0C4D)', + 'replace' => 'E07C \\1', + ), + 271 => + array ( + 'match' => 'E07A (0C4D)', + 'replace' => 'E07D \\1', + ), + 272 => + array ( + 'match' => 'E07B (0C4D)', + 'replace' => 'E07E \\1', + ), + 273 => + array ( + 'match' => 'E00F (0C3E)', + 'replace' => '0C18 \\1', + ), + 274 => + array ( + 'match' => 'E013 (0C3E)', + 'replace' => '0C1D \\1', + ), + 275 => + array ( + 'match' => 'E01F (0C3E)', + 'replace' => '0C2E \\1', + ), + 276 => + array ( + 'match' => 'E020 (0C3E)', + 'replace' => '0C2F \\1', + ), + 277 => + array ( + 'match' => 'E027 (0C3E)', + 'replace' => '0C39 \\1', + ), + 278 => + array ( + 'match' => 'E00F (0C4C)', + 'replace' => '0C18 \\1', + ), + 279 => + array ( + 'match' => 'E013 (0C4C)', + 'replace' => '0C1D \\1', + ), + 280 => + array ( + 'match' => 'E01F (0C4C)', + 'replace' => '0C2E \\1', + ), + 281 => + array ( + 'match' => 'E020 (0C4C)', + 'replace' => '0C2F \\1', + ), + 282 => + array ( + 'match' => 'E027 (0C4C)', + 'replace' => '0C39 \\1', + ), + 283 => + array ( + 'match' => '((E00F|0C1F|E01C|E01D|E025|E026|E027)) 0C46', + 'replace' => '\\1 E007', + ), + 284 => + array ( + 'match' => '((E00F|0C1F|E01C|E01D|E025|E026|E027)) 0C47', + 'replace' => '\\1 E008', + ), + 285 => + array ( + 'match' => '((0C16|0C18|0C1F|0C2C|E01E|0C2E|0C2F|0C32|0C1D)) 0C3E', + 'replace' => '\\1 E002', + ), + 286 => + array ( + 'match' => '((0C19|0C1C)) 0C3E', + 'replace' => '\\1 E003', + ), + 287 => + array ( + 'match' => '((0C1E|E022)) 0C3E', + 'replace' => '\\1 E004', + ), + 288 => + array ( + 'match' => '((E02C|E02D|E02E|E02F|E030|E031|E032|E033|E034|E035|E036|E037|E038|E039|E03A|E03B|E03C|E03D|E03E|E03F|E040|E041|E042|E043|E044|E045|E046|E047|E048|E049|E04A|E04B|E04C|E04D|E04E)) 0C56', + 'replace' => '\\1 E00C', + ), + 289 => + array ( + 'match' => '((E04F|E050|E051|E052|E053|E054|E055|E056|E057|E058|E059|E05A|E05B|E05C|E05D|E05E|E05F|E060|E061|E062|E063|E064|E065|E066|E067|E068|E069|E06A|E06B|E06C|E06D|E06E|E06F|E070|E071)) 0C56', + 'replace' => '\\1 E00C', + ), + 290 => + array ( + 'match' => '(0C33) 0C41', + 'replace' => '\\1 E005', + ), + 291 => + array ( + 'match' => '(0C33) 0C42', + 'replace' => '\\1 E0DE', + ), + 292 => + array ( + 'match' => '((0C2A|0C2B|0C35)) 0C41', + 'replace' => '\\1 E006', + ), + 293 => + array ( + 'match' => '((0C2A|0C2B|0C35)) 0C42', + 'replace' => '\\1 E0DF', + ), + 294 => + array ( + 'match' => 'E046 (E07C 0C46 0C56)', + 'replace' => 'E077 \\1', + ), + 295 => + array ( + 'match' => 'E046 ((0C15|E00D|0C16|0C17|E00E|0C18|E00F|0C19|0C1A|E010|0C1B|E011|0C1C|E012|0C1D|E013|0C1E|0C1F|0C20|E014|0C21|E015|0C22|E016|0C23|0C24|E017|0C25|E018|0C26|E019|0C27|E01A|0C28|E01B|0C2A|E01C|0C2B|E01D|0C2C|0C2D|E01E|0C2E|E01F|0C2F|E020|0C30|E021|0C32|0C33|E022|0C35|E023|0C36|E024|0C37|E025|0C38|E026|0C39|E027|E078|E07C|E079) 0C46 0C56)', + 'replace' => 'E069 \\1', + ), + 296 => + array ( + 'match' => '0C4D', + 'replace' => 'E0E0', + ), +); +?> \ No newline at end of file diff --git a/application/third_party/mpdf/includes/no_image.jpg b/application/third_party/mpdf/includes/no_image.jpg new file mode 100644 index 0000000..a690485 Binary files /dev/null and b/application/third_party/mpdf/includes/no_image.jpg differ diff --git a/application/third_party/mpdf/includes/out.php b/application/third_party/mpdf/includes/out.php new file mode 100644 index 0000000..9dd1118 --- /dev/null +++ b/application/third_party/mpdf/includes/out.php @@ -0,0 +1,59 @@ +<?php + +$path = '../tmp/'; + +$tempfilename = $_REQUEST['filename'].'.pdf'; +if (strstr($tempfilename,'/') || strstr($tempfilename,'\\')) { die("Filename should not contain \ or / "); } +$opname = $_REQUEST['opname']; +$dest = $_REQUEST['dest']; + if ($tempfilename && file_exists($path.$tempfilename)) { + // mPDF 5.3.17 + if ($dest=='I') { + if(PHP_SAPI!='cli') { + header('Content-Type: application/pdf'); + header('Content-disposition: inline; filename="'.$name.'"'); + header('Cache-Control: public, must-revalidate, max-age=0'); + header('Pragma: public'); + header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); + header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + } + } + + else if ($dest=='D') { + header('Content-Description: File Transfer'); + if (headers_sent()) + $this->Error('Some data has already been output to browser, can\'t send PDF file'); + header('Content-Transfer-Encoding: binary'); + header('Cache-Control: public, must-revalidate, max-age=0'); + header('Pragma: public'); + header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); + header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + header('Content-Type: application/force-download'); + header('Content-Type: application/octet-stream', false); + header('Content-Type: application/download', false); + header('Content-Type: application/pdf', false); + header('Content-disposition: attachment; filename="'.$name.'"'); + } + $filesize = filesize($path.$tempfilename); + if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) OR empty($_SERVER['HTTP_ACCEPT_ENCODING'])) { + // don't use length if server using compression + header('Content-Length: '.$filesize); + } + $fd=fopen($path.$tempfilename,'rb'); + fpassthru($fd); + fclose($fd); + unlink($path.$tempfilename); + // ====================== DELETE OLD FILES - Housekeeping ========================================= + // Clear any files in directory that are >24 hrs old + $interval = 86400; + if ($handle = opendir(dirname($path.'dummy'))) { + while (false !== ($file = readdir($handle))) { + if (((filemtime($path.$file)+$interval) < time()) && ($file != "..") && ($file != ".") && substr($file, -3)=='pdf') { + unlink($path.$file); + } + } + closedir($handle); + } + exit; + } +?> \ No newline at end of file diff --git a/application/third_party/mpdf/includes/subs_core.php b/application/third_party/mpdf/includes/subs_core.php new file mode 100644 index 0000000..8101d80 --- /dev/null +++ b/application/third_party/mpdf/includes/subs_core.php @@ -0,0 +1,454 @@ +<?php +$aarr = array( +160 => 160, +161 => 161, +162 => 162, +163 => 163, +164 => 164, +165 => 165, +166 => 166, +167 => 167, +168 => 168, +169 => 169, +170 => 170, +171 => 171, +172 => 172, +173 => 173, +174 => 174, +175 => 175, +176 => 176, +177 => 177, +178 => 178, +179 => 179, +180 => 180, +181 => 181, +182 => 182, +183 => 183, +184 => 184, +185 => 185, +186 => 186, +187 => 187, +188 => 188, +189 => 189, +190 => 190, +191 => 191, +192 => 192, +193 => 193, +194 => 194, +195 => 195, +196 => 196, +197 => 197, +198 => 198, +199 => 199, +200 => 200, +201 => 201, +202 => 202, +203 => 203, +204 => 204, +205 => 205, +206 => 206, +207 => 207, +208 => 208, +209 => 209, +210 => 210, +211 => 211, +212 => 212, +213 => 213, +214 => 214, +215 => 215, +216 => 216, +217 => 217, +218 => 218, +219 => 219, +220 => 220, +221 => 221, +222 => 222, +223 => 223, +224 => 224, +225 => 225, +226 => 226, +227 => 227, +228 => 228, +229 => 229, +230 => 230, +231 => 231, +232 => 232, +233 => 233, +234 => 234, +235 => 235, +236 => 236, +237 => 237, +238 => 238, +239 => 239, +240 => 240, +241 => 241, +242 => 242, +243 => 243, +244 => 244, +245 => 245, +246 => 246, +247 => 247, +248 => 248, +249 => 249, +250 => 250, +251 => 251, +252 => 252, +253 => 253, +254 => 254, +255 => 255, +338 => 140, +339 => 156, +352 => 138, +353 => 154, +376 => 159, +381 => 142, +382 => 158, +402 => 131, +710 => 136, +732 => 152, +8211 => 150, +8212 => 151, +8216 => 145, +8217 => 146, +8218 => 130, +8220 => 147, +8221 => 148, +8222 => 132, +8224 => 134, +8225 => 135, +8226 => 149, +8230 => 133, +8240 => 137, +8249 => 139, +8250 => 155, +8364 => 128, +8482 => 153 +); + +$zarr = array( +8594 => 213, +8596 => 214, +8597 => 215, +9312 => 172, +9313 => 173, +9314 => 174, +9315 => 175, +9316 => 176, +9317 => 177, +9318 => 178, +9319 => 179, +9320 => 180, +9321 => 181, +9632 => 110, +9650 => 115, +9660 => 116, +9670 => 117, +9679 => 108, +9687 => 119, +9733 => 72, +9742 => 37, +9755 => 42, +9758 => 43, +9824 => 171, +9827 => 168, +9829 => 170, +9830 => 169, +9985 => 33, +9986 => 34, +9987 => 35, +9988 => 36, +9990 => 38, +9991 => 39, +9992 => 40, +9993 => 41, +9996 => 44, +9997 => 45, +9998 => 46, +9999 => 47, +10000 => 48, +10001 => 49, +10002 => 50, +10003 => 51, +10004 => 52, +10005 => 53, +10006 => 54, +10007 => 55, +10008 => 56, +10009 => 57, +10010 => 58, +10011 => 59, +10012 => 60, +10013 => 61, +10014 => 62, +10015 => 63, +10016 => 64, +10017 => 65, +10018 => 66, +10019 => 67, +10020 => 68, +10021 => 69, +10022 => 70, +10023 => 71, +10025 => 73, +10026 => 74, +10027 => 75, +10028 => 76, +10029 => 77, +10030 => 78, +10031 => 79, +10032 => 80, +10033 => 81, +10034 => 82, +10035 => 83, +10036 => 84, +10037 => 85, +10038 => 86, +10039 => 87, +10040 => 88, +10041 => 89, +10042 => 90, +10043 => 91, +10044 => 92, +10045 => 93, +10046 => 94, +10047 => 95, +10048 => 96, +10049 => 97, +10050 => 98, +10051 => 99, +10052 => 100, +10053 => 101, +10054 => 102, +10055 => 103, +10056 => 104, +10057 => 105, +10058 => 106, +10059 => 107, +10061 => 109, +10063 => 111, +10064 => 112, +10065 => 113, +10066 => 114, +10070 => 118, +10072 => 120, +10073 => 121, +10074 => 122, +10075 => 123, +10076 => 124, +10077 => 125, +10078 => 126, +10081 => 161, +10082 => 162, +10083 => 163, +10084 => 164, +10085 => 165, +10086 => 166, +10087 => 167, +10102 => 182, +10103 => 183, +10104 => 184, +10105 => 185, +10106 => 186, +10107 => 187, +10108 => 188, +10109 => 189, +10110 => 190, +10111 => 191, +10112 => 192, +10113 => 193, +10114 => 194, +10115 => 195, +10116 => 196, +10117 => 197, +10118 => 198, +10119 => 199, +10120 => 200, +10121 => 201, +10122 => 202, +10123 => 203, +10124 => 204, +10125 => 205, +10126 => 206, +10127 => 207, +10128 => 208, +10129 => 209, +10130 => 210, +10131 => 211, +10132 => 212, +10136 => 216, +10137 => 217, +10138 => 218, +10139 => 219, +10140 => 220, +10141 => 221, +10142 => 222, +10143 => 223, +10144 => 224, +10145 => 225, +10146 => 226, +10147 => 227, +10148 => 228, +10149 => 229, +10150 => 230, +10151 => 231, +10152 => 232, +10153 => 233, +10154 => 234, +10155 => 235, +10156 => 236, +10157 => 237, +10158 => 238, +10159 => 239, +10161 => 241, +10162 => 242, +10163 => 243, +10164 => 244, +10165 => 245, +10166 => 246, +10167 => 247, +10168 => 248, +10169 => 249, +10170 => 250, +10171 => 251, +10172 => 252, +10173 => 253, +10174 => 254 +); + +$sarr = array( +169 => 227, +172 => 216, +174 => 226, +176 => 176, +177 => 177, +181 => 109, +215 => 180, +247 => 184, +402 => 166, +913 => 65, +914 => 66, +915 => 71, +916 => 68, +917 => 69, +918 => 90, +919 => 72, +920 => 81, +921 => 73, +922 => 75, +923 => 76, +924 => 77, +925 => 78, +926 => 88, +927 => 79, +928 => 80, +929 => 82, +931 => 83, +932 => 84, +933 => 85, +934 => 70, +935 => 67, +936 => 89, +937 => 87, +945 => 97, +946 => 98, +947 => 103, +948 => 100, +949 => 101, +950 => 122, +951 => 104, +952 => 113, +953 => 105, +954 => 107, +955 => 108, +956 => 109, +957 => 110, +958 => 120, +959 => 111, +960 => 112, +961 => 114, +962 => 86, +963 => 115, +964 => 116, +965 => 117, +966 => 102, +967 => 99, +968 => 121, +969 => 119, +977 => 74, +978 => 161, +981 => 106, +982 => 118, +8226 => 183, +8230 => 188, +8242 => 162, +8243 => 178, +8260 => 164, +8465 => 193, +8472 => 195, +8476 => 194, +8482 => 228, +8486 => 87, +8501 => 192, +8592 => 172, +8593 => 173, +8594 => 174, +8595 => 175, +8596 => 171, +8629 => 191, +8656 => 220, +8657 => 221, +8658 => 222, +8659 => 223, +8660 => 219, +8704 => 34, +8706 => 182, +8707 => 36, +8709 => 198, +8710 => 68, +8711 => 209, +8712 => 206, +8713 => 207, +8715 => 39, +8719 => 213, +8721 => 229, +8722 => 45, +8725 => 164, +8727 => 42, +8730 => 214, +8733 => 181, +8734 => 165, +8736 => 208, +8743 => 217, +8744 => 218, +8745 => 199, +8746 => 200, +8747 => 242, +8756 => 92, +8764 => 126, +8773 => 64, +8776 => 187, +8800 => 185, +8801 => 186, +8804 => 163, +8805 => 179, +8834 => 204, +8835 => 201, +8836 => 203, +8838 => 205, +8839 => 202, +8853 => 197, +8855 => 196, +8869 => 94, +8901 => 215, +8992 => 243, +8993 => 245, +9001 => 225, +9002 => 241, +9674 => 224, +9824 => 170, +9827 => 167, +9829 => 169, +9830 => 168 +); + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/includes/subs_win-1252.php b/application/third_party/mpdf/includes/subs_win-1252.php new file mode 100644 index 0000000..7aeab82 --- /dev/null +++ b/application/third_party/mpdf/includes/subs_win-1252.php @@ -0,0 +1,308 @@ +<?php + +$subsarray = array ( + 913 => '<tts>65</tts>', + 914 => '<tts>66</tts>', + 915 => '<tts>71</tts>', + 916 => '<tts>68</tts>', + 917 => '<tts>69</tts>', + 918 => '<tts>90</tts>', + 919 => '<tts>72</tts>', + 920 => '<tts>81</tts>', + 921 => '<tts>73</tts>', + 922 => '<tts>75</tts>', + 923 => '<tts>76</tts>', + 924 => '<tts>77</tts>', + 925 => '<tts>78</tts>', + 926 => '<tts>88</tts>', + 927 => '<tts>79</tts>', + 928 => '<tts>80</tts>', + 929 => '<tts>82</tts>', + 931 => '<tts>83</tts>', + 932 => '<tts>84</tts>', + 933 => '<tts>85</tts>', + 934 => '<tts>70</tts>', + 935 => '<tts>67</tts>', + 936 => '<tts>89</tts>', + 937 => '<tts>87</tts>', + 945 => '<tts>97</tts>', + 946 => '<tts>98</tts>', + 947 => '<tts>103</tts>', + 948 => '<tts>100</tts>', + 949 => '<tts>101</tts>', + 950 => '<tts>122</tts>', + 951 => '<tts>104</tts>', + 952 => '<tts>113</tts>', + 953 => '<tts>105</tts>', + 954 => '<tts>107</tts>', + 955 => '<tts>108</tts>', + 956 => '<tts>109</tts>', + 957 => '<tts>110</tts>', + 958 => '<tts>120</tts>', + 959 => '<tts>111</tts>', + 960 => '<tts>112</tts>', + 961 => '<tts>114</tts>', + 962 => '<tts>86</tts>', + 963 => '<tts>115</tts>', + 964 => '<tts>116</tts>', + 965 => '<tts>117</tts>', + 966 => '<tts>102</tts>', + 967 => '<tts>99</tts>', + 968 => '<tts>121</tts>', + 969 => '<tts>119</tts>', + 977 => '<tts>74</tts>', + 978 => '<tts>161</tts>', + 981 => '<tts>106</tts>', + 982 => '<tts>118</tts>', + 8242 => '<tts>162</tts>', + 8243 => '<tts>178</tts>', + 8260 => '<tts>164</tts>', + 8465 => '<tts>193</tts>', + 8472 => '<tts>195</tts>', + 8476 => '<tts>194</tts>', + 8486 => '<tts>87</tts>', + 8501 => '<tts>192</tts>', + 8592 => '<tts>172</tts>', + 8593 => '<tts>173</tts>', + 8594 => '<tts>174</tts>', + 8595 => '<tts>175</tts>', + 8596 => '<tts>171</tts>', + 8597 => '<ttz>215</ttz>', + 8629 => '<tts>191</tts>', + 8656 => '<tts>220</tts>', + 8657 => '<tts>221</tts>', + 8658 => '<tts>222</tts>', + 8659 => '<tts>223</tts>', + 8660 => '<tts>219</tts>', + 8704 => '<tts>34</tts>', + 8706 => '<tts>182</tts>', + 8707 => '<tts>36</tts>', + 8709 => '<tts>198</tts>', + 8710 => '<tts>68</tts>', + 8711 => '<tts>209</tts>', + 8712 => '<tts>206</tts>', + 8713 => '<tts>207</tts>', + 8715 => '<tts>39</tts>', + 8719 => '<tts>213</tts>', + 8721 => '<tts>229</tts>', + 8722 => '<tts>45</tts>', + 8725 => '<tts>164</tts>', + 8727 => '<tts>42</tts>', + 8730 => '<tts>214</tts>', + 8733 => '<tts>181</tts>', + 8734 => '<tts>165</tts>', + 8736 => '<tts>208</tts>', + 8743 => '<tts>217</tts>', + 8744 => '<tts>218</tts>', + 8745 => '<tts>199</tts>', + 8746 => '<tts>200</tts>', + 8747 => '<tts>242</tts>', + 8756 => '<tts>92</tts>', + 8764 => '<tts>126</tts>', + 8773 => '<tts>64</tts>', + 8776 => '<tts>187</tts>', + 8800 => '<tts>185</tts>', + 8801 => '<tts>186</tts>', + 8804 => '<tts>163</tts>', + 8805 => '<tts>179</tts>', + 8834 => '<tts>204</tts>', + 8835 => '<tts>201</tts>', + 8836 => '<tts>203</tts>', + 8838 => '<tts>205</tts>', + 8839 => '<tts>202</tts>', + 8853 => '<tts>197</tts>', + 8855 => '<tts>196</tts>', + 8869 => '<tts>94</tts>', + 8901 => '<tts>215</tts>', + 8992 => '<tts>243</tts>', + 8993 => '<tts>245</tts>', + 9001 => '<tts>225</tts>', + 9002 => '<tts>241</tts>', + 9312 => '<ttz>172</ttz>', + 9313 => '<ttz>173</ttz>', + 9314 => '<ttz>174</ttz>', + 9315 => '<ttz>175</ttz>', + 9316 => '<ttz>176</ttz>', + 9317 => '<ttz>177</ttz>', + 9318 => '<ttz>178</ttz>', + 9319 => '<ttz>179</ttz>', + 9320 => '<ttz>180</ttz>', + 9321 => '<ttz>181</ttz>', + 9632 => '<ttz>110</ttz>', + 9650 => '<ttz>115</ttz>', + 9660 => '<ttz>116</ttz>', + 9670 => '<ttz>117</ttz>', + 9674 => '<tts>224</tts>', + 9679 => '<ttz>108</ttz>', + 9687 => '<ttz>119</ttz>', + 9733 => '<ttz>72</ttz>', + 9742 => '<ttz>37</ttz>', + 9755 => '<ttz>42</ttz>', + 9758 => '<ttz>43</ttz>', + 9824 => '<tts>170</tts>', + 9827 => '<tts>167</tts>', + 9829 => '<tts>169</tts>', + 9830 => '<tts>168</tts>', + 9985 => '<ttz>33</ttz>', + 9986 => '<ttz>34</ttz>', + 9987 => '<ttz>35</ttz>', + 9988 => '<ttz>36</ttz>', + 9990 => '<ttz>38</ttz>', + 9991 => '<ttz>39</ttz>', + 9992 => '<ttz>40</ttz>', + 9993 => '<ttz>41</ttz>', + 9996 => '<ttz>44</ttz>', + 9997 => '<ttz>45</ttz>', + 9998 => '<ttz>46</ttz>', + 9999 => '<ttz>47</ttz>', + 10000 => '<ttz>48</ttz>', + 10001 => '<ttz>49</ttz>', + 10002 => '<ttz>50</ttz>', + 10003 => '<ttz>51</ttz>', + 10004 => '<ttz>52</ttz>', + 10005 => '<ttz>53</ttz>', + 10006 => '<ttz>54</ttz>', + 10007 => '<ttz>55</ttz>', + 10008 => '<ttz>56</ttz>', + 10009 => '<ttz>57</ttz>', + 10010 => '<ttz>58</ttz>', + 10011 => '<ttz>59</ttz>', + 10012 => '<ttz>60</ttz>', + 10013 => '<ttz>61</ttz>', + 10014 => '<ttz>62</ttz>', + 10015 => '<ttz>63</ttz>', + 10016 => '<ttz>64</ttz>', + 10017 => '<ttz>65</ttz>', + 10018 => '<ttz>66</ttz>', + 10019 => '<ttz>67</ttz>', + 10020 => '<ttz>68</ttz>', + 10021 => '<ttz>69</ttz>', + 10022 => '<ttz>70</ttz>', + 10023 => '<ttz>71</ttz>', + 10025 => '<ttz>73</ttz>', + 10026 => '<ttz>74</ttz>', + 10027 => '<ttz>75</ttz>', + 10028 => '<ttz>76</ttz>', + 10029 => '<ttz>77</ttz>', + 10030 => '<ttz>78</ttz>', + 10031 => '<ttz>79</ttz>', + 10032 => '<ttz>80</ttz>', + 10033 => '<ttz>81</ttz>', + 10034 => '<ttz>82</ttz>', + 10035 => '<ttz>83</ttz>', + 10036 => '<ttz>84</ttz>', + 10037 => '<ttz>85</ttz>', + 10038 => '<ttz>86</ttz>', + 10039 => '<ttz>87</ttz>', + 10040 => '<ttz>88</ttz>', + 10041 => '<ttz>89</ttz>', + 10042 => '<ttz>90</ttz>', + 10043 => '<ttz>91</ttz>', + 10044 => '<ttz>92</ttz>', + 10045 => '<ttz>93</ttz>', + 10046 => '<ttz>94</ttz>', + 10047 => '<ttz>95</ttz>', + 10048 => '<ttz>96</ttz>', + 10049 => '<ttz>97</ttz>', + 10050 => '<ttz>98</ttz>', + 10051 => '<ttz>99</ttz>', + 10052 => '<ttz>100</ttz>', + 10053 => '<ttz>101</ttz>', + 10054 => '<ttz>102</ttz>', + 10055 => '<ttz>103</ttz>', + 10056 => '<ttz>104</ttz>', + 10057 => '<ttz>105</ttz>', + 10058 => '<ttz>106</ttz>', + 10059 => '<ttz>107</ttz>', + 10061 => '<ttz>109</ttz>', + 10063 => '<ttz>111</ttz>', + 10064 => '<ttz>112</ttz>', + 10065 => '<ttz>113</ttz>', + 10066 => '<ttz>114</ttz>', + 10070 => '<ttz>118</ttz>', + 10072 => '<ttz>120</ttz>', + 10073 => '<ttz>121</ttz>', + 10074 => '<ttz>122</ttz>', + 10075 => '<ttz>123</ttz>', + 10076 => '<ttz>124</ttz>', + 10077 => '<ttz>125</ttz>', + 10078 => '<ttz>126</ttz>', + 10081 => '<ttz>161</ttz>', + 10082 => '<ttz>162</ttz>', + 10083 => '<ttz>163</ttz>', + 10084 => '<ttz>164</ttz>', + 10085 => '<ttz>165</ttz>', + 10086 => '<ttz>166</ttz>', + 10087 => '<ttz>167</ttz>', + 10102 => '<ttz>182</ttz>', + 10103 => '<ttz>183</ttz>', + 10104 => '<ttz>184</ttz>', + 10105 => '<ttz>185</ttz>', + 10106 => '<ttz>186</ttz>', + 10107 => '<ttz>187</ttz>', + 10108 => '<ttz>188</ttz>', + 10109 => '<ttz>189</ttz>', + 10110 => '<ttz>190</ttz>', + 10111 => '<ttz>191</ttz>', + 10112 => '<ttz>192</ttz>', + 10113 => '<ttz>193</ttz>', + 10114 => '<ttz>194</ttz>', + 10115 => '<ttz>195</ttz>', + 10116 => '<ttz>196</ttz>', + 10117 => '<ttz>197</ttz>', + 10118 => '<ttz>198</ttz>', + 10119 => '<ttz>199</ttz>', + 10120 => '<ttz>200</ttz>', + 10121 => '<ttz>201</ttz>', + 10122 => '<ttz>202</ttz>', + 10123 => '<ttz>203</ttz>', + 10124 => '<ttz>204</ttz>', + 10125 => '<ttz>205</ttz>', + 10126 => '<ttz>206</ttz>', + 10127 => '<ttz>207</ttz>', + 10128 => '<ttz>208</ttz>', + 10129 => '<ttz>209</ttz>', + 10130 => '<ttz>210</ttz>', + 10131 => '<ttz>211</ttz>', + 10132 => '<ttz>212</ttz>', + 10136 => '<ttz>216</ttz>', + 10137 => '<ttz>217</ttz>', + 10138 => '<ttz>218</ttz>', + 10139 => '<ttz>219</ttz>', + 10140 => '<ttz>220</ttz>', + 10141 => '<ttz>221</ttz>', + 10142 => '<ttz>222</ttz>', + 10143 => '<ttz>223</ttz>', + 10144 => '<ttz>224</ttz>', + 10145 => '<ttz>225</ttz>', + 10146 => '<ttz>226</ttz>', + 10147 => '<ttz>227</ttz>', + 10148 => '<ttz>228</ttz>', + 10149 => '<ttz>229</ttz>', + 10150 => '<ttz>230</ttz>', + 10151 => '<ttz>231</ttz>', + 10152 => '<ttz>232</ttz>', + 10153 => '<ttz>233</ttz>', + 10154 => '<ttz>234</ttz>', + 10155 => '<ttz>235</ttz>', + 10156 => '<ttz>236</ttz>', + 10157 => '<ttz>237</ttz>', + 10158 => '<ttz>238</ttz>', + 10159 => '<ttz>239</ttz>', + 10161 => '<ttz>241</ttz>', + 10162 => '<ttz>242</ttz>', + 10163 => '<ttz>243</ttz>', + 10164 => '<ttz>244</ttz>', + 10165 => '<ttz>245</ttz>', + 10166 => '<ttz>246</ttz>', + 10167 => '<ttz>247</ttz>', + 10168 => '<ttz>248</ttz>', + 10169 => '<ttz>249</ttz>', + 10170 => '<ttz>250</ttz>', + 10171 => '<ttz>251</ttz>', + 10172 => '<ttz>252</ttz>', + 10173 => '<ttz>253</ttz>', + 10174 => '<ttz>254</ttz>', +); + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/includes/upperCase.php b/application/third_party/mpdf/includes/upperCase.php new file mode 100644 index 0000000..a197200 --- /dev/null +++ b/application/third_party/mpdf/includes/upperCase.php @@ -0,0 +1,975 @@ +<?php +$this->upperCase=array ( + 97 => 65, + 98 => 66, + 99 => 67, + 100 => 68, + 101 => 69, + 102 => 70, + 103 => 71, + 104 => 72, + 105 => 73, + 106 => 74, + 107 => 75, + 108 => 76, + 109 => 77, + 110 => 78, + 111 => 79, + 112 => 80, + 113 => 81, + 114 => 82, + 115 => 83, + 116 => 84, + 117 => 85, + 118 => 86, + 119 => 87, + 120 => 88, + 121 => 89, + 122 => 90, + 181 => 924, + 224 => 192, + 225 => 193, + 226 => 194, + 227 => 195, + 228 => 196, + 229 => 197, + 230 => 198, + 231 => 199, + 232 => 200, + 233 => 201, + 234 => 202, + 235 => 203, + 236 => 204, + 237 => 205, + 238 => 206, + 239 => 207, + 240 => 208, + 241 => 209, + 242 => 210, + 243 => 211, + 244 => 212, + 245 => 213, + 246 => 214, + 248 => 216, + 249 => 217, + 250 => 218, + 251 => 219, + 252 => 220, + 253 => 221, + 254 => 222, + 255 => 376, + 257 => 256, + 259 => 258, + 261 => 260, + 263 => 262, + 265 => 264, + 267 => 266, + 269 => 268, + 271 => 270, + 273 => 272, + 275 => 274, + 277 => 276, + 279 => 278, + 281 => 280, + 283 => 282, + 285 => 284, + 287 => 286, + 289 => 288, + 291 => 290, + 293 => 292, + 295 => 294, + 297 => 296, + 299 => 298, + 301 => 300, + 303 => 302, + 305 => 73, + 307 => 306, + 309 => 308, + 311 => 310, + 314 => 313, + 316 => 315, + 318 => 317, + 320 => 319, + 322 => 321, + 324 => 323, + 326 => 325, + 328 => 327, + 331 => 330, + 333 => 332, + 335 => 334, + 337 => 336, + 339 => 338, + 341 => 340, + 343 => 342, + 345 => 344, + 347 => 346, + 349 => 348, + 351 => 350, + 353 => 352, + 355 => 354, + 357 => 356, + 359 => 358, + 361 => 360, + 363 => 362, + 365 => 364, + 367 => 366, + 369 => 368, + 371 => 370, + 373 => 372, + 375 => 374, + 378 => 377, + 380 => 379, + 382 => 381, + 383 => 83, + 384 => 579, + 387 => 386, + 389 => 388, + 392 => 391, + 396 => 395, + 402 => 401, + 405 => 502, + 409 => 408, + 410 => 573, + 414 => 544, + 417 => 416, + 419 => 418, + 421 => 420, + 424 => 423, + 429 => 428, + 432 => 431, + 436 => 435, + 438 => 437, + 441 => 440, + 445 => 444, + 447 => 503, + 453 => 452, + 454 => 452, + 456 => 455, + 457 => 455, + 459 => 458, + 460 => 458, + 462 => 461, + 464 => 463, + 466 => 465, + 468 => 467, + 470 => 469, + 472 => 471, + 474 => 473, + 476 => 475, + 477 => 398, + 479 => 478, + 481 => 480, + 483 => 482, + 485 => 484, + 487 => 486, + 489 => 488, + 491 => 490, + 493 => 492, + 495 => 494, + 498 => 497, + 499 => 497, + 501 => 500, + 505 => 504, + 507 => 506, + 509 => 508, + 511 => 510, + 513 => 512, + 515 => 514, + 517 => 516, + 519 => 518, + 521 => 520, + 523 => 522, + 525 => 524, + 527 => 526, + 529 => 528, + 531 => 530, + 533 => 532, + 535 => 534, + 537 => 536, + 539 => 538, + 541 => 540, + 543 => 542, + 547 => 546, + 549 => 548, + 551 => 550, + 553 => 552, + 555 => 554, + 557 => 556, + 559 => 558, + 561 => 560, + 563 => 562, + 572 => 571, + 575 => 11390, + 576 => 11391, + 578 => 577, + 583 => 582, + 585 => 584, + 587 => 586, + 589 => 588, + 591 => 590, + 592 => 11375, + 593 => 11373, + 594 => 11376, + 595 => 385, + 596 => 390, + 598 => 393, + 599 => 394, + 601 => 399, + 603 => 400, + 608 => 403, + 611 => 404, + 616 => 407, + 617 => 406, + 619 => 11362, + 623 => 412, + 625 => 11374, + 626 => 413, + 629 => 415, + 637 => 11364, + 640 => 422, + 643 => 425, + 648 => 430, + 649 => 580, + 650 => 433, + 651 => 434, + 652 => 581, + 658 => 439, + 837 => 921, + 881 => 880, + 883 => 882, + 887 => 886, + 891 => 1021, + 892 => 1022, + 893 => 1023, + 940 => 902, + 941 => 904, + 942 => 905, + 943 => 906, + 945 => 913, + 946 => 914, + 947 => 915, + 948 => 916, + 949 => 917, + 950 => 918, + 951 => 919, + 952 => 920, + 953 => 921, + 954 => 922, + 955 => 923, + 956 => 924, + 957 => 925, + 958 => 926, + 959 => 927, + 960 => 928, + 961 => 929, + 962 => 931, + 963 => 931, + 964 => 932, + 965 => 933, + 966 => 934, + 967 => 935, + 968 => 936, + 969 => 937, + 970 => 938, + 971 => 939, + 972 => 908, + 973 => 910, + 974 => 911, + 976 => 914, + 977 => 920, + 981 => 934, + 982 => 928, + 983 => 975, + 985 => 984, + 987 => 986, + 989 => 988, + 991 => 990, + 993 => 992, + 995 => 994, + 997 => 996, + 999 => 998, + 1001 => 1000, + 1003 => 1002, + 1005 => 1004, + 1007 => 1006, + 1008 => 922, + 1009 => 929, + 1010 => 1017, + 1013 => 917, + 1016 => 1015, + 1019 => 1018, + 1072 => 1040, + 1073 => 1041, + 1074 => 1042, + 1075 => 1043, + 1076 => 1044, + 1077 => 1045, + 1078 => 1046, + 1079 => 1047, + 1080 => 1048, + 1081 => 1049, + 1082 => 1050, + 1083 => 1051, + 1084 => 1052, + 1085 => 1053, + 1086 => 1054, + 1087 => 1055, + 1088 => 1056, + 1089 => 1057, + 1090 => 1058, + 1091 => 1059, + 1092 => 1060, + 1093 => 1061, + 1094 => 1062, + 1095 => 1063, + 1096 => 1064, + 1097 => 1065, + 1098 => 1066, + 1099 => 1067, + 1100 => 1068, + 1101 => 1069, + 1102 => 1070, + 1103 => 1071, + 1104 => 1024, + 1105 => 1025, + 1106 => 1026, + 1107 => 1027, + 1108 => 1028, + 1109 => 1029, + 1110 => 1030, + 1111 => 1031, + 1112 => 1032, + 1113 => 1033, + 1114 => 1034, + 1115 => 1035, + 1116 => 1036, + 1117 => 1037, + 1118 => 1038, + 1119 => 1039, + 1121 => 1120, + 1123 => 1122, + 1125 => 1124, + 1127 => 1126, + 1129 => 1128, + 1131 => 1130, + 1133 => 1132, + 1135 => 1134, + 1137 => 1136, + 1139 => 1138, + 1141 => 1140, + 1143 => 1142, + 1145 => 1144, + 1147 => 1146, + 1149 => 1148, + 1151 => 1150, + 1153 => 1152, + 1163 => 1162, + 1165 => 1164, + 1167 => 1166, + 1169 => 1168, + 1171 => 1170, + 1173 => 1172, + 1175 => 1174, + 1177 => 1176, + 1179 => 1178, + 1181 => 1180, + 1183 => 1182, + 1185 => 1184, + 1187 => 1186, + 1189 => 1188, + 1191 => 1190, + 1193 => 1192, + 1195 => 1194, + 1197 => 1196, + 1199 => 1198, + 1201 => 1200, + 1203 => 1202, + 1205 => 1204, + 1207 => 1206, + 1209 => 1208, + 1211 => 1210, + 1213 => 1212, + 1215 => 1214, + 1218 => 1217, + 1220 => 1219, + 1222 => 1221, + 1224 => 1223, + 1226 => 1225, + 1228 => 1227, + 1230 => 1229, + 1231 => 1216, + 1233 => 1232, + 1235 => 1234, + 1237 => 1236, + 1239 => 1238, + 1241 => 1240, + 1243 => 1242, + 1245 => 1244, + 1247 => 1246, + 1249 => 1248, + 1251 => 1250, + 1253 => 1252, + 1255 => 1254, + 1257 => 1256, + 1259 => 1258, + 1261 => 1260, + 1263 => 1262, + 1265 => 1264, + 1267 => 1266, + 1269 => 1268, + 1271 => 1270, + 1273 => 1272, + 1275 => 1274, + 1277 => 1276, + 1279 => 1278, + 1281 => 1280, + 1283 => 1282, + 1285 => 1284, + 1287 => 1286, + 1289 => 1288, + 1291 => 1290, + 1293 => 1292, + 1295 => 1294, + 1297 => 1296, + 1299 => 1298, + 1301 => 1300, + 1303 => 1302, + 1305 => 1304, + 1307 => 1306, + 1309 => 1308, + 1311 => 1310, + 1313 => 1312, + 1315 => 1314, + 1317 => 1316, + 1377 => 1329, + 1378 => 1330, + 1379 => 1331, + 1380 => 1332, + 1381 => 1333, + 1382 => 1334, + 1383 => 1335, + 1384 => 1336, + 1385 => 1337, + 1386 => 1338, + 1387 => 1339, + 1388 => 1340, + 1389 => 1341, + 1390 => 1342, + 1391 => 1343, + 1392 => 1344, + 1393 => 1345, + 1394 => 1346, + 1395 => 1347, + 1396 => 1348, + 1397 => 1349, + 1398 => 1350, + 1399 => 1351, + 1400 => 1352, + 1401 => 1353, + 1402 => 1354, + 1403 => 1355, + 1404 => 1356, + 1405 => 1357, + 1406 => 1358, + 1407 => 1359, + 1408 => 1360, + 1409 => 1361, + 1410 => 1362, + 1411 => 1363, + 1412 => 1364, + 1413 => 1365, + 1414 => 1366, + 7545 => 42877, + 7549 => 11363, + 7681 => 7680, + 7683 => 7682, + 7685 => 7684, + 7687 => 7686, + 7689 => 7688, + 7691 => 7690, + 7693 => 7692, + 7695 => 7694, + 7697 => 7696, + 7699 => 7698, + 7701 => 7700, + 7703 => 7702, + 7705 => 7704, + 7707 => 7706, + 7709 => 7708, + 7711 => 7710, + 7713 => 7712, + 7715 => 7714, + 7717 => 7716, + 7719 => 7718, + 7721 => 7720, + 7723 => 7722, + 7725 => 7724, + 7727 => 7726, + 7729 => 7728, + 7731 => 7730, + 7733 => 7732, + 7735 => 7734, + 7737 => 7736, + 7739 => 7738, + 7741 => 7740, + 7743 => 7742, + 7745 => 7744, + 7747 => 7746, + 7749 => 7748, + 7751 => 7750, + 7753 => 7752, + 7755 => 7754, + 7757 => 7756, + 7759 => 7758, + 7761 => 7760, + 7763 => 7762, + 7765 => 7764, + 7767 => 7766, + 7769 => 7768, + 7771 => 7770, + 7773 => 7772, + 7775 => 7774, + 7777 => 7776, + 7779 => 7778, + 7781 => 7780, + 7783 => 7782, + 7785 => 7784, + 7787 => 7786, + 7789 => 7788, + 7791 => 7790, + 7793 => 7792, + 7795 => 7794, + 7797 => 7796, + 7799 => 7798, + 7801 => 7800, + 7803 => 7802, + 7805 => 7804, + 7807 => 7806, + 7809 => 7808, + 7811 => 7810, + 7813 => 7812, + 7815 => 7814, + 7817 => 7816, + 7819 => 7818, + 7821 => 7820, + 7823 => 7822, + 7825 => 7824, + 7827 => 7826, + 7829 => 7828, + 7835 => 7776, + 7841 => 7840, + 7843 => 7842, + 7845 => 7844, + 7847 => 7846, + 7849 => 7848, + 7851 => 7850, + 7853 => 7852, + 7855 => 7854, + 7857 => 7856, + 7859 => 7858, + 7861 => 7860, + 7863 => 7862, + 7865 => 7864, + 7867 => 7866, + 7869 => 7868, + 7871 => 7870, + 7873 => 7872, + 7875 => 7874, + 7877 => 7876, + 7879 => 7878, + 7881 => 7880, + 7883 => 7882, + 7885 => 7884, + 7887 => 7886, + 7889 => 7888, + 7891 => 7890, + 7893 => 7892, + 7895 => 7894, + 7897 => 7896, + 7899 => 7898, + 7901 => 7900, + 7903 => 7902, + 7905 => 7904, + 7907 => 7906, + 7909 => 7908, + 7911 => 7910, + 7913 => 7912, + 7915 => 7914, + 7917 => 7916, + 7919 => 7918, + 7921 => 7920, + 7923 => 7922, + 7925 => 7924, + 7927 => 7926, + 7929 => 7928, + 7931 => 7930, + 7933 => 7932, + 7935 => 7934, + 7936 => 7944, + 7937 => 7945, + 7938 => 7946, + 7939 => 7947, + 7940 => 7948, + 7941 => 7949, + 7942 => 7950, + 7943 => 7951, + 7952 => 7960, + 7953 => 7961, + 7954 => 7962, + 7955 => 7963, + 7956 => 7964, + 7957 => 7965, + 7968 => 7976, + 7969 => 7977, + 7970 => 7978, + 7971 => 7979, + 7972 => 7980, + 7973 => 7981, + 7974 => 7982, + 7975 => 7983, + 7984 => 7992, + 7985 => 7993, + 7986 => 7994, + 7987 => 7995, + 7988 => 7996, + 7989 => 7997, + 7990 => 7998, + 7991 => 7999, + 8000 => 8008, + 8001 => 8009, + 8002 => 8010, + 8003 => 8011, + 8004 => 8012, + 8005 => 8013, + 8017 => 8025, + 8019 => 8027, + 8021 => 8029, + 8023 => 8031, + 8032 => 8040, + 8033 => 8041, + 8034 => 8042, + 8035 => 8043, + 8036 => 8044, + 8037 => 8045, + 8038 => 8046, + 8039 => 8047, + 8048 => 8122, + 8049 => 8123, + 8050 => 8136, + 8051 => 8137, + 8052 => 8138, + 8053 => 8139, + 8054 => 8154, + 8055 => 8155, + 8056 => 8184, + 8057 => 8185, + 8058 => 8170, + 8059 => 8171, + 8060 => 8186, + 8061 => 8187, + 8064 => 8072, + 8065 => 8073, + 8066 => 8074, + 8067 => 8075, + 8068 => 8076, + 8069 => 8077, + 8070 => 8078, + 8071 => 8079, + 8080 => 8088, + 8081 => 8089, + 8082 => 8090, + 8083 => 8091, + 8084 => 8092, + 8085 => 8093, + 8086 => 8094, + 8087 => 8095, + 8096 => 8104, + 8097 => 8105, + 8098 => 8106, + 8099 => 8107, + 8100 => 8108, + 8101 => 8109, + 8102 => 8110, + 8103 => 8111, + 8112 => 8120, + 8113 => 8121, + 8115 => 8124, + 8126 => 921, + 8131 => 8140, + 8144 => 8152, + 8145 => 8153, + 8160 => 8168, + 8161 => 8169, + 8165 => 8172, + 8179 => 8188, + 8526 => 8498, + 8560 => 8544, + 8561 => 8545, + 8562 => 8546, + 8563 => 8547, + 8564 => 8548, + 8565 => 8549, + 8566 => 8550, + 8567 => 8551, + 8568 => 8552, + 8569 => 8553, + 8570 => 8554, + 8571 => 8555, + 8572 => 8556, + 8573 => 8557, + 8574 => 8558, + 8575 => 8559, + 8580 => 8579, + 9424 => 9398, + 9425 => 9399, + 9426 => 9400, + 9427 => 9401, + 9428 => 9402, + 9429 => 9403, + 9430 => 9404, + 9431 => 9405, + 9432 => 9406, + 9433 => 9407, + 9434 => 9408, + 9435 => 9409, + 9436 => 9410, + 9437 => 9411, + 9438 => 9412, + 9439 => 9413, + 9440 => 9414, + 9441 => 9415, + 9442 => 9416, + 9443 => 9417, + 9444 => 9418, + 9445 => 9419, + 9446 => 9420, + 9447 => 9421, + 9448 => 9422, + 9449 => 9423, + 11312 => 11264, + 11313 => 11265, + 11314 => 11266, + 11315 => 11267, + 11316 => 11268, + 11317 => 11269, + 11318 => 11270, + 11319 => 11271, + 11320 => 11272, + 11321 => 11273, + 11322 => 11274, + 11323 => 11275, + 11324 => 11276, + 11325 => 11277, + 11326 => 11278, + 11327 => 11279, + 11328 => 11280, + 11329 => 11281, + 11330 => 11282, + 11331 => 11283, + 11332 => 11284, + 11333 => 11285, + 11334 => 11286, + 11335 => 11287, + 11336 => 11288, + 11337 => 11289, + 11338 => 11290, + 11339 => 11291, + 11340 => 11292, + 11341 => 11293, + 11342 => 11294, + 11343 => 11295, + 11344 => 11296, + 11345 => 11297, + 11346 => 11298, + 11347 => 11299, + 11348 => 11300, + 11349 => 11301, + 11350 => 11302, + 11351 => 11303, + 11352 => 11304, + 11353 => 11305, + 11354 => 11306, + 11355 => 11307, + 11356 => 11308, + 11357 => 11309, + 11358 => 11310, + 11361 => 11360, + 11365 => 570, + 11366 => 574, + 11368 => 11367, + 11370 => 11369, + 11372 => 11371, + 11379 => 11378, + 11382 => 11381, + 11393 => 11392, + 11395 => 11394, + 11397 => 11396, + 11399 => 11398, + 11401 => 11400, + 11403 => 11402, + 11405 => 11404, + 11407 => 11406, + 11409 => 11408, + 11411 => 11410, + 11413 => 11412, + 11415 => 11414, + 11417 => 11416, + 11419 => 11418, + 11421 => 11420, + 11423 => 11422, + 11425 => 11424, + 11427 => 11426, + 11429 => 11428, + 11431 => 11430, + 11433 => 11432, + 11435 => 11434, + 11437 => 11436, + 11439 => 11438, + 11441 => 11440, + 11443 => 11442, + 11445 => 11444, + 11447 => 11446, + 11449 => 11448, + 11451 => 11450, + 11453 => 11452, + 11455 => 11454, + 11457 => 11456, + 11459 => 11458, + 11461 => 11460, + 11463 => 11462, + 11465 => 11464, + 11467 => 11466, + 11469 => 11468, + 11471 => 11470, + 11473 => 11472, + 11475 => 11474, + 11477 => 11476, + 11479 => 11478, + 11481 => 11480, + 11483 => 11482, + 11485 => 11484, + 11487 => 11486, + 11489 => 11488, + 11491 => 11490, + 11500 => 11499, + 11502 => 11501, + 11520 => 4256, + 11521 => 4257, + 11522 => 4258, + 11523 => 4259, + 11524 => 4260, + 11525 => 4261, + 11526 => 4262, + 11527 => 4263, + 11528 => 4264, + 11529 => 4265, + 11530 => 4266, + 11531 => 4267, + 11532 => 4268, + 11533 => 4269, + 11534 => 4270, + 11535 => 4271, + 11536 => 4272, + 11537 => 4273, + 11538 => 4274, + 11539 => 4275, + 11540 => 4276, + 11541 => 4277, + 11542 => 4278, + 11543 => 4279, + 11544 => 4280, + 11545 => 4281, + 11546 => 4282, + 11547 => 4283, + 11548 => 4284, + 11549 => 4285, + 11550 => 4286, + 11551 => 4287, + 11552 => 4288, + 11553 => 4289, + 11554 => 4290, + 11555 => 4291, + 11556 => 4292, + 11557 => 4293, + 42561 => 42560, + 42563 => 42562, + 42565 => 42564, + 42567 => 42566, + 42569 => 42568, + 42571 => 42570, + 42573 => 42572, + 42575 => 42574, + 42577 => 42576, + 42579 => 42578, + 42581 => 42580, + 42583 => 42582, + 42585 => 42584, + 42587 => 42586, + 42589 => 42588, + 42591 => 42590, + 42595 => 42594, + 42597 => 42596, + 42599 => 42598, + 42601 => 42600, + 42603 => 42602, + 42605 => 42604, + 42625 => 42624, + 42627 => 42626, + 42629 => 42628, + 42631 => 42630, + 42633 => 42632, + 42635 => 42634, + 42637 => 42636, + 42639 => 42638, + 42641 => 42640, + 42643 => 42642, + 42645 => 42644, + 42647 => 42646, + 42787 => 42786, + 42789 => 42788, + 42791 => 42790, + 42793 => 42792, + 42795 => 42794, + 42797 => 42796, + 42799 => 42798, + 42803 => 42802, + 42805 => 42804, + 42807 => 42806, + 42809 => 42808, + 42811 => 42810, + 42813 => 42812, + 42815 => 42814, + 42817 => 42816, + 42819 => 42818, + 42821 => 42820, + 42823 => 42822, + 42825 => 42824, + 42827 => 42826, + 42829 => 42828, + 42831 => 42830, + 42833 => 42832, + 42835 => 42834, + 42837 => 42836, + 42839 => 42838, + 42841 => 42840, + 42843 => 42842, + 42845 => 42844, + 42847 => 42846, + 42849 => 42848, + 42851 => 42850, + 42853 => 42852, + 42855 => 42854, + 42857 => 42856, + 42859 => 42858, + 42861 => 42860, + 42863 => 42862, + 42874 => 42873, + 42876 => 42875, + 42879 => 42878, + 42881 => 42880, + 42883 => 42882, + 42885 => 42884, + 42887 => 42886, + 42892 => 42891, +); +?> \ No newline at end of file diff --git a/application/third_party/mpdf/mpdf.css b/application/third_party/mpdf/mpdf.css new file mode 100644 index 0000000..4b071b8 --- /dev/null +++ b/application/third_party/mpdf/mpdf.css @@ -0,0 +1,20 @@ +/* + This is a secondary default stylesheet for mPDF + It will only parse element-level CSS here + Remove the comment marks below and edit as required +*/ + + + +/* + These values used to be the default prior to mPDF 4.2 + Altered to make appearance closer to that of browsers + Uncomment these lines to return to behaviour prior to v4.2 +*/ + + +/* +img { margin: 0.83em 0; vertical-align: bottom; } +table { margin: 0.5em; } +textarea { vertical-align: top; } +*/ diff --git a/application/third_party/mpdf/mpdf.php b/application/third_party/mpdf/mpdf.php new file mode 100644 index 0000000..d858b03 --- /dev/null +++ b/application/third_party/mpdf/mpdf.php @@ -0,0 +1,32723 @@ +<?php + +// ****************************************************************************** +// Software: mPDF, Unicode-HTML Free PDF generator * +// Version: 5.7 based on * +// FPDF by Olivier PLATHEY * +// HTML2FPDF by Renato Coelho * +// Date: 2013-07-14 * +// Author: Ian Back <ianb@bpm1.com> * +// License: GPL * +// * +// Changes: See changelog.txt * +// ****************************************************************************** + + +define('mPDF_VERSION','5.7'); + +//Scale factor +define('_MPDFK', (72/25.4)); + +/*-- HTML-CSS --*/ +define('AUTOFONT_CJK',1); +define('AUTOFONT_THAIVIET',2); +define('AUTOFONT_RTL',4); +define('AUTOFONT_INDIC',8); +define('AUTOFONT_ALL',15); + +define('_BORDER_ALL',15); +define('_BORDER_TOP',8); +define('_BORDER_RIGHT',4); +define('_BORDER_BOTTOM',2); +define('_BORDER_LEFT',1); +/*-- END HTML-CSS --*/ + +if (!defined('_MPDF_PATH')) define('_MPDF_PATH', dirname(preg_replace('/\\\\/','/',__FILE__)) . '/'); +if (!defined('_MPDF_URI')) define('_MPDF_URI',_MPDF_PATH); + +require_once(_MPDF_PATH.'includes/functions.php'); +require_once(_MPDF_PATH.'config_cp.php'); + +if (!defined('_JPGRAPH_PATH')) define("_JPGRAPH_PATH", _MPDF_PATH.'jpgraph/'); + +if (!defined('_MPDF_TEMP_PATH')) define("_MPDF_TEMP_PATH", _MPDF_PATH.'tmp/'); + +if (!defined('_MPDF_TTFONTPATH')) { define('_MPDF_TTFONTPATH',_MPDF_PATH.'ttfonts/'); } +if (!defined('_MPDF_TTFONTDATAPATH')) { define('_MPDF_TTFONTDATAPATH',_MPDF_PATH.'ttfontdata/'); } + +$errorlevel=error_reporting(); +$errorlevel=error_reporting($errorlevel & ~E_NOTICE); + +//error_reporting(E_ALL); + +if(function_exists("date_default_timezone_set")) { + if (ini_get("date.timezone")=="") { date_default_timezone_set("Europe/London"); } +} +if (!function_exists("mb_strlen")) { die("Error - mPDF requires mb_string functions. Ensure that PHP is compiled with php_mbstring.dll enabled."); } + +if (!defined('PHP_VERSION_ID')) { + $version = explode('.', PHP_VERSION); + define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2])); +} +// Machine dependent number of bytes used to pack "double" into binary (used in cacheTables) +$test = pack("d", 134455.474557333333666); +define("_DSIZE", strlen($test)); + +class mPDF +{ + +/////////////////////////////// +// EXTERNAL (PUBLIC) VARIABLES +// Define these in config.php +/////////////////////////////// +var $CJKforceend; // mPDF 5.6.40 +// mPDF 5.6.34 +var $h2bookmarks; +var $h2toc; +var $decimal_align; // mPDF 5.6.13 +var $margBuffer; // mPDF 5.4.04 +var $splitTableBorderWidth; // mPDF 5.4.16 + +var $cacheTables; +var $bookmarkStyles; +var $useActiveForms; + +var $repackageTTF; +var $allowCJKorphans; +var $allowCJKoverflow; + +var $useKerning; +var $restrictColorSpace; +var $bleedMargin; +var $crossMarkMargin; +var $cropMarkMargin; +var $cropMarkLength; +var $nonPrintMargin; + +var $PDFX; +var $PDFXauto; + +var $PDFA; +var $PDFAauto; +var $ICCProfile; + +var $printers_info; +var $iterationCounter; +var $smCapsScale; +var $smCapsStretch; + +var $backupSubsFont; +var $backupSIPFont; +var $debugfonts; +var $useAdobeCJK; +var $percentSubset; +var $maxTTFFilesize; +var $BMPonly; + +var $tableMinSizePriority; + +var $dpi; +var $watermarkImgAlphaBlend; +var $watermarkImgBehind; +var $justifyB4br; +var $packTableData; +var $pgsIns; +var $simpleTables; +var $enableImports; + +var $debug; +var $showStats; +var $setAutoTopMargin; +var $setAutoBottomMargin; +var $autoMarginPadding; +var $collapseBlockMargins; +var $falseBoldWeight; +var $normalLineheight; +var $progressBar; +var $incrementFPR1; +var $incrementFPR2; +var $incrementFPR3; +var $incrementFPR4; + +var $SHYlang; +var $SHYleftmin; +var $SHYrightmin; +var $SHYcharmin; +var $SHYcharmax; +var $SHYlanguages; +// PageNumber Conditional Text +var $pagenumPrefix; +var $pagenumSuffix; +var $nbpgPrefix; +var $nbpgSuffix; +var $showImageErrors; +var $allow_output_buffering; +var $autoPadding; +var $useGraphs; +var $autoFontGroupSize; +var $tabSpaces; +var $useLang; +var $restoreBlockPagebreaks; +var $watermarkTextAlpha; +var $watermarkImageAlpha; +var $watermark_size; +var $watermark_pos; +var $annotSize; +var $annotMargin; +var $annotOpacity; +var $title2annots; +var $keepColumns; +var $keep_table_proportions; +var $ignore_table_widths; +var $ignore_table_percents; +var $list_align_style; +var $list_number_suffix; +var $useSubstitutions; +var $CSSselectMedia; + +var $forcePortraitHeaders; +var $forcePortraitMargins; +var $displayDefaultOrientation; +var $ignore_invalid_utf8; +var $allowedCSStags; +var $onlyCoreFonts; +var $allow_charset_conversion; + +var $jSWord; +var $jSmaxChar; +var $jSmaxCharLast; +var $jSmaxWordLast; + +var $max_colH_correction; + + +var $table_error_report; +var $table_error_report_param; +var $biDirectional; +var $text_input_as_HTML; +var $anchor2Bookmark; +var $list_indent_first_level; +var $shrink_tables_to_fit; + +var $allow_html_optional_endtags; + +var $img_dpi; + +var $defaultheaderfontsize; +var $defaultheaderfontstyle; +var $defaultheaderline; +var $defaultfooterfontsize; +var $defaultfooterfontstyle; +var $defaultfooterline; +var $header_line_spacing; +var $footer_line_spacing; + +var $pregUHCchars; +var $pregSJISchars; +var $pregCJKchars; +var $pregASCIIchars1; +var $pregASCIIchars2; +var $pregASCIIchars3; +var $pregVIETchars; +var $pregVIETPluschars; + +var $pregRTLchars; +var $pregHEBchars; +var $pregARABICchars; +var $pregNonARABICchars; +// INDIC +var $pregHIchars; +var $pregBNchars; +var $pregPAchars; +var $pregGUchars; +var $pregORchars; +var $pregTAchars; +var $pregTEchars; +var $pregKNchars; +var $pregMLchars; +var $pregSHchars; +var $pregINDextra; + +var $mirrorMargins; +var $default_lineheight_correction; +var $watermarkText; +var $watermarkImage; +var $showWatermarkText; +var $showWatermarkImage; + +var $fontsizes; + +// Aliases for backward compatability +var $UnvalidatedText; // alias = $watermarkText +var $TopicIsUnvalidated; // alias = $showWatermarkText +var $useOddEven; // alias = $mirrorMargins +var $useSubstitutionsMB; // alias = $useSubstitutions + + + +////////////////////// +// CLASS OBJECTS +////////////////////// +var $cssmgr; +var $grad; +var $bmp; +var $wmf; +var $tocontents; +var $form; +var $directw; + +////////////////////// +// INTERNAL VARIABLES +////////////////////// +var $writingToC; // mPDF 5.6.38 +// mPDF 5.6.01 +var $layers; +var $current_layer; +var $open_layer_pane; +var $decimal_offset; // mPDF 5.6.13 +var $inMeter; // mPDF 5.5.09 + +var $CJKleading; +var $CJKfollowing; +var $CJKoverflow; + +var $textshadow; + +var $colsums; +var $spanborder; +var $spanborddet; + +var $visibility; + +var $useRC128encryption; +var $uniqid; + +var $kerning; +var $fixedlSpacing; +var $minwSpacing; +var $lSpacingCSS; +var $wSpacingCSS; + +var $listDir; +var $spotColorIDs; +var $SVGcolors; +var $spotColors; +var $defTextColor; +var $defDrawColor; +var $defFillColor; + +var $tableBackgrounds; +var $inlineDisplayOff; +var $kt_y00; +var $kt_p00; +var $upperCase; +var $checkSIP; +var $checkSMP; +var $checkCJK; +var $tableCJK; + +var $watermarkImgAlpha; +var $PDFAXwarnings; +var $MetadataRoot; +var $OutputIntentRoot; +var $InfoRoot; +var $current_filename; +var $parsers; +var $current_parser; +var $_obj_stack; +var $_don_obj_stack; +var $_current_obj_id; +var $tpls; +var $tpl; +var $tplprefix; +var $_res; + +var $pdf_version; +var $noImageFile; +var $lastblockbottommargin; +var $baselineC; +var $subPos; +var $subArrMB; +var $ReqFontStyle; +var $tableClipPath ; +var $forceExactLineheight; +var $listOcc; + +var $fullImageHeight; +var $inFixedPosBlock; // Internal flag for position:fixed block +var $fixedPosBlock; // Buffer string for position:fixed block +var $fixedPosBlockDepth; +var $fixedPosBlockBBox; +var $fixedPosBlockSave; +var $maxPosL; +var $maxPosR; + +var $loaded; + +var $extraFontSubsets; +var $docTemplateStart; // Internal flag for page (page no. -1) that docTemplate starts on +var $time0; + +// Classes +var $indic; +var $barcode; + +var $SHYpatterns; +var $loadedSHYpatterns; +var $loadedSHYdictionary; +var $SHYdictionary; +var $SHYdictionaryWords; + +var $spanbgcolorarray; +var $default_font; +var $list_lineheight; +var $headerbuffer; +var $lastblocklevelchange; +var $nestedtablejustfinished; +var $linebreakjustfinished; +var $cell_border_dominance_L; +var $cell_border_dominance_R; +var $cell_border_dominance_T; +var $cell_border_dominance_B; +var $table_keep_together; +var $plainCell_properties; +var $inherit_lineheight; +var $listitemtype; +var $shrin_k1; +var $outerfilled; + +var $blockContext; +var $floatDivs; + + +var $patterns; +var $pageBackgrounds; + +var $bodyBackgroundGradient; +var $bodyBackgroundImage; +var $bodyBackgroundColor; + +var $writingHTMLheader; // internal flag - used both for writing HTMLHeaders/Footers and FixedPos block +var $writingHTMLfooter; +var $autoFontGroups; +var $angle; + +var $gradients; + +var $kwt_Reference; +var $kwt_BMoutlines; +var $kwt_toc; + +var $tbrot_Reference; +var $tbrot_BMoutlines; +var $tbrot_toc; + +var $col_Reference; +var $col_BMoutlines; +var $col_toc; + +var $currentGraphId; +var $graphs; + +var $floatbuffer; +var $floatmargins; + +var $bullet; +var $bulletarray; + +var $rtlAsArabicFarsi; // DEPRACATED + +var $currentLang; +var $default_lang; +var $default_available_fonts; +var $pageTemplate; +var $docTemplate; +var $docTemplateContinue; + +var $arabGlyphs; +var $arabHex; +var $persianGlyphs; +var $persianHex; +var $arabVowels; +var $arabPrevLink; +var $arabNextLink; + + +var $formobjects; // array of Form Objects for WMF +var $InlineProperties; +var $InlineAnnots; +var $ktAnnots; +var $tbrot_Annots; +var $kwt_Annots; +var $columnAnnots; +var $columnForms; + +var $PageAnnots; + +var $pageDim; // Keep track of page wxh for orientation changes - set in _beginpage, used in _putannots + +var $breakpoints; + +var $tableLevel; +var $tbctr; +var $innermostTableLevel; +var $saveTableCounter; +var $cellBorderBuffer; + +var $saveHTMLFooter_height; +var $saveHTMLFooterE_height; + +var $firstPageBoxHeader; +var $firstPageBoxHeaderEven; +var $firstPageBoxFooter; +var $firstPageBoxFooterEven; + +var $page_box; +var $show_marks; // crop or cross marks + +var $basepathIsLocal; + +var $use_kwt; +var $kwt; +var $kwt_height; +var $kwt_y0; +var $kwt_x0; +var $kwt_buffer; +var $kwt_Links; +var $kwt_moved; +var $kwt_saved; + +var $PageNumSubstitutions; + +var $table_borders_separate; +var $base_table_properties; +var $borderstyles; + +var $listjustfinished; +var $blockjustfinished; + +var $orig_bMargin; +var $orig_tMargin; +var $orig_lMargin; +var $orig_rMargin; +var $orig_hMargin; +var $orig_fMargin; + +var $pageheaders; +var $pagefooters; + +var $pageHTMLheaders; +var $pageHTMLfooters; + +var $saveHTMLHeader; +var $saveHTMLFooter; + +var $HTMLheaderPageLinks; +var $HTMLheaderPageAnnots; +var $HTMLheaderPageForms; + +// See config_fonts.php for these next 5 values +var $available_unifonts; +var $sans_fonts; +var $serif_fonts; +var $mono_fonts; +var $defaultSubsFont; + +// List of ALL available CJK fonts (incl. styles) (Adobe add-ons) hw removed +var $available_CJK_fonts; + +var $HTMLHeader; +var $HTMLFooter; +var $HTMLHeaderE; +var $HTMLFooterE; +var $bufferoutput; + +var $showdefaultpagenos; // DEPRACATED -left for backward compatability + + +// CJK fonts +var $Big5_widths; +var $GB_widths; +var $SJIS_widths; +var $UHC_widths; + +// SetProtection +var $encrypted; //whether document is protected +var $Uvalue; //U entry in pdf document +var $Ovalue; //O entry in pdf document +var $Pvalue; //P entry in pdf document +var $enc_obj_id; //encryption object id +var $last_rc4_key; //last RC4 key encrypted (cached for optimisation) +var $last_rc4_key_c; //last RC4 computed key +var $encryption_key; +var $padding; //used for encryption + + +// Bookmark +var $BMoutlines; +var $OutlineRoot; +// INDEX +var $ColActive; +var $Reference; +var $CurrCol; +var $NbCol; +var $y0; //Top ordinate of columns +var $ColL; +var $ColWidth; +var $ColGap; +// COLUMNS +var $ColR; +var $ChangeColumn; +var $columnbuffer; +var $ColDetails; +var $columnLinks; +var $colvAlign; +// Substitutions +var $substitute; // Array of substitution strings e.g. <ttz>112</ttz> +var $entsearch; // Array of HTML entities (>ASCII 127) to substitute +var $entsubstitute; // Array of substitution decimal unicode for the Hi entities + + +// Default values if no style sheet offered (cf. http://www.w3.org/TR/CSS21/sample.html) +var $defaultCSS; + +var $linemaxfontsize; +var $lineheight_correction; +var $lastoptionaltag; // Save current block item which HTML specifies optionsl endtag +var $pageoutput; +var $charset_in; +var $blk; +var $blklvl; +var $ColumnAdjust; +var $ws; // Word spacing +var $HREF; +var $pgwidth; +var $fontlist; +var $oldx; +var $oldy; +var $B; +var $U; //underlining flag +var $S; // SmallCaps flag +var $I; + +var $tdbegin; +var $table; +var $cell; +var $col; +var $row; + +var $divbegin; +var $divalign; +var $divwidth; +var $divheight; +var $divrevert; +var $spanbgcolor; + +var $spanlvl; +var $listlvl; +var $listnum; +var $listtype; +var $listoccur; +var $listlist; +var $listitem; + +var $pjustfinished; +var $ignorefollowingspaces; +var $SUP; +var $SUB; +var $SMALL; +var $BIG; +var $toupper; +var $tolower; +var $capitalize; +var $dash_on; +var $dotted_on; +var $strike; + +var $textbuffer; +var $currentfontstyle; +var $currentfontfamily; +var $currentfontsize; +var $colorarray; +var $bgcolorarray; +var $internallink; +var $enabledtags; + +var $lineheight; +var $basepath; +var $textparam; + +var $specialcontent; +var $selectoption; +var $objectbuffer; + +// Table Rotation +var $table_rotate; +var $tbrot_maxw; +var $tbrot_maxh; +var $tablebuffer; +var $tbrot_align; +var $tbrot_Links; + +var $divbuffer; // Buffer used when keeping DIV on one page +var $keep_block_together; // Keep a Block from page-break-inside: avoid +var $ktLinks; // Keep-together Block links array +var $ktBlock; // Keep-together Block array +var $ktForms; +var $ktReference; +var $ktBMoutlines; +var $_kttoc; + +var $tbrot_y0; +var $tbrot_x0; +var $tbrot_w; +var $tbrot_h; + +var $mb_enc; +var $directionality; + +var $extgstates; // Used for alpha channel - Transparency (Watermark) +var $mgl; +var $mgt; +var $mgr; +var $mgb; + +var $tts; +var $ttz; +var $tta; + +var $headerDetails; +var $footerDetails; + +// Best to alter the below variables using default stylesheet above +var $page_break_after_avoid; +var $margin_bottom_collapse; +var $list_indent; +var $list_align; +var $list_margin_bottom; +var $default_font_size; // in pts +var $original_default_font_size; // used to save default sizes when using table default +var $original_default_font; +var $watermark_font; +var $defaultAlign; + +// TABLE +var $defaultTableAlign; +var $tablethead; +var $thead_font_weight; +var $thead_font_style; +var $thead_font_smCaps; +var $thead_valign_default; +var $thead_textalign_default; +var $tabletfoot; +var $tfoot_font_weight; +var $tfoot_font_style; +var $tfoot_font_smCaps; +var $tfoot_valign_default; +var $tfoot_textalign_default; + +var $trow_text_rotate; + +var $cellPaddingL; +var $cellPaddingR; +var $cellPaddingT; +var $cellPaddingB; +var $table_lineheight; +var $table_border_attr_set; +var $table_border_css_set; + +var $shrin_k; // factor with which to shrink tables - used internally - do not change +var $shrink_this_table_to_fit; // 0 or false to disable; value (if set) gives maximum factor to reduce fontsize +var $MarginCorrection; // corrects for OddEven Margins +var $margin_footer; +var $margin_header; + +var $tabletheadjustfinished; +var $usingCoreFont; +var $charspacing; + +//Private properties FROM FPDF +var $DisplayPreferences; +var $flowingBlockAttr; +var $page; //current page number +var $n; //current object number +var $offsets; //array of object offsets +var $buffer; //buffer holding in-memory PDF +var $pages; //array containing pages +var $state; //current document state +var $compress; //compression flag +var $DefOrientation; //default orientation +var $CurOrientation; //current orientation +var $OrientationChanges; //array indicating orientation changes +var $k; //scale factor (number of points in user unit) +var $fwPt; +var $fhPt; //dimensions of page format in points +var $fw; +var $fh; //dimensions of page format in user unit +var $wPt; +var $hPt; //current dimensions of page in points +var $w; +var $h; //current dimensions of page in user unit +var $lMargin; //left margin +var $tMargin; //top margin +var $rMargin; //right margin +var $bMargin; //page break margin +var $cMarginL; //cell margin Left +var $cMarginR; //cell margin Right +var $cMarginT; //cell margin Left +var $cMarginB; //cell margin Right +var $DeflMargin; //Default left margin +var $DefrMargin; //Default right margin +var $x; +var $y; //current position in user unit for cell positioning +var $lasth; //height of last cell printed +var $LineWidth; //line width in user unit +var $CoreFonts; //array of standard font names +var $fonts; //array of used fonts +var $FontFiles; //array of font files +var $images; //array of used images +var $PageLinks; //array of links in pages +var $links; //array of internal links +var $FontFamily; //current font family +var $FontStyle; //current font style +var $CurrentFont; //current font info +var $FontSizePt; //current font size in points +var $FontSize; //current font size in user unit +var $DrawColor; //commands for drawing color +var $FillColor; //commands for filling color +var $TextColor; //commands for text color +var $ColorFlag; //indicates whether fill and text colors are different +var $autoPageBreak; //automatic page breaking +var $PageBreakTrigger; //threshold used to trigger page breaks +var $InFooter; //flag set when processing footer +var $InHTMLFooter; + +var $processingFooter; //flag set when processing footer - added for columns +var $processingHeader; //flag set when processing header - added for columns +var $ZoomMode; //zoom display mode +var $LayoutMode; //layout display mode +var $title; //title +var $subject; //subject +var $author; //author +var $keywords; //keywords +var $creator; //creator + +var $aliasNbPg; //alias for total number of pages +var $aliasNbPgGp; //alias for total number of pages in page group +var $aliasNbPgHex; +var $aliasNbPgGpHex; + +var $ispre; + +var $outerblocktags; +var $innerblocktags; + + +// ********************************** +// ********************************** +// ********************************** +// ********************************** +// ********************************** +// ********************************** +// ********************************** +// ********************************** +// ********************************** + +function mPDF($mode='',$format='A4',$default_font_size=0,$default_font='',$mgl=0,$mgr=0,$mgt=0,$mgb=0,$mgh=9,$mgf=9, $orientation='P') { + +/*-- BACKGROUNDS --*/ + if (!class_exists('grad', false)) { include(_MPDF_PATH.'classes/grad.php'); } + if (empty($this->grad)) { $this->grad = new grad($this); } +/*-- END BACKGROUNDS --*/ +/*-- FORMS --*/ + if (!class_exists('form', false)) { include(_MPDF_PATH.'classes/form.php'); } + if (empty($this->form)) { $this->form = new form($this); } +/*-- END FORMS --*/ + + $this->time0 = microtime(true); + //Some checks + $this->_dochecks(); + + // Set up Aliases for backwards compatability + $this->UnvalidatedText =& $this->watermarkText; + $this->TopicIsUnvalidated =& $this->showWatermarkText; + $this->AliasNbPg =& $this->aliasNbPg; + $this->AliasNbPgGp =& $this->aliasNbPgGp; + $this->BiDirectional =& $this->biDirectional; + $this->Anchor2Bookmark =& $this->anchor2Bookmark; + $this->KeepColumns =& $this->keepColumns; + $this->useOddEven =& $this->mirrorMargins; + $this->useSubstitutionsMB =& $this->useSubstitutions; + + $this->writingToC = false; // mPDF 5.6.38 + // mPDF 5.6.01 + $this->layers = array(); + $this->current_layer = 0; + $this->open_layer_pane = false; + + $this->visibility='visible'; + + //Initialization of properties + $this->spotColors=array(); + $this->spotColorIDs = array(); + $this->tableBackgrounds = array(); + + $this->kt_y00 = ''; + $this->kt_p00 = ''; + $this->iterationCounter = false; + $this->BMPonly = array(); + $this->page=0; + $this->n=2; + $this->buffer=''; + $this->objectbuffer = array(); + $this->pages=array(); + $this->OrientationChanges=array(); + $this->state=0; + $this->fonts=array(); + $this->FontFiles=array(); + $this->images=array(); + $this->links=array(); + $this->InFooter=false; + $this->processingFooter=false; + $this->processingHeader=false; + $this->lasth=0; + $this->FontFamily=''; + $this->FontStyle=''; + $this->FontSizePt=9; + $this->U=false; + // Small Caps + $this->upperCase = array(); + $this->S = false; + $this->smCapsScale = 1; + $this->smCapsStretch = 100; + $this->margBuffer = 0; // mPDF 5.4.04 + $this->inMeter = false; // mPDF 5.5.09 + $this->decimal_offset = 0; + + $this->defTextColor = $this->TextColor = $this->SetTColor($this->ConvertColor(0),true); + $this->defDrawColor = $this->DrawColor = $this->SetDColor($this->ConvertColor(0),true); + $this->defFillColor = $this->FillColor = $this->SetFColor($this->ConvertColor(255),true); + + //SVG color names array + //http://www.w3schools.com/css/css_colornames.asp + $this->SVGcolors = array('antiquewhite'=>'#FAEBD7','aqua'=>'#00FFFF','aquamarine'=>'#7FFFD4','beige'=>'#F5F5DC','black'=>'#000000', +'blue'=>'#0000FF','brown'=>'#A52A2A','cadetblue'=>'#5F9EA0','chocolate'=>'#D2691E','cornflowerblue'=>'#6495ED','crimson'=>'#DC143C', +'darkblue'=>'#00008B','darkgoldenrod'=>'#B8860B','darkgreen'=>'#006400','darkmagenta'=>'#8B008B','darkorange'=>'#FF8C00', +'darkred'=>'#8B0000','darkseagreen'=>'#8FBC8F','darkslategray'=>'#2F4F4F','darkviolet'=>'#9400D3','deepskyblue'=>'#00BFFF', +'dodgerblue'=>'#1E90FF','firebrick'=>'#B22222','forestgreen'=>'#228B22','fuchsia'=>'#FF00FF','gainsboro'=>'#DCDCDC','gold'=>'#FFD700', +'gray'=>'#808080','green'=>'#008000','greenyellow'=>'#ADFF2F','hotpink'=>'#FF69B4','indigo'=>'#4B0082','khaki'=>'#F0E68C', +'lavenderblush'=>'#FFF0F5','lemonchiffon'=>'#FFFACD','lightcoral'=>'#F08080','lightgoldenrodyellow'=>'#FAFAD2','lightgreen'=>'#90EE90', +'lightsalmon'=>'#FFA07A','lightskyblue'=>'#87CEFA','lightslategray'=>'#778899','lightyellow'=>'#FFFFE0','lime'=>'#00FF00','limegreen'=>'#32CD32', +'magenta'=>'#FF00FF','maroon'=>'#800000','mediumaquamarine'=>'#66CDAA','mediumorchid'=>'#BA55D3','mediumseagreen'=>'#3CB371', +'mediumspringgreen'=>'#00FA9A','mediumvioletred'=>'#C71585','midnightblue'=>'#191970','mintcream'=>'#F5FFFA','moccasin'=>'#FFE4B5','navy'=>'#000080', +'olive'=>'#808000','orange'=>'#FFA500','orchid'=>'#DA70D6','palegreen'=>'#98FB98', +'palevioletred'=>'#D87093','peachpuff'=>'#FFDAB9','pink'=>'#FFC0CB','powderblue'=>'#B0E0E6','purple'=>'#800080', +'red'=>'#FF0000','royalblue'=>'#4169E1','salmon'=>'#FA8072','seagreen'=>'#2E8B57','sienna'=>'#A0522D','silver'=>'#C0C0C0','skyblue'=>'#87CEEB', +'slategray'=>'#708090','springgreen'=>'#00FF7F','steelblue'=>'#4682B4','tan'=>'#D2B48C','teal'=>'#008080','thistle'=>'#D8BFD8','turquoise'=>'#40E0D0', +'violetred'=>'#D02090','white'=>'#FFFFFF','yellow'=>'#FFFF00', +'aliceblue'=>'#f0f8ff', 'azure'=>'#f0ffff', 'bisque'=>'#ffe4c4', 'blanchedalmond'=>'#ffebcd', 'blueviolet'=>'#8a2be2', 'burlywood'=>'#deb887', +'chartreuse'=>'#7fff00', 'coral'=>'#ff7f50', 'cornsilk'=>'#fff8dc', 'cyan'=>'#00ffff', 'darkcyan'=>'#008b8b', 'darkgray'=>'#a9a9a9', +'darkgrey'=>'#a9a9a9', 'darkkhaki'=>'#bdb76b', 'darkolivegreen'=>'#556b2f', 'darkorchid'=>'#9932cc', 'darksalmon'=>'#e9967a', +'darkslateblue'=>'#483d8b', 'darkslategrey'=>'#2f4f4f', 'darkturquoise'=>'#00ced1', 'deeppink'=>'#ff1493', 'dimgray'=>'#696969', +'dimgrey'=>'#696969', 'floralwhite'=>'#fffaf0', 'ghostwhite'=>'#f8f8ff', 'goldenrod'=>'#daa520', 'grey'=>'#808080', 'honeydew'=>'#f0fff0', +'indianred'=>'#cd5c5c', 'ivory'=>'#fffff0', 'lavender'=>'#e6e6fa', 'lawngreen'=>'#7cfc00', 'lightblue'=>'#add8e6', 'lightcyan'=>'#e0ffff', +'lightgray'=>'#d3d3d3', 'lightgrey'=>'#d3d3d3', 'lightpink'=>'#ffb6c1', 'lightseagreen'=>'#20b2aa', 'lightslategrey'=>'#778899', +'lightsteelblue'=>'#b0c4de', 'linen'=>'#faf0e6', 'mediumblue'=>'#0000cd', 'mediumpurple'=>'#9370db', 'mediumslateblue'=>'#7b68ee', +'mediumturquoise'=>'#48d1cc', 'mistyrose'=>'#ffe4e1', 'navajowhite'=>'#ffdead', 'oldlace'=>'#fdf5e6', 'olivedrab'=>'#6b8e23', 'orangered'=>'#ff4500', +'palegoldenrod'=>'#eee8aa', 'paleturquoise'=>'#afeeee', 'papayawhip'=>'#ffefd5', 'peru'=>'#cd853f', 'plum'=>'#dda0dd', 'rosybrown'=>'#bc8f8f', +'saddlebrown'=>'#8b4513', 'sandybrown'=>'#f4a460', 'seashell'=>'#fff5ee', 'slateblue'=>'#6a5acd', 'slategrey'=>'#708090', 'snow'=>'#fffafa', +'tomato'=>'#ff6347', 'violet'=>'#ee82ee', 'wheat'=>'#f5deb3', 'whitesmoke'=>'#f5f5f5', 'yellowgreen'=>'#9acd32'); + + $this->ColorFlag=false; + $this->extgstates = array(); + + $this->mb_enc='windows-1252'; + $this->directionality='ltr'; + $this->defaultAlign = 'L'; + $this->defaultTableAlign = 'L'; + + $this->fixedPosBlockSave = array(); + $this->extraFontSubsets = 0; + + $this->SHYpatterns = array(); + $this->loadedSHYdictionary = false; + $this->SHYdictionary = array(); + $this->SHYdictionaryWords = array(); + $this->blockContext = 1; + $this->floatDivs = array(); + $this->DisplayPreferences=''; + + $this->patterns = array(); // Tiling patterns used for backgrounds + $this->pageBackgrounds = array(); + $this->writingHTMLheader = false; // internal flag - used both for writing HTMLHeaders/Footers and FixedPos block + $this->writingHTMLfooter = false; // internal flag - used both for writing HTMLHeaders/Footers and FixedPos block + $this->gradients = array(); + + $this->kwt_Reference = array(); + $this->kwt_BMoutlines = array(); + $this->kwt_toc = array(); + + $this->tbrot_Reference = array(); + $this->tbrot_BMoutlines = array(); + $this->tbrot_toc = array(); + + $this->col_Reference = array(); + $this->col_BMoutlines = array(); + $this->col_toc = array(); + $this->graphs = array(); + + $this->pgsIns = array(); + $this->PDFAXwarnings = array(); + $this->inlineDisplayOff = false; + $this->kerning = false; + $this->lSpacingCSS = ''; + $this->wSpacingCSS = ''; + $this->fixedlSpacing = false; + $this->minwSpacing = 0; + + + $this->baselineC = 0.35; // Baseline for text + $this->noImageFile = str_replace("\\","/",dirname(__FILE__)) . '/includes/no_image.jpg'; + $this->subPos = 0; + $this->forceExactLineheight = false; + $this->listOcc = 0; + $this->normalLineheight = 1.3; + // These are intended as configuration variables, and should be set in config.php - which will override these values; + // set here as failsafe as will cause an error if not defined + $this->incrementFPR1 = 10; + $this->incrementFPR2 = 10; + $this->incrementFPR3 = 10; + $this->incrementFPR4 = 10; + + $this->fullImageHeight = false; + $this->floatbuffer = array(); + $this->floatmargins = array(); + $this->autoFontGroups = 0; + $this->formobjects=array(); // array of Form Objects for WMF + $this->InlineProperties=array(); + $this->InlineAnnots=array(); + $this->ktAnnots=array(); + $this->tbrot_Annots=array(); + $this->kwt_Annots=array(); + $this->columnAnnots=array(); + $this->pageDim=array(); + $this->breakpoints = array(); // used in columnbuffer + $this->tableLevel=0; + $this->tbctr=array(); // counter for nested tables at each level + $this->page_box = array(); + $this->show_marks = ''; // crop or cross marks + $this->kwt = false; + $this->kwt_height = 0; + $this->kwt_y0 = 0; + $this->kwt_x0 = 0; + $this->kwt_buffer = array(); + $this->kwt_Links = array(); + $this->kwt_moved = false; + $this->kwt_saved = false; + $this->PageNumSubstitutions = array(); + $this->base_table_properties=array(); + $this->borderstyles = array('inset','groove','outset','ridge','dotted','dashed','solid','double'); + $this->tbrot_align = 'C'; + $this->pageheaders=array(); + $this->pagefooters=array(); + + $this->pageHTMLheaders=array(); + $this->pageHTMLfooters=array(); + $this->HTMLheaderPageLinks = array(); + $this->HTMLheaderPageAnnots = array(); + + $this->ktForms = array(); + $this->HTMLheaderPageForms = array(); + $this->columnForms = array(); + $this->tbrotForms = array(); + $this->useRC128encryption = false; + $this->uniqid = ''; + + $this->bufferoutput = false; + $this->encrypted=false; //whether document is protected + $this->BMoutlines=array(); + $this->ColActive=0; //Flag indicating that columns are on (the index is being processed) + $this->Reference=array(); //Array containing the references + $this->CurrCol=0; //Current column number + $this->ColL = array(0); // Array of Left pos of columns - absolute - needs Margin correction for Odd-Even + $this->ColR = array(0); // Array of Right pos of columns - absolute pos - needs Margin correction for Odd-Even + $this->ChangeColumn = 0; + $this->columnbuffer = array(); + $this->ColDetails = array(); // Keeps track of some column details + $this->columnLinks = array(); // Cross references PageLinks + $this->substitute = array(); // Array of substitution strings e.g. <ttz>112</ttz> + $this->entsearch = array(); // Array of HTML entities (>ASCII 127) to substitute + $this->entsubstitute = array(); // Array of substitution decimal unicode for the Hi entities + $this->lastoptionaltag = ''; + $this->charset_in = ''; + $this->blk = array(); + $this->blklvl = 0; + $this->tts = false; + $this->ttz = false; + $this->tta = false; + $this->ispre=false; + + $this->checkSIP = false; + $this->checkSMP = false; + $this->checkCJK = false; + $this->tableCJK = false; + + $this->headerDetails=array(); + $this->footerDetails=array(); + $this->page_break_after_avoid = false; + $this->margin_bottom_collapse = false; + $this->tablethead = 0; + $this->tabletfoot = 0; + $this->table_border_attr_set = 0; + $this->table_border_css_set = 0; + $this->shrin_k = 1.0; + $this->shrink_this_table_to_fit = 0; + $this->MarginCorrection = 0; + + $this->tabletheadjustfinished = false; + $this->usingCoreFont = false; + $this->charspacing=0; + + $this->autoPageBreak = true; + + require(_MPDF_PATH.'config.php'); // config data + + $this->_setPageSize($format, $orientation); + $this->DefOrientation=$orientation; + + $this->margin_header=$mgh; + $this->margin_footer=$mgf; + + $bmargin=$mgb; + + $this->DeflMargin = $mgl; + $this->DefrMargin = $mgr; + + $this->orig_tMargin = $mgt; + $this->orig_bMargin = $bmargin; + $this->orig_lMargin = $this->DeflMargin; + $this->orig_rMargin = $this->DefrMargin; + $this->orig_hMargin = $this->margin_header; + $this->orig_fMargin = $this->margin_footer; + + if ($this->setAutoTopMargin=='pad') { $mgt += $this->margin_header; } + if ($this->setAutoBottomMargin=='pad') { $mgb += $this->margin_footer; } + $this->SetMargins($this->DeflMargin,$this->DefrMargin,$mgt); // sets l r t margin + //Automatic page break + $this->SetAutoPageBreak($this->autoPageBreak,$bmargin); // sets $this->bMargin & PageBreakTrigger + + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + + //Interior cell margin (1 mm) ? not used + $this->cMarginL = 1; + $this->cMarginR = 1; + //Line width (0.2 mm) + $this->LineWidth=.567/_MPDFK; + + //To make the function Footer() work - replaces {nb} with page number + $this->AliasNbPages(); + $this->AliasNbPageGroups(); + + $this->aliasNbPgHex = '{nbHEXmarker}'; + $this->aliasNbPgGpHex = '{nbpgHEXmarker}'; + + //Enable all tags as default + $this->DisableTags(); + //Full width display mode + $this->SetDisplayMode(100); // fullwidth? 'fullpage' + //Compression + $this->SetCompression(true); + //Set default display preferences + $this->SetDisplayPreferences(''); + + // Font data + require(_MPDF_PATH.'config_fonts.php'); + // Available fonts + $this->available_unifonts = array(); + foreach ($this->fontdata AS $f => $fs) { + if (isset($fs['R']) && $fs['R']) { $this->available_unifonts[] = $f; } + if (isset($fs['B']) && $fs['B']) { $this->available_unifonts[] = $f.'B'; } + if (isset($fs['I']) && $fs['I']) { $this->available_unifonts[] = $f.'I'; } + if (isset($fs['BI']) && $fs['BI']) { $this->available_unifonts[] = $f.'BI'; } + } + + $this->default_available_fonts = $this->available_unifonts; + + $optcore = false; + $onlyCoreFonts = false; + if (preg_match('/([\-+])aCJK/i',$mode, $m)) { + preg_replace('/([\-+])aCJK/i','',$mode); + if ($m[1]=='+') { $this->useAdobeCJK = true; } + else { $this->useAdobeCJK = false; } + } + + if (strlen($mode)==1) { + if ($mode=='s') { $this->percentSubset = 100; $mode = ''; } + else if ($mode=='c') { $onlyCoreFonts = true; $mode = ''; } + } + else if (substr($mode,-2)=='-s') { + $this->percentSubset = 100; + $mode = substr($mode,0,strlen($mode)-2); + } + else if (substr($mode,-2)=='-c') { + $onlyCoreFonts = true; + $mode = substr($mode,0,strlen($mode)-2); + } + else if (substr($mode,-2)=='-x') { + $optcore = true; + $mode = substr($mode,0,strlen($mode)-2); + } + + // Autodetect if mode is a language_country string (en-GB or en_GB or en) + if ((strlen($mode) == 5 && $mode != 'UTF-8') || strlen($mode) == 2) { + list ($coreSuitable,$mpdf_pdf_unifonts) = GetLangOpts($mode, $this->useAdobeCJK); + if ($coreSuitable && $optcore) { $onlyCoreFonts = true; } + if ($mpdf_pdf_unifonts) { + $this->RestrictUnicodeFonts($mpdf_pdf_unifonts); + $this->default_available_fonts = $mpdf_pdf_unifonts; + } + $this->currentLang = $mode; + $this->default_lang = $mode; + } + + $this->onlyCoreFonts = $onlyCoreFonts; + + if ($this->onlyCoreFonts) { + $this->setMBencoding('windows-1252'); // sets $this->mb_enc + } + else { + $this->setMBencoding('UTF-8'); // sets $this->mb_enc + } + @mb_regex_encoding('UTF-8'); // required only for mb_ereg... and mb_split functions + + + // Adobe CJK fonts + $this->available_CJK_fonts = array('gb','big5','sjis','uhc','gbB','big5B','sjisB','uhcB','gbI','big5I','sjisI','uhcI', + 'gbBI','big5BI','sjisBI','uhcBI'); + + + //Standard fonts + $this->CoreFonts=array('ccourier'=>'Courier','ccourierB'=>'Courier-Bold','ccourierI'=>'Courier-Oblique','ccourierBI'=>'Courier-BoldOblique', + 'chelvetica'=>'Helvetica','chelveticaB'=>'Helvetica-Bold','chelveticaI'=>'Helvetica-Oblique','chelveticaBI'=>'Helvetica-BoldOblique', + 'ctimes'=>'Times-Roman','ctimesB'=>'Times-Bold','ctimesI'=>'Times-Italic','ctimesBI'=>'Times-BoldItalic', + 'csymbol'=>'Symbol','czapfdingbats'=>'ZapfDingbats'); + $this->fontlist=array("ctimes","ccourier","chelvetica","csymbol","czapfdingbats"); + + // Substitutions + $this->setHiEntitySubstitutions(); + + if ($this->onlyCoreFonts) { + $this->useSubstitutions = true; + $this->SetSubstitutions(); + } + else { $this->useSubstitutions = false; } + +/*-- HTML-CSS --*/ + + if (!class_exists('cssmgr', false)) { include(_MPDF_PATH .'classes/cssmgr.php'); } + $this->cssmgr = new cssmgr($this); + if (file_exists(_MPDF_PATH.'mpdf.css')) { + $css = file_get_contents(_MPDF_PATH.'mpdf.css'); + $css2 = $this->cssmgr->ReadDefaultCSS($css); + $this->defaultCSS = $this->cssmgr->array_merge_recursive_unique($this->defaultCSS,$css2); + } +/*-- END HTML-CSS --*/ + + if ($default_font=='') { + if ($this->onlyCoreFonts) { + if (in_array(strtolower($this->defaultCSS['BODY']['FONT-FAMILY']),$this->mono_fonts)) { $default_font = 'ccourier'; } + else if (in_array(strtolower($this->defaultCSS['BODY']['FONT-FAMILY']),$this->sans_fonts)) { $default_font = 'chelvetica'; } + else { $default_font = 'ctimes'; } + } + else { $default_font = $this->defaultCSS['BODY']['FONT-FAMILY']; } + } + if (!$default_font_size) { + $mmsize = $this->ConvertSize($this->defaultCSS['BODY']['FONT-SIZE']); + $default_font_size = $mmsize*(_MPDFK); + } + + if ($default_font) { $this->SetDefaultFont($default_font); } + if ($default_font_size) { $this->SetDefaultFontSize($default_font_size); } + + $this->SetLineHeight(); // lineheight is in mm + + $this->SetFColor($this->ConvertColor(255)); + $this->HREF=''; + $this->oldy=-1; + $this->B=0; + $this->U=false; + $this->S=false; + $this->I=0; + + $this->listlvl=0; + $this->listnum=0; + $this->listtype=''; + $this->listoccur=array(); + $this->listlist=array(); + $this->listitem=array(); + + $this->tdbegin=false; + $this->table=array(); + $this->cell=array(); + $this->col=-1; + $this->row=-1; + $this->cellBorderBuffer = array(); + + $this->divbegin=false; + $this->divalign=''; + $this->divwidth=0; + $this->divheight=0; + $this->spanbgcolor=false; + $this->divrevert=false; + $this->spanborder=false; + $this->spanborddet=array(); + + $this->blockjustfinished=false; + $this->listjustfinished=false; + $this->ignorefollowingspaces = true; //in order to eliminate exceeding left-side spaces + $this->toupper=false; + $this->tolower=false; + $this->capitalize=false; + $this->dash_on=false; + $this->dotted_on=false; + $this->SUP=false; + $this->SUB=false; + $this->strike=false; + $this->textshadow=''; + + $this->currentfontfamily=''; + $this->currentfontsize=''; + $this->currentfontstyle=''; + $this->colorarray=array(); + $this->spanbgcolorarray=array(); + $this->textbuffer=array(); + $this->internallink=array(); + $this->basepath = ""; + + $this->SetBasePath(''); + + $this->textparam = array(); + + $this->specialcontent = ''; + $this->selectoption = array(); + +/*-- IMPORTS --*/ + + $this->tpls = array(); + $this->tpl = 0; + $this->tplprefix = "/TPL"; + $this->res = array(); + if ($this->enableImports) { + $this->SetImportUse(); + } +/*-- END IMPORTS --*/ + + if ($this->progressBar) { $this->StartProgressBarOutput($this->progressBar) ; } // *PROGRESS-BAR* +} + + +function _setPageSize($format, &$orientation) { + //Page format + if(is_string($format)) + { + if ($format=='') { $format = 'A4'; } + $pfo = 'P'; + if(preg_match('/([0-9a-zA-Z]*)-L/i',$format,$m)) { // e.g. A4-L = A4 landscape + $format=$m[1]; + $pfo='L'; + } + $format = $this->_getPageFormat($format); + if (!$format) { $this->Error('Unknown page format: '.$format); } + else { $orientation = $pfo; } + + $this->fwPt=$format[0]; + $this->fhPt=$format[1]; + } + else + { + if (!$format[0] || !$format[1]) { $this->Error('Invalid page format: '.$format[0].' '.$format[1]); } + $this->fwPt=$format[0]*_MPDFK; + $this->fhPt=$format[1]*_MPDFK; + } + $this->fw=$this->fwPt/_MPDFK; + $this->fh=$this->fhPt/_MPDFK; + //Page orientation + $orientation=strtolower($orientation); + if($orientation=='p' or $orientation=='portrait') + { + $orientation='P'; + $this->wPt=$this->fwPt; + $this->hPt=$this->fhPt; + } + elseif($orientation=='l' or $orientation=='landscape') + { + $orientation='L'; + $this->wPt=$this->fhPt; + $this->hPt=$this->fwPt; + } + else $this->Error('Incorrect orientation: '.$orientation); + $this->CurOrientation=$orientation; + + $this->w=$this->wPt/_MPDFK; + $this->h=$this->hPt/_MPDFK; +} + +function _getPageFormat($format) { + switch (strtoupper($format)) { + case '4A0': {$format = array(4767.87,6740.79); break;} + case '2A0': {$format = array(3370.39,4767.87); break;} + case 'A0': {$format = array(2383.94,3370.39); break;} + case 'A1': {$format = array(1683.78,2383.94); break;} + case 'A2': {$format = array(1190.55,1683.78); break;} + case 'A3': {$format = array(841.89,1190.55); break;} + case 'A4': default: {$format = array(595.28,841.89); break;} + case 'A5': {$format = array(419.53,595.28); break;} + case 'A6': {$format = array(297.64,419.53); break;} + case 'A7': {$format = array(209.76,297.64); break;} + case 'A8': {$format = array(147.40,209.76); break;} + case 'A9': {$format = array(104.88,147.40); break;} + case 'A10': {$format = array(73.70,104.88); break;} + case 'B0': {$format = array(2834.65,4008.19); break;} + case 'B1': {$format = array(2004.09,2834.65); break;} + case 'B2': {$format = array(1417.32,2004.09); break;} + case 'B3': {$format = array(1000.63,1417.32); break;} + case 'B4': {$format = array(708.66,1000.63); break;} + case 'B5': {$format = array(498.90,708.66); break;} + case 'B6': {$format = array(354.33,498.90); break;} + case 'B7': {$format = array(249.45,354.33); break;} + case 'B8': {$format = array(175.75,249.45); break;} + case 'B9': {$format = array(124.72,175.75); break;} + case 'B10': {$format = array(87.87,124.72); break;} + case 'C0': {$format = array(2599.37,3676.54); break;} + case 'C1': {$format = array(1836.85,2599.37); break;} + case 'C2': {$format = array(1298.27,1836.85); break;} + case 'C3': {$format = array(918.43,1298.27); break;} + case 'C4': {$format = array(649.13,918.43); break;} + case 'C5': {$format = array(459.21,649.13); break;} + case 'C6': {$format = array(323.15,459.21); break;} + case 'C7': {$format = array(229.61,323.15); break;} + case 'C8': {$format = array(161.57,229.61); break;} + case 'C9': {$format = array(113.39,161.57); break;} + case 'C10': {$format = array(79.37,113.39); break;} + case 'RA0': {$format = array(2437.80,3458.27); break;} + case 'RA1': {$format = array(1729.13,2437.80); break;} + case 'RA2': {$format = array(1218.90,1729.13); break;} + case 'RA3': {$format = array(864.57,1218.90); break;} + case 'RA4': {$format = array(609.45,864.57); break;} + case 'SRA0': {$format = array(2551.18,3628.35); break;} + case 'SRA1': {$format = array(1814.17,2551.18); break;} + case 'SRA2': {$format = array(1275.59,1814.17); break;} + case 'SRA3': {$format = array(907.09,1275.59); break;} + case 'SRA4': {$format = array(637.80,907.09); break;} + case 'LETTER': {$format = array(612.00,792.00); break;} + case 'LEGAL': {$format = array(612.00,1008.00); break;} + case 'LEDGER': {$format = array(279.00,432.00); break;} + case 'TABLOID': {$format = array(279.00,432.00); break;} + case 'EXECUTIVE': {$format = array(521.86,756.00); break;} + case 'FOLIO': {$format = array(612.00,936.00); break;} + case 'B': {$format=array(362.83,561.26 ); break;} // 'B' format paperback size 128x198mm + case 'A': {$format=array(314.65,504.57 ); break;} // 'A' format paperback size 111x178mm + case 'DEMY': {$format=array(382.68,612.28 ); break;} // 'Demy' format paperback size 135x216mm + case 'ROYAL': {$format=array(433.70,663.30 ); break;} // 'Royal' format paperback size 153x234mm + default: $format = false; + } + return $format; +} + + +/*-- PROGRESS-BAR --*/ +function StartProgressBarOutput($mode=1) { + // must be relative path, or URI (not a file system path) + if (!defined('_MPDF_URI')) { + $this->progressBar = false; + if ($this->debug) { $this->Error("You need to define _MPDF_URI to use the progress bar!"); } + else return false; + } + $this->progressBar = $mode; + if ($this->progbar_altHTML) { + echo $this->progbar_altHTML; + } + else { + echo '<html> + <head> + <title>mPDF File Progress</title> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <link rel="stylesheet" type="text/css" href="'._MPDF_URI.'progbar.css" /> + </head> + <body> + <div class="main"> + <div class="heading">'.$this->progbar_heading.'</div> + <div class="demo"> + '; + if ($this->progressBar==2) { echo ' <table width="100%"><tr><td style="width: 50%;"> + <span class="barheading">Writing HTML code</span> <br/> + + <div class="progressBar"> + <div id="element1" class="innerBar">&nbsp;</div> + </div> + <span class="code" id="box1"></span> + </td><td style="width: 50%;"> + <span class="barheading">Autosizing elements</span> <br/> + <div class="progressBar"> + <div id="element4" class="innerBar">&nbsp;</div> + </div> + <span class="code" id="box4"></span> + <br/><br/> + <span class="barheading">Writing Tables</span> <br/> + <div class="progressBar"> + <div id="element7" class="innerBar">&nbsp;</div> + </div> + <span class="code" id="box7"></span> + </td></tr> + <tr><td><br /><br /></td><td></td></tr> + <tr><td style="width: 50%;"> + '; } + echo ' <span class="barheading">Writing PDF file</span> <br/> + <div class="progressBar"> + <div id="element2" class="innerBar">&nbsp;</div> + </div> + <span class="code" id="box2"></span> + '; + if ($this->progressBar==2) { echo ' + </td><td style="width: 50%;"> + <span class="barheading">Memory usage</span> <br/> + <div class="progressBar"> + <div id="element5" class="innerBar">&nbsp;</div> + </div> + <span id="box5">0</span> '.ini_get("memory_limit").'<br /> + <br/><br/> + <span class="barheading">Memory usage (peak)</span> <br/> + <div class="progressBar"> + <div id="element6" class="innerBar">&nbsp;</div> + </div> + <span id="box6">0</span> '.ini_get("memory_limit").'<br /> + </td></tr> + </table> + '; } + echo ' <br/><br/> + <span id="box3"></span> + + </div> + '; + } + ob_flush(); + flush(); +} + +function UpdateProgressBar($el,$val,$txt='') { + // $val should be a string - 5 = actual value, +15 = increment + + if ($this->progressBar<2) { + if ($el>3) { return; } + else if ($el ==1) { $el = 2; } + } + echo '<script type="text/javascript">'; + if ($val) { echo ' document.getElementById(\'element'.$el.'\').style.width=\''.$val.'%\'; '; } + if ($txt) { echo ' document.getElementById(\'box'.$el.'\').innerHTML=\''.$txt.'\'; '; } + if ($this->progressBar==2) { + $m = round(memory_get_usage(true)/1048576); + $m2 = round(memory_get_peak_usage(true)/1048576); + $mem = $m * 100 / (ini_get("memory_limit")+0); + $mem2 = $m2 * 100 / (ini_get("memory_limit")+0); + echo ' document.getElementById(\'element5\').style.width=\''.$mem.'%\'; '; + echo ' document.getElementById(\'element6\').style.width=\''.$mem2.'%\'; '; + echo ' document.getElementById(\'box5\').innerHTML=\''.$m.'MB / \'; '; + echo ' document.getElementById(\'box6\').innerHTML=\''.$m2.'MB / \'; '; + } + echo '</script>'."\n"; + ob_flush(); + flush(); +} +/*-- END PROGRESS-BAR --*/ + + + +function RestrictUnicodeFonts($res) { + // $res = array of (Unicode) fonts to restrict to: e.g. norasi|norasiB - language specific + if (count($res)) { // Leave full list of available fonts if passed blank array + $this->available_unifonts = $res; + } + else { $this->available_unifonts = $this->default_available_fonts; } + if (count($this->available_unifonts) == 0) { $this->available_unifonts[] = $this->default_available_fonts[0]; } + $this->available_unifonts = array_values($this->available_unifonts); +} + + +function setMBencoding($enc) { + if ($this->mb_enc != $enc) { + $this->mb_enc = $enc; + mb_internal_encoding($this->mb_enc); + } +} + + +function SetMargins($left,$right,$top) { + //Set left, top and right margins + $this->lMargin=$left; + $this->rMargin=$right; + $this->tMargin=$top; +} + +function ResetMargins() { + //ReSet left, top margins + if (($this->forcePortraitHeaders || $this->forcePortraitMargins) && $this->DefOrientation=='P' && $this->CurOrientation=='L') { + if (($this->mirrorMargins) && (($this->page)%2==0)) { // EVEN + $this->tMargin=$this->orig_rMargin; + $this->bMargin=$this->orig_lMargin; + } + else { // ODD // OR NOT MIRRORING MARGINS/FOOTERS + $this->tMargin=$this->orig_lMargin; + $this->bMargin=$this->orig_rMargin; + } + $this->lMargin=$this->DeflMargin; + $this->rMargin=$this->DefrMargin; + $this->MarginCorrection = 0; + $this->PageBreakTrigger=$this->h-$this->bMargin; + } + else if (($this->mirrorMargins) && (($this->page)%2==0)) { // EVEN + $this->lMargin=$this->DefrMargin; + $this->rMargin=$this->DeflMargin; + $this->MarginCorrection = $this->DefrMargin-$this->DeflMargin; + + } + else { // ODD // OR NOT MIRRORING MARGINS/FOOTERS + $this->lMargin=$this->DeflMargin; + $this->rMargin=$this->DefrMargin; + if ($this->mirrorMargins) { $this->MarginCorrection = $this->DeflMargin-$this->DefrMargin; } + } + $this->x=$this->lMargin; + +} + +function SetLeftMargin($margin) { + //Set left margin + $this->lMargin=$margin; + if($this->page>0 and $this->x<$margin) $this->x=$margin; +} + +function SetTopMargin($margin) { + //Set top margin + $this->tMargin=$margin; +} + +function SetRightMargin($margin) { + //Set right margin + $this->rMargin=$margin; +} + +function SetAutoPageBreak($auto,$margin=0) { + //Set auto page break mode and triggering margin + $this->autoPageBreak=$auto; + $this->bMargin=$margin; + $this->PageBreakTrigger=$this->h-$margin; +} + +function SetDisplayMode($zoom,$layout='continuous') { + //Set display mode in viewer + if($zoom=='fullpage' or $zoom=='fullwidth' or $zoom=='real' or $zoom=='default' or !is_string($zoom)) + $this->ZoomMode=$zoom; + else + $this->Error('Incorrect zoom display mode: '.$zoom); + if($layout=='single' or $layout=='continuous' or $layout=='two' or $layout=='twoleft' or $layout=='tworight' or $layout=='default') + $this->LayoutMode=$layout; + else + $this->Error('Incorrect layout display mode: '.$layout); +} + +function SetCompression($compress) { + //Set page compression + if(function_exists('gzcompress')) $this->compress=$compress; + else $this->compress=false; +} + +function SetTitle($title) { + //Title of document // Arrives as UTF-8 + $this->title = $title; +} + +function SetSubject($subject) { + //Subject of document + $this->subject= $subject; +} + +function SetAuthor($author) { + //Author of document + $this->author= $author; +} + +function SetKeywords($keywords) { + //Keywords of document + $this->keywords= $keywords; +} + +function SetCreator($creator) { + //Creator of document + $this->creator= $creator; +} + + +function SetAnchor2Bookmark($x) { + $this->anchor2Bookmark = $x; +} + +function AliasNbPages($alias='{nb}') { + //Define an alias for total number of pages + $this->aliasNbPg=$alias; +} + +function AliasNbPageGroups($alias='{nbpg}') { + //Define an alias for total number of pages in a group + $this->aliasNbPgGp=$alias; +} + +function SetAlpha($alpha, $bm='Normal', $return=false, $mode='B') { +// alpha: real value from 0 (transparent) to 1 (opaque) +// bm: blend mode, one of the following: +// Normal, Multiply, Screen, Overlay, Darken, Lighten, ColorDodge, ColorBurn, +// HardLight, SoftLight, Difference, Exclusion, Hue, Saturation, Color, Luminosity +// set alpha for stroking (CA) and non-stroking (ca) operations +// mode determines F (fill) S (stroke) B (both) + if (($this->PDFA || $this->PDFX) && $alpha!=1) { + if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "Image opacity must be 100% (Opacity changed to 100%)"; } + $alpha = 1; + } + $a = array('BM'=>'/'.$bm); + if ($mode=='F' || $mode='B') $a['ca'] = $alpha; + if ($mode=='S' || $mode='B') $a['CA'] = $alpha; + $gs = $this->AddExtGState($a); + if ($return) { return sprintf('/GS%d gs', $gs); } + else { $this->_out(sprintf('/GS%d gs', $gs)); } +} + +function AddExtGState($parms) { + $n = count($this->extgstates); + // check if graphics state already exists + for ($i=1; $i<=$n; $i++) { + if (count($this->extgstates[$i]['parms']) == count($parms)) { + $same = true; + foreach($this->extgstates[$i]['parms'] AS $k=>$v) { + if (!isset($parms[$k]) || $parms[$k] != $v) { $same = false; break; } + } + if ($same) { return $i; } + } + } + $n++; + $this->extgstates[$n]['parms'] = $parms; + return $n; +} + +function SetVisibility($v) { + if (($this->PDFA || $this->PDFX) && $this->visibility!='visible') { $this->PDFAXwarnings[] = "Cannot set visibility to anything other than full when using PDFA or PDFX"; return ''; } + else if (!$this->PDFA && !$this->PDFX) + $this->pdf_version='1.5'; + if($this->visibility!='visible') { + $this->_out('EMC'); + $this->hasOC=intval($this->hasOC ); // mPDF 5.6.01 + } + if($v=='printonly') { + $this->_out('/OC /OC1 BDC'); + $this->hasOC=($this->hasOC | 1); // mPDF 5.6.01 + } + elseif($v=='screenonly') { + $this->_out('/OC /OC2 BDC'); + $this->hasOC=($this->hasOC | 2); // mPDF 5.6.01 + } + elseif($v=='hidden') { + $this->_out('/OC /OC3 BDC'); + $this->hasOC=($this->hasOC | 4); // mPDF 5.6.01 + } + elseif($v!='visible') + $this->Error('Incorrect visibility: '.$v); + $this->visibility=$v; +} + +function Error($msg) { + //Fatal error + header('Content-Type: text/html; charset=utf-8'); + die('<B>mPDF error: </B>'.$msg); +} + +function Open() { + //Begin document + if($this->state==0) $this->_begindoc(); +} + +function Close() { + if ($this->progressBar) { $this->UpdateProgressBar(2,'2','Closing last page'); } // *PROGRESS-BAR* + //Terminate document + if($this->state==3) return; + if($this->page==0) $this->AddPage($this->CurOrientation); + if (count($this->cellBorderBuffer)) { $this->printcellbuffer(); } // *TABLES* + if ($this->tablebuffer) { $this->printtablebuffer(); } // *TABLES* +/*-- COLUMNS --*/ + + if ($this->ColActive) { + $this->SetColumns(0); + $this->ColActive = 0; + if (count($this->columnbuffer)) { $this->printcolumnbuffer(); } + } +/*-- END COLUMNS --*/ + if (count($this->divbuffer)) { $this->printdivbuffer(); } + + // BODY Backgrounds + $s = ''; + + $s .= $this->PrintBodyBackgrounds(); + + $s .= $this->PrintPageBackgrounds(); + $this->pages[$this->page] = preg_replace('/(___BACKGROUND___PATTERNS'.date('jY').')/', "\n".$s."\n".'\\1', $this->pages[$this->page]); + $this->pageBackgrounds = array(); + + if($this->visibility!='visible') + $this->SetVisibility('visible'); + // mPDF 5.6.01 - LAYERS + $this->EndLayer(); + + if (!$this->tocontents || !$this->tocontents->TOCmark) { //Page footer + $this->InFooter=true; + $this->Footer(); + $this->InFooter=false; + } + if ($this->tocontents && ($this->tocontents->TOCmark || count($this->tocontents->m_TOC))) { $this->tocontents->insertTOC(); } // *TOC* + + //Close page + $this->_endpage(); + + //Close document + $this->_enddoc(); +} + +/*-- BACKGROUNDS --*/ +function _resizeBackgroundImage($imw, $imh, $cw, $ch, $resize=0, $repx, $repy, $pba=array(), $size=array()) { // mPDF 5.6.10 + // pba is background positioning area (from CSS background-origin) may not always be set [x,y,w,h] + // size is from CSS3 background-size - takes precendence over old resize + // $w - absolute length or % or auto or cover | contain + // $h - absolute length or % or auto or cover | contain + // mPDF 5.6.10 + if (isset($pba['w'])) $cw = $pba['w']; + if (isset($pba['h'])) $ch = $pba['h']; + + $cw = $cw*_MPDFK; + $ch = $ch*_MPDFK; + if (empty($size) && !$resize) { return array($imw, $imh, $repx, $repy); } + + // mPDF 5.6.10 + if (isset($size['w']) && $size['w']) { + if ($size['w']=='contain') { + // Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest size such that both its width and its height can fit inside the background positioning area. + // Same as resize==3 + $h = $imh * $cw/$imw; + $w = $cw; + if ($h > $ch) { + $w = $w * $ch/$h; + $h = $ch; + } + } + else if ($size['w']=='cover') { + // Scale the image, while preserving its intrinsic aspect ratio (if any), to the smallest size such that both its width and its height can completely cover the background positioning area. + $h = $imh * $cw/$imw; + $w = $cw; + if ($h < $ch) { + $w = $w * $h/$ch; + $h = $ch; + } + } + else { + if (stristr($size['w'] ,'%')) { + $size['w'] += 0; + $size['w'] /= 100; + $size['w'] = ($cw * $size['w']); + } + if (stristr($size['h'] ,'%')) { + $size['h'] += 0; + $size['h'] /= 100; + $size['h'] = ($ch * $size['h']); + } + if ($size['w']=='auto' && $size['h']=='auto') { + $w = $imw; + $h = $imh; + } + else if ($size['w']=='auto' && $size['h']!='auto') { + $w = $imw * $size['h']/$imh; + $h = $size['h']; + } + else if ($size['w']!='auto' && $size['h']=='auto') { + $h = $imh * $size['w']/$imw; + $w = $size['w']; + } + else { + $w = $size['w']; + $h = $size['h']; + } + } + return array($w, $h, $repx, $repy); + } + else if ($resize==1 && $imw > $cw) { + $h = $imh * $cw/$imw; + return array($cw, $h, $repx, $repy); + } + else if ($resize==2 && $imh > $ch) { + $w = $imw * $ch/$imh; + return array($w, $ch, $repx, $repy); + } + else if ($resize==3) { + $w = $imw; + $h = $imh; + if ($w > $cw) { + $h = $h * $cw/$w; + $w = $cw; + } + if ($h > $ch) { + $w = $w * $ch/$h; + $h = $ch; + } + return array($w, $h, $repx, $repy); + } + else if ($resize==4) { + $h = $imh * $cw/$imw; + return array($cw, $h, $repx, $repy); + } + else if ($resize==5) { + $w = $imw * $ch/$imh; + return array($w, $ch, $repx, $repy); + } + else if ($resize==6) { + return array($cw, $ch, $repx, $repy); + } + return array($imw, $imh, $repx, $repy); +} + + +function SetBackground(&$properties, &$maxwidth) { + // mPDF 5.6.10 5.6.11 + if (isset($properties['BACKGROUND-ORIGIN']) && ($properties['BACKGROUND-ORIGIN']=='border-box' || $properties['BACKGROUND-ORIGIN']== 'content-box')) { $origin = $properties['BACKGROUND-ORIGIN']; } + else { $origin = 'padding-box'; } + // mPDF 5.6.10 + if (isset($properties['BACKGROUND-SIZE'])) { + if (stristr($properties['BACKGROUND-SIZE'] ,'contain') ) { $bsw = $bsh = 'contain'; } + else if (stristr($properties['BACKGROUND-SIZE'] ,'cover') ) { $bsw = $bsh = 'cover'; } + else { + $bsw = $bsh = 'auto'; + $sz = preg_split('/\s+/',trim($properties['BACKGROUND-SIZE'])); + if (count($sz)==2) { $bsw = $sz[0]; $bsh = $sz[1]; } + else { $bsw = $sz[0]; } + if (!stristr($bsw ,'%') && !stristr($bsw ,'auto') ) { $bsw = $this->ConvertSize($bsw ,$maxwidth,$this->FontSize); } + if (!stristr($bsh ,'%') && !stristr($bsh ,'auto') ) { $bsh = $this->ConvertSize($bsh ,$maxwidth,$this->FontSize); } + } + $size = array('w'=>$bsw, 'h'=>$bsh); + } + if (preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/',$properties['BACKGROUND-IMAGE'])) { + return array('gradient'=>$properties['BACKGROUND-IMAGE'], 'origin'=>$origin, 'size'=>$size ); // mPDF 5.6.10 + } + else { + $file = $properties['BACKGROUND-IMAGE']; + $sizesarray = $this->Image($file,0,0,0,0,'','',false, false, false, false, true); + if (isset($sizesarray['IMAGE_ID'])) { + $image_id = $sizesarray['IMAGE_ID']; + $orig_w = $sizesarray['WIDTH']*_MPDFK; // in user units i.e. mm + $orig_h = $sizesarray['HEIGHT']*_MPDFK; // (using $this->img_dpi) + if (isset($properties['BACKGROUND-IMAGE-RESOLUTION'])) { + if (preg_match('/from-image/i', $properties['BACKGROUND-IMAGE-RESOLUTION']) && isset($sizesarray['set-dpi']) && $sizesarray['set-dpi']>0) { + $orig_w *= $this->img_dpi / $sizesarray['set-dpi']; + $orig_h *= $this->img_dpi / $sizesarray['set-dpi']; + } + else if (preg_match('/(\d+)dpi/i', $properties['BACKGROUND-IMAGE-RESOLUTION'], $m)) { + $dpi = $m[1]; + if ($dpi > 0) { + $orig_w *= $this->img_dpi / $dpi; + $orig_h *= $this->img_dpi / $dpi; + } + } + } + $x_repeat = true; + $y_repeat = true; + if (isset($properties['BACKGROUND-REPEAT'])) { + if ($properties['BACKGROUND-REPEAT']=='no-repeat' || $properties['BACKGROUND-REPEAT']=='repeat-x') { $y_repeat = false; } + if ($properties['BACKGROUND-REPEAT']=='no-repeat' || $properties['BACKGROUND-REPEAT']=='repeat-y') { $x_repeat = false; } + } + $x_pos = 0; + $y_pos = 0; + if (isset($properties['BACKGROUND-POSITION'])) { + $ppos = preg_split('/\s+/',$properties['BACKGROUND-POSITION']); + $x_pos = $ppos[0]; + $y_pos = $ppos[1]; + if (!stristr($x_pos ,'%') ) { $x_pos = $this->ConvertSize($x_pos ,$maxwidth,$this->FontSize); } + if (!stristr($y_pos ,'%') ) { $y_pos = $this->ConvertSize($y_pos ,$maxwidth,$this->FontSize); } + } + if (isset($properties['BACKGROUND-IMAGE-RESIZE'])) { $resize = $properties['BACKGROUND-IMAGE-RESIZE']; } + else { $resize = 0; } + if (isset($properties['BACKGROUND-IMAGE-OPACITY'])) { $opacity = $properties['BACKGROUND-IMAGE-OPACITY']; } + else { $opacity = 1; } + return array('image_id'=>$image_id, 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$x_pos, 'y_pos'=>$y_pos, 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'resize'=>$resize, 'opacity'=>$opacity, 'itype'=>$sizesarray['itype'], 'origin'=>$origin, 'size'=>$size ); + } + } + return false; +} +/*-- END BACKGROUNDS --*/ + +function PrintBodyBackgrounds() { + $s = ''; + $clx = 0; + $cly = 0; + $clw = $this->w; + $clh = $this->h; + // If using bleed and trim margins in paged media + if ($this->pageDim[$this->page]['outer_width_LR'] || $this->pageDim[$this->page]['outer_width_TB']) { + $clx = $this->pageDim[$this->page]['outer_width_LR'] - $this->pageDim[$this->page]['bleedMargin']; + $cly = $this->pageDim[$this->page]['outer_width_TB'] - $this->pageDim[$this->page]['bleedMargin']; + $clw = $this->w - 2*$clx; + $clh = $this->h - 2*$cly; + } + + if ($this->bodyBackgroundColor) { + $s .= 'q ' .$this->SetFColor($this->bodyBackgroundColor, true)."\n"; + if ($this->bodyBackgroundColor{0}==5) { // RGBa + $s .= $this->SetAlpha(ord($this->bodyBackgroundColor{4})/100, 'Normal', true, 'F')."\n"; + } + else if ($this->bodyBackgroundColor{0}==6) { // CMYKa + $s .= $this->SetAlpha(ord($this->bodyBackgroundColor{5})/100, 'Normal', true, 'F')."\n"; + } + $s .= sprintf('%.3F %.3F %.3F %.3F re f Q', ($clx*_MPDFK), ($cly*_MPDFK),$clw*_MPDFK,$clh*_MPDFK)."\n"; + } + +/*-- BACKGROUNDS --*/ + if ($this->bodyBackgroundGradient) { + $g = $this->grad->parseBackgroundGradient($this->bodyBackgroundGradient); + if ($g) { + $s .= $this->grad->Gradient($clx, $cly, $clw, $clh, (isset($g['gradtype']) ? $g['gradtype'] : null), $g['stops'], $g['colorspace'], $g['coords'], $g['extend'], true); + } + } + if ($this->bodyBackgroundImage) { + if ( $this->bodyBackgroundImage['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $this->bodyBackgroundImage['gradient'])) { + $g = $this->grad->parseMozGradient( $this->bodyBackgroundImage['gradient']); + if ($g) { + $s .= $this->grad->Gradient($clx, $cly, $clw, $clh, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend'], true); + } + } + else if ($this->bodyBackgroundImage['image_id']) { // Background pattern + $n = count($this->patterns)+1; + // If using resize, uses TrimBox (not including the bleed) + list($orig_w, $orig_h, $x_repeat, $y_repeat) = $this->_resizeBackgroundImage($this->bodyBackgroundImage['orig_w'], $this->bodyBackgroundImage['orig_h'], $clw, $clh, $this->bodyBackgroundImage['resize'], $this->bodyBackgroundImage['x_repeat'], $this->bodyBackgroundImage['y_repeat']); + + $this->patterns[$n] = array('x'=>$clx, 'y'=>$cly, 'w'=>$clw, 'h'=>$clh, 'pgh'=>$this->h, 'image_id'=>$this->bodyBackgroundImage['image_id'], 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$this->bodyBackgroundImage['x_pos'], 'y_pos'=>$this->bodyBackgroundImage['y_pos'], 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'itype'=>$this->bodyBackgroundImage['itype']); + if (($this->bodyBackgroundImage['opacity']>0 || $this->bodyBackgroundImage['opacity']==='0') && $this->bodyBackgroundImage['opacity']<1) { $opac = $this->SetAlpha($this->bodyBackgroundImage['opacity'],'Normal',true); } + else { $opac = ''; } + $s .= sprintf('q /Pattern cs /P%d scn %s %.3F %.3F %.3F %.3F re f Q', $n, $opac, ($clx*_MPDFK), ($cly*_MPDFK),$clw*_MPDFK, $clh*_MPDFK) ."\n"; + } + } +/*-- END BACKGROUNDS --*/ + return $s; +} + + +function PrintPageBackgrounds($adjustmenty=0) { + $s = ''; + + ksort($this->pageBackgrounds); + foreach($this->pageBackgrounds AS $bl=>$pbs) { + foreach ($pbs AS $pb) { + if ((!isset($pb['image_id']) && !isset($pb['gradient'])) || isset($pb['shadowonly'])) { // Background colour or boxshadow + // mPDF 5.6.01 - LAYERS + if($pb['z-index']>0) { + $this->current_layer = $pb['z-index']; + $s .= "\n".'/OCBZ-index /ZI'.$pb['z-index'].' BDC'."\n"; + } + + if($pb['visibility']!='visible') { + if($pb['visibility']=='printonly') + $s .= '/OC /OC1 BDC'."\n"; + else if($pb['visibility']=='screenonly') + $s .= '/OC /OC2 BDC'."\n"; + else if($pb['visibility']=='hidden') + $s .= '/OC /OC3 BDC'."\n"; + } + // Box shadow + if (isset($pb['shadow']) && $pb['shadow']) { $s .= $pb['shadow']."\n"; } + if (isset($pb['clippath']) && $pb['clippath']) { $s .= $pb['clippath']."\n"; } + $s .= 'q '.$this->SetFColor($pb['col'], true)."\n"; + if ($pb['col']{0}==5) { // RGBa + $s .= $this->SetAlpha(ord($pb['col']{4})/100, 'Normal', true, 'F')."\n"; + } + else if ($pb['col']{0}==6) { // CMYKa + $s .= $this->SetAlpha(ord($pb['col']{5})/100, 'Normal', true, 'F')."\n"; + } + $s .= sprintf('%.3F %.3F %.3F %.3F re f Q',$pb['x']*_MPDFK,($this->h-$pb['y'])*_MPDFK,$pb['w']*_MPDFK,-$pb['h']*_MPDFK)."\n"; + if (isset($pb['clippath']) && $pb['clippath']) { $s .= 'Q'."\n"; } + if($pb['visibility']!='visible') + $s .= 'EMC'."\n"; + + // mPDF 5.6.01 - LAYERS + if($pb['z-index']>0) { + $s .= "\n".'EMCBZ-index'."\n"; + $this->current_layer = 0; + } + } + } +/*-- BACKGROUNDS --*/ + foreach ($pbs AS $pb) { + // mPDF 5.6.01 - LAYERS + if ((isset($pb['gradient']) && $pb['gradient']) || (isset($pb['image_id']) && $pb['image_id'])) { + if($pb['z-index']>0) { + $this->current_layer = $pb['z-index']; + $s .= "\n".'/OCGZ-index /ZI'.$pb['z-index'].' BDC'."\n"; + } + if($pb['visibility']!='visible') { + if($pb['visibility']=='printonly') + $s .= '/OC /OC1 BDC'."\n"; + else if($pb['visibility']=='screenonly') + $s .= '/OC /OC2 BDC'."\n"; + else if($pb['visibility']=='hidden') + $s .= '/OC /OC3 BDC'."\n"; + } + } + if (isset($pb['gradient']) && $pb['gradient']) { + if (isset($pb['clippath']) && $pb['clippath']) { $s .= $pb['clippath']."\n"; } + $s .= $this->grad->Gradient($pb['x'], $pb['y'], $pb['w'], $pb['h'], $pb['gradtype'], $pb['stops'], $pb['colorspace'], $pb['coords'], $pb['extend'], true); + if (isset($pb['clippath']) && $pb['clippath']) { $s .= 'Q'."\n"; } + } + else if (isset($pb['image_id']) && $pb['image_id']) { // Background Image + $pb['y'] -= $adjustmenty; + $pb['h'] += $adjustmenty; + $n = count($this->patterns)+1; + list($orig_w, $orig_h, $x_repeat, $y_repeat) = $this->_resizeBackgroundImage($pb['orig_w'], $pb['orig_h'], $pb['w'], $pb['h'], $pb['resize'], $pb['x_repeat'], $pb['y_repeat'], $pb['bpa'], $pb['size']); // mPDF 5.6.10 + $this->patterns[$n] = array('x'=>$pb['x'], 'y'=>$pb['y'], 'w'=>$pb['w'], 'h'=>$pb['h'], 'pgh'=>$this->h, 'image_id'=>$pb['image_id'], 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$pb['x_pos'], 'y_pos'=>$pb['y_pos'], 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'itype'=>$pb['itype'], 'bpa'=>$pb['bpa']); // mPDF 5.6.10 + $x = $pb['x']*_MPDFK; + $y = ($this->h - $pb['y'])*_MPDFK; + $w = $pb['w']*_MPDFK; + $h = -$pb['h']*_MPDFK; + if (isset($pb['clippath']) && $pb['clippath']) { $s .= $pb['clippath']."\n"; } + if ($this->writingHTMLfooter || $this->writingHTMLheader) { // Write each (tiles) image rather than use as a pattern + $iw = $pb['orig_w']/_MPDFK; + $ih = $pb['orig_h']/_MPDFK; + + $w = $pb['w']; + $h = $pb['h']; + $x0 = $pb['x']; + $y0 = $pb['y']; + + // mPDF 5.6.11 + if (isset($pb['bpa']) && $pb['bpa']) { + $w = $pb['bpa']['w']; + $h = $pb['bpa']['h']; + $x0 = $pb['bpa']['x']; + $y0 = $pb['bpa']['y']; + } + + // mPDF 5.6.11 + if (isset($pb['size']['w']) && $pb['size']['w']) { + $size = $pb['size']; + + if ($size['w']=='contain') { + // Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest size such that both its width and its height can fit inside the background positioning area. + // Same as resize==3 + $ih = $ih * $pb['bpa']['w']/$iw; + $iw = $pb['bpa']['w']; + if ($ih > $pb['bpa']['h']) { + $iw = $iw * $pb['bpa']['h']/$ih; + $ih = $pb['bpa']['h']; + } + } + else if ($size['w']=='cover') { + // Scale the image, while preserving its intrinsic aspect ratio (if any), to the smallest size such that both its width and its height can completely cover the background positioning area. + $ih = $ih * $pb['bpa']['w']/$iw; + $iw = $pb['bpa']['w']; + if ($ih < $pb['bpa']['h']) { + $iw = $iw * $ih/$pb['bpa']['h']; + $ih = $pb['bpa']['h']; + } + } + else { + if (stristr($size['w'] ,'%')) { + $size['w'] += 0; + $size['w'] /= 100; + $size['w'] = ($pb['bpa']['w'] * $size['w']); + } + if (stristr($size['h'] ,'%')) { + $size['h'] += 0; + $size['h'] /= 100; + $size['h'] = ($pb['bpa']['h'] * $size['h']); + } + if ($size['w']=='auto' && $size['h']=='auto') { + $iw = $iw; + $ih = $ih; + } + else if ($size['w']=='auto' && $size['h']!='auto') { + $iw = $iw * $size['h']/$ih; + $ih = $size['h']; + } + else if ($size['w']!='auto' && $size['h']=='auto') { + $ih = $ih * $size['w']/$iw; + $iw = $size['w']; + } + else { + $iw = $size['w']; + $ih = $size['h']; + } + } + } + + // Number to repeat + if ($pb['x_repeat']) { $nx = ceil($pb['w']/$iw)+1; } // mPDF 5.6.11 + else { $nx = 1; } + if ($pb['y_repeat']) { $ny = ceil($pb['h']/$ih)+1; } // mPDF 5.6.11 + else { $ny = 1; } + + $x_pos = $pb['x_pos']; + if (stristr($x_pos ,'%') ) { + $x_pos += 0; + $x_pos /= 100; + $x_pos = ($pb['bpa']['w'] * $x_pos) - ($iw * $x_pos); // mPDF 5.6.11 + } + $y_pos = $pb['y_pos']; + if (stristr($y_pos ,'%') ) { + $y_pos += 0; + $y_pos /= 100; + $y_pos = ($pb['bpa']['h'] * $y_pos) - ($ih * $y_pos); // mPDF 5.6.11 + } + if ($nx>1) { + while($x_pos>($pb['x']-$pb['bpa']['x'])) { $x_pos -= $iw; } // mPDF 5.6.11 + } + if ($ny>1) { + while($y_pos>($pb['y']-$pb['bpa']['y'])) { $y_pos -= $ih; } // mPDF 5.6.11 + } + for($xi=0;$xi<$nx;$xi++) { + for($yi=0;$yi<$ny;$yi++) { + $x = $x0 + $x_pos + ($iw*$xi); + $y = $y0 + $y_pos + ($ih*$yi); + if ($pb['opacity']>0 && $pb['opacity']<1) { $opac = $this->SetAlpha($pb['opacity'],'Normal',true); } + else { $opac = ''; } + $s .= sprintf("q %s %.3F 0 0 %.3F %.3F %.3F cm /I%d Do Q", $opac,$iw*_MPDFK,$ih*_MPDFK,$x*_MPDFK,($this->h-($y+$ih))*_MPDFK,$pb['image_id']) ."\n"; + } + } + } + else { + if (($pb['opacity']>0 || $pb['opacity']==='0') && $pb['opacity']<1) { $opac = $this->SetAlpha($pb['opacity'],'Normal',true); } + else { $opac = ''; } + $s .= sprintf('q /Pattern cs /P%d scn %s %.3F %.3F %.3F %.3F re f Q', $n, $opac, $x, $y, $w, $h) ."\n"; + } + if (isset($pb['clippath']) && $pb['clippath']) { $s .= 'Q'."\n"; } + } + if ((isset($pb['gradient']) && $pb['gradient']) || (isset($pb['image_id']) && $pb['image_id'])) { + if($pb['visibility']!='visible') + $s .= 'EMC'."\n"; + + // mPDF 5.6.01 - LAYERS + if($pb['z-index']>0) { + $s .= "\n".'EMCGZ-index'."\n"; + $this->current_layer = 0; + } + } + + } +/*-- END BACKGROUNDS --*/ + } + return $s; +} + +function PrintTableBackgrounds($adjustmenty=0) { + $s = ''; +/*-- BACKGROUNDS --*/ + ksort($this->tableBackgrounds); + foreach($this->tableBackgrounds AS $bl=>$pbs) { + foreach ($pbs AS $pb) { + if ((!isset($pb['gradient']) || !$pb['gradient']) && (!isset($pb['image_id']) || !$pb['image_id'])) { + $s .= 'q '.$this->SetFColor($pb['col'], true)."\n"; + if ($pb['col']{0}==5) { // RGBa + $s .= $this->SetAlpha(ord($pb['col']{4})/100, 'Normal', true, 'F')."\n"; + } + else if ($pb['col']{0}==6) { // CMYKa + $s .= $this->SetAlpha(ord($pb['col']{5})/100, 'Normal', true, 'F')."\n"; + } + $s .= sprintf('%.3F %.3F %.3F %.3F re %s Q',$pb['x']*_MPDFK,($this->h-$pb['y'])*_MPDFK,$pb['w']*_MPDFK,-$pb['h']*_MPDFK,'f')."\n"; + } + if (isset($pb['gradient']) && $pb['gradient']) { + if (isset($pb['clippath']) && $pb['clippath']) { $s .= $pb['clippath']."\n"; } + $s .= $this->grad->Gradient($pb['x'], $pb['y'], $pb['w'], $pb['h'], $pb['gradtype'], $pb['stops'], $pb['colorspace'], $pb['coords'], $pb['extend'], true); + if (isset($pb['clippath']) && $pb['clippath']) { $s .= 'Q'."\n"; } + } + if (isset($pb['image_id']) && $pb['image_id']) { // Background pattern + $pb['y'] -= $adjustmenty; + $pb['h'] += $adjustmenty; + $n = count($this->patterns)+1; + list($orig_w, $orig_h, $x_repeat, $y_repeat) = $this->_resizeBackgroundImage($pb['orig_w'], $pb['orig_h'], $pb['w'], $pb['h'], $pb['resize'], $pb['x_repeat'], $pb['y_repeat']); + $this->patterns[$n] = array('x'=>$pb['x'], 'y'=>$pb['y'], 'w'=>$pb['w'], 'h'=>$pb['h'], 'pgh'=>$this->h, 'image_id'=>$pb['image_id'], 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$pb['x_pos'], 'y_pos'=>$pb['y_pos'], 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'itype'=>$pb['itype']); + $x = $pb['x']*_MPDFK; + $y = ($this->h - $pb['y'])*_MPDFK; + $w = $pb['w']*_MPDFK; + $h = -$pb['h']*_MPDFK; + if (isset($pb['clippath']) && $pb['clippath']) { $s .= $pb['clippath']."\n"; } + if ($pb['opacity']>0 && $pb['opacity']<1) { $opac = $this->SetAlpha($pb['opacity'],'Normal',true); } + else { $opac = ''; } + $s .= sprintf('q /Pattern cs /P%d scn %s %.3F %.3F %.3F %.3F re f Q', $n, $opac, $x, $y, $w, $h) ."\n"; + if (isset($pb['clippath']) && $pb['clippath']) { $s .= 'Q'."\n"; } + } + } + } +/*-- END BACKGROUNDS --*/ + return $s; +} + +// mPDF 5.6.01 - LAYERS +function BeginLayer($id) { + if($this->current_layer>0) $this->EndLayer(); + if ($id < 1) { return false; } + if (!isset($this->layers[$id])) { + $this->layers[$id] = array('name'=>'Layer '.($id) ); + if (($this->PDFA || $this->PDFX)) { $this->PDFAXwarnings[] = "Cannot use layers when using PDFA or PDFX"; return ''; } + else if (!$this->PDFA && !$this->PDFX) { $this->pdf_version='1.5'; } + } + $this->current_layer = $id; + $this->_out('/OCZ-index /ZI'.$id.' BDC'); + + $this->pageoutput[$this->page] = array(); +} + +function EndLayer() { + if($this->current_layer>0) { + $this->_out('EMCZ-index'); + $this->current_layer = 0; + } +} + + + +// Depracated - can use AddPage for all +function AddPages($orientation='',$condition='', $resetpagenum='', $pagenumstyle='', $suppress='',$mgl='',$mgr='',$mgt='',$mgb='',$mgh='',$mgf='',$ohname='',$ehname='',$ofname='',$efname='',$ohvalue=0,$ehvalue=0,$ofvalue=0,$efvalue=0,$pagesel='',$newformat='') +{ + $this->AddPage($orientation,$condition,$resetpagenum, $pagenumstyle, $suppress,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue,$pagesel,$newformat); +} + + +function AddPageByArray($a) { + if (!is_array($a)) { $a = array(); } + $orientation = (isset($a['orientation']) ? $a['orientation'] : ''); + $condition = (isset($a['condition']) ? $a['condition'] : (isset($a['type']) ? $a['type'] : '')); + $resetpagenum = (isset($a['resetpagenum']) ? $a['resetpagenum'] : ''); + $pagenumstyle = (isset($a['pagenumstyle']) ? $a['pagenumstyle'] : ''); + $suppress = (isset($a['suppress']) ? $a['suppress'] : ''); + $mgl = (isset($a['mgl']) ? $a['mgl'] : (isset($a['margin-left']) ? $a['margin-left'] : '')); + $mgr = (isset($a['mgr']) ? $a['mgr'] : (isset($a['margin-right']) ? $a['margin-right'] : '')); + $mgt = (isset($a['mgt']) ? $a['mgt'] : (isset($a['margin-top']) ? $a['margin-top'] : '')); + $mgb = (isset($a['mgb']) ? $a['mgb'] : (isset($a['margin-bottom']) ? $a['margin-bottom'] : '')); + $mgh = (isset($a['mgh']) ? $a['mgh'] : (isset($a['margin-header']) ? $a['margin-header'] : '')); + $mgf = (isset($a['mgf']) ? $a['mgf'] : (isset($a['margin-footer']) ? $a['margin-footer'] : '')); + $ohname = (isset($a['ohname']) ? $a['ohname'] : (isset($a['odd-header-name']) ? $a['odd-header-name'] : '')); + $ehname = (isset($a['ehname']) ? $a['ehname'] : (isset($a['even-header-name']) ? $a['even-header-name'] : '')); + $ofname = (isset($a['ofname']) ? $a['ofname'] : (isset($a['odd-footer-name']) ? $a['odd-footer-name'] : '')); + $efname = (isset($a['efname']) ? $a['efname'] : (isset($a['even-footer-name']) ? $a['even-footer-name'] : '')); + $ohvalue = (isset($a['ohvalue']) ? $a['ohvalue'] : (isset($a['odd-header-value']) ? $a['odd-header-value'] : 0)); + $ehvalue = (isset($a['ehvalue']) ? $a['ehvalue'] : (isset($a['even-header-value']) ? $a['even-header-value'] : 0)); + $ofvalue = (isset($a['ofvalue']) ? $a['ofvalue'] : (isset($a['odd-footer-value']) ? $a['odd-footer-value'] : 0)); + $efvalue = (isset($a['efvalue']) ? $a['efvalue'] : (isset($a['even-footer-value']) ? $a['even-footer-value'] : 0)); + $pagesel = (isset($a['pagesel']) ? $a['pagesel'] : (isset($a['pageselector']) ? $a['pageselector'] : '')); + $newformat = (isset($a['newformat']) ? $a['newformat'] : (isset($a['sheet-size']) ? $a['sheet-size'] : '')); + + $this->AddPage($orientation,$condition,$resetpagenum, $pagenumstyle, $suppress,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue,$pagesel,$newformat); + +} + + +function AddPage($orientation='',$condition='', $resetpagenum='', $pagenumstyle='', $suppress='',$mgl='',$mgr='',$mgt='',$mgb='',$mgh='',$mgf='',$ohname='',$ehname='',$ofname='',$efname='',$ohvalue=0,$ehvalue=0,$ofvalue=0,$efvalue=0,$pagesel='',$newformat='') +{ +/*-- CSS-FLOAT --*/ + // Float DIV + // Cannot do with columns on, or if any change in page orientation/margins etc. + // If next page already exists - i.e background /headers and footers already written + if ($this->state > 0 && $this->page < count($this->pages)) { + $bak_cml = $this->cMarginL; + $bak_cmr = $this->cMarginR; + $bak_dw = $this->divwidth; + // Paint Div Border if necessary + if ($this->blklvl > 0) { + $save_tr = $this->table_rotate; // *TABLES* + $this->table_rotate = 0; // *TABLES* + if ($this->y == $this->blk[$this->blklvl]['y0']) { $this->blk[$this->blklvl]['startpage']++; } + if (($this->y > $this->blk[$this->blklvl]['y0']) || $this->flowingBlockAttr['is_table'] ) { $toplvl = $this->blklvl; } + else { $toplvl = $this->blklvl-1; } + $sy = $this->y; + for ($bl=1;$bl<=$toplvl;$bl++) { + $this->PaintDivBB('pagebottom',0,$bl); + } + $this->y = $sy; + $this->table_rotate = $save_tr; // *TABLES* + } + $s = $this->PrintPageBackgrounds(); + + // Writes after the marker so not overwritten later by page background etc. + $this->pages[$this->page] = preg_replace('/(___BACKGROUND___PATTERNS'.date('jY').')/', '\\1'."\n".$s."\n", $this->pages[$this->page]); + $this->pageBackgrounds = array(); + $family=$this->FontFamily; + $style=$this->FontStyle.($this->U ? 'U' : '').($this->S ? 'S' : ''); + $size=$this->FontSizePt; + $lw=$this->LineWidth; + $dc=$this->DrawColor; + $fc=$this->FillColor; + $tc=$this->TextColor; + $cf=$this->ColorFlag; + + $this->printfloatbuffer(); + + //Move to next page + $this->page++; + $this->ResetMargins(); + $this->SetAutoPageBreak($this->autoPageBreak,$this->bMargin); + $this->x=$this->lMargin; + $this->y=$this->tMargin; + $this->FontFamily=''; + $this->_out('2 J'); + $this->LineWidth=$lw; + $this->_out(sprintf('%.3F w',$lw*_MPDFK)); + if($family) $this->SetFont($family,$style,$size,true,true); + $this->DrawColor=$dc; + if($dc!=$this->defDrawColor) $this->_out($dc); + $this->FillColor=$fc; + if($fc!=$this->defFillColor) $this->_out($fc); + $this->TextColor=$tc; + $this->ColorFlag=$cf; + for($bl=1;$bl<=$this->blklvl;$bl++) { + $this->blk[$bl]['y0'] = $this->y; + // Don't correct more than once for background DIV containing a Float + if (!isset($this->blk[$bl]['marginCorrected'][$this->page])) { $this->blk[$bl]['x0'] += $this->MarginCorrection; } + $this->blk[$bl]['marginCorrected'][$this->page] = true; + } + $this->cMarginL = $bak_cml; + $this->cMarginR = $bak_cmr; + $this->divwidth = $bak_dw; + return ''; + } +/*-- END CSS-FLOAT --*/ + + //Start a new page + if($this->state==0) $this->Open(); + + $bak_cml = $this->cMarginL; + $bak_cmr = $this->cMarginR; + $bak_dw = $this->divwidth; + + + $bak_lh = $this->lineheight; + + $orientation = substr(strtoupper($orientation),0,1); + $condition = strtoupper($condition); + + + if ($condition == 'NEXT-EVEN') { // always adds at least one new page to create an Even page + if (!$this->mirrorMargins) { $condition = ''; } + else { + if ($pagesel) { $pbch = $pagesel; $pagesel = ''; } // *CSS-PAGE* + else { $pbch = false; } // *CSS-PAGE* + $this->AddPage($this->CurOrientation,'O'); + if ($pbch ) { $pagesel = $pbch; } // *CSS-PAGE* + $condition = ''; + } + } + if ($condition == 'NEXT-ODD') { // always adds at least one new page to create an Odd page + if (!$this->mirrorMargins) { $condition = ''; } + else { + if ($pagesel) { $pbch = $pagesel; $pagesel = ''; } // *CSS-PAGE* + else { $pbch = false; } // *CSS-PAGE* + $this->AddPage($this->CurOrientation,'E'); + if ($pbch ) { $pagesel = $pbch; } // *CSS-PAGE* + $condition = ''; + } + } + + + if ($condition == 'E') { // only adds new page if needed to create an Even page + if (!$this->mirrorMargins || ($this->page)%2==0) { return false; } + } + if ($condition == 'O') { // only adds new page if needed to create an Odd page + if (!$this->mirrorMargins || ($this->page)%2==1) { return false; } + } + + if ($resetpagenum || $pagenumstyle || $suppress) { + $this->PageNumSubstitutions[] = array('from'=>($this->page+1), 'reset'=> $resetpagenum, 'type'=>$pagenumstyle, 'suppress'=>$suppress); + } + + + $save_tr = $this->table_rotate; // *TABLES* + $this->table_rotate = 0; // *TABLES* + $save_kwt = $this->kwt; + $this->kwt = 0; + // mPDF 5.6.01 - LAYERS + $save_layer = $this->current_layer; + $save_vis = $this->visibility; + + if($this->visibility!='visible') + $this->SetVisibility('visible'); + // mPDF 5.6.01 - LAYERS + $this->EndLayer(); + + // Paint Div Border if necessary + //PAINTS BACKGROUND COLOUR OR BORDERS for DIV - DISABLED FOR COLUMNS (cf. AcceptPageBreak) AT PRESENT in ->PaintDivBB + if (!$this->ColActive && $this->blklvl > 0) { + if (isset($this->blk[$this->blklvl]['y0']) && $this->y == $this->blk[$this->blklvl]['y0']) { + if (isset($this->blk[$this->blklvl]['startpage'])) { $this->blk[$this->blklvl]['startpage']++; } + else { $this->blk[$this->blklvl]['startpage'] = 1; } + } + if ((isset($this->blk[$this->blklvl]['y0']) && $this->y > $this->blk[$this->blklvl]['y0']) || $this->flowingBlockAttr['is_table'] ) { $toplvl = $this->blklvl; } + else { $toplvl = $this->blklvl-1; } + $sy = $this->y; + for ($bl=1;$bl<=$toplvl;$bl++) { + + // mPDF 5.6.01 - LAYERS + if ($this->blk[$bl]['z-index']>0) { + $this->BeginLayer($this->blk[$bl]['z-index']); + } + if (isset($this->blk[$bl]['visibility']) && $this->blk[$bl]['visibility'] && $this->blk[$bl]['visibility']!='visible') { + $this->SetVisibility($this->blk[$bl]['visibility']); + } + + $this->PaintDivBB('pagebottom',0,$bl); + } + $this->y = $sy; + // RESET block y0 and x0 - see below + } + + if($this->visibility!='visible') + $this->SetVisibility('visible'); + // mPDF 5.6.01 - LAYERS + $this->EndLayer(); + + // BODY Backgrounds + if ($this->page > 0) { + $s = ''; + $s .= $this->PrintBodyBackgrounds(); + + $s .= $this->PrintPageBackgrounds(); + $this->pages[$this->page] = preg_replace('/(___BACKGROUND___PATTERNS'.date('jY').')/', "\n".$s."\n".'\\1', $this->pages[$this->page]); + $this->pageBackgrounds = array(); + } + + $save_kt = $this->keep_block_together; + $this->keep_block_together = 0; + + $save_cols = false; +/*-- COLUMNS --*/ + if ($this->ColActive) { + $save_cols = true; + $save_nbcol = $this->NbCol; // other values of gap and vAlign will not change by setting Columns off + $this->SetColumns(0); + } +/*-- END COLUMNS --*/ + + + $family=$this->FontFamily; + $style=$this->FontStyle.($this->U ? 'U' : '').($this->S ? 'S' : ''); + $size=$this->FontSizePt; + $this->ColumnAdjust = true; // enables column height adjustment for the page + $lw=$this->LineWidth; + $dc=$this->DrawColor; + $fc=$this->FillColor; + $tc=$this->TextColor; + $cf=$this->ColorFlag; + if($this->page>0) + { + //Page footer + $this->InFooter=true; + + $this->Reset(); + $this->pageoutput[$this->page] = array(); + + $this->Footer(); + //Close page + $this->_endpage(); + } + + + //Start new page + $this->_beginpage($orientation,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf,$ohname,$ehname,$ofname,$efname,$ohvalue,$ehvalue,$ofvalue,$efvalue,$pagesel,$newformat); + if ($this->docTemplate) { + $pagecount = $this->SetSourceFile($this->docTemplate); + if (($this->page - $this->docTemplateStart) > $pagecount) { + if ($this->docTemplateContinue) { + $tplIdx = $this->ImportPage($pagecount); + $this->UseTemplate($tplIdx); + } + } + else { + $tplIdx = $this->ImportPage(($this->page - $this->docTemplateStart)); + $this->UseTemplate($tplIdx); + } + } + if ($this->pageTemplate) { + $this->UseTemplate($this->pageTemplate); + } + + // Tiling Patterns + $this->_out('___PAGE___START'.date('jY')); + $this->_out('___BACKGROUND___PATTERNS'.date('jY')); + $this->_out('___HEADER___MARKER'.date('jY')); + $this->pageBackgrounds = array(); + + //Set line cap style to square + $this->SetLineCap(2); + //Set line width + $this->LineWidth=$lw; + $this->_out(sprintf('%.3F w',$lw*_MPDFK)); + //Set font + if($family) $this->SetFont($family,$style,$size,true,true); // forces write + //Set colors + $this->DrawColor=$dc; + if($dc!=$this->defDrawColor) $this->_out($dc); + $this->FillColor=$fc; + if($fc!=$this->defFillColor) $this->_out($fc); + $this->TextColor=$tc; + $this->ColorFlag=$cf; + + //Page header + $this->Header(); + + //Restore line width + if($this->LineWidth!=$lw) + { + $this->LineWidth=$lw; + $this->_out(sprintf('%.3F w',$lw*_MPDFK)); + } + //Restore font + if($family) $this->SetFont($family,$style,$size,true,true); // forces write + //Restore colors + if($this->DrawColor!=$dc) + { + $this->DrawColor=$dc; + $this->_out($dc); + } + if($this->FillColor!=$fc) + { + $this->FillColor=$fc; + $this->_out($fc); + } + $this->TextColor=$tc; + $this->ColorFlag=$cf; + $this->InFooter=false; + + // mPDF 5.6.01 - LAYERS + if ($save_layer>0) + $this->BeginLayer($save_layer); + + if($save_vis!='visible') + $this->SetVisibility($save_vis); + +/*-- COLUMNS --*/ + if ($save_cols) { + // Restore columns + $this->SetColumns($save_nbcol,$this->colvAlign,$this->ColGap); + } + if ($this->ColActive) { $this->SetCol(0); } +/*-- END COLUMNS --*/ + + + //RESET BLOCK BORDER TOP + if (!$this->ColActive) { + for($bl=1;$bl<=$this->blklvl;$bl++) { + $this->blk[$bl]['y0'] = $this->y; + if (isset($this->blk[$bl]['x0'])) { $this->blk[$bl]['x0'] += $this->MarginCorrection; } + else { $this->blk[$bl]['x0'] = $this->MarginCorrection; } + // Added mPDF 3.0 Float DIV + $this->blk[$bl]['marginCorrected'][$this->page] = true; + } + } + + + $this->table_rotate = $save_tr; // *TABLES* + $this->kwt = $save_kwt; + + $this->keep_block_together = $save_kt ; + + $this->cMarginL = $bak_cml; + $this->cMarginR = $bak_cmr; + $this->divwidth = $bak_dw; + + $this->lineheight = $bak_lh; +} + + +function PageNo() { + //Get current page number + return $this->page; +} + +function AddSpotColorsFromFile($file) { + $colors = @file($file) or die("Cannot load spot colors file - ".$file); + foreach($colors AS $sc) { + list($name, $c, $m, $y, $k) = preg_split("/\t/",$sc); + $c = intval($c); + $m = intval($m); + $y = intval($y); + $k = intval($k); + $this->AddSpotColor($name, $c, $m, $y, $k); + } +} + +function AddSpotColor($name, $c, $m, $y, $k) { + $name = strtoupper(trim($name)); + if(!isset($this->spotColors[$name])) { + $i=count($this->spotColors)+1; + $this->spotColors[$name]=array('i'=>$i,'c'=>$c,'m'=>$m,'y'=>$y,'k'=>$k); + $this->spotColorIDs[$i]=$name; + } +} + +function SetColor($col, $type='') { + $out = ''; + if ($col{0}==3 || $col{0}==5) { // RGB / RGBa + $out = sprintf('%.3F %.3F %.3F rg',ord($col{1})/255,ord($col{2})/255,ord($col{3})/255); + } + else if ($col{0}==1) { // GRAYSCALE + $out = sprintf('%.3F g',ord($col{1})/255); + } + else if ($col{0}==2) { // SPOT COLOR + $out = sprintf('/CS%d cs %.3F scn',ord($col{1}),ord($col{2})/100); + } + else if ($col{0}==4 || $col{0}==6) { // CMYK / CMYKa + $out = sprintf('%.3F %.3F %.3F %.3F k', ord($col{1})/100, ord($col{2})/100, ord($col{3})/100, ord($col{4})/100); + } + if ($type=='Draw') { $out = strtoupper($out); } // e.g. rg => RG + else if ($type=='CodeOnly') { $out = preg_replace('/\s(rg|g|k)/','',$out); } + return $out; +} + + +function SetDColor($col, $return=false) { + $out = $this->SetColor($col, 'Draw'); + if ($return) { return $out; } + if ($out=='') { return ''; } + $this->DrawColor = $out; + if($this->page>0 && ((isset($this->pageoutput[$this->page]['DrawColor']) && $this->pageoutput[$this->page]['DrawColor'] != $this->DrawColor) || !isset($this->pageoutput[$this->page]['DrawColor']) || $this->keep_block_together)) { $this->_out($this->DrawColor); } + $this->pageoutput[$this->page]['DrawColor'] = $this->DrawColor; +} + +function SetFColor($col, $return=false) { + $out = $this->SetColor($col, 'Fill'); + if ($return) { return $out; } + if ($out=='') { return ''; } + $this->FillColor = $out; + $this->ColorFlag = ($out != $this->TextColor); + if($this->page>0 && ((isset($this->pageoutput[$this->page]['FillColor']) && $this->pageoutput[$this->page]['FillColor'] != $this->FillColor) || !isset($this->pageoutput[$this->page]['FillColor']) || $this->keep_block_together)) { $this->_out($this->FillColor); } + $this->pageoutput[$this->page]['FillColor'] = $this->FillColor; +} + +function SetTColor($col, $return=false) { + $out = $this->SetColor($col, 'Text'); + if ($return) { return $out; } + if ($out=='') { return ''; } + $this->TextColor = $out; + $this->ColorFlag = ($this->FillColor != $out); +} + + +function SetDrawColor($r,$g=-1,$b=-1,$col4=-1, $return=false) { + //Set color for all stroking operations + $col = array(); + if(($r==0 and $g==0 and $b==0 && $col4 == -1) or $g==-1) { $col = $this->ConvertColor($r); } + else if ($col4 == -1) { $col = $this->ConvertColor('rgb('.$r.','.$g.','.$b.')'); } + else { $col = $this->ConvertColor('cmyk('.$r.','.$g.','.$b.','.$col4.')'); } + $out = $this->SetDColor($col, $return); + return $out; +} + +function SetFillColor($r,$g=-1,$b=-1,$col4=-1, $return=false) { + //Set color for all filling operations + $col = array(); + if(($r==0 and $g==0 and $b==0 && $col4 == -1) or $g==-1) { $col = $this->ConvertColor($r); } + else if ($col4 == -1) { $col = $this->ConvertColor('rgb('.$r.','.$g.','.$b.')'); } + else { $col = $this->ConvertColor('cmyk('.$r.','.$g.','.$b.','.$col4.')'); } + $out = $this->SetFColor($col, $return); + return $out; +} + +function SetTextColor($r,$g=-1,$b=-1,$col4=-1, $return=false) { + //Set color for text + $col = array(); + if(($r==0 and $g==0 and $b==0 && $col4 == -1) or $g==-1) { $col = $this->ConvertColor($r); } + else if ($col4 == -1) { $col = $this->ConvertColor('rgb('.$r.','.$g.','.$b.')'); } + else { $col = $this->ConvertColor('cmyk('.$r.','.$g.','.$b.','.$col4.')'); } + $out = $this->SetTColor($col, $return); + return $out; +} + +function _getCharWidth(&$cw, $u, $isdef=true) { + if ($u==0) { $w = false; } + else { $w = (ord($cw[$u*2]) << 8) + ord($cw[$u*2+1]); } + if ($w == 65535) { return 0; } + else if ($w) { return $w; } + else if ($isdef) { return false; } + else { return 0; } +} + +function _charDefined(&$cw, $u) { + if ($u==0) { return false; } + $w = (ord($cw[$u*2]) << 8) + ord($cw[$u*2+1]); + if ($w) { return true; } + else { return false; } +} + +function GetCharWidthCore($c) { + //Get width of a single character in the current Core font + $c = (string)$c; + $w = 0; + // Soft Hyphens chr(173) + if ($c == chr(173) && $this->FontFamily!='csymbol' && $this->FontFamily!='czapfdingbats') { + return 0; + } + else if ($this->S && isset($this->upperCase[ord($c)])) { + $charw = $this->CurrentFont['cw'][chr($this->upperCase[ord($c)])]; + if ($charw!==false) { + $charw = $charw*$this->smCapsScale * $this->smCapsStretch/100; + $w+=$charw; + } + } + else if (isset($this->CurrentFont['cw'][$c])) { + $w += $this->CurrentFont['cw'][$c]; + } + else if (isset($this->CurrentFont['cw'][ord($c)])) { + $w += $this->CurrentFont['cw'][ord($c)]; + } + $w *= ($this->FontSize/ 1000); + if ($this->minwSpacing || $this->fixedlSpacing) { + if ($c==' ') $nb_spaces = 1; + else $nb_spaces = 0; + $w += $this->fixedlSpacing + ($nb_spaces * $this->minwSpacing); + } + return ($w); +} + +function GetCharWidthNonCore($c, $addSubset=true) { + //Get width of a single character in the current Non-Core font + $c = (string)$c; + $w = 0; + $unicode = $this->UTF8StringToArray($c, $addSubset); + $char = $unicode[0]; +/*-- CJK-FONTS --*/ + if ($this->CurrentFont['type'] == 'Type0') { // CJK Adobe fonts + if ($char == 173) { return 0; } // Soft Hyphens + elseif (isset($this->CurrentFont['cw'][$char])) { $w+=$this->CurrentFont['cw'][$char]; } + elseif(isset($this->CurrentFont['MissingWidth'])) { $w += $this->CurrentFont['MissingWidth']; } + else { $w += 500; } + } + else { +/*-- END CJK-FONTS --*/ + if ($char == 173) { return 0; } // Soft Hyphens + else if ($this->S && isset($this->upperCase[$char])) { + $charw = $this->_getCharWidth($this->CurrentFont['cw'],$this->upperCase[$char]); + if ($charw!==false) { + $charw = $charw*$this->smCapsScale * $this->smCapsStretch/100; + $w+=$charw; + } + elseif(isset($this->CurrentFont['desc']['MissingWidth'])) { $w += $this->CurrentFont['desc']['MissingWidth']; } + elseif(isset($this->CurrentFont['MissingWidth'])) { $w += $this->CurrentFont['MissingWidth']; } + else { $w += 500; } + } + else { + $charw = $this->_getCharWidth($this->CurrentFont['cw'],$char); + if ($charw!==false) { $w+=$charw; } + elseif(isset($this->CurrentFont['desc']['MissingWidth'])) { $w += $this->CurrentFont['desc']['MissingWidth']; } + elseif(isset($this->CurrentFont['MissingWidth'])) { $w += $this->CurrentFont['MissingWidth']; } + else { $w += 500; } + } + } // *CJK-FONTS* + $w *= ($this->FontSize/ 1000); + if ($this->minwSpacing || $this->fixedlSpacing) { + if ($c==' ') $nb_spaces = 1; + else $nb_spaces = 0; + $w += $this->fixedlSpacing + ($nb_spaces * $this->minwSpacing); + } + return ($w); +} + + +function GetCharWidth($c, $addSubset=true) { + if (!$this->usingCoreFont) { + return $this->GetCharWidthNonCore($c, $addSubset); + } + else { + return $this->GetCharWidthCore($c); + } +} + +function GetStringWidth($s, $addSubset=true) { + //Get width of a string in the current font + $s = (string)$s; + $cw = &$this->CurrentFont['cw']; + $w = 0; + $kerning = 0; + $lastchar = 0; + $nb_carac = 0; + $nb_spaces = 0; + // mPDF ITERATION + if ($this->iterationCounter) $s = preg_replace('/{iteration ([a-zA-Z0-9_]+)}/', '\\1', $s); + + if (!$this->usingCoreFont) { + $s = str_replace("\xc2\xad",'',$s ); + $unicode = $this->UTF8StringToArray($s, $addSubset); + if ($this->minwSpacing || $this->fixedlSpacing) { + $nb_carac = count($unicode); + $nb_spaces = mb_substr_count($s,' ', $this->mb_enc); + } +/*-- CJK-FONTS --*/ + if ($this->CurrentFont['type'] == 'Type0') { // CJK Adobe fonts + foreach($unicode as $char) { + if (isset($cw[$char])) { $w+=$cw[$char]; } + elseif(isset($this->CurrentFont['MissingWidth'])) { $w += $this->CurrentFont['MissingWidth']; } + else { $w += 500; } + } + } + else { +/*-- END CJK-FONTS --*/ + foreach($unicode as $char) { + if ($this->S && isset($this->upperCase[$char])) { + $charw = $this->_getCharWidth($cw,$this->upperCase[$char]); + if ($charw!==false) { + $charw = $charw*$this->smCapsScale * $this->smCapsStretch/100; + $w+=$charw; + } + elseif(isset($this->CurrentFont['desc']['MissingWidth'])) { $w += $this->CurrentFont['desc']['MissingWidth']; } + elseif(isset($this->CurrentFont['MissingWidth'])) { $w += $this->CurrentFont['MissingWidth']; } + else { $w += 500; } + } + else { + $charw = $this->_getCharWidth($cw,$char); + if ($charw!==false) { $w+=$charw; } + elseif(isset($this->CurrentFont['desc']['MissingWidth'])) { $w += $this->CurrentFont['desc']['MissingWidth']; } + elseif(isset($this->CurrentFont['MissingWidth'])) { $w += $this->CurrentFont['MissingWidth']; } + else { $w += 500; } + if ($this->kerning && $this->useKerning && $lastchar) { + if (isset($this->CurrentFont['kerninfo'][$lastchar][$char])) { + $kerning += $this->CurrentFont['kerninfo'][$lastchar][$char]; + } + } + $lastchar = $char; + } + } + } // *CJK-FONTS* + + } + else { + if ($this->FontFamily!='csymbol' && $this->FontFamily!='czapfdingbats') { + $s = str_replace(chr(173),'',$s ); + } + $nb_carac = $l = strlen($s); + if ($this->minwSpacing || $this->fixedlSpacing) { + $nb_spaces = substr_count($s,' '); + } + for($i=0; $i<$l; $i++) { + if ($this->S && isset($this->upperCase[ord($s[$i])])) { + $charw = $cw[chr($this->upperCase[ord($s[$i])])]; + if ($charw!==false) { + $charw = $charw*$this->smCapsScale * $this->smCapsStretch/100; + $w+=$charw; + } + } + else if (isset($cw[$s[$i]])) { + $w += $cw[$s[$i]]; + } + else if (isset($cw[ord($s[$i])])) { + $w += $cw[ord($s[$i])]; + } + if ($this->kerning && $this->useKerning && $i>0) { + if (isset($this->CurrentFont['kerninfo'][$s[($i-1)]][$s[$i]])) { + $kerning += $this->CurrentFont['kerninfo'][$s[($i-1)]][$s[$i]]; + } + } + } + } + unset($cw); + if ($this->kerning && $this->useKerning) { $w += $kerning; } + $w *= ($this->FontSize/ 1000); + $w += (($nb_carac + $nb_spaces) * $this->fixedlSpacing) + ($nb_spaces * $this->minwSpacing); + return ($w); +} + +function SetLineWidth($width) { + //Set line width + $this->LineWidth=$width; + $lwout = (sprintf('%.3F w',$width*_MPDFK)); + if($this->page>0 && ((isset($this->pageoutput[$this->page]['LineWidth']) && $this->pageoutput[$this->page]['LineWidth'] != $lwout) || !isset($this->pageoutput[$this->page]['LineWidth']) || $this->keep_block_together)) { + $this->_out($lwout); + } + $this->pageoutput[$this->page]['LineWidth'] = $lwout; +} + +function Line($x1,$y1,$x2,$y2) { + //Draw a line + $this->_out(sprintf('%.3F %.3F m %.3F %.3F l S',$x1*_MPDFK,($this->h-$y1)*_MPDFK,$x2*_MPDFK,($this->h-$y2)*_MPDFK)); +} + +function Arrow($x1,$y1,$x2,$y2,$headsize=3,$fill='B',$angle=25) { + //F == fill //S == stroke //B == stroke and fill + // angle = splay of arrowhead - 1 - 89 degrees + if($fill=='F') $fill='f'; + elseif($fill=='FD' or $fill=='DF' or $fill=='B') $fill='B'; + else $fill='S'; + $a = atan2(($y2-$y1),($x2-$x1)); + $b = $a + deg2rad($angle); + $c = $a - deg2rad($angle); + $x3 = $x2 - ($headsize* cos($b)); + $y3 = $this->h-($y2 - ($headsize* sin($b))); + $x4 = $x2 - ($headsize* cos($c)); + $y4 = $this->h-($y2 - ($headsize* sin($c))); + + $x5 = $x3-($x3-$x4)/2; // mid point of base of arrowhead - to join arrow line to + $y5 = $y3-($y3-$y4)/2; + + $s = ''; + $s.=sprintf('%.3F %.3F m %.3F %.3F l S',$x1*_MPDFK,($this->h-$y1)*_MPDFK,$x5*_MPDFK,$y5*_MPDFK); + $this->_out($s); + + $s = ''; + $s.=sprintf('%.3F %.3F m %.3F %.3F l %.3F %.3F l %.3F %.3F l %.3F %.3F l ',$x5*_MPDFK,$y5*_MPDFK,$x3*_MPDFK,$y3*_MPDFK,$x2*_MPDFK,($this->h-$y2)*_MPDFK,$x4*_MPDFK,$y4*_MPDFK,$x5*_MPDFK,$y5*_MPDFK); + $s.=$fill; + $this->_out($s); +} + + +function Rect($x,$y,$w,$h,$style='') { + //Draw a rectangle + if($style=='F') $op='f'; + elseif($style=='FD' or $style=='DF') $op='B'; + else $op='S'; + $this->_out(sprintf('%.3F %.3F %.3F %.3F re %s',$x*_MPDFK,($this->h-$y)*_MPDFK,$w*_MPDFK,-$h*_MPDFK,$op)); +} + +function AddFont($family,$style='') { + if(empty($family)) { return; } + $family = strtolower($family); + $style=strtoupper($style); + $style=str_replace('U','',$style); + if($style=='IB') $style='BI'; + $fontkey = $family.$style; + // check if the font has been already added + if(isset($this->fonts[$fontkey])) { + return; + } + +/*-- CJK-FONTS --*/ + if (in_array($family,$this->available_CJK_fonts)) { + if (empty($this->Big5_widths)) { require(_MPDF_PATH . 'includes/CJKdata.php'); } + $this->AddCJKFont($family); // don't need to add style + return; + } +/*-- END CJK-FONTS --*/ + + if ($this->usingCoreFont) { die("mPDF Error - problem with Font management"); } + + $stylekey = $style; + if (!$style) { $stylekey = 'R'; } + + if (!isset($this->fontdata[$family][$stylekey]) || !$this->fontdata[$family][$stylekey]) { + die('mPDF Error - Font is not supported - '.$family.' '.$style); + } + + $name = ''; + $originalsize = 0; + $sip = false; + $smp = false; + $unAGlyphs = false; // mPDF 5.4.05 + $haskerninfo = false; + $BMPselected = false; + @include(_MPDF_TTFONTDATAPATH.$fontkey.'.mtx.php'); + + $ttffile = ''; + if (defined('_MPDF_SYSTEM_TTFONTS')) { + $ttffile = _MPDF_SYSTEM_TTFONTS.$this->fontdata[$family][$stylekey]; + if (!file_exists($ttffile)) { $ttffile = ''; } + } + if (!$ttffile) { + $ttffile = _MPDF_TTFONTPATH.$this->fontdata[$family][$stylekey]; + if (!file_exists($ttffile)) { die("mPDF Error - cannot find TTF TrueType font file - ".$ttffile); } + } + $ttfstat = stat($ttffile); + + if (isset($this->fontdata[$family]['TTCfontID'][$stylekey])) { $TTCfontID = $this->fontdata[$family]['TTCfontID'][$stylekey]; } + else { $TTCfontID = 0; } + + + $BMPonly = false; + if (in_array($family,$this->BMPonly)) { $BMPonly = true; } + $regenerate = false; + if ($BMPonly && !$BMPselected) { $regenerate = true; } + else if (!$BMPonly && $BMPselected) { $regenerate = true; } + if ($this->useKerning && !$haskerninfo) { $regenerate = true; } + // mPDF 5.4.05 + if (isset($this->fontdata[$family]['unAGlyphs']) && $this->fontdata[$family]['unAGlyphs'] && !$unAGlyphs) { + $regenerate = true; + $unAGlyphs = true; + } + else if ((!isset($this->fontdata[$family]['unAGlyphs']) || !$this->fontdata[$family]['unAGlyphs']) && $unAGlyphs) { + $regenerate = true; + $unAGlyphs = false; + } + if (!isset($name) || $originalsize != $ttfstat['size'] || $regenerate) { + if (!class_exists('TTFontFile', false)) { include(_MPDF_PATH .'classes/ttfontsuni.php'); } + $ttf = new TTFontFile(); + $ttf->getMetrics($ttffile, $TTCfontID, $this->debugfonts, $BMPonly, $this->useKerning, $unAGlyphs); // mPDF 5.4.05 + $cw = $ttf->charWidths; + $kerninfo = $ttf->kerninfo; + $haskerninfo = true; + $name = preg_replace('/[ ()]/','',$ttf->fullName); + $sip = $ttf->sipset; + $smp = $ttf->smpset; + + $desc= array('Ascent'=>round($ttf->ascent), + 'Descent'=>round($ttf->descent), + 'CapHeight'=>round($ttf->capHeight), + 'Flags'=>$ttf->flags, + 'FontBBox'=>'['.round($ttf->bbox[0])." ".round($ttf->bbox[1])." ".round($ttf->bbox[2])." ".round($ttf->bbox[3]).']', + 'ItalicAngle'=>$ttf->italicAngle, + 'StemV'=>round($ttf->stemV), + 'MissingWidth'=>round($ttf->defaultWidth)); + $panose = ''; + // mPDF 5.5.19 + if (count($ttf->panose)) { + $panoseArray = array_merge(array($ttf->sFamilyClass, $ttf->sFamilySubClass), $ttf->panose); + foreach($panoseArray as $value) + $panose .= ' '.dechex($value); + } + $up = round($ttf->underlinePosition); + $ut = round($ttf->underlineThickness); + $originalsize = $ttfstat['size']+0; + $type = 'TTF'; + //Generate metrics .php file + $s='<?php'."\n"; + $s.='$name=\''.$name."';\n"; + $s.='$type=\''.$type."';\n"; + $s.='$desc='.var_export($desc,true).";\n"; + $s.='$up='.$up.";\n"; + $s.='$ut='.$ut.";\n"; + $s.='$ttffile=\''.$ttffile."';\n"; + $s.='$TTCfontID=\''.$TTCfontID."';\n"; + $s.='$originalsize='.$originalsize.";\n"; + if ($sip) $s.='$sip=true;'."\n"; + else $s.='$sip=false;'."\n"; + if ($smp) $s.='$smp=true;'."\n"; + else $s.='$smp=false;'."\n"; + if ($BMPonly) $s.='$BMPselected=true;'."\n"; + else $s.='$BMPselected=false;'."\n"; + $s.='$fontkey=\''.$fontkey."';\n"; + $s.='$panose=\''.$panose."';\n"; + if ($this->useKerning) { + $s.='$kerninfo='.var_export($kerninfo,true).";\n"; + $s.='$haskerninfo=true;'."\n"; + } + else $s.='$haskerninfo=false;'."\n"; + // mPDF 5.4.05 + if ($this->fontdata[$family]['unAGlyphs']) { + $s.='$unAGlyphs=true;'."\n"; + } + else $s.='$unAGlyphs=false;'."\n"; + $s.="?>"; + if (is_writable(dirname(_MPDF_TTFONTDATAPATH.'x'))) { + $fh = fopen(_MPDF_TTFONTDATAPATH.$fontkey.'.mtx.php',"w"); + fwrite($fh,$s,strlen($s)); + fclose($fh); + $fh = fopen(_MPDF_TTFONTDATAPATH.$fontkey.'.cw.dat',"wb"); + fwrite($fh,$cw,strlen($cw)); + fclose($fh); + @unlink(_MPDF_TTFONTDATAPATH.$fontkey.'.cgm'); + @unlink(_MPDF_TTFONTDATAPATH.$fontkey.'.z'); + @unlink(_MPDF_TTFONTDATAPATH.$fontkey.'.cw127.php'); + @unlink(_MPDF_TTFONTDATAPATH.$fontkey.'.cw'); + } + else if ($this->debugfonts) { $this->Error('Cannot write to the font caching directory - '._MPDF_TTFONTDATAPATH); } + unset($ttf); + } + else { + $cw = @file_get_contents(_MPDF_TTFONTDATAPATH.$fontkey.'.cw.dat'); + } + + if (isset($this->fontdata[$family]['indic']) && $this->fontdata[$family]['indic']) { $indic = true; } + else { $indic = false; } + if (isset($this->fontdata[$family]['sip-ext']) && $this->fontdata[$family]['sip-ext']) { $sipext = $this->fontdata[$family]['sip-ext']; } + else { $sipext = ''; } + + + $i = count($this->fonts)+$this->extraFontSubsets+1; + if ($sip || $smp) { + $this->fonts[$fontkey] = array('i'=>$i, 'type'=>$type, 'name'=>$name, 'desc'=>$desc, 'panose'=>$panose, 'up'=>$up, 'ut'=>$ut, 'cw'=>$cw, 'ttffile'=>$ttffile, 'fontkey'=>$fontkey, 'subsets'=>array(0=>range(0,127)), 'subsetfontids'=>array($i), 'used'=>false, 'indic'=>$indic, 'sip'=>$sip, 'sipext'=>$sipext, 'smp'=>$smp, 'TTCfontID' => $TTCfontID, 'unAGlyphs' => false); // mPDF 5.4.05 + } + else { + $ss = array(); + for ($s=32; $s<128; $s++) { $ss[$s] = $s; } + $this->fonts[$fontkey] = array('i'=>$i, 'type'=>$type, 'name'=>$name, 'desc'=>$desc, 'panose'=>$panose, 'up'=>$up, 'ut'=>$ut, 'cw'=>$cw, 'ttffile'=>$ttffile, 'fontkey'=>$fontkey, 'subset'=>$ss, 'used'=>false, 'indic'=>$indic, 'sip'=>$sip, 'sipext'=>$sipext, 'smp'=>$smp, 'TTCfontID' => $TTCfontID, 'unAGlyphs' => $unAGlyphs); // mPDF 5.4.05 + } + if ($this->useKerning && $haskerninfo) { $this->fonts[$fontkey]['kerninfo'] = $kerninfo; } + $this->FontFiles[$fontkey]=array('length1'=>$originalsize, 'type'=>"TTF", 'ttffile'=>$ttffile, 'sip'=>$sip, 'smp'=>$smp); + unset($cw); +} + + + +function SetFont($family,$style='',$size=0, $write=true, $forcewrite=false) { + $family=strtolower($family); + if (!$this->onlyCoreFonts) { + if ($family == 'sans' || $family == 'sans-serif') { $family = $this->sans_fonts[0]; } + if ($family == 'serif') { $family = $this->serif_fonts[0]; } + if ($family == 'mono' || $family == 'monospace') { $family = $this->mono_fonts[0]; } + } + if (isset($this->fonttrans[$family]) && $this->fonttrans[$family]) { $family = $this->fonttrans[$family]; } + if($family=='') { + if ($this->FontFamily) { $family=$this->FontFamily; } + else if ($this->default_font) { $family=$this->default_font; } + else { $this->Error("No font or default font set!"); } + } + $this->ReqFontStyle = $style; // required or requested style - used later for artificial bold/italic + + if (($family == 'csymbol') || ($family == 'czapfdingbats') || ($family == 'ctimes') || ($family == 'ccourier') || ($family == 'chelvetica')) { + if ($this->PDFA || $this->PDFX) { + if ($family == 'csymbol' || $family == 'czapfdingbats') { + $this->Error("Symbol and Zapfdingbats cannot be embedded in mPDF (required for PDFA1-b or PDFX/1-a)."); + } + if ($family == 'ctimes' || $family == 'ccourier' || $family == 'chelvetica') { + if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "Core Adobe font ".ucfirst($family)." cannot be embedded in mPDF, which is required for PDFA1-b or PDFX/1-a. (Embedded font will be substituted.)"; } + if ($family == 'chelvetica') { $family = 'sans'; } + if ($family == 'ctimes') { $family = 'serif'; } + if ($family == 'ccourier') { $family = 'mono'; } + } + $this->usingCoreFont = false; + } + else { $this->usingCoreFont = true; } + if($family=='csymbol' || $family=='czapfdingbats') { $style=''; } + } + else { $this->usingCoreFont = false; } + + $this->U=false; + $this->S=false; + if ($style) { + $style=strtoupper($style); + if(strpos($style,'U')!==false) { + $this->U=true; + $style=str_replace('U','',$style); + } + if(strpos($style,'S')!==false) { + $this->S=true; + // Small Caps + if (empty($this->upperCase)) { @include(_MPDF_PATH.'includes/upperCase.php'); } + $style=str_replace('S','',$style); + } + if ($style=='IB') $style='BI'; + } + if ($size==0) $size=$this->FontSizePt; + + $fontkey=$family.$style; + + $stylekey = $style; + if (!$stylekey) { $stylekey = "R"; } + + if (!$this->onlyCoreFonts && !$this->usingCoreFont) { + if(!isset($this->fonts[$fontkey]) || count($this->default_available_fonts) != count($this->available_unifonts) ) { // not already added +/*-- CJK-FONTS --*/ + // CJK fonts + if (in_array($fontkey,$this->available_CJK_fonts)) { + if(!isset($this->fonts[$fontkey])) { // already added + if (empty($this->Big5_widths)) { require(_MPDF_PATH . 'includes/CJKdata.php'); } + $this->AddCJKFont($family); // don't need to add style + } + } + // Test to see if requested font/style is available - or substitute + else +/*-- END CJK-FONTS --*/ + if (!in_array($fontkey,$this->available_unifonts)) { + // If font[nostyle] exists - set it + if (in_array($family,$this->available_unifonts)) { + $style = ''; + } + + // Else if only one font available - set it (assumes if only one font available it will not have a style) + else if (count($this->available_unifonts) == 1) { + $family = $this->available_unifonts[0]; + $style = ''; + } + + else { + $found = 0; + // else substitute font of similar type + if (in_array($family,$this->sans_fonts)) { + $i = array_intersect($this->sans_fonts,$this->available_unifonts); + if (count($i)) { + $i = array_values($i); + // with requested style if possible + if (!in_array(($i[0].$style),$this->available_unifonts)) { + $style = ''; + } + $family = $i[0]; + $found = 1; + } + } + else if (in_array($family,$this->serif_fonts)) { + $i = array_intersect($this->serif_fonts,$this->available_unifonts); + if (count($i)) { + $i = array_values($i); + // with requested style if possible + if (!in_array(($i[0].$style),$this->available_unifonts)) { + $style = ''; + } + $family = $i[0]; + $found = 1; + } + } + else if (in_array($family,$this->mono_fonts)) { + $i = array_intersect($this->mono_fonts,$this->available_unifonts); + if (count($i)) { + $i = array_values($i); + // with requested style if possible + if (!in_array(($i[0].$style),$this->available_unifonts)) { + $style = ''; + } + $family = $i[0]; + $found = 1; + } + } + + if (!$found) { + // set first available font + $fs = $this->available_unifonts[0]; + preg_match('/^([a-z_0-9\-]+)([BI]{0,2})$/',$fs,$fas); // Allow "-" + // with requested style if possible + $ws = $fas[1].$style; + if (in_array($ws,$this->available_unifonts)) { + $family = $fas[1]; // leave $style as is + } + else if (in_array($fas[1],$this->available_unifonts)) { + // or without style + $family = $fas[1]; + $style = ''; + } + else { + // or with the style specified + $family = $fas[1]; + $style = $fas[2]; + } + } + } + $fontkey = $family.$style; + } + } + // try to add font (if not already added) + $this->AddFont($family, $style); + + //Test if font is already selected + if($this->FontFamily == $family && $this->FontFamily == $this->currentfontfamily && $this->FontStyle == $style && $this->FontStyle == $this->currentfontstyle && $this->FontSizePt == $size && $this->FontSizePt == $this->currentfontsize && !$forcewrite) { + return $family; + } + + $fontkey = $family.$style; + + //Select it + $this->FontFamily = $family; + $this->FontStyle = $style; + $this->FontSizePt = $size; + $this->FontSize = $size / _MPDFK; + $this->CurrentFont = &$this->fonts[$fontkey]; + if ($write) { + $fontout = (sprintf('BT /F%d %.3F Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); + if($this->page>0 && ((isset($this->pageoutput[$this->page]['Font']) && $this->pageoutput[$this->page]['Font'] != $fontout) || !isset($this->pageoutput[$this->page]['Font']) || $this->keep_block_together)) { $this->_out($fontout); } + $this->pageoutput[$this->page]['Font'] = $fontout; + } + + + + // Added - currentfont (lowercase) used in HTML2PDF + $this->currentfontfamily=$family; + $this->currentfontsize=$size; + $this->currentfontstyle=$style.($this->U ? 'U' : '').($this->S ? 'S' : ''); + $this->setMBencoding('UTF-8'); + } + + else { // if using core fonts + + + if ($this->PDFA || $this->PDFX) { + $this->Error('Core Adobe fonts cannot be embedded in mPDF (required for PDFA1-b or PDFX/1-a) - cannot use option to use core fonts.'); + } + $this->setMBencoding('windows-1252'); + + //Test if font is already selected + if(($this->FontFamily == $family) AND ($this->FontStyle == $style) AND ($this->FontSizePt == $size) && !$forcewrite) { + return $family; + } + + if (!isset($this->CoreFonts[$fontkey])) { + if (in_array($family,$this->serif_fonts)) { $family = 'ctimes'; } + else if (in_array($family,$this->mono_fonts)) { $family = 'ccourier'; } + else { $family = 'chelvetica'; } + $this->usingCoreFont = true; + $fontkey = $family.$style; + } + + if(!isset($this->fonts[$fontkey])) { + // STANDARD CORE FONTS + if (isset($this->CoreFonts[$fontkey])) { + //Load metric file + $file=$family; + if($family=='ctimes' || $family=='chelvetica' || $family=='ccourier') { $file.=strtolower($style); } + $file.='.php'; + include(_MPDF_PATH.'font/'.$file); + if(!isset($cw)) { $this->Error('Could not include font metric file'); } + $i=count($this->fonts)+$this->extraFontSubsets+1; + $this->fonts[$fontkey]=array('i'=>$i,'type'=>'core','name'=>$this->CoreFonts[$fontkey],'desc'=>$desc,'up'=>$up,'ut'=>$ut,'cw'=>$cw); + if ($this->useKerning) { $this->fonts[$fontkey]['kerninfo'] = $kerninfo; } + } + else { + die('mPDF error - Font not defined'); + } + } + //Test if font is already selected + if(($this->FontFamily == $family) AND ($this->FontStyle == $style) AND ($this->FontSizePt == $size) && !$forcewrite) { + return $family; + } + //Select it + $this->FontFamily=$family; + $this->FontStyle=$style; + $this->FontSizePt=$size; + $this->FontSize=$size/_MPDFK; + $this->CurrentFont=&$this->fonts[$fontkey]; + if ($write) { + $fontout = (sprintf('BT /F%d %.3F Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); + if($this->page>0 && ((isset($this->pageoutput[$this->page]['Font']) && $this->pageoutput[$this->page]['Font'] != $fontout) || !isset($this->pageoutput[$this->page]['Font']) || $this->keep_block_together)) { $this->_out($fontout); } + $this->pageoutput[$this->page]['Font'] = $fontout; + } + // Added - currentfont (lowercase) used in HTML2PDF + $this->currentfontfamily=$family; + $this->currentfontsize=$size; + $this->currentfontstyle=$style.($this->U ? 'U' : '').($this->S ? 'S' : ''); + + } + + return $family; +} + +function SetFontSize($size,$write=true) { + //Set font size in points + if($this->FontSizePt==$size) return; + $this->FontSizePt=$size; + $this->FontSize=$size/_MPDFK; + $this->currentfontsize=$size; + if ($write) { + $fontout = (sprintf('BT /F%d %.3F Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); + // Edited mPDF 3.0 + if($this->page>0 && ((isset($this->pageoutput[$this->page]['Font']) && $this->pageoutput[$this->page]['Font'] != $fontout) || !isset($this->pageoutput[$this->page]['Font']) || $this->keep_block_together)) { $this->_out($fontout); } + $this->pageoutput[$this->page]['Font'] = $fontout; + } +} + +function AddLink() { + //Create a new internal link + $n=count($this->links)+1; + $this->links[$n]=array(0,0); + return $n; +} + +function SetLink($link,$y=0,$page=-1) { + //Set destination of internal link + if($y==-1) $y=$this->y; + if($page==-1) $page=$this->page; + $this->links[$link]=array($page,$y); +} + +function Link($x,$y,$w,$h,$link) { + $l = array($x*_MPDFK,$this->hPt-$y*_MPDFK,$w*_MPDFK,$h*_MPDFK,$link); + if ($this->keep_block_together) { // Save to array - don't write yet + $this->ktLinks[$this->page][]= $l; + return; + } + else if ($this->table_rotate) { // *TABLES* + $this->tbrot_Links[$this->page][]= $l; // *TABLES* + return; // *TABLES* + } // *TABLES* + else if ($this->kwt) { + $this->kwt_Links[$this->page][]= $l; + return; + } + + if ($this->writingHTMLheader || $this->writingHTMLfooter) { + $this->HTMLheaderPageLinks[]= $l; + return; + } + //Put a link on the page + $this->PageLinks[$this->page][]= $l; + // Save cross-reference to Column buffer + $ref = count($this->PageLinks[$this->page])-1; // *COLUMNS* + $this->columnLinks[$this->CurrCol][INTVAL($this->x)][INTVAL($this->y)] = $ref; // *COLUMNS* + +} + +function Text($x,$y,$txt) { + // Output a string + // Called (internally) by Watermark and _tableWrite [rotated cells] + // Expects input to be mb_encoded if necessary and RTL reversed + + // ARTIFICIAL BOLD AND ITALIC + $s = 'q '; + if ($this->falseBoldWeight && strpos($this->ReqFontStyle,"B") !== false && strpos($this->FontStyle,"B") === false) { + $s .= '2 Tr 1 J 1 j '; + $s .= sprintf('%.3F w ',($this->FontSize/130)*_MPDFK*$this->falseBoldWeight); + $tc = strtoupper($this->TextColor); // change 0 0 0 rg to 0 0 0 RG + if($this->FillColor!=$tc) { $s .= $tc.' '; } // stroke (outline) = same colour as text(fill) + } + if (strpos($this->ReqFontStyle,"I") !== false && strpos($this->FontStyle,"I") === false) { + $aix = '1 0 0.261799 1 %.3F %.3F Tm'; + } + else { $aix = '%.3F %.3F Td'; } + + if($this->ColorFlag) $s.=$this->TextColor.' '; + + $this->CurrentFont['used']= true; + if ($this->CurrentFont['type']=='TTF' && ($this->CurrentFont['sip'] || $this->CurrentFont['smp'])) { + $txt2 = str_replace(chr(194).chr(160),chr(32),$txt); + $txt2 = $this->UTF8toSubset($txt2); + $s.=sprintf('BT '.$aix.' %s Tj ET ',$x*_MPDFK,($this->h-$y)*_MPDFK,$txt2); + } + else if (!$this->usingCoreFont) { + $txt2 = str_replace(chr(194).chr(160),chr(32),$txt); + $this->UTF8StringToArray($txt2); // this is just to add chars to subset list + if ($this->kerning && $this->useKerning) { $s .= $this->_kern($txt2, '', $aix, $x, $y); } + else { + //Convert string to UTF-16BE without BOM + $txt2= $this->UTF8ToUTF16BE($txt2, false); + $s.=sprintf('BT '.$aix.' (%s) Tj ET ',$x*_MPDFK,($this->h-$y)*_MPDFK,$this->_escape($txt2)); + } + } + else { + $txt2 = str_replace(chr(160),chr(32),$txt); + if ($this->kerning && $this->useKerning) { $s .= $this->_kern($txt2, '', $aix, $x, $y); } + else { + $s.=sprintf('BT '.$aix.' (%s) Tj ET ',$x*_MPDFK,($this->h-$y)*_MPDFK,$this->_escape($txt2)); + } + } + if($this->U && $txt!='') { + $c = strtoupper($this->TextColor); // change 0 0 0 rg to 0 0 0 RG + if($this->FillColor!=$c) { $s.= ' '.$c.' '; } + if (isset($this->CurrentFont['up'])) { $up=$this->CurrentFont['up']; } + else { $up = -100; } + $adjusty = (-$up/1000* $this->FontSize); + if (isset($this->CurrentFont['ut'])) { $ut=$this->CurrentFont['ut']/1000* $this->FontSize; } + else { $ut = 60/1000* $this->FontSize; } + $olw = $this->LineWidth; + $s.=' '.(sprintf(' %.3F w',$ut*_MPDFK)); + $s.=' '.$this->_dounderline($x,$y + $adjusty,$txt); + $s.=' '.(sprintf(' %.3F w',$olw*_MPDFK)); + if($this->FillColor!=$c) { $s.= ' '.$this->FillColor.' '; } + } + // STRIKETHROUGH + if($this->strike && $txt!='') { + $c = strtoupper($this->TextColor); // change 0 0 0 rg to 0 0 0 RG + if($this->FillColor!=$c) { $s.= ' '.$c.' '; } + //Superscript and Subscript Y coordinate adjustment (now for striked-through texts) + if (isset($this->CurrentFont['desc']['CapHeight'])) { $ch=$this->CurrentFont['desc']['CapHeight']; } + else { $ch = 700; } + $adjusty = (-$ch/1000* $this->FontSize) * 0.35; + if (isset($this->CurrentFont['ut'])) { $ut=$this->CurrentFont['ut']/1000* $this->FontSize; } + else { $ut = 60/1000* $this->FontSize; } + $olw = $this->LineWidth; + $s.=' '.(sprintf(' %.3F w',$ut*_MPDFK)); + $s.=' '.$this->_dounderline($x,$y+$adjusty,$txt); + $s.=' '.(sprintf(' %.3F w',$olw*_MPDFK)); + if($this->FillColor!=$c) { $s.= ' '.$this->FillColor.' '; } + } + $s .= 'Q'; + $this->_out($s); +} + +/*-- DIRECTW --*/ +function WriteText($x,$y,$txt) { + // Output a string using Text() but does encoding and text reversing of RTL + $txt = $this->purify_utf8_text($txt); + if ($this->text_input_as_HTML) { + $txt = $this->all_entities_to_utf8($txt); + } + if ($this->usingCoreFont) { $txt = mb_convert_encoding($txt,$this->mb_enc,'UTF-8'); } + // DIRECTIONALITY + if (preg_match("/([".$this->pregRTLchars."])/u", $txt)) { $this->biDirectional = true; } // *RTL* + $this->magic_reverse_dir($txt, true, $this->directionality); // *RTL* + // Font-specific ligature substitution for Indic fonts + if (isset($this->CurrentFont['indic']) && $this->CurrentFont['indic']) $this->ConvertIndic($txt); // *INDIC* + $this->Text($x,$y,$txt); +} + +function WriteCell($w,$h=0,$txt='',$border=0,$ln=0,$align='',$fill=0,$link='', $currentx=0) { + //Output a cell using Cell() but does encoding and text reversing of RTL + $txt = $this->purify_utf8_text($txt); + if ($this->text_input_as_HTML) { + $txt = $this->all_entities_to_utf8($txt); + } + if ($this->usingCoreFont) { $txt = mb_convert_encoding($txt,$this->mb_enc,'UTF-8'); } + // DIRECTIONALITY + if (preg_match("/([".$this->pregRTLchars."])/u", $txt)) { $this->biDirectional = true; } // *RTL* + $this->magic_reverse_dir($txt, true, $this->directionality); // *RTL* + // Font-specific ligature substitution for Indic fonts + if (isset($this->CurrentFont['indic']) && $this->CurrentFont['indic']) $this->ConvertIndic($txt); // *INDIC* + $this->Cell($w,$h,$txt,$border,$ln,$align,$fill,$link, $currentx); +} +/*-- END DIRECTW --*/ + + +function ResetSpacing() { + if ($this->ws != 0) { $this->_out('BT 0 Tw ET'); } + $this->ws=0; + if ($this->charspacing != 0) { $this->_out('BT 0 Tc ET'); } + $this->charspacing=0; +} + + +function SetSpacing($cs,$ws) { + if (intval($cs*1000)==0) { $cs = 0; } + if ($cs) { $this->_out(sprintf('BT %.3F Tc ET',$cs)); } + else if ($this->charspacing != 0) { $this->_out('BT 0 Tc ET'); } + $this->charspacing=$cs; + if (intval($ws*1000)==0) { $ws = 0; } + if ($ws) { $this->_out(sprintf('BT %.3F Tw ET',$ws)); } + else if ($this->ws != 0) { $this->_out('BT 0 Tw ET'); } + $this->ws=$ws; +} + +// WORD SPACING +function GetJspacing($nc,$ns,$w,$inclCursive) { + $ws = 0; + $charspacing = 0; + $ww = $this->jSWord; + $ncx = $nc-1; + if ($nc == 0) { return array(0,0); } + else if ($nc==1) { $charspacing = $w; } + // Only word spacing allowed / possible + else if ($this->fixedlSpacing !== false || $inclCursive) { + if ($ns) { $ws = $w / $ns; } + } + else if (!$ns) { + $charspacing = $w / ($ncx ); + if (($this->jSmaxChar > 0) && ($charspacing > $this->jSmaxChar)) { + $charspacing = $this->jSmaxChar; + } + } + else if ($ns == ($ncx )) { + $charspacing = $w / $ns; + } + else { + if ($this->usingCoreFont) { + $cs = ($w * (1 - $this->jSWord)) / ($ncx ); + if (($this->jSmaxChar > 0) && ($cs > $this->jSmaxChar)) { + $cs = $this->jSmaxChar; + $ww = 1 - (($cs * ($ncx ))/$w); + } + $charspacing = $cs; + $ws = ($w * ($ww) ) / $ns; + } + else { + $cs = ($w * (1 - $this->jSWord)) / ($ncx -$ns); + if (($this->jSmaxChar > 0) && ($cs > $this->jSmaxChar)) { + $cs = $this->jSmaxChar; + $ww = 1 - (($cs * ($ncx -$ns))/$w); + } + $charspacing = $cs; + $ws = (($w * ($ww) ) / $ns) - $charspacing; + } + } + return array($charspacing,$ws); +} + +function Cell($w,$h=0,$txt='',$border=0,$ln=0,$align='',$fill=0,$link='', $currentx=0, $lcpaddingL=0, $lcpaddingR=0, $valign='M', $spanfill=0, $abovefont=0, $belowfont=0, $exactWidth=false) { + //Output a cell + // Expects input to be mb_encoded if necessary and RTL reversed + // NON_BREAKING SPACE + if ($this->usingCoreFont) { + $txt = str_replace(chr(160),chr(32),$txt); + } + else { + $txt = str_replace(chr(194).chr(160),chr(32),$txt); + } + + $oldcolumn = $this->CurrCol; + // Automatic page break + // Allows PAGE-BREAK-AFTER = avoid to work + + if (!$this->tableLevel && (($this->y+$this->divheight>$this->PageBreakTrigger) || ($this->y+$h>$this->PageBreakTrigger) || + ($this->y+($h*2)>$this->PageBreakTrigger && $this->blk[$this->blklvl]['page_break_after_avoid'])) and !$this->InFooter and $this->AcceptPageBreak()) { + $x=$this->x;//Current X position + + + // WORD SPACING + $ws=$this->ws;//Word Spacing + $charspacing=$this->charspacing;//Character Spacing + $this->ResetSpacing(); + + $this->AddPage($this->CurOrientation); + // Added to correct for OddEven Margins + $x += $this->MarginCorrection; + if ($currentx) { + $currentx += $this->MarginCorrection; + } + $this->x=$x; + // WORD SPACING + $this->SetSpacing($charspacing,$ws); + } + + // Test: to put line through centre of cell: $this->Line($this->x,$this->y+($h/2),$this->x+50,$this->y+($h/2)); + +/*-- COLUMNS --*/ + // COLS + // COLUMN CHANGE + if ($this->CurrCol != $oldcolumn) { + if ($currentx) { + $currentx += $this->ChangeColumn * ($this->ColWidth+$this->ColGap); + } + $this->x += $this->ChangeColumn * ($this->ColWidth+$this->ColGap); + } + + // COLUMNS Update/overwrite the lowest bottom of printing y value for a column + if ($this->ColActive) { + if ($h) { $this->ColDetails[$this->CurrCol]['bottom_margin'] = $this->y+$h; } + else { $this->ColDetails[$this->CurrCol]['bottom_margin'] = $this->y+$this->divheight; } + } +/*-- END COLUMNS --*/ + + // KEEP BLOCK TOGETHER Update/overwrite the lowest bottom of printing y value on first page + if ($this->keep_block_together) { + if ($h) { $this->ktBlock[$this->page]['bottom_margin'] = $this->y+$h; } +// else { $this->ktBlock[$this->page]['bottom_margin'] = $this->y+$this->divheight; } + } + + if($w==0) $w = $this->w-$this->rMargin-$this->x; + $s=''; + if($fill==1 && $this->FillColor) { + if((isset($this->pageoutput[$this->page]['FillColor']) && $this->pageoutput[$this->page]['FillColor'] != $this->FillColor) || !isset($this->pageoutput[$this->page]['FillColor']) || $this->keep_block_together) { $s .= $this->FillColor.' '; } + $this->pageoutput[$this->page]['FillColor'] = $this->FillColor; + } + + + $boxtop = $this->y; + $boxheight = $h; + $boxbottom = $this->y+$h; + + if($txt!='') { + // FONT SIZE - this determines the baseline caculation + if ($this->linemaxfontsize && !$this->processingHeader) { $bfs = $this->linemaxfontsize; } + else { $bfs = $this->FontSize; } + //Calculate baseline Superscript and Subscript Y coordinate adjustment + $bfx = $this->baselineC; + $baseline = $bfx*$bfs; + if($this->SUP) { $baseline += ($bfx-1.05)*$this->FontSize; } + else if($this->SUB) { $baseline += ($bfx + 0.04)*$this->FontSize; } + else if($this->bullet) { $baseline += ($bfx-0.7)*$this->FontSize; } + + // Vertical align (for Images) + if ($abovefont || $belowfont) { // from flowing block - valign always M + $va = $abovefont + (0.5*$bfs); + } + else if ($this->lineheight_correction) { + if ($valign == 'T') { $va = (0.5 * $bfs * $this->lineheight_correction); } + else if ($valign == 'B') { $va = $h-(0.5 * $bfs * $this->lineheight_correction); } + else { $va = 0.5*$h; } // Middle + } + else { + if ($valign == 'T') { $va = (0.5 * $bfs * $this->default_lineheight_correction); } + else if ($valign == 'B') { $va = $h-(0.5 * $bfs * $this->default_lineheight_correction); } + else { $va = 0.5*$h; } // Middle + } + + // ONLY SET THESE IF WANT TO CONFINE BORDER +/- FILL TO FIT FONTSIZE - NOT FULL CELL AS IS ORIGINAL FUNCTION + // spanfill or spanborder are set in FlowingBlock functions + if ($spanfill || !empty($this->spanborddet) || $link!='') { + $exth = 0.2; // Add to fontsize to increase height of background / link / border + $boxtop = $this->y+$baseline+$va-($this->FontSize*(1+$exth/2)*(0.5+$bfx)); + $boxheight = $this->FontSize * (1+$exth); + $boxbottom = $boxtop + $boxheight; + } + } + + $bbw = $tbw = $lbw = $rbw = 0; // Border widths + if (!empty($this->spanborddet)) { + if (!isset($this->spanborddet['B'])) { $this->spanborddet['B'] = array('s' => 0, 'style' => '', 'w' => 0); } + if (!isset($this->spanborddet['T'])) { $this->spanborddet['T'] = array('s' => 0, 'style' => '', 'w' => 0); } + if (!isset($this->spanborddet['L'])) { $this->spanborddet['L'] = array('s' => 0, 'style' => '', 'w' => 0); } + if (!isset($this->spanborddet['R'])) { $this->spanborddet['R'] = array('s' => 0, 'style' => '', 'w' => 0); } + $bbw = $this->spanborddet['B']['w']; + $tbw = $this->spanborddet['T']['w']; + $lbw = $this->spanborddet['L']['w']; + $rbw = $this->spanborddet['R']['w']; + } + if($fill==1 || $border==1 || !empty($this->spanborddet)) { + if (!empty($this->spanborddet)) { + if ($fill==1) { + $s.=sprintf('%.3F %.3F %.3F %.3F re f ',($this->x-$lbw)*_MPDFK,($this->h-$boxtop+$tbw)*_MPDFK,($w+$lbw+$rbw)*_MPDFK,(-$boxheight-$tbw-$bbw)*_MPDFK); + } + $s.= ' q '; + $dashon = 3; + $dashoff = 3.5; + $dot = 2.5; + if($tbw) { + $short = 0; + if ($this->spanborddet['T']['style'] == 'dashed') { + $s.=sprintf(' 0 j 0 J [%.3F %.3F] 0 d ',$tbw*$dashon*_MPDFK,$tbw*$dashoff*_MPDFK); + } + else if ($this->spanborddet['T']['style'] == 'dotted') { + $s.=sprintf(' 1 j 1 J [%.3F %.3F] %.3F d ',0.001,$tbw*$dot*_MPDFK,-$tbw/2*_MPDFK); + $short = $tbw/2; + } + else { + $s.=' 0 j 0 J [] 0 d '; + } + $c = $this->SetDColor($this->spanborddet['T']['c'],true); + if ($this->spanborddet['T']['style'] == 'double') { + $s.=sprintf(' %s %.3F w ',$c,$tbw/3*_MPDFK); + $xadj = $xadj2 = 0; + if ($this->spanborddet['L']['style'] == 'double') { $xadj = $this->spanborddet['L']['w']*2/3; } + if ($this->spanborddet['R']['style'] == 'double') { $xadj2 = $this->spanborddet['R']['w']*2/3; } + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x-$lbw)*_MPDFK,($this->h-$boxtop+$tbw*5/6)*_MPDFK,($this->x+$w+$rbw-$short)*_MPDFK,($this->h-$boxtop+$tbw*5/6)*_MPDFK); + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x-$lbw+$xadj)*_MPDFK,($this->h-$boxtop+$tbw/6)*_MPDFK,($this->x+$w+$rbw-$short-$xadj2)*_MPDFK,($this->h-$boxtop+$tbw/6)*_MPDFK); + } + else { + $s.=sprintf(' %s %.3F w ',$c,$tbw*_MPDFK); + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x-$lbw)*_MPDFK,($this->h-$boxtop+$tbw/2)*_MPDFK,($this->x+$w+$rbw-$short)*_MPDFK,($this->h-$boxtop+$tbw/2)*_MPDFK); + } + } + if($bbw) { + $short = 0; + if ($this->spanborddet['B']['style'] == 'dashed') { + $s.=sprintf(' 0 j 0 J [%.3F %.3F] 0 d ',$bbw*$dashon*_MPDFK,$bbw*$dashoff*_MPDFK); + } + else if ($this->spanborddet['B']['style'] == 'dotted') { + $s.=sprintf(' 1 j 1 J [%.3F %.3F] %.3F d ',0.001,$bbw*$dot*_MPDFK,-$bbw/2*_MPDFK); + $short = $bbw/2; + } + else { + $s.=' 0 j 0 J [] 0 d '; + } + $c = $this->SetDColor($this->spanborddet['B']['c'],true); + if ($this->spanborddet['B']['style'] == 'double') { + $s.=sprintf(' %s %.3F w ',$c,$bbw/3*_MPDFK); + $xadj = $xadj2 = 0; + if ($this->spanborddet['L']['style'] == 'double') { $xadj = $this->spanborddet['L']['w']*2/3; } + if ($this->spanborddet['R']['style'] == 'double') { $xadj2 = $this->spanborddet['R']['w']*2/3; } + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x-$lbw+$xadj)*_MPDFK,($this->h-$boxbottom-$bbw/6)*_MPDFK,($this->x+$w+$rbw-$short-$xadj2)*_MPDFK,($this->h-$boxbottom-$bbw/6)*_MPDFK); + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x-$lbw)*_MPDFK,($this->h-$boxbottom-$bbw*5/6)*_MPDFK,($this->x+$w+$rbw-$short)*_MPDFK,($this->h-$boxbottom-$bbw*5/6)*_MPDFK); + } + else { + $s.=sprintf(' %s %.3F w ',$c,$bbw*_MPDFK); + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x-$lbw)*_MPDFK,($this->h-$boxbottom-$bbw/2)*_MPDFK,($this->x+$w+$rbw-$short)*_MPDFK,($this->h-$boxbottom-$bbw/2)*_MPDFK); + } + } + if($lbw) { + $short = 0; + if ($this->spanborddet['L']['style'] == 'dashed') { + $s.=sprintf(' 0 j 0 J [%.3F %.3F] 0 d ',$lbw*$dashon*_MPDFK,$lbw*$dashoff*_MPDFK); + } + else if ($this->spanborddet['L']['style'] == 'dotted') { + $s.=sprintf(' 1 j 1 J [%.3F %.3F] %.3F d ',0.001,$lbw*$dot*_MPDFK,-$lbw/2*_MPDFK); + $short = $lbw/2; + } + else { + $s.=' 0 j 0 J [] 0 d '; + } + $c = $this->SetDColor($this->spanborddet['L']['c'],true); + if ($this->spanborddet['L']['style'] == 'double') { + $s.=sprintf(' %s %.3F w ',$c,$lbw/3*_MPDFK); + $yadj = $yadj2 = 0; + if ($this->spanborddet['T']['style'] == 'double') { $yadj = $this->spanborddet['T']['w']*2/3; } + if ($this->spanborddet['B']['style'] == 'double') { $yadj2 = $this->spanborddet['B']['w']*2/3; } + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x-$lbw/6)*_MPDFK,($this->h-$boxtop+$tbw-$yadj)*_MPDFK,($this->x-$lbw/6)*_MPDFK,($this->h-$boxbottom-$bbw+$short+$yadj2)*_MPDFK); + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x-$lbw*5/6)*_MPDFK,($this->h-$boxtop+$tbw)*_MPDFK,($this->x-$lbw*5/6)*_MPDFK,($this->h-$boxbottom-$bbw+$short)*_MPDFK); + } + else { + $s.=sprintf(' %s %.3F w ',$c,$lbw*_MPDFK); + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x-$lbw/2)*_MPDFK,($this->h-$boxtop+$tbw)*_MPDFK,($this->x-$lbw/2)*_MPDFK,($this->h-$boxbottom-$bbw+$short)*_MPDFK); + } + } + if($rbw) { + $short = 0; + if ($this->spanborddet['R']['style'] == 'dashed') { + $s.=sprintf(' 0 j 0 J [%.3F %.3F] 0 d ',$rbw*$dashon*_MPDFK,$rbw*$dashoff*_MPDFK); + } + else if ($this->spanborddet['R']['style'] == 'dotted') { + $s.=sprintf(' 1 j 1 J [%.3F %.3F] %.3F d ',0.001,$rbw*$dot*_MPDFK,-$rbw/2*_MPDFK); + $short = $rbw/2; + } + else { + $s.=' 0 j 0 J [] 0 d '; + } + $c = $this->SetDColor($this->spanborddet['R']['c'],true); + if ($this->spanborddet['R']['style'] == 'double') { + $s.=sprintf(' %s %.3F w ',$c,$rbw/3*_MPDFK); + $yadj = $yadj2 = 0; + if ($this->spanborddet['T']['style'] == 'double') { $yadj = $this->spanborddet['T']['w']*2/3; } + if ($this->spanborddet['B']['style'] == 'double') { $yadj2 = $this->spanborddet['B']['w']*2/3; } + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x+$w+$rbw/6)*_MPDFK,($this->h-$boxtop+$tbw-$yadj)*_MPDFK,($this->x+$w+$rbw/6)*_MPDFK,($this->h-$boxbottom-$bbw+$short+$yadj2)*_MPDFK); + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x+$w+$rbw*5/6)*_MPDFK,($this->h-$boxtop+$tbw)*_MPDFK,($this->x+$w+$rbw*5/6)*_MPDFK,($this->h-$boxbottom-$bbw+$short)*_MPDFK); + } + else { + $s.=sprintf(' %s %.3F w ',$c,$rbw*_MPDFK); + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($this->x+$w+$rbw/2)*_MPDFK,($this->h-$boxtop+$tbw)*_MPDFK,($this->x+$w+$rbw/2)*_MPDFK,($this->h-$boxbottom-$bbw+$short)*_MPDFK); + } + } + $s.= ' Q '; + } + else { + if ($fill==1) $op=($border==1) ? 'B' : 'f'; + else $op='S'; + $s.=sprintf('%.3F %.3F %.3F %.3F re %s ',$this->x*_MPDFK,($this->h-$boxtop)*_MPDFK,$w*_MPDFK,-$boxheight*_MPDFK,$op); + } + } + + if(is_string($border)) { + $x=$this->x; + $y=$this->y; + if(is_int(strpos($border,'L'))) + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',$x*_MPDFK,($this->h-$boxtop)*_MPDFK,$x*_MPDFK,($this->h-($boxbottom))*_MPDFK); + if(is_int(strpos($border,'T'))) + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',$x*_MPDFK,($this->h-$boxtop)*_MPDFK,($x+$w)*_MPDFK,($this->h-$boxtop)*_MPDFK); + if(is_int(strpos($border,'R'))) + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',($x+$w)*_MPDFK,($this->h-$boxtop)*_MPDFK,($x+$w)*_MPDFK,($this->h-($boxbottom))*_MPDFK); + if(is_int(strpos($border,'B'))) + $s.=sprintf('%.3F %.3F m %.3F %.3F l S ',$x*_MPDFK,($this->h-($boxbottom))*_MPDFK,($x+$w)*_MPDFK,($this->h-($boxbottom))*_MPDFK); + } + + if($txt!='') { + if ($exactWidth) + $stringWidth = $w; + else + $stringWidth = $this->GetStringWidth($txt) + ( $this->charspacing * mb_strlen( $txt, $this->mb_enc ) / _MPDFK ) + + ( $this->ws * mb_substr_count( $txt, ' ', $this->mb_enc ) / _MPDFK ); + + // Set x OFFSET FOR PRINTING + if($align=='R') { + $dx=$w-$this->cMarginR - $stringWidth - $lcpaddingR; + } + elseif($align=='C') { + $dx=(($w - $stringWidth )/2); + } + elseif($align=='L' or $align=='J') $dx=$this->cMarginL + $lcpaddingL; + else $dx = 0; + + if($this->ColorFlag) $s .='q '.$this->TextColor.' '; + + // OUTLINE + if($this->textparam['outline-s'] && !$this->S) { // mPDF 5.6.07 + $s .=' '.sprintf('%.3F w',$this->LineWidth*_MPDFK).' '; + $s .=" $this->DrawColor "; + $s .=" 2 Tr "; + } + else if ($this->falseBoldWeight && strpos($this->ReqFontStyle,"B") !== false && strpos($this->FontStyle,"B") === false && !$this->S) { // can't use together with OUTLINE or Small Caps + $s .= ' 2 Tr 1 J 1 j '; + $s .= ' '.sprintf('%.3F w',($this->FontSize/130)*_MPDFK*$this->falseBoldWeight).' '; + $tc = strtoupper($this->TextColor); // change 0 0 0 rg to 0 0 0 RG + if($this->FillColor!=$tc) { $s .= ' '.$tc.' '; } // stroke (outline) = same colour as text(fill) + } + else { $s .=" 0 Tr "; } // mPDF 5.6.07 + + if (strpos($this->ReqFontStyle,"I") !== false && strpos($this->FontStyle,"I") === false) { // Artificial italic + $aix = '1 0 0.261799 1 %.3F %.3F Tm '; + } + else { $aix = '%.3F %.3F Td '; } + + // THE TEXT + $sub = ''; + $this->CurrentFont['used']= true; + + // WORD SPACING + // IF multibyte - Tw has no effect - need to use alternative method - do word spacing using an adjustment before each space + if ($this->ws && !$this->usingCoreFont && !$this->CurrentFont['sip'] && !$this->CurrentFont['smp'] && !$this->S) { + $sub .= ' BT 0 Tw ET '; + if ($this->kerning && $this->useKerning) { $sub .= $this->_kern($txt, 'MBTw', $aix, ($this->x+$dx), ($this->y+$baseline+$va)); } + else { + $space = " "; + //Convert string to UTF-16BE without BOM + $space= $this->UTF8ToUTF16BE($space , false); + $space=$this->_escape($space ); + $sub .=sprintf('BT '.$aix,($this->x+$dx)*_MPDFK,($this->h-($this->y+$baseline+$va))*_MPDFK); + $t = explode(' ',$txt); + $sub .=sprintf(' %.3F Tc [',$this->charspacing); + $numt = count($t); + for($i=0;$i<$numt;$i++) { + $tx = $t[$i]; + //Convert string to UTF-16BE without BOM + $tx = $this->UTF8ToUTF16BE($tx , false); + $tx = $this->_escape($tx); + $sub .=sprintf('(%s) ',$tx); + if (($i+1)<$numt) { + $adj = -($this->ws)*1000/$this->FontSizePt; + $sub .=sprintf('%d(%s) ',$adj,$space); + } + } + $sub .='] TJ '; + $sub .=' ET'; + } + } + else { + $txt2= $txt; + if ($this->CurrentFont['type']=='TTF' && ($this->CurrentFont['sip'] || $this->CurrentFont['smp'])) { + if ($this->S) { $sub .= $this->_smallCaps($txt2, 'SIPSMP', $aix, $dx, _MPDFK, $baseline, $va); } + else { + $txt2 = $this->UTF8toSubset($txt2); + $sub .=sprintf('BT '.$aix.' %s Tj ET',($this->x+$dx)*_MPDFK,($this->h-($this->y+$baseline+$va))*_MPDFK,$txt2); + } + } + else { + if ($this->S) { $sub .= $this->_smallCaps($txt2, '', $aix, $dx, _MPDFK, $baseline, $va); } + else if ($this->kerning && $this->useKerning) { $sub .= $this->_kern($txt2, '', $aix, ($this->x+$dx), ($this->y+$baseline+$va)); } + else { + if (!$this->usingCoreFont) { + $txt2 = $this->UTF8ToUTF16BE($txt2, false); + } + $txt2=$this->_escape($txt2); + $sub .=sprintf('BT '.$aix.' (%s) Tj ET',($this->x+$dx)*_MPDFK,($this->h-($this->y+$baseline+$va))*_MPDFK,$txt2); + } + } + } + // UNDERLINE + if($this->U) { + $c = strtoupper($this->TextColor); // change 0 0 0 rg to 0 0 0 RG + if($this->FillColor!=$c) { $sub .= ' '.$c.' '; } + if (isset($this->CurrentFont['up'])) { $up=$this->CurrentFont['up']; } + else { $up = -100; } + $adjusty = (-$up/1000* $this->FontSize); + if (isset($this->CurrentFont['ut'])) { $ut=$this->CurrentFont['ut']/1000* $this->FontSize; } + else { $ut = 60/1000* $this->FontSize; } + $olw = $this->LineWidth; + $sub .=' '.(sprintf(' %.3F w 0 j 0 J ',$ut*_MPDFK)); + $sub .=' '.$this->_dounderline($this->x+$dx,$this->y+$baseline+$va+$adjusty,$txt); + $sub .=' '.(sprintf(' %.3F w 2 j 2 J ',$olw*_MPDFK)); + if($this->FillColor!=$c) { $sub .= ' '.$this->FillColor.' '; } + } + + // STRIKETHROUGH + if($this->strike) { + $c = strtoupper($this->TextColor); // change 0 0 0 rg to 0 0 0 RG + if($this->FillColor!=$c) { $sub .= ' '.$c.' '; } + //Superscript and Subscript Y coordinate adjustment (now for striked-through texts) + if (isset($this->CurrentFont['desc']['CapHeight'])) { $ch=$this->CurrentFont['desc']['CapHeight']; } + else { $ch = 700; } + $adjusty = (-$ch/1000* $this->FontSize) * 0.35; + if (isset($this->CurrentFont['ut'])) { $ut=$this->CurrentFont['ut']/1000* $this->FontSize; } + else { $ut = 60/1000* $this->FontSize; } + $olw = $this->LineWidth; + $sub .=' '.(sprintf(' %.3F w 0 j 0 J ',$ut*_MPDFK)); + $sub .=' '.$this->_dounderline($this->x+$dx,$this->y+$baseline+$va+$adjusty,$txt); + $sub .=' '.(sprintf(' %.3F w 2 j 2 J ',$olw*_MPDFK)); + if($this->FillColor!=$c) { $sub .= ' '.$this->FillColor.' '; } + } + + // TEXT SHADOW + if ($this->textshadow) { // First to process is last in CSS comma separated shadows + foreach($this->textshadow AS $ts) { + $s .= ' q '; + $s .= $this->SetTColor($ts['col'], true)."\n"; + if ($ts['col']{0}==5 && ord($ts['col']{4})<100) { // RGBa + $s .= $this->SetAlpha(ord($ts['col']{4})/100, 'Normal', true, 'F')."\n"; + } + else if ($ts['col']{0}==6 && ord($ts['col']{5})<100) { // CMYKa + $s .= $this->SetAlpha(ord($ts['col']{5})/100, 'Normal', true, 'F')."\n"; + } + else if ($ts['col']{0}==1 && $ts['col']{2}==1 && ord($ts['col']{3})<100) { // Gray + $s .= $this->SetAlpha(ord($ts['col']{3})/100, 'Normal', true, 'F')."\n"; + } + $s .= sprintf(' 1 0 0 1 %.4F %.4F cm', $ts['x']*_MPDFK, -$ts['y']*_MPDFK)."\n"; + $s .= $sub; + $s .= ' Q '; + } + } + + $s .= $sub; + + // COLOR + if($this->ColorFlag) $s .=' Q'; + + // LINK + if($link!='') { + $this->Link($this->x,$boxtop,$w,$boxheight,$link); + } + } + if($s) $this->_out($s); + + // WORD SPACING + if ($this->ws && !$this->usingCoreFont) { + $this->_out(sprintf('BT %.3F Tc ET',$this->charspacing)); + } + $this->lasth=$h; + if( strpos($txt,"\n") !== false) $ln=1; // cell recognizes \n from <BR> tag + if($ln>0) + { + //Go to next line + $this->y += $h; + if($ln==1) { + //Move to next line + if ($currentx != 0) { $this->x=$currentx; } + else { $this->x=$this->lMargin; } + } + } + else $this->x+=$w; + + +} + + +function _kern($txt, $mode, $aix, $x, $y) { + if ($mode == 'MBTw') { // Multibyte requiring word spacing + $space = ' '; + //Convert string to UTF-16BE without BOM + $space= $this->UTF8ToUTF16BE($space , false); + $space=$this->_escape($space ); + $s = sprintf(' BT '.$aix,$x*_MPDFK,($this->h-$y)*_MPDFK); + $t = explode(' ',$txt); + for($i=0;$i<count($t);$i++) { + $tx = $t[$i]; + + $tj = '('; + $unicode = $this->UTF8StringToArray($tx); + for($ti=0;$ti<count($unicode);$ti++) { + if ($ti > 0 && isset($this->CurrentFont['kerninfo'][$unicode[($ti-1)]][$unicode[$ti]])) { + $kern = -$this->CurrentFont['kerninfo'][$unicode[($ti-1)]][$unicode[$ti]]; + $tj .= sprintf(')%d(',$kern); + } + $tc = code2utf($unicode[$ti]); + $tc = $this->UTF8ToUTF16BE($tc, false); + $tj .= $this->_escape($tc); + } + $tj .= ')'; + $s.=sprintf(' %.3F Tc [%s] TJ',$this->charspacing,$tj); + + + if (($i+1)<count($t)) { + $s.=sprintf(' %.3F Tc (%s) Tj',$this->ws+$this->charspacing,$space); + } + } + $s.=' ET '; + } + else if (!$this->usingCoreFont) { + $s = ''; + $tj = '('; + $unicode = $this->UTF8StringToArray($txt); + for($i=0;$i<count($unicode);$i++) { + if ($i > 0 && isset($this->CurrentFont['kerninfo'][$unicode[($i-1)]][$unicode[$i]])) { + $kern = -$this->CurrentFont['kerninfo'][$unicode[($i-1)]][$unicode[$i]]; + $tj .= sprintf(')%d(',$kern); + } + $tx = code2utf($unicode[$i]); + $tx = $this->UTF8ToUTF16BE($tx, false); + $tj .= $this->_escape($tx); + } + $tj .= ')'; + $s.=sprintf(' BT '.$aix.' [%s] TJ ET ',$x*_MPDFK,($this->h-$y)*_MPDFK,$tj); + } + else { // CORE Font + $s = ''; + $tj = '('; + $l = strlen($txt); + for($i=0;$i<$l;$i++) { + if ($i > 0 && isset($this->CurrentFont['kerninfo'][$txt[($i-1)]][$txt[$i]])) { + $kern = -$this->CurrentFont['kerninfo'][$txt[($i-1)]][$txt[$i]]; + $tj .= sprintf(')%d(',$kern); + } + $tj .= $this->_escape($txt[$i]); + } + $tj .= ')'; + $s.=sprintf(' BT '.$aix.' [%s] TJ ET ',$x*_MPDFK,($this->h-$y)*_MPDFK,$tj); + } + + return $s; +} + + +function _smallCaps($txt, $mode, $aix, $dx, $k, $baseline, $va) { + $upp = false; + $str = array(); + $bits = array(); + if (!$this->usingCoreFont) { + $unicode = $this->UTF8StringToArray($txt); + foreach($unicode as $char) { + if ($this->ws && $char == 32) { // space + if (count($str)) { $bits[] = array($upp, $str, false); } + $bits[] = array(false, array(32), true); + $str = array(); + $upp = false; + } + else if (isset($this->upperCase[$char])) { + if (!$upp) { + if (count($str)) { $bits[] = array($upp, $str, false); } + $str = array(); + } + $str[] = $this->upperCase[$char]; + if ((!isset($this->CurrentFont['sip']) || !$this->CurrentFont['sip']) && (!isset($this->CurrentFont['smp']) || !$this->CurrentFont['smp'])) { + $this->CurrentFont['subset'][$this->upperCase[$char]] = $this->upperCase[$char]; + } + $upp = true; + } + else { + if ($upp) { + if (count($str)) { $bits[] = array($upp, $str, false); } + $str = array(); + } + $str[] = $char; + $upp = false; + } + } + } + else { + for($i=0;$i<strlen($txt);$i++) { + if (isset($this->upperCase[ord($txt[$i])]) && $this->upperCase[ord($txt[$i])] < 256) { + if (!$upp) { + if (count($str)) { $bits[] = array($upp, $str, false); } + $str = array(); + } + $str[] = $this->upperCase[ord($txt[$i])]; + $upp = true; + } + else { + if ($upp) { + if (count($str)) { $bits[] = array($upp, $str, false); } + $str = array(); + } + $str[] = ord($txt[$i]); + $upp = false; + } + } + } + if (count($str)) { $bits[] = array($upp, $str, false); } + + $fid = $this->CurrentFont['i']; + + $s=sprintf(' BT '.$aix,($this->x+$dx)*$k,($this->h-($this->y+$baseline+$va))*$k); + foreach($bits AS $b) { + if ($b[0]) { $upp = true; } + else { $upp = false; } + + $size = count ($b[1]); + $txt = ''; + for ($i = 0; $i < $size; $i++) { + $txt .= code2utf($b[1][$i]); + } + if ($this->usingCoreFont) { + $txt = utf8_decode($txt); + } + if ($mode == 'SIPSMP') { + $txt = $this->UTF8toSubset($txt); + } + else { + if (!$this->usingCoreFont) { + $txt = $this->UTF8ToUTF16BE($txt, false); + } + $txt=$this->_escape($txt); + $txt = '('.$txt.')'; + } + if ($b[2]) { // space + $s.=sprintf(' /F%d %.3F Tf %d Tz', $fid, $this->FontSizePt, 100); + $s.=sprintf(' %.3F Tc', ($this->charspacing+$this->ws)); + $s.=sprintf(' %s Tj', $txt); + } + else if ($upp) { + $s.=sprintf(' /F%d %.3F Tf', $fid, $this->FontSizePt*$this->smCapsScale); + $s.=sprintf(' %d Tz', $this->smCapsStretch); + $s.=sprintf(' %.3F Tc', ($this->charspacing*100/$this->smCapsStretch)); + $s.=sprintf(' %s Tj', $txt); + } + else { + $s.=sprintf(' /F%d %.3F Tf %d Tz', $fid, $this->FontSizePt, 100); + $s.=sprintf(' %.3F Tc', ($this->charspacing)); + $s.=sprintf(' %s Tj', $txt); + } + } + $s.=' ET '; + return $s; +} + + +function MultiCell($w,$h,$txt,$border=0,$align='',$fill=0,$link='',$directionality='ltr',$encoded=false) +{ + // Parameter (pre-)encoded - When called internally from ToC or textarea: mb_encoding already done - but not reverse RTL/Indic + if (!$encoded) { + $txt = $this->purify_utf8_text($txt); + if ($this->text_input_as_HTML) { + $txt = $this->all_entities_to_utf8($txt); + } + if ($this->usingCoreFont) { $txt = mb_convert_encoding($txt,$this->mb_enc,'UTF-8'); } + // Font-specific ligature substitution for Indic fonts + else if (isset($this->CurrentFont['indic']) && $this->CurrentFont['indic']) { // *INDIC* + $this->ConvertIndic($tmp); // *INDIC* + } // *INDIC* + if (preg_match("/([".$this->pregRTLchars."])/u", $txt)) { $this->biDirectional = true; } // *RTL* + } + if (!$align) { $align = $this->defaultAlign; } + + //Output text with automatic or explicit line breaks + $cw=&$this->CurrentFont['cw']; + if($w==0) $w=$this->w-$this->rMargin-$this->x; + + $wmax = ($w - ($this->cMarginL+$this->cMarginR)); + if ($this->usingCoreFont) { + $s=str_replace("\r",'',$txt); + $nb=strlen($s); + while($nb>0 and $s[$nb-1]=="\n") $nb--; + } + else { + $s=str_replace("\r",'',$txt); + $nb=mb_strlen($s, $this->mb_enc ); + while($nb>0 and mb_substr($s,$nb-1,1,$this->mb_enc )=="\n") $nb--; + } + $b=0; + if($border) { + if($border==1) { + $border='LTRB'; + $b='LRT'; + $b2='LR'; + } + else { + $b2=''; + if(is_int(strpos($border,'L'))) $b2.='L'; + if(is_int(strpos($border,'R'))) $b2.='R'; + $b=is_int(strpos($border,'T')) ? $b2.'T' : $b2; + } + } + $sep=-1; + $i=0; + $j=0; + $l=0; + $ns=0; + $nl=1; + + + + if (!$this->usingCoreFont) { + $checkCursive=false; + if ($this->biDirectional) { $checkCursive=true; } + else if (isset($this->CurrentFont['indic']) && $this->CurrentFont['indic']) { $checkCursive=true; } // *INDIC* + while($i<$nb) { + //Get next character + $c = mb_substr($s,$i,1,$this->mb_enc ); + if($c == "\n") { + //Explicit line break + // WORD SPACING + $this->ResetSpacing(); + $tmp = rtrim(mb_substr($s,$j,$i-$j,$this->mb_enc)); + // DIRECTIONALITY + $this->magic_reverse_dir($tmp, true, $directionality); // *RTL* + + $this->Cell($w,$h,$tmp,$b,2,$align,$fill,$link); + $i++; + $sep=-1; + $j=$i; + $l=0; + $ns=0; + $nl++; + if($border and $nl==2) $b=$b2; + continue; + } + if($c == " ") { + $sep=$i; + $ls=$l; + $ns++; + } + + $l += $this->GetCharWidthNonCore($c); + + if($l>$wmax) { + //Automatic line break + if($sep==-1) { // Only one word + if($i==$j) $i++; + // WORD SPACING + $this->ResetSpacing(); + $tmp = rtrim(mb_substr($s,$j,$i-$j,$this->mb_enc)); + // DIRECTIONALITY + $this->magic_reverse_dir($tmp, true, $directionality); // *RTL* + + $this->Cell($w,$h,$tmp,$b,2,$align,$fill,$link); + } + else { + $tmp = rtrim(mb_substr($s,$j,$sep-$j,$this->mb_enc)); + if($align=='J') { + ////////////////////////////////////////// + // JUSTIFY J using Unicode fonts (Word spacing doesn't work) + // WORD SPACING UNICODE + // Change NON_BREAKING SPACE to spaces so they are 'spaced' properly + $tmp = str_replace(chr(194).chr(160),chr(32),$tmp ); + $len_ligne = $this->GetStringWidth($tmp ); + $nb_carac = mb_strlen( $tmp , $this->mb_enc ) ; + $nb_spaces = mb_substr_count( $tmp ,' ', $this->mb_enc ) ; + + $inclCursive=false; + if ($checkCursive) { + if (preg_match("/([".$this->pregRTLchars."])/u", $tmp)) { $inclCursive = true; } // *RTL* + if (preg_match("/([".$this->pregHIchars.$this->pregBNchars.$this->pregPAchars."])/u", $tmp)) { $inclCursive = true; } // *INDIC* + } + list($charspacing,$ws) = $this->GetJspacing($nb_carac,$nb_spaces,((($wmax) - $len_ligne) * _MPDFK),$inclCursive); + $this->SetSpacing($charspacing,$ws); + ////////////////////////////////////////// + } + + // DIRECTIONALITY + $this->magic_reverse_dir($tmp, true, $directionality); // *RTL* + + $this->Cell($w,$h,$tmp,$b,2,$align,$fill,$link); + $i=$sep+1; + } + $sep=-1; + $j=$i; + $l=0; + $ns=0; + $nl++; + if($border and $nl==2) $b=$b2; + } + else $i++; + } + //Last chunk + // WORD SPACING + + $this->ResetSpacing(); + + } + + + else { + + while($i<$nb) { + //Get next character + $c=$s[$i]; + if($c == "\n") { + //Explicit line break + // WORD SPACING + $this->ResetSpacing(); + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill,$link); + $i++; + $sep=-1; + $j=$i; + $l=0; + $ns=0; + $nl++; + if($border and $nl==2) $b=$b2; + continue; + } + if($c == " ") { + $sep=$i; + $ls=$l; + $ns++; + } + + $l += $this->GetCharWidthCore($c); + if($l>$wmax) { + //Automatic line break + if($sep==-1) { + if($i==$j) $i++; + // WORD SPACING + $this->ResetSpacing(); + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill,$link); + } + else { + if($align=='J') { + $tmp = rtrim(substr($s,$j,$sep-$j)); + ////////////////////////////////////////// + // JUSTIFY J using Unicode fonts (Word spacing doesn't work) + // WORD SPACING NON_UNICDOE/CJK + // Change NON_BREAKING SPACE to spaces so they are 'spaced' properly + $tmp = str_replace(chr(160),chr(32),$tmp); + $len_ligne = $this->GetStringWidth($tmp ); + $nb_carac = strlen( $tmp ) ; + $nb_spaces = substr_count( $tmp ,' ' ) ; + list($charspacing,$ws) = $this->GetJspacing($nb_carac,$nb_spaces,((($wmax) - $len_ligne) * _MPDFK),false); + $this->SetSpacing($charspacing,$ws); + ////////////////////////////////////////// + } + $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill,$link); + $i=$sep+1; + } + $sep=-1; + $j=$i; + $l=0; + $ns=0; + $nl++; + if($border and $nl==2) $b=$b2; + } + else $i++; + } + //Last chunk + // WORD SPACING + + $this->ResetSpacing(); + + } + //Last chunk + if($border and is_int(strpos($border,'B'))) $b.='B'; + if (!$this->usingCoreFont) { + $tmp = rtrim(mb_substr($s,$j,$i-$j,$this->mb_enc)); + // DIRECTIONALITY + $this->magic_reverse_dir($tmp, true, $directionality); // *RTL* + $this->Cell($w,$h,$tmp,$b,2,$align,$fill,$link); + } + else { $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill,$link); } + $this->x=$this->lMargin; +} + + +/*-- DIRECTW --*/ +function Write($h,$txt,$currentx=0,$link='',$directionality='ltr',$align='') { + if (!class_exists('directw', false)) { include(_MPDF_PATH.'classes/directw.php'); } + if (empty($this->directw)) { $this->directw = new directw($this); } + $this->directw->Write($h,$txt,$currentx,$link,$directionality,$align); +} +/*-- END DIRECTW --*/ + + +/*-- HTML-CSS --*/ +function saveInlineProperties() { + $saved = array(); + $saved[ 'family' ] = $this->FontFamily; + $saved[ 'style' ] = $this->FontStyle; + $saved[ 'sizePt' ] = $this->FontSizePt; + $saved[ 'size' ] = $this->FontSize; + $saved[ 'HREF' ] = $this->HREF; + $saved[ 'underline' ] = $this->U; + $saved[ 'smCaps' ] = $this->S; + $saved[ 'strike' ] = $this->strike; + $saved[ 'textshadow' ] = $this->textshadow; + $saved[ 'SUP' ] = $this->SUP; + $saved[ 'SUB' ] = $this->SUB; + $saved[ 'linewidth' ] = $this->LineWidth; + $saved[ 'drawcolor' ] = $this->DrawColor; + $saved[ 'textparam' ] = $this->textparam; + $saved[ 'toupper' ] = $this->toupper; + $saved[ 'tolower' ] = $this->tolower; + $saved[ 'capitalize' ] = $this->capitalize; + $saved[ 'fontkerning' ] = $this->kerning; + $saved[ 'lSpacingCSS' ] = $this->lSpacingCSS; + $saved[ 'wSpacingCSS' ] = $this->wSpacingCSS; + $saved[ 'I' ] = $this->I; + $saved[ 'B' ] = $this->B; + $saved[ 'colorarray' ] = $this->colorarray; + $saved[ 'bgcolorarray' ] = $this->spanbgcolorarray; + $saved[ 'border' ] = $this->spanborddet; + $saved[ 'color' ] = $this->TextColor; + $saved[ 'bgcolor' ] = $this->FillColor; + $saved[ 'lang' ] = $this->currentLang; + $saved[ 'display_off' ] = $this->inlineDisplayOff; + + return $saved; +} + +function restoreInlineProperties( &$saved) { + $FontFamily = $saved[ 'family' ]; + $this->FontStyle = $saved[ 'style' ]; + $this->FontSizePt = $saved[ 'sizePt' ]; + $this->FontSize = $saved[ 'size' ]; + + $this->currentLang = $saved['lang']; + if ($this->useLang && !$this->usingCoreFont) { + if ($this->currentLang != $this->default_lang && ((strlen($this->currentLang) == 5 && $this->currentLang != 'UTF-8') || strlen($this->currentLang ) == 2)) { + list ($coreSuitable,$mpdf_pdf_unifonts) = GetLangOpts($this->currentLang, $this->useAdobeCJK); + if ($mpdf_pdf_unifonts) { $this->RestrictUnicodeFonts($mpdf_pdf_unifonts); } + else { $this->RestrictUnicodeFonts($this->default_available_fonts ); } + } + else { + $this->RestrictUnicodeFonts($this->default_available_fonts ); + } + } + + $this->ColorFlag = ($this->FillColor != $this->TextColor); //Restore ColorFlag as well + + $this->HREF = $saved[ 'HREF' ]; + $this->U = $saved[ 'underline' ]; + $this->S = $saved[ 'smCaps' ]; + $this->strike = $saved[ 'strike' ]; + $this->textshadow = $saved[ 'textshadow' ]; + $this->SUP = $saved[ 'SUP' ]; + $this->SUB = $saved[ 'SUB' ]; + $this->LineWidth = $saved[ 'linewidth' ]; + $this->DrawColor = $saved[ 'drawcolor' ]; + $this->textparam = $saved[ 'textparam' ]; + $this->inlineDisplayOff = $saved['display_off']; + + $this->toupper = $saved[ 'toupper' ]; + $this->tolower = $saved[ 'tolower' ]; + $this->capitalize = $saved[ 'capitalize' ]; + $this->kerning = $saved[ 'fontkerning' ]; + $this->lSpacingCSS = $saved[ 'lSpacingCSS' ]; + if (($this->lSpacingCSS || $this->lSpacingCSS==='0') && strtoupper($this->lSpacingCSS) != 'NORMAL') { + $this->fixedlSpacing = $this->ConvertSize($this->lSpacingCSS,$this->FontSize); + } + else { $this->fixedlSpacing = false; } + $this->wSpacingCSS = $saved[ 'wSpacingCSS' ]; + if ($this->wSpacingCSS && strtoupper($this->wSpacingCSS) != 'NORMAL') { + $this->minwSpacing = $this->ConvertSize($this->wSpacingCSS,$this->FontSize); + } + else { $this->minwSpacing = 0; } + + $this->SetFont($FontFamily, $saved[ 'style' ].($this->U ? 'U' : '').($this->S ? 'S' : ''),$saved[ 'sizePt' ],false); + + $this->currentfontstyle = $saved[ 'style' ].($this->U ? 'U' : '').($this->S ? 'S' : ''); + $this->currentfontsize = $saved[ 'sizePt' ]; + $this->SetStylesArray(array('S'=>$this->S, 'U'=>$this->U, 'B'=>$saved[ 'B' ], 'I'=>$saved[ 'I' ])); + + $this->TextColor = $saved[ 'color' ]; + $this->FillColor = $saved[ 'bgcolor' ]; + $this->colorarray = $saved[ 'colorarray' ]; + $cor = $saved[ 'colorarray' ]; + if ($cor) $this->SetTColor($cor); + $this->spanbgcolorarray = $saved[ 'bgcolorarray' ]; + $cor = $saved[ 'bgcolorarray' ]; + if ($cor) $this->SetFColor($cor); + $this->spanborddet = $saved[ 'border' ]; +} + + + +// Used when ColActive for tables - updated to return first block with background fill OR borders +function GetFirstBlockFill() { + // Returns the first blocklevel that uses a bgcolor fill + $startfill = 0; + for ($i=1;$i<=$this->blklvl;$i++) { + if ($this->blk[$i]['bgcolor'] || $this->blk[$i]['border_left']['w'] || $this->blk[$i]['border_right']['w'] || $this->blk[$i]['border_top']['w'] || $this->blk[$i]['border_bottom']['w'] ) { + $startfill = $i; + break; + } + } + return $startfill; +} + +function SetBlockFill($blvl) { + if ($this->blk[$blvl]['bgcolor']) { + $this->SetFColor($this->blk[$blvl]['bgcolorarray']); + return 1; + } + else { + $this->SetFColor($this->ConvertColor(255)); + return 0; + } +} + + +//-------------------------FLOWING BLOCK------------------------------------// +//The following functions were originally written by Damon Kohler // +//--------------------------------------------------------------------------// + +function saveFont() { + $saved = array(); + $saved[ 'family' ] = $this->FontFamily; + $saved[ 'style' ] = $this->FontStyle; + $saved[ 'sizePt' ] = $this->FontSizePt; + $saved[ 'size' ] = $this->FontSize; + $saved[ 'curr' ] = &$this->CurrentFont; + $saved[ 'color' ] = $this->TextColor; + $saved[ 'spanbgcolor' ] = $this->spanbgcolor; + $saved[ 'spanbgcolorarray' ] = $this->spanbgcolorarray; + $saved[ 'bord' ] = $this->spanborder; + $saved[ 'border' ] = $this->spanborddet; + $saved[ 'HREF' ] = $this->HREF; + $saved[ 'underline' ] = $this->U; + $saved[ 'smCaps' ] = $this->S; + $saved[ 'strike' ] = $this->strike; + $saved[ 'textshadow' ] = $this->textshadow; + $saved[ 'SUP' ] = $this->SUP; + $saved[ 'SUB' ] = $this->SUB; + $saved[ 'linewidth' ] = $this->LineWidth; + $saved[ 'drawcolor' ] = $this->DrawColor; + $saved[ 'textparam' ] = $this->textparam; + $saved[ 'ReqFontStyle' ] = $this->ReqFontStyle; + $saved[ 'fontkerning' ] = $this->kerning; + $saved[ 'fixedlSpacing' ] = $this->fixedlSpacing; + $saved[ 'minwSpacing' ] = $this->minwSpacing; + return $saved; +} + +function restoreFont( &$saved, $write=true) { + if (!isset($saved) || empty($saved)) return; + + $this->FontFamily = $saved[ 'family' ]; + $this->FontStyle = $saved[ 'style' ]; + $this->FontSizePt = $saved[ 'sizePt' ]; + $this->FontSize = $saved[ 'size' ]; + $this->CurrentFont = &$saved[ 'curr' ]; + $this->TextColor = $saved[ 'color' ]; + $this->spanbgcolor = $saved[ 'spanbgcolor' ]; + $this->spanbgcolorarray = $saved[ 'spanbgcolorarray' ]; + $this->spanborder = $saved[ 'bord' ]; + $this->spanborddet = $saved[ 'border' ]; + $this->ColorFlag = ($this->FillColor != $this->TextColor); //Restore ColorFlag as well + $this->HREF = $saved[ 'HREF' ]; + $this->U = $saved[ 'underline' ]; + $this->S = $saved[ 'smCaps' ]; + $this->kerning = $saved[ 'fontkerning' ]; + $this->fixedlSpacing = $saved[ 'fixedlSpacing' ]; + $this->minwSpacing = $saved[ 'minwSpacing' ]; + $this->strike = $saved[ 'strike' ]; + $this->textshadow = $saved[ 'textshadow' ]; + $this->SUP = $saved[ 'SUP' ]; + $this->SUB = $saved[ 'SUB' ]; + $this->LineWidth = $saved[ 'linewidth' ]; + $this->DrawColor = $saved[ 'drawcolor' ]; + $this->textparam = $saved[ 'textparam' ]; + if ($write) { + $this->SetFont($saved[ 'family' ],$saved[ 'style' ].($this->U ? 'U' : '').($this->S ? 'S' : ''),$saved[ 'sizePt' ],true,true); // force output + $fontout = (sprintf('BT /F%d %.3F Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); + if($this->page>0 && ((isset($this->pageoutput[$this->page]['Font']) && $this->pageoutput[$this->page]['Font'] != $fontout) || !isset($this->pageoutput[$this->page]['Font']) || $this->keep_block_together)) { $this->_out($fontout); } + $this->pageoutput[$this->page]['Font'] = $fontout; + } + else + $this->SetFont($saved[ 'family' ],$saved[ 'style' ].($this->U ? 'U' : '').($this->S ? 'S' : ''),$saved[ 'sizePt' ]); + $this->ReqFontStyle = $saved[ 'ReqFontStyle' ]; +} + +function newFlowingBlock( $w, $h, $a = '', $is_table = false, $is_list = false, $blockstate = 0, $newblock=true, $blockdir='ltr') +{ + if (!$a) { + if ($blockdir=='rtl') { $a = 'R'; } + else { $a = 'L'; } + } + $this->flowingBlockAttr[ 'width' ] = ($w * _MPDFK); + // line height in user units + $this->flowingBlockAttr[ 'is_table' ] = $is_table; + $this->flowingBlockAttr[ 'is_list' ] = $is_list; + $this->flowingBlockAttr[ 'height' ] = $h; + $this->flowingBlockAttr[ 'lineCount' ] = 0; + $this->flowingBlockAttr[ 'align' ] = $a; + $this->flowingBlockAttr[ 'font' ] = array(); + $this->flowingBlockAttr[ 'content' ] = array(); + $this->flowingBlockAttr[ 'contentB' ] = array(); + $this->flowingBlockAttr[ 'contentWidth' ] = 0; + $this->flowingBlockAttr[ 'blockstate' ] = $blockstate; + + $this->flowingBlockAttr[ 'newblock' ] = $newblock; + $this->flowingBlockAttr[ 'valign' ] = 'M'; + $this->flowingBlockAttr['blockdir'] = $blockdir; + +} + +function finishFlowingBlock($endofblock=false, $next='') { + $currentx = $this->x; + //prints out the last chunk + $is_table = $this->flowingBlockAttr[ 'is_table' ]; + $is_list = $this->flowingBlockAttr[ 'is_list' ]; + $maxWidth =& $this->flowingBlockAttr[ 'width' ]; + $lineHeight =& $this->flowingBlockAttr[ 'height' ]; + $align =& $this->flowingBlockAttr[ 'align' ]; + $content =& $this->flowingBlockAttr[ 'content' ]; + $contentB =& $this->flowingBlockAttr[ 'contentB' ]; + $font =& $this->flowingBlockAttr[ 'font' ]; + $contentWidth =& $this->flowingBlockAttr[ 'contentWidth' ]; + $lineCount =& $this->flowingBlockAttr[ 'lineCount' ]; + $valign =& $this->flowingBlockAttr[ 'valign' ]; + $blockstate = $this->flowingBlockAttr[ 'blockstate' ]; + + $newblock = $this->flowingBlockAttr[ 'newblock' ]; + $blockdir = $this->flowingBlockAttr['blockdir']; + + + // *********** BLOCK BACKGROUND COLOR *****************// + if ($this->blk[$this->blklvl]['bgcolor'] && !$is_table) { + $fill = 0; + } + else { + $this->SetFColor($this->ConvertColor(255)); + $fill = 0; + } + + $hanger = ''; // mPDF 5.6.40 + + // Always right trim! + // Right trim content and adjust width if need to justify (later) + if (isset($content[count($content)-1]) && preg_match('/[ ]+$/',$content[count($content)-1], $m)) { + $strip = strlen($m[0]); + $content[count($content)-1] = substr($content[count($content)-1],0,(strlen($content[count($content)-1])-$strip)); + $this->restoreFont( $font[ count($content)-1 ],false ); + $contentWidth -= $this->GetStringWidth($m[0]) * _MPDFK; + } + + // the amount of space taken up so far in user units + $usedWidth = 0; + + // COLS + $oldcolumn = $this->CurrCol; + + if ($this->ColActive && !$is_table) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + + // Print out each chunk + +/*-- TABLES --*/ + if ($is_table) { + $ipaddingL = 0; + $ipaddingR = 0; + $paddingL = 0; + $paddingR = 0; + } + else { +/*-- END TABLES --*/ + $ipaddingL = $this->blk[$this->blklvl]['padding_left']; + $ipaddingR = $this->blk[$this->blklvl]['padding_right']; + $paddingL = ($ipaddingL * _MPDFK); + $paddingR = ($ipaddingR * _MPDFK); + $this->cMarginL = $this->blk[$this->blklvl]['border_left']['w']; + $this->cMarginR = $this->blk[$this->blklvl]['border_right']['w']; + + // Added mPDF 3.0 Float DIV + $fpaddingR = 0; + $fpaddingL = 0; +/*-- CSS-FLOAT --*/ + if (count($this->floatDivs)) { + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl); + if ($r_exists) { $fpaddingR = $r_width; } + if ($l_exists) { $fpaddingL = $l_width; } + } +/*-- END CSS-FLOAT --*/ + + $usey = $this->y + 0.002; + if (($newblock) && ($blockstate==1 || $blockstate==3) && ($lineCount == 0) ) { + $usey += $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; + } +/*-- CSS-IMAGE-FLOAT --*/ + // If float exists at this level + if (isset($this->floatmargins['R']) && $usey <= $this->floatmargins['R']['y1'] && $usey >= $this->floatmargins['R']['y0'] && !$this->floatmargins['R']['skipline']) { $fpaddingR += $this->floatmargins['R']['w']; } + if (isset($this->floatmargins['L']) && $usey <= $this->floatmargins['L']['y1'] && $usey >= $this->floatmargins['L']['y0'] && !$this->floatmargins['L']['skipline']) { $fpaddingL += $this->floatmargins['L']['w']; } +/*-- END CSS-IMAGE-FLOAT --*/ + } // *TABLES* + + // Set Current lineheight (correction factor) + $lhfixed = false; +/*-- LISTS --*/ + if ($is_list) { + if (preg_match('/([0-9.,]+)mm/',$this->list_lineheight[$this->listlvl][$this->listOcc],$am)) { + $lhfixed = true; + $def_fontsize = $this->InlineProperties['LISTITEM'][$this->listlvl][$this->listOcc][$this->listnum]['size']; + $this->lineheight_correction = $am[1] / $def_fontsize ; + } + else { + $this->lineheight_correction = $this->list_lineheight[$this->listlvl][$this->listOcc]; + } + } + else +/*-- END LISTS --*/ +/*-- TABLES --*/ + if ($is_table) { + if (preg_match('/([0-9.,]+)mm/',$this->table_lineheight,$am)) { + $lhfixed = true; + $def_fontsize = $this->FontSize; // needs to be default font-size for block **** + $this->lineheight_correction = $lineHeight / $def_fontsize ; + } + else { + $this->lineheight_correction = $this->table_lineheight; + } + } + else +/*-- END TABLES --*/ + if (isset($this->blk[$this->blklvl]['line_height']) && $this->blk[$this->blklvl]['line_height']) { + if (preg_match('/([0-9.,]+)mm/',$this->blk[$this->blklvl]['line_height'],$am)) { + $lhfixed = true; + $def_fontsize = $this->blk[$this->blklvl]['InlineProperties']['size']; // needs to be default font-size for block **** + $this->lineheight_correction = $am[1] / $def_fontsize ; + } + else { + $this->lineheight_correction = $this->blk[$this->blklvl]['line_height']; + } + } + else { + $this->lineheight_correction = $this->normalLineheight; + } + + // correct lineheight to maximum fontsize + if ($lhfixed) { $maxlineHeight = $this->lineheight; } + else { $maxlineHeight = 0; } + $this->forceExactLineheight = true; + $maxfontsize = 0; + // While we're at it, check if contains cursive text + $checkCursive=false; + if ($this->biDirectional) { $checkCursive=true; } // *RTL* + foreach ( $content as $k => $chunk ) + { + $this->restoreFont( $font[ $k ],false ); + if (!isset($this->objectbuffer[$k])) { + // Soft Hyphens chr(173) + if (!$this->usingCoreFont) { + $content[$k] = $chunk = str_replace("\xc2\xad",'',$chunk ); + if (isset($this->CurrentFont['indic']) && $this->CurrentFont['indic']) { $checkCursive=true; } // *INDIC* + } + else if ($this->FontFamily!='csymbol' && $this->FontFamily!='czapfdingbats') { + $content[$k] = $chunk = str_replace(chr(173),'',$chunk ); + } + // Special case of sub/sup carried over on its own to last line + if (($this->SUB || $this->SUP) && count($content)==1) { $actfs = $this->FontSize*100/55; } // 55% is font change for sub/sup + else { $actfs = $this->FontSize; } + if (!$lhfixed) { $maxlineHeight = max($maxlineHeight,$actfs * $this->lineheight_correction ); } + if ($lhfixed && ($actfs > $def_fontsize || ($actfs > ($lineHeight * $this->lineheight_correction) && $is_list))) { + $this->forceExactLineheight = false; + } + $maxfontsize = max($maxfontsize,$actfs); + } + } + + if(isset($font[count($font)-1])) { + $lastfontreqstyle = $font[count($font)-1]['ReqFontStyle']; + $lastfontstyle = $font[count($font)-1]['style']; + } + else { + $lastfontreqstyle=null; + $lastfontstyle=null; + } + if ($blockdir == 'ltr' && strpos($lastfontreqstyle,"I") !== false && strpos($lastfontstyle,"I") === false) { // Artificial italic + $lastitalic = $this->FontSize*0.15*_MPDFK; + } + else { $lastitalic = 0; } + + +/*-- LISTS --*/ + if ($is_list && is_array($this->bulletarray) && count($this->bulletarray)) { + $actfs = $this->bulletarray['fontsize']; + if (!$lhfixed) { $maxlineHeight = max($maxlineHeight,$actfs * $this->lineheight_correction ); } + if ($lhfixed && $actfs > $def_fontsize) { $this->forceExactLineheight = false; } + $maxfontsize = max($maxfontsize,$actfs); + } +/*-- END LISTS --*/ + + // when every text item checked i.e. $maxfontsize is set properly + + $af = 0; // Above font + $bf = 0; // Below font + $mta = 0; // Maximum top-aligned + $mba = 0; // Maximum bottom-aligned + + foreach ( $content as $k => $chunk ) + { + if (isset($this->objectbuffer[$k])) { + $oh = $this->objectbuffer[$k]['OUTER-HEIGHT']; + $va = $this->objectbuffer[$k]['vertical-align']; // = $objattr['vertical-align'] = set as M,T,B,S + if ($lhfixed && $oh > $def_fontsize) { $this->forceExactLineheight = false; } + + if ($va == 'BS') { // (BASELINE default) + $af = max($af, ($oh - ($maxfontsize * (0.5 + $this->baselineC)))); + } + else if ($va == 'M') { + $af = max($af, ($oh - $maxfontsize)/2); + $bf = max($bf, ($oh - $maxfontsize)/2); + } + else if ($va == 'TT') { + $bf = max($bf, ($oh - $maxfontsize)); + } + else if ($va == 'TB') { + $af = max($af, ($oh - $maxfontsize)); + } + else if ($va == 'T') { + $mta = max($mta, $oh); + } + else if ($va == 'B') { + $mba = max($mba, $oh); + } + } + } + if ((!$lhfixed || !$this->forceExactLineheight) && ($af > (($maxlineHeight - $maxfontsize)/2) || $bf > (($maxlineHeight - $maxfontsize)/2))) { + $maxlineHeight = $maxfontsize + $af + $bf; + } + else if (!$lhfixed) { $af = $bf = ($maxlineHeight - $maxfontsize)/2; } + if ($mta > $maxlineHeight) { + $bf += ($mta - $maxlineHeight); + $maxlineHeight = $mta; + } + if ($mba > $maxlineHeight) { + $af += ($mba - $maxlineHeight); + $maxlineHeight = $mba; + } + + $lineHeight = $maxlineHeight; + // If NOT images, and maxfontsize NOT > lineHeight - this value determines text baseline positioning + if ($lhfixed && $af==0 && $bf==0 && $maxfontsize<=($def_fontsize * $this->lineheight_correction * 0.8 )) { + $this->linemaxfontsize = $def_fontsize; + } + else { $this->linemaxfontsize = $maxfontsize; } + + // Get PAGEBREAK TO TEST for height including the bottom border/padding + $check_h = max($this->divheight,$lineHeight); + + // This fixes a proven bug... + if ($endofblock && $newblock && $blockstate==0 && !$content) { $check_h = 0; } + // but ? needs to fix potentially more widespread... + // if (!$content) { $check_h = 0; } + + if ($this->blklvl > 0 && !$is_table) { + if ($endofblock && $blockstate > 1) { + if ($this->blk[$this->blklvl]['page_break_after_avoid']) { $check_h += $lineHeight; } + $check_h += ($this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w']); + } + // mPDF 5.4.03 + if (($newblock && ($blockstate==1 || $blockstate==3) && $lineCount == 0) || ($endofblock && $blockstate ==3 && $lineCount == 0)) { + $check_h += ($this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['border_top']['w']); + } + } + + // Force PAGE break if column height cannot take check-height + if ($this->ColActive && $check_h > ($this->PageBreakTrigger - $this->y0)) { + $this->SetCol($this->NbCol-1); + } + + // mPDF 5.4.04 + // Avoid just border/background-color moved on to next page + if ($endofblock && $blockstate > 1 && !$content) { $buff = $this->margBuffer; } + else { $buff = 0; } + + + // PAGEBREAK + // mPDF 5.4.04 + if(!$is_table && ($this->y+$check_h) > ($this->PageBreakTrigger + $buff) and !$this->InFooter and $this->AcceptPageBreak()) { + $bak_x=$this->x;//Current X position + // WORD SPACING + $ws=$this->ws;//Word Spacing + $charspacing=$this->charspacing;//Character Spacing + $this->ResetSpacing(); + + $this->AddPage($this->CurOrientation); + + $this->x=$bak_x; + // Added to correct for OddEven Margins + $currentx += $this->MarginCorrection; + $this->x += $this->MarginCorrection; + + // WORD SPACING + $this->SetSpacing($charspacing,$ws); + } + + if ($this->keep_block_together && !$is_table && $this->kt_p00 < $this->page && ($this->y+$check_h) > $this->kt_y00) { + $this->printdivbuffer(); + $this->keep_block_together = 0; + } + +/*-- COLUMNS --*/ + // COLS + // COLUMN CHANGE + if ($this->CurrCol != $oldcolumn) { + $currentx += $this->ChangeColumn * ($this->ColWidth+$this->ColGap); + $this->x += $this->ChangeColumn * ($this->ColWidth+$this->ColGap); + $oldcolumn = $this->CurrCol; + } + + + if ($this->ColActive && !$is_table) { $this->breakpoints[$this->CurrCol][] = $this->y; } +/*-- END COLUMNS --*/ + + // TOP MARGIN + if ($newblock && ($blockstate==1 || $blockstate==3) && ($this->blk[$this->blklvl]['margin_top']) && $lineCount == 0 && !$is_table && !$is_list) { + $this->DivLn($this->blk[$this->blklvl]['margin_top'],$this->blklvl-1,true,$this->blk[$this->blklvl]['margin_collapse']); + if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + } + + if ($newblock && ($blockstate==1 || $blockstate==3) && $lineCount == 0 && !$is_table && !$is_list) { + $this->blk[$this->blklvl]['y0'] = $this->y; + $this->blk[$this->blklvl]['startpage'] = $this->page; + if ($this->blk[$this->blklvl]['float']) { $this->blk[$this->blklvl]['float_start_y'] = $this->y; } // mPDF 5.6.63 + if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + } + + // ADDED for Paragraph_indent + $WidthCorrection = 0; + if (($newblock) && ($blockstate==1 || $blockstate==3) && isset($this->blk[$this->blklvl]['text_indent']) && ($lineCount == 0) && (!$is_table) && (!$is_list) && ($align != 'C')) { + $ti = $this->ConvertSize($this->blk[$this->blklvl]['text_indent'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + $WidthCorrection = ($ti*_MPDFK); + } + + + // PADDING and BORDER spacing/fill + if (($newblock) && ($blockstate==1 || $blockstate==3) && (($this->blk[$this->blklvl]['padding_top']) || ($this->blk[$this->blklvl]['border_top'])) && ($lineCount == 0) && (!$is_table) && (!$is_list)) { + // $state = 0 normal; 1 top; 2 bottom; 3 top and bottom + $this->DivLn($this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w'],-3,true,false,1); + if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + $this->x = $currentx; + } + + + // Added mPDF 3.0 Float DIV + $fpaddingR = 0; + $fpaddingL = 0; +/*-- CSS-FLOAT --*/ + if (count($this->floatDivs)) { + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl); + if ($r_exists) { $fpaddingR = $r_width; } + if ($l_exists) { $fpaddingL = $l_width; } + } +/*-- END CSS-FLOAT --*/ + + $usey = $this->y + 0.002; + if (($newblock) && ($blockstate==1 || $blockstate==3) && ($lineCount == 0) ) { + $usey += $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; + } +/*-- CSS-IMAGE-FLOAT --*/ + // If float exists at this level + if (isset($this->floatmargins['R']) && $usey <= $this->floatmargins['R']['y1'] && $usey >= $this->floatmargins['R']['y0'] && !$this->floatmargins['R']['skipline']) { $fpaddingR += $this->floatmargins['R']['w']; } + if (isset($this->floatmargins['L']) && $usey <= $this->floatmargins['L']['y1'] && $usey >= $this->floatmargins['L']['y0'] && !$this->floatmargins['L']['skipline']) { $fpaddingL += $this->floatmargins['L']['w']; } +/*-- END CSS-IMAGE-FLOAT --*/ + + if ($content) { + + // In FinishFlowing Block no lines are justified as it is always last line + // but if CJKorphan has allowed content width to go over max width, use J charspacing to compress line + // JUSTIFICATION J - NOT! + $nb_carac = 0; + $nb_spaces = 0; + $jcharspacing = 0; + $jws = 0; + $inclCursive=false; + $dottab = false; // mPDF 5.6.19 + foreach ( $content as $k => $chunk ) { + if (!isset($this->objectbuffer[$k]) || (isset($this->objectbuffer[$k]) && !$this->objectbuffer[$k])) { + if ($this->usingCoreFont) { + $chunk = str_replace(chr(160),chr(32),$chunk ); + } + else { + $chunk = str_replace(chr(194).chr(160),chr(32),$chunk ); + } + $nb_carac += mb_strlen( $chunk, $this->mb_enc ); + $nb_spaces += mb_substr_count( $chunk,' ', $this->mb_enc ); + if ($checkCursive) { + if (preg_match("/([".$this->pregRTLchars."])/u", $chunk)) { $inclCursive = true; } // *RTL* + if (preg_match("/([".$this->pregHIchars.$this->pregBNchars.$this->pregPAchars."])/u", $chunk)) { $inclCursive = true; } // *INDIC* + } + } + else if ($this->objectbuffer[$k]['type']=='dottab') { $dottab = $this->objectbuffer[$k]['outdent']; } // mPDF 5.6.19 + } + // if it's justified, we need to find the char/word spacing (or if orphans have allowed length of line to go over the maxwidth) + // If "orphans" in fact is just a final space - ignore this + // mPDF 5.6.40 + $lastchar = mb_substr($content[(count($content)-1)],mb_strlen($content[(count($content)-1)], $this->mb_enc)-1, 1, $this->mb_enc); + if (preg_match("/[".$this->CJKoverflow."]/u", $lastchar)) { $CJKoverflow = true; } + else {$CJKoverflow = false; } + if ((((($contentWidth + $lastitalic) > $maxWidth) && ($content[count($content)-1] != ' ') ) || + (!$endofblock && $align=='J' && ($next=='image' || $next=='select' || $next=='input' || $next=='textarea' || ($next=='br' && $this->justifyB4br)))) && !($CJKoverflow && $this->allowCJKoverflow) ) { // mPDF 5.6.40 + // WORD SPACING + list($jcharspacing,$jws) = $this->GetJspacing($nb_carac,$nb_spaces,($maxWidth-$lastitalic-$contentWidth-$WidthCorrection-(($this->cMarginL+$this->cMarginR)*_MPDFK)-($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK) )),$inclCursive); + } +/*-- CJK-FONTS --*/ + // mPDF 5.6.40 + else if ($this->checkCJK && $align=='J' && $CJKoverflow && $this->allowCJKoverflow && $this->CJKforceend) { + // force-end overhang + $hanger = mb_substr($content[count($content)-1],mb_strlen($content[count($content)-1],$this->mb_enc)-1,1,$this->mb_enc ); + if (preg_match("/[".$this->CJKoverflow."]/u", $hanger)) { + $content[count($content)-1] = mb_substr($content[count($content)-1],0,mb_strlen($content[count($content)-1],$this->mb_enc)-1,$this->mb_enc ); + $this->restoreFont( $font[ count($content)-1 ],false ); + $contentWidth -= $this->GetStringWidth($hanger) * _MPDFK; + $nb_carac -= 1; + list($jcharspacing,$jws) = $this->GetJspacing($nb_carac,$nb_spaces,($maxWidth-$lastitalic-$contentWidth-$WidthCorrection-(($this->cMarginL+$this->cMarginR)*_MPDFK)-($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK) )),$inclCursive); + } + } +/*-- END CJK-FONTS --*/ + + // Check if will fit at word/char spacing of previous line - if so continue it + // but only allow a maximum of $this->jSmaxWordLast and $this->jSmaxCharLast + else if ($contentWidth < ($maxWidth - $lastitalic-$WidthCorrection - (($this->cMarginL+$this->cMarginR)* _MPDFK) - ($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK))) && !$this->fixedlSpacing) { + if ($this->ws > $this->jSmaxWordLast) { + $jws = $this->jSmaxWordLast; + } + if ($this->charspacing > $this->jSmaxCharLast) { + $jcharspacing = $this->jSmaxCharLast; + } + $check = $maxWidth - $lastitalic-$WidthCorrection - $contentWidth - (($this->cMarginL+$this->cMarginR)* _MPDFK) - ($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK) ) - ( $jcharspacing * $nb_carac) - ( $jws * $nb_spaces); + if ($check <= 0) { + $jcharspacing = 0; + $jws = 0; + } + } + + $empty = $maxWidth - $lastitalic-$WidthCorrection - $contentWidth - (($this->cMarginL+$this->cMarginR)* _MPDFK) - ($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK) ); + + $empty -= ($jcharspacing * $nb_carac); + $empty -= ($jws * $nb_spaces); + + $empty /= _MPDFK; + + if (!$is_table) { + $this->maxPosR = max($this->maxPosR , ($this->w - $this->rMargin - $this->blk[$this->blklvl]['outer_right_margin'] - $empty)); + $this->maxPosL = min($this->maxPosL , ($this->lMargin + $this->blk[$this->blklvl]['outer_left_margin'] + $empty)); + } + + $arraysize = count($content); + + $margins = ($this->cMarginL+$this->cMarginR) + ($ipaddingL+$ipaddingR + $fpaddingR + $fpaddingR ); + + if (!$is_table) { $this->DivLn($lineHeight,$this->blklvl,false); } // false -> don't advance y + + // DIRECTIONALITY RTL + $all_rtl = false; + $contains_rtl = false; +/*-- RTL --*/ + if ($blockdir == 'rtl' || $this->biDirectional) { + $all_rtl = true; + foreach ( $content as $k => $chunk ) { + $reversed = $this->magic_reverse_dir($chunk, false, $blockdir); + if ($reversed > 0) { $contains_rtl = true; } + if ($reversed < 2) { $all_rtl = false; } + $content[$k] = $chunk; + } + if (($blockdir =='rtl' && $contains_rtl) || $all_rtl) { + $content = array_reverse($content,false); + $contentB = array_reverse($contentB,false); + } + } +/*-- END RTL --*/ + + $this->x = $currentx + $this->cMarginL + $ipaddingL + $fpaddingL; + if ($dottab !== false && $blockdir=='rtl') { $this->x -= $dottab; } // mPDF 5.6.19 + else if ($align == 'R') { $this->x += $empty; } + else if ($align == 'J' && $blockdir == 'rtl') { $this->x += $empty; } + else if ($align == 'C') { $this->x += ($empty / 2); } + + // Paragraph INDENT + $WidthCorrection = 0; + if (($newblock) && ($blockstate==1 || $blockstate==3) && isset($this->blk[$this->blklvl]['text_indent']) && ($lineCount == 0) && (!$is_table) && (!$is_list) && ($align !='C')) { + $ti = $this->ConvertSize($this->blk[$this->blklvl]['text_indent'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + $this->x += $ti; + } + + + foreach ( $content as $k => $chunk ) + { + + // FOR IMAGES + if ((($blockdir == 'rtl') && ($contains_rtl )) || $all_rtl ) { $dirk = $arraysize-1 - $k; } else { $dirk = $k; } + + $va = 'M'; // default for text + if (isset($this->objectbuffer[$dirk]) && $this->objectbuffer[$dirk]) { + $xadj = $this->x - $this->objectbuffer[$dirk]['OUTER-X']; + $this->objectbuffer[$dirk]['OUTER-X'] += $xadj; + $this->objectbuffer[$dirk]['BORDER-X'] += $xadj; + $this->objectbuffer[$dirk]['INNER-X'] += $xadj; + $va = $this->objectbuffer[$dirk]['vertical-align']; + $yadj = $this->y - $this->objectbuffer[$dirk]['OUTER-Y']; + if ($va == 'BS') { + $yadj += $af + ($this->linemaxfontsize * (0.5 + $this->baselineC)) - $this->objectbuffer[$dirk]['OUTER-HEIGHT']; + } + else if ($va == 'M' || $va == '') { + $yadj += $af + ($this->linemaxfontsize /2) - ($this->objectbuffer[$dirk]['OUTER-HEIGHT']/2); + } + else if ($va == 'TB') { + $yadj += $af + $this->linemaxfontsize - $this->objectbuffer[$dirk]['OUTER-HEIGHT']; + } + else if ($va == 'TT') { + $yadj += $af; + } + else if ($va == 'B') { + $yadj += $af + $this->linemaxfontsize + $bf - $this->objectbuffer[$dirk]['OUTER-HEIGHT']; + } + else if ($va == 'T') { + $yadj += 0; + } + $this->objectbuffer[$dirk]['OUTER-Y'] += $yadj; + $this->objectbuffer[$dirk]['BORDER-Y'] += $yadj; + $this->objectbuffer[$dirk]['INNER-Y'] += $yadj; + } + + + // DIRECTIONALITY RTL + if ((($blockdir == 'rtl') && ($contains_rtl )) || $all_rtl ) { $this->restoreFont( $font[ $arraysize-1 - $k ] ); } + else { $this->restoreFont( $font[ $k ] ); } + + // mPDF 5.6.13 Decimal alignment - set in _tableWrite + if ($is_table && substr($align,0,1)=='D' && $k==0 ) { + $dp = $this->decimal_align[substr($align,0,2)]; + $s = preg_split('/'.preg_quote($dp,'/').'/', $content[0], 2); // ? needs to be /u if not core + $s0 = $this->GetStringWidth($s[0], false); + $this->x += ($this->decimal_offset - $s0); + } + + $this->SetSpacing(($this->fixedlSpacing*_MPDFK)+$jcharspacing,($this->fixedlSpacing+$this->minwSpacing)*_MPDFK+$jws); + $this->fixedlSpacing = false; + $this->minwSpacing = 0; + + // mPDF 5.6.26 + $save_vis = $this->visibility; + if (isset($this->textparam['visibility']) && $this->textparam['visibility'] && $this->textparam['visibility'] != $this->visibility) { + $this->SetVisibility($this->textparam['visibility']); + } + + // *********** SPAN BACKGROUND COLOR ***************** // + if (isset($this->spanbgcolor) && $this->spanbgcolor) { + $cor = $this->spanbgcolorarray; + $this->SetFColor($cor); + $save_fill = $fill; $spanfill = 1; $fill = 1; + } + if (!empty($this->spanborddet)) { + if (strpos($contentB[$k],'L')!==false && isset($this->spanborddet['L'])) $this->x += $this->spanborddet['L']['w']; + if (strpos($contentB[$k],'L')===false) $this->spanborddet['L']['s'] = $this->spanborddet['L']['w'] = 0; + if (strpos($contentB[$k],'R')===false) $this->spanborddet['R']['s'] = $this->spanborddet['R']['w'] = 0; + } + // WORD SPACING + $stringWidth = $this->GetStringWidth($chunk ) + ( $this->charspacing * mb_strlen($chunk,$this->mb_enc ) / _MPDFK ) + + ( $this->ws * mb_substr_count($chunk,' ',$this->mb_enc ) / _MPDFK ); + if (isset($this->objectbuffer[$dirk])) { + if ($this->objectbuffer[$dirk]['type']=='dottab') { + $this->objectbuffer[$dirk]['OUTER-WIDTH'] +=$empty; + $this->objectbuffer[$dirk]['OUTER-WIDTH'] +=$this->objectbuffer[$dirk]['outdent']; // mPDF 5.6.19 + } + $stringWidth = $this->objectbuffer[$dirk]['OUTER-WIDTH']; + } + + if ($stringWidth==0) { $stringWidth = 0.000001; } + if ($k == $arraysize-1) { + // mPDF 5.6.40 + if ($this->checkCJK && $CJKoverflow && $align=='J' && $this->allowCJKoverflow && $hanger && $this->CJKforceend) { + // force-end overhang + $this->Cell( $stringWidth, $lineHeight, $chunk, '', 0, '', $fill, $this->HREF, $currentx,0,0,'M', $fill, $af, $bf, true ); + $this->Cell( $this->GetStringWidth($hanger), $lineHeight, $hanger, '', 1, '', $fill, $this->HREF, $currentx,0,0,'M', $fill, $af, $bf, true ); + } + else { + $this->Cell( $stringWidth, $lineHeight, $chunk, '', 1, '', $fill, $this->HREF, $currentx,0,0,'M', $fill, $af, $bf, true ); + } + } + else $this->Cell( $stringWidth, $lineHeight, $chunk, '', 0, '', $fill, $this->HREF, 0, 0,0,'M', $fill, $af, $bf, true );//first or middle part + + + if (!empty($this->spanborddet)) { + if (strpos($contentB[$k],'R')!==false && $k != $arraysize-1) $this->x += $this->spanborddet['R']['w']; + } + // *********** SPAN BACKGROUND COLOR OFF - RESET BLOCK BGCOLOR ***************** // + if (isset($spanfill) && $spanfill) { + $fill = $save_fill; $spanfill = 0; + if ($fill) { $this->SetFColor($bcor); } + } + // mPDF 5.6.26 + if (isset($this->textparam['visibility']) && $this->textparam['visibility'] && $this->visibility != $save_vis) { + $this->SetVisibility($save_vis); + } + + } + + $this->printobjectbuffer($is_table, $blockdir); + + $this->objectbuffer = array(); + + $this->ResetSpacing(); + +/*-- LISTS --*/ + // LIST BULLETS/NUMBERS + if ($is_list && is_array($this->bulletarray) && ($lineCount == 0) ) { + + $savedFont = $this->saveFont(); + + $bull = $this->bulletarray; + if (isset($bull['level']) && isset($bull['occur']) && isset($this->InlineProperties['LIST'][$bull['level']][$bull['occur']])) { + $this->restoreInlineProperties($this->InlineProperties['LIST'][$bull['level']][$bull['occur']]); + } + if (isset($bull['level']) && isset($bull['occur']) && isset($bull['num']) && isset($this->InlineProperties['LISTITEM'][$bull['level']][$bull['occur']][$bull['num']]) && $this->InlineProperties['LISTITEM'][$bull['level']][$bull['occur']][$bull['num']]) { $this->restoreInlineProperties($this->InlineProperties['LISTITEM'][$bull['level']][$bull['occur']][$bull['num']]); } + if (isset($bull['font']) && $bull['font'] == 'czapfdingbats') { + $this->bullet = true; + $this->SetFont('czapfdingbats','',$this->FontSizePt/2.5); + } + else { $this->SetFont($this->FontFamily,$this->FontStyle,$this->FontSizePt,true,true); } // force output + //Output bullet + $this->x = $currentx; + if (isset($bull['x'])) { $this->x += $bull['x']; } + $this->y -= $lineHeight; + if (isset($bull['col']) && $bull['col']) { $this->SetTColor($bull['col']); } // mPDF 5.6.67 + + if (isset($bull['txt'])) { $this->Cell($bull['w'], $lineHeight,$bull['txt'],'','',$bull['align'],0,'',0,-$this->cMarginL, -$this->cMarginR ); } + if (isset($bull['font']) && $bull['font'] == 'czapfdingbats') { + $this->bullet = false; + } + $this->x = $currentx; // Reset + $this->y += $lineHeight; + + if ($this->ColActive && !$is_table) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + + $this->restoreFont( $savedFont ); + // $font = array( $savedFont ); + + $this->bulletarray = array(); // prevents repeat of bullet/number if <li>....<br />.....</li> + } +/*-- END LISTS --*/ + + + } // END IF CONTENT + +/*-- CSS-IMAGE-FLOAT --*/ + // Update values if set to skipline + if ($this->floatmargins) { $this->_advanceFloatMargins(); } + + + if ($endofblock && $blockstate>1) { + // If float exists at this level + if (isset($this->floatmargins['R']['y1'])) { $fry1 = $this->floatmargins['R']['y1']; } + else { $fry1 = 0; } + if (isset($this->floatmargins['L']['y1'])) { $fly1 = $this->floatmargins['L']['y1']; } + else { $fly1 = 0; } + if ($this->y < $fry1 || $this->y < $fly1) { + $drop = max($fry1,$fly1) - $this->y; + $this->DivLn($drop); + $this->x = $currentx; + } + } +/*-- END CSS-IMAGE-FLOAT --*/ + + + // PADDING and BORDER spacing/fill + if ($endofblock && ($blockstate > 1) && ($this->blk[$this->blklvl]['padding_bottom'] || $this->blk[$this->blklvl]['border_bottom'] || $this->blk[$this->blklvl]['css_set_height']) && (!$is_table) && (!$is_list)) { + // If CSS height set, extend bottom - if on same page as block started, and CSS HEIGHT > actual height, + // and does not force pagebreak + $extra = 0; + if ($this->blk[$this->blklvl]['css_set_height'] && $this->blk[$this->blklvl]['startpage']==$this->page) { + // predicted height + $h1 = ($this->y-$this->blk[$this->blklvl]['y0']) + $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w']; + if ($h1 < ($this->blk[$this->blklvl]['css_set_height']+$this->blk[$this->blklvl]['padding_bottom']+$this->blk[$this->blklvl]['padding_top'])) { $extra = ($this->blk[$this->blklvl]['css_set_height']+$this->blk[$this->blklvl]['padding_bottom']+$this->blk[$this->blklvl]['padding_top']) - $h1; } + if($this->y + $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w'] + $extra > $this->PageBreakTrigger) { + $extra = $this->PageBreakTrigger - ($this->y + $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w']); + } + } + + // $state = 0 normal; 1 top; 2 bottom; 3 top and bottom + $this->DivLn($this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w'] + $extra,-3,true,false,2); + $this->x = $currentx; + + if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + + } + + // SET Bottom y1 of block (used for painting borders) + if (($endofblock) && ($blockstate > 1) && (!$is_table) && (!$is_list)) { + $this->blk[$this->blklvl]['y1'] = $this->y; + } + + // BOTTOM MARGIN + if (($endofblock) && ($blockstate > 1) && ($this->blk[$this->blklvl]['margin_bottom']) && (!$is_table) && (!$is_list)) { + if($this->y+$this->blk[$this->blklvl]['margin_bottom'] < $this->PageBreakTrigger and !$this->InFooter) { + $this->DivLn($this->blk[$this->blklvl]['margin_bottom'],$this->blklvl-1,true,$this->blk[$this->blklvl]['margin_collapse']); + if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + } + } + + // Reset lineheight + $lineHeight = $this->divheight; +} + + + + + +function printobjectbuffer($is_table=false, $blockdir=false) { + if (!$blockdir) { $blockdir = $this->directionality; } + if ($is_table && $this->shrin_k > 1) { $k = $this->shrin_k; } + else { $k = 1; } + $save_y = $this->y; + $save_x = $this->x; + $save_currentfontfamily = $this->FontFamily; + $save_currentfontsize = $this->FontSizePt; + $save_currentfontstyle = $this->FontStyle.($this->U ? 'U' : '').($this->S ? 'S' : ''); + if ($blockdir == 'rtl') { $rtlalign = 'R'; } else { $rtlalign = 'L'; } + foreach ($this->objectbuffer AS $ib => $objattr) { + if ($objattr['type'] == 'bookmark' || $objattr['type'] == 'indexentry' || $objattr['type'] == 'toc') { + $x = $objattr['OUTER-X']; + $y = $objattr['OUTER-Y']; + $this->y = $y - $this->FontSize/2; + $this->x = $x; + if ($objattr['type'] == 'bookmark' ) { $this->Bookmark($objattr['CONTENT'],$objattr['bklevel'] ,$y - $this->FontSize); } // *BOOKMARKS* + if ($objattr['type'] == 'indexentry') { $this->IndexEntry($objattr['CONTENT']); } // *INDEX* + if ($objattr['type'] == 'toc') { $this->TOC_Entry($objattr['CONTENT'], $objattr['toclevel'], $objattr['toc_id']); } // *TOC* + } +/*-- ANNOTATIONS --*/ + else if ($objattr['type'] == 'annot') { + if ($objattr['POS-X']) { $x = $objattr['POS-X']; } + else if ($this->annotMargin<>0) { $x = -$objattr['OUTER-X']; } + else { $x = $objattr['OUTER-X']; } + if ($objattr['POS-Y']) { $y = $objattr['POS-Y']; } + else { $y = $objattr['OUTER-Y'] - $this->FontSize/2; } + // Create a dummy entry in the _out/columnBuffer with position sensitive data, + // linking $y-1 in the Columnbuffer with entry in $this->columnAnnots + // and when columns are split in length will not break annotation from current line + $this->y = $y-1; + $this->x = $x-1; + $this->Line($x-1,$y-1,$x-1,$y-1); + $this->Annotation($objattr['CONTENT'], $x , $y , $objattr['ICON'], $objattr['AUTHOR'], $objattr['SUBJECT'], $objattr['OPACITY'], $objattr['COLOR'], $objattr['POPUP'], $objattr['FILE']); + } +/*-- END ANNOTATIONS --*/ + else { + $y = $objattr['OUTER-Y']; + $x = $objattr['OUTER-X']; + $w = $objattr['OUTER-WIDTH']; + $h = $objattr['OUTER-HEIGHT']; + if (isset($objattr['text'])) { $texto = $objattr['text']; } + $this->y = $y; + $this->x = $x; + if (isset($objattr['fontfamily'])) { $this->SetFont($objattr['fontfamily'],'',$objattr['fontsize'] ); } + } + + // HR + if ($objattr['type'] == 'hr') { + $this->SetDColor($objattr['color']); + switch($objattr['align']) { + case 'C': + $empty = $objattr['OUTER-WIDTH'] - $objattr['INNER-WIDTH']; + $empty /= 2; + $x += $empty; + break; + case 'R': + $empty = $objattr['OUTER-WIDTH'] - $objattr['INNER-WIDTH']; + $x += $empty; + break; + } + $oldlinewidth = $this->LineWidth; + $this->SetLineWidth($objattr['linewidth']/$k ); + $this->y += ($objattr['linewidth']/2) + $objattr['margin_top']/$k; + $this->Line($x,$this->y,$x+$objattr['INNER-WIDTH'],$this->y); + $this->SetLineWidth($oldlinewidth); + $this->SetDColor($this->ConvertColor(0)); + } + // IMAGE + if ($objattr['type'] == 'image') { + // mPDF 5.6.01 - LAYERS + if (isset($objattr['z-index']) && $objattr['z-index'] > 0 && $this->currentlayer==0) { + $this->BeginLayer($objattr['z-index']); + } + if(isset($objattr['visibility']) && $objattr['visibility']!='visible' && $objattr['visibility']) { + $this->SetVisibility($objattr['visibility']); + } + if (isset($objattr['opacity'])) { $this->SetAlpha($objattr['opacity']); } + $rotate = 0; + $obiw = $objattr['INNER-WIDTH']; + $obih = $objattr['INNER-HEIGHT']; + $sx = $objattr['INNER-WIDTH']*_MPDFK / $objattr['orig_w']; + $sy = abs($objattr['INNER-HEIGHT'])*_MPDFK / abs($objattr['orig_h']); + $sx = ($objattr['INNER-WIDTH']*_MPDFK / $objattr['orig_w']); + $sy = ($objattr['INNER-HEIGHT']*_MPDFK / $objattr['orig_h']); + + if (isset($objattr['ROTATE'])) { $rotate = $objattr['ROTATE']; } + if ($rotate==90) { + // Clockwise + $obiw = $objattr['INNER-HEIGHT']; + $obih = $objattr['INNER-WIDTH']; + $tr = $this->transformTranslate(0, -$objattr['INNER-WIDTH'], true) ; + $tr .= ' '. $this->transformRotate(90, $objattr['INNER-X'],($objattr['INNER-Y'] +$objattr['INNER-WIDTH'] ),true) ; + $sx = $obiw*_MPDFK / $objattr['orig_h']; + $sy = $obih*_MPDFK / $objattr['orig_w']; + } + else if ($rotate==-90 || $rotate==270) { + // AntiClockwise + $obiw = $objattr['INNER-HEIGHT']; + $obih = $objattr['INNER-WIDTH']; + $tr = $this->transformTranslate($objattr['INNER-WIDTH'], ($objattr['INNER-HEIGHT']-$objattr['INNER-WIDTH']), true) ; + $tr .= ' '. $this->transformRotate(-90, $objattr['INNER-X'],($objattr['INNER-Y'] +$objattr['INNER-WIDTH'] ),true) ; + $sx = $obiw*_MPDFK / $objattr['orig_h']; + $sy = $obih*_MPDFK / $objattr['orig_w']; + } + else if ($rotate==180) { + // Mirror + $tr = $this->transformTranslate($objattr['INNER-WIDTH'], -$objattr['INNER-HEIGHT'], true) ; + $tr .= ' '. $this->transformRotate(180, $objattr['INNER-X'],($objattr['INNER-Y'] +$objattr['INNER-HEIGHT'] ),true) ; + } + else { $tr = ''; } + $tr = trim($tr); + if ($tr) { $tr .= ' '; } + $gradmask = ''; + + +/*-- BACKGROUNDS --*/ + if (isset($objattr['GRADIENT-MASK'])) { + $g = $this->grad->parseMozGradient( $objattr['GRADIENT-MASK'] ); + if ($g) { + $dummy = $this->grad->Gradient($objattr['INNER-X'], $objattr['INNER-Y'], $obiw, $obih, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend'], true, true); + $gradmask = '/TGS'.count($this->gradients).' gs '; + // $this->_out("q ".$tr.$this->grad->Gradient($objattr['INNER-X'], $objattr['INNER-Y'], $obiw, $obih, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend'], true)." Q"); + } + } +/*-- END BACKGROUNDS --*/ +/*-- IMAGES-WMF --*/ + if (isset($objattr['itype']) && $objattr['itype']=='wmf') { + $outstring = sprintf('q '.$tr.'%.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, -$sy, $objattr['INNER-X']*_MPDFK-$sx*$objattr['wmf_x'], (($this->h-$objattr['INNER-Y'])*_MPDFK)+$sy*$objattr['wmf_y'], $objattr['ID']); + } + else +/*-- END IMAGES-WMF --*/ + if (isset($objattr['itype']) && $objattr['itype']=='svg') { + $outstring = sprintf('q '.$tr.'%.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, -$sy, $objattr['INNER-X']*_MPDFK-$sx*$objattr['wmf_x'], (($this->h-$objattr['INNER-Y'])*_MPDFK)+$sy*$objattr['wmf_y'], $objattr['ID']); + } + else { + $outstring = sprintf("q ".$tr."%.3F 0 0 %.3F %.3F %.3F cm ".$gradmask."/I%d Do Q",$obiw*_MPDFK, $obih*_MPDFK, $objattr['INNER-X'] *_MPDFK, ($this->h-($objattr['INNER-Y'] +$obih ))*_MPDFK,$objattr['ID'] ); + } + $this->_out($outstring); + // LINK + if (isset($objattr['link'])) $this->Link($objattr['INNER-X'],$objattr['INNER-Y'],$objattr['INNER-WIDTH'],$objattr['INNER-HEIGHT'],$objattr['link']); + if (isset($objattr['opacity'])) { $this->SetAlpha(1); } + if ((isset($objattr['border_top']) && $objattr['border_top']>0) || (isset($objattr['border_left']) && $objattr['border_left']>0) || (isset($objattr['border_right']) && $objattr['border_right']>0) || (isset($objattr['border_bottom']) && $objattr['border_bottom']>0)) { $this->PaintImgBorder($objattr,$is_table); } + if(isset($objattr['visibility']) && $objattr['visibility']!='visible' && $objattr['visibility']) { + $this->SetVisibility('visible'); + } + // mPDF 5.6.01 - LAYERS + if (isset($objattr['z-index']) && $objattr['z-index'] > 0 && $this->currentlayer==0) { + $this->EndLayer(); + } + + } + +/*-- BARCODES --*/ + // BARCODE + if ($objattr['type'] == 'barcode') { + $bgcol = $this->ConvertColor(255); + if (isset($objattr['bgcolor']) && $objattr['bgcolor']) { + $bgcol = $objattr['bgcolor']; + } + $col = $this->ConvertColor(0); + if (isset($objattr['color']) && $objattr['color']) { + $col = $objattr['color']; + } + $this->SetFColor($bgcol); + $this->Rect($objattr['BORDER-X'], $objattr['BORDER-Y'], $objattr['BORDER-WIDTH'], $objattr['BORDER-HEIGHT'], 'F'); + $this->SetFColor($this->ConvertColor(255)); + if (isset($objattr['BORDER-WIDTH'])) { $this->PaintImgBorder($objattr,$is_table); } + if ($objattr['btype'] == 'EAN13' || $objattr['btype'] == 'ISBN' || $objattr['btype'] == 'ISSN' || $objattr['btype'] == 'UPCA' || $objattr['btype'] == 'UPCE' || $objattr['btype'] == 'EAN8') { + $this->WriteBarcode($objattr['code'], $objattr['showtext'], $objattr['INNER-X'], $objattr['INNER-Y'], $objattr['bsize'], 0, 0, 0, 0, 0, $objattr['bheight'], $bgcol, $col, $objattr['btype'], $objattr['bsupp'], $objattr['bsupp_code'], $k); + } + // QR-code + else if ($objattr['btype']=='QR') { + if (!class_exists('QRcode', false)) { + include(_MPDF_PATH.'qrcode/qrcode.class.php'); + } + $this->qrcode = new QRcode($objattr['code'], $objattr['errorlevel']); + $this->qrcode->displayFPDF($this, $objattr['INNER-X'], $objattr['INNER-Y'], $objattr['bsize']*25, array(255,255,255), array(0,0,0)); + } + else { + $this->WriteBarcode2($objattr['code'], $objattr['INNER-X'], $objattr['INNER-Y'], $objattr['bsize'], $objattr['bheight'], $bgcol, $col, $objattr['btype'], $objattr['pr_ratio'], $k); + } + } +/*-- END BARCODES --*/ + + // TEXT CIRCLE + if ($objattr['type'] == 'textcircle') { + $bgcol = ''; // mPDF 5.5.14 + if (isset($objattr['bgcolor']) && $objattr['bgcolor']) { + $bgcol = $objattr['bgcolor']; + } + $col = $this->ConvertColor(0); + if (isset($objattr['color']) && $objattr['color']) { + $col = $objattr['color']; + } + $this->SetTColor($col); + $this->SetFColor($bgcol); + if ($bgcol) $this->Rect($objattr['BORDER-X'], $objattr['BORDER-Y'], $objattr['BORDER-WIDTH'], $objattr['BORDER-HEIGHT'], 'F'); // mPDF 5.5.14 + $this->SetFColor($this->ConvertColor(255)); + if (isset($objattr['BORDER-WIDTH'])) { $this->PaintImgBorder($objattr,$is_table); } + if (!class_exists('directw', false)) { include(_MPDF_PATH.'classes/directw.php'); } + if (empty($this->directw)) { $this->directw = new directw($this); } + $save_lmfs = $this->linemaxfontsize; + $this->linemaxfontsize = 0; + if (isset($objattr['top-text'])) { + $this->directw->CircularText($objattr['INNER-X']+$objattr['INNER-WIDTH']/2, $objattr['INNER-Y']+$objattr['INNER-HEIGHT']/2, $objattr['r']/$k, $objattr['top-text'], 'top', $objattr['fontfamily'], $objattr['fontsize']/$k, $objattr['fontstyle'], $objattr['space-width'], $objattr['char-width'], $objattr['divider']); // mPDF 5.5.23 + } + if (isset($objattr['bottom-text'])) { + $this->directw->CircularText($objattr['INNER-X']+$objattr['INNER-WIDTH']/2, $objattr['INNER-Y']+$objattr['INNER-HEIGHT']/2, $objattr['r']/$k, $objattr['bottom-text'], 'bottom', $objattr['fontfamily'], $objattr['fontsize']/$k, $objattr['fontstyle'], $objattr['space-width'], $objattr['char-width'], $objattr['divider']); // mPDF 5.5.23 + } + $this->linemaxfontsize = $save_lmfs; + } + + $this->ResetSpacing(); + + // DOT-TAB + if ($objattr['type'] == 'dottab') { + // mPDF 5.6.19 + if (isset($objattr['fontfamily'])) { $this->SetFont($objattr['fontfamily'],'',$objattr['fontsize'] ); } + $sp = $this->GetStringWidth(' '); + $nb=floor(($w-2*$sp)/$this->GetStringWidth('.')); + if ($nb>0) { $dots=' '.str_repeat('.',$nb).' '; } + else { $dots=' '; } + $col = $this->ConvertColor(0); + if (isset($objattr['colorarray']) && ($objattr['colorarray'])) { // mPDF 5.6.19 + $col = $objattr['colorarray']; + } + $this->SetTColor($col); + $save_dh = $this->divheight; // mPDF 5.6.19 + $save_sbd = $this->spanborddet; + $save_u = $this->U; + $save_s = $this->strike; + $this->spanborddet = ''; + $this->divheight = 0; // mPDF 5.6.19 + $this->U = false; + $this->strike = false; + $this->Cell($w,$h,$dots,0,0,'C'); + $this->spanborddet = $save_sbd; + $this->U = $save_u; + $this->strike = $save_s; + $this->divheight = $save_dh; // mPDF 5.6.19 + // mPDF 5.0 + $this->SetTColor($this->ConvertColor(0)); + } + +/*-- FORMS --*/ + // TEXT/PASSWORD INPUT + if ($objattr['type'] == 'input' && ($objattr['subtype'] == 'TEXT' || $objattr['subtype'] == 'PASSWORD')) { + $this->form->print_ob_text($objattr,$w,$h,$texto,$rtlalign,$k,$blockdir); + } + + // TEXTAREA + if ($objattr['type'] == 'textarea') { + $this->form->print_ob_textarea($objattr,$w,$h,$texto,$rtlalign,$k,$blockdir); + } + + // SELECT + if ($objattr['type'] == 'select') { + $this->form->print_ob_select($objattr,$w,$h,$texto,$rtlalign,$k,$blockdir); + } + + + // INPUT/BUTTON as IMAGE + if ($objattr['type'] == 'input' && $objattr['subtype'] == 'IMAGE') { + $this->form->print_ob_imageinput($objattr,$w,$h,$texto,$rtlalign,$k,$blockdir); + } + + // BUTTON + if ($objattr['type'] == 'input' && ($objattr['subtype'] == 'SUBMIT' || $objattr['subtype'] == 'RESET' || $objattr['subtype'] == 'BUTTON')) { + $this->form->print_ob_button($objattr,$w,$h,$texto,$rtlalign,$k,$blockdir); + } + + // CHECKBOX + if ($objattr['type'] == 'input' && ($objattr['subtype'] == 'CHECKBOX')) { + $this->form->print_ob_checkbox($objattr,$w,$h,$texto,$rtlalign,$k,$blockdir,$x,$y); + } + // RADIO + if ($objattr['type'] == 'input' && ($objattr['subtype'] == 'RADIO')) { + $this->form->print_ob_radio($objattr,$w,$h,$texto,$rtlalign,$k,$blockdir,$x,$y); + } +/*-- END FORMS --*/ + } + $this->SetFont($save_currentfontfamily,$save_currentfontstyle,$save_currentfontsize); + $this->y = $save_y; + $this->x = $save_x; + unset($content); +} + + +function WriteFlowingBlock( $s) +{ + $currentx = $this->x; + $is_table = $this->flowingBlockAttr[ 'is_table' ]; + $is_list = $this->flowingBlockAttr[ 'is_list' ]; + // width of all the content so far in points + $contentWidth =& $this->flowingBlockAttr[ 'contentWidth' ]; + // cell width in points + $maxWidth =& $this->flowingBlockAttr[ 'width' ]; + $lineCount =& $this->flowingBlockAttr[ 'lineCount' ]; + // line height in user units + $lineHeight =& $this->flowingBlockAttr[ 'height' ]; + $align =& $this->flowingBlockAttr[ 'align' ]; + $content =& $this->flowingBlockAttr[ 'content' ]; + $contentB =& $this->flowingBlockAttr[ 'contentB' ]; + $font =& $this->flowingBlockAttr[ 'font' ]; + $valign =& $this->flowingBlockAttr[ 'valign' ]; + $blockstate = $this->flowingBlockAttr[ 'blockstate' ]; + + $newblock = $this->flowingBlockAttr[ 'newblock' ]; + $blockdir = $this->flowingBlockAttr['blockdir']; + // *********** BLOCK BACKGROUND COLOR ***************** // + if ($this->blk[$this->blklvl]['bgcolor'] && !$is_table) { + $fill = 0; + } + else { + $this->SetFColor($this->ConvertColor(255)); + $fill = 0; + } + $font[] = $this->saveFont(); + $content[] = ''; + $contentB[] = ''; + $currContent =& $content[ count( $content ) - 1 ]; + // where the line should be cutoff if it is to be justified + $cutoffWidth = $contentWidth; + + $CJKoverflow = false; + $hanger = ''; // mPDF 5.6.40 + + // COLS + $oldcolumn = $this->CurrCol; + + if ($this->ColActive && !$is_table) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + +/*-- TABLES --*/ + if ($is_table) { + $ipaddingL = 0; + $ipaddingR = 0; + $paddingL = 0; + $paddingR = 0; + $cpaddingadjustL = 0; + $cpaddingadjustR = 0; + // Added mPDF 3.0 + $fpaddingR = 0; + $fpaddingL = 0; + } + else { +/*-- END TABLES --*/ + $ipaddingL = $this->blk[$this->blklvl]['padding_left']; + $ipaddingR = $this->blk[$this->blklvl]['padding_right']; + $paddingL = ($ipaddingL * _MPDFK); + $paddingR = ($ipaddingR * _MPDFK); + $this->cMarginL = $this->blk[$this->blklvl]['border_left']['w']; + $cpaddingadjustL = -$this->cMarginL; + $this->cMarginR = $this->blk[$this->blklvl]['border_right']['w']; + $cpaddingadjustR = -$this->cMarginR; + // Added mPDF 3.0 Float DIV + $fpaddingR = 0; + $fpaddingL = 0; +/*-- CSS-FLOAT --*/ + if (count($this->floatDivs)) { + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl); + if ($r_exists) { $fpaddingR = $r_width; } + if ($l_exists) { $fpaddingL = $l_width; } + } +/*-- END CSS-FLOAT --*/ + + $usey = $this->y + 0.002; + if (($newblock) && ($blockstate==1 || $blockstate==3) && ($lineCount == 0) ) { + $usey += $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; + } +/*-- CSS-IMAGE-FLOAT --*/ + // If float exists at this level + if (isset($this->floatmargins['R']) && $usey <= $this->floatmargins['R']['y1'] && $usey >= $this->floatmargins['R']['y0'] && !$this->floatmargins['R']['skipline']) { $fpaddingR += $this->floatmargins['R']['w']; } + if (isset($this->floatmargins['L']) && $usey <= $this->floatmargins['L']['y1'] && $usey >= $this->floatmargins['L']['y0'] && !$this->floatmargins['L']['skipline']) { $fpaddingL += $this->floatmargins['L']['w']; } +/*-- END CSS-IMAGE-FLOAT --*/ + } // *TABLES* + + //OBJECTS - IMAGES & FORM Elements (NB has already skipped line/page if required - in printbuffer) + if (substr($s,0,3) == "\xbb\xa4\xac") { //identifier has been identified! + $objattr = $this->_getObjAttr($s); + $h_corr = 0; + if ($is_table) { // *TABLES* + $maximumW = ($maxWidth/_MPDFK) - ($this->cellPaddingL + $this->cMarginL + $this->cellPaddingR + $this->cMarginR); // *TABLES* + } // *TABLES* + else { // *TABLES* + if (($newblock) && ($blockstate==1 || $blockstate==3) && ($lineCount == 0) && (!$is_table)) { $h_corr = $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; } + $maximumW = ($maxWidth/_MPDFK) - ($this->blk[$this->blklvl]['padding_left'] + $this->blk[$this->blklvl]['border_left']['w'] + $this->blk[$this->blklvl]['padding_right'] + $this->blk[$this->blklvl]['border_right']['w'] + $fpaddingL + $fpaddingR ); + } // *TABLES* + $objattr = $this->inlineObject($objattr['type'],$this->lMargin + $fpaddingL + ($contentWidth/_MPDFK),($this->y + $h_corr), $objattr, $this->lMargin,($contentWidth/_MPDFK),$maximumW,$lineHeight,true,$is_table); + + // SET LINEHEIGHT for this line ================ RESET AT END + $lineHeight = MAX($lineHeight,$objattr['OUTER-HEIGHT']); + $this->objectbuffer[count($content)-1] = $objattr; + // if (isset($objattr['vertical-align'])) { $valign = $objattr['vertical-align']; } + // else { $valign = ''; } + $contentWidth += ($objattr['OUTER-WIDTH'] * _MPDFK); + return; + } + + $lbw = $rbw = 0; // Border widths + if (!empty($this->spanborddet)) { + if (isset($this->spanborddet['L'])) $lbw = $this->spanborddet['L']['w']; + if (isset($this->spanborddet['R'])) $rbw = $this->spanborddet['R']['w']; + } + + if ($this->usingCoreFont) { + $tmp = strlen( $s ); + } + else { + $tmp = mb_strlen( $s, $this->mb_enc ); + } + + // for every character in the string + for ( $i = 0; $i < $tmp; $i++ ) { + // extract the current character + // get the width of the character in points + if ($this->usingCoreFont) { + $c = $s[$i]; + // Soft Hyphens chr(173) + $cw = ($this->GetCharWidthCore($c) * _MPDFK); + if ($this->kerning && $this->useKerning && $i > 0) { + if (isset($this->CurrentFont['kerninfo'][$s[($i-1)]][$c])) { + $cw += ($this->CurrentFont['kerninfo'][$s[($i-1)]][$c] * $this->FontSizePt / 1000 ); + } + } + } + else { + $c = mb_substr($s,$i,1,$this->mb_enc ); + $cw = ($this->GetCharWidthNonCore($c, false) * _MPDFK); + if ($this->kerning && $this->useKerning && $i > 0) { + $lastc = mb_substr($s,($i-1),1,$this->mb_enc ); + $ulastc = $this->UTF8StringToArray($lastc, false); + $uc = $this->UTF8StringToArray($c, false); + if (isset($this->CurrentFont['kerninfo'][$ulastc[0]][$uc[0]])) { + $cw += ($this->CurrentFont['kerninfo'][$ulastc[0]][$uc[0]] * $this->FontSizePt / 1000 ); + } + } + } + + if ($i==0) { + $cw += $lbw*_MPDFK; + $contentB[(count($contentB)-1)] .= 'L'; + } + if ($i==($tmp-1)) { + $cw += $rbw*_MPDFK; + $contentB[(count($contentB)-1)] .= 'R'; + } + // mPDF 5.6.45 + if ($c==' ') { + $currContent .= $c; + $cutoffWidth = $contentWidth; + $contentWidth += $cw; + continue; + } + + // ADDED for Paragraph_indent + $WidthCorrection = 0; + if (($newblock) && ($blockstate==1 || $blockstate==3) && isset($this->blk[$this->blklvl]['text_indent']) && ($lineCount == 0) && (!$is_table) && (!$is_list) && ($align != 'C')) { + $ti = $this->ConvertSize($this->blk[$this->blklvl]['text_indent'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + $WidthCorrection = ($ti*_MPDFK); + } + + // Added mPDF 3.0 Float DIV + $fpaddingR = 0; + $fpaddingL = 0; +/*-- CSS-FLOAT --*/ + if (count($this->floatDivs)) { + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl); + if ($r_exists) { $fpaddingR = $r_width; } + if ($l_exists) { $fpaddingL = $l_width; } + } +/*-- END CSS-FLOAT --*/ + + $usey = $this->y + 0.002; + if (($newblock) && ($blockstate==1 || $blockstate==3) && ($lineCount == 0) ) { + $usey += $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; + } + +/*-- CSS-IMAGE-FLOAT --*/ + // If float exists at this level + if (isset($this->floatmargins['R']) && $usey <= $this->floatmargins['R']['y1'] && $usey >= $this->floatmargins['R']['y0'] && !$this->floatmargins['R']['skipline']) { $fpaddingR += $this->floatmargins['R']['w']; } + if (isset($this->floatmargins['L']) && $usey <= $this->floatmargins['L']['y1'] && $usey >= $this->floatmargins['L']['y0'] && !$this->floatmargins['L']['skipline']) { $fpaddingL += $this->floatmargins['L']['w']; } +/*-- END CSS-IMAGE-FLOAT --*/ + + + + // try adding another char + if (( $contentWidth + $cw > $maxWidth - $WidthCorrection - (($this->cMarginL+$this->cMarginR)*_MPDFK) - ($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK) ) + 0.001)) {// 0.001 is to correct for deviations converting mm=>pts + // it won't fit, output what we already have + $lineCount++; + + // contains any content that didn't make it into this print + $savedContent = ''; + $savedContentB = ''; + $savedFont = array(); + $savedObj = array(); + // mPDF 5.6.20 + $savedPreContent = array(); + $savedPreContentB = array(); + $savedPreFont = array(); + + // cut off and save any partial words at the end of the string + $words = explode( ' ', $currContent ); + /////////////////// + // HYPHENATION + $currWord = $words[count($words)-1] ; + $success = false; + + // mPDF 5.6.21 Hard Hyphens - + $hardsuccess = false; + if ($this->textparam['hyphens'] != 2 && preg_match("/\-/",$currWord)) { + $rem = $maxWidth - $WidthCorrection - (($this->cMarginL+$this->cMarginR)*_MPDFK) - ($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK) ); + list($hardsuccess,$pre,$post,$prelength) = $this->hardHyphenate($currWord, (($rem-$cutoffWidth)/_MPDFK -$this->GetCharWidth("-", false)) ); + if ($hardsuccess) { + $already = array_pop( $words ); + $forward = mb_substr($already,$prelength+1,mb_strlen($already, $this->mb_enc), $this->mb_enc); + $words[] = $pre.'-'; + $words[] = $forward; + $currContent = mb_substr($currContent,0,mb_strlen($currContent, $this->mb_enc)+1-mb_strlen($post, $this->mb_enc), $this->mb_enc) . '-'; + } + } + +/*-- HYPHENATION --*/ + // Soft Hyphens chr(173) + else if ($this->textparam['hyphens'] != 2 && (!$this->usingCoreFont && preg_match("/\xc2\xad/",$currWord)) || ($this->usingCoreFont && preg_match("/".chr(173)."/",$currWord) && ($this->FontFamily!='csymbol' && $this->FontFamily!='czapfdingbats')) ) { // mPDF 5.6.06 + $rem = $maxWidth - $WidthCorrection - (($this->cMarginL+$this->cMarginR)*_MPDFK) - ($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK) ); + list($success,$pre,$post,$prelength) = $this->softHyphenate($currWord, (($rem-$cutoffWidth)/_MPDFK -$this->GetCharWidth(" ", false)) ); + } + + if (!$success && !$hardsuccess && $this->textparam['hyphens'] == 1 ) { // mPDF 5.6.06 // mPDF 5.6.21 + // Look ahead to get current word + for($ac = $i; $ac<(mb_strlen($s)-1); $ac++) { + $addc = mb_substr($s,$ac,1,$this->mb_enc ); + if ($addc == ' ') { break; } + $currWord .= $addc; + } + $rem = $maxWidth - $WidthCorrection - (($this->cMarginL+$this->cMarginR)*_MPDFK) - ($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK) ); + list($success,$pre,$post,$prelength) = $this->hyphenateWord($currWord, (($rem-$cutoffWidth)/_MPDFK -$this->GetCharWidth(" ", false)) ); + } + if ($success) { + $already = array_pop( $words ); + $forward = mb_substr($already,$prelength,mb_strlen($already, $this->mb_enc), $this->mb_enc); + $words[] = $pre.'-'; + $words[] = $forward; + $currContent = mb_substr($currContent,0,mb_strlen($currContent, $this->mb_enc)+1-mb_strlen($post, $this->mb_enc), $this->mb_enc) . '-'; + } +/*-- END HYPHENATION --*/ + + // mPDF 5.6.13 Decimal alignment (cancel if wraps to > 1 line) + if ($is_table && substr($align,0,1)=='D' ) { $align=substr($align,2,1); } + +/*-- CJK-FONTS --*/ + // mPDF 5.6.42 + if ($this->checkCJK) { + $lastchar = mb_substr($words[(count($words)-1)],mb_strlen($words[(count($words)-1)], $this->mb_enc)-1, 1, $this->mb_enc); + } + // Next character is suitable to add as overhanging or squeezed punctuation + if ($this->checkCJK && preg_match("/[".$this->CJKoverflow."]/u", $c) && $this->allowCJKorphans && !$CJKoverflow) { + // add character onto this line + $currContent .= $c; + $cutoffWidth = $contentWidth; + $contentWidth += $cw; + $CJKoverflow = true; + continue; + } + // Last character that fits is not allowed to end a line - move lastchar(s) to start of next line + else if ($this->checkCJK && preg_match("/[".$this->CJKleading."]/u", $lastchar)) { + //move lastchar(s) to next line + $m0 = $lastchar; + $m1 = $c; + while(preg_match("/[".$this->CJKleading."]/u", $m0) && mb_strlen($words[(count($words)-1)], $this->mb_enc)>2) { + // trim last letter off word[0] + $words[(count($words)-1)] = mb_substr($words[(count($words)-1)],0,mb_strlen($words[(count($words)-1)], $this->mb_enc)-1, $this->mb_enc); + // and add it to savedContent for next line + $savedContent = $m0.$savedContent; + $m1 = $lastchar; + $lastchar = mb_substr($words[(count($words)-1)],mb_strlen($words[(count($words)-1)], $this->mb_enc)-1, 1, $this->mb_enc); + $m0 = $lastchar; + } + $lastContent = ''; + for ( $w = 0; $w < count( $words ) ; $w++) { $lastContent .= $words[ $w ]." "; } + $savedFont = $this->saveFont(); + // replace the current content with the cropped version + $currContent = rtrim( $lastContent ); + } + // Next character is not allowed to start a new line + else if ($this->checkCJK && preg_match("/[".$this->CJKfollowing."]/u", $c)) { + // try squeezing another character(s) onto this line = Oikomi + if ($this->allowCJKorphans && !$CJKoverflow) { // mPDF 5.6.40 + $lookahead = mb_substr($s,$i+1,1,$this->mb_enc ); + //if lookahead is not another following char + if (!$lookahead || ($lookahead && !preg_match("/[".$this->CJKfollowing."]/u", $lookahead))) { + $currContent .= $c; + $cutoffWidth = $contentWidth; + $contentWidth += $cw; + if ($this->allowCJKoverflow && preg_match("/[".$this->CJKoverflow."]/u", $c)) { $CJKoverflow = true; } + continue; + } + } + // or move lastchar(s) to next line to keep $c company = Oidashi + $m0 = $lastchar; + $m1 = $c; + while(preg_match("/[".$this->CJKfollowing."]/u", $m1) && mb_strlen($words[(count($words)-1)], $this->mb_enc)>2) { + // trim last letter off word[0] + $words[(count($words)-1)] = mb_substr($words[(count($words)-1)],0,mb_strlen($words[(count($words)-1)], $this->mb_enc)-1, $this->mb_enc); + // and add it to savedContent for next line + $savedContent = $m0.$savedContent; + $m1 = $lastchar; + $lastchar = mb_substr($words[(count($words)-1)],mb_strlen($words[(count($words)-1)], $this->mb_enc)-1, 1, $this->mb_enc); + $m0 = $lastchar; + } + $lastContent = ''; + for ( $w = 0; $w < count( $words ) ; $w++) { $lastContent .= $words[ $w ]." "; } + $savedFont = $this->saveFont(); + // replace the current content with the cropped version + $currContent = rtrim( $lastContent ); + } + // mPDF 5.6.42 + else if ($this->checkCJK && preg_match("/([".$this->pregCJKchars."]+[0-9\x{ff10}-\x{ff19}]+$)/u", $words[0])) { + $lookahead = mb_substr($s,$i,16,$this->mb_enc ); + //and if lookahead starts with a few numerals + if ($lookahead && (preg_match("/^([0-9\x{ff10}-\x{ff19}]+[".$this->pregCJKchars."]+)/u", $lookahead) || preg_match("/^([0-9\x{ff10}-\x{ff19}]+$)/u", $lookahead)) ) { + // or move lastchar(s) to next line to keep numerals together + $m0 = $lastchar; + while(preg_match("/[0-9\x{ff10}-\x{ff19}]/u", $m0) && mb_strlen($words[(count($words)-1)], $this->mb_enc)>2) { + // trim last letter off word[0] + $words[(count($words)-1)] = mb_substr($words[(count($words)-1)],0,mb_strlen($words[(count($words)-1)], $this->mb_enc)-1, $this->mb_enc); + // and add it to savedContent for next line + $savedContent = $m0.$savedContent; + $lastchar = mb_substr($words[(count($words)-1)],mb_strlen($words[(count($words)-1)], $this->mb_enc)-1, 1, $this->mb_enc); + $m0 = $lastchar; + } + } + $lastContent = ''; + for ( $w = 0; $w < count( $words ) ; $w++) { $lastContent .= $words[ $w ]." "; } + $savedFont = $this->saveFont(); + // replace the current content with the cropped version + $currContent = rtrim( $lastContent ); + } + else +/*-- END CJK-FONTS --*/ + // if it looks like we didn't finish any words for this chunk + if ( count( $words ) == 1 ) { + // TO correct for error when word too wide for page - but only when one long word from left to right margin + if (count($content) == 1 && $currContent != ' ') { + $lastchar = mb_substr($words[0],mb_strlen($words[0], $this->mb_enc)-1, 1, $this->mb_enc); + $lastContent = $words[0]; + $savedFont = $this->saveFont(); + // replace the current content with the cropped version + $currContent = rtrim( $lastContent ); + } + // mPDF 5.6.20 + else if ( count($content)>1 + && (!isset($this->objectbuffer[(count($content)-1)]) && !isset($this->objectbuffer[(count($content)-2)])) + && substr($content[count($content)-2],-1,1) != ' ' + && substr($currContent,0,1) != ' ' + ) { + // Go back to find a space in a previous chunk of content + $found = false; + for ($ix=count($content)-1;$ix>=0;$ix--) { + // mPDF 5.6.29 + if ($this->usingCoreFont && preg_match('/[ '.chr(173).']/',$content[$ix],$m)) { $match = $m[0]; $found = $ix; break; } + else if (!$this->usingCoreFont) { + if (preg_match('/[ ]/',$content[$ix])) { $match = ' '; $found = $ix; break; } + else if (preg_match('/[\x{00AD}]/u',$content[$ix])) { + // even though it is UTF-8 replace it temporarily with chr(173) + $content[$ix] = preg_replace('/[\x{00AD}]/u',chr(173),$content[$ix]); + $match = chr(173); $found = $ix; break; + } + } + } + if ($found !== false) { + $charpos = strrpos($content[$found],$match); // mPDF 5.6.29 + for ($ix=count($content)-1;$ix>$found;$ix--) { + // save and crop off any subsequent chunks + $savedPreContent[] = array_pop($content); + $savedPreContentB[] = array_pop($contentB); + $savedPreFont[] = array_pop($font); + } + if (substr($content[count($content)-1],$charpos+1,strlen($content[count($content)-1])-1) != '') { + $savedPreContent[] = substr($content[count($content)-1],$charpos+1,strlen($content[count($content)-1])-1); + $savedPreContentB[] = preg_replace('/L/','',$contentB[count($content)-1]); // ??? + $savedPreFont[] = $font[count($content)-1]; + } + $savedContent = ''; + $savedContentB = ''; + $savedFont = array(); + + $currContent =& $content[ count( $content ) - 1 ]; + $currContent = substr($currContent,0,$charpos); + if ($match == chr(173)) { $currContent .= '-'; } // mPDF 5.6.29 + if (strpos($contentB[(count($contentB)-1)],'R')!==false) { // ??? + $contentB[count($content)-1] = preg_replace('/R/','',$contentB[count($content)-1]); // ??? + } + + $currContent = rtrim( $currContent ); + } + else { + $savedContent = array_pop( $content ); + $savedContentB = array_pop($contentB); + $savedFont = array_pop( $font ); + $currContent =& $content[ count( $content ) - 1 ]; + $currContent = rtrim( $currContent ); + } + } + else { + // save and crop off the content currently on the stack + $savedContent = array_pop( $content ); + $savedContentB = array_pop($contentB); // mPDF 5.6.20 + $savedFont = array_pop( $font ); + // trim any trailing spaces off the last bit of content + $currContent =& $content[ count( $content ) - 1 ]; + $currContent = rtrim( $currContent ); + } + } + else { // otherwise, we need to find which bit to cut off + $lastContent = ''; + for ( $w = 0; $w < count( $words ) - 1; $w++) { $lastContent .= $words[ $w ]." "; } + $savedContent = $words[ count( $words ) - 1 ]; + $savedFont = $this->saveFont(); + // replace the current content with the cropped version + $currContent = rtrim( $lastContent ); + } + // CJK - strip CJK space at end of line + // &#x3000; = \xe3\x80\x80 = CJK space + if ($this->checkCJK) { $currContent = preg_replace("/\xe3\x80\x80$/",'',$currContent) ; } // *CJK-FONTS* + + + if (isset($this->objectbuffer[(count($content)-1)]) && $this->objectbuffer[(count($content)-1)]['type']=='dottab') { + $savedObj = array_pop( $this->objectbuffer ); + $contentWidth -= ($this->objectbuffer[(count($content)-1)]['OUTER-WIDTH'] * _MPDFK); + } + + // Set Current lineheight (correction factor) + $lhfixed = false; +/*-- LISTS --*/ + if ($is_list) { + if (preg_match('/([0-9.,]+)mm/',$this->list_lineheight[$this->listlvl][$this->listOcc],$am)) { + $lhfixed = true; + $def_fontsize = $this->InlineProperties['LISTITEM'][$this->listlvl][$this->listOcc][$this->listnum]['size']; + $this->lineheight_correction = $am[1] / $def_fontsize ; + } + else { + $this->lineheight_correction = $this->list_lineheight[$this->listlvl][$this->listOcc]; + } + } + else +/*-- END LISTS --*/ +/*-- TABLES --*/ + if ($is_table) { + if (preg_match('/([0-9.,]+)mm/',$this->table_lineheight,$am)) { + $lhfixed = true; + $def_fontsize = $this->FontSize; // needs to be default font-size for block **** + $this->lineheight_correction = $lineHeight / $def_fontsize ; + } + else { + $this->lineheight_correction = $this->table_lineheight; + } + } + else +/*-- END TABLES --*/ + if (isset($this->blk[$this->blklvl]['line_height']) && $this->blk[$this->blklvl]['line_height']) { + if (preg_match('/([0-9.,]+)mm/',$this->blk[$this->blklvl]['line_height'],$am)) { + $lhfixed = true; + $def_fontsize = $this->blk[$this->blklvl]['InlineProperties']['size']; // needs to be default font-size for block **** + $this->lineheight_correction = $am[1] / $def_fontsize ; + } + else { + $this->lineheight_correction = $this->blk[$this->blklvl]['line_height']; + } + } + else { + $this->lineheight_correction = $this->normalLineheight; + } + // update $contentWidth and $cutoffWidth since they changed with cropping + // Also correct lineheight to maximum fontsize (not for tables) + $contentWidth = 0; + // correct lineheight to maximum fontsize + if ($lhfixed) { $maxlineHeight = $this->lineheight; } + else { $maxlineHeight = 0; } + $this->forceExactLineheight = true; + $maxfontsize = 0; + // While we're at it, check for cursive text + $checkCursive=false; + if ($this->biDirectional) { $checkCursive=true; } // *RTL* + foreach ( $content as $k => $chunk ) + { + $this->restoreFont( $font[ $k ]); + if (!isset($this->objectbuffer[$k])) { + // mPDF 5.6.40 + if ($this->checkCJK && $k == count($content)-1 && $CJKoverflow && $align=='J' && $this->allowCJKoverflow && $this->CJKforceend) { + // force-end overhang + $hanger = mb_substr($chunk,mb_strlen($chunk,$this->mb_enc)-1,1,$this->mb_enc ); + $content[$k] = $chunk = mb_substr($chunk,0,mb_strlen($chunk,$this->mb_enc)-1,$this->mb_enc ); + } + if (!$this->usingCoreFont) { + $content[$k] = $chunk = str_replace("\xc2\xad",'',$chunk ); + if (isset($this->CurrentFont['indic']) && $this->CurrentFont['indic']) { $checkCursive=true; } // *INDIC* + } + // Soft Hyphens chr(173) + else if ($this->FontFamily!='csymbol' && $this->FontFamily!='czapfdingbats') { + $content[$k] = $chunk = str_replace(chr(173),'',$chunk ); + } + $contentWidth += $this->GetStringWidth( $chunk ) * _MPDFK; + if (!empty($this->spanborddet)) { + if (strpos($contentB[$k],'L')!==false) $contentWidth += $this->spanborddet['L']['w'] * _MPDFK; + if (strpos($contentB[$k],'R')!==false) $contentWidth += $this->spanborddet['R']['w'] * _MPDFK; + } + if (!$lhfixed) { $maxlineHeight = max($maxlineHeight,$this->FontSize * $this->lineheight_correction ); } + if ($lhfixed && ($this->FontSize > $def_fontsize || ($this->FontSize > ($lineHeight * $this->lineheight_correction) && $is_list))) { + $this->forceExactLineheight = false; + } + $maxfontsize = max($maxfontsize,$this->FontSize); + } + } + + $lastfontreqstyle = $font[count($font)-1]['ReqFontStyle']; + $lastfontstyle = $font[count($font)-1]['style']; + if ($blockdir == 'ltr' && strpos($lastfontreqstyle,"I") !== false && strpos($lastfontstyle,"I") === false) { // Artificial italic + $lastitalic = $this->FontSize*0.15*_MPDFK; + } + else { $lastitalic = 0; } + + +/*-- LISTS --*/ + if ($is_list && is_array($this->bulletarray) && $this->bulletarray) { + $actfs = $this->bulletarray['fontsize']; + if (!$lhfixed) { $maxlineHeight = max($maxlineHeight,$actfs * $this->lineheight_correction ); } + if ($lhfixed && $actfs > $def_fontsize) { $this->forceExactLineheight = false; } + $maxfontsize = max($maxfontsize,$actfs); + } +/*-- END LISTS --*/ + + // when every text item checked i.e. $maxfontsize is set properly + + $af = 0; // Above font + $bf = 0; // Below font + $mta = 0; // Maximum top-aligned + $mba = 0; // Maximum bottom-aligned + + foreach ( $content as $k => $chunk ) { + if (isset($this->objectbuffer[$k]) && $this->objectbuffer[$k]) { + $contentWidth += $this->objectbuffer[$k]['OUTER-WIDTH'] * _MPDFK; + $oh = $this->objectbuffer[$k]['OUTER-HEIGHT']; + $va = $this->objectbuffer[$k]['vertical-align']; // = $objattr['vertical-align'] = set as M,T,B,S + if ($lhfixed && $oh > $def_fontsize) { $this->forceExactLineheight = false; } + + if ($va == 'BS') { // (BASELINE default) + $af = max($af, ($oh - ($maxfontsize * (0.5 + $this->baselineC)))); + } + else if ($va == 'M') { + $af = max($af, ($oh - $maxfontsize)/2); + $bf = max($bf, ($oh - $maxfontsize)/2); + } + else if ($va == 'TT') { + $bf = max($bf, ($oh - $maxfontsize)); + } + else if ($va == 'TB') { + $af = max($af, ($oh - $maxfontsize)); + } + else if ($va == 'T') { + $mta = max($mta, $oh); + } + else if ($va == 'B') { + $mba = max($mba, $oh); + } + } + } + if ((!$lhfixed || !$this->forceExactLineheight) && ($af > (($maxlineHeight - $maxfontsize)/2) || $bf > (($maxlineHeight - $maxfontsize)/2))) { + $maxlineHeight = $maxfontsize + $af + $bf; + } + else if (!$lhfixed) { $af = $bf = ($maxlineHeight - $maxfontsize)/2; } + + if ($mta > $maxlineHeight) { + $bf += ($mta - $maxlineHeight); + $maxlineHeight = $mta; + } + if ($mba > $maxlineHeight) { + $af += ($mba - $maxlineHeight); + $maxlineHeight = $mba; + } + + + $lineHeight = $maxlineHeight; + $cutoffWidth = $contentWidth; + // If NOT images, and maxfontsize NOT > lineHeight - this value determines text baseline positioning + if ($lhfixed && $af==0 && $bf==0 && $maxfontsize<=($def_fontsize * $this->lineheight_correction * 0.8 )) { + $this->linemaxfontsize = $def_fontsize; + } + else { $this->linemaxfontsize = $maxfontsize; } + + + $inclCursive=false; + foreach ( $content as $k => $chunk ) { + if (!isset($this->objectbuffer[$k]) || (isset($this->objectbuffer[$k]) && !$this->objectbuffer[$k])) { + if ($this->usingCoreFont) { + $content[$k] = str_replace(chr(160),chr(32),$chunk ); + } + else { + $content[$k] = str_replace(chr(194).chr(160),chr(32),$chunk ); + if ($checkCursive) { + if (preg_match("/([".$this->pregRTLchars."])/u", $chunk)) { $inclCursive = true; } // *RTL* + if (preg_match("/([".$this->pregHIchars.$this->pregBNchars.$this->pregPAchars."])/u", $chunk)) { $inclCursive = true; } // *INDIC* + } + } + } + } + + // JUSTIFICATION J + $jcharspacing = 0; + $jws = 0; + $nb_carac = 0; + $nb_spaces = 0; + // if it's justified, we need to find the char/word spacing (or if orphans have allowed length of line to go over the maxwidth) + if ( ($align == 'J' && !$CJKoverflow) || (($cutoffWidth + $lastitalic > $maxWidth - $WidthCorrection - (($this->cMarginL+$this->cMarginR)*_MPDFK) - ($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK) ) + 0.001) && (!$CJKoverflow || ($CJKoverflow && !$this->allowCJKoverflow))) || $CJKoverflow && $align=='J' && $this->allowCJKoverflow && $hanger && $this->CJKforceend) { // 0.001 is to correct for deviations converting mm=>pts // mPDF 5.6.40 + // JUSTIFY J (Use character spacing) + // WORD SPACING + foreach ( $content as $k => $chunk ) { + if (!isset($this->objectbuffer[$k]) || (isset($this->objectbuffer[$k]) && !$this->objectbuffer[$k])) { + $nb_carac += mb_strlen( $chunk, $this->mb_enc ) ; + $nb_spaces += mb_substr_count( $chunk,' ', $this->mb_enc ) ; + } + } + list($jcharspacing,$jws) = $this->GetJspacing($nb_carac,$nb_spaces,($maxWidth-$lastitalic-$cutoffWidth-$WidthCorrection-(($this->cMarginL+$this->cMarginR)*_MPDFK)-($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK) )),$inclCursive); + } + + + // WORD SPACING + $empty = $maxWidth - $lastitalic-$WidthCorrection - $contentWidth - (($this->cMarginL+$this->cMarginR)* _MPDFK) - ($paddingL+$paddingR +(($fpaddingL + $fpaddingR) * _MPDFK) ); + + $empty -= ($jcharspacing * $nb_carac); + $empty -= ($jws * $nb_spaces); + + $empty /= _MPDFK; + $b = ''; //do not use borders + // Get PAGEBREAK TO TEST for height including the top border/padding + $check_h = max($this->divheight,$lineHeight); + if (($newblock) && ($blockstate==1 || $blockstate==3) && ($this->blklvl > 0) && ($lineCount == 1) && (!$is_table) && (!$is_list)) { + $check_h += ($this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['border_top']['w']); + } + + if ($this->ColActive && $check_h > ($this->PageBreakTrigger - $this->y0)) { + $this->SetCol($this->NbCol-1); + } + + // PAGEBREAK + // 'If' below used in order to fix "first-line of other page with justify on" bug + if(!$is_table && ($this->y+$check_h) > $this->PageBreakTrigger and !$this->InFooter and $this->AcceptPageBreak()) { + $bak_x=$this->x;//Current X position + + // WORD SPACING + $ws=$this->ws;//Word Spacing + $charspacing=$this->charspacing;//Character Spacing + $this->ResetSpacing(); + + $this->AddPage($this->CurOrientation); + + $this->x = $bak_x; + // Added to correct for OddEven Margins + $currentx += $this->MarginCorrection; + $this->x += $this->MarginCorrection; + + // WORD SPACING + $this->SetSpacing($charspacing,$ws); + } + + if ($this->keep_block_together && !$is_table && $this->kt_p00 < $this->page && ($this->y+$check_h) > $this->kt_y00) { + $this->printdivbuffer(); + $this->keep_block_together = 0; + } + + +/*-- COLUMNS --*/ + // COLS + // COLUMN CHANGE + if ($this->CurrCol != $oldcolumn) { + $currentx += $this->ChangeColumn * ($this->ColWidth+$this->ColGap); + $this->x += $this->ChangeColumn * ($this->ColWidth+$this->ColGap); + $oldcolumn = $this->CurrCol; + } + + if ($this->ColActive && !$is_table) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* +/*-- END COLUMNS --*/ + + // TOP MARGIN + if (($newblock) && ($blockstate==1 || $blockstate==3) && ($this->blk[$this->blklvl]['margin_top']) && ($lineCount == 1) && (!$is_table) && (!$is_list)) { + $this->DivLn($this->blk[$this->blklvl]['margin_top'],$this->blklvl-1,true,$this->blk[$this->blklvl]['margin_collapse']); + if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + } + + + // Update y0 for top of block (used to paint border) + if (($newblock) && ($blockstate==1 || $blockstate==3) && ($lineCount == 1) && (!$is_table) && (!$is_list)) { + $this->blk[$this->blklvl]['y0'] = $this->y; + $this->blk[$this->blklvl]['startpage'] = $this->page; + if ($this->blk[$this->blklvl]['float']) { $this->blk[$this->blklvl]['float_start_y'] = $this->y; } // mPDF 5.6.63 + } + + // TOP PADDING and BORDER spacing/fill + if (($newblock) && ($blockstate==1 || $blockstate==3) && (($this->blk[$this->blklvl]['padding_top']) || ($this->blk[$this->blklvl]['border_top'])) && ($lineCount == 1) && (!$is_table) && (!$is_list)) { + // $state = 0 normal; 1 top; 2 bottom; 3 top and bottom + $this->DivLn($this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w'],-3,true,false,1); + if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + } + + $arraysize = count($content); + + $margins = ($this->cMarginL+$this->cMarginR) + ($ipaddingL+$ipaddingR + $fpaddingR + $fpaddingR ); + + // PAINT BACKGROUND FOR THIS LINE + if (!$is_table) { $this->DivLn($lineHeight,$this->blklvl,false); } // false -> don't advance y + + $this->x = $currentx + $this->cMarginL + $ipaddingL + $fpaddingL ; + if ($align == 'R') { $this->x += $empty; } + else if ($align == 'C') { $this->x += ($empty / 2); } + + // Paragraph INDENT + if (isset($this->blk[$this->blklvl]['text_indent']) && ($newblock) && ($blockstate==1 || $blockstate==3) && ($lineCount == 1) && (!$is_table) && ($blockdir !='rtl') && ($align !='C')) { + $ti = $this->ConvertSize($this->blk[$this->blklvl]['text_indent'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + $this->x += $ti; + } + + // DIRECTIONALITY RTL + $all_rtl = false; + $contains_rtl = false; +/*-- RTL --*/ + if ($blockdir == 'rtl' || $this->biDirectional) { + $all_rtl = true; + foreach ( $content as $k => $chunk ) { + $reversed = $this->magic_reverse_dir($chunk, false, $blockdir); + + if ($reversed > 0) { $contains_rtl = true; } + if ($reversed < 2) { $all_rtl = false; } + $content[$k] = $chunk; + } + if (($blockdir =='rtl' && $contains_rtl) || $all_rtl) { + $content = array_reverse($content,false); + $contentB = array_reverse($contentB,false); + } + } +/*-- END RTL --*/ + + foreach ( $content as $k => $chunk ) { + + // FOR IMAGES - UPDATE POSITION + if (($blockdir =='rtl' && $contains_rtl) || $all_rtl) { $dirk = $arraysize-1 - $k ; } else { $dirk = $k; } + + $va = 'M'; // default for text + if (isset($this->objectbuffer[$dirk]) && $this->objectbuffer[$dirk]) { + $xadj = $this->x - $this->objectbuffer[$dirk]['OUTER-X'] ; + $this->objectbuffer[$dirk]['OUTER-X'] += $xadj; + $this->objectbuffer[$dirk]['BORDER-X'] += $xadj; + $this->objectbuffer[$dirk]['INNER-X'] += $xadj; + $va = $this->objectbuffer[$dirk]['vertical-align']; + $yadj = $this->y - $this->objectbuffer[$dirk]['OUTER-Y']; + if ($va == 'BS') { + $yadj += $af + ($this->linemaxfontsize * (0.5 + $this->baselineC)) - $this->objectbuffer[$dirk]['OUTER-HEIGHT']; + } + else if ($va == 'M' || $va == '') { + $yadj += $af + ($this->linemaxfontsize /2) - ($this->objectbuffer[$dirk]['OUTER-HEIGHT']/2); + } + else if ($va == 'TB') { + $yadj += $af + $this->linemaxfontsize - $this->objectbuffer[$dirk]['OUTER-HEIGHT']; + } + else if ($va == 'TT') { + $yadj += $af; + } + else if ($va == 'B') { + $yadj += $af + $this->linemaxfontsize + $bf - $this->objectbuffer[$dirk]['OUTER-HEIGHT']; + } + else if ($va == 'T') { + $yadj += 0; + } + $this->objectbuffer[$dirk]['OUTER-Y'] += $yadj; + $this->objectbuffer[$dirk]['BORDER-Y'] += $yadj; + $this->objectbuffer[$dirk]['INNER-Y'] += $yadj; + } + + // DIRECTIONALITY RTL + if ((($blockdir == 'rtl') && ($contains_rtl )) || ($all_rtl )) { $this->restoreFont($font[$arraysize-1 - $k]); } + else { $this->restoreFont( $font[ $k ] ); } + + $this->SetSpacing(($this->fixedlSpacing*_MPDFK)+$jcharspacing,($this->fixedlSpacing+$this->minwSpacing)*_MPDFK+$jws); + // Now unset these values so they don't influence GetStringwidth below or in fn. Cell + $this->fixedlSpacing = false; + $this->minwSpacing = 0; + + // mPDF 5.6.26 + $save_vis = $this->visibility; + if (isset($this->textparam['visibility']) && $this->textparam['visibility'] && $this->textparam['visibility'] != $this->visibility) { + $this->SetVisibility($this->textparam['visibility']); + } + // *********** SPAN BACKGROUND COLOR ***************** // + if ($this->spanbgcolor) { + $cor = $this->spanbgcolorarray; + $this->SetFColor($cor); + $save_fill = $fill; $spanfill = 1; $fill = 1; + } + if (!empty($this->spanborddet)) { + if (strpos($contentB[$k],'L')!==false) $this->x += $this->spanborddet['L']['w']; + if (strpos($contentB[$k],'L')===false) $this->spanborddet['L']['s'] = $this->spanborddet['L']['w'] = 0; + if (strpos($contentB[$k],'R')===false) $this->spanborddet['R']['s'] = $this->spanborddet['R']['w'] = 0; + } + + // WORD SPACING + $stringWidth = $this->GetStringWidth($chunk ); + $stringWidth += ( $this->charspacing * mb_strlen($chunk,$this->mb_enc ) / _MPDFK ); + $stringWidth += ( $this->ws * mb_substr_count($chunk,' ',$this->mb_enc ) / _MPDFK ); + if (isset($this->objectbuffer[$dirk])) { $stringWidth = $this->objectbuffer[$dirk]['OUTER-WIDTH']; } + + if ($stringWidth==0) { $stringWidth = 0.000001; } + if ($k == $arraysize-1) { + $stringWidth -= ( $this->charspacing / _MPDFK ); + // mPDF 5.6.40 + if ($this->checkCJK && $CJKoverflow && $align=='J' && $this->allowCJKoverflow && $hanger && $this->CJKforceend) { + // force-end overhang + $this->Cell( $stringWidth, $lineHeight, $chunk, '', 0, '', $fill, $this->HREF, $currentx,0,0,'M', $fill, $af, $bf, true ); + $this->Cell( $this->GetStringWidth($hanger), $lineHeight, $hanger, '', 1, '', $fill, $this->HREF, $currentx,0,0,'M', $fill, $af, $bf, true ); + } + else { + $this->Cell( $stringWidth, $lineHeight, $chunk, '', 1, '', $fill, $this->HREF, $currentx,0,0,'M', $fill, $af, $bf, true ); //mono-style line or last part (skips line) + } + + } + else $this->Cell( $stringWidth, $lineHeight, $chunk, '', 0, '', $fill, $this->HREF, 0, 0,0,'M', $fill, $af, $bf, true );//first or middle part + + if (!empty($this->spanborddet)) { + if (strpos($contentB[$k],'R')!==false && $k != $arraysize-1) $this->x += $this->spanborddet['R']['w']; + } + // *********** SPAN BACKGROUND COLOR OFF - RESET BLOCK BGCOLOR ***************** // + if (isset($spanfill) && $spanfill) { + $fill = $save_fill; $spanfill = 0; + if ($fill) { $this->SetFColor($bcor); } + } + // mPDF 5.6.26 + if (isset($this->textparam['visibility']) && $this->textparam['visibility'] && $this->visibility != $save_vis) { + $this->SetVisibility($save_vis); + } + + } + if (!$is_table) { + $this->maxPosR = max($this->maxPosR , ($this->w - $this->rMargin - $this->blk[$this->blklvl]['outer_right_margin'])); + $this->maxPosL = min($this->maxPosL , ($this->lMargin + $this->blk[$this->blklvl]['outer_left_margin'])); + } + + // move on to the next line, reset variables, tack on saved content and current char + + $this->printobjectbuffer($is_table, $blockdir); + $this->objectbuffer = array(); + +/*-- LISTS --*/ + // LIST BULLETS/NUMBERS + if ($is_list && is_array($this->bulletarray) && ($lineCount == 1) ) { + + $this->ResetSpacing(); + + $bull = $this->bulletarray; + if (isset($bull['level']) && isset($bull['occur']) && isset($this->InlineProperties['LIST'][$bull['level']][$bull['occur']])) { + $this->restoreInlineProperties($this->InlineProperties['LIST'][$bull['level']][$bull['occur']]); + } + if (isset($bull['level']) && isset($bull['occur']) && isset($bull['num']) && isset($this->InlineProperties['LISTITEM'][$bull['level']][$bull['occur']][$bull['num']]) && $this->InlineProperties['LISTITEM'][$bull['level']][$bull['occur']][$bull['num']]) { $this->restoreInlineProperties($this->InlineProperties['LISTITEM'][$bull['level']][$bull['occur']][$bull['num']]); } + if (isset($bull['font']) && $bull['font'] == 'czapfdingbats') { + $this->bullet = true; + $this->SetFont('czapfdingbats','',$this->FontSizePt/2.5); + } + else { $this->SetFont($this->FontFamily,$this->FontStyle,$this->FontSizePt,true,true); } // force output + //Output bullet + $this->x = $currentx; + if (isset($bull['x'])) { $this->x += $bull['x']; } + $this->y -= $lineHeight; + if (isset($bull['col']) && $bull['col']) { $this->SetTColor($bull['col']); } // mPDF 5.6.67 + if (isset($bull['txt'])) { $this->Cell($bull['w'], $lineHeight,$bull['txt'],'','',$bull['align'],0,'',0,-$this->cMarginL, -$this->cMarginR ); } + if (isset($bull['font']) && $bull['font'] == 'czapfdingbats') { + $this->bullet = false; + } + $this->x = $currentx; // Reset + $this->y += $lineHeight; + + if ($this->ColActive && !$is_table) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + + $this->bulletarray = array(); // prevents repeat of bullet/number if <li>....<br />.....</li> + } +/*-- END LISTS --*/ + + +/*-- CSS-IMAGE-FLOAT --*/ + // Update values if set to skipline + if ($this->floatmargins) { $this->_advanceFloatMargins(); } +/*-- END CSS-IMAGE-FLOAT --*/ + + // Reset lineheight + $lineHeight = $this->divheight; + $valign = 'M'; + + $font = array(); + $content = array(); + $contentB = array(); + $contentWidth = 0; + if (!empty($savedObj)) { + $this->objectbuffer[] = $savedObj; + $font[] = $savedFont; + $content[] = ''; + $contentB[] = ''; + $contentWidth += $savedObj['OUTER-WIDTH'] * _MPDFK; + } + // mPDF 5.6.20 + if (count($savedPreContent) > 0) { + for($ix=count($savedPreContent)-1;$ix>=0;$ix--) { + $font[] = $savedPreFont[$ix]; + $content[] = $savedPreContent[$ix]; + $contentB[] = $savedPreContentB[$ix]; + $this->restoreFont( $savedPreFont[$ix] ); + $lbw = $rbw = 0; // Border widths + if (!empty($this->spanborddet)) { + $lbw = $this->spanborddet['L']['w']; + $rbw = $this->spanborddet['R']['w']; + } + if ($ix>0) { + $contentWidth += $this->GetStringWidth( $savedPreContent[$ix] ) * _MPDFK; + if (strpos($savedPreContentB[$ix],'L')!==false) $contentWidth += $lbw; + if (strpos($savedPreContentB[$ix],'R')!==false) $contentWidth += $rbw; + } + } + $savedPreContent = array(); + $savedPreContentB = array(); + $savedPreFont = array(); + $content[ (count($content)-1) ] .= $c; + } + else { + $font[] = $savedFont; + $content[] = $savedContent . $c; + $contentB[] = $savedContentB ; + } + + $currContent =& $content[ (count($content)-1) ]; + + // CJK - strip CJK space at end of line + // &#x3000; = \xe3\x80\x80 = CJK space + if ($this->checkCJK && $currContent == "\xe3\x80\x80") { $currContent = '' ; } // *CJK-FONTS* + + $this->restoreFont( $savedFont ); + $lbw = $rbw = 0; // Border widths + if (!empty($this->spanborddet)) { + $lbw = $this->spanborddet['L']['w']; + $rbw = $this->spanborddet['R']['w']; + } + $contentWidth += $this->GetStringWidth( $currContent ) * _MPDFK; + if (strpos($savedContentB,'L')!==false) $contentWidth += $lbw; + $cutoffWidth = $contentWidth; + $CJKoverflow = false; + $hanger = ''; // mPDF 5.6.40 + } + // another character will fit, so add it on + else { + $contentWidth += $cw; + $currContent .= $c; + } + } + unset($content); + unset($contentB); +} +//----------------------END OF FLOWING BLOCK------------------------------------// + + +/*-- CSS-IMAGE-FLOAT --*/ +// Update values if set to skipline +function _advanceFloatMargins() { + // Update floatmargins - L + if (isset($this->floatmargins['L']) && $this->floatmargins['L']['skipline'] && $this->floatmargins['L']['y0'] != $this->y) { + $yadj = $this->y - $this->floatmargins['L']['y0']; + $this->floatmargins['L']['y0'] = $this->y; + $this->floatmargins['L']['y1'] += $yadj; + + // Update objattr in floatbuffer + if ($this->floatbuffer[$this->floatmargins['L']['id']]['border_left']['w']) { + $this->floatbuffer[$this->floatmargins['L']['id']]['BORDER-Y'] += $yadj; + } + $this->floatbuffer[$this->floatmargins['L']['id']]['INNER-Y'] += $yadj; + $this->floatbuffer[$this->floatmargins['L']['id']]['OUTER-Y'] += $yadj; + + // Unset values + $this->floatbuffer[$this->floatmargins['L']['id']]['skipline'] = false; + $this->floatmargins['L']['skipline'] = false; + $this->floatmargins['L']['id'] = ''; + } + // Update floatmargins - R + if (isset($this->floatmargins['R']) && $this->floatmargins['R']['skipline'] && $this->floatmargins['R']['y0'] != $this->y) { + $yadj = $this->y - $this->floatmargins['R']['y0']; + $this->floatmargins['R']['y0'] = $this->y; + $this->floatmargins['R']['y1'] += $yadj; + + // Update objattr in floatbuffer + if ($this->floatbuffer[$this->floatmargins['R']['id']]['border_left']['w']) { + $this->floatbuffer[$this->floatmargins['R']['id']]['BORDER-Y'] += $yadj; + } + $this->floatbuffer[$this->floatmargins['R']['id']]['INNER-Y'] += $yadj; + $this->floatbuffer[$this->floatmargins['R']['id']]['OUTER-Y'] += $yadj; + + // Unset values + $this->floatbuffer[$this->floatmargins['R']['id']]['skipline'] = false; + $this->floatmargins['R']['skipline'] = false; + $this->floatmargins['R']['id'] = ''; + } +} +/*-- END CSS-IMAGE-FLOAT --*/ + + + +//////////////////////////////////////////////////////////////////////////////// +// ADDED forcewrap - to call from inline OBJECT functions to breakwords if necessary in cell +//////////////////////////////////////////////////////////////////////////////// +function WordWrap(&$text, $maxwidth, $forcewrap = 0) { + $biggestword=0; + $toonarrow=false; + + $text = trim($text); + + if ($text==='') return 0; + $space = $this->GetCharWidth(' ',false); + $lines = explode("\n", $text); + $text = ''; + $count = 0; + foreach ($lines as $line) { + $words = explode(' ', $line); + $width = 0; + foreach ($words as $word) { + $word = trim($word); + $wordwidth = $this->GetStringWidth($word); + //Warn user that maxwidth is insufficient + if ($wordwidth > $maxwidth + 0.0001) { + if ($wordwidth > $biggestword) { $biggestword = $wordwidth; } + $toonarrow=true; + // ADDED + if ($forcewrap) { + while($wordwidth > $maxwidth) { + $chw = 0; // check width + for ( $i = 0; $i < mb_strlen($word, $this->mb_enc ); $i++ ) { + $chw = $this->GetStringWidth(mb_substr($word,0,$i+1,$this->mb_enc )); + if ($chw > $maxwidth ) { + if ($text) { + $text = rtrim($text)."\n".mb_substr($word,0,$i,$this->mb_enc ); + $count++; + } + else { + $text = mb_substr($word,0,$i,$this->mb_enc ); + } + $word = mb_substr($word,$i,mb_strlen($word, $this->mb_enc )-$i,$this->mb_enc ); + $wordwidth = $this->GetStringWidth($word); + $width = $maxwidth; + break; + } + } + } + } + } + + if ($width + $wordwidth < $maxwidth - 0.0001) { + $width += $wordwidth + $space; + $text .= $word.' '; + } + else { + $width = $wordwidth + $space; + $text = rtrim($text)."\n".$word.' '; + $count++; + } + } + $text .= "\n"; + $count++; + } + $text = rtrim($text); + + //Return -(wordsize) if word is bigger than maxwidth + + // ADDED + if ($forcewrap) { return $count; } + if (($toonarrow) && ($this->table_error_report)) { + $this->Error("Word is too long to fit in table - ".$this->table_error_report_param); + } + if ($toonarrow) return -$biggestword; + else return $count; +} + +/*-- END HTML-CSS --*/ + +function _SetTextRendering($mode) { + if (!(($mode == 0) || ($mode == 1) || ($mode == 2))) + $this->Error("Text rendering mode should be 0, 1 or 2 (value : $mode)"); + $tr = ($mode.' Tr'); + if($this->page>0 && ((isset($this->pageoutput[$this->page]['TextRendering']) && $this->pageoutput[$this->page]['TextRendering'] != $tr) || !isset($this->pageoutput[$this->page]['TextRendering']) || $this->keep_block_together)) { $this->_out($tr); } + $this->pageoutput[$this->page]['TextRendering'] = $tr; + +} + +function SetTextOutline($params=array()) { // mPDF 5.6.07 + if (isset($params['outline-s']) && $params['outline-s']) + { + $this->SetLineWidth($params['outline-WIDTH']); + $this->SetDColor($params['outline-COLOR']); + $tr = ('2 Tr'); + if($this->page>0 && ((isset($this->pageoutput[$this->page]['TextRendering']) && $this->pageoutput[$this->page]['TextRendering'] != $tr) || !isset($this->pageoutput[$this->page]['TextRendering']) || $this->keep_block_together)) { $this->_out($tr); } + $this->pageoutput[$this->page]['TextRendering'] = $tr; + } + else //Now resets all values + { + $this->SetLineWidth(0.2); + $this->SetDColor($this->ConvertColor(0)); + $this->_SetTextRendering(0); + $tr = ('0 Tr'); + if($this->page>0 && ((isset($this->pageoutput[$this->page]['TextRendering']) && $this->pageoutput[$this->page]['TextRendering'] != $tr) || !isset($this->pageoutput[$this->page]['TextRendering']) || $this->keep_block_together)) { $this->_out($tr); } + $this->pageoutput[$this->page]['TextRendering'] = $tr; + } +} + +function Image($file,$x,$y,$w=0,$h=0,$type='',$link='',$paint=true, $constrain=true, $watermark=false, $shownoimg=true, $allowvector=true) { + $orig_srcpath = $file; + $this->GetFullPath($file); + + $info=$this->_getImage($file, true, $allowvector, $orig_srcpath ); + if(!$info && $paint) { + $info = $this->_getImage($this->noImageFile); + if ($info) { + $file = $this->noImageFile; + $w = ($info['w'] * (25.4/$this->dpi)); // 14 x 16px + $h = ($info['h'] * (25.4/$this->dpi)); // 14 x 16px + } + } + if(!$info) return false; + //Automatic width and height calculation if needed + if($w==0 and $h==0) { +/*-- IMAGES-WMF --*/ + if ($info['type']=='wmf') { + // WMF units are twips (1/20pt) + // divide by 20 to get points + // divide by k to get user units + $w = abs($info['w'])/(20*_MPDFK); + $h = abs($info['h']) / (20*_MPDFK); + } + else +/*-- END IMAGES-WMF --*/ + if ($info['type']=='svg') { + // returned SVG units are pts + // divide by k to get user units (mm) + $w = abs($info['w'])/_MPDFK; + $h = abs($info['h']) /_MPDFK; + } + else { + //Put image at default image dpi + $w=($info['w']/_MPDFK) * (72/$this->img_dpi); + $h=($info['h']/_MPDFK) * (72/$this->img_dpi); + } + } + if($w==0) $w=abs($h*$info['w']/$info['h']); + if($h==0) $h=abs($w*$info['h']/$info['w']); + +/*-- WATERMARK --*/ + if ($watermark) { + $maxw = $this->w; + $maxh = $this->h; + // Size = D PF or array + if (is_array($this->watermark_size)) { + $w = $this->watermark_size[0]; + $h = $this->watermark_size[1]; + } + else if (!is_string($this->watermark_size)) { + $maxw -= $this->watermark_size*2; + $maxh -= $this->watermark_size*2; + $w = $maxw; + $h=abs($w*$info['h']/$info['w']); + if ($h > $maxh ) { + $h = $maxh ; $w=abs($h*$info['w']/$info['h']); + } + } + else if ($this->watermark_size == 'F') { + if ($this->ColActive) { $maxw = $this->w - ($this->DeflMargin + $this->DefrMargin); } + else { $maxw = $this->pgwidth; } + $maxh = $this->h - ($this->tMargin + $this->bMargin); + $w = $maxw; + $h=abs($w*$info['h']/$info['w']); + if ($h > $maxh ) { + $h = $maxh ; $w=abs($h*$info['w']/$info['h']); + } + } + else if ($this->watermark_size == 'P') { // Default P + $w = $maxw; + $h=abs($w*$info['h']/$info['w']); + if ($h > $maxh ) { + $h = $maxh ; $w=abs($h*$info['w']/$info['h']); + } + } + // Automatically resize to maximum dimensions of page if too large + if ($w > $maxw) { + $w = $maxw; + $h=abs($w*$info['h']/$info['w']); + } + if ($h > $maxh ) { + $h = $maxh ; + $w=abs($h*$info['w']/$info['h']); + } + // Position + if (is_array($this->watermark_pos)) { + $x = $this->watermark_pos[0]; + $y = $this->watermark_pos[1]; + } + else if ($this->watermark_pos == 'F') { // centred on printable area + if ($this->ColActive) { // *COLUMNS* + if (($this->mirrorMargins) && (($this->page)%2==0)) { $xadj = $this->DeflMargin-$this->DefrMargin; } // *COLUMNS* + else { $xadj = 0; } // *COLUMNS* + $x = ($this->DeflMargin - $xadj + ($this->w - ($this->DeflMargin + $this->DefrMargin))/2) - ($w/2); // *COLUMNS* + } // *COLUMNS* + else { // *COLUMNS* + $x = ($this->lMargin + ($this->pgwidth)/2) - ($w/2); + } // *COLUMNS* + $y = ($this->tMargin + ($this->h - ($this->tMargin + $this->bMargin))/2) - ($h/2); + } + else { // default P - centred on whole page + $x = ($this->w/2) - ($w/2); + $y = ($this->h/2) - ($h/2); + } +/*-- IMAGES-WMF --*/ + if ($info['type']=='wmf') { + $sx = $w*_MPDFK / $info['w']; + $sy = -$h*_MPDFK / $info['h']; + $outstring = sprintf('q %.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, $sy, $x*_MPDFK-$sx*$info['x'], (($this->h-$y)*_MPDFK)-$sy*$info['y'], $info['i']); + } + else +/*-- END IMAGES-WMF --*/ + if ($info['type']=='svg') { + $sx = $w*_MPDFK / $info['w']; + $sy = -$h*_MPDFK / $info['h']; + $outstring = sprintf('q %.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, $sy, $x*_MPDFK-$sx*$info['x'], (($this->h-$y)*_MPDFK)-$sy*$info['y'], $info['i']); + } + else { + $outstring = sprintf("q %.3F 0 0 %.3F %.3F %.3F cm /I%d Do Q",$w*_MPDFK,$h*_MPDFK,$x*_MPDFK,($this->h-($y+$h))*_MPDFK,$info['i']); + } + + if ($this->watermarkImgBehind) { + $outstring = $this->watermarkImgAlpha . "\n" . $outstring . "\n" . $this->SetAlpha(1, 'Normal', true) . "\n"; + $this->pages[$this->page] = preg_replace('/(___BACKGROUND___PATTERNS'.date('jY').')/', "\n".$outstring."\n".'\\1', $this->pages[$this->page]); + } + else { $this->_out($outstring); } + + return 0; + } // end of IF watermark +/*-- END WATERMARK --*/ + + if ($constrain) { + // Automatically resize to maximum dimensions of page if too large + if (isset($this->blk[$this->blklvl]['inner_width']) && $this->blk[$this->blklvl]['inner_width']) { $maxw = $this->blk[$this->blklvl]['inner_width']; } + else { $maxw = $this->pgwidth; } + if ($w > $maxw) { + $w = $maxw; + $h=abs($w*$info['h']/$info['w']); + } + if ($h > $this->h - ($this->tMargin + $this->bMargin + 1)) { // see below - +10 to avoid drawing too close to border of page + $h = $this->h - ($this->tMargin + $this->bMargin + 1) ; + if ($this->fullImageHeight) { $h = $this->fullImageHeight; } + $w=abs($h*$info['w']/$info['h']); + } + + + //Avoid drawing out of the paper(exceeding width limits). + //if ( ($x + $w) > $this->fw ) { + if ( ($x + $w) > $this->w ) { + $x = $this->lMargin; + $y += 5; + } + + $changedpage = false; + $oldcolumn = $this->CurrCol; + //Avoid drawing out of the page. + if($y+$h>$this->PageBreakTrigger and !$this->InFooter and $this->AcceptPageBreak()) { + $this->AddPage($this->CurOrientation); + // Added to correct for OddEven Margins + $x=$x +$this->MarginCorrection; + $y = $tMargin + $this->margin_header; + $changedpage = true; + } +/*-- COLUMNS --*/ + // COLS + // COLUMN CHANGE + if ($this->CurrCol != $oldcolumn) { + $y = $this->y0; + $x += $this->ChangeColumn * ($this->ColWidth+$this->ColGap); + $this->x += $this->ChangeColumn * ($this->ColWidth+$this->ColGap); + } +/*-- END COLUMNS --*/ + } // end of IF constrain + +/*-- IMAGES-WMF --*/ + if ($info['type']=='wmf') { + $sx = $w*_MPDFK / $info['w']; + $sy = -$h*_MPDFK / $info['h']; + $outstring = sprintf('q %.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, $sy, $x*_MPDFK-$sx*$info['x'], (($this->h-$y)*_MPDFK)-$sy*$info['y'], $info['i']); + } + else +/*-- END IMAGES-WMF --*/ + if ($info['type']=='svg') { + $sx = $w*_MPDFK / $info['w']; + $sy = -$h*_MPDFK / $info['h']; + $outstring = sprintf('q %.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q', $sx, $sy, $x*_MPDFK-$sx*$info['x'], (($this->h-$y)*_MPDFK)-$sy*$info['y'], $info['i']); + } + else { + $outstring = sprintf("q %.3F 0 0 %.3F %.3F %.3F cm /I%d Do Q",$w*_MPDFK,$h*_MPDFK,$x*_MPDFK,($this->h-($y+$h))*_MPDFK,$info['i']); + } + + if($paint) { + $this->_out($outstring); + if($link) $this->Link($x,$y,$w,$h,$link); + + // Avoid writing text on top of the image. // THIS WAS OUTSIDE THE if ($paint) bit!!!!!!!!!!!!!!!! + $this->y = $y + $h; + } + + //Return width-height array + $sizesarray['WIDTH'] = $w; + $sizesarray['HEIGHT'] = $h; + $sizesarray['X'] = $x; //Position before painting image + $sizesarray['Y'] = $y; //Position before painting image + $sizesarray['OUTPUT'] = $outstring; + + $sizesarray['IMAGE_ID'] = $info['i']; + $sizesarray['itype'] = $info['type']; + $sizesarray['set-dpi'] = $info['set-dpi']; + return $sizesarray; +} + + + +//============================================================= +//============================================================= +//============================================================= +//============================================================= +//============================================================= +/*-- HTML-CSS --*/ + +function _getObjAttr($t) { + $c = explode("\xbb\xa4\xac",$t,2); + $c = explode(",",$c[1],2); + foreach($c as $v) { + $v = explode("=",$v,2); + $sp[$v[0]] = $v[1]; + } + return (unserialize($sp['objattr'])); +} + + +function inlineObject($type,$x,$y,$objattr,$Lmargin,$widthUsed,$maxWidth,$lineHeight,$paint=false,$is_table=false) +{ + if ($is_table) { $k = $this->shrin_k; } else { $k = 1; } + + // NB $x is only used when paint=true + // Lmargin not used + $w = 0; + if (isset($objattr['width'])) { $w = $objattr['width']/$k; } + $h = 0; + if (isset($objattr['height'])) { $h = abs($objattr['height']/$k); } + $widthLeft = $maxWidth - $widthUsed; + $maxHeight = $this->h - ($this->tMargin + $this->bMargin + 10) ; + if ($this->fullImageHeight) { $maxHeight = $this->fullImageHeight; } + // For Images + if (isset($objattr['border_left'])) { + $extraWidth = ($objattr['border_left']['w'] + $objattr['border_right']['w'] + $objattr['margin_left']+ $objattr['margin_right'])/$k; + $extraHeight = ($objattr['border_top']['w'] + $objattr['border_bottom']['w'] + $objattr['margin_top']+ $objattr['margin_bottom'])/$k; + + if ($type == 'image' || $type == 'barcode' || $type == 'textcircle') { + $extraWidth += ($objattr['padding_left'] + $objattr['padding_right'])/$k; + $extraHeight += ($objattr['padding_top'] + $objattr['padding_bottom'])/$k; + } + } + + if (!isset($objattr['vertical-align'])) { $objattr['vertical-align'] = 'M'; } + + if ($type == 'image' || (isset($objattr['subtype']) && $objattr['subtype'] == 'IMAGE')) { + if (isset($objattr['itype']) && ($objattr['itype'] == 'wmf' || $objattr['itype'] == 'svg')) { + $file = $objattr['file']; + $info=$this->formobjects[$file]; + } + else if (isset($objattr['file'])) { + $file = $objattr['file']; + $info=$this->images[$file]; + } + } + if ($type == 'annot' || $type == 'bookmark' || $type == 'indexentry' || $type == 'toc') { + $w = 0.00001; + $h = 0.00001; + } + + // TEST whether need to skipline + if (!$paint) { + if ($type == 'hr') { // always force new line + if (($y + $h + $lineHeight > $this->PageBreakTrigger) && !$this->InFooter && !$is_table) { return array(-2, $w ,$h ); } // New page + new line + else { return array(1, $w ,$h ); } // new line + } + else { + if ($widthUsed > 0 && $w > $widthLeft && (!$is_table || $type != 'image')) { // New line needed + if (($y + $h + $lineHeight > $this->PageBreakTrigger) && !$this->InFooter) { return array(-2,$w ,$h ); } // New page + new line + return array(1,$w ,$h ); // new line + } + else if ($widthUsed > 0 && $w > $widthLeft && $is_table) { // New line needed in TABLE + return array(1,$w ,$h ); // new line + } + // Will fit on line but NEW PAGE REQUIRED + else if (($y + $h > $this->PageBreakTrigger) && !$this->InFooter && !$is_table) { return array(-1,$w ,$h ); } + else { return array(0,$w ,$h ); } + } + } + + if ($type == 'annot' || $type == 'bookmark' || $type == 'indexentry' || $type == 'toc') { + $w = 0.00001; + $h = 0.00001; + $objattr['BORDER-WIDTH'] = 0; + $objattr['BORDER-HEIGHT'] = 0; + $objattr['BORDER-X'] = $x; + $objattr['BORDER-Y'] = $y; + $objattr['INNER-WIDTH'] = 0; + $objattr['INNER-HEIGHT'] = 0; + $objattr['INNER-X'] = $x; + $objattr['INNER-Y'] = $y; + } + + if ($type == 'image') { + // Automatically resize to width remaining + if ($w > $widthLeft && !$is_table) { + $w = $widthLeft ; + $h=abs($w*$info['h']/$info['w']); + } + $img_w = $w - $extraWidth ; + $img_h = $h - $extraHeight ; + + $objattr['BORDER-WIDTH'] = $img_w + $objattr['padding_left']/$k + $objattr['padding_right']/$k + (($objattr['border_left']['w']/$k + $objattr['border_right']['w']/$k)/2) ; + $objattr['BORDER-HEIGHT'] = $img_h + $objattr['padding_top']/$k + $objattr['padding_bottom']/$k + (($objattr['border_top']['w']/$k + $objattr['border_bottom']['w']/$k)/2) ; + $objattr['BORDER-X'] = $x + $objattr['margin_left']/$k + (($objattr['border_left']['w']/$k)/2) ; + $objattr['BORDER-Y'] = $y + $objattr['margin_top']/$k + (($objattr['border_top']['w']/$k)/2) ; + $objattr['INNER-WIDTH'] = $img_w; + $objattr['INNER-HEIGHT'] = $img_h; + $objattr['INNER-X'] = $x + $objattr['padding_left']/$k + $objattr['margin_left']/$k + ($objattr['border_left']['w']/$k); + $objattr['INNER-Y'] = $y + $objattr['padding_top']/$k + $objattr['margin_top']/$k + ($objattr['border_top']['w']/$k) ; + $objattr['ID'] = $info['i']; + } + + if ($type == 'input' && $objattr['subtype'] == 'IMAGE') { + $img_w = $w - $extraWidth ; + $img_h = $h - $extraHeight ; + $objattr['BORDER-WIDTH'] = $img_w + (($objattr['border_left']['w']/$k + $objattr['border_right']['w']/$k)/2) ; + $objattr['BORDER-HEIGHT'] = $img_h + (($objattr['border_top']['w']/$k + $objattr['border_bottom']['w']/$k)/2) ; + $objattr['BORDER-X'] = $x + $objattr['margin_left']/$k + (($objattr['border_left']['w']/$k)/2) ; + $objattr['BORDER-Y'] = $y + $objattr['margin_top']/$k + (($objattr['border_top']['w']/$k)/2) ; + $objattr['INNER-WIDTH'] = $img_w; + $objattr['INNER-HEIGHT'] = $img_h; + $objattr['INNER-X'] = $x + $objattr['margin_left']/$k + ($objattr['border_left']['w']/$k); + $objattr['INNER-Y'] = $y + $objattr['margin_top']/$k + ($objattr['border_top']['w']/$k) ; + $objattr['ID'] = $info['i']; + } + + if ($type == 'barcode' || $type == 'textcircle') { + $b_w = $w - $extraWidth ; + $b_h = $h - $extraHeight ; + $objattr['BORDER-WIDTH'] = $b_w + $objattr['padding_left']/$k + $objattr['padding_right']/$k + (($objattr['border_left']['w']/$k + $objattr['border_right']['w']/$k)/2) ; + $objattr['BORDER-HEIGHT'] = $b_h + $objattr['padding_top']/$k + $objattr['padding_bottom']/$k + (($objattr['border_top']['w']/$k + $objattr['border_bottom']['w']/$k)/2) ; + $objattr['BORDER-X'] = $x + $objattr['margin_left']/$k + (($objattr['border_left']['w']/$k)/2) ; + $objattr['BORDER-Y'] = $y + $objattr['margin_top']/$k + (($objattr['border_top']['w']/$k)/2) ; + $objattr['INNER-X'] = $x + $objattr['padding_left']/$k + $objattr['margin_left']/$k + ($objattr['border_left']['w']/$k); + $objattr['INNER-Y'] = $y + $objattr['padding_top']/$k + $objattr['margin_top']/$k + ($objattr['border_top']['w']/$k) ; + $objattr['INNER-WIDTH'] = $b_w; + $objattr['INNER-HEIGHT'] = $b_h; + } + + + if ($type == 'textarea') { + // Automatically resize to width remaining + if ($w > $widthLeft && !$is_table) { + $w = $widthLeft ; + } + if (($y + $h > $this->PageBreakTrigger) && !$this->InFooter) { + $h=$this->h - $y - $this->bMargin; + } + } + + if ($type == 'hr') { + if ($is_table) { + $objattr['INNER-WIDTH'] = $maxWidth * $objattr['W-PERCENT']/100; + $objattr['width'] = $objattr['INNER-WIDTH']; + $w = $maxWidth; + } + else { + if ($w>$maxWidth) { $w = $maxWidth; } + $objattr['INNER-WIDTH'] = $w; + $w = $maxWidth; + } + } + + + + if (($type == 'select') || ($type == 'input' && ($objattr['subtype'] == 'TEXT' || $objattr['subtype'] == 'PASSWORD'))) { + // Automatically resize to width remaining + if ($w > $widthLeft && !$is_table) { + $w = $widthLeft; + } + } + + if ($type == 'textarea' || $type == 'select' || $type == 'input') { + if (isset($objattr['fontsize'])) $objattr['fontsize'] /= $k; + if (isset($objattr['linewidth'])) $objattr['linewidth'] /= $k; + } + + if (!isset($objattr['BORDER-Y'])) { $objattr['BORDER-Y'] = 0; } + if (!isset($objattr['BORDER-X'])) { $objattr['BORDER-X'] = 0; } + if (!isset($objattr['INNER-Y'])) { $objattr['INNER-Y'] = 0; } + if (!isset($objattr['INNER-X'])) { $objattr['INNER-X'] = 0; } + + //Return width-height array + $objattr['OUTER-WIDTH'] = $w; + $objattr['OUTER-HEIGHT'] = $h; + $objattr['OUTER-X'] = $x; + $objattr['OUTER-Y'] = $y; + return $objattr; +} + +/*-- END HTML-CSS --*/ + +//============================================================= +//============================================================= +//============================================================= +//============================================================= +//============================================================= + +function SetLineJoin($mode=0) +{ + $s=sprintf('%d j',$mode); + if($this->page>0 && ((isset($this->pageoutput[$this->page]['LineJoin']) && $this->pageoutput[$this->page]['LineJoin'] != $s) || !isset($this->pageoutput[$this->page]['LineJoin']) || $this->keep_block_together)) { $this->_out($s); } + $this->pageoutput[$this->page]['LineJoin'] = $s; + +} +function SetLineCap($mode=2) { + $s=sprintf('%d J',$mode); + if($this->page>0 && ((isset($this->pageoutput[$this->page]['LineCap']) && $this->pageoutput[$this->page]['LineCap'] != $s) || !isset($this->pageoutput[$this->page]['LineCap']) || $this->keep_block_together)) { $this->_out($s); } + $this->pageoutput[$this->page]['LineCap'] = $s; + +} + +function SetDash($black=false,$white=false) +{ + if($black and $white) $s=sprintf('[%.3F %.3F] 0 d',$black*_MPDFK,$white*_MPDFK); + else $s='[] 0 d'; + if($this->page>0 && ((isset($this->pageoutput[$this->page]['Dash']) && $this->pageoutput[$this->page]['Dash'] != $s) || !isset($this->pageoutput[$this->page]['Dash']) || $this->keep_block_together)) { $this->_out($s); } + $this->pageoutput[$this->page]['Dash'] = $s; + +} + +function SetDisplayPreferences($preferences) { + // String containing any or none of /HideMenubar/HideToolbar/HideWindowUI/DisplayDocTitle/CenterWindow/FitWindow + $this->DisplayPreferences .= $preferences; +} + + +function Ln($h='',$collapsible=0) +{ +// Added collapsible to allow collapsible top-margin on new page + //Line feed; default value is last cell height + $this->x = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin']; + if ($collapsible && ($this->y==$this->tMargin) && (!$this->ColActive)) { $h = 0; } + if(is_string($h)) $this->y+=$this->lasth; + else $this->y+=$h; +} + +/*-- HTML-CSS --*/ +// $state = 0 normal; 1 top; 2 bottom; 3 top and bottom +function DivLn($h,$level=-3,$move_y=true,$collapsible=false,$state=0) { + // this->x is returned as it was + // adds lines (y) where DIV bgcolors are filled in + // allows .00001 as nominal height used for bookmarks/annotations etc. + if ($collapsible && (sprintf("%0.4f", $this->y)==sprintf("%0.4f", $this->tMargin)) && (!$this->ColActive)) { return; } + if ($collapsible && (sprintf("%0.4f", $this->y)==sprintf("%0.4f", $this->y0)) && ($this->ColActive) && $this->CurrCol == 0) { return; } // *COLUMNS* + + // Still use this method if columns or page-break-inside: avoid, as it allows repositioning later + // otherwise, now uses PaintDivBB() + if (!$this->ColActive && !$this->keep_block_together && !$this->kwt) { + if ($move_y && !$this->ColActive) { $this->y += $h; } + return; + } + + if ($level == -3) { $level = $this->blklvl; } + $firstblockfill = $this->GetFirstBlockFill(); + if ($firstblockfill && $this->blklvl > 0 && $this->blklvl >= $firstblockfill) { + $last_x = 0; + $last_w = 0; + $last_fc = $this->FillColor; + $bak_x = $this->x; + $bak_h = $this->divheight; + $this->divheight = 0; // Temporarily turn off divheight - as Cell() uses it to check for PageBreak + for ($blvl=$firstblockfill;$blvl<=$level;$blvl++) { + $this->SetBlockFill($blvl); + $this->x = $this->lMargin + $this->blk[$blvl]['outer_left_margin']; + if ($last_x != $this->lMargin + $this->blk[$blvl]['outer_left_margin'] || $last_w != $this->blk[$blvl]['width'] || $last_fc != $this->FillColor || $this->blk[$blvl]['border_top']['s'] || $this->blk[$blvl]['border_bottom']['s'] || $this->blk[$blvl]['border_left']['s'] || $this->blk[$blvl]['border_right']['s']) { // mPDF 5.6.55 + $x = $this->x; + $this->Cell( ($this->blk[$blvl]['width']), $h, '', '', 0, '', 1); + if (!$this->keep_block_together && !$this->writingHTMLheader && !$this->writingHTMLfooter) { + $this->x = $x; + // $state = 0 normal; 1 top; 2 bottom; 3 top and bottom + if ($blvl == $this->blklvl) { $this->PaintDivLnBorder($state,$blvl,$h); } + else { $this->PaintDivLnBorder(0,$blvl,$h); } + } + } + $last_x = $this->lMargin + $this->blk[$blvl]['outer_left_margin']; + $last_w = $this->blk[$blvl]['width']; + $last_fc = $this->FillColor; + } + // Reset current block fill + if (isset($this->blk[$this->blklvl]['bgcolorarray'])) { + $bcor = $this->blk[$this->blklvl]['bgcolorarray']; + $this->SetFColor($bcor); + } + $this->x = $bak_x; + $this->divheight = $bak_h; + } + if ($move_y) { $this->y += $h; } +} +/*-- END HTML-CSS --*/ + + +function SetX($x) +{ + //Set x position + if($x >= 0) $this->x=$x; + else $this->x = $this->w + $x; +} + +function SetY($y) +{ + //Set y position and reset x + $this->x=$this->lMargin; + if($y>=0) + $this->y=$y; + else + $this->y=$this->h+$y; +} + +function SetXY($x,$y) +{ + //Set x and y positions + $this->SetY($y); + $this->SetX($x); +} + + +function Output($name='',$dest='') +{ + //Output PDF to some destination + if ($this->showStats) { + echo '<div>Generated in '.sprintf('%.2F',(microtime(true) - $this->time0)).' seconds</div>'; + } + //Finish document if necessary + if ($this->progressBar) { $this->UpdateProgressBar(1,'100','Finished'); } // *PROGRESS-BAR* + if($this->state < 3) $this->Close(); + if ($this->progressBar) { $this->UpdateProgressBar(2,'100','Finished'); } // *PROGRESS-BAR* + // fn. error_get_last is only in PHP>=5.2 + if ($this->debug && function_exists('error_get_last') && error_get_last()) { + $e = error_get_last(); + if (($e['type'] < 2048 && $e['type'] != 8) || (intval($e['type']) & intval(ini_get("error_reporting")))) { + echo "<p>Error message detected - PDF file generation aborted.</p>"; + echo $e['message'].'<br />'; + echo 'File: '.$e['file'].'<br />'; + echo 'Line: '.$e['line'].'<br />'; + exit; + } + } + + + if (($this->PDFA || $this->PDFX) && $this->encrypted) { $this->Error("PDFA1-b or PDFX/1-a does not permit encryption of documents."); } + if (count($this->PDFAXwarnings) && (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto))) { + if ($this->PDFA) { + echo '<div>WARNING - This file could not be generated as it stands as a PDFA1-b compliant file.</div>'; + echo '<div>These issues can be automatically fixed by mPDF using <i>$mpdf-&gt;PDFAauto=true;</i></div>'; + echo '<div>Action that mPDF will take to automatically force PDFA1-b compliance are shown in brackets.</div>'; + } + else { + echo '<div>WARNING - This file could not be generated as it stands as a PDFX/1-a compliant file.</div>'; + echo '<div>These issues can be automatically fixed by mPDF using <i>$mpdf-&gt;PDFXauto=true;</i></div>'; + echo '<div>Action that mPDF will take to automatically force PDFX/1-a compliance are shown in brackets.</div>'; + } + echo '<div>Warning(s) generated:</div><ul>'; + $this->PDFAXwarnings = array_unique($this->PDFAXwarnings); + foreach($this->PDFAXwarnings AS $w) { + echo '<li>'.$w.'</li>'; + } + echo '</ul>'; + exit; + } + + if ($this->showStats) { + echo '<div>Compiled in '.sprintf('%.2F',(microtime(true) - $this->time0)).' seconds (total)</div>'; + echo '<div>Peak Memory usage '.number_format((memory_get_peak_usage(true)/(1024*1024)),2).' MB</div>'; + echo '<div>PDF file size '.number_format((strlen($this->buffer)/1024)).' kB</div>'; + echo '<div>Number of fonts '.count($this->fonts).'</div>'; + exit; + } + + + if(is_bool($dest)) $dest=$dest ? 'D' : 'F'; + $dest=strtoupper($dest); + if($dest=='') { + if($name=='') { + $name='mpdf.pdf'; + $dest='I'; + } + else { $dest='F'; } + } + +/*-- PROGRESS-BAR --*/ + if ($this->progressBar && ($dest=='D' || $dest=='I')) { + if($name=='') { $name='mpdf.pdf'; } + $tempfile = '_tempPDF'.RAND(1,10000); + //Save to local file + $f=fopen(_MPDF_TEMP_PATH.$tempfile.'.pdf','wb'); + if(!$f) $this->Error('Unable to create temporary output file: '.$tempfile.'.pdf'); + fwrite($f,$this->buffer,strlen($this->buffer)); + fclose($f); + $this->UpdateProgressBar(3,'','Finished'); + + echo '<script type="text/javascript"> + + var form = document.createElement("form"); + form.setAttribute("method", "post"); + form.setAttribute("action", "'._MPDF_URI.'includes/out.php"); + + var hiddenField = document.createElement("input"); + hiddenField.setAttribute("type", "hidden"); + hiddenField.setAttribute("name", "filename"); + hiddenField.setAttribute("value", "'.$tempfile.'"); + form.appendChild(hiddenField); + + var hiddenField = document.createElement("input"); + hiddenField.setAttribute("type", "hidden"); + hiddenField.setAttribute("name", "dest"); + hiddenField.setAttribute("value", "'.$dest.'"); + form.appendChild(hiddenField); + + var hiddenField = document.createElement("input"); + hiddenField.setAttribute("type", "hidden"); + hiddenField.setAttribute("name", "opname"); + hiddenField.setAttribute("value", "'.$name.'"); + form.appendChild(hiddenField); + + var hiddenField = document.createElement("input"); + hiddenField.setAttribute("type", "hidden"); + hiddenField.setAttribute("name", "path"); + hiddenField.setAttribute("value", "'.urlencode(_MPDF_TEMP_PATH).'"); + form.appendChild(hiddenField); + + document.body.appendChild(form); + form.submit(); + + </script> + </div> + </body> + </html>'; + exit; + } + else { + if ($this->progressBar) { $this->UpdateProgressBar(3,'','Finished'); } +/*-- END PROGRESS-BAR --*/ + + switch($dest) { + case 'I': + if ($this->debug && !$this->allow_output_buffering && ob_get_contents()) { echo "<p>Output has already been sent from the script - PDF file generation aborted.</p>"; exit; } + //Send to standard output + if(PHP_SAPI!='cli') { + //We send to a browser + header('Content-Type: application/pdf'); + if(headers_sent()) + $this->Error('Some data has already been output to browser, can\'t send PDF file'); + if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) OR empty($_SERVER['HTTP_ACCEPT_ENCODING'])) { + // don't use length if server using compression + header('Content-Length: '.strlen($this->buffer)); + } + header('Content-disposition: inline; filename="'.$name.'"'); + header('Cache-Control: public, must-revalidate, max-age=0'); + header('Pragma: public'); + header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); + header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + } + echo $this->buffer; + break; + case 'D': + //Download file + header('Content-Description: File Transfer'); + if (headers_sent()) + $this->Error('Some data has already been output to browser, can\'t send PDF file'); + header('Content-Transfer-Encoding: binary'); + header('Cache-Control: public, must-revalidate, max-age=0'); + header('Pragma: public'); + header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); + header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + header('Content-Type: application/force-download'); + header('Content-Type: application/octet-stream', false); + header('Content-Type: application/download', false); + header('Content-Type: application/pdf', false); + if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) OR empty($_SERVER['HTTP_ACCEPT_ENCODING'])) { + // don't use length if server using compression + header('Content-Length: '.strlen($this->buffer)); + } + header('Content-disposition: attachment; filename="'.$name.'"'); + echo $this->buffer; + break; + case 'F': + //Save to local file + $f=fopen($name,'wb'); + if(!$f) $this->Error('Unable to create output file: '.$name); + fwrite($f,$this->buffer,strlen($this->buffer)); + fclose($f); + break; + case 'S': + //Return as a string + return $this->buffer; + default: + $this->Error('Incorrect output destination: '.$dest); + } + + } // *PROGRESS-BAR* + //====================================================================================================== + // DELETE OLD TMP FILES - Housekeeping + // Delete any files in tmp/ directory that are >1 hrs old + $interval = 3600; + if ($handle = opendir(preg_replace('/\/$/','',_MPDF_TEMP_PATH))) { + while (false !== ($file = readdir($handle))) { + if (!is_dir($file) && ((filemtime(_MPDF_TEMP_PATH.$file)+$interval) < time()) && ($file != "..") && ($file != ".")) { // mPDF 5.4.19 + unlink(_MPDF_TEMP_PATH.$file); + } + } + closedir($handle); + } + //============================================================================================================== + + return ''; +} + + +// ***************************************************************************** +// * +// Protected methods * +// * +// ***************************************************************************** +function _dochecks() +{ + //Check for locale-related bug + if(1.1==1) + $this->Error('Don\'t alter the locale before including mPDF'); + //Check for decimal separator + if(sprintf('%.1f',1.0)!='1.0') + setlocale(LC_NUMERIC,'C'); + // mPDF 5.4.11 + $mqr=ini_get("magic_quotes_runtime"); + if ($mqr) { $this->Error('mPDF requires magic_quotes_runtime to be turned off e.g. by using ini_set("magic_quotes_runtime", 0);'); } +} + +function _begindoc() +{ + //Start document + $this->state=1; + $this->_out('%PDF-'.$this->pdf_version); + $this->_out('%'.chr(226).chr(227).chr(207).chr(211)); // 4 chars > 128 to show binary file +} + + +/*-- HTMLHEADERS-FOOTERS --*/ +function _puthtmlheaders() { + $this->state=2; + $nb=$this->page; + for($n=1;$n<=$nb;$n++) { + if ($this->mirrorMargins && $n%2==0) { $OE = 'E'; } // EVEN + else { $OE = 'O'; } + $this->page = $n; + if (isset($this->saveHTMLHeader[$n][$OE])) { + $html = $this->saveHTMLHeader[$n][$OE]['html']; + $this->lMargin = $this->saveHTMLHeader[$n][$OE]['ml']; + $this->rMargin = $this->saveHTMLHeader[$n][$OE]['mr']; + $this->tMargin = $this->saveHTMLHeader[$n][$OE]['mh']; + $this->bMargin = $this->saveHTMLHeader[$n][$OE]['mf']; + $this->margin_header = $this->saveHTMLHeader[$n][$OE]['mh']; + $this->margin_footer = $this->saveHTMLHeader[$n][$OE]['mf']; + $this->w = $this->saveHTMLHeader[$n][$OE]['pw']; + $this->h = $this->saveHTMLHeader[$n][$OE]['ph']; + $rotate = (isset($this->saveHTMLHeader[$n][$OE]['rotate']) ? $this->saveHTMLHeader[$n][$OE]['rotate'] : null); + $this->Reset(); + $this->pageoutput[$n] = array(); + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + $this->x = $this->lMargin; + $this->y = $this->margin_header; + // mPDF 5.6.47 + $pn = $this->docPageNum($n); + if ($pn) + $pnstr = $this->pagenumPrefix.$pn.$this->pagenumSuffix; + else { $pnstr = ''; } + $html = str_replace('{PAGENO}',$pnstr,$html); + $pnt = $this->docPageNumTotal($n); + if ($pnt) + $pntstr = $this->nbpgPrefix.$pnt.$this->nbpgSuffix; + else { $pntstr = ''; } + $html = str_replace($this->aliasNbPgGp,$pntstr,$html ); // {nbpg} + $html = str_replace($this->aliasNbPg,$nb,$html ); // {nb} + $html = preg_replace('/\{DATE\s+(.*?)\}/e',"date('\\1')",$html ); + + $this->HTMLheaderPageLinks = array(); + $this->HTMLheaderPageAnnots = array(); + $this->HTMLheaderPageForms = array(); + $this->pageBackgrounds = array(); + + $this->writingHTMLheader = true; + $this->WriteHTML($html , 4); // parameter 4 saves output to $this->headerbuffer + $this->writingHTMLheader = false; + $this->Reset(); + $this->pageoutput[$n] = array(); + + $s = $this->PrintPageBackgrounds(); + $this->headerbuffer = $s . $this->headerbuffer; + $os = ''; + if ($rotate) { + $os .= sprintf('q 0 -1 1 0 0 %.3F cm ',($this->w*_MPDFK)); + } + $os .= $this->headerbuffer ; + if ($rotate) { + $os .= ' Q' . "\n"; + } + + // Writes over the page background but behind any other output on page + $os = preg_replace('/\\\\/','\\\\\\\\',$os); + $this->pages[$n] = preg_replace('/(___HEADER___MARKER'.date('jY').')/', "\n".$os."\n".'\\1', $this->pages[$n]); + + $lks = $this->HTMLheaderPageLinks; + foreach($lks AS $lk) { + if ($rotate) { + $lw = $lk[2]; + $lh = $lk[3]; + $lk[2] = $lh; + $lk[3] = $lw; // swap width and height + $ax = $lk[0]/_MPDFK; + $ay = $lk[1]/_MPDFK; + $bx = $ay-($lh/_MPDFK); + $by = $this->w-$ax; + $lk[0] = $bx*_MPDFK; + $lk[1] = ($this->h-$by)*_MPDFK - $lw; + } + $this->PageLinks[$n][]=$lk; + } +/*-- FORMS --*/ + foreach($this->HTMLheaderPageForms AS $f) { + $this->form->forms[$f['n']] = $f; + } +/*-- END FORMS --*/ + + + } + if (isset($this->saveHTMLFooter[$n][$OE])) { + $html = $this->saveHTMLFooter[$this->page][$OE]['html']; + $this->lMargin = $this->saveHTMLFooter[$n][$OE]['ml']; + $this->rMargin = $this->saveHTMLFooter[$n][$OE]['mr']; + $this->tMargin = $this->saveHTMLFooter[$n][$OE]['mh']; + $this->bMargin = $this->saveHTMLFooter[$n][$OE]['mf']; + $this->margin_header = $this->saveHTMLFooter[$n][$OE]['mh']; + $this->margin_footer = $this->saveHTMLFooter[$n][$OE]['mf']; + $this->w = $this->saveHTMLFooter[$n][$OE]['pw']; + $this->h = $this->saveHTMLFooter[$n][$OE]['ph']; + $rotate = (isset($this->saveHTMLFooter[$n][$OE]['rotate']) ? $this->saveHTMLFooter[$n][$OE]['rotate'] : null); + $this->Reset(); + $this->pageoutput[$n] = array(); + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + $this->x = $this->lMargin; + $top_y = $this->y = $this->h - $this->margin_footer; + + // if bottom-margin==0, corrects to avoid division by zero + if ($this->y == $this->h) { $top_y = $this->y = ($this->h - 0.1); } + // mPDF 5.6.47 + $pn = $this->docPageNum($n); + if ($pn) + $pnstr = $this->pagenumPrefix.$pn.$this->pagenumSuffix; + else { $pnstr = ''; } + $html = str_replace('{PAGENO}',$pnstr,$html); + $pnt = $this->docPageNumTotal($n); + if ($pnt) + $pntstr = $this->nbpgPrefix.$pnt.$this->nbpgSuffix; + else { $pntstr = ''; } + $html = str_replace($this->aliasNbPgGp,$pntstr,$html ); // {nbpg} + $html = str_replace($this->aliasNbPg,$nb,$html ); // {nb} + $html = preg_replace('/\{DATE\s+(.*?)\}/e',"date('\\1')",$html ); + + + $this->HTMLheaderPageLinks = array(); + $this->HTMLheaderPageAnnots = array(); + $this->HTMLheaderPageForms = array(); + $this->pageBackgrounds = array(); + + $this->writingHTMLfooter = true; + $this->InFooter = true; + $this->WriteHTML($html , 4); // parameter 4 saves output to $this->headerbuffer + $this->writingHTMLfooter = false; + $this->InFooter = false; + $this->Reset(); + $this->pageoutput[$n] = array(); + + $fheight = $this->y - $top_y; + $adj = -$fheight; + + $s = $this->PrintPageBackgrounds(-$adj); + $this->headerbuffer = $s . $this->headerbuffer; + + $os = ''; + $os .= $this->StartTransform(true)."\n"; + if ($rotate) { + $os .= sprintf('q 0 -1 1 0 0 %.3F cm ',($this->w*_MPDFK)); + } + $os .= $this->transformTranslate(0, $adj, true)."\n"; + $os .= $this->headerbuffer ; + if ($rotate) { + $os .= ' Q' . "\n"; + } + $os .= $this->StopTransform(true)."\n"; + // Writes over the page background but behind any other output on page + $os = preg_replace('/\\\\/','\\\\\\\\',$os); + $this->pages[$n] = preg_replace('/(___HEADER___MARKER'.date('jY').')/', "\n".$os."\n".'\\1', $this->pages[$n]); + + $lks = $this->HTMLheaderPageLinks; + foreach($lks AS $lk) { + $lk[1] -= $adj*_MPDFK; + if ($rotate) { + $lw = $lk[2]; + $lh = $lk[3]; + $lk[2] = $lh; + $lk[3] = $lw; // swap width and height + + $ax = $lk[0]/_MPDFK; + $ay = $lk[1]/_MPDFK; + $bx = $ay-($lh/_MPDFK); + $by = $this->w-$ax; + $lk[0] = $bx*_MPDFK; + $lk[1] = ($this->h-$by)*_MPDFK - $lw; + } + $this->PageLinks[$n][]=$lk; + } +/*-- FORMS --*/ + foreach($this->HTMLheaderPageForms AS $f) { + $f['y'] += $adj; + $this->form->forms[$f['n']] = $f; + } +/*-- END FORMS --*/ + } + } + $this->page=$nb; + $this->state=1; +} +/*-- END HTMLHEADERS-FOOTERS --*/ + + +function _putpages() +{ + $nb=$this->page; + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + + if($this->DefOrientation=='P') { + $defwPt=$this->fwPt; + $defhPt=$this->fhPt; + } + else { + $defwPt=$this->fhPt; + $defhPt=$this->fwPt; + } + $annotid=(3+2*$nb); + + // Active Forms + $totaladdnum = 0; + for($n=1;$n<=$nb;$n++) { + if (isset($this->PageLinks[$n])) { $totaladdnum += count($this->PageLinks[$n]); } +/*-- ANNOTATIONS --*/ + if (isset($this->PageAnnots[$n])) { + foreach ($this->PageAnnots[$n] as $k => $pl) { + if (!empty($pl['opt']['popup']) || !empty($pl['opt']['file'])) { $totaladdnum += 2 ; } + else { $totaladdnum++; } + } + } +/*-- END ANNOTATIONS --*/ + +/*-- FORMS --*/ + if ( count($this->form->forms) > 0 ) { + $this->form->countPageForms($n, $totaladdnum); + } +/*-- END FORMS --*/ + } +/*-- FORMS --*/ + // Make a note in the radio button group of the obj_id it will have + $ctr = 0; + if (count($this->form->form_radio_groups)) { + foreach($this->form->form_radio_groups AS $name=>$frg) { + $this->form->form_radio_groups[$name]['obj_id'] = $annotid + $totaladdnum + $ctr; + $ctr++; + } + } +/*-- END FORMS --*/ + + // Select unused fonts (usually default font) + $unused = array(); + foreach($this->fonts as $fk=>$font) { + if (!$font['used'] && ($font['type']=='TTF')) { + $unused[] = $fk; + } + } + + + for($n=1;$n<=$nb;$n++) + { + $thispage = $this->pages[$n]; +// unset($this->pages[$n]); // mPDF 5.6.47 + if(isset($this->OrientationChanges[$n])) { + $hPt=$this->pageDim[$n]['w']*_MPDFK; + $wPt=$this->pageDim[$n]['h']*_MPDFK; + $owidthPt_LR = $this->pageDim[$n]['outer_width_TB']*_MPDFK; + $owidthPt_TB = $this->pageDim[$n]['outer_width_LR']*_MPDFK; + } + else { + $wPt=$this->pageDim[$n]['w']*_MPDFK; + $hPt=$this->pageDim[$n]['h']*_MPDFK; + $owidthPt_LR = $this->pageDim[$n]['outer_width_LR']*_MPDFK; + $owidthPt_TB = $this->pageDim[$n]['outer_width_TB']*_MPDFK; + } + // Remove references to unused fonts (usually default font) + foreach($unused as $fk) { + if ($this->fonts[$fk]['sip'] || $this->fonts[$fk]['smp']) { + foreach($this->fonts[$fk]['subsetfontids'] AS $k => $fid) { + $thispage = preg_replace('/\s\/F'.$fid.' \d[\d.]* Tf\s/is',' ',$thispage); + } + } + else { + $thispage = preg_replace('/\s\/F'.$this->fonts[$fk]['i'].' \d[\d.]* Tf\s/is',' ',$thispage); + } + } + //Replace number of pages + if(!empty($this->aliasNbPg)) { + if (!$this->onlyCoreFonts) { $s1 = $this->UTF8ToUTF16BE($this->aliasNbPg, false); } + $s2 = $this->aliasNbPg; + if (!$this->onlyCoreFonts) { $r1 = $this->UTF8ToUTF16BE($nb, false); } + $r2 = $nb; + if (preg_match_all('/{mpdfheadernbpg (C|R) ff=(\S*) fs=(\S*) fz=(.*?)}/',$thispage,$m)) { + for($hi=0;$hi<count($m[0]);$hi++) { + $pos = $m[1][$hi]; + $hff = $m[2][$hi]; + $hfst = $m[3][$hi]; + $hfsz = $m[4][$hi]; + $this->SetFont($hff,$hfst,$hfsz, false); + $x1 = $this->GetStringWidth($this->aliasNbPg); + $x2 = $this->GetStringWidth($nb); + $xadj = $x1 - $x2; + if ($pos=='C') { $xadj /= 2; } + $rep = sprintf(' q 1 0 0 1 %.3F 0 cm ', $xadj*_MPDFK); + $thispage = str_replace($m[0][$hi], $rep, $thispage); + } + } + if (!$this->onlyCoreFonts) { $thispage=str_replace($s1,$r1,$thispage); } + $thispage=str_replace($s2,$r2,$thispage); + + // And now for any SMP/SIP fonts subset using <HH> format + $r = ''; + $nstr = "$nb"; + for($i=0;$i<strlen($nstr);$i++) { + $r .= sprintf("%02s", strtoupper(dechex(intval($nstr[$i])+48))); + } + $thispage=str_replace($this->aliasNbPgHex,$r,$thispage); + + } + //Replace number of pages in group + if(!empty($this->aliasNbPgGp)) { + if (!$this->onlyCoreFonts) { $s1 = $this->UTF8ToUTF16BE($this->aliasNbPgGp, false); } + $s2 = $this->aliasNbPgGp; + $nbt = $this->docPageNumTotal($n); + if (!$this->onlyCoreFonts) { $r1 = $this->UTF8ToUTF16BE($nbt, false); } + $r2 = $nbt; + if (preg_match_all('/{mpdfheadernbpggp (C|R) ff=(\S*) fs=(\S*) fz=(.*?)}/',$thispage,$m)) { + for($hi=0;$hi<count($m[0]);$hi++) { + $pos = $m[1][$hi]; + $hff = $m[2][$hi]; + $hfst = $m[3][$hi]; + $hfsz = $m[4][$hi]; + $this->SetFont($hff,$hfst,$hfsz, false); + $x1 = $this->GetStringWidth($this->aliasNbPgGp); + $x2 = $this->GetStringWidth($nbt); + $xadj = $x1 - $x2; + if ($pos=='C') { $xadj /= 2; } + $rep = sprintf(' q 1 0 0 1 %.3F 0 cm ', $xadj*_MPDFK); + $thispage = str_replace($m[0][$hi], $rep, $thispage); + } + } + if (!$this->onlyCoreFonts) { $thispage=str_replace($s1,$r1,$thispage); } + $thispage=str_replace($s2,$r2,$thispage); + + // And now for any SMP/SIP fonts subset using <HH> format + $r = ''; + $nstr = "$nbt"; + for($i=0;$i<strlen($nstr);$i++) { + $r .= sprintf("%02s", strtoupper(dechex(intval($nstr[$i])+48))); + } + $thispage=str_replace($this->aliasNbPgGpHex,$r,$thispage); + + } + $thispage = preg_replace('/(\s*___BACKGROUND___PATTERNS'.date('jY').'\s*)/', " ", $thispage); + $thispage = preg_replace('/(\s*___HEADER___MARKER'.date('jY').'\s*)/', " ", $thispage); + $thispage = preg_replace('/(\s*___PAGE___START'.date('jY').'\s*)/', " ", $thispage); + $thispage = preg_replace('/(\s*___TABLE___BACKGROUNDS'.date('jY').'\s*)/', " ", $thispage); + + //Page + $this->_newobj(); + $this->_out('<</Type /Page'); + $this->_out('/Parent 1 0 R'); + if(isset($this->OrientationChanges[$n])) { + $this->_out(sprintf('/MediaBox [0 0 %.3F %.3F]',$hPt,$wPt)); + //If BleedBox is defined, it must be larger than the TrimBox, but smaller than the MediaBox + $bleedMargin = $this->pageDim[$n]['bleedMargin']*_MPDFK; + if ($bleedMargin && ($owidthPt_TB || $owidthPt_LR)) { + $x0 = $owidthPt_TB-$bleedMargin; + $y0 = $owidthPt_LR-$bleedMargin; + $x1 = $hPt-$owidthPt_TB+$bleedMargin; + $y1 = $wPt-$owidthPt_LR+$bleedMargin; + $this->_out(sprintf('/BleedBox [%.3F %.3F %.3F %.3F]', $x0, $y0, $x1, $y1)); + } + $this->_out(sprintf('/TrimBox [%.3F %.3F %.3F %.3F]', $owidthPt_TB, $owidthPt_LR, ($hPt-$owidthPt_TB), ($wPt-$owidthPt_LR))); + if (isset($this->OrientationChanges[$n]) && $this->displayDefaultOrientation) { + if ($this->DefOrientation=='P') { $this->_out('/Rotate 270'); } + else { $this->_out('/Rotate 90'); } + } + } + //else if($wPt != $defwPt || $hPt != $defhPt) { + else { + $this->_out(sprintf('/MediaBox [0 0 %.3F %.3F]',$wPt,$hPt)); + $bleedMargin = $this->pageDim[$n]['bleedMargin']*_MPDFK; + if ($bleedMargin && ($owidthPt_TB || $owidthPt_LR)) { + $x0 = $owidthPt_LR-$bleedMargin; + $y0 = $owidthPt_TB-$bleedMargin; + $x1 = $wPt-$owidthPt_LR+$bleedMargin; + $y1 = $hPt-$owidthPt_TB+$bleedMargin; + $this->_out(sprintf('/BleedBox [%.3F %.3F %.3F %.3F]', $x0, $y0, $x1, $y1)); + } + $this->_out(sprintf('/TrimBox [%.3F %.3F %.3F %.3F]', $owidthPt_LR, $owidthPt_TB, ($wPt-$owidthPt_LR), ($hPt-$owidthPt_TB))); + } + $this->_out('/Resources 2 0 R'); + + // Important to keep in RGB colorSpace when using transparency + if (!$this->PDFA && !$this->PDFX) { + if ($this->restrictColorSpace == 3) + $this->_out('/Group << /Type /Group /S /Transparency /CS /DeviceCMYK >> '); + else if ($this->restrictColorSpace == 1) + $this->_out('/Group << /Type /Group /S /Transparency /CS /DeviceGray >> '); + else + $this->_out('/Group << /Type /Group /S /Transparency /CS /DeviceRGB >> '); + } + + $annotsnum = 0; + if (isset($this->PageLinks[$n])) { $annotsnum += count($this->PageLinks[$n]); } +/*-- ANNOTATIONS --*/ + if (isset($this->PageAnnots[$n])) { + foreach ($this->PageAnnots[$n] as $k => $pl) { + if (!empty($pl['opt']['popup']) || !empty($pl['opt']['file'])) { $annotsnum += 2 ; } + else { $annotsnum++; } + $this->PageAnnots[$n][$k]['pageobj'] = $this->n; + } + } +/*-- END ANNOTATIONS --*/ + +/*-- FORMS --*/ + // Active Forms + $formsnum = 0; + if ( count($this->form->forms) > 0 ) { + foreach( $this->form->forms as $val ) { + if ( $val['page'] == $n ) + $formsnum++; + } + } +/*-- END FORMS --*/ + if ($annotsnum || $formsnum) { + $s = '/Annots [ '; + for($i=0;$i<$annotsnum;$i++) { + $s .= ($annotid + $i) . ' 0 R '; + } + $annotid += $annotsnum; +/*-- FORMS --*/ + if ( count($this->form->forms) > 0 ) { + $this->form->addFormIds($n, $s, $annotid); + } +/*-- END FORMS --*/ + $s .= '] '; + $this->_out($s); + } + + $this->_out('/Contents '.($this->n+1).' 0 R>>'); + $this->_out('endobj'); + + //Page content + $this->_newobj(); + $p=($this->compress) ? gzcompress($thispage) : $thispage; + $this->_out('<<'.$filter.'/Length '.strlen($p).'>>'); + $this->_putstream($p); + $this->_out('endobj'); + } + $this->_putannots($n); + + //Pages root + $this->offsets[1]=strlen($this->buffer); + $this->_out('1 0 obj'); + $this->_out('<</Type /Pages'); + $kids='/Kids ['; + for($i=0;$i<$nb;$i++) + $kids.=(3+2*$i).' 0 R '; + $this->_out($kids.']'); + $this->_out('/Count '.$nb); + $this->_out(sprintf('/MediaBox [0 0 %.3F %.3F]',$defwPt,$defhPt)); + $this->_out('>>'); + $this->_out('endobj'); +} + + +function _putannots($n) { + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + $nb=$this->page; + for($n=1;$n<=$nb;$n++) + { + $annotobjs = array(); + if(isset($this->PageLinks[$n]) || isset($this->PageAnnots[$n]) || count($this->form->forms) > 0 ) { + $wPt=$this->pageDim[$n]['w']*_MPDFK; + $hPt=$this->pageDim[$n]['h']*_MPDFK; + + //Links + if(isset($this->PageLinks[$n])) { + foreach($this->PageLinks[$n] as $key => $pl) { + $this->_newobj(); + $annot=''; + $rect=sprintf('%.3F %.3F %.3F %.3F',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]); + $annot .= '<</Type /Annot /Subtype /Link /Rect ['.$rect.']'; + $annot .= ' /Contents '.$this->_UTF16BEtextstring($pl[4]); + $annot .= ' /NM '.$this->_textstring(sprintf('%04u-%04u', $n, $key)); + $annot .= ' /M '.$this->_textstring('D:'.date('YmdHis')); + $annot .= ' /Border [0 0 0]'; + // Use this (instead of /Border) to specify border around link + // $annot .= ' /BS <</W 1'; // Width on points; 0 = no line + // $annot .= ' /S /D'; // style - [S]olid, [D]ashed, [B]eveled, [I]nset, [U]nderline + // $annot .= ' /D [3 2]'; // Dash array - if dashed + // $annot .= ' >>'; + // $annot .= ' /C [1 0 0]'; // Color RGB + + if ($this->PDFA || $this->PDFX) { $annot .= ' /F 28'; } + if (strpos($pl[4],'@')===0) { + $p=substr($pl[4],1); + // $h=isset($this->OrientationChanges[$p]) ? $wPt : $hPt; + $htarg=$this->pageDim[$p]['h']*_MPDFK; + $annot.=sprintf(' /Dest [%d 0 R /XYZ 0 %.3F null]>>',1+2*$p,$htarg); + } + else if(is_string($pl[4])) { + $annot .= ' /A <</S /URI /URI '.$this->_textstring($pl[4]).'>> >>'; + } + else { + $l=$this->links[$pl[4]]; + // may not be set if #link points to non-existent target + if (isset($this->pageDim[$l[0]]['h'])) { $htarg=$this->pageDim[$l[0]]['h']*_MPDFK; } + else { $htarg=$this->h*_MPDFK; } // doesn't really matter + $annot.=sprintf(' /Dest [%d 0 R /XYZ 0 %.3F null]>>',1+2*$l[0],$htarg-$l[1]*_MPDFK); + } + $this->_out($annot); + $this->_out('endobj'); + } + } + + +/*-- ANNOTATIONS --*/ + if(isset($this->PageAnnots[$n])) { + foreach ($this->PageAnnots[$n] as $key => $pl) { + if ($pl['opt']['file']) { $FileAttachment=true; } + else { $FileAttachment=false; } + $this->_newobj(); + $annot=''; + $pl['opt'] = array_change_key_case($pl['opt'], CASE_LOWER); + $x = $pl['x']; + if ($this->annotMargin <> 0 || $x==0 || $x<0) { // Odd page + $x = ($wPt/_MPDFK) - $this->annotMargin; + } + $w = $h = 0; + $a = $x * _MPDFK; + $b = $hPt - ($pl['y'] * _MPDFK); + $annot .= '<</Type /Annot '; + if ($FileAttachment) { + $annot .= '/Subtype /FileAttachment'; + // Need to set a size for FileAttachment icons + if ($pl['opt']['icon']=='Paperclip') { $w=8.235; $h=20; } // 7,17 + else if ($pl['opt']['icon']=='Tag') { $w=20; $h=16; } + else if ($pl['opt']['icon']=='Graph') { $w=20; $h=20; } + else { $w=14; $h=20; } // PushPin + $f = $pl['opt']['file']; + $f = preg_replace('/^.*\//', '', $f); + $f = preg_replace('/[^a-zA-Z0-9._]/', '', $f); + $annot .= '/FS <</Type /Filespec /F ('.$f.')'; + $annot .= '/EF <</F '.($this->n+1).' 0 R>>'; + $annot .= '>>'; + } + else { + $annot .= '/Subtype /Text'; + } + $rect = sprintf('%.3F %.3F %.3F %.3F', $a, $b-$h, $a+$w, $b); + $annot .= '/Rect ['.$rect.']'; + + // contents = description of file in free text + $annot .= ' /Contents '.$this->_UTF16BEtextstring($pl['txt']); + $annot .= ' /NM '.$this->_textstring(sprintf('%04u-%04u', $n, (2000 + $key))); + $annot .= ' /M '.$this->_textstring('D:'.date('YmdHis')); + $annot .= ' /CreationDate '.$this->_textstring('D:'.date('YmdHis')); + $annot .= ' /Border [0 0 0]'; + if ($this->PDFA || $this->PDFX) { + $annot .= ' /F 28'; + $annot .= ' /CA 1'; + } + else if ($pl['opt']['ca']>0) { $annot .= ' /CA '.$pl['opt']['ca']; } + + $annotcolor = ' /C ['; + if (isset($pl['opt']['c']) AND $pl['opt']['c']) { + $col = $pl['opt']['c']; + if ($col{0}==3 || $col{0}==5) { $annotcolor .= sprintf("%.3F %.3F %.3F", ord($col{1})/255,ord($col{2})/255,ord($col{3})/255); } + else if ($col{0}==1) { $annotcolor .= sprintf("%.3F", ord($col{1})/255); } + else if ($col{0}==4 || $col{0}==6) { $annotcolor .= sprintf("%.3F %.3F %.3F %.3F", ord($col{1})/100,ord($col{2})/100,ord($col{3})/100,ord($col{4})/100); } + else { $annotcolor .= '1 1 0'; } + } + else { $annotcolor .= '1 1 0'; } + $annotcolor .= ']'; + $annot .= $annotcolor; + // Usually Author + // Use as Title for fileattachment + if (isset($pl['opt']['t']) AND is_string($pl['opt']['t'])) { + $annot .= ' /T '.$this->_UTF16BEtextstring($pl['opt']['t']); + } + if ($FileAttachment) { + $iconsapp = array('Paperclip', 'Graph', 'PushPin', 'Tag'); + } + else { $iconsapp = array('Comment', 'Help', 'Insert', 'Key', 'NewParagraph', 'Note', 'Paragraph'); } + if (isset($pl['opt']['icon']) AND in_array($pl['opt']['icon'], $iconsapp)) { + $annot .= ' /Name /'.$pl['opt']['icon']; + } + else if ($FileAttachment) { $annot .= ' /Name /PushPin'; } + else { $annot .= ' /Name /Note'; } + if (!$FileAttachment) { + // /Subj is PDF 1.5 spec. + if (isset($pl['opt']['subj']) && !$this->PDFA && !$this->PDFX) { + $annot .= ' /Subj '.$this->_UTF16BEtextstring($pl['opt']['subj']); + } + if (!empty($pl['opt']['popup'])) { + $annot .= ' /Open true'; + $annot .= ' /Popup '.($this->n+1).' 0 R'; + } + else { $annot .= ' /Open false'; } + } + $annot .= ' /P '.$pl['pageobj'].' 0 R'; + $annot .= '>>'; + $this->_out($annot); + $this->_out('endobj'); + + if ($FileAttachment) { + $file = @file_get_contents($pl['opt']['file']) or die('mPDF Error: Cannot access file attachment - '.$pl['opt']['file']); + $filestream = gzcompress($file); + $this->_newobj(); + $this->_out('<</Type /EmbeddedFile'); + $this->_out('/Length '.strlen($filestream)); + $this->_out('/Filter /FlateDecode'); + $this->_out('>>'); + $this->_putstream($filestream); + $this->_out('endobj'); + } + else if (!empty($pl['opt']['popup'])) { + $this->_newobj(); + $annot=''; + if (is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][0])) { $x = $pl['opt']['popup'][0] * _MPDFK; } + else { $x = $pl['x'] * _MPDFK; } + if (is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][1])) { $y = $hPt - ($pl['opt']['popup'][1] * _MPDFK); } + else { $y = $hPt - ($pl['y'] * _MPDFK); } + if (is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][2])) { $w = $pl['opt']['popup'][2] * _MPDFK; } + else { $w = 180; } + if (is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][3])) { $h = $pl['opt']['popup'][3] * _MPDFK; } + else { $h = 120; } + $rect = sprintf('%.3F %.3F %.3F %.3F', $x, $y-$h, $x+$w, $y); + $annot .= '<</Type /Annot /Subtype /Popup /Rect ['.$rect.']'; + $annot .= ' /M '.$this->_textstring('D:'.date('YmdHis')); + if ($this->PDFA || $this->PDFX) { $annot .= ' /F 28'; } + $annot .= ' /Parent '.($this->n-1).' 0 R'; + $annot .= '>>'; + $this->_out($annot); + $this->_out('endobj'); + } + } + } +/*-- END ANNOTATIONS --*/ + +/*-- FORMS --*/ + // Active Forms + if ( count($this->form->forms) > 0 ) { + $this->form->_putFormItems($n, $hPt); + } +/*-- END FORMS --*/ + } + } +/*-- FORMS --*/ + // Active Forms - Radio Button Group entries + // Output Radio Button Group form entries (radio_on_obj_id already determined) + if (count($this->form->form_radio_groups)) { + $this->form->_putRadioItems($n); + } +/*-- END FORMS --*/ +} + + +/*-- ANNOTATIONS --*/ +function Annotation($text, $x=0, $y=0, $icon='Note', $author='', $subject='', $opacity=0, $colarray=false, $popup='', $file='') { + if (is_array($colarray) && count($colarray)==3) { $colarray = $this->ConvertColor('rgb('.$colarray[0].','.$colarray[1].','.$colarray[2].')'); } + if ($colarray === false) { $colarray = $this->ConvertColor('yellow'); } + if ($x==0) { $x = $this->x; } + if ($y==0) { $y = $this->y; } + $page = $this->page; + if ($page < 1) { // Document has not been started - assume it's for first page + $page = 1; + if ($x==0) { $x = $this->lMargin; } + if ($y==0) { $y = $this->tMargin; } + } + + if ($this->PDFA || $this->PDFX) { + if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "Annotation markers cannot be semi-transparent in PDFA1-b or PDFX/1-a, so they may make underlying text unreadable. (Annotation markers moved to right margin)"; } + $x = ($this->w) - $this->rMargin*0.66; + } + if (!$this->annotMargin) { $y -= $this->FontSize / 2; } + + if (!$opacity && $this->annotMargin) { $opacity = 1; } + else if (!$opacity) { $opacity = $this->annotOpacity; } + + $an = array('txt' => $text, 'x' => $x, 'y' => $y, 'opt' => array('Icon'=>$icon, 'T'=>$author, 'Subj'=>$subject, 'C'=>$colarray, 'CA'=>$opacity, 'popup'=>$popup, 'file'=>$file)); + + if ($this->keep_block_together) { // Save to array - don't write yet + $this->ktAnnots[$this->page][]= $an; + return; + } + else if ($this->table_rotate) { + $this->tbrot_Annots[$this->page][]= $an; + return; + } + else if ($this->kwt) { + $this->kwt_Annots[$this->page][]= $an; + return; + } + // mPDF 5.0 + if ($this->writingHTMLheader || $this->writingHTMLfooter) { + $this->HTMLheaderPageAnnots[]= $an; + return; + } + //Put an Annotation on the page + $this->PageAnnots[$page][] = $an; +/*-- COLUMNS --*/ + // Save cross-reference to Column buffer + $ref = count($this->PageAnnots[$this->page])-1; + $this->columnAnnots[$this->CurrCol][INTVAL($this->x)][INTVAL($this->y)] = $ref; +/*-- END COLUMNS --*/ +} +/*-- END ANNOTATIONS --*/ + + +function _putfonts() { + $nf=$this->n; + foreach($this->FontFiles as $fontkey=>$info) { + // TrueType embedded + if (isset($info['type']) && $info['type']=='TTF' && !$info['sip'] && !$info['smp']) { + $used = true; + $asSubset = false; + foreach($this->fonts AS $k=>$f) { + if ($f['fontkey'] == $fontkey && $f['type']=='TTF') { + $used = $f['used']; + if ($used) { + $nChars = (ord($f['cw'][0]) << 8) + ord($f['cw'][1]); + $usage = intval(count($f['subset'])*100 / $nChars); + $fsize = $info['length1']; + // Always subset the very large TTF files + if ($fsize > ($this->maxTTFFilesize *1024)) { $asSubset = true; } + else if ($usage < $this->percentSubset) { $asSubset = true; } + } + if ($f['unAGlyphs']) $aaSubset = true; // mPDF 5.4.05 + if ($this->PDFA || $this->PDFX) $asSubset = false; + $this->fonts[$k]['asSubset'] = $asSubset; + break; + } + } + if ($used && !$asSubset) { + //Font file embedding + $this->_newobj(); + $this->FontFiles[$fontkey]['n']=$this->n; + $font=''; + $originalsize = $info['length1']; + if ($this->repackageTTF || $this->fonts[$fontkey]['TTCfontID']>0) { + // First see if there is a cached compressed file + if (file_exists(_MPDF_TTFONTDATAPATH.$fontkey.'.ps.z')) { + $f=fopen(_MPDF_TTFONTDATAPATH.$fontkey.'.ps.z','rb'); + if(!$f) { $this->Error('Font file .ps.z not found'); } + while(!feof($f)) { $font .= fread($f, 2048); } + fclose($f); + include(_MPDF_TTFONTDATAPATH.$fontkey.'.ps.php'); // sets $originalsize (of repackaged font) + } + else { + if (!class_exists('TTFontFile', false)) { include(_MPDF_PATH .'classes/ttfontsuni.php'); } + $ttf = new TTFontFile(); + $font = $ttf->repackageTTF($this->FontFiles[$fontkey]['ttffile'], $this->fonts[$fontkey]['TTCfontID'], $this->debugfonts, $this->fonts[$fontkey]['unAGlyphs']); // mPDF 5.4.05 + + $originalsize = strlen($font); + $font = gzcompress($font); + unset($ttf); + if (is_writable(dirname(_MPDF_TTFONTDATAPATH.'x'))) { + $fh = fopen(_MPDF_TTFONTDATAPATH.$fontkey.'.ps.z',"wb"); + fwrite($fh,$font,strlen($font)); + fclose($fh); + $fh = fopen(_MPDF_TTFONTDATAPATH.$fontkey.'.ps.php',"wb"); + $len = "<?php \n"; + $len.='$originalsize='.$originalsize.";\n"; + $len.="?>"; + fwrite($fh,$len,strlen($len)); + fclose($fh); + } + } + } + else { + // First see if there is a cached compressed file + if (file_exists(_MPDF_TTFONTDATAPATH.$fontkey.'.z')) { + $f=fopen(_MPDF_TTFONTDATAPATH.$fontkey.'.z','rb'); + if(!$f) { $this->Error('Font file not found'); } + while(!feof($f)) { $font .= fread($f, 2048); } + fclose($f); + } + else { + $f=fopen($this->FontFiles[$fontkey]['ttffile'],'rb'); + if(!$f) { $this->Error('Font file not found'); } + while(!feof($f)) { $font .= fread($f, 2048); } + fclose($f); + $font = gzcompress($font); + if (is_writable(dirname(_MPDF_TTFONTDATAPATH.'x'))) { + $fh = fopen(_MPDF_TTFONTDATAPATH.$fontkey.'.z',"wb"); + fwrite($fh,$font,strlen($font)); + fclose($fh); + } + } + } + + $this->_out('<</Length '.strlen($font)); + $this->_out('/Filter /FlateDecode'); + $this->_out('/Length1 '.$originalsize); + $this->_out('>>'); + $this->_putstream($font); + $this->_out('endobj'); + } + } + } + + $nfonts = count($this->fonts); + $fctr = 1; + foreach($this->fonts as $k=>$font) { + //Font objects + $type=$font['type']; + $name=$font['name']; + if ((!isset($font['used']) || !$font['used']) && $type=='TTF') { continue; } + if ($this->progressBar) { $this->UpdateProgressBar(2,intval($fctr*100/$nfonts),'Writing Fonts'); $fctr++; } // *PROGRESS-BAR* + if (isset($font['asSubset'])) { $asSubset = $font['asSubset']; } + else { $asSubset = ''; } +/*-- CJK-FONTS --*/ + if($type=='Type0') { // = Adobe CJK Fonts + $this->fonts[$k]['n']=$this->n+1; + $this->_newobj(); + $this->_out('<</Type /Font'); + $this->_putType0($font); + } + else +/*-- END CJK-FONTS --*/ + if($type=='core') { + //Standard font + $this->fonts[$k]['n']=$this->n+1; + if ($this->PDFA || $this->PDFX) { $this->Error('Core fonts are not allowed in PDF/A1-b or PDFX/1-a files (Times, Helvetica, Courier etc.)'); } + $this->_newobj(); + $this->_out('<</Type /Font'); + $this->_out('/BaseFont /'.$name); + $this->_out('/Subtype /Type1'); + if($name!='Symbol' && $name!='ZapfDingbats') { + $this->_out('/Encoding /WinAnsiEncoding'); + } + $this->_out('>>'); + $this->_out('endobj'); + } + // TrueType embedded SUBSETS for SIP (CJK extB containing Supplementary Ideographic Plane 2) + // Or Unicode Plane 1 - Supplementary Multilingual Plane + else if ($type=='TTF' && ($font['sip'] || $font['smp'])) { + if (!$font['used']) { continue; } + $ssfaid="AA"; + if (!class_exists('TTFontFile', false)) { include(_MPDF_PATH .'classes/ttfontsuni.php'); } + $ttf = new TTFontFile(); + for($sfid=0;$sfid<count($font['subsetfontids']);$sfid++) { + $this->fonts[$k]['n'][$sfid]=$this->n+1; // NB an array for subset + $subsetname = 'MPDF'.$ssfaid.'+'.$font['name']; + $ssfaid++; + $subset = $font['subsets'][$sfid]; + unset($subset[0]); + $ttfontstream = $ttf->makeSubsetSIP($font['ttffile'], $subset, $font['TTCfontID'], $this->debugfonts); + $ttfontsize = strlen($ttfontstream); + $fontstream = gzcompress($ttfontstream); + $widthstring = ''; + $toUnistring = ''; + foreach($font['subsets'][$sfid] AS $cp=>$u) { + $w = $this->_getCharWidth($font['cw'], $u); + if ($w !== false) { + $widthstring .= $w.' '; + } + else { + $widthstring .= round($ttf->defaultWidth).' '; + } + if ($u > 65535) { + $utf8 = chr(($u>>18)+240).chr((($u>>12)&63)+128).chr((($u>>6)&63)+128) .chr(($u&63)+128); + $utf16 = mb_convert_encoding($utf8, 'UTF-16BE', 'UTF-8'); + $l1 = ord($utf16[0]); + $h1 = ord($utf16[1]); + $l2 = ord($utf16[2]); + $h2 = ord($utf16[3]); + $toUnistring .= sprintf("<%02s> <%02s%02s%02s%02s>\n", strtoupper(dechex($cp)), strtoupper(dechex($l1)), strtoupper(dechex($h1)), strtoupper(dechex($l2)), strtoupper(dechex($h2))); + } + else { + $toUnistring .= sprintf("<%02s> <%04s>\n", strtoupper(dechex($cp)), strtoupper(dechex($u))); + } + } + + //Additional Type1 or TrueType font + $this->_newobj(); + $this->_out('<</Type /Font'); + $this->_out('/BaseFont /'.$subsetname); + $this->_out('/Subtype /TrueType'); + $this->_out('/FirstChar 0 /LastChar '.(count($font['subsets'][$sfid])-1)); + $this->_out('/Widths '.($this->n+1).' 0 R'); + $this->_out('/FontDescriptor '.($this->n+2).' 0 R'); + $this->_out('/ToUnicode '.($this->n + 3).' 0 R'); + $this->_out('>>'); + $this->_out('endobj'); + + //Widths + $this->_newobj(); + $this->_out('['.$widthstring.']'); + $this->_out('endobj'); + + //Descriptor + $this->_newobj(); + $s='<</Type /FontDescriptor /FontName /'.$subsetname."\n"; + foreach($font['desc'] as $kd=>$v) { + if ($kd == 'Flags') { $v = $v | 4; $v = $v & ~32; } // SYMBOLIC font flag + $s.=' /'.$kd.' '.$v."\n"; + } + $s.='/FontFile2 '.($this->n + 2).' 0 R'; + $this->_out($s.'>>'); + $this->_out('endobj'); + + // ToUnicode + $this->_newobj(); + $toUni = "/CIDInit /ProcSet findresource begin\n"; + $toUni .= "12 dict begin\n"; + $toUni .= "begincmap\n"; + $toUni .= "/CIDSystemInfo\n"; + $toUni .= "<</Registry (Adobe)\n"; + $toUni .= "/Ordering (UCS)\n"; + $toUni .= "/Supplement 0\n"; + $toUni .= ">> def\n"; + $toUni .= "/CMapName /Adobe-Identity-UCS def\n"; + $toUni .= "/CMapType 2 def\n"; + $toUni .= "1 begincodespacerange\n"; + $toUni .= "<00> <FF>\n"; + $toUni .= "endcodespacerange\n"; + $toUni .= count($font['subsets'][$sfid])." beginbfchar\n"; + $toUni .= $toUnistring; + $toUni .= "endbfchar\n"; + $toUni .= "endcmap\n"; + $toUni .= "CMapName currentdict /CMap defineresource pop\n"; + $toUni .= "end\n"; + $toUni .= "end\n"; + + $this->_out('<</Length '.(strlen($toUni)).'>>'); + $this->_putstream($toUni); + $this->_out('endobj'); + + //Font file + $this->_newobj(); + $this->_out('<</Length '.strlen($fontstream)); + $this->_out('/Filter /FlateDecode'); + $this->_out('/Length1 '.$ttfontsize); + $this->_out('>>'); + $this->_putstream($fontstream); + $this->_out('endobj'); + } // foreach subset + unset($ttf); + } + // TrueType embedded SUBSETS or FULL + else if ($type=='TTF') { + $this->fonts[$k]['n']=$this->n+1; + if ($asSubset ) { + $ssfaid="A"; + if (!class_exists('TTFontFile', false)) { include(_MPDF_PATH .'classes/ttfontsuni.php'); } + $ttf = new TTFontFile(); + $fontname = 'MPDFA'.$ssfaid.'+'.$font['name']; + $subset = $font['subset']; + unset($subset[0]); + $ttfontstream = $ttf->makeSubset($font['ttffile'], $subset, $font['TTCfontID'], $this->debugfonts, $font['unAGlyphs']); // mPDF 5.4.05 + $ttfontsize = strlen($ttfontstream); + $fontstream = gzcompress($ttfontstream); + $codeToGlyph = $ttf->codeToGlyph; + unset($codeToGlyph[0]); + } + else { $fontname = $font['name']; } + // Type0 Font + // A composite font - a font composed of other fonts, organized hierarchically + $this->_newobj(); + $this->_out('<</Type /Font'); + $this->_out('/Subtype /Type0'); + $this->_out('/BaseFont /'.$fontname.''); + $this->_out('/Encoding /Identity-H'); + $this->_out('/DescendantFonts ['.($this->n + 1).' 0 R]'); + $this->_out('/ToUnicode '.($this->n + 2).' 0 R'); + $this->_out('>>'); + $this->_out('endobj'); + + // CIDFontType2 + // A CIDFont whose glyph descriptions are based on TrueType font technology + $this->_newobj(); + $this->_out('<</Type /Font'); + $this->_out('/Subtype /CIDFontType2'); + $this->_out('/BaseFont /'.$fontname.''); + $this->_out('/CIDSystemInfo '.($this->n + 2).' 0 R'); + $this->_out('/FontDescriptor '.($this->n + 3).' 0 R'); + if (isset($font['desc']['MissingWidth'])){ + $this->_out('/DW '.$font['desc']['MissingWidth'].''); + } + + if (!$asSubset && file_exists(_MPDF_TTFONTDATAPATH.$font['fontkey'].'.cw')) { + $w = ''; + $w=file_get_contents(_MPDF_TTFONTDATAPATH.$font['fontkey'].'.cw'); + $this->_out($w); + } + else { + $this->_putTTfontwidths($font, $asSubset, $ttf->maxUni); + } + + $this->_out('/CIDToGIDMap '.($this->n + 4).' 0 R'); + $this->_out('>>'); + $this->_out('endobj'); + + // ToUnicode + $this->_newobj(); + $toUni = "/CIDInit /ProcSet findresource begin\n"; + $toUni .= "12 dict begin\n"; + $toUni .= "begincmap\n"; + $toUni .= "/CIDSystemInfo\n"; + $toUni .= "<</Registry (Adobe)\n"; + $toUni .= "/Ordering (UCS)\n"; + $toUni .= "/Supplement 0\n"; + $toUni .= ">> def\n"; + $toUni .= "/CMapName /Adobe-Identity-UCS def\n"; + $toUni .= "/CMapType 2 def\n"; + $toUni .= "1 begincodespacerange\n"; + $toUni .= "<0000> <FFFF>\n"; + $toUni .= "endcodespacerange\n"; + $toUni .= "1 beginbfrange\n"; + $toUni .= "<0000> <FFFF> <0000>\n"; + $toUni .= "endbfrange\n"; + $toUni .= "endcmap\n"; + $toUni .= "CMapName currentdict /CMap defineresource pop\n"; + $toUni .= "end\n"; + $toUni .= "end\n"; + $this->_out('<</Length '.(strlen($toUni)).'>>'); + $this->_putstream($toUni); + $this->_out('endobj'); + + + // CIDSystemInfo dictionary + $this->_newobj(); + $this->_out('<</Registry (Adobe)'); + $this->_out('/Ordering (UCS)'); + $this->_out('/Supplement 0'); + $this->_out('>>'); + $this->_out('endobj'); + + // Font descriptor + $this->_newobj(); + $this->_out('<</Type /FontDescriptor'); + $this->_out('/FontName /'.$fontname); + foreach($font['desc'] as $kd=>$v) { + if ($asSubset && $kd == 'Flags') { $v = $v | 4; $v = $v & ~32; } // SYMBOLIC font flag + $this->_out(' /'.$kd.' '.$v); + } + if ($font['panose']) { + $this->_out(' /Style << /Panose <'.$font['panose'].'> >>'); + } + if ($asSubset ) { + $this->_out('/FontFile2 '.($this->n + 2).' 0 R'); + } + else if ($font['fontkey']) { + // obj ID of a stream containing a TrueType font program + $this->_out('/FontFile2 '.$this->FontFiles[$font['fontkey']]['n'].' 0 R'); + } + $this->_out('>>'); + $this->_out('endobj'); + + // Embed CIDToGIDMap + // A specification of the mapping from CIDs to glyph indices + if ($asSubset ) { + $cidtogidmap = ''; + $cidtogidmap = str_pad('', 256*256*2, "\x00"); + foreach($codeToGlyph as $cc=>$glyph) { + $cidtogidmap[$cc*2] = chr($glyph >> 8); + $cidtogidmap[$cc*2 + 1] = chr($glyph & 0xFF); + } + $cidtogidmap = gzcompress($cidtogidmap); + } + else { + // First see if there is a cached CIDToGIDMapfile + $cidtogidmap = ''; + if (file_exists(_MPDF_TTFONTDATAPATH.$font['fontkey'].'.cgm')) { + $f=fopen(_MPDF_TTFONTDATAPATH.$font['fontkey'].'.cgm','rb'); + while(!feof($f)) { $cidtogidmap .= fread($f, 2048); } + fclose($f); + } + else { + if (!class_exists('TTFontFile', false)) { include(_MPDF_PATH .'classes/ttfontsuni.php'); } + $ttf = new TTFontFile(); + $charToGlyph = $ttf->getCTG($font['ttffile'], $font['TTCfontID'], $this->debugfonts, $font['unAGlyphs']); // mPDF 5.4.05 + $cidtogidmap = str_pad('', 256*256*2, "\x00"); + foreach($charToGlyph as $cc=>$glyph) { + $cidtogidmap[$cc*2] = chr($glyph >> 8); + $cidtogidmap[$cc*2 + 1] = chr($glyph & 0xFF); + } + unset($ttf); + $cidtogidmap = gzcompress($cidtogidmap); + if (is_writable(dirname(_MPDF_TTFONTDATAPATH.'x'))) { + $fh = fopen(_MPDF_TTFONTDATAPATH.$font['fontkey'].'.cgm',"wb"); + fwrite($fh,$cidtogidmap,strlen($cidtogidmap)); + fclose($fh); + } + } + } + $this->_newobj(); + $this->_out('<</Length '.strlen($cidtogidmap).''); + $this->_out('/Filter /FlateDecode'); + $this->_out('>>'); + $this->_putstream($cidtogidmap); + $this->_out('endobj'); + + //Font file + if ($asSubset ) { + $this->_newobj(); + $this->_out('<</Length '.strlen($fontstream)); + $this->_out('/Filter /FlateDecode'); + $this->_out('/Length1 '.$ttfontsize); + $this->_out('>>'); + $this->_putstream($fontstream); + $this->_out('endobj'); + unset($ttf); + } + } + else { $this->Error('Unsupported font type: '.$type.' ('.$name.')'); } + } +} + + + +function _putTTfontwidths(&$font, $asSubset, $maxUni) { + if ($asSubset && file_exists(_MPDF_TTFONTDATAPATH.$font['fontkey'].'.cw127.php')) { + include(_MPDF_TTFONTDATAPATH.$font['fontkey'].'.cw127.php') ; + $startcid = 128; + } + else { + $rangeid = 0; + $range = array(); + $prevcid = -2; + $prevwidth = -1; + $interval = false; + $startcid = 1; + } + if ($asSubset) { $cwlen = $maxUni + 1; } + else { $cwlen = (strlen($font['cw'])/2); } + + // for each character + for ($cid=$startcid; $cid<$cwlen; $cid++) { + if ($cid==128 && $asSubset && (!file_exists(_MPDF_TTFONTDATAPATH.$font['fontkey'].'.cw127.php'))) { + if (is_writable(dirname(_MPDF_TTFONTDATAPATH.'x'))) { + $fh = fopen(_MPDF_TTFONTDATAPATH.$font['fontkey'].'.cw127.php',"wb"); + $cw127='<?php'."\n"; + $cw127.='$rangeid='.$rangeid.";\n"; + $cw127.='$prevcid='.$prevcid.";\n"; + $cw127.='$prevwidth='.$prevwidth.";\n"; + if ($interval) { $cw127.='$interval=true'.";\n"; } + else { $cw127.='$interval=false'.";\n"; } + $cw127.='$range='.var_export($range,true).";\n"; + $cw127.="?>"; + fwrite($fh,$cw127,strlen($cw127)); + fclose($fh); + } + } + if ($font['cw'][$cid*2] == "\00" && $font['cw'][$cid*2+1] == "\00") { continue; } + $width = (ord($font['cw'][$cid*2]) << 8) + ord($font['cw'][$cid*2+1]); + if ($width == 65535) { $width = 0; } + if ($asSubset && $cid > 255 && (!isset($font['subset'][$cid]) || !$font['subset'][$cid])) { + continue; + } + if (!isset($font['dw']) || (isset($font['dw']) && $width != $font['dw'])) { + if ($cid == ($prevcid + 1)) { + // consecutive CID + if ($width == $prevwidth) { + if ($width == $range[$rangeid][0]) { + $range[$rangeid][] = $width; + } else { + array_pop($range[$rangeid]); + // new range + $rangeid = $prevcid; + $range[$rangeid] = array(); + $range[$rangeid][] = $prevwidth; + $range[$rangeid][] = $width; + } + $interval = true; + $range[$rangeid]['interval'] = true; + } else { + if ($interval) { + // new range + $rangeid = $cid; + $range[$rangeid] = array(); + $range[$rangeid][] = $width; + } else { + $range[$rangeid][] = $width; + } + $interval = false; + } + } else { + // new range + $rangeid = $cid; + $range[$rangeid] = array(); + $range[$rangeid][] = $width; + $interval = false; + } + $prevcid = $cid; + $prevwidth = $width; + } + } + $w = $this->_putfontranges($range); + $this->_out($w); + if (!$asSubset) { + if (is_writable(dirname(_MPDF_TTFONTDATAPATH.'x'))) { + $fh = fopen(_MPDF_TTFONTDATAPATH.$font['fontkey'].'.cw',"wb"); + fwrite($fh,$w,strlen($w)); + fclose($fh); + } + } +} + +function _putfontranges(&$range) { + // optimize ranges + $prevk = -1; + $nextk = -1; + $prevint = false; + foreach ($range as $k => $ws) { + $cws = count($ws); + if (($k == $nextk) AND (!$prevint) AND ((!isset($ws['interval'])) OR ($cws < 4))) { + if (isset($range[$k]['interval'])) { + unset($range[$k]['interval']); + } + $range[$prevk] = array_merge($range[$prevk], $range[$k]); + unset($range[$k]); + } else { + $prevk = $k; + } + $nextk = $k + $cws; + if (isset($ws['interval'])) { + if ($cws > 3) { + $prevint = true; + } else { + $prevint = false; + } + unset($range[$k]['interval']); + --$nextk; + } else { + $prevint = false; + } + } + // output data + $w = ''; + foreach ($range as $k => $ws) { + if (count(array_count_values($ws)) == 1) { + // interval mode is more compact + $w .= ' '.$k.' '.($k + count($ws) - 1).' '.$ws[0]; + } else { + // range mode + $w .= ' '.$k.' [ '.implode(' ', $ws).' ]' . "\n"; + } + } + return '/W ['.$w.' ]'; +} + + +function _putfontwidths(&$font, $cidoffset=0) { + ksort($font['cw']); + unset($font['cw'][65535]); + $rangeid = 0; + $range = array(); + $prevcid = -2; + $prevwidth = -1; + $interval = false; + // for each character + foreach ($font['cw'] as $cid => $width) { + $cid -= $cidoffset; + if (!isset($font['dw']) || (isset($font['dw']) && $width != $font['dw'])) { + if ($cid == ($prevcid + 1)) { + // consecutive CID + if ($width == $prevwidth) { + if ($width == $range[$rangeid][0]) { + $range[$rangeid][] = $width; + } else { + array_pop($range[$rangeid]); + // new range + $rangeid = $prevcid; + $range[$rangeid] = array(); + $range[$rangeid][] = $prevwidth; + $range[$rangeid][] = $width; + } + $interval = true; + $range[$rangeid]['interval'] = true; + } else { + if ($interval) { + // new range + $rangeid = $cid; + $range[$rangeid] = array(); + $range[$rangeid][] = $width; + } else { + $range[$rangeid][] = $width; + } + $interval = false; + } + } else { + // new range + $rangeid = $cid; + $range[$rangeid] = array(); + $range[$rangeid][] = $width; + $interval = false; + } + $prevcid = $cid; + $prevwidth = $width; + } + } + $this->_out($this->_putfontranges($range)); +} + + +/*-- CJK-FONTS --*/ + +// from class PDF_Chinese CJK EXTENSIONS +function _putType0(&$font) +{ + //Type0 + $this->_out('/Subtype /Type0'); + $this->_out('/BaseFont /'.$font['name'].'-'.$font['CMap']); + $this->_out('/Encoding /'.$font['CMap']); + $this->_out('/DescendantFonts ['.($this->n+1).' 0 R]'); + $this->_out('>>'); + $this->_out('endobj'); + //CIDFont + $this->_newobj(); + $this->_out('<</Type /Font'); + $this->_out('/Subtype /CIDFontType0'); + $this->_out('/BaseFont /'.$font['name']); + + $cidinfo = '/Registry '.$this->_textstring('Adobe'); + $cidinfo .= ' /Ordering '.$this->_textstring($font['registry']['ordering']); + $cidinfo .= ' /Supplement '.$font['registry']['supplement']; + $this->_out('/CIDSystemInfo <<'.$cidinfo.'>>'); + + $this->_out('/FontDescriptor '.($this->n+1).' 0 R'); + if (isset($font['MissingWidth'])){ + $this->_out('/DW '.$font['MissingWidth'].''); + } + $this->_putfontwidths($font, 31); + $this->_out('>>'); + $this->_out('endobj'); + + //Font descriptor + $this->_newobj(); + $s = '<</Type /FontDescriptor /FontName /'.$font['name']; + foreach ($font['desc'] as $k => $v) { + if ($k != 'Style') { + $s .= ' /'.$k.' '.$v.''; + } + } + $this->_out($s.'>>'); + $this->_out('endobj'); +} +/*-- END CJK-FONTS --*/ + + + +function _putimages() +{ + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + reset($this->images); + while(list($file,$info)=each($this->images)) { + $this->_newobj(); + $this->images[$file]['n']=$this->n; + $this->_out('<</Type /XObject'); + $this->_out('/Subtype /Image'); + $this->_out('/Width '.$info['w']); + $this->_out('/Height '.$info['h']); + if (isset($info['masked'])) { + $this->_out('/SMask '.($this->n - 1).' 0 R'); + } + if($info['cs']=='Indexed') { + if ($this->PDFX || ($this->PDFA && $this->restrictColorSpace==3)) { $this->Error("PDFA1-b and PDFX/1-a files do not permit using mixed colour space (".$file.")."); } + $this->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->n+1).' 0 R]'); + } + else { + $this->_out('/ColorSpace /'.$info['cs']); + if($info['cs']=='DeviceCMYK') { + if ($this->PDFA && $this->restrictColorSpace!=3) { $this->Error("PDFA1-b does not permit Images using mixed colour space (".$file.")."); } + if($info['type']=='jpg') { $this->_out('/Decode [1 0 1 0 1 0 1 0]'); } + } + else if ($info['cs']=='DeviceRGB' && ($this->PDFX || ($this->PDFA && $this->restrictColorSpace==3))) { $this->Error("PDFA1-b and PDFX/1-a files do not permit using mixed colour space (".$file.")."); } + } + $this->_out('/BitsPerComponent '.$info['bpc']); + if (isset($info['f']) && $info['f']) { $this->_out('/Filter /'.$info['f']); } + if(isset($info['parms'])) { $this->_out($info['parms']); } + if(isset($info['trns']) and is_array($info['trns'])) { + $trns=''; + for($i=0;$i<count($info['trns']);$i++) + $trns.=$info['trns'][$i].' '.$info['trns'][$i].' '; + $this->_out('/Mask ['.$trns.']'); + } + $this->_out('/Length '.strlen($info['data']).'>>'); + $this->_putstream($info['data']); + + unset($this->images[$file]['data']); + $this->_out('endobj'); + //Palette + if($info['cs']=='Indexed') { + $this->_newobj(); + $pal=($this->compress) ? gzcompress($info['pal']) : $info['pal']; + $this->_out('<<'.$filter.'/Length '.strlen($pal).'>>'); + $this->_putstream($pal); + $this->_out('endobj'); + } + } +} + +function _putinfo() +{ + $this->_out('/Producer '.$this->_UTF16BEtextstring('mPDF '.mPDF_VERSION)); + if(!empty($this->title)) + $this->_out('/Title '.$this->_UTF16BEtextstring($this->title)); + if(!empty($this->subject)) + $this->_out('/Subject '.$this->_UTF16BEtextstring($this->subject)); + if(!empty($this->author)) + $this->_out('/Author '.$this->_UTF16BEtextstring($this->author)); + if(!empty($this->keywords)) + $this->_out('/Keywords '.$this->_UTF16BEtextstring($this->keywords)); + if(!empty($this->creator)) + $this->_out('/Creator '.$this->_UTF16BEtextstring($this->creator)); + + $z = date('O'); // +0200 + $offset = substr($z,0,3)."'".substr($z,3,2)."'"; + $this->_out('/CreationDate '.$this->_textstring(date('YmdHis').$offset)); + $this->_out('/ModDate '.$this->_textstring(date('YmdHis').$offset)); + if ($this->PDFX) { + $this->_out('/Trapped/False'); + $this->_out('/GTS_PDFXVersion(PDF/X-1a:2003)'); + } +} + +function _putmetadata() { + $this->_newobj(); + $this->MetadataRoot = $this->n; + $Producer = 'mPDF '.mPDF_VERSION; + $z = date('O'); // +0200 + $offset = substr($z,0,3).':'.substr($z,3,2); + $CreationDate = date('Y-m-d\TH:i:s').$offset; // 2006-03-10T10:47:26-05:00 2006-06-19T09:05:17Z + $uuid = sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), mt_rand(0, 0xffff), + mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000, mt_rand(0, 0x3fff) | 0x8000, + mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff) ); + + + $m = '<?xpacket begin="'.chr(239).chr(187).chr(191).'" id="W5M0MpCehiHzreSzNTczkc9d"?>'."\n"; // begin = FEFF BOM + $m .= ' <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="3.1-701">'."\n"; + $m .= ' <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">'."\n"; + $m .= ' <rdf:Description rdf:about="uuid:'.$uuid.'" xmlns:pdf="http://ns.adobe.com/pdf/1.3/">'."\n"; + $m .= ' <pdf:Producer>'.$Producer.'</pdf:Producer>'."\n"; + if(!empty($this->keywords)) { $m .= ' <pdf:Keywords>'.$this->keywords.'</pdf:Keywords>'."\n"; } + $m .= ' </rdf:Description>'."\n"; + + $m .= ' <rdf:Description rdf:about="uuid:'.$uuid.'" xmlns:xmp="http://ns.adobe.com/xap/1.0/">'."\n"; + $m .= ' <xmp:CreateDate>'.$CreationDate.'</xmp:CreateDate>'."\n"; + $m .= ' <xmp:ModifyDate>'.$CreationDate.'</xmp:ModifyDate>'."\n"; + $m .= ' <xmp:MetadataDate>'.$CreationDate.'</xmp:MetadataDate>'."\n"; + if(!empty($this->creator)) { $m .= ' <xmp:CreatorTool>'.$this->creator.'</xmp:CreatorTool>'."\n"; } + $m .= ' </rdf:Description>'."\n"; + + // DC elements + $m .= ' <rdf:Description rdf:about="uuid:'.$uuid.'" xmlns:dc="http://purl.org/dc/elements/1.1/">'."\n"; + $m .= ' <dc:format>application/pdf</dc:format>'."\n"; + if(!empty($this->title)) { + $m .= ' <dc:title> + <rdf:Alt> + <rdf:li xml:lang="x-default">'.$this->title.'</rdf:li> + </rdf:Alt> + </dc:title>'."\n"; + } + if(!empty($this->keywords)) { + $m .= ' <dc:subject> + <rdf:Bag> + <rdf:li>'.$this->keywords.'</rdf:li> + </rdf:Bag> + </dc:subject>'."\n"; + } + if(!empty($this->subject)) { + $m .= ' <dc:description> + <rdf:Alt> + <rdf:li xml:lang="x-default">'.$this->subject.'</rdf:li> + </rdf:Alt> + </dc:description>'."\n"; + } + if(!empty($this->author)) { + $m .= ' <dc:creator> + <rdf:Seq> + <rdf:li>'.$this->author.'</rdf:li> + </rdf:Seq> + </dc:creator>'."\n"; + } + $m .= ' </rdf:Description>'."\n"; + + + // This bit is specific to PDFX-1a + if ($this->PDFX) { + $m .= ' <rdf:Description rdf:about="uuid:'.$uuid.'" xmlns:pdfx="http://ns.adobe.com/pdfx/1.3/" pdfx:Apag_PDFX_Checkup="1.3" pdfx:GTS_PDFXConformance="PDF/X-1a:2003" pdfx:GTS_PDFXVersion="PDF/X-1:2003"/>'."\n"; + } + + // This bit is specific to PDFA-1b + else if ($this->PDFA) { + $m .= ' <rdf:Description rdf:about="uuid:'.$uuid.'" xmlns:pdfaid="http://www.aiim.org/pdfa/ns/id/" >'."\n"; + $m .= ' <pdfaid:part>1</pdfaid:part>'."\n"; + $m .= ' <pdfaid:conformance>B</pdfaid:conformance>'."\n"; + $m .= ' <pdfaid:amd>2005</pdfaid:amd>'."\n"; + $m .= ' </rdf:Description>'."\n"; + } + + $m .= ' <rdf:Description rdf:about="uuid:'.$uuid.'" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/">'."\n"; + $m .= ' <xmpMM:DocumentID>uuid:'.$uuid.'</xmpMM:DocumentID>'."\n"; + $m .= ' </rdf:Description>'."\n"; + $m .= ' </rdf:RDF>'."\n"; + $m .= ' </x:xmpmeta>'."\n"; + $m .= str_repeat(str_repeat(' ',100)."\n",20); // 2-4kB whitespace padding required + $m .= '<?xpacket end="w"?>'; // "r" read only + $this->_out('<</Type/Metadata/Subtype/XML/Length '.strlen($m).'>>'); + $this->_putstream($m); + $this->_out('endobj'); +} + +function _putoutputintent() { + $this->_newobj(); + $this->OutputIntentRoot = $this->n; + $this->_out('<</Type /OutputIntent'); + + if ($this->PDFA) { + $this->_out('/S /GTS_PDFA1'); + if ($this->ICCProfile) { + $this->_out('/Info ('.preg_replace('/_/',' ',$this->ICCProfile).')'); + $this->_out('/OutputConditionIdentifier (Custom)'); + $this->_out('/OutputCondition ()'); + } + else { + $this->_out('/Info (sRGB IEC61966-2.1)'); + $this->_out('/OutputConditionIdentifier (sRGB IEC61966-2.1)'); + $this->_out('/OutputCondition ()'); + } + $this->_out('/DestOutputProfile '.($this->n+1).' 0 R'); + } + else if ($this->PDFX) { // always a CMYK profile + $this->_out('/S /GTS_PDFX'); + if ($this->ICCProfile) { + $this->_out('/Info ('.preg_replace('/_/',' ',$this->ICCProfile).')'); + $this->_out('/OutputConditionIdentifier (Custom)'); + $this->_out('/OutputCondition ()'); + $this->_out('/DestOutputProfile '.($this->n+1).' 0 R'); + } + else { + $this->_out('/Info (CGATS TR 001)'); + $this->_out('/OutputConditionIdentifier (CGATS TR 001)'); + $this->_out('/OutputCondition (CGATS TR 001 (SWOP))'); + $this->_out('/RegistryName (http://www.color.org)'); + } + } + $this->_out('>>'); + $this->_out('endobj'); + + if ($this->PDFX && !$this->ICCProfile) { return; } // no ICCProfile embedded + + $this->_newobj(); + if ($this->ICCProfile) + $s = file_get_contents(_MPDF_PATH.'iccprofiles/'.$this->ICCProfile.'.icc'); + else + $s = file_get_contents(_MPDF_PATH.'iccprofiles/sRGB_IEC61966-2-1.icc'); + if ($this->compress) { $s = gzcompress($s); } + $this->_out('<<'); + if ($this->PDFX || ($this->PDFA && $this->restrictColorSpace == 3)) { $this->_out('/N 4'); } + else { $this->_out('/N 3'); } + if ($this->compress) + $this->_out('/Filter /FlateDecode '); + $this->_out('/Length '.strlen($s).'>>'); + $this->_putstream($s); + $this->_out('endobj'); +} + + +function _putcatalog() { + $this->_out('/Type /Catalog'); + $this->_out('/Pages 1 0 R'); + if($this->ZoomMode=='fullpage') $this->_out('/OpenAction [3 0 R /Fit]'); + elseif($this->ZoomMode=='fullwidth') $this->_out('/OpenAction [3 0 R /FitH null]'); + elseif($this->ZoomMode=='real') $this->_out('/OpenAction [3 0 R /XYZ null null 1]'); + elseif(!is_string($this->ZoomMode)) $this->_out('/OpenAction [3 0 R /XYZ null null '.($this->ZoomMode/100).']'); + else $this->_out('/OpenAction [3 0 R /XYZ null null null]'); + if($this->LayoutMode=='single') $this->_out('/PageLayout /SinglePage'); + elseif($this->LayoutMode=='continuous') $this->_out('/PageLayout /OneColumn'); + elseif($this->LayoutMode=='twoleft') $this->_out('/PageLayout /TwoColumnLeft'); + elseif($this->LayoutMode=='tworight') $this->_out('/PageLayout /TwoColumnRight'); + elseif($this->LayoutMode=='two') { + if ($this->mirrorMargins) { $this->_out('/PageLayout /TwoColumnRight'); } + else { $this->_out('/PageLayout /TwoColumnLeft'); } + } + +/*-- BOOKMARKS --*/ + if(count($this->BMoutlines)>0) { + $this->_out('/Outlines '.$this->OutlineRoot.' 0 R'); + $this->_out('/PageMode /UseOutlines'); + } +/*-- END BOOKMARKS --*/ + if(is_int(strpos($this->DisplayPreferences,'FullScreen'))) $this->_out('/PageMode /FullScreen'); + + // Metadata + if ($this->PDFA || $this->PDFX) { + $this->_out('/Metadata '.$this->MetadataRoot.' 0 R'); + } + // OutputIntents + if ($this->PDFA || $this->PDFX || $this->ICCProfile) { + $this->_out('/OutputIntents ['.$this->OutputIntentRoot.' 0 R]'); + } + +/*-- FORMS --*/ + if (count($this->form->forms)>0) { + $this->form->_putFormsCatalog(); + } +/*-- END FORMS --*/ + if ( isset($this->js) ) { + $this->_out('/Names << /JavaScript '.($this->n_js).' 0 R >> '); + } + + if($this->DisplayPreferences || $this->directionality == 'rtl' || $this->mirrorMargins) { + $this->_out('/ViewerPreferences<<'); + if(is_int(strpos($this->DisplayPreferences,'HideMenubar'))) $this->_out('/HideMenubar true'); + if(is_int(strpos($this->DisplayPreferences,'HideToolbar'))) $this->_out('/HideToolbar true'); + if(is_int(strpos($this->DisplayPreferences,'HideWindowUI'))) $this->_out('/HideWindowUI true'); + if(is_int(strpos($this->DisplayPreferences,'DisplayDocTitle'))) $this->_out('/DisplayDocTitle true'); + if(is_int(strpos($this->DisplayPreferences,'CenterWindow'))) $this->_out('/CenterWindow true'); + if(is_int(strpos($this->DisplayPreferences,'FitWindow'))) $this->_out('/FitWindow true'); + // /PrintScaling is PDF 1.6 spec. + if(is_int(strpos($this->DisplayPreferences,'NoPrintScaling')) && !$this->PDFA && !$this->PDFX) + $this->_out('/PrintScaling /None'); + if($this->directionality == 'rtl') $this->_out('/Direction /R2L'); + // /Duplex is PDF 1.7 spec. + if($this->mirrorMargins && !$this->PDFA && !$this->PDFX) { + // if ($this->DefOrientation=='P') $this->_out('/Duplex /DuplexFlipShortEdge'); + $this->_out('/Duplex /DuplexFlipLongEdge'); // PDF v1.7+ + } + $this->_out('>>'); + } + // mPDF 5.6.01 + if($this->open_layer_pane && ($this->hasOC || count($this->layers))) + $this->_out('/PageMode /UseOC'); + + // mPDF 5.6.01 + if ($this->hasOC || count($this->layers)) { + $p = $v = $h = $l = $loff = $lall = $as = ''; // mPDF 5.6.28 + if ($this->hasOC) { + if (($this->hasOC & 1) == 1) $p=$this->n_ocg_print.' 0 R'; + if (($this->hasOC & 2) == 2) $v=$this->n_ocg_view.' 0 R'; + if (($this->hasOC & 4) == 4) $h=$this->n_ocg_hidden.' 0 R'; + $as="<</Event /Print /OCGs [$p $v $h] /Category [/Print]>> <</Event /View /OCGs [$p $v $h] /Category [/View]>>"; + } + + if(count($this->layers)) { + foreach($this->layers as $k=>$layer) { // mPDF 5.6.28 + if (strtolower($this->layerDetails[$k]['state'])=='hidden') { $loff .= $layer['n'].' 0 R '; } + else { $l .= $layer['n'].' 0 R '; } + $lall .= $layer['n'].' 0 R '; + } + } + $this->_out("/OCProperties <</OCGs [$p $v $h $lall] /D <</ON [$p $l] /OFF [$v $h $loff] "); // mPDF 5.6.28 + $this->_out("/Order [$v $p $h $lall] "); // mPDF 5.6.28 + if ($as) $this->_out("/AS [$as] "); + $this->_out(">>>>"); + + } + +} + +// Inactive function left for backwards compatability +function SetUserRights($enable=true, $annots="", $form="", $signature="") { + // Does nothing +} + +function _enddoc() { + if ($this->progressBar) { $this->UpdateProgressBar(2,'10','Writing Headers & Footers'); } // *PROGRESS-BAR* + $this->_puthtmlheaders(); // *HTMLHEADERS-FOOTERS* + if ($this->progressBar) { $this->UpdateProgressBar(2,'20','Writing Pages'); } // *PROGRESS-BAR* + // Remove references to unused fonts (usually default font) + foreach($this->fonts as $fk=>$font) { + if (!$font['used'] && ($font['type']=='TTF')) { + if ($font['sip'] || $font['smp']) { + foreach($font['subsetfontids'] AS $k => $fid) { + foreach($this->pages AS $pn=>$page) { + $this->pages[$pn] = preg_replace('/\s\/F'.$fid.' \d[\d.]* Tf\s/is',' ',$this->pages[$pn]); + } + } + } + else { + foreach($this->pages AS $pn=>$page) { + $this->pages[$pn] = preg_replace('/\s\/F'.$font['i'].' \d[\d.]* Tf\s/is',' ',$this->pages[$pn]); + } + } + } + } + + // mPDF 5.6.01 - LAYERS + if (count($this->layers)) { + foreach($this->pages AS $pn=>$page) { + preg_match_all('/\/OCZ-index \/ZI(\d+) BDC(.*?)(EMCZ)-index/is',$this->pages[$pn],$m1); + preg_match_all('/\/OCBZ-index \/ZI(\d+) BDC(.*?)(EMCBZ)-index/is',$this->pages[$pn],$m2); + preg_match_all('/\/OCGZ-index \/ZI(\d+) BDC(.*?)(EMCGZ)-index/is',$this->pages[$pn],$m3); + $m = array(); + for ($i=0;$i<4;$i++) { + $m[$i] = array_merge($m1[$i],$m2[$i],$m3[$i]); + } + if (count($m[0])) { + $sortarr = array(); + for($i=0;$i<count($m[0]);$i++) { + $key = $m[1][$i]*2; + if ($m[3][$i]=='EMCZ') $key +=2; // background first then gradient then normal + else if ($m[3][$i]=='EMCGZ') $key +=1; + $sortarr[$i] = $key; + } + asort($sortarr); + foreach($sortarr AS $i=>$k) { + $this->pages[$pn] = str_replace($m[0][$i],'',$this->pages[$pn] ); + $this->pages[$pn] .= "\n".$m[0][$i]."\n"; + } + $this->pages[$pn] = preg_replace('/\/OC[BG]{0,1}Z-index \/ZI(\d+) BDC/is','/OC /ZI\\1 BDC ',$this->pages[$pn]); + $this->pages[$pn] = preg_replace('/EMC[BG]{0,1}Z-index/is','EMC',$this->pages[$pn]); + } + } + } + + $this->_putpages(); + if ($this->progressBar) { $this->UpdateProgressBar(2,'30','Writing document resources'); } // *PROGRESS-BAR* + + $this->_putresources(); + //Info + $this->_newobj(); + $this->InfoRoot = $this->n; + $this->_out('<<'); + if ($this->progressBar) { $this->UpdateProgressBar(2,'80','Writing document info'); } // *PROGRESS-BAR* + $this->_putinfo(); + $this->_out('>>'); + $this->_out('endobj'); + + // METADATA + if ($this->PDFA || $this->PDFX) { $this->_putmetadata(); } + // OUTPUTINTENT + if ($this->PDFA || $this->PDFX || $this->ICCProfile) { $this->_putoutputintent(); } + + //Catalog + $this->_newobj(); + $this->_out('<<'); + if ($this->progressBar) { $this->UpdateProgressBar(2,'90','Writing document catalog'); } // *PROGRESS-BAR* + $this->_putcatalog(); + $this->_out('>>'); + $this->_out('endobj'); + //Cross-ref + $o=strlen($this->buffer); + $this->_out('xref'); + $this->_out('0 '.($this->n+1)); + $this->_out('0000000000 65535 f '); + for($i=1; $i <= $this->n ; $i++) + $this->_out(sprintf('%010d 00000 n ',$this->offsets[$i])); + //Trailer + $this->_out('trailer'); + $this->_out('<<'); + $this->_puttrailer(); + $this->_out('>>'); + $this->_out('startxref'); + $this->_out($o); + + $this->buffer .= '%%EOF'; + $this->state=3; +/*-- IMPORTS --*/ + + if ($this->enableImports && count($this->parsers) > 0) { + foreach ($this->parsers as $k => $_){ + $this->parsers[$k]->closeFile(); + $this->parsers[$k] = null; + unset($this->parsers[$k]); + } + } +/*-- END IMPORTS --*/ +} + +function _beginpage($orientation,$mgl='',$mgr='',$mgt='',$mgb='',$mgh='',$mgf='',$ohname='',$ehname='',$ofname='',$efname='',$ohvalue=0,$ehvalue=0,$ofvalue=0,$efvalue=0,$pagesel='',$newformat='') { + if (!($pagesel && $this->page==1 && (sprintf("%0.4f", $this->y)==sprintf("%0.4f", $this->tMargin)))) { + $this->page++; + $this->pages[$this->page]=''; + } + $this->state=2; + $resetHTMLHeadersrequired = false; + + if ($newformat) { $this->_setPageSize($newformat, $orientation); } +/*-- CSS-PAGE --*/ + // Paged media (page-box) + + if ($pagesel || (isset($this->page_box['using']) && $this->page_box['using'])) { + if ($pagesel || $this->page==1) { $first = true; } + else { $first = false; } + if ($this->mirrorMargins && ($this->page % 2==0)) { $oddEven = 'E'; } + else { $oddEven = 'O'; } + if ($pagesel) { $psel = $pagesel; } + else if ($this->page_box['current']) { $psel = $this->page_box['current']; } + else { $psel = ''; } + list($orientation,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf,$hname,$fname,$bg,$resetpagenum,$pagenumstyle,$suppress,$marks,$newformat) = $this->SetPagedMediaCSS($psel, $first, $oddEven); + if ($this->mirrorMargins && ($this->page % 2==0)) { + if ($hname) { $ehvalue = 1; $ehname = $hname; } else { $ehvalue = -1; } + if ($fname) { $efvalue = 1; $efname = $fname; } else { $efvalue = -1; } + } + else { + if ($hname) { $ohvalue = 1; $ohname = $hname; } else { $ohvalue = -1; } + if ($fname) { $ofvalue = 1; $ofname = $fname; } else { $ofvalue = -1; } + } + if ($resetpagenum || $pagenumstyle || $suppress) { + $this->PageNumSubstitutions[] = array('from'=>($this->page), 'reset'=> $resetpagenum, 'type'=>$pagenumstyle, 'suppress'=>$suppress); + } + // PAGED MEDIA - CROP / CROSS MARKS from @PAGE + $this->show_marks = $marks; + + // Background color + if (isset($bg['BACKGROUND-COLOR'])) { + $cor = $this->ConvertColor($bg['BACKGROUND-COLOR']); + if ($cor) { + $this->bodyBackgroundColor = $cor; + } + } + else { $this->bodyBackgroundColor = false; } + +/*-- BACKGROUNDS --*/ + if (isset($bg['BACKGROUND-GRADIENT'])) { + $this->bodyBackgroundGradient = $bg['BACKGROUND-GRADIENT']; + } + else { $this->bodyBackgroundGradient = false; } + + // Tiling Patterns + if (isset($bg['BACKGROUND-IMAGE']) && $bg['BACKGROUND-IMAGE']) { + $ret = $this->SetBackground($bg, $this->pgwidth); + if ($ret) { $this->bodyBackgroundImage = $ret; } + } + else { $this->bodyBackgroundImage = false; } +/*-- END BACKGROUNDS --*/ + + $this->page_box['current'] = $psel; + $this->page_box['using'] = true; + } +/*-- END CSS-PAGE --*/ + + //Page orientation + if(!$orientation) + $orientation=$this->DefOrientation; + else { + $orientation=strtoupper(substr($orientation,0,1)); + if($orientation!=$this->DefOrientation) + $this->OrientationChanges[$this->page]=true; + } + if($orientation!=$this->CurOrientation || $newformat) { + + //Change orientation + if($orientation=='P') { + $this->wPt=$this->fwPt; + $this->hPt=$this->fhPt; + $this->w=$this->fw; + $this->h=$this->fh; + if (($this->forcePortraitHeaders || $this->forcePortraitMargins) && $this->DefOrientation=='P') { + $this->tMargin = $this->orig_tMargin; + $this->bMargin = $this->orig_bMargin; + $this->DeflMargin = $this->orig_lMargin; + $this->DefrMargin = $this->orig_rMargin; + $this->margin_header = $this->orig_hMargin; + $this->margin_footer = $this->orig_fMargin; + } + else { $resetHTMLHeadersrequired = true; } // *HTMLHEADERS-FOOTERS* + } + else { + $this->wPt=$this->fhPt; + $this->hPt=$this->fwPt; + $this->w=$this->fh; + $this->h=$this->fw; + if (($this->forcePortraitHeaders || $this->forcePortraitMargins) && $this->DefOrientation=='P') { + $this->tMargin = $this->orig_lMargin; + $this->bMargin = $this->orig_rMargin; + $this->DeflMargin = $this->orig_bMargin; + $this->DefrMargin = $this->orig_tMargin; + $this->margin_header = $this->orig_hMargin; + $this->margin_footer = $this->orig_fMargin; + } + else { $resetHTMLHeadersrequired = true; } // *HTMLHEADERS-FOOTERS* + + } + $this->CurOrientation=$orientation; + $this->ResetMargins(); + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + $this->PageBreakTrigger=$this->h-$this->bMargin; + } + + $this->pageDim[$this->page]['w']=$this->w ; + $this->pageDim[$this->page]['h']=$this->h ; + + $this->pageDim[$this->page]['outer_width_LR'] = isset($this->page_box['outer_width_LR']) ? $this->page_box['outer_width_LR'] : 0; + $this->pageDim[$this->page]['outer_width_TB'] = isset($this->page_box['outer_width_TB']) ? $this->page_box['outer_width_TB'] : 0; + if (!isset($this->page_box['outer_width_LR']) && !isset($this->page_box['outer_width_TB'])) { + $this->pageDim[$this->page]['bleedMargin'] = 0; + } + else if ($this->bleedMargin <= $this->page_box['outer_width_LR'] && $this->bleedMargin <= $this->page_box['outer_width_TB']) { + $this->pageDim[$this->page]['bleedMargin'] = $this->bleedMargin; + } + else { + $this->pageDim[$this->page]['bleedMargin'] = min($this->page_box['outer_width_LR'], $this->page_box['outer_width_TB'])-0.01; + } + + // If Page Margins are re-defined + // strlen()>0 is used to pick up (integer) 0, (string) '0', or set value + if ((strlen($mgl)>0 && $this->DeflMargin != $mgl) || (strlen($mgr)>0 && $this->DefrMargin != $mgr) || (strlen($mgt)>0 && $this->tMargin != $mgt) || (strlen($mgb)>0 && $this->bMargin != $mgb) || (strlen($mgh)>0 && $this->margin_header!=$mgh) || (strlen($mgf)>0 && $this->margin_footer!=$mgf)) { + if (strlen($mgl)>0) $this->DeflMargin = $mgl; + if (strlen($mgr)>0) $this->DefrMargin = $mgr; + if (strlen($mgt)>0) $this->tMargin = $mgt; + if (strlen($mgb)>0) $this->bMargin = $mgb; + if (strlen($mgh)>0) $this->margin_header=$mgh; + if (strlen($mgf)>0) $this->margin_footer=$mgf; + $this->ResetMargins(); + $this->SetAutoPageBreak($this->autoPageBreak,$this->bMargin); + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + $resetHTMLHeadersrequired = true; // *HTMLHEADERS-FOOTERS* + } + + $this->ResetMargins(); + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + $this->SetAutoPageBreak($this->autoPageBreak,$this->bMargin); + + // Reset column top margin + $this->y0 = $this->tMargin; + + $this->x=$this->lMargin; + $this->y=$this->tMargin; + $this->FontFamily=''; + + // HEADERS AND FOOTERS + if ($ohvalue<0 || strtoupper($ohvalue)=='OFF') { + $this->HTMLHeader = ''; + $this->headerDetails['odd'] = array(); + $resetHTMLHeadersrequired = true; // *HTMLHEADERS-FOOTERS* + } + else if ($ohname && $ohvalue>0) { +/*-- HTMLHEADERS-FOOTERS --*/ + if (preg_match('/^html_(.*)$/i',$ohname,$n)) { + if (isset($this->pageHTMLheaders[$n[1]])) { $this->HTMLHeader = $this->pageHTMLheaders[$n[1]]; } + else { $this->HTMLHeader = ''; } + $this->headerDetails['odd'] = array(); + $resetHTMLHeadersrequired = true; + } + else { +/*-- END HTMLHEADERS-FOOTERS --*/ + if (isset($this->pageheaders[$ohname])) { $this->headerDetails['odd'] = $this->pageheaders[$ohname]; } + else if ($ohname!='_default') { $this->headerDetails['odd'] = array(); } + $this->HTMLHeader = ''; +/*-- HTMLHEADERS-FOOTERS --*/ + $resetHTMLHeadersrequired = false; + } +/*-- END HTMLHEADERS-FOOTERS --*/ + } + + if ($ehvalue<0 || strtoupper($ehvalue)=='OFF') { + $this->HTMLHeaderE = ''; + $this->headerDetails['even'] = array(); + $resetHTMLHeadersrequired = true; // *HTMLHEADERS-FOOTERS* + } + else if ($ehname && $ehvalue>0) { +/*-- HTMLHEADERS-FOOTERS --*/ + if (preg_match('/^html_(.*)$/i',$ehname,$n)) { + if (isset($this->pageHTMLheaders[$n[1]])) { $this->HTMLHeaderE = $this->pageHTMLheaders[$n[1]]; } + else { $this->HTMLHeaderE = ''; } + $this->headerDetails['even'] = array(); + $resetHTMLHeadersrequired = true; + } + else { +/*-- END HTMLHEADERS-FOOTERS --*/ + if (isset($this->pageheaders[$ehname])) { $this->headerDetails['even'] = $this->pageheaders[$ehname]; } + else if ($ehname!='_default') { $this->headerDetails['even'] = array(); } + $this->HTMLHeaderE = ''; +/*-- HTMLHEADERS-FOOTERS --*/ + $resetHTMLHeadersrequired = false; + } +/*-- END HTMLHEADERS-FOOTERS --*/ + } + + if ($ofvalue<0 || strtoupper($ofvalue)=='OFF') { + $this->HTMLFooter = ''; + $this->footerDetails['odd'] = array(); + $resetHTMLHeadersrequired = true; // *HTMLHEADERS-FOOTERS* + } + else if ($ofname && $ofvalue>0) { +/*-- HTMLHEADERS-FOOTERS --*/ + if (preg_match('/^html_(.*)$/i',$ofname,$n)) { + if (isset($this->pageHTMLfooters[$n[1]])) { $this->HTMLFooter = $this->pageHTMLfooters[$n[1]]; } + else { $this->HTMLFooter = ''; } + $this->footerDetails['odd'] = array(); + $resetHTMLHeadersrequired = true; + } + else { +/*-- END HTMLHEADERS-FOOTERS --*/ + if (isset($this->pagefooters[$ofname])) { $this->footerDetails['odd'] = $this->pagefooters[$ofname]; } + else if ($ofname!='_default') { $this->footerDetails['odd'] = array(); } + $this->HTMLFooter = ''; +/*-- HTMLHEADERS-FOOTERS --*/ + $resetHTMLHeadersrequired = true; + } +/*-- END HTMLHEADERS-FOOTERS --*/ + } + + if ($efvalue<0 || strtoupper($efvalue)=='OFF') { + $this->HTMLFooterE = ''; + $this->footerDetails['even'] = array(); + $resetHTMLHeadersrequired = true; // *HTMLHEADERS-FOOTERS* + } + else if ($efname && $efvalue>0) { +/*-- HTMLHEADERS-FOOTERS --*/ + if (preg_match('/^html_(.*)$/i',$efname,$n)) { + if (isset($this->pageHTMLfooters[$n[1]])) { $this->HTMLFooterE = $this->pageHTMLfooters[$n[1]]; } + else { $this->HTMLFooterE = ''; } + $this->footerDetails['even'] = array(); + $resetHTMLHeadersrequired = true; + } + else { +/*-- END HTMLHEADERS-FOOTERS --*/ + if (isset($this->pagefooters[$efname])) { $this->footerDetails['even'] = $this->pagefooters[$efname]; } + else if ($efname!='_default') { $this->footerDetails['even'] = array(); } + $this->HTMLFooterE = ''; +/*-- HTMLHEADERS-FOOTERS --*/ + $resetHTMLHeadersrequired = true; + } +/*-- END HTMLHEADERS-FOOTERS --*/ + } +/*-- HTMLHEADERS-FOOTERS --*/ + if ($resetHTMLHeadersrequired) { + $this->SetHTMLHeader($this->HTMLHeader ); + $this->SetHTMLHeader($this->HTMLHeaderE ,'E'); + $this->SetHTMLFooter($this->HTMLFooter ); + $this->SetHTMLFooter($this->HTMLFooterE ,'E'); + } +/*-- END HTMLHEADERS-FOOTERS --*/ + + + if (($this->mirrorMargins) && (($this->page)%2==0)) { // EVEN + $this->_setAutoHeaderHeight($this->headerDetails['even'], $this->HTMLHeaderE); + $this->_setAutoFooterHeight($this->footerDetails['even'], $this->HTMLFooterE); + } + else { // ODD or DEFAULT + $this->_setAutoHeaderHeight($this->headerDetails['odd'], $this->HTMLHeader); + $this->_setAutoFooterHeight($this->footerDetails['odd'], $this->HTMLFooter); + } + // Reset column top margin + $this->y0 = $this->tMargin; + + $this->x=$this->lMargin; + $this->y=$this->tMargin; +} + + + +function _setAutoHeaderHeight(&$det, &$htmlh) { + if ($this->setAutoTopMargin=='pad') { + if ($htmlh['h']) { $h = $htmlh['h']; } + else if ($det) { $h = $this->_getHFHeight($det,'H'); } + else { $h = 0; } + $this->tMargin = $this->margin_header + $h + $this->orig_tMargin; + } + else if ($this->setAutoTopMargin=='stretch') { + if ($htmlh['h']) { $h = $htmlh['h']; } + else if ($det) { $h = $this->_getHFHeight($det,'H'); } + else { $h = 0; } + $this->tMargin = max($this->orig_tMargin, $this->margin_header + $h + $this->autoMarginPadding); + } +} + + +function _setAutoFooterHeight(&$det, &$htmlf) { + if ($this->setAutoBottomMargin=='pad') { + if ($htmlf['h']) { $h = $htmlf['h']; } + else if ($det) { $h = $this->_getHFHeight($det,'F'); } + else { $h = 0; } + $this->bMargin = $this->margin_footer + $h + $this->orig_bMargin; + $this->PageBreakTrigger=$this->h-$this->bMargin ; + } + else if ($this->setAutoBottomMargin=='stretch') { + if ($htmlf['h']) { $h = $htmlf['h']; } + else if ($det) { $h = $this->_getHFHeight($det,'F'); } + else { $h = 0; } + $this->bMargin = max($this->orig_bMargin, $this->margin_footer + $h + $this->autoMarginPadding); + $this->PageBreakTrigger=$this->h-$this->bMargin ; + } +} + +function _getHFHeight(&$det,$end) { + $h = 0; + if(count($det)) { + foreach(array('L','C','R') AS $pos) { + if (isset($det[$pos]['content']) && $det[$pos]['content']) { + if (isset($det[$pos]['font-size']) && $det[$pos]['font-size']) { $hfsz = $det[$pos]['font-size']; } + else { $hfsz = $this->default_font_size; } + $h = max($h,$hfsz/_MPDFK); + } + } + if ($det['line'] && $end=='H') { $h += $h/_MPDFK*$this->header_line_spacing; } + else if ($det['line'] && $end=='F') { $h += $h/_MPDFK*$this->footer_line_spacing; } + } + return $h; +} + + +function _endpage() { +/*-- CSS-IMAGE-FLOAT --*/ + $this->printfloatbuffer(); +/*-- END CSS-IMAGE-FLOAT --*/ + + if($this->visibility!='visible') + $this->SetVisibility('visible'); + $this->EndLayer(); // mPDF 5.6.01 + //End of page contents + $this->state=1; +} + +function _newobj($obj_id=false,$onlynewobj=false) { + if (!$obj_id) { + $obj_id = ++$this->n; + } + //Begin a new object + if (!$onlynewobj) { + $this->offsets[$obj_id] = strlen($this->buffer); + $this->_out($obj_id.' 0 obj'); + $this->_current_obj_id = $obj_id; // for later use with encryption + } +} + +function _dounderline($x,$y,$txt) { + // Now print line exactly where $y secifies - called from Text() and Cell() - adjust position there + // WORD SPACING + $w =($this->GetStringWidth($txt)*_MPDFK) + ($this->charspacing * mb_strlen( $txt, $this->mb_enc )) + + ( $this->ws * mb_substr_count( $txt, ' ', $this->mb_enc )); + //Draw a line + return sprintf('%.3F %.3F m %.3F %.3F l S',$x*_MPDFK,($this->h-$y)*_MPDFK,($x*_MPDFK)+$w,($this->h-$y)*_MPDFK); +} + + +function _imageError($file, $firsttime, $msg) { + // Save re-trying image URL's which have already failed + $this->failedimages[$file] = true; + if ($firsttime && ($this->showImageErrors || $this->debug)) { + $this->Error("IMAGE Error (".$file."): ".$msg); + } + return false; +} + + +function _getImage(&$file, $firsttime=true, $allowvector=true, $orig_srcpath=false) { + // firsttime i.e. whether to add to this->images - use false when calling iteratively + // Image Data passed directly as var:varname + if (preg_match('/var:\s*(.*)/',$file, $v)) { + $data = $this->$v[1]; + $file = md5($data); + } + // mPDF 5.5.13 + if (preg_match('/data:image\/(gif|jpeg|png);base64,(.*)/',$file, $v)) { + $type = $v[1]; + $data = base64_decode($v[2]); + $file = md5($data); + } + + // mPDF 5.6.02 + if ($firsttime && $file && substr($file,0,5)!='data:') { $file = urlencode_part($file); } + if ($firsttime && $orig_srcpath && substr($orig_srcpath,0,5)!='data:') { $orig_srcpath = urlencode_part($orig_srcpath); } + + $ppUx = 0; + if ($orig_srcpath && isset($this->images[$orig_srcpath])) { $file=$orig_srcpath; return $this->images[$orig_srcpath]; } + if (isset($this->images[$file])) { return $this->images[$file]; } + else if ($orig_srcpath && isset($this->formobjects[$orig_srcpath])) { $file=$orig_srcpath; return $this->formobjects[$file]; } + else if (isset($this->formobjects[$file])) { return $this->formobjects[$file]; } + // Save re-trying image URL's which have already failed + else if ($firsttime && isset($this->failedimages[$file])) { return $this->_imageError($file, $firsttime, ''); } + if (empty($data)) { + $type = ''; + $data = ''; + + if ($orig_srcpath && $this->basepathIsLocal && $check = @fopen($orig_srcpath,"rb")) { + fclose($check); + $file=$orig_srcpath; + $data = file_get_contents($file); + $type = $this->_imageTypeFromString($data); + } + if (!$data && $check = @fopen($file,"rb")) { + fclose($check); + $data = file_get_contents($file); + $type = $this->_imageTypeFromString($data); + } + if ((!$data || !$type) && !ini_get('allow_url_fopen') ) { // only worth trying if remote file and !ini_get('allow_url_fopen') + $this->file_get_contents_by_socket($file, $data); // needs full url?? even on local (never needed for local) + if ($data) { $type = $this->_imageTypeFromString($data); } + } + if ((!$data || !$type) && !ini_get('allow_url_fopen') && function_exists("curl_init")) { + $this->file_get_contents_by_curl($file, $data); // needs full url?? even on local (never needed for local) + if ($data) { $type = $this->_imageTypeFromString($data); } + } + + } + if (!$data) { return $this->_imageError($file, $firsttime, 'Could not find image file'); } + if (empty($type)) { $type = $this->_imageTypeFromString($data); } + if (($type == 'wmf' || $type == 'svg') && !$allowvector) { return $this->_imageError($file, $firsttime, 'WMF or SVG image file not supported in this context'); } + + // SVG + if ($type == 'svg') { + if (!class_exists('SVG', false)) { include(_MPDF_PATH .'classes/svg.php'); } + $svg = new SVG($this); + $family=$this->FontFamily; + $style=$this->FontStyle; + $size=$this->FontSizePt; + $info = $svg->ImageSVG($data); + //Restore font + if($family) $this->SetFont($family,$style,$size,false); + if (!$info) { return $this->_imageError($file, $firsttime, 'Error parsing SVG file'); } + $info['type']='svg'; + $info['i']=count($this->formobjects)+1; + $this->formobjects[$file]=$info; + return $info; + } + + // JPEG + if ($type == 'jpeg' || $type == 'jpg') { + $hdr = $this->_jpgHeaderFromString($data); + if (!$hdr) { return $this->_imageError($file, $firsttime, 'Error parsing JPG header'); } + $a = $this->_jpgDataFromHeader($hdr); + $j = strpos($data,'JFIF'); + if ($j) { + //Read resolution + $unitSp=ord(substr($data,($j+7),1)); + if ($unitSp > 0) { + $ppUx=$this->_twobytes2int(substr($data,($j+8),2)); // horizontal pixels per meter, usually set to zero + if ($unitSp == 2) { // = dots per cm (if == 1 set as dpi) + $ppUx=round($ppUx/10 *25.4); + } + } + } + if ($a[2] == 'DeviceCMYK' && (($this->PDFA && $this->restrictColorSpace!=3) || $this->restrictColorSpace==2)) { + // convert to RGB image + if (!function_exists("gd_info")) { $this->Error("JPG image may not use CMYK color space (".$file.")."); } + if ($this->PDFA && !$this->PDFAauto) { $this->PDFAXwarnings[] = "JPG image may not use CMYK color space - ".$file." - (Image converted to RGB. NB This will alter the colour profile of the image.)"; } + $im = @imagecreatefromstring($data); + if ($im) { + $tempfile = _MPDF_TEMP_PATH.'_tempImgPNG'.RAND(1,10000).'.png'; + imageinterlace($im, false); + $check = @imagepng($im, $tempfile); + if (!$check) { return $this->_imageError($file, $firsttime, 'Error creating temporary file ('.$tempfile.') whilst using GD library to parse JPG(CMYK) image'); } + $info = $this->_getImage($tempfile, false); + if (!$info) { return $this->_imageError($file, $firsttime, 'Error parsing temporary file ('.$tempfile.') created with GD library to parse JPG(CMYK) image'); } + imagedestroy($im); + unlink($tempfile); + $info['type']='jpg'; + if ($firsttime) { + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + return $info; + } + else { return $this->_imageError($file, $firsttime, 'Error creating GD image file from JPG(CMYK) image'); } + } + else if ($a[2] == 'DeviceRGB' && ($this->PDFX || $this->restrictColorSpace==3)) { + // Convert to CMYK image stream - nominally returned as type='png' + $info = $this->_convImage($data, $a[2], 'DeviceCMYK', $a[0], $a[1], $ppUx, false); + if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "JPG image may not use RGB color space - ".$file." - (Image converted to CMYK. NB This will alter the colour profile of the image.)"; } + } + else if (($a[2] == 'DeviceRGB' || $a[2] == 'DeviceCMYK') && $this->restrictColorSpace==1) { + // Convert to Grayscale image stream - nominally returned as type='png' + $info = $this->_convImage($data, $a[2], 'DeviceGray', $a[0], $a[1], $ppUx, false); + } + else { + $info = array('w'=>$a[0],'h'=>$a[1],'cs'=>$a[2],'bpc'=>$a[3],'f'=>'DCTDecode','data'=>$data, 'type'=>'jpg'); + if ($ppUx) { $info['set-dpi'] = $ppUx; } + } + if (!$info) { return $this->_imageError($file, $firsttime, 'Error parsing or converting JPG image'); } + + if ($firsttime) { + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + return $info; + } + + // PNG + else if ($type == 'png') { + //Check signature + if(substr($data,0,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) { + return $this->_imageError($file, $firsttime, 'Error parsing PNG identifier'); + } + //Read header chunk + if(substr($data,12,4)!='IHDR') { + return $this->_imageError($file, $firsttime, 'Incorrect PNG file (no IHDR block found)'); + } + + $w=$this->_fourbytes2int(substr($data,16,4)); + $h=$this->_fourbytes2int(substr($data,20,4)); + $bpc=ord(substr($data,24,1)); + $errpng = false; + $pngalpha = false; + if($bpc>8) { $errpng = 'not 8-bit depth'; } + $ct=ord(substr($data,25,1)); + if($ct==0) { $colspace='DeviceGray'; } + elseif($ct==2) { $colspace='DeviceRGB'; } + elseif($ct==3) { $colspace='Indexed'; } + elseif($ct==4) { $colspace='DeviceGray'; $errpng = 'alpha channel'; $pngalpha = true; } + else { $colspace='DeviceRGB'; $errpng = 'alpha channel'; $pngalpha = true; } + if(ord(substr($data,26,1))!=0) { $errpng = 'compression method'; } + if(ord(substr($data,27,1))!=0) { $errpng = 'filter method'; } + if(ord(substr($data,28,1))!=0) { $errpng = 'interlaced file'; } + $j = strpos($data,'pHYs'); + if ($j) { + //Read resolution + $unitSp=ord(substr($data,($j+12),1)); + if ($unitSp == 1) { + $ppUx=$this->_fourbytes2int(substr($data,($j+4),4)); // horizontal pixels per meter, usually set to zero + $ppUx=round($ppUx/1000 *25.4); + } + } + if (($colspace == 'DeviceRGB' || $colspace == 'Indexed') && ($this->PDFX || $this->restrictColorSpace==3)) { + // Convert to CMYK image stream - nominally returned as type='png' + $info = $this->_convImage($data, $colspace, 'DeviceCMYK', $w, $h, $ppUx, $pngalpha); + if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "PNG image may not use RGB color space - ".$file." - (Image converted to CMYK. NB This will alter the colour profile of the image.)"; } + } + else if (($colspace == 'DeviceRGB' || $colspace == 'Indexed') && $this->restrictColorSpace==1) { + // Convert to Grayscale image stream - nominally returned as type='png' + $info = $this->_convImage($data, $colspace, 'DeviceGray', $w, $h, $ppUx, $pngalpha); + } + else if (($this->PDFA || $this->PDFX) && $pngalpha) { + // Remove alpha channel + if ($this->restrictColorSpace==1) { // Grayscale + $info = $this->_convImage($data, $colspace, 'DeviceGray', $w, $h, $ppUx, $pngalpha); + } + else if ($this->restrictColorSpace==3) { // CMYK + $info = $this->_convImage($data, $colspace, 'DeviceCMYK', $w, $h, $ppUx, $pngalpha); + } + else if ($this->PDFA ) { // RGB + $info = $this->_convImage($data, $colspace, 'DeviceRGB', $w, $h, $ppUx, $pngalpha); + } + if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "Transparency (alpha channel) not permitted in PDFA or PDFX files - ".$file." - (Image converted to one without transparency.)"; } + } + else if ($errpng || $pngalpha) { + if (function_exists('gd_info')) { $gd = gd_info(); } + else {$gd = array(); } + if (!isset($gd['PNG Support'])) { return $this->_imageError($file, $firsttime, 'GD library required for PNG image ('.$errpng.')'); } + $im = imagecreatefromstring($data); + if (!$im) { return $this->_imageError($file, $firsttime, 'Error creating GD image from PNG file ('.$errpng.')'); } + $w = imagesx($im); + $h = imagesy($im); + if ($im) { + $tempfile = _MPDF_TEMP_PATH.'_tempImgPNG'.RAND(1,10000).'.png'; + // Alpha channel set + if ($pngalpha) { + if ($this->PDFA) { $this->Error("PDFA1-b does not permit images with alpha channel transparency (".$file.")."); } + $imgalpha = imagecreate($w, $h); + // generate gray scale pallete + for ($c = 0; $c < 256; ++$c) { ImageColorAllocate($imgalpha, $c, $c, $c); } + // extract alpha channel + $gammacorr = 2.2; // gamma correction + for ($xpx = 0; $xpx < $w; ++$xpx) { + for ($ypx = 0; $ypx < $h; ++$ypx) { + //$colorindex = imagecolorat($im, $xpx, $ypx); + //$col = imagecolorsforindex($im, $colorindex); + //$gamma2 = (pow((((127 - $col['alpha']) * 255 / 127) / 255), $gammacorr) * 255); + $alpha = (imagecolorat($im, $xpx, $ypx) & 0x7F000000) >> 24; + if ($alpha < 127) { + if ($alpha==0) { $gamma = 255; } + else + $gamma = (pow((((127 - $alpha) * 255 / 127) / 255), $gammacorr) * 255); + imagesetpixel($imgalpha, $xpx, $ypx, $gamma); + } + } + } + // create temp alpha file + $tempfile_alpha = _MPDF_TEMP_PATH.'_tempMskPNG'.RAND(1,10000).'.png'; + if (!is_writable($tempfile_alpha)) { + ob_start(); + $check = @imagepng($imgalpha); + if (!$check) { return $this->_imageError($file, $firsttime, 'Error creating temporary image object whilst using GD library to parse PNG image'); } + imagedestroy($imgalpha); + $this->_tempimg = ob_get_contents(); + $this->_tempimglnk = 'var:_tempimg'; + ob_end_clean(); + // extract image without alpha channel + $imgplain = imagecreatetruecolor($w, $h); + imagecopy($imgplain, $im, 0, 0, 0, 0, $w, $h); + // create temp image file + $minfo = $this->_getImage($this->_tempimglnk, false); + if (!$minfo) { return $this->_imageError($file, $firsttime, 'Error parsing temporary file image object created with GD library to parse PNG image'); } + ob_start(); + $check = @imagepng($imgplain); + if (!$check) { return $this->_imageError($file, $firsttime, 'Error creating temporary image object whilst using GD library to parse PNG image'); } + $this->_tempimg = ob_get_contents(); + $this->_tempimglnk = 'var:_tempimg'; + ob_end_clean(); + $info = $this->_getImage($this->_tempimglnk, false); + if (!$info) { return $this->_imageError($file, $firsttime, 'Error parsing temporary file image object created with GD library to parse PNG image'); } + imagedestroy($imgplain); + $imgmask = count($this->images)+1; + $minfo['cs'] = 'DeviceGray'; + $minfo['i']=$imgmask ; + $this->images[$tempfile_alpha] = $minfo; + + } + else { + $check = @imagepng($imgalpha, $tempfile_alpha); + if (!$check) { return $this->_imageError($file, $firsttime, 'Failed to create temporary image file ('.$tempfile_alpha.') parsing PNG image with alpha channel ('.$errpng.')'); } + imagedestroy($imgalpha); + + // extract image without alpha channel + $imgplain = imagecreatetruecolor($w, $h); + imagecopy($imgplain, $im, 0, 0, 0, 0, $w, $h); + + // create temp image file + $check = @imagepng($imgplain, $tempfile); + if (!$check) { return $this->_imageError($file, $firsttime, 'Failed to create temporary image file ('.$tempfile.') parsing PNG image with alpha channel ('.$errpng.')'); } + imagedestroy($imgplain); + // embed mask image + $minfo = $this->_getImage($tempfile_alpha, false); + unlink($tempfile_alpha); + if (!$minfo) { return $this->_imageError($file, $firsttime, 'Error parsing temporary file ('.$tempfile_alpha.') created with GD library to parse PNG image'); } + $imgmask = count($this->images)+1; + $minfo['cs'] = 'DeviceGray'; + $minfo['i']=$imgmask ; + $this->images[$tempfile_alpha] = $minfo; + // embed image, masked with previously embedded mask + $info = $this->_getImage($tempfile, false); + unlink($tempfile); + if (!$info) { return $this->_imageError($file, $firsttime, 'Error parsing temporary file ('.$tempfile.') created with GD library to parse PNG image'); } + + } + $info['masked'] = $imgmask; + if ($ppUx) { $info['set-dpi'] = $ppUx; } + $info['type']='png'; + if ($firsttime) { + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + return $info; + } + else { // No alpha/transparency set + imagealphablending($im, false); + imagesavealpha($im, false); + imageinterlace($im, false); + if (!is_writable($tempfile)) { + ob_start(); + $check = @imagepng($im); + if (!$check) { return $this->_imageError($file, $firsttime, 'Error creating temporary image object whilst using GD library to parse PNG image'); } + $this->_tempimg = ob_get_contents(); + $this->_tempimglnk = 'var:_tempimg'; + ob_end_clean(); + $info = $this->_getImage($this->_tempimglnk, false); + if (!$info) { return $this->_imageError($file, $firsttime, 'Error parsing temporary file image object created with GD library to parse PNG image'); } + imagedestroy($im); + } + else { + $check = @imagepng($im, $tempfile ); + if (!$check) { return $this->_imageError($file, $firsttime, 'Failed to create temporary image file ('.$tempfile.') parsing PNG image ('.$errpng.')'); } + imagedestroy($im); + $info = $this->_getImage($tempfile, false) ; + unlink($tempfile ); + if (!$info) { return $this->_imageError($file, $firsttime, 'Error parsing temporary file ('.$tempfile.') created with GD library to parse PNG image'); } + } + if ($ppUx) { $info['set-dpi'] = $ppUx; } + $info['type']='png'; + if ($firsttime) { + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + return $info; + } + } + } + + else { + $parms='/DecodeParms <</Predictor 15 /Colors '.($ct==2 ? 3 : 1).' /BitsPerComponent '.$bpc.' /Columns '.$w.'>>'; + //Scan chunks looking for palette, transparency and image data + $pal=''; + $trns=''; + $pngdata=''; + $p = 33; + do { + $n=$this->_fourbytes2int(substr($data,$p,4)); $p += 4; + $type=substr($data,$p,4); $p += 4; + if($type=='PLTE') { + //Read palette + $pal=substr($data,$p,$n); $p += $n; + $p += 4; + } + elseif($type=='tRNS') { + //Read transparency info + $t=substr($data,$p,$n); $p += $n; + if($ct==0) $trns=array(ord(substr($t,1,1))); + elseif($ct==2) $trns=array(ord(substr($t,1,1)),ord(substr($t,3,1)),ord(substr($t,5,1))); + else + { + $pos=strpos($t,chr(0)); + if(is_int($pos)) $trns=array($pos); + } + $p += 4; + } + elseif($type=='IDAT') { + $pngdata.=substr($data,$p,$n); $p += $n; + $p += 4; + } + elseif($type=='IEND') { break; } + else if (preg_match('/[a-zA-Z]{4}/',$type)) { $p += $n+4; } + else { return $this->_imageError($file, $firsttime, 'Error parsing PNG image data'); } + } + while($n); + if (!$pngdata) { return $this->_imageError($file, $firsttime, 'Error parsing PNG image data - no IDAT data found'); } + if($colspace=='Indexed' and empty($pal)) { return $this->_imageError($file, $firsttime, 'Error parsing PNG image data - missing colour palette'); } + $info = array('w'=>$w,'h'=>$h,'cs'=>$colspace,'bpc'=>$bpc,'f'=>'FlateDecode','parms'=>$parms,'pal'=>$pal,'trns'=>$trns,'data'=>$pngdata); + $info['type']='png'; + if ($ppUx) { $info['set-dpi'] = $ppUx; } + } + + if (!$info) { return $this->_imageError($file, $firsttime, 'Error parsing or converting PNG image'); } + + if ($firsttime) { + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + return $info; + } + + // GIF + else if ($type == 'gif') { + if (function_exists('gd_info')) { $gd = gd_info(); } + else {$gd = array(); } + if (isset($gd['GIF Read Support']) && $gd['GIF Read Support']) { + $im = @imagecreatefromstring($data); + if ($im) { + $tempfile = _MPDF_TEMP_PATH.'_tempImgPNG'.RAND(1,10000).'.png'; + imagealphablending($im, false); + imagesavealpha($im, false); + imageinterlace($im, false); + if (!is_writable($tempfile)) { + ob_start(); + $check = @imagepng($im); + if (!$check) { return $this->_imageError($file, $firsttime, 'Error creating temporary image object whilst using GD library to parse GIF image'); } + $this->_tempimg = ob_get_contents(); + $this->_tempimglnk = 'var:_tempimg'; + ob_end_clean(); + $info = $this->_getImage($this->_tempimglnk, false); + if (!$info) { return $this->_imageError($file, $firsttime, 'Error parsing temporary file image object created with GD library to parse GIF image'); } + imagedestroy($im); + } + else { + $check = @imagepng($im, $tempfile); + if (!$check) { return $this->_imageError($file, $firsttime, 'Error creating temporary file ('.$tempfile.') whilst using GD library to parse GIF image'); } + $info = $this->_getImage($tempfile, false); + if (!$info) { return $this->_imageError($file, $firsttime, 'Error parsing temporary file ('.$tempfile.') created with GD library to parse GIF image'); } + imagedestroy($im); + unlink($tempfile); + } + $info['type']='gif'; + if ($firsttime) { + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + return $info; + } + else { return $this->_imageError($file, $firsttime, 'Error creating GD image file from GIF image'); } + } + + if (!class_exists('gif', false)) { + include_once(_MPDF_PATH.'classes/gif.php'); + } + $gif=new CGIF(); + + $h=0; + $w=0; + $gif->loadFile($data, 0); + + if(isset($gif->m_img->m_gih->m_bLocalClr) && $gif->m_img->m_gih->m_bLocalClr) { + $nColors = $gif->m_img->m_gih->m_nTableSize; + $pal = $gif->m_img->m_gih->m_colorTable->toString(); + if($bgColor != -1) { + $bgColor = $gif->m_img->m_gih->m_colorTable->colorIndex($bgColor); + } + $colspace='Indexed'; + } elseif(isset($gif->m_gfh->m_bGlobalClr) && $gif->m_gfh->m_bGlobalClr) { + $nColors = $gif->m_gfh->m_nTableSize; + $pal = $gif->m_gfh->m_colorTable->toString(); + if((isset($bgColor)) and $bgColor != -1) { + $bgColor = $gif->m_gfh->m_colorTable->colorIndex($bgColor); + } + $colspace='Indexed'; + } else { + $nColors = 0; + $bgColor = -1; + $colspace='DeviceGray'; + $pal=''; + } + + $trns=''; + if(isset($gif->m_img->m_bTrans) && $gif->m_img->m_bTrans && ($nColors > 0)) { + $trns=array($gif->m_img->m_nTrans); + } + $gifdata=$gif->m_img->m_data; + $w=$gif->m_gfh->m_nWidth; + $h=$gif->m_gfh->m_nHeight; + $gif->ClearData(); + + if($colspace=='Indexed' and empty($pal)) { + return $this->_imageError($file, $firsttime, 'Error parsing GIF image - missing colour palette'); + } + if ($this->compress) { + $gifdata=gzcompress($gifdata); + $info = array( 'w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>8, 'f'=>'FlateDecode', 'pal'=>$pal, 'trns'=>$trns, 'data'=>$gifdata); + } + else { + $info = array( 'w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>8, 'pal'=>$pal, 'trns'=>$trns, 'data'=>$gifdata); + } + $info['type']='gif'; + if ($firsttime) { + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + return $info; + } + +/*-- IMAGES-BMP --*/ + // BMP (Windows Bitmap) + else if ($type == 'bmp') { + if (!class_exists('bmp', false)) { include(_MPDF_PATH.'classes/bmp.php'); } + if (empty($this->bmp)) { $this->bmp = new bmp($this); } + $info = $this->bmp->_getBMPimage($data, $file); + if (isset($info['error'])) { + return $this->_imageError($file, $firsttime, $info['error']); + } + if ($firsttime) { + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + return $info; + } +/*-- END IMAGES-BMP --*/ +/*-- IMAGES-WMF --*/ + // WMF + else if ($type == 'wmf') { + if (!class_exists('wmf', false)) { include(_MPDF_PATH.'classes/wmf.php'); } + if (empty($this->wmf)) { $this->wmf = new wmf($this); } + $wmfres = $this->wmf->_getWMFimage($data); + if ($wmfres[0]==0) { + if ($wmfres[1]) { return $this->_imageError($file, $firsttime, $wmfres[1]); } + return $this->_imageError($file, $firsttime, 'Error parsing WMF image'); + } + $info = array('x'=>$wmfres[2][0],'y'=>$wmfres[2][1],'w'=>$wmfres[3][0],'h'=>$wmfres[3][1],'data'=>$wmfres[1]); + $info['i']=count($this->formobjects)+1; + $info['type']='wmf'; + $this->formobjects[$file]=$info; + return $info; + } +/*-- END IMAGES-WMF --*/ + + // UNKNOWN TYPE - try GD imagecreatefromstring + else { + if (function_exists('gd_info')) { $gd = gd_info(); } + else {$gd = array(); } + if (isset($gd['PNG Support']) && $gd['PNG Support']) { + $im = @imagecreatefromstring($data); + if (!$im) { return $this->_imageError($file, $firsttime, 'Error parsing image file - image type not recognised, and not supported by GD imagecreate'); } + $tempfile = _MPDF_TEMP_PATH.'_tempImgPNG'.RAND(1,10000).'.png'; + imagealphablending($im, false); + imagesavealpha($im, false); + imageinterlace($im, false); + $check = @imagepng($im, $tempfile); + if (!$check) { return $this->_imageError($file, $firsttime, 'Error creating temporary file ('.$tempfile.') whilst using GD library to parse unknown image type'); } + $info = $this->_getImage($tempfile, false); + imagedestroy($im); + unlink($tempfile); + if (!$info) { return $this->_imageError($file, $firsttime, 'Error parsing temporary file ('.$tempfile.') created with GD library to parse unknown image type'); } + $info['type']='png'; + if ($firsttime) { + $info['i']=count($this->images)+1; + $this->images[$file]=$info; + } + return $info; + } + } + + return $this->_imageError($file, $firsttime, 'Error parsing image file - image type not recognised'); +} +//============================================================== +function _convImage(&$data, $colspace, $targetcs, $w, $h, $dpi, $mask) { + if ($this->PDFA || $this->PDFX) { $mask=false; } + $im = @imagecreatefromstring($data); + $info = array(); + if ($im) { + $imgdata = ''; + $mimgdata = ''; + $minfo = array(); + //Read transparency info + $trns=array(); + $trnsrgb = false; + if (!$this->PDFA && !$this->PDFX) { + $p = strpos($data,'tRNS'); + if ($p) { + $n=$this->_fourbytes2int(substr($data,($p-4),4)); + $t = substr($data,($p+4),$n); + if ($colspace=='DeviceGray') { + $trns=array(ord(substr($t,1,1))); + $trnsrgb = array($trns[0],$trns[0],$trns[0]); + } + else if ($colspace=='DeviceRGB') { + $trns=array(ord(substr($t,1,1)),ord(substr($t,3,1)),ord(substr($t,5,1))); + $trnsrgb = $trns; + if ($targetcs=='DeviceCMYK') { + $col = $this->rgb2cmyk(array(3,$trns[0],$trns[1],$trns[2])); + $c1 = intval($col[1]*2.55); + $c2 = intval($col[2]*2.55); + $c3 = intval($col[3]*2.55); + $c4 = intval($col[4]*2.55); + $trns = array($c1,$c2,$c3,$c4); + } + else if ($targetcs=='DeviceGray') { + $c = intval(($trns[0] * .21) + ($trns[1] * .71) + ($trns[2] * .07)); + $trns = array($c); + } + } + else { // Indexed + $pos = strpos($t,chr(0)); + if (is_int($pos)) { + $pal = imagecolorsforindex($im, $pos); + $r = $pal['red']; + $g = $pal['green']; + $b = $pal['blue']; + $trns=array($r,$g,$b); // **** + $trnsrgb = $trns; + if ($targetcs=='DeviceCMYK') { + $col = $this->rgb2cmyk(array(3,$r,$g,$b)); + $c1 = intval($col[1]*2.55); + $c2 = intval($col[2]*2.55); + $c3 = intval($col[3]*2.55); + $c4 = intval($col[4]*2.55); + $trns = array($c1,$c2,$c3,$c4); + } + else if ($targetcs=='DeviceGray') { + $c = intval(($r * .21) + ($g * .71) + ($b * .07)); + $trns = array($c); + } + } + } + } + } + for ($i = 0; $i < $h; $i++) { + for ($j = 0; $j < $w; $j++) { + $rgb = imagecolorat($im, $j, $i); + $r = ($rgb >> 16) & 0xFF; + $g = ($rgb >> 8) & 0xFF; + $b = $rgb & 0xFF; + if ($colspace=='Indexed') { + $pal = imagecolorsforindex($im, $rgb); + $r = $pal['red']; + $g = $pal['green']; + $b = $pal['blue']; + } + + if ($targetcs=='DeviceCMYK') { + $col = $this->rgb2cmyk(array(3,$r,$g,$b)); + $c1 = intval($col[1]*2.55); + $c2 = intval($col[2]*2.55); + $c3 = intval($col[3]*2.55); + $c4 = intval($col[4]*2.55); + if ($trnsrgb) { + // original pixel was not set as transparent but processed color does match + if ($trnsrgb!=array($r,$g,$b) && $trns==array($c1,$c2,$c3,$c4)) { + if ($c4==0) { $c4=1; } else { $c4--; } + } + } + $imgdata .= chr($c1).chr($c2).chr($c3).chr($c4); + } + else if ($targetcs=='DeviceGray') { + $c = intval(($r * .21) + ($g * .71) + ($b * .07)); + if ($trnsrgb) { + // original pixel was not set as transparent but processed color does match + if ($trnsrgb!=array($r,$g,$b) && $trns==array($c)) { + if ($c==0) { $c=1; } else { $c--; } + } + } + $imgdata .= chr($c); + } + else if ($targetcs=='DeviceRGB') { + $imgdata .= chr($r).chr($g).chr($b); + } + if ($mask) { + $col = imagecolorsforindex($im, $rgb); + $gammacorr = 2.2; // gamma correction + $gamma = intval((pow((((127 - $col['alpha']) * 255 / 127) / 255), $gammacorr) * 255)); + $mimgdata .= chr($gamma); + } + } + } + + if ($targetcs=='DeviceGray') { $ncols = 1; } + else if ($targetcs=='DeviceRGB') { $ncols = 3; } + else if ($targetcs=='DeviceCMYK') { $ncols = 4; } + + $imgdata = gzcompress($imgdata); + $info = array('w'=>$w,'h'=>$h,'cs'=>$targetcs,'bpc'=>8,'f'=>'FlateDecode','data'=>$imgdata, 'type'=>'png', + 'parms'=>'/DecodeParms <</Colors '.$ncols.' /BitsPerComponent 8 /Columns '.$w.'>>'); + if ($dpi) { $info['set-dpi'] = $dpi; } + if ($mask) { + $mimgdata = gzcompress($mimgdata); + $minfo = array('w'=>$w,'h'=>$h,'cs'=>'DeviceGray','bpc'=>8,'f'=>'FlateDecode','data'=>$mimgdata, 'type'=>'png', + 'parms'=>'/DecodeParms <</Colors '.$ncols.' /BitsPerComponent 8 /Columns '.$w.'>>'); + if ($dpi) { $minfo['set-dpi'] = $dpi; } + $tempfile = '_tempImgPNG'.RAND(1,10000).'.png'; + $imgmask = count($this->images)+1; + $minfo['i']=$imgmask ; + $this->images[$tempfile] = $minfo; + $info['masked'] = $imgmask; + } + else if ($trns) { $info['trns'] = $trns; } + imagedestroy($im); + } + return $info; +} + + + + +function _fourbytes2int($s) { + //Read a 4-byte integer from string + return (ord($s[0])<<24) + (ord($s[1])<<16) + (ord($s[2])<<8) + ord($s[3]); +} + +function _twobytes2int($s) { + //Read a 2-byte integer from string + return (ord(substr($s, 0, 1))<<8) + ord(substr($s, 1, 1)); +} + +function _jpgHeaderFromString(&$data) { + $p = 4; + $p += $this->_twobytes2int(substr($data, $p, 2)); // Length of initial marker block + $marker = substr($data, $p, 2); + while($marker != chr(255).chr(192) && $marker != chr(255).chr(194) && $p<strlen($data)) { + // Start of frame marker (FFC0) or (FFC2) mPDF 4.4.004 + $p += ($this->_twobytes2int(substr($data, $p+2, 2))) + 2; // Length of marker block + $marker = substr($data, $p, 2); + } + if ($marker != chr(255).chr(192) && $marker != chr(255).chr(194)) { return false; } + return substr($data, $p+2, 10); +} + +function _jpgDataFromHeader($hdr) { + $bpc = ord(substr($hdr, 2, 1)); + if (!$bpc) { $bpc = 8; } + $h = $this->_twobytes2int(substr($hdr, 3, 2)); + $w = $this->_twobytes2int(substr($hdr, 5, 2)); + $channels = ord(substr($hdr, 7, 1)); + if ($channels==3) { $colspace='DeviceRGB'; } + elseif($channels==4) { $colspace='DeviceCMYK'; } + else { $colspace='DeviceGray'; } + return array($w, $h, $colspace, $bpc); +} + +function file_get_contents_by_curl($url, &$data) { + $timeout = 5; + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_NOBODY, 0); + curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , 1 ); + curl_setopt ( $ch , CURLOPT_CONNECTTIMEOUT , $timeout ); + $data = curl_exec($ch); + curl_close($ch); +} + + +function file_get_contents_by_socket($url, &$data) { + $timeout = 1; + $p = parse_url($url); + $file = $p['path']; + if ($p['query']) { $file .= '?'.$p['query']; } + if(!($fh = @fsockopen($p['host'], 80, $errno, $errstr, $timeout))) { return false; } + $getstring = + "GET ".$file." HTTP/1.0 \r\n" . + "Host: ".$p['host']." \r\n" . + "Connection: close\r\n\r\n"; + fwrite($fh, $getstring); + // Get rid of HTTP header + $s = fgets($fh, 1024); + if (!$s) { return false; } + $httpheader .= $s; + while (!feof($fh)) { + $s = fgets($fh, 1024); + if ( $s == "\r\n" ) { break; } + } + $data = ''; + while (!feof($fh)) { + $data .= fgets($fh, 1024); + } + fclose($fh); +} + +//============================================================== + +function _imageTypeFromString(&$data) { + $type = ''; + if (substr($data, 6, 4)== 'JFIF' || substr($data, 6, 4)== 'Exif') { + $type = 'jpeg'; + } + else if (substr($data, 0, 6)== "GIF87a" || substr($data, 0, 6)== "GIF89a") { + $type = 'gif'; + } + else if (substr($data, 0, 8)== chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) { + $type = 'png'; + } +/*-- IMAGES-WMF --*/ + else if (substr($data, 0, 4)== chr(215).chr(205).chr(198).chr(154)) { + $type = 'wmf'; + } +/*-- END IMAGES-WMF --*/ + else if (preg_match('/<svg.*<\/svg>/is',$data)) { + $type = 'svg'; + } + // BMP images + else if (substr($data, 0, 2)== "BM") { + $type = 'bmp'; + } + return $type; +} +//============================================================== + +// Moved outside WMF as also needed for SVG +function _putformobjects() { + reset($this->formobjects); + while(list($file,$info)=each($this->formobjects)) { + $this->_newobj(); + $this->formobjects[$file]['n']=$this->n; + $this->_out('<</Type /XObject'); + $this->_out('/Subtype /Form'); + $this->_out('/Group '.($this->n+1).' 0 R'); + $this->_out('/BBox ['.$info['x'].' '.$info['y'].' '.($info['w']+$info['x']).' '.($info['h']+$info['y']).']'); + if ($this->compress) + $this->_out('/Filter /FlateDecode'); + $data=($this->compress) ? gzcompress($info['data']) : $info['data']; + $this->_out('/Length '.strlen($data).'>>'); + $this->_putstream($data); + unset($this->formobjects[$file]['data']); + $this->_out('endobj'); + // Required for SVG transparency (opacity) to work + $this->_newobj(); + $this->_out('<</Type /Group'); + $this->_out('/S /Transparency'); + $this->_out('>>'); + $this->_out('endobj'); + } +} + +function _freadint($f) +{ + //Read a 4-byte integer from file + $i=ord(fread($f,1))<<24; + $i+=ord(fread($f,1))<<16; + $i+=ord(fread($f,1))<<8; + $i+=ord(fread($f,1)); + return $i; +} + +function _UTF16BEtextstring($s) { + $s = $this->UTF8ToUTF16BE($s, true); +/*-- ENCRYPTION --*/ + if ($this->encrypted) { + $s = $this->_RC4($this->_objectkey($this->_current_obj_id), $s); + } +/*-- END ENCRYPTION --*/ + return '('. $this->_escape($s).')'; +} + +function _textstring($s) { +/*-- ENCRYPTION --*/ + if ($this->encrypted) { + $s = $this->_RC4($this->_objectkey($this->_current_obj_id), $s); + } +/*-- END ENCRYPTION --*/ + return '('. $this->_escape($s).')'; +} + + +function _escape($s) +{ + // the chr(13) substitution fixes the Bugs item #1421290. + return strtr($s, array(')' => '\\)', '(' => '\\(', '\\' => '\\\\', chr(13) => '\r')); +} + +function _putstream($s) { +/*-- ENCRYPTION --*/ + if ($this->encrypted) { + $s = $this->_RC4($this->_objectkey($this->_current_obj_id), $s); + } +/*-- END ENCRYPTION --*/ + $this->_out('stream'); + $this->_out($s); + $this->_out('endstream'); +} + + +function _out($s,$ln=true) { + if($this->state==2) { + if ($this->bufferoutput) { + $this->headerbuffer.= $s."\n"; + } +/*-- COLUMNS --*/ + else if (($this->ColActive) && !$this->processingHeader && !$this->processingFooter) { + // Captures everything in buffer for columns; Almost everything is sent from fn. Cell() except: + // Images sent from Image() or + // later sent as _out($textto) in printbuffer + // Line() + if (preg_match('/q \d+\.\d\d+ 0 0 (\d+\.\d\d+) \d+\.\d\d+ \d+\.\d\d+ cm \/(I|FO)\d+ Do Q/',$s,$m)) { // Image data + $h = ($m[1]/_MPDFK); + // Update/overwrite the lowest bottom of printing y value for a column + $this->ColDetails[$this->CurrCol]['bottom_margin'] = $this->y+$h; + } +/*-- TABLES --*/ + else if (preg_match('/\d+\.\d\d+ \d+\.\d\d+ \d+\.\d\d+ ([\-]{0,1}\d+\.\d\d+) re/',$s,$m) && $this->tableLevel>0) { // Rect in table + $h = ($m[1]/_MPDFK); + // Update/overwrite the lowest bottom of printing y value for a column + $this->ColDetails[$this->CurrCol]['bottom_margin'] = max($this->ColDetails[$this->CurrCol]['bottom_margin'],($this->y+$h)); + } +/*-- END TABLES --*/ + else { // Td Text Set in Cell() + if (isset($this->ColDetails[$this->CurrCol]['bottom_margin'])) { $h = $this->ColDetails[$this->CurrCol]['bottom_margin'] - $this->y; } + else { $h = 0; } + } + if ($h < 0) { $h = -$h; } + $this->columnbuffer[] = array( + 's' => $s, // Text string to output + 'col' => $this->CurrCol, // Column when printed + 'x' => $this->x, // x when printed + 'y' => $this->y, // this->y when printed (after column break) + 'h' => $h // actual y at bottom when printed = y+h + ); + } +/*-- END COLUMNS --*/ +/*-- TABLES --*/ + else if ($this->table_rotate && !$this->processingHeader && !$this->processingFooter) { + // Captures eveything in buffer for rotated tables; + $this->tablebuffer .= $s . "\n"; + } +/*-- END TABLES --*/ + else if ($this->kwt && !$this->processingHeader && !$this->processingFooter) { + // Captures eveything in buffer for keep-with-table (h1-6); + $this->kwt_buffer[] = array( + 's' => $s, // Text string to output + 'x' => $this->x, // x when printed + 'y' => $this->y, // y when printed + ); + } + else if (($this->keep_block_together) && !$this->processingHeader && !$this->processingFooter) { + if (!isset($this->ktBlock[$this->page]['bottom_margin'])) { + $this->ktBlock[$this->page]['bottom_margin'] = $this->y; + } + + // Captures eveything in buffer; + if (preg_match('/q \d+\.\d\d+ 0 0 (\d+\.\d\d+) \d+\.\d\d+ \d+\.\d\d+ cm \/(I|FO)\d+ Do Q/',$s,$m)) { // Image data + $h = ($m[1]/_MPDFK); + // Update/overwrite the lowest bottom of printing y value for Keep together block + $this->ktBlock[$this->page]['bottom_margin'] = $this->y+$h; + } + else { // Td Text Set in Cell() + if (isset($this->ktBlock[$this->page]['bottom_margin'])) { $h = $this->ktBlock[$this->page]['bottom_margin'] - $this->y; } + else { $h = 0; } + } + if ($h < 0) { $h = -$h; } + $this->divbuffer[] = array( + 'page' => $this->page, + 's' => $s, // Text string to output + 'x' => $this->x, // x when printed + 'y' => $this->y, // y when printed (after column break) + 'h' => $h // actual y at bottom when printed = y+h + ); + } + else { + $this->pages[$this->page] .= $s.($ln == true ? "\n" : ''); + } + + } + else { + $this->buffer .= $s.($ln == true ? "\n" : ''); + } +} + +/*-- WATERMARK --*/ +// add a watermark +function watermark( $texte, $angle=45, $fontsize=96, $alpha=0.2 ) { + if ($this->PDFA || $this->PDFX) { $this->Error('PDFA and PDFX do not permit transparency, so mPDF does not allow Watermarks!'); } + if (!$this->watermark_font) { $this->watermark_font = $this->default_font; } + $this->SetFont( $this->watermark_font, "B", $fontsize, false ); // Don't output + $texte= $this->purify_utf8_text($texte); + if ($this->text_input_as_HTML) { + $texte= $this->all_entities_to_utf8($texte); + } + if ($this->usingCoreFont) { $texte = mb_convert_encoding($texte,$this->mb_enc,'UTF-8'); } + // DIRECTIONALITY + $this->magic_reverse_dir($texte, true, $this->directionality); // *RTL* + // Font-specific ligature substitution for Indic fonts + if (isset($this->CurrentFont['indic']) && $this->CurrentFont['indic']) $this->ConvertIndic($texte); // *INDIC* + + $this->SetAlpha($alpha); + + $this->SetTColor($this->ConvertColor(0)); + $szfont = $fontsize; + $loop = 0; + $maxlen = (min($this->w,$this->h) ); // sets max length of text as 7/8 width/height of page + while ( $loop == 0 ) + { + $this->SetFont( $this->watermark_font, "B", $szfont, false ); // Don't output + $offset = ((sin(deg2rad($angle))) * ($szfont/_MPDFK)); + + $strlen = $this->GetStringWidth($texte); + if ( $strlen > $maxlen - $offset ) + $szfont --; + else + $loop ++; + } + + $this->SetFont( $this->watermark_font, "B", $szfont-0.1, true, true); // Output The -0.1 is because SetFont above is not written to PDF + // Repeating it will not output anything as mPDF thinks it is set + $adj = ((cos(deg2rad($angle))) * ($strlen/2)); + $opp = ((sin(deg2rad($angle))) * ($strlen/2)); + $wx = ($this->w/2) - $adj + $offset/3; + $wy = ($this->h/2) + $opp; + $this->Rotate($angle,$wx,$wy); + $this->Text($wx,$wy,$texte); + $this->Rotate(0); + $this->SetTColor($this->ConvertColor(0)); + + $this->SetAlpha(1); + +} + +function watermarkImg( $src, $alpha=0.2 ) { + if ($this->PDFA || $this->PDFX) { $this->Error('PDFA and PDFX do not permit transparency, so mPDF does not allow Watermarks!'); } + if ($this->watermarkImgBehind) { $this->watermarkImgAlpha = $this->SetAlpha($alpha, 'Normal', true); } + else { $this->SetAlpha($alpha, $this->watermarkImgAlphaBlend); } + $this->Image($src,0,0,0,0,'','', true, true, true); + if (!$this->watermarkImgBehind) { $this->SetAlpha(1); } +} +/*-- END WATERMARK --*/ + + +function Rotate($angle,$x=-1,$y=-1) +{ + if($x==-1) + $x=$this->x; + if($y==-1) + $y=$this->y; + if($this->angle!=0) + $this->_out('Q'); + $this->angle=$angle; + if($angle!=0) + { + $angle*=M_PI/180; + $c=cos($angle); + $s=sin($angle); + $cx=$x*_MPDFK; + $cy=($this->h-$y)*_MPDFK; + $this->_out(sprintf('q %.5F %.5F %.5F %.5F %.3F %.3F cm 1 0 0 1 %.3F %.3F cm',$c,$s,-$s,$c,$cx,$cy,-$cx,-$cy)); + } +} + + + +function CircularText($x, $y, $r, $text, $align='top', $fontfamily='', $fontsize=0, $fontstyle='', $kerning=120, $fontwidth=100, $divider) { // mPDF 5.5.23 + if (!class_exists('directw', false)) { include(_MPDF_PATH.'classes/directw.php'); } + if (empty($this->directw)) { $this->directw = new directw($this); } + $this->directw->CircularText($x, $y, $r, $text, $align, $fontfamily, $fontsize, $fontstyle, $kerning, $fontwidth, $divider); // mPDF 5.5.23 +} + + +// From Invoice +function RoundedRect($x, $y, $w, $h, $r, $style = '') +{ + $hp = $this->h; + if($style=='F') + $op='f'; + elseif($style=='FD' or $style=='DF') + $op='B'; + else + $op='S'; + $MyArc = 4/3 * (sqrt(2) - 1); + $this->_out(sprintf('%.3F %.3F m',($x+$r)*_MPDFK,($hp-$y)*_MPDFK )); + $xc = $x+$w-$r ; + $yc = $y+$r; + $this->_out(sprintf('%.3F %.3F l', $xc*_MPDFK,($hp-$y)*_MPDFK )); + + $this->_Arc($xc + $r*$MyArc, $yc - $r, $xc + $r, $yc - $r*$MyArc, $xc + $r, $yc); + $xc = $x+$w-$r ; + $yc = $y+$h-$r; + $this->_out(sprintf('%.3F %.3F l',($x+$w)*_MPDFK,($hp-$yc)*_MPDFK)); + $this->_Arc($xc + $r, $yc + $r*$MyArc, $xc + $r*$MyArc, $yc + $r, $xc, $yc + $r); + $xc = $x+$r ; + $yc = $y+$h-$r; + $this->_out(sprintf('%.3F %.3F l',$xc*_MPDFK,($hp-($y+$h))*_MPDFK)); + $this->_Arc($xc - $r*$MyArc, $yc + $r, $xc - $r, $yc + $r*$MyArc, $xc - $r, $yc); + $xc = $x+$r ; + $yc = $y+$r; + $this->_out(sprintf('%.3F %.3F l',($x)*_MPDFK,($hp-$yc)*_MPDFK )); + $this->_Arc($xc - $r, $yc - $r*$MyArc, $xc - $r*$MyArc, $yc - $r, $xc, $yc - $r); + $this->_out($op); +} + +function _Arc($x1, $y1, $x2, $y2, $x3, $y3) +{ + $h = $this->h; + $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', $x1*_MPDFK, ($h-$y1)*_MPDFK, + $x2*_MPDFK, ($h-$y2)*_MPDFK, $x3*_MPDFK, ($h-$y3)*_MPDFK)); +} + + + + +//==================================================== + + + +/*-- DIRECTW --*/ +function Shaded_box( $text,$font='',$fontstyle='B',$szfont='',$width='70%',$style='DF',$radius=2.5,$fill='#FFFFFF',$color='#000000',$pad=2 ) { + // F (shading - no line),S (line, no shading),DF (both) + if (!class_exists('directw', false)) { include(_MPDF_PATH.'classes/directw.php'); } + if (empty($this->directw)) { $this->directw = new directw($this); } + $this->directw->Shaded_box( $text,$font,$fontstyle,$szfont,$width,$style,$radius,$fill,$color,$pad); +} +/*-- END DIRECTW --*/ + + +function UTF8StringToArray($str, $addSubset=true) { + $out = array(); + $len = strlen($str); + for ($i = 0; $i < $len; $i++) { + $uni = -1; + $h = ord($str[$i]); + if ( $h <= 0x7F ) + $uni = $h; + elseif ( $h >= 0xC2 ) { + if ( ($h <= 0xDF) && ($i < $len -1) ) + $uni = ($h & 0x1F) << 6 | (ord($str[++$i]) & 0x3F); + elseif ( ($h <= 0xEF) && ($i < $len -2) ) + $uni = ($h & 0x0F) << 12 | (ord($str[++$i]) & 0x3F) << 6 | (ord($str[++$i]) & 0x3F); + elseif ( ($h <= 0xF4) && ($i < $len -3) ) + $uni = ($h & 0x0F) << 18 | (ord($str[++$i]) & 0x3F) << 12 | (ord($str[++$i]) & 0x3F) << 6 | (ord($str[++$i]) & 0x3F); + } + if ($uni >= 0) { + $out[] = $uni; + if ($addSubset && isset($this->CurrentFont['subset'])) { + $this->CurrentFont['subset'][$uni] = $uni; + } + } + } + return $out; +} + + +//Convert utf-8 string to <HHHHHH> for Font Subsets +function UTF8toSubset($str) { + $ret = '<'; + $str = preg_replace('/'.preg_quote($this->aliasNbPg,'/').'/', chr(7), $str ); + $str = preg_replace('/'.preg_quote($this->aliasNbPgGp,'/').'/', chr(8), $str ); + $unicode = $this->UTF8StringToArray($str); + $orig_fid = $this->CurrentFont['subsetfontids'][0]; + $last_fid = $this->CurrentFont['subsetfontids'][0]; + foreach($unicode as $c) { + if ($c == 7 || $c == 8) { + if ($orig_fid != $last_fid) { + $ret .= '> Tj /F'.$orig_fid.' '.$this->FontSizePt.' Tf <'; + $last_fid = $orig_fid; + } + if ($c == 7) { $ret .= $this->aliasNbPgHex; } + else { $ret .= $this->aliasNbPgGpHex; } + continue; + } + for ($i=0; $i<99; $i++) { + // return c as decimal char + $init = array_search($c, $this->CurrentFont['subsets'][$i]); + if ($init!==false) { + if ($this->CurrentFont['subsetfontids'][$i] != $last_fid) { + $ret .= '> Tj /F'.$this->CurrentFont['subsetfontids'][$i].' '.$this->FontSizePt.' Tf <'; + $last_fid = $this->CurrentFont['subsetfontids'][$i]; + } + $ret .= sprintf("%02s", strtoupper(dechex($init))); + break; + } + // TrueType embedded SUBSETS + else if (count($this->CurrentFont['subsets'][$i]) < 255) { + $n = count($this->CurrentFont['subsets'][$i]); + $this->CurrentFont['subsets'][$i][$n] = $c; + if ($this->CurrentFont['subsetfontids'][$i] != $last_fid) { + $ret .= '> Tj /F'.$this->CurrentFont['subsetfontids'][$i].' '.$this->FontSizePt.' Tf <'; + $last_fid = $this->CurrentFont['subsetfontids'][$i]; + } + $ret .= sprintf("%02s", strtoupper(dechex($n))); + break; + } + else if (!isset($this->CurrentFont['subsets'][($i+1)])) { + // TrueType embedded SUBSETS + $this->CurrentFont['subsets'][($i+1)] = array(0=>0); + $new_fid = count($this->fonts)+$this->extraFontSubsets+1; + $this->CurrentFont['subsetfontids'][($i+1)] = $new_fid; + $this->extraFontSubsets++; + } + } + } + $ret .= '>'; + if ($last_fid != $orig_fid) { + $ret .= ' Tj /F'.$orig_fid.' '.$this->FontSizePt.' Tf <> '; + } + return $ret; +} + + +// Converts UTF-8 strings to UTF16-BE. +function UTF8ToUTF16BE($str, $setbom=true) { + if ($this->checkSIP && preg_match("/([\x{20000}-\x{2FFFF}])/u", $str)) { + if (!in_array($this->currentfontfamily, array('gb','big5','sjis','uhc','gbB','big5B','sjisB','uhcB','gbI','big5I','sjisI','uhcI', + 'gbBI','big5BI','sjisBI','uhcBI'))) { + $str = preg_replace("/[\x{20000}-\x{2FFFF}]/u", chr(0), $str); + } + } + if ($this->checkSMP && preg_match("/([\x{10000}-\x{1FFFF}])/u", $str )) { + $str = preg_replace("/[\x{10000}-\x{1FFFF}]/u", chr(0), $str ); + } + $outstr = ""; // string to be returned + if ($setbom) { + $outstr .= "\xFE\xFF"; // Byte Order Mark (BOM) + } + $outstr .= mb_convert_encoding($str, 'UTF-16BE', 'UTF-8'); + return $outstr; +} + + + + + +// ==================================================== +// ==================================================== +/*-- CJK-FONTS --*/ + +// from class PDF_Chinese CJK EXTENSIONS +function AddCIDFont($family,$style,$name,&$cw,$CMap,$registry,$desc) +{ + $fontkey=strtolower($family).strtoupper($style); + if(isset($this->fonts[$fontkey])) + $this->Error("Font already added: $family $style"); + $i=count($this->fonts)+$this->extraFontSubsets+1; + $name=str_replace(' ','',$name); + if ($family == 'sjis') { $up = -120; } else { $up = -130; } + // ? 'up' and 'ut' do not seem to be referenced anywhere + $this->fonts[$fontkey]=array('i'=>$i,'type'=>'Type0','name'=>$name,'up'=>$up,'ut'=>40,'cw'=>$cw,'CMap'=>$CMap,'registry'=>$registry,'MissingWidth'=>1000,'desc'=>$desc); +} + +function AddCJKFont($family) { + + if ($this->PDFA || $this->PDFX) { + $this->Error("Adobe CJK fonts cannot be embedded in mPDF (required for PDFA1-b and PDFX/1-a)."); + } + if ($family == 'big5') { $this->AddBig5Font(); } + else if ($family == 'gb') { $this->AddGBFont(); } + else if ($family == 'sjis') { $this->AddSJISFont(); } + else if ($family == 'uhc') { $this->AddUHCFont(); } +} + +function AddBig5Font() +{ + //Add Big5 font with proportional Latin + $family='big5'; + $name='MSungStd-Light-Acro'; + $cw=$this->Big5_widths; + $CMap='UniCNS-UTF16-H'; + $registry=array('ordering'=>'CNS1','supplement'=>4); + $desc = array( + 'Ascent' => 880, + 'Descent' => -120, + 'CapHeight' => 880, + 'Flags' => 6, + 'FontBBox' => '[-160 -249 1015 1071]', + 'ItalicAngle' => 0, + 'StemV' => 93, + ); + $this->AddCIDFont($family,'',$name,$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'B',$name.',Bold',$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'I',$name.',Italic',$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'BI',$name.',BoldItalic',$cw,$CMap,$registry,$desc); +} + + +function AddGBFont() +{ + //Add GB font with proportional Latin + $family='gb'; + $name='STSongStd-Light-Acro'; + $cw=$this->GB_widths; + $CMap='UniGB-UTF16-H'; + $registry=array('ordering'=>'GB1','supplement'=>4); + $desc = array( + 'Ascent' => 752, + 'Descent' => -271, + 'CapHeight' => 737, + 'Flags' => 6, + 'FontBBox' => '[-25 -254 1000 880]', + 'ItalicAngle' => 0, + 'StemV' => 58, + 'Style' => '<< /Panose <000000000400000000000000> >>', + ); + $this->AddCIDFont($family,'',$name,$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'B',$name.',Bold',$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'I',$name.',Italic',$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'BI',$name.',BoldItalic',$cw,$CMap,$registry,$desc); +} + + +function AddSJISFont() +{ + //Add SJIS font with proportional Latin + $family='sjis'; + $name='KozMinPro-Regular-Acro'; + $cw=$this->SJIS_widths; + $CMap='UniJIS-UTF16-H'; + $registry=array('ordering'=>'Japan1','supplement'=>5); + $desc = array( + 'Ascent' => 880, + 'Descent' => -120, + 'CapHeight' => 740, + 'Flags' => 6, + 'FontBBox' => '[-195 -272 1110 1075]', + 'ItalicAngle' => 0, + 'StemV' => 86, + 'XHeight' => 502, + ); + $this->AddCIDFont($family,'',$name,$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'B',$name.',Bold',$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'I',$name.',Italic',$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'BI',$name.',BoldItalic',$cw,$CMap,$registry,$desc); +} + +function AddUHCFont() +{ + //Add UHC font with proportional Latin + $family='uhc'; + $name='HYSMyeongJoStd-Medium-Acro'; + $cw=$this->UHC_widths; + $CMap='UniKS-UTF16-H'; + $registry=array('ordering'=>'Korea1','supplement'=>2); + $desc = array( + 'Ascent' => 880, + 'Descent' => -120, + 'CapHeight' => 720, + 'Flags' => 6, + 'FontBBox' => '[-28 -148 1001 880]', + 'ItalicAngle' => 0, + 'StemV' => 60, + 'Style' => '<< /Panose <000000000600000000000000> >>', + ); + $this->AddCIDFont($family,'',$name,$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'B',$name.',Bold',$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'I',$name.',Italic',$cw,$CMap,$registry,$desc); + $this->AddCIDFont($family,'BI',$name.',BoldItalic',$cw,$CMap,$registry,$desc); +} + +/*-- END CJK-FONTS --*/ + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +function SetAutoFont($af = AUTOFONT_ALL) { + if ($this->onlyCoreFonts) { return false; } + if (!$af && $af !== 0) { $af = AUTOFONT_ALL; } + $this->autoFontGroups = $af; + if ($this->autoFontGroups ) { + $this->useLang = true; + } +} + + +function SetDefaultFont($font) { + // Disallow embedded fonts to be used as defaults in PDFA + if ($this->PDFA || $this->PDFX) { + if (strtolower($font) == 'ctimes') { $font = 'serif'; } + if (strtolower($font) == 'ccourier') { $font = 'monospace'; } + if (strtolower($font) == 'chelvetica') { $font = 'sans-serif'; } + } + $font = $this->SetFont($font); // returns substituted font if necessary + $this->default_font = $font; + $this->original_default_font = $font; + if (!$this->watermark_font ) { $this->watermark_font = $font; } // *WATERMARK* + $this->defaultCSS['BODY']['FONT-FAMILY'] = $font; + $this->cssmgr->CSS['BODY']['FONT-FAMILY'] = $font; +} + +function SetDefaultFontSize($fontsize) { + $this->default_font_size = $fontsize; + $this->original_default_font_size = $fontsize; + $this->SetFontSize($fontsize); + $this->defaultCSS['BODY']['FONT-SIZE'] = $fontsize . 'pt'; + $this->cssmgr->CSS['BODY']['FONT-SIZE'] = $fontsize . 'pt'; +} + +function SetDefaultBodyCSS($prop, $val) { + if ($prop) { + $this->defaultCSS['BODY'][strtoupper($prop)] = $val; + $this->cssmgr->CSS['BODY'][strtoupper($prop)] = $val; + } +} + + +function SetDirectionality($dir='ltr') { +/*-- RTL --*/ + if (strtolower($dir) == 'rtl') { + if ($this->directionality != 'rtl') { + // Swop L/R Margins so page 1 RTL is an 'even' page + $tmp = $this->DeflMargin; + $this->DeflMargin = $this->DefrMargin; + $this->DefrMargin = $tmp; + $this->orig_lMargin = $this->DeflMargin; + $this->orig_rMargin = $this->DefrMargin; + + $this->SetMargins($this->DeflMargin,$this->DefrMargin,$this->tMargin); + } + $this->directionality = 'rtl'; + $this->defaultAlign = 'R'; + $this->defaultTableAlign = 'R'; + } + else { +/*-- END RTL --*/ + $this->directionality = 'ltr'; + $this->defaultAlign = 'L'; + $this->defaultTableAlign = 'L'; + } // *RTL* + $this->cssmgr->CSS['BODY']['DIRECTION'] = $this->directionality; +} + + + +// Added to set line-height-correction +function SetLineHeightCorrection($val) { + if ($val > 0) { $this->default_lineheight_correction = $val; } + else { $this->default_lineheight_correction = 1.2; } +} + +// Set a (fixed) lineheight to an actual value - either to named fontsize(pts) or default +function SetLineHeight($FontPt='',$spacing = '') { + if ($this->shrin_k > 1) { $k = $this->shrin_k; } + else { $k = 1; } + if ($spacing > 0) { + if (preg_match('/mm/',$spacing)) { + $this->lineheight = ($spacing + 0.0) / $k; // convert to number + } + else { + if ($FontPt) { $this->lineheight = (($FontPt/_MPDFK) *$spacing); } + else { $this->lineheight = (($this->FontSizePt/_MPDFK) *$spacing); } + } + } + else { + if ($FontPt) { $this->lineheight = (($FontPt/_MPDFK) *$this->normalLineheight); } + else { $this->lineheight = (($this->FontSizePt/_MPDFK) *$this->normalLineheight); } + } +} + +function _computeLineheight($lh, $fs='') { + if ($this->shrin_k > 1) { $k = $this->shrin_k; } + else { $k = 1; } + if (!$fs) { $fs = $this->FontSize; } + if (preg_match('/mm/',$lh)) { + return (($lh + 0.0) / $k); // convert to number + } + else if ($lh > 0) { + return ($fs * $lh); + } + else if (isset($this->normalLineheight)) { return ($fs * $this->normalLineheight); } + else return ($fs * $this->default_lineheight_correction); +} + + +function SetBasePath($str='') { + if ( isset($_SERVER['HTTP_HOST']) ) { $host = $_SERVER['HTTP_HOST']; } + else if ( isset($_SERVER['SERVER_NAME']) ) { $host = $_SERVER['SERVER_NAME']; } + else { $host = ''; } + if (!$str) { + if ($_SERVER['SCRIPT_NAME']) { $currentPath = dirname($_SERVER['SCRIPT_NAME']); } + else { $currentPath = dirname($_SERVER['PHP_SELF']); } + $currentPath = str_replace("\\","/",$currentPath); + if ($currentPath == '/') { $currentPath = ''; } + if ($host) { $currpath = 'http://' . $host . $currentPath .'/'; } + else { $currpath = ''; } + $this->basepath = $currpath; + $this->basepathIsLocal = true; + return; + } + $str = preg_replace('/\?.*/','',$str); + if (!preg_match('/(http|https|ftp):\/\/.*\//i',$str)) { $str .= '/'; } + $str .= 'xxx'; // in case $str ends in / e.g. http://www.bbc.co.uk/ + $this->basepath = dirname($str) . "/"; // returns e.g. e.g. http://www.google.com/dir1/dir2/dir3/ + $this->basepath = str_replace("\\","/",$this->basepath); //If on Windows + $tr = parse_url($this->basepath); + if (isset($tr['host']) && ($tr['host'] == $host)) { $this->basepathIsLocal = true; } + else { $this->basepathIsLocal = false; } +} + + +function GetFullPath(&$path,$basepath='') { + // When parsing CSS need to pass temporary basepath - so links are relative to current stylesheet + if (!$basepath) { $basepath = $this->basepath; } + //Fix path value + $path = str_replace("\\","/",$path); //If on Windows + $path = preg_replace('/^\/\//','http://',$path); // mPDF 5.6.27 + $regexp = '|^./|'; // Inadvertently corrects "./path/etc" and "//www.domain.com/etc" + $path = preg_replace($regexp,'',$path); + + + if(substr($path,0,1) == '#') { return; } + if (stristr($path,"mailto:") !== false) { return; } + if (strpos($path,"../") !== false ) { //It is a Relative Link + $backtrackamount = substr_count($path,"../"); + $maxbacktrack = substr_count($basepath,"/") - 3; // mPDF 5.6.18 + $filepath = str_replace("../",'',$path); + $path = $basepath; + //If it is an invalid relative link, then make it go to directory root + if ($backtrackamount > $maxbacktrack) $backtrackamount = $maxbacktrack; + //Backtrack some directories + for( $i = 0 ; $i < $backtrackamount + 1 ; $i++ ) $path = substr( $path, 0 , strrpos($path,"/") ); + $path = $path . "/" . $filepath; //Make it an absolute path + } + else if( strpos($path,":/") === false || strpos($path,":/") > 10) { //It is a Local Link + if (substr($path,0,1) == "/") { + $tr = parse_url($basepath); + $root = $tr['scheme'].'://'.$tr['host']; + $path = $root . $path; + } + else { $path = $basepath . $path; } + } + //Do nothing if it is an Absolute Link +} + + +// Used for external CSS files +function _get_file($path) { + // If local file try using local path (? quicker, but also allowed even if allow_url_fopen false) + $contents = ''; + $contents = @file_get_contents($path); + if ($contents) { return $contents; } + if ($this->basepathIsLocal) { + $tr = parse_url($path); + $lp=getenv("SCRIPT_NAME"); + $ap=realpath($lp); + $ap=str_replace("\\","/",$ap); + $docroot=substr($ap,0,strpos($ap,$lp)); + // WriteHTML parses all paths to full URLs; may be local file name + if ($tr['scheme'] && $tr['host'] && $_SERVER["DOCUMENT_ROOT"] ) { + $localpath = $_SERVER["DOCUMENT_ROOT"] . $tr['path']; + } + // DOCUMENT_ROOT is not returned on IIS + else if ($docroot) { + $localpath = $docroot . $tr['path']; + } + else { $localpath = $path; } + $contents = @file_get_contents($localpath); + } + // if not use full URL + else if (!$contents && !ini_get('allow_url_fopen') && function_exists("curl_init")) { + $ch = curl_init($path); + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , 1 ); + $contents = curl_exec($ch); + curl_close($ch); + } + return $contents; +} + + +function docPageNum($num = 0, $extras = false) { + if ($num < 1) { $num = $this->page; } + $type = '1'; // set default decimal + $ppgno = $num; + $suppress = 0; + $offset = 0; + $lastreset = 0; + foreach($this->PageNumSubstitutions AS $psarr) { + if ($num >= $psarr['from']) { + if ($psarr['reset']) { + if ($psarr['reset']>1) { $offset = $psarr['reset']-1; } + $ppgno = $num - $psarr['from'] + 1 + $offset; + $lastreset = $psarr['from']; + } + if ($psarr['type']) { $type = $psarr['type']; } + if (strtoupper($psarr['suppress'])=='ON' || $psarr['suppress']==1) { $suppress = 1; } + else if (strtoupper($psarr['suppress'])=='OFF') { $suppress = 0; } + } + } + if ($suppress) { return ''; } + + foreach($this->pgsIns AS $k=>$v) { + if ($k>$lastreset && $k<$num) { + $ppgno -= $v; + } + } + if ($type=='A') { $ppgno = $this->dec2alpha($ppgno,true); } + else if ($type=='a') { $ppgno = $this->dec2alpha($ppgno,false);} + else if ($type=='I') { $ppgno = $this->dec2roman($ppgno,true); } + else if ($type=='i') { $ppgno = $this->dec2roman($ppgno,false); } + if ($extras) { $ppgno = $this->pagenumPrefix . $ppgno . $this->pagenumSuffix; } + return $ppgno; +} + + +function docPageSettings($num = 0) { + // Returns current type (numberstyle), suppression state for this page number; + // reset is only returned if set for this page number + if ($num < 1) { $num = $this->page; } + $type = '1'; // set default decimal + $ppgno = $num; + $suppress = 0; + $offset = 0; + $reset = ''; + foreach($this->PageNumSubstitutions AS $psarr) { + if ($num >= $psarr['from']) { + if ($psarr['reset']) { + if ($psarr['reset']>1) { $offset = $psarr['reset']-1; } + $ppgno = $num - $psarr['from'] + 1 + $offset; + } + if ($psarr['type']) { $type = $psarr['type']; } + if (strtoupper($psarr['suppress'])=='ON' || $psarr['suppress']==1) { $suppress = 1; } + else if (strtoupper($psarr['suppress'])=='OFF') { $suppress = 0; } + } + if ($num == $psarr['from']) { $reset = $psarr['reset']; } + } + if ($suppress) { $suppress = 'on'; } + else { $suppress = 'off'; } + return array($type, $suppress, $reset); +} + +function docPageNumTotal($num = 0, $extras = false) { + if ($num < 1) { $num = $this->page; } + $type = '1'; // set default decimal + $ppgstart = 1; + $ppgend = count($this->pages)+1; + $suppress = 0; + $offset = 0; + foreach($this->PageNumSubstitutions AS $psarr) { + if ($num >= $psarr['from']) { + if ($psarr['reset']) { + if ($psarr['reset']>1) { $offset = $psarr['reset']-1; } + $ppgstart = $psarr['from'] + $offset; + $ppgend = count($this->pages)+1 + $offset; + } + if ($psarr['type']) { $type = $psarr['type']; } + if (strtoupper($psarr['suppress'])=='ON' || $psarr['suppress']==1) { $suppress = 1; } + else if (strtoupper($psarr['suppress'])=='OFF') { $suppress = 0; } + } + if ($num < $psarr['from']) { + if ($psarr['reset']) { + $ppgend = $psarr['from'] + $offset; + break; + } + } + } + if ($suppress) { return ''; } + $ppgno = $ppgend-$ppgstart+$offset; + + // mPDF 5.6.47 + foreach($this->pgsIns AS $k => $v) { + if ($k>$ppgstart && $k<$ppgend) { + $ppgno -= $v; + } + } + + if ($extras) { $ppgno = $this->nbpgPrefix . $ppgno . $this->nbpgSuffix; } + return $ppgno; +} + +function RestartDocTemplate() { + $this->docTemplateStart = $this->page; +} + + + +//Page header +function Header($content='') { + + $this->cMarginL = 0; + $this->cMarginR = 0; + + +/*-- HTMLHEADERS-FOOTERS --*/ + if (($this->mirrorMargins && ($this->page%2==0) && $this->HTMLHeaderE) || ($this->mirrorMargins && ($this->page%2==1) && $this->HTMLHeader) || (!$this->mirrorMargins && $this->HTMLHeader)) { + $this->writeHTMLHeaders(); + return; + } +/*-- END HTMLHEADERS-FOOTERS --*/ + $this->processingHeader=true; + $h = $this->headerDetails; + if(count($h)) { + + if ($this->forcePortraitHeaders && $this->CurOrientation=='L' && $this->CurOrientation!=$this->DefOrientation) { + $this->_out(sprintf('q 0 -1 1 0 0 %.3F cm ',($this->h*_MPDFK))); + $yadj = $this->w - $this->h; + $headerpgwidth = $this->h - $this->orig_lMargin - $this->orig_rMargin; + if (($this->mirrorMargins) && (($this->page)%2==0)) { // EVEN + $headerlmargin = $this->orig_rMargin; + } + else { + $headerlmargin = $this->orig_lMargin; + } + } + else { + $yadj = 0; + $headerpgwidth = $this->pgwidth; + $headerlmargin = $this->lMargin; + } + + $this->y = $this->margin_header - $yadj ; + $this->SetTColor($this->ConvertColor(0)); + $this->SUP = false; + $this->SUB = false; + $this->bullet = false; + + // only show pagenumber if numbering on + $pgno = $this->docPageNum($this->page, true); + + if (($this->mirrorMargins) && (($this->page)%2==0)) { // EVEN + $side = 'even'; + } + else { // ODD // OR NOT MIRRORING MARGINS/FOOTERS = DEFAULT + $side = 'odd'; + } + $maxfontheight = 0; + foreach(array('L','C','R') AS $pos) { + if (isset($h[$side][$pos]['content']) && $h[$side][$pos]['content']) { + if (isset($h[$side][$pos]['font-size']) && $h[$side][$pos]['font-size']) { $hfsz = $h[$side][$pos]['font-size']; } + else { $hfsz = $this->default_font_size; } + $maxfontheight = max($maxfontheight,$hfsz); + } + } + // LEFT-CENTER-RIGHT + foreach(array('L','C','R') AS $pos) { + if (isset($h[$side][$pos]['content']) && $h[$side][$pos]['content']) { + $hd = str_replace('{PAGENO}',$pgno,$h[$side][$pos]['content']); + $hd = str_replace($this->aliasNbPgGp,$this->nbpgPrefix.$this->aliasNbPgGp.$this->nbpgSuffix,$hd); + $hd = preg_replace('/\{DATE\s+(.*?)\}/e',"date('\\1')",$hd); + if (isset($h[$side][$pos]['font-family']) && $h[$side][$pos]['font-family']) { $hff = $h[$side][$pos]['font-family']; } + else { $hff = $this->original_default_font; } + if (isset($h[$side][$pos]['font-size']) && $h[$side][$pos]['font-size']) { $hfsz = $h[$side][$pos]['font-size']; } + else { $hfsz = $this->original_default_font_size; } // pts + $maxfontheight = max($maxfontheight,$hfsz); + $hfst = ''; + if (isset($h[$side][$pos]['font-style']) && $h[$side][$pos]['font-style']) { + $hfst = $h[$side][$pos]['font-style']; + } + if (isset($h[$side][$pos]['color']) && $h[$side][$pos]['color']) { + $hfcol = $h[$side][$pos]['color']; + $cor = $this->ConvertColor($hfcol); + if ($cor) { $this->SetTColor($cor); } + } + else { $hfcol = ''; } + $this->SetFont($hff,$hfst,$hfsz,true,true); + $this->x = $headerlmargin ; + $this->y = $this->margin_header - $yadj ; + + $hd = $this->purify_utf8_text($hd); + if ($this->text_input_as_HTML) { + $hd = $this->all_entities_to_utf8($hd); + } + // CONVERT CODEPAGE + if ($this->usingCoreFont) { $hd = mb_convert_encoding($hd,$this->mb_enc,'UTF-8'); } + // DIRECTIONALITY RTL + $this->magic_reverse_dir($hd, true, $this->directionality); // *RTL* + // Font-specific ligature substitution for Indic fonts + if (isset($this->CurrentFont['indic']) && $this->CurrentFont['indic']) $this->ConvertIndic($hd); // *INDIC* + $align = $pos; +/*-- RTL --*/ + if ($this->directionality == 'rtl') { + if ($pos == 'L') { $align = 'R'; } + else if ($pos == 'R') { $align = 'L'; } + } +/*-- END RTL --*/ + if ($pos!='L' && (strpos($hd,$this->aliasNbPg)!==false || strpos($hd,$this->aliasNbPgGp)!==false)) { + if (strpos($hd,$this->aliasNbPgGp)!==false) { $type= 'nbpggp'; } else { $type= 'nbpg'; } + $this->_out('{mpdfheader'.$type.' '.$pos.' ff='.$hff.' fs='.$hfst.' fz='.$hfsz.'}'); + $this->Cell($headerpgwidth ,$maxfontheight/_MPDFK ,$hd,0,0,$align,0,'',0,0,0,'M'); + $this->_out('Q'); + } + else { + $this->Cell($headerpgwidth ,$maxfontheight/_MPDFK ,$hd,0,0,$align,0,'',0,0,0,'M'); + } + if ($hfcol) { $this->SetTColor($this->ConvertColor(0)); } + } + } + //Return Font to normal + $this->SetFont($this->default_font,'',$this->original_default_font_size); + // LINE + if (isset($h[$side]['line']) && $h[$side]['line']) { + $this->SetLineWidth(0.1); + $this->SetDColor($this->ConvertColor(0)); + $this->Line($headerlmargin , $this->margin_header + ($maxfontheight*(1+$this->header_line_spacing)/_MPDFK) - $yadj , $headerlmargin + $headerpgwidth, $this->margin_header + ($maxfontheight*(1+$this->header_line_spacing)/_MPDFK) - $yadj ); + } + if ($this->forcePortraitHeaders && $this->CurOrientation=='L' && $this->CurOrientation!=$this->DefOrientation) { + $this->_out('Q'); + } + } + $this->SetY($this->tMargin); + if ($this->ColActive) { $this->pgwidth = $this->ColWidth; } // *COLUMNS* + + $this->processingHeader=false; +} + + + +/*-- TABLES --*/ +function TableHeaderFooter($content='',$tablestartpage='',$tablestartcolumn ='',$horf = 'H',$level, $firstSpread=true, $finalSpread=true) { + if(($horf=='H' || $horf=='F') && !empty($content) && !empty($content[0])) { // mPDF 5.6.61 + $table = &$this->table[1][1]; + // Advance down page by half width of top border + + if ($horf=='H') { // Only if header + if ($table['borders_separate']) { $adv = $table['border_spacing_V']/2 + $table['border_details']['T']['w'] + $table['padding']['T']; } + else { $adv = $table['max_cell_border_width']['T'] /2 ; } + if ($adv) { + if ($this->table_rotate) { + $this->y += ($adv); + } + else { + $this->DivLn($adv,$this->blklvl,true); + } + } + } + + if ($horf=='F') { // Table Footer + $firstrow = count($table['cells']) - $table['footernrows']; + $lastrow = count($table['cells']) - 1; + } + else { // Table Header + $firstrow = 0; + $lastrow = $table['headernrows'] - 1; + } + + $topy = $content[$firstrow][0]['y']-$this->y; + + for ($i=$firstrow ; $i<=$lastrow; $i++) { + + $y = $this->y; + +/*-- COLUMNS --*/ + // If outside columns, this is done in PaintDivBB + if ($this->ColActive) { + //OUTER FILL BGCOLOR of DIVS + if ($this->blklvl > 0) { + $firstblockfill = $this->GetFirstBlockFill(); + if ($firstblockfill && $this->blklvl >= $firstblockfill) { + $divh = $content[$i][0]['h']; + $bak_x = $this->x; + $this->DivLn($divh,-3,false); + // Reset current block fill + $bcor = $this->blk[$this->blklvl]['bgcolorarray']; + $this->SetFColor($bcor); + $this->x = $bak_x; + } + } + } +/*-- END COLUMNS --*/ + + $colctr = 0; + foreach($content[$i] as $tablehf) { + $colctr++; + $y = $tablehf['y'] - $topy; + $this->y = $y; + //Set some cell values + $x = $tablehf['x']; + if (($this->mirrorMargins) && ($tablestartpage == 'ODD') && (($this->page)%2==0)) { // EVEN + $x = $x +$this->MarginCorrection; + } + else if (($this->mirrorMargins) && ($tablestartpage == 'EVEN') && (($this->page)%2==1)) { // ODD + $x = $x +$this->MarginCorrection; + } +/*-- COLUMNS --*/ + // Added to correct for Columns + if ($this->ColActive) { + if ($this->directionality == 'rtl') { // *RTL* + $x -= ($this->CurrCol - $tablestartcolumn) * ($this->ColWidth+$this->ColGap); // *RTL* + } // *RTL* + else { // *RTL* + $x += ($this->CurrCol - $tablestartcolumn) * ($this->ColWidth+$this->ColGap); + } // *RTL* + } +/*-- END COLUMNS --*/ + + if ($colctr==1) { $x0 = $x; } + + // mPDF ITERATION + if ($this->iterationCounter) { + foreach($tablehf['textbuffer'] AS $k=>$t) { + if (!is_array($t[0]) && preg_match('/{iteration ([a-zA-Z0-9_]+)}/',$t[0], $m)) { // mPDF 5.5.06 + $vname = '__'.$m[1].'_'; + if (!isset($this->$vname)) { $this->$vname = 1; } + else { $this->$vname++; } + $tablehf['textbuffer'][$k][0] = preg_replace('/{iteration '.$m[1].'}/', $this->$vname, $tablehf['textbuffer'][$k][0]); + } + } + } + + + $w = $tablehf['w']; + $h = $tablehf['h']; + $va = $tablehf['va']; + $R = $tablehf['R']; + $mih = $tablehf['mih']; + $border = $tablehf['border']; + $border_details = $tablehf['border_details']; + $padding = $tablehf['padding']; + $this->tabletheadjustfinished = true; + + $textbuffer = $tablehf['textbuffer']; + + $align = $tablehf['a']; + //Align + $this->divalign=$align; + $this->x = $x; + + if ($this->ColActive) { + if ($table['borders_separate']) { + $tablefill = isset($table['bgcolor'][-1]) ? $table['bgcolor'][-1] : 0; + if ($tablefill) { + $color = $this->ConvertColor($tablefill); + if ($color) { + $xadj = ($table['border_spacing_H']/2); + $yadj = ($table['border_spacing_V']/2); + $wadj = $table['border_spacing_H']; + $hadj = $table['border_spacing_V']; + if ($i == $firstrow && $horf=='H') { // Top + $yadj += $table['padding']['T'] + $table['border_details']['T']['w'] ; + $hadj += $table['padding']['T'] + $table['border_details']['T']['w'] ; + } + if (($i == ($lastrow) || (isset($tablehf['rowspan']) && ($i+$tablehf['rowspan']) == ($lastrow+1)) || (!isset($tablehf['rowspan']) && ($i+1) == ($lastrow+1))) && $horf=='F') { // Bottom + $hadj += $table['padding']['B'] + $table['border_details']['B']['w'] ; + } + if ($colctr == 1) { // Left + $xadj += $table['padding']['L'] + $table['border_details']['L']['w'] ; + $wadj += $table['padding']['L'] + $table['border_details']['L']['w'] ; + } + if ($colctr == count($content[$i]) ) { // Right + $wadj += $table['padding']['R'] + $table['border_details']['R']['w'] ; + } + $this->SetFColor($color); + $this->Rect($x - $xadj, $y - $yadj, $w + $wadj, $h + $hadj, 'F'); + } + } + } + } + + if ($table['empty_cells']!='hide' || !empty($textbuffer) || !$table['borders_separate']) { $paintcell = true; } + else { $paintcell = false; } + + //Vertical align + if ($R && INTVAL($R) > 0 && isset($va) && $va!='B') { $va='B';} + + if (!isset($va) || empty($va) || $va=='M') $this->y += ($h-$mih)/2; + elseif (isset($va) && $va=='B') $this->y += $h-$mih; + + + //TABLE ROW OR CELL FILL BGCOLOR + $fill = 0; + if (isset($tablehf['bgcolor']) && $tablehf['bgcolor'] && $tablehf['bgcolor']!='transparent') { + $fill = $tablehf['bgcolor']; + $leveladj = 6; + } + else if (isset($content[$i][0]['trbgcolor']) && $content[$i][0]['trbgcolor'] && $content[$i][0]['trbgcolor']!='transparent') { // Row color + $fill = $content[$i][0]['trbgcolor']; + $leveladj = 3; + } + if ($fill && $paintcell) { + $color = $this->ConvertColor($fill); + if ($color) { + if ($table['borders_separate']) { + if ($this->ColActive) { + $this->SetFColor($color); + $this->Rect($x+ ($table['border_spacing_H']/2), $y+ ($table['border_spacing_V']/2), $w- $table['border_spacing_H'], $h- $table['border_spacing_V'], 'F'); + } + else { + $this->tableBackgrounds[$level*9+$leveladj][] = array('gradient'=>false, 'x'=>($x + ($table['border_spacing_H']/2)), 'y'=>($y + ($table['border_spacing_V']/2)), 'w'=>($w - $table['border_spacing_H']), 'h'=>($h - $table['border_spacing_V']), 'col'=>$color); + } + } + else { + if ($this->ColActive) { + $this->SetFColor($color); + $this->Rect($x, $y, $w, $h, 'F'); + } + else { + $this->tableBackgrounds[$level*9+$leveladj][] = array('gradient'=>false, 'x'=>$x, 'y'=>$y, 'w'=>$w, 'h'=>$h, 'col'=>$color); + } + } + } + } + + +/*-- BACKGROUNDS --*/ + if (isset($tablehf['gradient']) && $tablehf['gradient'] && $paintcell){ + $g = $this->grad->parseBackgroundGradient($tablehf['gradient']); + if ($g) { + if ($table['borders_separate']) { + $px = $x+ ($table['border_spacing_H']/2); + $py = $y+ ($table['border_spacing_V']/2); + $pw = $w- $table['border_spacing_H']; + $ph = $h- $table['border_spacing_V']; + } + else { + $px = $x; + $py = $y; + $pw = $w; + $ph = $h; + } + if ($this->ColActive) { + $this->grad->Gradient($px, $py, $pw, $ph, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend']); + } + else { + $this->tableBackgrounds[$level*9+7][] = array('gradient'=>true, 'x'=>$px, 'y'=>$py, 'w'=>$pw, 'h'=>$ph, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + } + + if (isset($tablehf['background-image']) && $paintcell){ + if ($tablehf['background-image']['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $tablehf['background-image']['gradient'] )) { + $g = $this->grad->parseMozGradient( $tablehf['background-image']['gradient'] ); + if ($g) { + if ($table['borders_separate']) { + $px = $x+ ($table['border_spacing_H']/2); + $py = $y+ ($table['border_spacing_V']/2); + $pw = $w- $table['border_spacing_H']; + $ph = $h- $table['border_spacing_V']; + } + else { + $px = $x; + $py = $y; + $pw = $w; + $ph = $h; + } + if ($this->ColActive) { + $this->grad->Gradient($px, $py, $pw, $ph, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend']); + } + else { + $this->tableBackgrounds[$level*9+7][] = array('gradient'=>true, 'x'=>$px, 'y'=>$py, 'w'=>$pw, 'h'=>$ph, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + } + else if ($tablehf['background-image']['image_id']) { // Background pattern + $n = count($this->patterns)+1; + if ($table['borders_separate']) { + $px = $x+ ($table['border_spacing_H']/2); + $py = $y+ ($table['border_spacing_V']/2); + $pw = $w- $table['border_spacing_H']; + $ph = $h- $table['border_spacing_V']; + } + else { + $px = $x; + $py = $y; + $pw = $w; + $ph = $h; + } + if ($this->ColActive) { + list($orig_w, $orig_h, $x_repeat, $y_repeat) = $this->_resizeBackgroundImage($tablehf['background-image']['orig_w'], $tablehf['background-image']['orig_h'], $pw, $ph, $tablehf['background-image']['resize'], $tablehf['background-image']['x_repeat'] , $tablehf['background-image']['y_repeat']); + $this->patterns[$n] = array('x'=>$px, 'y'=>$py, 'w'=>$pw, 'h'=>$ph, 'pgh'=>$this->h, 'image_id'=>$tablehf['background-image']['image_id'], 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$tablehf['background-image']['x_pos'] , 'y_pos'=>$tablehf['background-image']['y_pos'] , 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'itype'=>$tablehf['background-image']['itype']); + if ($tablehf['background-image']['opacity']>0 && $tablehf['background-image']['opacity']<1) { $opac = $this->SetAlpha($tablehf['background-image']['opacity'],'Normal',true); } + else { $opac = ''; } + $this->_out(sprintf('q /Pattern cs /P%d scn %s %.3F %.3F %.3F %.3F re f Q', $n, $opac, $px*_MPDFK, ($this->h-$py)*_MPDFK, $pw*_MPDFK, -$ph*_MPDFK)); + } + else { + $this->tableBackgrounds[$level*9+8][] = array('x'=>$px, 'y'=>$py, 'w'=>$pw, 'h'=>$ph, 'image_id'=>$tablehf['background-image']['image_id'], 'orig_w'=>$tablehf['background-image']['orig_w'], 'orig_h'=>$tablehf['background-image']['orig_h'], 'x_pos'=>$tablehf['background-image']['x_pos'], 'y_pos'=>$tablehf['background-image']['y_pos'], 'x_repeat'=>$tablehf['background-image']['x_repeat'], 'y_repeat'=>$tablehf['background-image']['y_repeat'], 'clippath'=>'', 'resize'=>$tablehf['background-image']['resize'], 'opacity'=>$tablehf['background-image']['opacity'], 'itype'=>$tablehf['background-image']['itype']); + } + } + } +/*-- END BACKGROUNDS --*/ + + //Cell Border + if ($table['borders_separate'] && $paintcell && $border) { + $this->_tableRect($x+ ($table['border_spacing_H']/2)+($border_details['L']['w'] /2), $y+ ($table['border_spacing_V']/2)+($border_details['T']['w'] /2), $w-$table['border_spacing_H']-($border_details['L']['w'] /2)-($border_details['R']['w'] /2), $h- $table['border_spacing_V']-($border_details['T']['w'] /2)-($border_details['B']['w']/2), $border, $border_details, false, $table['borders_separate']); + } + else if ($paintcell && $border) { + $this->_tableRect($x, $y, $w, $h, $border, $border_details, true, $table['borders_separate']); // true causes buffer + } + + //Print cell content + //$this->divheight = $this->table_lineheight*$this->lineheight; + if (!empty($textbuffer)) { + if ($horf=='F' && preg_match('/{colsum([0-9]*)[_]*}/', $textbuffer[0][0], $m)) { + $rep = sprintf("%01.".intval($m[1])."f", $this->colsums[$colctr-1]); + $textbuffer[0][0] = preg_replace('/{colsum[0-9_]*}/', $rep ,$textbuffer[0][0]); + } + + if ($R) { + $cellPtSize = $textbuffer[0][11] / $this->shrin_k; + if (!$cellPtSize) { $cellPtSize = $this->default_font_size; } + $cellFontHeight = ($cellPtSize/_MPDFK); + $opx = $this->x; + $opy = $this->y; + $angle = INTVAL($R); + // Only allow 45 - 90 degrees (when bottom-aligned) or -90 + if ($angle > 90) { $angle = 90; } + else if ($angle > 0 && (isset($va) && $va!='B')) { $angle = 90; } + else if ($angle > 0 && $angle <45) { $angle = 45; } + else if ($angle < 0) { $angle = -90; } + $offset = ((sin(deg2rad($angle))) * 0.37 * $cellFontHeight); + if (isset($align) && $align =='R') { + $this->x += ($w) + ($offset) - ($cellFontHeight/3) - ($padding['R'] + $border_details['R']['w']); + } + else if (!isset($align ) || $align =='C') { + $this->x += ($w/2) + ($offset); + } + else { + $this->x += ($offset) + ($cellFontHeight/3)+($padding['L'] + $border_details['L']['w']); + } + $str = ''; + foreach($tablehf['textbuffer'] AS $t) { $str .= $t[0].' '; } + $str = trim($str); + + if (!isset($va) || $va=='M') { + $this->y -= ($h-$mih)/2; //Undo what was added earlier VERTICAL ALIGN + if ($angle > 0) { $this->y += (($h-$mih)/2)+($padding['T'] + $border_details['T']['w']) + ($mih-($padding['T'] + $border_details['T']['w']+$border_details['B']['w']+$padding['B'])); } + else if ($angle < 0) { $this->y += (($h-$mih)/2)+($padding['T'] + $border_details['T']['w']); } + } + else if (isset($va) && $va=='B') { + $this->y -= $h-$mih; //Undo what was added earlier VERTICAL ALIGN + if ($angle > 0) { $this->y += $h-($border_details['B']['w']+$padding['B']); } + else if ($angle < 0) { $this->y += $h-$mih+($padding['T'] + $border_details['T']['w']); } + } + else if (isset($va) && $va=='T') { + if ($angle > 0) { $this->y += $mih-($border_details['B']['w']+$padding['B']); } + else if ($angle < 0) { $this->y += ($padding['T'] + $border_details['T']['w']); } + } + + $this->Rotate($angle,$this->x,$this->y); + $s_fs = $this->FontSizePt; + $s_f = $this->FontFamily; + $s_st = $this->FontStyle; + if (!empty($textbuffer[0][3])) { //Font Color + $cor = $textbuffer[0][3]; + $this->SetTColor($cor); + } + $s_str = $this->strike; + $this->strike = $textbuffer[0][8]; //Strikethrough + $this->SetFont($textbuffer[0][4],$textbuffer[0][2],$cellPtSize,true,true); + $this->Text($this->x,$this->y,$str); + $this->Rotate(0); + $this->SetFont($s_f,$s_st,$s_fs,true,true); + $this->SetTColor(0); + $this->strike = $s_str; + $this->x = $opx; + $this->y = $opy; + } + else { + if ($table['borders_separate']) { // NB twice border width + $xadj = $border_details['L']['w'] + $padding['L'] +($table['border_spacing_H']/2); + $wadj = $border_details['L']['w'] + $border_details['R']['w'] + $padding['L'] +$padding['R'] + $table['border_spacing_H']; + $yadj = $border_details['T']['w'] + $padding['T'] + ($table['border_spacing_H']/2); + } + else { + $xadj = $border_details['L']['w']/2 + $padding['L']; + $wadj = ($border_details['L']['w'] + $border_details['R']['w'])/2 + $padding['L'] + $padding['R']; + $yadj = $border_details['T']['w']/2 + $padding['T']; + } + + $this->divwidth=$w-($wadj); + $this->x += $xadj; + $this->y += $yadj; + $this->printbuffer($textbuffer,'',true); + } + + } + $textbuffer = array(); + +/*-- BACKGROUNDS --*/ + if (!$this->ColActive) { + if (isset($content[$i][0]['trgradients']) && ($colctr==1 || $table['borders_separate'])) { + $g = $this->grad->parseBackgroundGradient($content[$i][0]['trgradients']); + if ($g) { + $gx = $x0; + $gy = $y; + $gh = $h; + $gw = $table['w'] - ($table['max_cell_border_width']['L']/2) - ($table['max_cell_border_width']['R']/2) - $table['margin']['L'] - $table['margin']['R']; + if ($table['borders_separate']) { + $gw -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']); + $s = ''; + $clx = $x+ ($table['border_spacing_H']/2); + $cly = $y+ ($table['border_spacing_V']/2); + $clw = $w- $table['border_spacing_H']; + $clh = $h- $table['border_spacing_V']; + // Set clipping path + $s = ' q 0 w '; // Line width=0 + $s .= sprintf('%.3F %.3F m ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // start point TL before the arc + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BL + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BR + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TR + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TL + $s .= ' W n '; // Ends path no-op & Sets the clipping path + $this->tableBackgrounds[$level*9+4][] = array('gradient'=>true, 'x'=>$gx + ($table['border_spacing_H']/2), 'y'=>$gy + ($table['border_spacing_V']/2), 'w'=>$gw - $table['border_spacing_V'], 'h'=>$gh - $table['border_spacing_H'], 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>$s); + } + else { + $this->tableBackgrounds[$level*9+4][] = array('gradient'=>true, 'x'=>$gx, 'y'=>$gy, 'w'=>$gw, 'h'=>$gh, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + } + + if (isset($content[$i][0]['trbackground-images']) && ($colctr==1 || $table['borders_separate'])) { + if ($content[$i][0]['trbackground-images']['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $content[$i][0]['trbackground-images']['gradient'] )) { + $g = $this->grad->parseMozGradient( $content[$i][0]['trbackground-images']['gradient'] ); + if ($g) { + $gx = $x0; + $gy = $y; + $gh = $h; + $gw = $table['w'] - ($table['max_cell_border_width']['L']/2) - ($table['max_cell_border_width']['R']/2) - $table['margin']['L'] - $table['margin']['R']; + if ($table['borders_separate']) { + $gw -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']); + $s = ''; + $clx = $x+ ($table['border_spacing_H']/2); + $cly = $y+ ($table['border_spacing_V']/2); + $clw = $w- $table['border_spacing_H']; + $clh = $h- $table['border_spacing_V']; + // Set clipping path + $s = ' q 0 w '; // Line width=0 + $s .= sprintf('%.3F %.3F m ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // start point TL before the arc + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BL + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BR + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TR + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TL + $s .= ' W n '; // Ends path no-op & Sets the clipping path + $this->tableBackgrounds[$level*9+4][] = array('gradient'=>true, 'x'=>$gx + ($table['border_spacing_H']/2), 'y'=>$gy + ($table['border_spacing_V']/2), 'w'=>$gw - $table['border_spacing_V'], 'h'=>$gh - $table['border_spacing_H'], 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>$s); + } + else { + $this->tableBackgrounds[$level*9+4][] = array('gradient'=>true, 'x'=>$gx, 'y'=>$gy, 'w'=>$gw, 'h'=>$gh, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + } + else { + $image_id = $content[$i][0]['trbackground-images']['image_id']; + $orig_w = $content[$i][0]['trbackground-images']['orig_w']; + $orig_h = $content[$i][0]['trbackground-images']['orig_h']; + $x_pos = $content[$i][0]['trbackground-images']['x_pos']; + $y_pos = $content[$i][0]['trbackground-images']['y_pos']; + $x_repeat = $content[$i][0]['trbackground-images']['x_repeat']; + $y_repeat = $content[$i][0]['trbackground-images']['y_repeat']; + $resize = $content[$i][0]['trbackground-images']['resize']; + $opacity = $content[$i][0]['trbackground-images']['opacity']; + $itype = $content[$i][0]['trbackground-images']['itype']; + + $clippath = ''; + $gx = $x0; + $gy = $y; + $gh = $h; + $gw = $table['w'] - ($table['max_cell_border_width']['L']/2) - ($table['max_cell_border_width']['R']/2) - $table['margin']['L'] - $table['margin']['R']; + if ($table['borders_separate']) { + $gw -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']); + $s = ''; + $clx = $x+ ($table['border_spacing_H']/2); + $cly = $y+ ($table['border_spacing_V']/2); + $clw = $w- $table['border_spacing_H']; + $clh = $h- $table['border_spacing_V']; + // Set clipping path + $s = ' q 0 w '; // Line width=0 + $s .= sprintf('%.3F %.3F m ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // start point TL before the arc + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BL + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BR + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TR + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TL + $s .= ' W n '; // Ends path no-op & Sets the clipping path + $this->tableBackgrounds[$level*9+5][] = array('x'=>$gx + ($table['border_spacing_H']/2), 'y'=>$gy + ($table['border_spacing_V']/2), 'w'=>$gw - $table['border_spacing_V'], 'h'=>$gh - $table['border_spacing_H'], 'image_id'=>$image_id, 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$x_pos, 'y_pos'=>$y_pos, 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'clippath'=>$s, 'resize'=>$resize, 'opacity'=>$opacity, 'itype'=>$itype); + } + else { + $this->tableBackgrounds[$level*9+5][] = array('x'=>$gx, 'y'=>$gy, 'w'=>$gw, 'h'=>$gh, 'image_id'=>$image_id, 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$x_pos, 'y_pos'=>$y_pos, 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'clippath'=>'', 'resize'=>$resize, 'opacity'=>$opacity, 'itype'=>$itype); + } + } + } + } +/*-- END BACKGROUNDS --*/ + + // TABLE BORDER - if separate OR collapsed and only table border + if (($table['borders_separate'] || ($this->simpleTables && !$table['simple']['border'])) && $table['border']) { + $halfspaceL = $table['padding']['L'] + ($table['border_spacing_H']/2); + $halfspaceR = $table['padding']['R'] + ($table['border_spacing_H']/2); + $halfspaceT = $table['padding']['T'] + ($table['border_spacing_V']/2); + $halfspaceB = $table['padding']['B'] + ($table['border_spacing_V']/2); + $tbx = $x; + $tby = $y; + $tbw = $w; + $tbh = $h; + $tab_bord = 0; + $corner = ''; + if ($i == $firstrow && $horf=='H') { // Top + $tby -= $halfspaceT + ($table['border_details']['T']['w']/2); + $tbh += $halfspaceT + ($table['border_details']['T']['w']/2); + $this->setBorder($tab_bord , _BORDER_TOP); + $corner .= 'T'; + } + if (($i == ($lastrow) || (isset($tablehf['rowspan']) && ($i+$tablehf['rowspan']) == ($lastrow+1))) && $horf=='F') { // Bottom + $tbh += $halfspaceB + ($table['border_details']['B']['w']/2); + $this->setBorder($tab_bord , _BORDER_BOTTOM); + $corner .= 'B'; + } + if ($colctr == 1 && $firstSpread) { // Left + $tbx -= $halfspaceL + ($table['border_details']['L']['w']/2); + $tbw += $halfspaceL + ($table['border_details']['L']['w']/2); + $this->setBorder($tab_bord , _BORDER_LEFT); + $corner .= 'L'; + } + if ($colctr == count($content[$i]) && $finalSpread) { // Right + $tbw += $halfspaceR + ($table['border_details']['R']['w']/2); + $this->setBorder($tab_bord , _BORDER_RIGHT); + $corner .= 'R'; + } + $this->_tableRect($tbx, $tby, $tbw, $tbh, $tab_bord , $table['border_details'], false, $table['borders_separate'], 'table', $corner, $table['border_spacing_V'], $table['border_spacing_H'] ); + } + + + }// end column $content + $this->y = $y + $h; //Update y coordinate + }// end row $i + unset($table ); + $this->colsums = array(); + } +} +/*-- END TABLES --*/ + +/*-- HTMLHEADERS-FOOTERS --*/ +function SetHTMLHeader($header='',$OE='',$write=false) { + + $height = 0; + if (is_array($header) && isset($header['html']) && $header['html']) { + $Hhtml = $header['html']; + if ($this->setAutoTopMargin) { + if (isset($header['h'])) { $height = $header['h']; } + else { $height = $this->_gethtmlheight($Hhtml); } + } + } + else if (!is_array($header) && $header) { + $Hhtml = $header; + if ($this->setAutoTopMargin) { $height = $this->_gethtmlheight($Hhtml); } + } + else { $Hhtml = ''; } + + if ($OE != 'E') { $OE = 'O'; } + if ($OE == 'E') { + + if ($Hhtml) { + $this->HTMLHeaderE['html'] = $Hhtml; + $this->HTMLHeaderE['h'] = $height; + } + else { $this->HTMLHeaderE = ''; } + } + else { + + if ($Hhtml) { + $this->HTMLHeader['html'] = $Hhtml; + $this->HTMLHeader['h'] = $height; + } + else { $this->HTMLHeader = ''; } + } + if (!$this->mirrorMargins && $OE == 'E') { return; } + if ($Hhtml=='') { return; } + if ($OE == 'E') { + $this->headerDetails['even'] = array(); // override and clear any other non-HTML header/footer + } + else { + $this->headerDetails['odd'] = array(); // override and clear any non-HTML other header/footer + } + + if ($this->setAutoTopMargin=='pad') { + $this->tMargin = $this->margin_header + $height + $this->orig_tMargin; + if (isset($this->saveHTMLHeader[$this->page][$OE]['mt'])) { $this->saveHTMLHeader[$this->page][$OE]['mt'] = $this->tMargin; } + } + else if ($this->setAutoTopMargin=='stretch') { + $this->tMargin = max($this->orig_tMargin, $this->margin_header + $height + $this->autoMarginPadding); + if (isset($this->saveHTMLHeader[$this->page][$OE]['mt'])) { $this->saveHTMLHeader[$this->page][$OE]['mt'] = $this->tMargin; } + } + if ($write && $this->state!=0 && (($this->mirrorMargins && $OE == 'E' && ($this->page)%2==0) || ($this->mirrorMargins && $OE != 'E' && ($this->page)%2==1) || !$this->mirrorMargins)) { $this->writeHTMLHeaders(); } +} + +function SetHTMLFooter($footer='',$OE='') { + + $height = 0; + if (is_array($footer) && isset($footer['html']) && $footer['html']) { + $Fhtml = $footer['html']; + if ($this->setAutoBottomMargin) { + if (isset($footer['h'])) { $height = $footer['h']; } + else { $height = $this->_gethtmlheight($Fhtml); } + } + } + else if (!is_array($footer) && $footer) { + $Fhtml = $footer; + if ($this->setAutoBottomMargin) { $height = $this->_gethtmlheight($Fhtml); } + } + else { $Fhtml = ''; } + + if ($OE != 'E') { $OE = 'O'; } + if ($OE == 'E') { + + if ($Fhtml) { + $this->HTMLFooterE['html'] = $Fhtml; + $this->HTMLFooterE['h'] = $height; + } + else { $this->HTMLFooterE = ''; } + } + else { + + if ($Fhtml) { + $this->HTMLFooter['html'] = $Fhtml; + $this->HTMLFooter['h'] = $height; + } + else { $this->HTMLFooter = ''; } + } + if (!$this->mirrorMargins && $OE == 'E') { return; } + if ($Fhtml=='') { return false; } + if ($OE == 'E') { + $this->footerDetails['even'] = array(); // override and clear any other header/footer + } + else { + $this->footerDetails['odd'] = array(); // override and clear any other header/footer + } + + if ($this->setAutoBottomMargin=='pad') { + $this->bMargin = $this->margin_footer + $height + $this->orig_bMargin; + $this->PageBreakTrigger=$this->h-$this->bMargin ; + if (isset($this->saveHTMLHeader[$this->page][$OE]['mb'])) { $this->saveHTMLHeader[$this->page][$OE]['mb'] = $this->bMargin; } + } + else if ($this->setAutoBottomMargin=='stretch') { + $this->bMargin = max($this->orig_bMargin, $this->margin_footer + $height + $this->autoMarginPadding); + $this->PageBreakTrigger=$this->h-$this->bMargin ; + if (isset($this->saveHTMLHeader[$this->page][$OE]['mb'])) { $this->saveHTMLHeader[$this->page][$OE]['mb'] = $this->bMargin; } + } +} + + +function _getHtmlHeight($html) { + $save_state = $this->state; + if($this->state==0) { + $this->AddPage($this->CurOrientation); + } + $this->state = 2; + $this->Reset(); + $this->pageoutput[$this->page] = array(); + $save_x = $this->x; + $save_y = $this->y; + $this->x = $this->lMargin; + $this->y = $this->margin_header; + $html = str_replace('{PAGENO}',$this->pagenumPrefix.$this->docPageNum($this->page).$this->pagenumSuffix,$html); + $html = str_replace($this->aliasNbPgGp,$this->nbpgPrefix.$this->docPageNumTotal($this->page).$this->nbpgSuffix,$html ); + $html = str_replace($this->aliasNbPg,$this->page,$html ); + $html = preg_replace('/\{DATE\s+(.*?)\}/e',"date('\\1')",$html ); + $this->HTMLheaderPageLinks = array(); + $this->HTMLheaderPageAnnots = array(); + $this->HTMLheaderPageForms = array(); + $savepb = $this->pageBackgrounds; + $this->writingHTMLheader = true; + $this->WriteHTML($html , 4); // parameter 4 saves output to $this->headerbuffer + $this->writingHTMLheader = false; + $h = ($this->y - $this->margin_header); + $this->Reset(); + $this->pageoutput[$this->page] = array(); + $this->headerbuffer = ''; + $this->pageBackgrounds = $savepb; + $this->x = $save_x; + $this->y = $save_y; + $this->state = $save_state; + if($save_state==0) { + unset($this->pages[1]); + $this->page = 0; + } + return $h; +} + + +// Called internally from Header +function writeHTMLHeaders() { + + if ($this->mirrorMargins && ($this->page)%2==0) { $OE = 'E'; } // EVEN + else { $OE = 'O'; } + if ($OE == 'E') { + $this->saveHTMLHeader[$this->page][$OE]['html'] = $this->HTMLHeaderE['html'] ; + } + else { + $this->saveHTMLHeader[$this->page][$OE]['html'] = $this->HTMLHeader['html'] ; + } + if ($this->forcePortraitHeaders && $this->CurOrientation=='L' && $this->CurOrientation!=$this->DefOrientation) { + $this->saveHTMLHeader[$this->page][$OE]['rotate'] = true; + $this->saveHTMLHeader[$this->page][$OE]['ml'] = $this->tMargin; + $this->saveHTMLHeader[$this->page][$OE]['mr'] = $this->bMargin; + $this->saveHTMLHeader[$this->page][$OE]['mh'] = $this->margin_header; + $this->saveHTMLHeader[$this->page][$OE]['mf'] = $this->margin_footer; + $this->saveHTMLHeader[$this->page][$OE]['pw'] = $this->h; + $this->saveHTMLHeader[$this->page][$OE]['ph'] = $this->w; + } + else { + $this->saveHTMLHeader[$this->page][$OE]['ml'] = $this->lMargin; + $this->saveHTMLHeader[$this->page][$OE]['mr'] = $this->rMargin; + $this->saveHTMLHeader[$this->page][$OE]['mh'] = $this->margin_header; + $this->saveHTMLHeader[$this->page][$OE]['mf'] = $this->margin_footer; + $this->saveHTMLHeader[$this->page][$OE]['pw'] = $this->w; + $this->saveHTMLHeader[$this->page][$OE]['ph'] = $this->h; + } +} + +function writeHTMLFooters() { + + if ($this->mirrorMargins && ($this->page)%2==0) { $OE = 'E'; } // EVEN + else { $OE = 'O'; } + if ($OE == 'E') { + $this->saveHTMLFooter[$this->page][$OE]['html'] = $this->HTMLFooterE['html'] ; + } + else { + $this->saveHTMLFooter[$this->page][$OE]['html'] = $this->HTMLFooter['html'] ; + } + if ($this->forcePortraitHeaders && $this->CurOrientation=='L' && $this->CurOrientation!=$this->DefOrientation) { + $this->saveHTMLFooter[$this->page][$OE]['rotate'] = true; + $this->saveHTMLFooter[$this->page][$OE]['ml'] = $this->tMargin; + $this->saveHTMLFooter[$this->page][$OE]['mr'] = $this->bMargin; + $this->saveHTMLFooter[$this->page][$OE]['mt'] = $this->rMargin; + $this->saveHTMLFooter[$this->page][$OE]['mb'] = $this->lMargin; + $this->saveHTMLFooter[$this->page][$OE]['mh'] = $this->margin_header; + $this->saveHTMLFooter[$this->page][$OE]['mf'] = $this->margin_footer; + $this->saveHTMLFooter[$this->page][$OE]['pw'] = $this->h; + $this->saveHTMLFooter[$this->page][$OE]['ph'] = $this->w; + } + else { + $this->saveHTMLFooter[$this->page][$OE]['ml'] = $this->lMargin; + $this->saveHTMLFooter[$this->page][$OE]['mr'] = $this->rMargin; + $this->saveHTMLFooter[$this->page][$OE]['mt'] = $this->tMargin; + $this->saveHTMLFooter[$this->page][$OE]['mb'] = $this->bMargin; + $this->saveHTMLFooter[$this->page][$OE]['mh'] = $this->margin_header; + $this->saveHTMLFooter[$this->page][$OE]['mf'] = $this->margin_footer; + $this->saveHTMLFooter[$this->page][$OE]['pw'] = $this->w; + $this->saveHTMLFooter[$this->page][$OE]['ph'] = $this->h; + } +} +/*-- END HTMLHEADERS-FOOTERS --*/ + +function DefHeaderByName($name,$arr) { + if (!$name) { $name = '_default'; } + $this->pageheaders[$name] = $arr; +} + +function DefFooterByName($name,$arr) { + if (!$name) { $name = '_default'; } + $this->pagefooters[$name] = $arr; +} + +function SetHeaderByName($name,$side='O',$write=false) { + if (!$name) { $name = '_default'; } + if ($side=='E') { $this->headerDetails['even'] = $this->pageheaders[$name]; } + else { $this->headerDetails['odd'] = $this->pageheaders[$name]; } + if ($write) { $this->Header(); } +} + +function SetFooterByName($name,$side='O') { + if (!$name) { $name = '_default'; } + if ($side=='E') { $this->footerDetails['even'] = $this->pagefooters[$name]; } + else { $this->footerDetails['odd'] = $this->pagefooters[$name]; } +} + +/*-- HTMLHEADERS-FOOTERS --*/ +function DefHTMLHeaderByName($name,$html) { + if (!$name) { $name = '_default'; } + + $this->pageHTMLheaders[$name]['html'] = $html; + $this->pageHTMLheaders[$name]['h'] = $this->_gethtmlheight($html); +} + +function DefHTMLFooterByName($name,$html) { + if (!$name) { $name = '_default'; } + + $this->pageHTMLfooters[$name]['html'] = $html; + $this->pageHTMLfooters[$name]['h'] = $this->_gethtmlheight($html); +} + +function SetHTMLHeaderByName($name,$side='O',$write=false) { + if (!$name) { $name = '_default'; } + $this->SetHTMLHeader($this->pageHTMLheaders[$name],$side,$write); +} + +function SetHTMLFooterByName($name,$side='O') { + if (!$name) { $name = '_default'; } + $this->SetHTMLFooter($this->pageHTMLfooters[$name],$side,$write); +} +/*-- END HTMLHEADERS-FOOTERS --*/ + + +function SetHeader($Harray=array(),$side='',$write=false) { + if (is_string($Harray)) { + if (strlen($Harray)==0) { + if ($side=='O') { $this->headerDetails['odd'] = array(); } + else if ($side=='E') { $this->headerDetails['even'] = array(); } + else { $this->headerDetails = array(); } + } + else if (strpos($Harray,'|') || strpos($Harray,'|')===0) { + $hdet = explode('|',$Harray); + $this->headerDetails = array ( + 'odd' => array ( + 'L' => array ('content' => $hdet[0], 'font-size' => $this->defaultheaderfontsize, 'font-style' => $this->defaultheaderfontstyle), + 'C' => array ('content' => $hdet[1], 'font-size' => $this->defaultheaderfontsize, 'font-style' => $this->defaultheaderfontstyle), + 'R' => array ('content' => $hdet[2], 'font-size' => $this->defaultheaderfontsize, 'font-style' => $this->defaultheaderfontstyle), + 'line' => $this->defaultheaderline, + ), + 'even' => array ( + 'R' => array ('content' => $hdet[0], 'font-size' => $this->defaultheaderfontsize, 'font-style' => $this->defaultheaderfontstyle), + 'C' => array ('content' => $hdet[1], 'font-size' => $this->defaultheaderfontsize, 'font-style' => $this->defaultheaderfontstyle), + 'L' => array ('content' => $hdet[2], 'font-size' => $this->defaultheaderfontsize, 'font-style' => $this->defaultheaderfontstyle), + 'line' => $this->defaultheaderline, + ) + ); + } + else { + $this->headerDetails = array ( + 'odd' => array ( + 'R' => array ('content' => $Harray, 'font-size' => $this->defaultheaderfontsize, 'font-style' => $this->defaultheaderfontstyle), + 'line' => $this->defaultheaderline, + ), + 'even' => array ( + 'L' => array ('content' => $Harray, 'font-size' => $this->defaultheaderfontsize, 'font-style' => $this->defaultheaderfontstyle), + 'line' => $this->defaultheaderline, + ) + ); + } + } + else if (is_array($Harray)) { + if ($side=='O') { $this->headerDetails['odd'] = $Harray; } + else if ($side=='E') { $this->headerDetails['even'] = $Harray; } + else { $this->headerDetails = $Harray; } + } +/*-- HTMLHEADERS-FOOTERS --*/ + // Overwrite any HTML Header previously set + if ($side=='E') { $this->SetHTMLHeader('','E'); } + else if ($side=='O') { $this->SetHTMLHeader(''); } + else { + $this->SetHTMLHeader(''); + $this->SetHTMLHeader('','E'); + } +/*-- END HTMLHEADERS-FOOTERS --*/ + + if ($write) { + $save_y = $this->y; + $this->Header(); + $this->SetY($save_y) ; + } +} + + + + +function SetFooter($Farray=array(),$side='') { + if (is_string($Farray)) { + if (strlen($Farray)==0) { + if ($side=='O') { $this->footerDetails['odd'] = array(); } + else if ($side=='E') { $this->footerDetails['even'] = array(); } + else { $this->footerDetails = array(); } + } + else if (strpos($Farray,'|') || strpos($Farray,'|')===0) { + $fdet = explode('|',$Farray); + $this->footerDetails = array ( + 'odd' => array ( + 'L' => array ('content' => $fdet[0], 'font-size' => $this->defaultfooterfontsize, 'font-style' => $this->defaultfooterfontstyle), + 'C' => array ('content' => $fdet[1], 'font-size' => $this->defaultfooterfontsize, 'font-style' => $this->defaultfooterfontstyle), + 'R' => array ('content' => $fdet[2], 'font-size' => $this->defaultfooterfontsize, 'font-style' => $this->defaultfooterfontstyle), + 'line' => $this->defaultfooterline, + ), + 'even' => array ( + 'R' => array ('content' => $fdet[0], 'font-size' => $this->defaultfooterfontsize, 'font-style' => $this->defaultfooterfontstyle), + 'C' => array ('content' => $fdet[1], 'font-size' => $this->defaultfooterfontsize, 'font-style' => $this->defaultfooterfontstyle), + 'L' => array ('content' => $fdet[2], 'font-size' => $this->defaultfooterfontsize, 'font-style' => $this->defaultfooterfontstyle), + 'line' => $this->defaultfooterline, + ) + ); + } + else { + $this->footerDetails = array ( + 'odd' => array ( + 'R' => array ('content' => $Farray, 'font-size' => $this->defaultfooterfontsize, 'font-style' => $this->defaultfooterfontstyle), + 'line' => $this->defaultfooterline, + ), + 'even' => array ( + 'L' => array ('content' => $Farray, 'font-size' => $this->defaultfooterfontsize, 'font-style' => $this->defaultfooterfontstyle), + 'line' => $this->defaultfooterline, + ) + ); + } + } + else if (is_array($Farray)) { + if ($side=='O') { $this->footerDetails['odd'] = $Farray; } + else if ($side=='E') { $this->footerDetails['even'] = $Farray; } + else { $this->footerDetails = $Farray; } + } +/*-- HTMLHEADERS-FOOTERS --*/ + // Overwrite any HTML Footer previously set + if ($side=='E') { $this->SetHTMLFooter('','E'); } + else if ($side=='O') { $this->SetHTMLFooter(''); } + else { + $this->SetHTMLFooter(''); + $this->SetHTMLFooter('','E'); + } +/*-- END HTMLHEADERS-FOOTERS --*/ +} + +/*-- WATERMARK --*/ +function setUnvalidatedText($txt='', $alpha=-1) { + if ($alpha>=0) $this->watermarkTextAlpha = $alpha; + $this->watermarkText = $txt; +} +function SetWatermarkText($txt='', $alpha=-1) { + if ($alpha>=0) $this->watermarkTextAlpha = $alpha; + $this->watermarkText = $txt; +} + +function SetWatermarkImage($src, $alpha=-1, $size='D', $pos='F') { + if ($alpha>=0) $this->watermarkImageAlpha = $alpha; + $this->watermarkImage = $src; + $this->watermark_size = $size; + $this->watermark_pos = $pos; +} +/*-- END WATERMARK --*/ + + +//Page footer +function Footer() { +/*-- CSS-PAGE --*/ + // PAGED MEDIA - CROP / CROSS MARKS from @PAGE + if ($this->show_marks == 'CROP' || $this->show_marks == 'CROPCROSS') { + // Show TICK MARKS + $this->SetLineWidth(0.1); // = 0.1 mm + $this->SetDColor($this->ConvertColor(0)); + $l = $this->cropMarkLength; + $m = $this->cropMarkMargin; // Distance of crop mark from margin + $b = $this->nonPrintMargin; // Non-printable border at edge of paper sheet + $ax1 = $b; + $bx = $this->page_box['outer_width_LR'] - $m; + $ax = max($ax1, $bx-$l); + $cx1 = $this->w - $b; + $dx = $this->w - $this->page_box['outer_width_LR'] + $m; + $cx = min($cx1, $dx+$l); + $ay1 = $b; + $by = $this->page_box['outer_width_TB'] - $m; + $ay = max($ay1, $by-$l); + $cy1 = $this->h - $b; + $dy = $this->h - $this->page_box['outer_width_TB'] + $m; + $cy = min($cy1, $dy+$l); + + $this->Line($ax, $this->page_box['outer_width_TB'], $bx, $this->page_box['outer_width_TB']); + $this->Line($cx, $this->page_box['outer_width_TB'], $dx, $this->page_box['outer_width_TB']); + $this->Line($ax, $this->h - $this->page_box['outer_width_TB'], $bx, $this->h - $this->page_box['outer_width_TB']); + $this->Line($cx, $this->h - $this->page_box['outer_width_TB'], $dx, $this->h - $this->page_box['outer_width_TB']); + $this->Line($this->page_box['outer_width_LR'], $ay, $this->page_box['outer_width_LR'], $by); + $this->Line($this->page_box['outer_width_LR'], $cy, $this->page_box['outer_width_LR'], $dy); + $this->Line($this->w - $this->page_box['outer_width_LR'], $ay, $this->w - $this->page_box['outer_width_LR'], $by); + $this->Line($this->w - $this->page_box['outer_width_LR'], $cy, $this->w - $this->page_box['outer_width_LR'], $dy); + + if ($this->printers_info) { + $hd = date('Y-m-d H:i').' Page '.$this->page.' of {nb}'; + $this->SetTColor($this->ConvertColor(0)); + $this->SetFont('arial','',7.5,true,true); + $this->x = $this->page_box['outer_width_LR'] + 1.5; + $this->y = 1; + $this->Cell($headerpgwidth ,$this->FontSize,$hd,0,0,'L',0,'',0,0,0,'M'); + $this->SetFont($this->default_font,'',$this->original_default_font_size); + } + + } + if ($this->show_marks == 'CROSS' || $this->show_marks == 'CROPCROSS') { + $this->SetLineWidth(0.1); // = 0.1 mm + $this->SetDColor($this->ConvertColor(0)); + $l = 14 /2; // longer length of the cross line (half) + $w = 6 /2; // shorter width of the cross line (half) + $r = 1.2; // radius of circle + $m = $this->crossMarkMargin; // Distance of cross mark from margin + $x1 = $this->page_box['outer_width_LR'] - $m; + $x2 = $this->w - $this->page_box['outer_width_LR'] + $m; + $y1 = $this->page_box['outer_width_TB'] - $m; + $y2 = $this->h - $this->page_box['outer_width_TB'] + $m; + // Left + $this->Circle($x1, $this->h/2, $r, 'S') ; + $this->Line($x1-$w, $this->h/2, $x1+$w, $this->h/2); + $this->Line($x1, $this->h/2-$l, $x1, $this->h/2+$l); + // Right + $this->Circle($x2, $this->h/2, $r, 'S') ; + $this->Line($x2-$w, $this->h/2, $x2+$w, $this->h/2); + $this->Line($x2, $this->h/2-$l, $x2, $this->h/2+$l); + // Top + $this->Circle($this->w/2, $y1, $r, 'S') ; + $this->Line($this->w/2, $y1-$w, $this->w/2, $y1+$w); + $this->Line($this->w/2-$l, $y1, $this->w/2+$l, $y1); + // Bottom + $this->Circle($this->w/2, $y2, $r, 'S') ; + $this->Line($this->w/2, $y2-$w, $this->w/2, $y2+$w); + $this->Line($this->w/2-$l, $y2, $this->w/2+$l, $y2); + } + + + // If @page set non-HTML headers/footers named, they were not read until later in the HTML code - so now set them + if ($this->page==1) { + if ($this->firstPageBoxHeader) { + $this->headerDetails['odd'] = $this->pageheaders[$this->firstPageBoxHeader]; + $this->Header(); + } + if ($this->firstPageBoxFooter) { + $this->footerDetails['odd'] = $this->pagefooters[$this->firstPageBoxFooter]; + } + $this->firstPageBoxHeader=''; + $this->firstPageBoxFooter=''; + } +/*-- END CSS-PAGE --*/ + + + +/*-- HTMLHEADERS-FOOTERS --*/ + if (($this->mirrorMargins && ($this->page%2==0) && $this->HTMLFooterE) || ($this->mirrorMargins && ($this->page%2==1) && $this->HTMLFooter) || (!$this->mirrorMargins && $this->HTMLFooter)) { + $this->writeHTMLFooters(); +/*-- WATERMARK --*/ + if (($this->watermarkText) && ($this->showWatermarkText)) { + $this->watermark( $this->watermarkText, 45, 120, $this->watermarkTextAlpha); // Watermark text + } + if (($this->watermarkImage) && ($this->showWatermarkImage)) { + $this->watermarkImg( $this->watermarkImage, $this->watermarkImageAlpha); // Watermark image + } +/*-- END WATERMARK --*/ + return; + } +/*-- END HTMLHEADERS-FOOTERS --*/ + + $this->processingHeader=true; + $this->ResetMargins(); // necessary after columns + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; +/*-- WATERMARK --*/ + if (($this->watermarkText) && ($this->showWatermarkText)) { + $this->watermark( $this->watermarkText, 45, 120, $this->watermarkTextAlpha); // Watermark text + } + if (($this->watermarkImage) && ($this->showWatermarkImage)) { + $this->watermarkImg( $this->watermarkImage, $this->watermarkImageAlpha); // Watermark image + } +/*-- END WATERMARK --*/ + $h = $this->footerDetails; + if(count($h)) { + + if ($this->forcePortraitHeaders && $this->CurOrientation=='L' && $this->CurOrientation!=$this->DefOrientation) { + $this->_out(sprintf('q 0 -1 1 0 0 %.3F cm ',($this->h*_MPDFK))); + $headerpgwidth = $this->h - $this->orig_lMargin - $this->orig_rMargin; + if (($this->mirrorMargins) && (($this->page)%2==0)) { // EVEN + $headerlmargin = $this->orig_rMargin; + } + else { + $headerlmargin = $this->orig_lMargin; + } + } + else { + $yadj = 0; + $headerpgwidth = $this->pgwidth; + $headerlmargin = $this->lMargin; + } + $this->SetY(-$this->margin_footer); + + $this->SetTColor($this->ConvertColor(0)); + $this->SUP = false; + $this->SUB = false; + $this->bullet = false; + + // only show pagenumber if numbering on + $pgno = $this->docPageNum($this->page, true); + + if (($this->mirrorMargins) && (($this->page)%2==0)) { // EVEN + $side = 'even'; + } + else { // ODD // OR NOT MIRRORING MARGINS/FOOTERS = DEFAULT + $side = 'odd'; + } + $maxfontheight = 0; + foreach(array('L','C','R') AS $pos) { + if (isset($h[$side][$pos]['content']) && $h[$side][$pos]['content']) { + if (isset($h[$side][$pos]['font-size']) && $h[$side][$pos]['font-size']) { $hfsz = $h[$side][$pos]['font-size']; } + else { $hfsz = $this->default_font_size; } + $maxfontheight = max($maxfontheight,$hfsz); + } + } + // LEFT-CENTER-RIGHT + foreach(array('L','C','R') AS $pos) { + if (isset($h[$side][$pos]['content']) && $h[$side][$pos]['content']) { + $hd = str_replace('{PAGENO}',$pgno,$h[$side][$pos]['content']); + $hd = str_replace($this->aliasNbPgGp,$this->nbpgPrefix.$this->aliasNbPgGp.$this->nbpgSuffix,$hd); + $hd = preg_replace('/\{DATE\s+(.*?)\}/e',"date('\\1')",$hd); + if (isset($h[$side][$pos]['font-family']) && $h[$side][$pos]['font-family']) { $hff = $h[$side][$pos]['font-family']; } + else { $hff = $this->original_default_font; } + if (isset($h[$side][$pos]['font-size']) && $h[$side][$pos]['font-size']) { $hfsz = $h[$side][$pos]['font-size']; } + else { $hfsz = $this->original_default_font_size; } + $maxfontheight = max($maxfontheight,$hfsz); + if (isset($h[$side][$pos]['font-style']) && $h[$side][$pos]['font-style']) { $hfst = $h[$side][$pos]['font-style']; } + else { $hfst = ''; } + if (isset($h[$side][$pos]['color']) && $h[$side][$pos]['color']) { + $hfcol = $h[$side][$pos]['color']; + $cor = $this->ConvertColor($hfcol); + if ($cor) { $this->SetTColor($cor); } + } + else { $hfcol = ''; } + $this->SetFont($hff,$hfst,$hfsz,true,true); + $this->x = $headerlmargin ; + $this->y = $this->h - $this->margin_footer - ($maxfontheight/_MPDFK); + $hd = $this->purify_utf8_text($hd); + if ($this->text_input_as_HTML) { + $hd = $this->all_entities_to_utf8($hd); + } + // CONVERT CODEPAGE + if ($this->usingCoreFont) { $hd = mb_convert_encoding($hd,$this->mb_enc,'UTF-8'); } + // DIRECTIONALITY RTL + $this->magic_reverse_dir($hd, true, $this->directionality); // *RTL* + // Font-specific ligature substitution for Indic fonts + if (isset($this->CurrentFont['indic']) && $this->CurrentFont['indic']) $this->ConvertIndic($hd); // *INDIC* + $align = $pos; + if ($this->directionality == 'rtl') { + if ($pos == 'L') { $align = 'R'; } + else if ($pos == 'R') { $align = 'L'; } + } + + if ($pos!='L' && (strpos($hd,$this->aliasNbPg)!==false || strpos($hd,$this->aliasNbPgGp)!==false)) { + if (strpos($hd,$this->aliasNbPgGp)!==false) { $type= 'nbpggp'; } else { $type= 'nbpg'; } + $this->_out('{mpdfheader'.$type.' '.$pos.' ff='.$hff.' fs='.$hfst.' fz='.$hfsz.'}'); + $this->Cell($headerpgwidth ,$maxfontheight/_MPDFK ,$hd,0,0,$align,0,'',0,0,0,'M'); + $this->_out('Q'); + } + else { + $this->Cell($headerpgwidth ,$maxfontheight/_MPDFK ,$hd,0,0,$align,0,'',0,0,0,'M'); + } + if ($hfcol) { $this->SetTColor($this->ConvertColor(0)); } + } + } + // Return Font to normal + $this->SetFont($this->default_font,'',$this->original_default_font_size); + + // LINE + + if (isset($h[$side]['line']) && $h[$side]['line']) { + $this->SetLineWidth(0.1); + $this->SetDColor($this->ConvertColor(0)); + $this->Line($headerlmargin , $this->y-($maxfontheight*($this->footer_line_spacing)/_MPDFK), $headerlmargin +$headerpgwidth, $this->y-($maxfontheight*($this->footer_line_spacing)/_MPDFK)); + } + if ($this->forcePortraitHeaders && $this->CurOrientation=='L' && $this->CurOrientation!=$this->DefOrientation) { + $this->_out('Q'); + } + } + $this->processingHeader=false; + +} + +/////////////////// +// HYPHENATION +/////////////////// +// mPDF 5.6.21 +// Hard hyphens +function hardHyphenate($word, $maxWidth) { + // Don't hyphenate web addresses + if (preg_match('/^(http:|www\.)/',$word)) { return array(false,'','',''); } + + // Get dictionary + $poss = array(); + $softhyphens = array(); + $offset = 0; + $p = true; + if ($this->usingCoreFont) { + $wl = strlen($word); + } + else { + $wl = mb_strlen($word,'UTF-8'); + } + while($offset < $wl) { + if (!$this->usingCoreFont) { + $p = mb_strpos($word, "-", $offset, 'UTF-8'); + } + else if ($this->FontFamily!='csymbol' && $this->FontFamily!='czapfdingbats') { + $p = strpos($word, "-", $offset); + } + if ($p !== false) { $poss[] = $p - count($poss); } + else { break; } + $offset = $p+1; + } + $success = false; + foreach($poss AS $i) { + if ($this->usingCoreFont) { + $a = substr($word,0,$i); + if ($this->GetStringWidth($a.'-') > $maxWidth) { break ; } + $pre = $a; + $post = substr($word,$i,strlen($word)); + $prelength = strlen($pre); + } + else { + $a = mb_substr($word,0,$i,'UTF-8'); + if ($this->GetStringWidth($a.'-') > $maxWidth) { break ; } + $pre = $a; + $post = mb_substr($word,$i,mb_strlen($word,'UTF-8'),'UTF-8'); + $prelength = mb_strlen($pre, 'UTF-8'); + } + $success = true; + } + return array($success,$pre,$post,$prelength); +} + + +/*-- HYPHENATION --*/ +/////////////////// +/////////////////// +// HYPHENATION +/////////////////// +// Soft hyphs +function softHyphenate($word, $maxWidth) { + // Don't hyphenate web addresses + if (preg_match('/^(http:|www\.)/',$word)) { return array(false,'','',''); } + + // Get dictionary + $poss = array(); + $softhyphens = array(); + $offset = 0; + $p = true; + if ($this->usingCoreFont) { + $wl = strlen($word); + } + else { + $wl = mb_strlen($word,'UTF-8'); + } + while($offset < $wl) { + // Soft Hyphens chr(173) + if (!$this->usingCoreFont) { + $p = mb_strpos($word, "\xc2\xad", $offset, 'UTF-8'); + } + else if ($this->FontFamily!='csymbol' && $this->FontFamily!='czapfdingbats') { + $p = strpos($word, chr(173), $offset); + } + if ($p !== false) { $poss[] = $p - count($poss); } + else { break; } + $offset = $p+1; + } + $success = false; + foreach($poss AS $i) { + if ($this->usingCoreFont) { + $a = substr($word,0,$i); + if ($this->GetStringWidth($a.'-') > $maxWidth) { break ; } + $pre = $a; + $post = substr($word,$i,strlen($word)); + $prelength = strlen($pre); + } + else { + $a = mb_substr($word,0,$i,'UTF-8'); + if ($this->GetStringWidth($a.'-') > $maxWidth) { break ; } + $pre = $a; + $post = mb_substr($word,$i,mb_strlen($word,'UTF-8'),'UTF-8'); + $prelength = mb_strlen($pre, 'UTF-8'); + } + $success = true; + } + return array($success,$pre,$post,$prelength); +} + +/////////////////// +// Word hyphenation +function hyphenateWord($word, $maxWidth) { + // Do everything inside this function in utf-8 + // Don't hyphenate web addresses + if (preg_match('/^(http:|www\.)/',$word)) { return array(false,'','',''); } + + + // Get dictionary + if (!$this->loadedSHYdictionary) { + if (file_exists(_MPDF_PATH.'patterns/dictionary.txt')) { + $this->SHYdictionary = file(_MPDF_PATH.'patterns/dictionary.txt',FILE_SKIP_EMPTY_LINES); + foreach($this->SHYdictionary as $entry) { + $entry = trim($entry); + $poss = array(); + $offset = 0; + $p = true; + $wl = mb_strlen($entry ,'UTF-8'); + while($offset < $wl) { + $p = mb_strpos($entry, '/', $offset, 'UTF-8'); + if ($p !== false) { $poss[] = $p - count($poss); } + else { break; } + $offset = $p+1; + } + if (count($poss)) { $this->SHYdictionaryWords[str_replace('/', '', mb_strtolower($entry))] = $poss; } + } + } + $this->loadedSHYdictionary = true; + } + + if (!in_array($this->SHYlang,$this->SHYlanguages)) { return array(false,'','',''); } + // If no pattern loaded or not the best one + if (count($this->SHYpatterns) < 1 || ($this->loadedSHYpatterns && $this->loadedSHYpatterns != $this->SHYlang)) { + include(_MPDF_PATH."patterns/" . $this->SHYlang . ".php"); + $patterns = explode(' ', $patterns); + $new_patterns = array(); + for($i = 0; $i < count($patterns); $i++) { + $value = $patterns[$i]; + $new_patterns[preg_replace('/[0-9]/', '', $value)] = $value; + } + $this->SHYpatterns = $new_patterns; + $this->loadedSHYpatterns = $this->SHYlang; + } + + if ($this->usingCoreFont) { $word = mb_convert_encoding($word,'UTF-8',$this->mb_enc); } + + $prepre = ''; + $postpost = ''; + $startpunctuation = "\xc2\xab\xc2\xbf\xe2\x80\x98\xe2\x80\x9b\xe2\x80\x9c\xe2\x80\x9f"; + $endpunctuation = "\xe2\x80\x9e\xe2\x80\x9d\xe2\x80\x9a\xe2\x80\x99\xc2\xbb"; + $pre = ''; + $post = ''; + + + if (preg_match('/^(["\''.$startpunctuation .'])+(.{'.$this->SHYcharmin.',})$/u',$word,$m)) { + $prepre = $m[1]; + $word = $m[2]; + } + if (preg_match('/^(.{'.$this->SHYcharmin.',})([\'\.,;:!?"'.$endpunctuation .']+)$/u',$word,$m)) { + $word = $m[1]; + $postpost = $m[2]; + } + if(mb_strlen($word,'UTF-8') < $this->SHYcharmin) { + return array(false,'','',''); + } + $success = false; + + if(isset($this->SHYdictionaryWords[mb_strtolower($word)])) { + foreach($this->SHYdictionaryWords[mb_strtolower($word)] AS $i) { + $a = $prepre . mb_substr($word,0,$i,'UTF-8'); + if ($this->usingCoreFont) { $testa = mb_convert_encoding($a,$this->mb_enc,'UTF-8'); } + else { $testa = $a; } + if ($this->GetStringWidth($testa.'-') > $maxWidth) { break ; } + $pre = $a; + $post = mb_substr($word,$i,mb_strlen($word,'UTF-8'),'UTF-8') . $postpost; + $success = true; + } + } + + if (!$success) { + $text_word = '_' . $word . '_'; + $word_length = mb_strlen($text_word,'UTF-8'); + + $single_character = preg_split('//u', $text_word); + + $text_word = mb_strtolower($text_word,'UTF-8'); + $hyphenated_word = array(); + $numb3rs = array('0' => true, '1' => true, '2' => true, '3' => true, '4' => true, '5' => true, '6' => true, '7' => true, '8' => true, '9' => true); + for($position = 0; $position <= ($word_length - $this->SHYcharmin); $position++) { + $maxwins = min(($word_length - $position), $this->SHYcharmax); + for($win = $this->SHYcharmin; $win <= $maxwins; $win++) { + if(isset($this->SHYpatterns[mb_substr($text_word, $position, $win,'UTF-8')])) { + $pattern = $this->SHYpatterns[mb_substr($text_word, $position, $win,'UTF-8')]; + $digits = 1; + $pattern_length = mb_strlen($pattern,'UTF-8'); + for($i = 0; $i < $pattern_length; $i++) { + $char = $pattern[$i]; + if(isset($numb3rs[$char])) { + $zero = ($i == 0) ? $position - 1 : $position + $i - $digits; + if(!isset($hyphenated_word[$zero]) || $hyphenated_word[$zero] != $char) $hyphenated_word[$zero] = $char; + $digits++; + } + } + } + } + } + + for($i = $this->SHYleftmin; $i <= (mb_strlen($word,'UTF-8') - $this->SHYrightmin); $i++) { + if(isset($hyphenated_word[$i]) && $hyphenated_word[$i] % 2 != 0) { + $a = $prepre . mb_substr($word,0,$i,'UTF-8'); + if ($this->usingCoreFont) { $testa = mb_convert_encoding($a,$this->mb_enc,'UTF-8'); } + else { $testa = $a; } + if ($this->GetStringWidth($testa.'-') > $maxWidth + 0.0001) { break ; } + $pre = $a; + $post = mb_substr($word,$i,mb_strlen($word,'UTF-8'),'UTF-8') . $postpost; + $success = true; + } + } + } + if ($this->usingCoreFont) { + $pre = mb_convert_encoding($pre,$this->mb_enc,'UTF-8'); + $post = mb_convert_encoding($post,$this->mb_enc,'UTF-8'); + $prelength = strlen($pre); + } + else { + $prelength = mb_strlen($pre); + } + return array($success,$pre,$post,$prelength); + +} +/*-- END HYPHENATION --*/ + + +/*-- HTML-CSS --*/ +/////////////////// +/// HTML parser /// +/////////////////// +function WriteHTML($html,$sub=0,$init=true,$close=true) { + // $sub ADDED - 0 = default; 1=headerCSS only; 2=HTML body (parts) only; 3 - HTML parses only + // 4 - writes HTML headers + // $close Leaves buffers etc. in current state, so that it can continue a block etc. + // $init - Clears and sets buffers to Top level block etc. + + if (empty($html)) { $html = ''; } + if ($this->progressBar) { $this->UpdateProgressBar(1,0,'Parsing CSS & Headers'); } // *PROGRESS-BAR* + + if ($init) { + $this->headerbuffer=''; + $this->textbuffer = array(); + $this->fixedPosBlockSave = array(); + } + if ($sub == 1) { $html = '<style> '.$html.' </style>'; } // stylesheet only + + if ($this->allow_charset_conversion) { + if ($sub < 1) { + $this->ReadCharset($html); + } + if ($this->charset_in && $sub!=4) { // mPDF 5.4.14 + $success = iconv($this->charset_in,'UTF-8//TRANSLIT',$html); + if ($success) { $html = $success; } + } + } + $html = $this->purify_utf8($html,false); + if ($init) { + $this->blklvl = 0; + $this->lastblocklevelchange = 0; + $this->blk = array(); + $this->initialiseBlock($this->blk[0]); + $this->blk[0]['width'] =& $this->pgwidth; + $this->blk[0]['inner_width'] =& $this->pgwidth; + $this->blk[0]['blockContext'] = $this->blockContext; + } + + $zproperties = array(); + if ($sub < 2) { + $this->ReadMetaTags($html); + + // mPDF 5.6.18 + if (preg_match('/<base[^>]*href=["\']([^"\'>]*)["\']/i', $html, $m)) { + $this->SetBasePath($m[1]); + } + // NB default stylesheet now in mPDF.css - read on initialising class + $html = $this->cssmgr->ReadCSS($html); + + if ($this->useLang && !$this->usingCoreFont && preg_match('/<html [^>]*lang=[\'\"](.*?)[\'\"]/ism',$html,$m)) { + $html_lang = $m[1]; + } + + if (preg_match('/<html [^>]*dir=[\'\"]\s*rtl\s*[\'\"]/ism',$html)) { + $zproperties['DIRECTION'] = 'rtl'; + } + + // allow in-line CSS for body tag to be parsed // Get <body> tag inline CSS + if (preg_match('/<body([^>]*)>(.*?)<\/body>/ism',$html,$m) || preg_match('/<body([^>]*)>(.*)$/ism',$html,$m)) { + $html = $m[2]; + // Changed to allow style="background: url('bg.jpg')" + if (preg_match('/style=[\"](.*?)[\"]/ism',$m[1],$mm) || preg_match('/style=[\'](.*?)[\']/ism',$m[1],$mm)) { + $zproperties = $this->cssmgr->readInlineCSS($mm[1]); + } + if (preg_match('/dir=[\'\"]\s*rtl\s*[\'\"]/ism',$m[1])) { + $zproperties['DIRECTION'] = 'rtl'; + } + if (isset($html_lang) && $html_lang) { $zproperties['LANG'] = $html_lang; } + if ($this->useLang && !$this->onlyCoreFonts && preg_match('/lang=[\'\"](.*?)[\'\"]/ism',$m[1],$mm)) { + $zproperties['LANG'] = $mm[1]; + } + + } + } + $properties = $this->cssmgr->MergeCSS('BLOCK','BODY',''); + if ($zproperties) { $properties = $this->cssmgr->array_merge_recursive_unique($properties,$zproperties); } + + if (isset($properties['DIRECTION']) && $properties['DIRECTION']) { + $this->cssmgr->CSS['BODY']['DIRECTION'] = $properties['DIRECTION']; + } + if (!isset($this->cssmgr->CSS['BODY']['DIRECTION'])) { + $this->cssmgr->CSS['BODY']['DIRECTION'] = $this->directionality; + } + else { $this->SetDirectionality($this->cssmgr->CSS['BODY']['DIRECTION']); } + + $this->setCSS($properties,'','BODY'); + $this->blk[0]['InlineProperties'] = $this->saveInlineProperties(); + + if ($sub == 1) { return ''; } + if (!isset($this->cssmgr->CSS['BODY'])) { $this->cssmgr->CSS['BODY'] = array(); } + +/*-- BACKGROUNDS --*/ + if (isset($properties['BACKGROUND-GRADIENT'])) { + $this->bodyBackgroundGradient = $properties['BACKGROUND-GRADIENT']; + } + + if (isset($properties['BACKGROUND-IMAGE']) && $properties['BACKGROUND-IMAGE']) { + $ret = $this->SetBackground($properties, $this->pgwidth); + if ($ret) { $this->bodyBackgroundImage = $ret; } + } +/*-- END BACKGROUNDS --*/ + +/*-- CSS-PAGE --*/ + // If page-box is set + if ($this->state==0 && isset($this->cssmgr->CSS['@PAGE']) && $this->cssmgr->CSS['@PAGE'] ) { + $this->page_box['current'] = ''; + $this->page_box['using'] = true; + list($pborientation,$pbmgl,$pbmgr,$pbmgt,$pbmgb,$pbmgh,$pbmgf,$hname,$fname,$bg,$resetpagenum,$pagenumstyle,$suppress,$marks,$newformat) = $this->SetPagedMediaCSS('', false, 'O'); + $this->DefOrientation = $this->CurOrientation = $pborientation; + $this->orig_lMargin = $this->DeflMargin = $pbmgl; + $this->orig_rMargin = $this->DefrMargin = $pbmgr; + $this->orig_tMargin = $this->tMargin = $pbmgt; + $this->orig_bMargin = $this->bMargin = $pbmgb; + $this->orig_hMargin = $this->margin_header = $pbmgh; + $this->orig_fMargin = $this->margin_footer = $pbmgf; + list($pborientation,$pbmgl,$pbmgr,$pbmgt,$pbmgb,$pbmgh,$pbmgf,$hname,$fname,$bg,$resetpagenum,$pagenumstyle,$suppress,$marks,$newformat) = $this->SetPagedMediaCSS('', true, 'O'); // first page + $this->show_marks = $marks; + if ($hname && !preg_match('/^html_(.*)$/i',$hname)) $this->firstPageBoxHeader = $hname; + if ($fname && !preg_match('/^html_(.*)$/i',$fname)) $this->firstPageBoxFooter = $fname; + } +/*-- END CSS-PAGE --*/ + + $parseonly = false; + $this->bufferoutput = false; + if ($sub == 3) { + $parseonly = true; + // Close any open block tags + for ($b= $this->blklvl;$b>0;$b--) { $this->CloseTag($this->blk[$b]['tag']); } + // Output any text left in buffer + if (count($this->textbuffer)) { $this->printbuffer($this->textbuffer); } + $this->textbuffer=array(); + } + else if ($sub == 4) { + // Close any open block tags + for ($b= $this->blklvl;$b>0;$b--) { $this->CloseTag($this->blk[$b]['tag']); } + // Output any text left in buffer + if (count($this->textbuffer)) { $this->printbuffer($this->textbuffer); } + $this->bufferoutput = true; + $this->textbuffer=array(); + $this->headerbuffer=''; + $properties = $this->cssmgr->MergeCSS('BLOCK','BODY',''); + $this->setCSS($properties,'','BODY'); + } + + mb_internal_encoding('UTF-8'); + + $html = $this->AdjustHTML($html, $this->tabSpaces); //Try to make HTML look more like XHTML + + if ($this->autoFontGroups) { $html = $this->AutoFont($html); } + +/*-- HTMLHEADERS-FOOTERS --*/ + preg_match_all('/<htmlpageheader([^>]*)>(.*?)<\/htmlpageheader>/si',$html,$h); + for($i=0;$i<count($h[1]);$i++) { + if (preg_match('/name=[\'|\"](.*?)[\'|\"]/',$h[1][$i],$n)) { + $this->pageHTMLheaders[$n[1]]['html'] = $h[2][$i]; + $this->pageHTMLheaders[$n[1]]['h'] = $this->_gethtmlheight($h[2][$i]); + } + } + preg_match_all('/<htmlpagefooter([^>]*)>(.*?)<\/htmlpagefooter>/si',$html,$f); + for($i=0;$i<count($f[1]);$i++) { + if (preg_match('/name=[\'|\"](.*?)[\'|\"]/',$f[1][$i],$n)) { + $this->pageHTMLfooters[$n[1]]['html'] = $f[2][$i]; + $this->pageHTMLfooters[$n[1]]['h'] = $this->_gethtmlheight($f[2][$i]); + } + } +/*-- END HTMLHEADERS-FOOTERS --*/ + $html = preg_replace('/<htmlpageheader.*?<\/htmlpageheader>/si','',$html); + $html = preg_replace('/<htmlpagefooter.*?<\/htmlpagefooter>/si','',$html); + + if($this->state==0 && $sub!=1 && $sub!=3 && $sub!=4) { + $this->AddPage($this->CurOrientation); + } + + +/*-- HTMLHEADERS-FOOTERS --*/ + + if (isset($hname) && preg_match('/^html_(.*)$/i',$hname,$n)) $this->SetHTMLHeader($this->pageHTMLheaders[$n[1]],'O',true); + if (isset($fname) && preg_match('/^html_(.*)$/i',$fname,$n)) $this->SetHTMLFooter($this->pageHTMLfooters[$n[1]],'O'); + +/*-- END HTMLHEADERS-FOOTERS --*/ + + $html=str_replace('<?','< ',$html); //Fix '<?XML' bug from HTML code generated by MS Word + + $this->checkSIP = false; + $this->checkSMP = false; + $this->checkCJK = false; + if ($this->onlyCoreFonts) { $html = $this->SubstituteChars($html); } + else { + if (preg_match("/([".$this->pregRTLchars."])/u", $html)) { $this->biDirectional = true; } // *RTL* + if (preg_match("/([\x{20000}-\x{2FFFF}])/u", $html)) { $this->checkSIP = true; } + if (preg_match("/([\x{10000}-\x{1FFFF}])/u", $html)) { $this->checkSMP = true; } +/*-- CJK-FONTS --*/ + if (preg_match("/([".$this->pregCJKchars."])/u", $html)) { $this->checkCJK = true; } +/*-- END CJK-FONTS --*/ + } + + // Don't allow non-breaking spaces that are converted to substituted chars or will break anyway and mess up table width calc. + $html = str_replace('<tta>160</tta>',chr(32),$html); + $html = str_replace('</tta><tta>','|',$html); + $html = str_replace('</tts><tts>','|',$html); + $html = str_replace('</ttz><ttz>','|',$html); + + //Add new supported tags in the DisableTags function + $html=strip_tags($html,$this->enabledtags); //remove all unsupported tags, but the ones inside the 'enabledtags' string + + //Explode the string in order to parse the HTML code + $a=preg_split('/<(.*?)>/ms',$html,-1,PREG_SPLIT_DELIM_CAPTURE); + // ? more accurate regexp that allows e.g. <a name="Silly <name>"> + // if changing - also change in fn.SubstituteChars() + // $a = preg_split ('/<((?:[^<>]+(?:"[^"]*"|\'[^\']*\')?)+)>/ms', $html, -1, PREG_SPLIT_DELIM_CAPTURE); + + if ($this->mb_enc) { + mb_internal_encoding($this->mb_enc); + } + $pbc = 0; + if ($this->progressBar) { $this->UpdateProgressBar(1,0); } // *PROGRESS-BAR* + $this->subPos = -1; + $cnt = count($a); + for($i=0;$i<$cnt; $i++) { + $e = $a[$i]; + if($i%2==0) { + //TEXT + if ($this->blk[$this->blklvl]['hide']) { continue; } + if ($this->inlineDisplayOff) { continue; } + if ($this->inMeter) { continue; } // mPDF 5.5.09 + + if ($this->inFixedPosBlock) { $this->fixedPosBlock .= $e; continue; } // *CSS-POSITION* + if (strlen($e) == 0) { continue; } + + $e = strcode2utf($e); + $e = $this->lesser_entity_decode($e); + + if ($this->usingCoreFont) { + // If core font is selected in document which is not onlyCoreFonts - substitute with non-core font + if ($this->useSubstitutions && !$this->onlyCoreFonts && $this->subPos<$i && !$this->specialcontent) { + $cnt += $this->SubstituteCharsNonCore($a, $i, $e); + } + // CONVERT ENCODING + $e = mb_convert_encoding($e,$this->mb_enc,'UTF-8'); + // mPDF 5.6.41 + if ($this->toupper) { $e = mb_strtoupper($e,$this->mb_enc); } + if ($this->tolower) { $e = mb_strtolower($e,$this->mb_enc); } + if ($this->capitalize) { $e = mb_convert_case($e, MB_CASE_TITLE, "UTF-8"); } + } + else { + if ($this->checkSIP && $this->CurrentFont['sipext'] && $this->subPos<$i && !$this->specialcontent) { + $cnt += $this->SubstituteCharsSIP($a, $i, $e); + } + + if ($this->useSubstitutions && !$this->onlyCoreFonts && $this->CurrentFont['type']!='Type0' && $this->subPos<$i && !$this->specialcontent) { + // mPDF 5.6.62 removes U+200E/U+200F LTR and RTL mark and U+200C/U+200D Zero-width Joiner and Non-joiner + $e = preg_replace("/[\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\x8e\xe2\x80\x8f]/u",'',$e); + $cnt += $this->SubstituteCharsMB($a, $i, $e); + } + if ($this->biDirectional) { // *RTL* + $e = preg_replace("/([".$this->pregRTLchars."]+)/ue", '$this->ArabJoin(stripslashes(\'\\1\'))', $e); // *RTL* + } // *RTL* + // Font-specific ligature substitution for Indic fonts + if (isset($this->CurrentFont['indic']) && $this->CurrentFont['indic']) $this->ConvertIndic($e); // *INDIC* + + // mPDF 5.6.62 removes U+200E/U+200F LTR and RTL mark and U+200C/U+200D Zero-width Joiner and Non-joiner + $e = preg_replace("/[\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\x8e\xe2\x80\x8f]/u",'',$e); + + if ($this->toupper) { $e = mb_strtoupper($e,$this->mb_enc); } + if ($this->tolower) { $e = mb_strtolower($e,$this->mb_enc); } + if ($this->capitalize) { $e = mb_convert_case($e, MB_CASE_TITLE, "UTF-8"); } + } + if (($this->tts) || ($this->ttz) || ($this->tta)) { + $es = explode('|',$e); + $e = ''; + foreach($es AS $val) { + $e .= chr($val); + } + } + //Adjust lineheight + + // FORM ELEMENTS + if ($this->specialcontent) { +/*-- FORMS --*/ + //SELECT tag (form element) + if ($this->specialcontent == "type=select") { + $e = ltrim($e); + $stringwidth = $this->GetStringWidth($e); + if (!isset($this->selectoption['MAXWIDTH']) || $stringwidth > $this->selectoption['MAXWIDTH']) { $this->selectoption['MAXWIDTH'] = $stringwidth; } + if (!isset($this->selectoption['SELECTED']) || $this->selectoption['SELECTED'] == '') { $this->selectoption['SELECTED'] = $e; } + // mPDD 1.4 Active Forms + if (isset($this->selectoption['ACTIVE']) && $this->selectoption['ACTIVE']) { + $this->selectoption['ITEMS'][]=array('exportValue'=>$this->selectoption['currentVAL'], 'content'=>$e, 'selected'=>$this->selectoption['currentSEL']); + } + } + // TEXTAREA + else { + $objattr = unserialize($this->specialcontent); + $objattr['text'] = $e; + $te = "\xbb\xa4\xactype=textarea,objattr=".serialize($objattr)."\xbb\xa4\xac"; + if ($this->tdbegin) { + $this->_saveCellTextBuffer($te, $this->HREF); + } + else { + $this->_saveTextBuffer($te, $this->HREF); + } + } +/*-- END FORMS --*/ + } + + // TABLE + else if ($this->tableLevel) { +/*-- TABLES --*/ + if ($this->tdbegin) { + if (($this->ignorefollowingspaces) && !$this->ispre) { $e = ltrim($e); } + if ($e || $e==='0') { + if (($this->blockjustfinished || $this->listjustfinished) && $this->cell[$this->row][$this->col]['s']>0) { + $this->_saveCellTextBuffer("\n"); + if (!isset($this->cell[$this->row][$this->col]['maxs'])) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + elseif($this->cell[$this->row][$this->col]['maxs'] < $this->cell[$this->row][$this->col]['s']) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + $this->cell[$this->row][$this->col]['s'] = 0;// reset + } + $this->blockjustfinished=false; + $this->listjustfinished=false; + + $this->_saveCellTextBuffer($e, $this->HREF); + + if (!isset($this->cell[$this->row][$this->col]['R']) || !$this->cell[$this->row][$this->col]['R']) { + if (isset($this->cell[$this->row][$this->col]['s'])) { + $this->cell[$this->row][$this->col]['s'] += $this->GetStringWidth($e, false); + } + else { $this->cell[$this->row][$this->col]['s'] = $this->GetStringWidth($e, false); } + if (!empty($this->spanborddet)) { + $this->cell[$this->row][$this->col]['s'] += $this->spanborddet['L']['w'] + $this->spanborddet['R']['w']; + } + } + + if ($this->checkCJK && preg_match("/([".$this->pregCJKchars."])/u", $e)) { $this->tableCJK = true; } // *CJK-FONTS* + + // mPDF 5.6.13 Decimal mark alignment + if (substr($this->cell[$this->row][$this->col]['a'],0,1) == 'D') { + $dp = $this->decimal_align[substr($this->cell[$this->row][$this->col]['a'],0,2)]; + $s = preg_split('/'.preg_quote($dp,'/').'/', $e, 2); // ? needs to be /u if not core + $s0 = $this->GetStringWidth($s[0], false); + if ($s[1]) { $s1 = $this->GetStringWidth(($s[1].$dp), false); } + else $s1 = 0; + if (!isset($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs0'])) { + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs0'] = $s0; + } + else { + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs0'] = max($s0, $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs0']); + } + if (!isset($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs1'])) { + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs1'] = $s1; + } + else { + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs1'] = max($s1, $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['decimal_align'][$this->col]['maxs1']); + } + } + + if ($this->tableLevel==1 && $this->useGraphs) { + $this->graphs[$this->currentGraphId]['data'][$this->row][$this->col] = $e; + } + $this->nestedtablejustfinished = false; + $this->linebreakjustfinished=false; + } + } +/*-- END TABLES --*/ + } + // ALL ELSE + else { + if ($this->ignorefollowingspaces and !$this->ispre) { $e = ltrim($e); } + if ($e || $e==='0') $this->_saveTextBuffer($e, $this->HREF); + } + } + + + else { // TAG ** + + if($e[0]=='/') { +/*-- PROGRESS-BAR --*/ + if ($this->progressBar) { // 10% increments + if (intval($i*10/$cnt) != $pbc) { $pbc = intval($i*10/$cnt); $this->UpdateProgressBar(1,$pbc*10,$tag); } + } +/*-- END PROGRESS-BAR --*/ + + + // Check for tags where HTML specifies optional end tags, + // and/or does not allow nesting e.g. P inside P, or + $endtag = trim(strtoupper(substr($e,1))); // mPDF 5.4.20 + if($this->blk[$this->blklvl]['hide']) { + if (in_array($endtag, $this->outerblocktags) || in_array($endtag, $this->innerblocktags)) { + unset($this->blk[$this->blklvl]); + $this->blklvl--; + } + continue; + } + +/*-- CSS-POSITION --*/ + if ($this->inFixedPosBlock) { + if (in_array($endtag, $this->outerblocktags) || in_array($endtag, $this->innerblocktags)) { $this->fixedPosBlockDepth--; } + if ($this->fixedPosBlockDepth == 0) { + $this->fixedPosBlockSave[] = array($this->fixedPosBlock, $this->fixedPosBlockBBox, $this->page); + $this->fixedPosBlock = ''; + $this->inFixedPosBlock = false; + continue; + } + $this->fixedPosBlock .= '<'.$e.'>'; + continue; + } +/*-- END CSS-POSITION --*/ + if ($this->allow_html_optional_endtags && !$parseonly) { + if (($endtag == 'DIV' || $endtag =='FORM' || $endtag =='CENTER') && $this->lastoptionaltag == 'P') { $this->CloseTag($this->lastoptionaltag ); } + if ($this->lastoptionaltag == 'LI' && $endtag == 'OL') { $this->CloseTag($this->lastoptionaltag ); } + if ($this->lastoptionaltag == 'LI' && $endtag == 'UL') { $this->CloseTag($this->lastoptionaltag ); } + if ($this->lastoptionaltag == 'DD' && $endtag == 'DL') { $this->CloseTag($this->lastoptionaltag ); } + if ($this->lastoptionaltag == 'DT' && $endtag == 'DL') { $this->CloseTag($this->lastoptionaltag ); } + if ($this->lastoptionaltag == 'OPTION' && $endtag == 'SELECT') { $this->CloseTag($this->lastoptionaltag ); } +/*-- TABLES --*/ + if ($endtag == 'TABLE') { + if ($this->lastoptionaltag == 'THEAD' || $this->lastoptionaltag == 'TBODY' || $this->lastoptionaltag == 'TFOOT') { + $this->CloseTag($this->lastoptionaltag); + } + if ($this->lastoptionaltag == 'TR') { $this->CloseTag('TR'); } + if ($this->lastoptionaltag == 'TD' || $this->lastoptionaltag == 'TH') { $this->CloseTag($this->lastoptionaltag ); $this->CloseTag('TR'); } + } + if ($endtag == 'THEAD' || $endtag == 'TBODY' || $endtag == 'TFOOT') { + if ($this->lastoptionaltag == 'TR') { $this->CloseTag('TR'); } + if ($this->lastoptionaltag == 'TD' || $this->lastoptionaltag == 'TH') { $this->CloseTag($this->lastoptionaltag ); $this->CloseTag('TR'); } + } + if ($endtag == 'TR') { + if ($this->lastoptionaltag == 'TD' || $this->lastoptionaltag == 'TH') { $this->CloseTag($this->lastoptionaltag ); } + } +/*-- END TABLES --*/ + } + $this->CloseTag($endtag); + } + + else { // OPENING TAG + if($this->blk[$this->blklvl]['hide']) { + if (strpos($e,' ')) { $te = strtoupper(substr($e,0,strpos($e,' '))); } + else { $te = strtoupper($e); } + if (in_array($te, $this->outerblocktags) || in_array($te, $this->innerblocktags)) { + $this->blklvl++; + $this->blk[$this->blklvl]['hide']=true; + } + continue; + } + +/*-- CSS-POSITION --*/ + if ($this->inFixedPosBlock) { + if (strpos($e,' ')) { $te = strtoupper(substr($e,0,strpos($e,' '))); } + else { $te = strtoupper($e); } + $this->fixedPosBlock .= '<'.$e.'>'; + if (in_array($te, $this->outerblocktags) || in_array($te, $this->innerblocktags)) { $this->fixedPosBlockDepth++; } + continue; + } +/*-- END CSS-POSITION --*/ + $regexp = '|=\'(.*?)\'|s'; // eliminate single quotes, if any + $e = preg_replace($regexp,"=\"\$1\"",$e); + // changes anykey=anyvalue to anykey="anyvalue" (only do this inside [some] tags) + if (substr($e,0,10)!='pageheader' && substr($e,0,10)!='pagefooter' && substr($e,0,12)!='tocpagebreak') { // mPDF 5.6.69 + $regexp = '| (\\w+?)=([^\\s>"]+)|si'; + $e = preg_replace($regexp," \$1=\"\$2\"",$e); + } + + $e = preg_replace('/ (\\S+?)\s*=\s*"/i', " \\1=\"", $e); + + //Fix path values, if needed + $orig_srcpath = ''; + if ((stristr($e,"href=") !== false) or (stristr($e,"src=") !== false) ) { + $regexp = '/ (href|src)\s*=\s*"(.*?)"/i'; + preg_match($regexp,$e,$auxiliararray); + if (isset($auxiliararray[2])) { $path = $auxiliararray[2]; } + else { $path = ''; } + if (trim($path) != '' && !(stristr($e,"src=") !== false && substr($path,0,4)=='var:')) { + $orig_srcpath = $path; + $this->GetFullPath($path); + $regexp = '/ (href|src)="(.*?)"/i'; + $e = preg_replace($regexp,' \\1="'.$path.'"',$e); + } + }//END of Fix path values + + + //Extract attributes + $contents=array(); + $contents1=array(); // mPDF 5.5.17 + $contents2=array(); + // Changed to allow style="background: url('bg.jpg')" + // mPDF 5.5.17 Changed to improve performance; maximum length of \S (attribute) = 16 + // mPDF 5.6.30 Increase allowed attribute name to 32 - cutting off "toc-even-header-name" etc. + preg_match_all('/\\S{1,32}=["][^"]*["]/',$e,$contents1); + preg_match_all('/\\S{1,32}=[\'][^\']*[\']/i',$e,$contents2); + + $contents = array_merge($contents1, $contents2); + preg_match('/\\S+/',$e,$a2); + $tag=strtoupper($a2[0]); + $attr=array(); + if ($orig_srcpath) { $attr['ORIG_SRC'] = $orig_srcpath; } + if (!empty($contents)) { + foreach($contents[0] as $v) { + // Changed to allow style="background: url('bg.jpg')" + if(preg_match('/^([^=]*)=["]?([^"]*)["]?$/',$v,$a3) || preg_match('/^([^=]*)=[\']?([^\']*)[\']?$/',$v,$a3)) { + if (strtoupper($a3[1])=='ID' || strtoupper($a3[1])=='CLASS') { // 4.2.013 Omits STYLE + $attr[strtoupper($a3[1])]=trim(strtoupper($a3[2])); + } + // includes header-style-right etc. used for <pageheader> + else if (preg_match('/^(HEADER|FOOTER)-STYLE/i',$a3[1])) { + $attr[strtoupper($a3[1])]=trim(strtoupper($a3[2])); + } + else { + $attr[strtoupper($a3[1])]=trim($a3[2]); + } + } + } + } + $this->OpenTag($tag,$attr); +/*-- CSS-POSITION --*/ + if ($this->inFixedPosBlock) { + $this->fixedPosBlockBBox = array($tag,$attr, $this->x, $this->y); + $this->fixedPosBlock = ''; + $this->fixedPosBlockDepth = 1; + } +/*-- END CSS-POSITION --*/ + // mPDF 5.5.09 + if (preg_match('/\/$/',$e)) { $this->closeTag($tag); } + + } + + } // end TAG + } //end of foreach($a as $i=>$e) + + if ($close) { + + // Close any open block tags + for ($b= $this->blklvl;$b>0;$b--) { $this->CloseTag($this->blk[$b]['tag']); } + + // Output any text left in buffer + if (count($this->textbuffer) && !$parseonly) { $this->printbuffer($this->textbuffer); } + if (!$parseonly) $this->textbuffer=array(); + +/*-- CSS-FLOAT --*/ + // If ended with a float, need to move to end page + $currpos = $this->page*1000 + $this->y; + if (isset($this->blk[$this->blklvl]['float_endpos']) && $this->blk[$this->blklvl]['float_endpos'] > $currpos) { + $old_page = $this->page; + $new_page = intval($this->blk[$this->blklvl]['float_endpos'] /1000); + if ($old_page != $new_page) { + $s = $this->PrintPageBackgrounds(); + // Writes after the marker so not overwritten later by page background etc. + $this->pages[$this->page] = preg_replace('/(___BACKGROUND___PATTERNS'.date('jY').')/', '\\1'."\n".$s."\n", $this->pages[$this->page]); + $this->pageBackgrounds = array(); + $this->page = $new_page; + $this->ResetMargins(); + $this->Reset(); + $this->pageoutput[$this->page] = array(); + } + $this->y = (($this->blk[$this->blklvl]['float_endpos'] *1000) % 1000000)/1000; // mod changes operands to integers before processing + } +/*-- END CSS-FLOAT --*/ + +/*-- CSS-IMAGE-FLOAT --*/ + $this->printfloatbuffer(); +/*-- END CSS-IMAGE-FLOAT --*/ + + //Create Internal Links, if needed + if (!empty($this->internallink) ) { + foreach($this->internallink as $k=>$v) { + if (strpos($k,"#") !== false ) { continue; } //ignore + $ypos = $v['Y']; + $pagenum = $v['PAGE']; + $sharp = "#"; + while (array_key_exists($sharp.$k,$this->internallink)) { + $internallink = $this->internallink[$sharp.$k]; + $this->SetLink($internallink,$ypos,$pagenum); + $sharp .= "#"; + } + } + } + + $this->linemaxfontsize = ''; + $this->lineheight_correction = $this->default_lineheight_correction; + + $this->bufferoutput = false; + +/*-- CSS-POSITION --*/ + if (count($this->fixedPosBlockSave) && $sub != 4) { + foreach($this->fixedPosBlockSave AS $fpbs) { + $old_page = $this->page; + $this->page = $fpbs[2]; + $this->WriteFixedPosHTML($fpbs[0], 0, 0, 100, 100,'auto', $fpbs[1]); // 0,0,10,10 are overwritten by bbox + $this->page = $old_page; + } + } +/*-- END CSS-POSITION --*/ + + } +} + +/*-- CSS-POSITION --*/ + +function WriteFixedPosHTML($html='',$x, $y, $w, $h, $overflow='visible', $bounding=array()) { + // $overflow can be 'hidden', 'visible' or 'auto' - 'auto' causes autofit to size + // Annotations disabled - enabled in mPDF 5.0 + // Links do work + // Will always go on current page (or start Page 1 if required) + // Probably INCOMPATIBLE WITH keep with table, columns etc. + // Called externally or interally via <div style="position: [fixed|absolute]"> + // When used internally, $x $y $w $h and $overflow are all overridden by $bounding + + $overflow = strtolower($overflow); + if($this->state==0) { + $this->AddPage($this->CurOrientation); + } + $save_y = $this->y; + $save_x = $this->x; + $this->fullImageHeight = $this->h; + $save_cols = false; +/*-- COLUMNS --*/ + if ($this->ColActive) { + $save_cols = true; + $save_nbcol = $this->NbCol; // other values of gap and vAlign will not change by setting Columns off + $this->SetColumns(0); + } +/*-- END COLUMNS --*/ + $save_annots = $this->title2annots; // *ANNOTATIONS* + $this->writingHTMLheader = true; // a FIX to stop pagebreaks etc. + $this->writingHTMLfooter = true; + $this->InFooter = true; // suppresses autopagebreaks + $save_bgs = $this->pageBackgrounds; + $checkinnerhtml = preg_replace('/\s/','',$html); + + if ($w > $this->w) { $x = 0; $w = $this->w; } + if ($h > $this->h) { $y = 0; $h = $this->h; } + if ($x > $this->w) { $x = $this->w - $w; } + if ($y > $this->h) { $y = $this->h - $h; } + + if (!empty($bounding)) { + // $cont_ containing block = full physical page (position: absolute) or page inside margins (position: fixed) + // $bbox_ Bounding box is the <div> which is positioned absolutely/fixed + // top/left/right/bottom/width/height/background*/border*/padding*/margin* are taken from bounding + // font*[family/size/style/weight]/line-height/text*[align/decoration/transform/indent]/color are transferred to $inner + // as an enclosing <div> (after having checked ID/CLASS) + // $x, $y, $w, $h are inside of $bbox_ = containing box for $inner_ + // $inner_ InnerHTML is the contents of that block to be output + $tag = $bounding[0]; + $attr = $bounding[1]; + $orig_x0 = $bounding[2]; + $orig_y0 = $bounding[3]; + + // As in WriteHTML() initialising + $this->blklvl = 0; + $this->lastblocklevelchange = 0; + $this->blk = array(); + $this->initialiseBlock($this->blk[0]); + + $this->blk[0]['width'] =& $this->pgwidth; + $this->blk[0]['inner_width'] =& $this->pgwidth; + + $this->blk[0]['blockContext'] = $this->blockContext; + + $properties = $this->cssmgr->MergeCSS('BLOCK','BODY',''); + $this->setCSS($properties,'','BODY'); + $this->blklvl = 1; + $this->initialiseBlock($this->blk[1]); + $this->blk[1]['tag'] = $tag; + $this->blk[1]['attr'] = $attr; + $this->Reset(); + $p = $this->cssmgr->MergeCSS('BLOCK',$tag,$attr); + if (isset($p['ROTATE']) && ($p['ROTATE']==90 || $p['ROTATE']==-90)) { $rotate = $p['ROTATE']; } + else { $rotate = 0; } + if (isset($p['OVERFLOW'])) { $overflow = strtolower($p['OVERFLOW']); } + if (strtolower($p['POSITION']) == 'fixed') { + $cont_w = $this->pgwidth; // $this->blk[0]['inner_width']; + $cont_h = $this->h - $this->tMargin - $this->bMargin; + $cont_x = $this->lMargin; + $cont_y = $this->tMargin; + } + else { + $cont_w = $this->w; // ABSOLUTE; + $cont_h = $this->h; + $cont_x = 0; + $cont_y = 0; + } + + // Pass on in-line properties to the innerhtml + $css = ''; + if (isset($p['TEXT-ALIGN'])) { $css .= 'text-align: '.strtolower($p['TEXT-ALIGN']).'; '; } + if (isset($p['TEXT-TRANSFORM'])) { $css .= 'text-transform: '.strtolower($p['TEXT-TRANSFORM']).'; '; } + if (isset($p['TEXT-INDENT'])) { $css .= 'text-indent: '.strtolower($p['TEXT-INDENT']).'; '; } + if (isset($p['TEXT-DECORATION'])) { $css .= 'text-decoration: '.strtolower($p['TEXT-DECORATION']).'; '; } + if (isset($p['FONT-FAMILY'])) { $css .= 'font-family: '.strtolower($p['FONT-FAMILY']).'; '; } + if (isset($p['FONT-STYLE'])) { $css .= 'font-style: '.strtolower($p['FONT-STYLE']).'; '; } + if (isset($p['FONT-WEIGHT'])) { $css .= 'font-weight: '.strtolower($p['FONT-WEIGHT']).'; '; } + if (isset($p['FONT-SIZE'])) { $css .= 'font-size: '.strtolower($p['FONT-SIZE']).'; '; } + if (isset($p['LINE-HEIGHT'])) { $css .= 'line-height: '.strtolower($p['LINE-HEIGHT']).'; '; } + if (isset($p['TEXT-SHADOW'])) { $css .= 'text-shadow: '.strtolower($p['TEXT-SHADOW']).'; '; } + if (isset($p['LETTER-SPACING'])) { $css .= 'letter-spacing: '.strtolower($p['LETTER-SPACING']).'; '; } + if (isset($p['FONT-VARIANT'])) { $css .= 'font-variant: '.strtolower($p['FONT-VARIANT']).'; '; } + if (isset($p['COLOR'])) { $css .= 'color: '.strtolower($p['COLOR']).'; '; } + if (isset($p['Z-INDEX'])) { $css .= 'z-index: '.$p['Z-INDEX'].'; '; } // mPDF 5.6.01 + if ($css) { + $html = '<div style="'.$css.'">'.$html.'</div>'; + } + // Copy over (only) the properties to set for border and background + $pb = array(); + $pb['MARGIN-TOP'] = $p['MARGIN-TOP']; + $pb['MARGIN-RIGHT'] = $p['MARGIN-RIGHT']; + $pb['MARGIN-BOTTOM'] = $p['MARGIN-BOTTOM']; + $pb['MARGIN-LEFT'] = $p['MARGIN-LEFT']; + $pb['PADDING-TOP'] = $p['PADDING-TOP']; + $pb['PADDING-RIGHT'] = $p['PADDING-RIGHT']; + $pb['PADDING-BOTTOM'] = $p['PADDING-BOTTOM']; + $pb['PADDING-LEFT'] = $p['PADDING-LEFT']; + $pb['BORDER-TOP'] = $p['BORDER-TOP']; + $pb['BORDER-RIGHT'] = $p['BORDER-RIGHT']; + $pb['BORDER-BOTTOM'] = $p['BORDER-BOTTOM']; + $pb['BORDER-LEFT'] = $p['BORDER-LEFT']; + $pb['BORDER-TOP-LEFT-RADIUS-H'] = $p['BORDER-TOP-LEFT-RADIUS-H']; + $pb['BORDER-TOP-LEFT-RADIUS-V'] = $p['BORDER-TOP-LEFT-RADIUS-V']; + $pb['BORDER-TOP-RIGHT-RADIUS-H'] = $p['BORDER-TOP-RIGHT-RADIUS-H']; + $pb['BORDER-TOP-RIGHT-RADIUS-V'] = $p['BORDER-TOP-RIGHT-RADIUS-V']; + $pb['BORDER-BOTTOM-LEFT-RADIUS-H'] = $p['BORDER-BOTTOM-LEFT-RADIUS-H']; + $pb['BORDER-BOTTOM-LEFT-RADIUS-V'] = $p['BORDER-BOTTOM-LEFT-RADIUS-V']; + $pb['BORDER-BOTTOM-RIGHT-RADIUS-H'] = $p['BORDER-BOTTOM-RIGHT-RADIUS-H']; + $pb['BORDER-BOTTOM-RIGHT-RADIUS-V'] = $p['BORDER-BOTTOM-RIGHT-RADIUS-V']; + if (isset($p['BACKGROUND-COLOR'])) { $pb['BACKGROUND-COLOR'] = $p['BACKGROUND-COLOR']; } + if (isset($p['BOX-SHADOW'])) { $pb['BOX-SHADOW'] = $p['BOX-SHADOW']; } +/*-- BACKGROUNDS --*/ + if (isset($p['BACKGROUND-IMAGE'])) { $pb['BACKGROUND-IMAGE'] = $p['BACKGROUND-IMAGE']; } + if (isset($p['BACKGROUND-IMAGE-RESIZE'])) { $pb['BACKGROUND-IMAGE-RESIZE'] = $p['BACKGROUND-IMAGE-RESIZE']; } + if (isset($p['BACKGROUND-IMAGE-OPACITY'])) { $pb['BACKGROUND-IMAGE-OPACITY'] = $p['BACKGROUND-IMAGE-OPACITY']; } + if (isset($p['BACKGROUND-REPEAT'])) { $pb['BACKGROUND-REPEAT'] = $p['BACKGROUND-REPEAT']; } + if (isset($p['BACKGROUND-POSITION'])) { $pb['BACKGROUND-POSITION'] = $p['BACKGROUND-POSITION']; } + if (isset($p['BACKGROUND-GRADIENT'])) { $pb['BACKGROUND-GRADIENT'] = $p['BACKGROUND-GRADIENT']; } + if (isset($p['BACKGROUND-SIZE'])) { $pb['BACKGROUND-SIZE'] = $p['BACKGROUND-SIZE']; } // mPDF 5.6.12 + if (isset($p['BACKGROUND-ORIGIN'])) { $pb['BACKGROUND-ORIGIN'] = $p['BACKGROUND-ORIGIN']; } // mPDF 5.6.12 + if (isset($p['BACKGROUND-CLIP'])) { $pb['BACKGROUND-CLIP'] = $p['BACKGROUND-CLIP']; } // mPDF 5.6.12 + +/*-- END BACKGROUNDS --*/ + + $this->setCSS($pb,'BLOCK',$tag); + + //================================================================ + $bbox_br = $this->blk[1]['border_right']['w']; + $bbox_bl = $this->blk[1]['border_left']['w']; + $bbox_bt = $this->blk[1]['border_top']['w']; + $bbox_bb = $this->blk[1]['border_bottom']['w']; + $bbox_pr = $this->blk[1]['padding_right']; + $bbox_pl = $this->blk[1]['padding_left']; + $bbox_pt = $this->blk[1]['padding_top']; + $bbox_pb = $this->blk[1]['padding_bottom']; + $bbox_mr = $this->blk[1]['margin_right']; + if (strtolower($p['MARGIN-RIGHT'])=='auto') { $bbox_mr = 'auto'; } + $bbox_ml = $this->blk[1]['margin_left']; + if (strtolower($p['MARGIN-LEFT'])=='auto') { $bbox_ml = 'auto'; } + $bbox_mt = $this->blk[1]['margin_top']; + if (strtolower($p['MARGIN-TOP'])=='auto') { $bbox_mt = 'auto'; } + $bbox_mb = $this->blk[1]['margin_bottom']; + if (strtolower($p['MARGIN-BOTTOM'])=='auto') { $bbox_mb = 'auto'; } + if (isset($p['LEFT']) && strtolower($p['LEFT'])!='auto') { $bbox_left = $this->ConvertSize($p['LEFT'], $cont_w, $this->FontSize,false); } + else { $bbox_left = 'auto'; } + if (isset($p['TOP']) && strtolower($p['TOP'])!='auto') { $bbox_top = $this->ConvertSize($p['TOP'], $cont_h, $this->FontSize,false); } + else { $bbox_top = 'auto'; } + if (isset($p['RIGHT']) && strtolower($p['RIGHT'])!='auto') { $bbox_right = $this->ConvertSize($p['RIGHT'], $cont_w, $this->FontSize,false); } + else { $bbox_right = 'auto'; } + if (isset($p['BOTTOM']) && strtolower($p['BOTTOM'])!='auto') { $bbox_bottom = $this->ConvertSize($p['BOTTOM'], $cont_h, $this->FontSize,false); } + else { $bbox_bottom = 'auto'; } + if (isset($p['WIDTH']) && strtolower($p['WIDTH'])!='auto') { $inner_w = $this->ConvertSize($p['WIDTH'], $cont_w, $this->FontSize,false); } + else { $inner_w = 'auto'; } + if (isset($p['HEIGHT']) && strtolower($p['HEIGHT'])!='auto') { $inner_h = $this->ConvertSize($p['HEIGHT'], $cont_h, $this->FontSize,false); } + else { $inner_h = 'auto'; } + + // If bottom or right pos are set and not left / top - save this to adjust rotated block later + if ($rotate) { + if ($bbox_left === 'auto' && $bbox_right !== 'auto') { $rot_rpos = $bbox_right; } + else { $rot_rpos = false; } + if ($bbox_top === 'auto' && $bbox_bottom !== 'auto') { $rot_bpos = $bbox_bottom; } + else { $rot_bpos = false; } + } + + //================================================================ + if ($checkinnerhtml=='' && $inner_h==='auto') { $inner_h = 0.0001; } + if ($checkinnerhtml=='' && $inner_w==='auto') { $inner_w = 2*$this->GetCharWidth('W',false); } + //================================================================ + // Algorithm from CSS2.1 See http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-height + // mPD 5.3.14 + // Special case (not CSS) if all not specified, centre vertically on page + if ($bbox_top==='auto' && $inner_h==='auto' && $bbox_bottom==='auto' && $bbox_mt==='auto' && $bbox_mb==='auto') { + $bbox_top_orig = $bbox_top; + if ($bbox_mt==='auto') { $bbox_mt = 0; } + if ($bbox_mb==='auto') { $bbox_mb = 0; } + $bbox_top = $orig_y0 - $bbox_mt - $cont_y; + // solve for $bbox_bottom when content_h known - $inner_h=='auto' && $bbox_bottom=='auto' + } + // mPD 5.3.14 + else if ($bbox_top==='auto' && $inner_h==='auto' && $bbox_bottom==='auto') { + $bbox_top_orig = $bbox_top = $orig_y0 - $cont_y; + if ($bbox_mt==='auto') { $bbox_mt = 0; } + if ($bbox_mb==='auto') { $bbox_mb = 0; } + // solve for $bbox_bottom when content_h known - $inner_h=='auto' && $bbox_bottom=='auto' + } + else if ($bbox_top!=='auto' && $inner_h!=='auto' && $bbox_bottom!=='auto') { + if ($bbox_mt==='auto' && $bbox_mb==='auto') { + $x = $cont_h - $bbox_top - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_bottom; + $bbox_mt = $bbox_mb = ($x/2); + } + else if ($bbox_mt==='auto') { + $bbox_mt = $cont_h - $bbox_top - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mb - $bbox_bottom; + } + else if ($bbox_mb==='auto') { + $bbox_mb = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_bottom; + } + else { + $bbox_bottom = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mt; + } + } + else { + if ($bbox_mt==='auto') { $bbox_mt = 0; } + if ($bbox_mb==='auto') { $bbox_mb = 0; } + if ($bbox_top==='auto' && $inner_h==='auto' && $bbox_bottom!=='auto') { + // solve for $bbox_top when content_h known - $inner_h=='auto' && $bbox_top =='auto' + } + else if ($bbox_top==='auto' && $bbox_bottom==='auto' && $inner_h!=='auto') { + $bbox_top = $orig_y0 - $bbox_mt - $cont_y; + $bbox_bottom = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mt; + } + else if ($inner_h==='auto' && $bbox_bottom==='auto' && $bbox_top!=='auto') { + // solve for $bbox_bottom when content_h known - $inner_h=='auto' && $bbox_bottom=='auto' + } + else if ($bbox_top==='auto' && $inner_h!=='auto' && $bbox_bottom!=='auto') { + $bbox_top = $cont_h - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mt - $bbox_bottom; + } + else if ($inner_h==='auto' && $bbox_top!=='auto' && $bbox_bottom!=='auto') { + $inner_h = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $bbox_pb - $bbox_bb - $bbox_mt - $bbox_bottom; + } + else if ($bbox_bottom==='auto' && $bbox_top!=='auto' && $inner_h!=='auto') { + $bbox_bottom = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mt; + } + } + + // THEN DO SAME FOR WIDTH + // http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-width + if ($bbox_left==='auto' && $inner_w==='auto' && $bbox_right==='auto') { + if ($bbox_ml==='auto') { $bbox_ml = 0; } + if ($bbox_mr==='auto') { $bbox_mr = 0; } + // IF containing element RTL, should set $bbox_right + $bbox_left = $orig_x0 - $bbox_ml - $cont_x; + // solve for $bbox_right when content_w known - $inner_w=='auto' && $bbox_right=='auto' + } + else if ($bbox_left!=='auto' && $inner_w!=='auto' && $bbox_right!=='auto') { + if ($bbox_ml==='auto' && $bbox_mr==='auto') { + $x = $cont_w - $bbox_left - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_right; + $bbox_ml = $bbox_mr = ($x/2); + } + else if ($bbox_ml==='auto') { + $bbox_ml = $cont_w - $bbox_left - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_mr - $bbox_right; + } + else if ($bbox_mr==='auto') { + $bbox_mr = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_right; + } + else { + $bbox_right = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml; + } + } + else { + if ($bbox_ml==='auto') { $bbox_ml = 0; } + if ($bbox_mr==='auto') { $bbox_mr = 0; } + if ($bbox_left==='auto' && $inner_w==='auto' && $bbox_right!=='auto') { + // solve for $bbox_left when content_w known - $inner_w=='auto' && $bbox_left =='auto' + } + else if ($bbox_left==='auto' && $bbox_right==='auto' && $inner_w!=='auto') { + // IF containing element RTL, should set $bbox_right + $bbox_left = $orig_x0 - $bbox_ml - $cont_x; + $bbox_right = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml; + } + else if ($inner_w==='auto' && $bbox_right==='auto' && $bbox_left!=='auto') { + // solve for $bbox_right when content_w known - $inner_w=='auto' && $bbox_right=='auto' + } + else if ($bbox_left==='auto' && $inner_w!=='auto' && $bbox_right!=='auto') { + $bbox_left = $cont_w - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml - $bbox_right; + } + else if ($inner_w==='auto' && $bbox_left!=='auto' && $bbox_right!=='auto') { + $inner_w = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $bbox_pr - $bbox_br - $bbox_ml - $bbox_right; + } + else if ($bbox_right==='auto' && $bbox_left!=='auto' && $inner_w!=='auto') { + $bbox_right = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml; + } + } + + //================================================================ + //================================================================ +/*-- BACKGROUNDS --*/ + if (isset($pb['BACKGROUND-IMAGE']) && $pb['BACKGROUND-IMAGE']) { + $ret = $this->SetBackground($pb, $this->blk[1]['inner_width']); + if ($ret) { $this->blk[1]['background-image'] = $ret; } + } +/*-- END BACKGROUNDS --*/ + + //================================================================ + $y = $cont_y + $bbox_top + $bbox_mt + $bbox_bt + $bbox_pt; + $h = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $bbox_pb - $bbox_bb - $bbox_mb - $bbox_bottom; + $x = $cont_x + $bbox_left + $bbox_ml + $bbox_bl + $bbox_pl; + $w = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $bbox_pr - $bbox_br - $bbox_mr - $bbox_right; + // Set (temporary) values for x y w h to do first paint, if values are auto + if ($inner_h==='auto' && $bbox_top==='auto') { + $y = $cont_y + $bbox_mt + $bbox_bt + $bbox_pt; + $h = $cont_h - ($bbox_bottom + $bbox_mt + $bbox_mb + $bbox_bt + $bbox_bb + $bbox_pt + $bbox_pb); + } + else if ($inner_h==='auto' && $bbox_bottom==='auto') { + $y = $cont_y + $bbox_top + $bbox_mt + $bbox_bt + $bbox_pt; + $h = $cont_h - ($bbox_top + $bbox_mt + $bbox_mb + $bbox_bt + $bbox_bb + $bbox_pt + $bbox_pb); + } + if ($inner_w==='auto' && $bbox_left==='auto') { + $x = $cont_x + $bbox_ml + $bbox_bl + $bbox_pl; + $w = $cont_w - ($bbox_right + $bbox_ml + $bbox_mr + $bbox_bl + $bbox_br + $bbox_pl + $bbox_pr); + } + else if ($inner_w==='auto' && $bbox_right==='auto') { + $x = $cont_x + $bbox_left + $bbox_ml + $bbox_bl + $bbox_pl; + $w = $cont_w - ($bbox_left + $bbox_ml + $bbox_mr + $bbox_bl + $bbox_br + $bbox_pl + $bbox_pr); + } + $bbox_y = $cont_y + $bbox_top + $bbox_mt; + $bbox_x = $cont_x + $bbox_left + $bbox_ml; + $saved_block1 = $this->blk[1]; + unset($p); + unset($pb); + //================================================================ + if ($inner_w==='auto') { // do a first write + $this->lMargin=$x; + $this->rMargin=$this->w - $w - $x; + // SET POSITION & FONT VALUES + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + $this->pageoutput[$this->page]=array(); + $this->x = $x; + $this->y = $y; + $this->HTMLheaderPageLinks = array(); + $this->HTMLheaderPageAnnots = array(); + $this->HTMLheaderPageForms = array(); + $this->pageBackgrounds = array(); + $this->maxPosR = 0; + $this->maxPosL = $this->w; // For RTL + $this->WriteHTML($html , 4); + $inner_w = $this->maxPosR - $this->lMargin; + if ($bbox_right==='auto') { + $bbox_right = $cont_w - $bbox_left - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml; + } + else if ($bbox_left==='auto') { + $bbox_left = $cont_w - $bbox_ml - $bbox_bl - $bbox_pl - $inner_w - $bbox_pr - $bbox_br - $bbox_ml - $bbox_right; + $bbox_x = $cont_x + $bbox_left + $bbox_ml ; + $inner_x = $bbox_x + $bbox_bl + $bbox_pl; + $x = $inner_x; + } + $w = $inner_w; + $bbox_y = $cont_y + $bbox_top + $bbox_mt; + $bbox_x = $cont_x + $bbox_left + $bbox_ml; + } + + if ($inner_h==='auto') { // do a first write + $this->lMargin=$x; + $this->rMargin=$this->w - $w - $x; + // SET POSITION & FONT VALUES + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + $this->pageoutput[$this->page]=array(); + $this->x = $x; + $this->y = $y; + $this->HTMLheaderPageLinks = array(); + $this->HTMLheaderPageAnnots = array(); + $this->HTMLheaderPageForms = array(); + $this->pageBackgrounds = array(); + $this->WriteHTML($html , 4); + $inner_h = $this->y - $y; + if ($overflow!='hidden' && $overflow!='visible') { // constrained + if (($this->y + $bbox_pb + $bbox_bb) > ($cont_y + $cont_h)) { + $adj = ($this->y + $bbox_pb + $bbox_bb) - ($cont_y + $cont_h); + $inner_h -= $adj; + } + } + if ($bbox_bottom==='auto' && $bbox_top_orig==='auto') { + $bbox_bottom = $bbox_top = ($cont_h - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mb)/2; + if ($overflow!='hidden' && $overflow!='visible') { // constrained + if ($bbox_top < 0) { + $bbox_top = 0; + $inner_h = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $bbox_pb - $bbox_bb - $bbox_mb - $bbox_bottom; + } + } + $bbox_y = $cont_y + $bbox_top + $bbox_mt; + $inner_y = $bbox_y + $bbox_bt + $bbox_pt; + $y = $inner_y; + + } + else if ($bbox_bottom==='auto') { + $bbox_bottom = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mb; + } + else if ($bbox_top==='auto') { + $bbox_top = $cont_h - $bbox_mt - $bbox_bt - $bbox_pt - $inner_h - $bbox_pb - $bbox_bb - $bbox_mb - $bbox_bottom; + if ($overflow!='hidden' && $overflow!='visible') { // constrained + if ($bbox_top < 0) { + $bbox_top = 0; + $inner_h = $cont_h - $bbox_top - $bbox_mt - $bbox_bt - $bbox_pt - $bbox_pb - $bbox_bb - $bbox_mb - $bbox_bottom; + } + } + $bbox_y = $cont_y + $bbox_top + $bbox_mt; + $inner_y = $bbox_y + $bbox_bt + $bbox_pt; + $y = $inner_y; + } + $h = $inner_h; + $bbox_y = $cont_y + $bbox_top + $bbox_mt; + $bbox_x = $cont_x + $bbox_left + $bbox_ml; + } + $inner_w = $w; + $inner_h = $h; + + } + $this->lMargin=$x; + $this->rMargin=$this->w - $w - $x; + // SET POSITION & FONT VALUES + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + $this->pageoutput[$this->page]=array(); + $this->x = $x; + $this->y = $y; + $this->HTMLheaderPageLinks = array(); + $this->HTMLheaderPageAnnots = array(); + $this->HTMLheaderPageForms = array(); + $this->pageBackgrounds = array(); + $this->WriteHTML($html , 4); // parameter 4 saves output to $this->headerbuffer + $actual_h = $this->y - $y; + $use_w = $w; + $use_h = $h; + $ratio = $actual_h / $use_w; + + if ($overflow!='hidden' && $overflow!='visible') { + $target = $h/$w; + if (($ratio / $target ) > 1) { + $nl = CEIL($actual_h / $this->lineheight); + $l = $use_w * $nl; + $est_w = sqrt(($l * $this->lineheight) / $target) * 0.8; + $use_w += ($est_w - $use_w) - ($w/100); + } + $bpcstart = ($ratio / $target); + $bpcctr = 1; + while(($ratio / $target ) > 1) { + + if ($this->progressBar) { $this->UpdateProgressBar(4,intval(100/($ratio/$target)),('Auto-sizing fixed-position block: '.$bpcctr++)); } // *PROGRESS-BAR* + + $this->x = $x; + $this->y = $y; + + if (($ratio / $target) > 1.5 || ($ratio / $target) < 0.6) { + $use_w += ($w/$this->incrementFPR1); + } + else if (($ratio / $target) > 1.2 || ($ratio / $target) < 0.85) { + $use_w += ($w/$this->incrementFPR2); + } + else if (($ratio / $target) > 1.1 || ($ratio / $target) < 0.91) { + $use_w += ($w/$this->incrementFPR3); + } + else { + $use_w += ($w/$this->incrementFPR4); + } + + $use_h = $use_w * $target ; + $this->rMargin=$this->w - $use_w - $x; + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + $this->HTMLheaderPageLinks = array(); + $this->HTMLheaderPageAnnots = array(); + $this->HTMLheaderPageForms = array(); + $this->pageBackgrounds = array(); + $this->WriteHTML($html , 4); // parameter 4 saves output to $this->headerbuffer + $actual_h = $this->y - $y; + $ratio = $actual_h / $use_w; + } + if ($this->progressBar) { $this->UpdateProgressBar(4,'100',' '); } // *PROGRESS-BAR* + } + $shrink_f = $w/$use_w; + + //================================================================ + + $this->pages[$this->page] .= '___BEFORE_BORDERS___'; + $block_s = $this->PrintPageBackgrounds(); // Save to print later inside clipping path + $this->pageBackgrounds = array(); + + //================================================================ + + if ($rotate) { + $prerotw = $bbox_bl + $bbox_pl + $inner_w + $bbox_pr + $bbox_br; + $preroth = $bbox_bt + $bbox_pt + $inner_h + $bbox_pb + $bbox_bb; + $rot_start = " q\n"; + if ($rotate == 90) { + if ($rot_rpos !== false) { $adjw = $prerotw; } // width before rotation + else { $adjw = $preroth; } // height before rotation + if ($rot_bpos !== false) { $adjh = -$prerotw + $preroth; } + else { $adjh = 0; } + } + else { + if ($rot_rpos !== false) { $adjw = $prerotw - $preroth; } + else { $adjw = 0; } + if ($rot_bpos !== false) { $adjh = $preroth; } // height before rotation + else { $adjh = $prerotw; } // width before rotation + } + $rot_start .= $this->transformTranslate($adjw, $adjh, true)."\n"; + $rot_start .= $this->transformRotate($rotate, $bbox_x, $bbox_y, true)."\n"; + $rot_end = " Q\n"; + } + else { + $rot_start = ''; + $rot_end = ''; + } + + //================================================================ + if (!empty($bounding)) { + // WHEN HEIGHT // BOTTOM EDGE IS KNOWN and $this->y is set to the bottom + // Re-instate saved $this->blk[1] + $this->blk[1] = $saved_block1; + + // These are only needed when painting border/background + $this->blk[1]['width'] = $bbox_w = $cont_w - $bbox_left - $bbox_ml - $bbox_mr - $bbox_right; + $this->blk[1]['x0'] = $bbox_x; + $this->blk[1]['y0'] = $bbox_y; + $this->blk[1]['startpage'] = $this->page; + $this->blk[1]['y1'] = $bbox_y + $bbox_bt + $bbox_pt + $inner_h + $bbox_pb + $bbox_bb ; + $this->_out($rot_start); // mPDF 5.0 + $this->PaintDivBB('',0,1); // Prints borders and sets backgrounds in $this->pageBackgrounds + $this->_out($rot_end); + } + + $s = $this->PrintPageBackgrounds(); + $s = $rot_start.$s.$rot_end; + $this->pages[$this->page] = preg_replace('/___BEFORE_BORDERS___/', "\n".$s."\n", $this->pages[$this->page]); + $this->pageBackgrounds = array(); + + $this->_out($rot_start); + + // Clipping Output + if ($overflow=='hidden') { + //Bounding rectangle to clip + $clip_y1 = $this->y; + if (!empty($bounding) && ($this->y + $bbox_pb + $bbox_bb) > ($bbox_y + $bbox_bt + $bbox_pt + $inner_h + $bbox_pb + $bbox_bb )) { + $clip_y1 = ($bbox_y + $bbox_bt + $bbox_pt + $inner_h + $bbox_pb + $bbox_bb ) - ($bbox_pb + $bbox_bb); + } + //$op = 'W* n'; // Clipping + $op = 'W n'; // Clipping alternative mode + $this->_out("q"); + $ch = $clip_y1 - $y; + $this->_out(sprintf('%.3F %.3F %.3F %.3F re %s',$x*_MPDFK,($this->h-$y)*_MPDFK,$w*_MPDFK,-$ch*_MPDFK,$op)); + if (!empty($block_s)) { + $tmp = "q\n".sprintf('%.3F %.3F %.3F %.3F re %s',$x*_MPDFK,($this->h-$y)*_MPDFK,$w*_MPDFK,-$ch*_MPDFK,$op); + $tmp .= "\n".$block_s."\nQ"; + $block_s = $tmp ; + } + } + + + if (!empty($block_s)) { + if ($shrink_f != 1) { // i.e. autofit has resized the box + $tmp = "q\n".$this->transformScale(($shrink_f*100),($shrink_f*100), $x, $y, true); + $tmp .= "\n".$block_s."\nQ"; + $block_s = $tmp ; + } + $this->_out($block_s); + } + + + + if ($shrink_f != 1) { // i.e. autofit has resized the box + $this->StartTransform(); + $this->transformScale(($shrink_f*100),($shrink_f*100), $x, $y); + } + + $this->_out($this->headerbuffer); + + if ($shrink_f != 1) { // i.e. autofit has resized the box + $this->StopTransform(); + } + + if ($overflow=='hidden') { + //End clipping + $this->_out("Q"); + } + + $this->_out($rot_end); + + + // Page Links + foreach($this->HTMLheaderPageLinks AS $lk) { + if ($rotate) { + $tmp = $lk[2]; // Switch h - w + $lk[2] = $lk[3]; + $lk[3] = $tmp; + + $lx1 = (($lk[0]/_MPDFK)); + $ly1 = (($this->h-($lk[1]/_MPDFK))); + if ($rotate == 90) { + $adjx = -($lx1-$bbox_x) + ($preroth - ($ly1-$bbox_y)); + $adjy = -($ly1-$bbox_y) + ($lx1-$bbox_x); + $lk[2] = -$lk[2]; + } + else if ($rotate == -90) { + $adjx = -($lx1-$bbox_x) + ($ly1-$bbox_y); + $adjy = -($ly1-$bbox_y) - ($lx1-$bbox_x) + $prerotw; + $lk[3] = -$lk[3]; + } + if ($rot_rpos !== false) { $adjx += $prerotw - $preroth; } + if ($rot_bpos !== false) { $adjy += $preroth - $prerotw; } + $lx1 += $adjx; + $ly1 += $adjy; + + $lk[0] = $lx1*_MPDFK; + $lk[1] = ($this->h-$ly1)*_MPDFK; + } + if ($shrink_f != 1) { // i.e. autofit has resized the box + $lx1 = (($lk[0]/_MPDFK)-$x); + $lx2 = $x + ($lx1 * $shrink_f); + $lk[0] = $lx2*_MPDFK; + $ly1 = (($this->h-($lk[1]/_MPDFK))-$y); + $ly2 = $y + ($ly1 * $shrink_f); + $lk[1] = ($this->h-$ly2)*_MPDFK; + $lk[2] *= $shrink_f; // width + $lk[3] *= $shrink_f; // height + } + $this->PageLinks[$this->page][]=$lk; + } + + foreach($this->HTMLheaderPageForms AS $n=>$f) { + if ($shrink_f != 1) { // i.e. autofit has resized the box + $f['x'] = $x + (($f['x'] -$x) * $shrink_f); + $f['y'] = $y + (($f['y'] -$y) * $shrink_f); + $f['w'] *= $shrink_f; + $f['h'] *= $shrink_f; + $f['style']['fontsize'] *= $shrink_f; + } + $this->form->forms[$f['n']] = $f; + } + // Page Annotations + foreach($this->HTMLheaderPageAnnots AS $lk) { + if ($rotate) { + if ($rotate == 90) { + $adjx = -($lk['x']-$bbox_x) + ($preroth - ($lk['y']-$bbox_y)); + $adjy = -($lk['y']-$bbox_y) + ($lk['x']-$bbox_x); + } + else if ($rotate == -90) { + $adjx = -($lk['x']-$bbox_x) + ($lk['y']-$bbox_y); + $adjy = -($lk['y']-$bbox_y) - ($lk['x']-$bbox_x) + $prerotw; + } + if ($rot_rpos !== false) { $adjx += $prerotw - $preroth; } + if ($rot_bpos !== false) { $adjy += $preroth - $prerotw; } + $lk['x'] += $adjx; + $lk['y'] += $adjy; + } + if ($shrink_f != 1) { // i.e. autofit has resized the box + $lk['x'] = $x + (($lk['x']-$x) * $shrink_f); + $lk['y'] = $y + (($lk['y']-$y) * $shrink_f); + } + $this->PageAnnots[$this->page][]=$lk; + } + + // Restore + $this->headerbuffer = ''; + $this->HTMLheaderPageLinks = array(); + $this->HTMLheaderPageAnnots = array(); + $this->HTMLheaderPageForms = array(); + $this->pageBackgrounds = $save_bgs; + $this->writingHTMLheader = false; + + $this->writingHTMLfooter = false; + $this->fullImageHeight = false; + $this->ResetMargins(); + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + $this->SetXY($save_x,$save_y) ; + $this->title2annots = $save_annots; // *ANNOTATIONS* + $this->InFooter = false; // turns back on autopagebreaks + $this->pageoutput[$this->page]=array(); + $this->pageoutput[$this->page]['Font']=''; +/*-- COLUMNS --*/ + if ($save_cols) { + $this->SetColumns($save_nbcol,$this->colvAlign,$this->ColGap); + } +/*-- END COLUMNS --*/ +} +/*-- END CSS-POSITION --*/ + + + +function initialiseBlock(&$blk) { + $blk['margin_top'] = 0; + $blk['margin_left'] = 0; + $blk['margin_bottom'] = 0; + $blk['margin_right'] = 0; + $blk['padding_top'] = 0; + $blk['padding_left'] = 0; + $blk['padding_bottom'] = 0; + $blk['padding_right'] = 0; + $blk['border_top']['w'] = 0; + $blk['border_left']['w'] = 0; + $blk['border_bottom']['w'] = 0; + $blk['border_right']['w'] = 0; + $blk['hide'] = false; + $blk['outer_left_margin'] = 0; + $blk['outer_right_margin'] = 0; + $blk['cascadeCSS'] = array(); + $blk['block-align'] = false; + $blk['bgcolor'] = false; + $blk['page_break_after_avoid'] = false; + $blk['keep_block_together'] = false; + $blk['float'] = false; + $blk['line_height'] = ''; + $blk['margin_collapse'] = false; +} + + +function border_details($bd) { + $prop = preg_split('/\s+/',trim($bd)); + + if (isset($this->blk[$this->blklvl]['inner_width'])) { $refw = $this->blk[$this->blklvl]['inner_width']; } + else if (isset($this->blk[$this->blklvl-1]['inner_width'])) { $refw = $this->blk[$this->blklvl-1]['inner_width']; } + else { $refw = $this->w; } + if ( count($prop) == 1 ) { + $bsize = $this->ConvertSize($prop[0],$refw,$this->FontSize,false); + if ($bsize > 0) { + return array('s' => 1, 'w' => $bsize, 'c' => $this->ConvertColor(0), 'style'=>'solid'); + } + else { return array('w' => 0, 's' => 0); } + } + + else if (count($prop) == 2 ) { + // 1px solid + if (in_array($prop[1],$this->borderstyles) || $prop[1] == 'none' || $prop[1] == 'hidden' ) { $prop[2] = ''; } + // solid #000000 + else if (in_array($prop[0],$this->borderstyles) || $prop[0] == 'none' || $prop[0] == 'hidden' ) { $prop[0] = ''; $prop[1] = $prop[0]; $prop[2] = $prop[1]; } + // 1px #000000 + else { $prop[1] = ''; $prop[2] = $prop[1]; } + } + else if ( count($prop) == 3 ) { + // Change #000000 1px solid to 1px solid #000000 (proper) + if (substr($prop[0],0,1) == '#') { $tmp = $prop[0]; $prop[0] = $prop[1]; $prop[1] = $prop[2]; $prop[2] = $tmp; } + // Change solid #000000 1px to 1px solid #000000 (proper) + else if (substr($prop[0],1,1) == '#') { $tmp = $prop[1]; $prop[0] = $prop[2]; $prop[1] = $prop[0]; $prop[2] = $tmp; } + // Change solid 1px #000000 to 1px solid #000000 (proper) + else if (in_array($prop[0],$this->borderstyles) || $prop[0] == 'none' || $prop[0] == 'hidden' ) { + $tmp = $prop[0]; $prop[0] = $prop[1]; $prop[1] = $tmp; + } + } + else { return array(); } + // Size + $bsize = $this->ConvertSize($prop[0],$refw,$this->FontSize,false); + //color + $coul = $this->ConvertColor($prop[2]); // returns array + // Style + $prop[1] = strtolower($prop[1]); + if (in_array($prop[1],$this->borderstyles) && $bsize > 0) { $on = 1; } + else if ($prop[1] == 'hidden') { $on = 1; $bsize = 0; $coul = ''; } + else if ($prop[1] == 'none') { $on = 0; $bsize = 0; $coul = ''; } + else { $on = 0; $bsize = 0; $coul = ''; $prop[1] = ''; } + return array('s' => $on, 'w' => $bsize, 'c' => $coul, 'style'=> $prop[1] ); +} + + + +/*-- END HTML-CSS --*/ + + +// Return either a number (factor) - based on current set fontsize (if % or em) - or exact lineheight (with 'mm' after it) +function fixLineheight($v) { + $lh = false; + if (preg_match('/^[0-9\.,]*$/',$v) && $v >= 0) { return ($v + 0); } + else if (strtoupper($v) == 'NORMAL') { + return $this->normalLineheight; + } + else { + $tlh = $this->ConvertSize($v,$this->FontSize,$this->FontSize,true); + if ($tlh) { return ($tlh.'mm'); } + } + return $this->normalLineheight; +} + + +/*-- BORDER-RADIUS --*/ +function _borderPadding($a, $b, &$px, &$py) { + // $px and py are padding long axis (x) and short axis (y) + $added = 0; // extra padding + + $x = $a-$px; + $y = $b-$py; + // Check if Falls within ellipse of border radius + if ( ( (($x+$added)*($x+$added))/($a*$a) + (($y+$added)*($y+$added))/($b*$b) ) <=1 ) { return false; } + + $t = atan2($y,$x); + + $newx = $b / sqrt((($b*$b)/($a*$a)) + ( tan($t) * tan($t) ) ); + $newy = $a / sqrt((($a*$a)/($b*$b)) + ( (1/tan($t)) * (1/tan($t)) ) ); + $px = max($px, $a - $newx + $added); + $py = max($py, $b - $newy + $added); +} +/*-- END BORDER-RADIUS --*/ + + + +/*-- HTML-CSS --*/ + + +/*-- CSS-PAGE --*/ +function SetPagedMediaCSS($name='', $first, $oddEven) { + if ($oddEven == 'E') { + if ($this->directionality=='rtl') { $side = 'R'; } + else { $side = 'L'; } + } + else { + if ($this->directionality=='rtl') { $side = 'L'; } + else { $side = 'R'; } + } + $name = strtoupper($name); + $p = array(); + $p['SIZE'] = 'AUTO'; + + // Uses mPDF original margins as default + $p['MARGIN-RIGHT'] = strval($this->orig_rMargin).'mm'; + $p['MARGIN-LEFT'] = strval($this->orig_lMargin).'mm'; + $p['MARGIN-TOP'] = strval($this->orig_tMargin).'mm'; + $p['MARGIN-BOTTOM'] = strval($this->orig_bMargin).'mm'; + $p['MARGIN-HEADER'] = strval($this->orig_hMargin).'mm'; + $p['MARGIN-FOOTER'] = strval($this->orig_fMargin).'mm'; + + // Basic page + selector + if (isset($this->cssmgr->CSS['@PAGE'])) { $zp = $this->cssmgr->CSS['@PAGE']; } + else { $zp = array(); } + if (is_array($zp) && !empty($zp)) { $p = array_merge($p,$zp); } + + if (isset($p['EVEN-HEADER-NAME']) && $oddEven=='E') { + $p['HEADER'] = $p['EVEN-HEADER-NAME']; unset($p['EVEN-HEADER-NAME']); + } + if (isset($p['ODD-HEADER-NAME']) && $oddEven!='E') { + $p['HEADER'] = $p['ODD-HEADER-NAME']; unset($p['ODD-HEADER-NAME']); + } + if (isset($p['EVEN-FOOTER-NAME']) && $oddEven=='E') { + $p['FOOTER'] = $p['EVEN-FOOTER-NAME']; unset($p['EVEN-FOOTER-NAME']); + } + if (isset($p['ODD-FOOTER-NAME']) && $oddEven!='E') { + $p['FOOTER'] = $p['ODD-FOOTER-NAME']; unset($p['ODD-FOOTER-NAME']); + } + + // If right/Odd page + if (isset($this->cssmgr->CSS['@PAGE>>PSEUDO>>RIGHT']) && $side=='R') { + $zp = $this->cssmgr->CSS['@PAGE>>PSEUDO>>RIGHT']; + } + else { $zp = array(); } + if (isset($zp['SIZE'])) { unset($zp['SIZE']); } + if (isset($zp['SHEET-SIZE'])) { unset($zp['SHEET-SIZE']); } + // Disallow margin-left or -right on :LEFT or :RIGHT + if (isset($zp['MARGIN-LEFT'])) { unset($zp['MARGIN-LEFT']); } + if (isset($zp['MARGIN-RIGHT'])) { unset($zp['MARGIN-RIGHT']); } + if (is_array($zp) && !empty($zp)) { $p = array_merge($p,$zp); } + + // If left/Even page + if (isset($this->cssmgr->CSS['@PAGE>>PSEUDO>>LEFT']) && $side=='L') { + $zp = $this->cssmgr->CSS['@PAGE>>PSEUDO>>LEFT']; + } + else { $zp = array(); } + if (isset($zp['SIZE'])) { unset($zp['SIZE']); } + if (isset($zp['SHEET-SIZE'])) { unset($zp['SHEET-SIZE']); } + // Disallow margin-left or -right on :LEFT or :RIGHT + if (isset($zp['MARGIN-LEFT'])) { unset($zp['MARGIN-LEFT']); } + if (isset($zp['MARGIN-RIGHT'])) { unset($zp['MARGIN-RIGHT']); } + if (is_array($zp) && !empty($zp)) { $p = array_merge($p,$zp); } + + // If first page + if (isset($this->cssmgr->CSS['@PAGE>>PSEUDO>>FIRST']) && $first) { $zp = $this->cssmgr->CSS['@PAGE>>PSEUDO>>FIRST']; } + else { $zp = array(); } + if (isset($zp['SIZE'])) { unset($zp['SIZE']); } + if (isset($zp['SHEET-SIZE'])) { unset($zp['SHEET-SIZE']); } + if (is_array($zp) && !empty($zp)) { $p = array_merge($p,$zp); } + + // If named page + if ($name) { + if (isset($this->cssmgr->CSS['@PAGE>>NAMED>>'.$name])) { $zp = $this->cssmgr->CSS['@PAGE>>NAMED>>'.$name]; } + else { $zp = array(); } + if (is_array($zp) && !empty($zp)) { $p = array_merge($p,$zp); } + + if (isset($p['EVEN-HEADER-NAME']) && $oddEven=='E') { + $p['HEADER'] = $p['EVEN-HEADER-NAME']; unset($p['EVEN-HEADER-NAME']); + } + if (isset($p['ODD-HEADER-NAME']) && $oddEven!='E') { + $p['HEADER'] = $p['ODD-HEADER-NAME']; unset($p['ODD-HEADER-NAME']); + } + if (isset($p['EVEN-FOOTER-NAME']) && $oddEven=='E') { + $p['FOOTER'] = $p['EVEN-FOOTER-NAME']; unset($p['EVEN-FOOTER-NAME']); + } + if (isset($p['ODD-FOOTER-NAME']) && $oddEven!='E') { + $p['FOOTER'] = $p['ODD-FOOTER-NAME']; unset($p['ODD-FOOTER-NAME']); + } + + // If named right/Odd page + if (isset($this->cssmgr->CSS['@PAGE>>NAMED>>'.$name.'>>PSEUDO>>RIGHT']) && $side=='R') { $zp = $this->cssmgr->CSS['@PAGE>>NAMED>>'.$name.'>>PSEUDO>>RIGHT']; } + else { $zp = array(); } + if (isset($zp['SIZE'])) { unset($zp['SIZE']); } + if (isset($zp['SHEET-SIZE'])) { unset($zp['SHEET-SIZE']); } + // Disallow margin-left or -right on :LEFT or :RIGHT + if (isset($zp['MARGIN-LEFT'])) { unset($zp['MARGIN-LEFT']); } + if (isset($zp['MARGIN-RIGHT'])) { unset($zp['MARGIN-RIGHT']); } + if (is_array($zp) && !empty($zp)) { $p = array_merge($p,$zp); } + + // If named left/Even page + if (isset($this->cssmgr->CSS['@PAGE>>NAMED>>'.$name.'>>PSEUDO>>LEFT']) && $side=='L') { $zp = $this->cssmgr->CSS['@PAGE>>NAMED>>'.$name.'>>PSEUDO>>LEFT']; } + else { $zp = array(); } + if (isset($zp['SIZE'])) { unset($zp['SIZE']); } + if (isset($zp['SHEET-SIZE'])) { unset($zp['SHEET-SIZE']); } + // Disallow margin-left or -right on :LEFT or :RIGHT + if (isset($zp['MARGIN-LEFT'])) { unset($zp['MARGIN-LEFT']); } + if (isset($zp['MARGIN-RIGHT'])) { unset($zp['MARGIN-RIGHT']); } + if (is_array($zp) && !empty($zp)) { $p = array_merge($p,$zp); } + + // If named first page + if (isset($this->cssmgr->CSS['@PAGE>>NAMED>>'.$name.'>>PSEUDO>>FIRST']) && $first) { $zp = $this->cssmgr->CSS['@PAGE>>NAMED>>'.$name.'>>PSEUDO>>FIRST']; } + else { $zp = array(); } + if (isset($zp['SIZE'])) { unset($zp['SIZE']); } + if (isset($zp['SHEET-SIZE'])) { unset($zp['SHEET-SIZE']); } + if (is_array($zp) && !empty($zp)) { $p = array_merge($p,$zp); } + } + + $orientation = $mgl = $mgr = $mgt = $mgb = $mgh = $mgf = ''; + $header = $footer = ''; + $resetpagenum = $pagenumstyle = $suppress = ''; + $marks = ''; + $bg = array(); + + $newformat = ''; + + + if (isset($p['SHEET-SIZE']) && is_array($p['SHEET-SIZE'])) { + $newformat = $p['SHEET-SIZE']; + if ($newformat[0] > $newformat[1]) { // landscape + $newformat = array_reverse($newformat); + $p['ORIENTATION'] = 'L'; + } + else { $p['ORIENTATION'] = 'P'; } + $this->_setPageSize($newformat, $p['ORIENTATION']); + } + + if (isset($p['SIZE']) && is_array($p['SIZE']) && !$newformat) { + if ($p['SIZE']['W'] > $p['SIZE']['H']) { $p['ORIENTATION'] = 'L'; } + else { $p['ORIENTATION'] = 'P'; } + } + if (is_array($p['SIZE'])) { + if ($p['SIZE']['W'] > $this->fw) { $p['SIZE']['W'] = $this->fw; } // mPD 4.2 use fw not fPt + if ($p['SIZE']['H'] > $this->fh) { $p['SIZE']['H'] = $this->fh; } + if (($p['ORIENTATION']==$this->DefOrientation && !$newformat) || ($newformat && $p['ORIENTATION']=='P')) { + $outer_width_LR = ($this->fw - $p['SIZE']['W'])/2; + $outer_width_TB = ($this->fh - $p['SIZE']['H'])/2; + } + else { + $outer_width_LR = ($this->fh - $p['SIZE']['W'])/2; + $outer_width_TB = ($this->fw - $p['SIZE']['H'])/2; + } + $pgw = $p['SIZE']['W']; + $pgh = $p['SIZE']['H']; + } + else { // AUTO LANDSCAPE PORTRAIT + $outer_width_LR = 0; + $outer_width_TB = 0; + if (!$newformat) { + if (strtoupper($p['SIZE']) == 'AUTO') { $p['ORIENTATION']=$this->DefOrientation; } + else if (strtoupper($p['SIZE']) == 'LANDSCAPE') { $p['ORIENTATION']='L'; } + else { $p['ORIENTATION']='P'; } + } + if (($p['ORIENTATION']==$this->DefOrientation && !$newformat) || ($newformat && $p['ORIENTATION']=='P')) { + $pgw = $this->fw; + $pgh = $this->fh; + } + else { + $pgw = $this->fh; + $pgh = $this->fw; + } + } + + if (isset($p['HEADER']) && $p['HEADER']) { $header = $p['HEADER']; } + if (isset($p['FOOTER']) && $p['FOOTER']) { $footer = $p['FOOTER']; } + if (isset($p['RESETPAGENUM']) && $p['RESETPAGENUM']) { $resetpagenum = $p['RESETPAGENUM']; } + if (isset($p['PAGENUMSTYLE']) && $p['PAGENUMSTYLE']) { $pagenumstyle = $p['PAGENUMSTYLE']; } + if (isset($p['SUPPRESS']) && $p['SUPPRESS']) { $suppress = $p['SUPPRESS']; } + + if (preg_match('/cross/i', $p['MARKS']) && preg_match('/crop/i', $p['MARKS'])) { $marks = 'CROPCROSS'; } + else if (strtoupper($p['MARKS']) == 'CROP') { $marks = 'CROP'; } + else if (strtoupper($p['MARKS']) == 'CROSS') { $marks = 'CROSS'; } + + + if (isset($p['BACKGROUND-COLOR']) && $p['BACKGROUND-COLOR']) { $bg['BACKGROUND-COLOR'] = $p['BACKGROUND-COLOR']; } +/*-- BACKGROUNDS --*/ + if (isset($p['BACKGROUND-GRADIENT']) && $p['BACKGROUND-GRADIENT']) { $bg['BACKGROUND-GRADIENT'] = $p['BACKGROUND-GRADIENT']; } + if (isset($p['BACKGROUND-IMAGE']) && $p['BACKGROUND-IMAGE']) { $bg['BACKGROUND-IMAGE'] = $p['BACKGROUND-IMAGE']; } + if (isset($p['BACKGROUND-REPEAT']) && $p['BACKGROUND-REPEAT']) { $bg['BACKGROUND-REPEAT'] = $p['BACKGROUND-REPEAT']; } + if (isset($p['BACKGROUND-POSITION']) && $p['BACKGROUND-POSITION']) { $bg['BACKGROUND-POSITION'] = $p['BACKGROUND-POSITION']; } + if (isset($p['BACKGROUND-IMAGE-RESIZE']) && $p['BACKGROUND-IMAGE-RESIZE']) { $bg['BACKGROUND-IMAGE-RESIZE'] = $p['BACKGROUND-IMAGE-RESIZE']; } + if (isset($p['BACKGROUND-IMAGE-OPACITY'])) { $bg['BACKGROUND-IMAGE-OPACITY'] = $p['BACKGROUND-IMAGE-OPACITY']; } +/*-- END BACKGROUNDS --*/ + + if (isset($p['MARGIN-LEFT'])) { $mgl = $this->ConvertSize($p['MARGIN-LEFT'],$pgw) + $outer_width_LR; } + if (isset($p['MARGIN-RIGHT'])) { $mgr = $this->ConvertSize($p['MARGIN-RIGHT'],$pgw) + $outer_width_LR; } + if (isset($p['MARGIN-BOTTOM'])) { $mgb = $this->ConvertSize($p['MARGIN-BOTTOM'],$pgh) + $outer_width_TB; } + if (isset($p['MARGIN-TOP'])) { $mgt = $this->ConvertSize($p['MARGIN-TOP'],$pgh) + $outer_width_TB; } + if (isset($p['MARGIN-HEADER'])) { $mgh = $this->ConvertSize($p['MARGIN-HEADER'],$pgh) + $outer_width_TB; } + if (isset($p['MARGIN-FOOTER'])) { $mgf = $this->ConvertSize($p['MARGIN-FOOTER'],$pgh) + $outer_width_TB; } + + if (isset($p['ORIENTATION']) && $p['ORIENTATION']) { $orientation = $p['ORIENTATION']; } + $this->page_box['outer_width_LR'] = $outer_width_LR; // Used in MARKS:crop etc. + $this->page_box['outer_width_TB'] = $outer_width_TB; + + return array($orientation,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf,$header,$footer,$bg,$resetpagenum,$pagenumstyle,$suppress,$marks,$newformat); +} +/*-- END CSS-PAGE --*/ + + + +/*-- CSS-FLOAT --*/ +// Added mPDF 3.0 Float DIV - CLEAR +function ClearFloats($clear, $blklvl=0) { + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($blklvl,true); + $end = $currpos = ($this->page*1000 + $this->y); + if ($clear == 'BOTH' && ($l_exists || $r_exists)) { + $this->pageoutput[$this->page] = array(); + $end = max($l_max, $r_max, $currpos); + } + else if ($clear == 'RIGHT' && $r_exists) { + $this->pageoutput[$this->page] = array(); + $end = max($r_max, $currpos); + } + else if ($clear == 'LEFT' && $l_exists ) { + $this->pageoutput[$this->page] = array(); + $end = max($l_max, $currpos); + } + else { return; } + $old_page = $this->page; + $new_page = intval($end/1000); + if ($old_page != $new_page) { + $s = $this->PrintPageBackgrounds(); + // Writes after the marker so not overwritten later by page background etc. + $this->pages[$this->page] = preg_replace('/(___BACKGROUND___PATTERNS'.date('jY').')/', '\\1'."\n".$s."\n", $this->pages[$this->page]); + $this->pageBackgrounds = array(); + $this->page = $new_page; + } + $this->ResetMargins(); + $this->pageoutput[$this->page] = array(); + $this->y = (($end*1000) % 1000000)/1000; // mod changes operands to integers before processing +} + + +// Added mPDF 3.0 Float DIV +function GetFloatDivInfo($blklvl=0,$clear=false) { + // If blklvl specified, only returns floats at that level - for ClearFloats + $l_exists = false; + $r_exists = false; + $l_max = 0; + $r_max = 0; + $l_width = 0; + $r_width = 0; + if (count($this->floatDivs)) { + $currpos = ($this->page*1000 + $this->y); + foreach($this->floatDivs AS $f) { + if (($clear && $f['blockContext'] == $this->blk[$blklvl]['blockContext']) || (!$clear && $currpos >= $f['startpos'] && $currpos < ($f['endpos']-0.001) && $f['blklvl'] > $blklvl && $f['blockContext'] == $this->blk[$blklvl]['blockContext'])) { + if ($f['side']=='L') { + $l_exists= true; + $l_max = max($l_max, $f['endpos']); + $l_width = max($l_width , $f['w']); + } + if ($f['side']=='R') { + $r_exists= true; + $r_max = max($r_max, $f['endpos']); + $r_width = max($r_width , $f['w']); + } + } + } + } + return array($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width); +} +/*-- END CSS-FLOAT --*/ + + + + +function OpenTag($tag,$attr) +{ + + // What this gets: < $tag $attr['WIDTH']="90px" > does not get content here </closeTag here> + // Correct tags where HTML specifies optional end tags, + // and/or does not allow nesting e.g. P inside P, or + if ($this->allow_html_optional_endtags) { + if (($tag == 'P' || $tag == 'DIV' || $tag == 'H1' || $tag == 'H2' || $tag == 'H3' || $tag == 'H4' || $tag == 'H5' || $tag == 'H6' || $tag == 'UL' || $tag == 'OL' || $tag == 'TABLE' || $tag=='PRE' || $tag=='FORM' || $tag=='ADDRESS' || $tag=='BLOCKQUOTE' || $tag=='CENTER' || $tag=='DL' || $tag == 'HR' ) && $this->lastoptionaltag == 'P') { $this->CloseTag($this->lastoptionaltag ); } + if ($tag == 'DD' && $this->lastoptionaltag == 'DD') { $this->CloseTag($this->lastoptionaltag ); } + if ($tag == 'DD' && $this->lastoptionaltag == 'DT') { $this->CloseTag($this->lastoptionaltag ); } + if ($tag == 'DT' && $this->lastoptionaltag == 'DD') { $this->CloseTag($this->lastoptionaltag ); } + if ($tag == 'DT' && $this->lastoptionaltag == 'DT') { $this->CloseTag($this->lastoptionaltag ); } + if ($tag == 'LI' && $this->lastoptionaltag == 'LI') { $this->CloseTag($this->lastoptionaltag ); } + if (($tag == 'TD' || $tag == 'TH') && $this->lastoptionaltag == 'TD') { $this->CloseTag($this->lastoptionaltag ); } // *TABLES* + if (($tag == 'TD' || $tag == 'TH') && $this->lastoptionaltag == 'TH') { $this->CloseTag($this->lastoptionaltag ); } // *TABLES* + if ($tag == 'TR' && $this->lastoptionaltag == 'TR') { $this->CloseTag($this->lastoptionaltag ); } // *TABLES* + if ($tag == 'TR' && $this->lastoptionaltag == 'TD') { $this->CloseTag($this->lastoptionaltag ); $this->CloseTag('TR'); $this->CloseTag('THEAD'); } // *TABLES* + if ($tag == 'TR' && $this->lastoptionaltag == 'TH') { $this->CloseTag($this->lastoptionaltag ); $this->CloseTag('TR'); $this->CloseTag('THEAD'); } // *TABLES* + if ($tag == 'OPTION' && $this->lastoptionaltag == 'OPTION') { $this->CloseTag($this->lastoptionaltag ); } + } + + $align = array('left'=>'L','center'=>'C','right'=>'R','top'=>'T','text-top'=>'TT','middle'=>'M','baseline'=>'BS','bottom'=>'B','text-bottom'=>'TB','justify'=>'J'); + + $this->ignorefollowingspaces=false; + + //Opening tag + switch($tag){ + + case 'DOTTAB': + $objattr = array(); + $objattr['type'] = 'dottab'; + $dots=str_repeat('.', 3)." "; // minimum number of dots + $objattr['width'] = $this->GetStringWidth($dots); + $objattr['margin_top'] = 0; + $objattr['margin_bottom'] = 0; + $objattr['margin_left'] = 0; + $objattr['margin_right'] = 0; + $objattr['height'] = 0; + $objattr['colorarray'] = $this->colorarray; + $objattr['border_top']['w'] = 0; + $objattr['border_bottom']['w'] = 0; + $objattr['border_left']['w'] = 0; + $objattr['border_right']['w'] = 0; + + // mPDF 5.6.19 + $properties = $this->cssmgr->MergeCSS('INLINE',$tag,$attr); // mPDF 5.6.33 + if (isset($properties['OUTDENT'])) { // mPDF 5.6.33 + $objattr['outdent'] = $this->ConvertSize($properties['OUTDENT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + else if (isset($attr['OUTDENT'])) { + $objattr['outdent'] = $this->ConvertSize($attr['OUTDENT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + else { $objattr['outdent'] = 0; } + + $objattr['fontfamily'] = $this->FontFamily; + $objattr['fontsize'] = $this->FontSizePt; + + $e = "\xbb\xa4\xactype=dottab,objattr=".serialize($objattr)."\xbb\xa4\xac"; +/*-- TABLES --*/ + // Output it to buffers + if ($this->tableLevel) { + if (!isset($this->cell[$this->row][$this->col]['maxs'])) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + elseif($this->cell[$this->row][$this->col]['maxs'] < $this->cell[$this->row][$this->col]['s']) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + $this->cell[$this->row][$this->col]['s'] = 0 ;// reset + $this->_saveCellTextBuffer($e); + } + else { +/*-- END TABLES --*/ + $this->_saveTextBuffer($e); + } // *TABLES* + break; + + case 'PAGEHEADER': + case 'PAGEFOOTER': + $this->ignorefollowingspaces = true; + if ($attr['NAME']) { $pname = $attr['NAME']; } + else { $pname = '_default'; } + + if ($tag=='PAGEHEADER') { $p = &$this->pageheaders[$pname]; } + else { $p = &$this->pagefooters[$pname]; } + + $p['L']=array(); + $p['C']=array(); + $p['R']=array(); + $p['L']['font-style'] = ''; + $p['C']['font-style'] = ''; + $p['R']['font-style'] = ''; + + if (isset($attr['CONTENT-LEFT'])) { + $p['L']['content'] = $attr['CONTENT-LEFT']; + } + if (isset($attr['CONTENT-CENTER'])) { + $p['C']['content'] = $attr['CONTENT-CENTER']; + } + if (isset($attr['CONTENT-RIGHT'])) { + $p['R']['content'] = $attr['CONTENT-RIGHT']; + } + + if (isset($attr['HEADER-STYLE']) || isset($attr['FOOTER-STYLE'])) { // font-family,size,weight,style,color + if ($tag=='PAGEHEADER') { $properties = $this->cssmgr->readInlineCSS($attr['HEADER-STYLE']); } + else { $properties = $this->cssmgr->readInlineCSS($attr['FOOTER-STYLE']); } + if (isset($properties['FONT-FAMILY'])) { + $p['L']['font-family'] = $properties['FONT-FAMILY']; + $p['C']['font-family'] = $properties['FONT-FAMILY']; + $p['R']['font-family'] = $properties['FONT-FAMILY']; + } + if (isset($properties['FONT-SIZE'])) { + $p['L']['font-size'] = $this->ConvertSize($properties['FONT-SIZE']) * _MPDFK; + $p['C']['font-size'] = $this->ConvertSize($properties['FONT-SIZE']) * _MPDFK; + $p['R']['font-size'] = $this->ConvertSize($properties['FONT-SIZE']) * _MPDFK; + } + if (isset($properties['FONT-WEIGHT']) && $properties['FONT-WEIGHT']=='bold') { + $p['L']['font-style'] = 'B'; + $p['C']['font-style'] = 'B'; + $p['R']['font-style'] = 'B'; + } + if (isset($properties['FONT-STYLE']) && $properties['FONT-STYLE']=='italic') { + $p['L']['font-style'] .= 'I'; + $p['C']['font-style'] .= 'I'; + $p['R']['font-style'] .= 'I'; + } + if (isset($properties['COLOR'])) { + $p['L']['color'] = $properties['COLOR']; + $p['C']['color'] = $properties['COLOR']; + $p['R']['color'] = $properties['COLOR']; + } + } + if (isset($attr['HEADER-STYLE-LEFT']) || isset($attr['FOOTER-STYLE-LEFT'])) { + if ($tag=='PAGEHEADER') { $properties = $this->cssmgr->readInlineCSS($attr['HEADER-STYLE-LEFT']); } + else { $properties = $this->cssmgr->readInlineCSS($attr['FOOTER-STYLE-LEFT']); } + if (isset($properties['FONT-FAMILY'])) { $p['L']['font-family'] = $properties['FONT-FAMILY']; } + if (isset($properties['FONT-SIZE'])) { $p['L']['font-size'] = $this->ConvertSize($properties['FONT-SIZE']) * _MPDFK; } + if (isset($properties['FONT-WEIGHT']) && $properties['FONT-WEIGHT']=='bold') { $p['L']['font-style'] ='B'; } + if (isset($properties['FONT-STYLE']) && $properties['FONT-STYLE']=='italic') { $p['L']['font-style'] .='I'; } + if (isset($properties['COLOR'])) { $p['L']['color'] = $properties['COLOR']; } + } + if (isset($attr['HEADER-STYLE-CENTER']) || isset($attr['FOOTER-STYLE-CENTER'])) { + if ($tag=='PAGEHEADER') { $properties = $this->cssmgr->readInlineCSS($attr['HEADER-STYLE-CENTER']); } + else { $properties = $this->cssmgr->readInlineCSS($attr['FOOTER-STYLE-CENTER']); } + if (isset($properties['FONT-FAMILY'])) { $p['C']['font-family'] = $properties['FONT-FAMILY']; } + if (isset($properties['FONT-SIZE'])) { $p['C']['font-size'] = $this->ConvertSize($properties['FONT-SIZE']) * _MPDFK; } + if (isset($properties['FONT-WEIGHT']) && $properties['FONT-WEIGHT']=='bold') { $p['C']['font-style'] = 'B'; } + if (isset($properties['FONT-STYLE']) && $properties['FONT-STYLE']=='italic') { $p['C']['font-style'] .= 'I'; } + if (isset($properties['COLOR'])) { $p['C']['color'] = $properties['COLOR']; } + } + if (isset($attr['HEADER-STYLE-RIGHT']) || isset($attr['FOOTER-STYLE-RIGHT'])) { + if ($tag=='PAGEHEADER') { $properties = $this->cssmgr->readInlineCSS($attr['HEADER-STYLE-RIGHT']); } + else { $properties = $this->cssmgr->readInlineCSS($attr['FOOTER-STYLE-RIGHT']); } + if (isset($properties['FONT-FAMILY'])) { $p['R']['font-family'] = $properties['FONT-FAMILY']; } + if (isset($properties['FONT-SIZE'])) { $p['R']['font-size'] = $this->ConvertSize($properties['FONT-SIZE']) * _MPDFK; } + if (isset($properties['FONT-WEIGHT']) && $properties['FONT-WEIGHT']=='bold') { $p['R']['font-style'] = 'B'; } + if (isset($properties['FONT-STYLE']) && $properties['FONT-STYLE']=='italic') { $p['R']['font-style'] .= 'I'; } + if (isset($properties['COLOR'])) { $p['R']['color'] = $properties['COLOR']; } + } + if (isset($attr['LINE']) && $attr['LINE']) { // 0|1|on|off + if ($attr['LINE']=='1' || strtoupper($attr['LINE'])=='ON') { $lineset=1; } + else { $lineset=0; } + $p['line'] = $lineset; + } + break; + + +/*-- HTMLHEADERS-FOOTERS --*/ + case 'SETHTMLPAGEHEADER': + case 'SETHTMLPAGEFOOTER': + $this->ignorefollowingspaces = true; + if (isset($attr['NAME']) && $attr['NAME']) { $pname = $attr['NAME']; } + else { $pname = '_default'; } + if (isset($attr['PAGE']) && $attr['PAGE']) { // O|odd|even|E|ALL|[blank] + if (strtoupper($attr['PAGE'])=='O' || strtoupper($attr['PAGE'])=='ODD') { $side='odd'; } + else if (strtoupper($attr['PAGE'])=='E' || strtoupper($attr['PAGE'])=='EVEN') { $side='even'; } + else if (strtoupper($attr['PAGE'])=='ALL') { $side='both'; } + else { $side='odd'; } + } + else { $side='odd'; } + if (isset($attr['VALUE']) && $attr['VALUE']) { // -1|1|on|off + if ($attr['VALUE']=='1' || strtoupper($attr['VALUE'])=='ON') { $set=1; } + else if ($attr['VALUE']=='-1' || strtoupper($attr['VALUE'])=='OFF') { $set=0; } + else { $set=1; } + } + else { $set=1; } + if (isset($attr['SHOW-THIS-PAGE']) && $attr['SHOW-THIS-PAGE'] && $tag=='SETHTMLPAGEHEADER') { $write = 1; } + else { $write = 0; } + if ($side=='odd' || $side=='both') { + if ($set && $tag=='SETHTMLPAGEHEADER') { $this->SetHTMLHeader($this->pageHTMLheaders[$pname],'O',$write); } + else if ($set && $tag=='SETHTMLPAGEFOOTER') { $this->SetHTMLFooter($this->pageHTMLfooters[$pname],'O'); } + else if ($tag=='SETHTMLPAGEHEADER') { $this->SetHTMLHeader('','O'); } + else { $this->SetHTMLFooter('','O'); } + } + if ($side=='even' || $side=='both') { + if ($set && $tag=='SETHTMLPAGEHEADER') { $this->SetHTMLHeader($this->pageHTMLheaders[$pname],'E',$write); } + else if ($set && $tag=='SETHTMLPAGEFOOTER') { $this->SetHTMLFooter($this->pageHTMLfooters[$pname],'E'); } + else if ($tag=='SETHTMLPAGEHEADER') { $this->SetHTMLHeader('','E'); } + else { $this->SetHTMLFooter('','E'); } + } + break; +/*-- END HTMLHEADERS-FOOTERS --*/ + + case 'SETPAGEHEADER': + case 'SETPAGEFOOTER': + $this->ignorefollowingspaces = true; + if (isset($attr['NAME']) && $attr['NAME']) { $pname = $attr['NAME']; } + else { $pname = '_default'; } + if (isset($attr['PAGE']) && $attr['PAGE']) { // O|odd|even|E|ALL|[blank] + if (strtoupper($attr['PAGE'])=='O' || strtoupper($attr['PAGE'])=='ODD') { $side='odd'; } + else if (strtoupper($attr['PAGE'])=='E' || strtoupper($attr['PAGE'])=='EVEN') { $side='even'; } + else if (strtoupper($attr['PAGE'])=='ALL') { $side='both'; } + else { $side='odd'; } + } + else { $side='odd'; } + if (isset($attr['VALUE']) && $attr['VALUE']) { // -1|1|on|off + if ($attr['VALUE']=='1' || strtoupper($attr['VALUE'])=='ON') { $set=1; } + else if ($attr['VALUE']=='-1' || strtoupper($attr['VALUE'])=='OFF') { $set=0; } + else { $set=1; } + } + else { $set=1; } + if ($side=='odd' || $side=='both') { + if ($set && $tag=='SETPAGEHEADER') { $this->headerDetails['odd'] = $this->pageheaders[$pname]; } + else if ($set && $tag=='SETPAGEFOOTER') { $this->footerDetails['odd'] = $this->pagefooters[$pname]; } + else if ($tag=='SETPAGEHEADER') { $this->headerDetails['odd'] = array(); } + else { $this->footerDetails['odd'] = array(); } + if (!$this->mirrorMargins || ($this->page)%2!=0) { // ODD + if ($tag=='SETPAGEHEADER') { $this->_setAutoHeaderHeight($this->headerDetails['odd'],$this->HTMLHeader); } + if ($tag=='SETPAGEFOOTER') { $this->_setAutoFooterHeight($this->footerDetails['odd'],$this->HTMLFooter); } + } + } + if ($side=='even' || $side=='both') { + if ($set && $tag=='SETPAGEHEADER') { $this->headerDetails['even'] = $this->pageheaders[$pname]; } + else if ($set && $tag=='SETPAGEFOOTER') { $this->footerDetails['even'] = $this->pagefooters[$pname]; } + else if ($tag=='SETPAGEHEADER') { $this->headerDetails['even'] = array(); } + else { $this->footerDetails['even'] = array(); } + if ($this->mirrorMargins && ($this->page)%2==0) { // EVEN + if ($tag=='SETPAGEHEADER') { $this->_setAutoHeaderHeight($this->headerDetails['even'],$this->HTMLHeaderE); } + if ($tag=='SETPAGEFOOTER') { $this->_setAutoFooterHeight($this->footerDetails['even'],$this->HTMLFooterE); } + } + } + if (isset($attr['SHOW-THIS-PAGE']) && $attr['SHOW-THIS-PAGE'] && $tag=='SETPAGEHEADER') { + $this->Header(); + } + break; + + +/*-- TOC --*/ + case 'TOC': //added custom-tag - set Marker for insertion later of ToC + if (!class_exists('tocontents', false)) { include(_MPDF_PATH.'classes/tocontents.php'); } + if (empty($this->tocontents)) { $this->tocontents = new tocontents($this); } + $this->tocontents->openTagTOC($attr); + break; + + + + case 'TOCPAGEBREAK': // custom-tag - set Marker for insertion later of ToC AND adds PAGEBREAK + if (!class_exists('tocontents', false)) { include(_MPDF_PATH.'classes/tocontents.php'); } + if (empty($this->tocontents)) { $this->tocontents = new tocontents($this); } + list($isbreak,$toc_id) = $this->tocontents->openTagTOCPAGEBREAK($attr); + if ($isbreak) break; + // No break - continues as PAGEBREAK... +/*-- END TOC --*/ + + + case 'PAGE_BREAK': //custom-tag + case 'PAGEBREAK': //custom-tag + case 'NEWPAGE': //custom-tag + case 'FORMFEED': //custom-tag + + $save_blklvl = $this->blklvl; + $save_blk = $this->blk; + $save_silp = $this->saveInlineProperties(); + $save_spanlvl = $this->spanlvl; + $save_ilp = $this->InlineProperties; + + // Close any open block tags + for ($b= $this->blklvl;$b>0;$b--) { $this->CloseTag($this->blk[$b]['tag']); } + if(!empty($this->textbuffer)) { //Output previously buffered content + $this->printbuffer($this->textbuffer); + $this->textbuffer=array(); + } + $this->ignorefollowingspaces = true; + $save_cols = false; +/*-- COLUMNS --*/ + if ($this->ColActive) { + $save_cols = true; + $save_nbcol = $this->NbCol; // other values of gap and vAlign will not change by setting Columns off + $this->SetColumns(0); + } +/*-- END COLUMNS --*/ + + + if (isset($attr['SHEET-SIZE']) && $tag != 'FORMFEED' && !$this->restoreBlockPageBreaks) { + // Convert to same types as accepted in initial mPDF() A4, A4-L, or array(w,h) + $prop = preg_split('/\s+/',trim($attr['SHEET-SIZE'])); + if (count($prop) == 2 ) { + $newformat = array($this->ConvertSize($prop[0]), $this->ConvertSize($prop[1])); + } + else { $newformat = $attr['SHEET-SIZE']; } + } + else { $newformat = ''; } + + $mgr = $mgl = $mgt = $mgb = $mgh = $mgf = ''; + if (isset($attr['MARGIN-RIGHT'])) { $mgr = $this->ConvertSize($attr['MARGIN-RIGHT'],$this->w,$this->FontSize,false); } + if (isset($attr['MARGIN-LEFT'])) { $mgl = $this->ConvertSize($attr['MARGIN-LEFT'],$this->w,$this->FontSize,false); } + if (isset($attr['MARGIN-TOP'])) { $mgt = $this->ConvertSize($attr['MARGIN-TOP'],$this->w,$this->FontSize,false); } + if (isset($attr['MARGIN-BOTTOM'])) { $mgb = $this->ConvertSize($attr['MARGIN-BOTTOM'],$this->w,$this->FontSize,false); } + if (isset($attr['MARGIN-HEADER'])) { $mgh = $this->ConvertSize($attr['MARGIN-HEADER'],$this->w,$this->FontSize,false); } + if (isset($attr['MARGIN-FOOTER'])) { $mgf = $this->ConvertSize($attr['MARGIN-FOOTER'],$this->w,$this->FontSize,false); } + $ohname = $ehname = $ofname = $efname = ''; + if (isset($attr['ODD-HEADER-NAME'])) { $ohname = $attr['ODD-HEADER-NAME']; } + if (isset($attr['EVEN-HEADER-NAME'])) { $ehname = $attr['EVEN-HEADER-NAME']; } + if (isset($attr['ODD-FOOTER-NAME'])) { $ofname = $attr['ODD-FOOTER-NAME']; } + if (isset($attr['EVEN-FOOTER-NAME'])) { $efname = $attr['EVEN-FOOTER-NAME']; } + $ohvalue = $ehvalue = $ofvalue = $efvalue = 0; + if (isset($attr['ODD-HEADER-VALUE']) && ($attr['ODD-HEADER-VALUE']=='1' || strtoupper($attr['ODD-HEADER-VALUE'])=='ON')) { $ohvalue = 1; } + else if (isset($attr['ODD-HEADER-VALUE']) && ($attr['ODD-HEADER-VALUE']=='-1' || strtoupper($attr['ODD-HEADER-VALUE'])=='OFF')) { $ohvalue = -1; } + if (isset($attr['EVEN-HEADER-VALUE']) && ($attr['EVEN-HEADER-VALUE']=='1' || strtoupper($attr['EVEN-HEADER-VALUE'])=='ON')) { $ehvalue = 1; } + else if (isset($attr['EVEN-HEADER-VALUE']) && ($attr['EVEN-HEADER-VALUE']=='-1' || strtoupper($attr['EVEN-HEADER-VALUE'])=='OFF')) { $ehvalue = -1; } + if (isset($attr['ODD-FOOTER-VALUE']) && ($attr['ODD-FOOTER-VALUE']=='1' || strtoupper($attr['ODD-FOOTER-VALUE'])=='ON')) { $ofvalue = 1; } + else if (isset($attr['ODD-FOOTER-VALUE']) && ($attr['ODD-FOOTER-VALUE']=='-1' || strtoupper($attr['ODD-FOOTER-VALUE'])=='OFF')) { $ofvalue = -1; } + if (isset($attr['EVEN-FOOTER-VALUE']) && ($attr['EVEN-FOOTER-VALUE']=='1' || strtoupper($attr['EVEN-FOOTER-VALUE'])=='ON')) { $efvalue = 1; } + else if (isset($attr['EVEN-FOOTER-VALUE']) && ($attr['EVEN-FOOTER-VALUE']=='-1' || strtoupper($attr['EVEN-FOOTER-VALUE'])=='OFF')) { $efvalue = -1; } + + if (isset($attr['ORIENTATION']) && (strtoupper($attr['ORIENTATION'])=='L' || strtoupper($attr['ORIENTATION'])=='LANDSCAPE')) { $orient = 'L'; } + else if (isset($attr['ORIENTATION']) && (strtoupper($attr['ORIENTATION'])=='P' || strtoupper($attr['ORIENTATION'])=='PORTRAIT')) { $orient = 'P'; } + else { $orient = $this->CurOrientation; } + + if (isset($attr['PAGE-SELECTOR']) && $attr['PAGE-SELECTOR']) { $pagesel = $attr['PAGE-SELECTOR']; } + else { $pagesel = ''; } + + $resetpagenum = ''; + $pagenumstyle = ''; + $suppress = ''; + if (isset($attr['RESETPAGENUM'])) { $resetpagenum = $attr['RESETPAGENUM']; } + if (isset($attr['PAGENUMSTYLE'])) { $pagenumstyle = $attr['PAGENUMSTYLE']; } + if (isset($attr['SUPPRESS'])) { $suppress = $attr['SUPPRESS']; } + + if ($tag == 'TOCPAGEBREAK') { $type = 'NEXT-ODD'; } + else if(isset($attr['TYPE'])) { $type = strtoupper($attr['TYPE']); } + else { $type = ''; } + + if ($type == 'E' || $type == 'EVEN') { $this->AddPage($orient,'E', $resetpagenum, $pagenumstyle, $suppress,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf,$ohname,$ehname,$ofname,$efname,$ohvalue,$ehvalue,$ofvalue,$efvalue,$pagesel,$newformat); } + else if ($type == 'O' || $type == 'ODD') { $this->AddPage($orient,'O', $resetpagenum, $pagenumstyle, $suppress,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf,$ohname,$ehname,$ofname,$efname,$ohvalue,$ehvalue,$ofvalue,$efvalue,$pagesel,$newformat); } + else if ($type == 'NEXT-ODD') { $this->AddPage($orient,'NEXT-ODD', $resetpagenum, $pagenumstyle, $suppress,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf,$ohname,$ehname,$ofname,$efname,$ohvalue,$ehvalue,$ofvalue,$efvalue,$pagesel,$newformat); } + else if ($type == 'NEXT-EVEN') { $this->AddPage($orient,'NEXT-EVEN', $resetpagenum, $pagenumstyle, $suppress,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf,$ohname,$ehname,$ofname,$efname,$ohvalue,$ehvalue,$ofvalue,$efvalue,$pagesel,$newformat); } + else { $this->AddPage($orient,'', $resetpagenum, $pagenumstyle, $suppress,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf,$ohname,$ehname,$ofname,$efname,$ohvalue,$ehvalue,$ofvalue,$efvalue,$pagesel,$newformat); } + +/*-- TOC --*/ + if ($tag == 'TOCPAGEBREAK') { + if ($toc_id) { $this->tocontents->m_TOC[$toc_id]['TOCmark'] = $this->page; } + else { $this->tocontents->TOCmark = $this->page; } + } +/*-- END TOC --*/ + +/*-- COLUMNS --*/ + if ($save_cols) { + // Restore columns + $this->SetColumns($save_nbcol,$this->colvAlign,$this->ColGap); + } +/*-- END COLUMNS --*/ + if (($tag == 'FORMFEED' || $this->restoreBlockPagebreaks) && !$this->tableLevel && !$this->listlvl) { + $this->blk = $save_blk; + // Re-open block tags + $t = $this->blk[0]['tag']; + $a = $this->blk[0]['attr']; + $this->blklvl = 0; + for ($b=0; $b<=$save_blklvl;$b++) { + $tc = $t; + $ac = $a; + $t = $this->blk[$b+1]['tag']; + $a = $this->blk[$b+1]['attr']; + unset($this->blk[$b+1]); + $this->OpenTag($tc,$ac); + } + $this->spanlvl = $save_spanlvl; + $this->InlineProperties = $save_ilp; + $this->restoreInlineProperties($save_silp); + } + + break; + + +/*-- TOC --*/ + case 'TOCENTRY': + if (isset($attr['CONTENT']) && $attr['CONTENT']) { + $objattr = array(); + $objattr['CONTENT'] = htmlspecialchars_decode($attr['CONTENT'],ENT_QUOTES); + $objattr['type'] = 'toc'; + if (isset($attr['LEVEL']) && $attr['LEVEL']) { $objattr['toclevel'] = $attr['LEVEL']; } else { $objattr['toclevel'] = 0; } + if (isset($attr['NAME']) && $attr['NAME']) { $objattr['toc_id'] = $attr['NAME']; } else { $objattr['toc_id'] = 0; } + $e = "\xbb\xa4\xactype=toc,objattr=".serialize($objattr)."\xbb\xa4\xac"; + if($this->tableLevel) { $this->cell[$this->row][$this->col]['textbuffer'][] = array($e); } // *TABLES* + else { // *TABLES* + $this->textbuffer[] = array($e); + } // *TABLES* + } + break; +/*-- END TOC --*/ + +/*-- INDEX --*/ + case 'INDEXENTRY': + if (isset($attr['CONTENT']) && $attr['CONTENT']) { + if (isset($attr['XREF']) && $attr['XREF']) { + $this->IndexEntry(htmlspecialchars_decode($attr['CONTENT'],ENT_QUOTES),$attr['XREF']); + break; + } + $objattr = array(); + $objattr['CONTENT'] = htmlspecialchars_decode($attr['CONTENT'],ENT_QUOTES); + $objattr['type'] = 'indexentry'; + $e = "\xbb\xa4\xactype=indexentry,objattr=".serialize($objattr)."\xbb\xa4\xac"; + if($this->tableLevel) { $this->cell[$this->row][$this->col]['textbuffer'][] = array($e); } // *TABLES* + else { // *TABLES* + $this->textbuffer[] = array($e); + } // *TABLES* + } + break; + + + case 'INDEXINSERT': + if (isset($attr['FONT-SIZE'])) { $reffontsize = $attr['FONT-SIZE']; } else { $reffontsize = ''; } + if (isset($attr['LINE-SPACING']) && $attr['LINE-SPACING']) { $linespacing = $attr['LINE-SPACING']; } else { $linespacing = ''; } + if (isset($attr['DIV-FONT-SIZE']) && $attr['DIV-FONT-SIZE']) { $divlettfontsize = $attr['DIV-FONT-SIZE']; } else { $divlettfontsize = ''; } + if (isset($attr['FONT']) && $attr['FONT']) { $reffont = $attr['FONT']; } else { $reffont = ''; } + if (isset($attr['DIV-FONT']) && $attr['DIV-FONT']) { $divlettfont = $attr['DIV-FONT']; } else { $divlettfont = ''; } + if (isset($attr['COLS']) && $attr['COLS']) { $cols = $attr['COLS']; } else { $cols = 1; } + if (isset($attr['OFFSET']) && $attr['OFFSET']) { $offset = $attr['OFFSET']; } else { $offset = 3; } + if (isset($attr['GAP']) && $attr['GAP']) { $gap = $attr['GAP']; } else { $gap = 5; } + + if (isset($attr['USEDIVLETTERS']) && (strtoupper($attr['USEDIVLETTERS'])=='OFF' || $attr['USEDIVLETTERS']==-1 || $attr['USEDIVLETTERS']==='0')) { $usedivletters = 0; } + else { $usedivletters = 1; } + + if (isset($attr['LINKS']) && (strtoupper($attr['LINKS'])=='ON' || $attr['LINKS']==1)) { $links = true; } + else { $links = false; } + $this->CreateIndex($cols, $reffontsize, $linespacing, $offset, $usedivletters, $divlettfontsize, $gap, $reffont,$divlettfont, $links); + break; +/*-- END INDEX --*/ + +/*-- WATERMARK --*/ + + case 'WATERMARKTEXT': + if (isset($attr['CONTENT']) && $attr['CONTENT']) { $txt = htmlspecialchars_decode($attr['CONTENT'],ENT_QUOTES); } else { $txt = ''; } + if (isset($attr['ALPHA']) && $attr['ALPHA']>0) { $alpha = $attr['ALPHA']; } else { $alpha = -1; } + $this->SetWatermarkText($txt, $alpha); + break; + + + case 'WATERMARKIMAGE': + if (isset($attr['SRC'])) { $src = $attr['SRC']; } else { $src = ''; } + if (isset($attr['ALPHA']) && $attr['ALPHA']>0) { $alpha = $attr['ALPHA']; } else { $alpha = -1; } + if (isset($attr['SIZE']) && $attr['SIZE']) { + $size = $attr['SIZE']; + if (strpos($size,',')) { $size = explode(',',$size); } + } + else { $size = 'D'; } + if (isset($attr['POS']) && $attr['POS']) { + $pos = $attr['POS']; + if (strpos($pos,',')) { $pos = explode(',',$pos); } + } + else { $pos = 'P'; } + $this->SetWatermarkImage($src, $alpha, $size, $pos); + break; +/*-- END WATERMARK --*/ + +/*-- BOOKMARKS --*/ + case 'BOOKMARK': + if (isset($attr['CONTENT'])) { + $objattr = array(); + $objattr['CONTENT'] = htmlspecialchars_decode($attr['CONTENT'],ENT_QUOTES); + $objattr['type'] = 'bookmark'; + if (isset($attr['LEVEL']) && $attr['LEVEL']) { $objattr['bklevel'] = $attr['LEVEL']; } else { $objattr['bklevel'] = 0; } + $e = "\xbb\xa4\xactype=bookmark,objattr=".serialize($objattr)."\xbb\xa4\xac"; + if($this->tableLevel) { $this->cell[$this->row][$this->col]['textbuffer'][] = array($e); } // *TABLES* + else { // *TABLES* + $this->textbuffer[] = array($e); + } // *TABLES* + } + break; +/*-- END BOOKMARKS --*/ + +/*-- ANNOTATIONS --*/ + case 'ANNOTATION': + + //if (isset($attr['CONTENT']) && !$this->writingHTMLheader && !$this->writingHTMLfooter) { // Stops annotations in FixedPos + if (isset($attr['CONTENT'])) { + $objattr = array(); + $objattr['margin_top'] = 0; + $objattr['margin_bottom'] = 0; + $objattr['margin_left'] = 0; + $objattr['margin_right'] = 0; + $objattr['width'] = 0; + $objattr['height'] = 0; + $objattr['border_top']['w'] = 0; + $objattr['border_bottom']['w'] = 0; + $objattr['border_left']['w'] = 0; + $objattr['border_right']['w'] = 0; + $objattr['CONTENT'] = htmlspecialchars_decode($attr['CONTENT'],ENT_QUOTES); + $objattr['type'] = 'annot'; + $objattr['POPUP'] = ''; + } + else { break; } + if (isset($attr['POS-X'])) { $objattr['POS-X'] = $attr['POS-X']; } else { $objattr['POS-X'] = 0; } + if (isset($attr['POS-Y'])) { $objattr['POS-Y'] = $attr['POS-Y']; } else { $objattr['POS-Y'] = 0; } + if (isset($attr['ICON'])) { $objattr['ICON'] = $attr['ICON']; } else { $objattr['ICON'] = 'Note'; } + if (isset($attr['AUTHOR'])) { $objattr['AUTHOR'] = $attr['AUTHOR']; } + else if (isset($attr['TITLE'])) { $objattr['AUTHOR'] = $attr['TITLE']; } else { $objattr['AUTHOR'] = ''; } + if (isset($attr['FILE'])) { $objattr['FILE'] = $attr['FILE']; } else { $objattr['FILE'] = ''; } + if (isset($attr['SUBJECT'])) { $objattr['SUBJECT'] = $attr['SUBJECT']; } else { $objattr['SUBJECT'] = ''; } + if (isset($attr['OPACITY']) && $attr['OPACITY']>0 && $attr['OPACITY']<=1) { $objattr['OPACITY'] = $attr['OPACITY']; } + else if ($this->annotMargin) { $objattr['OPACITY'] = 1; } + else { $objattr['OPACITY'] = $this->annotOpacity; } + if (isset($attr['COLOR'])) { + $cor = $this->ConvertColor($attr['COLOR']); + if ($cor) { $objattr['COLOR'] = $cor; } + else { $objattr['COLOR'] = $this->ConvertColor('yellow'); } + } + else { $objattr['COLOR'] = $this->ConvertColor('yellow'); } + + if (isset($attr['POPUP']) && !empty($attr['POPUP'])) { + $pop = preg_split('/\s+/',trim($attr['POPUP'])); + if (count($pop)>1) { $objattr['POPUP'] = $pop; } + else { $objattr['POPUP'] = true; } + } + $e = "\xbb\xa4\xactype=annot,objattr=".serialize($objattr)."\xbb\xa4\xac"; + if($this->tableLevel) { $this->cell[$this->row][$this->col]['textbuffer'][] = array($e); } // *TABLES* + else { // *TABLES* + $this->textbuffer[] = array($e); + } // *TABLES* + break; +/*-- END ANNOTATIONS --*/ + + +/*-- COLUMNS --*/ + case 'COLUMNS': //added custom-tag + if (isset($attr['COLUMN-COUNT']) && ($attr['COLUMN-COUNT'] || $attr['COLUMN-COUNT']==='0')) { + // Close any open block tags + for ($b= $this->blklvl;$b>0;$b--) { $this->CloseTag($this->blk[$b]['tag']); } + if(!empty($this->textbuffer)) { //Output previously buffered content + $this->printbuffer($this->textbuffer); + $this->textbuffer=array(); + } + + if (isset($attr['VALIGN']) && $attr['VALIGN']) { + if ($attr['VALIGN'] == 'J') { $valign = 'J'; } + else { $valign = $align[$attr['VALIGN']]; } + } + else { $valign = ''; } + if (isset($attr['COLUMN-GAP']) && $attr['COLUMN-GAP']) { $this->SetColumns($attr['COLUMN-COUNT'],$valign,$attr['COLUMN-GAP']); } + else { $this->SetColumns($attr['COLUMN-COUNT'],$valign); } + } + $this->ignorefollowingspaces = true; + break; + + case 'COLUMN_BREAK': //custom-tag + case 'COLUMNBREAK': //custom-tag + case 'NEWCOLUMN': //custom-tag + $this->ignorefollowingspaces = true; + $this->NewColumn(); + $this->ColumnAdjust = false; // disables all column height adjustment for the page. + break; + +/*-- END COLUMNS --*/ + + + case 'BDO': + // $this->biDirectional = true; + break; + + + case 'TTZ': + $this->ttz = true; + $this->InlineProperties[$tag] = $this->saveInlineProperties(); + $this->setCSS(array('FONT-FAMILY'=>'czapfdingbats','FONT-WEIGHT'=>'normal','FONT-STYLE'=>'normal'),'INLINE'); + break; + + case 'TTS': + $this->tts = true; + $this->InlineProperties[$tag] = $this->saveInlineProperties(); + $this->setCSS(array('FONT-FAMILY'=>'csymbol','FONT-WEIGHT'=>'normal','FONT-STYLE'=>'normal'),'INLINE'); + break; + + case 'TTA': + $this->tta = true; + $this->InlineProperties[$tag] = $this->saveInlineProperties(); + + if (in_array($this->FontFamily,$this->mono_fonts)) { + $this->setCSS(array('FONT-FAMILY'=>'ccourier'),'INLINE'); + } + else if (in_array($this->FontFamily,$this->serif_fonts)) { + $this->setCSS(array('FONT-FAMILY'=>'ctimes'),'INLINE'); + } + else { + $this->setCSS(array('FONT-FAMILY'=>'chelvetica'),'INLINE'); + } + break; + + + + // INLINE PHRASES OR STYLES + case 'SUB': + case 'SUP': + case 'ACRONYM': + case 'BIG': + case 'SMALL': + case 'INS': + case 'S': + case 'STRIKE': + case 'DEL': + case 'STRONG': + case 'CITE': + case 'Q': + case 'EM': + case 'B': + case 'I': + case 'U': + case 'SAMP': + case 'CODE': + case 'KBD': + case 'TT': + case 'VAR': + case 'FONT': + case 'MARK': // mPDF 5.5.09 + case 'TIME': + + case 'SPAN': +/*-- ANNOTATIONS --*/ + if ($this->title2annots && isset($attr['TITLE'])) { + $objattr = array(); + $objattr['margin_top'] = 0; + $objattr['margin_bottom'] = 0; + $objattr['margin_left'] = 0; + $objattr['margin_right'] = 0; + $objattr['width'] = 0; + $objattr['height'] = 0; + $objattr['border_top']['w'] = 0; + $objattr['border_bottom']['w'] = 0; + $objattr['border_left']['w'] = 0; + $objattr['border_right']['w'] = 0; + + $objattr['CONTENT'] = $attr['TITLE']; + $objattr['type'] = 'annot'; + $objattr['POS-X'] = 0; + $objattr['POS-Y'] = 0; + $objattr['ICON'] = 'Comment'; + $objattr['AUTHOR'] = ''; + $objattr['SUBJECT'] = ''; + $objattr['OPACITY'] = $this->annotOpacity; + $objattr['COLOR'] = $this->ConvertColor('yellow'); + $annot = "\xbb\xa4\xactype=annot,objattr=".serialize($objattr)."\xbb\xa4\xac"; + } +/*-- END ANNOTATIONS --*/ + + if ($tag == 'SPAN') { + $this->spanlvl++; + $this->InlineProperties['SPAN'][$this->spanlvl] = $this->saveInlineProperties(); + if (isset($annot)) { $this->InlineAnnots[$tag][$this->spanlvl] = $annot; } // *ANNOTATIONS* + } + else { + if (!isset($this->InlineProperties[$tag])) $this->InlineProperties[$tag] = $this->saveInlineProperties(); // mPDF 5.4.13 + if (isset($annot)) { $this->InlineAnnots[$tag] = $annot; } // *ANNOTATIONS* + } + $properties = $this->cssmgr->MergeCSS('INLINE',$tag,$attr); + if (!empty($properties)) $this->setCSS($properties,'INLINE'); + break; + + + case 'A': + if (isset($attr['NAME']) and $attr['NAME'] != '') { + $e = ''; +/*-- BOOKMARKS --*/ + if ($this->anchor2Bookmark) { + $objattr = array(); + $objattr['CONTENT'] = htmlspecialchars_decode($attr['NAME'],ENT_QUOTES); + $objattr['type'] = 'bookmark'; + if (isset($attr['LEVEL']) && $attr['LEVEL']) { $objattr['bklevel'] = $attr['LEVEL']; } else { $objattr['bklevel'] = 0; } + $e = "\xbb\xa4\xactype=bookmark,objattr=".serialize($objattr)."\xbb\xa4\xac"; + } +/*-- END BOOKMARKS --*/ + if($this->tableLevel) { // *TABLES* + $this->_saveCellTextBuffer($e, '', $attr['NAME']); // *TABLES* + } // *TABLES* + else { // *TABLES* + $this->_saveTextBuffer($e, '', $attr['NAME']); //an internal link (adds a space for recognition) + } // *TABLES* + } + if (isset($attr['HREF'])) { + $this->InlineProperties['A'] = $this->saveInlineProperties(); + $properties = $this->cssmgr->MergeCSS('',$tag,$attr); + if (!empty($properties)) $this->setCSS($properties,'INLINE'); + $this->HREF=htmlspecialchars_decode(urldecode($attr['HREF'])); + } + break; + + case 'LEGEND': // mPDF 5.4.18 + $this->InlineProperties['LEGEND'] = $this->saveInlineProperties(); + $properties = $this->cssmgr->MergeCSS('',$tag,$attr); + if (!empty($properties)) $this->setCSS($properties,'INLINE'); + break; + + + + case 'PROGRESS': // mPDF 5.5.09 + case 'METER': // mPDF 5.5.09 + $this->inMeter = true; // mPDF 5.5.09 + + if (isset($attr['MAX']) && $attr['MAX']) { $max = $attr['MAX']; } + else { $max = 1; } + if (isset($attr['MIN']) && $attr['MIN'] && $tag=='METER') { $min = $attr['MIN']; } + else { $min = 0; } + if ($max < $min) { $max = $min; } + + if (isset($attr['VALUE']) && ($attr['VALUE'] || $attr['VALUE']==='0')) { + $value = $attr['VALUE']; + if ($value < $min) { $value = $min; } + else if ($value > $max) { $value = $max; } + } + else { $value = ''; } + + if (isset($attr['LOW']) && $attr['LOW']) { $low = $attr['LOW']; } + else { $low = $min; } + if ($low < $min) { $low = $min; } + else if ($low > $max) { $low = $max; } + if (isset($attr['HIGH']) && $attr['HIGH']) { $high = $attr['HIGH']; } + else { $high = $max; } + if ($high < $low) { $high = $low; } + else if ($high > $max) { $high = $max; } + if (isset($attr['OPTIMUM']) && $attr['OPTIMUM']) { $optimum = $attr['OPTIMUM']; } + else { $optimum = $min + (($max-$min)/2); } + if ($optimum < $min) { $optimum = $min; } + else if ($optimum > $max) { $optimum = $max; } + if (isset($attr['TYPE']) && $attr['TYPE']) { $type = $attr['TYPE']; } + else { $type = ''; } + $objattr = array(); + $objattr['margin_top'] = 0; + $objattr['margin_bottom'] = 0; + $objattr['margin_left'] = 0; + $objattr['margin_right'] = 0; + $objattr['padding_top'] = 0; + $objattr['padding_bottom'] = 0; + $objattr['padding_left'] = 0; + $objattr['padding_right'] = 0; + $objattr['width'] = 0; + $objattr['height'] = 0; + $objattr['border_top']['w'] = 0; + $objattr['border_bottom']['w'] = 0; + $objattr['border_left']['w'] = 0; + $objattr['border_right']['w'] = 0; + + $properties = $this->cssmgr->MergeCSS('',$tag,$attr); + if(isset($properties ['DISPLAY']) && strtolower($properties ['DISPLAY'])=='none') { + return; + } + $objattr['visibility'] = 'visible'; + if (isset($properties['VISIBILITY'])) { + $v = strtolower($properties['VISIBILITY']); + if (($v == 'hidden' || $v == 'printonly' || $v == 'screenonly') && $this->visibility=='visible') { + $objattr['visibility'] = $v; + } + } + + if (isset($properties['MARGIN-TOP'])) { $objattr['margin_top']=$this->ConvertSize($properties['MARGIN-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-BOTTOM'])) { $objattr['margin_bottom'] = $this->ConvertSize($properties['MARGIN-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-LEFT'])) { $objattr['margin_left'] = $this->ConvertSize($properties['MARGIN-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-RIGHT'])) { $objattr['margin_right'] = $this->ConvertSize($properties['MARGIN-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + + if (isset($properties['PADDING-TOP'])) { $objattr['padding_top']=$this->ConvertSize($properties['PADDING-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-BOTTOM'])) { $objattr['padding_bottom'] = $this->ConvertSize($properties['PADDING-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-LEFT'])) { $objattr['padding_left'] = $this->ConvertSize($properties['PADDING-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-RIGHT'])) { $objattr['padding_right'] = $this->ConvertSize($properties['PADDING-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + + if (isset($properties['BORDER-TOP'])) { $objattr['border_top'] = $this->border_details($properties['BORDER-TOP']); } + if (isset($properties['BORDER-BOTTOM'])) { $objattr['border_bottom'] = $this->border_details($properties['BORDER-BOTTOM']); } + if (isset($properties['BORDER-LEFT'])) { $objattr['border_left'] = $this->border_details($properties['BORDER-LEFT']); } + if (isset($properties['BORDER-RIGHT'])) { $objattr['border_right'] = $this->border_details($properties['BORDER-RIGHT']); } + + if (isset($properties['VERTICAL-ALIGN'])) { $objattr['vertical-align'] = $align[strtolower($properties['VERTICAL-ALIGN'])]; } + $w = 0; + $h = 0; + if(isset($properties['WIDTH'])) $w = $this->ConvertSize($properties['WIDTH'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + else if(isset($attr['WIDTH'])) $w = $this->ConvertSize($attr['WIDTH'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + + if(isset($properties['HEIGHT'])) $h = $this->ConvertSize($properties['HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + else if(isset($attr['HEIGHT'])) $h = $this->ConvertSize($attr['HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + + if (isset($properties['OPACITY']) && $properties['OPACITY'] > 0 && $properties['OPACITY'] <= 1) { $objattr['opacity'] = $properties['OPACITY']; } + if ($this->HREF) { + if (strpos($this->HREF,".") === false && strpos($this->HREF,"@") !== 0) { + $href = $this->HREF; + while(array_key_exists($href,$this->internallink)) $href="#".$href; + $this->internallink[$href] = $this->AddLink(); + $objattr['link'] = $this->internallink[$href]; + } + else { $objattr['link'] = $this->HREF; } + } + $extraheight = $objattr['padding_top'] + $objattr['padding_bottom'] + $objattr['margin_top'] + $objattr['margin_bottom'] + $objattr['border_top']['w'] + $objattr['border_bottom']['w']; + $extrawidth = $objattr['padding_left'] + $objattr['padding_right'] + $objattr['margin_left'] + $objattr['margin_right'] + $objattr['border_left']['w'] + $objattr['border_right']['w']; + + // Image file + if (!class_exists('meter', false)) { + include(_MPDF_PATH.'classes/meter.php'); + } + $this->meter = new meter(); + $svg = $this->meter->makeSVG(strtolower($tag), $type, $value, $max, $min, $optimum, $low, $high); + //Save to local file + $srcpath= _MPDF_TEMP_PATH.'_tempSVG'.RAND(1,10000).'_'.strtolower($tag).'.svg'; + file_put_contents($srcpath, $svg); + $orig_srcpath = $srcpath; + $this->GetFullPath($srcpath); + + $info=$this->_getImage($srcpath, true, true, $orig_srcpath); + if(!$info) { + $info = $this->_getImage($this->noImageFile); + if ($info) { + $srcpath = $this->noImageFile; + $w = ($info['w'] * (25.4/$this->dpi)); + $h = ($info['h'] * (25.4/$this->dpi)); + } + } + if(!$info) break; + + $objattr['file'] = $srcpath; + //Default width and height calculation if needed + if($w==0 and $h==0) { + // SVG units are pixels + $w = $this->FontSize/(10/_MPDFK) * abs($info['w'])/_MPDFK; // mPDF 5.5.21 + $h = $this->FontSize/(10/_MPDFK) * abs($info['h'])/_MPDFK; + } + // IF WIDTH OR HEIGHT SPECIFIED + if($w==0) $w=abs($h*$info['w']/$info['h']); + if($h==0) $h=abs($w*$info['h']/$info['w']); + + // Resize to maximum dimensions of page + $maxWidth = $this->blk[$this->blklvl]['inner_width']; + $maxHeight = $this->h - ($this->tMargin + $this->bMargin + 1) ; + if ($this->fullImageHeight) { $maxHeight = $this->fullImageHeight; } + if ($w + $extrawidth > $maxWidth ) { + $w = $maxWidth - $extrawidth; + $h=abs($w*$info['h']/$info['w']); + } + + if ($h + $extraheight > $maxHeight ) { + $h = $maxHeight - $extraheight; + $w=abs($h*$info['w']/$info['h']); + } + $objattr['type'] = 'image'; + $objattr['itype'] = $info['type']; + + $objattr['orig_h'] = $info['h']; + $objattr['orig_w'] = $info['w']; + $objattr['wmf_x'] = $info['x']; + $objattr['wmf_y'] = $info['y']; + $objattr['height'] = $h + $extraheight; + $objattr['width'] = $w + $extrawidth; + $objattr['image_height'] = $h; + $objattr['image_width'] = $w; + $e = "\xbb\xa4\xactype=image,objattr=".serialize($objattr)."\xbb\xa4\xac"; + $properties = array(); + if ($this->tableLevel) { + $this->_saveCellTextBuffer($e, $this->HREF); + $this->cell[$this->row][$this->col]['s'] += $objattr['width'] ; + } + else { + $this->_saveTextBuffer($e, $this->HREF); + } + + break; + + + case 'BR': + // Added mPDF 3.0 Float DIV - CLEAR + if (isset($attr['STYLE'])) { + $properties = $this->cssmgr->readInlineCSS($attr['STYLE']); + if (isset($properties['CLEAR'])) { $this->ClearFloats(strtoupper($properties['CLEAR']),$this->blklvl); } // *CSS-FLOAT* + } + + +/*-- TABLES --*/ + if($this->tableLevel) { + + if ($this->blockjustfinished || $this->listjustfinished) { + $this->_saveCellTextBuffer("\n"); + } + + $this->_saveCellTextBuffer("\n"); + if (!isset($this->cell[$this->row][$this->col]['maxs'])) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + elseif($this->cell[$this->row][$this->col]['maxs'] < $this->cell[$this->row][$this->col]['s']) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + $this->cell[$this->row][$this->col]['s'] = 0 ;// reset + } + else { +/*-- END TABLES --*/ + if (count($this->textbuffer)) { + $this->textbuffer[count($this->textbuffer)-1][0] = preg_replace('/ $/','',$this->textbuffer[count($this->textbuffer)-1][0]); + } + $this->_saveTextBuffer("\n"); + } // *TABLES* + $this->ignorefollowingspaces = true; + $this->blockjustfinished=false; + $this->listjustfinished=false; + + $this->linebreakjustfinished=true; + break; + + + // *********** BLOCKS ******************** + + + case 'PRE': + $this->ispre=true; // ADDED - Prevents left trim of textbuffer in printbuffer() + + case 'DIV': + case 'FORM': + case 'CENTER': + + case 'BLOCKQUOTE': + case 'ADDRESS': + + case 'CAPTION': + case 'P': + case 'H1': + case 'H2': + case 'H3': + case 'H4': + case 'H5': + case 'H6': + case 'DL': + case 'DT': + case 'DD': + case 'FIELDSET': + // mPDF 5.5.22 + case 'DETAILS': + case 'SUMMARY': + // mPDF 5.5.09 + case 'ARTICLE': + case 'ASIDE': + case 'FIGURE': + case 'FIGCAPTION': + case 'FOOTER': + case 'HEADER': + case 'HGROUP': + case 'NAV': + case 'SECTION': + $p = $this->cssmgr->PreviewBlockCSS($tag,$attr); + if(isset($p['DISPLAY']) && strtolower($p['DISPLAY'])=='none') { + $this->blklvl++; + $this->blk[$this->blklvl]['hide'] = true; + return; + } + if($tag == 'CAPTION') { + // position is written in AdjstHTML + if (isset($attr['POSITION']) && strtolower($attr['POSITION'])=='bottom') { $divpos = 'B'; } + else { $divpos = 'T'; } + if (isset($attr['ALIGN']) && strtolower($attr['ALIGN'])=='bottom') { $cappos = 'B'; } + else if (isset($p['CAPTION-SIDE']) && strtolower($p['CAPTION-SIDE'])=='bottom') { $cappos = 'B'; } + else { $cappos = 'T'; } + if (isset($attr['ALIGN'])) { unset($attr['ALIGN']); } + if ($cappos != $divpos) { + $this->blklvl++; + $this->blk[$this->blklvl]['hide'] = true; + return; + } + } + +/*-- FORMS --*/ + if($tag == 'FORM') { + if (isset($attr['METHOD']) && strtolower($attr['METHOD'])=='get') { $this->form->formMethod = 'GET'; } + else { $this->form->formMethod = 'POST'; } + if (isset($attr['ACTION'])) { $this->form->formAction = $attr['ACTION']; } + else { $this->form->formAction = ''; } + } +/*-- END FORMS --*/ + + +/*-- CSS-POSITION --*/ + if ((isset($p['POSITION']) && (strtolower($p['POSITION'])=='fixed' || strtolower($p['POSITION'])=='absolute')) && $this->blklvl==0) { + if ($this->inFixedPosBlock) { + $this->Error("Cannot nest block with position:fixed or position:absolute"); + } + $this->inFixedPosBlock = true; + return; + } +/*-- END CSS-POSITION --*/ + // Start Block + $this->ignorefollowingspaces = true; + + if ($this->blockjustfinished && !count($this->textbuffer) && $this->y != $this->tMargin && $this->collapseBlockMargins) { $lastbottommargin = $this->lastblockbottommargin; } + else { $lastbottommargin = 0; } + $this->lastblockbottommargin = 0; + $this->blockjustfinished=false; + +/*-- LISTS --*/ + if ($this->listlvl>0) { return; } +/*-- END LISTS --*/ + + $this->InlineProperties = array(); + $this->spanlvl = 0; + $this->listjustfinished=false; + $this->divbegin=true; + + $this->linebreakjustfinished=false; + +/*-- TABLES --*/ + if ($this->tableLevel) { + + // If already something on the line + if ($this->cell[$this->row][$this->col]['s'] > 0 && !$this->nestedtablejustfinished ) { + $this->_saveCellTextBuffer("\n"); + if (!isset($this->cell[$this->row][$this->col]['maxs'])) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + elseif($this->cell[$this->row][$this->col]['maxs'] < $this->cell[$this->row][$this->col]['s']) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + $this->cell[$this->row][$this->col]['s'] = 0 ;// reset + } + // Cannot set block properties inside table - use Bold to indicate h1-h6 + if ($tag == 'CENTER' && $this->tdbegin) { $this->cell[$this->row][$this->col]['a'] = $align['center']; } + + $this->InlineProperties['BLOCKINTABLE'] = $this->saveInlineProperties(); + $properties = $this->cssmgr->MergeCSS('',$tag,$attr); + if (!empty($properties)) $this->setCSS($properties,'INLINE'); + + + break; + } +/*-- END TABLES --*/ + + if ($tag == 'P' || $tag == 'DT' || $tag == 'DD') { $this->lastoptionaltag = $tag; } // Save current HTML specified optional endtag + else { $this->lastoptionaltag = ''; } + + if ($this->lastblocklevelchange == 1) { $blockstate = 1; } // Top margins/padding only + else if ($this->lastblocklevelchange < 1) { $blockstate = 0; } // NO margins/padding + $this->printbuffer($this->textbuffer,$blockstate); + $this->textbuffer=array(); + + $save_blklvl = $this->blklvl; + $save_blk = $this->blk; + $save_silp = $this->saveInlineProperties(); + $save_spanlvl = $this->spanlvl; + $save_ilp = $this->InlineProperties; + + $this->blklvl++; + + $currblk =& $this->blk[$this->blklvl]; + $this->initialiseBlock($currblk); + $prevblk =& $this->blk[$this->blklvl-1]; + + $currblk['tag'] = $tag; + $currblk['attr'] = $attr; + + $this->Reset(); + $properties = $this->cssmgr->MergeCSS('BLOCK',$tag,$attr); + $pagesel = ''; +/*-- CSS-PAGE --*/ + + if (isset($properties['PAGE'])) { $pagesel = $properties['PAGE']; } +/*-- END CSS-PAGE --*/ + + // If page-box has changed AND/OR PAGE-BREAK-BEFORE + $save_cols = false; + if (($pagesel && $pagesel != $this->page_box['current']) || (isset($properties['PAGE-BREAK-BEFORE']) && $properties['PAGE-BREAK-BEFORE'])) { + if ($this->blklvl>1) { + // Close any open block tags + for ($b= $this->blklvl;$b>0;$b--) { $this->CloseTag($this->blk[$b]['tag']); } + // Output any text left in buffer + if (count($this->textbuffer)) { $this->printbuffer($this->textbuffer); $this->textbuffer=array(); } + } +/*-- COLUMNS --*/ + if ($this->ColActive) { + $save_cols = true; + $save_nbcol = $this->NbCol; // other values of gap and vAlign will not change by setting Columns off + $this->SetColumns(0); + } +/*-- END COLUMNS --*/ + + + // Must Add new page if changed page properties + if (isset($properties['PAGE-BREAK-BEFORE'])) { + if (strtoupper($properties['PAGE-BREAK-BEFORE']) == 'RIGHT') { $this->AddPage($this->CurOrientation,'NEXT-ODD','','','','','', '','', '','','','','','',0,0,0,0,$pagesel); } + else if (strtoupper($properties['PAGE-BREAK-BEFORE']) == 'LEFT') { $this->AddPage($this->CurOrientation,'NEXT-EVEN','','','','','', '','', '','','','','','',0,0,0,0,$pagesel); } + else if (strtoupper($properties['PAGE-BREAK-BEFORE']) == 'ALWAYS') { $this->AddPage($this->CurOrientation,'','','','','','', '','', '','','','','','',0,0,0,0,$pagesel); } + else if ($this->page_box['current'] != $pagesel) { $this->AddPage($this->CurOrientation,'','','','','','', '','', '','','','','','',0,0,0,0,$pagesel); } // *CSS-PAGE* + } +/*-- CSS-PAGE --*/ + else if ($pagesel != $this->page_box['current']) { $this->AddPage($this->CurOrientation,'','','','','','', '','', '','','','','','',0,0,0,0,$pagesel); } +/*-- END CSS-PAGE --*/ + + // if using htmlheaders, the headers need to be rewritten when new page + // done by calling WriteHTML() within resethtmlheaders + // so block is reset to 0 - now we need to resurrect it + // As in WriteHTML() initialising + if (!($this->restoreBlockPagebreaks && isset($properties['PAGE-BREAK-BEFORE']) && $properties['PAGE-BREAK-BEFORE'])) { + $this->blklvl = 0; + $this->lastblocklevelchange = 0; + $this->blk = array(); + $this->initialiseBlock($this->blk[0]); + $this->blk[0]['width'] =& $this->pgwidth; + $this->blk[0]['inner_width'] =& $this->pgwidth; + $this->blk[0]['blockContext'] = $this->blockContext; + $properties = $this->cssmgr->MergeCSS('BLOCK','BODY',''); + $this->setCSS($properties,'','BODY'); + $this->blklvl++; + $currblk =& $this->blk[$this->blklvl]; + $prevblk =& $this->blk[$this->blklvl-1]; + + $this->initialiseBlock($currblk); + $currblk['tag'] = $tag; + $currblk['attr'] = $attr; + + $this->Reset(); + $properties = $this->cssmgr->MergeCSS('BLOCK',$tag,$attr); + } +/*-- COLUMNS --*/ + if ($save_cols) { + // Restore columns + $this->SetColumns($save_nbcol,$this->colvAlign,$this->ColGap); + } +/*-- END COLUMNS --*/ + if ($this->restoreBlockPagebreaks && isset($properties['PAGE-BREAK-BEFORE']) && $properties['PAGE-BREAK-BEFORE']) { + $this->blk = $save_blk; + // Re-open block tags + $t = $this->blk[0]['tag']; + $a = $this->blk[0]['attr']; + $this->blklvl = 0; + for ($b=0; $b<=$save_blklvl;$b++) { + $tc = $t; + $ac = $a; + $t = $this->blk[$b+1]['tag']; + $a = $this->blk[$b+1]['attr']; + unset($this->blk[$b+1]); + $this->OpenTag($tc,$ac); + } + $this->spanlvl = $save_spanlvl; + $this->InlineProperties = $save_ilp; + $this->restoreInlineProperties($save_silp); + } + } + + if (isset($properties['PAGE-BREAK-INSIDE']) && strtoupper($properties['PAGE-BREAK-INSIDE']) == 'AVOID' && !$this->ColActive && !$this->keep_block_together) { + $currblk['keep_block_together'] = 1; + $this->kt_y00 = $this->y; + $this->kt_p00 = $this->page; + $this->keep_block_together = 1; + $this->divbuffer = array(); + $this->ktLinks = array(); + $this->ktAnnots = array(); + $this->ktForms = array(); + $this->ktBlock = array(); + $this->ktReference = array(); + $this->ktBMoutlines = array(); + $this->_kttoc = array(); + } + if ($lastbottommargin && isset($properties['MARGIN-TOP']) && $properties['MARGIN-TOP'] && empty($properties['FLOAT'])) { $currblk['lastbottommargin'] = $lastbottommargin; } + + // mPDF 5.6.01 - LAYERS + if (isset($properties['Z-INDEX']) && $this->currentlayer==0) { + $v = intval($properties['Z-INDEX']); + if ($v > 0) { + $currblk['z-index'] = $v; + $this->BeginLayer($v); + } + } + + $this->setCSS($properties,'BLOCK',$tag); //name(id/class/style) found in the CSS array! + $currblk['InlineProperties'] = $this->saveInlineProperties(); + + if (isset($properties['VISIBILITY'])) { + $v = strtolower($properties['VISIBILITY']); + if (($v == 'hidden' || $v == 'printonly' || $v == 'screenonly') && $this->visibility=='visible' && !$this->tableLevel) { + $currblk['visibility'] = $v; + $this->SetVisibility($v); + } + } + + if(isset($attr['DIR']) && $attr['DIR']) { $currblk['direction'] = strtolower($attr['DIR']); } + if(isset($attr['ALIGN']) && $attr['ALIGN']) { $currblk['block-align'] = $align[strtolower($attr['ALIGN'])]; } + + if (isset($properties['HEIGHT'])) { + $currblk['css_set_height'] = $this->ConvertSize($properties['HEIGHT'],($this->h - $this->tMargin - $this->bMargin),$this->FontSize,false); + if (($currblk['css_set_height'] + $this->y) > $this->PageBreakTrigger && $this->y > $this->tMargin+5 && $currblk['css_set_height'] < ($this->h - ($this->tMargin + $this->bMargin))) { $this->AddPage($this->CurOrientation); } + } + else { $currblk['css_set_height'] = false; } + + + // Added mPDF 3.0 Float DIV + if (isset($prevblk['blockContext'])) { $currblk['blockContext'] = $prevblk['blockContext'] ; } // *CSS-FLOAT* + + if (isset($properties['CLEAR'])) { $this->ClearFloats(strtoupper($properties['CLEAR']), $this->blklvl-1); } // *CSS-FLOAT* + + $container_w = $prevblk['inner_width']; + $bdr = $currblk['border_right']['w']; + $bdl = $currblk['border_left']['w']; + $pdr = $currblk['padding_right']; + $pdl = $currblk['padding_left']; + + if (isset($currblk['css_set_width'])) { $setwidth = $currblk['css_set_width']; } + else { $setwidth = 0; } + +/*-- CSS-FLOAT --*/ + if (isset($properties['FLOAT']) && strtoupper($properties['FLOAT']) == 'RIGHT' && !$this->ColActive) { + // Cancel Keep-Block-together + $currblk['keep_block_together'] = false; + $this->kt_y00 = ''; + $this->keep_block_together = 0; + + $this->blockContext++; + $currblk['blockContext'] = $this->blockContext; + + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl-1); + + // DIV is too narrow for text to fit! + $maxw = $container_w - $l_width - $r_width; + if (($setwidth + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) > $maxw || ($maxw - ($currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr)) < (2*$this->GetCharWidth('W',false))) { + // Too narrow to fit - try to move down past L or R float + if ($l_max < $r_max && ($setwidth + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) <= ($container_w - $r_width) && (($container_w - $r_width) - ($currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr)) > (2*$this->GetCharWidth('W',false))) { + $this->ClearFloats('LEFT', $this->blklvl-1); + } + else if ($r_max < $l_max && ($setwidth + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) <= ($container_w - $l_width) && (($container_w - $l_width) - ($currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr)) > (2*$this->GetCharWidth('W',false))) { + $this->ClearFloats('RIGHT', $this->blklvl-1); + } + else { $this->ClearFloats('BOTH', $this->blklvl-1); } + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl-1); + } + + if ($r_exists) { $currblk['margin_right'] += $r_width; } + + $currblk['float'] = 'R'; + $currblk['float_start_y'] = $this->y; + if ($currblk['css_set_width']) { + $currblk['margin_left'] = $container_w - ($setwidth + $bdl + $pdl + $bdr + $pdr + $currblk['margin_right']); + $currblk['float_width'] = ($setwidth + $bdl + $pdl + $bdr + $pdr + $currblk['margin_right']); + } + else { + // *** If no width set - would need to buffer and keep track of max width, then Right-align if not full width + // and do borders and backgrounds - For now - just set to maximum width left + + if ($l_exists) { $currblk['margin_left'] += $l_width; } + $currblk['css_set_width'] = $container_w - ($currblk['margin_left'] + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr); + + $currblk['float_width'] = ($currblk['css_set_width'] + $bdl + $pdl + $bdr + $pdr + $currblk['margin_right']); + } + } + else if (isset($properties['FLOAT']) && strtoupper($properties['FLOAT']) == 'LEFT' && !$this->ColActive) { + // Cancel Keep-Block-together + $currblk['keep_block_together'] = false; + $this->kt_y00 = ''; + $this->keep_block_together = 0; + + $this->blockContext++; + $currblk['blockContext'] = $this->blockContext; + + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl-1); + + // DIV is too narrow for text to fit! + $maxw = $container_w - $l_width - $r_width; + if (($setwidth + $currblk['margin_left'] + $bdl + $pdl + $bdr + $pdr) > $maxw || ($maxw - ($currblk['margin_left'] + $bdl + $pdl + $bdr + $pdr)) < (2*$this->GetCharWidth('W',false))) { + // Too narrow to fit - try to move down past L or R float + if ($l_max < $r_max && ($setwidth + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) <= ($container_w - $r_width) && (($container_w - $r_width) - ($currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr)) > (2*$this->GetCharWidth('W',false))) { + $this->ClearFloats('LEFT', $this->blklvl-1); + } + else if ($r_max < $l_max && ($setwidth + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) <= ($container_w - $l_width) && (($container_w - $l_width) - ($currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr)) > (2*$this->GetCharWidth('W',false))) { + $this->ClearFloats('RIGHT', $this->blklvl-1); + } + else { $this->ClearFloats('BOTH', $this->blklvl-1); } + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl-1); + } + + if ($l_exists) { $currblk['margin_left'] += $l_width; } + + $currblk['float'] = 'L'; + $currblk['float_start_y'] = $this->y; + if ($setwidth) { + $currblk['margin_right'] = $container_w - ($setwidth + $bdl + $pdl + $bdr + $pdr + $currblk['margin_left']); + $currblk['float_width'] = ($setwidth + $bdl + $pdl + $bdr + $pdr + $currblk['margin_left']); + } + else { + // *** If no width set - would need to buffer and keep track of max width, then Right-align if not full width + // and do borders and backgrounds - For now - just set to maximum width left + + if ($r_exists) { $currblk['margin_right'] += $r_width; } + $currblk['css_set_width'] = $container_w - ($currblk['margin_left'] + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr); + + $currblk['float_width'] = ($currblk['css_set_width'] + $bdl + $pdl + $bdr + $pdr + $currblk['margin_left']); + } + } + + else { + // Don't allow overlap - if floats present - adjust padding to avoid overlap with Floats + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl-1); + $maxw = $container_w - $l_width - $r_width; + if (($setwidth + $currblk['margin_left'] + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) > $maxw || ($maxw - ($currblk['margin_right'] + $currblk['margin_left'] + $bdl + $pdl + $bdr + $pdr)) < (2*$this->GetCharWidth('W',false))) { + // Too narrow to fit - try to move down past L or R float + if ($l_max < $r_max && ($setwidth + $currblk['margin_left'] + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) <= ($container_w - $r_width) && (($container_w - $r_width) - ($currblk['margin_right'] + $currblk['margin_left'] + $bdl + $pdl + $bdr + $pdr)) > (2*$this->GetCharWidth('W',false))) { + $this->ClearFloats('LEFT', $this->blklvl-1); + } + else if ($r_max < $l_max && ($setwidth + $currblk['margin_left'] + $currblk['margin_right'] + $bdl + $pdl + $bdr + $pdr) <= ($container_w - $l_width) && (($container_w - $l_width) - ($currblk['margin_right'] + $currblk['margin_left'] + $bdl + $pdl + $bdr + $pdr)) > (2*$this->GetCharWidth('W',false))) { + $this->ClearFloats('RIGHT', $this->blklvl-1); + } + else { $this->ClearFloats('BOTH', $this->blklvl-1); } + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl-1); + } + if ($r_exists) { $currblk['padding_right'] = max(($r_width-$currblk['margin_right']-$bdr), $pdr); } + if ($l_exists) { $currblk['padding_left'] = max(($l_width-$currblk['margin_left']-$bdl), $pdl); } + } +/*-- END CSS-FLOAT --*/ + + +/*-- BORDER-RADIUS --*/ + // Automatically increase padding if required for border-radius + if ($this->autoPadding && !$this->ColActive && !$this->keep_block_together) { + if ($currblk['border_radius_TL_H']>$currblk['padding_left'] && $currblk['border_radius_TL_V']>$currblk['padding_top']) { + if ($currblk['border_radius_TL_H']>$currblk['border_radius_TL_V']) { + $this->_borderPadding($currblk['border_radius_TL_H'],$currblk['border_radius_TL_V'], $currblk['padding_left'], $currblk['padding_top']); + } + else { + $this->_borderPadding($currblk['border_radius_TL_V'],$currblk['border_radius_TL_H'], $currblk['padding_top'], $currblk['padding_left']); + } + } + if ($currblk['border_radius_TR_H']>$currblk['padding_right'] && $currblk['border_radius_TR_V']>$currblk['padding_top']) { + if ($currblk['border_radius_TR_H']>$currblk['border_radius_TR_V']) { + $this->_borderPadding($currblk['border_radius_TR_H'],$currblk['border_radius_TR_V'], $currblk['padding_right'], $currblk['padding_top']); + } + else { + $this->_borderPadding($currblk['border_radius_TR_V'],$currblk['border_radius_TR_H'], $currblk['padding_top'], $currblk['padding_right']); + } + } + if ($currblk['border_radius_BL_H']>$currblk['padding_left'] && $currblk['border_radius_BL_V']>$currblk['padding_bottom']) { + if ($currblk['border_radius_BL_H']>$currblk['border_radius_BL_V']) { + $this->_borderPadding($currblk['border_radius_BL_H'],$currblk['border_radius_BL_V'], $currblk['padding_left'], $currblk['padding_bottom']); + } + else { + $this->_borderPadding($currblk['border_radius_BL_V'],$currblk['border_radius_BL_H'], $currblk['padding_bottom'], $currblk['padding_left']); + } + } + if ($currblk['border_radius_BR_H']>$currblk['padding_right'] && $currblk['border_radius_BR_V']>$currblk['padding_bottom']) { + if ($currblk['border_radius_BR_H']>$currblk['border_radius_BR_V']) { + $this->_borderPadding($currblk['border_radius_BR_H'],$currblk['border_radius_BR_V'], $currblk['padding_right'], $currblk['padding_bottom']); + } + else { + $this->_borderPadding($currblk['border_radius_BR_V'],$currblk['border_radius_BR_H'], $currblk['padding_bottom'], $currblk['padding_right']); + } + } + } +/*-- END BORDER-RADIUS --*/ + + + // Hanging indent - if negative indent: ensure padding is >= indent + if(!isset($currblk['text_indent'])) { $currblk['text_indent'] = null; } + if(!isset($currblk['inner_width'])) { $currblk['inner_width'] = null; } + $cbti = $this->ConvertSize($currblk['text_indent'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + if ($cbti < 0) { + $hangind = -($cbti); + if ($currblk['direction'] == 'rtl') { // *RTL* + $currblk['padding_right'] = max($currblk['padding_right'],$hangind); // *RTL* + } // *RTL* + else { // *RTL* + $currblk['padding_left'] = max($currblk['padding_left'],$hangind); + } // *RTL* + } + + if (isset($currblk['css_set_width'])) { + if (isset($properties['MARGIN-LEFT']) && isset($properties['MARGIN-RIGHT']) && strtolower($properties['MARGIN-LEFT'])=='auto' && strtolower($properties['MARGIN-RIGHT'])=='auto') { + // Try to reduce margins to accomodate - if still too wide, set margin-right/left=0 (reduces width) + $anyextra = $prevblk['inner_width'] - ($currblk['css_set_width'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right']); + if ($anyextra>0) { + $currblk['margin_left'] = $currblk['margin_right'] = $anyextra /2; + } + else { + $currblk['margin_left'] = $currblk['margin_right'] = 0; + } + } + else if (isset($properties['MARGIN-LEFT']) && strtolower($properties['MARGIN-LEFT'])=='auto') { + // Try to reduce margin-left to accomodate - if still too wide, set margin-left=0 (reduces width) + $currblk['margin_left'] = $prevblk['inner_width'] - ($currblk['css_set_width'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right'] + $currblk['margin_right']); + if ($currblk['margin_left'] < 0) { + $currblk['margin_left'] = 0; + } + } + else if (isset($properties['MARGIN-RIGHT']) && strtolower($properties['MARGIN-RIGHT'])=='auto') { + // Try to reduce margin-right to accomodate - if still too wide, set margin-right=0 (reduces width) + $currblk['margin_right'] = $prevblk['inner_width'] - ($currblk['css_set_width'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right'] + $currblk['margin_left']); + if ($currblk['margin_right'] < 0) { + $currblk['margin_right'] = 0; + } + } + else { + if ($currblk['direction'] == 'rtl') { // *RTL* + // Try to reduce margin-left to accomodate - if still too wide, set margin-left=0 (reduces width) + $currblk['margin_left'] = $prevblk['inner_width'] - ($currblk['css_set_width'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right'] + $currblk['margin_right']); // *RTL* + if ($currblk['margin_left'] < 0) { // *RTL* + $currblk['margin_left'] = 0; // *RTL* + } // *RTL* + } // *RTL* + else { // *RTL* + // Try to reduce margin-right to accomodate - if still too wide, set margin-right=0 (reduces width) + $currblk['margin_right'] = $prevblk['inner_width'] - ($currblk['css_set_width'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right'] + $currblk['margin_left']); + if ($currblk['margin_right'] < 0) { + $currblk['margin_right'] = 0; + } + } // *RTL* + } + } + + $currblk['outer_left_margin'] = $prevblk['outer_left_margin'] + $currblk['margin_left'] + $prevblk['border_left']['w'] + $prevblk['padding_left']; + $currblk['outer_right_margin'] = $prevblk['outer_right_margin'] + $currblk['margin_right'] + $prevblk['border_right']['w'] + $prevblk['padding_right']; + + $currblk['width'] = $this->pgwidth - ($currblk['outer_right_margin'] + $currblk['outer_left_margin']); + $currblk['inner_width'] = $currblk['width'] - ($currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right']); + + // Check DIV is not now too narrow to fit text + $mw = 2*$this->GetCharWidth('W',false); + if ($currblk['inner_width'] < $mw) { + $currblk['padding_left'] = 0; + $currblk['padding_right'] = 0; + $currblk['border_left']['w'] = 0.2; + $currblk['border_right']['w'] = 0.2; + $currblk['margin_left'] = 0; + $currblk['margin_right'] = 0; + $currblk['outer_left_margin'] = $prevblk['outer_left_margin'] + $currblk['margin_left'] + $prevblk['border_left']['w'] + $prevblk['padding_left']; + $currblk['outer_right_margin'] = $prevblk['outer_right_margin'] + $currblk['margin_right'] + $prevblk['border_right']['w'] + $prevblk['padding_right']; + $currblk['width'] = $this->pgwidth - ($currblk['outer_right_margin'] + $currblk['outer_left_margin']); + $currblk['inner_width'] = $this->pgwidth - ($currblk['outer_right_margin'] + $currblk['outer_left_margin'] + $currblk['border_left']['w'] + $currblk['padding_left'] + $currblk['border_right']['w'] + $currblk['padding_right']); +// if ($currblk['inner_width'] < $mw) { $this->Error("DIV is too narrow for text to fit!"); } + } + + $this->x = $this->lMargin + $currblk['outer_left_margin']; + +/*-- BACKGROUNDS --*/ + if (isset($properties['BACKGROUND-IMAGE']) && $properties['BACKGROUND-IMAGE'] && !$this->kwt && !$this->ColActive && !$this->keep_block_together) { + $ret = $this->SetBackground($properties, $currblk['inner_width']); + if ($ret) { $currblk['background-image'] = $ret; } + } +/*-- END BACKGROUNDS --*/ + +/*-- TABLES --*/ + if ($this->use_kwt && isset($attr['KEEP-WITH-TABLE']) && !$this->ColActive && !$this->keep_block_together) { + $this->kwt = true; + $this->kwt_y0 = $this->y; + $this->kwt_x0 = $this->x; + $this->kwt_height = 0; + $this->kwt_buffer = array(); + $this->kwt_Links = array(); + $this->kwt_Annots = array(); + $this->kwt_moved = false; + $this->kwt_saved = false; + $this->kwt_Reference = array(); + $this->kwt_BMoutlines = array(); + $this->kwt_toc = array(); + } + else { +/*-- END TABLES --*/ + $this->kwt = false; + } // *TABLES* + + //Save x,y coords in case we need to print borders... + $currblk['y0'] = $this->y; + $currblk['x0'] = $this->x; + $currblk['startpage'] = $this->page; + $this->oldy = $this->y; + + $this->lastblocklevelchange = 1 ; + + break; + + case 'HR': + // Added mPDF 3.0 Float DIV - CLEAR + if (isset($attr['STYLE'])) { + $properties = $this->cssmgr->readInlineCSS($attr['STYLE']); + if (isset($properties['CLEAR'])) { $this->ClearFloats(strtoupper($properties['CLEAR']),$this->blklvl); } // *CSS-FLOAT* + } + + $this->ignorefollowingspaces = true; + + $objattr = array(); + $objattr['margin_top'] = 0; + $objattr['margin_bottom'] = 0; + $objattr['margin_left'] = 0; + $objattr['margin_right'] = 0; + $objattr['width'] = 0; + $objattr['height'] = 0; + $objattr['border_top']['w'] = 0; + $objattr['border_bottom']['w'] = 0; + $objattr['border_left']['w'] = 0; + $objattr['border_right']['w'] = 0; + $properties = $this->cssmgr->MergeCSS('',$tag,$attr); + if (isset($properties['MARGIN-TOP'])) { $objattr['margin_top'] = $this->ConvertSize($properties['MARGIN-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-BOTTOM'])) { $objattr['margin_bottom'] = $this->ConvertSize($properties['MARGIN-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['WIDTH'])) { $objattr['width'] = $this->ConvertSize($properties['WIDTH'],$this->blk[$this->blklvl]['inner_width']); } + else if(isset($attr['WIDTH']) && $attr['WIDTH'] != '') $objattr['width'] = $this->ConvertSize($attr['WIDTH'],$this->blk[$this->blklvl]['inner_width']); + if (isset($properties['TEXT-ALIGN'])) { $objattr['align'] = $align[strtolower($properties['TEXT-ALIGN'])]; } + else if(isset($attr['ALIGN']) && $attr['ALIGN'] != '') $objattr['align'] = $align[strtolower($attr['ALIGN'])]; + + if (isset($properties['MARGIN-LEFT']) && strtolower($properties['MARGIN-LEFT'])=='auto') { + $objattr['align'] = 'R'; + } + if (isset($properties['MARGIN-RIGHT']) && strtolower($properties['MARGIN-RIGHT'])=='auto') { + $objattr['align'] = 'L'; + if (isset($properties['MARGIN-RIGHT']) && strtolower($properties['MARGIN-RIGHT'])=='auto' && isset($properties['MARGIN-LEFT']) && strtolower($properties['MARGIN-LEFT'])=='auto') { + $objattr['align'] = 'C'; + } + } + if (isset($properties['COLOR'])) { $objattr['color'] = $this->ConvertColor($properties['COLOR']); } + else if(isset($attr['COLOR']) && $attr['COLOR'] != '') $objattr['color'] = $this->ConvertColor($attr['COLOR']); + if (isset($properties['HEIGHT'])) { $objattr['linewidth'] = $this->ConvertSize($properties['HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + + +/*-- TABLES --*/ + if ($this->tableLevel) { + $objattr['W-PERCENT'] = 100; + if (isset($properties['WIDTH']) && stristr($properties['WIDTH'],'%')) { + $properties['WIDTH'] += 0; //make "90%" become simply "90" + $objattr['W-PERCENT'] = $properties['WIDTH']; + } + if (isset($attr['WIDTH']) && stristr($attr['WIDTH'],'%')) { + $attr['WIDTH'] += 0; //make "90%" become simply "90" + $objattr['W-PERCENT'] = $attr['WIDTH']; + } + } +/*-- END TABLES --*/ + + $objattr['type'] = 'hr'; + $objattr['height'] = $objattr['linewidth'] + $objattr['margin_top'] + $objattr['margin_bottom']; + $e = "\xbb\xa4\xactype=image,objattr=".serialize($objattr)."\xbb\xa4\xac"; + + // Clear properties - tidy up + $properties = array(); + +/*-- TABLES --*/ + // Output it to buffers + if ($this->tableLevel) { + if (!isset($this->cell[$this->row][$this->col]['maxs'])) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + elseif($this->cell[$this->row][$this->col]['maxs'] < $this->cell[$this->row][$this->col]['s']) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + $this->cell[$this->row][$this->col]['s'] = 0 ;// reset + $this->_saveCellTextBuffer($e, $this->HREF); + } + else { +/*-- END TABLES --*/ + $this->_saveTextBuffer($e, $this->HREF); + } // *TABLES* + + break; + + +/*-- BARCODES --*/ + + case 'BARCODE': + if(isset($attr['CODE']) && $attr['CODE']) { + $objattr = array(); + $objattr['margin_top'] = 0; + $objattr['margin_bottom'] = 0; + $objattr['margin_left'] = 0; + $objattr['margin_right'] = 0; + $objattr['padding_top'] = 0; + $objattr['padding_bottom'] = 0; + $objattr['padding_left'] = 0; + $objattr['padding_right'] = 0; + $objattr['width'] = 0; + $objattr['height'] = 0; + $objattr['border_top']['w'] = 0; + $objattr['border_bottom']['w'] = 0; + $objattr['border_left']['w'] = 0; + $objattr['border_right']['w'] = 0; + $objattr['code'] = $attr['CODE']; + + if(isset($attr['TYPE'])) { + $objattr['btype'] = trim(strtoupper($attr['TYPE'])); + } + else { $objattr['btype'] = 'EAN13'; } // default + if (preg_match('/^(EAN13|ISBN|ISSN|EAN8|UPCA|UPCE)P([25])$/',$objattr['btype'],$m)) { + $objattr['btype'] = $m[1]; + $objattr['bsupp'] = $m[2]; + if (preg_match('/^(\S+)\s+(.*)$/',$objattr['code'],$mm)) { + $objattr['code'] = $mm[1]; + $objattr['bsupp_code'] = $mm[2]; + } + } + else { $objattr['bsupp'] = 0; } + + if(isset($attr['TEXT']) && $attr['TEXT']==1) { $objattr['showtext'] = 1; } + else { $objattr['showtext'] = 0; } + if(isset($attr['SIZE']) && $attr['SIZE']>0) { $objattr['bsize'] = $attr['SIZE']; } + else { $objattr['bsize'] = 1; } + if(isset($attr['HEIGHT']) && $attr['HEIGHT']>0) { $objattr['bheight'] = $attr['HEIGHT']; } + else { $objattr['bheight'] = 1; } + if(isset($attr['PR']) && $attr['PR']>0) { $objattr['pr_ratio'] = $attr['PR']; } + else { $objattr['pr_ratio'] = ''; } + $properties = $this->cssmgr->MergeCSS('',$tag,$attr); + if(isset($properties ['DISPLAY']) && strtolower($properties ['DISPLAY'])=='none') { + return; + } + if (isset($properties['MARGIN-TOP'])) { $objattr['margin_top']=$this->ConvertSize($properties['MARGIN-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-BOTTOM'])) { $objattr['margin_bottom'] = $this->ConvertSize($properties['MARGIN-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-LEFT'])) { $objattr['margin_left'] = $this->ConvertSize($properties['MARGIN-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-RIGHT'])) { $objattr['margin_right'] = $this->ConvertSize($properties['MARGIN-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + + if (isset($properties['PADDING-TOP'])) { $objattr['padding_top']=$this->ConvertSize($properties['PADDING-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-BOTTOM'])) { $objattr['padding_bottom'] = $this->ConvertSize($properties['PADDING-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-LEFT'])) { $objattr['padding_left'] = $this->ConvertSize($properties['PADDING-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-RIGHT'])) { $objattr['padding_right'] = $this->ConvertSize($properties['PADDING-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + + if (isset($properties['BORDER-TOP'])) { $objattr['border_top'] = $this->border_details($properties['BORDER-TOP']); } + if (isset($properties['BORDER-BOTTOM'])) { $objattr['border_bottom'] = $this->border_details($properties['BORDER-BOTTOM']); } + if (isset($properties['BORDER-LEFT'])) { $objattr['border_left'] = $this->border_details($properties['BORDER-LEFT']); } + if (isset($properties['BORDER-RIGHT'])) { $objattr['border_right'] = $this->border_details($properties['BORDER-RIGHT']); } + + if (isset($properties['VERTICAL-ALIGN'])) { $objattr['vertical-align'] = $align[strtolower($properties['VERTICAL-ALIGN'])]; } + if (isset($properties['COLOR']) && $properties['COLOR'] != '') { $objattr['color'] = $this->ConvertColor($properties['COLOR']); } + else { $objattr['color'] = false; } + if (isset($properties['BACKGROUND-COLOR']) && $properties['BACKGROUND-COLOR'] != '') { $objattr['bgcolor'] = $this->ConvertColor($properties['BACKGROUND-COLOR']); } + else { $objattr['bgcolor'] = false; } + + if (!class_exists('PDFBarcode', false)) { + include(_MPDF_PATH.'classes/barcode.php'); + } + $this->barcode = new PDFBarcode(); + + if ($objattr['btype'] == 'EAN13' || $objattr['btype'] == 'ISBN' || $objattr['btype'] == 'ISSN' || $objattr['btype'] == 'UPCA' || $objattr['btype'] == 'UPCE' || $objattr['btype'] == 'EAN8') { + $code = preg_replace('/\-/','',$objattr['code']); + if ($objattr['btype'] == 'ISSN' || $objattr['btype'] == 'ISBN') { + $arrcode = $this->barcode->getBarcodeArray($code, 'EAN13'); + } + else { $arrcode = $this->barcode->getBarcodeArray($code, $objattr['btype'] ); } + if ($arrcode === false) { $this->Error('Error in barcode string.'); } + + if ($objattr['bsupp'] == 2 || $objattr['bsupp'] == 5) { // EAN-2 or -5 Supplement + $supparrcode = $this->barcode->getBarcodeArray($objattr['bsupp_code'], 'EAN'.$objattr['bsupp'] ); + $w = ($arrcode["maxw"] + $arrcode['lightmL'] + $arrcode['lightmR'] + $supparrcode["maxw"] + $supparrcode['sepM']) * $arrcode['nom-X'] * $objattr['bsize']; + } + else { + $w = ($arrcode["maxw"] + $arrcode['lightmL'] + $arrcode['lightmR']) * $arrcode['nom-X'] * $objattr['bsize']; + } + $h = $arrcode['nom-H'] * $objattr['bsize'] * $objattr['bheight']; + // Add height for ISBN string + margin from top of bars + if (($objattr['showtext'] && $objattr['btype'] == 'EAN13') || $objattr['btype'] == 'ISBN' || $objattr['btype'] == 'ISSN') { + $tisbnm = 1.5 * $objattr['bsize']; // Top margin between TOP TEXT (isbn - if shown) & bars + $isbn_fontsize = 2.1 * $objattr['bsize']; + $h += $isbn_fontsize + $tisbnm ; + } + } + // QR-code + else if ($objattr['btype'] == 'QR') { + $w = $h = $objattr['bsize']*25; // Factor of 25mm (default) + $objattr['errorlevel'] = 'L'; + if (isset($attr['ERROR'])) { $objattr['errorlevel'] = $attr['ERROR']; } + } + else if ($objattr['btype'] == 'IMB' || $objattr['btype'] == 'RM4SCC' || $objattr['btype'] == 'KIX' || $objattr['btype'] == 'POSTNET' || $objattr['btype'] == 'PLANET') { + $arrcode = $this->barcode->getBarcodeArray($objattr['code'], $objattr['btype'] ); + if ($arrcode === false) { $this->Error('Error in barcode string.'); } + $w = ($arrcode["maxw"] * $arrcode['nom-X'] * $objattr['bsize']) + $arrcode['quietL'] + $arrcode['quietR']; + $h = ($arrcode['nom-H'] * $objattr['bsize']) + (2*$arrcode['quietTB']); + } + else if (in_array($objattr['btype'], array('C128A','C128B','C128C','EAN128A','EAN128B','EAN128C','C39','C39+','C39E','C39E+','S25','S25+','I25','I25+','I25B','I25B+','C93','MSI','MSI+','CODABAR','CODE11'))) { + $arrcode = $this->barcode->getBarcodeArray($objattr['code'], $objattr['btype'], $objattr['pr_ratio'] ); + if ($arrcode === false) { $this->Error('Error in barcode string.'); } + $w = ($arrcode["maxw"] + $arrcode['lightmL'] + $arrcode['lightmR']) * $arrcode['nom-X'] * $objattr['bsize']; + $h = ((2*$arrcode['lightTB'] * $arrcode['nom-X']) + $arrcode['nom-H']) * $objattr['bsize'] * $objattr['bheight']; + } + else { break; } + + $extraheight = $objattr['padding_top'] + $objattr['padding_bottom'] + $objattr['margin_top'] + $objattr['margin_bottom'] + $objattr['border_top']['w'] + $objattr['border_bottom']['w']; + $extrawidth = $objattr['padding_left'] + $objattr['padding_right'] + $objattr['margin_left'] + $objattr['margin_right'] + $objattr['border_left']['w'] + $objattr['border_right']['w']; + + $objattr['type'] = 'barcode'; + $objattr['height'] = $h + $extraheight; + $objattr['width'] = $w + $extrawidth; + $objattr['barcode_height'] = $h; + $objattr['barcode_width'] = $w; +/*-- CSS-IMAGE-FLOAT --*/ + if (!$this->ColActive && !$this->tableLevel && !$this->listlvl && !$this->kwt && !$this->keep_block_together) { + if (isset($properties['FLOAT']) && (strtoupper($properties['FLOAT']) == 'RIGHT' || strtoupper($properties['FLOAT']) == 'LEFT')) { + $objattr['float'] = substr(strtoupper($properties['FLOAT']),0,1); + } + } +/*-- END CSS-IMAGE-FLOAT --*/ + + $e = "\xbb\xa4\xactype=barcode,objattr=".serialize($objattr)."\xbb\xa4\xac"; + + // Clear properties - tidy up + $properties = array(); + +/*-- TABLES --*/ + // Output it to buffers + if ($this->tableLevel) { + $this->_saveCellTextBuffer($e, $this->HREF); + $this->cell[$this->row][$this->col]['s'] += $objattr['width'] ; + } + else { +/*-- END TABLES --*/ + $this->_saveTextBuffer($e, $this->HREF); + + } // *TABLES* + } + break; +/*-- END BARCODES --*/ + + + // *********** FORM ELEMENTS ******************** + +/*-- FORMS --*/ + case 'SELECT': + $this->lastoptionaltag = ''; // Save current HTML specified optional endtag + $this->InlineProperties[$tag] = $this->saveInlineProperties(); + $properties = $this->cssmgr->MergeCSS('',$tag,$attr); + if (isset($properties['FONT-FAMILY'])) { + $this->SetFont($properties['FONT-FAMILY'],$this->FontStyle,0,false); + } + if (isset($properties['FONT-SIZE'])) { + $mmsize = $this->ConvertSize($properties['FONT-SIZE'],$this->default_font_size/_MPDFK); + $this->SetFontSize($mmsize*_MPDFK,false); + } + if (isset($attr['SPELLCHECK']) && strtolower($attr['SPELLCHECK'])=='true') { + $this->selectoption['SPELLCHECK'] = true; + } + + if (isset($properties['COLOR'])) { $this->selectoption['COLOR'] = $this->ConvertColor($properties['COLOR']); } + $this->specialcontent = "type=select"; + if(isset($attr['DISABLED'])) { $this->selectoption['DISABLED'] = $attr['DISABLED']; } + if(isset($attr['READONLY'])) { $this->selectoption['READONLY'] = $attr['READONLY']; } + if(isset($attr['REQUIRED'])) { $this->selectoption['REQUIRED'] = $attr['REQUIRED']; } + if(isset($attr['EDITABLE'])) { $this->selectoption['EDITABLE'] = $attr['EDITABLE']; } + if(isset($attr['TITLE'])) { $this->selectoption['TITLE'] = $attr['TITLE']; } + if(isset($attr['MULTIPLE'])) { $this->selectoption['MULTIPLE'] = $attr['MULTIPLE']; } + if(isset($attr['SIZE']) && $attr['SIZE']>1) { $this->selectoption['SIZE'] = $attr['SIZE']; } + if ($this->useActiveForms) { + if(isset($attr['NAME'])) { $this->selectoption['NAME'] = $attr['NAME']; } + if (isset($attr['ONCHANGE'])) { $this->selectoption['ONCHANGE'] = $attr['ONCHANGE']; } + } + + $properties = array(); + break; + + case 'OPTION': + $this->lastoptionaltag = 'OPTION'; // Save current HTML specified optional endtag + $this->selectoption['ACTIVE'] = true; + $this->selectoption['currentSEL'] = false; + if (empty($this->selectoption)) { + $this->selectoption['MAXWIDTH'] = ''; + $this->selectoption['SELECTED'] = ''; + } + if (isset($attr['SELECTED'])) { + $this->selectoption['SELECTED'] = ''; + $this->selectoption['currentSEL'] = true; + } + if(isset($attr['VALUE'])) { + $attr['VALUE'] = strcode2utf($attr['VALUE']); + $attr['VALUE'] = $this->lesser_entity_decode($attr['VALUE']); + if ($this->onlyCoreFonts) + $attr['VALUE'] = mb_convert_encoding($attr['VALUE'], $this->mb_enc,'UTF-8'); + } + $this->selectoption['currentVAL'] = $attr['VALUE']; + break; + + case 'TEXTAREA': + $objattr = array(); + $objattr['margin_top'] = 0; + $objattr['margin_bottom'] = 0; + $objattr['margin_left'] = 0; + $objattr['margin_right'] = 0; + $objattr['width'] = 0; + $objattr['height'] = 0; + $objattr['border_top']['w'] = 0; + $objattr['border_bottom']['w'] = 0; + $objattr['border_left']['w'] = 0; + $objattr['border_right']['w'] = 0; + if(isset($attr['DISABLED'])) { $objattr['disabled'] = true; } + if(isset($attr['READONLY'])) { $objattr['readonly'] = true; } + if(isset($attr['REQUIRED'])) { $objattr['required'] = true; } + if(isset($attr['SPELLCHECK']) && strtolower($attr['SPELLCHECK'])=='true') { $objattr['spellcheck'] = true; } + if(isset($attr['TITLE'])) { $objattr['title'] = $attr['TITLE']; } + if ($this->onlyCoreFonts) + $objattr['title'] = mb_convert_encoding($objattr['title'], $this->mb_enc,'UTF-8'); + if ($this->useActiveForms) { + if(isset($attr['NAME'])) { $objattr['fieldname'] = $attr['NAME']; } + $this->form->form_element_spacing['textarea']['outer']['v'] = 0; + $this->form->form_element_spacing['textarea']['inner']['v'] = 0; + if (isset($attr['ONCALCULATE'])) { $objattr['onCalculate'] = $attr['ONCALCULATE']; } + else if (isset($attr['ONCHANGE'])) { $objattr['onCalculate'] = $attr['ONCHANGE']; } + if (isset($attr['ONVALIDATE'])) { $objattr['onValidate'] = $attr['ONVALIDATE']; } + if (isset($attr['ONKEYSTROKE'])) { $objattr['onKeystroke'] = $attr['ONKEYSTROKE']; } + if (isset($attr['ONFORMAT'])) { $objattr['onFormat'] = $attr['ONFORMAT']; } + } + $this->InlineProperties[$tag] = $this->saveInlineProperties(); + $properties = $this->cssmgr->MergeCSS('',$tag,$attr); + if (isset($properties['FONT-FAMILY'])) { + $this->SetFont($properties['FONT-FAMILY'],'',0,false); + } + if (isset($properties['FONT-SIZE'])) { + $mmsize = $this->ConvertSize($properties['FONT-SIZE'],$this->default_font_size/_MPDFK); + $this->SetFontSize($mmsize*_MPDFK,false); + } + if (isset($properties['COLOR'])) { $objattr['color'] = $this->ConvertColor($properties['COLOR']); } + $objattr['fontfamily'] = $this->FontFamily; + $objattr['fontsize'] = $this->FontSizePt; + if ($this->useActiveForms) { + if(isset($properties['TEXT-ALIGN'])) { $objattr['text_align'] = $align[strtolower($properties['TEXT-ALIGN'])]; } + else if(isset($attr['ALIGN'])) { $objattr['text_align'] = $align[strtolower($attr['ALIGN'])]; } + if (isset($properties['OVERFLOW']) && strtolower($properties['OVERFLOW'])=='hidden') { $objattr['donotscroll'] = true; } + if (isset($properties['BORDER-TOP-COLOR'])) { $objattr['border-col'] = $this->ConvertColor($properties['BORDER-TOP-COLOR']); } + if (isset($properties['BACKGROUND-COLOR'])) { $objattr['background-col'] = $this->ConvertColor($properties['BACKGROUND-COLOR']); } + } + $this->SetLineHeight('',$this->form->textarea_lineheight); + $formLineHeight = $this->lineheight; + + $w = 0; + $h = 0; + if(isset($properties['WIDTH'])) $w = $this->ConvertSize($properties['WIDTH'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + if(isset($properties['HEIGHT'])) $h = $this->ConvertSize($properties['HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + if ($properties['VERTICAL-ALIGN']) { $objattr['vertical-align'] = $align[strtolower($properties['VERTICAL-ALIGN'])]; } + + $colsize = 20; //HTML default value + $rowsize = 2; //HTML default value + if (isset($attr['COLS'])) $colsize = intval($attr['COLS']); + if (isset($attr['ROWS'])) $rowsize = intval($attr['ROWS']); + + $charsize = $this->GetCharWidth('w',false); + if ($w) { $colsize = round(($w-($this->form->form_element_spacing['textarea']['outer']['h']*2)-($this->form->form_element_spacing['textarea']['inner']['h']*2))/$charsize); } + if ($h) { $rowsize = round(($h-($this->form->form_element_spacing['textarea']['outer']['v']*2)-($this->form->form_element_spacing['textarea']['inner']['v']*2))/$formLineHeight); } + + $objattr['type'] = 'textarea'; + $objattr['width'] = ($colsize * $charsize) + ($this->form->form_element_spacing['textarea']['outer']['h']*2)+($this->form->form_element_spacing['textarea']['inner']['h']*2); + $objattr['height'] = ($rowsize * $formLineHeight) + ($this->form->form_element_spacing['textarea']['outer']['v']*2)+($this->form->form_element_spacing['textarea']['inner']['v']*2); + $objattr['rows'] = $rowsize; + $objattr['cols'] = $colsize; + + $this->specialcontent = serialize($objattr); + + if ($this->tableLevel) { // *TABLES* + $this->cell[$this->row][$this->col]['s'] += $objattr['width'] ; // *TABLES* + } // *TABLES* + + // Clear properties - tidy up + $properties = array(); + break; + + + + // *********** FORM - INPUT ******************** + + case 'INPUT': + if (!isset($attr['TYPE'])) $attr['TYPE'] == 'TEXT'; + $objattr = array(); + $objattr['margin_top'] = 0; + $objattr['margin_bottom'] = 0; + $objattr['margin_left'] = 0; + $objattr['margin_right'] = 0; + $objattr['width'] = 0; + $objattr['height'] = 0; + $objattr['border_top']['w'] = 0; + $objattr['border_bottom']['w'] = 0; + $objattr['border_left']['w'] = 0; + $objattr['border_right']['w'] = 0; + $objattr['type'] = 'input'; + if(isset($attr['DISABLED'])) { $objattr['disabled'] = true; } + if(isset($attr['READONLY'])) { $objattr['readonly'] = true; } + if(isset($attr['REQUIRED'])) { $objattr['required'] = true; } + if(isset($attr['SPELLCHECK']) && strtolower($attr['SPELLCHECK'])=='true') { $objattr['spellcheck'] = true; } + if(isset($attr['TITLE'])) { $objattr['title'] = $attr['TITLE']; } + else if(isset($attr['ALT'])) { $objattr['title'] = $attr['ALT']; } + else $objattr['title'] = ''; + $objattr['title'] = strcode2utf($objattr['title']); + $objattr['title'] = $this->lesser_entity_decode($objattr['title']); + if ($this->onlyCoreFonts) + $objattr['title'] = mb_convert_encoding($objattr['title'], $this->mb_enc,'UTF-8'); + if ($this->useActiveForms) { + if(isset($attr['NAME'])) { $objattr['fieldname'] = $attr['NAME']; } + } + if(isset($attr['VALUE'])) { + $attr['VALUE'] = strcode2utf($attr['VALUE']); + $attr['VALUE'] = $this->lesser_entity_decode($attr['VALUE']); + if ($this->onlyCoreFonts) + $attr['VALUE'] = mb_convert_encoding($attr['VALUE'], $this->mb_enc,'UTF-8'); + $objattr['value'] = $attr['VALUE']; + } + + $this->InlineProperties[$tag] = $this->saveInlineProperties(); + $properties = $this->cssmgr->MergeCSS('',$tag,$attr); + $objattr['vertical-align'] = ''; + + if (isset($properties['FONT-FAMILY'])) { + $this->SetFont($properties['FONT-FAMILY'],$this->FontStyle,0,false); + } + if (isset($properties['FONT-SIZE'])) { + $mmsize = $this->ConvertSize($properties['FONT-SIZE'],($this->default_font_size/_MPDFK)); + $this->SetFontSize($mmsize*_MPDFK,false); + } + if (isset($properties['COLOR'])) { $objattr['color'] = $this->ConvertColor($properties['COLOR']); } + $objattr['fontfamily'] = $this->FontFamily; + $objattr['fontsize'] = $this->FontSizePt; + if ($this->useActiveForms) { + if(isset($attr['ALIGN'])) { $objattr['text_align'] = $align[strtolower($attr['ALIGN'])]; } + else if(isset($properties['TEXT-ALIGN'])) { $objattr['text_align'] = $align[strtolower($properties['TEXT-ALIGN'])]; } + if (isset($properties['BORDER-TOP-COLOR'])) { $objattr['border-col'] = $this->ConvertColor($properties['BORDER-TOP-COLOR']); } + if (isset($properties['BACKGROUND-COLOR'])) { $objattr['background-col'] = $this->ConvertColor($properties['BACKGROUND-COLOR']); } + } + + $type = ''; + $texto=''; + $height = $this->FontSize; + $width = 0; + $spacesize = $this->GetCharWidth(' ',false); + + $w = 0; + if(isset($properties['WIDTH'])) $w = $this->ConvertSize($properties['WIDTH'],$this->blk[$this->blklvl]['inner_width']); + + if ($properties['VERTICAL-ALIGN']) { $objattr['vertical-align'] = $align[strtolower($properties['VERTICAL-ALIGN'])]; } + + switch(strtoupper($attr['TYPE'])){ + case 'HIDDEN': + $this->ignorefollowingspaces = true; //Eliminate exceeding left-side spaces + if ($this->useActiveForms) { + $this->form->SetFormText( 0, 0, $objattr['fieldname'], $objattr['value'], $objattr['value'], '', 0, '', true ); + } + if ($this->InlineProperties[$tag]) { $this->restoreInlineProperties($this->InlineProperties[$tag]); } + unset($this->InlineProperties[$tag]); + break 2; + case 'CHECKBOX': //Draw Checkbox + $type = 'CHECKBOX'; + if (isset($attr['CHECKED'])) { $objattr['checked'] = true; } + else { $objattr['checked'] = false; } + $width = $this->FontSize; + $height = $this->FontSize; + break; + + case 'RADIO': //Draw Radio button + $type = 'RADIO'; + if (isset($attr['CHECKED'])) $objattr['checked'] = true; + $width = $this->FontSize; + $height = $this->FontSize; + break; + +/*-- IMAGES-CORE --*/ + case 'IMAGE': // Draw an Image button + if(isset($attr['SRC'])) { + $type = 'IMAGE'; + $srcpath = $attr['SRC']; + $orig_srcpath = $attr['ORIG_SRC']; + // VSPACE and HSPACE converted to margins in MergeCSS + if (isset($properties['MARGIN-TOP'])) { $objattr['margin_top']=$this->ConvertSize($properties['MARGIN-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-BOTTOM'])) { $objattr['margin_bottom'] = $this->ConvertSize($properties['MARGIN-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-LEFT'])) { $objattr['margin_left'] = $this->ConvertSize($properties['MARGIN-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-RIGHT'])) { $objattr['margin_right'] = $this->ConvertSize($properties['MARGIN-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + + + if (isset($properties['BORDER-TOP'])) { $objattr['border_top'] = $this->border_details($properties['BORDER-TOP']); } + if (isset($properties['BORDER-BOTTOM'])) { $objattr['border_bottom'] = $this->border_details($properties['BORDER-BOTTOM']); } + if (isset($properties['BORDER-LEFT'])) { $objattr['border_left'] = $this->border_details($properties['BORDER-LEFT']); } + if (isset($properties['BORDER-RIGHT'])) { $objattr['border_right'] = $this->border_details($properties['BORDER-RIGHT']); } + + $objattr['padding_top'] = 0; + $objattr['padding_bottom'] = 0; + $objattr['padding_left'] = 0; + $objattr['padding_right'] = 0; + + if (isset($properties['VERTICAL-ALIGN'])) { $objattr['vertical-align'] = $align[strtolower($properties['VERTICAL-ALIGN'])]; } + + $w = 0; + $h = 0; + if(isset($properties['WIDTH'])) $w = $this->ConvertSize($properties['WIDTH'],$this->blk[$this->blklvl]['inner_width']); + if(isset($properties['HEIGHT'])) $h = $this->ConvertSize($properties['HEIGHT'],$this->blk[$this->blklvl]['inner_width']); + + $extraheight = $objattr['margin_top'] + $objattr['margin_bottom'] + $objattr['border_top']['w'] + $objattr['border_bottom']['w']; + $extrawidth = $objattr['margin_left'] + $objattr['margin_right'] + $objattr['border_left']['w'] + $objattr['border_right']['w']; + + // Image file + $info=$this->_getImage($srcpath, true, true, $orig_srcpath); + if(!$info) { + $info = $this->_getImage($this->noImageFile); + if ($info) { + $srcpath = $this->noImageFile; + $w = ($info['w'] * (25.4/$this->dpi)); + $h = ($info['h'] * (25.4/$this->dpi)); + } + } + if(!$info) break; + if ($info['cs']=='Indexed') { $objattr['Indexed'] = true; } + $objattr['file'] = $srcpath; + //Default width and height calculation if needed + if($w==0 and $h==0) { +/*-- IMAGES-WMF --*/ + if ($info['type']=='wmf') { + // WMF units are twips (1/20pt) + // divide by 20 to get points + // divide by k to get user units + $w = abs($info['w'])/(20*_MPDFK); + $h = abs($info['h']) / (20*_MPDFK); + } + else +/*-- END IMAGES-WMF --*/ + if ($info['type']=='svg') { + // SVG units are pixels + $w = abs($info['w'])/_MPDFK; + $h = abs($info['h'])/_MPDFK; + } + else { + //Put image at default image dpi + $w=($info['w']/_MPDFK) * (72/$this->img_dpi); + $h=($info['h']/_MPDFK) * (72/$this->img_dpi); + } + if (isset($properties['IMAGE-RESOLUTION'])) { + if (preg_match('/from-image/i', $properties['IMAGE-RESOLUTION']) && isset($info['set-dpi']) && $info['set-dpi']>0) { + $w *= $this->img_dpi / $info['set-dpi']; + $h *= $this->img_dpi / $info['set-dpi']; + } + else if (preg_match('/(\d+)dpi/i', $properties['IMAGE-RESOLUTION'], $m)) { + $dpi = $m[1]; + if ($dpi > 0) { + $w *= $this->img_dpi / $dpi; + $h *= $this->img_dpi / $dpi; + } + } + } + } + // IF WIDTH OR HEIGHT SPECIFIED + if($w==0) $w=$h*$info['w']/$info['h']; + if($h==0) $h=$w*$info['h']/$info['w']; + // Resize to maximum dimensions of page + $maxWidth = $this->blk[$this->blklvl]['inner_width']; + $maxHeight = $this->h - ($this->tMargin + $this->bMargin + 10) ; + if ($this->fullImageHeight) { $maxHeight = $this->fullImageHeight; } + if ($w + $extrawidth > $maxWidth ) { + $w = $maxWidth - $extrawidth; + $h=$w*$info['h']/$info['w']; + } + if ($h + $extraheight > $maxHeight ) { + $h = $maxHeight - $extraheight; + $w=$h*$info['w']/$info['h']; + } + $height = $h + $extraheight; + $width = $w + $extrawidth; + $objattr['type'] = 'image'; + $objattr['itype'] = $info['type']; + $objattr['orig_h'] = $info['h']; + $objattr['orig_w'] = $info['w']; +/*-- IMAGES-WMF --*/ + if ($info['type']=='wmf') { + $objattr['wmf_x'] = $info['x']; + $objattr['wmf_y'] = $info['y']; + } + else +/*-- END IMAGES-WMF --*/ + if ($info['type']=='svg') { + $objattr['wmf_x'] = $info['x']; + $objattr['wmf_y'] = $info['y']; + } + $objattr['height'] = $h + $extraheight; + $objattr['width'] = $w + $extrawidth; + + $objattr['image_height'] = $h; + $objattr['image_width'] = $w; + $objattr['ID'] = $info['i']; + $texto = 'X'; + if ($this->useActiveForms) { + if (isset($attr['ONCLICK'])) { $objattr['onClick'] = $attr['ONCLICK']; } + $objattr['type'] = 'input'; + $type = 'IMAGE'; + } + break; + } +/*-- END IMAGES-CORE --*/ + + case 'BUTTON': // Draw a button + case 'SUBMIT': + case 'RESET': + $type = strtoupper($attr['TYPE']); + if ($type=='IMAGE') { $type = 'BUTTON'; } // src path not found + if(isset($attr['NOPRINT'])) { $objattr['noprint'] = true; } + if (!isset($attr['VALUE'])) { + $objattr['value'] = ucfirst(strtolower($type)); + } + + $texto = " " . $objattr['value'] . " "; + $width = $this->GetStringWidth($texto) + ($this->form->form_element_spacing['button']['outer']['h']*2)+($this->form->form_element_spacing['button']['inner']['h']*2); + $height = $this->FontSize + ($this->form->form_element_spacing['button']['outer']['v']*2)+($this->form->form_element_spacing['button']['inner']['v']*2); + if ($this->useActiveForms) { + if (isset($attr['ONCLICK'])) { $objattr['onClick'] = $attr['ONCLICK']; } + } + break; + + case 'PASSWORD': + case 'TEXT': + default: + if ($type == '') { $type = 'TEXT'; } + if(strtoupper($attr['TYPE'])=='PASSWORD') { $type = 'PASSWORD'; } + if (isset($attr['VALUE'])) { + if ($type == 'PASSWORD') { + $num_stars = mb_strlen($attr['VALUE'],$this->mb_enc ); + $texto = str_repeat('*',$num_stars); + } + else { $texto = $attr['VALUE']; } + } + $xw = ($this->form->form_element_spacing['input']['outer']['h']*2)+($this->form->form_element_spacing['input']['inner']['h']*2); + $xh = ($this->form->form_element_spacing['input']['outer']['v']*2)+($this->form->form_element_spacing['input']['inner']['v']*2); + if ($w) { $width = $w + $xw; } + else { $width = (20 * $spacesize) + $xw; } // Default width in chars + if (isset($attr['SIZE']) and ctype_digit($attr['SIZE']) ) $width = ($attr['SIZE'] * $spacesize) + $xw; + $height = $this->FontSize + $xh; + if (isset($attr['MAXLENGTH']) and ctype_digit($attr['MAXLENGTH']) ) $objattr['maxlength'] = $attr['MAXLENGTH']; + if ($this->useActiveForms) { + if (isset($attr['ONCALCULATE'])) { $objattr['onCalculate'] = $attr['ONCALCULATE']; } + else if (isset($attr['ONCHANGE'])) { $objattr['onCalculate'] = $attr['ONCHANGE']; } + if (isset($attr['ONVALIDATE'])) { $objattr['onValidate'] = $attr['ONVALIDATE']; } + if (isset($attr['ONKEYSTROKE'])) { $objattr['onKeystroke'] = $attr['ONKEYSTROKE']; } + if (isset($attr['ONFORMAT'])) { $objattr['onFormat'] = $attr['ONFORMAT']; } + } + break; + } + + $objattr['subtype'] = $type; + $objattr['text'] = $texto; + $objattr['width'] = $width; + $objattr['height'] = $height; + $e = "\xbb\xa4\xactype=input,objattr=".serialize($objattr)."\xbb\xa4\xac"; + + // Clear properties - tidy up + $properties = array(); + +/*-- TABLES --*/ + // Output it to buffers + if ($this->tableLevel) { + $this->_saveCellTextBuffer($e, $this->HREF); + $this->cell[$this->row][$this->col]['s'] += $objattr['width'] ; + + } + else { +/*-- END TABLES --*/ + $this->_saveTextBuffer($e, $this->HREF); + } // *TABLES* + + if ($this->InlineProperties[$tag]) { $this->restoreInlineProperties($this->InlineProperties[$tag]); } + unset($this->InlineProperties[$tag]); + + break; // END of INPUT +/*-- END FORMS --*/ + + + // *********** GRAPH ******************** + case 'JPGRAPH': + if (!$this->useGraphs) { break; } + if ($attr['TABLE']) { $gid = strtoupper($attr['TABLE']); } + else { $gid = '0'; } + if (!is_array($this->graphs[$gid]) || count($this->graphs[$gid])==0 ) { break; } + include_once(_MPDF_PATH.'graph.php'); + $this->graphs[$gid]['attr'] = $attr; + + + if (isset($this->graphs[$gid]['attr']['WIDTH']) && $this->graphs[$gid]['attr']['WIDTH']) { + $this->graphs[$gid]['attr']['cWIDTH']=$this->ConvertSize($this->graphs[$gid]['attr']['WIDTH'],$pgwidth); + } // mm + if (isset($this->graphs[$gid]['attr']['HEIGHT']) && $this->graphs[$gid]['attr']['HEIGHT']) { + $this->graphs[$gid]['attr']['cHEIGHT']=$this->ConvertSize($this->graphs[$gid]['attr']['HEIGHT'],$pgwidth); + } + + $graph_img = print_graph($this->graphs[$gid],$this->blk[$this->blklvl]['inner_width']); + if ($graph_img) { + if(isset($attr['ROTATE'])) { + if ($attr['ROTATE']==90 || $attr['ROTATE']==-90) { + $tmpw = $graph_img['w']; + $graph_img['w']= $graph_img['h']; + $graph_img['h']= $tmpw; + } + } + $attr['SRC'] = $graph_img['file']; + $attr['WIDTH'] = $graph_img['w']; + $attr['HEIGHT'] = $graph_img['h']; + } + else { break; } + + // *********** IMAGE ******************** +/*-- IMAGES-CORE --*/ + case 'IMG': + if ($this->progressBar) { $this->UpdateProgressBar(1,'','IMG'); } // *PROGRESS-BAR* + $objattr = array(); + $objattr['margin_top'] = 0; + $objattr['margin_bottom'] = 0; + $objattr['margin_left'] = 0; + $objattr['margin_right'] = 0; + $objattr['padding_top'] = 0; + $objattr['padding_bottom'] = 0; + $objattr['padding_left'] = 0; + $objattr['padding_right'] = 0; + $objattr['width'] = 0; + $objattr['height'] = 0; + $objattr['border_top']['w'] = 0; + $objattr['border_bottom']['w'] = 0; + $objattr['border_left']['w'] = 0; + $objattr['border_right']['w'] = 0; + if(isset($attr['SRC'])) { + $srcpath = $attr['SRC']; + $orig_srcpath = $attr['ORIG_SRC']; + $properties = $this->cssmgr->MergeCSS('',$tag,$attr); + if(isset($properties ['DISPLAY']) && strtolower($properties ['DISPLAY'])=='none') { + return; + } + // mPDF 5.6.01 - LAYERS + if (isset($properties['Z-INDEX']) && $this->currentlayer==0) { + $v = intval($properties['Z-INDEX']); + if ($v > 0) { + $objattr['z-index'] = $v; + } + } + + $objattr['visibility'] = 'visible'; + if (isset($properties['VISIBILITY'])) { + $v = strtolower($properties['VISIBILITY']); + if (($v == 'hidden' || $v == 'printonly' || $v == 'screenonly') && $this->visibility=='visible') { + $objattr['visibility'] = $v; + } + } + + // VSPACE and HSPACE converted to margins in MergeCSS + if (isset($properties['MARGIN-TOP'])) { $objattr['margin_top']=$this->ConvertSize($properties['MARGIN-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-BOTTOM'])) { $objattr['margin_bottom'] = $this->ConvertSize($properties['MARGIN-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-LEFT'])) { $objattr['margin_left'] = $this->ConvertSize($properties['MARGIN-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-RIGHT'])) { $objattr['margin_right'] = $this->ConvertSize($properties['MARGIN-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + + if (isset($properties['PADDING-TOP'])) { $objattr['padding_top']=$this->ConvertSize($properties['PADDING-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-BOTTOM'])) { $objattr['padding_bottom'] = $this->ConvertSize($properties['PADDING-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-LEFT'])) { $objattr['padding_left'] = $this->ConvertSize($properties['PADDING-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-RIGHT'])) { $objattr['padding_right'] = $this->ConvertSize($properties['PADDING-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + + if (isset($properties['BORDER-TOP'])) { $objattr['border_top'] = $this->border_details($properties['BORDER-TOP']); } + if (isset($properties['BORDER-BOTTOM'])) { $objattr['border_bottom'] = $this->border_details($properties['BORDER-BOTTOM']); } + if (isset($properties['BORDER-LEFT'])) { $objattr['border_left'] = $this->border_details($properties['BORDER-LEFT']); } + if (isset($properties['BORDER-RIGHT'])) { $objattr['border_right'] = $this->border_details($properties['BORDER-RIGHT']); } + + if (isset($properties['VERTICAL-ALIGN'])) { $objattr['vertical-align'] = $align[strtolower($properties['VERTICAL-ALIGN'])]; } + $w = 0; + $h = 0; + if(isset($properties['WIDTH'])) $w = $this->ConvertSize($properties['WIDTH'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + else if(isset($attr['WIDTH'])) $w = $this->ConvertSize($attr['WIDTH'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + if(isset($properties['HEIGHT'])) $h = $this->ConvertSize($properties['HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + else if(isset($attr['HEIGHT'])) $h = $this->ConvertSize($attr['HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + // mPDF 5.5.15 // mPDF 5.6.60 + $maxw=$maxh=$minw=$minh=false; + if(isset($properties['MAX-WIDTH'])) $maxw = $this->ConvertSize($properties['MAX-WIDTH'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + else if(isset($attr['MAX-WIDTH'])) $maxw = $this->ConvertSize($attr['MAX-WIDTH'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + if(isset($properties['MAX-HEIGHT'])) $maxh = $this->ConvertSize($properties['MAX-HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + else if(isset($attr['MAX-HEIGHT'])) $maxh = $this->ConvertSize($attr['MAX-HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + if(isset($properties['MIN-WIDTH'])) $minw = $this->ConvertSize($properties['MIN-WIDTH'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + else if(isset($attr['MIN-WIDTH'])) $minw = $this->ConvertSize($attr['MIN-WIDTH'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + if(isset($properties['MIN-HEIGHT'])) $minh = $this->ConvertSize($properties['MIN-HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + else if(isset($attr['MIN-HEIGHT'])) $minh = $this->ConvertSize($attr['MIN-HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + + if (isset($properties['OPACITY']) && $properties['OPACITY'] > 0 && $properties['OPACITY'] <= 1) { $objattr['opacity'] = $properties['OPACITY']; } + if ($this->HREF) { + if (strpos($this->HREF,".") === false && strpos($this->HREF,"@") !== 0) { + $href = $this->HREF; + while(array_key_exists($href,$this->internallink)) $href="#".$href; + $this->internallink[$href] = $this->AddLink(); + $objattr['link'] = $this->internallink[$href]; + } + else { $objattr['link'] = $this->HREF; } + } + $extraheight = $objattr['padding_top'] + $objattr['padding_bottom'] + $objattr['margin_top'] + $objattr['margin_bottom'] + $objattr['border_top']['w'] + $objattr['border_bottom']['w']; + $extrawidth = $objattr['padding_left'] + $objattr['padding_right'] + $objattr['margin_left'] + $objattr['margin_right'] + $objattr['border_left']['w'] + $objattr['border_right']['w']; + +/*-- BACKGROUNDS --*/ + if(isset($properties['GRADIENT-MASK']) && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/',$properties['GRADIENT-MASK'])) { + $objattr['GRADIENT-MASK'] = $properties['GRADIENT-MASK']; + } +/*-- END BACKGROUNDS --*/ + + // Image file + $info=$this->_getImage($srcpath, true, true, $orig_srcpath); + if(!$info) { + $info = $this->_getImage($this->noImageFile); + if ($info) { + $srcpath = $this->noImageFile; + $w = ($info['w'] * (25.4/$this->dpi)); + $h = ($info['h'] * (25.4/$this->dpi)); + } + } + if(!$info) break; + + if(isset($attr['ROTATE'])) { $image_orientation = $attr['ROTATE']; } + else if(isset($properties['IMAGE-ORIENTATION'])) { $image_orientation = $properties['IMAGE-ORIENTATION']; } + else { $image_orientation = 0; } + if($image_orientation) { + if ($image_orientation==90 || $image_orientation==-90 || $image_orientation==270) { + $tmpw = $info['w']; + $info['w'] = $info['h']; + $info['h'] = $tmpw; + } + $objattr['ROTATE'] = $image_orientation; + } + + $objattr['file'] = $srcpath; + //Default width and height calculation if needed + if($w==0 and $h==0) { +/*-- IMAGES-WMF --*/ + if ($info['type']=='wmf') { + // WMF units are twips (1/20pt) + // divide by 20 to get points + // divide by k to get user units + $w = abs($info['w'])/(20*_MPDFK); + $h = abs($info['h']) / (20*_MPDFK); + } + else +/*-- END IMAGES-WMF --*/ + if ($info['type']=='svg') { + // SVG units are pixels + $w = abs($info['w'])/_MPDFK; + $h = abs($info['h'])/_MPDFK; + } + else { + //Put image at default image dpi + $w=($info['w']/_MPDFK) * (72/$this->img_dpi); + $h=($info['h']/_MPDFK) * (72/$this->img_dpi); + } + if (isset($properties['IMAGE-RESOLUTION'])) { + if (preg_match('/from-image/i', $properties['IMAGE-RESOLUTION']) && isset($info['set-dpi']) && $info['set-dpi']>0) { + $w *= $this->img_dpi / $info['set-dpi']; + $h *= $this->img_dpi / $info['set-dpi']; + } + else if (preg_match('/(\d+)dpi/i', $properties['IMAGE-RESOLUTION'], $m)) { + $dpi = $m[1]; + if ($dpi > 0) { + $w *= $this->img_dpi / $dpi; + $h *= $this->img_dpi / $dpi; + } + } + } + } + // IF WIDTH OR HEIGHT SPECIFIED + if($w==0) $w=abs($h*$info['w']/$info['h']); + if($h==0) $h=abs($w*$info['h']/$info['w']); + + // mPDF 5.5.15 + if ($minw && $w<$minw) { $w = $minw; $h=abs($w*$info['h']/$info['w']); } + if ($maxw && $w>$maxw) { $w = $maxw; $h=abs($w*$info['h']/$info['w']); } + if ($minh && $h<$minh) { $h = $minh; $w=abs($h*$info['w']/$info['h']); } + if ($maxh && $h>$maxh) { $h = $maxh; $w=abs($h*$info['w']/$info['h']); } + + // Resize to maximum dimensions of page + $maxWidth = $this->blk[$this->blklvl]['inner_width']; + $maxHeight = $this->h - ($this->tMargin + $this->bMargin + 1) ; + if ($this->fullImageHeight) { $maxHeight = $this->fullImageHeight; } + if ($w + $extrawidth > $maxWidth ) { + $w = $maxWidth - $extrawidth; + $h=abs($w*$info['h']/$info['w']); + } + + if ($h + $extraheight > $maxHeight ) { + $h = $maxHeight - $extraheight; + $w=abs($h*$info['w']/$info['h']); + } + $objattr['type'] = 'image'; + $objattr['itype'] = $info['type']; + + $objattr['orig_h'] = $info['h']; + $objattr['orig_w'] = $info['w']; +/*-- IMAGES-WMF --*/ + if ($info['type']=='wmf') { + $objattr['wmf_x'] = $info['x']; + $objattr['wmf_y'] = $info['y']; + } + else +/*-- END IMAGES-WMF --*/ + if ($info['type']=='svg') { + $objattr['wmf_x'] = $info['x']; + $objattr['wmf_y'] = $info['y']; + } + $objattr['height'] = $h + $extraheight; + $objattr['width'] = $w + $extrawidth; + $objattr['image_height'] = $h; + $objattr['image_width'] = $w; +/*-- CSS-IMAGE-FLOAT --*/ + if (!$this->ColActive && !$this->tableLevel && !$this->listlvl && !$this->kwt && !$this->keep_block_together) { + if (isset($properties['FLOAT']) && (strtoupper($properties['FLOAT']) == 'RIGHT' || strtoupper($properties['FLOAT']) == 'LEFT')) { + $objattr['float'] = substr(strtoupper($properties['FLOAT']),0,1); + } + } +/*-- END CSS-IMAGE-FLOAT --*/ + + $e = "\xbb\xa4\xactype=image,objattr=".serialize($objattr)."\xbb\xa4\xac"; + + // Clear properties - tidy up + $properties = array(); + +/*-- TABLES --*/ + // Output it to buffers + if ($this->tableLevel) { + $this->_saveCellTextBuffer($e, $this->HREF); + $this->cell[$this->row][$this->col]['s'] += $objattr['width'] ; + } + else { +/*-- END TABLES --*/ + $this->_saveTextBuffer($e, $this->HREF); + } // *TABLES* +/*-- ANNOTATIONS --*/ + if ($this->title2annots && isset($attr['TITLE'])) { + $objattr = array(); + $objattr['margin_top'] = 0; + $objattr['margin_bottom'] = 0; + $objattr['margin_left'] = 0; + $objattr['margin_right'] = 0; + $objattr['width'] = 0; + $objattr['height'] = 0; + $objattr['border_top']['w'] = 0; + $objattr['border_bottom']['w'] = 0; + $objattr['border_left']['w'] = 0; + $objattr['border_right']['w'] = 0; + $objattr['CONTENT'] = $attr['TITLE']; + $objattr['type'] = 'annot'; + $objattr['POS-X'] = 0; + $objattr['POS-Y'] = 0; + $objattr['ICON'] = 'Comment'; + $objattr['AUTHOR'] = ''; + $objattr['SUBJECT'] = ''; + $objattr['OPACITY'] = $this->annotOpacity; + $objattr['COLOR'] = $this->ConvertColor('yellow'); + $e = "\xbb\xa4\xactype=annot,objattr=".serialize($objattr)."\xbb\xa4\xac"; + if($this->tableLevel) { // *TABLES* + $this->cell[$this->row][$this->col]['textbuffer'][] = array($e); // *TABLES* + } // *TABLES* + else { // *TABLES* + $this->textbuffer[] = array($e); + } // *TABLES* + } +/*-- END ANNOTATIONS --*/ + } + break; +/*-- END IMAGES-CORE --*/ + + + // *********** CIRCULAR TEXT = TEXTCIRCLE ******************** + case 'TEXTCIRCLE': + $objattr = array(); + $objattr['margin_top'] = 0; + $objattr['margin_bottom'] = 0; + $objattr['margin_left'] = 0; + $objattr['margin_right'] = 0; + $objattr['padding_top'] = 0; + $objattr['padding_bottom'] = 0; + $objattr['padding_left'] = 0; + $objattr['padding_right'] = 0; + $objattr['width'] = 0; + $objattr['height'] = 0; + $objattr['border_top']['w'] = 0; + $objattr['border_bottom']['w'] = 0; + $objattr['border_left']['w'] = 0; + $objattr['border_right']['w'] = 0; + $objattr['top-text'] = ''; + $objattr['bottom-text'] = ''; + $objattr['r'] = 20; // radius (default value here for safety) + $objattr['space-width'] = 120; + $objattr['char-width'] = 100; + + $this->InlineProperties[$tag] = $this->saveInlineProperties(); + $properties = $this->cssmgr->MergeCSS('INLINE',$tag,$attr); + + if(isset($properties ['DISPLAY']) && strtolower($properties ['DISPLAY'])=='none') { + return; + } + if (isset($attr['R'])) { $objattr['r']=$this->ConvertSize($attr['R'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if(isset($attr['TOP-TEXT'])) { + $objattr['top-text'] = strcode2utf($attr['TOP-TEXT']); + $objattr['top-text'] = $this->lesser_entity_decode($objattr['top-text']); + if ($this->onlyCoreFonts) + $objattr['top-text'] = mb_convert_encoding($objattr['top-text'], $this->mb_enc,'UTF-8'); + } + if(isset($attr['BOTTOM-TEXT'])) { + $objattr['bottom-text'] = strcode2utf($attr['BOTTOM-TEXT']); + $objattr['bottom-text'] = $this->lesser_entity_decode($objattr['bottom-text']); + if ($this->onlyCoreFonts) + $objattr['bottom-text'] = mb_convert_encoding($objattr['bottom-text'], $this->mb_enc,'UTF-8'); + } + if(isset($attr['SPACE-WIDTH']) && $attr['SPACE-WIDTH']) { $objattr['space-width'] = $attr['SPACE-WIDTH']; } + if(isset($attr['CHAR-WIDTH']) && $attr['CHAR-WIDTH']) { $objattr['char-width'] = $attr['CHAR-WIDTH']; } + + // VISIBILITY + $objattr['visibility'] = 'visible'; + if (isset($properties['VISIBILITY'])) { + $v = strtolower($properties['VISIBILITY']); + if (($v == 'hidden' || $v == 'printonly' || $v == 'screenonly') && $this->visibility=='visible') { + $objattr['visibility'] = $v; + } + } + // mPDF 5.5.23 + if (isset($properties['FONT-SIZE'])) { + if (strtolower($properties['FONT-SIZE'])=='auto') { + if ($objattr['top-text'] && $objattr['bottom-text']) { + $objattr['fontsize'] = -2; + } + else { + $objattr['fontsize'] = -1; + } + } + else { + $mmsize = $this->ConvertSize($properties['FONT-SIZE'],($this->default_font_size/_MPDFK)); + $this->SetFontSize($mmsize*_MPDFK,false); + $objattr['fontsize'] = $this->FontSizePt; + } + } + // mPDF 5.5.23 + if(isset($attr['DIVIDER'])) { + $objattr['divider'] = strcode2utf($attr['DIVIDER']); + $objattr['divider'] = $this->lesser_entity_decode($objattr['divider']); + if ($this->onlyCoreFonts) + $objattr['divider'] = mb_convert_encoding($objattr['divider'], $this->mb_enc,'UTF-8'); + + } + + if (isset($properties['COLOR'])) { $objattr['color'] = $this->ConvertColor($properties['COLOR']); } + + $objattr['fontstyle'] = ''; + if (isset($properties['FONT-WEIGHT'])) { + if (strtoupper($properties['FONT-WEIGHT']) == 'BOLD') { $objattr['fontstyle'] .= 'B'; } + } + if (isset($properties['FONT-STYLE'])) { + if (strtoupper($properties['FONT-STYLE']) == 'ITALIC') { $objattr['fontstyle'] .= 'I'; } + } + + if (isset($properties['FONT-FAMILY'])) { + $this->SetFont($properties['FONT-FAMILY'],$this->FontStyle,0,false); + } + $objattr['fontfamily'] = $this->FontFamily; + + // VSPACE and HSPACE converted to margins in MergeCSS + if (isset($properties['MARGIN-TOP'])) { $objattr['margin_top']=$this->ConvertSize($properties['MARGIN-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-BOTTOM'])) { $objattr['margin_bottom'] = $this->ConvertSize($properties['MARGIN-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-LEFT'])) { $objattr['margin_left'] = $this->ConvertSize($properties['MARGIN-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['MARGIN-RIGHT'])) { $objattr['margin_right'] = $this->ConvertSize($properties['MARGIN-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + + if (isset($properties['PADDING-TOP'])) { $objattr['padding_top']=$this->ConvertSize($properties['PADDING-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-BOTTOM'])) { $objattr['padding_bottom'] = $this->ConvertSize($properties['PADDING-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-LEFT'])) { $objattr['padding_left'] = $this->ConvertSize($properties['PADDING-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + if (isset($properties['PADDING-RIGHT'])) { $objattr['padding_right'] = $this->ConvertSize($properties['PADDING-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + + if (isset($properties['BORDER-TOP'])) { $objattr['border_top'] = $this->border_details($properties['BORDER-TOP']); } + if (isset($properties['BORDER-BOTTOM'])) { $objattr['border_bottom'] = $this->border_details($properties['BORDER-BOTTOM']); } + if (isset($properties['BORDER-LEFT'])) { $objattr['border_left'] = $this->border_details($properties['BORDER-LEFT']); } + if (isset($properties['BORDER-RIGHT'])) { $objattr['border_right'] = $this->border_details($properties['BORDER-RIGHT']); } + + if (isset($properties['OPACITY']) && $properties['OPACITY'] > 0 && $properties['OPACITY'] <= 1) { $objattr['opacity'] = $properties['OPACITY']; } + if (isset($properties['BACKGROUND-COLOR']) && $properties['BACKGROUND-COLOR'] != '') { $objattr['bgcolor'] = $this->ConvertColor($properties['BACKGROUND-COLOR']); } + else { $objattr['bgcolor'] = false; } + if ($this->HREF) { + if (strpos($this->HREF,".") === false && strpos($this->HREF,"@") !== 0) { + $href = $this->HREF; + while(array_key_exists($href,$this->internallink)) $href="#".$href; + $this->internallink[$href] = $this->AddLink(); + $objattr['link'] = $this->internallink[$href]; + } + else { $objattr['link'] = $this->HREF; } + } + $extraheight = $objattr['padding_top'] + $objattr['padding_bottom'] + $objattr['margin_top'] + $objattr['margin_bottom'] + $objattr['border_top']['w'] + $objattr['border_bottom']['w']; + $extrawidth = $objattr['padding_left'] + $objattr['padding_right'] + $objattr['margin_left'] + $objattr['margin_right'] + $objattr['border_left']['w'] + $objattr['border_right']['w']; + + + $w = $objattr['r']*2; + $h = $w; + $objattr['height'] = $h + $extraheight; + $objattr['width'] = $w + $extrawidth; + $objattr['type'] = 'textcircle'; + + $e = "\xbb\xa4\xactype=image,objattr=".serialize($objattr)."\xbb\xa4\xac"; + + // Clear properties - tidy up + $properties = array(); + +/*-- TABLES --*/ + // Output it to buffers + if ($this->tableLevel) { + $this->_saveCellTextBuffer($e, $this->HREF); + $this->cell[$this->row][$this->col]['s'] += $objattr['width'] ; + } + else { +/*-- END TABLES --*/ + $this->_saveTextBuffer($e, $this->HREF); + } // *TABLES* + + if ($this->InlineProperties[$tag]) { $this->restoreInlineProperties($this->InlineProperties[$tag]); } + unset($this->InlineProperties[$tag]); + + break; + + +/*-- TABLES --*/ + + case 'TABLE': // TABLE-BEGIN + $this->tdbegin = false; + $this->lastoptionaltag = ''; + // Disable vertical justification in columns + if ($this->ColActive) { $this->colvAlign = ''; } // *COLUMNS* + if ($this->lastblocklevelchange == 1) { $blockstate = 1; } // Top margins/padding only + else if ($this->lastblocklevelchange < 1) { $blockstate = 0; } // NO margins/padding + // called from block after new div e.g. <div> ... <table> ... Outputs block top margin/border and padding + if (count($this->textbuffer) == 0 && $this->lastblocklevelchange == 1 && !$this->tableLevel && !$this->kwt) { + $this->newFlowingBlock( $this->blk[$this->blklvl]['width'],$this->lineheight,'',false,false,1,true, $this->blk[$this->blklvl]['direction']); + $this->finishFlowingBlock(true); // true = END of flowing block + } + else if (!$this->tableLevel && count($this->textbuffer)) { $this->printbuffer($this->textbuffer,$blockstate); } + + $this->textbuffer=array(); + $this->lastblocklevelchange = -1; + if ($this->tableLevel) { // i.e. now a nested table coming... + // Save current level table + // mPDF 5.4.10 + $this->cell['PARENTCELL'] = $this->saveInlineProperties(); + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['baseProperties']= $this->base_table_properties; + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['cells'] = $this->cell; + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['currrow'] = $this->row; + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['currcol'] = $this->col; + } + $this->tableLevel++; + $this->cssmgr->tbCSSlvl++; + + if ($this->tableLevel>1) { // inherit table properties from cell in which nested + $this->base_table_properties['FONT-KERNING'] = $this->kerning ; + $this->base_table_properties['LETTER-SPACING'] = $this->lSpacingCSS ; + $this->base_table_properties['WORD-SPACING'] = $this->wSpacingCSS ; + } + + if (isset($this->tbctr[$this->tableLevel])) { $this->tbctr[$this->tableLevel]++; } + else { $this->tbctr[$this->tableLevel] = 1; } + + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['level'] = $this->tableLevel; + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['levelid'] = $this->tbctr[$this->tableLevel]; + + if ($this->tableLevel > $this->innermostTableLevel) { $this->innermostTableLevel = $this->tableLevel; } + if ($this->tableLevel > 1) { + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['nestedpos'] = array($this->row,$this->col,$this->tbctr[($this->tableLevel-1)]); + } + //++++++++++++++++++++++++++++ + + $this->cell = array(); + $this->col=-1; //int + $this->row=-1; //int + $table = &$this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]; + + // New table - any level + if ($this->cacheTables) { + $this->packTableData = true; // required for cacheTables + $this->simpleTables = false; // Cannot co-exist with cacheTables + $table['cache'] = _MPDF_TEMP_PATH.'_tempTblCache'.RAND(1,1000000).'.dat'; + $fh = fopen($table['cache'] , "wb") or $this->Error("When using cacheTables, you must have read/write access to cache files (".$table['cache'] .")"); + fwrite($fh, "\x00"); + fclose($fh); + $table['ptr'] = 1 ; // Must not be 0 + } + + $table['direction'] = $this->directionality; + $table['bgcolor'] = false; + $table['va'] = false; + $table['txta'] = false; + $table['topntail'] = false; + $table['thead-underline'] = false; + $table['border'] = false; + $table['border_details']['R']['w'] = 0; + $table['border_details']['L']['w'] = 0; + $table['border_details']['T']['w'] = 0; + $table['border_details']['B']['w'] = 0; + $table['border_details']['R']['style'] = ''; + $table['border_details']['L']['style'] = ''; + $table['border_details']['T']['style'] = ''; + $table['border_details']['B']['style'] = ''; + $table['max_cell_border_width']['R'] = 0; + $table['max_cell_border_width']['L'] = 0; + $table['max_cell_border_width']['T'] = 0; + $table['max_cell_border_width']['B'] = 0; + $table['padding']['L'] = false; + $table['padding']['R'] = false; + $table['padding']['T'] = false; + $table['padding']['B'] = false; + $table['margin']['L'] = false; + $table['margin']['R'] = false; + $table['margin']['T'] = false; + $table['margin']['B'] = false; + $table['a'] = false; + $table['border_spacing_H'] = false; + $table['border_spacing_V'] = false; + $table['decimal_align'] = false; // mPDF 5.6.13 + $this->Reset(); + $this->InlineProperties = array(); + $this->spanlvl = 0; + $table['nc'] = $table['nr'] = 0; + $this->tablethead = 0; + $this->tabletfoot = 0; + $this->tabletheadjustfinished = false; + + + if ($this->blockjustfinished && !count($this->textbuffer) && $this->y != $this->tMargin && $this->collapseBlockMargins && $this->tableLevel==1) { $lastbottommargin = $this->lastblockbottommargin; } + else { $lastbottommargin = 0; } + $this->lastblockbottommargin = 0; + $this->blockjustfinished=false; + + if ($this->tableLevel==1) { + $this->tableCJK = false; + $this->table_lineheight = $this->normalLineheight; + $table['headernrows'] = 0; + $table['footernrows'] = 0; + $this->base_table_properties = array(); + } + + // ADDED CSS FUNCIONS FOR TABLE + if ($this->cssmgr->tbCSSlvl==1) { + $properties = $this->cssmgr->MergeCSS('TOPTABLE',$tag,$attr); + } + else { + $properties = $this->cssmgr->MergeCSS('TABLE',$tag,$attr); + } + $w = ''; + if (isset($properties['WIDTH'])) { $w = $properties['WIDTH']; } + else if (isset($attr['WIDTH']) && $attr['WIDTH']) { $w = $attr['WIDTH']; } + + + if(isset($properties['DIRECTION']) && $properties['DIRECTION']) { $table['direction'] = strtolower($properties['DIRECTION']); } + else if(isset($attr['DIR']) && $attr['DIR']) { $table['direction'] = strtolower($attr['DIR']); } + else if (!isset($table['direction'])){ $table['direction'] = $this->blk[$this->blklvl]['direction']; } + + if (isset($properties['BACKGROUND-COLOR'])) { $table['bgcolor'][-1] = $properties['BACKGROUND-COLOR']; } + else if (isset($properties['BACKGROUND'])) { $table['bgcolor'][-1] = $properties['BACKGROUND']; } + else if (isset($attr['BGCOLOR'])) { $table['bgcolor'][-1] = $attr['BGCOLOR']; } + if (isset($properties['VERTICAL-ALIGN'])) { $table['va'] = $align[strtolower($properties['VERTICAL-ALIGN'])]; } + if (isset($properties['TEXT-ALIGN'])) { $table['txta'] = $align[strtolower($properties['TEXT-ALIGN'])]; } + if (isset($attr['ALIGN'])) { $table['a'] = $align[strtolower($attr['ALIGN'])]; } + if (!$table['a']) { + if ($table['direction'] == 'rtl' ) { $table['a'] = 'R'; } + else { $table['a'] = 'L'; } + } + + if (isset($properties['AUTOSIZE']) && $properties['AUTOSIZE'] && $this->tableLevel ==1) { + $this->shrink_this_table_to_fit = $properties['AUTOSIZE']; + if ($this->shrink_this_table_to_fit < 1) { $this->shrink_this_table_to_fit = 0; } + } + if (isset($properties['ROTATE']) && $properties['ROTATE'] && $this->tableLevel ==1) { + $this->table_rotate = $properties['ROTATE']; + } + if (isset($properties['TOPNTAIL'])) { $table['topntail'] = $properties['TOPNTAIL']; } + if (isset($properties['THEAD-UNDERLINE'])) { $table['thead-underline'] = $properties['THEAD-UNDERLINE']; } + + if (isset($properties['BORDER'])) { + $bord = $this->border_details($properties['BORDER']); + if ($bord['s']) { + $table['border'] = _BORDER_ALL; + $table['border_details']['R'] = $bord; + $table['border_details']['L'] = $bord; + $table['border_details']['T'] = $bord; + $table['border_details']['B'] = $bord; + } + } + if (isset($properties['BORDER-RIGHT'])) { + if ($table['direction'] == 'rtl') { // *RTL* + $table['border_details']['R'] = $this->border_details($properties['BORDER-LEFT']); // *RTL* + } // *RTL* + else { // *RTL* + $table['border_details']['R'] = $this->border_details($properties['BORDER-RIGHT']); + } // *RTL* + $this->setBorder($table['border'], _BORDER_RIGHT, $table['border_details']['R']['s']); + } + if (isset($properties['BORDER-LEFT'])) { + if ($table['direction'] == 'rtl') { // *RTL* + $table['border_details']['L'] = $this->border_details($properties['BORDER-RIGHT']); // *RTL* + } // *RTL* + else { // *RTL* + $table['border_details']['L'] = $this->border_details($properties['BORDER-LEFT']); + } // *RTL* + $this->setBorder($table['border'], _BORDER_LEFT, $table['border_details']['L']['s']); + } + if (isset($properties['BORDER-BOTTOM'])) { + $table['border_details']['B'] = $this->border_details($properties['BORDER-BOTTOM']); + $this->setBorder($table['border'], _BORDER_BOTTOM, $table['border_details']['B']['s']); + } + if (isset($properties['BORDER-TOP'])) { + $table['border_details']['T'] = $this->border_details($properties['BORDER-TOP']); + $this->setBorder($table['border'], _BORDER_TOP, $table['border_details']['T']['s']); + } + if ($table['border']){ + $this->table_border_css_set = 1; + } + else { + $this->table_border_css_set = 0; + } + + if (isset($properties['FONT-FAMILY'])) { + $this->default_font = $properties['FONT-FAMILY']; + $this->SetFont($this->default_font,'',0,false); + } + $this->base_table_properties['FONT-FAMILY'] = $this->FontFamily; // mPDF 5.4.10 + + if (isset($properties['FONT-SIZE'])) { + // mPDF 5.4.10 + if ($this->tableLevel>1) { $mmsize = $this->ConvertSize($properties['FONT-SIZE'], $this->base_table_properties['FONT-SIZE']); } + else { $mmsize = $this->ConvertSize($properties['FONT-SIZE'],$this->default_font_size/_MPDFK); } + if ($mmsize) { + $this->default_font_size = $mmsize*(_MPDFK); + $this->SetFontSize($this->default_font_size,false); + } + } + $this->base_table_properties['FONT-SIZE'] = $this->FontSize.'mm'; // mPDF 5.4.10 + + if (isset($properties['FONT-WEIGHT'])) { + if (strtoupper($properties['FONT-WEIGHT']) == 'BOLD') { $this->base_table_properties['FONT-WEIGHT'] = 'BOLD'; } + } + if (isset($properties['FONT-STYLE'])) { + if (strtoupper($properties['FONT-STYLE']) == 'ITALIC') { $this->base_table_properties['FONT-STYLE'] = 'ITALIC'; } + } + if (isset($properties['COLOR'])) { + $this->base_table_properties['COLOR'] = $properties['COLOR']; + } + if (isset($properties['FONT-KERNING'])) { + $this->base_table_properties['FONT-KERNING'] = $properties['FONT-KERNING']; + } + if (isset($properties['LETTER-SPACING'])) { + $this->base_table_properties['LETTER-SPACING'] = $properties['LETTER-SPACING']; + } + if (isset($properties['WORD-SPACING'])) { + $this->base_table_properties['WORD-SPACING'] = $properties['WORD-SPACING']; + } + + if (isset($properties['PADDING-LEFT'])) { + $table['padding']['L'] = $this->ConvertSize($properties['PADDING-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + if (isset($properties['PADDING-RIGHT'])) { + $table['padding']['R'] = $this->ConvertSize($properties['PADDING-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + if (isset($properties['PADDING-TOP'])) { + $table['padding']['T'] = $this->ConvertSize($properties['PADDING-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + if (isset($properties['PADDING-BOTTOM'])) { + $table['padding']['B'] = $this->ConvertSize($properties['PADDING-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + + if (isset($properties['MARGIN-TOP'])) { + if ($lastbottommargin) { + $tmp = $this->ConvertSize($properties['MARGIN-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + if ($tmp > $lastbottommargin) { $properties['MARGIN-TOP'] -= $lastbottommargin; } + else { $properties['MARGIN-TOP'] = 0; } + } + $table['margin']['T'] = $this->ConvertSize($properties['MARGIN-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + + if (isset($properties['MARGIN-BOTTOM'])) { + $table['margin']['B'] = $this->ConvertSize($properties['MARGIN-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + if (isset($properties['MARGIN-LEFT'])) { + $table['margin']['L'] = $this->ConvertSize($properties['MARGIN-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + + if (isset($properties['MARGIN-RIGHT'])) { + $table['margin']['R'] = $this->ConvertSize($properties['MARGIN-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + if (isset($properties['MARGIN-LEFT']) && isset($properties['MARGIN-RIGHT']) && strtolower($properties['MARGIN-LEFT'])=='auto' && strtolower($properties['MARGIN-RIGHT'])=='auto') { + $table['a'] = 'C'; + } + else if (isset($properties['MARGIN-LEFT']) && strtolower($properties['MARGIN-LEFT'])=='auto') { + $table['a'] = 'R'; + } + else if (isset($properties['MARGIN-RIGHT']) && strtolower($properties['MARGIN-RIGHT'])=='auto') { + $table['a'] = 'L'; + } + + if (isset($properties['LINE-HEIGHT']) && $this->tableLevel==1) { + $this->table_lineheight = $this->fixLineheight($properties['LINE-HEIGHT']); + if (!$this->table_lineheight) { $this->table_lineheight = $this->normalLineheight; } + } + + if (isset($properties['BORDER-COLLAPSE']) && strtoupper($properties['BORDER-COLLAPSE'])=='SEPARATE') { + $table['borders_separate'] = true; + } + else { + $table['borders_separate'] = false; + } + + if (!$table['borders_separate']) { $table['border_spacing_H'] = $table['border_spacing_V'] = 0; } + else if (isset($attr['CELLSPACING'])) { + $table['border_spacing_H'] = $table['border_spacing_V'] = $this->ConvertSize($attr['CELLSPACING'],$this->blk[$this->blklvl]['inner_width']); + } + if (isset($properties['BORDER-SPACING-H'])) { + $table['border_spacing_H'] = $this->ConvertSize($properties['BORDER-SPACING-H'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + if (isset($properties['BORDER-SPACING-V'])) { + $table['border_spacing_V'] = $this->ConvertSize($properties['BORDER-SPACING-V'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + + if (isset($properties['EMPTY-CELLS'])) { + $table['empty_cells'] = strtolower($properties['EMPTY-CELLS']); // 'hide' or 'show' + } + else { $table['empty_cells'] = ''; } + + if (isset($properties['PAGE-BREAK-INSIDE']) && strtoupper($properties['PAGE-BREAK-INSIDE'])=='AVOID' && $this->tableLevel==1 && !$this->writingHTMLfooter) { + $this->table_keep_together = true; + } + else if ($this->tableLevel==1) { + $this->table_keep_together = false; + } + if (isset($properties['PAGE-BREAK-AFTER']) && $this->tableLevel==1) { + $table['page_break_after'] = strtoupper($properties['PAGE-BREAK-AFTER']); + } + +/*-- BACKGROUNDS --*/ + if (isset($properties['BACKGROUND-GRADIENT']) && !$this->kwt && !$this->ColActive) { $table['gradient'] = $properties['BACKGROUND-GRADIENT']; } + + if (isset($properties['BACKGROUND-IMAGE']) && $properties['BACKGROUND-IMAGE'] && !$this->kwt && !$this->ColActive) { + $ret = $this->SetBackground($properties, $currblk['inner_width']); + if ($ret) { $table['background-image'] = $ret; } + } +/*-- END BACKGROUNDS --*/ + + if (isset($properties['OVERFLOW'])) { + $table['overflow'] = strtolower($properties['OVERFLOW']); // 'hidden' 'wrap' or 'visible' or 'auto' + if (($this->ColActive || $this->tableLevel>1) && $table['overflow']=='visible') { unset($table['overflow']); } + } + + $properties = array(); + + + + if (isset($attr['CELLPADDING'])) { + $table['cell_padding'] = $attr['CELLPADDING']; + } + else { + $table['cell_padding'] = false; + } + + if (isset($attr['BORDER']) && $attr['BORDER']=='1') { // mPDF 5.5.08 + $this->table_border_attr_set = 1; // mPDF 5.5.08 + $bord = $this->border_details('#000000 1px solid'); + if ($bord['s']) { + $table['border'] = _BORDER_ALL; + $table['border_details']['R'] = $bord; + $table['border_details']['L'] = $bord; + $table['border_details']['T'] = $bord; + $table['border_details']['B'] = $bord; + } + } + else { + $this->table_border_attr_set = 0; + } + + if ($w) { + $maxwidth = $this->blk[$this->blklvl]['inner_width']; + if ($table['borders_separate']) { + $tblblw = $table['margin']['L'] + $table['margin']['R'] + $table['border_details']['L']['w']/2 + $table['border_details']['R']['w']/2; + } + else { + $tblblw = $table['margin']['L'] + $table['margin']['R'] + $table['max_cell_border_width']['L']/2 + $table['max_cell_border_width']['R']/2; + } + if (strpos($w,'%') && $this->tableLevel == 1 && !$this->ignore_table_percents ) { + // % needs to be of inner box without table margins etc. + $maxwidth -= $tblblw ; + $wmm = $this->ConvertSize($w,$maxwidth,$this->FontSize,false); + $table['w'] = $wmm + $tblblw ; + } + if (strpos($w,'%') && $this->tableLevel > 1 && !$this->ignore_table_percents && $this->keep_table_proportions) { + $table['wpercent'] = $w + 0; // makes 80% -> 80 + } + if (!strpos($w,'%') && !$this->ignore_table_widths ) { + $wmm = $this->ConvertSize($w,$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + $table['w'] = $wmm + $tblblw ; + } + if (!$this->keep_table_proportions) { + if (isset($table['w']) && $table['w'] > $this->blk[$this->blklvl]['inner_width']) { $table['w'] = $this->blk[$this->blklvl]['inner_width']; } + } + } + + if (isset($attr['AUTOSIZE']) && $this->tableLevel==1) { + $this->shrink_this_table_to_fit = $attr['AUTOSIZE']; + if ($this->shrink_this_table_to_fit < 1) { $this->shrink_this_table_to_fit = 1; } + } + if (isset($attr['ROTATE']) && $this->tableLevel==1) { + $this->table_rotate = $attr['ROTATE']; + } + + //++++++++++++++++++++++++++++ + // keeping block together on one page + // Autosize is now forced therefore keep block together disabled + if ($this->keep_block_together) { + $this->keep_block_together = 0; + $this->printdivbuffer(); + $this->blk[$this->blklvl]['keep_block_together'] = 0; + } + if ($this->table_rotate) { + $this->tbrot_Links = array(); + $this->tbrot_Annots = array(); + $this->tbrotForms = array(); + $this->tbrot_Reference = array(); + $this->tbrot_BMoutlines = array(); + $this->tbrot_toc = array(); + } + + if ($this->kwt) { + if ($this->table_rotate) { $this->table_keep_together = true; } + $this->kwt = false; + $this->kwt_saved = true; + } + + if ($this->tableLevel==1 && $this->useGraphs) { + if (isset($attr['ID']) && $attr['ID']) { $this->currentGraphId = strtoupper($attr['ID']); } + else { $this->currentGraphId = '0'; } + $this->graphs[$this->currentGraphId] = array(); + } + //++++++++++++++++++++++++++++ + $this->plainCell_properties = array(); + unset($table); + break; + + case 'THEAD': + $this->lastoptionaltag = $tag; // Save current HTML specified optional endtag + $this->cssmgr->tbCSSlvl++; + $this->tablethead = 1; + $this->tabletfoot = 0; + $properties = $this->cssmgr->MergeCSS('TABLE',$tag,$attr); + if (isset($properties['FONT-WEIGHT'])) { + if (strtoupper($properties['FONT-WEIGHT']) == 'BOLD') { $this->thead_font_weight = 'B'; } + else { $this->thead_font_weight = ''; } + } + + if (isset($properties['FONT-STYLE'])) { + if (strtoupper($properties['FONT-STYLE']) == 'ITALIC') { $this->thead_font_style = 'I'; } + else { $this->thead_font_style = ''; } + } + if (isset($properties['FONT-VARIANT'])) { + if (strtoupper($properties['FONT-VARIANT']) == 'SMALL-CAPS') { $this->thead_font_smCaps = 'S'; } + else { $this->thead_font_smCaps = ''; } + } + + if (isset($properties['VERTICAL-ALIGN'])) { + $this->thead_valign_default = $properties['VERTICAL-ALIGN']; + } + if (isset($properties['TEXT-ALIGN'])) { + $this->thead_textalign_default = $properties['TEXT-ALIGN']; + } + $properties = array(); + break; + + case 'TFOOT': + $this->lastoptionaltag = $tag; // Save current HTML specified optional endtag + $this->cssmgr->tbCSSlvl++; + $this->tabletfoot = 1; + $this->tablethead = 0; + $properties = $this->cssmgr->MergeCSS('TABLE',$tag,$attr); + if (isset($properties['FONT-WEIGHT'])) { + if (strtoupper($properties['FONT-WEIGHT']) == 'BOLD') { $this->tfoot_font_weight = 'B'; } + else { $this->tfoot_font_weight = ''; } + } + + if (isset($properties['FONT-STYLE'])) { + if (strtoupper($properties['FONT-STYLE']) == 'ITALIC') { $this->tfoot_font_style = 'I'; } + else { $this->tfoot_font_style = ''; } + } + if (isset($properties['FONT-VARIANT'])) { + if (strtoupper($properties['FONT-VARIANT']) == 'SMALL-CAPS') { $this->tfoot_font_smCaps = 'S'; } + else { $this->tfoot_font_smCaps = ''; } + } + + if (isset($properties['VERTICAL-ALIGN'])) { + $this->tfoot_valign_default = $properties['VERTICAL-ALIGN']; + } + if (isset($properties['TEXT-ALIGN'])) { + $this->tfoot_textalign_default = $properties['TEXT-ALIGN']; + } + $properties = array(); + break; + + + case 'TBODY': + $this->tablethead = 0; + $this->tabletfoot = 0; + $this->lastoptionaltag = $tag; // Save current HTML specified optional endtag + $this->cssmgr->tbCSSlvl++; + $this->cssmgr->MergeCSS('TABLE',$tag,$attr); + break; + + + case 'TR': + $this->lastoptionaltag = $tag; // Save current HTML specified optional endtag + $this->cssmgr->tbCSSlvl++; + $this->row++; + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['nr']++; + $this->col = -1; + $properties = $this->cssmgr->MergeCSS('TABLE',$tag,$attr); + + if (!$this->simpleTables && (!isset($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['borders_separate']) || !$this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['borders_separate'])) { + if (isset($properties['BORDER-LEFT']) && $properties['BORDER-LEFT']) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trborder-left'][$this->row] = $properties['BORDER-LEFT']; } + if (isset($properties['BORDER-RIGHT']) && $properties['BORDER-RIGHT']) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trborder-right'][$this->row] = $properties['BORDER-RIGHT']; } + if (isset($properties['BORDER-TOP']) && $properties['BORDER-TOP']) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trborder-top'][$this->row] = $properties['BORDER-TOP']; } + if (isset($properties['BORDER-BOTTOM']) && $properties['BORDER-BOTTOM']) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trborder-bottom'][$this->row] = $properties['BORDER-BOTTOM']; } + } + + if (isset($properties['BACKGROUND-COLOR'])) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['bgcolor'][$this->row] = $properties['BACKGROUND-COLOR']; } + else if (isset($attr['BGCOLOR'])) $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['bgcolor'][$this->row] = $attr['BGCOLOR']; + +/*-- BACKGROUNDS --*/ + if (isset($properties['BACKGROUND-GRADIENT']) && !$this->kwt && !$this->ColActive) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trgradients'][$this->row] = $properties['BACKGROUND-GRADIENT']; } + + if (isset($properties['BACKGROUND-IMAGE']) && $properties['BACKGROUND-IMAGE'] && !$this->kwt && !$this->ColActive) { + $ret = $this->SetBackground($properties, $currblk['inner_width']); + if ($ret) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trbackground-images'][$this->row] = $ret; } + } +/*-- END BACKGROUNDS --*/ + + + if (isset($properties['TEXT-ROTATE'])) { + $this->trow_text_rotate = $properties['TEXT-ROTATE']; + } + if (isset($attr['TEXT-ROTATE'])) $this->trow_text_rotate = $attr['TEXT-ROTATE']; + + if ($this->tablethead) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['is_thead'][$this->row] = true; } + if ($this->tabletfoot) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['is_tfoot'][$this->row] = true; } + $properties = array(); + break; + + + case 'TH': + case 'TD': + $this->ignorefollowingspaces = true; + $this->lastoptionaltag = $tag; // Save current HTML specified optional endtag + $this->cssmgr->tbCSSlvl++; + $this->InlineProperties = array(); + $this->spanlvl = 0; + $this->tdbegin = true; + $this->col++; + while (isset($this->cell[$this->row][$this->col])) { $this->col++; } + + //Update number column + if ($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['nc'] < $this->col+1) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['nc'] = $this->col+1; } + + $table = &$this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]; + + $c = array('a' => false, + 'R' => false, + 'nowrap' => false, + 'bgcolor' => false, + 'padding' => array('L' => false, + 'R' => false, + 'T' => false, + 'B' => false + ) + ); + + if ($this->simpleTables && $this->row==0 && $this->col==0){ + $table['simple']['border'] = false; + $table['simple']['border_details']['R']['w'] = 0; + $table['simple']['border_details']['L']['w'] = 0; + $table['simple']['border_details']['T']['w'] = 0; + $table['simple']['border_details']['B']['w'] = 0; + $table['simple']['border_details']['R']['style'] = ''; + $table['simple']['border_details']['L']['style'] = ''; + $table['simple']['border_details']['T']['style'] = ''; + $table['simple']['border_details']['B']['style'] = ''; + } + else if (!$this->simpleTables) { + $c['border'] = false; + $c['border_details']['R']['w'] = 0; + $c['border_details']['L']['w'] = 0; + $c['border_details']['T']['w'] = 0; + $c['border_details']['B']['w'] = 0; + $c['border_details']['mbw']['BL'] = 0; + $c['border_details']['mbw']['BR'] = 0; + $c['border_details']['mbw']['RT'] = 0; + $c['border_details']['mbw']['RB'] = 0; + $c['border_details']['mbw']['TL'] = 0; + $c['border_details']['mbw']['TR'] = 0; + $c['border_details']['mbw']['LT'] = 0; + $c['border_details']['mbw']['LB'] = 0; + $c['border_details']['R']['style'] = ''; + $c['border_details']['L']['style'] = ''; + $c['border_details']['T']['style'] = ''; + $c['border_details']['B']['style'] = ''; + $c['border_details']['R']['s'] = 0; + $c['border_details']['L']['s'] = 0; + $c['border_details']['T']['s'] = 0; + $c['border_details']['B']['s'] = 0; + $c['border_details']['R']['c'] = $this->ConvertColor(0); + $c['border_details']['L']['c'] = $this->ConvertColor(0); + $c['border_details']['T']['c'] = $this->ConvertColor(0); + $c['border_details']['B']['c'] = $this->ConvertColor(0); + $c['border_details']['R']['dom'] = 0; + $c['border_details']['L']['dom'] = 0; + $c['border_details']['T']['dom'] = 0; + $c['border_details']['B']['dom'] = 0; + } + + + if ($table['va']) { $c['va'] = $table['va']; } + if ($table['txta']) { $c['a'] = $table['txta']; } + if ($this->table_border_attr_set) { + if ($table['border_details']) { + if (!$this->simpleTables){ + $c['border_details']['R'] = $table['border_details']['R']; + $c['border_details']['L'] = $table['border_details']['L']; + $c['border_details']['T'] = $table['border_details']['T']; + $c['border_details']['B'] = $table['border_details']['B']; + $c['border'] = $table['border']; + $c['border_details']['L']['dom'] = 1; + $c['border_details']['R']['dom'] = 1; + $c['border_details']['T']['dom'] = 1; + $c['border_details']['B']['dom'] = 1; + } + else if ($this->simpleTables && $this->row==0 && $this->col==0){ + $table['simple']['border_details']['R'] = $table['border_details']['R']; + $table['simple']['border_details']['L'] = $table['border_details']['L']; + $table['simple']['border_details']['T'] = $table['border_details']['T']; + $table['simple']['border_details']['B'] = $table['border_details']['B']; + $table['simple']['border'] = $table['border']; + } + } + } + // INHERITED THEAD CSS Properties + if ($this->tablethead) { + if ($this->thead_valign_default) $c['va'] = $align[strtolower($this->thead_valign_default)]; + if ($this->thead_textalign_default) $c['a'] = $align[strtolower($this->thead_textalign_default)]; + if ($this->thead_font_weight == 'B') { $this->SetStyle('B',true); } + if ($this->thead_font_style == 'I') { $this->SetStyle('I',true); } + if ($this->thead_font_smCaps == 'S') { $this->SetStyle('S',true); } + } + + // INHERITED TFOOT CSS Properties + if ($this->tabletfoot) { + if ($this->tfoot_valign_default) $c['va'] = $align[strtolower($this->tfoot_valign_default)]; + if ($this->tfoot_textalign_default) $c['a'] = $align[strtolower($this->tfoot_textalign_default)]; + if ($this->tfoot_font_weight == 'B') { $this->SetStyle('B',true); } + if ($this->tfoot_font_style == 'I') { $this->SetStyle('I',true); } + if ($this->tfoot_font_style == 'S') { $this->SetStyle('S',true); } + } + + + if ($this->trow_text_rotate){ + $c['R'] = $this->trow_text_rotate; + } + + $this->cell_border_dominance_L = 0; + $this->cell_border_dominance_R = 0; + $this->cell_border_dominance_T = 0; + $this->cell_border_dominance_B = 0; + + $properties = $this->cssmgr->MergeCSS('TABLE',$tag,$attr); + $properties = $this->cssmgr->array_merge_recursive_unique($this->base_table_properties, $properties); + + if (isset($properties['FONT-KERNING']) && (strtoupper($properties['FONT-KERNING'])=='NORMAL' || strtoupper($properties['FONT-KERNING'])=='AUTO')) { + $this->kerning = true; + } + else { $this->kerning = false; } + + if (isset($properties['LETTER-SPACING']) && ($properties['LETTER-SPACING'] || $properties['LETTER-SPACING']==='0') && strtoupper($properties['LETTER-SPACING']) != 'NORMAL') { + $this->lSpacingCSS = strtoupper($properties['LETTER-SPACING']); + $this->fixedlSpacing = $this->ConvertSize($this->lSpacingCSS,$this->FontSize); + } + else { + $this->lSpacingCSS = ''; + $this->fixedlSpacing = false; + } + if (isset($properties['WORD-SPACING']) && strtoupper($properties['WORD-SPACING']) != 'NORMAL') { + $this->wSpacingCSS = strtoupper($properties['WORD-SPACING']); + $this->minwSpacing = $this->ConvertSize($this->wSpacingCSS,$this->FontSize); + } + else { + $this->minwSpacing = 0; + $this->wSpacingCSS = ''; + } + // mPDF 5.6.08 + if (isset($properties['HYPHENS']) && $properties['HYPHENS']) { + if (strtoupper($properties['HYPHENS']) == 'NONE') { $this->textparam['hyphens'] = 2; } + else if (strtoupper($properties['HYPHENS']) == 'AUTO') { $this->textparam['hyphens'] = 1; } + else if (strtoupper($properties['HYPHENS']) == 'MANUAL') { $this->textparam['hyphens'] = 0; } + } + + if (isset($properties['BACKGROUND-COLOR'])) { $c['bgcolor'] = $properties['BACKGROUND-COLOR']; } + else if (isset($properties['BACKGROUND'])) { $c['bgcolor'] = $properties['BACKGROUND']; } + else if (isset($attr['BGCOLOR'])) $c['bgcolor'] = $attr['BGCOLOR']; + + + +/*-- BACKGROUNDS --*/ + if (isset($properties['BACKGROUND-GRADIENT'])) { $c['gradient'] = $properties['BACKGROUND-GRADIENT']; } + else { $c['gradient'] = false; } + + if (isset($properties['BACKGROUND-IMAGE']) && $properties['BACKGROUND-IMAGE'] && !$this->keep_block_together) { + $ret = $this->SetBackground($properties, $this->blk[$this->blklvl]['inner_width']); + if ($ret) { $c['background-image'] = $ret; } + } +/*-- END BACKGROUNDS --*/ + if (isset($properties['VERTICAL-ALIGN'])) { $c['va']=$align[strtolower($properties['VERTICAL-ALIGN'])]; } + else if (isset($attr['VALIGN'])) $c['va'] = $align[strtolower($attr['VALIGN'])]; + + + // mPDF 5.6.13 + if (isset($properties['TEXT-ALIGN']) && $properties['TEXT-ALIGN']) { + if (substr($properties['TEXT-ALIGN'],0,1)=='D') { $c['a'] = $properties['TEXT-ALIGN']; } + else { $c['a'] = $align[strtolower($properties['TEXT-ALIGN'])]; } + } + // mPDF 5.6.13 + if (isset($attr['ALIGN']) && $attr['ALIGN']) { + if (strtolower($attr['ALIGN']) == 'char') { + if (isset($attr['CHAR']) && $attr['CHAR']) { + $char = html_entity_decode($attr['CHAR']); + $char = strcode2utf($char); + $d = array_search($char,$this->decimal_align); + if ($d !== false) { $c['a'] = $d.'R'; } + } + else { $c['a'] = 'DPR'; } + } + else { $c['a'] = $align[strtolower($attr['ALIGN'])]; } + } + + if (!$c['a']) { + if (isset($table['direction']) && $table['direction'] == 'rtl' ) { $c['a'] = 'R'; } + else { $c['a'] = 'L'; } + } + + + if (isset($properties['TEXT-ROTATE']) && ($properties['TEXT-ROTATE'] || $properties['TEXT-ROTATE']==="0")){ + $c['R'] = $properties['TEXT-ROTATE']; + } + if (isset($properties['BORDER'])) { + $bord = $this->border_details($properties['BORDER']); + if ($bord['s']) { + if (!$this->simpleTables){ + $c['border'] = _BORDER_ALL; + $c['border_details']['R'] = $bord; + $c['border_details']['L'] = $bord; + $c['border_details']['T'] = $bord; + $c['border_details']['B'] = $bord; + $c['border_details']['L']['dom'] = $this->cell_border_dominance_L; + $c['border_details']['R']['dom'] = $this->cell_border_dominance_R; + $c['border_details']['T']['dom'] = $this->cell_border_dominance_T; + $c['border_details']['B']['dom'] = $this->cell_border_dominance_B; + } + else if ($this->simpleTables && $this->row==0 && $this->col==0){ + $table['simple']['border'] = _BORDER_ALL; + $table['simple']['border_details']['R'] = $bord; + $table['simple']['border_details']['L'] = $bord; + $table['simple']['border_details']['T'] = $bord; + $table['simple']['border_details']['B'] = $bord; + } + } + } + if (!$this->simpleTables){ + if (isset($properties['BORDER-RIGHT']) && $properties['BORDER-RIGHT']) { + $c['border_details']['R'] = $this->border_details($properties['BORDER-RIGHT']); + $this->setBorder($c['border'], _BORDER_RIGHT, $c['border_details']['R']['s']); + $c['border_details']['R']['dom'] = $this->cell_border_dominance_R; + } + if (isset($properties['BORDER-LEFT']) && $properties['BORDER-LEFT']) { + $c['border_details']['L'] = $this->border_details($properties['BORDER-LEFT']); + $this->setBorder($c['border'], _BORDER_LEFT, $c['border_details']['L']['s']); + $c['border_details']['L']['dom'] = $this->cell_border_dominance_L; + } + if (isset($properties['BORDER-BOTTOM']) && $properties['BORDER-BOTTOM']) { + $c['border_details']['B'] = $this->border_details($properties['BORDER-BOTTOM']); + $this->setBorder($c['border'], _BORDER_BOTTOM, $c['border_details']['B']['s']); + $c['border_details']['B']['dom'] = $this->cell_border_dominance_B; + } + if (isset($properties['BORDER-TOP']) && $properties['BORDER-TOP']) { + $c['border_details']['T'] = $this->border_details($properties['BORDER-TOP']); + $this->setBorder($c['border'], _BORDER_TOP, $c['border_details']['T']['s']); + $c['border_details']['T']['dom'] = $this->cell_border_dominance_T; + } + } + else if ($this->simpleTables && $this->row==0 && $this->col==0){ + if (isset($properties['BORDER-LEFT']) && $properties['BORDER-LEFT']) { + $bord = $this->border_details($properties['BORDER-LEFT']); + if ($bord['s']) { $table['simple']['border'] = _BORDER_ALL; } + else { $table['simple']['border'] = 0; } + $table['simple']['border_details']['R'] = $bord; + $table['simple']['border_details']['L'] = $bord; + $table['simple']['border_details']['T'] = $bord; + $table['simple']['border_details']['B'] = $bord; + } + } + + if ($this->simpleTables && $this->row==0 && $this->col==0 && !$table['borders_separate'] && $table['simple']['border'] ){ + $table['border_details'] = $table['simple']['border_details']; + $table['border'] = $table['simple']['border']; + } + + // Border set on TR (if collapsed only) + if (!$table['borders_separate'] && !$this->simpleTables && isset($table['trborder-left'][$this->row])) { + if ($this->col==0) { + $left = $this->border_details($table['trborder-left'][$this->row]); + $c['border_details']['L'] = $left; + $this->setBorder($c['border'], _BORDER_LEFT, $c['border_details']['L']['s']); + } + $c['border_details']['B'] = $this->border_details($table['trborder-bottom'][$this->row]); + $this->setBorder($c['border'], _BORDER_BOTTOM, $c['border_details']['B']['s']); + $c['border_details']['T'] = $this->border_details($table['trborder-top'][$this->row]); + $this->setBorder($c['border'], _BORDER_TOP, $c['border_details']['T']['s']); + } + + if ($this->packTableData && !$this->simpleTables) { + $c['borderbin'] = $this->_packCellBorder($c); + unset($c['border']); + unset($c['border_details']); + } + + if (isset($properties['PADDING-LEFT'])) { + $c['padding']['L'] = $this->ConvertSize($properties['PADDING-LEFT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + if (isset($properties['PADDING-RIGHT'])) { + $c['padding']['R'] = $this->ConvertSize($properties['PADDING-RIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + if (isset($properties['PADDING-BOTTOM'])) { + $c['padding']['B'] = $this->ConvertSize($properties['PADDING-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + if (isset($properties['PADDING-TOP'])) { + $c['padding']['T'] = $this->ConvertSize($properties['PADDING-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + + $w = ''; + if (isset($properties['WIDTH'])) { $w = $properties['WIDTH']; } + else if (isset($attr['WIDTH'])) { $w = $attr['WIDTH']; } + if ($w) { + if (strpos($w,'%') && !$this->ignore_table_percents ) { $c['wpercent'] = $w + 0; } // makes 80% -> 80 + else if (!strpos($w,'%') && !$this->ignore_table_widths ) { $c['w'] = $this->ConvertSize($w,$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + } + + if (isset($properties['HEIGHT']) && !strpos($properties['HEIGHT'],'%')) { $c['h'] = $this->ConvertSize($properties['HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + else if (isset($attr['HEIGHT']) && !strpos($attr['HEIGHT'],'%')) $c['h'] = $this->ConvertSize($attr['HEIGHT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + + + if (isset($properties['COLOR'])) { + $cor = $this->ConvertColor($properties['COLOR']); + if ($cor) { + $this->colorarray = $cor; + $this->SetTColor($cor); + } + } + if (isset($properties['FONT-FAMILY'])) { + $this->SetFont($properties['FONT-FAMILY'],'',0,false); + } + if (isset($properties['FONT-SIZE'])) { + $mmsize = $this->ConvertSize($properties['FONT-SIZE'],$this->default_font_size/_MPDFK); + if ($mmsize) { + $this->SetFontSize($mmsize*(_MPDFK),false); + } + } + $c['dfs'] = $this->FontSize; // Default Font size + if (isset($properties['FONT-WEIGHT'])) { + if (strtoupper($properties['FONT-WEIGHT']) == 'BOLD') { $this->SetStyle('B',true); } + } + if (isset($properties['FONT-STYLE'])) { + if (strtoupper($properties['FONT-STYLE']) == 'ITALIC') { $this->SetStyle('I',true); } + } + if (isset($properties['FONT-VARIANT'])) { + if (strtoupper($properties['FONT-VARIANT']) == 'SMALL-CAPS') { $this->SetStyle('S',true); } + } + if (isset($properties['TEXT-DECORATION'])) { + if (strtoupper($properties['TEXT-DECORATION']) == 'LINE-THROUGH') { $this->strike = true; } + else if (strtoupper($properties['TEXT-DECORATION']) == 'UNDERLINE') { $this->SetStyle('U',true); } + } + if (isset($properties['TEXT-SHADOW'])) { + $ts = $this->cssmgr->setCSStextshadow($properties['TEXT-SHADOW']); + if ($ts) { $this->textshadow = $ts; } + } + if (isset($properties['TEXT-TRANSFORM'])) { + if (strtoupper($properties['TEXT-TRANSFORM']) == 'CAPITALIZE') { $this->capitalize = true; } + else if (strtoupper($properties['TEXT-TRANSFORM']) == 'UPPERCASE') { $this->toupper = true; } + else if (strtoupper($properties['TEXT-TRANSFORM']) == 'LOWERCASE') { $this->tolower = true; } + } + if (isset($properties['WHITE-SPACE'])) { + if (strtoupper($properties['WHITE-SPACE']) == 'NOWRAP') { $c['nowrap']= 1; } + } + $properties = array(); + + if (isset($attr['TEXT-ROTATE'])) { + $c['R'] = $attr['TEXT-ROTATE']; + } + if (isset($attr['NOWRAP']) && $attr['NOWRAP']) $c['nowrap']= 1; + + $this->cell[$this->row][$this->col] = $c; + unset($c); + $this->cell[$this->row][$this->col]['s'] = 0 ; + + $cs = $rs = 1; + if (isset($attr['COLSPAN']) && $attr['COLSPAN']>1) $cs = $this->cell[$this->row][$this->col]['colspan'] = $attr['COLSPAN']; + if ($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['nc'] < $this->col+$cs) { + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['nc'] = $this->col+$cs; + } // following code moved outside if... + for($l=$this->col; $l < $this->col+$cs ;$l++) { + if ($l-$this->col) $this->cell[$this->row][$l] = 0; + } + if (isset($attr['ROWSPAN']) && $attr['ROWSPAN']>1) $rs = $this->cell[$this->row][$this->col]['rowspan'] = $attr['ROWSPAN']; + for ($k=$this->row ; $k < $this->row+$rs ;$k++) { + for($l=$this->col; $l < $this->col+$cs ;$l++) { + if ($k-$this->row || $l-$this->col) $this->cell[$k][$l] = 0; + } + } + unset($table); + break; +/*-- END TABLES --*/ + + +/*-- LISTS --*/ + // *********** LISTS ******************** + case 'OL': + case 'UL': + $this->listjustfinished = false; + + if ($this->blockjustfinished && !count($this->textbuffer) && $this->y != $this->tMargin && $this->collapseBlockMargins) { $lastbottommargin = $this->lastblockbottommargin; } + else { $lastbottommargin = 0; } + $this->lastblockbottommargin = 0; + $this->blockjustfinished=false; + + $this->linebreakjustfinished=false; + $this->lastoptionaltag = ''; // Save current HTML specified optional endtag + $this->cssmgr->listCSSlvl++; + if((!$this->tableLevel) && ($this->listlvl == 0)) { + $blockstate = 0; + //if ($this->lastblocklevelchange == 1) { $blockstate = -1; } // Top margins/padding only + //else if ($this->lastblocklevelchange < 1) { $blockstate = 0; } // NO margins/padding + // called from block after new div e.g. <div> ... <ol> ... Outputs block top margin/border and padding + if (count($this->textbuffer) == 0 && $this->lastblocklevelchange == 1 && !$this->tableLevel && !$this->kwt) { + $this->newFlowingBlock( $this->blk[$this->blklvl]['width'],$this->lineheight,'',false,false,1,true, $this->blk[$this->blklvl]['direction']); + $this->finishFlowingBlock(true); // true = END of flowing block + } + else if (count($this->textbuffer)) { $this->printbuffer($this->textbuffer,$blockstate); } + $this->textbuffer=array(); + $this->lastblocklevelchange = -1; + } + // ol and ul types are mixed here + if ($this->listlvl == 0) { + $this->list_indent = array(); + $this->list_align = array(); + $this->list_lineheight = array(); + $this->InlineProperties['LIST'] = array(); + $this->InlineProperties['LISTITEM'] = array(); + } + +/*-- TABLES --*/ + // A simple list for inside a table + if($this->tableLevel) { + $this->list_indent[$this->listlvl] = 0; // mm default indent for each level + if ($tag == 'OL') $this->listtype = '1'; + else if ($tag == 'UL') $this->listtype = 'disc'; + if ($this->listlvl > 0) { + $this->listlist[$this->listlvl]['MAXNUM'] = $this->listnum; //save previous lvl's maxnum + } + $this->listlvl++; + // mPDF 5.6.15 + if (isset($attr['START'])) { $this->listnum = intval($attr['START']); } + else { $this->listnum = 0; } + $this->listlist[$this->listlvl] = array('TYPE'=>$this->listtype,'MAXNUM'=>$this->listnum); + break; + } +/*-- END TABLES --*/ + + + if (($this->PDFA || $this->PDFX) && $tag == 'UL') { + if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "List bullets cannot use core font Zapfdingbats in PDFA1-b or PDFX/1-a. (Substitute characters from current font used if available, otherwise substitutes hyphen '-')"; } + } + + if ($this->cssmgr->listCSSlvl==1) { + $properties = $this->cssmgr->MergeCSS('TOPLIST',$tag,$attr); + } + else { + $properties = $this->cssmgr->MergeCSS('LIST',$tag,$attr); + } + if (!empty($properties)) $this->setCSS($properties,'LIST'); + // List-type + + $this->listtype = ''; + if (isset($properties['LIST-STYLE-TYPE'])) { + $this->listtype = $this->_getListStyle($properties['LIST-STYLE-TYPE']); + } + else if (isset($properties['LIST-STYLE'])) { + $this->listtype = $this->_getListStyle($properties['LIST-STYLE']); + } + else if (isset($attr['TYPE']) && $attr['TYPE']) { $this->listtype = $attr['TYPE']; } + if (!$this->listtype) { + if ($tag == 'OL') $this->listtype = '1'; + if ($tag == 'UL') { + if ($this->listlvl % 3 == 0) $this->listtype = 'disc'; + elseif ($this->listlvl % 3 == 1) $this->listtype = 'circle'; + else $this->listtype = 'square'; + } + } + if ($this->listlvl == 0) { + $this->inherit_lineheight = 0; + $this->listlvl++; // first depth level + // mPDF 5.6.15 + if (isset($attr['START'])) { $this->listnum = intval($attr['START']); } + else { $this->listnum = 0; } + $this->listDir = (isset($this->blk[$this->blklvl]['direction']) ? $this->blk[$this->blklvl]['direction'] : null); + $occur = $this->listoccur[$this->listlvl] = 1; + $this->listlist[$this->listlvl][1] = array('TYPE'=>$this->listtype,'MAXNUM'=>$this->listnum); + } + else { + if (!empty($this->textbuffer)) + { + $this->listitem[] = array($this->listlvl,$this->listnum,$this->textbuffer,$this->listoccur[$this->listlvl],$this->listitemtype); + $this->listnum++; + } + // Save current lineheight to inherit + $this->textbuffer = array(); + $occur = $this->listoccur[$this->listlvl]; + $this->listlist[$this->listlvl][$occur]['MAXNUM'] = $this->listnum; //save previous lvl's maxnum + $this->listlvl++; + // mPDF 5.6.15 + if (isset($attr['START'])) { $this->listnum = intval($attr['START']); } + else { $this->listnum = 0; } + + + if (!isset($this->listoccur[$this->listlvl]) || $this->listoccur[$this->listlvl] == 0) $this->listoccur[$this->listlvl] = 1; + else $this->listoccur[$this->listlvl]++; + $occur = $this->listoccur[$this->listlvl]; + $this->listlist[$this->listlvl][$occur] = array('TYPE'=>$this->listtype,'MAXNUM'=>$this->listnum); + } + + + // TOP LEVEL ONLY + if ($this->listlvl == 1) { + if (isset($properties['MARGIN-TOP'])) { + if ($lastbottommargin) { + $tmp = $this->ConvertSize($properties['MARGIN-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + if ($tmp > $lastbottommargin) { $properties['MARGIN-TOP'] -= $lastbottommargin; } + else { $properties['MARGIN-TOP'] = 0; } + } + $this->DivLn($this->ConvertSize($properties['MARGIN-TOP'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false),$this->blklvl,true,1); // collapsible + } + if (isset($properties['MARGIN-BOTTOM'])) { + $this->list_margin_bottom = $this->ConvertSize($properties['MARGIN-BOTTOM'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); + } + + if (isset($this->blk[$this->blklvl]['line_height'])) { + $this->list_lineheight[$this->listlvl][$occur] = $this->blk[$this->blklvl]['line_height']; + } + + if (isset($properties['DIRECTION']) && $properties['DIRECTION']) { $this->listDir = strtolower($properties['DIRECTION']); } + else if (isset($attr['DIR']) && $attr['DIR']) { $this->listDir = strtolower($attr['DIR']); } + + } + $this->list_indent[$this->listlvl][$occur] = 5; // mm default indent for each level + if (isset($properties['TEXT-INDENT'])) { $this->list_indent[$this->listlvl][$occur] = $this->ConvertSize($properties['TEXT-INDENT'],$this->blk[$this->blklvl]['inner_width'],$this->FontSize,false); } + + if (isset($properties['TEXT-ALIGN'])) { + $this->list_align[$this->listlvl][$occur] = $align[strtolower($properties['TEXT-ALIGN'])]; + } + + + if (isset($properties['LINE-HEIGHT'])) { + $this->list_lineheight[$this->listlvl][$occur] = $this->fixLineheight($properties['LINE-HEIGHT']); + } + else if ($this->listlvl>1 && isset($this->list_lineheight[($this->listlvl - 1)][1])) { + $this->list_lineheight[$this->listlvl][$occur] = end($this->list_lineheight[($this->listlvl - 1)]); + } + if (!isset($this->list_lineheight[$this->listlvl][$occur]) || !$this->list_lineheight[$this->listlvl][$occur]) { + $this->list_lineheight[$this->listlvl][$occur] = $this->normalLineheight; + } + + $this->InlineProperties['LIST'][$this->listlvl][$occur] = $this->saveInlineProperties(); + $properties = array(); + break; + + + + case 'LI': + // Start Block + $this->lastoptionaltag = $tag; // Save current HTML specified optional endtag + $this->ignorefollowingspaces = true; //Eliminate exceeding left-side spaces +/*-- TABLES --*/ + // A simple list for inside a table + if($this->tableLevel) { + $this->blockjustfinished=false; + + // If already something in the Cell + if ((isset($this->cell[$this->row][$this->col]['maxs']) && $this->cell[$this->row][$this->col]['maxs'] > 0 ) || $this->cell[$this->row][$this->col]['s'] > 0 ) { + $this->_saveCellTextBuffer("\n"); + if (!isset($this->cell[$this->row][$this->col]['maxs'])) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + elseif($this->cell[$this->row][$this->col]['maxs'] < $this->cell[$this->row][$this->col]['s']) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + $this->cell[$this->row][$this->col]['s'] = 0 ; + } + if ($this->listlvl == 0) { //in case of malformed HTML code. Example:(...)</p><li>Content</li><p>Paragraph1</p>(...) + $this->listlvl++; // first depth level + $this->listnum = 0; // reset + $this->listlist[$this->listlvl] = array('TYPE'=>'disc','MAXNUM'=>$this->listnum); + } + + $this->listnum++; + switch($this->listlist[$this->listlvl]['TYPE']) { + case 'A': + $blt = $this->dec2alpha($this->listnum,true).$this->list_number_suffix; + break; + case 'a': + $blt = $this->dec2alpha($this->listnum,false).$this->list_number_suffix; + break; + case 'I': + $blt = $this->dec2roman($this->listnum,true).$this->list_number_suffix; + break; + case 'i': + $blt = $this->dec2roman($this->listnum,false).$this->list_number_suffix; + break; + case '1': + $blt = $this->listnum.$this->list_number_suffix; + break; + default: + if ($this->listlvl % 3 == 1 && $this->_charDefined($this->CurrentFont['cw'],8226)) { $blt = "\xe2\x80\xa2"; } // &#8226; + else if ($this->listlvl % 3 == 2 && $this->_charDefined($this->CurrentFont['cw'],9900)) { $blt = "\xe2\x9a\xac"; } // &#9900; + else if ($this->listlvl % 3 == 0 && $this->_charDefined($this->CurrentFont['cw'],9642)) { $blt = "\xe2\x96\xaa"; } // &#9642; + else { $blt = '-'; } + break; + } + + // change to &nbsp; spaces + if ($this->usingCoreFont) { + $ls = str_repeat(chr(160).chr(160),($this->listlvl-1)*2) . $blt . ' '; + } + else { + $ls = str_repeat("\xc2\xa0\xc2\xa0",($this->listlvl-1)*2) . $blt . ' '; + } + + $this->_saveCellTextBuffer($ls, $this->HREF); + $this->cell[$this->row][$this->col]['s'] += $this->GetStringWidth($ls); + break; + } +/*-- END TABLES --*/ + //Observation: </LI> is ignored + if ($this->listlvl == 0) { //in case of malformed HTML code. Example:(...)</p><li>Content</li><p>Paragraph1</p>(...) + //First of all, skip a line + $this->listlvl++; // first depth level + $this->listnum = 0; // reset + $this->listoccur[$this->listlvl] = 1; + $this->listlist[$this->listlvl][1] = array('TYPE'=>'disc','MAXNUM'=>$this->listnum); + } + if ($this->listnum == 0) { + $this->listnum++; + $this->textbuffer = array(); + } + else { + if (!empty($this->textbuffer)) { + if (!$this->listjustfinished) { + $this->listitem[] = array($this->listlvl,$this->listnum,$this->textbuffer,$this->listoccur[$this->listlvl],$this->listitemtype); + $this->listnum++; + } + else { + $this->listitem[] = array($this->listlvl,$this->listnum,$this->textbuffer,$this->listoccur[$this->listlvl],$this->listitemtype, true); + } + } + $this->textbuffer = array(); + } + $this->listjustfinished = false; + + $this->cssmgr->listCSSlvl++; + $properties = $this->cssmgr->MergeCSS('LIST',$tag,$attr); + if (!empty($properties)) $this->setCSS($properties,'LIST'); + $this->InlineProperties['LISTITEM'][$this->listlvl][$this->listoccur[$this->listlvl]][$this->listnum] = $this->saveInlineProperties(); + + // List-type + if (isset($properties['LIST-STYLE-TYPE'])) { + $this->listitemtype = $this->_getListStyle($properties['LIST-STYLE-TYPE']); + } + else if (isset($properties['LIST-STYLE'])) { + $this->listitemtype = $this->_getListStyle($properties['LIST-STYLE']); + } + else if (isset($attr['TYPE']) && $attr['TYPE']) { $this->listitemtype = $attr['TYPE']; } + else $this->listitemtype = ''; + break; +/*-- END LISTS --*/ + + }//end of switch +} + +/*-- LISTS --*/ + +function _getListStyle($ls) { + if (stristr($ls,'decimal')) { return '1'; } +/* CSS3 list-styles numeric (selected) + I added tamil +arabic-indic | bengali | devanagari | gujarati | gurmukhi | kannada | malayalam | oriya | persian | telugu | thai | urdu +*/ + else if (preg_match('/(disc|circle|square|arabic-indic|bengali|devanagari|gujarati|gurmukhi|kannada|malayalam|oriya|persian|tamil|telugu|thai|urdu)/i',$ls,$m)) { + return strtolower(trim($m[1])); + } + else if (stristr($ls,'lower-roman')) { return 'i'; } + else if (stristr($ls,'upper-roman')) { return 'I'; } + else if (stristr($ls,'lower-latin')|| stristr($ls,'lower-alpha')) { return 'a'; } + else if (stristr($ls,'upper-latin') || stristr($ls,'upper-alpha')) { return 'A'; } + else if (stristr($ls,'none')) { return 'none'; } + else if (preg_match('/U\+([a-fA-F0-9]+)/i',$ls)) { return $ls; } + else { return ''; } +} +/*-- END LISTS --*/ + + + +function CloseTag($tag) +{ + $this->ignorefollowingspaces = false; //Eliminate exceeding left-side spaces + //Closing tag + if($tag=='OPTION') { $this->selectoption['ACTIVE'] = false; $this->lastoptionaltag = ''; } + + if($tag=='TTS' or $tag=='TTA' or $tag=='TTZ') { + if ($this->InlineProperties[$tag]) { $this->restoreInlineProperties($this->InlineProperties[$tag]); } + unset($this->InlineProperties[$tag]); + $ltag = strtolower($tag); + $this->$ltag = false; + } + + + if($tag=='FONT' || $tag=='SPAN' || $tag=='CODE' || $tag=='KBD' || $tag=='SAMP' || $tag=='TT' || $tag=='VAR' + || $tag=='INS' || $tag=='STRONG' || $tag=='CITE' || $tag=='SUB' || $tag=='SUP' || $tag=='S' || $tag=='STRIKE' || $tag=='DEL' + || $tag=='Q' || $tag=='EM' || $tag=='B' || $tag=='I' || $tag=='U' | $tag=='SMALL' || $tag=='BIG' || $tag=='ACRONYM' + || $tag=='MARK' || $tag=='TIME' || $tag=='PROGRESS' || $tag=='METER' + ) { // mPDF 5.5.09 + + if ($tag == 'SPAN') { + if (isset($this->InlineProperties['SPAN'][$this->spanlvl]) && $this->InlineProperties['SPAN'][$this->spanlvl]) { $this->restoreInlineProperties($this->InlineProperties['SPAN'][$this->spanlvl]); } + unset($this->InlineProperties['SPAN'][$this->spanlvl]); + if (isset($this->InlineAnnots['SPAN'][$this->spanlvl]) && $this->InlineAnnots['SPAN'][$this->spanlvl]) { $annot = $this->InlineAnnots['SPAN'][$this->spanlvl]; } // *ANNOTATIONS* + unset($this->InlineAnnots['SPAN'][$this->spanlvl]); // *ANNOTATIONS* + $this->spanlvl--; + } + else { + if (isset($this->InlineProperties[$tag]) && $this->InlineProperties[$tag]) { $this->restoreInlineProperties($this->InlineProperties[$tag]); } + unset($this->InlineProperties[$tag]); + if (isset($this->InlineAnnots[$tag]) && $this->InlineAnnots[$tag]) { $annot = $this->InlineAnnots[$tag]; } // *ANNOTATIONS* + unset($this->InlineAnnots[$tag]); // *ANNOTATIONS* + } + +/*-- ANNOTATIONS --*/ + if (isset($annot)) { + if($this->tableLevel) { // *TABLES* + $this->cell[$this->row][$this->col]['textbuffer'][] = array($annot); // *TABLES* + } // *TABLES* + else { // *TABLES* + $this->textbuffer[] = array($annot); + } // *TABLES* + } +/*-- END ANNOTATIONS --*/ + } + + if($tag=='METER' || $tag=='PROGRESS') { + $this->inMeter = false; // mPDF 5.5.09 + } + + + if($tag=='A') { + $this->HREF=''; + if (isset($this->InlineProperties['A'])) { $this->restoreInlineProperties($this->InlineProperties['A']); } + unset($this->InlineProperties['A']); + } + + if($tag=='LEGEND') { // mPDF 5.4.18 + if (count($this->textbuffer) && !$this->tableLevel) { + $leg = $this->textbuffer[(count($this->textbuffer)-1)]; + unset($this->textbuffer[(count($this->textbuffer)-1)]); + $this->textbuffer = array_values($this->textbuffer); + $this->blk[$this->blklvl]['border_legend'] = $leg; + $this->blk[$this->blklvl]['margin_top'] += ($leg[11]/2)/_MPDFK; + $this->blk[$this->blklvl]['padding_top'] += ($leg[11]/2)/_MPDFK; + } + if (isset($this->InlineProperties['LEGEND'])) { $this->restoreInlineProperties($this->InlineProperties['LEGEND']); } + unset($this->InlineProperties['LEGEND']); + $this->ignorefollowingspaces = true; //Eliminate exceeding left-side spaces + } + + + +/*-- FORMS --*/ + // *********** FORM ELEMENTS ******************** + + if($tag=='TEXTAREA') { + $this->specialcontent = ''; + if ($this->InlineProperties[$tag]) { $this->restoreInlineProperties($this->InlineProperties[$tag]); } + unset($this->InlineProperties[$tag]); + } + + + if($tag=='SELECT') { + $this->lastoptionaltag = ''; + $texto = ''; + if (isset($this->selectoption['SELECTED'])) { $texto = $this->selectoption['SELECTED']; } + + if ($this->useActiveForms) { $w = $this->selectoption['MAXWIDTH']; } + else { $w = $this->GetStringWidth($texto); } + if ($w == 0) { $w = 5; } + $objattr['type'] = 'select'; + $objattr['text'] = $texto; + if (isset($this->selectoption['NAME'])) { $objattr['fieldname'] = $this->selectoption['NAME']; } + if (isset($this->selectoption['READONLY'])) { $objattr['readonly'] = true; } + if (isset($this->selectoption['REQUIRED'])) { $objattr['required'] = true; } + if (isset($this->selectoption['SPELLCHECK'])) { $objattr['spellcheck'] = true; } + if (isset($this->selectoption['EDITABLE'])) { $objattr['editable'] = true; } + if (isset($this->selectoption['ONCHANGE'])) { $objattr['onChange'] = $this->selectoption['ONCHANGE']; } + if (isset($this->selectoption['ITEMS'])) { $objattr['items'] = $this->selectoption['ITEMS']; } + if (isset($this->selectoption['MULTIPLE'])) { $objattr['multiple'] = $this->selectoption['MULTIPLE']; } + if (isset($this->selectoption['DISABLED'])) { $objattr['disabled'] = $this->selectoption['DISABLED']; } + if (isset($this->selectoption['TITLE'])) { $objattr['title'] = $this->selectoption['TITLE']; } + if (isset($this->selectoption['COLOR'])) { $objattr['color'] = $this->selectoption['COLOR']; } + if (isset($this->selectoption['SIZE'])) { $objattr['size'] = $this->selectoption['SIZE']; } + if (isset($objattr['size']) && $objattr['size']>1) { $rows=$objattr['size']; } else { $rows = 1; } + + $objattr['fontfamily'] = $this->FontFamily; + $objattr['fontsize'] = $this->FontSizePt; + + $objattr['width'] = $w + ($this->form->form_element_spacing['select']['outer']['h']*2)+($this->form->form_element_spacing['select']['inner']['h']*2) + ($this->FontSize*1.4); + $objattr['height'] = ($this->FontSize*$rows) + ($this->form->form_element_spacing['select']['outer']['v']*2)+($this->form->form_element_spacing['select']['inner']['v']*2); + $e = "\xbb\xa4\xactype=select,objattr=".serialize($objattr)."\xbb\xa4\xac"; + + // Clear properties - tidy up + $properties = array(); + + // Output it to buffers + if ($this->tableLevel) { // *TABLES* + $this->_saveCellTextBuffer($e, $this->HREF); + $this->cell[$this->row][$this->col]['s'] += $objattr['width'] ; // *TABLES* + } // *TABLES* + else { // *TABLES* + $this->_saveTextBuffer($e, $this->HREF); + } // *TABLES* + + $this->selectoption = array(); + $this->specialcontent = ''; + + if ($this->InlineProperties[$tag]) { $this->restoreInlineProperties($this->InlineProperties[$tag]); } + unset($this->InlineProperties[$tag]); + + } +/*-- END FORMS --*/ + + + // *********** BLOCKS ******************** + // mPDF 5.4.18 + if($tag=='P' || $tag=='DIV' || $tag=='H1' || $tag=='H2' || $tag=='H3' || $tag=='H4' || $tag=='H5' || $tag=='H6' || $tag=='PRE' + || $tag=='FORM' || $tag=='ADDRESS' || $tag=='BLOCKQUOTE' || $tag=='CENTER' || $tag=='DT' || $tag=='DD' || $tag=='DL' + || $tag=='CAPTION' || $tag=='FIELDSET' + || $tag=='ARTICLE' || $tag=='ASIDE' || $tag=='FIGURE' || $tag=='FIGCAPTION' || $tag=='FOOTER' || $tag=='HEADER' || $tag=='HGROUP' + || $tag=='NAV' || $tag=='SECTION' || $tag=='DETAILS' || $tag=='SUMMARY' + ) { // mPDF 5.5.09 // mPDF 5.5.22 + + $this->ignorefollowingspaces = true; //Eliminate exceeding left-side spaces + $this->blockjustfinished=true; + + $this->lastblockbottommargin = $this->blk[$this->blklvl]['margin_bottom']; +/*-- LISTS --*/ + if ($this->listlvl>0) { return; } +/*-- END LISTS --*/ + + // mPDF 5.6.34 + if (preg_match('/^H\d/',$tag) && !$this->tableLevel && !$this->writingToC) { // mPDF 5.6.38 + if (isset($this->h2toc[$tag]) || isset($this->h2bookmarks[$tag])) { + $content = ''; + if (count($this->textbuffer)==1) { $content = $this->textbuffer[0][0]; } + else { + for ($i=0;$i<count($this->textbuffer);$i++) { + if (substr($this->textbuffer[$i][0],0,3) != "\xbb\xa4\xac") { //inline object + $content .= $this->textbuffer[$i][0]; + } + } + } +/*-- TOC --*/ + if (isset($this->h2toc[$tag])) { + $objattr = array(); + $objattr['type'] = 'toc'; + $objattr['toclevel'] = $this->h2toc[$tag]; + $objattr['CONTENT'] = htmlspecialchars($content); // mPDF 5.6.37 + $e = "\xbb\xa4\xactype=toc,objattr=".serialize($objattr)."\xbb\xa4\xac"; + array_unshift($this->textbuffer,array($e)); + } +/*-- END TOC --*/ +/*-- BOOKMARKS --*/ + if (isset($this->h2bookmarks[$tag])) { + $objattr = array(); + $objattr['type'] = 'bookmark'; + $objattr['bklevel'] = $this->h2bookmarks[$tag]; + $objattr['CONTENT'] = $content; + $e = "\xbb\xa4\xactype=toc,objattr=".serialize($objattr)."\xbb\xa4\xac"; + array_unshift($this->textbuffer,array($e)); + } +/*-- END BOOKMARKS --*/ + } + } + +/*-- TABLES --*/ + if($this->tableLevel) { + if ($this->linebreakjustfinished) { $this->blockjustfinished=false; } + if (isset($this->InlineProperties['BLOCKINTABLE'])) { + if ($this->InlineProperties['BLOCKINTABLE']) { $this->restoreInlineProperties($this->InlineProperties['BLOCKINTABLE']); } + unset($this->InlineProperties['BLOCKINTABLE']); + } + if($tag=='PRE') { $this->ispre=false; } + return; + } +/*-- END TABLES --*/ + $this->lastoptionaltag = ''; + $this->divbegin=false; + + $this->linebreakjustfinished=false; + + $this->x = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin']; + +/*-- CSS-FLOAT --*/ + // If float contained in a float, need to extend bottom to allow for it + $currpos = $this->page*1000 + $this->y; + if (isset($this->blk[$this->blklvl]['float_endpos']) && $this->blk[$this->blklvl]['float_endpos'] > $currpos) { + $old_page = $this->page; + $new_page = intval($this->blk[$this->blklvl]['float_endpos'] /1000); + if ($old_page != $new_page) { + $s = $this->PrintPageBackgrounds(); + // Writes after the marker so not overwritten later by page background etc. + $this->pages[$this->page] = preg_replace('/(___BACKGROUND___PATTERNS'.date('jY').')/', '\\1'."\n".$s."\n", $this->pages[$this->page]); + $this->pageBackgrounds = array(); + $this->page = $new_page; + $this->ResetMargins(); + $this->Reset(); + $this->pageoutput[$this->page] = array(); + } + $this->y = (($this->blk[$this->blklvl]['float_endpos'] *1000) % 1000000)/1000; // mod changes operands to integers before processing + } +/*-- END CSS-FLOAT --*/ + + + //Print content + if ($this->lastblocklevelchange == 1) { $blockstate = 3; } // Top & bottom margins/padding + else if ($this->lastblocklevelchange == -1) { $blockstate = 2; } // Bottom margins/padding only + else { $blockstate = 0; } + // called from after e.g. </table> </div> </div> ... Outputs block margin/border and padding + if (count($this->textbuffer) && $this->textbuffer[count($this->textbuffer)-1]) { + if (substr($this->textbuffer[count($this->textbuffer)-1][0],0,3) != "\xbb\xa4\xac") { // not special content + if ($this->usingCoreFont) { + $this->textbuffer[count($this->textbuffer)-1][0] = preg_replace('/[ ]+$/', '', $this->textbuffer[count($this->textbuffer)-1][0]); + } + else { + $this->textbuffer[count($this->textbuffer)-1][0] = preg_replace('/[ ]+$/u', '', $this->textbuffer[count($this->textbuffer)-1][0]); } + } + } + + if (count($this->textbuffer) == 0 && $this->lastblocklevelchange != 0) { + //$this->newFlowingBlock( $this->blk[$this->blklvl]['width'],$this->lineheight,'',false,false,2,true, $this->blk[$this->blklvl]['direction']); + $this->newFlowingBlock( $this->blk[$this->blklvl]['width'],$this->lineheight,'',false,false,$blockstate,true, $this->blk[$this->blklvl]['direction']); + $this->finishFlowingBlock(true); // true = END of flowing block + $this->PaintDivBB('',$blockstate); + } + else { + $this->printbuffer($this->textbuffer,$blockstate); + } + + + $this->textbuffer=array(); + + if ($this->blk[$this->blklvl]['keep_block_together']) { + $this->printdivbuffer(); + } + + if ($this->kwt) { + $this->kwt_height = $this->y - $this->kwt_y0; + } + +/*-- CSS-IMAGE-FLOAT --*/ + $this->printfloatbuffer(); +/*-- END CSS-IMAGE-FLOAT --*/ + + if($tag=='PRE') { $this->ispre=false; } + +/*-- CSS-FLOAT --*/ + if ($this->blk[$this->blklvl]['float'] == 'R') { + // If width not set, here would need to adjust and output buffer + $s = $this->PrintPageBackgrounds(); + // Writes after the marker so not overwritten later by page background etc. + $this->pages[$this->page] = preg_replace('/(___BACKGROUND___PATTERNS'.date('jY').')/', '\\1'."\n".$s."\n", $this->pages[$this->page]); + $this->pageBackgrounds = array(); + $this->Reset(); + $this->pageoutput[$this->page] = array(); + + for($i=($this->blklvl-1); $i >= 0; $i--) { + if (isset($this->blk[$i]['float_endpos'])) { $this->blk[$i]['float_endpos'] = max($this->blk[$i]['float_endpos'], ($this->page*1000 + $this->y)); } + else { $this->blk[$i]['float_endpos'] = $this->page*1000 + $this->y; } + } + + $this->floatDivs[] = array( + 'side'=>'R', + 'startpage'=>$this->blk[$this->blklvl]['startpage'] , + 'y0'=>$this->blk[$this->blklvl]['float_start_y'] , + 'startpos'=> ($this->blk[$this->blklvl]['startpage']*1000 + $this->blk[$this->blklvl]['float_start_y']), + 'endpage'=>$this->page , + 'y1'=>$this->y , + 'endpos'=> ($this->page*1000 + $this->y), + 'w'=> $this->blk[$this->blklvl]['float_width'], + 'blklvl'=>$this->blklvl, + 'blockContext' => $this->blk[$this->blklvl-1]['blockContext'] + ); + + $this->y = $this->blk[$this->blklvl]['float_start_y'] ; + $this->page = $this->blk[$this->blklvl]['startpage'] ; + $this->ResetMargins(); + $this->pageoutput[$this->page] = array(); + } + if ($this->blk[$this->blklvl]['float'] == 'L') { + // If width not set, here would need to adjust and output buffer + $s = $this->PrintPageBackgrounds(); + // Writes after the marker so not overwritten later by page background etc. + $this->pages[$this->page] = preg_replace('/(___BACKGROUND___PATTERNS'.date('jY').')/', '\\1'."\n".$s."\n", $this->pages[$this->page]); + $this->pageBackgrounds = array(); + $this->Reset(); + $this->pageoutput[$this->page] = array(); + + for($i=($this->blklvl-1); $i >= 0; $i--) { + if (isset($this->blk[$i]['float_endpos'])) { $this->blk[$i]['float_endpos'] = max($this->blk[$i]['float_endpos'], ($this->page*1000 + $this->y)); } + else { $this->blk[$i]['float_endpos'] = $this->page*1000 + $this->y; } + } + + $this->floatDivs[] = array( + 'side'=>'L', + 'startpage'=>$this->blk[$this->blklvl]['startpage'] , + 'y0'=>$this->blk[$this->blklvl]['float_start_y'] , + 'startpos'=> ($this->blk[$this->blklvl]['startpage']*1000 + $this->blk[$this->blklvl]['float_start_y']), + 'endpage'=>$this->page , + 'y1'=>$this->y , + 'endpos'=> ($this->page*1000 + $this->y), + 'w'=> $this->blk[$this->blklvl]['float_width'], + 'blklvl'=>$this->blklvl, + 'blockContext' => $this->blk[$this->blklvl-1]['blockContext'] + ); + + $this->y = $this->blk[$this->blklvl]['float_start_y'] ; + $this->page = $this->blk[$this->blklvl]['startpage'] ; + $this->ResetMargins(); + $this->pageoutput[$this->page] = array(); + } +/*-- END CSS-FLOAT --*/ + + if (isset($this->blk[$this->blklvl]['visibility']) && $this->blk[$this->blklvl]['visibility']!='visible') { + $this->SetVisibility('visible'); + } + + if (isset($this->blk[$this->blklvl]['page_break_after'])) { $page_break_after = $this->blk[$this->blklvl]['page_break_after']; } + else { $page_break_after = ''; } + + //Reset values + $this->Reset(); + + // mPDF 5.6.01 - LAYERS + if (isset($this->blk[$this->blklvl]['z-index']) && $this->blk[$this->blklvl]['z-index'] > 0) { + $this->EndLayer(); + } + + if ($this->blklvl > 0) { // ==0 SHOULDN'T HAPPEN - NOT XHTML + if ($this->blk[$this->blklvl]['tag'] == $tag) { + unset($this->blk[$this->blklvl]); + $this->blklvl--; + } + //else { echo $tag; exit; } // debug - forces error if incorrectly nested html tags + } + + $this->lastblocklevelchange = -1 ; + // Reset Inline-type properties + if (isset($this->blk[$this->blklvl]['InlineProperties'])) { $this->restoreInlineProperties($this->blk[$this->blklvl]['InlineProperties']); } + + $this->x = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin']; + + if ($page_break_after) { + $save_blklvl = $this->blklvl; + $save_blk = $this->blk; + $save_silp = $this->saveInlineProperties(); + $save_spanlvl = $this->spanlvl; + $save_ilp = $this->InlineProperties; + if ($this->blklvl>1) { + // Close any open block tags + for ($b= $this->blklvl;$b>0;$b--) { $this->CloseTag($this->blk[$b]['tag']); } + // Output any text left in buffer + if (count($this->textbuffer)) { $this->printbuffer($this->textbuffer); $this->textbuffer=array(); } + } +/*-- COLUMNS --*/ + $save_cols = false; + if ($this->ColActive) { + $save_cols = true; + $save_nbcol = $this->NbCol; // other values of gap and vAlign will not change by setting Columns off + $this->SetColumns(0); + } +/*-- END COLUMNS --*/ + if ($page_break_after == 'RIGHT') { $this->AddPage($this->CurOrientation,'NEXT-ODD','','','','','', '','', '','','','','','',0,0,0,0,$pagesel); } + else if ($page_break_after == 'LEFT') { $this->AddPage($this->CurOrientation,'NEXT-EVEN','','','','','', '','', '','','','','','',0,0,0,0,$pagesel); } + else { $this->AddPage($this->CurOrientation,'','','','','','', '','', '','','','','','',0,0,0,0,$pagesel); } + if (!$this->restoreBlockPagebreaks) { + $this->blklvl = 0; + $this->lastblocklevelchange = 0; + $this->blk = array(); + $this->initialiseBlock($this->blk[0]); + $this->blk[0]['width'] =& $this->pgwidth; + $this->blk[0]['inner_width'] =& $this->pgwidth; + $this->blk[0]['blockContext'] = $this->blockContext; + $properties = $this->cssmgr->MergeCSS('BLOCK','BODY',''); + $this->setCSS($properties,'','BODY'); + $this->blklvl++; + $currblk =& $this->blk[$this->blklvl]; + $prevblk =& $this->blk[$this->blklvl-1]; + + $this->initialiseBlock($currblk); + $currblk['tag'] = $tag; + $currblk['attr'] = $attr; + + $this->Reset(); + $properties = $this->cssmgr->MergeCSS('BLOCK',$tag,$attr); + } +/*-- COLUMNS --*/ + if ($save_cols) { + // Restore columns + $this->SetColumns($save_nbcol,$this->colvAlign,$this->ColGap); + } +/*-- END COLUMNS --*/ + if ($this->restoreBlockPagebreaks && !$this->tableLevel && !$this->listlvl) { + $this->blk = $save_blk; + // Re-open block tags + $t = $this->blk[0]['tag']; + $a = $this->blk[0]['attr']; + $this->blklvl = 0; + for ($b=0; $b<=$save_blklvl;$b++) { + $tc = $t; + $ac = $a; + $t = $this->blk[$b+1]['tag']; + $a = $this->blk[$b+1]['attr']; + unset($this->blk[$b+1]); + $this->OpenTag($tc,$ac); + } + $this->spanlvl = $save_spanlvl; + $this->InlineProperties = $save_ilp; + $this->restoreInlineProperties($save_silp); + } + } + + } + + +/*-- TABLES --*/ + + if($tag=='TH') $this->SetStyle('B',false); + + if(($tag=='TH' or $tag=='TD') && $this->tableLevel) { + $this->lastoptionaltag = 'TR'; + unset($this->cssmgr->tablecascadeCSS[$this->cssmgr->tbCSSlvl]); + $this->cssmgr->tbCSSlvl--; + if (!$this->tdbegin) { return; } + $this->tdbegin = false; + // Added for correct calculation of cell column width - otherwise misses the last line if not end </p> etc. + if (!isset($this->cell[$this->row][$this->col]['maxs'])) { + if (!is_array($this->cell[$this->row][$this->col])) { $this->Error("You may have an error in your HTML code e.g. &lt;/td&gt;&lt;/td&gt;"); } + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + elseif($this->cell[$this->row][$this->col]['maxs'] < $this->cell[$this->row][$this->col]['s']) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + + // Remove last <br> if at end of cell + if (isset($this->cell[$this->row][$this->col]['textbuffer'])) { $ntb = count($this->cell[$this->row][$this->col]['textbuffer']); } + else { $ntb = 0; } + if ($ntb>1 && $this->cell[$this->row][$this->col]['textbuffer'][$ntb-1][0] == "\n") { + unset($this->cell[$this->row][$this->col]['textbuffer'][$ntb-1]); + } + + if ($this->cacheTables) { + $clen = $this->_cacheCell($this->cell[$this->row][$this->col], $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['cache']); + $this->cell[$this->row][$this->col] = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['ptr']; + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['ptr'] += $clen; + } + + if ($this->tablethead) { + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['is_thead'][$this->row] = true; + if ($this->tableLevel==1) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['headernrows'] = max($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['headernrows'] , ($this->row+1)); } + } + if ($this->tabletfoot) { + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['is_tfoot'][$this->row] = true; + if ($this->tableLevel==1) { $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['footernrows'] = max($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['footernrows'] , ($this->row+1 - $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['headernrows'] )); } + } + $this->Reset(); + } + + if($tag=='TR' && $this->tableLevel) { + // If Border set on TR - Update right border + if (isset($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trborder-left'][$this->row])) { + if ($this->cacheTables) { + $c = $this->_uncacheCell($this->cell[$this->row][$this->col], $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['cache'], null); + } + else { $c =& $this->cell[$this->row][$this->col]; } + if ($c) { + if ($this->packTableData) { + $cell = $this->_unpackCellBorder($c['borderbin'] ); + } + else { $cell = $c; } + $cell['border_details']['R'] = $this->border_details($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trborder-right'][$this->row]); + $this->setBorder($cell['border'], _BORDER_RIGHT, $cell['border_details']['R']['s']); + if ($this->packTableData) { + $c['borderbin'] = $this->_packCellBorder($cell); + unset($c['border']); + unset($c['border_details']); + } + else { $c = $cell; } + } + if ($this->cacheTables) { + $fh = fopen($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['cache'], "r+b"); + $this->_cacheUpdateBorder($c, $fh, $this->cell[$this->row][$this->col]); + fclose($fh); + } + } + $this->lastoptionaltag = ''; + unset($this->cssmgr->tablecascadeCSS[$this->cssmgr->tbCSSlvl]); + $this->cssmgr->tbCSSlvl--; + $this->trow_text_rotate = ''; + $this->tabletheadjustfinished = false; + } + + if($tag=='TBODY') { + $this->lastoptionaltag = ''; + unset($this->cssmgr->tablecascadeCSS[$this->cssmgr->tbCSSlvl]); + $this->cssmgr->tbCSSlvl--; + } + + if($tag=='THEAD') { + $this->lastoptionaltag = ''; + unset($this->cssmgr->tablecascadeCSS[$this->cssmgr->tbCSSlvl]); + $this->cssmgr->tbCSSlvl--; + $this->tablethead = 0; + $this->tabletheadjustfinished = true; + $this->ResetStyles(); + $this->thead_font_weight = ''; + $this->thead_font_style = ''; + $this->thead_font_smCaps = ''; + + $this->thead_valign_default = ''; + $this->thead_textalign_default = ''; + } + + if($tag=='TFOOT') { + $this->lastoptionaltag = ''; + unset($this->cssmgr->tablecascadeCSS[$this->cssmgr->tbCSSlvl]); + $this->cssmgr->tbCSSlvl--; + $this->tabletfoot = 0; + $this->ResetStyles(); + $this->tfoot_font_weight = ''; + $this->tfoot_font_style = ''; + $this->tfoot_font_smCaps = ''; + + $this->tfoot_valign_default = ''; + $this->tfoot_textalign_default = ''; + } + + if($tag=='TABLE') { // TABLE-END ( + if ($this->progressBar) { $this->UpdateProgressBar(1,'','TABLE'); } // *PROGRESS-BAR* + if ($this->progressBar) { $this->UpdateProgressBar(7,0,''); } // *PROGRESS-BAR* + $this->lastoptionaltag = ''; + unset($this->cssmgr->tablecascadeCSS[$this->cssmgr->tbCSSlvl]); + $this->cssmgr->tbCSSlvl--; + $this->ignorefollowingspaces = true; //Eliminate exceeding left-side spaces + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['cells'] = $this->cell; + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['wc'] = array_pad(array(),$this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['nc'],array('miw'=>0,'maw'=>0)); + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['hr'] = array_pad(array(),$this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['nr'],0); + + // Move table footer <tfoot> row to end of table + if (isset($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['is_tfoot']) && count($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['is_tfoot'])) { + $tfrows = array(); + foreach($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['is_tfoot'] AS $r=>$val) { + if ($val) { $tfrows[] = $r; } + } + $temp = array(); + $temptf = array(); + foreach($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['cells'] AS $k=>$row) { + if (in_array($k,$tfrows)) { + $temptf[] = $row; + } + else { + $temp[] = $row; + } + } + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['is_tfoot'] = array(); + for($i=count($temp) ; $i<(count($temp)+count($temptf)); $i++) { + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['is_tfoot'][$i] = true; + } + // Update nestedpos row references + if (count($this->table[($this->tableLevel+1)])) { + foreach($this->table[($this->tableLevel+1)] AS $nid=>$nested) { + $this->table[($this->tableLevel+1)][$nid]['nestedpos'][0] -= count($temptf); + } + } + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['cells'] = array_merge($temp, $temptf); + + // Update other arays set on row number + // [trbackground-images] [trgradients] + $temptrbgi = array(); + $temptrbgg = array(); + $temptrbgc = array(); + $temptrbgc[-1] = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['bgcolor'][-1]; + for($k=0; $k<$this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['nr']; $k++) { + if (!in_array($k,$tfrows)) { + $temptrbgi[] = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trbackground-images'][$k]; + $temptrbgg[] = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trgradients'][$k]; + $temptrbgc[] = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['bgcolor'][$k]; + } + } + for($k=0; $k<$this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['nr']; $k++) { + if (in_array($k,$tfrows)) { + $temptrbgi[] = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trbackground-images'][$k]; + $temptrbgg[] = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trgradients'][$k]; + $temptrbgc[] = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['bgcolor'][$k]; + } + } + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trbackground-images'] = $temptrbgi; + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['trgradients'] = $temptrbgg; + $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['bgcolor'] = $temptrbgc ; + // Should Update all other arays set on row number, but cell properties have been set so not needed + // [bgcolor] [trborder-left] [trborder-right] [trborder-top] [trborder-bottom] + } + + if ($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['direction']=='rtl') { + $this->_reverseTableDir($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]); + } + + // Fix Borders ********************************************* + $this->_fixTableBorders($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]); + + if ($this->progressBar) { $this->UpdateProgressBar(7,10,' '); } // *PROGRESS-BAR* + + if ($this->ColActive) { $this->table_rotate = 0; } // *COLUMNS* + if ($this->table_rotate <> 0) { + $this->tablebuffer = ''; + // Max width for rotated table + $this->tbrot_maxw = $this->h - ($this->y + $this->bMargin + 1); + $this->tbrot_maxh = $this->blk[$this->blklvl]['inner_width'] ; // Max width for rotated table + $this->tbrot_align = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['a'] ; + } + $this->shrin_k = 1; + + if ($this->shrink_tables_to_fit < 1) { $this->shrink_tables_to_fit = 1; } + if (!$this->shrink_this_table_to_fit) { $this->shrink_this_table_to_fit = $this->shrink_tables_to_fit; } + + if ($this->tableLevel>1) { + // deal with nested table + + $this->_tableColumnWidth($this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]],true); + + $tmiw = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['miw']; + $tmaw = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['maw']; + $tl = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['tl']; + + // Go down to lower table level + $this->tableLevel--; + + // Reset lower level table + $this->base_table_properties = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['baseProperties']; + $this->cell = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['cells']; + // mPDF 5.4.10 + if (isset($this->cell['PARENTCELL'])) { + if ($this->cell['PARENTCELL']) { $this->restoreInlineProperties($this->cell['PARENTCELL']); } + unset($this->cell['PARENTCELL']); + } + $this->row = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['currrow']; + $this->col = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['currcol']; + $objattr = array(); + $objattr['type'] = 'nestedtable'; + $objattr['nestedcontent'] = $this->tbctr[($this->tableLevel+1)]; + $objattr['table'] = $this->tbctr[$this->tableLevel]; + $objattr['row'] = $this->row; + $objattr['col'] = $this->col; + $objattr['level'] = $this->tableLevel; + $e = "\xbb\xa4\xactype=nestedtable,objattr=".serialize($objattr)."\xbb\xa4\xac"; + $this->_saveCellTextBuffer($e); + $this->cell[$this->row][$this->col]['s'] += $tl ; + if (!isset($this->cell[$this->row][$this->col]['maxs'])) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + elseif($this->cell[$this->row][$this->col]['maxs'] < $this->cell[$this->row][$this->col]['s']) { + $this->cell[$this->row][$this->col]['maxs'] = $this->cell[$this->row][$this->col]['s']; + } + $this->cell[$this->row][$this->col]['s'] = 0;// reset + if ((isset($this->cell[$this->row][$this->col]['nestedmaw']) && $this->cell[$this->row][$this->col]['nestedmaw'] < $tmaw) || !isset($this->cell[$this->row][$this->col]['nestedmaw'])) { $this->cell[$this->row][$this->col]['nestedmaw'] = $tmaw ; } + if ((isset($this->cell[$this->row][$this->col]['nestedmiw']) && $this->cell[$this->row][$this->col]['nestedmiw'] < $tmiw) || !isset($this->cell[$this->row][$this->col]['nestedmiw'])) { $this->cell[$this->row][$this->col]['nestedmiw'] = $tmiw ; } + $this->tdbegin = true; + $this->nestedtablejustfinished = true; + $this->ignorefollowingspaces = true; + return; + } + $this->cMarginL = 0; + $this->cMarginR = 0; + $this->cMarginT = 0; + $this->cMarginB = 0; + $this->cellPaddingL = 0; + $this->cellPaddingR = 0; + $this->cellPaddingT = 0; + $this->cellPaddingB = 0; + + if (isset($this->table[1][1]['overflow']) && $this->table[1][1]['overflow']=='visible') { + if ($this->kwt || $this->table_rotate || $this->table_keep_together || $this->ColActive) { + $this->kwt = false; + $this->table_rotate = 0; + $this->table_keep_together = false; + //die("mPDF Warning: You cannot use CSS overflow:visible together with any of these functions: 'Keep-with-table', rotated tables, page-break-inside:avoid, or columns"); + } + $this->_tableColumnWidth($this->table[1][1],true); + $this->_tableWidth($this->table[1][1]); + } + else { + if (!$this->kwt_saved) { $this->kwt_height = 0; } + + list($check,$tablemiw) = $this->_tableColumnWidth($this->table[1][1],true); + $save_table = $this->table; + if ($this->cacheTables) { $this->_backupCacheFiles(); } + $reset_to_minimum_width = false; + $added_page = false; + + if ($check > 1) { + if ($check > $this->shrink_this_table_to_fit && $this->table_rotate) { + if ($this->y != $this->tMargin) { + $this->AddPage($this->CurOrientation); + $this->kwt_moved = true; + } + $added_page = true; + $this->tbrot_maxw = $this->h - ($this->y + $this->bMargin + 5) - $this->kwt_height; + //$check = $tablemiw/$this->tbrot_maxw; // undo any shrink + $check = 1; // undo any shrink + } + $reset_to_minimum_width = true; + } + + if ($reset_to_minimum_width) { + + $this->shrin_k = $check; + + $this->default_font_size /= $this->shrin_k; + $this->SetFontSize($this->default_font_size, false ); + + $this->shrinkTable($this->table[1][1],$this->shrin_k); + + $this->_tableColumnWidth($this->table[1][1],false); // repeat + + // Starting at $this->innermostTableLevel + // Shrink table values - and redo columnWidth + for($lvl=2;$lvl<=$this->innermostTableLevel;$lvl++) { + for ($nid=1; $nid<=$this->tbctr[$lvl]; $nid++) { + $this->shrinkTable($this->table[$lvl][$nid],$this->shrin_k); + $this->_tableColumnWidth($this->table[$lvl][$nid],false); + } + } + } + + // Set table cell widths for top level table + // Use $shrin_k to resize but don't change again + $this->SetLineHeight('',$this->table_lineheight); + + // Top level table + $this->_tableWidth($this->table[1][1]); + + } + + + // Now work through any nested tables setting child table[w'] = parent cell['w'] + // Now do nested tables _tableWidth + for($lvl=2;$lvl<=$this->innermostTableLevel;$lvl++) { + for ($nid=1; $nid<=$this->tbctr[$lvl]; $nid++) { + // HERE set child table width = cell width + + list($parentrow, $parentcol, $parentnid) = $this->table[$lvl][$nid]['nestedpos']; + + if ($this->cacheTables) { + $c = $this->_uncacheCell($this->table[($lvl-1)][$parentnid]['cells'][$parentrow][$parentcol], $this->table[($lvl-1)][$parentnid]['cache'], null); + } + else + $c =& $this->table[($lvl-1)][$parentnid]['cells'][$parentrow][$parentcol]; + + if (isset($c['colspan']) && $c['colspan']> 1) { + $parentwidth = 0; + for($cs=0;$cs<$c['colspan'] ; $cs++) { + $parentwidth += $this->table[($lvl-1)][$parentnid]['wc'][$parentcol+$cs]; + } + } + else { $parentwidth = $this->table[($lvl-1)][$parentnid]['wc'][$parentcol]; } + + + //$parentwidth -= ALLOW FOR PADDING ETC.in parent cell + if (!$this->simpleTables){ + if ($this->packTableData) { + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($c['borderbin']); + } + else { + $br = $c['border_details']['R']['w']; + $bl = $c['border_details']['L']['w']; + } + if ($this->table[$lvl-1][$parentnid]['borders_separate']) { + $parentwidth -= $br + $bl + + $c['padding']['L'] + + $c['padding']['R'] + + $this->table[($lvl-1)][$parentnid]['border_spacing_H']; + } + else { + $parentwidth -= $br/2 + $bl/2 + + $c['padding']['L'] + + $c['padding']['R']; + } + } + else if ($this->simpleTables){ + if ($this->table[$lvl-1][$parentnid]['borders_separate']) { + $parentwidth -= $this->table[($lvl-1)][$parentnid]['simple']['border_details']['L']['w'] + + $this->table[($lvl-1)][$parentnid]['simple']['border_details']['R']['w'] + + $c['padding']['L'] + + $c['padding']['R'] + + $this->table[($lvl-1)][$parentnid]['border_spacing_H']; + } + else { + $parentwidth -= $this->table[($lvl-1)][$parentnid]['simple']['border_details']['L']['w']/2 + + $this->table[($lvl-1)][$parentnid]['simple']['border_details']['R']['w']/2 + + $c['padding']['L'] + + $c['padding']['R']; + } + } + if (isset($this->table[$lvl][$nid]['wpercent']) && $this->table[$lvl][$nid]['wpercent'] && $lvl>1) { + $this->table[$lvl][$nid]['w'] = $parentwidth; + } + else if ($parentwidth > $this->table[$lvl][$nid]['maw']) { + $this->table[$lvl][$nid]['w'] = $this->table[$lvl][$nid]['maw']; + } + else { + $this->table[$lvl][$nid]['w'] = $parentwidth; + } + unset($c); + $this->_tableWidth($this->table[$lvl][$nid]); + } + } + + // Starting at $this->innermostTableLevel + // Cascade back up nested tables: setting heights back up the tree + for($lvl=$this->innermostTableLevel;$lvl>0;$lvl--) { + for ($nid=1; $nid<=$this->tbctr[$lvl]; $nid++) { + list($tableheight,$maxrowheight,$fullpage,$remainingpage, $maxfirstrowheight) = $this->_tableHeight($this->table[$lvl][$nid]); } + } + if ($this->progressBar) { $this->UpdateProgressBar(7,20,' '); } // *PROGRESS-BAR* + if ($this->table[1][1]['overflow']=='visible') { + if ($maxrowheight > $fullpage) { die("mPDF Warning: A Table row is greater than available height. You cannot use CSS overflow:visible"); } + if ($maxfirstrowheight > $remainingpage) { $this->AddPage($this->CurOrientation); } + $r = 0; $c = 0; $p = 0; $y = 0; + while (!$finished) { + list($finished,$r,$c,$p,$y,$y0) = $this->_tableWrite($this->table[1][1],true,$r,$c,$p,$y); + if (!$finished) { + $this->AddPage($this->CurOrientation); + // If printed something on first spread, set same y + if ($r==0 && $y0 > -1) { $this->y = $y0; } + } + } + } + else { + $recalculate = 1; + $forcerecalc = false; + // RESIZING ALGORITHM + if ($maxrowheight > $fullpage) { + $recalculate = $this->tbsqrt($maxrowheight / $fullpage, 1); + $forcerecalc = true; + } + else if ($this->table_rotate) { // NB $remainingpage == $fullpage == the width of the page + if ($tableheight > $remainingpage) { + // If can fit on remainder of page whilst respecting autsize value.. + if (($this->shrin_k * $this->tbsqrt($tableheight / $remainingpage, 1)) <= $this->shrink_this_table_to_fit) { + $recalculate = $this->tbsqrt($tableheight / $remainingpage, 1); + } + else if (!$added_page) { + if ($this->y != $this->tMargin) { + $this->AddPage($this->CurOrientation); + $this->kwt_moved = true; + } + $added_page = true; + $this->tbrot_maxw = $this->h - ($this->y + $this->bMargin + 5) - $this->kwt_height; + // 0.001 to force it to recalculate + $recalculate = (1 / $this->shrin_k) + 0.001; // undo any shrink + } + } + else { $recalculate = 1; } + } + else if ($this->table_keep_together || ($this->table[1][1]['nr']==1 && !$this->writingHTMLfooter)) { + if ($tableheight > $fullpage) { + if (($this->shrin_k * $this->tbsqrt($tableheight / $fullpage, 1)) <= $this->shrink_this_table_to_fit) { + $recalculate = $this->tbsqrt($tableheight / $fullpage, 1); + } + else if ($this->tableMinSizePriority) { + $this->table_keep_together = false; + $recalculate = 1.001; + } + else { + if ($this->y != $this->tMargin) { // mPDF 5.1 + $this->AddPage($this->CurOrientation); + $this->kwt_moved = true; + } + $added_page = true; + $this->tbrot_maxw = $this->h - ($this->y + $this->bMargin + 5) - $this->kwt_height; + $recalculate = $this->tbsqrt($tableheight / $fullpage, 1); + } + } + else if ($tableheight > $remainingpage) { + // If can fit on remainder of page whilst respecting autsize value.. + if (($this->shrin_k * $this->tbsqrt($tableheight / $remainingpage, 1)) <= $this->shrink_this_table_to_fit) { + $recalculate = $this->tbsqrt($tableheight / $remainingpage, 1); + } + else { + if ($this->y != $this->tMargin) { + $this->AddPage($this->CurOrientation); + $this->kwt_moved = true; + } + $added_page = true; + $this->tbrot_maxw = $this->h - ($this->y + $this->bMargin + 5) - $this->kwt_height; + $recalculate = 1.001; + } + } + else { $recalculate = 1; } + } + else { $recalculate = 1; } + + if ($recalculate > $this->shrink_this_table_to_fit && !$forcerecalc) { $recalculate = $this->shrink_this_table_to_fit; } + + $iteration = 1; + + // RECALCULATE + while($recalculate <> 1) { + $this->shrin_k1 = $recalculate ; + $this->shrin_k *= $recalculate ; + $this->default_font_size /= ($this->shrin_k1) ; + $this->SetFontSize($this->default_font_size, false ); + $this->SetLineHeight('',$this->table_lineheight); + $this->table = $save_table; + if ($this->cacheTables) { $this->_restoreCacheFiles(); } + if ($this->shrin_k <> 1) { $this->shrinkTable($this->table[1][1],$this->shrin_k); } + $this->_tableColumnWidth($this->table[1][1],false); // repeat + + // Starting at $this->innermostTableLevel + // Shrink table values - and redo columnWidth + for($lvl=2;$lvl<=$this->innermostTableLevel;$lvl++) { + for ($nid=1; $nid<=$this->tbctr[$lvl]; $nid++) { + if ($this->shrin_k <> 1) { $this->shrinkTable($this->table[$lvl][$nid],$this->shrin_k); } + $this->_tableColumnWidth($this->table[$lvl][$nid],false); + } + } + // Set table cell widths for top level table + + // Top level table + $this->_tableWidth($this->table[1][1]); + + // Now work through any nested tables setting child table[w'] = parent cell['w'] + // Now do nested tables _tableWidth + for($lvl=2;$lvl<=$this->innermostTableLevel;$lvl++) { + for ($nid=1; $nid<=$this->tbctr[$lvl]; $nid++) { + // HERE set child table width = cell width + + list($parentrow, $parentcol, $parentnid) = $this->table[$lvl][$nid]['nestedpos']; + if ($this->cacheTables) { + $c = $this->_uncacheCell($this->table[($lvl-1)][$parentnid]['cells'][$parentrow][$parentcol], $this->table[($lvl-1)][$parentnid]['cache'], null); + } + else + $c =& $this->table[($lvl-1)][$parentnid]['cells'][$parentrow][$parentcol]; + + if (isset($c['colspan']) && $c['colspan']> 1) { + $parentwidth = 0; + for($cs=0;$cs<$c['colspan'] ; $cs++) { + $parentwidth += $this->table[($lvl-1)][$parentnid]['wc'][$parentcol+$cs]; + } + } + else { $parentwidth = $this->table[($lvl-1)][$parentnid]['wc'][$parentcol]; } + + //$parentwidth -= ALLOW FOR PADDING ETC.in parent cell + if (!$this->simpleTables){ + if ($this->packTableData) { + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($c['borderbin']); + } + else { + $br = $c['border_details']['R']['w']; + $bl = $c['border_details']['L']['w']; + } + if ($this->table[$lvl-1][$parentnid]['borders_separate']) { + $parentwidth -= $br + $bl + + $c['padding']['L'] + + $c['padding']['R'] + + $this->table[($lvl-1)][$parentnid]['border_spacing_H']; + } + else { + $parentwidth -= $br/2 + $bl/2 + + $c['padding']['L'] + + $c['padding']['R']; + } + } + else if ($this->simpleTables){ + if ($this->table[$lvl-1][$parentnid]['borders_separate']) { + $parentwidth -= $this->table[($lvl-1)][$parentnid]['simple']['border_details']['L']['w'] + + $this->table[($lvl-1)][$parentnid]['simple']['border_details']['R']['w'] + + $c['padding']['L'] + + $c['padding']['R'] + + $this->table[($lvl-1)][$parentnid]['border_spacing_H']; + } + else { + $parentwidth -= ($this->table[($lvl-1)][$parentnid]['simple']['border_details']['L']['w'] + + $this->table[($lvl-1)][$parentnid]['simple']['border_details']['R']['w']) /2 + + $c['padding']['L'] + + $c['padding']['R']; + } + } + if (isset($this->table[$lvl][$nid]['wpercent']) && $this->table[$lvl][$nid]['wpercent'] && $lvl>1) { + $this->table[$lvl][$nid]['w'] = $parentwidth; + } + else if ($parentwidth > $this->table[$lvl][$nid]['maw']) { + $this->table[$lvl][$nid]['w'] = $this->table[$lvl][$nid]['maw'] ; + } + else { + $this->table[$lvl][$nid]['w'] = $parentwidth; + } + unset($c); + $this->_tableWidth($this->table[$lvl][$nid]); + } + } + + // Starting at $this->innermostTableLevel + // Cascade back up nested tables: setting heights back up the tree + for($lvl=$this->innermostTableLevel;$lvl>0;$lvl--) { + for ($nid=1; $nid<=$this->tbctr[$lvl]; $nid++) { + list($tableheight,$maxrowheight,$fullpage,$remainingpage, $maxfirstrowheight) = $this->_tableHeight($this->table[$lvl][$nid]); } + } + + // RESIZING ALGORITHM + + if ($maxrowheight > $fullpage) { $recalculate = $this->tbsqrt($maxrowheight / $fullpage, $iteration); $iteration++; } + else if ($this->table_rotate && $tableheight > $remainingpage && !$added_page) { + // If can fit on remainder of page whilst respecting autosize value.. + if (($this->shrin_k * $this->tbsqrt($tableheight / $remainingpage, $iteration)) <= $this->shrink_this_table_to_fit) { + $recalculate = $this->tbsqrt($tableheight / $remainingpage, $iteration); $iteration++; + } + else { + if (!$added_page) { + $this->AddPage($this->CurOrientation); + $added_page = true; + $this->kwt_moved = true; + $this->tbrot_maxw = $this->h - ($this->y + $this->bMargin + 5) - $this->kwt_height; + } + // 0.001 to force it to recalculate + $recalculate = (1 / $this->shrin_k) + 0.001; // undo any shrink + } + } + else if ($this->table_keep_together || ($this->table[1][1]['nr']==1 && !$this->writingHTMLfooter)) { + if ($tableheight > $fullpage) { + if (($this->shrin_k * $this->tbsqrt($tableheight / $fullpage, $iteration)) <= $this->shrink_this_table_to_fit) { + $recalculate = $this->tbsqrt($tableheight / $fullpage, $iteration); $iteration++; + } + else if ($this->tableMinSizePriority) { + $this->table_keep_together = false; + $recalculate = (1 / $this->shrin_k) + 0.001; + } + else { + if (!$added_page && $this->y != $this->tMargin) { + $this->AddPage($this->CurOrientation); + $added_page = true; + $this->kwt_moved = true; + $this->tbrot_maxw = $this->h - ($this->y + $this->bMargin + 5) - $this->kwt_height; + } + $recalculate = $this->tbsqrt($tableheight / $fullpage, $iteration); $iteration++; + } + } + else if ($tableheight > $remainingpage) { + // If can fit on remainder of page whilst respecting autosize value.. + if (($this->shrin_k * $this->tbsqrt($tableheight / $remainingpage, $iteration)) <= $this->shrink_this_table_to_fit) { + $recalculate = $this->tbsqrt($tableheight / $remainingpage, $iteration); $iteration++; + } + else { + if (!$added_page) { + $this->AddPage($this->CurOrientation); + $added_page = true; + $this->kwt_moved = true; + $this->tbrot_maxw = $this->h - ($this->y + $this->bMargin + 5) - $this->kwt_height; + } + + //$recalculate = $this->tbsqrt($tableheight / $fullpage, $iteration); $iteration++; + $recalculate = (1 / $this->shrin_k) + 0.001; // undo any shrink + } + } + else { $recalculate = 1; } + } + else { $recalculate = 1; } + } + + + if ($maxfirstrowheight > $remainingpage && !$added_page && !$this->table_rotate && !$this->ColActive && !$this->table_keep_together && !$this->writingHTMLheader && !$this->writingHTMLfooter) { + $this->AddPage($this->CurOrientation); + $this->kwt_moved = true; + } + + // keep-with-table: if page has advanced, print out buffer now, else done in fn. _Tablewrite() + if ($this->kwt_saved && $this->kwt_moved) { + $this->printkwtbuffer(); + $this->kwt_moved = false; + $this->kwt_saved = false; + } + + if ($this->progressBar) { $this->UpdateProgressBar(7,30,' '); } // *PROGRESS-BAR* + // Recursively writes all tables starting at top level + $this->_tableWrite($this->table[1][1]); + + if ($this->table_rotate && $this->tablebuffer) { + $this->PageBreakTrigger=$this->h-$this->bMargin; + $save_tr = $this->table_rotate; + $save_y = $this->y; + $this->table_rotate = 0; + $this->y = $this->tbrot_y0; + $h = $this->tbrot_w; + $this->DivLn($h,$this->blklvl,true); + + $this->table_rotate = $save_tr; + $this->y = $save_y; + + $this->printtablebuffer(); + } + $this->table_rotate = 0; + } + + + $this->x = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin']; + + $this->maxPosR = max($this->maxPosR , ($this->x + $this->table[1][1]['w'])); + + $this->blockjustfinished=true; + $this->lastblockbottommargin = $this->table[1][1]['margin']['B']; + //Reset values + + if (isset($this->table[1][1]['page_break_after'])) { $page_break_after = $this->table[1][1]['page_break_after']; } + else { $page_break_after = ''; } + + // Keep-with-table + $this->kwt = false; + $this->kwt_y0 = 0; + $this->kwt_x0 = 0; + $this->kwt_height = 0; + $this->kwt_buffer = array(); + $this->kwt_Links = array(); + $this->kwt_Annots = array(); + $this->kwt_moved = false; + $this->kwt_saved = false; + + $this->kwt_Reference = array(); + $this->kwt_BMoutlines = array(); + $this->kwt_toc = array(); + + $this->shrin_k = 1; + $this->shrink_this_table_to_fit = 0; + + unset($this->table); + $this->table=array(); //array + $this->tableLevel=0; + $this->tbctr=array(); + $this->innermostTableLevel=0; + $this->cssmgr->tbCSSlvl = 0; + $this->cssmgr->tablecascadeCSS = array(); + + unset($this->cell); + $this->cell=array(); //array + + $this->col=-1; //int + $this->row=-1; //int + $this->Reset(); + + $this->cellPaddingL = 0; + $this->cellPaddingT = 0; + $this->cellPaddingR = 0; + $this->cellPaddingB = 0; + $this->cMarginL = 0; + $this->cMarginT = 0; + $this->cMarginR = 0; + $this->cMarginB = 0; + $this->default_font_size = $this->original_default_font_size; + $this->default_font = $this->original_default_font; + $this->SetFontSize($this->default_font_size, false); + $this->SetFont($this->default_font,'',0,false); + $this->SetLineHeight(); + if (isset($this->blk[$this->blklvl]['InlineProperties'])) { $this->restoreInlineProperties($this->blk[$this->blklvl]['InlineProperties']);} + if ($this->progressBar) { $this->UpdateProgressBar(7,100,' '); } // *PROGRESS-BAR* + + if ($page_break_after) { + $save_blklvl = $this->blklvl; + $save_blk = $this->blk; + $save_silp = $this->saveInlineProperties(); + $save_spanlvl = $this->spanlvl; + $save_ilp = $this->InlineProperties; + if ($this->blklvl>1) { + // Close any open block tags + for ($b= $this->blklvl;$b>0;$b--) { $this->CloseTag($this->blk[$b]['tag']); } + // Output any text left in buffer + if (count($this->textbuffer)) { $this->printbuffer($this->textbuffer); $this->textbuffer=array(); } + } +/*-- COLUMNS --*/ + $save_cols = false; + if ($this->ColActive) { + $save_cols = true; + $save_nbcol = $this->NbCol; // other values of gap and vAlign will not change by setting Columns off + $this->SetColumns(0); + } +/*-- END COLUMNS --*/ + if ($page_break_after == 'RIGHT') { $this->AddPage($this->CurOrientation,'NEXT-ODD','','','','','', '','', '','','','','','',0,0,0,0,$pagesel); } + else if ($page_break_after == 'LEFT') { $this->AddPage($this->CurOrientation,'NEXT-EVEN','','','','','', '','', '','','','','','',0,0,0,0,$pagesel); } + else { $this->AddPage($this->CurOrientation,'','','','','','', '','', '','','','','','',0,0,0,0,$pagesel); } + if (!$this->restoreBlockPagebreaks) { + $this->blklvl = 0; + $this->lastblocklevelchange = 0; + $this->blk = array(); + $this->initialiseBlock($this->blk[0]); + $this->blk[0]['width'] =& $this->pgwidth; + $this->blk[0]['inner_width'] =& $this->pgwidth; + $this->blk[0]['blockContext'] = $this->blockContext; + $properties = $this->cssmgr->MergeCSS('BLOCK','BODY',''); + $this->setCSS($properties,'','BODY'); + } + +/*-- COLUMNS --*/ + if ($save_cols) { + // Restore columns + $this->SetColumns($save_nbcol,$this->colvAlign,$this->ColGap); + } +/*-- END COLUMNS --*/ + if ($this->restoreBlockPagebreaks) { + $this->blk = $save_blk; + // Re-open block tags + $t = $this->blk[0]['tag']; + $a = $this->blk[0]['attr']; + $this->blklvl = 0; + for ($b=0; $b<=$save_blklvl;$b++) { + $tc = $t; + $ac = $a; + $t = $this->blk[$b+1]['tag']; + $a = $this->blk[$b+1]['attr']; + unset($this->blk[$b+1]); + $this->OpenTag($tc,$ac); + } + $this->spanlvl = $save_spanlvl; + $this->InlineProperties = $save_ilp; + $this->restoreInlineProperties($save_silp); + } + } + + } +/*-- END TABLES --*/ + +/*-- LISTS --*/ + // *********** LISTS ******************** + + if($tag=='LI') { + $this->lastoptionaltag = ''; + unset($this->cssmgr->listcascadeCSS[$this->cssmgr->listCSSlvl]); + $this->cssmgr->listCSSlvl--; + if (isset($this->listoccur[$this->listlvl]) && isset($this->InlineProperties['LIST'][$this->listlvl][$this->listoccur[$this->listlvl]])) { $this->restoreInlineProperties($this->InlineProperties['LIST'][$this->listlvl][$this->listoccur[$this->listlvl]]); } + } + + + if(($tag=='UL') or ($tag=='OL')) { + $this->ignorefollowingspaces = true; //Eliminate exceeding left-side spaces + unset($this->cssmgr->listcascadeCSS[$this->cssmgr->listCSSlvl]); + $this->cssmgr->listCSSlvl--; + + $this->lastoptionaltag = ''; +/*-- TABLES --*/ + // A simple list for inside a table + if($this->tableLevel) { + $this->listlist[$this->listlvl]['MAXNUM'] = $this->listnum; //save previous lvl's maxnum + unset($this->listlist[$this->listlvl]); + $this->listlvl--; + if (isset($this->listlist[$this->listlvl]['MAXNUM'])) { $this->listnum = $this->listlist[$this->listlvl]['MAXNUM']; } // restore previous levels + if ($this->listlvl == 0) { $this->listjustfinished = true; } + return; + } +/*-- END TABLES --*/ + + if ($this->listlvl > 1) { // returning one level + $this->listjustfinished=true; + if (!empty($this->textbuffer)) { + $this->listitem[] = array($this->listlvl,$this->listnum,$this->textbuffer,$this->listoccur[$this->listlvl],$this->listitemtype); + } + else { + $this->listnum--; + } + + $this->textbuffer = array(); + $occur = $this->listoccur[$this->listlvl]; + $this->listlist[$this->listlvl][$occur]['MAXNUM'] = $this->listnum; //save previous lvl's maxnum + $this->listlvl--; + $occur = $this->listoccur[$this->listlvl]; + $this->listnum = $this->listlist[$this->listlvl][$occur]['MAXNUM']; // recover previous level's number + $this->listtype = $this->listlist[$this->listlvl][$occur]['TYPE']; // recover previous level's type + if ($this->InlineProperties['LIST'][$this->listlvl][$occur]) { $this->restoreInlineProperties($this->InlineProperties['LIST'][$this->listlvl][$occur]); } + + } + else { // We are closing the last OL/UL tag + if (!empty($this->textbuffer)) { + $this->listitem[] = array($this->listlvl,$this->listnum,$this->textbuffer,$this->listoccur[$this->listlvl],$this->listitemtype); + } + else { + $this->listnum--; + } + + $occur = $this->listoccur[$this->listlvl]; + $this->listlist[$this->listlvl][$occur]['MAXNUM'] = $this->listnum; + $this->textbuffer = array(); + $this->listlvl--; + + $this->printlistbuffer(); + unset($this->InlineProperties['LIST']); + // SPACING AFTER LIST (Top level only) + $this->Ln(0); + if ($this->list_margin_bottom) { + $this->DivLn($this->list_margin_bottom,$this->blklvl,true,1); // collapsible + } + if (isset($this->blk[$this->blklvl]['InlineProperties'])) { $this->restoreInlineProperties($this->blk[$this->blklvl]['InlineProperties']);} + $this->listjustfinished = true; + $this->cssmgr->listCSSlvl = 0; + $this->cssmgr->listcascadeCSS = array(); + $this->blockjustfinished=true; + $this->lastblockbottommargin = $this->list_margin_bottom; + } + } +/*-- END LISTS --*/ + + +} + + +/*-- TABLES --*/ +// This function determines the shrink factor when resizing tables +// val is the table_height / page_height_available +// returns a scaling factor used as $shrin_k to resize the table +// Overcompensating will be quicker but may unnecessarily shrink table too much +// Undercompensating means it will reiterate more times (taking more processing time) +function tbsqrt($val, $iteration=3) { + $k = 4; // Alters number of iterations until it returns $val itself - Must be > 2 + // Probably best guess and most accurate + if ($iteration==1) return sqrt($val); + // Faster than using sqrt (because it won't undercompensate), and gives reasonable results + //return 1+(($val-1)/2); + $x = 2-(($iteration-2)/($k-2)); + if ($x == 0) { $ret = $val+0.00001; } + else if ($x < 0) { $ret = 1 + ( pow(2, ($iteration-2-$k))/1000 ); } + else { $ret = 1+(($val-1)/$x); } + return $ret; +} +/*-- END TABLES --*/ + + +/*-- LISTS --*/ +function printlistbuffer() { + //Save x coordinate + $x = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin']; + $this->cMarginL = 0; + $this->cMarginR = 0; + $currIndentLvl = -1; + $lastIndent = array(); + $bak_page = $this->page; + $indent = 0; + foreach($this->listitem as $item) + { + // COLS + $oldcolumn = $this->CurrCol; + + $this->bulletarray = array(); + //Get list's buffered data + $this->listlvl = $lvl = $item[0]; + $num = $item[1]; + $this->textbuffer = $item[2]; + $occur = $item[3]; + if ($item[4]) { $type = $item[4]; } // listitemtype + else { $type = $this->listlist[$lvl][$occur]['TYPE']; } + $maxnum = $this->listlist[$lvl][$occur]['MAXNUM']; + $this->restoreInlineProperties($this->InlineProperties['LIST'][$lvl][$occur]); + $this->SetFont($this->FontFamily,$this->FontStyle,$this->FontSizePt,true,true); // force to write + $clh = $this->FontSize; + + $this->SetLineHeight($this->FontSizePt,$this->list_lineheight[$lvl][$occur]); + $this->listOcc = $occur; + $this->listnum = $num; + + if (isset($this->list_align[$this->listlvl][$occur])) { $this->divalign = $this->list_align[$this->listlvl][$occur]; } + else { + if (isset($this->blk[$this->blklvl]['direction']) && $this->blk[$this->blklvl]['direction']=='rtl') { $this->divalign = 'R'; } + else { $this->divalign = 'L'; } + } + + // Set the bullet fontsize + $bullfs = $this->InlineProperties['LISTITEM'][$lvl][$occur][$num]['size']; + + $space_width = $this->GetCharWidth(' ',false) * 1.5; + + //Set default width & height values + $this->divwidth = $this->blk[$this->blklvl]['inner_width']; + $this->divheight = $this->lineheight; + $typefont = $this->FontFamily; + if (preg_match('/U\+([a-fA-F0-9]+)/i',$type,$m)) { + if ($this->_charDefined($this->CurrentFont['cw'],hexdec($m[1]))) { $list_item_marker = codeHex2utf($m[1]); } + else { $list_item_marker = '-'; } + $blt_width = $this->GetStringWidth($list_item_marker); + $typefont = ''; + if (preg_match('/rgb\(.*?\)/',$type,$m)) { + $list_item_color = $this->ConvertColor($m[0]); + } + } + else { + $list_item_color = false; + + switch($type) //Format type + { + case '1': + if ($this->listDir == 'rtl') { $list_item_marker = $this->list_number_suffix . $num; } + else { $list_item_marker = $num . $this->list_number_suffix; } + $blt_width = $this->GetStringWidth(str_repeat('5',strlen($maxnum)).$this->list_number_suffix); + break; + case 'none': + $list_item_marker = ''; + $blt_width = 0; + break; + case 'A': + $anum = $this->dec2alpha($num,true); + $maxnum = $this->dec2alpha($maxnum,true); + if ($this->listDir == 'rtl') { $list_item_marker = $this->list_number_suffix . $anum; } + else { $list_item_marker = $anum . $this->list_number_suffix; } + $blt_width = $this->GetStringWidth(str_repeat('W',strlen($maxnum)).$this->list_number_suffix); + break; + case 'a': + $anum = $this->dec2alpha($num,false); + $maxnum = $this->dec2alpha($maxnum,false); + if ($this->listDir == 'rtl') { $list_item_marker = $this->list_number_suffix . $anum; } + else { $list_item_marker = $anum . $this->list_number_suffix; } + $blt_width = $this->GetStringWidth(str_repeat('m',strlen($maxnum)).$this->list_number_suffix); + break; + case 'I': + $anum = $this->dec2roman($num,true); + if ($this->listDir == 'rtl') { $list_item_marker = $this->list_number_suffix . $anum; } + else { $list_item_marker = $anum . $this->list_number_suffix; } + + if ($maxnum>87) { $bbit = 87; } + else if ($maxnum>86) { $bbit = 86; } + else if ($maxnum>37) { $bbit = 38; } + else if ($maxnum>36) { $bbit = 37; } + else if ($maxnum>27) { $bbit = 28; } + else if ($maxnum>26) { $bbit = 27; } + else if ($maxnum>17) { $bbit = 18; } + else if ($maxnum>16) { $bbit = 17; } + else if ($maxnum>7) { $bbit = 8; } + else if ($maxnum>6) { $bbit = 7; } + else if ($maxnum>3) { $bbit = 4; } + else { $bbit = $maxnum; } + $maxlnum = $this->dec2roman($bbit,true); + $blt_width = $this->GetStringWidth($maxlnum.$this->list_number_suffix); + break; + case 'i': + $anum = $this->dec2roman($num,false); + if ($this->listDir == 'rtl') { $list_item_marker = $this->list_number_suffix . $anum; } + else { $list_item_marker = $anum . $this->list_number_suffix; } + + if ($maxnum>87) { $bbit = 87; } + else if ($maxnum>86) { $bbit = 86; } + else if ($maxnum>37) { $bbit = 38; } + else if ($maxnum>36) { $bbit = 37; } + else if ($maxnum>27) { $bbit = 28; } + else if ($maxnum>26) { $bbit = 27; } + else if ($maxnum>17) { $bbit = 18; } + else if ($maxnum>16) { $bbit = 17; } + else if ($maxnum>7) { $bbit = 8; } + else if ($maxnum>6) { $bbit = 7; } + else if ($maxnum>3) { $bbit = 4; } + else { $bbit = $maxnum; } + $maxlnum = $this->dec2roman($bbit,false); + + $blt_width = $this->GetStringWidth($maxlnum.$this->list_number_suffix); + break; + case 'disc': + if ($this->PDFA || $this->PDFX) { + if ($this->_charDefined($this->CurrentFont['cw'],8226)) { $list_item_marker = "\xe2\x80\xa2"; } // &#8226; + else { $list_item_marker = '-'; } + $blt_width = $this->GetCharWidth($list_item_marker); + break; + } + $list_item_marker = chr(108); // bullet disc in Zapfdingbats 'l' + $typefont = 'czapfdingbats'; + $blt_width = (0.791 * $this->FontSize/2.5); + break; + case 'circle': + if ($this->PDFA || $this->PDFX) { + if ($this->_charDefined($this->CurrentFont['cw'],9900)) { $list_item_marker = "\xe2\x9a\xac"; } // &#9900; + else { $list_item_marker = '-'; } + $blt_width = $this->GetCharWidth($list_item_marker); + break; + } + $list_item_marker = chr(109); // circle in Zapfdingbats 'm' + $typefont = 'czapfdingbats'; + $blt_width = (0.873 * $this->FontSize/2.5); + break; + case 'square': + if ($this->PDFA || $this->PDFX) { + if ($this->_charDefined($this->CurrentFont['cw'],9642)) { $list_item_marker = "\xe2\x96\xaa"; } // &#9642; + else { $list_item_marker = '-'; } + $blt_width = $this->GetCharWidth($list_item_marker); + break; + } + $list_item_marker = chr(110); //black square in Zapfdingbats font 'n' + $typefont = 'czapfdingbats'; + $blt_width = (0.761 * $this->FontSize/2.5); + break; + +/* CSS3 list-styles numeric + I added tamil +arabic-indic | bengali | cambodian | devanagari | gujarati | gurmukhi | kannada | khmer | lao | malayalam | mongolian | myanmar | oriya | persian | telugu | tibetan | thai | urdu +*/ + case 'arabic-indic': + $cp = 0x0660; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $this->list_number_suffix . $rnum; // RTL + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(3, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + case 'persian': + case 'urdu': + $cp = 0x06F0; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $this->list_number_suffix . $rnum; // RTL + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(3, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + case 'bengali': + $cp = 0x09E6; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $rnum . $this->list_number_suffix; + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(3, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + case 'devanagari': + $cp = 0x0966; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $rnum . $this->list_number_suffix; + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(3, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + case 'gujarati': + $cp = 0x0AE6; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $rnum . $this->list_number_suffix; + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(3, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + case 'gurmukhi': + $cp = 0x0A66; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $rnum . $this->list_number_suffix; + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(3, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + case 'kannada': + $cp = 0x0CE6; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $rnum . $this->list_number_suffix; + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(3, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + case 'malayalam': + $cp = 0x0D66; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $rnum . $this->list_number_suffix; + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(6, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + case 'oriya': + $cp = 0x0B66; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $rnum . $this->list_number_suffix; + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(3, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + case 'telugu': + $cp = 0x0C66; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $rnum . $this->list_number_suffix; + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(3, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + case 'tamil': + $cp = 0x0BE6; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $rnum . $this->list_number_suffix; + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(9, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + case 'thai': + $cp = 0x0E50; + $rnum = $this->dec2other($num, $cp); + $list_item_marker = $rnum . $this->list_number_suffix; + $blt_width = $this->GetStringWidth(str_repeat($this->dec2other(5, $cp),strlen($maxnum)).$this->list_number_suffix); + break; + default: + if ($this->listDir == 'rtl') { $list_item_marker = $this->list_number_suffix . $num; } + else { $list_item_marker = $num . $this->list_number_suffix; } + $blt_width = $this->GetStringWidth(str_repeat('5',strlen($maxnum)).$this->list_number_suffix); + break; + } + } + + if (isset($item[5]) && $item[5]) { $list_item_marker = ''; } + + if ($currIndentLvl < $lvl) { + if ($lvl > 1 || $this->list_indent_first_level) { + $indent += $this->list_indent[$lvl][$occur]; + $lastIndent[$lvl] = $this->list_indent[$lvl][$occur]; + } + } + else if ($currIndentLvl > $lvl) { + while ($currIndentLvl > $lvl) { + $indent -= $lastIndent[$currIndentLvl]; + $currIndentLvl--; + } + } + $currIndentLvl = $lvl; + + +/*-- RTL --*/ + + if ($this->listDir == 'rtl') { + // list_align_style Determines alignment of numbers in numbered lists + if ($this->list_align_style == 'L') { $lalign = 'R'; } + else { $lalign = 'L'; } + $this->divwidth = $this->blk[$this->blklvl]['width'] - ($indent + $blt_width + $space_width) ; + $xb = $this->blk[$this->blklvl]['inner_width'] + $this->blk[$this->blklvl]['border_left']['w'] + $this->blk[$this->blklvl]['padding_left'] - $indent - $blt_width; //Bullet position (relative) + //Output bullet + $this->bulletarray = array('w'=>$blt_width,'h'=>$clh,'txt'=>$list_item_marker,'x'=>$xb,'align'=>$lalign,'font'=>$typefont,'level'=>$lvl, 'occur'=>$occur, 'num'=>$num, 'fontsize'=>$bullfs, 'col'=>$list_item_color ); + $this->x = $x; + } + else { +/*-- END RTL --*/ + + if ($this->list_align_style == 'L') { $lalign = 'L'; } + else { $lalign = 'R'; } + $this->divwidth = $this->blk[$this->blklvl]['width'] - ($indent + $blt_width + $space_width) ; + $xb = $this->blk[$this->blklvl]['padding_left'] + $this->blk[$this->blklvl]['border_left']['w'] - $blt_width - $space_width; + //Output bullet + $this->bulletarray = array('w'=>$blt_width,'h'=>$clh,'txt'=>$list_item_marker,'x'=>$xb,'align'=>$lalign,'font'=>$typefont,'level'=>$lvl, 'occur'=>$occur, 'num'=>$num, 'fontsize'=>$bullfs, 'col'=>$list_item_color ); + $this->x = $x + $indent + $blt_width + $space_width; + } // *RTL* + + //Print content + $this->printbuffer($this->textbuffer,'',false,true); + $this->textbuffer=array(); + + // Added to correct for OddEven Margins + if ($this->page != $bak_page) { + if (($this->page-$bak_page) % 2 == 1) { + $x += $this->MarginCorrection; + } + $bak_page = $this->page; + } +/*-- COLUMNS --*/ + // OR COLUMN CHANGE + if ($this->CurrCol != $oldcolumn) { + if ($this->directionality == 'rtl') { // *RTL* + $x -= ($this->CurrCol - $oldcolumn) * ($this->ColWidth+$this->ColGap); // *RTL* + } // *RTL* + else { // *RTL* + $x += ($this->CurrCol - $oldcolumn) * ($this->ColWidth+$this->ColGap); + } // *RTL* + $oldcolumn = $this->CurrCol; + } +/*-- END COLUMNS --*/ + + } + + //Reset all used values + $this->listoccur = array(); + $this->listitem = array(); + $this->listlist = array(); + $this->listlvl = 0; + $this->listnum = 0; + $this->listtype = ''; + $this->textbuffer = array(); + $this->divwidth = 0; + $this->divheight = 0; + $this->x = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin']; +} +/*-- END LISTS --*/ + +function _saveTextBuffer($t, $link = '', $intlink = '') { +// $this->textbuffer[] = array($t,$link,$this->currentfontstyle,$this->colorarray,$this->currentfontfamily,$this->SUP,$this->SUB,$intlink,$this->strike,$this->textparam,$this->spanbgcolorarray,$this->currentfontsize,$this->ReqFontStyle,$this->kerning,$this->lSpacingCSS,$this->wSpacingCSS,$this->spanborddet, $this->textshadow); + // mPDF 5.6.14 + $arr = array(); + $arr[0] = $t; + if (isset($link) && $link) $arr[1] = $link; + $arr[2] = $this->currentfontstyle; + if (isset($this->colorarray) && $this->colorarray) $arr[3] = $this->colorarray; + $arr[4] = $this->currentfontfamily; + if (isset($this->SUP) && $this->SUP) $arr[5] = $this->SUP; + if (isset($this->SUB) && $this->SUB) $arr[6] = $this->SUB; + if (isset($intlink) && $intlink) $arr[7] = $intlink; + if (isset($this->strike) && $this->strike) $arr[8] = $this->strike; + if (isset($this->textparam) && $this->textparam) $arr[9] = $this->textparam; + if (isset($this->spanbgcolorarray) && $this->spanbgcolorarray) $arr[10] = $this->spanbgcolorarray; + $arr[11] = $this->currentfontsize; + if (isset($this->ReqFontStyle) && $this->ReqFontStyle) $arr[12] = $this->ReqFontStyle; + if (isset($this->kerning) && $this->kerning) $arr[13] = $this->kerning; + if (isset($this->lSpacingCSS) && $this->lSpacingCSS) $arr[14] = $this->lSpacingCSS; + if (isset($this->wSpacingCSS) && $this->wSpacingCSS) $arr[15] = $this->wSpacingCSS; + if (isset($this->spanborddet) && $this->spanborddet) $arr[16] = $this->spanborddet; + if (isset($this->textshadow) && $this->textshadow) $arr[17] = $this->textshadow; + $this->textbuffer[] = $arr; +} + +function _saveCellTextBuffer($t, $link = '', $intlink = '') { +// $this->cell[$this->row][$this->col]['textbuffer'][] = array($t,$link,$this->currentfontstyle,$this->colorarray,$this->currentfontfamily,$this->SUP,$this->SUB,$intlink,$this->strike,$this->textparam,$this->spanbgcolorarray,$this->currentfontsize,$this->ReqFontStyle,$this->kerning,$this->lSpacingCSS,$this->wSpacingCSS,$this->spanborddet, $this->textshadow); + // mPDF 5.6.14 + $arr = array(); + $arr[0] = $t; + if (isset($link) && $link) $arr[1] = $link; + $arr[2] = $this->currentfontstyle; + if (isset($this->colorarray) && $this->colorarray) $arr[3] = $this->colorarray; + $arr[4] = $this->currentfontfamily; + if (isset($this->SUP) && $this->SUP) $arr[5] = $this->SUP; + if (isset($this->SUB) && $this->SUB) $arr[6] = $this->SUB; + if (isset($intlink) && $intlink) $arr[7] = $intlink; + if (isset($this->strike) && $this->strike) $arr[8] = $this->strike; + if (isset($this->textparam) && $this->textparam) $arr[9] = $this->textparam; + if (isset($this->spanbgcolorarray) && $this->spanbgcolorarray) $arr[10] = $this->spanbgcolorarray; + $arr[11] = $this->currentfontsize; + if (isset($this->ReqFontStyle) && $this->ReqFontStyle) $arr[12] = $this->ReqFontStyle; + if (isset($this->kerning) && $this->kerning) $arr[13] = $this->kerning; + if (isset($this->lSpacingCSS) && $this->lSpacingCSS) $arr[14] = $this->lSpacingCSS; + if (isset($this->wSpacingCSS) && $this->wSpacingCSS) $arr[15] = $this->wSpacingCSS; + if (isset($this->spanborddet) && $this->spanborddet) $arr[16] = $this->spanborddet; + if (isset($this->textshadow) && $this->textshadow) $arr[17] = $this->textshadow; + $this->cell[$this->row][$this->col]['textbuffer'][] = $arr; +} + + +function printbuffer($arrayaux,$blockstate=0,$is_table=false,$is_list=false) +{ +// $blockstate = 0; // NO margins/padding +// $blockstate = 1; // Top margins/padding only +// $blockstate = 2; // Bottom margins/padding only +// $blockstate = 3; // Top & bottom margins/padding + $this->spanbgcolorarray = ''; + $this->spanbgcolor = false; + $this->spanborder = false; + $this->spanborddet = array(); + $paint_ht_corr = 0; + +/*-- CSS-FLOAT --*/ + if (count($this->floatDivs)) { + list($l_exists, $r_exists, $l_max, $r_max, $l_width, $r_width) = $this->GetFloatDivInfo($this->blklvl); + if (($this->blk[$this->blklvl]['inner_width']-$l_width-$r_width) < (2*$this->GetCharWidth('W',false))) { + // Too narrow to fit - try to move down past L or R float + if ($l_max < $r_max && ($this->blk[$this->blklvl]['inner_width']-$r_width) > (2*$this->GetCharWidth('W',false))) { + $this->ClearFloats('LEFT', $this->blklvl); + } + else if ($r_max < $l_max && ($this->blk[$this->blklvl]['inner_width']-$l_width) > (2*$this->GetCharWidth('W',false))) { + $this->ClearFloats('RIGHT', $this->blklvl); + } + else { $this->ClearFloats('BOTH', $this->blklvl); } + } + } +/*-- END CSS-FLOAT --*/ + $bak_y = $this->y; + $bak_x = $this->x; + $align = ''; + if (!$is_table && !$is_list) { + if (isset($this->blk[$this->blklvl]['align']) && $this->blk[$this->blklvl]['align']) { $align = $this->blk[$this->blklvl]['align']; } + // Block-align is set by e.g. <.. align="center"> Takes priority for this block but not inherited + if (isset($this->blk[$this->blklvl]['block-align']) && $this->blk[$this->blklvl]['block-align']) { $align = $this->blk[$this->blklvl]['block-align']; } + if (isset($this->blk[$this->blklvl]['direction'])) $blockdir = $this->blk[$this->blklvl]['direction']; + else $blockdir = ""; + $this->divwidth = $this->blk[$this->blklvl]['width']; + } + else { + $align = $this->divalign; + if ($is_table) { $blockdir = $this->table[$this->tableLevel][$this->tbctr[$this->tableLevel]]['direction']; } + else { $blockdir = $this->listDir; } + } + $oldpage = $this->page; + + // ADDED for Out of Block now done as Flowing Block + if ($this->divwidth == 0) { + $this->divwidth = $this->pgwidth; + } + + if (!$is_table && !$is_list) { $this->SetLineHeight($this->FontSizePt,$this->blk[$this->blklvl]['line_height']); } + $this->divheight = $this->lineheight; + $old_height = $this->divheight; + + // As a failsafe - if font has been set but not output to page + $this->SetFont($this->default_font,'',$this->default_font_size,true,true); // force output to page + + $array_size = count($arrayaux); + $this->newFlowingBlock( $this->divwidth,$this->divheight,$align,$is_table,$is_list,$blockstate,true,$blockdir); + + // Added - Otherwise <div><div><p> did not output top margins/padding for 1st/2nd div + if ($array_size == 0) { $this->finishFlowingBlock(true); } // true = END of flowing block + + for($i=0;$i < $array_size; $i++) + { + // COLS + $oldcolumn = $this->CurrCol; + + $vetor = $arrayaux[$i]; + if ($i == 0 and $vetor[0] != "\n" and !$this->ispre) { + $vetor[0] = ltrim($vetor[0]); + } + + // FIXED TO ALLOW IT TO SHOW '0' + if (empty($vetor[0]) && !($vetor[0]==='0') && empty($vetor[7])) { //Ignore empty text and not carrying an internal link + //Check if it is the last element. If so then finish printing the block + if ($i == ($array_size-1)) { $this->finishFlowingBlock(true); } // true = END of flowing block + continue; + } + + + //Activating buffer properties + if(isset($vetor[11]) and $vetor[11] != '') { // Font Size + if ($is_table && $this->shrin_k) { + $this->SetFontSize($vetor[11]/$this->shrin_k,false); + } + else { + $this->SetFontSize($vetor[11],false); + } + } + + if(isset($vetor[17]) && !empty($vetor[17])) { //TextShadow + $this->textshadow = $vetor[17]; + } + if(isset($vetor[16]) && !empty($vetor[16])) { //Border + $this->spanborddet = $vetor[16]; + $this->spanborder = true; + } + + if(isset($vetor[15])) { // Word spacing + $this->wSpacingCSS = $vetor[15]; + if ($this->wSpacingCSS && strtoupper($this->wSpacingCSS) != 'NORMAL') { + $this->minwSpacing = $this->ConvertSize($this->wSpacingCSS,$this->FontSize); + } + } + if(isset($vetor[14])) { // Letter spacing + $this->lSpacingCSS = $vetor[14]; + if (($this->lSpacingCSS || $this->lSpacingCSS==='0') && strtoupper($this->lSpacingCSS) != 'NORMAL') { + $this->fixedlSpacing = $this->ConvertSize($this->lSpacingCSS,$this->FontSize); + } + } + if(isset($vetor[13])) { // Font Kerning + $this->kerning = $vetor[13]; + } + + + if(isset($vetor[10]) and !empty($vetor[10])) //Background color + { + $this->spanbgcolorarray = $vetor[10]; + $this->spanbgcolor = true; + } + if(isset($vetor[9]) and !empty($vetor[9])) // Text parameters - Outline + hyphens + { + $this->textparam = $vetor[9] ; // mPDF 5.6.14 + $this->SetTextOutline($this->textparam); // mPDF 5.6.07 + } + if(isset($vetor[8]) and $vetor[8] === true) // strike-through the text + { + $this->strike = true; + } + if(isset($vetor[7]) and $vetor[7] != '') // internal target: <a name="anyvalue"> + { + $ily = $this->y; + if ($this->keep_block_together) { $this->internallink[$vetor[7]] = array("Y"=>$ily,"PAGE"=>$this->page, "kt"=>true ); } + else if ($this->table_rotate) { $this->internallink[$vetor[7]] = array("Y"=>$ily,"PAGE"=>$this->page, "tbrot"=>true ); } + else if ($this->kwt) { $this->internallink[$vetor[7]] = array("Y"=>$ily,"PAGE"=>$this->page, "kwt"=>true ); } + else if ($this->ColActive) { $this->internallink[$vetor[7]] = array("Y"=>$ily,"PAGE"=>$this->page, "col"=>$this->CurrCol ); } + else + $this->internallink[$vetor[7]] = array("Y"=>$ily,"PAGE"=>$this->page ); + if (empty($vetor[0])) { //Ignore empty text + //Check if it is the last element. If so then finish printing the block + if ($i == ($array_size-1)) { $this->finishFlowingBlock(true); } // true = END of flowing block + continue; + } + } + if(isset($vetor[6]) and $vetor[6] === true) // Subscript + { + $this->SUB = true; + } + if(isset($vetor[5]) and $vetor[5] === true) // Superscript + { + $this->SUP = true; + } + if(isset($vetor[4]) and $vetor[4] != '') { // Font Family + $font = $this->SetFont($vetor[4],$this->FontStyle,0,false); + } + if (!empty($vetor[3])) //Font Color + { + $cor = $vetor[3]; + $this->SetTColor($cor); + } + if(isset($vetor[2]) and $vetor[2] != '') //Bold,Italic,Underline styles + { + $this->SetStyles($vetor[2]); + } + + if(isset($vetor[12]) and $vetor[12] != '') { //Requested Bold,Italic,Underline + $this->ReqFontStyle = $vetor[12]; + } + if(isset($vetor[1]) and $vetor[1] != '') //LINK + { + if (strpos($vetor[1],".") === false && strpos($vetor[1],"@") !== 0) //assuming every external link has a dot indicating extension (e.g: .html .txt .zip www.somewhere.com etc.) + { + //Repeated reference to same anchor? + while(array_key_exists($vetor[1],$this->internallink)) $vetor[1]="#".$vetor[1]; + $this->internallink[$vetor[1]] = $this->AddLink(); + $vetor[1] = $this->internallink[$vetor[1]]; + } + $this->HREF = $vetor[1]; // HREF link style set here ****** + } + + // SPECIAL CONTENT - IMAGES & FORM OBJECTS + //Print-out special content + + if (substr($vetor[0],0,3) == "\xbb\xa4\xac") { //identifier has been identified! + + $objattr = $this->_getObjAttr($vetor[0]); + +/*-- TABLES --*/ + if ($objattr['type'] == 'nestedtable') { + if ($objattr['nestedcontent']) { + $level = $objattr['level']; + $table = &$this->table[$level][$objattr['table']]; + if ($this->cacheTables) { + $fh = fopen($table['cache'], "r+b"); + $cell = $this->_uncacheCell($table['cells'][$objattr['row']][$objattr['col']], '', $fh); + } + else { + $fh = null; + $cell = &$table['cells'][$objattr['row']][$objattr['col']]; + } + $this->finishFlowingBlock(false,'nestedtable'); + $save_dw = $this->divwidth ; + $save_buffer = $this->cellBorderBuffer; + $this->cellBorderBuffer = array(); + $ncx = $this->x; + list($dummyx,$w) = $this->_tableGetWidth($table, $objattr['row'], $objattr['col'], $fh); + $ntw = $this->table[($level+1)][$objattr['nestedcontent']]['w']; // nested table width + if (!$this->simpleTables){ + if ($this->packTableData) { + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($cell['borderbin']); + } + else { + $br = $cell['border_details']['R']['w']; + $bl = $cell['border_details']['L']['w']; + } + if ($table['borders_separate']) { + $innerw = $w - $bl - $br - $cell['padding']['L'] - $cell['padding']['R'] - $table['border_spacing_H']; + } + else { + $innerw = $w - $bl/2 - $br/2 - $cell['padding']['L'] - $cell['padding']['R']; + } + } + else if ($this->simpleTables){ + if ($table['borders_separate']) { + $innerw = $w - $table['simple']['border_details']['L']['w'] - $table['simple']['border_details']['R']['w'] - $cell['padding']['L'] - $cell['padding']['R'] - $table['border_spacing_H']; + } + else { + $innerw = $w - $table['simple']['border_details']['L']['w']/2 - $table['simple']['border_details']['R']['w']/2 - $cell['padding']['L'] - $cell['padding']['R']; + } + } + if ($cell['a']=='C' || $this->table[($level+1)][$objattr['nestedcontent']]['a']=='C') { + $ncx += ($innerw-$ntw)/2; + } + elseif ($cell['a']=='R' || $this->table[($level+1)][$objattr['nestedcontent']]['a']=='R') { + $ncx += $innerw- $ntw; + } + $this->x = $ncx ; + if ($this->cacheTables) { fclose($fh); } + + $this->_tableWrite($this->table[($level+1)][$objattr['nestedcontent']]); + $this->cellBorderBuffer = $save_buffer; + $this->x = $bak_x ; + $this->divwidth = $save_dw; + $this->newFlowingBlock( $this->divwidth,$this->divheight,$align,$is_table,$is_list,$blockstate,false,$blockdir); + } + } + else { +/*-- END TABLES --*/ + if ($is_table) { // *TABLES* + $maxWidth = $this->divwidth; // *TABLES* + } // *TABLES* + else { // *TABLES* + $maxWidth = $this->divwidth - ($this->blk[$this->blklvl]['padding_left'] + $this->blk[$this->blklvl]['border_left']['w'] + $this->blk[$this->blklvl]['padding_right'] + $this->blk[$this->blklvl]['border_right']['w']); + } // *TABLES* + +/*-- CSS-IMAGE-FLOAT --*/ + // If float (already) exists at this level + if (isset($this->floatmargins['R']) && $this->y <= $this->floatmargins['R']['y1'] && $this->y >= $this->floatmargins['R']['y0']) { $maxWidth -= $this->floatmargins['R']['w']; } + if (isset($this->floatmargins['L']) && $this->y <= $this->floatmargins['L']['y1'] && $this->y >= $this->floatmargins['L']['y0']) { $maxWidth -= $this->floatmargins['L']['w']; } +/*-- END CSS-IMAGE-FLOAT --*/ + + list($skipln) = $this->inlineObject($objattr['type'], '', $this->y, $objattr,$this->lMargin, ($this->flowingBlockAttr['contentWidth']/_MPDFK), $maxWidth, $this->flowingBlockAttr['height'], false, $is_table); + // 1 -> New line needed because of width + // -1 -> Will fit width on line but NEW PAGE REQUIRED because of height + // -2 -> Will not fit on line therefore needs new line but thus NEW PAGE REQUIRED + $iby = $this->y; + $oldpage = $this->page; + $oldcol = $this->CurrCol; + if (($skipln == 1 || $skipln == -2) && !isset($objattr['float'])) { + $this->finishFlowingBlock(false,$objattr['type']); + $this->newFlowingBlock( $this->divwidth,$this->divheight,$align,$is_table,$is_list,$blockstate,false,$blockdir); + } + $thispage = $this->page; + if ($this->CurrCol!=$oldcol) { $changedcol = true; } + else { $changedcol=false; } + + // the previous lines can already have triggered page break or column change + if (!$changedcol && $skipln <0 && $this->AcceptPageBreak() && $thispage==$oldpage) { + + $this->AddPage($this->CurOrientation); + + // Added to correct Images already set on line before page advanced + // i.e. if second inline image on line is higher than first and forces new page + if (count($this->objectbuffer)) { + $yadj = $iby - $this->y; + foreach($this->objectbuffer AS $ib=>$val) { + if ($this->objectbuffer[$ib]['OUTER-Y'] ) $this->objectbuffer[$ib]['OUTER-Y'] -= $yadj; + if ($this->objectbuffer[$ib]['BORDER-Y']) $this->objectbuffer[$ib]['BORDER-Y'] -= $yadj; + if ($this->objectbuffer[$ib]['INNER-Y']) $this->objectbuffer[$ib]['INNER-Y'] -= $yadj; + } + } + } + + // Added to correct for OddEven Margins + if ($this->page != $oldpage) { + if (($this->page-$oldpage) % 2 == 1) { + $bak_x += $this->MarginCorrection; + } + $oldpage = $this->page; + $y = $this->tMargin - $paint_ht_corr ; + $this->oldy = $this->tMargin - $paint_ht_corr ; + $old_height = 0; + } + $this->x = $bak_x; +/*-- COLUMNS --*/ + // COLS + // OR COLUMN CHANGE + if ($this->CurrCol != $oldcolumn) { + if ($this->directionality == 'rtl') { // *RTL* + $bak_x -= ($this->CurrCol - $oldcolumn) * ($this->ColWidth+$this->ColGap); // *RTL* + } // *RTL* + else { // *RTL* + $bak_x += ($this->CurrCol - $oldcolumn) * ($this->ColWidth+$this->ColGap); + } // *RTL* + $this->x = $bak_x; + $oldcolumn = $this->CurrCol; + $y = $this->y0 - $paint_ht_corr ; + $this->oldy = $this->y0 - $paint_ht_corr ; + $old_height = 0; + } +/*-- END COLUMNS --*/ + +/*-- CSS-IMAGE-FLOAT --*/ + if ($objattr['type'] == 'image' && isset($objattr['float'])) { + $fy = $this->y; + + // DIV TOP MARGIN/BORDER/PADDING + if ($this->flowingBlockAttr['newblock'] && ($this->flowingBlockAttr['blockstate']==1 || $this->flowingBlockAttr['blockstate']==3) && $this->flowingBlockAttr['lineCount']== 0) { + $fy += $this->blk[$this->blklvl]['margin_top'] + $this->blk[$this->blklvl]['padding_top'] + $this->blk[$this->blklvl]['border_top']['w']; + } + + if ($objattr['float']=='R') { + $fx = $this->w - $this->rMargin - $objattr['width'] - ($this->blk[$this->blklvl]['outer_right_margin'] + $this->blk[$this->blklvl]['border_right']['w'] + $this->blk[$this->blklvl]['padding_right']); + + + } + else if ($objattr['float']=='L') { + $fx = $this->lMargin + ($this->blk[$this->blklvl]['outer_left_margin'] + $this->blk[$this->blklvl]['border_left']['w'] + $this->blk[$this->blklvl]['padding_left']); + } + $w = $objattr['width']; + $h = abs($objattr['height']); + + $widthLeft = $maxWidth - ($this->flowingBlockAttr['contentWidth']/_MPDFK); + $maxHeight = $this->h - ($this->tMargin + $this->margin_header + $this->bMargin + 10) ; + // For Images + $extraWidth = ($objattr['border_left']['w'] + $objattr['border_right']['w'] + $objattr['margin_left']+ $objattr['margin_right']); + $extraHeight = ($objattr['border_top']['w'] + $objattr['border_bottom']['w'] + $objattr['margin_top']+ $objattr['margin_bottom']); + + if ($objattr['itype'] == 'wmf' || $objattr['itype'] == 'svg') { + $file = $objattr['file']; + $info=$this->formobjects[$file]; + } + else { + $file = $objattr['file']; + $info=$this->images[$file]; + } + $img_w = $w - $extraWidth ; + $img_h = $h - $extraHeight ; + if ($objattr['border_left']['w']) { + $objattr['BORDER-WIDTH'] = $img_w + (($objattr['border_left']['w'] + $objattr['border_right']['w'])/2) ; + $objattr['BORDER-HEIGHT'] = $img_h + (($objattr['border_top']['w'] + $objattr['border_bottom']['w'])/2) ; + $objattr['BORDER-X'] = $fx + $objattr['margin_left'] + (($objattr['border_left']['w'])/2) ; + $objattr['BORDER-Y'] = $fy + $objattr['margin_top'] + (($objattr['border_top']['w'])/2) ; + } + $objattr['INNER-WIDTH'] = $img_w; + $objattr['INNER-HEIGHT'] = $img_h; + $objattr['INNER-X'] = $fx + $objattr['margin_left'] + ($objattr['border_left']['w']); + $objattr['INNER-Y'] = $fy + $objattr['margin_top'] + ($objattr['border_top']['w']) ; + $objattr['ID'] = $info['i']; + $objattr['OUTER-WIDTH'] = $w; + $objattr['OUTER-HEIGHT'] = $h; + $objattr['OUTER-X'] = $fx; + $objattr['OUTER-Y'] = $fy; + if ($objattr['float']=='R') { + // If R float already exists at this level + $this->floatmargins['R']['skipline'] = false; + if (isset($this->floatmargins['R']['y1']) && $this->floatmargins['R']['y1'] > 0 && $fy < $this->floatmargins['R']['y1']) { + $this->WriteFlowingBlock($vetor[0]); + } + // If L float already exists at this level + else if (isset($this->floatmargins['L']['y1']) && $this->floatmargins['L']['y1'] > 0 && $fy < $this->floatmargins['L']['y1']) { + // Final check distance between floats is not now too narrow to fit text + $mw = 2*$this->GetCharWidth('W',false); + if (($this->blk[$this->blklvl]['inner_width'] - $w - $this->floatmargins['L']['w']) < $mw) { + $this->WriteFlowingBlock($vetor[0]); + } + else { + $this->floatmargins['R']['x'] = $fx; + $this->floatmargins['R']['w'] = $w; + $this->floatmargins['R']['y0'] = $fy; + $this->floatmargins['R']['y1'] = $fy + $h; + if ($skipln == 1) { + $this->floatmargins['R']['skipline'] = true; + $this->floatmargins['R']['id'] = count($this->floatbuffer)+0; + $objattr['skipline'] = true; + } + $this->floatbuffer[] = $objattr; + } + } + else { + $this->floatmargins['R']['x'] = $fx; + $this->floatmargins['R']['w'] = $w; + $this->floatmargins['R']['y0'] = $fy; + $this->floatmargins['R']['y1'] = $fy + $h; + if ($skipln == 1) { + $this->floatmargins['R']['skipline'] = true; + $this->floatmargins['R']['id'] = count($this->floatbuffer)+0; + $objattr['skipline'] = true; + } + $this->floatbuffer[] = $objattr; + } + } + else if ($objattr['float']=='L') { + // If L float already exists at this level + $this->floatmargins['L']['skipline'] = false; + if (isset($this->floatmargins['L']['y1']) && $this->floatmargins['L']['y1'] > 0 && $fy < $this->floatmargins['L']['y1']) { + $this->floatmargins['L']['skipline'] = false; + $this->WriteFlowingBlock($vetor[0]); + } + // If R float already exists at this level + else if (isset($this->floatmargins['R']['y1']) && $this->floatmargins['R']['y1'] > 0 && $fy < $this->floatmargins['R']['y1']) { + // Final check distance between floats is not now too narrow to fit text + $mw = 2*$this->GetCharWidth('W',false); + if (($this->blk[$this->blklvl]['inner_width'] - $w - $this->floatmargins['R']['w']) < $mw) { + $this->WriteFlowingBlock($vetor[0]); + } + else { + $this->floatmargins['L']['x'] = $fx + $w; + $this->floatmargins['L']['w'] = $w; + $this->floatmargins['L']['y0'] = $fy; + $this->floatmargins['L']['y1'] = $fy + $h; + if ($skipln == 1) { + $this->floatmargins['L']['skipline'] = true; + $this->floatmargins['L']['id'] = count($this->floatbuffer)+0; + $objattr['skipline'] = true; + } + $this->floatbuffer[] = $objattr; + } + } + else { + $this->floatmargins['L']['x'] = $fx + $w; + $this->floatmargins['L']['w'] = $w; + $this->floatmargins['L']['y0'] = $fy; + $this->floatmargins['L']['y1'] = $fy + $h; + if ($skipln == 1) { + $this->floatmargins['L']['skipline'] = true; + $this->floatmargins['L']['id'] = count($this->floatbuffer)+0; + $objattr['skipline'] = true; + } + $this->floatbuffer[] = $objattr; + } + } + } + else { +/*-- END CSS-IMAGE-FLOAT --*/ + $this->WriteFlowingBlock($vetor[0]); +/*-- CSS-IMAGE-FLOAT --*/ + } +/*-- END CSS-IMAGE-FLOAT --*/ + } // *TABLES* + + } // END If special content + else { //THE text + if ($this->tableLevel) { $paint_ht_corr = 0; } // To move the y up when new column/page started if div border needed + else { $paint_ht_corr = $this->blk[$this->blklvl]['border_top']['w']; } + + if ($vetor[0] == "\n") { //We are reading a <BR> now turned into newline ("\n") + if ($this->flowingBlockAttr['content']) { + $this->finishFlowingBlock(false,'br'); + } + else if ($is_table) { + $this->y+= $this->_computeLineheight($this->table_lineheight); + } + else if (!$is_table) { + $this->DivLn($this->lineheight); + if ($this->ColActive) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + } + // Added to correct for OddEven Margins + if ($this->page != $oldpage) { + if (($this->page-$oldpage) % 2 == 1) { + $bak_x += $this->MarginCorrection; + } + $oldpage = $this->page; + $y = $this->tMargin - $paint_ht_corr ; + $this->oldy = $this->tMargin - $paint_ht_corr ; + $old_height = 0; + } + $this->x = $bak_x; +/*-- COLUMNS --*/ + // COLS + // OR COLUMN CHANGE + if ($this->CurrCol != $oldcolumn) { + if ($this->directionality == 'rtl') { // *RTL* + $bak_x -= ($this->CurrCol - $oldcolumn) * ($this->ColWidth+$this->ColGap); // *RTL* + } // *RTL* + else { // *RTL* + $bak_x += ($this->CurrCol - $oldcolumn) * ($this->ColWidth+$this->ColGap); + } // *RTL* + $this->x = $bak_x; + $oldcolumn = $this->CurrCol; + $y = $this->y0 - $paint_ht_corr ; + $this->oldy = $this->y0 - $paint_ht_corr ; + $old_height = 0; + } +/*-- END COLUMNS --*/ + $this->newFlowingBlock( $this->divwidth,$this->divheight,$align,$is_table,$is_list,$blockstate,false,$blockdir); + } + else { + $this->WriteFlowingBlock( $vetor[0]); + + // Added to correct for OddEven Margins + if ($this->page != $oldpage) { + if (($this->page-$oldpage) % 2 == 1) { + $bak_x += $this->MarginCorrection; + $this->x = $bak_x; + } + $oldpage = $this->page; + $y = $this->tMargin - $paint_ht_corr ; + $this->oldy = $this->tMargin - $paint_ht_corr ; + $old_height = 0; + } +/*-- COLUMNS --*/ + // COLS + // OR COLUMN CHANGE + if ($this->CurrCol != $oldcolumn) { + if ($this->directionality == 'rtl') { // *RTL* + $bak_x -= ($this->CurrCol - $oldcolumn) * ($this->ColWidth+$this->ColGap); // *RTL* + } // *RTL* + else { // *RTL* + $bak_x += ($this->CurrCol - $oldcolumn) * ($this->ColWidth+$this->ColGap); + } // *RTL* + $this->x = $bak_x; + $oldcolumn = $this->CurrCol; + $y = $this->y0 - $paint_ht_corr ; + $this->oldy = $this->y0 - $paint_ht_corr ; + $old_height = 0; + } +/*-- END COLUMNS --*/ + } + + + } + + //Check if it is the last element. If so then finish printing the block + if ($i == ($array_size-1)) { + $this->finishFlowingBlock(true); // true = END of flowing block + // Added to correct for OddEven Margins + if ($this->page != $oldpage) { + if (($this->page-$oldpage) % 2 == 1) { + $bak_x += $this->MarginCorrection; + $this->x = $bak_x; + } + $oldpage = $this->page; + $y = $this->tMargin - $paint_ht_corr ; + $this->oldy = $this->tMargin - $paint_ht_corr ; + $old_height = 0; + } + +/*-- COLUMNS --*/ + // COLS + // OR COLUMN CHANGE + if ($this->CurrCol != $oldcolumn) { + if ($this->directionality == 'rtl') { // *RTL* + $bak_x -= ($this->CurrCol - $oldcolumn) * ($this->ColWidth+$this->ColGap); // *RTL* + } // *RTL* + else { // *RTL* + $bak_x += ($this->CurrCol - $oldcolumn) * ($this->ColWidth+$this->ColGap); + } // *RTL* + $this->x = $bak_x; + $oldcolumn = $this->CurrCol; + $y = $this->y0 - $paint_ht_corr ; + $this->oldy = $this->y0 - $paint_ht_corr ; + $old_height = 0; + } +/*-- END COLUMNS --*/ + + } + + // RESETTING VALUES + $this->SetTColor($this->ConvertColor(0)); + $this->SetDColor($this->ConvertColor(0)); + $this->SetFColor($this->ConvertColor(255)); + $this->colorarray = ''; + $this->spanbgcolorarray = ''; + $this->spanbgcolor = false; + $this->spanborder = false; + $this->spanborddet = array(); + $this->HREF = ''; + $this->textparam = array(); + $this->SetTextOutline(); + $this->SUP = false; + $this->SUB = false; + + $this->strike = false; + $this->textshadow = ''; + + $this->currentfontfamily = ''; + $this->currentfontsize = ''; + $this->currentfontstyle = ''; +/*-- TABLES --*/ + if ($this->tableLevel) { + $this->SetLineHeight('',$this->table_lineheight); // *TABLES* + } + else +/*-- END TABLES --*/ +/*-- LISTS --*/ + if ($is_list && $this->list_lineheight[$this->listlvl][$this->listOcc]) { + $this->SetLineHeight('',$this->list_lineheight[$this->listlvl][$this->listOcc]); // sets default line height + } + else +/*-- END LISTS --*/ + if (isset($this->blk[$this->blklvl]['line_height']) && $this->blk[$this->blklvl]['line_height']) { + $this->SetLineHeight('',$this->blk[$this->blklvl]['line_height']); // sets default line height + } + $this->ResetStyles(); + $this->toupper = false; + $this->tolower = false; + $this->capitalize = false; + $this->kerning = false; + $this->lSpacingCSS = ''; + $this->wSpacingCSS = ''; + $this->fixedlSpacing = false; + $this->minwSpacing = 0; + $this->SetDash(); + $this->dash_on = false; + $this->dotted_on = false; + + }//end of for(i=0;i<arraysize;i++) + + + // PAINT DIV BORDER // DISABLED IN COLUMNS AS DOESN'T WORK WHEN BROKEN ACROSS COLS?? + if ((isset($this->blk[$this->blklvl]['border']) || isset($this->blk[$this->blklvl]['bgcolor']) || isset($this->blk[$this->blklvl]['box_shadow'])) && $blockstate && ($this->y != $this->oldy)) { + $bottom_y = $this->y; // Does not include Bottom Margin + if (isset($this->blk[$this->blklvl]['startpage']) && $this->blk[$this->blklvl]['startpage'] != $this->page && $blockstate != 1) { + $this->PaintDivBB('pagetop',$blockstate); + } + + else if ($blockstate != 1) { + $this->PaintDivBB('',$blockstate); + } + $this->y = $bottom_y; + $this->x = $bak_x; + } + + // Reset Font + $this->SetFontSize($this->default_font_size,false); + + +} + +function _setDashBorder($style, $div, $cp, $side) { + if ($style == 'dashed' && (($side=='L' || $side=='R') || ($side=='T' && $div != 'pagetop' && !$cp) || ($side=='B' && $div!='pagebottom') )) { + $dashsize = 2; // final dash will be this + 1*linewidth + $dashsizek = 1.5; // ratio of Dash/Blank + $this->SetDash($dashsize,($dashsize/$dashsizek)+($this->LineWidth*2)); + } + else if ($style == 'dotted' || ($side=='T' && ($div == 'pagetop' || $cp)) || ($side=='B' && $div == 'pagebottom')) { + //Round join and cap + $this->SetLineJoin(1); + $this->SetLineCap(1); + $this->SetDash(0.001,($this->LineWidth*3)); + } +} + +function _setBorderLine($b, $k=1) { + $this->SetLineWidth($b['w']/$k); + $this->SetDColor($b['c']); + if ($b['c'][0]==5) { // RGBa + $this->SetAlpha($b['c'][4], 'Normal', false, 'S')."\n"; + } + else if ($b['c'][0]==6) { // CMYKa + $this->SetAlpha($b['c'][5], 'Normal', false, 'S')."\n"; + } +} + +// mPDF 5.6.52 +function PaintDivBB($divider='',$blockstate=0,$blvl=0) { + // Borders & backgrounds are done elsewhere for columns - messes up the repositioning in printcolumnbuffer + if ($this->ColActive) { return ; } // *COLUMNS* + $save_y = $this->y; + if (!$blvl) { $blvl = $this->blklvl; } + $x0 = $x1 = $y0 = $y1 = 0; + + // Added mPDF 3.0 Float DIV + if (isset($this->blk[$blvl]['bb_painted'][$this->page]) && $this->blk[$blvl]['bb_painted'][$this->page]) { return; } // *CSS-FLOAT* + + if (isset($this->blk[$blvl]['x0'])) { $x0 = $this->blk[$blvl]['x0']; } // left + if (isset($this->blk[$blvl]['y1'])) { $y1 = $this->blk[$blvl]['y1']; } // bottom + + // Added mPDF 3.0 Float DIV - ensures backgrounds/borders are drawn to bottom of page + if ($y1==0) { + if ($divider=='pagebottom') { $y1 = $this->h-$this->bMargin; } + else { $y1 = $this->y; } + } + + if (isset($this->blk[$blvl]['startpage']) && $this->blk[$blvl]['startpage'] != $this->page) { $continuingpage = true; } else { $continuingpage = false; } + + if (isset($this->blk[$blvl]['y0'])) { $y0 = $this->blk[$blvl]['y0']; } + $h = $y1 - $y0; + $w = $this->blk[$blvl]['width']; + $x1 = $x0 + $w; + + // Set border-widths as used here + $border_top = $this->blk[$blvl]['border_top']['w']; + $border_bottom = $this->blk[$blvl]['border_bottom']['w']; + $border_left = $this->blk[$blvl]['border_left']['w']; + $border_right = $this->blk[$blvl]['border_right']['w']; + if (!$this->blk[$blvl]['border_top'] || $divider == 'pagetop' || $continuingpage) { + $border_top = 0; + } + if (!$this->blk[$blvl]['border_bottom'] || $blockstate == 1 || $divider == 'pagebottom') { + $border_bottom = 0; + } + + $brTL_H = 0; + $brTL_V = 0; + $brTR_H = 0; + $brTR_V = 0; + $brBL_H = 0; + $brBL_V = 0; + $brBR_H = 0; + $brBR_V = 0; + + $brset = false; +/*-- BORDER-RADIUS --*/ + if (isset($this->blk[$blvl]['border_radius_TL_H'])) { $brTL_H = $this->blk[$blvl]['border_radius_TL_H']; $brset = true; } + if (isset($this->blk[$blvl]['border_radius_TL_V'])) { $brTL_V = $this->blk[$blvl]['border_radius_TL_V']; $brset = true; } + if (isset($this->blk[$blvl]['border_radius_TR_H'])) { $brTR_H = $this->blk[$blvl]['border_radius_TR_H']; $brset = true; } + if (isset($this->blk[$blvl]['border_radius_TR_V'])) { $brTR_V = $this->blk[$blvl]['border_radius_TR_V']; $brset = true; } + if (isset($this->blk[$blvl]['border_radius_BR_H'])) { $brBR_H = $this->blk[$blvl]['border_radius_BR_H']; $brset = true; } + if (isset($this->blk[$blvl]['border_radius_BR_V'])) { $brBR_V = $this->blk[$blvl]['border_radius_BR_V']; $brset = true; } + if (isset($this->blk[$blvl]['border_radius_BL_H'])) { $brBL_H = $this->blk[$blvl]['border_radius_BL_H']; $brset = true; } + if (isset($this->blk[$blvl]['border_radius_BL_V'])) { $brBL_V = $this->blk[$blvl]['border_radius_BL_V']; $brset = true; } + + // mPDF 5.4.17 + //if (!$this->blk[$blvl]['border_top'] || $divider == 'pagetop' || $continuingpage || $this->keep_block_together) { + if (!$this->blk[$blvl]['border_top'] || $divider == 'pagetop' || $continuingpage) { + $brTL_H = 0; + $brTL_V = 0; + $brTR_H = 0; + $brTR_V = 0; + } + // mPDF 5.4.17 + //if (!$this->blk[$blvl]['border_bottom'] || $blockstate == 1 || $divider == 'pagebottom' || $this->keep_block_together) { + if (!$this->blk[$blvl]['border_bottom'] || $blockstate == 1 || $divider == 'pagebottom') { + $brBL_H = 0; + $brBL_V = 0; + $brBR_H = 0; + $brBR_V = 0; + } + + // Disallow border-radius if it is smaller than the border width. + if ($brTL_H < min($border_left, $border_top)) { $brTL_H = $brTL_V = 0; } + if ($brTL_V < min($border_left, $border_top)) { $brTL_V = $brTL_H = 0; } + if ($brTR_H < min($border_right, $border_top)) { $brTR_H = $brTR_V = 0; } + if ($brTR_V < min($border_right, $border_top)) { $brTR_V = $brTR_H = 0; } + if ($brBL_H < min($border_left, $border_bottom)) { $brBL_H = $brBL_V = 0; } + if ($brBL_V < min($border_left, $border_bottom)) { $brBL_V = $brBL_H = 0; } + if ($brBR_H < min($border_right, $border_bottom)) { $brBR_H = $brBR_V = 0; } + if ($brBR_V < min($border_right, $border_bottom)) { $brBR_V = $brBR_H = 0; } + + // CHECK FOR radii that sum to > width or height of div ******** + $f = min($h/($brTL_V + $brBL_V + 0.001), $h/($brTR_V + $brBR_V + 0.001), $w/($brTL_H + $brTR_H + 0.001), $w/($brBL_H + $brBR_H + 0.001)); + if ($f < 1) { + $brTL_H *= $f; + $brTL_V *= $f; + $brTR_H *= $f; + $brTR_V *= $f; + $brBL_H *= $f; + $brBL_V *= $f; + $brBR_H *= $f; + $brBR_V *= $f; + } +/*-- END BORDER-RADIUS --*/ + + $tbcol = $this->ConvertColor(255); + for($l=0; $l <= $blvl; $l++) { + if ($this->blk[$l]['bgcolor']) { + $tbcol = $this->blk[$l]['bgcolorarray']; + } + } + + // BORDERS + if (isset($this->blk[$blvl]['y0']) && $this->blk[$blvl]['y0']) { $y0 = $this->blk[$blvl]['y0']; } + $h = $y1 - $y0; + $w = $this->blk[$blvl]['width']; + + //if ($this->blk[$blvl]['border_top']) { + // Reinstate line above for dotted line divider when block border crosses a page + if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { + $tbd = $this->blk[$blvl]['border_top']; + + // mPDF 5.4.18 + $legend = ''; + if (isset($this->blk[$blvl]['border_legend']) && $this->blk[$blvl]['border_legend']) { + $legend = $this->blk[$blvl]['border_legend']; // Same structure array as textbuffer + $txt = ltrim($legend[0]); + + //Set font, size, style, color + $this->SetFont($legend[4],$legend[2],$legend[11]); + if ($legend[3]) { + $cor = $legend[3]; + $this->SetTColor($cor); + } + $stringWidth = $this->GetStringWidth($txt ); + $save_x = $this->x; + $save_y = $this->y; + $save_currentfontfamily = $this->FontFamily; + $save_currentfontsize = $this->FontSizePt; + $save_currentfontstyle = $this->FontStyle.($this->U ? 'U' : '').($this->S ? 'S' : ''); + $this->y = $y0 - $this->FontSize/2 + $this->blk[$blvl]['border_top']['w']/2; + $this->x = $x0 + $this->blk[$blvl]['padding_left'] + $this->blk[$blvl]['border_left']['w']; + + // Set the distance from the border line to the text ? make configurable variable + $gap = 0.2 * $this->FontSize; + + $legbreakL = $this->x - $gap; + $legbreakR = $this->x + $stringWidth + $gap; + + $this->Cell( $stringWidth, $this->FontSize, $txt , '', 0, 'C', $fill, '', 0, 0,0,'M', $fill); + // Reset + $this->x = $save_x; + $this->y = $save_y; + $this->SetFont($save_currentfontfamily,$save_currentfontstyle,$save_currentfontsize); + $this->SetTColor($this->ConvertColor(0)); + } + + if (isset($tbd['s']) && $tbd['s']) { + if (!$brset && $tbd['style']!='dotted' && $tbd['style']!='dashed') { + $this->_out('q'); + $this->SetLineWidth(0); + $this->_out(sprintf('%.3F %.3F m ',($x0)*_MPDFK, ($this->h-($y0))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0 + $border_left)*_MPDFK, ($this->h-($y0 + $border_top))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0 + $w - $border_right)*_MPDFK, ($this->h-($y0 + $border_top))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0 + $w)*_MPDFK, ($this->h-($y0))*_MPDFK)); + $this->_out(' h W n '); // Ends path no-op & Sets the clipping path + } + + $this->_setBorderLine($tbd); + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { + $legbreakL -= $border_top/2; // because line cap different + $legbreakR += $border_top/2; + $this->_setDashBorder($tbd['style'],$divider,$continuingpage,'T'); + } +/*-- BORDER-RADIUS --*/ + else if (($brTL_V && $brTL_H) || ($brTR_V && $brTR_H) || $tbd['style']=='solid' || $tbd['style']=='double' ) { // mPDF 5.6.58 + $this->SetLineJoin(0); + $this->SetLineCap(0); + } + $s = ''; + if ($brTR_H && $brTR_V) { + $s .= ($this->_EllipseArc($x0 + $w - $brTR_H, $y0 + $brTR_V, $brTR_H - $border_top/2 , $brTR_V - $border_top/2 , 1, 2, true))."\n"; + } + else +/*-- END BORDER-RADIUS --*/ + if ($tbd['style']=='solid' || $tbd['style']=='double') { + $s .= (sprintf('%.3F %.3F m ',($x0 + $w)*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } + else { + $s .= (sprintf('%.3F %.3F m ',($x0 + $w - ($border_top/2))*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } +/*-- BORDER-RADIUS --*/ + if ($brTL_H && $brTL_V ) { + // mPDF 5.4.18 + if ($legend) { + if ($legbreakR < ($x0 + $w - $brTR_H)) { + $s .= (sprintf('%.3F %.3F l ', $legbreakR*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } + if ($legbreakL > ($x0 + $brTL_H )) { + $s .= (sprintf('%.3F %.3F m ',$legbreakL*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + $s .= (sprintf('%.3F %.3F l ',($x0 + $brTL_H )*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK)."\n"); + } + else { + $s .= (sprintf('%.3F %.3F m ',($x0 + $brTL_H )*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } + } + else { + $s .= (sprintf('%.3F %.3F l ',($x0 + $brTL_H )*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } + $s .= ($this->_EllipseArc($x0 + $brTL_H, $y0 + $brTL_V, $brTL_H - $border_top/2 , $brTL_V - $border_top/2 , 2, 1))."\n"; + } + else { +/*-- END BORDER-RADIUS --*/ + // mPDF 5.4.18 + if ($legend) { + if ($legbreakR < ($x0 + $w)) { + $s .= (sprintf('%.3F %.3F l ',$legbreakR*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } + if ($legbreakL > ($x0)) { + $s .= (sprintf('%.3F %.3F m ',$legbreakL*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + if ($tbd['style']=='solid' || $tbd['style']=='double') { + $s .= (sprintf('%.3F %.3F l ',($x0)*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } + else { + $s .= (sprintf('%.3F %.3F l ',($x0 + ($border_top/2))*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } + } + else if ($tbd['style']=='solid' || $tbd['style']=='double') { + $s .= (sprintf('%.3F %.3F m ', ($x0)*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } + else { + $s .= (sprintf('%.3F %.3F m ', ($x0 + $border_top/2)*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } + } + else if ($tbd['style']=='solid' || $tbd['style']=='double') { + $s .= (sprintf('%.3F %.3F l ',($x0)*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } + else { + $s .= (sprintf('%.3F %.3F l ',($x0 + ($border_top/2))*_MPDFK, ($this->h-($y0 + ($border_top/2)))*_MPDFK))."\n"; + } +/*-- BORDER-RADIUS --*/ + } +/*-- END BORDER-RADIUS --*/ + $s .= 'S'."\n"; + $this->_out($s); + + if ($tbd['style']=='double') { + $this->SetLineWidth($tbd['w']/3); + $this->SetDColor($tbcol); + $this->_out($s); + } + if (!$brset && $tbd['style']!='dotted' && $tbd['style']!='dashed') { $this->_out('Q'); } + + // Reset Corners and Dash off + $this->SetLineWidth(0.1); // mPDF 5.6.57 + $this->SetDColor($this->ConvertColor(0)); + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + //if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1) { + // Reinstate line above for dotted line divider when block border crosses a page + if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { + $tbd = $this->blk[$blvl]['border_bottom']; + if (isset($tbd['s']) && $tbd['s']) { + if (!$brset && $tbd['style']!='dotted' && $tbd['style']!='dashed') { + $this->_out('q'); + $this->SetLineWidth(0); + $this->_out(sprintf('%.3F %.3F m ',($x0)*_MPDFK, ($this->h-($y0 + $h))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0 + $border_left)*_MPDFK, ($this->h-($y0 + $h - $border_bottom))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0 + $w - $border_right)*_MPDFK, ($this->h-($y0 + $h - $border_bottom))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0 + $w)*_MPDFK, ($this->h-($y0 + $h))*_MPDFK)); + $this->_out(' h W n '); // Ends path no-op & Sets the clipping path + } + + $this->_setBorderLine($tbd); + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { $this->_setDashBorder($tbd['style'],$divider,$continuingpage,'B'); } +/*-- BORDER-RADIUS --*/ + else if (($brBL_V && $brBL_H) || ($brBR_V && $brBR_H) || $tbd['style']=='solid' || $tbd['style']=='double' ) { // mPDF 5.6.58 + $this->SetLineJoin(0); + $this->SetLineCap(0); + } + $s = ''; + if ($brBL_H && $brBL_V) { + $s .= ($this->_EllipseArc($x0 + $brBL_H, $y0 + $h - $brBL_V, $brBL_H - $border_bottom/2 , $brBL_V - $border_bottom/2 , 3, 2, true))."\n"; + } + else +/*-- END BORDER-RADIUS --*/ + if ($tbd['style']=='solid' || $tbd['style']=='double') { + $s .= (sprintf('%.3F %.3F m ',($x0)*_MPDFK, ($this->h-($y0 + $h - ($border_bottom/2)))*_MPDFK))."\n"; + } + else { + $s .= (sprintf('%.3F %.3F m ',($x0 + ($border_bottom/2))*_MPDFK, ($this->h-($y0 + $h - ($border_bottom/2)))*_MPDFK))."\n"; + } +/*-- BORDER-RADIUS --*/ + if ($brBR_H && $brBR_V ) { + $s .= (sprintf('%.3F %.3F l ',($x0 + $w - ($border_bottom/2) - $brBR_H )*_MPDFK, ($this->h-($y0 + $h - ($border_bottom/2)))*_MPDFK))."\n"; + $s .= ($this->_EllipseArc($x0 + $w - $brBR_H, $y0 + $h - $brBR_V, $brBR_H - $border_bottom/2 , $brBR_V - $border_bottom/2 , 4, 1))."\n"; + } + else +/*-- END BORDER-RADIUS --*/ + if ($tbd['style']=='solid' || $tbd['style']=='double') { + $s .= (sprintf('%.3F %.3F l ',($x0 + $w)*_MPDFK, ($this->h-($y0 + $h - ($border_bottom/2)))*_MPDFK))."\n"; + } + else { + $s .= (sprintf('%.3F %.3F l ',($x0 + $w - ($border_bottom/2))*_MPDFK, ($this->h-($y0 + $h - ($border_bottom/2)))*_MPDFK))."\n"; + } + $s .= 'S'."\n"; + $this->_out($s); + + if ($tbd['style']=='double') { + $this->SetLineWidth($tbd['w']/3); + $this->SetDColor($tbcol); + $this->_out($s); + } + if (!$brset && $tbd['style']!='dotted' && $tbd['style']!='dashed') { $this->_out('Q'); } + + + // Reset Corners and Dash off + $this->SetLineWidth(0.1); // mPDF 5.6.57 + $this->SetDColor($this->ConvertColor(0)); + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + if ($this->blk[$blvl]['border_left']) { + $tbd = $this->blk[$blvl]['border_left']; + if (isset($tbd['s']) && $tbd['s']) { + if (!$brset && $tbd['style']!='dotted' && $tbd['style']!='dashed') { + $this->_out('q'); + $this->SetLineWidth(0); + $this->_out(sprintf('%.3F %.3F m ',($x0)*_MPDFK, ($this->h-($y0))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0 + $border_left)*_MPDFK, ($this->h-($y0+$border_top))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0 + $border_left)*_MPDFK, ($this->h-($y0 + $h - $border_bottom))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0)*_MPDFK, ($this->h-($y0 + $h))*_MPDFK)); + $this->_out(' h W n '); // Ends path no-op & Sets the clipping path + } + + $this->_setBorderLine($tbd); + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { $this->_setDashBorder($tbd['style'],$divider,$continuingpage,'L'); } +/*-- BORDER-RADIUS --*/ + else if (($brTL_V && $brTL_H) || ($brBL_V && $brBL_H) || $tbd['style']=='solid' || $tbd['style']=='double' ) { // mPDF 5.6.58 + $this->SetLineJoin(0); + $this->SetLineCap(0); + } + $s = ''; + if ($brTL_V && $brTL_H) { + $s .= ($this->_EllipseArc($x0 + $brTL_H, $y0 + $brTL_V, $brTL_H - $border_left/2 , $brTL_V - $border_left/2, 2, 2, true))."\n"; + } + else +/*-- END BORDER-RADIUS --*/ + if ($tbd['style']=='solid' || $tbd['style']=='double') { + $s .= (sprintf('%.3F %.3F m ',($x0 + ($border_left/2))*_MPDFK, ($this->h-($y0))*_MPDFK))."\n"; + } + else { + $s .= (sprintf('%.3F %.3F m ',($x0 + ($border_left/2))*_MPDFK, ($this->h-($y0 + ($border_left/2)))*_MPDFK))."\n"; + } +/*-- BORDER-RADIUS --*/ + if ($brBL_V && $brBL_H ) { + $s .= (sprintf('%.3F %.3F l ',($x0 + ($border_left/2))*_MPDFK, ($this->h-($y0 + $h - ($border_left/2)- $brBL_V) )*_MPDFK))."\n"; + $s .= ($this->_EllipseArc($x0 + $brBL_H, $y0 + $h - $brBL_V, $brBL_H - $border_left/2 , $brBL_V - $border_left/2, 3, 1))."\n"; + } + else +/*-- END BORDER-RADIUS --*/ + if ($tbd['style']=='solid' || $tbd['style']=='double') { + $s .= (sprintf('%.3F %.3F l ',($x0 + ($border_left/2))*_MPDFK, ($this->h-($y0 + $h) )*_MPDFK))."\n"; + } + else { + $s .= (sprintf('%.3F %.3F l ',($x0 + ($border_left/2))*_MPDFK, ($this->h-($y0 + $h - ($border_left/2)) )*_MPDFK))."\n"; + } + $s .= 'S'."\n"; + $this->_out($s); + + if ($tbd['style']=='double') { + $this->SetLineWidth($tbd['w']/3); + $this->SetDColor($tbcol); + $this->_out($s); + } + if (!$brset && $tbd['style']!='dotted' && $tbd['style']!='dashed') { $this->_out('Q'); } + + // Reset Corners and Dash off + $this->SetLineWidth(0.1); // mPDF 5.6.57 + $this->SetDColor($this->ConvertColor(0)); + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + if ($this->blk[$blvl]['border_right']) { + $tbd = $this->blk[$blvl]['border_right']; + if (isset($tbd['s']) && $tbd['s']) { + if (!$brset && $tbd['style']!='dotted' && $tbd['style']!='dashed') { + $this->_out('q'); + $this->SetLineWidth(0); + $this->_out(sprintf('%.3F %.3F m ',($x0 + $w)*_MPDFK, ($this->h-($y0))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0 + $w - $border_right)*_MPDFK, ($this->h-($y0+$border_top))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0 + $w - $border_right)*_MPDFK, ($this->h-($y0 + $h - $border_bottom))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F l ',($x0 + $w)*_MPDFK, ($this->h-($y0 + $h))*_MPDFK)); + $this->_out(' h W n '); // Ends path no-op & Sets the clipping path + } + + $this->_setBorderLine($tbd); + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { $this->_setDashBorder($tbd['style'],$divider,$continuingpage,'R'); } +/*-- BORDER-RADIUS --*/ + else if (($brTR_V && $brTR_H) || ($brBR_V && $brBR_H) || $tbd['style']=='solid' || $tbd['style']=='double' ) { // mPDF 5.6.58 + $this->SetLineJoin(0); + $this->SetLineCap(0); + } + $s = ''; + if ($brBR_V && $brBR_H) { + $s .= ($this->_EllipseArc($x0 + $w - $brBR_H, $y0 + $h - $brBR_V, $brBR_H - $border_right/2 , $brBR_V - $border_right/2, 4, 2, true))."\n"; + } + else +/*-- END BORDER-RADIUS --*/ + if ($tbd['style']=='solid' || $tbd['style']=='double') { + $s .= (sprintf('%.3F %.3F m ',($x0 + $w - ($border_right/2))*_MPDFK, ($this->h-($y0 + $h))*_MPDFK))."\n"; + } + else { + $s .= (sprintf('%.3F %.3F m ',($x0 + $w - ($border_right/2))*_MPDFK, ($this->h-($y0 + $h - ($border_right/2)))*_MPDFK))."\n"; + } +/*-- BORDER-RADIUS --*/ + if ($brTR_V && $brTR_H ) { + $s .= (sprintf('%.3F %.3F l ',($x0 + $w - ($border_right/2))*_MPDFK, ($this->h-($y0 + ($border_right/2) + $brTR_V) )*_MPDFK))."\n"; + $s .= ($this->_EllipseArc($x0 + $w - $brTR_H, $y0 + $brTR_V, $brTR_H - $border_right/2 , $brTR_V - $border_right/2, 1, 1))."\n"; + } + else +/*-- END BORDER-RADIUS --*/ + if ($tbd['style']=='solid' || $tbd['style']=='double') { + $s .= (sprintf('%.3F %.3F l ',($x0 + $w - ($border_right/2))*_MPDFK, ($this->h-($y0) )*_MPDFK))."\n"; + } + else { + $s .= (sprintf('%.3F %.3F l ',($x0 + $w - ($border_right/2))*_MPDFK, ($this->h-($y0 + ($border_right/2)) )*_MPDFK))."\n"; + } + $s .= 'S'."\n"; + $this->_out($s); + + if ($tbd['style']=='double') { + $this->SetLineWidth($tbd['w']/3); + $this->SetDColor($tbcol); + $this->_out($s); + } + if (!$brset && $tbd['style']!='dotted' && $tbd['style']!='dashed') { $this->_out('Q'); } + + // Reset Corners and Dash off + $this->SetLineWidth(0.1); // mPDF 5.6.57 + $this->SetDColor($this->ConvertColor(0)); + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + + + $this->SetDash(); + $this->y = $save_y; + + + // BACKGROUNDS are disabled in columns/kbt/headers - messes up the repositioning in printcolumnbuffer + if ($this->ColActive || $this->kwt || $this->keep_block_together) { return ; } + + + $bgx0 = $x0; + $bgx1 = $x1; + $bgy0 = $y0; + $bgy1 = $y1; + + // Defined br values represent the radius of the outer curve - need to take border-width/2 from each radius for drawing the borders + if (isset($this->blk[$blvl]['background_clip']) && $this->blk[$blvl]['background_clip'] == 'padding-box') { + $brbgTL_H = max(0, $brTL_H - $this->blk[$blvl]['border_left']['w']); + $brbgTL_V = max(0, $brTL_V - $this->blk[$blvl]['border_top']['w']); + $brbgTR_H = max(0, $brTR_H - $this->blk[$blvl]['border_right']['w']); + $brbgTR_V = max(0, $brTR_V - $this->blk[$blvl]['border_top']['w']); + $brbgBL_H = max(0, $brBL_H - $this->blk[$blvl]['border_left']['w']); + $brbgBL_V = max(0, $brBL_V - $this->blk[$blvl]['border_bottom']['w']); + $brbgBR_H = max(0, $brBR_H - $this->blk[$blvl]['border_right']['w']); + $brbgBR_V = max(0, $brBR_V - $this->blk[$blvl]['border_bottom']['w']); + $bgx0 += $this->blk[$blvl]['border_left']['w']; + $bgx1 -= $this->blk[$blvl]['border_right']['w']; + if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { + $bgy0 += $this->blk[$blvl]['border_top']['w']; + } + if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { + $bgy1 -= $this->blk[$blvl]['border_bottom']['w']; + } + } + // mPDF 5.6.09 + else if (isset($this->blk[$blvl]['background_clip']) && $this->blk[$blvl]['background_clip'] == 'content-box') { + $brbgTL_H = max(0, $brTL_H - $this->blk[$blvl]['border_left']['w'] - $this->blk[$blvl]['padding_left']); + $brbgTL_V = max(0, $brTL_V - $this->blk[$blvl]['border_top']['w'] - $this->blk[$blvl]['padding_top']); + $brbgTR_H = max(0, $brTR_H - $this->blk[$blvl]['border_right']['w'] - $this->blk[$blvl]['padding_right']); + $brbgTR_V = max(0, $brTR_V - $this->blk[$blvl]['border_top']['w'] - $this->blk[$blvl]['padding_top']); + $brbgBL_H = max(0, $brBL_H - $this->blk[$blvl]['border_left']['w'] - $this->blk[$blvl]['padding_left']); + $brbgBL_V = max(0, $brBL_V - $this->blk[$blvl]['border_bottom']['w'] - $this->blk[$blvl]['padding_bottom']); + $brbgBR_H = max(0, $brBR_H - $this->blk[$blvl]['border_right']['w'] - $this->blk[$blvl]['padding_right']); + $brbgBR_V = max(0, $brBR_V - $this->blk[$blvl]['border_bottom']['w'] - $this->blk[$blvl]['padding_bottom']); + $bgx0 += $this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['padding_left']; + $bgx1 -= $this->blk[$blvl]['border_right']['w'] + $this->blk[$blvl]['padding_right']; + if (($this->blk[$blvl]['border_top']['w'] || $this->blk[$blvl]['padding_top']) && $divider != 'pagetop' && !$continuingpage) { + $bgy0 += $this->blk[$blvl]['border_top']['w'] + $this->blk[$blvl]['padding_top']; + } + if (($this->blk[$blvl]['border_bottom']['w'] || $this->blk[$blvl]['padding_bottom']) && $blockstate != 1 && $divider != 'pagebottom') { + $bgy1 -= $this->blk[$blvl]['border_bottom']['w'] + $this->blk[$blvl]['padding_bottom']; + } + } + else { + $brbgTL_H = $brTL_H; + $brbgTL_V = $brTL_V; + $brbgTR_H = $brTR_H; + $brbgTR_V = $brTR_V; + $brbgBL_H = $brBL_H; + $brbgBL_V = $brBL_V; + $brbgBR_H = $brBR_H; + $brbgBR_V = $brBR_V; + } + + // Set clipping path + $s = ' q 0 w '; // Line width=0 + $s .= sprintf('%.3F %.3F m ', ($bgx0+$brbgTL_H )*_MPDFK, ($this->h-$bgy0)*_MPDFK); // start point TL before the arc +/*-- BORDER-RADIUS --*/ + if ($brbgTL_H || $brbgTL_V) { + $s .= $this->_EllipseArc($bgx0+$brbgTL_H, $bgy0+$brbgTL_V, $brbgTL_H , $brbgTL_V , 2); // segment 2 TL + } +/*-- END BORDER-RADIUS --*/ + $s .= sprintf('%.3F %.3F l ', ($bgx0)*_MPDFK, ($this->h-($bgy1-$brbgBL_V ))*_MPDFK); // line to BL +/*-- BORDER-RADIUS --*/ + if ($brbgBL_H || $brbgBL_V) { + $s .= $this->_EllipseArc($bgx0+$brbgBL_H, $bgy1-$brbgBL_V, $brbgBL_H , $brbgBL_V , 3); // segment 3 BL + } +/*-- END BORDER-RADIUS --*/ + $s .= sprintf('%.3F %.3F l ', ($bgx1-$brbgBR_H )*_MPDFK, ($this->h-($bgy1))*_MPDFK); // line to BR +/*-- BORDER-RADIUS --*/ + if ($brbgBR_H || $brbgBR_V) { + $s .= $this->_EllipseArc($bgx1-$brbgBR_H, $bgy1-$brbgBR_V, $brbgBR_H , $brbgBR_V , 4); // segment 4 BR + } +/*-- END BORDER-RADIUS --*/ + $s .= sprintf('%.3F %.3F l ', ($bgx1)*_MPDFK, ($this->h-($bgy0+$brbgTR_V))*_MPDFK); // line to TR +/*-- BORDER-RADIUS --*/ + if ($brbgTR_H || $brbgTR_V) { + $s .= $this->_EllipseArc($bgx1-$brbgTR_H, $bgy0+$brbgTR_V, $brbgTR_H , $brbgTR_V , 1); // segment 1 TR + } +/*-- END BORDER-RADIUS --*/ + $s .= sprintf('%.3F %.3F l ', ($bgx0+$brbgTL_H )*_MPDFK, ($this->h-$bgy0)*_MPDFK); // line to TL + + + // Box Shadow + $shadow = ''; + if (isset($this->blk[$blvl]['box_shadow']) && $this->blk[$blvl]['box_shadow'] && $h > 0) { + foreach($this->blk[$blvl]['box_shadow'] AS $sh) { + // Colors + if ($sh['col']{0}==1) { + $colspace = 'Gray'; + if ($sh['col']{2}==1) { $col1 = '1'.$sh['col'][1].'1'.$sh['col'][3]; } + else { $col1 = '1'.$sh['col'][1].'1'.chr(100); } + $col2 = '1'.$sh['col'][1].'1'.chr(0); + } + else if ($sh['col']{0}==4) { // CMYK + $colspace = 'CMYK'; + $col1 = '6'.$sh['col'][1].$sh['col'][2].$sh['col'][3].$sh['col'][4].chr(100); + $col2 = '6'.$sh['col'][1].$sh['col'][2].$sh['col'][3].$sh['col'][4].chr(0); + } + else if ($sh['col']{0}==5) { // RGBa + $colspace = 'RGB'; + $col1 = '5'.$sh['col'][1].$sh['col'][2].$sh['col'][3].$sh['col'][4]; + $col2 = '5'.$sh['col'][1].$sh['col'][2].$sh['col'][3].chr(0); + } + else if ($sh['col']{0}==6) { // CMYKa + $colspace = 'CMYK'; + $col1 = '6'.$sh['col'][1].$sh['col'][2].$sh['col'][3].$sh['col'][4].$sh['col'][5]; + $col2 = '6'.$sh['col'][1].$sh['col'][2].$sh['col'][3].$sh['col'][4].chr(0); + } + else { + $colspace = 'RGB'; + $col1 = '5'.$sh['col'][1].$sh['col'][2].$sh['col'][3].chr(100); + $col2 = '5'.$sh['col'][1].$sh['col'][2].$sh['col'][3].chr(0); + } + + // Use clipping path as set above (and rectangle around page) to clip area outside box + $shadow .= $s; // Use the clipping path with W* + $shadow .= sprintf('0 %.3F m %.3F %.3F l ', $this->h*_MPDFK, $this->w*_MPDFK, $this->h*_MPDFK); + $shadow .= sprintf('%.3F 0 l 0 0 l 0 %.3F l ', $this->w*_MPDFK, $this->h*_MPDFK); + $shadow .= 'W n'."\n"; + + $sh['blur'] = abs($sh['blur']); // cannot have negative blur value + // Ensure spread/blur do not make effective shadow width/height < 0 + // Could do more complex things but this just adjusts spread value + if (-$sh['spread'] + $sh['blur']/2 > min($w/2, $h/2)) { + $sh['spread'] = $sh['blur']/2 - min($w/2, $h/2) + 0.01; + } + // Shadow Offset + if ($sh['x'] || $sh['y']) $shadow .= sprintf(' q 1 0 0 1 %.4F %.4F cm', $sh['x']*_MPDFK, -$sh['y']*_MPDFK)."\n"; + + // Set path for INNER shadow + $shadow .= ' q 0 w '; + $shadow .= $this->SetFColor($col1, true)."\n"; + if ($col1{0}==5 && ord($col1{4})<100) { // RGBa + $shadow .= $this->SetAlpha(ord($col1{4})/100, 'Normal', true, 'F')."\n"; + } + else if ($col1{0}==6 && ord($col1{5})<100) { // CMYKa + $shadow .= $this->SetAlpha(ord($col1{5})/100, 'Normal', true, 'F')."\n"; + } + else if ($col1{0}==1 && $col1{2}==1 && ord($col1{3})<100) { // Gray + $shadow .= $this->SetAlpha(ord($col1{3})/100, 'Normal', true, 'F')."\n"; + } + + // Blur edges + $mag = 0.551784; // Bezier Control magic number for 4-part spline for circle/ellipse + $mag2 = 0.551784; // Bezier Control magic number to fill in edge of blurred rectangle + $d1 = $sh['spread']+$sh['blur']/2; + $d2 = $sh['spread']-$sh['blur']/2; + $bl = $sh['blur']; + $x00 = $x0 - $d1; + $y00 = $y0 - $d1; + $w00 = $w + $d1*2; + $h00 = $h + $d1*2; + + // If any border-radius is greater width-negative spread(inner edge), ignore radii for shadow or screws up + $flatten = false; + if (max($brbgTR_H, $brbgTL_H, $brbgBR_H, $brbgBL_H) >= $w+$d2) { $flatten = true; } + if (max($brbgTR_V, $brbgTL_V, $brbgBR_V, $brbgBL_V) >= $h+$d2) { $flatten = true; } + + + // TOP RIGHT corner + $p1x = $x00+$w00-$d1-$brbgTR_H; $p1c2x = $p1x +($d2+$brbgTR_H)*$mag; + $p1y = $y00+$bl; + $p2x = $x00+$w00-$d1-$brbgTR_H; $p2c2x = $p2x + ($d1+$brbgTR_H)*$mag; + $p2y = $y00; $p2c1y = $p2y + $bl/2; + $p3x = $x00+$w00; $p3c2x = $p3x - $bl/2; + $p3y = $y00+$d1+$brbgTR_V; $p3c1y = $p3y - ($d1+$brbgTR_V)*$mag; + $p4x = $x00+$w00-$bl; + $p4y = $y00+$d1+$brbgTR_V; $p4c2y = $p4y - ($d2+$brbgTR_V)*$mag; + if (-$d2 > min($brbgTR_H, $brbgTR_V) || $flatten) { + $p1x = $x00+$w00-$bl; $p1c2x = $p1x; + $p2x = $x00+$w00-$bl; $p2c2x = $p2x + $bl*$mag2; + $p3y = $y00+$bl; $p3c1y = $p3y - $bl*$mag2; + $p4y = $y00+$bl; $p4c2y = $p4y ; + } + + $shadow .= sprintf('%.3F %.3F m ', ($p1x )*_MPDFK, ($this->h-($p1y ))*_MPDFK); + $shadow .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', ($p1c2x)*_MPDFK, ($this->h-($p1y))*_MPDFK, ($p4x)*_MPDFK, ($this->h-($p4c2y))*_MPDFK, ($p4x)*_MPDFK, ($this->h-($p4y))*_MPDFK); + $patch_array[0]['f']=0; + $patch_array[0]['points']=array($p1x,$p1y, $p1x,$p1y, + $p2x,$p2c1y, $p2x,$p2y, $p2c2x,$p2y, + $p3x,$p3c1y, $p3x,$p3y, $p3c2x,$p3y, + $p4x,$p4y, $p4x,$p4y, $p4x,$p4c2y, + $p1c2x,$p1y); + $patch_array[0]['colors'] = array($col1,$col2,$col2,$col1); + + + // RIGHT + $p1x = $x00+$w00; // control point only matches p3 preceding + $p1y = $y00+$d1+$brbgTR_V; + $p2x = $x00+$w00-$bl; // control point only matches p4 preceding + $p2y = $y00+$d1+$brbgTR_V; + $p3x = $x00+$w00-$bl; + $p3y = $y00+$h00-$d1-$brbgBR_V; + $p4x = $x00+$w00; $p4c1x = $p4x-$bl/2; + $p4y = $y00+$h00-$d1-$brbgBR_V; + if (-$d2 > min($brbgTR_H, $brbgTR_V) || $flatten) { + $p1y = $y00+$bl; + $p2y = $y00+$bl; + } + if (-$d2 > min($brbgBR_H, $brbgBR_V) || $flatten) { + $p3y = $y00+$h00-$bl; + $p4y = $y00+$h00-$bl; + } + + $shadow .= sprintf('%.3F %.3F l ', ($p3x )*_MPDFK, ($this->h-($p3y ))*_MPDFK); + $patch_array[1]['f']=2; + $patch_array[1]['points']=array($p2x,$p2y, + $p3x,$p3y, $p3x,$p3y, $p3x,$p3y, + $p4c1x,$p4y, $p4x,$p4y, $p4x,$p4y, + $p1x,$p1y); + $patch_array[1]['colors'] = array($col1,$col2); + + + // BOTTOM RIGHT corner + $p1x = $x00+$w00-$bl; // control points only matches p3 preceding + $p1y = $y00+$h00-$d1-$brbgBR_V; $p1c2y = $p1y + ($d2+$brbgBR_V)*$mag; + $p2x = $x00+$w00; // control point only matches p4 preceding + $p2y = $y00+$h00-$d1-$brbgBR_V; $p2c2y = $p2y + ($d1+$brbgBR_V)*$mag; + $p3x = $x00+$w00-$d1-$brbgBR_H; $p3c1x = $p3x + ($d1+$brbgBR_H)*$mag; + $p3y = $y00+$h00; $p3c2y = $p3y - $bl/2; + $p4x = $x00+$w00-$d1-$brbgBR_H; $p4c2x = $p4x + ($d2+$brbgBR_H)*$mag; + $p4y = $y00+$h00-$bl; + + if (-$d2 > min($brbgBR_H, $brbgBR_V) || $flatten) { + $p1y = $y00+$h00-$bl; $p1c2y = $p1y; + $p2y = $y00+$h00-$bl; $p2c2y = $p2y + $bl*$mag2; + $p3x = $x00+$w00-$bl; $p3c1x = $p3x + $bl*$mag2; + $p4x = $x00+$w00-$bl; $p4c2x = $p4x; + } + + $shadow .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', ($p1x)*_MPDFK, ($this->h-($p1c2y))*_MPDFK, ($p4c2x)*_MPDFK, ($this->h-($p4y))*_MPDFK, ($p4x)*_MPDFK, ($this->h-($p4y))*_MPDFK); + $patch_array[2]['f']=2; + $patch_array[2]['points']=array($p2x,$p2c2y, + $p3c1x,$p3y, $p3x,$p3y, $p3x,$p3c2y, + $p4x,$p4y, $p4x,$p4y, $p4c2x,$p4y, + $p1x,$p1c2y); + $patch_array[2]['colors'] = array($col2,$col1); + + + + // BOTTOM + $p1x = $x00+$w00-$d1-$brbgBR_H; // control point only matches p3 preceding + $p1y = $y00+$h00; + $p2x = $x00+$w00-$d1-$brbgBR_H; // control point only matches p4 preceding + $p2y = $y00+$h00-$bl; + $p3x = $x00+$d1+$brbgBL_H; + $p3y = $y00+$h00-$bl; + $p4x = $x00+$d1+$brbgBL_H; + $p4y = $y00+$h00; $p4c1y = $p4y - $bl/2; + + if (-$d2 > min($brbgBR_H, $brbgBR_V) || $flatten) { + $p1x = $x00+$w00-$bl; + $p2x = $x00+$w00-$bl; + } + if (-$d2 > min($brbgBL_H, $brbgBL_V) || $flatten) { + $p3x = $x00+$bl; + $p4x = $x00+$bl; + } + + $shadow .= sprintf('%.3F %.3F l ', ($p3x )*_MPDFK, ($this->h-($p3y ))*_MPDFK); + $patch_array[3]['f']=2; + $patch_array[3]['points']=array($p2x,$p2y, + $p3x,$p3y, $p3x,$p3y, $p3x,$p3y, + $p4x,$p4c1y, $p4x,$p4y, $p4x,$p4y, + $p1x,$p1y); + $patch_array[3]['colors'] = array($col1,$col2); + + // BOTTOM LEFT corner + $p1x = $x00+$d1+$brbgBL_H; $p1c2x = $p1x - ($d2+$brbgBL_H)*$mag; // control points only matches p3 preceding + $p1y = $y00+$h00-$bl; + $p2x = $x00+$d1+$brbgBL_H; $p2c2x = $p2x - ($d1+$brbgBL_H)*$mag; // control point only matches p4 preceding + $p2y = $y00+$h00; + $p3x = $x00; $p3c2x = $p3x + $bl/2; + $p3y = $y00+$h00-$d1-$brbgBL_V; $p3c1y = $p3y + ($d1+$brbgBL_V)*$mag; + $p4x = $x00+$bl; + $p4y = $y00+$h00-$d1-$brbgBL_V; $p4c2y = $p4y + ($d2+$brbgBL_V)*$mag; + if (-$d2 > min($brbgBL_H, $brbgBL_V) || $flatten) { + $p1x = $x00+$bl; $p1c2x = $p1x; + $p2x = $x00+$bl; $p2c2x = $p2x - $bl*$mag2; + $p3y = $y00+$h00-$bl; $p3c1y = $p3y + $bl*$mag2; + $p4y = $y00+$h00-$bl; $p4c2y = $p4y; + } + + $shadow .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', ($p1c2x)*_MPDFK, ($this->h-($p1y))*_MPDFK, ($p4x)*_MPDFK, ($this->h-($p4c2y))*_MPDFK, ($p4x)*_MPDFK, ($this->h-($p4y))*_MPDFK); + $patch_array[4]['f']=2; + $patch_array[4]['points']=array($p2c2x,$p2y, + $p3x,$p3c1y, $p3x,$p3y, $p3c2x,$p3y, + $p4x,$p4y, $p4x,$p4y, $p4x,$p4c2y, + $p1c2x,$p1y); + $patch_array[4]['colors'] = array($col2,$col1); + + + // LEFT - joins on the right (C3-C4 of previous): f = 2 + $p1x = $x00; // control point only matches p3 preceding + $p1y = $y00+$h00-$d1-$brbgBL_V; + $p2x = $x00+$bl; // control point only matches p4 preceding + $p2y = $y00+$h00-$d1-$brbgBL_V; + $p3x = $x00+$bl; + $p3y = $y00+$d1+$brbgTL_V; + $p4x = $x00; $p4c1x = $p4x + $bl/2; + $p4y = $y00+$d1+$brbgTL_V; + if (-$d2 > min($brbgBL_H, $brbgBL_V) || $flatten) { + $p1y = $y00+$h00-$bl; + $p2y = $y00+$h00-$bl; + } + if (-$d2 > min($brbgTL_H, $brbgTL_V) || $flatten) { + $p3y = $y00+$bl; + $p4y = $y00+$bl; + } + + $shadow .= sprintf('%.3F %.3F l ', ($p3x )*_MPDFK, ($this->h-($p3y ))*_MPDFK); + $patch_array[5]['f']=2; + $patch_array[5]['points']=array($p2x,$p2y, + $p3x,$p3y, $p3x,$p3y, $p3x,$p3y, + $p4c1x,$p4y, $p4x,$p4y, $p4x,$p4y, + $p1x,$p1y); + $patch_array[5]['colors'] = array($col1,$col2); + + // TOP LEFT corner + $p1x = $x00+$bl; // control points only matches p3 preceding + $p1y = $y00+$d1+$brbgTL_V; $p1c2y = $p1y - ($d2+$brbgTL_V)*$mag; + $p2x = $x00; // control point only matches p4 preceding + $p2y = $y00+$d1+$brbgTL_V; $p2c2y = $p2y - ($d1+$brbgTL_V)*$mag; + $p3x = $x00+$d1+$brbgTL_H; $p3c1x = $p3x - ($d1+$brbgTL_H)*$mag; + $p3y = $y00; $p3c2y = $p3y + $bl/2; + $p4x = $x00+$d1+$brbgTL_H; $p4c2x = $p4x - ($d2+$brbgTL_H)*$mag; + $p4y = $y00+$bl; + + if (-$d2 > min($brbgTL_H, $brbgTL_V) || $flatten) { + $p1y = $y00+$bl; $p1c2y = $p1y; + $p2y = $y00+$bl; $p2c2y = $p2y - $bl*$mag2; + $p3x = $x00+$bl; $p3c1x = $p3x - $bl*$mag2; + $p4x = $x00+$bl; $p4c2x = $p4x ; + } + + $shadow .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', ($p1x)*_MPDFK, ($this->h-($p1c2y))*_MPDFK, ($p4c2x)*_MPDFK, ($this->h-($p4y))*_MPDFK, ($p4x)*_MPDFK, ($this->h-($p4y))*_MPDFK); + $patch_array[6]['f']=2; + $patch_array[6]['points']=array($p2x,$p2c2y, + $p3c1x,$p3y, $p3x,$p3y, $p3x,$p3c2y, + $p4x,$p4y, $p4x,$p4y, $p4c2x,$p4y, + $p1x,$p1c2y); + $patch_array[6]['colors'] = array($col2,$col1); + + + // TOP - joins on the right (C3-C4 of previous): f = 2 + $p1x = $x00+$d1+$brbgTL_H; // control point only matches p3 preceding + $p1y = $y00; + $p2x = $x00+$d1+$brbgTL_H; // control point only matches p4 preceding + $p2y = $y00+$bl; + $p3x = $x00+$w00-$d1-$brbgTR_H; + $p3y = $y00+$bl; + $p4x = $x00+$w00-$d1-$brbgTR_H; + $p4y = $y00; $p4c1y = $p4y + $bl/2; + if (-$d2 > min($brbgTL_H, $brbgTL_V) || $flatten) { + $p1x = $x00+$bl; + $p2x = $x00+$bl; + } + if (-$d2 > min($brbgTR_H, $brbgTR_V) || $flatten) { + $p3x = $x00+$w00-$bl; + $p4x = $x00+$w00-$bl; + } + + $shadow .= sprintf('%.3F %.3F l ', ($p3x )*_MPDFK, ($this->h-($p3y ))*_MPDFK); + $patch_array[7]['f']=2; + $patch_array[7]['points']=array($p2x,$p2y, + $p3x,$p3y, $p3x,$p3y, $p3x,$p3y, + $p4x,$p4c1y, $p4x,$p4y, $p4x,$p4y, + $p1x,$p1y); + $patch_array[7]['colors'] = array($col1,$col2); + + $shadow .= ' h f Q '."\n"; // Close path and Fill the inner solid shadow + + if ($bl) $shadow .= $this->grad->CoonsPatchMesh($x00,$y00,$w00,$h00,$patch_array,$x00,$x00+$w00,$y00,$y00+$h00, $colspace, true); + + if ($sh['x'] || $sh['y']) $shadow .= ' Q'."\n"; // Shadow Offset + $shadow .= ' Q'."\n"; // Ends path no-op & Sets the clipping path + + } + } + + $s .= ' W n '; // Ends path no-op & Sets the clipping path + + if ($this->blk[$blvl]['bgcolor']) { + $this->pageBackgrounds[$blvl][] = array('x'=>$x0, 'y'=>$y0, 'w'=>$w, 'h'=>$h, 'col'=>$this->blk[$blvl]['bgcolorarray'], 'clippath'=>$s, 'visibility'=>$this->visibility, 'shadow'=>$shadow, 'z-index'=>$this->current_layer); // mPDF 5.6.01 + } + else if ($shadow) { + $this->pageBackgrounds[$blvl][] = array('shadowonly'=>true, 'col'=>'', 'clippath'=>'', 'visibility'=>$this->visibility, 'shadow'=>$shadow, 'z-index'=>$this->current_layer); // mPDF 5.6.01 + } + +/*-- BACKGROUNDS --*/ + if (isset($this->blk[$blvl]['gradient'])) { + $g = $this->grad->parseBackgroundGradient($this->blk[$blvl]['gradient']); + if ($g) { + $gx = $x0; + $gy = $y0; + $this->pageBackgrounds[$blvl][] = array('gradient'=>true, 'x'=>$gx, 'y'=>$gy, 'w'=>$w, 'h'=>$h, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>$s, 'visibility'=>$this->visibility, 'z-index'=>$this->current_layer); // mPDF 5.6.01 + } + } + if (isset($this->blk[$blvl]['background-image'])) { + if ($this->blk[$blvl]['background-image']['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $this->blk[$blvl]['background-image']['gradient'] )) { + $g = $this->grad->parseMozGradient( $this->blk[$blvl]['background-image']['gradient'] ); + if ($g) { + $gx = $x0; + $gy = $y0; + // mPDF 5.6.11 + // origin specifies the background-positioning-area (bpa) + if ($this->blk[$blvl]['background-image']['origin'] == 'padding-box') { + $gx += $this->blk[$blvl]['border_left']['w']; + $w -= ($this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['border_right']['w']); + if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { + $gy += $this->blk[$blvl]['border_top']['w']; + } + if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { + $gy1 = $y1 - $this->blk[$blvl]['border_bottom']['w']; + } + else { $gy1 = $y1; } + $h = $gy1 - $gy; + } + else if ($this->blk[$blvl]['background-image']['origin'] == 'content-box') { + $gx += $this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['padding_left']; + $w -= ($this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['padding_left'] + $this->blk[$blvl]['border_right']['w'] + $this->blk[$blvl]['padding_right']); + if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { + $gy += $this->blk[$blvl]['border_top']['w'] + $this->blk[$blvl]['padding_top']; + } + if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { + $gy1 = $y1 - ($this->blk[$blvl]['border_bottom']['w'] + $this->blk[$blvl]['padding_bottom']); + } + else { $gy1 = $y1 - $this->blk[$blvl]['padding_bottom']; } + $h = $gy1 - $gy; + } + + if (isset($this->blk[$blvl]['background-image']['size']['w']) && $this->blk[$blvl]['background-image']['size']['w']) { + $size = $this->blk[$blvl]['background-image']['size']; + if ($size['w']!='contain' && $size['w']!='cover') { + if (stristr($size['w'] ,'%')) { + $size['w'] += 0; + $size['w'] /= 100; + $w *= $size['w']; + } + else if ($size['w']!='auto') { + $w = $size['w']; + } + if (stristr($size['h'] ,'%')) { + $size['h'] += 0; + $size['h'] /= 100; + $h *= $size['h']; + } + else if ($size['h']!='auto') { + $h = $size['h']; + } + } + } + $this->pageBackgrounds[$blvl][] = array('gradient'=>true, 'x'=>$gx, 'y'=>$gy, 'w'=>$w, 'h'=>$h, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>$s, 'visibility'=>$this->visibility, 'z-index'=>$this->current_layer); // mPDF 5.6.01 + } + } + else { + $image_id = $this->blk[$blvl]['background-image']['image_id']; + $orig_w = $this->blk[$blvl]['background-image']['orig_w']; + $orig_h = $this->blk[$blvl]['background-image']['orig_h']; + $x_pos = $this->blk[$blvl]['background-image']['x_pos']; + $y_pos = $this->blk[$blvl]['background-image']['y_pos']; + $x_repeat = $this->blk[$blvl]['background-image']['x_repeat']; + $y_repeat = $this->blk[$blvl]['background-image']['y_repeat']; + $resize = $this->blk[$blvl]['background-image']['resize']; + $opacity = $this->blk[$blvl]['background-image']['opacity']; + $itype = $this->blk[$blvl]['background-image']['itype']; + $size = $this->blk[$blvl]['background-image']['size']; // mPDF 5.6.10 + // mPDF 5.6.10 + // origin specifies the background-positioning-area (bpa) + $bpa = array('x'=>$x0, 'y'=>$y0, 'w'=>$w, 'h'=>$h); + if ($this->blk[$blvl]['background-image']['origin'] == 'padding-box') { + $bpa['x'] = $x0 + $this->blk[$blvl]['border_left']['w']; + $bpa['w'] = $w - ($this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['border_right']['w']); + if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { + $bpa['y'] = $y0 + $this->blk[$blvl]['border_top']['w']; + } + else { $bpa['y'] = $y0; } + if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { + $bpay = $y1 - $this->blk[$blvl]['border_bottom']['w']; + } + else { $bpay = $y1; } + $bpa['h'] = $bpay - $bpa['y']; + } + // mPDF 5.6.09 + else if ($this->blk[$blvl]['background-image']['origin'] == 'content-box') { + $bpa['x'] = $x0 + $this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['padding_left']; + $bpa['w'] = $w - ($this->blk[$blvl]['border_left']['w'] + $this->blk[$blvl]['padding_left'] + $this->blk[$blvl]['border_right']['w'] + $this->blk[$blvl]['padding_right']); + if ($this->blk[$blvl]['border_top'] && $divider != 'pagetop' && !$continuingpage) { + $bpa['y'] = $y0 + $this->blk[$blvl]['border_top']['w'] + $this->blk[$blvl]['padding_top']; + } + else { $bpa['y'] = $y0 + $this->blk[$blvl]['padding_top']; } + if ($this->blk[$blvl]['border_bottom'] && $blockstate != 1 && $divider != 'pagebottom') { + $bpay = $y1 - ($this->blk[$blvl]['border_bottom']['w'] + $this->blk[$blvl]['padding_bottom']); + } + else { $bpay = $y1 - $this->blk[$blvl]['padding_bottom']; } + $bpa['h'] = $bpay - $bpa['y']; + } + $this->pageBackgrounds[$blvl][] = array('x'=>$x0, 'y'=>$y0, 'w'=>$w, 'h'=>$h, 'image_id'=>$image_id, 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$x_pos, 'y_pos'=>$y_pos, 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'clippath'=>$s, 'resize'=>$resize, 'opacity'=>$opacity, 'itype'=>$itype, 'visibility'=>$this->visibility, 'z-index'=>$this->current_layer, 'size'=>$size, 'bpa'=>$bpa ); // mPDF 5.6.01 5.6.10 + } + } +/*-- END BACKGROUNDS --*/ + + // Float DIV + $this->blk[$blvl]['bb_painted'][$this->page] = true; + +} + +/*-- BORDER-RADIUS --*/ + +function _EllipseArc($x0, $y0, $rx, $ry, $seg = 1, $part=false, $start=false) { // Anticlockwise segment 1-4 TR-TL-BL-BR (part=1 or 2) + $s = ''; + if ($rx<0) { $rx = 0; } + if ($ry<0) { $ry = 0; } + $rx *= _MPDFK; + $ry *= _MPDFK; + $astart = 0; + if ($seg == 1) { // Top Right + $afinish = 90; + $nSeg = 4; + } + else if ($seg == 2) { // Top Left + $afinish = 180; + $nSeg = 8; + } + else if ($seg == 3) { // Bottom Left + $afinish = 270; + $nSeg = 12; + } + else { // Bottom Right + $afinish = 360; + $nSeg = 16; + } + $astart = deg2rad((float) $astart); + $afinish = deg2rad((float) $afinish); + $totalAngle = $afinish - $astart; + $dt = $totalAngle / $nSeg; // segment angle + $dtm = $dt/3; + $x0 *= _MPDFK; + $y0 = ($this->h - $y0) * _MPDFK; + $t1 = $astart; + $a0 = $x0 + ($rx * cos($t1)); + $b0 = $y0 + ($ry * sin($t1)); + $c0 = -$rx * sin($t1); + $d0 = $ry * cos($t1); + $op = false; + for ($i = 1; $i <= $nSeg; $i++) { + // Draw this bit of the total curve + $t1 = ($i * $dt) + $astart; + $a1 = $x0 + ($rx * cos($t1)); + $b1 = $y0 + ($ry * sin($t1)); + $c1 = -$rx * sin($t1); + $d1 = $ry * cos($t1); + if ($i>($nSeg-4) && (!$part || ($part == 1 && $i<=$nSeg-2) || ($part == 2 && $i>$nSeg-2))) { + if ($start && !$op) { + $s .= sprintf('%.3F %.3F m ', $a0, $b0); + } + $s .= sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c ', ($a0 + ($c0 * $dtm)), ($b0 + ($d0 * $dtm)), ($a1 - ($c1 * $dtm)) , ($b1 - ($d1 * $dtm)), $a1 , $b1 ); + $op = true; + } + $a0 = $a1; + $b0 = $b1; + $c0 = $c1; + $d0 = $d1; + } + return $s; +} +/*-- END BORDER-RADIUS --*/ + + + +function PaintDivLnBorder($state=0,$blvl=0,$h) { + // $state = 0 normal; 1 top; 2 bottom; 3 top and bottom + $this->ColDetails[$this->CurrCol]['bottom_margin'] = $this->y + $h; + + $save_y = $this->y; + + $w = $this->blk[$blvl]['width']; + $x0 = $this->x; // left + $y0 = $this->y; // top + $x1 = $this->x + $w; // bottom + $y1 = $this->y + $h; // bottom + + if ($this->blk[$blvl]['border_top'] && ($state==1 || $state==3)) { + $tbd = $this->blk[$blvl]['border_top']; + if (isset($tbd['s']) && $tbd['s']) { + $this->_setBorderLine($tbd); + $this->y = $y0 + ($tbd['w']/2); + // mPDF 5.6.56 + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { + $this->_setDashBorder($tbd['style'],'',$continuingpage,'T'); + $this->Line($x0 + ($tbd['w']/2) , $this->y , $x0 + $w - ($tbd['w']/2), $this->y); + } + else { + $this->SetLineJoin(0); + $this->SetLineCap(0); + $this->Line($x0, $this->y , $x0 + $w, $this->y); + } + $this->y += $tbd['w']; + // Reset Corners and Dash off + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + if ($this->blk[$blvl]['border_left']) { + $tbd = $this->blk[$blvl]['border_left']; + if (isset($tbd['s']) && $tbd['s']) { + $this->_setBorderLine($tbd); + // mPDF 5.6.56 + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { + $this->y = $y0 + ($tbd['w']/2); + $this->_setDashBorder($tbd['style'],'',$continuingpage,'L'); + $this->Line($x0 + ($tbd['w']/2), $this->y, $x0 + ($tbd['w']/2), $y0 + $h -($tbd['w']/2)); + } + else { + $this->y = $y0; + $this->SetLineJoin(0); + $this->SetLineCap(0); + $this->Line($x0 + ($tbd['w']/2), $this->y, $x0 + ($tbd['w']/2), $y0 + $h); + } + $this->y += $tbd['w']; + // Reset Corners and Dash off + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + if ($this->blk[$blvl]['border_right']) { + $tbd = $this->blk[$blvl]['border_right']; + if (isset($tbd['s']) && $tbd['s']) { + $this->_setBorderLine($tbd); + // mPDF 5.6.56 + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { + $this->y = $y0 + ($tbd['w']/2); + $this->_setDashBorder($tbd['style'],'',$continuingpage,'R'); + $this->Line($x0 + $w - ($tbd['w']/2), $this->y, $x0 + $w - ($tbd['w']/2), $y0 + $h - ($tbd['w']/2)); + } + else { + $this->y = $y0; + $this->SetLineJoin(0); + $this->SetLineCap(0); + $this->Line($x0 + $w - ($tbd['w']/2), $this->y, $x0 + $w - ($tbd['w']/2), $y0 + $h); + } + $this->y += $tbd['w']; + // Reset Corners and Dash off + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + if ($this->blk[$blvl]['border_bottom'] && $state > 1) { + $tbd = $this->blk[$blvl]['border_bottom']; + if (isset($tbd['s']) && $tbd['s']) { + $this->_setBorderLine($tbd); + $this->y = $y0 + $h - ($tbd['w']/2); + // mPDF 5.6.56 + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { + $this->_setDashBorder($tbd['style'],'',$continuingpage,'B'); + $this->Line($x0 + ($tbd['w']/2) , $this->y, $x0 + $w - ($tbd['w']/2), $this->y); + } + else { + $this->SetLineJoin(0); + $this->SetLineCap(0); + $this->Line($x0, $this->y, $x0 + $w, $this->y); + } + $this->y += $tbd['w']; + // Reset Corners and Dash off + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + $this->SetDash(); + $this->y = $save_y; +} + + +function PaintImgBorder($objattr,$is_table) { + // Borders are disabled in columns - messes up the repositioning in printcolumnbuffer + if ($this->ColActive) { return ; } // *COLUMNS* + if ($is_table) { $k = $this->shrin_k; } else { $k = 1; } + $h = (isset($objattr['BORDER-HEIGHT']) ? $objattr['BORDER-HEIGHT'] : 0); + $w = (isset($objattr['BORDER-WIDTH']) ? $objattr['BORDER-WIDTH'] : 0); + $x0 = (isset($objattr['BORDER-X']) ? $objattr['BORDER-X'] : 0); + $y0 = (isset($objattr['BORDER-Y']) ? $objattr['BORDER-Y'] : 0); + + // BORDERS + if ($objattr['border_top']) { + $tbd = $objattr['border_top']; + if (!empty($tbd['s'])) { + $this->_setBorderLine($tbd,$k); + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { $this->_setDashBorder($tbd['style'],'','','T'); } + $this->Line($x0, $y0, $x0 + $w, $y0); + // Reset Corners and Dash off + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + if ($objattr['border_left']) { + $tbd = $objattr['border_left']; + if (!empty($tbd['s'])) { + $this->_setBorderLine($tbd,$k); + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { $this->_setDashBorder($tbd['style'],'','','L'); } + $this->Line($x0, $y0, $x0, $y0 + $h); + // Reset Corners and Dash off + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + if ($objattr['border_right']) { + $tbd = $objattr['border_right']; + if (!empty($tbd['s'])) { + $this->_setBorderLine($tbd,$k); + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { $this->_setDashBorder($tbd['style'],'','','R'); } + $this->Line($x0 + $w, $y0, $x0 + $w, $y0 + $h); + // Reset Corners and Dash off + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + if ($objattr['border_bottom']) { + $tbd = $objattr['border_bottom']; + if (!empty($tbd['s'])) { + $this->_setBorderLine($tbd,$k); + if ($tbd['style']=='dotted' || $tbd['style']=='dashed') { $this->_setDashBorder($tbd['style'],'','','B'); } + $this->Line($x0, $y0 + $h, $x0 + $w, $y0 + $h); + // Reset Corners and Dash off + $this->SetLineJoin(2); + $this->SetLineCap(2); + $this->SetDash(); + } + } + $this->SetDash(); + $this->SetAlpha(1); +} + +/*-- END HTML-CSS --*/ + + + + +function Reset() { + $this->SetTColor($this->ConvertColor(0)); + $this->SetDColor($this->ConvertColor(0)); + $this->SetFColor($this->ConvertColor(255)); + $this->SetAlpha(1); + $this->colorarray = ''; + + $this->spanbgcolorarray = ''; + $this->spanbgcolor = false; + $this->spanborder = false; + $this->spanborddet = array(); + + $this->ResetStyles(); + + $this->HREF = ''; + $this->textparam = array(); + $this->SetTextOutline(); + + $this->SUP = false; + $this->SUB = false; + $this->strike = false; + $this->textshadow = ''; + + $this->SetFont($this->default_font,'',0,false); + $this->SetFontSize($this->default_font_size,false); + + $this->currentfontfamily = ''; + $this->currentfontsize = ''; + +/*-- TABLES --*/ + if ($this->tableLevel) { + $this->SetLineHeight('',$this->table_lineheight); // *TABLES* + } + else +/*-- END TABLES --*/ +/*-- LISTS --*/ + + if ($this->listlvl && $this->list_lineheight[$this->listlvl][$this->bulletarray['occur']]) { + $this->SetLineHeight('',$this->list_lineheight[$this->listlvl][$this->bulletarray['occur']]); // sets default line height + } + else +/*-- END LISTS --*/ + if (isset($this->blk[$this->blklvl]['line_height']) && $this->blk[$this->blklvl]['line_height']) { + $this->SetLineHeight('',$this->blk[$this->blklvl]['line_height']); // sets default line height + } + + $this->toupper = false; + $this->tolower = false; + $this->kerning = false; + $this->lSpacingCSS = ''; + $this->wSpacingCSS = ''; + $this->fixedlSpacing = false; + $this->minwSpacing = 0; + $this->capitalize = false; + $this->SetDash(); //restore to no dash + $this->dash_on = false; + $this->dotted_on = false; + $this->divwidth = 0; + $this->divheight = 0; + $this->divalign = ''; + $this->divrevert = false; + $this->oldy = -1; + + $bodystyle = array(); + if (isset($this->cssmgr->CSS['BODY']['FONT-STYLE'])) { $bodystyle['FONT-STYLE'] = $this->cssmgr->CSS['BODY']['FONT-STYLE']; } + if (isset($this->cssmgr->CSS['BODY']['FONT-WEIGHT'])) { $bodystyle['FONT-WEIGHT'] = $this->cssmgr->CSS['BODY']['FONT-WEIGHT']; } + if (isset($this->cssmgr->CSS['BODY']['COLOR'])) { $bodystyle['COLOR'] = $this->cssmgr->CSS['BODY']['COLOR']; } + if (isset($bodystyle)) { $this->setCSS($bodystyle,'BLOCK','BODY'); } + +} + +/*-- HTML-CSS --*/ +function ReadMetaTags($html) { + // changes anykey=anyvalue to anykey="anyvalue" (only do this when this happens inside tags) + $regexp = '/ (\\w+?)=([^\\s>"]+)/si'; + $html = preg_replace($regexp," \$1=\"\$2\"",$html); + if (preg_match('/<title>(.*?)<\/title>/si',$html,$m)) { + $this->SetTitle($m[1]); + } + preg_match_all('/<meta [^>]*?(name|content)="([^>]*?)" [^>]*?(name|content)="([^>]*?)".*?>/si',$html,$aux); + $firstattr = $aux[1]; + $secondattr = $aux[3]; + for( $i = 0 ; $i < count($aux[0]) ; $i++) { + + $name = ( strtoupper($firstattr[$i]) == "NAME" )? strtoupper($aux[2][$i]) : strtoupper($aux[4][$i]); + $content = ( strtoupper($firstattr[$i]) == "CONTENT" )? $aux[2][$i] : $aux[4][$i]; + switch($name) { + case "KEYWORDS": $this->SetKeywords($content); break; + case "AUTHOR": $this->SetAuthor($content); break; + case "DESCRIPTION": $this->SetSubject($content); break; + } + } +} + + +function ReadCharset($html) { + // Charset conversion + if ($this->allow_charset_conversion) { + if (preg_match('/<head.*charset=([^\'\"\s]*).*<\/head>/si',$html,$m)) { + if (strtoupper($m[1]) != 'UTF-8') { + $this->charset_in = strtoupper($m[1]); + } + } + } +} + +function setCSS($arrayaux,$type='',$tag='') { // type= INLINE | BLOCK | LIST // tag= BODY + if (!is_array($arrayaux)) return; //Removes PHP Warning + // Set font size first so that e.g. MARGIN 0.83em works on font size for this element + if (isset($arrayaux['FONT-SIZE'])) { + $v = $arrayaux['FONT-SIZE']; + if(is_numeric($v[0])) { + if ($type == 'BLOCK' && $this->blklvl>0 && isset($this->blk[$this->blklvl-1]['InlineProperties']) && isset($this->blk[$this->blklvl-1]['InlineProperties']['size'])) { + $mmsize = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['InlineProperties']['size']); + } + else { + $mmsize = $this->ConvertSize($v,$this->FontSize); + } + $this->SetFontSize( $mmsize*(_MPDFK),false ); //Get size in points (pt) + } + else{ + $v = strtoupper($v); + if (isset($this->fontsizes[$v])) { + $this->SetFontSize( $this->fontsizes[$v]* $this->default_font_size,false); + } + } + if ($tag == 'BODY') { $this->SetDefaultFontSize($this->FontSizePt); } + } + + + if ($this->useLang && !$this->usingCoreFont) { + if (isset($arrayaux['LANG']) && $arrayaux['LANG'] && $arrayaux['LANG'] != $this->default_lang && ((strlen($arrayaux['LANG']) == 5 && $arrayaux['LANG'] != 'UTF-8') || strlen($arrayaux['LANG']) == 2)) { + list ($coreSuitable,$mpdf_pdf_unifonts) = GetLangOpts($arrayaux['LANG'], $this->useAdobeCJK); + if ($mpdf_pdf_unifonts) { $this->RestrictUnicodeFonts($mpdf_pdf_unifonts); } + else { $this->RestrictUnicodeFonts($this->default_available_fonts ); } + if ($tag == 'BODY') { + $this->currentLang = $arrayaux['LANG']; + $this->default_lang = $arrayaux['LANG']; + if ($mpdf_pdf_unifonts) { $this->default_available_fonts = $mpdf_pdf_unifonts; } + } + } + else { + $this->RestrictUnicodeFonts($this->default_available_fonts ); + } + } + + // FOR INLINE and BLOCK OR 'BODY' + if (isset($arrayaux['FONT-FAMILY'])) { + $v = $arrayaux['FONT-FAMILY']; + //If it is a font list, get all font types + $aux_fontlist = explode(",",$v); + $found = 0; + foreach($aux_fontlist AS $f) { + $fonttype = trim($f); + $fonttype = preg_replace('/["\']*(.*?)["\']*/','\\1',$fonttype); + $fonttype = preg_replace('/ /','',$fonttype); + $v = strtolower(trim($fonttype)); + if (isset($this->fonttrans[$v]) && $this->fonttrans[$v]) { $v = $this->fonttrans[$v]; } + if ((!$this->onlyCoreFonts && in_array($v,$this->available_unifonts)) || + in_array($v,array('ccourier','ctimes','chelvetica')) || + ($this->onlyCoreFonts && in_array($v,array('courier','times','helvetica','arial'))) || + in_array($v, array('sjis','uhc','big5','gb'))) { + $fonttype = $v; + $found = 1; + break; + } + } + if (!$found) { + foreach($aux_fontlist AS $f) { + $fonttype = trim($f); + $fonttype = preg_replace('/["\']*(.*?)["\']*/','\\1',$fonttype); + $fonttype = preg_replace('/ /','',$fonttype); + $v = strtolower(trim($fonttype)); + if (isset($this->fonttrans[$v]) && $this->fonttrans[$v]) { $v = $this->fonttrans[$v]; } + if (in_array($v,$this->sans_fonts) || in_array($v,$this->serif_fonts) || in_array($v,$this->mono_fonts) ) { + $fonttype = $v; + break; + } + } + } + + if ($tag == 'BODY') { + $this->SetDefaultFont($fonttype); + } + $this->SetFont($fonttype,$this->currentfontstyle,0,false); + } + else { + $this->SetFont($this->currentfontfamily,$this->currentfontstyle,0,false); + } + + foreach($arrayaux as $k => $v) { + if ($type != 'INLINE' && $tag != 'BODY' && $type != 'LIST') { + switch($k){ + // BORDERS + case 'BORDER-TOP': + $this->blk[$this->blklvl]['border_top'] = $this->border_details($v); + if ($this->blk[$this->blklvl]['border_top']['s']) { $this->blk[$this->blklvl]['border'] = 1; } + break; + case 'BORDER-BOTTOM': + $this->blk[$this->blklvl]['border_bottom'] = $this->border_details($v); + if ($this->blk[$this->blklvl]['border_bottom']['s']) { $this->blk[$this->blklvl]['border'] = 1; } + break; + case 'BORDER-LEFT': + $this->blk[$this->blklvl]['border_left'] = $this->border_details($v); + if ($this->blk[$this->blklvl]['border_left']['s']) { $this->blk[$this->blklvl]['border'] = 1; } + break; + case 'BORDER-RIGHT': + $this->blk[$this->blklvl]['border_right'] = $this->border_details($v); + if ($this->blk[$this->blklvl]['border_right']['s']) { $this->blk[$this->blklvl]['border'] = 1; } + break; + + // PADDING + case 'PADDING-TOP': + $this->blk[$this->blklvl]['padding_top'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'PADDING-BOTTOM': + $this->blk[$this->blklvl]['padding_bottom'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'PADDING-LEFT': + $this->blk[$this->blklvl]['padding_left'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'PADDING-RIGHT': + $this->blk[$this->blklvl]['padding_right'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + + // MARGINS + case 'MARGIN-TOP': + $tmp = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + if (isset($this->blk[$this->blklvl]['lastbottommargin'])) { + if ($tmp > $this->blk[$this->blklvl]['lastbottommargin']) { + $tmp -= $this->blk[$this->blklvl]['lastbottommargin']; + } + else { + $tmp = 0; + } + } + $this->blk[$this->blklvl]['margin_top'] = $tmp; + break; + case 'MARGIN-BOTTOM': + $this->blk[$this->blklvl]['margin_bottom'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'MARGIN-LEFT': + $this->blk[$this->blklvl]['margin_left'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'MARGIN-RIGHT': + $this->blk[$this->blklvl]['margin_right'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + +/*-- BORDER-RADIUS --*/ + case 'BORDER-TOP-LEFT-RADIUS-H': + $this->blk[$this->blklvl]['border_radius_TL_H'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'BORDER-TOP-LEFT-RADIUS-V': + $this->blk[$this->blklvl]['border_radius_TL_V'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'BORDER-TOP-RIGHT-RADIUS-H': + $this->blk[$this->blklvl]['border_radius_TR_H'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'BORDER-TOP-RIGHT-RADIUS-V': + $this->blk[$this->blklvl]['border_radius_TR_V'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'BORDER-BOTTOM-LEFT-RADIUS-H': + $this->blk[$this->blklvl]['border_radius_BL_H'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'BORDER-BOTTOM-LEFT-RADIUS-V': + $this->blk[$this->blklvl]['border_radius_BL_V'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'BORDER-BOTTOM-RIGHT-RADIUS-H': + $this->blk[$this->blklvl]['border_radius_BR_H'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; + case 'BORDER-BOTTOM-RIGHT-RADIUS-V': + $this->blk[$this->blklvl]['border_radius_BR_V'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + break; +/*-- END BORDER-RADIUS --*/ + + case 'BOX-SHADOW': + $bs = $this->cssmgr->setCSSboxshadow($v); + if ($bs) { $this->blk[$this->blklvl]['box_shadow'] = $bs; } + break; + + case 'BACKGROUND-CLIP': + if (strtoupper($v) == 'PADDING-BOX') { $this->blk[$this->blklvl]['background_clip'] = 'padding-box'; } + else if (strtoupper($v) == 'CONTENT-BOX') { $this->blk[$this->blklvl]['background_clip'] = 'content-box'; } // mPDF 5.6.09 + break; + + case 'PAGE-BREAK-AFTER': + if (strtoupper($v) == 'AVOID') { $this->blk[$this->blklvl]['page_break_after_avoid'] = true; } + else if (strtoupper($v) == 'ALWAYS' || strtoupper($v) == 'LEFT' || strtoupper($v) == 'RIGHT') { $this->blk[$this->blklvl]['page_break_after'] = strtoupper($v) ; } + break; + + case 'WIDTH': + if (strtoupper($v) != 'AUTO') { + $this->blk[$this->blklvl]['css_set_width'] = $this->ConvertSize($v,$this->blk[$this->blklvl-1]['inner_width'],$this->FontSize,false); + } + break; + + case 'TEXT-INDENT': + // Left as raw value (may include 1% or 2em) + $this->blk[$this->blklvl]['text_indent'] = $v; + break; + + }//end of switch($k) + } + + + if ($type != 'INLINE' && $type != 'LIST') { // includes BODY tag + switch($k){ + + case 'MARGIN-COLLAPSE': // Custom tag to collapse margins at top and bottom of page + if (strtoupper($v) == 'COLLAPSE') { $this->blk[$this->blklvl]['margin_collapse'] = true; } + break; + + case 'LINE-HEIGHT': + $this->blk[$this->blklvl]['line_height'] = $this->fixLineheight($v); + if (!$this->blk[$this->blklvl]['line_height'] ) { $this->blk[$this->blklvl]['line_height'] = $this->normalLineheight; } + break; + + case 'TEXT-ALIGN': //left right center justify + switch (strtoupper($v)) { + case 'LEFT': + $this->blk[$this->blklvl]['align']="L"; + break; + case 'CENTER': + $this->blk[$this->blklvl]['align']="C"; + break; + case 'RIGHT': + $this->blk[$this->blklvl]['align']="R"; + break; + case 'JUSTIFY': + $this->blk[$this->blklvl]['align']="J"; + break; + } + break; + +/*-- BACKGROUNDS --*/ + case 'BACKGROUND-GRADIENT': + if ($type == 'BLOCK') { + $this->blk[$this->blklvl]['gradient'] = $v; + } + break; +/*-- END BACKGROUNDS --*/ + + case 'DIRECTION': + if ($v) { $this->blk[$this->blklvl]['direction'] = strtolower($v); } + break; + + }//end of switch($k) + } + + // FOR INLINE ONLY + if ($type == 'INLINE' || $type == 'LIST') { + switch($k){ + case 'DISPLAY': // Custom tag to collapse margins at top and bottom of page + if (strtoupper($v) == 'NONE') { $this->inlineDisplayOff = true; } + break; + case 'DIRECTION': + break; + }//end of switch($k) + } + // FOR INLINE ONLY + if ($type == 'INLINE') { + switch($k){ + // BORDERS + case 'BORDER-TOP': + $this->spanborddet['T'] = $this->border_details($v); + $this->spanborder = true; + break; + case 'BORDER-BOTTOM': + $this->spanborddet['B'] = $this->border_details($v); + $this->spanborder = true; + break; + case 'BORDER-LEFT': + $this->spanborddet['L'] = $this->border_details($v); + $this->spanborder = true; + break; + case 'BORDER-RIGHT': + $this->spanborddet['R'] = $this->border_details($v); + $this->spanborder = true; + break; + // mPDF 5.6.26 + case 'VISIBILITY': // block is set in OpenTag + $v = strtolower($v); + if ($v == 'visible' || $v == 'hidden' || $v == 'printonly' || $v == 'screenonly') { + $this->textparam['visibility'] = $v; + } + break; + }//end of switch($k) + } + + + // FOR INLINE and BLOCK + switch($k){ + case 'TEXT-ALIGN': //left right center justify + if (strtoupper($v) == 'NOJUSTIFY' && $this->blk[$this->blklvl]['align']=="J") { + $this->blk[$this->blklvl]['align']=""; + } + break; + // bgcolor only - to stay consistent with original html2fpdf + case 'BACKGROUND': + case 'BACKGROUND-COLOR': + $cor = $this->ConvertColor($v); + if ($cor) { + if ($tag == 'BODY') { + $this->bodyBackgroundColor = $cor; + } + else if ($type == 'INLINE' || $type == 'LIST') { + $this->spanbgcolorarray = $cor; + $this->spanbgcolor = true; + } + else { + $this->blk[$this->blklvl]['bgcolorarray'] = $cor; + $this->blk[$this->blklvl]['bgcolor'] = true; + } + } + else if ($type != 'INLINE' && $type != 'LIST') { + if ($this->ColActive || $this->keep_block_together) { + $this->blk[$this->blklvl]['bgcolorarray'] = $this->blk[$this->blklvl-1]['bgcolorarray'] ; + $this->blk[$this->blklvl]['bgcolor'] = $this->blk[$this->blklvl-1]['bgcolor'] ; + } + } + break; + + // auto | normal | none + case 'FONT-KERNING': + if ((strtoupper($v) == 'NORMAL' || strtoupper($v) == 'AUTO') && $this->useKerning) { $this->kerning = true; } + else if (strtoupper($v) == 'NONE') { $this->kerning = false; } + break; + + + // normal | <length> + case 'LETTER-SPACING': + $this->lSpacingCSS = $v; + if (($this->lSpacingCSS || $this->lSpacingCSS==='0') && strtoupper($this->lSpacingCSS) != 'NORMAL') { + $this->fixedlSpacing = $this->ConvertSize($this->lSpacingCSS,$this->FontSize); + } + break; + + // normal | <length> + case 'WORD-SPACING': + $this->wSpacingCSS = $v; + if ($this->wSpacingCSS && strtoupper($this->wSpacingCSS) != 'NORMAL') { + $this->minwSpacing = $this->ConvertSize($this->wSpacingCSS,$this->FontSize); + } + break; + + case 'FONT-STYLE': // italic normal oblique + switch (strtoupper($v)) { + case 'ITALIC': + case 'OBLIQUE': + $this->SetStyle('I',true); + break; + case 'NORMAL': + $this->SetStyle('I',false); + break; + } + break; + + case 'FONT-WEIGHT': // normal bold //Does not support: bolder, lighter, 100..900(step value=100) + switch (strtoupper($v)) { + case 'BOLD': + $this->SetStyle('B',true); + break; + case 'NORMAL': + $this->SetStyle('B',false); + break; + } + break; + + case 'VERTICAL-ALIGN': //super and sub only dealt with here e.g. <SUB> and <SUP> + switch (strtoupper($v)) { + case 'SUPER': + $this->SUP=true; + $this->SUB=false; // mPDF 5.6.07 + break; + case 'SUB': + $this->SUB=true; + $this->SUP=false; // mPDF 5.6.07 + break; + case 'BASELINE': // mPDF 5.6.07 + $this->SUB=false; + $this->SUP=false; + break; + } + break; + + case 'TEXT-DECORATION': // none underline line-through (strikeout) //Does not support: overline, blink + if (stristr($v,'LINE-THROUGH')) { + $this->strike = true; + } + else if (stristr($v,'UNDERLINE')) { + $this->SetStyle('U',true); + } + else if (stristr($v,'NONE')) { + $this->SetStyle('U',false); + $this->strike = false; // mPDF 5.6.07 + } + break; + + case 'FONT-VARIANT': + switch (strtoupper($v)) { + case 'SMALL-CAPS': + $this->SetStyle('S',true); + break; + case 'NORMAL': + $this->SetStyle('S',false); + break; + } + break; + + case 'TEXT-TRANSFORM': // none uppercase lowercase //Does support: capitalize + switch (strtoupper($v)) { //Not working 100% + case 'CAPITALIZE': + $this->capitalize=true; + break; + case 'UPPERCASE': + $this->toupper=true; + break; + case 'LOWERCASE': + $this->tolower=true; + break; + case 'NONE': break; + } + break; + + case 'TEXT-SHADOW': + $ts = $this->cssmgr->setCSStextshadow($v); + if ($ts) { $this->textshadow = $ts; } + break; + + case 'HYPHENS': // mPDF 5.6.08 + if (strtoupper($v)=='NONE') { + $this->textparam['hyphens'] = 2; + } + else if (strtoupper($v)=='AUTO') { + $this->textparam['hyphens'] = 1; + } + else if (strtoupper($v)=='MANUAL') { + $this->textparam['hyphens'] = 0; + } + break; + + case 'TEXT-OUTLINE': // mPDF 5.6.07 + if (strtoupper($v)=='NONE') { + $this->textparam['outline-s'] = false; + } + break; + + case 'TEXT-OUTLINE-WIDTH': // mPDF 5.6.07 + case 'OUTLINE-WIDTH': + switch(strtoupper($v)) { + case 'THIN': $v = '0.03em'; break; + case 'MEDIUM': $v = '0.05em'; break; + case 'THICK': $v = '0.07em'; break; + } + $w = $this->ConvertSize($v,$this->blk[$this->blklvl]['inner_width'],$this->FontSize); + if ($w) { + $this->textparam['outline-WIDTH'] = $w; + $this->textparam['outline-s'] = true; + } + else { $this->textparam['outline-s'] = false; } + break; + + case 'TEXT-OUTLINE-COLOR': // mPDF 5.6.07 + case 'OUTLINE-COLOR': + if (strtoupper($v) == 'INVERT') { + if ($this->colorarray) { + $cor = $this->colorarray; + $this->textparam['outline-COLOR'] = $this->_invertColor($cor); + } + else { + $this->textparam['outline-COLOR'] = $this->ConvertColor(255); + } + } + else { + $cor = $this->ConvertColor($v); + if ($cor) { $this->textparam['outline-COLOR'] = $cor ; } + } + break; + + case 'COLOR': // font color + $cor = $this->ConvertColor($v); + if ($cor) { + $this->colorarray = $cor; + $this->SetTColor($cor); + } + break; + + + }//end of switch($k) + + + }//end of foreach +} + +/*-- END HTML-CSS --*/ + + +function SetStyle($tag,$enable) { + $this->$tag=$enable; + $style=''; + foreach(array('B','I','U','S') as $s) { + if($this->$s) { + $style.=$s; + } + } + if ($this->S && empty($this->upperCase)) { @include(_MPDF_PATH.'includes/upperCase.php'); } + $this->currentfontstyle=$style; + $this->SetFont('',$style,0,false); +} + +// Set multiple styles at one $str e.g. "BIS" +function SetStylesArray($arr) { + $style=''; + foreach(array('B','I','U','S') as $s) { + if (isset($arr[$s])) { + if ($arr[$s]) { + $this->$s = true; + $style.=$s; + } + else { $this->$s = false; } + } + else if ($this->$s) { $style.=$s; } + } + $this->currentfontstyle=$style; + $this->SetFont('',$style,0,false); +} + +// Set multiple styles at one $str e.g. "BIS" +function SetStyles($str) { + $style=''; + foreach(array('B','I','U','S') as $s) { + if (strpos($str,$s) !== false) { + $this->$s = true; + $style.=$s; + } + else { $this->$s = false; } + } + $this->currentfontstyle=$style; + $this->SetFont('',$style,0,false); +} + +function ResetStyles() { + foreach(array('B','I','U','S') as $s) { + $this->$s = false; + } + $this->currentfontstyle=''; + $this->SetFont('','',0,false); +} + + +function DisableTags($str='') +{ + if ($str == '') //enable all tags + { + //Insert new supported tags in the long string below. + $this->enabledtags = "<span><s><strike><del><bdo><big><small><ins><cite><acronym><font><sup><sub><b><u><i><a><strong><em><code><samp><tt><kbd><var><q><table><thead><tfoot><tbody><tr><th><td><ol><ul><li><dl><dt><dd><form><input><select><textarea><option><div><p><h1><h2><h3><h4><h5><h6><pre><center><blockquote><address><hr><img><br><indexentry><indexinsert><bookmark><watermarktext><watermarkimage><tts><ttz><tta><column_break><columnbreak><newcolumn><newpage><page_break><pagebreak><formfeed><columns><toc><tocentry><tocpagebreak><pageheader><pagefooter><setpageheader><setpagefooter><sethtmlpageheader><sethtmlpagefooter><annotation><template><jpgraph><barcode><dottab><caption><textcircle><fieldset><legend><article><aside><figure><figcaption><footer><header><hgroup><nav><section><mark><details><summary><meter><progress><time>"; // mPDF 5.5.09 + } + else + { + $str = explode(",",$str); + foreach($str as $v) $this->enabledtags = str_replace(trim($v),'',$this->enabledtags); + } +} + + +/*-- TABLES --*/ + +function finaliseCellLineHeight($lhxt, $maxfontsize, $maxlineHeight, $lhfixed, $forceExactLineheight) { + $af = 0; // Above font + $bf = 0; // Below font + $mta = 0; // Maximum top-aligned + $mba = 0; // Maximum bottom-aligned + if ($lhxt['BS']) { + $af = max($af, ($lhxt['BS'] - ($maxfontsize * (0.5 + $this->baselineC)))); + } + if ($lhxt['M']) { + $af = max($af, ($lhxt['M'] - $maxfontsize)/2); + $bf = max($bf, ($lhxt['M'] - $maxfontsize)/2); + } + if ($lhxt['TT']) { + $bf = max($bf, ($lhxt['TT'] - $maxfontsize)); + } + if ($lhxt['TB']) { + $af = max($af, ($lhxt['TB'] - $maxfontsize)); + } + if ($lhxt['T']) { + $mta = max($mta, $lhxt['T']); + } + if ($lhxt['B']) { + $mba = max($mba, $lhxt['B']); + } + if ((!$lhfixed || !$forceExactLineheight) && ($af > (($maxlineHeight - $maxfontsize)/2) || $bf > (($maxlineHeight - $maxfontsize)/2))) { + $maxlineHeight = $maxfontsize + $af + $bf; + } + else if (!$lhfixed) { $af = $bf = ($maxlineHeight - $maxfontsize)/2; } + if ($mta > $maxlineHeight) { + $bf += ($mta - $maxlineHeight); + $maxlineHeight = $mta; + } + if ($mba > $maxlineHeight) { + $af += ($mba - $maxlineHeight); + $maxlineHeight = $mba; + } + return $maxlineHeight; +} + +function TableWordWrap($maxwidth, $forcewrap = 0, $textbuffer = '', $def_fontsize, $returnarray=false) { // NB ** returnarray used in flowchart + $biggestword=0; + $toonarrow=false; + + $textbuffer[0][0] = preg_replace('/^[ ]*/','',$textbuffer[0][0]); + if ((count($textbuffer) == 0) or ((count($textbuffer) == 1) && ($textbuffer[0][0] == ''))) { return 0; } + + $text = ''; + $lhfixed = false; + if (preg_match('/([0-9.,]+)mm/',$this->table_lineheight)) { $lhfixed = true; } + if ($lhfixed) { $def_lineheight = $this->_computeLineheight($this->table_lineheight, $def_fontsize);} + else { $def_lineheight = 0; } + // START OF NEW LINE + // Initialise lineheight variables + $maxfontsize = 0; + $forceExactLineheight = true; + $lhxt = array('BS'=>0, 'M'=>0, 'TT'=>0, 'TB'=>0, 'T'=>0, 'B'=>0); + $maxlineHeight = $def_lineheight ; + $ch = 0; + $width = 0; + $ln = 1; // Counts line number + $mxw = $this->GetCharWidth('W',false); + for($cctr=0;$cctr<count($textbuffer);$cctr++) { // mPDF 5.6.22 + $chunk = $textbuffer[$cctr]; // mPDF 5.6.22 + $line = $chunk[0]; + //IMAGE + if (substr($line,0,3) == "\xbb\xa4\xac") { //identifier has been identified! + $objattr = $this->_getObjAttr($line); + if ($objattr['type'] == 'nestedtable') { + // END OF LINE + // Finalise & add lineheight + $ch += $this->finaliseCellLineHeight($lhxt, $maxfontsize, $maxlineHeight, $lhfixed, $forceExactLineheight); + $level = $objattr['level']; + $ih = $this->table[($level+1)][$objattr['nestedcontent']]['h']; // nested table width + $ch += $ih; + // START OF NEW LINE + // Initialise lineheight variables + $ln++; + $maxfontsize = 0; + $forceExactLineheight = true; + $lhxt = array('BS'=>0, 'M'=>0, 'TT'=>0, 'TB'=>0, 'T'=>0, 'B'=>0); + $maxlineHeight = $def_lineheight ; + $width = 0; + $text = ""; + continue; + } + + list($skipln,$iw,$ih) = $this->inlineObject((isset($specialcontent['type']) ? $specialcontent['type'] : null),0,0, $objattr, $this->lMargin,$width,$maxwidth,$maxlineHeight,false,true); + if ($objattr['type'] == 'hr') { + // END OF LINE + // Finalise & add lineheight + $ch += $this->finaliseCellLineHeight($lhxt, $maxfontsize, $maxlineHeight, $lhfixed, $forceExactLineheight); + // Add HR height + $ch += $ih; + // START OF NEW LINE + // Initialise lineheight variables + $ln++; + $maxfontsize = 0; + $forceExactLineheight = true; + $lhxt = array('BS'=>0, 'M'=>0, 'TT'=>0, 'TB'=>0, 'T'=>0, 'B'=>0); + $maxlineHeight = $def_lineheight ; + $width = 0; + $text = ""; + continue; + } + + if ($skipln==1 || $skipln==-2) { + // Finish last line + // END OF LINE + // Finalise & add lineheight + $ch += $this->finaliseCellLineHeight($lhxt, $maxfontsize, $maxlineHeight, $lhfixed, $forceExactLineheight); + // START OF NEW LINE + // Initialise lineheight variables + $maxfontsize = 0; + $forceExactLineheight = true; + $lhxt = array('BS'=>0, 'M'=>0, 'TT'=>0, 'TB'=>0, 'T'=>0, 'B'=>0); + $maxlineHeight = $def_lineheight ; + $ln++; + $width = 0; + $text = ""; + } + $va = (isset($objattr['vertical-align']) ? $objattr['vertical-align'] : null); + if ($va) { + $lhxt[$va] = max($lhxt[$va], $ih); + } + if ($lhfixed && $ih > $def_fontsize) { $forceExactLineheight = false; } + $maxlineHeight = max($maxlineHeight ,$ih); + $width += $iw; + continue; + } + + // SET FONT SIZE/STYLE from $chunk[n] + // FONTSIZE + if(isset($chunk[11]) and $chunk[11] != '') { + if ($this->shrin_k) { + $this->SetFontSize($chunk[11]/$this->shrin_k,false); + } + else { + $this->SetFontSize($chunk[11],false); + } + } + if ($line == "\n") { + // END OF LINE + $maxfontsize = max($maxfontsize,$this->FontSize); + $fh = $this->_computeLineheight($this->table_lineheight); + if ($lhfixed && $this->FontSize > $def_fontsize) { + $fh = $this->FontSize; + $forceExactLineheight = false; + } + $maxlineHeight = max($maxlineHeight,$fh); + + // Finalise & add lineheight + $ch += $this->finaliseCellLineHeight($lhxt, $maxfontsize, $maxlineHeight, $lhfixed, $forceExactLineheight); + // START OF NEW LINE + // Initialise lineheight variables + $maxfontsize = 0; + $forceExactLineheight = true; + $lhxt = array('BS'=>0, 'M'=>0, 'TT'=>0, 'TB'=>0, 'T'=>0, 'B'=>0); + $maxlineHeight = $this->_computeLineheight($this->table_lineheight); + $ln++; + $text = ""; + $width = 0; + if(isset($chunk[11]) and $chunk[11] != '') { + $this->SetFontSize($this->default_font_size,false); + } + continue; + } + + $lbw = $rbw = 0; // Border widths + if(isset($chunk[16]) && !empty($chunk[16])) { //Border + $this->spanborddet = $chunk[16]; + if (isset($this->spanborddet['L'])) $lbw = $this->spanborddet['L']['w']; + if (isset($this->spanborddet['R'])) $rbw = $this->spanborddet['R']['w']; + } + if(isset($chunk[15])) { // Word spacing + $this->wSpacingCSS = $chunk[15]; + if ($this->wSpacingCSS && strtoupper($this->wSpacingCSS) != 'NORMAL') { + $this->minwSpacing = $this->ConvertSize($this->wSpacingCSS,$this->FontSize); + } + } + if(isset($chunk[14])) { // Letter spacing + $this->lSpacingCSS = $chunk[14]; + if (($this->lSpacingCSS || $this->lSpacingCSS==='0') && strtoupper($this->lSpacingCSS) != 'NORMAL') { + $this->fixedlSpacing = $this->ConvertSize($this->lSpacingCSS,$this->FontSize); + } + } + if(isset($chunk[13])) { // Font Kerning + $this->kerning = $chunk[13]; + } + if(isset($chunk[9])) { // Text params - Outline, hyphens // mPDF 5.6.08 + $this->textparam = $chunk[9]; + } + // FONTFAMILY + if(isset($chunk[4]) and $chunk[4] != '') { $font = $this->SetFont($chunk[4],$this->FontStyle,0,false); } + + // FONT STYLE B I U + if(isset($chunk[2]) and $chunk[2] != '') { + $this->SetStyles($chunk[2]); + } + + $space = $this->GetCharWidth(' ',false); + + if (mb_substr($line,0,1,$this->mb_enc ) == ' ') { // line (chunk) starts with a space + $width += $space; + $text .= ' '; + } + + if (mb_substr($line,(mb_strlen($line,$this->mb_enc )-1),1,$this->mb_enc ) == ' ') { $lsend = true; } // line (chunk) ends with a space + else { $lsend = false; } + $line= trim($line); + if ($line == '') { continue; } + + // mPDF ITERATION + if ($this->iterationCounter) $line = preg_replace('/{iteration ([a-zA-Z0-9_]+)}/','\\1', $line); + + $words = explode(' ', $line); + + foreach ($words as $k=>$word) { + $word = trim($word); + $wordwidth = $this->GetStringWidth($word); + if ($k==0) { $wordwidth += $lbw; } + if ($k==(count($words)-1)) { $wordwidth += $rbw; } + //maxwidth is insufficient for one word + if ($wordwidth > $maxwidth + 0.0001) { + $firstchunk=true; + while($wordwidth > $maxwidth + 0.0001) { + $chw = 0; // check width + $oneCJKorphan = false; + $mlen = mb_strlen($word, $this->mb_enc ); + for ( $i = 0; $i < $mlen; $i++ ) { + $chw = $this->GetStringWidth(mb_substr($word,0,$i+1,$this->mb_enc )); + if ($k==0) { $chw += $lbw; } + if ($k==(count($words)-1)) { $chw += $rbw; } + if ($chw > $maxwidth) { + if ($i==0 && $firstchunk) { + // If first letter of line does not fit + $wordwidth = $maxwidth - 0.0001; + if ($this->debug) { $this->Error("Table cell width calculated less than that needed for one character!"); } + break; + } +/*-- CJK-FONTS --*/ + // mPDF 5.6.40 mPDF 5.6.44 + if ($this->checkCJK && !$this->usingCoreFont && preg_match("/[".$this->pregCJKchars."]/u", $word)) { // mPDF 5.6.44 + if (!$oneCJKorphan && preg_match('/['.$this->CJKoverflow.']$/u',mb_substr($word,0,$i+1,$this->mb_enc )) && $this->allowCJKorphans) { + $wordwidth = $maxwidth - 0.0001; + $oneCJKorphan = true; + continue; + } + $cjkfix = 0; + // Last character that fits is not allowed to end a line - move lastchar(s) to start of next line + if ($i>0 && preg_match("/[".$this->CJKleading."$]/u", mb_substr($word,0,$i,$this->mb_enc ))) { + $cjkfix = 1; + } + // Next character is not allowed to start a new line + else if (preg_match("/[".$this->CJKfollowing."]/u", mb_substr($word,$i,1,$this->mb_enc ))) { + // try squeezing another character(s) onto this line = Oikomi + if ($this->allowCJKorphans && !$oneCJKorphan) { + //if lookahead is not another following char + if ($i==($mlen-1) || ($i<($mlen-1) && !preg_match("/[".$this->CJKfollowing."]/u", mb_substr($word,$i+1,1,$this->mb_enc )))) { + $wordwidth = $maxwidth - 0.0001; + $oneCJKorphan = true; + continue; + } + } + // or move lastchar(s) to next line + $cjkfix = 2; + } + // mPDF 5.6.42 + // CJK numerals kept together + else if (preg_match("/([".$this->pregCJKchars."]+[0-9\x{ff10}-\x{ff19}]+$)/u", mb_substr($word,0,$i,$this->mb_enc )) && preg_match("/^([0-9\x{ff10}-\x{ff19}]+[".$this->pregCJKchars."]+)/u", mb_substr($word,$i,16,$this->mb_enc ))) { + $cjkfix = 3; + } + if ($cjkfix) { + //move lastchar(s) to next line + $m0 = mb_substr($word,$i-1,1,$this->mb_enc ); // chars to move + $m1 = mb_substr($word,0,$i-1,$this->mb_enc ); // str after stripped chars to move + $mi = $i - 1; + if ($cjkfix == 3) { $match = "0-9\x{ff10}-\x{ff19}"; } + else { $match = $this->CJKleading; } + while(preg_match("/[".$match."$]/u", $m1) && mb_strlen($m1, $this->mb_enc)>2) { + $m0 = mb_substr($m1,$mi-1,1,$this->mb_enc ).$m0; // chars to move + $m1 = mb_substr($m1,0,$mi-1,$this->mb_enc ); // str after stripped chars to move + $mi--; + } + // Insert $m0 into $word at $i + $word = mb_substr($word,0,$i,$this->mb_enc ) . $m0 . mb_substr($word,$i,mb_strlen($word, $this->mb_enc )-$i,$this->mb_enc ); + $mlen = mb_strlen($word, $this->mb_enc ); // increment max for loop counter + } + + + + } +/*-- END CJK-FONTS --*/ + + if ($text && $firstchunk) { + // END OF LINE + // Finalise & add lineheight + $maxfontsize = max($maxfontsize,$this->FontSize); + $fh = $this->_computeLineheight($this->table_lineheight); + if ($lhfixed && $this->FontSize > $def_fontsize) { + $fh = $this->FontSize; + $forceExactLineheight = false; + } + $maxlineHeight = max($maxlineHeight,$fh); + $ch += $this->finaliseCellLineHeight($lhxt, $maxfontsize, $maxlineHeight, $lhfixed, $forceExactLineheight); + // START OF NEW LINE + // Initialise lineheight variables + $maxfontsize = $this->FontSize; + $forceExactLineheight = true; + $lhxt = array('BS'=>0, 'M'=>0, 'TT'=>0, 'TB'=>0, 'T'=>0, 'B'=>0); + $maxlineHeight = $this->_computeLineheight($this->table_lineheight); + $ln++; + } + // END OF LINE + // Finalise & add lineheight + $maxfontsize = max($maxfontsize,$this->FontSize); + $fh = $this->_computeLineheight($this->table_lineheight); + if ($lhfixed && $this->FontSize > $def_fontsize) { + $fh = $this->FontSize; + $forceExactLineheight = false; + } + $maxlineHeight = max($maxlineHeight,$fh); + $ch += $this->finaliseCellLineHeight($lhxt, $maxfontsize, $maxlineHeight, $lhfixed, $forceExactLineheight); + // START OF NEW LINE + // Initialise lineheight variables + $maxfontsize = $this->FontSize; + $forceExactLineheight = true; + $lhxt = array('BS'=>0, 'M'=>0, 'TT'=>0, 'TB'=>0, 'T'=>0, 'B'=>0); + $maxlineHeight = $this->_computeLineheight($this->table_lineheight); + $ln++; + $mxw = $maxwidth; + $text = mb_substr($word,0,$i,$this->mb_enc ); + $word = mb_substr($word,$i,mb_strlen($word, $this->mb_enc )-$i,$this->mb_enc ); + $wordwidth = $this->GetStringWidth($word); + $width = 0; + $firstchunk=false; + break; + } + } + if (mb_strlen($word, $this->mb_enc )<2 && $wordwidth > $maxwidth + 0.0001) { + $wordwidth = $maxwidth - 0.0001; + if ($this->debug) { $this->Error("Table cell width calculated less than that needed for single character!"); } + } + $firstchunk=false; + } + } + // Word fits on line... + if ($width + $wordwidth < $maxwidth + 0.0001) { + $mxw = max($mxw, ($width+$wordwidth)); + $width += $wordwidth + $space; + $text .= $word.' '; + } + // Word does not fit on line... + else { + // mPDF 5.6.21 hard hyphens + if ($this->textparam['hyphens'] != 2 && preg_match('/\-/',$word)) { + list($hardsuccess,$pre,$post,$prelength) = $this->hardHyphenate($word, ($maxwidth - $width)-$this->GetCharWidth("-", false)); + if ($hardsuccess) { + $text .= $pre.'-'; + $word = $post; + $wordwidth = $this->GetStringWidth($word); + if ($k==(count($words)-1)) { $wordwidth += $rbw; } + } + } +/*-- HYPHENATION --*/ + // Soft Hyphens chr(173) + else if ($this->textparam['hyphens'] != 2 && (!$this->usingCoreFont && preg_match("/\xc2\xad/",$word)) || ($this->usingCoreFont && preg_match("/".chr(173)."/",$word) && ($this->FontFamily!='csymbol' && $this->FontFamily!='czapfdingbats')) ) { // mPDF 5.6.06 5.6.08 + list($success,$pre,$post,$prelength) = $this->softHyphenate($word, ($maxwidth - $width)); + if ($success) { + $text .= $pre.'-'; + $word = $post; + $wordwidth = $this->GetStringWidth($word); + if ($k==(count($words)-1)) { $wordwidth += $rbw; } + } + } + else if ($this->textparam['hyphens'] == 1) { // mPDF 5.6.06 5.6.08 + list($success,$pre,$post,$prelength) = $this->hyphenateWord($word, ($maxwidth - $width)); + if ($success) { + $text .= $pre.'-'; + $word = $post; + $wordwidth = $this->GetStringWidth($word); + if ($k==(count($words)-1)) { $wordwidth += $rbw; } + } + } +/*-- END HYPHENATION --*/ + + + // mPDF 5.6.22 + if ( count($textbuffer)>1 && $cctr > 0 && $k==0 + && (substr($textbuffer[$cctr][0],0,3) != "\xbb\xa4\xac") + && (substr($textbuffer[$cctr-1][0],0,3) != "\xbb\xa4\xac") + && substr($textbuffer[$cctr-1][0],-1,1) != ' ' + && substr($textbuffer[$cctr][0],0,1) != ' ' + ) { + // Go back to find a space in a previous chunk of content + $found = false; + for ($ix=$cctr-1;$ix>=0;$ix--) { + if (preg_match('/[ ]/',$textbuffer[$ix][0])) { $found = $ix; break; } + } + if ($found !== false) { + $charpos = strrpos($textbuffer[$found][0],' '); + // mPDF 5.6.24 + $a1 = $a2 = $textbuffer[$found]; + $a1[0] = "\n"; + $a2[0] = substr($textbuffer[$found][0], $charpos+1, strlen($textbuffer[$found][0])-$charpos); + $textbuffer[$found][0] = substr($textbuffer[$found][0], 0, $charpos); + array_insert($textbuffer, $a1, $found+1); + array_insert($textbuffer, $a2, $found+2); + // Initialise all variables + $biggestword=0; + $toonarrow=false; + $lhfixed = false; + if (preg_match('/([0-9.,]+)mm/',$this->table_lineheight)) { $lhfixed = true; } + if ($lhfixed) { $def_lineheight = $this->_computeLineheight($this->table_lineheight, $def_fontsize);} + else { $def_lineheight = 0; } + $maxfontsize = 0; + $forceExactLineheight = true; + $lhxt = array('BS'=>0, 'M'=>0, 'TT'=>0, 'TB'=>0, 'T'=>0, 'B'=>0); + $maxlineHeight = $def_lineheight ; + $ch = 0; + $width = 0; + $ln = 1; // Counts line number + $mxw = $this->GetCharWidth('W',false); + $text = ''; + + $cctr = -1; + break; + } + } + + // END OF LINE + // Finalise & add lineheight + $maxfontsize = max($maxfontsize,$this->FontSize); + $fh = $this->_computeLineheight($this->table_lineheight); + if ($lhfixed && $this->FontSize > $def_fontsize) { + $fh = $this->FontSize; + $forceExactLineheight = false; + } + $maxlineHeight = max($maxlineHeight,$fh); + $ch += $this->finaliseCellLineHeight($lhxt, $maxfontsize, $maxlineHeight, $lhfixed, $forceExactLineheight); + $mxw = $maxwidth; + // START OF NEW LINE + // Initialise lineheight variables + $maxfontsize = $this->FontSize; + $forceExactLineheight = true; + $lhxt = array('BS'=>0, 'M'=>0, 'TT'=>0, 'TB'=>0, 'T'=>0, 'B'=>0); + $maxlineHeight = $this->_computeLineheight($this->table_lineheight); + $ln++; + $width = $wordwidth + $space; + $text = $word.' '; + } + $maxfontsize = max($maxfontsize,$this->FontSize); + $fh = $this->_computeLineheight($this->table_lineheight); + if ($lhfixed && $this->FontSize > $def_fontsize) { + $fh = $this->FontSize; + $forceExactLineheight = false; + } + $maxlineHeight = max($maxlineHeight,$fh); + } + + // End of textbuffer chunk + if (!$lsend) { + $width -= $space; + $text = rtrim($text); + } + + // RESET FONT SIZE/STYLE + // RESETTING VALUES + //Now we must deactivate what we have used + if(isset($chunk[2]) and $chunk[2] != '') { + $this->ResetStyles(); + } + if(isset($chunk[4]) and $chunk[4] != '') { + $this->SetFont($this->default_font,$this->FontStyle,0,false); + } + if(isset($chunk[11]) and $chunk[11] != '') { + $this->SetFontSize($this->default_font_size,false); + } + $this->spanborddet = array(); + $this->kerning = false; + $this->lSpacingCSS = ''; + $this->wSpacingCSS = ''; + $this->fixedlSpacing = false; + $this->minwSpacing = 0; + } + // Finalise lineheight if something output on line and add + if ($width) { + $ch += $this->finaliseCellLineHeight($lhxt, $maxfontsize, $maxlineHeight, $lhfixed, $forceExactLineheight); + } + if ($returnarray) { return array($ch,$ln,$mxw); } + else { return $ch; } + +} + + +function TableCheckMinWidth($maxwidth, $forcewrap = 0, $textbuffer) { + $biggestword=0; + $toonarrow=false; + if ((count($textbuffer) == 0) or ((count($textbuffer) == 1) && ($textbuffer[0][0] == ''))) { return 0; } + + foreach ($textbuffer as $chunk) { + + $line = $chunk[0]; + // mPDF ITERATION + if ($this->iterationCounter) $line = preg_replace('/{iteration ([a-zA-Z0-9_]+)}/','\\1', $line); + + // IMAGES & FORM ELEMENTS + if (substr($line,0,3) == "\xbb\xa4\xac") { //inline object - FORM element or IMAGE! + $objattr = $this->_getObjAttr($line); + if ($objattr['type']!='hr' && isset($objattr['width']) && ($objattr['width']/$this->shrin_k) > ($maxwidth + 0.0001) ) { + if (($objattr['width']/$this->shrin_k) > $biggestword) { $biggestword = ($objattr['width']/$this->shrin_k); } + $toonarrow=true; + } + continue; + } + + if ($line == "\n") { + continue; + } + $line = trim($line ); + // SET FONT SIZE/STYLE from $chunk[n] + + // FONTSIZE + if(isset($chunk[11]) and $chunk[11] != '') { + if ($this->shrin_k) { + $this->SetFontSize($chunk[11]/$this->shrin_k,false); + } + else { + $this->SetFontSize($chunk[11],false); + } + } + // FONTFAMILY + if(isset($chunk[4]) and $chunk[4] != '') { $font = $this->SetFont($chunk[4],$this->FontStyle,0,false); } + // B I U + if(isset($chunk[2]) and $chunk[2] != '') { + $this->SetStyles($chunk[2]); + } + + $lbw = $rbw = 0; // Border widths + if(isset($chunk[16]) && !empty($chunk[16])) { //Border + $this->spanborddet = $chunk[16]; + $lbw = $this->spanborddet['L']['w']; + $rbw = $this->spanborddet['R']['w']; + } + if(isset($chunk[15])) { // Word spacing + $this->wSpacingCSS = $chunk[15]; + if ($this->wSpacingCSS && strtoupper($this->wSpacingCSS) != 'NORMAL') { + $this->minwSpacing = $this->ConvertSize($this->wSpacingCSS,$this->FontSize); + } + } + if(isset($chunk[14])) { // Letter spacing + $this->lSpacingCSS = $chunk[14]; + if (($this->lSpacingCSS || $this->lSpacingCSS==='0') && strtoupper($this->lSpacingCSS) != 'NORMAL') { + $this->fixedlSpacing = $this->ConvertSize($this->lSpacingCSS,$this->FontSize); + } + } + if(isset($chunk[13])) { // Font Kerning + $this->kerning = $chunk[13]; + } + + $words = explode(' ', $line); + foreach ($words as $k=>$word) { + $word = trim($word); + $wordwidth = $this->GetStringWidth($word); + if ($k==0) { $wordwidth += $lbw; } + if ($k==(count($words)-1)) { $wordwidth += $rbw; } + + //Warn user that maxwidth is insufficient + if ($wordwidth > $maxwidth + 0.0001) { + if ($wordwidth > $biggestword) { $biggestword = $wordwidth; } + $toonarrow=true; + } + } + + // RESET FONT SIZE/STYLE + // RESETTING VALUES + //Now we must deactivate what we have used + if(isset($chunk[2]) and $chunk[2] != '') { + $this->ResetStyles(); + } + if(isset($chunk[4]) and $chunk[4] != '') { + $this->SetFont($this->default_font,$this->FontStyle,0,false); + } + if(isset($chunk[11]) and $chunk[11] != '') { + $this->SetFontSize($this->default_font_size,false); + } + $this->spanborddet = array(); + $this->kerning = false; + $this->lSpacingCSS = ''; + $this->wSpacingCSS = ''; + $this->fixedlSpacing = false; + $this->minwSpacing = 0; + } + + //Return -(wordsize) if word is bigger than maxwidth + // ADDED + if (($toonarrow) && ($this->table_error_report)) { + $this->Error("Word is too long to fit in table - ".$this->table_error_report_param); + } + if ($toonarrow) return -$biggestword; + else return 1; +} + +function shrinkTable(&$table,$k) { + $table['border_spacing_H'] /= $k; + $table['border_spacing_V'] /= $k; + + $table['padding']['T'] /= $k; + $table['padding']['R'] /= $k; + $table['padding']['B'] /= $k; + $table['padding']['L'] /= $k; + + $table['margin']['T'] /= $k; + $table['margin']['R'] /= $k; + $table['margin']['B'] /= $k; + $table['margin']['L'] /= $k; + + $table['border_details']['T']['w'] /= $k; + $table['border_details']['R']['w'] /= $k; + $table['border_details']['B']['w'] /= $k; + $table['border_details']['L']['w'] /= $k; + + if (isset($table['max_cell_border_width']['T'])) $table['max_cell_border_width']['T'] /= $k; + if (isset($table['max_cell_border_width']['R'])) $table['max_cell_border_width']['R'] /= $k; + if (isset($table['max_cell_border_width']['B'])) $table['max_cell_border_width']['B'] /= $k; + if (isset($table['max_cell_border_width']['L'])) $table['max_cell_border_width']['L'] /= $k; + + if ($this->simpleTables){ + $table['simple']['border_details']['T']['w'] /= $k; + $table['simple']['border_details']['R']['w'] /= $k; + $table['simple']['border_details']['B']['w'] /= $k; + $table['simple']['border_details']['L']['w'] /= $k; + } + + $table['miw'] /= $k; + $table['maw'] /= $k; + + if ($this->cacheTables) { $fh = fopen($table['cache'], "r+b"); } + + for($j = 0 ; $j < $table['nc'] ; $j++ ) { //columns + + $table['wc'][$j]['miw'] /= $k; + $table['wc'][$j]['maw'] /= $k; + + // mPDF 5.6.13 + if (isset($table['decimal_align'][$j]['maxs0']) && $table['decimal_align'][$j]['maxs0']) { $table['decimal_align'][$j]['maxs0'] /= $k; } + if (isset($table['decimal_align'][$j]['maxs1']) && $table['decimal_align'][$j]['maxs1']) { $table['decimal_align'][$j]['maxs1'] /= $k; } + + if (isset($table['wc'][$j]['absmiw']) && $table['wc'][$j]['absmiw'] ) $table['wc'][$j]['absmiw'] /= $k; + + for($i = 0 ; $i < $table['nr']; $i++ ) { //rows + if ($this->cacheTables) { + $c = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + } + else + $c = &$table['cells'][$i][$j]; + if (isset($c) && $c) { + if (!$this->simpleTables){ + if ($this->packTableData) { + $cell = $this->_unpackCellBorder($c['borderbin'] ); + $cell['border_details']['T']['w'] /= $k; + $cell['border_details']['R']['w'] /= $k; + $cell['border_details']['B']['w'] /= $k; + $cell['border_details']['L']['w'] /= $k; + $cell['border_details']['mbw']['TL'] /= $k; + $cell['border_details']['mbw']['TR'] /= $k; + $cell['border_details']['mbw']['BL'] /= $k; + $cell['border_details']['mbw']['BR'] /= $k; + $cell['border_details']['mbw']['LT'] /= $k; + $cell['border_details']['mbw']['LB'] /= $k; + $cell['border_details']['mbw']['RT'] /= $k; + $cell['border_details']['mbw']['RB'] /= $k; + $c['borderbin'] = $this->_packCellBorder($cell); + } + else { + $c['border_details']['T']['w'] /= $k; + $c['border_details']['R']['w'] /= $k; + $c['border_details']['B']['w'] /= $k; + $c['border_details']['L']['w'] /= $k; + $c['border_details']['mbw']['TL'] /= $k; + $c['border_details']['mbw']['TR'] /= $k; + $c['border_details']['mbw']['BL'] /= $k; + $c['border_details']['mbw']['BR'] /= $k; + $c['border_details']['mbw']['LT'] /= $k; + $c['border_details']['mbw']['LB'] /= $k; + $c['border_details']['mbw']['RT'] /= $k; + $c['border_details']['mbw']['RB'] /= $k; + } + } + $c['padding']['T'] /= $k; + $c['padding']['R'] /= $k; + $c['padding']['B'] /= $k; + $c['padding']['L'] /= $k; + $c['maxs'] /= $k; + if (isset($c['w'])) { $c['w'] /= $k; } + $c['s'] /= $k; + $c['maw'] /= $k; + $c['miw'] /= $k; + if (isset($c['absmiw'])) $c['absmiw'] /= $k; + if (isset($c['nestedmaw'])) $c['nestedmaw'] /= $k; + if (isset($c['nestedmiw'])) $c['nestedmiw'] /= $k; + if (isset($c['textbuffer'])) { + foreach($c['textbuffer'] AS $n=>$tb) { + if (!empty($tb[16])) { + $c['textbuffer'][$n][16]['T']['w'] /= $k; + $c['textbuffer'][$n][16]['B']['w'] /= $k; + $c['textbuffer'][$n][16]['L']['w'] /= $k; + $c['textbuffer'][$n][16]['R']['w'] /= $k; + } + } + } + if ($this->cacheTables) { + $this->_cacheCell($c, '', "W", $fh, $table['cells'][$i][$j]); + } + unset($c); + } + }//rows + }//columns + if ($this->cacheTables) { fclose($fh); } +} + +function _cacheCell($c, $file, $mode="A", $fh=null, $offset=0) { // mode = Append or (over)Write (needs offset and fh) + // Requires either $file OR $fh (file_handle) + if (!is_array($c) || !isset($c)) { return ''; } + + if(isset($c['w'])) { $cw = $c['w']; } else { $cw = -1; } + if(isset($c['w0'])) { $cw0 = $c['w0']; } else { $cw0 = -1; } + if(isset($c['h0'])) { $ch0 = $c['h0']; } else { $ch0 = -1; } + + $data = pack("n2d19A1A1n2sA32A128", + $c['colspan'], /* n (16 bit; 2 bytes) [pos 0] */ + $c['rowspan'], /* n (16 bit; 2 bytes) [pos 2] */ + $c['s'], /* d NB machine-dependent size (64 bit; 8 bytes on test winOS) [pos 4] */ + $c['maxs'], /* d NB machine-dependent size [pos 4 + 1*D] */ + $c['nestedmaw'], /* d NB machine-dependent size [pos 4 + 2*D] */ + $c['nestedmiw'], /* d NB machine-dependent size [pos 4 + 3*D] */ + $c['padding']['L'], /* d NB machine-dependent size [pos 4 + 4*D] */ + $c['padding']['R'], /* d NB machine-dependent size [pos 4 + 5*D] */ + $c['padding']['T'], /* d NB machine-dependent size [pos 4 + 6*D] */ + $c['padding']['B'], /* d NB machine-dependent size [pos 4 + 7*D] */ + $c['dfs'], /* d NB machine-dependent size [pos 4 + 8*D] */ + $cw, /* d NB machine-dependent size [pos 4 + 9*D] */ + $c['h'], /* d NB machine-dependent size [pos 4 + 10*D] */ + $c['absmiw'], /* d NB machine-dependent size [pos 4 + 11*D] */ + $c['maw'], /* d NB machine-dependent size [pos 4 + 12*D] */ + $c['miw'], /* d NB machine-dependent size [pos 4 + 13*D] */ + $c['mih'], /* d NB machine-dependent size [pos 4 + 14*D] */ + $c['x0'], /* d NB machine-dependent size [pos 4 + 15*D] */ + $cw0, /* d NB machine-dependent size [pos 4 + 16*D] */ + $c['y0'], /* d NB machine-dependent size [pos 4 + 17*D] */ + $ch0, /* d NB machine-dependent size [pos 4 + 18*D] */ + $c['a'], /* A1 (1 byte) [pos 4 + 19*D] */ + $c['va'], /* A1 (1 byte) [pos 5 + 19*D] */ + $c['nowrap'], /* 1 or blank n (16 bit; 2 bytes) [pos 6 + 19*D] */ + $c['wpercent'], /* 0 - 100 n (16 bit; 2 bytes) [pos 8 + 19*D] */ + $c['R'], /* 90 or -90 s (16 bit; 2 bytes) [pos 10 + 19*D] */ + $c['bgcolor'], /* A32 (32 bytes) [pos 12 + 19*D] */ + $c['gradient'] /* A128 (128 bytes) [pos 44 + 19*D] */ + ); + + if ($c['background-image']) { + $data .= pack("n2d2A6A6n3dA4A128", + strlen($data), /* offset in main data to start of bgimage data */ + $c['background-image']['image_id'], /* n */ + $c['background-image']['orig_w'], /* d NB machine-dependent size */ + $c['background-image']['orig_h'], /* d NB machine-dependent size */ + $c['background-image']['x_pos'], /* A6 calc size or "50%" */ + $c['background-image']['y_pos'], /* A6 calc size or "50%" */ + $c['background-image']['x_repeat'], /* n true or false*/ + $c['background-image']['y_repeat'], /* n true or false */ + $c['background-image']['resize'], /* n 0 - 6 */ + $c['background-image']['opacity'], /* d 0-1 */ + $c['background-image']['itype'], /* A4 jpg etc */ + $c['background-image']['gradient'] /* A128 CSS string */ + ); + } + else $data .= pack("n",0); + $tb_offset = 2 + 186 + 2 + strlen($data); + $stb = serialize($c['textbuffer']).' '; // buffer to allow updating in reverseTableDir + $lentb = strlen($stb); + $data2 = pack("nA".$lentb, $lentb, $stb); + + $tempfh = true; + if ($mode=="W" && $offset) { + if (!$fh) { $fh = fopen($file, "r+b"); } // Overwrite (but not truncate) + else $tempfh = false; + fseek($fh, $offset); + } + else { + $fh = fopen($file, "ab"); // APPEND + } + fwrite($fh, pack("n",$tb_offset)); // Offset to Text buffer 2 bytes + fwrite($fh, $c['borderbin']); // border details 186 bytes + fwrite($fh, pack("n",strlen($data))); // Length of Main data + fwrite($fh, $data); // Main data + fwrite($fh, $data2); // Text buffer (starts with "n" length of text buffer) + if ($tempfh) fclose($fh); + return ($tb_offset + 2 + $lentb); +} + +function _cacheUpdateTxB($c, $fh, $offset) { + fseek($fh, $offset); + $tb_offset = $this->read_short($fh); // First entry = Offset to Text buffer 2 bytes + fseek($fh, ($tb_offset-2), SEEK_CUR); + $lentb = $this->read_short($fh); // First entry in textbuffer = Length of serialized textbuffer - do not update + $stb = serialize($c['textbuffer']); + fwrite($fh, pack("A".$lentb, $stb)); +} + +function _cacheUpdateBorder($c, $fh, $offset) { + $offset += 2; + fseek($fh, $offset); + fwrite($fh, $c['borderbin']); +} + +function _cacheUpdateMtx($c, $fh, $offset, $var) { + if ($var=='mih') { $offset += (2 + 186 + 2 + 4 + 14*_DSIZE); } + else if ($var=='x0') { $offset += (2 + 186 + 2 + 4 + 15*_DSIZE); } // x0 and w0 + else if ($var=='y0') { $offset += (2 + 186 + 2 + 4 + 17*_DSIZE); } // y0 and h0 + fseek($fh, $offset); + if ($var=='mih') { fwrite($fh, pack("d",$c['mih'])); } + else if ($var=='x0') { fwrite($fh, pack("d2",$c['x0'],$c['w0'])); } + else if ($var=='y0') { fwrite($fh, pack("d2",$c['y0'],$c['h0'])); } +} + +function _uncacheCell($ptr, $file, $fh) { + // Requires either $file or $fh (file_handle) + if ($ptr==0) { return null; } + if (is_array($ptr)) { $this->Error("Probable cause - missing end tag &lt;/td&gt;. You may be able to change the configurable variable: allow_html_optional_endtags "); } + $tempfh = true; + if (!$fh) { $fh = fopen($file, "rb"); } + else $tempfh = false; + fseek($fh, $ptr); + $c = array(); + $tb_offset = $this->read_short($fh); // First entry = Offset to Text buffer 2 bytes + $c['borderbin'] = fread($fh,186); // border details 186 bytes + $maindatalen = $this->read_short($fh); // Length of Main data (2 bytes) + $str = fread($fh,$maindatalen ); // Main data + $data = unpack("ncolspan/nrowspan/ds/dmaxs/dnmaw/dnmiw/dpl/dpr/dpt/dpb/ddfs/dw/dh/dabsmiw/dmaw/dmiw/dmih/dx0/dw0/dy0/dh0/A1a/A1va/nnowrap/nwpercent/sR/A32bgcol/A128grad/nbgimage", $str); + + if ($data['colspan']>0) $c['colspan'] = $data['colspan']; /* n */ + if ($data['rowspan']>0) $c['rowspan'] = $data['rowspan']; /* n */ + $c['s'] = $data['s']; /* d NB machine-dependent size */ + $c['maxs'] = $data['maxs']; /* d NB machine-dependent size */ + if ($data['nmaw']>0) $c['nestedmaw'] = $data['nmaw']; /* d NB machine-dependent size */ + if ($data['nmiw']>0) $c['nestedmiw'] = $data['nmiw']; /* d NB machine-dependent size */ + $c['padding']['L'] = $data['pl']; /* d NB machine-dependent size */ + $c['padding']['R'] = $data['pr']; /* d NB machine-dependent size */ + $c['padding']['T'] = $data['pt']; /* d NB machine-dependent size */ + $c['padding']['B'] = $data['pb']; /* d NB machine-dependent size */ + $c['dfs'] = $data['dfs']; /* d NB machine-dependent size */ + if ($data['w']>=0) $c['w'] = $data['w']; /* d NB machine-dependent size */ + if ($data['h']>0) $c['h'] = $data['h']; /* d NB machine-dependent size */ + if ($data['absmiw']>0) $c['absmiw'] = $data['absmiw']; /* d NB machine-dependent size */ + if ($data['maw']>0) $c['maw'] = $data['maw']; /* d NB machine-dependent size */ + if ($data['miw']>0) $c['miw'] = $data['miw']; /* d NB machine-dependent size */ + if ($data['mih']>0) $c['mih'] = $data['mih']; /* d NB machine-dependent size */ + if ($data['w0']>=0) { $c['w0'] = $data['w0']; /* d NB machine-dependent size */ + $c['x0'] = $data['x0']; } /* d NB machine-dependent size */ + if ($data['h0']>=0) { $c['h0'] = $data['h0']; /* d NB machine-dependent size */ + $c['y0'] = $data['y0']; } /* d NB machine-dependent size */ + $c['a'] = trim($data['a']); /* A1 */ + $c['va'] = trim($data['va']); /* A1 */ + if ($data['nowrap']) $c['nowrap'] = $data['nowrap']; /* 1 or blank n */ + else $c['nowrap'] = false; + if ($data['wpercent']>0) $c['wpercent'] = $data['wpercent']; /* 0 - 100 n */ + if ($data['R']<>0) $c['R'] = $data['R']; /* 90 or -90 s */ + else $c['R'] = false; + $c['bgcolor'] = trim($data['bgcol']); /* A32 */ + if (trim($data['grad'])) + $c['gradient'] = trim($data['grad']); /* A128 */ + else $c['gradient'] = false; + if ($data['bgimage']>0) { + $bgidata = substr($str, ($data['bgimage']+2)); + $c['background-image'] = unpack("nimage_id/dorig_w/dorig_h/A6x_pos/A6y_pos/nx_repeat/ny_repeat/nresize/dopacity/A4itype/A128gradient", $bgidata); + } + + $tblen = $this->read_short($fh); // Length of Textbuffer + $tbsp = fread($fh,$tblen); // Textbuffer (serialised and packed) + $tbs = unpack("A".$tblen."textbuffer",$tbsp); // Textbuffer unpacked + $c['textbuffer'] = unserialize(trim($tbs['textbuffer'])); // Textbuffer unserialized + + if ($tempfh) { fclose($fh); } + return ($c); +} +function read_short(&$fh) { + $s = fread($fh,2); + $a = (ord($s[0])<<8) + ord($s[1]); + if ($a & (1 << 15) ) { + $a = ($a - (1 << 16)); + } + return $a; +} +function _backupCacheFiles() { + foreach($this->table AS $lvl=>$t) { + foreach($this->table[$lvl] AS $c=>$t2) { +///////////////////////////if (!file_exists($t2['cache'])) { echo $lvl; echo $c; print_r($this->table); exit; } + copy( $t2['cache'], $t2['cache'].'.bak'); + } + } +} +function _restoreCacheFiles() { + foreach($this->table AS $lvl=>$t) { + foreach($this->table[$lvl] AS $c=>$t2) { + copy( $t2['cache'].'.bak', $t2['cache']); + } + } +} + + +function _packCellBorder($cell) { + if (!is_array($cell) || !isset($cell)) { return ''; } + + if (!$this->packTableData) { return $cell; } + // = 186 bytes + $bindata = pack("nnda6A10nnda6A10nnda6A10nnda6A10nd9", + $cell['border'], + $cell['border_details']['R']['s'], + $cell['border_details']['R']['w'], + $cell['border_details']['R']['c'], + $cell['border_details']['R']['style'], + $cell['border_details']['R']['dom'], + + $cell['border_details']['L']['s'], + $cell['border_details']['L']['w'], + $cell['border_details']['L']['c'], + $cell['border_details']['L']['style'], + $cell['border_details']['L']['dom'], + + $cell['border_details']['T']['s'], + $cell['border_details']['T']['w'], + $cell['border_details']['T']['c'], + $cell['border_details']['T']['style'], + $cell['border_details']['T']['dom'], + + $cell['border_details']['B']['s'], + $cell['border_details']['B']['w'], + $cell['border_details']['B']['c'], + $cell['border_details']['B']['style'], + $cell['border_details']['B']['dom'], + + $cell['border_details']['mbw']['BL'], + $cell['border_details']['mbw']['BR'], + $cell['border_details']['mbw']['RT'], + $cell['border_details']['mbw']['RB'], + $cell['border_details']['mbw']['TL'], + $cell['border_details']['mbw']['TR'], + $cell['border_details']['mbw']['LT'], + $cell['border_details']['mbw']['LB'], + + $cell['border_details']['cellposdom'] + ); + return $bindata; +} + + + +function _getBorderWidths($bindata) { + if (!$bindata) { return array(0,0,0,0); } + if (!$this->packTableData) { return array($bindata['border_details']['T']['w'], $bindata['border_details']['R']['w'], $bindata['border_details']['B']['w'], $bindata['border_details']['L']['w']); } + + $bd = unpack("nbord/nrs/drw/a6rca/A10rst/nrd/nls/dlw/a6lca/A10lst/nld/nts/dtw/a6tca/A10tst/ntd/nbs/dbw/a6bca/A10bst/nbd/dmbl/dmbr/dmrt/dmrb/dmtl/dmtr/dmlt/dmlb/dcpd", $bindata); + $cell['border_details']['R']['w'] = $bd['rw']; + $cell['border_details']['L']['w'] = $bd['lw']; + $cell['border_details']['T']['w'] = $bd['tw']; + $cell['border_details']['B']['w'] = $bd['bw']; + return array($bd['tw'], $bd['rw'], $bd['bw'], $bd['lw']); +} + + +function _unpackCellBorder($bindata) { + if (!$bindata) { return array(); } + if (!$this->packTableData) { return $bindata; } + + $bd = unpack("nbord/nrs/drw/a6rca/A10rst/nrd/nls/dlw/a6lca/A10lst/nld/nts/dtw/a6tca/A10tst/ntd/nbs/dbw/a6bca/A10bst/nbd/dmbl/dmbr/dmrt/dmrb/dmtl/dmtr/dmlt/dmlb/dcpd", $bindata); + + $cell['border'] = $bd['bord']; + $cell['border_details']['R']['s'] = $bd['rs']; + $cell['border_details']['R']['w'] = $bd['rw']; + $cell['border_details']['R']['c'] = $bd['rca']; + $cell['border_details']['R']['style'] = trim($bd['rst']); + $cell['border_details']['R']['dom'] = $bd['rd']; + + $cell['border_details']['L']['s'] = $bd['ls']; + $cell['border_details']['L']['w'] = $bd['lw']; + $cell['border_details']['L']['c'] = $bd['lca']; + $cell['border_details']['L']['style'] = trim($bd['lst']); + $cell['border_details']['L']['dom'] = $bd['ld']; + + $cell['border_details']['T']['s'] = $bd['ts']; + $cell['border_details']['T']['w'] = $bd['tw']; + $cell['border_details']['T']['c'] = $bd['tca']; + $cell['border_details']['T']['style'] = trim($bd['tst']); + $cell['border_details']['T']['dom'] = $bd['td']; + + $cell['border_details']['B']['s'] = $bd['bs']; + $cell['border_details']['B']['w'] = $bd['bw']; + $cell['border_details']['B']['c'] = $bd['bca']; + $cell['border_details']['B']['style'] = trim($bd['bst']); + $cell['border_details']['B']['dom'] = $bd['bd']; + + $cell['border_details']['mbw']['BL'] = $bd['mbl']; + $cell['border_details']['mbw']['BR'] = $bd['mbr']; + $cell['border_details']['mbw']['RT'] = $bd['mrt']; + $cell['border_details']['mbw']['RB'] = $bd['mrb']; + $cell['border_details']['mbw']['TL'] = $bd['mtl']; + $cell['border_details']['mbw']['TR'] = $bd['mtr']; + $cell['border_details']['mbw']['LT'] = $bd['mlt']; + $cell['border_details']['mbw']['LB'] = $bd['mlb']; + $cell['border_details']['cellposdom'] = $bd['cpd']; + + return($cell); +} + + +////////////////////////TABLE CODE (from PDFTable)///////////////////////////////////// +////////////////////////TABLE CODE (from PDFTable)///////////////////////////////////// +////////////////////////TABLE CODE (from PDFTable)///////////////////////////////////// +//table Array of (w, h, bc, nr, wc, hr, cells) +//w Width of table +//h Height of table +//nc Number column +//nr Number row +//hr List of height of each row +//wc List of width of each column +//cells List of cells of each rows, cells[i][j] is a cell in the table +function _tableColumnWidth(&$table,$firstpass=false){ + $cs = &$table['cells']; + + $nc = $table['nc']; + $nr = $table['nr']; + $listspan = array(); + + if ($table['borders_separate']) { + $tblbw = $table['border_details']['L']['w'] + $table['border_details']['R']['w'] + $table['margin']['L'] + $table['margin']['R'] + $table['padding']['L'] + $table['padding']['R'] + $table['border_spacing_H']; + } + else { $tblbw = $table['max_cell_border_width']['L']/2 + $table['max_cell_border_width']['R']/2 + $table['margin']['L'] + $table['margin']['R']; } + + if ($this->cacheTables) { $fh = fopen($table['cache'], "r+b"); } + else { $fh = null; } + + // ADDED table['l'][colno] + // = total length of text approx (using $c['s']) in that column - used to approximately distribute col widths in _tableWidth + // + for($j = 0 ; $j < $nc ; $j++ ) { //columns + $wc = &$table['wc'][$j]; + for($i = 0 ; $i < $nr ; $i++ ) { //rows + if (isset($cs[$i][$j]) && $cs[$i][$j]) { + if ($this->cacheTables) { + $c = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + } + else + $c = &$cs[$i][$j]; + + if ($this->simpleTables){ + if ($table['borders_separate']) { // NB twice border width + $extrcw = $table['simple']['border_details']['L']['w'] + $table['simple']['border_details']['R']['w'] + $c['padding']['L'] + $c['padding']['R'] + $table['border_spacing_H']; + } + else { + $extrcw = $table['simple']['border_details']['L']['w']/2 + $table['simple']['border_details']['R']['w']/2 + $c['padding']['L'] + $c['padding']['R']; + } + } + else { + if ($this->packTableData) { + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($c['borderbin']); + } + else { + $br = $c['border_details']['R']['w']; + $bl = $c['border_details']['L']['w']; + } + if ($table['borders_separate']) { // NB twice border width + $extrcw = $bl + $br + $c['padding']['L'] + $c['padding']['R'] + $table['border_spacing_H']; + } + else { + $extrcw = $bl/2 + $br/2 + $c['padding']['L'] + $c['padding']['R']; + } + } + + //$mw = $this->GetStringWidth('W') + $extrcw ; + $mw = 0; + // mPDF 5.6.13 Decimal point alignment + if(substr($c['a'],0,1) == 'D') { + $mw = $table['decimal_align'][$j]['maxs0'] + $table['decimal_align'][$j]['maxs1'] + $extrcw ; + } + + $c['absmiw'] = $mw; + + if (isset($c['R']) && $c['R']) { + $c['maw'] = $c['miw'] = $this->FontSize + $extrcw ; + if (isset($c['w'])) { // If cell width is specified + if ($c['miw'] <$c['w']) { $c['miw'] = $c['w']; } + } + if (!isset($c['colspan'])) { + if ($wc['miw'] < $c['miw']) { $wc['miw'] = $c['miw']; } + if ($wc['maw'] < $c['maw']) { $wc['maw'] = $c['maw']; } + + if ($firstpass) { + if (isset($table['l'][$j]) ) { + $table['l'][$j] += $c['miw'] ; + } + else { + $table['l'][$j] = $c['miw'] ; + } + } + } + if ($c['miw'] > $wc['miw']) { $wc['miw'] = $c['miw']; } + if ($wc['miw'] > $wc['maw']) { $wc['maw'] = $wc['miw']; } + continue; + } + + if ($firstpass) { + if (isset($c['s'])) { $c['s'] += $extrcw; } + if (isset($c['maxs'])) { $c['maxs'] += $extrcw; } + if (isset($c['nestedmiw'])) { $c['nestedmiw'] += $extrcw; } + if (isset($c['nestedmaw'])) { $c['nestedmaw'] += $extrcw; } + } + + + // If minimum width has already been set by a nested table or inline object (image/form), use it + if (isset($c['nestedmiw']) && $this->table[1][1]['overflow']!='visible') { $miw = $c['nestedmiw']; } + else { $miw = $mw; } + + if (isset($c['maxs']) && $c['maxs'] != '') { $c['s'] = $c['maxs']; } + + // If maximum width has already been set by a nested table, use it + if (isset($c['nestedmaw'])) { $c['maw'] = $c['nestedmaw']; } + else $c['maw'] = $c['s']; + + if (isset($table['overflow']) && $table['overflow']=='visible' && $table['level']==1) { + if (($c['maw'] + $tblbw) > $this->blk[$this->blklvl]['inner_width']) { + $c['maw'] = $this->blk[$this->blklvl]['inner_width'] - $tblbw; + } + } + + if (isset($c['nowrap']) && $c['nowrap']) { $miw = $c['maw']; } + + if (isset($c['wpercent']) && $firstpass) { + if (isset($c['colspan'])) { // Not perfect - but % set on colspan is shared equally on cols. + for($k=0;$k<$c['colspan'];$k++) { + $table['wc'][($j+$k)]['wpercent'] = $c['wpercent'] / $c['colspan']; + } + } + else { + if (isset($table['w']) && $table['w']) { $c['w'] = $c['wpercent']/100 * ($table['w'] - $tblbw ); } + $wc['wpercent'] = $c['wpercent']; + } + } + + if (isset($table['overflow']) && $table['overflow']=='visible' && $table['level']==1) { + if (($c['w'] + $tblbw) > $this->blk[$this->blklvl]['inner_width']) { + $c['w'] = $this->blk[$this->blklvl]['inner_width'] - $tblbw; + } + } + + + if (isset($c['w'])) { // If cell width is specified + if ($miw<$c['w']) { $c['miw'] = $c['w']; } // Cell min width = that specified + if ($miw>$c['w']) { $c['miw'] = $c['w'] = $miw; } // If width specified is less than minimum allowed (W) increase it + if (!isset($wc['w'])) { $wc['w'] = 1; } // If the Col width is not specified = set it to 1 + + } + else { $c['miw'] = $miw; } // If cell width not specified -> set Cell min width it to minimum allowed (W) + + if ($c['maw'] < $c['miw']) { $c['maw'] = $c['miw']; } // If Cell max width < Minwidth - increase it to = + if (!isset($c['colspan'])) { + if ($wc['miw'] < $c['miw']) { $wc['miw'] = $c['miw']; } // Update Col Minimum and maximum widths + if ($wc['maw'] < $c['maw']) { $wc['maw'] = $c['maw']; } + if ((isset($wc['absmiw']) && $wc['absmiw'] < $c['absmiw']) || !isset($wc['absmiw'])) { $wc['absmiw'] = $c['absmiw']; } // Update Col Minimum and maximum widths + + if (isset($table['l'][$j]) ) { + $table['l'][$j] += $c['s']; + } + else { + $table['l'][$j] = $c['s']; + } + + } + else { + $listspan[] = array($i,$j); + } + + //Check if minimum width of the whole column is big enough for largest word to fit + if (isset($c['textbuffer']) && (!isset($table['overflow']) || $table['overflow']!='wrap')) { // mPDF 5.5.11 + $minwidth = $this->TableCheckMinWidth($wc['miw']- $extrcw ,0,$c['textbuffer']); + } + else { $minwidth = 0; } + if ($minwidth < 0) { + //increase minimum width + if (!isset($c['colspan'])) { + $wc['miw'] = max($wc['miw'],((-$minwidth) + $extrcw) ); + } + else { + $c['miw'] = max($c['miw'],((-$minwidth) + $extrcw) ); + } + } + if (!isset($c['colspan'])) { + if ($wc['miw'] > $wc['maw']) { $wc['maw'] = $wc['miw']; } //update maximum width, if needed + } + if ($this->cacheTables) { + $this->_cacheCell($c, '', "W", $fh, $table['cells'][$i][$j]); + } + } + unset($c); + }//rows + }//columns + + + // COLUMN SPANS + $wc = &$table['wc']; + foreach ($listspan as $span) { + list($i,$j) = $span; + if ($this->cacheTables) { + $c = $this->_uncacheCell($cs[$i][$j], '', $fh); + } + else + $c = &$cs[$i][$j]; + $lc = $j + $c['colspan']; + if ($lc > $nc) { $lc = $nc; } + $wis = $wisa = 0; + $was = $wasa = 0; + $list = array(); + for($k=$j;$k<$lc;$k++) { + if (isset($table['l'][$k]) ) { + if ($c['R']) { $table['l'][$k] += $c['miw']/$c['colspan'] ; } + else { $table['l'][$k] += $c['s']/$c['colspan']; } + } + else { + if ($c['R']) { $table['l'][$k] = $c['miw']/$c['colspan'] ; } + else { $table['l'][$k] = $c['s']/$c['colspan']; } + } + $wis += $wc[$k]['miw']; + $was += $wc[$k]['maw']; + if (!isset($c['w'])) { + $list[] = $k; + $wisa += $wc[$k]['miw']; + $wasa += $wc[$k]['maw']; + } + } + if ($c['miw'] > $wis) { + if (!$wis) { + for($k=$j;$k<$lc;$k++) { $wc[$k]['miw'] = $c['miw']/$c['colspan']; } + } + else if (!count($list)) { + $wi = $c['miw'] - $wis; + for($k=$j;$k<$lc;$k++) { $wc[$k]['miw'] += ($wc[$k]['miw']/$wis)*$wi; } + } + else { + $wi = $c['miw'] - $wis; + foreach ($list as $k) { $wc[$k]['miw'] += ($wc[$k]['miw']/$wisa)*$wi; } + } + } + if ($c['maw'] > $was) { + if (!$wis) { + for($k=$j;$k<$lc;$k++) { $wc[$k]['maw'] = $c['maw']/$c['colspan']; } + } + else if (!count($list)) { + $wi = $c['maw'] - $was; + for($k=$j;$k<$lc;$k++) { $wc[$k]['maw'] += ($wc[$k]['maw']/$was)*$wi; } + } + else { + $wi = $c['maw'] - $was; + foreach ($list as $k) { $wc[$k]['maw'] += ($wc[$k]['maw']/$wasa)*$wi; } + } + } + unset($c); + } + + if ($this->cacheTables) { fclose($fh); } + + $checkminwidth = 0; + $checkmaxwidth = 0; + $totallength = 0; + + for( $i = 0 ; $i < $nc ; $i++ ) { + $checkminwidth += $table['wc'][$i]['miw']; + $checkmaxwidth += $table['wc'][$i]['maw']; + $totallength += $table['l'][$i]; + } + + if (!isset($table['w']) && $firstpass) { + $sumpc = 0; + $notset = 0; + for( $i = 0 ; $i < $nc ; $i++ ) { + if (isset($table['wc'][$i]['wpercent']) && $table['wc'][$i]['wpercent']) { + $sumpc += $table['wc'][$i]['wpercent']; + } + else { $notset++; } + } + + // If sum of widths as % >= 100% and not all columns are set + // Set a nominal width of 1% for unset columns + if ($sumpc >= 100 && $notset) { + for( $i = 0 ; $i < $nc ; $i++ ) { + if ((!isset($table['wc'][$i]['wpercent']) || !$table['wc'][$i]['wpercent']) && + (!isset($table['wc'][$i]['w']) || !$table['wc'][$i]['w'])) { + $table['wc'][$i]['wpercent'] = 1; + } + } + } + + + if ($sumpc) { // if any percents are set + $sumnonpc = (100 - $sumpc); + $sumpc = max($sumpc,100); + $miwleft = 0; + $miwleftcount = 0; + $miwsurplusnonpc = 0; + $maxcalcmiw = 0; + $mawleft = 0; + $mawleftcount = 0; + $mawsurplusnonpc = 0; + $maxcalcmaw = 0; + for( $i = 0 ; $i < $nc ; $i++ ) { + if (isset($table['wc'][$i]['wpercent'])) { + $maxcalcmiw = max($maxcalcmiw, ($table['wc'][$i]['miw'] * $sumpc /$table['wc'][$i]['wpercent']) ); + $maxcalcmaw = max($maxcalcmaw, ($table['wc'][$i]['maw'] * $sumpc /$table['wc'][$i]['wpercent']) ); + } + else { + $miwleft += $table['wc'][$i]['miw']; + $mawleft += $table['wc'][$i]['maw']; + if (!isset($table['wc'][$i]['w'])) { $miwleftcount++; $mawleftcount++; } + } + } + if ($miwleft && $sumnonpc > 0) { $miwnon = $miwleft * 100 / $sumnonpc; } + if ($mawleft && $sumnonpc > 0) { $mawnon = $mawleft * 100 / $sumnonpc; } + if (($miwnon > $checkminwidth || $maxcalcmiw > $checkminwidth) && $this->keep_table_proportions) { + if ($miwnon > $maxcalcmiw) { + $miwsurplusnonpc = round((($miwnon * $sumnonpc / 100) - $miwleft),3); + $checkminwidth = $miwnon; + } + else { $checkminwidth = $maxcalcmiw; } + for( $i = 0 ; $i < $nc ; $i++ ) { + if (isset($table['wc'][$i]['wpercent'])) { + $newmiw = $checkminwidth * $table['wc'][$i]['wpercent']/100; + if ($table['wc'][$i]['miw'] < $newmiw) { + $table['wc'][$i]['miw'] = $newmiw; + } + $table['wc'][$i]['w'] = 1; + } + else if ($miwsurplusnonpc && !$table['wc'][$i]['w']) { + $table['wc'][$i]['miw'] += $miwsurplusnonpc / $miwleftcount; + } + } + } + if (($mawnon > $checkmaxwidth || $maxcalcmaw > $checkmaxwidth )) { + if ($mawnon > $maxcalcmaw) { + $mawsurplusnonpc = round((($mawnon * $sumnonpc / 100) - $mawleft),3); + $checkmaxwidth = $mawnon; + } + else { $checkmaxwidth = $maxcalcmaw; } + for( $i = 0 ; $i < $nc ; $i++ ) { + if (isset($table['wc'][$i]['wpercent'])) { + $newmaw = $checkmaxwidth * $table['wc'][$i]['wpercent']/100; + if ($table['wc'][$i]['maw'] < $newmaw) { + $table['wc'][$i]['maw'] = $newmaw; + } + $table['wc'][$i]['w'] = 1; + } + else if ($mawsurplusnonpc && !$table['wc'][$i]['w']) { + $table['wc'][$i]['maw'] += $mawsurplusnonpc / $mawleftcount; + } + if ($table['wc'][$i]['maw'] < $table['wc'][$i]['miw']) { $table['wc'][$i]['maw'] = $table['wc'][$i]['miw']; } + } + } + if ($checkminwidth > $checkmaxwidth) { $checkmaxwidth = $checkminwidth; } + } + } + + if (isset($table['wpercent']) && $table['wpercent']) { + $checkminwidth *= (100 / $table['wpercent']); + $checkmaxwidth *= (100 / $table['wpercent']); + } + + + $checkminwidth += $tblbw ; + $checkmaxwidth += $tblbw ; + + // Table['miw'] set by percent in first pass may be larger than sum of column miw + if ((isset($table['miw']) && $checkminwidth > $table['miw']) || !isset($table['miw'])) { $table['miw'] = $checkminwidth; } + if ((isset($table['maw']) && $checkmaxwidth > $table['maw']) || !isset($table['maw'])) { $table['maw'] = $checkmaxwidth; } + $table['tl'] = $totallength ; + + + if (!$this->tableCJK) { + if ($this->table_rotate) { + $mxw = $this->tbrot_maxw; + } + else { + $mxw = $this->blk[$this->blklvl]['inner_width']; + } + if(!isset($table['overflow'])) { $table['overflow'] = null; } + if ($table['overflow']=='visible') { + return array(0,0); + } + else if ($table['overflow']=='hidden' && !$this->table_rotate && !$this->ColActive && $checkminwidth > $mxw) { + $table['w'] = $table['miw']; + return array(0,0); + } + else if ($table['overflow']=='wrap') { return array(0,0); } + + if (isset($table['w']) && $table['w'] ) { + if ($table['w'] >= $checkminwidth && $table['w'] <= $mxw) { $table['maw'] = $mxw = $table['w']; } + else if ($table['w'] >= $checkminwidth && $table['w'] > $mxw && $this->keep_table_proportions) { $checkminwidth = $table['w']; } + else { + unset($table['w']); + } + } + $ratio = $checkminwidth/$mxw; + if ($checkminwidth > $mxw) { return array(($ratio +0.001),$checkminwidth); } // 0.001 to allow for rounded numbers when resizing + } + unset($cs); + return array(0,0); +} + + + +function _tableWidth(&$table){ + $widthcols = &$table['wc']; + $numcols = $table['nc']; + $tablewidth = 0; + if ($table['borders_separate']) { + $tblbw = $table['border_details']['L']['w'] + $table['border_details']['R']['w'] + $table['margin']['L'] + $table['margin']['R'] + $table['padding']['L'] + $table['padding']['R'] + $table['border_spacing_H']; + } + else { $tblbw = $table['max_cell_border_width']['L']/2 + $table['max_cell_border_width']['R']/2 + $table['margin']['L'] + $table['margin']['R']; } + + if ($table['level']>1 && isset($table['w'])) { + if (isset($table['wpercent']) && $table['wpercent']) { + $table['w'] = $temppgwidth = (($table['w']-$tblbw) * $table['wpercent'] / 100) + $tblbw ; + } + else { + $temppgwidth = $table['w'] ; + } + } + else if ($this->table_rotate) { + $temppgwidth = $this->tbrot_maxw; + // If it is less than 1/20th of the remaining page height to finish the DIV (i.e. DIV padding + table bottom margin) + // then allow for this + $enddiv = $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w']; + if ($enddiv/$temppgwidth <0.05) { $temppgwidth -= $enddiv; } + } + else { + if (isset($table['w']) && $table['w']< $this->blk[$this->blklvl]['inner_width']) { + $notfullwidth = 1; + $temppgwidth = $table['w'] ; + } + else if ($table['overflow']=='visible' && $table['level'] ==1) { + $temppgwidth = null; + } + else if ($table['overflow']=='hidden' && !$this->ColActive && isset($table['w']) && $table['w'] > $this->blk[$this->blklvl]['inner_width'] && $table['w']==$table['miw']) { + //$temppgwidth = $this->blk[$this->blklvl]['inner_width']; + $temppgwidth = $table['w'] ; + } + else { $temppgwidth = $this->blk[$this->blklvl]['inner_width']; } + } + + + $totaltextlength = 0; // Added - to sum $table['l'][colno] + $totalatextlength = 0; // Added - to sum $table['l'][colno] for those columns where width not set + $percentages_set = 0; + for ( $i = 0 ; $i < $numcols ; $i++ ) { + if (isset($widthcols[$i]['wpercent'])) { $tablewidth += $widthcols[$i]['maw']; $percentages_set = 1; } + else if (isset($widthcols[$i]['w'])) { $tablewidth += $widthcols[$i]['miw']; } + else { $tablewidth += $widthcols[$i]['maw']; } + $totaltextlength += $table['l'][$i]; + } + if (!$totaltextlength) { $totaltextlength =1; } + $tablewidth += $tblbw; // Outer half of table borders + + if ($tablewidth > $temppgwidth) { + $table['w'] = $temppgwidth; + } + // if any widths set as percentages and max width fits < page width + else if ($tablewidth < $temppgwidth && !isset($table['w']) && $percentages_set) { + $table['w'] = $table['maw']; + } + // if table width is set and is > allowed width + if (isset($table['w']) && $table['w'] > $temppgwidth) { $table['w'] = $temppgwidth; } + // IF the table width is now set - Need to distribute columns widths + if (isset($table['w'])) { + $wis = $wisa = 0; + $list = array(); + $notsetlist = array(); + for( $i = 0 ; $i < $numcols ; $i++ ) { + $wis += $widthcols[$i]['miw']; + if (!isset($widthcols[$i]['w']) || ($widthcols[$i]['w'] && $table['w'] > $temppgwidth && !$this->keep_table_proportions && !$notfullwidth )){ + $list[] = $i; + $wisa += $widthcols[$i]['miw']; + $totalatextlength += $table['l'][$i]; + } + } + if (!$totalatextlength) { $totalatextlength =1; } + + // Allocate spare (more than col's minimum width) across the cols according to their approx total text length + // Do it by setting minimum width here + if ($table['w'] > $wis + $tblbw) { + // First set any cell widths set as percentages + if ($table['w'] < $temppgwidth || $this->keep_table_proportions) { + for($k=0;$k<$numcols;$k++) { + if (isset($widthcols[$k]['wpercent'])) { + $curr = $widthcols[$k]['miw']; + $widthcols[$k]['miw'] = ($table['w']-$tblbw) * $widthcols[$k]['wpercent']/100; + $wis += $widthcols[$k]['miw'] - $curr; + $wisa += $widthcols[$k]['miw'] - $curr; + } + } + } + // Now allocate surplus up to maximum width of each column + $surplus = 0; $ttl = 0; // number of surplus columns + if (!count($list)) { + $wi = ($table['w']-($wis + $tblbw)); // i.e. extra space to distribute + for($k=0;$k<$numcols;$k++) { + $spareratio = ($table['l'][$k] / $totaltextlength); // gives ratio to divide up free space + // Don't allocate more than Maximum required width - save rest in surplus + if ($widthcols[$k]['miw'] + ($wi * $spareratio) > $widthcols[$k]['maw']) { + $surplus += ($wi * $spareratio) - ($widthcols[$k]['maw']-$widthcols[$k]['miw']); + $widthcols[$k]['miw'] = $widthcols[$k]['maw']; + } + else { + $notsetlist[] = $k; + $ttl += $table['l'][$k]; + $widthcols[$k]['miw'] += ($wi * $spareratio); + } + + } + } + else { + $wi = ($table['w'] - ($wis + $tblbw)); // i.e. extra space to distribute + foreach ($list as $k) { + $spareratio = ($table['l'][$k] / $totalatextlength); // gives ratio to divide up free space + // Don't allocate more than Maximum required width - save rest in surplus + if ($widthcols[$k]['miw'] + ($wi * $spareratio) > $widthcols[$k]['maw']) { + $surplus += ($wi * $spareratio) - ($widthcols[$k]['maw']-$widthcols[$k]['miw']); + $widthcols[$k]['miw'] = $widthcols[$k]['maw']; + } + else { + $notsetlist[] = $k; + $ttl += $table['l'][$k]; + $widthcols[$k]['miw'] += ($wi * $spareratio); + } + } + } + // If surplus still left over apportion it across columns + if ($surplus) { + // if some are set only add to remaining - otherwise add to all of them + if (count($notsetlist) && count($notsetlist) < $numcols) { + foreach ($notsetlist AS $i) { + if ($ttl) $widthcols[$i]['miw'] += $surplus * $table['l'][$i] / $ttl ; + } + } + // If some widths are defined, and others have been added up to their maxmum + else if (count($list) && count($list) < $numcols) { + foreach ($list AS $i) { + $widthcols[$i]['miw'] += $surplus / count($list) ; + } + } + else if ($numcols) { // If all columns + $ttl = array_sum($table['l']); + for ($i=0;$i<$numcols;$i++) { + $widthcols[$i]['miw'] += $surplus * $table['l'][$i] / $ttl; + } + } + } + + } + + // This sets the columns all to minimum width (which has been increased above if appropriate) + for ($i=0;$i<$numcols;$i++) { + $widthcols[$i] = $widthcols[$i]['miw']; + } + + // TABLE NOT WIDE ENOUGH EVEN FOR MINIMUM CONTENT WIDTH + // If sum of column widths set are too wide for table + $checktablewidth = 0; + for ( $i = 0 ; $i < $numcols ; $i++ ) { + $checktablewidth += $widthcols[$i]; + } + if ($checktablewidth > ($temppgwidth + 0.001 - $tblbw)) { + $usedup = 0; $numleft = 0; + for ($i=0;$i<$numcols;$i++) { + if ((isset($widthcols[$i]) && $widthcols[$i] > (($temppgwidth - $tblbw) / $numcols)) && (!isset($widthcols[$i]['w']))) { + $numleft++; + unset($widthcols[$i]); + } + else { $usedup += $widthcols[$i]; } + } + for ($i=0;$i<$numcols;$i++) { + if (!isset($widthcols[$i]) || !$widthcols[$i]) { + $widthcols[$i] = ((($temppgwidth - $tblbw) - $usedup)/ ($numleft)); + } + } + } + + } + else { //table has no width defined + $table['w'] = $tablewidth; + for ( $i = 0 ; $i < $numcols ; $i++) { + if (isset($widthcols[$i]['wpercent']) && $this->keep_table_proportions) { $colwidth = $widthcols[$i]['maw']; } + else if (isset($widthcols[$i]['w'])) { $colwidth = $widthcols[$i]['miw']; } + else { $colwidth = $widthcols[$i]['maw']; } + unset($widthcols[$i]); + $widthcols[$i] = $colwidth; + } + } + + if ($table['overflow']=='visible' && $table['level'] ==1) { + if ($tablewidth > $this->blk[$this->blklvl]['inner_width']) { + if ($this->cacheTables) { $fh = fopen($table['cache'], "r+b"); } + else { $fh = null; } + for ($j = 0 ; $j < $numcols; $j++) { //columns + for ($i = 0 ; $i < $table['nr']; $i++) { //rows + if (isset($table['cells'][$i][$j]) && $table['cells'][$i][$j]) { + if ($this->cacheTables) { + $cc = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + $colspan = $cc['colspan']; + } + else + $colspan = $table['cells'][$i][$j]['colspan']; + if ($colspan > 1) { + $w = 0; + for ($c = $j; $c < ($j + $colspan); $c++) { + $w += $widthcols[$c]; + } + if ($w > $this->blk[$this->blklvl]['inner_width']) { + $diff = $w - ($this->blk[$this->blklvl]['inner_width'] - $tblbw); + for ($c = $j; $c < ($j + $colspan); $c++) { + $widthcols[$c] -= $diff * ($widthcols[$c]/$w); + } + $table['w'] -= $diff; + $table['csp'][$j] = $w - $diff; + } + } + } + + } + } + if ($this->cacheTables) { fclose($fh); } + } + $pgNo = 0; + $currWc = 0; + for ($i = 0 ; $i < $numcols; $i++) { //columns + if (isset($table['csp'][$i])) { + $w = $table['csp'][$i]; + unset($table['csp'][$i]); + } + else { $w = $widthcols[$i]; } + if (($currWc + $w + $tblbw) > $this->blk[$this->blklvl]['inner_width']) { + $pgNo++; + $currWc = $widthcols[$i] ; + } + else { $currWc += $widthcols[$i] ; } + $table['colPg'][$i] = $pgNo; + } + } +} + + + +function _tableHeight(&$table){ + $level = $table['level']; + $levelid = $table['levelid']; + $cells = &$table['cells']; + $numcols = $table['nc']; + $numrows = $table['nr']; + $listspan = array(); + $checkmaxheight = 0; + $headerrowheight = 0; + $checkmaxheightplus = 0; + $headerrowheightplus = 0; + $firstrowheight = 0; + + $footerrowheight = 0; + $footerrowheightplus = 0; + if ($this->table_rotate) { + $temppgheight = $this->tbrot_maxh; + $remainingpage = $this->tbrot_maxh; + } + else { + $temppgheight = ($this->h - $this->bMargin - $this->tMargin) - $this->kwt_height; + $remainingpage = ($this->h - $this->bMargin - $this->y) - $this->kwt_height; + + // If it is less than 1/20th of the remaining page height to finish the DIV (i.e. DIV padding + table bottom margin) + // then allow for this + $enddiv = $this->blk[$this->blklvl]['padding_bottom'] + $this->blk[$this->blklvl]['border_bottom']['w'] + $table['margin']['B']; + if ($remainingpage > $enddiv && $enddiv/$remainingpage <0.05) { $remainingpage -= $enddiv; } + else if ($remainingpage == 0) { $remainingpage = 0.001; } + if ($temppgheight > $enddiv && $enddiv/$temppgheight <0.05) { $temppgheight -= $enddiv; } + else if ($temppgheight == 0) { $temppgheight = 0.001; } + } + if ($remainingpage < 0) { $remainingpage = 0.001; } // mPDF 5.6.64 + if ($temppgheight < 0) { $temppgheight = 0.001; } // mPDF 5.6.64 + + if ($this->cacheTables) { $fh = fopen($table['cache'], "r+b"); } + else { $fh = null; } + + for( $i = 0 ; $i < $numrows ; $i++ ) { //rows + $heightrow = &$table['hr'][$i]; + for( $j = 0 ; $j < $numcols ; $j++ ) { //columns + if (isset($cells[$i][$j]) && $cells[$i][$j]) { + if ($this->cacheTables) { + $c = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + } + else + $c = &$cells[$i][$j]; + + if ($this->simpleTables){ + if ($table['borders_separate']) { // NB twice border width + $extraWLR = ($table['simple']['border_details']['L']['w']+$table['simple']['border_details']['R']['w']) + ($c['padding']['L']+$c['padding']['R'])+$table['border_spacing_H']; + $extrh = ($table['simple']['border_details']['T']['w']+$table['simple']['border_details']['B']['w']) + ($c['padding']['T']+$c['padding']['B'])+$table['border_spacing_V']; + } + else { + $extraWLR = ($table['simple']['border_details']['L']['w']+$table['simple']['border_details']['R']['w'])/2 + ($c['padding']['L']+$c['padding']['R']); + $extrh = ($table['simple']['border_details']['T']['w']+$table['simple']['border_details']['B']['w'])/2 + ($c['padding']['T']+$c['padding']['B']); + } + } + else { + if ($this->packTableData) { + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($c['borderbin']); + } + else { + $bt = $c['border_details']['T']['w']; + $bb = $c['border_details']['B']['w']; + $br = $c['border_details']['R']['w']; + $bl = $c['border_details']['L']['w']; + } + if ($table['borders_separate']) { // NB twice border width + $extraWLR = $bl + $br + $c['padding']['L'] + $c['padding']['R'] + $table['border_spacing_H']; + $extrh = $bt + $bb + $c['padding']['T'] + $c['padding']['B'] + $table['border_spacing_V']; + } + else { + $extraWLR = $bl/2 + $br/2 + $c['padding']['L'] + $c['padding']['R']; + $extrh = $bt/2 + $bb/2 + $c['padding']['T']+$c['padding']['B']; + } + } + + if ($table['overflow']=='visible' && $level==1) + list($x,$cw) = $this->_splitTableGetWidth($table, $i,$j, $fh); + else + list($x,$cw) = $this->_tableGetWidth($table, $i,$j, $fh); + + // Get CELL HEIGHT + // ++ extra parameter forces wrap to break word + if ($c['R'] && isset($c['textbuffer'])) { // mPDF 5.4.01 + $str = ''; + foreach($c['textbuffer'] AS $t) { $str .= $t[0].' '; } + $str = trim($str); + $s_fs = $this->FontSizePt; + $s_f = $this->FontFamily; + $s_st = $this->FontStyle; + $this->SetFont($c['textbuffer'][0][4],$c['textbuffer'][0][2],$c['textbuffer'][0][11] / $this->shrin_k,true,true); + $tempch = $this->GetStringWidth($str); + if ($c['R'] >= 45 && $c['R'] < 90) { + $tempch = ((sin(deg2rad($c['R']))) * $tempch ) + ((sin(deg2rad($c['R']))) * (($c['textbuffer'][0][11]/_MPDFK) / $this->shrin_k)); + } + $this->SetFont($s_f,$s_st,$s_fs,true,true); + $ch = ($tempch ) + $extrh ; + } + else { + if (isset($c['textbuffer'])) { + $tempch = $this->TableWordWrap(($cw-$extraWLR),1,$c['textbuffer'], $c['dfs']); + } + else { $tempch = 0; } + + // Added cellpadding top and bottom. (Lineheight already adjusted to table_lineheight) + $ch = $tempch + $extrh ; + } + //If height is defined and it is bigger than calculated $ch then update values + if (isset($c['h']) && $c['h'] > $ch) { + $c['mih'] = $ch; //in order to keep valign working + $ch = $c['h']; + } + else $c['mih'] = $ch; + if ($this->cacheTables) { + $this->_cacheUpdateMtx($c, $fh, $table['cells'][$i][$j], 'mih'); + } + if (isset($c['rowspan'])) $listspan[] = array($i,$j); + elseif ($heightrow < $ch) $heightrow = $ch; + + // this is the extra used in _tableWrite to determine whether to trigger a page change + if ($table['borders_separate']) { + if ($i == ($numrows-1) || (isset($c['rowspan']) && ($i+$c['rowspan']) == ($numrows)) ) { + $extra = $table['margin']['B'] + $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V']/2; + } + else { + $extra = $table['border_spacing_V']/2; + } + } + else { + if (!$this->simpleTables){ + $extra = $bb/2; + } + else if ($this->simpleTables){ + $extra = $table['simple']['border_details']['B']['w'] /2; + } + } + if (isset($table['is_thead'][$i]) && $table['is_thead'][$i]) { + if ($j==0) { + $headerrowheight += $ch; + $headerrowheightplus += $ch+$extra; + } + } + else if (isset($table['is_tfoot'][$i]) && $table['is_tfoot'][$i]) { + if ($j==0) { + $footerrowheight += $ch; + $footerrowheightplus += $ch+$extra; + } + } + else { + $checkmaxheight = max($checkmaxheight,$ch); + $checkmaxheightplus = max($checkmaxheightplus,$ch+$extra); + } + if ($this->tableLevel==1 && $i == $table['headernrows']) { $firstrowheight = max($ch,$firstrowheight); } + unset($c); + } + }//end of columns + }//end of rows + + $heightrow = &$table['hr']; + foreach ($listspan as $span) { + list($i,$j) = $span; + if ($this->cacheTables) { + $c = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + } + else + $c = &$cells[$i][$j]; + $lr = $i + $c['rowspan']; + if ($lr > $numrows) $lr = $numrows; + $hs = $hsa = 0; + $list = array(); + for($k=$i;$k<$lr;$k++) { + $hs += $heightrow[$k]; + if (!isset($c['h'])) { + $list[] = $k; + $hsa += $heightrow[$k]; + } + } + + if ($table['borders_separate']) { + if ($i == ($numrows-1) || ($i+$c['rowspan']) == ($numrows) ) { + $extra = $table['margin']['B'] + $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V']/2; + } + else { + $extra = $table['border_spacing_V']/2; + } + } + else { + if (!$this->simpleTables){ + if ($this->packTableData) { + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($c['borderbin']); + } + else { + $bb = $c['border_details']['B']['w']; + } + $extra = $bb/2; + } + else if ($this->simpleTables){ + $extra = $table['simple']['border_details']['B']['w'] /2; + } + } + if (!empty($table['is_thead'][$i])) { + $headerrowheight = max($headerrowheight,$hs); + $headerrowheightplus = max($headerrowheightplus,$hs+$extra); + } + else if (!empty($table['is_tfoot'][$i])) { + $footerrowheight = max($footerrowheight,$hs); + $footerrowheightplus = max($footerrowheightplus,$hs+$extra); + } + else { + $checkmaxheight = max($checkmaxheight,$hs); + $checkmaxheightplus = max($checkmaxheightplus,$hs+$extra); + } + if ($this->tableLevel==1 && $i == $table['headernrows']) { $firstrowheight = max($hs,$firstrowheight); } + + if ($c['mih'] > $hs) { + if (!$hs) { + for($k=$i;$k<$lr;$k++) $heightrow[$k] = $c['mih']/$c['rowspan']; + } + elseif (!count($list)) { + $hi = $c['mih'] - $hs; + for($k=$i;$k<$lr;$k++) $heightrow[$k] += ($heightrow[$k]/$hs)*$hi; + } + else { + $hi = $c['mih'] - $hsa; + foreach ($list as $k) $heightrow[$k] += ($heightrow[$k]/$hsa)*$hi; + } + } + unset($c); + + // If rowspans overlap so that one or more rows do not have a height set... + // i.e. for one or more rows, the only cells (explicit) in that row have rowspan>1 + // so heightrow is still == 0 + if ($heightrow[$i]==0) { + // Get row extent to analyse above and below + $top = $i; + foreach ($listspan as $checkspan) { + list($cki,$ckj) = $checkspan; + if ($this->cacheTables) { + $c = $this->_uncacheCell($table['cells'][$cki][$ckj], '', $fh); + } + else + $c = &$cells[$cki][$ckj]; + if (isset($c['rowspan']) && $c['rowspan']>1) { + if (($cki + $c['rowspan']-1) >= $i) { $top = min($top, $cki); } + } + } + $bottom = $i + $c['rowspan']-1; + // Check for overconstrained conditions + for ($k=$top; $k<=$bottom; $k++) { + // if ['hr'] for any of the others is also 0, then abort (too complicated) + if ($k != $i && $heightrow[$k]==0) { break(1); } + // check again that top and bottom are not crossed by rowspans - or abort (too complicated) + if ($k==$top) { + // ???? take account of colspan as well??? + for( $m = 0 ; $m < $numcols ; $m++ ) { //columns + if (!isset($cells[$k][$m]) || $cells[$k][$m]==0) { + break(2); + } + } + } + else if ($k==$bottom) { + // ???? take account of colspan as well??? + for( $m = 0 ; $m < $numcols ; $m++ ) { //columns + if ($this->cacheTables) { + $c = $this->_uncacheCell($table['cells'][$k][$m], '', $fh); + } + else + $c = &$cells[$k][$m]; + if (isset($c['rowspan']) && $c['rowspan']>1) { + break(2); + } + } + } + } + // By columns add up col height using ['h'] if set or ['mih'] if not + // Intentionally do not substract border-spacing + $colH = array(); + $extH = 0; + $newhr = array(); + for( $m = 0 ; $m < $numcols ; $m++ ) { //columns + for ($k=$top; $k<=$bottom; $k++) { + if (isset($cells[$k][$m]) && $cells[$k][$m]!=0) { + if ($this->cacheTables) { + $c = $this->_uncacheCell($table['cells'][$k][$m], '', $fh); + } + else + $c = &$cells[$k][$m]; + if (isset($c['h']) && $c['h']) { + $useh = $c['h']; + } + // ???? take account of colspan as well??? + else { + $useh = $c['mih']; + } + $colH[$m] += $useh; + if (!isset($c['rowspan']) || $c['rowspan']<2) { $newhr[$k] = max($newhr[$k], $useh); } + } + } + $extH = max($tabH, $colH[$m]); + } + $newhr[$i] = $extH - array_sum($newhr); + for ($k=$top; $k<=$bottom; $k++) { $heightrow[$k] = $newhr[$k]; } + } + + + unset($c); + } + + $table['h'] = array_sum($heightrow); + unset($heightrow); + + if ($this->cacheTables) { fclose($fh); } + + if ($table['borders_separate']) { + $table['h'] += $table['margin']['T'] + $table['margin']['B'] + $table['border_details']['T']['w'] + $table['border_details']['B']['w'] + $table['border_spacing_V'] + $table['padding']['T'] + $table['padding']['B']; + } + else { + $table['h'] += $table['margin']['T'] + $table['margin']['B'] + $table['max_cell_border_width']['T']/2 + $table['max_cell_border_width']['B']/2; + } + + $maxrowheight = $checkmaxheightplus + $headerrowheightplus + $footerrowheightplus; + $maxfirstrowheight = $firstrowheight + $headerrowheightplus + $footerrowheightplus; // includes thead, 1st row and tfoot + return array($table['h'],$maxrowheight,$temppgheight,$remainingpage,$maxfirstrowheight); +} + +function _tableGetWidth(&$table, $i,$j, $fh){ + if ($this->cacheTables) { + $cell = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + } + else + $cell = &$table['cells'][$i][$j]; + if ($cell) { + if (isset($cell['x0'])) { return array($cell['x0'], $cell['w0']); } + $x = 0; + $widthcols = &$table['wc']; + for( $k = 0 ; $k < $j ; $k++ ) $x += $widthcols[$k]; + $w = $widthcols[$j]; + if (isset($cell['colspan'])) { + for ( $k = $j+$cell['colspan']-1 ; $k > $j ; $k-- ) $w += $widthcols[$k]; + } + $cell['x0'] = $x; + $cell['w0'] = $w; + if ($this->cacheTables) { + $this->_cacheUpdateMtx($cell, $fh, $table['cells'][$i][$j], 'x0'); + } + return array($x, $w); + } + return array(0,0); +} + +function _splitTableGetWidth(&$table, $i,$j, $fh){ + if ($this->cacheTables) { + $cell = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + } + else + $cell = &$table['cells'][$i][$j]; + if ($cell) { + if (isset($cell['x0'])) return array($cell['x0'], $cell['w0']); + $x = 0; + $widthcols = &$table['wc']; + $pg = $table['colPg'][$j]; + for( $k = 0 ; $k < $j ; $k++ ) { + if ($table['colPg'][$k]==$pg) $x += $widthcols[$k]; + } + $w = $widthcols[$j]; + if (isset($cell['colspan'])) { + for ( $k = $j+$cell['colspan']-1 ; $k > $j ; $k-- ) if ($table['colPg'][$k]==$pg) $w += $widthcols[$k]; + } + $cell['x0'] = $x; + $cell['w0'] = $w; + if ($this->cacheTables) { + $this->_cacheUpdateMtx($cell, $fh, $table['cells'][$i][$j], 'x0'); + } + return array($x, $w); + } + return array(0,0); +} + + +function _tableGetHeight(&$table, $i,$j, $fh){ + if ($this->cacheTables) { + $cell = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + } + else + $cell = &$table['cells'][$i][$j]; + if ($cell){ + if (isset($cell['y0'])) return array($cell['y0'], $cell['h0']); + $y = 0; + $heightrow = &$table['hr']; + for ($k=0;$k<$i;$k++) $y += $heightrow[$k]; + $h = $heightrow[$i]; + if (isset($cell['rowspan'])){ + for ($k=$i+$cell['rowspan']-1;$k>$i;$k--) + $h += $heightrow[$k]; + } + $cell['y0'] = $y; + $cell['h0'] = $h; + if ($this->cacheTables) { + $this->_cacheUpdateMtx($cell, $fh, $table['cells'][$i][$j], 'y0'); + } + return array($y, $h); + } + return array(0,0); +} + +function _tableGetMaxRowHeight($table, $row, $fh) { + if ($row==$table['nc']-1) { return $table['hr'][$row]; } + $maxrowheight = $table['hr'][$row]; + for ($i=$row+1;$i<$table['nr'];$i++) { + $cellsset = 0; + for ($j=0;$j<$table['nc'];$j++) { + if ($this->cacheTables) { + $cell = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + if ($cell) { + if (isset($cell['colspan'])) { $cellsset += $cell['colspan']; } + else $cellsset += 1; + } + } + else { + if ($table['cells'][$i][$j]) { + if (isset($table['cells'][$i][$j]['colspan'])) { $cellsset += $table['cells'][$i][$j]['colspan']; } + else $cellsset += 1; + } + } + } + if ($cellsset == $table['nc']) { return $maxrowheight; } + else { $maxrowheight += $table['hr'][$i]; } + } + return $maxrowheight; +} + + +// CHANGED TO ALLOW TABLE BORDER TO BE SPECIFIED CORRECTLY - added border_details +function _tableRect($x, $y, $w, $h, $bord=-1, $details=array(), $buffer=false, $bSeparate=false, $cort='cell', $tablecorner='', $bsv=0, $bsh=0) { + $cellBorderOverlay = array(); + + if ($bord==-1) { $this->Rect($x, $y, $w, $h); } + else if ($this->simpleTables && ($cort=='cell')) { + $this->SetLineWidth($details['L']['w']); + if ($details['L']['c']) { + $this->SetDColor($details['L']['c']); + } + else { $this->SetDColor($this->ConvertColor(0)); } + $this->SetLineJoin(0); + $this->Rect($x, $y, $w, $h); + } + else if ($bord){ + if (!$bSeparate && $buffer) { + $priority = 'LRTB'; + for($p=0;$p<strlen($priority);$p++) { + $side = $priority[$p]; + $details['p'] = $side ; + + $dom = 0; + if (isset($details[$side]['w'])) { $dom += ($details[$side]['w'] * 100000); } + if (isset($details[$side]['style'])) { $dom += (array_search($details[$side]['style'],$this->borderstyles)*100) ; } + if (isset($details[$side]['dom'])) { $dom += ($details[$side]['dom']*10); } + + // Precedence to darker colours at joins + $coldom = 0; + if (isset($details[$side]['c']) && is_array($details[$side]['c'])) { + if ($details[$side]['c']{0}==3) { // RGB + $coldom = 10-(((ord($details[$side]['c']{1})*1.00)+(ord($details[$side]['c']{2})*1.00)+(ord($details[$side]['c']{3})*1.00))/76.5); + } + } // 10 black - 0 white + if ($coldom) { $dom += $coldom; } + // Lastly precedence to RIGHT and BOTTOM cells at joins + if (isset($details['cellposdom'])) { $dom += $details['cellposdom']; } + + $save = false; + if ($side == 'T' && $this->issetBorder($bord, _BORDER_TOP)) { $cbord = _BORDER_TOP; $save = true; } + else if ($side == 'L' && $this->issetBorder($bord, _BORDER_LEFT)) { $cbord = _BORDER_LEFT; $save = true; } + else if ($side == 'R' && $this->issetBorder($bord, _BORDER_RIGHT)) { $cbord = _BORDER_RIGHT; $save = true; } + else if ($side == 'B' && $this->issetBorder($bord, _BORDER_BOTTOM)) { $cbord = _BORDER_BOTTOM; $save = true; } + + if ($save) { + $this->cellBorderBuffer[] = pack("A16nCnda6A10d14", + str_pad(sprintf("%08.7f", $dom),16,"0",STR_PAD_LEFT), + $cbord, + ord($side), + $details[$side]['s'], + $details[$side]['w'], + $details[$side]['c'], + $details[$side]['style'], + $x, $y, $w, $h, + $details['mbw']['BL'], + $details['mbw']['BR'], + $details['mbw']['RT'], + $details['mbw']['RB'], + $details['mbw']['TL'], + $details['mbw']['TR'], + $details['mbw']['LT'], + $details['mbw']['LB'], + $details['cellposdom'], + 0 + ); + if ($details[$side]['style'] == 'ridge' || $details[$side]['style'] == 'groove' || $details[$side]['style'] == 'inset' || $details[$side]['style'] == 'outset' || $details[$side]['style'] == 'double' ) { + $details[$side]['overlay'] = true; + $this->cellBorderBuffer[] = pack("A16nCnda6A10d14", + str_pad(sprintf("%08.7f", ($dom+4)),16,"0",STR_PAD_LEFT), + $cbord, + ord($side), + $details[$side]['s'], + $details[$side]['w'], + $details[$side]['c'], + $details[$side]['style'], + $x, $y, $w, $h, + $details['mbw']['BL'], + $details['mbw']['BR'], + $details['mbw']['RT'], + $details['mbw']['RB'], + $details['mbw']['TL'], + $details['mbw']['TR'], + $details['mbw']['LT'], + $details['mbw']['LB'], + $details['cellposdom'], + 1 + ); + } + } + } + return; + } + + if (isset($details['p']) && strlen($details['p'])>1) { $priority = $details['p']; } + else { $priority='LTRB'; } + $Tw = 0; + $Rw = 0; + $Bw = 0; + $Lw = 0; + if (isset($details['T']['w'])) { $Tw = $details['T']['w']; } + if (isset($details['R']['w'])) { $Rw = $details['R']['w']; } + if (isset($details['B']['w'])) { $Bw = $details['B']['w']; } + if (isset($details['L']['w'])) { $Lw = $details['L']['w']; } + + $x2 = $x + $w; $y2 = $y + $h; + $oldlinewidth = $this->LineWidth; + + for($p=0;$p<strlen($priority);$p++) { + $side = $priority[$p]; + $xadj = 0; + $xadj2 = 0; + $yadj = 0; + $yadj2 = 0; + $print = false; + if ($Tw && $side=='T' && $this->issetBorder($bord, _BORDER_TOP)) { // TOP + $ly1 = $y; + $ly2 = $y; + $lx1 = $x; + $lx2 = $x2; + $this->SetLineWidth($Tw); + if ($cort == 'cell' || strpos($tablecorner,'L')!==false) { + if ($Tw > $Lw) $xadj = ($Tw - $Lw)/2; + if ($Tw < $Lw) $xadj = ($Tw + $Lw)/2; + } + else { $xadj = $Tw/2 - $bsh/2; } + if ($cort == 'cell' || strpos($tablecorner,'R')!==false) { + if ($Tw > $Rw) $xadj2 = ($Tw - $Rw)/2; + if ($Tw < $Rw) $xadj2 = ($Tw + $Rw)/2; + } + else { $xadj2 = $Tw/2 - $bsh/2; } + if (!$bSeparate && $details['mbw']['TL']) { + $xadj = ($Tw - $details['mbw']['TL'])/2 ; + } + if (!$bSeparate && $details['mbw']['TR']) { + $xadj2 = ($Tw - $details['mbw']['TR'])/2; + } + $print = true; + } + if ($Lw && $side=='L' && $this->issetBorder($bord, _BORDER_LEFT)) { // LEFT + $ly1 = $y; + $ly2 = $y2; + $lx1 = $x; + $lx2 = $x; + $this->SetLineWidth($Lw); + if ($cort == 'cell' || strpos($tablecorner,'T')!==false) { + if ($Lw > $Tw) $yadj = ($Lw - $Tw)/2; + if ($Lw < $Tw) $yadj = ($Lw + $Tw)/2; + } + else { $yadj = $Lw/2 - $bsv/2; } + if ($cort == 'cell' || strpos($tablecorner,'B')!==false) { + if ($Lw > $Bw) $yadj2 = ($Lw - $Bw)/2; + if ($Lw < $Bw) $yadj2 = ($Lw + $Bw)/2; + } + else { $yadj2 = $Lw/2 - $bsv/2; } + if (!$bSeparate && $details['mbw']['LT']) { + $yadj = ($Lw - $details['mbw']['LT'])/2; + } + if (!$bSeparate && $details['mbw']['LB']) { + $yadj2 = ($Lw - $details['mbw']['LB'])/2; + } + $print = true; + } + if ($Rw && $side=='R' && $this->issetBorder($bord, _BORDER_RIGHT)) { // RIGHT + $ly1 = $y; + $ly2 = $y2; + $lx1 = $x2; + $lx2 = $x2; + $this->SetLineWidth($Rw); + if ($cort == 'cell' || strpos($tablecorner,'T')!==false) { + if ($Rw < $Tw) $yadj = ($Rw + $Tw)/2; + if ($Rw > $Tw) $yadj = ($Rw - $Tw)/2; + } + else { $yadj = $Rw/2 - $bsv/2; } + + if ($cort == 'cell' || strpos($tablecorner,'B')!==false) { + if ($Rw > $Bw) $yadj2 = ($Rw - $Bw)/2; + if ($Rw < $Bw) $yadj2 = ($Rw + $Bw)/2; + } + else { $yadj2 = $Rw/2 - $bsv/2; } + + if (!$bSeparate && $details['mbw']['RT']) { + $yadj = ($Rw - $details['mbw']['RT'])/2; + } + if (!$bSeparate && $details['mbw']['RB']) { + $yadj2 = ($Rw - $details['mbw']['RB'])/2; + } + $print = true; + } + if ($Bw && $side=='B' && $this->issetBorder($bord, _BORDER_BOTTOM)) { // BOTTOM + $ly1 = $y2; + $ly2 = $y2; + $lx1 = $x; + $lx2 = $x2; + $this->SetLineWidth($Bw); + if ($cort == 'cell' || strpos($tablecorner,'L')!==false) { + if ($Bw > $Lw) $xadj = ($Bw - $Lw)/2; + if ($Bw < $Lw) $xadj = ($Bw + $Lw)/2; + } + else { $xadj = $Bw/2 - $bsh/2; } + if ($cort == 'cell' || strpos($tablecorner,'R')!==false) { + if ($Bw > $Rw) $xadj2 = ($Bw - $Rw)/2; + if ($Bw < $Rw) $xadj2 = ($Bw + $Rw)/2; + } + else { $xadj2 = $Bw/2 - $bsh/2; } + if (!$bSeparate && $details['mbw']['BL']) { + $xadj = ($Bw - $details['mbw']['BL'])/2; + } + if (!$bSeparate && $details['mbw']['BR']) { + $xadj2 = ($Bw - $details['mbw']['BR'])/2; + } + $print = true; + } + + // Now draw line + if ($print) { +/*-- TABLES-ADVANCED-BORDERS --*/ + if ($details[$side]['style'] == 'double') { + if (!isset($details[$side]['overlay']) || !$details[$side]['overlay'] || $bSeparate) { + if ($details[$side]['c']) { + $this->SetDColor($details[$side]['c']); + } + else { $this->SetDColor($this->ConvertColor(0)); } + $this->Line($lx1 + $xadj, $ly1 + $yadj, $lx2 - $xadj2, $ly2 - $yadj2); + } + if ((isset($details[$side]['overlay']) && $details[$side]['overlay']) || $bSeparate) { + if ($bSeparate && $cort=='table') { + if ($side=='T') { + $xadj -= $this->LineWidth/2; + $xadj2 -= $this->LineWidth; + if ($this->issetBorder($bord, _BORDER_LEFT)) { + $xadj += $this->LineWidth/2; + } + if ($this->issetBorder($bord, _BORDER_RIGHT)) { + $xadj2 += $this->LineWidth; + } + } + if ($side=='L') { + $yadj -= $this->LineWidth/2; + $yadj2 -= $this->LineWidth; + if ($this->issetBorder($bord, _BORDER_TOP)) { + $yadj += $this->LineWidth/2; + } + if ($this->issetBorder($bord, _BORDER_BOTTOM)) { + $yadj2 += $this->LineWidth; + } + } + if ($side=='B') { + $xadj -= $this->LineWidth/2; + $xadj2 -= $this->LineWidth; + if ($this->issetBorder($bord, _BORDER_LEFT)) { + $xadj += $this->LineWidth/2; + } + if ($this->issetBorder($bord, _BORDER_RIGHT)) { + $xadj2 += $this->LineWidth; + } + } + if ($side=='R') { + $yadj -= $this->LineWidth/2; + $yadj2 -= $this->LineWidth; + if ($this->issetBorder($bord, _BORDER_TOP)) { + $yadj += $this->LineWidth/2; + } + if ($this->issetBorder($bord, _BORDER_BOTTOM)) { + $yadj2 += $this->LineWidth; + } + } + } + + $this->SetLineWidth($this->LineWidth/3); + + $tbcol = $this->ConvertColor(255); + for($l=0; $l <= $this->blklvl; $l++) { + if ($this->blk[$l]['bgcolor']) { + $tbcol = ($this->blk[$l]['bgcolorarray']); // mPDF 5.6.53 + } + } + + if ($bSeparate) { + $cellBorderOverlay[] = array( + 'x' => $lx1 + $xadj, + 'y' => $ly1 + $yadj, + 'x2' => $lx2 - $xadj2, + 'y2' => $ly2 - $yadj2, + 'col' => $tbcol, + 'lw' => $this->LineWidth, + ); + } + else { + $this->SetDColor($tbcol); + $this->Line($lx1 + $xadj, $ly1 + $yadj, $lx2 - $xadj2, $ly2 - $yadj2); + } + } + } + + + else if (isset($details[$side]['style']) && ($details[$side]['style'] == 'ridge' || $details[$side]['style'] == 'groove' || $details[$side]['style'] == 'inset' || $details[$side]['style'] == 'outset')) { + if (!isset($details[$side]['overlay']) || !$details[$side]['overlay'] || $bSeparate) { + if ($details[$side]['c']) { + $this->SetDColor($details[$side]['c']); + } + else { $this->SetDColor($this->ConvertColor(0)); } + if ($details[$side]['style'] == 'outset' || $details[$side]['style'] == 'groove') { + $nc = $this->_darkenColor($details[$side]['c']); + $this->SetDColor($nc); + } + else if ($details[$side]['style'] == 'ridge' || $details[$side]['style'] == 'inset') { + $nc = $this->_lightenColor($details[$side]['c']); + $this->SetDColor($nc); + } + $this->Line($lx1 + $xadj, $ly1 + $yadj, $lx2 - $xadj2, $ly2 - $yadj2); + } + if ((isset($details[$side]['overlay']) && $details[$side]['overlay']) || $bSeparate) { + if ($details[$side]['c']) { + $this->SetDColor($details[$side]['c']); + } + else { $this->SetDColor($this->ConvertColor(0)); } + $doubleadj = ($this->LineWidth)/3; + $this->SetLineWidth($this->LineWidth/2); + $xadj3 = $yadj3 = $wadj3 = $hadj3 = 0; + + if ($details[$side]['style'] == 'ridge' || $details[$side]['style'] == 'inset') { + $nc = $this->_darkenColor($details[$side]['c']); + + if ($bSeparate && $cort=='table') { + if ($side=='T') { + $yadj3 = $this->LineWidth/2; + $xadj3 = -$this->LineWidth/2; + $wadj3 = $this->LineWidth; + if ($this->issetBorder($bord, _BORDER_LEFT)) { + $xadj3 += $this->LineWidth; $wadj3 -= $this->LineWidth; + } + if ($this->issetBorder($bord, _BORDER_RIGHT)) { + $wadj3 -= $this->LineWidth*2; + } + } + if ($side=='L') { + $xadj3 = $this->LineWidth/2; + $yadj3 = -$this->LineWidth/2; + $hadj3 = $this->LineWidth; + if ($this->issetBorder($bord, _BORDER_TOP)) { + $yadj3 += $this->LineWidth; $hadj3 -= $this->LineWidth; + } + if ($this->issetBorder($bord, _BORDER_BOTTOM)) { + $hadj3 -= $this->LineWidth*2; + } + } + if ($side=='B') { + $yadj3 = $this->LineWidth/2; + $xadj3 = -$this->LineWidth/2; + $wadj3 = $this->LineWidth; + } + if ($side=='R') { + $xadj3 = $this->LineWidth/2; + $yadj3 = -$this->LineWidth/2; + $hadj3 = $this->LineWidth; + } + } + + else if ($side=='T') { $yadj3 = $this->LineWidth/2; $xadj3 = $this->LineWidth/2; $wadj3 = -$this->LineWidth*2; } + else if ($side=='L') { $xadj3 = $this->LineWidth/2; $yadj3 = $this->LineWidth/2; $hadj3 = -$this->LineWidth*2; } + + else if ($side=='B' && $bSeparate) { $yadj3 = $this->LineWidth/2; $wadj3 = $this->LineWidth/2; } + else if ($side=='R' && $bSeparate) { $xadj3 = $this->LineWidth/2; $hadj3 = $this->LineWidth/2; } + + else if ($side=='B') { $yadj3 = $this->LineWidth/2; $xadj3 = $this->LineWidth/2; } + else if ($side=='R') { $xadj3 = $this->LineWidth/2; $yadj3 = $this->LineWidth/2; } + } + else { + $nc = $this->_lightenColor($details[$side]['c']); + + if ($bSeparate && $cort=='table') { + if ($side=='T') { + $yadj3 = $this->LineWidth/2; + $xadj3 = -$this->LineWidth/2; + $wadj3 = $this->LineWidth; + if ($this->issetBorder($bord, _BORDER_LEFT)) { + $xadj3 += $this->LineWidth; $wadj3 -= $this->LineWidth; + } + } + if ($side=='L') { + $xadj3 = $this->LineWidth/2; + $yadj3 = -$this->LineWidth/2; + $hadj3 = $this->LineWidth; + if ($this->issetBorder($bord, _BORDER_TOP)) { + $yadj3 += $this->LineWidth; $hadj3 -= $this->LineWidth; + } + } + if ($side=='B') { + $yadj3 = $this->LineWidth/2; + $xadj3 = -$this->LineWidth/2; + $wadj3 = $this->LineWidth; + if ($this->issetBorder($bord, _BORDER_LEFT)) { + $xadj3 += $this->LineWidth; $wadj3 -= $this->LineWidth; + } + } + if ($side=='R') { + $xadj3 = $this->LineWidth/2; + $yadj3 = -$this->LineWidth/2; + $hadj3 = $this->LineWidth; + if ($this->issetBorder($bord, _BORDER_TOP)) { + $yadj3 += $this->LineWidth; $hadj3 -= $this->LineWidth; + } + } + } + + else if ($side=='T') { $yadj3 = $this->LineWidth/2; $xadj3 = $this->LineWidth/2; } + else if ($side=='L') { $xadj3 = $this->LineWidth/2; $yadj3 = $this->LineWidth/2; } + + else if ($side=='B' && $bSeparate) { $yadj3 = $this->LineWidth/2; $xadj3 = $this->LineWidth/2; } + else if ($side=='R' && $bSeparate) { $xadj3 = $this->LineWidth/2; $yadj3 = $this->LineWidth/2; } + + else if ($side=='B') { $yadj3 = $this->LineWidth/2; $xadj3 = -$this->LineWidth/2; $wadj3 = $this->LineWidth; } + else if ($side=='R') { $xadj3 = $this->LineWidth/2; $yadj3 = -$this->LineWidth/2; $hadj3 = $this->LineWidth; } + + } + + if ($bSeparate) { + $cellBorderOverlay[] = array( + 'x' => $lx1 + $xadj + $xadj3, + 'y' => $ly1 + $yadj + $yadj3, + 'x2' => $lx2 - $xadj2 + $xadj3 + $wadj3, + 'y2' => $ly2 - $yadj2 + $yadj3 + $hadj3, + 'col' => $nc, + 'lw' => $this->LineWidth, + ); + } + else { + $this->SetDColor($nc); + $this->Line($lx1 + $xadj + $xadj3, $ly1 + $yadj + $yadj3, $lx2 - $xadj2 + $xadj3 + $wadj3, $ly2 - $yadj2 + $yadj3 + $hadj3); + } + } + } + + + else { +/*-- END TABLES-ADVANCED-BORDERS --*/ + if ($details[$side]['style'] == 'dashed') { + $dashsize = 2; // final dash will be this + 1*linewidth + $dashsizek = 1.5; // ratio of Dash/Blank + $this->SetDash($dashsize,($dashsize/$dashsizek)+($this->LineWidth*2)); + } + else if ($details[$side]['style'] == 'dotted') { + $this->SetLineJoin(1); + $this->SetLineCap(1); + $this->SetDash(0.001,($this->LineWidth*2)); + } + if ($details[$side]['c']) { + $this->SetDColor($details[$side]['c']); + } + else { $this->SetDColor($this->ConvertColor(0)); } + $this->Line($lx1 + $xadj, $ly1 + $yadj, $lx2 - $xadj2, $ly2 - $yadj2); +/*-- TABLES-ADVANCED-BORDERS --*/ + } +/*-- END TABLES-ADVANCED-BORDERS --*/ + + // Reset Corners + $this->SetDash(); + //BUTT style line cap + $this->SetLineCap(2); + } + } + + if ($bSeparate && count($cellBorderOverlay)) { + foreach($cellBorderOverlay AS $cbo) { + $this->SetLineWidth($cbo['lw']); + $this->SetDColor($cbo['col']); + $this->Line($cbo['x'], $cbo['y'], $cbo['x2'], $cbo['y2']); + } + } + + // $this->SetLineWidth($oldlinewidth); + // $this->SetDColor($this->ConvertColor(0)); + } +} + + +/*-- TABLES --*/ +/*-- TABLES-ADVANCED-BORDERS --*/ +function _lightenColor($c) { + if (is_array($c)) { die('Color error in _lightencolor'); } + if ($c{0}==3 || $c{0}==5) { // RGB + list($h,$s,$l) = $this->rgb2hsl(ord($c{1})/255,ord($c{2})/255,ord($c{3})/255); + $l += ((1 - $l)*0.8); + list($r,$g,$b) = $this->hsl2rgb($h,$s,$l); + $ret = array(3,$r,$g,$b); + } + else if ($c{0}==4 || $c{0}==6) { // CMYK + $ret = array(4, max(0,(ord($c{1})-20)), max(0,(ord($c{2})-20)), max(0,(ord($c{3})-20)), max(0,(ord($c{4})-20)) ); + } + else if ($c{0}==1) { // Grayscale + $ret = array(1,min(255,(ord($c{1})+32))); + } + $c = array_pad($ret, 6, 0); + $cstr = pack("a1ccccc", $c[0], ($c[1] & 0xFF), ($c[2] & 0xFF), ($c[3] & 0xFF), ($c[4] & 0xFF), ($c[5] & 0xFF) ); + return $cstr; +} + + +function _darkenColor($c) { + if (is_array($c)) { die('Color error in _darkenColor'); } + if ($c{0}==3 || $c{0}==5) { // RGB + list($h,$s,$l) = $this->rgb2hsl(ord($c{1})/255,ord($c{2})/255,ord($c{3})/255); + $s *= 0.25; + $l *= 0.75; + list($r,$g,$b) = $this->hsl2rgb($h,$s,$l); + $ret = array(3,$r,$g,$b); + } + else if ($c{0}==4 || $c{0}==6) { // CMYK + $ret = array(4, min(100,(ord($c{1})+20)), min(100,(ord($c{2})+20)), min(100,(ord($c{3})+20)), min(100,(ord($c{4})+20)) ); + } + else if ($c{0}==1) { // Grayscale + $ret = array(1,max(0,(ord($c{1})-32))); + } + $c = array_pad($ret, 6, 0); + $cstr = pack("a1ccccc", $c[0], ($c[1] & 0xFF), ($c[2] & 0xFF), ($c[3] & 0xFF), ($c[4] & 0xFF), ($c[5] & 0xFF) ); + return $cstr; +} + +/*-- END TABLES-ADVANCED-BORDERS --*/ + + + +function setBorder(&$var, $flag, $set = true) { + $flag = intval($flag); + if ($set) { $set = true; } + $var = intval($var); + $var = $set ? ($var | $flag) : ($var & ~$flag); +} +function issetBorder($var, $flag) { + $flag = intval($flag); + $var = intval($var); + return (($var & $flag) == $flag); +} + + +function _table2cellBorder(&$tableb, &$cbdb, &$cellb, $bval) { + if ($tableb && $tableb['w'] > $cbdb['w']) { + $cbdb = $tableb; + $this->setBorder($cellb, $bval); + } + else if ($tableb && $tableb['w'] == $cbdb['w'] + && array_search($tableb['style'],$this->borderstyles) > array_search($cbdb['style'],$this->borderstyles)) { + $cbdb = $tableb; + $this->setBorder($cellb, $bval); + } +} + +// FIX BORDERS ******************************************** +function _fixTableBorders(&$table){ + if ($this->cacheTables) { $fh = fopen($table['cache'], "r+b"); } + else { $fh = null; } + + if (!$table['borders_separate'] && $table['border_details']['L']['w']) { + $table['max_cell_border_width']['L'] = $table['border_details']['L']['w']; + } + if (!$table['borders_separate'] && $table['border_details']['R']['w']) { + $table['max_cell_border_width']['R'] = $table['border_details']['R']['w']; + } + if (!$table['borders_separate'] && $table['border_details']['T']['w']) { + $table['max_cell_border_width']['T'] = $table['border_details']['T']['w']; + } + if (!$table['borders_separate'] && $table['border_details']['B']['w']) { + $table['max_cell_border_width']['B'] = $table['border_details']['B']['w']; + } + if ($this->simpleTables) { return; } + $cells = &$table['cells']; + $numcols = $table['nc']; + $numrows = $table['nr']; +/*-- TABLES-ADVANCED-BORDERS --*/ + if (isset($table['topntail']) && $table['topntail']) { $tntborddet = $this->border_details($table['topntail']); } + if (isset($table['thead-underline']) && $table['thead-underline']) { $thuborddet = $this->border_details($table['thead-underline']); } +/*-- END TABLES-ADVANCED-BORDERS --*/ + + for( $i = 0 ; $i < $numrows ; $i++ ) { //Rows + for( $j = 0 ; $j < $numcols ; $j++ ) { //Columns + if (isset($cells[$i][$j]) && $cells[$i][$j]) { + if ($this->cacheTables) { + $cell = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + } + else + $cell = &$cells[$i][$j]; + if ($this->packTableData) { // includes $this->cacheTables + $cbord = $this->_unpackCellBorder($cell['borderbin']); + } + else { + $cbord = &$cells[$i][$j]; + } + + if (!$cbord['border'] && isset($table['border']) && $table['border'] && $this->table_border_attr_set) { + $cbord['border'] = $table['border']; + $cbord['border_details'] = $table['border_details']; + } + + if (isset($cell['colspan']) && $cell['colspan']>1) { $ccolsp = $cell['colspan']; } + else { $ccolsp = 1; } + if (isset($cell['rowspan']) && $cell['rowspan']>1) { $crowsp = $cell['rowspan']; } + else { $crowsp = 1; } + + $cbord['border_details']['cellposdom'] = ((($i+1)/$numrows) / 10000 ) + ((($j+1)/$numcols) / 10 ); + // Inherit Cell border from Table border + if ($this->table_border_css_set && !$table['borders_separate']) { + if ($i == 0) { + $this->_table2cellBorder($table['border_details']['T'], $cbord['border_details']['T'], $cbord['border'], _BORDER_TOP); + } + if ($i == ($numrows-1) || ($i+$crowsp) == ($numrows) ) { + $this->_table2cellBorder($table['border_details']['B'], $cbord['border_details']['B'], $cbord['border'], _BORDER_BOTTOM); + } + if ($j == 0) { + $this->_table2cellBorder($table['border_details']['L'], $cbord['border_details']['L'], $cbord['border'], _BORDER_LEFT); + } + if ($j == ($numcols-1) || ($j+$ccolsp) == ($numcols) ) { + $this->_table2cellBorder($table['border_details']['R'], $cbord['border_details']['R'], $cbord['border'], _BORDER_RIGHT); + } + } + +/*-- TABLES-ADVANCED-BORDERS --*/ + $fixbottom = true; + if (isset($table['topntail']) && $table['topntail']) { + if ($i == 0) { + $cbord['border_details']['T'] = $tntborddet; + $this->setBorder($cbord['border'], _BORDER_TOP); + } + if ($this->tableLevel==1 && $table['headernrows']>0 && $i == $table['headernrows']-1) { + $cbord['border_details']['B'] = $tntborddet; + $this->setBorder($cbord['border'], _BORDER_BOTTOM); + $fixbottom = false; + } + else if ($this->tableLevel==1 && $table['headernrows']>0 && $i == $table['headernrows']) { + if (!$table['borders_separate']) { + $cbord['border_details']['T'] = $tntborddet; + $this->setBorder($cbord['border'], _BORDER_TOP); + } + } + if ($this->tableLevel==1 && $table['footernrows']>0 && $i == ($numrows-$table['footernrows']-1)) { + if (!$table['borders_separate']) { + $cbord['border_details']['B'] = $tntborddet; + $this->setBorder($cbord['border'], _BORDER_BOTTOM); + $fixbottom = false; + } + } + else if ($this->tableLevel==1 && $table['footernrows']>0 && $i == ($numrows-$table['footernrows'])) { + $cbord['border_details']['T'] = $tntborddet; + $this->setBorder($cbord['border'], _BORDER_TOP); + } + if ($this->tabletheadjustfinished) { // $this->tabletheadjustfinished called from tableheader + if (!$table['borders_separate']) { + $cbord['border_details']['T'] = $tntborddet; + $this->setBorder($cbord['border'], _BORDER_TOP); + } + } + if ($i == ($numrows-1) || ($i+$crowsp) == ($numrows) ) { + $cbord['border_details']['B'] = $tntborddet; + $this->setBorder($cbord['border'], _BORDER_BOTTOM); + } + } + if (isset($table['thead-underline']) && $table['thead-underline']) { + if ($table['borders_separate']) { + if ($i == 0) { + $cbord['border_details']['B'] = $thuborddet; + $this->setBorder($cbord['border'], _BORDER_BOTTOM); + $fixbottom = false; + } + } + else { + if ($this->tableLevel==1 && $table['headernrows']>0 && $i == $table['headernrows']-1) { + $cbord['border_details']['T'] = $thuborddet; + $this->setBorder($cbord['border'], _BORDER_TOP); + } + else if ($this->tabletheadjustfinished) { // $this->tabletheadjustfinished called from tableheader + $cbord['border_details']['T'] = $thuborddet; + $this->setBorder($cbord['border'], _BORDER_TOP); + } + } + } + + // Collapse Border - Algorithm for conflicting borders + // Hidden >> Width >> double>solid>dashed>dotted... >> style set on cell>table >> top/left>bottom/right + // Do not turn off border which is overridden + // Needed for page break for TOP/BOTTOM both to be defined in Collapsed borders + // Means it is painted twice. (Left/Right can still disable overridden border) + if (!$table['borders_separate']) { + if (($i < ($numrows-1) || ($i+$crowsp) < $numrows ) && $fixbottom ) { // Bottom + for ($cspi = 0; $cspi<$ccolsp; $cspi++) { + // already defined Top for adjacent cell below + if (isset($cells[($i+$crowsp)][$j+$cspi])) { + if ($this->packTableData) { + if ($this->cacheTables) { + $adjc = $this->_uncacheCell($table['cells'][$i+$crowsp][$j+$cspi], '', $fh); + } + else { $adjc = $cells[($i+$crowsp)][$j+$cspi]; } + $celladj = $this->_unpackCellBorder($adjc['borderbin']); + } + else { $celladj =& $cells[($i+$crowsp)][$j+$cspi]; } + } + else { $celladj = false; } + if ($celladj && $celladj['border_details']['T']['s'] == 1) { + $csadj = $celladj['border_details']['T']['w']; + $csthis = $cbord['border_details']['B']['w']; + // Hidden + if ($cbord['border_details']['B']['style']=='hidden') { + $celladj['border_details']['T'] = $cbord['border_details']['B']; + $this->setBorder($celladj['border'] , _BORDER_TOP, false); + $this->setBorder($cbord['border'] , _BORDER_BOTTOM , false); + } + else if ($celladj['border_details']['T']['style']=='hidden') { + $cbord['border_details']['B'] = $celladj['border_details']['T']; + $this->setBorder($cbord['border'] , _BORDER_BOTTOM , false); + $this->setBorder($celladj['border'] , _BORDER_TOP, false); + } + // Width + else if ($csthis > $csadj) { + if (!isset($cells[($i+$crowsp)][$j+$cspi]['colspan']) || (isset($cells[($i+$crowsp)][$j+$cspi]['colspan']) && $cells[($i+$crowsp)][$j+$cspi]['colspan']<2)) { // don't overwrite bordering cells that span + $celladj['border_details']['T'] = $cbord['border_details']['B']; + $this->setBorder($cbord['border'] , _BORDER_BOTTOM); + } + } + else if ($csadj > $csthis) { + if ($ccolsp < 2) { // don't overwrite this cell if it spans + $cbord['border_details']['B'] = $celladj['border_details']['T']; + $this->setBorder($celladj['border'] , _BORDER_TOP); + } + } + + // double>solid>dashed>dotted... + else if (array_search($cbord['border_details']['B']['style'],$this->borderstyles) > array_search($celladj['border_details']['T']['style'],$this->borderstyles)) { + if (!isset($cells[($i+$crowsp)][$j+$cspi]['colspan']) || (isset($cells[($i+$crowsp)][$j+$cspi]['colspan']) && $cells[($i+$crowsp)][$j+$cspi]['colspan']<2)) { // don't overwrite bordering cells that span + $celladj['border_details']['T'] = $cbord['border_details']['B']; + $this->setBorder($cbord['border'] , _BORDER_BOTTOM ); + } + } + else if (array_search($celladj['border_details']['T']['style'],$this->borderstyles) > array_search($cbord['border_details']['B']['style'],$this->borderstyles)) { + if ($ccolsp < 2) { // don't overwrite this cell if it spans + $cbord['border_details']['B'] = $celladj['border_details']['T']; + $this->setBorder($celladj['border'] , _BORDER_TOP); + } + } + + + + // Style set on cell vs. table + else if ($celladj['border_details']['T']['dom'] > $cbord['border_details']['B']['dom']) { + if ($ccolsp < 2) { // don't overwrite this cell if it spans + $cbord['border_details']['B'] = $celladj['border_details']['T']; + $this->setBorder($celladj['border'] , _BORDER_TOP); + } + } + // Style set on cell vs. table - OR - LEFT/TOP (cell) in preference to BOTTOM/RIGHT + else { + if (!isset($cells[($i+$crowsp)][$j+$cspi]['colspan']) || (isset($cells[($i+$crowsp)][$j+$cspi]['colspan']) && $cells[($i+$crowsp)][$j+$cspi]['colspan']<2)) { // don't overwrite bordering cells that span + $celladj['border_details']['T'] = $cbord['border_details']['B']; + $this->setBorder($cbord['border'] , _BORDER_BOTTOM ); + } + } + } + else if ($celladj) { + if (!isset($cells[($i+$crowsp)][$j+$cspi]['colspan']) || (isset($cells[($i+$crowsp)][$j+$cspi]['colspan']) && $cells[($i+$crowsp)][$j+$cspi]['colspan']<2)) { // don't overwrite bordering cells that span + $celladj['border_details']['T'] = $cbord['border_details']['B']; + } + } + if ($celladj && $this->packTableData) { + $celladj['borderbin'] = $this->_packCellBorder($celladj); + unset($celladj['border']); + unset($celladj['border_details']); + } + if ($this->cacheTables) { + $this->_cacheUpdateBorder($celladj, $fh, $table['cells'][$i+$crowsp][$j+$cspi]); + } + unset($celladj); + } + } + + if ($j < ($numcols-1) || ($j+$ccolsp) < $numcols ) { // Right-Left + for ($cspi = 0; $cspi<$crowsp; $cspi++) { + // already defined Left for adjacent cell to R + if (isset($cells[($i+$cspi)][$j+$ccolsp])) { + if ($this->packTableData) { + if ($this->cacheTables) { + $adjc = $this->_uncacheCell($table['cells'][$i+$cspi][$j+$ccolsp], '', $fh); + } + else { $adjc = $cells[($i+$cspi)][$j+$ccolsp]; } + $celladj = $this->_unpackCellBorder($adjc['borderbin']); + } + else { $celladj =& $cells[$i+$cspi][$j+$ccolsp]; } + } + else { $celladj = false; } + if ($celladj && $celladj['border_details']['L']['s'] == 1) { + $csadj = $celladj['border_details']['L']['w']; + $csthis = $cbord['border_details']['R']['w']; + // Hidden + if ($cbord['border_details']['R']['style']=='hidden') { + $celladj['border_details']['L'] = $cbord['border_details']['R']; + $this->setBorder($celladj['border'] , _BORDER_LEFT, false); + $this->setBorder($cbord['border'] , _BORDER_RIGHT , false); + } + else if ($celladj['border_details']['L']['style']=='hidden') { + $cbord['border_details']['R'] = $celladj['border_details']['L']; + $this->setBorder($cbord['border'] , _BORDER_RIGHT , false); + $this->setBorder($celladj['border'] , _BORDER_LEFT, false); + } + // Width + else if ($csthis > $csadj) { + if (!isset($cells[($i+$cspi)][$j+$ccolsp]['rowspan']) || (isset($cells[($i+$cspi)][$j+$ccolsp]['rowspan']) && $cells[($i+$cspi)][$j+$ccolsp]['rowspan']<2)) { // don't overwrite bordering cells that span + $celladj['border_details']['L'] = $cbord['border_details']['R']; + $this->setBorder($cbord['border'] , _BORDER_RIGHT); + $this->setBorder($celladj['border'] , _BORDER_LEFT, false); + } + } + else if ($csadj > $csthis) { + if ($crowsp < 2) { // don't overwrite this cell if it spans + $cbord['border_details']['R'] = $celladj['border_details']['L']; + $this->setBorder($cbord['border'] , _BORDER_RIGHT, false); + $this->setBorder($celladj['border'] , _BORDER_LEFT); + } + } + + // double>solid>dashed>dotted... + else if (array_search($cbord['border_details']['R']['style'],$this->borderstyles) > array_search($celladj['border_details']['L']['style'],$this->borderstyles)) { + if (!isset($cells[($i+$cspi)][$j+$ccolsp]['rowspan']) || (isset($cells[($i+$cspi)][$j+$ccolsp]['rowspan']) && $cells[($i+$cspi)][$j+$ccolsp]['rowspan']<2)) { // don't overwrite bordering cells that span + $celladj['border_details']['L'] = $cbord['border_details']['R']; + $this->setBorder($celladj['border'] , _BORDER_LEFT, false); + $this->setBorder($cbord['border'] , _BORDER_RIGHT); + } + } + else if (array_search($celladj['border_details']['L']['style'],$this->borderstyles) > array_search($cbord['border_details']['R']['style'],$this->borderstyles)) { + if ($crowsp < 2) { // don't overwrite this cell if it spans + $cbord['border_details']['R'] = $celladj['border_details']['L']; + $this->setBorder($cbord['border'] , _BORDER_RIGHT , false); + $this->setBorder($celladj['border'] , _BORDER_LEFT); + } + } + + + // Style set on cell vs. table + else if ($celladj['border_details']['L']['dom'] > $cbord['border_details']['R']['dom']) { + if ($crowsp < 2) { // don't overwrite this cell if it spans + $cbord['border_details']['R'] = $celladj['border_details']['L']; + $this->setBorder($celladj['border'] , _BORDER_LEFT); + } + } + // Style set on cell vs. table - OR - LEFT/TOP (cell) in preference to BOTTOM/RIGHT + else { + if (!isset($cells[($i+$cspi)][$j+$ccolsp]['rowspan']) || (isset($cells[($i+$cspi)][$j+$ccolsp]['rowspan']) && $cells[($i+$cspi)][$j+$ccolsp]['rowspan']<2)) { // don't overwrite bordering cells that span + $celladj['border_details']['L'] = $cbord['border_details']['R']; + $this->setBorder($cbord['border'] , _BORDER_RIGHT); + } + } + } + else if ($celladj) { + // if right-cell border is not set + if (!isset($cells[($i+$cspi)][$j+$ccolsp]['rowspan']) || (isset($cells[($i+$cspi)][$j+$ccolsp]['rowspan']) && $cells[($i+$cspi)][$j+$ccolsp]['rowspan']<2)) { // don't overwrite bordering cells that span + $celladj['border_details']['L'] = $cbord['border_details']['R']; + } + } + if ($celladj && $this->packTableData) { + $celladj['borderbin'] = $this->_packCellBorder($celladj); + unset($celladj['border']); + unset($celladj['border_details']); + } + if ($this->cacheTables) { + $this->_cacheUpdateBorder($celladj, $fh, $table['cells'][$i+$cspi][$j+$ccolsp]); + } + unset($celladj); + } + } + } + + + // Set maximum cell border width meeting at LRTB edges of cell - used for extended cell border + // ['border_details']['mbw']['LT'] = meeting border width - Left border - Top end + if (!$table['borders_separate']) { + $cbord['border_details']['mbw']['BL'] = max($cbord['border_details']['mbw']['BL'], $cbord['border_details']['L']['w']); + $cbord['border_details']['mbw']['BR'] = max($cbord['border_details']['mbw']['BR'], $cbord['border_details']['R']['w']); + $cbord['border_details']['mbw']['RT'] = max($cbord['border_details']['mbw']['RT'], $cbord['border_details']['T']['w']); + $cbord['border_details']['mbw']['RB'] = max($cbord['border_details']['mbw']['RB'], $cbord['border_details']['B']['w']); + $cbord['border_details']['mbw']['TL'] = max($cbord['border_details']['mbw']['TL'], $cbord['border_details']['L']['w']); + $cbord['border_details']['mbw']['TR'] = max($cbord['border_details']['mbw']['TR'], $cbord['border_details']['R']['w']); + $cbord['border_details']['mbw']['LT'] = max($cbord['border_details']['mbw']['LT'], $cbord['border_details']['T']['w']); + $cbord['border_details']['mbw']['LB'] = max($cbord['border_details']['mbw']['LB'], $cbord['border_details']['B']['w']); + if (($i+$crowsp) < $numrows && isset($cells[$i+$crowsp][$j])) { // Has Bottom adjoining cell + if ($this->packTableData) { + if ($this->cacheTables) { + $adjc = $this->_uncacheCell($table['cells'][$i+$crowsp][$j], '', $fh); + } + else { $adjc = $cells[$i+$crowsp][$j]; } + $celladj = $this->_unpackCellBorder($adjc['borderbin']); + } + else { $celladj =& $cells[$i+$crowsp][$j]; } + $cbord['border_details']['mbw']['BL'] = max($cbord['border_details']['mbw']['BL'], $celladj['border_details']['L']['w'], $celladj['border_details']['mbw']['TL']); + $cbord['border_details']['mbw']['BR'] = max($cbord['border_details']['mbw']['BR'], $celladj['border_details']['R']['w'], $celladj['border_details']['mbw']['TR']); + $cbord['border_details']['mbw']['LB'] = max($cbord['border_details']['mbw']['LB'], $celladj['border_details']['mbw']['LT']); + $cbord['border_details']['mbw']['RB'] = max($cbord['border_details']['mbw']['RB'], $celladj['border_details']['mbw']['RT']); + unset($celladj); + } + if (($j+$ccolsp) < $numcols && isset($cells[$i][$j+$ccolsp])) { // Has Right adjoining cell + if ($this->packTableData) { + if ($this->cacheTables) { + $adjc = $this->_uncacheCell($table['cells'][$i][$j+$ccolsp], '', $fh); + } + else { $adjc = $cells[$i][$j+$ccolsp]; } + $celladj = $this->_unpackCellBorder($adjc['borderbin']); + } + else { $celladj =& $cells[$i][$j+$ccolsp]; } + $cbord['border_details']['mbw']['RT'] = max($cbord['border_details']['mbw']['RT'], $celladj['border_details']['T']['w'], $celladj['border_details']['mbw']['LT']); + $cbord['border_details']['mbw']['RB'] = max($cbord['border_details']['mbw']['RB'], $celladj['border_details']['B']['w'], $celladj['border_details']['mbw']['LB']); + $cbord['border_details']['mbw']['TR'] = max($cbord['border_details']['mbw']['TR'], $celladj['border_details']['mbw']['TL']); + $cbord['border_details']['mbw']['BR'] = max($cbord['border_details']['mbw']['BR'], $celladj['border_details']['mbw']['BL']); + unset($celladj); + } + + if ($i > 0 && isset($cells[$i-1][$j]) && (($this->packTableData && $cells[$i-1][$j]['borderbin']) || $cells[$i-1][$j]['border'])) { // Has Top adjoining cell + if ($this->packTableData) { + if ($this->cacheTables) { + $adjc = $this->_uncacheCell($table['cells'][$i-1][$j], '', $fh); + } + else { $adjc = $cells[$i-1][$j]; } + $celladj = $this->_unpackCellBorder($adjc['borderbin']); + } + else { $celladj =& $cells[$i-1][$j]; } + $cbord['border_details']['mbw']['TL'] = max($cbord['border_details']['mbw']['TL'], $celladj['border_details']['L']['w'], $celladj['border_details']['mbw']['BL']); + $cbord['border_details']['mbw']['TR'] = max($cbord['border_details']['mbw']['TR'], $celladj['border_details']['R']['w'], $celladj['border_details']['mbw']['BR']); + $cbord['border_details']['mbw']['LT'] = max($cbord['border_details']['mbw']['LT'], $celladj['border_details']['mbw']['LB']); + $cbord['border_details']['mbw']['RT'] = max($cbord['border_details']['mbw']['RT'], $celladj['border_details']['mbw']['RB']); + + if ($celladj['border_details']['mbw']['BL']) { + $celladj['border_details']['mbw']['BL'] = max($cbord['border_details']['mbw']['TL'], $celladj['border_details']['mbw']['BL']); + } + if ($celladj['border_details']['mbw']['BR'] ) { + $celladj['border_details']['mbw']['BR'] = max($celladj['border_details']['mbw']['BR'], $cbord['border_details']['mbw']['TR']); + } + if ($this->packTableData) { $cells[$i-1][$j]['borderbin'] = $this->_packCellBorder($celladj); } + unset($celladj); + } + if ($j > 0 && isset($cells[$i][$j-1]) && (($this->packTableData && $cells[$i][$j-1]['borderbin']) || $cells[$i][$j-1]['border'])) { // Has Left adjoining cell + if ($this->packTableData) { + if ($this->cacheTables) { + $adjc = $this->_uncacheCell($table['cells'][$i][$j-1], '', $fh); + } + else { $adjc = $cells[$i][$j-1]; } + $celladj = $this->_unpackCellBorder($adjc['borderbin']); + } + else { $celladj =& $cells[$i][$j-1]; } + $cbord['border_details']['mbw']['LT'] = max($cbord['border_details']['mbw']['LT'], $celladj['border_details']['T']['w'], $celladj['border_details']['mbw']['RT']); + $cbord['border_details']['mbw']['LB'] = max($cbord['border_details']['mbw']['LB'], $celladj['border_details']['B']['w'], $celladj['border_details']['mbw']['RB']); + $cbord['border_details']['mbw']['BL'] = max($cbord['border_details']['mbw']['BL'], $celladj['border_details']['mbw']['BR']); + $cbord['border_details']['mbw']['TL'] = max($cbord['border_details']['mbw']['TL'], $celladj['border_details']['mbw']['TR']); + + if ($celladj['border_details']['mbw']['RT']) { + $celladj['border_details']['mbw']['RT'] = max($celladj['border_details']['mbw']['RT'], $cbord['border_details']['mbw']['LT']); + } + if ($celladj['border_details']['mbw']['RB']) { + $celladj['border_details']['mbw']['RB'] = max($celladj['border_details']['mbw']['RB'], $cbord['border_details']['mbw']['LB']); + } + if ($this->packTableData) { $cells[$i][$j-1]['borderbin'] = $this->_packCellBorder($celladj); } + unset($celladj); + } + + + // Update maximum cell border width at LRTB edges of table - used for overall table width + if ($j == 0 && $cbord['border_details']['L']['w']) { + $table['max_cell_border_width']['L'] = max($table['max_cell_border_width']['L'],$cbord['border_details']['L']['w']); + } + if (($j == ($numcols-1) || ($j+$ccolsp) == $numcols ) && $cbord['border_details']['R']['w']) { + $table['max_cell_border_width']['R'] = max($table['max_cell_border_width']['R'],$cbord['border_details']['R']['w']); + } + if ($i == 0 && $cbord['border_details']['T']['w']) { + $table['max_cell_border_width']['T'] = max($table['max_cell_border_width']['T'],$cbord['border_details']['T']['w']); + } + if (($i == ($numrows-1) || ($i+$crowsp) == $numrows ) && $cbord['border_details']['B']['w']) { + $table['max_cell_border_width']['B'] = max($table['max_cell_border_width']['B'],$cbord['border_details']['B']['w']); + } + } +/*-- END TABLES-ADVANCED-BORDERS --*/ + + if ($this->packTableData) { $cell['borderbin'] = $this->_packCellBorder($cbord); } + + if ($this->cacheTables) { + $this->_cacheUpdateBorder($cell, $fh, $table['cells'][$i][$j]); + } + unset($cbord ); + unset($cell ); + } + } + } + if ($this->cacheTables) { fclose($fh); } + unset($cell ); +} +// END FIX BORDERS ************************************************************************************ + + +function _reverseTableDir(&$table) { + if ($this->cacheTables) { $fh = fopen($table['cache'], "r+b"); } + $cells = &$table['cells']; + $numcols = $table['nc']; + $numrows = $table['nr']; + for( $i = 0 ; $i < $numrows ; $i++ ) { //Rows + $row = array(); + for( $j = ($numcols-1) ; $j >= 0 ; $j-- ) { //Columns + if (isset($cells[$i][$j]) && $cells[$i][$j]) { + if ($this->cacheTables) { + $cell = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + } + else + $cell = &$cells[$i][$j]; + $col = $numcols - $j - 1; + if (isset($cell['colspan']) && $cell['colspan'] > 1) { $col -= ($cell['colspan']-1); } + // Nested content + for ($n=0; $n < count($cell['textbuffer']); $n++) { + $t = $cell['textbuffer'][$n][0]; + if (substr($t,0,19) == "\xbb\xa4\xactype=nestedtable") { + $objattr = $this->_getObjAttr($t); + $objattr['col'] = $col; + $cell['textbuffer'][$n][0] = "\xbb\xa4\xactype=nestedtable,objattr=".serialize($objattr)."\xbb\xa4\xac"; + $this->table[($this->tableLevel+1)][$objattr['nestedcontent']]['nestedpos'][1] = $col; + if ($this->cacheTables) { + $this->_cacheUpdateTxB($cell, $fh, $table['cells'][$i][$j]); + } + } + } + $row[$col] = $cells[$i][$j]; + unset($cell); + } + } + for($f=0; $f < $numcols; $f++) { + if (!isset($row[$f])) { $row[$f] = 0; } + } + $table['cells'][$i] = $row; + } + if ($this->cacheTables) { fclose($fh); } +} + + +function _tableWrite(&$table, $split=false, $startrow=0, $startcol=0, $splitpg=0, $rety = 0){ + $level = $table['level']; + $levelid = $table['levelid']; + + $cells = &$table['cells']; + $numcols = $table['nc']; + $numrows = $table['nr']; + + if ($this->ColActive && $level==1) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + + if (!$split || ($startrow==0 && $splitpg==0) || $startrow>0){ + // TABLE TOP MARGIN + if ($table['margin']['T']) { + if (!$this->table_rotate && $level==1) { + $this->DivLn($table['margin']['T'],$this->blklvl,true,1); // collapsible + } + else { + $this->y += ($table['margin']['T']); + } + } + // Advance down page by half width of top border + if ($table['borders_separate']) { + if ($startrow>0 && (!isset($table['is_thead']) || count($table['is_thead'])==0)) + $adv = $table['border_spacing_V']/2; + else + $adv = $table['padding']['T'] + $table['border_details']['T']['w'] + $table['border_spacing_V']/2; + } + else { + $adv = $table['max_cell_border_width']['T']/2; + } + if (!$this->table_rotate && $level==1) { $this->DivLn($adv); } + else { $this->y += $adv; } + } + + if ($level==1) { + $this->x = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin'] + $this->blk[$this->blklvl]['padding_left'] + $this->blk[$this->blklvl]['border_left']['w']; + $x0 = $this->x; + $y0 = $this->y; + $right = $x0 + $this->blk[$this->blklvl]['inner_width']; + $outerfilled = $this->y; // Keep track of how far down the outer DIV bgcolor is painted (NB rowspans) + $this->outerfilled = $this->y; + $this->colsums = array(); + } + else { + $x0 = $this->x; + $y0 = $this->y; + $right = $x0 + $table['w']; + } + + if ($this->table_rotate) { + $temppgwidth = $this->tbrot_maxw; + $this->PageBreakTrigger = $pagetrigger = $y0 + ($this->blk[$this->blklvl]['inner_width']); + if ($level==1) { + $this->tbrot_y0 = $this->y - $adv - $table['margin']['T'] ; + $this->tbrot_x0 = $this->x; + $this->tbrot_w = $table['w']; + if ($table['borders_separate']) { $this->tbrot_h = $table['margin']['T'] + $table['padding']['T'] + $table['border_details']['T']['w'] + $table['border_spacing_V']/2; } + else { $this->tbrot_h = $table['margin']['T'] + $table['padding']['T'] + $table['max_cell_border_width']['T']; } + } + } + else { + $this->PageBreakTrigger = $pagetrigger = ($this->h - $this->bMargin); + if ($level==1) { + $temppgwidth = $this->blk[$this->blklvl]['inner_width']; + if (isset($table['a']) and ($table['w'] < $this->blk[$this->blklvl]['inner_width'])) { + if ($table['a']=='C') { $x0 += ((($right-$x0) - $table['w'])/2); } + else if ($table['a']=='R') { $x0 = $right - $table['w']; } + } + } + else { + $temppgwidth = $table['w']; + } + } + if(!isset($table['overflow'])) { $table['overflow'] = null; } + if ($table['overflow']=='hidden' && $level==1 && !$this->table_rotate && !$this->ColActive) { + //Bounding rectangle to clip + $this->tableClipPath = sprintf('q %.3F %.3F %.3F %.3F re W n',$x0*_MPDFK,$this->h*_MPDFK,$this->blk[$this->blklvl]['inner_width']*_MPDFK,-$this->h*_MPDFK); + $this->_out($this->tableClipPath); + } + else { $this->tableClipPath = ''; } + + + if ($table['borders_separate']) { $indent = $table['margin']['L'] + $table['border_details']['L']['w'] + $table['padding']['L'] + $table['border_spacing_H']/2; } + else { $indent = $table['margin']['L'] + $table['max_cell_border_width']['L']/2; } + $x0 += $indent; + + $returny = 0; + $lastCol = 0; + $tableheader = array(); + $tablefooter = array(); + $tableheaderrowheight = 0; + $tablefooterrowheight = 0; + $footery = 0; + + // mPD 3.0 Set the Page & Column where table starts + if (($this->mirrorMargins) && (($this->page)%2==0)) { // EVEN + $tablestartpage = 'EVEN'; + } + else if (($this->mirrorMargins) && (($this->page)%2==1)) { // ODD + $tablestartpage = 'ODD'; + } + else { $tablestartpage = ''; } + if ($this->ColActive) { $tablestartcolumn = $this->CurrCol; } + else { $tablestartcolumn = ''; } + + if ($this->cacheTables) { $fh = fopen($table['cache'], "r+b"); } + else { $fh = null; } + + $y = $h = 0; + for( $i = 0; $i < $numrows ; $i++ ) { //Rows + if ($this->progressBar) { $this->UpdateProgressBar(7,intval(30 + ($i*40/$numrows)),' '); } // *PROGRESS-BAR* + if (isset($table['is_tfoot'][$i]) && $table['is_tfoot'][$i] && $level==1) { + $tablefooterrowheight += $table['hr'][$i]; + $tablefooter[$i][0]['trbackground-images'] = $table['trbackground-images'][$i]; + $tablefooter[$i][0]['trgradients'] = $table['trgradients'][$i]; + $tablefooter[$i][0]['trbgcolor'] = $table['bgcolor'][$i]; + for( $j = $startcol ; $j < $numcols ; $j++ ) { //Columns + if (isset($cells[$i][$j]) && $cells[$i][$j]) { + if ($this->cacheTables) { + $cell = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + } + else + $cell = &$cells[$i][$j]; + if ($split) { + if ($table['colPg'][$j] != $splitpg) { continue; } + list($x,$w) = $this->_splitTableGetWidth($table, $i, $j, $fh); + $js = $j - $startcol; + } + else { + list($x,$w) = $this->_tableGetWidth($table, $i, $j, $fh); + $js = $j; + } + + list($y,$h) = $this->_tableGetHeight($table, $i, $j, $fh); + $x += $x0; + $y += $y0; + //Get info of tfoot ==>> table footer + $tablefooter[$i][$js]['x'] = $x; + $tablefooter[$i][$js]['y'] = $y; + $tablefooter[$i][$js]['h'] = $h; + $tablefooter[$i][$js]['w'] = $w; + if (isset($cell['textbuffer'])) { $tablefooter[$i][$js]['textbuffer'] = $cell['textbuffer']; } + else { $tablefooter[$i][$js]['textbuffer'] = ''; } + $tablefooter[$i][$js]['a'] = $cell['a']; + $tablefooter[$i][$js]['R'] = $cell['R']; + $tablefooter[$i][$js]['va'] = $cell['va']; + $tablefooter[$i][$js]['mih'] = $cell['mih']; + $tablefooter[$i][$js]['gradient'] = $cell['gradient']; // *BACKGROUNDS* + $tablefooter[$i][$js]['background-image'] = $cell['background-image']; // *BACKGROUNDS* + //CELL FILL BGCOLOR + if (!$this->simpleTables){ + if ($this->packTableData) { + $c = $this->_unpackCellBorder($cell['borderbin']); + $tablefooter[$i][$js]['border'] = $c['border']; + $tablefooter[$i][$js]['border_details'] = $c['border_details']; + } + else { + $tablefooter[$i][$js]['border'] = $cell['border']; + $tablefooter[$i][$js]['border_details'] = $cell['border_details']; + } + } + else if ($this->simpleTables){ + $tablefooter[$i][$js]['border'] = $table['simple']['border']; + $tablefooter[$i][$js]['border_details'] = $table['simple']['border_details']; + } + $tablefooter[$i][$js]['bgcolor'] = $cell['bgcolor']; + $tablefooter[$i][$js]['padding'] = $cell['padding']; + $tablefooter[$i][$js]['rowspan'] = $cell['rowspan']; + $tablefooter[$i][$js]['colspan'] = $cell['colspan']; + } + } + } + } + + if ($level==1) { $this->_out('___TABLE___BACKGROUNDS'.date('jY')); } + $tableheaderadj = 0; + $tablefooteradj = 0; + + $tablestartpageno = $this->page; + + //Draw Table Contents and Borders + for( $i = 0; $i < $numrows ; $i++ ) { //Rows + if ($split && $startrow > 0) { + $thnr = (isset($table['is_thead']) ? count($table['is_thead']) : 0); + if ($i >= $thnr && $i < $startrow) { continue; } + if ($i == $startrow){ $returny = $rety - $tableheaderrowheight; } + } + + // Get Maximum row/cell height in row - including rowspan>1 + 1 overlapping + $maxrowheight = $this->_tableGetMaxRowHeight($table, $i, $fh); + + $skippage = false; + $newpagestarted = false; + for( $j = $startcol ; $j < $numcols ; $j++ ) { //Columns + if ($split) { + if ($table['colPg'][$j] > $splitpg) { break; } + $lastCol = $j; + } + if (isset($cells[$i][$j]) && $cells[$i][$j]) { + if ($this->cacheTables) { + $cell = $this->_uncacheCell($table['cells'][$i][$j], '', $fh); + } + else + $cell = &$cells[$i][$j]; + if ($split) { + $lastCol = $j + (isset($cell['colspan']) ? ($cell['colspan']-1) : 0) ; + list($x,$w) = $this->_splitTableGetWidth($table, $i, $j, $fh); + } + else { list($x,$w) = $this->_tableGetWidth($table, $i, $j, $fh); } + + list($y,$h) = $this->_tableGetHeight($table, $i, $j, $fh); + $x += $x0; + $y += $y0; + $y -= $returny; + + if ($table['borders_separate']) { + if (!empty($tablefooter) || $i == ($numrows-1) || (isset($cell['rowspan']) && ($i+$cell['rowspan']) == $numrows) || (!isset($cell['rowspan']) && ($i+1) == $numrows) ) { + $extra = $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V']/2; + //$extra = $table['margin']['B'] + $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V']/2; + } + else { + $extra = $table['border_spacing_V']/2; + } + } + else { $extra = $table['max_cell_border_width']['B']/2; } + + if ($j==$startcol && ((($y + $maxrowheight + $extra ) > ($pagetrigger+0.001)) || (($this->keepColumns || !$this->ColActive) && !empty($tablefooter) && ($y + $maxrowheight + $tablefooterrowheight + $extra) > $pagetrigger) && ($this->tableLevel==1 && $i < ($numrows - $table['headernrows']))) && ($y0 >0 || $x0 > 0) && !$this->InFooter && $this->autoPageBreak ) { + + if (!$skippage) { + $finalSpread = true; + $firstSpread = true; + if ($split) { + for($t=$startcol; $t<$numcols; $t++) { + // Are there more columns to print on a next page? + if ($table['colPg'][$t] > $splitpg) { + $finalSpread = false; + break; + } + } + if ($startcol>0) { $firstSpread = false; } + } + + if (($this->keepColumns || !$this->ColActive) && !empty($tablefooter) && $i > 0 ) { + $this->y = $y; + $ya = $this->y; + $this->TableHeaderFooter($tablefooter,$tablestartpage,$tablestartcolumn,'F',$level, $firstSpread, $finalSpread); + if ($this->table_rotate) { + $this->tbrot_h += $this->y - $ya ; + } + $tablefooteradj = $this->y - $ya ; + } + $y -= $y0; + $returny += $y; + + $oldcolumn = $this->CurrCol; + if ($this->AcceptPageBreak()) { + $newpagestarted = true; + $this->y = $y + $y0; + + // Move down to account for border-spacing or + // extra half border width in case page breaks in middle + if($i>0 && !$this->table_rotate && $level==1 && !$this->ColActive) { + if ($table['borders_separate']) { + $adv = $table['border_spacing_V']/2; + // If table footer + if (($this->keepColumns || !$this->ColActive) && !empty($tablefooter) && $i > 0 ) { + $adv += ($table['padding']['B'] + $table['border_details']['B']['w']); + } + } + else { + $maxbwtop = 0; + $maxbwbottom = 0; + if (!$this->simpleTables){ + if (!empty($tablefooter)) { $maxbwbottom = $table['max_cell_border_width']['B']; } + else { + $brow = $i-1; + for( $ctj = 0 ; $ctj < $numcols ; $ctj++ ) { + if (isset($cells[$brow][$ctj]) && $cells[$brow][$ctj]) { + if ($this->cacheTables) { + $cadj = $this->_uncacheCell($table['cells'][$brow][$ctj], '', $fh); + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($cadj['borderbin']); + } + else if ($this->packTableData) { + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($cells[$brow][$ctj]['borderbin']); + } + else { + $bb = $cells[$brow][$ctj]['border_details']['B']['w']; + } + $maxbwbottom = max($maxbwbottom , $bb); + } + } + } + if (!empty($tableheader)) { $maxbwtop = $table['max_cell_border_width']['T']; } + else { + $trow = $i-1; + for( $ctj = 0 ; $ctj < $numcols ; $ctj++ ) { + if (isset($cells[$trow][$ctj]) && $cells[$trow][$ctj]) { + if ($this->cacheTables) { + $cadj = $this->_uncacheCell($table['cells'][$trow][$ctj], '', $fh); + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($cadj['borderbin']); + } + else if ($this->packTableData) { + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($cells[$trow][$ctj]['borderbin']); + } + else { + $bt = $cells[$trow][$ctj]['border_details']['T']['w']; + } + $maxbwtop = max($maxbwtop , $bt); + } + } + } + } + else if ($this->simpleTables){ + $maxbwtop = $table['simple']['border_details']['T']['w']; + $maxbwbottom = $table['simple']['border_details']['B']['w']; + } + $adv = $maxbwbottom /2; + } + $this->y += $adv; + } + + // Rotated table split over pages - needs this->y for borders/backgrounds + if($i>0 && $this->table_rotate && $level==1) { + // $this->y = $y0 + $this->tbrot_w; + } + + if ($this->tableClipPath ) { $this->_out("Q"); } + + $bx = $x0; + $by = $y0; + + if ($table['borders_separate']) { + $bx -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['border_spacing_H']/2); + if ($tablestartpageno != $this->page) { // IF already broken across a previous pagebreak + $by += $table['max_cell_border_width']['T']/2; + if (empty($tableheader)) { $by -= ($table['border_spacing_V']/2); } + } + else { + $by -= ($table['padding']['T'] + $table['border_details']['T']['w'] + $table['border_spacing_V']/2); + } + } + + else if ($tablestartpageno != $this->page && !empty($tableheader)) { $by += $maxbwtop /2; } + + $by -= $tableheaderadj; + $bh = $this->y - $by + $tablefooteradj; + if (!$table['borders_separate']) { $bh -= $adv ; } + if ($split) { + $bw = 0; + for($t=$startcol; $t<$numcols; $t++) { + if ($table['colPg'][$t] == $splitpg) { $bw += $table['wc'][$t]; } + if ($table['colPg'][$t] > $splitpg) { break; } + } + if ($table['borders_separate']) { + if ($firstSpread) { + $bw += $table['padding']['L'] + $table['border_details']['L']['w'] + $table['border_spacing_H']; + } + else { + $bx += ($table['padding']['L'] + $table['border_details']['L']['w']); + $bw += $table['border_spacing_H']; + } + if ($finalSpread) { + $bw += $table['padding']['R'] + $table['border_details']['R']['w']/2 + $table['border_spacing_H']; + } + } + } + else { + $bw = $table['w'] - ($table['max_cell_border_width']['L']/2) - ($table['max_cell_border_width']['R']/2) - $table['margin']['L'] - $table['margin']['R']; + } + + // mPDF 5.4.16 + if ($this->splitTableBorderWidth && ($this->keepColumns || !$this->ColActive) && empty($tablefooter) && $i > 0 && $table['border_details']['B']['w']) { + $prevDrawColor = $this->DrawColor; + $lw = $this->LineWidth; + $this->SetLineWidth($this->splitTableBorderWidth); + $this->SetDColor($table['border_details']['B']['c']); + $this->SetLineJoin(0); + $this->SetLineCap(0); + $blx = $bx; + $blw = $bw; + if (!$table['borders_separate']) { + $blx -= ($table['max_cell_border_width']['L']/2); + $blw += ($table['max_cell_border_width']['L']/2 + $table['max_cell_border_width']['R']/2); + } + $this->Line($blx,$this->y+($this->splitTableBorderWidth/2),$blx+$blw,$this->y+($this->splitTableBorderWidth/2)); + $this->DrawColor = $prevDrawColor; + $this->_out($this->DrawColor); + $this->SetLineWidth($lw); + $this->SetLineJoin(2); + $this->SetLineCap(2); + } + + if (!$this->ColActive && ($i > 0 || $j > 0)) { + if (isset($table['bgcolor'][-1])) { + $color = $this->ConvertColor($table['bgcolor'][-1]); + if ($color) { + if (!$table['borders_separate']) { $bh -= $table['max_cell_border_width']['B']/2; } + $this->tableBackgrounds[$level*9][] = array('gradient'=>false, 'x'=>$bx, 'y'=>$by, 'w'=>$bw, 'h'=>$bh, 'col'=>$color); + } + } + +/*-- BACKGROUNDS --*/ + if (isset($table['gradient'])) { + $g = $this->grad->parseBackgroundGradient($table['gradient']); + if ($g) { + $this->tableBackgrounds[$level*9+1][] = array('gradient'=>true, 'x'=>$bx, 'y'=>$by, 'w'=>$bw, 'h'=>$bh, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + + if (isset($table['background-image'])) { + if ($table['background-image']['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $table['background-image']['gradient'] )) { + $g = $this->grad->parseMozGradient( $table['background-image']['gradient'] ); + if ($g) { + $this->tableBackgrounds[$level*9+1][] = array('gradient'=>true, 'x'=>$bx, 'y'=>$by, 'w'=>$bw, 'h'=>$bh, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + else { + $image_id = $table['background-image']['image_id']; + $orig_w = $table['background-image']['orig_w']; + $orig_h = $table['background-image']['orig_h']; + $x_pos = $table['background-image']['x_pos']; + $y_pos = $table['background-image']['y_pos']; + $x_repeat = $table['background-image']['x_repeat']; + $y_repeat = $table['background-image']['y_repeat']; + $resize = $table['background-image']['resize']; + $opacity = $table['background-image']['opacity']; + $itype = $table['background-image']['itype']; + $this->tableBackgrounds[$level*9+2][] = array('x'=>$bx, 'y'=>$by, 'w'=>$bw, 'h'=>$bh, 'image_id'=>$image_id, 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$x_pos, 'y_pos'=>$y_pos, 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'clippath'=>'', 'resize'=>$resize, 'opacity'=>$opacity, 'itype'=>$itype); + } + } +/*-- END BACKGROUNDS --*/ + } + + // $this->AcceptPageBreak() has moved tablebuffer to $this->pages content + if ($this->tableBackgrounds) { + $s = $this->PrintTableBackgrounds(); + if ($this->bufferoutput) { + $this->headerbuffer = preg_replace('/(___TABLE___BACKGROUNDS'.date('jY').')/', '\\1'."\n".$s."\n", $this->headerbuffer); + $this->headerbuffer = preg_replace('/(___TABLE___BACKGROUNDS'.date('jY').')/', " ", $this->headerbuffer ); + } + else { + $this->pages[$this->page] = preg_replace('/(___TABLE___BACKGROUNDS'.date('jY').')/', '\\1'."\n".$s."\n", $this->pages[$this->page]); + $this->pages[$this->page] = preg_replace('/(___TABLE___BACKGROUNDS'.date('jY').')/', " ", $this->pages[$this->page]); + } + $this->tableBackgrounds = array(); + } + + if ($split) { + if ($i == 0 && $j == 0) { $y0 = -1; } + else if ($finalSpread) { + $splitpg = 0; + $startcol = 0; + $startrow = $i; + } + else { + $splitpg++; + $startcol = $t; + $returny -= $y; + } + return array(false, $startrow, $startcol, $splitpg, $returny, $y0); + } + + $this->AddPage($this->CurOrientation); + + $this->_out('___TABLE___BACKGROUNDS'.date('jY')); + + + if ($this->tableClipPath ) { $this->_out($this->tableClipPath); } + + // Added to correct for OddEven Margins + $x= $x + $this->MarginCorrection; + $x0= $x0 + $this->MarginCorrection; + + // mPDF 5.4.16 + if ($this->splitTableBorderWidth && ($this->keepColumns || !$this->ColActive) && empty($tableheader) && $i > 0 && $table['border_details']['T']['w'] ) { + $prevDrawColor = $this->DrawColor; + $lw = $this->LineWidth; + $this->SetLineWidth($this->splitTableBorderWidth); + $this->SetDColor($table['border_details']['T']['c']); + $this->SetLineJoin(0); + $this->SetLineCap(0); + $blx += $this->MarginCorrection; + $this->Line($blx,$this->y-($this->splitTableBorderWidth/2),$blx+$blw,$this->y-($this->splitTableBorderWidth/2)); + $this->DrawColor = $prevDrawColor; + $this->_out($this->DrawColor); + $this->SetLineWidth($lw); + $this->SetLineJoin(2); + $this->SetLineCap(2); + } + + // Move down to account for half of top border-spacing or + // extra half border width in case page was broken in middle + if($i>0 && !$this->table_rotate && $level==1 && $table['headernrows']==0) { + if ($table['borders_separate']) { $adv = $table['border_spacing_V']/2; } + else { + $maxbwtop = 0; + for( $ctj = 0 ; $ctj < $numcols ; $ctj++ ) { + if (isset($cells[$i][$ctj]) && $cells[$i][$ctj]) { + if (!$this->simpleTables){ + if ($this->cacheTables) { + $celltj = $this->_uncacheCell($table['cells'][$i][$ctj], '', $fh); + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($celltj['borderbin']); + } + else if ($this->packTableData) { + list($bt,$br,$bb,$bl) = $this->_getBorderWidths($cells[$i][$ctj]['borderbin']); + } + else { + $bt = $cells[$i][$ctj]['border_details']['T']['w']; + } + $maxbwtop = max($maxbwtop, $bt); + } + else if ($this->simpleTables){ + $maxbwtop = max($maxbwtop, $table['simple']['border_details']['T']['w']); + } + } + } + $adv = $maxbwtop /2; + } + $this->y += $adv; + } + + + if ($this->table_rotate) { + $this->tbrot_x0 = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin'] + $this->blk[$this->blklvl]['padding_left'] + $this->blk[$this->blklvl]['border_left']['w']; + if ($table['borders_separate']) { $this->tbrot_h = $table['margin']['T'] + $table['padding']['T'] + $table['border_details']['T']['w'] + $table['border_spacing_V']/2; } + else { $this->tbrot_h = $table['margin']['T'] + $table['max_cell_border_width']['T'] ; } + $this->tbrot_y0 = $this->y; + $pagetrigger = $y0 - $tableheaderadj + ($this->blk[$this->blklvl]['inner_width']); + } + else { + $pagetrigger = $this->PageBreakTrigger; + } + + if ($this->kwt_saved && $level==1) { + $this->kwt_moved = true; + } + + + // Disable Table header repeat if Keep Block together + if (!$this->keep_block_together && !empty($tableheader)) { + $ya = $this->y; + $this->TableHeaderFooter($tableheader,$tablestartpage,$tablestartcolumn,'H',$level); + if ($this->table_rotate) { + $this->tbrot_h = $this->y - $ya ; + } + $tableheaderadj = $this->y - $ya ; + } + + else if ($i==0 && !$this->keep_block_together && !$this->table_rotate && $level==1 && !$this->ColActive) { + // Advance down page + if ($table['borders_separate']) { $adv = $table['border_spacing_V']/2 + $table['border_details']['T']['w'] + $table['padding']['T']; } + else { $adv = $table['max_cell_border_width']['T'] /2 ; } + if ($adv) { + if ($this->table_rotate) { + $this->y += ($adv); + } + else { + $this->DivLn($adv,$this->blklvl,true); + } + } + } + + $outerfilled = 0; + $y = $y0 = $this->y; + } + +/*-- COLUMNS --*/ + // COLS + // COLUMN CHANGE + if ($this->CurrCol != $oldcolumn) { + // Added to correct for Columns + $x += $this->ChangeColumn * ($this->ColWidth+$this->ColGap); + $x0 += $this->ChangeColumn * ($this->ColWidth+$this->ColGap); + if ($this->CurrCol == 0) { // just added a page - possibly with tableheader + $y0 = $this->y; // this->y0 is global used by Columns - $y0 is internal to tablewrite + } + else { + $y0 = $this->y0; // this->y0 is global used by Columns - $y0 is internal to tablewrite + } + $y = $y0; + $outerfilled = 0; + if ($this->CurrCol != 0 && ($this->keepColumns && $this->ColActive) && !empty($tableheader) && $i > 0 ) { + $this->x = $x; + $this->y = $y; + $this->TableHeaderFooter($tableheader,$tablestartpage,$tablestartcolumn,'H',$level); + $y0 = $y=$this->y; + } + } +/*-- END COLUMNS --*/ + } + $skippage = true; + } + + $this->x = $x; + $this->y = $y; + + if ($this->kwt_saved && $level==1) { + $this->printkwtbuffer(); + $x0 = $x = $this->x; + $y0 = $y = $this->y; + $this->kwt_moved = false; + $this->kwt_saved = false; + } + + + // Set the Page & Column where table actually starts + if ($i==0 && $j==0 && $level==1) { + if (($this->mirrorMargins) && (($this->page)%2==0)) { // EVEN + $tablestartpage = 'EVEN'; + } + else if (($this->mirrorMargins) && (($this->page)%2==1)) { // ODD + $tablestartpage = 'ODD'; + } + else { $tablestartpage = ''; } + $tablestartpageno = $this->page; + if ($this->ColActive) { $tablestartcolumn = $this->CurrCol; } // *COLUMNS* + } + + + //ALIGN + $align = $cell['a']; + + +/*-- COLUMNS --*/ + // If outside columns, this is done in PaintDivBB + if ($this->ColActive) { + //OUTER FILL BGCOLOR of DIVS + if ($this->blklvl > 0 && ($j==0) && !$this->table_rotate && $level==1) { + $firstblockfill = $this->GetFirstBlockFill(); + if ($firstblockfill && $this->blklvl >= $firstblockfill) { + $divh = $maxrowheight; + // Last row + if ((!isset($cell['rowspan']) && $i == $numrows-1) || (isset($cell['rowspan']) && (($i == $numrows-1 && $cell['rowspan']<2) || ($cell['rowspan']>1 && ($i + $cell['rowspan']-1) == $numrows-1)))) { // mPDF 5.6.54 + if ($table['borders_separate']) { + $adv = $table['margin']['B'] + $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V']/2; + } + else { + $adv = $table['margin']['B'] + $table['max_cell_border_width']['B']/2; + } + $divh += $adv; //last row: fill bottom half of bottom border (y advanced at end) + } + + if (($this->y + $divh) > $outerfilled ) { // if not already painted by previous rowspan + $bak_x = $this->x; + $bak_y = $this->y; + if ($outerfilled > $this->y) { + $divh = ($this->y + $divh) - $outerfilled; + $this->y = $outerfilled; + } + + $this->DivLn($divh,-3,false); + $outerfilled = $this->y + $divh; + // Reset current block fill + $bcor = $this->blk[$this->blklvl]['bgcolorarray']; + if ($bcor ) $this->SetFColor($bcor); + $this->x = $bak_x; + $this->y = $bak_y; + } + } + } + } + + + //TABLE BACKGROUND FILL BGCOLOR - for cellSpacing + if ($this->ColActive) { + if ($table['borders_separate']) { + $fill = isset($table['bgcolor'][-1]) ? $table['bgcolor'][-1] : 0; + if ($fill) { + $color = $this->ConvertColor($fill); + if ($color) { + $xadj = ($table['border_spacing_H']/2); + $yadj = ($table['border_spacing_V']/2); + $wadj = $table['border_spacing_H']; + $hadj = $table['border_spacing_V']; + if ($i == 0) { // Top + $yadj += $table['padding']['T'] + $table['border_details']['T']['w'] ; + $hadj += $table['padding']['T'] + $table['border_details']['T']['w'] ; + } + if ($j == 0) { // Left + $xadj += $table['padding']['L'] + $table['border_details']['L']['w'] ; + $wadj += $table['padding']['L'] + $table['border_details']['L']['w'] ; + } + if ($i == ($numrows-1) || (isset($cell['rowspan']) && ($i+$cell['rowspan']) == $numrows) || (!isset($cell['rowspan']) && ($i+1) == $numrows)) { // Bottom + $hadj += $table['padding']['B'] + $table['border_details']['B']['w'] ; + } + if ($j == ($numcols-1) || (isset($cell['colspan']) && ($j+$cell['colspan']) == $numcols) || (!isset($cell['colspan']) && ($j+1) == $numcols)) { // Right + $wadj += $table['padding']['R'] + $table['border_details']['R']['w'] ; + } + $this->SetFColor($color); + $this->Rect($x - $xadj, $y - $yadj, $w + $wadj, $h + $hadj, 'F'); + } + } + } + } +/*-- END COLUMNS --*/ + + if ($table['empty_cells']!='hide' || !empty($cell['textbuffer']) || (isset($cell['nestedcontent']) && $cell['nestedcontent']) || !$table['borders_separate'] ) { $paintcell = true; } + else { $paintcell = false; } + + //Set Borders + $bord = 0; + $bord_det = array(); + + if (!$this->simpleTables){ + if ($this->packTableData) { + if ($cell['borderbin']) { + $c = $this->_unpackCellBorder($cell['borderbin']); + $bord = $c['border']; + $bord_det = $c['border_details']; + } + } + else if ($cell['border']) { + $bord = $cell['border']; + $bord_det = $cell['border_details']; + } + } + else if ($this->simpleTables){ + if ($table['simple']['border']) { + $bord = $table['simple']['border']; + $bord_det = $table['simple']['border_details']; + } + } + + //TABLE ROW OR CELL FILL BGCOLOR + $fill = 0; + if (isset($cell['bgcolor']) && $cell['bgcolor'] && $cell['bgcolor']!='transparent') { + $fill = $cell['bgcolor']; + $leveladj = 6; + } + else if (isset($table['bgcolor'][$i]) && $table['bgcolor'][$i] && $table['bgcolor'][$i]!='transparent') { // Row color + $fill = $table['bgcolor'][$i]; + $leveladj = 3; + } + if ($fill && $paintcell) { + $color = $this->ConvertColor($fill); + if ($color) { + if ($table['borders_separate']) { + if ($this->ColActive) { + $this->SetFColor($color); + $this->Rect($x+ ($table['border_spacing_H']/2), $y+ ($table['border_spacing_V']/2), $w- $table['border_spacing_H'], $h- $table['border_spacing_V'], 'F'); + } + else { + $this->tableBackgrounds[$level*9+$leveladj][] = array('gradient'=>false, 'x'=>($x + ($table['border_spacing_H']/2)), 'y'=>($y + ($table['border_spacing_V']/2)), 'w'=>($w - $table['border_spacing_H']), 'h'=>($h - $table['border_spacing_V']), 'col'=>$color); + } + } + else { + if ($this->ColActive) { + $this->SetFColor($color); + $this->Rect($x, $y, $w, $h, 'F'); + } + else { + $this->tableBackgrounds[$level*9+$leveladj][] = array('gradient'=>false, 'x'=>$x, 'y'=>$y, 'w'=>$w, 'h'=>$h, 'col'=>$color); + } + } + } + } + +/*-- BACKGROUNDS --*/ + if (isset($cell['gradient']) && $cell['gradient'] && $paintcell){ + $g = $this->grad->parseBackgroundGradient($cell['gradient']); + if ($g) { + if ($table['borders_separate']) { + $px = $x+ ($table['border_spacing_H']/2); + $py = $y+ ($table['border_spacing_V']/2); + $pw = $w- $table['border_spacing_H']; + $ph = $h- $table['border_spacing_V']; + } + else { + $px = $x; + $py = $y; + $pw = $w; + $ph = $h; + } + if ($this->ColActive) { + $this->grad->Gradient($px, $py, $pw, $ph, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend']); + } + else { + $this->tableBackgrounds[$level*9+7][] = array('gradient'=>true, 'x'=>$px, 'y'=>$py, 'w'=>$pw, 'h'=>$ph, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + } + + if (isset($cell['background-image']) && $paintcell) { + if ($cell['background-image']['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $cell['background-image']['gradient'] )) { + $g = $this->grad->parseMozGradient( $cell['background-image']['gradient'] ); + if ($g) { + if ($table['borders_separate']) { + $px = $x+ ($table['border_spacing_H']/2); + $py = $y+ ($table['border_spacing_V']/2); + $pw = $w- $table['border_spacing_H']; + $ph = $h- $table['border_spacing_V']; + } + else { + $px = $x; + $py = $y; + $pw = $w; + $ph = $h; + } + if ($this->ColActive) { + $this->grad->Gradient($px, $py, $pw, $ph, $g['type'], $g['stops'], $g['colorspace'], $g['coords'], $g['extend']); + } + else { + $this->tableBackgrounds[$level*9+7][] = array('gradient'=>true, 'x'=>$px, 'y'=>$py, 'w'=>$pw, 'h'=>$ph, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + } + else if ($cell['background-image']['image_id']) { // Background pattern + $n = count($this->patterns)+1; + if ($table['borders_separate']) { + $px = $x+ ($table['border_spacing_H']/2); + $py = $y+ ($table['border_spacing_V']/2); + $pw = $w- $table['border_spacing_H']; + $ph = $h- $table['border_spacing_V']; + } + else { + $px = $x; + $py = $y; + $pw = $w; + $ph = $h; + } + if ($this->ColActive) { + list($orig_w, $orig_h, $x_repeat, $y_repeat) = $this->_resizeBackgroundImage($cell['background-image']['orig_w'], $cell['background-image']['orig_h'], $pw, $ph, $cell['background-image']['resize'], $cell['background-image']['x_repeat'], $cell['background-image']['y_repeat']); + $this->patterns[$n] = array('x'=>$px, 'y'=>$py, 'w'=>$pw, 'h'=>$ph, 'pgh'=>$this->h, 'image_id'=>$cell['background-image']['image_id'], 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$cell['background-image']['x_pos'] , 'y_pos'=>$cell['background-image']['y_pos'] , 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat); + if ($cell['background-image']['opacity']>0 && $cell['background-image']['opacity']<1) { $opac = $this->SetAlpha($cell['background-image']['opacity'],'Normal',true); } + else { $opac = ''; } + $this->_out(sprintf('q /Pattern cs /P%d scn %s %.3F %.3F %.3F %.3F re f Q', $n, $opac, $px*_MPDFK, ($this->h-$py)*_MPDFK, $pw*_MPDFK, -$ph*_MPDFK)); + } + else { + $image_id = $cell['background-image']['image_id']; + $orig_w = $cell['background-image']['orig_w']; + $orig_h = $cell['background-image']['orig_h']; + $x_pos = $cell['background-image']['x_pos']; + $y_pos = $cell['background-image']['y_pos']; + $x_repeat = $cell['background-image']['x_repeat']; + $y_repeat = $cell['background-image']['y_repeat']; + $resize = $cell['background-image']['resize']; + $opacity = $cell['background-image']['opacity']; + $itype = $cell['background-image']['itype']; + $this->tableBackgrounds[$level*9+8][] = array('x'=>$px, 'y'=>$py, 'w'=>$pw, 'h'=>$ph, 'image_id'=>$image_id, 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$x_pos, 'y_pos'=>$y_pos, 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'clippath'=>'', 'resize'=>$resize, 'opacity'=>$opacity, 'itype'=>$itype); + } + } + } +/*-- END BACKGROUNDS --*/ + + if (isset($cell['colspan']) && $cell['colspan']>1) { $ccolsp = $cell['colspan']; } + else { $ccolsp = 1; } + if (isset($cell['rowspan']) && $cell['rowspan']>1) { $crowsp = $cell['rowspan']; } + else { $crowsp = 1; } + + + // but still need to do this for repeated headers... + if (!$table['borders_separate'] && $this->tabletheadjustfinished && !$this->simpleTables){ + if (isset($table['topntail']) && $table['topntail']) { + $bord_det['T'] = $this->border_details($table['topntail']); + $bord_det['T']['w'] /= $this->shrin_k; + $this->setBorder($bord, _BORDER_TOP); + } + if (isset($table['thead-underline']) && $table['thead-underline']) { + $bord_det['T'] = $this->border_details($table['thead-underline']); + $bord_det['T']['w'] /= $this->shrin_k; + $this->setBorder($bord, _BORDER_TOP); + } + } + + + //Get info of first row ==>> table header + //Use > 1 row if THEAD + if (isset($table['is_thead'][$i]) && $table['is_thead'][$i] && $level==1) { + if ($j==0) $tableheaderrowheight += $table['hr'][$i]; + $tableheader[$i][0]['trbackground-images'] = (isset($table['trbackground-images'][$i]) ? $table['trbackground-images'][$i] : null); + $tableheader[$i][0]['trgradients'] = (isset($table['trgradients'][$i]) ? $table['trgradients'][$i] : null); + $tableheader[$i][0]['trbgcolor'] = (isset($table['bgcolor'][$i]) ? $table['bgcolor'][$i] : null); + $tableheader[$i][$j]['x'] = $x; + $tableheader[$i][$j]['y'] = $y; + $tableheader[$i][$j]['h'] = $h; + $tableheader[$i][$j]['w'] = $w; + if (isset($cell['textbuffer'])) { $tableheader[$i][$j]['textbuffer'] = $cell['textbuffer']; } + else { $tableheader[$i][$j]['textbuffer'] = ''; } + $tableheader[$i][$j]['a'] = $cell['a']; + $tableheader[$i][$j]['R'] = $cell['R']; + + $tableheader[$i][$j]['va'] = $cell['va']; + $tableheader[$i][$j]['mih'] = $cell['mih']; + $tableheader[$i][$j]['gradient'] = (isset($cell['gradient']) ? $cell['gradient'] : null); // *BACKGROUNDS* + $tableheader[$i][$j]['background-image'] = (isset($cell['background-image']) ? $cell['background-image'] : null); // *BACKGROUNDS* + $tableheader[$i][$j]['rowspan'] = (isset($cell['rowspan']) ? $cell['rowspan'] : null); + $tableheader[$i][$j]['colspan'] = (isset($cell['colspan']) ? $cell['colspan'] : null); + $tableheader[$i][$j]['bgcolor'] = $cell['bgcolor']; + + if (!$this->simpleTables){ + $tableheader[$i][$j]['border'] = $bord; + $tableheader[$i][$j]['border_details'] = $bord_det; + } + else if ($this->simpleTables){ + $tableheader[$i][$j]['border'] = $table['simple']['border']; + $tableheader[$i][$j]['border_details'] = $table['simple']['border_details']; + } + $tableheader[$i][$j]['padding'] = $cell['padding']; + } + + // CELL BORDER + if ($bord || $bord_det) { + if ($table['borders_separate'] && $paintcell) { + $this->_tableRect($x + ($table['border_spacing_H']/2)+($bord_det['L']['w'] /2), $y+ ($table['border_spacing_V']/2)+($bord_det['T']['w'] /2), $w-$table['border_spacing_H']-($bord_det['L']['w'] /2)-($bord_det['R']['w'] /2), $h- $table['border_spacing_V']-($bord_det['T']['w'] /2)-($bord_det['B']['w']/2), $bord, $bord_det, false, $table['borders_separate']); + } + else if (!$table['borders_separate']) { + $this->_tableRect($x, $y, $w, $h, $bord, $bord_det, true, $table['borders_separate']); // true causes buffer + } + + } + + //VERTICAL ALIGN + if ($cell['R'] && INTVAL($cell['R']) > 0 && INTVAL($cell['R']) < 90 && isset($cell['va']) && $cell['va']!='B') { $cell['va']='B';} + if (!isset($cell['va']) || $cell['va']=='M') $this->y += ($h-$cell['mih'])/2; + elseif (isset($cell['va']) && $cell['va']=='B') $this->y += $h-$cell['mih']; + + // NESTED CONTENT + + // TEXT (and nested tables) + $this->divalign=$align; + + $this->divwidth=$w; + if (!empty($cell['textbuffer'])) { + if ($level==1) { + if (isset($table['is_tfoot'][$i]) && $table['is_tfoot'][$i]) { + if (preg_match('/{colsum([0-9]*)[_]*}/', $cell['textbuffer'][0][0], $m)) { + $rep = sprintf("%01.".intval($m[1])."f", $this->colsums[$j]); + $cell['textbuffer'][0][0] = preg_replace('/{colsum[0-9_]*}/', $rep ,$cell['textbuffer'][0][0]); + } + } + else if (!isset($table['is_thead'][$i])) { $this->colsums[$j] += floatval(preg_replace('/^[^0-9\.\,]*/','',$cell['textbuffer'][0][0])); } // mPDF 5.6.66 + } + $opy = $this->y; + // mPDF ITERATION + if ($this->iterationCounter) { + foreach($cell['textbuffer'] AS $k=>$t) { + if (preg_match('/{iteration ([a-zA-Z0-9_]+)}/',$t[0], $m)) { + $vname = '__'.$m[1].'_'; + if (!isset($this->$vname)) { $this->$vname = 1; } + else { $this->$vname++; } + $cell['textbuffer'][$k][0] = preg_replace('/{iteration '.$m[1].'}/', $this->$vname, $cell['textbuffer'][$k][0]); + } + } + } + + + if ($cell['R']) { + $cellPtSize = $cell['textbuffer'][0][11] / $this->shrin_k; + if (!$cellPtSize) { $cellPtSize = $this->default_font_size; } + $cellFontHeight = ($cellPtSize/_MPDFK); + $opx = $this->x; + $angle = INTVAL($cell['R']); + // Only allow 45 to 89 degrees (when bottom-aligned) or exactly 90 or -90 + if ($angle > 90) { $angle = 90; } + else if ($angle > 0 && $angle <45) { $angle = 45; } + else if ($angle < 0) { $angle = -90; } + $offset = ((sin(deg2rad($angle))) * 0.37 * $cellFontHeight); + if (isset($cell['a']) && $cell['a']=='R') { + $this->x += ($w) + ($offset) - ($cellFontHeight/3) - ($cell['padding']['R'] + ($table['border_spacing_H']/2)); + } + else if (!isset($cell['a']) || $cell['a']=='C') { + $this->x += ($w/2) + ($offset); + } + else { + $this->x += ($offset) + ($cellFontHeight/3)+($cell['padding']['L'] +($table['border_spacing_H']/2)); + } + $str = ''; + foreach($cell['textbuffer'] AS $t) { $str .= $t[0].' '; } + $str = trim($str); + if (!isset($cell['va']) || $cell['va']=='M') { + $this->y -= ($h-$cell['mih'])/2; //Undo what was added earlier VERTICAL ALIGN + if ($angle > 0) { $this->y += (($h-$cell['mih'])/2) + $cell['padding']['T'] + ($cell['mih']-($cell['padding']['T'] + $cell['padding']['B'])); } + else if ($angle < 0) { $this->y += (($h-$cell['mih'])/2)+ ($cell['padding']['T'] + ($table['border_spacing_V']/2)); } + } + elseif (isset($cell['va']) && $cell['va']=='B') { + $this->y -= $h-$cell['mih']; //Undo what was added earlier VERTICAL ALIGN + if ($angle > 0) { $this->y += $h-($cell['padding']['B'] + ($table['border_spacing_V']/2)); } + else if ($angle < 0) { $this->y += $h-$cell['mih'] + ($cell['padding']['T'] + ($table['border_spacing_V']/2)); } + } + elseif (isset($cell['va']) && $cell['va']=='T') { + if ($angle > 0) { $this->y += $cell['mih']-($cell['padding']['B'] + ($table['border_spacing_V']/2)); } + else if ($angle < 0) { $this->y += ($cell['padding']['T'] + ($table['border_spacing_V']/2)); } + } + $this->Rotate($angle,$this->x,$this->y); + $s_fs = $this->FontSizePt; + $s_f = $this->FontFamily; + $s_st = $this->FontStyle; + if (!empty($cell['textbuffer'][0][3])) { //Font Color + $cor = $cell['textbuffer'][0][3]; + $this->SetTColor($cor); + } + $s_str = $this->strike; + $this->strike = $cell['textbuffer'][0][8]; //Strikethrough + $this->SetFont($cell['textbuffer'][0][4],$cell['textbuffer'][0][2],$cellPtSize,true,true); + $this->Text($this->x,$this->y,$str); + $this->Rotate(0); + $this->SetFont($s_f,$s_st,$s_fs,true,true); + $this->SetTColor(0); + $this->strike = $s_str; + $this->x = $opx; + } + else { + + if (!$this->simpleTables){ + if ($bord_det) { + $btlw = $bord_det['L']['w']; + $btrw = $bord_det['R']['w']; + $bttw = $bord_det['T']['w']; + } + else { + $btlw = 0; + $btrw = 0; + $bttw = 0; + } + if ($table['borders_separate']) { + $xadj = $btlw + $cell['padding']['L'] +($table['border_spacing_H']/2); + $wadj = $btlw + $btrw + $cell['padding']['L'] +$cell['padding']['R'] + $table['border_spacing_H']; + $yadj = $bttw + $cell['padding']['T'] + ($table['border_spacing_H']/2); + } + else { + $xadj = $btlw/2 + $cell['padding']['L']; + $wadj = ($btlw + $btrw)/2 + $cell['padding']['L'] + $cell['padding']['R']; + $yadj = $bttw/2 + $cell['padding']['T']; + } + } + else if ($this->simpleTables){ + if ($table['borders_separate']) { // NB twice border width + $xadj = $table['simple']['border_details']['L']['w'] + $cell['padding']['L'] +($table['border_spacing_H']/2); + $wadj = $table['simple']['border_details']['L']['w'] + $table['simple']['border_details']['R']['w'] + $cell['padding']['L'] +$cell['padding']['R'] + $table['border_spacing_H']; + $yadj = $table['simple']['border_details']['T']['w'] + $cell['padding']['T'] + ($table['border_spacing_H']/2); + } + else { + $xadj = $table['simple']['border_details']['L']['w']/2 + $cell['padding']['L']; + $wadj = ($table['simple']['border_details']['L']['w'] + $table['simple']['border_details']['R']['w'])/2 + $cell['padding']['L'] + $cell['padding']['R']; + $yadj = $table['simple']['border_details']['T']['w']/2 + $cell['padding']['T']; + } + } + // mPDF 5.6.13 + $this->decimal_offset = 0; + if(substr($cell['a'],0,1) == 'D') { + if ($cell['colspan'] > 1) { $this->divalign = $c['a'] = substr($cell['a'],2,1); } + else { + $smax = $table['decimal_align'][$j]['maxs0']; + $d_content = $table['decimal_align'][$j]['maxs0'] + $table['decimal_align'][$j]['maxs1']; + $this->decimal_offset = $smax; + $extra = ($w - $d_content - $wadj); + if ($extra > 0) { + if(substr($cell['a'],2,1) == 'R') { $this->decimal_offset += $extra; } + else if(substr($cell['a'],2,1) == 'C') { $this->decimal_offset += ($extra)/2; } + } + } + } + $this->divwidth=$w-$wadj; + if ($this->divwidth == 0) { $this->divwidth = 0.0001; } + $this->x += $xadj; + $this->y += $yadj; + $this->printbuffer($cell['textbuffer'],'',true); + } + $this->y = $opy; + } + +/*-- BACKGROUNDS --*/ + if (!$this->ColActive) { + if (isset($table['trgradients'][$i]) && ($j==0 || $table['borders_separate'])) { + $g = $this->grad->parseBackgroundGradient($table['trgradients'][$i]); + if ($g) { + $gx = $x0; + $gy = $y; + $gh = $h; + $gw = $table['w'] - ($table['max_cell_border_width']['L']/2) - ($table['max_cell_border_width']['R']/2) - $table['margin']['L'] - $table['margin']['R']; + if ($table['borders_separate']) { + $gw -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']); + $s = ''; + $clx = $x+ ($table['border_spacing_H']/2); + $cly = $y+ ($table['border_spacing_V']/2); + $clw = $w- $table['border_spacing_H']; + $clh = $h- $table['border_spacing_V']; + // Set clipping path + $s = ' q 0 w '; // Line width=0 + $s .= sprintf('%.3F %.3F m ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // start point TL before the arc + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BL + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BR + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TR + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TL + $s .= ' W n '; // Ends path no-op & Sets the clipping path + $this->tableBackgrounds[$level*9+4][] = array('gradient'=>true, 'x'=>$gx + ($table['border_spacing_H']/2), 'y'=>$gy + ($table['border_spacing_V']/2), 'w'=>$gw - $table['border_spacing_V'], 'h'=>$gh - $table['border_spacing_H'], 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>$s); + } + else { + $this->tableBackgrounds[$level*9+4][] = array('gradient'=>true, 'x'=>$gx, 'y'=>$gy, 'w'=>$gw, 'h'=>$gh, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + } + if (isset($table['trbackground-images'][$i]) && ($j==0 || $table['borders_separate'])) { + if ($table['trbackground-images'][$i]['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $table['trbackground-images'][$i]['gradient'] )) { + $g = $this->grad->parseMozGradient( $table['trbackground-images'][$i]['gradient'] ); + if ($g) { + $gx = $x0; + $gy = $y; + $gh = $h; + $gw = $table['w'] - ($table['max_cell_border_width']['L']/2) - ($table['max_cell_border_width']['R']/2) - $table['margin']['L'] - $table['margin']['R']; + if ($table['borders_separate']) { + $gw -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']); + $s = ''; + $clx = $x+ ($table['border_spacing_H']/2); + $cly = $y+ ($table['border_spacing_V']/2); + $clw = $w- $table['border_spacing_H']; + $clh = $h- $table['border_spacing_V']; + // Set clipping path + $s = ' q 0 w '; // Line width=0 + $s .= sprintf('%.3F %.3F m ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // start point TL before the arc + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BL + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BR + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TR + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TL + $s .= ' W n '; // Ends path no-op & Sets the clipping path + $this->tableBackgrounds[$level*9+4][] = array('gradient'=>true, 'x'=>$gx + ($table['border_spacing_H']/2), 'y'=>$gy + ($table['border_spacing_V']/2), 'w'=>$gw - $table['border_spacing_V'], 'h'=>$gh - $table['border_spacing_H'], 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>$s); + } + else { + $this->tableBackgrounds[$level*9+4][] = array('gradient'=>true, 'x'=>$gx, 'y'=>$gy, 'w'=>$gw, 'h'=>$gh, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + } + else { + $image_id = $table['trbackground-images'][$i]['image_id']; + $orig_w = $table['trbackground-images'][$i]['orig_w']; + $orig_h = $table['trbackground-images'][$i]['orig_h']; + $x_pos = $table['trbackground-images'][$i]['x_pos']; + $y_pos = $table['trbackground-images'][$i]['y_pos']; + $x_repeat = $table['trbackground-images'][$i]['x_repeat']; + $y_repeat = $table['trbackground-images'][$i]['y_repeat']; + $resize = $table['trbackground-images'][$i]['resize']; + $opacity = $table['trbackground-images'][$i]['opacity']; + $itype = $table['trbackground-images'][$i]['itype']; + $clippath = ''; + $gx = $x0; + $gy = $y; + $gh = $h; + $gw = $table['w'] - ($table['max_cell_border_width']['L']/2) - ($table['max_cell_border_width']['R']/2) - $table['margin']['L'] - $table['margin']['R']; + if ($table['borders_separate']) { + $gw -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['padding']['R'] + $table['border_details']['R']['w'] + $table['border_spacing_H']); + $s = ''; + $clx = $x + ($table['border_spacing_H']/2); + $cly = $y + ($table['border_spacing_V']/2); + $clw = $w - $table['border_spacing_H']; + $clh = $h - $table['border_spacing_V']; + // Set clipping path + $s = ' q 0 w '; // Line width=0 + $s .= sprintf('%.3F %.3F m ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // start point TL + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BL + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly+$clh))*_MPDFK); // line to BR + $s .= sprintf('%.3F %.3F l ', ($clx+$clw)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TR + $s .= sprintf('%.3F %.3F l ', ($clx)*_MPDFK, ($this->h-($cly))*_MPDFK); // line to TL + $s .= ' W n '; // Ends path no-op & Sets the clipping path + $this->tableBackgrounds[$level*9+5][] = array('x'=>$gx + ($table['border_spacing_H']/2), 'y'=>$gy + ($table['border_spacing_V']/2), 'w'=>$gw - $table['border_spacing_V'], 'h'=>$gh - $table['border_spacing_H'], 'image_id'=>$image_id, 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$x_pos, 'y_pos'=>$y_pos, 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'clippath'=>$s, 'resize'=>$resize, 'opacity'=>$opacity, 'itype'=>$itype); + } + else { + $this->tableBackgrounds[$level*9+5][] = array('x'=>$gx, 'y'=>$gy, 'w'=>$gw, 'h'=>$gh, 'image_id'=>$image_id, 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$x_pos, 'y_pos'=>$y_pos, 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'clippath'=>'', 'resize'=>$resize, 'opacity'=>$opacity, 'itype'=>$itype); + } + } + } + } + +/*-- END BACKGROUNDS --*/ + + // TABLE BORDER - if separate + if (($table['borders_separate'] || ($this->simpleTables && !$table['simple']['border'])) && $table['border']) { + $halfspaceL = $table['padding']['L'] + ($table['border_spacing_H']/2); + $halfspaceR = $table['padding']['R'] + ($table['border_spacing_H']/2); + $halfspaceT = $table['padding']['T'] + ($table['border_spacing_V']/2); + $halfspaceB = $table['padding']['B'] + ($table['border_spacing_V']/2); + $tbx = $x; + $tby = $y; + $tbw = $w; + $tbh = $h; + $tab_bord = 0; + + $corner = ''; + if ($i == 0) { // Top + $tby -= $halfspaceT + ($table['border_details']['T']['w']/2); + $tbh += $halfspaceT + ($table['border_details']['T']['w']/2); + $this->setBorder($tab_bord , _BORDER_TOP); + $corner .= 'T'; + } + if ($i == ($numrows-1) || (isset($cell['rowspan']) && ($i+$cell['rowspan']) == $numrows)) { // Bottom + $tbh += $halfspaceB + ($table['border_details']['B']['w']/2); + $this->setBorder($tab_bord , _BORDER_BOTTOM); + $corner .= 'B'; + } + if ($j == 0) { // Left + $tbx -= $halfspaceL + ($table['border_details']['L']['w']/2); + $tbw += $halfspaceL + ($table['border_details']['L']['w']/2); + $this->setBorder($tab_bord , _BORDER_LEFT); + $corner .= 'L'; + } + if ($j == ($numcols-1) || (isset($cell['colspan']) && ($j+$cell['colspan']) == $numcols)) { // Right + $tbw += $halfspaceR + ($table['border_details']['R']['w']/2); + $this->setBorder($tab_bord , _BORDER_RIGHT); + $corner .= 'R'; + } + $this->_tableRect($tbx, $tby, $tbw, $tbh, $tab_bord , $table['border_details'], false, $table['borders_separate'], 'table', $corner, $table['border_spacing_V'], $table['border_spacing_H'] ); + } + + unset($cell ); + //Reset values + $this->Reset(); + + }//end of (if isset(cells)...) + }// end of columns + + $newpagestarted = false; + $this->tabletheadjustfinished = false; + + if ($this->ColActive && $i < $numrows-1 && $level==1) { $this->breakpoints[$this->CurrCol][] = $y + $h; } // *COLUMNS* + +/*-- COLUMNS --*/ + if ($this->ColActive) { + if (count($this->cellBorderBuffer)) { $this->printcellbuffer(); } + } +/*-- END COLUMNS --*/ + + if ($i == $numrows-1) { $this->y = $y + $h; } //last row jump (update this->y position) + if ($this->table_rotate && $level==1) { + $this->tbrot_h += $h; + } + + + + }// end of rows + + if ($this->progressBar) { $this->UpdateProgressBar(7,70,' '); } // *PROGRESS-BAR* + + if (count($this->cellBorderBuffer)) { $this->printcellbuffer(); } + + + if ($this->tableClipPath ) { $this->_out("Q"); } + $this->tableClipPath = ''; + + // Advance down page by half width of bottom border + if ($table['borders_separate']) { $this->y += $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V']/2; } + else { $this->y += $table['max_cell_border_width']['B']/2; } + + if ($table['borders_separate'] && $level==1) { $this->tbrot_h += $table['margin']['B'] + $table['padding']['B'] + $table['border_details']['B']['w'] + $table['border_spacing_V']/2; } + else if ($level==1) { $this->tbrot_h += $table['margin']['B'] + $table['max_cell_border_width']['B']/2; } + + $bx = $x0; + $by = $y0; + if ($table['borders_separate']) { + $bx -= ($table['padding']['L'] + $table['border_details']['L']['w'] + $table['border_spacing_H']/2); + if ($tablestartpageno != $this->page) { // IF broken across page + $by += $table['max_cell_border_width']['T']/2; + if (empty($tableheader)) { $by -= ($table['border_spacing_V']/2); } + } + else if ($split && $startrow > 0 && empty($tableheader)) { + $by -= ($table['border_spacing_V']/2); + } + else { + $by -= ($table['padding']['T'] + $table['border_details']['T']['w'] + $table['border_spacing_V']/2); + } + } + else if ($tablestartpageno != $this->page && !empty($tableheader)) { $by += $maxbwtop /2; } + $by -= $tableheaderadj; + $bh = $this->y - $by; + if (!$table['borders_separate']) { $bh -= $table['max_cell_border_width']['B']/2; } + + if ($split) { + $bw = 0; + $finalSpread = true; + for($t=$startcol; $t<$numcols; $t++) { + if ($table['colPg'][$t] == $splitpg) { $bw += $table['wc'][$t]; } + if ($table['colPg'][$t] > $splitpg) { $finalSpread = false; break; } + } + if ($startcol==0) { $firstSpread = true; } + else { $firstSpread = false; } + if ($table['borders_separate']) { + $bw += $table['border_spacing_H']; + if ($firstSpread) { + $bw += $table['padding']['L'] + $table['border_details']['L']['w']; + } + else { + $bx += ($table['padding']['L'] + $table['border_details']['L']['w']); + } + if ($finalSpread) { + $bw += $table['padding']['R'] + $table['border_details']['R']['w']; + } + } + } + else { + $bw = $table['w'] - ($table['max_cell_border_width']['L']/2) - ($table['max_cell_border_width']['R']/2) - $table['margin']['L'] - $table['margin']['R']; + } + + if (!$this->ColActive) { + if (isset($table['bgcolor'][-1])) { + $color = $this->ConvertColor($table['bgcolor'][-1]); + if ($color) { + $this->tableBackgrounds[$level*9][] = array('gradient'=>false, 'x'=>$bx, 'y'=>$by, 'w'=>$bw, 'h'=>$bh, 'col'=>$color); + } + } + +/*-- BACKGROUNDS --*/ + if (isset($table['gradient'])) { + $g = $this->grad->parseBackgroundGradient($table['gradient']); + if ($g) { + $this->tableBackgrounds[$level*9+1][] = array('gradient'=>true, 'x'=>$bx, 'y'=>$by, 'w'=>$bw, 'h'=>$bh, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + + if (isset($table['background-image'])) { + if ($table['background-image']['gradient'] && preg_match('/(-moz-)*(repeating-)*(linear|radial)-gradient/', $table['background-image']['gradient'] )) { + $g = $this->grad->parseMozGradient( $table['background-image']['gradient'] ); + if ($g) { + $this->tableBackgrounds[$level*9+1][] = array('gradient'=>true, 'x'=>$bx, 'y'=>$by, 'w'=>$bw, 'h'=>$bh, 'gradtype'=>$g['type'], 'stops'=>$g['stops'], 'colorspace'=>$g['colorspace'], 'coords'=>$g['coords'], 'extend'=>$g['extend'], 'clippath'=>''); + } + } + else { + $image_id = $table['background-image']['image_id']; + $orig_w = $table['background-image']['orig_w']; + $orig_h = $table['background-image']['orig_h']; + $x_pos = $table['background-image']['x_pos']; + $y_pos = $table['background-image']['y_pos']; + $x_repeat = $table['background-image']['x_repeat']; + $y_repeat = $table['background-image']['y_repeat']; + $resize = $table['background-image']['resize']; + $opacity = $table['background-image']['opacity']; + $itype = $table['background-image']['itype']; + $this->tableBackgrounds[$level*9+2][] = array('x'=>$bx, 'y'=>$by, 'w'=>$bw, 'h'=>$bh, 'image_id'=>$image_id, 'orig_w'=>$orig_w, 'orig_h'=>$orig_h, 'x_pos'=>$x_pos, 'y_pos'=>$y_pos, 'x_repeat'=>$x_repeat, 'y_repeat'=>$y_repeat, 'clippath'=>'', 'resize'=>$resize, 'opacity'=>$opacity, 'itype'=>$itype); + } + } +/*-- END BACKGROUNDS --*/ + } + + if ($this->tableBackgrounds && $level == 1) { + $s = $this->PrintTableBackgrounds(); + if ($this->table_rotate && !$this->processingHeader && !$this->processingFooter) { + $this->tablebuffer = preg_replace('/(___TABLE___BACKGROUNDS'.date('jY').')/', '\\1'."\n".$s."\n", $this->tablebuffer); + if ($level == 1) { $this->tablebuffer = preg_replace('/(___TABLE___BACKGROUNDS'.date('jY').')/', " ", $this->tablebuffer); } + } + else if ($this->bufferoutput) { + $this->headerbuffer = preg_replace('/(___TABLE___BACKGROUNDS'.date('jY').')/', '\\1'."\n".$s."\n", $this->headerbuffer); + if ($level == 1) { $this->headerbuffer = preg_replace('/(___TABLE___BACKGROUNDS'.date('jY').')/', " ", $this->headerbuffer ); } + } + else { + $this->pages[$this->page] = preg_replace('/(___TABLE___BACKGROUNDS'.date('jY').')/', '\\1'."\n".$s."\n", $this->pages[$this->page]); + if ($level == 1) { $this->pages[$this->page] = preg_replace('/(___TABLE___BACKGROUNDS'.date('jY').')/', " ", $this->pages[$this->page]); } + } + $this->tableBackgrounds = array(); + } + + + // TABLE BOTTOM MARGIN + if ($table['margin']['B']) { + if (!$this->table_rotate && $level==1) { + $this->DivLn($table['margin']['B'],$this->blklvl,true); // collapsible + } + else { + $this->y += ($table['margin']['B']); + } + } + + if ($this->ColActive && $level==1) { $this->breakpoints[$this->CurrCol][] = $this->y; } // *COLUMNS* + + if ($this->cacheTables) { fclose($fh); } + + if ($split) { + // Are there more columns to print on a next page? + if ($lastCol < $numcols-1) { + $splitpg++; + $startcol = $lastCol + 1; + return array(false, $startrow, $startcol, $splitpg, $returny, $y0); + } + else { + if ($this->cacheTables) { + unlink($table['cache']); + @unlink($table['cache'].'.bak'); + } + return array(true,0,0,0); + } + } + if ($this->cacheTables) { + unlink($table['cache']); + @unlink($table['cache'].'.bak'); + } + +}//END OF FUNCTION _tableWrite() + + +/////////////////////////END OF TABLE CODE////////////////////////////////// +/*-- END TABLES --*/ + +function _putextgstates() { + for ($i = 1; $i <= count($this->extgstates); $i++) { + $this->_newobj(); + $this->extgstates[$i]['n'] = $this->n; + $this->_out('<</Type /ExtGState'); + foreach ($this->extgstates[$i]['parms'] as $k=>$v) + $this->_out('/'.$k.' '.$v); + $this->_out('>>'); + $this->_out('endobj'); + } +} + +function _putocg() { + if ($this->hasOC) { // mPDF 5.6.01 + $this->_newobj(); + $this->n_ocg_print=$this->n; + $this->_out('<</Type /OCG /Name '.$this->_textstring('Print only')); + $this->_out('/Usage <</Print <</PrintState /ON>> /View <</ViewState /OFF>>>>>>'); + $this->_out('endobj'); + $this->_newobj(); + $this->n_ocg_view=$this->n; + $this->_out('<</Type /OCG /Name '.$this->_textstring('Screen only')); + $this->_out('/Usage <</Print <</PrintState /OFF>> /View <</ViewState /ON>>>>>>'); + $this->_out('endobj'); + $this->_newobj(); + $this->n_ocg_hidden=$this->n; + $this->_out('<</Type /OCG /Name '.$this->_textstring('Hidden')); + $this->_out('/Usage <</Print <</PrintState /OFF>> /View <</ViewState /OFF>>>>>>'); + $this->_out('endobj'); + } + // mPDF 5.6.01 Add Layers + if (count($this->layers)) { + ksort($this->layers); + foreach($this->layers as $id=>$layer) { + $this->_newobj(); + $this->layers[$id]['n'] = $this->n; + // mPDF 5.6.28 + if (isset($this->layerDetails[$id]['name']) && $this->layerDetails[$id]['name']) { + $name = $this->layerDetails[$id]['name']; + } + else { $name = $layer['name']; } + $this->_out('<</Type /OCG /Name '.$this->_UTF16BEtextstring($name).'>>'); + $this->_out('endobj'); + } + } +} + + +/*-- IMPORTS --*/ + + // from mPDFI + function _putimportedobjects() { + if (is_array($this->parsers) && count($this->parsers) > 0) { + foreach($this->parsers AS $filename => $p) { + $this->current_parser =& $this->parsers[$filename]; + if (is_array($this->_obj_stack[$filename])) { + while($n = key($this->_obj_stack[$filename])) { + $nObj = $this->current_parser->pdf_resolve_object($this->current_parser->c,$this->_obj_stack[$filename][$n][1]); + $this->_newobj($this->_obj_stack[$filename][$n][0]); + if ($nObj[0] == PDF_TYPE_STREAM) { + $this->pdf_write_value($nObj); + } + else { + $this->pdf_write_value($nObj[1]); + } + $this->_out('endobj'); + $this->_obj_stack[$filename][$n] = null; // free memory + unset($this->_obj_stack[$filename][$n]); + reset($this->_obj_stack[$filename]); + } + } + } + } + } + + + function _putformxobjects() { + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + reset($this->tpls); + foreach($this->tpls AS $tplidx => $tpl) { + $p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer']; + $this->_newobj(); + $this->tpls[$tplidx]['n'] = $this->n; + $this->_out('<<'.$filter.'/Type /XObject'); + $this->_out('/Subtype /Form'); + $this->_out('/FormType 1'); + // Left/Bottom/Right/Top + $this->_out(sprintf('/BBox [%.2F %.2F %.2F %.2F]', + $tpl['box']['x']*_MPDFK, + $tpl['box']['y']*_MPDFK, + ($tpl['box']['x'] + $tpl['box']['w'])*_MPDFK, + ($tpl['box']['y'] + $tpl['box']['h'])*_MPDFK ) + ); + + + if (isset($tpl['box'])) + $this->_out(sprintf('/Matrix [1 0 0 1 %.5F %.5F]',-$tpl['box']['x']*_MPDFK, -$tpl['box']['y']*_MPDFK)); + $this->_out('/Resources '); + + if (isset($tpl['resources'])) { + $this->current_parser =& $tpl['parser']; + $this->pdf_write_value($tpl['resources']); + } else { + $this->_out('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'); + if (isset($this->_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) { + $this->_out('/Font <<'); + foreach($this->_res['tpl'][$tplidx]['fonts'] as $font) + $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); + $this->_out('>>'); + } + if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) || + isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) + { + $this->_out('/XObject <<'); + if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) { + foreach($this->_res['tpl'][$tplidx]['images'] as $image) + $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); + } + if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) { + foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $itpl) + $this->_out($this->tplprefix.$i.' '.$itpl['n'].' 0 R'); + } + $this->_out('>>'); + } + $this->_out('>>'); + } + + $this->_out('/Length '.strlen($p).' >>'); + $this->_putstream($p); + $this->_out('endobj'); + } + } + +/*-- END IMPORTS --*/ + + +function _putpatterns() { + for ($i = 1; $i <= count($this->patterns); $i++) { + $x = $this->patterns[$i]['x']; + $y = $this->patterns[$i]['y']; + $w = $this->patterns[$i]['w']; + $h = $this->patterns[$i]['h']; + $pgh = $this->patterns[$i]['pgh']; + $orig_w = $this->patterns[$i]['orig_w']; + $orig_h = $this->patterns[$i]['orig_h']; + $image_id = $this->patterns[$i]['image_id']; + $itype = $this->patterns[$i]['itype']; + $bpa = $this->patterns[$i]['bpa']; // mPDF 5.6.10 background positioning area + + if ($this->patterns[$i]['x_repeat']) { $x_repeat = true; } + else { $x_repeat = false; } + if ($this->patterns[$i]['y_repeat']) { $y_repeat = true; } + else { $y_repeat = false; } + $x_pos = $this->patterns[$i]['x_pos']; + if (stristr($x_pos ,'%') ) { + $x_pos += 0; + $x_pos /= 100; + if (isset($bpa['w']) && $bpa['w']) $x_pos = ($bpa['w'] * $x_pos) - ($orig_w/_MPDFK * $x_pos); // mPDF 5.6.10 + else $x_pos = ($w * $x_pos) - ($orig_w/_MPDFK * $x_pos); + } + $y_pos = $this->patterns[$i]['y_pos']; + if (stristr($y_pos ,'%') ) { + $y_pos += 0; + $y_pos /= 100; + if (isset($bpa['h']) && $bpa['h']) $y_pos = ($bpa['h'] * $y_pos) - ($orig_h/_MPDFK * $y_pos); // mPDF 5.6.10 + else $y_pos = ($h * $y_pos) - ($orig_h/_MPDFK * $y_pos); + } + if (isset($bpa['x']) && $bpa['x']) $adj_x = ($x_pos + $bpa['x']) *_MPDFK; // mPDF 5.6.10 + else $adj_x = ($x_pos + $x) *_MPDFK; + if (isset($bpa['y']) && $bpa['y']) $adj_y = (($pgh - $y_pos - $bpa['y'])*_MPDFK) - $orig_h ; // mPDF 5.6.10 + else $adj_y = (($pgh - $y_pos - $y)*_MPDFK) - $orig_h ; + $img_obj = false; + if ($itype == 'svg' || $itype == 'wmf') { + foreach($this->formobjects AS $fo) { + if ($fo['i'] == $image_id) { + $img_obj = $fo['n']; + $fo_w = $fo['w']; + $fo_h = -$fo['h']; + $wmf_x = $fo['x']; + $wmf_y = $fo['y']; + break; + } + } + } + else { + foreach($this->images AS $img) { + if ($img['i'] == $image_id) { $img_obj = $img['n']; break; } + } + } + if (!$img_obj ) { echo "Problem: Image object not found for background pattern ".$img['i']; exit; } + + $this->_newobj(); + $this->_out('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'); + if ($itype == 'svg' || $itype == 'wmf') { + $this->_out('/XObject <</FO'.$image_id.' '.$img_obj.' 0 R >>'); + // ******* ADD ANY ExtGStates, Shading AND Fonts needed for the FormObject + // Set in classes/svg array['fo'] = true + // Required that _putshaders comes before _putpatterns in _putresources + // This adds any resources associated with any FormObject to every Formobject - overkill but works! + if (count($this->extgstates)) { + $this->_out('/ExtGState <<'); + foreach($this->extgstates as $k=>$extgstate) + if (isset($extgstate['fo']) && $extgstate['fo']) { + if (isset($extgstate['trans'])) $this->_out('/'.$extgstate['trans'].' '.$extgstate['n'].' 0 R'); + else $this->_out('/GS'.$k.' '.$extgstate['n'].' 0 R'); + } + $this->_out('>>'); + } +/*-- BACKGROUNDS --*/ + if (isset($this->gradients) AND (count($this->gradients) > 0)) { + $this->_out('/Shading <<'); + foreach ($this->gradients as $id => $grad) { + if (isset($grad['fo']) && $grad['fo']) { + $this->_out('/Sh'.$id.' '.$grad['id'].' 0 R'); + } + } + $this->_out('>>'); + } +/*-- END BACKGROUNDS --*/ + $this->_out('/Font <<'); + foreach($this->fonts as $font) { + if (!$font['used'] && $font['type']=='TTF') { continue; } + if (isset($font['fo']) && $font['fo']) { + if ($font['type']=='TTF' && ($font['sip'] || $font['smp'])) { + foreach($font['n'] AS $k => $fid) { + $this->_out('/F'.$font['subsetfontids'][$k].' '.$font['n'][$k].' 0 R'); + } + } + else { + $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); + } + } + } + $this->_out('>>'); + } + else { + $this->_out('/XObject <</I'.$image_id.' '.$img_obj.' 0 R >>'); + } + $this->_out('>>'); + $this->_out('endobj'); + + $this->_newobj(); + $this->patterns[$i]['n'] = $this->n; + $this->_out('<< /Type /Pattern /PatternType 1 /PaintType 1 /TilingType 2'); + $this->_out('/Resources '. ($this->n-1) .' 0 R'); + + $this->_out(sprintf('/BBox [0 0 %.3F %.3F]',$orig_w,$orig_h)); + if ($x_repeat) { $this->_out(sprintf('/XStep %.3F',$orig_w)); } + else { $this->_out(sprintf('/XStep %d',99999)); } + if ($y_repeat) { $this->_out(sprintf('/YStep %.3F',$orig_h)); } + else { $this->_out(sprintf('/YStep %d',99999)); } + + if ($itype == 'svg' || $itype == 'wmf') { + $this->_out(sprintf('/Matrix [1 0 0 -1 %.3F %.3F]', $adj_x, ($adj_y+$orig_h))); + $s = sprintf("q %.3F 0 0 %.3F %.3F %.3F cm /FO%d Do Q",($orig_w/$fo_w), (-$orig_h/$fo_h), -($orig_w/$fo_w)*$wmf_x, ($orig_w/$fo_w)*$wmf_y, $image_id); + } + else { + $this->_out(sprintf('/Matrix [1 0 0 1 %.3F %.3F]',$adj_x,$adj_y)); + $s = sprintf("q %.3F 0 0 %.3F 0 0 cm /I%d Do Q",$orig_w,$orig_h,$image_id); + } + + if ($this->compress) { + $this->_out('/Filter /FlateDecode'); + $s = gzcompress($s); + } + $this->_out('/Length '.strlen($s).'>>'); + $this->_putstream($s); + $this->_out('endobj'); + } +} + +/*-- BACKGROUNDS --*/ +function _putshaders() { + $maxid = count($this->gradients); //index for transparency gradients + foreach ($this->gradients as $id => $grad) { + if (($grad['type'] == 2 || $grad['type'] == 3) && empty($grad['is_mask'])) { + $this->_newobj(); + $this->_out('<<'); + $this->_out('/FunctionType 3'); + $this->_out('/Domain [0 1]'); + $fn = array(); + $bd = array(); + $en = array(); + for($i=0; $i<(count($grad['stops'])-1); $i++) { + $fn[] = ($this->n+1+$i).' 0 R'; + $en[] = '0 1'; + if ($i>0) { $bd[] = sprintf('%.3F', $grad['stops'][$i]['offset']); } + } + $this->_out('/Functions ['.implode(' ',$fn).']'); + $this->_out('/Bounds ['.implode(' ',$bd).']'); + $this->_out('/Encode ['.implode(' ',$en).']'); + $this->_out('>>'); + $this->_out('endobj'); + $f1 = $this->n; + for($i=0; $i<(count($grad['stops'])-1); $i++) { + $this->_newobj(); + $this->_out('<<'); + $this->_out('/FunctionType 2'); + $this->_out('/Domain [0 1]'); + $this->_out('/C0 ['.$grad['stops'][$i]['col'].']'); + $this->_out('/C1 ['.$grad['stops'][$i+1]['col'].']'); + $this->_out('/N 1'); + $this->_out('>>'); + $this->_out('endobj'); + } + } + if ($grad['type'] == 2 || $grad['type'] == 3) { + if (isset($grad['trans']) && $grad['trans']) { + $this->_newobj(); + $this->_out('<<'); + $this->_out('/FunctionType 3'); + $this->_out('/Domain [0 1]'); + $fn = array(); + $bd = array(); + $en = array(); + for($i=0; $i<(count($grad['stops'])-1); $i++) { + $fn[] = ($this->n+1+$i).' 0 R'; + $en[] = '0 1'; + if ($i>0) { $bd[] = sprintf('%.3F', $grad['stops'][$i]['offset']); } + } + $this->_out('/Functions ['.implode(' ',$fn).']'); + $this->_out('/Bounds ['.implode(' ',$bd).']'); + $this->_out('/Encode ['.implode(' ',$en).']'); + $this->_out('>>'); + $this->_out('endobj'); + $f2 = $this->n; + for($i=0; $i<(count($grad['stops'])-1); $i++) { + $this->_newobj(); + $this->_out('<<'); + $this->_out('/FunctionType 2'); + $this->_out('/Domain [0 1]'); + $this->_out(sprintf('/C0 [%.3F]', $grad['stops'][$i]['opacity'])); + $this->_out(sprintf('/C1 [%.3F]', $grad['stops'][$i+1]['opacity'])); + $this->_out('/N 1'); + $this->_out('>>'); + $this->_out('endobj'); + } + } + } + + if (empty($grad['is_mask'])) { + $this->_newobj(); + $this->_out('<<'); + $this->_out('/ShadingType '.$grad['type']); + if (isset($grad['colorspace'])) { + $this->_out('/ColorSpace /Device'.$grad['colorspace']); // Can use CMYK if all C0 and C1 above have 4 values + } else { + $this->_out('/ColorSpace /DeviceRGB'); + } + if ($grad['type'] == 2) { + $this->_out(sprintf('/Coords [%.3F %.3F %.3F %.3F]', $grad['coords'][0], $grad['coords'][1], $grad['coords'][2], $grad['coords'][3])); + $this->_out('/Function '.$f1.' 0 R'); + $this->_out('/Extend ['.$grad['extend'][0].' '.$grad['extend'][1].'] '); + $this->_out('>>'); + } + else if ($grad['type'] == 3) { + //x0, y0, r0, x1, y1, r1 + //at this this time radius of inner circle is 0 + $ir = 0; + if (isset($grad['coords'][5]) && $grad['coords'][5]) { $ir = $grad['coords'][5]; } + $this->_out(sprintf('/Coords [%.3F %.3F %.3F %.3F %.3F %.3F]', $grad['coords'][0], $grad['coords'][1], $ir, $grad['coords'][2], $grad['coords'][3], $grad['coords'][4])); + $this->_out('/Function '.$f1.' 0 R'); + $this->_out('/Extend ['.$grad['extend'][0].' '.$grad['extend'][1].'] '); + $this->_out('>>'); + } + else if ($grad['type']==6) { + $this->_out('/BitsPerCoordinate 16'); + $this->_out('/BitsPerComponent 8'); + if ($grad['colorspace'] == 'CMYK') { $this->_out('/Decode[0 1 0 1 0 1 0 1 0 1 0 1]'); } + else if ($grad['colorspace'] == 'Gray') { $this->_out('/Decode[0 1 0 1 0 1]'); } + else { $this->_out('/Decode[0 1 0 1 0 1 0 1 0 1]'); } + $this->_out('/BitsPerFlag 8'); + $this->_out('/Length '.strlen($grad['stream'])); + $this->_out('>>'); + $this->_putstream($grad['stream']); + } + $this->_out('endobj'); + } + + $this->gradients[$id]['id'] = $this->n; + + // set pattern object + $this->_newobj(); + $out = '<< /Type /Pattern /PatternType 2'; + $out .= ' /Shading '.$this->gradients[$id]['id'].' 0 R'; + $out .= ' >>'; + $out .= "\n".'endobj'; + $this->_out($out); + + + $this->gradients[$id]['pattern'] = $this->n; + + if (isset($grad['trans']) && $grad['trans']) { + // luminosity pattern + $transid = $id + $maxid; + $this->_newobj(); + $this->_out('<<'); + $this->_out('/ShadingType '.$grad['type']); + $this->_out('/ColorSpace /DeviceGray'); + if ($grad['type'] == 2) { + $this->_out(sprintf('/Coords [%.3F %.3F %.3F %.3F]', $grad['coords'][0], $grad['coords'][1], $grad['coords'][2], $grad['coords'][3])); + $this->_out('/Function '.$f2.' 0 R'); + $this->_out('/Extend ['.$grad['extend'][0].' '.$grad['extend'][1].'] '); + $this->_out('>>'); + } + else if ($grad['type'] == 3) { + //x0, y0, r0, x1, y1, r1 + //at this this time radius of inner circle is 0 + $ir = 0; + if (isset($grad['coords'][5]) && $grad['coords'][5]) { $ir = $grad['coords'][5]; } + $this->_out(sprintf('/Coords [%.3F %.3F %.3F %.3F %.3F %.3F]', $grad['coords'][0], $grad['coords'][1], $ir, $grad['coords'][2], $grad['coords'][3], $grad['coords'][4])); + $this->_out('/Function '.$f2.' 0 R'); + $this->_out('/Extend ['.$grad['extend'][0].' '.$grad['extend'][1].'] '); + $this->_out('>>'); + } + else if ($grad['type']==6) { + $this->_out('/BitsPerCoordinate 16'); + $this->_out('/BitsPerComponent 8'); + $this->_out('/Decode[0 1 0 1 0 1]'); + $this->_out('/BitsPerFlag 8'); + $this->_out('/Length '.strlen($grad['stream_trans'])); + $this->_out('>>'); + $this->_putstream($grad['stream_trans']); + } + $this->_out('endobj'); + + $this->gradients[$transid]['id'] = $this->n; + $this->_newobj(); + $this->_out('<< /Type /Pattern /PatternType 2'); + $this->_out('/Shading '.$this->gradients[$transid]['id'].' 0 R'); + $this->_out('>>'); + $this->_out('endobj'); + $this->gradients[$transid]['pattern'] = $this->n; + $this->_newobj(); + // Need to extend size of viewing box in case of transformations + $str = 'q /a0 gs /Pattern cs /p'.$transid.' scn -'.($this->wPt/2).' -'.($this->hPt/2).' '.(2*$this->wPt).' '.(2*$this->hPt).' re f Q'; + $filter=($this->compress) ? '/Filter /FlateDecode ' : ''; + $p=($this->compress) ? gzcompress($str) : $str; + $this->_out('<< /Type /XObject /Subtype /Form /FormType 1 '.$filter); + $this->_out('/Length '.strlen($p)); + $this->_out('/BBox [-'.($this->wPt/2).' -'.($this->hPt/2).' '.(2*$this->wPt).' '.(2*$this->hPt).']'); + $this->_out('/Group << /Type /Group /S /Transparency /CS /DeviceGray >>'); + $this->_out('/Resources <<'); + $this->_out('/ExtGState << /a0 << /ca 1 /CA 1 >> >>'); + $this->_out('/Pattern << /p'.$transid.' '.$this->gradients[$transid]['pattern'].' 0 R >>'); + $this->_out('>>'); + $this->_out('>>'); + $this->_putstream($p); + $this->_out('endobj'); + $this->_newobj(); + $this->_out('<< /Type /Mask /S /Luminosity /G '.($this->n - 1).' 0 R >>'."\n".'endobj'); + $this->_newobj(); + $this->_out('<< /Type /ExtGState /SMask '.($this->n - 1).' 0 R /AIS false >>'."\n".'endobj'); + if ($grad['fo']) { $this->extgstates[] = array('n' => $this->n, 'trans' => 'TGS'.$id, 'fo'=>true); } + else { $this->extgstates[] = array('n' => $this->n, 'trans' => 'TGS'.$id); } + } + } +} +/*-- END BACKGROUNDS --*/ + +function _putspotcolors() { + foreach($this->spotColors as $name=>$color) { + $this->_newobj(); + $this->_out('[/Separation /'.str_replace(' ','#20',$name)); + $this->_out('/DeviceCMYK <<'); + $this->_out('/Range [0 1 0 1 0 1 0 1] /C0 [0 0 0 0] '); + $this->_out(sprintf('/C1 [%.3F %.3F %.3F %.3F] ',$color['c']/100,$color['m']/100,$color['y']/100,$color['k']/100)); + $this->_out('/FunctionType 2 /Domain [0 1] /N 1>>]'); + $this->_out('endobj'); + $this->spotColors[$name]['n']=$this->n; + } +} + + +function _putresources() { + if ($this->hasOC || count($this->layers)) // mPDF 5.6.01 + $this->_putocg(); + $this->_putextgstates(); + $this->_putspotcolors(); + if ($this->progressBar) { $this->UpdateProgressBar(2,'40','Compiling Fonts'); } // *PROGRESS-BAR* + $this->_putfonts(); + if ($this->progressBar) { $this->UpdateProgressBar(2,'50','Compiling Images'); } // *PROGRESS-BAR* + $this->_putimages(); + $this->_putformobjects(); // *IMAGES-CORE* + +/*-- IMPORTS --*/ + if ($this->enableImports) { + $this->_putformxobjects(); + $this->_putimportedobjects(); + } +/*-- END IMPORTS --*/ + +/*-- BACKGROUNDS --*/ + $this->_putshaders(); + $this->_putpatterns(); +/*-- END BACKGROUNDS --*/ + + + //Resource dictionary + $this->offsets[2]=strlen($this->buffer); + $this->_out('2 0 obj'); + $this->_out('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'); + + $this->_out('/Font <<'); + foreach($this->fonts as $font) { + if (!$font['used'] && $font['type']=='TTF') { continue; } + if ($font['type']=='TTF' && ($font['sip'] || $font['smp'])) { + foreach($font['n'] AS $k => $fid) { + $this->_out('/F'.$font['subsetfontids'][$k].' '.$font['n'][$k].' 0 R'); + } + } + else { + $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R'); + } + } + $this->_out('>>'); + + if (count($this->spotColors)) { + $this->_out('/ColorSpace <<'); + foreach($this->spotColors as $color) + $this->_out('/CS'.$color['i'].' '.$color['n'].' 0 R'); + $this->_out('>>'); + } + + if (count($this->extgstates)) { + $this->_out('/ExtGState <<'); + foreach($this->extgstates as $k=>$extgstate) + if (isset($extgstate['trans'])) $this->_out('/'.$extgstate['trans'].' '.$extgstate['n'].' 0 R'); + else $this->_out('/GS'.$k.' '.$extgstate['n'].' 0 R'); + $this->_out('>>'); + } + +/*-- BACKGROUNDS --*/ + if (isset($this->gradients) AND (count($this->gradients) > 0)) { + $this->_out('/Shading <<'); + foreach ($this->gradients as $id => $grad) { + $this->_out('/Sh'.$id.' '.$grad['id'].' 0 R'); + } + $this->_out('>>'); + +/* + // ??? Not needed !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + $this->_out('/Pattern <<'); + foreach ($this->gradients as $id => $grad) { + $this->_out('/P'.$id.' '.$grad['pattern'].' 0 R'); + } + $this->_out('>>'); +*/ + } +/*-- END BACKGROUNDS --*/ + + if(count($this->images) || count($this->formobjects) || ($this->enableImports && count($this->tpls))) { + $this->_out('/XObject <<'); + foreach($this->images as $image) + $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R'); + foreach($this->formobjects as $formobject) + $this->_out('/FO'.$formobject['i'].' '.$formobject['n'].' 0 R'); +/*-- IMPORTS --*/ + if ($this->enableImports && count($this->tpls)) { + foreach($this->tpls as $tplidx => $tpl) { + $this->_out($this->tplprefix.$tplidx.' '.$tpl['n'].' 0 R'); + } + } +/*-- END IMPORTS --*/ + $this->_out('>>'); + } + +/*-- BACKGROUNDS --*/ + + if (count($this->patterns)) { + $this->_out('/Pattern <<'); + foreach($this->patterns as $k=>$patterns) + $this->_out('/P'.$k.' '.$patterns['n'].' 0 R'); + $this->_out('>>'); + } +/*-- END BACKGROUNDS --*/ + + // mPDF 5.6.01 + if ($this->hasOC || count($this->layers)) { + $this->_out('/Properties <<'); + if ($this->hasOC) { + $this->_out('/OC1 '.$this->n_ocg_print.' 0 R /OC2 '.$this->n_ocg_view.' 0 R /OC3 '.$this->n_ocg_hidden.' 0 R '); + } + if (count($this->layers)) { + foreach($this->layers as $id=>$layer) + $this->_out('/ZI'.$id.' '.$layer['n'].' 0 R'); + } + $this->_out('>>'); + } + + $this->_out('>>'); + $this->_out('endobj'); // end resource dictionary + + $this->_putbookmarks(); // *BOOKMARKS* + + if (isset($this->js) && $this->js) { + $this->_putjavascript(); + } + +/*-- ENCRYPTION --*/ + if ($this->encrypted) { + $this->_newobj(); + $this->enc_obj_id = $this->n; + $this->_out('<<'); + $this->_putencryption(); + $this->_out('>>'); + $this->_out('endobj'); + } +/*-- END ENCRYPTION --*/ +} + + +function _putjavascript() { + $this->_newobj(); + $this->n_js = $this->n; + $this->_out('<<'); + $this->_out('/Names [(EmbeddedJS) '.(1 + $this->n).' 0 R ]'); + $this->_out('>>'); + $this->_out('endobj'); + + $this->_newobj(); + $this->_out('<<'); + $this->_out('/S /JavaScript'); + $this->_out('/JS '.$this->_textstring($this->js)); + $this->_out('>>'); + $this->_out('endobj'); +} + + + + +/*-- ENCRYPTION --*/ +function _putencryption() { + $this->_out('/Filter /Standard'); + if ($this->useRC128encryption) { + $this->_out('/V 2'); + $this->_out('/R 3'); + $this->_out('/Length 128'); + } + else { + $this->_out('/V 1'); + $this->_out('/R 2'); + } + $this->_out('/O ('.$this->_escape($this->Ovalue).')'); + $this->_out('/U ('.$this->_escape($this->Uvalue).')'); + $this->_out('/P '.$this->Pvalue); +} +/*-- END ENCRYPTION --*/ + +function _puttrailer() { + $this->_out('/Size '.($this->n+1)); + $this->_out('/Root '.$this->n.' 0 R'); + $this->_out('/Info '.$this->InfoRoot.' 0 R'); +/*-- ENCRYPTION --*/ + if ($this->encrypted) { + $this->_out('/Encrypt '.$this->enc_obj_id.' 0 R'); + $this->_out('/ID [<'.$this->uniqid.'> <'.$this->uniqid.'>]'); + } + else { +/*-- END ENCRYPTION --*/ + $uniqid = md5(time() . $this->buffer); + $this->_out('/ID [<'.$uniqid.'> <'.$uniqid.'>]'); +/*-- ENCRYPTION --*/ + } +/*-- END ENCRYPTION --*/ +} + +/*-- ENCRYPTION --*/ +function SetProtection($permissions=array(),$user_pass='',$owner_pass=null, $length=40) { + $this->encrypted=false; + if (is_string($permissions) && strlen($permissions)>0) { $permissions = array($permissions); } + else if (!is_array($permissions)) { return 0; } + $this->last_rc4_key=''; + $this->padding="\x28\xBF\x4E\x5E\x4E\x75\x8A\x41\x64\x00\x4E\x56\xFF\xFA\x01\x08". + "\x2E\x2E\x00\xB6\xD0\x68\x3E\x80\x2F\x0C\xA9\xFE\x64\x53\x69\x7A"; + + $options = array( + 'print' => 4, // bit 3 + 'modify' => 8, // bit 4 + 'copy' => 16, // bit 5 + 'annot-forms' => 32, // bit 6 + 'fill-forms' => 256, // bit 9 + 'extract' => 512, // bit 10 + 'assemble' => 1024,// bit 11 + 'print-highres' => 2048 // bit 12 + ); + // bit 31 = 1073741824 + // bit 32 = 2147483648 + // bits 13-31 = 2147479552 + // bits 13-32 = 4294963200 + 192 = 4294963392 + $protection = 4294963392; // bits 7,8,13-32 + foreach ($permissions as $permission) { + if (!isset($options[$permission])) + $this->Error('Incorrect permission: '.$permission); + if ($options[$permission] > 32) { $this->useRC128encryption = true; } + if (isset($options[$permission])) $protection += $options[$permission]; + } + if ($length==128) { $this->useRC128encryption = true; } + if ($owner_pass === null) + $owner_pass = uniqid(rand()); + $this->encrypted = true; + $this->_generateencryptionkey($user_pass, $owner_pass, $protection); +} + + +// Compute key depending on object number where the encrypted data is stored +function _objectkey($n) { + if ($this->useRC128encryption) + $len = 16; + else + $len = 10; + return substr($this->_md5_16($this->encryption_key.pack('VXxx',$n)),0,$len); +} + +// RC4 is the standard encryption algorithm used in PDF format +function _RC4($key, $text) { + if ($this->last_rc4_key != $key) { + $k = str_repeat($key, 256/strlen($key)+1); + $rc4 = range(0,255); + $j = 0; + for ($i=0; $i<256; $i++){ + $t = $rc4[$i]; + $j = ($j + $t + ord($k[$i])) % 256; + $rc4[$i] = $rc4[$j]; + $rc4[$j] = $t; + } + $this->last_rc4_key = $key; + $this->last_rc4_key_c = $rc4; + } else { + $rc4 = $this->last_rc4_key_c; + } + + $len = strlen($text); + $a = 0; + $b = 0; + $out = ''; + for ($i=0; $i<$len; $i++){ + $a = ($a+1)%256; + $t= $rc4[$a]; + $b = ($b+$t)%256; + $rc4[$a] = $rc4[$b]; + $rc4[$b] = $t; + $k = $rc4[($rc4[$a]+$rc4[$b])%256]; + $out.= chr(ord($text[$i]) ^ $k); + } + return $out; +} + +// Get MD5 as binary string +function _md5_16($string) { + return pack('H*',md5($string)); +} + +// Compute O value +function _Ovalue($user_pass, $owner_pass) { + $tmp = $this->_md5_16($owner_pass); + if ($this->useRC128encryption) { + for ($i = 0; $i < 50; ++$i) { + $tmp = $this->_md5_16($tmp); + } + } + if ($this->useRC128encryption) + $keybytelen = (128 / 8); + else + $keybytelen = (40 / 8); + $owner_RC4_key = substr($tmp,0,$keybytelen); + $enc = $this->_RC4($owner_RC4_key, $user_pass); + if ($this->useRC128encryption) { + $len = strlen($owner_RC4_key); + for ($i = 1; $i <= 19; ++$i) { + $key = ''; + for ($j = 0; $j < $len; ++$j) { + $key .= chr(ord($owner_RC4_key{$j}) ^ $i); + } + $enc = $this->_RC4($key, $enc); + } + } + return $enc; +} + +// Compute U value +function _Uvalue() { + if ($this->useRC128encryption) { + $tmp = $this->_md5_16($this->padding.$this->_hexToString($this->uniqid)); + $enc = $this->_RC4($this->encryption_key, $tmp); + $len = strlen($tmp); + for ($i=1; $i<=19; ++$i) { + $key = ''; + for ($j=0; $j<$len; ++$j) { + $key .= chr(ord($this->encryption_key{$j}) ^ $i); + } + $enc = $this->_RC4($key, $enc); + } + $enc .= str_repeat("\x00", 16); + return substr($enc, 0, 32); + } + else { + return $this->_RC4($this->encryption_key, $this->padding); + } +} + +// Compute encryption key +function _generateencryptionkey($user_pass, $owner_pass, $protection) { + // Pad passwords + $user_pass = substr($user_pass.$this->padding,0,32); + $owner_pass = substr($owner_pass.$this->padding,0,32); + $chars = 'ABCDEF1234567890'; + $id = ''; + for ($i=0; $i<32; $i++) { $id .= $chars{rand(0, 15)}; } + $this->uniqid = md5($id); + // Compute O value + $this->Ovalue = $this->_Ovalue($user_pass,$owner_pass); + // Compute encyption key + if ($this->useRC128encryption) + $keybytelen = (128/8); + else + $keybytelen = (40/8); + $prot = sprintf('%032b', $protection); + $perms = chr(bindec(substr($prot,24,8))); + $perms .= chr(bindec(substr($prot,16,8))); + $perms .= chr(bindec(substr($prot,8,8))); + $perms .= chr(bindec(substr($prot,0,8))); + $tmp = $this->_md5_16($user_pass.$this->Ovalue.$perms.$this->_hexToString($this->uniqid)); + if ($this->useRC128encryption) { + for ($i=0; $i<50; ++$i) { + $tmp = $this->_md5_16(substr($tmp, 0, $keybytelen)); + } + } + $this->encryption_key = substr($tmp,0,$keybytelen); + // Compute U value + $this->Uvalue = $this->_Uvalue(); + // Compute P value + $this->Pvalue = $protection; +} + + +function _hexToString($hs) { + $s = ''; + $len = strlen($hs); + if (($len % 2) != 0) { + $hs .= '0'; + ++$len; + } + for ($i = 0; $i < $len; $i += 2) { + $s .= chr(hexdec($hs{$i}.$hs{($i + 1)})); + } + return $s; +} + +/*-- END ENCRYPTION --*/ + +//========================================= +/*-- BOOKMARKS --*/ +// FROM class PDF_Bookmark + +function Bookmark($txt,$level=0,$y=0) { + $txt = $this->purify_utf8_text($txt); + if ($this->text_input_as_HTML) { + $txt = $this->all_entities_to_utf8($txt); + } + if($y==-1) { + if (!$this->ColActive){ $y=$this->y; } + else { $y = $this->y0; } // If columns are on - mark top of columns + } + // else y is used as set, or =0 i.e. top of page + // DIRECTIONALITY RTL + $bmo = array('t'=>$txt,'l'=>$level,'y'=>$y,'p'=>$this->page); + if ($this->keep_block_together) { + $this->ktBMoutlines[]= $bmo; + } +/*-- TABLES --*/ + else if ($this->table_rotate) { + $this->tbrot_BMoutlines[]= $bmo; + } + else if ($this->kwt) { + $this->kwt_BMoutlines[]= $bmo; + } +/*-- END TABLES --*/ + else if ($this->ColActive) { // *COLUMNS* + $this->col_BMoutlines[]= $bmo; // *COLUMNS* + } // *COLUMNS* + else { + $this->BMoutlines[]= $bmo; + } +} + + +function _putbookmarks() +{ + $nb=count($this->BMoutlines); + if($nb==0) + return; + + // mPDF 5.6.36 + $bmo = $this->BMoutlines; + $this->BMoutlines = array(); + $lastlevel = -1; + for($i=0;$i<count($bmo);$i++) { + if ($bmo[$i]['l']>0) { + while($bmo[$i]['l']-$lastlevel > 1) { // If jump down more than one level, insert a new entry + $new = $bmo[$i]; + $new['t']="[".$new['t']."]"; // Put [] around text/title to highlight + $new['l']=$lastlevel+1; + $lastlevel++; + $this->BMoutlines[] = $new; + } + } + $this->BMoutlines[] = $bmo[$i]; + $lastlevel = $bmo[$i]['l']; + } + $nb=count($this->BMoutlines); + + $lru=array(); + $level=0; + foreach($this->BMoutlines as $i=>$o) { + if($o['l']>0) { + $parent=$lru[$o['l']-1]; + //Set parent and last pointers + $this->BMoutlines[$i]['parent']=$parent; + $this->BMoutlines[$parent]['last']=$i; + if($o['l']>$level) { + //Level increasing: set first pointer + $this->BMoutlines[$parent]['first']=$i; + } + } + else { + $this->BMoutlines[$i]['parent']=$nb; + } + if($o['l']<=$level and $i>0) { + //Set prev and next pointers + $prev=$lru[$o['l']]; + $this->BMoutlines[$prev]['next']=$i; + $this->BMoutlines[$i]['prev']=$prev; + } + $lru[$o['l']]=$i; + $level=$o['l']; + } + + + //Outline items + $n=$this->n+1; + foreach($this->BMoutlines as $i=>$o) { + $this->_newobj(); + $this->_out('<</Title '.$this->_UTF16BEtextstring($o['t'])); + $this->_out('/Parent '.($n+$o['parent']).' 0 R'); + if(isset($o['prev'])) + $this->_out('/Prev '.($n+$o['prev']).' 0 R'); + if(isset($o['next'])) + $this->_out('/Next '.($n+$o['next']).' 0 R'); + if(isset($o['first'])) + $this->_out('/First '.($n+$o['first']).' 0 R'); + if(isset($o['last'])) + $this->_out('/Last '.($n+$o['last']).' 0 R'); + + + if (isset($this->pageDim[$o['p']]['h'])) { $h=$this->pageDim[$o['p']]['h']; } + else { $h = 0; } + + $this->_out(sprintf('/Dest [%d 0 R /XYZ 0 %.3F null]',1+2*($o['p']),($h-$o['y'])*_MPDFK)); + if (isset($this->bookmarkStyles) && isset($this->bookmarkStyles[$o['l']])) { + // font style + $bms = $this->bookmarkStyles[$o['l']]['style']; + $style = 0; + if (strpos($bms,'B') !== false) { $style += 2; } + if (strpos($bms,'I') !== false) { $style += 1; } + $this->_out(sprintf('/F %d', $style)); + // Colour + $col = $this->bookmarkStyles[$o['l']]['color']; + if (isset($col) && is_array($col) && count($col)==3) { + $this->_out(sprintf('/C [%.3F %.3F %.3F]', ($col[0]/255), ($col[1]/255), ($col[2]/255))); + } + } + + $this->_out('/Count 0>>'); + $this->_out('endobj'); + } + //Outline root + $this->_newobj(); + $this->OutlineRoot=$this->n; + $this->_out('<</Type /BMoutlines /First '.$n.' 0 R'); + $this->_out('/Last '.($n+$lru[0]).' 0 R>>'); + $this->_out('endobj'); +} +/*-- END BOOKMARKS --*/ + + + +//====================================================== + + +// DEPRACATED but included for backwards compatability +function startPageNums() { +} + +//====================================================== +/*-- TOC --*/ +// ToC TABLE OF CONTENTS + +// Initiate, and Mark a place for the Table of Contents to be inserted +function TOC($tocfont='', $tocfontsize=0, $tocindent=0, $resetpagenum='', $pagenumstyle='', $suppress='', $toc_orientation='', $TOCusePaging=true, $TOCuseLinking=false, $toc_id=0, $tocoutdent='') { // mPDF 5.6.19 + if (!class_exists('tocontents', false)) { include(_MPDF_PATH.'classes/tocontents.php'); } + if (empty($this->tocontents)) { $this->tocontents = new tocontents($this); } + $this->tocontents->TOC($tocfont, $tocfontsize, $tocindent, $resetpagenum, $pagenumstyle, $suppress, $toc_orientation, $TOCusePaging, $TOCuseLinking, $toc_id, $tocoutdent); // mPDF 5.6.19 +} + + +function TOCpagebreakByArray($a) { + if (!is_array($a)) { $a = array(); } + if (!class_exists('tocontents', false)) { include(_MPDF_PATH.'classes/tocontents.php'); } + if (empty($this->tocontents)) { $this->tocontents = new tocontents($this); } + $tocoutdent = (isset($a['tocoutdent']) ? $a['tocoutdent'] : (isset($a['outdent']) ? $a['outdent'] : '')); + $TOCusePaging = (isset($a['TOCusePaging']) ? $a['TOCusePaging'] : (isset($a['paging']) ? $a['paging'] : true)); + $TOCuseLinking = (isset($a['TOCuseLinking']) ? $a['TOCuseLinking'] : (isset($a['links']) ? $a['links'] : '')); + $toc_orientation = (isset($a['toc_orientation']) ? $a['toc_orientation'] : (isset($a['toc-orientation']) ? $a['toc-orientation'] : '')); + $toc_mgl = (isset($a['toc_mgl']) ? $a['toc_mgl'] : (isset($a['toc-margin-left']) ? $a['toc-margin-left'] : '')); + $toc_mgr = (isset($a['toc_mgr']) ? $a['toc_mgr'] : (isset($a['toc-margin-right']) ? $a['toc-margin-right'] : '')); + $toc_mgt = (isset($a['toc_mgt']) ? $a['toc_mgt'] : (isset($a['toc-margin-top']) ? $a['toc-margin-top'] : '')); + $toc_mgb = (isset($a['toc_mgb']) ? $a['toc_mgb'] : (isset($a['toc-margin-bottom']) ? $a['toc-margin-bottom'] : '')); + $toc_mgh = (isset($a['toc_mgh']) ? $a['toc_mgh'] : (isset($a['toc-margin-header']) ? $a['toc-margin-header'] : '')); + $toc_mgf = (isset($a['toc_mgf']) ? $a['toc_mgf'] : (isset($a['toc-margin-footer']) ? $a['toc-margin-footer'] : '')); + $toc_ohname = (isset($a['toc_ohname']) ? $a['toc_ohname'] : (isset($a['toc-odd-header-name']) ? $a['toc-odd-header-name'] : '')); + $toc_ehname = (isset($a['toc_ehname']) ? $a['toc_ehname'] : (isset($a['toc-even-header-name']) ? $a['toc-even-header-name'] : '')); + $toc_ofname = (isset($a['toc_ofname']) ? $a['toc_ofname'] : (isset($a['toc-odd-footer-name']) ? $a['toc-odd-footer-name'] : '')); + $toc_efname = (isset($a['toc_efname']) ? $a['toc_efname'] : (isset($a['toc-even-footer-name']) ? $a['toc-even-footer-name'] : '')); + $toc_ohvalue = (isset($a['toc_ohvalue']) ? $a['toc_ohvalue'] : (isset($a['toc-odd-header-value']) ? $a['toc-odd-header-value'] : 0)); + $toc_ehvalue = (isset($a['toc_ehvalue']) ? $a['toc_ehvalue'] : (isset($a['toc-even-header-value']) ? $a['toc-even-header-value'] : 0)); + $toc_ofvalue = (isset($a['toc_ofvalue']) ? $a['toc_ofvalue'] : (isset($a['toc-odd-footer-value']) ? $a['toc-odd-footer-value'] : 0)); + $toc_efvalue = (isset($a['toc_efvalue']) ? $a['toc_efvalue'] : (isset($a['toc-even-footer-value']) ? $a['toc-even-footer-value'] : 0)); + $toc_preHTML = (isset($a['toc_preHTML']) ? $a['toc_preHTML'] : (isset($a['toc-preHTML']) ? $a['toc-preHTML'] : '')); + $toc_postHTML = (isset($a['toc_postHTML']) ? $a['toc_postHTML'] : (isset($a['toc-postHTML']) ? $a['toc-postHTML'] : '')); + $toc_bookmarkText = (isset($a['toc_bookmarkText']) ? $a['toc_bookmarkText'] : (isset($a['toc-bookmarkText']) ? $a['toc-bookmarkText'] : '')); + $resetpagenum = (isset($a['resetpagenum']) ? $a['resetpagenum'] : ''); + $pagenumstyle = (isset($a['pagenumstyle']) ? $a['pagenumstyle'] : ''); + $suppress = (isset($a['suppress']) ? $a['suppress'] : ''); + $orientation = (isset($a['orientation']) ? $a['orientation'] : ''); + $mgl = (isset($a['mgl']) ? $a['mgl'] : (isset($a['margin-left']) ? $a['margin-left'] : '')); + $mgr = (isset($a['mgr']) ? $a['mgr'] : (isset($a['margin-right']) ? $a['margin-right'] : '')); + $mgt = (isset($a['mgt']) ? $a['mgt'] : (isset($a['margin-top']) ? $a['margin-top'] : '')); + $mgb = (isset($a['mgb']) ? $a['mgb'] : (isset($a['margin-bottom']) ? $a['margin-bottom'] : '')); + $mgh = (isset($a['mgh']) ? $a['mgh'] : (isset($a['margin-header']) ? $a['margin-header'] : '')); + $mgf = (isset($a['mgf']) ? $a['mgf'] : (isset($a['margin-footer']) ? $a['margin-footer'] : '')); + $ohname = (isset($a['ohname']) ? $a['ohname'] : (isset($a['odd-header-name']) ? $a['odd-header-name'] : '')); + $ehname = (isset($a['ehname']) ? $a['ehname'] : (isset($a['even-header-name']) ? $a['even-header-name'] : '')); + $ofname = (isset($a['ofname']) ? $a['ofname'] : (isset($a['odd-footer-name']) ? $a['odd-footer-name'] : '')); + $efname = (isset($a['efname']) ? $a['efname'] : (isset($a['even-footer-name']) ? $a['even-footer-name'] : '')); + $ohvalue = (isset($a['ohvalue']) ? $a['ohvalue'] : (isset($a['odd-header-value']) ? $a['odd-header-value'] : 0)); + $ehvalue = (isset($a['ehvalue']) ? $a['ehvalue'] : (isset($a['even-header-value']) ? $a['even-header-value'] : 0)); + $ofvalue = (isset($a['ofvalue']) ? $a['ofvalue'] : (isset($a['odd-footer-value']) ? $a['odd-footer-value'] : 0)); + $efvalue = (isset($a['efvalue']) ? $a['efvalue'] : (isset($a['even-footer-value']) ? $a['even-footer-value'] : 0)); + $toc_id = (isset($a['toc_id']) ? $a['toc_id'] : (isset($a['name']) ? $a['name'] : 0)); + $pagesel = (isset($a['pagesel']) ? $a['pagesel'] : (isset($a['pageselector']) ? $a['pageselector'] : '')); + $toc_pagesel = (isset($a['toc_pagesel']) ? $a['toc_pagesel'] : (isset($a['toc-pageselector']) ? $a['toc-pageselector'] : '')); + $sheetsize = (isset($a['sheetsize']) ? $a['sheetsize'] : (isset($a['sheet-size']) ? $a['sheet-size'] : '')); + $toc_sheetsize = (isset($a['toc_sheetsize']) ? $a['toc_sheetsize'] : (isset($a['toc-sheet-size']) ? $a['toc-sheet-size'] : '')); + + $this->TOCpagebreak($tocfont, $tocfontsize, $tocindent, $TOCusePaging, $TOCuseLinking, $toc_orientation, $toc_mgl, $toc_mgr, $toc_mgt, $toc_mgb, $toc_mgh, $toc_mgf, $toc_ohname, $toc_ehname, $toc_ofname, $toc_efname, $toc_ohvalue, $toc_ehvalue, $toc_ofvalue, $toc_efvalue, $toc_preHTML, $toc_postHTML, $toc_bookmarkText, $resetpagenum, $pagenumstyle, $suppress, $orientation, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue, $toc_id, $pagesel, $toc_pagesel, $sheetsize, $toc_sheetsize, $tocoutdent); // mPDF 5.6.19 + +} + +function TOCpagebreak($tocfont='', $tocfontsize='', $tocindent='', $TOCusePaging=true, $TOCuseLinking='', $toc_orientation='', $toc_mgl='',$toc_mgr='',$toc_mgt='',$toc_mgb='',$toc_mgh='',$toc_mgf='',$toc_ohname='',$toc_ehname='',$toc_ofname='',$toc_efname='',$toc_ohvalue=0,$toc_ehvalue=0,$toc_ofvalue=0, $toc_efvalue=0, $toc_preHTML='', $toc_postHTML='', $toc_bookmarkText='', $resetpagenum='', $pagenumstyle='', $suppress='', $orientation='', $mgl='',$mgr='',$mgt='',$mgb='',$mgh='',$mgf='',$ohname='',$ehname='',$ofname='',$efname='',$ohvalue=0,$ehvalue=0,$ofvalue=0,$efvalue=0, $toc_id=0, $pagesel='', $toc_pagesel='', $sheetsize='', $toc_sheetsize='', $tocoutdent='') { // mPDF 5.6.19) { + if (!class_exists('tocontents', false)) { include(_MPDF_PATH.'classes/tocontents.php'); } + if (empty($this->tocontents)) { $this->tocontents = new tocontents($this); } + //Start a new page + if($this->state==0) $this->AddPage(); + if ($this->y == $this->tMargin && (!$this->mirrorMargins ||($this->mirrorMargins && $this->page % 2==1))) { + // Don't add a page + if ($this->page==1 && count($this->PageNumSubstitutions)==0) { + if (!$suppress) { $suppress = 'off'; } + if (!$resetpagenum) { $resetpagenum= 1; } + //$this->PageNumSubstitutions[] = array('from'=>1, 'reset'=> $resetpagenum, 'type'=>$pagenumstyle, 'suppress'=> $suppress); + } + $this->PageNumSubstitutions[] = array('from'=>$this->page, 'reset'=> $resetpagenum, 'type'=>$pagenumstyle, 'suppress'=> $suppress); + } + else { + $this->AddPage($orientation,'NEXT-ODD', $resetpagenum, $pagenumstyle, $suppress,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf,$ohname,$ehname,$ofname,$efname,$ohvalue,$ehvalue,$ofvalue,$efvalue,$pagesel,$sheetsize); + } + + $this->tocontents->TOCpagebreak($tocfont, $tocfontsize, $tocindent, $TOCusePaging, $TOCuseLinking, $toc_orientation, $toc_mgl, $toc_mgr, $toc_mgt, $toc_mgb, $toc_mgh, $toc_mgf, $toc_ohname, $toc_ehname, $toc_ofname, $toc_efname, $toc_ohvalue, $toc_ehvalue, $toc_ofvalue, $toc_efvalue, $toc_preHTML, $toc_postHTML, $toc_bookmarkText, $resetpagenum, $pagenumstyle, $suppress, $orientation, $mgl, $mgr, $mgt, $mgb, $mgh, $mgf, $ohname, $ehname, $ofname, $efname, $ohvalue, $ehvalue, $ofvalue, $efvalue, $toc_id, $pagesel, $toc_pagesel, $sheetsize, $toc_sheetsize, $tocoutdent); // mPDF 5.6.19 +} + +function TOC_Entry($txt, $level=0, $toc_id=0) { + $txt = $this->purify_utf8_text($txt); + if ($this->text_input_as_HTML) { + $txt = $this->all_entities_to_utf8($txt); + } + if ($this->usingCoreFont) { $txt = mb_convert_encoding($txt,$this->mb_enc,'UTF-8'); } + if ($this->ColActive) { $ily = $this->y0; } else { $ily = $this->y; } // use top of columns + + // mPDF 5.6.19 mPDF 5.6.25 mPDF 5.6.37 + if (!class_exists('tocontents', false)) { include(_MPDF_PATH.'classes/tocontents.php'); } + if (empty($this->tocontents)) { $this->tocontents = new tocontents($this); } + $linkn = $this->AddLink(); + $uid = '__mpdfinternallink_' . $linkn ; + if ($this->keep_block_together) { $this->internallink[$uid] = array("Y"=>$ily,"PAGE"=>$this->page, "kt"=>true ); } + else if ($this->table_rotate) { $this->internallink[$uid] = array("Y"=>$ily,"PAGE"=>$this->page, "tbrot"=>true ); } + else if ($this->kwt) { $this->internallink[$uid] = array("Y"=>$ily,"PAGE"=>$this->page, "kwt"=>true ); } + else if ($this->ColActive) { $this->internallink[$uid] = array("Y"=>$ily,"PAGE"=>$this->page, "col"=>$this->CurrCol ); } + else $this->internallink[$uid] = array("Y"=>$ily,"PAGE"=>$this->page ); + $this->internallink['#'.$uid] = $linkn; + $this->SetLink($linkn,$ily,$this->page); + +/*-- RTL --*/ + if ($this->biDirectional) { + $txt = preg_replace("/([".$this->pregRTLchars."]+)/ue", '$this->ArabJoin(stripslashes(\'\\1\'))', $txt ); + } +/*-- END RTL --*/ + if (strtoupper($toc_id)=='ALL') { $toc_id = '_mpdf_all'; } + else if (!$toc_id) { $toc_id = 0; } + else { $toc_id = strtolower($toc_id); } + $btoc = array('t'=>$txt,'l'=>$level,'p'=>$this->page, 'link'=>$linkn, 'toc_id'=>$toc_id); + if ($this->keep_block_together) { + $this->_kttoc[]= $btoc; + } +/*-- TABLES --*/ + else if ($this->table_rotate) { + $this->tbrot_toc[]= $btoc; + } + else if ($this->kwt) { + $this->kwt_toc[]= $btoc; + } +/*-- END TABLES --*/ + else if ($this->ColActive) { // *COLUMNS* + $this->col_toc[]= $btoc; // *COLUMNS* + } // *COLUMNS* + else { + $this->tocontents->_toc[]= $btoc; + } +} + +/*-- END TOC --*/ + +//====================================================== +function MovePages($target_page, $start_page, $end_page=-1) { + // move a page/pages EARLIER in the document + if ($end_page<1) { $end_page = $start_page; } + $n_toc = $end_page - $start_page + 1; + + // Set/Update PageNumSubstitutions changes before moving anything + if (count($this->PageNumSubstitutions)) { + $tp_present = false; + $sp_present = false; + $ep_present = false; + foreach($this->PageNumSubstitutions AS $k=>$v) { + if ($this->PageNumSubstitutions[$k]['from']==$target_page) { + $tp_present = true; + if ($this->PageNumSubstitutions[$k]['suppress']!='on' && $this->PageNumSubstitutions[$k]['suppress']!=1) { + $this->PageNumSubstitutions[$k]['suppress']='off'; + } + } + if ($this->PageNumSubstitutions[$k]['from']==$start_page) { + $sp_present = true; + if ($this->PageNumSubstitutions[$k]['suppress']!='on' && $this->PageNumSubstitutions[$k]['suppress']!=1) { + $this->PageNumSubstitutions[$k]['suppress']='off'; + } + } + if ($this->PageNumSubstitutions[$k]['from']==($end_page+1)) { + $ep_present = true; + if ($this->PageNumSubstitutions[$k]['suppress']!='on' && $this->PageNumSubstitutions[$k]['suppress']!=1) { + $this->PageNumSubstitutions[$k]['suppress']='off'; + } + } + } + + if (!$tp_present) { + list($tp_type, $tp_suppress, $tp_reset) = $this->docPageSettings($target_page); + } + if (!$sp_present) { + list($sp_type, $sp_suppress, $sp_reset) = $this->docPageSettings($start_page); + } + if (!$ep_present) { + list($ep_type, $ep_suppress, $ep_reset) = $this->docPageSettings($start_page-1); + } + + } + + $last = array(); + //store pages + for($i = $start_page;$i <= $end_page ;$i++) + $last[]=$this->pages[$i]; + //move pages + for($i=$start_page - 1;$i>=($target_page);$i--) { + $this->pages[$i+$n_toc]=$this->pages[$i]; + } + //Put toc pages at insert point + for($i = 0;$i < $n_toc;$i++) { + $this->pages[$target_page + $i]=$last[$i]; + } + +/*-- BOOKMARKS --*/ + // Update Bookmarks + foreach($this->BMoutlines as $i=>$o) { + if($o['p']>=$target_page) { + $this->BMoutlines[$i]['p'] += $n_toc; + } + } +/*-- END BOOKMARKS --*/ + + // Update Page Links + if (count($this->PageLinks)) { + $newarr = array(); + foreach($this->PageLinks as $i=>$o) { + foreach($this->PageLinks[$i] as $key => $pl) { + if (strpos($pl[4],'@')===0) { + $p=substr($pl[4],1); + if($p>=$start_page && $p<=$end_page) { + $this->PageLinks[$i][$key][4] = '@'.($p + ($target_page - $start_page)); + } + else if($p>=$target_page && $p<$start_page) { + $this->PageLinks[$i][$key][4] = '@'.($p+$n_toc); + } + } + } + if($i>=$start_page && $i<=$end_page) { + $newarr[($i + ($target_page - $start_page))] = $this->PageLinks[$i]; + } + else if($i>=$target_page && $i<$start_page) { + $newarr[($i + $n_toc)] = $this->PageLinks[$i]; + } + else { + $newarr[$i] = $this->PageLinks[$i]; + } + } + $this->PageLinks = $newarr; + } + + // OrientationChanges + if (count($this->OrientationChanges)) { + $newarr = array(); + foreach($this->OrientationChanges AS $p=>$v) { + if($p>=$start_page && $p<=$end_page) { $newarr[($p + ($target_page - $start_page))] = $this->OrientationChanges[$p]; } + else if($p>=$target_page && $p<$start_page) { $newarr[$p+$n_toc] = $this->OrientationChanges[$p]; } + else { $newarr[$p] = $this->OrientationChanges[$p]; } + } + ksort($newarr); + $this->OrientationChanges = $newarr; + } + + // Page Dimensions + if (count($this->pageDim)) { + $newarr = array(); + foreach($this->pageDim AS $p=>$v) { + if($p>=$start_page && $p<=$end_page) { $newarr[($p + ($target_page - $start_page))] = $this->pageDim[$p]; } + else if($p>=$target_page && $p<$start_page) { $newarr[$p+$n_toc] = $this->pageDim[$p]; } + else { $newarr[$p] = $this->pageDim[$p]; } + } + ksort($newarr); + $this->pageDim = $newarr; + } + + // HTML Headers & Footers + if (count($this->saveHTMLHeader)) { + $newarr = array(); + foreach($this->saveHTMLHeader AS $p=>$v) { + if($p>=$start_page && $p<=$end_page) { $newarr[($p + ($target_page - $start_page))] = $this->saveHTMLHeader[$p]; } + else if($p>=$target_page && $p<$start_page) { $newarr[$p+$n_toc] = $this->saveHTMLHeader[$p]; } + else { $newarr[$p] = $this->saveHTMLHeader[$p]; } + } + ksort($newarr); + $this->saveHTMLHeader = $newarr; + } + if (count($this->saveHTMLFooter)) { + $newarr = array(); + foreach($this->saveHTMLFooter AS $p=>$v) { + if($p>=$start_page && $p<=$end_page) { $newarr[($p + ($target_page - $start_page))] = $this->saveHTMLFooter[$p]; } + else if($p>=$target_page && $p<$start_page) { $newarr[$p+$n_toc] = $this->saveHTMLFooter[$p]; } + else { $newarr[$p] = $this->saveHTMLFooter[$p]; } + } + ksort($newarr); + $this->saveHTMLFooter = $newarr; + } + + // Update Internal Links + if (count($this->internallink)) { + foreach($this->internallink as $key=>$o) { + if($o['PAGE']>=$start_page && $o['PAGE']<=$end_page) { + $this->internallink[$key]['PAGE'] += ($target_page - $start_page); + } + else if($o['PAGE']>=$target_page && $o['PAGE']<$start_page) { + $this->internallink[$key]['PAGE'] += $n_toc; + } + } + } + + // Update Links + if (count($this->links)) { + foreach($this->links as $key=>$o) { + if($o[0]>=$start_page && $o[0]<=$end_page) { + $this->links[$key][0] += ($target_page - $start_page); + } + if($o[0]>=$target_page && $o[0]<$start_page) { + $this->links[$key][0] += $n_toc; + } + } + } + + // Update Form fields + if (count($this->form->forms)) { + foreach($this->form->forms as $key=>$f) { + if($f['page']>=$start_page && $f['page']<=$end_page) { + $this->form->forms[$key]['page'] += ($target_page - $start_page); + } + if($f['page']>=$target_page && $f['page']<$start_page) { + $this->form->forms[$key]['page'] += $n_toc; + } + } + } + +/*-- ANNOTATIONS --*/ + // Update Annotations + if (count($this->PageAnnots)) { + $newarr = array(); + foreach($this->PageAnnots as $p=>$anno) { + if($p>=$start_page && $p<=$end_page) { + $np = $p + ($target_page - $start_page); + foreach($anno as $o) { + $newarr[$np][] = $o; + } + } + else if($p>=$target_page && $p<$start_page) { + $np = $p + $n_toc; + foreach($anno as $o) { + $newarr[$np][] = $o; + } + } + else { + $newarr[$p] = $this->PageAnnots[$p]; + } + } + $this->PageAnnots = $newarr; + unset($newarr); + } +/*-- END ANNOTATIONS --*/ + + // Update PageNumSubstitutions + if (count($this->PageNumSubstitutions)) { + $newarr = array(); + foreach($this->PageNumSubstitutions AS $k=>$v) { + if($this->PageNumSubstitutions[$k]['from']>=$start_page && $this->PageNumSubstitutions[$k]['from']<=$end_page) { + $this->PageNumSubstitutions[$k]['from'] += ($target_page - $start_page); + $newarr[$this->PageNumSubstitutions[$k]['from']] = $this->PageNumSubstitutions[$k]; + } + else if($this->PageNumSubstitutions[$k]['from']>=$target_page && $this->PageNumSubstitutions[$k]['from']<$start_page) { + $this->PageNumSubstitutions[$k]['from'] += $n_toc; + $newarr[$this->PageNumSubstitutions[$k]['from']] = $this->PageNumSubstitutions[$k]; + } + else { + $newarr[$this->PageNumSubstitutions[$k]['from']] = $this->PageNumSubstitutions[$k]; + } + } + + if (!$sp_present) { + $newarr[$target_page] = array('from'=>$target_page, 'suppress'=>$sp_suppress, 'reset'=>$sp_reset, 'type'=>$sp_type); + } + if (!$tp_present) { + $newarr[($target_page + $n_toc)] = array('from'=>($target_page+$n_toc), 'suppress'=>$tp_suppress, 'reset'=>$tp_reset, 'type'=>$tp_type); + } + if (!$ep_present && $end_page>count($this->pages)) { + $newarr[($end_page+1)] = array('from'=>($end_page+1), 'suppress'=>$ep_suppress, 'reset'=>$ep_reset, 'type'=>$ep_type); + } + ksort($newarr); + $this->PageNumSubstitutions = array(); + foreach($newarr as $v) { + $this->PageNumSubstitutions[] = $v; + } + } +} + +//====================================================== +function DeletePages($start_page, $end_page=-1) { + // move a page/pages EARLIER in the document + if ($end_page<1) { $end_page = $start_page; } + $n_tod = $end_page - $start_page + 1; + $last_page = count($this->pages); + $n_atend = $last_page - $end_page + 1; + + //move pages + for($i=0;$i<$n_atend;$i++) { + $this->pages[$start_page+$i]=$this->pages[$end_page+1+$i]; + } + //delete pages + for($i = 0;$i < $n_tod ;$i++) + unset($this->pages[$last_page-$i]); + + +/*-- BOOKMARKS --*/ + // Update Bookmarks + foreach($this->BMoutlines as $i=>$o) { + if($o['p']>=$end_page) { $this->BMoutlines[$i]['p'] -= $n_tod; } + else if($p<$start_page) { unset($this->BMoutlines[$i]); } + } +/*-- END BOOKMARKS --*/ + + // Update Page Links + if (count($this->PageLinks)) { + $newarr = array(); + foreach($this->PageLinks as $i=>$o) { + foreach($this->PageLinks[$i] as $key => $pl) { + if (strpos($pl[4],'@')===0) { + $p=substr($pl[4],1); + if($p>$end_page) { $this->PageLinks[$i][$key][4] = '@'.($p - $n_tod); } + else if($p<$start_page) { unset($this->PageLinks[$i][$key]); } + } + } + if($i>$end_page) { $newarr[($i - $n_tod)] = $this->PageLinks[$i]; } + else if($p<$start_page) { $newarr[$i] = $this->PageLinks[$i]; } + } + $this->PageLinks = $newarr; + } + + // OrientationChanges + if (count($this->OrientationChanges)) { + $newarr = array(); + foreach($this->OrientationChanges AS $p=>$v) { + if($p>$end_page) { $newarr[($p - $t_tod)] = $this->OrientationChanges[$p]; } + else if($p<$start_page) { $newarr[$p] = $this->OrientationChanges[$p]; } + } + ksort($newarr); + $this->OrientationChanges = $newarr; + } + + // Page Dimensions + if (count($this->pageDim)) { + $newarr = array(); + foreach($this->pageDim AS $p=>$v) { + if($p>$end_page) { $newarr[($p - $n_tod)] = $this->pageDim[$p]; } + else if($p<$start_page) { $newarr[$p] = $this->pageDim[$p]; } + } + ksort($newarr); + $this->pageDim = $newarr; + } + + // HTML Headers & Footers + if (count($this->saveHTMLHeader)) { + foreach($this->saveHTMLHeader AS $p=>$v) { + if($p>end_page) { $newarr[($p - $n_tod)] = $this->saveHTMLHeader[$p]; } + else if($p<$start_page) { $newarr[$p] = $this->saveHTMLHeader[$p]; } + } + ksort($newarr); + $this->saveHTMLHeader = $newarr; + } + if (count($this->saveHTMLFooter)) { + $newarr = array(); + foreach($this->saveHTMLFooter AS $p=>$v) { + if($p>$end_page) { $newarr[($p - $n_tod)] = $this->saveHTMLFooter[$p]; } + else if($p<$start_page) { $newarr[$p] = $this->saveHTMLFooter[$p]; } + } + ksort($newarr); + $this->saveHTMLFooter = $newarr; + } + + // Update Internal Links + foreach($this->internallink as $key=>$o) { + if($o['PAGE']>$end_page) { $this->internallink[$key]['PAGE'] -= $n_tod; } + else if($o['PAGE']<$start_page) { unset($this->internallink[$key]); } + } + + // Update Links + foreach($this->links as $key=>$o) { + if($o[0]>$end_page) { $this->links[$key][0] -= $n_tod; } + else if($o[0]<$start_page) { unset($this->links[$key]); } + } + + // Update Form fields + foreach($this->form->forms as $key=>$f) { + if($f['page']>$end_page) { $this->form->forms[$key]['page'] -= $n_tod; } + else if($f['page']<$start_page) { unset($this->form->forms[$key]); } + } + +/*-- ANNOTATIONS --*/ + // Update Annotations + if (count($this->PageAnnots)) { + $newarr = array(); + foreach($this->PageAnnots as $p=>$anno) { + if($p>$end_page) { foreach($anno as $o) { $newarr[($p - $n_tod)][] = $o; } } + else if($p<$start_page) { $newarr[$p] = $this->PageAnnots[$p]; } + } + ksort($newarr); + $this->PageAnnots = $newarr; + } +/*-- END ANNOTATIONS --*/ + + // Update PageNumSubstitutions + foreach($this->PageNumSubstitutions AS $k=>$v) { + if($this->PageNumSubstitutions[$k]['from']>$end_page) { $this->PageNumSubstitutions[$k]['from'] -= $n_tod; } + else if($this->PageNumSubstitutions[$k]['from']<$start_page) { unset($this->PageNumSubstitutions[$k]); } + } + + unset($newarr); + $this->page = count($this->pages); +} + + +//====================================================== +/*-- INDEX --*/ +// FROM class PDF_Ref == INDEX + +function Reference($txt) { + $this->IndexEntry($txt); +} + + +function IndexEntry($txt, $xref='') { + if ($xref) { + $this->IndexEntrySee($txt,$xref); + return; + } + $txt = strip_tags($txt); + $txt = $this->purify_utf8_text($txt); + if ($this->text_input_as_HTML) { + $txt = $this->all_entities_to_utf8($txt); + } + if ($this->usingCoreFont) { $txt = mb_convert_encoding($txt,$this->mb_enc,'UTF-8'); } + + $Present=0; + $size=sizeof($this->Reference); + + if ($this->directionality == 'rtl') { // *RTL* + $txt = str_replace(':',' - ',$txt); // *RTL* + } // *RTL* + else { // *RTL* + $txt = str_replace(':',', ',$txt); + } // *RTL* + + + //Search the reference (AND Ref/PageNo) in the array + for ($i=0;$i<$size;$i++){ + if ($this->keep_block_together) { + if (isset($this->ktReference[$i]['t']) && $this->ktReference[$i]['t']==$txt){ + $Present=1; + if (!in_array($this->page,$this->ktReference[$i]['p'])) { + $this->ktReference[$i]['op'] = $this->page; + } + } + } +/*-- TABLES --*/ + else if ($this->table_rotate) { + if (isset($this->tbrot_Reference[$i]['t']) && $this->tbrot_Reference[$i]['t']==$txt){ + $Present=1; + if (!in_array($this->page,$this->tbrot_Reference[$i]['p'])) { + $this->tbrot_Reference[$i]['op'] = $this->page; + } + } + } + else if ($this->kwt) { + if (isset($this->kwt_Reference[$i]['t']) && $this->kwt_Reference[$i]['t']==$txt){ + $Present=1; + if (!in_array($this->page,$this->kwt_Reference[$i]['p'])) { + $this->kwt_Reference[$i]['op'] = $this->page; + } + } + } +/*-- END TABLES --*/ +/*-- COLUMNS --*/ + else if ($this->ColActive) { + if (isset($this->col_Reference[$i]['t']) && $this->col_Reference[$i]['t']==$txt){ + $Present=1; + if (!in_array($this->page,$this->col_Reference[$i]['p'])) { + $this->col_Reference[$i]['op'] = $this->page; + } + } + } +/*-- END COLUMNS --*/ + else { + if (isset($this->Reference[$i]['t']) && $this->Reference[$i]['t']==$txt){ + $Present=1; + if (!in_array($this->page,$this->Reference[$i]['p'])) { + $this->Reference[$i]['p'][] = $this->page; + } + } + } + } + //If not found, add it + if ($Present==0) { + $opr = array('t'=>$txt, 'op'=>$this->page); + if ($this->keep_block_together) { + $this->ktReference[]= $opr; + } +/*-- TABLES --*/ + else if ($this->table_rotate) { + $this->tbrot_Reference[]= $opr; + } + else if ($this->kwt) { + $this->kwt_Reference[]= $opr; + } +/*-- END TABLES --*/ +/*-- COLUMNS --*/ + else if ($this->ColActive) { + $this->col_Reference[]= $opr; + } +/*-- END COLUMNS --*/ + else { + $this->Reference[]=array('t'=>$txt,'p'=>array($this->page)); + } + } +} + +// Added function to add a reference "Elephants. See Chickens" +function ReferenceSee($txta,$txtb) { + $this->IndexEntrySee($txta,$txtb); +} + +function IndexEntrySee($txta,$txtb) { + $txta = strip_tags($txta); + $txtb = strip_tags($txtb); + $txta = $this->purify_utf8_text($txta); + $txtb = $this->purify_utf8_text($txtb); + if ($this->text_input_as_HTML) { + $txta = $this->all_entities_to_utf8($txta); + $txtb = $this->all_entities_to_utf8($txtb); + } + if ($this->usingCoreFont) { + $txta = mb_convert_encoding($txta,$this->mb_enc,'UTF-8'); + $txtb = mb_convert_encoding($txtb,$this->mb_enc,'UTF-8'); + } + if ($this->directionality == 'rtl') { // *RTL* + $txta = str_replace(':',' - ',$txta); // *RTL* + $txtb = str_replace(':',' - ',$txtb); // *RTL* + } // *RTL* + else { // *RTL* + $txta = str_replace(':',', ',$txta); + $txtb = str_replace(':',', ',$txtb); + } // *RTL* + $this->Reference[]=array('t'=>$txta.' - see '.$txtb,'p'=>array()); +} + +function CreateReference($NbCol=1, $reffontsize='', $linespacing='', $offset=3, $usedivletters=1, $divlettfontsize='', $gap=5, $reffont='',$divlettfont='', $useLinking=false) { + $this->CreateIndex($NbCol, $reffontsize, $linespacing, $offset, $usedivletters, $divlettfontsize, $gap, $reffont, $divlettfont, $useLinking); +} + +function CreateIndex($NbCol=1, $reffontsize='', $linespacing='', $offset=3, $usedivletters=1, $divlettfontsize='', $gap=5, $reffont='',$divlettfont='', $useLinking=false) { + if (!$reffontsize) { $reffontsize = $this->default_font_size; } + if (!$divlettfontsize) { $divlettfontsize = ($this->default_font_size * 1.8); } + if (!$reffont) { $reffont = $this->default_font; } + if (!$divlettfont) { $divlettfont = $reffont; } + if (!$linespacing) { $linespacing= $this->default_lineheight_correction; } + if ($this->ColActive) { $this->SetColumns(0); } // *COLUMNS* + $size=sizeof($this->Reference); + if ($size == 0) { return false; } + + + if ($NbCol<2) { + $NbCol = 1; + $colWidth = $this->pgwidth; + } + else { + $this->SetColumns($NbCol,'',$gap); + $colWidth = $this->ColWidth; + } + if ($this->directionality == 'rtl') { $align = 'R'; } + else { $align = 'L'; } + $lett = ''; + if (!function_exists('cmp')) { + function cmp ($a, $b) { + return strnatcmp(strtolower($a['t']), strtolower($b['t'])); + } + } + //Alphabetic sort of the references + usort($this->Reference, 'cmp'); + $size=sizeof($this->Reference); + $this->breakpoints[$this->CurrCol][] = $this->y; // *COLUMNS* + + $divlettjuststarted = false; + + $this->OpenTag('DIV',array('STYLE'=>'line-height: '.$linespacing.'; font-family: '.$reffont.'; font-size: '.$reffontsize.'pt; ')); + + $last_lett = ''; + for ($i=0;$i<$size;$i++){ + if ($this->Reference[$i]['t']) { + if ($usedivletters) { + + $lett = mb_strtoupper(mb_substr($this->Reference[$i]['t'],0,1,$this->mb_enc ),$this->mb_enc ); + if ($lett != $last_lett) { + + $save_bp = $this->breakpoints[$this->CurrCol]; // *COLUMNS* + $divlettjuststarted = true; + + if ($i>0) { + $this->OpenTag('DIV',array('STYLE'=>'line-height: '.$linespacing.'; font-family: '.$divlettfont.'; font-size: '.$divlettfontsize.'pt; font-weight: bold; page-break-after: avoid; margin-top: 0.5em; margin-collapse: collapse; ')); + } + else { + $this->OpenTag('DIV',array('STYLE'=>'line-height: '.$linespacing.'; font-family: '.$divlettfont.'; font-size: '.$divlettfontsize.'pt; font-weight: bold; page-break-after: avoid; ')); + } + $this->_saveTextBuffer($lett); + $this->CloseTag('DIV'); + } + } + + $this->OpenTag('DIV',array('STYLE'=>'text-indent: -'.$offset.'mm; line-height: '.$linespacing.'; font-family: '.$reffont.'; font-size: '.$reffontsize.'pt; ')); + +/*-- RTL --*/ + // Change Arabic + Persian. to Presentation Forms + if ($this->biDirectional) { + $this->Reference[$i]['t'] = preg_replace("/([".$this->pregRTLchars."]+)/ue", '$this->ArabJoin(stripslashes(\'\\1\'))', $this->Reference[$i]['t'] ); + } +/*-- END RTL --*/ + + // Font-specific ligature substitution for Indic fonts + if (isset($this->CurrentFont['indic']) && $this->CurrentFont['indic']) $this->ConvertIndic($this->Reference[$i]['t']); // *INDIC* + + $this->_saveTextBuffer($this->Reference[$i]['t']); + $ppp = $this->Reference[$i]['p']; // = array of page numbers to point to + if (count($ppp)) { + sort($ppp); + $newarr = array(); + $range_start = $ppp[0]; + $range_end = 0; + + if (!$this->usingCoreFont) { $spacer = "\xc2\xa0 "; } + else { $spacer = chr(160).' '; } + $this->_saveTextBuffer($spacer); + if ($this->directionality == 'rtl') { $sep = '.'; $joiner = '-'; } + else { $sep = ', '; $joiner = '-'; } + for ($zi=1;$zi<count($ppp);$zi++) { + // RTL - Each number separately + if ($this->directionality == 'rtl') { +/*-- RTL --*/ + if ($zi<count($ppp)-1) { + $txt = $sep . $this->docPageNum($ppp[$zi]); + if ($useLinking) { $href = '@'.$ppp[$zi]; } + else { $href = ''; } + $this->_saveTextBuffer($txt, $href); + } +/*-- END RTL --*/ + } + + else if ($ppp[$zi] == ($ppp[($zi-1)]+1)) { + $range_end = $ppp[$zi]; + } + else { + if ($range_end) { + if ($range_end == $range_start+1) { + if ($useLinking) { $href = '@'.$range_start; } + else { $href = ''; } + $txt = $this->docPageNum($range_start) . $sep; + $this->_saveTextBuffer($txt, $href); + if ($useLinking) { $href = '@'.$ppp[$zi-1]; } + else { $href = ''; } + $txt = $this->docPageNum($ppp[$zi-1]) . $sep; + $this->_saveTextBuffer($txt, $href); + } + else { + if ($useLinking) { $href = '@'.$range_start; } + else { $href = ''; } + } + } + else { + if ($useLinking) { $href = '@'.$ppp[$zi-1]; } + else { $href = ''; } + $txt = $this->docPageNum($ppp[$zi-1]) . $sep; + $this->_saveTextBuffer($txt, $href); + } + $range_start = $ppp[$zi]; + $range_end = 0; + } + } + + if ($range_end) { + if ($range_end == $range_start+1) { + if ($useLinking) { $href = '@'.$range_start; } + else { $href = ''; } + $txt = $this->docPageNum($range_start) . $sep; + $this->_saveTextBuffer($txt, $href); + if ($useLinking) { $href = '@'.$range_end; } + else { $href = ''; } + $txt = $this->docPageNum($range_end); + $this->_saveTextBuffer($txt, $href); + } + else { + if ($useLinking) { $href = '@'.$range_start; } + else { $href = ''; } + $txt = $this->docPageNum($range_start) . $joiner; + $this->_saveTextBuffer($txt, $href); + if ($useLinking) { $href = '@'.$range_end; } + else { $href = ''; } + $txt = $this->docPageNum($range_end); + $this->_saveTextBuffer($txt, $href); + } + } + else { + if ($useLinking) { $href = '@'.$ppp[(count($ppp)-1)]; } + else { $href = ''; } + $txt = $this->docPageNum($ppp[(count($ppp)-1)]); + $this->_saveTextBuffer($txt, $href); + } + } + } + $this->CloseTag('DIV'); + + if ($divlettjuststarted) { $this->breakpoints[$this->CurrCol] = $save_bp; } // *COLUMNS* + $divlettjuststarted = false; + + $this->breakpoints[$this->CurrCol][] = $this->y; // *COLUMNS* + $last_lett = $lett; + } + $this->CloseTag('DIV'); + $this->breakpoints[$this->CurrCol][] = $this->y; // *COLUMNS* + if ($this->ColActive) { $this->SetColumns(0); } // *COLUMNS* +} +/*-- END INDEX --*/ + + +function AcceptPageBreak() { + if (count($this->cellBorderBuffer)) { $this->printcellbuffer(); } // *TABLES* +/*-- COLUMNS --*/ + if ($this->ColActive==1) { + if($this->CurrCol<$this->NbCol-1) { + //Go to the next column + $this->CurrCol++; + $this->SetCol($this->CurrCol); + $this->y=$this->y0; + $this->ChangeColumn=1; // Number (and direction) of columns changed +1, +2, -2 etc. + // DIRECTIONALITY RTL + if ($this->directionality == 'rtl') { $this->ChangeColumn = -($this->ChangeColumn); } // *RTL* + + //Stay on the page + return false; + } + else { + //Go back to the first column - NEW PAGE + if (count($this->columnbuffer)) { $this->printcolumnbuffer(); } + $this->SetCol(0); + $this->y0 = $this->tMargin; + $this->ChangeColumn= -($this->NbCol-1); + // DIRECTIONALITY RTL + if ($this->directionality == 'rtl') { $this->ChangeColumn = -($this->ChangeColumn); } // *RTL* + //Page break + return true; + } + } +/*-- END COLUMNS --*/ +/*-- TABLES --*/ + else if ($this->table_rotate) { + if ($this->tablebuffer) { $this->printtablebuffer(); } + return true; + } +/*-- END TABLES --*/ + else { // *COLUMNS* + $this->ChangeColumn=0; + return $this->autoPageBreak; + } // *COLUMNS* + return $this->autoPageBreak; +} + + +//----------- COLUMNS --------------------- +/*-- COLUMNS --*/ + +function SetColumns($NbCol,$vAlign='',$gap=5) { +// NbCol = number of columns +// CurrCol = Number of the current column starting at 0 +// Called externally to set columns on/off and number +// Integer 2 upwards sets columns on to that number +// Anything less than 2 turns columns off + if ($NbCol<2) { // SET COLUMNS OFF + if ($this->ColActive) { + $this->ColActive=0; + if (count($this->columnbuffer)) { $this->printcolumnbuffer(); } + $this->NbCol=1; + $this->ResetMargins(); + $this->pgwidth = $this->w - $this->lMargin - $this->rMargin; + $this->divwidth = 0; + $this->Ln(); + } + $this->ColActive=0; + $this->columnbuffer = array(); + $this->ColDetails = array(); + $this->columnLinks = array(); + $this->columnAnnots = array(); + $this->columnForms = array(); + $this->col_Reference = array(); + $this->col_BMoutlines = array(); + $this->col_toc = array(); + $this->breakpoints = array(); + } + else { // SET COLUMNS ON + if ($this->ColActive) { + $this->ColActive=0; + if (count($this->columnbuffer)) { $this->printcolumnbuffer(); } + $this->ResetMargins(); + } + if (isset($this->y) && $this->y>$this->tMargin) $this->Ln(); + $this->NbCol=$NbCol; + $this->ColGap = $gap; + $this->divwidth = 0; + $this->ColActive=1; + $this->ColumnAdjust = true; // enables column height adjustment for the page + $this->columnbuffer = array(); + $this->ColDetails = array(); + $this->columnLinks = array(); + $this->columnAnnots = array(); + $this->columnForms = array(); + $this->col_Reference = array(); + $this->col_BMoutlines = array(); + $this->col_toc = array(); + $this->breakpoints = array(); + if ((strtoupper($vAlign) == 'J') || (strtoupper($vAlign) == 'JUSTIFY')) { $vAlign = 'J'; } + else { $vAlign = ''; } + $this->colvAlign = $vAlign; + //Save the ordinate + $absL = $this->DeflMargin-($gap/2); + $absR = $this->DefrMargin-($gap/2); + $PageWidth = $this->w-$absL-$absR; // virtual pagewidth for calculation only + $ColWidth = (($PageWidth - ($gap * ($NbCol)))/$NbCol); + $this->ColWidth = $ColWidth; +/*-- RTL --*/ + + if ($this->directionality == 'rtl') { + for ($i=0;$i<$this->NbCol;$i++) { + $this->ColL[$i] = $absL + ($gap/2) + (($NbCol - ($i+1))*($PageWidth/$NbCol)) ; + $this->ColR[$i] = $this->ColL[$i] + $ColWidth; // NB This is not R margin -> R pos + } + } + else { +/*-- END RTL --*/ + for ($i=0;$i<$this->NbCol;$i++) { + $this->ColL[$i] = $absL + ($gap/2) + ($i* ($PageWidth/$NbCol) ); + $this->ColR[$i] = $this->ColL[$i] + $ColWidth; // NB This is not R margin -> R pos + } + } // *RTL* + $this->pgwidth = $ColWidth; + $this->SetCol(0); + $this->y0=$this->y; + } + $this->x = $this->lMargin; +} + +function SetCol($CurrCol) { +// Used internally to set column by number: 0 is 1st column + //Set position on a column + $this->CurrCol=$CurrCol; + $x = $this->ColL[$CurrCol]; + $xR = $this->ColR[$CurrCol]; // NB This is not R margin -> R pos + if (($this->mirrorMargins) && (($this->page)%2==0)) { // EVEN + $x += $this->MarginCorrection ; + $xR += $this->MarginCorrection ; + } + $this->SetMargins($x,($this->w - $xR),$this->tMargin); +} + +function AddColumn() { + $this->NewColumn(); + $this->ColumnAdjust = false; // disables all column height adjustment for the page. +} +function NewColumn() { + if ($this->ColActive==1) { + if($this->CurrCol<$this->NbCol-1) { + //Go to the next column + $this->CurrCol++; + $this->SetCol($this->CurrCol); + $this->y = $this->y0; + $this->ChangeColumn=1; + // DIRECTIONALITY RTL + if ($this->directionality == 'rtl') { $this->ChangeColumn = -($this->ChangeColumn); } // *RTL* + //Stay on the page + } + else { + //Go back to the first column + //Page break + if (count($this->columnbuffer)) { $this->printcolumnbuffer(); } + $this->AddPage($this->CurOrientation); + $this->SetCol(0); + $this->y0 = $this->tMargin; + $this->ChangeColumn= -($this->NbCol-1); + // DIRECTIONALITY RTL + if ($this->directionality == 'rtl') { $this->ChangeColumn = -($this->ChangeColumn); } // *RTL* + } + $this->x = $this->lMargin; + } + else { + $this->AddPage($this->CurOrientation); + } +} + +function printcolumnbuffer() { + // Columns ended (but page not ended) -> try to match all columns - unless disabled by using a custom column-break + if (!$this->ColActive && $this->ColumnAdjust && !$this->keepColumns) { + // Calculate adjustment to add to each column to calculate rel_y value + $this->ColDetails[0]['add_y'] = 0; + $last_col = 0; + // Recursively add previous column's height + for($i=1;$i<$this->NbCol;$i++) { + if (isset($this->ColDetails[$i]['bottom_margin']) && $this->ColDetails[$i]['bottom_margin']) { // If any entries in the column + $this->ColDetails[$i]['add_y'] = ($this->ColDetails[$i-1]['bottom_margin'] - $this->y0) + $this->ColDetails[$i-1]['add_y']; + $last_col = $i; // Last column actually printed + } + } + + // Calculate value for each position sensitive entry as though for one column + foreach($this->columnbuffer AS $key=>$s) { + $t = $s['s']; + if ($t == 'ACROFORM') { + $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; + $this->columnbuffer[$key]['s'] = ''; + } + else if (preg_match('/BT \d+\.\d\d+ (\d+\.\d\d+) Td/',$t)) { + $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; + } + else if (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) \d+\.\d\d+ [\-]{0,1}\d+\.\d\d+ re/',$t)) { + $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; + } + else if (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) m/',$t)) { + $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; + } + else if (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) l/',$t)) { + $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; + } + else if (preg_match('/q \d+\.\d\d+ 0 0 \d+\.\d\d+ \d+\.\d\d+ (\d+\.\d\d+) cm \/(I|FO)\d+ Do Q/',$t)) { + $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; + } + else if (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) \d+\.\d\d+ \d+\.\d\d+ \d+\.\d\d+ \d+\.\d\d+ c/',$t)) { + $this->columnbuffer[$key]['rel_y'] = $s['y'] + $this->ColDetails[$s['col']]['add_y'] - $this->y0; + } + } + foreach($this->internallink AS $key => $f) { + if (is_array($f) && isset($f['col'])) { + $this->internallink[$key]['rel_y'] = $f['Y'] + $this->ColDetails[$f['col']]['add_y'] - $this->y0; + } + } + + $breaks = array(); + foreach($this->breakpoints AS $c => $bpa) { + foreach($bpa AS $rely) { + $breaks[] = $rely + $this->ColDetails[$c]['add_y'] - $this->y0; + } + } + + if (isset($this->ColDetails[$last_col]['bottom_margin'])) { $lcbm = $this->ColDetails[$last_col]['bottom_margin']; } + else { $lcbm = 0; } + $sum_h = $this->ColDetails[$last_col]['add_y'] + $lcbm - $this->y0; + //$sum_h = max($this->ColDetails[$last_col]['add_y'] + $this->ColDetails[$last_col]['bottom_margin'] - $this->y0, end($breaks)); + $target_h = ($sum_h / $this->NbCol); + + $cbr = array(); + for($i=1;$i<$this->NbCol;$i++) { + $th = ($sum_h * $i / $this->NbCol); + foreach($breaks AS $bk=>$val) { + if ($val > $th) { + if (($val-$th) < ($th-$breaks[$bk-1])) { $cbr[$i-1] = $val; } + else { $cbr[$i-1] = $breaks[$bk-1]; } + break; + } + } + } + $cbr[($this->NbCol-1)] = $sum_h; + + // Now update the columns - divide into columns of approximately equal value + $last_new_col = 0; + $yadj = 0; // mm + $xadj = 0; + $last_col_bottom = 0; + $lowest_bottom_y = 0; + $block_bottom = 0; + $newcolumn = 0; + foreach($this->columnbuffer AS $key=>$s) { + if (isset($s['rel_y'])) { // only process position sensitive data + if ($s['rel_y'] >= $cbr[$newcolumn]) { + $newcolumn++; + } + else { + $newcolumn = $last_new_col ; + } + + + $block_bottom = max($block_bottom,($s['rel_y']+$s['h'])); + + if ($this->directionality == 'rtl') { // *RTL* + $xadj = -(($newcolumn - $s['col']) * ($this->ColWidth + $this->ColGap)); // *RTL* + } // *RTL* + else { // *RTL* + $xadj = ($newcolumn - $s['col']) * ($this->ColWidth + $this->ColGap); + } // *RTL* + + if ($last_new_col != $newcolumn) { // Added new column + $last_col_bottom = $this->columnbuffer[$key]['rel_y']; + $block_bottom = 0; + } + $yadj = ($s['rel_y'] - $s['y']) - ($last_col_bottom)+$this->y0; + // callback function + $t = $s['s']; + $t = preg_replace('/BT (\d+\.\d\d+) (\d+\.\d\d+) Td/e',"\$this->columnAdjustAdd('Td',_MPDFK,$xadj,$yadj,'\\1','\\2')",$t); + $t = preg_replace('/(\d+\.\d\d+) (\d+\.\d\d+) (\d+\.\d\d+) ([\-]{0,1}\d+\.\d\d+) re/e',"\$this->columnAdjustAdd('re',_MPDFK,$xadj,$yadj,'\\1','\\2','\\3','\\4')",$t); + $t = preg_replace('/(\d+\.\d\d+) (\d+\.\d\d+) l/e',"\$this->columnAdjustAdd('l',_MPDFK,$xadj,$yadj,'\\1','\\2')",$t); + $t = preg_replace('/q (\d+\.\d\d+) 0 0 (\d+\.\d\d+) (\d+\.\d\d+) (\d+\.\d\d+) cm \/(I|FO)/e',"\$this->columnAdjustAdd('img',_MPDFK,$xadj,$yadj,'\\1','\\2','\\3','\\4','\\5')",$t); + $t = preg_replace('/(\d+\.\d\d+) (\d+\.\d\d+) m/e',"\$this->columnAdjustAdd('draw',_MPDFK,$xadj,$yadj,'\\1','\\2')",$t); + $t = preg_replace('/(\d+\.\d\d+) (\d+\.\d\d+) (\d+\.\d\d+) (\d+\.\d\d+) (\d+\.\d\d+) (\d+\.\d\d+) c/e',"\$this->columnAdjustAdd('bezier',_MPDFK,$xadj,$yadj,'\\1','\\2','\\3','\\4','\\5','\\6')",$t); + + $this->columnbuffer[$key]['s'] = $t; + $this->columnbuffer[$key]['newcol'] = $newcolumn; + $this->columnbuffer[$key]['newy'] = $s['y'] + $yadj; + $last_new_col = $newcolumn; + $clb = $s['y'] + $yadj + $s['h'] ; // bottom_margin of current + if ((isset($this->ColDetails[$newcolumn]['max_bottom']) && $clb > $this->ColDetails[$newcolumn]['max_bottom']) || (!isset($this->ColDetails[$newcolumn]['max_bottom']) && $clb)) { $this->ColDetails[$newcolumn]['max_bottom'] = $clb; } + if ($clb > $lowest_bottom_y) { $lowest_bottom_y = $clb; } + // Adjust LINKS + if (isset($this->columnLinks[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])])) { + $ref = $this->columnLinks[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]; + $this->PageLinks[$this->page][$ref][0] += ($xadj*_MPDFK); + $this->PageLinks[$this->page][$ref][1] -= ($yadj*_MPDFK); + unset($this->columnLinks[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]); + } + // Adjust FORM FIELDS + if (isset($this->columnForms[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])])) { + $ref = $this->columnForms[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]; + $this->form->forms[$ref]['x'] += ($xadj); + $this->form->forms[$ref]['y'] += ($yadj); + unset($this->columnForms[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]); + } +/*-- ANNOTATIONS --*/ + if (isset($this->columnAnnots[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])])) { + $ref = $this->columnAnnots[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]; + if ($this->PageAnnots[$this->page][$ref]['x'] < 0) { + $this->PageAnnots[$this->page][$ref]['x'] -= ($xadj); + } + else { + $this->PageAnnots[$this->page][$ref]['x'] += ($xadj); + } + $this->PageAnnots[$this->page][$ref]['y'] += ($yadj); // unlike PageLinks, Page annots has y values from top in mm + unset($this->columnAnnots[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]); + } +/*-- END ANNOTATIONS --*/ + } + } + +/*-- BOOKMARKS --*/ + // Adjust Bookmarks + foreach($this->col_BMoutlines AS $v) { + $this->BMoutlines[]=array('t'=>$v['t'],'l'=>$v['l'],'y'=>$this->y0,'p'=>$v['p']); + } +/*-- END BOOKMARKS --*/ + +/*-- INDEX --*/ + // Adjust Reference (index) + foreach($this->col_Reference AS $v) { + $Present=0; + //Search the reference (AND Ref/PageNo) in the array + for ($i=0;$i<count($this->Reference);$i++){ + if ($this->Reference[$i]['t']==$v['t']){ + $Present=1; + if (!in_array($v['op'],$this->Reference[$i]['p'])) { + $this->Reference[$i]['p'][] = $v['op']; + } + } + } + if ($Present==0) { + $this->Reference[]=array('t'=>$v['t'],'p'=>array($v['op'])); + } + } +/*-- END INDEX --*/ + +/*-- TOC --*/ + + // Adjust ToC + foreach($this->col_toc AS $v) { + $this->tocontents->_toc[]=array('t'=>$v['t'],'l'=>$v['l'],'p'=>$v['p'],'link'=>$v['link'],'toc_id'=>$v['toc_id']); + $this->links[$v['link']][1] = $this->y0; + } +/*-- END TOC --*/ + + // Adjust column length to be equal + if ($this->colvAlign == 'J') { + foreach($this->columnbuffer AS $key=>$s) { + if (isset($s['rel_y'])) { // only process position sensitive data + // Set ratio to expand y values or heights + if (isset($this->ColDetails[$s['newcol']]['max_bottom']) && $this->ColDetails[$s['newcol']]['max_bottom'] && $this->ColDetails[$s['newcol']]['max_bottom']!=$this->y0) { + $ratio = ($lowest_bottom_y - ($this->y0)) / ($this->ColDetails[$s['newcol']]['max_bottom'] - ($this->y0)); + } + else { $ratio = 1; } + if (($ratio > 1) && ($ratio <= $this->max_colH_correction)) { + $yadj = ($s['newy'] - $this->y0) * ($ratio - 1); + + // Adjust LINKS + if (isset($this->columnLinks[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])])) { + $ref = $this->columnLinks[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]; + $this->PageLinks[$this->page][$ref][1] -= ($yadj*_MPDFK); // y value + $this->PageLinks[$this->page][$ref][3] *= $ratio; // height + unset($this->columnLinks[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]); + } + // Adjust FORM FIELDS + if (isset($this->columnForms[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])])) { + $ref = $this->columnForms[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]; + $this->form->forms[$ref]['x'] += ($xadj); + $this->form->forms[$ref]['y'] += ($yadj); + unset($this->columnForms[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]); + } +/*-- ANNOTATIONS --*/ + if (isset($this->columnAnnots[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])])) { + $ref = $this->columnAnnots[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]; + $this->PageAnnots[$this->page][$ref]['y'] += ($yadj); + unset($this->columnAnnots[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]); + } +/*-- END ANNOTATIONS --*/ + } + } + } + foreach($this->internallink AS $key => $f) { + if (is_array($f) && isset($f['col'])) { + $last_col_bottom = 0; + for ($nbc=0; $nbc<$this->NbCol; $nbc++) { + if ($f['rel_y'] >= $cbr[$nbc]) { $last_col_bottom = $cbr[$nbc]; } + } + $yadj = ($f['rel_y'] - $f['Y']) - $last_col_bottom + $this->y0; + $f['Y'] += $yadj; + unset($f['col']); + unset($f['rel_y']); + $this->internallink[$key] = $f; + } + } + + $last_col = -1; + $trans_on = false; + foreach($this->columnbuffer AS $key=>$s) { + if (isset($s['rel_y'])) { // only process position sensitive data + // Set ratio to expand y values or heights + if (isset($this->ColDetails[$s['newcol']]['max_bottom']) && $this->ColDetails[$s['newcol']]['max_bottom'] && $this->ColDetails[$s['newcol']]['max_bottom']!=$this->y0) { + $ratio = ($lowest_bottom_y - ($this->y0)) / ($this->ColDetails[$s['newcol']]['max_bottom'] - ($this->y0)); + } + else { $ratio = 1; } + if (($ratio > 1) && ($ratio <= $this->max_colH_correction)) { + //Start Transformation + $this->pages[$this->page] .= $this->StartTransform(true)."\n"; + $this->pages[$this->page] .= $this->transformScale(100, $ratio*100, $x='', $this->y0, true)."\n"; + $trans_on = true; + } + } + // Now output the adjusted values + $this->pages[$this->page] .= $s['s']."\n"; + if (isset($s['rel_y']) && ($ratio > 1) && ($ratio <= $this->max_colH_correction)) { // only process position sensitive data + //Stop Transformation + $this->pages[$this->page] .= $this->StopTransform(true)."\n"; + $trans_on = false; + } + } + if ($trans_on) { $this->pages[$this->page] .= $this->StopTransform(true)."\n"; } + } + else { // if NOT $this->colvAlign == 'J' + // Now output the adjusted values + foreach($this->columnbuffer AS $s) { + $this->pages[$this->page] .= $s['s']."\n"; + } + } + if ($lowest_bottom_y > 0) { $this->y = $lowest_bottom_y ; } + } + + // Columns not ended but new page -> align columns (can leave the columns alone - just tidy up the height) + else if ($this->colvAlign == 'J' && $this->ColumnAdjust && !$this->keepColumns) { + // calculate the lowest bottom margin + $lowest_bottom_y = 0; + foreach($this->columnbuffer AS $key=>$s) { + // Only process output data + $t = $s['s']; + if ($t == 'ACROFORM' || (preg_match('/BT \d+\.\d\d+ (\d+\.\d\d+) Td/',$t)) || (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) \d+\.\d\d+ [\-]{0,1}\d+\.\d\d+ re/',$t)) || + (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) l/',$t)) || + (preg_match('/q \d+\.\d\d+ 0 0 \d+\.\d\d+ \d+\.\d\d+ (\d+\.\d\d+) cm \/(I|FO)\d+ Do Q/',$t)) || + (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) m/',$t)) || + (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) \d+\.\d\d+ \d+\.\d\d+ \d+\.\d\d+ \d+\.\d\d+ c/',$t)) ) { + + $clb = $s['y'] + $s['h']; + if ((isset($this->ColDetails[$s['col']]['max_bottom']) && $clb > $this->ColDetails[$s['col']]['max_bottom']) || !isset($this->ColDetails[$s['col']]['max_bottom'])) { $this->ColDetails[$s['col']]['max_bottom'] = $clb; } + if ($clb > $lowest_bottom_y) { $lowest_bottom_y = $clb; } + $this->columnbuffer[$key]['rel_y'] = $s['y']; // Marks position sensitive data to process later + if ($t == 'ACROFORM') { $this->columnbuffer[$key]['s'] = ''; } + } + } + // Adjust column length equal + foreach($this->columnbuffer AS $key=>$s) { + // Set ratio to expand y values or heights + if (isset($this->ColDetails[$s['col']]['max_bottom']) && $this->ColDetails[$s['col']]['max_bottom']) { + $ratio = ($lowest_bottom_y - ($this->y0)) / ($this->ColDetails[$s['col']]['max_bottom'] - ($this->y0)); + } + else { $ratio = 1; } + if (($ratio > 1) && ($ratio <= $this->max_colH_correction)) { + $yadj = ($s['y'] - $this->y0) * ($ratio - 1); + + // Adjust LINKS + if (isset($s['rel_y'])) { // only process position sensitive data + // otherwise triggers for all entries in column buffer (.e.g. formatting) and makes below adjustments more than once + if (isset($this->columnLinks[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])])) { + $ref = $this->columnLinks[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]; + $this->PageLinks[$this->page][$ref][1] -= ($yadj*_MPDFK); // y value + $this->PageLinks[$this->page][$ref][3] *= $ratio; // height + unset($this->columnLinks[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]); + } + // Adjust FORM FIELDS + if (isset($this->columnForms[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])])) { + $ref = $this->columnForms[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]; + $this->form->forms[$ref]['x'] += ($xadj); + $this->form->forms[$ref]['y'] += ($yadj); + unset($this->columnForms[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]); + } +/*-- ANNOTATIONS --*/ + if (isset($this->columnAnnots[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])])) { + $ref = $this->columnAnnots[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]; + $this->PageAnnots[$this->page][$ref]['y'] += ($yadj); + unset($this->columnAnnots[$s['col']][INTVAL($s['x'])][INTVAL($s['y'])]); + } +/*-- END ANNOTATIONS --*/ + } + } + } + +/*-- BOOKMARKS --*/ + + // Adjust Bookmarks + foreach($this->col_BMoutlines AS $v) { + $this->BMoutlines[]=array('t'=>$v['t'],'l'=>$v['l'],'y'=>$this->y0,'p'=>$v['p']); + } +/*-- END BOOKMARKS --*/ + +/*-- INDEX --*/ + + // Adjust Reference (index) + foreach($this->col_Reference AS $v) { + $Present=0; + //Search the reference (AND Ref/PageNo) in the array + for ($i=0;$i<count($this->Reference);$i++){ + if ($this->Reference[$i]['t']==$v['t']){ + $Present=1; + if (!in_array($v['op'],$this->Reference[$i]['p'])) { + $this->Reference[$i]['p'][] = $v['op']; + } + } + } + if ($Present==0) { + $this->Reference[]=array('t'=>$v['t'],'p'=>array($v['op'])); + } + } +/*-- END INDEX --*/ + +/*-- TOC --*/ + + // Adjust ToC + foreach($this->col_toc AS $v) { + $this->tocontents->_toc[]=array('t'=>$v['t'],'l'=>$v['l'],'p'=>$v['p'],'link'=>$v['link'],'toc_id'=>$v['toc_id']); + $this->links[$v['link']][1] = $this->y0; + } +/*-- END TOC --*/ + $trans_on = false; + foreach($this->columnbuffer AS $key=>$s) { + if (isset($s['rel_y'])) { // only process position sensitive data + // Set ratio to expand y values or heights + if ($this->ColDetails[$s['col']]['max_bottom']) { + $ratio = ($lowest_bottom_y - ($this->y0)) / ($this->ColDetails[$s['col']]['max_bottom'] - ($this->y0)); + } + else { $ratio = 1; } + if (($ratio > 1) && ($ratio <= $this->max_colH_correction)) { + //Start Transformation + $this->pages[$this->page] .= $this->StartTransform(true)."\n"; + $this->pages[$this->page] .= $this->transformScale(100, $ratio*100, $x='', $this->y0, true)."\n"; + $trans_on = true; + } + } + // Now output the adjusted values + $this->pages[$this->page] .= $s['s']."\n"; + if (isset($s['rel_y']) && ($ratio > 1) && ($ratio <= $this->max_colH_correction)) { + //Stop Transformation + $this->pages[$this->page] .= $this->StopTransform(true)."\n"; + $trans_on = false; // mPDF 5.1.001 + } + } + if ($trans_on) { $this->pages[$this->page] .= $this->StopTransform(true)."\n"; } + + if ($lowest_bottom_y > 0) { $this->y = $lowest_bottom_y ; } + } + + + // Just reproduce the page as it was + else { + // If page has not ended but height adjustment was disabled by custom column-break - adjust y + $lowest_bottom_y = 0; + if (!$this->ColActive && (!$this->ColumnAdjust || $this->keepColumns)) { + // calculate the lowest bottom margin + foreach($this->columnbuffer AS $key=>$s) { + // Only process output data + $t = $s['s']; + if ($t == 'ACROFORM' || (preg_match('/BT \d+\.\d\d+ (\d+\.\d\d+) Td/',$t)) || (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) \d+\.\d\d+ [\-]{0,1}\d+\.\d\d+ re/',$t)) || + (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) l/',$t)) || + (preg_match('/q \d+\.\d\d+ 0 0 \d+\.\d\d+ \d+\.\d\d+ (\d+\.\d\d+) cm \/(I|FO)\d+ Do Q/',$t)) || + (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) m/',$t)) || + (preg_match('/\d+\.\d\d+ (\d+\.\d\d+) \d+\.\d\d+ \d+\.\d\d+ \d+\.\d\d+ \d+\.\d\d+ c/',$t)) ) { + + $clb = $s['y'] + $s['h']; + if ($clb > $this->ColDetails[$s['col']]['max_bottom']) { $this->ColDetails[$s['col']]['max_bottom'] = $clb; } + if ($clb > $lowest_bottom_y) { $lowest_bottom_y = $clb; } + } + } + } + foreach($this->columnbuffer AS $key=>$s) { + if ($s['s'] != 'ACROFORM') + $this->pages[$this->page] .= $s['s']."\n"; + } + if ($lowest_bottom_y > 0) { $this->y = $lowest_bottom_y ; } +/*-- INDEX --*/ + + // Output Reference (index) + foreach($this->col_Reference AS $v) { + $Present=0; + for ($i=0;$i<count($this->Reference);$i++){ + if ($this->Reference[$i]['t']==$v['t']){ + $Present=1; + if (!in_array($v['op'],$this->Reference[$i]['p'])) { + $this->Reference[$i]['p'][] = $v['op']; + } + } + } + if ($Present==0) { + $this->Reference[]=array('t'=>$v['t'],'p'=>array($v['op'])); + } + } +/*-- END INDEX --*/ +/*-- BOOKMARKS --*/ + // Output Bookmarks + foreach($this->col_BMoutlines AS $v) { + $this->BMoutlines[]=array('t'=>$v['t'],'l'=>$v['l'],'y'=>$v['y'],'p'=>$v['p']); + } +/*-- END BOOKMARKS --*/ +/*-- TOC --*/ + // Output ToC + foreach($this->col_toc AS $v) { + $this->tocontents->_toc[]=array('t'=>$v['t'],'l'=>$v['l'],'p'=>$v['p'],'link'=>$v['link'],'toc_id'=>$v['toc_id']); + } +/*-- END TOC --*/ + } + foreach($this->internallink AS $key => $f) { + if (isset($this->internallink[$key]['col'])) unset($this->internallink[$key]['col']); + if (isset($this->internallink[$key]['rel_y'])) unset($this->internallink[$key]['rel_y']); + } + + $this->columnbuffer = array(); + $this->ColDetails = array(); + $this->columnLinks = array(); + $this->columnAnnots = array(); + $this->columnForms = array(); + + $this->col_Reference = array(); + $this->col_BMoutlines = array(); + $this->col_toc = array(); + $this->breakpoints = array(); +} + +/*-- END COLUMNS --*/ + + +//================================================================== +/*-- TABLES --*/ +function printcellbuffer() { + if (count($this->cellBorderBuffer )) { + sort($this->cellBorderBuffer); + foreach($this->cellBorderBuffer AS $cbb) { + $cba = unpack("A16dom/nbord/A1side/ns/dbw/a6ca/A10style/dx/dy/dw/dh/dmbl/dmbr/dmrt/dmrb/dmtl/dmtr/dmlt/dmlb/dcpd/dover/", $cbb); + $side = $cba['side']; + $details = array(); + $details[$side]['dom'] = (float) $cba['dom']; + $details[$side]['s'] = $cba['s']; + $details[$side]['w'] = $cba['bw']; + $details[$side]['c'] = $cba['ca']; + $details[$side]['style'] = trim($cba['style']); + $details['mbw']['BL'] = $cba['mbl']; + $details['mbw']['BR'] = $cba['mbr']; + $details['mbw']['RT'] = $cba['mrt']; + $details['mbw']['RB'] = $cba['mrb']; + $details['mbw']['TL'] = $cba['mtl']; + $details['mbw']['TR'] = $cba['mtr']; + $details['mbw']['LT'] = $cba['mlt']; + $details['mbw']['LB'] = $cba['mlb']; + $details['cellposdom'] = $cba['cpd']; + $details['p'] = $side; + if ($cba['over']==1) { $details[$side]['overlay'] = true; } + else { $details[$side]['overlay'] = false; } + $this->_tableRect($cba['x'],$cba['y'],$cba['w'],$cba['h'],$cba['bord'],$details, false, false); + + } + $this->cellBorderBuffer = array(); + } +} +//================================================================== +function printtablebuffer() { + + if (!$this->table_rotate) { + $this->pages[$this->page] .= $this->tablebuffer; + foreach($this->tbrot_Links AS $p => $l) { + foreach($l AS $v) { + $this->PageLinks[$p][] = $v; + } + } + $this->tbrot_Links = array(); +/*-- ANNOTATIONS --*/ + foreach($this->tbrot_Annots AS $p => $l) { + foreach($l AS $v) { + $this->PageAnnots[$p][] = $v; + } + } + $this->tbrot_Annots = array(); +/*-- END ANNOTATIONS --*/ + +/*-- INDEX --*/ + // Output Reference (index) + foreach($this->tbrot_Reference AS $v) { + $Present=0; + for ($i=0;$i<count($this->Reference);$i++){ + if ($this->Reference[$i]['t']==$v['t']){ + $Present=1; + if (!in_array($v['op'],$this->Reference[$i]['p'])) { + $this->Reference[$i]['p'][] = $v['op']; + } + } + } + if ($Present==0) { + $this->Reference[]=array('t'=>$v['t'],'p'=>array($v['op'])); + } + } + $this->tbrot_Reference = array(); +/*-- END INDEX --*/ + +/*-- BOOKMARKS --*/ + // Output Bookmarks + foreach($this->tbrot_BMoutlines AS $v) { + $this->BMoutlines[]=array('t'=>$v['t'],'l'=>$v['l'],'y'=>$v['y'],'p'=>$v['p']); + } + $this->tbrot_BMoutlines = array(); +/*-- END BOOKMARKS --*/ + +/*-- TOC --*/ + // Output ToC + foreach($this->tbrot_toc AS $v) { + $this->tocontents->_toc[]=array('t'=>$v['t'],'l'=>$v['l'],'p'=>$v['p'],'link'=>$v['link'],'toc_id'=>$v['toc_id']); + } + $this->tbrot_toc = array(); +/*-- END TOC --*/ + + return; + } + // else if rotated + $lm = $this->lMargin + $this->blk[$this->blklvl]['outer_left_margin'] + $this->blk[$this->blklvl]['border_left']['w'] + $this->blk[$this->blklvl]['padding_left']; + $pw = $this->blk[$this->blklvl]['inner_width']; + //Start Transformation + $this->pages[$this->page] .= $this->StartTransform(true)."\n"; + + if ($this->table_rotate > 1) { // clockwise + if ($this->tbrot_align == 'L') { + $xadj = $this->tbrot_h ; // align L (as is) + } + else if ($this->tbrot_align == 'R') { + $xadj = $lm-$this->tbrot_x0+($pw) ; // align R + } + else { + $xadj = $lm-$this->tbrot_x0+(($pw + $this->tbrot_h)/2) ; // align C + } + $yadj = 0; + } + else { // anti-clockwise + if ($this->tbrot_align == 'L') { + $xadj = 0 ; // align L (as is) + } + else if ($this->tbrot_align == 'R') { + $xadj = $lm-$this->tbrot_x0+($pw - $this->tbrot_h) ; // align R + } + else { + $xadj = $lm-$this->tbrot_x0+(($pw - $this->tbrot_h)/2) ; // align C + } + $yadj = $this->tbrot_w; + } + + + $this->pages[$this->page] .= $this->transformTranslate($xadj, $yadj , true)."\n"; + $this->pages[$this->page] .= $this->transformRotate($this->table_rotate, $this->tbrot_x0 , $this->tbrot_y0 , true)."\n"; + + // Now output the adjusted values + $this->pages[$this->page] .= $this->tablebuffer; + + + foreach($this->tbrot_Links AS $p => $l) { + foreach($l AS $v) { + $w = $v[2]/_MPDFK; + $h = $v[3]/_MPDFK; + $ax = ($v[0]/_MPDFK) - $this->tbrot_x0; + $ay = (($this->hPt-$v[1])/_MPDFK) - $this->tbrot_y0; + if ($this->table_rotate > 1) { // clockwise + $bx = $this->tbrot_x0+$xadj-$ay-$h; + $by = $this->tbrot_y0+$yadj+$ax; + } + else { + $bx = $this->tbrot_x0+$xadj+$ay; + $by = $this->tbrot_y0+$yadj-$ax-$w; + } + $v[0] = $bx*_MPDFK; + $v[1] = ($this->h-$by)*_MPDFK; + $v[2] = $h*_MPDFK; // swap width and height + $v[3] = $w*_MPDFK; + $this->PageLinks[$p][] = $v; + } + } + $this->tbrot_Links = array(); + foreach($this->internallink AS $key => $f) { + if (is_array($f) && isset($f['tbrot'])) { + $f['Y'] = $this->tbrot_y0; + $f['PAGE'] = $this->page; + unset($f['tbrot']); + $this->internallink[$key] = $f; + } + } +/*-- ANNOTATIONS --*/ + foreach($this->tbrot_Annots AS $p => $l) { + foreach($l AS $v) { + $ax = abs($v['x']) - $this->tbrot_x0; // abs because -ve values are internally set and held for reference if annotMargin set + $ay = $v['y'] - $this->tbrot_y0; + if ($this->table_rotate > 1) { // clockwise + $bx = $this->tbrot_x0+$xadj-$ay; + $by = $this->tbrot_y0+$yadj+$ax; + } + else { + $bx = $this->tbrot_x0+$xadj+$ay; + $by = $this->tbrot_y0+$yadj-$ax; + } + if ($v['x'] < 0) { + $v['x'] = -$bx; + } + else { + $v['x'] = $bx; + } + $v['y'] = ($by); + $this->PageAnnots[$p][] = $v; + } + } + $this->tbrot_Annots = array(); +/*-- END ANNOTATIONS --*/ + + +/*-- BOOKMARKS --*/ + + // Adjust Bookmarks + foreach($this->tbrot_BMoutlines AS $v) { + $v['y'] = $this->tbrot_y0; + $this->BMoutlines[]=array('t'=>$v['t'],'l'=>$v['l'],'y'=>$v['y'],'p'=>$this->page); + } +/*-- END BOOKMARKS --*/ + +/*-- INDEX --*/ + + // Adjust Reference (index) + foreach($this->tbrot_Reference AS $v) { + $Present=0; + //Search the reference (AND Ref/PageNo) in the array + for ($i=0;$i<count($this->Reference);$i++){ + if ($this->Reference[$i]['t']==$v['t']){ + $Present=1; + if (!in_array($this->page,$this->Reference[$i]['p'])) { + $this->Reference[$i]['p'][] = $this->page; + } + } + } + if ($Present==0) { + $this->Reference[]=array('t'=>$v['t'],'p'=>array($this->page)); + } + } +/*-- END INDEX --*/ + +/*-- TOC --*/ + + // Adjust ToC - uses document page number + foreach($this->tbrot_toc AS $v) { + $this->tocontents->_toc[]=array('t'=>$v['t'],'l'=>$v['l'],'p'=>$this->page,'link'=>$v['link'],'toc_id'=>$v['toc_id']); + $this->links[$v['link']][1] = $this->tbrot_y0; + } +/*-- END TOC --*/ + + + + $this->tbrot_Reference = array(); + $this->tbrot_BMoutlines = array(); + $this->tbrot_toc = array(); + + //Stop Transformation + $this->pages[$this->page] .= $this->StopTransform(true)."\n"; + + + $this->y = $this->tbrot_y0 + $this->tbrot_w; + $this->x = $this->lMargin; + + $this->tablebuffer = ''; +} + +//================================================================== +// Keep-with-table This buffers contents of h1-6 to keep on page with table +function printkwtbuffer() { + if (!$this->kwt_moved) { + foreach($this->kwt_buffer AS $s) { $this->pages[$this->page] .= $s['s']."\n"; } + foreach($this->kwt_Links AS $p => $l) { + foreach($l AS $v) { + $this->PageLinks[$p][] = $v; + } + } + $this->kwt_Links = array(); +/*-- ANNOTATIONS --*/ + foreach($this->kwt_Annots AS $p => $l) { + foreach($l AS $v) { + $this->PageAnnots[$p][] = $v; + } + } + $this->kwt_Annots = array(); +/*-- END ANNOTATIONS --*/ + +/*-- INDEX --*/ + // Output Reference (index) + foreach($this->kwt_Reference AS $v) { + $Present=0; + for ($i=0;$i<count($this->Reference);$i++){ + if ($this->Reference[$i]['t']==$v['t']){ + $Present=1; + if (!in_array($v['op'],$this->Reference[$i]['p'])) { + $this->Reference[$i]['p'][] = $v['op']; + } + } + } + if ($Present==0) { + $this->Reference[]=array('t'=>$v['t'],'p'=>array($v['op'])); + } + } + $this->kwt_Reference = array(); +/*-- END INDEX --*/ + +/*-- BOOKMARKS --*/ + // Output Bookmarks + foreach($this->kwt_BMoutlines AS $v) { + $this->BMoutlines[]=array('t'=>$v['t'],'l'=>$v['l'],'y'=>$v['y'],'p'=>$v['p']); + } + $this->kwt_BMoutlines = array(); +/*-- END BOOKMARKS --*/ + +/*-- TOC --*/ + // Output ToC + foreach($this->kwt_toc AS $v) { + $this->tocontents->_toc[]=array('t'=>$v['t'],'l'=>$v['l'],'p'=>$v['p'],'link'=>$v['link'],'toc_id'=>$v['toc_id']); + } + $this->kwt_toc = array(); +/*-- END TOC --*/ + + return; + } + + //Start Transformation + $this->pages[$this->page] .= $this->StartTransform(true)."\n"; + $xadj = $this->lMargin - $this->kwt_x0 ; + //$yadj = $this->y - $this->kwt_y0 ; + $yadj = $this->tMargin - $this->kwt_y0 ; + + $this->pages[$this->page] .= $this->transformTranslate($xadj, $yadj , true)."\n"; + + // Now output the adjusted values + foreach($this->kwt_buffer AS $s) { $this->pages[$this->page] .= $s['s']."\n"; } + + // Adjust hyperLinks + foreach($this->kwt_Links AS $p => $l) { + foreach($l AS $v) { + $bx = $this->kwt_x0+$xadj; + $by = $this->kwt_y0+$yadj; + $v[0] = $bx*_MPDFK; + $v[1] = ($this->h-$by)*_MPDFK; + $this->PageLinks[$p][] = $v; + } + } + foreach($this->internallink AS $key => $f) { + if (is_array($f) && isset($f['kwt'])) { + $f['Y'] += $yadj; + $f['PAGE'] = $this->page; + unset($f['kwt']); + $this->internallink[$key] = $f; + } + } +/*-- ANNOTATIONS --*/ + foreach($this->kwt_Annots AS $p => $l) { + foreach($l AS $v) { + $bx = $this->kwt_x0+$xadj; + $by = $this->kwt_y0+$yadj; + if ($v['x'] < 0) { + $v['x'] = -$bx; + } + else { + $v['x'] = $bx; + } + $v['y'] = $by; + $this->PageAnnots[$p][] = $v; + } + } +/*-- END ANNOTATIONS --*/ + +/*-- BOOKMARKS --*/ + + // Adjust Bookmarks + foreach($this->kwt_BMoutlines AS $v) { + if ($v['y'] != 0) { $v['y'] += $yadj; } + $this->BMoutlines[]=array('t'=>$v['t'],'l'=>$v['l'],'y'=>$v['y'],'p'=>$this->page); + } +/*-- END BOOKMARKS --*/ + +/*-- INDEX --*/ + + // Adjust Reference (index) + foreach($this->kwt_Reference AS $v) { + $Present=0; + //Search the reference (AND Ref/PageNo) in the array + for ($i=0;$i<count($this->Reference);$i++){ + if ($this->Reference[$i]['t']==$v['t']){ + $Present=1; + if (!in_array($this->page,$this->Reference[$i]['p'])) { + $this->Reference[$i]['p'][] = $this->page; + } + } + } + if ($Present==0) { + $this->Reference[]=array('t'=>$v['t'],'p'=>array($this->page)); + } + } +/*-- END INDEX --*/ + +/*-- TOC --*/ + + // Adjust ToC + foreach($this->kwt_toc AS $v) { + $this->tocontents->_toc[]=array('t'=>$v['t'],'l'=>$v['l'],'p'=>$this->page,'link'=>$v['link'],'toc_id'=>$v['toc_id']); + $this->links[$v['link']][0] = $this->page; + $this->links[$v['link']][1] += $yadj; + } +/*-- END TOC --*/ + + + $this->kwt_Links = array(); + $this->kwt_Annots = array(); + + $this->kwt_Reference = array(); + $this->kwt_BMoutlines = array(); + $this->kwt_toc = array(); + //Stop Transformation + $this->pages[$this->page] .= $this->StopTransform(true)."\n"; + + $this->kwt_buffer = array(); + + $this->y += $this->kwt_height; +} + +/*-- END TABLES --*/ + + +//================================================================== + +function printfloatbuffer() { + if (count($this->floatbuffer)) { + $this->objectbuffer = $this->floatbuffer; + $this->printobjectbuffer(false); + $this->objectbuffer = array(); + $this->floatbuffer = array(); + $this->floatmargins = array(); + } +} +//================================================================== + +function printdivbuffer() { + $p1 = $this->blk[$this->blklvl]['startpage']; + $p2 = $this->page; + $bottom[$p1] = $this->ktBlock[$p1]['bottom_margin']; + $bottom[$p2] = $this->y; // $this->ktBlock[$p2]['bottom_margin']; + $top[$p1] = $this->kt_y00; + + $top2 = $this->h; + foreach($this->divbuffer AS $key=>$s) { + if ($s['page'] == $p2) { + $top2 = MIN($s['y'], $top2); + } + } + $top[$p2] = $top2; + $height[$p1] = ($bottom[$p1] - $top[$p1]); + $height[$p2] = ($bottom[$p2] - $top[$p2]); + $xadj[$p1] = $this->MarginCorrection; + $yadj[$p1] = -($top[$p1] - $top[$p2]); + $xadj[$p2] = 0; + $yadj[$p2] = $height[$p1]; + + // Output without any transformation + if ($this->ColActive || !$this->keep_block_together || $this->blk[$this->blklvl]['startpage'] == $this->page || ($this->page - $this->blk[$this->blklvl]['startpage']) > 1 || ($height[$p1]+$height[$p2]) > $this->h) { + foreach($this->divbuffer AS $s) { $this->pages[$s['page']] .= $s['s']."\n"; } + foreach($this->ktLinks AS $p => $l) { + foreach($l AS $v) { + $this->PageLinks[$p][] = $v; + } + } + foreach($this->ktForms AS $key => $f) { + $this->form->forms[$f['n']] = $f; + } +/*-- ANNOTATIONS --*/ + foreach($this->ktAnnots AS $p => $l) { + foreach($l AS $v) { + $this->PageAnnots[$p][] = $v; + } + } +/*-- END ANNOTATIONS --*/ +/*-- INDEX --*/ + // Adjust Reference (index) + foreach($this->ktReference AS $v) { + $Present=0; + //Search the reference (AND Ref/PageNo) in the array + for ($i=0;$i<count($this->Reference);$i++){ + if ($this->Reference[$i]['t']==$v['t']){ + $Present=1; + if (!in_array($p2,$this->Reference[$i]['p'])) { + $this->Reference[$i]['p'][] = $p2; + } + } + } + //If not found, add it + if ($Present==0) { + $this->Reference[]=array('t'=>$v['t'],'p'=>array($p2)); + } + } +/*-- END INDEX --*/ + +/*-- BOOKMARKS --*/ + // Adjust Bookmarks + foreach($this->ktBMoutlines AS $v) { + $this->BMoutlines[]=array('t'=>$v['t'],'l'=>$v['l'],'y'=>$v['y'],'p'=>$v['p']); + } +/*-- END BOOKMARKS --*/ + +/*-- TOC --*/ + // Adjust ToC + foreach($this->_kttoc AS $v) { + $this->tocontents->_toc[]=array('t'=>$v['t'],'l'=>$v['l'],'p'=>$v['p'],'link'=>$v['link'],'toc_id'=>$v['toc_id']); + } +/*-- END TOC --*/ + + $this->divbuffer = array(); + $this->ktLinks = array(); + $this->ktAnnots = array(); + $this->ktForms = array(); + $this->ktBlock = array(); + $this->ktReference = array(); + $this->ktBMoutlines = array(); + $this->_kttoc = array(); + $this->keep_block_together = 0; + return; + } + else { + // Output with transformation + // mPDF 5.6.17 + $np = ''; + $lastpage = -1; + foreach($this->divbuffer AS $key=>$s) { + // callback function + $t = $s['s']; + $p = $s['page']; + if ($p != $lastpage) { + $q = ''; + if ($lastpage != -1) { $q = ' Q'."\n"; } + $t = $q . $this->StartTransform(true)."\n" . $this->transformTranslate($xadj[$p], $yadj[$p] , true)."\n" . $t; + $lastpage = $p; + } + $np .= $t."\n"; + } + if ($lastpage != -1) { $np .= ' Q'."\n"; } + + $this->pages[$this->page] .= $np; + + // Adjust hyperLinks + foreach($this->ktLinks AS $p => $l) { + foreach($l AS $v) { + $v[0] += ($xadj[$p]*_MPDFK); + $v[1] -= ($yadj[$p]*_MPDFK); + $this->PageLinks[$p2][] = $v; + } + } + foreach($this->ktForms AS $key => $f) { + $p = $f['page']; + $f['x'] += ($xadj[$p]); + $f['y'] += ($yadj[$p]); + $f['page'] = $p2; + $this->form->forms[$f['n']] = $f; + } + foreach($this->internallink AS $key => $f) { + if (is_array($f) && isset($f['kt'])) { + $f['Y'] += ($yadj[$f['PAGE']]); + $f['PAGE'] = $p2; + unset($f['kt']); + $this->internallink[$key] = $f; + } + } +/*-- ANNOTATIONS --*/ + foreach($this->ktAnnots AS $p => $l) { + foreach($l AS $v) { + if ($v['x']>0) { $v['x'] += $xadj[$p]; } + else if ($v['x']<0) { $v['x'] -= $xadj[$p]; } + $v['y'] += $yadj[$p]; + $this->PageAnnots[$p2][] = $v; + } + } +/*-- END ANNOTATIONS --*/ + +/*-- BOOKMARKS --*/ + // Adjust Bookmarks + foreach($this->ktBMoutlines AS $v) { + if ($v['y'] != 0) { $v['y'] += ($yadj[$v['p']]); } + $this->BMoutlines[]=array('t'=>$v['t'],'l'=>$v['l'],'y'=>$v['y'],'p'=>$p2); + } +/*-- END BOOKMARKS --*/ + +/*-- INDEX --*/ + // Adjust Reference (index) + foreach($this->ktReference AS $v) { + $Present=0; + //Search the reference (AND Ref/PageNo) in the array + for ($i=0;$i<count($this->Reference);$i++){ + if ($this->Reference[$i]['t']==$v['t']){ + $Present=1; + if (!in_array($p2,$this->Reference[$i]['p'])) { + $this->Reference[$i]['p'][] = $p2; + } + } + } + //If not found, add it + if ($Present==0) { + $this->Reference[]=array('t'=>$v['t'],'p'=>array($p2)); + } + } +/*-- END INDEX --*/ + +/*-- TOC --*/ + // Adjust ToC + foreach($this->_kttoc AS $v) { + $this->tocontents->_toc[]=array('t'=>$v['t'],'l'=>$v['l'],'p'=>$p2,'link'=>$v['link'],'toc_id'=>$v['toc_id']); + $this->links[$v['link']][0] = $p2; + $this->links[$v['link']][1] += $yadj[$v['p']]; + } +/*-- END TOC --*/ + + $this->y = $top[$p2] + $height[$p1] + $height[$p2]; + $this->x = $this->lMargin; + + $this->divbuffer = array(); + $this->ktLinks = array(); + $this->ktAnnots = array(); + $this->ktForms = array(); + $this->ktBlock = array(); + $this->ktReference = array(); + $this->ktBMoutlines = array(); + $this->_kttoc = array(); + $this->keep_block_together = 0; + } +} + + +//================================================================== +// Added ELLIPSES and CIRCLES +function Circle($x,$y,$r,$style='S') { + $this->Ellipse($x,$y,$r,$r,$style); +} + +function Ellipse($x,$y,$rx,$ry,$style='S') { + if($style=='F') { $op='f'; } + elseif($style=='FD' or $style=='DF') { $op='B'; } + else { $op='S'; } + $lx=4/3*(M_SQRT2-1)*$rx; + $ly=4/3*(M_SQRT2-1)*$ry; + $h=$this->h; + $this->_out(sprintf('%.3F %.3F m %.3F %.3F %.3F %.3F %.3F %.3F c', ($x+$rx)*_MPDFK,($h-$y)*_MPDFK, ($x+$rx)*_MPDFK,($h-($y-$ly))*_MPDFK, ($x+$lx)*_MPDFK,($h-($y-$ry))*_MPDFK, $x*_MPDFK,($h-($y-$ry))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c', ($x-$lx)*_MPDFK,($h-($y-$ry))*_MPDFK, ($x-$rx)*_MPDFK,($h-($y-$ly))*_MPDFK, ($x-$rx)*_MPDFK,($h-$y)*_MPDFK)); + $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c', ($x-$rx)*_MPDFK,($h-($y+$ly))*_MPDFK, ($x-$lx)*_MPDFK,($h-($y+$ry))*_MPDFK, $x*_MPDFK,($h-($y+$ry))*_MPDFK)); + $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F c %s', ($x+$lx)*_MPDFK,($h-($y+$ry))*_MPDFK, ($x+$rx)*_MPDFK,($h-($y+$ly))*_MPDFK, ($x+$rx)*_MPDFK,($h-$y)*_MPDFK, $op)); +} + +/*-- DIRECTW --*/ +// Added adaptation of shaded_box = AUTOSIZE-TEXT +function AutosizeText($text,$w,$font,$style,$szfont=72) { + $text = $this->purify_utf8_text($text); + if ($this->text_input_as_HTML) { + $text = $this->all_entities_to_utf8($text); + } + if ($this->usingCoreFont) { $text = mb_convert_encoding($text,$this->mb_enc,'UTF-8'); } + $text = ' '.$text.' '; + $width = $this->ConvertSize($w); + $loop = 0; + while ( $loop == 0 ) { + $this->SetFont($font,$style,$szfont); + $sz = $this->GetStringWidth( $text ); + if ( $sz > $w ) { $szfont --; } + else { $loop ++; } + } + $this->SetFont($font,$style,$szfont); + $this->Cell($w, 0, $text, 0, 0, "C"); +} +/*-- END DIRECTW --*/ + + + + + +// ==================================================== +// ==================================================== +/*-- RTL --*/ +function reverse_letters($str) { + $str = strtr($str, '{}[]()', '}{][)('); + return $this->mb_strrev($str, $this->mb_enc); +} + +function magic_reverse_dir(&$chunk, $join=true, $dir) { + if ($this->usingCoreFont) { return 0; } + if ($this->biDirectional) { + // mPDF 5.4.05 Include PUA for non-indexed Arabic glyphs + $pregRTLchars = $this->pregRTLchars; + if ($this->CurrentFont['unAGlyphs']) { $pregRTLchars .= "\x{F500}-\x{F7FF}"; } + + // Change Arabic + Persian. to Presentation Forms + if ($join) { + $chunk = preg_replace("/([".$pregRTLchars."]+)/ue", '$this->ArabJoin(stripslashes(\'\\1\'))', $chunk ); + } + $contains_rtl = false; + $all_rtl = true; + $initSpace = false; + $endSpace = false; + $nonDirchars = "\x{A0}\"\'\(\)\{\}\[\].,:\\/-="; // mPDF 5.6.32 + // mPDF 5.6.43 + $bdo=array(); + preg_match_all('/([\x{202A}\x{202B}])(.*?)([\x{202C}])/u',$chunk,$m); + if (count($m[0])) { + for($i=0;$i<count($m[0]);$i++) { + if ($m[1][$i]=="\xe2\x80\xab") { // Right-to-Left Embedding [RLE] U+202B &#8235; + $mark = code2utf(0xf800+$i); + $bdo[$i] = $this->reverse_letters($m[2][$i]); + } + else if ($m[1][$i]=="\xe2\x80\xaa") { // Left-to-Right Embedding [LRE] U+202A &#8234; + $mark = code2utf(0xf880+$i); + $bdo[$i] = $m[2][$i]; + } + $chunk = preg_replace('/'.preg_quote($m[0][$i],'/').'/u',$mark,$chunk); + } + $pregRTLchars .= "\x{F800}-\x{F87F}"; + } + if (preg_match("/[".$pregRTLchars."]/u",$chunk)) { // Chunk contains RTL characters + if (preg_match("/^[ ]/",$chunk)) { $initSpace = true; $chunk = preg_replace("/^[ ]/",'',$chunk); } + if (preg_match("/[ ]$/",$chunk)) { $endSpace = true; $chunk = preg_replace("/[ ]$/",'',$chunk); } + + if (preg_match("/[^".$pregRTLchars.$nonDirchars." ]/u",$chunk)) { // Chunk also contains LTR characters + $all_rtl = false; + if ($dir == 'rtl') { + $chunk = preg_replace("/([^".$pregRTLchars.$nonDirchars."][".$nonDirchars."]*) ([".$nonDirchars."]*[^".$pregRTLchars.$nonDirchars."])/u","\\1\x07\\2",$chunk); + } + $chunk = preg_replace("/([".$pregRTLchars."][".$nonDirchars."]*) ([".$nonDirchars."]*[".$pregRTLchars."])/u","\\1\x07\\2",$chunk); + $bits = explode(' ',$chunk); + foreach($bits AS $bitkey=>$bit) { + $bit = preg_replace("/\x07/"," ",$bit); + if (preg_match("/^[".$pregRTLchars.$nonDirchars." ]*$/u",$bit)) { + $bits[$bitkey] = $this->reverse_letters($bit); + } + else if (preg_match("/[".$pregRTLchars."]/u",$bit)) { + if ($dir == 'rtl') { + $bit = preg_replace("/([^".$pregRTLchars.$nonDirchars." ])([".$nonDirchars."]*[".$pregRTLchars."])/u","\\1\x07\\2",$bit ); + $bit = preg_replace("/([".$pregRTLchars."][".$nonDirchars."]*)([^".$pregRTLchars.$nonDirchars." ])/u","\\1\x07\\2",$bit ); + } + else { + $bit = preg_replace("/([^".$pregRTLchars." ][".$nonDirchars."]*)([".$pregRTLchars." ])/u","\\1\x07\\2",$bit ); + $bit = preg_replace("/([".$pregRTLchars." ])([".$nonDirchars."]*[^".$pregRTLchars." ])/u","\\1\x07\\2",$bit ); + } + $sbits = explode("\x07",$bit ); + foreach($sbits AS $sbitkey=>$sbit) { + $sbit = preg_replace("/\x07/","",$sbit); + if (preg_match("/^[".$pregRTLchars.$nonDirchars." ]*$/u",$sbit)) { + $sbits[$sbitkey] = $this->reverse_letters($sbit); + } + else if (preg_match("/[".$pregRTLchars."]/u",$sbit) && $dir=='rtl') { + $sbits[$sbitkey] = $this->reverse_letters($sbit); + } + else { + // Reverse numerals only to RTL + $sbit = preg_replace("/([\x{0660}-\x{066C}0-9]+[\x{0660}-\x{066C}0-9\.,:\/]*[\x{0660}-\x{066C}0-9]+)/ue", '$this->reverse_letters(\'\\1\')', $sbit ); // mPDF 5.6.32 // mPDF 5.6.46 + $sbits[$sbitkey] = $sbit; + } + } + if ($dir == 'rtl') { $sbits = array_reverse($sbits,false); } + $bits[$bitkey] = implode('',$sbits); + } + else if (preg_match("/[".$pregRTLchars."]/u",$bit) && $dir=='rtl') { + $bits[$bitkey] = $this->reverse_letters($bit); + } + else { + // Reverse numerals only to RTL + $bit = preg_replace("/([\x{0660}-\x{066C}0-9]+[\x{0660}-\x{066C}0-9\.,:\/]*[\x{0660}-\x{066C}0-9]+)/ue", '$this->reverse_letters(\'\\1\')', $bit ); // mPDF 5.6.32 // mPDF 5.6.46 + $bits[$bitkey] = $bit; + } + } + if ($dir == 'rtl') { $bits = array_reverse($bits,false); } + $chunk = implode(' ',$bits); + } + else { $chunk = $this->reverse_letters($chunk); } + $contains_rtl = true; + + // Un-Reverse numerals back to ltr + $chunk = preg_replace("/([\x{0660}-\x{066C}0-9]+[\x{0660}-\x{066C}0-9\.,:\/]*[\x{0660}-\x{066C}0-9]+)/ue", '$this->reverse_letters(\'\\1\')', $chunk ); // mPDF 5.6.13 // mPDF 5.6.32 // mPDF 5.6.46 + if ($dir == 'rtl') { + if ($endSpace) { $chunk = ' '.$chunk; } + if ($initSpace) { $chunk .= ' '; } + } + else { + if ($initSpace) { $chunk = ' '.$chunk; } + if ($endSpace) { $chunk .= ' '; } + } + } + else { $all_rtl = false; } + + // mPDF 5.6.43 + if (count($bdo)) { + for($i=0;$i<count($bdo);$i++) { + $chunk = preg_replace('/[\x{'.dechex(intval(0xf800+$i)).'}\x{'.dechex(intval(0xf880+$i)).'}]/u',$bdo[$i],$chunk); + } + } + + if ($all_rtl) { return 2; } + else if ($contains_rtl) { return 1; } + else { return 0; } + } + return 0; +} +/*-- END RTL --*/ + +// +// **************************** +// **************************** + + +function SetSubstitutions() { + $subsarray = array(); + @include(_MPDF_PATH.'includes/subs_win-1252.php'); + $this->substitute = array(); + foreach($subsarray AS $key => $val) { + $this->substitute[code2utf($key)] = $val; + } +} + + +function SubstituteChars($html) { + // only substitute characters between tags + if (count($this->substitute)) { + $a=preg_split('/(<.*?>)/ms',$html,-1,PREG_SPLIT_DELIM_CAPTURE); + $html = ''; + foreach($a as $i => $e) { + if($i%2==0) { + $e = strtr($e, $this->substitute); + } + $html .= $e; + } + } + return $html; +} + + +function SubstituteCharsSIP(&$writehtml_a, &$writehtml_i, &$writehtml_e) { + if (preg_match("/^(.*?)([\x{20000}-\x{2FFFF}]+)(.*)/u", $writehtml_e, $m)) { + if (isset($this->CurrentFont['sipext']) && $this->CurrentFont['sipext']) { + $font = $this->CurrentFont['sipext']; + if (!in_array($font, $this->available_unifonts)) { return 0; } + $writehtml_a[$writehtml_i] = $writehtml_e = $m[1]; + array_splice($writehtml_a, $writehtml_i+1, 0, array('span style="font-family: '.$font.'"', $m[2], '/span', $m[3])); + $this->subPos = $writehtml_i; + return 4; + } + } + return 0; +} + +// If core font is selected in document which is not onlyCoreFonts - substitute with non-core font +function SubstituteCharsNonCore(&$writehtml_a, &$writehtml_i, &$writehtml_e) { + if (mb_convert_encoding(mb_convert_encoding($writehtml_e, $this->mb_enc, "UTF-8"), "UTF-8", $this->mb_enc) == $writehtml_e) { + return 0; + } + $cw = &$this->CurrentFont['cw']; + $unicode = $this->UTF8StringToArray($writehtml_e, false); + $start = -1; + $end = 0; + $flag = 0; + $ftype = ''; + $u = array(); + if (!$this->subArrMB) { + include(_MPDF_PATH.'includes/subs_core.php'); + $this->subArrMB['a'] = $aarr; + $this->subArrMB['s'] = $sarr; + $this->subArrMB['z'] = $zarr; + } + foreach($unicode AS $c => $char) { + if (($char> 127 || ($flag==1 && $char==32)) && $char != 173 && (!isset($this->subArrMB['a'][$char]) || ($flag==1 && $char==32)) && ($char<1536 || ($char>1791 && $char < 2304) || $char>3455)) { + if ($flag==0) { $start=$c; } + $flag=1; + $u[] = $char; + } + else if ($flag>0) { $end=$c-1; break; } + } + if ($flag>0 && !$end) { $end=count($unicode)-1; } + if ($start==-1) { return 0; } + // TRY IN BACKUP SUBS FONT + if (!is_array($this->backupSubsFont)) { $this->backupSubsFont = array("$this->backupSubsFont"); } + foreach($this->backupSubsFont AS $bsfctr=>$bsf) { + if ($this->fonttrans[$bsf] == 'chelvetica' || $this->fonttrans[$bsf] == 'ctimes' || $this->fonttrans[$bsf] == 'ccourier') { continue; } + $font = $bsf; + unset($cw); + $cw = ''; + if (isset($this->fonts[$font])) { $cw = &$this->fonts[$font]['cw']; } + else if (file_exists(_MPDF_TTFONTDATAPATH.$font.'.cw.dat')) { $cw = @file_get_contents(_MPDF_TTFONTDATAPATH.$font.'.cw.dat'); } + else { + + $prevFontFamily = $this->FontFamily; + $prevFontStyle = $this->currentfontstyle; + $prevFontSizePt = $this->FontSizePt; + $this->SetFont($bsf, '', '', false); + $cw = @file_get_contents(_MPDF_TTFONTDATAPATH.$font.'.cw.dat'); + $this->SetFont($prevFontFamily, $prevFontStyle, $prevFontSizePt, false); + } + if (!$cw) { continue; } + $l = 0; + foreach($u AS $char) { + if ($char == 173 || $this->_charDefined($cw,$char) || ($char>1536 && $char<1791) || ($char>2304 && $char<3455 )) { + $l++; + } + else { + if ($l==0 && $bsfctr == (count($this->backupSubsFont)-1)) { // Not found even in last backup font + $cont = mb_substr($writehtml_e, $start+1); + $writehtml_e = mb_substr($writehtml_e, 0, $start+1, 'UTF-8'); + array_splice($writehtml_a, $writehtml_i+1, 0, array('', $cont)); + $this->subPos = $writehtml_i+1; + return 2; + } + else { break; } + } + } + if ($l > 0) { + $patt = mb_substr($writehtml_e, $start, $l, 'UTF-8'); + if (preg_match("/(.*?)(".preg_quote($patt,'/').")(.*)/u", $writehtml_e, $m)) { + $writehtml_e = $m[1]; + array_splice($writehtml_a, $writehtml_i+1, 0, array('span style="font-family: '.$font.'"', $m[2], '/span', $m[3])); + $this->subPos = $writehtml_i+3; + return 4; + } + } + } + + unset($cw); + return 0; +} + + +function SubstituteCharsMB(&$writehtml_a, &$writehtml_i, &$writehtml_e) { + $cw = &$this->CurrentFont['cw']; + $unicode = $this->UTF8StringToArray($writehtml_e, false); + $start = -1; + $end = 0; + $flag = 0; + $ftype = ''; + $u = array(); + foreach($unicode AS $c => $char) { + if (($flag == 0 || $flag==2) && (!$this->_charDefined($cw,$char) || ($flag==2 && $char==32)) && $this->checkSIP && $char > 131071) { // Unicode Plane 2 (SIP) + if (in_array($this->FontFamily ,$this->available_CJK_fonts)) { return 0; } + if ($flag==0) { $start=$c; } + $flag=2; + $u[] = $char; + } + //else if (($flag == 0 || $flag==1) && $char != 173 && !$this->_charDefined($cw,$char) && ($char<1423 || ($char>3583 && $char < 11263))) { + else if (($flag == 0 || $flag==1) && $char != 173 && (!$this->_charDefined($cw,$char) || ($flag==1 && $char==32)) && ($char<1536 || ($char>1791 && $char < 2304) || $char>3455)) { + if ($flag==0) { $start=$c; } + $flag=1; + $u[] = $char; + } + else if ($flag>0) { $end=$c-1; break; } + } + if ($flag>0 && !$end) { $end=count($unicode)-1; } + if ($start==-1) { return 0; } + if ($flag == 2) { // SIP + // Check if current CJK font has a ext-B related font + if (isset($this->CurrentFont['sipext']) && $this->CurrentFont['sipext']) { + $font = $this->CurrentFont['sipext']; + unset($cw); + $cw = ''; + if (isset($this->fonts[$font])) { $cw = &$this->fonts[$font]['cw']; } + else if (file_exists(_MPDF_TTFONTDATAPATH.$font.'.cw.dat')) { $cw = @file_get_contents(_MPDF_TTFONTDATAPATH.$font.'.cw.dat'); } + else { + $prevFontFamily = $this->FontFamily; + $prevFontStyle = $this->currentfontstyle; + $prevFontSizePt = $this->FontSizePt; + $this->SetFont($font, '', '', false); + $cw = @file_get_contents(_MPDF_TTFONTDATAPATH.$font.'.cw.dat'); + $this->SetFont($prevFontFamily, $prevFontStyle, $prevFontSizePt, false); + } + if (!$cw) { return 0; } + $l = 0; + foreach($u AS $char) { + if ($this->_charDefined($cw,$char) || $char > 131071) { + $l++; + } + else { break; } + } + if ($l > 0) { + $patt = mb_substr($writehtml_e, $start, $l); + if (preg_match("/(.*?)(".preg_quote($patt,'/').")(.*)/u", $writehtml_e, $m)) { + $writehtml_e = $m[1]; + array_splice($writehtml_a, $writehtml_i+1, 0, array('span style="font-family: '.$font.'"', $m[2], '/span', $m[3])); + $this->subPos = $writehtml_i+3; + return 4; + } + } + } + // Check Backup SIP font (defined in config_fonts.php) + if (isset($this->backupSIPFont) && $this->backupSIPFont) { + if ($this->currentfontfamily != $this->backupSIPFont) { $font = $this->backupSIPFont; } + else { unset($cw); return 0; } + unset($cw); + $cw = ''; + if (isset($this->fonts[$font])) { $cw = &$this->fonts[$font]['cw']; } + else if (file_exists(_MPDF_TTFONTDATAPATH.$font.'.cw.dat')) { $cw = @file_get_contents(_MPDF_TTFONTDATAPATH.$font.'.cw.dat'); } + else { + $prevFontFamily = $this->FontFamily; + $prevFontStyle = $this->currentfontstyle; + $prevFontSizePt = $this->FontSizePt; + $this->SetFont($this->backupSIPFont, '', '', false); + $cw = @file_get_contents(_MPDF_TTFONTDATAPATH.$font.'.cw.dat'); + $this->SetFont($prevFontFamily, $prevFontStyle, $prevFontSizePt, false); + } + if (!$cw) { return 0; } + $l = 0; + foreach($u AS $char) { + if ($this->_charDefined($cw,$char) || $char > 131071) { + $l++; + } + else { break; } + } + if ($l > 0) { + $patt = mb_substr($writehtml_e, $start, $l); + if (preg_match("/(.*?)(".preg_quote($patt,'/').")(.*)/u", $writehtml_e, $m)) { + $writehtml_e = $m[1]; + array_splice($writehtml_a, $writehtml_i+1, 0, array('span style="font-family: '.$font.'"', $m[2], '/span', $m[3])); + $this->subPos = $writehtml_i+3; + return 4; + } + } + } + return 0; + } + + + // FIRST TRY CORE FONTS + if (!$this->PDFA && !$this->PDFX) { + $repl = array(); + if (!$this->subArrMB) { + include(_MPDF_PATH.'includes/subs_core.php'); + $this->subArrMB['a'] = $aarr; + $this->subArrMB['s'] = $sarr; + $this->subArrMB['z'] = $zarr; + } + if (isset($this->subArrMB['a'][$u[0]])) { + $font = 'tta'; $ftype = 'C'; + foreach($u AS $char) { + if ($this->subArrMB['a'][$char]) { $repl[] = $this->subArrMB['a'][$char]; } + else { break; } + } + } + else if (isset($this->subArrMB['z'][$u[0]])) { + $font = 'ttz'; $ftype = 'C'; + foreach($u AS $char) { + if ($this->subArrMB['z'][$char]) { $repl[] = $this->subArrMB['z'][$char]; } + else { break; } + } + } + else if (isset($this->subArrMB['s'][$u[0]])) { + $font = 'tts'; $ftype = 'C'; + foreach($u AS $char) { + if ($this->subArrMB['s'][$char]) { $repl[] = $this->subArrMB['s'][$char]; } + else { break; } + } + } + if ($ftype=='C') { + $patt = mb_substr($writehtml_e, $start, count($repl)); + if (preg_match("/(.*?)(".preg_quote($patt,'/').")(.*)/u", $writehtml_e, $m)) { + $writehtml_e = $m[1]; + array_splice($writehtml_a, $writehtml_i+1, 0, array($font, implode('|', $repl), '/'.$font, $m[3])); // e.g. <tts> + $this->subPos = $writehtml_i+3; + return 4; + } + return 0; + } + } + + // FIND IN DEFAULT FONT - removed mPDF 5.0 + + // LASTLY TRY IN BACKUP SUBS FONT + if (!is_array($this->backupSubsFont)) { $this->backupSubsFont = array("$this->backupSubsFont"); } + foreach($this->backupSubsFont AS $bsfctr=>$bsf) { + if ($this->currentfontfamily != $bsf) { $font = $bsf; } + else { continue; } + unset($cw); + $cw = ''; + if (isset($this->fonts[$font])) { $cw = &$this->fonts[$font]['cw']; } + else if (file_exists(_MPDF_TTFONTDATAPATH.$font.'.cw.dat')) { $cw = @file_get_contents(_MPDF_TTFONTDATAPATH.$font.'.cw.dat'); } + else { + $prevFontFamily = $this->FontFamily; + $prevFontStyle = $this->currentfontstyle; + $prevFontSizePt = $this->FontSizePt; + $this->SetFont($bsf, '', '', false); + $cw = @file_get_contents(_MPDF_TTFONTDATAPATH.$font.'.cw.dat'); + $this->SetFont($prevFontFamily, $prevFontStyle, $prevFontSizePt, false); + } + if (!$cw) { continue; } + $l = 0; + foreach($u AS $char) { + if ($char == 173 || $this->_charDefined($cw,$char) || ($char>1536 && $char<1791) || ($char>2304 && $char<3455 )) { // Arabic and Indic + $l++; + } + else { + if ($l==0 && $bsfctr == (count($this->backupSubsFont)-1)) { // Not found even in last backup font + $cont = mb_substr($writehtml_e, $start+1); + $writehtml_e = mb_substr($writehtml_e, 0, $start+1); + array_splice($writehtml_a, $writehtml_i+1, 0, array('', $cont)); + $this->subPos = $writehtml_i+1; + return 2; + } + else { break; } + } + } + if ($l > 0) { + $patt = mb_substr($writehtml_e, $start, $l); + if (preg_match("/(.*?)(".preg_quote($patt,'/').")(.*)/u", $writehtml_e, $m)) { + $writehtml_e = $m[1]; + array_splice($writehtml_a, $writehtml_i+1, 0, array('span style="font-family: '.$font.'"', $m[2], '/span', $m[3])); + $this->subPos = $writehtml_i+3; + return 4; + } + } + } + + unset($cw); + return 0; +} + + +function setHiEntitySubstitutions() { + $entarr = array ( + 'nbsp' => '160', 'iexcl' => '161', 'cent' => '162', 'pound' => '163', 'curren' => '164', 'yen' => '165', 'brvbar' => '166', 'sect' => '167', + 'uml' => '168', 'copy' => '169', 'ordf' => '170', 'laquo' => '171', 'not' => '172', 'shy' => '173', 'reg' => '174', 'macr' => '175', + 'deg' => '176', 'plusmn' => '177', 'sup2' => '178', 'sup3' => '179', 'acute' => '180', 'micro' => '181', 'para' => '182', 'middot' => '183', + 'cedil' => '184', 'sup1' => '185', 'ordm' => '186', 'raquo' => '187', 'frac14' => '188', 'frac12' => '189', 'frac34' => '190', + 'iquest' => '191', 'Agrave' => '192', 'Aacute' => '193', 'Acirc' => '194', 'Atilde' => '195', 'Auml' => '196', 'Aring' => '197', + 'AElig' => '198', 'Ccedil' => '199', 'Egrave' => '200', 'Eacute' => '201', 'Ecirc' => '202', 'Euml' => '203', 'Igrave' => '204', + 'Iacute' => '205', 'Icirc' => '206', 'Iuml' => '207', 'ETH' => '208', 'Ntilde' => '209', 'Ograve' => '210', 'Oacute' => '211', + 'Ocirc' => '212', 'Otilde' => '213', 'Ouml' => '214', 'times' => '215', 'Oslash' => '216', 'Ugrave' => '217', 'Uacute' => '218', + 'Ucirc' => '219', 'Uuml' => '220', 'Yacute' => '221', 'THORN' => '222', 'szlig' => '223', 'agrave' => '224', 'aacute' => '225', + 'acirc' => '226', 'atilde' => '227', 'auml' => '228', 'aring' => '229', 'aelig' => '230', 'ccedil' => '231', 'egrave' => '232', + 'eacute' => '233', 'ecirc' => '234', 'euml' => '235', 'igrave' => '236', 'iacute' => '237', 'icirc' => '238', 'iuml' => '239', + 'eth' => '240', 'ntilde' => '241', 'ograve' => '242', 'oacute' => '243', 'ocirc' => '244', 'otilde' => '245', 'ouml' => '246', + 'divide' => '247', 'oslash' => '248', 'ugrave' => '249', 'uacute' => '250', 'ucirc' => '251', 'uuml' => '252', 'yacute' => '253', + 'thorn' => '254', 'yuml' => '255', 'OElig' => '338', 'oelig' => '339', 'Scaron' => '352', 'scaron' => '353', 'Yuml' => '376', + 'fnof' => '402', 'circ' => '710', 'tilde' => '732', 'Alpha' => '913', 'Beta' => '914', 'Gamma' => '915', 'Delta' => '916', + 'Epsilon' => '917', 'Zeta' => '918', 'Eta' => '919', 'Theta' => '920', 'Iota' => '921', 'Kappa' => '922', 'Lambda' => '923', + 'Mu' => '924', 'Nu' => '925', 'Xi' => '926', 'Omicron' => '927', 'Pi' => '928', 'Rho' => '929', 'Sigma' => '931', 'Tau' => '932', + 'Upsilon' => '933', 'Phi' => '934', 'Chi' => '935', 'Psi' => '936', 'Omega' => '937', 'alpha' => '945', 'beta' => '946', 'gamma' => '947', + 'delta' => '948', 'epsilon' => '949', 'zeta' => '950', 'eta' => '951', 'theta' => '952', 'iota' => '953', 'kappa' => '954', + 'lambda' => '955', 'mu' => '956', 'nu' => '957', 'xi' => '958', 'omicron' => '959', 'pi' => '960', 'rho' => '961', 'sigmaf' => '962', + 'sigma' => '963', 'tau' => '964', 'upsilon' => '965', 'phi' => '966', 'chi' => '967', 'psi' => '968', 'omega' => '969', + 'thetasym' => '977', 'upsih' => '978', 'piv' => '982', 'ensp' => '8194', 'emsp' => '8195', 'thinsp' => '8201', 'zwnj' => '8204', + 'zwj' => '8205', 'lrm' => '8206', 'rlm' => '8207', 'ndash' => '8211', 'mdash' => '8212', 'lsquo' => '8216', 'rsquo' => '8217', + 'sbquo' => '8218', 'ldquo' => '8220', 'rdquo' => '8221', 'bdquo' => '8222', 'dagger' => '8224', 'Dagger' => '8225', 'bull' => '8226', + 'hellip' => '8230', 'permil' => '8240', 'prime' => '8242', 'Prime' => '8243', 'lsaquo' => '8249', 'rsaquo' => '8250', 'oline' => '8254', + 'frasl' => '8260', 'euro' => '8364', 'image' => '8465', 'weierp' => '8472', 'real' => '8476', 'trade' => '8482', 'alefsym' => '8501', + 'larr' => '8592', 'uarr' => '8593', 'rarr' => '8594', 'darr' => '8595', 'harr' => '8596', 'crarr' => '8629', 'lArr' => '8656', + 'uArr' => '8657', 'rArr' => '8658', 'dArr' => '8659', 'hArr' => '8660', 'forall' => '8704', 'part' => '8706', 'exist' => '8707', + 'empty' => '8709', 'nabla' => '8711', 'isin' => '8712', 'notin' => '8713', 'ni' => '8715', 'prod' => '8719', 'sum' => '8721', + 'minus' => '8722', 'lowast' => '8727', 'radic' => '8730', 'prop' => '8733', 'infin' => '8734', 'ang' => '8736', 'and' => '8743', + 'or' => '8744', 'cap' => '8745', 'cup' => '8746', 'int' => '8747', 'there4' => '8756', 'sim' => '8764', 'cong' => '8773', + 'asymp' => '8776', 'ne' => '8800', 'equiv' => '8801', 'le' => '8804', 'ge' => '8805', 'sub' => '8834', 'sup' => '8835', 'nsub' => '8836', + 'sube' => '8838', 'supe' => '8839', 'oplus' => '8853', 'otimes' => '8855', 'perp' => '8869', 'sdot' => '8901', 'lceil' => '8968', + 'rceil' => '8969', 'lfloor' => '8970', 'rfloor' => '8971', 'lang' => '9001', 'rang' => '9002', 'loz' => '9674', 'spades' => '9824', + 'clubs' => '9827', 'hearts' => '9829', 'diams' => '9830', + ); + foreach($entarr AS $key => $val) { + $this->entsearch[] = '&'.$key.';'; + $this->entsubstitute[] = code2utf($val); + } +} + +function SubstituteHiEntities($html) { + // converts html_entities > ASCII 127 to unicode + // Leaves in particular &lt; to distinguish from tag marker + if (count($this->entsearch)) { + $html = str_replace($this->entsearch,$this->entsubstitute,$html); + } + return $html; +} + + +// Edited v1.2 Pass by reference; option to continue if invalid UTF-8 chars +function is_utf8(&$string) { + if ($string === mb_convert_encoding(mb_convert_encoding($string, "UTF-32", "UTF-8"), "UTF-8", "UTF-32")) { + return true; + } + else { + if ($this->ignore_invalid_utf8) { + $string = mb_convert_encoding(mb_convert_encoding($string, "UTF-32", "UTF-8"), "UTF-8", "UTF-32") ; + return true; + } + else { + return false; + } + } +} + + +function purify_utf8($html,$lo=true) { + // For HTML + // Checks string is valid UTF-8 encoded + // converts html_entities > ASCII 127 to UTF-8 + // Only exception - leaves low ASCII entities e.g. &lt; &amp; etc. + // Leaves in particular &lt; to distinguish from tag marker + if (!$this->is_utf8($html)) { + echo "<p><b>HTML contains invalid UTF-8 character(s)</b></p>"; + while (mb_convert_encoding(mb_convert_encoding($html, "UTF-32", "UTF-8"), "UTF-8", "UTF-32") != $html) { + $a = iconv('UTF-8', 'UTF-8', $html); + echo ($a); + $pos = $start = strlen($a); + $err = ''; + while ( ord(substr($html,$pos,1)) > 128 ) { + $err .= '[[#'.ord(substr($html,$pos,1)).']]'; + $pos++; + } + echo '<span style="color:red; font-weight:bold">'.$err.'</span>'; + $html = substr($html, $pos); + } + echo $html; + $this->Error(""); + } + $html = preg_replace("/\r/", "", $html ); + + // converts html_entities > ASCII 127 to UTF-8 + // Leaves in particular &lt; to distinguish from tag marker + $html = $this->SubstituteHiEntities($html); + + // converts all &#nnn; or &#xHHH; to UTF-8 multibyte + // If $lo==true then includes ASCII < 128 + $html = strcode2utf($html,$lo); + return ($html); +} + +function purify_utf8_text($txt) { + // For TEXT + // Make sure UTF-8 string of characters + if (!$this->is_utf8($txt)) { $this->Error("Text contains invalid UTF-8 character(s)"); } + + $txt = preg_replace("/\r/", "", $txt ); + + return ($txt); +} +function all_entities_to_utf8($txt) { + // converts txt_entities > ASCII 127 to UTF-8 + // Leaves in particular &lt; to distinguish from tag marker + $txt = $this->SubstituteHiEntities($txt); + + // converts all &#nnn; or &#xHHH; to UTF-8 multibyte + $txt = strcode2utf($txt); + + $txt = $this->lesser_entity_decode($txt); + return ($txt); +} + + +// ==================================================== +/*-- BARCODES --*/ +// UPC/EAN barcode +// EAN13, EAN8, UPCA, UPCE, ISBN, ISSN +// Accepts 12 or 13 digits with or without - hyphens +function WriteBarcode($code, $showtext=1, $x='', $y='', $size=1, $border=0, $paddingL=1, $paddingR=1, $paddingT=2, $paddingB=2, $height=1, $bgcol=false, $col=false, $btype='ISBN', $supplement='0', $supplement_code='', $k=1) { + if (empty($code)) { + return; + } + $codestr = $code; + $code = preg_replace('/\-/','',$code); + + if (!class_exists('PDFBarcode', false)) { + include(_MPDF_PATH.'classes/barcode.php'); + } + $this->barcode = new PDFBarcode(); + if ($btype == 'ISSN' || $btype == 'ISBN') { + $arrcode = $this->barcode->getBarcodeArray($code, 'EAN13'); + } + else { $arrcode = $this->barcode->getBarcodeArray($code, $btype); } + + if ($arrcode === false) { $this->Error('Error in barcode string: '.$codestr); } + if((($btype=='EAN13' || $btype=='ISBN' || $btype=='ISSN') && strlen($code) == 12) || ($btype=='UPCA' && strlen($code) == 11) + || ($btype=='UPCE' && strlen($code) == 11) || ($btype=='EAN8' && strlen($code) == 7)) { + $code .= $arrcode['checkdigit']; + if (stristr($codestr,'-')) { $codestr .= '-' . $arrcode['checkdigit']; } + else { $codestr .= $arrcode['checkdigit']; } + } + if ($btype == 'ISBN') { $codestr = 'ISBN '.$codestr; } + if ($btype == 'ISSN') { $codestr = 'ISSN '.$codestr; } + + if (empty($x)) { + $x = $this->x; + } + if (empty($y)) { + $y = $this->y; + } + // set foreground color + $prevDrawColor = $this->DrawColor; + $prevTextColor = $this->TextColor; + $prevFillColor = $this->FillColor; + $lw = $this->LineWidth; + $this->SetLineWidth(0.01); + + $size /= $k; // in case resized in a table + + $xres = $arrcode['nom-X'] * $size; + $llm = $arrcode['lightmL'] * $arrcode['nom-X'] * $size; // Left Light margin + $rlm = $arrcode['lightmR'] * $arrcode['nom-X'] * $size; // Right Light margin + + $bcw = ($arrcode["maxw"] * $xres); // Barcode width = Should always be 31.35mm * $size + + $fbw = $bcw + $llm + $rlm; // Full barcode width incl. light margins + $ow = $fbw + $paddingL + $paddingR; // Full overall width incl. user-defined padding + + $fbwi = $fbw - 2; // Full barcode width incl. light margins - 2mm - for isbn string + + // cf. http://www.gs1uk.org/downloads/bar_code/Bar coding getting it right.pdf + $num_height = 3 * $size; // Height of numerals + $fbh = $arrcode['nom-H'] * $size * $height; // Full barcode height incl. numerals + $bch = $fbh - (1.5 * $size); // Barcode height of bars (3mm for numerals) + + if (($btype=='EAN13' && $showtext) || $btype == 'ISSN' || $btype == 'ISBN') { // Add height for ISBN string + margin from top of bars + $tisbnm = 1.5 * $size; // Top margin between isbn (if shown) & bars + $codestr_fontsize = 2.1 * $size; + $paddingT += $codestr_fontsize + $tisbnm ; + } + $oh = $fbh + $paddingT + $paddingB; // Full overall height incl. user-defined padding + + // PRINT border background color + $xpos = $x; + $ypos = $y; + if ($col) { + $this->SetDColor($col); + $this->SetTColor($col); + } + else { + $this->SetDColor($this->ConvertColor(0)); + $this->SetTColor($this->ConvertColor(0)); + } + if ($bgcol) { + $this->SetFColor($bgcol); + } + else { $this->SetFColor($this->ConvertColor(255)); } + if (!$bgcol && !$col) { // fn. called directly - not via HTML + if ($border) { $fillb = 'DF'; } else { $fillb = 'F'; } + $this->Rect($xpos, $ypos, $ow, $oh, $fillb); + } + + + // PRINT BARS + $xpos = $x + $paddingL + $llm ; + $ypos = $y + $paddingT; + if ($col) { $this->SetFColor($col); } + else { $this->SetFColor($this->ConvertColor(0)); } + if ($arrcode !== false) { + foreach ($arrcode["bcode"] AS $v) { + $bw = ($v["w"] * $xres); + if ($v["t"]) { + // draw a vertical bar + $this->Rect($xpos, $ypos, $bw, $bch, 'F'); + } + $xpos += $bw; + } + } + + + // print text + $prevFontFamily = $this->FontFamily; + $prevFontStyle = $this->FontStyle; + $prevFontSizePt = $this->FontSizePt; + + // ISBN string + if (($btype=='EAN13' && $showtext) || $btype=='ISBN' || $btype=='ISSN') { + if ($this->onlyCoreFonts) { + $this->SetFont('chelvetica'); + } + else { + $this->SetFont('sans'); + } + + if ($bgcol) { $this->SetFColor($bgcol); } + else { $this->SetFColor($this->ConvertColor(255)); } + $this->x = $x + $paddingL + 1; // 1mm left margin (cf. $fbwi above) + // max width is $fbwi + $loop = 0; + while ( $loop == 0 ) { + $this->SetFontSize($codestr_fontsize*1.4*_MPDFK, false); // don't write + $sz = $this->GetStringWidth( $codestr ); + if ($sz > $fbwi) + $codestr_fontsize -= 0.1; + else + $loop ++; + } + $this->SetFont('','',$codestr_fontsize*1.4*_MPDFK, true, true); // * 1.4 because font height is only 7/10 of given mm + // WORD SPACING + if ($fbwi > $sz) { + $xtra = $fbwi - $sz; + $charspacing = $xtra / (strlen($codestr)-1); + if ($charspacing) { $this->_out(sprintf('BT %.3F Tc ET',$charspacing*_MPDFK)); } + } + $this->y = $y + $paddingT - ($codestr_fontsize ) - $tisbnm ; + $this->Cell($fbw , $codestr_fontsize, $codestr); + if ($charspacing) { $this->_out('BT 0 Tc ET'); } + } + + + // Bottom NUMERALS + if ($this->onlyCoreFonts) { + $this->SetFont('mono'); + } + else { + if (in_array('ocrb',$this->available_unifonts)) { $this->SetFont('ocrb'); } + else { $this->SetFont('mono'); } + } + if (isset($this->CurrentFont['desc']['CapHeight'])) { $fh = (1000/$this->CurrentFont['desc']['CapHeight']); } + else if (isset($this->CurrentFont['desc']['Ascent'])) { $fh = (1000/$this->CurrentFont['desc']['Ascent']); } + else { $fh = 1.2; } + + $charRO = ''; + if ($btype=='EAN13' || $btype=='ISBN' || $btype=='ISSN') { + $outerfontsize = 3; // Inner fontsize = 3 + $outerp = $xres * 4; + $innerp = $xres * 2.5; + $textw = ($bcw*0.5) - $outerp - $innerp; + $chars = 6; // number of numerals in each half + $charLO = substr($code,0,1); // Left Outer + $charLI = substr($code,1,6); // Left Inner + $charRI = substr($code,7,6); // Right Inner + if (!$supplement) $charRO = '>'; // Right Outer + } + else if ($btype=='UPCA') { + $outerfontsize = 2.3; // Inner fontsize = 3 + $outerp = $xres * 10; + $innerp = $xres * 2.5; + $textw = ($bcw*0.5) - $outerp - $innerp; + $chars = 5; + $charLO = substr($code,0,1); // Left Outer + $charLI = substr($code,1,5); // Left Inner + $charRI = substr($code,6,5); // Right Inner + $charRO = substr($code,11,1); // Right Outer + } + else if ($btype=='UPCE') { + $outerfontsize = 2.3; // Inner fontsize = 3 + $outerp = $xres * 4; + $innerp = 0; + $textw = ($bcw*0.5) - $outerp - $innerp; + $chars = 3; + $upce_code = $arrcode['code']; + $charLO = substr($code,0,1); // Left Outer + $charLI = substr($upce_code,0,3); // Left Inner + $charRI = substr($upce_code,3,3); // Right Inner + $charRO = substr($code,11,1); // Right Outer + } + else if ($btype=='EAN8') { + $outerfontsize = 3; // Inner fontsize = 3 + $outerp = $xres * 4; + $innerp = $xres * 2.5; + $textw = ($bcw*0.5) - $outerp - $innerp; + $chars = 4; + $charLO = '<'; // Left Outer + $charLI = substr($code,0,4); // Left Inner + $charRI = substr($code,4,4); // Right Inner + if (!$supplement) $charRO = '>'; // Right Outer + } + + $this->SetFontSize(($outerfontsize/3)*3*$fh*$size*_MPDFK); // 3mm numerals (FontSize is larger to account for space above/below characters) + + if (!$this->usingCoreFont) { $cw = $this->_getCharWidth($this->CurrentFont['cw'],32)*3*$fh*$size/1000; } // character width at 3mm + else { $cw = $this->_getCharWidth($this->CurrentFont['cw'],48)*3*$fh*$size/1000; } // 48 == char "0" + + // Outer left character + $y_text = $y + $paddingT + $bch - ($num_height/2); + $y_text_outer = $y + $paddingT + $bch - ($num_height*($outerfontsize/3)/2); + + $this->x = $x + $paddingL - ($cw*($outerfontsize/3)*0.1); // 0.1 is correction as char does not fill full width; + $this->y = $y_text_outer; + $this->Cell($cw, $num_height, $charLO ); + + // WORD SPACING for inner chars + $xtra = $textw - ($cw*$chars); + $charspacing = $xtra / ($chars-1); + if ($charspacing) { $this->_out(sprintf('BT %.3F Tc ET',$charspacing*_MPDFK)); } + + if ($bgcol) { $this->SetFColor($bgcol); } + else { $this->SetFColor($this->ConvertColor(255)); } + + $this->SetFontSize(3*$fh*$size*_MPDFK); // 3mm numerals (FontSize is larger to account for space above/below characters) + + // Inner left half characters + $this->x = $x + $paddingL + $llm + $outerp; + $this->y = $y_text; + $this->Cell($textw, $num_height, $charLI , 0, 0, '', 1); + + // Inner right half characters + $this->x = $x + $paddingL + $llm + ($bcw*0.5) + $innerp; + $this->y = $y_text; + $this->Cell($textw, $num_height, $charRI , 0, 0, '', 1); + + if ($charspacing) { $this->_out('BT 0 Tc ET'); } + + // Outer Right character + $this->SetFontSize(($outerfontsize/3)*3*$fh*$size*_MPDFK); // 3mm numerals (FontSize is larger to account for space above/below characters) + + $this->x = $x + $paddingL + $llm + $bcw + $rlm - ($cw*($outerfontsize/3)*0.9); // 0.9 is correction as char does not fill full width + $this->y = $y_text_outer; + $this->Cell($cw*($outerfontsize/3), $num_height, $charRO , 0, 0, 'R'); + + if ($supplement) { // EAN-2 or -5 Supplement + // PRINT BARS + $supparrcode = $this->barcode->getBarcodeArray($supplement_code, 'EAN'.$supplement); + if ($supparrcode === false) { $this->Error('Error in barcode string (supplement): '.$codestr.' '.$supplement_code); } + if(strlen($supplement_code) != $supplement) { + $this->Error('Barcode supplement incorrect: '.$supplement_code); + } + $llm = $fbw - (($arrcode['lightmR'] - $supparrcode['sepM']) * $arrcode['nom-X'] * $size); // Left Light margin + $rlm = $arrcode['lightmR'] * $arrcode['nom-X'] * $size; // Right Light margin + + $bcw = ($supparrcode["maxw"] * $xres); // Barcode width = Should always be 31.35mm * $size + + $fbw = $bcw + $llm + $rlm; // Full barcode width incl. light margins + $ow = $fbw + $paddingL + $paddingR; // Full overall width incl. user-defined padding + $bch = $fbh - (1.5 * $size) - ($num_height + 0.5); // Barcode height of bars (3mm for numerals) + + $xpos = $x + $paddingL + $llm ; + $ypos = $y + $paddingT + $num_height + 0.5; + if ($col) { $this->SetFColor($col); } + else { $this->SetFColor($this->ConvertColor(0)); } + if ($supparrcode !== false) { + foreach ($supparrcode["bcode"] AS $v) { + $bw = ($v["w"] * $xres); + if ($v["t"]) { + // draw a vertical bar + $this->Rect($xpos, $ypos, $bw, $bch, 'F'); + } + $xpos += $bw; + } + } + + // Characters + if ($bgcol) { $this->SetFColor($bgcol); } + else { $this->SetFColor($this->ConvertColor(255)); } + $this->SetFontSize(3*$fh*$size*_MPDFK); // 3mm numerals (FontSize is larger to account for space above/below characters) + $this->x = $x + $paddingL + $llm; + $this->y = $y + $paddingT; + $this->Cell($bcw, $num_height, $supplement_code, 0, 0, 'C'); + + // Outer Right character (light margin) + $this->SetFontSize(($outerfontsize/3)*3*$fh*$size*_MPDFK); // 3mm numerals (FontSize is larger to account for space above/below characters) + $this->x = $x + $paddingL + $llm + $bcw + $rlm - ($cw*0.9); // 0.9 is correction as char does not fill full width + $this->y = $y + $paddingT; + $this->Cell($cw*($outerfontsize/3), $num_height, '>', 0, 0, 'R'); + } + + + + // Restore ************** + $this->SetFont($prevFontFamily, $prevFontStyle, $prevFontSizePt); + $this->DrawColor = $prevDrawColor; + $this->TextColor = $prevTextColor; + $this->FillColor = $prevFillColor; + $this->SetLineWidth($lw); + $this->SetY($y); +} + + + +// ==================================================== +// POSTAL and OTHER barcodes +function WriteBarcode2($code, $x='', $y='', $size=1, $height=1, $bgcol=false, $col=false, $btype='IMB', $print_ratio='', $k=1) { + if (empty($code)) { return; } + if (!class_exists('PDFBarcode', false)) { + include(_MPDF_PATH.'classes/barcode.php'); + } + $this->barcode = new PDFBarcode(); + $arrcode = $this->barcode->getBarcodeArray($code, $btype, $print_ratio); + + if ($arrcode === false) { $this->Error('Error in barcode string: '.$code); } + if (empty($x)) { $x = $this->x; } + if (empty($y)) { $y = $this->y; } + $prevDrawColor = $this->DrawColor; + $prevTextColor = $this->TextColor; + $prevFillColor = $this->FillColor; + $lw = $this->LineWidth; + $this->SetLineWidth(0.01); + $size /= $k; // in case resized in a table + $xres = $arrcode['nom-X'] * $size; + + if ($btype == 'IMB' || $btype == 'RM4SCC' || $btype == 'KIX' || $btype == 'POSTNET' || $btype == 'PLANET') { + $llm = $arrcode['quietL'] / $k; // Left Quiet margin + $rlm = $arrcode['quietR'] / $k; // Right Quiet margin + $tlm = $blm = $arrcode['quietTB'] / $k; + $height=1; // Overrides + } + else if (in_array($btype, array('C128A','C128B','C128C','EAN128A','EAN128B','EAN128C','C39','C39+','C39E','C39E+','S25','S25+','I25','I25+','I25B','I25B+','C93','MSI','MSI+','CODABAR','CODE11'))) { + $llm = $arrcode['lightmL'] * $xres; // Left Quiet margin + $rlm = $arrcode['lightmR'] * $xres; // Right Quiet margin + $tlm = $blm = $arrcode['lightTB'] * $xres * $height; + } + + + $bcw = ($arrcode["maxw"] * $xres); + $fbw = $bcw + $llm + $rlm; // Full barcode width incl. light margins + + $bch = ($arrcode["nom-H"] * $size * $height); + $fbh = $bch + $tlm + $blm; // Full barcode height + + // PRINT border background color + $xpos = $x; + $ypos = $y; + if ($col) { + $this->SetDColor($col); + $this->SetTColor($col); + } + else { + $this->SetDColor($this->ConvertColor(0)); + $this->SetTColor($this->ConvertColor(0)); + } + if ($bgcol) { + $this->SetFColor($bgcol); + } + else { $this->SetFColor($this->ConvertColor(255)); } + + // PRINT BARS + if ($col) { $this->SetFColor($col); } + else { $this->SetFColor($this->ConvertColor(0)); } + $xpos = $x + $llm ; + + if ($arrcode !== false) { + foreach ($arrcode["bcode"] AS $v) { + $bw = ($v["w"] * $xres); + if ($v["t"]) { + $ypos = $y + $tlm + ($bch * $v['p'] / $arrcode['maxh']); + $this->Rect($xpos, $ypos, $bw, ($v['h'] * $bch / $arrcode['maxh']), 'F'); + } + $xpos += $bw; + } + } + + // PRINT BEARER BARS + if ($btype == 'I25B' || $btype == 'I25B+') { + $this->Rect($x, $y, $fbw, ($arrcode['lightTB'] * $xres * $height), 'F'); + $this->Rect($x, $y+$tlm+$bch, $fbw, ($arrcode['lightTB'] * $xres * $height), 'F'); + } + + // Restore ************** + $this->SetFont($prevFontFamily, $prevFontStyle, $prevFontSizePt); + $this->DrawColor = $prevDrawColor; + $this->TextColor = $prevTextColor; + $this->FillColor = $prevFillColor; + $this->SetLineWidth($lw); + $this->SetY($y); +} + +/*-- END BARCODES --*/ + +// ==================================================== +// ==================================================== + +function StartTransform($returnstring=false) { + if ($returnstring) { return('q'); } + else { $this->_out('q'); } +} +function StopTransform($returnstring=false) { + if ($returnstring) { return('Q'); } + else { $this->_out('Q'); } +} +function transformScale($s_x, $s_y, $x='', $y='', $returnstring=false) { + if ($x === '') { + $x=$this->x; + } + if ($y === '') { + $y=$this->y; + } + if (($s_x == 0) OR ($s_y == 0)) { + $this->Error('Please do not use values equal to zero for scaling'); + } + $y = ($this->h - $y) * _MPDFK; + $x *= _MPDFK; + //calculate elements of transformation matrix + $s_x /= 100; + $s_y /= 100; + $tm[0] = $s_x; + $tm[1] = 0; + $tm[2] = 0; + $tm[3] = $s_y; + $tm[4] = $x * (1 - $s_x); + $tm[5] = $y * (1 - $s_y); + //scale the coordinate system + if ($returnstring) { return($this->_transform($tm, true)); } + else { $this->_transform($tm); } +} +function transformTranslate($t_x, $t_y, $returnstring=false) { + //calculate elements of transformation matrix + $tm[0] = 1; + $tm[1] = 0; + $tm[2] = 0; + $tm[3] = 1; + $tm[4] = $t_x * _MPDFK; + $tm[5] = -$t_y * _MPDFK; + //translate the coordinate system + if ($returnstring) { return($this->_transform($tm, true)); } + else { $this->_transform($tm); } +} +function transformRotate($angle, $x='', $y='', $returnstring=false) { + if ($x === '') { + $x=$this->x; + } + if ($y === '') { + $y=$this->y; + } + $angle = -$angle; + $y = ($this->h - $y) * _MPDFK; + $x *= _MPDFK; + //calculate elements of transformation matrix + $tm[0] = cos(deg2rad($angle)); + $tm[1] = sin(deg2rad($angle)); + $tm[2] = -$tm[1]; + $tm[3] = $tm[0]; + $tm[4] = $x + $tm[1] * $y - $tm[0] * $x; + $tm[5] = $y - $tm[0] * $y - $tm[1] * $x; + //rotate the coordinate system around ($x,$y) + if ($returnstring) { return($this->_transform($tm, true)); } + else { $this->_transform($tm); } +} +function _transform($tm, $returnstring=false) { + if ($returnstring) { return(sprintf('%.4F %.4F %.4F %.4F %.4F %.4F cm', $tm[0], $tm[1], $tm[2], $tm[3], $tm[4], $tm[5])); } + else { $this->_out(sprintf('%.4F %.4F %.4F %.4F %.4F %.4F cm', $tm[0], $tm[1], $tm[2], $tm[3], $tm[4], $tm[5])); } +} + + + +/*-- INDIC --*/ +// INDIC ============================ +// This conversion can only be done when font is set +function ConvertIndic(&$str) { + if (preg_match('/^ind_([a-z]{2})_/',$this->currentfontfamily, $m)) { + if (!class_exists('indic', false)) { include(_MPDF_PATH.'classes/indic.php'); } + if (empty($this->indic)) { $this->indic = new indic($this); } + $earr = $this->UTF8StringToArray($str, false); + $str = $this->indic->substituteIndic($earr, $m[1], $this->currentfontfamily); + } +} +/*-- END INDIC --*/ + +// AUTOFONT ========================= +function AutoFont($html) { + if ($this->onlyCoreFonts) { return $html; } + $this->useLang = true; + if ($this->autoFontGroupSize == 1) { $extra = $this->pregASCIIchars1; } + else if ($this->autoFontGroupSize == 3) { $extra = $this->pregASCIIchars3; } + else { $extra = $this->pregASCIIchars2; } + $n = ''; + $a=preg_split('/<(.*?)>/ms',$html,-1,PREG_SPLIT_DELIM_CAPTURE); + foreach($a as $i => $e) { + if($i%2==0) { + $e = strcode2utf($e); + $e = $this->lesser_entity_decode($e); + + // Use U=FFF0 and U+FFF1 to mark start and end of span tags to prevent nesting occurring + // "\xef\xbf\xb0" ##lthtmltag## "\xef\xbf\xb1" ##gthtmltag## + +/*-- CJK-FONTS --*/ + if ($this->autoFontGroups & AUTOFONT_CJK) { + $e = preg_replace("/([".$this->pregCJKchars.$extra."]*[".$this->pregCJKchars."][".$this->pregCJKchars.$extra."]*)/ue", '$this->replaceCJK(stripslashes(\'\\1\'))', $e); + } +/*-- END CJK-FONTS --*/ + +/*-- RTL --*/ + if ($this->autoFontGroups & AUTOFONT_RTL) { + // HEBREW + $e = preg_replace("/([".$this->pregHEBchars .$extra."]*[".$this->pregHEBchars ."][".$this->pregHEBchars .$extra."]*)/u", "\xef\xbf\xb0span lang=\"he\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + // All Arabic + $e = preg_replace("/([".$this->pregARABICchars .$extra."]*[".$this->pregARABICchars ."][".$this->pregARABICchars .$extra."]*)/ue", '$this->replaceArabic(stripslashes(\'\\1\'))', $e); + } +/*-- END RTL --*/ + +/*-- INDIC --*/ + // INDIC + if ($this->autoFontGroups & AUTOFONT_INDIC) { + // Bengali + $e = preg_replace("/([".$this->pregBNchars .$this->pregINDextra."]*[".$this->pregBNchars ."][".$this->pregBNchars .$this->pregINDextra."]*)/u", "\xef\xbf\xb0span lang=\"bn\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + // Devanagari (= script for Hindi, Nepali + Sindhi) + $e = preg_replace("/([".$this->pregHIchars .$this->pregINDextra."]*[".$this->pregHIchars ."][".$this->pregHIchars .$this->pregINDextra."]*)/u", "\xef\xbf\xb0span lang=\"hi\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + // Gujarati + $e = preg_replace("/([".$this->pregGUchars .$this->pregINDextra."]*[".$this->pregGUchars ."][".$this->pregGUchars .$this->pregINDextra."]*)/u", "\xef\xbf\xb0span lang=\"gu\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + // Malayalam + $e = preg_replace("/([".$this->pregMLchars .$this->pregINDextra."]*[".$this->pregMLchars ."][".$this->pregMLchars .$this->pregINDextra."]*)/u", "\xef\xbf\xb0span lang=\"ml\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + // Kannada + $e = preg_replace("/([".$this->pregKNchars .$this->pregINDextra."]*[".$this->pregKNchars ."][".$this->pregKNchars .$this->pregINDextra."]*)/u", "\xef\xbf\xb0span lang=\"kn\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + // Oriya + $e = preg_replace("/([".$this->pregORchars .$this->pregINDextra."]*[".$this->pregORchars ."][".$this->pregORchars .$this->pregINDextra."]*)/u", "\xef\xbf\xb0span lang=\"or\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + // Punjabi ?= Gurmuhki + $e = preg_replace("/([".$this->pregPAchars .$this->pregINDextra."]*[".$this->pregPAchars ."][".$this->pregPAchars .$this->pregINDextra."]*)/u", "\xef\xbf\xb0span lang=\"pa\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + // Tamil + $e = preg_replace("/([".$this->pregTAchars .$this->pregINDextra."]*[".$this->pregTAchars ."][".$this->pregTAchars .$this->pregINDextra."]*)/u", "\xef\xbf\xb0span lang=\"ta\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + // Telugu + $e = preg_replace("/([".$this->pregTEchars .$this->pregINDextra."]*[".$this->pregTEchars ."][".$this->pregTEchars .$this->pregINDextra."]*)/u", "\xef\xbf\xb0span lang=\"te\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + } +/*-- END INDIC --*/ + + + if ($this->autoFontGroups & AUTOFONT_THAIVIET) { + // THAI + $e = preg_replace("/([\x{0E00}-\x{0E7F}".$extra."]*[\x{0E00}-\x{0E7F}][\x{0E00}-\x{0E7F}".$extra."]*)/u", "\xef\xbf\xb0span lang=\"th\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + // Vietnamese + $e = preg_replace("/([".$this->pregVIETchars .$this->pregVIETPluschars ."]*[".$this->pregVIETchars ."][".$this->pregVIETchars .$this->pregVIETPluschars ."]*)/u", "\xef\xbf\xb0span lang=\"vi\"\xef\xbf\xb1\\1\xef\xbf\xb0/span\xef\xbf\xb1", $e); + } + + $e = preg_replace('/[&]/','&amp;',$e); + $e = preg_replace('/[<]/','&lt;',$e); + $e = preg_replace('/[>]/','&gt;',$e); + $e = preg_replace("/(\xef\xbf\xb0span lang=\"([a-z\-A-Z]{2,5})\"\xef\xbf\xb1)\s+/",' \\1',$e); + $e = preg_replace("/[ ]+(\xef\xbf\xb0\/span\xef\xbf\xb1)/",'\\1 ',$e); + + $e = preg_replace("/\xef\xbf\xb0span lang=\"([a-z\-A-Z]{2,5})\"\xef\xbf\xb1/","\xef\xbf\xb0span lang=\"\\1\" class=\"lang_\\1\"\xef\xbf\xb1",$e); + + $e = preg_replace("/\xef\xbf\xb0/",'<',$e); + $e = preg_replace("/\xef\xbf\xb1/",'>',$e); + + $a[$i] = $e; + } + else { + $a[$i] = '<'.$e.'>'; + } + } + $n = implode('',$a); + return $n; +} + + +/*-- CJK-FONTS --*/ +function replaceCJK($str) { + // Use U=FFF0 and U+FFF1 to mark start and end of span tags to prevent nesting occurring + // "\xef\xbf\xb0" ##lthtmltag## "\xef\xbf\xb1" ##gthtmltag## + if (preg_match("/[".$this->pregUHCchars."]/u", $str)) { + return "\xef\xbf\xb0span lang=\"ko\"\xef\xbf\xb1" . $str ."\xef\xbf\xb0/span\xef\xbf\xb1"; + } + else if (preg_match("/[".$this->pregSJISchars."]/u", $str)) { + return "\xef\xbf\xb0span lang=\"ja\"\xef\xbf\xb1" . $str ."\xef\xbf\xb0/span\xef\xbf\xb1"; + } + // if in Unicode Plane 2, probably HKCS (incl in BIG5) if not Japanese + else if (preg_match("/[\x{20000}-\x{2FFFF}]/u", $str)) { + return "\xef\xbf\xb0span lang=\"zh-HK\"\xef\xbf\xb1" . $str ."\xef\xbf\xb0/span\xef\xbf\xb1"; + } + else{ + return "\xef\xbf\xb0span lang=\"zh-CN\"\xef\xbf\xb1" . $str ."\xef\xbf\xb0/span\xef\xbf\xb1"; + } + return $str; +} +/*-- END CJK-FONTS --*/ + +/*-- RTL --*/ +function replaceArabic($str) { + // PASHTO, SINDHI, URDU, ARABIC, PERSIAN + $persian = "\x{067E}\x{0686}\x{0698}\x{06AF}"; + + $urdu = "\x{0679}\x{0688}\x{0691}\x{06BA}\x{06BE}\x{06C1}\x{06D2}"; + $pashto = "\x{067C}\x{0681}\x{0685}\x{0689}\x{0693}\x{0696}\x{069A}\x{06BC}\x{06D0}"; // ? and U+06AB, U+06CD + $sindhi = "\x{067A}\x{067B}\x{067D}\x{067F}\x{0680}\x{0684}\x{068D}\x{068A}\x{068F}\x{068C}\x{0687}\x{0683}\x{0699}\x{06AA}\x{06A6}\x{06BB}\x{06B1}\x{06B3}"; + // Use U=FFF0 and U+FFF1 to mark start and end of span tags to prevent nesting occurring + // "\xef\xbf\xb0" ##lthtmltag## "\xef\xbf\xb1" ##gthtmltag## + + if (preg_match("/[".$this->pregNonARABICchars ."]/u", $str) ) { + if (preg_match("/[".$sindhi ."]/u", $str) ) { + return "\xef\xbf\xb0span lang=\"sd\"\xef\xbf\xb1".$str."\xef\xbf\xb0/span\xef\xbf\xb1"; + } + else if (preg_match("/[".$urdu ."]/u", $str) ) { + return "\xef\xbf\xb0span lang=\"ur\"\xef\xbf\xb1".$str."\xef\xbf\xb0/span\xef\xbf\xb1"; + } + else if (preg_match("/[".$pashto ."]/u", $str) ) { + return "\xef\xbf\xb0span lang=\"ps\"\xef\xbf\xb1".$str."\xef\xbf\xb0/span\xef\xbf\xb1"; + } + else if (preg_match("/[".$persian ."]/u", $str) ) { + return "\xef\xbf\xb0span lang=\"fa\"\xef\xbf\xb1".$str."\xef\xbf\xb0/span\xef\xbf\xb1"; + } + else { + return "\xef\xbf\xb0span lang=\"ar\"\xef\xbf\xb1".$str."\xef\xbf\xb0/span\xef\xbf\xb1"; + } + } + if (preg_match("/[".$persian ."]/u", $str) ) { + return "\xef\xbf\xb0span lang=\"fa\"\xef\xbf\xb1".$str."\xef\xbf\xb0/span\xef\xbf\xb1"; + } + else { + return "\xef\xbf\xb0span lang=\"ar\"\xef\xbf\xb1".$str."\xef\xbf\xb0/span\xef\xbf\xb1"; + } + return $str; +} + +// ARABIC =========================== +// mPDF 5.4.08 +function InitArabic() { + + // JOIN TO FOLLOWING LETTER IN LOGICAL ORDER (i.e. AS INITIAL) + $this->arabPrevLink = ""; + // U+060c; U+061b; U+061f; U+0626; U+0628; + $this->arabPrevLink .= "\xd8\x8c\xd8\x9b\xd8\x9f\xd8\xa6\xd8\xa8"; + // U+062a; U+062b; U+062c; U+062d; U+062e; + $this->arabPrevLink .= "\xd8\xaa\xd8\xab\xd8\xac\xd8\xad\xd8\xae"; + // U+0633; U+0634; U+0635; U+0636; U+0637; U+0638; U+0639; U+063a; + $this->arabPrevLink .= "\xd8\xb3\xd8\xb4\xd8\xb5\xd8\xb6\xd8\xb7\xd8\xb8\xd8\xb9\xd8\xba"; + // U+0640; U+0641; U+0642; U+0643; U+0644; U+0645; U+0646; U+0647; U+0649; U+064a; + $this->arabPrevLink .= "\xd9\x80\xd9\x81\xd9\x82\xd9\x83\xd9\x84\xd9\x85\xd9\x86\xd9\x87\xd9\x89\xd9\x8a"; + // U+0678; U+0679; U+067a; U+067b; U+067c; U+067d; U+067e; U+067f; + $this->arabPrevLink .= "\xd9\xb8\xd9\xb9\xd9\xba\xd9\xbb\xd9\xbc\xd9\xbd\xd9\xbe\xd9\xbf"; + // U+0680; U+0681; U+0682; U+0683; U+0684; U+0685; U+0686; U+0687; + $this->arabPrevLink .= "\xda\x80\xda\x81\xda\x82\xda\x83\xda\x84\xda\x85\xda\x86\xda\x87"; + // U+069a; U+069b; U+069c; U+069d; U+069e; U+069f; + $this->arabPrevLink .= "\xda\x9a\xda\x9b\xda\x9c\xda\x9d\xda\x9e\xda\x9f"; + // U+06a0; U+06a1; U+06a2; U+06a3; U+06a4; U+06a5; U+06a6; U+06A7; U+06A8; + $this->arabPrevLink .= "\xda\xa0\xda\xa1\xda\xa2\xda\xa3\xda\xa4\xda\xa5\xda\xa6\xda\xa7\xda\xa8"; + // U+06a9; U+06aa; U+06ab; U+06ac; U+06ad; U+06ae; U+06af; + $this->arabPrevLink .= "\xda\xa9\xda\xaa\xda\xab\xda\xac\xda\xad\xda\xae\xda\xaf"; + // U+06b0; U+06b1; U+06b2; U+06b3; U+06b4; U+06b5; U+06b6; U+06b7; U+06b8; U+06b9; + $this->arabPrevLink .= "\xda\xb0\xda\xb1\xda\xb2\xda\xb3\xda\xb4\xda\xb5\xda\xb6\xda\xb7\xda\xb8\xda\xb9"; + // U+06ba; U+06bb; U+06bc; U+06be; U+06bf; + $this->arabPrevLink .= "\xda\xba\xda\xbb\xda\xbc\xda\xbe\xda\xbf"; + // U+06c1; U+06cc; U+06ce; U+06d0; U+06d1; + $this->arabPrevLink .= "\xdb\x81\xdb\x8c\xdb\x8e\xdb\x90\xdb\x91"; + + + + + // JOIN TO PREVIOUS LETTER IN LOGICAL ORDER (i.e. AS FINAL FORM) + $this->arabNextLink = ""; + // U+0622; U+0623; U+0624; U+0625; U+0626; U+0627; U+0628; U+0629; + $this->arabNextLink .= "\xd8\xa2\xd8\xa3\xd8\xa4\xd8\xa5\xd8\xa6\xd8\xa7\xd8\xa8\xd8\xa9"; + // U+062A; U+062B; U+062C; U+062D; U+062E; U+062F; + $this->arabNextLink .= "\xd8\xaa\xd8\xab\xd8\xac\xd8\xad\xd8\xae\xd8\xaf"; + // U+0630; U+0631; U+0632; U+0633; U+0634; U+0635; U+0636; U+0637; U+0638; U+0639; U+063A; + $this->arabNextLink .= "\xd8\xb0\xd8\xb1\xd8\xb2\xd8\xb3\xd8\xb4\xd8\xb5\xd8\xb6\xd8\xb7\xd8\xb8\xd8\xb9\xd8\xba"; + // U+0640; U+0641; U+0642; U+0643; U+0644; U+0645; U+0646; U+0647; U+0648; U+0649; U+064A; + $this->arabNextLink .= "\xd9\x80\xd9\x81\xd9\x82\xd9\x83\xd9\x84\xd9\x85\xd9\x86\xd9\x87\xd9\x88\xd9\x89\xd9\x8a"; + // U+0671; U+0672; U+0675; U+0676; U+0677; U+0678; U+0679; + $this->arabNextLink .= "\xd9\xb1\xd9\xb2\xd9\xb5\xd9\xb6\xd9\xb7\xd9\xb8\xd9\xb9"; + // U+067A; U+067B; U+067C; U+067D; U+067E; U+067F; + $this->arabNextLink .= "\xd9\xba\xd9\xbb\xd9\xbc\xd9\xbd\xd9\xbe\xd9\xbf"; + // U+0680; U+0681; U+0682; U+0683; U+0684; U+0685; U+0686; U+0687; U+0688; U+0689; + $this->arabNextLink .= "\xda\x80\xda\x81\xda\x82\xda\x83\xda\x84\xda\x85\xda\x86\xda\x87\xda\x88\xda\x89"; + // U+068A; U+068B; U+068C; U+068D; U+068F;U+068F; + $this->arabNextLink .= "\xda\x8a\xda\x8b\xda\x8c\xda\x8d\xda\x8e\xda\x8f"; + // U+0690; U+0691; U+0692; U+0693; U+0694; U+0695; U+0696; U+0697; U+0698; U+0699; + $this->arabNextLink .= "\xda\x90\xda\x91\xda\x92\xda\x93\xda\x94\xda\x95\xda\x96\xda\x97\xda\x98\xda\x99"; + // U+069A; U+069B; U+069C; U+069D; U+069E; U+069F; + $this->arabNextLink .= "\xda\x9a\xda\x9b\xda\x9c\xda\x9d\xda\x9e\xda\x9f"; + // U+06A0; U+06A1; U+06A2; U+06A3; U+06A4; U+06A5; U+06A6; U+06A7; U+06A8; U+06A9; + $this->arabNextLink .= "\xda\xa0\xda\xa1\xda\xa2\xda\xa3\xda\xa4\xda\xa5\xda\xa6\xda\xa7\xda\xa8\xda\xa9"; + // U+06AA; U+06AB; U+06AC; U+06AD; U+06AE; U+06AF; + $this->arabNextLink .= "\xda\xaa\xda\xab\xda\xac\xda\xad\xda\xae\xda\xaf"; + // U+06B0; U+06B1; U+06B2; U+06B3; U+06B4; U+06B5; U+06B6; U+06B7; U+06B8; U+06B9; + $this->arabNextLink .= "\xda\xb0\xda\xb1\xda\xb2\xda\xb3\xda\xb4\xda\xb5\xda\xb6\xda\xb7\xda\xb8\xda\xb9"; + // U+06BA; U+06BB; U+06BC; U+06BE; U+06BF; + $this->arabNextLink .= "\xda\xba\xda\xbb\xda\xbc\xda\xbe\xda\xbf"; + // U+06C0; U+06C1; U+06C2; U+06C3; U+06C4; U+06C5; U+06C6; U+06C7; U+06C8; U+06C9; + $this->arabNextLink .= "\xdb\x80\xdb\x81\xdb\x82\xdb\x83\xdb\x84\xdb\x85\xdb\x86\xdb\x87\xdb\x88\xdb\x89"; + // U+06CA; U+06CB; U+06CC; U+06CD; U+06CE; U+06CF; + $this->arabNextLink .= "\xdb\x8a\xdb\x8b\xdb\x8c\xdb\x8d\xdb\x8e\xdb\x8f"; + // U+06D0; U+06d1; U+06D2; U+06D3; + $this->arabNextLink .= "\xdb\x90\xdb\x91\xdb\x92\xdb\x93"; + + + // VOWELS ++ + + // U+064b U+064c; U+064d; U+064e; U+064f; U+0650; U+0651; U+0652; + $this->arabVowels = "\xd9\x8b\xd9\x8c\xd9\x8d\xd9\x8e\xd9\x8f\xd9\x90\xd9\x91\xd9\x92"; + + // Added chars that may not be vowels but should not interrupt joining + // U+0670; U+0653; + $this->arabVowels .= "\xd9\xb0\xd9\x93"; + // ? should also add - U+615, 616, 617-61A, 653-65E, 6D6-6DC, 6DF-6E4, 6E7, 6E8, 6EA-6ED + + + + // ISOLATED FORM :: FINAL :: INITIAL :: MEDIAL + // FB** - FE** = Arabic presentation Forms + // F5** F6** F7** = Private use area used by unAGlyphs in mPDF + $this->arabGlyphs = array( + "\xd8\x8c"=>array("\xd8\x8c", "\xd8\x8c", "\xd8\x8c", "\xd8\x8c"), /* 060C, 060C, 060C, 060C */ + "\xd8\x9b"=>array("\xd8\x9b", "\xd8\x9b", "\xd8\x9b", "\xd8\x9b"), /* 061B, 061B, 061B, 061B */ + "\xd8\x9f"=>array("\xd8\x9f", "\xd8\x9f", "\xd8\x9f", "\xd8\x9f"), /* 061F, 061F, 061F, 061F */ + "\xd8\xa1"=>array("\xd8\xa1", "\xd8\xa1", "\xd8\xa1", "\xd8\xa1"), /* 0621, 0621, 0621, 0621 */ + "\xd8\xa2"=>array("\xd8\xa2", "\xef\xba\x82", "\xd8\xa2", "\xef\xba\x82"), /* 0622, FE82, 0622, FE82 */ + "\xd8\xa3"=>array("\xd8\xa3", "\xef\xba\x84", "\xd8\xa3", "\xef\xba\x84"), /* 0623, FE84, 0623, FE84 */ + "\xd8\xa4"=>array("\xd8\xa4", "\xef\xba\x86", "\xd8\xa4", "\xef\xba\x86"), /* 0624, FE86, 0624, FE86 */ + "\xd8\xa5"=>array("\xd8\xa5", "\xef\xba\x88", "\xd8\xa5", "\xef\xba\x88"), /* 0625, FE88, 0625, FE88 */ + "\xd8\xa6"=>array("\xd8\xa6", "\xef\xba\x8a", "\xef\xba\x8b", "\xef\xba\x8c"), /* 0626, FE8A, FE8B, FE8C */ + "\xd8\xa7"=>array("\xd8\xa7", "\xef\xba\x8e", "\xd8\xa7", "\xef\xba\x8e"), /* 0627, FE8E, 0627, FE8E */ + "\xd8\xa8"=>array("\xd8\xa8", "\xef\xba\x90", "\xef\xba\x91", "\xef\xba\x92"), /* 0628, FE90, FE91, FE92 */ + "\xd8\xa9"=>array("\xd8\xa9", "\xef\xba\x94", "\xd8\xa9", "\xef\xba\x94"), /* 0629, FE94, 0629, FE94 */ + "\xd8\xaa"=>array("\xd8\xaa", "\xef\xba\x96", "\xef\xba\x97", "\xef\xba\x98"), /* 062A, FE96, FE97, FE98 */ + "\xd8\xab"=>array("\xd8\xab", "\xef\xba\x9a", "\xef\xba\x9b", "\xef\xba\x9c"), /* 062B, FE9A, FE9B, FE9C */ + "\xd8\xac"=>array("\xd8\xac", "\xef\xba\x9e", "\xef\xba\x9f", "\xef\xba\xa0"), /* 062C, FE9E, FE9F, FEA0 */ + "\xd8\xad"=>array("\xd8\xad", "\xef\xba\xa2", "\xef\xba\xa3", "\xef\xba\xa4"), /* 062D, FEA2, FEA3, FEA4 */ + "\xd8\xae"=>array("\xd8\xae", "\xef\xba\xa6", "\xef\xba\xa7", "\xef\xba\xa8"), /* 062E, FEA6, FEA7, FEA8 */ + "\xd8\xaf"=>array("\xd8\xaf", "\xef\xba\xaa", "\xd8\xaf", "\xef\xba\xaa"), /* 062F, FEAA, 062F, FEAA */ + "\xd8\xb0"=>array("\xd8\xb0", "\xef\xba\xac", "\xd8\xb0", "\xef\xba\xac"), /* 0630, FEAC, 0630, FEAC */ + "\xd8\xb1"=>array("\xd8\xb1", "\xef\xba\xae", "\xd8\xb1", "\xef\xba\xae"), /* 0631, FEAE, 0631, FEAE */ + "\xd8\xb2"=>array("\xd8\xb2", "\xef\xba\xb0", "\xd8\xb2", "\xef\xba\xb0"), /* 0632, FEB0, 0632, FEB0 */ + "\xd8\xb3"=>array("\xd8\xb3", "\xef\xba\xb2", "\xef\xba\xb3", "\xef\xba\xb4"), /* 0633, FEB2, FEB3, FEB4 */ + "\xd8\xb4"=>array("\xd8\xb4", "\xef\xba\xb6", "\xef\xba\xb7", "\xef\xba\xb8"), /* 0634, FEB6, FEB7, FEB8 */ + "\xd8\xb5"=>array("\xd8\xb5", "\xef\xba\xba", "\xef\xba\xbb", "\xef\xba\xbc"), /* 0635, FEBA, FEBB, FEBC */ + "\xd8\xb6"=>array("\xd8\xb6", "\xef\xba\xbe", "\xef\xba\xbf", "\xef\xbb\x80"), /* 0636, FEBE, FEBF, FEC0 */ + "\xd8\xb7"=>array("\xd8\xb7", "\xef\xbb\x82", "\xef\xbb\x83", "\xef\xbb\x84"), /* 0637, FEC2, FEC3, FEC4 */ + "\xd8\xb8"=>array("\xd8\xb8", "\xef\xbb\x86", "\xef\xbb\x87", "\xef\xbb\x88"), /* 0638, FEC6, FEC7, FEC8 */ + "\xd8\xb9"=>array("\xd8\xb9", "\xef\xbb\x8a", "\xef\xbb\x8b", "\xef\xbb\x8c"), /* 0639, FECA, FECB, FECC */ + "\xd8\xba"=>array("\xd8\xba", "\xef\xbb\x8e", "\xef\xbb\x8f", "\xef\xbb\x90"), /* 063A, FECE, FECF, FED0 */ + "\xd9\x80"=>array("\xd9\x80", "\xd9\x80", "\xd9\x80", "\xd9\x80"), /* 0640, 0640, 0640, 0640 */ + "\xd9\x81"=>array("\xd9\x81", "\xef\xbb\x92", "\xef\xbb\x93", "\xef\xbb\x94"), /* 0641, FED2, FED3, FED4 */ + "\xd9\x82"=>array("\xd9\x82", "\xef\xbb\x96", "\xef\xbb\x97", "\xef\xbb\x98"), /* 0642, FED6, FED7, FED8 */ + "\xd9\x83"=>array("\xd9\x83", "\xef\xbb\x9a", "\xef\xbb\x9b", "\xef\xbb\x9c"), /* 0643, FEDA, FEDB, FEDC */ + "\xd9\x84"=>array("\xd9\x84", "\xef\xbb\x9e", "\xef\xbb\x9f", "\xef\xbb\xa0"), /* 0644, FEDE, FEDF, FEE0 */ + "\xd9\x85"=>array("\xd9\x85", "\xef\xbb\xa2", "\xef\xbb\xa3", "\xef\xbb\xa4"), /* 0645, FEE2, FEE3, FEE4 */ + "\xd9\x86"=>array("\xd9\x86", "\xef\xbb\xa6", "\xef\xbb\xa7", "\xef\xbb\xa8"), /* 0646, FEE6, FEE7, FEE8 */ + "\xd9\x87"=>array("\xd9\x87", "\xef\xbb\xaa", "\xef\xbb\xab", "\xef\xbb\xac"), /* 0647, FEEA, FEEB, FEEC */ + "\xd9\x88"=>array("\xd9\x88", "\xef\xbb\xae", "\xd9\x88", "\xef\xbb\xae"), /* 0648, FEEE, 0648, FEEE */ + +/* 0649 Alef Maksura should only appear at end of word (in Arabic) So Initial and medial are shown as isolated/final */ + "\xd9\x89"=>array("\xd9\x89", "\xef\xbb\xb0", "\xd9\x89", "\xef\xbb\xb0"), /* 0649, FEF0, 0649, FEF0 */ + +/* 0649 Alef Maksura Initial and Medial forms as given in Unicode FBE8 and FBE9 for Uighur Kazakh (not in some fonts) */ + "\xd9\x89"=>array("\xd9\x89", "\xef\xbb\xb0", "\xef\xaf\xa8", "\xef\xaf\xa9"), /* 0649, FEF0, FBE8, FBE9 not in most fonts */ + + "\xd9\x8a"=>array("\xd9\x8a", "\xef\xbb\xb2", "\xef\xbb\xb3", "\xef\xbb\xb4"), /* 064A, FEF2, FEF3, FEF4 */ + "\xd9\x8b"=>array("\xd9\x8b", "\xd9\x8b", "\xd9\x8b", "\xd9\x8b"), /* 064B, 064B, 064B, 064B */ + "\xd9\x8c"=>array("\xd9\x8c", "\xd9\x8c", "\xd9\x8c", "\xd9\x8c"), /* 064C, 064C, 064C, 064C */ + "\xd9\x8d"=>array("\xd9\x8d", "\xd9\x8d", "\xd9\x8d", "\xd9\x8d"), /* 064D, 064D, 064D, 064D */ + "\xd9\x8e"=>array("\xd9\x8e", "\xd9\x8e", "\xd9\x8e", "\xd9\x8e"), /* 064E, 064E, 064E, 064E */ + "\xd9\x8f"=>array("\xd9\x8f", "\xd9\x8f", "\xd9\x8f", "\xd9\x8f"), /* 064F, 064F, 064F, 064F */ + "\xd9\x90"=>array("\xd9\x90", "\xd9\x90", "\xd9\x90", "\xd9\x90"), /* 0650, 0650, 0650, 0650 */ + "\xd9\x91"=>array("\xd9\x91", "\xd9\x91", "\xd9\x91", "\xd9\x91"), /* 0651, 0651, 0651, 0651 */ + "\xd9\x92"=>array("\xd9\x92", "\xd9\x92", "\xd9\x92", "\xd9\x92"), /* 0652, 0652, 0652, 0652 */ + "\xd9\xb1"=>array("\xd9\xb1", "\xef\xad\x91", "\xd9\xb1", "\xef\xad\x91"), /* 0671, FB51, 0671, FB51 */ + "\xd9\xb2"=>array("\xd9\xb2", "\xef\x95\xb2", "\xd9\xb2", "\xef\x95\xb2"), /* 0672, F572, 0672, F572 */ + "\xd9\xb5"=>array("\xd9\xb5", "\xef\x95\xb5", "\xd9\xb5", "\xef\x95\xb5"), /* 0675, F575, 0675, F575 */ + "\xd9\xb8"=>array("\xd9\xb8", "\xef\x95\xb8", "\xef\xba\x8b", "\xef\xba\x8c"), /* 0678, F578, FE8B, FE8C ( as 0626 ) */ + "\xd9\xb9"=>array("\xd9\xb9", "\xef\xad\xa7", "\xef\xad\xa8", "\xef\xad\xa9"), /* 0679, FB67, FB68, FB69 */ + "\xd9\xba"=>array("\xd9\xba", "\xef\xad\x9f", "\xef\xad\xa0", "\xef\xad\xa1"), /* 067A, FB5F, FB60, FB61 */ + "\xd9\xbb"=>array("\xd9\xbb", "\xef\xad\x93", "\xef\xad\x94", "\xef\xad\x95"), /* 067B, FB53, FB54, FB55 */ + "\xd9\xbc"=>array("\xd9\xbc", "\xef\x95\xbc", "\xef\x99\xbc", "\xef\x9d\xbc"), /* 067C, F57C, F67C, F77C */ + "\xd9\xbd"=>array("\xd9\xbd", "\xef\x95\xbd", "\xef\x99\xbd", "\xef\x9d\xbd"), /* 067D, F57D, F67D, F77D */ + "\xd9\xbe"=>array("\xd9\xbe", "\xef\xad\x97", "\xef\xad\x98", "\xef\xad\x99"), /* 067E, FB57, FB58, FB59 */ + "\xd9\xbf"=>array("\xd9\xbf", "\xef\xad\xa3", "\xef\xad\xa4", "\xef\xad\xa5"), /* 067F, FB63, FB64, FB65 */ + "\xda\x80"=>array("\xda\x80", "\xef\xad\x9b", "\xef\xad\x9c", "\xef\xad\x9d"), /* 0680, FB5B, FB5C, FB5D */ + "\xda\x81"=>array("\xda\x81", "\xef\x96\x81", "\xef\x9a\x81", "\xef\x9e\x81"), /* 0681, F581, F681, F781 */ + "\xda\x82"=>array("\xda\x82", "\xef\x96\x82", "\xef\x9a\x82", "\xef\x9e\x82"), /* 0682, F582, F682, F782 */ + "\xda\x83"=>array("\xda\x83", "\xef\xad\xb7", "\xef\xad\xb8", "\xef\xad\xb9"), /* 0683, FB77, FB78, FB79 */ + "\xda\x84"=>array("\xda\x84", "\xef\xad\xb3", "\xef\xad\xb4", "\xef\xad\xb5"), /* 0684, FB73, FB74, FB75 */ + "\xda\x85"=>array("\xda\x85", "\xef\x96\x85", "\xef\x9a\x85", "\xef\x9e\x85"), /* 0685, F585, F685, F785 */ + "\xda\x86"=>array("\xda\x86", "\xef\xad\xbb", "\xef\xad\xbc", "\xef\xad\xbd"), /* 0686, FB7B, FB7C, FB7D */ + "\xda\x87"=>array("\xda\x87", "\xef\xad\xbf", "\xef\xae\x80", "\xef\xae\x81"), /* 0687, FB7F, FB80, FB81 */ + "\xda\x88"=>array("\xda\x88", "\xef\xae\x89", "\xda\x88", "\xda\x88"), /* 0688, FB89, 0688, 0688 */ + "\xda\x89"=>array("\xda\x89", "\xef\x96\x89", "\xda\x89", "\xda\x89"), /* 0689, F589, 0689, 0689 */ + "\xda\x91"=>array("\xda\x91", "\xef\xae\x8d", "\xda\x91", "\xef\xae\x8d"), /* 0691, FB8D, 0691, FB8D */ + "\xda\x93"=>array("\xda\x93", "\xef\x96\x93", "\xda\x93", "\xda\x93"), /* 0693, F593, 0693, 0693 */ + "\xda\x96"=>array("\xda\x96", "\xef\x96\x96", "\xda\x96", "\xda\x96"), /* 0696, F596, 0696, 0696 */ + "\xda\x98"=>array("\xda\x98", "\xef\xae\x8b", "\xda\x98", "\xef\xae\x8b"), /* 0698, FB8B, 0698, FB8B */ + "\xda\x9a"=>array("\xda\x9a", "\xef\x96\x9a", "\xef\x9a\x9a", "\xef\x9e\x9a"), /* 069A, F59A, F69A, F79A */ + "\xda\x9b"=>array("\xda\x9b", "\xef\x96\x9b", "\xef\x9a\x9b", "\xef\x9e\x9b"), /* 069B, F59B, F69B, F79B */ + "\xda\x9c"=>array("\xda\x9c", "\xef\x96\x9c", "\xef\x9a\x9c", "\xef\x9e\x9c"), /* 069C, F59C, F69C, F79C */ + "\xda\x9d"=>array("\xda\x9d", "\xef\x96\x9d", "\xef\x9a\x9d", "\xef\x9e\x9d"), /* 069D, F59D, F69D, F79D */ + "\xda\x9e"=>array("\xda\x9e", "\xef\x96\x9e", "\xef\x9a\x9e", "\xef\x9e\x9e"), /* 069E, F59E, F69E, F79E */ + "\xda\xa0"=>array("\xda\xa0", "\xef\x96\xa0", "\xef\x9a\xa0", "\xef\x9e\xa0"), /* 06A0, F5A0, F6A0, F7A0 */ + "\xda\xa1"=>array("\xda\xa1", "\xef\x96\xa1", "\xef\x9a\xa1", "\xef\x9e\xa1"), /* 06A1, F5A1, F6A1, F7A1 */ + "\xda\xa2"=>array("\xda\xa2", "\xef\x96\xa2", "\xef\x9a\xa2", "\xef\x9e\xa2"), /* 06A2, F5A2, F6A2, F7A2 */ + "\xda\xa3"=>array("\xda\xa3", "\xef\x96\xa3", "\xef\x9a\xa3", "\xef\x9e\xa3"), /* 06A3, F5A3, F6A3, F7A3 */ + "\xda\xa4"=>array("\xda\xa4", "\xef\xad\xab", "\xef\xad\xac", "\xef\xad\xad"), /* 06A4, FB6B, FB6C, FB6D */ + "\xda\xa5"=>array("\xda\xa5", "\xef\x96\xa5", "\xef\x9a\xa5", "\xef\x9e\xa5"), /* 06A5, F5A5, F6A5, F7A5 */ + "\xda\xa6"=>array("\xda\xa6", "\xef\xad\xaf", "\xef\xad\xb0", "\xef\xad\xb1"), /* 06A6, FB6F, FB70, FB71 */ + "\xda\xa9"=>array("\xda\xa9", "\xef\xae\x8f", "\xef\xae\x90", "\xef\xae\x91"), /* 06A9, FB8F, FB90, FB91 */ + "\xda\xaa"=>array("\xda\xaa", "\xef\x96\xaa", "\xef\x9a\xaa", "\xef\x9e\xaa"), /* 06AA, F5AA, F6AA, F7AA */ + "\xda\xab"=>array("\xda\xab", "\xef\x96\xab", "\xef\x9a\xab", "\xef\x9e\xab"), /* 06AB, F5AB, F6AB, F7AB */ + "\xda\xac"=>array("\xda\xac", "\xef\x96\xac", "\xef\x9a\xac", "\xef\x9e\xac"), /* 06AC, F5AC, F6AC, F7AC */ + "\xda\xad"=>array("\xda\xad", "\xef\xaf\x94", "\xef\xaf\x95", "\xef\xaf\x96"), /* 06AD, FBD4, FBD5, FBD6 */ + "\xda\xae"=>array("\xda\xae", "\xef\x96\xae", "\xef\x9a\xae", "\xef\x9e\xae"), /* 06AE, F5AE, F6AE, F7AE */ + "\xda\xaf"=>array("\xda\xaf", "\xef\xae\x93", "\xef\xae\x94", "\xef\xae\x95"), /* 06Af, FB93, FB94, FB95 */ + "\xda\xb0"=>array("\xda\xb0", "\xef\x96\xb0", "\xef\x9a\xb0", "\xef\x9e\xb0"), /* 06B0, F5B0, F6B0, F7B0 */ + "\xda\xb1"=>array("\xda\xb1", "\xef\xae\x9b", "\xef\xae\x9c", "\xef\xae\x9d"), /* 06B1, FB9B, FB9C, FB9D */ + "\xda\xb2"=>array("\xda\xb2", "\xef\x96\xb2", "\xef\x9a\xb2", "\xef\x9e\xb2"), /* 06B2, F5B2, F6B2, F7B2 */ + "\xda\xb3"=>array("\xda\xb3", "\xef\xae\x97", "\xef\xae\x98", "\xef\xae\x99"), /* 06B3, FB97, FB98, FB99 */ + "\xda\xb4"=>array("\xda\xb4", "\xef\x96\xb4", "\xef\x9a\xb4", "\xef\x9e\xb4"), /* 06B4, F5B4, F6B4, F7B4 */ + "\xda\xb5"=>array("\xda\xb5", "\xef\x96\xb5", "\xef\x9a\xb5", "\xef\x9e\xb5"), /* 06B5, F5B5, F6B5, F7B5 */ + "\xda\xb6"=>array("\xda\xb6", "\xef\x96\xb6", "\xef\x9a\xb6", "\xef\x9e\xb6"), /* 06B6, F5B6, F6B6, F7B6 */ + "\xda\xb7"=>array("\xda\xb7", "\xef\x96\xb7", "\xef\x9a\xb7", "\xef\x9e\xb7"), /* 06B7, F5B7, F6B7, F7B7 */ + "\xda\xb8"=>array("\xda\xb8", "\xef\x96\xb8", "\xef\x9a\xb8", "\xef\x9e\xb8"), /* 06B8, F5B8, F6B8, F7B8 */ + "\xda\xb9"=>array("\xda\xb9", "\xef\x96\xb9", "\xef\x9a\xb9", "\xef\x9e\xb9"), /* 06B9, F5B9, F6B9, F7B9 */ + "\xda\xba"=>array("\xda\xba", "\xef\xae\x9f", "\xda\xba", "\xda\xba"), /* 06BA, FB9F, 06BA, 06BA */ + "\xda\xbb"=>array("\xda\xbb", "\xef\xae\xa1", "\xef\xae\xa2", "\xef\xae\xa3"), /* 06BB, FBA1, FBA2, FBA3 */ + "\xda\xbc"=>array("\xda\xbc", "\xef\x96\xbc", "\xef\x9a\xbc", "\xef\x9e\xbc"), /* 06BC, F5BC, F6BC, F7BC */ + "\xda\xbe"=>array("\xda\xbe", "\xef\xae\xab", "\xef\xae\xac", "\xef\xae\xad"), /* 06BE, FBAB, FBAC, FBAD */ + "\xda\xbf"=>array("\xda\xbf", "\xef\x96\xbf", "\xef\x9a\xbf", "\xef\x9e\xbf"), /* 06BF, F5BF, F6BF, F7BF */ + "\xdb\x80"=>array("\xdb\x80", "\xef\xae\xa5", "\xdb\x80", "\xef\xae\xa5"), /* 06C0, FBA5, 06C0, FBA5 */ + "\xdb\x81"=>array("\xdb\x81", "\xef\xae\xa7", "\xef\xae\xa8", "\xef\xae\xa9"), /* 06C1, FBA7, FBA8, FBA9 */ + "\xdb\x8c"=>array("\xdb\x8c", "\xef\xaf\xbd", "\xef\xaf\xbe", "\xef\xaf\xbf"), /* 06CC, FBFD, FBFE, FBFF */ + "\xdb\x8d"=>array("\xdb\x8d", "\xef\x97\x8d", "\xdb\x8d", "\xef\x97\x8d"), /* 06CD, F5CD, 06CD, F5CD */ + "\xdb\x8e"=>array("\xdb\x8e", "\xef\x97\x8e", "\xef\x9b\x8e", "\xef\x9f\x8e"), /* 06CE, F5CE, F6CE, F7CE */ + "\xdb\x90"=>array("\xdb\x90", "\xef\xaf\xa5", "\xef\xaf\xa6", "\xef\xaf\xa7"), /* 06D0, FBE5, FBE6, FBE7 */ + "\xdb\x91"=>array("\xdb\x91", "\xef\x97\x91", "\xef\xad\x98", "\xef\xad\x99"), /* 06D1, F5D1, FB58, FB59 Fudge borrows from 067E */ + "\xdb\x92"=>array("\xdb\x92", "\xef\xae\xaf", "\xdb\x92", "\xef\xae\xaf"), /* 06D2, FBAF, 06D2, FBAF */ + "\xdb\x93"=>array("\xdb\x93", "\xef\xae\xb1", "\xdb\x93", "\xef\xae\xb1"), /* 06D3, FBB1, 06D3, FBB1 */ + ); + + + // LAM with ALEF ligatures (Mandatory ligatures) + + // U+0644; U+0622; U+0644; U+0623; U+0644; U+0625; U+0644; U+0627; + $this->arabLigGlyphs = "\xd9\x84\xd8\xa2\xd9\x84\xd8\xa3\xd9\x84\xd8\xa5\xd9\x84\xd8\xa7"; + $this->arabLigHex = 'FEF5FEF6FEF5FEF6FEF7FEF8FEF7FEF8FEF9FEFAFEF9FEFAFEFBFEFCFEFBFEFC'; + +} + +// mPDF 5.4.08 +function ArabJoin($str) { + if (!$this->arabGlyphs) { $this->InitArabic(); } + $crntChar = null; + $prevChar = null; + $nextChar = null; + $output = array(); + $chars = preg_split('//u', $str); + $max = count($chars); + for ($i = $max - 1; $i >= 0; $i--) { + $crntChar = $chars[$i]; + if ($i > 0){ $prevChar = $chars[$i - 1]; } + else{ $prevChar = NULL; } + if ($prevChar && mb_strpos($this->arabVowels, $prevChar, 0, 'utf-8') !== false) { + $prevChar = $chars[$i - 2]; + if ($prevChar && mb_strpos($this->arabVowels, $prevChar, 0, 'utf-8') !== false) { + $prevChar = $chars[$i - 3]; + } + } + if ($crntChar && mb_strpos($this->arabVowels, $crntChar, 0, 'utf-8') !== false) { + // If next_char = nextLink && prev_char = prevLink: + // Added && $prevchar (defined) else error on mb_strpos() + if ($chars[$i + 1] && (mb_strpos($this->arabNextLink, $chars[$i + 1], 0, 'utf-8') !== false) && $prevChar && (mb_strpos($this->arabPrevLink, $prevChar, 0, 'utf-8') !== false)) { + $output[] = $this->get_arab_glyphs($crntChar, 1); // <final> form + } + else { + $output[] = $this->get_arab_glyphs($crntChar, 0); // <isolated> form + } + continue; + } + // NB = &#x622 &#x623; &#x625; &#x627; &#x644; + if (isset($chars[$i + 1]) && in_array($chars[$i + 1], array("\xd8\xa2","\xd8\xa3","\xd8\xa5","\xd8\xa7")) && $crntChar == "\xd9\x84"){ + continue; + } + if (ord($crntChar) < 128) { + $output[] = $crntChar; + $nextChar = $crntChar; + continue; + } + $form = 0; + if ($prevChar == "\xd9\x84" && ($crntChar == "\xd8\xa2" || $crntChar == "\xd8\xa3" || $crntChar == "\xd8\xa5" || $crntChar == "\xd8\xa7")) { + if ($chars[$i - 2] && mb_strpos($this->arabPrevLink, $chars[$i - 2], 0, 'utf-8') !== false) { + $form++; // <final> form + } + $pos = mb_strpos($this->arabLigGlyphs, ($prevChar . $crntChar), 0, 'utf-8'); + $pos = $pos*8 + $form*4; + $pres = (mb_substr($this->arabLigHex, $pos, 4, 'utf-8')); + // If presentation forms for mandatory ligatures with diacritics not present (even if remapped from e.g. uni0644uni0625) + // try replacing with mandatory ligature Alef/lam isolated/final FEFB/FEFC + diacritic glyph + if (!$this->_charDefined($this->CurrentFont['cw'], hexdec($pres)) && $this->_charDefined($this->CurrentFont['cw'], hexdec('FEFB'))) { + if ($pres=='FEF5') { $output[] = strcode2utf('&#xFEFB;&#x0653;'); } + else if ($pres=='FEF6') { $output[] = strcode2utf('&#xFEFC;&#x0653;'); } + else if ($pres=='FEF7') { $output[] = strcode2utf('&#xFEFB;&#x0654;'); } + else if ($pres=='FEF8') { $output[] = strcode2utf('&#xFEFC;&#x0654;'); } + else if ($pres=='FEF9') { $output[] = strcode2utf('&#xFEFB;&#x0655;'); } + else if ($pres=='FEFA') { $output[] = strcode2utf('&#xFEFC;&#x0655;'); } + } + else { + $output[] = strcode2utf('&#x' . $pres . ';'); + } + $nextChar = $prevChar; + continue; + } + if ($prevChar && mb_strpos($this->arabPrevLink, $prevChar, 0, 'utf-8') !== false) { + $form++; + } + if ($nextChar && mb_strpos($this->arabNextLink, $nextChar, 0, 'utf-8') !== false) { + $form += 2; + } + $output[] = $this->get_arab_glyphs($crntChar, $form) ; + $nextChar = $crntChar; + } + $ra = array_reverse($output); + $s = implode($ra); + return $s; +} + +// mPDF 5.4.08 +function get_arab_glyphs($char, $type) { + if ($type>0 && isset($this->arabGlyphs[$char])) { + // If presentation form specified FB** - FE** = Arabic presentation Forms + if (preg_match("/[\x{FB50}-\x{FEFF}]/u",$this->arabGlyphs[$char][$type])) { + $unicode = $this->UTF8StringToArray($this->arabGlyphs[$char][$type], false); + if ($this->_charDefined($this->CurrentFont['cw'],$unicode[0])) { return $this->arabGlyphs[$char][$type]; } + else if (isset($this->CurrentFont['unAGlyphs'])) { + $uni = $this->UTF8StringToArray($char, false); + $pua = $uni[0] - 1536 + 62464 + 256*$type ; + if ($this->_charDefined($this->CurrentFont['cw'], $pua)) { return strcode2utf('&#x' . dechex($pua) . ';'); } + else return $char; + } + else return $char; + } + // If PUA form specified and unAGlphs font set F5** F6** F7** = Private use area used by unAGlyphs in mPDF + if (preg_match("/[\x{F500}-\x{F7FF}]/u",$this->arabGlyphs[$char][$type]) && isset($this->CurrentFont['unAGlyphs'])) { + $unicode = $this->UTF8StringToArray($this->arabGlyphs[$char][$type], false); + if ($this->_charDefined($this->CurrentFont['cw'],$unicode[0])) { return $this->arabGlyphs[$char][$type]; } + else return $char; + } + return $this->arabGlyphs[$char][$type]; + } + else return $char; +} +/*-- END RTL --*/ + + + +//=========================== +// Functions originally in htmltoolkit - moved mPDF 4.0 + +// Call-back function Used for usort in fn _tableWrite + +function _cmpdom($a, $b) { + return ($a["dom"] < $b["dom"]) ? -1 : 1; +} + +function mb_strrev($str, $enc = 'utf-8'){ + $ch = array(); + $ch = preg_split('//u',$str); + $revch = array_reverse($ch); + return implode('',$revch); +} + +/*-- COLUMNS --*/ +// Callback function from function printcolumnbuffer in mpdf +function columnAdjustAdd($type,$k,$xadj,$yadj,$a,$b,$c=0,$d=0,$e=0,$f=0) { + if ($type == 'Td') { // xpos,ypos + $a += ($xadj * $k); + $b -= ($yadj * $k); + return 'BT '.sprintf('%.3F %.3F',$a,$b).' Td'; + } + else if ($type == 're') { // xpos,ypos,width,height + $a += ($xadj * $k); + $b -= ($yadj * $k); + return sprintf('%.3F %.3F %.3F %.3F',$a,$b,$c,$d).' re'; + } + else if ($type == 'l') { // xpos,ypos,x2pos,y2pos + $a += ($xadj * $k); + $b -= ($yadj * $k); + return sprintf('%.3F %.3F l',$a,$b); + } + else if ($type == 'img') { // width,height,xpos,ypos + $c += ($xadj * $k); + $d -= ($yadj * $k); + return sprintf('q %.3F 0 0 %.3F %.3F %.3F',$a,$b,$c,$d).' cm /'.$e; + } + else if ($type == 'draw') { // xpos,ypos + $a += ($xadj * $k); + $b -= ($yadj * $k); + return sprintf('%.3F %.3F m',$a,$b); + } + else if ($type == 'bezier') { // xpos,ypos,x2pos,y2pos,x3pos,y3pos + $a += ($xadj * $k); + $b -= ($yadj * $k); + $c += ($xadj * $k); + $d -= ($yadj * $k); + $e += ($xadj * $k); + $f -= ($yadj * $k); + return sprintf('%.3F %.3F %.3F %.3F %.3F %.3F',$a,$b,$c,$d,$e,$f).' c'; + } +} +/*-- END COLUMNS --*/ + + + +function ConvertColor($color="#000000"){ + $color = trim(strtolower($color)); + $c = false; + if ($color=='transparent') { return false; } + else if ($color=='inherit') { return false; } + else if (isset($this->SVGcolors[$color])) $color = $this->SVGcolors[$color]; + + if (preg_match('/^[\d]+$/',$color)) { $c = (array(1,$color)); } // i.e. integer only + else if ($color[0] == '#') { //case of #nnnnnn or #nnn + $cor = preg_replace('/\s+.*/','',$color); // in case of Background: #CCC url() x-repeat etc. + if (strlen($cor) == 4) { // Turn #RGB into #RRGGBB + $cor = "#" . $cor[1] . $cor[1] . $cor[2] . $cor[2] . $cor[3] . $cor[3]; + } + $r = hexdec(substr($cor, 1, 2)); + $g = hexdec(substr($cor, 3, 2)); + $b = hexdec(substr($cor, 5, 2)); + $c = array(3,$r,$g,$b); + } + else if (preg_match('/(rgba|rgb|device-cmyka|cmyka|device-cmyk|cmyk|hsla|hsl|spot)\((.*?)\)/',$color,$m)) { // mPDF 5.6.05 + $type= $m[1]; + $cores = explode(",", $m[2]); + $ncores = count($cores); + if (stristr($cores[0],'%') ) { + $cores[0] += 0; + if ($type=='rgb' || $type=='rgba') { $cores[0] = intval($cores[0]*255/100); } + } + if ($ncores>1 && stristr($cores[1],'%') ) { + $cores[1] += 0; + if ($type=='rgb' || $type=='rgba') { $cores[1] = intval($cores[1]*255/100); } + if ($type=='hsl' || $type=='hsla') { $cores[1] = $cores[1]/100; } + } + if ($ncores>2 && stristr($cores[2],'%') ) { + $cores[2] += 0; + if ($type=='rgb' || $type=='rgba') { $cores[2] = intval($cores[2]*255/100); } + if ($type=='hsl' || $type=='hsla') { $cores[2] = $cores[2]/100; } + } + if ($ncores>3 && stristr($cores[3],'%') ) { + $cores[3] += 0; + } + + if ($type=='rgb') { $c = array(3,$cores[0],$cores[1],$cores[2]); } + else if ($type=='rgba') { $c = array(5,$cores[0],$cores[1],$cores[2],$cores[3]*100); } + else if ($type=='cmyk' || $type=='device-cmyk') { $c = array(4,$cores[0],$cores[1],$cores[2],$cores[3]); } // mPDF 5.6.05 + else if ($type=='cmyka' || $type=='device-cmyka') { $c = array(6,$cores[0],$cores[1],$cores[2],$cores[3],$cores[4]*100); } // mPDF 5.6.05 + else if ($type=='hsl' || $type=='hsla') { + $conv = $this->hsl2rgb($cores[0]/360,$cores[1],$cores[2]); + if ($type=='hsl') { $c = array(3,$conv[0],$conv[1],$conv[2]); } + else if ($type=='hsla') { $c = array(5,$conv[0],$conv[1],$conv[2],$cores[3]*100); } + } + else if ($type=='spot') { + $name = strtoupper(trim($cores[0])); + // mPDF 5.6.59 + if(!isset($this->spotColors[$name])) { + if (isset($cores[5])) { $this->AddSpotColor($cores[0],$cores[2],$cores[3],$cores[4],$cores[5]); } + else { $this->Error('Undefined spot color: '.$name); } + } + $c = array(2,$this->spotColors[$name]['i'],$cores[1]); + } + } + + + // $this->restrictColorSpace + // 1 - allow GRAYSCALE only [convert CMYK/RGB->gray] + // 2 - allow RGB / SPOT COLOR / Grayscale [convert CMYK->RGB] + // 3 - allow CMYK / SPOT COLOR / Grayscale [convert RGB->CMYK] + if ($this->PDFA || $this->PDFX || $this->restrictColorSpace) { + if ($c[0]==1) { // GRAYSCALE + } + else if ($c[0]==2) { // SPOT COLOR + if (!isset($this->spotColorIDs[$c[1]])) { die('Error: Spot colour has not been defined - '.$this->spotColorIDs[$c[1]]); } + if ($this->PDFA) { + if ($this->PDFA && !$this->PDFAauto) { $this->PDFAXwarnings[] = "Spot color specified '".$this->spotColorIDs[$c[1]]."' (converted to process color)"; } + if ($this->restrictColorSpace!=3) { + $sp = $this->spotColors[$this->spotColorIDs[$c[1]]]; + $c = $this->cmyk2rgb(array(4,$sp['c'],$sp['m'],$sp['y'],$sp['k'])); + } + } + else if ($this->restrictColorSpace==1) { + $sp = $this->spotColors[$this->spotColorIDs[$c[1]]]; + $c = $this->cmyk2gray(array(4,$sp['c'],$sp['m'],$sp['y'],$sp['k'])); + } + } + else if ($c[0]==3) { // RGB + if ($this->PDFX || ($this->PDFA && $this->restrictColorSpace==3)) { + if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "RGB color specified '".$color."' (converted to CMYK)"; } + $c = $this->rgb2cmyk($c); + } + else if ($this->restrictColorSpace==1) { $c = $this->rgb2gray($c); } + else if ($this->restrictColorSpace==3) { $c = $this->rgb2cmyk($c); } + } + else if ($c[0]==4) { // CMYK + if ($this->PDFA && $this->restrictColorSpace!=3) { + if ($this->PDFA && !$this->PDFAauto) { $this->PDFAXwarnings[] = "CMYK color specified '".$color."' (converted to RGB)"; } + $c = $this->cmyk2rgb($c); + } + else if ($this->restrictColorSpace==1) { $c = $this->cmyk2gray($c); } + else if ($this->restrictColorSpace==2) { $c = $this->cmyk2rgb($c); } + } + else if ($c[0]==5) { // RGBa + if ($this->PDFX || ($this->PDFA && $this->restrictColorSpace==3)) { + if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "RGB color with transparency specified '".$color."' (converted to CMYK without transparency)"; } + $c = $this->rgb2cmyk($c); + $c = array(4, $c[1], $c[2], $c[3], $c[4]); + } + else if ($this->PDFA && $this->restrictColorSpace!=3) { + if (!$this->PDFAauto) { $this->PDFAXwarnings[] = "RGB color with transparency specified '".$color."' (converted to RGB without transparency)"; } + $c = $this->rgb2cmyk($c); + $c = array(4, $c[1], $c[2], $c[3], $c[4]); + } + else if ($this->restrictColorSpace==1) { $c = $this->rgb2gray($c); } + else if ($this->restrictColorSpace==3) { $c = $this->rgb2cmyk($c); } + } + else if ($c[0]==6) { // CMYKa + if ($this->PDFA && $this->restrictColorSpace!=3) { + if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "CMYK color with transparency specified '".$color."' (converted to RGB without transparency)"; } + $c = $this->cmyk2rgb($c); + $c = array(3, $c[1], $c[2], $c[3]); + } + else if ($this->PDFX || ($this->PDFA && $this->restrictColorSpace==3)) { + if (($this->PDFA && !$this->PDFAauto) || ($this->PDFX && !$this->PDFXauto)) { $this->PDFAXwarnings[] = "CMYK color with transparency specified '".$color."' (converted to CMYK without transparency)"; } + $c = $this->cmyk2rgb($c); + $c = array(3, $c[1], $c[2], $c[3]); + } + else if ($this->restrictColorSpace==1) { $c = $this->cmyk2gray($c); } + else if ($this->restrictColorSpace==2) { $c = $this->cmyk2rgb($c); } + } + } + if (is_array($c)) { + $c = array_pad($c, 6, 0); + $cstr = pack("a1ccccc", $c[0], ($c[1] & 0xFF), ($c[2] & 0xFF), ($c[3] & 0xFF), ($c[4] & 0xFF), ($c[5] & 0xFF) ); + } + return $cstr; +} + +function rgb2gray($c) { + if (isset($c[4])) { return array(1,(($c[1] * .21) + ($c[2] * .71) + ($c[3] * .07)), ord(1), $c[4]); } + else { return array(1,(($c[1] * .21) + ($c[2] * .71) + ($c[3] * .07))); } +} + +function cmyk2gray($c) { + $rgb = $this->cmyk2rgb($c); + return $this->rgb2gray($rgb); +} + +function rgb2cmyk($c) { + $cyan = 1 - ($c[1] / 255); + $magenta = 1 - ($c[2] / 255); + $yellow = 1 - ($c[3] / 255); + $min = min($cyan, $magenta, $yellow); + + if ($min == 1) { + if ($c[0]==5) { return array (6,100,100,100,100, $c[4]); } + else { return array (4,100,100,100,100); } + // For K-Black + //if ($c[0]==5) { return array (6,0,0,0,100, $c[4]); } + //else { return array (4,0,0,0,100); } + } + $K = $min; + $black = 1 - $K; + if ($c[0]==5) { return array (6,($cyan-$K)*100/$black, ($magenta-$K)*100/$black, ($yellow-$K)*100/$black, $K*100, $c[4]); } + else { return array (4,($cyan-$K)*100/$black, ($magenta-$K)*100/$black, ($yellow-$K)*100/$black, $K*100); } +} + + +function cmyk2rgb($c) { + $rgb = array(); + $colors = 255 - ($c[4]*2.55); + $rgb[0] = intval($colors * (255 - ($c[1]*2.55))/255); + $rgb[1] = intval($colors * (255 - ($c[2]*2.55))/255); + $rgb[2] = intval($colors * (255 - ($c[3]*2.55))/255); + if ($c[0]==6) { return array (5,$rgb[0],$rgb[1],$rgb[2], $c[5]); } + else { return array (3,$rgb[0],$rgb[1],$rgb[2]); } +} + +function rgb2hsl($var_r, $var_g, $var_b) { + $var_min = min($var_r,$var_g,$var_b); + $var_max = max($var_r,$var_g,$var_b); + $del_max = $var_max - $var_min; + $l = ($var_max + $var_min) / 2; + if ($del_max == 0) { + $h = 0; + $s = 0; + } + else { + if ($l < 0.5) { $s = $del_max / ($var_max + $var_min); } + else { $s = $del_max / (2 - $var_max - $var_min); } + $del_r = ((($var_max - $var_r) / 6) + ($del_max / 2)) / $del_max; + $del_g = ((($var_max - $var_g) / 6) + ($del_max / 2)) / $del_max; + $del_b = ((($var_max - $var_b) / 6) + ($del_max / 2)) / $del_max; + if ($var_r == $var_max) { $h = $del_b - $del_g; } + elseif ($var_g == $var_max) { $h = (1 / 3) + $del_r - $del_b; } + elseif ($var_b == $var_max) { $h = (2 / 3) + $del_g - $del_r; }; + if ($h < 0) { $h += 1; } + if ($h > 1) { $h -= 1; } + } + return array($h,$s,$l); +} + + +function hsl2rgb($h2,$s2,$l2) { + // Input is HSL value of complementary colour, held in $h2, $s, $l as fractions of 1 + // Output is RGB in normal 255 255 255 format, held in $r, $g, $b + // Hue is converted using function hue_2_rgb, shown at the end of this code + if ($s2 == 0) { + $r = $l2 * 255; + $g = $l2 * 255; + $b = $l2 * 255; + } + else { + if ($l2 < 0.5) { $var_2 = $l2 * (1 + $s2); } + else { $var_2 = ($l2 + $s2) - ($s2 * $l2); } + $var_1 = 2 * $l2 - $var_2; + $r = round(255 * $this->hue_2_rgb($var_1,$var_2,$h2 + (1 / 3))); + $g = round(255 * $this->hue_2_rgb($var_1,$var_2,$h2)); + $b = round(255 * $this->hue_2_rgb($var_1,$var_2,$h2 - (1 / 3))); + } + return array($r,$g,$b); +} + +function hue_2_rgb($v1,$v2,$vh) { + // Function to convert hue to RGB, called from above + if ($vh < 0) { $vh += 1; }; + if ($vh > 1) { $vh -= 1; }; + if ((6 * $vh) < 1) { return ($v1 + ($v2 - $v1) * 6 * $vh); }; + if ((2 * $vh) < 1) { return ($v2); }; + if ((3 * $vh) < 2) { return ($v1 + ($v2 - $v1) * ((2 / 3 - $vh) * 6)); }; + return ($v1); +} + +function _invertColor($cor) { + if ($cor[0]==3 || $cor[0]==5) { // RGB + return array(3, (255-$cor[1]), (255-$cor[2]), (255-$cor[3])); + } + else if ($cor[0]==4 || $cor[0]==6) { // CMYK + return array(4, (100-$cor[1]), (100-$cor[2]), (100-$cor[3]), (100-$cor[4])); + } + else if ($cor[0]==1) { // Grayscale + return array(1, (255-$cor[1])); + } + // Cannot cope with non-RGB colors at present + die('Error in _invertColor - trying to invert non-RGB color'); +} + +function _colAtoString($cor) { + $s = ''; + if ($cor{0}==1) $s = 'rgb('.ord($cor{1}).','.ord($cor{1}).','.ord($cor{1}).')'; + else if ($cor{0}==2) $s = 'spot('.ord($cor{1}).','.ord($cor{2}).')'; // SPOT COLOR + else if ($cor{0}==3) $s = 'rgb('.ord($cor{1}).','.ord($cor{2}).','.ord($cor{3}).')'; + else if ($cor{0}==4) $s = 'cmyk('.ord($cor{1}).','.ord($cor{2}).','.ord($cor{3}).','.ord($cor{4}).')'; + else if ($cor{0}==5) $s = 'rgba('.ord($cor{1}).','.ord($cor{2}).','.ord($cor{3}).','.sprintf('%0.2F',ord($cor{4})/100).')'; + else if ($cor{0}==6) $s = 'cmyka('.ord($cor{1}).','.ord($cor{2}).','.ord($cor{3}).','.ord($cor{4}).','.sprintf('%0.2F',ord($cor{5})/100).')'; + return $s; +} + +function ConvertSize($size=5,$maxsize=0,$fontsize=false,$usefontsize=true){ +// usefontsize - setfalse for e.g. margins - will ignore fontsize for % values +// Depends of maxsize value to make % work properly. Usually maxsize == pagewidth +// For text $maxsize = Fontsize +// Setting e.g. margin % will use maxsize (pagewidth) and em will use fontsize + //Identify size (remember: we are using 'mm' units here) + $size = trim(strtolower($size)); + + if ( $size == 'thin' ) $size = 1*(25.4/$this->dpi); //1 pixel width for table borders + elseif ( stristr($size,'px') ) $size *= (25.4/$this->dpi); //pixels + elseif ( stristr($size,'cm') ) $size *= 10; //centimeters + elseif ( stristr($size,'mm') ) $size += 0; //millimeters + elseif ( stristr($size,'pt') ) $size *= 25.4/72; //72 pts/inch + elseif ( stristr($size,'rem') ) { // mPDF 5.6.12 + $size += 0; //make "0.83rem" become simply "0.83" + $size *= ($this->default_font_size / _MPDFK); + } + elseif ( stristr($size,'em') ) { + $size += 0; //make "0.83em" become simply "0.83" + if ($fontsize) { $size *= $fontsize; } + else { $size *= $maxsize; } + } + elseif ( stristr($size,'%') ) { + $size += 0; //make "90%" become simply "90" + if ($fontsize && $usefontsize) { $size *= $fontsize/100; } + else { $size *= $maxsize/100; } + } + elseif ( stristr($size,'in') ) $size *= 25.4; //inches + elseif ( stristr($size,'pc') ) $size *= 38.1/9; //PostScript picas + elseif ( stristr($size,'ex') ) { // Approximates "ex" as half of font height + $size += 0; //make "3.5ex" become simply "3.5" + if ($fontsize) { $size *= $fontsize/2; } + else { $size *= $maxsize/2; } + } + elseif ( $size == 'medium' ) $size = 3*(25.4/$this->dpi); //3 pixel width for table borders + elseif ( $size == 'thick' ) $size = 5*(25.4/$this->dpi); //5 pixel width for table borders + elseif ($size == 'xx-small') { + if ($fontsize) { $size *= $fontsize*0.7; } + else { $size *= $maxsize*0.7; } + } + elseif ($size == 'x-small') { + if ($fontsize) { $size *= $fontsize*0.77; } + else { $size *= $maxsize*0.77; } + } + elseif ($size == 'small') { + if ($fontsize) { $size *= $fontsize*0.86; } + else { $size *= $maxsize*0.86; } + } + elseif ($size == 'medium') { + if ($fontsize) { $size *= $fontsize; } + else { $size *= $maxsize; } + } + elseif ($size == 'large') { + if ($fontsize) { $size *= $fontsize*1.2; } + else { $size *= $maxsize*1.2; } + } + elseif ($size == 'x-large') { + if ($fontsize) { $size *= $fontsize*1.5; } + else { $size *= $maxsize*1.5; } + } + elseif ($size == 'xx-large') { + if ($fontsize) { $size *= $fontsize*2; } + else { $size *= $maxsize*2; } + } + else $size *= (25.4/$this->dpi); //nothing == px + + return $size; +} + + +function lesser_entity_decode($html) { + //supports the most used entity codes (only does ascii safe characters) + //$html = str_replace("&nbsp;"," ",$html); // mPDF 5.3.59 + $html = str_replace("&lt;","<",$html); + $html = str_replace("&gt;",">",$html); + + $html = str_replace("&apos;","'",$html); + $html = str_replace("&quot;",'"',$html); + $html = str_replace("&amp;","&",$html); + return $html; +} + +function AdjustHTML($html, $tabSpaces=8) { + //Try to make the html text more manageable (turning it into XHTML) + if (PHP_VERSION_ID < 50307) { + if (strlen($html) > 100000) { + if (PHP_VERSION_ID < 50200) $this->Error("The HTML code is more than 100,000 characters. You should use WriteHTML() with smaller string lengths."); + else ini_set("pcre.backtrack_limit","1000000"); + } + } + +/*-- ANNOTATIONS --*/ + preg_match_all("/(<annotation.*?>)/si", $html, $m); + if (count($m[1])) { + for($i=0;$i<count($m[1]);$i++) { + $sub = preg_replace("/\n/si", "\xbb\xa4\xac", $m[1][$i]); + $html = preg_replace('/'.preg_quote($m[1][$i], '/').'/si', $sub, $html); + } + } +/*-- END ANNOTATIONS --*/ + + preg_match_all("/(<svg.*?<\/svg>)/si", $html, $svgi); + if (count($svgi[0])) { + for($i=0;$i<count($svgi[0]);$i++) { + $file = _MPDF_TEMP_PATH.'_tempSVG'.RAND(1,10000).'_'.$i.'.svg'; + //Save to local file + file_put_contents($file, $svgi[0][$i]); + $html = str_replace($svgi[0][$i], '<img src="'.$file.'" />', $html); // mPDF 5.5.18 + } + } + + //Remove javascript code from HTML (should not appear in the PDF file) + $html = preg_replace('/<script.*?<\/script>/is','',$html); + + //Remove special comments + $html = preg_replace('/<!--mpdf/i','',$html); + $html = preg_replace('/mpdf-->/i','',$html); + + //Remove comments from HTML (should not appear in the PDF file) + $html = preg_replace('/<!--.*?-->/s','',$html); + + $html = preg_replace('/\f/','',$html); //replace formfeed by nothing + $html = preg_replace('/\r/','',$html); //replace carriage return by nothing + + // Well formed XHTML end tags + $html = preg_replace('/<(br|hr)\/>/i',"<\\1 />",$html); + // Get rid of empty <thead></thead> + $html = preg_replace('/<thead>\s*<\/thead>/i','',$html); + $html = preg_replace('/<tfoot>\s*<\/tfoot>/i','',$html); + $html = preg_replace('/<table[^>]*>\s*<\/table>/i','',$html); + $html = preg_replace('/<tr>\s*<\/tr>/i','',$html); + + // Remove spaces at end of table cells + $html = preg_replace("/[ \n\r]+<\/t(d|h)/",'</t\\1',$html); // mPDF 5.5.09 + + $html = preg_replace("/[ ]*<dottab\s*[\/]*>[ ]*/",'<dottab />',$html); + + // Concatenates any Substitute characters from symbols/dingbats + $html = str_replace('</tts><tts>','|',$html); + $html = str_replace('</ttz><ttz>','|',$html); + $html = str_replace('</tta><tta>','|',$html); + + $html = preg_replace('/<br \/>\s*/is',"<br />",$html); + + $html = preg_replace('/<wbr[ \/]*>\s*/is',"&#173;",$html); // mPDF 5.6.04 + + // Preserve '\n's in content between the tags <pre> and </pre> + if (preg_match('/<pre/',$html)) { + $html_a = preg_split('/(\<\/?pre[^\>]*\>)/', $html, -1, 2); + $h = array(); + $c=0; + foreach($html_a AS $s) { + if ($c>1 && preg_match('/^<\/pre/i',$s)) { $c--; $s=preg_replace('/<\/pre/i','</innerpre',$s); } + else if ($c>0 && preg_match('/^<pre/i',$s)) { $c++; $s=preg_replace('/<pre/i','<innerpre',$s); } + else if (preg_match('/^<pre/i',$s)) { $c++; } + else if (preg_match('/^<\/pre/i',$s)) { $c--; } + array_push($h, $s); + } + $html = implode("", $h); + } + $thereispre = preg_match_all('#<pre(.*?)>(.*?)</pre>#si',$html,$temp); + // Preserve '\n's in content between the tags <textarea> and </textarea> + $thereistextarea = preg_match_all('#<textarea(.*?)>(.*?)</textarea>#si',$html,$temp2); + $html = preg_replace('/[\n]/',' ',$html); //replace linefeed by spaces + $html = preg_replace('/[\t]/',' ',$html); //replace tabs by spaces + + // Converts < to &lt; when not a tag + $html = preg_replace('/<([^!\/a-zA-Z])/i','&lt;\\1',$html); + $html = preg_replace("/[ ]+/",' ',$html); + + $html = preg_replace('/\/li>\s+<\/(u|o)l/i','/li></\\1l',$html); + $html = preg_replace('/\/(u|o)l>\s+<\/li/i','/\\1l></li',$html); + $html = preg_replace('/\/li>\s+<\/(u|o)l/i','/li></\\1l',$html); + $html = preg_replace('/\/li>\s+<li/i','/li><li',$html); + $html = preg_replace('/<(u|o)l([^>]*)>[ ]+/i','<\\1l\\2>',$html); + $html = preg_replace('/[ ]+<(u|o)l/i','<\\1l',$html); + + $iterator = 0; + while($thereispre) //Recover <pre attributes>content</pre> + { + $temp[2][$iterator] = preg_replace("/^([^\n\t]*?)\t/me", "stripslashes('\\1') . str_repeat(' ', ( $tabSpaces - (mb_strlen(stripslashes('\\1')) % $tabSpaces)) )",$temp[2][$iterator]); + $temp[2][$iterator] = preg_replace('/\t/',str_repeat(" ",$tabSpaces),$temp[2][$iterator]); + + $temp[2][$iterator] = preg_replace('/\n/',"<br />",$temp[2][$iterator]); + $temp[2][$iterator] = str_replace('\\',"\\\\",$temp[2][$iterator]); + $html = preg_replace('#<pre(.*?)>(.*?)</pre>#si','<erp'.$temp[1][$iterator].'>'.$temp[2][$iterator].'</erp>',$html,1); + $thereispre--; + $iterator++; + } + $iterator = 0; + while($thereistextarea) //Recover <textarea attributes>content</textarea> + { + $temp2[2][$iterator] = preg_replace('/\t/',str_repeat(" ",$tabSpaces),$temp2[2][$iterator]); + $temp2[2][$iterator] = str_replace('\\',"\\\\",$temp2[2][$iterator]); // mPDF 5.3.88 + $html = preg_replace('#<textarea(.*?)>(.*?)</textarea>#si','<aeratxet'.$temp2[1][$iterator].'>'.trim($temp2[2][$iterator]) .'</aeratxet>',$html,1); + $thereistextarea--; + $iterator++; + } + //Restore original tag names + $html = str_replace("<erp","<pre",$html); + $html = str_replace("</erp>","</pre>",$html); + $html = str_replace("<aeratxet","<textarea",$html); + $html = str_replace("</aeratxet>","</textarea>",$html); + $html = str_replace("</innerpre","</pre",$html); + $html = str_replace("<innerpre","<pre",$html); + + $html = preg_replace('/<textarea([^>]*)><\/textarea>/si','<textarea\\1> </textarea>',$html); + $html = preg_replace('/(<table[^>]*>)\s*(<caption)(.*?<\/caption>)(.*?<\/table>)/si','\\2 position="top"\\3\\1\\4\\2 position="bottom"\\3',$html); // *TABLES* + $html = preg_replace('/<(h[1-6])([^>]*)(>(?:(?!h[1-6]).)*?<\/\\1>\s*<table)/si','<\\1\\2 keep-with-table="1"\\3',$html); // *TABLES* + $html = preg_replace("/\xbb\xa4\xac/", "\n", $html); + + return $html; +} + +/*-- LISTS --*/ +function dec2other($num, $cp) { + $nstr = (string) $num; + $rnum = ''; + for ($i=0;$i<strlen($nstr);$i++) { + if ($this->_charDefined($this->CurrentFont['cw'],$cp+intval($nstr[$i]))) { // contains arabic-indic numbers + $rnum .= code2utf($cp+intval($nstr[$i])); + } + else { $rnum .= $nstr[$i]; } + } + return $rnum; +} + +function dec2alpha($valor,$toupper="true"){ +// returns a string from A-Z to AA-ZZ to AAA-ZZZ +// OBS: A = 65 ASCII TABLE VALUE + if (($valor < 1) || ($valor > 18278)) return "?"; //supports 'only' up to 18278 + $c1 = $c2 = $c3 = ''; + if ($valor > 702) // 3 letters (up to 18278) + { + $c1 = 65 + floor(($valor-703)/676); + $c2 = 65 + floor((($valor-703)%676)/26); + $c3 = 65 + floor((($valor-703)%676)%26); + } + elseif ($valor > 26) // 2 letters (up to 702) + { + $c1 = (64 + (int)(($valor-1) / 26)); + $c2 = (64 + (int)($valor % 26)); + if ($c2 == 64) $c2 += 26; + } + else // 1 letter (up to 26) + { + $c1 = (64 + $valor); + } + $alpha = chr($c1); + if ($c2 != '') $alpha .= chr($c2); + if ($c3 != '') $alpha .= chr($c3); + if (!$toupper) $alpha = strtolower($alpha); + return $alpha; +} + + +function dec2roman($valor,$toupper=true){ + //returns a string as a roman numeral + $r1=$r2=$r3=$r4=''; + if (($valor >= 5000) || ($valor < 1)) return "?"; //supports 'only' up to 4999 + $aux = (int)($valor/1000); + if ($aux!==0) + { + $valor %= 1000; + while($aux!==0) + { + $r1 .= "M"; + $aux--; + } + } + $aux = (int)($valor/100); + if ($aux!==0) + { + $valor %= 100; + switch($aux){ + case 3: $r2="C"; + case 2: $r2.="C"; + case 1: $r2.="C"; break; + case 9: $r2="CM"; break; + case 8: $r2="C"; + case 7: $r2.="C"; + case 6: $r2.="C"; + case 5: $r2="D".$r2; break; + case 4: $r2="CD"; break; + default: break; + } + } + $aux = (int)($valor/10); + if ($aux!==0) + { + $valor %= 10; + switch($aux){ + case 3: $r3="X"; + case 2: $r3.="X"; + case 1: $r3.="X"; break; + case 9: $r3="XC"; break; + case 8: $r3="X"; + case 7: $r3.="X"; + case 6: $r3.="X"; + case 5: $r3="L".$r3; break; + case 4: $r3="XL"; break; + default: break; + } + } + switch($valor){ + case 3: $r4="I"; + case 2: $r4.="I"; + case 1: $r4.="I"; break; + case 9: $r4="IX"; break; + case 8: $r4="I"; + case 7: $r4.="I"; + case 6: $r4.="I"; + case 5: $r4="V".$r4; break; + case 4: $r4="IV"; break; + default: break; + } + $roman = $r1.$r2.$r3.$r4; + if (!$toupper) $roman = strtolower($roman); + return $roman; +} +/*-- END LISTS --*/ + + +//=========================== +/*-- IMPORTS --*/ +function SetImportUse() { + $this->enableImports = true; + ini_set('auto_detect_line_endings',1); + require_once(_MPDF_PATH."mpdfi/pdf_context.php"); + require_once(_MPDF_PATH."mpdfi/pdf_parser.php"); + require_once(_MPDF_PATH."mpdfi/fpdi_pdf_parser.php"); +} + +// from mPDFI +function hex2str($hex) { + return pack("H*", str_replace(array("\r","\n"," "),"", $hex)); +} + +function str2hex($str) { + return current(unpack("H*",$str)); +} + + +function pdf_write_value(&$value) { + switch ($value[0]) { + case PDF_TYPE_NUMERIC : + case PDF_TYPE_TOKEN : + // A numeric value or a token. + // Simply output them + $this->_out($value[1]." ", false); + break; + + case PDF_TYPE_ARRAY : + // An array. Output the proper + // structure and move on. + $this->_out("[",false); + for ($i = 0; $i < count($value[1]); $i++) { + $this->pdf_write_value($value[1][$i]); + } + $this->_out("]"); + break; + + case PDF_TYPE_DICTIONARY : + // A dictionary. + $this->_out("<<",false); + reset ($value[1]); + while (list($k, $v) = each($value[1])) { + $this->_out($k . " ",false); + $this->pdf_write_value($v); + } + $this->_out(">>"); + break; + + case PDF_TYPE_OBJREF : + // An indirect object reference + // Fill the object stack if needed + $cpfn =& $this->current_parser->filename; + if (!isset($this->_don_obj_stack[$cpfn][$value[1]])) { + $this->_newobj(false,true); + $this->_obj_stack[$cpfn][$value[1]] = array($this->n, $value); + $this->_don_obj_stack[$cpfn][$value[1]] = array($this->n, $value); + } + $objid = $this->_don_obj_stack[$cpfn][$value[1]][0]; + $this->_out("{$objid} 0 R"); //{$value[2]} + break; + + case PDF_TYPE_STRING : + if ($this->encrypted) { + $value[1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[1]); + $value[1] = $this->_escape($value[1]); + } + // A string. + $this->_out('('.$value[1].')'); + break; + + case PDF_TYPE_STREAM : + // A stream. First, output the + // stream dictionary, then the + // stream data itself. + $this->pdf_write_value($value[1]); + if ($this->encrypted) { + $value[2][1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[2][1]); + } + $this->_out("stream"); + $this->_out($value[2][1]); + $this->_out("endstream"); + break; + + case PDF_TYPE_HEX : + if ($this->encrypted) { + $value[1] = $this->hex2str($value[1]); + $value[1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[1]); + // remake hexstring of encrypted string + $value[1] = $this->str2hex($value[1]); + } + $this->_out("<".$value[1].">"); + break; + + case PDF_TYPE_NULL : + // The null object. + $this->_out("null"); + break; + } +} + +// ========== OVERWRITE SEARCH STRING IN A PDF FILE ================ +function OverWrite($file_in, $search, $replacement, $dest="D", $file_out="mpdf" ) { + $pdf = file_get_contents($file_in); + + if (!is_array($search)) { + $x = $search; + $search = array($x); + } + if (!is_array($replacement)) { + $x = $replacement; + $search = array($x); + } + + if (!$this->onlyCoreFonts && !$this->usingCoreFont) { + foreach($search AS $k=>$val) { + $search[$k] = $this->UTF8ToUTF16BE($search[$k] , false); + $search[$k] = $this->_escape($search[$k]); + $replacement[$k] = $this->UTF8ToUTF16BE($replacement[$k], false); + $replacement[$k] = $this->_escape($replacement[$k]); + } + } + else { + foreach($replacement AS $k=>$val) { + $replacement[$k] = mb_convert_encoding($replacement[$k],$this->mb_enc,'utf-8'); + $replacement[$k] = $this->_escape($replacement[$k]); + } + } + + // Get xref into array + $xref = array(); + preg_match("/xref\n0 (\d+)\n(.*?)\ntrailer/s",$pdf,$m); + $xref_objid = $m[1]; + preg_match_all('/(\d{10}) (\d{5}) (f|n)/',$m[2],$x); + for($i=0; $i<count($x[0]); $i++) { + $xref[] = array(intval($x[1][$i]), $x[2][$i], $x[3][$i]); + } + + $changes = array(); + preg_match("/<<\s*\/Type\s*\/Pages\s*\/Kids\s*\[(.*?)\]\s*\/Count/s",$pdf,$m); + preg_match_all("/(\d+) 0 R /s",$m[1],$o); + $objlist = $o[1]; + foreach($objlist AS $obj) { + if ($this->compress) { + preg_match("/".($obj+1)." 0 obj\n<<\s*\/Filter\s*\/FlateDecode\s*\/Length (\d+)>>\nstream\n(.*?)\nendstream\n/s",$pdf,$m); + } + else { + preg_match("/".($obj+1)." 0 obj\n<<\s*\/Length (\d+)>>\nstream\n(.*?)\nendstream\n/s",$pdf,$m); + } + $s = $m[2]; + if (!$s) { continue; } + $oldlen = $m[1]; + if ($this->encrypted) { + $s = $this->_RC4($this->_objectkey($obj+1), $s); + } + if ($this->compress) { + $s = gzuncompress($s); + } + foreach($search AS $k=>$val) { + $s = str_replace($search[$k],$replacement[$k],$s); + } + if ($this->compress) { + $s = gzcompress($s); + } + if ($this->encrypted) { + $s = $this->_RC4($this->_objectkey($obj+1), $s); + } + $newlen = strlen($s); + $changes[($xref[$obj+1][0])] = ($newlen - $oldlen) + (strlen($newlen) - strlen($oldlen )); + if ($this->compress) { + $newstr = ($obj+1) . " 0 obj\n<</Filter /FlateDecode /Length ".$newlen.">>\nstream\n".$s."\nendstream\n"; + } + else { + $newstr = ($obj+1) . " 0 obj\n<</Length ".$newlen.">>\nstream\n".$s."\nendstream\n"; + } + $pdf = str_replace($m[0],$newstr,$pdf); + } + + // Update xref in PDF + krsort($changes); + $newxref = "xref\n0 ".$xref_objid."\n"; + foreach($xref AS $v) { + foreach($changes AS $ck => $cv) { + if ($v[0] > $ck) { $v[0] += $cv; } + } + $newxref .= sprintf('%010d',$v[0]) . ' ' . $v[1] . ' ' .$v[2] . " \n"; + } + $newxref .= "trailer"; + $pdf = preg_replace("/xref\n0 \d+\n.*?\ntrailer/s",$newxref,$pdf); + + // Update startxref in PDF + preg_match("/startxref\n(\d+)\n%%EOF/s", $pdf, $m); + $startxref = $m[1]; + $startxref += array_sum($changes); + $pdf = preg_replace("/startxref\n(\d+)\n%%EOF/s","startxref\n".$startxref."\n%%EOF",$pdf); + + // OUTPUT + switch($dest) { + case 'I': + //Send to standard output + if(isset($_SERVER['SERVER_NAME'])) + { + //We send to a browser + Header('Content-Type: application/pdf'); + Header('Content-Length: '.strlen($pdf)); + Header('Content-disposition: inline; filename='.$file_out); + } + echo $pdf; + break; + case 'F': + //Save to local file + if (!$file_out) { $file_out = 'mpdf.pdf'; } + $f=fopen($file_out,'wb'); + if(!$f) die('Unable to create output file: '.$file_out); + fwrite($f,$pdf,strlen($pdf)); + fclose($f); + break; + case 'S': + //Return as a string + return $pdf; + case 'D': + default: + //Download file + if(isset($_SERVER['HTTP_USER_AGENT']) and strpos($_SERVER['HTTP_USER_AGENT'],'MSIE')) + Header('Content-Type: application/force-download'); + else + Header('Content-Type: application/octet-stream'); + Header('Content-Length: '.strlen($pdf)); + Header('Content-disposition: attachment; filename='.$file_out); + echo $pdf; + break; + } +} + + +function GetTemplateSize($tplidx, $_w=0, $_h=0) { + if (!$this->tpls[$tplidx]) + return false; + $w = $this->tpls[$tplidx]['box']['w']; + $h = $this->tpls[$tplidx]['box']['h']; + if ($_w == 0 and $_h == 0) { + $_w = $w; + $_h = $h; + } + if($_w==0) + $_w=$_h*$w/$h; + if($_h==0) + $_h=$_w*$h/$w; + return array("w" => $_w, "h" => $_h); +} + +// Thumbnails +function Thumbnail($file, $npr=3, $spacing=10) { //$npr = number per row + $w = (($this->pgwidth + $spacing)/$npr) - $spacing; + $oldlinewidth = $this->LineWidth; + $this->SetLineWidth(0.02); + $this->SetDColor($this->ConvertColor(0)); + $h = 0; + $maxh = 0; + $x = $_x = $this->lMargin; + $_y = $this->tMargin; + if ($this->y==0) { $y = $_y; } else { $y = $this->y; } + $pagecount = $this->SetSourceFile($file); + for ($n = 1; $n <= $pagecount; $n++) { + $tplidx = $this->ImportPage($n); + $size = $this->useTemplate($tplidx, $x, $y, $w); + $this->Rect($x, $y, $size['w'], $size['h']); + $h = max($h, $size['h']); + $maxh = max($h, $maxh); + if ($n % $npr == 0) { + if (($y + $h + $spacing + $maxh)>$this->PageBreakTrigger && $n != $pagecount) { + $this->AddPage(); + $x = $_x; + $y = $_y; + } + else { + $y += $h+$spacing ; + $x = $_x; + $h = 0; + } + } + else { + $x += $w+$spacing ; + } + } + $this->SetLineWidth($oldlinewidth); +} + +function SetSourceFile($filename) { + $this->current_filename = $filename; + $fn =& $this->current_filename; + if (!isset($this->parsers[$fn])) + // $this->parsers[$fn] =& new fpdi_pdf_parser($fn,$this); + $this->parsers[$fn] = new fpdi_pdf_parser($fn,$this); + if (!$this->parsers[$fn]->success) { + $this->Error($this->parsers[$fn]->errormsg); // Delete this line to return false on fail + return false; + } + $this->current_parser =& $this->parsers[$fn]; + return $this->parsers[$fn]->getPageCount(); +} +function ImportPage($pageno=1, $crop_x=null, $crop_y=null, $crop_w=0, $crop_h=0, $boxName='/CropBox') { + $fn =& $this->current_filename; + $parser =& $this->parsers[$fn]; + $parser->setPageno($pageno); + + $this->tpl++; + $this->tpls[$this->tpl] = array(); + $tpl =& $this->tpls[$this->tpl]; + $tpl['parser'] =& $parser; + $tpl['resources'] = $parser->getPageResources(); + $tpl['buffer'] = $parser->getContent(); + if (!in_array($boxName, $parser->availableBoxes)) + return $this->Error(sprintf("Unknown box: %s", $boxName)); + $pageboxes = $parser->getPageBoxes($pageno); + /** + * MediaBox + * CropBox: Default -> MediaBox + * BleedBox: Default -> CropBox + * TrimBox: Default -> CropBox + * ArtBox: Default -> CropBox + */ + if (!isset($pageboxes[$boxName]) && ($boxName == "/BleedBox" || $boxName == "/TrimBox" || $boxName == "/ArtBox")) + $boxName = "/CropBox"; + if (!isset($pageboxes[$boxName]) && $boxName == "/CropBox") + $boxName = "/MediaBox"; + if (!isset($pageboxes[$boxName])) + return false; + $box = $pageboxes[$boxName]; + + $tpl['box'] = $box; + // To build an array that can be used by useTemplate() + $this->tpls[$this->tpl] = array_merge($this->tpls[$this->tpl],$box); + // An imported page will start at 0,0 everytime. Translation will be set in _putformxobjects() + $tpl['x'] = 0; + $tpl['y'] = 0; + $tpl['w'] = $tpl['box']['w'] ; + $tpl['h'] = $tpl['box']['h'] ; + if ($crop_w) { $tpl['box']['w'] = $crop_w; } + if ($crop_h) { $tpl['box']['h'] = $crop_h; } + if (isset($crop_x)) { $tpl['box']['x'] = $crop_x; } + if (isset($crop_y)) {$tpl['box']['y'] = $tpl['h'] - $crop_y - $crop_h ; } + + $page =& $parser->pages[$parser->pageno]; + // fix for rotated pages + $rotation = $parser->getPageRotation($pageno); + + if (isset($rotation[1]) && ($angle = $rotation[1] % 360) != 0 && $tpl['box']['w'] == $tpl['w']) { + $steps = $angle / 90; + + $_w = $tpl['w']; + $_h = $tpl['h']; + $tpl['w'] = $steps % 2 == 0 ? $_w : $_h; + $tpl['h'] = $steps % 2 == 0 ? $_h : $_w; + if ($steps % 2 != 0) { + $x = $y = ($steps == 1 || $steps == -3) ? $tpl['h'] : $tpl['w']; + } else { + $x = $tpl['w']; + $y = $tpl['h']; + } + $cx=($x/2+$tpl['box']['x'])*_MPDFK; + $cy=($y/2+$tpl['box']['y'])*_MPDFK; + $angle*=-1; + $angle*=M_PI/180; + $c=cos($angle); + $s=sin($angle); + $tpl['box']['w'] = $tpl['w'] ; + $tpl['box']['h'] = $tpl['h'] ; + $tpl['buffer'] = sprintf('q %.5F %.5F %.5F %.5F %.2F %.2F cm 1 0 0 1 %.2F %.2F cm %s Q',$c,$s,-$s,$c,$cx,$cy,-$cx,-$cy, $tpl['buffer']); + } + return $this->tpl; +} +function UseTemplate($tplidx, $_x=null, $_y=null, $_w=0, $_h=0) { + if (!isset($this->tpls[$tplidx])) + $this->Error("Template does not exist!"); + if($this->state==0) { $this->AddPage(); } + $out = 'q 0 J 1 w 0 j 0 G'."\n"; // reset standard values + $x = $this->tpls[$tplidx]['x']; + $y = $this->tpls[$tplidx]['y']; + $w = $this->tpls[$tplidx]['w']; + $h = $this->tpls[$tplidx]['h']; + if ($_x == null) { $_x = $x; } + if ($_y == null) { $_y = $y; } + if ($_x === -1) { $_x = $this->x; } + if ($_y === -1) { $_y = $this->y; } + + $wh = $this->getTemplateSize($tplidx,$_w,$_h); + $_w = $wh['w']; + $_h = $wh['h']; + $out .= sprintf("q %.4F 0 0 %.4F %.2F %.2F cm", ($_w/$this->tpls[$tplidx]['box']['w']), ($_h/$this->tpls[$tplidx]['box']['h']), $_x*_MPDFK, ($this->h-($_y+$_h))*_MPDFK)."\n"; + $out .= $this->tplprefix.$tplidx." Do Q\n"; + + $s = array("w" => $_w, "h" => $_h); + $out .= "Q\n"; + $this->pages[$this->page] = $out . $this->pages[$this->page]; + return $s; +} +function SetPageTemplate($tplidx='') { + if (!isset($this->tpls[$tplidx])) { + $this->pageTemplate = ''; + return false; + } + $this->pageTemplate = $tplidx; +} +function SetDocTemplate($file='', $continue=0) { + $this->docTemplate = $file; + $this->docTemplateContinue = $continue; +} +/*-- END IMPORTS --*/ + + +/* ---------------------------------------------- */ +/* ---------------------------------------------- */ +/* ---------------------------------------------- */ +/* ---------------------------------------------- */ +/* ---------------------------------------------- */ + +// JAVASCRIPT +function _set_object_javascript ($string) { + $this->_newobj(); + $this->_out('<<'); + $this->_out('/S /JavaScript '); + $this->_out('/JS '.$this->_textstring($string)); + $this->_out('>>'); + $this->_out('endobj'); +} + +function SetJS($script) { + $this->js = $script; +} + + + + +}//end of Class + + + + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/mpdfi/filters/FilterASCII85.php b/application/third_party/mpdf/mpdfi/filters/FilterASCII85.php new file mode 100644 index 0000000..a0d480d --- /dev/null +++ b/application/third_party/mpdf/mpdfi/filters/FilterASCII85.php @@ -0,0 +1,98 @@ +<?php +// +// FPDI - Version 1.3.1 +// +// Copyright 2004-2009 Setasign - Jan Slabon +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +if (!defined('ORD_z')) + define('ORD_z',ord('z')); +if (!defined('ORD_exclmark')) + define('ORD_exclmark', ord('!')); +if (!defined('ORD_u')) + define('ORD_u', ord('u')); +if (!defined('ORD_tilde')) + define('ORD_tilde', ord('~')); + +class FilterASCII85 { + + function error($msg) { + die($msg); + } + + function decode($in) { + $out = ''; + $state = 0; + $chn = null; + + $l = strlen($in); + + for ($k = 0; $k < $l; ++$k) { + $ch = ord($in[$k]) & 0xff; + + if ($ch == ORD_tilde) { + break; + } + if (preg_match('/^\s$/',chr($ch))) { + continue; + } + if ($ch == ORD_z && $state == 0) { + $out .= chr(0).chr(0).chr(0).chr(0); + continue; + } + if ($ch < ORD_exclmark || $ch > ORD_u) { + $this->error('Illegal character in ASCII85Decode.'); + } + + $chn[$state++] = $ch - ORD_exclmark; + + if ($state == 5) { + $state = 0; + $r = 0; + for ($j = 0; $j < 5; ++$j) + $r = $r * 85 + $chn[$j]; + $out .= chr($r >> 24); + $out .= chr($r >> 16); + $out .= chr($r >> 8); + $out .= chr($r); + } + } + $r = 0; + + if ($state == 1) + $this->error('Illegal length in ASCII85Decode.'); + if ($state == 2) { + $r = $chn[0] * 85 * 85 * 85 * 85 + ($chn[1]+1) * 85 * 85 * 85; + $out .= chr($r >> 24); + } + else if ($state == 3) { + $r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85 + ($chn[2]+1) * 85 * 85; + $out .= chr($r >> 24); + $out .= chr($r >> 16); + } + else if ($state == 4) { + $r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85 + $chn[2] * 85 * 85 + ($chn[3]+1) * 85 ; + $out .= chr($r >> 24); + $out .= chr($r >> 16); + $out .= chr($r >> 8); + } + + return $out; + } + + function encode($in) { + $this->error("ASCII85 encoding not implemented."); + } +} \ No newline at end of file diff --git a/application/third_party/mpdf/mpdfi/filters/FilterLZW.php b/application/third_party/mpdf/mpdfi/filters/FilterLZW.php new file mode 100644 index 0000000..b742565 --- /dev/null +++ b/application/third_party/mpdf/mpdfi/filters/FilterLZW.php @@ -0,0 +1,154 @@ +<?php +// +// FPDI - Version 1.3.1 +// +// Copyright 2004-2009 Setasign - Jan Slabon +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +class FilterLZW { + + var $sTable = array(); + var $data = null; + var $dataLength = 0; + var $tIdx; + var $bitsToGet = 9; + var $bytePointer; + var $bitPointer; + var $nextData = 0; + var $nextBits = 0; + var $andTable = array(511, 1023, 2047, 4095); + + function error($msg) { + die($msg); + } + + /** + * Method to decode LZW compressed data. + * + * @param string data The compressed data. + */ + function decode($data) { + + if($data[0] == 0x00 && $data[1] == 0x01) { + $this->error('LZW flavour not supported.'); + } + + $this->initsTable(); + + $this->data = $data; + $this->dataLength = strlen($data); + + // Initialize pointers + $this->bytePointer = 0; + $this->bitPointer = 0; + + $this->nextData = 0; + $this->nextBits = 0; + + $oldCode = 0; + + $string = ''; + $uncompData = ''; + + while (($code = $this->getNextCode()) != 257) { + if ($code == 256) { + $this->initsTable(); + $code = $this->getNextCode(); + + if ($code == 257) { + break; + } + + $uncompData .= $this->sTable[$code]; + $oldCode = $code; + + } else { + + if ($code < $this->tIdx) { + $string = $this->sTable[$code]; + $uncompData .= $string; + + $this->addStringToTable($this->sTable[$oldCode], $string[0]); + $oldCode = $code; + } else { + $string = $this->sTable[$oldCode]; + $string = $string.$string[0]; + $uncompData .= $string; + + $this->addStringToTable($string); + $oldCode = $code; + } + } + } + + return $uncompData; + } + + + /** + * Initialize the string table. + */ + function initsTable() { + $this->sTable = array(); + + for ($i = 0; $i < 256; $i++) + $this->sTable[$i] = chr($i); + + $this->tIdx = 258; + $this->bitsToGet = 9; + } + + /** + * Add a new string to the string table. + */ + function addStringToTable ($oldString, $newString='') { + $string = $oldString.$newString; + + // Add this new String to the table + $this->sTable[$this->tIdx++] = $string; + + if ($this->tIdx == 511) { + $this->bitsToGet = 10; + } else if ($this->tIdx == 1023) { + $this->bitsToGet = 11; + } else if ($this->tIdx == 2047) { + $this->bitsToGet = 12; + } + } + + // Returns the next 9, 10, 11 or 12 bits + function getNextCode() { + if ($this->bytePointer == $this->dataLength) { + return 257; + } + + $this->nextData = ($this->nextData << 8) | (ord($this->data[$this->bytePointer++]) & 0xff); + $this->nextBits += 8; + + if ($this->nextBits < $this->bitsToGet) { + $this->nextData = ($this->nextData << 8) | (ord($this->data[$this->bytePointer++]) & 0xff); + $this->nextBits += 8; + } + + $code = ($this->nextData >> ($this->nextBits - $this->bitsToGet)) & $this->andTable[$this->bitsToGet-9]; + $this->nextBits -= $this->bitsToGet; + + return $code; + } + + function encode($in) { + $this->error("LZW encoding not implemented."); + } +} \ No newline at end of file diff --git a/application/third_party/mpdf/mpdfi/fpdi_pdf_parser.php b/application/third_party/mpdf/mpdfi/fpdi_pdf_parser.php new file mode 100644 index 0000000..9cc2456 --- /dev/null +++ b/application/third_party/mpdf/mpdfi/fpdi_pdf_parser.php @@ -0,0 +1,363 @@ +<?php +// +// FPDI - Version 1.2 +// +// Copyright 2004-2007 Setasign - Jan Slabon +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + + +class fpdi_pdf_parser extends pdf_parser { + + /** + * Pages + * Index beginns at 0 + * + * @var array + */ + var $pages; + + /** + * Page count + * @var integer + */ + var $page_count; + + /** + * actual page number + * @var integer + */ + var $pageno; + + + /** + * FPDI Reference + * @var object + */ + var $fpdi; + + /** + * Available BoxTypes + * + * @var array + */ + var $availableBoxes = array("/MediaBox","/CropBox","/BleedBox","/TrimBox","/ArtBox"); + + /** + * Constructor + * + * @param string $filename Source-Filename + * @param object $fpdi Object of type fpdi + */ + function fpdi_pdf_parser($filename,&$fpdi) { + $this->fpdi =& $fpdi; + $this->filename = $filename; + + parent::pdf_parser($filename); + if ($this->success == false) { return false; } + + // resolve Pages-Dictonary + $pages = $this->pdf_resolve_object($this->c, $this->root[1][1]['/Pages']); + if ($this->success == false) { return false; } + + // Read pages + $this->read_pages($this->c, $pages, $this->pages); + if ($this->success == false) { return false; } + + // count pages; + $this->page_count = count($this->pages); + } + + + /** + * Get pagecount from sourcefile + * + * @return int + */ + function getPageCount() { + return $this->page_count; + } + + + /** + * Set pageno + * + * @param int $pageno Pagenumber to use + */ + function setPageno($pageno) { + $pageno = ((int) $pageno) - 1; + + if ($pageno < 0 || $pageno >= $this->getPageCount()) { + $this->fpdi->error("Pagenumber is wrong!"); + } + + $this->pageno = $pageno; + } + + /** + * Get page-resources from current page + * + * @return array + */ + function getPageResources() { + return $this->_getPageResources($this->pages[$this->pageno]); + } + + /** + * Get page-resources from /Page + * + * @param array $obj Array of pdf-data + */ + function _getPageResources ($obj) { // $obj = /Page + $obj = $this->pdf_resolve_object($this->c, $obj); + + // If the current object has a resources + // dictionary associated with it, we use + // it. Otherwise, we move back to its + // parent object. + if (isset ($obj[1][1]['/Resources'])) { + $res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Resources']); + if ($res[0] == PDF_TYPE_OBJECT) + return $res[1]; + return $res; + } else { + if (!isset ($obj[1][1]['/Parent'])) { + return false; + } else { + $res = $this->_getPageResources($obj[1][1]['/Parent']); + if ($res[0] == PDF_TYPE_OBJECT) + return $res[1]; + return $res; + } + } + } + + + /** + * Get content of current page + * + * If more /Contents is an array, the streams are concated + * + * @return string + */ + function getContent() { + $buffer = ""; + + if (isset($this->pages[$this->pageno][1][1]['/Contents'])) { + $contents = $this->_getPageContent($this->pages[$this->pageno][1][1]['/Contents']); + foreach($contents AS $tmp_content) { + $buffer .= $this->_rebuildContentStream($tmp_content).' '; + } + } + + return $buffer; + } + + + /** + * Resolve all content-objects + * + * @param array $content_ref + * @return array + */ + function _getPageContent($content_ref) { + $contents = array(); + + if ($content_ref[0] == PDF_TYPE_OBJREF) { + $content = $this->pdf_resolve_object($this->c, $content_ref); + if ($content[1][0] == PDF_TYPE_ARRAY) { + $contents = $this->_getPageContent($content[1]); + } else { + $contents[] = $content; + } + } else if ($content_ref[0] == PDF_TYPE_ARRAY) { + foreach ($content_ref[1] AS $tmp_content_ref) { + $contents = array_merge($contents,$this->_getPageContent($tmp_content_ref)); + } + } + + return $contents; + } + + + /** + * Rebuild content-streams + * + * @param array $obj + * @return string + */ + function _rebuildContentStream($obj) { + $filters = array(); + + if (isset($obj[1][1]['/Filter'])) { + $_filter = $obj[1][1]['/Filter']; + + if ($_filter[0] == PDF_TYPE_TOKEN) { + $filters[] = $_filter; + } else if ($_filter[0] == PDF_TYPE_ARRAY) { + $filters = $_filter[1]; + } + } + + $stream = $obj[2][1]; + + foreach ($filters AS $_filter) { + switch ($_filter[1]) { + case "/FlateDecode": + if (function_exists('gzuncompress')) { + $stream = (strlen($stream) > 0) ? @gzuncompress($stream) : ''; + } else { + $this->fpdi->error(sprintf("To handle %s filter, please compile php with zlib support.",$_filter[1])); + } + if ($stream === false) { + $this->fpdi->error("Error while decompressing stream."); + } + break; + // mPDF 4.2.003 + case '/LZWDecode': + include_once(_MPDF_PATH.'mpdfi/filters/FilterLZW.php'); + // mPDF 5.0 Removed pass by reference =& + $decoder = new FilterLZW(); + $stream = $decoder->decode($stream); + break; + case '/ASCII85Decode': + include_once(_MPDF_PATH.'mpdfi/filters/FilterASCII85.php'); + // mPDF 5.0 Removed pass by reference =& + $decoder = new FilterASCII85(); + $stream = $decoder->decode($stream); + break; + case null: + $stream = $stream; + break; + default: + $this->fpdi->error(sprintf("Unsupported Filter: %s",$_filter[1])); + } + } + + return $stream; + } + + + /** + * Get a Box from a page + * Arrayformat is same as used by fpdf_tpl + * + * @param array $page a /Page + * @param string $box_index Type of Box @see $availableBoxes + * @return array + */ + function getPageBox($page, $box_index) { + $page = $this->pdf_resolve_object($this->c,$page); + $box = null; + if (isset($page[1][1][$box_index])) + $box =& $page[1][1][$box_index]; + + if (!is_null($box) && $box[0] == PDF_TYPE_OBJREF) { + $tmp_box = $this->pdf_resolve_object($this->c,$box); + $box = $tmp_box[1]; + } + + if (!is_null($box) && $box[0] == PDF_TYPE_ARRAY) { + $b =& $box[1]; + return array("x" => $b[0][1]/_MPDFK, + "y" => $b[1][1]/_MPDFK, + "w" => abs($b[0][1]-$b[2][1])/_MPDFK, + "h" => abs($b[1][1]-$b[3][1])/_MPDFK); // mPDF 5.3.90 + } else if (!isset ($page[1][1]['/Parent'])) { + return false; + } else { + return $this->getPageBox($this->pdf_resolve_object($this->c, $page[1][1]['/Parent']), $box_index); + } + } + + function getPageBoxes($pageno) { + return $this->_getPageBoxes($this->pages[$pageno-1]); + } + + /** + * Get all Boxes from /Page + * + * @param array a /Page + * @return array + */ + function _getPageBoxes($page) { + $boxes = array(); + + foreach($this->availableBoxes AS $box) { + if ($_box = $this->getPageBox($page,$box)) { + $boxes[$box] = $_box; + } + } + + return $boxes; + } + + function getPageRotation($pageno) { + return $this->_getPageRotation($this->pages[$pageno-1]); + } + + function _getPageRotation ($obj) { // $obj = /Page + $obj = $this->pdf_resolve_object($this->c, $obj); + if (isset ($obj[1][1]['/Rotate'])) { + $res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Rotate']); + if ($res[0] == PDF_TYPE_OBJECT) + return $res[1]; + return $res; + } else { + if (!isset ($obj[1][1]['/Parent'])) { + return false; + } else { + $res = $this->_getPageRotation($obj[1][1]['/Parent']); + if ($res[0] == PDF_TYPE_OBJECT) + return $res[1]; + return $res; + } + } + } + + /** + * Read all /Page(es) + * + * @param object pdf_context + * @param array /Pages + * @param array the result-array + */ + function read_pages (&$c, &$pages, &$result) { + // Get the kids dictionary + $kids = $this->pdf_resolve_object ($c, $pages[1][1]['/Kids']); + + if (!is_array($kids)) { + // mPDF 4.0 + $this->success = false; + $this->errormsg = sprintf("Cannot find /Kids in current /Page-Dictionary"); + return false; + } + foreach ($kids[1] as $v) { + $pg = $this->pdf_resolve_object ($c, $v); + if ($pg[1][1]['/Type'][1] === '/Pages') { + // If one of the kids is an embedded + // /Pages array, resolve it as well. + $this->read_pages ($c, $pg, $result); + } else { + $result[] = $pg; + } + } + } + + + + +} + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/mpdfi/pdf_context.php b/application/third_party/mpdf/mpdfi/pdf_context.php new file mode 100644 index 0000000..0e961ca --- /dev/null +++ b/application/third_party/mpdf/mpdfi/pdf_context.php @@ -0,0 +1,78 @@ +<?php +// +// FPDI - Version 1.2 +// +// Copyright 2004-2007 Setasign - Jan Slabon +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +class pdf_context { + + var $file; + var $buffer; + var $offset; + var $length; + + var $stack; + + // Constructor + + function pdf_context($f) { + $this->file = $f; + $this->reset(); + } + + // Optionally move the file + // pointer to a new location + // and reset the buffered data + + function reset($pos = null, $l = 100) { + if (!is_null ($pos)) { + fseek ($this->file, $pos); + } + + $this->buffer = $l > 0 ? fread($this->file, $l) : ''; + $this->offset = 0; + $this->length = strlen($this->buffer); + $this->stack = array(); + } + + // Make sure that there is at least one + // character beyond the current offset in + // the buffer to prevent the tokenizer + // from attempting to access data that does + // not exist + + function ensure_content() { + if ($this->offset >= $this->length - 1) { + return $this->increase_length(); + } else { + return true; + } + } + + // Forcefully read more data into the buffer + + function increase_length($l=100) { + if (feof($this->file)) { + return false; + } else { + $this->buffer .= fread($this->file, $l); + $this->length = strlen($this->buffer); + return true; + } + } + +} +?> \ No newline at end of file diff --git a/application/third_party/mpdf/mpdfi/pdf_parser.php b/application/third_party/mpdf/mpdfi/pdf_parser.php new file mode 100644 index 0000000..86abcc1 --- /dev/null +++ b/application/third_party/mpdf/mpdfi/pdf_parser.php @@ -0,0 +1,690 @@ +<?php +// +// FPDI - Version 1.2 +// +// Copyright 2004-2007 Setasign - Jan Slabon +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +if (!defined ('PDF_TYPE_NULL')) + define ('PDF_TYPE_NULL', 0); +if (!defined ('PDF_TYPE_NUMERIC')) + define ('PDF_TYPE_NUMERIC', 1); +if (!defined ('PDF_TYPE_TOKEN')) + define ('PDF_TYPE_TOKEN', 2); +if (!defined ('PDF_TYPE_HEX')) + define ('PDF_TYPE_HEX', 3); +if (!defined ('PDF_TYPE_STRING')) + define ('PDF_TYPE_STRING', 4); +if (!defined ('PDF_TYPE_DICTIONARY')) + define ('PDF_TYPE_DICTIONARY', 5); +if (!defined ('PDF_TYPE_ARRAY')) + define ('PDF_TYPE_ARRAY', 6); +if (!defined ('PDF_TYPE_OBJDEC')) + define ('PDF_TYPE_OBJDEC', 7); +if (!defined ('PDF_TYPE_OBJREF')) + define ('PDF_TYPE_OBJREF', 8); +if (!defined ('PDF_TYPE_OBJECT')) + define ('PDF_TYPE_OBJECT', 9); +if (!defined ('PDF_TYPE_STREAM')) + define ('PDF_TYPE_STREAM', 10); + + +class pdf_parser { + + /** + * Filename + * @var string + */ + var $filename; + + /** + * File resource + * @var resource + */ + var $f; + + /** + * PDF Context + * @var object pdf_context-Instance + */ + var $c; + + /** + * xref-Data + * @var array + */ + var $xref; + + /** + * root-Object + * @var array + */ + var $root; + + // mPDF 4.0 Added flag to show success on loading file + var $success; + var $errormsg; + + /** + * Constructor + * + * @param string $filename Source-Filename + */ + function pdf_parser($filename) { + $this->filename = $filename; + // mPDF 4.0 + $this->success = true; + + $this->f = @fopen($this->filename, "rb"); + + if (!$this->f) { + $this->success = false; + $this->errormsg = sprintf("Cannot open %s !", $filename); + return false; + } + // mPDF 5.0 Removed pass by reference =& + $this->c = new pdf_context($this->f); + // Read xref-Data + $offset = $this->pdf_find_xref(); + if ($offset===false) { + $this->success = false; + $this->errormsg = sprintf("Cannot open %s !", $filename); + return false; + } + $this->pdf_read_xref($this->xref, $offset); + if ($this->success == false) { return false; } + + // Check for Encryption + $this->getEncryption(); + if ($this->success == false) { return false; } + + // Read root + $this->pdf_read_root(); + if ($this->success == false) { return false; } + } + + /** + * Close the opened file + */ + function closeFile() { + if (isset($this->f)) { + fclose($this->f); + unset($this->f); + } + } + + /** + * Print Error and die + * + * @param string $msg Error-Message + */ + function error($msg) { + die("<b>PDF-Parser Error:</b> ".$msg); + } + + /** + * Check Trailer for Encryption + */ + function getEncryption() { + if (isset($this->xref['trailer'][1]['/Encrypt'])) { + // mPDF 4.0 + $this->success = false; + $this->errormsg = sprintf("File is encrypted!"); + return false; + } + } + + /** + * Find/Return /Root + * + * @return array + */ + function pdf_find_root() { + if ($this->xref['trailer'][1]['/Root'][0] != PDF_TYPE_OBJREF) { + // mPDF 4.0 + $this->success = false; + $this->errormsg = sprintf("Wrong Type of Root-Element! Must be an indirect reference"); + return false; + } + return $this->xref['trailer'][1]['/Root']; + } + + /** + * Read the /Root + */ + function pdf_read_root() { + // read root + $root = $this->pdf_find_root(); + if ($root ===false) { + $this->success = false; + return false; + } + $this->root = $this->pdf_resolve_object($this->c, $root); + } + + /** + * Find the xref-Table + */ + function pdf_find_xref() { + fseek ($this->f, -min(filesize($this->filename),1500), SEEK_END); + $data = fread($this->f, 1500); + + $pos = strlen($data) - strpos(strrev($data), strrev('startxref')); + $data = substr($data, $pos); + + if (!preg_match('/\s*(\d+).*$/s', $data, $matches)) { + // mPDF 4.0 + $this->success = false; + $this->errormsg = sprintf("Unable to find pointer to xref table"); + return false; + } + + return (int) $matches[1]; + } + + /** + * Read xref-table + * + * @param array $result Array of xref-table + * @param integer $offset of xref-table + * @param integer $start start-position in xref-table + * @param integer $end end-position in xref-table + */ + function pdf_read_xref(&$result, $offset, $start = null, $end = null) { + if (is_null ($start) || is_null ($end)) { + fseek($this->f, $o_pos = $offset); + $data = trim(fgets($this->f,1024)); + + if (strlen($data) == 0) + $data = trim(fgets($this->f,1024)); + + if ($data !== 'xref') { + fseek($this->f, $o_pos); + $data = trim(_fgets($this->f, true)); + if ($data !== 'xref') { + if (preg_match('/(.*xref)(.*)/m', $data, $m)) { // xref 0 128 - in one line + fseek($this->f, $o_pos+strlen($m[1])); + } elseif (preg_match('/(x|r|e|f)+/', $data, $m)) { // correct invalid xref-pointer + $tmpOffset = $offset-4+strlen($m[0]); + $this->pdf_read_xref($result, $tmpOffset, $start, $end); + return; + } else { + // mPDF 4.0 + $this->success = false; + $this->errormsg = sprintf("Unable to find xref table - Maybe a Problem with 'auto_detect_line_endings'"); + return; + } + } + } + + $o_pos = ftell($this->f); + $data = explode(' ', trim(fgets($this->f,1024))); + if (count($data) != 2) { + fseek($this->f, $o_pos); + $data = explode(' ', trim(_fgets($this->f, true))); + + if (count($data) != 2) { + if (count($data) > 2) { // no lineending + $n_pos = $o_pos+strlen($data[0])+strlen($data[1])+2; + fseek($this->f, $n_pos); + } else { + // mPDF 4.0 + $this->success = false; + $this->errormsg = sprintf("Unexpected header in xref table"); + return; + } + } + } + $start = $data[0]; + $end = $start + $data[1]; + } + + if (!isset($result['xref_location'])) { + $result['xref_location'] = $offset; + } + + if (!isset($result['max_object']) || $end > $result['max_object']) { + $result['max_object'] = $end; + } + + for (; $start < $end; $start++) { + $data = ltrim(fread($this->f, 20)); // Spezifications says: 20 bytes including newlines + $offset = substr($data, 0, 10); + $generation = substr($data, 11, 5); + + if (!isset ($result['xref'][$start][(int) $generation])) { + $result['xref'][$start][(int) $generation] = (int) $offset; + } + } + + $o_pos = ftell($this->f); + $data = fgets($this->f,1024); + if (strlen(trim($data)) == 0) + $data = fgets($this->f, 1024); + + if (preg_match("/trailer/",$data)) { + if (preg_match("/(.*trailer[ \n\r]*)/",$data,$m)) { + fseek($this->f, $o_pos+strlen($m[1])); + } + + // mPDF 5.0 Removed pass by reference =& + $c = new pdf_context($this->f); + $trailer = $this->pdf_read_value($c); + + if (isset($trailer[1]['/Prev'])) { + $this->pdf_read_xref($result, $trailer[1]['/Prev'][1]); + $result['trailer'][1] = array_merge($result['trailer'][1], $trailer[1]); + } else { + $result['trailer'] = $trailer; + } + } else { + $data = explode(' ', trim($data)); + + if (count($data) != 2) { + fseek($this->f, $o_pos); + $data = explode(' ', trim (_fgets ($this->f, true))); + + if (count($data) != 2) { + // mPDF 4.0 + $this->success = false; + $this->errormsg = sprintf("Unexpected data in xref table"); + return; + } + } + + $this->pdf_read_xref($result, null, (int) $data[0], (int) $data[0] + (int) $data[1]); + } + } + + + /** + * Reads an Value + * + * @param object $c pdf_context + * @param string $token a Token + * @return mixed + */ + function pdf_read_value(&$c, $token = null) { + if (is_null($token)) { + $token = $this->pdf_read_token($c); + } + + if ($token === false) { + return false; + } + + switch ($token) { + case '<': + // This is a hex string. + // Read the value, then the terminator + + $pos = $c->offset; + + while(1) { + + $match = strpos ($c->buffer, '>', $pos); + + // If you can't find it, try + // reading more data from the stream + + if ($match === false) { + if (!$c->increase_length()) { + return false; + } else { + continue; + } + } + + $result = substr ($c->buffer, $c->offset, $match - $c->offset); + $c->offset = $match+1; + + return array (PDF_TYPE_HEX, $result); + } + + break; + case '<<': + // This is a dictionary. + + $result = array(); + + // Recurse into this function until we reach + // the end of the dictionary. + while (($key = $this->pdf_read_token($c)) !== '>>') { + if ($key === false) { + return false; + } + + if (($value = $this->pdf_read_value($c)) === false) { + return false; + } + $result[$key] = $value; + } + + return array (PDF_TYPE_DICTIONARY, $result); + + case '[': + // This is an array. + + $result = array(); + + // Recurse into this function until we reach + // the end of the array. + while (($token = $this->pdf_read_token($c)) !== ']') { + if ($token === false) { + return false; + } + + if (($value = $this->pdf_read_value($c, $token)) === false) { + return false; + } + + $result[] = $value; + } + + return array (PDF_TYPE_ARRAY, $result); + + case '(' : + // This is a string + + $pos = $c->offset; + + while(1) { + + // Start by finding the next closed + // parenthesis + + $match = strpos ($c->buffer, ')', $pos); + + // If you can't find it, try + // reading more data from the stream + + if ($match === false) { + if (!$c->increase_length()) { + return false; + } else { + continue; + } + } + + // Make sure that there is no backslash + // before the parenthesis. If there is, + // move on. Otherwise, return the string. + $esc = preg_match('/([\\\\]+)$/', $tmpresult = substr($c->buffer, $c->offset, $match - $c->offset), $m); + + if ($esc === 0 || strlen($m[1]) % 2 == 0) { + $result = $tmpresult; + $c->offset = $match + 1; + return array (PDF_TYPE_STRING, $result); + } else { + $pos = $match + 1; + + if ($pos > $c->offset + $c->length) { + $c->increase_length(); + } + } + } + + case "stream": + $o_pos = ftell($c->file)-strlen($c->buffer); + $o_offset = $c->offset; + + $c->reset($startpos = $o_pos + $o_offset); + + $e = 0; // ensure line breaks in front of the stream + if ($c->buffer[0] == chr(10) || $c->buffer[0] == chr(13)) + $e++; + if ($c->buffer[1] == chr(10) && $c->buffer[0] != chr(10)) + $e++; + + if ($this->actual_obj[1][1]['/Length'][0] == PDF_TYPE_OBJREF) { + // mPDF 5.0 Removed pass by reference =& + $tmp_c = new pdf_context($this->f); + $tmp_length = $this->pdf_resolve_object($tmp_c,$this->actual_obj[1][1]['/Length']); + $length = $tmp_length[1][1]; + } else { + $length = $this->actual_obj[1][1]['/Length'][1]; + } + + if ($length > 0) { + $c->reset($startpos+$e,$length); + $v = $c->buffer; + } else { + $v = ''; + } + $c->reset($startpos+$e+$length+9); // 9 = strlen("endstream") + + return array(PDF_TYPE_STREAM, $v); + + default : + if (is_numeric ($token)) { + // A numeric token. Make sure that + // it is not part of something else. + if (($tok2 = $this->pdf_read_token ($c)) !== false) { + if (is_numeric ($tok2)) { + + // Two numeric tokens in a row. + // In this case, we're probably in + // front of either an object reference + // or an object specification. + // Determine the case and return the data + if (($tok3 = $this->pdf_read_token ($c)) !== false) { + switch ($tok3) { + case 'obj' : + return array (PDF_TYPE_OBJDEC, (int) $token, (int) $tok2); + case 'R' : + return array (PDF_TYPE_OBJREF, (int) $token, (int) $tok2); + } + // If we get to this point, that numeric value up + // there was just a numeric value. Push the extra + // tokens back into the stack and return the value. + array_push ($c->stack, $tok3); + } + } + + array_push ($c->stack, $tok2); + } + + return array (PDF_TYPE_NUMERIC, $token); + } else { + + // Just a token. Return it. + return array (PDF_TYPE_TOKEN, $token); + } + + } + } + + /** + * Resolve an object + * + * @param object $c pdf_context + * @param array $obj_spec The object-data + * @param boolean $encapsulate Must set to true, cause the parsing and fpdi use this method only without this para + */ + function pdf_resolve_object(&$c, $obj_spec, $encapsulate = true) { + // Exit if we get invalid data + if (!is_array($obj_spec)) { + return false; + } + + if ($obj_spec[0] == PDF_TYPE_OBJREF) { + + // This is a reference, resolve it + if (isset($this->xref['xref'][$obj_spec[1]][$obj_spec[2]])) { + + // Save current file position + // This is needed if you want to resolve + // references while you're reading another object + // (e.g.: if you need to determine the length + // of a stream) + + $old_pos = ftell($c->file); + + // Reposition the file pointer and + // load the object header. + + $c->reset($this->xref['xref'][$obj_spec[1]][$obj_spec[2]]); + + $header = $this->pdf_read_value($c,null,true); + + if ($header[0] != PDF_TYPE_OBJDEC || $header[1] != $obj_spec[1] || $header[2] != $obj_spec[2]) { + // mPDF 4.0 + $this->success = false; + $this->errormsg = sprintf("Unable to find object ({$obj_spec[1]}, {$obj_spec[2]}) at expected location"); + return false; + } + + // If we're being asked to store all the information + // about the object, we add the object ID and generation + // number for later use + $this->actual_obj =& $result; + if ($encapsulate) { + $result = array ( + PDF_TYPE_OBJECT, + 'obj' => $obj_spec[1], + 'gen' => $obj_spec[2] + ); + } else { + $result = array(); + } + + // Now simply read the object data until + // we encounter an end-of-object marker + while(1) { + $value = $this->pdf_read_value($c); + if ($value === false || count($result) > 4) { + // in this case the parser coudn't find an endobj so we break here + break; + } + + if ($value[0] == PDF_TYPE_TOKEN && $value[1] === 'endobj') { + break; + } + + $result[] = $value; + } + + $c->reset($old_pos); + + if (isset($result[2][0]) && $result[2][0] == PDF_TYPE_STREAM) { + $result[0] = PDF_TYPE_STREAM; + } + + return $result; + } + } else { + return $obj_spec; + } + } + + + + /** + * Reads a token from the file + * + * @param object $c pdf_context + * @return mixed + */ + function pdf_read_token(&$c) + { + // If there is a token available + // on the stack, pop it out and + // return it. + + if (count($c->stack)) { + return array_pop($c->stack); + } + + // Strip away any whitespace + + do { + if (!$c->ensure_content()) { + return false; + } + $c->offset += _strspn($c->buffer, " \n\r\t", $c->offset); + } while ($c->offset >= $c->length - 1); + + // Get the first character in the stream + + $char = $c->buffer[$c->offset++]; + + switch ($char) { + + case '[' : + case ']' : + case '(' : + case ')' : + + // This is either an array or literal string + // delimiter, Return it + + return $char; + + case '<' : + case '>' : + + // This could either be a hex string or + // dictionary delimiter. Determine the + // appropriate case and return the token + + if ($c->buffer[$c->offset] == $char) { + if (!$c->ensure_content()) { + return false; + } + $c->offset++; + return $char . $char; + } else { + return $char; + } + + default : + + // This is "another" type of token (probably + // a dictionary entry or a numeric value) + // Find the end and return it. + + if (!$c->ensure_content()) { + return false; + } + + while(1) { + + // Determine the length of the token + + $pos = _strcspn($c->buffer, " []<>()\r\n\t/", $c->offset); + if ($c->offset + $pos <= $c->length - 1) { + break; + } else { + // If the script reaches this point, + // the token may span beyond the end + // of the current buffer. Therefore, + // we increase the size of the buffer + // and try again--just to be safe. + + $c->increase_length(); + } + } + + $result = substr($c->buffer, $c->offset - 1, $pos + 1); + + $c->offset += $pos; + return $result; + } + } + + +} + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/patterns/NOTES.txt b/application/third_party/mpdf/patterns/NOTES.txt new file mode 100644 index 0000000..89c9c57 --- /dev/null +++ b/application/third_party/mpdf/patterns/NOTES.txt @@ -0,0 +1,5 @@ +Alternative sources of Hyphenation programs or TEX files: + +OpenOffice: http://wiki.services.openoffice.org/wiki/Dictionaries + +Hyphenator4PHP- alternative PHP hyphenator scripts: http://apps.sourceforge.net/trac/hyphenator4php/ \ No newline at end of file diff --git a/application/third_party/mpdf/patterns/de.php b/application/third_party/mpdf/patterns/de.php new file mode 100644 index 0000000..01548ed --- /dev/null +++ b/application/third_party/mpdf/patterns/de.php @@ -0,0 +1,9 @@ +<?php +/* + Adapted from Hyphenator 1.0.2 + http://code.google.com/p/hyphenator/ +*/ + +$patterns="_a6 _ab3b _aben2 _ab5l _abo4 _ab3ol _ab1or _ab5r _ab3s2 _ack2 _ag4r _ag2u _ai2s _al3br _al2e _al5l4en _alt3s _amt6s3 _an3d _ang4 _an1gl _ang6li _an5go _angs4 _an3k _an3s _an4si_ _ans2p _an4tag _ap3s2 _ar3k2a _ar4m3ac _ar4s _ar4t3ei _as1t _as4ta _au3d _au4f5 _au4s1 _aus3p _\xc3\xa44 _\xc3\xa4t2s _b6 _bau1s _be1er _be3r2e _ber4g3a _ber4g3r _bi4o _boge2 _c2 _ch2 _che4f _d4 _da4r1 _dar3in _dar2m _da4te_ _da4tes _de4al _de1i _de3r4en _de1s _de3sk _de3s2t _di2a _do3b _do2mo _do1pe _d\xc3\xbc1b _e4 _ebe2 _ei3e2 _ei3k _ei4ne _ei5ner _ei5nes _ei4sp _ei4st _ei2tr _el2bi _els7t _em3m2 _en2 _end3er _en4d3r _en3du _enn2 _en3s _en4t3 _en5te_ _en3z _er4der _er1e _er1i _er8stein _es1p _es1ta _est4e _es1th _es3tr _et4s _eu3 _eu1c _f6 _fi3est _fi4le_ _fi4len _fin6s _fi2s _fs4 _fu2sc _g6 _ga4me _ga4t _gd2 _gel2d _gen4a _ge3nar _ge3ne _ge3r2a _ge3r2e _ge3s4a _ge1u _gus4s3 _h4 _ha3bi _haft5s _hal2s _hau4t1 _he2 _he3cke _he3ri _he6r5inn _he5xe _his1 _ho4met _i4 _ia4 _in3 _ink4 _inu3 _is2a _is2tr _jor5 _k6 _ka2b5l _ka2i _klan4 _ko3b _ks2 _k\xc3\xbc1b _l4 _le4ar _lo4g3in _lo3ver _m4 _ma3d _ma5ge _ma3la _ma4st _men8schw _mi2s _mi4t _n4 _n\xc3\xa4s3c _ne4s _nich2 _ni4e _nob4 _no6th _nus4 _o6 _oa3 _ob1a _obe2 _ob3l _oper4 _or2a _ort4 _orts3e _oste4 _os8t7ende _ost3r _ozo4 _\xc3\xb64 _p4 _pat4s _pf4 _ph2 _poka2 _pro1 _r4 _reb3s2 _re3cha _rein4t _reli1 _reli3e _re3sti _res4tr _ro6a _ro3be _ro2h _ro3m2a _rut2 _r\xc3\xbc1b _s6 _sch4 _sen5s _ser2u _se2t _si2e _sim3p4 _si4te _ski3e _spra2 _st6 _sto4re _t6 _ta5ge4s _ta3mi _ta2to _tehe3 _te3le _te4st _ti2s _to2n _to4ni _to4st _to2w _tri3es _tro4s _ts4 _tu3ra _tu3ri _u6 _uf2e2 _ul4mei _um3 _umo2 _un3d _un3g _uni4t _un3s _un5s4t _ur1 _urin4 _ur3o2m _uro2p _ut2a _ut3r _\xc3\xbc2 _v2 _ve4r _vol2 _voll3e _vo4r _w2 _wah6l _wa3re _we2 _weg3 _wi4e _wor2 _wor6t5en _x4 _xe1 _y4 _ya4l _z4 _zah4n _za4s _zi2e _zwe4 6a_ 2aa a1ab aa2be aa1c aa2gr aa4l\xc3\xb6 a1an aa2r1a aa3re aar3f4 aar3k4 aar3tr aas3t aat6s3 a3au a1\xc3\xa4 2aba ab1ar a2b1au ab1\xc3\xa4 1abbi 1abd a1be ab1eb abe1e abei3 ab1eil 2a3bel abe2la abe2na ab1erk ab1err ab1erz ab3esse 4abet 3abf 5abfa 1abg 1abh 2abi ab1ins ab1ir ab1iso ab1it 1abk ab3l 1a2b5la 3a2b5l\xc3\xa4 2able ab4le_ a3blis a2b7lu 3abn a2bo_ 1a2bon ab3r ab5re 1absc ab3s2i ab5sp abs4t6 ab7sta ab5st\xc3\xa4 ab3sz 1abtei 2a1bu ab3ur 2ab\xc3\xbc 1abw 2aby 1abz 2ac_ 4aca a1cem ach1a ach3ak a1chal ach3au a1che a2ch1e2c ach1ei a4ch3erf ach3erw a3ches a3chet 4achf a1chi ach5l ach3m a1cho ach1o4b ach3r achs2p acht1o 4a1chu ach1u2f ach3\xc3\xbc 4achv ach1w ac1in a1cka ack2en a3cki a4ckin ack3sl ack7sta4 acon4n 2acu a1\xc3\xa7 2a1d 4ad_ ada1b a4d1ac a2d1an 3ad5ap a3dar3 4adav 3a2d\xc3\xa4 3add adefi4 ad1ein ade1ra 4ades ade3s2p ades4s ade3st ade1u 4ad2i adi3en adi3er_ ad2ob a2dr 4ad3rec ad4res a3dro ad5ru ads2 ad3s\xc3\xa4 ad3sp ad3st ad4t1 adt3a adt5r 2ae a1e2b a1e2d a1ei a1el_ a2ela a2ele a2eli a1els a1em ae2o3 a1e2p ae1r aes1 a1e2x a2f1a a3fah a3fal af3an af2ar a3fat 2afe a2f1ec a2fent af1erl af4f3l 2a3fi af5l a3f2o af3ra af4rag af1rau af3r\xc3\xa4 af3re af3r\xc3\xb6 af3ru af2sp afs4t 2aft af2t1a af3tab af2tei af2t3r af4t5re af2tur 2a1g 4aga ag1a2b ag3a2d ag1ar ag1au ag2du a4gem a7gen_ age2na a4gent age2nu a5ger age4se age4s3p ages3s a4g5esse age4sti ag3gl 3aggr 4agi 5a2git 4a2g3l ag4lei ag7lo a3g4n a4g5na a5gnat ag6nu a2go a3gon_ a3gons a3gor a2g3re a2g3ri a3gru agsa2 ag4sam ag4set ag6s5p ag7spi ag3sta ag3ste ags3tr a2g1und 2ah_ 2a1ha 2a1he a2h1erh a1hi ahl5a4 ah2l1ei ah5len ah4l3erh ah3li ahl1o ah4l\xc3\xb6 ahl3sz ah3ma ah3me ah4n3a ah1os a2h1\xc3\xb6 ahr1a ah3r2e ah4rei ah1ri ahrta2 ahr4t3ag 2ahs aht3sp a1hu ah1w 2ai ai1a aib3l ai1er aif2 ai3g4 a3ik_ ai3ku ai2lo ai3n a1ind ain4e a3ing ain3sp ai4nu ai3o ai2sa a3isch_ ais2e ais3s a2it a3iv_ a3ivl a3ivs a1j aje4 2ak_ a2ka3d 2a3kam ak4at 2akb akbe4 2akc 2akd 4a1ke a2kef 2a1ki 2ak3l ak4li ak3n 2ako 2a1kr ak3rau 2aks 2akta ak3t2an 2aktb ak5ten 2aktm ak2t3r 2aktst 2a1ku 4a3k\xc3\xbc 1akz 2al al1ab al3abi al3abs a1lac ala5ch al3ade al1af ala6g al3age a3l4a1l al3am al5amp al1ana a1lanc al1ans al3anz a2lar a3lar_ al2arm ala4s al3asi al3ass a1lat al1au al3aug a1l\xc3\xa4 al1\xc3\xa4m al1\xc3\xa4r al4berh al4b3erw al2b3l al2boh al2br alb3ru alb3s al2da al2d\xc3\xa4 al3dri ald3s2t al3du 4ale 5a2l1e2b 5a2l1ef a4l1eh a2l1ei a2l1el a3len_ al3ends 6aler_ a2l1erb 5a2l1erf a2l1erh a2l1ert 5alerz a2l1esk ale4t al3eta al3eth a2l1eu 5alex alf2e 3algi al2gli 1algo 4ali a2lim ali4nal al1ins a2linv al2k1ar alk1l al2kla alk3s4 al2lab all1an al2l3a6r al2l1au al2lec 5allee al3lend alli5er_ alli7ers_ 3almb a2l1ob a3log al1ope al1\xc3\xb6 al2\xc3\xb6s 3alph al4schi al3sp al4spal al5s6terb al2ta alt1ak al3tam al2tel alt4ere al4t3erf 4alth al2tri 3alty a1lu al2uf a2lum al1ur a3lus 4aly 2am 4am2a amab4 ama3d ama5g 4ambiq am4e 6ame_ a2meb ame2n amer2 ame3ra a2meri ame3ru a4mese a5met a3mie a3mil amil5l 4a3mir ami3t2a ami5ti am4m\xc3\xa4 am2min ammu2 4amo 3a4m\xc3\xb6 ampf3a2 am3pr am2s am3sa am3str 3amt_ am2t1a am4t3ern am4th am2to am2t\xc3\xb6 am2t3r am4tre am2tu 4amu am3unt a1na 6ana_ ana3c a3na3d anadi1 2anan 4ana5s2 2anat an1\xc3\xa4s 4and_ ande4s an2d5r\xc3\xbc an2d1ur 4ane an1e4c an1ek 5a4n1erb an3eth anft5s 4ang_ 3angeb ang5erl ang5erz ang3l an2gla an2gl\xc3\xa4 an3go ang3ra 1angri 4angs_ ang5sc ang6s5po ang3str 3an3h 4anho 4a3n2i ani3els ani5ers_ 5a4nim a4n3ins 6anj an2kan an3k4l an4kl\xc3\xb6 an2k3no an2k1r ank3ra ank3r\xc3\xa4 ank5ti an2ky 1anl 3anli 4anmo 2ann 3an3n2a 3ann\xc3\xa4 an5ne an3od 2anom an1or a1n\xc3\xb6 3anr 3ans\xc3\xa4 1ansc an3s2en an2seu an2s1pa 1anspr an3s2t an5stei an3s2z 1ant\xc3\xa1 1antei 3antenn an3th 2anto 1antr an2tro 3antw 6anu a3nus a1n\xc3\xbc 1anw 3anw\xc3\xa4 2anx 2anz 3anzah 3anzei anz5erst an2z1i4n 3anzo 3anzu 3anz\xc3\xbc an2zwi ao1i a1op a1o4s5 a3ot_ 2ap_ 4a1pa a1p\xc3\xa4 a1pe a2pe_ ap2fa a3pfl a5ph\xc3\xa4 a1pi 2a2p3l ap2n apo5s ap3pl 2a1pr ap2sc 2apu 2ar_ 2a1ra ar2ab4 ara3d2 a2r3al ar1ans ar3anz 4arar a2r1au a1r\xc3\xa4 2arb_ 2arba ar2bau ar2bec arb3eie 2arben 2arbi ar2b5l 2arbr 2arbs2 arb3sp 2arbt 2arbu ar2b3un ar1c 2are a2rea are5b a2ref ar1eff a4reg a2rein a5ren a2rena a2rene ar2ent ar2erf a2r1erh are3u ar2ew 2arf ar2f3r ar2gl ar4gn 2arh 4a3ri ar2ia a4r1im a4r1ind a4r1int a5riu ar3kad ar2k1ar ark3aue ar2kl ark1r ar2kra ar2kr\xc3\xa4 ar6kri ark3sa ar2les arma5g arm2\xc3\xa4 3armee arm3erk 2arn ar2nan ar5n2e 2a1ro ar1ob ar3o2d a3rol a2rop a2ror 2arp ar4p3f 4arren ar2rh arr3he 4arrt 2ar2s ar4schl ar4schr ar5se ar3s2h ar3su ar2tau art2ho 2arto ar2t3r 2arts 2a1ru a4r1u4f ar3\xc3\xbc 2arv 2a1ry ar2z\xc3\xa4 2arze 1arzt ar2z1w 2as as4al as1au as3aug a2s1\xc3\xa4 6asc a6sca a4schec a2sch3l a2schm 6as2e a2seb aseli5 a2s3e2m a3ses 6ash as2hi a5si_ as3m as1o2f a3sol a3som as1or a2s1\xc3\xb6 a2s1p as3pan as5pe a4s2ph as3pi a4spl as2po as3s2a as5sac as4sei as5s2i as2s1p as2st as4sti as4sto as3str a2st a4s1ta a5s4tas as2tau as3te as3ti ast3rau as4t3re a2s\xc3\xbc 3asyl a1\xc3\x9f a\xc3\x9fe4 a\xc3\x9fen1 2a1t 4ata at1a2be at2a1f at4ag ata3go a4t1akt ata1la at1apf ata3s a2t3au2 a2t1\xc3\xa4 at2c 4a3te a4teb at2en aters4 ater3st a4tew 4atf 4atg at2he 5athl a4thr 4a3ti at1int 3atm 4atmus ato4man at1ort 4atp 4atr atra6t at3r\xc3\xa4 at3re at2s at3sc at4set ats1p 5attac at2t1ak att3ang atta3s at2tei at5th\xc3\xa4 at4t3r\xc3\xa4 4atu atu4n atu4rer at3w 4atz atz1a atz3erk at4z3erw at2z1in atzt2 atz3th a2u 2au_ au3a2 2aub au2bl 2auc auch4se auch3ta 2aud au3di au2dr 2aue aue2b aue3re au5erein aue4s au3et au2fa auf1an auf1er au5fer_ au4ferl 3aufn 2aug au5g6e 4au1i au3in au2is 4auj au2kl 2aul aule6s aul3ese aul4s au3l\xc3\xbc 4aum au2mal au2mer au2m1o aum3p2 6au3n2 au1na aun3s a4unz au1o aup4ter 2au1r4 au3re ausan8ne_ au2sau 2au2sc au3schl au3schw aus3erp au4s3erw au2so au2s1p aus3s6 3aussag aus4se_ au2st aus3tri 2aut_ au2ta au3tan au2t\xc3\xa4 2aute aut5erkr 3auto aut2o3f 2auts 2aux auz2w 2a1v av4a a2vr 2a1w awi3e a1x ax4a ax5an ax2e 2a1ya a1yeu ays2 aysi1e ay1ste 2a1z az4a a3z2i az2u \xc3\xa41a \xc3\xa43am \xc3\xa41b \xc3\xa42b3l \xc3\xa4b2s \xc3\xa41che \xc3\xa4che1e \xc3\xa41chi \xc3\xa4ch3l \xc3\xa42chr \xc3\xa4ch2sp \xc3\xa4ch4st \xc3\xa41chu \xc3\xa41ck \xc3\xa4ck4e \xc3\xa41d \xc3\xa43di \xc3\xa44d1ia \xc3\xa43do \xc3\xa42d3r 2\xc3\xa43e \xc3\xa4f2fl \xc3\xa4f5l \xc3\xa4f3r \xc3\xa4f2s \xc3\xa4ft4s3 \xc3\xa41g \xc3\xa4ge1i \xc3\xa4ges4 \xc3\xa42g3l \xc3\xa4g2n \xc3\xa44g3na \xc3\xa42g3r \xc3\xa4g3s2tr 1\xc3\xa42gy \xc3\xa4h1a 2\xc3\xa43he \xc3\xa41hi \xc3\xa4h5l2e \xc3\xa4h3li \xc3\xa4h5ne \xc3\xa4h5ri 2\xc3\xa4hs 2\xc3\xa4ht4 \xc3\xa4h3tr \xc3\xa41hu \xc3\xa4h1w \xc3\xa41im \xc3\xa43isch_ \xc3\xa41j \xc3\xa41k \xc3\xa42k3l \xc3\xa42k3r \xc3\xa41la \xc3\xa4lbe2 \xc3\xa4l2bl \xc3\xa4le3ru \xc3\xa4l2p3 \xc3\xa4l2s \xc3\xa4l3se \xc3\xa4lt4e \xc3\xa41lu \xc3\xa43me \xc3\xa4mi3en 2\xc3\xa4ml 2\xc3\xa4n_ \xc3\xa41na \xc3\xa4n2dr 2\xc3\xa43ne \xc3\xa4ne2n1 \xc3\xa4n2f5 \xc3\xa4n2gl \xc3\xa4n2gr 2\xc3\xa43n2i \xc3\xa4n5k2e \xc3\xa4n2k3l \xc3\xa4n2kr \xc3\xa4nk2s 2\xc3\xa4nn \xc3\xa4n5n4e2 2\xc3\xa4ns \xc3\xa4n4s3c \xc3\xa4nse3h \xc3\xa41on \xc3\xa41pa \xc3\xa4p2pr \xc3\xa4p2st 1\xc3\xa4q \xc3\xa42r5a2 \xc3\xa4r1\xc3\xa4 \xc3\xa4r1c 2\xc3\xa4re \xc3\xa42r1ei \xc3\xa4re2n \xc3\xa42r3ene \xc3\xa4rg5l \xc3\xa4r2gr \xc3\xa41ri \xc3\xa4r1int \xc3\xa4r2k3l \xc3\xa4rk2s \xc3\xa4r3me \xc3\xa4r1o2 \xc3\xa41r\xc3\xb6 \xc3\xa4r2s \xc3\xa4rt4e \xc3\xa4rt2s3 \xc3\xa41ru \xc3\xa4r2z1w \xc3\xa4s2a \xc3\xa4s2e \xc3\xa4se3g \xc3\xa4se3ri \xc3\xa4skop2 \xc3\xa43s2kr \xc3\xa42s1p \xc3\xa4s6s3c \xc3\xa4s4s3erk \xc3\xa4s2st \xc3\xa44s3t \xc3\xa4s5ti \xc3\xa4s4tr \xc3\xa41\xc3\x9f 2\xc3\xa4t \xc3\xa4t1a2 \xc3\xa45te \xc3\xa4te1i \xc3\xa4te2n \xc3\xa4t2ha \xc3\xa41to \xc3\xa4t1ob \xc3\xa4t1r \xc3\xa4t3ro \xc3\xa4t2s\xc3\xa4 \xc3\xa4t4schl \xc3\xa4t4schr \xc3\xa4t2s1i \xc3\xa4ts3l \xc3\xa4t3so \xc3\xa4t4sof \xc3\xa4t2s1p \xc3\xa4t4st \xc3\xa4ts3te \xc3\xa4t2tr \xc3\xa43tu \xc3\xa4t3v \xc3\xa42u \xc3\xa4u2br \xc3\xa4u1c \xc3\xa4u3el \xc3\xa44uf \xc3\xa4uf2e \xc3\xa4ug3l 2\xc3\xa4ul 2\xc3\xa4um \xc3\xa4u2ma \xc3\xa4um2s \xc3\xa4un2 \xc3\xa4u3nu 2\xc3\xa4u5r 2\xc3\xa43us_ \xc3\xa4u2sc \xc3\xa4u6sch\xc3\xa4 \xc3\xa4u4schm \xc3\xa4u5se \xc3\xa43usk \xc3\xa43usn \xc3\xa4u4sp 1\xc3\xa4u\xc3\x9f \xc3\xa4u2tr \xc3\xa41v 1\xc3\xa4x \xc3\xa41z \xc3\xa21t \xc3\xa11n 4b_ 1ba b1abs ba1cha bach5t4e backs4 2b3adr 3bah bah2nu bah5re bais4 b2ak ba2ka ba2k3er ba2k1i ba2kra 3bal ba1la bal6lerg bal3th 2b3am ban2a 3b2and ban2dr ba3n4e ba5ner 2bang ban2k1a ban4kl 2banl 2b1ans b3anz ba2ran bar3b b2ard bar3de ba2rei bar3ins b2arr bar3zw 3bas ba5sa ba4st ba2to bau3b bau1fr bau3g 3b2auk 3baur bau3s bau1s2k ba1yo 3b2\xc3\xa41c b\xc3\xa45cke 1b\xc3\xa4e 1b2\xc3\xa4r 1b2\xc3\xa4s b1\xc3\xa4ug b\xc3\xa4u3s 4b1b b5ba b5bi b2bli bb3lin b3blo b3bl\xc3\xb6 bbru2c bb2s bbu1 2b3c 2b5d bde1st bdo3 bdu3s 1be_ 5be3a be5an be4at_ be4au_ b2ebe 1be1c be2del bedi4 be1eh be3eta be3g6 2beier bei1f beil2 bei3la 3b2ein bei5na be1ind be1in2h bei3sc beis2e bei3st beit2s1 be3las be3lei be2l1en be2let be3li bel3la bel3sp belt4 bel3ta bel3tr be5lu 1bem 1ben_ be1na be2nal be2nau ben2dr be3ne be4ners be3ni ben2se ben2sp ben2su 3b2enti b1ents ben1un ben5z4 ben3ze be1o be1ra ber3am be2ran ber3as ber1\xc3\xa4 berd4 bere4s ber3esc ber4in_ ber3iss ber3na b1ernt be1rop ber3sta ber3th be3rum 1be1s2 be3sa be4s3er be3slo be3spo bes5s4e b3esst_ bes3sz 3bet be3th be1ur 3bew 2b1ex 1bez 2b5f4 bfal2 2b5g4 bge3 bges4 2b5h 1bi bi2e bi3ens bi3ent bie2s bi2ke_ bi2kes bi3ki bil4a 2b1illu bi1l\xc3\xb6 bi2lu bi1na 2b1inb bin2e 2b1inf 2b3int bi2o bi3on biri1 3bis bi5se bi2sol bis4s3c bi4st bi2t b2i3ta bi3te bi3to 2bi4tu b2i5tus biz2 bi3za 4b3j 2b5k4 b2l2 2bl_ b4la_ bla3b6 4b3lad b3lag b6lanc 6blasser b6latt bl\xc3\xa4s3c 3blea b3lee 2b5leg b3leh b5lein ble3l b4lem b4ler b5lese 3b4let 2blich 3blick b5lief 2b3lis 3blitz 1b4lo b6loc b5lok 2b3lun blu4ter 3bl\xc3\xbc 2b5m bmu2 6b5n2 bni2s1 1bo bo5as bo2b3l bo3b4r bo2c bo3ch bo3cke bo3d2 bo2e3i 2b3of bo1is bo2lan 3bon_ bon2d1e bo2ne 3bons b1op bo1r2a bor2d3i bo2rei bor2s b1ort bor4tei bor2t3r bo2sc bos5p 3bot bo3te bo3th bour4n b\xc3\xb62b3 2b3\xc3\xb6f b\xc3\xb63sc 2b3p2 bpa4g b1q b2r4 2br_ b4ra_ 2b3rad b6rah b6ra3k bra3st4 2bre_ 6brechte 2b3ref 2breg b3reif b3rek 2b3rep b6rer b6res b4ri 2b5riem bri2er 2b5rig b5ris b5roh 2b3rol b4ruc 4b1s b2s3ad b3sand bs1ang b5sat2 bsatz1 b5sc b7scha bs4cu b3se b5se_ bs1e2b b5sel b5sen bs1er b4serf b5ses b5set bs1ex b2s1of bs1op bso2r bs2pl b3spu bs5s2 bs2t bst1ac bst1ak bst3auf bs3t\xc3\xa4t bst1er bst1h b3sto b3stu b3st\xc3\xbc bs3ty b2s1un b3s\xc3\xbc bs2ze 4b1t b3ta btast3r b3t\xc3\xa4 b5te b2t1h b3to b3tr b3tu bt\xc3\xbc1 b2u bu2chi bu2e bu2f 3bui bul2la 2b3umk bu3na 2bunk b4urg bu3r4i bu2s bus3cha bu3se bu4s1er bu4s3p bus1u bu3\xc3\x9fe 1b2\xc3\xbc b\xc3\xbc1c b\xc3\xbcge2 b\xc3\xbcgel3e 2b3v 2b5w 1by by1a by1n by3p by4t 2b5z2 bzei2t1 2c_ 1c4a 2ca1b ca1ch cae3 3caf ca3g4 ca1h 3cal ca1la cal3t 3cam 3car car3n ca3s2a3 ca3th ca1y2 c\xc3\xa43 4c1c cch2 4cd c1do 1ceb 2cec ce2dr 2cef ce1i 1cen ce3nu 1cer ce1ro ce1st 1cet ce3ta ce3ty ce1u 1c\xc3\xa9 2c1f c2h 4ch_ 2chab ch3abi ch1ah ch1ak 5chanc ch3anst 4chanz 3chao ch1ap 4char_ ch5atm 3chato ch1\xc3\xa4rm ch1\xc3\xa4s 1ch\xc3\xa2 2chb 2chc 2chd che4be ch3eben ch3echt 3chef 4chei ch1eim 4chentw che3rei 2cher\xc3\xb6 ch1ess ch1ex 1ch\xc3\xa9 2chf 2chg 2chh 1chia ch1inf 2ch1inh ch1ins ch1int 2ch1inv 3chiru 2chj 2chk 2ch2l2 ch3lein 2ch2m ch4mu 2chn4 ch2na ch5ner 2chob cho2f ch1off ch1oh ch1orc 2chp ch2r2 2chre ch3rh 3chron 4chs 4cht 2chuf 2chuh 2chum 2chunt 4ch\xc3\xbc 2chv 2chw 2chz 1ci ci1c ci2s c1j c4k 4ck_ ck1a 3cka_ ck3aa 2ckac 2ck3al ck5am 2ck3an 2ckau ck1\xc3\xa4 4ckb 2ckc 2ckd 1cke 3cked 2ck1ei 3cken ck1ent cke2ra ck1erh 4ckerh\xc3\xb6 4ck3erle 2ckero 2ck1err 2ckese 2ckex 4ckf 2ckg 2ckh 1cki 2ck1id ck1im ck1in 2ckk 2ck3l 2ckm 2ck3n 2ck1o2 ck1\xc3\xb6 2ckp 2ck5r 4cks 4ckt ck5t2e ck3ther 1cku 2ck1um5 2ck1up 2ckv 4ckw 1cky 4ckz 3c4l2 cla1q clet4 clo1 c2m 3co2 co3b co3ch co3cke co4det co3di coi2 co3it co3la co5l2o co3ma co3mec com4te_ comtes4 co3mu con2n co3ra co4re co3ri co4te co3th co3v c\xc3\xb44 2c2p 2c1q c4r2 cry2 2c2s cst4 c3s2tr 2c1t cte3e c3ti4 c3to ctur6 3cu cu2p3 cussi4 1cy 2c1z 4d_ 3da_ da1a 2dab d2ab\xc3\xa4 da2ben 3d2a1b4l 3dac da2cho 4dachse da2de da3der da3dr da1er 2d1af d3ag dago3 da3gob da1ho da1is da1l4a 2d3alar dal3b4 da1l\xc3\xb6 2d3alt 2d3amma 2d3amm\xc3\xa4 damo3 d4amp 2d3amt d2an_ dan4ce_ 2d1and 2d1ang 3dank dan4kl dan5kla dan4k1o 2danl 4d1ans 2danw 3danz_ 4danzi 2d1ap d2aph da2r dar3a 2darb6 da3re 3d2arl 2darr dar3s 2dart d2arte d2arw das2 da3sh da5st 3dat date4 4d3atl 4datm 3dau3e4 2d1au2f 2d1aus 2d1\xc3\xa4h 2d1\xc3\xa4mt 2d1\xc3\xa4ng 2d1\xc3\xa4p d\xc3\xa43us 2d7b6 dbu2 2d1c 4d1d2 d3da d3de d3dh 1de de3an de5a4t de3b6 3de1c de2cka de1e2 d1eff deg4 de3gl dehe2 2d1ehr 2dei d2eic 3d2e1im de4l1\xc3\xa4n de2l1ec de3l2ei 2delem de2len 2d1elfm del4la del4lei de2l1o de3lor de2l\xc3\xb6 del4san del2s5e del2so del2s1p del5ster delt4 del3ta del3tr 2d1emp d2en_ de2nal de4n3end 4denerg den4k3li den3sc 4densem dens5tau den5th 2dentw de1on d4er_ de1ram de2r3ap der2bl 2derdb de2r1e2b der3eck de2rei de3reis de3r4erb der4erw 4d3erh\xc3\xb6h de5ric de3rik 4d3erkl\xc3\xa4 de1ro de2rop d3ersat dert2s de3ru de4ruh de4rum de2s de4s3a desa2g des1\xc3\xa4 3desc de4seh de4sei des3eil de4s3en de4s3et des1in des1or des1p des3s4 des5sen dest5alt de5stang de4sto dest5rat de3stri des1u 3det deten4t 4d3etw de1un de1us 2dexp 2d3f dfi2s 2d1g dga2 d4ge_ dge6t1e dge2tr d3gl 2d1h2 d2his 1di 3di_ di4a di5as di4\xc3\xa4 di1ce 2d1i2de di2e die3ner di3eni dien4s di3ens_ dienst5r di3ers_ die4s3c die2t5 3dig di3gn dil2s3 2d1imb di1n2a 2d1ind 2d1inf 2d1inh 2d1init 2d1ins 2d1int di2ob di3o2d di3ph di2ra di4re_ di2ren di2ris 2d1irl 2d1isr dist4 di4ste di2ta di3te di4tei di4t3erl di4t3erm di4t3ers di2t3r di2tu diz2 di3zi 2d1j 2d1k4 4d1l d3le dle2r3a 2d1m d3me 4d1n2 d3ne d3ni2 dnis1 3do_ 2dob 3doba d1o2be 3dobr 3doby do2c 3dog do3ha dol3l2 3dom do2mar do3n4a doni1e do2o 4d1opf 3dopo d2opp do3ra 4d1orc 2d1ord dor2f1a dor2fl dor2fr 4d1org 2d1ort d2os_ do3sp dos3s do4sta 3dot do3un do1y2 2d\xc3\xb6 d1\xc3\xb6f d1\xc3\xb6l1 3d\xc3\xb6r d\xc3\xb64s3c 2d3p2 2d1q d2r2 3d4ra_ 2d3rad drag4 d4rah 2d5rahm 3d4ram d3rand 2drat d3raub 3drauf d3raum 2d3r\xc3\xa4d 2d3r\xc3\xa4t 2d3r\xc3\xa4u 4dre_ d4rea d5real d4reck 3dreh 2d3reic 3d4rein drei3t d4reiv 4drem 4d3ren 2d3rep 4d3rer dre2s3t 2d3rh d4ria 2d3ric d3rieg d4rif 3d4rit 4dritu 2drob 2d3roc 2d3rod 3droh 2drol 2d3rot 2d3rov 2dr\xc3\xb6 3d4ru d5rub 4d5ruf 4d5ruh 4d5rut d4r\xc3\xbc dr\xc3\xbc1b dr\xc3\xbc5cke 2ds d4s1amt d2s3an d2s1au2 d2s1\xc3\xa4n d2s1e2b d5s4eig d2sein d2s1eng d2s1ent d2s1erf d2serh d2s1erk d2s1erz dse4t d4s3eta d3s2ha ds3han d3sho d2s1im ds2inf d3s2kan 4dsl d2s1op dso2r ds1ori d2s\xc3\xb6 d2s1par d2s1pas d2s1p\xc3\xa4 d3s2po d4spro dss2 dst2 d2s1tab d4s3t\xc3\xa4ti d5stell d3s4tern ds1th d3s2ti d4st\xc3\xb6c d5stre ds2tri d1s2tu ds1ums d2sun d1sy ds2zen 2dt d1ta dt3a2d dt3am d1t\xc3\xa4 d5tea d2thei d3ti d1to4 d1t\xc3\xb6 dt3r dtran2 dt3sa dt5sc dt5str dt3t d1t\xc3\xbc1 1du du3alv du1ar du2b3l du3e du2f 2d1ufe 2d1uh du1i 2dumd 2dumf 2dumg 4d3umk 2duml d2ump 2dumr 2d1ums 3d2ums_ 2d1umv dun3d 2d1unf dun2kl dun2st 2dunt du1os dur2 2d1url du2s du3scha du3se 3d\xc3\xbcf 3d\xc3\xbcn 3d\xc3\xbcr d\xc3\xbcrn3 2d1v2 2d1w dwa4 dwes4 dwest1 dy1 2d1z 4e_ 2e1a e5a2b ea2c eadli4 ea3g6 ea4ge eakt4 e3al_ e3alb e5alei e3alf e3alg e3al3k e3all e3aln e3alp e3als e3alta e3alv e3alw e3alz e3am eam3a e4ame eam5ti e4ano e3anz e2ap e3ar_ e3a2ra e3arb eare2 e3a6rene e3arm e3arp e3arsp e3art e3at_ e4atl e4at3s2 eat5t4 eatu4 e3auf e3aug e3\xc3\xa44 e1b 2eba e3bak ebe2i e3beng eben4s5e 2ebet eb4leu e3blie eb5lo eb2o eb\xc3\xb64s 2ebr e3b4ra eb4rea eb2s ebs1au eb3s\xc3\xa4 eb6sche eb4se ebs1i ebs3in ebs1o ebs1p ebs3pa ebs3t2h eb3str ebs1u e3bu eb3\xc3\xbcb 2e5ca e1ce ech1\xc3\xa4 2e3che ech1ei e1chi ech3l ech3m ech3n e2cho_ ech1o4b e2ch3r ech3ta ech3t4ei e1chu ech1uh ech1w eci6a e1cka eck2ar eck3se 2ecl e5cr ecs1 2ect e1d ed4am ed2dr ed4e e3dei ede3n2e eden2s ede2r ed4ge e3d2o e3d\xc3\xb6 ed2s1o ed2s1p ed2s1tr ed2su e3dy 6ee ee5a2 eeb4l ee1c ee2ce eed3a eede3 eed3s2 ee1e ee3ei e1eff e1ei eei4g ee1im ee3ing eel2e e1e2lek ee3len e1emp e1en e2en\xc3\xa4 e3end e3eng ee3ni e2eno e3ent e2e1ra e1erd ee3r2e ee4r3eng eere4s ee4ret e1erm e2e1ro ee1r2\xc3\xb6 e1ertr e1erz ees2 ee3sh ee3st ee2tat ee2th ee1u2 eewa4r e1e2x e1f 2ef_ 2efa e3fab ef3ad ef1ana ef1ank ef1aus ef1\xc3\xa4u 2efe e2f1e2b e2f1em e2fent ef2er 2eff_ 1effi ef2fl ef2fr 2e3fi e4f1i2d e4f1ins efi2s 1efku 2efl ef7l\xc3\xa4n 2e3f2o e3f4ra ef3rea ef4rie ef3rom ef3rot ef3so ef2tan ef1um e1g eg3ast eg1aus eg1d ege4n3a2 ege2ra ege1u eg3lo eg3lu eg5n eg3ni egs4pe egs2t6 eg1ste eg4sto 2e3gu egus3 e1ha eh1ach eh3aka e3hal eh1ap eh2aus e1h\xc3\xa4 e1he ehe3in ehen2t3 1e2hep ehe1ra eher4an ehe3str e3h2i eh3int eh1lam eh1l\xc3\xa4 ehl2e2 ehl3ein ehl3ent eh5ler eh3lo ehl2se eh3ma eh3mi eh3mu eh1na e3ho e5hol ehr1a ehr1\xc3\xa4 ehr1e2c eh4rei eh1ri eh1ro ehr1ob ehr5sch ehs2 eh3sh eh3sp e1hu e2hunt e1h\xc3\xbc eh3\xc3\xbcb e3h\xc3\xbct eh1w e1hy 2ei_ 2ei3a2 4eib ei2bl ei2cho eich5te e2id ei2d1a ei3de 2eidn ei1e ei3el 2eien eien3st ei3et 1eifr ei3g2a eig6e ei5gen ei5ger 2eigew ei3gl 1eig3n 2eigru 2eigt 2eigu ei3k2a ei3kla 2eil_ 2eilb eil3d eile2n1 eil3f6 eil2i eil3ins 2eiln eim3ag ei2mor e1imp ei4mun ei2n3a ei4nas ein3dr 2eindu ei5ne_ ein1g ein2i e1init ein3k ein6karn 3einna ein1ob 3einsat ei3o2 ei3p eip2p5 2eir ei3re e1irr e2is_ ei2sa ei2s\xc3\xa4 ei3so ei3sp eis2pe ei3sto ei2sum ei2t1a ei3tak 2eit\xc3\xa4 eit1h eit2sp eit3t ei4t3um 2eiu 2e1j e1k e3k2a 1ekd eke2 e3ke_ eke3ri e3kes e3key ek4l ek5lip e3k4n e3k2o ek1s eks4t 2ekt ekt3erf ekt3erg ek4t3erz e3k2w e1la el3a4ben el1af el5agi ela2h el1aho e2l1ak el3a2m el1ans e2lant e2l3anz el1ap e2l1ar ela4s el3asi el3asp e3law 2e1l\xc3\xa4 el2da el4d3erp eld5erst eld3erw el3des el3dr elds2 elea4 ele4c 2elei e3leie e6l5eier_ el3eig e2l1ein e4l3einh e2l1el 1e2lem e3lem_ 2e3len_ e2l1ent e3ler_ e2l1erd e2l1erg e4l3ern\xc3\xa4 e2lerr e3let_ e2l3eta e3lex elf4l elgi5er_ elgi5ers e2lim eli4ne el1ita elk4l el3l2an ell3\xc3\xa4nd el5le_ el2l1e2b el4l3ein el3len el3lin ell3sp 2eln 2elo el1of e2l1or elo2ri e3los e1l\xc3\xb6 el2ser el2spr els6tern el2su el2ta el3tak elt3erb el4t3in el2to el2t3r el3tri el3tro elts2 elt3sk elt3sp 2e1lu e7luc el1ur elu2s el1use e1l\xc3\xbc e2lya 2elz el3zwe 2ema e2m3ag ema2k e3mann em1ans e2m1arc e5m\xc3\xa4 em4d3a2 2eme eme2n emen4t3h e2m1erw eme2s em1im em1int emi5ti 2emm emma3u em2mei e3mon e2mop emo5s 3empf em3pfl em2p3le em2sa em5se em3spo em2spr emt2 em3th 2em\xc3\xbc 4ena_ ena2b e1nac enadi4 4enah e2nak en3al ena3l2i en3am en5ana e2nand e3nann en3anz en1ap e2nar en3arr 4enat e3nati en3att e1naue en3auf e2n\xc3\xa4 e3n\xc3\xa4c en1\xc3\xa4r en1\xc3\xa4u en2ce_ en3del end3ess en3do end4ort end3ras end7si end3s2p end3sz en3d2um 2ene e3ne4c en1ech e2nef en1ehr e4nein e2n1el e4nelt e2n3ema 4enen e4n1ent en1epo 4e3n4er_ e4n1erd 3e4nerg e4n3erh 4eneri e2nerk e2n1erl 4enern en3erne ene2ro 4en1ers e4nerst e2n3ert e2n3eru e4n1erw en3erwe en3erz e4n3ess en3eta en3eth en1eup e4nex en3fa en3ga 1engad 1engag en3gi 1engp eng5sc en3gue 2eni e4n1id e5nie eni3er_ eni5ers_ e5nik e2n1im e5nis e3nit enks2 en3k2\xc3\xbc 1enniu en1ob enob4le e2n3oh e3nol eno2ma en1on e2n1op en1o2r e3not e3now 2e1n\xc3\xb6 4enpe en2san en3sec 1ensem ens3eng en3sho en2sid en3s2po enst5alt en4s3t\xc3\xa4t 4ensto ent4ag 1entd ente2n en6t5erb 1entla 1entna 1entsp 1entw 1entz e2n1uf e2n1um e4nums en1unf en1ur e3nus 2enut e1n\xc3\xbc 4enw\xc3\xbc e1ny en4z3erf enz3erg enz3ert en3z2i e1\xc3\xb1 eo5a e1o2b1 eo3ben eo3bi e1of eo3g e1oh e1on_ eo3na e1ond e1onf e1onl e1onr e1ons e1ope e3opf eop2t e1or e3or_ e3ord e3ort eo3s4 e3os_ eo1st eo3u e1o2v e1\xc3\xb62 e1p e3pa epa4g e3p2f4 ep2pa ep4pl ep2pr ept2 ep3ta ep4tal ep5ti 2e1q er1a e5ra_ era2be e1rabi er3abs er3abt e3rad_ er3adm er3adr era3f4a era1fr era2g er5agi e1rai er3aic e2rak er3akr e3rald er3all er3ana er3and e3rane e1rap er3apf er3ar e3rari e1ras e2r3a4si era2\xc3\x9f e2r5atm e1raub er3aue er3aug e1raum e1raz 2e1r\xc3\xa4 e3r\xc3\xa4d er1\xc3\xa4h er1\xc3\xa4m er3\xc3\xa4tz erb2e er3br er3bu er1c erd3anz 1erdb erd3erw er4d3inn 2ere 4e5re_ e3rech er3echs ere4ck er1eff er1e2h 4e3rei_ e3reie er1eig e3reih e2rein er3eis_ ere2l e2r1ele e3rem e5rem_ er3emu 4e5ren_ e5rena e4rense e4r3entf e3reo 4e5rer_ e4r3erf e2r1erh e2rerk er1err er1ers e4rersc e2r1erw 4eres e5res_ er1ess er3e4ti er1eul ere3us 4erf\xc3\xbcr 3ergebn 4ergeh\xc3\xa4 4erget erg3ise er3gl erg3s2 e2r3h 3erhab 2erh\xc3\xbc 4e1ri e2riat e3rib e3rie eri5e4n1 erien5e e5rif erik4 e3rin_ er1ind e4r1ini er1ink er1ins er1int e3rio er1ita erk5te erk5tr 4erlag er3le 4erln erm2a erm3ers er2n1os e1ro_ er3oa er1ob er1of e1rog e2r1oh ero2l e3role er3oly e1rom e5ron er1o2p e4ro2r e1ros e1rou e1row er1\xc3\xb62 er\xc3\xb64d e1r\xc3\xb6h 2er\xc3\xb6k er5p 2err\xc3\xbc er3s2a ers2e er5sen ers3ers er3sk er3smo er3sn er5s4to er3ta er3t\xc3\xa4 er6terei er4tho 4erti ert3ins er3t2o 2e1ru er1uhr er1um er1uns e3rus er1uz e1r\xc3\xbc er3\xc3\xbc2b e5r\xc3\xbcg 3erweck 4erweis e1ry 2erzy e5saa e4s3ab es3ad es3ak e5s4as esa2t es3aus es3av e4s1\xc3\xa42c e3sc es3cap e5s4ce esch4 e6schan e4scu e3se e5se_ e4seb es1ebe es3ehr es3ein es3erz es3eva 2esf 6es3h es1il es1imm es1ini e3sir es3k es5ke es5ki es5kor e4s5ky es3l es4log es3m e3sof e3sol es1op es1ori es2ort es6pei e3s2pek e3s2por e5s4pra 2esr es5sac es3sc es5sec 6essem ess4e3re es4s3erg es2sof es2sp ess1pa es2st ess3tie es3str est1ak e3star es2tau e3stec est5eink e3stel est3erh es4t3ess e1stil est3o4ri es2tri es2tu es3tus e3st\xc3\xbc e2s1um es3umf es3ums es3w e3sy es3z e1\xc3\x9f e\xc3\x9fer2 e\xc3\x9fe3re 2et e1ta eta3b et4ag et3am et4at e1t\xc3\xa4 et1\xc3\xa4h e3te e5te_ et1ein e5t2en etend4 e1t2h et3hai et3hal et3h\xc3\xa4 et3h\xc3\xbc e3ti e4t1i2m e3to eto4b e4t1of eto4s e1t\xc3\xb6 4e1tr et3rah e4t3raum et3rec et3res et4ri et2s et3sc et5schu etsch5wu et3se et3so et3sp ets3t et3sto et3s4tr et2ta et4t3au et2tei ette4n1 ett1h et4t3r et1ups e1t\xc3\xbc etz1a et3zo eu1a eub4 eude3s eu3erei eu3err eu3erz eu2esc eu2g1a euge4n eug6er eugs4 euho2 euil4 eu1in3 eu2k\xc3\xa4 e1um e3um_ eu3ma e3uml e3um4s eums1p eum5st 2eun eu3n2e eu4nei e3ung eu4nio eun3k eu1o2 eu3p eu2rau eu3r2e 1eu3ro e4ust 2eut eu5te eut6schn 2eux eu2zw e3\xc3\xbc 2e1v 4eve e2vela e1w 2e3wa ewa3s e3w\xc3\xa4 2ewe e2we_ ew3et_ ewi2s e3wit e5wo ew2s 4ex_ 1exam 1e6xem e4x1er 3exp ex2tin 2exu 4ey e1z e3z2a ez2\xc3\xa4 ezen3 ezin4 ezi2s \xc3\xa91b \xc3\xa91c \xc3\xa91h \xc3\xa91l \xc3\xa9lu2 \xc3\xa91o \xc3\xa91p \xc3\xa91r \xc3\xa91t \xc3\xa91u4 \xc3\xa91v \xc3\xa91z2 \xc3\x8b1c \xc3\x8b1m \xc3\x8b1n \xc3\xaa1p \xc3\xaa4t 6f_ 1fa 3fa_ fa1b f2abr 3fac fa2ch3i fa2cho 2fad fa2da fade4s 3fa1e fa3fa fa3g f2ah fa1la fal6l5erk fal2s fal3te falt4s fal2z1 2fanb 2fanr 2fanw 2f3anz 2f1ap farr3s 3f2art f1arz 3fas fa3s2a fa3sh 2fat 2f1auf f3aug 3fav 1f\xc3\xa4 f\xc3\xa41c f\xc3\xa4h2r1u 2f1\xc3\xa4rm f1\xc3\xa4rz 2f\xc3\xa4u 2f1b4 2f1c 2f1d f3dr 1fe 3fe_ fe4c fe5che fe2dr fe2ei fe1em f4eie 2feinh fei2nu 2feinw fek2ta fe2l1a fel4dr f1e2lek fe2l1er fe2l1es fe2l1o fel4soh fel3to 3f2em_ 2femi fem4me_ fen3a fe4n\xc3\xa4 3fend fe2no fenst2 f1ent f2er_ fe1r2a fe4rang fe4ranz fe2r3au 3ferei fer3eis fer2er fer3erz f1erfa f2ern 4f3erneu fe1ro f4erpa f2ers_ f2ert f1erw 3fe2s fe4st1a fes3tat fest3ei 4f3e4ta fet4t1a 2f3ex 3f\xc3\xa9 4f1f \xc3\x9f1au \xc3\x9f2e \xc3\x9fe2e f2f3ef \xc3\x9f3ei \xc3\x9fe3in \xc3\x9fe2m \xc3\x9f3emi \xc3\x9fi3k \xc3\x9f5li f3flu f3fl\xc3\xbc f3f4r\xc3\xa4 \xc3\x9f3r\xc3\xb6 \xc3\x9f3ru \xc3\x9f2s \xc3\x9f3s2h 2f3g4 fge1 2f1h 1fi 3fi_ fi3at fi1erf fi2ki fi3kl fi2k1o fi2l3an fil3d fi2les fi5li fi6lin fil2ip 5fin_ f2i1n4a fi3ni 5finn fin4s3 2f1int fi3ol fi2r fis2a fi5s2p fi4s3t fi3te fito2 fi2t1or 5fiz 2f1j 2f1k4 f2l4 2fl_ f3lad 1f6l\xc3\xa4 3fl\xc3\xa4c 2fl\xc3\xa4d f5l\xc3\xa4n 2f3leb 2f3lein f3ler f4li f6lim fli4n f3lon 1f6lot flo2w f6lug flug1a f6l\xc3\xbc 2f1m 2f3n2 fni2s 1fo 2f1ob fob4l fo2na fo2nu 2f1op fo1ra 4f3org fo3rin 3form for4m3a4g forni7er_ for4st for2t for4te for4th fort3r for3tu 2f1\xc3\xb6f f1\xc3\xb6k f\xc3\xb6rs3 2f3p2 fper1 2f1q f2r4 f4rac f5rad f1rah fra4m f3rand 2f5re_ f5ref 2freg frei3ba f3rep f3ric fri3d fri2e 2frig fri3k 1f4ris f3roc f4ron fro2s fr\xc3\xb65s4c fru2 4fs f5saa fs3all f2s1an f2s3as fs1auf f2saut f3sc f5schl fs1e2b f2s1em f3send fs1ent f2s1er fse4t f4s3eta f3si fsi2d f2s1o2 fs3ol f3span f2s1pas f3s2pl f3s2por f2s1pr fs2pra fs2pri fs3s2 f1s2t fs3tak f2stas fs3t\xc3\xa4t f4st\xc3\xa4ti f4stech f3stei f5stel f3str fs4tro f3st\xc3\xbc f4s3t\xc3\xbcte f2s1un f2s\xc3\xbc f5sy 4f1t f4ta_ ft1a2be ft1af ft3al ft1an ft3anz ft1ar f3tat ft1e2h ft1eig ft1ein ft1eis f4t1ent f2t3eti f2t1h ft3hei f3ti ft3rau ft3ro ft3r\xc3\xb6 f3t4ru ft2s1 ft4s3a ft3sc ft6sche ftse2 fts3i ft3st ft4s3t\xc3\xa4 ft5sti f2tum ft1url ft3z 1fu 2fum 2f1unf fun4ko fun2k3r 2funt furch2 fu4re_ fus2sa fus2s1p fus2st fu2\xc3\x9f1er 3fut 1f\xc3\xbc 2f\xc3\xbcb f\xc3\xbc2r 2f1v 2f1w fwa3s 1fy 2f1z fz2a fz2s 6g_ 1ga 7ga_ gabe4n 2gabf gab5l ga1br ga3bu 2gabz ga1c ga3di gadi4e ga1e 3ga5g ga1k ga2ka ga1la 5gamo 2g3amt 2g1anb gan3d g1anf gan2g1a gan2gr gang4st 2ganh 2g3ank 2ganl g3anla 3gano ga1ny ga3pe 2g1arb 2g1arc 3gard ga3re 2g1arm ga3r2o g1arti ga2s1a gas3ei ga2s1i ga2so gas3s ga4ste gas4t3el ga3th 2gatm gat4r gau1c 2g1auf g2auk 2g1aut 1g\xc3\xa4 2g1\xc3\xa4p g\xc3\xa4s5 6g1b4 g5be gber4 2g1c 2gd g1da g2d1au g2d1er g1do g3d\xc3\xb6 gd3r gds2 gd3sz gd1ur 3g4e ge3a2 ge3ba gebe4am ge1c ge3d ge1e2 ge2es geg4 ge3gl ge2ig ge1im ge1ins ge1ir ge2is 6geise2 gei3sh gel6ders ge4l3ers gels2t gel3sz gel3t2a ge3l\xc3\xbc gel3z2 gem4 5gema 5gem\xc3\xa4 5gem\xc3\xb6 ge1na gen2au gen2d3r gen3eid ge4ners gen3g gen3k ge3nor 5gens gens4ei gen7stern gen3sz g1entf gen3th ge3ou 5ger_ ge1ra ge2rab ger3amp ger2an g5ereig ge4reng ge4rens ger2er germ4 ger3no ge1ro ge1r2\xc3\xb6 5gerw ges2 ges4am ges3auf ge5s4c ges3elt ge5sen ge4ser ge5si ge3sp gess4t ge1st2 ge3ste ge5stei ges4tem ge4s3ter get2a 4getap ge1ul 4g5ex 2g1f 2g1g g5ge gge3n2e g2g3l gg4lo gg3n gg4r g3gr\xc3\xa4 2g1h 4gh_ 3g2hi gh3l 3gh2r gh3te g2hu gh1w 1gi gie3f gie3g gi2e1i gie3l4 gi2m gi4mes 2g1ind gi3ne gin2ga 2g1ins gi2o gi3os gi3ro 2gisel git4a gi3tu gi2us 2g1j 2g5k g2l 4gl_ 1gla 3g4lad 2g3lag 5glanz 3g4laub 4g5lauf 1gl\xc3\xa4 gl\xc3\xa4s3c 2gl\xc3\xa4uf 1gl4e 2g5le_ 2g3leb g5lec g3leg 2g3leh g4leic 4g5lein glei4t5r g3lenk 4g5ler g3lese g3lev g3li g4lia 2glib 5g4lie 4g5lif 1g4lik g4lim g5lis 1g4lit 1g4liz 2glo 3g4loa 3g6loc g7loch 3g4lok g6lom 3g4lot 2gls 2glu glu2t 1gl\xc3\xbc 3gly 2g1m2 2g1n2 4gn_ 3g2na g6na_ 4gnah g6nat 3g2n\xc3\xa4 g5neh 4g3neu 4gn3g gni2 g2nie g2nif 4g5nis1 g2no g3not 4gns 4gnt g5nu g6n\xc3\xbc g2ny 4gn3z 1go 3go_ go6a goa3li 2gob 2g1of 4g1oh go1i go3in go3l4a 2g1opf g2o1ra 3gos go3t2h go3tr 3gou 3go1y 1g\xc3\xb6 g1\xc3\xb6f 2g3p2 2g5q 1g2r4 gra2bi g3rah 3grai 2g3rak gram8m7end 3gran g3r\xc3\xa4d 2gr\xc3\xa4u 2g5re_ g4reb g3rec g3rede g4ree 2g3reic g3reit g3rek g4rem 2g3renn gre3no gren6z5ei 2gret 2g3ric gri2e 2grig 2g3ring gro3be gron4 g4ros gros6s5el 2g3r\xc3\xb6h g4ruf 2g3rui 2grum 3g4runs 3g4rup 2g3rut gr\xc3\xbc1b 2g3r\xc3\xbcc 3g4r\xc3\xbcn 6g2s1 g4s3ac gs3ad g4s3a4g g3s2ah gs5a2k gs3all gs5ama gs3amb gs3an gs3as gs3aug g3sc g6sca gsch4 g4schan g6schef gs3cr gse2 g3s2eil gs3en g4s3er gse4t gs3eta gsi2d gs3in g4sl gso2 g5soz gs3p gs5pal gs4pi gs6pie g4s5pin g4s5pl g5s4por gsr\xc3\xbc2 gs5s4 g3stan g3star gs2t1au gs3tauf g4st\xc3\xa4 g5st\xc3\xa4m g3stel gst3err g3s2to g4s3tor gs2t\xc3\xb6 gs2tro gst3ros gs3tr\xc3\xbc g3stu gs2t\xc3\xbcc g4sw g3sy 2g1t2 g5te g2t3h g5ti gti2m gt4s3 gt3w 1gu gu1an_ gu1ant gu2e guet4 2g1uh gu1ins gu1is gu5me gun2e 2g1unf g2ung_ g2unge 2g1ungl 3g2uns 4gunt gu4s gus3a gu5sc gu5se gus5se_ gus2sp gus2st 5gu2t1 1g\xc3\xbc 2g\xc3\xbcb g\xc3\xbcr1 g\xc3\xbcs1 2g1v 4g1w 1gy 2g3z2 6h_ 2ha_ hab2a hab2e hade2 ha2del h3adle ha3dri ha1el haft4s hafts3p ha3go ha3ha hai1es h2aka haki3 4hal_ hal1a halan4c hal2ba halb5s 2ha3le ha3li hal2la h3alp halt3r h3amt h2an_ 2hana h2and h1angr 2h5anr 2hant 2hap ha2pr ha3ra 2h1arb h2ard har3ma har5te h1arti 2has_ 4ha3sa hasi1 h4at hatt2 hau3f6li 2h1aufm h1aukt hau2sa hau4sc hau4spa hau2tr h1\xc3\xa4ff h1\xc3\xa4rz h\xc3\xa46s5chen h\xc3\xa4u4s3c h\xc3\xa43usp 2h5b6 hba2r3a 2h1c h1d 2hea 1heb he3be he2bl he3br he5che he1cho he2el hee3le hee2s he2f he3fe hef3erm hef3ing hef3l hef3r he3fri he2i h1eie h1eif h1eig heine2 hei4neh h1eink he3ism he3ist heit6s3 h1eiw hekt5a he2l3au he2l1ec he3l2ei he3len he3li hel4l3au he3lo he4l\xc3\xb6 he3ma he3mi 1hemm 2h1emp h2en_ he6n3a he4n\xc3\xa4 h4ene he2n1e2b hen3end he2no h1ents he2nu hen3z 2he2o he3on he3op her3a2b her3al her3an 2herap he3ras her4eig he4r3eis he2rel he6r5innu h1erke 2herm he3ro h1er\xc3\xb6 her5th her2z1w he2str he3th he5ti he3t6s he2u heu3g he3x he1x4a he1y2 1h\xc3\x8b 2h5f4 hfel2l1 hfi2s 2h3g2 h5ga hge1 hgin4s 2h1h 2hi_ 2hia h1iat hi1ce 2hi3d h1i4di hi2e hi3ens hie4r3in hif3f6r h2ig hi2kr h2il hi2l5a4 hil2fr hi2n hi3nat hi3nel hin2en hi3n2i hin5n hi3no hin2t5a 2hio hi4on hi3or hi3os 2hip hi2p1h hi2r hi3ra 2hi3re hi3ri hir4ner hi3ro his2a hi4se hi3sp hi4st hi1th hit2s h1j 2h1k4 2hl h3lad h4laf h3lai hl3anz hl1ar h3las h3laug h3laut h3law h3l\xc3\xa4d h3l\xc3\xa4s h3l\xc3\xa4u hl3d4 h5le_ h3leb hle3e h3leh h2lein hle3l h7len_ h2lent h3ler hle2r3a h4l1erg h6l3ern\xc3\xa4 h4l1erw h3les h4lesi hle5ta h3lex h2li h3lik hl1ind h2lo h5loc hl1of hl1op h6lor h3losi h3l\xc3\xb6 h5l\xc3\xb6c h4l\xc3\xb6s hl2san hl2ser hl3slo hl3sp h3luf h3l\xc3\xbcf 2h1m h2ma h3mag h3man h3mar h4m\xc3\xa4c h4m\xc3\xa4h h4m\xc3\xa4l h4m\xc3\xa4u h3me_ hme1e hmen2s h2mi h3mir_ h2mo h3mot hm2s1p h2mu h5musi h2m\xc3\xbc 2hn hn2a h3nac hn3ad h3nam hn3an h3nati h2n\xc3\xa4 hn1\xc3\xa4r h3n\xc3\xa4s hn3d4 hn2e hn3eig hn3ein hne3k h2nel hne4n h2nep h3ner hn4erg h5nerz h2neu hn1g h2nic h2nie hn3im h2nip hn3kl hn2k3n hn3s2k hn4th hnts2 h2nul h3nunge ho3be ho2bl ho2c ho4ch3 ho3ck hoe4 ho2ef ho2fa ho2f3r hohen3 hol2au ho2l1ei 2holo ho4lor 1hols 3holz hom2e ho2med ho5mu h2on 2hop ho1ra hor3d h1org ho3sl ho4sp ho4st 2hot_ ho5th 2hots 1hou2 4ho2w how1e h1o2x ho1y2 1h\xc3\xb6 h\xc3\xb62c h\xc3\xb63ck h2\xc3\xb6r h\xc3\xb64s h\xc3\xb6s3c 2h3p2 h1q 2hr hr1ac hr3a2d h1rai h1rane h3rat h3raum h3r\xc3\xa4u hr1c hr3d h2rec h3rech h3red h3ref h4rei_ h3reic hr3eig h3rel h3ren hr2erg hr2erk hr2erm hr2erz h3re6s3 hre2t hr3eta h3ric hri4e h3riesl h3rin hr1ind h4rine hr1ins h4ris h2rob h3roh h4rom h4ron h2ror h3rou hrr4 hr4s3ac hr2s3an hrs1au hr4s1en hr4ser hr6s1in hr4s1of hr2su hr4sw hrs3z hr4tab hr2t3r hr3tra hrt2s h1ru h3ruh h3rut h3r\xc3\xbc hr3\xc3\xbcb 4hs h4s3ach h2s1an h2s1au hs1e4c hs2ein hs3eins hs1eis h3sel hse4ler h3sen h3ser h2s3ing h2s1of h2s1par h3spen h2spr\xc3\xa4 h2spu hs3s2 hst2a hst3alt h2stau h1stec h3s4terb h4steu hs1the h1s2ti h2s3tie hs4tief h2stor hs2tr h1stun h2s1un h1sy 4h1t h2t1a htab2s h3t4akt_ h3takts h3tal h4t3am ht3a4n ht5ane h4t3ass h4tasy ht3a2t h5te_ h2t1e4c h3tech h2t1ef ht1e2h h2teif h2t1eim ht1ein h2t1eis h4t3elit h4temp h4t3entf h4tents ht3erf\xc3\xbc h4t3ergr h2t1erh h2t1erk ht4erko ht3erre ht3ersc h4t3ersp h4t3erst h2t1erz hte2s h4t3ese h4t3ess h5tet ht1eu h2t1ex h4t1h h3ti h4t1in hti2s hto2 h2t3oly h2top h2torg h2t\xc3\xb6 h3t\xc3\xb6p ht5rak ht3rand h2t3rat ht3rel h3t4ri h2t3ro h3t4roc h3trom h2t3r\xc3\xb6 h2t3ru h2t3r\xc3\xbc ht2sen ht4s3ess ht2sp ht3spa ht4s3par ht4stab ht4s5tur ht3t htue3 ht1und htwa5r ht3z4 hu2b hub1a hu4b3ei hu4b1en hub3l hub5r hu1c hu2h1a hu2h1i huko3 hu2l3a hu2l\xc3\xa4 hu2l3ei hu2ler hu2let hu2l3in hu2lo h1ums h1una huni1 h1up_ h1ups 2hur hur4e hu3sa hu2sc hu2st hu3t2h hu2ti hut4zen hut4z3er h2\xc3\xbc h\xc3\xbc1bel h\xc3\xbch3 h\xc3\xbchne4 h\xc3\xbcs3 2h1v hvil4 2hw hwe1c h1weib 1hyp hy2pe_ hy2t h1z hz2s 2i_ i4aa ia1b4 iab5s i1ach_ i5ad_ i3adn ia1f6 ia3g i5ak_ i1akt i3al i5al_ i5al3a ia2l\xc3\xa4 i5al3b ial3d i5alei i5alent i5a4l3erm i5a2let i5alf i5alg i5alh i5a2lia i5al3k i5all i5alm i5aln ia2lor i5alp i5alr i5als i5al3t4 ia2lu i5alv i5alz i5an_ i1ana i1anc i5and i6a3n2e i6ani i3ann i2ano i5ans i5ant i3anz ia3p2f ia1q i5ar ia2ra iard2 i6ari i3as i5as_ ia3sh i4asi i6a3sp iat2 i5at_ i3ath 1iatr i5ats i5au ia3un i1\xc3\xa4m i5\xc3\xa4r_ i1\xc3\xa4rs i5\xc3\xa4t_ i5\xc3\xa4t3s i1b i2b1ar i2b1auf ib2bl i2b1ei ibe2n1 ibi4k i3bla i3b4le i2b1\xc3\xb6 ib1ra i2b3r\xc3\xa4 ib3ren ib2s ib3sa ib3sp i2b3unt ibus3 4ic ich1a ich3al ich3\xc3\xa4 i1che ich3ei i3cher i1chi i2chin ich3l ich5m i1cho i2ch3r ich2t3r i1chu ich1w i2cka ick2e i1cr i5cu i1d id2an i2d1au i2dee ide5l2\xc3\xa4 ide3le iden3g ide1ra ide3re ide3so 1i2dio 1i2dol i2d3r i3d4ra id1t4 1i2dy ie3a4 ie2b\xc3\xa4 ie2b3l ie2b3r ieb4sto ie1c ie4ck ie2dr ie1e2 ie2f1ak ie2f1an ie2fau ief3f6 ie2f5l ie2f1r ie2ga ie2g5l ie2g3r iegs3c ie3he i1ei i2e2l3a2 iel3d i2ele ie2l1ec i2eli i1ell i2els iel3sp iel3sz ielt4 iel3ta i3e2met i1en i3en_ i3ena i3e4n\xc3\xa4 i3end ie2n1e2b ien2er ien3ere ie3nern ie3ners i3enf i3en1g i3enh i3enj i3enk i3enm i3enn i3e2no i3en\xc3\xb6 i3enp i3enr ien5sc ien3s2e ien5sp ien2st ienst5r\xc3\xa4 ien5sz i3env i3enw i3enz ie1o2 ier3a2 ie2rap ie2r1ec ie3rel ie3r2er ie4r3erz i3ereu i1ergr ier3k2 i1ern i3ern_ ier5ni ier4s3eh ier3sta ier3sz iesen3s4 ies5ser i1esti ie1stu ie3su ie2t1a ie4tei ie4t3erh ie2t3ho ie4t1o ie2t3\xc3\xb64 iet4se iets4t i3ett ie1un i1eura 2if if1ab i2f1arm if1au i5f2en if1erh ife4s if2fl i3fi if5l i1f6la if1l\xc3\xb6 i1flug i1fl\xc3\xbc if3r if4ra i1frau i1f4re if4r\xc3\xbc if2s if3se if2ta ift3erk if2tro ift3s2p i1g iga1i i2g1ang ig1art iga5s i4g5ei ig7eise ige2na i4g5erz ig2gr i2g1im i2g3l ig4le i4gli ig1l\xc3\xb6 ig1lu 2igm i4gn\xc3\xa4 ig4no i3g4ra ig4sal ig5s\xc3\xa4 ig4s3e ig3so ig3s4p ig4spa ig3stei ig4s3to ig4st\xc3\xb6 ig3str ig5stu i1h i2h1ar ihe1e ihe4n ihis3 ih3l ih3m ih1n ih1r i2h1um ihu3s ih1w 2i1i4 ii6g i2i5t i1j i1k i4k3a4k ik5amt i2k1ano i2k3anz i2k1ar ik3att i2k1au ik3aufr i2k1\xc3\xa4r 2ike i2k1ei i2k1erz i2k3eta i2k1in i2k3l ik4lan i2k3n ik2o3p6 i4k\xc3\xb6l ik3ra ik3r\xc3\xa4 ik3re i3kri ik1s2 ik3sh ik3so ik3sz ikt3erk ik2t3r i2kun i3kus i1la i2l5ab il3a2d i2l1ak i2l5a4m il1ans i2lant il3asp i2l1au il4aufb il5aus i1l\xc3\xa43 il2c il2da il4d3ent il2d1o ild5r i2l1e4c ile2h il1ehe il1ein i2l1el i2l1ent i2l1erf i2l1erg i2lerr il2f5l ilf3le il2f3re ilf4s ilg4r ili3en il1ind i2l1ip i3lip_ i3lips ill2a il3l4an il5l2er il3l2i il2mak il2m5at il2m1au il2min 2ilo i2l1or il1\xc3\xb6f il2san il3tr i1lu2 i2lum il3v2 2im_ i2mag ima4ge ima2to ima4tur 2ime i2m1elf i2m1erf i2m1erz 2imi i2m1ins im2mei im4m3ent 1immo im1org 1impo 1impu im2str 2imt 2imu im3unt 2in_ in3ab in1a4c in3ad in2af i4n5a2m i3nara i6narb ina4s i2n3au inau4s in1\xc3\xa4s in1\xc3\xa4u in3dau 3index in3do in2dro 1indus 4ine i2n1e2be i3nec in1ehe in3ei i5nen_ i5nend in1eng i5ner_ i4n3erbe i3n2erh i3nerl i4n3erl\xc3\xb6 i5ners i2n1eu ine3un ine2x inf4 2ing ing1af in4g3a6g ing5sc ing3ska 1inhab 2inhar 2inhau 2inhe i3ni3d i5nie 2inig 2inis i3nitz 3inkarn ink4ste in4nei in4n3erm 1innta 2ino in3od in1or ino3st ino3t i1n\xc3\xb6 in1\xc3\xb62d 2inr ins2 ins4am ins3\xc3\xa4n insch4 in7schl 2insen ins3ent ins3ert ins3h in3sku in5spe in3st 3instal in4s3t\xc3\xa4t in5s4tr 1insuf in3sze int4 1integ in3t2h i2n1uf i3n2um in1unz invil4 i1ny in3ze in3z4w i1\xc3\xb1 4i1o io5a io1c io3e4 i2o3h i3ol_ i3om_ i3oms ion4 i3on_ io3na i3ons3 i2ony i2o1p i3opt i2or i3or_ i3orc i3orp i3ors i2os i3os_ io5se io3sp io3st i3ot_ i3ots i2ov io2x i3oz_ i1\xc3\xb64k i3\xc3\xb6n i1\xc3\xb6s_ 2ip_ i1pa i1p\xc3\xa4 i1pe i3per ipf2 ip3fa iph6 2i1pi ipi3el ipi2s ip4l i1pr 2ips 2ipu i1q i1r4a i3ra_ i3ras i1r\xc3\xa4 ir2bl ir1c ir2e i5ree 2irek i5r\xc3\xa9 irg4 ir2gl i1r2i 2irig 2irk ir2k5l irli4n ir2mau ir4m\xc3\xa4 irme4 ir2m1ei ir2mum ir4m3unt irn3ers i1ro i2ron iro2s i1r\xc3\xb6 irpla4 ir4s ir5se ir5sh i1ru iru2s1 i4s3amt is1an is1au is1\xc3\xa4n 2isb i2sca isch3ar i4sch3e4h i4sch3ei isch6er i4schin i5sching i2sch3l i2schm isch3ob isch3ot isch3re isch3ru isch3wu is3chy i2s3cr 2i3se ise3e ise3ha ise5hi ise2n ise1ra i4serh i4s1erm iser2u i4s1erw i5ses i4s1ex isi2a i2s1id i2s1of iso2n iso6nend is1op 3i2sot i2sp is1pa i4spar is1pe is2ph is3pic i4spo i4spro is3sa is4sau is4s3che is4s1pe is2spr is2st iss1tr is2sum i2st is1t2a is2t3ab i3star is2tat i3stel iste2n is1th i1stil is1to is1tr is2t3re i3st\xc3\xbc isum3p i2s\xc3\xbc i1sy i1\xc3\x9f i\xc3\x9f3ersc 2it_ i1ta it1ac it4akte ital1a it3alt it3am it1ang i3tat it1au i4t1ax 4i3t\xc3\xa4 i4t1\xc3\xa4s it\xc3\xa4t2 2ite i2t1eig it1ein 4itel ite4la itens2 iten3st i4tex it1he i5thr i3ti 1itia i4t1id 1itii i4t1in i1to i5toc i2t1of i1t\xc3\xb6 i1tr it3raf it3rah i2t3ran it3ras it3rau it3r\xc3\xa4u it3re it3ric it4ron i3tru it3run it4s3a2g it2s\xc3\xa4 it2s1e2 it4s5er1 it2s1id it2s1pe it2sti its3tie it2sto it2tar it2teb it2tr it1uh i2t1um i2tuns itu5re_ i1t\xc3\xbc i3t\xc3\xbcl i3ty 2i1u4 ium2s iu5se i1\xc3\xbc 2i1v iv1ang i2veb i2v1ei iv1elt ive4n i2v3ene i2v1ent i3vol i2vr i2v1ur 2i1w ix2em i3xi i1xo ix3tu i1z i2zan iz1ap iz1au ize2n i2z3ene i3zer i2z1ir iz1ob i2z1\xc3\xb6 izt2 iz3th i2z1w \xc3\xad1l 2j_ ja1c jahr3ei jahr4s ja3la ja3ne ja3st 2jat 5j\xc3\xa4 je2a jean4s je1c je2g jek4ter jek2t1o2 jek2tr je2p jes1t je2t jet1a jet5r jets4 jet3st jet5t jet1u4 je5v ji2v j2o joa3 jo2b1 jo2i joni1 jo1ra jord2 jo2sc jou4 joy1 4j\xc3\xb6 j2u ju2bl juden3 jugen6 jugend5 ju2k jung5s jur2o ju2s jute1 2j1v 4k_ 1ka 3ka_ ka2a ka3ar kab2bl ka2ben 2kabh ka1bl 2kabla 2kabl\xc3\xa4 kab4le 2k1a2bo ka3b6r 4k3abs ka1c k4ade 3kadi k3adr ka1fr kaf3t ka3g kai5 ka1in ka3ka ka1la ka2lan kal3bl ka3lei ka4lens kal5eri kal2ka 2kall kal4tr k4am k5a2ma kamp2 ka2nau k1anb kan3d4 2kanda kan2e 2k1ang 2kanl 2k1ans 6kantenn ka3nu 2kanw k4anz_ ka2o 2kapf 3kara k2ard 3ka3re k2arg kari3es 2karm k2arr kar3t 2karti k2arw ka3se kasi1 ka4sp kas1t ka4sti ka3ta ka3th ka2t3r 2katt kau2f1o 4kaufr 2kaus k1ausg k1ausw kau3t4 2kauto 1k\xc3\xa4 k1\xc3\xa4mi k\xc3\xa4r2 k\xc3\xa44s3c k\xc3\xa43se k\xc3\xa41th 2k1b4 k5be kbo4n 2k3c 2k3d kdamp2 ke1c ke3d kefi4 kege2 ke2gl kehr4s 2k1eic 4kein ke1ind keit2 ke2la ke3lag kel1au ke2l\xc3\xa4 4k1e2lek ke3let kel3sk kelt4e 4k1emp ken3a ke4n3ei 4kengag ken3s2k ken5stei ken3sz k2ente k3enten ken3th 4k1ents 2kentw 2keo 4ke2p3 k2er_ ke1ra ke2ran ke2rau ke3reig k3erh\xc3\xb6 ke6r5innu k2erl k4erl_ k2ern ker4neu k1ero k2ers_ ker3z2 k1e4se ke5sen ke4t3a keten3 ke2t3h ket3z2 2k1e2x 2k5f kfi2s kfr\xc3\xb65 2k1g4 kge1 2k1h4 kho3m ki3a6 ki1c ki2d ki3da ki3d4r ki2e ki3ern ki1f6l ki1fr ki3k4 ki3l2a ki3lo 3kin_ 2kinh k2ini ki3n4o 2k1inse kin3sh 2k1int ki3o 3kirc ki5s2p kis2to 2kiz ki3zi 2k5j 2k1k k2l4 4kl_ 2kla_ klan2 k4lar k5last 2k5le_ kle5ari 4k5leh 4k5leit k3lem_ 2k3ler kle2r3a 2k3leu kle3us k5lich 3klim klit2s 4k5liz klo2i3 k3lu k3l\xc3\xbcc k3ly 2k1m k2n2 k4nei kni4en_ kno2bl 2knor 3k4n\xc3\xbc 1ko ko5a ko4al 2kobj koff4 koh3lu ko1i2 3kom ko2min k2on kon3s2 ko3nu ko1pe kop4f3en kopf5err kop2t ko1r2a ko3ran 4k1orc kor4d3er ko3ri kor3m kor4ner ko3str 3kot ko3ta kots2 kot3sp k3ou 3kow k1o2x 3k\xc3\xb6 k\xc3\xb62f 2k3p4 k1q k2r4 2k3rad k3rats 2k1raum k4raz 2kr\xc3\xa4t 4k5re_ 2krea 2k3rec 2krede k3reic kre1i2e k3reih 2k3rh k3ric 4krip k4ron kr\xc3\xbc1b 4ks ks3all ks3amt k2s1an k2s1au ksch4 ks1e2b k2s1em k2s1ers ks1ex k2s1in k2s1o2 k3sof k5son ks1pa k3spe ks5s4 ks2t2 k4s3tanz kstat4 k3stau k1ste k2stea k5stei ks3ter k1sti ks3tie k2stor k2str\xc3\xa4 k1stu k2stum k2s1u k1sy ks2zen 4k1t kt1abs k2t3ad k3taf kt1akt k3tal kt3am kt1an kt3anz k2t3a2r kta4re k2t1au k3te kte3en k4t1ei k4temp k4tent k4t3erfo k4tex k2t1h k2t1id kt1im k2t3ing kt1ins k2t1of k3top kt1ope kt4ran kt3ras kt3run kts4 kt3se kt3st kt3t2 k2tuns kt3z ku1c ku3la 4kulp 2k3uml kum4s k2u3n2a kun6s4 kunst3 2kunt 2k1up_ kuri2 kuri4er ku2ro kur4sp kur4zen ku4schl ku2so ku2sp ku2s1t 1k\xc3\xbc 2k\xc3\xbcb k\xc3\xbc1bel k\xc3\xbc1c k\xc3\xbcr4s 2k1v 2k1w 2k5z2 kze3l 6l_ 5la_ la3ba 2laben 2labf 2labg 2labh 2l1abl lab2o l2a1b4r la3bra 2l1abs 3labu 2labw la3che 1lad la7den la3di l3adl 4ladm 2l3adr 5ladu l3adv 1lae la2ga la5ge lag5eis la4gl la4gn lag1ob la2gr lag5se lahn3 2la1ho 1lai 1laj la2k1i la1k4l 2l3al la3ma l4ami l4amp 2l3amt 1lamu la4mun la2na l2anc 5l4and lan2d3a lan6d5erw lan6d5erz lan4d3in lan2dr 2l1anf langs4 2lanh 4lanl 2l3ann l1ano l1anp 2lans 1lanx lan2z1w la1or l1a2po6 lap4pl la2r1an 2l1arb la2r1ei la6rene 2larm lar3st 2l1art lar3th la3ru la2sau la3se 2lash la2so 2la4sp 5lasseri 5lassern 5lassers lat2a 2l3ath la2t3ra lat4s lat4tan lat4t3r lau4fer lau2fo l2aufz l1ausg 2l1ausl 2l1ausr 2l1auss l1ausz 2lauto 2law lawa4 1lax l\xc3\xa41c 7l\xc3\xa4ds 7l\xc3\xa4dt 4l\xc3\xa4f 2l1\xc3\xa4hn 3l\xc3\xa4nd l2\xc3\xa4r_ l\xc3\xa4r2ma l\xc3\xa44sc l\xc3\xa43se2 4l\xc3\xa4t 4l\xc3\xa4ub 4l\xc3\xa4uc 4l\xc3\xa4ue 7l\xc3\xa4uf 1l\xc3\xa0 4l1b2 l3bac lb3ang lb3arb lb3b l2b3ede l2b3id l2b3ins lb4lat l3bl\xc3\xa4 l2bli l4bre_ lb4ro l3br\xc3\xbc lbs4 lb3sp lbst1e lb4sti lb4sto lb4stu l2b3uf 4l1c l3che l5chi lch3l lch3r lch3\xc3\xbc lch1w 4l1d ld3a2b ld3ad l2d1ak l3dam l2d1an ld1a4r ld5ari ld1au ld1\xc3\xa4r l3de_ ld1ei l3der_ lde3re l3dern l2d1e4se l2dex l2d1im ldo2r l3d\xc3\xb64 l2d3r ld1ra l4dran ld1r\xc3\xa4 l4dre ld1ri ld1ro ld1r\xc3\xb6 ld3sa ld3ska ld3sp ld1st ld1t4 l2d1um l2d\xc3\xbc 1le 3le_ le2au le3ba le3ben_ leben4s3 le2bl lech1a le2chi lech5t4e 3led 4ledd le3de le2e le3ei le3en_ le3f4a le2gas le2gau le2gl le3gr 3lehr leh3r2e 3lei_ lei2br l2eid 4l1eig l2ein_ lei2no l2eint lei2s leis6s5er lei3su lei4\xc3\x9fer l2eit lei8t7ersc leit3st lekt2a 3l2ela le2le 2l1elek le3len le3ler le3les 3l2eli lel3s le2m1o2 2lemp l4en_ le2nal le4n\xc3\xa4 3lene le4n3end 4lenerg l2enf le3ni len3kl l2e2no len3st len3sz l1ents 2l3entw le2nu le1os 2lepo lepositi8 l4er_ l2e1r2a le2r3a6g le2r3au ler5b4 4l3ereig le4r3eim l4erem l4eren l4erer le4rers 4l3erfas 4l1erfo 3lergeh 3l4ergew 2l1ergi ler3k 3lerm le1ro l1err l4ers_ lers4k ler3sz le2ru le3rung 4l1erz les4am le5s4e 2lesel le3sh lesi1 le3s4k les2t le3ste3 4lesw 2lesy le4tag le2tat 2le3th 2leto lets4 le2u 4leud 3leut 2lex 4le5xe l1exz 3ley 2l1f l3fa l2f1ec lfe1e lf1ein lfen2s l3fl\xc3\xa4 lf3lo lf3ram lfr\xc3\xb65 lf2s lfs3tau lfs3tr lf2tr lf4u lfur1 2l1g lg1d lge3ra lg3lo lg3re l3gro 2l1h 3lhi_ 1li 5li_ li1ac li1ak 3lib 3li1c 5lichem 5licher li3chi 4lick li3da 2lido liebe4s lie2n li3ene li5enp lien3st lie4s3c lie2st li3fa li4fe 5lig li2g1a2b li3ke li3ki li3kli li2kr lik4ter li3li li3m2a 2limb 2limp li3n4a 2l1indu li4nef li2nep li4nes 2l1inf ling4s 2l1inh li3ni li4nit 2l1inj lin2ka li2n3ol l2ins_ l2insc 2linsp 2linst 2l1int l1inv li2o lione2 li2p5a 5lipt li3s2a li4schu 2l1isl liss2 3list li2tal li3te li1t2h lits2 lit3sz li3tu 3liu2 2lixi 2l1j 2l1k lk3alp l3k2an l3kar_ lk1arm l3ke lkir5 lk3lo l3k4ra lk3ro l2k3ru lk2s3 l3k2\xc3\xbc lk\xc3\xbc1b 4l1l ll1a2be ll3aben l2l1abt ll1akt l2l3a4m ll5ama ll2anw l2l3anz l3lap ll1arm ll3aug l2l1aus l2l1\xc3\xa4m ll3b ll3d ll1ech l2l1ef ll1eim ll3eise l3l4em l5len_ ll3endl ll3endu l4lents l3ler_ lle2r3a l6l5ergen ll3ernt ll2err l3l4es llg4 ll1imb ll1imp l2l1ind lli5ne l2l1ins ll3l4 ll5m lln2 l2l1ob ll1of ll1opf l2l1o2r l2l3ou ll1ov l3low l4l1\xc3\xb6f ll3\xc3\xb64se ll3s2k ll2spr llt4 ll3th llti2 ll3tr llt5s2 ll1ur llust6 llus5tr ll3z2 2l1m lm3a2b lm1aka l2m1arc lm1ind lm1ins l4m\xc3\xb6l lm3p lmpf6 lm3s2z lm3th 2ln l1na lna6r ln3are l3n2e l3ni l3no l1n\xc3\xbc 1lo 3lobb 2lobj lo2bl l2obr lo3bri 2lof4 4lo2fe 3logi loh2e l1oh4r 3lok lol2a lo2min lo4n1o lo2o 2lopf 2lopt lo1ra lo4r\xc3\xa4 l2orc 4l1or5g6 lo3ro 3lorq l2os 3los_ lo4sa 3lose lost4 lo4ste lo4s1tr lo3sze lo2ta lo3th loti4o lot2s 2lo2v lo3vi 2lox l\xc3\xb62b l\xc3\xb63du 3l\xc3\xb62f 4l1\xc3\xb6fe l3\xc3\xb6hr 2l1\xc3\xb6l 5l\xc3\xb6sc 6l\xc3\xb6\xc3\x9f 2l1p lpe2n1 l3p2f l2p1ho l3prei l3pro lpt4 lp3tr 2l1q lque3r 2l5r2 lru3t2 lr\xc3\xbc1b 4ls l2s3a2d l5s4al ls1anf ls1ang ls1ann l2s1au ls1ec l2s1em ls3ere ls1erg l2serh l2s1ers l3ses l3sex lsho2 l2s1imp ls2kal ls2log ls3ohne l3s2po l2spro l3spu ls5s4 lst2a lst2e l1stec l5stei l5stel l1sti ls2tie l2stit ls2tr l1s2tu ls1um l3sur l1sy ls2zen 4l1t lt1abs lt3ala lt3all lt3alt lt3am l4tame lt3and lt1ang l3tar lt3art l3tat l4t3ato lt1au l5tef lt1eh l2t1eig lt1ein l2t1eis l5t2en lter3a lt3erei l3t2erg lter4sp lte3str lt3e2th l2t1h lt5hei lt2hem l3ti ltimo4 l3toc lt1of l2t1\xc3\xb6 l3t\xc3\xb6r lt3\xc3\xb6t ltra1l l3tr\xc3\xa4 lt3r\xc3\xa4u l2t3re l2tro lt3roc lt3ros l2t3r\xc3\xb6 lt5sc lt2s1e lt4stab lt4stoc lt2s3t\xc3\xbc lt3t lt1uh l2t1um ltu4rer ltu2ri lt3z2w 1lu_ lu1an 4lu2b1 lub3l lub3sz 6luc lu2dr lu2es luf2 2l1ufe luft1a luft1e 4lug lu2ga lu4g5e2b lu4ger lug5erp lu4g3l lu2go lu2g3r lug3sa lug3sp lu2gu 2l1uh lu1is_ lume2 2lumf 2luml l1ums l1umw 1lu4n 2l1una l1unf 2l1uni 4lunt 2lunw lu4pf 2lur lur1c l1urn l1urt 2luse lu2sp lus4ser lus2s1o lus2s3p lus4st lu2st lus2t3a lust3re lu2s1u lu2t1a lu4tal lu2t\xc3\xa4 lut3erg lu2top lu4t5r 3lux 2l\xc3\xbcb 7l\xc3\xbcd l\xc3\xbch1l l\xc3\xbc2s 2l1v l3vo l2vr 2l1w l5wa 1ly ly1ar lye2 ly3et 2lymp 3lyn ly3no ly1o ly3u 2l1z l3z2an lz1ar lz1erz lz1ind lz1o2f lzt2 lz3th l2z1w lz2w\xc3\xa4 lz2wec l4zwer 4m_ 1ma 2m1ab m2abe ma1bl 3m2a1b4r ma2ci mad4 ma3de ma1e2 ma1f ma4ge_ ma4geg ma4gek ma4gep ma4ges ma4get ma4gev ma4gew 2magg magi5er_ magi5ers ma5g6n 3mah ma3ha 2m1akt ma1la ma4l3akt ma2lan ma2lau ma3law mal3d ma3l2er mali3er mal3lo 2m1anal ma2nau 2m1anb man2ce mand4 man3ds ma2net 3mang2 4mangr m4anh 2manl 2mans\xc3\xa4 manu3 m2anw 2manz 2m1arb mar3g2 ma5ri 3m2ark 4mar4o maro3d 4marr mar3st mart2 mar5te ma3ru 3mas ma3s2p ma3sto ma3s2tr 3ma\xc3\x9f m4at ma2tab ma2tan mat4c ma4tel mat3sp 2m1auf ma3un 2mausg ma1yo ma3zu 3m\xc3\xa4 m1\xc3\xa4hn 6m1\xc3\xa4nd 5m\xc3\xa4nn m\xc3\xa41t m\xc3\xa4u4s3c 2m1b4 mb2a mbe2e mbe2n m3br 2m3c 2m1d md1ar m2d1\xc3\xa4 md1ei md3s2e m2d1um 1me meb6 me1c 2meco medi3 medie4 me3e2n meg4 mega5 3meh 2m1eif 2mej me3lant 3meld me2lek 2m1elf_ mell2 melt4 6m5eltern mel3tr 3men men3au me3nor m2ens men3st men6tanz 4m1entn ment6sc 4mentsp 4mentw me1o 3mer_ me1ra me2rab me2r3ap mer2e mer3ein me4r3ens 4m3erg\xc3\xa4n me5ric 3merin mer2kl 3mers mer3z4en 3mes me5si mes2sa messe4r mes2s1o mess1p meste2 me3ta mete2 me3th me5ti 3metr meu1 2mew 2mex 1m\xc3\xa9 2m3f mfan2 mfi4l 4m3g mge1 2m1h 1mi mi1ak mi1an mibi3e 3mi1c mi3da mi2e1i mi2er 3mig mi3gn mi2ki mi2ku mi3l2a 3mil4c milch1 mil4len 2m1imp mi1n2a mi3nal min2e min2ga ming3st mi3ni 3minik mi3n2o 3mirs mir5sc 3mirw mi2sa mise1 mi3sp mis2s3c mi4ste 3mi2t1 mit3es mit3s4 mit5sa mi5tsu 4mitz 2m1j 2m1k4 2m1l m3la m3le ml\xc3\xb63 2m1m m2m1ak m2m1ans mm1anz mma3s4t m2m1au mm1\xc3\xa4n mm1ein mm1eis mme2ra mmer3k mm1inb mm1ins mm1int mmi3sc mmi3s2t mmm2 mm3p mm3sp m2m3um mm\xc3\xbcl2 2m1n m4nesi m3ni 1mo mo4a3 2mobj 3mod mo2dr 2mog_ mo2gal 3moh mo2i moi5r mo2k1l 3mom m2on mo3ne mo4n1er mon2s1 mon4st mon3su mont4a 3mo2o 2mo1pe mo2per 2mopt mo1ra mor4d3a mo2rer morgens6 mo4sk mo3sp mo5s2ta moster4 mo3ti mo1y 3m\xc3\xb6 m\xc3\xb6be2 m\xc3\xb62c 4m\xc3\xb6k 6m1p mpf3erg mpf3erp mpf3err mpf3erz mp2fl mpf7l\xc3\xa4 mpf5li mpf1or mp3lu mp3ta mp3te 2m1q 4m3r 4ms m2s3an m4s1ap ms3as m2s1au m3se m6s1ef ms1erf ms1erw m4s1ex m3so m3spa m2sp\xc3\xa4 ms2po ms3s2 m2stal m1stec m1s2ti ms2tr m2str\xc3\xa4 m1s2tu m3s2t\xc3\xbc ms1um m2s\xc3\xbc m1sy 4m1t mt1ab mt1ak mt3alt m3tam mt1ar mt3are mt1ein m2t1erf m2t1erg m2t1erl m2t1ers m4t1ert m4t3eta mt1eu m2t1h m3ti m4t1im m4t1in mti2s mt1\xc3\xb6s mt2s mt3sc mts1e mt3s2k mts1p mt3spa mt3st mt4s3t\xc3\xa4 mt3su mt3t mt1um mt1urt mt3z 1m2u mu3a mu3cke 2m3uh mu3la 2muls m3umg 3mun mu3na mund3a mu3ne 4m3ungeb mu3no mu3ra mu5ru 5musk mu2s1o mu2s1t mu2su mut1au mut2s3 1m\xc3\xbc 2m\xc3\xbcb m\xc3\xbcl4len 3m\xc3\xbcn 3m\xc3\xbct 2m1v mvol2 mvoll1 2m1w2 mwa4 mwel4 1my my4s3 2m1z 6n_ 3na_ 2n1ab 3n4aba na3ber n3abh n2abo n3abs n3abt 4nabw na2c nach1 nach5s na3cke 1nade na2der 1nadi n3adr 1na1e n1af na1f4r 3nag 5n4ah na2h1a n5ahn n3aig n3air 1nais n1ak 3nako n3akt 1nal n4al_ nal1a2 na2lad na2l\xc3\xa4 3n4ald n6ale na4lent na2lin nal3k nal3l2a nalmo2 2nalo na2lop n4als_ nal5sc nal3t4 na2lu 2naly n6am_ 3n4ame 5na3me_ 5n6amen na3m4n 3namo 2n3amt n1an 2nan_ 2n3a2na n3anb n2anc 2n3ang4 2nank 2n3anl na3no 2nanr 2n3ans 2n3antr 2n3anw n1ar 3n4ar_ 2n3a2ra 1n4ard 3nare 3nari n2ark 2n3arm n2arr 2n3art n4arta na3ru 3nas na4schw 4n3asp n3asy 1nat 3nat_ na3t2h nats1 nat4sa nat6sc 2natt n1au 2nauf n3aug 5naui 1naul 2n3ausb nau3sc 2n3ausg n3ausl 2n3auss 2n3ausw nau5te 1nav navi5er_ navi5ers 1nax 1n\xc3\xa4 n2\xc3\xa4c 3n\xc3\xa4e 3n\xc3\xa4h n1\xc3\xa4hn 2n1\xc3\xa42m n3\xc3\xa4n n\xc3\xa4r4s 2n\xc3\xa4s n\xc3\xa44sc 2n\xc3\xa4u 4n7b4 nber2e 4n1c nc5ab n3cen n3ces n3che nch3m n3chu n2ck 6n1d nd1ab n3daf nd4ag n2d1ak n4dakt nd1ann n2d1anz nd1arb nd1arr nd1art nda3ru n2d1au n3de_ nde3alt nd1ei nd3ei_ ndel4st n3den nden3sk n4d3ents n5der_ n5deri nde2ro nder5ste n3des_ nde4se n3dest ndi2a ndo3c n2d1op ndo3st nd3rat n2d3re n4dres nd3rob nd3rol nd3ros nd3r\xc3\xb6 n4drui n4d5run nd2sor nd2spr nds3tau nd2sum nd3te nd1th nd1t4r n2d1und n2d\xc3\xbc 1ne 3ne_ ne2a ne3an ne3as ne3at ne3au ne2bl 2n1ebn 2nec 5neca 4nech 2ne2e1 neei6 ne3en nee3t n1ef 3nefe 4neff ne3g6 3n2eh n3ehe 4ne2he_ 6n3ehr 2n1ei 3nei_ n2eid 4neif 3neigt 5neigu 4n3eing ne2k nek3t ne2l nel3b 4n1ele ne3len ne3li nel4la 3ne3lo ne3lu 5n2em_ 2n1emb nem2e n1e2mi 2n3emp 2n1ems 3nen n2en_ ne2n3a 4n1endb n1endg 4n1endh 4n1endu 4n1endw ne2n1e2b nen3ei ne4nene nen3erb 4nengu nen3k ne2no nen5s4e 5n2en3ta n1entb 4n1entn nen2tr 4n3ents 4n3entw 4nentz ne2n1u n2env ne1op ne1os ne4p3f 2nepo ne2pos n2er_ ne1ra ne5r4al ne2r3am ne2r3ap ne2rau 2n1erbi ner5eier 2n1erf 4nerfo nerfor4 4n3erf\xc3\xbc n3erg 2n1erh 4n3erh\xc3\xb6 3ne3ri n1erk n3erm\xc3\xa4 2n1ermo 2n1ernt ne1r\xc3\xb6s 2n1err n2ers_ 4n3ersa 3n4ert_ 2n1ertr ne2rup 4n1erwa 4n1erz 3n2es n4es_ ne2s\xc3\xa4 nes4c 4nesia nesi1e 4ne3s4k ne2s1o ne2s1p 4n3essi 5ne2st ne3sta ne2t1an ne2tap ne2t1au ne2th ne2tre nett6sc 2n3e2tu ne2u neu3c neu3g 2neup 5n2ew 2n1ex 3nez 1n\xc3\xa9 4n1f nf1anb n3f\xc3\xa4 n3f2er n5fi nfi3le nf5lin n3f2o nfo3s nft4s3 4ng n2g1ac n2g3ad nga4ge n2g1ak n2g3a2m ng1anz n3gap n4garb n3gas n3g\xc3\xa4 n4g1\xc3\xa4l ng1d4 n4g5ein nge3le n5gen nge5nerw nge4ram n4g5erse n5ges6 ng5hu n2glan ng3lo ng3l\xc3\xb6 ng3lu n4gm ng3ne n4g1or ng3rat ng3r\xc3\xa4u ng3rein ng4sc ng4s3e4h ng4spo ng5s4tel ng3ts n2gue 6n1h n3ha_ n3har n3hau n3h\xc3\xa4 n3he nhe2r n3ho 1ni 3ni_ 3ni4a ni5as ni3ba nib3b 2nid ni2de ni3de_ n2ie nie3b4 ni1el nie3l4a nie4n ni3fa nifi3 3nig nig2a 4n3i4gel ni2g3r nig4s5p nik3ing ni3k4l ni2kr ni3lo n2imm nim2o 2n3imp 2n1in 4n3ind 3ning 4n3inh nin1i n2ins_ 4n3inse n3int n3inv 3nio ni3ok ni3ol ni3os 3n2is ni4schw ni4s1e ni5se_ niso2 nis3s2 nis3th nis3tr ni2s1u 2nit ni1th ni4ti ni3t4r 2n1j 4n1k n2k3ad n2k1ak n3kal n4k3alg nk3anz nk1apf nk1arb nk1arm nk3arti nk1aus n2k1\xc3\xa4h n2k1\xc3\xa4r n3ke nk1ein n4k3erfa n2k1id nk1inh n2k1ins n3kir n3kla nk3len nk3les n2kli nk3lie n3klin nk4lu nk5lun n2k3ne nk3nor n3ko nk1ort nk3r\xc3\xa4t nk3rede n3kri nk3ro nk4sal nks2ei nk2spa nk3spo nk2ta nk4t3it nk4top nk2t3ri nk2tru 4n3l 4n3m6 nmen2 4n1n nna2b n2nada n2nan nn2ar n2nau nn3d n3n2e nn3ein n4n3eis nn3ele nne2r\xc3\xb6 nn3erwa nn3erz nne4s nnes1e n5neu nn3f nn3g n3n2i n3no3b nn1o2r nn3se nn3s2p nn3ste nns2tr nn4th nn1ur 1no 5no_ 2nob no2bla n2oble 3noblo n3obs 3noby no1c 2no2d no3dr 2n1of no2fe 4n3o4ke no2leu n4om nom4e n2on_ no3n4a 2nonk 3n2opa 2nopt 2nor 3nor_ no1r4a nor2d3r 3norh 3nors n1ort 3n2os_ no3sh 3n2oste n1osth no5tab no2t\xc3\xa4 no4t1ei no5th no6tha no2t1op no2tr 3nov 4n1o4x 2n\xc3\xb6d 2n1\xc3\xb62f 4n1\xc3\xb6l 4n5p2 npir5 npsy3 2n3q 4n3r4 nre2s3t nre3sz n5ru 6n1s ns3ab n2s3ad ns3ak n4s3all ns1an n3sand ns3ans n2s1ap ns3art ns1au ns3auf ns3aus n2s1\xc3\xa4n n2s1\xc3\xa4us n6schlic n3schr n4schro nsch7werd ns1e2d n3sem nsen4sp n2s1ent n2s1e2p ns1erf n2s1erg n2s3erh n2s1erk ns1erw n3sex ns3ha ns3he nsho2f ns1id n2simp ns1ini ns3int n3s2kal ns3ki ns3ko ns3ky ns3l ns3m ns3ob n2s1op nsp4 n3spal ns6pei ns3ph n2spr\xc3\xa4 n2spro nsr\xc3\xbc2 ns5s4 n5stad nst1ak n5star n4s3tate n5stati ns2t1au n2ste n3stei nst3eif n3stel n4stem n3step n5s6terbe n5s6terne n5s6terns n5steu ns2tie n5stif ns2tin ns2to n3stoc nst3ort n4strie ns2tu n4s3ty n3suf ns1uh ns2um n2s1un n3sung ns2unr ns3w 4n1t nta3c n3t4al ntal1a nta3m nt2an nt3ang nt3ant n3t2arb nt1ark n3tarz nt4at n2t1auf nt1\xc3\xa4m nt1\xc3\xa4u n3te nte3a nte5au n5t4eb nte1e nte3g6 nt1eh n4teig n4t1ein ntem3p4 n5t4en nten4te nt5ents n5t4er nte3ru n4t5ess nte3v n2th n3the nt1hi nt1ho n3t2hol n5t4hu n3ti nti3c n4tinf n4t1inh ntini1 n5ti3t ntmo2 n5to nto5me nton2s3 n3t\xc3\xb6 nt3rec n5tree nt3reif n5trep nt3rin n5trop nt3r\xc3\xbc nt3sa nt3s2o nts2p nt4s3par nt5sta nt3t n3tu nt3z2 1nu nu1a nu3ar nubi3 2nu1c 3nue nu2es nu3et nuf2 nu2fe 2n1uh nu3k4 n2um_ 2n1umb 2numf 3numm 2numr 2n1um1s 2numz nu4n n1una 2n1und 3nung_ n1ungl 2n1uni 2nunt 2nup 2nur n2u2s nu3sc nu3se 3nut nu2t1a nu5te nu2t3r 3n\xc3\xbc_ 2n\xc3\xbc2b n\xc3\xbcr1c 1n\xc3\xbct 4n1v2 n3vi 4n3w 1ny_ 2nymu n1yo 1nyr 1nys 1nyw 4n1z n2zad n2zan n2z1au n2z\xc3\xa4n n2z1\xc3\xa4r n2z1ec n4zense n4zentz n3zep nz3erha nz3erwe nzi2ga nz3imp nz1of n2z1or nz3th n2z3wa n2z1w\xc3\xa4 nz1wer nzzol3 \xc3\xb1o1 4o_ 2o3a2 o5abs o4ac oa3che oa3chi o4ad oa3de o4ah o4a3i oa3ke oa4kl o5al o6a3la o4a3mi oanne4 o4ar o4as oa3se o4at o1b 2oban 2o3b2\xc3\xa4 2obb ob2e 2o3be_ ob3ein 2oben oben3se o2ber ober3in obe4sp 2ob2i 1obj ob1l ob3la o2b3li 2oblo 1obm 2obo o3bra o2b3re ob6ri ob3ro ob2s2 ob3sh ob3sk ob3so ob3sp 2o3bu 2ob\xc3\xbc 2oc o3ca o1ce och1a ocha2b o1che o2ch1ec och1ei och3l och5m och1o och1\xc3\xb62 och3r och5te och3to o1ch2u och1w o1ck ock2e o3cki ock3sz o1cr o1\xc3\xa7 2o1d od2dr o3deb o3de3i ode2n oden1e odes1e ode3sp o3dex o3dir 4odr o2dre 4o3du 2o1e2 o2ec o3en1 o2es oe3t o3et_ o3ets o1\xc3\x8e 2ofa of3am o2f1ei of2en o3fer ofes3 of2f1a of2f1in of2f3l of2f3r of2fu 2ofi ofi3k of3l of1la of5li 2ofo 2o1fr of3ra of2s of4s3a of4s1p of3st 2oft of2tei of3th 2o1g o2g1ab og3ala oga4t3 o2g1au o4g5ei o3gh ogi2er o2gl o3glo o3g4n ogs4 og3sp o1h4a o1h\xc3\xa4 o1he o3he_ oh1eis o3heit o3hem o3hen o3her_ o3here oh1ert oh1erz o3hes o1hi ohl1a ohl1ei oh3lem oh3len oh4l3erh oh3li oh3lo ohls2e oh2lu oh3m 2ohn ohn3a oh2ni 3ohnm o3ho o2h1\xc3\xb6 ohr1a oh4rin oh1s oh3ta o1hu oh1w o1hy 2oi o1i2d o3ie o1im o1in oi4r o2isc o3isch_ o1ism oi1th 2o1j 2o1k oka3i oka2la okale2 ok2e o3ki oki4o ok3lau ok3l\xc3\xa4 okna3 ok2s1p okt2 2ol o1la o2lab o2l1ak ol1ant ol2ar olars4 ol1auf o1l\xc3\xa4 ol4d5r ol1eie ol1eis o1l\xc3\xa9 ol4fa ol2f3l olf1r ol2fra olf3sp ol2gl ol2gr olib6 oli5en oli5f olik4 ol2kl ol2k3r olk4s ol2lak ol2l1au ol2l1ei ol3ler ol4l3erk ol3lo o3lo o5lof olo3p2 ol1ort o1l\xc3\xb6 ol2pr ol2str o3lu olu2th ol2z1a ol2zin olz3w 2om om1art o2m1au ombe4n o3me_ o2meb ome3c o2m1ei o3m2eis o2mel om3ene o2mep o2meru om1erz omie4t1 o2m1ind om3ing om1int om3ma om1org om3pf omp6l oms2 om3sp o4m3un 2o1n2a on3ab o2nae on3ak o3nal on3ap o2n3ar o3nat on3aus 2o3n\xc3\xa4 onbe3 2one on4eh onens2 onen3st o2n1erb on1erd on1er\xc3\xb6 on5f 4ong4 on3gl ong5sc 4o3n2i o5ni_ oni3d o5nik o4n3im on3ing onli4 onlo2c on3nan onn4e o3no3 ons3a onsa2g onse2l onsi2 ons1p on3ta on6t5end ont5erw on2t1ri on5v 1ony o1o2b oof4 oo2k ook3l o1op o1or oo2tr oot2st 2o1\xc3\xb6 o1pa opa1b4 opa3u4 o1p\xc3\xa4 o1ped o1pei o1pen op2f1a opf3l op1flu op1fl\xc3\xbc 4oph2 o1pi opi3er_ opi5ers_ opin2 op3le op3li 2o3po op4pl 1oppo op2pr 2o1pr 1opsi op3sz 1opt4 op3tr o1q 2or_ or1a or3a2b o1rad 2orak o2r3alm o2r3alp o2ram orani1 or3arb or5att o2rau o3r2\xc3\xa4 or3\xc3\xa4nd or3\xc3\xa4t orb4 or2bar or1c 2orca or2ce 4or2da ord3am or4d3eng or2deu or2d1ir 1ordn or2do ord3s2t 2ordw 4ore ore4a o2r1eck o2r1ef ore2h or1eig o3r\xc3\xa9 orf3ein or2fle or3g4a 2orget 2orgia or2g5l or3gle or4gn 2orgr 2orh o1ri 4o5ril 2orin or1ins 2orit or3k2a or4k3ar ork2s 2orm or2mor or3na or5ne_ or3no orn3st o1ro 2o1r\xc3\xb6 2orq or3rh 2ors2 or5sa orsch5li or3sz ort3an or2t1au ort3eig ort3ein or4tem or4tent or4t3ere or4t3erf or3th or4the or4t3off or2t\xc3\xb6 ort3rau or4t3r\xc3\xa4u ort3re ort3ric ort5sch or2t1um o3ru o4r3un o5rus or3\xc3\xbc o1ry o3s2a os3ad os4an osa3s os4co 2o3se ose3ei o4s1ei ose2ne os4er os2hi o3sho 4o3s2i osi3tr o3s2k os3ka os3ke os3ki os2lo o2s3p o4sper os4po os4pr os2sa os4s\xc3\xa4 os4sei os4s3enk os4s3o os4s3p os4st oss1ta o2st os4ta ost1ab ost3all ost3am ost3ang os5tarr os2t1au o3stei oste2n oster3e os6t5er6we os4t1h os3til o6s1to ost3ran ost3rat ost3r\xc3\xa4 ost3re ost1uf osu4 o1sy os2ze o2\xc3\x9f1el o2\xc3\x9f1enk o\xc3\x9fe2r o2\xc3\x9f3ere o2\xc3\x9f1erf 2o1t o5tari o3tark o5tat o2t1au ot1\xc3\xa4r 4ote o2teb o3tei ote3in_ ote3ins ote4l1a ote5ner o2t1erw ot2he ot3hel o6t1hi o4thr ot2i ot3im otli4 4oto ot1opf ot2or o3tra o2t3re o2t3ri ot3se ot3s2o ot2s1p ot2tau ot3te ot4t3erk ot2t3r ott3se ot3z2e 2o2u oub4 ou2ce ou3e ou1f6l ou4ge o3uh ou4le_ o3um oun4ge_ ouri4 our2ne ou5s2i outu4 2o1\xc3\xbc o1v ove3s oviso3 o3vo 2o1w o3wec owe2r1 o1x ox2e o2xu 1oxy o3xy_ o1yo oys2 oy1st 2o1z2 o3zi ozon3a \xc3\xb4r3 \xc3\xb61b \xc3\xb6be4li \xc3\xb62ble \xc3\xb62b3r \xc3\xb6b2s3 2\xc3\xb61c \xc3\xb64ch3l \xc3\xb62chr \xc3\xb6ch2s \xc3\xb6chst3r \xc3\xb6chs4tu \xc3\xb61d \xc3\xb6de1r \xc3\xb6di3en \xc3\xb62du \xc3\xb61e \xc3\xb6f2fl \xc3\xb6f5l \xc3\xb6g3 \xc3\xb6ge3le \xc3\xb6gen4s1 \xc3\xb62gl \xc3\xb62gr \xc3\xb6g4s \xc3\xb6g4u 2\xc3\xb6h \xc3\xb61he \xc3\xb6h3m \xc3\xb6h1ri \xc3\xb61hu \xc3\xb62k \xc3\xb63ke \xc3\xb6ko3 \xc3\xb6k3r \xc3\xb66l 3\xc3\xb6l_ \xc3\xb6l1a \xc3\xb6l1ei \xc3\xb6l1em \xc3\xb6l2fei \xc3\xb6l1im \xc3\xb6l1in \xc3\xb6l2k3l \xc3\xb6l4nar \xc3\xb6l1o2 \xc3\xb6ls2 \xc3\xb6l1st \xc3\xb6l3sz 2\xc3\xb6n \xc3\xb6n2e \xc3\xb63ni \xc3\xb6n2s \xc3\xb6n3sc \xc3\xb6o1 \xc3\xb61pe \xc3\xb6pf5l \xc3\xb6p2s3t \xc3\xb6r3a2 \xc3\xb6r1c \xc3\xb6r2dr \xc3\xb62r3ec \xc3\xb62r1ei \xc3\xb62r1e2l \xc3\xb6r2erg \xc3\xb6r2f5l \xc3\xb6r2gl \xc3\xb61ri \xc3\xb62r1im \xc3\xb6r2kl \xc3\xb6r1o2 \xc3\xb6rs2e \xc3\xb6r3sk \xc3\xb6r2st \xc3\xb6r5t2e \xc3\xb6r2tr \xc3\xb61ru6 \xc3\xb62r1une \xc3\xb62sa \xc3\xb62sc \xc3\xb6sch3ei \xc3\xb6sch1w 2\xc3\xb6se \xc3\xb62s1ei \xc3\xb62sp \xc3\xb6s4s3c \xc3\xb6s2st \xc3\xb62st \xc3\xb6s3te \xc3\xb6s1tr \xc3\xb61\xc3\x9f 2\xc3\xb61t \xc3\xb64t3a \xc3\xb63te \xc3\xb6t2sc \xc3\xb6t2tr \xc3\xb61v \xc3\xb61w \xc3\xb61z \xc3\xb6ze3 \xc3\xb6zes4 4p_ p4a 1pa_ 5paa 3pack pa3da pa1fra pa3g2 pa1ho 1pak pak2to 1pa1la palat5 1pal\xc3\xa4 2palt pan3d pan4ds pa2neu pan3k4 pans4 pan3sl 3pan3z4 3pap papie8r7end 1parad 1parco pa5reg pa3r2er 1park_ par4kau par4k3l 1pa2ro par5p4 1partn par3z pa4s pa5sa pa5sc pa5se pa5si pa5s2p pa5str pa5su 2pa\xc3\x9f pat4c 1pat4r 1pau3 p5auf pau4st p\xc3\xa42 p\xc3\xa43cke 1p\xc3\xa4d p\xc3\xa43de p\xc3\xa43\xc3\x9f p\xc3\xa46t1e2h p\xc3\xa4t1h p\xc3\xa4t5s 2p1b 2p3c 4p1d pda4 1pe_ pe4a pea4r 1ped4a peed1 2pef pei1 pe1im 5peit 4pek pekt2s 1pel pe2l3a6 pel5d pe2let pe3lin pe4l3ink pel3l2e 1pem pen4al pen3da pe4nen 3pensi pe2nu pen3z4 pe1ra per4an pere2 per4na per4r3a 5pers perwa4 pe3sa pes5s2 pe2st 3pet 1p\xc3\xa9 2pf 4pf_ p2f1ab p2faf p2f1ak pf1ans p2fa6r pf3are p2f1au p2fei pf1eim pf1ein p2fent p3fer_ pf2erw pff6 pf5l\xc3\xa4 pf3lei pf3li pf5lie pf3lo pf3l\xc3\xb6 pf3lu p2for pf3r pf1ra pf1ri pfs2 pf3sp pf3sz pft2 pf3th 2p1g pgra2 1ph 6ph_ ph4a 4ph\xc3\xa4 2phb 2p1hei 2ph1ers 2phf 4phg phi2ka 4phk ph2l 2ph3m 2phn p3hop ph4r 2phs 2ph5t2 4ph7the phu4s 2p1h\xc3\xbc 2phz pi4a5 pi2e pi3en 5pier pi3gn 1pil pin2e 3pinse pi2o pi2pe pi5ri 1pis pit4a pi1th pit2s p1je 2p1k4 pku2 pkur1 1p2l4 4pl_ 3p4la p5lad plan3g 3pl\xc3\xa4 2ple_ ple1c ple4e ple3n 2plerm p5lic p5lif 4plig p4lis p4lo 2p1m 2p1n 1p2o po1c po2i po3id 3pol po2lau po2p5ak po1pe po2pl po3pt po1ral 2porn por3s por4tra por4tri po5s2e po3sp po4st post3ag po6ste pos4tr po3ta 3pote pot2h po2t1u po2w po3x p\xc3\xb62bl p\xc3\xb62c 4p1p p2p5ab ppe1e ppe2n1 pp1f4 p2p1h p3p2ho p2p3l p4ple pp4li p2p3re p2pri pp3sa pp3sp ppt2 pp3ta pp3to p2r4 3prak 3prax 1pr\xc3\xa4d 3pr\xc3\xa4m 3pr\xc3\xa4s 4pre_ 2prec 1pred pre2e1 1prei 2p3rer 3pres pri4e 1prinz 1priv 1pro 3prob pro3be 2proc 3prod 3prog 3proj pro3st 3prot 1pr\xc3\xbcf 2pr\xc3\xbcn 2ps 4ps_ ps2a3n p3s2h p2s1id p2s1\xc3\xb6 ps2po p1stea p1s2ti ps2tu 3psy ps2ze 2p1t p2t1a pt3alb pt3am pt3as pt3at5 p2t3ec p2t1ei p4t1ent pt3erei p2t1erw p2t1erz p2t1h p3ti p4t1in pto5me p2tos p2t3r pt5re pts2 pt3so pt3sp pt3su pt3t pt1um pt1urs p2t\xc3\xbc 3p2ty pt3z2 1pu 3pub4 pu2dr 3puf 2p1uh pu3la 3pulv 3pum 3pun 4pund pun2k pun2s 3pup pu2s pu4s3t 3put put2s 1p\xc3\xbcf 2p1v 2p1w pwa4r 3py1 py3t 4p1z q2u4 que3rel quer5n 4r_ 1ra_ 2r3aac r3aal ra1ar r1ab rab2bl 2rabd ra3ber 2rabf ra1bl rab4le ra2bli rab5r 2rabs 2rabt 2r3abw 1raby ra1ce ra3che_ ra4cheb ra3chen rach4t3r ra2chu r2ack 2radap 3radf ra3di ra4d3r 1rae ra1er r2af raf3ar ra2fer raf1r ra2ga ra5ge ra3gle ra4g5n ra3go r2ahm 2raic rail4l r3air 3ra1k4l ra2kro 3rak\xc3\xbc r4al_ rala2 ral3ab r3alar ral3b 1r4ald 4r1alg rali5er_ rali5ers rall2e 2r3alm_ ra2lo ra3lop r4als r3alt ra2lu 3raly ra3ma ra2mer ram4man ram6m5ers ram4m3u r3amn ram3ste 4r3amt ramt6s r2an_ 2rana 6ranc r2and r4anda r4ande ran4d3er 2r3anf r3angr 4r3anl 2r3anm 2r1anp 2ranr 2rans r4ans_ ran3skr r2ansp ran4th 2ranw ra1or r2ap 2rapf 2r1ar ra4r3in r2ar3k r4as_ ras4a ra3sp 2ra\xc3\x9f 1r4at ra2t1a ra4t3\xc3\xa4 ra5te 2ratta 4rau_ 3raub_ rau2br 4raud rau3en 2rau2f 2raug rau4m3ag rau4man rau2mi ra3umsa 2rausg rau4sp raus5se rau2th raut5s r2ax r2\xc3\xa4d 4r\xc3\xa4f 4r\xc3\xa4g r\xc3\xa43gn 4r\xc3\xa4h 2r\xc3\xa4m 3r\xc3\xa4n_ 3r\xc3\xa4ni 2r1\xc3\xa4r r\xc3\xa44s3c 4r\xc3\xa4ut 2r1b rba2l3a rba3re rb5art rb1auf rb3b4 rb1ech r2b1ent rbe3r2e r3bla rbla2d rb7lasser r4b3last r2ble_ rb5ler rb2o rb6ri rb2s rb4sei rb3ska rbs1o rbst3a rb4st\xc3\xa4 4rc r1ce rcha2 r1che_ r1chen r1chi rch3l rch3m rch3r rch1s4 rch1w r2ck r1cr 2r1d rd1ab rd5achse rd3al r3dan rdani1 r4d1ant r2danz rd1arb rd1ei r2d1elb r2d1e2le r3den rde3nar r5der_ rde3re rd3ernt rde3sp rde3sta rd1ira rd1iri r2d1it r3don rd1os rd1\xc3\xb6s rd3rat rd3rau rdt4 rd1th rd1tr rdvi3 1re 3re_ re3ad rea5g re5aler re4am re3as re2b1a re2b3l reb1r re4b5ra re2b\xc3\xbc r2ech rech3ar 4rechs 3rechte 2reck_ 3rede_ re1el re2en re3er 5refe 2reff 5refl 5refo 3reg 5reg_ rege4l3\xc3\xa4 4reh re2hac re4h3ent re4h1o r2eie 2reig rei5ge rei3l2a rei5mu r1ein re1ind 4reing 4reinn 4reinr rein6sta rein8s7tre re1in2v 2reis_ re2ke re3la 2r1elb re3lei 2r1elf re3lo 2r1elt relu2 r2em re3m4a 4rempf rem2sp 4remu r2en_ r2ena re1nad re3n\xc3\xa4u 3rendit ren3dr ren4gl 2rengp ren3sa ren4sei 2r1entl 2rentn 2r1ents 2rentw 2rentz r2enz re3or 5repe 5repo 3r2er_ re2ra 2r1erb r2erbr 2r1erd 3rere 2r1erf r1erg r1erk 4r3erken 2r1erl 4r3erla 5rerlag 2r1erm r1ern\xc3\xa4 4r3erns 4r3ernt 3re1ro r1er\xc3\xb6 3r2ers_ 2r1ersa r2erse 2rersp r1ert r2erte 2rertr 2r1erz 3r2es_ re2sa res1au 3rese re3s2p 2ress ress2e res5sei 3resu 2reta re2u reu3g2 2reul re3uni 2r1eur r1e2w 2rewa4 re3we 4r3e2x1 3rez 4rezi 1r\xc3\xa9 2r1f r3f\xc3\xa4 r2fent rfi4le_ rfin6s rf5lic r3fl\xc3\xbc r3f4re rfr\xc3\xb65 rf2s rfs1\xc3\xa4 rf4s1id rfs3pr rf3sto rf2ta rf3tau rft4r r3fu 4r1g r2g1ah r2g1ak rg2an rge4an rge2bl rge4ral rg5e4tap r4geto rgi3er_ rgi4sel rg4l r3gla r4glan rg6lei r4g5leu rg5lo r4g5lu r3gn rg2ne r4gno rg1ob r2greg r2g3res rg3ret rg3rin rgs2p rg3str rgt4 rg3th r1h4 2rh_ 2r3ha r4ha_ 2r3h\xc3\xa4 3r4he_ 3r4hen r3hof rho2i3 2r3hol 2rh\xc3\xb6 2rhs 1r2hy ri3am ri1an ri3at ri1ce ri1cha ri3chl 4rick rid4 ri2d5an 2ridol ri1el ri3els ri4em riene4 ri3eni rie2nu ri1er_ ri4e3re ri3ers_ ri1eu ri2fa ri2f1ei ri2fer ri2f1o ri2f5r rif3st rif4ter 3r2ig ri4g5ene 4rigg 5rigj 7rigk 4rigr r2ik ri3kle ri3le ri3ma r2imb ri2met 2rimp rim2s ri5n4a r1inb 2rind r2inde ri5n4e rine1i 2r1inf rin2g3l rin2gr 4r1inh r3init 2rink 1rinn 4r3inner 2rins 3r4ins_ 4rinse r4inspi 2rint rin2t5r 4r1ir r2is ris4a ri4scho ri4schw 3risik ri3so ri4s1p 3riss ris4sa 4rissi ris4st ri4st r2it r3i2tal ri5ti ri3t4r 5ritu ri2x1 1r\xc3\xad 2r1j rjo1 2r1k r2k3ad rk3all r3kla rk4lo rk4lu rk3nor r2k3nu rk3rau rk3r\xc3\xa4u rk3rea r5kri rk3rin rk2s1e rk3sen rk3shi rk2sp rkstati6 rk4stec rk2ta rk4t3eng rk4t3erf rk4t3erw rk2tin rk2t1o2 rkto4b rk2t3r rk3tra rk4tre r2k1uh rk2um rku4n rk1uni 2r1l r3la rla5m rle2a r3l2i rli2s rl\xc3\xb6s3s rl2s1p rl2sto rl3th r5lu 4r1m r2m3ald rm3anz rma2p r2m3aph rm1arm rm1aus r2m1ef rmen2s r2m1ide rm1ope rm1o2ri rmo3s rmt2 rmt3h rm3ums 4rn r1n2a rn3a2b r2n3anz rna4r rn5ari r2n3au rn4aue rnd4 rn3dr r3ne r4nef rn4eh rn2ei rn3eif r4n3eis rne2n r4n3ene r4nerf r4nerg rn4erhi r4nerk r4n1ert r5nes rn4et r4nex rn1g r3ni r4nin r3nod r2n1op rn1or rn1\xc3\xb6 rn3s2\xc3\xa4 rn3s2z rn5t2e rn3th r1n\xc3\xbc r1ny ro5ar ro5as ro4bei 2robj 1robo ro2br ro1c 3rock_ r4o3de roe4 ro3et 2rof roh1l 3r2ohr 1roi ro3in ro3le roll4en 2roly ro2mad ro2mer 4romm r2on 3ronn ron4tan ro1ny ro1pe 2ropf ro5ph rop2s r1or r2ora ro2rat ro3rau ro2r1o ror5th ro1s\xc3\xa9 ro3sh ro5si ro5sk ro3smo ro3sp ros4s3c ro3stu 4ro\xc3\x9f ro4ta ro3tu 3rout ro3z r\xc3\xb63ch r1\xc3\xb6f 4r\xc3\xb6g r1\xc3\xb6k r2\xc3\xb6l r\xc3\xb67le r1\xc3\xb6r r2\xc3\xb6s_ r\xc3\xb64s3c r\xc3\xb63se 2r3p2 rpe2re rpf4 r5p4fl r4pli rpro1 r4ps rp3se r4p3t r1q 2r1r r3r2a rr1amt r5r\xc3\xa4 rrb6 rr1c r3r2e rrer4s rre2st r4rew rr2h rr3h\xc3\xb6 rri3k2 rr2o r2r3ob rro3m rr2st r3ru r5r\xc3\xbc rr\xc3\xbc1b 4r1s r2s3a2d r4s3amt rs1ang r4s3ar r3sc r5sch2e r6scherl rsch4l r5schu r3se rse4ne rs3ere rs1er\xc3\xb6 rs1ers rs1erz r4sex r3sho r5si rs2ka r5skal rs3kat rs2kie rs2kis rs2kl r4sko r4skr r4sku rs3l rs4no r3so r4s1op r4s3ort_ r3s2p rs5s2 rs2t rs4temp rs3ter r3s4terb r3stie r2stin r3sto r4stot r3str r4st3ran r3stu r5st\xc3\xbc r3s2wi r3sy rs2zen r4szi 4r1t r3tab rt3aben rt1abs r2t1ac r2t3ad rt2akt rtal2 rtals1 rt3am r2t1an r2t1ar rt3a6re rt3att rt1auf r2t1\xc3\xa4r r3te r5te_ rtee2 r5teh rt2ei rtei3la rtei3s2 rte5m2e rte2n1 rtens2 rten3st rte1ra rte4ran rt3erei r4t1erh r4t1erk r4t1erl rter4re r4t3ersc rte3s4k r2th r4tha rt1he r4t1hi r3tho rt1hol r3thy r3ti rto3p r2t1o2r rt4rad rt5rak rt3rec r2t3res rtr\xc3\xbc2 r4ts rt4sam rt3sc rts1pa rt2spr rtt4 r2t1urt r3t\xc3\xbcn rt5w r3ty rt3z2 rtz4w ru1a ru3a2r rube2 ru3che ru3cker ru2cku ru2dr 3ruf ru2fa ru3fe ruf4s rufs1p ru3ga 2ruhr 5ruin ru1ins ru1is 2rum 4rumf 4ruml r2ums_ ru4n r1una run2d1a run4d3er 2rundz ru5ne 2r1unf 2rungl 2r1uni r1unm 4runn ru5no 2runs 4runt ru3pr 4r1ur r3u2r1e ru2si rus2s1p rus4st ru4st ru2t1h ru2to ru2t3r rut2s 6ruz ru2z1w r2\xc3\xbc 4r\xc3\xbcb r\xc3\xbc1ben r\xc3\xbc1ch 4r\xc3\xbcg 4r\xc3\xbcmm 2r1v 2r3w 2r1x ry2c 2r1z rz2a rz3a2c rz4ach r2z3ar r2z3as r2z1eng r2z1erf rz1erg r2z1erk rz1erq rz1id r3zof r2z1op rz1or r2z1os rz5te rz4th rzu3gu rz1urs rz1wa r3z2w\xc3\xa4 r3z2wec 6s_ 1sa 5sa_ 3s4aa 2s1ab sa2be 3sabet sa1b4le 4sabs 3s2ac 5saca sa1cr 2sada 2s3adr sa3fa sa4fe 4s3aff sa1f4r 3sag s3a2gr 5s4ai sa1ik sail4 2s1ak sa2ka 3saki s4akr 4sakt 3sal sa1la 5s4alo 4s3alt 5s4alz 3sam 5s4amm 6s5amma 4s3amp s2an_ 2s1a2na sa3nat 2s3anb san2c s2and san4d3ri 3sang_ 2sanh 5sani 2s3anl 2s1anp 2s1ans san3sp 4s3anw s3anz sa2po 2sapp 3sapr 2s1ar 3sar_ 3sara 4s3arb 3s2ard s4are 3sari s3arm 3sars 4sart s3arz s3a4sp sa3stu 3sat sat2a 4s3ath 4s3atl 4satm sa2tr 5satz sat4z3en 3saue 2sauf 4s3aufb 3saum 3saur sauri1 2s1aus s4ause s1au\xc3\x9f sa2vo 3s2ax 1s\xc3\xa4 3s\xc3\xa4c s3\xc3\xa4hn 3s2\xc3\xa4l 2s1\xc3\xa4m 2s1\xc3\xa4nd 5s\xc3\xa4nge 2s1\xc3\xa4r 3s\xc3\xa4t 3s\xc3\xa4ul 2s\xc3\xa4u\xc3\x9f 4s5b6 sba4n sber2 sbe3re sby5 1s2c 2sc_ sca2 4scar 4s3ce 6sch_ 2schak sch4al 5schanz 6schao 5sch\xc3\xa4 6schb 4schc 3sche s4che_ 4schef sch3ei_ 5scheib 4schemp sch5erla 4schess 4schex 4schf 4schg 2schh 3schi s3chia schi4e s4chim 4schk 4schle_ 6schlein 4schmus 4schn_ 5sch\xc3\xb6 6sch\xc3\xb6l 2schp 4schre_ sch5rom 6schs schs4e sch3s2k sch3sti 6scht sch3t4a sch5te 3s4chu 4schunt 5sch\xc3\xbc 4schz 2scj 4scl 4sco 5s4cop 2scs 2scu 6s3d sda3me sde3s 1se 3se_ se3a 4s1e2ben 2sec s1echo sech2s 4s1echt se2ck 5secl 4sede 5see se2e1i4 se1er 3sefa 3seg se2gal se2gl seg4r 3s2eh se2h1a4 seh3ag se3he se4h3erk se4hin seh1l seh3re seh1s se2h\xc3\xbc 2s3ei_ 3sei3b 4s3eig s1ein 7s4ein_ 4seinb sei5n2e 2seing 2s3einh 2s3eink 2seinl 2s3einn s4eins_ 4seinst 4seint 2seinw 4seis 5s2eit 5sek 3s2el_ se2l1a6 sel3ag se3lam se2l1ec 4selem sel3erk se4l3erl sel3ers s1elix 3seln se4l1\xc3\xb6 3s2els sel3sz sel3tr s4e3ma 4s1emp s2en_ 3s2ena se3nac se4nag 4s1endl se4n1ec se4ners 5s4eni 3senk 3s4ens s2ent_ sent4a 4s1entf 2s3entg s2enti 4s1ents 4s3entw 4s3entz se2n1u seo2 3seq 5s2er_ ser3a2d se2r3al se3ref 4s3ereig se4r3eim se4r3enk ser2er 4s3erfo 4s3erf\xc3\xbc ser5g s2ergr s1erh 4serh\xc3\xb6 3seri s1erm\xc3\xa4 s1ern\xc3\xa4 4s3ernt se1rol se1rot s4ers_ 2s1ersa ser5sk seru4 se4r1uf se3rum 5s2erv 4s3erwei se1stu se3su 3set 4s3e4tap se2tat 4s3e2th se1u4n 2sex 5sex_ 4sexa se2xe 4sexp 4s3f4 sfi3le 4s3g4 sge3s4a 2s1h 3sha_ sha2k 4shan 1shas s3h\xc3\xa4 sh2i 3shi_ 3shid 1shi4r sh1n 4shof 3s4hop sho4r shor4n1 shorn3e 3show s3h\xc3\xb6 sh4r s3hy 1si 5siak si3am_ si3b4 3si1c s2ide_ si2deo s2ido 3s2ie si3ene si3err sie2s 3si1f6 3s2ig si3g6n si2g3r sig4s si2k1ab si4k3erl si2ki siko3b si4kr sik3t4 si2ku 3si3lo si3n4a 4s1ind 6s1inf sin2g1a sin3gh sin3g6l sin2gr sing3sa 2s1inh 2sin1i1 4s1inq 4s1ins 2s1int 4s1inv 3sio si3os 3s2is si2sa si4s1e si2so sis1p sis3s 7s2it si2tau si3te si2t3r si3tu six3 1s\xc3\xad 4s5j 2s1k4 4sk_ s2kala s3kam 4s3kas ska4te_ ska4tes 4skb 4sk2e 4ski 5s4ki_ 5skiz s3klas s3kn skna3 4skom 4skor 4s5k\xc3\xb6 s5kra 4sks 4sk5t s7kun 2s1l4 3s4lal 4slan s3l\xc3\xa4 sl5b s3le s3li 3s4lip s3lo_ slo3be s3loe s5l2u s3ly 2s1m2 s3me s3mi s3mu s3m\xc3\xbc 2s3n2 4sna sna1b4 sni1er 4s5not 4sn\xc3\xb6 1so 3so_ 4s1o2b so1c 3soft 3sog so3gl so2h s1ohe 4s5ohng 2s1ohr so3la so4l3ei so3li 4s3oly 3s2on son3au son5ende so2ny so3o 3sor_ so1ral s1orc 4s3ord so2rei s1orga 2s1o2rie so2r1o 3sors so4ru 3sos 5s4os_ s1ost 5sota so3tr so3unds so3unt s1o2ve s1ox s4oz 1s\xc3\xb6 s\xc3\xb62f 2s1\xc3\xb6k 2s\xc3\xb6l s1\xc3\xb6s 1sp2 4sp_ 4spaa 4spak s2pan spani7er_ 4spap 2spara spar5sc 3spa\xc3\x9f 2spat 4s3pau s2paz 3spee 3s4pei 4spel 2s1peri 3s4perr 2spers 2spet 3s6pez 4s3pf 2sph 3s2ph\xc3\xa4 s3phe 3s2pi s4pi4e 5spiel spier4 spi2k 4s5pil 4spip 4s5pis 2spl 4spla 4spl\xc3\xa4 3s2pli 2spo 4s3pod 3s2poi 4s5pok 4spol 4s3pos 4spr_ 3s4prac 2sprax 4spr\xc3\xa4m 4spr\xc3\xa4s 5s4prec 2spred 2sprob 2sprop 2sprot 3spru 5sprun 2spr\xc3\xbcf 3spr\xc3\xbcn 4s3ps s4p3t s2pu 4spun 3s4pur 4sput 4spy 2s1q 6s3r4 srat6s sret3 sr\xc3\xbc2d 4s1s ssa3bo s4s3ac ss1aj s4s3ala s4s3ang ss1ano s4sanz ss1app s3sas2 ss3att ss1au s3s2\xc3\xa4 s3se s4s1ec s4s1ega sse3ha s4sein sse3inf sse3int ss1eis s5sen_ ss2er sser5att ss3erh\xc3\xb6 s4s3er\xc3\xb6 s4s3erse s5s4es sse3ta s3si s5sie s4sint ss3la ss1off s2s1ori s3spe s5s2pek s3s2po ss5re ss5s4 s3sta s5stad sst6e s3stel ss2ti s3sto s3stu ss2tur s3st\xc3\xbc ss1ums 4st_ 1sta 2sta_ 3staa sta2bl stab6s 3s2tad 3staff 6stag 3stah 2stak s5tal_ 2stale st3alp 2s3tan_ st3ana 5s4tand 2stani 2stans 2stanw s2tar 3s4tar_ 3s4tars st3a2s sta4si 3stat 4stat_ s2tati 2st1auf 2staum 2staus 3st\xc3\xa4 4st\xc3\xa4g 4stb 2stc st3ch 2std 4ste_ 3steck ste5cke 1s2teg ste2g5r 3steh 1s2te2i 3steig 4steil 4steing 1s2tel 2stel_ 2s3tele 2stels 2stem 4stem_ 4sten s4t3ends s4t3engl s5tens s4t3entf 2ster 6ster_ s3tera st6erb s3ters 4stes stes6se_ ste4st 2stet 4stet_ 3steti 3s4tett 3steu 5steue st3ev 4s3tex 2stf 2stg 4sth st3ha st1hi st1ho s4t1hu 2stia 2stib 2stie_ 3s2tiel 2stien 3sties 3stie\xc3\x9f 3s2tif 4stig 2stik 3s2til 4stilg 3s4tim st1ins st1int 2stio 2stip 3s2tir st1iro 2stis 2stiv 2stj 2stk 4stl st3le 4stm 2stn 1sto 4sto_ 4stod sto3de s2t3om 4ston 2stopo 2stor_ 2store 2storg 2stori sto1s2t 3sto\xc3\x9f 4stou 4stow 3st\xc3\xb6 4st\xc3\xb6n 4s3t\xc3\xb6t 2stp 1str 2strad 5straf 3s2trah 6strai 4stral 4strans 3strap 3s2tras 3stra\xc3\x9f 4str\xc3\xa4g 4str\xc3\xa4ne 3streb 4stref 3streif st3renn s2tric 4s2trig 3s2tri2k 2s3tris st3roll 3stro2m 2strop 3stru 4strua 4strun 4strup 4sts4 st5sa st3se st3sl st3so st3st st3su st3sz 2st3t 5stub 2stuc 3stud 3stuf 3stuh stum4sc stu4n 4stun_ 3stund s2t1uni 4stunt stu5re st1url stur4s 4st1urt 2stus 1st2\xc3\xbc 4st\xc3\xbcb 3st\xc3\xbcc 4st\xc3\xbcch 2st\xc3\xbcr_ s2t\xc3\xbct 4stv 4stw 5styl 2st3z2 1su 3su_ su1an 3su2b3 4su3bi 5su1c 2s1u2f su3fi 2suh 3sui su3it_ su3la sul2i su2mau 3sume su2m1el 3summ s3umsa s3umst su4n 3sun_ sun6derh s1unf 2s1uni 2s3unt 3s2up su2ra 2s1url s1urs s1urt 3su2s1 su3sa su3sh su3si 3suv 1s\xc3\xbc 4s3\xc3\xbc2b 3s\xc3\xbcc 3s\xc3\xbc2d1 3s\xc3\xbcn 2s3v 2s1w s3we sweh2 4s3wie 4s3wil s3wir s3wo s2y 3sy_ sy2l syl1a sy4n3 1sy2s5 2s1z s3za s3zei 5s4zene s3zent 4s3zet s2zis s3z\xc3\xb6 4s3zu s3z\xc3\xbc 2\xc3\x9f_ 2\xc3\x9f3a2 2\xc3\x9f1b 4\xc3\x9f1c 2\xc3\x9f1d 1\xc3\x9fe 2\xc3\x9f1ec 2\xc3\x9f1e2g 2\xc3\x9f1ei \xc3\x9fe2la \xc3\x9fe2n3a \xc3\x9fen3st \xc3\x9fen3sz \xc3\x9fe2nu \xc3\x9fe3rin 2\xc3\x9f1erk 2\xc3\x9f1erse 2\xc3\x9f1f 2\xc3\x9f3g2 \xc3\x9fge2bl 2\xc3\x9f1h 1\xc3\x9fi \xc3\x9fig4s 2\xc3\x9f1in \xc3\x9f1j 2\xc3\x9f1k4 2\xc3\x9f1l 2\xc3\x9f1m 2\xc3\x9f1n \xc3\x9f1o2 2\xc3\x9f3p2 2\xc3\x9f1r2 2\xc3\x9f3s2 2\xc3\x9f1t 2\xc3\x9f1um 2\xc3\x9f1\xc3\xbc 2\xc3\x9f1v 2\xc3\x9f1w \xc3\x9fwa3 2\xc3\x9f1z 6t_ 3ta_ 2taa 3taan tab4 2tab_ ta2b5an 3tabel 4taben ta4bend 4tabf 4tabg 4tabk ta1bl 2tabn 4tabs t1abst 4t1abt 4tabz ta1c tach3te 3tacu 2t3ada 2t3adr 1taf_ taf2e 3tafel 4taff t1af4r 3tag 5tag_ ta2ga ta4g5ei 4t3agent ta3gl t3ago ta2gr tag4s tag5sc tah4 3tai ta1i2k tai2l ta1ins tai4r 4t1a2ka tak4ta 3taktb 3t2aktu 2takz 3tal_ tal3d 1t6ale tal2en ta4l3ens 5talis tal2l\xc3\xb6 1talo ta2lop ta2lu 2ta2m 3tam_ ta3ma 3tame 3tamg t3amin_ ta3mo t3ampl t3amt 1t2an_ t1a2na t1anb 2t2and tan3da tand4st ta3ne 4t1anf 3tani t2ank tan4k5l tan3kr 4t3anl 2t3anm 2t1anna t4anr t1ans 1tans_ 4t3ansi 2t3ansp t4ant_ 2tantr ta2nu 2tanw\xc3\xa4 t4anz_ 2tanza t5anzu ta3o ta2pes 2tapf t4ar_ 2t1arb 3tard ta6rens 3tari 2tark t1arm t1arti ta2ru 5tary 2t1arz 3tas t4as_ ta3sa 1ta3sc 2ta3se 1t4ast ta3sta ta4ste 1tat_ ta4t1ei ta4tem ta4t1er ta2th tat3he t3atl ta2tom 2tatt tat4t3r t2aufe 2taufw 3taug 3taume 1taus t1ausb tau6schw t1ausd 3t2ause t1ausg t1ausk 2t1auss 2t1ausw 1tav ta3va 3tax 1taz t\xc3\xa41c 1t\xc3\xa4g 2t\xc3\xa4gy 2t\xc3\xa4h 4t1\xc3\xa4lt 2t\xc3\xa4m t1\xc3\xa4mt 3t\xc3\xa4nz 3t2\xc3\xa4p t2\xc3\xa4r_ t\xc3\xa42s4 4t\xc3\xa4tt t1\xc3\xa4ug 1t\xc3\xa4u3s 4t\xc3\xa4x 1t\xc3\xa0 4t3b4 tbe3r2e tblock7en 4t1c t3cha t3che tch2i tch3l t2chu tch1w t2ck t3cr 2t3d4 tdun2 1te 3te_ te4a4 2teak te5al 3team te5an 2t1e2ben t2ech 3techn 2teck te2cka teck4e te2cki te2di 3tee te1ele te1em te2en 4tefe 4teff te2fl teg4 teg3re 4teh 5tei_ teik4 3teil 4teilhe 2tein t1eing 4t1einn 4teinr 4teinz t1eisb teit2 t2ek tek5te 3tel_ 3te2la tel1ab tel1ac te3lan tel1au 3telb tel1e2b 3telei tel1en 3telf 4t1elf_ 3telg tel1in te2lit 3telk tel4l\xc3\xa4n tel3l2e 4tellu 3teln te4l3ost te2l1\xc3\xb6 3telp 3tels 3telt tel3ta te3lu 3tem 5tem_ te2man te2m1ei te2mi te3mis 4temm te2m1o2r 5temper 4tempf tem1st te4m3u 3ten 7t6en_ te2n3a2 te3nac te4nag te4nas t2enb 6t5endf 4t1endl 6t5endp ten3dr te2n1e2b te4n1ec ten3eid 4tenerg ten4erw t1eng_ ten3im ten3in tenk4 t2enl t2eno t2ens tens2e ten3si tens3th 4tentd 4t1entg t1entn t1ents 4t3entw te2nu ten4zer ten3zw te2o te3ob 2teph 5t6er_ te1ral ter3am te3ran_ te2r3as t2erb 6t5erbs 6t5erbt ter3d te2r1e2b te2rel ter3end 4terf\xc3\xbcl ter5g t4ergru te5ria 3t2erka 4t3erkl\xc3\xa4 t2erlu 3term ter4mer ter4n3ar t3erneu t1er\xc3\xb6 ter4re_ t6ers_ t6erscha ter4ser ter4sk 5t4erspr t4erst_ 5t4erstu 3tert2 teru4 te4r1uf ter3z4a 2t1erzb 3t2es tesa2 tes3ac te5sc te4sel te2spr 5te2st tes3tan tes3t\xc3\xa4t test3ei tes6terg 3tet te2tat 4teth 4teti te4tik 6tetl 2teu teu3ere 3teuf 3teum te1un 3teur_ t5euro te2vi te2x te3xa 4t1exe 4texp 3t2ext tex2tr 2t1exz 1t\xc3\xa9 2t5f tfi4l 2t1g4 t3gl 4th_ 2t1h4a 5tha_ 5t2hag t2hak 3thal_ thalt2 t3hap t2har t3hau 4t1h\xc3\xa4 2thc t2he_ 5thea 4theb t2hec 4t1hei t2hein t1hel 3them t2hema 5t2heme 1then 3theni 3theo t1herd t1herr t1herz 1these 3thia 2t1hil t1him t1hin 4th3l 4th3m 2th3n 4t1hoc 4t3hot thou4 t3hov 4t3h\xc3\xb6 3thr2 5thrine 4ths 3thu 4t1hub 4thun 4t1h\xc3\xbc 4thv 1ti 3ti4a ti5a2m ti5an ti6are ti5as tib4 3tibe 3tibl 2tic ti1ce ti6chent ti2d1en t2ie 3tie_ tie3br 3tief_ tieg4 ti1el ti2el_ 3ti3e2n1 ti2er 3tiera 4tie\xc3\x9f ti3et ti1eu ti3fa ti3fe ti1fr 3tig 3tik ti2kam ti3k2an tiko2 ti2kr ti2lei 3tilg ti2lin ti4l\xc3\xb6 tilt4 2tim 3tim_ tim2ma t1imp 5tin_ ti1na t1inb 4t1ind ti5n4e t1inf tin2g1a tin2g3l tings2 ting3st t1init t2inn 3t2ins_ 4tint 4t1inv 5tio ti3or 3tip_ ti3pl 3tipp 3tips ti4que_ 3ti3ra 5t2is tisch3w t2it tit2a 3tite ti2ter tit2h 2ti3tu 5tiv ti2van ti2vel ti2v1o ti4v1r ti2za 2t1j 2t3k4 tk\xc3\xbc1b 4t1l2 t3la 6t5li tlings3 t3lo tl\xc3\xb63s 2t1m2 t5me tmen2s tmen6t tmin4s tmo4de_ tmo4des tm\xc3\xbcll4s3 2t5n4 tna5me tnes4s 3to_ toa4 to5ar to5at 1tob to3be 2tobj tob4l to1c 3tocht to6ckent 3tod tode4 to2d1er todes1 t1o2fe 1tok to3la 3tole tome2 to4men to5men_ 3ton tons4t to3ny to2pat to3phe to2pl 1topo 2topp 1tor 3tor_ to1ra to4r\xc3\xa4n t1ord 3tore to3ren t1org 3torh tor3int to2r\xc3\xb6 3tors to4ru 2tory to5sc to4sk to3s4p 2toss 1to3st to7sto to1stu 2to\xc3\x9f to1\xc3\x9fu 3tote to2tho 1totr 5t4ou to3un 3tow 3t\xc3\xb6ch 2t1\xc3\xb6f 3t\xc3\xb6n t2\xc3\xb6r t\xc3\xb6r3ste t1\xc3\xb6st 1t\xc3\xb6t 4t3p2 tpf4 tport4 2t1q t2r4 2tr_ 5tra_ tra3bl t4rac 3trach tra3cha 3trag 5t4rai t4rak 1tral 3t4ran_ 2trand 3trank t3rann 1trans t3rase 2tra\xc3\x9f 3tr\xc3\xa4c t3r\xc3\xa4d 3tr\xc3\xa4g 1tr\xc3\xa4ne 2tr\xc3\xa4s 2tr\xc3\xa4\xc3\x9f t3r\xc3\xa4ts t4r\xc3\xa4ts_ 4t5re_ 2treb 2trec t3rech t4reck 2t3red t4ree 3t4ref 4trefe 2treg t4rei_ 3t4reib 2treic 2treif 2t3reih t3rein 2t3reis t3reiz 2t3rek 2trel t4rem t4ren_ 3trend_ t3rent t4rep 2trepe 2trepo t4rer 3t4res_ t4ret tre2t3r t4reu 3treuh t3rev 2trez 5t4r\xc3\xa9 2t3rh 1tri 3tri4er 3trigg t3rind 2tring 3trio t4rip trizi1 1tro_ tro3b 3t4rog 1troi tro2ke 2troml 1tron 2t3roo t4rop 3tropf 1tros 1troy 3tr\xc3\xb6g 1tr\xc3\xb6s 1trua 2truk trum4 trums1 t3rund 3trunk 3t4rup tr\xc3\xbc1be tr\xc3\xbc1bu 2t3r\xc3\xbcc try1 2ts 4ts_ t2s1a t4sab ts3ad t3saf t4s3al t4s3amt t4sar ts3as t4sau t5sau_ ts1\xc3\xa4n t4s3char t5sche t6schef tsch4li t6schro ts1e2b t4s3e4h t3seil t4seind ts1em t3sen_ ts1eng ts1ent t2s1er ts3eta ts1ex tsi2d ts1ini t2s1ir t3skala ts3ke t4s3ko ts5kr t2s1o2 t3sol t3som t3soz t2s\xc3\xb6 t3span t3spas t2sp\xc3\xa4 t3s2pon t3s2por t2spu ts5s4 t1s2t ts3taf ts3tak t2stea t5steu ts3th t6stit ts4top ts3tor ts3trad ts3trak t4s3trau t4str\xc3\xa4 t3strec t2s3tri ts3tr\xc3\xbc t3s4tu t2s3t\xc3\xbcr t2s1u 1tsub t4sun t3sy 4t1t t2t1a2b tt3ad t3tal t3tan t4tanb tt1art tt1auf tt1ebe tt1eif tt1ein tt1eis t3te2l tte4la tte4s t2teti t3teu t2th tt3ha tt2h\xc3\xa4u tt1ho t3ti tto1p t3tra tt3ras t3tr\xc3\xa4 t3tro tt3ru tt3r\xc3\xbc tt2se tt3so tt2s1pa tt2spe tt2spr tt2s3ti ttt4 t3tu tt3z4 1tu tu1an 2tub 3tuch tu2chi 2tud tue3re tu3et 2tuf t1u2fer 2tuh 2tu2k t1ukr 3t2um_ 5tume 2tumf 2tumg 2tumk tum2sp 2t1umt 5tun_ 2t1una 2tund 3tu3ne 2t1unf 3tung tun2gl 2tunif 2t1u4nio 2tunt t1up_ tu2ra tu3rat tur3b tur1c tu4re_ tu2rei tu2r1er tu4res ture4t 3turn tu2ro tu3rol tur3s tu2ru t2us tu2sa tu4schl tu2so 2t\xc3\xbcb t3\xc3\xbcbe 3t\xc3\xbcch t\xc3\xbcck2s 1t\xc3\xbcf 1t\xc3\xbcm 1t\xc3\xbcr_ t\xc3\xbcr1c 1t\xc3\xbcre t\xc3\xbcr3s 2t1v t5ve 2t1w twa4r twi4e 1ty 2tyl ty4le ty2pa ty1st 2t1z t2za4 tz3ag tz3al tz3an tz1ar t2z1\xc3\xa4 t3ze_ t2z1e2c t2z1eie tze2n tz4ene tz3ents tz1erg t3ze4s tz1imp tz1ind t2zo tz1of t3zon tz1or tz2tin t2z1w tz3wa 2u_ u1a2b u1a2c ua3d uad4r u3al_ u5alet u3alf u3alr u3als ua2lu u3am u1ans u3ar_ uara2 uar3ab u3ars ua3sa ua2t3h u3au u1ay u1\xc3\xa4m u1\xc3\xa4u 2u1b u3be u4bent ub4i ub5los u3bl\xc3\xb6 ub3lu ub3ra ub3r\xc3\xa4 ub5rit ub2san ub2s1o ub2s1p ub3um u2b3\xc3\xbcb 4uc u1ce2 u2ch1a uch3an uch1\xc3\xa4 u1che u2ch1e2c uch1ei u3ches u1chi uch1in uch3l uch5m uch3n u2ch3r uch2so uch2sp uch2tr u1chu uch3\xc3\xbc uch1w u2ckem u4ckent uck2er u4ck3erl u2cki u1cr u1d u5d2a ude2a udens2 ude3r2e udi3en u2don ud3ra u1e ue4ck u2ed ue2en u4ela ue2le ueli4 ue2mi uen2gl u3eni uen3k ue2nu uen2zu u2ep ue2r5a u3ereh ue2rei uer5eife u3erer ue4rerg u3erex uer3g2 u5erinf u5erint uerk4 uer4ne uern3s4t uer3o uert2 u3erum u3erunt u3erur ue2ta ue4tek uet4s uf1ab u3fah uf1ak uf1ar uf1au u2f1\xc3\xa4s u2f1\xc3\xa42\xc3\x9f u2f1ei u2f1em u3fen_ u2fent u2f1erh 2uff uf3fe uff6l uf5l uf7l\xc3\xa4d ufo2r uf1ori u1f\xc3\xb6 uf3r uf5s\xc3\xa4 uft1eb uft3s2 2u1g u4gabte ug1af ug1ak u2g1ap ug1au ug3d u6g7e2i uge3ne u4g5ent ug5erf ug5erl uge7sc ugge4st u2g1l ug3la ug3l\xc3\xa4 ug5lo u3gl\xc3\xb6 u4g3lu u4g3n ugo3 ug1or u2g\xc3\xb6 u2g3ro ug3rum ug5sc ug3s2e ug3si ug3s4pa ugs2t ug3str ug3st\xc3\xbc u1h uhe1ra uhe1s uhe3st uh1la uh1l\xc3\xa4 uh3ma uh3mi uhr1a uh1ri uh4rin uh2ru uh1w 4ui u1ie ui1em u1ig u2ige u3in_ u3isch_ u3ischs uisi4n ui4s3t u1j uk\xc3\xa42 u3k\xc3\xa4u u1ke u1ki u1kl u3kla ukle1i u3klo u3kl\xc3\xb6 uk4n ukni4 u1kr uk2ta uk2t3in u1ku uku2s u1l ul1ab ul3am ul2ar ula2s ul1\xc3\xa4m ulb4 u2l1el ule4n ul1erf ule2t ul3eta ulg4 uli2k uli5ne ul1ins ul3ka ul4les ull1s ulm3ein ulo2i ul3or ul\xc3\xb63s ul2p1h ul2sa ul2sei ul3sp ult2a ul4tar ul3th ul2to ul2tri ul3tro u2l\xc3\xbc ul3zw um3all uman4s um1anz u2m1ar u2m1aus 1umd 2ume um2en umer2a um1erg um1erw 1umf 3umfe 1umg um1ins 1umk 1uml 2umm u3mon umpf6li um2pl ump3le 1umr 1umsat um3sc um4ser um2sim um2spe um2su umt2 um3th u2m3ur 1umz u2n 2un_ 2u5na_ 1unab un1ac u5nam u4n3an un1ap 2u5nas un3at unau2 un1\xc3\xa4 4unc un4dei und3erf und5erha un2d3r 4unds_ und3se und3sp un2d1um 1undzw un1e2 un3eid un3ein une3re unes4 un3et un1gl 1ungl\xc3\xbc un2g1r ung3ra ung4s3 u3ni 1u4nif 1u4niv un2k1a unks2 unk3sp unk2tr 3unku un2n3ad un1o un2os 1unr uns2 un3se 1unsi un3sk un3sp un2stu 1unt un3ta unte2 un3th unt4r 2untu un1u unvol2 unvoll3 1unw u1o2b u3of u3or_ u1or3c u1os_ u1pa up5ab u1pe2 uper1 upf2e up2f1i u3pfl u1pi up2pr u1pr upra3 up1sl up4t3a2 up2tel up2t1o up4tr up2tu u1q 2ur_ u1ra u3ra_ u3raba u3ral u2r3am ur1ana ur2anb u3rand ur1ang ur1ans u3rant ur5atm ur1au ur1\xc3\xa4n urb2 ur3ba ur2ble urch1 ur3di 2ure ur1eff u2rele ure2n u5ren_ ur3erei ur1erh ur1erw ure2t ur3eta ur2gri urgros4 urgs2 u1r2i uri2c u2r3im ur3ind ur1ini ur3ins ur3int u2r3inv urk2s 1urlau ur3no 2u1ro u1r\xc3\xb6 ur5p ur2san urs1au ur4sei ur4s1er ur2st ur3sta ur5st4r ur3s2z urt2 ur5t4e ur3th u1ru ur\xc3\xbc2 u1ry ur2za urz3ent ur2zi ur2zo ur2z1w u4saf us1ang us4ann u2s1ap us1au u6schent usch5wer usch3wi us1ec u2s1ef u2s1ei u3seid use1ra u2serp usi3er_ usi5ers_ u3soh u3sol us1op us3ou u3sov u3sow u3s2pa us3part us3pas us1pe u3s2pek us3pic us4sat us4sei usse2n uss5erfa uss3erk uss5ersu us4sez us2sof uss3t\xc3\xa4t ust1a2b u3stal u3stein u3stel ust2i us1tr us4tris u3stu u4stun u4stur us2ur u2s\xc3\xbc u1sy u1\xc3\x9f 4u1t u3taf u3tal ut3alk ut5a4m u2t1ap ut1ar ut1\xc3\xa4r u3t\xc3\xa4t u3te u5te_ u4t1e4g ute2l ut2em ute2n1 uten3e u4tent ut2er ute5r4er u5tet u2thei u2t1hi u2t1ho u4t1hu uto4ber ut1opf u2tops u3tos ut3r\xc3\xbc ut5sa ut2s1\xc3\xa4 ut4schl ut4schm ut3so ut3sp ut5t2l utt4le utu3ru utz1a utz3eng ut2z1in u1u4 uufe2 u1\xc3\xbc2 u1v4 u2ve_ uve3r\xc3\xa4 u1w uwa3s u1x2 ux5t u1ya u1z u3ze uzi5n uz1we uzz4 1\xc3\xbcb 2\xc3\xbcbd \xc3\xbcbe2 \xc3\xbcbe3c \xc3\xbcbe4r1 \xc3\xbc2b5l 3\xc3\xbcb5r \xc3\xbcb2st 3\xc3\xbcbu 2\xc3\xbcc \xc3\xbc1che \xc3\xbcch3l \xc3\xbcch4s3c \xc3\xbcch5t4e \xc3\xbcck1e2r \xc3\xbc4ck5eri \xc3\xbc4ckerk \xc3\xbc4ckers \xc3\xbc4d3a4 \xc3\xbc3den_ \xc3\xbc3d2ens \xc3\xbcd1o4 \xc3\xbcd1\xc3\xb6 \xc3\xbc4d5r \xc3\xbcd3s2 \xc3\xbcdsa1 \xc3\xbcd1t4 \xc3\xbc2f3a \xc3\xbc2f1ei \xc3\xbc2f1erg \xc3\xbcf2fl \xc3\xbc2f3i \xc3\xbcf5l \xc3\xbcf2t1o \xc3\xbc1g \xc3\xbc2g3l \xc3\xbcg3s \xc3\xbcg4st \xc3\xbch1a \xc3\xbc1he \xc3\xbc2h1ei \xc3\xbc2h1eng \xc3\xbc2h1erk \xc3\xbc2h1erz \xc3\xbch1i \xc3\xbchla2 \xc3\xbchl1ac \xc3\xbch5l2e \xc3\xbch3li \xc3\xbch3mi \xc3\xbch3mo \xc3\xbch5ne \xc3\xbch3r2e \xc3\xbchr3ei_ \xc3\xbch5ro \xc3\xbchr5ta \xc3\xbch1s \xc3\xbch3s2p \xc3\xbc1hu \xc3\xbch1w \xc3\xbc1k 2\xc3\xbcl \xc3\xbcl1a \xc3\xbcl2c \xc3\xbc5l2e \xc3\xbcl2la \xc3\xbcll1au \xc3\xbcl2l1ei \xc3\xbcl2lo \xc3\xbcl4l\xc3\xb6 \xc3\xbc1lu \xc3\xbc4ment 2\xc3\xbcn \xc3\xbc2n3a \xc3\xbcn2c \xc3\xbcn2da \xc3\xbcn2dr \xc3\xbcnd1s \xc3\xbcn2f1 \xc3\xbcn3fl \xc3\xbcn4fli \xc3\xbcnf3r \xc3\xbcn2g3l \xc3\xbcnn4s \xc3\xbcnn5sc \xc3\xbcn4s \xc3\xbcn5sc \xc3\xbcn5se \xc3\xbcn5sp \xc3\xbcn5sta \xc3\xbcn5str \xc3\xbcn3th \xc3\xbc1pe \xc3\xbc1pi \xc3\xbcr1a \xc3\xbc2r1ei \xc3\xbcr2fl \xc3\xbcr4g5eng \xc3\xbc1ri \xc3\xbc1r2o \xc3\xbc3rofe \xc3\xbcro3r \xc3\xbcrr2 \xc3\xbcr2s \xc3\xbcrs3tin \xc3\xbcrt2h \xc3\xbcr3the \xc3\xbc1ru \xc3\xbc2schl \xc3\xbcse3h \xc3\xbcse3l \xc3\xbcs4s3c \xc3\xbcs2st \xc3\xbc2st \xc3\xbcste3ne \xc3\xbc1\xc3\x9f \xc3\xbc1ta \xc3\xbc2t3al \xc3\xbcte3d \xc3\xbct3r \xc3\xbct2s1 \xc3\xbct2tr \xc3\xbc1v \xc3\xbc1z 2v_ 2v1ab va5g val2s 2vang 2v1arb va3st v4at va2t3a6 va4t1ei va2t3h va4t1in vati8ons_ va2t3r vat3s vat3t va2t1u 2v1au 2v1b 2v1d ve2 3vea ve3b ve3d ve3g ve3h veit4 veits3 ve3la ve3le ve3li veli5ne ve3lo ve3ma ve3mu ven2c ve3ne ve3ni ven3k ve3n\xc3\xb6 ve3nu ve3o ver1 ver3a ve3rad ve5rand ve5ras ver3b4 ver3d2 vere2 ve3ren verf6 verg4 ve3ri ve5rit ver3sta 2vese ves1p ves3ti ve3ta vete1 ve3tr 2ve\xc3\xbc ve3v ve5x2 ve7xe 2v1f4 2v1g 2v1h vi1an vi4a3t vi2c vid3s2t vi2e vie2h3a vi3en vie2w1 vi3g2 vi3k vi2leh vin2s 2v1int 3vio vise4 vi3s2o vis2u 2v1k 2v1l2 2v1m 2v1n 2v1ob vo2gu vol2a voll1a vo2n 2v1op vo2r1 vor3a vor3d vor3e vor3g6 vo3ri vo5rig vor3o vo4ru v\xc3\xb62c 2v1p v1ra 3vri 2vs vs2e 2v1t 2v1v 2v1w 2v1z 2w_ w4a wab2bl wa5che wa3d wa5ge wa4g5n wa2gr wa3gra 1wah wahl5ent wai2b 1wald wal2t1o wa5na wan4s wa2p wa2r 1war2e ware1i war3ste wart4e wa3ru 1wa2s wa3sa wa3se wa3sh wa3si was5s4 1w\xc3\xa4h 1w\xc3\xa4s w\xc3\xa4s4c w\xc3\xa45sche 2w1b 2w1c wco3 2w1d we3be web3l we3cke we5cke_ we5cken_ we5ckes we3d we2e2 we2fl 3weg we2g3l we4gn we4g3r wegs2 weg3s4p 1weh we3he wei4bl 2weie wei3k4 wei4tr weit3s wel6schl wel6schr wel3se wel2t1 wel4ta wel6t5end wel4tr we3ni wen4k3ri we2r5a wer2bl 1werbu 5werdens 1werdu wer2fl 2werg 1werk_ 1werke wer2kl wer2ku wer2s wer4t3a wer6t5erm 1werts 1wese wes1p we4st west3a wes2t1o2 west3r wet4s wet4ta wett3s 2w1g 2wh w5ho wi3cka wi2e wie3l wien2 wie5ne wie2st wi3k wim2ma wim4m3u win4d3e4c win2e wi2r 1wirt wi5s2e 1wiss wi3th 3wj 2wk 2w1l 2w1m 2wn wn3sh w4o 1wo1c wo2cha woche4 1woh woh2l 1wolf wol4ler wor3a wo2r3i wor2tr wo4r3u wot2 1w\xc3\xb6c w\xc3\xb6rt2h w\xc3\xb6r3the 2w1p w1ro 2ws w3s2k w1s2t 2w1t w3ti2 w2u 1wuc wul2 wul3se wun2s wur4s 1wurst wus2 wus3te wu4t1 1w\xc3\xbch w\xc3\xbcl2 w\xc3\xbcn5 2w1w 6x_ x3a 1xa_ 1x4ad 1x4a3g xa4m xa3me xa5mer 2xan 3x4as x4at 2x1b x1c 4x1d 1xe x1e4g xe2l xe3lei x1em 7x2em_ 3x2en xe3no x2er_ 5xere xers2 3xes 2x3eu 2x1f 2x1g xge1 2x3h 1xi xib4 xi1c xich2 2xid xide2 xi2d1em x1i2do xie3l xi3g4 xi2l xi3la xi3le xi3li xil1u x2i2s1 xi3sc xi4se xiso2 xis3s xis2t\xc3\xa4 x1i2tu x1j 2x1k4 2x3l 2x1m 2x1n x1or 4x3p x1q 2x1r 2x3s2 4x1t x2t3a x2t1\xc3\xa4 x3t\xc3\xa4t xtblo4 x2t1ed x2t1ei x2t1erf xt3ran xts4 xt5sa x2t1u x3tur 1xu xu3a x1u4n xu2s1 2x1v 2x1w 2xy x1z 2y1ab 1yac y3al_ y3a2m y1b yb6r y1c y2chi y3chis ych3n y1d y3dr y1e yen4n y2es_ y1f y1g ygie3 y3gl y1ha yhr2 y1hu y3i4 y1j y1k4 y1l yl5a2m y3l4ant_ y3l4ante y5len y5ler yli4n yloni1 y2l1u yma4t ym3p4 ympi3e y2n3o yn3t y1of yom4 yon4i y3ou y1p ypa2 yp5an ype2 y5ph y2p1in ypo3 y4ps yp3t y1r y3r2e y3ri yri1e y5s4c y1s\xc3\xa9 y3s2p yst4 y1s2ty y3s2z y1t yt2h yu2r yure3 y1w y1z2 6z_ 2z3a2b za1c z3a2d za3de 2z3af za3gr 3z2ah 2z3a2k 2z3am 3zambiq z1an za2na 2z3anf z3anl za3re 2z1arz za3st4 2z3at 3zaub z3auf z3aug 3zaun z1aut 2z1\xc3\xa42c z2\xc3\xa4h 2z1\xc3\xa4m z1\xc3\xa4n z1\xc3\xa4rg 4z3b6 zbe2st zb\xc3\xbc1b zb\xc3\xbcbe5 4z3c 2z3d zd\xc3\xa41 ze3a ze1e 2z1eff zeik4 3zeil zei3la zeile4 2z1ein zei3s2 zeist4 zei4ta zei4t3er zei2tr zeit3sp 3zel ze2l3a2 ze2len ze2l1er ze2l1in zel5la ze2lo ze5m2e 5zen_ ze2n1ac zens2e zen2ta 5z4entr zent3sk 2zentw zen4zer zer3a ze2r1e2b z1erfo 2zerg z3ergeb z1erh\xc3\xb6 zer3k 2z1erke 2zerkl 2z1erl\xc3\xb6 zer4n3ei 2zerq 5zerr 2z1ersa 4zerste zer3sz zer2t2a2 zer4t3ag zer4ter zer4tin 2zerz z2es ze2s\xc3\xa4 ze5sc ze2s1i ze3sku ze2sp ze5sta zes1tr ze2tr 2z1ex 2z1f 2z1g 2z1h z2hen zhir5 3zia 3zie zi1erh zi1es_ zig4s 4zimp 3zin4e 4z3inf 4z3inh zin4ser 4zinsuf 2z1int 2z1inv zi2o zi3op zirk4 zirk6s zi3s2z zi1t2h 2z1j 2z1k4 2z1l2 z3la 4z3ly 2z1m 2z3n2 2zob 2zof z1oh 3zol zon6ter zo2r zo3re zor4ne zo5se 2z1\xc3\xb6f z\xc3\xb67li 2z3p2 2z1q 4z3r2 2z1s2 z3sh z3sk z3sp z3ste z3sz 2z1t z2t1au z6tehe zte3o zte3str z2t1h zt3hei z5t2her zt1ins z2t3ro zt3so zu1 zu3a zub4 zu5cke zud4 zu2el zu3f6 zu2g1ar zu3gl zu3gr zu2g1un 2z1uhr zuk4 2z1um_ zu3ma zumen2 2zumf 2zumg 2z1ums zu3n\xc3\xa4 zu3n2e 2zunt zu3n\xc3\xbc 2z1urk 2z1url 2zurs 2z1urt zu3s4 zuz2 2z\xc3\xbcb z\xc3\xbcr1c 2z1v zw2 z2wan zwan2d1 4z3w\xc3\xa4l 2zweg z2weig 2z1wel 2z1wen 2zwer 2z1wes 2zwir z2wit 2z1wo 2zw\xc3\xb6 z1wur z1w\xc3\xbc 3zy zy1ank 6z1z z3z4a z3zi zzi3s2 z3z2l zzoll2"; + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/patterns/dictionary.txt b/application/third_party/mpdf/patterns/dictionary.txt new file mode 100644 index 0000000..2241840 --- /dev/null +++ b/application/third_party/mpdf/patterns/dictionary.txt @@ -0,0 +1 @@ +dis/es/tab/lish/men/tar/i/an/ism diff --git a/application/third_party/mpdf/patterns/en.php b/application/third_party/mpdf/patterns/en.php new file mode 100644 index 0000000..21d8baa --- /dev/null +++ b/application/third_party/mpdf/patterns/en.php @@ -0,0 +1,10 @@ +<?php +/* + Adapted from Hyphenator 1.0.2 + http://code.google.com/p/hyphenator/ +*/ + +$patterns="_ach4 _ad4der _af1t _al3t _am5at _an5c _ang4 _ani5m _ant4 _an3te _anti5s _ar5s _ar4tie _ar4ty _as3c _as1p _as1s _aster5 _atom5 _au1d _av4i _awn4 _ba4g _ba5na _bas4e _ber4 _be5ra _be3sm _be5sto _bri2 _but4ti _cam4pe _can5c _capa5b _car5ol _ca4t _ce4la _ch4 _chill5i _ci2 _cit5r _co3e _co4r _cor5ner _de4moi _de3o _de3ra _de3ri _des4c _dictio5 _do4t _du4c _dumb5 _earth5 _eas3i _eb4 _eer4 _eg2 _el5d _el3em _enam3 _en3g _en3s _eq5ui5t _er4ri _es3 _eu3 _eye5 _fes3 _for5mer _ga2 _ge2 _gen3t4 _ge5og _gi5a _gi4b _go4r _hand5i _han5k _he2 _hero5i _hes3 _het3 _hi3b _hi3er _hon5ey _hon3o _hov5 _id4l _idol3 _im3m _im5pin _in1 _in3ci _ine2 _in2k _in3s _ir5r _is4i _ju3r _la4cy _la4m _lat5er _lath5 _le2 _leg5e _len4 _lep5 _lev1 _li4g _lig5a _li2n _li3o _li4t _mag5a5 _mal5o _man5a _mar5ti _me2 _mer3c _me5ter _mis1 _mist5i _mon3e _mo3ro _mu5ta _muta5b _ni4c _od2 _odd5 _of5te _or5ato _or3c _or1d _or3t _os3 _os4tl _oth3 _out3 _ped5al _pe5te _pe5tit _pi4e _pio5n _pi2t _pre3m _ra4c _ran4t _ratio5na _ree2 _re5mit _res2 _re5stat _ri4g _rit5u _ro4q _ros5t _row5d _ru4d _sci3e _self5 _sell5 _se2n _se5rie _sh2 _si2 _sing4 _st4 _sta5bl _sy2 _ta4 _te4 _ten5an _th2 _ti2 _til4 _tim5o5 _ting4 _tin5k _ton4a _to4p _top5i _tou5s _trib5ut _un1a _un3ce _under5 _un1e _un5k _un5o _un3u _up3 _ure3 _us5a _ven4de _ve5ra _wil5i _ye4 4ab_ a5bal a5ban abe2 ab5erd abi5a ab5it5ab ab5lat ab5o5liz 4abr ab5rog ab3ul a4car ac5ard ac5aro a5ceou ac1er a5chet 4a2ci a3cie ac1in a3cio ac5rob act5if ac3ul ac4um a2d ad4din ad5er_ 2adi a3dia ad3ica adi4er a3dio a3dit a5diu ad4le ad3ow ad5ran ad4su 4adu a3duc ad5um ae4r aeri4e a2f aff4 a4gab aga4n ag5ell age4o 4ageu ag1i 4ag4l ag1n a2go 3agog ag3oni a5guer ag5ul a4gy a3ha a3he ah4l a3ho ai2 a5ia a3ic_ ai5ly a4i4n ain5in ain5o ait5en a1j ak1en al5ab al3ad a4lar 4aldi 2ale al3end a4lenti a5le5o al1i al4ia_ ali4e al5lev 4allic 4alm a5log_ a4ly_ 4alys 5a5lyst 5alyt 3alyz 4ama am5ab am3ag ama5ra am5asc a4matis a4m5ato am5era am3ic am5if am5ily am1in ami4no a2mo a5mon amor5i amp5en a2n an3age 3analy a3nar an3arc anar4i a3nati 4and ande4s an3dis an1dl an4dow a5nee a3nen an5est_ a3neu 2ang ang5ie an1gl a4n1ic a3nies an3i3f an4ime a5nimi a5nine an3io a3nip an3ish an3it a3niu an4kli 5anniz ano4 an5ot anoth5 an2sa an4sco an4sn an2sp ans3po an4st an4sur antal4 an4tie 4anto an2tr an4tw an3ua an3ul a5nur 4ao apar4 ap5at ap5ero a3pher 4aphi a4pilla ap5illar ap3in ap3ita a3pitu a2pl apoc5 ap5ola apor5i apos3t aps5es a3pu aque5 2a2r ar3act a5rade ar5adis ar3al a5ramete aran4g ara3p ar4at a5ratio ar5ativ a5rau ar5av4 araw4 arbal4 ar4chan ar5dine ar4dr ar5eas a3ree ar3ent a5ress ar4fi ar4fl ar1i ar5ial ar3ian a3riet ar4im ar5inat ar3io ar2iz ar2mi ar5o5d a5roni a3roo ar2p ar3q arre4 ar4sa ar2sh 4as_ as4ab as3ant ashi4 a5sia_ a3sib a3sic 5a5si4t ask3i as4l a4soc as5ph as4sh as3ten as1tr asur5a a2ta at3abl at5ac at3alo at5ap ate5c at5ech at3ego at3en_ at3era ater5n a5terna at3est at5ev 4ath ath5em a5then at4ho ath5om 4ati_ a5tia at5i5b at1ic at3if ation5ar at3itu a4tog a2tom at5omiz a4top a4tos a1tr at5rop at4sk at4tag at5te at4th a2tu at5ua at5ue at3ul at3ura a2ty au4b augh3 au3gu au4l2 aun5d au3r au5sib aut5en au1th a2va av3ag a5van ave4no av3era av5ern av5ery av1i avi4er av3ig av5oc a1vor 3away aw3i aw4ly aws4 ax4ic ax4id ay5al aye4 ays4 azi4er azz5i 5ba_ bad5ger ba4ge bal1a ban5dag ban4e ban3i barbi5 bari4a bas4si 1bat ba4z 2b1b b2be b3ber bbi4na 4b1d 4be_ beak4 beat3 4be2d be3da be3de be3di be3gi be5gu 1bel be1li be3lo 4be5m be5nig be5nu 4bes4 be3sp be5str 3bet bet5iz be5tr be3tw be3w be5yo 2bf 4b3h bi2b bi4d 3bie bi5en bi4er 2b3if 1bil bi3liz bina5r4 bin4d bi5net bi3ogr bi5ou bi2t 3bi3tio bi3tr 3bit5ua b5itz b1j bk4 b2l2 blath5 b4le_ blen4 5blesp b3lis b4lo blun4t 4b1m 4b3n bne5g 3bod bod3i bo4e bol3ic bom4bi bon4a bon5at 3boo 5bor_ 4b1ora bor5d 5bore 5bori 5bos4 b5ota both5 bo4to bound3 4bp 4brit broth3 2b5s2 bsor4 2bt bt4l b4to b3tr buf4fer bu4ga bu3li bumi4 bu4n bunt4i bu3re bus5ie buss4e 5bust 4buta 3butio b5uto b1v 4b5w 5by_ bys4 1ca cab3in ca1bl cach4 ca5den 4cag4 2c5ah ca3lat cal4la call5in 4calo can5d can4e can4ic can5is can3iz can4ty cany4 ca5per car5om cast5er cas5tig 4casy ca4th 4cativ cav5al c3c ccha5 cci4a ccompa5 ccon4 ccou3t 2ce_ 4ced_ 4ceden 3cei 5cel_ 3cell 1cen 3cenc 2cen4e 4ceni 3cent 3cep ce5ram 4cesa 3cessi ces5si5b ces5t cet4 c5e4ta cew4 2ch 4ch_ 4ch3ab 5chanic ch5a5nis che2 cheap3 4ched che5lo 3chemi ch5ene ch3er_ ch3ers 4ch1in 5chine_ ch5iness 5chini 5chio 3chit chi2z 3cho2 ch4ti 1ci 3cia ci2a5b cia5r ci5c 4cier 5cific_ 4cii ci4la 3cili 2cim 2cin c4ina 3cinat cin3em c1ing c5ing_ 5cino cion4 4cipe ci3ph 4cipic 4cista 4cisti 2c1it cit3iz 5ciz ck1 ck3i 1c4l4 4clar c5laratio 5clare cle4m 4clic clim4 cly4 c5n 1co co5ag coe2 2cog co4gr coi4 co3inc col5i 5colo col3or com5er con4a c4one con3g con5t co3pa cop3ic co4pl 4corb coro3n cos4e cov1 cove4 cow5a coz5e co5zi c1q cras5t 5crat_ 5cratic cre3at 5cred 4c3reta cre4v cri2 cri5f c4rin cris4 5criti cro4pl crop5o cros4e cru4d 4c3s2 2c1t cta4b ct5ang c5tant c2te c3ter c4ticu ctim3i ctu4r c4tw cud5 c4uf c4ui cu5ity 5culi cul4tis 3cultu cu2ma c3ume cu4mi 3cun cu3pi cu5py cur5a4b cu5ria 1cus cuss4i 3c4ut cu4tie 4c5utiv 4cutr 1cy cze4 1d2a 5da_ 2d3a4b dach4 4daf 2dag da2m2 dan3g dard5 dark5 4dary 3dat 4dativ 4dato 5dav4 dav5e 5day d1b d5c d1d4 2de_ deaf5 deb5it de4bon decan4 de4cil de5com 2d1ed 4dee_ de5if deli4e del5i5q de5lo d4em 5dem_ 3demic dem5ic_ de5mil de4mons demor5 1den de4nar de3no denti5f de3nu de1p de3pa depi4 de2pu d3eq d4erh 5derm dern5iz der5s des2 d2es_ de1sc de2s5o des3ti de3str de4su de1t de2to de1v dev3il 4dey 4d1f d4ga d3ge4t dg1i d2gy d1h2 5di_ 1d4i3a dia5b di4cam d4ice 3dict 3did 5di3en d1if di3ge di4lato d1in 1dina 3dine_ 5dini di5niz 1dio dio5g di4pl dir2 di1re dirt5i dis1 5disi d4is3t d2iti 1di1v d1j d5k2 4d5la 3dle_ 3dled 3dles_ 4dless 2d3lo 4d5lu 2dly d1m 4d1n4 1do 3do_ do5de 5doe 2d5of d4og do4la doli4 do5lor dom5iz do3nat doni4 doo3d dop4p d4or 3dos 4d5out do4v 3dox d1p 1dr drag5on 4drai dre4 drea5r 5dren dri4b dril4 dro4p 4drow 5drupli 4dry 2d1s2 ds4p d4sw d4sy d2th 1du d1u1a du2c d1uca duc5er 4duct_ 4ducts du5el du4g d3ule dum4be du4n 4dup du4pe d1v d1w d2y 5dyn dy4se dys5p e1a4b e3act ead1 ead5ie ea4ge ea5ger ea4l eal5er eal3ou eam3er e5and ear3a ear4c ear5es ear4ic ear4il ear5k ear2t eart3e ea5sp e3ass east3 ea2t eat5en eath3i e5atif e4a3tu ea2v eav3en eav5i eav5o 2e1b e4bel_ e4bels e4ben e4bit e3br e4cad ecan5c ecca5 e1ce ec5essa ec2i e4cib ec5ificat ec5ifie ec5ify ec3im eci4t e5cite e4clam e4clus e2col e4comm e4compe e4conc e2cor ec3ora eco5ro e1cr e4crem ec4tan ec4te e1cu e4cul ec3ula 2e2da 4ed3d e4d1er ede4s 4edi e3dia ed3ib ed3ica ed3im ed1it edi5z 4edo e4dol edon2 e4dri e4dul ed5ulo ee2c eed3i ee2f eel3i ee4ly ee2m ee4na ee4p1 ee2s4 eest4 ee4ty e5ex e1f e4f3ere 1eff e4fic 5efici efil4 e3fine ef5i5nite 3efit efor5es e4fuse_ 4egal eger4 eg5ib eg4ic eg5ing e5git5 eg5n e4go_ e4gos eg1ul e5gur 5egy e1h4 eher4 ei2 e5ic ei5d eig2 ei5gl e3imb e3inf e1ing e5inst eir4d eit3e ei3th e5ity e1j e4jud ej5udi eki4n ek4la e1la e4la_ e4lac elan4d el5ativ e4law elaxa4 e3lea el5ebra 5elec e4led el3ega e5len e4l1er e1les el2f el2i e3libe e4l5ic_ el3ica e3lier el5igib e5lim e4l3ing e3lio e2lis el5ish e3liv3 4ella el4lab ello4 e5loc el5og el3op_ el2sh el4ta e5lud el5ug e4mac e4mag e5man em5ana em5b e1me e2mel e4met em3ica emi4e em5igra em1in2 em5ine em3i3ni e4mis em5ish e5miss em3iz 5emniz emo4g emoni5o em3pi e4mul em5ula emu3n e3my en5amo e4nant ench4er en3dic e5nea e5nee en3em en5ero en5esi en5est en3etr e3new en5ics e5nie e5nil e3nio en3ish en3it e5niu 5eniz 4enn 4eno eno4g e4nos en3ov en4sw ent5age 4enthes en3ua en5uf e3ny_ 4en3z e5of eo2g e4oi4 e3ol eop3ar e1or eo3re eo5rol eos4 e4ot eo4to e5out e5ow e2pa e3pai ep5anc e5pel e3pent ep5etitio ephe4 e4pli e1po e4prec ep5reca e4pred ep3reh e3pro e4prob ep4sh ep5ti5b e4put ep5uta e1q equi3l e4q3ui3s er1a era4b 4erand er3ar 4erati_ 2erb er4bl er3ch er4che 2ere_ e3real ere5co ere3in er5el_ er3emo er5ena er5ence 4erene er3ent ere4q er5ess er3est eret4 er1h er1i e1ria4 5erick e3rien eri4er er3ine e1rio 4erit er4iu eri4v e4riva er3m4 er4nis 4ernit 5erniz er3no 2ero er5ob e5roc ero4r er1ou er1s er3set ert3er 4ertl er3tw 4eru eru4t 5erwau e1s4a e4sage_ e4sages es2c e2sca es5can e3scr es5cu e1s2e e2sec es5ecr es5enc e4sert_ e4serts e4serva 4esh e3sha esh5en e1si e2sic e2sid es5iden es5igna e2s5im es4i4n esis4te esi4u e5skin es4mi e2sol es3olu e2son es5ona e1sp es3per es5pira es4pre 2ess es4si4b estan4 es3tig es5tim 4es2to e3ston 2estr e5stro estruc5 e2sur es5urr es4w eta4b eten4d e3teo ethod3 et1ic e5tide etin4 eti4no e5tir e5titio et5itiv 4etn et5ona e3tra e3tre et3ric et5rif et3rog et5ros et3ua et5ym et5z 4eu e5un e3up eu3ro eus4 eute4 euti5l eu5tr eva2p5 e2vas ev5ast e5vea ev3ell evel3o e5veng even4i ev1er e5verb e1vi ev3id evi4l e4vin evi4v e5voc e5vu e1wa e4wag e5wee e3wh ewil5 ew3ing e3wit 1exp 5eyc 5eye_ eys4 1fa fa3bl fab3r fa4ce 4fag fain4 fall5e 4fa4ma fam5is 5far far5th fa3ta fa3the 4fato fault5 4f5b 4fd 4fe_ feas4 feath3 fe4b 4feca 5fect 2fed fe3li fe4mo fen2d fend5e fer1 5ferr fev4 4f1f f4fes f4fie f5fin_ f2f5is f4fly f2fy 4fh 1fi fi3a 2f3ic_ 4f3ical f3ican 4ficate f3icen fi3cer fic4i 5ficia 5ficie 4fics fi3cu fi5del fight5 fil5i fill5in 4fily 2fin 5fina fin2d5 fi2ne f1in3g fin4n fis4ti f4l2 f5less flin4 flo3re f2ly5 4fm 4fn 1fo 5fon fon4de fon4t fo2r fo5rat for5ay fore5t for4i fort5a fos5 4f5p fra4t f5rea fres5c fri2 fril4 frol5 2f3s 2ft f4to f2ty 3fu fu5el 4fug fu4min fu5ne fu3ri fusi4 fus4s 4futa 1fy 1ga gaf4 5gal_ 3gali ga3lo 2gam ga5met g5amo gan5is ga3niz gani5za 4gano gar5n4 gass4 gath3 4gativ 4gaz g3b gd4 2ge_ 2ged geez4 gel4in ge5lis ge5liz 4gely 1gen ge4nat ge5niz 4geno 4geny 1geo ge3om g4ery 5gesi geth5 4geto ge4ty ge4v 4g1g2 g2ge g3ger gglu5 ggo4 gh3in gh5out gh4to 5gi_ 1gi4a gia5r g1ic 5gicia g4ico gien5 5gies_ gil4 g3imen 3g4in_ gin5ge 5g4ins 5gio 3gir gir4l g3isl gi4u 5giv 3giz gl2 gla4 glad5i 5glas 1gle gli4b g3lig 3glo glo3r g1m g4my gn4a g4na_ gnet4t g1ni g2nin g4nio g1no g4non 1go 3go_ gob5 5goe 3g4o4g go3is gon2 4g3o3na gondo5 go3ni 5goo go5riz gor5ou 5gos_ gov1 g3p 1gr 4grada g4rai gran2 5graph_ g5rapher 5graphic 4graphy 4gray gre4n 4gress_ 4grit g4ro gruf4 gs2 g5ste gth3 gu4a 3guard 2gue 5gui5t 3gun 3gus 4gu4t g3w 1gy 2g5y3n gy5ra h3ab4l hach4 hae4m hae4t h5agu ha3la hala3m ha4m han4ci han4cy 5hand_ han4g hang5er hang5o h5a5niz han4k han4te hap3l hap5t ha3ran ha5ras har2d hard3e har4le harp5en har5ter has5s haun4 5haz haz3a h1b 1head 3hear he4can h5ecat h4ed he5do5 he3l4i hel4lis hel4ly h5elo hem4p he2n hena4 hen5at heo5r hep5 h4era hera3p her4ba here5a h3ern h5erou h3ery h1es he2s5p he4t het4ed heu4 h1f h1h hi5an hi4co high5 h4il2 himer4 h4ina hion4e hi4p hir4l hi3ro hir4p hir4r his3el his4s hith5er hi2v 4hk 4h1l4 hlan4 h2lo hlo3ri 4h1m hmet4 2h1n h5odiz h5ods ho4g hoge4 hol5ar 3hol4e ho4ma home3 hon4a ho5ny 3hood hoon4 hor5at ho5ris hort3e ho5ru hos4e ho5sen hos1p 1hous house3 hov5el 4h5p 4hr4 hree5 hro5niz hro3po 4h1s2 h4sh h4tar ht1en ht5es h4ty hu4g hu4min hun5ke hun4t hus3t4 hu4t h1w h4wart hy3pe hy3ph hy2s 2i1a i2al iam4 iam5ete i2an 4ianc ian3i 4ian4t ia5pe iass4 i4ativ ia4tric i4atu ibe4 ib3era ib5ert ib5ia ib3in ib5it_ ib5ite i1bl ib3li i5bo i1br i2b5ri i5bun 4icam 5icap 4icar i4car_ i4cara icas5 i4cay iccu4 4iceo 4ich 2ici i5cid ic5ina i2cip ic3ipa i4cly i2c5oc 4i1cr 5icra i4cry ic4te ictu2 ic4t3ua ic3ula ic4um ic5uo i3cur 2id i4dai id5anc id5d ide3al ide4s i2di id5ian idi4ar i5die id3io idi5ou id1it id5iu i3dle i4dom id3ow i4dr i2du id5uo 2ie4 ied4e 5ie5ga ield3 ien5a4 ien4e i5enn i3enti i1er_ i3esc i1est i3et 4if_ if5ero iff5en if4fr 4ific_ i3fie i3fl 4ift 2ig iga5b ig3era ight3i 4igi i3gib ig3il ig3in ig3it i4g4l i2go ig3or ig5ot i5gre igu5i ig1ur i3h 4i5i4 i3j 4ik i1la il3a4b i4lade i2l5am ila5ra i3leg il1er ilev4 il5f il1i il3ia il2ib il3io il4ist 2ilit il2iz ill5ab 4iln il3oq il4ty il5ur il3v i4mag im3age ima5ry imenta5r 4imet im1i im5ida imi5le i5mini 4imit im4ni i3mon i2mu im3ula 2in_ i4n3au 4inav incel4 in3cer 4ind in5dling 2ine i3nee iner4ar i5ness 4inga 4inge in5gen 4ingi in5gling 4ingo 4ingu 2ini i5ni_ i4nia in3io in1is i5nite_ 5initio in3ity 4ink 4inl 2inn 2i1no i4no4c ino4s i4not 2ins in3se insur5a 2int_ 2in4th in1u i5nus 4iny 2io 4io_ ioge4 io2gr i1ol io4m ion3at ion4ery ion3i io5ph ior3i i4os io5th i5oti io4to i4our 2ip ipe4 iphras4 ip3i ip4ic ip4re4 ip3ul i3qua iq5uef iq3uid iq3ui3t 4ir i1ra ira4b i4rac ird5e ire4de i4ref i4rel4 i4res ir5gi ir1i iri5de ir4is iri3tu 5i5r2iz ir4min iro4g 5iron_ ir5ul 2is_ is5ag is3ar isas5 2is1c is3ch 4ise is3er 3isf is5han is3hon ish5op is3ib isi4d i5sis is5itiv 4is4k islan4 4isms i2so iso5mer is1p is2pi is4py 4is1s is4sal issen4 is4ses is4ta_ is1te is1ti ist4ly 4istral i2su is5us 4ita_ ita4bi i4tag 4ita5m i3tan i3tat 2ite it3era i5teri it4es 2ith i1ti 4itia 4i2tic it3ica 5i5tick it3ig it5ill i2tim 2itio 4itis i4tism i2t5o5m 4iton i4tram it5ry 4itt it3uat i5tud it3ul 4itz_ i1u 2iv iv3ell iv3en_ i4v3er_ i4vers_ iv5il_ iv5io iv1it i5vore iv3o3ro i4v3ot 4i5w ix4o 4iy 4izar izi4 5izont 5ja jac4q ja4p 1je jer5s 4jestie 4jesty jew3 jo4p 5judg 3ka_ k3ab k5ag kais4 kal4 k1b k2ed 1kee ke4g ke5li k3en4d k1er kes4 k3est_ ke4ty k3f kh4 k1i 5ki_ 5k2ic k4ill kilo5 k4im k4in_ kin4de k5iness kin4g ki4p kis4 k5ish kk4 k1l 4kley 4kly k1m k5nes 1k2no ko5r kosh4 k3ou kro5n 4k1s2 k4sc ks4l k4sy k5t k1w lab3ic l4abo laci4 l4ade la3dy lag4n lam3o 3land lan4dl lan5et lan4te lar4g lar3i las4e la5tan 4lateli 4lativ 4lav la4v4a 2l1b lbin4 4l1c2 lce4 l3ci 2ld l2de ld4ere ld4eri ldi4 ld5is l3dr l4dri le2a le4bi left5 5leg_ 5legg le4mat lem5atic 4len_ 3lenc 5lene_ 1lent le3ph le4pr lera5b ler4e 3lerg 3l4eri l4ero les2 le5sco 5lesq 3less 5less_ l3eva lev4er_ lev4era lev4ers 3ley 4leye 2lf l5fr 4l1g4 l5ga lgar3 l4ges lgo3 2l3h li4ag li2am liar5iz li4as li4ato li5bi 5licio li4cor 4lics 4lict_ l4icu l3icy l3ida lid5er 3lidi lif3er l4iff li4fl 5ligate 3ligh li4gra 3lik 4l4i4l lim4bl lim3i li4mo l4im4p l4ina 1l4ine lin3ea lin3i link5er li5og 4l4iq lis4p l1it l2it_ 5litica l5i5tics liv3er l1iz 4lj lka3 l3kal lka4t l1l l4law l2le l5lea l3lec l3leg l3lel l3le4n l3le4t ll2i l2lin4 l5lina ll4o lloqui5 ll5out l5low 2lm l5met lm3ing l4mod lmon4 2l1n2 3lo_ lob5al lo4ci 4lof 3logic l5ogo 3logu lom3er 5long lon4i l3o3niz lood5 5lope_ lop3i l3opm lora4 lo4rato lo5rie lor5ou 5los_ los5et 5losophiz 5losophy los4t lo4ta loun5d 2lout 4lov 2lp lpa5b l3pha l5phi lp5ing l3pit l4pl l5pr 4l1r 2l1s2 l4sc l2se l4sie 4lt lt5ag ltane5 l1te lten4 ltera4 lth3i l5ties_ ltis4 l1tr ltu2 ltur3a lu5a lu3br luch4 lu3ci lu3en luf4 lu5id lu4ma 5lumi l5umn_ 5lumnia lu3o luo3r 4lup luss4 lus3te 1lut l5ven l5vet4 2l1w 1ly 4lya 4lyb ly5me ly3no 2lys4 l5yse 1ma 2mab ma2ca ma5chine ma4cl mag5in 5magn 2mah maid5 4mald ma3lig ma5lin mal4li mal4ty 5mania man5is man3iz 4map ma5rine_ ma5riz mar4ly mar3v ma5sce mas4e mas1t 5mate math3 ma3tis 4matiza 4m1b mba4t5 m5bil m4b3ing mbi4v 4m5c 4me_ 2med 4med_ 5media me3die m5e5dy me2g mel5on mel4t me2m mem1o3 1men men4a men5ac men4de 4mene men4i mens4 mensu5 3ment men4te me5on m5ersa 2mes 3mesti me4ta met3al me1te me5thi m4etr 5metric me5trie me3try me4v 4m1f 2mh 5mi_ mi3a mid4a mid4g mig4 3milia m5i5lie m4ill min4a 3mind m5inee m4ingl min5gli m5ingly min4t m4inu miot4 m2is mis4er_ mis5l mis4ti m5istry 4mith m2iz 4mk 4m1l m1m mma5ry 4m1n mn4a m4nin mn4o 1mo 4mocr 5mocratiz mo2d1 mo4go mois2 moi5se 4mok mo5lest mo3me mon5et mon5ge moni3a mon4ism mon4ist mo3niz monol4 mo3ny_ mo2r 4mora_ mos2 mo5sey mo3sp moth3 m5ouf 3mous mo2v 4m1p mpara5 mpa5rab mpar5i m3pet mphas4 m2pi mpi4a mp5ies m4p1in m5pir mp5is mpo3ri mpos5ite m4pous mpov5 mp4tr m2py 4m3r 4m1s2 m4sh m5si 4mt 1mu mula5r4 5mult multi3 3mum mun2 4mup mu4u 4mw 1na 2n1a2b n4abu 4nac_ na4ca n5act nag5er_ nak4 na4li na5lia 4nalt na5mit n2an nanci4 nan4it nank4 nar3c 4nare nar3i nar4l n5arm n4as nas4c nas5ti n2at na3tal nato5miz n2au nau3se 3naut nav4e 4n1b4 ncar5 n4ces_ n3cha n5cheo n5chil n3chis nc1in nc4it ncour5a n1cr n1cu n4dai n5dan n1de nd5est_ ndi4b n5d2if n1dit n3diz n5duc ndu4r nd2we 2ne_ n3ear ne2b neb3u ne2c 5neck 2ned ne4gat neg5ativ 5nege ne4la nel5iz ne5mi ne4mo 1nen 4nene 3neo ne4po ne2q n1er nera5b n4erar n2ere n4er5i ner4r 1nes 2nes_ 4nesp 2nest 4nesw 3netic ne4v n5eve ne4w n3f n4gab n3gel nge4n4e n5gere n3geri ng5ha n3gib ng1in n5git n4gla ngov4 ng5sh n1gu n4gum n2gy 4n1h4 nha4 nhab3 nhe4 3n4ia ni3an ni4ap ni3ba ni4bl ni4d ni5di ni4er ni2fi ni5ficat n5igr nik4 n1im ni3miz n1in 5nine_ nin4g ni4o 5nis_ nis4ta n2it n4ith 3nitio n3itor ni3tr n1j 4nk2 n5kero n3ket nk3in n1kl 4n1l n5m nme4 nmet4 4n1n2 nne4 nni3al nni4v nob4l no3ble n5ocl 4n3o2d 3noe 4nog noge4 nois5i no5l4i 5nologis 3nomic n5o5miz no4mo no3my no4n non4ag non5i n5oniz 4nop 5nop5o5li nor5ab no4rary 4nosc nos4e nos5t no5ta 1nou 3noun nov3el3 nowl3 n1p4 npi4 npre4c n1q n1r nru4 2n1s2 ns5ab nsati4 ns4c n2se n4s3es nsid1 nsig4 n2sl ns3m n4soc ns4pe n5spi nsta5bl n1t nta4b nter3s nt2i n5tib nti4er nti2f n3tine n4t3ing nti4p ntrol5li nt4s ntu3me nu1a nu4d nu5en nuf4fe n3uin 3nu3it n4um nu1me n5umi 3nu4n n3uo nu3tr n1v2 n1w4 nym4 nyp4 4nz n3za 4oa oad3 o5a5les oard3 oas4e oast5e oat5i ob3a3b o5bar obe4l o1bi o2bin ob5ing o3br ob3ul o1ce och4 o3chet ocif3 o4cil o4clam o4cod oc3rac oc5ratiz ocre3 5ocrit octor5a oc3ula o5cure od5ded od3ic odi3o o2do4 odor3 od5uct_ od5ucts o4el o5eng o3er oe4ta o3ev o2fi of5ite ofit4t o2g5a5r og5ativ o4gato o1ge o5gene o5geo o4ger o3gie 1o1gis og3it o4gl o5g2ly 3ogniz o4gro ogu5i 1ogy 2ogyn o1h2 ohab5 oi2 oic3es oi3der oiff4 oig4 oi5let o3ing oint5er o5ism oi5son oist5en oi3ter o5j 2ok o3ken ok5ie o1la o4lan olass4 ol2d old1e ol3er o3lesc o3let ol4fi ol2i o3lia o3lice ol5id_ o3li4f o5lil ol3ing o5lio o5lis_ ol3ish o5lite o5litio o5liv olli4e ol5ogiz olo4r ol5pl ol2t ol3ub ol3ume ol3un o5lus ol2v o2ly om5ah oma5l om5atiz om2be om4bl o2me om3ena om5erse o4met om5etry o3mia om3ic_ om3ica o5mid om1in o5mini 5ommend omo4ge o4mon om3pi ompro5 o2n on1a on4ac o3nan on1c 3oncil 2ond on5do o3nen on5est on4gu on1ic o3nio on1is o5niu on3key on4odi on3omy on3s onspi4 onspir5a onsu4 onten4 on3t4i ontif5 on5um onva5 oo2 ood5e ood5i oo4k oop3i o3ord oost5 o2pa ope5d op1er 3opera 4operag 2oph o5phan o5pher op3ing o3pit o5pon o4posi o1pr op1u opy5 o1q o1ra o5ra_ o4r3ag or5aliz or5ange ore5a o5real or3ei ore5sh or5est_ orew4 or4gu 4o5ria or3ica o5ril or1in o1rio or3ity o3riu or2mi orn2e o5rof or3oug or5pe 3orrh or4se ors5en orst4 or3thi or3thy or4ty o5rum o1ry os3al os2c os4ce o3scop 4oscopi o5scr os4i4e os5itiv os3ito os3ity osi4u os4l o2so os4pa os4po os2ta o5stati os5til os5tit o4tan otele4g ot3er_ ot5ers o4tes 4oth oth5esi oth3i4 ot3ic_ ot5ica o3tice o3tif o3tis oto5s ou2 ou3bl ouch5i ou5et ou4l ounc5er oun2d ou5v ov4en over4ne over3s ov4ert o3vis oviti4 o5v4ol ow3der ow3el ow5est ow1i own5i o4wo oy1a 1pa pa4ca pa4ce pac4t p4ad 5pagan p3agat p4ai pain4 p4al pan4a pan3el pan4ty pa3ny pa1p pa4pu para5bl par5age par5di 3pare par5el p4a4ri par4is pa2te pa5ter 5pathic pa5thy pa4tric pav4 3pay 4p1b pd4 4pe_ 3pe4a pear4l pe2c 2p2ed 3pede 3pedi pedia4 ped4ic p4ee pee4d pek4 pe4la peli4e pe4nan p4enc pen4th pe5on p4era_ pera5bl p4erag p4eri peri5st per4mal perme5 p4ern per3o per3ti pe5ru per1v pe2t pe5ten pe5tiz 4pf 4pg 4ph_ phar5i phe3no ph4er ph4es_ ph1ic 5phie ph5ing 5phisti 3phiz ph2l 3phob 3phone 5phoni pho4r 4phs ph3t 5phu 1phy pi3a pian4 pi4cie pi4cy p4id p5ida pi3de 5pidi 3piec pi3en pi4grap pi3lo pi2n p4in_ pind4 p4ino 3pi1o pion4 p3ith pi5tha pi2tu 2p3k2 1p2l2 3plan plas5t pli3a pli5er 4plig pli4n ploi4 plu4m plum4b 4p1m 2p3n po4c 5pod_ po5em po3et5 5po4g poin2 5point poly5t po4ni po4p 1p4or po4ry 1pos pos1s p4ot po4ta 5poun 4p1p ppa5ra p2pe p4ped p5pel p3pen p3per p3pet ppo5site pr2 pray4e 5preci pre5co pre3em pref5ac pre4la pre3r p3rese 3press pre5ten pre3v 5pri4e prin4t3 pri4s pris3o p3roca prof5it pro3l pros3e pro1t 2p1s2 p2se ps4h p4sib 2p1t pt5a4b p2te p2th pti3m ptu4r p4tw pub3 pue4 puf4 pul3c pu4m pu2n pur4r 5pus pu2t 5pute put3er pu3tr put4ted put4tin p3w qu2 qua5v 2que_ 3quer 3quet 2rab ra3bi rach4e r5acl raf5fi raf4t r2ai ra4lo ram3et r2ami rane5o ran4ge r4ani ra5no rap3er 3raphy rar5c rare4 rar5ef 4raril r2as ration4 rau4t ra5vai rav3el ra5zie r1b r4bab r4bag rbi2 rbi4f r2bin r5bine rb5ing_ rb4o r1c r2ce rcen4 r3cha rch4er r4ci4b rc4it rcum3 r4dal rd2i rdi4a rdi4er rdin4 rd3ing 2re_ re1al re3an re5arr 5reav re4aw r5ebrat rec5oll rec5ompe re4cre 2r2ed re1de re3dis red5it re4fac re2fe re5fer_ re3fi re4fy reg3is re5it re1li re5lu r4en4ta ren4te re1o re5pin re4posi re1pu r1er4 r4eri rero4 re5ru r4es_ re4spi ress5ib res2t re5stal re3str re4ter re4ti4z re3tri reu2 re5uti rev2 re4val rev3el r5ev5er_ re5vers re5vert re5vil rev5olu re4wh r1f rfu4 r4fy rg2 rg3er r3get r3gic rgi4n rg3ing r5gis r5git r1gl rgo4n r3gu rh4 4rh_ 4rhal ri3a ria4b ri4ag r4ib rib3a ric5as r4ice 4rici 5ricid ri4cie r4ico rid5er ri3enc ri3ent ri1er ri5et rig5an 5rigi ril3iz 5riman rim5i 3rimo rim4pe r2ina 5rina_ rin4d rin4e rin4g ri1o 5riph riph5e ri2pl rip5lic r4iq r2is r4is_ ris4c r3ish ris4p ri3ta3b r5ited_ rit5er_ rit5ers rit3ic ri2tu rit5ur riv5el riv3et riv3i r3j r3ket rk4le rk4lin r1l rle4 r2led r4lig r4lis rl5ish r3lo4 r1m rma5c r2me r3men rm5ers rm3ing r4ming_ r4mio r3mit r4my r4nar r3nel r4ner r5net r3ney r5nic r1nis4 r3nit r3niv rno4 r4nou r3nu rob3l r2oc ro3cr ro4e ro1fe ro5fil rok2 ro5ker 5role_ rom5ete rom4i rom4p ron4al ron4e ro5n4is ron4ta 1room 5root ro3pel rop3ic ror3i ro5ro ros5per ros4s ro4the ro4ty ro4va rov5el rox5 r1p r4pea r5pent rp5er_ r3pet rp4h4 rp3ing r3po r1r4 rre4c rre4f r4reo rre4st rri4o rri4v rron4 rros4 rrys4 4rs2 r1sa rsa5ti rs4c r2se r3sec rse4cr rs5er_ rs3es rse5v2 r1sh r5sha r1si r4si4b rson3 r1sp r5sw rtach4 r4tag r3teb rten4d rte5o r1ti rt5ib rti4d r4tier r3tig rtil3i rtil4l r4tily r4tist r4tiv r3tri rtroph4 rt4sh ru3a ru3e4l ru3en ru4gl ru3in rum3pl ru2n runk5 run4ty r5usc ruti5n rv4e rvel4i r3ven rv5er_ r5vest r3vey r3vic rvi4v r3vo r1w ry4c 5rynge ry3t sa2 2s1ab 5sack sac3ri s3act 5sai salar4 sal4m sa5lo sal4t 3sanc san4de s1ap sa5ta 5sa3tio sat3u sau4 sa5vor 5saw 4s5b scan4t5 sca4p scav5 s4ced 4scei s4ces sch2 s4cho 3s4cie 5scin4d scle5 s4cli scof4 4scopy scour5a s1cu 4s5d 4se_ se4a seas4 sea5w se2c3o 3sect 4s4ed se4d4e s5edl se2g seg3r 5sei se1le 5self 5selv 4seme se4mol sen5at 4senc sen4d s5ened sen5g s5enin 4sentd 4sentl sep3a3 4s1er_ s4erl ser4o 4servo s1e4s se5sh ses5t 5se5um 5sev sev3en sew4i 5sex 4s3f 2s3g s2h 2sh_ sh1er 5shev sh1in sh3io 3ship shiv5 sho4 sh5old shon3 shor4 short5 4shw si1b s5icc 3side_ 5sides 5sidi si5diz 4signa sil4e 4sily 2s1in s2ina 5sine_ s3ing 1sio 5sion sion5a si2r sir5a 1sis 3sitio 5siu 1siv 5siz sk2 4ske s3ket sk5ine sk5ing s1l2 s3lat s2le slith5 2s1m s3ma small3 sman3 smel4 s5men 5smith smol5d4 s1n4 1so so4ce soft3 so4lab sol3d2 so3lic 5solv 3som 3s4on_ sona4 son4g s4op 5sophic s5ophiz s5ophy sor5c sor5d 4sov so5vi 2spa 5spai spa4n spen4d 2s5peo 2sper s2phe 3spher spho5 spil4 sp5ing 4spio s4ply s4pon spor4 4spot squal4l s1r 2ss s1sa ssas3 s2s5c s3sel s5seng s4ses_ s5set s1si s4sie ssi4er ss5ily s4sl ss4li s4sn sspend4 ss2t ssur5a ss5w 2st_ s2tag s2tal stam4i 5stand s4ta4p 5stat_ s4ted stern5i s5tero ste2w stew5a s3the st2i s4ti_ s5tia s1tic 5stick s4tie s3tif st3ing 5stir s1tle 5stock stom3a 5stone s4top 3store st4r s4trad 5stratu s4tray s4trid 4stry 4st3w s2ty 1su su1al su4b3 su2g3 su5is suit3 s4ul su2m sum3i su2n su2r 4sv sw2 4swo s4y 4syc 3syl syn5o sy5rin 1ta 3ta_ 2tab ta5bles 5taboliz 4taci ta5do 4taf4 tai5lo ta2l ta5la tal5en tal3i 4talk tal4lis ta5log ta5mo tan4de tanta3 ta5per ta5pl tar4a 4tarc 4tare ta3riz tas4e ta5sy 4tatic ta4tur taun4 tav4 2taw tax4is 2t1b 4tc t4ch tch5et 4t1d 4te_ tead4i 4teat tece4 5tect 2t1ed te5di 1tee teg4 te5ger te5gi 3tel_ teli4 5tels te2ma2 tem3at 3tenan 3tenc 3tend 4tenes 1tent ten4tag 1teo te4p te5pe ter3c 5ter3d 1teri ter5ies ter3is teri5za 5ternit ter5v 4tes_ 4tess t3ess_ teth5e 3teu 3tex 4tey 2t1f 4t1g 2th_ than4 th2e 4thea th3eas the5at the3is 3thet th5ic_ th5ica 4thil 5think 4thl th5ode 5thodic 4thoo thor5it tho5riz 2ths 1tia ti4ab ti4ato 2ti2b 4tick t4ico t4ic1u 5tidi 3tien tif2 ti5fy 2tig 5tigu till5in 1tim 4timp tim5ul 2t1in t2ina 3tine_ 3tini 1tio ti5oc tion5ee 5tiq ti3sa 3tise tis4m ti5so tis4p 5tistica ti3tl ti4u 1tiv tiv4a 1tiz ti3za ti3zen 2tl t5la tlan4 3tle_ 3tled 3tles_ t5let_ t5lo 4t1m tme4 2t1n2 1to to3b to5crat 4todo 2tof to2gr to5ic to2ma tom4b to3my ton4ali to3nat 4tono 4tony to2ra to3rie tor5iz tos2 5tour 4tout to3war 4t1p 1tra tra3b tra5ch traci4 trac4it trac4te tras4 tra5ven trav5es5 tre5f tre4m trem5i 5tria tri5ces 5tricia 4trics 2trim tri4v tro5mi tron5i 4trony tro5phe tro3sp tro3v tru5i trus4 4t1s2 t4sc tsh4 t4sw 4t3t2 t4tes t5to ttu4 1tu tu1a tu3ar tu4bi tud2 4tue 4tuf4 5tu3i 3tum tu4nis 2t3up_ 3ture 5turi tur3is tur5o tu5ry 3tus 4tv tw4 4t1wa twis4 4two 1ty 4tya 2tyl type3 ty5ph 4tz tz4e 4uab uac4 ua5na uan4i uar5ant uar2d uar3i uar3t u1at uav4 ub4e u4bel u3ber u4bero u1b4i u4b5ing u3ble_ u3ca uci4b uc4it ucle3 u3cr u3cu u4cy ud5d ud3er ud5est udev4 u1dic ud3ied ud3ies ud5is u5dit u4don ud4si u4du u4ene uens4 uen4te uer4il 3ufa u3fl ugh3en ug5in 2ui2 uil5iz ui4n u1ing uir4m uita4 uiv3 uiv4er_ u5j 4uk u1la ula5b u5lati ulch4 5ulche ul3der ul4e u1len ul4gi ul2i u5lia ul3ing ul5ish ul4lar ul4li4b ul4lis 4ul3m u1l4o 4uls uls5es ul1ti ultra3 4ultu u3lu ul5ul ul5v um5ab um4bi um4bly u1mi u4m3ing umor5o um2p unat4 u2ne un4er u1ni un4im u2nin un5ish uni3v un3s4 un4sw unt3ab un4ter_ un4tes unu4 un5y un5z u4ors u5os u1ou u1pe uper5s u5pia up3ing u3pl up3p upport5 upt5ib uptu4 u1ra 4ura_ u4rag u4ras ur4be urc4 ur1d ure5at ur4fer ur4fr u3rif uri4fic ur1in u3rio u1rit ur3iz ur2l url5ing_ ur4no uros4 ur4pe ur4pi urs5er ur5tes ur3the urti4 ur4tie u3ru 2us u5sad u5san us4ap usc2 us3ci use5a u5sia u3sic us4lin us1p us5sl us5tere us1tr u2su usur4 uta4b u3tat 4ute_ 4utel 4uten uten4i 4u1t2i uti5liz u3tine ut3ing ution5a u4tis 5u5tiz u4t1l ut5of uto5g uto5matic u5ton u4tou uts4 u3u uu4m u1v2 uxu3 uz4e 1va 5va_ 2v1a4b vac5il vac3u vag4 va4ge va5lie val5o val1u va5mo va5niz va5pi var5ied 3vat 4ve_ 4ved veg3 v3el_ vel3li ve4lo v4ely ven3om v5enue v4erd 5vere_ v4erel v3eren ver5enc v4eres ver3ie vermi4n 3verse ver3th v4e2s 4ves_ ves4te ve4te vet3er ve4ty vi5ali 5vian 5vide_ 5vided 4v3iden 5vides 5vidi v3if vi5gn vik4 2vil 5vilit v3i3liz v1in 4vi4na v2inc vin5d 4ving vio3l v3io4r vi1ou vi4p vi5ro vis3it vi3so vi3su 4viti vit3r 4vity 3viv 5vo_ voi4 3vok vo4la v5ole 5volt 3volv vom5i vor5ab vori4 vo4ry vo4ta 4votee 4vv4 v4y w5abl 2wac wa5ger wag5o wait5 w5al_ wam4 war4t was4t wa1te wa5ver w1b wea5rie weath3 wed4n weet3 wee5v wel4l w1er west3 w3ev whi4 wi2 wil2 will5in win4de win4g wir4 3wise with3 wiz5 w4k wl4es wl3in w4no 1wo2 wom1 wo5ven w5p wra4 wri4 writa4 w3sh ws4l ws4pe w5s4t 4wt wy4 x1a xac5e x4ago xam3 x4ap xas5 x3c2 x1e xe4cuto x2ed xer4i xe5ro x1h xhi2 xhil5 xhu4 x3i xi5a xi5c xi5di x4ime xi5miz x3o x4ob x3p xpan4d xpecto5 xpe3d x1t2 x3ti x1u xu3a xx4 y5ac 3yar4 y5at y1b y1c y2ce yc5er y3ch ych4e ycom4 ycot4 y1d y5ee y1er y4erf yes4 ye4t y5gi 4y3h y1i y3la ylla5bl y3lo y5lu ymbol5 yme4 ympa3 yn3chr yn5d yn5g yn5ic 5ynx y1o4 yo5d y4o5g yom4 yo5net y4ons y4os y4ped yper5 yp3i y3po y4poc yp2ta y5pu yra5m yr5ia y3ro yr4r ys4c y3s2e ys3ica ys3io 3ysis y4so yss4 ys1t ys3ta ysur4 y3thin yt3ic y1w za1 z5a2b zar2 4zb 2ze ze4n ze4p z1er ze3ro zet4 2z1i z4il z4is 5zl 4zm 1zo zo4m zo5ol zte4 4z1z2 z4zy"; + + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/patterns/es.php b/application/third_party/mpdf/patterns/es.php new file mode 100644 index 0000000..96b40c5 --- /dev/null +++ b/application/third_party/mpdf/patterns/es.php @@ -0,0 +1,11 @@ +<?php +/* + Adapted from Hyphenator 1.0.2 + http://code.google.com/p/hyphenator/ + + Created by Luis Pabon (lpabon at metagrama dot es) +*/ + +$patterns="_a2 _an2a2 _an2\xc3\xa12 _an3aero _ana3li _an\xc3\xa13li _an2e2 _an2\xc3\xa92 _an3e2pigr _ane3xa _ane3x\xc3\xa1 _ane3xe _ane3x\xc3\xa9 _ane3xio _ane3xi\xc3\xb3 _an3h _an2i2 _an2\xc3\xad2 _ani3dar _ani3ll _ani3m _ani3mad _ani3m\xc3\xa1d _ani\xc3\xb1a _ani3q _an3i2so _an3i2s\xc3\xb3 _ani3vel _an2o2 _an2\xc3\xb32 _ano5che _ano5din _ano5mal _an\xc3\xb35mal _ano5nad _ano5nim _an\xc3\xb33nim _ano5ta _ano3t\xc3\xa1 _ante2o3je _anti1a2 _anti1\xc3\xa12 _anti1e2 _anti1\xc3\xa92 _anti1h _anti1i2 _anti1\xc3\xad2 _anti1o2 _anti1\xc3\xb32 _anti1u2 _anti1\xc3\xba2 _an2u2 _an2\xc3\xba2_ _anua3l _anua4lm _anu3bl _anu3da _anu3l _bi1anual _bi1aur _bien1and _bien1apa _bien1ave _bien1est _bien1int _bi1ox _bi1\xc3\xb32x _bi1un _co2a2 _co2\xc3\xa12 _co2e2 _co2\xc3\xa92 _co2i2 _co2\xc3\xad2 _co3o4 _co2\xc3\xb32 _co2u2 _co2\xc3\xba2 _de2s2a2 _de2s2\xc3\xa12 _de2s2e2 _de2s2\xc3\xa92 _de2s2i2 _de2s2\xc3\xad2 _de3s4in3ter2e3sa _de3s4in3ter2e3s\xc3\xa1 _de3s4in3ter2e3se _de3s4in3ter2e3s\xc3\xa9 _de3s4in3ter2e3so _de3s4in3ter2e3s\xc3\xb3 _de2s2o2 _de2s2\xc3\xb32 _de2s2u2 _de2s2\xc3\xba2 _dieci1o2 _en2a2 _en2\xc3\xa12 _en1aceit _en1aciy _en1aguach _en1aguaz _en1anch _en1apa _en1arb _en1art _en2artr _en2e2 _en2\xc3\xa92 _en1ej _en2i2 _en2\xc3\xad2 _en2o2 _en2\xc3\xb32 _eno3jar _en2u2 _en2\xc3\xba2 _enu3mera _enu3mer\xc3\xa1 _enu3mere _he4mee _hepta1e _hu4mea _hu4meo _in2a2 _in2\xc3\xa12 _in3abarc _in3abord _in3acent _in3adapt _in3aguant _ina3movib _in3analiz _ina3nic _in3anim _in\xc3\xa13nim _in3apel _in3aplic _in3apreci _in3aprens _in3arrug _in3asist _in2e2 _in2\xc3\xa92 _in\xc3\xa93dit _in3efic _in3efici _in3eludi _ine3narr _in2i2 _in2\xc3\xad2 _ini3cia _ini3ci\xc3\xa1 _ini3cie _in2o2 _in2\xc3\xb32 _ino3cua _ino3cula _ino3cul\xc3\xa1 _ino3cule _ino3cuo _inte2r1a2 _inte2r1\xc3\xa12 _inte2r1e2 _inte2r1\xc3\xa92 _in3ter2e3sa _in3ter2e3s\xc3\xa1 _in3ter2e3se _in3ter2e3s\xc3\xa9 _in3ter2e3so _in3ter2e3s\xc3\xb3 _inte2r1i2 _inte2r1\xc3\xad2 _inte2r1o2 _inte2r1\xc3\xb32 _inte2r3r _in3te3r4rog _in3te3r4rump _in3te3r4rupc _in3te3r4rupt _inte2r1u2 _inte2r1\xc3\xba2 _intra1o _intra1u _in2u2 _in2\xc3\xba2 _in\xc3\xba3til _inu3tiliz _mal1acon _mal1acos _mala1e _mal1andant _mal1andanz _ma4l3e4du _mal1est _mal1int _pa4n1afri _pa4n1a4meri _pa4n1europ _pa4n1\xc3\xb3pti _pos2t2a2 _pos2t2\xc3\xa12 _pos2t2e2 _pos2t2\xc3\xa92 _post3elec _pos3terg _pos3te3ri _pos2t2i2 _pos2t2\xc3\xad2 _pos3ti3go _pos3ti3la _post3impr _pos3tin _pos3t\xc3\xadn _post3ind _pos3ti3ne _pos3ti3za _pos3ti3zo _pos2t2o2 _pos2t2\xc3\xb32 _pos3t\xc3\xb33ni _post3ope _post3rev _pos2t2u2 _pos2t2\xc3\xba2 _pos3tu3la _pos3tu3l\xc3\xa1 _pos3tu3le _pos3tu3l\xc3\xa9 _pos3tu3ra _pre2a2 _pre2\xc3\xa12 _pre2e2 _pre2\xc3\xa92 _pre2h2 _pre2i2 _pre2\xc3\xad2 _pre2o2 _pre2\xc3\xb32 _pre2u2 _pre2\xc3\xba2 _pro2a2 _pro2\xc3\xa12 _pro2e2 _pro2\xc3\xa92 _pro2h2 _pro2i2 _pro2\xc3\xad2 _pro2o2 _pro2\xc3\xb32 _pro2u2 _pro2\xc3\xba2 _re2a2 _re2\xc3\xa12 _re3abr _re3\xc3\xa1br _re3a2eg _re3afirm _re3af\xc3\xadrm _re3a2grup _re3ajust _rea3j\xc3\xbast _re3alim _rea3lism _rea3list _rea3liza _rea3liz\xc3\xa1 _rea3l\xc3\xadza _re3anim _re3an\xc3\xadm _re3aparec _re3a2q _re3a2z _re3e4 _re2\xc3\xa92 _re2i2 _re2\xc3\xad2 _re3i2m _re3inc _re3ing _re3ins _re3int _re2o2 _re2\xc3\xb32 _re3o2b _re1oc _re1oj _re3orga _retro1a _re2u2 _re2\xc3\xba2 _re3ubica _re3ub\xc3\xadca _reu3mati _reu3m\xc3\xa1ti _re3unir _re3un\xc3\xadr _re1unt _re3usar _re3us\xc3\xa1r _re3utiliz _re3util\xc3\xadz _so3a4s _su2b2a2 _su2b2\xc3\xa12 _sub3aflue _sub3arr _su2b2e2 _su2b2\xc3\xa92 _sub3enten _sub3estim _sub3est\xc3\xadm _su2b2i2 _su2b2\xc3\xad2 _su3b4ien _sub2i3ll _sub3\xc3\xadmi _sub2i3mien _sub3\xc3\xadnd _su2b2o2 _su2b2\xc3\xb32 _sub3ofici _su4b3ray _su2b2u2 _su2b2\xc3\xba2 _sub3urba _su2d1a2fr _su2d1a2me _su2d1est _sur1a2me _sur1est _sur1oes _tele1imp _tele1obj _tran2s1alp _tran2s1and _tran2s1atl _tran2s1oce _tran2s1ur _tra2s1a _tra2s1o _tra2s2o\xc3\xb1 _tri1\xc3\xb32x 4a3ba_ 4a3bais_ 4\xc3\xa13bamos_ 4a3ban_ 4a3bas_ acante2 4a3ci\xc3\xb3n_ 4a3ciones_ acto1a2 acto1\xc3\xa12 acto1e2 acto1\xc3\xa92 acto1h acto1i2 acto1\xc3\xad2 acto1o2 acto1\xc3\xb32 acto1u2 acto1\xc3\xba2 4ad_ 4a3da_ 4a3das_ 4adlas_ 4adle_ 4adles_ 4adlo_ 4adlos_ 4adme_ 4\xc3\xa1d3mela_ 4\xc3\xa1d3melas_ 4\xc3\xa1dmele_ 4\xc3\xa1dmeles_ 4\xc3\xa1dmelo_ 4\xc3\xa1dmelos_ 4adnos_ 4\xc3\xa1dnosla_ 4\xc3\xa1dnoslas_ 4\xc3\xa1dnosle_ 4\xc3\xa1dnosles_ 4\xc3\xa1dnoslo_ 4\xc3\xa1dnoslos_ 4a3do_ 4a3dor_ 4a3dora_ 4a3doras_ 4a3dores_ 4a3dos_ 4\xc3\xa1dsela_ 4\xc3\xa1dselas_ 4\xc3\xa1dsele_ 4\xc3\xa1dseles_ 4\xc3\xa1dselo_ 4\xc3\xa1dselos_ 4adte_ 4\xc3\xa1d3tela_ 4\xc3\xa1d3telas_ 4\xc3\xa1dtele_ 4\xc3\xa1dteles_ 4\xc3\xa1dtelo_ 4\xc3\xa1dtelos_ aero1a2 aero1\xc3\xa12 aero1e2 aero1\xc3\xa92 aero1h aero1i2 aero1\xc3\xad2 aero1o2 aero1\xc3\xb32 aero1u2 aero1\xc3\xba2 afro1a2 afro1\xc3\xa12 afro1e2 afro1\xc3\xa92 afro1h afro1i2 afro1\xc3\xad2 afro1o2 afro1\xc3\xb32 afro1u2 afro1\xc3\xba2 4a4i3gan_ 4\xc3\xa1is_ a\xc3\xad5so_ a\xc3\xad5sos_ 2al_ 2ales_ 4a3mos_ 4an_ ana3l\xc3\xad 4ando 4\xc3\xa1ndola_ 4\xc3\xa1ndolas_ 4\xc3\xa1ndole_ 4\xc3\xa1ndoles_ 4\xc3\xa1ndolo_ 4\xc3\xa1ndolos_ 4\xc3\xa1ndome_ 4\xc3\xa1ndomela_ 4\xc3\xa1ndomelas_ 4\xc3\xa1ndomele_ 4\xc3\xa1ndomeles_ 4\xc3\xa1ndomelo_ 4\xc3\xa1ndomelos_ 4\xc3\xa1ndonos_ 4\xc3\xa1ndoos_ 4\xc3\xa1ndose_ 4\xc3\xa1ndosela_ 4\xc3\xa1ndoselas_ 4\xc3\xa1ndosele_ 4\xc3\xa1ndoseles_ 4\xc3\xa1ndoselo_ 4\xc3\xa1ndoselos_ 4\xc3\xa1ndoseme_ 4\xc3\xa1ndosenos_ 4\xc3\xa1ndote_ 4\xc3\xa1ndotela_ 4\xc3\xa1ndotelas_ 4\xc3\xa1ndotele_ 4\xc3\xa1ndoteles_ 4\xc3\xa1ndotelo_ 4\xc3\xa1ndotelos_ 4\xc3\xa1ndoteme_ 4\xc3\xa1ndotenos_ anfi1a2 anfi1\xc3\xa12 anfi1e2 anfi1\xc3\xa92 anfi1h anfi1i2 anfi1\xc3\xad2 anfi1o2 anfi1\xc3\xb32 anfi1u2 anfi1\xc3\xba2 anglo1a2 anglo1\xc3\xa12 anglo1e2 anglo1\xc3\xa92 anglo1h anglo1i2 anglo1\xc3\xad2 anglo1o2 anglo1\xc3\xb32 anglo1u2 anglo1\xc3\xba2 ante1a2 ante1\xc3\xa12 ante1e2 ante1\xc3\xa92 ante1h ante1i2 ante1\xc3\xad2 ante1o2 ante1\xc3\xb32 ante1u2 ante1\xc3\xba2 4aos_ 4\xc3\xa1osla_ 4\xc3\xa1oslas_ 4\xc3\xa1osle_ 4\xc3\xa1osles_ 4\xc3\xa1oslo_ 4\xc3\xa1oslos_ 4ar_ 4a3ra_ 4a3r\xc3\xa1_ 4a3rais_ 4\xc3\xa13ramos_ 4a3ran_ 4a3r\xc3\xa1n_ 4a3ras_ 4a3r\xc3\xa1s_ archi1a2 archi1\xc3\xa12 archi1e2 archi1\xc3\xa92 archi1h archi1i2 archi1\xc3\xad2 archi1o2 archi1\xc3\xb32 archi1u2 archi1\xc3\xba2 4a3re_ 4a3r\xc3\xa9_ 4a3reis_ 4a3r\xc3\xa9is_ 4a3remos_ 4\xc3\xa13remos_ 4a3ren_ 4a3res_ 4a3r\xc3\xa9s_ 4a3r\xc3\xada_ 4a3r\xc3\xadais 4a3r\xc3\xadamos_ 4a3r\xc3\xadan_ 4a3r\xc3\xadas_ a3rio_ a3rios_ 4a3r\xc3\xads_ 4a4r3la_ 4a4r3las_ 4a4r3le_ 4a4r3les_ 4a4r3lo_ 4a4r3los_ 4a4rme_ 4\xc3\xa14r3mela_ 4\xc3\xa14r3melas_ 4\xc3\xa14rmele_ 4\xc3\xa14r3meles_ 4\xc3\xa14rmelo_ 4\xc3\xa14r3melos_ 4a4r3nos_ 4\xc3\xa14r3nosla_ 4\xc3\xa14r3noslas_ 4\xc3\xa14r3nosle_ 4\xc3\xa14r3nosles_ 4\xc3\xa14r3noslo_ 4\xc3\xa14r3noslos_ 4a3ron_ 4a3ros_ 4\xc3\xa1rosla_ 4\xc3\xa1roslas_ 4\xc3\xa1rosle_ 4\xc3\xa1rosles_ 4\xc3\xa1roslo_ 4\xc3\xa1roslos_ 4a4r3se_ 4\xc3\xa14r3sela_ 4\xc3\xa14r3selas_ 4\xc3\xa14r3sele_ 4\xc3\xa14r3seles_ 4\xc3\xa14r3selo_ 4\xc3\xa14r3selos_ 4a4r3te_ 4\xc3\xa14r3tela_ 4\xc3\xa14r3telas_ 4\xc3\xa14r3tele_ 4\xc3\xa14r3teles_ 4\xc3\xa14r3telo_ 4\xc3\xa14r3telos_ 4as_ 4\xc3\xa1s_ 4a3se_ 4a3seis_ 4\xc3\xa13semos_ 4a3sen_ 4a3ses_ 4aste_ 4asteis_ 4astes_ asu3b2 4ates_ auto1a2 auto1\xc3\xa12 auto1e2 auto1\xc3\xa92 auto1h auto1i2 auto1\xc3\xad2 auto1o2 auto1\xc3\xb32 auto1u2 auto1\xc3\xba2 1b 2bb 2bc 2b3c2n 2b3c2t 2b3c2z 2bd 2bf 2b3f2t 2bg 2b3g2n 2b1h biblio1a2 biblio1\xc3\xa12 biblio1e2 biblio1\xc3\xa92 biblio1h biblio1i2 biblio1\xc3\xad2 biblio1o2 biblio1\xc3\xb32 biblio1u2 biblio1\xc3\xba2 bien2 b4ien3das_ b4ien3do_ bien3h bien3m bien3q bien3t bien3v bio1a2 bio1\xc3\xa12 bio1e2 bio1\xc3\xa92 bio1h bio1i2 bio1\xc3\xad2 bio1o2 bio1\xc3\xb32 bio1u2 bio1\xc3\xba2 bi1u2n\xc3\xad 2bj 2bk b2l 2bl_ 2bm 2b3m2n 2bn 2bp 2b3p2n 2b3p2s 2b3p2t 2bq b2r 2br_ 2bs 2bt 2b3t2s 2b3t2z 2bv 2bw 2bx 2by 2bz 1c 4caca4 4caga4 4cagas_ 4cago4 cardio1a2 cardio1\xc3\xa12 cardio1e2 cardio1\xc3\xa92 cardio1h cardio1i2 cardio1\xc3\xad2 cardio1o2 cardio1\xc3\xb32 cardio1u2 cardio1\xc3\xba2 2cb 2cc 2c3c2n 2c3c2t 2c3c2z 2cd cefalo1a2 cefalo1\xc3\xa12 cefalo1e2 cefalo1\xc3\xa92 cefalo1h cefalo1i2 cefalo1\xc3\xad2 cefalo1o2 cefalo1\xc3\xb32 cefalo1u2 cefalo1\xc3\xba2 centi1a2 centi1\xc3\xa12 centi5\xc3\xa1rea centi1e2 centi1\xc3\xa92 centi1h centi1i2 centi1\xc3\xad2 centi1o2 centi1\xc3\xb32 centi1u2 centi1\xc3\xba2 2cf 2c3f2t 2cg 2c3g2n c4h 2ch_ ciclo1a2 ciclo1\xc3\xa12 ciclo1e2 ciclo1\xc3\xa92 ciclo1h ciclo1i2 ciclo1\xc3\xad2 ciclo1o2 ciclo1\xc3\xb32 ciclo1u2 ciclo1\xc3\xba2 cito1a2 cito1\xc3\xa12 cito1e2 cito1\xc3\xa92 cito1h cito1i2 cito1\xc3\xad2 cito1o2 cito1\xc3\xb32 cito1u2 cito1\xc3\xba2 2cj c2k c2l 2cl_ 2cm 2c3m2n 2cn 4cn_ 3c2neor cnico1a2 cnico1\xc3\xa12 cnico1e2 cnico1\xc3\xa92 cnico1h cnico1i2 cnico1\xc3\xad2 cnico1o2 cnico1\xc3\xb32 cnico1u2 cnico1\xc3\xba2 co4acci co4acti co4adju co4a3dun co4adyu co3agen co4a3gul co4\xc3\xa13gul co4a3lic co4aptac co4art co4\xc3\xa1rt co4e3fic co4erc co4erz co4e3t\xc3\xa1 co3exis co4imbr co4inci co4i3to con1imbr co3n4imbri contra1a2 contra1\xc3\xa12 contra1e2 contra1\xc3\xa92 contra1h contra1i2 contra1\xc3\xad2 contra1o2 contra1\xc3\xb32 contra1u2 contra1\xc3\xba2 con1urb co4o3per co4o3p\xc3\xa9r co4opt co4ord 2cp 2c3p2n 2c3p2s 2c3p2t 2cq c2r 2cr_ cripto1a2 cripto1\xc3\xa12 cripto1e2 cripto1\xc3\xa92 cripto1h cripto1i2 cripto1\xc3\xad2 cripto1o2 cripto1\xc3\xb32 cripto1u2 cripto1\xc3\xba2 crono1a2 crono1\xc3\xa12 crono1e2 crono1\xc3\xa92 crono1h crono1i2 crono1\xc3\xad2 crono1o2 crono1\xc3\xb32 crono1u2 crono1\xc3\xba2 2cs 2ct 4ct_ 2c3t2s 2c3t2z 4culo4 2cv 2cw 2cx 2cy 2cz 4cz_ 1d 2db 2dc 2d3c2n 2d3c2t 2d3c2z 2dd deca1a2 deca1\xc3\xa12 deca1e2 deca1\xc3\xa92 deca1h deca1i2 deca1\xc3\xad2 deca2i3mient deca1o2 deca1\xc3\xb32 deca1u2 deca1\xc3\xba2 decimo1 de4s3abast de4s3aboll de4s3aboto de4s3abr desa3brid de4s3abroch de4s3aceit de4s3aceler desa3cert desa3ciert de4s3acobar de4s3acomod de4s3acomp de4s3acons de4s3acopl de4s3acorr de4s3acostum de4s3acot desa3craliz de4s3acredit de4s3activ de4s3acuart de4s3aderez de4s3adeud de4s3adorar de4s3adormec de4s3adorn de4s3advert de4s3aferr desa3fi desa3f\xc3\xad de4s3afic de4s3afil de4s3afin de4s3afor desa3garr de4s3agraci de4s3agrad de4s3agravi de4s3agreg de4s3agrup de4s3agu desa3g\xc3\xbc desa3guisado de4s3aherr de4s3ahij de4s3ajust de4s3alagar de4s3alent de4s3alfom de4s3alfor de4s3alien desa3lin de4s3aline de4s3ali\xc3\xb1 desa3liv de4s3alm de4s3almid desa3loj de4s3alquil de4s3alter de4s3alumbr desa3marr desa3mobl de4s3amold de4s3amort de4s3amuebl de4s3and de4s3angel de4s3anid de4s3anim de4s3an\xc3\xadm de4s3anud desa3pacib de4s3apadr desa3pa\xc3\xb1 de4s3apare desa3parec desa3paric desa3peg desa3percib de4s3aplic de4s3apolill de4s3apoy de4s3aprend desa3prensi de4s3apret de4s3apriet de4s3aprob de4s3apropi de4s3aprovech de4s3arbol de4s3aren de4s3arm des4arme de4s3arraig de4s3arregl de4s3arrend de4s3arrim desa3rroll de4s3arrop de4s3arrug de4s3articul de4s3asent de4s3asist de4s3asn desa3soseg desa3sosieg de4s3atenc de4s3atend de4s3atent de4s3atiend desa3tin de4s3atorn de4s3atranc de4s3autor de4s3avis desa3yun desa3zon desa3z\xc3\xb3n de4s3embal de4s3emb\xc3\xa1l de4s3embar de4s3emb\xc3\xa1r de4s3embarg de4s3embols de4s3emborr de4s3embosc de4s3embot de4s3embrag de4s3embr\xc3\xa1g de4s3embrave de4s3embr\xc3\xa1ve de4s3embroll de4s3embr\xc3\xb3ll de4s3embruj de4s3embr\xc3\xbaj de3semej de4s3empac de4s3empa\xc3\xb1 de4s3emp\xc3\xa1\xc3\xb1 de4s3empaquet de4s3empaqu\xc3\xa9t de4s3emparej de4s3empar\xc3\xa9j de4s3emparent de4s3empat de4s3emp\xc3\xa9 de4s3empedr de4s3empeg de4s3empeor de4s3emperez de4s3empern de4s3emple de4s3empolv de4s3empotr de4s3empoz de4s3enam de4s3encab de4s3encad de4s3encaj de4s3enc\xc3\xa1j de4s3encall de4s3enc\xc3\xa1ll de4s3encam de3sencant de4s3encap de4s3encar de4s3enc\xc3\xa1r de4s3ench de4s3encl de4s3enco de4s3encr de4s3encu de4s3end de3senfad de3senf\xc3\xa1d de4s3enfi de4s3enfo de4s3enf\xc3\xb3 de3senfren de4s3enfund de4s3enfur de4s3enganch de3senga\xc3\xb1 de3seng\xc3\xa1\xc3\xb1 de4s3engar de4s3engas de4s3engom de4s3engoz de4s3engra de4s3enhebr de4s3enj de4s3enlad de4s3enlaz de4s3enlo de4s3enm de4s3enr de4s3ens de4s3enta de3sentend de4s3enter de3sentien de3senti\xc3\xa9n de4s3entier de4s3enti\xc3\xa9r de4s3ento de4s3entr de4s3entu de4s3envain de3senvolvim de3seo de4s3eq de3s4erci de3s4ert de3s4\xc3\xa9rt de4s3espa de3sesper de3sesperac de4s3esperanz de4s3estabil de4s3estim de3sider de3sidia de3sidio de3siert de3sign de3sigual de3silusi de4s3imagin de4s3iman de4s3impon de4s3impres de4s3impresX de4s3incent de4s3inclin de4s3incorp de4s3incrust de3sinenc de3sinfec de4s3infl de4s3inflam de4s3inform de4s3inhib de4s3insect de4s3instal de3s4integr de3s4inter de4s3intox de4s3inver de3sisten de4s3obedec de4s3oblig de4s3obstr de3socup de4s3odor de3solac de3solad de3soll de3sonce de4s3orde de4s3\xc3\xb3rde de4s3orej de3s4oseg de4s3ova de4s3ovi de4s3oxi de4s3oye de4s3oy\xc3\xa9 de4s3ub4ic de3s4ubstan de3su3dan de3su3dar de3su3das de3suell de4s3unier de4s3unim de4s3unir de3s4ustan 2df 2d3f2t 2dg 2d3g2n 2d1h 2dj 2dk 2dl 2dm 2d3m2n 2dn dodeca1a2 dodeca1\xc3\xa12 dodeca1e2 dodeca1\xc3\xa92 dodeca1h dodeca1i2 dodeca1\xc3\xad2 dodeca1o2 dodeca1\xc3\xb32 dodeca1u2 dodeca1\xc3\xba2 2dp 2d3p2n 2d3p2s 2d3p2t 2dq d2r 2dr_ 2ds 2dt 2d3t2s 2d3t2z 2dv 2dw 2dx 2dy 2dz 4e_ 4\xc3\xa9_ ea3cia_ ea3cias_ ea3cio_ ea3cios_ 4eadla_ e4a3miento ecano1a2 ecano1\xc3\xa12 ecano1e2 ecano1\xc3\xa92 ecano1h ecano1i2 ecano1\xc3\xad2 ecano1o2 ecano1\xc3\xb32 ecano1u2 ecano1\xc3\xba2 eco1a2 eco1\xc3\xa12 eco1e2 eco1\xc3\xa92 eco1h eco1i2 eco1\xc3\xad2 eco1o2 eco1\xc3\xb32 eco1u2 eco1\xc3\xba2 ectro1a2 ectro1\xc3\xa12 ectro1e2 ectro1\xc3\xa92 ectro1h ectro1i2 ectro1\xc3\xad2 ectro1o2 ectro1\xc3\xb32 ectro1u2 ectro1\xc3\xba2 4ed_ 4edlas_ 4edle_ 4edles_ 4edlo_ 4edlos_ 4edme_ 4\xc3\xa9d3mela_ 4\xc3\xa9d3melas_ 4\xc3\xa9dmele_ 4\xc3\xa9dmeles_ 4\xc3\xa9dmelo_ 4\xc3\xa9dmelos_ 4ednos_ 4\xc3\xa9dnosla_ 4\xc3\xa9dnoslas_ 4\xc3\xa9dnosle_ 4\xc3\xa9dnosles_ 4\xc3\xa9dnoslo_ 4\xc3\xa9dnoslos_ 4\xc3\xa93drica_ 4\xc3\xa93dricas_ 4\xc3\xa93drico_ 4\xc3\xa93dricos_ 4e3dro_ 4e3dros_ 4\xc3\xa9dsela_ 4\xc3\xa9dselas_ 4\xc3\xa9dsele_ 4\xc3\xa9dseles_ 4\xc3\xa9dselo_ 4\xc3\xa9dselos_ 4edte_ 4\xc3\xa9d3tela_ 4\xc3\xa9d3telas_ 4\xc3\xa9dtele_ 4\xc3\xa9dteles_ 4\xc3\xa9dtelo_ 4\xc3\xa9dtelos_ 4eedla_ 4\xc3\xa9is_ 4emboca emi2o2 4e3mos_ 4en_ endo1a2 endo1\xc3\xa12 endo1e2 endo1\xc3\xa92 endo1h endo1i2 endo1\xc3\xad2 endo1o2 endo1\xc3\xb32 endo1u2 endo1\xc3\xba2 ento1a2 ento1\xc3\xa12 ento1e2 ento1\xc3\xa92 ento1h ento1i2 ento1\xc3\xad2 ento1o2 ento1\xc3\xb32 ento1u2 ento1\xc3\xba2 entre1a2 entre1\xc3\xa12 entre1e2 entre1\xc3\xa92 entre1h entre1i2 entre1\xc3\xad2 entre1o2 entre1\xc3\xb32 entre1u2 entre1\xc3\xba2 4eos_ 4\xc3\xa9osla_ 4\xc3\xa9oslas_ 4\xc3\xa9osle_ 4\xc3\xa9osles_ 4\xc3\xa9oslo_ 4\xc3\xa9oslos_ 4er_ 4e3r\xc3\xa1_ e5r4a3ba_ e5r4a3bais_ e5r4\xc3\xa13bamos_ e5r4a3ban_ e5r4a3bas_ 4e3ra3ble_ 4e3ra3blemente_ 4e3ra3bles_ e5r4ad_ e5r4a3da_ e5r4a3das_ e5r4a3do_ e5r4a3dor_ e5r4a3dora_ e5r4a3doras_ e5r4a3dores_ e5r4a3dos_ e5r4\xc3\xa1is_ e5r4a3mos_ e5r4an_ 4e3r\xc3\xa1n_ e5r4a3ra_ e5r4a3r\xc3\xa1_ e5r4a3rais_ e5r4\xc3\xa13ramos_ e5r4a3ran_ e5r4a3r\xc3\xa1n_ e5r4a3ras_ e5r4a3r\xc3\xa1s_ e5r4a3re_ e5r4a3r\xc3\xa9_ e5r4a3reis_ e5r4a3r\xc3\xa9is_ e5r4a3remos_ e5r4\xc3\xa13remos_ e5r4a3ren_ e5r4a3res_ e5r4a3r\xc3\xa9s_ e5r4a3r\xc3\xada_ e5r4a3r\xc3\xadais e5r4a3r\xc3\xadamos_ e5r4a3r\xc3\xadan_ e5r4a3r\xc3\xadas_ e5r4a3r\xc3\xads_ e5r4a3ron_ e5r4as_ 4e3r\xc3\xa1s_ e5r4a3se_ e5r4a3seis_ e5r4\xc3\xa13semos_ e5r4a3sen_ e5r4a3ses_ e5r4aste_ e5r4asteis_ e5r4astes_ e5r4ates_ 4e3r\xc3\xa9_ 4e3r\xc3\xa9is_ 4e3re3mos_ 4e3r\xc3\xa9s_ 4e3r\xc3\xada_ 4e3r\xc3\xadais_ 4e3r\xc3\xadamos_ 4e3r\xc3\xadan_ 4e3r\xc3\xadas_ 4e3rior_ 4e3riora_ 4e3rioras_ 4e3riores_ 4e3rioridad_ 4e3rioridades_ 4e3riormente_ 4e3r\xc3\xads_ 4erla_ 4erlas_ 4erle_ 4erles_ 4erlo_ 4erlos_ 4erme_ 4\xc3\xa9r3mela_ 4\xc3\xa9r3melas_ 4\xc3\xa9rmele_ 4\xc3\xa9rmeles_ 4\xc3\xa9rmelo_ 4\xc3\xa9rmelos_ 4ernos_ 4\xc3\xa9rnosla_ 4\xc3\xa9rnoslas_ 4\xc3\xa9rnosle_ 4\xc3\xa9rnosles_ 4\xc3\xa9rnoslo_ 4\xc3\xa9rnoslos_ 4e3ros_ 4\xc3\xa93rosla_ 4\xc3\xa93roslas_ 4\xc3\xa93rosle_ 4\xc3\xa93rosles_ 4\xc3\xa93roslo_ 4\xc3\xa93roslos_ 4erse_ 4\xc3\xa9rsela_ 4\xc3\xa9rselas_ 4\xc3\xa9rsele_ 4\xc3\xa9rseles_ 4\xc3\xa9rselo_ 4\xc3\xa9rselos_ 4erte_ 4\xc3\xa9r3tela_ 4\xc3\xa9r3telas_ 4\xc3\xa9rtele_ 4\xc3\xa9rteles_ 4\xc3\xa9rtelo_ 4\xc3\xa9rtelos_ 4\xc3\xa9s 4es_ euco1a2 euco1\xc3\xa12 euco1e2 euco1\xc3\xa92 euco1h euco1i2 euco1\xc3\xad2 euco1o2 euco1\xc3\xb32 euco1u2 euco1\xc3\xba2 euro1a2 euro1\xc3\xa12 euro1e2 euro1\xc3\xa92 euro1h euro1i2 euro1\xc3\xad2 euro1o2 euro1\xc3\xb32 euro1u2 euro1\xc3\xba2 expoli4 extra1a2 extra1\xc3\xa12 extra1e2 extra1\xc3\xa92 extra1h extra1i2 extra1\xc3\xad2 extra1o2 extra1\xc3\xb32 extra1u2 extra1\xc3\xba2 1f familia3ri 2fb 2fc 2fd 2ff 2fg 2f1h 2fj 2fk f2l 2fl_ 2fm 2fn fono1a2 fono1\xc3\xa12 fono1e2 fono1\xc3\xa92 fono1h fono1i2 fono1\xc3\xad2 fono1o2 fono1\xc3\xb32 fono1u2 fono1\xc3\xba2 foto1a2 foto1\xc3\xa12 foto1e2 foto1\xc3\xa92 foto1h foto1i2 foto1\xc3\xad2 foto1o2 foto1\xc3\xb32 foto1u2 foto1\xc3\xba2 2fp 2fq f2r 2fr_ 2fs 2ft 4ft_ 2fv 2fw 2fx 2fy 2fz 1g gastro1a2 gastro1\xc3\xa12 gastro1e2 gastro1\xc3\xa92 gastro1h gastro1i2 gastro1\xc3\xad2 gastro1o2 gastro1\xc3\xb32 gastro1u2 gastro1\xc3\xba2 2gb 2gc 2gd geo1a2 geo1\xc3\xa12 geo1e2 geo1\xc3\xa92 geo1h geo1i2 geo1\xc3\xad2 geo1o2 geo1\xc3\xb32 geo1u2 geo1\xc3\xba2 2gf 2gg 2g2h 2gj 2gk g2l 2gl_ gluco1a2 gluco1\xc3\xa12 gluco1e2 gluco1\xc3\xa92 gluco1h gluco1i2 gluco1\xc3\xad2 gluco1o2 gluco1\xc3\xb32 gluco1u2 gluco1\xc3\xba2 2gm 2gn 4gn_ 2gp 2gq g2r 2gr_ 2gs 2gt 2gv 2gw 2gx 2gy 2gz 2hb 2hc 2hd hecto1a2 hecto1\xc3\xa12 hecto1e2 hecto1\xc3\xa92 hecto1h hecto1i2 hecto1\xc3\xad2 hecto1o2 hecto1\xc3\xb32 hecto1u2 hecto1\xc3\xba2 helio1a2 helio1\xc3\xa12 helio1e2 helio1\xc3\xa92 helio1h helio1i2 helio1\xc3\xad2 helio1o2 helio1\xc3\xb32 helio1u2 helio1\xc3\xba2 hemato1a2 hemato1\xc3\xa12 hemato1e2 hemato1\xc3\xa92 hemato1h hemato1i2 hemato1\xc3\xad2 hemato1o2 hemato1\xc3\xb32 hemato1u2 hemato1\xc3\xba2 hemi1a2 hemi1\xc3\xa12 hemi1e2 hemi1\xc3\xa92 hemi1h hemi1i2 hemi1\xc3\xad2 hemi1o2 hemi1\xc3\xb32 hemi1u2 hemi1\xc3\xba2 hemo1a2 hemo1\xc3\xa12 hemo1e2 hemo1\xc3\xa92 hemo1h hemo1i2 hemo1\xc3\xad2 hemo1o2 hemo1\xc3\xb32 hemo1u2 hemo1\xc3\xba2 hexa1a2 hexa1\xc3\xa12 hexa1e2 hexa1\xc3\xa92 hexa1h hexa1i2 hexa1\xc3\xad2 hexa1o2 hexa1\xc3\xb32 hexa1u2 hexa1\xc3\xba2 2hf 2hg 2h1h hidro1a2 hidro1\xc3\xa12 hidro1e2 hidro1\xc3\xa92 hidro1h hidro1i2 hidro1\xc3\xad2 hidro1o2 hidro1\xc3\xb32 hidro1u2 hidro1\xc3\xba2 hipe2r1a2 hipe2r1\xc3\xa12 hipe2r1e2 hipe2r1\xc3\xa92 hipe2r1i2 hipe2r1\xc3\xad2 hipe2r1o2 hipe2r1\xc3\xb32 hipe2r3r hipe2r1u2 hipe2r1\xc3\xba2 histo1a2 histo1\xc3\xa12 histo1e2 histo1\xc3\xa92 histo1h histo1i2 histo1\xc3\xad2 histo1o2 histo1\xc3\xb32 histo1u2 histo1\xc3\xba2 2hj 2hk 2hl 2hm 2hn homo1a2 homo1\xc3\xa12 homo1e2 homo1\xc3\xa92 homo1h homo1i2 homo1\xc3\xad2 homo1o2 homo1\xc3\xb32 homo1u2 homo1\xc3\xba2 2hp 2hq 2hr 2hs 2ht 2hv 2hw 2hx 2hy 2hz 4\xc3\xad_ i2a_ 4\xc3\xada_ 4\xc3\xadais_ 4\xc3\xada3mos_ 4\xc3\xadan_ ia5res_ i2as_ 4\xc3\xadas_ 2i3ca_ 2i3cas_ 2i3co_ icono1a2 icono1\xc3\xa12 icono1e2 icono1\xc3\xa92 icono1h icono1i2 icono1\xc3\xad2 icono1o2 icono1\xc3\xb32 icono1u2 icono1\xc3\xba2 2i3cos_ 4\xc3\xad3da_ 4i2dal_ 4i2dales_ 4\xc3\xad3das_ 4i3deo_ 4i3deos_ 4\xc3\xad3do_ 4\xc3\xad3dos_ 4i4er_ 4i3ga_ 4i3g\xc3\xa1is_ 4i3g\xc3\xa13monos_ 4i3g\xc3\xa13monosla_ 4i3g\xc3\xa13monoslas_ 4i3g\xc3\xa13monosle_ 4i3g\xc3\xa13monosles_ 4i3g\xc3\xa13monoslo_ 4i3g\xc3\xa13monoslos_ 4i3g\xc3\xa13moos_ 4i3g\xc3\xa13moosla_ 4i3g\xc3\xa13mooslas_ 4i3g\xc3\xa13moosle_ 4i3g\xc3\xa13moosles_ 4i3g\xc3\xa13mooslo_ 4i3g\xc3\xa13mooslos_ 4i3gamos_ 4i3g\xc3\xa13mosela_ 4i3g\xc3\xa13moselas_ 4i3g\xc3\xa13mosele_ 4i3g\xc3\xa13moseles_ 4i3g\xc3\xa13moselo_ 4i3g\xc3\xa13moselos_ 4i3g\xc3\xa13mosla_ 4i3g\xc3\xa13moslas_ 4i3g\xc3\xa13mosle_ 4i3g\xc3\xa13mosles_ 4i3g\xc3\xa13moslo_ 4i3g\xc3\xa13moslos_ 4i3g\xc3\xa13mosme_ 4i3g\xc3\xa13mos3mela_ 4i3g\xc3\xa13mos3melas_ 4i3g\xc3\xa13mosmele_ 4i3g\xc3\xa13mosmeles_ 4i3g\xc3\xa13mosmelo_ 4i3g\xc3\xa13mosmelos_ 4i3g\xc3\xa13moste_ 4i3g\xc3\xa13mos3tela_ 4i3g\xc3\xa13mos3telas_ 4i3g\xc3\xa13mostele_ 4i3g\xc3\xa13mosteles_ 4i3g\xc3\xa13mostelo_ 4i3g\xc3\xa13mostelos_ 4i3gas_ 4i3g\xc3\xa1s_ 4i3go_ 4\xc3\xad3mos_ infra1a2 infra1\xc3\xa12 infra1e2 infra1\xc3\xa92 infra1h infra1i2 infra1\xc3\xad2 infra1o2 infra1\xc3\xb32 infra1u2 infra1\xc3\xba2 inter4\xc3\xa9s inter4esar inter4in inter4ino inter4ior intra1a2 intra1\xc3\xa12 intra1e2 intra1\xc3\xa92 intra1h intra1i2 intra1\xc3\xad2 intra1o2 intra1\xc3\xb32 intra1u2 intra1\xc3\xba2 i2o_ i2os_ 4\xc3\xadsmo_ 4\xc3\xadsmos_ iso1a2 iso1\xc3\xa12 iso1e2 iso1\xc3\xa92 iso1h iso1i2 iso1\xc3\xad2 iso1o2 iso1\xc3\xb32 iso1u2 iso1\xc3\xba2 4\xc3\xadsta_ 4\xc3\xadstas_ 4\xc3\xad4s3te_ 4\xc3\xads3teis_ 4\xc3\xad4s3tes_ 4\xc3\xadstica_ 4\xc3\xadsticas_ 4\xc3\xadstico_ 4\xc3\xadsticos_ 4\xc3\xad3tes_ 1j 2jb 2jc 2jd 2jf 2jg 2j1h 2jj 2jk 2jl 2jm 2jn 2jp 2jq 2jr 2js 2jt 2jv 2jw 2jx 2jy 2jz 1k 2kb 2kc 2kd 2kf 2kg 2k2h kilo1a2 kilo1\xc3\xa12 kilo1e2 kilo1\xc3\xa92 kilo1h kilo1i2 kilo1\xc3\xad2 kilo1o2 kilo1\xc3\xb32 kilo1u2 kilo1\xc3\xba2 2kj 2kk k2l 2kl_ 2km 2kn 2kp 2kq k2r 2kr_ 2ks 2kt 2kv 2kw 2kx 2ky 2kz 1l 2lb 2lc 2l3c2n 2l3c2t 2l3c2z 2ld 2lf 2l3f2t 2lg 2l3g2n 2l1h li5\xc3\xa1rea 2lj 2lk l4l 2ll_ 2lm 2l3m2n 2ln 2lp 2l3p2n 2l3p2s 2l3p2t 2lq 2lr 2ls 2lt 2l3t2s 2l3t2z 2lv 2lw 2lx 2ly 2lz 1m macro1a2 macro1\xc3\xa12 macro1e2 macro1\xc3\xa92 macro1h macro1i2 macro1\xc3\xad2 macro1o2 macro1\xc3\xb32 macro1u2 macro1\xc3\xba2 mal2 mal3b mal3c mal3d mal3f mal3g ma4l3h mal3m mal3p mal3q mal3s mal3t mal3v mante4a maxi1a2 maxi1\xc3\xa12 maxi1e2 maxi1\xc3\xa92 maxi1h maxi1i2 maxi1\xc3\xad2 maxi1o2 maxi1\xc3\xb32 maxi1u2 maxi1\xc3\xba2 2mb 2mc 2m3c2n 2m3c2t 2m3c2z 2md 4meable_ 4meables_ mega1a2 mega1\xc3\xa12 mega1e2 mega1\xc3\xa92 mega1h mega1i2 mega1\xc3\xad2 megalo1a2 megalo1\xc3\xa12 megalo1e2 megalo1\xc3\xa92 megalo1h megalo1i2 megalo1\xc3\xad2 megalo1o2 megalo1\xc3\xb32 megalo1u2 megalo1\xc3\xba2 mega1o2 mega1\xc3\xb32 mega1u2 mega1\xc3\xba2 melano1a2 melano1\xc3\xa12 melano1e2 melano1\xc3\xa92 melano1h melano1i2 melano1\xc3\xad2 melano1o2 melano1\xc3\xb32 melano1u2 melano1\xc3\xba2 3mente_ 4meo_ 2mf 2m3f2t 2mg 2m3g2n 2m1h micro1a2 micro1\xc3\xa12 micro1e2 micro1\xc3\xa92 micro1h micro1i2 micro1\xc3\xad2 micro1o2 micro1\xc3\xb32 micro1u2 micro1\xc3\xba2 mili1a2 mili1\xc3\xa12 mili4ar mili4ario mili1e2 mili1\xc3\xa92 mili1h mili1i2 mili1\xc3\xad2 mili1o2 mili1\xc3\xb32 mili1u2 mili1\xc3\xba2 mini1a2 mini1\xc3\xa12 mini4a5tur mini1e2 mini1\xc3\xa92 mini1h mini1i2 mini1\xc3\xad2 mini1o2 mini1\xc3\xb32 mini1u2 mini1\xc3\xba2 miria1a2 miria1\xc3\xa12 miria1e2 miria1\xc3\xa92 miria1h miria1i2 miria1\xc3\xad2 miria1o2 miria1\xc3\xb32 miria1u2 miria1\xc3\xba2 2mj 2mk 2ml 2mm 2m3m2n 2mn 4mn_ mono1a2 mono1\xc3\xa12 mono1e2 mono1\xc3\xa92 mono1h mono1i2 mono1\xc3\xad2 mono1o2 mono1\xc3\xb32 mono1u2 mono1\xc3\xba2 2mp 2m3p2n 2m3p2s 2m3p2t 2mq 2mr 2ms 2mt 2m3t2s 2m3t2z multi1a2 multi1\xc3\xa12 multi1e2 multi1\xc3\xa92 multi1h multi1i2 multi1\xc3\xad2 multi1o2 multi1\xc3\xb32 multi1u2 multi1\xc3\xba2 2mv 2mw 2mx 2my 2mz 1n namo1a2 namo1\xc3\xa12 namo1e2 namo1\xc3\xa92 namo1h namo1i2 namo1\xc3\xad2 namo1o2 namo1\xc3\xb32 namo1u2 namo1\xc3\xba2 2nb 2nc 2n3c2n 2n3c2t 2n3c2z 2nd necro1a2 necro1\xc3\xa12 necro1e2 necro1\xc3\xa92 necro1h necro1i2 necro1\xc3\xad2 necro1o2 necro1\xc3\xb32 necro1u2 necro1\xc3\xba2 neo1a2 neo1\xc3\xa12 neo1e2 neo1\xc3\xa92 neo1h neo1i2 neo1\xc3\xad2 neo1o2 neo1\xc3\xb32 neo1u2 neo1\xc3\xba2 neto1a2 neto1\xc3\xa12 neto1e2 neto1\xc3\xa92 neto1h neto1i2 neto1\xc3\xad2 neto1o2 neto1\xc3\xb32 neto1u2 neto1\xc3\xba2 2nf 2n3f2t 2ng 2n3g2n 2n1h 2nj 2nk 2nl 2nm 2n3m2n 2nn 2no_ norte1a2 norte1\xc3\xa12 norte1e2 norte1\xc3\xa92 norte1h norte1i2 norte1\xc3\xad2 norte1o2 norte1\xc3\xb32 norte1u2 norte1\xc3\xba2 2np 2n3p2n 2n3p2s 2n3p2t 2nq 2nr 2ns 2nt 2n3t2s 2n3t2z 2nv 2nw 2nx 2ny 2nz 1\xc3\xb1 2o_ octa1a2 octa1\xc3\xa12 octa1e2 octa1\xc3\xa92 octa1h octa1i2 octa1\xc3\xad2 octa1o2 octa1\xc3\xb32 octa1u2 octa1\xc3\xba2 octo1a2 octo1\xc3\xa12 octo1e2 octo1\xc3\xa92 octo1h octo1i2 octo1\xc3\xad2 octo1o2 octo1\xc3\xb32 octo1u2 octo1\xc3\xba2 4o2ica_ 4o2icas_ 4o2ico_ 4o2icos_ o4i3dal_ o4i3dales_ 4o2i3de_ o4i3dea_ o4i3deas_ 4o2i3des_ oligo1a2 oligo1\xc3\xa12 oligo1e2 oligo1\xc3\xa92 oligo1h oligo1i2 oligo1\xc3\xad2 oligo1o2 oligo1\xc3\xb32 oligo1u2 oligo1\xc3\xba2 4\xc3\xb33loga_ 4\xc3\xb33logas_ 4o3log\xc3\xada_ 4o3log\xc3\xadas_ 4o3l\xc3\xb3gica_ 4o3l\xc3\xb3gicamente_ 4o3l\xc3\xb3gicas_ 4o3l\xc3\xb3gico_ 4o3l\xc3\xb3gicos_ 4\xc3\xb33logo_ 4\xc3\xb33logos_ omni1a2 omni1\xc3\xa12 omni1e2 omni1\xc3\xa92 omni1h omni1i2 omni1\xc3\xad2 omni1o2 omni1\xc3\xb32 omni1u2 omni1\xc3\xba2 4\xc3\xb3n_ 4ones_ o2os_ 2os_ 2o3sa_ 2o3samente_ 2o3sas_ 2o3so_ 2o3sos_ 4\xc3\xb3steo_ 4\xc3\xb3steos_ 2\xc3\xb3tic 1p paleo1a2 paleo1\xc3\xa12 paleo1e2 paleo1\xc3\xa92 paleo1h paleo1i2 paleo1\xc3\xad2 paleo1o2 paleo1\xc3\xb32 paleo1u2 paleo1\xc3\xba2 para1a2 para1\xc3\xa12 para1e2 para1\xc3\xa92 para1h para1i2 para1\xc3\xad2 para2is_ para4\xc3\xadso para1o2 para1\xc3\xb32 para1u2 para1\xc3\xba2 para4ulata 2pb 2pc 4pc_ 2pd 4pedo4 penta1a2 penta1\xc3\xa12 penta1e2 penta1\xc3\xa92 penta1h penta1i2 penta1\xc3\xad2 penta1o2 penta1\xc3\xb32 penta1u2 penta1\xc3\xba2 pe5r4ante pe3r4e3mia perpon5d6r 2pf 2pg 2p1h piezo1a2 piezo1\xc3\xa12 piezo1e2 piezo1\xc3\xa92 piezo1h piezo1i2 piezo1\xc3\xad2 piezo1o2 piezo1\xc3\xb32 piezo1u2 piezo1\xc3\xba2 2pj 2pk p2l 2pl_ plan4c5t pluri1a2 pluri1\xc3\xa12 pluri1e2 pluri1\xc3\xa92 pluri1h pluri1i2 pluri1\xc3\xad2 pluri1o2 pluri1\xc3\xb32 pluri1u2 pluri1\xc3\xba2 2pm 2pn 4pn_ poi3de_ poi3des_ poli1a2 poli1\xc3\xa12 poli4andr poli4antea poli4arq poli4\xc3\xa1rq poli1e2 poli1\xc3\xa92 poli4\xc3\xa9ste poli1h poli1i2 poli1\xc3\xad2 poli1o2 poli1\xc3\xb32 poli4o5mie poli1u2 poli1\xc3\xba2 poli4u3r pos3ta_ pos3tas_ 2pp 2pq p2r 2pr_ pre3elig pre3elij pre3emin pre3exis preo3cup preo2c\xc3\xbap pre3ol\xc3\xad pre3opin proto1a2 proto1\xc3\xa12 proto1e2 proto1\xc3\xa92 proto1h proto1i2 proto1\xc3\xad2 proto1o2 proto1\xc3\xb32 proto1u2 proto1\xc3\xba2 2ps 3p2sic 3p2siq 2pt 4pt_ 4puta4 4puto4 2pv 2pw 2px 2py 2pz 1q 2qb 2qc 2qd 2qf 2qg 2q1h 2qj 2qk 2ql 2qm 2qn 2qp 2qq 2qr 2qs 2qt 2qv 2qw 2qx 2qy 2qz 1r radio1a2 radio1\xc3\xa12 radio1e2 radio1\xc3\xa92 radio1h radio1i2 radio1\xc3\xad2 radio1o2 radio1\xc3\xb32 radio1u2 radio1\xc3\xba2 ranco1a2 ranco1\xc3\xa12 ranco1e2 ranco1\xc3\xa92 ranco1h ranco1i2 ranco1\xc3\xad2 ranco1o2 ranco1\xc3\xb32 ranco1u2 ranco1\xc3\xba2 2rb 2rc 2r3c2n 2r3c2t 2r3c2z 2rd retro1a2 retro1\xc3\xa12 retro1e2 retro1\xc3\xa92 retro1h retro1i2 retro1\xc3\xad2 retro1o2 retro1\xc3\xb32 retro1u2 retro1\xc3\xba2 2rf 2r3f2t 2rg 2r3g2n 2r1h 2rj 2rk 2rl 2rm rmano1a2 rmano1\xc3\xa12 rmano1e2 rmano1\xc3\xa92 rmano1h rmano1i2 rmano1\xc3\xad2 rmano1o2 rmano1\xc3\xb32 rmano1u2 rmano1\xc3\xba2 2r3m2n 2rn romo1a2 romo1\xc3\xa12 romo1e2 romo1\xc3\xa92 romo1h romo1i2 romo1\xc3\xad2 romo1o2 romo1\xc3\xb32 romo1u2 romo1\xc3\xba2 2rp 2r3p2n 2r3p2s 2r3p2t 2rq r2r 2rr_ 2rs 2rt 2r3t2s 2r3t2z 2rv 2rw 2rx 2ry 2rz 1s 3sa_ san4c5t 3sas_ 2sb 2sc 2s3c2n 2s3c2t 2s3c2z 2sd semi1a2 semi1\xc3\xa12 semi1e2 semi1\xc3\xa92 semi1h semi1i2 semi1\xc3\xad2 semi1o2 semi1\xc3\xb32 semi1u2 semi1\xc3\xba2 seudo1a2 seudo1\xc3\xa12 seudo1e2 seudo1\xc3\xa92 seudo1h seudo1i2 seudo1\xc3\xad2 seudo1o2 seudo1\xc3\xb32 seudo1u2 seudo1\xc3\xba2 2sf 2s3f2t 2sg 2s3g2n 2s1h 2sj 2sk 2sl 2sm 2s3m2n 2sn sobre1a2 sobre1\xc3\xa12 sobre1e2 sobre1\xc3\xa92 sobre1h sobre1i2 sobre1\xc3\xad2 sobre1o2 sobre1\xc3\xb32 sobre1u2 sobre1\xc3\xba2 socio1a2 socio1\xc3\xa12 socio1e2 socio1\xc3\xa92 socio1h socio1i2 socio1\xc3\xad2 socio1o2 socio1\xc3\xb32 socio1u2 socio1\xc3\xba2 2sp 2s3p2n 2s3p2s 2s3p2t 2sq 2sr 2ss 2st s3tal_ s3ta3les_ s3te_ s3tes_ s3ti3lla_ s3ti3llas_ s3ti3ll\xc3\xb3n_ s3ti3llones_ s3tor_ s3tora_ s3toras_ s3tores_ 2s3t2s 2s3t2z su4d3oes sup6ra supe2r1a2 supe2r1\xc3\xa12 super4able super4aci\xc3\xb3n supe4r4a3r supe4r4\xc3\xa13r supe3r4\xc3\xa13vit_ supe3r4\xc3\xa13vits_ supe2r1e2 supe2r1\xc3\xa92 supe2r1i2 supe2r1\xc3\xad2 super4ior supe2r1o2 supe2r1\xc3\xb32 supe2r3r supe2r1u2 supe2r1\xc3\xba2 supra1a2 supra1\xc3\xa12 supra1e2 supra1\xc3\xa92 supra1h supra1i2 supra1\xc3\xad2 supra1o2 supra1\xc3\xb32 supra1u2 supra1\xc3\xba2 2sv 2sw 2sx 2sy 2sz 1t talmo1a2 talmo1\xc3\xa12 talmo1e2 talmo1\xc3\xa92 talmo1h talmo1i2 talmo1\xc3\xad2 talmo1o2 talmo1\xc3\xb32 talmo1u2 talmo1\xc3\xba2 2tb 2tc 2t3c2n 2t3c2t 2t3c2z 2td tele1a2 tele1\xc3\xa12 tele1e2 tele1\xc3\xa92 tele1h tele1i2 tele1\xc3\xad2 tele1o2 tele1\xc3\xb32 tele1u2 tele1\xc3\xba2 t4eo3nes_ 3te3ri3n 4te4r5i4nsu termo1a2 termo1\xc3\xa12 termo1e2 termo1\xc3\xa92 termo1h termo1i2 termo1\xc3\xad2 termo1o2 termo1\xc3\xb32 termo1u2 termo1\xc3\xba2 4teta_ 4tetas_ tetra1a2 tetra1\xc3\xa12 tetra1e2 tetra1\xc3\xa92 tetra1h tetra1i2 tetra1\xc3\xad2 tetra1o2 tetra1\xc3\xb32 tetra1u2 tetra1\xc3\xba2 2tf 2t3f2t 2tg 2t3g2n 2t1h ti2o3co ti2o3qu 2tj 2tk 2t2l 2tm 2t3m2n 2tn topo1a2 topo1\xc3\xa12 topo1e2 topo1\xc3\xa92 topo1h topo1i2 topo1\xc3\xad2 topo1o2 topo1\xc3\xb32 topo1u2 topo1\xc3\xba2 2tp 2t3p2n 2t3p2s 2t3p2t 2tq t2r 2tr_ tran4sacc trans4ar trans4e\xc3\xbante trans4iber trans4ici\xc3\xb3n trans4ido trans4igen trans4igir trans4istor trans4it trans4itab trans4itorio trans4ubsta tropo1a2 tropo1\xc3\xa12 tropo1e2 tropo1\xc3\xa92 tropo1h tropo1i2 tropo1\xc3\xad2 tropo1o2 tropo1\xc3\xb32 tropo1u2 tropo1\xc3\xba2 2ts 4ts_ 2tt 2t3t2s 2t3t2z 2tv 2tw t2x 2ty 2tz 4tz_ ultra1a2 ultra1\xc3\xa12 ultra1e2 ultra1\xc3\xa92 ultra1h ultra1i2 ultra1\xc3\xad2 ultra4\xc3\xadsmo ultra1o2 ultra1\xc3\xb32 ultra1u2 ultra1\xc3\xba2 u4teri 1v 2vb 2vc 2vd 2vf 2vg 2v1h 2vj 2vk v2l 2vl_ 2vm 2vn 2vp 2vq v2r 2vr_ 2vs 2vt 2vv 2vw 2vx 2vy 2vz 1w wa3s4h 2wb 2wc 2wd 2wf 2wg 2w1h 2wj 2wk w2l 2wl_ 2wm 2wn 2wp 2wq w2r 2wr_ 2ws 2wt 2wv 2ww 2wx 2wy 2wz 1x 2xb 2xc 2x3c2n 2x3c2t 2x3c2z 2xd xeno1a2 xeno1\xc3\xa12 xeno1e2 xeno1\xc3\xa92 xeno1h xeno1i2 xeno1\xc3\xad2 xeno1o2 xeno1\xc3\xb32 xeno1u2 xeno1\xc3\xba2 2xf 2x3f2t 2xg 2x3g2n 2x1h 2xj 2xk 2xl 2xm 2x3m2n 2xn 2xp 2x3p2n 2x3p2s 2x3p2t 2xq 2xr 2xs 2xt 2x3t2s 2x3t2z 2xv 2xw 2xx 2xy 2xz 1y 2yb 2yc 2y3c2n 2y3c2t 2y3c2z 2yd 2yf 2y3f2t 2yg 2y3g2n 2y1h 2yj 2yk 2yl 2ym 2y3m2n 2yn 2yp 2y3p2n 2y3p2s 2y3p2t 2yq 2yr 2ys 2yt 2y3t2s 2y3t2z 2yv 2yw 2yx 2yy 2yz 1z 2zb 2zc 2zd 2zf 2zg 2z1h 2zj 2zk 2zl 2zm 2zn 2zp 2zq 2zr 2zs 2zt 2zv 2zw 2zx 2zy 2zz"; + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/patterns/fi.php b/application/third_party/mpdf/patterns/fi.php new file mode 100644 index 0000000..2cf77af --- /dev/null +++ b/application/third_party/mpdf/patterns/fi.php @@ -0,0 +1,9 @@ +<?php +/* + Adapted from Hyphenator 1.0.2 + http://code.google.com/p/hyphenator/ +*/ + +$patterns="1ba 1be 1bi 1bo 1bu 1by 1da 1de 1di 1do 1du 1dy 1d\xc3\xa4 1d\xc3\xb6 1fa 1fe 1fi 1fo 1fu 1fy 1ga 1ge 1gi 1go 1gu 1gy 1g\xc3\xa4 1g\xc3\xb6 1ha 1he 1hi 1ho 1hu 1hy 1h\xc3\xa4 1h\xc3\xb6 1ja 1je 1ji 1jo 1ju 1jy 1j\xc3\xa4 1j\xc3\xb6 1ka 1ke 1ki 1ko 1ku 1ky 1k\xc3\xa4 1k\xc3\xb6 1la 1le 1li 1lo 1lu 1ly 1l\xc3\xa4 1l\xc3\xb6 1ma 1me 1mi 1mo 1mu 1my 1m\xc3\xa4 1m\xc3\xb6 1na 1ne 1ni 1no 1nu 1ny 1n\xc3\xa4 1n\xc3\xb6 1pa 1pe 1pi 1po 1pu 1py 1p\xc3\xa4 1p\xc3\xb6 1ra 1re 1ri 1ro 1ru 1ry 1r\xc3\xa4 1r\xc3\xb6 1sa 1se 1si 1so 1su 1sy 1s\xc3\xa4 1s\xc3\xb6 1ta 1te 1ti 1to 1tu 1ty 1t\xc3\xa4 1t\xc3\xb6 1va 1ve 1vi 1vo 1vu 1vy 1v\xc3\xa4 1v\xc3\xb6 1st2r \xc3\xa42y y1a2 y1o2 o1y \xc3\xb62y u1y2 y1u2 \xc3\xb63a2 \xc3\xb63o2 \xc3\xa43a2 \xc3\xa43o2 \xc3\xa41u2 \xc3\xb61u2 a1\xc3\xa4 a1\xc3\xb6 o1\xc3\xa4 o1\xc3\xb6 u1\xc3\xa42 u1\xc3\xb62 \xc3\xa42\xc3\xa4 \xc3\xb62\xc3\xb6 \xc3\xa42\xc3\xb6 \xc3\xb62\xc3\xa4 aa1i2 aa1e2 aa1o2 aa1u2 ee1a2 ee1i2 ee1u2 ee1y2 ii1a2 ii1e2 ii1o2 uu1a2 uu1e2 uu1o2 uu1i2 e1aa i1aa o1aa u1aa u1ee a1uu i1uu e1uu o1uu \xc3\xa4\xc3\xa41i \xc3\xa4\xc3\xa41e \xc3\xa4\xc3\xa43y i1\xc3\xa4\xc3\xa4 e1\xc3\xa4\xc3\xa4 y1\xc3\xa4\xc3\xa4 i1\xc3\xb6\xc3\xb6 a1ei a1oi e1ai i1au y1ei ai1a ai1e ai1o ai1u au1a au1e eu1a ie1a ie1o ie1y io1a2 io1e2 iu1a iu1e iu1o oi1a oi1e oi1o oi1u o1ui ou1e ou1o ue1a ui1e uo1a uo1u e1\xc3\xb62 \xc3\xb61e2 _\xc3\xa42 u2s yli1o2p ali1a2v 1sp2li alous1 keus1 rtaus1 2s1ohje 2s1a2sia 1a2sian 1a2siat 1a2sioi r2as l2as 2s1o2pisk 2n1o2pet 2s1a2loi 2n1o2pist 2s1o2pist 2s1o2sa 2n1o2sa alkei2s1 perus1 2s1i2dea_ 2s1i2dean 2s1e2sity 2n1e2dus 2s1ajatu 2s1ase 2s1apu 2s1y2rit _ydi2n1 _suu2r1a2 2s1y2hti 2n1otto 2n1oton 2n1anto 2n1anno 2n1a2jan 2n1aika 2n1o2mai 2n1y2lit 2s1a2len 2n1a2len 1a2siaka2s1 ulo2s1 2n1a2jo 2s1a2jo b2l 1b2lo bib3li b2r 1b2ri 1b2ro 1b2ru d2r 1d2ra f2l 1f2la f2r 1f2ra 1f2re g2l 1g2lo g2r 1g2ra k2l 1k2ra 1k2re 1k2ri 1k2v 1k2va p2l p2r 1p2ro c2l q2v 1q2vi sc2h ts2h ch2r"; + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/patterns/fr.php b/application/third_party/mpdf/patterns/fr.php new file mode 100644 index 0000000..2e0fe4e --- /dev/null +++ b/application/third_party/mpdf/patterns/fr.php @@ -0,0 +1,12 @@ +<?php +/* + Adapted from Hyphenator 1.0.2 + http://code.google.com/p/hyphenator/ + + Retrieved from http://extensions.services.openoffice.org/project/french-dictionary-reform1990 + License: LGPL +*/ + +$patterns="'a1b2r 'a1g2n 'a1mi 'a1na 'a1po 'a2g3nat 'a4 'ab1r\xc3\xa9 'ab3r\xc3\xa9a 'ae3s4c2h 'ag1na 'ami1no 'amino1a2c 'an1ti 'ana3s4t2r 'anti1a2 'anti1e2 'anti1s2 'anti1\xc3\xa92 'anti2en1ne 'apo2s3ta 'ar1ge 'ar1pe 'ar3gent_ 'ar3pent_ 'as2ta 'e1n1a2 'e1n1o2 'e4 'eu2r1a2 'i1g2n 'i1n1a2 'i1n1e2 'i1n1i2 'i1n1o2 'i1n1u2 'i1n1\xc3\xa92 'i2g3ni 'i2g3n\xc3\xa9 'i2g4no 'i4 'in1s2tab 'in1te 'in2a3nit 'in2augur 'in2effab 'in2ept 'in2er 'in2exo1ra 'in2i3mi1ti 'in2i3q 'in2i3t 'in2o3cul 'in2ond 'in2u3l 'in2uit 'in2\xc3\xa93luc1ta 'in2\xc3\xa93nar1ra 'ina1ni 'inau1gu 'inef1fa 'ini1mi 'ino1cu 'ins1ta 'inte1ra2 'inte1re2 'inte1ri2 'inte1ro2 'inte1ru2 'inte1r\xc3\xa92 'inte4r3 'inters2 'in\xc3\xa91lu 'in\xc3\xa91na 'o1vi 'o4 'on1gu 'on3guent_ 'oua1ou 'ovi1s2c 'u4 'y4 '\xc3\xa24 '\xc3\xa84 '\xc3\xa94 '\xc3\xaa4 '\xc3\xae4 '\xc3\xb44 '\xc3\xbb4 _1ba _1bi _1c2h4 _1ci _1co _1cu _1da _1di _1do _1dy _1d\xc3\xa9 _1d\xc3\xa93s2o3d\xc3\xa9 _1ge _1k2h4 _1la _1ma _1mi _1mo _1m\xc3\xa9 _1no _1p2h4 _1p2l _1p2r _1p2sy1c2h _1pa _1pe _1po _1pu _1p\xc3\xa9 _1re _1r\xc3\xa9 _1s2c2h4 _1s2h4 _1sa _1se _1so _1su _1sy _1t2h4 _1t2r _1ta _a1b2r _a1g2n _a1mi _a1na _a1po _a2g3nat _a4 _ab1r\xc3\xa9 _ab3r\xc3\xa9a _ae3s4c2h _ag1na _ami1no _amino1a2c _an1ti _ana3s4t2r _anti1a2 _anti1e2 _anti1s2 _anti1\xc3\xa92 _anti2en1ne _apo2s3ta _ar1de _ar1ge _ar1pe _ar3dent_ _ar3gent_ _ar3pent_ _as2ta _bai1se _bai2se3main _baise1ma _bi1a2c _bi1a2t _bi1au _bi1u2 _bi2s1a2 _bio1a2 _c2h\xc3\xa8 _ch\xc3\xa81v2r _ch\xc3\xa82vre3feuil1le _ch\xc3\xa8v1re _ch\xc3\xa8vre1fe _ch\xc3\xa8vrefeuil2l _ci1sa _ci2s1alp _co1o2 _co2o3lie _com1me _com3ment_ _con1t2r _con4 _cons4 _cont1re _cont1re3ma\xc3\xaet1re _contre1ma _contre1s2c _contrema\xc3\xae1t2r _coo1li _cul4 _da1c2r _dac1ry _dacryo1a2 _di1a2cid _di1a2c\xc3\xa9 _di1a2mi _di1a2tom _di1ald _di1e2n _di2s3h _dia1ci _dia1to _do1le _do3lent_ _dy2s1a2 _dy2s1i2 _dy2s1o2 _dy2s1u2 _dy2s3 _d\xc3\xa91a2 _d\xc3\xa91io _d\xc3\xa91o2 _d\xc3\xa91sa _d\xc3\xa91se _d\xc3\xa91so _d\xc3\xa91su _d\xc3\xa92s _d\xc3\xa92s1i2 _d\xc3\xa92s1u2n _d\xc3\xa92s1\xc2\xbd _d\xc3\xa92s1\xc3\xa92 _d\xc3\xa93s2a3c2r _d\xc3\xa93s2a3tell _d\xc3\xa93s2as1t2r _d\xc3\xa93s2c _d\xc3\xa93s2ensib _d\xc3\xa93s2ert _d\xc3\xa93s2exu _d\xc3\xa93s2i3d _d\xc3\xa93s2i3g2n _d\xc3\xa93s2i3li _d\xc3\xa93s2i3nen _d\xc3\xa93s2i3r _d\xc3\xa93s2in1vo _d\xc3\xa93s2ist _d\xc3\xa93s2o3l _d\xc3\xa93s2o3pil _d\xc3\xa93s2orm _d\xc3\xa93s2orp _d\xc3\xa93s2ou1f2r _d\xc3\xa93s2p _d\xc3\xa93s2t _d\xc3\xa93s2\xc3\xa93g2r _d\xc3\xa9s2a3m _d\xc3\xa9sa1te _d\xc3\xa9sen1si _d\xc3\xa9si1ne _d\xc3\xa9so1pi _e1n1a2 _e1n1o2 _e4 _eu2r1a2 _gem1me _gem2ment_ _i1g2n _i1n1a2 _i1n1e2 _i1n1i2 _i1n1o2 _i1n1u2 _i1n1\xc3\xa92 _i2g3ni _i2g3n\xc3\xa9 _i2g4no _i4 _in1s2tab _in1te _in2a3nit _in2augur _in2effab _in2ept _in2er _in2exo1ra _in2i3mi1ti _in2i3q _in2i3t _in2o3cul _in2ond _in2u3l _in2uit _in2\xc3\xa93luc1ta _in2\xc3\xa93nar1ra _ina1ni _inau1gu _inef1fa _ini1mi _ino1cu _ins1ta _inte1ra2 _inte1re2 _inte1ri2 _inte1ro2 _inte1ru2 _inte1r\xc3\xa92 _inte4r3 _inters2 _in\xc3\xa91lu _in\xc3\xa91na _la1te _la3tent_ _ma1c2r _ma1g2n _ma1la _ma1le _ma1li _ma1lo _ma2c3k _ma2g3nici1de _ma2g3nificat _ma2g3num _ma2l1a2d1ro _ma2l1a2dres _ma2l1a2v _ma2l1ai1s\xc3\xa9 _ma2l1ap _ma2l1en _ma2l1int _ma2l1o2d _ma2l1oc _ma2r1x _mac1ro _macro1s2c _mag1ni _mag1nu _magni1ci _magni1fi _magnifi1ca _mala1d2r _malad1re _mil1li _mil3l _milli1am _mo1no _mono1a2 _mono1e2 _mono1i2 _mono1o2 _mono1s2 _mono1u2 _mono1\xc3\xa92 _mono1\xc3\xaf2d\xc3\xa9 _m\xc3\xa91go _m\xc3\xa91se _m\xc3\xa91su _m\xc3\xa91ta _m\xc3\xa91ta1s2ta _m\xc3\xa92g1oh _m\xc3\xa92s1es _m\xc3\xa92s1i _m\xc3\xa92s1u2s _m\xc3\xa92sa _m\xc3\xa93san _no1no _no2n1obs _o1vi _o4 _on1gu _on3guent_ _oua1ou _ovi1s2c _p1ha _p1lu _p1ro _p1r\xc3\xa9 _p1sy _pa1na _pa1ni _pa1no _pa1r2h _pa1ra _pa1re _pa1te _pa2n1a2f _pa2n1a2m\xc3\xa9 _pa2n1a2ra _pa2n1is _pa2n1o2p2h _pa2n1opt _pa2r1a2c2he _pa2r1a2c2h\xc3\xa8 _pa2r3h\xc3\xa9 _pa3rent_ _pa3tent_ _para1c2h _para1s2 _pe1r1a2 _pe1r1e2 _pe1r1i2 _pe1r1o2 _pe1r1u2 _pe1r1\xc3\xa92 _pe4r _pen2ta _pha1la _phalan3s2t _plu1ri _pluri1a _pon1te _pon2tet _pos1ti _pos2t1in _pos2t1o2 _pos2t3h _pos2t3r _post1s2 _pro1g2n _pro1s2c\xc3\xa9 _pro1\xc3\xa92 _pro2g3na1t2h _prog1na _prou3d2h _pr\xc3\xa91a2 _pr\xc3\xa91e2 _pr\xc3\xa91i2 _pr\xc3\xa91o2 _pr\xc3\xa91s2 _pr\xc3\xa91u2 _pr\xc3\xa91\xc3\xa92 _pr\xc3\xa92a3la _pr\xc3\xa92au _psyc2ho _psycho1a2n _pud1d2l _p\xc3\xa91ri _p\xc3\xa9ri1os _p\xc3\xa9ri1s2 _p\xc3\xa9ri1u2 _p\xc3\xa9ri2s3s _p\xc3\xa9ri2s3ta _re1s2 _re2s3c1ri _re2s3cap _re2s3ci1si _re2s3ci1so _re2s3cou _re2s3pect _re2s3pir _re2s3plend _re2s3pons _re2s3quil _re2s3s _re2s3t _re3s4t2r _re3s4tab _re3s4tag _re3s4tand _re3s4tat _re3s4tim _re3s4tip _re3s4toc _re3s4top _re3s4tu _re3s4ty _re3s4t\xc3\xa9n _re3s4t\xc3\xa9r _re4s5trein _re4s5trict _re4s5trin _res1c2r _res1ca _res1ci _res1co _res1p2l _res1pe _res1pi _res1po _res1q _res1se _res1ta _res1ti _res1to _res1t\xc3\xa9 _res3sent_ _resp1le _rest1re _rest1ri _r\xc3\xa91a2 _r\xc3\xa91e2 _r\xc3\xa91i2 _r\xc3\xa91o2 _r\xc3\xa91t2r _r\xc3\xa91\xc3\xa92 _r\xc3\xa92a3le _r\xc3\xa92a3lis _r\xc3\xa92a3lit _r\xc3\xa92aux _r\xc3\xa92el _r\xc3\xa92er _r\xc3\xa92i3fi _r\xc3\xa92uss _r\xc3\xa92\xc3\xa8r _r\xc3\xa9a1li _r\xc3\xa9t1ro _r\xc3\xa9tro1a2 _r\xc3\xa9u2 _s1ta _s1ti _sar1me _sar3ment_ _ser1me _ser3ment_ _seu2le _sou1ve _sou3vent_ _sta2g3n _stil3l _su1b2l _su1bi _su1bu _su1ri _su1ro _su2b1a2 _su2b1in _su2b1ur _su2b1\xc3\xa92 _su2b3limin _su2b3lin _su2b3lu _su2r1a2 _su2r1e2 _su2r1i2m _su2r1inf _su2r1int _su2r1of _su2r1ox _su2r1\xc3\xa92 _su2r3h _su3b2alt _su3b2\xc3\xa93r _su3r2a3t _su3r2eau _su3r2ell _su3r2et _sub1li _subli1mi _syn1g2n _syn2g3na1t2h _syng1na _t1ri _ta1le _ta3lent_ _tri1a2c _tri1a2n _tri1a2t _tri1o2n _u4 _y4 _\xc3\xa24 _\xc3\xa84 _\xc3\xa91mi _\xc3\xa94 _\xc3\xa9mi1ne _\xc3\xa9mi3nent_ _\xc3\xaa4 _\xc3\xae4 _\xc3\xb44 _\xc3\xbb4 1a2nesth\xc3\xa91si 1alcool 1b2l 1b2r 1ba 1be 1bi 1bo 1bu 1by 1b\xc3\xa2 1b\xc3\xa8 1b\xc3\xa9 1b\xc3\xaa 1b\xc3\xae 1b\xc3\xb4 1b\xc3\xbb 1c2h 1c2k 1c2l 1c2r 1ca 1ce 1ci 1co 1cu 1cy 1c\xc2\xbd0 1c\xc3\xa2 1c\xc3\xa8 1c\xc3\xa9 1c\xc3\xaa 1c\xc3\xae 1c\xc3\xb4 1c\xc3\xbb 1d2'2 1d2r 1da 1de 1di 1do 1du 1dy 1d\xc3\xa2 1d\xc3\xa8 1d\xc3\xa9 1d\xc3\xaa 1d\xc3\xae 1d\xc3\xb4 1d\xc3\xbb 1f2l 1f2r 1fa 1fe 1fi 1fo 1fu 1fy 1f\xc3\xa2 1f\xc3\xa8 1f\xc3\xa9 1f\xc3\xaa 1f\xc3\xae 1f\xc3\xb4 1f\xc3\xbb 1g2ha 1g2he 1g2hi 1g2ho 1g2hy 1g2l 1g2n 1g2r 1ga 1ge 1gi 1go 1gu 1gy 1g\xc3\xa2 1g\xc3\xa8 1g\xc3\xa9 1g\xc3\xaa 1g\xc3\xae 1g\xc3\xb4 1g\xc3\xbb 1ha 1he 1hi 1ho 1hu 1hy 1h\xc3\xa2 1h\xc3\xa8 1h\xc3\xa9 1h\xc3\xaa 1h\xc3\xae 1h\xc3\xb4 1h\xc3\xbb 1informat 1j 1k2h 1k2r 1ka 1ke 1ki 1ko 1ku 1ky 1k\xc3\xa2 1k\xc3\xa8 1k\xc3\xa9 1k\xc3\xaa 1k\xc3\xae 1k\xc3\xb4 1k\xc3\xbb 1la 1le 1li 1lo 1lu 1ly 1l\xc3\xa0 1l\xc3\xa2 1l\xc3\xa8 1l\xc3\xa9 1l\xc3\xaa 1l\xc3\xae 1l\xc3\xb4 1l\xc3\xbb 1m2n\xc3\xa8s 1m2n\xc3\xa91mo 1m2n\xc3\xa91si 1ma 1me 1mi 1mo 1mu 1my 1m\xc2\xbd0 1m\xc3\xa2 1m\xc3\xa8 1m\xc3\xa9 1m\xc3\xaa 1m\xc3\xae 1m\xc3\xb4 1m\xc3\xbb 1na 1ne 1ni 1no 1nu 1ny 1n\xc2\xbd0 1n\xc3\xa2 1n\xc3\xa8 1n\xc3\xa9 1n\xc3\xaa 1n\xc3\xae 1n\xc3\xb4 1n\xc3\xbb 1octet 1p2h 1p2l 1p2neu 1p2n\xc3\xa9 1p2r 1p2sy1c2h 1p2t\xc3\xa8r 1p2t\xc3\xa9r 1pa 1pe 1pi 1po 1pu 1py 1p\xc3\xa2 1p\xc3\xa8 1p\xc3\xa9 1p\xc3\xaa 1p\xc3\xae 1p\xc3\xb4 1p\xc3\xbb 1q 1r2h 1ra 1re 1ri 1ro 1ru 1ry 1r\xc3\xa2 1r\xc3\xa8 1r\xc3\xa9 1r\xc3\xaa 1r\xc3\xae 1r\xc3\xb4 1r\xc3\xbb 1s2c2h 1s2ca1p2h 1s2cl\xc3\xa9r 1s2cop 1s2h 1s2lav 1s2lov 1s2patia 1s2perm 1s2ph\xc3\xa8r 1s2ph\xc3\xa9r 1s2piel 1s2piros 1s2por 1s2tandard 1s2tein 1s2tigm 1s2to1c2k 1s2tomos 1s2tro1p2h 1s2truc1tu 1s2ty1le 1sa 1se 1si 1so 1su 1sy 1s\xc2\xbd0 1s\xc3\xa2 1s\xc3\xa8 1s\xc3\xa9 1s\xc3\xaa 1s\xc3\xae 1s\xc3\xb4 1s\xc3\xbb 1t2h 1t2r 1ta 1te 1ti 1to 1tu 1ty 1t\xc3\xa0 1t\xc3\xa2 1t\xc3\xa8 1t\xc3\xa9 1t\xc3\xaa 1t\xc3\xae 1t\xc3\xb4 1t\xc3\xbb 1v2r 1va 1ve 1vi 1vo 1vu 1vy 1v\xc3\xa2 1v\xc3\xa8 1v\xc3\xa9 1v\xc3\xaa 1v\xc3\xae 1v\xc3\xb4 1v\xc3\xbb 1w2r 1wa 1we 1wi 1wo 1wu 1za 1ze 1zi 1zo 1zu 1zy 1z\xc3\xa8 1z\xc3\xa9 1\xc3\xa7 1\xc3\xa92drie 1\xc3\xa92drique 1\xc3\xa92lec1t2r 1\xc3\xa92l\xc3\xa9ment 1\xc3\xa92nerg 2'2 2b2lent_ 2b2rent_ 2bent_ 2c1k3h 2c2kent_ 2c2lent_ 2c2rent_ 2cent_ 2chb 2chent_ 2chg 2chm 2chn 2chp 2chs 2cht 2chw 2ckb 2ckf 2ckg 2ckp 2cks 2ckt 2d2lent_ 2d2rent_ 2dent_ 2f2lent_ 2f2rent_ 2fent_ 2g2lent_ 2g2nent_ 2g2rent_ 2gent_ 2guent_ 2jent_ 2jk 2kent_ 2lent_ 2nent_ 2p2lent_ 2p2rent_ 2pent_ 2phent_ 2phn 2phs 2pht 2quent_ 2r3heur 2r3hy1d2r 2rent_ 2s2chs 2s3hom 2sent_ 2shent_ 2shm 2shr 2shs 2t2rent_ 2t3heur 2tent_ 2thl 2thm 2thn 2ths 2v2rent_ 2vent_ 2went_ 2xent_ 2zent_ 3d2hal 3d2houd 3ph2ta1l\xc3\xa9 3ph2tis 4b4le_ 4b4les_ 4b4re_ 4b4res_ 4be_ 4bes_ 4c4he_ 4c4hes_ 4c4ke_ 4c4kes_ 4c4le_ 4c4les_ 4c4re_ 4c4res_ 4ce_ 4ces_ 4ch_ 4ch4le_ 4ch4les_ 4ch4re_ 4ch4res_ 4ck_ 4d4re_ 4d4res_ 4de_ 4des_ 4f4le_ 4f4les_ 4f4re_ 4f4res_ 4fe_ 4fes_ 4g4le_ 4g4les_ 4g4ne_ 4g4nes_ 4g4re_ 4g4res_ 4ge_ 4ges_ 4gue_ 4gues_ 4he_ 4hes_ 4je_ 4jes_ 4ke_ 4kes_ 4kh_ 4le_ 4les_ 4me_ 4mes_ 4ne_ 4nes_ 4p4he_ 4p4hes_ 4p4le_ 4p4les_ 4p4re_ 4p4res_ 4pe_ 4pes_ 4ph_ 4ph4le_ 4ph4les_ 4ph4re_ 4ph4res_ 4que_ 4ques_ 4r4he_ 4r4hes_ 4re_ 4res_ 4s4c4he_ 4s4c4hes_ 4s4ch_ 4s4he_ 4s4hes_ 4se_ 4ses_ 4sh_ 4t4he_ 4t4hes_ 4t4re_ 4t4res_ 4te_ 4tes_ 4th_ 4th4re_ 4th4res_ 4v4re_ 4v4res_ 4ve_ 4ves_ 4we_ 4wes_ 4ze_ 4zes_ a1b\xc3\xae a1la a1ma a1ne a1ni a1po a1vi a1\xc3\xa82d1re a2l1al1gi a2s3t1ro ab1se ab2h ab3sent_ abs1ti absti1ne absti3nent_ ab\xc3\xae1me ab\xc3\xae2ment_ ac1ce ac1q ac3cent_ acquies1ce acquies4cent_ ad2h ai1me ai2ment_ al1co amal1ga amalga1me amalga2ment_ an1ti anes1t2h anest1h\xc3\xa9 ani1me ani2ment_ anti1fe antifer1me antifer3ment_ ap1pa apo2s3t2r appa1re appa3rent_ ar1c ar1c2h ar1me ar1mi ar2ment_ arc2hi archi1\xc3\xa92pis archi\xc3\xa91pi armil5l as1me as1t2r as2ment_ au1me au2ment_ avil4l a\xc3\xa81d2r b1le b1re b1ru bou1me bou1ti bou2ment_ boutil3l bru1me bru2ment_ c1ci c1ke c1la c1le c1re c2ha c2he c2hi c2ho c2hu c2hy c2h\xc3\xa2 c2h\xc3\xa8 c2h\xc3\xa9 c2h\xc3\xaa c2h\xc3\xae c2h\xc3\xb4 c2h\xc3\xbb ca1pi ca1r\xc3\xaa ca3ou3t2 capil3l car\xc3\xaa1me car\xc3\xaa2ment_ cci1de cci3dent_ ch1le ch1lo ch1re ch1ro ch2l ch2r che1vi chevil4l chien1de chien3dent_ chlo1ra chlo1r\xc3\xa9 chlo2r3a2c chlo2r3\xc3\xa92t chro1me chro2ment_ cil3l cla1me cla2ment_ co1a2d co1ac1q co1acc co1ap co1ar co1assoc co1assur co1au co1ax co1ef co1en co1ex co1g2n co1nu co1\xc3\xa92 co2g3ni1ti co2nurb coas1so coas1su cog1ni com1p\xc3\xa9 comp\xc3\xa91te comp\xc3\xa93tent_ con1fi con1ni con1ti confi1de confi3dent_ conni1ve conni3vent_ conti1ne conti3nent_ contin1ge contin3gent_ cor1pu corpu1le corpu3lent_ cur1re cur3rent_ cy1ri cyril3l d1d2h d1ha d1ho d1le d1re d1s2 da1me da2ment_ di1li di2s3cop dia1p2h diaph1ra diaph2r diaphrag1me diaphrag2ment_ dili1ge dili3gent_ dis1co dis1si dis1ti dissi1de dissi3dent_ distil3l d\xc3\xa91ca d\xc3\xa91t2r d\xc3\xa9ca1de d\xc3\xa9ca3dent_ d\xc3\xa9t1ri d\xc3\xa9tri1me d\xc3\xa9tri3ment_ e1ni e2n1i2v2r e2s3c2h e2s3cop en1t2r ent1re entre1ge entre3gent_ er1me er2ment_ es1ce es1co es1ti es3cent_ esti1me esti2ment_ eu1s2tat eus1ta ex1t2r ext1ra1 extra2c extra2i f1la f1le f1re f1ri f1s2 fa1me fa2ment_ fi1c2h fic2hu fichu1me fichu3ment_ fir1me fir2ment_ flam1me flam2ment_ fri1ti fritil3l fu1me fu2ment_ f\xc3\xa91cu f\xc3\xa9cu1le f\xc3\xa9cu3lent_ g1le g1ne g1ra g1re g1s2 gil3l gram1me gram2ment_ gran1di grandi1lo grandilo1q grandilo3quent_ hil3l hu1me hu2ment_ hy1pe hy1po hype1ra2 hype1re2 hype1ri2 hype1ro2 hype1ru2 hype1r\xc3\xa92 hype4r1 hypers2 hypo1a2 hypo1e2 hypo1i2 hypo1o2 hypo1s2 hypo1u2 hypo1\xc3\xa92 h\xc3\xa91mi h\xc3\xa91mo h\xc3\xa9mi1\xc3\xa9 h\xc3\xa9mo1p2t i1al1gi i1arth2r i1b2r i1oxy i1s2c2h i1s2tat i1va i1\xc3\xa82d1re i2s3c2h\xc3\xa9 i2s3chia i2s3chio iar1t2h ib1ri ibril3l il2l im1ma im1mi im1po im1pu imma1ne imma3nent_ immi1ne immi3nent_ immis1ce immis4cent_ impo1te impo3tent_ impu1de impu3dent_ in1ci in1di in1do in1du in1fo in1no in1so in1te in1ti inci1de inci3dent_ indi1ge indi3gent_ indo1le indo3lent_ indul1ge indul3gent_ infor1ma inno1ce inno3cent_ ins1ti inso1le inso3lent_ instil3l intel1li intelli1ge intelli3gent_ inti1me inti2ment_ io1a2ct is1ce is1ta is3cent_ isc2hi iva1le iva3lent_ i\xc3\xa81d2r ja1ce ja3cent_ l1li l1lu l1me l1s2t l2ment_ l3lion la1w2r la2w3re lil3l llu1me llu2ment_ m1n\xc3\xa8 m1n\xc3\xa9 m1s2 mi1me mi2ment_ mil1le mil3l mil4let mit1te mit3tent_ mo1no mon1t2r mon2t3r\xc3\xa9al mono1va monova1le monova3lent_ mont1r\xc3\xa9 moye1n\xc3\xa2 moye2n1\xc3\xa22g mu1ni muni1fi munifi1ce munifi3cent_ m\xc3\xa91co m\xc3\xa9con1te m\xc3\xa9con3tent_ n1sa n1x n3s2at_ n3s2ats_ nu1t2r nut1ri nutri1me nutri3ment_ o1b2l o1d2l o1g2n o1io1ni o1pu o1s2tas o1s2tat o1s2tim o1s2tom o1s2tra1tu o1s2trad o1s2triction o1s2t\xc3\xa91ro o1\xc3\xa82d1re o2b3long o2g3no1si o2g3nomo1ni ob1lo oc1te og1no ogno1mo om1bu om1me om1ni om2ment_ ombud2s3 omni1po omni1s2 omnipo1te omnipo3tent_ opu1le opu3lent_ or1me or2ment_ os1t2r os1ta os1ti os1to os1t\xc3\xa9 ost1ra ost1ri ostric1ti oxy1a2 o\xc3\xa81d2r p1he p1ho p1le p1lu p1ne p1re p1ri p1ro p1ru p1r\xc3\xa9 p1sy p1t\xc3\xa8 p1t\xc3\xa9 pa1l\xc3\xa9 pa1pi pal\xc3\xa9o1\xc3\xa92 papil1lo papil2l papil3la papil3le papil3li papil3lom pe1r3h per1ma per1ti perma1ne perma3nent_ perti1ne perti3nent_ ph1le ph1re ph1ta ph1ti ph2l ph2r pho1to photo1s2 pi1ri piril3l plu1me plu2ment_ po1ast1re po1ly poas1t2r poly1a2 poly1e2 poly1i2 poly1o2 poly1s2 poly1u2 poly1va poly1\xc3\xa82 poly1\xc3\xa92 polyva1le polyva3lent_ pri1va privat1do privatdo1ce privatdo1ze privatdo3cent_ privatdo3zent_ pro2s3tat pros1ta pro\xc3\xa91mi pro\xc3\xa9mi1ne pro\xc3\xa9mi3nent_ pru1de pru3dent_ pr\xc3\xa91se pr\xc3\xa93sent_ pr\xc3\xa9\xc3\xa91mi pr\xc3\xa9\xc3\xa9mi1ne pr\xc3\xa9\xc3\xa9mi3nent_ pu1g2n pu1pi pu1si pu2g3nab1le pu2g3nac pug1na pugna1b2l pupil3l pusil3l p\xc3\xa91nu p\xc3\xa91r2\xc3\xa92q p\xc3\xa91r\xc3\xa9 p\xc3\xa92nul qua1me qua2ment_ r1ci r1he r1hy r1mi ra1di ra1me ra2ment_ radio1a2 rai1me rai3ment_ rcil4l re1le re1li re1pe re3lent_ re3pent_ reli1me reli2ment_ ri1me ri2ment_ rin1ge rin3gent_ rmil4l ru1le ru3lent_ ry1t2h ry2thm ryth1me ryth2ment_ r\xc3\xa91ge r\xc3\xa91ma r\xc3\xa91su r\xc3\xa91ti r\xc3\xa93gent_ r\xc3\xa9ma1ne r\xc3\xa9ma3nent_ r\xc3\xa9sur1ge r\xc3\xa9sur3gent_ r\xc3\xa9ti1ce r\xc3\xa9ti3cent_ s1c2l s1ca s1co s1he s1ho s1la s1lo s1p2h s1pa s1pe s1pi s1po s1t2r s1ta s1te s1ti s1to s1ty s1t\xc3\xa9 sc1l\xc3\xa9 sc2he se1mi semil4l ser1ge ser1pe ser3gent_ ser3pent_ ses1q sesqui1a2 sla1lo slalo1me slalo2ment_ sp1h\xc3\xa8 sp1h\xc3\xa9 spa1ti spi1ro spo1ru sporu1le sporu4lent_ st1ro st1ru stan1da sto1mo st\xc3\xa91r\xc3\xa9 st\xc3\xa9r\xc3\xa9o1s2 su1b2l su1me su1pe su1ra su1r\xc3\xa9 su2ment_ su3r2ah sub1li sub1s2 subli1me subli2ment_ suc1cu succu1le succu3lent_ supe1ro2 supe4r1 supers2 sur\xc3\xa91mi sur\xc3\xa9mi1ne sur\xc3\xa9mi3nent_ t1c2h t1he t1ra t1re t1ri t1ru t1t2l ta1c2h ta1me ta2ment_ tac2hy tachy1a2 tan1ge tan3gent_ tc2hi tchin3t2 tem1p\xc3\xa9 temp\xc3\xa91ra temp\xc3\xa9ra1me temp\xc3\xa9ra3ment_ ter1ge ter3gent_ tes1ta testa1me testa3ment_ th1re th1ri th2r ther1mo thermo1s2 thril3l to1me to2ment_ tor1re tor3rent_ tran2s1a2 tran2s1o2 tran2s1u2 tran2s3h tran2s3p tran3s2act tran3s2ats trans1pa transpa1re transpa3rent_ tri1de tri3dent_ tru1cu trucu1le trucu3lent_ tu1me tu2ment_ tung2s3 tur1bu turbu1le turbu3lent_ t\xc3\xa91l\xc3\xa9 t\xc3\xa9l\xc3\xa91e2 t\xc3\xa9l\xc3\xa91i2 t\xc3\xa9l\xc3\xa91o2b t\xc3\xa9l\xc3\xa91o2p t\xc3\xa9l\xc3\xa91s2 u1ci u1ni u1vi u2s3t2r ucil4l ue1vi uevil4l uni1a2x uni1o2v uvil4l v1re va1ci va1ni vacil4l vanil1li vanil2l vanil3lin vanil3lis ve1ni ven1t2r veni1me veni2ment_ vent1ri ventri1po ventripo1te ventripo3tent_ vi1di vidi1me vidi2ment_ vil3l vol1ta vol2t1amp v\xc3\xa91lo v\xc3\xa9lo1s2ki wa2g3n xil3l y1al1gi y1as1t2h y1s2tom ys1to \xc3\xa21me \xc3\xa22ment_ \xc3\xa81me \xc3\xa82ment_ \xc3\xa91ce \xc3\xa91ci \xc3\xa91cu \xc3\xa91d2r \xc3\xa91de \xc3\xa91le \xc3\xa91li \xc3\xa91lo \xc3\xa91l\xc3\xa9 \xc3\xa91mi \xc3\xa91ne \xc3\xa91ni \xc3\xa91pi \xc3\xa91q \xc3\xa91re \xc3\xa93cent_ \xc3\xa93dent_ \xc3\xa93quent_ \xc3\xa93rent_ \xc3\xa9ci1me \xc3\xa9ci2ment_ \xc3\xa9cu1me \xc3\xa9cu2ment_ \xc3\xa9d1ri \xc3\xa9d2hi \xc3\xa9dri1q \xc3\xa9li1me \xc3\xa9li2ment_ \xc3\xa9lo1q \xc3\xa9lo3quent_ \xc3\xa9l\xc3\xa91me \xc3\xa9mil4l \xc3\xa9ni1te \xc3\xa9ni3tent_ \xc3\xa9pi2s3cop \xc3\xa9pi3s4co1pe \xc3\xa9pis1co \xc3\xa9qui1po \xc3\xa9qui1va \xc3\xa9quipo1te \xc3\xa9quipo3tent_ \xc3\xa9quiva1le \xc3\xa9quiva4lent_ \xc3\xb41me \xc3\xb42ment_"; + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/patterns/it.php b/application/third_party/mpdf/patterns/it.php new file mode 100644 index 0000000..30eb9a9 --- /dev/null +++ b/application/third_party/mpdf/patterns/it.php @@ -0,0 +1,11 @@ +<?php +/* + Adapted from Hyphenator 1.0.2 + http://code.google.com/p/hyphenator/ + + Retrieved from http://www.ctan.org/tex-archive/language/hyphenation/ithyph.tex +*/ + +$patterns="_a3p2n _anti1 _anti3m2n _bio1 _ca4p3s _circu2m1 _contro1 _di2s3cine _e2x1eu _fran2k3 _free3 _li3p2sa _narco1 _opto1 _orto3p2 _para1 _poli3p2 _pre1 _p2s _re1i2scr _sha2re3 _tran2s3c _tran2s3d _tran2s3l _tran2s3n _tran2s3p _tran2s3r _tran2s3t _su2b3lu _su2b3r _wa2g3n _wel2t1 2'2 a1ia a1ie a1io a1iu a1uo a1ya 2at_ e1iu e2w o1ia o1ie o1io o1iu 1b 2bb 2bc 2bd 2bf 2bm 2bn 2bp 2bs 2bt 2bv b2l b2r 2b_ 2b' 1c 2cb 2cc 2cd 2cf 2ck 2cm 2cn 2cq 2cs 2ct 2cz 2chh c2h 2chb ch2r 2chn c2l c2r 2c_ 2c' _c2 1d 2db 2dd 2dg 2dl 2dm 2dn 2dp d2r 2ds 2dt 2dv 2dw 2d_ 2d' _d2 1f 2fb 2fg 2ff 2fn f2l f2r 2fs 2ft 2f_ 2f' 1g 2gb 2gd 2gf 2gg g2h g2l 2gm g2n 2gp g2r 2gs 2gt 2gv 2gw 2gz 2gh2t 2g_ 2g' 1h 2hb 2hd 2hh hi3p2n h2l 2hm 2hn 2hr 2hv 2h_ 2h' 1j 2j_ 2j' 1k 2kg 2kf k2h 2kk k2l 2km k2r 2ks 2kt 2k_ 2k' 1l 2lb 2lc 2ld 2l3f2 2lg l2h 2lk 2ll 2lm 2ln 2lp 2lq 2lr 2ls 2lt 2lv 2lw 2lz 2l_ 2l'_ 2l'' 1m 2mb 2mc 2mf 2ml 2mm 2mn 2mp 2mq 2mr 2ms 2mt 2mv 2mw 2m_ 2m' 1n 2nb 2nc 2nd 2nf 2ng 2nk 2nl 2nm 2nn 2np 2nq 2nr 2ns n2s3fer 2nt 2nv 2nz n2g3n 2nheit 2n_ 2n' 1p 2pd p2h p2l 2pn 3p2ne 2pp p2r 2ps 3p2sic 2pt 2pz 2p_ 2p' 1q 2qq 2q_ 2q' 1r 2rb 2rc 2rd 2rf r2h 2rg 2rk 2rl 2rm 2rn 2rp 2rq 2rr 2rs 2rt r2t2s3 2rv 2rx 2rw 2rz 2r_ 2r' 1s2 2shm 2sh_ 2sh' 2s3s s4s3m 2s3p2n 2stb 2stc 2std 2stf 2stg 2stm 2stn 2stp 2sts 2stt 2stv 2sz 4s_ 4s'_ 4s'' 1t 2tb 2tc 2td 2tf 2tg t2h t2l 2tm 2tn 2tp t2r t2s 3t2sch 2tt t2t3s 2tv 2tw t2z 2tzk tz2s 2t_ 2t'_ 2t'' 1v 2vc v2l v2r 2vv 2v_ 2v'_ 2v'' 1w w2h wa2r 2w1y 2w_ 2w' 1x 2xb 2xc 2xf 2xh 2xm 2xp 2xt 2xw 2x_ 2x' y1ou y1i 1z 2zb 2zd 2zl 2zn 2zp 2zt 2zs 2zv 2zz 2z_ 2z'_ 2z'' _z2"; + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/patterns/nl.php b/application/third_party/mpdf/patterns/nl.php new file mode 100644 index 0000000..ae02aa1 --- /dev/null +++ b/application/third_party/mpdf/patterns/nl.php @@ -0,0 +1,11 @@ +<?php +/* + Adapted from Hyphenator 1.0.2 + http://code.google.com/p/hyphenator/ + + Created by Remco Bloemen (remco dot bloemen at gmail dot com) +*/ + +$patterns="_a4 _aan5 _aarts5 _aat5 _ab5l _acht5end _ac5re _adi5 _af3 _af5l _af5s _aftu5re _al3ee _al3f _alk4 _al5ko _alko5v _al5ma _al3om _al4st _ana3s _an3d2 _an3en _an3gl _an5th _ar5d _ar5tr _as5h _as5l _as3t _as5tra _as3u _at4a _ave5n _b4 _be3la _be5ra _be5ri _bos1 _c4 _coo5 _co3ro _cus5 _d4 _daar5 _da4gi _dag5r _da2k _dan2 _debe4 _de2k _dek5l _dek5s _den4k5r _de5od _de3ro _de5sta _di4a _die4p _di3o _doet3 _do3v _du4w _e4 _ede2 _edel5a _ed3w _ee4n _eer5ste _eest3 _eesto4 _eet3 _ei3l _ei5sc _ei3sp _ei5t _el4s5 _en5s _en5th _ep4a _ere5s _er2f _erf3l _er3in _ert4 _erts3 _es3 _es5c _es5pe _es5tr _eten4 _et4h _ets5te_ _eu3 _eus5 _\xc3\xa92 _f4 _fel4s _g4 _gaat5 _gang5s _gea5v _ge3l4a _ge5le _gelo5v _ge3n4a _gena5z _ge5ne _ge5no _ge3ra _ge5r4e _ge5r4o _gerst5a _ge3s _ge5sk _ge5ta _ge5tj _ge5to _gid4 _go4m _goot3 _h2 _handels5 _her5in _hits5t _ho4lo _houd5s _i4 _ide5o _ij4s _ijs5l _ijs3p _ijs3t _ik3 _in1 _in5d4 _in3g4 _in5gr _ink2 _in5kr _in5kw _in3s4 _in5sl _in5st _in5ta _is5c _j4 _jor5 _k4 _ka3d _ka5g _ka4taa _kerk5l _kerk5r _kerk5u _ker5sten _ke4s _koot5 _ko5pe _kop5l _ko3v _kun2 _l4 _laat5ste _le4b5 _leg3o _le4g3r _leid5st _len4s3 _le5r4 _le4s3 _le5th _lin5d _lof5 _loot3 _lo4s1 _lu3e _lui5t4j _lu4s _m4 _ma5d _ma5\xc3\xaf _meel5d _me5la _me5ni _merk5l _me2s _me4st _met5ee _mij4n5i _moot3 _mor5sten _mo4s _n4 _naat5 _na3d _na3n _na3s4 _nee5s _ne2p _nep3a _ne4s _ne5te _ne4t3j _neu4t5j _nie4t5j _noot5 _nos5t _no5v _o4 _oe4r5 _oe4s5 _oeve4 _ol3f _om1 _omme3 _on3a _on3d _onde4r _on1e _on5g _on3i _on5k _on1o _ono5v _on2t3 _on4tee _on4ter _ont5s _ooi5tj _oot5jes _op5ee _opi5 _op5l _op3r _op5s _org4 _os5 _ove4 _p4 _pee5tj _peri5 _pers5te_ _piet5j _pits5te_ _poort5j _po4st _puit4 _pui5tj _pu2t _r4 _raads5le _ran4d _rand5a _re4men _ren4o _reno5v _re5o _rie4t3 _rij5sp _ring5s4 _roe5tj _ro4l _ro4st _ro4t3h _ro5v _s4 _sap3 _sa5v _sci3 _see3 _seks5te _se5re _set3 _se5v _side3 _ski3s4 _sneu3 _sno2 _so2k3 _song5 _spoor5tj _st4 _ste4m _t4 _taart5j _tan4da _te4a _te4f _tek2 _te3le _ten5ac _te3no _ten4t5j _te3ra _ter4p5a _ter5s _te4s _ti2n _tin3a _tin3e _toe5pr _to4lo _to4p _to5v _tri3s4 _ts4 _tsa3 _tuit5j _ty2r _u4 _ui2 _ui5s _uit1 _uit4je _uke5 _ur4a _vaat5j _ven4t5j _ve4r3 _ves5p _vet3j _vie4r _vol5s _w4 _wals5te_ _wee4ko _wee4t3 _we4l3 _wen4s5t _west5r _win4s _xe3 _y2 _z4 _zes5 _zit5 _zooi5 4a_ a4a4 4aad aad1a aad1o aad1r aad5sap aaf5a 4aag aag1a aag3e aag3o aag5r aags4 aag3sa aag5so aag3sp aai3l aak1a aak3e2 aak1o aak5r aak3sp aal5a2 aal1e aal5f4o aalfo5l aal1i aal5k aal5m aal1o2 aal3sl aal5so aal5spe aal5ste aal1u aam1a aam3o aam4sta aam4ste aan1a 5aandee aand4r aan1e2 aan5g aan5i 3aanj aan5k4 3aann aan3o aan3sp aans4po aant4 3aanta 3aanv aap1a aap3i aap3o2 aap3r aar3a aar4d5as aar3e4 aar1i 4aarn aar1o2 aar5spel aar4t5on aarts5l aar3u aas3e aas3i 4aast aas5tr aat3a aat5e aat3h aat3i aat1o aat5r abak4s5 aba4l abat4s ab5eun ab3ijz a2bon aboot4j abot4j 2abr ab3ru 4ac_ a3cal a3car 4ace ace3st 4ach_ a3cha 2a1che 4a1chi ach3l a1cho a3chr 4achs ach5tec a1chu achuut5 4ack ac3kl 2acl 2a3co 2acr ac5res 4acta 4acu 4ad_ a5da_ ad3ac ada2d ada4l ada2r3 adas5 2add a5de_ ad3ei ade5re a5des a3det a5deta ad3e4te 2adh 4ad4i adi3al adi4oc adi4od 4adk 2adl 4ado_ a3doo 2adp ad3rei a3d4ri ad3rol 2ads ad5se ad3so ad1s4t ad5sta ad3ui ad3w 2ady 4ae aege4 ae5k4 a3e2p ae3r ae2s3 ae4s5t a3eu a2\xc3\xab a4\xc3\xabr 4afa af3aa a2f3ac af4as af4at afd4i afd2r af5d4w 4afe afee4 4afi af3l 4afo a5fo_ a2foe afon4d af3op af5org af1r af3s4 afs2c af5se 3afsl 3afsp aft4a af5tr af3ui 2afy 4ag_ ag1a2d ag3af ag3a2m ag3ar ag3di a5ge_ agee5t 4a5gen_ ager4s ag3ex a4gil ag3ind a4g3ins agi5ot 4ag1l ag3of a4g3or ag4o3v a2gr ag4ra ag5rap ag3ru ag3sl ag4sle ag5slu ags2p ag3spe ag3spi ag1st ag3sta ag5str 2agt agu5a a2g3ui ag3u4r a2g3uu 2ah 4a1ha 4a5he ahe5ri a1hi ah3l a3ho ah5r ah5t2 a3hu a3hy ai5a2 ai4dr ai1e a1ij ai5k ail3m ai2lo a2in aio4 ai3ov ai3s4 ai5sc ai4s5l ai5sn ai1so ai1st ai5tj ai3tr aiu4 a\xc3\xafn4 a\xc3\xafns5 a\xc3\xafs3o4 2a1j ajaars5 aka2 ak3af ak3ag a4k3ar a4k3ed ak3emi ake2t ak3id ak3ink ak5is 1akko 4a2k3l a2k3n ak5ne ak4ni a3kof ak3on ak3o2p a2kr ak5ru 2aks ak4so ak5spe ak1st ak5to ak5t4w a2k3u4 ak1w ak3wi a1la a4l3ach al3adr a3l4ag a3lal a5lapr al3art 4ald a1le a5le_ al3eff 2aleg a2l3el ale5ro ale5ste ale4tj a3l\xc3\xa8 al4fen alf3l al5fon alfu4 al2gl a3lie al3int alk5ei al5kle alk3s al4kui al5le al4mac al5me a1lo a4l3ol alo2n al3ou a4l3o4v 2alp al3s4ag al3san al3scr als5j al2sl als5li als5m al4sn al4s3oo al4stem al5sten als5tou altaar5 al3tha al4t3ro alt4st a1lu a2lui al3uit al3u4r alu2s5 4am_ a4m3ac am3adr ama4f 4amag am3art 5ambt ament4j ame4ran ame5tj a2meu am4i 4amm am3oli a2m3o4v 3amp\xc3\xa8 am2pl am4ple am4sm am4s3o am4spr ams5te_ a2m3ui a3nad an3alg an4a3n an3arc 2anc 4anda anda4d and5ank an4d3e4d an4dex 2andj an4dom an5d4ri and5roo ands5lo an4d3ul a4nem a3nen anen3i 4aner an3est ane3us 4ang_ an4gan anga5p ange5st ang5le an2gr ang5sna angs4te aniet3 anij4 3anima an5ion a4n5isl ani5t 4aniv 4ank_ an4kaa anka4n an4k3as an2k3j an4klu ank3of an2k3r a1no an3och a4n3oor an3ork ano3s ano3t4 a4n3ou ano5v 4ans an3san ans3cr an4seg an4serv an4sid an2so4 ans5or ans3pi ans5pir an1st an4s5te_ an5stru an4tac ante4n an3th 2anti ant5sl ant3w 4a1nu a5nuf an3ui an3ur an3uu anze5s 2a1o ao4g ao2l a4om a2op2 aor5t a3os aos3p aos5t 4ap_ a1pa a4pak a4pas ap3as_ ap3ass a1pe ap5eten 4a1pi apij4t5j ap3ijz ap1j 2apl ap3le ap3li ap3lo a1plu apon5 ap3oo apo3p apo5sta ap3o4v 1appa 4appen 4apr ap3ra a3pre a4prem a5p4ris ap3ru ap2sa ap4si ap2s3l ap3sn ap4ste_ 2apt ap3tj 2apu a2q 4ar_ a1ra araat5j a4r3app ara3s4 ar2da ard3ac ard3ak ardo4 ar4d3om ar4d3op ar4d3ov ar2d1r ar4dra ard3re ar4du ard3w a1re 5a2rea a3reg a3rem ar4en are4no are3sp a3rev ar3gh ar2gl a1ri arie4tj arij3s ar3ins ark2 ark3ac ar3k4l ar4map arm3u a1ro a2r3ob ar3oge a3rok aro4ko ar3oog a2r1o2p a3rot arpi4 ar2s ar5sch ar3scr ars2e ar5see ar3si ars3l ar4sla ars5m ar3sni ar4so ar4sp ar5spo ars3ta ars5tal ar4s5tek ar4str ar4su art4aa ar4t3ak ar4tan art5ank ar4tap ar3tar 4arte ar4tei ar2th ar5tij 4ar4tj art5jesv 4arto ar5tof art5o4ge art5oog ar4t3o4v ar2t3r ar4tro art5ru art4sl art5ste a3ru ar3ui 4arw arwe3s a1ry 4asa as3ad as4ag as3ak as1ap a2sc as5ce 2ase a4sec a4s3eg aser5a ase5tj aseve4 as5ha asis1 a4sj as5ja as3ji as3k as5ka as5ki as3l as4lu as3m as5mi as3n as4ne as4ni 4aso as3ob aso2l aso4r as1p as3pl a4s5q as5sa 4assm 3assu a2st 4as3ta a4sta_ as5tag as4tas as4tat as3te a3stek a3stem as5ten as3t\xc3\xa8 asting5sp as1to as3tob ast3op 4astr ast5rem as5tro_ as4tu a1t ataart5j at1ac at3ade at3af_ at3ank ata3s 2atek a5tell ate2n ate3no aten4t5r ater5ad ater5sl at4eu 2atg at3hu ati5ni a2t3j at4je atjes5 at5jesb at5jesh at5jesm at5jesp 2atm 2atn a2too at3oog atos5f ato3st at3rac at3rei at3rib at4roe at5ru at4s3a2 at4s3ec atsi4 at4s3id at2s3l at4slo ats5m ats3n at4sne ats3pr at2st at4staa at4s5tak at4ste_ at5sten at5stij ats5tol ats5top_ ats5trek at4t3u4 a2t3ui at3w aua4 au3ch au3co au5de aud4j 1aug au3na aun3t aup2 aur4 au5re aure3u 4aus au3so au4s5p au3sto au3t4 4aut_ 1auto auto3p 2auts3 auw3a 4auz a4\xc3\xbc avast4 ave3c avee4 ave4n3i aven5sp aver3a ave3re ave3r4u 4avi a2vo 1a4von a5voo a5vor 4avy 2a1w axis4 ay2a 4azif \xc3\xa43h \xc3\xa4mme3 \xc3\xa43r 1b 4b_ 3ba baar5ste baar5tj ba4da bad3ar ba4d3r bad3s ba3g4h ba3gl 5b2ak ba4k3o4 bak4sp ba3lan ba4lar bal3dw bale4 bal3ev ba3li\xc3\xab bal4kl ba3lo bals4 bal3sf ba4me ba5n2a ban4k3a ban4kl ban4k3o ban4kr bank3w ba3sa ba4st ba2tr ba3tro 4bb bbe4l5ag bbe4l5ee bbe2n bben3a 4b1c 4b1d4 b5de bdi5a 3b4e be1a be3as be2au be3ch be5dwe be5dwi be5dwo bee4 beet1 be5g beie4 bei3s bei5tj be5ki be3k4l be1kw be3lar be5l4as bel5dr be3le be4l3ec be4lex bel5f be3li be4l5int bel3k bel4o be3lo5v bel3sc bel3sp belt4 bemen4s be3nep be5n4o be5ot be1ra bere5s4 ber4g5af ber4g5et ber4gl ber4gr ber4i be1r4o bero5v be3ru be3ry be1s4 bes5ac be4sh be4sje be3so be5sp bes5s bes5te_ bes5ten_ be5stie bet2 be3t4h be5ton bet5ren be3tw be5twi be3und beur4s 4b3f 2b1g 4b3h 3b2i bid3s bi2du bie4li bi4en bie4t3j bij5d bij3f bij3g4 bij5k4 bij1p bij1s2 bik4a 5bil bi3lo bil3s2 bin4dr bin4st bin4t3j bi5ob bi3ok bi5om bi3oso bi5ow bir3 bi4st bis5troo bi1tr bit4se bit4s3p 4b1j 4b1k 3b4l blad5ij 2b5lap b5led bles3 ble5spe ble2t3 b5lid blijs4 blij5ste bli2k 4b5loi blok5l bloot5j blu2s 2b1m 4b1n b4o bo4d3ec body3 boe4g3a boe4kn boe4ko boes4 boe3st boet5st bo3f4l bo2k bok3an bokje5 bok4st bolk4 bo2m3a4 bo2m3o bo5na bond2 bond4s5 3bone bo3no bon4t3j bon4t5o4 boot3j boots5te_ bo3p2 bor4sta borst5o bor4st5r bo4s bos3a bo5sco bo5si bo5so bos5p bos5to bot3j bo4to bot3r bot4sp bot4st bo2tu bou5ta bouw5s bo3v bove4 4b1p 3br4 braad5s bran4da bra5str brei5s4 brie4t brie5tje_ bri4l bro2n bron3o4 bru2l 4b1s4 b2s5a b5sc b3si bsi3d bs5je b2s5la b2s5m bs5s b4stij 4bt4 b3ta b1tr bts5 3b4u buit4j bul4k bu4lu bune5t b5urb bu5ri bus5c bus3o but4a but3j bu2to but4s buts5te buur4tj 4bv 2b3w by3 4bz 4c_ 1ca 3ca_ ca3b ca1ch 5cada ca3do ca3dr cae3 ca3g2 cal4l3 ca3lo came5r ca3na cant4 ca2of ca1pr ca4pra ca5pri ca3ra car4u ca5se ca3s2p cas3t cas5tr ca3ta cate4n ca3t4h cau3 cau4st ca3v 2cb 4c1c cca3 cces5 c4d c5do 1ce 3ced cee4 3ceel 3cel cel3d celes5 ce5li cel5k ce4l3o 2ce3n4a 2cene ce3no 5cent cen4t3j ceo4 ce3ra cer2n ce5ro cer4t3r ce2s ce3s2a ce5sc ce3s2h ce3sta ce3s4ti cesu5r ce3ta ce4t3j ceto4 cet3og cet3oo 1c\xc3\xa9 c3g 4ch_ 3cha\xc3\xaf 5chao 3chas 1chau 5chauf 2chc 1chef 5chef_ 5chefs 5chemi 5cheq che5ri che3ru 5ches che3us 1ch\xc3\xa9 5chir 4chn 2chp 5chromo 4cht 4chw 1chy 3ci ci5ab ci3am cie3k cier4s5 ci1eu 5cij 5cil ci5le cil3m 4cind ci3o ci5om 5cir ci3t2 ci5ta c3j c2k3a c4k3ed ck3ef cke5re c5k4et ck3id c2k3l ck4le c2k3n c2k3o4 c4k3r ck5se ck3so ck5st c3ky 1c4l cla2n cle3u 5clu 2c1n 1co co3ad co3d co4i coin5 co3k4 co3la 5com 5cond con1g 2co1no 5cons 3con5t4 2coo 2co1p2 3copa 4copi cor4dr co4rel co5ri cor2o 5corr cors4 co3ru co5sc co5se co5sp co3th co3tr 5coun 2cout co5v c3p4 1c4r2 3cras cre5d 2crip 3cris cro5f cro5k croo3 cro5v crus5 c3so c3sp c3ste 2c1t ct3act ct3ad ct5c ctee5t cte2n3 c2t1h c2t3j c4t3of c3tol c2t1on ct4or ct3rap c4t3re ct3sl ct3sp 1c2u cu5d4 cu3en cu3\xc3\xa9s cui5s cui2t cuit5e cu3k4 cula5p cu3ra 5cur3s cus3o c3w 1cy 1\xc3\xa7 \xc3\xa7a4o 4d_ 1da 3da_ 3daag d4aal d3aap daar5e 5daat 4dabo 2d3acc da4ce da5den 4dadr 3dae 2d1af 3dag da2g3a4 da3ge da4g3ed da4g3e4t da4g3on da4g3r dag4s3t da2gu 3dai da3\xc3\xaf da3ke da4ker 2dakk da4k1r 4dala d3alar d3alc da3le 4dalf da3li 2dalm da2l3u d4am dam4a da5mac d3a4mat d2a5me4 dames3 dam4pl 2da2na dan3as dank3l danoot5 dan4si dan4sm dan4s3p dan4st dans5ta 4d3antw 2d1ap 4d3a2pe 5dapu da2r3a d3arb 3dare 3dari dar4mo darm5on 3daro dar3s dar5st 3das3 5dasa da3stu 3d4at da3ta dat5j 4d5atl 4d5atm da2t3r 5daue 4d1aut 3dauw 2db dbei5 dbou4w5i 2d5c 4d3d4 ddags4 ddag5sp ddel5ev dde2n dden5a ddera4 dder5al ddere4 dder5ee dder5ep dder3o ddi3a d5dles d5do ddo3p 1de 3de_ de2al de1ch d4e5den 5dedir de4dit dee4g3 dee4l deel3i 4d3een dee4r 4d3eff de3g 4d5eg_ 4d5egg 2d5egy 2dei d3eie d3eig d3eil d1eis d3eiw 5dek de3ke dek3lu dek3w del4aa del5da del5dr del5eek 4d3e4lek 4delem de4lev 4d3e4lit del3k del2s del4s3e dels3i del4so 4d3e4mai 2demh 5demi dem5ond d2en_ den4ac den5ate den3ei den3e4p den3ev 4d3engt den4k5of de4noc den3o4r den3sh den5str de3nu 5denvl de4o de5ofo de5ol deo4li deo3v de3rab de4r3ad der3a4g de3rak de3ram de3ran de3rap de3ras de4r5as_ de4r5ass der2e der5ede der5egd de4r3ei de4r3em de5re4n de4rep de4ret de5rij de4r3im der3k4 der3on dero4r 4d3eros der4s3a der4s5om der5ste der5sto der5stra der5th 4d3erts der5tw de2r3u de3rup de2s de3sav des3m des3n des3p de3spe de5spel de4spl des5sm de3st des5tak de5stal de4s3te de4sti de5stic des5top de3t4 4d3e4tap de5tw deu4r3o4 de3us_ deu4tj deve4 2dex 4d1exa 4dexp 3d\xc3\xa8 2d1f 2d3g d4gaf dge3la dge2t dgeto4 dget5on dget5ov dge4tr dg4l 2d1h d5he dheer4 3d4hi_ 1di di2a di5ae di4ak di4ano dia3s4 di4atr 5dich di4do die2f die4r3o di3esr die3st die2t diet3r di1eu 3dig di2ga dig5aa diges5 dijk3r di3jo 2d3ijz di2k3o4 5dil 2d3imp di5n2a 2d3ind 2dinf 3d4ing_ 4d5ingel 4d3inj 4d3inko 2d5inr 2d3ins 4d3int dintel5 2d3inv 2d3inw 2d3inz di2o di5ofon di4ol di4one di4oni dio1s dio5sc 2d3i2ro 2d3irr 3di4s dis5ag di5se di5si dis4kr dis5p dis1t dis5tr di3th dit3j dit3r 5div 2d1j 2d3k2 4d3l d5le_ dli4n dlot4s 2d1m 2d3n2 d5ne dni3s 1do 3do_ do3a 2dobj 4d3obs 3d4oe 5doe_ doe5d 4doef d5oefe 5doek 5doen 5doet 4d5oev 3doi d4ole 2do2li d4olin dolk5s 5dol5s 3d4om_ 5domi do4m3o4 d3omr dom4sn 5domu d3omv 4domz 5don_ d4ona 5done do5ni 5d4onn 5do3n4o do3nu do5ny 5donz 2dop do3pa d3opb d3opd do3pee 5dopj 4d1opl 3dopo d3ops d3opz 4d5org do4ri\xc3\xab d3ork dors5m do3sp do3sta dot3j 5dou 2dov dover5s 3dovl 3dovo 2d3p dpren4 1dr4 3dra 5dra_ d3raam d3raap d4rac d5race 5drach d3rad_ d3rada 5draf 5d4rag d4rama d3rame 4d3rand 4drap 4dras 4d3raz 2dre 4d1rec d5reco d1red d2ree 4d3reek 4drend d4ress 4dret 3d2rev 5dreve d3ric dries4 5d2rif dri5ga d3rijd d3rijk d3rijm d3rijs 5d4rin 3dris 4d3rit 4d3roei d3roer 5d2rog 4d3rok d3roma d3rond 3droog 4droos 5drop 2drou 2d3ro5v 2droz drug4s d3ruim d3ruit 5d4ru4k 4d3rus 2ds d2s1a2 d4saa dsa4b d3sal ds4ate ds2ch d5schi dse2 ds3eco d4s3ed d4s5ee d4sef d4sei ds3eis ds3elf dse4li d5sen d4s3es d4set d2sh ds3ho d2s1i2 d4s5id dsig5a ds2im ds4ing ds5is d4s3j ds4jo ds5jon ds4l d1sla ds5las ds5lic d4s5lie ds5lim d3slin d2sm ds4mak d3smij ds5mo ds3n ds4ne ds5neu d3snu ds1o4 ds3ob ds3om d4son ds2oo ds3op d4spa d5span ds5pati d5spec d5s4pel d4s3pet d1spi d4s3pl d5spoe d5spok d5spor ds5s dst4 d1sta d5staat d4stab ds3tak d4s3tal ds4tan d3s4tat d5stav d3ste ds4te_ d5stee d4stek ds4ter d4sterr d4stev ds3th d3s4ti d4stit d1sto ds5tram ds5trekk ds5ty d2su4 ds3ure ds3uu d1sy 2dt d1ta dtaart5j d1th d2tj d1to d1tr d1tu 1du 2duca 5due du3en du3et 5duid 5duif 5duik d3uil 2duit 4duit_ d3uitd 5duite 4duitg d3uitv 5duiv du4n dun5i du2o du4ol 3durf 3durv 5du1s dut3j du5wen 2dv dvaat5 dvee3 dve5na dvies5 2dw d3wac d3was d3wat d1we 3d2wei d3wek d3wet d3wez d1wi 4d1wo d3wor d3wr 1dy 4d3yo dy4sp dy2s4t 2dz 4e_ 4ea e3aa e1ab ea3bo e3ac ea4ca eac5t e1ad ea3da e5adem ea3do ead3s2 ead5sh e1af e1ag e3ai ea4k3o4 e1al ea3la e3ali e4als ea5mi e3an e4an_ eang3 ean4s e5ap ea3pr e3aq e1ar ear2c e1as e2asc ea5s4e ease5t ea3so e1at e4at_ eat3s eau3s4t e1av e3bo ebots5te_ e5br 3ecd e3ce e1che e1chi echt5ec echts5o e3chu 4eck ec5le 4ecor 4ect ec3ta ec4taa 3ecz e1d ed4ag e3dam e3d4an e4d4as ede3a ed3ei_ ede5le edem4 ede5nac ede5o ed4er e4d5erns ede5rog edi3al edi3am e5die 4edir edoe5tj e3d4oo ed3opv edors5te ed3ov e3d2r ed3rod ed3rol ed1s ed5se ed2sl ed4so ed5sp ed3su ed3uit e4d2w e5dwan e4e eea4 ee5b ee5ca ee5che ee2d3a eed4ac eed5as ee5de ee5do eed3ru eed3si eed3w ee2f ee3fa eef3ac ee3fi eef3l eef3r ee4gap eeg3l ee3i ee2k ee3ka ee5kaa eek3ak eek5all eek1e ee5ket ee3ki ee3kl ee4k3lo eek3n eek3re ee3kri eek3ro eek5st eek3w ee2l eel3a ee3lad eel4as_ eel5d4u ee3le eel4ee ee3li ee5lij eel5k4 ee3lob eel3og eelo4ge ee3lu4 eel3ur eel3uu 4eem eema4 ee2n een3a eena4r een3e2 een5g ee3ni een5ie een5k ee5o2 ee2pa eep3an ee3pl eepo4 ee4p3re eep3ru ee2r eer1a eer3aa ee4rad eera4l ee3ram ee3ran ee3re ee4ree ee5rei ee4r3i ee5ric eer5k eer3og eer5oom ee3rot eer5ston eer5str ee2s3 ee5sch ee4s5em ees5et ee3sj ees5lo ee3sn ee3s4p ees5pl ees5pot ees5ten ee3stu ee2t eet5aa ee3tal ee3tan ee5te eet5h ee3tj eetna4 ee3to eet3og eeto4ge eet3oo eeto4r ee3tr ee4tro eet5rok eet3sp eet5ste ee5v ee5z e\xc3\xabn3 e5\xc3\xabr ef3ad efa4z efde5l ef3do ef3ei e5fer 4efi efie4t efiet5j ef3ins e3fis5 e1fl ef3li ef3loo e3flu ef3om e3foo ef3op e1fr ef3rij e5fron ef3sf 4e1g egas4 eg3as_ ega5sk eg3ebb e4ge4c eg3eig egel5ei_ ege4l5ov ege4net egen5of ege4ra eger5eng ege4ro eger5on e3g4i eg3ijz egip4 egiste4 e2gl e4go_ eg3org e2gos eg3oud e5graf eg3s4 eg5sle eg5so e2g3u4r egut4 e4g3uu e1h4 e5ha eheis5 ehit4 e2i ei5a 4eid ei3do eid4sc ei1e 4eien eien5s eie5re ei3f4 ei3gl 4eign e3ij eik4l ei3kn ei5kr eiks4 4eil_ eil5ant 4eild4 eil5dr 4eile ei4lev eil5m ei2l3o ei4n3ab ei3n4ac ein4do eind5oo ein4d3r ein5gr ein5k ei2no ein5sl ei3o ei2sa ei5sha ei3s4la ei3slo eis4p ei3s4ta 4eit2 ei4too eit4s3 eits5c eits5n eits5te_ eit5sten eits5tr eive4 4eiz e1j2 e3je ek3aan ekaart5j ekaat4 ek3af_ e4k3a4g ek3al_ ek3alt e5kam ek3ang ek4ee ek1ei e3kem e5ker_ e5kers ekes3 ekes4t ekes5tr e3ket ek5eter e5kic e4kil e5kis ekla4m eklam5a ek3lev e5klim ek5loos ek4ni e3ko e4k3ob e5kof ek3oli ek3opz e5kor ek5os_ ek5oss e5kran ek3roz eks4e eks5erv ek5set ek4str eks5tra ek5t4e ek3to eku4 ek3uit ek3ur ek1uu ekwet5ste ek3win e1la el3aan el5aand el1ac el4ade el3adj el3adm el3adr el3adv el1a4f el1al e3lan el5ana e3lap e5lap_ e4lapp el3arb el3arc el3arm el3art e4l3as_ el3asi e4l3asp e4l3ass el1au e4laut e3laz el5azi el4dec el4dr el4du e1le e3le_ el3eeu el5eff e5leid el5eier el3eig el3ei5s e4lel 3e2lem el3emp e5l4en e3ler ele5r4a eler4s el3erv e3les eles4t e4l3eta ele4tr e4l3etu el3exc e3l\xc3\xa9 elfi4d el1fl elf3s4 el3gu 2eli e5lie e5lig eli5kw el3imp e4l3ind e3ling e4l5inkt el5inz 3elix el4kee elk3s el4k3u4r el4kw 4e1lo e5loep el3oes e3lok el3ol el3oms el5ond el5ont e3loo e5lood e5loos el3ops el5opt el5opv el3o2r el5org elot4j e5lou el3o4ve e5loz elp4o el4ps el4s5em el4s3k el5smed el5twe 4e1lu el3uit eluks5 2ema e4mana ema3sc ema5to emees5 emens5te emer4s emes3 emie4tj e5mok em3oli em3op em3org emor5sten e4mo4v em3sa em5sc em4sli em4sm em1st em3su em3uit emut4 en3aap e3naar e4n3aas en1ac e5n4acc en5af e2n1ak e2nal en3al_ en3als en3amb en4ame e2nan e4n3ang en1a2p e5nari en3ars e2n3a2s enas3p e3nat ena4tel e4n3att en1av e2n3a2z enci4 3ency_ en3da en5daa end5ama 5enderti en3d4o en3dr en5drek e2n3e2c enede4 e3nee en3eed enee5t en5eg_ en5egg en3ela en3elf en3ema e4n3en5t e2ne2p en3epo e5nere 5energ e4nerv en3eta en3ete ene4ten e3neu 4enf en5ga en3gl en4g5le eng4r en5gri engs4 eng5se eng3sm e3nie e5nijd e2n3im e4ninga e4n3ink e3niv e4n3i4vo en3k2a e4n3och en3off e4n3oli e2n1on e4n3oor enoot5 e2n1o2p e3nor_ en3ord eno3s en3ou e2n1ov 3enq en5sce en4sei ens5ein ensek5 3ensem ens4fe en4sin en5slak en4s3on en1s2p ens5pot en5stan en5sten enst5ijv en4stin en4stu4r en3su en4tac en5tee en5tei ente5re en4terv 3ent\xc3\xa8 en1t2h en5tom ent4r en3tre ent5rol ent4sl ents3m ent4s3p en3tw e1nu e4n1ui e2nun en3ur en3uu 5envelo eny4 e3o eo3d eodo3 e5oe eoes3 e5off eo3fr e4o3k4 e5on eo5ni e5oo eo3pa eo3pe eo3pl eop4la eo3p2r e5ops eor5d e5org e5ori eo3ro eo3s4 eo5st e4ot eo5te e5o3t4h e1pa e3paa ep3aak ep3ac e4paf epa4k ep5ake e3pal e3pap e4p3app e3par ep3asp e1pe e5pe_ ep5een e5per epers5te_ e1pi 3epid ep3ijs ep3ijz ep5ingr ep3ins epit4s epits5te ep1j e1pl ep3led e4p3lod e5ploe ep3lus e1po e4p5o4ge epoort5j epoot4j 3e4pos_ e3pot epou4 e1pr ep4ra e3pri ep5rode eprot4 ep2s ep4s5ee ep4ser eps3l eps5n eps3p eps3ta eps5taa eps5tal eps5to eps3tr eps5tro ep4tak ep2tj ep4tr ept3ra ep5tro ep3uit 4equa e3ra_ e1raa e5raad e4raak_ er3aan er5aanp e4raap_ e5raat e4r1ac e5rac_ e5race e5raco e3rad e5rad_ er3ado er3af e3raff era4gen e1rai e4r3all er3ama er3ana e5randa e5rane e5ra3pl er3arc e3rare e3rari e1rat4 er3a4tr er3azi er3d2a er3d4i erd4o er3d2r erd5uit_ er3d4w e1re er5eat 4erec er5editi er3een e5reep er5eers er3eet er3ef er5eff er5eg_ er3egd er5egg er5egt er3eie er3eig er3eil er5eind ere3kl er3elk e4r3emm er3emp e3rend e5rendel ere4ne eren5eg er5enen_ e3renm e3rent er5enth e5rento eren5tw ere2o ere4og er3epi er3e2q er3eri e3res_ er3esk e3ress ere4st ere4t3j er3etn e4r3ets e4r5ex erg2l e3ri eri5ab e5rif e5rig erig5a er3ijl er3ijs e4rijs_ er3ijv e4r3ijz e5rik er5ind e4r3ini er5inkt er3ins er3int e5rio e5ris erkeers5 er2kn er3m4i er5mo er5nu e1ro_ e3rob er3oc e4r3oed er3oef e5roep eroe5tj er3oev er3of ero2g e3rok e1ro2l e5rol_ er3oli e5roll er3om er1on e3ron_ e3rone er3onv er3oog er3oor e5roos e4r3op erop3a ero5pen e2r3or er1ov er3oxi e3roz e3r\xc3\xb6 er4plu errie5tj er3scr er3sj er5slag er5span ers4pot er5stem er5te er3t2h er5t4i er5t4o er3tr ert5se erts5l er3t4u er3t4w e1ru e3rub e3rug5 e2rui er3uit erui5t4j e2run e3runs e4r3ur e3rus er5uu 3ervar 3erwt e4saf e4s3a2g e3sam e5san es3ap es3arr e3sa3s e3scop e3s2cr es4e e5sec es5een e5sel es5ene e4s5eng es5ex es2fe es5he e4shi e3sid e3sie es1in e4sir es5je_ es5jes e3s4jo es5jon e4s3ka es5kr e3sl es4la e5sla_ e5slag es3lak es5lat es4le es5leg es2m es4mui e5smuil_ e1sn e3s4ne e1so e3sol es4oo es5oor_ eso4p es3ore e1sp es5pas es4pel espit5ste e3spl e4sprie esp5riem es4sm e3stak e3s4tal e3stap es4tar es5tatie e4s3te_ es4tea es4teel est5ei_ e4steka es5tekam e3s4tem es5temo es3ten e4sten_ es5tenb es3ter estere5o es5tes es4tet e3steu es4tic e4stie e3stot es5tra_ es5trac es5trak e5stral est5rap es5trei est4sc es4tur e3sty e3su esu4r e3sy e1ta e3ta_ et3aan et3ac et3ad et3afz 3e2tag e3tak e5tak_ et4ana e5tand e2tap e4tapp e5tat e4tau e2tav e3te e5tea et3edi e5tek 4etel e5tel_ e4t5elf e5tels et5emb et5emm etens5u eten5tj ete5r4a ete3ro eters5la eter5sm e5tes e1th et3ha et3hor et5hu e4t5i4d e5tie e4t3inc e4tiq e5tis e4tja e1to e5toc e3toe e5toev e3tol eto4p et3ope et3opl e4t3ork eto3sf e1tr et3rec e4t5res e3troe e5tron e5troo etros4 e4t3ru et4sl ets5lap et5slu ets3n et4s3oo et3spe ets3pr et3spu et4ste ets5tek et5sten et5sti ets4u et5su5r et5suu e1tu etui5tj etu4r et3we et2wi 1eua4 1euc eudi5o eu5dr eu3e eugd3r eu3g2r eu4ler eu4li e1um e3um_ e2umd eu2na eun3t 1eu1o eu2po eu4rad eu4rec eu3ren eu4res eu4rij eur5k euro5v eur4sta eurs5taa eurs5te_ eur4s5tr eur4su eu5sch eus4p eu3spa eu4st eu5str eu3tj eu1tr e3uu 2euw eu4wa eu5win euw4str evaar5tj eval4s evari5 eve4lo evel5op eve5n4aa 4ever eve3ra 4e1w e5wa e5we ewen4s ewens5te_ ewest5r ew2h e5wi ewo3v 4ex_ 2ex3aa ex3af 4exco 3exeg 3exem 4exi ex3in ex5op 1exp e3y4o eys4 ey3st e5za e3zee 4e3zen ezers5 e3zo ezz4 \xc3\xa93a \xc3\xa91d \xc3\xa9dee4 \xc3\xa9di3 \xc3\xa91g \xc3\xa9gee5 \xc3\xa93h \xc3\xa93j \xc3\xa93n \xc3\xa93p \xc3\xa93r \xc3\xa91t \xc3\xa81 4\xc3\xa8c \xc3\xa82l \xc3\xa82s \xc3\xa85t \xc3\xa8ta5 \xc3\xaa1 \xc3\xaa2p \xc3\xaa3per \xc3\xaa5t 3\xc3\xab 4\xc3\xab_ \xc3\xab2b \xc3\xab3c \xc3\xab3d \xc3\xabe2 \xc3\xaben3 \xc3\xab3j \xc3\xab1l 5\xc3\xabn \xc3\xabnce3 \xc3\xabn4e \xc3\xabns2 \xc3\xabn5sc \xc3\xabnt2 \xc3\xabn5th \xc3\xabn5tw \xc3\xab3p \xc3\xab1ra \xc3\xab1re \xc3\xab1ri \xc3\xab1ro \xc3\xabro1g2 \xc3\xabro3s \xc3\xab2s \xc3\xab3si \xc3\xabs3t \xc3\xab1t \xc3\xabt4s \xc3\xabts3te \xc3\xabve5 \xc3\xabven4 4\xc3\xabzu 4f_ 1fa f3aanb f4aat 3fab fa2bo f3acc face4 f1ach 2fad 2f1af fa3g fal3s fa3m f3ang fant2 fan4t3j fant4s5 2f3a2p f4arm 3fa5se fa2to fa3v 4fb fbe5dw f1c 4fd f3da fda4g f5dan fd1ar fde4k fdek3l fde4s3 fdes5e fdes5l fde5sm fdes5t f2d3in fd3of fdors5te fd4ra f3d4ru fd5se fd3si fd3so fd3sp f4d2w fd3wo 1fe fe2a fec4tr fede3 fe4del f3een 5fees feest5r fel5dr fe4l3ee 3feli fe4lom fe4l3op fel3sp fe3no f4er fe3rab fe3ran fe4r3et fe3rom fe3ron 3fes3 fe4t3j fetu5r 2f3ex 1f\xc3\xa9 3f\xc3\xa8 3f\xc3\xaa 4f1f f5fe f5fi ffs2 ff3sh ff3si f3fu f3g2 fge3 fge5r4 fge5t 4f5h 1fi fi5ac fi4al fi3am fi3apa fi3apo fia4s 3fib fi1ch 5fie 5fig f3ijs 2f1ijz fik4st 3f2il fil4m3a film5on fi3lo 4find 3fini f3inj 4fink 2finr fi3o fi4r fi4s fi5se f5iso f1j fjes5 4f1k4 f3ke f2l2 4f3laa f1laf f4lam f3lei flen4st flens5te_ f4les fle2t flet3j 4flev f4lex f3lez 2flie 2flij f4lik f4lip f4lit f3lok 3f4lor flu4t3 4f1m f1n 1fo 3fob 5foc foe5d foe5ta 2f3of 5fok 2foms fo5na fond5en fonds5l fon5eng fo1no 4font fon5te foo4 fooi5 f3oom 5foon 2fo4p fop5s4 f4or 3fo5re fo5ri 5form for4t3j fo1ru fo3t 2f3oud 4f1ov 3f\xc3\xb6 4f5p4 fpers5te_ fpits5te_ fr4 f4raak_ fraam5 5frac f3rad f2ras 5frau f1rec f3rek 5freq frie4s frie4t friet5j f4rik f4rod 4f3rol f4rolo f3roma frus3 4f1s f2sa4 fs3ad fs3an fs3ar f3sc f5sch f4scr fse2 f4s3ec f4s5ee f4sei f4s3eth fs4fe f2sh fs5he f2si f3sie fs3im fs1in f5slaa f5slac f5slag fs3lap fs2m fs3ma fs4mi fs3mo fs3mu f2s1o4 fs3ob fs3om fs4oo fs2p fs4pre fs4t fst3as f3ste fs5tec f5stell fste4m3 f4sterr f3sti f5stif f3sto f4st3oc f4ston f3str f3stu f3sy 4ft f1ta ft1ac fta4kl fta4p ft3art fter5sh ft3h f1to f5tond f4tont f1tr ft2s3l ft4sm fts3n ft4so fts3p f1tu ftu4r 1fu 2fuit fu4ma fum3ac 3f2un fur4o 3fus 2fuu 4fv fva2 fval3 4f1w4 3fy1 2fz fzet5 4g_ 1ga 3ga_ gaar5tj g4aat 2g1ac 4g3adm g4af_ g3afd ga3fr 4g3afs 4g3afw 2g3a4h 4gal_ ga3la ga4l3ap ga5ler gal3s 4gamb g4a3mi 3gan gan5d 5gane gan4s5t ga3pl 3gar_ 4g3arb ga3re g1arm 3gars 2g3art gar5tj ga4s gas5c gas3i ga5sla_ ga3sli ga5slo gas3o gas3p gas3tr gas5tra gast5rol 3gat gat5j gat3s 4gaut ga5ve g1avo 2g5b 2g1c 4gd g5dac g5dag gd3art gd3at gd5ate g3de g4d3elf g5der_ gd3erv g4d3id gd3im g2din g3dr g5dru gd3sa gd5sp g3du 1ge 3ge_ ge3a gea3dr gea5na gea3q ge4ari ge5au 4g3eb_ 2gebb ge3c ge3d4 gedi3a ge4dit ge5dr ge5dw 3gee4 geest5r geet3a ge3f4 2g3eff ge5g4 gege4s 4geig 2g3eik gei4l5a 5geit geit3j ge3k4a ge3ke ge5ki ge5k4l ge3kr gek4st gek4u ge3k4w ge3lau gel4d3a4 ge3l4e 4ge4lem gel5f gel5k 5ge3l4o gel5si gel3sl gel3sp gel5ste ge5ma 4gemb 4g3emf ge5mo 2g3emp gems3 ge3m4u g4en_ ge3nak gen4az 3ge3ne ge4n3ed ge4nend 4g3engt 3geni gen5k ge1no ge4n4of ge4nog gen5sfe gen5ston gen5stu genstu5r 5genw ge5om geo5pe georke5 ge5os ge5ot ge5p4 ge1ra ger5aal ger5aap_ ge4r3a4l gera4p ger5ape ger5as_ ge5reg ge3rem ge5ren_ ger4i ger5ini ge1r2o ger4of ge5rol ger5slan ger4sli gers5lij ger4sp 4g3erts ge3r4u 3ge1s4 ge3sa ge3sc ge5se ge3si 4ge3sk ge5sl ge3sn ge3so ge5spend ge5sper ge5spo ge5stan ges5te_ ges5ten_ ge3str ge5sw ge3ta get4aa ge5tam ge2th ge5t4i ge3t4j get4o ge3tr ge5tra ge5tro ge5tru ge5tsj ge5tu ge5t4w ge3ui 5g4ev 4gex 5g4ez 1g\xc3\xa9 g\xc3\xa9di4 3g\xc3\xa8 4g1f gfijn5ste 4g3g4 g5ge gge3la gge4r5on gges5ti g4g5h g5gi ggings5 g5gl 2g1h g2het ght4 gh5te g2hum 1gi gids5te gie5ra gier4s gi1eu gi2f gif5r gi3ga 5gigere 5gigste 2gij g3ijs 4gijz gi2m gi3na 4g3inb 4g3inf g5infe g5infr 5ging 2g3inh gin3o 2ginr gi4oc gi2od gi4onet gi2or gip4st 5gir 3gis 4g1j 4g1k gl4 g5lab 3glai 1gla4s glas3e g5lat 3g4laz 3gle_ g5leer glee5t g3len 2g5lep 4g5ler g3les 3gle4t glet3j g5lev g5lice g5lich 3gli\xc3\xab g2lif g5lijs g2lim 3g4lio g2lob 3glof g5log 3glom 4g3lon g3loon g3lop 3g2los g5loz 3g2ly 4g1m gmaat5j 2g1n g3na gn4e gne5g gne5m gne4t3j gnie4tj 4gnu 1go 3go_ 3go2a 3gob 2goc g1och go4d3a god4s3 gods5t 4goef goe1r 2gof go3f2r g4og 4goh go2k 5gom_ go2ma g3oml 4gomz go4n3az 2g3ong go5no 2g1ont g2oo 2g3oor 3goot 2g1op go3pa g4opr g4ora 4go4re go5re_ 5g4ori gor2s gos1 go3tr gou4d5ee 2g3ov 2g5p gpes3 1gr4 3gra 5gra_ graat5j g5rak gra2m g4ram_ gram3a g3ramp gra4s3 5grav 2g3rec 2g3red 5gredi g5redu g3reek g3reel g4reep g3reis 4g3rek 2g3rem gren4s gre4s g4reu g3rev 5gria grie4t5j g5rijd g5rijk g5rijm g5ring 5g4ris grit5s 2g3riv groet5j grof5 g3rok g3rook g3room groot5j 2grou gro5v 2g3rug g3ruim g3rup 4gs gs1a2 gsa4g gs5alar gs3alt g2sc gse4 gs3eco g4s3ed gs5een gs3ei gs3en gs5ene gs3erv gs3et gs3ev gs5he g2s1i2 g3sie gs5is gs1j g3s4ke_ gs3l gs4la gs5laag gs5lam gs5las gs1le g3slep g4sleu gs5lie gs4lin g5sling gs4lo gs5log gs5lok gs5lon gs4lu g4s5ma gs3n g4sna g3snij g4s1o4 g5sol g5som_ gs5ons gs3op gs3p gs5pand g3spec g3s4pel g3s4pet gs4pi g3spie g3spil g5spin_ g5spinn gs5pir gs5pol g3s4pon gs5ps gs5q gs5sc gst2a gs5taal gst5aang gs5tac g5stad g5s4tan g4st3ap g5stat g1ste g5s4te_ g5sted g5stee g3stei gs3tek g5stel g3sten g3ster g5ster_ gs5terr g5sters gs3th g5s4tic g3s4tig gs5tijg g5stof g5stop g5stor gst3o4v g4s3tra gs5trad gs5trak gst5ram gs5trap g5strat gst5res gs5troe gs5tron g4stru g5struc g3stu gs5ty g2s1u4 gsver3 gs5w g5sy 4gt g1ta g2t3ap g3te gte3ro gtes4 gte3st g1to g3tr g1tu 1gu 5gu_ 3gue gu4eu 2guit gu4ni gu2s3 gut4st guts5te_ 4gv g5vo 4g1w g5wa 1gy 4gyp 2gz 4h_ haams5ta haar5sl haar5sp haars5te haar5tj haats5te_ h3afd haf4t3u ha3g ha5ge hal2f1 5hals hal4sto 5halz 2hamp 4han_ han4dr hand5sl han3ga hang5l hang5s han4s3l han3so han4st hap2s hap4se har4ta harte5l hart3j har4t3o4 har5tre hart5sl hat5j ha2t3r hat3s ha3v 4have_ 4hb 2hd h4e 2hea he2ar 3hech he3co 4hee_ hee3g4 hee4k heek3a heek5l hee4l3o heep4s heeps5c heers5tak hee5sto hee5tjes he2f he4i heids5p heis4 hei5tj he2k3a he2kl hek4st heks5te_ hek5sten hek3w he3le he4l3ee he3li hel4m3a helo4 hel4p3a hel3sm he5mo he5ne hen4kr he3n4o 4he5o he4pij he2p3l he2pr he1ra her4aa he4r3ad he3r4au he4r3i herm5eng he3ros hero5v her4p5aa 3herst hert4 herts5te he2ru he5se he2sp he2s5t hets5te_ heu5le 2h3f 4h5g h3h hi5d hie4f3 hielsges5 hie4r3 hie5ren hier5u hie4t5o hie4tr hiet5s hij4sl hik4s5 hi3kw hil3m him4pl him4pr hin5d h3ins hin4t3j hi2p5l 2hir2 his5p hi3tr hit4st hits5te_ hit5sten h3j 2hl h3la h4lag h3lep h3loc 2h2m h3ma h3me h4mer h1n h2na hno3 2ho_ ho3a hoa3n hoboot4 ho3ch hoe4ker hoe4s hoes5l hoe3t ho2f hof5d hof3e ho3g2 ho2ka ho5mo hon3dr hond4s hon3g honi4 ho1no hool3e 4hoom hoort4 hoor5tr 2hoot ho3pa ho1pe ho2p3o hop3r hop4str hor5de 5horl ho3ro hor4st hors5te_ hor5sten hor4t3j ho3ru ho3sa hot3j ho3tr ho4t3re hot4st hots5te_ ho3v 2ho4w how3o 2h1p hpi4 2hr hra4b h4re h5rea hri4 hro2k hrok3o hroot3 4hs h3sa h3sp h3st 2ht h4t1a2 ht3ac h3tal ht3ala h5tans h3te_ h4t3ec ht4eco h2t3ee h2t3ef h2t3ei ht5em h3ten h4ten5t ht5entw hter3a hte4r5o h4t3esk h4tev ht5eve h5tevo ht3ex h2t5h h4t3int h2t1j ht1o4 ht5oef ht5op h4t1r ht5roo ht4sap htse4 ht4ser ht2si ht4sl ht5sla ht5slot ht3sme ht5smij ht4s3o ht3spe hts3pl ht3spr hts5taal ht4s5tak ht4s5tek ht4sti hts5tore hts5trekk ht1u2 ht3w hu4ba 3huiz hul4der hur4t5 hut3j huts5te_ huur5s 4h1w hy4la 3hyp hypo1 4i_ i1a i3aa i4ab i5abi i4ac i3ady i3ae i5ae_ i2a3f4 i2a3g2 i3agr i3ai i5ak_ i3ake4 ia4kem ia3kl ia3kr i3al_ i4a3la i3ali i2am i5am_ i3ami i3an ian4o ia3o i2a1p4 ia5pa i5api ia3sc ia5se ia3so ia4s5po ia3sta i3at ia3t2h i5atri iave4 i5ble iboot4 4ic i3ce 5i4cepa i1cha i1che ichee4t i1chi i1cho i3chr ick5l icos4 ic4t3op ict4s5c i3dam idde4r5a ide3a i4dee_ ider4sp ider4st ides4 idi3a idi5ab i2di5o id4mak i3dok i2dr id3ran id3ru id2s1 id4s3a id4ser ids5i ids5j ids5l id4sm ids5ma id5s4mee id4s3o ids3ta ids5tak ids5tek id4stem id4sti ids5tr id3u4r id3uu idu3w id3w 4ie ie1a2 ie4d3ac ie3de ie4dro ied3w i1ee4 ie\xc3\xab2 ie3fi ie2fl ie3fle ie3fon ie4fr ie4gas ie3ge ie4g5ins i2ek iek3e4v ie4kl iek3li ie5klu ie2kn iek5ond iek4s5n iek4sp ie2ku ie3kwa ie5lan ie5lap iel5do iel5d4r iel4e iel5ei_ iel5k iel3sc ie3ma iem3ov ien4dr ien3ij i3enn i5enne_ ien3s4m ien5sp ien4sta ien4st5o ien4str ienst5ur ieo4 i4ep ie5pen iepiet5 iep5oog iepou5 iep5rel iepro4s iep3s4 iep5st iep5tr ie4pui ie5r4ad ier3a4l ie3ram ie3rap ier3as ie4rat ier5el_ ier5els ie5ren_ ie5ring ierk4 ie3r2o ie4rof ier4sl ier5slu ie3ru ier4ui ie3sf ie2si ie4sl ie5sle ies3li ies3m ie2s3n ie2so4 ie4s3pl ie3sta ies5te_ ie5stel ies5tere ie3sto ie4taa ie5tal iet5ant ie5ten ie3tj ie3to4 ie4t3og ie4too ie4top ie4tor ieto5re ie4t3ov ie5troe iets5te_ iet3ur iet3uu ie3twi i3ety ie2u ieu3k i1eur ieu5r4e i1eus ieu3sp i1euz ie3v ie3z iezel5a i3\xc3\xa9s i1\xc3\xa9t i1\xc3\xa8 i4\xc3\xabg i4\xc3\xabva 4if if3aa if3ad if3l if3r if4ra if4taa if4tar if4tre iftu5r if3ui ig4a ig3aa ig5ac i5gal i4g5av i3ge ige2s ig3esk ig3ij i4gind igi3o ig5no i3g4om ig4op igs4 ig3sk ig3sl ig3sp ig3sto ig3un i1h i3i i5ie ii2n i5is i2j 4ij_ ij5a ija4d 4ijd 4ije ij3ef ij3ei ij3el ij5e4n3 ij1er ij3i 4ijn ij3o4 i3jou 4ijso 4ijsp 4ijst ij5te ij4tr ij5u 4ijvo 4ijzo 4ik ik3aar i4kam i3ke ik3ef ike4ra iket3 i2kij i3kl ik3la i4k3lo i4k3lu i2k4n i4k5na ik5o2g i3kom i2koo iko2p ik3ope ik3ord i4kr ik3re ik3ri ik3ro ik5se ik5si ik3s4l iks3n ik3sno ik3sp ik4spa ik1st ik5sta iks5te_ ik1w ik5war i1la i3la_ il4aa il5aan il3ac il4act il3ad il3af i3lak il3al i5land il2da il4d3r ilds4 4i3le il3een ile3l i4l3erv ile4t ilet5r ile3u il3e4ve ilevin4 i4l3e2z i3l\xc3\xa9 il5f i3li ilie5g ilie5t il3ink ilk4l ilk3s2 illa3s 1illu il2m ilme2 il4min il4mo i1lo ilo4ge il3ond i3loo i5loon il3oor il1or ilo4re ilo4ve il3s2h ils5j il4sti il2th i1lu 4im_ i2mag i4mago im5au imee4 im3een i4m3em im3enc im3ex 4imf i2m3of im3op im3org im5pa im4s3oo im1st i3mu in1ac i2nau ind4aa in4dene ind3sc ind5ste 1indu in3e4de in3edi in3eed inek4 ineo2 inet4s i5neu 1inf in2ga4 ing3aa ing3ag ing3al 3ingan ing5lo in2go in4gr ing4st 4ini_ i3nie ini5on ini5sl ini5sta 4inkj in2kn 3inkom in4kri 3inno i1no i3noc i3nod in4o2g in1on ino5pe ino3s4t in3ov 1inri 4ins_ in5sch in5se in3sl in3smi in3so in1sp in5spo in5sten in5swi in4t3ap in5te intes5 in3th 1int4r i1nu inuut3 4i1o io5a ioas5 io5b i3o1c i3ode ioes3 io3f io3g2 i3ol i5ol_ i5olen i5olus i3on ioneel4 i5ong ion4s3 ions5c i5oo i2op4 io3pa io3pr i3opt io3ra i3ori io3ru io4s i3os_ ios3c i3o5se i3o5sf io5sh io5si i5osi_ io5so io5sp io5s4t i5o5su i3osy i5othek i3oti iot3j i5otorens io3tr i2o3v i3ox i2oz i1pa i2p1ac ip3af i3pap i1pe i4perw ipe4t3j i1pi ip1j i1pl ip3lu i1po ipo4g i1pr i2pri ip3ru i4ps ipse4 ip4si ip4sle ips5te_ ip5sten i3ra ira3k i1r2e ires4 ire3st i3r\xc3\xa9 i1ri irk4s i1ro iro3p iro5v ir2s ir4sc ir3sp ir5ste irt3r i1ru 4is i1sa i2saa i4s3ad is3a2g is3ap i2s1ar i2s3as i4sc i5scha i5schr is5col i5scoo i5scope ise2d i4s3ei is3ell is5eng i4s3erv ise3st iset3j is4fee is4fer i4sh is5ho isi2d i2sij i2s3im is3ja i4sk is3ka is3ke is3l is5lag is5las is5le i4s5m i4s3n is5ned is5nij is5no 5isol i4soo is4oor iso3s i2sot is3ott is3p is5pas is2pi is5pl is5q is5sa is5so i2s3t is1ta i3stak ist3ap i4s5tas is4tat is5terd is5tere is4th is1to ist5ong i3str is5tri i5stro_ i3sty isu2m i5sy 4it i1ta it3ac ita5d it3een i3ten i3ter ite5rei ites4 ite3st ite4t it3hie it1ho it1hu it2i itie5st i4tj i1to it5oef it3oog i3t2ou i4to4v itper5st it3red it1ru it3sje it3sli it3sop it1sp its4te it4ste_ it4too i3tu it3w 4i3u2 iu4m ium3a4 ium3e ium3o iu3r i3ve iven5s ive3re i5w iwi2 iwie2 iwit3 4iz i3ze ize3t \xc3\xae3 \xc3\xaet4 1\xc3\xaf 2\xc3\xaf_ \xc3\xaf5a \xc3\xaf1c \xc3\xaf1d \xc3\xafe4n3 \xc3\xafe5nen_ \xc3\xaf2n3a \xc3\xafns5m \xc3\xafn3sp \xc3\xafn3u \xc3\xaf3n4ur \xc3\xaf3o \xc3\xaf3ri \xc3\xaf3ro 4\xc3\xafs_ \xc3\xafs3a \xc3\xaf4sc \xc3\xaf5sche \xc3\xafs3l \xc3\xaf3so \xc3\xafs3t \xc3\xaf1t \xc3\xaf5z 4j_ 1jaar jaar5tj ja3b 2jaf 1jag jagers5 ja3kn ja3mi jan4s3l jan4st ja3pl ja1po 1jar jare4 1jas3 jas5p 3jaw jaz4 j3b jba4l jbe4l3i j1c jda2 j2d3aa jd3an j4d3ar j2d3ee jde4n3e jden4s jdens5p j4d3erv jdes4 jde3sp jde5st jdi3a j2do4 j3dom jd5on jd3op j3dr j4d3re j4d1ri j4d3ro j4d3ru jd5sei jd3spo jd1st j2d3u jd3w j3d4wan jea4 3jeba je3ch jec4ta 2j1ee jel4 je3la j1en je2na2 je3n4o 5jep jepiet5 je3ro jers4 jer3sp je4s3 3jesa 5jesal je5sch 3jeskn jes5l jes5m jeso2 jes5pa jes4pr 3jesr jes5tr 5jesvo 3jeswa 3jeswi je2t jet3er jeto4v jet5st 5jeu 3jevr 2jew j3ex j2f1a j2f3ei j2f1en5 j4f3ij jf3ink jf3l j3f4lat jf5le j2f3o4 jf3r j3f4ra j3f4ro jf2s jfs3a jf4sc jf4s3er jfs5f jfs3l jfs5m jfs3n jfs3p jfs5pa jf3st jf4sta jfs5tak jf5stan jf4stel jf4sti jf4s5to jft2 jf5ti jf5tw j1g j3ge jger5sl j2g3l jg4s5e jg3sn jg2st jg3s4te j3h jif3 j3ig jin3g ji5t2j j3j 2jk j3ka j4kaa jk5aard j4kar jk3arb j4kau j4kav j2kij j2k4l j3klaa jk5lak jk5lap jk5las j4kle j5kled jk5les jk5li j3klon jk5lop jk5luc j2kna j2k3of j4k3o4l j2k3on j2ko4p jk3opb jk3ope jk3opl j3kops j2kr j4kra jk3raa j5kran jk3re jk3ro j4k5ru jk3slo jks3pl jk4sta jks5taak jks5taal jks5tak jk5stan j2k3ui jk3w j3k4was j1la j3laa jl5ana j1le j2l3ef j2l3el jl5f jl3ink j1lo j2loe j3lu j2m3af j5m4ar j3mi jm3op jm3s j2n1a4 j4naa jn5ac j3na5g jn3ak jn2am jna5me j3n4an jn5d2r j2nef jne4n j4n3erk j4n3erv jn3gl j4n3im j4n3ink jn3k4 j2n1o4 jn4si jn2s3l jns5lac jn3slu jns5or jn2sp jns3pl jn1st jn4ste_ jnt4 jn3tr joet3 4joi jol4e jo5lij j3om 1j4on jone2 j3op jo3pe jo3ra jo3ru j4ou 1jour jou5re joy3 j3pa j4p3ac jp3arm j1pe j2p3em jp3ij j1pin j3pio jp1j j1pla jp3li j1po j2p3or j4pre jp3ri jp3rok jps4 j3r jraads5 2js js1a j4sef j4s3ela j5seli j4s5em j4s3e4r j2s1i js5in js4ir js4le js3lee js3li js5lie js4me js5mel js5met js3n j4s1o4 j5soe js3ol js3pac js3par j3spe js3pl j4spo js3poo jspoort5j j5spor j1sta j4star j2s3te j3stee j3s4tek j3s4tel j5s4teng js3th js4tij j5stond j4stoo js3tou jst5ran j5strok j2su j3sy j3taal jt3aar jt1ac j1tag j3tak j3tan j3te_ jt1h j3toe jt3opt j3tr jt3ra j5tred j5tree jt3rei j5trek jt3ri j5trok jt3rot jt1s j1tu 1j4u ju3d 4jum jus3 juve5 j3v jve2n jver4s jvers5p jve3t jvie5s j1w jze4r5o 4k_ 1ka k3aanb k3aanl 5kaart kaart5jes kaats5te_ kabe2 ka3bo 2k1ac kade4t5 4k3adm ka3do k3adv 2kaf k3afd k4aff ka3fl 3k4aft ka4ga k3a4gen k3ah ka3i 2k3alb ka3le 5kalf kalf4s5 ka3l4i kal2k kalk3a 4kalt 5kalv 3kam 4kamb kamen4 kame4re kam4pa kam4pl kam4pr ka5naa kan5d 4kang kan4sl kan4st kan4t3j kao3 5kap_ ka3pe kap3l ka1po 4kappa ka3pr kap3s k3arc k4a3ro kart4 4k3arti kar3tr ka4s kas5c 4k3asi kast3o4 ka3str kast5ra ka5stro kas3u4r kat5aal ka4t5a4le ka4tan kati4 ka4t5io kat5j k3atl kato4 ka4t3og ka5tr kat3s 2k1aut 2kavo 2k3b 2k1c k3ca 2k5d kdi3a 1ke k4eb 2k3ec ke4di 2k3een kee4p5l kee4r keer4s keers5to 2kef 4keff k4ei_ k4eie k2eil kei3s4 kei5t ke4lap kel5da kel5dr ke5lel 4kelem kel5f ke4l5int ke4lom ke4l3op kel3sp 5k4ema 2kemm 2kemp ke4n3an ke4nau ken4ei_ ke5nen ken5k ke2n1o kens5po kepie5t 4k3e4q ke3ram ke4r5enk ker3kl ker4kle ker4kn ker4k3r ker4ku ker4kw ker4n3a ker4no ker3o4 ke3ros ker4sm ker5spe ker4spr ker4sta ker5ste_ ker4sti 4k3erts 4kerva 4kerwt ke2s ke3s4p ke3sta kes5ten ke3sto ke5straa k2et 5ketel ke2t3j ke3to ke2t3r kets5te_ ketting5s 4k3e2tu ket3w 3k2eu keviet5 ke4vl 4k1ex 2k3e2z 2k1f 2k3g 2k1h4 k3ho khoud5s 1ki 2ki2d 4kied kie4sp kie4s4t kie5ste kie4tj kieze4 2ki\xc3\xab kijk5l k3ijs 4kijv 4k1ijz ki3lo kilo5v ki3na 4kinb 4k5indel kinds5te_ 4kindu kin3en 5king kings5l 2k3inh kinie4 k3inko 4k1inr 2k1ins 2k3int 4k3inv ki3o ki2p3l ki5se ki3s4p kit4s kits5te k1j 2k3ja k3jew k3jo 2k3ju 4k5k4 kke5nei kker4s kkers5ten kke3st 1k2l4 5klac k3ladi kla2p1 k4las 5klas_ 5klass k3last k3lat_ k3latt 3k4lav 3k4led 5kledi 5kleed k5leer_ 4k5leg 5klem 4k5len k3ler_ 4klera k3lers k3les 5k4le4u k5lic 4klid k3lig 2k3lij 4klijs k4lim kli4me 3k4lin k5lob 4klod 3klok 5klok_ k5loka k3loke k3lood 5kloof k3lope 5klos klots5te_ 2k5loz 4kluc 4kluih 2k1m k3ma 1k2n4 4knam k4nap 3k4nar 5knec k5nem kni2 5knie_ knip1 4k5niv 3knol k3note 2knum 1ko ko4bl k4oc 2k5oct 4k1oef 5koek koe4ket koers5p koes3 koe3tj koets5te_ koge4 5ko5gr 3k4ok ko5ko kol2e2 kolen3 2kolm 5kolo ko4ly ko2m3a 4komg kom5p k3omsl kom4str 4komz konge4 k4oni k3ontb kon4t3j kon4t3r koo4 2k1oog kooi5tj koot3 koot4j ko3pa 4kopb 4k3opd ko1pe ko5pen_ 4kopg 3ko5pi 5kopj ko2pl 2kops 4kopz 2kord kor5do 2k1org 2k3ork kors5te_ kor4ta kor4t3o4 kor4tr ko3ru 3k4o4s3 4k3os_ kos4j ko5sjere koso4 4koss kot4st kots5te_ 4k1ov 4k3ox 2k3p kpi3s k4plam kpren4 1kr4 3kra k5raad kraads5 kra4b 4k5rad k5rand 2k1rea 2k3rec 4k3rede k4ree4 k5reep kreet3 k3ref k2reg 2k3rel 2k1ric k3rijk k3rijp krij4t krijt5j k4rit k5ritm kroet5j 2krol k4ron kron3t 5kroon krop3a kro4to 2krou k3ro5v 3k4ru k5rub 5kruis kru4l krul5a 2ks k3sal ks3alm ks3an ks3ap ks1ar ks3as ks2e2 k5sec ks3ed ks5ei_ ks3ep k4serv ks3et kse3v ksges5t k4si k5sil ks1in k5sis k5sit ks1j k1sla ks3lab k4slan ks3le ks3li k4smo ks3na ks3no ks3nu kso4 ks3om k5song k2s3pa ks5pand k4spar k1spe k3spi ks3poo k5spor ks3pot ks3pru k3spu ks5s ks4t k1sta k5staan k5staat k1ste ks5tec k4st3ed k3sten ks5tent kste4r kster5a k4sterr ks3th k3sti k3sto ks5ton k5stoo k4stop k5stot ks5trek ks3tri k3stue kst5uit k1sy 4kt k1ta kt3aan k3taar ktaat5 kt3ac kt3art k3te kte2c kt3eco k4tex kt1h k5tij kt3im kt3in k5tit kt3j k1to kt3om kto4p kt4or kt5ord kt5org kt5ori kt3o4v k1tr kt3res k5troll ktro3s k3tu 1ku ku5be kui2f 2kuit ku5k ku5me 3k4u2n 4k5uni 5kuns ku2r ku3ra ku3re kur3s 3ku2s kut3 2k\xc3\xbb 2kv k3ve kven4t3 5k4waal 2k3wac k2wad k1wag 5k2wal 5k2wam 3k4war k5ware 4kwat k3weer 2kweg k1wei 5kwel kwen4st kwens5te_ 4k1wer 5k2wes1 kwes5tr 5kwets k2wie k3wijz k4wik 2kwil 2kwin k3wind 4k1wo ky3 2kz 4l_ 2laan 4laand l3aanh laa5re laar5tj laat5sta l3abon 2lac la4ca 5lach_ la4cha 5lache lach5te lacht4s l4aci la2d5a la4det 2ladj 4ladm la2d3o 4la2dr lad5s la2du 4ladv 3lae3 2laf la2fa la3fl lafo2 4l3afs la2g3a la4gent la2go lag3r lags4 lag5sa la2k3a la4ki la3kr 2lal 3lald lal4o lam4p3j lam4p5l lam4po4 lam4s3p l4an 4la2na lan3ac 3land lan4da land5aa lan4d5oo lan4d3r lands5te_ la4n3ec lanel5 5lange_ lang5l lang5sp lang5sta lan4k3a lan4k3l lank3w 4lann la4nor lan2s lans3l lan4st lan4t3j lap3ac la3pi lap3l lap3o4 la5pre la2p3u la3q lar3da 2larm 4larm_ lar5st las3a4 lase4 la2si las3to 5lastt la3te la4t3he lat5j la4t3ro 4lats4 lat3sl 2lau 5lauf lau4st l2auw la3v lava3 la4vo 5law l4az 4lazi la4zij 2lb4 lber4t lbert5j lboot4 2l1c lce4l5 4ld ldaat5 l2d3ac ldak4 ld3alf l4da4r ld3arc ld3ari ld3art l2dau ld3eco ldeks5 l4d3e4z ldi3a ld5oef ld3oli l2d3om l2d3on ld3oog l4do4p ld3opi ld3ord ld1ov l3dr l5drade ld3ram ld5rang ld3rat ld1re l5dree ld3rij ld3roe ld3rol ld3rom ld3rui ld3sa ld3sl ld3sma ld5sp ld5ste l3du ld3uit ld3uu ld1w le2a le4ane le3at leba4l lecht5st lee4 leeg3 leege4 leeg5i 4leekh lee5l leem3 3leen 4leep leep3o lees5e lees5l lees5po 2leeu 2leff lega5s leg3ec leg3l le4go le5go_ leg5s 3leidi 4leier 4leig lei5tj leit5s le4ko4 4leks lek5str 5leld le2le 5leli l3elp le4n3a4d len3a4k 3lene le4n3e4m len5kw le2no len3op len3sf len3sm 4l3en5th le5o 4lep_ 3le1ra le4r3a4k le5rei le4r3e4v ler5g4 le3r4o le4ron ler4sl ler5spo 4l3erts le2s le4sa le3sc les5et le3s4h les3m le4sp le3spe 4l3essa les3t les4ta les5taa le5s4tel le3str le4s3u le4t4h le3tha let4i le5tin le4top le2t3r le3t4re let4st lets5te_ le2t3u leu3ko leum3a leur4o leus4 leu5ste 5leuz leven4s levink5j 4lexc 4lexp l2fac l3f4ag lfa3s l2fau lfe4n l4f3end lf3ene l2fe2z lf3li l3f4lo lf3lu l4fo l5foe lf3o4l lf1op lf5ord lf5org l5fou l1fra l3fru lfs5ei lf4sl lfs3le lf2s3m lf4so lft4 lf5ta lf5tw lf3uu 2l1g l5gaar l4gap lge4n5a l3gla l3g4oe l3gog l3goo lg3s4 lgse5 4l1h 1li li3ag li3am licht5st 3lid 5lid_ 5lidm lid3s4 lie4g3a lie4gr lie3ka lie4sp lie3s4t lie4to li3eu 3li\xc3\xa8 3lift l4ig li3go lijk3a lij4m3a 4lijmv 5lijn 4lijp 3lij2s lijst5a 4lijt 4l3ijz li5kr lik5sp li4kw li3kwi lim4a li3mi 2limp lim4p3j lin4da 4linf 4l3inh li5ni lin4k3a 3linn l3inna 2linr 2l3ins lin4t3j l3inv 4linz li3ob li5om li5o5s4 li3ot li2pa li3pi li2p3l li5see 2liso l5isw li1t2h lit3r lit4sa lit4sl lit4st lits5te_ lit5sten 2lix 4l1j2 lk3af l4k3ank lk3arm lk3art l3ke l4k3ei l4k3em lken5e lken4s l4k3ep l3ki lking4 lk3laa lk3lag l5klas l4k3lev l5klim l3ko l5koe lk3ont lkooi5 lk3opb l5kor l5kou l5kra l2kre lk3rep lk3res lk3rij l2k3ro lk2s lk4se lk4so lk3son lks3oo lks5taa lk3ste lks5tel lks5tr l4k3uu l3kw lk3wi l3ky 2l1l l5la lla3d lla3g4 lla5tr ll3eig lle3k ll4el lleo4 ller5on lle3s4m lle5th llevie5 l3l4i l3lo llo5f l5lon ll3sh 2lm l3maa lmaat5 lm3a4ca lm3af lma5\xc3\xaf l3mak lm3arc lm3art lma3s2 lm3au l3me l4med lm3edi l4m3ep lme2s lme5te l3mi l3mo l5mog lm3oli lm3or lmro4z lm5sc lm3sh lm3su 2l3n lni4s lo3a 2lobj lo4boo loe4d5a loed3r 4loeg loe4gr loen4st loens5te_ 4loes l3oeu 5loev lo4faa lof5d2 lof4s4 log4 log5l lo3go 5logr log2s3 lo4k3ar lo2k3o2 lo4kr lo2ku 2lo2l lo3la l3oml lom4p3j lom4p3l l3omt l3omv 4lomz 3lon_ 4lond 5long lon4gaa lon4g3o lon4gr lon3o 2lont lon4t3j 3look loo5pi 3loosh loot3e lo3pa 4lopb l3opd lo1pe 2l3oph 2l3opl lop4la 2lopn lo3p2r 4lopt 4l3opv 4l3opw 2lor 3l4or_ lo3re 4l1org lo3ri l4o1r2o3 3l4ors lo3ru lo3spe lost4 los5to lo4s5tr lo5s2u lo2ta lot3a4l lo4tet lo2t3h lot3j lo4tof lot3r lou3s lo3v 2love 3lo5z 4lp l1pa l3paa lp3aan lp3a4g lp3am l3par l3pas l1pe lpe2n l2pex l3pi l5ping lp3ins lp3j l1pl l3p4la l4plam l1po lp3of l3pom lp3on lp3ope l3pos l3pot l1pr lp3ram 4l3r lraads5 lrus5 4ls l4saa ls1a2d ls3a2g l1sam ls3an l3sap ls3as l2sat ls4cor ls4cu ls3eco l4s3e2d l4sef l5sen l4s3e2p lsge4st l3s2hi l3si l4s3im l4sin ls3inj ls3ink ls3int ls4j ls5ja l3s4kel l3s2ki l1sl l3sla l2s4le ls5led ls5lee ls5leg ls5len l2s3li ls4lin l3slo ls4maak ls4med ls4mee l3smid ls3na l3sne l3sno ls3nor l3soc ls3of l3sol ls3op ls3o4r ls1ov l1sp l2spa ls3pac l3span ls3par ls4pe l3spi ls3pli l3spoo l4s5poot l3spor l2spr ls3pra l1st l3sta l4staf l4stak ls5tak_ l3ste l4stek l4stev ls4ti l3sto l5straa ls5trak l5strat l3stu ls5ty l2su l3sur ls3us l3sy 4l1t lt4aa lt1ac l4tam l5tame l5t4an lt4han l4t3hi l2t3ho l3thu lto4l lt3oli l2t3o4v l3tr ltra3s lt3rug lt3sl lt3sp lts5te_ l3tu lu4b1 lub5e lub5l lu1en 3lui_ 5luia 5luid luids3 5luie_ 2luit luk2s luks3t lu3na 3lunc 2l3u2ni lu3sta lu3ta lut3j lut4st luts5te_ lu3wi lven5s lvera4 l1w 1ly ly5i ly3st 4lz lzooi5 4m_ 1ma maas3 maat5st m3act 2m3adv ma5esto m3afl ma3fr 2m3afs 4m3afw m4ag ma3gl ma5go ma3gr ma\xc3\xaf4 ma5ka ma5ke 5ma3k4r ma3kw ma3l4a ma5lac ma4l5ent mal5st 5m4an_ man3ac m3anal man5da man5do mand4s 5m4ann ma5no 5man2s man4se mans5ee man4so mans3p man4s3t mans5ta man4th mant4r ma5pa ma3pr ma3q m4a5ri mariet5 5m4ark mar3sh mar4s5t mar5ti ma1so ma3s4po 5mass ma4ste ma3str ma5ta 5mater mat5j ma4tom ma3tr mat4st mats5te_ ma3v 4mb m5bl mboot4j mbo5st mb4r 2m1c 2m1d m5da mdi3a mdis5 m3do mdo3p m3dr m3dw 1me me1c me5de 5media 5mediu mee5g mee3k4r mee5las mee3lo mee5re mee5ri 5mees meest5al mee5stov mee5str m5eg_ me3g2a mega5s m5egd m5egg m5egt me4i mei2n mei5tj m2el me4l4as mel5as_ mel5dr mel4ko mel4kr 5melo mel3s4m me4mi 3men m4en_ me3na men4as meng5ra men5k me5nor 4menq men4s5uu men4t3j ment3w me5nu me3p2j 2m3e2q me1ra me4r5aak me4r3a4k me4r4am mer5ante me4rap me3rau me4rav mer3ei 5merk mer4kl mer4kn mer4kw mer5oc me5rong me3roo 4m3eros me3rot mer4si mer4sl mers5m mers5ta me2ru4 m4es me3s4h me4s4l mes5li me5slo mes3m me3so me4sp mes3pa me5spe me5spot me5stel mesto4 mest5ov me3stu me5ta5n me3t4h 3meti me5tr mets5te_ meve4 m3e4ven 2mex 3m\xc3\xa9 3m\xc3\xa8 3m\xc3\xaa 2m1f mfa3t mf4l mf3li mf5lie m5fo 2m5g mger4 2m1h 1mi 3mid 4mid_ 5midd mie5kl mie3st 4m3ijs 4m3ijz mi3kn 5mili mi3lo mimie4 m3imp mi5nar 2minf 5ming 4minh 2m5inr 2m3ins mi5nu 4m3inw m2is mis5f mi2s3i mi3s4la mi4st mi5stra mis5tro mi3t4a mi1tr mit4st mits5te_ mit5sten 2m1j 2m3k2 mkaart5j 2m3l 2m1m 2m1n m5na 1mo 5mo_ mo3a 5moda 5mode moed4s 2moef 5moei moers5t moe2s moes3p moes4te mog2 5moge mogen4s mo3gl 4mok 5mole 2moli mo4lie mol4m3a 4molt 3mom 4m3omv mond3r mo5no 5mons mon4so mon5ta 3mooi 2mop mo3pa m1ope m4opp mop4s mo3ra mo3r4e mo3ro mor4sp mor4st mors5te_ 5mos mo5sc mo4s5l mo3sta mo3t2h mot3j mot3ol mot4st mots5te_ 2m3oud 5mouw mou4wi mo3v m3ox 2m1p mp3ach m4p3af m5pan mp3arm mp5arts m4p3ec m5pen m4p3erv mp3ins m3pl mp3lam m5plan mp3leg mp3lei mp3lev mp3lie m4plu mp5olie m5pon mpon4g mp3ope mp2r mp3rec mp3red m5pres m4ps2 mp5sc m5p4se mp3sh mp5su 2m1r 2ms m3sam ms3ana ms3ap ms2c ms3co ms3cu ms2j m3sje m1sl m2sle ms3len ms3lie m3s2m ms3ma m1sn ms3nee mso4 m3sol ms3or m3s2p ms4t m3sta m1ste ms5tec m5stel m5sten m1sti m1sto ms5toc m4s5ton mst5s m3sy 2mt m1ta mte5re mtes4 mte5sta m1th m1to m3tr m1tu 1mu mu5da mue4 5muilde_ 2muit 2muk mul3p mu2m3 mu3no munt3j mu3sa mus5ta 5mut mut3j muts2 muts5te 3muu 5muz 2mv mvari5 mve4 mvee3 mver3e 2m1w 1my my3e 2mz mze4 mzet5 4n_ 1na 3na_ 3naal 5n4aam 4n1aan 2naap n4aar_ 4n3aard 5naars naars5tr naar5tj 5naast 5naat n3abd 5nabe 2nac na2ca nacee5t n2aci 3naco 4n3act na5d4a nad4e 3nade_ 5n4a5den 3nades 3nadi 4n3adm na5dra 2n1adv 5nae n3a\xc3\xab 4n1af na3f4lu n2a3g4 na1h 3nai 3na\xc3\xaf n2ake na3k4l na3kr n3alb 3n4ale 5nalen 4n3alf n3alm 2naly 4nalys 3nam 4namb name5st n4ami n3amp n3a2na n3ank 3nant 5nant_ 5nante n5antenn nan4t3j 2nap nap3ac 3na3p4l na3p4r nap3s nap5st 2n1arb 5nares 2n3arg narie5t 2n1arm 3naro 4nars nar4st nars5te_ nar5sten 4n1art nas2 3na3sa na1s4l na1sp na3sta na3stu n4at_ 3n4ati nat5j 4n3atl na3to nats4 nat3sp 5nau_ 5naus 2na3v 5naven 3navi 3nazif na4zij 2nb nbe5st nbe5t nbots5te_ 2n1c n3ce nces4t n3che ncht2 nch5tr nch3u n5co 4nd n5da_ nd3aan nd5aas nd3abo nd3act nd5adel nd3adr ndags5p nd3alf nd3alm n4d3ana n4dap n2dar nd3art n4das nd3ass nda3st n4dav n4d3a4z n3de n4d3edi n4d1ei nde5laa n4d3emm n5den_ ndera4 nder5aal nder5al nde4r5an n4d5e4rec nder5in_ nder5og nde4ten ndi3a ndie4tj n4dijs nd5ijs_ n4d3ink ndi3o n3d2ji n5do_ n5doc n4d5of nd3oli nd3omd n4don n5dona nd5ond n5dons nd3ont nd3oog nd3ope nd3opp nd3ov nd5rap nd3rat nd1re nd4rek n4dres nd3rot nd3rug nd3s4cu nd4sec nd5set nd3s4i nd3sjo nd4sm nd3sp nd4spo nd4spra nds5taal nd3su nd3uit n2d3u4r nd5ure n4d3uu nd1w n3dy 1ne 3ne_ ne5ac ne3am nebe4s 3neck ne2cl ne4dit ne3do n3edu ne5dw nee4 4need nee5k neel5d neel3o 3neem 4n1een nee5ri nee5se neet3a neet5o neet3r neet5s 4n1eff ne3g2 ne4gel negen5en nege4re 4n1ei 5neien n5eier n2eig 5neigd 5nei5t ne4k3r ne2la 4nelem 4nelf 3nem 4n3emb 5n4eme 4n3e4mig 4n3emm 4n3emp ne2n 3n4en_ 5nenb 5n4end_ nen5do ne4n5enk ne4ni ne5nig nen5k4 nen1o4 5nenp nen5t4a ne5oc ne5ok ne5om neo5p ne5os ne5ot nep3ag ne3pe nepi3s ne1ra nera4d 3n2e5re n3erfe 2nerg ne4r3id ne3ros ner4sl ner4sp ner4st ners5te ner3u ne3ry 3nes ness5a ness5t ne3sta nes3te nes4tei ne5s4tek ne4ter net3on net4si ne2u 4neum ne3ums neu5ste 2nex 3n\xc3\xa9 2n3f 2ng ngaat5j n2g1a2d ng3af ng3ana n4ga4p n2gar nga5sl n3gav nge4ad n4g3een ngels5te_ ng3emb n5gen nge4rap nge4ras n4giger n4gigs ng3ij n4gind ng3ink n4g3ins ng4l ng5lad ng5lam ng5lan ng5led ng5leu ng2li ng5lin ng5lop n3goe ng3of n3go\xc3\xaf n2g1on ng5oor ng5op ng3ore ng3org n3got n3gr ng3rac ng3rad ng3rai n4gras ng5rass ng4red n4g4ri ng5rie ng3rij n5gron ng3rui ng2s ng4se ngs5lop ngs5lu ng4s5ne ngs5tak_ ngs5take ngs5trek ng5stri ng3uit 4n3h nhek5 1ni n4i2d nie5kle ni3eri nie4s3p nie4tr 3nieu ni4g3ee nig3ra nij3f nij3k 2n3ijz ni5kr nik4s niks3p 3nil 3nim_ 5nimf n3imp 2n3in_ n3inb 2n1ind 2ninf ning3r 2n3inh n3inj 2ninr 2n1ins 2n1int 2n3inv ni3o ni4on_ ni4one ni5or ni5o5s4 nip3l 3nis ni4sau ni4sel ni4s3ev ni3sfe ni2s3i ni4sl nis5n ni3sot ni5stel nis5to ni3t2h ni1tr nits4 n1j4 n3je njes4 nje5sp nje5st nje3t 4n1k nk3aan nk5aard nkaart5j nk3af n5k4am n4k3arb nkar5s n4k3asp n3kef nk3eff nk3emp n3ken nken4e nker5ku nk3id nk2j nk3lad nk3lod nk3luc nk3lus n2k3na n3kne n4ko4g nk3oge nkoot5 nk4ra n4krim nk3rol nk5se nk5si nk3sl nk3s4m nk3sn nk4s5o nk1sp nk1st n4kw nk3waa nk3wez nk3wi 2n3l 2n3m4 n3n n5n2e nnee5t nne3ne nnepo4 nne4p5ol nne5te nnet4j nn4i nning5r nnoot5 nno5v 3no_ 1noc 1no3d 2noef noen5s noes3 noet5s n5offi n3o2ge n5ogi 1nogr 3no\xc3\xaf no3kl no3k2w no2li 1nolo 1nom 4n3om_ n2oma n3oml n1oms n3omv 2n3omw 2nomz 3n2on_ 3n4onb 3nonc 4n5ond n4o5ni 4nont 3nood 4n5oof 4n1oog nooi5tj 3noot3 noot4j 3no3pa no4p3as 4n3opb no1pe n1opg n5opleidi no4poo no4por 2nops 2n3opz 2nord no3re 2n1org 1norm 4norr 3nors 3norz 1nos no3sf no3sn no3sp 1not 3nota not5a4p 5noti not3j not3r 3nou_ no3v 3nova no4ve 3nox 3noz 2n1p npers5te_ npi4s5 npoor4 npoort5j n3ps 2n3r nraads5l n5re n5ri 2ns ns3a4d n3sag n1sal ns3alp n1sam ns3an n3sanc n1sap n3s4cal n5scho ns4ci n4sco nsee5t n4sef nse4g ns5ege ns3eis ns5emp n3si ns3idi n2sin n5sing ns3inj ns3ink ns3int n1sjo n1sl n5sla_ n3s4laa ns5laag n5slag ns5lap_ ns5lapp n4sle n5slep ns4let n5sleu n5slib ns3lie n5s4liep n5slim n5slip ns5lot_ ns3m ns5mac n3s4me n3smij n3smol n4smu n1sn n2sna n5sne ns3nod n4snoo n4snot n1so n2s3ob n2sof n3sol n2son ns3ong ns3onz ns4opp ns4or n2s3ou ns1ov n4s3paa ns3pad n1spe n5spee n5spel ns3per n4spet ns4pi ns1po ns3pol n4spot n1spr ns5q ns5s ns4t n1sta nst5aang nst5aans nst3a4g n3stal n3ste ns5tec n4st3ei n4s5teko ns5teks n5sten_ ns5tent n5ster_ ns5tes ns3the n1sti n3stig n4stijv n1sto nst5oef n4ston n3stor nst5rade n5stree ns5trekk ns5troe ns5trog nst5roos ns5ty ns3uil n3sy 2nt n3ta n5taal n4t5aard ntaar5tj n5tab nt3ach nt4act nt1ad nt3aga n4t3art nt4as n5t4at n3te n5tec n4t3ei nte4lo n5tem n5te2n nte5nach ntene5ten nte5rad nte4rof n3t\xc3\xa8 nt3ha n4tho n5thol n5tig nt3inw nt4jo n3to nt4og nt4ol n4t5oli n5ton nt4oo nt5oog n4top nt3opl nt3opm nt3opt n1tr nt3rec nt3rei nt3rel ntre4s nt5ribb nt5rij n5troos nt4rou nt3rus n5try nts3a nt5slu nt1sn nt4sno nt1sp nt4spr nts5pre nt1st nt5ste n3tu n4t3uit ntu4n n5twijf n5t4wis 3nu_ 3nuc 3nue nu3en nu3et 4nuf 2nui 4n3uil nu2lo 3num nu2m3a 5numm nu2n 3nunc n3uni 2nu4r 3n4u5ri nu5ro 1nus nu4s3o nu3tr nut4st 4nuu 5nuut nuw5a nu2w3i 2nv nve5na 2n1w nx3 n3xe nxo4 1ny 4n3yi 4n3yo 2nz nzet5s 3\xc3\xb1 4o_ 4oa o3aa o2ad o3af o1ag o3ah o3ai o1al oa2m o1a2n oa4tiev o3au o3av o3ax 2o3b 4ob_ obal4 obalt3 3obj 1o4bli ob5oor o4b5o4r 4obr 4oca ocaat5 5o2cea o3cha o1che o3chi o3cho o3chr ocke4 4o3co oco3a oco3s4 oc3t4 od5ac oda3g ode4m5ar ode4mo ode5re odes4 odi3a o5dru od5sc od5sei od3s4i od2sl ods5lam od5slan od3sli od5smak od4s3o od3spo od4spr ods4t od5sta od4ste ods5te_ od5stek od5sten od3w o4e oe5an oe3as oe2d3a oeda4d oede4n oe2d3o2 oe4dr oed3re oed3ri oed3ro oe2d3u oed3w oe3e oe5er oe4f1a 1oefe oe2fi oe2fl oef3la oef5le oef3lo oe4f5o4 oe2f3r oege3l oeg5ij oeg1l oe4gou oeii4 oei3n oei5s4 oei5tj oei3tr oe4kaa oek5erk oeke4t oe2k3l oe4k3op oe4k3r oe2ku oek1w oe4lap oe4lar oel5dr oe4l3ei oe3lem oel5f oelo4 oe5loe oelo5p oel3sp oe4m3ac oem3o4 oen3al oe5n4e oen5gr oen3o oen4sn 2oep oep5ind oe4pl oe5plo oe4p3r oe3pra oe4ps oeps3e oe2p3u 4oer oe1ra oe4raa oer5aal oe4r3a4l oer4e oer5ei_ oer5eie oero2 oe3roe oer3og oer5om oer4sl oer4sp oer4sta oers5tak oers5te_ 4oes_ oe3sfe oe3si oe4sli oe4s3o4 oes4ta oes4th oe3sto oe4taa oe2t3h oe5t4i oe2tj oe4t3o4 oe5toe oe4t3ra oet4s3p oet3w 2o\xc3\xab of3ar of3at o4fav of4d1a4 ofd3ei of2d3o of2d3r ofd3w of3l o4fli o4flo 4ofo of3om o3foo of3op o3for of3ox of1r o3f2ra of5se of4sl of5sla ofs3le of2sp of3spe ofs3pl of3spo ofs3pr ofs3tr ofs5tra 4oft of4tu oft3ur oft3uu of3ui og5ac oga4l og3al_ og5de og3di oge4d oge5laa ogel5ei 2ogem o3ger oge4ro oger5on oge4s3t 2og5h 1ogig og1l og5ne og3op og3sp og3sta og4st5ei og3sto og4ston og4str ogs5tro og3ui o3gy 2o1h 3ohm 4oi oi3do oi1e oi3j oi5k o3ing oi3o4 oi3s4 oi5sc ois2p oist2 ois5tj o3\xc3\xaf 2o1j 2ok o3ka_ o3kaa o4k3aas ok3ab ok3ag o3kal ok3ank o4k3a4z ok3ef o2k4l ok5let o4kli ok5lu o2k3n ok3o2l ok3op_ ok3o4pe okos5 o2k3ou o2k3r ok4ra ok1sa ok3s4l ok3sn ok5spri ok1st4 oks5te_ ok5sten ok4s5tr ok5te okter4s oku4 ok3ur ok3uu ok1w ok2wi o1la o3l4ab ol3ac o3lal ol3a2p ol3arm ola3s4m 4old ol3d4o ol3d2w o1le o3le_ ole5g ol1ei ol3eks ol3emm o3len o5ler oleu2 ole3um ol3exa ol2fa olf3l ol3fr olf5sl ol2gl ol2g1o olg5rap ol4gre ol4g3ri ol2g3u o3lia o3lic o5lid o3lik o3lin o5ling ol3int o3lit ol3kaf ol5ke ol2kr olk4s olk2v ollie4 o3lo o5loc olo3k ol4om o4lop ol3op_ ol3opp olo3s4t olo4ve ol4pra 4ols ol5se ol4s5h ol5si ol1sj ol3s4l ol3s4n ol3so ol3sp ol5ster 4o1lu ol3uit olu4r 4oma om2aa om1ac om1af o3man 4ome o4m3ef om3ela omen4s omen5ste_ ome5ren omer5kl ome5sp ome5t om2i o4m3int 4omm 4omo omo5l omo3s om4p5ei 5omro om3sl om4ste_ om3ui 3omz on1ac on4ag o4n3am on4an on3ap ona3th 2onc on4d3ac on5d4as on5der ond5ete on4d3id ond5ijs ond5om_ on2dr ond3re ond3ro ond5sj ond5slo on3d4u on4dur o5ne_ o3neb o2n1e2c on3ei on3erf on3erv one3st 4onet_ on1e3v ong5aan ong5aap ong3ap 4ongen ong5le ong2r ongs4 ong5se ong3sp ong3st on5id o5nig on4k3ap onke5lap on3k2i on4k3lo on3kn on5kw onnes4 onne5st o4n3of ono3l on1on o2n1ov on3sc ons4e on5sei ons2f on3s4m on2s3n ons5op on3sor on1s2p ons4pe on3spl on1st on5sten on5str 4ont_ on4taa 3ont1h on4tid 3ont1s4 ont5sp 3ontv 1ont3w on1ui on3ur o4o2 4oo_ oo3c 4oo4d ood1a ood1e4 oo5de_ ood1o ood1r ood3sl ood3sp 4oof oo3fi oo4g oog1a oog3e oo5gi oog1r oogs4 oog3sh oog3sl ook3a oo3ke ook5l ook3s4 ook5st oo4k5w oo4l ool5a2 oole2 ool3ed ool5f ool5g oo5lig ool3ij ool3k ool1o4 ool1u oom5a4 oo3me oom3i oom1o4 ooms5te_ 4oon oon5a oon5du oon3in5 oon5k4 oon1o oon5ta oo4p1 oopa2 oop5ee oop3o4 oop3r oop4sp oor3a oord5aa oor5dop oor1e4 oor3g4 oor5i oor5k oor5m oor1o oor3sm oor5ste oor5sto 4oort oor4th oo4s oos3a oo5se oos5n oo4t oot1a oot3es oot3h oot5o oot3r oot4sl o1\xc3\xb6 2opa o4p3ac op3ad o4p3af o4p3ak op3am o3pan op3and op3at_ op3att 3opbre 3opdr o3pe_ op3ee op5eet op3ei o1pel o3pen_ 3o4peni o5per_ o4pera op3e4te op3e4v 4opf o1pi o5pic op3i2d opie5t op3ijz op3in_ o5pina o5pis 4op1j op3l op5los 1opn o1po opoe3 op1of o5pog o5poi o5pol op3ond o5poni op3ont op3ord op3o4re op3o4v op1r op3ric o4pru o4ps op5s2c op5se op5si 3ops4l ops4m op3sma op3sn op3so op3sp op3sta op3su 2opt 4opt_ op5tr op3ui o2p3u2n o1ra or3ach or3act or3adm or1af ora4g o4r3alg or3ana o5rate or4daa or4d3as or4denv or4do ord5ond ord3or ord3o4v or3dr or4drad ord3w o1re ore5ad 4orec oree4 ore4no or2gl o1ri o5ria 3ori\xc3\xab o5rig_ o5rigere o4r3ink or3ins ork2a or5k4e or3kl or5kn or3kw or4m3ac or4mas or4m3ei or4n3ac or3ni orno3s4 or3oe o3rol or1on or3ont or1oo or1o2p or3or o3ros or5ov 4orp or4p3ac orp4s5c or3sag or5sc or5se or3sli or3smi or3so or4son or3sp or5s4pa or5spu or4t3ak ort5een or4t5ijl or2to or4tof or4t3oo or4tred ort5sp ort5ste or1u o3ry orzet5 2os o4sac o5sas o3sau 4o3s2c osca4 o4sci o5s4cl os3cu o5sed os4el o5ser os3f os4fe o4sha o3shi os2ho o3si o4sj os5jer_ o4sk os5ko os3l os5li4 o4s3m os4n os5no o3s2o os3pa os3per os1pi os4pir o4spr os4s5m o2s3t os4ta os5taal os5taar osta3c ost3a4g os5tan os5tar o3stas o3stat os5te_ os4tem o5stero\xc3\xaf os4th os4to os5toli os5tou ost3o4v os5tra_ os5traa ost3re ost3ri o3stro os5trum os1tu o3sty o3su o5sy 4o1ta ot3aar ot1ac ot3af o3tag ot3akt ot3app ot3art otas4 o5tat o3te ot3e2d o5tee_ o5tees o5teg ot3ei ote4lan o5ten o5ter oter5sp ote4st ote4t ot3eta o1th o2t1ho ot3hu o4tj otje5sp otli2 o1to ot3off ot3olv o5tom ot3ont ot3opm oto5po ot3opr o5t4or oto3s 2otr o1t4ro ot3ru ot5s4i ot2sl ot3sla ots3li ot3smo ot3sn ot3sp ot4s3pa ot4ste_ ots5tek ot5sten ot4stu o1tu ot3ui o3tul ot5w 4ou_ ou5a ou1c ou4d1a ou4des ou2do ou1e oue2t3 ou3k4 ou4ren ou5ren_ ou5renn ou2r3o2 4ous ou3sa ous5c oust4 ou2ta out3h out1j ou2t3o out1r out5sp out5ste ouw3a ouw5do ouw5ins o2v 2o3va o5ve_ 2o5vee 3o4verg over5sp over5ste o5ves 2ovi ovi5so 4ovl 4o3vo 4ovr ovu3 4ow o1wa o1we o5wen ow3h o1wi ow2n o3wo ow3r o4x oys4 ozet5 \xc3\xb63l \xc3\xb61p \xc3\xb6pe1 \xc3\xb64r \xc3\xb6s4 \xc3\xb6s5t \xc3\xb65su 4p_ 4paan paar5du paar5tj 5paas 3pab p3acc 2pach pacht5s p4aci 5pacu 3pad_ pa4da 4padv pa3e 4p3afd 1pag pag2a pa4gen pa3gh p4a5gi 3pak pa2k3a 4p4ake pa4ki pa4k5l 2p3alb 3pale pal3f pa3li paling5s palle4 palm5ac pal4mo pa4m pa3na pa4n3a4d 5panee 5panel 4pank pan5sp pan4tr 1pap pa4pe4t 5papi pap3l pa3po pa3pr 4par_ 3pa3ra p3arb pard4 par3da 3park par4ka par4k5l 3parl 4parm pa5ro 4parr par5ta 3parti part3j 3partn pa5ru paru5r 1pa4s3 pa5sa pas5c pa5se pa5so pas4th pas5to pas5tr pa5te 1path p3atl 3pa3tr pats5te_ 2paut 5pauz pa4vl 5paz 2pb4 2p1c 2p3d2 pe4al 4peci p3e2co 3pectu 1ped pe3de pe3do p4ee4 3pee_ 3pee\xc3\xab pee5li 4peen 5pees 3peg 1p4eil pei4l3a 4peis pek5ee pe2k3l pe2k3n pek5s p4el pe3l4aa pe4l3ak pel5dr pe3le pe4l3ee pe4l3e4t pe3l4i pe3l4or pel5si pel3so pel3sp 2p3emm pe3na pe4nak pe4nap pe4nau pe4naz p3ency pen5d4r penge5 pen5k 5penn pen3sa pen5sl pen3sm pen5sp pent4 pen5to 2p3epi pep3o pep5s p4er_ pe1ra pera3s4 per4at 3perc pe4r5eg pe5req 1peri peri3s per1o pe3ron pe5ros 3pers per4sm per5sti per4str p2ert 3pes pe3sa 3pet_ pe5ta 5pe5ter 3peti pe4t3ra pets5te petu5 3peuk 5peut 1p\xc3\xa9 3p\xc3\xaa 2p1f 2p1g pge5s 2p1h4 4p3ha 3p4hec p4his 4pho pi3am pi5an pi4at 2pid piek5la 5piep pie4r3o pie4s3p pie4tj pi2g5a pi3gl 3pij_ pij3k pij5ke pij4li 3pijn 5pijp pij4p3a 2pijz pi4k3l pilo5g pi5nam 2pind 3pinda 3p4ing 5ping_ pin4ga pin5gri 4p3inj pink3r pink5s 4pinr 2pins pin4ta pi5o pis5n pis5ta pi3th pit3j pit3r pit4sp 2p1ja pjes5 p3ji p1jo 2p1k pkaart5j p2l2 p3la_ plaat5j 2p3lad pla3di 4p3lamp 4p3lang p4lant p3lap 1p4las 3p4lat pla4t3r 5p4lay p4lec plee5tj p3leid 3p4len p3lep pleu5ro p4lex 2p3lig 4plij p4lom p3lone p5lood plooi5tj p3loon p3luie 2p1m pmans5t 2p1n p3na 3pneum 3po_ poda5 3poei poe2s3 poes5t poets5te_ 3poez 3po\xc3\xab p2ofa 3pogi po5gr po2k3i2 po4kol 1pol po5l4o polo3p pol4s pols5te_ 1pom 2p3oml 3ponds pon4sm pon4st pons5te_ pon5ta 5pony poo3d poo5de 4poog_ 3pool poo5len 4poor_ poor4tj poot3 po4p3a 4popd 2pope pop5h 2p3org 2p3ork po3ro p4ort 5portef por4to por4t5ra po3ru 1pos po1sa po3sf po4taa po4t3as po5te potes5t pot1j pot3r 3poul po3v 4p3p p5pa p5pe ppe4l3o ppe5ni pper5ste ppie5k ppij5p p4ps pr4 p2ra 3pra_ p5raad praat5j p5rad 3prakt 4pram p5rand 3prao 4p3rap p4rat p4rax 4preeku 1prem p3remm 3prent pren4t5j 3pres p3reso 3pret pre4t3j pret3r 4pric 4p3riek 4priet prie4t5j 1prij 3prik 3princ pring5s4 5prins 3p4rio 3p4riu 5priv 5p4rob 3p2roc 1p2rod p3roed 3proef proet5j 3proev 5p4rof 5p2rog 1proj pro3la 3prom p3rood prooi5 pro5pa p4roq 3pros pro5sc pro4s5t pro3t4a 3proto 3pro5v 4proy pru2t prut3o4 2ps p3sab ps3a2g p3sak ps3ar ps3ass 4pse ps3erk p4s3et p3si p4s3i2d p4sin p5sis p1sl ps3le ps2me ps5mi p4s3na ps3neu p4sof p3sol ps3opt pso4r p1sp ps2pl ps3ple p1s4t p3stat p3ste ps5tent ps5tes ps5th ps3tor ps5tron p3stu ps5ty 3psy 5psyc p3sys 4p1t pt3ad pt3alb p3te p2t1h p5ti pt3j p4t3o4v p3tr pt3ric 1p2u 3pub pu3ch pu3e puil3o pul4st 3pun 4pun_ punt3j 3put_ puter5in put1j pu2t3o put3r put4st puts5te_ 2pv pvan4 pvari5 2p1w 1py1 2p5z 1q 5qe qu4 que4s 5quo 4r_ r2aa 2raan 4raand 3raar 5raar_ 4r3aard 5raars raar5tj 2rac ra4ca ra3ce 5racl rad4a 3radb ra5den ra3di 5radia 3radio 4radm 4r3adr 3rad3s 4radv 2rafd r4aff raf5ond ra3fra 3ragez ra5gi ra3g2n ra5go rag4s 3rais raket3 ra3k4l rak5r 4r3a2la ra4l3ee 4r3alf r3a4lim r3alt ra4man r5ameu ra3mi r2amp 4rana ran4dr ran4g3o ran4gr r5angst_ ra4nim 4ranj ran4kl rank3w ran4sa ran4st ran4t3j r3antw ra3o 4rap_ ra3po 4rappa rap5roe ra3q 2r3arb r4a5re 4rarit 2r1arm 4r3arr 2r1art ra5sei ra4sk ra4sl ra1so ra2sp ras3po rast5ri r4ati rat5j ra4tom ra4tra ra5tri rat3sp rat4st rats5te_ ra3t4u 2rau 3raus r1aut 5ravr ra4zij rbe4ti r1c r3ce rces3 r3chi r3co 2r1d r4d3act rd3alk rda2m rd5ama r3dan r2d3ar rd3ei r4d5e4las rden5dr rde5o4 r4derva rde5s4t rdi3a rdi5o rd5l r3do r5doc r4d3ol rd5olie rd3ont rd3oos rdo3pe rdo3v rd3ras rd3res rd5roos rd2ru rd3sa rd3s4c rd3so rd1sp rds4t rd5sta rd5ste rd3su r3du rd2wi rd5wo 3re_ 1reac re4ade 4reak re3amb 4re5at re3co 3recr rec5ta 3reda 3redd rede4s3 4re4diti 3redu re5dw ree4k 2r1een ree3n4e r5eenh ree2p reeps5 ree5r4ad 4reers reer5ste r3eerw ree4s ree5sh r4ef 4refb 2reff 3refl re3fu 1reg 4reg_ 4regd rege5ne rege4s 4regg 3regi re3gl 4regt 4reie 4reil 4reind rei5tj 5reiz re4kap 5rekeni re2k3l re2k5n re4ko re4k3re rek3sp re4ku re1kw rel4di rel4d3o reld3r re4l3ei rel5k re4lu4r 3rem_ re4mai remie5tj re5mo5v 2remp 3r4en_ re2na re4naa ren5aar re5nade re3nal re4n3an ren3a4r r4end 5rendee r5endert re5ne_ re4nel re5nen_ ren5enk ren3e4p re5ner_ ren5erf ren5erv 5renf 2r1eni 5r4enkl r4enn re4noc ren4og ren4opl re3nov 5r4enp 4renq ren4sl r4ento r3entw r5enveer re4of re4op4 re5pa 3repet re4pie 4req re3qua 4r1erf 2r1erg re3r2o rer4s 2r3ert 4r5erv 2rerw re3sa re5se re4sl res5le res3m re2s1p res3t re4tem re3t4h ret4i re4tik re5tin 2retn re4t3o4g re4t3oo rets5te_ re2u reur5es reus4t reu5ste 3revis 3revo 2r3ex r4f3aa rf3act r2f3a4g rf3al r3fas r3fe r4f3eng r1fl r4f3lag rf3lev r2f3li rf3lus r4f3op r1fr r4f3re r5frea rf2s2 rf3sm rf3sp r4f3u4r rf3uu r1g r4g3ab rg3amb r4g3een rg3ei rg4eis rgel5dr r5gen_ rge4ra rge5rap r4g3ins r5glas r3glo r4g3lu rg4o3v r5grij rg3rit r3g4ro rg1s4 rg2sm rg5so rg4s5pr r3h ri5abel ri4ag ri2ak ri5an rias4 ri4av ri4bl 4rice ri3co ridde4 ri3di ri4dol ri4doo rie5dr rie4k5ap rie5kl rie3kw rie4la riel5aa rie4lei rie4ro rie4ta riet3o ri1eu ri3fl ri3fr r4ig ri4gaa ri3gl 5rigste r4ijl 4r5ijl_ r5ijld r5ijlt rij5o rij3pl rij3pr rij3sp rij5ster rij4str 4rijv ri4k5l rik5n ri3k4o ril5m ri3ma rim4pr 4r3inb 4rind ri5ne 4r5inf r4ing 4r5ingan r5ingeni ring5l 4r3inh ri4nit rin4k3l r3inko 4rinkt r3inl 4r3inna 4r1inr 4rins r3inst 4rint 4r1inv ri5on ri3o5s ri4sam ri3sc ri3sot ris5to rit3j rit3ov rit4st rits5te_ rit5sten 3ritt r5j4 rjaars5 r5ka_ rkaart5j rk3adr rk3af r2kah rk3ang r4k3art r2k3ei rke4n rken4s rker4sl r4k3erv rke4s rke5stree rke5strer rk5iep rk3ijv rk3inb r4k3ink rkjes5 rk3lag r4k3lat rk5leid r2klo rk3loo rk3lus r3kn r4kne r2kob rk3olm rk3omg rkoot5 rk3opg rk3ord rk5os_ rk5oss rk2r r5k4ran rk4ri r5kris r5kron rk1s rk3s4f rk5si rks4p rk4t5e4v rkt3h rk4ti rkt3o rkt1r rk3uit r1kwa rk3waa rk5wat rk3wee r1kwi rk3win r3l rlaat5ste rle4g3r rlink4s rlinks5te rlofs5 rlui5t4 r1m rmaf4r r4m3art r2m3eb r2m5eg rme4r3a4 rmes3 rme4t3j rmet5st rm3inh rmi2s r3mo r5moe r4mop rm3opm rmors5te rmos5f rm3s4a rm1st rm3uit rmun4 2r1n r3na r5n4am r4n3ap rn3ars rnee5t r4n3ene rnes3 rne5te rne4t3j r2n5id r2nin r2n1on rn3oor r5noot rn3ops r5not rn3ove rns4 rn3sm rn3sp rn1st rn3sta rn3th rn5tj rn5to r3nu rnu5r ro1a ro5ac r4oc ro1ch ro3d4o 3roe_ 4roef 4roeg roe4g3r 3roem roens4 roen5sm roep3l roe4rei roet4j 4roev 3ro\xc3\xab r5offi r4ofi ro3fl roges5 1ro\xc3\xaf ro3kl 3rokm rok3sp r4ol_ ro2l3a role5st rol3g2 2roli rol3ov ro5ma ro3mo 4romz r2on_ ron3a4d 5r4onal ron4da ron4d3o ron4d3r ron4d5u r2one r2oni r2onk ron4ka r2onn r2o1no r2ons ron4ste rons5te_ 4ron2t ront3j ront3r ro3nu 4ronv 3roof 2roog 4roon 2r1oor root5ste ro3pa ro4paa ro4pan 4ropb ro1pe ro5pee ro4pin ro3p4la 4ropn r4opo rop5rak rop3sh r4opte ro4pu ror5d ro3ro ro3sa ro5se ro3sf ro3sh r4o5si ro3sp ros4s5t ro5stel ros5tra ro5te ro3t2h rot3j ro5ton ro3tr rot4ste rots5te_ r1oud 3rou5t4 ro3v ro4ve ro5veri 4roxi 3roy r1p r3pa rp3aan rp3adv rp3ank r5pee rp3eis rpi3s r2p3j rp4lo rp5lod rpoort5j r4p3o4v r4p3rec rp3ric rp4ro r3psa rp4si rp2sl rp3sli rp5spe rp4s5to 2r5r rre4l3u rren5s4 rre5o rreu2 rri5er_ rrie4t rron5k rrot4j 4rs rs3a2d rs3a2g r3sal rs3alm rs3amb r3san rs3ana rs3ap rs3ar rs3as rs4asse rsa4te r5schi rs2cr r4s3eis rsek5ste rs4et rseve3 r2s3ez rs4fer rs4hal r3s2hi r3s4hoc rs3hot rs3ini rs3int r4sj4 r5sjac r5sjou r5sjt r3s4kat r1sl r4slan r5slec r5slep r5sleu r5slib rs4lie r5sling rs3lob rs5loep r4s3loo r5sluis rs4m r5smaak rs5maal rs5mak r3sme r3smij rs5mis r5smit rs5mu r1sn r2s3na rs3neu r2s3no r1so r5sol rs3ong r2sor rsorkes5 rs1ov r1sp r3spaa rs3pad r4s3par rs4pare r3spe r5spec r5spee r5spek rs4pene r4s3pet r5spit r5spoe r5spog r5spon r5spoo rs3pot r5spraa r4spu r5spul rs3put r1s4t r4s5taak rst5aang rs5tas r5stat r3ste r4s3te_ r5ster_ r5sterk rs5term r5sters r5stes rste5st r4steva r3sti r4stit r3sto rs5toma r4ston rst5ora r3str rs5trap r4st5red rs5trei r5stren rs5trog rst5roz r3sty r3su rs3usa r3sy 4rt r1ta r5ta_ r4t3aan rt5aand rt5aanv r4t1ac rt1ad rt3af_ rt3aff rt3am r5tans r2tar rt3art r4tau r2tav rt5c r5teco rt3eig rt3eil rte4lei rt5emb r5ten_ rte5nach rte3no rte3ro rtes4 rte5sta r2t5e2v r4tha rt1he r3ther rt3hi r1tho rt3hol rt3hu rt3hy rt4ij rtij3k r4t3ini r4t3ink rt5jesc r3to rt3off r5tofo r5tok rt3om_ rt3ond r4t3op r5tori r1tr r3tra rt4rap r4t3ras rt3rec r5treden_ r3t4rek r4t3res rt3ri r4t3rol r2t4ru rt5ruk rt5rus rt4s5eco rt5sei rt2s3l rt3sle rts5li rt4slu rts5m rts5no rt4soo rt1sp rt4s3pr rts5ten r1tu rt3ui4t rt3w rt2wi 5rubr rude3r ru1e 4ruf ru2g ru4gr r5uitr ru2k 4ru3ke ruk3i rul3aa rul3ap ru2li ru4l3ij ru3lin rul5s r2um ru2mi 3run_ r2und runet3 4r5u2ni ru3niv ru4r ru5ra ru5re_ ru5res r2u4s rus3e rus5tr 4rut rut3j rut4st ruts5te_ 4ruu ru3wa rvaat5 rval4st rvals5te_ rvers5te_ rves4 rve3sp rvloot5 r1w rwen4st rwens5te_ r4wh rw2t3j r3x r3yu 4rz rzet5st 4s_ 5sa_ s1aa 1saag 5s2aai saai4s 3s2aal 3s4aat 1sab sa3bo 2s1ac sa2ca 3sacr s1adv 2s1af 3safe 3safo sa3fr s5agg s4a3gi 3sagn sa3go 3sah 3sai 3saj 2sak 3saks s1akt s2al 5sal_ 3sa3la 3sald 5salh s3all 4salm sal5ma s3aln 3s4a3lo 3s2ame 5samm sam5p 4sa2na sa3nat s4anc s2a3ne s4ant san4t3j sa2p 3sap_ sa3pa 2s3ape sa4pr sa5pro sa3ra s1arb 3sard sa2re s1arm saro4 sar3ol s4ars 4s1art sart5se 4sas_ 3sasa sa3sc 3s4ast 1sat 3sa3te 5sati 2s3atl 2s1att s3aud 1saur 3s2aus s1aut 3sauz 1sax 4s3b s5ba s5be s5bo 1sc 2sca 4sce 5scena 5sc\xc3\xa8 3s4ch2 4sch_ sch4a 5schak 5schap 4schau 5sche_ s5chec 4schef 5schen 4scheq 5scher 5schev 5schew s2chi 4schir 5schol 5schoo 5schot sch5ta 2sci 4scl 2sco 3s4cola 3scoo 3scope 5scopi 3s4co5re 3scout 2scr 4scris 2scu 2scy 4s1d s5de s4dh sdi5a sdis5 s3do s5dr s3dw 3se 5se_ se2a se3ak se3al sear4 se3au s4eb 4s3ech se3cr 5sect 4secz s4ee 4s5eed 5seei 4s1een s5eenh see4t see5ts 4seev s1eff se3ge 2s5e2go seg2r 4s3ei_ 4s3eig s4ein 5sein_ 5seine 2seis seis4t sei5tj 5seiz sek4st seks5ten se1kw s2el 5s4el_ sel3ad se4l3a4g se4lak se4las se3le 4s3e4lek sel3el 4se4lem 4self se5ling 4s3elit sel5k 5selm selo4 5selp 5s4els sel3sp 5selt se2l3u s4em se4m3ac s5emm sem3oo s4en 5sen_ se4n3a4g se5nan se4net 5sengr 5senh sen5k se4n3o 4s5enq sen5tw 5s4er_ se1r4a ser5au 5se3r4e se4ree se5ren s4erg 5sergl s5ergo 5sergr ser4i se5rij 4s3ern se3ro se5rop ser2s sers3p ser3st sert5w se3ru s4es se5sc se3sf 2s5esk 5sess se4t se5ta 4s3ete se5ti se3tj set3r se5t4ra set5st 4s5etu set3w se3um se4ven 4s1ex 4sez se2ze 3s\xc3\xa9 3s\xc3\xa8 2s1f 4sfed s5fei 4sfi 4s5fr 4sfu sfu5m 4s5g sgue4 s1h s4ha_ sha4g s5hal_ 3shamp 4she sheid4 sheids5 s5hie 5s4hir sh3l 4shm s3hoe s3hoo 3s4hop s2hot s3hote 3show s5hul 1si 5si_ 5s4ia si5ac si3am si5an 5sic sici4 si3co 3sie_ 3sie\xc3\xab sie5fr sie5kl siep4 sies4 sie5sl sie3so sie3st sie5ta sie5to si5\xc3\xa8 si1f4 5s2ig si5go5 s3ijv 4s1ijz 5sile 4s5imper 3simu 5sina s3inb 4s3inc 4s1ind 2sinf sing4 3sing_ s3inga s5ingeni sin3gl s3in5gr s3inh 4si2ni 4s3inko sin5kr 4s3inm s4inn 4sinr 2s1ins 2sint 4s5inv 4s3inz 3sir 5siro s3irr si4s sis3e4 sis5ee sis3i sis5tr 3sit si5to sito5v si3tr si4tru si5tu 3siu 3siz sj2 4sj_ 3s4ja_ 5sjab 4sj3d s1je 2s3je_ s5jeb 3sjee 3s2jei 1sjer sje4ri s3jes 3sjew 3s4jez 4sj5k4 5sjof 4s3jon sj3s2 sjt4 s5ju 2s1k2 skaart5j s5kad s4kele s5ken 3s2kes sk4i 3s2ki_ 3skied skie3s 3ski\xc3\xab ski5sc s2k3j s3ko s5kre sk5ruim sk3ste 4sku s3k4w s2l4 3s4la_ 5s4laan 5slaap 4s5laar 4slab s4lac 4s3lad 3s4lag 5slagm sla4me s5lamp_ s5lampe 4s5land 3slang 3slap 5slape sla3pl 4s3las 2s3lat 3s4la5v 4slaw 3s4laz s3led 3s4lee_ 5sleep 4s5leer s4leet slee5tj 4s3leg 2s5lei s5leng s3leni slen4st slens5te_ 3slent s4lep 4s5ler s5les sle4t3j 3s4leu s5leug s5leus 5sleut 2s5lev s3li_ 4s3lic 4slid 2slie s5lied s3lief 3s4lier s3lif s5lig 4s3lijf 5slijp 4s5lijs s4li4k sli2m slim5a s5lini 4slinn s4lip 4s3lit slo4b5 2s3loc 3s4loe 3slof 4s3log s3lol s3lood s5loon s5loos 5s4loot3 s3los 3slot slo4tr 4s3lou 4s5loz 4s5luc 1s4lui 4s5lui_ 4sluid 5sluis_ sluis4t slui5ste 5sluit 5sluiz 4slun 2s5lus 4s3ly s1m 4s5maat 3smad 3smak_ 3smal 2s5man s5map s4mart 4s5mat 4s5mec 5smeden 3smeed 5s4meet 4s5mei 4smelo 4s5men 4s5mes3 5smid_ smie2 smies5 s4mij s5min 5smok s3mon 5smuilden s5muile 5smuilt s2n4 s5nam 5s4nap s4nar 3snau 3s4nav 3s4ned 3snee snee5t s5neg 5s4nel 2s5nes 4s5net sneus4 sneu5st s5neuz s3nie 1s4nij s5nim 3s4nip 4s5niv 4snod 3s4noe s3nog 2snoo s4nor_ s3norm sno5v 3snuf s4nui 2snum 3so_ so4bl so1c s3oce 3s4o3d 1soe 2soef 3soep soes3 2s1off 3soft 2so2g 3so3ga s1oge so3gl 3sogy 5soi 3so\xc3\xaf 3sok s2ol 5sol_ so3la so3le so3lis 3so5l4o3 solo5v 5sols s2om 3s4om_ 5somm 2s3oms s3omv 2somz 5s4on_ 3sona so5nar s3onb 2s1ond 2song 3sonn 3so3no s4ons 2s1on4t3 4s3onv s3onw 3soo 4s5oog 4s3ook 4s3oor_ s3oord 4s3oorl 5soort 2s1op 3s4op_ 4s5ope so3phi s2o5po so3pr 3s4opra sop4re s2orb s3ord 2s1or3g 4s5ork sor4o so3ror sor4st 3s2ort sos4 so3sf s4ot s3oud sou2l sou3t 2sov s1ove 3so5z 4sp_ sp4a 5spaak s3paal 5spaan 5spaat 2spad 2spak 5spake s4pan 3spann 4s5pap 5spar_ s4pari 5sparr 2spas5 5spatt s3pau 5s4pea 4spectu 3s4pee speet3 4s3pei s4pek 5spell 4s3pen s5pen_ spe4na s5pep 4sper s4per_ s5peri s4perm 5s4perr 4spes s3pez s3pid 1s4pie spie5tj 4spijn 4spijp s5ping 5s2pio s3pis spi5sto 2s1p4l 4s5pla s4plet s2pli4 5splin 3split s3plo s3plu sp4o s2poe s3poes 4spo\xc3\xab 4spog 4spol 2s3pom s4pon_ s4ponn s2poo s3pop 5s4pore s4pori 4s3pos 5spots 4spou 4sprakt 5spray s5pred 5sprei s4prek 4sprem 4spres 5spreu 5spriet 4s5prij 4sprik 4sprob 4sproc 4s5prod 4sprof 4sprog 5s4pron s4proo 4spros 4s3ps 4spt s2p4u 4spub 5s4pui 4spun s4pur 5spuw s4q 4s5r sraads5l sro5v 4s3s4 ssa1s2 s4sco s4s5cu s5se ssei3s sseo4 s5si s5sl s4spa s5spaa ss5pas s5su s5sy s2t 4st_ 5staaf 5staan_ 4staang 4staanw staart5j s4taat staat5j st3abo 2s4t1ac 3stad 5stads 2staf 5staf_ sta4fo s4tag s4tak 5staki 4stakk st3akt 4s3tali 5stam_ 5stamm 3stamp 3s4tand stan4s s4tap 4stapo s4t3arc 4stari 2stas stasie4 5statio 4stau st3aut s4tav 4stavo 4s5tax 4staz 2stb 2st5c 2std 4stea 5steak 4stec s5tech 5steco 3s4ted 4stedu 3steek 3steen 4steenh s5teer stee5t 5stein 5stekar 5stekk 5steldh ste4lee st5elem 3stell 5stem_ 5stemd 5stemm 4stemo 4stent 4stenu ste5ran 4sterm ster5og st5e4ros 5sterren s5teru 4ste4s 4s4t3ex s4t3e2z 2stf 4stg 4sth s4tha st3hed st5heer st3hek s5them s3ther st1hi s4t1ho s4t1hu s4t3hy 2stia 2stib 4sticu s4t3id 5stiefe s5tiev 4stijd 3s4tijg 5s4tijl st3ijs 3stils s4tim st3imp sti5ni 4stins 4s5tint 4stite 2stiv st3ivo 4s4t1j 2stk 4stl 2stm 2stn 2stob 2stoc 4stoef 3stoel 5stoel_ 5stoele 4stoen 4stoer 4stoes 4stoez 3s4tof st3o4ge 5s4tok s4tol sto5li 4stoma 4stomz s4tong 3s4too 4st3oog stoot5j s4top st3o5pe st5opto 4stora sto4rat 4stord sto5ri 4s5tos s4tov 2stp 1s4tr 4stra_ straat5j 4st4rad 3stra4f 5straf_ s5trag 4strai 4st3rec s5tref 4streg 4s3trei 5strel 3strep st3rif st5rijp s5tris 4s3troe s5troep st4rom 5strook 5stroom 4stroos st5roos_ 4s5trou 4stroz 3stru 4strui_ 5struik 4st1s4 st3sc st5se st3sf st3sk st3sl st3so st5sp st5st 2st5t2 1stu 4stub 4stuc 5s4tud 4stuin stui5tj st5uitk 5stuk 2s4tun st3uni stu4nie 4stus 2stv 2st3w 2s4ty 1styl s5typ 2stz 1su 5su_ 5sua 5su4b1 suba4 sub5e su5bl 5suc 5sud 3sug 2sui 5suik 4s1uit 5suit_ s5uitl 5suits_ 5suk 3sul 5sum 4s1u2n 5sup 5surv su4s sus3e suur5 4s5v svaat5 svari5 sve4r sve5ri 4s1w s5wo s4y 3sy_ 4syc 3syn sy4n3e 1sys5 4s5z 4t_ 3taak_ t4aal t5aando t3aank taan4st t3aanw t3aap taar5sp 4t3aas taat4st taats5ta 3tabe 3tabl 2tac ta2ca 3t4aci 4tad ta4de t3ader 5tado t3adr tad4s3 t3adve 2taf_ 2t3afd 5ta3fe 4taff t3afha t4afr ta3fro 4t1afs 2t3afw 4tafz ta4gaa 5tagee 5ta5g4l tag3r 5taka 5takg 5takken ta3kl 5takn 5takp 5tak3r 5taks t2al ta3laa ta5lact 4talb 5tale_ 5talent ta3li 5talig t5allia talm3a 4talt ta4mak 4tamb t3amba 5tamen tament5j 4tamp t3ampu 5tan_ 4t3a2na ta3nag ta3nat tan4d3r tan4k5r ta3o t4ape 5tapi ta3pl 5tapo ta3q ta3ra 4t3arb 5tari 4t1arm ta2ro4 tar5sp tar5taa t3arti 3tarw 3tas 5tasa 5tasj 5taso ta3s2p ta3sta ta3str ta3sy 4tata 4tatio tat5j 4t3atl 3tatr 3tau 4taut 2t1avo 3tax t3a2z 4t3b tba2l 4t3c t4ch t5cha t5che t5chi t5chu 4t3d2 tdor5st tdo3v 1te 3tea te3akt 5tea4m 3tec 4t3echt 4teco te4dit t3edu tee2 teeds5te_ tee4g 4teek tee4k3l teem1 4tee4n t5eenhe 3teer tee5rin tee4t 4t3eeu t4ef t5eff 3tefl 3teh 4t3eier 4teig tei4lo t4ein t5eind 5teit tei5tj 2t3eiw 5tekene 5tekens 4teker 4tekk 3teko te4k3om 3teks te3kw te4k3wi t4el tel5ant te4lap tel5da 4telec 5teleco t5elect tel5een 5telef 5teleg tel5ei_ tel5eie tel5eit te5lel 5telev 5te5lex tel3f tel5k te4loe te4l3o4g tel5oog te4l3op telo4r tels4 4telse tel3so tel5su te4l3uu t4em 2temb 4temm te4mor tem3ov 5temper 5tempo t4en ten4ach ten3a4g te3nak te5nare te4nau tene2 ten3ed ten3el tene4t 3tenh ten5k4 te5nore 4t5enq ten5scr ten3sn ten3sp tensu4 tens5uu 3tent 5tenta 5tenten_ ten5to t3entw 5tenu t2er teraads5 te4r5aak ter3a4b tera5ca te4rad tera4de te4r5af ter3ag te3ral te4ran ter3ap ter3as 5terec te4rei ter5eik te4rel te4rem te5ren_ te4r5enk te4r5env 4t4erf_ 4terfd ter3fr 4t4erft te4r5in_ 3terj 4terk_ 4terkt ter3k4w 3term 5term_ 5termi ter5oc te3rod te3rof te3rog 5teron te5rons tero5pe tero4r te3ros 5terrei 5terreu 5terror ter4spr ter5ste_ ter5ston 3tes te3s4ap tes3m te3so tes3ta te5stel tes5ten test5op test5ri test3u te3ta te5tr 4t3euv t4ev t5e4van teve4r 5tevl 3tevr 2tex 3tex_ 4t3exe 4texp 1t\xc3\xa9 t\xc3\xa83 4t3f 4t3g2 tgaat5 t5ge tge3la tger4 4th_ 2t1ha t3haa t4haan t4had t3hak t5ham t4hans t3har t3hav 5thea t3heb 5thee_ 4t3hei 4t3hel 3t2hen 5theo 1t2her 5the3ra 4t3here 3thes 3thet t4hin 4thm t1hoe t2hog t3hok t1hoo thoof5di 4t1hou t3houd 5thous 4t3hov 3thr 2thu t1hul 4thum t4hur 3ti 5ti_ 5tia ti5ab ti5ae ti3ap 5tib 5tica 5tice 5tici 5ticu ti3d4 5tie_ tie5d4 5tiefs tie3kn tie4kon ti3enc tien5st 5tiep 5ties tie5s4l tie5ta tie5to tie5tw ti1eu 5tieven ti3fe ti3fr ti2ga tig5aa 4tigm ti4gu4 tig3ur 5tijd tije4 tij5ka tij4kl 5tijn tij5p t3ijs_ tij3st tij3t2 tij5tr tij5tw 4t1ijz ti3ko ti5kr t4il 4tils 5timm 5timo tina4d tin3as 4t3incu 4t1ind 4tinf tin4g3i ting4sa t3inh ti4nit 4t3inj t3inko 4t3inl t3inq 4tinr 4t3ins ti3nu 4t3inv 4tinw ti5om ti3o4p5 t2is ti5sa ti3s4j ti3sl ti3so ti4son ti3s4p ti3sta 5tite ti3th ti1t2r 5tivi ti4vo 1tj2 2t1ja t5jaa t5jee t5jek t3jen t5jet 4tjeu 2tjo t1jou 2tju 4t3k2 tkars3 4t3l t5le_ 5tleb t5les tli4n 4t3m tmen4st tmens5te tmos5 4t3n tna4m3o tne4r tnes4 5to_ toa2 to3ac to3ar to5bl 3toc 1toch 3tod to3da t4oe toe5d4 3toej toe5k 5toe3l4a toe5le 5toelic toemaat5 5toen to5ende toe5pl 3toer 5toeri 5toern 5toe1s4 toe5st toe3tj 3toets 5toets_ 5toetse toets5te_ 3toev 5toez to2f tof5ar tof5d to4fr tof3th 3togn 5togr 3toi to4kan tok3s t2ol to3la 5tolaa to5le 5tolet t3olf 2toli 5tolic to4lie tolk5s 5tolo tolp3r t3oly 4tom_ 5tomaa tomaat5 t3oml to3mo tom4p3j 4t3om5s 5ton_ 4tond 3t2one 5tonee 5to5nen to5ner 3t4ong 5tong_ 3t4oni 5t4onn to3no 5tons ton3sk too4m toom3e 5toon t4op_ top5art top3as to3pen to3pet to3pi 2topm to4po to5pos t4opp to4pu to5pus t3opva 5tor_ to3ra to4r3ag t3ord to5rec 5torens 4t1org t5orga t4ori 3toria to4ri\xc3\xab tor3k tor4m3a toro4 to4r5oli to3rom 5torr 3tors tors5te_ to3r2u 3tos4 to3sa to1sl to1s2p tos5te 5tota to3tr 2t3oud 3tour tou4r3e to3v tove5na to4vens 4toverg to3w4 4t3p4 tpe4t3 tpi3s tr4 3tra_ 4t3raad 5trac\xc3\xa9 5trafo_ 3trag 4tragez 3t4rai 5train 5traka t3rake 3trakt 3trans 5transa 5trap_ 5trau 4t3raz 3t4re_ 4trea 2trec 5tred_ 4treda t5redes 4tredu 3tref 4t5reg 4t3reis 4treiz 4trel t3rese t3resu tre2t3 t4reu t3rib_ 5tribu 5trico trie5ta trig2 2trij 5t4ril tri5ni 5t4rio4 t3risi t3rit_ 5t4riti 5trody t3roed t3roes 5trofy 3trog t4ro\xc3\xaf 5troj 4trol_ 5trola 5trolo 5tromm 5tron_ 5trona t5rond 3trone 5tronn 5trono 5trons tront5j t3rood 5troon t4roos tro5pi t4ros 5trotu 3trou 4t5rout tro5v 5truc_ 5truf 4trug 5trui_ 5truie t3ruim trui5t4 t3ruk t4rum 4ts ts3a2d tsa4g ts1am t3sap ts3as tse4d ts5een t4s3ei ts5eind t4s5ene t4s3eng t4s3erg ts5erge t4s3e2v t2sij t4s3ink ts3int ts2j ts3ja t3sjen 3tsji t1sl ts4laa t3slac t5slag_ ts3lam t2s3le t5slib t5sloe t3s4lu ts2me ts4moe ts3neu ts4no ts5nor ts5not ts3nu ts3ob tso2l ts3oli ts3om ts1on ts4opp ts1o4r ts1ov ts3pad t3span t5spec t4s3pet t3spi t4s3pil t3spoe t3spoo t5s4por ts3pot t4spro ts4pru ts5q ts5s t3sta t4staak t4s5tank ts5tant t4star t4stas t3ste t5sted t5stee ts5teko t5stell t5stels t5stem t5ster_ t4sterr t5sters t5s4tes_ t5steu ts3th t1s4ti t3stij t5stijg t5stil ts5tin ts5t4j t1sto ts5toep ts5tong t4store ts5trad ts5trei t3stri ts5troe ts5ty t4su4 ts3ur ts3us ts3uu t1sy 4t3t t5t4a t5te tte5loe tte5l4op tte2n tten4t5j tte5ri t5tlet tt3oog ttop2 t5t4r t5tum tt3uu 3tua 3tub 3tuch 3tu3e 5tueu tu3\xc3\xa9s 3tuig 5tuin 4tuip 2tuit tuit4j 4tuk tu4k3i tul5pi t4um 5tune 5tunn tu1o 5turb tu3ri 3tu4s3 tut3j tuurs5la tu3wa 4tv tvaat5 t3ve 4t1w 3t4wijf t2win 1ty1 3typ tys4 4tz t3za t3zi t5zw u1a u3ac u3an ua5ne ua3p u5ar_ uar5t ua3sa uat4 2u2b ub3ac ube4li ub5em u5bi u3bo ub5or 4uc u1che ucht5sl uc4ki ucle3 uc4t3a uc4tin u1d uda2 u5da_ ud5am ud3ei ud3ess u4de4z ud3eze udi4o udi5ologe udi3om udoe2 ud3ond ud3oo ud3ov u4d1r uds5lo uds4m uds5ma ud3sme ud3smi ud1st ud4sta uds5tak ud4sti ud1w u3ec ue2co u1ee4 u3ef u3ei u1el u4ene u1er uer3il ue3st u1eu u5eul u3ez u3\xc3\xa8 u4f3an u1fl u1f4r uf2s u5ga ug4da2 ug4der ug2do ug4dr uge4l5o ug3ij ug1l u2go ug3or u2g1r ug5sce ug4sec ugs4p ugs5pa ug1s4t ugs5tra u1h u2i ui5ac ui2d3a ui2d1o uid4s uid3sp uid5spre uid5ste_ uid3u ui3e uien4t ui2fa uif1l uif5r ui2fu 4uig ui4g5aa uig1l ui2g3o ui4g3r ui4gu 4uik ui2k3a ui4k3l ui2ko ui2ku ui2la uil5aa ui4l3em uil5m ui4l3og ui4loo uil3ov 4uim ui2m3a ui3mag ui4n1a uin5g ui2no uin5og uin3or uin4s5lo uin5to ui2p3l ui4p3o4 ui2p3r 4uis ui2s3a uis5c ui4sl ui5slu uis5p ui4st ui4t3a4 uit5aa uit5al ui5tar 1uitg uit1j 3uitl ui2t1o 1uit5r uit3sl uit3sn uit5sp uits5te_ 3uitw 3uitz ui3v 4u3j 2uk u2k3al uk3as ukkers5 u2k3l u3klas u2k3n u2k3o u3koc uko2p uk4o3pl u4k3r uk3s2m uk3spa uk3spl uk4sti uk1w u1la ul3ac ulam4 ula4p ul4d3a uld5erk ul5dop ul4d3u u1le ule5sp ul3fl ul5fo ul3fr ul3in_ u5ling ul3inn ul3k2a ul5ke ul2k3l u1lo ul3o2p u3los ul2pa ulp3ac ul4pi ul2p3l ul2po ul4p3r ul3sa ul3so ul2s3p uls5te_ uls5tel u3lu um3af um3ar 3umda 2ume umee4 umes4 ume3st um3om um3op um3so um3st u2m3ui un3ac un2c unch3r un4dra und4s unds5ta und5ste une4t un3g 1univ un4k3r un4o uno3g un5o2p unst3a un4ste_ unst3o un4st5r unst5ui un4tag unt5een un2tj un4t5o4 unt3s4m un4t3u u3ol u3on u3oo u1or uo3ru u3os uota3 4up u1pa u1pe upe3k upe4ro uper5st u3ph u3pi u1pl u4p3lei u1po u3pol up3om up3op u1pr up4tr u1ra ur3aan ur1ac ur3ada ur3adv u2r3a4r uras3 u4r3a2z urd4o u1r2e ur3ech ur3een uree5s ure5lu urelu5r u4rem ur3emb ure4n u3res ur3ess ure3st ur3eta 4urf ur2fa ur3gi u1ri uri4gl ur3ijz ur3ind ur3int 4urk urken5s ur4kie ur3k4l urk4s5t u1ro ur5opb ur3or uro5s ur5pr ur4serv ur4s3ev ur3s4fe ur2sl urs5laa urs5li ur4s5m ur2sn ur4sp urs5pa ur5spel ur5spor urs5take urs5th ur4sti urs5tik ur3ta ur4tro ur5troe u3ru ur3ui 4urv u1r4y 4usaa us3ad us3a2m us1ap u4sc u5s2cr use5tj u5sie u4sj u4s5l u4sm u2s5n uso2 us3o\xc3\xaf us3os u2s3p us5pi us5pu us4ta us5tag ust3al u2s3te us4t3ei u4sti ust3oo us5tra_ us5tre_ us5tro us5tru ustu4 ust3ur ust3uu u1ta ut3aan utaar5 ut1ac ut3af u3tan uta3s4 ut5c u4t3ees u4tek ut3eks ut3em ut5emm uter5an ut3ex ut2h ut3ho u2tj u1to uto5f ut3oog uto3pe utop4l uto5po utop4r uto5s ut3saa ut3s2c uts5eng uts2m ut1sn ut3sp ut4spa ut4spo ut2st uts5tak ut4ste_ ut5sten ut3str ut5su utt4 u1tu ut5w u4u4 uur3a4 uur3e4 uur5i uur3k uur1o2 uur5ste uur5sti 4uut uut3a uut3r uvel4s uve5na uw1a u3wag uw3ar uw5art u1we uw3ec uwe5d uw3een u2w3ei uwe4nen uwes4 u1wi u2w3ij uw5ijz u4wind u3wing u4wins uw3inz uw1o u3woe uwo4ge uw1r uw3u uxa3 u3ya 4uz uze3t4 uzie2 \xc3\xbbt3s4 1\xc3\xbc \xc3\xbc4b \xc3\xbc1n \xc3\xbc3ri \xc3\xbcs3l 1v2 2v_ vaar4ta vaart5r va3de va3g4 va2ki va4kl va2ko va2l3a val5m va3lo va4loe val5si val4s5p vals5tek valu5 va2n van3ac vand4 vang3a van4gr va3no va4noc va1p va3re va5se va3s4o vast3r va3su va3te va2t3h vat5j va3z v4b 4v3c v4e 3ve_ 5veb vee4l veel5e vee3p4 vees4 ve3g4h vei3s4 vei5tj 3vek 5vel ve4l3a4g vel4d3o ve3le vel3k 5vem vem4a ve4na ve5nare 5vend ven5k ve2n3o 2venr ven4s3e ven4sl vens5lan vens5lo ven4sp vens5taak vens5take vens5tek ven4s3u4 ve2r ver1a ver5aas ve4rad vera4g ve4rand ver5do ve3rec ver3ed ve3reg ve3rei ver5eis ve5ren_ ve5rend ver3e4t ver5ijd ver5ijl ver5ijs ve5ring ver5k4 ver3o ve3rom vero5v ver5p ver5spe ver5sta ver5sto ver5tw ver1u ve3ry ve2s3 ves5ti ve2tj ve2to4 vet3og vet3oo ve3tor ve2t3r vet4roe vet5ste 5ve5z 3vi 4vicepa vid5st vie4r3a vie4s3 vies5n vie4tj vi3eu vijf5 vik4s vil4t3j ving4 vings3 vi3o vi5om vi4s3an vi1so vis5ot vis5p vi4st vis5tr vi1tr v3j vje4 vjet1 3vl v3lar vlei3s4 vlie4s5 vlot5s v3lov 5vo_ 3voe voe4t3a voe4t3r voet5sp 3vog voge4 3voi vo2le vol4g3a vol4gra vo2li vol3ij vol5p von4det vond5u 3voo voo5d vooi5t voorn4 voor5na vo3ra vorm3a vors5te_ vor5sten vos3 3vot vot3j 3vou vous5 3v4r2 vrei5 vrie4s vrij5k4 vrijs4 vrij5ste v3t vues4 vu2l vul5p vuur5s vy3 2w_ waad3 w2aar waar5e waar5ste wa4b3 wa2ba wa5bl w2ad wa3dr w4ag wa2la wa3lan 4wam wan4d5r wan4gr wang5sl wa2n1o wan3s4 3wap w4ar w5arc 5ward war4st wars5te wart3j war4to wa2si wa4s5l wa4s5p was5tr 1wate wat5j wa3tr 3way 2wb w1c 2w1d w4doo wd3oom we2a 2we2c 3wed wede4 we2d3i we4d3r wee4ki wee4k3r wee3lo wee3s4t wee5ste 3weg we4g1a we4gerv weg3l we2g3o we4g5r wei3s wei5tj we4k3r we4le2 4welem we3li we2lo wel3s we2m wem3a we3me we2n wena4 wen3ad we3ne4 we4nem we5nen_ wen5enk we3ni wen4k3a wen3o wen5to wer2f 4werg wer4ka wer4k5l wer4kn wer4k3o wer4k3r werk5ru wer4k3u4 wer4k3w wer4p3a wer4p3l wer4pr wer4s wer5ste we2s3 we3spo wes4t5o 3wet_ we2th we2t3j wet4st we2t3u 2wex wezen4s5 2w1f w1g w1h wie4la wie4t w4ij 3wijd wij4ka wij4s wijs3l wijs3p wijs5ta wi4k 3wil wind3a win4d3r w4ing 2winr win2s winst5aa winst5r wi4t3h wit3j wi2t3o4 wit3r w1j 2w1k 2w1l 4w1m 2wn wn3ac w3ne w3ni w3no w3ob w2oe woes3 woest5a wo4l wol3a wolf4s5 woon5sf woor4d5r wor4g3e w1p wren4st wrens5te_ 2ws ws3a2 w3sc w1sl w2s3le w3som w3sp ws2pl w4spr w5spra w1s4t w4stij 2wt wtes3 wtje5sp w1to w1tr wu2 wva2 w1w xaf4 xa3g xamen5t xan3 xan5t x1c x4e xen4d xe3ro x1f x1h xie4t xi3g xi5o xi3sta xi3sto xi4t3i x3l x1m xo3no x4op xo3s4 x1p xpre2 xpres5 x3r x3so x3sp x1t x2tak xtie2 x3w xy3 y1a ya3s4 ya4s5p y3at yba2l3 yber4t3 y1c ycho3 y3co y1d4 ydi3a y5dr ydro3 y1e yes3 y3\xc3\xa9s y3\xc3\xa8 y1f y1g ygu2 y1h y1i y4in y5is yksge4 y3la yl3al y3le y4l3et y3lo ylo3l ym2f5l ym5pa y3na yn3er y3no yn1t y1o y3on y3os yo3t y1p y3p4h ypo3 ypot4 yp3s yp5si y1r y3r4e y5ri ys3 y1s4a y3s4c y5s4e yse5t y3s4f y3s4h ys4i y3s4o y3s4p ys5pl ys4ta ys5tr y3sy y1t yt3hu yto3 y2tof ytop4 yu5a y3ui y3u2r yvari5 y1w4 1z 4z_ zaar5t za3f2 zags4t za2k3a zak3r zan2d zand5a4 zan3di zan4dr zang3s za3po za3s4 4zb 4zc 4zd z4e zee3k zeel5d zee3r4o zeero5v zeer5s zee3s4 ze5ge zeg4sl zei3sp ze5k zel5dr ze3lem zel2f1 zel4so zen4d3a ze4nin zen5k zen3o4 zen4og ze3non ze4r3a ze3ro zer2s zer4s5e ze4s3 ze5sch zes5e zes5l ze5ste ze2t3a ze2t3h ze4ti ze2t3j ze2t3r zeve2 zeven3 4zf 4zg 2z3h z2i ziek3l zie4k3o ziek3w ziel4s zie5sl 3zif zi2g5a zij5kl zij3po zij5s4 zik2w zi4n3a4 zings3 zin4k3l zin4s zins3t zins5ta zin5str zi3o5 zipi3 zi4t zit3e zit3j zit3u4 4z3k 4z3l 4zm zodi5 zoet3j zoet5ste zo3f2 zoi4 zo5ie zo3la zome4 zo2na zon3sf zon5ta zooi5tj zo1p zor4g3a zor4gl zor4gr zo2t zot3h zo3tr zo3v 4z3p 4z3r 2zs 4z5t zui4d3i zui4dr zus3 2zv z4w zwets5te_ 5zy 2z3z zz3in zz3or z4z5w"; + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/patterns/pl.php b/application/third_party/mpdf/patterns/pl.php new file mode 100644 index 0000000..8cae52a --- /dev/null +++ b/application/third_party/mpdf/patterns/pl.php @@ -0,0 +1,9 @@ +<?php +/* + Adapted from Hyphenator 1.0.2 + http://code.google.com/p/hyphenator/ +*/ + +$patterns="_a1 _a2b1s _a2b2s3t _a2d3 _a1d4a1 _ad4e1 _ad4i1 _ad4o1 _ad4u1 _ad4y1 _ad5a2p1t _ad5i2u1 _ad5op _ad5or _ae2 _ae3ro1 _a1eroa2 _ae1roe2 _aeroi2 _aero1o2 _aerou2 _a2n1t _anty1 _a1ntya2 _antye2 _antyi2 _antyo2 _antyu2 _a2r1c _arcy1 _arcy3b2 _arcy3b1z2 _arcy3k2 _arcy3\xc5\x822 _arcy3m2 _a1rcya2 _arcye2 _arcyi2 _arcyo2 _arcyu2 _a2u1 _au3g2 _au3k2 _au3t2 _auto1 _auto3c4h2 _a1utoa2 _autoe2 _autoi2 _auto1o2 _a1utotra1 _autotra2n2s3 _au1tou2 _b8 _4b3b8 _2b1c8 _2b1\xc4\x878 _2b1d8 _be1 _be2z3 _beza1 _be3z4an _be1ze1 _be3z4ec _bezi1 _be3z4ik _be2z1c _bezc4h2 _bezm2 _bezo2 _bezo2b1j _bezw2 _be4z3z _bezzw2 _2b1f8 _2b1g8 _bh8 _bj8 _2b1k8 _bl8 _b\xc5\x828 _2b1m8 _2b1n8 _2b1\xc5\x848 _2b1p8 _br8 _br4z8 _2b1s8 _2b1\xc5\x9b8 _2b1t8 _bv8 _bw8 _bx8 _2b1z8 _2b1\xc5\xba8 _2b1\xc5\xbc8 _c8 _ca1 _ca\xc5\x82o1 _ca\xc5\x82o3k2 _ca\xc5\x82o3\xc5\x9b2 _2c1b8 _4c3c8 _2c1\xc4\x878 _2c1d8 _2c1f8 _2c1g8 _c4h8 _c2h2r _chr4z8 _ci1 _ci2e1 _cie2n1k _cienko1 _cienko3w2 _ciep\xc5\x82o1 _ciep\xc5\x82o3kr2 _cj8 _2c1k8 _2c1l8 _c\xc5\x828 _2c1m8 _2c1n8 _2c1\xc5\x848 _2c1p8 _cr8 _2c1s8 _2c1\xc5\x9b8 _2c1t8 _cv8 _cw8 _cx8 _c4z8 _cza1 _cza2r1n _czarno1 _czarno3k2 _2c2z1k8 _2c2z1t _czte1 _czte1re1 _cztere2c4h3 _cztere2c2h1s _czte1re1chse1 _czterechse2t3 _cztero1 _cztero3\xc5\x9b2 _czw\xc3\xb31 _czw\xc3\xb32r3 _czw\xc3\xb33r4a1 _czw\xc3\xb33r4\xc4\x851 _czw\xc3\xb33r4e1 _czw\xc3\xb33r4\xc4\x991 _czw\xc3\xb33r4o1 _2c1\xc5\xba8 _2c1\xc5\xbc8 _\xc4\x878 _2\xc4\x871b8 _2\xc4\x871c8 _4\xc4\x873\xc4\x878 _2\xc4\x871d8 _2\xc4\x871f8 _2\xc4\x871g8 _\xc4\x87h8 _\xc4\x87j8 _2\xc4\x871k8 _\xc4\x87l8 _\xc4\x87\xc5\x828 _2\xc4\x871m8 _2\xc4\x871n8 _2\xc4\x871\xc5\x848 _2\xc4\x871p8 _\xc4\x87r8 _2\xc4\x871s8 _2\xc4\x871\xc5\x9b8 _2\xc4\x871t8 _\xc4\x87v8 _\xc4\x87w8 _\xc4\x87wi1 _\xc4\x87wi2e1 _\xc4\x87wie2r2\xc4\x873 _\xc4\x87x8 _2\xc4\x871z8 _2\xc4\x871\xc5\xba8 _2\xc4\x871\xc5\xbc8 _d8 _da1 _dale1 _daleko1 _daleko3w2 _2d1b8 _2d1c8 _2d1\xc4\x878 _4d3d8 _de1 _de2z3 _deza2 _dezabi1 _de3z4a3bil _de3z4a3wu1 _de1ze1 _de3z4el _de3z4er _de3z4y1 _dezo2 _2d1f8 _2d1g8 _dh8 _dj8 _2d1k8 _dl8 _d\xc5\x828 _d\xc5\x82u1 _d\xc5\x82ugo1 _d\xc5\x82ugo3tr2 _d\xc5\x82ugo3w2 _2d1m8 _2d1n8 _2d1\xc5\x848 _do1 _do3b2 _do3c2 _do3\xc4\x872 _do3d2 _do3f2 _do3g2 _do3h2 _do3k2 _do3l2 _do3\xc5\x822 _do3m2 _do3p2 _do3r2 _do3s2 _do3\xc5\x9b2 _do3t2 _do3w2 _do3z2 _do3\xc5\xba2 _do3\xc5\xbc2 _do4k3t _do4l3n _do4\xc5\x823k _do4m3k _do4r3s _do4w3c _do5m4k2n _dobr2 _dobr4z2 _doc4h2 _doc4z2 _dod4z2 _dod4\xc5\xba2 _dod4\xc5\xbc2 _dogr4z2 _do2p1c _dopc4h2 _dopr4z2 _dor4z2 _do2r1\xc5\xbc2 _dosc4h2 _dosm2 _dos4z2 _do2t1k2 _dotr2 _2d1p8 _dr8 _dro1 _dro1go1 _drogo3w2 _dr4z8 _2d1s8 _2d1\xc5\x9b8 _2d1t8 _dv8 _dw8 _dw\xc3\xb31 _dw\xc3\xb32j3 _dw\xc3\xb33j4a1 _dw\xc3\xb33j4\xc4\x851 _dw\xc3\xb33j4e1 _dw\xc3\xb33j4\xc4\x991 _dw\xc3\xb33j4o1 _dx8 _dy1 _dy2s3 _dy2z3 _dy3s4e1 _dy3s4o1 _dy3s4ta1 _dy3s4y1 _dy3s4z _dy3z4e1 _dyzu2 _d4z8 _dzi1 _dzi2e1 _dzi1esi1 _dziesi2\xc4\x991 _dzi1esi1\xc4\x99ci1 _dziesi\xc4\x99ci2o1 _dziesi\xc4\x99cio3\xc5\x9b2 _dzi1ewi1 _dziewi2\xc4\x991 _dziewi\xc4\x992\xc4\x873 _dzi1ewi1\xc4\x99ci1 _dziewi\xc4\x99ci2o1 _dziewi\xc4\x99cio3\xc5\x9b2 _dziewi\xc4\x992\xc4\x871s _dzie1wi\xc4\x99\xc4\x87se1 _dziewi\xc4\x99\xc4\x87se2t3 _d4\xc5\xba8 _d4\xc5\xbc8 _e1 _e2k2s3 _e1me1 _emes4z _e1me1sze1 _e2m3e2s5ze2t _e1se1 _e2s1e2s1ma1 _e2s1ha1 _e2s1t _ego1 _egoa2 _e1goe2 _egoi2 _ego1o2 _egou2 _eks4y1 _e1le1 _ele2k1t _elektro1 _elektroa2 _e1le1ktroe2 _elektroi2 _elektro1o2 _elektrou2 _f8 _fb8 _2f1c8 _f\xc4\x878 _fd8 _4f3f8 _fg8 _fh8 _fj8 _2f1k8 _fl8 _f\xc5\x828 _2f1m8 _2f1n8 _f\xc5\x848 _fp8 _fr8 _fs8 _f\xc5\x9b8 _ft8 _fv8 _fw8 _fx8 _fz8 _f\xc5\xba8 _f\xc5\xbc8 _g8 _2g1b8 _2g1c8 _2g1\xc4\x878 _2g1d8 _ge1 _ge2o3 _2g1f8 _4g3g8 _gh8 _gj8 _2g1k8 _gl8 _g\xc5\x828 _2g1m8 _gn8 _2g1\xc5\x848 _go1 _go2u3 _2g1p8 _gr8 _gru1 _grubo1 _grubo3w2 _gr4z8 _2g1s8 _2g1\xc5\x9b8 _2g1t8 _gv8 _gw8 _gx8 _2g1z8 _2g1\xc5\xba8 _2g1\xc5\xbc8 _h8 _2h1b8 _2h1c8 _2h1\xc4\x878 _2h1d8 _2h1f8 _2h1g8 _4h3h8 _hi1 _hipe1 _hipe2r3 _hipe3r4o1 _hipera2 _hipe1re2 _2h1j8 _2h1k8 _2h1l8 _2h1\xc5\x828 _2h1m8 _2h1n8 _2h1\xc5\x848 _2h1p8 _2h1r8 _2h1s8 _2h1\xc5\x9b8 _2h1t8 _hv8 _2h1w8 _hx8 _2h1z8 _2h1\xc5\xba8 _2h1\xc5\xbc8 _i1 _i2n3 _i2s3l _i1ni1 _i3n4ic _i3n4o1 _i3n4u1 _i4n5o2k _i2n1f _infla1 _in4f3lan _ino3w2 _izo1 _izoa2 _izoe2 _i1zoi2 _izo1o2 _izou2 _j8 _ja1 _jad\xc5\x82o1 _jad\xc5\x82o3w2 _2j1b8 _2j1c8 _2j1\xc4\x878 _2j1d8 _2j1f8 _2j1g8 _2j1h8 _4j3j8 _2j1k8 _2j1l8 _2j1\xc5\x828 _2j1m8 _2j1n8 _2j1\xc5\x848 _2j1p8 _2j1r8 _2j1s8 _2j1\xc5\x9b8 _2j1t8 _jv8 _2j1w8 _jx8 _2j1z8 _2j1\xc5\xba8 _2j1\xc5\xbc8 _k8 _2k1b8 _2k1c8 _2k1\xc4\x878 _2k1d8 _2k1f8 _2k1g8 _kh8 _ki1 _ki2l1k _kilku1 _kilkuse1 _kilkuse2t3 _kilkuseto2 _kj8 _4k3k8 _kl8 _k\xc5\x828 _2k1m8 _2k1n8 _2k1\xc5\x848 _ko1 _ko1\xc5\x82o1 _ko\xc5\x82o3w2 _ko2n1t _kon2t2r3 _kon3tr4a1 _kon3tr4e1 _ko1ntro2 _kon3tr4o3l _kon3tr4o3w _kon3tr4y1 _kon4tr5a2gi1 _kon4tr5a2se1 _kon4tr5a2sy1 _kon4tr5a2ta1 _kon4tr5a2d1m _kon4tr5a2k1c _kon4tr5a2l1t _kon4tr5a2r1g _kontru2 _2k1p8 _kr8 _kro1 _kro2\xc4\x873 _kr\xc3\xb31 _kr\xc3\xb32t1k _kr\xc3\xb3tko1 _kr\xc3\xb3tko3tr2 _kr\xc3\xb3tko3w2 _kr4z8 _2k1s8 _2k1\xc5\x9b8 _2k1t8 _kv8 _kw8 _kx8 _2k1z8 _2k1\xc5\xba8 _2k1\xc5\xbc8 _l8 _2l1b8 _2l1c8 _2l1\xc4\x878 _2l1d8 _2l1f8 _2l1g8 _2l1h8 _2l1j8 _2l1k8 _4l3l8 _2l1\xc5\x828 _2l1m8 _2l1n8 _2l1\xc5\x848 _2l1p8 _2l1r8 _2l1s8 _2l1\xc5\x9b8 _2l1t8 _lu1 _ludo1 _ludo3w2 _lv8 _2l1w8 _lx8 _2l1z8 _2l1\xc5\xba8 _2l1\xc5\xbc8 _\xc5\x828 _2\xc5\x821b8 _2\xc5\x821c8 _2\xc5\x821\xc4\x878 _2\xc5\x821d8 _2\xc5\x821f8 _2\xc5\x821g8 _2\xc5\x821h8 _2\xc5\x821j8 _2\xc5\x821k8 _2\xc5\x821l8 _4\xc5\x823\xc5\x828 _2\xc5\x821m8 _2\xc5\x821n8 _2\xc5\x821\xc5\x848 _2\xc5\x821p8 _2\xc5\x821r8 _2\xc5\x821s8 _2\xc5\x821\xc5\x9b8 _2\xc5\x821t8 _\xc5\x82v8 _2\xc5\x821w8 _\xc5\x82x8 _2\xc5\x821z8 _2\xc5\x821\xc5\xba8 _2\xc5\x821\xc5\xbc8 _m8 _2m1b8 _2m1c8 _2m1\xc4\x878 _2m1d8 _2m1f8 _2m1g8 _2m1h8 _mi1 _mi1li1 _mili2a1 _mili3a2m1p _2m1j8 _2m1k8 _2m1l8 _2m1\xc5\x828 _4m3m8 _2m1n8 _2m1\xc5\x848 _mo1 _mo2\xc5\xbc1n _mo1\xc5\xbcno1 _mo\xc5\xbcno3w2 _2m1p8 _2m1r8 _2m1s8 _2m1\xc5\x9b8 _2m1t8 _mv8 _2m1w8 _mx8 _2m1z8 _2m1\xc5\xba8 _2m1\xc5\xbc8 _n8 _na1 _na2d2 _na2j _na3b2 _na3c2 _na3\xc4\x872 _nad3i2 _na3d4ir _nad3\xc5\x822 _nad\xc5\x82u1 _na3d4\xc5\x82ub _na2d3m2 _nadmu1 _na3d4muc4h _nad3r2 _na3d4r2w _nadre1 _nadre2p1c _na3d4repc4z _na3d4re2p1t _nadr\xc4\x991 _na3d4r\xc4\x99c4z _nadru1 _na3d4ruk _na3d4r4z _nad3w2 _nadwo1 _na3d4wo2r1n _na1da1 _na3daj _na3d\xc4\x851 _na3de1 _na3d\xc4\x991 _na3do1 _na3dy1 _nad4z2 _na3dzi1 _na3d4\xc5\xba2 _na3f2 _na3g2 _na3h2 _na1ja1 _na3ja2z1d _na3j\xc4\x851 _na3je1 _na3j\xc4\x991 _na3k2 _na3l2 _na3\xc5\x822 _na3m2 _na3p2 _na3r2 _na3s2 _na3\xc5\x9b2 _na3t2 _na3u2 _na3w2 _na3z2 _na3\xc5\xba2 _na3\xc5\xbc2 _na4d3o2b2\xc5\x82 _nado1bo1 _nadobo2j1c _na4d3o2bojc4z _na4d3o2bowi1 _nado1bro1 _na4d3o2brot _na4d3o2dr4z _nadoki1 _nadoki2e1 _na4d3o2kien _nado2l1b _na4d3olbr4z _na4d5rz\xc4\x851 _nadrze1 _na4d5rzec4z _na4d5rz\xc4\x991 _na4d5rzy1 _nadzi2e1 _na4d5ziem _na4f3c _na4f3t _na4j3e2f _na4j3e2g _na4j3e2k2s _na4j3e2ko1 _na4j3e2n _na4j3e2r _na4j3e2s _na4j3e2w _na4j3e2m1f _na4j3e2u1 _na4r3c _na4r3d _na4r3k _na4r3r _na4r3t _nabr4z2 _nac4h2 _nac4z2 _na2d3b2 _na2d3c2 _na2d3\xc4\x872 _na4d3d2 _nade3t2 _na1deta1 _nad3e2tat _na2d3f2 _na2d3g2 _nad3h2 _nad3j2 _na2d3k2 _nad3l2 _na2d3n2 _na2d3p2 _na2d3s2 _na2d3\xc5\x9b2 _na2d3t2 _nad3u2 _na2dz1m _nadzmy1 _nad5z2mys _nad5zo1 _nad5z\xc3\xb31 _nadzwy1 _nad5zwyc4z _nad5\xc5\xbc2 _nadc4h2 _nadc4z2 _nadd4\xc5\xba2 _nade3b2 _nade3c2 _nade3\xc4\x872 _nade3d2 _nade3f2 _nade3g2 _nade3h2 _nade3k2 _nade3l2 _nade3\xc5\x822 _nade3m2 _nade3p2 _nade3r2 _nade3s2 _nade3\xc5\x9b2 _nade3w2 _nade3z2 _nade3\xc5\xba2 _nade3\xc5\xbc2 _nade4p3c _nade4p3n _nade4p3t _nadec4h2 _nadec4z2 _naded4z2 _naded4\xc5\xba2 _naded4\xc5\xbc2 _nader4z2 _nade2r1\xc5\xbc2 _nades4z2 _nads4z2 _nad\xc5\x9bro1 _nad\xc5\x9brod4z _nad\xc5\x9brodzi1 _nad\xc5\x9brodzi2e1 _nad\xc5\x9brod5ziem _nadtr2 _nagr4z2 _naj3a2k1t _naj3a2u1 _na2j3b2 _na2j3c2 _na2j3\xc4\x872 _na2j3d2 _na2j3f2 _na2j3g2 _na2j3h2 _naj3i2 _na2j3k2 _na2j3l2 _na2j3\xc5\x822 _na2j3m2 _naj3o2 _naj3o2b2 _naj3o2c2 _naj3o2\xc4\x872 _naj3o2d2 _naj3o2f2 _naj3o2g2 _naj3o2h2 _naj3o2k2 _naj3o2l2 _naj3o2\xc5\x822 _naj3o2m2 _naj3o2p2 _naj3o2r2 _naj3o2s2 _naj3o2\xc5\x9b2 _naj3o2t2 _naj3o2w2 _naj3o2z2 _naj3o2\xc5\xba2 _naj3o2\xc5\xbc2 _na2j3p2 _na2j3r2 _najro1 _naj3ro2z3 _na2j3s2 _na2j3\xc5\x9b2 _na2j3t2 _naj3u2 _na2j3w2 _na2j3z2 _na2j3\xc5\xba2 _na2j3\xc5\xbc2 _najbe1 _najbe2z3 _najbezw2 _najc4h2 _najc4z2 _najdo1 _najdo3b2 _najdo3c2 _najdo3\xc4\x872 _najdo3d2 _najdo3f2 _najdo3g2 _najdo3h2 _najdo3k2 _najdo3l2 _najdo3\xc5\x822 _najdo3m2 _najdo3p2 _najdo3r2 _najdo3s2 _najdo3\xc5\x9b2 _najdo3t2 _najdo3w2 _najdo3z2 _najdo3\xc5\xba2 _najdo3\xc5\xbc2 _najdoc4h2 _najdoc4z2 _najdod4z2 _najdod4\xc5\xba2 _najdod4\xc5\xbc2 _najdor4z2 _najdos4z2 _najdo2t1k2 _najd4z2 _najd4\xc5\xba2 _najd4\xc5\xbc2 _najkr2 _najo2b3c2 _najo2b3\xc4\x872 _najo2b3d2 _najo2b3f2 _najo2b3g2 _najob3h2 _najob3j2 _najo2b3k2 _najob3l2 _najob3\xc5\x822 _najo2b3m2 _najo2b3n2 _najo2b3p2 _najo2b3s2 _najo2b3\xc5\x9b2 _najo2b3t2 _najob3w2 _najo2b3\xc5\xba2 _najo2b3\xc5\xbc2 _najobc4h2 _najobc4z2 _najobd4z2 _najobd4\xc5\xba2 _najobd4\xc5\xbc2 _najobr4z2 _najobs4z2 _najoc4h2 _najoc4z2 _najo2d3c2 _najo2d3\xc4\x872 _najo4d3d2 _najo2d3f2 _najo2d3g2 _najod3h2 _najod3j2 _najo2d3k2 _najod3l2 _najo2d3m2 _najo2d3n2 _najo2d3p2 _najo2d3s2 _najo2d3\xc5\x9b2 _najo2d3t2 _najod3w2 _najod5\xc5\xbc2 _najodc4h2 _najodc4z2 _najodd4z2 _najodd4\xc5\xba2 _najodd4\xc5\xbc2 _najods4z2 _najod4z2 _najod4\xc5\xba2 _najor4z2 _najos4z2 _najro3z4u1 _najr4z2 _najsm2 _najs4z2 _naj2t1k2 _naj2t1r2 _najuc4z2 _najzw2 _nakr2 _napo1 _napo2d2 _napo3b2 _napo3c2 _napo3\xc4\x872 _napo3f2 _napo3g2 _napo3h2 _napo3k2 _napo3l2 _napo3\xc5\x822 _napo3m2 _napo3p2 _napo3r2 _napo3s2 _napo3\xc5\x9b2 _napo3t2 _napo3w2 _napo3z2 _napo3\xc5\xba2 _napo3\xc5\xbc2 _napo4m3p _napoc4h2 _napoc4z2 _napo4d3d _napod4\xc5\xba2 _napod4\xc5\xbc2 _napo2m1k2 _napor4z2 _napos4z2 _napr4z2 _naro1 _naro2z3 _nar4z2 _na2r1\xc5\xbc2 _nasm2 _nas4z2 _na2t1c _natc4h2 _na2t1k2 _naz3m2 _nazw2 _2n1b8 _2n1c8 _2n1\xc4\x878 _2n1d8 _ne1 _ne2o3 _2n1f8 _2n1g8 _2n1h8 _ni1 _ni2e1 _nie3b2 _nie3c2 _nie3\xc4\x872 _nie3d2 _nie3f2 _nie3g2 _nie3h2 _nie3k2 _nie3l2 _nie3\xc5\x822 _nie3m2 _nie3p2 _nie3r2 _nie3s2 _nie3\xc5\x9b2 _nie3t2 _nie3u2 _nie3w2 _nie3z2 _nie3\xc5\xba2 _nie3\xc5\xbc2 _nie4c3c _nie4c3k _nie4d4\xc5\xba3 _nie4m3c _nie4m3k _niec4h2 _niec4z2 _niedo1 _niedo3b2 _niedo3c2 _niedo3\xc4\x872 _niedo3d2 _niedo3f2 _niedo3g2 _niedo3h2 _niedo3k2 _niedo3l2 _niedo3\xc5\x822 _niedo3m2 _niedo3p2 _niedo3r2 _niedo3s2 _niedo3\xc5\x9b2 _niedo3t2 _niedo3w2 _niedo3z2 _niedo3\xc5\xba2 _niedo3\xc5\xbc2 _niedobr4z2 _niedoc4h2 _niedoc4z2 _niedod4z2 _niedod4\xc5\xba2 _niedod4\xc5\xbc2 _niedokr2 _niedo2m1k2 _niedo2p1c _niedopc4h2 _niedor4z2 _niedos4z2 _niedo2t1k2 _nied4z2 _nied4\xc5\xbc2 _nieo2 _nieob2 _nieo2b3c2 _nieo2b3\xc4\x872 _nieo2b3d2 _nieo2b3f2 _nieo2b3g2 _nieob3h2 _nieob3j2 _nieo2b3k2 _nieo2b3m2 _nieo2b3p2 _nieo2b3s2 _nieo2b3\xc5\x9b2 _nieob3w2 _nieo2b3\xc5\xba2 _nieo2b3\xc5\xbc2 _nieobc4h2 _nieobc4z2 _nieobd4z2 _nieobd4\xc5\xba2 _nieobd4\xc5\xbc2 _nieobs4z2 _nieoc2 _nieoc4h2 _nieoc4z2 _nieo\xc4\x872 _nieod2 _nieo2d3c2 _nieo2d3\xc4\x872 _nieo4d3d2 _nieo2d3f2 _nieo2d3g2 _nieod3h2 _nieod3j2 _nieo2d3k2 _nieod3l2 _nieod3\xc5\x822 _nieo2d3n2 _nieo2d3p2 _nieo2d3s2 _nieo2d3\xc5\x9b2 _nieo2d3t2 _nieodw2 _nieod3w1r _nieod5\xc5\xbc2 _nieodc4h2 _nieodc4z2 _nieodd4z2 _nieodd4\xc5\xba2 _nieodd4\xc5\xbc2 _nieods4z2 _nieod4z2 _nieod4\xc5\xba2 _nieof2 _nieog2 _nieoh2 _nieok2 _nieol2 _nieo\xc5\x822 _nieom2 _nieop2 _nieor2 _nieor4z2 _nieos2 _nieos4z2 _nieo\xc5\x9b2 _nieot2 _nieow2 _nieoz2 _nieo\xc5\xba2 _nieo\xc5\xbc2 _niepo1 _niepo2d2 _niepo3b2 _niepo3c2 _niepo3\xc4\x872 _niepod3\xc5\x822 _niepo3d4\xc5\x82u1 _niepo2d3m2 _niepodmu1 _niepo3d4muc4h _niepod3r2 _niepodra1 _niepo3d4rap _niepo3d4ra\xc5\xbc _nie1podre1 _niepodre2p1c _niepo3d4repc4z _niepo3d4re2p1t _niepodr\xc4\x991 _niepo3d4r\xc4\x99c4z _niepod3w2 _niepodwa1 _niepo3d4waj _niepo1dwo1 _niepo3d4woj _niepo3do1 _niepo3du1 _niepo3d4z2 _niepo3d4\xc5\xba2 _niepo3f2 _niepo3g2 _niepo3h2 _niepo3k2 _niepo3l2 _niepo3\xc5\x822 _niepo3m2 _niepo3p2 _niepo3r2 _niepo3s2 _niepo3\xc5\x9b2 _niepo3t2 _niepo3w2 _niepo3z2 _niepo3\xc5\xba2 _niepo3\xc5\xbc2 _niepodoc4h _niepo1do1cho1 _niepo4d3o2choc _niepo4d3o2str4z _niepoc4h2 _niepoc4z2 _niepo2d3b2 _niepo2d3c2 _niepo2d3\xc4\x872 _niepo4d3d2 _niepo2d3f2 _niepo2d3g2 _niepod3h2 _niepod3j2 _niepo2d3k2 _niepod3l2 _niepo2d3n2 _niepo2d3p2 _niepo2d3s2 _niepo2d3\xc5\x9b2 _niepo2d3t2 _niepod5\xc5\xbc _niepodc4h2 _niepodc4z2 _niepodd4\xc5\xba2 _niepodd4\xc5\xbc2 _niepodsm2 _niepods4z2 _niepor4z2 _nieposm2 _niepos4z2 _niepr4z _nie1prze1 _nieprze2d2 _nieprze3b2 _niepr4ze3br4z2 _nieprze3c2 _nieprze3\xc4\x872 _nieprzed3\xc5\x822 _nieprzed\xc5\x82u1 _nieprze3d4\xc5\x82u\xc5\xbc _nieprze2d3m2 _nieprzedmu1 _nieprze3d4muc4h _nieprzed3r2 _nieprzedra1 _nieprzedra1ma1 _nieprze3d4ramat _nieprzedru1 _nieprze3d4ruk _nieprzedry1 _nieprze3d4ryl _niepr4ze3d4r4z2 _nieprzed3u2 _nieprze3d4um _nieprze3dy1 _nieprze3d4z2 _nieprze3d4\xc5\xba2 _nie1prze1e2 _nieprze3e2k2s3 _nieprze3f2 _nieprze3g2 _nieprze3h2 _nieprze3k2 _nieprze3l2 _nieprze3\xc5\x822 _nieprze3m2 _nieprze3n2 _nieprze3p2 _nieprze3r2 _nieprze3s2 _nieprze3\xc5\x9b2 _nieprze3t2 _nieprze3w2 _nieprze3z2 _nieprze3\xc5\xba2 _nieprze3\xc5\xbc2 _nieprzed\xc5\x82u\xc5\xbcy1 _nieprze4d5\xc5\x82u\xc5\xbcyc _nieprze4d5z2a1 _nieprze4d5z1g2 _ni1eprzedzi1 _nieprze4d5zim _nieprze4d5zj _nieprze4d5z1l _nieprze4d5z2w2r _nieprzedzwo1 _nieprze4d5zwoj _nieprze4d5\xc5\xbc2 _nieprzec4h2 _nieprzec4z2 _nieprze2d3c2 _nieprze2d3\xc4\x872 _nieprze4d3d2 _nieprze2d3f2 _nieprze2d3g2 _nieprzed3h2 _ni1eprzed3i2 _nieprzed3j2 _nieprze2d3k2 _nieprzed3l2 _nieprze2d3n2 _nieprze2d3p2 _nieprze2d3s2 _nieprzed3s4z2 _nieprze2d3\xc5\x9b2 _nieprze2d3t2 _nieprzed3w2 _nieprzedc4h2 _nieprzedc4z2 _nieprzedd4z2 _nieprzedd4\xc5\xba2 _nieprzedd4\xc5\xbc2 _niepr4zegr4z2 _nieprzekl2 _nieprzekr2 _nieprze2\xc5\x821k2 _nieprze2p1c _nieprzepc4h2 _niepr4zer4z2 _nieprze2r1\xc5\xbc2 _nieprzesc4h2 _nieprzesm2 _nieprzes4z2 _nieprze2t1k2 _nieprzetr2 _niero1 _niero2z3 _nie1ro3z4e1 _niero3z4u1 _nierozbr4z2 _nieroze3r2 _nierozm2 _niero2z1\xc5\x9b2 _niero2z1t _nieroztr2 _nier4z2 _niesu1 _niesu2b3 _ni1esubi1 _ni2e1su3b4i2e1 _nies4z2 _nie2t1k2 _nietr2 _nieuc4z2 _nieuw2 _niewy1 _niewy3b2 _niewy3c2 _niewy3\xc4\x872 _niewy3d2 _niewy3f2 _niewy3g2 _niewy3h2 _niewy3k2 _niewy3l2 _niewy3\xc5\x822 _niewy3m2 _niewy3p2 _niewy3r2 _niewy3s2 _niewy3\xc5\x9b2 _niewy3t2 _niewy3w2 _niewy3z2 _niewy3\xc5\xba2 _niewy3\xc5\xbc2 _niewybr4z2 _niewyc4h2 _niewyc4z2 _niewyd4z2 _niewyd4\xc5\xba2 _niewyd4\xc5\xbc2 _niewyr4z2 _niewys4z2 _niewy2t1k2 _niewytr2 _niezw2 _2n1j8 _2n1k8 _2n1l8 _2n1\xc5\x828 _2n1m8 _4n3n8 _2n1\xc5\x848 _2n1p8 _2n1r8 _2n1s8 _2n1\xc5\x9b8 _2n1t8 _nv8 _2n1w8 _nx8 _2n1z8 _2n1\xc5\xba8 _2n1\xc5\xbc8 _\xc5\x848 _2\xc5\x841b8 _2\xc5\x841c8 _2\xc5\x841\xc4\x878 _2\xc5\x841d8 _2\xc5\x841f8 _2\xc5\x841g8 _2\xc5\x841h8 _2\xc5\x841j8 _2\xc5\x841k8 _2\xc5\x841l8 _2\xc5\x841\xc5\x828 _2\xc5\x841m8 _2\xc5\x841n8 _2\xc5\x841\xc5\x848 _2\xc5\x841p8 _2\xc5\x841r8 _2\xc5\x841s8 _2\xc5\x841\xc5\x9b8 _2\xc5\x841t8 _\xc5\x84v8 _2\xc5\x841w8 _\xc5\x84x8 _2\xc5\x841z8 _2\xc5\x841\xc5\xba8 _2\xc5\x841\xc5\xbc8 _o1 _o2b2 _o2d2 _ot2 _o2t1c _otc4h _o2t3c2h2\xc5\x82 _ob3l2 _oblu1 _o3b4luzg _ob3\xc5\x822 _o3b4\xc5\x82\xc4\x851 _o3b4\xc5\x82\xc4\x991 _o1b\xc5\x82o1 _o3b4\xc5\x82oc _ob3r _obra1 _o3b4ra\xc4\x87 _o3b4raso1 _o1bro1 _o3b4ron _o3b4ro\xc5\x84 _obry1 _o3b4ryz _o3b4ry\xc5\xba _o3b4r4z2 _o3be1 _o3bi1 _od3i2 _o3d4i2u1 _od3r2 _odra1 _o3d4rap _odr\xc4\x991 _o3d4r\xc4\x99t _o1dro1 _odrobi1 _o3d4robin _odru1 _o3d4rut _od2r1w _o3d4rwi1 _odr4z2 _odrze1 _o3d4rze\xc4\x87 _o3d4rz2w _od5z2 _odzi1 _o3d6zi2a1 _o3d6zi2e1 _o3de1 _o2l1\xc5\x9b _o3l2\xc5\x9bn _o4b5\xc5\x82oc4z _o4b5rz\xc4\x851 _obrze1 _o4b5rzez _obrz\xc4\x991 _o4b5rz\xc4\x99d _obrzu1 _o4b5rzuc _o4b5rzut _obrzy1 _o4b5rzyn _o4d7ziar _o4d7ziem _oa2 _oa3z _o2b3c2 _o2b3\xc4\x872 _o2b3d2 _o2b3f2 _o2b3g2 _ob3h2 _ob3j2 _o2b3k2 _o2b3m2 _o2b3n2 _o1bo1 _ob3o2str4z _o2b3p2 _o2b3s2 _o2b3\xc5\x9b2 _o2b3t2 _obu1 _ob3u2m2 _ob3w2 _o2b3\xc5\xba2 _o2b3\xc5\xbc2 _obc4h2 _obc4z2 _obd4z2 _obd4\xc5\xba2 _obd4\xc5\xbc2 _obe3b2 _obe3c2 _obe3\xc4\x872 _obe3d2 _obe3f2 _obe3g2 _obe3h2 _obe3k2 _obe3l2 _obe3\xc5\x822 _obe3m2 _obe3p2 _obe3r2 _obe3r3t _obe3s2 _obe3\xc5\x9b2 _obe3t2 _obe3w2 _obe3z2 _obe3\xc5\xba2 _obe3\xc5\xbc2 _obe4c3n _obe4z3w _obec4h2 _obec4z2 _obed4z2 _obed4\xc5\xba2 _obed4\xc5\xbc2 _obe2r3m _ober4z2 _obe2r1\xc5\xbc2 _obesc4h2 _obes4z2 _obe2t1k2 _obi3b2 _obs4z2 _oc2 _oc4h2 _oc2h2r _ochr4z2 _oc4z2 _o\xc4\x872 _oda1 _od3a2u1 _o2d3b2 _o2d3c2 _o2d3\xc4\x872 _o4d3d2 _o2d3f2 _o2d3g2 _od3h2 _o1d3i2zo1 _od3j2 _o2d3k2 _od3l2 _o2d3m2 _o2d3n2 _o1do1 _od3o2s _o2d3p2 _o2d3s2 _o2d3\xc5\x9b2 _o2d3t2 _odu1 _od3u2c4z _od3u2m2 _od3w2 _od5\xc5\xbc2 _odbe1 _odbe2z3 _odc4h2 _odc4z2 _odd4z2 _odd4\xc5\xba2 _odd4\xc5\xbc2 _ode3b2 _ode3c2 _ode3\xc4\x872 _ode3d2 _ode3f2 _ode3g2 _ode3h2 _ode3k2 _ode3l2 _ode3\xc5\x822 _ode3m2 _ode3m1k2 _ode3p2 _ode3r2 _ode3s2 _ode3\xc5\x9b2 _ode3t2 _ode3w2 _ode3z2 _ode3\xc5\xba2 _ode3\xc5\xbc2 _odec4h2 _odec4z2 _oded4z2 _oded4\xc5\xba2 _oded4\xc5\xbc2 _ode2p1c _odepc4h2 _oder4z2 _ode2r1\xc5\xbc2 _odes4z2 _ode2t1c _odetc4h2 _ode2t1k2 _odkr4z2 _ods4z2 _od4\xc5\xba2 _of2 _og2 _ogni1 _o1gni2o1 _ognio3tr2 _og\xc3\xb31 _og\xc3\xb32l1n _o1g\xc3\xb3lno1 _og\xc3\xb3lno3k2 _oh2 _ok2 _oka1 _oka3m2 _okr2 _ole1 _o1le2o3 _om2 _op2 _o2p1c _opc4h2 _o2r1t _or2t\xc4\x991 _or4z2 _o2r2\xc5\xbc2 _os2 _osi1 _osi2e1 _osie2m3 _osie2m1s _osie1mse1 _osiemse2t3 _os4z2 _o\xc5\x9b2 _o\xc5\x9bmi1 _o1\xc5\x9bmi2o1 _o\xc5\x9bmio3\xc5\x9b2 _ow2 _oz2 _o\xc5\xba2 _o\xc5\xbc2 _p8 _2p1b8 _2p1c8 _pc4h8 _2p1\xc4\x878 _2p1d8 _pe1 _pe2r3 _pe3c2k _pe3r4e1 _pe3r4i1 _pe3r4o1 _pe3r4u1 _pe3r4y1 _pe4r5i2n _pe1e2 _pe1e1se1 _pee2se2l _pe2\xc5\x821n _pe\xc5\x82no1 _pe\xc5\x82no3kr2 _pe1pe1 _pe1pe1e2 _pepee2r _pepee2s _pe1ze1 _peze2t1p _pe1ze1tpe1 _pe1ze1tpe1e2 _peze2t1pee2r _2p1f8 _2p1g8 _ph8 _pi1 _pi2e1 _pie2r1w _pierwo1 _pierwo3w2 _pi2\xc4\x991 _pi\xc4\x992\xc4\x873 _pi1\xc4\x99ci1 _pi\xc4\x99ci2o1 _pi\xc4\x99cio3\xc5\x9b2 _pi\xc4\x992\xc4\x871s _pi\xc4\x99\xc4\x87se1 _pi\xc4\x99\xc4\x87se2t3 _pi2o1 _pio1no1 _piono3w2 _pj8 _2p1k8 _pl8 _p\xc5\x828 _p\xc5\x82a1 _p\xc5\x82asko1 _p\xc5\x82asko3w2 _2p1m8 _2p1n8 _2p1\xc5\x848 _po1 _po2d2 _po3b2 _po3c2 _po3\xc4\x872 _pod3\xc5\x822 _po3d4\xc5\x82u1 _po2d3m2 _podmu1 _po3d4muc4h _po2d3n2 _podna1 _po3d4naw _pod3r2 _pod2r1w _po3d4r2wi1 _podra1 _po3d4rap _po3d4ra\xc5\xbc _podre1 _podre2p1c _po3d4repc4z _po3d4re2p1t _podr\xc4\x991 _po3d4r\xc4\x99c4z _po3d4r\xc4\x99tw _po1dro1 _po3d4roba1 _po3d4ro1bo1 _po3d4rob\xc3\xb31 _po3d4roby1 _po3d4roc4z _po3d4ro\xc5\xbc _podr\xc3\xb31 _po3d4r\xc3\xb3\xc5\xbc _podru1 _po3d4ruzg _podry1 _po3d4ryg _podr4z _po3d4rze1 _pod3w2 _podwa1 _po3d4waj _po1dwo1 _po3d4woi2 _po3d4woj _po3d4wor4z _podw\xc3\xb31 _po3d4w\xc3\xb32j1n _po3d4w\xc3\xb3r _po3da1 _po3d\xc4\x851 _po3de1 _po3dej _po3d\xc4\x991 _podi1 _po3di2u1 _po3do1 _po3du1 _po3dy1 _po3d4z2 _po3d4\xc5\xba2 _poe2 _po3e2k2s3 _po3f2 _po3g2 _po3h2 _po3k2 _po3l2 _po3\xc5\x822 _po3m2 _po3p2 _po3r2 _po3r1\xc5\xbc _po3s2 _po3\xc5\x9b2 _po3t2 _po3w2 _po3z2 _po3\xc5\xba2 _po3\xc5\xbc2 _poc4z2 _po4c2z3d _po4c2z3t _pode3k2 _po4d3e4k2s3 _podobi1 _podobi2a1 _po4d3o2biad _po1do1bo1 _podobo2j1c _po4d3o2bojc4z _podob\xc3\xb31 _po4d3o2b\xc3\xb3z _podobra1 _po4d3o2braz _podoc4h _po1do1cho1 _po4d3o2choc _po4d3o2d1m _po4d3o2f _po4d3o2g _podoki1 _podoki2e1 _po4d3o2kien _po4d3o2k1n _podokre1 _po4d3o2kres _podokr\xc4\x991 _po4d3o2kr\xc4\x99g _podopi1 _podopi2e1 _po4d3o2piec4z _podory1 _po4d3o2ryw _podosi1 _podosi1ni1 _podosini2a1 _po4d3o2siniak _po4d3o2str4z _podo2b1s _po4d3obs4z _po4d3o4d3d _podo2l1b _po4d3olbr4z _pod\xc3\xb31 _po4d3\xc3\xb3w _po4d3u2c4z _po4d3u2d4z _po4d3u2pa1 _podura1 _po4d3u2ral _po4d3u2sta1 _podus4z _podu2s2z1c _po4d3u2szc4z _po4d5r\xc4\x992cz1n _podza1 _po4d5zakr _po4d5zam _po4d5zast _po2dz1b _po4d5zbi1 _po4d5ze1 _podzi1 _podzi2e1 _podzie1le1 _podzi1eleni1 _po4d5zieleni2\xc4\x851 _po4d5zielenic _po4d5zieleni\xc4\x87 _podzi2e1le1ni2e1 _po4d5zielenien _po4d5zieleni2\xc4\x991 _po4d5zielenil _po4d5zieleni\xc5\x82 _po4d5zielenim _po4d5zieleni2o1 _po4d5zielenis _po4d5ziem _po1dzi2o1 _po4d5ziom _po4d5z2w2r _po4l3s _po4m3p _po4\xc5\x843c _po4r3c _po4r3f _po4r3n _po4r3t _po4s2t3d _po4s2t3f _po4s2t3g _po4st3h _po4st3i2 _po4s2t3k _po4st3l _po4s2t3m _po4s2t3p _po1stro1 _po4st3rom _po4s2t3s _poduszczy1 _po5d4uszczyn _po5r4t\xc4\x991 _pobr2 _pobr4z2 _poc4h2 _poc2h2r _pochr4z2 _pod3a2l1p _po2d3b2 _po2d3c2 _po2d3\xc4\x872 _po4d3d2 _po2d3f2 _po2d3g2 _pod3h2 _pod3i2n _pod3j2 _po2d3k2 _pod3l2 _po2d3p2 _po2d3s2 _po2d3\xc5\x9b2 _pod\xc5\x9br\xc3\xb31 _pod3\xc5\x9br\xc3\xb32d5 _po2d3t2 _pod5\xc5\xbc2 _podc4h2 _podc4z2 _podd4\xc5\xba2 _podd4\xc5\xbc2 _pode3b2 _pode3c2 _pode3\xc4\x872 _pode3d2 _pode3f2 _pode3g2 _pode3h2 _pode3l2 _pode3\xc5\x822 _pode3m2 _pode3p2 _pode3r2 _pode3s2 _pode3\xc5\x9b2 _pode3t2 _pode3t1k2 _pode3w2 _pode3z2 _pode3\xc5\xba2 _pode3\xc5\xbc2 _podec4h2 _podec4z2 _poded4z2 _poded4\xc5\xba2 _poded4\xc5\xbc2 _pode2p1c _podepc4h2 _poder4z2 _pode2r1\xc5\xbc2 _podesc4h2 _podes4z2 _podro2z3 _podsm2 _pods4z2 _pogr4z2 _pokl2 _pokr2 _po2\xc5\x821k2 _pom4p1k _po2m1k2 _pona1 _pona2d2 _pona3b2 _pona3c2 _pona3c4z2 _pona3\xc4\x872 _po1na3do1 _pona3d4\xc5\xba2 _pona3f2 _pona3g2 _pona3h2 _pona3k2 _pona3l2 _pona3\xc5\x822 _pona3m2 _pona3p2 _pona3r2 _pona3s2 _pona3\xc5\x9b2 _pona3t2 _pona3w2 _pona3z2 _pona3\xc5\xba2 _pona3\xc5\xbc2 _pona4f3t _ponabr4z2 _ponac4h2 _pona2d3c2 _ponad3c4h2 _ponad3c4z2 _pona2d3\xc4\x872 _pona4d3d _ponad3d4\xc5\xba2 _pona2d3f2 _pona2d3g2 _ponad3h2 _ponad3j2 _pona2d3k2 _ponad3l2 _pona2d3p2 _pona2d3s2 _pona2d3\xc5\x9b2 _pona2d3t2 _ponad4z2 _ponar4z2 _ponasm2 _ponas4z2 _ponaz3m2 _ponazw2 _poni1 _poni2e1 _ponie3k2 _ponie3w2 _po2p1c _popc4h2 _po1po1 _popo3w2 _popr4z2 _por4t1w _por4t1f _por4t1m _po1ro1 _poro2z3 _poro3z4u1 _por4z2 _posc4h2 _posm2 _pos4z2 _po2t1k2 _potr2 _poz4m2 _poza1 _poza3u2 _pozw2 _p\xc3\xb31 _p\xc3\xb32\xc5\x823 _p\xc3\xb33\xc5\x824\xc4\x851 _p\xc3\xb3\xc5\x82e1 _p\xc3\xb33\xc5\x824ec4z _p\xc3\xb33\xc5\x824\xc4\x991 _p\xc3\xb33\xc5\x824y1 _p\xc3\xb32\xc5\x821k2 _p\xc3\xb3\xc5\x82kr2 _p\xc3\xb32\xc5\x821m2 _p\xc3\xb3\xc5\x82o2 _p\xc3\xb3\xc5\x82ob3r _p\xc3\xb3\xc5\x82o2m2d _p\xc3\xb32\xc5\x821p _p\xc3\xb3\xc5\x82pr4z _p\xc3\xb3\xc5\x82przy1 _p\xc3\xb3\xc5\x82przy3m2k _4p3p8 _pr8 _pra1 _pra3s2 _pra2w1n _pra3w2nu1 _pra3w2z _pra1pra1 _prapra2w1n _prapra3w2nu1 _pre1 _predy1 _predy2s3po1 _pr4z8 _prze1 _prze2d2 _prze3b2 _prze3c2 _prze3\xc4\x872 _przed3\xc5\x822 _przed\xc5\x82u1 _prze3d4\xc5\x82u\xc5\xbc _prze2d3m2 _przedmu1 _prze3d4muc4h _przed3o2 _prze3d4o3br _prze3d4o3st _prze3d4o3zo1 _przed3r2 _przedra1 _przedra1ma1 _prze3d4ramat _przedru1 _prze3d4ruk _przedry1 _prze3d4ryl _pr4ze3d4r4z2 _przed3u2 _prze3d4um _prze3d\xc4\x851 _prze3d\xc4\x991 _prze3dy1 _prze3d4z2 _prze3d4\xc5\xba2 _prze1e2 _prze3e2k2s3 _prze3f2 _prze3g2 _prze3h2 _prze3k2 _prze3l2 _prze3\xc5\x822 _prze3m2 _prze3n2 _prze3p2 _prze3r2 _prze3s2 _prze3\xc5\x9b2 _prze3t2 _prze3u2 _prze3w2 _prze3z2 _prze3\xc5\xba2 _prze3\xc5\xbc2 _przed\xc5\x82u\xc5\xbcy1 _prze4d5\xc5\x82u\xc5\xbcyc _przedosta1 _prze4d5o4stat _prze4d5za1 _prze4d5z1g2 _przedzi1 _prze4d5zim _prze4d5zj _prze4d5z1l _prze4d5z2w2r _przedzwo1 _prze4d5zwoj _prze4d5\xc5\xbc2 _przebr2 _pr4zebr4z2 _przec4h2 _przec2h2r _pr4zechr4z2 _przeci1 _przeci2w3 _przeci1wi1 _prze1ci3w4i2e1 _przeciwa2 _przeci4w3w2 _przec4z2 _przeda1 _przedago1 _przed3a2gon _przed3a2k1c _przed3a2l1p _prze2d3b2 _prze2d3c2 _prze2d3\xc4\x872 _prze4d3d2 _prze1de1 _przed3e2g1z _prze1de1me1 _przed3e2mer _prze2d3f2 _prze2d3g2 _przed3h2 _przed3i2 _przed3j2 _prze2d3k2 _przed3l2 _prze2d3n2 _prze2d3p2 _prze2d3s2 _przedsi1 _przedsi2\xc4\x991 _przed3si\xc4\x993w2 _przed3s4z2 _prze2d3\xc5\x9b2 _prze2d3t2 _przed3w2 _przedc4h2 _przedc4z2 _przedd4z2 _przedd4\xc5\xba2 _przedd4\xc5\xbc2 _pr4zedgr4z2 _przedy2s3ku1 _pr4zegr4z2 _przekl2 _przekr2 _prze2\xc5\x821k2 _prze2m1k2 _prze2p1c _przepc4h2 _pr4zer4z2 _prze2r1\xc5\xbc2 _przesc4h2 _przesm2 _przes4z2 _prze2t1k2 _przetr2 _przetra1 _przetra2n2s3 _przy1 _przy3b2 _przy3c2 _przy3\xc4\x872 _przy3d2 _przy3f2 _przy3g2 _przy3h2 _przy3k2 _przy3l2 _przy3\xc5\x822 _przy3m2 _przy3p2 _przy3r2 _przy3s2 _przy3\xc5\x9b2 _przy3t2 _przy3w2 _przy3z2 _przy3\xc5\xba2 _przy3\xc5\xbc2 _przybr2 _przyc4h2 _przyc4z2 _przyd4z2 _przyd4\xc5\xba2 _przyd4\xc5\xbc2 _pr4zygr4z2 _przy2m1k2 _przyo2 _przyoz2 _przy2p1c _przypc4h2 _pr4zyr4z2 _przy2r1\xc5\xbc2 _przysc4h2 _przys4z2 _przy2t1k2 _2p1s8 _2p1\xc5\x9b8 _2p1t8 _pv8 _pw8 _px8 _2p1z8 _2p1\xc5\xba8 _2p1\xc5\xbc8 _r8 _2r1b8 _2r1c8 _2r1\xc4\x878 _2r1d8 _re1 _retra1 _retra2n2s3 _2r1f8 _2r1g8 _2r1h8 _2r1j8 _2r1k8 _2r1l8 _2r1\xc5\x828 _2r1m8 _2r1n8 _2r1\xc5\x848 _ro1 _ro2z3 _ro3z4a1 _ro3z4e1 _ro3z4e3b2 _ro3z4e3c2 _ro3z4e3\xc4\x872 _ro3z4e3d2 _ro3z4e3f2 _ro3z4e3g2 _ro3z4e3h2 _ro3z4e3k2 _ro3z4e3l2 _ro3z4e3\xc5\x822 _ro3z4e3m2 _ro3z4e3p2 _ro3z4e3r2 _ro3z4e3s2 _ro3z4e3\xc5\x9b2 _ro3z4e3t2 _ro3z4e3w2 _ro3z4e3z2 _ro3z4e3\xc5\xba2 _ro3z4e3\xc5\xbc2 _ro3z4ej _ro3z4u1 _ro4z5a2gi1 _rozani1 _ro4z5a2ni2e1 _ro4z5e2mo1 _ro4z5e4g3z _ro4z5e4n3t _rozbr4z2 _ro2z1d2 _rozec4h2 _rozec4z2 _rozed4z2 _rozed4\xc5\xba2 _rozed4\xc5\xbc2 _roze2p1c _rozepc4h2 _rozer4z2 _roze2r1\xc5\xbc2 _rozesc4h2 _rozes4z2 _rozi2 _rozm2 _ro1zo2 _ro2z1p _ro1zpo1 _rozpo3w2 _ro2z1\xc5\x9b2 _ro2z1t2 _roztr2 _rozw2 _2r1p8 _4r3r8 _2r1s8 _2r1\xc5\x9b8 _2r1t8 _rv8 _2r1w8 _rx8 _r4z8 _2r1\xc5\xba8 _2r1\xc5\xbc8 _s8 _sa1 _samo1 _samo3c4h2 _samo3k2 _samo3p2 _samo3w2 _samo1ro1 _samoro2z3 _2s1b8 _sc8 _sc4h8 _s\xc4\x878 _2s1d8 _2s1f8 _2s1g8 _sh8 _si1 _si2e1 _sie1de1 _siede2m3 _siede2m1s _sie1de1mse1 _siedemse2t3 _sie2d1m _si1edmi1 _siedmi2o1 _siedmio3\xc5\x9b2 _sj8 _sk8 _sk\xc4\x851 _sk\xc4\x85d4\xc5\xbc _sk\xc4\x852d5\xc5\xbce1 _skl8 _skr8 _sl8 _s\xc5\x828 _sm8 _sn8 _s\xc5\x848 _so1 _so1bo1 _sobo3w2 _sp8 _spo1 _spo2d2 _spo3b2 _spo3c2 _spo3\xc4\x872 _spo3d4z2 _spo3f2 _spo3g2 _spo3h2 _spo3k2 _spo3l2 _spo3\xc5\x822 _spo3m2 _spo3p2 _spo3r2 _spo3s2 _spo3\xc5\x9b2 _spo3t2 _spo3w2 _spo3z2 _spo3\xc5\xba2 _spo3\xc5\xbc2 _spo4r3n _spo4r3t _spoc4h2 _spoc4z2 _spo4d3d _spod4\xc5\xba2 _spod4\xc5\xbc2 _spor4z2 _spos4z2 _sp\xc3\xb31 _sp\xc3\xb32\xc5\x823 _sr8 _2s1s8 _s\xc5\x9b8 _st8 _ste1 _ste1re1 _stere2o3 _stereoa2 _ste1re1oe2 _stereoi2 _stereo1o2 _stereou2 _su1 _su2b3 _subi1 _su3b4i2e1 _subo1 _su3b4o2t1n _supe1 _supe2r3 _supera1 _supe3r4at _superi1 _supe3r4i2o1 _supe4r5a2tr _super4z _supe2r5z2b _supe1re2 _supero1 _superodr4z _su1perodrzu1 _supero2d1rzut _sv8 _sw8 _sx8 _s4z8 _sze1 _sze2s3 _sze4\xc5\x9b2\xc4\x873 _sze\xc5\x9b1c _sze1\xc5\x9b2ci1 _sze\xc5\x9bci2o1 _sze\xc5\x9bcio3\xc5\x9b2 _sze\xc5\x9b2\xc4\x871s _sze1\xc5\x9b\xc4\x87se1 _sze\xc5\x9b\xc4\x87se2t3 _2s1\xc5\xba8 _2s1\xc5\xbc8 _\xc5\x9b8 _2\xc5\x9b1b8 _\xc5\x9b1c8 _\xc5\x9b\xc4\x878 _2\xc5\x9b1d8 _2\xc5\x9b1f8 _2\xc5\x9b1g8 _\xc5\x9bh8 _\xc5\x9bj8 _2\xc5\x9b1k8 _\xc5\x9bl8 _\xc5\x9b\xc5\x828 _\xc5\x9bm8 _\xc5\x9bn8 _\xc5\x9b\xc5\x848 _2\xc5\x9b1p8 _\xc5\x9br8 _\xc5\x9br\xc3\xb31 _\xc5\x9br\xc3\xb32d5 _\xc5\x9br\xc3\xb3dr2 _2\xc5\x9b1s8 _2\xc5\x9b1\xc5\x9b8 _2\xc5\x9b1t8 _\xc5\x9bv8 _\xc5\x9bw8 _\xc5\x9bwi1 _\xc5\x9bwi2a1 _\xc5\x9bwiat\xc5\x82o1 _\xc5\x9bwiat\xc5\x82o3w2 _\xc5\x9bx8 _2\xc5\x9b1z8 _2\xc5\x9b1\xc5\xba8 _2\xc5\x9b1\xc5\xbc8 _t8 _ta1 _ta2o3 _tar4z _ta1rza1 _ta2r7zan _2t1b8 _2t1c8 _tc4h8 _2t1\xc4\x878 _2t1d8 _te1 _te2o3 _2t1f8 _2t1g8 _th8 _tj8 _2t1k8 _tl8 _t\xc5\x828 _2t1m8 _2t1n8 _2t1\xc5\x848 _to1 _toa3 _2t1p8 _tr8 _tra1 _tra2n2s3 _tran3s4e1 _transi1 _tran3s4i2e1 _tran3s4y1 _tran3s4z _tran4s5e2u1 _tra1nsa2 _transo2 _tr\xc3\xb31 _tr\xc3\xb32j3 _tr\xc3\xb33j4\xc4\x851 _tr\xc3\xb3je1 _tr\xc3\xb33j4ec4z _tr\xc3\xb33j4\xc4\x991 _tr4z8 _trze1 _trze2c4h3 _trze2c2h1s _trze1chse1 _trzechse2t3 _2t1s8 _2t1\xc5\x9b8 _4t3t8 _tv8 _tw8 _tx8 _ty1 _tysi1 _tysi2\xc4\x851 _tysi\xc4\x852c3 _tysi\xc4\x853c4a1 _tysi\xc4\x853c4e1 _tysi\xc4\x853c4z _tysi\xc4\x854c5z\xc5\x82 _2t1z8 _2t1\xc5\xba8 _2t1\xc5\xbc8 _u1 _u3b2 _u3c2 _u3d2 _u3f2 _u3g2 _u3h2 _u3k2 _u3l2 _u3\xc5\x822 _u3m2 _u3n2 _u3p2 _u3r2 _u3s2 _u3t2 _u3w2 _u3z2 _u3\xc5\xba2 _u3\xc5\xbc2 _u4d3k _u4f3n _ukle1 _u4k3lej _u4l3s _u4l3t _u2m1b _u4m3br _u4n3c _u4n3d _u4p3p _u4p3p2s _u4r3s _u4s2t3n _u4s2t1c _u4s2t1k _u4z3be1 _ube1 _ube2z3 _ubezw2 _ubr2 _uc4h2 _uc4z2 _u\xc4\x872 _ud4z2 _ud4\xc5\xba2 _ud4\xc5\xbc2 _ukr2 _u2m1k2 _u2p1c _upc4h2 _upo1 _upo2d2 _upo3b2 _upo3c2 _upo3\xc4\x872 _upo3da1 _upo3f2 _upo3g2 _upo3h2 _upo3k2 _upo3l2 _upo3\xc5\x822 _upo3m2 _upo3p2 _upo3r2 _upo3s2 _upo3\xc5\x9b2 _upo3t2 _upo3w2 _upo3z2 _upo3\xc5\xba2 _upo3\xc5\xbc2 _upoc4h2 _upoc4z2 _upo4d3d _upod4\xc5\xba2 _upod4\xc5\xbc2 _upor4z2 _upos4z2 _uro1 _uro2z3 _ur4z2 _u2r1\xc5\xbc2 _usc4h2 _us4z2 _u\xc5\x9b2 _u2t1k2 _utr2 _uze1 _uze3w2 _v8 _vb8 _vc8 _v\xc4\x878 _vd8 _vf8 _vg8 _vh8 _vj8 _vk8 _vl8 _v\xc5\x828 _vm8 _vn8 _v\xc5\x848 _vp8 _vr8 _vs8 _v\xc5\x9b8 _vt8 _vv8 _vw8 _vx8 _vz8 _v\xc5\xba8 _v\xc5\xbc8 _w8 _2w1b8 _2w1c8 _2w1\xc4\x878 _2w1d8 _we1 _we3b2 _we3c2 _we3\xc4\x872 _we3d2 _we3f2 _we3g2 _we3h2 _we3k2 _we3l2 _we3\xc5\x822 _we3m2 _we3n2 _we3p2 _we3r2 _we3s2 _we3\xc5\x9b2 _we3t2 _we3w2 _we3z2 _we3\xc5\xbc2 _we4k3t _we4l3w _we4\xc5\x823n _we4n3d _we4n3t _we4r3b _we4r3d _we4r3n _we4r3s _we4r3t _we4s3pr4z _wes2t1c _we4s3tc4h2 _we4z3br _we4z3g\xc5\x82 _wec4h2 _wec4z2 _wed4z2 _wed4\xc5\xba2 _wed4\xc5\xbc2 _we2m1k2 _we2p1c _wepc4h2 _wer4z2 _wes4z2 _we2t1k2 _we2w1n _wewn\xc4\x851 _wewn\xc4\x852tr4z3 _2w1f8 _2w1g8 _wh8 _wi1 _wi2e1 _wielo1 _wielo3d2 _wielo3k2 _wielo3\xc5\x9b2 _wielu1 _wie1luse1 _wieluse2t3 _wi2l1c _wilc4z _wilczo1 _wilczo3m2 _2w1j8 _2w1k8 _2w1l8 _2w1\xc5\x828 _2w1m8 _2w1n8 _wni1 _wni2e1 _wniebo1 _wniebo3w2 _2w1\xc5\x848 _wo1 _wo1do1 _wodo3w2 _2w1p8 _2w1r8 _2w1s8 _wsp\xc3\xb31 _wsp\xc3\xb32\xc5\x823 _wsp\xc3\xb3\xc5\x82i2 _wsp\xc3\xb3\xc5\x82o1 _wsp\xc3\xb3\xc5\x82o2b3w _wsp\xc3\xb3\xc5\x82u2 _wsp\xc3\xb32\xc5\x821w2 _ws4z _wsze1 _wsze2c4h3 _wszecho2 _wszec2h2w2 _2w1\xc5\x9b8 _2w1t8 _wv8 _4w3w8 _wx8 _wy1 _wy3b2 _wy3c2 _wy3\xc4\x872 _wy3d2 _wy3f2 _wy3g2 _wy3h2 _wy3k2 _wy3l2 _wy3\xc5\x822 _wy3m2 _wyo2 _wy3o2d3r _wy3p2 _wy3r2 _wy3s2 _wy3\xc5\x9b2 _wy3t2 _wy3w2 _wy3z2 _wy3\xc5\xba2 _wy3\xc5\xbc2 _wyc4z2 _wy4cz3ha1 _wy2\xc5\xbc1s _wy4\xc5\xbc3s4z _wybr2 _wybr4z2 _wyc4h2 _wydr2 _wyd4z2 _wyd4\xc5\xba2 _wyd4\xc5\xbc2 _wye2 _wye2k2s3 _wygr4z2 _wyi2 _wyi2zo1 _wykl2 _wykr2 _wykr4z2 _wy2m1k2 _wy2p1c _wypc4h2 _wypr4z2 _wyr4z2 _wy2r1\xc5\xbc2 _wysc4h2 _wysm2 _wys4z2 _wy2t1c _wytc4h2 _wy2t1k2 _wytr2 _2w1z8 _2w1\xc5\xba8 _2w1\xc5\xbc8 _x8 _xb8 _xc8 _x\xc4\x878 _xd8 _xf8 _xg8 _xh8 _xj8 _xk8 _xl8 _x\xc5\x828 _xm8 _xn8 _x\xc5\x848 _xp8 _xr8 _xs8 _x\xc5\x9b8 _xt8 _xv8 _xw8 _xx8 _xz8 _x\xc5\xba8 _x\xc5\xbc8 _z8 _za1 _za3b2 _za3c2 _za3\xc4\x872 _za3d2 _za3f2 _za3g2 _za3h2 _za3k2 _za3l2 _za3\xc5\x822 _za3m2 _zao2 _za3o2b3r _za3o2b3s _za3p2 _za3r2 _za3s2 _za3\xc5\x9b2 _za3t2 _za3u2 _za3w2 _za3z2 _za3\xc5\xba2 _za3\xc5\xbc2 _za4k3t _za4l3g _za4l3k _za4l3t _za4m3k _za2r1c _za4r3c4h _za4uto1 _za5m4k2n _zabr2 _zabr4z2 _zac4h2 _zac4z2 _zado1 _zado2\xc5\x9b\xc4\x873 _zado\xc5\x9b\xc4\x87u4 _zadr2 _zady1 _zady2s3po1 _zad4z2 _zad4\xc5\xba2 _zad4\xc5\xbc2 _zagr4z2 _zai2 _zai2n3 _zai2zo1 _zai1ni1 _zain4ic _zakl2 _zakr2 _zakr4z2 _zani1 _zani2e1 _zanie3d2 _zar4z2 _za2r1\xc5\xbc2 _zasc4h2 _zasm2 _zas4z2 _za2t1k2 _zatr2 _zb8 _2z1c8 _2z1\xc4\x878 _2z1d8 _zde1 _zde2z3 _zdeza1 _zde3z4awu1 _zde1ze1 _zde3z4el _zde3z4er _zde3z4y1 _zdy1 _zdysko1 _zdy2s3ko2n1t _zdyskre1 _zdy2s3kred _zdyskwa1 _zdy2s3kwal _ze1 _ze3b2 _ze3c2 _ze3\xc4\x872 _ze3d2 _ze3f2 _ze3g2 _ze3h2 _ze3k2 _ze3l2 _ze3\xc5\x822 _ze3m2 _ze3p2 _ze3r2 _ze3s2 _ze3\xc5\x9b2 _ze3t2 _ze3t1k2 _ze3w2 _ze3z2 _ze3\xc5\xba2 _ze3\xc5\xbc2 _ze4r3k _ze1te1 _ze1te1me1 _ze4t3e2m1e2s _ze1te1se1 _ze4t3e2s1e2l _ze4t3e2m1p _zetha1 _ze4t3hap _zec4h2 _zec4z2 _zed4z2 _zed4\xc5\xba2 _zed4\xc5\xbc2 _zekl2 _ze2p1c _zepc4h2 _zer4z2 _ze2r1\xc5\xbc2 _zesc4h2 _zesm4 _zes4z2 _2z1f8 _zg8 _zh8 _zi1 _zi2m1n _zimno1 _zimno3kr2 _zj8 _2z1k8 _zl8 _z\xc5\x828 _z\xc5\x82o1 _z\xc5\x82o3w2 _zm8 _zma1 _zma2r1t _zmartwy1 _zmartwy2c4h3 _zmartwyc2h2w2 _zn8 _zni1 _zni2e1 _znie3b2 _znie3c2 _znie3\xc4\x872 _znie3d2 _znie3f2 _znie3g2 _znie3h2 _znie3k2 _znie3l2 _znie3\xc5\x822 _znie3m2 _znie3n2 _znie3\xc5\x842 _znie3p2 _znie3r2 _znie3s2 _znie3\xc5\x9b2 _znie3t2 _znie3w2 _znie3z2 _znie3\xc5\xba2 _znie3\xc5\xbc2 _znie4d4\xc5\xba3 _znie4m3c _zniec4h2 _zniec4z2 _znied4z2 _znied4\xc5\xbc2 _znier4z2 _znies4z2 _z\xc5\x848 _zo1 _zo2o3 _2z1p8 _zr8 _zro1 _zro2z3 _zro3z4u1 _2z1s8 _2z1\xc5\x9b8 _2z1t8 _zv8 _zw8 _zx8 _4z3z8 _z\xc5\xba8 _z\xc5\xbc8 _\xc5\xba8 _2\xc5\xba1b8 _2\xc5\xba1c8 _2\xc5\xba1\xc4\x878 _2\xc5\xba1d8 _\xc5\xba2d4\xc5\xba8 _2\xc5\xba1f8 _2\xc5\xba1g8 _\xc5\xbah8 _\xc5\xbaj8 _2\xc5\xba1k8 _2\xc5\xba1l8 _\xc5\xba\xc5\x828 _2\xc5\xba1m8 _2\xc5\xba1n8 _\xc5\xba\xc5\x848 _2\xc5\xba1p8 _\xc5\xbar8 _2\xc5\xba1s8 _2\xc5\xba1\xc5\x9b8 _2\xc5\xba1t8 _\xc5\xbav8 _2\xc5\xba1w8 _\xc5\xbax8 _2\xc5\xba1z8 _4\xc5\xba3\xc5\xba8 _2\xc5\xba1\xc5\xbc8 _\xc5\xbc8 _2\xc5\xbc1b8 _2\xc5\xbc1c8 _2\xc5\xbc1\xc4\x878 _2\xc5\xbc1d8 _2\xc5\xbc1f8 _2\xc5\xbc1g8 _\xc5\xbch8 _2\xc5\xbc1j8 _2\xc5\xbc1k8 _2\xc5\xbc1l8 _2\xc5\xbc1\xc5\x828 _2\xc5\xbc1m8 _2\xc5\xbc1n8 _2\xc5\xbc1\xc5\x848 _2\xc5\xbc1p8 _2\xc5\xbc1r8 _2\xc5\xbc1s8 _2\xc5\xbc1\xc5\x9b8 _2\xc5\xbc1t8 _\xc5\xbcv8 _2\xc5\xbc1w8 _\xc5\xbcx8 _2\xc5\xbc1z8 _2\xc5\xbc1\xc5\xba8 _4\xc5\xbc3\xc5\xbc8 \xc5\x9b1c 1\xc5\x9b2ci1 2b1c 2b1\xc4\x87 2b1d 2b1f 2b1g 2b1k 2b1m 2b1n 2b1\xc5\x84 2b1p 2b1s 2b1\xc5\x9b 2b1t 2b1z 2b1\xc5\xba 2b1\xc5\xbc 2b2\xc5\x821k 2b2r1n 2c1b 2c1\xc4\x87 2c1d 2c1f 2c1g 2c1k 2c1l 2c1m 2c1n 2c1\xc5\x84 2c1p 2c1s 2c1\xc5\x9b 2c1t 2c1\xc5\xba 2c1\xc5\xbc c4h 2c2h1b 2c2h1c 2c2h1\xc4\x87 2c2h1d 2c2h1f 2c2h1g 2c2h1k 2c2h1m 2c2h1n 2c2h1\xc5\x84 2c2h1p 2c2h1s 2c2h1\xc5\x9b 2c2h1t 2c2h1z 2c2h1\xc5\xba 2c2h1\xc5\xbc c4z 2cz1b 2c2z1c 2c2z1\xc4\x87 2c2z1d 2c2z1f 2cz1g 2c2z1k 2cz1l 2cz1m 2cz1n 2cz1\xc5\x84 2c2z1p 2c2z1s 2c2z1\xc5\x9b 2c2z1t 2c4z3z 2cz1\xc5\xba 2cz1\xc5\xbc 2\xc4\x871b 2\xc4\x871c 2\xc4\x871d 2\xc4\x871f 2\xc4\x871g 2\xc4\x871k 2\xc4\x871m 2\xc4\x871n 2\xc4\x871\xc5\x84 2\xc4\x871p 2\xc4\x871s 2\xc4\x871\xc5\x9b 2\xc4\x871t 2\xc4\x871z 2\xc4\x871\xc5\xba 2\xc4\x871\xc5\xbc 2d1b 2d1c 2d1\xc4\x87 2d1f 2d1g 2d1k 2d1m 2d1n 2d1\xc5\x84 2d1p 2d1s 2d1\xc5\x9b 2d1t 2d2\xc5\x821b d2\xc5\x821s 2d\xc5\x82s4z 2d2r1n d4z 2dz1b 2d2z1c 2d2z1\xc4\x87 2d2z1d 2d2z1f 2dz1g 2d2z1k 2dz1l 2dz1m 2dz1n 2dz1\xc5\x84 2d2z1p 2d2z1s 2d2z1\xc5\x9b 2d2z1t 2d4z3z 2dz1\xc5\xba 2dz1\xc5\xbc d4\xc5\xba 2d2\xc5\xba1b 2d2\xc5\xba1c 2d2\xc5\xba1\xc4\x87 2d2\xc5\xba1d 2d2\xc5\xba1f 2d2\xc5\xba1g 2d2\xc5\xba1k 2d2\xc5\xba1m 2d2\xc5\xba1n 2d\xc5\xba1\xc5\x84 2d2\xc5\xba1p 2d2\xc5\xba1s 2d2\xc5\xba1\xc5\x9b 2d2\xc5\xba1t 2d2\xc5\xba1z 2d4\xc5\xba3\xc5\xba 2d2\xc5\xba1\xc5\xbc d4\xc5\xbc 2d2\xc5\xbc1b 2d2\xc5\xbc1c 2d2\xc5\xbc1\xc4\x87 2d2\xc5\xbc1d 2d2\xc5\xbc1f 2d2\xc5\xbc1g 2d2\xc5\xbc1k 2d2\xc5\xbc1m 2d2\xc5\xbc1n 2d2\xc5\xbc1\xc5\x84 2d2\xc5\xbc1p 2d2\xc5\xbc1s 2d2\xc5\xbc1\xc5\x9b 2d2\xc5\xbc1t 2d2\xc5\xbc1z 2d2\xc5\xbc1\xc5\xba 2d4\xc5\xbc3\xc5\xbc 2f1c 2f1k 2f1m 2f1n 2g1b 2g1c 2g1\xc4\x87 2g1d 2g1f 2g1k 2g1m 2g1\xc5\x84 2g1p 2g1s 2g1\xc5\x9b 2g1t 2g1z 2g1\xc5\xba 2g1\xc5\xbc 2g2\xc5\x821b 2h1b 2h1c 2h1\xc4\x87 2h1d 2h1f 2h1g 2h1j 2h1k 2h1l 2h1\xc5\x82 2h1m 2h1n 2h1\xc5\x84 2h1p 2h1r 2h1s 2h1\xc5\x9b 2h1t 2h1w 2h1z 2h1\xc5\xba 2h1\xc5\xbc 2j1b 2j1c 2j1\xc4\x87 2j1d 2j1f 2j1g 2j1h 2j1k 2j1l 2j1\xc5\x82 2j1m 2j1n 2j1\xc5\x84 2j1p 2j1r 2j1s 2j1\xc5\x9b 2j1t 2j1w 2j1z 2j1\xc5\xba 2j1\xc5\xbc 2k1b 2k1c 2k1\xc4\x87 2k1d 2k1f 2k1g 2k1m 2k1n 2k1\xc5\x84 2k1p 2k1s 2k1s4z 2k1\xc5\x9b 2k1t 2k1z 2k1\xc5\xba 2k1\xc5\xbc 2k2\xc5\x821b 2l1b 2l1c 2l1\xc4\x87 2l1d 2l1f 2l1g 2l1h 2l1j 2l1k 2l1\xc5\x82 2l1m 2l1n 2l1\xc5\x84 2l1p 2l1r 2l1s 2l1\xc5\x9b 2l1t 2l1w 2l1z 2l1\xc5\xba 2l1\xc5\xbc 2\xc5\x821b 2\xc5\x821c 2\xc5\x821\xc4\x87 2\xc5\x821d 2\xc5\x821f 2\xc5\x821g 2\xc5\x821h 2\xc5\x821j 2\xc5\x821k 2\xc5\x821l 2\xc5\x821m 2\xc5\x821n 2\xc5\x821\xc5\x84 2\xc5\x821p 2\xc5\x821r 2\xc5\x821s 2\xc5\x821\xc5\x9b 2\xc5\x821t 2\xc5\x821w 2\xc5\x821z 2\xc5\x821\xc5\xba 2\xc5\x821\xc5\xbc 2m1b 2m1c 2m1\xc4\x87 2m1d 2m1f 2m1g 2m1h 2m1j 2m1k 2m1l 2m1\xc5\x82 2m1n 2m1\xc5\x84 2m1p 2m1r 2m1s 2m1\xc5\x9b 2m1t 2m1w 2m1z 2m1\xc5\xba 2m1\xc5\xbc 2n1b 2n1c 2n1\xc4\x87 2n1d 2n1f 2n1g 2n1h 2n1j 2n1k 2n1l 2n1\xc5\x82 2n1m 2n1\xc5\x84 2n1p 2n1r 2n1s 2n1\xc5\x9b 2n1t 2n1w 2n1z 2n1\xc5\xba 2n1\xc5\xbc 2n2t1n 2\xc5\x841b 2\xc5\x841c 2\xc5\x841\xc4\x87 2\xc5\x841d 2\xc5\x841f 2\xc5\x841g 2\xc5\x841h 2\xc5\x841j 2\xc5\x841k 2\xc5\x841l 2\xc5\x841\xc5\x82 2\xc5\x841m 2\xc5\x841n 2\xc5\x841\xc5\x84 2\xc5\x841p 2\xc5\x841r 2\xc5\x841s 2\xc5\x841\xc5\x9b 2\xc5\x841t 2\xc5\x841w 2\xc5\x841z 2\xc5\x841\xc5\xba 2\xc5\x841\xc5\xbc 2p1b 2p1c 2p1\xc4\x87 2p1d 2p1f 2p1g 2p1k 2p1m 2p1n 2p1\xc5\x84 2p1s 2p1s4z 2p1\xc5\x9b 2p1t 2p1z 2p1\xc5\xba 2p1\xc5\xbc 2p2l1n 2r1b 2r1c 2r1\xc4\x87 2r1d 2r1f 2r1g 2r1h 2r1j 2r1k 2r1l 2r1\xc5\x82 2r1m 2r1n 2r1\xc5\x84 2r1p 2r1s 2r1\xc5\x9b 2r1t 2r1w 2r1\xc5\xba 2r1\xc5\xbc r4z 2rz1b 2r2z1c 2r2z1\xc4\x87 2r2z1d 2r2z1f 2rz1g 2rz1h 2rz1j 2r2z1k 2rz1l 2rz1\xc5\x82 2rz1m 2rz1n 2rz1\xc5\x84 2r2z1p 2rz1r 2r2z1s 2r2z1\xc5\x9b 2r2z1t 2rz1w 2rz1\xc5\xba 2rz1\xc5\xbc 2s1b 2s1d 2s1f 2s1g 2s1s 2s1\xc5\xba 2s1\xc5\xbc 2s2\xc5\x821b 2s2n1k 2s2t1k 2s2t1n s2t1s 2sts4z s4z 2s2z1c 2s2z1\xc4\x87 2s2z1f 2s2z1k 2sz1l 2sz1m 2sz1n 2s2z1p 2s2z1s 2s2z1\xc5\x9b 2s2z1t 2sz1w 2s4z3z 2sz2l1n 2\xc5\x9b1b 2\xc5\x9b1d 2\xc5\x9b1f 2\xc5\x9b1g 2\xc5\x9b1k 2\xc5\x9b1p 2\xc5\x9b1s 2\xc5\x9b1\xc5\x9b 2\xc5\x9b1t 2\xc5\x9b1z 2\xc5\x9b1\xc5\xba 2\xc5\x9b1\xc5\xbc 2\xc5\x9b2\xc4\x871c 2\xc5\x9b2l1m 2\xc5\x9b2l1n 2t1b 2t1c 2t1\xc4\x87 2t1d 2t1f 2t1g 2t1k 2t1m 2t1n 2t1\xc5\x84 2t1p 2t1s 2t1\xc5\x9b 2t1z 2t1\xc5\xba 2t1\xc5\xbc 2t2l1n 2t2r1k tr4z 2t2rz1n 2w1b 2w1c 2w1\xc4\x87 2w1d 2w1f 2w1g 2w1j 2w1k 2w1l 2w1\xc5\x82 2w1m 2w1n 2w1\xc5\x84 2w1p 2w1r 2w1s 2w1\xc5\x9b 2w1t 2w1z 2w1\xc5\xba 2w1\xc5\xbc 2z1c 2z1\xc4\x87 2z1d 2z1f 2z1k 2z1p 2z1s 2z1\xc5\x9b 2z1t 2z2d1k 2z2d1n 2\xc5\xba1b 2\xc5\xba1c 2\xc5\xba1\xc4\x87 2\xc5\xba1d 2\xc5\xba1f 2\xc5\xba1g 2\xc5\xba1k 2\xc5\xba1l 2\xc5\xba1m 2\xc5\xba1n 2\xc5\xba1p 2\xc5\xba1s 2\xc5\xba1\xc5\x9b 2\xc5\xba1t 2\xc5\xba1w 2\xc5\xba1z 2\xc5\xba1\xc5\xbc 2\xc5\xbc1b 2\xc5\xbc1c 2\xc5\xbc1\xc4\x87 2\xc5\xbc1d 2\xc5\xbc1f 2\xc5\xbc1g 2\xc5\xbc1j 2\xc5\xbc1k 2\xc5\xbc1l 2\xc5\xbc1\xc5\x82 2\xc5\xbc1m 2\xc5\xbc1n 2\xc5\xbc1\xc5\x84 2\xc5\xbc1p 2\xc5\xbc1r 2\xc5\xbc1s 2\xc5\xbc1\xc5\x9b 2\xc5\xbc1t 2\xc5\xbc1w 2\xc5\xbc1z 2\xc5\xbc1\xc5\xba dni1 dni2o1 3d2niow 3k2s2z2t 3m2k2n mne1 3m2nest 3m2nezj 3m2s2k2n pne1 3p2ne2u1 wc4z wcza1 3w2czas w\xc5\x82a1 3w2\xc5\x82ad w\xc5\x82o1 3w2\xc5\x82os 4b3b 4c3c 4\xc4\x873\xc4\x87 4d3d 4f3f 4g3g 4h3h 4j3j 4k3k 4l3l 4\xc5\x823\xc5\x82 4m3m 4n3n 4p3p 4r3r 4t3t 4w3w 4z3z 4\xc5\xba3\xc5\xba 4\xc5\xbc3\xc5\xbc 8b_ 8b8b_ 8b8c_ 8b8\xc4\x87_ 8b8d_ 8b8f_ 8b8g_ 8b8h_ 8b8j_ 8b8k_ 8b8l_ 8b8\xc5\x82_ 8b8m_ 8b8n_ 8b8\xc5\x84_ 8b8p_ 8b8r_ br4z 8b8r8z_ 8b8s_ 8b8\xc5\x9b_ 8b8t_ 8b8v_ 8b8w_ 8b8x_ 8b8z_ 8b8\xc5\xba_ 8b8\xc5\xbc_ 8c_ 8c8b_ 8c8c_ 8c8\xc4\x87_ 8c8d_ 8c8f_ 8c8g_ 8c8h_ c2h2\xc5\x82 8c8h8\xc5\x82_ c2h2r chr4z 8ch8r8z_ c2h2w 8c8h8w_ 8c8j_ 8c8k_ 8c8l_ 8c8\xc5\x82_ 8c8m_ 8c8n_ 8c8\xc5\x84_ 8c8p_ 8c8r_ 8c8s_ 8c8\xc5\x9b_ 8c8t_ 8c8v_ 8c8w_ 8c8x_ 8c8z_ 8c8z8t_ 8c8\xc5\xba_ 8c8\xc5\xbc_ 8\xc4\x87_ 8\xc4\x878b_ 8\xc4\x878c_ 8\xc4\x878\xc4\x87_ 8\xc4\x878d_ 8\xc4\x878f_ 8\xc4\x878g_ 8\xc4\x878h_ 8\xc4\x878j_ 8\xc4\x878k_ 8\xc4\x878l_ 8\xc4\x878\xc5\x82_ 8\xc4\x878m_ 8\xc4\x878n_ 8\xc4\x878\xc5\x84_ 8\xc4\x878p_ 8\xc4\x878r_ 8\xc4\x878s_ 8\xc4\x878\xc5\x9b_ 8\xc4\x878t_ 8\xc4\x878v_ 8\xc4\x878w_ 8\xc4\x878x_ 8\xc4\x878z_ 8\xc4\x878\xc5\xba_ 8\xc4\x878\xc5\xbc_ 8d_ 8d8b_ 8d8c_ 8d8\xc4\x87_ 8d8d_ 8d8f_ 8d8g_ 8d8h_ 8d8j_ 8d8k_ 8d8l_ 8d8\xc5\x82_ 8d8m_ 8d8n_ 8d8\xc5\x84_ 8d8p_ 8d8r_ dr4z 8d8r8z_ 8d8s_ 8d8\xc5\x9b_ 8d8t_ 8d8v_ 8d8w_ 8d8x_ 8d8z_ 8d8\xc5\xba_ 8d8\xc5\xbc_ 8f_ 8f8b_ 8f8c_ 8f8\xc4\x87_ 8f8d_ 8f8f_ 8f8g_ 8f8h_ 8f8j_ 8f8k_ 8f8l_ 8f8\xc5\x82_ 8f8m_ 8f8n_ 8f8\xc5\x84_ 8f8p_ 8f8r_ 8f8s_ 8f8\xc5\x9b_ 8f8t_ 8f8v_ 8f8w_ 8f8x_ 8f8z_ 8f8\xc5\xba_ 8f8\xc5\xbc_ 8g_ 8g8b_ 8g8c_ 8g8\xc4\x87_ 8g8d_ 8g8f_ 8g8g_ 8g8h_ 8g8j_ 8g8k_ 8g8l_ 8g8\xc5\x82_ 8g8m_ 8g8n_ 8g8\xc5\x84_ 8g8p_ 8g8r_ 8g8s_ 8g8\xc5\x9b_ 8g8t_ 8g8v_ 8g8w_ 8g8x_ 8g8z_ 8g8\xc5\xba_ 8g8\xc5\xbc_ 8h_ 8h8b_ 8h8c_ 8h8\xc4\x87_ 8h8d_ 8h8f_ 8h8g_ 8h8h_ 8h8j_ 8h8k_ 8h8l_ 8h8\xc5\x82_ 8h8m_ 8h8n_ 8h8\xc5\x84_ 8h8p_ 8h8r_ 8h8s_ 8h8\xc5\x9b_ 8h8t_ 8h8v_ 8h8w_ 8h8x_ 8h8z_ 8h8\xc5\xba_ 8h8\xc5\xbc_ 8j_ 8j8b_ 8j8c_ 8j8\xc4\x87_ 8j8d_ 8j8f_ 8j8g_ 8j8h_ 8j8j_ 8j8k_ 8j8l_ 8j8\xc5\x82_ 8j8m_ 8j8n_ 8j8\xc5\x84_ 8j8p_ 8j8r_ 8j8s_ 8j8\xc5\x9b_ 8j8t_ 8j8v_ 8j8w_ 8j8x_ 8j8z_ 8j8\xc5\xba_ 8j8\xc5\xbc_ 8k_ 8k8b_ 8k8c_ 8k8\xc4\x87_ 8k8d_ 8k8f_ 8k8g_ 8k8h_ 8k8j_ 8k8k_ 8k8l_ 8k8\xc5\x82_ 8k8m_ 8k8n_ 8k8\xc5\x84_ 8k8p_ 8k8r_ 8k8s_ 8k8s8t_ 8k8\xc5\x9b_ 8k8t_ 8k8v_ 8k8w_ 8k8x_ 8k8z_ 8k8\xc5\xba_ 8k8\xc5\xbc_ 8l_ 8l8b_ 8l8c_ 8l8\xc4\x87_ 8l8d_ 8l8f_ 8l8g_ 8l8h_ 8l8j_ 8l8k_ 8l8l_ 8l8\xc5\x82_ 8l8m_ 8l8n_ 8l8\xc5\x84_ 8l8p_ 8l8r_ 8l8s_ 8l8\xc5\x9b_ 8l8t_ 8l8v_ 8l8w_ 8l8x_ 8l8z_ 8l8\xc5\xba_ 8l8\xc5\xbc_ 8\xc5\x82_ 8\xc5\x828b_ 8\xc5\x828c_ 8\xc5\x828\xc4\x87_ 8\xc5\x828d_ 8\xc5\x828f_ 8\xc5\x828g_ 8\xc5\x828h_ 8\xc5\x828j_ 8\xc5\x828k_ 8\xc5\x828l_ 8\xc5\x828\xc5\x82_ 8\xc5\x828m_ 8\xc5\x828n_ 8\xc5\x828\xc5\x84_ 8\xc5\x828p_ 8\xc5\x828r_ 8\xc5\x828s_ 8\xc5\x828\xc5\x9b_ 8\xc5\x828t_ 8\xc5\x828v_ 8\xc5\x828w_ 8\xc5\x828x_ 8\xc5\x828z_ 8\xc5\x828\xc5\xba_ 8\xc5\x828\xc5\xbc_ 8m_ 8m8b_ 8m8c_ 8m8\xc4\x87_ 8m8d_ 8m8f_ 8m8g_ 8m8h_ 8m8j_ 8m8k_ 8m8l_ 8m8\xc5\x82_ 8m8m_ 8m8n_ 8m8\xc5\x84_ 8m8p_ 8m8r_ 8m8s_ 8m8s8t_ 8m8\xc5\x9b_ 8m8t_ 8m8v_ 8m8w_ 8m8x_ 8m8z_ 8m8\xc5\xba_ 8m8\xc5\xbc_ 8n_ 8n8b_ 8n8c_ 8n8\xc4\x87_ 8n8d_ 8n8f_ 8n8g_ 8n8h_ 8n8j_ 8n8k_ 8n8l_ 8n8\xc5\x82_ 8n8m_ 8n8n_ 8n8\xc5\x84_ 8n8p_ 8n8r_ 8n8s_ 8n8\xc5\x9b_ 8n8t_ 8n8v_ 8n8w_ 8n8x_ 8n8z_ 8n8\xc5\xba_ 8n8\xc5\xbc_ 8\xc5\x84_ 8\xc5\x848b_ 8\xc5\x848c_ 8\xc5\x848\xc4\x87_ 8\xc5\x848d_ 8\xc5\x848f_ 8\xc5\x848g_ 8\xc5\x848h_ 8\xc5\x848j_ 8\xc5\x848k_ 8\xc5\x848l_ 8\xc5\x848\xc5\x82_ 8\xc5\x848m_ 8\xc5\x848n_ 8\xc5\x848\xc5\x84_ 8\xc5\x848p_ 8\xc5\x848r_ 8\xc5\x848s_ 8\xc5\x848\xc5\x9b_ 8\xc5\x848t_ 8\xc5\x848v_ 8\xc5\x848w_ 8\xc5\x848x_ 8\xc5\x848z_ 8\xc5\x848\xc5\xba_ 8\xc5\x848\xc5\xbc_ 8p_ 8p8b_ 8p8c_ 8p8\xc4\x87_ 8p8d_ 8p8f_ 8p8g_ 8p8h_ 8p8j_ 8p8k_ 8p8l_ 8p8\xc5\x82_ 8p8m_ 8p8n_ 8p8\xc5\x84_ 8p8p_ 8p8r_ pr4z 8p8r8z_ 8p8s_ 8p8\xc5\x9b_ 8p8t_ 8p8v_ 8p8w_ 8p8x_ 8p8z_ 8p8\xc5\xba_ 8p8\xc5\xbc_ 8r_ 8r8b_ 8r8c_ 8r8\xc4\x87_ 8r8d_ 8r8f_ 8r8g_ 8r8h_ 8r8j_ 8r8k_ 8r8l_ 8r8\xc5\x82_ 8r8m_ 8r8n_ 8r8\xc5\x84_ 8r8p_ 8r8r_ 8r8s_ rs4z 8r8s8z_ 8r8\xc5\x9b_ 8r8t_ 8r8v_ 8r8w_ 8r8x_ 8r8z_ 8r8z8\xc5\x82_ 8r8\xc5\xba_ 8r8\xc5\xbc_ 8s_ 8s8b_ 8s8c_ sc4h 8s8c8h_ 8s8\xc4\x87_ 8s8d_ 8s8f_ 8s8g_ 8s8h_ 8s8j_ 8s8k_ skr4z 8sk8r8z_ 8s8l_ 8s8\xc5\x82_ 8s8m_ 8s8n_ 8s8\xc5\x84_ 8s8p_ 8s8r_ 8s8s_ 8s8\xc5\x9b_ 8s8t_ 8s8t8r_ str4z 8s8t8r8z_ 8s8t8w_ 8s8v_ 8s8w_ 8s8x_ 8s8z_ szc4z 8sz8c8z_ sz2cz1b 8szc8z8b_ 8s8z8k_ 8s8z8n_ 8s8z8t_ 8sz8t8r_ 8s8\xc5\xba_ 8s8\xc5\xbc_ 8\xc5\x9b_ 8\xc5\x9b8b_ 8\xc5\x9b8c_ 8\xc5\x9b8\xc4\x87_ 8\xc5\x9b8d_ 8\xc5\x9b8f_ 8\xc5\x9b8g_ 8\xc5\x9b8h_ 8\xc5\x9b8j_ 8\xc5\x9b8k_ 8\xc5\x9b8l_ 8\xc5\x9b8\xc5\x82_ 8\xc5\x9b8m_ 8\xc5\x9b8n_ 8\xc5\x9b8\xc5\x84_ 8\xc5\x9b8p_ 8\xc5\x9b8r_ 8\xc5\x9b8s_ 8\xc5\x9b8\xc5\x9b_ 8\xc5\x9b8t_ 8\xc5\x9b8v_ 8\xc5\x9b8w_ 8\xc5\x9b8x_ 8\xc5\x9b8z_ 8\xc5\x9b8\xc5\xba_ 8\xc5\x9b8\xc5\xbc_ 8t_ 8t8b_ 8t8c_ 8t8\xc4\x87_ 8t8d_ 8t8f_ 8t8g_ 8t8h_ 8t8j_ 8t8k_ 8t8l_ 8t8\xc5\x82_ 8t8m_ 8t8n_ 8t8\xc5\x84_ 8t8p_ 8t8r_ 8t8r8z_ 8t8s_ 8t8\xc5\x9b_ 8t8t_ 8t8v_ 8t8w_ 8t8x_ 8t8z_ 8t8\xc5\xba_ 8t8\xc5\xbc_ 8v_ 8v8b_ 8v8c_ 8v8\xc4\x87_ 8v8d_ 8v8f_ 8v8g_ 8v8h_ 8v8j_ 8v8k_ 8v8l_ 8v8\xc5\x82_ 8v8m_ 8v8n_ 8v8\xc5\x84_ 8v8p_ 8v8r_ 8v8s_ 8v8\xc5\x9b_ 8v8t_ 8v8v_ 8v8w_ 8v8x_ 8v8z_ 8v8\xc5\xba_ 8v8\xc5\xbc_ 8w_ 8w8b_ 8w8c_ 8w8\xc4\x87_ 8w8d_ 8w8f_ 8w8g_ 8w8h_ 8w8j_ 8w8k_ 8w8l_ 8w8\xc5\x82_ 8w8m_ 8w8n_ 8w8\xc5\x84_ 8w8p_ 8w8r_ 8w8s_ 8w8\xc5\x9b_ 8w8t_ 8w8v_ 8w8w_ 8w8x_ 8w8z_ 8w8\xc5\xba_ 8w8\xc5\xbc_ 8x_ 8x8b_ 8x8c_ 8x8\xc4\x87_ 8x8d_ 8x8f_ 8x8g_ 8x8h_ 8x8j_ 8x8k_ 8x8l_ 8x8\xc5\x82_ 8x8m_ 8x8n_ 8x8\xc5\x84_ 8x8p_ 8x8r_ 8x8s_ 8x8\xc5\x9b_ 8x8t_ 8x8v_ 8x8w_ 8x8x_ 8x8z_ 8x8\xc5\xba_ 8x8\xc5\xbc_ 8z_ 8z8b_ 8z8c_ 8z8\xc4\x87_ 8z8d_ 8z8d8r_ zdr4z 8z8d8r8z_ 8z8f_ 8z8g_ 8z8h_ 8z8j_ 8z8k_ 8z8l_ 8z8\xc5\x82_ 8z8m_ 8z8n_ 8z8\xc5\x84_ 8z8p_ 8z8r_ 8z8s_ 8z8\xc5\x9b_ 8z8t_ 8z8v_ 8z8w_ 8z8x_ 8z8z_ 8z8\xc5\xba_ 8z8\xc5\xbc_ 8\xc5\xba_ 8\xc5\xba8b_ 8\xc5\xba8c_ 8\xc5\xba8\xc4\x87_ 8\xc5\xba8d_ 8\xc5\xba8f_ 8\xc5\xba8g_ 8\xc5\xba8h_ 8\xc5\xba8j_ 8\xc5\xba8k_ 8\xc5\xba8l_ 8\xc5\xba8\xc5\x82_ 8\xc5\xba8m_ 8\xc5\xba8n_ 8\xc5\xba8\xc5\x84_ 8\xc5\xba8p_ 8\xc5\xba8r_ 8\xc5\xba8s_ 8\xc5\xba8\xc5\x9b_ 8\xc5\xba8t_ 8\xc5\xba8v_ 8\xc5\xba8w_ 8\xc5\xba8x_ 8\xc5\xba8z_ 8\xc5\xba8\xc5\xba_ 8\xc5\xba8\xc5\xbc_ 8\xc5\xbc_ 8\xc5\xbc8b_ 8\xc5\xbc8c_ 8\xc5\xbc8\xc4\x87_ 8\xc5\xbc8d_ 8\xc5\xbc8f_ 8\xc5\xbc8g_ 8\xc5\xbc8h_ 8\xc5\xbc8j_ 8\xc5\xbc8k_ 8\xc5\xbc8l_ 8\xc5\xbc8\xc5\x82_ 8\xc5\xbc8m_ 8\xc5\xbc8n_ 8\xc5\xbc8\xc5\x84_ 8\xc5\xbc8p_ 8\xc5\xbc8r_ 8\xc5\xbc8s_ 8\xc5\xbc8\xc5\x9b_ 8\xc5\xbc8t_ 8\xc5\xbc8v_ 8\xc5\xbc8w_ 8\xc5\xbc8x_ 8\xc5\xbc8z_ 8\xc5\xbc8\xc5\xba_ 8\xc5\xbc8\xc5\xbc_ a1 a2u1 a2y1 a1a2 ae2 ai2 ao2 \xc4\x851 be1 be1e2 be2eth be2f3s4z2 be1khe1 be2k1he2n1d bi1 bino1 bi2n3o2ku1 bis4z bi2s2z1k biszko1 bi2sz3kop bizne1 bi2z3nes bi2z3ne2s3m bi2r1m bi1rmi1 birmi2n1g birmingha1 birmin2g1ham blo1 blokha1 blokha2u1 blo2k1hauz bo1 bo2s3ma1 b2r2d bro1 broa2 broa1dwa1 bro2a2d3wa2y1 bu1 bus4z bu2sz1m bu2sz3me1 bu2k1s bu2k1s4z buk2s2z1p bukszpa1 buk2sz3pan busi1 busine1 busine2s2s busine2ss3m ca1 ca2l1d caldwe1 cal2d1we4l3l c2h2j c2h2l chu1 chus1t cu1 cur4z curzo1 cu2r7zon de1 de2u1 deu2t1s deutsc4h deutsc2h2l deutschla1 deut4sch3la2n1d d2rz2w du1 dus4z du2s2z1p duszpa1 du2sz3past d2\xc5\xbc2j d2\xc5\xbc2l d2\xc5\xbc2\xc5\x82 d2\xc5\xbc2r d2\xc5\xbc2w d\xc5\xbce1 d\xc5\xbce4z3b d\xc5\xbce4z3m e1 er4z erza1 e2r5zac e2u1 e2y1 e3u2s4z ea2 e1e2 ei2 eo2 \xc4\x991 fi1 fisha1 fi2s3ha2r1m fis4z fi1szbi1 fi2sz3bin fo1 fo2k1s fo2k2s3t for4z forza1 fo2r5zac fo2l1k fo1lklo1 fol2k1lor fo2s1f fosfa1 fo1sfazo1 fos2f1a2zot ga1 ga2d1g gadge1 ga3d2get gado1 gado2p1t ga1do3p2ta1 go1 go2l1f gol2f3s golfs4z2 gra1 gra2n1d grandi1 gran2d1ilo1 gro1 gro4t3r hi1 his4z hi2s2z3p hu1 huc4z hu2cz1w huxle1 hu2x3le2y1 i1 i2a1 i2\xc4\x851 i2e1 i2\xc4\x991 i2i1 i2o1 i2\xc3\xb31 i2u1 i2y1 i4n3n in2n1s inn2s1b innsbru1 in4nsbru2c1k i2n1s in2s1b insbru1 in4sbruc j2t1\xc5\x82 j2t1r ja1 ja4z3z ja4z4z3b ja4z4z3m ka1 ka2r1l kar2l1s karlskro1 karl2s1kron karlsru1 karl2s1ruhe1 ki1 ki2r1c kirc4h kirc4h3h kirchho1 kir2chho4f3f ko1 ko2n1g kongre1 kongre2s3m le1 led1w lu1 luftwa1 luftwa4f3f lu2ft3waffe1 lu2k1s luk2s1f luksfe1 lu2ks1fer ly1 ly2o2 ma1 mar4z ma2r5z1l ma2r5z1\xc5\x82 ma2r5z1n mi1 mis4z mi2sz1m miszma1 mi2s4z1mas4z mi2e1 mier4z mi1e2r5zi1 mie2r5z1\xc5\x82 mo1 mo2n1t montre1 montrea2 mon2t3real moza1 mozai2 moza2i3k mu1 mur4z murza1 murzasi1 murzasic4h mu2r7zasic2h3l na1 na2\xc5\x821k na\xc5\x82ko1 na4\xc5\x823ko2w1s na4r3v o1 o2y1 oa2 oc4h o2c2h1m ochmi1 och3mistr4z oe2 o4f3f offse1 of2f3set oi2 o1o2 ou2 \xc3\xb31 \xc3\xb32w1c \xc3\xb34w3c4z pa1 pa1na1 paname1 pa2n3a2mer pa1sca1 pa2s3cal pa2s3c4h po1 po2d1n podni1 podni2e1 po3d4niepr4z po2m1n po3m2n\xc4\x851 po3m2n\xc4\x991 po3m2ni1 po2r1t por2t1s po1rtsmo1 portsmou2 po4rt2s3mo2uth portla1 po4rt3la2n1d poli1 poli2e1 poli3e2t poli2u1 poli3u2re1 po\xc5\x82u1 po\xc5\x82u2d1n po\xc5\x82u3d2ni1 po2w1s pows4z powsze1 powsze2d1n powsze3d2ni1 p2r1c prc4h prcha1 pr2chal pre1 pres4z pre2s2z1p pre2sz3pa1 ro1 roe2 roe2n1t roen2t1g roe1ntge1 ro2e3nt2gen ro1kro1 ro2k3roc4z ro1sto1 ro2s3to3c2k se1 se2t3le1 sko1 skor4z sko1rzo1 skorzone1 sko2r5zoner s2m2r so1 sowi1 sowi3z2 sy1 syno1 sy2n3o2p1t syste1 sy2s1tem sza1 s4zas4z sza2sz1\xc5\x82y1 sze1 szezlo1 sze2z1lo2n1g sze4\xc5\x9b\xc4\x87 szto1 szto1kho1 szto2k1ho2l1m szy1 szy2n1k szynkwa1 szyn2k1was to1 to2y1 to1yo2 to3y2o3t tu1 tu2r1b turbo1 turbo1o2 turboodr4z tu1rboodrzu1 turboo2d3rzut ty1 tygo1 tygo2d1n tygo3d2ni1 u1 u2y1 ua2 ue2 ui2 uo2 u1u2 vo1 vo2l1k vo2l2k2s3 we1 we1e2 we1e1ke1 we2e2k1e2n1d we4s2t3f we4s2t3m y1 ya2 ye2 yi2 yo2 yu2 ze1 ze4p3p \xc5\xba2d4\xc5\xba _by1 _byna1 _byna2j1m _bynaj2m1n _bynajmni1 _bynajmni2e1 _by9naj9m8nie8j_ _bezac4h _be9z8a8c8h_ _bezami1 _be9z8ami_ _gd4z _gdzi1 _gdzi2e1 _gdzi1eni1 _gdzi2e1ni2e1 _2g1dzienie2g1d _gd4zieniegd4z _gdzi1eni1egdzi1 _gdzi2e1ni2e1gdzi2e1 _gdzienie9g8dzie_ _ina1 _inac4z _inacze1 _in8a9cze8j_ _n8a9da8l_ _ni2g1d _nigdy1 _n8i9gdy_ _nigd4z _ni1gdzi1 _nigdzi2e1 _n8i9gdzie_ _nie2c2h1\xc5\xbc _nie1ch\xc5\xbce1 _nie8ch9\xc5\xbce_ _nie2c2h1b _niechby1 _nie8ch9by_ _o2w1s _ows4z _owsze1 _ow9sze8m_ _p\xc3\xb3\xc5\x82a1 _p\xc3\xb3\xc5\x82ac4h _p\xc3\xb39\xc5\x828a8c8h_ _p\xc3\xb3\xc5\x82ami1 _p\xc3\xb39\xc5\x828ami_ _p\xc3\xb39\xc5\x828e8k_ _przyna1 _przyna2j1m _przynaj2m1n _przynajmni1 _przynajmni2e1 _przy9naj9m8nie8j_ _sk\xc4\x85di1 _sk\xc4\x851din\xc4\x851 _sk\xc4\x85d9i8n\xc4\x858d_ _tr\xc3\xb3ja1 _tr\xc3\xb3jac4h _tr\xc3\xb39j8a8c8h_ _tr\xc3\xb3jami1 _tr\xc3\xb39j8ami_ _tr\xc3\xb39j8e8k_ _pod\xc3\xb32w1c _pod\xc3\xb34w3c4z _pod\xc3\xb3wcza1 _pod\xc3\xb33w2czas _po8d9\xc3\xb38w9cza8s_"; + +?> diff --git a/application/third_party/mpdf/patterns/ru.php b/application/third_party/mpdf/patterns/ru.php new file mode 100644 index 0000000..c87b58c --- /dev/null +++ b/application/third_party/mpdf/patterns/ru.php @@ -0,0 +1,12 @@ +<?php +/* + Adapted from Hyphenator 1.0.2 + http://code.google.com/p/hyphenator/ + + Created by crymos at yandex dot ru + Вопросы по русскоязычным таблицам переноса отправлять на адрес. +*/ + +$patterns="_\xd0\xb0\xd0\xb11\xd1\x80 _\xd0\xb0\xd0\xb31\xd1\x80\xd0\xbe _\xd0\xb0\xd0\xb4\xd0\xb82 _\xd0\xb0\xd0\xb82 _\xd0\xb0\xd0\xba1\xd1\x80 _\xd0\xb0\xd0\xbb\xd1\x8c3\xd1\x8f _\xd0\xb0\xd1\x802\xd1\x821\xd0\xbe2 _\xd0\xb0\xd1\x811\xd1\x82\xd0\xbe _\xd0\xb0\xd1\x81\xd1\x821\xd1\x80 _\xd0\xb0\xd1\x832 _\xd0\xb1\xd0\xb82\xd0\xbe _\xd0\xb2\xd0\xbe2\xd0\xb13\xd0\xbb _\xd0\xb2\xd0\xbe3\xd0\xb62\xd0\xb4 _\xd0\xb3\xd0\xbe2\xd1\x84 _\xd0\xb4\xd0\xb5\xd0\xba2 _\xd0\xb4\xd0\xb51\xd0\xba\xd0\xb2 _\xd0\xb4\xd0\xb82\xd0\xb0\xd0\xba _\xd0\xb4\xd0\xb81\xd0\xbe _\xd0\xb4\xd0\xbe3\xd0\xbf _\xd0\xb4\xd0\xbe3\xd1\x822 _\xd0\xb5\xd0\xbf\xd0\xb83 _\xd0\xb7\xd0\xb0\xd0\xb22\xd1\x80 _\xd0\xb7\xd0\xb03\xd0\xbc2\xd0\xbd _\xd0\xb7\xd0\xb03\xd0\xbf _\xd0\xb8\xd0\xb31\xd1\x80 _\xd0\xb8\xd0\xb7\xd0\xb32 _\xd0\xb8\xd0\xb73\xd0\xbd _\xd0\xb8\xd0\xb82 _\xd0\xb8\xd0\xba1\xd1\x80 _\xd0\xb8\xd0\xbe2 _\xd0\xb8\xd0\xbe4\xd0\xbd\xd0\xb0 _\xd0\xb8\xd1\x813 _\xd0\xbb\xd0\xb52\xd0\xbe _\xd0\xbb\xd0\xb52\xd0\xbf3\xd1\x80 _\xd0\xbb\xd0\xb5\xd1\x811\xd0\xba _\xd0\xbb\xd1\x8c2 _\xd0\xbb\xd1\x8e\xd1\x81\xd1\x821 _\xd0\xbc\xd0\xb52\xd0\xb61\xd1\x832 _\xd0\xbc\xd0\xb81\xd0\xbe\xd0\xbc _\xd0\xbc\xd0\xbe2\xd0\xba1 _\xd0\xbc\xd1\x832\xd1\x88\xd1\x821 _\xd0\xbd\xd0\xb01\xd0\xb2 _\xd0\xbd\xd0\xb03\xd1\x82 _\xd0\xbd\xd0\xb03\xd1\x882 _\xd0\xbd\xd0\xb53\xd0\xb2\xd0\xbd _\xd0\xbd\xd0\xb51\xd0\xb4\xd1\x80 _\xd0\xbd\xd0\xb51\xd0\xb72 _\xd0\xbd\xd0\xb51\xd1\x81\xd0\xbb _\xd0\xbd\xd0\xb51\xd1\x812\xd1\x86 _\xd0\xbd\xd0\xb53\xd1\x82 _\xd0\xbd\xd0\xbe\xd1\x811\xd0\xba _\xd0\xbd\xd1\x83\xd0\xba1\xd0\xbb _\xd0\xbe\xd0\xb1\xd0\xbe3\xd0\xb62 _\xd0\xbe\xd0\xb2\xd0\xbe1 _\xd0\xbe\xd0\xb33\xd0\xbd _\xd0\xbe\xd0\xb74 _\xd0\xbe\xd1\x812\xd0\xba\xd0\xb0 _\xd0\xbe\xd1\x812\xd0\xbf _\xd0\xbe\xd1\x813\xd0\xbf\xd0\xb8 _\xd0\xbe\xd1\x821\xd0\xb2 _\xd0\xbe\xd1\x821\xd1\x80\xd0\xbe _\xd0\xbe\xd1\x821\xd1\x80\xd1\x83 _\xd0\xbe\xd1\x821\xd1\x83\xd0\xb6 _\xd0\xbf\xd0\xbe3\xd0\xb22 _\xd0\xbf\xd0\xbe3\xd0\xb62 _\xd0\xbf\xd0\xbe\xd0\xb72\xd0\xbd _\xd0\xbf\xd1\x80\xd0\xbe\xd1\x812 _\xd1\x80\xd0\xb02\xd1\x813\xd1\x82 _\xd1\x80\xd0\xb52\xd0\xb1\xd1\x80 _\xd1\x80\xd0\xb52\xd0\xb73\xd0\xb2 _\xd1\x80\xd0\xb82\xd1\x81\xd0\xba _\xd1\x80\xd0\xb82\xd1\x87 _\xd1\x80\xd0\xbe2\xd0\xb73\xd0\xb2 _\xd1\x80\xd0\xbe2\xd1\x813\xd0\xbb _\xd1\x80\xd0\xbe2\xd1\x85 _\xd1\x81\xd0\xb5\xd0\xbf\xd1\x822 _\xd1\x81\xd0\xba2 _\xd1\x81\xd1\x822 _\xd1\x81\xd1\x832\xd0\xb6 _\xd1\x82\xd0\xb52\xd0\xbe3 _\xd1\x82\xd0\xb8\xd0\xb03 _\xd1\x82\xd0\xb82\xd0\xb3 _\xd1\x82\xd0\xb8\xd0\xb31\xd1\x80 _\xd1\x82\xd0\xb82\xd0\xbe _\xd1\x83\xd0\xb12 _\xd1\x83\xd0\xb42 _\xd1\x83\xd0\xb52 _\xd1\x83\xd0\xb72\xd0\xbd\xd0\xb0 _\xd1\x83\xd0\xba2 _\xd1\x83\xd0\xbc2\xd1\x87 _\xd1\x83\xd0\xbe3 _\xd1\x83\xd0\xbf2 _\xd1\x83\xd1\x802\xd0\xb2 _\xd1\x83\xd1\x812 _\xd1\x83\xd1\x822\xd1\x80 _\xd1\x83\xd1\x8e2 _\xd1\x85\xd0\xbe2\xd1\x803\xd0\xb2 _\xd1\x87\xd0\xb52\xd1\x811\xd0\xba _\xd1\x8e\xd1\x811 4\xd0\xb03\xd0\xb0 \xd0\xb0\xd0\xb02\xd0\xbf \xd0\xb0\xd0\xb02\xd1\x80 \xd0\xb0\xd0\xb02\xd1\x86 \xd0\xb01\xd0\xb1 \xd0\xb0\xd0\xb1\xd0\xb53\xd1\x81\xd1\x82 \xd0\xb03\xd0\xb1\xd0\xbb\xd0\xb0 \xd0\xb0\xd0\xb12\xd0\xbb\xd1\x8e \xd0\xb0\xd0\xb11\xd1\x80\xd0\xb8 \xd0\xb03\xd0\xb1\xd1\x83 \xd0\xb0\xd0\xb21\xd0\xb2 \xd0\xb01\xd0\xb2\xd0\xb5 \xd0\xb0\xd0\xb23\xd0\xb7\xd0\xbe \xd0\xb01\xd0\xb2\xd0\xb8 \xd0\xb0\xd0\xb2\xd0\xb82\xd0\xb0 \xd0\xb01\xd0\xb2\xd0\xbe \xd0\xb0\xd0\xb2\xd0\xbe1\xd1\x81 \xd0\xb02\xd0\xb2\xd0\xbe\xd1\x82 \xd0\xb0\xd0\xb21\xd1\x80\xd0\xb0 \xd0\xb0\xd0\xb22\xd1\x81\xd0\xb5 \xd0\xb02\xd0\xb2\xd1\x82 \xd0\xb01\xd0\xb2\xd1\x83 \xd0\xb02\xd0\xb2\xd1\x85 \xd0\xb03\xd0\xb22\xd1\x87\xd0\xb5 2\xd0\xb0\xd0\xb3\xd0\xb0 \xd0\xb0\xd0\xb3\xd0\xb01\xd1\x812 \xd0\xb02\xd0\xb3\xd0\xb4 \xd0\xb02\xd0\xb3\xd0\xb8\xd1\x82\xd0\xb8 \xd0\xb02\xd0\xb3\xd0\xbb\xd0\xb5 \xd0\xb0\xd0\xb32\xd0\xbb\xd0\xb8 \xd0\xb02\xd0\xb3\xd0\xbb\xd0\xbe\xd1\x81 \xd0\xb0\xd0\xb32\xd0\xbb\xd0\xbe\xd1\x82 2\xd0\xb0\xd0\xb3\xd0\xbe \xd0\xb03\xd0\xb3\xd1\x83 \xd0\xb01\xd0\xb4 2\xd0\xb0\xd0\xb4\xd0\xb2 \xd0\xb02\xd0\xb4\xd0\xb2\xd0\xb5 \xd0\xb0\xd0\xb42\xd0\xb6\xd0\xb8 \xd0\xb0\xd0\xb4\xd0\xb82\xd0\xbe\xd0\xb4 \xd0\xb02\xd0\xb4\xd0\xbb \xd0\xb02\xd0\xb41\xd0\xbe\xd0\xb1\xd0\xbb \xd0\xb0\xd0\xb41\xd1\x80\xd0\xbe \xd0\xb02\xd0\xb41\xd1\x80\xd1\x83 \xd0\xb0\xd0\xb4\xd1\x833\xd1\x87 \xd0\xb0\xd0\xb42\xd1\x86 \xd0\xb02\xd0\xb4\xd1\x8b\xd0\xbd \xd0\xb01\xd0\xb5 \xd0\xb0\xd0\xb52\xd0\xb3\xd0\xbe \xd0\xb0\xd0\xb52\xd0\xb4\xd0\xb8 \xd0\xb0\xd0\xb52\xd0\xbb \xd0\xb02\xd0\xb5\xd0\xbf \xd0\xb0\xd0\xb52\xd1\x80\xd0\xb5 \xd0\xb0\xd0\xb52\xd1\x81 \xd0\xb0\xd0\xb7\xd0\xb04\xd1\x883 \xd0\xb0\xd0\xb7\xd0\xb22 \xd0\xb0\xd0\xb73\xd0\xb2\xd0\xb5\xd0\xb7 \xd0\xb0\xd0\xb71\xd0\xb2\xd0\xbb \xd0\xb0\xd0\xb7\xd0\xb32 \xd0\xb0\xd0\xb71\xd0\xb4\xd1\x80 \xd0\xb0\xd0\xb71\xd0\xbe\xd0\xb1 \xd0\xb0\xd0\xb72\xd0\xbe1\xd0\xb1\xd1\x80 \xd0\xb02\xd0\xb7\xd0\xbe\xd0\xb2\xd1\x8c \xd0\xb02\xd0\xb7\xd0\xbe\xd0\xbb\xd1\x8c \xd0\xb01\xd0\xb7\xd0\xbe\xd1\x80\xd0\xb8 \xd0\xb0\xd0\xb72\xd0\xbe1\xd1\x81 \xd0\xb0\xd0\xb71\xd1\x80 \xd0\xb01\xd0\xb8 \xd0\xb0\xd0\xb82\xd0\xb31 \xd0\xb0\xd0\xb83\xd0\xb3\xd0\xbb \xd0\xb02\xd0\xb8\xd1\x85 \xd0\xb01\xd0\xba \xd0\xb0\xd0\xba1\xd0\xb2 1\xd0\xb0\xd0\xba\xd0\xba \xd0\xb0\xd0\xba2\xd0\xbb \xd0\xb0\xd0\xba3\xd0\xbb\xd0\xb5\xd0\xbc \xd0\xb0\xd0\xba\xd0\xbe1\xd0\xb12 2\xd0\xb0\xd0\xba\xd0\xbe\xd0\xbd\xd1\x81 \xd0\xb0\xd0\xba\xd0\xbe3\xd1\x82 2\xd0\xb0\xd0\xba\xd1\x80\xd0\xb8 \xd0\xb0\xd0\xba1\xd1\x81 \xd0\xb01\xd0\xbb\xd0\xb0 \xd0\xb03\xd0\xbb\xd0\xb0\xd0\xb3 \xd0\xb01\xd0\xbb\xd0\xb5 2\xd0\xb0\xd0\xbb\xd0\xb5\xd0\xba \xd0\xb03\xd0\xbb\xd0\xb8 \xd0\xb0\xd0\xbb\xd0\xbe1\xd0\xb7 \xd0\xb01\xd0\xbb\xd1\x83 \xd0\xb0\xd0\xbb\xd1\x832\xd1\x88 \xd0\xb0\xd0\xbb\xd1\x83\xd1\x881\xd1\x82 \xd0\xb01\xd0\xbb\xd1\x8b \xd0\xb02\xd0\xbb\xd1\x8c\xd1\x89 \xd0\xb01\xd0\xbb\xd1\x8e 2\xd0\xb0\xd0\xbc\xd0\xb0 \xd0\xb0\xd0\xbc\xd0\xb14 2\xd0\xb0\xd0\xbc\xd0\xb5\xd1\x82 \xd0\xb02\xd0\xbc\xd0\xb8\xd0\xbd\xd1\x82 \xd0\xb0\xd0\xbc2\xd0\xbd\xd0\xb5\xd1\x82 2\xd0\xb0\xd0\xbc\xd0\xbe \xd0\xb0\xd0\xbc\xd0\xbe1\xd0\xb72 \xd0\xb0\xd0\xbc\xd0\xbe\xd0\xb82 \xd0\xb02\xd0\xbc\xd1\x87 \xd0\xb0\xd0\xbd\xd0\xb02\xd0\xb4\xd1\x86 \xd0\xb02\xd0\xbd1\xd0\xb02\xd0\xbc\xd0\xb5 \xd0\xb02\xd0\xbd\xd0\xb0\xd1\x84 \xd0\xb0\xd0\xbd2\xd0\xb4\xd1\x80\xd0\xb0 \xd0\xb02\xd0\xbd1\xd0\xbe2\xd0\xb1 \xd0\xb0\xd0\xbd1\xd0\xbe2\xd1\x85\xd1\x80 \xd0\xb0\xd0\xbd1\xd1\x80 \xd0\xb0\xd0\xbd2\xd1\x81\xd0\xbf \xd0\xb0\xd0\xbd\xd1\x811\xd1\x83 \xd0\xb0\xd0\xbd2\xd1\x81\xd1\x83\xd1\x80 \xd0\xb02\xd0\xbd1\xd1\x83\xd0\xb7 \xd0\xb01\xd0\xbd\xd1\x8c 2\xd0\xb01\xd0\xbe \xd0\xb0\xd0\xbe2\xd0\xb4 \xd0\xb0\xd0\xbe2\xd0\xba \xd0\xb0\xd0\xbe2\xd1\x80 \xd0\xb0\xd0\xbe2\xd1\x81 \xd0\xb0\xd0\xbe\xd1\x81\xd1\x821 \xd0\xb03\xd0\xbf\xd0\xbb\xd0\xb0 \xd0\xb0\xd0\xbf2\xd0\xbb\xd0\xbe\xd0\xbc 2\xd0\xb0\xd0\xbf\xd0\xbe \xd0\xb0\xd0\xbf\xd0\xbe4\xd0\xb2\xd1\x81 \xd0\xb0\xd0\xbf\xd0\xbe3\xd1\x872\xd1\x82 \xd0\xb0\xd0\xbf2\xd1\x80\xd0\xb0 \xd0\xb0\xd0\xbf1\xd1\x80\xd0\xb5\xd0\xbb \xd0\xb01\xd1\x80\xd0\xb0 \xd0\xb0\xd1\x80\xd0\xb02\xd1\x81\xd1\x82 \xd0\xb0\xd1\x802\xd0\xb1\xd0\xbe\xd0\xba \xd0\xb0\xd1\x802\xd0\xb2\xd0\xb0\xd0\xbb 1\xd0\xb0\xd1\x80\xd0\xb3\xd1\x83 \xd0\xb01\xd1\x80\xd0\xb5 \xd0\xb0\xd1\x80\xd0\xb51\xd0\xb4\xd0\xb2 \xd0\xb0\xd1\x80\xd0\xb51\xd0\xbe\xd0\xbb \xd0\xb0\xd1\x802\xd0\xb6\xd0\xb0 \xd0\xb01\xd1\x80\xd0\xb8 \xd0\xb01\xd1\x80\xd0\xbe \xd0\xb0\xd1\x802\xd1\x82\xd0\xbe\xd1\x80 \xd0\xb0\xd1\x802\xd1\x821\xd1\x80 \xd0\xb01\xd1\x80\xd1\x83 \xd0\xb0\xd1\x801\xd1\x85 \xd0\xb01\xd1\x80\xd1\x8b \xd0\xb01\xd1\x80\xd1\x8e \xd0\xb01\xd1\x80\xd1\x8f 2\xd0\xb0\xd1\x811\xd0\xba \xd0\xb0\xd1\x813\xd0\xbc\xd0\xb8 \xd0\xb0\xd1\x813\xd0\xbd\xd0\xbe 1\xd0\xb0\xd1\x81\xd1\x81\xd0\xb8\xd0\xb3 \xd0\xb0\xd1\x81\xd1\x821\xd0\xb2\xd1\x83 \xd0\xb0\xd1\x813\xd1\x82\xd0\xb5\xd0\xbc \xd0\xb0\xd1\x812\xd1\x82\xd0\xb8\xd0\xbd \xd0\xb0\xd1\x812\xd1\x82\xd0\xb8\xd1\x8f \xd0\xb0\xd1\x811\xd1\x82\xd0\xbe\xd0\xbe \xd0\xb0\xd1\x811\xd1\x82\xd1\x83\xd1\x85 \xd0\xb01\xd1\x81\xd1\x82\xd1\x8c\xd0\xb5 \xd0\xb0\xd1\x812\xd1\x88\xd0\xb5\xd0\xb4 \xd0\xb0\xd1\x812\xd1\x88\xd0\xb5\xd1\x81 \xd0\xb01\xd1\x81\xd1\x8c\xd0\xb8 \xd0\xb01\xd1\x82\xd0\xb0 1\xd0\xb0\xd1\x82\xd0\xb0\xd0\xba \xd0\xb0\xd1\x823\xd0\xb2\xd0\xb0 \xd0\xb0\xd1\x821\xd0\xb2\xd0\xb8 \xd0\xb0\xd1\x821\xd0\xb2\xd1\x83 2\xd0\xb0\xd1\x82\xd0\xb5\xd0\xb7 \xd0\xb01\xd1\x82\xd0\xb8 \xd0\xb01\xd1\x82\xd0\xbe \xd0\xb0\xd1\x821\xd0\xbe\xd0\xb1\xd0\xb5 \xd0\xb02\xd1\x82\xd0\xbe\xd0\xbc\xd0\xbd \xd0\xb0\xd1\x82\xd0\xbe2\xd1\x88 \xd0\xb0\xd1\x821\xd1\x80\xd0\xb0\xd1\x85 \xd0\xb0\xd1\x821\xd1\x80\xd0\xb8 \xd0\xb01\xd1\x82\xd1\x83 \xd0\xb0\xd1\x822\xd1\x85 \xd0\xb01\xd1\x82\xd1\x8b \xd0\xb01\xd1\x82\xd1\x8c\xd0\xb5 \xd0\xb03\xd1\x82\xd1\x8c\xd1\x8e \xd0\xb03\xd1\x82\xd1\x8c\xd1\x8f \xd0\xb01\xd1\x82\xd1\x8e \xd0\xb01\xd1\x82\xd1\x8f \xd0\xb01\xd1\x83 \xd0\xb02\xd1\x83\xd0\xb1 \xd0\xb0\xd1\x832\xd0\xb4 \xd0\xb0\xd1\x833\xd0\xb4\xd0\xbe \xd0\xb02\xd1\x83\xd0\xbb\xd0\xb5 \xd0\xb0\xd1\x83\xd1\x821\xd1\x80 \xd0\xb0\xd1\x832\xd1\x85 \xd0\xb0\xd1\x832\xd1\x87 \xd0\xb0\xd1\x833\xd1\x87\xd1\x8c \xd0\xb0\xd1\x83\xd1\x8d1 \xd0\xb02\xd1\x841\xd0\xbb \xd0\xb0\xd1\x852\xd0\xb0 \xd0\xb0\xd1\x85\xd0\xbc\xd0\xb82 \xd0\xb0\xd1\x853\xd1\x81 \xd0\xb01\xd1\x87 2\xd0\xb0\xd1\x87\xd0\xb0 \xd0\xb02\xd1\x87\xd0\xbb \xd0\xb0\xd1\x871\xd1\x82 \xd0\xb02\xd1\x88\xd0\xbb \xd0\xb0\xd1\x8d2\xd0\xbb\xd0\xb8 \xd0\xb02\xd1\x8d\xd1\x80 \xd0\xb0\xd1\x8e1\xd1\x82\xd0\xb0 \xd0\xb01\xd1\x8f \xd0\xb0\xd1\x8f2\xd0\xb1 \xd0\xb0\xd1\x8f2\xd0\xb2 \xd0\xb0\xd1\x8f2\xd0\xb7 1\xd0\xb1\xd0\xb0 \xd0\xb1\xd0\xb02\xd0\xb1\xd0\xb2 \xd0\xb1\xd0\xb02\xd0\xb31\xd1\x80 \xd0\xb1\xd0\xb02\xd0\xb4\xd1\x80 \xd0\xb1\xd0\xb01\xd0\xb7 \xd0\xb1\xd0\xb03\xd0\xb7\xd1\x83 \xd0\xb1\xd0\xb0\xd0\xbb\xd1\x8e1 \xd0\xb1\xd0\xb02\xd0\xbe \xd0\xb1\xd0\xb0\xd1\x813\xd0\xbc \xd0\xb1\xd0\xb01\xd1\x81\xd1\x82 \xd0\xb1\xd0\xb01\xd1\x82\xd1\x80 2\xd0\xb11\xd0\xb1 \xd0\xb11\xd0\xb2 \xd0\xb1\xd0\xb2\xd1\x8b2 \xd0\xb1\xd0\xb32 2\xd0\xb11\xd0\xb4 1\xd0\xb1\xd0\xb5 3\xd0\xb1\xd0\xb5\xd0\xb2 \xd0\xb1\xd0\xb52\xd0\xb3\xd0\xbb \xd0\xb1\xd0\xb52\xd0\xb3\xd0\xbd \xd0\xb1\xd0\xb52\xd0\xb41\xd1\x80 3\xd0\xb1\xd0\xb5\xd0\xb5 3\xd0\xb1\xd0\xb52\xd0\xb7 \xd0\xb1\xd0\xb5\xd0\xb71\xd0\xb02 \xd0\xb1\xd0\xb5\xd0\xb75\xd0\xb44 \xd0\xb1\xd0\xb53\xd0\xb7\xd0\xb8 \xd0\xb1\xd0\xb5\xd0\xb73\xd0\xbd \xd0\xb1\xd0\xb5\xd0\xb71\xd0\xbe2 \xd0\xb1\xd0\xb5\xd0\xb71\xd1\x80 \xd0\xb1\xd0\xb52\xd1\x811\xd0\xba \xd0\xb1\xd0\xb5\xd1\x813\xd0\xbf \xd0\xb1\xd0\xb52\xd1\x811\xd1\x82 \xd0\xb1\xd0\xb5\xd1\x813\xd1\x82\xd0\xb5 \xd0\xb1\xd0\xb5\xd1\x813\xd1\x82\xd0\xb8 3\xd0\xb1\xd0\xb5\xd1\x86 2\xd0\xb1\xd0\xb5\xd1\x89 2\xd0\xb1\xd0\xb6 \xd0\xb11\xd0\xb72 1\xd0\xb12\xd0\xb8 3\xd0\xb1\xd0\xb8\xd0\xb0 \xd0\xb1\xd0\xb82\xd0\xb1 2\xd0\xb1\xd0\xb8\xd0\xb6 3\xd0\xb1\xd0\xb8\xd0\xba \xd0\xb1\xd0\xb8\xd0\xbb\xd0\xb83\xd1\x822 3\xd0\xb1\xd0\xb8\xd0\xbe \xd0\xb1\xd0\xb82\xd0\xbe\xd0\xb1 \xd0\xb1\xd0\xb82\xd0\xbe\xd0\xb4 \xd0\xb1\xd0\xb82\xd0\xbe\xd0\xbd \xd0\xb1\xd0\xb82\xd0\xbe\xd1\x80 \xd0\xb1\xd0\xb82\xd1\x82\xd0\xb2 \xd0\xb1\xd0\xb81\xd1\x85 2\xd0\xb13\xd0\xba \xd0\xb11\xd0\xbb 1\xd0\xb1\xd0\xbb\xd0\xb0\xd0\xb3 1\xd0\xb12\xd0\xbb\xd0\xb0\xd0\xb7 \xd0\xb13\xd0\xbb\xd0\xb0\xd0\xb7\xd0\xb8 \xd0\xb12\xd0\xbb\xd0\xb0\xd0\xbd 1\xd0\xb12\xd0\xbb\xd0\xb5\xd0\xb5 \xd0\xb13\xd0\xbb\xd0\xb5\xd0\xbd \xd0\xb12\xd0\xbb\xd0\xb5\xd1\x811\xd0\xba 1\xd0\xb12\xd0\xbb\xd0\xb5\xd1\x8f \xd0\xb12\xd0\xbb\xd1\x83\xd0\xb4 1\xd0\xb12\xd0\xbb\xd1\x83\xd0\xb6 2\xd0\xb1\xd0\xbb\xd1\x8b 2\xd0\xb12\xd0\xbb\xd1\x8c 2\xd0\xb13\xd0\xbb\xd1\x8e_ \xd0\xb12\xd0\xbb\xd1\x8e\xd0\xb4 \xd0\xb12\xd0\xbb\xd1\x8e\xd0\xb5 \xd0\xb12\xd0\xbb\xd1\x8e\xd0\xbb 2\xd0\xb13\xd0\xbb\xd1\x8e\xd1\x81\xd1\x8c 2\xd0\xb1\xd0\xbb\xd1\x8f 2\xd0\xb13\xd0\xbd 1\xd0\xb1\xd0\xbe \xd0\xb1\xd0\xbe1\xd0\xb1\xd1\x80\xd0\xb0 \xd0\xb1\xd0\xbe3\xd0\xb2\xd1\x88 \xd0\xb1\xd0\xbe2\xd0\xb3\xd0\xb4 \xd0\xb1\xd0\xbe1\xd0\xb4\xd1\x80\xd0\xb0 \xd0\xb1\xd0\xbe1\xd0\xb72 \xd0\xb1\xd0\xbe1\xd0\xbb2\xd0\xb6 \xd0\xb1\xd0\xbe1\xd0\xbb\xd1\x8c\xd1\x81 \xd0\xb1\xd0\xbe3\xd0\xbc2\xd0\xbb \xd0\xb1\xd0\xbe2\xd0\xbc\xd1\x87 \xd0\xb1\xd0\xbe3\xd0\xbc\xd1\x88 \xd0\xb1\xd0\xbe\xd0\xbd\xd1\x831 \xd0\xb1\xd0\xbe1\xd1\x80\xd1\x83 \xd0\xb1\xd0\xbe2\xd1\x81\xd0\xb0 \xd0\xb1\xd0\xbe1\xd1\x81\xd0\xba \xd0\xb1\xd0\xbe3\xd1\x81\xd0\xba\xd0\xbe \xd0\xb1\xd0\xbe3\xd1\x81\xd1\x82\xd0\xb8 3\xd0\xb1\xd0\xbe\xd1\x82 \xd0\xb1\xd0\xbe2\xd1\x82\xd0\xb2 \xd0\xb1\xd0\xbe\xd1\x822\xd1\x80 \xd0\xb1\xd0\xbe\xd1\x8f2\xd1\x80 2\xd0\xb1\xd1\x80_ \xd0\xb13\xd1\x80\xd0\xb0\xd0\xb1 \xd0\xb12\xd1\x80\xd0\xb0\xd0\xb2 \xd0\xb1\xd1\x80\xd0\xb01\xd0\xb7\xd0\xbe 1\xd0\xb12\xd1\x80\xd0\xb0\xd0\xbb 2\xd0\xb11\xd1\x80\xd0\xb0\xd0\xbc \xd0\xb12\xd1\x80\xd0\xb0\xd0\xbd 1\xd0\xb1\xd1\x80\xd0\xb0\xd1\x81 \xd0\xb12\xd1\x80\xd0\xb0\xd1\x82\xd1\x8c \xd0\xb11\xd1\x80\xd0\xb0\xd1\x85 1\xd0\xb12\xd1\x80\xd0\xb0\xd1\x87 2\xd0\xb13\xd1\x80\xd0\xb0\xd1\x8f 1\xd0\xb12\xd1\x80\xd0\xb5\xd0\xb4 \xd0\xb11\xd1\x80\xd0\xb5\xd0\xb9 \xd0\xb11\xd1\x80\xd0\xb5\xd0\xba \xd0\xb12\xd1\x80\xd0\xb5\xd0\xbc \xd0\xb12\xd1\x80\xd0\xb5\xd1\x85 \xd0\xb12\xd1\x80\xd0\xb8\xd0\xb4 \xd0\xb12\xd1\x80\xd0\xb8\xd1\x82\xd0\xbe \xd0\xb12\xd1\x80\xd0\xb8\xd1\x82\xd1\x8b 1\xd0\xb12\xd1\x80\xd0\xbe\xd0\xb4\xd0\xb8 \xd0\xb11\xd1\x80\xd0\xbe\xd0\xbb \xd0\xb11\xd1\x80\xd0\xbe\xd0\xbc_ 1\xd0\xb12\xd1\x80\xd0\xbe\xd1\x81\xd0\xb8 \xd0\xb1\xd1\x80\xd0\xbe2\xd1\x811\xd0\xba 2\xd0\xb1\xd1\x80\xd1\x81 \xd0\xb11\xd1\x80\xd1\x83 3\xd0\xb1\xd1\x80\xd1\x83\xd0\xba\xd1\x81 2\xd0\xb1\xd1\x80\xd1\x8c 1\xd0\xb12\xd1\x80\xd1\x8e 2\xd0\xb13\xd1\x80\xd1\x8e_ \xd0\xb11\xd1\x80\xd1\x8f 2\xd0\xb11\xd1\x812 \xd0\xb13\xd1\x81\xd0\xba \xd0\xb1\xd1\x814\xd0\xbb \xd0\xb11\xd1\x82 1\xd0\xb12\xd1\x83 \xd0\xb1\xd1\x832\xd0\xb31\xd1\x80 \xd0\xb1\xd1\x83\xd0\xba1\xd0\xbb \xd0\xb1\xd1\x831\xd1\x81 2\xd0\xb1\xd1\x84 2\xd0\xb11\xd1\x85 2\xd0\xb1\xd1\x86 2\xd0\xb11\xd1\x87 2\xd0\xb1\xd1\x88 2\xd0\xb1\xd1\x89 1\xd0\xb1\xd1\x8b \xd0\xb1\xd1\x8b2\xd0\xb31 \xd0\xb1\xd1\x8b2\xd1\x81 \xd0\xb1\xd1\x8b\xd1\x811\xd0\xba \xd0\xb1\xd1\x8b\xd1\x81\xd1\x821 1\xd0\xb1\xd1\x8c 2\xd0\xb1\xd1\x8c_ 2\xd0\xb1\xd1\x8c\xd1\x81 2\xd0\xb1\xd1\x8c\xd1\x82 \xd0\xb1\xd1\x8d1\xd1\x80 3\xd0\xb12\xd1\x8e \xd0\xb1\xd1\x8e1\xd1\x82\xd0\xb0 1\xd0\xb1\xd1\x8f 1\xd0\xb2\xd0\xb0 \xd0\xb2\xd0\xb02\xd0\xb1\xd1\x80 3\xd0\xb2\xd0\xb0\xd0\xb3 \xd0\xb2\xd0\xb02\xd0\xb41\xd1\x80 \xd0\xb2\xd0\xb0\xd0\xb4\xd1\x8c2 \xd0\xb2\xd0\xb03\xd0\xb62\xd0\xb4 \xd0\xb2\xd0\xb01\xd0\xb7 \xd0\xb2\xd0\xb0\xd0\xbd\xd1\x812 \xd0\xb2\xd0\xb01\xd1\x81\xd1\x82 \xd0\xb2\xd0\xb02\xd1\x81\xd1\x82\xd1\x80 \xd0\xb2\xd0\xb01\xd1\x82\xd1\x80 \xd0\xb2\xd0\xb0\xd1\x851 3\xd0\xb2\xd0\xb0\xd1\x86 3\xd0\xb2\xd0\xb0\xd1\x8f 2\xd0\xb21\xd0\xb1 \xd0\xb21\xd0\xb2\xd0\xb8 \xd0\xb21\xd0\xb2\xd1\x80 2\xd0\xb2\xd0\xb32 \xd0\xb21\xd0\xb4 \xd0\xb22\xd0\xb4\xd0\xbe\xd1\x85 1\xd0\xb2\xd0\xb5\xd0\xb2 3\xd0\xb2\xd0\xb5\xd0\xb3 \xd0\xb2\xd0\xb5\xd0\xb41\xd1\x80 \xd0\xb2\xd0\xb53\xd0\xb4\xd1\x83 1\xd0\xb2\xd0\xb5\xd0\xb5 1\xd0\xb2\xd0\xb5\xd0\xb7 3\xd0\xb2\xd0\xb5\xd0\xb7\xd0\xb5 3\xd0\xb2\xd0\xb5\xd0\xb7\xd0\xbb \xd0\xb2\xd0\xb5\xd0\xb72\xd1\x83 1\xd0\xb2\xd0\xb5\xd0\xb9_ \xd0\xb2\xd0\xb52\xd0\xbf1 2\xd0\xb2\xd0\xb5\xd1\x80\xd0\xb4 1\xd0\xb2\xd0\xb5\xd1\x81 \xd0\xb2\xd0\xb52\xd1\x811\xd0\xba \xd0\xb2\xd0\xb52\xd1\x81\xd1\x821\xd0\xb2 \xd0\xb2\xd0\xb5\xd1\x823\xd1\x80 1\xd0\xb2\xd0\xb5\xd1\x86 1\xd0\xb2\xd0\xb5\xd1\x8e 1\xd0\xb2\xd0\xb5\xd1\x8f 1\xd0\xb22\xd0\xb72 \xd0\xb2\xd0\xb7\xd0\xb32 \xd0\xb2\xd0\xb7\xd0\xb42 \xd0\xb2\xd0\xb7\xd0\xbe1\xd0\xb1 \xd0\xb2\xd0\xb7\xd1\x8a2 \xd0\xb2\xd0\xb7\xd1\x8a\xd0\xb53\xd0\xb4 \xd0\xb2\xd0\xb82\xd0\xb0\xd0\xb7 \xd0\xb2\xd0\xb82\xd0\xb0\xd0\xba \xd0\xb2\xd0\xb82\xd0\xb0\xd1\x80 \xd0\xb2\xd0\xb82\xd0\xb01\xd1\x812 \xd0\xb2\xd0\xb8\xd0\xb01\xd1\x82 \xd0\xb2\xd0\xb83\xd0\xb0\xd1\x84 \xd0\xb2\xd0\xb82\xd0\xb3\xd0\xb2 \xd0\xb2\xd0\xb82\xd0\xb3\xd0\xbb 1\xd0\xb2\xd0\xb8\xd0\xb7 1\xd0\xb2\xd0\xb8\xd0\xbd\xd1\x82 1\xd0\xb2\xd0\xb8\xd0\xbd\xd1\x87 \xd0\xb2\xd0\xb81\xd0\xbe \xd0\xb2\xd0\xb81\xd1\x812\xd0\xbd\xd0\xb8 \xd0\xb2\xd0\xb8\xd1\x833 \xd0\xb2\xd0\xb82\xd1\x84 2\xd0\xb21\xd0\xba \xd0\xb2\xd0\xba2\xd0\xbb 3\xd0\xb22\xd0\xba\xd1\x83\xd1\x81 \xd0\xb21\xd0\xbb \xd0\xb22\xd0\xbb\xd0\xb0 2\xd0\xb23\xd0\xbb\xd0\xb0\xd0\xb1 \xd0\xb22\xd0\xbb\xd0\xb5\xd0\xb2 \xd0\xb22\xd0\xbb\xd0\xb5\xd0\xba \xd0\xb22\xd0\xbb\xd0\xb5\xd1\x82 \xd0\xb22\xd0\xbb\xd0\xb5\xd1\x87 2\xd0\xb2\xd0\xbb\xd0\xb8 \xd0\xb22\xd0\xbb\xd0\xb8\xd1\x8f 2\xd0\xb2\xd0\xbb\xd1\x8e \xd0\xb22\xd0\xbb\xd1\x8e\xd0\xb1 2\xd0\xb2\xd0\xbb\xd1\x8f 2\xd0\xb2\xd0\xbc 1\xd0\xb2\xd0\xbc\xd0\xb5 2\xd0\xb21\xd0\xbd 4\xd0\xb23\xd0\xbd\xd0\xb0 \xd0\xb22\xd0\xbd\xd0\xb5\xd1\x81 \xd0\xb2\xd0\xbd\xd0\xbe1 \xd0\xb23\xd0\xbd\xd1\x83_ 3\xd0\xb22\xd0\xbd\xd1\x83\xd0\xba 3\xd0\xb22\xd0\xbd\xd1\x83\xd1\x87 \xd0\xb23\xd0\xbd\xd1\x8b \xd0\xb2\xd0\xbe1\xd0\xb12 \xd0\xb2\xd0\xbe2\xd0\xb13\xd0\xbb\xd0\xb0 \xd0\xb2\xd0\xbe\xd0\xb22 \xd0\xb2\xd0\xbe3\xd0\xb2\xd0\xba 1\xd0\xb2\xd0\xbe\xd0\xb4 \xd0\xb2\xd0\xbe1\xd0\xb4\xd0\xb2 \xd0\xb2\xd0\xbe1\xd0\xb4\xd1\x80 \xd0\xb2\xd0\xbe2\xd0\xb5\xd1\x80 \xd0\xb2\xd0\xbe2\xd0\xb6\xd0\xb6 \xd0\xb2\xd0\xbe\xd0\xb82\xd1\x811 1\xd0\xb2\xd0\xbe\xd0\xba \xd0\xb2\xd0\xbe3\xd0\xbc2 \xd0\xb2\xd0\xbe\xd0\xbf2 \xd0\xb2\xd0\xbe1\xd1\x80\xd1\x83 2\xd0\xb2\xd0\xbe\xd1\x80\xd1\x86 2\xd0\xb2\xd0\xbe\xd1\x80\xd1\x8c \xd0\xb2\xd0\xbe\xd1\x811\xd0\xba \xd0\xb2\xd0\xbe1\xd1\x81\xd0\xbc \xd0\xb2\xd0\xbe1\xd1\x81\xd0\xbd \xd0\xb2\xd0\xbe\xd1\x813\xd0\xbf\xd0\xb5 \xd0\xb2\xd0\xbe2\xd1\x81\xd1\x82\xd1\x80 \xd0\xb2\xd0\xbe\xd1\x822\xd1\x80 1\xd0\xb2\xd0\xbe\xd1\x85 \xd0\xb2\xd0\xbe1\xd1\x85\xd0\xbb \xd0\xb2\xd0\xbe3\xd1\x852\xd1\x82 1\xd0\xb2\xd0\xbe\xd1\x8e 2\xd0\xb2\xd0\xbf2 2\xd0\xb2\xd1\x80_ 2\xd0\xb2\xd1\x80\xd0\xb0_ \xd0\xb22\xd1\x80\xd0\xb0\xd0\xb2 2\xd0\xb21\xd1\x80\xd0\xb0\xd0\xbc \xd0\xb21\xd1\x80\xd0\xb0\xd1\x81 2\xd0\xb21\xd1\x80\xd0\xb0\xd1\x85 2\xd0\xb2\xd1\x80\xd0\xb0\xd1\x86 2\xd0\xb2\xd1\x80\xd0\xb5_ 2\xd0\xb21\xd1\x80\xd0\xb5\xd0\xbd 1\xd0\xb2\xd1\x80\xd0\xb8\xd0\xb4 1\xd0\xb22\xd1\x80\xd0\xb8\xd0\xb7 \xd0\xb21\xd1\x80\xd0\xb8\xd0\xb8 \xd0\xb21\xd1\x80\xd0\xb8\xd0\xba \xd0\xb21\xd1\x80\xd0\xb8\xd0\xbb \xd0\xb21\xd1\x80\xd0\xb8\xd1\x81 \xd0\xb21\xd1\x80\xd0\xb8\xd1\x82 2\xd0\xb21\xd1\x80\xd0\xbe \xd0\xb2\xd1\x80\xd0\xbe3\xd1\x822 2\xd0\xb21\xd1\x80\xd1\x8b 1\xd0\xb2\xd1\x80\xd1\x8e \xd0\xb21\xd1\x80\xd1\x8f 2\xd0\xb21\xd1\x812 3\xd0\xb2\xd1\x81\xd0\xb53 \xd0\xb23\xd1\x81\xd0\xba\xd0\xb0\xd1\x8f 4\xd0\xb23\xd1\x81\xd0\xba\xd0\xb8 4\xd0\xb23\xd1\x81\xd0\xba\xd1\x83 3\xd0\xb22\xd1\x81\xd0\xbf 3\xd0\xb22\xd1\x81\xd1\x8e \xd0\xb21\xd1\x822 \xd0\xb2\xd1\x82\xd0\xbe1\xd0\xb12 \xd0\xb2\xd1\x82\xd0\xbe3\xd1\x88 1\xd0\xb2\xd1\x83\xd0\xb0 \xd0\xb2\xd1\x833\xd0\xb3 1\xd0\xb2\xd1\x831\xd0\xb7 2\xd0\xb2\xd1\x83\xd0\xb8 2\xd0\xb2\xd1\x831\xd0\xba \xd0\xb2\xd1\x833\xd0\xbf \xd0\xb2\xd1\x831\xd1\x812 \xd0\xb2\xd1\x832\xd1\x851\xd0\xb0 \xd0\xb2\xd1\x83\xd1\x853\xd0\xb2 \xd0\xb2\xd1\x831\xd1\x87\xd0\xbb \xd0\xb2\xd1\x842 1\xd0\xb2\xd1\x85\xd0\xbe 2\xd0\xb2\xd1\x86 2\xd0\xb21\xd1\x87 2\xd0\xb2\xd1\x88 3\xd0\xb22\xd1\x88\xd0\xb8\xd0\xb2 2\xd0\xb2\xd1\x89 \xd0\xb2\xd1\x8a2 1\xd0\xb2\xd1\x8b \xd0\xb2\xd1\x8b3\xd0\xb32 \xd0\xb2\xd1\x8b3\xd0\xb7\xd0\xbd \xd0\xb2\xd1\x8b\xd0\xbf2 \xd0\xb2\xd1\x8b3\xd1\x822 \xd0\xb2\xd1\x8b\xd1\x852 \xd0\xb2\xd1\x8b3\xd1\x882\xd0\xbb 2\xd0\xb2\xd1\x8c_ 1\xd0\xb2\xd1\x8c\xd0\xb5 1\xd0\xb2\xd1\x8c\xd0\xb8\xd0\xbd 2\xd0\xb2\xd1\x8c\xd1\x81 2\xd0\xb2\xd1\x8c\xd1\x82 1\xd0\xb2\xd1\x8c\xd1\x8e 1\xd0\xb2\xd1\x8c\xd1\x8f 1\xd0\xb22\xd1\x8d1 1\xd0\xb22\xd1\x8e 1\xd0\xb2\xd1\x8f 1\xd0\xb3 \xd0\xb32\xd0\xb0 \xd0\xb3\xd0\xb01\xd0\xb7 \xd0\xb3\xd0\xb01\xd1\x81\xd1\x822 \xd0\xb3\xd0\xb02\xd1\x83 2\xd0\xb33\xd0\xb1 \xd0\xb3\xd0\xb1\xd0\xb02 \xd0\xb31\xd0\xb2\xd0\xb8 2\xd0\xb3\xd0\xb3 \xd0\xb33\xd0\xb4\xd0\xb0\xd0\xbd 2\xd0\xb33\xd0\xb4\xd0\xb8 3\xd0\xb3\xd0\xb5_ \xd0\xb3\xd0\xb52\xd0\xb11 \xd0\xb3\xd0\xb5\xd0\xbd\xd0\xbe1 \xd0\xb3\xd0\xb52\xd0\xbe\xd0\xb1 \xd0\xb3\xd0\xb52\xd0\xbe\xd0\xb4 \xd0\xb3\xd0\xb51\xd0\xbe\xd1\x80 2\xd0\xb33\xd0\xb6 2\xd0\xb31\xd0\xb7 \xd0\xb32\xd0\xb8 \xd0\xb3\xd0\xb82\xd0\xb1\xd0\xbb \xd0\xb3\xd0\xb83\xd0\xb1\xd1\x80 \xd0\xb3\xd0\xb82\xd0\xb3\xd1\x80 \xd0\xb3\xd0\xb81\xd1\x81\xd0\xbb \xd0\xb3\xd0\xb8\xd1\x81\xd1\x822 2\xd0\xb31\xd0\xba 2\xd0\xb3\xd0\xbb\xd0\xb0_ \xd0\xb32\xd0\xbb\xd0\xb0\xd0\xb2 \xd0\xb31\xd0\xbb\xd0\xb0\xd0\xb9 \xd0\xb31\xd0\xbb\xd0\xb0\xd0\xbc\xd0\xb8 2\xd0\xb3\xd0\xbb\xd0\xb0\xd1\x81\xd1\x8c 2\xd0\xb3\xd0\xbb\xd0\xb0\xd1\x8f \xd0\xb31\xd0\xbb\xd0\xb5 \xd0\xb32\xd0\xbb\xd0\xb5\xd1\x82 2\xd0\xb3\xd0\xbb\xd0\xb8_ \xd0\xb32\xd0\xbb\xd0\xb8\xd0\xbd 3\xd0\xb32\xd0\xbb\xd0\xb8\xd1\x84 2\xd0\xb3\xd0\xbb\xd0\xbe_ \xd0\xb33\xd0\xbb\xd0\xbe\xd0\xb1\xd0\xbb 2\xd0\xb3\xd0\xbb\xd0\xbe\xd0\xb2 2\xd0\xb3\xd0\xbb\xd0\xbe\xd0\xb3 2\xd0\xb3\xd0\xbb\xd0\xbe\xd0\xb5 2\xd0\xb3\xd0\xbb\xd0\xbe\xd0\xb9 2\xd0\xb3\xd0\xbb\xd0\xbe\xd1\x8e 2\xd0\xb3\xd0\xbb\xd1\x83\xd1\x8e 2\xd0\xb31\xd0\xbb\xd1\x8b \xd0\xb32\xd0\xbb\xd1\x8f\xd0\xb6 2\xd0\xb3\xd0\xbb\xd1\x8f\xd0\xba 2\xd0\xb33\xd0\xbc \xd0\xb32\xd0\xbd\xd0\xb0\xd0\xb2 \xd0\xb32\xd0\xbd\xd0\xb0\xd0\xbd \xd0\xb33\xd0\xbd\xd0\xb5_ \xd0\xb32\xd0\xbd\xd0\xb5\xd0\xb2 \xd0\xb33\xd0\xbd\xd0\xb5\xd0\xbd \xd0\xb33\xd0\xbd\xd0\xb5\xd0\xbf \xd0\xb33\xd0\xbd\xd0\xb5\xd1\x81 \xd0\xb32\xd0\xbd\xd0\xb8\xd1\x80 \xd0\xb3\xd0\xbd\xd0\xb8\xd1\x822\xd1\x80 \xd0\xb32\xd0\xbd\xd0\xbe\xd0\xb5 \xd0\xb32\xd0\xbd\xd0\xbe\xd0\xb8 \xd0\xb32\xd0\xbd\xd0\xbe\xd1\x81 \xd0\xb33\xd0\xbd\xd1\x8f \xd0\xb3\xd0\xbe1\xd0\xb12 \xd0\xb3\xd0\xbe2\xd0\xb2\xd0\xbb \xd0\xb3\xd0\xbe3\xd0\xb62\xd0\xb4 \xd0\xb3\xd0\xbe1\xd0\xb7 \xd0\xb3\xd0\xbe2\xd0\xb7\xd0\xbb \xd0\xb3\xd0\xbe\xd0\xb72\xd0\xbd \xd0\xb3\xd0\xbe\xd0\xb8\xd0\xb32 3\xd0\xb3\xd0\xbe\xd0\xb9 \xd0\xb32\xd0\xbe\xd0\xbb \xd0\xb3\xd0\xbe\xd0\xbc\xd0\xb82 \xd0\xb3\xd0\xbe2\xd1\x811\xd0\xb0 \xd0\xb3\xd0\xbe2\xd1\x81\xd0\xb4 \xd0\xb3\xd0\xbe1\xd1\x81\xd0\xba\xd0\xbb \xd0\xb3\xd0\xbe1\xd1\x81\xd0\xbd \xd0\xb3\xd0\xbe1\xd1\x81\xd0\xbf\xd0\xb0 2\xd0\xb3\xd0\xbe\xd1\x82\xd0\xb4 \xd0\xb3\xd0\xbe\xd1\x833\xd1\x82 \xd0\xb3\xd0\xbe1\xd1\x87\xd0\xbb 3\xd0\xb3\xd0\xbe\xd1\x8e 2\xd0\xb3\xd0\xbf 2\xd0\xb3\xd1\x80_ \xd0\xb31\xd1\x80\xd0\xb0\xd0\xb5 \xd0\xb31\xd1\x80\xd0\xb0\xd0\xb9 \xd0\xb31\xd1\x80\xd0\xb0\xd1\x80 \xd0\xb31\xd1\x80\xd0\xb5\xd0\xb3 \xd0\xb31\xd1\x80\xd0\xb5\xd0\xba \xd0\xb31\xd1\x80\xd0\xb5\xd1\x86 \xd0\xb3\xd1\x80\xd0\xb84\xd0\xb23\xd0\xbd \xd0\xb31\xd1\x80\xd0\xb8\xd0\xba \xd0\xb31\xd1\x80\xd0\xb8\xd0\xbb \xd0\xb31\xd1\x80\xd0\xb8\xd0\xbd \xd0\xb31\xd1\x80\xd0\xb8\xd1\x81 \xd0\xb31\xd1\x80\xd0\xb8\xd1\x87 \xd0\xb31\xd1\x80\xd0\xbe\xd0\xb2 \xd0\xb32\xd1\x80\xd0\xbe\xd0\xb7 \xd0\xb31\xd1\x80\xd0\xbe\xd0\xba \xd0\xb31\xd1\x80\xd0\xbe\xd0\xbd \xd0\xb31\xd1\x80\xd0\xbe\xd0\xbf \xd0\xb31\xd1\x80\xd0\xbe\xd1\x82 \xd0\xb31\xd1\x80\xd0\xbe\xd1\x84 \xd0\xb3\xd1\x80\xd1\x832\xd0\xbf \xd0\xb31\xd1\x80\xd1\x8b\xd0\xb2 2\xd0\xb3\xd1\x80\xd1\x8e \xd0\xb31\xd1\x80\xd1\x8f\xd0\xb5 \xd0\xb31\xd1\x80\xd1\x8f\xd0\xbb \xd0\xb31\xd1\x80\xd1\x8f\xd1\x82 2\xd0\xb33\xd1\x812 \xd0\xb34\xd1\x81\xd0\xb0 \xd0\xb34\xd1\x81\xd0\xb1 2\xd0\xb33\xd1\x82 \xd0\xb3\xd1\x831\xd0\xb2 \xd0\xb3\xd1\x831\xd1\x81 \xd0\xb3\xd1\x832\xd1\x811\xd0\xba 2\xd0\xb3\xd1\x84 2\xd0\xb31\xd1\x87 2\xd0\xb33\xd1\x88 2\xd0\xb33\xd1\x8d 1\xd0\xb4\xd0\xb0 \xd0\xb4\xd0\xb02\xd0\xb11 \xd0\xb4\xd0\xb02\xd0\xb3\xd0\xb5\xd0\xbd \xd0\xb4\xd0\xb02\xd0\xb3\xd1\x80 \xd0\xb4\xd0\xb01\xd0\xb7 \xd0\xb4\xd0\xb02\xd0\xbe \xd0\xb4\xd0\xb0\xd1\x81\xd1\x821\xd1\x80 \xd0\xb4\xd0\xb0\xd1\x821\xd1\x80 2\xd0\xb41\xd0\xb1 \xd0\xb4\xd0\xb22 \xd0\xb41\xd0\xb2\xd0\xb5 1\xd0\xb4\xd0\xb2\xd0\xb8 2\xd0\xb41\xd0\xb2\xd0\xb8\xd0\xb4 2\xd0\xb4\xd0\xb2\xd0\xb8\xd0\xb7 2\xd0\xb4\xd0\xb2\xd0\xb8\xd0\xbd\xd1\x82 2\xd0\xb4\xd0\xb2\xd0\xb8\xd0\xbd\xd1\x87 2\xd0\xb41\xd0\xb2\xd0\xb8\xd1\x81 2\xd0\xb41\xd0\xb2\xd0\xb8\xd1\x82 \xd0\xb43\xd0\xb2\xd0\xba \xd0\xb41\xd0\xb2\xd0\xbb 2\xd0\xb4\xd0\xb2\xd0\xbe\xd0\xb4 \xd0\xb41\xd0\xb2\xd0\xbe\xd0\xb7 1\xd0\xb4\xd0\xb2\xd0\xbe\xd1\x80\xd1\x8c 2\xd0\xb4\xd0\xb2\xd1\x8f 2\xd0\xb4\xd0\xb32 2\xd0\xb41\xd0\xb42 1\xd0\xb4\xd0\xb5 \xd0\xb4\xd0\xb51\xd0\xb12\xd0\xbb \xd0\xb4\xd0\xb51\xd0\xb12\xd1\x80 3\xd0\xb4\xd0\xb5\xd0\xb2\xd1\x80 3\xd0\xb4\xd0\xb5\xd0\xb7 \xd0\xb4\xd0\xb52\xd0\xb71\xd0\xb02 \xd0\xb4\xd0\xb52\xd0\xb7\xd0\xb8 \xd0\xb4\xd0\xb5\xd0\xb71\xd0\xbe2 \xd0\xb4\xd0\xb52\xd0\xb7\xd1\x83 \xd0\xb4\xd0\xb5\xd0\xb8\xd0\xbe2 \xd0\xb4\xd0\xb51\xd0\xba\xd0\xbb 3\xd0\xb4\xd0\xb5\xd0\xbc\xd0\xb5 \xd0\xb4\xd0\xb52\xd0\xbe\xd0\xb4 \xd0\xb4\xd0\xb5\xd0\xbe3\xd0\xbf \xd0\xb4\xd0\xb53\xd0\xbf\xd0\xbb \xd0\xb4\xd0\xb5\xd1\x80\xd0\xb0\xd1\x812 \xd0\xb4\xd0\xb52\xd1\x813\xd0\xb2 \xd0\xb4\xd0\xb5\xd1\x812\xd0\xba \xd0\xb4\xd0\xb52\xd1\x81\xd1\x80 \xd0\xb4\xd0\xb51\xd1\x85\xd0\xbb 2\xd0\xb4\xd0\xb6_ \xd0\xb42\xd0\xb6\xd0\xb0\xd0\xbc \xd0\xb42\xd0\xb63\xd0\xbc 2\xd0\xb4\xd0\xb6\xd1\x81 2\xd0\xb41\xd0\xb72 1\xd0\xb4\xd0\xb8 \xd0\xb4\xd0\xb82\xd0\xb0\xd0\xb4 \xd0\xb4\xd0\xb8\xd0\xb02\xd0\xb7 \xd0\xb4\xd0\xb82\xd0\xb0\xd0\xbb\xd0\xb8 \xd0\xb4\xd0\xb82\xd0\xb0\xd0\xbb\xd0\xbe \xd0\xb4\xd0\xb82\xd0\xb0\xd1\x80 \xd0\xb4\xd0\xb82\xd0\xb0\xd1\x81 \xd0\xb4\xd0\xb82\xd0\xbe\xd0\xb1 \xd0\xb4\xd0\xb8\xd0\xbe3\xd0\xb4\xd0\xb5 \xd0\xb4\xd0\xb82\xd0\xbe\xd1\x80 \xd0\xb4\xd0\xb8\xd0\xbe1\xd1\x81 \xd0\xb4\xd0\xb81\xd0\xbe\xd1\x82\xd0\xb8 \xd0\xb4\xd0\xb8\xd0\xbf2 \xd0\xb4\xd0\xb82\xd0\xbf\xd0\xb8 \xd0\xb4\xd0\xb83\xd0\xbf\xd1\x82 \xd0\xb4\xd0\xb82\xd1\x811\xd1\x82\xd1\x80 \xd0\xb4\xd0\xb8\xd1\x833 \xd0\xb4\xd0\xb83\xd1\x84\xd1\x80 \xd0\xb4\xd0\xb83\xd1\x84\xd1\x82\xd0\xbe \xd0\xb4\xd0\xb81\xd1\x85 2\xd0\xb41\xd0\xba \xd0\xb41\xd0\xbb \xd0\xb42\xd0\xbb\xd0\xb5\xd0\xb2 2\xd0\xb43\xd0\xbc2 2\xd0\xb41\xd0\xbd \xd0\xb43\xd0\xbd\xd0\xb0 \xd0\xb4\xd0\xbd\xd0\xb5\xd0\xb02 3\xd0\xb4\xd0\xbd\xd0\xb5\xd0\xb2\xd0\xbd 4\xd0\xb43\xd0\xbd\xd0\xbe1 \xd0\xb4\xd0\xbd\xd0\xbe3\xd0\xb42 \xd0\xb4\xd0\xbd\xd0\xbe\xd1\x812 4\xd0\xb43\xd0\xbd\xd1\x8b 3\xd0\xb42\xd0\xbd\xd1\x8f\xd1\x88 1\xd0\xb4\xd0\xbe 2\xd0\xb41\xd0\xbe2\xd0\xb1\xd0\xb5\xd0\xb4 \xd0\xb4\xd0\xbe2\xd0\xb1\xd0\xbb 2\xd0\xb41\xd0\xbe\xd0\xb1\xd0\xbb\xd0\xb0 \xd0\xb4\xd0\xbe1\xd0\xb12\xd1\x80\xd0\xb0 \xd0\xb4\xd0\xbe\xd0\xb22\xd0\xbb \xd0\xb4\xd0\xbe3\xd0\xb22\xd0\xbc \xd0\xb4\xd0\xbe1\xd0\xb42 \xd0\xb4\xd0\xbe3\xd0\xb4\xd0\xbd \xd0\xb4\xd0\xbe3\xd0\xb62\xd0\xb4 \xd0\xb4\xd0\xbe1\xd0\xb7 \xd0\xb4\xd0\xbe\xd0\xb72\xd0\xbd \xd0\xb4\xd0\xbe\xd0\xb82\xd1\x80 2\xd0\xb4\xd0\xbe\xd0\xba\xd1\x82 2\xd0\xb4\xd0\xbe\xd0\xbb\xd0\xb8\xd0\xbc \xd0\xb4\xd0\xbe2\xd0\xbc1\xd1\x80 \xd0\xb4\xd0\xbe\xd0\xbf2 \xd0\xb4\xd0\xbe3\xd0\xbf\xd0\xbb 2\xd0\xb4\xd0\xbe\xd0\xbf\xd0\xbb\xd0\xb5 \xd0\xb4\xd0\xbe2\xd0\xbf\xd1\x80\xd0\xb5 \xd0\xb4\xd0\xbe2\xd1\x80\xd1\x83\xd0\xb1 \xd0\xb4\xd0\xbe1\xd1\x81 \xd0\xb41\xd0\xbe2\xd1\x81\xd0\xb5\xd0\xbd \xd0\xb41\xd0\xbe2\xd1\x81\xd0\xb8\xd0\xbd 2\xd0\xb41\xd0\xbe\xd1\x81\xd0\xbd\xd0\xbe \xd0\xb4\xd0\xbe\xd1\x812\xd0\xbf 2\xd0\xb4\xd0\xbe\xd1\x82\xd0\xb4 2\xd0\xb4\xd0\xbe\xd1\x82\xd0\xbb \xd0\xb4\xd0\xbe\xd1\x822\xd1\x80\xd0\xb8 2\xd0\xb41\xd0\xbe\xd1\x82\xd1\x80\xd1\x8f 2\xd0\xb4\xd0\xbe\xd1\x82\xd1\x8a \xd0\xb4\xd0\xbe3\xd1\x82\xd1\x8c 3\xd0\xb4\xd0\xbe\xd1\x85\xd0\xbb \xd0\xb4\xd0\xbe2\xd1\x883\xd0\xb2 \xd0\xb4\xd0\xbe3\xd1\x882\xd0\xba \xd0\xb4\xd0\xbe2\xd1\x88\xd0\xbb\xd1\x8b \xd0\xb4\xd0\xbe2\xd1\x89\xd1\x83 2\xd0\xb4\xd0\xbf 2\xd0\xb4\xd1\x80_ \xd0\xb41\xd1\x80\xd0\xb0\xd0\xb1 1\xd0\xb4\xd1\x80\xd0\xb0\xd0\xb2\xd1\x88 2\xd0\xb4\xd1\x80\xd0\xb0\xd0\xb7\xd0\xb2 1\xd0\xb42\xd1\x80\xd0\xb0\xd0\xb7\xd0\xbd \xd0\xb41\xd1\x80\xd0\xb0\xd0\xbd\xd0\xb5 \xd0\xb41\xd1\x80\xd0\xb0\xd1\x80 \xd0\xb41\xd1\x80\xd0\xb02\xd1\x813 \xd0\xb41\xd1\x80\xd0\xb0\xd1\x85 \xd0\xb41\xd1\x80\xd0\xb0\xd1\x87 \xd0\xb42\xd1\x80\xd0\xb0\xd1\x8e \xd0\xb41\xd1\x80\xd0\xb5 \xd0\xb42\xd1\x80\xd0\xb5\xd0\xb1 2\xd0\xb43\xd1\x80\xd0\xb5\xd0\xb6 2\xd0\xb4\xd1\x80\xd0\xb5\xd0\xb7 \xd0\xb42\xd1\x80\xd0\xb5\xd0\xbb \xd0\xb42\xd1\x80\xd0\xb5\xd0\xbc 1\xd0\xb4\xd1\x80\xd0\xb5\xd0\xbc\xd0\xb0 1\xd0\xb4\xd1\x80\xd0\xb5\xd0\xbc\xd0\xbb \xd0\xb4\xd1\x80\xd0\xb5\xd0\xbc3\xd0\xbd 1\xd0\xb4\xd1\x80\xd0\xb5\xd0\xbc\xd1\x8b 2\xd0\xb43\xd1\x80\xd0\xb5\xd0\xbd \xd0\xb4\xd1\x80\xd0\xb52\xd1\x81\xd0\xba \xd0\xb42\xd1\x80\xd0\xb5\xd1\x81\xd1\x81 \xd0\xb41\xd1\x80\xd0\xb8 \xd0\xb42\xd1\x80\xd0\xb8\xd0\xb9 2\xd0\xb4\xd1\x80\xd0\xb8\xd0\xbd \xd0\xb42\xd1\x80\xd0\xb8\xd0\xbf \xd0\xb42\xd1\x80\xd0\xb8\xd1\x85 \xd0\xb4\xd1\x80\xd0\xbe2\xd0\xb33\xd0\xbd \xd0\xb41\xd1\x80\xd0\xbe\xd0\xb4 \xd0\xb41\xd1\x80\xd0\xbe\xd0\xb5 1\xd0\xb42\xd1\x80\xd0\xbe\xd0\xb6 2\xd0\xb43\xd1\x80\xd0\xbe\xd0\xb7 \xd0\xb41\xd1\x80\xd0\xbe\xd0\xb9 \xd0\xb41\xd1\x80\xd0\xbe\xd0\xbb \xd0\xb41\xd1\x80\xd0\xbe\xd0\xbd \xd0\xb41\xd1\x80\xd0\xbe\xd1\x81 \xd0\xb41\xd1\x80\xd0\xbe\xd1\x82 \xd0\xb41\xd1\x80\xd0\xbe\xd1\x8e \xd0\xb41\xd1\x80\xd1\x83\xd0\xb1 1\xd0\xb4\xd1\x80\xd1\x83\xd0\xb3 1\xd0\xb4\xd1\x80\xd1\x83\xd0\xb6 \xd0\xb41\xd1\x80\xd1\x83\xd0\xbc \xd0\xb41\xd1\x80\xd1\x83\xd1\x8e \xd0\xb41\xd1\x80\xd1\x8b 2\xd0\xb4\xd1\x80\xd1\x8b\xd0\xb2 1\xd0\xb42\xd1\x80\xd1\x8b\xd0\xb3 \xd0\xb41\xd1\x80\xd1\x8f \xd0\xb42\xd1\x80\xd1\x8f\xd0\xb1 1\xd0\xb42\xd1\x80\xd1\x8f\xd0\xb3 \xd0\xb42\xd1\x80\xd1\x8f\xd1\x85 2\xd0\xb41\xd1\x812 \xd0\xb4\xd1\x81\xd0\xba2 \xd0\xb4\xd1\x813\xd0\xba\xd0\xbd 2\xd0\xb41\xd1\x82 1\xd0\xb4\xd1\x83 \xd0\xb4\xd1\x83\xd0\xb13\xd1\x80 \xd0\xb4\xd1\x833\xd0\xb3 2\xd0\xb41\xd1\x83\xd0\xb4 \xd0\xb4\xd1\x832\xd0\xb4\xd0\xb0 \xd0\xb4\xd1\x832\xd0\xbe \xd0\xb4\xd1\x83\xd0\xbf1\xd0\xbb \xd0\xb4\xd1\x83\xd1\x811\xd0\xba \xd0\xb41\xd1\x83\xd1\x81\xd0\xbb \xd0\xb4\xd1\x831\xd1\x81\xd1\x82 \xd0\xb4\xd1\x832\xd1\x81\xd1\x82\xd0\xb0 2\xd0\xb4\xd1\x83\xd1\x821\xd1\x80 \xd0\xb4\xd1\x831\xd1\x85 \xd0\xb4\xd1\x832\xd1\x87\xd0\xb8 \xd0\xb4\xd1\x83\xd1\x8d1\xd1\x82 2\xd0\xb4\xd1\x84 \xd0\xb41\xd1\x85 2\xd0\xb43\xd1\x86\xd0\xb5 2\xd0\xb4\xd1\x86\xd1\x83 2\xd0\xb4\xd1\x86\xd1\x8b 2\xd0\xb41\xd1\x87 2\xd0\xb43\xd1\x882 2\xd0\xb4\xd1\x89 2\xd0\xb4\xd1\x8a \xd0\xb4\xd1\x8a\xd0\xb52\xd0\xbc 1\xd0\xb4\xd1\x8b 2\xd0\xb4\xd1\x8b\xd0\xb3 \xd0\xb4\xd1\x8b2\xd0\xb31\xd1\x80 2\xd0\xb4\xd1\x8b\xd0\xb4 2\xd0\xb4\xd1\x8b\xd0\xbc\xd0\xb5 2\xd0\xb4\xd1\x8b2\xd1\x811 2\xd0\xb4\xd1\x8b\xd1\x82 2\xd0\xb4\xd1\x8b\xd1\x89 2\xd0\xb4\xd1\x8c_ 1\xd0\xb4\xd1\x8c\xd0\xb5 2\xd0\xb4\xd1\x8c\xd0\xba 2\xd0\xb4\xd1\x8c\xd1\x82 1\xd0\xb4\xd1\x8c\xd1\x8e 1\xd0\xb4\xd1\x8c\xd1\x8f \xd0\xb4\xd1\x8c3\xd1\x8f\xd1\x80 1\xd0\xb42\xd1\x8e 1\xd0\xb4\xd1\x8f \xd0\xb51\xd0\xb0 \xd0\xb5\xd0\xb02\xd0\xb4 \xd0\xb5\xd0\xb0\xd0\xb4\xd0\xb83 \xd0\xb5\xd0\xb03\xd0\xb4\xd0\xbe \xd0\xb5\xd0\xb02\xd0\xb7 \xd0\xb5\xd0\xb0\xd0\xbd2\xd0\xb41\xd1\x80 \xd0\xb5\xd0\xb0\xd1\x821\xd1\x80 2\xd0\xb5\xd0\xb1 \xd0\xb5\xd0\xb1\xd0\xb02\xd1\x81 \xd0\xb51\xd0\xb1\xd1\x80\xd0\xb0 \xd0\xb5\xd0\xb11\xd1\x80\xd0\xb5\xd0\xbd \xd0\xb5\xd0\xb11\xd1\x80\xd0\xb8 \xd0\xb51\xd0\xb1\xd1\x80\xd0\xbe \xd0\xb5\xd0\xb11\xd1\x80\xd0\xbe\xd0\xb2 \xd0\xb5\xd0\xb11\xd1\x80\xd1\x8b \xd0\xb52\xd0\xb13\xd1\x80\xd1\x8e \xd0\xb51\xd0\xb2\xd0\xb5 2\xd0\xb5\xd0\xb2\xd0\xb5\xd1\x80 \xd0\xb51\xd0\xb2\xd0\xb8 \xd0\xb53\xd0\xb22\xd0\xbc\xd0\xb5 \xd0\xb5\xd0\xb22\xd0\xbd\xd0\xb8\xd0\xbc \xd0\xb5\xd0\xb22\xd0\xbd\xd1\x8f\xd1\x82 \xd0\xb51\xd0\xb2\xd0\xbe 2\xd0\xb5\xd0\xb2\xd0\xbe\xd0\xbb \xd0\xb5\xd0\xb2\xd1\x80\xd0\xb01\xd1\x81 2\xd0\xb51\xd0\xb2\xd1\x80\xd0\xb5 \xd0\xb5\xd0\xb21\xd1\x80\xd0\xb5\xd0\xb5 \xd0\xb5\xd0\xb21\xd1\x80\xd0\xb5\xd0\xb9 \xd0\xb5\xd0\xb21\xd1\x80\xd0\xb5\xd1\x8f \xd0\xb5\xd0\xb21\xd1\x80\xd0\xb8 \xd0\xb52\xd0\xb2\xd1\x82 \xd0\xb51\xd0\xb2\xd1\x83 \xd0\xb51\xd0\xb2\xd1\x85 \xd0\xb5\xd0\xb22\xd1\x85\xd0\xbe \xd0\xb51\xd0\xb2\xd1\x8c \xd0\xb5\xd0\xb3\xd0\xb01\xd1\x812 \xd0\xb5\xd0\xb32\xd0\xb4 \xd0\xb52\xd0\xb3\xd0\xbb\xd0\xb0\xd0\xbd \xd0\xb52\xd0\xb3\xd0\xbb\xd0\xb5 \xd0\xb52\xd0\xb3\xd0\xbb\xd0\xb8 \xd0\xb52\xd0\xb3\xd0\xbb\xd0\xbe \xd0\xb5\xd0\xb32\xd0\xbd\xd0\xb0 \xd0\xb5\xd0\xb32\xd0\xbd\xd0\xbe 2\xd0\xb5\xd0\xb32\xd1\x80 \xd0\xb5\xd0\xb41\xd0\xb2\xd0\xbe \xd0\xb5\xd0\xb42\xd0\xb6 \xd0\xb51\xd0\xb4\xd0\xb6\xd0\xb5 \xd0\xb51\xd0\xb42\xd0\xbb\xd0\xb8\xd0\xbd \xd0\xb5\xd0\xb4\xd0\xbd\xd0\xbe\xd1\x833 \xd0\xb5\xd0\xb41\xd0\xbe\xd0\xbf\xd1\x80 \xd0\xb52\xd0\xb4\xd0\xbe\xd1\x82\xd0\xb2 \xd0\xb52\xd0\xb4\xd0\xbe\xd1\x85 \xd0\xb52\xd0\xb41\xd0\xbe\xd1\x89 \xd0\xb51\xd0\xb4\xd1\x80\xd1\x83 \xd0\xb52\xd0\xb4\xd1\x80\xd1\x83_ \xd0\xb52\xd0\xb4\xd1\x832\xd0\xb1 \xd0\xb5\xd0\xb41\xd1\x83\xd0\xb1\xd0\xbe \xd0\xb52\xd0\xb4\xd1\x83\xd0\xb2\xd0\xb5 \xd0\xb52\xd0\xb4\xd1\x83\xd0\xb3 \xd0\xb52\xd0\xb4\xd1\x83\xd1\x81 \xd0\xb5\xd0\xb41\xd1\x83\xd1\x81\xd1\x82 2\xd0\xb53\xd0\xb4\xd1\x83\xd1\x88 \xd0\xb52\xd0\xb4\xd1\x8b\xd0\xbd \xd0\xb51\xd0\xb5 \xd0\xb52\xd0\xb5\xd0\xb2\xd0\xb8\xd0\xb4 \xd0\xb5\xd0\xb52\xd0\xb21\xd1\x80 \xd0\xb5\xd0\xb52\xd0\xb3\xd0\xb8 \xd0\xb5\xd0\xb51\xd1\x812 \xd0\xb5\xd0\xb52\xd1\x81\xd1\x82 \xd0\xb5\xd0\xb5\xd1\x81\xd1\x821\xd1\x80 \xd0\xb5\xd0\xb52\xd1\x85 \xd0\xb52\xd0\xb6\xd0\xb3 \xd0\xb54\xd0\xb6\xd0\xb4\xd0\xb5\xd0\xb2 \xd0\xb5\xd0\xb63\xd0\xb4\xd0\xb8 2\xd0\xb5\xd0\xb6\xd0\xb5 \xd0\xb52\xd0\xb61\xd1\x80 \xd0\xb5\xd0\xb7\xd0\xb02\xd0\xb2\xd1\x80 \xd0\xb5\xd0\xb7\xd0\xb0\xd1\x833 \xd0\xb51\xd0\xb72\xd0\xb2\xd0\xb0 \xd0\xb5\xd0\xb7\xd0\xb41\xd1\x80 \xd0\xb53\xd0\xb7\xd0\xb5 \xd0\xb5\xd0\xb7\xd0\xb7\xd1\x833 \xd0\xb53\xd0\xb7\xd0\xb8\xd1\x82 \xd0\xb5\xd0\xb71\xd0\xbe\xd0\xb1 \xd0\xb5\xd0\xb71\xd0\xbe2\xd0\xb3 \xd0\xb51\xd0\xb7\xd0\xbe\xd0\xbc \xd0\xb5\xd0\xb71\xd0\xbe\xd0\xbf \xd0\xb5\xd0\xb71\xd0\xbe2\xd1\x80 \xd0\xb5\xd0\xb71\xd0\xbe\xd1\x82 \xd0\xb5\xd0\xb71\xd0\xbe\xd1\x88 \xd0\xb5\xd0\xb72\xd1\x80\xd1\x8f \xd0\xb5\xd0\xb71\xd1\x832\xd0\xb4 \xd0\xb5\xd0\xb71\xd1\x832\xd0\xba \xd0\xb5\xd0\xb71\xd1\x83\xd0\xbf \xd0\xb5\xd0\xb71\xd1\x83\xd1\x81 \xd0\xb5\xd0\xb7\xd1\x832\xd1\x81\xd0\xbe \xd0\xb5\xd0\xb7\xd1\x832\xd1\x81\xd1\x8b \xd0\xb5\xd0\xb71\xd1\x832\xd1\x85 \xd0\xb5\xd0\xb71\xd1\x83\xd1\x87\xd0\xb0 \xd0\xb53\xd0\xb7\xd1\x8f \xd0\xb51\xd0\xb8 \xd0\xb5\xd0\xb82\xd0\xb31 \xd0\xb5\xd0\xb82\xd0\xb4 \xd0\xb5\xd0\xb82\xd0\xbc \xd0\xb5\xd0\xb82\xd0\xbe \xd0\xb5\xd0\xb8\xd1\x811\xd0\xbb \xd0\xb5\xd0\xb8\xd1\x811\xd1\x82\xd1\x80 \xd0\xb51\xd0\xba\xd0\xb0 \xd0\xb5\xd0\xba\xd0\xb02\xd0\xb1 \xd0\xb5\xd0\xba2\xd0\xb7 \xd0\xb51\xd0\xba\xd0\xb8 2\xd0\xb51\xd0\xba\xd0\xbe 2\xd0\xb51\xd0\xba\xd1\x80 \xd0\xb5\xd0\xba2\xd1\x80\xd0\xbe \xd0\xb5\xd0\xba1\xd1\x81\xd0\xba \xd0\xb5\xd0\xba1\xd1\x81\xd1\x82\xd0\xb5 \xd0\xb51\xd0\xba\xd1\x83 \xd0\xb51\xd0\xbb\xd0\xb0 \xd0\xb51\xd0\xbb\xd0\xb5 \xd0\xb5\xd0\xbb\xd0\xb53\xd1\x81\xd0\xba \xd0\xb5\xd0\xbb\xd0\xb51\xd1\x81\xd1\x86 \xd0\xb51\xd0\xbb\xd1\x83 \xd0\xb51\xd0\xbb\xd1\x8b \xd0\xb51\xd0\xbb\xd1\x8e \xd0\xb53\xd0\xbb\xd1\x8f \xd0\xb5\xd0\xbc\xd0\xb83\xd0\xb42 \xd0\xb5\xd0\xbc\xd0\xb83\xd0\xba \xd0\xb5\xd0\xbc\xd0\xbe1\xd1\x81 2\xd0\xb5\xd0\xbc\xd1\x83\xd0\xb6 \xd0\xb52\xd0\xbc\xd1\x87 2\xd0\xb5\xd0\xbc\xd1\x8b\xd1\x81 \xd0\xb53\xd0\xbd\xd0\xb0 \xd0\xb5\xd0\xbd2\xd0\xb41\xd1\x80 2\xd0\xb51\xd0\xbd\xd1\x80 \xd0\xb5\xd0\xbd\xd1\x812 \xd0\xb5\xd0\xbd3\xd1\x882 \xd0\xb51\xd0\xbd\xd1\x8d 2\xd0\xb5\xd0\xbe \xd0\xb51\xd0\xbe2\xd0\xb1 \xd0\xb5\xd0\xbe\xd0\xb12\xd1\x80\xd0\xbe \xd0\xb52\xd0\xbe3\xd0\xb3\xd0\xbb \xd0\xb5\xd0\xbe2\xd0\xb3\xd1\x80\xd0\xbe \xd0\xb51\xd0\xbe\xd0\xb4 \xd0\xb5\xd0\xbe3\xd0\xb4\xd0\xb0 \xd0\xb5\xd0\xbe2\xd0\xb4\xd0\xb5 \xd0\xb5\xd0\xbe\xd0\xb4\xd0\xb53\xd0\xb7 \xd0\xb5\xd0\xbe2\xd0\xb4\xd0\xbe \xd0\xb51\xd0\xbe2\xd0\xb6 \xd0\xb52\xd0\xbe\xd0\xb8 \xd0\xb5\xd0\xbe3\xd0\xba\xd0\xbb \xd0\xb51\xd0\xbe\xd0\xbb_ \xd0\xb51\xd0\xbe\xd0\xbb\xd0\xb0 \xd0\xb5\xd0\xbe3\xd0\xbb\xd0\xb8 \xd0\xb51\xd0\xbe\xd0\xbb\xd0\xba \xd0\xb51\xd0\xbe\xd0\xbb\xd1\x8b \xd0\xb51\xd0\xbe\xd0\xbb\xd1\x8c \xd0\xb52\xd0\xbe\xd0\xbc \xd0\xb51\xd0\xbe\xd0\xbd_ \xd0\xb52\xd0\xbe\xd0\xbd\xd0\xb0 \xd0\xb52\xd0\xbe\xd0\xbd\xd0\xb8 \xd0\xb5\xd0\xbe3\xd0\xbd\xd0\xbe \xd0\xb51\xd0\xbe\xd0\xbd\xd1\x81 \xd0\xb5\xd0\xbe\xd0\xbf2 \xd0\xb51\xd0\xbe\xd0\xbf\xd0\xb5 \xd0\xb5\xd0\xbe2\xd0\xbf\xd1\x80 \xd0\xb5\xd0\xbe4\xd0\xbf\xd1\x83 \xd0\xb52\xd0\xbe3\xd1\x80\xd0\xbe \xd0\xb5\xd0\xbe\xd1\x812 \xd0\xb51\xd0\xbe2\xd1\x81\xd0\xb2\xd0\xb8 \xd0\xb5\xd0\xbe1\xd1\x81\xd0\xba \xd0\xb51\xd0\xbe\xd1\x81\xd0\xbc \xd0\xb51\xd0\xbe\xd1\x81\xd0\xbd \xd0\xb5\xd0\xbe\xd1\x81\xd1\x821\xd1\x80 \xd0\xb5\xd0\xbe3\xd1\x81\xd1\x85 \xd0\xb51\xd0\xbe\xd1\x82\xd0\xbb \xd0\xb5\xd0\xbe\xd1\x822\xd1\x80\xd1\x83 \xd0\xb51\xd0\xbe2\xd1\x87 \xd0\xb51\xd0\xbe2\xd1\x89 \xd0\xb5\xd0\xbf\xd0\xb0\xd1\x822 \xd0\xb5\xd0\xbf\xd0\xb01\xd1\x82\xd1\x80 2\xd0\xb5\xd0\xbf\xd0\xb5 \xd0\xb5\xd0\xbf\xd0\xb8\xd1\x812\xd0\xba \xd0\xb52\xd0\xbf\xd0\xbb \xd0\xb53\xd0\xbf\xd0\xbb\xd0\xb0 \xd0\xb5\xd0\xbf1\xd0\xbb\xd0\xb5\xd1\x88 \xd0\xb53\xd0\xbf2\xd0\xbb\xd0\xbe\xd0\xb4 \xd0\xb5\xd0\xbf1\xd0\xbb\xd1\x83 \xd0\xb53\xd0\xbf\xd0\xbb\xd1\x8b \xd0\xb5\xd0\xbf1\xd0\xbb\xd1\x8e\xd1\x89 \xd0\xb54\xd0\xbf\xd0\xbd 2\xd0\xb5\xd0\xbf\xd0\xbe \xd0\xb54\xd0\xbf3\xd1\x81 \xd0\xb54\xd0\xbf\xd1\x82 \xd0\xb51\xd1\x80\xd0\xb0 \xd0\xb5\xd1\x801\xd0\xb0\xd0\xba\xd1\x82 \xd0\xb52\xd1\x80\xd0\xb2 \xd0\xb5\xd1\x801\xd0\xb2\xd0\xb5 \xd0\xb51\xd1\x80\xd0\xb5 \xd0\xb53\xd1\x80\xd0\xb5_ \xd0\xb5\xd1\x80\xd0\xb53\xd0\xb4\xd0\xbe \xd0\xb5\xd1\x80\xd0\xb51\xd0\xb4\xd1\x80 \xd0\xb5\xd1\x80\xd0\xb51\xd0\xba2 \xd0\xb5\xd1\x80\xd0\xb53\xd0\xbc2\xd0\xbd \xd0\xb5\xd1\x80\xd0\xb53\xd0\xbf \xd0\xb5\xd1\x80\xd0\xb51\xd1\x854 \xd0\xb51\xd1\x80\xd0\xb8 \xd0\xb5\xd1\x80\xd0\xb8\xd0\xbe3\xd0\xb7 \xd0\xb51\xd1\x80\xd0\xbe \xd0\xb5\xd1\x80\xd0\xbe2\xd0\xb1 \xd0\xb5\xd1\x801\xd0\xbe\xd0\xb1\xd0\xbb 2\xd0\xb5\xd1\x80\xd0\xbe\xd0\xb2\xd0\xb8 2\xd0\xb5\xd1\x80\xd0\xbe\xd0\xba\xd1\x80 2\xd0\xb5\xd1\x80\xd0\xbe\xd0\xbb \xd0\xb5\xd1\x80\xd0\xbe3\xd1\x842 \xd0\xb5\xd1\x803\xd1\x81\xd0\xba \xd0\xb51\xd1\x80\xd1\x83 \xd0\xb52\xd1\x801\xd1\x832\xd0\xbf \xd0\xb51\xd1\x80\xd1\x8b \xd0\xb51\xd1\x80\xd1\x8e \xd0\xb51\xd1\x80\xd1\x8f \xd0\xb53\xd1\x812\xd0\xb0 \xd0\xb5\xd1\x812\xd0\xb1\xd0\xb0 \xd0\xb51\xd1\x81\xd0\xb3 \xd0\xb51\xd1\x81\xd0\xba \xd0\xb52\xd1\x811\xd0\xba\xd0\xb0_ \xd0\xb5\xd1\x811\xd0\xba\xd0\xb0\xd0\xbb \xd0\xb52\xd1\x81\xd0\xba\xd0\xb5 \xd0\xb52\xd1\x81\xd0\xba\xd0\xbe\xd0\xb2 \xd0\xb54\xd1\x811\xd0\xba\xd1\x83_ 2\xd0\xb5\xd1\x81\xd0\xbb \xd0\xb5\xd1\x811\xd0\xbb\xd0\xb0\xd1\x81 \xd0\xb5\xd1\x812\xd0\xbb\xd0\xb8\xd0\xbd \xd0\xb5\xd1\x812\xd0\xbb\xd0\xbe\xd0\xb2 \xd0\xb5\xd1\x812\xd0\xbb\xd0\xbe\xd0\xbc \xd0\xb51\xd1\x81\xd0\xbb\xd1\x83 \xd0\xb51\xd1\x81\xd0\xbb\xd1\x8b \xd0\xb51\xd1\x814\xd0\xbc \xd0\xb53\xd1\x81\xd0\xbe 2\xd0\xb5\xd1\x81\xd0\xbf \xd0\xb5\xd1\x812\xd0\xbf\xd0\xb5\xd0\xba \xd0\xb5\xd1\x813\xd0\xbf\xd0\xbe\xd0\xbb \xd0\xb52\xd1\x81\xd0\xbf\xd1\x83 \xd0\xb51\xd1\x81\xd1\x82 \xd0\xb5\xd1\x812\xd1\x82\xd0\xb0\xd0\xbd \xd0\xb52\xd1\x81\xd1\x82\xd0\xbb \xd0\xb53\xd1\x81\xd1\x82\xd1\x83 \xd0\xb5\xd1\x812\xd1\x87\xd0\xb5\xd1\x82 \xd0\xb51\xd1\x82\xd0\xb0 \xd0\xb5\xd1\x821\xd0\xb2\xd0\xb5 \xd0\xb5\xd1\x821\xd0\xb2\xd0\xb8 \xd0\xb51\xd1\x82\xd0\xb2\xd0\xbe 2\xd0\xb5\xd1\x82\xd0\xb5\xd1\x87 \xd0\xb51\xd1\x82\xd0\xb8 \xd0\xb51\xd1\x82\xd0\xbe \xd0\xb5\xd1\x82\xd0\xbe1\xd1\x81 \xd0\xb5\xd1\x821\xd1\x80 \xd0\xb5\xd1\x822\xd1\x80\xd1\x8f \xd0\xb51\xd1\x82\xd1\x83 \xd0\xb51\xd1\x82\xd1\x8b \xd0\xb51\xd1\x82\xd1\x8c\xd0\xb5 \xd0\xb53\xd1\x82\xd1\x8c\xd1\x8e \xd0\xb53\xd1\x82\xd1\x8c\xd1\x8f \xd0\xb51\xd1\x82\xd1\x8e \xd0\xb51\xd1\x82\xd1\x8f \xd0\xb51\xd1\x832 2\xd0\xb5\xd1\x83\xd0\xb1 \xd0\xb5\xd1\x83\xd0\xb13\xd1\x80 \xd0\xb5\xd1\x83\xd0\xb72 \xd0\xb5\xd1\x83\xd0\xba2\xd0\xbb\xd0\xbe \xd0\xb5\xd1\x84\xd0\xb83\xd0\xb12 \xd0\xb5\xd1\x842\xd0\xbb \xd0\xb5\xd1\x841\xd1\x80\xd0\xb5 \xd0\xb5\xd1\x85\xd0\xb02\xd1\x82 \xd0\xb5\xd1\x851\xd0\xb0\xd1\x82\xd0\xbe \xd0\xb5\xd1\x853\xd0\xb2\xd0\xb0\xd0\xbb \xd0\xb5\xd1\x853\xd0\xbb\xd0\xbe\xd0\xbf \xd0\xb5\xd1\x851\xd0\xbe\xd0\xb1 \xd0\xb5\xd1\x851\xd0\xbe\xd0\xbf\xd0\xbe \xd0\xb5\xd1\x851\xd1\x80\xd0\xb5 \xd0\xb5\xd1\x851\xd1\x80\xd1\x83 \xd0\xb5\xd1\x851\xd1\x832\xd1\x87 2\xd0\xb5\xd1\x86\xd0\xb2 \xd0\xb51\xd1\x87\xd0\xbb \xd0\xb52\xd1\x88\xd0\xbb \xd0\xb5\xd1\x8d2 \xd0\xb5\xd1\x8e2\xd0\xb3 \xd0\xb51\xd1\x8f \xd0\xb5\xd1\x8f2\xd0\xb7 1\xd0\xb6 \xd0\xb6\xd0\xb02\xd0\xb1\xd0\xbb \xd0\xb6\xd0\xb02\xd0\xb1\xd1\x80 \xd0\xb6\xd0\xb01\xd0\xb7 \xd0\xb6\xd0\xb0\xd1\x821\xd0\xb2 2\xd0\xb61\xd0\xb12 2\xd0\xb61\xd0\xb2 \xd0\xb6\xd0\xb32 2\xd0\xb6\xd0\xb3\xd0\xb0 \xd0\xb62\xd0\xb3\xd0\xb8 3\xd0\xb62\xd0\xb3\xd0\xbb \xd0\xb62\xd0\xb3\xd1\x83 2\xd0\xb61\xd0\xb4 \xd0\xb62\xd0\xb4\xd0\xb0\xd0\xba \xd0\xb62\xd0\xb4\xd0\xb0\xd1\x87 3\xd0\xb62\xd0\xb4\xd0\xb5\xd0\xbb 4\xd0\xb6\xd0\xb4\xd0\xb5\xd0\xbc\xd0\xb5 \xd0\xb62\xd0\xb4\xd0\xb5\xd0\xbf \xd0\xb62\xd0\xb4\xd0\xb8 4\xd0\xb62\xd0\xb4\xd0\xbb \xd0\xb6\xd0\xb4\xd0\xbe3 \xd0\xb6\xd0\xb4\xd1\x831 4\xd0\xb6\xd0\xb4\xd1\x8c 3\xd0\xb62\xd0\xb4\xd1\x8f 3\xd0\xb6\xd0\xb5\xd0\xb2 \xd0\xb6\xd0\xb53\xd0\xb42 \xd0\xb6\xd0\xb51\xd0\xba2\xd0\xb2 \xd0\xb6\xd0\xb51\xd0\xba\xd0\xbb \xd0\xb6\xd0\xb51\xd0\xbe2 \xd0\xb6\xd0\xb53\xd0\xbf2 \xd0\xb6\xd0\xb51\xd1\x812 \xd0\xb6\xd0\xb53\xd1\x81\xd0\xba 2\xd0\xb6\xd0\xb6\xd0\xb0 \xd0\xb62\xd0\xb6\xd0\xb5 2\xd0\xb6\xd0\xb6\xd0\xb5\xd0\xb2 2\xd0\xb61\xd0\xb72 \xd0\xb6\xd0\xb81\xd0\xbe 2\xd0\xb6\xd0\xb8\xd1\x80\xd1\x80 2\xd0\xb61\xd0\xba 2\xd0\xb61\xd0\xbb \xd0\xb62\xd0\xbc \xd0\xb63\xd0\xbc\xd0\xb0 2\xd0\xb63\xd0\xbc\xd0\xbe 2\xd0\xb61\xd0\xbd \xd0\xb6\xd0\xbd\xd0\xbe1 2\xd0\xb61\xd0\xbe\xd0\xb1 2\xd0\xb61\xd0\xbe2\xd1\x821 \xd0\xb6\xd0\xbe\xd1\x833 \xd0\xb6\xd0\xbe\xd1\x831\xd1\x81 2\xd0\xb6\xd0\xbf2 \xd0\xb6\xd0\xbf\xd0\xbe1 \xd0\xb62\xd1\x80\xd1\x83 2\xd0\xb61\xd1\x81 2\xd0\xb6\xd1\x84 2\xd0\xb6\xd1\x86 2\xd0\xb61\xd1\x87 2\xd0\xb6\xd1\x8a 2\xd0\xb6\xd1\x8c_ 2\xd0\xb6\xd1\x8c\xd1\x81 2\xd0\xb6\xd1\x8c\xd1\x82 1\xd0\xb7\xd0\xb01 \xd0\xb7\xd0\xb0\xd0\xb02 \xd0\xb7\xd0\xb0\xd0\xb12 \xd0\xb7\xd0\xb02\xd0\xb21\xd1\x80\xd0\xb8 \xd0\xb7\xd0\xb02\xd0\xb2\xd1\x80\xd1\x83 \xd0\xb71\xd0\xb0\xd0\xb2\xd1\x83 \xd0\xb7\xd0\xb0\xd0\xb34 \xd0\xb71\xd0\xb0\xd0\xb4\xd1\x80 \xd0\xb7\xd0\xb0\xd0\xb52\xd0\xb4 \xd0\xb7\xd0\xb0\xd0\xb52\xd1\x85 \xd0\xb7\xd0\xb03\xd0\xb62\xd0\xb4 \xd0\xb7\xd0\xb03\xd0\xb72 \xd0\xb71\xd0\xb0\xd0\xba\xd1\x82 \xd0\xb7\xd0\xb03\xd0\xbc\xd0\xbd\xd0\xb5 3\xd0\xb72\xd0\xb0\xd0\xbd \xd0\xb7\xd0\xb03\xd0\xbd\xd0\xb0 \xd0\xb7\xd0\xb0\xd0\xbd\xd1\x812 \xd0\xb7\xd0\xb0\xd0\xbf2 \xd0\xb7\xd0\xb0\xd1\x802\xd0\xb2 \xd0\xb7\xd0\xb03\xd1\x802\xd0\xb4 \xd0\xb7\xd0\xb0\xd1\x802\xd0\xb6 \xd0\xb7\xd0\xb0\xd1\x812 \xd0\xb7\xd0\xb0\xd1\x81\xd1\x822 \xd0\xb7\xd0\xb0\xd1\x822 \xd0\xb7\xd0\xb03\xd1\x82\xd0\xba \xd0\xb7\xd0\xb0\xd1\x832 \xd0\xb7\xd0\xb0\xd1\x852 \xd0\xb7\xd0\xb0\xd1\x872\xd1\x82 \xd0\xb7\xd0\xb03\xd1\x882 \xd0\xb7\xd0\xb0\xd1\x8f2 \xd0\xb71\xd0\xb12 2\xd0\xb73\xd0\xb2\xd0\xb0_ \xd0\xb72\xd0\xb2\xd0\xb0\xd0\xb2 \xd0\xb73\xd0\xb2\xd0\xb0\xd0\xbb\xd1\x8c \xd0\xb72\xd0\xb2\xd0\xb0\xd0\xbd 2\xd0\xb7\xd0\xb2\xd0\xb0\xd1\x8f \xd0\xb71\xd0\xb2\xd0\xb5 \xd0\xb72\xd0\xb2\xd0\xb5\xd0\xb7 \xd0\xb71\xd0\xb2\xd0\xb8 \xd0\xb73\xd0\xb22\xd0\xba \xd0\xb71\xd0\xb2\xd0\xbb\xd0\xb0 \xd0\xb71\xd0\xb2\xd0\xbe 2\xd0\xb7\xd0\xb2\xd0\xbe\xd0\xbb 1\xd0\xb72\xd0\xb2\xd0\xbe\xd0\xbd \xd0\xb71\xd0\xb2\xd1\x80 1\xd0\xb7\xd0\xb2\xd1\x83 2\xd0\xb71\xd0\xb2\xd1\x83\xd1\x8e \xd0\xb71\xd0\xb2\xd1\x8c 2\xd0\xb7\xd0\xb3 \xd0\xb73\xd0\xb3\xd0\xb0 \xd0\xb72\xd0\xb3\xd0\xbb\xd0\xb8 \xd0\xb7\xd0\xb32\xd0\xbd\xd0\xb0 \xd0\xb72\xd0\xb3\xd0\xbd\xd1\x83 \xd0\xb71\xd0\xb42\xd0\xb2 \xd0\xb72\xd0\xb4\xd0\xb5\xd1\x88 \xd0\xb7\xd0\xb4\xd0\xbe\xd0\xb63 1\xd0\xb7\xd0\xb5 \xd0\xb7\xd0\xb52\xd0\xb11 \xd0\xb7\xd0\xb52\xd0\xb5\xd0\xb2 \xd0\xb7\xd0\xb52\xd0\xbe\xd0\xb4 2\xd0\xb7\xd0\xb62 \xd0\xb73\xd0\xb72 1\xd0\xb7\xd0\xb8 3\xd0\xb7\xd0\xb8_ 3\xd0\xb7\xd0\xb8\xd0\xb9_ \xd0\xb71\xd0\xb8\xd0\xbd\xd1\x82 \xd0\xb7\xd0\xb82\xd0\xbe\xd0\xb7 \xd0\xb7\xd0\xb82\xd0\xbe\xd0\xbd\xd0\xbe \xd0\xb7\xd0\xb81\xd0\xbe\xd0\xbf 3\xd0\xb7\xd0\xb8\xd1\x81 \xd0\xb7\xd0\xb83\xd1\x822\xd1\x80 \xd0\xb7\xd0\xb8\xd1\x833\xd0\xbc 3\xd0\xb7\xd0\xb8\xd1\x87 2\xd0\xb71\xd0\xba \xd0\xb7\xd0\xba\xd0\xbe1 \xd0\xb7\xd0\xba\xd0\xbe3\xd0\xbf2 \xd0\xb71\xd0\xbb \xd0\xb72\xd0\xbb\xd0\xb0\xd1\x89 \xd0\xb72\xd0\xbb\xd0\xbe\xd0\xb1 \xd0\xb72\xd0\xbb\xd0\xbe\xd0\xbf \xd0\xb72\xd0\xbb\xd0\xbe\xd1\x80 \xd0\xb72\xd0\xbb\xd1\x8e\xd1\x89 2\xd0\xb7\xd0\xbc2 \xd0\xb73\xd0\xbc\xd0\xbd \xd0\xb71\xd0\xbd 2\xd0\xb7\xd0\xbd\xd0\xb0_ \xd0\xb72\xd0\xbd\xd0\xb0\xd0\xb2 \xd0\xb72\xd0\xbd\xd0\xb0\xd0\xb5 \xd0\xb72\xd0\xbd\xd0\xb0\xd0\xb9 \xd0\xb72\xd0\xbd\xd0\xb0\xd0\xba \xd0\xb72\xd0\xbd\xd0\xb0\xd0\xbd \xd0\xb72\xd0\xbd\xd0\xb0\xd1\x82 \xd0\xb72\xd0\xbd\xd0\xb0\xd1\x8e 2\xd0\xb7\xd0\xbd\xd0\xb0\xd1\x8f 2\xd0\xb7\xd0\xbd\xd0\xb5 2\xd0\xb73\xd0\xbd\xd0\xb8 2\xd0\xb7\xd0\xbd\xd0\xbe 2\xd0\xb7\xd0\xbd\xd1\x83 2\xd0\xb73\xd0\xbd\xd1\x8b \xd0\xb72\xd0\xbe\xd0\xb1\xd0\xb5 \xd0\xb7\xd0\xbe2\xd0\xb1\xd0\xb8 1\xd0\xb7\xd0\xbe\xd0\xb2 \xd0\xb7\xd0\xbe3\xd0\xb22\xd0\xbc \xd0\xb7\xd0\xbe2\xd0\xb3\xd0\xbb \xd0\xb7\xd0\xbe1\xd0\xb4\xd1\x80 1\xd0\xb7\xd0\xbe\xd0\xb5 \xd0\xb7\xd0\xbe1\xd0\xb72 1\xd0\xb7\xd0\xbe\xd0\xb8 1\xd0\xb7\xd0\xbe\xd0\xb9_ 1\xd0\xb7\xd0\xbe\xd0\xba_ \xd0\xb71\xd0\xbe\xd0\xba\xd1\x81 1\xd0\xb7\xd0\xbe\xd0\xbb2 \xd0\xb7\xd0\xbe1\xd0\xbb\xd0\xb3 \xd0\xb7\xd0\xbe1\xd0\xbb\xd0\xb6 \xd0\xb7\xd0\xbe3\xd0\xbc2 1\xd0\xb7\xd0\xbe\xd0\xbc_ 2\xd0\xb7\xd0\xbe\xd0\xbc\xd0\xbd 1\xd0\xb7\xd0\xbe\xd0\xbd 2\xd0\xb7\xd0\xbe\xd0\xbd\xd1\x80 1\xd0\xb7\xd0\xbe\xd0\xbe \xd0\xb7\xd0\xbe2\xd0\xbe3\xd0\xbf \xd0\xb7\xd0\xbe2\xd0\xbe\xd1\x81 \xd0\xb7\xd0\xbe2\xd0\xbf\xd0\xb0 \xd0\xb72\xd0\xbe\xd0\xbf\xd0\xbb \xd0\xb72\xd0\xbe\xd0\xbf\xd1\x80 \xd0\xb71\xd0\xbe\xd1\x80\xd0\xb3 1\xd0\xb72\xd0\xbe3\xd1\x80\xd0\xb5 \xd0\xb7\xd0\xbe\xd1\x812 \xd0\xb71\xd0\xbe\xd1\x81\xd0\xbd \xd0\xb7\xd0\xbe1\xd1\x81\xd0\xbf \xd0\xb7\xd0\xbe2\xd1\x82\xd0\xb2 \xd0\xb72\xd0\xbe\xd1\x82\xd0\xb5 \xd0\xb71\xd0\xbe\xd1\x82\xd0\xba \xd0\xb72\xd0\xbe\xd1\x82\xd0\xbe \xd0\xb7\xd0\xbe\xd1\x822\xd1\x80\xd0\xb5 \xd0\xb7\xd0\xbe\xd1\x822\xd1\x80\xd0\xb8 1\xd0\xb7\xd0\xbe\xd1\x85 \xd0\xb7\xd0\xbe\xd1\x882 \xd0\xb7\xd0\xbe2\xd1\x88\xd0\xb8 1\xd0\xb7\xd0\xbe\xd1\x8d 1\xd0\xb7\xd0\xbe\xd1\x8e \xd0\xb71\xd1\x80\xd0\xb0 \xd0\xb72\xd1\x80\xd0\xb0\xd0\xba \xd0\xb7\xd1\x80\xd0\xb02\xd1\x81 \xd0\xb72\xd1\x80\xd0\xb0\xd1\x87 \xd0\xb72\xd1\x80\xd0\xb5\xd0\xbd \xd0\xb71\xd1\x80\xd0\xb5\xd1\x81 \xd0\xb72\xd1\x80\xd0\xb8\xd1\x88 \xd0\xb71\xd1\x80\xd0\xbe \xd0\xb7\xd1\x80\xd0\xbe2\xd1\x813 \xd0\xb71\xd1\x80\xd1\x83 \xd0\xb72\xd1\x80\xd1\x8e \xd0\xb71\xd1\x80\xd1\x8f 2\xd0\xb71\xd1\x81 2\xd0\xb7\xd1\x82 \xd0\xb71\xd1\x82\xd0\xb8 1\xd0\xb7\xd1\x83 3\xd0\xb7\xd1\x83_ 2\xd0\xb71\xd1\x832\xd0\xb1\xd0\xb5 \xd0\xb7\xd1\x832\xd0\xb13\xd1\x80 \xd0\xb7\xd1\x831\xd0\xb2 2\xd0\xb7\xd1\x83\xd0\xb2\xd0\xb5 2\xd0\xb7\xd1\x832\xd0\xb3 3\xd0\xb7\xd1\x83\xd0\xb5 2\xd0\xb71\xd1\x83\xd0\xb73 2\xd0\xb7\xd1\x831\xd0\xba 3\xd0\xb7\xd1\x83\xd0\xbc\xd0\xb5 \xd0\xb71\xd1\x832\xd0\xbc\xd0\xbe 2\xd0\xb7\xd1\x83\xd0\xbf \xd0\xb7\xd1\x832\xd0\xbf\xd1\x80 \xd0\xb71\xd1\x83\xd1\x80\xd0\xb1 \xd0\xb71\xd1\x832\xd1\x82\xd0\xb5 \xd0\xb7\xd1\x832\xd1\x87\xd0\xb0\xd1\x81 2\xd0\xb7\xd1\x86 \xd0\xb71\xd1\x87 2\xd0\xb7\xd1\x88 \xd0\xb7\xd1\x8a\xd0\xb52\xd0\xbc 1\xd0\xb7\xd1\x8b 2\xd0\xb7\xd1\x8b2\xd0\xb31 \xd0\xb7\xd1\x8b2\xd0\xb7 2\xd0\xb7\xd1\x8b\xd0\xbc\xd0\xb5 2\xd0\xb7\xd1\x8b\xd0\xbc\xd1\x87 2\xd0\xb7\xd1\x8b2\xd1\x811 2\xd0\xb7\xd1\x8b\xd1\x89 1\xd0\xb7\xd1\x8c\xd0\xb5 1\xd0\xb7\xd1\x8c\xd0\xb8 1\xd0\xb7\xd1\x8c\xd1\x8e 3\xd0\xb7\xd1\x8c\xd1\x8f 1\xd0\xb72\xd1\x8e 1\xd0\xb7\xd1\x8f \xd0\xb81\xd0\xb0 \xd0\xb82\xd0\xb0\xd0\xb1 \xd0\xb82\xd0\xb0\xd0\xb2 \xd0\xb8\xd0\xb0\xd0\xb32 \xd0\xb82\xd0\xb0\xd0\xb3\xd1\x80 \xd0\xb82\xd0\xb0\xd0\xb4\xd0\xb5 \xd0\xb82\xd0\xb0\xd0\xb4\xd0\xb8 \xd0\xb8\xd0\xb02\xd0\xb7\xd0\xbe\xd0\xb2 \xd0\xb8\xd0\xb02\xd0\xbc\xd1\x83 \xd0\xb83\xd0\xb0\xd0\xbd\xd0\xb0 \xd0\xb8\xd0\xb02\xd0\xbd\xd0\xb0\xd0\xbb \xd0\xb8\xd0\xb0\xd0\xbd\xd0\xb42 \xd0\xb8\xd0\xb0\xd0\xbe2 \xd0\xb82\xd0\xb0\xd0\xbf \xd0\xb8\xd0\xb01\xd1\x812\xd0\xba \xd0\xb8\xd0\xb01\xd1\x81\xd1\x82\xd0\xb0 \xd0\xb8\xd0\xb01\xd1\x81\xd1\x82\xd0\xbe \xd0\xb8\xd0\xb0\xd1\x821\xd1\x80\xd0\xbe \xd0\xb83\xd0\xb0\xd1\x82\xd1\x83 \xd0\xb82\xd0\xb0\xd1\x84 \xd0\xb82\xd0\xb01\xd1\x85 \xd0\xb8\xd0\xb02\xd1\x86\xd0\xb5 2\xd0\xb81\xd0\xb1 \xd0\xb82\xd0\xb11\xd1\x80 2\xd0\xb8\xd0\xb2\xd0\xb0\xd0\xb6 2\xd0\xb81\xd0\xb2\xd0\xb5 \xd0\xb82\xd0\xb23\xd0\xb7 \xd0\xb81\xd0\xb2\xd0\xb8 2\xd0\xb81\xd0\xb2\xd0\xbe \xd0\xb81\xd0\xb22\xd1\x80 \xd0\xb83\xd0\xb22\xd1\x81 \xd0\xb81\xd0\xb2\xd1\x83 \xd0\xb8\xd0\xb22\xd1\x85\xd0\xbe 2\xd0\xb8\xd0\xb2\xd1\x8b \xd0\xb8\xd0\xb32\xd0\xb4 \xd0\xb83\xd0\xb3\xd0\xb5 2\xd0\xb8\xd0\xb3\xd0\xbb \xd0\xb82\xd0\xb3\xd0\xbb\xd0\xb5 \xd0\xb82\xd0\xb3\xd0\xbb\xd0\xb8 \xd0\xb82\xd0\xb3\xd0\xbd \xd0\xb8\xd0\xb3\xd0\xbd\xd0\xb83 \xd0\xb8\xd0\xb31\xd1\x80\xd0\xb5\xd0\xbd \xd0\xb8\xd0\xb31\xd1\x80\xd0\xbe \xd0\xb8\xd0\xb31\xd1\x80\xd1\x83 \xd0\xb8\xd0\xb31\xd1\x80\xd1\x8b \xd0\xb82\xd0\xb31\xd1\x80\xd1\x8f \xd0\xb81\xd0\xb4\xd0\xb2 \xd0\xb82\xd0\xb4\xd0\xb5\xd0\xb9 \xd0\xb81\xd0\xb42\xd0\xb6 \xd0\xb8\xd0\xb4\xd0\xb81\xd0\xbe\xd0\xbc \xd0\xb8\xd0\xb4\xd0\xb81\xd0\xbe\xd1\x82 \xd0\xb8\xd0\xb41\xd1\x80 \xd0\xb81\xd0\xb4\xd1\x8c \xd0\xb81\xd0\xb5 \xd0\xb82\xd0\xb5\xd0\xb2\xd0\xbe\xd0\xb4 \xd0\xb8\xd0\xb52\xd0\xb3 \xd0\xb8\xd0\xb52\xd0\xb4 \xd0\xb8\xd0\xb53\xd0\xb4\xd0\xb5 \xd0\xb8\xd0\xb52\xd0\xb7\xd1\x83 \xd0\xb83\xd0\xb5\xd0\xbd\xd0\xb8 \xd0\xb8\xd0\xb51\xd0\xbe2 \xd0\xb8\xd0\xb5\xd0\xbf\xd0\xb81 \xd0\xb8\xd0\xb52\xd1\x80 \xd0\xb83\xd0\xb62\xd0\xb4 \xd0\xb8\xd0\xb71\xd0\xb22 \xd0\xb8\xd0\xb72\xd0\xb3\xd0\xbd\xd0\xb5 1\xd0\xb8\xd0\xb71\xd0\xb4 \xd0\xb8\xd0\xb72\xd0\xbd\xd0\xb0\xd0\xbb \xd0\xb81\xd0\xb7\xd0\xbe \xd0\xb8\xd0\xb7\xd0\xbe2\xd0\xbe \xd0\xb8\xd0\xb71\xd1\x80 \xd0\xb81\xd0\xb8 \xd0\xb8\xd0\xb9\xd1\x812 \xd0\xb81\xd0\xba \xd0\xb83\xd0\xba2\xd0\xb0 \xd0\xb8\xd0\xba\xd0\xb01\xd1\x812 \xd0\xb8\xd0\xba2\xd0\xb2\xd0\xb0 \xd0\xb82\xd0\xba\xd0\xb2\xd0\xb8 \xd0\xb82\xd0\xba\xd0\xbb\xd1\x8f \xd0\xb83\xd0\xba\xd0\xbe \xd0\xb8\xd0\xba1\xd1\x80\xd0\xbe \xd0\xb8\xd0\xba1\xd1\x81\xd0\xba \xd0\xb8\xd0\xba2\xd1\x811\xd1\x82 \xd0\xb83\xd0\xba\xd1\x83 \xd0\xb81\xd0\xbb \xd0\xb82\xd0\xbb1\xd0\xb02\xd1\x86 \xd0\xb8\xd0\xbb\xd0\xbe1\xd1\x81\xd0\xba \xd0\xb8\xd0\xbb\xd0\xbf2 \xd0\xb82\xd0\xbb1\xd1\x832\xd0\xbf \xd0\xb82\xd0\xbb\xd1\x8c \xd0\xb8\xd0\xbb\xd1\x8c\xd1\x822 2\xd0\xb8\xd0\xbc\xd0\xb0 \xd0\xb82\xd0\xbc\xd0\xb5\xd0\xbd\xd0\xbe \xd0\xb82\xd0\xbc\xd0\xb5\xd0\xbd\xd1\x83 2\xd0\xb8\xd0\xbc\xd0\xb5\xd0\xbd\xd1\x8c \xd0\xb83\xd0\xbc\xd0\xb8 \xd0\xb8\xd0\xbc\xd0\xbe\xd0\xb82 \xd0\xb8\xd0\xbc3\xd0\xbf\xd0\xbb \xd0\xb82\xd0\xbc1\xd1\x80 \xd0\xb82\xd0\xbc\xd1\x87 \xd0\xb8\xd0\xbc2\xd1\x87\xd0\xb0 \xd0\xb8\xd0\xbd\xd0\xb42 1\xd0\xb8\xd0\xbd\xd0\xb6 \xd0\xb8\xd0\xbd\xd0\xbe2\xd0\xba3\xd0\xbb \xd0\xb8\xd0\xbd\xd0\xbe3\xd0\xbf2\xd0\xbb \xd0\xb8\xd0\xbd\xd0\xbe1\xd1\x81 \xd0\xb8\xd0\xbd\xd1\x812 1\xd0\xb8\xd0\xbd\xd1\x81\xd0\xbf 1\xd0\xb8\xd0\xbd\xd1\x81\xd1\x82\xd0\xb8 1\xd0\xb8\xd0\xbd\xd1\x81\xd1\x83 1\xd0\xb8\xd0\xbd\xd1\x84 1\xd0\xb8\xd0\xbd\xd1\x8a \xd0\xb81\xd0\xbe\xd0\xb1 \xd0\xb8\xd0\xbe2\xd0\xb1\xd0\xbe \xd0\xb8\xd0\xbe2\xd0\xb2\xd1\x80 \xd0\xb82\xd0\xbe\xd0\xb3 \xd0\xb81\xd0\xbe\xd0\xb4 \xd0\xb8\xd0\xbe2\xd0\xb4\xd0\xb5 \xd0\xb81\xd0\xbe\xd0\xb7 \xd0\xb8\xd0\xbe3\xd0\xb7\xd0\xbe \xd0\xb81\xd0\xbe\xd0\xba\xd1\x81 \xd0\xb81\xd0\xbe\xd0\xbb\xd0\xb5 \xd0\xb81\xd0\xbe\xd0\xbd \xd0\xb83\xd0\xbe\xd0\xbd\xd0\xbe\xd0\xb2 \xd0\xb81\xd0\xbe\xd0\xbf\xd1\x82 \xd0\xb81\xd0\xbe\xd1\x80 \xd0\xb83\xd0\xbe\xd1\x80\xd0\xb0 \xd0\xb8\xd0\xbe1\xd1\x80\xd1\x83 \xd0\xb8\xd0\xbe2\xd1\x81\xd0\xb0 \xd0\xb8\xd0\xbe3\xd1\x81\xd0\xba\xd0\xbb \xd0\xb8\xd0\xbe1\xd1\x812\xd0\xbf \xd0\xb81\xd0\xbe\xd1\x82\xd0\xb0 \xd0\xb8\xd0\xbe2\xd1\x821\xd0\xb2 \xd0\xb81\xd0\xbe\xd1\x82\xd0\xba \xd0\xb81\xd0\xbe\xd1\x82\xd1\x81 \xd0\xb8\xd0\xbe\xd1\x83\xd0\xb32 \xd0\xb8\xd0\xbe2\xd1\x85\xd0\xbe \xd0\xb81\xd0\xbe\xd1\x88 2\xd0\xb8\xd0\xbf \xd0\xb8\xd0\xbf\xd0\xb0\xd1\x822 \xd0\xb8\xd0\xbf\xd0\xb01\xd1\x82\xd1\x80 \xd0\xb8\xd0\xbf2\xd0\xbb\xd1\x8f \xd0\xb8\xd0\xbf3\xd0\xbd \xd0\xb8\xd0\xbf\xd0\xbe3\xd0\xba2 \xd0\xb81\xd1\x80 \xd0\xb8\xd1\x80\xd0\xb02\xd1\x81\xd1\x82 \xd0\xb82\xd1\x801\xd0\xb0\xd1\x83 \xd0\xb82\xd1\x80\xd0\xb2 \xd0\xb82\xd1\x80\xd0\xb6 \xd0\xb8\xd1\x80\xd0\xb82\xd1\x81\xd0\xba \xd0\xb8\xd1\x80\xd0\xb8\xd1\x833 \xd0\xb8\xd1\x80\xd0\xbe1\xd0\xb72 1\xd0\xb8\xd1\x80\xd1\x80 \xd0\xb8\xd1\x81\xd0\xb0\xd0\xbd2\xd0\xb41 \xd0\xb82\xd1\x81\xd0\xb1 \xd0\xb82\xd1\x81\xd0\xb4 \xd0\xb8\xd1\x811\xd0\xba \xd0\xb8\xd1\x813\xd0\xba\xd0\xb0_ \xd0\xb8\xd1\x813\xd0\xba\xd0\xb0\xd0\xbc \xd0\xb8\xd1\x813\xd0\xba\xd0\xb0\xd1\x85 \xd0\xb8\xd1\x813\xd0\xba\xd0\xb5 \xd0\xb8\xd1\x813\xd0\xba\xd0\xb8 \xd0\xb8\xd1\x813\xd0\xba\xd0\xbe\xd0\xb2 \xd0\xb8\xd1\x813\xd0\xba\xd1\x83_ \xd0\xb82\xd1\x81\xd0\xbb\xd0\xb0\xd0\xbc \xd0\xb8\xd1\x811\xd0\xbb\xd1\x8b \xd0\xb8\xd1\x813\xd0\xbc\xd0\xb5 \xd0\xb8\xd1\x813\xd0\xbc\xd1\x83 \xd0\xb8\xd1\x813\xd0\xbd\xd0\xbe \xd0\xb8\xd1\x81\xd0\xbe2\xd1\x81\xd0\xba \xd0\xb82\xd1\x813\xd0\xbf\xd1\x80 \xd0\xb84\xd1\x81\xd1\x81 \xd0\xb81\xd1\x81\xd1\x82 \xd0\xb82\xd1\x81\xd1\x821\xd0\xb2 \xd0\xb82\xd1\x81\xd1\x82\xd0\xbb \xd0\xb8\xd1\x811\xd1\x82\xd1\x8f\xd0\xb7 \xd0\xb81\xd1\x81\xd1\x8c\xd0\xb8 \xd0\xb81\xd1\x82 \xd0\xb8\xd1\x82\xd0\xb02\xd0\xb2 \xd0\xb8\xd1\x823\xd0\xb2\xd0\xb0 \xd0\xb82\xd1\x821\xd0\xb2\xd0\xb5 \xd0\xb8\xd1\x821\xd0\xb2\xd0\xb8 \xd0\xb8\xd1\x821\xd0\xb2\xd1\x83 \xd0\xb82\xd1\x82\xd0\xbc \xd0\xb82\xd1\x821\xd1\x80 \xd0\xb8\xd1\x822\xd1\x80\xd0\xb5\xd1\x81 \xd0\xb8\xd1\x823\xd1\x80\xd0\xbe\xd0\xbc \xd0\xb82\xd1\x821\xd1\x83\xd1\x87 \xd0\xb83\xd1\x82\xd1\x8c\xd1\x8e \xd0\xb83\xd1\x82\xd1\x8c\xd1\x8f \xd0\xb81\xd1\x832 \xd0\xb8\xd1\x833\xd0\xbf \xd0\xb8\xd1\x841\xd0\xbb \xd0\xb8\xd1\x842\xd0\xbb\xd1\x8e \xd0\xb82\xd1\x84\xd1\x80 \xd0\xb8\xd1\x85\xd0\xb03\xd0\xb4 \xd0\xb82\xd1\x851\xd0\xb0\xd1\x81 \xd0\xb8\xd1\x852\xd0\xbb\xd0\xbe2 \xd0\xb8\xd1\x85\xd0\xbb\xd0\xbe\xd1\x801 \xd0\xb83\xd1\x852\xd0\xbe \xd0\xb8\xd1\x85\xd0\xbe3\xd0\xba \xd0\xb8\xd1\x851\xd1\x80\xd0\xb5 \xd0\xb8\xd1\x851\xd1\x80\xd0\xb8 \xd0\xb81\xd1\x85\xd1\x83 \xd0\xb81\xd1\x87 \xd0\xb8\xd1\x882\xd0\xbb\xd0\xb8 \xd0\xb82\xd1\x88\xd0\xbb\xd1\x8b \xd0\xb82\xd1\x88\xd1\x82 \xd0\xb8\xd1\x8e4\xd0\xbb \xd0\xb8\xd1\x8e2\xd0\xbd \xd0\xb8\xd1\x8e2\xd1\x82 \xd0\xb8\xd1\x8e3\xd1\x82\xd0\xb0 \xd0\xb81\xd1\x8f \xd0\xb8\xd1\x8f2\xd0\xb4 2\xd0\xb91 \xd0\xb9\xd0\xb42 \xd0\xb92\xd0\xb43\xd0\xb2 \xd0\xb9\xd0\xbd\xd0\xbe1 \xd0\xb92\xd0\xbe1\xd1\x81 \xd0\xb9\xd0\xbe2\xd1\x82\xd1\x80 \xd0\xb9\xd0\xbf2\xd0\xbb \xd0\xb92\xd1\x81\xd0\xb1 \xd0\xb93\xd1\x81\xd0\xba\xd0\xb0 \xd0\xb9\xd1\x812\xd0\xba\xd0\xb5 \xd0\xb9\xd1\x814\xd0\xbc\xd0\xbe \xd0\xb92\xd1\x813\xd0\xbc\xd1\x83 \xd0\xb92\xd1\x81\xd0\xbd \xd0\xb92\xd1\x813\xd1\x84 \xd0\xb92\xd1\x81\xd1\x88 \xd0\xb92\xd1\x82\xd0\xbc \xd0\xb92\xd1\x85\xd0\xbc \xd0\xb9\xd1\x852\xd1\x813 \xd0\xb9\xd1\x8f1 \xd0\xba\xd0\xb02\xd0\xb1\xd0\xbb \xd0\xba\xd0\xb02\xd0\xb1\xd1\x80\xd0\xb8 1\xd0\xba\xd0\xb0\xd0\xb2 \xd0\xba2\xd0\xb0\xd0\xb4 \xd0\xba\xd0\xb03\xd0\xb4\xd0\xbd\xd0\xb5 \xd0\xba\xd0\xb02\xd0\xb41\xd1\x80 1\xd0\xba\xd0\xb0\xd0\xb5 \xd0\xba\xd0\xb0\xd0\xb73\xd0\xbd \xd0\xba\xd0\xb01\xd0\xb7\xd0\xbe 1\xd0\xba\xd0\xb0\xd0\xb9 1\xd0\xba\xd0\xb0\xd0\xbb_ 1\xd0\xba\xd0\xb0\xd0\xbb\xd0\xbe 1\xd0\xba\xd0\xb0\xd0\xbb\xd1\x81 1\xd0\xba\xd0\xb0\xd0\xbc 1\xd0\xba\xd0\xb0\xd0\xbd \xd0\xba\xd0\xb02\xd0\xbf1\xd0\xbb \xd0\xba\xd0\xb02\xd0\xbf\xd1\x80\xd0\xb5 \xd0\xba\xd0\xb0\xd1\x803\xd1\x82\xd1\x80 3\xd0\xba2\xd0\xb0\xd1\x81 \xd0\xba\xd0\xb01\xd1\x81\xd1\x82 1\xd0\xba\xd0\xb0\xd1\x82 \xd0\xba\xd0\xb01\xd1\x822\xd1\x80 1\xd0\xba\xd0\xb0\xd1\x85 \xd0\xba\xd0\xb02\xd1\x881\xd1\x82 1\xd0\xba\xd0\xb0\xd1\x8e 2\xd0\xba1\xd0\xb1 \xd0\xba2\xd0\xb2\xd0\xb0\xd0\xba \xd0\xba2\xd0\xb2\xd0\xb0\xd1\x81 \xd0\xba2\xd0\xb2\xd0\xb0\xd1\x88 \xd0\xba1\xd0\xb2\xd0\xb8 \xd0\xba2\xd0\xb2\xd0\xbe\xd0\xb7 \xd0\xba1\xd0\xb2\xd1\x83 2\xd0\xba\xd0\xb3 2\xd0\xba1\xd0\xb4 \xd0\xba\xd0\xb4\xd0\xb02 1\xd0\xba\xd0\xb5 2\xd0\xba\xd0\xb5\xd0\xb0 \xd0\xba\xd0\xb52\xd0\xb3\xd0\xbb \xd0\xba\xd0\xb5\xd0\xb41\xd1\x80 \xd0\xba\xd0\xb52\xd1\x811\xd0\xba \xd0\xba\xd0\xb52\xd1\x81\xd1\x821 2\xd0\xba1\xd0\xb7 1\xd0\xba\xd0\xb8\xd0\xb2 \xd0\xba\xd0\xb81\xd0\xbe \xd0\xba\xd0\xb8\xd0\xbe\xd1\x811 \xd0\xba\xd0\xb82\xd0\xbf\xd0\xbb \xd0\xba\xd0\xb81\xd1\x812\xd0\xbd\xd0\xb8 1\xd0\xba\xd0\xb8\xd1\x82 2\xd0\xba1\xd0\xba2 \xd0\xba\xd0\xba3\xd1\x81 2\xd0\xba3\xd0\xbb\xd0\xb0_ 2\xd0\xba3\xd0\xbb\xd0\xb0\xd1\x81\xd1\x8c 2\xd0\xba3\xd0\xbb\xd0\xb5_ 2\xd0\xba\xd0\xbb\xd0\xb5\xd0\xbc \xd0\xba3\xd0\xbb\xd0\xb5\xd0\xbc_ \xd0\xba3\xd0\xbb\xd0\xb5\xd0\xbd \xd0\xba1\xd0\xbb\xd0\xb5\xd0\xbe 2\xd0\xba3\xd0\xbb\xd0\xb8_ 2\xd0\xba3\xd0\xbb\xd0\xb8\xd0\xb2 \xd0\xba2\xd0\xbb\xd0\xb8\xd0\xba \xd0\xba2\xd0\xbb\xd0\xb8\xd0\xbd 2\xd0\xba3\xd0\xbb\xd0\xb8\xd1\x81 \xd0\xba3\xd0\xbb\xd0\xb8\xd1\x8f 2\xd0\xba3\xd0\xbb\xd0\xbe_ \xd0\xba2\xd0\xbb\xd0\xbe\xd0\xb7 \xd0\xba3\xd0\xbb\xd0\xbe\xd0\xbc 2\xd0\xba3\xd0\xbb\xd0\xbe\xd1\x81 \xd0\xba\xd0\xbb\xd0\xbe3\xd1\x82 1\xd0\xba\xd0\xbb\xd1\x83\xd0\xba \xd0\xba3\xd0\xbb\xd1\x8b 2\xd0\xba\xd0\xbb\xd1\x8c 1\xd0\xba\xd0\xbb\xd1\x8e 2\xd0\xba3\xd0\xbb\xd1\x8e_ 2\xd0\xba\xd0\xbb\xd1\x8f_ 2\xd0\xba\xd0\xbb\xd1\x8f\xd0\xbc 2\xd0\xba\xd0\xbb\xd1\x8f\xd1\x85 2\xd0\xba\xd0\xbc 2\xd0\xba1\xd0\xbd 3\xd0\xba2\xd0\xbd\xd0\xb8\xd0\xb6 \xd0\xba2\xd0\xbd\xd0\xbe\xd0\xbf 3\xd0\xba2\xd0\xbd\xd1\x8f\xd0\xb6 \xd0\xba2\xd0\xbe \xd0\xba\xd0\xbe1\xd0\xb12\xd1\x80\xd0\xb8 1\xd0\xba\xd0\xbe\xd0\xb2 3\xd0\xba\xd0\xbe\xd0\xb2\xd0\xb0 1\xd0\xba\xd0\xbe\xd0\xb4 \xd0\xba\xd0\xbe1\xd0\xb4\xd1\x80 1\xd0\xba\xd0\xbe\xd0\xb7 1\xd0\xba\xd0\xbe\xd0\xbb\xd1\x8c\xd1\x81 2\xd0\xba\xd0\xbe\xd0\xbc\xd0\xb8\xd0\xbd 3\xd0\xba\xd0\xbe\xd0\xbd\xd1\x81 \xd0\xba\xd0\xbe\xd0\xbf2\xd1\x80 \xd0\xba\xd0\xbe2\xd1\x803\xd0\xb2 \xd0\xba\xd0\xbe1\xd1\x80\xd1\x83 1\xd0\xba\xd0\xbe\xd1\x81 \xd0\xba\xd0\xbe1\xd1\x81\xd0\xba \xd0\xba\xd0\xbe\xd1\x813\xd0\xbc \xd0\xba\xd0\xbe1\xd1\x81\xd0\xbf 1\xd0\xba\xd0\xbe\xd1\x82\xd0\xbd \xd0\xba\xd0\xbe2\xd1\x84\xd1\x80 \xd0\xba\xd0\xbe\xd1\x85\xd0\xbe2\xd1\x803 1\xd0\xba\xd0\xbe\xd1\x88 2\xd0\xba\xd0\xbf 2\xd0\xba\xd1\x80_ \xd0\xba1\xd1\x80\xd0\xb5\xd0\xbb \xd0\xba\xd1\x80\xd0\xb51\xd0\xbe \xd0\xba\xd1\x80\xd0\xb52\xd1\x81\xd0\xbb \xd0\xba1\xd1\x80\xd0\xb5\xd1\x87 1\xd0\xba\xd1\x80\xd0\xb8\xd0\xb1 \xd0\xba1\xd1\x80\xd0\xb8\xd0\xb4 \xd0\xba2\xd1\x80\xd0\xb8\xd0\xb7 \xd0\xba\xd1\x80\xd0\xb82\xd0\xbe3 \xd0\xba2\xd1\x80\xd0\xb8\xd1\x82 \xd0\xba1\xd1\x80\xd0\xb8\xd1\x85 \xd0\xba1\xd1\x80\xd0\xbe\xd0\xb0 \xd0\xba1\xd1\x80\xd0\xbe\xd0\xb1 \xd0\xba2\xd1\x80\xd0\xbe\xd0\xb5 \xd0\xba1\xd1\x80\xd0\xbe\xd0\xba \xd0\xba1\xd1\x80\xd0\xbe\xd0\xbe \xd0\xba1\xd1\x80\xd0\xbe\xd1\x80 \xd0\xba1\xd1\x80\xd0\xbe\xd1\x81 \xd0\xba1\xd1\x80\xd0\xbe\xd1\x84 \xd0\xba1\xd1\x80\xd0\xbe\xd1\x85 \xd0\xba1\xd1\x80\xd0\xbe\xd1\x8d \xd0\xba\xd1\x80\xd1\x831\xd1\x81 \xd0\xba1\xd1\x80\xd1\x8f\xd0\xb4 2\xd0\xba\xd1\x81 \xd0\xba\xd1\x81\xd0\xb0\xd0\xbd\xd0\xb42 \xd0\xba2\xd1\x813\xd0\xb2 \xd0\xba\xd1\x813\xd0\xb3 \xd0\xba2\xd1\x813\xd0\xb4 \xd0\xba2\xd1\x81\xd0\xb8\xd0\xb1 \xd0\xba1\xd1\x81\xd0\xba\xd0\xb8 \xd0\xba\xd1\x811\xd0\xba\xd0\xbb \xd0\xba1\xd1\x81\xd0\xba\xd0\xbe \xd0\xba\xd1\x813\xd0\xbc \xd0\xba3\xd1\x81\xd0\xbe \xd0\xba1\xd1\x81\xd1\x82\xd0\xb0\xd0\xbc \xd0\xba1\xd1\x81\xd1\x82\xd0\xb0\xd0\xbd \xd0\xba\xd1\x813\xd1\x82\xd0\xb5 \xd0\xba1\xd1\x81\xd1\x82\xd0\xbe \xd0\xba\xd1\x811\xd1\x82\xd1\x80 \xd0\xba1\xd1\x81\xd1\x82\xd1\x83 \xd0\xba3\xd1\x81\xd1\x83 2\xd0\xba1\xd1\x82 \xd0\xba\xd1\x82\xd0\xb02\xd0\xba 3\xd0\xba2\xd1\x82\xd0\xbe_ \xd0\xba\xd1\x82\xd0\xbe1\xd1\x81 \xd0\xba\xd1\x822\xd1\x80 \xd0\xba2\xd1\x83 \xd0\xba\xd1\x831\xd0\xb2\xd0\xb5 3\xd0\xba\xd1\x83\xd0\xb5 1\xd0\xba\xd1\x83\xd0\xb9 1\xd0\xba\xd1\x83\xd0\xbb\xd1\x8f 3\xd0\xba\xd1\x83\xd0\xbc \xd0\xba\xd1\x83\xd0\xbf1\xd0\xbb \xd0\xba\xd1\x832\xd0\xbf1\xd1\x80 1\xd0\xba\xd1\x83\xd1\x80 \xd0\xba\xd1\x833\xd1\x80\xd0\xbe \xd0\xba\xd1\x83\xd1\x811\xd0\xba \xd0\xba\xd1\x831\xd1\x81\xd1\x82 1\xd0\xba\xd1\x83\xd1\x82 \xd0\xba\xd1\x833\xd1\x82\xd1\x8c 1\xd0\xba\xd1\x83\xd1\x87\xd0\xb5 1\xd0\xba\xd1\x83\xd1\x8e\xd1\x82 3\xd0\xba\xd1\x83\xd1\x8e\xd1\x89 2\xd0\xba\xd1\x84 2\xd0\xba1\xd1\x852 2\xd0\xba\xd1\x86 2\xd0\xba1\xd1\x87 2\xd0\xba\xd1\x88 1\xd0\xba\xd1\x8c \xd0\xba2\xd1\x8e 1\xd0\xbb\xd0\xb0_ 2\xd0\xbb\xd0\xb0\xd0\xb1\xd0\xb5 \xd0\xbb\xd0\xb02\xd0\xb1\xd0\xbb 2\xd0\xbb\xd0\xb0\xd0\xb3\xd0\xbe \xd0\xbb\xd0\xb02\xd0\xb3\xd1\x80 \xd0\xbb\xd0\xb02\xd0\xb41\xd0\xb0\xd0\xb3 1\xd0\xbb\xd0\xb0\xd0\xb5 \xd0\xbb\xd0\xb03\xd0\xb62\xd0\xb4 \xd0\xbb\xd0\xb01\xd0\xb7\xd0\xbe \xd0\xbb2\xd0\xb0\xd0\xba \xd0\xbb\xd0\xb0\xd0\xba2\xd1\x80 1\xd0\xbb\xd0\xb0\xd0\xbc_ 1\xd0\xbb\xd0\xb0\xd0\xbc\xd0\xb8_ \xd0\xbb\xd0\xb0\xd0\xbd2\xd0\xb41\xd1\x80 \xd0\xbb\xd0\xb01\xd1\x81\xd1\x82\xd0\xb0 \xd0\xbb\xd0\xb0\xd1\x81\xd1\x821\xd0\xb2 \xd0\xbb\xd0\xb01\xd1\x81\xd1\x82\xd0\xb5 \xd0\xbb\xd0\xb01\xd1\x81\xd1\x82\xd0\xbe \xd0\xbb\xd0\xb02\xd1\x81\xd1\x821\xd1\x80 \xd0\xbb\xd0\xb01\xd1\x81\xd1\x82\xd1\x83 \xd0\xbb\xd0\xb01\xd1\x81\xd1\x82\xd1\x8f \xd0\xbb\xd0\xb01\xd1\x822\xd1\x80 \xd0\xbb\xd0\xb0\xd1\x831 \xd0\xbb\xd0\xb02\xd1\x83\xd1\x81 \xd0\xbb\xd0\xb02\xd1\x84\xd1\x80 1\xd0\xbb\xd0\xb01\xd1\x85 1\xd0\xbb\xd0\xb0\xd1\x8f 2\xd0\xbb\xd0\xb1 \xd0\xbb1\xd0\xb1\xd1\x80 \xd0\xbb1\xd0\xb2\xd0\xb5 \xd0\xbb1\xd0\xb2\xd0\xb8 \xd0\xbb1\xd0\xb2\xd0\xbe \xd0\xbb1\xd0\xb2\xd1\x83 1\xd0\xbb2\xd0\xb3\xd0\xb0\xd0\xbb \xd0\xbb2\xd0\xb3\xd0\xbb \xd0\xbb\xd0\xb3\xd0\xbe1 2\xd0\xbb3\xd0\xb42 1\xd0\xbb\xd0\xb5_ \xd0\xbb\xd0\xb51\xd0\xb2\xd0\xbb \xd0\xbb\xd0\xb5\xd0\xb21\xd1\x80\xd0\xb0 \xd0\xbb\xd0\xb52\xd0\xb31\xd0\xbb \xd0\xbb\xd0\xb51\xd0\xb4\xd0\xb6 \xd0\xbb\xd0\xb53\xd0\xb4\xd0\xbe \xd0\xbb\xd0\xb51\xd0\xb72\xd0\xbe3 \xd0\xbb\xd0\xb51\xd0\xb7\xd1\x80 \xd0\xbb\xd0\xb5\xd0\xba1\xd0\xbb 2\xd0\xbb\xd0\xb5\xd0\xbc\xd0\xbd 1\xd0\xbb\xd0\xb5\xd0\xbd \xd0\xbb\xd0\xb51\xd0\xbe\xd0\xbd\xd1\x82 \xd0\xbb\xd0\xb51\xd0\xbe2\xd1\x81 \xd0\xbb\xd0\xb52\xd1\x81\xd0\xb1 \xd0\xbb\xd0\xb52\xd1\x81\xd0\xba \xd0\xbb\xd0\xb54\xd1\x81\xd0\xba\xd0\xb0 \xd0\xbb\xd0\xb51\xd1\x812\xd0\xbb \xd0\xbb\xd0\xb51\xd1\x81\xd0\xbf\xd0\xb5 \xd0\xbb\xd0\xb51\xd1\x82\xd0\xb2 \xd0\xbb\xd0\xb51\xd1\x822\xd1\x80 1\xd0\xbb\xd0\xb5\xd1\x85 \xd0\xbb\xd0\xb51\xd1\x85\xd1\x80 \xd0\xbb1\xd0\xb7\xd0\xbe 1\xd0\xbb\xd0\xb8 \xd0\xbb\xd0\xb8\xd0\xb02\xd0\xbc 3\xd0\xbb\xd0\xb8\xd0\xb2\xd0\xbe 3\xd0\xbb\xd0\xb8\xd0\xb2\xd1\x8b \xd0\xbb\xd0\xb8\xd0\xb32\xd0\xbb \xd0\xbb\xd0\xb82\xd0\xb3\xd1\x80\xd0\xbe \xd0\xbb\xd0\xb8\xd0\xb53\xd1\x80 \xd0\xbb\xd0\xb82\xd0\xba\xd0\xb2 2\xd0\xbb\xd0\xb8\xd0\xbc\xd0\xbf \xd0\xbb\xd0\xb8\xd0\xbe1\xd1\x81 \xd0\xbb\xd0\xb82\xd0\xbf\xd0\xbb \xd0\xbb\xd0\xb8\xd1\x813\xd0\xbc 2\xd0\xbb1\xd0\xb8\xd1\x81\xd0\xbf \xd0\xbb\xd0\xb82\xd1\x82\xd0\xb2 \xd0\xbb\xd0\xb8\xd1\x833\xd0\xbc \xd0\xbb\xd0\xb82\xd1\x853\xd0\xb2 \xd0\xbb\xd0\xb81\xd1\x85\xd0\xbb \xd0\xbb\xd0\xb81\xd1\x85\xd1\x80 2\xd0\xbb1\xd0\xba \xd0\xbb\xd0\xba2\xd0\xb2 \xd0\xbb2\xd0\xba1\xd0\xbb 2\xd0\xbb1\xd0\xbb \xd0\xbb2\xd0\xbb\xd1\x8c \xd0\xbb\xd0\xbb\xd1\x8e1 2\xd0\xbb\xd0\xbc 2\xd0\xbb1\xd0\xbd \xd0\xbb\xd0\xbd\xd0\xb82\xd0\xb5 1\xd0\xbb\xd0\xbe \xd0\xbb\xd0\xbe2\xd0\xb1\xd0\xbb \xd0\xbb\xd0\xbe1\xd0\xb12\xd1\x80 2\xd0\xbb\xd0\xbe\xd0\xb2\xd0\xb8\xd1\x8f \xd0\xbb\xd0\xbe2\xd0\xb2\xd0\xbb 3\xd0\xbb\xd0\xbe\xd0\xb2\xd0\xbe\xd0\xb4 \xd0\xbb\xd0\xbe2\xd0\xb33\xd0\xb4 \xd0\xbb\xd0\xbe\xd0\xb3\xd0\xbe1\xd1\x81 \xd0\xbb\xd0\xbe1\xd0\xb4\xd1\x80 2\xd0\xbb\xd0\xbe\xd0\xb5\xd0\xbd \xd0\xbb\xd0\xbe1\xd0\xb7\xd0\xb2 \xd0\xbb\xd0\xbe2\xd0\xba1\xd0\xb02\xd1\x83 \xd0\xbb\xd0\xbe2\xd0\xba\xd0\xbb \xd0\xbb\xd0\xbe\xd0\xba3\xd0\xbb\xd0\xb0 3\xd0\xbb\xd0\xbe\xd0\xbf\xd0\xb0\xd1\x81 \xd0\xbb\xd0\xbe2\xd1\x80\xd0\xb2 2\xd0\xbb1\xd0\xbe\xd1\x80\xd0\xb3 \xd0\xbb\xd0\xbe1\xd1\x80\xd1\x83 \xd0\xbb\xd0\xbe\xd1\x811\xd0\xba \xd0\xbb\xd0\xbe1\xd1\x812\xd0\xbf 2\xd0\xbb\xd0\xbe\xd1\x82\xd0\xb4 \xd0\xbb\xd0\xbe\xd1\x822\xd1\x80 \xd0\xbb\xd0\xbe2\xd1\x88\xd0\xbb 2\xd0\xbb\xd0\xbf 2\xd0\xbb1\xd1\x812 \xd0\xbb\xd1\x813\xd0\xb1 \xd0\xbb1\xd1\x82 1\xd0\xbb\xd1\x83_ \xd0\xbb\xd1\x831\xd0\xb1\xd1\x80 \xd0\xbb\xd1\x831\xd0\xb2 \xd0\xbb\xd1\x833\xd0\xb3 \xd0\xbb\xd1\x831\xd0\xb44\xd1\x80 1\xd0\xbb\xd1\x83\xd0\xb5 \xd0\xbb\xd1\x831\xd0\xb7\xd0\xbd \xd0\xbb\xd1\x831\xd0\xba\xd1\x80 1\xd0\xbb\xd1\x83\xd0\xbd \xd0\xbb\xd1\x83\xd0\xbe2\xd0\xb4 \xd0\xbb\xd1\x833\xd0\xbf2\xd0\xbb\xd0\xbe \xd0\xbb\xd1\x831\xd1\x81 \xd0\xbb\xd1\x833\xd1\x82\xd1\x8c 1\xd0\xbb\xd1\x83\xd1\x8e 2\xd0\xbb3\xd1\x842 2\xd0\xbb1\xd1\x852 \xd0\xbb2\xd1\x853\xd0\xb2 2\xd0\xbb\xd1\x86 \xd0\xbb1\xd1\x87 1\xd0\xbb\xd1\x8b_ 1\xd0\xbb\xd1\x8b\xd0\xb5 1\xd0\xbb\xd1\x8b\xd0\xb6 1\xd0\xbb\xd1\x8b\xd0\xb9 1\xd0\xbb\xd1\x8b\xd0\xbc 1\xd0\xbb\xd1\x8b\xd1\x85_ 4\xd0\xbb\xd1\x8c_ 2\xd0\xbb\xd1\x8c\xd0\xb4 3\xd0\xbb\xd1\x8c\xd0\xb5 3\xd0\xbb\xd1\x8c\xd0\xb8 2\xd0\xbb\xd1\x8c\xd0\xba 2\xd0\xbb\xd1\x8c\xd0\xbc 2\xd0\xbb\xd1\x8c\xd0\xbd 3\xd0\xbb\xd1\x8c\xd0\xbe 2\xd0\xbb\xd1\x8c\xd1\x81\xd0\xba 1\xd0\xbb\xd1\x8c\xd1\x81\xd1\x82\xd0\xb8 1\xd0\xbb\xd1\x8c\xd1\x81\xd1\x82\xd1\x8f 2\xd0\xbb\xd1\x8c\xd1\x82 2\xd0\xbb\xd1\x8c\xd1\x86 2\xd0\xbb\xd1\x8c\xd1\x87 1\xd0\xbb\xd1\x8c\xd1\x89\xd0\xb0 1\xd0\xbb\xd1\x8c\xd1\x89\xd0\xb5 1\xd0\xbb\xd1\x8c\xd1\x89\xd1\x83 3\xd0\xbb\xd1\x8c\xd1\x8e 3\xd0\xbb\xd1\x8c\xd1\x8f \xd0\xbb2\xd1\x8e 1\xd0\xbb\xd1\x8e_ 1\xd0\xbb\xd1\x8e\xd0\xb6 1\xd0\xbb\xd1\x8e\xd1\x81\xd1\x8c \xd0\xbb\xd1\x8e1\xd1\x82\xd0\xb0 1\xd0\xbb\xd1\x8f 3\xd0\xbb\xd1\x8f_ \xd0\xbb\xd1\x8f1\xd0\xb2\xd0\xb8 3\xd0\xbb\xd1\x8f\xd0\xb2\xd0\xbe 3\xd0\xbb\xd1\x8f\xd0\xb2\xd1\x8b 2\xd0\xbb\xd1\x8f\xd0\xb4 3\xd0\xbb\xd1\x8f\xd0\xbc \xd0\xbb\xd1\x8f1\xd1\x80\xd0\xb5 \xd0\xbb\xd1\x8f1\xd1\x80\xd1\x83 3\xd0\xbb\xd1\x8f\xd1\x85 1\xd0\xbc \xd0\xbc\xd0\xb02\xd0\xb2\xd0\xb7 3\xd0\xbc\xd0\xb0\xd0\xb3 \xd0\xbc\xd0\xb02\xd0\xb3\xd0\xbd \xd0\xbc\xd0\xb02\xd0\xb4\xd1\x80 \xd0\xbc\xd0\xb02\xd0\xb4\xd1\x8c \xd0\xbc\xd0\xb01\xd0\xb7\xd0\xbe \xd0\xbc\xd0\xb02\xd0\xba1\xd1\x80 2\xd0\xbc1\xd0\xb0\xd0\xbb\xd0\xbb \xd0\xbc\xd0\xb0\xd0\xbd2\xd0\xb41\xd1\x80 \xd0\xbc\xd0\xb0\xd1\x813\xd0\xbb \xd0\xbc\xd0\xb01\xd1\x814\xd1\x82 \xd0\xbc\xd0\xb02\xd1\x82\xd0\xbe\xd0\xb1 \xd0\xbc\xd0\xb02\xd1\x821\xd1\x80 \xd0\xbc\xd0\xb02\xd1\x83 \xd0\xbc\xd0\xb0\xd1\x842 3\xd0\xbc\xd0\xb0\xd1\x87 \xd0\xbc\xd0\xb02\xd1\x87\xd1\x82 4\xd0\xbc1\xd0\xb1 \xd0\xbc3\xd0\xb1\xd0\xb8 \xd0\xbc\xd0\xb12\xd0\xbb \xd0\xbc3\xd0\xb1\xd0\xbb\xd1\x8f 2\xd0\xbc3\xd0\xb22 2\xd0\xbc\xd0\xb32 3\xd0\xbc2\xd0\xb3\xd0\xbb 2\xd0\xbc1\xd0\xb4 \xd0\xbc\xd0\xb5\xd0\xb0\xd0\xbd2 \xd0\xbc\xd0\xb52\xd0\xb5\xd0\xb3 \xd0\xbc\xd0\xb52\xd0\xb5\xd0\xbb \xd0\xbc\xd0\xb52\xd0\xb61\xd0\xb0\xd1\x82 \xd0\xbc\xd0\xb51\xd0\xb7\xd0\xbe \xd0\xbc\xd0\xb52\xd1\x811\xd0\xba \xd0\xbc\xd0\xb52\xd1\x81\xd1\x821\xd1\x80 \xd0\xbc\xd0\xb5\xd1\x871\xd1\x82 2\xd0\xbc\xd0\xb6 2\xd0\xbc1\xd0\xb72 \xd0\xbc\xd0\xb82\xd0\xb3\xd1\x80\xd0\xb5 \xd0\xbc\xd0\xb81\xd0\xb7\xd0\xb2 2\xd0\xbc\xd0\xb8\xd0\xb7\xd0\xb4 \xd0\xbc\xd0\xb81\xd0\xb7\xd0\xbd \xd0\xbc\xd0\xb82\xd0\xba\xd1\x80 \xd0\xbc\xd0\xb8\xd0\xba1\xd1\x80\xd0\xb8 \xd0\xbc\xd0\xb82\xd0\xbe\xd0\xb7 \xd0\xbc\xd0\xb81\xd0\xbe\xd0\xbf\xd0\xb8 \xd0\xbc\xd0\xb82\xd0\xbe\xd1\x80 \xd0\xbc\xd0\xb81\xd1\x812\xd0\xbb 2\xd0\xbc1\xd0\xba2 3\xd0\xbc\xd0\xba\xd0\xbd 2\xd0\xbc1\xd0\xbb \xd0\xbc2\xd0\xbb\xd0\xb5\xd0\xb5 \xd0\xbc2\xd0\xbb\xd0\xb5\xd0\xbb 2\xd0\xbc\xd0\xbc 2\xd0\xbc1\xd0\xbd 4\xd0\xbc3\xd0\xbd\xd0\xb0 \xd0\xbc\xd0\xbd\xd0\xb51\xd0\xb4 3\xd0\xbc2\xd0\xbd\xd0\xb5\xd1\x88 4\xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb5 \xd0\xbc2\xd0\xbd\xd0\xbe\xd0\xb6 4\xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb9 4\xd0\xbc\xd0\xbd\xd0\xbe\xd0\xbc \xd0\xbc2\xd0\xbd\xd0\xbe\xd1\x80 4\xd0\xbc\xd0\xbd\xd0\xbe\xd1\x8e \xd0\xbc2\xd0\xbd\xd1\x83\xd1\x82 4\xd0\xbc3\xd0\xbd\xd1\x8b \xd0\xbc\xd0\xbe1\xd0\xb12 \xd0\xbc\xd0\xbe3\xd0\xb2\xd0\xbb 3\xd0\xbc\xd0\xbe\xd0\xb4 \xd0\xbc\xd0\xbe1\xd0\xb4\xd1\x80 \xd0\xbc\xd0\xbe2\xd0\xb6\xd0\xb6 \xd0\xbc\xd0\xbe1\xd0\xb7\xd0\xb2 \xd0\xbc\xd0\xbe1\xd0\xb7\xd1\x80 \xd0\xbc\xd0\xbe\xd0\xb8\xd1\x811\xd1\x82 \xd0\xbc\xd0\xbe2\xd0\xba3\xd0\xb2 \xd0\xbc\xd0\xbe3\xd0\xbc2 3\xd0\xbc\xd0\xbe\xd0\xbd 3\xd0\xbc\xd0\xbe\xd0\xbf \xd0\xbc\xd0\xbe1\xd1\x80\xd1\x83 \xd0\xbc\xd0\xbe\xd1\x811\xd0\xba\xd0\xb0 \xd0\xbc\xd0\xbe1\xd1\x81\xd0\xbc \xd0\xbc\xd0\xbe1\xd1\x81\xd0\xbd \xd0\xbc\xd0\xbe1\xd1\x812\xd0\xbf 3\xd0\xbc\xd0\xbe\xd1\x82\xd0\xb8 \xd0\xbc\xd0\xbe2\xd1\x821\xd1\x80 3\xd0\xbc\xd0\xbe\xd1\x84 2\xd0\xbc\xd0\xbf \xd0\xbc\xd0\xbf2\xd0\xbb \xd0\xbc1\xd1\x80\xd0\xb0\xd0\xb1 2\xd0\xbc\xd1\x80\xd0\xb8 2\xd0\xbc1\xd1\x80\xd0\xbe \xd0\xbc1\xd1\x80\xd1\x8b 2\xd0\xbc1\xd1\x81 \xd0\xbc\xd1\x812\xd0\xba \xd0\xbc\xd1\x812\xd0\xbd \xd0\xbc2\xd1\x811\xd0\xbe\xd1\x80 3\xd0\xbc2\xd1\x81\xd1\x82\xd0\xb8 2\xd0\xbc1\xd1\x82 \xd0\xbc\xd1\x831\xd1\x812\xd0\xba \xd0\xbc\xd1\x831\xd1\x814\xd0\xbb \xd0\xbc\xd1\x831\xd1\x81\xd1\x82 \xd0\xbc\xd1\x83\xd1\x821\xd1\x80 \xd0\xbc\xd1\x833\xd1\x82\xd1\x8c 2\xd0\xbc\xd1\x84 \xd0\xbc\xd1\x84\xd0\xb83 2\xd0\xbc1\xd1\x85 2\xd0\xbc\xd1\x86 \xd0\xbc2\xd1\x87\xd0\xb0\xd0\xb2 \xd0\xbc2\xd1\x87\xd0\xb0\xd0\xbb \xd0\xbc2\xd1\x87\xd0\xb8\xd1\x82 \xd0\xbc2\xd1\x87\xd0\xb8\xd1\x88 2\xd0\xbc\xd1\x882 2\xd0\xbc\xd1\x89 3\xd0\xbc2\xd1\x89\xd0\xb5 \xd0\xbc\xd1\x8b\xd0\xbc1 \xd0\xbc\xd1\x8b2\xd0\xbc\xd1\x80 \xd0\xbc\xd1\x8b2\xd1\x81 2\xd0\xbc\xd1\x8c_ 2\xd0\xbc\xd1\x8c\xd1\x81 \xd0\xbc\xd1\x8c\xd1\x8e1 2\xd0\xbc\xd1\x8d \xd0\xbc\xd1\x8d1\xd1\x80 \xd0\xbc2\xd1\x8e \xd0\xbc\xd1\x8f1\xd1\x80 \xd0\xbc\xd1\x8f1\xd1\x81\xd1\x82 1\xd0\xbd\xd0\xb0 \xd0\xbd\xd0\xb0\xd0\xb1\xd0\xb81\xd0\xbe \xd0\xbd\xd0\xb0\xd0\xb12\xd1\x80 \xd0\xbd\xd0\xb01\xd0\xb22\xd1\x80 \xd0\xbd\xd0\xb0\xd0\xb32\xd0\xbd \xd0\xbd\xd0\xb03\xd0\xb6\xd0\xb4 \xd0\xbd\xd0\xb01\xd0\xb72 \xd0\xbd\xd0\xb02\xd0\xb8\xd0\xbb \xd0\xbd\xd0\xb02\xd0\xb8\xd0\xbd \xd0\xbd\xd0\xb02\xd0\xb81\xd1\x812 4\xd0\xbd\xd0\xb0\xd0\xba\xd0\xba \xd0\xbd\xd0\xb03\xd0\xbc2\xd0\xbd \xd0\xbd\xd0\xb0\xd0\xbf2\xd0\xbb \xd0\xbd\xd0\xb01\xd1\x80\xd0\xb2\xd0\xb0 \xd0\xbd\xd0\xb01\xd1\x802\xd0\xb2\xd0\xb8 \xd0\xbd\xd0\xb01\xd1\x812 \xd0\xbd\xd0\xb01\xd1\x82\xd0\xb2 \xd0\xbd\xd0\xb01\xd1\x822\xd1\x80 \xd0\xbd1\xd0\xb02\xd1\x84\xd1\x80 \xd0\xbd\xd0\xb01\xd1\x852 2\xd0\xbd\xd0\xb0\xd1\x87 \xd0\xbd\xd0\xb03\xd1\x882\xd0\xbb 2\xd0\xbd\xd0\xb0\xd1\x89 \xd0\xbd\xd0\xb0\xd1\x8d1\xd1\x80 3\xd0\xbd\xd0\xb0\xd1\x8f 2\xd0\xbd1\xd0\xb12 2\xd0\xbd1\xd0\xb2 2\xd0\xbd\xd0\xb3 \xd0\xbd2\xd0\xb31\xd0\xb2 \xd0\xbd\xd0\xb3\xd0\xb82\xd0\xbe \xd0\xbd\xd0\xb34\xd0\xbb \xd0\xbd\xd0\xb3\xd0\xbe1\xd1\x81 \xd0\xbd\xd0\xb32\xd1\x80 2\xd0\xbd1\xd0\xb4 \xd0\xbd2\xd0\xb4\xd0\xb0\xd0\xba \xd0\xbd2\xd0\xb41\xd0\xb2 \xd0\xbd\xd0\xb4\xd0\xb53\xd0\xb7 \xd0\xbd\xd0\xb4\xd0\xb52\xd1\x81 \xd0\xbd\xd0\xb42\xd0\xb6 \xd0\xbd3\xd0\xb42\xd0\xb7 \xd0\xbd2\xd0\xb4\xd0\xbb \xd0\xbd\xd0\xb41\xd1\x80\xd0\xb0\xd0\xb3 \xd0\xbd\xd0\xb41\xd1\x80\xd0\xb0\xd0\xb6 \xd0\xbd\xd0\xb42\xd1\x80\xd0\xb5 \xd0\xbd\xd0\xb42\xd1\x80\xd0\xb8\xd0\xb0 \xd0\xbd2\xd0\xb4\xd1\x80\xd1\x8f \xd0\xbd\xd0\xb42\xd1\x81\xd0\xbf \xd0\xbd2\xd0\xb4\xd1\x86 1\xd0\xbd\xd0\xb5 \xd0\xbd\xd0\xb51\xd0\xb12 \xd0\xbd\xd0\xb51\xd0\xb22\xd0\xb4 2\xd0\xbd\xd0\xb5\xd0\xb2\xd0\xbd \xd0\xbd\xd0\xb53\xd0\xb2\xd0\xbd\xd1\x8f \xd0\xbd\xd0\xb5\xd0\xb32 3\xd0\xbd\xd0\xb5\xd0\xb4 \xd0\xbd\xd0\xb51\xd0\xb42\xd0\xbb \xd0\xbd\xd0\xb5\xd0\xb42\xd0\xbe \xd0\xbd\xd0\xb52\xd0\xb4\xd1\x80\xd0\xb0 \xd0\xbd\xd0\xb51\xd0\xb4\xd1\x80\xd0\xbe \xd0\xbd\xd0\xb53\xd0\xb4\xd1\x83 \xd0\xbd\xd0\xb53\xd0\xb5 \xd0\xbd\xd0\xb5\xd0\xb52\xd0\xb4 \xd0\xbd\xd0\xb53\xd0\xb62\xd0\xb4 \xd0\xbd\xd0\xb51\xd0\xb7\xd0\xb2 \xd0\xbd\xd0\xb51\xd0\xb72\xd0\xbb \xd0\xbd\xd0\xb51\xd0\xb7\xd0\xbd \xd0\xbd\xd0\xb51\xd0\xb7\xd0\xbe \xd0\xbd\xd0\xb51\xd0\xb7\xd1\x80 \xd0\xbd\xd0\xb5\xd0\xb82 \xd0\xbd\xd0\xb51\xd0\xba2\xd0\xb2 \xd0\xbd\xd0\xb51\xd0\xba\xd0\xbb \xd0\xbd\xd0\xb53\xd0\xbc2\xd0\xbd 3\xd0\xbd\xd0\xb51\xd0\xbe2 \xd0\xbd\xd0\xb52\xd0\xbe\xd0\xb4\xd0\xb0 \xd0\xbd\xd0\xb52\xd0\xbe\xd0\xbb \xd0\xbd\xd0\xb53\xd0\xbf2 \xd0\xbd\xd0\xb51\xd1\x802\xd0\xb6 \xd0\xbd\xd0\xb52\xd1\x801\xd0\xbe\xd1\x82 \xd0\xbd\xd0\xb5\xd1\x812\xd0\xba \xd0\xbd\xd0\xb53\xd1\x812\xd0\xbd \xd0\xbd\xd0\xb51\xd1\x812\xd0\xbf \xd0\xbd\xd0\xb5\xd1\x81\xd1\x822 \xd0\xbd\xd0\xb51\xd1\x812\xd1\x85 \xd0\xbd\xd0\xb51\xd1\x812\xd1\x87 \xd0\xbd\xd0\xb51\xd1\x822\xd0\xb2 \xd0\xbd\xd0\xb53\xd1\x822\xd0\xbb \xd0\xbd\xd0\xb51\xd1\x822\xd1\x80 3\xd0\xbd\xd0\xb5\xd1\x83 \xd0\xbd\xd0\xb52\xd1\x84\xd1\x80 \xd0\xbd\xd0\xb51\xd1\x85\xd1\x80 \xd0\xbd\xd0\xb53\xd1\x88\xd0\xba \xd0\xbd\xd0\xb5\xd1\x8f2 2\xd0\xbd1\xd0\xb72 \xd0\xbd\xd0\xb7\xd0\xbe1\xd1\x81 1\xd0\xbd\xd0\xb8 \xd0\xbd\xd0\xb83\xd0\xb12 \xd0\xbd\xd0\xb82\xd0\xb5\xd0\xbd 3\xd0\xbd\xd0\xb8\xd0\xb9 \xd0\xbd\xd0\xb82\xd0\xba\xd0\xbb \xd0\xbd\xd0\xb8\xd0\xbb\xd0\xb02 \xd0\xbd\xd0\xb82\xd0\xbb1\xd0\xb0\xd0\xbb \xd0\xbd\xd0\xb82\xd0\xbb1\xd0\xb0\xd0\xbc 2\xd0\xbd\xd0\xb8\xd0\xbd\xd1\x81\xd0\xbf 2\xd0\xbd1\xd0\xb8\xd0\xbd\xd1\x81\xd1\x82 \xd0\xbd\xd0\xb81\xd1\x81\xd0\xbb \xd0\xbd\xd0\xb8\xd1\x813\xd0\xbf \xd0\xbd\xd0\xb8\xd1\x81\xd1\x822\xd1\x80 \xd0\xbd\xd0\xb8\xd1\x833 \xd0\xbd\xd0\xb81\xd1\x85 3\xd0\xbd\xd0\xb8\xd1\x86 3\xd0\xbd\xd0\xb8\xd1\x89 2\xd0\xbd1\xd0\xba \xd0\xbd\xd0\xba2\xd0\xb2 \xd0\xbd\xd0\xba2\xd0\xbb \xd0\xbd\xd0\xba\xd0\xbe\xd0\xb12 \xd0\xbd\xd0\xba\xd0\xbe3\xd0\xbf2 \xd0\xbd2\xd0\xba1\xd1\x80\xd0\xbe \xd0\xbd\xd0\xba1\xd1\x81 \xd0\xbd1\xd0\xbb 2\xd0\xbd1\xd0\xbd \xd0\xbd\xd0\xbd\xd0\xbe3\xd0\xbf2 1\xd0\xbd\xd0\xbe \xd0\xbd\xd0\xbe\xd0\xb12 \xd0\xbd\xd0\xbe1\xd0\xb1\xd1\x80 \xd0\xbd\xd0\xbe2\xd0\xb2\xd0\xbb \xd0\xbd\xd0\xbe1\xd0\xb4\xd0\xb2 \xd0\xbd\xd0\xbe1\xd0\xb4\xd1\x80 \xd0\xbd\xd0\xbe2\xd0\xb5\xd1\x80 \xd0\xbd\xd0\xbe1\xd0\xb7\xd0\xb2 \xd0\xbd\xd0\xbe2\xd0\xb7\xd0\xb4 \xd0\xbd\xd0\xbe3\xd0\xb72\xd0\xbe \xd0\xbd\xd0\xbe1\xd0\xb7\xd1\x80 \xd0\xbd\xd0\xbe3\xd0\xba\xd0\xbd 3\xd0\xbd\xd0\xbe\xd0\xbc\xd0\xb5 \xd0\xbd\xd0\xbe\xd0\xbc3\xd1\x88 \xd0\xbd\xd0\xbe2\xd1\x80\xd0\xb2 \xd0\xbd\xd0\xbe1\xd1\x80\xd1\x83 \xd0\xbd\xd0\xbe1\xd1\x81\xd0\xba\xd0\xbb \xd0\xbd\xd0\xbe2\xd1\x81\xd0\xbb\xd0\xb8 \xd0\xbd\xd0\xbe1\xd1\x812\xd0\xbf \xd0\xbd\xd0\xbe2\xd1\x81\xd1\x87 2\xd0\xbd\xd0\xbe\xd1\x82\xd0\xb4 \xd0\xbd\xd0\xbe3\xd1\x842 \xd0\xbd\xd0\xbe\xd1\x8d2 \xd0\xbd3\xd0\xbf2 2\xd0\xbd1\xd1\x80\xd0\xb5 2\xd0\xbd1\xd1\x80\xd0\xb8 \xd0\xbd1\xd1\x80\xd0\xbe 2\xd0\xbd1\xd1\x81 \xd0\xbd2\xd1\x813\xd0\xb2 \xd0\xbd2\xd1\x81\xd0\xb3 \xd0\xbd\xd1\x812\xd0\xba\xd0\xb5 \xd0\xbd2\xd1\x81\xd0\xba\xd0\xbe\xd0\xbd \xd0\xbd2\xd1\x81\xd0\xbb \xd0\xbd3\xd1\x81\xd0\xbb\xd0\xb0 \xd0\xbd2\xd1\x813\xd0\xbc \xd0\xbd2\xd1\x81\xd0\xbd \xd0\xbd2\xd1\x811\xd0\xbe\xd0\xba \xd0\xbd3\xd1\x812\xd0\xbf\xd0\xb5 \xd0\xbd\xd1\x81\xd1\x822\xd1\x80 \xd0\xbd\xd1\x81\xd1\x832\xd1\x80 \xd0\xbd2\xd1\x813\xd1\x84 \xd0\xbd2\xd1\x81\xd1\x8a3 2\xd0\xbd1\xd1\x82 \xd0\xbd2\xd1\x821\xd0\xb2 \xd0\xbd\xd1\x82\xd0\xb81\xd0\xbe2\xd0\xba \xd0\xbd2\xd1\x82\xd0\xbc \xd0\xbd\xd1\x822\xd1\x80\xd0\xb0 \xd0\xbd2\xd1\x82\xd1\x801\xd0\xb02\xd0\xb3 \xd0\xbd\xd1\x82\xd1\x801\xd0\xb0\xd0\xb6 \xd0\xbd2\xd1\x82\xd1\x80\xd0\xb0\xd1\x80 \xd0\xbd\xd1\x82\xd1\x80\xd0\xb0\xd1\x812 \xd0\xbd\xd1\x822\xd1\x80\xd0\xb5 \xd0\xbd2\xd1\x82\xd1\x80\xd0\xb8\xd0\xb2 \xd0\xbd2\xd1\x82\xd1\x80\xd0\xbe\xd0\xba \xd0\xbd\xd1\x822\xd1\x80\xd1\x83 \xd0\xbd\xd1\x82\xd1\x801\xd1\x83\xd0\xb4 \xd0\xbd\xd1\x822\xd1\x80\xd1\x8b \xd0\xbd2\xd1\x821\xd1\x80\xd1\x8f 1\xd0\xbd\xd1\x83 \xd0\xbd\xd1\x83\xd1\x821\xd1\x80 \xd0\xbd\xd1\x831\xd1\x85 3\xd0\xbd\xd1\x83\xd1\x8e 2\xd0\xbd\xd1\x842 \xd0\xbd1\xd1\x85 \xd0\xbd\xd1\x85\xd0\xbe1 2\xd0\xbd\xd1\x86 2\xd0\xbd1\xd1\x87 \xd0\xbd2\xd1\x87\xd0\xbb 2\xd0\xbd\xd1\x88 \xd0\xbd\xd1\x882\xd1\x82 2\xd0\xbd\xd1\x89 1\xd0\xbd\xd1\x8b 3\xd0\xbd\xd1\x8b_ 2\xd0\xbd\xd1\x8c_ 1\xd0\xbd\xd1\x8c\xd0\xb5 1\xd0\xbd\xd1\x8c\xd0\xb8 2\xd0\xbd\xd1\x8c\xd0\xba 1\xd0\xbd\xd1\x8c\xd0\xbe 2\xd0\xbd\xd1\x8c\xd1\x81 2\xd0\xbd\xd1\x8c\xd1\x82 2\xd0\xbd\xd1\x8c\xd1\x87 1\xd0\xbd\xd1\x8c\xd1\x8e 1\xd0\xbd\xd1\x8c\xd1\x8f \xd0\xbd2\xd1\x8d 1\xd0\xbd2\xd1\x8e 2\xd0\xbd3\xd1\x8e2\xd1\x80 1\xd0\xbd\xd1\x8f \xd0\xbd\xd1\x8f1\xd0\xb2\xd0\xb8 2\xd0\xbe1\xd0\xb02 \xd0\xbe3\xd0\xb0\xd0\xb2 \xd0\xbe\xd0\xb0\xd0\xbf1 2\xd0\xbe\xd0\xb1\xd0\xb0 2\xd0\xbe\xd0\xb1\xd0\xb8\xd0\xbe \xd0\xbe\xd0\xb12\xd0\xbb\xd0\xb5\xd0\xb2 \xd0\xbe\xd0\xb12\xd0\xbb\xd0\xb5\xd0\xbc \xd0\xbe1\xd0\xb1\xd0\xbb\xd1\x8e 1\xd0\xbe\xd0\xb1\xd0\xbc \xd0\xbe\xd0\xb1\xd0\xbe1\xd0\xbb2\xd0\xb3 \xd0\xbe\xd0\xb1\xd0\xbe3\xd0\xbc2 \xd0\xbe\xd0\xb1\xd0\xbe2\xd1\x81 2\xd0\xbe\xd0\xb1\xd0\xbe\xd1\x82 \xd0\xbe\xd0\xb11\xd1\x80 \xd0\xbe2\xd0\xb1\xd1\x80\xd0\xb0_ \xd0\xbe1\xd0\xb1\xd1\x80\xd0\xb0\xd0\xb2 \xd0\xbe1\xd0\xb1\xd1\x80\xd0\xb0\xd0\xbd 1\xd0\xbe\xd0\xb1\xd1\x8a 2\xd0\xbe\xd0\xb1\xd1\x8c \xd0\xbe1\xd0\xb2 \xd0\xbe3\xd0\xb2\xd0\xbb\xd0\xb0 \xd0\xbe3\xd0\xb22\xd0\xbb\xd0\xbe \xd0\xbe\xd0\xb23\xd0\xbd\xd0\xbe \xd0\xbe3\xd0\xb22\xd0\xbd\xd1\x83\xd1\x88 \xd0\xbe2\xd0\xb21\xd1\x80\xd0\xb8 \xd0\xbe\xd0\xb22\xd1\x81\xd0\xb5 \xd0\xbe\xd0\xb23\xd1\x81\xd0\xba\xd0\xbe \xd0\xbe\xd0\xb22\xd1\x82 \xd0\xbe2\xd0\xb2\xd1\x85 \xd0\xbe\xd0\xb32 2\xd0\xbe3\xd0\xb3\xd0\xb5 \xd0\xbe\xd0\xb33\xd0\xbb\xd0\xb0_ \xd0\xbe\xd0\xb33\xd0\xbb\xd0\xb8_ \xd0\xbe\xd0\xb33\xd0\xbb\xd0\xbe_ \xd0\xbe3\xd0\xb3\xd1\x80\xd1\x8f 2\xd0\xbe\xd0\xb4\xd0\xb0\xd0\xbd \xd0\xbe\xd0\xb41\xd0\xb2\xd0\xbe\xd0\xb5 \xd0\xbe3\xd0\xb4\xd0\xb5_ 1\xd0\xbe2\xd0\xb4\xd0\xb5\xd1\x8f\xd0\xbb 2\xd0\xbe\xd0\xb4\xd0\xb83\xd0\xb0 2\xd0\xbe3\xd0\xb4\xd0\xb8\xd0\xbc \xd0\xbe\xd0\xb42\xd0\xbb\xd0\xb8\xd1\x82 \xd0\xbe2\xd0\xb41\xd0\xbe2\xd0\xbf\xd0\xb5 \xd0\xbe\xd0\xb4\xd0\xbe3\xd0\xbf\xd1\x80 \xd0\xbe2\xd0\xb41\xd0\xbe2\xd0\xbf\xd1\x8b \xd0\xbe2\xd0\xb4\xd0\xbe\xd1\x81\xd0\xb8 \xd0\xbe2\xd0\xb41\xd0\xbe\xd1\x82\xd1\x87 \xd0\xbe1\xd0\xb4\xd1\x80\xd0\xb0\xd0\xb3 \xd0\xbe\xd0\xb41\xd1\x80\xd0\xb0\xd0\xb6 \xd0\xbe\xd0\xb41\xd1\x80\xd0\xb0\xd0\xb7 \xd0\xbe\xd0\xb41\xd1\x80\xd0\xb0\xd0\xba \xd0\xbe1\xd0\xb4\xd1\x80\xd0\xb0\xd0\xbb \xd0\xbe\xd0\xb43\xd1\x80\xd0\xb5\xd0\xb1 \xd0\xbe1\xd0\xb4\xd1\x80\xd0\xbe\xd0\xb1 \xd0\xbe\xd0\xb41\xd1\x80\xd0\xbe\xd0\xb2 \xd0\xbe2\xd0\xb41\xd1\x832\xd1\x87 \xd0\xbe2\xd0\xb4\xd1\x8b\xd0\xbc\xd0\xb0 \xd0\xbe2\xd0\xb4\xd1\x8b\xd0\xbc\xd1\x83 \xd0\xbe2\xd0\xb4\xd1\x8b\xd0\xbd \xd0\xbe1\xd0\xb4\xd1\x8c \xd0\xbe2\xd0\xb4\xd1\x8c\xd0\xb1 \xd0\xbe1\xd0\xb5 \xd0\xbe\xd0\xb51\xd0\xb1 \xd0\xbe2\xd0\xb51\xd0\xb2\xd0\xbb \xd0\xbe\xd0\xb52\xd0\xb4 \xd0\xbe3\xd0\xb5\xd0\xb6\xd0\xb5\xd0\xba \xd0\xbe\xd0\xb52\xd0\xb6\xd0\xb8 \xd0\xbe\xd0\xb51\xd0\xbe \xd0\xbe\xd0\xb51\xd1\x812 \xd0\xbe\xd0\xb52\xd1\x81\xd1\x82 \xd0\xbe2\xd0\xb5\xd1\x82\xd0\xbe \xd0\xbe\xd0\xb52\xd1\x86 \xd0\xbe3\xd0\xb6\xd0\xb4\xd0\xb8 \xd0\xbe3\xd0\xb62\xd0\xb4\xd1\x83 \xd0\xbe\xd0\xb7\xd0\xb02\xd0\xb13\xd0\xb2 2\xd0\xbe\xd0\xb7\xd0\xb0\xd0\xb2 \xd0\xbe1\xd0\xb72\xd0\xb2\xd0\xb0 \xd0\xbe\xd0\xb72\xd0\xb2\xd0\xb5\xd0\xbd \xd0\xbe\xd0\xb72\xd0\xb2\xd0\xb8 \xd0\xbe1\xd0\xb72\xd0\xb2\xd1\x8f \xd0\xbe\xd0\xb72\xd0\xb3\xd0\xbb\xd0\xbe \xd0\xbe\xd0\xb72\xd0\xb4\xd0\xbe\xd1\x80 \xd0\xbe1\xd0\xb7\xd0\xb4\xd1\x80 \xd0\xbe\xd0\xb7\xd0\xb51\xd0\xbe \xd0\xbe\xd0\xb73\xd0\xbd\xd0\xbe \xd0\xbe1\xd0\xb7\xd0\xbe \xd0\xbe2\xd0\xb71\xd0\xbe\xd0\xb1 2\xd0\xbe\xd0\xb7\xd0\xbe\xd0\xbd \xd0\xbe2\xd0\xb7\xd0\xbe\xd0\xbf \xd0\xbe\xd0\xb7\xd0\xbe1\xd1\x80\xd1\x83 \xd0\xbe\xd0\xb71\xd1\x83\xd0\xb3 \xd0\xbe2\xd0\xb7\xd1\x8b\xd0\xbc \xd0\xbe3\xd0\xb7\xd1\x8b\xd1\x81 \xd0\xbe3\xd0\xb8 \xd0\xbe\xd0\xb82\xd0\xb31 \xd0\xbe\xd0\xb8\xd0\xb32\xd0\xbd \xd0\xbe\xd0\xb8\xd0\xb53 \xd0\xbe\xd0\xb82\xd0\xb7 \xd0\xbe\xd0\xb82\xd0\xbc \xd0\xbe\xd0\xb83\xd0\xbc\xd0\xbe \xd0\xbe\xd0\xb82\xd0\xbe 2\xd0\xbe\xd0\xb9 \xd0\xbe\xd0\xb9\xd1\x812 \xd0\xbe1\xd0\xba 2\xd0\xbe3\xd0\xba\xd0\xb0\xd0\xbd \xd0\xbe\xd0\xba2\xd0\xb2 2\xd0\xbe\xd0\xba2\xd0\xbb \xd0\xbe3\xd0\xba\xd0\xbb\xd1\x8e \xd0\xbe\xd0\xba\xd0\xbe1\xd0\xb1 2\xd0\xbe3\xd0\xba\xd0\xbe\xd0\xbb \xd0\xbe\xd0\xba\xd0\xbe3\xd0\xbf2\xd0\xbb \xd0\xbe\xd0\xba1\xd1\x81\xd0\xba 1\xd0\xbe\xd0\xba\xd1\x82 2\xd0\xbe\xd0\xba\xd1\x82\xd0\xb8 2\xd0\xbe\xd0\xba\xd1\x83\xd0\xbc \xd0\xbe3\xd0\xbb\xd0\xb0 \xd0\xbe\xd0\xbb2\xd0\xb3\xd0\xb0\xd0\xbd \xd0\xbe1\xd0\xbb\xd0\xb5 1\xd0\xbe\xd0\xbb\xd0\xb8\xd0\xbc\xd0\xbf \xd0\xbe3\xd0\xbb\xd0\xbe \xd0\xbe1\xd0\xbb\xd1\x83 \xd0\xbe\xd0\xbb\xd1\x833\xd0\xb42 \xd0\xbe1\xd0\xbb\xd1\x8b \xd0\xbe1\xd0\xbb\xd1\x8e \xd0\xbe3\xd0\xbb\xd1\x8f \xd0\xbe3\xd0\xbc\xd0\xb0 \xd0\xbe\xd0\xbc2\xd0\xb1\xd0\xbb 2\xd0\xbe\xd0\xbc\xd0\xb5 \xd0\xbe3\xd0\xbc2\xd0\xbd\xd0\xb5\xd0\xbc \xd0\xbe3\xd0\xbc2\xd0\xbd\xd0\xb5\xd1\x82 \xd0\xbe3\xd0\xbc\xd0\xbd\xd0\xbe\xd0\xb6 \xd0\xbe\xd0\xbc1\xd1\x80\xd0\xb8 \xd0\xbe\xd0\xbc2\xd1\x87 \xd0\xbe\xd0\xbc2\xd1\x88\xd0\xb5 \xd0\xbe2\xd0\xbc\xd1\x8c \xd0\xbe3\xd0\xbc\xd1\x8c\xd1\x8f \xd0\xbe3\xd0\xbd\xd0\xb0 \xd0\xbe\xd0\xbd\xd0\xb42 \xd0\xbe\xd0\xbd\xd0\xb53\xd1\x842 \xd0\xbe\xd0\xbd\xd0\xbe1\xd0\xb1 \xd0\xbe1\xd0\xbd\xd1\x80 \xd0\xbe\xd0\xbd\xd1\x812 \xd0\xbe\xd0\xbd2\xd1\x82\xd1\x80\xd1\x83 \xd0\xbe1\xd0\xbe2 \xd0\xbe2\xd0\xbe\xd0\xbb \xd0\xbe\xd0\xbe3\xd0\xbf\xd1\x81 \xd0\xbe\xd0\xbe\xd1\x813\xd0\xbc \xd0\xbe\xd0\xbe\xd1\x81\xd1\x821\xd1\x80 \xd0\xbe2\xd0\xbe\xd1\x82\xd0\xb8 \xd0\xbe2\xd0\xbe\xd1\x84 \xd0\xbe3\xd0\xbf\xd0\xb0\xd0\xba \xd0\xbe3\xd0\xbf\xd0\xb0\xd1\x80 \xd0\xbe2\xd0\xbf\xd0\xbb\xd0\xb5_ \xd0\xbe2\xd0\xbf1\xd0\xbb\xd0\xb5\xd0\xb9 \xd0\xbe2\xd0\xbf\xd0\xbb\xd0\xb8 \xd0\xbe\xd0\xbf2\xd0\xbb\xd0\xb8\xd1\x82 \xd0\xbe\xd0\xbf2\xd0\xbb\xd0\xbe \xd0\xbe\xd0\xbf3\xd0\xbb\xd1\x8e_ \xd0\xbe2\xd0\xbf\xd0\xbb\xd1\x8f \xd0\xbe3\xd0\xbf\xd0\xbb\xd1\x8f\xd1\x81 \xd0\xbe\xd0\xbf\xd0\xbe4\xd0\xb2\xd1\x81 \xd0\xbe\xd0\xbf\xd0\xbe\xd0\xb72\xd0\xbd \xd0\xbe\xd0\xbf\xd0\xbe2\xd1\x883\xd0\xbb \xd0\xbe\xd0\xbf2\xd1\x80\xd0\xb8 \xd0\xbe3\xd0\xbf2\xd1\x82\xd0\xb5 \xd0\xbe\xd0\xbf2\xd1\x82\xd0\xbe \xd0\xbe1\xd1\x80\xd0\xb0 \xd0\xbe\xd1\x80\xd0\xb02\xd1\x813 \xd0\xbe\xd1\x802\xd0\xb13\xd0\xbb \xd0\xbe1\xd1\x802\xd0\xb2 \xd0\xbe1\xd1\x80\xd0\xb5 2\xd0\xbe3\xd1\x80\xd0\xb5\xd0\xb3 \xd0\xbe\xd1\x80\xd0\xb52\xd1\x81\xd0\xba \xd0\xbe1\xd1\x80\xd0\xb8 \xd0\xbe\xd1\x801\xd0\xb8\xd1\x81\xd0\xbf \xd0\xbe1\xd1\x80\xd0\xbe \xd0\xbe\xd1\x80\xd0\xbe2\xd1\x813\xd0\xbb \xd0\xbe\xd1\x802\xd1\x82\xd1\x80 \xd0\xbe1\xd1\x80\xd1\x83\xd0\xb5 \xd0\xbe1\xd1\x80\xd1\x83\xd0\xba \xd0\xbe\xd1\x801\xd1\x83\xd0\xba\xd1\x81 \xd0\xbe1\xd1\x80\xd1\x83\xd1\x81 2\xd0\xbe\xd1\x80\xd1\x86 \xd0\xbe1\xd1\x80\xd1\x8b \xd0\xbe1\xd1\x80\xd1\x8e \xd0\xbe1\xd1\x80\xd1\x8f \xd0\xbe3\xd1\x81\xd0\xb0\xd0\xb4 \xd0\xbe\xd1\x81\xd0\xb03\xd0\xb62 \xd0\xbe\xd1\x812\xd0\xb1 \xd0\xbe2\xd1\x813\xd0\xb1\xd0\xb0 \xd0\xbe2\xd1\x811\xd0\xba\xd0\xb0_ \xd0\xbe\xd1\x813\xd0\xba\xd0\xb0\xd1\x80 \xd0\xbe\xd1\x81\xd0\xba1\xd0\xb2\xd0\xbe \xd0\xbe2\xd1\x81\xd0\xba\xd0\xb5 \xd0\xbe\xd1\x811\xd0\xba\xd0\xb8 \xd0\xbe2\xd1\x81\xd0\xba\xd0\xb8_ \xd0\xbe2\xd1\x81\xd0\xba\xd0\xbe\xd0\xb2 \xd0\xbe\xd1\x811\xd0\xba\xd0\xbe\xd0\xb9 \xd0\xbe\xd1\x811\xd0\xba\xd0\xbe\xd0\xbc \xd0\xbe1\xd1\x812\xd0\xba\xd0\xbe\xd0\xbf \xd0\xbe\xd1\x811\xd0\xba\xd0\xbe\xd1\x8e \xd0\xbe2\xd1\x811\xd0\xba\xd1\x83_ \xd0\xbe\xd1\x811\xd0\xba\xd1\x83\xd1\x8e \xd0\xbe1\xd1\x812\xd0\xbb \xd0\xbe\xd1\x813\xd0\xbb\xd0\xb5\xd0\xb9 \xd0\xbe\xd1\x813\xd0\xbb\xd0\xbe\xd0\xb3 \xd0\xbe\xd1\x813\xd0\xbb\xd1\x8b\xd1\x85 \xd0\xbe\xd1\x813\xd0\xbc\xd0\xb8 \xd0\xbe\xd1\x813\xd0\xbc\xd0\xbe\xd1\x81 \xd0\xbe1\xd1\x812\xd0\xbd\xd0\xb8\xd0\xbc \xd0\xbe\xd1\x812\xd0\xbd\xd1\x8f\xd0\xbb \xd0\xbe\xd1\x812\xd0\xbf\xd0\xb0\xd1\x81 \xd0\xbe1\xd1\x812\xd0\xbf\xd1\x83 \xd0\xbe\xd1\x812\xd0\xbf\xd1\x8f \xd0\xbe\xd1\x812\xd1\x81\xd0\xb2 \xd0\xbe\xd1\x812\xd1\x813\xd0\xbc \xd0\xbe1\xd1\x81\xd1\x82 \xd0\xbe\xd1\x812\xd1\x82\xd0\xb0 \xd0\xbe3\xd1\x81\xd1\x82\xd1\x80\xd0\xb0 \xd0\xbe2\xd1\x81\xd1\x83\xd1\x87 2\xd0\xbe\xd1\x81\xd1\x85 \xd0\xbe\xd1\x812\xd1\x86\xd0\xb5\xd0\xbd \xd0\xbe1\xd1\x812\xd1\x87 \xd0\xbe1\xd1\x812\xd1\x88\xd0\xb8\xd0\xb2 \xd0\xbe1\xd1\x82 \xd0\xbe\xd1\x82\xd0\xb22 \xd0\xbe\xd1\x823\xd0\xb2\xd0\xb0 \xd0\xbe\xd1\x821\xd0\xb2\xd0\xb5 \xd0\xbe\xd1\x821\xd0\xb2\xd0\xb8 \xd0\xbe\xd1\x821\xd0\xb2\xd0\xbb 1\xd0\xbe\xd1\x82\xd0\xb3 1\xd0\xbe\xd1\x82\xd0\xb4 2\xd0\xbe3\xd1\x82\xd0\xb5\xd0\xba \xd0\xbe3\xd1\x82\xd0\xb5\xd1\x80 2\xd0\xbe3\xd1\x82\xd0\xb5\xd1\x85 \xd0\xbe3\xd1\x82\xd0\xb8 \xd0\xbe3\xd1\x82\xd0\xba\xd0\xb0\xd0\xbb \xd0\xbe2\xd1\x82\xd0\xbc \xd0\xbe\xd1\x821\xd1\x80\xd0\xb0\xd0\xb1 \xd0\xbe\xd1\x821\xd1\x80\xd0\xb0\xd0\xb4 \xd0\xbe\xd1\x821\xd1\x80\xd0\xb0\xd0\xb7 \xd0\xbe\xd1\x82\xd1\x80\xd0\xb02\xd1\x81 \xd0\xbe\xd1\x821\xd1\x80\xd0\xb5\xd0\xb6 \xd0\xbe\xd1\x821\xd1\x80\xd0\xb5\xd0\xba \xd0\xbe\xd1\x821\xd1\x80\xd0\xb5\xd1\x87 \xd0\xbe\xd1\x821\xd1\x80\xd0\xb5\xd1\x88 \xd0\xbe\xd1\x821\xd1\x80\xd0\xb8 \xd0\xbe\xd1\x821\xd1\x80\xd0\xbe\xd0\xb4 \xd0\xbe\xd1\x821\xd1\x80\xd0\xbe\xd0\xb5 \xd0\xbe\xd1\x821\xd1\x80\xd0\xbe\xd0\xba \xd0\xbe\xd1\x821\xd1\x80\xd0\xbe\xd1\x81 \xd0\xbe\xd1\x821\xd1\x80\xd0\xbe\xd1\x87 \xd0\xbe\xd1\x821\xd1\x80\xd1\x83\xd0\xb3 \xd0\xbe\xd1\x823\xd1\x81\xd0\xbc \xd0\xbe\xd1\x82\xd1\x832\xd0\xb0 \xd0\xbe\xd1\x821\xd1\x832\xd1\x87 1\xd0\xbe\xd1\x82\xd1\x85 \xd0\xbe3\xd1\x82\xd1\x8c\xd1\x8e \xd0\xbe3\xd1\x82\xd1\x8c\xd1\x8f \xd0\xbe1\xd1\x832 \xd0\xbe\xd1\x83\xd0\xbf2 \xd0\xbe\xd1\x83\xd1\x812\xd0\xba \xd0\xbe\xd1\x833\xd1\x82\xd0\xb0 \xd0\xbe\xd1\x833\xd1\x82\xd0\xbe 2\xd0\xbe\xd1\x84\xd0\xb0\xd1\x88 \xd0\xbe3\xd1\x84\xd0\xb5 2\xd0\xbe\xd1\x84\xd0\xb8\xd1\x82 2\xd0\xbe\xd1\x84\xd0\xbe\xd0\xbd \xd0\xbe2\xd1\x84\xd0\xbe\xd1\x80\xd0\xb8 2\xd0\xbe\xd1\x84\xd0\xbe\xd1\x82 \xd0\xbe2\xd1\x84\xd1\x80\xd0\xb8 2\xd0\xbe\xd1\x85\xd0\xb8 \xd0\xbe\xd1\x851\xd0\xbb\xd1\x8b \xd0\xbe2\xd1\x85\xd0\xbb\xd1\x8f \xd0\xbe\xd1\x852\xd0\xbc\xd0\xb5 2\xd0\xbe\xd1\x85\xd0\xbe\xd1\x80 \xd0\xbe1\xd1\x85\xd1\x80 \xd0\xbe1\xd1\x85\xd1\x83 \xd0\xbe2\xd1\x86\xd0\xbe \xd0\xbe\xd1\x87\xd0\xb01\xd1\x81 \xd0\xbe\xd1\x872\xd0\xbb \xd0\xbe\xd1\x871\xd0\xbb\xd0\xb5 \xd0\xbe3\xd1\x87\xd0\xbb\xd0\xb8 \xd0\xbe1\xd1\x87\xd1\x82 \xd0\xbe2\xd1\x871\xd1\x82\xd0\xbe \xd0\xbe\xd1\x883\xd0\xb2\xd0\xb0 \xd0\xbe\xd1\x882\xd0\xbb\xd0\xb0 \xd0\xbe\xd1\x88\xd0\xbf\xd0\xb02\xd0\xba3 \xd0\xbe\xd1\x882\xd1\x82 \xd0\xbe\xd1\x8d1\xd1\x82\xd0\xb8 2\xd0\xbe\xd1\x8e \xd0\xbe1\xd1\x8f \xd0\xbe\xd1\x8f2\xd0\xb2 \xd0\xbe\xd1\x8f2\xd0\xb4 \xd0\xbe\xd1\x8f2\xd0\xb7 \xd0\xbe\xd1\x8f2\xd1\x80\xd0\xb8 1\xd0\xbf \xd0\xbf\xd0\xb0\xd0\xb2\xd0\xb83 \xd0\xbf\xd0\xb0\xd0\xb23\xd0\xbb \xd0\xbf\xd0\xb02\xd0\xb2\xd1\x8c \xd0\xbf\xd0\xb02\xd0\xb4\xd1\x80 \xd0\xbf\xd0\xb02\xd0\xb5\xd0\xbd \xd0\xbf\xd0\xb01\xd0\xb7\xd0\xbe \xd0\xbf\xd0\xb0\xd1\x811\xd0\xbb \xd0\xbf\xd0\xb0\xd1\x811\xd1\x82\xd0\xb0 \xd0\xbf\xd0\xb01\xd1\x81\xd1\x82\xd0\xb5 \xd0\xbf\xd0\xb0\xd1\x811\xd1\x82\xd0\xbe \xd0\xbf\xd0\xb0\xd1\x811\xd1\x82\xd1\x83 \xd0\xbf\xd0\xb02\xd1\x811\xd1\x82\xd1\x8b \xd0\xbf\xd0\xb01\xd1\x82\xd1\x80\xd0\xbe \xd0\xbf\xd0\xb02\xd1\x83\xd0\xbd \xd0\xbf\xd0\xb03\xd1\x84 \xd0\xbf\xd0\xb01\xd1\x85\xd1\x83 \xd0\xbf\xd0\xb02\xd1\x88\xd1\x82 2\xd0\xbf1\xd0\xb22 2\xd0\xbf1\xd0\xb4 \xd0\xbf\xd0\xb51 \xd0\xbf\xd0\xb52\xd0\xb4\xd0\xb2 \xd0\xbf\xd0\xb52\xd0\xb41\xd0\xb8\xd0\xbd \xd0\xbf\xd0\xb52\xd0\xb7 \xd0\xbf\xd0\xb53\xd0\xb7\xd0\xb0 \xd0\xbf\xd0\xb53\xd0\xb7\xd0\xbe \xd0\xbf\xd0\xb52\xd0\xba1\xd0\xbb\xd0\xb0 \xd0\xbf\xd0\xb52\xd0\xbb\xd1\x8c \xd0\xbf\xd0\xb54\xd0\xbf\xd0\xbb \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb81\xd0\xbe \xd0\xbf\xd0\xb52\xd1\x811\xd0\xba \xd0\xbf\xd0\xb52\xd1\x81\xd0\xbd \xd0\xbf\xd0\xb52\xd1\x81\xd1\x821\xd1\x80 \xd0\xbf\xd0\xb52\xd1\x81\xd1\x86 \xd0\xbf\xd0\xb52\xd1\x81\xd1\x87 \xd0\xbf\xd0\xb52\xd1\x82\xd1\x80 \xd0\xbf\xd0\xb52\xd1\x88\xd1\x82 \xd0\xbf\xd0\xb8\xd0\xb0\xd1\x81\xd1\x821 \xd0\xbf\xd0\xb82\xd0\xb63\xd0\xbc \xd0\xbf\xd0\xb82\xd0\xba1\xd1\x80 3\xd0\xbf\xd0\xb8\xd0\xbd\xd0\xba 3\xd0\xbf\xd0\xb8\xd1\x81\xd1\x8f 4\xd0\xbf3\xd0\xba 2\xd0\xbf\xd0\xbb_ 4\xd0\xbf\xd0\xbb\xd0\xb0_ \xd0\xbf\xd0\xbb\xd0\xb01\xd1\x81 \xd0\xbf1\xd0\xbb\xd0\xb5\xd0\xbc_ \xd0\xbf1\xd0\xbb\xd0\xb5\xd0\xbc\xd1\x81 2\xd0\xbf\xd0\xbb\xd0\xb5\xd0\xbd \xd0\xbf2\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xba \xd0\xbf1\xd0\xbb\xd0\xb52\xd0\xbe \xd0\xbf\xd0\xbb\xd0\xb5\xd1\x811\xd0\xba \xd0\xbf1\xd0\xbb\xd0\xb5\xd1\x8e 2\xd0\xbf\xd0\xbb\xd0\xb8\xd0\xb2 3\xd0\xbf2\xd0\xbb\xd0\xb8\xd0\xba 2\xd0\xbf\xd0\xbb\xd0\xbe_ 2\xd0\xbf\xd0\xbb\xd0\xbe\xd0\xb2 2\xd0\xbf\xd0\xbb\xd0\xbe\xd0\xb3 2\xd0\xbf\xd0\xbb\xd1\x8b\xd0\xb9 2\xd0\xbf\xd0\xbb\xd1\x8b\xd0\xbc \xd0\xbf1\xd0\xbb\xd1\x8b\xd0\xbd \xd0\xbf1\xd0\xbb\xd1\x8b\xd1\x85 2\xd0\xbf\xd0\xbb\xd1\x8e_ \xd0\xbf1\xd0\xbb\xd1\x8e\xd1\x82 \xd0\xbf2\xd0\xbb\xd1\x8f\xd1\x81 \xd0\xbf2\xd0\xbb\xd1\x8f\xd1\x88 2\xd0\xbf1\xd0\xbd \xd0\xbf3\xd0\xbd\xd0\xb0 \xd0\xbf3\xd0\xbd\xd0\xbe1 \xd0\xbf3\xd0\xbd\xd1\x8b \xd0\xbf\xd0\xbe1\xd0\xb12 \xd0\xbf\xd0\xbe3\xd0\xb2\xd0\xbb \xd0\xbf\xd0\xbe3\xd0\xb22\xd1\x81 \xd0\xbf\xd0\xbe\xd0\xb41\xd0\xb2\xd0\xbe \xd0\xbf\xd0\xbe2\xd0\xb41\xd0\xbe2\xd0\xba \xd0\xbf\xd0\xbe\xd0\xb4\xd0\xbe3\xd0\xbc2 \xd0\xbf\xd0\xbe\xd0\xb52\xd0\xbb \xd0\xbf\xd0\xbe\xd0\xb52\xd1\x85 \xd0\xbf\xd0\xbe1\xd0\xb7\xd0\xb2\xd0\xb5 \xd0\xbf\xd0\xbe1\xd0\xb7\xd0\xb4\xd0\xbe \xd0\xbf\xd0\xbe1\xd0\xb72\xd0\xbb \xd0\xbf\xd0\xbe1\xd0\xb7\xd0\xbd \xd0\xbf\xd0\xbe\xd0\xb82\xd1\x89 3\xd0\xbf\xd0\xbe\xd0\xb9 3\xd0\xbf\xd0\xbe\xd0\xbb\xd0\xba \xd0\xbf\xd0\xbe3\xd0\xbc\xd0\xbd\xd0\xbe \xd0\xbf\xd0\xbe3\xd0\xbc\xd0\xbd\xd1\x83 3\xd0\xbf\xd0\xbe3\xd0\xbf2 \xd0\xbf1\xd0\xbe\xd1\x80\xd0\xb3 \xd0\xbf\xd0\xbe\xd1\x802\xd0\xb6 \xd0\xbf\xd0\xbe1\xd1\x80\xd1\x83 \xd0\xbf\xd0\xbe1\xd1\x814 3\xd0\xbf\xd0\xbe\xd1\x81\xd0\xbb \xd0\xbf\xd0\xbe3\xd1\x81\xd1\x81 \xd0\xbf\xd0\xbe\xd1\x822\xd0\xb2 \xd0\xbf\xd0\xbe\xd1\x822\xd1\x80 \xd0\xbf\xd0\xbe1\xd1\x852 \xd0\xbf\xd0\xbe2\xd1\x88\xd0\xbb\xd0\xbe \xd0\xbf\xd0\xbe2\xd1\x88\xd0\xbb\xd1\x8b \xd0\xbf\xd0\xbe2\xd1\x88\xd0\xbb\xd1\x8f \xd0\xbf\xd0\xbe\xd1\x8d3\xd0\xbc 2\xd0\xbf\xd0\xbf2 \xd0\xbf\xd0\xbf\xd0\xbe1\xd0\xb4 2\xd0\xbf\xd1\x80_ 3\xd0\xbf\xd1\x80\xd0\xb5\xd0\xb2 \xd0\xbf\xd1\x80\xd0\xb51\xd0\xb7 \xd0\xbf\xd1\x80\xd0\xb5\xd0\xb92 \xd0\xbf\xd1\x80\xd0\xb51\xd0\xbb \xd0\xbf\xd1\x80\xd0\xb51\xd0\xbe\xd0\xb3 3\xd0\xbf\xd1\x80\xd0\xb5\xd1\x82 \xd0\xbf\xd1\x80\xd0\xb81 \xd0\xbf\xd1\x80\xd0\xb83\xd0\xb2 \xd0\xbf\xd1\x80\xd0\xb8\xd0\xb32 \xd0\xbf\xd1\x80\xd0\xb83\xd0\xb42 \xd0\xbf\xd1\x80\xd0\xb83\xd0\xba \xd0\xbf\xd1\x80\xd0\xb83\xd0\xbb \xd0\xbf\xd1\x80\xd0\xb8\xd0\xbb\xd1\x8c2 \xd0\xbf\xd1\x80\xd0\xb8\xd0\xbf2 \xd0\xbf2\xd1\x80\xd0\xb8\xd1\x86 \xd0\xbf\xd1\x80\xd0\xbe1\xd0\xb1\xd0\xbb \xd0\xbf\xd1\x80\xd0\xbe\xd0\xb42\xd0\xbb \xd0\xbf\xd1\x80\xd0\xbe3\xd0\xb62 \xd0\xbf\xd1\x80\xd0\xbe1\xd0\xb72 \xd0\xbf1\xd1\x80\xd0\xbe\xd0\xb7\xd0\xbe 3\xd0\xbf\xd1\x80\xd0\xbe\xd0\xb8 \xd0\xbf\xd1\x80\xd0\xbe3\xd0\xbf \xd0\xbf\xd1\x80\xd0\xbe\xd1\x84\xd0\xbe2 2\xd0\xbf\xd1\x80\xd1\x81 \xd0\xbf2\xd1\x80\xd1\x83 2\xd0\xbf1\xd1\x812 3\xd0\xbf2\xd1\x81\xd0\xb0\xd0\xbb \xd0\xbf3\xd1\x81\xd0\xb8\xd0\xbd 3\xd0\xbf2\xd1\x81\xd0\xb8\xd1\x85 \xd0\xbf3\xd1\x81\xd0\xbe 2\xd0\xbf1\xd1\x82 \xd0\xbf2\xd1\x823\xd0\xb2 3\xd0\xbf2\xd1\x82\xd0\xb8\xd1\x85 \xd0\xbf3\xd1\x82\xd1\x83 3\xd0\xbf\xd1\x83\xd0\xb1 \xd0\xbf\xd1\x83\xd0\xb33\xd0\xbd \xd0\xbf\xd1\x83\xd1\x811\xd0\xba\xd1\x83 \xd0\xbf\xd1\x831\xd1\x81\xd1\x82 \xd0\xbf\xd1\x833\xd1\x82\xd1\x8c 2\xd0\xbf\xd1\x842 \xd0\xbf\xd1\x852 2\xd0\xbf\xd1\x86 4\xd0\xbf3\xd1\x87 2\xd0\xbf\xd1\x88 2\xd0\xbf\xd1\x89 2\xd0\xbf\xd1\x8c_ 2\xd0\xbf\xd1\x8c\xd1\x82 \xd0\xbf\xd1\x8d1\xd1\x80\xd0\xb0 \xd0\xbf2\xd1\x8e1 1\xd1\x80\xd0\xb0_ \xd1\x80\xd0\xb0\xd0\xb02 \xd1\x80\xd0\xb02\xd0\xb1\xd0\xbb 1\xd1\x80\xd0\xb0\xd0\xb1\xd0\xbe \xd1\x80\xd0\xb02\xd0\xb11\xd1\x80 1\xd1\x80\xd0\xb0\xd0\xb2\xd0\xbd\xd1\x8f \xd1\x80\xd0\xb02\xd0\xb3\xd0\xb2 \xd1\x80\xd0\xb02\xd0\xb3\xd0\xbb \xd1\x80\xd0\xb0\xd0\xb42\xd0\xb6 \xd1\x80\xd0\xb0\xd0\xb4\xd0\xbe1\xd0\xb12 \xd1\x80\xd0\xb02\xd0\xb4\xd1\x86 \xd1\x80\xd0\xb02\xd0\xb6\xd1\x83\xd1\x80 \xd1\x80\xd0\xb02\xd0\xb7\xd0\xb8\xd0\xb9 \xd1\x80\xd0\xb02\xd0\xb7\xd1\x83\xd0\xb1 \xd1\x80\xd0\xb0\xd0\xba2\xd0\xb2 1\xd1\x80\xd0\xb0\xd0\xba\xd0\xb8\xd0\xb7 \xd1\x80\xd0\xb02\xd0\xba3\xd0\xbb 1\xd1\x80\xd0\xb0\xd0\xbb\xd0\xb3 1\xd1\x80\xd0\xb0\xd0\xbc\xd0\xba 1\xd1\x80\xd0\xb0\xd0\xbc\xd0\xbd \xd1\x80\xd0\xb02\xd0\xbd\xd0\xbe\xd1\x85 \xd1\x80\xd0\xb0\xd0\xbd2\xd1\x81\xd1\x86 \xd1\x80\xd0\xb02\xd0\xbf1\xd0\xbb \xd1\x80\xd0\xb0\xd1\x813\xd0\xba2 1\xd1\x80\xd0\xb0\xd1\x81\xd0\xbb \xd1\x80\xd0\xb0\xd1\x813\xd0\xbf \xd1\x80\xd0\xb0\xd1\x811\xd1\x82 1\xd1\x80\xd0\xb0\xd1\x81\xd1\x82\xd0\xb0 \xd1\x80\xd0\xb0\xd1\x813\xd1\x822\xd0\xbb \xd1\x80\xd0\xb02\xd1\x82\xd0\xb0\xd0\xba \xd1\x80\xd0\xb0\xd1\x821\xd0\xb2 \xd1\x80\xd0\xb01\xd1\x822\xd1\x80 2\xd1\x80\xd0\xb0\xd1\x85\xd0\xb8 1\xd1\x80\xd0\xb0\xd1\x89\xd0\xb8 1\xd1\x80\xd0\xb0\xd1\x8e 1\xd1\x80\xd0\xb0\xd1\x8f 2\xd1\x80\xd0\xb0\xd1\x8f\xd1\x82 2\xd1\x801\xd0\xb1 \xd1\x80\xd0\xb12\xd0\xbb\xd0\xb0 \xd1\x802\xd0\xb1\xd0\xbb\xd0\xb5 \xd1\x80\xd0\xb12\xd0\xbb\xd0\xbe \xd1\x80\xd0\xb12\xd0\xbb\xd1\x8e \xd1\x80\xd0\xb1\xd0\xbe3\xd1\x81 1\xd1\x802\xd0\xb2\xd0\xb0\xd0\xb2 \xd1\x803\xd0\xb2\xd0\xb0\xd0\xba \xd1\x803\xd0\xb2\xd0\xb0\xd1\x80 \xd1\x803\xd0\xb2\xd0\xb0\xd1\x82\xd0\xb0 \xd1\x803\xd0\xb2\xd0\xb5\xd0\xb6 \xd1\x802\xd0\xb2\xd0\xb5\xd0\xbe 1\xd1\x80\xd0\xb2\xd0\xb5\xd1\x82 \xd1\x801\xd0\xb2\xd0\xb8 \xd1\x803\xd0\xb2\xd0\xb8\xd0\xbd \xd1\x802\xd0\xb2\xd0\xb8\xd1\x82 \xd1\x801\xd0\xb2\xd0\xbe \xd1\x80\xd0\xb2\xd0\xbe1\xd0\xb72\xd0\xb4 \xd1\x801\xd0\xb2\xd1\x8c 2\xd1\x80\xd0\xb3 \xd1\x802\xd0\xb3\xd0\xb2 \xd1\x802\xd0\xb31\xd0\xbb \xd1\x802\xd0\xb3\xd0\xbd \xd1\x80\xd0\xb32\xd1\x80 2\xd1\x801\xd0\xb4 \xd1\x80\xd0\xb4\xd0\xb01\xd1\x81 \xd1\x802\xd0\xb41\xd0\xb2 \xd1\x80\xd0\xb42\xd0\xb6 \xd1\x80\xd0\xb4\xd0\xb82\xd0\xb0 \xd1\x802\xd0\xb4\xd0\xbb \xd1\x80\xd0\xb4\xd0\xbe\xd1\x812 \xd1\x802\xd0\xb4\xd1\x86 1\xd1\x80\xd0\xb5_ \xd1\x80\xd0\xb51\xd0\xb2\xd1\x80 \xd1\x80\xd0\xb5\xd0\xb32\xd0\xbb\xd1\x8f \xd1\x80\xd0\xb5\xd0\xb32\xd0\xbd \xd1\x80\xd0\xb52\xd0\xb41\xd0\xbe2\xd0\xbf \xd1\x80\xd0\xb52\xd0\xb4\xd0\xbe\xd1\x81 \xd1\x80\xd0\xb5\xd0\xb52\xd0\xb2 \xd1\x80\xd0\xb5\xd0\xb52\xd0\xb4 \xd1\x80\xd0\xb5\xd0\xb52\xd0\xbb \xd1\x80\xd0\xb53\xd0\xb62\xd0\xb4 1\xd1\x80\xd0\xb5\xd0\xb7\xd0\xba \xd1\x80\xd0\xb51\xd0\xb72\xd0\xbb \xd1\x80\xd0\xb51\xd0\xb7\xd0\xbd\xd0\xb0 1\xd1\x80\xd0\xb51\xd0\xb7\xd0\xbe \xd1\x80\xd0\xb51\xd0\xb7\xd1\x80 \xd1\x80\xd0\xb5\xd0\xb72\xd1\x83 1\xd1\x80\xd0\xb5\xd0\xb9\xd1\x88 \xd1\x80\xd0\xb51\xd0\xba2\xd0\xbb 1\xd1\x80\xd0\xb5\xd0\xba\xd1\x88 \xd1\x80\xd0\xb53\xd0\xbc\xd0\xbd\xd0\xbe 3\xd1\x80\xd0\xb5\xd0\xbc\xd0\xbe \xd1\x80\xd0\xb5\xd0\xbc\xd0\xbe2\xd0\xb33 1\xd1\x80\xd0\xb5\xd0\xbd\xd0\xba 1\xd1\x80\xd0\xb5\xd0\xbd\xd1\x8c \xd1\x80\xd0\xb51\xd0\xbe\xd0\xbd \xd1\x80\xd0\xb51\xd0\xbe\xd0\xbf \xd1\x80\xd0\xb51\xd0\xbe2\xd1\x80 \xd1\x80\xd0\xb51\xd0\xbe2\xd1\x84 \xd1\x80\xd0\xb51\xd0\xbe\xd1\x85 \xd1\x80\xd0\xb51\xd0\xbe2\xd1\x86 1\xd1\x80\xd0\xb5\xd0\xbf\xd1\x8c \xd1\x80\xd0\xb53\xd1\x802 \xd1\x80\xd0\xb5\xd1\x811\xd0\xba\xd0\xb8 \xd1\x80\xd0\xb51\xd1\x81\xd0\xbb \xd1\x80\xd0\xb51\xd1\x812\xd0\xbf \xd1\x80\xd0\xb5\xd1\x812\xd1\x813\xd0\xbc \xd1\x80\xd0\xb53\xd1\x81\xd1\x82\xd0\xb0 \xd1\x80\xd0\xb53\xd1\x81\xd1\x82\xd0\xbe \xd1\x80\xd0\xb51\xd1\x81\xd1\x87 \xd1\x80\xd0\xb51\xd1\x82\xd0\xb2 \xd1\x80\xd0\xb51\xd1\x822\xd1\x80 \xd1\x80\xd0\xb5\xd1\x83\xd1\x873\xd1\x82 \xd1\x80\xd0\xb51\xd1\x87\xd1\x82 \xd1\x80\xd0\xb53\xd1\x88\xd0\xbb \xd1\x803\xd0\xb6\xd0\xb0_ \xd1\x803\xd0\xb6\xd0\xb0\xd0\xbc \xd1\x803\xd0\xb6\xd0\xb0\xd0\xbd \xd1\x803\xd0\xb62\xd0\xb4 2\xd1\x80\xd0\xb7 \xd1\x801\xd0\xb72\xd0\xb2 \xd1\x801\xd0\xb7\xd0\xbe \xd1\x80\xd0\xb83\xd0\xb0 \xd1\x80\xd0\xb8\xd0\xb12 \xd1\x80\xd0\xb83\xd0\xb1\xd1\x80 \xd1\x80\xd0\xb83\xd0\xb22\xd0\xbd 2\xd1\x80\xd0\xb8\xd0\xb3\xd0\xb8 \xd1\x80\xd0\xb82\xd0\xb3\xd0\xbb\xd0\xbe \xd1\x80\xd0\xb83\xd0\xb32\xd0\xbd 2\xd1\x80\xd0\xb8\xd0\xb4\xd0\xb6 \xd1\x80\xd0\xb81\xd0\xb42\xd1\x80 \xd1\x80\xd0\xb8\xd0\xb52\xd0\xbb \xd1\x80\xd0\xb8\xd0\xb53\xd1\x80 \xd1\x80\xd0\xb8\xd0\xb72\xd0\xb2 \xd1\x80\xd0\xb8\xd0\xba2\xd1\x80 \xd1\x80\xd0\xb83\xd0\xbc2\xd0\xbd \xd1\x80\xd0\xb83\xd0\xbc2\xd1\x87 \xd1\x802\xd0\xb8\xd0\xbd 1\xd1\x80\xd0\xb8\xd0\xbd\xd1\x81 \xd1\x80\xd0\xb8\xd0\xbe2\xd0\xb7 \xd1\x80\xd0\xb8\xd0\xbe2\xd1\x81 \xd1\x80\xd0\xb81\xd0\xbe\xd1\x82 \xd1\x80\xd0\xb83\xd1\x802 \xd1\x80\xd0\xb81\xd1\x812 \xd1\x80\xd0\xb83\xd1\x81\xd0\xb1 2\xd1\x80\xd0\xb8\xd1\x81\xd0\xbf \xd1\x80\xd0\xb83\xd1\x81\xd1\x82\xd0\xb2 \xd1\x80\xd0\xb83\xd1\x822\xd1\x80 1\xd1\x80\xd0\xb8\xd1\x83 \xd1\x80\xd0\xb82\xd1\x84\xd0\xbb \xd1\x80\xd0\xb83\xd1\x84\xd1\x80 \xd1\x80\xd0\xb81\xd1\x85\xd0\xbb 1\xd1\x80\xd0\xb8\xd1\x86 1\xd1\x80\xd0\xb8\xd1\x88 \xd1\x80\xd0\xb8\xd1\x8d\xd1\x82\xd0\xb82 2\xd1\x801\xd0\xba \xd1\x802\xd0\xba\xd0\xb2 \xd1\x802\xd0\xba1\xd0\xbb \xd1\x80\xd0\xba1\xd1\x81 2\xd1\x801\xd0\xbb2 \xd1\x802\xd0\xbb\xd1\x8c \xd1\x80\xd0\xbb\xd1\x8e1 \xd1\x803\xd0\xbb\xd1\x8f 2\xd1\x80\xd0\xbc \xd1\x802\xd0\xbc\xd1\x87 2\xd1\x801\xd0\xbd \xd1\x80\xd0\xbd\xd0\xb0\xd1\x814 \xd1\x80\xd0\xbd\xd0\xb53\xd0\xbe \xd1\x80\xd0\xbd\xd0\xb51\xd1\x812 \xd1\x80\xd0\xbd\xd0\xbe3\xd1\x81\xd0\xbb 1\xd1\x80\xd0\xbe_ \xd1\x80\xd0\xbe2\xd0\xb1\xd0\xbb\xd1\x8e \xd1\x80\xd0\xbe1\xd0\xb12\xd1\x80 \xd1\x80\xd0\xbe2\xd0\xb2\xd0\xbb 1\xd1\x80\xd0\xbe\xd0\xb3\xd0\xbe\xd0\xbb 1\xd1\x80\xd0\xbe\xd0\xb3\xd1\x80\xd1\x83 \xd1\x80\xd0\xbe1\xd0\xb4\xd0\xb2 \xd1\x80\xd0\xbe3\xd0\xb42\xd0\xb7 \xd1\x80\xd0\xbe1\xd0\xb4\xd0\xbb \xd1\x80\xd0\xbe\xd0\xb42\xd0\xbb\xd0\xb5 \xd1\x80\xd0\xbe2\xd0\xb41\xd0\xbe\xd1\x82 \xd1\x80\xd0\xbe1\xd0\xb4\xd1\x80 1\xd1\x80\xd0\xbe\xd0\xb4\xd1\x8c \xd1\x80\xd0\xbe\xd0\xb52\xd0\xbb \xd1\x80\xd0\xbe\xd0\xb52\xd0\xbc \xd1\x80\xd0\xbe\xd0\xb52\xd1\x85 1\xd1\x80\xd0\xbe\xd0\xb7\xd0\xb0\xd1\x80 \xd1\x80\xd0\xbe1\xd0\xb72\xd0\xb2 \xd1\x80\xd0\xbe1\xd0\xb7\xd1\x80 3\xd1\x80\xd0\xbe\xd0\xb7\xd1\x8b\xd1\x81 \xd1\x80\xd0\xbe\xd0\xb82\xd1\x813 1\xd1\x80\xd0\xbe\xd0\xba\xd0\xbe\xd0\xbd 1\xd1\x80\xd0\xbe\xd0\xba\xd1\x80 1\xd1\x80\xd0\xbe\xd0\xbb\xd0\xb8\xd1\x81 1\xd1\x80\xd0\xbe\xd0\xbb\xd0\xb8\xd1\x86 1\xd1\x80\xd0\xbe\xd0\xbc\xd0\xbe\xd1\x80 1\xd1\x80\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xb6 1\xd1\x80\xd0\xbe\xd0\xbd\xd0\xb0\xd0\xbf 1\xd1\x80\xd0\xbe\xd0\xbd\xd0\xbe\xd1\x81 \xd1\x80\xd0\xbe\xd0\xbe\xd0\xbf1\xd1\x80 \xd1\x80\xd0\xbe2\xd0\xbf\xd0\xbb\xd1\x8e \xd1\x80\xd0\xbe3\xd0\xbf\xd1\x81 2\xd1\x801\xd0\xbe\xd1\x80\xd0\xb3 \xd1\x80\xd0\xbe1\xd1\x802\xd0\xb6 \xd1\x80\xd0\xbe1\xd1\x80\xd1\x83 \xd1\x80\xd0\xbe1\xd1\x81\xd0\xba \xd1\x80\xd0\xbe2\xd1\x81\xd0\xba\xd0\xb8 \xd1\x80\xd0\xbe2\xd1\x81\xd0\xba\xd1\x83 1\xd1\x80\xd0\xbe\xd1\x81\xd0\xbb \xd1\x80\xd0\xbe1\xd1\x81\xd0\xbc \xd1\x80\xd0\xbe1\xd1\x812\xd0\xbf \xd1\x80\xd0\xbe\xd1\x812\xd1\x84 1\xd1\x80\xd0\xbe\xd1\x81\xd1\x88 1\xd1\x80\xd0\xbe\xd1\x81\xd1\x8e 1\xd1\x80\xd0\xbe\xd1\x822\xd0\xb2 1\xd1\x80\xd0\xbe\xd1\x82\xd0\xba \xd1\x80\xd0\xbe\xd1\x822\xd1\x80\xd0\xb8 1\xd1\x80\xd0\xbe\xd1\x83 \xd1\x80\xd0\xbe\xd1\x83\xd0\xb32 \xd1\x80\xd0\xbe2\xd1\x841\xd0\xb0\xd0\xba \xd1\x80\xd0\xbe2\xd1\x84\xd1\x80 \xd1\x80\xd0\xbe1\xd1\x85\xd0\xbb \xd1\x80\xd0\xbe\xd1\x882\xd0\xbb \xd1\x80\xd0\xbe3\xd1\x88\xd0\xbd 1\xd1\x80\xd0\xbe\xd1\x8f\xd0\xb7 2\xd1\x80\xd0\xbf \xd1\x80\xd0\xbf2\xd0\xbb\xd0\xbe \xd1\x802\xd0\xbf\xd0\xbb\xd1\x8e 2\xd1\x801\xd1\x80 4\xd1\x801\xd1\x81 \xd1\x80\xd1\x812\xd0\xba \xd1\x802\xd1\x81\xd0\xbd \xd1\x80\xd1\x812\xd0\xbf \xd1\x80\xd1\x81\xd1\x82\xd0\xb22 \xd1\x803\xd1\x81\xd1\x82\xd0\xb2\xd0\xbb 2\xd1\x801\xd1\x82 \xd1\x802\xd1\x82\xd0\xb0\xd0\xba\xd0\xba \xd1\x802\xd1\x821\xd0\xb0\xd0\xba\xd1\x82 \xd1\x802\xd1\x821\xd0\xb2 \xd1\x80\xd1\x823\xd0\xb2\xd0\xb0 \xd1\x80\xd1\x822\xd0\xb2\xd0\xbb \xd1\x802\xd1\x82\xd0\xbc \xd1\x802\xd1\x821\xd0\xbe\xd0\xb1 \xd1\x80\xd1\x821\xd0\xbe\xd1\x80\xd0\xb3 \xd1\x80\xd1\x821\xd1\x80\xd0\xb0 \xd1\x80\xd1\x822\xd1\x80\xd0\xb0\xd0\xbd \xd1\x80\xd1\x821\xd1\x80\xd0\xb5 \xd1\x80\xd1\x821\xd1\x80\xd0\xb8 \xd1\x80\xd1\x82\xd1\x83\xd1\x811 \xd1\x802\xd1\x821\xd1\x832\xd1\x87\xd0\xb8 \xd1\x803\xd1\x82\xd1\x8c\xd1\x8e \xd1\x80\xd1\x821\xd1\x8f\xd1\x87 1\xd1\x80\xd1\x83_ 1\xd1\x80\xd1\x83\xd0\xb1\xd0\xb0 \xd1\x80\xd1\x83\xd0\xb33\xd0\xbd \xd1\x80\xd1\x832\xd0\xb4\xd0\xb0\xd1\x80 1\xd1\x80\xd1\x83\xd0\xb6\xd0\xb5\xd0\xb9 2\xd1\x80\xd1\x83\xd0\xba\xd1\x81 1\xd1\x80\xd1\x83\xd0\xbb \xd1\x80\xd1\x83\xd1\x811\xd0\xba \xd1\x80\xd1\x83\xd1\x813\xd0\xbb \xd1\x80\xd1\x831\xd1\x81\xd1\x82\xd0\xb0 \xd1\x80\xd1\x83\xd1\x81\xd1\x821\xd1\x80 \xd1\x80\xd1\x833\xd1\x82\xd1\x8c 1\xd1\x80\xd1\x83\xd1\x85\xd0\xb0 1\xd1\x80\xd1\x83\xd1\x85\xd0\xbe 1\xd1\x80\xd1\x83\xd1\x87\xd0\xbd 2\xd1\x80\xd1\x84 \xd1\x80\xd1\x842\xd0\xbb 2\xd1\x80\xd1\x85 \xd1\x802\xd1\x85\xd0\xb2 \xd1\x802\xd1\x851\xd0\xb8\xd0\xbd \xd1\x80\xd1\x851\xd0\xbb \xd1\x801\xd1\x852\xd0\xbb\xd0\xbe \xd1\x802\xd1\x851\xd0\xbe\xd0\xbf \xd1\x80\xd1\x851\xd1\x80 2\xd1\x80\xd1\x86 \xd1\x802\xd1\x86\xd0\xb2 2\xd1\x801\xd1\x87 \xd1\x802\xd1\x87\xd0\xbb \xd1\x802\xd1\x87\xd0\xbc 2\xd1\x80\xd1\x88 \xd1\x803\xd1\x882\xd0\xbc \xd1\x80\xd1\x882\xd1\x82 2\xd1\x80\xd1\x89 2\xd1\x80\xd1\x8a 1\xd1\x80\xd1\x8b_ 1\xd1\x80\xd1\x8b\xd0\xb1 \xd1\x80\xd1\x8b2\xd0\xb4\xd0\xb2 2\xd1\x80\xd1\x8b\xd0\xb7 \xd1\x80\xd1\x8b2\xd0\xba\xd0\xbb 1\xd1\x80\xd1\x8b\xd0\xbc \xd1\x80\xd1\x8b2\xd1\x811\xd0\xba \xd1\x80\xd1\x8b2\xd1\x851 2\xd1\x80\xd1\x8c_ 1\xd1\x80\xd1\x8c\xd0\xb5 1\xd1\x80\xd1\x8c\xd0\xb8 2\xd1\x80\xd1\x8c\xd0\xba 2\xd1\x80\xd1\x8c\xd1\x81 2\xd1\x80\xd1\x8c\xd1\x82 1\xd1\x80\xd1\x8c\xd1\x8e 1\xd1\x80\xd1\x8c\xd1\x8f \xd1\x80\xd1\x8d1\xd0\xbb \xd1\x802\xd1\x8e 1\xd1\x80\xd1\x8e_ 1\xd1\x80\xd1\x8e\xd1\x81 \xd1\x80\xd1\x8f1\xd0\xb2\xd0\xb8 1\xd1\x80\xd1\x8f\xd1\x8e 1\xd1\x81\xd0\xb0 \xd1\x81\xd0\xb02\xd0\xb1\xd0\xbb \xd1\x81\xd0\xb02\xd0\xb4\xd1\x8c \xd1\x81\xd0\xb02\xd0\xba\xd0\xb2 \xd1\x81\xd0\xb02\xd0\xba\xd0\xbb 2\xd1\x811\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xbf \xd1\x811\xd0\xb0\xd0\xbf\xd0\xbf 2\xd1\x811\xd0\xb0\xd1\x80\xd0\xba 2\xd1\x811\xd0\xb0\xd1\x82\xd0\xbb \xd1\x81\xd0\xb01\xd1\x82\xd1\x80 \xd1\x81\xd0\xb02\xd1\x83\xd0\xbd \xd1\x81\xd0\xb02\xd1\x841\xd1\x80 \xd1\x81\xd0\xb01\xd1\x852 1\xd1\x81\xd0\xb12 2\xd1\x81\xd0\xb1\xd0\xb53\xd0\xb72 \xd1\x81\xd0\xb1\xd0\xb5\xd0\xb7\xd0\xbe3 \xd1\x81\xd0\xb1\xd0\xb53\xd1\x812 2\xd1\x813\xd0\xb1\xd1\x83 \xd1\x812\xd0\xb1\xd1\x8b 2\xd1\x81\xd0\xb1\xd1\x8e 1\xd1\x812\xd0\xb2 2\xd1\x813\xd0\xb2\xd0\xb5\xd0\xbd \xd1\x81\xd0\xb32 \xd1\x812\xd0\xb3\xd0\xb8 \xd1\x812\xd0\xb3\xd0\xbd \xd1\x812\xd0\xb3\xd0\xbe 1\xd1\x81\xd0\xb42 \xd1\x812\xd0\xb4\xd0\xb0 \xd1\x812\xd0\xb4\xd0\xb5 \xd1\x813\xd0\xb4\xd0\xb8 \xd1\x812\xd0\xb4\xd0\xbe 1\xd1\x812\xd0\xb5 \xd1\x81\xd0\xb5\xd0\xb32\xd0\xbd \xd1\x81\xd0\xb51\xd0\xb72 \xd1\x81\xd0\xb51\xd0\xba\xd0\xb2 \xd1\x81\xd0\xb5\xd0\xba1\xd0\xbb \xd1\x81\xd0\xb52\xd0\xba1\xd1\x80 \xd1\x81\xd0\xb5\xd0\xba\xd1\x814 \xd1\x81\xd0\xb5\xd0\xbc\xd0\xb81 \xd1\x81\xd0\xb5\xd1\x80\xd0\xb52\xd0\xb1 \xd1\x81\xd0\xb52\xd1\x81\xd0\xba \xd1\x81\xd0\xb52\xd1\x81\xd1\x82 \xd1\x81\xd0\xb53\xd1\x81\xd1\x82\xd0\xb0 \xd1\x81\xd0\xb53\xd1\x81\xd1\x82\xd0\xb5 \xd1\x81\xd0\xb5\xd1\x81\xd1\x821\xd1\x80 1\xd1\x812\xd0\xb6 \xd1\x811\xd0\xb7 1\xd1\x812\xd0\xb8 3\xd1\x81\xd0\xb8\xd0\xb7 \xd1\x81\xd0\xb81\xd0\xbe\xd0\xbc \xd1\x81\xd0\xb81\xd0\xbe\xd0\xbf \xd1\x81\xd0\xb82\xd0\xbf\xd0\xbb \xd1\x81\xd0\xb81\xd1\x85 4\xd1\x81\xd0\xba_ 2\xd1\x81\xd0\xba\xd0\xb0\xd0\xbc \xd1\x812\xd0\xba\xd0\xb0\xd0\xbd\xd0\xb4 1\xd1\x812\xd0\xba\xd0\xb0\xd1\x84 2\xd1\x81\xd0\xba\xd0\xb0\xd1\x85 \xd1\x81\xd0\xba2\xd0\xb2\xd0\xb0 \xd1\x812\xd0\xba\xd0\xb2\xd0\xb8 3\xd1\x81\xd0\xba\xd0\xb8\xd0\xbd\xd0\xbe \xd1\x81\xd0\xba2\xd0\xbb \xd1\x812\xd0\xba\xd0\xbb\xd1\x8f \xd1\x81\xd0\xba3\xd0\xbb\xd1\x8f\xd0\xb2 2\xd1\x81\xd0\xba\xd0\xbd \xd1\x811\xd0\xba\xd0\xbe\xd0\xbd 2\xd1\x81\xd0\xba\xd0\xbe\xd0\xbd\xd0\xb0 \xd1\x812\xd0\xba\xd0\xbe\xd0\xbf\xd1\x81 2\xd1\x81\xd0\xba\xd0\xbe\xd1\x88 \xd1\x81\xd0\xba2\xd1\x80 \xd1\x811\xd0\xba\xd1\x80\xd0\xb0 2\xd1\x81\xd0\xba\xd1\x80\xd0\xb8\xd0\xb1 \xd1\x81\xd0\xba1\xd1\x81 2\xd1\x81\xd0\xba\xd1\x83\xd0\xb5 2\xd1\x813\xd0\xbb\xd0\xb0_ 1\xd1\x81\xd0\xbb\xd0\xb0\xd0\xb2 1\xd1\x81\xd0\xbb\xd0\xb0\xd0\xb4 \xd1\x811\xd0\xbb\xd0\xb0\xd0\xbc 2\xd1\x813\xd0\xbb\xd0\xb0\xd1\x8f \xd1\x813\xd0\xbb\xd0\xb5\xd0\xb2 \xd1\x813\xd0\xbb\xd0\xb5\xd0\xb5 \xd1\x811\xd0\xbb\xd0\xb5\xd0\xb9 \xd1\x81\xd0\xbb\xd0\xb5\xd0\xbe2 \xd1\x811\xd0\xbb\xd0\xb5\xd1\x82 \xd1\x813\xd0\xbb\xd0\xb5\xd1\x8e 2\xd1\x813\xd0\xbb\xd0\xb8_ 2\xd1\x81\xd0\xbb\xd0\xb8\xd1\x86 2\xd1\x813\xd0\xbb\xd0\xbe_ \xd1\x812\xd0\xbb\xd0\xbe\xd0\xb6 \xd1\x813\xd0\xbb\xd0\xbe\xd0\xbc\xd1\x83 2\xd1\x813\xd0\xbb\xd0\xbe\xd1\x81 2\xd1\x813\xd0\xbb\xd1\x83\xd1\x8e 2\xd1\x813\xd0\xbb\xd1\x8b\xd0\xb5 2\xd1\x813\xd0\xbb\xd1\x8b\xd0\xb9 2\xd1\x813\xd0\xbb\xd1\x8b\xd0\xbc 2\xd1\x81\xd0\xbb\xd1\x8c \xd1\x811\xd0\xbb\xd1\x8e\xd1\x81 2\xd1\x813\xd0\xbb\xd1\x8f \xd1\x812\xd0\xbc 1\xd1\x81\xd0\xbc\xd0\xb5\xd1\x81 \xd1\x814\xd0\xbc\xd0\xb5\xd1\x8f \xd1\x813\xd0\xbc\xd1\x83\xd1\x80 \xd1\x811\xd0\xbd 1\xd1\x812\xd0\xbd\xd0\xb0\xd0\xb1 \xd1\x812\xd0\xbd\xd0\xb0\xd1\x81 2\xd1\x81\xd0\xbd\xd0\xb0\xd1\x8f 1\xd1\x812\xd0\xbd\xd0\xb5\xd0\xb6 2\xd1\x813\xd0\xbd\xd0\xb8\xd0\xba 2\xd1\x81\xd0\xbd\xd0\xbe \xd1\x81\xd0\xbd\xd0\xbe1\xd0\xb72 2\xd1\x81\xd0\xbd\xd1\x83\xd1\x8e 2\xd1\x813\xd0\xbd\xd1\x8b 1\xd1\x81\xd0\xbe \xd1\x81\xd0\xbe1\xd0\xb12\xd1\x80 \xd1\x812\xd0\xbe\xd0\xb2 \xd1\x81\xd0\xbe\xd0\xb22\xd1\x80 \xd1\x81\xd0\xbe1\xd0\xb4 \xd1\x81\xd0\xbe1\xd0\xb72 \xd1\x81\xd0\xbe1\xd0\xbb2\xd0\xb3 \xd1\x81\xd0\xbe3\xd0\xbc2 \xd1\x81\xd0\xbe2\xd1\x80\xd0\xb8\xd0\xb5 \xd1\x81\xd0\xbe1\xd1\x80\xd1\x83 \xd1\x81\xd0\xbe1\xd1\x81\xd0\xba \xd1\x81\xd0\xbe1\xd1\x812\xd0\xbf \xd1\x81\xd0\xbe2\xd1\x81\xd1\x8c \xd1\x81\xd0\xbe\xd1\x822\xd1\x80 \xd1\x81\xd0\xbe1\xd1\x87\xd0\xbb \xd1\x81\xd0\xbe\xd1\x882\xd0\xbb \xd1\x81\xd0\xbf2 \xd1\x812\xd0\xbf\xd0\xb0\xd0\xb2 \xd1\x812\xd0\xbf\xd0\xb5\xd0\xb5 \xd1\x812\xd0\xbf\xd0\xb5\xd0\xbb \xd1\x812\xd0\xbf\xd0\xb5\xd0\xbd \xd1\x812\xd0\xbf\xd0\xb5\xd1\x85 1\xd1\x812\xd0\xbf\xd0\xb5\xd1\x86 \xd1\x812\xd0\xbf\xd0\xb5\xd1\x88 \xd1\x812\xd0\xbf\xd0\xb5\xd1\x8e \xd1\x812\xd0\xbf\xd0\xb8\xd0\xbc 2\xd1\x81\xd0\xbf\xd0\xb8\xd1\x81\xd1\x8f \xd1\x813\xd0\xbf\xd0\xbd \xd1\x81\xd0\xbf\xd0\xbe1\xd0\xb72 2\xd1\x81\xd0\xbf\xd0\xbe\xd0\xbb \xd1\x812\xd0\xbf\xd0\xbe\xd1\x81 2\xd1\x81\xd0\xbf\xd1\x8c 1\xd1\x81\xd1\x80 2\xd1\x81\xd1\x80_ \xd1\x812\xd1\x80\xd0\xb0\xd0\xb1 \xd1\x81\xd1\x80\xd0\xb02\xd1\x81 \xd1\x811\xd1\x80\xd0\xb0\xd1\x82 \xd1\x81\xd1\x80\xd0\xb52\xd0\xb11 \xd1\x81\xd1\x80\xd0\xb53\xd0\xb4\xd0\xbe 2\xd1\x811\xd1\x81 \xd1\x81\xd1\x81\xd0\xb0\xd0\xbd\xd0\xb42 \xd1\x812\xd1\x81\xd0\xb1 \xd1\x81\xd1\x813\xd0\xb2\xd0\xbe 4\xd1\x815\xd1\x81\xd0\xb8 \xd1\x813\xd1\x812\xd0\xba \xd1\x81\xd1\x812\xd0\xbb \xd1\x812\xd1\x81\xd0\xbd \xd1\x813\xd1\x812\xd0\xbd\xd0\xb5 \xd1\x812\xd1\x81\xd0\xbe\xd1\x80\xd0\xb8 \xd1\x81\xd1\x812\xd0\xbf \xd1\x81\xd1\x81\xd1\x822 \xd1\x81\xd1\x812\xd1\x87 2\xd1\x81\xd1\x82_ 1\xd1\x81\xd1\x82\xd0\xb0_ 2\xd1\x81\xd1\x82\xd0\xb1 4\xd1\x81\xd1\x82\xd0\xb2_ \xd1\x81\xd1\x821\xd0\xb2\xd0\xb5\xd1\x80 2\xd1\x81\xd1\x82\xd0\xb2\xd0\xbb \xd1\x81\xd1\x822\xd0\xb2\xd0\xbe\xd0\xbb \xd1\x81\xd1\x822\xd0\xb2\xd1\x8f \xd1\x812\xd1\x82\xd0\xb5 1\xd1\x814\xd1\x82\xd0\xb5_ 1\xd1\x81\xd1\x82\xd0\xb5\xd0\xb9 1\xd1\x81\xd1\x82\xd0\xb5\xd0\xbb 1\xd1\x81\xd1\x82\xd0\xb5\xd0\xbd_ \xd1\x813\xd1\x82\xd0\xb5\xd1\x82_ \xd1\x813\xd1\x82\xd0\xb5\xd1\x82\xd0\xb5 \xd1\x81\xd1\x82\xd0\xb53\xd1\x85 \xd1\x813\xd1\x82\xd0\xb5\xd1\x88 1\xd1\x81\xd1\x82\xd0\xb8 \xd1\x812\xd1\x82\xd0\xb8\xd0\xb5 \xd1\x812\xd1\x82\xd0\xb8\xd0\xb8 2\xd1\x81\xd1\x82\xd0\xb8\xd0\xbc\xd0\xbf 2\xd1\x81\xd1\x82\xd0\xb8\xd0\xbd\xd0\xb4 2\xd1\x81\xd1\x82\xd0\xb8\xd0\xbd\xd1\x84 2\xd1\x81\xd1\x82\xd0\xb8\xd0\xbd\xd1\x8a \xd1\x812\xd1\x82\xd0\xb8\xd1\x87 \xd1\x812\xd1\x82\xd0\xb8\xd1\x88\xd0\xba \xd1\x812\xd1\x82\xd0\xb8\xd1\x8e 2\xd1\x81\xd1\x82\xd0\xba \xd1\x81\xd1\x822\xd0\xbb\xd0\xb0 \xd1\x813\xd1\x822\xd0\xbb\xd0\xb5 2\xd1\x81\xd1\x82\xd0\xbb\xd0\xb8 \xd1\x81\xd1\x822\xd0\xbb\xd0\xb8\xd0\xbb \xd1\x81\xd1\x822\xd0\xbb\xd0\xb8\xd1\x82 2\xd1\x81\xd1\x82\xd0\xbb\xd1\x8f 2\xd1\x81\xd1\x82\xd0\xbc 2\xd1\x81\xd1\x82\xd0\xbd 1\xd1\x81\xd1\x82\xd0\xbe_ \xd1\x812\xd1\x82\xd0\xbe1\xd0\xb1 1\xd1\x81\xd1\x82\xd0\xbe\xd0\xb2 1\xd1\x81\xd1\x82\xd0\xbe\xd0\xb3 \xd1\x81\xd1\x82\xd0\xbe2\xd0\xb33\xd0\xbd 1\xd1\x81\xd1\x82\xd0\xbe\xd0\xb4 1\xd1\x81\xd1\x82\xd0\xbe\xd0\xb5 3\xd1\x812\xd1\x82\xd0\xbe\xd0\xb8 1\xd1\x81\xd1\x82\xd0\xbe\xd0\xba 1\xd1\x81\xd1\x82\xd0\xbe\xd0\xbc 1\xd1\x81\xd1\x82\xd0\xbe\xd0\xbd 2\xd1\x81\xd1\x82\xd0\xbe\xd1\x80\xd0\xb3 2\xd1\x81\xd1\x82\xd0\xbe\xd1\x80\xd0\xb6 2\xd1\x81\xd1\x82\xd0\xbe\xd1\x80\xd1\x81 1\xd1\x81\xd1\x82\xd0\xbe\xd1\x81 1\xd1\x81\xd1\x82\xd0\xbe\xd1\x82 \xd1\x812\xd1\x82\xd0\xbe\xd1\x86 1\xd1\x81\xd1\x82\xd0\xbe\xd1\x8e 2\xd1\x81\xd1\x82\xd0\xbf 2\xd1\x81\xd1\x82\xd1\x80_ \xd1\x81\xd1\x82\xd1\x80\xd0\xb0\xd1\x812 4\xd1\x81\xd1\x82\xd1\x80\xd0\xb0\xd1\x8f 2\xd1\x81\xd1\x82\xd1\x80\xd0\xb5\xd0\xb4 \xd1\x81\xd1\x821\xd1\x80\xd0\xb5\xd0\xb9 2\xd1\x81\xd1\x82\xd1\x80\xd0\xb8\xd0\xb2 \xd1\x81\xd1\x821\xd1\x80\xd0\xb8\xd0\xb7 2\xd1\x81\xd1\x82\xd1\x80\xd0\xb8\xd0\xbb 2\xd1\x81\xd1\x82\xd1\x80\xd0\xb8\xd1\x89 \xd1\x81\xd1\x821\xd1\x80\xd0\xbe\xd0\xb0 \xd1\x814\xd1\x821\xd1\x80\xd0\xbe\xd0\xb2 \xd1\x81\xd1\x821\xd1\x80\xd0\xbe\xd0\xb4 \xd1\x81\xd1\x821\xd1\x80\xd0\xbe\xd1\x85 \xd1\x81\xd1\x822\xd1\x80\xd1\x83\xd0\xb1 \xd1\x81\xd1\x821\xd1\x80\xd1\x83\xd1\x88 2\xd1\x81\xd1\x82\xd1\x81 \xd1\x811\xd1\x82\xd1\x83\xd1\x82 1\xd1\x81\xd1\x82\xd1\x83\xd1\x8e 2\xd1\x81\xd1\x82\xd1\x84 2\xd1\x81\xd1\x82\xd1\x86 1\xd1\x81\xd1\x82\xd1\x8b \xd1\x812\xd1\x82\xd1\x8b\xd0\xb2 \xd1\x814\xd1\x82\xd1\x8c 2\xd1\x81\xd1\x82\xd1\x8c_ 2\xd1\x81\xd1\x82\xd1\x8c\xd1\x81 3\xd1\x81\xd1\x82\xd1\x8c\xd1\x8e 1\xd1\x81\xd1\x82\xd1\x8c\xd1\x8f 1\xd1\x81\xd1\x82\xd1\x8f\xd0\xbc 1\xd1\x81\xd1\x82\xd1\x8f\xd1\x85 1\xd1\x81\xd1\x83 \xd1\x81\xd1\x832\xd0\xb1 \xd1\x81\xd1\x83\xd0\xb11\xd0\xb02 \xd1\x81\xd1\x83\xd0\xb11\xd0\xbe \xd1\x81\xd1\x831\xd0\xb2 \xd1\x81\xd1\x833\xd0\xb3\xd0\xbb \xd1\x81\xd1\x832\xd0\xb5\xd0\xb2 \xd1\x81\xd1\x832\xd0\xb7 \xd1\x81\xd1\x831\xd0\xba\xd1\x80 \xd1\x81\xd1\x83\xd0\xbc\xd0\xb01 \xd1\x81\xd1\x83\xd0\xbf\xd0\xb52 \xd1\x81\xd1\x83\xd1\x813\xd0\xbb \xd1\x81\xd1\x83\xd1\x813\xd0\xbf \xd1\x81\xd1\x831\xd1\x81\xd1\x82 \xd1\x81\xd1\x83\xd1\x821\xd1\x80 \xd1\x81\xd1\x832\xd1\x843 \xd1\x81\xd1\x831\xd1\x85 1\xd1\x812\xd1\x84\xd0\xb5 \xd1\x811\xd1\x852 1\xd1\x812\xd1\x85\xd0\xb5 2\xd1\x81\xd1\x86\xd0\xb0 \xd1\x812\xd1\x86\xd0\xb5\xd0\xbd\xd0\xb0 2\xd1\x813\xd1\x86\xd0\xb8 2\xd1\x81\xd1\x86\xd0\xbe \xd1\x81\xd1\x872 1\xd1\x81\xd1\x87\xd0\xb0 \xd1\x812\xd1\x87\xd0\xb0\xd1\x81 \xd1\x81\xd1\x87\xd0\xb52\xd1\x811\xd0\xba \xd1\x813\xd1\x87\xd0\xb8\xd0\xb2 2\xd1\x81\xd1\x87\xd0\xb8\xd0\xba \xd1\x812\xd1\x87\xd0\xb8\xd1\x82 \xd1\x811\xd1\x87\xd0\xbb 2\xd1\x81\xd1\x87\xd0\xbe \xd1\x81\xd1\x882 \xd1\x813\xd1\x88\xd0\xbd 1\xd1\x81\xd1\x8a2 \xd1\x81\xd1\x8a\xd0\xb53\xd0\xb4 \xd1\x81\xd1\x8a\xd0\xb53\xd0\xbb 1\xd1\x81\xd1\x8b \xd1\x81\xd1\x8b2\xd0\xb31 \xd1\x81\xd1\x8b2\xd0\xb7 \xd1\x81\xd1\x8b2\xd0\xbf1\xd0\xbb \xd1\x81\xd1\x8b2\xd1\x81 \xd1\x81\xd1\x8b\xd1\x811\xd0\xba\xd0\xb0 2\xd1\x81\xd1\x8c_ 1\xd1\x81\xd1\x8c\xd0\xb5 2\xd1\x81\xd1\x8c\xd0\xba 2\xd1\x81\xd1\x8c\xd1\x82 1\xd1\x81\xd1\x8c\xd1\x8e 1\xd1\x81\xd1\x8c\xd1\x8f \xd1\x81\xd1\x8d1\xd1\x80 \xd1\x812\xd1\x8d\xd1\x81 1\xd1\x812\xd1\x8e \xd1\x81\xd1\x8e1\xd1\x81 1\xd1\x81\xd1\x8f 2\xd1\x81\xd1\x8f\xd0\xb7 \xd1\x81\xd1\x8f3\xd1\x82\xd1\x8c \xd1\x82\xd0\xb02\xd0\xb1\xd0\xbb \xd1\x82\xd0\xb0\xd0\xb12\xd1\x80 \xd1\x82\xd0\xb01\xd0\xb2\xd1\x80\xd0\xb8 1\xd1\x82\xd0\xb0\xd0\xb3 \xd1\x82\xd0\xb02\xd0\xb3\xd0\xbd \xd1\x82\xd0\xb01\xd0\xb72 \xd1\x82\xd0\xb0\xd0\xba3\xd0\xbb\xd0\xb5 \xd1\x822\xd0\xb0\xd0\xbd \xd1\x82\xd0\xb02\xd0\xbf\xd0\xbb 1\xd1\x82\xd0\xb0\xd1\x81 \xd1\x82\xd0\xb01\xd1\x81\xd1\x82 \xd1\x82\xd0\xb01\xd1\x82\xd1\x80 1\xd1\x82\xd0\xb0\xd1\x89 2\xd1\x821\xd0\xb12 2\xd1\x82\xd0\xb2_ 2\xd1\x822\xd0\xb2\xd0\xb0 \xd1\x821\xd0\xb2\xd0\xb5\xd0\xb9 \xd1\x821\xd0\xb2\xd0\xb5\xd0\xbb \xd1\x821\xd0\xb2\xd0\xb5\xd1\x82 2\xd1\x82\xd0\xb2\xd0\xb8 \xd1\x821\xd0\xb2\xd0\xbe\xd0\xb5 \xd1\x821\xd0\xb2\xd0\xbe1\xd0\xb7 2\xd1\x821\xd0\xb2\xd0\xbe\xd0\xb9 \xd1\x821\xd0\xb2\xd0\xbe\xd1\x81 2\xd1\x82\xd0\xb2\xd0\xbe\xd1\x8e 2\xd1\x821\xd0\xb2\xd1\x80 2\xd1\x82\xd0\xb2\xd1\x83 2\xd1\x82\xd0\xb2\xd1\x8b 2\xd1\x82\xd0\xb2\xd1\x8f 2\xd1\x82\xd0\xb3 2\xd1\x821\xd0\xb4 1\xd1\x822\xd0\xb5 \xd1\x82\xd0\xb52\xd0\xb3\xd0\xbd \xd1\x82\xd0\xb51\xd0\xb4 \xd1\x82\xd0\xb51\xd0\xb7\xd0\xbe 3\xd1\x82\xd0\xb5\xd0\xba\xd0\xb0 \xd1\x82\xd0\xb5\xd0\xba1\xd0\xbb 3\xd1\x82\xd0\xb5\xd0\xba\xd1\x88 \xd1\x82\xd0\xb5\xd0\xbb\xd0\xb51\xd0\xbe \xd1\x82\xd0\xb5\xd0\xbc2\xd0\xb11 \xd1\x82\xd0\xb52\xd0\xbe3\xd0\xb4 \xd1\x82\xd0\xb51\xd0\xbe\xd1\x85 \xd1\x82\xd0\xb54\xd0\xbf1\xd0\xbb \xd1\x82\xd0\xb52\xd1\x80\xd0\xb0\xd0\xba \xd1\x82\xd0\xb5\xd1\x80\xd0\xb52\xd0\xbe 3\xd1\x82\xd0\xb5\xd1\x80\xd0\xb7 \xd1\x82\xd0\xb5\xd1\x803\xd0\xba 3\xd1\x82\xd0\xb5\xd1\x80\xd1\x8f \xd1\x82\xd0\xb52\xd1\x81\xd0\xba\xd0\xb0 \xd1\x82\xd0\xb52\xd1\x811\xd0\xba\xd0\xb8 \xd1\x82\xd0\xb52\xd1\x811\xd0\xba\xd0\xbe \xd1\x82\xd0\xb52\xd1\x81\xd0\xba\xd1\x83 \xd1\x82\xd0\xb5\xd1\x81\xd1\x822 \xd1\x82\xd0\xb52\xd1\x85\xd0\xbe 2\xd1\x82\xd0\xb6 2\xd1\x821\xd0\xb7 \xd1\x82\xd0\xb8\xd0\xb02\xd0\xbc \xd1\x82\xd0\xb82\xd0\xb1\xd0\xbb \xd1\x82\xd0\xb83\xd0\xb42 \xd1\x82\xd0\xb81\xd0\xb7\xd0\xbd\xd0\xb0 \xd1\x82\xd0\xb8\xd0\xb82 \xd1\x82\xd0\xb8\xd0\xb8\xd1\x811 \xd1\x82\xd0\xb8\xd0\xba2 \xd1\x82\xd0\xb8\xd0\xbb\xd0\xb02\xd0\xbc \xd1\x821\xd0\xb8\xd0\xbc\xd0\xbf 2\xd1\x821\xd0\xb8\xd0\xbd\xd0\xb2 \xd1\x821\xd0\xb8\xd0\xbd\xd0\xb4 2\xd1\x82\xd0\xb8\xd0\xbd\xd0\xb6 2\xd1\x82\xd0\xb8\xd0\xbd\xd1\x84 \xd1\x82\xd0\xb81\xd1\x812\xd0\xbb \xd1\x82\xd0\xb83\xd1\x81\xd1\x82\xd0\xb2 \xd1\x82\xd0\xb83\xd1\x842\xd1\x80 \xd1\x82\xd0\xb81\xd1\x85\xd1\x80 2\xd1\x821\xd0\xba2 3\xd1\x822\xd0\xba\xd0\xb0\xd0\xb2 3\xd1\x822\xd0\xba\xd0\xb0\xd0\xbd 3\xd1\x822\xd0\xba\xd0\xb5\xd1\x82 3\xd1\x82\xd0\xba\xd0\xbd 2\xd1\x821\xd0\xbb \xd1\x82\xd0\xbb\xd0\xbe2\xd0\xb1 \xd1\x822\xd0\xbb\xd1\x8c \xd1\x82\xd0\xbc2 \xd1\x82\xd0\xbc\xd0\xb82\xd1\x81 \xd1\x82\xd0\xbc\xd0\xb8\xd1\x81\xd1\x821 \xd1\x823\xd0\xbc\xd1\x89 2\xd1\x821\xd0\xbd \xd1\x82\xd0\xbe2\xd0\xb1\xd0\xb5\xd1\x81 \xd1\x82\xd0\xbe1\xd0\xb12\xd0\xbb 2\xd1\x82\xd0\xbe\xd0\xb1\xd1\x8a \xd1\x82\xd0\xbe2\xd0\xb2\xd0\xbb \xd1\x82\xd0\xbe1\xd0\xb4 \xd1\x82\xd0\xbe3\xd0\xb42\xd1\x80 \xd1\x82\xd0\xbe1\xd0\xb72 \xd1\x82\xd0\xbe\xd0\xba2\xd1\x80 2\xd1\x821\xd0\xbe\xd0\xbc\xd0\xbc 2\xd1\x82\xd0\xbe\xd0\xbc\xd1\x81 2\xd1\x82\xd0\xbe\xd0\xbd\xd0\xb3 1\xd1\x82\xd0\xbe\xd1\x80\xd0\xb3 1\xd1\x82\xd0\xbe\xd1\x80\xd0\xb6 1\xd1\x82\xd0\xbe\xd1\x80\xd1\x81 \xd1\x82\xd0\xbe1\xd1\x80\xd1\x83 1\xd1\x82\xd0\xbe\xd1\x80\xd1\x88 \xd1\x82\xd0\xbe1\xd1\x812\xd0\xbd \xd1\x82\xd0\xbe1\xd1\x812\xd0\xbf \xd1\x82\xd0\xbe1\xd1\x812\xd1\x86 2\xd1\x82\xd0\xbe\xd1\x82\xd0\xb4 \xd1\x82\xd0\xbe3\xd1\x82\xd0\xba 1\xd1\x82\xd0\xbe\xd1\x89 2\xd1\x82\xd0\xbf2 \xd1\x82\xd0\xbf\xd0\xb01\xd1\x82 \xd1\x821\xd1\x80\xd0\xb0\xd0\xb3\xd0\xb0 2\xd1\x821\xd1\x80\xd0\xb0\xd0\xb6 2\xd1\x82\xd1\x80\xd0\xb1 2\xd1\x82\xd1\x80\xd0\xb2 2\xd1\x82\xd1\x80\xd0\xb3 2\xd1\x82\xd1\x80\xd0\xb4 \xd1\x82\xd1\x80\xd0\xb4\xd0\xbe2 \xd1\x821\xd1\x80\xd0\xb5\xd0\xb0 1\xd1\x82\xd1\x80\xd0\xb5\xd0\xb1\xd0\xbe 1\xd1\x82\xd1\x80\xd0\xb5\xd0\xb1\xd1\x83 \xd1\x821\xd1\x80\xd0\xb5\xd0\xb1\xd1\x8c \xd1\x821\xd1\x80\xd0\xb5\xd0\xb2\xd0\xb5 \xd1\x821\xd1\x80\xd0\xb5\xd0\xb2\xd1\x88 \xd1\x821\xd1\x80\xd0\xb5\xd0\xb3 \xd1\x821\xd1\x80\xd0\xb5\xd0\xb4 \xd1\x821\xd1\x80\xd0\xb5\xd0\xb5 \xd1\x821\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb0 \xd1\x821\xd1\x80\xd0\xb5\xd0\xb7\xd0\xbd \xd1\x82\xd1\x80\xd0\xb5\xd0\xbf1\xd0\xbb 3\xd1\x82\xd1\x80\xd0\xb52\xd1\x81 \xd1\x82\xd1\x80\xd0\xb5\xd1\x811\xd0\xba \xd1\x821\xd1\x80\xd0\xb5\xd1\x81\xd1\x82 \xd1\x821\xd1\x80\xd0\xb5\xd1\x82\xd1\x83 3\xd1\x822\xd1\x80\xd0\xb52\xd1\x85 \xd1\x821\xd1\x80\xd0\xb5\xd1\x86 \xd1\x822\xd1\x80\xd0\xb5\xd1\x88\xd1\x8c \xd1\x821\xd1\x80\xd0\xb5\xd1\x8e 1\xd1\x82\xd1\x80\xd0\xb8\xd0\xb1 \xd1\x821\xd1\x80\xd0\xb8\xd0\xb2 \xd1\x82\xd1\x80\xd0\xb82\xd0\xb31\xd0\xbb \xd1\x821\xd1\x80\xd0\xb8\xd0\xbb \xd1\x821\xd1\x80\xd0\xb8\xd0\xbc 4\xd1\x82\xd1\x80\xd0\xb8\xd0\xbd\xd1\x81 \xd1\x82\xd1\x80\xd0\xb81\xd0\xbe \xd1\x821\xd1\x80\xd0\xb8\xd1\x82 \xd1\x82\xd1\x80\xd0\xb83\xd1\x84 \xd1\x821\xd1\x80\xd0\xb8\xd1\x89 2\xd1\x82\xd1\x80\xd0\xbc 2\xd1\x82\xd1\x80\xd0\xbd \xd1\x821\xd1\x80\xd0\xbe\xd0\xb3\xd0\xbb \xd1\x821\xd1\x80\xd0\xbe\xd0\xb8\xd0\xb4 2\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9 \xd1\x82\xd1\x80\xd0\xbe3\xd0\xbf\xd0\xbb \xd1\x821\xd1\x80\xd0\xbe\xd1\x80 \xd1\x821\xd1\x80\xd0\xbe\xd1\x81\xd0\xbe \xd1\x82\xd1\x80\xd0\xbe3\xd1\x82 4\xd1\x823\xd1\x80\xd0\xbe\xd1\x86 2\xd1\x82\xd1\x80\xd0\xbe\xd1\x8e 2\xd1\x82\xd1\x80\xd0\xbf 2\xd1\x82\xd1\x80\xd1\x80 1\xd1\x82\xd1\x80\xd1\x83\xd0\xb1 \xd1\x822\xd1\x80\xd1\x83\xd0\xb4 2\xd1\x82\xd1\x80\xd1\x83\xd0\xba \xd1\x822\xd1\x80\xd1\x83\xd0\xbc \xd1\x822\xd1\x80\xd1\x83\xd1\x82 2\xd1\x82\xd1\x80\xd1\x84 2\xd1\x82\xd1\x80\xd1\x89 2\xd1\x82\xd1\x80\xd1\x8a \xd1\x821\xd1\x80\xd1\x8b \xd1\x821\xd1\x80\xd1\x8f_ \xd1\x821\xd1\x80\xd1\x8f\xd0\xb2 2\xd1\x821\xd1\x80\xd1\x8f\xd0\xb4 \xd1\x821\xd1\x80\xd1\x8f\xd0\xb5 \xd1\x821\xd1\x80\xd1\x8f\xd0\xb6 \xd1\x821\xd1\x80\xd1\x8f\xd0\xb9 \xd1\x823\xd1\x80\xd1\x8f\xd0\xba \xd1\x821\xd1\x80\xd1\x8f\xd1\x82 \xd1\x821\xd1\x80\xd1\x8f\xd1\x89 \xd1\x821\xd1\x80\xd1\x8f\xd1\x8f 4\xd1\x821\xd1\x812 \xd1\x822\xd1\x81\xd0\xb1 \xd1\x822\xd1\x813\xd0\xb4 \xd1\x82\xd1\x81\xd0\xb5\xd0\xbf2 \xd1\x822\xd1\x813\xd0\xbc \xd1\x822\xd1\x813\xd0\xbf 2\xd1\x821\xd1\x82 \xd1\x822\xd1\x82\xd0\xbc \xd1\x82\xd1\x832\xd0\xb3\xd1\x80 \xd1\x82\xd1\x832\xd0\xb6\xd0\xb8\xd0\xbd 2\xd1\x821\xd1\x832\xd0\xbf\xd1\x80 \xd1\x82\xd1\x831\xd1\x81\xd0\xbb \xd1\x82\xd1\x831\xd1\x81\xd1\x82 \xd1\x82\xd1\x832\xd1\x84\xd0\xbb 1\xd1\x82\xd1\x83\xd1\x88\xd0\xb0 1\xd1\x82\xd1\x83\xd1\x88\xd0\xbe 1\xd1\x82\xd1\x83\xd1\x88\xd1\x8c 1\xd1\x82\xd1\x83\xd1\x89 2\xd1\x82\xd1\x84 2\xd1\x821\xd1\x85 4\xd1\x82\xd1\x86 2\xd1\x821\xd1\x87 2\xd1\x82\xd1\x882 2\xd1\x82\xd1\x89 2\xd1\x82\xd1\x8a \xd1\x82\xd1\x8b2\xd0\xb31 \xd1\x82\xd1\x8b2\xd1\x811\xd0\xba 2\xd1\x82\xd1\x8c 4\xd1\x82\xd1\x8c_ 3\xd1\x82\xd1\x8c\xd0\xb5 3\xd1\x82\xd1\x8c\xd0\xb8 \xd1\x82\xd1\x8c2\xd0\xbc 4\xd1\x82\xd1\x8c\xd1\x82 \xd1\x82\xd1\x8c\xd1\x8e1 2\xd1\x82\xd1\x8d \xd1\x822\xd1\x8e \xd1\x82\xd1\x8e1\xd1\x82 1\xd1\x82\xd1\x8f\xd0\xb3 1\xd1\x82\xd1\x8f\xd0\xb6 1\xd1\x82\xd1\x8f\xd0\xbf 2\xd1\x82\xd1\x8f2\xd1\x87 \xd1\x831\xd0\xb0 \xd1\x832\xd0\xb0\xd0\xbb\xd0\xb5 \xd1\x832\xd0\xb0\xd1\x81 \xd1\x833\xd0\xb1\xd0\xb5\xd0\xbb \xd1\x83\xd0\xb1\xd0\xbe1\xd0\xb4 \xd1\x83\xd0\xb1\xd0\xbe\xd1\x812 \xd1\x83\xd0\xb11\xd1\x80 1\xd1\x83\xd0\xb1\xd1\x80\xd0\xb0 \xd1\x83\xd0\xb13\xd1\x80\xd1\x8e 1\xd1\x832\xd0\xb1\xd1\x8b\xd1\x82 \xd1\x831\xd0\xb2\xd0\xb5_ \xd1\x831\xd0\xb2\xd0\xb8 \xd1\x83\xd0\xb22\xd0\xbb \xd1\x831\xd0\xb2\xd0\xbe \xd1\x831\xd0\xb2\xd1\x83 \xd1\x832\xd0\xb3\xd0\xb2 \xd1\x832\xd0\xb3\xd0\xbb \xd1\x832\xd0\xb3\xd0\xbd \xd1\x83\xd0\xb32\xd0\xbd\xd0\xb0 \xd1\x83\xd0\xb32\xd0\xbd\xd0\xb5 \xd1\x83\xd0\xb31\xd1\x80\xd0\xb5 \xd1\x83\xd0\xb31\xd1\x80\xd1\x8f \xd1\x83\xd0\xb4\xd0\xb01\xd1\x81 \xd1\x83\xd0\xb42\xd0\xb2 \xd1\x83\xd0\xb41\xd1\x80\xd0\xb0\xd0\xbc \xd1\x83\xd0\xb41\xd1\x80\xd0\xbe \xd1\x833\xd0\xb4\xd1\x83 \xd1\x831\xd0\xb5 \xd1\x83\xd0\xb52\xd0\xb4 \xd1\x83\xd0\xb52\xd0\xbb \xd1\x83\xd0\xb51\xd1\x81 \xd1\x83\xd0\xb52\xd1\x811\xd0\xba \xd1\x83\xd0\xb5\xd1\x812\xd0\xbb \xd1\x83\xd0\xb52\xd1\x85 \xd1\x832\xd0\xb6\xd0\xb6 \xd1\x831\xd0\xb72\xd0\xb2 \xd1\x831\xd0\xb7\xd0\xbe \xd1\x83\xd0\xb7\xd0\xbe3\xd0\xbf \xd1\x831\xd0\xb8 \xd1\x831\xd0\xba\xd0\xb0 \xd1\x83\xd0\xba1\xd0\xb2 \xd1\x831\xd0\xba\xd0\xb8 \xd1\x831\xd0\xba\xd0\xbe \xd1\x83\xd0\xba\xd0\xbe1\xd0\xb1 \xd1\x831\xd0\xba\xd1\x831 \xd1\x831\xd0\xbb\xd0\xb0 \xd1\x831\xd0\xbb\xd0\xb5 \xd1\x831\xd0\xbb\xd1\x83 \xd1\x831\xd0\xbb\xd1\x8b\xd1\x85 \xd1\x831\xd0\xbb\xd1\x8e \xd1\x832\xd0\xbc\xd1\x87 \xd1\x833\xd0\xbd\xd0\xb0 \xd1\x83\xd0\xbd2\xd0\xb41\xd1\x80 \xd1\x831\xd0\xbd\xd1\x8c \xd1\x831\xd0\xbe \xd1\x83\xd0\xbe2\xd0\xb1 \xd1\x83\xd0\xbe2\xd0\xb2 \xd1\x832\xd0\xbe\xd0\xb7\xd0\xb0 \xd1\x83\xd0\xbe2\xd0\xba \xd1\x83\xd0\xbe2\xd0\xbf \xd1\x83\xd0\xbe2\xd1\x81 \xd1\x83\xd0\xbe\xd1\x81\xd1\x821 \xd1\x83\xd0\xbe2\xd1\x821 \xd1\x83\xd0\xbe2\xd1\x84 \xd1\x832\xd0\xbf\xd0\xbb \xd1\x83\xd0\xbf1\xd0\xbb\xd1\x8e \xd1\x833\xd0\xbf\xd1\x80\xd0\xbe \xd1\x831\xd1\x80\xd0\xb0 \xd1\x831\xd1\x80\xd0\xb5 \xd1\x83\xd1\x80\xd0\xb52\xd1\x823\xd1\x80 \xd1\x831\xd1\x80\xd0\xb8 \xd1\x83\xd1\x80\xd0\xba\xd0\xb53 \xd1\x831\xd1\x80\xd0\xbe \xd1\x832\xd1\x80\xd0\xbe\xd0\xb4 \xd1\x83\xd1\x80\xd0\xbe2\xd0\xb4\xd0\xbb \xd1\x83\xd1\x80\xd1\x822\xd1\x80 \xd1\x833\xd1\x80\xd1\x83 \xd1\x831\xd1\x80\xd1\x8b \xd1\x831\xd1\x80\xd1\x8e \xd1\x831\xd1\x80\xd1\x8f \xd1\x832\xd1\x81\xd0\xb0\xd0\xb4 \xd1\x831\xd1\x81\xd0\xb3 \xd1\x83\xd1\x811\xd0\xba\xd0\xb0 \xd1\x83\xd1\x811\xd0\xba\xd0\xb8 \xd1\x83\xd1\x81\xd0\xba3\xd0\xbb \xd1\x83\xd1\x811\xd0\xba\xd0\xbe\xd0\xbc \xd1\x831\xd1\x81\xd0\xba\xd1\x80 \xd1\x83\xd1\x811\xd0\xba\xd1\x83_ \xd1\x83\xd1\x812\xd0\xbb \xd1\x83\xd1\x81\xd0\xbb\xd0\xb04\xd0\xb63 \xd1\x83\xd1\x813\xd0\xbb\xd0\xb8 \xd1\x831\xd1\x81\xd0\xbc \xd1\x832\xd1\x81\xd0\xbd \xd1\x83\xd1\x812\xd0\xbf \xd1\x83\xd1\x813\xd1\x81 \xd1\x831\xd1\x81\xd1\x82\xd0\xb5 \xd1\x831\xd1\x81\xd1\x82\xd1\x8f \xd1\x831\xd1\x81\xd1\x84 2\xd1\x83\xd1\x81\xd1\x86 \xd1\x832\xd1\x81\xd1\x87 \xd1\x832\xd1\x81\xd1\x8c \xd1\x833\xd1\x81\xd1\x8c\xd1\x8f \xd1\x831\xd1\x82\xd0\xb0 \xd1\x833\xd1\x82\xd0\xb5\xd1\x80 \xd1\x831\xd1\x82\xd0\xb8 \xd1\x83\xd1\x822\xd0\xbb\xd1\x8f \xd1\x831\xd1\x82\xd0\xbe \xd1\x83\xd1\x82\xd0\xbe3\xd0\xbf2\xd1\x81 \xd1\x83\xd1\x821\xd1\x80\xd0\xb8 \xd1\x831\xd1\x82\xd1\x83 \xd1\x831\xd1\x82\xd1\x8b \xd1\x831\xd1\x82\xd1\x8c\xd0\xb5 \xd1\x833\xd1\x82\xd1\x8c\xd1\x8e 1\xd1\x83\xd1\x82\xd1\x8e \xd1\x831\xd1\x82\xd1\x8f \xd1\x831\xd1\x83 \xd1\x83\xd1\x83\xd0\xb32 \xd1\x83\xd1\x832\xd1\x81 \xd1\x833\xd1\x84\xd0\xb8 \xd1\x83\xd1\x841\xd0\xbb \xd1\x83\xd1\x842\xd0\xbb\xd1\x8f \xd1\x832\xd1\x84\xd1\x80 \xd1\x83\xd1\x851\xd0\xb0\xd0\xb4 \xd1\x83\xd1\x85\xd0\xb02\xd1\x82 \xd1\x832\xd1\x85\xd0\xb2 \xd1\x833\xd1\x854\xd0\xb2\xd0\xbe \xd1\x83\xd1\x851\xd0\xbb \xd1\x83\xd1\x853\xd0\xbb\xd1\x8f \xd1\x83\xd1\x851\xd1\x80 \xd1\x832\xd1\x87\xd0\xb5\xd0\xb1 1\xd1\x83\xd1\x87\xd1\x80 \xd1\x831\xd1\x87\xd1\x8c \xd1\x833\xd1\x88\xd0\xb5 \xd1\x833\xd1\x88\xd0\xb8 \xd1\x832\xd1\x88\xd0\xbb \xd1\x83\xd1\x881\xd0\xbb\xd0\xb0 \xd1\x832\xd1\x88\xd0\xbf 2\xd1\x83\xd1\x8d \xd1\x831\xd1\x8f \xd1\x83\xd1\x8f2\xd0\xb7 1\xd1\x84 \xd1\x84\xd0\xb02\xd0\xb11 \xd1\x84\xd0\xb02\xd0\xb3\xd0\xbd \xd1\x84\xd0\xb01\xd0\xb7\xd0\xbe \xd1\x84\xd0\xb0\xd0\xbd2\xd0\xb4 \xd1\x84\xd0\xb0\xd0\xbd\xd0\xb41\xd1\x80 \xd1\x84\xd0\xb01\xd1\x82\xd1\x80 \xd1\x84\xd0\xb02\xd1\x85 3\xd1\x84\xd0\xb0\xd1\x88 \xd1\x84\xd0\xb0\xd1\x8d1 2\xd1\x841\xd0\xb1 2\xd1\x841\xd0\xb2 2\xd1\x84\xd0\xb3 2\xd1\x841\xd0\xb4 \xd1\x84\xd0\xb5\xd0\xb21\xd1\x80 \xd1\x84\xd0\xb5\xd0\xb41\xd1\x80 \xd1\x84\xd0\xb51\xd0\xbe3 \xd1\x84\xd0\xb52\xd1\x811\xd0\xba \xd1\x844\xd0\xb8 \xd1\x84\xd0\xb8\xd0\xb02\xd0\xba1 \xd1\x84\xd0\xb82\xd0\xb3\xd0\xbb \xd1\x84\xd0\xb82\xd0\xb6 \xd1\x84\xd0\xb82\xd0\xb7\xd0\xbe \xd1\x84\xd0\xb82\xd0\xbd\xd0\xb8\xd0\xbd \xd1\x84\xd0\xb81\xd0\xbe 3\xd1\x84\xd0\xb8\xd1\x82 2\xd1\x841\xd0\xba \xd1\x842\xd0\xbb\xd0\xb0 \xd1\x842\xd0\xbb\xd0\xb8 \xd1\x842\xd0\xbb\xd0\xbe 2\xd1\x84\xd0\xbc 2\xd1\x841\xd0\xbd 2\xd1\x84\xd0\xbe\xd0\xb1\xd1\x8a 3\xd1\x84\xd0\xbe\xd0\xbd \xd1\x84\xd0\xbe2\xd1\x80\xd0\xb2 2\xd1\x841\xd0\xbe\xd1\x80\xd0\xb3 \xd1\x84\xd0\xbe\xd1\x803\xd1\x82\xd1\x80 \xd1\x84\xd0\xbe1\xd1\x80\xd1\x83 \xd1\x84\xd0\xbe\xd1\x811\xd0\xba 3\xd1\x84\xd0\xbe\xd1\x82 \xd1\x84\xd0\xbe\xd1\x82\xd0\xbe3\xd0\xbf \xd1\x841\xd1\x80\xd0\xb0\xd0\xb1 \xd1\x84\xd1\x80\xd0\xb01\xd0\xb7 \xd1\x84\xd1\x80\xd0\xb01\xd1\x81 \xd1\x841\xd1\x80\xd0\xb0\xd1\x82 \xd1\x842\xd1\x80\xd0\xb5\xd0\xbd \xd1\x84\xd1\x80\xd0\xb52\xd1\x81 \xd1\x841\xd1\x80\xd0\xb8 \xd1\x842\xd1\x80\xd0\xb8\xd0\xb6 \xd1\x842\xd1\x80\xd0\xb8\xd0\xb7 \xd1\x841\xd1\x80\xd0\xbe \xd1\x842\xd1\x80\xd0\xbe\xd0\xbd \xd1\x841\xd1\x80\xd1\x83 2\xd1\x843\xd1\x81 2\xd1\x841\xd1\x82 \xd1\x842\xd1\x82\xd0\xbc \xd1\x842\xd1\x82\xd0\xbe\xd1\x80 2\xd1\x841\xd1\x832\xd0\xbf \xd1\x84\xd1\x833\xd1\x82\xd0\xbb 2\xd1\x84\xd1\x83\xd1\x84 2\xd1\x84\xd1\x84 2\xd1\x841\xd1\x87 2\xd1\x84\xd1\x882 2\xd1\x84\xd1\x8c_ \xd1\x842\xd1\x8e1 1\xd1\x85\xd0\xb0 \xd1\x85\xd0\xb02\xd0\xb1\xd0\xbb \xd1\x85\xd0\xb02\xd0\xb4 2\xd1\x851\xd0\xb0\xd0\xba \xd1\x85\xd0\xb0\xd0\xbd2\xd0\xb4 \xd1\x85\xd0\xb0\xd0\xbe3 \xd1\x851\xd0\xb0\xd1\x80\xd1\x88 2\xd1\x851\xd0\xb1 1\xd1\x852\xd0\xb2 2\xd1\x853\xd0\xb2\xd0\xb5 2\xd1\x853\xd0\xb2\xd0\xb8 \xd1\x853\xd0\xb2\xd1\x8b 2\xd1\x85\xd0\xb3 \xd1\x853\xd0\xb42 1\xd1\x85\xd0\xb5 \xd1\x85\xd0\xb5\xd0\xbe3 \xd1\x851\xd0\xb72 1\xd1\x85\xd0\xb8 \xd1\x85\xd0\xb8\xd0\xb0\xd1\x821 \xd1\x85\xd0\xb8\xd0\xb52 2\xd1\x851\xd0\xb8\xd0\xb7\xd1\x8b \xd1\x85\xd0\xb81\xd1\x812 \xd1\x851\xd0\xba2 \xd1\x851\xd0\xbb\xd0\xb0\xd0\xb2 \xd1\x851\xd0\xbb\xd0\xb0\xd1\x81 \xd1\x851\xd0\xbb\xd0\xb0\xd1\x82 \xd1\x851\xd0\xbb\xd0\xb0\xd1\x86 1\xd1\x85\xd0\xbb\xd0\xb5\xd0\xb1 \xd1\x852\xd0\xbb\xd0\xb5\xd1\x81 \xd1\x851\xd0\xbb\xd0\xb5\xd1\x82 \xd1\x853\xd0\xbb\xd0\xbe_ \xd1\x852\xd0\xbb\xd0\xbe\xd0\xbf 1\xd1\x852\xd0\xbb\xd0\xbe\xd1\x80 \xd1\x851\xd0\xbb\xd1\x83 1\xd1\x852\xd0\xbc\xd1\x83 2\xd1\x851\xd0\xbd 3\xd1\x852\xd0\xbd\xd1\x8b 1\xd1\x85\xd0\xbe 2\xd1\x851\xd0\xbe2\xd0\xba \xd1\x85\xd0\xbe\xd0\xbf2 \xd1\x85\xd0\xbe2\xd0\xbf\xd0\xb5 \xd1\x85\xd0\xbe2\xd0\xbf\xd0\xbe\xd1\x80 \xd1\x85\xd0\xbe1\xd1\x80\xd1\x83 \xd1\x851\xd0\xbe\xd1\x81\xd0\xbc 2\xd1\x851\xd0\xbe\xd1\x81\xd0\xbd \xd1\x85\xd0\xbe\xd1\x842 \xd1\x85\xd0\xbe\xd1\x851\xd0\xbb \xd1\x85\xd0\xbe\xd1\x8f2 \xd1\x85\xd0\xbf2 \xd1\x851\xd1\x80\xd0\xb0\xd0\xb7 1\xd1\x85\xd1\x80\xd0\xb0\xd0\xbd \xd1\x851\xd1\x80\xd0\xb01\xd1\x812 \xd1\x851\xd1\x80\xd0\xb5\xd0\xb9 \xd1\x85\xd1\x80\xd0\xb82\xd0\xbf\xd0\xbb \xd1\x852\xd1\x80\xd0\xb8\xd1\x81 \xd1\x851\xd1\x80\xd0\xbe\xd0\xb2 1\xd1\x85\xd1\x80\xd0\xbe\xd0\xbc \xd1\x85\xd1\x80\xd0\xbe2\xd0\xbc\xd1\x87 \xd1\x851\xd1\x80\xd1\x8b \xd1\x851\xd1\x80\xd1\x8f 2\xd1\x851\xd1\x812 2\xd1\x851\xd1\x82 1\xd1\x85\xd1\x83_ \xd1\x851\xd1\x832\xd0\xb3 2\xd1\x85\xd1\x83\xd0\xb5 2\xd1\x85\xd1\x83\xd0\xb9 1\xd1\x85\xd1\x83\xd0\xbd \xd1\x851\xd1\x832\xd1\x80 \xd1\x85\xd1\x833\xd1\x80\xd0\xb0 1\xd1\x85\xd1\x83\xd1\x81 1\xd1\x85\xd1\x83\xd1\x88 2\xd1\x85\xd1\x83\xd1\x8e \xd1\x851\xd1\x852 2\xd1\x851\xd1\x872 2\xd1\x85\xd1\x88 \xd1\x85\xd1\x8c\xd1\x8e1 1\xd1\x86 \xd1\x86\xd0\xb01 3\xd1\x86\xd0\xb0_ 3\xd1\x86\xd0\xb0\xd0\xbc \xd1\x86\xd0\xb02\xd0\xbf\xd0\xbb 3\xd1\x86\xd0\xb0\xd1\x85 2\xd1\x861\xd0\xb1 \xd1\x862\xd0\xb2\xd0\xb5 2\xd1\x86\xd0\xb2\xd1\x8b 2\xd1\x86\xd0\xb3 2\xd1\x861\xd0\xb4 \xd1\x86\xd0\xb51\xd0\xb7 \xd1\x86\xd0\xb51\xd0\xba \xd1\x86\xd0\xb51\xd0\xbe\xd1\x82 \xd1\x86\xd0\xb5\xd0\xbf1\xd0\xbb \xd1\x86\xd0\xb5\xd1\x812\xd0\xbb \xd1\x86\xd0\xb51\xd1\x82 2\xd1\x86\xd0\xb5\xd1\x82\xd0\xb0\xd1\x82 2\xd1\x861\xd0\xb7 \xd1\x86\xd0\xb81 \xd1\x86\xd0\xb82\xd0\xba1 \xd1\x86\xd0\xb8\xd0\xba3\xd0\xbb \xd1\x86\xd0\xb82\xd0\xbe\xd0\xbb \xd1\x86\xd0\xb8\xd0\xbf2 \xd1\x86\xd0\xb82\xd1\x81\xd0\xba \xd1\x86\xd0\xb8\xd1\x833 \xd1\x86\xd0\xb8\xd1\x841\xd1\x80 2\xd1\x861\xd0\xba2 2\xd1\x861\xd0\xbb 2\xd1\x86\xd0\xbc 2\xd1\x861\xd0\xbd \xd1\x861\xd0\xbe2\xd0\xb1 2\xd1\x861\xd0\xbe2\xd0\xb4 2\xd1\x861\xd0\xbe\xd1\x82 2\xd1\x86\xd0\xbf2 2\xd1\x861\xd1\x80 2\xd1\x861\xd1\x81 2\xd1\x861\xd1\x82 3\xd1\x86\xd1\x83 2\xd1\x86\xd1\x86 2\xd1\x863\xd1\x882 3\xd1\x86\xd1\x8b \xd1\x86\xd1\x8b2\xd0\xbf \xd1\x86\xd1\x8b\xd0\xbf3\xd0\xbb \xd1\x86\xd1\x8e1 1\xd1\x87\xd0\xb0 \xd1\x87\xd0\xb02\xd0\xb4\xd1\x80 \xd1\x87\xd0\xb02\xd0\xb4\xd1\x86 \xd1\x87\xd0\xb02\xd0\xb5\xd0\xb2\xd0\xbe \xd1\x87\xd0\xb02\xd0\xb5\xd0\xb2\xd1\x8b \xd1\x87\xd0\xb02\xd0\xb5\xd1\x80 \xd1\x87\xd0\xb0\xd1\x81\xd1\x821\xd0\xb2 \xd1\x87\xd0\xb01\xd1\x81\xd1\x82\xd0\xb5 \xd1\x87\xd0\xb01\xd1\x81\xd1\x82\xd1\x83 \xd1\x87\xd0\xb01\xd1\x81\xd1\x82\xd1\x8f 3\xd1\x87\xd0\xb0\xd1\x82\xd0\xbe 3\xd1\x87\xd0\xb0\xd1\x82\xd1\x8b 2\xd1\x871\xd0\xb1 \xd1\x871\xd0\xb2 2\xd1\x871\xd0\xb4 1\xd1\x87\xd0\xb5 \xd1\x87\xd0\xb51\xd0\xb2\xd0\xbb \xd1\x87\xd0\xb52\xd0\xb3\xd0\xbb \xd1\x87\xd0\xb51\xd0\xbe \xd1\x87\xd0\xb5\xd1\x802\xd1\x81 \xd1\x87\xd0\xb5\xd1\x80\xd1\x81\xd1\x821 \xd1\x87\xd0\xb51\xd1\x81\xd0\xbb \xd1\x872\xd0\xb6 \xd1\x87\xd0\xb6\xd0\xbe2 1\xd1\x87\xd0\xb8 3\xd1\x87\xd0\xb8\xd0\xba 3\xd1\x87\xd0\xb8\xd1\x86 2\xd1\x871\xd0\xba 1\xd1\x872\xd0\xbb\xd0\xb0 \xd1\x872\xd0\xbb\xd0\xb5 \xd1\x873\xd0\xbb\xd0\xb5\xd0\xb3 \xd1\x873\xd0\xbb\xd0\xb5\xd0\xb6 2\xd1\x87\xd0\xbb\xd0\xb8 \xd1\x872\xd0\xbb\xd0\xb8_ 1\xd1\x872\xd0\xbb\xd0\xbe 1\xd1\x87\xd0\xbc 2\xd1\x87\xd0\xbc\xd0\xb0 2\xd1\x87\xd0\xbc\xd0\xb5 \xd1\x872\xd0\xbc\xd0\xbe 2\xd1\x871\xd0\xbd 3\xd1\x87\xd0\xbe 2\xd1\x871\xd1\x81 2\xd1\x871\xd1\x82\xd0\xb0 \xd1\x872\xd1\x82\xd0\xb5 2\xd1\x87\xd1\x82\xd0\xbc 1\xd1\x87\xd1\x83 3\xd1\x87\xd1\x83\xd0\xba \xd1\x872\xd1\x85 2\xd1\x871\xd1\x87 2\xd1\x87\xd1\x8c_ 1\xd1\x87\xd1\x8c\xd0\xb5 1\xd1\x87\xd1\x8c\xd0\xb8 2\xd1\x87\xd1\x8c\xd1\x81 2\xd1\x87\xd1\x8c\xd1\x82 1\xd1\x87\xd1\x8c\xd1\x8e 1\xd1\x87\xd1\x8c\xd1\x8f 1\xd1\x88 \xd1\x88\xd0\xb02\xd0\xb1\xd0\xbb \xd1\x88\xd0\xb02\xd0\xb3\xd0\xbd \xd1\x88\xd0\xb02\xd0\xb31\xd1\x80 \xd1\x88\xd0\xb02\xd0\xb4\xd1\x80 \xd1\x88\xd0\xb0\xd0\xbd2\xd0\xba\xd1\x80 \xd1\x88\xd0\xb0\xd1\x803\xd1\x822 \xd1\x88\xd0\xb01\xd1\x81\xd1\x82 \xd1\x88\xd0\xb01\xd1\x82\xd1\x80\xd0\xbe 2\xd1\x881\xd0\xb1 \xd1\x882\xd0\xb2 \xd1\x883\xd0\xb2\xd0\xb5\xd0\xbd \xd1\x88\xd0\xb52\xd0\xb3\xd0\xbb \xd1\x88\xd0\xb51\xd0\xba \xd1\x88\xd0\xb51\xd0\xbe2 \xd1\x88\xd0\xb53\xd0\xbf\xd0\xbb \xd1\x88\xd0\xb51\xd1\x812 \xd1\x88\xd0\xb82\xd0\xb1\xd0\xbb \xd1\x88\xd0\xb82\xd0\xbf\xd0\xbb \xd1\x88\xd0\xb8\xd1\x841\xd1\x80 2\xd1\x881\xd0\xba2 3\xd1\x882\xd0\xba\xd0\xbe\xd0\xbb 2\xd1\x881\xd0\xbb\xd0\xb5\xd0\xb9 2\xd1\x88\xd0\xbb\xd0\xb5\xd0\xbd \xd1\x882\xd0\xbb\xd0\xb8_ 2\xd1\x88\xd0\xbb\xd0\xb8\xd0\xb2 2\xd1\x88\xd0\xbb\xd0\xb8\xd0\xbb \xd1\x882\xd0\xbb\xd0\xb8\xd0\xbd \xd1\x882\xd0\xbb\xd0\xb8\xd1\x81 \xd1\x882\xd0\xbb\xd0\xb8\xd1\x82\xd0\xb5 \xd1\x882\xd0\xbb\xd0\xb8\xd1\x84 \xd1\x882\xd0\xbb\xd0\xbe_ 2\xd1\x88\xd0\xbb\xd0\xbe\xd0\xb2 \xd1\x882\xd0\xbb\xd0\xbe\xd0\xb3 \xd1\x881\xd0\xbb\xd1\x8b \xd1\x882\xd0\xbb\xd1\x8e 2\xd1\x88\xd0\xbb\xd1\x8f\xd0\xb5 2\xd1\x88\xd0\xbb\xd1\x8f\xd0\xba \xd1\x882\xd0\xbb\xd1\x8f\xd0\xbf 2\xd1\x88\xd0\xbb\xd1\x8f\xd1\x82 2\xd1\x88\xd0\xbb\xd1\x8f\xd1\x87 2\xd1\x88\xd0\xbb\xd1\x8f\xd1\x8e 2\xd1\x88\xd0\xbc 3\xd1\x882\xd0\xbc\xd1\x8b 4\xd1\x883\xd0\xbc\xd1\x8b_ 2\xd1\x881\xd0\xbd 4\xd1\x88\xd0\xbd\xd0\xb8 \xd1\x882\xd0\xbd\xd1\x83\xd1\x80 \xd1\x882\xd0\xbf2 \xd1\x883\xd0\xbf\xd1\x80 2\xd1\x881\xd1\x80 2\xd1\x881\xd1\x81 \xd1\x881\xd1\x82\xd0\xb8 2\xd1\x88\xd1\x82\xd1\x81 \xd1\x88\xd1\x832\xd0\xb5\xd0\xb2 \xd1\x88\xd1\x83\xd1\x81\xd1\x821 2\xd1\x88\xd1\x84 \xd1\x881\xd1\x85 2\xd1\x88\xd1\x86 2\xd1\x881\xd1\x87 2\xd1\x88\xd1\x8c 4\xd1\x88\xd1\x8c_ 3\xd1\x88\xd1\x8c\xd0\xb5 3\xd1\x88\xd1\x8c\xd0\xb8 3\xd1\x88\xd1\x8c\xd1\x8e 3\xd1\x88\xd1\x8c\xd1\x8f \xd1\x882\xd1\x8e1 1\xd1\x89 2\xd1\x893\xd0\xb22 \xd1\x89\xd0\xb51\xd0\xb12\xd0\xbb \xd1\x89\xd0\xb52\xd0\xb3\xd0\xbb \xd1\x89\xd0\xb5\xd0\xb41\xd1\x80 \xd1\x89\xd0\xb5\xd0\xb82 \xd1\x89\xd0\xb5\xd0\xb8\xd1\x811 \xd1\x89\xd0\xb51\xd1\x81 \xd1\x89\xd0\xb51\xd1\x85 \xd1\x89\xd0\xb5\xd1\x882 \xd1\x89\xd0\xb53\xd1\x88\xd0\xba \xd1\x89\xd0\xb82\xd0\xbf1\xd0\xbb 2\xd1\x89\xd0\xbc 2\xd1\x891\xd0\xbd 2\xd1\x891\xd1\x80 2\xd1\x89\xd1\x8c_ \xd1\x8a1 \xd1\x8a\xd0\xb52\xd0\xb3 \xd1\x8a\xd0\xb52\xd0\xb4 \xd1\x8a\xd0\xb53\xd0\xb4\xd0\xbe \xd1\x8a\xd0\xb52\xd0\xbb \xd1\x8a2\xd0\xb52\xd1\x80 \xd1\x8a\xd0\xb52\xd1\x81 \xd1\x8a\xd0\xb52\xd1\x85\xd0\xb8 \xd1\x8a\xd1\x8e2 \xd1\x8a\xd1\x8f2 \xd1\x8a\xd1\x8f3\xd0\xbd \xd1\x8b1 \xd1\x8b2\xd0\xb1\xd0\xbb \xd1\x8b3\xd0\xb3\xd0\xb0 \xd1\x8b3\xd0\xb3\xd0\xb8 \xd1\x8b\xd0\xb32\xd0\xbb \xd1\x8b2\xd0\xb3\xd0\xbd \xd1\x8b2\xd0\xb4\xd0\xbb \xd1\x8b\xd0\xb42\xd1\x80\xd0\xb5 \xd1\x8b2\xd0\xb41\xd1\x80\xd0\xbe \xd1\x8b2\xd0\xb4\xd1\x80\xd1\x8f \xd1\x8b\xd0\xb52 \xd1\x8b3\xd0\xb62\xd0\xb4 \xd1\x8b\xd0\xb72\xd0\xb2\xd0\xb0 \xd1\x8b\xd0\xb72\xd0\xb4 \xd1\x8b2\xd0\xb7\xd0\xbb \xd1\x8b2\xd0\xb7\xd0\xbd \xd1\x8b\xd0\xb72\xd0\xbd\xd0\xb0 \xd1\x8b\xd0\xb82 \xd1\x8b\xd0\xb8\xd0\xb31 \xd1\x8b2\xd0\xba1\xd0\xb2 \xd1\x8b\xd0\xba2\xd0\xbb \xd1\x8b2\xd0\xba3\xd0\xbb\xd0\xbe \xd1\x8b\xd0\xba\xd0\xbe1\xd0\xb7 \xd1\x8b\xd0\xba1\xd1\x81 \xd1\x8b2\xd0\xbb\xd1\x8c \xd1\x8b2\xd0\xbc\xd1\x87 \xd1\x8b\xd0\xbd\xd0\xbe\xd1\x813\xd0\xbb \xd1\x8b3\xd0\xbf\xd0\xbe \xd1\x8b\xd1\x80\xd0\xb02\xd1\x813 \xd1\x8b\xd1\x802\xd0\xb2 \xd1\x8b\xd1\x80\xd0\xb52\xd1\x85 \xd1\x8b3\xd1\x81\xd0\xb0 \xd1\x8b3\xd1\x81\xd0\xb5 \xd1\x8b\xd1\x811\xd0\xba\xd0\xb8 \xd1\x8b\xd1\x811\xd0\xba\xd1\x83 \xd1\x8b2\xd1\x81\xd0\xbd \xd1\x8b3\xd1\x81\xd0\xbe \xd1\x8b\xd1\x812\xd0\xbf \xd1\x8b2\xd1\x81\xd1\x85 \xd1\x8b\xd1\x812\xd1\x87 \xd1\x8b2\xd1\x81\xd1\x88 \xd1\x8b\xd1\x821\xd0\xb2\xd0\xb8 \xd1\x8b\xd1\x822\xd1\x80 \xd1\x8b3\xd1\x82\xd1\x8c\xd1\x8e \xd1\x8b3\xd1\x82\xd1\x8c\xd1\x8f \xd1\x8b\xd1\x832 \xd1\x8b2\xd1\x881\xd0\xbb \xd1\x8b3\xd1\x88\xd1\x8c \xd1\x8c1 \xd1\x8c\xd0\xb12 \xd1\x8c2\xd0\xb2\xd1\x8f \xd1\x8c2\xd0\xb4\xd1\x86 \xd1\x8c2\xd0\xb5 \xd1\x8c\xd0\xb51\xd0\xb7\xd0\xbe \xd1\x8c\xd0\xb51\xd0\xba \xd1\x8c\xd0\xb52\xd1\x811\xd0\xba \xd1\x8c2\xd0\xb7\xd0\xbd \xd1\x8c2\xd0\xb81 \xd1\x8c2\xd0\xba\xd0\xbb \xd1\x8c\xd0\xbc\xd0\xb83\xd0\xb4 \xd1\x8c\xd0\xbc\xd0\xb83\xd0\xba \xd1\x8c\xd0\xbc\xd0\xbe1 \xd1\x8c\xd0\xbd\xd0\xb52\xd0\xbe \xd1\x8c2\xd0\xbe \xd1\x8c2\xd0\xbf1\xd0\xbb \xd1\x8c3\xd0\xbf2\xd1\x82\xd0\xbe \xd1\x8c\xd1\x812\xd0\xba \xd1\x8c2\xd1\x81\xd0\xbd \xd1\x8c2\xd1\x81\xd1\x82\xd0\xb8 \xd1\x8c2\xd1\x81\xd1\x82\xd1\x8f \xd1\x8c2\xd1\x821\xd0\xb0\xd0\xbc\xd0\xbf \xd1\x8c\xd1\x82\xd0\xb83\xd0\xbc \xd1\x8c2\xd1\x82\xd0\xbc \xd1\x8c2\xd1\x82\xd0\xbe\xd1\x82 \xd1\x8c2\xd1\x82\xd1\x80\xd0\xb0\xd0\xb1 \xd1\x8c\xd1\x822\xd1\x80\xd0\xb5 \xd1\x8c\xd1\x822\xd1\x80\xd1\x83 \xd1\x8c\xd1\x822\xd1\x80\xd1\x8b \xd1\x8c\xd1\x85\xd0\xbe2 \xd1\x8c\xd1\x85\xd0\xbe\xd0\xb71 \xd1\x8c2\xd1\x89\xd0\xb0 \xd1\x8c2\xd1\x89\xd0\xb5 \xd1\x8c2\xd1\x89\xd1\x83 \xd1\x8c2\xd1\x8e \xd1\x8c2\xd1\x8f \xd1\x8c\xd1\x8f1\xd0\xb2 \xd1\x8c3\xd1\x8f\xd0\xb3\xd1\x81 1\xd1\x8d \xd1\x8d1\xd0\xb2 \xd1\x8d\xd0\xb21\xd1\x80 2\xd1\x8d\xd0\xb3 \xd1\x8d\xd0\xb41\xd1\x80 \xd1\x8d\xd0\xba1\xd0\xbb \xd1\x8d\xd0\xba\xd1\x811 \xd1\x8d\xd0\xba2\xd1\x81\xd1\x82 \xd1\x8d\xd0\xbb\xd0\xb51\xd0\xbe \xd1\x8d2\xd0\xbc \xd1\x8d3\xd0\xbc\xd0\xb0 \xd1\x8d2\xd0\xbd \xd1\x8d3\xd0\xbd\xd1\x8c \xd1\x8d\xd0\xbe2\xd0\xb7 \xd1\x8d2\xd0\xbf \xd1\x8d\xd0\xbf\xd0\xb83\xd0\xba \xd1\x8d1\xd1\x80\xd0\xb5 \xd1\x8d1\xd1\x80\xd0\xb8 \xd1\x8d\xd1\x80\xd0\xb84\xd1\x82\xd1\x80 \xd1\x8d\xd1\x80\xd0\xbe1\xd1\x812 \xd1\x8d1\xd1\x80\xd1\x83 \xd1\x8d1\xd1\x80\xd1\x8b \xd1\x8d\xd1\x811 \xd1\x8d\xd1\x81\xd0\xba2 \xd1\x8d\xd1\x813\xd0\xbc \xd1\x8d2\xd1\x81\xd0\xbe \xd1\x8d\xd1\x813\xd1\x82\xd0\xb5 \xd1\x8d\xd1\x812\xd1\x821\xd1\x80 \xd1\x8d2\xd1\x82\xd0\xb5 \xd1\x8d\xd1\x82\xd0\xb8\xd0\xbb1\xd0\xb0 \xd1\x8d\xd1\x821\xd1\x80\xd0\xb0 \xd1\x8d2\xd1\x84 \xd1\x8d\xd1\x852 \xd1\x8d\xd1\x85\xd0\xbe3 \xd1\x8d2\xd1\x86 \xd1\x8d\xd1\x8f2 1\xd1\x8e \xd1\x8e1\xd0\xb0 \xd1\x8e1\xd0\xb1 \xd1\x8e2\xd0\xb1\xd0\xb2 \xd1\x8e2\xd0\xb1\xd0\xbb \xd1\x8e2\xd0\xb11\xd1\x80\xd0\xb5 \xd1\x8e1\xd0\xb2 \xd1\x8e1\xd0\xb4\xd1\x8c \xd1\x8e1\xd0\xb5 \xd1\x8e\xd0\xb72\xd0\xb3 \xd1\x8e\xd0\xb7\xd0\xb82\xd0\xba \xd1\x8e1\xd0\xb7\xd0\xbe \xd1\x8e1\xd0\xb8 \xd1\x8e2\xd0\xb8\xd0\xb4\xd0\xb0\xd0\xbb \xd1\x8e1\xd0\xba \xd1\x8e2\xd0\xba1\xd0\xb2 \xd1\x8e1\xd0\xbb\xd0\xb0 \xd1\x8e1\xd0\xbb\xd0\xb5 \xd1\x8e2\xd0\xbb\xd0\xb8 \xd1\x8e1\xd0\xbb\xd1\x8e 2\xd1\x8e\xd0\xbc \xd1\x8e2\xd0\xbc\xd1\x87 \xd1\x8e2\xd0\xbd\xd1\x8c \xd1\x8e1\xd0\xbe1 \xd1\x8e1\xd1\x80\xd0\xb0 \xd1\x8e1\xd1\x80\xd0\xb5 \xd1\x8e\xd1\x80\xd0\xb54\xd0\xbc \xd1\x8e1\xd1\x80\xd0\xb8 \xd1\x8e\xd1\x80\xd0\xb82\xd1\x81\xd0\xba \xd1\x8e1\xd1\x80\xd0\xbe \xd1\x8e1\xd1\x80\xd1\x83 \xd1\x8e1\xd1\x80\xd1\x8b \xd1\x8e2\xd1\x811\xd0\xba \xd1\x8e1\xd1\x81\xd1\x82\xd0\xb0 \xd1\x8e1\xd1\x81\xd1\x82\xd0\xb5 \xd1\x8e1\xd1\x81\xd1\x82\xd0\xbe \xd1\x8e1\xd1\x81\xd1\x82\xd1\x8f \xd1\x8e1\xd1\x82\xd0\xb8 \xd1\x8e1\xd1\x82\xd0\xbe \xd1\x8e1\xd1\x82\xd1\x83 \xd1\x8e1\xd1\x82\xd1\x8b \xd1\x8e1\xd1\x85 \xd1\x8e\xd1\x85\xd0\xb01\xd1\x81 \xd1\x8e1\xd1\x87 \xd1\x8e2\xd1\x89\xd1\x8c \xd1\x8e1\xd1\x8f \xd1\x8f2\xd0\xb1\xd1\x80 \xd1\x8f\xd0\xb11\xd1\x80\xd0\xb0 \xd1\x8f\xd0\xb13\xd1\x80\xd0\xb5 \xd1\x8f\xd0\xb11\xd1\x80\xd0\xb8 \xd1\x8f\xd0\xb13\xd1\x80\xd1\x8e 3\xd1\x8f\xd0\xb2\xd0\xb8\xd0\xba\xd1\x81 \xd1\x8f1\xd0\xb2\xd0\xbe \xd1\x8f1\xd0\xb2\xd1\x83 \xd1\x8f1\xd0\xb22\xd1\x85 \xd1\x8f2\xd0\xb31\xd0\xbb \xd1\x8f2\xd0\xb3\xd0\xbd \xd1\x8f\xd0\xb41\xd0\xb2 \xd1\x8f\xd0\xb41\xd1\x80 \xd1\x8f1\xd0\xb5 \xd1\x8f\xd0\xb72\xd0\xb3\xd0\xbd \xd1\x8f1\xd0\xb7\xd0\xbe \xd1\x8f1\xd0\xb8 \xd1\x8f1\xd0\xba \xd1\x8f2\xd0\xba1\xd0\xb2 \xd1\x8f2\xd0\xba1\xd0\xbb \xd1\x8f\xd0\xba1\xd1\x81 \xd1\x8f1\xd0\xbb \xd1\x8f2\xd0\xbb\xd1\x8c \xd1\x8f\xd0\xbc2\xd0\xb13\xd0\xbb \xd1\x8f2\xd0\xbc\xd1\x8c \xd1\x8f3\xd0\xbd\xd0\xb0 \xd1\x8f\xd0\xbd\xd1\x812 \xd1\x8f1\xd1\x80\xd0\xb0 \xd1\x8f1\xd1\x80\xd0\xb8 \xd1\x8f1\xd1\x80\xd0\xbe \xd1\x8f1\xd1\x80\xd1\x8c \xd1\x8f\xd1\x811\xd0\xba \xd1\x8f\xd1\x811\xd0\xbb \xd1\x8f\xd1\x812\xd1\x82 \xd1\x8f\xd1\x81\xd1\x823\xd0\xb2 \xd1\x8f1\xd1\x81\xd1\x82\xd0\xbe \xd1\x8f\xd1\x81\xd1\x821\xd1\x80 \xd1\x8f1\xd1\x82\xd0\xb0 \xd1\x8f\xd1\x823\xd0\xb2 \xd1\x8f3\xd1\x82\xd0\xb8 \xd1\x8f\xd1\x82\xd0\xb81\xd0\xb7 \xd1\x8f1\xd1\x82\xd0\xbe \xd1\x8f1\xd1\x82\xd1\x83 \xd1\x8f1\xd1\x82\xd1\x8b \xd1\x8f3\xd1\x82\xd1\x8c\xd1\x8e \xd1\x8f3\xd1\x82\xd1\x8c\xd1\x8f \xd1\x8f1\xd1\x82\xd1\x8f \xd1\x8f1\xd1\x83 \xd1\x8f\xd1\x851\xd0\xbb \xd1\x8f1\xd1\x85\xd1\x83 \xd1\x8f\xd1\x86\xd0\xb51 \xd1\x8f2\xd1\x88\xd0\xbb 2\xd1\x8f\xd1\x8e_ 2\xd1\x8f1\xd1\x8f % _\xd0\xb1\xd0\xbe2\xd0\xb4\xd1\x80\xd0\xb0 _\xd0\xb2\xd1\x81\xd1\x822\xd1\x80 _\xd0\xb4\xd0\xbe\xd0\xb12\xd1\x80\xd0\xb5\xd0\xbb _\xd0\xb4\xd0\xbe1\xd0\xb12\xd1\x80\xd0\xb8 _\xd0\xbe\xd0\xb12\xd0\xbb\xd1\x8e\xd1\x8e _\xd0\xbe\xd0\xb12\xd1\x80\xd0\xb5\xd0\xb5 _\xd0\xbe\xd0\xb12\xd1\x80\xd0\xb5\xd0\xb9 _\xd0\xbe\xd0\xb12\xd1\x80\xd0\xb5\xd1\x8e _\xd0\xbe\xd0\xb12\xd1\x80\xd0\xb8\xd0\xb2 _\xd0\xbe\xd0\xb12\xd1\x80\xd0\xb8\xd0\xbb _\xd0\xbe\xd0\xb12\xd1\x80\xd0\xb8\xd1\x82 _\xd0\xbf\xd0\xb02\xd0\xbd1\xd0\xb8\xd1\x81 _\xd0\xbf\xd0\xbe\xd0\xbc2\xd0\xbd\xd1\x83 _\xd1\x80\xd0\xb5\xd0\xb02\xd0\xbd _\xd1\x80\xd0\xbe2\xd1\x813\xd0\xbf\xd0\xb8 _\xd1\x81\xd0\xbe2\xd0\xbf\xd0\xbb\xd0\xb0 \xd0\xb02\xd0\xbd\xd1\x8c\xd1\x88 \xd0\xb0\xd1\x82\xd1\x80\xd0\xbe2\xd1\x81\xd0\xba \xd0\xb1\xd0\xb5\xd0\xb7\xd1\x832\xd1\x81 \xd0\xb1\xd0\xb8\xd0\xbd\xd0\xbe2\xd1\x81\xd0\xba \xd0\xb2\xd0\xb8\xd0\xb72\xd0\xb3\xd0\xbd \xd0\xb2\xd1\x8b\xd0\xb12\xd1\x80\xd0\xb5 \xd0\xb3\xd1\x81\xd1\x824\xd1\x80 \xd0\xb4\xd0\xb81\xd1\x812\xd0\xbb\xd0\xbe\xd0\xb2 \xd0\xb4\xd0\xbe\xd1\x812\xd0\xbd\xd1\x8f \xd0\xb4\xd1\x80\xd0\xbe2\xd0\xb63\xd0\xb6 2\xd0\xb4\xd1\x80\xd1\x83\xd0\xb6\xd0\xb5\xd0\xb9 \xd0\xb52\xd0\xbc\xd1\x8c\xd0\xb4 \xd0\xb52\xd0\xbe3\xd0\xbf\xd0\xbb\xd0\xb0\xd1\x82\xd0\xbe \xd0\xb52\xd0\xbe3\xd0\xbf\xd0\xbe\xd0\xb7\xd0\xb8 \xd0\xb5\xd1\x80\xd0\xb53\xd1\x812\xd1\x81\xd0\xbe 4\xd0\xb63\xd0\xb4\xd0\xb8\xd0\xba 4\xd0\xb63\xd0\xb4\xd0\xb8\xd1\x87 \xd0\xb7\xd0\xb0\xd0\xb82\xd0\xbb \xd0\xb7\xd0\xb0\xd0\xbe2\xd0\xb7 2\xd0\xb71\xd0\xb02\xd1\x85\xd0\xb0\xd0\xb2 \xd0\xb7\xd0\xb0\xd1\x8e2\xd0\xbb \xd0\xb72\xd1\x80\xd1\x8f\xd1\x82 \xd0\xb7\xd1\x832\xd0\xbc\xd1\x8c 6\xd0\xb7\xd1\x8c_ \xd0\xb82\xd0\xbb1\xd0\xb02\xd0\xbc\xd0\xb8\xd0\xbd \xd0\xb8\xd0\xbb\xd0\xbb\xd0\xbe3\xd0\xba2 \xd0\xb92\xd0\xba\xd1\x8c \xd0\xbb\xd0\xb02\xd0\xb11\xd1\x80 \xd0\xbb\xd1\x833\xd1\x814\xd0\xbd \xd0\xbc\xd0\xb52\xd0\xb4\xd0\xb8\xd0\xbd\xd1\x81 \xd0\xbc\xd0\xb52\xd0\xb41\xd0\xbe2\xd1\x81\xd0\xbc \xd0\xbc\xd0\xb5\xd1\x82\xd0\xb82\xd0\xbb1\xd0\xb0\xd0\xbc \xd0\xbc\xd0\xb8\xd1\x814\xd1\x813\xd0\xbd \xd0\xbd\xd0\xb0\xd1\x802\xd0\xb2\xd0\xb0\xd1\x82 \xd0\xbd\xd0\xb52\xd0\xbe3\xd1\x80\xd0\xb5 \xd0\xbd\xd0\xb81\xd1\x812\xd0\xba\xd0\xbe\xd0\xbb \xd0\xbd\xd0\xb84\xd1\x81\xd1\x8c_ \xd0\xbd\xd0\xbe4\xd0\xbb1\xd0\xb02\xd0\xbc\xd0\xb8\xd0\xbd \xd0\xbd2\xd1\x82\xd1\x80\xd0\xb0\xd1\x81\xd1\x81 \xd0\xbe2\xd0\xb41\xd0\xbe2\xd0\xb1\xd0\xbe\xd0\xbb \xd0\xbe4\xd0\xb63\xd0\xb4\xd0\xb5\xd0\xb2 \xd0\xbe1\xd0\xb82\xd1\x811\xd1\x82\xd1\x80 \xd0\xbe\xd0\xb9\xd1\x814\xd0\xba\xd0\xbe\xd0\xb2 \xd0\xbe2\xd0\xbc3\xd1\x87\xd0\xb5_ \xd0\xbe\xd0\xbd\xd0\xb83\xd0\xbb2\xd0\xb0\xd0\xbc \xd0\xbe\xd0\xbd2\xd1\x82\xd1\x80\xd0\xb0\xd1\x82 \xd0\xbe2\xd0\xbf\xd0\xbb\xd1\x8e\xd1\x81 \xd0\xbe\xd1\x81\xd0\xbe4\xd0\xbc3\xd0\xbd \xd0\xbe\xd1\x82\xd0\xb84\xd0\xb4\xd0\xbd \xd0\xbf\xd0\xb5\xd1\x80\xd0\xb51\xd1\x812\xd0\xbd \xd0\xbf\xd0\xbe2\xd0\xb4\xd0\xbe\xd0\xb4\xd0\xb5 \xd0\xbf\xd0\xbe2\xd0\xb41\xd1\x832\xd1\x80\xd0\xbe \xd0\xbf\xd0\xbe\xd0\xb52\xd0\xb6 \xd0\xbf\xd0\xbe2\xd1\x81\xd1\x82\xd0\xb8\xd0\xbd \xd0\xbf\xd1\x80\xd0\xb5\xd0\xbc2\xd0\xbd\xd0\xbe \xd0\xbf\xd1\x80\xd0\xb8\xd1\x87\xd0\xb52\xd1\x811\xd0\xba \xd0\xbf\xd1\x82\xd0\xb84\xd0\xb4\xd0\xbd \xd1\x80\xd0\xb5\xd0\xb4\xd0\xbe4\xd0\xbf\xd0\xbb \xd1\x80\xd0\xb5\xd0\xb64\xd0\xb4\xd0\xb8 \xd1\x80\xd0\xbd\xd0\xb83\xd0\xbb2\xd0\xb03\xd0\xbc \xd1\x80\xd0\xbe\xd0\xb12\xd0\xbb\xd0\xb5\xd1\x8e 2\xd1\x81\xd0\xb1\xd1\x80\xd1\x83\xd0\xba1 \xd1\x81\xd0\xbe2\xd1\x81\xd1\x82\xd1\x80\xd0\xb8\xd1\x82 \xd1\x81\xd0\xbe3\xd1\x822\xd0\xba\xd0\xb0\xd0\xbb 2\xd1\x81\xd1\x82\xd1\x87\xd0\xb5_ 2\xd1\x81\xd1\x82\xd1\x8c\xd1\x82 \xd1\x81\xd1\x8b2\xd0\xbc\xd0\xb8\xd1\x82 2\xd1\x81\xd1\x8c\xd1\x81\xd1\x8f_ 6\xd1\x82\xd1\x80_ \xd1\x82\xd1\x80\xd0\xbe2\xd0\xb5\xd1\x82\xd0\xb5\xd1\x81 6\xd1\x85\xd1\x83\xd1\x8f_ \xd1\x8b2\xd1\x80\xd1\x8c\xd0\xbc \xd1\x8b\xd1\x8f2\xd0\xb2\xd1\x8f \xd1\x8c\xd0\xb1\xd0\xb0\xd1\x822 \xd0\xb01\xd0\xb2\xd1\x91 \xd0\xb02\xd0\xb4\xd0\xb2\xd1\x91 \xd0\xb01\xd1\x91 \xd0\xb0\xd0\xb73\xd0\xb2\xd1\x91\xd0\xb7 \xd0\xb01\xd0\xbb\xd1\x91 2\xd0\xb0\xd0\xbb\xd1\x91\xd0\xba 2\xd0\xb0\xd0\xbc\xd1\x91\xd1\x82 \xd0\xb0\xd0\xbc2\xd0\xbd\xd1\x91\xd1\x82 \xd0\xb01\xd1\x80\xd1\x91 \xd0\xb0\xd1\x813\xd1\x82\xd1\x91\xd0\xbc \xd0\xb01\xd1\x82\xd1\x8c\xd1\x91 1\xd0\xb1\xd1\x91 \xd0\xb1\xd1\x912\xd0\xb41\xd1\x80 \xd0\xb13\xd0\xbb\xd1\x91\xd0\xbd \xd0\xb12\xd0\xbb\xd1\x91\xd1\x811\xd0\xba \xd0\xb12\xd0\xbb\xd1\x8e\xd1\x91 \xd0\xb11\xd1\x80\xd1\x91\xd0\xba \xd0\xb12\xd1\x80\xd1\x91\xd0\xbc \xd0\xb12\xd1\x80\xd1\x91\xd1\x85 1\xd0\xb2\xd0\xb5\xd1\x91 3\xd0\xb2\xd0\xb5\xd0\xb7\xd1\x91 \xd0\xb2\xd1\x91\xd0\xb41\xd1\x80 1\xd0\xb2\xd1\x91\xd0\xb7 2\xd0\xb2\xd1\x91\xd1\x80\xd0\xb4 1\xd0\xb2\xd1\x91\xd1\x81 \xd0\xb22\xd0\xbb\xd1\x91\xd0\xba \xd0\xb22\xd0\xbb\xd1\x91\xd1\x82 1\xd0\xb2\xd0\xbc\xd1\x91 \xd0\xb22\xd0\xbd\xd1\x91\xd1\x81 2\xd0\xb21\xd1\x80\xd1\x91\xd0\xbd 3\xd0\xb2\xd1\x81\xd1\x913 1\xd0\xb2\xd1\x8c\xd1\x91 \xd0\xb31\xd0\xbb\xd1\x91 \xd0\xb32\xd0\xbb\xd1\x91\xd1\x82 \xd0\xb32\xd0\xbd\xd1\x91\xd0\xb2 \xd0\xb33\xd0\xbd\xd1\x91\xd0\xbd \xd0\xb32\xd0\xbd\xd0\xbe\xd1\x91 \xd0\xb41\xd0\xb2\xd1\x91 1\xd0\xb4\xd1\x91 _\xd0\xb4\xd0\xbe\xd0\xb12\xd1\x80\xd1\x91\xd0\xbb 2\xd0\xb4\xd0\xbe\xd0\xbf\xd0\xbb\xd1\x91 \xd0\xb4\xd0\xbe2\xd0\xbf\xd1\x80\xd1\x91 \xd0\xb41\xd1\x80\xd1\x91 \xd0\xb42\xd1\x80\xd1\x91\xd0\xb1 2\xd0\xb43\xd1\x80\xd1\x91\xd0\xb6 \xd0\xb42\xd1\x80\xd1\x91\xd0\xbc 1\xd0\xb4\xd1\x80\xd1\x91\xd0\xbc\xd0\xb0 1\xd0\xb4\xd1\x80\xd1\x91\xd0\xbc\xd1\x8b 2\xd0\xb43\xd1\x80\xd1\x91\xd0\xbd \xd0\xb4\xd1\x8a\xd1\x912\xd0\xbc 1\xd0\xb4\xd1\x8c\xd1\x91 \xd0\xb5\xd0\xb11\xd1\x80\xd1\x91\xd0\xbd \xd0\xb51\xd0\xb2\xd1\x91 2\xd0\xb5\xd0\xb2\xd1\x91\xd1\x80 2\xd0\xb51\xd0\xb2\xd1\x80\xd1\x91 \xd0\xb52\xd0\xb3\xd0\xbb\xd1\x91 \xd0\xb51\xd1\x91 2\xd0\xb5\xd0\xb6\xd1\x91 \xd0\xb53\xd0\xb7\xd1\x91 \xd0\xb51\xd0\xbb\xd1\x91 2\xd0\xb5\xd0\xbf\xd1\x91 \xd0\xb5\xd1\x801\xd0\xb2\xd1\x91 \xd0\xb51\xd1\x80\xd1\x91 \xd0\xb5\xd1\x80\xd1\x913\xd0\xb4\xd0\xbe \xd0\xb5\xd1\x80\xd1\x911\xd0\xba2 \xd0\xb5\xd1\x812\xd1\x87\xd1\x91\xd1\x82 \xd0\xb5\xd1\x821\xd0\xb2\xd1\x91 \xd0\xb51\xd1\x82\xd1\x8c\xd1\x91 2\xd1\x91\xd0\xb1 \xd1\x911\xd0\xb1\xd1\x80\xd0\xb0 \xd1\x91\xd0\xb11\xd1\x80\xd1\x8b \xd1\x911\xd0\xb2\xd0\xb5 \xd1\x911\xd0\xb2\xd0\xbe 2\xd1\x911\xd0\xb2\xd1\x80\xd0\xb5 \xd1\x911\xd0\xb2\xd1\x83 \xd1\x911\xd0\xb4\xd1\x80\xd1\x83 2\xd1\x913\xd0\xb4\xd1\x83\xd1\x88 2\xd1\x91\xd0\xb6\xd0\xb5 \xd1\x913\xd0\xb7\xd0\xb5 \xd1\x91\xd0\xb71\xd0\xbe2\xd0\xb3 \xd1\x911\xd0\xb7\xd0\xbe\xd0\xbc \xd1\x911\xd0\xba\xd0\xb0 \xd1\x911\xd0\xba\xd0\xb8 2\xd1\x911\xd0\xba\xd0\xbe 2\xd1\x911\xd0\xba\xd1\x80 \xd1\x91\xd0\xba2\xd1\x80\xd0\xbe \xd1\x911\xd0\xba\xd1\x83 \xd1\x911\xd0\xbb\xd0\xb0 \xd1\x911\xd0\xbb\xd0\xb5 \xd1\x911\xd0\xbb\xd1\x83 \xd1\x911\xd0\xbb\xd1\x8b 2\xd1\x91\xd0\xbc\xd1\x83\xd0\xb6 \xd1\x912\xd0\xbc\xd1\x87 \xd1\x913\xd0\xbd\xd0\xb0 \xd1\x91\xd0\xbd2\xd0\xb41\xd1\x80 \xd1\x91\xd0\xbd\xd1\x812 \xd1\x91\xd0\xbf\xd0\xb0\xd1\x822 2\xd1\x91\xd0\xbf\xd0\xb5 \xd1\x912\xd0\xbf\xd0\xbb \xd1\x913\xd0\xbf\xd0\xbb\xd0\xb0 \xd1\x91\xd0\xbf1\xd0\xbb\xd1\x83 \xd1\x913\xd0\xbf\xd0\xbb\xd1\x8b \xd1\x914\xd0\xbf\xd0\xbd 2\xd1\x91\xd0\xbf\xd0\xbe \xd1\x914\xd0\xbf\xd1\x82 \xd1\x911\xd1\x80\xd0\xb0 \xd1\x911\xd1\x80\xd0\xb5 \xd1\x913\xd1\x80\xd0\xb5_ \xd1\x911\xd1\x80\xd0\xb8 \xd1\x911\xd1\x80\xd0\xbe \xd1\x91\xd1\x803\xd1\x81\xd0\xba \xd1\x911\xd1\x80\xd1\x83 \xd1\x911\xd1\x80\xd1\x8b \xd1\x913\xd1\x812\xd0\xb0 \xd1\x911\xd1\x81\xd0\xba \xd1\x912\xd1\x811\xd0\xba\xd0\xb0_ \xd1\x912\xd1\x81\xd0\xba\xd0\xb5 \xd1\x914\xd1\x811\xd0\xba\xd1\x83_ 2\xd1\x91\xd1\x81\xd0\xbb \xd1\x913\xd1\x81\xd0\xbe \xd1\x911\xd1\x81\xd1\x82 \xd1\x91\xd1\x812\xd1\x82\xd0\xb0\xd0\xbd \xd1\x913\xd1\x81\xd1\x82\xd1\x83 \xd1\x911\xd1\x82\xd0\xb0 2\xd1\x91\xd1\x82\xd0\xb5\xd1\x87 \xd1\x911\xd1\x82\xd0\xb8 \xd1\x911\xd1\x82\xd0\xbe \xd1\x91\xd1\x82\xd0\xbe1\xd1\x81 \xd1\x91\xd1\x821\xd1\x80 \xd1\x911\xd1\x82\xd1\x83 \xd1\x911\xd1\x82\xd1\x8b \xd1\x911\xd1\x82\xd1\x8e \xd1\x911\xd1\x82\xd1\x8f \xd1\x91\xd1\x85\xd0\xb02\xd1\x82 \xd1\x91\xd1\x851\xd0\xb0\xd1\x82\xd0\xbe \xd1\x91\xd1\x853\xd0\xb2\xd0\xb0\xd0\xbb \xd1\x91\xd1\x853\xd0\xbb\xd0\xbe\xd0\xbf \xd1\x91\xd1\x851\xd0\xbe\xd0\xbf\xd0\xbe \xd1\x91\xd1\x851\xd1\x80\xd1\x83 3\xd0\xb6\xd1\x91\xd0\xb2 \xd0\xb6\xd1\x911\xd1\x812 \xd0\xb62\xd0\xb6\xd1\x91 \xd0\xb7\xd0\xb03\xd0\xbc\xd0\xbd\xd1\x91 \xd0\xb71\xd0\xb2\xd1\x91 \xd0\xb72\xd0\xb2\xd1\x91\xd0\xb7 1\xd0\xb7\xd1\x91 \xd0\xb72\xd0\xbd\xd0\xb0\xd1\x91 2\xd0\xb7\xd0\xbd\xd1\x91 1\xd0\xb72\xd0\xbe3\xd1\x80\xd1\x91 \xd0\xb72\xd0\xbe\xd1\x82\xd1\x91 \xd0\xb7\xd0\xbe\xd1\x822\xd1\x80\xd1\x91 3\xd0\xb7\xd1\x83\xd1\x91 \xd0\xb7\xd1\x8a\xd1\x912\xd0\xbc 2\xd0\xb7\xd1\x8b\xd0\xbc\xd1\x91 2\xd0\xb81\xd0\xb2\xd1\x91 \xd0\xb8\xd0\xb31\xd1\x80\xd1\x91\xd0\xbd \xd0\xb81\xd1\x91 \xd0\xb8\xd1\x851\xd1\x80\xd1\x91 1\xd0\xba\xd0\xb0\xd1\x91 1\xd0\xba\xd1\x91 \xd0\xba3\xd0\xbb\xd1\x91\xd0\xbd \xd0\xba2\xd1\x80\xd0\xbe\xd1\x91 3\xd0\xba\xd1\x83\xd1\x91 \xd0\xbb\xd0\xb01\xd1\x81\xd1\x82\xd1\x91 \xd0\xbb\xd1\x913\xd0\xb4\xd0\xbe \xd0\xbb\xd1\x911\xd0\xb72\xd0\xbe3 \xd0\xbb\xd1\x91\xd0\xba1\xd0\xbb 1\xd0\xbb\xd1\x91\xd0\xbd \xd0\xbb\xd1\x912\xd1\x81\xd0\xba \xd0\xbb\xd1\x914\xd1\x81\xd0\xba\xd0\xb0 1\xd0\xbb\xd1\x91\xd1\x85 2\xd0\xbb\xd0\xbe\xd1\x91\xd0\xbd 1\xd0\xbb\xd1\x83\xd1\x91 3\xd0\xbb\xd1\x8c\xd1\x91 1\xd0\xbb\xd1\x8c\xd1\x89\xd1\x91 3\xd0\xbc2\xd0\xbd\xd1\x91\xd1\x88 3\xd0\xbc2\xd1\x89\xd1\x91 \xd0\xbd\xd0\xb42\xd1\x80\xd1\x91 \xd0\xbd\xd0\xb53\xd1\x91 1\xd0\xbd\xd1\x91 \xd0\xbd\xd1\x911\xd0\xb12 3\xd0\xbd\xd0\xbe\xd0\xbc\xd1\x91 1\xd0\xbd\xd1\x8c\xd1\x91 \xd0\xbe\xd0\xb43\xd1\x80\xd1\x91\xd0\xb1 \xd0\xbe1\xd1\x91 \xd0\xbe\xd1\x912\xd0\xb6\xd0\xb8 \xd0\xbe1\xd0\xbb\xd1\x91 2\xd0\xbe\xd0\xbc\xd1\x91 \xd0\xbe3\xd0\xbc2\xd0\xbd\xd1\x91\xd0\xbc \xd0\xbe3\xd0\xbc2\xd0\xbd\xd1\x91\xd1\x82 \xd0\xbe2\xd0\xbf1\xd0\xbb\xd1\x91\xd0\xb9 \xd0\xbe1\xd1\x80\xd1\x91 \xd0\xbe2\xd1\x81\xd0\xba\xd1\x91 \xd0\xbe\xd1\x821\xd0\xb2\xd1\x91 2\xd0\xbe3\xd1\x82\xd1\x91\xd0\xba \xd0\xbe3\xd1\x82\xd1\x91\xd1\x80 \xd0\xbe\xd1\x821\xd1\x80\xd1\x91\xd0\xba \xd0\xbe\xd1\x821\xd1\x80\xd1\x91\xd1\x88 \xd0\xbe3\xd1\x84\xd1\x91 \xd0\xbf\xd1\x911 \xd0\xbf\xd1\x912\xd1\x81\xd1\x821\xd1\x80 \xd0\xbf\xd1\x912\xd1\x82\xd1\x80 2\xd0\xbf\xd0\xbb\xd1\x91\xd0\xbd \xd0\xbf2\xd0\xbb\xd1\x91\xd0\xbd\xd0\xba \xd0\xbf\xd0\xbb\xd1\x91\xd1\x811\xd0\xba \xd0\xbf1\xd0\xbb\xd1\x91\xd1\x8e \xd0\xbf\xd0\xbe\xd1\x912\xd0\xb6 3\xd0\xbf\xd1\x80\xd1\x91\xd1\x82 \xd0\xbf\xd1\x80\xd0\xb8\xd1\x87\xd1\x912\xd1\x811\xd0\xba \xd1\x802\xd0\xb1\xd0\xbb\xd1\x91 1\xd1\x80\xd0\xb2\xd1\x91\xd1\x82 _\xd1\x80\xd1\x912\xd0\xb1\xd1\x80 1\xd1\x80\xd1\x91\xd0\xb7\xd0\xba \xd1\x80\xd1\x911\xd0\xb7\xd0\xbd\xd0\xb0 1\xd1\x80\xd1\x911\xd0\xb7\xd0\xbe \xd1\x80\xd1\x91\xd0\xb72\xd1\x83 1\xd1\x80\xd1\x91\xd0\xba\xd1\x88 3\xd1\x80\xd1\x91\xd0\xbc\xd0\xbe 1\xd1\x80\xd1\x91\xd0\xbd\xd0\xba \xd1\x80\xd1\x913\xd1\x81\xd1\x82\xd0\xb0 \xd1\x80\xd1\x913\xd1\x81\xd1\x82\xd0\xbe \xd1\x80\xd0\xbe\xd0\xb42\xd0\xbb\xd1\x91 \xd1\x80\xd0\xbe\xd1\x912\xd0\xbc 1\xd1\x80\xd1\x8c\xd1\x91 \xd1\x812\xd0\xb4\xd1\x91 \xd1\x81\xd0\xb53\xd1\x81\xd1\x82\xd1\x91 1\xd1\x812\xd1\x91 \xd1\x81\xd1\x91\xd0\xba\xd1\x814 \xd1\x81\xd1\x912\xd1\x81\xd1\x82 \xd1\x81\xd1\x91\xd1\x81\xd1\x821\xd1\x80 2\xd1\x81\xd0\xba\xd1\x83\xd1\x91 \xd1\x811\xd0\xbb\xd1\x91\xd1\x82 \xd1\x812\xd1\x82\xd1\x91 1\xd1\x81\xd1\x82\xd1\x91\xd0\xbb 1\xd1\x81\xd1\x82\xd1\x91\xd0\xbd_ \xd1\x813\xd1\x82\xd1\x91\xd1\x82_ \xd1\x813\xd1\x82\xd1\x91\xd1\x82\xd0\xb5 \xd1\x81\xd1\x82\xd1\x913\xd1\x85 \xd1\x813\xd1\x82\xd1\x91\xd1\x88 \xd1\x813\xd1\x822\xd0\xbb\xd1\x91 \xd1\x81\xd1\x87\xd1\x912\xd1\x811\xd0\xba 1\xd1\x81\xd1\x8c\xd1\x91 \xd1\x821\xd0\xb2\xd1\x91\xd0\xbb \xd1\x821\xd0\xb2\xd0\xbe\xd1\x91 1\xd1\x822\xd1\x91 \xd1\x82\xd1\x912\xd0\xb3\xd0\xbd \xd1\x82\xd1\x911\xd0\xb7\xd0\xbe 3\xd1\x82\xd1\x91\xd0\xba\xd0\xb0 \xd1\x82\xd1\x91\xd0\xba1\xd0\xbb 3\xd1\x82\xd1\x91\xd0\xba\xd1\x88 \xd1\x82\xd1\x914\xd0\xbf1\xd0\xbb \xd1\x82\xd1\x91\xd1\x803\xd0\xba \xd1\x82\xd1\x912\xd1\x81\xd0\xba\xd0\xb0 \xd1\x82\xd1\x912\xd1\x811\xd0\xba\xd0\xb8 \xd1\x82\xd1\x912\xd1\x811\xd0\xba\xd0\xbe \xd1\x82\xd1\x912\xd1\x81\xd0\xba\xd1\x83 \xd1\x82\xd1\x912\xd1\x85\xd0\xbe 3\xd1\x822\xd0\xba\xd1\x91\xd1\x82 \xd1\x821\xd1\x80\xd0\xb5\xd0\xb2\xd1\x91 3\xd1\x822\xd1\x80\xd1\x912\xd1\x85 \xd1\x822\xd1\x80\xd1\x91\xd1\x88\xd1\x8c \xd1\x82\xd1\x80\xd0\xbe2\xd0\xb5\xd1\x82\xd1\x91\xd1\x81 3\xd1\x82\xd1\x8c\xd1\x91 \xd1\x83\xd0\xb32\xd0\xbd\xd1\x91 \xd1\x83\xd0\xb31\xd1\x80\xd1\x91 _\xd1\x83\xd1\x912 \xd1\x831\xd1\x91 \xd1\x831\xd0\xbb\xd1\x91 \xd1\x831\xd1\x80\xd1\x91 \xd1\x831\xd1\x81\xd1\x82\xd1\x91 \xd1\x833\xd1\x82\xd1\x91\xd1\x80 \xd1\x831\xd1\x82\xd1\x8c\xd1\x91 \xd1\x832\xd1\x87\xd1\x91\xd0\xb1 \xd1\x833\xd1\x88\xd1\x91 2\xd1\x853\xd0\xb2\xd1\x91 1\xd1\x85\xd0\xbb\xd1\x91\xd0\xb1 \xd1\x852\xd0\xbb\xd1\x91\xd1\x81 \xd1\x862\xd0\xb2\xd1\x91 1\xd1\x87\xd1\x91 \xd1\x87\xd1\x91\xd1\x802\xd1\x81 \xd1\x87\xd1\x91\xd1\x80\xd1\x81\xd1\x821 _\xd1\x87\xd1\x912\xd1\x811\xd0\xba \xd1\x872\xd1\x82\xd1\x91 1\xd1\x87\xd1\x8c\xd1\x91 2\xd1\x88\xd0\xbb\xd1\x91\xd0\xbd 3\xd1\x88\xd1\x8c\xd1\x91 \xd1\x8a2\xd1\x912\xd1\x80 \xd1\x8b\xd0\xb42\xd1\x80\xd1\x91 \xd1\x8b\xd1\x80\xd1\x912\xd1\x85 \xd1\x8b3\xd1\x81\xd1\x91 \xd1\x8c2\xd1\x91 \xd1\x8c\xd1\x911\xd0\xb7\xd0\xbe \xd1\x8c2\xd1\x89\xd1\x91 \xd1\x8e1\xd1\x91 \xd1\x8f\xd0\xb13\xd1\x80\xd1\x91 _\xd0\xbd\xd0\xb58 8\xd0\xbd\xd0\xb5_ 8\xd0\xb1\xd1\x8a_ 8\xd0\xb2\xd1\x8a_ 8\xd0\xb3\xd1\x8a_ 8\xd0\xb4\xd1\x8a_ 8\xd0\xb6\xd1\x8a_ 8\xd0\xb7\xd1\x8a_ 8\xd0\xba\xd1\x8a_ 8\xd0\xbb\xd1\x8a_ 8\xd0\xbc\xd1\x8a_ 8\xd0\xbd\xd1\x8a_ 8\xd0\xbf\xd1\x8a_ 8\xd1\x80\xd1\x8a_ 8\xd1\x81\xd1\x8a_ 8\xd1\x82\xd1\x8a_ 8\xd1\x84\xd1\x8a_ 8\xd1\x85\xd1\x8a_ 8\xd1\x86\xd1\x8a_ 8\xd1\x87\xd1\x8a_ 8\xd1\x88\xd1\x8a_ 8\xd1\x89\xd1\x8a_"; + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/patterns/sv.php b/application/third_party/mpdf/patterns/sv.php new file mode 100644 index 0000000..9029b33 --- /dev/null +++ b/application/third_party/mpdf/patterns/sv.php @@ -0,0 +1,12 @@ +<?php +/* + Adapted from Hyphenator 1.0.2 + http://code.google.com/p/hyphenator/ + + Original created by Jan Michael Rynning, jmr@nada.kth.se + Modified for Hyphenator by Andreas Johansson, andreas@ibuypink.com +*/ + +$patterns="_a4b _ab5i _ab5ol _ab3r _ac3 _a4d _a3dr _ad3s _a5g4ra _a5gre _a5kl _a5le _al4pr _a3lu _am4br _amp3l _a5mu _and4rar _a2n5es _ang4er _an5go _an5s _ap1p _as2k _a3sket _as4t _a5sten _a3sti _a5ta _at3t _au3st _a4val _av3s4 _b4 _bak5s _ben5s _bild3s _bo2k _bort1 _cis4 _cy5klop _d4 _d\xc3\xa4r3 _ek1v _e3l4a _e2l5in _en5st _e4n\xc3\xa4 _e2r3i _e2s _e5skad _es3kal _es5kap _es4t _e5strad _e3tr _evan5 _ex3 _f4 _feb3r _fram3 _fres5 _f\xc3\xa5gel3 _f\xc3\xb6r1a _f\xc3\xb6r1en _g2 _gu4l\xc3\xa4 _gus3 _he2m _hu5sa _ib4 _ik4 _im3p _i2n1 _i4na _in3d _in4ger _ink2 _in3s2 _in3t _is5ka _i3so _k4 _kans4k _ko5li _kort5s _kring3 _krings2 _k\xc3\xb6p5s _l2 _lak5r _lek5tr _lu2st _m2 _mas2ke _ma5skeri _me4re _minis4 _mj\xc3\xb6lk5s _mon2s _m\xc3\xa5n3s _m\xc3\xa54st _m\xc3\xa4n5sko _m\xc3\xb6rk5r _n4 _ner1 _no4n _n\xc3\xb6d5r _oc1ku _ok3t _o3kv _o2ma _o2mo _om3s4 _o3mu _on4k _o3o _ord3s _o5sc _o1s4k _o3sl _o3stra _o3sv _o3tr _o1u _p4 _papp5s _pa3ste _pa5sti _pi5sti _pres2s _pub3lika _r2 _re4gr _re2ste _runs4 _rym2d _r\xc3\xb6ve5 _s4 _sa2k _seg3r _si5o _sj\xc3\xb61 _sk4 _skott3s _slut3s _st4 _sta2m _sten3s _string4 _sup3p _t4 _ta3bl _ta4k _tak5l _tes3ta _tig3r _til4l _ti3o _topp5s _tred2s _tre3s _tr\xc3\xa45k _u3k _ult5r _ung2e _up2 _u4ra _ur3s _u2t1 _u4ta _u5trer _ut5s _v2 _var4t _vatten3 _ved5s _v\xc3\xa42g _v\xc3\xa4g3s _x2 _y2a _y4e _\xc3\xa5ng3 _\xc3\xa5r4s5 _\xc3\xa53st _\xc3\xa5ter1 _\xc3\xa43ro _\xc3\xb63ro a2b ab4bu a5be abel4s abe2s ab1l ab3la ab3ort ab5ric ab3rio ab4sc ab4sk a5bu ac4kes ac4kis ack3sk ack3u4p a5dag a5dek a5del ad5ep ad3j ad3op a5dran a3dre 1adres ad3ril ad3ru ad2s a5ed af4fo 3aff\xc3\xa4 1af3ri af4tor a1ga aga4ra a1ge a2ge_ ag1gr ag1l ag5ord ag3ro a4gur a4hj aib4 a3iv a1j a3ka a4kart a5ke a1ki ak3n a1ko ak5ram akri5s ak3rob ak4sta 1aktig ak3tri a1ku a5kvari ak3ve a5k\xc3\xa5r ak5\xc3\xa5t 4ak\xc3\xb6 a1la al5adm ali2br a2lin a5lin_ a3line al3ins ali5stik a4lj alk3ak al2kv al4k\xc3\xa4 all3st al3l\xc3\xa5 alms4k a1lo al5ort als5pa al3tr al4tu al4t\xc3\xa4 a1lu alu5s alv3s a1ly a4maf am4i am4pr am1s am3\xc3\xa5t a3m\xc3\xb6 ana4bo an3alf an3ark an3c anci5 an5dak andel2s an4dun an4d\xc3\xa4n a4nef ang4es an3gi an1gr aniu4 ank3r ano2i a4nok a4nop an5sce ansis3t an4sj ans5ku ans3li ans3par an1st an4sto an4sty 1ansvar an4tj an4tre a1nu a5ny a3n\xc3\xb6 a1o a1pe a2pe_ ape4n3 a1pi ap4lan apo3str 1appara apps4k ap3ric ap3rif a5pris ap2s ap3se aps5l aps3p apu5s a5py a5p\xc3\xa4 2ara a4rann a4rarv 1arb 4arbi 2arbo 4arbr ar3dr ard5st a4rend arg5si 2arh a1ri a4rigen ar3ka ark3lan ar5kr 4arl 4arn_ ar4nal a1ro a2rob 4arp ar2sa ar5skal arsk5l ar2sv ar4tro arts5p ar4tur 4aru a4rur a5rus ar4v\xc3\xa4g a3ry a3r\xc3\xa4 2asa asbe4 a1sc as2h asis5t as3kis a2sko a4skr as3ku as5l as3pa as3pig as2sk as2s5op as2sp as2st ass5up as3ta a5stard as5ter as5tiker asti5o as3to as4tr ast5rak a5stral ast3rol as5t\xc3\xb6r a3su a4sul a4sund as2ut as3v a1sy a2s5\xc3\xa5 a2s\xc3\xb6 a1t ata5ra a5te ati5\xc3\xb6 a4tj a2tr a3tral 4atrar a4t3re at3ria a3tric at3rie a5trik a3tris a3t4ro a4tro_ at4ska 1attac at2tak at4tj at4tos att3s a4tung 2au au5b au2t5a 3autom aut5s 2a1va a4vart 1avg 2a1vi av3r 4a3v\xc3\xa4 a5\xc3\xa5 1b2 3ba ba4di ba4do bad3s4 bak5l ba4ko ba4ku bank5l bas4ta ba5stu 4bb b4bak b4batt bbb4 bb3l bb4ler b4b3r bb4so 4b3d 3be be3d4r be5e be1k 4beld be5lu be3ly be3l\xc3\xa5 be5l\xc3\xb6 beng4 be3n\xc3\xa5 be1r\xc3\xb6 be1s be3sl bes5s be4sta be4ste be5su be3tr be3tv be3u 4bex 2b3f 2b5h 3bi bi3d4 4binv bis3ko bi5skv b3je b3k b5lar b5lat ble4mo b5len 5blera 3bles 5blid 3blikr 3bliks 4b3m 2b3n 3bo bo4gr bo2kl bo1mu 5bon bors5te bor4ti bort3r borts2 bort3sl bo1s bo4sc boy5 4b3p 2b5raf 4brar 2b5rati 3brik_ b3rika 3brike 3briks b5rik\xc3\xb6 bru4st 3bry 3br\xc3\xb6 4b3s b5sce bs3ch b4slan b4sof b4sp bst4 b4stj 4b3t 3bu bund4s bus2st b3v 3by by5r 3b\xc3\xa5 b\xc3\xa5ng3 b\xc3\xa5t2s 3b\xc3\xa4 3b\xc3\xb6 b\xc3\xb6r2s c2 5cap c3c 1c4e cens3t 3centr ceu4s 4ch_ 3chau 3chef 5choc 4cht ch\xc3\xa4s3 ch\xc3\xb6r4 1ci ci4lu cim2 cipp4 4ck c3ka c3ke c3ki ck5j ck1l ck5lis ck3n c3ko c4kordn ck3org c4kort ck3r ck4re ck3sla ckus2 ck3va ck3ve ck3v\xc3\xa4 ck5\xc3\xa4 ck3\xc3\xb6 cle2a co2a co4m 4cr cros2 4cs 1cy 1d 3da 5da_ 4dadr dags3 2dak 5dako da3li 5dam da3m\xc3\xa5 4dand_ 4d1ap 4darb 4dart da4tr dat5t 4dax 2db 4dc dcen3 2dd ddd4 ddi4s d3dj d4dos dd3ra dd3re dd3ri d3dr\xc3\xa4 dd2s dds3v 3d2e de1k4 4deko 4deld del2sa dels5ti de5lut d4en denti5\xc3\xb6 den2to de3pr 5der der1k de2ro de5rol der5sti de4ru de2s de3se de3sp des3ti d4et de3tr 4dex 2d1f df\xc3\xb63ra 2d1g d3gl 2d5h 3di dias4 di5el di2gr di3ka di5ku 4dinf din3g4o 4dinr 4dins 2dinsp 4dint di1o di4od di3sc di4sj dis3ko dis1kr dis1p dis5to dis3tra di4tre 2dj d3jor djup5p 3djur 2d3k2 4d5l 2d1m 2d1n 3do d2ol do5lo 4domr dom2sk 5don do4pak 4d5ord 4dori 4dort d5ost do3y 2d1p 2d2r2 d3rad 3d4rag d3rand d5rarb d5rassera d5ratu 3drej d3ren 5dres d3ret d4ric 3drif d3rig 4d5rik d3rin 3d4riv d5roc 3dropp d3ror 4drot drotts3 d3r\xc3\xa4kn 3dr\xc3\xa4kt 5dr\xc3\xa4n d3r\xc3\xa4t d5r\xc3\xb6d 4ds d2s1an d2se ds5enh d4sf d2si ds3ins d2sj dsk2 d3skef ds4ken d3ski ds3kl ds5kn ds1l ds4lot ds4mo d4sm\xc3\xa5 ds5n\xc3\xa5 d2so ds3pl ds3s4 ds3tal d5stat ds4te dste4a d5stig ds3tin ds5tro d2su ds1v d2s\xc3\xb6 2d3t 3du dub3ble 4dup du1s du2sc du4ste du5s\xc3\xb6 4dut du4vu 2d1v d3vr 2d3w 3dy dy4kan dy4ro 4dz 5d\xc3\xa5g 2d\xc3\xa5s 4d\xc3\xa5t 4d\xc3\xa4g d\xc3\xa42r 3d\xc3\xb6 d\xc3\xb6ds1 4d\xc3\xb6g 4d\xc3\xb6p d5\xc3\xb6st d\xc3\xa94 e1a e2ake e4am 4eb e2br eb3ril 4ec e3ch echiff5 ecis4 e3co e2d e4dans edd4r edi4u ed3j e5dral ed1sk ed2sko ed3s2l edso4 e3d\xc3\xa5 e1e e2ed e4ei ee2k5 e4en_ e4ene e1f ef4s 3efte e1g e3ga e3ge ege2l eg1l eg2ler e3glera e5gleri e4gran eg5rat eg3rin e5gru egs3 e5g\xc3\xa5 eig2 ei5gn e3ik e1in ei5sh e1isk e1jo e3ju e3j\xc3\xa4 e5j\xc3\xb6 e3ka e1ki e1kl ek3lat ek4le ek3n e1ko ekord5s ek3orr ek4ret_ ek5ro e1ku e1kve ek5vis e1ky e1k\xc3\xa4 e1la el1akt el4arb 3eld_ eleb3r elekt3ri el4fra eli5ku el3k4 el3li ell3s el3l\xc3\xa4 e1lo e4lob el3p el2si el5ug e5luv 2e1l\xc3\xa4 e1m e5mat e5mis emon1s em5ort emp5le en5art e2nav en4ce e4ned e4nek ene3r\xc3\xb6 2enj en5klo en3kn en5kr en5k\xc3\xa4 enning5 ennings2 eno2m en3si ens5ke ens2m en2sp ens4te ens4vin en4s\xc3\xa5 ent4ha en2t1r ent4rat_ ent3rati ent3ri ent5ru e5nus 2eny 2e1n\xc3\xa4 e1o e2og eo4i e5or 2ep e1pe e1pi e3pla ep5le epp2s3 epps5t e1pr ep3s ep4tr epu3b e3p\xc3\xa5 er1ak 4eras er3d4 erg4l er4gu er4g\xc3\xa5s e1ri e5rib e4rinf erings3 eri5stik erk4lin erl\xc3\xa44 er5na e1ro e3rob e2rom erp4 er3ra er5sc ers4ken er3sl ers4le er4sta er2ste er3str er3sv e1ru e5rum e3ry e5r\xc3\xa5d e1r\xc3\xa4 e2sal es5all es3arm e1sc 2ese es4hi esi4u es2k e4skan es5kar e4s3ken es3ker es5kul e1sl e5slag es2mi e1sp es3pl es2sk ess5l\xc3\xa4 es2st e3stal es5ten_ esti2ge es3tin es5tor_ es4tr est5rer e3stru est4r\xc3\xb6 e3st\xc3\xa5 es2u e1sy eta3b e5ti eti3\xc3\xb6 e1to e5tri_ et3ris e5tr\xc3\xa4 et2s ets2ad ets3kr ets1l ets3m ets5pa et4sv ett3r e1tu etu4ri et4va et5vu e1ty 2etz e1t\xc3\xa4 et\xc3\xa4c4 euk4 e5um_ e5up4 4eur eu4se_ eu5tro e1v e4varm e4vj ev3r 3exp ext4r 4e\xc3\xa4 f2 3fa fac4 fac5ke 4fans 4farb fa3sh fa4st fa4t\xc3\xb6 4fav 4f3b f3d 3fe 4fef fe2l fes5ta fe3sto 4fex 2f1f fff4 ff3l ff3n f3fo ff3r ffs4 f3f\xc3\xa4 ff\xc3\xb65re f3g2 f5h 3fi fi2br fib5rig fi3li fin5sm fi3skal fisk3r fi2ti 2f3k 1fl flo4da 4f3m fma4 1fo 4fof fol2 folk1 2f5om fo2na for4mo fost3r 4f3p fra2m fram5p f4rer 5freri fre4s f4ri_ fri5sp 5frit fros5ta fru5str fr\xc3\xa5n5 2f3s fs2k f4sl f4sm f4sn f4sp f4st f4sv 2ft f3ta f4taf f4tak f4tap f4tarm fte4r f4tex f3ti f4tin f3to f4t3r ft2sa ft4set ft2s5i ft4sj fts4t fts5v\xc3\xa4 ft5t ft1v 3fu furs5te fu5ru fu3tu 4fv 5fy fy4ma f\xc3\xa53t\xc3\xb6 1f\xc3\xa4 f\xc3\xa4s5ti 3f\xc3\xb6 f\xc3\xb62ra f\xc3\xb62ren f\xc3\xb62ri f\xc3\xb6r3k f\xc3\xb6r3sm f\xc3\xb6r3su f\xc3\xb6rt4 f\xc3\xb6r1\xc3\xb6 ga5br 3g2ag 4gakt 3g2al gall3s ga5l\xc3\xa4 ga4no 2garb 4garm ga2ro 4gart ga4st ga4su 5g2ati gaus4 g4av g5avsn 4gax 2gb 2gd g3d4r ge2a ge5b4 2gef 2ge4j g2eli 3gelis gel5st gel5y 3gel\xc3\xa4 gel5\xc3\xa4n g4em ge4nap gen5g 3g2eni 3genj 4genm genom5 gen4sa g4ense 1g2ent 4genv ge5ny 3gen\xc3\xa4 ge2o 1g2era 4gerarb 3g2eri gers5n 5gese ge4to get5s 5g2ett 2g1f 2gg g1ga g4gap g1ge gg5g gg1l g4gos ggs4la ggs4m gg3s4t gg3s4v g4gu 2gh gh4te 1g2i gi1o gi5sn gi4ste gis4tr gi5stral gi5st4rat 3giv gi2\xc3\xb6 g2jo 3gjor g3j\xc3\xa4 2g3k2 2gl g4lans g1lar g2las 5glase glas5k 5glas\xc3\xb6 g4lid 4glj g4l\xc3\xb6g 5gl\xc3\xb6m 2g1m 2g1n g4nag g2no 1g2o 3go_ 3gol gon3s4 4gont 2gord 4gorm 4gort go3sl 2g1p g2r4 3graf 5gral gra2m5 5grans 4gras 5grec 5grett g3rig 4g5rik 5grip 3gris g5roi gro2v 4grum grus5t g4r\xc3\xa5 5gr\xc3\xa5_ gr\xc3\xa44n 5gr\xc3\xa4ns 2g2s gs1an g5satt g3sel g4sf gsi4d g3sju g5skaf gs4ki gs3kn gs4kot g3sky gs1l gs1m g4sme gs3n gs4ni gs4n\xc3\xb6 gs1or gs3pl gs3po gs4por gs5pre gs3pu gs3s gs3tak gs3tal g3stark gs4ten g3stif gs3till gs3tj g3stol gs3tra gst4re g3st\xc3\xa4m g4sug gs1v g4s3ve gs3vi gs3v\xc3\xa5 gs3yt gs1\xc3\xa4 2g1t g3tr 1g2u 4gug guld3 gul4da 4gul\xc3\xa4 gu2ma 4gup gu5ru gus4k 2gut g3utb 2g1v 4gw 3gy gytt3j 1g2\xc3\xa5 g\xc3\xa5rds5 2g5\xc3\xa5ri g4\xc3\xa4l g2\xc3\xa4r g\xc3\xa44s 1g2\xc3\xb6 4g\xc3\xb6g g\xc3\xb65ro 2g5\xc3\xb6rt 1h ha3bl ha5ge ha4li hal4so halv3\xc3\xa5 ham4st handels3 hands4l han5g2a ha5ra ha4sc ha4sp hasp5l has3t hav2 havs3 h5c 4hd he4at he4fr he4l\xc3\xa4 hets1 hets3t hets3v h3g h2i 4hir his2sk hi4t hj\xc3\xa4l3s h1k 2hl h4le 2hm 4hn h2na h2nit ho5nu hop5plo hop3s hos3p hos5ti 4how h3p h5ru h1s 2ht hu2s hust5r hyg5r hys4t hys5ta hy3ster h\xc3\xa5rd5s4 h\xc3\xa4ll2 h\xc3\xa4lls1 h\xc3\xa4lso3 h\xc3\xa44ri h\xc3\xa44s h\xc3\xa44var h2\xc3\xb6 h\xc3\xb62g h\xc3\xb65gen h\xc3\xb6g5r h\xc3\xb6rn5s h\xc3\xb64s h\xc3\xb6st5r i1a ia3fr ia3g ia4lu ia4sk ia3tr i2b3l i5bril i3ca i4ce_ i5cha ic4kord ick3u4 i5co i2d iden3s id4ge i4dom id1r id3ro id2s ids3v i4dun i3d\xc3\xa5 i4d\xc3\xb6 2i1e ifes4 i5fn i1fr 3ifr\xc3\xa5n i1g 4igan i2geb ig5ej ig1l ig3no i3i i4kart i1ki i3klo ik5l\xc3\xa4n ik3n i1ko ik3re i5krob ik5rof ik5ros ik5s2h ik5skor i3kul i3kum ik5u4t ik1v i3ky i3k\xc3\xa5 i3k\xc3\xb6 i1la il4dan i2lin il1j\xc3\xb6 il5k il5lak il4lik ill3s2 3illu il5l\xc3\xa4r il2min i1lo il2tj i3lu ilufts5 i4lup i5l\xc3\xa4 im2b3r im5sm im4so i1mu i5m\xc3\xa5 i3m\xc3\xa4 i5m\xc3\xb6 i4nau ind5sk\xc3\xa4 ind5sti 1indu in4ga in4ge_ ing4es_ ing5is in5glas ings5te i3ni i4nif in5j in5kve 1inneh 5inre 1inri 3inr\xc3\xa4 in4sem in3skr\xc3\xa4 in3sl ins4m in3sn 1inspe 5inspeln in5spr 3instink 3instru in4st\xc3\xa5 in5te 1intr in4tra int3s i1nu i4nun in3ym i1n\xc3\xa4 i5oc i1og i3ok io4kr i1ol io5li i5om ion2 i3ono ions3 i1op i1or i1os i1ot i1pe i1pi ipos4 ip5pi i3ra i4res i1ri irk5l i1ro iro3p i1ru i5sce isel4 is2h i2sk is5kep isk5na is3kopa is3ku is4kun is3ky i5slam is3l\xc3\xa4n is3m is3n i2s3p is4pri is3sa is3se iss5n is4s3tr iss3t\xc3\xa4 i1stal i1stans ist5att is5ten_ i1stent is4tes is3tig is5ting is5tor_ is5tore ist5ro ist\xc3\xa54 is5v i3sy i4s\xc3\xa5 i1t it5c i4tei i4tex i4tj it5ran i5trin i3tris it2t5op it4t3r it4tu i2t5\xc3\xa5 4i1u i1va i2vak i1vi i4vin iv3r iv2s i1v\xc3\xa5 ix2t ix5tu i1\xc3\xb6 1ja 3jakt_ 4jarb jas5p 2jb 2jd jd3r jd4sty j4du 1je je2a 5jef je5sta 2j1f 4j3g 4jh 1ji 4jin 4jk j4kl j3ko jk3v 2j1l 2jm 2j1n j2o 3job jo4kr 4jolj jo5l\xc3\xb6 jor4din jord3s4 3jou 4jp j5pl 2j3r 2j1s j5sa j4sk js4me js4te 2jt jts4 2j2u ju4kos juk3s jul3k 4jur jus5kr juss4 jus4t jus5ta jut4sta j\xc3\xa45lo j\xc3\xa4l4p5r j\xc3\xa4l4sa j\xc3\xa4rn3sk j\xc3\xa4r5s j\xc3\xb6r2s j\xc3\xb6s4t 5j\xc3\xa9 1k2a 3ka_ 3kad_ 3kade_ ka4dr 2kaf 5kaf\xc3\xa4 ka3i ka5ju 2kak k3akti 4kalf 4kalg kal4lo kall3s 3kamp 3kamr 3kan_ 4kand_ 5kano 2kap 3kapi ka5pla kap4pr kaps5t 5kapten 3kar_ ka3ra 4karb k5arbet ka5ri 4kark 3karna 4karp karp5s 4kart_ 4karte 4karv 3kas ka4sk kas3ti 3kat_ 3kats_ 4kau 2kb 4kc 2k3d4 kdom4 1k2e 3ke_ 2ked_ 2keda ke3dr ked4s ke4er 2kefu 4keld kels4 4kense ke5n\xc3\xa5 2kep 3kern ke2s kes3s 4kex 2k1f kf\xc3\xb62 kf\xc3\xb63ri 2k5g4 2kh4 kid3s 4kif 1kig kik4s kilt4 5kim\xc3\xa5 king3r 4kinne 4kins 2kint ki4nu ki4tr kiv3s 4kj 5kjol k3j\xc3\xa4 2k3k kl2 1klag k2lama kla4mi 3klang_ 3klass 2klat 5klav 2kle k2lej 2klig k2lim 3klip k2lis 5klist3r k5lock_ 5klocka 3klos 1klub 4kluk 1kl\xc3\xa4d 2k3l\xc3\xa4g 2k1m 2k2n k4nal 3k4nap 5knip 3k4niv 3k4nu k4ny k5nyk k2o 4koc ko5de k5odl kog3n ko4gr kog4s3 4kola ko2lin 4kolj kol5tr 5kolv_ 1kom 3komm 5komp 2k3omr kom4s 1kon 3konf 3konst 3kont ko3nu 1kor 3korg ko3ri 2korr 3korres 5kortera ko5s4k ko3sl 3kost ko4str 4k3ou 2k1p k2r4 3kraf 5kra3ge 4krang 5krera k4reten krid5s2 1krig krigs3 krings2k 4kriv 3kropp kropps5 kru5stad k3ryg kr\xc3\xa5k5s kr\xc3\xa54pa k5r\xc3\xa4dd_ kr\xc3\xa4k5l 4kr\xc3\xa4l k3r\xc3\xa4t 2ks ksaks5 k2s5as ks3ch k4ser ks2k4 ks3kl ks5kra ks5kv k3sk\xc3\xa4 k3sk\xc3\xb6 k5slag_ ks2li k5sly k2so ks3pl k1s4t kstavs3 ks5tid k2su 4k1t k4tex kti5ge k4tinn k2tins k2tod k2tom k2tr kt3re kt3rin k5trod kt5rog kt3rol kt5r\xc3\xa4t kt2st kt5t4 k4tug k2tut k4t\xc3\xa4l 4kug k5ugn ku5la 4kuld 3kul\xc3\xb6 kum5pl kungs5 5kunn ku4pen ku4ro 3kurs 3kus kust3a kv4 3kvali k5vare 3kvarn kvar3s 3kvart k4vato k2ve 2kvente 1kvinn 5kvire k4vo k1v\xc3\xa5 3kv\xc3\xa4ll k1v\xc3\xa4r kydds3 ky4lin 3kyrk k\xc3\xa4l4m 5k\xc3\xa4mp 5k\xc3\xa4nn 3k\xc3\xa4ns 3k\xc3\xa4rl 4k\xc3\xb6g k\xc3\xb6ks5t 5k\xc3\xb6p_ k\xc3\xb6r4l k\xc3\xb6r4sl 3la_ 1lade_ 2ladm 4ladr 2laf 3lagd_ la4gin 5lagm lag3r 2lak 5lakan_ 5laki 3laktis la5lo 3lande_ lan4di 2lappara 2larb 1larn lar5s 4lart las3h 4lask la4st 5laste_ 1lat_ la5tr lat4tis 2lau 2lav la5vu 2lb4 4l1c 2l2d lder4s l3dj ld3ra l5dry lds4an 1le 3le_ le4ge_ le5ig le2kl le4kv lem4s\xc3\xb6 2l5enl 3ler_ ler5k 3lern ler3ste le5s2l le5t\xc3\xa5 le3um le4vu 2lex 2l1f 2l1g l2gj l3g2l lgs4 lg5st 2lh 1li li5ch 3lif 3lig li4go lig3s lik2l li5kli lik3s 5limer 2lind 2linga_ ling5o 4lingr lings5t 2lini 5linj 2lint li1o 2lip lis3c li4sta li3str\xc3\xb6 li4vo livs1 l2jak 4l1jo 1lju l5j\xc3\xa5 l1j\xc3\xa4 l3j\xc3\xb6r 2l1k l3ke l5kju l2kl lk5lag l5kl\xc3\xa4 l2kr l3k4ra lk3t l1la lld4 ll3dr lle5b ll3k ll1l l1lo llok5v ll3p ll4san ll2se ll3ska ll2so ll4sva ll4tig ll3tr l1lu ll5un llust3ra ll5v l5ly ll\xc3\xa4ggs5 l5l\xc3\xb6d ll\xc3\xb6r4 ll5\xc3\xb6rt 4l1m l4mol lm3st l1n lo2af loc4ku 4lodl lo4do lod3st lo2ge_ 2lolj 2lom 4lord 2lorg lor4s lo4vo l4pak l1pe l1pi l5pla lp5l\xc3\xb6 lp4st 4l3r 2l1s l2sc l4sjo l4sj\xc3\xa4 l2sk l4skensv l3ski lsk3n l5skot l3skr\xc3\xa4 l3sky l3sk\xc3\xa5 lsk\xc3\xa54p l3sk\xc3\xa4 l3slu l4sm ls4mo ls5nyt l2sp l3spe ls3pl ls3pol ls5s l2st l3sta l4stak ls4te ls5ter l3sto l3sty l4styg l3st\xc3\xa5 l3st\xc3\xa4 l5st\xc3\xb6 l2su l5sur l2sv l4svi ls5vid l4s\xc3\xa5 4l1t lta2tu l4tef l4tif l4tih l4tos lt5rati l4tret l4tr\xc3\xb6 lt5sk ltu4 lu5i luk4to 4lull_ 2lun lung3 2lupp lu4pu lus2s5p 5lust_ 4lutb 4luts 2lv l1va l4varm lvers4 l1vi l4vos lv3ri lv3sp l1v\xc3\xa4 lv\xc3\xa4v4 lycks5t ly4gat lyg3r lyg3s2 3lyste 5lystn ly4str 2l\xc3\xa5_ l\xc3\xa5g3s 1l\xc3\xa5ng l\xc3\xa5ng3s l\xc3\xa54sk l\xc3\xa5s5te l\xc3\xa54st\xc3\xa5 4l\xc3\xa4c l\xc3\xa4g5r 1l\xc3\xa4nds 5l\xc3\xa4ngder l\xc3\xa44san l\xc3\xa44sp l\xc3\xa4tt3s 4l\xc3\xb6l 4l\xc3\xb6m 3l\xc3\xb6n 3l\xc3\xb6rer 1l\xc3\xb6s l\xc3\xb64v\xc3\xa4 3l\xc3\xa9 1ma ma5fr mag5n mag5s ma5ju mak3r ma3li mand4 mang2a man5g4o ma5ni mani1k 5ma3ri mash5 mas3ko mask3ro ma5sk\xc3\xb6 mas3ti mas4v 2mb mb4sk 2mc 2md m4dat m4di m4do m3d4r 1me 2meds me4du me4kl me4ko 4meld melo5 me5lu men5k me5nu me5ny mer2sko me4so mes4t me3sti 2meta me5trin met3ro meu4 2mex 2m1f m4fes m4fn 2m1g4 2mh 1mi mid3s mi4lu 2mind ming4o 4mink min4kr 4minv mi3n\xc3\xb6 mis2 mi5sf mi4sp miss3t mi4te_ mi4tr mitt3s 2m1k 2m3l 2m1m2 mme5d mm3s4 m4mul 2m1n m2nam mnas3t m4nav mn5dr mn3g4 mn5st mn5tu m2n3\xc3\xa5 1mo m4od mo4i 2momr mo3na mos3k mo2ta mo4tin mo4tu mot3v 2m1p m2pak m4part m2pl mp3lad m5plane mp3lat mp3lin mpos4 mp5p4 mps4k mp5sp m4p\xc3\xa5 2m1r 4ms m4sal m4ske m3slag ms3l\xc3\xa4 ms2m mste2 m1sto m2str mst3rin ms5\xc3\xa4p 2m1t 4mud mulls3 mult5r 5mum 4mun3g4 mun4ko 3mur 3musi mu3sta mut4sl 2m3v 1myn mys4te m\xc3\xa5g4 1m\xc3\xa5l_ 5m\xc3\xa5let_ 5m\xc3\xa5n_ 4m\xc3\xa5r m\xc3\xa51s 4m\xc3\xa4g m\xc3\xa4k3 1m\xc3\xa4n m\xc3\xa4ns4 3m\xc3\xa4rk 1m\xc3\xa4s m\xc3\xa4s5ta 1m\xc3\xa4t m\xc3\xb64bl m\xc3\xb64gen_ 3m\xc3\xb6j m\xc3\xb6r4kl 3m\xc3\xb6s 4m\xc3\xb6v 1na 3na_ 3nad nads3 2naf na5gr 2nak 3nako 3nakr na3kro n1akt 2nalf 5nalfl 4nalg nal3s na2lu n5amb 5namn 4nand_ 4nanv na4rap 2narb 2nark 4narm 2nart nast3r 2nb4 2n1c n2ch n3cha n3che n3chi ncis4 ncyk3l 2nd n4dak n4dav nd3d4 n5de nde3s n4dil nd5rak nd5ras nd3rat nd3ri n5dril n3drop nd5ros nd5skal nd3sn nds3or nds5v\xc3\xa4 nd5\xc3\xa5s 1ne 3ne_ ne4di 5nedl ne4d3r ned3s ne4d\xc3\xb6 ne2gr ne5gres 4nek_ ne5ly 4nenl ner5sm nes3s4 ne4sta ne5s4ti ne3tre ne1ut 2nex 2n1f4 nfalls5 nfis3 2ng1 n4gar n4gen_ n4gend n4gens n4genti n4germ n4get n2gi ng3ig ngi4s ng4ly n2go ng5om ng3or ng3rad n4gr\xc3\xb6 ng4ser ngs1k ngs3pa ngs5tim ngs3val n4g\xc3\xb6d 2nh 1n2i 4nid ni5ec ni4ki ni5li 3nin nings1 nings3k nings5v ni1o 4nip nip4pr ni5steri nist3ra ni3t4r niv5sk niv5st 2n1j n4jar n3jun nju4s n3j\xc3\xa4 2nk n4kart n1ki n4kis_ n3kny n1ko nkrafts5 nk3ri n1kro nkrus4 nk5sl nk3sp nk4tin n1ku n1k\xc3\xb6 2n1l 2n1m 2n1n nn3d n3ne nnis4 nn3k nn3s4t 1no 2nodl no4kl 2nolj 2nomr nom3s4 2nord 2norg no5sa no5sc no4tu 2n1p 2n1r 4ns ns2i n4sint n4sis_ n4sise ns2k ns3kan n1ski ns3kor nslags5 ns5las ns5mit n4soc n1spi ns3pl ns3po ns3s4 n3stans n3stap ns4tel n3stif ns3tig ns4tra n2strik nst5up nst5vil n3s4ty n1sva ns3vi ns3v\xc3\xa4r 2n1t n4tark nter5s4 n4tinf n2t5omb nt3rad n3trah n3trak n5trala nt3rali n5tram nt3rep n3trer nt3ria nt3rin nt3ris n4tropin n4tror n4tr\xc3\xb6 nts3c nt4se nts5kor nt4str n4tut n3tv\xc3\xa5 nufts4 4nug n5ugn 3nui 3num nums5 2nup n3upp 2nutb 2n1v ny5gr n5z 4n\xc3\xa5r 4n\xc3\xa4_ 4n\xc3\xa4c 3n\xc3\xa4m 3n\xc3\xa4t 4n\xc3\xb6g4 3n\xc3\xb6j n\xc3\xb62ja n\xc3\xb65kr 4n\xc3\xb6l n\xc3\xb6s4 n\xc3\xb6s5ke o1a o2ard o2b 5o4bj o4bli oby4 oc4k5r ock3sk oc3ku o2d ode4k odi4a 1odli o5dral o3dro ods4k od2st ods4ti od5stu o3d\xc3\xa4 o1e offs5t o4fl o3fr of\xc3\xb6rm\xc3\xa54 o1g o4gav og3gr o4gj o5glo o5gly ognos4 ogno5st o4gri o4gr\xc3\xb6 og3se og4s3t o4g\xc3\xa4 o1i o4il o1j o1k o4kli ok3n ok3sl ok4su o2kv o1la o5lak ol5au olf\xc3\xb64 1olj ol3ka olk3r ol4ku ol4k\xc3\xa4 oll4si oll5sl\xc3\xa4 ol3l\xc3\xa4 olm4s oln3s o1lo olo5kv ol4sa ol4t\xc3\xa5 o1lu o4lug o4lur o1ly ol5\xc3\xa5r o1l\xc3\xa4 om4br\xc3\xa4 o3men o4mord om5pa om3pl 1omr 4omra om1sk om4ste 3oms\xc3\xa4t om4tr om3tv on3c on5gi on1gr ongs4l o4nins on3j on1k4 ons3c onsi3s ons3m on5stel ons4ter on3tras on4tre ont4s o1ny on5\xc3\xa5 o1n\xc3\xa4 o3n\xc3\xb6 oo4d oom5s o3or o1pe o1pi o5pline op4pl opp3le op4pr op4pu o3pri op4st o3p\xc3\xa5 o5q 4ora o3rak oran3g4 o2rap 1ordn or4d5\xc3\xa4 o4reh 1orga 5organi or4gr or4g\xc3\xa5 o1ri 3orient 4ork or4m\xc3\xb6 or4nu or4n\xc3\xa4 o1ro or4pl or5pr or4spa ors5tig or5te or2tr ort3re ort3ro o1ru o3ry o1r\xc3\xa4 o1r\xc3\xb6 o3s2f\xc3\xa4 osk4l o1skop o3som os5pig os4sk os4s4t os3tig os5tiker o5still os4tr ost5ron ost5r\xc3\xb6 os3tul ota2lan 4oti_ 4otie 4otin o1to o5tro ot5run ot3sv ot5ti ot4tr\xc3\xa4 ott2s o1tu o5tun otvin4 o1ty o5t\xc3\xa5 o3t\xc3\xa4 oun4 oup4 4our ou3r\xc3\xb6 ou4s o3ut3t o1va ova4n o1vi ov3r ov4si ov3sl ovs4me o1v\xc3\xa4 o3we ox5 oy2 o3\xc3\xa5 o3\xc3\xa4n o3\xc3\xb6 1pa 4paf pag4 paki3 pakis4 pa5la pals5 pa5l\xc3\xa4 4pand_ pan4tr 3pap 2parb 4parm par3s 2pask pa5ski pa2st 3patr pa3u 2pb4 2pc 2p3d4 pek5tri pekt3ro 4peld pel3s4i 4pem 5peng 3penn pent5r per4bl 3perio 3pers per4sl pe5tro 4pex 2p1f 4p3g 2ph pi4el 1pig pi1o 3pip pi5so pi5sta pi5sto p2j 3pj\xc3\xa4s 4p3k2 p2l p4lac 5plan_ p4lane p3larn p3lev 3plex 3plic 1plik 4plit p3lj 1plom p3lop 2p1m 4p1n p3ni 1po 5poa 2poc 2pof po2i 3polit 4polj poly3 2porg 3pos pos4ter 4pov po4v\xc3\xa4 2pp p4part pp5ask p4pax p3pe p1pi p4pins pp3j pp1l pp3la pp3lin pp5lis pp5lu pp3ly pp3l\xc3\xa5n pp3l\xc3\xa5t pp3l\xc3\xa4 pp3l\xc3\xb6 pp5oc pp3of pp3p4 pp1r pp3ra pp3ri pp3ru pp3ry pp3r\xc3\xa4 pp3tr p2pu p5py pp3\xc3\xa5 p2r2 2pra 5prax 1pres pres4t pre3sta pres5to p3rig p3rik 5pril 3princ pring3 p5riol 3pro pro3g p3ror 4pr\xc3\xa5 3pr\xc3\xa4s 3pr\xc3\xb6v 2ps p2sal 3psalm p5s2ho ps4ken ps2li p3sna 4pso p3sod p1s4t p4stak p4st\xc3\xa4v p2s\xc3\xb6 2p1t p3tri 1pu 4pug pul2l5ov pul5tr 5pung 3punk pus3t 2p1v p\xc3\xa53dr 3p\xc3\xa4l p\xc3\xa45ro 4p\xc3\xb6r 3p\xc3\xa9 qu4 3que 1ra 3ra_ raci4t 3rade_ 4radr ra4du 5ra1e 2raff\xc3\xa4 ra3fr ra5is 2rak ra2lo r4ande 3rande_ 4ran4d3r rand3s 2ransv ra3pl 3rar r4ar_ 4rarb r4are 4rarg r4ark 4rarm r4arn r4ars 4rart r3arta ra5r\xc3\xb6 r4as ras3h ra2st 3raste_ 3rativ ra3tri 2rav ra5yo 2rb 2r1c 2r2d r4daf rda5gr r3dj r4dos rd3ran rd3rat r4dul r3d\xc3\xa5 r3d\xc3\xa4 r4d\xc3\xb6s 1re 3re_ 4reaus re3b 4rec 5reco re3d4r re5du 4reft 4regg 3regn_ re1kr rek5tri 4reld re3lu rem5p 3rems r4en_ 2reni 2renk 2renl re3n\xc3\xb6 re3o 3rer_ 3rern 3reso ress5k re1sti 3ret_ 4retet ret3ro 4rety re5t\xc3\xa5 2revig 4rex 2r1f rf\xc3\xb63ri 2r1g rg3g2 rgs5top 2rh rhands5 3rial 4rib 3rifi 2rifr r3ifr\xc3\xa5 3rifu 3rigt rik2s 3riktn ri4mo 2rind rind3s 5ringen_ ring3r 2rinr 2rins 2rint ri1o 3riot ri5ple ri2st\xc3\xa4 ri4tut ri4vis riv3s 4rj r4jis r3jo r5ju r5j\xc3\xb6 2rk rk3akt r4kek rkes3 r1ki r3klas rk2le r4kl\xc3\xb6 rk3n rk4ne r1ko r4kod rk3tr r1ku r4kup r1k\xc3\xa4 r5k\xc3\xb6r 2r1l r5laka r5lav rld2 rlds3 rl5sp 2r1m r4marb r4mil rm2s5j rm5tr 2r1n rnal4 rn3g4 rn1k r2nom rns4k rns4t rn3t ro3b ro4gro ro2kr 2rolj rol4li rom4a 5roman 5ronau 5rond_ ron4v ro3pl ropp2s ro4ra 2rord 2rorg 2rorie 3rorn ro4sin ro4sn ros3v ro5te 2r1p r4pl\xc3\xb6 r4p\xc3\xb6 4r1r rra4n rrd4 rreligi5 rres4 r5rib rr5k4 r4rob r4rom rr1s rrs2k r4rur 2rs r4seld r4sex r2sin r1ski r4skid rsk3na rs5koll rs4kos rskotts3 r2sku r3sk\xc3\xb6 rslags4v r4sle r4slo r4s5l\xc3\xb6 rs4mo rs5nat rs5n\xc3\xa4 r1sp r2spl r2spo rs3s4 rs5tak rs4te r5stek rs5tend r5steni rs5till r1sto r4ston rst4r r3str\xc3\xb6 r3stu r1sv rs4vag r2sv\xc3\xa4 r1sy 2r1t r2taf r2takti rt4an r4tins r4tom r5trit r3tr\xc3\xa4 rt3t r4tut rubb5l ru3br ru4dan ruks1 ruks3v 5rullera 3rum_ runn2 runns5 4rupp rus2h ru5sha 2rut 5rutig rut4ra ru4vi 5ru\xc3\xb6 2r1v rv4sj rv2s5k\xc3\xa4 r3w rydd5s ry5o r\xc3\xa5ge5l 4r\xc3\xa5l r\xc3\xa5ng3s r\xc3\xa55ra r\xc3\xa53st r\xc3\xa4ck5s 4r\xc3\xa4kt 4r\xc3\xa4m r\xc3\xa4ng3s r\xc3\xa4ns5t 4r\xc3\xa4s r\xc3\xa44san r\xc3\xa4s3s r\xc3\xa45sti r\xc3\xa4v5s r\xc3\xb6d5el r\xc3\xb6d5r r\xc3\xb6d3s 2r\xc3\xb6g r3\xc3\xb6i r\xc3\xb6k3s r\xc3\xb6ns4t 4r\xc3\xb6p 3r\xc3\xb6r r\xc3\xb6r4s r\xc3\xb64st r\xc3\xb6st3r r1\xc3\xb6vr 1sa 3sa_ 3sad_ 3sade 4sadj 2sa3dr sad5s 2saf sa3i sak5ri 2s1akt sa5lo 3s2am sa2ma samman3 sa2mor sand3s 4sang 2sanl s3anl\xc3\xa4 san3sla 2sap 3s4ar_ 2sarb 2sarm s5arm_ 3sarn 2sart 4sarv 4sass 5sat_ sa4tu 2sau s3auk 2s1av 4sb s2c 2sch_ 1scha 2schau 4schb 1schen 1scher 1schet 1schi 4schk 4schm 4schp 3schy 3sch\xc3\xb6 sci3p 4s3d 1se se4at_ se2g 2s3egg 3segl seg3ra sek5le sek3r sek5tr 3sel_ se5ly sem2 3sen_ s5ers\xc3\xa4 3set_ 2sexp 2s1f s4f\xc3\xa4r_ sf\xc3\xb62 4s3g2 2sh 5s2haw shi1s s5h\xc3\xb6 1si sid5s 5sie si4eri si4esk si2ett 3s2ig 3sik sikts3 5sill_ silver3 silv3r 2s1ind 2s1inf sinne2s3 3sinni 4sinr 2sin1s s1inst 5sint_ 2sintr 3sio sis4t siu4 1s2j 2sjak s3jakt 4sjn 4sjt s4ju 5sjuk 4sjur sj\xc3\xa4ls3 3sj\xc3\xb6 4sk_ 2ska_ 3s2kada s2kado 3skaffn 1skaft s4kag s2kal 3skal_ 1skap 5skap_ 5skapet 4skapi skaps1 4skar s4kara 5skarv 4skas s2kat s4kav 4ske_ 3sked_ s4kene 3skepp 4skh sk4i 3skif 5skin 4skis_ 5skiv 5skjor 3skju 4skl sk5lap s3klas 4skn 3s4ko_ 1s4kog 4skogsg 1skol 3skola s4kolo s4korp skor1st 1skot s5kran_ 3skrat sk4ret 3skrev 1skri 3skrif s3krig 5skrin 3skrip s5kris 3skriv s5kron s4kru 5skrub 3skruv 5skr\xc3\xa4c sk3s 2skt 3skulp s3kup 2skv s4kve 1s2ky s4kyn 2skyrk 1sk\xc3\xa5 s4k\xc3\xa5l 5sk\xc3\xa5p_ 4sk\xc3\xa5r 5sk\xc3\xa4nk 3sk\xc3\xa4rv 2sl2 4sla_ s5lad_ s3land 3s2lang s4lant s3lar_ 4slas s1lat s2lev 3slev_ s4lic slins3 4slis s2lit s5lor slotts3 s2lu s3luc s3luf 4slus s3lust 3slut slu4to 3sl\xc3\xa5_ 5s4l\xc3\xa5r s4l\xc3\xa4k s5l\xc3\xa4m s5l\xc3\xa4nn 3s4l\xc3\xa4p 4s3l\xc3\xa4r s2l\xc3\xa4t 3s2l\xc3\xb6j 2sm s2mak 3smak_ s3makt s2mal s2met_ s2mid s2mit 3smitta s3mj 5smug 5smyg sm\xc3\xa55g sm\xc3\xa53k sm\xc3\xa53s 3sm\xc3\xa4d 3sm\xc3\xa4l 4sm\xc3\xa4s 3sm\xc3\xb6r 2s2n4 3snab 3s4nac s3nam s5nare s3nast s5ner 3snib 3snil 3snit 1snitt s3niv 3snut s4n\xc3\xa5 5sn\xc3\xa5r 5sn\xc3\xa4c s4n\xc3\xa4r 3sn\xc3\xb6_ sn\xc3\xb65g 3sn\xc3\xb6r sn\xc3\xb63s 1so 3soc 5sock 2sod 5soi 2solj sol3s2 2som 5somm 3son son4st so5pra so4pu 3sor_ 2sord s5ord_ 2sorg 3sorn 3sot 4sott s2p2 5spann_ s4park 5sparv 4spas s3pass spa5tr 1spe 4sped 3s4pek 3s4pel 4spelsl 2spen 2sper 5spets 3spill 3spir 4spl s1pla s3plan s3plats spli4 s4plin 5split s5pl\xc3\xa4 4spre s3pres 4s3pris 3sprit 2spro s3pry 3spr\xc3\xa5 5spr\xc3\xa4n s3ps 1s4p\xc3\xa5 3sp\xc3\xa5n 3sp\xc3\xa5r 5sp\xc3\xa4n 3sp\xc3\xb6 4s1r 4s1s s5sad sse4lin s5sil ss2k ss5kl ss3kun ss1l ss2lag_ ss2l\xc3\xa4 ss2l\xc3\xb6 ss3na sss4 ss3unn s2sv ss3vi s2t 2st_ 4sta_ 5stac 3stadi s4taf 5stalgis 3stalla 2stalli 5stam_ 5stamm 1stant 5stark_ 5startad 1state 3statl 1stau st3c 2s5te_ 4stea 5steg_ s4tek_ 2stekn 5stekt s4tell 3stem_ 3steme 5stenar 3s4tene 3stense 5stensm 1stera 1stering s4teriu 3sterne 5stetis 2stia 2stib 3stick 2stid s4tiken 2stil 3stil_ 3stink 3stisc 1stit 2stj s5tju 3stj\xc3\xa4l 3stj\xc3\xa4r 2stm 5stoc 1stol 4stolk 4stom stori4eu 5storis stor3s 3straff 4strativ 3strato 3strec 3strej st3ren 1strer 2stria 1strid 5stride 2striel st4rif 1strikt st5risk 1stru 3struk 2strumm s3tryc 5stryk 5str\xc3\xa5k 3str\xc3\xa5l 3str\xc3\xa4c 4str\xc3\xa4d 3str\xc3\xa4ng 5str\xc3\xa4v 3str\xc3\xb6m 2st3s4 st3t 4stv s3tvis 1sty 2styp 1st\xc3\xa5 4st\xc3\xa5g 5st\xc3\xa5l 1st\xc3\xa4 3st\xc3\xa4l 1st\xc3\xb6 1su su4b 3sug su3i 3sum 2sun 5sun_ s1under 5sune s5ung 2sup 5supa su2pu 5sus 2s1ut su4to su4tr s2v2 5svag_ s3vagn 4s3vak 5svam 4svap svars3 3svart 4svas s3vat 4svec 3sven 5svep 4s3ver s5ves 4s3vil s4vine 4svis s5vitt s5v\xc3\xa5d 3sv\xc3\xa5ri 3sv\xc3\xa4ng 5sv\xc3\xa4rm_ s3v\xc3\xa4s s3v\xc3\xa4t 4syk 5syl 3syn syn3k s3yrk 3sys sys4t sys5ter syt2 sy5th 1s\xc3\xa5 5s\xc3\xa5g 4s\xc3\xa5k 2s\xc3\xa5lde s\xc3\xa5ng3 1s\xc3\xa4 s4\xc3\xa4d 2s5\xc3\xa4gg s4\xc3\xa4l 2s\xc3\xa4p 5s\xc3\xa4s 3s\xc3\xa4t 4s\xc3\xa4ta 1s\xc3\xb6 4s\xc3\xb6d 2s\xc3\xb6g s5\xc3\xb6ga s\xc3\xb64ko 4s\xc3\xb6l 4s\xc3\xb6p s\xc3\xb6r2s 2s3\xc3\xb6rt 1ta 3ta_ ta1ch 3tade_ 4tadi 4tads5 2taff 3taga 5tak_ ta5kre 2taktig tak4to 4talf 5tallise tall5s 4talv 3tame 3tami 3tan_ ta4nab 3tande_ 2t3anfa 4tanl t4ap3l 2tappar 3tar_ 4tarb tar4mi 3tarn tars4 4tart 5tartavl 4tarv 4task 3tast ta1str tat2 ta4tan tats3 2tatt 2tav 4tave 5tavla_ 3tavlan 3tavlo tav2s 3tax 2tb4 2tc t3cha t3che 2t3d4 3t2e te4as te3b4 5tec 4teg te2g1r te3gre te3i te4int 4tej tej2s te4kl 5teknik 5teknis 4teld 5te5l\xc3\xb6 5tema 4temo te4mu ten3g4 5tensi ten3tr te4n\xc3\xa4 te5n\xc3\xb6r 5ter_ 5teri\xc3\xb6 ter3k4 5term 5terna 5ters ter3t te4ru 5tes_ 5test tes4te te5stik te5stu 5tetik tets3 4texa 2texp 2t1f4 2t3g4 2th t4hen 1ti 3tial 5tib 5tici 3tid 5tide ti4du 4tid\xc3\xb6 ti4ed tifts5 ti2gel 3tigh ti4go ti2gr 3tigt tik3l 3tiks 5tikul t2il 5tilj 3tillst 3tillv 3till\xc3\xa4 5time 2tind 2tinr 2tint ti4od 3tion ti2os 3tis 4tisc 5tisk 3tiva ti4van 5tivite ti2\xc3\xb6 t2j 4tje 4tjob 2tjou 4tj\xc3\xa4l 4tj\xc3\xa4m 3tj\xc3\xa4n 2t3k2 2t3l 2t1m 2t5n4 tne4r 4todl 3tok 4tol_ 4tolj 2tomr 4toms t2op 5torap t5ord_ 5toriett 4torm torm3s 3torn tor1st 4tort_ tos4k t5ost_ t4ov 2t1p t2r4 2tra t4raf 3trafi 3t4ral_ t4rala 3t4rale 5tralo 3trals t4ralt 3trans tran2s5a 4trar t3ras_ t3rat_ t4rato 4treg 4tren 4trer_ 4trern t3rets_ 2tri 3tribu 5trick trids3 t5riel t1ring t3ring_ 2troc t3rock t4rog t5ronik t3rono 4tropi_ 5tross 5trotn t4rump t4rup 3trupp trus5ta 1tryc 5tryck_ 5tryggh 4tr\xc3\xa5k 5tr\xc3\xa4_ 3tr\xc3\xa4d tr\xc3\xa4ds4 3tr\xc3\xa4f 3tr\xc3\xa4g 4tr\xc3\xa4k t3r\xc3\xa4kn t4r\xc3\xa4n 5tr\xc3\xa4ni 5tr\xc3\xb6ja t4r\xc3\xb6t 5tr\xc3\xa9 2ts t5s4and ts5art t3s4at t3se t4seg ts4en t4sex ts2k t5skall t3skatt t1ski ts3kl tskotts5 t5slot ts5l\xc3\xa4k ts3n\xc3\xa4 t3sn\xc3\xb6 t2so ts3ord ts3pl tss4 t1st ts4te ts5ter ts5tillf ts3tj t3stol t4ston t2stra t4stry t4stur t5styr t2su t3sud t5sy 2tt t3tac t4tau t4ted tte5g4 t4tem tte2n ttes4 t4tex t4tins t4tip tt3ja t1to tt3rad tt3rand tt3rat tt3re tt3ri tt4ry tt4se tt2si tt4sta t3tu t4tug tt1v tt4v\xc3\xa5 t3ty t3t\xc3\xa4 t3t\xc3\xb6r 4t5ugn 2tund 3tunga tung3s 5tunn 2tupp tu5re 2tutb t3utv t3ut\xc3\xb6 tu4vu 5tu\xc3\xb6 2tv t1va 4tve t3vig 3tving t3vit 3tviv t3v\xc3\xa5g 3tv\xc3\xa5n t3v\xc3\xa4n tv\xc3\xa4r3s 3tv\xc3\xa4tt ty5da 5tyg_ 3tyngd 3typ ty3pi 5tys 2tz 3t\xc3\xa5g t\xc3\xa5s4 4t\xc3\xa5t t\xc3\xa4c4ko 4t5\xc3\xa4g 4t\xc3\xa4m 4t\xc3\xa4rm 3t\xc3\xa4vl 4t\xc3\xb64d t\xc3\xb65de 4t\xc3\xb6g 4t\xc3\xb6p t\xc3\xb64pi 3t\xc3\xb6rer t\xc3\xb6rs3t t\xc3\xb64vas 5t\xc3\xa9 u1a u2b ub5al ubb4le ub3lic u4bo u3cha u5cl u2d u4dak u5de ud3r ud4ret uds4a u4du u4dy u1e u2es uf4f\xc3\xa4 uf4tan uf4to 4u1ga u1ge ugg3s ugn4 ugns5 ug3s4 u5ie u1in u3is u3itet u3j u2keb u5ki u4kl uk5la uk3n u1ko ukos4 uk2s uks5ko uk3tris ukt5s uk4t\xc3\xa4 u3ku uk3v u1la ul4di ulds2m ul4du ul4d\xc3\xb6 ull3ste ull3\xc3\xa4n u1lo uls5ti ul2tr u3lu u1l\xc3\xa4 u1l\xc3\xb6 um4f\xc3\xa4 um4so ums4t u1mu u3m\xc3\xb6r 5underl 1unders\xc3\xb6 1underv un4dom und3r un4d\xc3\xa5 un5g2ef un3gersk ung5it ung3r ungs4p 3unif unk3l unk3n un4kr un1sk un4tr un5trati u5nu u1o u1pe u4pern u1pi u2pl u3plet up3lik 3uppfa 1uppg up4pin 1uppla 5uppl\xc3\xa4 up4p3r upp3s upp5sp up5ut ur5ak ur5arv u3re u1ri u1ro u4rob u4rom urs5tin ur4st\xc3\xa4 u5ry u2sak us5anl u3scha u3se usen3 u2s1k us3ka us4kla us4kr u5sky us4k\xc3\xa5 us5l\xc3\xa4 us3n u2sp us3pen us5tat us3tig u3stik us5tin ust5ro u4st\xc3\xa5 u4st\xc3\xa4 us3v u4s\xc3\xa5 u4s\xc3\xa4 u2s\xc3\xb6 u4tak 1utb u4tef ute3s utik2 u5til uti3\xc3\xb6 ut3j 3utj\xc3\xa4m utlands3 u1to u3top uto5s ut3r ut4rer ut4ro ut5rop 1utru 2utsid ut3sl 3utsl\xc3\xa4 2utt utt4j ut1v 3utvec u5ty ut3\xc3\xb6v u5u 2u1v u2vak u4vj u4v\xc3\xa4 u5\xc3\xa5 u3\xc3\xb6 va5dro 1vagn 2v1akti val3k val4li val4st 5valv 5vama 4vand_ 4vanp van4st van5tr 5vap 2varb va4res va4ri_ 4vark var2s vart5r va1ru vas5ti 5vattn 4vau 4vav 5vavi 2vb4 2v1c 2v3d4 1ve 5vec ve2k ve3ke 4veld vensk3\xc3\xa4 5ventera ve3ny ve5n\xc3\xb6 4vep ver5g 3verk ves4 ve2s5p ve1st 3veta 3vete vet5sa vett5s 2v1f 2v1g 2vh v4i vi4c vid3s vild3s vil4t 3vind_ ving3s4 3vinkl vi2no 5vinst_ 5vinste vi5ny 3vis_ vi5sa vis5h vis5ko vi4st vis3ta vi2tr vi4var 4vjo 2v3k2 2v1l 2v1m vm\xc3\xb6rk4 2v1n4 1vo 4vok_ 2vom 4vord 2vorg vos4 2v1p 2v2r 5vrak 3vrera v3ru 2vs v4sc v1s2k v2skri vs4mi v3sni v2so v1st vs4te vs5tr\xc3\xa5 v5styc vs3v\xc3\xa5 v2s\xc3\xb6 2v1t vu4d1 v1und 4v5up 4vut 2v1v 3vy 5v\xc3\xa5ld v\xc3\xa5ngs3 3v\xc3\xa5rd 4v\xc3\xa5ri v\xc3\xa53ru 3v\xc3\xa4g v\xc3\xa4gg5s v\xc3\xa44l v\xc3\xa4ll4s3 3v\xc3\xa4nl 3v\xc3\xa4rde v\xc3\xa44ril 4v\xc3\xa4rj 5v\xc3\xa4rk 3v\xc3\xa4rld 2v\xc3\xa4t 3v\xc3\xa4x 4v\xc3\xb6g 4v\xc3\xb6p 3v\xc3\xb6r 1wa we2 w2h whi2 wi2e w4na x1 xan5d4 xem3pla xis4 xk2 xli4 xs4 xti2 x4t\xc3\xa5 2y y1a y4bris yb4s y2d y4da y5dan y4do yd3r yds4 y4du y4d\xc3\xb6 y1e y1ga y1ge ygg3r yg4g\xc3\xa5 ygs4p y1i y1ki y5klist yk5lon yk3n y1ko y1la yl4gj y3li yl5k yl5l\xc3\xa4 y1lo yl4tr ym2fl ym4for y3m\xc3\xa5 yng3r ynk5l yn4sa yns4t y3or y5ou y1pe y5po yp3ri yre4s y1ri yr4ku yrk5v y1ro yrs4k yr5st yr5tu y1r\xc3\xa53 y5scho ys2st ys3ta ys3ti ys4tik_ yst3ra y2tak y4te_ y4tea y1to ytt3r yt5v y3va y3vi y3v\xc3\xa4 y5w y5\xc3\xa5 1za 1ze ze4ro 1zi 1zo zo4nal 4zp z5s 3zu z4zin \xc3\xa51a \xc3\xa53dj \xc3\xa5ds4l \xc3\xa51e \xc3\xa51f \xc3\xa51ga \xc3\xa51ge \xc3\xa5ge2l \xc3\xa5g3l \xc3\xa5g3s4k \xc3\xa5g3st \xc3\xa5g\xc3\xa54 \xc3\xa53i \xc3\xa51ki 5\xc3\xa5klag \xc3\xa5k4str\xc3\xa4 \xc3\xa51la 1\xc3\xa5lder \xc3\xa52lin \xc3\xa5l3k \xc3\xa5ll4sp \xc3\xa5l2s5e \xc3\xa5l3st \xc3\xa51l\xc3\xa4 \xc3\xa51m \xc3\xa5man4s \xc3\xa5nd4r \xc3\xa5n4du \xc3\xa5ns4t \xc3\xa5ns4v \xc3\xa53o \xc3\xa51p \xc3\xa52pl \xc3\xa55pla \xc3\xa54p\xc3\xb6 \xc3\xa5r4do \xc3\xa5rd4ra \xc3\xa5rd2s \xc3\xa5rd4s3t \xc3\xa54rel \xc3\xa51ri \xc3\xa55ror 5\xc3\xa5rsav \xc3\xa5r5s2li \xc3\xa5r2sv \xc3\xa5r5\xc3\xb6 \xc3\xa5s4ke \xc3\xa5s3n \xc3\xa5ss4 \xc3\xa5s4skr \xc3\xa5s4t \xc3\xa5te2 \xc3\xa5t3ri \xc3\xa53tr\xc3\xa5 \xc3\xa5t2sj \xc3\xa5tt5s \xc3\xa51v \xc3\xa41a \xc3\xa42b 2\xc3\xa4c \xc3\xa4ck5v \xc3\xa42d \xc3\xa4dd3s \xc3\xa4d4du \xc3\xa4de4s \xc3\xa4d3r \xc3\xa4d5se \xc3\xa4d3st \xc3\xa43e \xc3\xa41ga \xc3\xa41ge \xc3\xa4g4go \xc3\xa4g1l \xc3\xa4g3r \xc3\xa4g4re \xc3\xa4g3se \xc3\xa43i \xc3\xa45jo 4\xc3\xa4k \xc3\xa41ki \xc3\xa4k3n \xc3\xa4k3r \xc3\xa41la \xc3\xa4l4pap \xc3\xa4l4seg \xc3\xa4ls5kog \xc3\xa4l4slu \xc3\xa4l2t3r \xc3\xa4l2tu \xc3\xa4l4vin \xc3\xa4mp3l 4\xc3\xa4ndligh \xc3\xa4nd3r \xc3\xa4nd1st \xc3\xa4ng5r \xc3\xa4nni3s \xc3\xa4nn3s \xc3\xa44no \xc3\xa4ns1l \xc3\xa4n4st \xc3\xa4ns5te \xc3\xa4n4sv \xc3\xa4n2t3r \xc3\xa43pe \xc3\xa4pp3l \xc3\xa44pr \xc3\xa4p4st \xc3\xa44rap \xc3\xa4r2bre \xc3\xa4rg5l \xc3\xa4r4gr \xc3\xa41ri \xc3\xa4rib4 \xc3\xa4r4k\xc3\xa4 \xc3\xa4r4nis \xc3\xa4rn3st \xc3\xa4r2n\xc3\xa5 \xc3\xa4r4n\xc3\xb6 \xc3\xa4r5ob \xc3\xa45rol \xc3\xa43rop \xc3\xa45ror \xc3\xa45ros \xc3\xa4r2si \xc3\xa4r4sko \xc3\xa4r2so \xc3\xa4r4sp \xc3\xa4r2sv \xc3\xa4r4tand \xc3\xa4r2tr \xc3\xa4rt3s 4\xc3\xa4s \xc3\xa4s3pa \xc3\xa4s5pi \xc3\xa4s4sk \xc3\xa4s4sp \xc3\xa4s3ta \xc3\xa4st3r \xc3\xa44st\xc3\xa4 \xc3\xa44s\xc3\xa5 2\xc3\xa4t \xc3\xa43to \xc3\xa45tre \xc3\xa4t4s3k \xc3\xa4t5te \xc3\xa4t4top \xc3\xa4tt3r \xc3\xa4t4tu \xc3\xa4t4tv \xc3\xa41va \xc3\xa42vak \xc3\xa43vi \xc3\xa45vu \xc3\xb61a \xc3\xb62d \xc3\xb64dak \xc3\xb64dal \xc3\xb64darv \xc3\xb6de4s5 \xc3\xb64dis \xc3\xb6d3ra \xc3\xb6d2s \xc3\xb6d3se \xc3\xb64du \xc3\xb64d\xc3\xb6 \xc3\xb61e \xc3\xb61ga \xc3\xb6g5ak \xc3\xb65gar 1\xc3\xb6gd \xc3\xb61ge \xc3\xb65ger \xc3\xb6gg4 \xc3\xb6g1l \xc3\xb6g2n \xc3\xb6gn3e 1\xc3\xb6go \xc3\xb6g3si \xc3\xb6g3sk \xc3\xb61i \xc3\xb63jo \xc3\xb6j4sv \xc3\xb64karm \xc3\xb61ki \xc3\xb6k3n \xc3\xb6k2s \xc3\xb6k3sl \xc3\xb61la \xc3\xb6l4kv \xc3\xb6l4k\xc3\xb6 \xc3\xb6l2p \xc3\xb65l\xc3\xa4 \xc3\xb6man4 \xc3\xb6m2kl \xc3\xb64nal \xc3\xb62nom \xc3\xb6ns3ke \xc3\xb6n4so \xc3\xb6nst3r \xc3\xb63pe \xc3\xb64pel \xc3\xb63pi \xc3\xb6p5li \xc3\xb65plo 1\xc3\xb6ppn \xc3\xb64pr \xc3\xb63rande \xc3\xb63ras \xc3\xb64rask \xc3\xb6rb4 \xc3\xb6r3d4r \xc3\xb6r1eni \xc3\xb63res \xc3\xb64restr \xc3\xb63ret \xc3\xb6r5evig \xc3\xb6r3g \xc3\xb61ri \xc3\xb65rig \xc3\xb63ring \xc3\xb6r3int \xc3\xb6r5ir \xc3\xb6r5iv \xc3\xb6r4kal \xc3\xb6r1k2l \xc3\xb6r5kli \xc3\xb6r4nis \xc3\xb6r3ol \xc3\xb6r1or \xc3\xb6r2p5la \xc3\xb6r1s2k \xc3\xb6r3sl \xc3\xb6r4sl\xc3\xa4 \xc3\xb6r5te \xc3\xb6rt5s \xc3\xb6r1u \xc3\xb6r3vr \xc3\xb6r3y \xc3\xb6r1\xc3\xa4 \xc3\xb6r\xc3\xb64d \xc3\xb62sak \xc3\xb6s3n \xc3\xb6s4sj \xc3\xb6s2sk \xc3\xb6s4sp \xc3\xb6s3ta \xc3\xb6st3v \xc3\xb62tak \xc3\xb6ts5ko \xc3\xb6t4st \xc3\xb61v \xc3\xb6ve4 \xc3\xb6ver1 5\xc3\xb6vere \xc3\xb62vj \xc3\xb6v3ra \xc3\xb6v3ri \xc3\xb6v4sk \xc3\xa93e"; + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/progbar.css b/application/third_party/mpdf/progbar.css new file mode 100644 index 0000000..c370e61 --- /dev/null +++ b/application/third_party/mpdf/progbar.css @@ -0,0 +1,66 @@ +body { + margin : 0 auto; + width:100%; + font-family: "Verdana"; + color: #40454b; + font-size: 12px; + text-align:center; +} +.main { + width:540px; + margin: 0 auto; + text-align:left; +} +.heading { + font-size:14px; + font-weight:bold; + color:#CC0000; + padding:5px; + margin-left:10px; + border-bottom:solid; + border-bottom-width:1px; + border-bottom-color:#333333; + /* Use this to suppress the horizontal line under the heading */ + /* border-bottom: 0px solid #000000; */ +} +table { + font-family: "Verdana"; + color: #40454b; + font-size: 12px; +} +.demo { + margin : 0 auto; + width:100%; + margin:20px; + /* Use this to suppress all the bars and text */ + /* display: none; */ +} +td { + vertical-align: top; + padding: 0 0.5em 0 0; +} +.code { + font-family: "Courier New", Courier, monospace; + font-size: 10px; +} +.code2 { + font-family: "Courier New", Courier, monospace; + font-size: 11px; font-weight: bold; color: red; +} +.barheading { + color:#006600; + font-weight:bold; +} +.progressBar { + border: 1px solid #000000; + background-color: #EEEEEE; + width: 200px; + font-size: 6px; +} +.innerBar { + background-color:#00CC00; + width: 0%; +} +#box3 { + font-weight: bold; +} diff --git a/application/third_party/mpdf/ttfontdata/dejavusanscondensed.cw.dat b/application/third_party/mpdf/ttfontdata/dejavusanscondensed.cw.dat new file mode 100644 index 0000000..a748b9a Binary files /dev/null and b/application/third_party/mpdf/ttfontdata/dejavusanscondensed.cw.dat differ diff --git a/application/third_party/mpdf/ttfontdata/dejavusanscondensed.cw127.php b/application/third_party/mpdf/ttfontdata/dejavusanscondensed.cw127.php new file mode 100644 index 0000000..85a2fa0 --- /dev/null +++ b/application/third_party/mpdf/ttfontdata/dejavusanscondensed.cw127.php @@ -0,0 +1,163 @@ +<?php +$rangeid=122; +$prevcid=126; +$prevwidth=754; +$interval=false; +$range=array ( + 32 => + array ( + 0 => 286, + 1 => 360, + 2 => 414, + 3 => 754, + 4 => 572, + 5 => 855, + 6 => 702, + 7 => 247, + ), + 40 => + array ( + 0 => 351, + 1 => 351, + 'interval' => true, + ), + 42 => + array ( + 0 => 450, + 1 => 754, + 2 => 286, + 3 => 325, + 4 => 286, + 5 => 303, + ), + 48 => + array ( + 0 => 572, + 1 => 572, + 'interval' => true, + 2 => 572, + 3 => 572, + 4 => 572, + 5 => 572, + 6 => 572, + 7 => 572, + 8 => 572, + 9 => 572, + ), + 58 => + array ( + 0 => 303, + 1 => 303, + 'interval' => true, + ), + 60 => + array ( + 0 => 754, + 1 => 754, + 'interval' => true, + 2 => 754, + ), + 63 => + array ( + 0 => 478, + 1 => 900, + 2 => 615, + 3 => 617, + 4 => 628, + 5 => 693, + 6 => 568, + 7 => 518, + 8 => 697, + 9 => 677, + ), + 73 => + array ( + 0 => 265, + 1 => 265, + 'interval' => true, + ), + 75 => + array ( + 0 => 590, + 1 => 501, + 2 => 776, + 3 => 673, + 4 => 708, + 5 => 542, + 6 => 708, + 7 => 625, + 8 => 571, + 9 => 549, + 10 => 659, + 11 => 615, + 12 => 890, + 13 => 616, + 14 => 549, + 15 => 616, + 16 => 351, + 17 => 303, + 18 => 351, + 19 => 754, + ), + 95 => + array ( + 0 => 450, + 1 => 450, + 'interval' => true, + ), + 97 => + array ( + 0 => 551, + 1 => 571, + 2 => 495, + 3 => 571, + 4 => 554, + 5 => 316, + 6 => 571, + 7 => 570, + ), + 105 => + array ( + 0 => 250, + 1 => 250, + 'interval' => true, + ), + 107 => + array ( + 0 => 521, + 1 => 250, + 2 => 876, + 3 => 570, + 4 => 550, + ), + 112 => + array ( + 0 => 571, + 1 => 571, + 'interval' => true, + ), + 114 => + array ( + 0 => 370, + 1 => 469, + 2 => 353, + 3 => 570, + 4 => 532, + 5 => 736, + ), + 120 => + array ( + 0 => 532, + 1 => 532, + 'interval' => true, + ), + 122 => + array ( + 0 => 472, + 1 => 572, + 2 => 303, + 3 => 572, + 4 => 754, + ), +); +?> \ No newline at end of file diff --git a/application/third_party/mpdf/ttfontdata/dejavusanscondensed.mtx.php b/application/third_party/mpdf/ttfontdata/dejavusanscondensed.mtx.php new file mode 100644 index 0000000..e145941 --- /dev/null +++ b/application/third_party/mpdf/ttfontdata/dejavusanscondensed.mtx.php @@ -0,0 +1,26 @@ +<?php +$name='DejaVuSansCondensed'; +$type='TTF'; +$desc=array ( + 'Ascent' => 928, + 'Descent' => -236, + 'CapHeight' => 928, + 'Flags' => 4, + 'FontBBox' => '[-918 -415 1513 1167]', + 'ItalicAngle' => 0, + 'StemV' => 87, + 'MissingWidth' => 540, +); +$up=-63; +$ut=44; +$ttffile='D:/xampp/htdocs/legalbrokers/application/third_party/mpdf/ttfonts/DejaVuSansCondensed.ttf'; +$TTCfontID='0'; +$originalsize=555944; +$sip=false; +$smp=false; +$BMPselected=true; +$fontkey='dejavusanscondensed'; +$panose=' 0 0 2 b 6 6 3 8 4 2 2 4'; +$haskerninfo=false; +$unAGlyphs=false; +?> \ No newline at end of file diff --git a/application/third_party/mpdf/ttfontdata/dejavusanscondensedB.cw.dat b/application/third_party/mpdf/ttfontdata/dejavusanscondensedB.cw.dat new file mode 100644 index 0000000..a24fd29 Binary files /dev/null and b/application/third_party/mpdf/ttfontdata/dejavusanscondensedB.cw.dat differ diff --git a/application/third_party/mpdf/ttfontdata/dejavusanscondensedB.cw127.php b/application/third_party/mpdf/ttfontdata/dejavusanscondensedB.cw127.php new file mode 100644 index 0000000..d9e4103 --- /dev/null +++ b/application/third_party/mpdf/ttfontdata/dejavusanscondensedB.cw127.php @@ -0,0 +1,163 @@ +<?php +$rangeid=114; +$prevcid=126; +$prevwidth=754; +$interval=false; +$range=array ( + 32 => + array ( + 0 => 313, + 1 => 410, + 2 => 469, + 3 => 754, + 4 => 626, + 5 => 901, + 6 => 785, + 7 => 275, + ), + 40 => + array ( + 0 => 411, + 1 => 411, + 'interval' => true, + ), + 42 => + array ( + 0 => 470, + 1 => 754, + 2 => 342, + 3 => 374, + 4 => 342, + 5 => 329, + ), + 48 => + array ( + 0 => 626, + 1 => 626, + 'interval' => true, + 2 => 626, + 3 => 626, + 4 => 626, + 5 => 626, + 6 => 626, + 7 => 626, + 8 => 626, + 9 => 626, + ), + 58 => + array ( + 0 => 360, + 1 => 360, + 'interval' => true, + ), + 60 => + array ( + 0 => 754, + 1 => 754, + 'interval' => true, + 2 => 754, + ), + 63 => + array ( + 0 => 522, + 1 => 900, + 2 => 696, + 3 => 686, + 4 => 660, + 5 => 747, + ), + 69 => + array ( + 0 => 615, + 1 => 615, + 'interval' => true, + ), + 71 => + array ( + 0 => 738, + 1 => 753, + ), + 73 => + array ( + 0 => 334, + 1 => 334, + 'interval' => true, + ), + 75 => + array ( + 0 => 697, + 1 => 573, + 2 => 896, + 3 => 753, + 4 => 765, + 5 => 659, + 6 => 765, + 7 => 693, + 8 => 648, + 9 => 614, + 10 => 730, + 11 => 696, + 12 => 993, + 13 => 694, + 14 => 651, + 15 => 652, + 16 => 411, + 17 => 329, + 18 => 411, + 19 => 754, + ), + 95 => + array ( + 0 => 450, + 1 => 450, + 'interval' => true, + ), + 97 => + array ( + 0 => 607, + 1 => 644, + 2 => 533, + 3 => 644, + 4 => 610, + 5 => 391, + 6 => 644, + 7 => 641, + ), + 105 => + array ( + 0 => 308, + 1 => 308, + 'interval' => true, + ), + 107 => + array ( + 0 => 598, + 1 => 308, + 2 => 938, + 3 => 641, + 4 => 618, + ), + 112 => + array ( + 0 => 644, + 1 => 644, + 'interval' => true, + ), + 114 => + array ( + 0 => 444, + 1 => 536, + 2 => 430, + 3 => 641, + 4 => 586, + 5 => 831, + 6 => 580, + 7 => 586, + 8 => 523, + 9 => 641, + 10 => 329, + 11 => 641, + 12 => 754, + ), +); +?> \ No newline at end of file diff --git a/application/third_party/mpdf/ttfontdata/dejavusanscondensedB.mtx.php b/application/third_party/mpdf/ttfontdata/dejavusanscondensedB.mtx.php new file mode 100644 index 0000000..7855b06 --- /dev/null +++ b/application/third_party/mpdf/ttfontdata/dejavusanscondensedB.mtx.php @@ -0,0 +1,26 @@ +<?php +$name='DejaVuSansCondensed-Bold'; +$type='TTF'; +$desc=array ( + 'Ascent' => 928, + 'Descent' => -236, + 'CapHeight' => 928, + 'Flags' => 262148, + 'FontBBox' => '[-962 -415 1778 1174]', + 'ItalicAngle' => 0, + 'StemV' => 165, + 'MissingWidth' => 540, +); +$up=-63; +$ut=44; +$ttffile='D:/xampp/htdocs/wbt/application/libraries/mpdf/ttfonts/DejaVuSansCondensed-Bold.ttf'; +$TTCfontID='0'; +$originalsize=545712; +$sip=false; +$smp=false; +$BMPselected=true; +$fontkey='dejavusanscondensedB'; +$panose=' 0 0 2 b 8 6 3 6 4 2 2 4'; +$haskerninfo=false; +$unAGlyphs=false; +?> \ No newline at end of file diff --git a/application/third_party/mpdf/ttfontdata/dejavuserifcondensed.cw.dat b/application/third_party/mpdf/ttfontdata/dejavuserifcondensed.cw.dat new file mode 100644 index 0000000..c5a60d9 Binary files /dev/null and b/application/third_party/mpdf/ttfontdata/dejavuserifcondensed.cw.dat differ diff --git a/application/third_party/mpdf/ttfontdata/dejavuserifcondensed.cw127.php b/application/third_party/mpdf/ttfontdata/dejavuserifcondensed.cw127.php new file mode 100644 index 0000000..645fe71 --- /dev/null +++ b/application/third_party/mpdf/ttfontdata/dejavuserifcondensed.cw127.php @@ -0,0 +1,142 @@ +<?php +$rangeid=114; +$prevcid=126; +$prevwidth=754; +$interval=false; +$range=array ( + 32 => + array ( + 0 => 286, + 1 => 361, + 2 => 414, + 3 => 754, + 4 => 572, + 5 => 855, + 6 => 801, + 7 => 247, + ), + 40 => + array ( + 0 => 351, + 1 => 351, + 'interval' => true, + ), + 42 => + array ( + 0 => 450, + 1 => 754, + 2 => 286, + 3 => 304, + 4 => 286, + 5 => 303, + ), + 48 => + array ( + 0 => 572, + 1 => 572, + 'interval' => true, + 2 => 572, + 3 => 572, + 4 => 572, + 5 => 572, + 6 => 572, + 7 => 572, + 8 => 572, + 9 => 572, + ), + 58 => + array ( + 0 => 303, + 1 => 303, + 'interval' => true, + ), + 60 => + array ( + 0 => 754, + 1 => 754, + 'interval' => true, + 2 => 754, + ), + 63 => + array ( + 0 => 482, + 1 => 900, + 2 => 650, + 3 => 661, + 4 => 688, + 5 => 721, + 6 => 657, + 7 => 624, + 8 => 719, + 9 => 785, + 10 => 355, + 11 => 360, + 12 => 672, + 13 => 598, + 14 => 921, + 15 => 787, + 16 => 738, + 17 => 605, + 18 => 738, + 19 => 677, + 20 => 616, + 21 => 600, + 22 => 758, + 23 => 650, + 24 => 925, + 25 => 641, + 26 => 594, + 27 => 625, + 28 => 351, + 29 => 303, + 30 => 351, + 31 => 754, + ), + 95 => + array ( + 0 => 450, + 1 => 450, + 'interval' => true, + ), + 97 => + array ( + 0 => 536, + 1 => 576, + 2 => 504, + 3 => 576, + 4 => 532, + 5 => 333, + 6 => 576, + 7 => 580, + 8 => 288, + 9 => 279, + 10 => 545, + 11 => 288, + 12 => 853, + 13 => 580, + 14 => 542, + ), + 112 => + array ( + 0 => 576, + 1 => 576, + 'interval' => true, + ), + 114 => + array ( + 0 => 430, + 1 => 461, + 2 => 361, + 3 => 580, + 4 => 508, + 5 => 770, + 6 => 507, + 7 => 508, + 8 => 474, + 9 => 572, + 10 => 303, + 11 => 572, + 12 => 754, + ), +); +?> \ No newline at end of file diff --git a/application/third_party/mpdf/ttfontdata/dejavuserifcondensed.mtx.php b/application/third_party/mpdf/ttfontdata/dejavuserifcondensed.mtx.php new file mode 100644 index 0000000..82a9eb6 --- /dev/null +++ b/application/third_party/mpdf/ttfontdata/dejavuserifcondensed.mtx.php @@ -0,0 +1,26 @@ +<?php +$name='DejaVuSerifCondensed'; +$type='TTF'; +$desc=array ( + 'Ascent' => 928, + 'Descent' => -236, + 'CapHeight' => 928, + 'Flags' => 4, + 'FontBBox' => '[-693 -347 1512 1242]', + 'ItalicAngle' => 0, + 'StemV' => 87, + 'MissingWidth' => 540, +); +$up=-63; +$ut=44; +$ttffile='D:/xampp/htdocs/jib_test/application/libraries/mpdf/ttfonts/DejaVuSerifCondensed.ttf'; +$TTCfontID='0'; +$originalsize=296976; +$sip=false; +$smp=false; +$BMPselected=true; +$fontkey='dejavuserifcondensed'; +$panose=' 0 0 2 6 6 6 5 6 5 2 2 4'; +$haskerninfo=false; +$unAGlyphs=false; +?> \ No newline at end of file diff --git a/application/third_party/mpdf/ttfontdata/dejavuserifcondensedB.cw.dat b/application/third_party/mpdf/ttfontdata/dejavuserifcondensedB.cw.dat new file mode 100644 index 0000000..ac354dd Binary files /dev/null and b/application/third_party/mpdf/ttfontdata/dejavuserifcondensedB.cw.dat differ diff --git a/application/third_party/mpdf/ttfontdata/dejavuserifcondensedB.cw127.php b/application/third_party/mpdf/ttfontdata/dejavuserifcondensedB.cw127.php new file mode 100644 index 0000000..879da00 --- /dev/null +++ b/application/third_party/mpdf/ttfontdata/dejavuserifcondensedB.cw127.php @@ -0,0 +1,142 @@ +<?php +$rangeid=114; +$prevcid=126; +$prevwidth=754; +$interval=false; +$range=array ( + 32 => + array ( + 0 => 313, + 1 => 395, + 2 => 469, + 3 => 754, + 4 => 626, + 5 => 855, + 6 => 813, + 7 => 275, + ), + 40 => + array ( + 0 => 426, + 1 => 426, + 'interval' => true, + ), + 42 => + array ( + 0 => 470, + 1 => 754, + 2 => 313, + 3 => 374, + 4 => 313, + 5 => 329, + ), + 48 => + array ( + 0 => 626, + 1 => 626, + 'interval' => true, + 2 => 626, + 3 => 626, + 4 => 626, + 5 => 626, + 6 => 626, + 7 => 626, + 8 => 626, + 9 => 626, + ), + 58 => + array ( + 0 => 332, + 1 => 332, + 'interval' => true, + ), + 60 => + array ( + 0 => 754, + 1 => 754, + 'interval' => true, + 2 => 754, + ), + 63 => + array ( + 0 => 527, + 1 => 900, + 2 => 698, + 3 => 760, + 4 => 716, + 5 => 780, + 6 => 686, + 7 => 639, + 8 => 769, + 9 => 850, + 10 => 421, + 11 => 426, + 12 => 782, + 13 => 633, + 14 => 996, + 15 => 822, + 16 => 784, + 17 => 677, + 18 => 784, + 19 => 748, + 20 => 650, + 21 => 669, + 22 => 785, + 23 => 698, + 24 => 1011, + 25 => 698, + 26 => 642, + 27 => 657, + 28 => 426, + 29 => 329, + 30 => 426, + 31 => 754, + ), + 95 => + array ( + 0 => 450, + 1 => 450, + 'interval' => true, + ), + 97 => + array ( + 0 => 583, + 1 => 629, + 2 => 548, + 3 => 629, + 4 => 572, + 5 => 387, + 6 => 629, + 7 => 654, + 8 => 342, + 9 => 325, + 10 => 624, + 11 => 342, + 12 => 952, + 13 => 654, + 14 => 600, + ), + 112 => + array ( + 0 => 629, + 1 => 629, + 'interval' => true, + ), + 114 => + array ( + 0 => 474, + 1 => 506, + 2 => 416, + 3 => 654, + 4 => 523, + 5 => 774, + 6 => 536, + 7 => 523, + 8 => 511, + 9 => 579, + 10 => 327, + 11 => 579, + 12 => 754, + ), +); +?> \ No newline at end of file diff --git a/application/third_party/mpdf/ttfontdata/dejavuserifcondensedB.mtx.php b/application/third_party/mpdf/ttfontdata/dejavuserifcondensedB.mtx.php new file mode 100644 index 0000000..363c7d9 --- /dev/null +++ b/application/third_party/mpdf/ttfontdata/dejavuserifcondensedB.mtx.php @@ -0,0 +1,26 @@ +<?php +$name='DejaVuSerifCondensed-Bold'; +$type='TTF'; +$desc=array ( + 'Ascent' => 939, + 'Descent' => -236, + 'CapHeight' => 939, + 'Flags' => 262148, + 'FontBBox' => '[-752 -389 1617 1235]', + 'ItalicAngle' => 0, + 'StemV' => 165, + 'MissingWidth' => 540, +); +$up=-63; +$ut=44; +$ttffile='D:/xampp/htdocs/jib_test/application/libraries/mpdf/ttfonts/DejaVuSerifCondensed-Bold.ttf'; +$TTCfontID='0'; +$originalsize=283140; +$sip=false; +$smp=false; +$BMPselected=true; +$fontkey='dejavuserifcondensedB'; +$panose=' 0 0 2 6 8 6 5 6 5 2 2 4'; +$haskerninfo=false; +$unAGlyphs=false; +?> \ No newline at end of file diff --git a/application/third_party/mpdf/ttfontdata/dejavuserifcondensedBI.cw.dat b/application/third_party/mpdf/ttfontdata/dejavuserifcondensedBI.cw.dat new file mode 100644 index 0000000..515541f Binary files /dev/null and b/application/third_party/mpdf/ttfontdata/dejavuserifcondensedBI.cw.dat differ diff --git a/application/third_party/mpdf/ttfontdata/dejavuserifcondensedBI.mtx.php b/application/third_party/mpdf/ttfontdata/dejavuserifcondensedBI.mtx.php new file mode 100644 index 0000000..a86131d --- /dev/null +++ b/application/third_party/mpdf/ttfontdata/dejavuserifcondensedBI.mtx.php @@ -0,0 +1,26 @@ +<?php +$name='DejaVuSerifCondensed-BoldItalic'; +$type='TTF'; +$desc=array ( + 'Ascent' => 939, + 'Descent' => -236, + 'CapHeight' => 939, + 'Flags' => 262212, + 'FontBBox' => '[-815 -389 1579 1235]', + 'ItalicAngle' => -11, + 'StemV' => 165, + 'MissingWidth' => 540, +); +$up=-63; +$ut=44; +$ttffile='D:/xampp/htdocs/legalbrokers/application/third_party/mpdf/ttfonts/DejaVuSerifCondensed-BoldItalic.ttf'; +$TTCfontID='0'; +$originalsize=294584; +$sip=false; +$smp=false; +$BMPselected=true; +$fontkey='dejavuserifcondensedBI'; +$panose=' 0 0 2 6 8 6 5 3 5 b 2 4'; +$haskerninfo=false; +$unAGlyphs=false; +?> \ No newline at end of file diff --git a/application/third_party/mpdf/ttfontdata/dejavuserifcondensedI.cw.dat b/application/third_party/mpdf/ttfontdata/dejavuserifcondensedI.cw.dat new file mode 100644 index 0000000..2038a39 Binary files /dev/null and b/application/third_party/mpdf/ttfontdata/dejavuserifcondensedI.cw.dat differ diff --git a/application/third_party/mpdf/ttfontdata/dejavuserifcondensedI.mtx.php b/application/third_party/mpdf/ttfontdata/dejavuserifcondensedI.mtx.php new file mode 100644 index 0000000..505f2e5 --- /dev/null +++ b/application/third_party/mpdf/ttfontdata/dejavuserifcondensedI.mtx.php @@ -0,0 +1,26 @@ +<?php +$name='DejaVuSerifCondensed-Italic'; +$type='TTF'; +$desc=array ( + 'Ascent' => 928, + 'Descent' => -236, + 'CapHeight' => 928, + 'Flags' => 68, + 'FontBBox' => '[-755 -347 1480 1227]', + 'ItalicAngle' => -11, + 'StemV' => 87, + 'MissingWidth' => 540, +); +$up=-63; +$ut=44; +$ttffile='D:/xampp/htdocs/legalbrokers/application/third_party/mpdf/ttfonts/DejaVuSerifCondensed-Italic.ttf'; +$TTCfontID='0'; +$originalsize=302444; +$sip=false; +$smp=false; +$BMPselected=true; +$fontkey='dejavuserifcondensedI'; +$panose=' 0 0 2 6 6 6 5 3 5 b 2 4'; +$haskerninfo=false; +$unAGlyphs=false; +?> \ No newline at end of file diff --git a/application/third_party/mpdf/ttfontdata/dummy.txt b/application/third_party/mpdf/ttfontdata/dummy.txt new file mode 100644 index 0000000..8977335 --- /dev/null +++ b/application/third_party/mpdf/ttfontdata/dummy.txt @@ -0,0 +1,2 @@ +This is just a placeholder file so that the folder is created on install. +It can be deleted once installed. \ No newline at end of file diff --git a/application/third_party/mpdf/ttfonts/DejaVuSans-Bold.ttf b/application/third_party/mpdf/ttfonts/DejaVuSans-Bold.ttf new file mode 100644 index 0000000..7b29acc Binary files /dev/null and b/application/third_party/mpdf/ttfonts/DejaVuSans-Bold.ttf differ diff --git a/application/third_party/mpdf/ttfonts/DejaVuSans-BoldOblique.ttf b/application/third_party/mpdf/ttfonts/DejaVuSans-BoldOblique.ttf new file mode 100644 index 0000000..b5440d9 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/DejaVuSans-BoldOblique.ttf differ diff --git a/application/third_party/mpdf/ttfonts/DejaVuSans-Oblique.ttf b/application/third_party/mpdf/ttfonts/DejaVuSans-Oblique.ttf new file mode 100644 index 0000000..e233295 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/DejaVuSans-Oblique.ttf differ diff --git a/application/third_party/mpdf/ttfonts/DejaVuSans.ttf b/application/third_party/mpdf/ttfonts/DejaVuSans.ttf new file mode 100644 index 0000000..a36615b Binary files /dev/null and b/application/third_party/mpdf/ttfonts/DejaVuSans.ttf differ diff --git a/application/third_party/mpdf/ttfonts/DejaVuSansCondensed-Bold.ttf b/application/third_party/mpdf/ttfonts/DejaVuSansCondensed-Bold.ttf new file mode 100644 index 0000000..36b3060 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/DejaVuSansCondensed-Bold.ttf differ diff --git a/application/third_party/mpdf/ttfonts/DejaVuSansCondensed-BoldOblique.ttf b/application/third_party/mpdf/ttfonts/DejaVuSansCondensed-BoldOblique.ttf new file mode 100644 index 0000000..4bb3ae1 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/DejaVuSansCondensed-BoldOblique.ttf differ diff --git a/application/third_party/mpdf/ttfonts/DejaVuSansCondensed-Oblique.ttf b/application/third_party/mpdf/ttfonts/DejaVuSansCondensed-Oblique.ttf new file mode 100644 index 0000000..1f680bd Binary files /dev/null and b/application/third_party/mpdf/ttfonts/DejaVuSansCondensed-Oblique.ttf differ diff --git a/application/third_party/mpdf/ttfonts/DejaVuSansCondensed.ttf b/application/third_party/mpdf/ttfonts/DejaVuSansCondensed.ttf new file mode 100644 index 0000000..2b0b7fe Binary files /dev/null and b/application/third_party/mpdf/ttfonts/DejaVuSansCondensed.ttf differ diff --git a/application/third_party/mpdf/ttfonts/DejaVuSansMono-Bold.ttf b/application/third_party/mpdf/ttfonts/DejaVuSansMono-Bold.ttf new file mode 100644 index 0000000..98bb6f6 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/DejaVuSansMono-Bold.ttf differ diff --git a/application/third_party/mpdf/ttfonts/DejaVuSansMono-BoldOblique.ttf b/application/third_party/mpdf/ttfonts/DejaVuSansMono-BoldOblique.ttf new file mode 100644 index 0000000..42bbcde Binary files /dev/null and b/application/third_party/mpdf/ttfonts/DejaVuSansMono-BoldOblique.ttf differ diff --git a/application/third_party/mpdf/ttfonts/DejaVuSansMono-Oblique.ttf b/application/third_party/mpdf/ttfonts/DejaVuSansMono-Oblique.ttf new file mode 100644 index 0000000..d6ab522 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/DejaVuSansMono-Oblique.ttf differ diff --git a/application/third_party/mpdf/ttfonts/DejaVuSansMono.ttf b/application/third_party/mpdf/ttfonts/DejaVuSansMono.ttf new file mode 100644 index 0000000..b464c52 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/DejaVuSansMono.ttf differ diff --git a/application/third_party/mpdf/ttfonts/DejaVuSerif-Bold.ttf b/application/third_party/mpdf/ttfonts/DejaVuSerif-Bold.ttf new file mode 100644 index 0000000..8c53b1a Binary files /dev/null and b/application/third_party/mpdf/ttfonts/DejaVuSerif-Bold.ttf differ diff --git a/application/third_party/mpdf/ttfonts/DejaVuSerif-BoldItalic.ttf b/application/third_party/mpdf/ttfonts/DejaVuSerif-BoldItalic.ttf new file mode 100644 index 0000000..688c2b7 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/DejaVuSerif-BoldItalic.ttf differ diff --git a/application/third_party/mpdf/ttfonts/DejaVuSerif-Italic.ttf b/application/third_party/mpdf/ttfonts/DejaVuSerif-Italic.ttf new file mode 100644 index 0000000..b2ed04a Binary files /dev/null and b/application/third_party/mpdf/ttfonts/DejaVuSerif-Italic.ttf differ diff --git a/application/third_party/mpdf/ttfonts/DejaVuSerif.ttf b/application/third_party/mpdf/ttfonts/DejaVuSerif.ttf new file mode 100644 index 0000000..19eba33 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/DejaVuSerif.ttf differ diff --git a/application/third_party/mpdf/ttfonts/DejaVuSerifCondensed-Bold.ttf b/application/third_party/mpdf/ttfonts/DejaVuSerifCondensed-Bold.ttf new file mode 100644 index 0000000..c4b00b7 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/DejaVuSerifCondensed-Bold.ttf differ diff --git a/application/third_party/mpdf/ttfonts/DejaVuSerifCondensed-BoldItalic.ttf b/application/third_party/mpdf/ttfonts/DejaVuSerifCondensed-BoldItalic.ttf new file mode 100644 index 0000000..4d4c7a6 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/DejaVuSerifCondensed-BoldItalic.ttf differ diff --git a/application/third_party/mpdf/ttfonts/DejaVuSerifCondensed-Italic.ttf b/application/third_party/mpdf/ttfonts/DejaVuSerifCondensed-Italic.ttf new file mode 100644 index 0000000..04bfc35 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/DejaVuSerifCondensed-Italic.ttf differ diff --git a/application/third_party/mpdf/ttfonts/DejaVuSerifCondensed.ttf b/application/third_party/mpdf/ttfonts/DejaVuSerifCondensed.ttf new file mode 100644 index 0000000..c9935e1 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/DejaVuSerifCondensed.ttf differ diff --git a/application/third_party/mpdf/ttfonts/DejaVuinfo.txt b/application/third_party/mpdf/ttfonts/DejaVuinfo.txt new file mode 100644 index 0000000..3d7a7a1 --- /dev/null +++ b/application/third_party/mpdf/ttfonts/DejaVuinfo.txt @@ -0,0 +1,99 @@ +Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. +Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) + +Bitstream Vera Fonts Copyright +------------------------------ + +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is +a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of the fonts accompanying this license ("Fonts") and associated +documentation files (the "Font Software"), to reproduce and distribute the +Font Software, including without limitation the rights to use, copy, merge, +publish, distribute, and/or sell copies of the Font Software, and to permit +persons to whom the Font Software is furnished to do so, subject to the +following conditions: + +The above copyright and trademark notices and this permission notice shall +be included in all copies of one or more of the Font Software typefaces. + +The Font Software may be modified, altered, or added to, and in particular +the designs of glyphs or characters in the Fonts may be modified and +additional glyphs or characters may be added to the Fonts, only if the fonts +are renamed to names not containing either the words "Bitstream" or the word +"Vera". + +This License becomes null and void to the extent applicable to Fonts or Font +Software that has been modified and is distributed under the "Bitstream +Vera" names. + +The Font Software may be sold as part of a larger software package but no +copy of one or more of the Font Software typefaces may be sold by itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, +TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME +FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING +ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE +FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome +Foundation, and Bitstream Inc., shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this Font Software +without prior written authorization from the Gnome Foundation or Bitstream +Inc., respectively. For further information, contact: fonts at gnome dot +org. + +Arev Fonts Copyright +------------------------------ + +Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the fonts accompanying this license ("Fonts") and +associated documentation files (the "Font Software"), to reproduce +and distribute the modifications to the Bitstream Vera Font Software, +including without limitation the rights to use, copy, merge, publish, +distribute, and/or sell copies of the Font Software, and to permit +persons to whom the Font Software is furnished to do so, subject to +the following conditions: + +The above copyright and trademark notices and this permission notice +shall be included in all copies of one or more of the Font Software +typefaces. + +The Font Software may be modified, altered, or added to, and in +particular the designs of glyphs or characters in the Fonts may be +modified and additional glyphs or characters may be added to the +Fonts, only if the fonts are renamed to names not containing either +the words "Tavmjong Bah" or the word "Arev". + +This License becomes null and void to the extent applicable to Fonts +or Font Software that has been modified and is distributed under the +"Tavmjong Bah Arev" names. + +The Font Software may be sold as part of a larger software package but +no copy of one or more of the Font Software typefaces may be sold by +itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL +TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the name of Tavmjong Bah shall not +be used in advertising or otherwise to promote the sale, use or other +dealings in this Font Software without prior written authorization +from Tavmjong Bah. For further information, contact: tavmjong @ free +. fr. + +$Id: LICENSE 2133 2007-11-28 02:46:28Z lechimp $ diff --git a/application/third_party/mpdf/ttfonts/GNUFreeFontinfo.txt b/application/third_party/mpdf/ttfonts/GNUFreeFontinfo.txt new file mode 100644 index 0000000..2682647 --- /dev/null +++ b/application/third_party/mpdf/ttfonts/GNUFreeFontinfo.txt @@ -0,0 +1,108 @@ +-*-text-*- + GNU FreeFont + +The GNU FreeFont project aims to provide a useful set of free scalable +(i.e., OpenType) fonts covering as much as possible of the ISO 10646/Unicode +UCS (Universal Character Set). + +Statement of Purpose +-------------------- + +The practical reason for putting glyphs together in a single font face is +to conveniently mix symbols and characters from different writing systems, +without having to switch fonts. + +Coverage +-------- + +FreeFont covers the following character sets + +* ISO 8859 parts 1-15 +* CEN MES-3 European Unicode Subset + http://www.evertype.com/standards/iso10646/pdf/cwa13873.pdf +* IBM/Microsoft code pages 437, 850, 852, 1250, 1252 and more +* Microsoft/Adobe Windows Glyph List 4 (WGL4) + http://www.microsoft.com/typography/otspec/WGL4.htm +* KOI8-R and KOI8-RU +* DEC VT100 graphics symbols +* International Phonetic Alphabet +* Arabic, Hebrew, Armenian, Georgian, Ethiopian and Thai alphabets, + including Arabic presentation forms A/B +* mathematical symbols, including the whole TeX repertoire of symbols +* APL symbols + etc. + +Editing +------- + +The free outline font editor, George Williams's FontForge +<http://fontforge.sourceforge.net/> is used for editing the fonts. + +Design Issues +------------- + +Which font shapes should be made? Historical style terms like Renaissance +or Baroque letterforms cannot be applied beyond Latin/Cyrillic/Greek +scripts to any greater extent than Kufi or Nashki can be applied beyond +Arabic script; "italic" is really only meaningful for Latin letters. + +However, most modern writing systems have typographic formulations for +contrasting uniform and modulated character stroke widths, and have some +history with "oblique", faces. Since the advent of the typewriter, most +have developed a typographic style with uniform-width characters. + +Accordingly, the FreeFont family has one monospaced - FreeMono - and two +proportional faces (one with uniform stroke - FreeSans - and one with +modulated stroke - FreeSerif). + +To make text from different writing systems look good side-by-side, each +FreeFont face is meant to contain characters of similar style and weight. + +Licensing +--------- + +Free UCS scalable fonts is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +The fonts are distributed in the hope that they will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +As a special exception, if you create a document which uses this font, and +embed this font or unaltered portions of this font into the document, this +font does not by itself cause the resulting document to be covered by the +GNU General Public License. This exception does not however invalidate any +other reasons why the document might be covered by the GNU General Public +License. If you modify this font, you may extend this exception to your +version of the font, but you are not obligated to do so. If you do not +wish to do so, delete this exception statement from your version. + + +Files and their suffixes +------------------------ + +The files with .sfd (Spline Font Database) are in FontForge's native format. +Please use these if you plan to modify the font files. + +TrueType fonts for immediate consumption are the files with the .ttf +(TrueType Font) suffix. These are ready to use in Xwindows based +systems using FreeType, on Mac OS, and on older Windows systems. + +OpenType fonts (with suffix .otf) are for use in Windows Vista. +Note that although they can be installed on Linux, but many applications +in Linux still don't support them. + + +-------------------------------------------------------------------------- +Primoz Peterlin, <primoz.peterlin@biofiz.mf.uni-lj.si> +Steve White <stevan.white@googlemail.com> + +Free UCS scalable fonts: http://savannah.gnu.org/projects/freefont/ +$Id: README,v 1.6 2008/12/25 12:51:41 Stevan_White Exp $ diff --git a/application/third_party/mpdf/ttfonts/Garuda-Bold.ttf b/application/third_party/mpdf/ttfonts/Garuda-Bold.ttf new file mode 100644 index 0000000..c2aa87e Binary files /dev/null and b/application/third_party/mpdf/ttfonts/Garuda-Bold.ttf differ diff --git a/application/third_party/mpdf/ttfonts/Garuda-BoldOblique.ttf b/application/third_party/mpdf/ttfonts/Garuda-BoldOblique.ttf new file mode 100644 index 0000000..889be70 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/Garuda-BoldOblique.ttf differ diff --git a/application/third_party/mpdf/ttfonts/Garuda-Oblique.ttf b/application/third_party/mpdf/ttfonts/Garuda-Oblique.ttf new file mode 100644 index 0000000..7d12199 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/Garuda-Oblique.ttf differ diff --git a/application/third_party/mpdf/ttfonts/Garuda.ttf b/application/third_party/mpdf/ttfonts/Garuda.ttf new file mode 100644 index 0000000..b9fcdfd Binary files /dev/null and b/application/third_party/mpdf/ttfonts/Garuda.ttf differ diff --git a/application/third_party/mpdf/ttfonts/Norasi-Bold.ttf b/application/third_party/mpdf/ttfonts/Norasi-Bold.ttf new file mode 100644 index 0000000..6c241fa Binary files /dev/null and b/application/third_party/mpdf/ttfonts/Norasi-Bold.ttf differ diff --git a/application/third_party/mpdf/ttfonts/Norasi-BoldOblique.ttf b/application/third_party/mpdf/ttfonts/Norasi-BoldOblique.ttf new file mode 100644 index 0000000..70d0417 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/Norasi-BoldOblique.ttf differ diff --git a/application/third_party/mpdf/ttfonts/Norasi-Oblique.ttf b/application/third_party/mpdf/ttfonts/Norasi-Oblique.ttf new file mode 100644 index 0000000..54e19b0 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/Norasi-Oblique.ttf differ diff --git a/application/third_party/mpdf/ttfonts/Norasi.ttf b/application/third_party/mpdf/ttfonts/Norasi.ttf new file mode 100644 index 0000000..ec9e549 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/Norasi.ttf differ diff --git a/application/third_party/mpdf/ttfonts/Thai Fonts License.txt b/application/third_party/mpdf/ttfonts/Thai Fonts License.txt new file mode 100644 index 0000000..c20d462 --- /dev/null +++ b/application/third_party/mpdf/ttfonts/Thai Fonts License.txt @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/application/third_party/mpdf/ttfonts/XB Riyaz.ttf b/application/third_party/mpdf/ttfonts/XB Riyaz.ttf new file mode 100644 index 0000000..80e1580 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/XB Riyaz.ttf differ diff --git a/application/third_party/mpdf/ttfonts/XB RiyazBd.ttf b/application/third_party/mpdf/ttfonts/XB RiyazBd.ttf new file mode 100644 index 0000000..e6cf58f Binary files /dev/null and b/application/third_party/mpdf/ttfonts/XB RiyazBd.ttf differ diff --git a/application/third_party/mpdf/ttfonts/XB RiyazBdIt.ttf b/application/third_party/mpdf/ttfonts/XB RiyazBdIt.ttf new file mode 100644 index 0000000..19fba78 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/XB RiyazBdIt.ttf differ diff --git a/application/third_party/mpdf/ttfonts/XB RiyazIt.ttf b/application/third_party/mpdf/ttfonts/XB RiyazIt.ttf new file mode 100644 index 0000000..cc9cc3a Binary files /dev/null and b/application/third_party/mpdf/ttfonts/XB RiyazIt.ttf differ diff --git a/application/third_party/mpdf/ttfonts/XB Zar Bd.ttf b/application/third_party/mpdf/ttfonts/XB Zar Bd.ttf new file mode 100644 index 0000000..52a2e38 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/XB Zar Bd.ttf differ diff --git a/application/third_party/mpdf/ttfonts/XB Zar BdIt.ttf b/application/third_party/mpdf/ttfonts/XB Zar BdIt.ttf new file mode 100644 index 0000000..a7f19d9 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/XB Zar BdIt.ttf differ diff --git a/application/third_party/mpdf/ttfonts/XB Zar It.ttf b/application/third_party/mpdf/ttfonts/XB Zar It.ttf new file mode 100644 index 0000000..4365d1d Binary files /dev/null and b/application/third_party/mpdf/ttfonts/XB Zar It.ttf differ diff --git a/application/third_party/mpdf/ttfonts/XB Zar.ttf b/application/third_party/mpdf/ttfonts/XB Zar.ttf new file mode 100644 index 0000000..7a168b6 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/XB Zar.ttf differ diff --git a/application/third_party/mpdf/ttfonts/XW Zar Font Info.txt b/application/third_party/mpdf/ttfonts/XW Zar Font Info.txt new file mode 100644 index 0000000..ab214f4 --- /dev/null +++ b/application/third_party/mpdf/ttfonts/XW Zar Font Info.txt @@ -0,0 +1,92 @@ + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/application/third_party/mpdf/ttfonts/ind_bn_1_001.ttf b/application/third_party/mpdf/ttfonts/ind_bn_1_001.ttf new file mode 100644 index 0000000..893ab7e Binary files /dev/null and b/application/third_party/mpdf/ttfonts/ind_bn_1_001.ttf differ diff --git a/application/third_party/mpdf/ttfonts/ind_gu_1_001.ttf b/application/third_party/mpdf/ttfonts/ind_gu_1_001.ttf new file mode 100644 index 0000000..20ccb60 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/ind_gu_1_001.ttf differ diff --git a/application/third_party/mpdf/ttfonts/ind_hi_1_001.ttf b/application/third_party/mpdf/ttfonts/ind_hi_1_001.ttf new file mode 100644 index 0000000..1f62e32 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/ind_hi_1_001.ttf differ diff --git a/application/third_party/mpdf/ttfonts/ind_kn_1_001.ttf b/application/third_party/mpdf/ttfonts/ind_kn_1_001.ttf new file mode 100644 index 0000000..2fd1b1b Binary files /dev/null and b/application/third_party/mpdf/ttfonts/ind_kn_1_001.ttf differ diff --git a/application/third_party/mpdf/ttfonts/ind_ml_1_001.ttf b/application/third_party/mpdf/ttfonts/ind_ml_1_001.ttf new file mode 100644 index 0000000..bd78fb3 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/ind_ml_1_001.ttf differ diff --git a/application/third_party/mpdf/ttfonts/ind_or_1_001.ttf b/application/third_party/mpdf/ttfonts/ind_or_1_001.ttf new file mode 100644 index 0000000..56bd422 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/ind_or_1_001.ttf differ diff --git a/application/third_party/mpdf/ttfonts/ind_pa_1_001.ttf b/application/third_party/mpdf/ttfonts/ind_pa_1_001.ttf new file mode 100644 index 0000000..b10436a Binary files /dev/null and b/application/third_party/mpdf/ttfonts/ind_pa_1_001.ttf differ diff --git a/application/third_party/mpdf/ttfonts/ind_ta_1_001.ttf b/application/third_party/mpdf/ttfonts/ind_ta_1_001.ttf new file mode 100644 index 0000000..fa18c96 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/ind_ta_1_001.ttf differ diff --git a/application/third_party/mpdf/ttfonts/ind_te_1_001.ttf b/application/third_party/mpdf/ttfonts/ind_te_1_001.ttf new file mode 100644 index 0000000..ae641e2 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/ind_te_1_001.ttf differ diff --git a/application/third_party/mpdf/ttfonts/ocrb10.ttf b/application/third_party/mpdf/ttfonts/ocrb10.ttf new file mode 100644 index 0000000..34980b8 Binary files /dev/null and b/application/third_party/mpdf/ttfonts/ocrb10.ttf differ diff --git a/application/third_party/mpdf/ttfonts/ocrbinfo.txt b/application/third_party/mpdf/ttfonts/ocrbinfo.txt new file mode 100644 index 0000000..026cbe7 --- /dev/null +++ b/application/third_party/mpdf/ttfonts/ocrbinfo.txt @@ -0,0 +1,60 @@ +Mostly-free OCR B + +This font is used in UPC bar code symbols, including the ISBN symbols on +most published books. + +A freely distributable version seems to be sorely needed. Until now, it's +been very difficult to find the font in computer-usable format except by +paying a high fee to a commercial font vendor. Even many serious commercial +publishers have so much trouble getting it right that they just go ahead and +use Helvetica instead, or even (shudder) Arial. Since the OCR B font is +required by an international standard, it seems like it ought to be free. +So here it is. The font in this package is not a "ripped", pirated, or +shadily reverse engineered version; every effort has been made to ensure +that it genuinely derives from free sources and all the creators involved +have actually intended it for free public use. + +Converted by Matthew Skala from Metafont format to Postscript and TrueType +formats, July 28, 2006, using mftrace 1.2.4 by Paul Vojta, which is +available from + http://www.xs4all.nl/~hanwen/mftrace/ +and Autotrace 0.31.1 available from + http://autotrace.sourceforge.net/ + +The Metafont files (not included - see notes below) were coded by Norbert +Schwarz in the 1980s, based on German standards documents. He has attached +a notice, notably not actually claiming any copyright - see the file +"ocrbinfo" - saying that the fonts are "given to free non commercial use", +but commenting that he is only free to grant rights to his own work on the +digitization, because he did not design the original letter forms. He +suggests that there may be other copyright claims attached to the letter +forms themselves, which Schwarz credits as being originally designed by +"Adam Frutiger" [sic], almost certainly a mistake for Adrian Frutiger. My +(Matthew Skala's) understanding of copyright law, at least in the USA and +Canada, is that in fact typefaces per se cannot be subject to copyright +claims, so the software embodiment is the only thing subject to copyright +and Schwarz's release makes it available for whatever "non commercial use" +means. + +To avoid muddying the waters further, any copyright claims by Matthew Skala +on these files are hereby released to the public domain. I'd like for these +fonts to be freely usable even in marginally commercial applications, such +as to generate UPC labels for books that will be sold for profit, but it may +not be within my power to grant that myself because I didn't write the +Metafont files although I did do considerable, and probably copyrightable, +work on the translation to Postscript and TrueType. It was *not* a purely +automated process; try using the tools I used and see how far you get +without human editing! I'd also like for these fonts (the fonts themselves +as opposed to documents made with them) not to be sold, not even indirectly +by those Web sites that advertise "free downloads" but make it difficult to +actually download fonts without paying a fee. + +NOTE: This ZIP archive is a stripped-down version containing just the +essential files for using the main OCR B font on most systems. If you want +the much larger complete package, which contains Metafont sources and several +variant fonts (reverse-video, outline, and slanted), look for a ZIP archive +called ocrb-complete.zip wherever you found this one. + +Matthew Skala +mskala@ansuz.sooke.bc.ca +http://ansuz.sooke.bc.ca/ diff --git a/application/third_party/mpdf/utils/UnicodeData.txt b/application/third_party/mpdf/utils/UnicodeData.txt new file mode 100644 index 0000000..3da6aca --- /dev/null +++ b/application/third_party/mpdf/utils/UnicodeData.txt @@ -0,0 +1,21488 @@ +0000;<control>;Cc;0;BN;;;;;N;NULL;;;; +0001;<control>;Cc;0;BN;;;;;N;START OF HEADING;;;; +0002;<control>;Cc;0;BN;;;;;N;START OF TEXT;;;; +0003;<control>;Cc;0;BN;;;;;N;END OF TEXT;;;; +0004;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION;;;; +0005;<control>;Cc;0;BN;;;;;N;ENQUIRY;;;; +0006;<control>;Cc;0;BN;;;;;N;ACKNOWLEDGE;;;; +0007;<control>;Cc;0;BN;;;;;N;BELL;;;; +0008;<control>;Cc;0;BN;;;;;N;BACKSPACE;;;; +0009;<control>;Cc;0;S;;;;;N;CHARACTER TABULATION;;;; +000A;<control>;Cc;0;B;;;;;N;LINE FEED (LF);;;; +000B;<control>;Cc;0;S;;;;;N;LINE TABULATION;;;; +000C;<control>;Cc;0;WS;;;;;N;FORM FEED (FF);;;; +000D;<control>;Cc;0;B;;;;;N;CARRIAGE RETURN (CR);;;; +000E;<control>;Cc;0;BN;;;;;N;SHIFT OUT;;;; +000F;<control>;Cc;0;BN;;;;;N;SHIFT IN;;;; +0010;<control>;Cc;0;BN;;;;;N;DATA LINK ESCAPE;;;; +0011;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL ONE;;;; +0012;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL TWO;;;; +0013;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL THREE;;;; +0014;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL FOUR;;;; +0015;<control>;Cc;0;BN;;;;;N;NEGATIVE ACKNOWLEDGE;;;; +0016;<control>;Cc;0;BN;;;;;N;SYNCHRONOUS IDLE;;;; +0017;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION BLOCK;;;; +0018;<control>;Cc;0;BN;;;;;N;CANCEL;;;; +0019;<control>;Cc;0;BN;;;;;N;END OF MEDIUM;;;; +001A;<control>;Cc;0;BN;;;;;N;SUBSTITUTE;;;; +001B;<control>;Cc;0;BN;;;;;N;ESCAPE;;;; +001C;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR FOUR;;;; +001D;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR THREE;;;; +001E;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR TWO;;;; +001F;<control>;Cc;0;S;;;;;N;INFORMATION SEPARATOR ONE;;;; +0020;SPACE;Zs;0;WS;;;;;N;;;;; +0021;EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +0022;QUOTATION MARK;Po;0;ON;;;;;N;;;;; +0023;NUMBER SIGN;Po;0;ET;;;;;N;;;;; +0024;DOLLAR SIGN;Sc;0;ET;;;;;N;;;;; +0025;PERCENT SIGN;Po;0;ET;;;;;N;;;;; +0026;AMPERSAND;Po;0;ON;;;;;N;;;;; +0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;; +0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;; +0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;; +002A;ASTERISK;Po;0;ON;;;;;N;;;;; +002B;PLUS SIGN;Sm;0;ES;;;;;N;;;;; +002C;COMMA;Po;0;CS;;;;;N;;;;; +002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;; +002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;; +002F;SOLIDUS;Po;0;CS;;;;;N;SLASH;;;; +0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;; +0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;; +0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;; +0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;; +0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;; +0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;; +0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;; +0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;; +0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;; +0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;; +003A;COLON;Po;0;CS;;;;;N;;;;; +003B;SEMICOLON;Po;0;ON;;;;;N;;;;; +003C;LESS-THAN SIGN;Sm;0;ON;;;;;Y;;;;; +003D;EQUALS SIGN;Sm;0;ON;;;;;N;;;;; +003E;GREATER-THAN SIGN;Sm;0;ON;;;;;Y;;;;; +003F;QUESTION MARK;Po;0;ON;;;;;N;;;;; +0040;COMMERCIAL AT;Po;0;ON;;;;;N;;;;; +0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061; +0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062; +0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063; +0044;LATIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;0064; +0045;LATIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;0065; +0046;LATIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;0066; +0047;LATIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;0067; +0048;LATIN CAPITAL LETTER H;Lu;0;L;;;;;N;;;;0068; +0049;LATIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;0069; +004A;LATIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;006A; +004B;LATIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;006B; +004C;LATIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;006C; +004D;LATIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;006D; +004E;LATIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;006E; +004F;LATIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;006F; +0050;LATIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;0070; +0051;LATIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;0071; +0052;LATIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;0072; +0053;LATIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;0073; +0054;LATIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;0074; +0055;LATIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0075; +0056;LATIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;0076; +0057;LATIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;0077; +0058;LATIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;0078; +0059;LATIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;0079; +005A;LATIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;007A; +005B;LEFT SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING SQUARE BRACKET;;;; +005C;REVERSE SOLIDUS;Po;0;ON;;;;;N;BACKSLASH;;;; +005D;RIGHT SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING SQUARE BRACKET;;;; +005E;CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;SPACING CIRCUMFLEX;;;; +005F;LOW LINE;Pc;0;ON;;;;;N;SPACING UNDERSCORE;;;; +0060;GRAVE ACCENT;Sk;0;ON;;;;;N;SPACING GRAVE;;;; +0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041 +0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042 +0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043 +0064;LATIN SMALL LETTER D;Ll;0;L;;;;;N;;;0044;;0044 +0065;LATIN SMALL LETTER E;Ll;0;L;;;;;N;;;0045;;0045 +0066;LATIN SMALL LETTER F;Ll;0;L;;;;;N;;;0046;;0046 +0067;LATIN SMALL LETTER G;Ll;0;L;;;;;N;;;0047;;0047 +0068;LATIN SMALL LETTER H;Ll;0;L;;;;;N;;;0048;;0048 +0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049 +006A;LATIN SMALL LETTER J;Ll;0;L;;;;;N;;;004A;;004A +006B;LATIN SMALL LETTER K;Ll;0;L;;;;;N;;;004B;;004B +006C;LATIN SMALL LETTER L;Ll;0;L;;;;;N;;;004C;;004C +006D;LATIN SMALL LETTER M;Ll;0;L;;;;;N;;;004D;;004D +006E;LATIN SMALL LETTER N;Ll;0;L;;;;;N;;;004E;;004E +006F;LATIN SMALL LETTER O;Ll;0;L;;;;;N;;;004F;;004F +0070;LATIN SMALL LETTER P;Ll;0;L;;;;;N;;;0050;;0050 +0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051 +0072;LATIN SMALL LETTER R;Ll;0;L;;;;;N;;;0052;;0052 +0073;LATIN SMALL LETTER S;Ll;0;L;;;;;N;;;0053;;0053 +0074;LATIN SMALL LETTER T;Ll;0;L;;;;;N;;;0054;;0054 +0075;LATIN SMALL LETTER U;Ll;0;L;;;;;N;;;0055;;0055 +0076;LATIN SMALL LETTER V;Ll;0;L;;;;;N;;;0056;;0056 +0077;LATIN SMALL LETTER W;Ll;0;L;;;;;N;;;0057;;0057 +0078;LATIN SMALL LETTER X;Ll;0;L;;;;;N;;;0058;;0058 +0079;LATIN SMALL LETTER Y;Ll;0;L;;;;;N;;;0059;;0059 +007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A +007B;LEFT CURLY BRACKET;Ps;0;ON;;;;;Y;OPENING CURLY BRACKET;;;; +007C;VERTICAL LINE;Sm;0;ON;;;;;N;VERTICAL BAR;;;; +007D;RIGHT CURLY BRACKET;Pe;0;ON;;;;;Y;CLOSING CURLY BRACKET;;;; +007E;TILDE;Sm;0;ON;;;;;N;;;;; +007F;<control>;Cc;0;BN;;;;;N;DELETE;;;; +0080;<control>;Cc;0;BN;;;;;N;;;;; +0081;<control>;Cc;0;BN;;;;;N;;;;; +0082;<control>;Cc;0;BN;;;;;N;BREAK PERMITTED HERE;;;; +0083;<control>;Cc;0;BN;;;;;N;NO BREAK HERE;;;; +0084;<control>;Cc;0;BN;;;;;N;;;;; +0085;<control>;Cc;0;B;;;;;N;NEXT LINE (NEL);;;; +0086;<control>;Cc;0;BN;;;;;N;START OF SELECTED AREA;;;; +0087;<control>;Cc;0;BN;;;;;N;END OF SELECTED AREA;;;; +0088;<control>;Cc;0;BN;;;;;N;CHARACTER TABULATION SET;;;; +0089;<control>;Cc;0;BN;;;;;N;CHARACTER TABULATION WITH JUSTIFICATION;;;; +008A;<control>;Cc;0;BN;;;;;N;LINE TABULATION SET;;;; +008B;<control>;Cc;0;BN;;;;;N;PARTIAL LINE FORWARD;;;; +008C;<control>;Cc;0;BN;;;;;N;PARTIAL LINE BACKWARD;;;; +008D;<control>;Cc;0;BN;;;;;N;REVERSE LINE FEED;;;; +008E;<control>;Cc;0;BN;;;;;N;SINGLE SHIFT TWO;;;; +008F;<control>;Cc;0;BN;;;;;N;SINGLE SHIFT THREE;;;; +0090;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL STRING;;;; +0091;<control>;Cc;0;BN;;;;;N;PRIVATE USE ONE;;;; +0092;<control>;Cc;0;BN;;;;;N;PRIVATE USE TWO;;;; +0093;<control>;Cc;0;BN;;;;;N;SET TRANSMIT STATE;;;; +0094;<control>;Cc;0;BN;;;;;N;CANCEL CHARACTER;;;; +0095;<control>;Cc;0;BN;;;;;N;MESSAGE WAITING;;;; +0096;<control>;Cc;0;BN;;;;;N;START OF GUARDED AREA;;;; +0097;<control>;Cc;0;BN;;;;;N;END OF GUARDED AREA;;;; +0098;<control>;Cc;0;BN;;;;;N;START OF STRING;;;; +0099;<control>;Cc;0;BN;;;;;N;;;;; +009A;<control>;Cc;0;BN;;;;;N;SINGLE CHARACTER INTRODUCER;;;; +009B;<control>;Cc;0;BN;;;;;N;CONTROL SEQUENCE INTRODUCER;;;; +009C;<control>;Cc;0;BN;;;;;N;STRING TERMINATOR;;;; +009D;<control>;Cc;0;BN;;;;;N;OPERATING SYSTEM COMMAND;;;; +009E;<control>;Cc;0;BN;;;;;N;PRIVACY MESSAGE;;;; +009F;<control>;Cc;0;BN;;;;;N;APPLICATION PROGRAM COMMAND;;;; +00A0;NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;NON-BREAKING SPACE;;;; +00A1;INVERTED EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +00A2;CENT SIGN;Sc;0;ET;;;;;N;;;;; +00A3;POUND SIGN;Sc;0;ET;;;;;N;;;;; +00A4;CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; +00A5;YEN SIGN;Sc;0;ET;;;;;N;;;;; +00A6;BROKEN BAR;So;0;ON;;;;;N;BROKEN VERTICAL BAR;;;; +00A7;SECTION SIGN;So;0;ON;;;;;N;;;;; +00A8;DIAERESIS;Sk;0;ON;<compat> 0020 0308;;;;N;SPACING DIAERESIS;;;; +00A9;COPYRIGHT SIGN;So;0;ON;;;;;N;;;;; +00AA;FEMININE ORDINAL INDICATOR;Ll;0;L;<super> 0061;;;;N;;;;; +00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;;;; +00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;; +00AD;SOFT HYPHEN;Cf;0;BN;;;;;N;;;;; +00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;; +00AF;MACRON;Sk;0;ON;<compat> 0020 0304;;;;N;SPACING MACRON;;;; +00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;; +00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;; +00B2;SUPERSCRIPT TWO;No;0;EN;<super> 0032;;2;2;N;SUPERSCRIPT DIGIT TWO;;;; +00B3;SUPERSCRIPT THREE;No;0;EN;<super> 0033;;3;3;N;SUPERSCRIPT DIGIT THREE;;;; +00B4;ACUTE ACCENT;Sk;0;ON;<compat> 0020 0301;;;;N;SPACING ACUTE;;;; +00B5;MICRO SIGN;Ll;0;L;<compat> 03BC;;;;N;;;039C;;039C +00B6;PILCROW SIGN;So;0;ON;;;;;N;PARAGRAPH SIGN;;;; +00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;; +00B8;CEDILLA;Sk;0;ON;<compat> 0020 0327;;;;N;SPACING CEDILLA;;;; +00B9;SUPERSCRIPT ONE;No;0;EN;<super> 0031;;1;1;N;SUPERSCRIPT DIGIT ONE;;;; +00BA;MASCULINE ORDINAL INDICATOR;Ll;0;L;<super> 006F;;;;N;;;;; +00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;;;; +00BC;VULGAR FRACTION ONE QUARTER;No;0;ON;<fraction> 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;; +00BD;VULGAR FRACTION ONE HALF;No;0;ON;<fraction> 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;; +00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON;<fraction> 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;; +00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;; +00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0; +00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1; +00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2; +00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3; +00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4; +00C5;LATIN CAPITAL LETTER A WITH RING ABOVE;Lu;0;L;0041 030A;;;;N;LATIN CAPITAL LETTER A RING;;;00E5; +00C6;LATIN CAPITAL LETTER AE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER A E;;;00E6; +00C7;LATIN CAPITAL LETTER C WITH CEDILLA;Lu;0;L;0043 0327;;;;N;LATIN CAPITAL LETTER C CEDILLA;;;00E7; +00C8;LATIN CAPITAL LETTER E WITH GRAVE;Lu;0;L;0045 0300;;;;N;LATIN CAPITAL LETTER E GRAVE;;;00E8; +00C9;LATIN CAPITAL LETTER E WITH ACUTE;Lu;0;L;0045 0301;;;;N;LATIN CAPITAL LETTER E ACUTE;;;00E9; +00CA;LATIN CAPITAL LETTER E WITH CIRCUMFLEX;Lu;0;L;0045 0302;;;;N;LATIN CAPITAL LETTER E CIRCUMFLEX;;;00EA; +00CB;LATIN CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;0045 0308;;;;N;LATIN CAPITAL LETTER E DIAERESIS;;;00EB; +00CC;LATIN CAPITAL LETTER I WITH GRAVE;Lu;0;L;0049 0300;;;;N;LATIN CAPITAL LETTER I GRAVE;;;00EC; +00CD;LATIN CAPITAL LETTER I WITH ACUTE;Lu;0;L;0049 0301;;;;N;LATIN CAPITAL LETTER I ACUTE;;;00ED; +00CE;LATIN CAPITAL LETTER I WITH CIRCUMFLEX;Lu;0;L;0049 0302;;;;N;LATIN CAPITAL LETTER I CIRCUMFLEX;;;00EE; +00CF;LATIN CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0049 0308;;;;N;LATIN CAPITAL LETTER I DIAERESIS;;;00EF; +00D0;LATIN CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;00F0; +00D1;LATIN CAPITAL LETTER N WITH TILDE;Lu;0;L;004E 0303;;;;N;LATIN CAPITAL LETTER N TILDE;;;00F1; +00D2;LATIN CAPITAL LETTER O WITH GRAVE;Lu;0;L;004F 0300;;;;N;LATIN CAPITAL LETTER O GRAVE;;;00F2; +00D3;LATIN CAPITAL LETTER O WITH ACUTE;Lu;0;L;004F 0301;;;;N;LATIN CAPITAL LETTER O ACUTE;;;00F3; +00D4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX;Lu;0;L;004F 0302;;;;N;LATIN CAPITAL LETTER O CIRCUMFLEX;;;00F4; +00D5;LATIN CAPITAL LETTER O WITH TILDE;Lu;0;L;004F 0303;;;;N;LATIN CAPITAL LETTER O TILDE;;;00F5; +00D6;LATIN CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;004F 0308;;;;N;LATIN CAPITAL LETTER O DIAERESIS;;;00F6; +00D7;MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;; +00D8;LATIN CAPITAL LETTER O WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O SLASH;;;00F8; +00D9;LATIN CAPITAL LETTER U WITH GRAVE;Lu;0;L;0055 0300;;;;N;LATIN CAPITAL LETTER U GRAVE;;;00F9; +00DA;LATIN CAPITAL LETTER U WITH ACUTE;Lu;0;L;0055 0301;;;;N;LATIN CAPITAL LETTER U ACUTE;;;00FA; +00DB;LATIN CAPITAL LETTER U WITH CIRCUMFLEX;Lu;0;L;0055 0302;;;;N;LATIN CAPITAL LETTER U CIRCUMFLEX;;;00FB; +00DC;LATIN CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0055 0308;;;;N;LATIN CAPITAL LETTER U DIAERESIS;;;00FC; +00DD;LATIN CAPITAL LETTER Y WITH ACUTE;Lu;0;L;0059 0301;;;;N;LATIN CAPITAL LETTER Y ACUTE;;;00FD; +00DE;LATIN CAPITAL LETTER THORN;Lu;0;L;;;;;N;;;;00FE; +00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;;;; +00E0;LATIN SMALL LETTER A WITH GRAVE;Ll;0;L;0061 0300;;;;N;LATIN SMALL LETTER A GRAVE;;00C0;;00C0 +00E1;LATIN SMALL LETTER A WITH ACUTE;Ll;0;L;0061 0301;;;;N;LATIN SMALL LETTER A ACUTE;;00C1;;00C1 +00E2;LATIN SMALL LETTER A WITH CIRCUMFLEX;Ll;0;L;0061 0302;;;;N;LATIN SMALL LETTER A CIRCUMFLEX;;00C2;;00C2 +00E3;LATIN SMALL LETTER A WITH TILDE;Ll;0;L;0061 0303;;;;N;LATIN SMALL LETTER A TILDE;;00C3;;00C3 +00E4;LATIN SMALL LETTER A WITH DIAERESIS;Ll;0;L;0061 0308;;;;N;LATIN SMALL LETTER A DIAERESIS;;00C4;;00C4 +00E5;LATIN SMALL LETTER A WITH RING ABOVE;Ll;0;L;0061 030A;;;;N;LATIN SMALL LETTER A RING;;00C5;;00C5 +00E6;LATIN SMALL LETTER AE;Ll;0;L;;;;;N;LATIN SMALL LETTER A E;;00C6;;00C6 +00E7;LATIN SMALL LETTER C WITH CEDILLA;Ll;0;L;0063 0327;;;;N;LATIN SMALL LETTER C CEDILLA;;00C7;;00C7 +00E8;LATIN SMALL LETTER E WITH GRAVE;Ll;0;L;0065 0300;;;;N;LATIN SMALL LETTER E GRAVE;;00C8;;00C8 +00E9;LATIN SMALL LETTER E WITH ACUTE;Ll;0;L;0065 0301;;;;N;LATIN SMALL LETTER E ACUTE;;00C9;;00C9 +00EA;LATIN SMALL LETTER E WITH CIRCUMFLEX;Ll;0;L;0065 0302;;;;N;LATIN SMALL LETTER E CIRCUMFLEX;;00CA;;00CA +00EB;LATIN SMALL LETTER E WITH DIAERESIS;Ll;0;L;0065 0308;;;;N;LATIN SMALL LETTER E DIAERESIS;;00CB;;00CB +00EC;LATIN SMALL LETTER I WITH GRAVE;Ll;0;L;0069 0300;;;;N;LATIN SMALL LETTER I GRAVE;;00CC;;00CC +00ED;LATIN SMALL LETTER I WITH ACUTE;Ll;0;L;0069 0301;;;;N;LATIN SMALL LETTER I ACUTE;;00CD;;00CD +00EE;LATIN SMALL LETTER I WITH CIRCUMFLEX;Ll;0;L;0069 0302;;;;N;LATIN SMALL LETTER I CIRCUMFLEX;;00CE;;00CE +00EF;LATIN SMALL LETTER I WITH DIAERESIS;Ll;0;L;0069 0308;;;;N;LATIN SMALL LETTER I DIAERESIS;;00CF;;00CF +00F0;LATIN SMALL LETTER ETH;Ll;0;L;;;;;N;;;00D0;;00D0 +00F1;LATIN SMALL LETTER N WITH TILDE;Ll;0;L;006E 0303;;;;N;LATIN SMALL LETTER N TILDE;;00D1;;00D1 +00F2;LATIN SMALL LETTER O WITH GRAVE;Ll;0;L;006F 0300;;;;N;LATIN SMALL LETTER O GRAVE;;00D2;;00D2 +00F3;LATIN SMALL LETTER O WITH ACUTE;Ll;0;L;006F 0301;;;;N;LATIN SMALL LETTER O ACUTE;;00D3;;00D3 +00F4;LATIN SMALL LETTER O WITH CIRCUMFLEX;Ll;0;L;006F 0302;;;;N;LATIN SMALL LETTER O CIRCUMFLEX;;00D4;;00D4 +00F5;LATIN SMALL LETTER O WITH TILDE;Ll;0;L;006F 0303;;;;N;LATIN SMALL LETTER O TILDE;;00D5;;00D5 +00F6;LATIN SMALL LETTER O WITH DIAERESIS;Ll;0;L;006F 0308;;;;N;LATIN SMALL LETTER O DIAERESIS;;00D6;;00D6 +00F7;DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +00F8;LATIN SMALL LETTER O WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER O SLASH;;00D8;;00D8 +00F9;LATIN SMALL LETTER U WITH GRAVE;Ll;0;L;0075 0300;;;;N;LATIN SMALL LETTER U GRAVE;;00D9;;00D9 +00FA;LATIN SMALL LETTER U WITH ACUTE;Ll;0;L;0075 0301;;;;N;LATIN SMALL LETTER U ACUTE;;00DA;;00DA +00FB;LATIN SMALL LETTER U WITH CIRCUMFLEX;Ll;0;L;0075 0302;;;;N;LATIN SMALL LETTER U CIRCUMFLEX;;00DB;;00DB +00FC;LATIN SMALL LETTER U WITH DIAERESIS;Ll;0;L;0075 0308;;;;N;LATIN SMALL LETTER U DIAERESIS;;00DC;;00DC +00FD;LATIN SMALL LETTER Y WITH ACUTE;Ll;0;L;0079 0301;;;;N;LATIN SMALL LETTER Y ACUTE;;00DD;;00DD +00FE;LATIN SMALL LETTER THORN;Ll;0;L;;;;;N;;;00DE;;00DE +00FF;LATIN SMALL LETTER Y WITH DIAERESIS;Ll;0;L;0079 0308;;;;N;LATIN SMALL LETTER Y DIAERESIS;;0178;;0178 +0100;LATIN CAPITAL LETTER A WITH MACRON;Lu;0;L;0041 0304;;;;N;LATIN CAPITAL LETTER A MACRON;;;0101; +0101;LATIN SMALL LETTER A WITH MACRON;Ll;0;L;0061 0304;;;;N;LATIN SMALL LETTER A MACRON;;0100;;0100 +0102;LATIN CAPITAL LETTER A WITH BREVE;Lu;0;L;0041 0306;;;;N;LATIN CAPITAL LETTER A BREVE;;;0103; +0103;LATIN SMALL LETTER A WITH BREVE;Ll;0;L;0061 0306;;;;N;LATIN SMALL LETTER A BREVE;;0102;;0102 +0104;LATIN CAPITAL LETTER A WITH OGONEK;Lu;0;L;0041 0328;;;;N;LATIN CAPITAL LETTER A OGONEK;;;0105; +0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104 +0106;LATIN CAPITAL LETTER C WITH ACUTE;Lu;0;L;0043 0301;;;;N;LATIN CAPITAL LETTER C ACUTE;;;0107; +0107;LATIN SMALL LETTER C WITH ACUTE;Ll;0;L;0063 0301;;;;N;LATIN SMALL LETTER C ACUTE;;0106;;0106 +0108;LATIN CAPITAL LETTER C WITH CIRCUMFLEX;Lu;0;L;0043 0302;;;;N;LATIN CAPITAL LETTER C CIRCUMFLEX;;;0109; +0109;LATIN SMALL LETTER C WITH CIRCUMFLEX;Ll;0;L;0063 0302;;;;N;LATIN SMALL LETTER C CIRCUMFLEX;;0108;;0108 +010A;LATIN CAPITAL LETTER C WITH DOT ABOVE;Lu;0;L;0043 0307;;;;N;LATIN CAPITAL LETTER C DOT;;;010B; +010B;LATIN SMALL LETTER C WITH DOT ABOVE;Ll;0;L;0063 0307;;;;N;LATIN SMALL LETTER C DOT;;010A;;010A +010C;LATIN CAPITAL LETTER C WITH CARON;Lu;0;L;0043 030C;;;;N;LATIN CAPITAL LETTER C HACEK;;;010D; +010D;LATIN SMALL LETTER C WITH CARON;Ll;0;L;0063 030C;;;;N;LATIN SMALL LETTER C HACEK;;010C;;010C +010E;LATIN CAPITAL LETTER D WITH CARON;Lu;0;L;0044 030C;;;;N;LATIN CAPITAL LETTER D HACEK;;;010F; +010F;LATIN SMALL LETTER D WITH CARON;Ll;0;L;0064 030C;;;;N;LATIN SMALL LETTER D HACEK;;010E;;010E +0110;LATIN CAPITAL LETTER D WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D BAR;;;0111; +0111;LATIN SMALL LETTER D WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER D BAR;;0110;;0110 +0112;LATIN CAPITAL LETTER E WITH MACRON;Lu;0;L;0045 0304;;;;N;LATIN CAPITAL LETTER E MACRON;;;0113; +0113;LATIN SMALL LETTER E WITH MACRON;Ll;0;L;0065 0304;;;;N;LATIN SMALL LETTER E MACRON;;0112;;0112 +0114;LATIN CAPITAL LETTER E WITH BREVE;Lu;0;L;0045 0306;;;;N;LATIN CAPITAL LETTER E BREVE;;;0115; +0115;LATIN SMALL LETTER E WITH BREVE;Ll;0;L;0065 0306;;;;N;LATIN SMALL LETTER E BREVE;;0114;;0114 +0116;LATIN CAPITAL LETTER E WITH DOT ABOVE;Lu;0;L;0045 0307;;;;N;LATIN CAPITAL LETTER E DOT;;;0117; +0117;LATIN SMALL LETTER E WITH DOT ABOVE;Ll;0;L;0065 0307;;;;N;LATIN SMALL LETTER E DOT;;0116;;0116 +0118;LATIN CAPITAL LETTER E WITH OGONEK;Lu;0;L;0045 0328;;;;N;LATIN CAPITAL LETTER E OGONEK;;;0119; +0119;LATIN SMALL LETTER E WITH OGONEK;Ll;0;L;0065 0328;;;;N;LATIN SMALL LETTER E OGONEK;;0118;;0118 +011A;LATIN CAPITAL LETTER E WITH CARON;Lu;0;L;0045 030C;;;;N;LATIN CAPITAL LETTER E HACEK;;;011B; +011B;LATIN SMALL LETTER E WITH CARON;Ll;0;L;0065 030C;;;;N;LATIN SMALL LETTER E HACEK;;011A;;011A +011C;LATIN CAPITAL LETTER G WITH CIRCUMFLEX;Lu;0;L;0047 0302;;;;N;LATIN CAPITAL LETTER G CIRCUMFLEX;;;011D; +011D;LATIN SMALL LETTER G WITH CIRCUMFLEX;Ll;0;L;0067 0302;;;;N;LATIN SMALL LETTER G CIRCUMFLEX;;011C;;011C +011E;LATIN CAPITAL LETTER G WITH BREVE;Lu;0;L;0047 0306;;;;N;LATIN CAPITAL LETTER G BREVE;;;011F; +011F;LATIN SMALL LETTER G WITH BREVE;Ll;0;L;0067 0306;;;;N;LATIN SMALL LETTER G BREVE;;011E;;011E +0120;LATIN CAPITAL LETTER G WITH DOT ABOVE;Lu;0;L;0047 0307;;;;N;LATIN CAPITAL LETTER G DOT;;;0121; +0121;LATIN SMALL LETTER G WITH DOT ABOVE;Ll;0;L;0067 0307;;;;N;LATIN SMALL LETTER G DOT;;0120;;0120 +0122;LATIN CAPITAL LETTER G WITH CEDILLA;Lu;0;L;0047 0327;;;;N;LATIN CAPITAL LETTER G CEDILLA;;;0123; +0123;LATIN SMALL LETTER G WITH CEDILLA;Ll;0;L;0067 0327;;;;N;LATIN SMALL LETTER G CEDILLA;;0122;;0122 +0124;LATIN CAPITAL LETTER H WITH CIRCUMFLEX;Lu;0;L;0048 0302;;;;N;LATIN CAPITAL LETTER H CIRCUMFLEX;;;0125; +0125;LATIN SMALL LETTER H WITH CIRCUMFLEX;Ll;0;L;0068 0302;;;;N;LATIN SMALL LETTER H CIRCUMFLEX;;0124;;0124 +0126;LATIN CAPITAL LETTER H WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER H BAR;;;0127; +0127;LATIN SMALL LETTER H WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER H BAR;;0126;;0126 +0128;LATIN CAPITAL LETTER I WITH TILDE;Lu;0;L;0049 0303;;;;N;LATIN CAPITAL LETTER I TILDE;;;0129; +0129;LATIN SMALL LETTER I WITH TILDE;Ll;0;L;0069 0303;;;;N;LATIN SMALL LETTER I TILDE;;0128;;0128 +012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B; +012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A +012C;LATIN CAPITAL LETTER I WITH BREVE;Lu;0;L;0049 0306;;;;N;LATIN CAPITAL LETTER I BREVE;;;012D; +012D;LATIN SMALL LETTER I WITH BREVE;Ll;0;L;0069 0306;;;;N;LATIN SMALL LETTER I BREVE;;012C;;012C +012E;LATIN CAPITAL LETTER I WITH OGONEK;Lu;0;L;0049 0328;;;;N;LATIN CAPITAL LETTER I OGONEK;;;012F; +012F;LATIN SMALL LETTER I WITH OGONEK;Ll;0;L;0069 0328;;;;N;LATIN SMALL LETTER I OGONEK;;012E;;012E +0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069; +0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049 +0132;LATIN CAPITAL LIGATURE IJ;Lu;0;L;<compat> 0049 004A;;;;N;LATIN CAPITAL LETTER I J;;;0133; +0133;LATIN SMALL LIGATURE IJ;Ll;0;L;<compat> 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132 +0134;LATIN CAPITAL LETTER J WITH CIRCUMFLEX;Lu;0;L;004A 0302;;;;N;LATIN CAPITAL LETTER J CIRCUMFLEX;;;0135; +0135;LATIN SMALL LETTER J WITH CIRCUMFLEX;Ll;0;L;006A 0302;;;;N;LATIN SMALL LETTER J CIRCUMFLEX;;0134;;0134 +0136;LATIN CAPITAL LETTER K WITH CEDILLA;Lu;0;L;004B 0327;;;;N;LATIN CAPITAL LETTER K CEDILLA;;;0137; +0137;LATIN SMALL LETTER K WITH CEDILLA;Ll;0;L;006B 0327;;;;N;LATIN SMALL LETTER K CEDILLA;;0136;;0136 +0138;LATIN SMALL LETTER KRA;Ll;0;L;;;;;N;;;;; +0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A; +013A;LATIN SMALL LETTER L WITH ACUTE;Ll;0;L;006C 0301;;;;N;LATIN SMALL LETTER L ACUTE;;0139;;0139 +013B;LATIN CAPITAL LETTER L WITH CEDILLA;Lu;0;L;004C 0327;;;;N;LATIN CAPITAL LETTER L CEDILLA;;;013C; +013C;LATIN SMALL LETTER L WITH CEDILLA;Ll;0;L;006C 0327;;;;N;LATIN SMALL LETTER L CEDILLA;;013B;;013B +013D;LATIN CAPITAL LETTER L WITH CARON;Lu;0;L;004C 030C;;;;N;LATIN CAPITAL LETTER L HACEK;;;013E; +013E;LATIN SMALL LETTER L WITH CARON;Ll;0;L;006C 030C;;;;N;LATIN SMALL LETTER L HACEK;;013D;;013D +013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L;<compat> 004C 00B7;;;;N;;;;0140; +0140;LATIN SMALL LETTER L WITH MIDDLE DOT;Ll;0;L;<compat> 006C 00B7;;;;N;;;013F;;013F +0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142; +0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141 +0143;LATIN CAPITAL LETTER N WITH ACUTE;Lu;0;L;004E 0301;;;;N;LATIN CAPITAL LETTER N ACUTE;;;0144; +0144;LATIN SMALL LETTER N WITH ACUTE;Ll;0;L;006E 0301;;;;N;LATIN SMALL LETTER N ACUTE;;0143;;0143 +0145;LATIN CAPITAL LETTER N WITH CEDILLA;Lu;0;L;004E 0327;;;;N;LATIN CAPITAL LETTER N CEDILLA;;;0146; +0146;LATIN SMALL LETTER N WITH CEDILLA;Ll;0;L;006E 0327;;;;N;LATIN SMALL LETTER N CEDILLA;;0145;;0145 +0147;LATIN CAPITAL LETTER N WITH CARON;Lu;0;L;004E 030C;;;;N;LATIN CAPITAL LETTER N HACEK;;;0148; +0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147 +0149;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE;Ll;0;L;<compat> 02BC 006E;;;;N;LATIN SMALL LETTER APOSTROPHE N;;;; +014A;LATIN CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;014B; +014B;LATIN SMALL LETTER ENG;Ll;0;L;;;;;N;;;014A;;014A +014C;LATIN CAPITAL LETTER O WITH MACRON;Lu;0;L;004F 0304;;;;N;LATIN CAPITAL LETTER O MACRON;;;014D; +014D;LATIN SMALL LETTER O WITH MACRON;Ll;0;L;006F 0304;;;;N;LATIN SMALL LETTER O MACRON;;014C;;014C +014E;LATIN CAPITAL LETTER O WITH BREVE;Lu;0;L;004F 0306;;;;N;LATIN CAPITAL LETTER O BREVE;;;014F; +014F;LATIN SMALL LETTER O WITH BREVE;Ll;0;L;006F 0306;;;;N;LATIN SMALL LETTER O BREVE;;014E;;014E +0150;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE;Lu;0;L;004F 030B;;;;N;LATIN CAPITAL LETTER O DOUBLE ACUTE;;;0151; +0151;LATIN SMALL LETTER O WITH DOUBLE ACUTE;Ll;0;L;006F 030B;;;;N;LATIN SMALL LETTER O DOUBLE ACUTE;;0150;;0150 +0152;LATIN CAPITAL LIGATURE OE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O E;;;0153; +0153;LATIN SMALL LIGATURE OE;Ll;0;L;;;;;N;LATIN SMALL LETTER O E;;0152;;0152 +0154;LATIN CAPITAL LETTER R WITH ACUTE;Lu;0;L;0052 0301;;;;N;LATIN CAPITAL LETTER R ACUTE;;;0155; +0155;LATIN SMALL LETTER R WITH ACUTE;Ll;0;L;0072 0301;;;;N;LATIN SMALL LETTER R ACUTE;;0154;;0154 +0156;LATIN CAPITAL LETTER R WITH CEDILLA;Lu;0;L;0052 0327;;;;N;LATIN CAPITAL LETTER R CEDILLA;;;0157; +0157;LATIN SMALL LETTER R WITH CEDILLA;Ll;0;L;0072 0327;;;;N;LATIN SMALL LETTER R CEDILLA;;0156;;0156 +0158;LATIN CAPITAL LETTER R WITH CARON;Lu;0;L;0052 030C;;;;N;LATIN CAPITAL LETTER R HACEK;;;0159; +0159;LATIN SMALL LETTER R WITH CARON;Ll;0;L;0072 030C;;;;N;LATIN SMALL LETTER R HACEK;;0158;;0158 +015A;LATIN CAPITAL LETTER S WITH ACUTE;Lu;0;L;0053 0301;;;;N;LATIN CAPITAL LETTER S ACUTE;;;015B; +015B;LATIN SMALL LETTER S WITH ACUTE;Ll;0;L;0073 0301;;;;N;LATIN SMALL LETTER S ACUTE;;015A;;015A +015C;LATIN CAPITAL LETTER S WITH CIRCUMFLEX;Lu;0;L;0053 0302;;;;N;LATIN CAPITAL LETTER S CIRCUMFLEX;;;015D; +015D;LATIN SMALL LETTER S WITH CIRCUMFLEX;Ll;0;L;0073 0302;;;;N;LATIN SMALL LETTER S CIRCUMFLEX;;015C;;015C +015E;LATIN CAPITAL LETTER S WITH CEDILLA;Lu;0;L;0053 0327;;;;N;LATIN CAPITAL LETTER S CEDILLA;;;015F; +015F;LATIN SMALL LETTER S WITH CEDILLA;Ll;0;L;0073 0327;;;;N;LATIN SMALL LETTER S CEDILLA;;015E;;015E +0160;LATIN CAPITAL LETTER S WITH CARON;Lu;0;L;0053 030C;;;;N;LATIN CAPITAL LETTER S HACEK;;;0161; +0161;LATIN SMALL LETTER S WITH CARON;Ll;0;L;0073 030C;;;;N;LATIN SMALL LETTER S HACEK;;0160;;0160 +0162;LATIN CAPITAL LETTER T WITH CEDILLA;Lu;0;L;0054 0327;;;;N;LATIN CAPITAL LETTER T CEDILLA;;;0163; +0163;LATIN SMALL LETTER T WITH CEDILLA;Ll;0;L;0074 0327;;;;N;LATIN SMALL LETTER T CEDILLA;;0162;;0162 +0164;LATIN CAPITAL LETTER T WITH CARON;Lu;0;L;0054 030C;;;;N;LATIN CAPITAL LETTER T HACEK;;;0165; +0165;LATIN SMALL LETTER T WITH CARON;Ll;0;L;0074 030C;;;;N;LATIN SMALL LETTER T HACEK;;0164;;0164 +0166;LATIN CAPITAL LETTER T WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T BAR;;;0167; +0167;LATIN SMALL LETTER T WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER T BAR;;0166;;0166 +0168;LATIN CAPITAL LETTER U WITH TILDE;Lu;0;L;0055 0303;;;;N;LATIN CAPITAL LETTER U TILDE;;;0169; +0169;LATIN SMALL LETTER U WITH TILDE;Ll;0;L;0075 0303;;;;N;LATIN SMALL LETTER U TILDE;;0168;;0168 +016A;LATIN CAPITAL LETTER U WITH MACRON;Lu;0;L;0055 0304;;;;N;LATIN CAPITAL LETTER U MACRON;;;016B; +016B;LATIN SMALL LETTER U WITH MACRON;Ll;0;L;0075 0304;;;;N;LATIN SMALL LETTER U MACRON;;016A;;016A +016C;LATIN CAPITAL LETTER U WITH BREVE;Lu;0;L;0055 0306;;;;N;LATIN CAPITAL LETTER U BREVE;;;016D; +016D;LATIN SMALL LETTER U WITH BREVE;Ll;0;L;0075 0306;;;;N;LATIN SMALL LETTER U BREVE;;016C;;016C +016E;LATIN CAPITAL LETTER U WITH RING ABOVE;Lu;0;L;0055 030A;;;;N;LATIN CAPITAL LETTER U RING;;;016F; +016F;LATIN SMALL LETTER U WITH RING ABOVE;Ll;0;L;0075 030A;;;;N;LATIN SMALL LETTER U RING;;016E;;016E +0170;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0055 030B;;;;N;LATIN CAPITAL LETTER U DOUBLE ACUTE;;;0171; +0171;LATIN SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0075 030B;;;;N;LATIN SMALL LETTER U DOUBLE ACUTE;;0170;;0170 +0172;LATIN CAPITAL LETTER U WITH OGONEK;Lu;0;L;0055 0328;;;;N;LATIN CAPITAL LETTER U OGONEK;;;0173; +0173;LATIN SMALL LETTER U WITH OGONEK;Ll;0;L;0075 0328;;;;N;LATIN SMALL LETTER U OGONEK;;0172;;0172 +0174;LATIN CAPITAL LETTER W WITH CIRCUMFLEX;Lu;0;L;0057 0302;;;;N;LATIN CAPITAL LETTER W CIRCUMFLEX;;;0175; +0175;LATIN SMALL LETTER W WITH CIRCUMFLEX;Ll;0;L;0077 0302;;;;N;LATIN SMALL LETTER W CIRCUMFLEX;;0174;;0174 +0176;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX;Lu;0;L;0059 0302;;;;N;LATIN CAPITAL LETTER Y CIRCUMFLEX;;;0177; +0177;LATIN SMALL LETTER Y WITH CIRCUMFLEX;Ll;0;L;0079 0302;;;;N;LATIN SMALL LETTER Y CIRCUMFLEX;;0176;;0176 +0178;LATIN CAPITAL LETTER Y WITH DIAERESIS;Lu;0;L;0059 0308;;;;N;LATIN CAPITAL LETTER Y DIAERESIS;;;00FF; +0179;LATIN CAPITAL LETTER Z WITH ACUTE;Lu;0;L;005A 0301;;;;N;LATIN CAPITAL LETTER Z ACUTE;;;017A; +017A;LATIN SMALL LETTER Z WITH ACUTE;Ll;0;L;007A 0301;;;;N;LATIN SMALL LETTER Z ACUTE;;0179;;0179 +017B;LATIN CAPITAL LETTER Z WITH DOT ABOVE;Lu;0;L;005A 0307;;;;N;LATIN CAPITAL LETTER Z DOT;;;017C; +017C;LATIN SMALL LETTER Z WITH DOT ABOVE;Ll;0;L;007A 0307;;;;N;LATIN SMALL LETTER Z DOT;;017B;;017B +017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E; +017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D +017F;LATIN SMALL LETTER LONG S;Ll;0;L;<compat> 0073;;;;N;;;0053;;0053 +0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;0243;;0243 +0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253; +0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183; +0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182 +0184;LATIN CAPITAL LETTER TONE SIX;Lu;0;L;;;;;N;;;;0185; +0185;LATIN SMALL LETTER TONE SIX;Ll;0;L;;;;;N;;;0184;;0184 +0186;LATIN CAPITAL LETTER OPEN O;Lu;0;L;;;;;N;;;;0254; +0187;LATIN CAPITAL LETTER C WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER C HOOK;;;0188; +0188;LATIN SMALL LETTER C WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER C HOOK;;0187;;0187 +0189;LATIN CAPITAL LETTER AFRICAN D;Lu;0;L;;;;;N;;;;0256; +018A;LATIN CAPITAL LETTER D WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D HOOK;;;0257; +018B;LATIN CAPITAL LETTER D WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D TOPBAR;;;018C; +018C;LATIN SMALL LETTER D WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER D TOPBAR;;018B;;018B +018D;LATIN SMALL LETTER TURNED DELTA;Ll;0;L;;;;;N;;;;; +018E;LATIN CAPITAL LETTER REVERSED E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER TURNED E;;;01DD; +018F;LATIN CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;0259; +0190;LATIN CAPITAL LETTER OPEN E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER EPSILON;;;025B; +0191;LATIN CAPITAL LETTER F WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER F HOOK;;;0192; +0192;LATIN SMALL LETTER F WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT F;;0191;;0191 +0193;LATIN CAPITAL LETTER G WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G HOOK;;;0260; +0194;LATIN CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;0263; +0195;LATIN SMALL LETTER HV;Ll;0;L;;;;;N;LATIN SMALL LETTER H V;;01F6;;01F6 +0196;LATIN CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;0269; +0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268; +0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199; +0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198 +019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;023D;;023D +019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;; +019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F; +019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272; +019E;LATIN SMALL LETTER N WITH LONG RIGHT LEG;Ll;0;L;;;;;N;;;0220;;0220 +019F;LATIN CAPITAL LETTER O WITH MIDDLE TILDE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED O;;;0275; +01A0;LATIN CAPITAL LETTER O WITH HORN;Lu;0;L;004F 031B;;;;N;LATIN CAPITAL LETTER O HORN;;;01A1; +01A1;LATIN SMALL LETTER O WITH HORN;Ll;0;L;006F 031B;;;;N;LATIN SMALL LETTER O HORN;;01A0;;01A0 +01A2;LATIN CAPITAL LETTER OI;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O I;;;01A3; +01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;;01A2;;01A2 +01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5; +01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4 +01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;;;0280; +01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8; +01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7 +01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283; +01AA;LATIN LETTER REVERSED ESH LOOP;Ll;0;L;;;;;N;;;;; +01AB;LATIN SMALL LETTER T WITH PALATAL HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T PALATAL HOOK;;;; +01AC;LATIN CAPITAL LETTER T WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T HOOK;;;01AD; +01AD;LATIN SMALL LETTER T WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T HOOK;;01AC;;01AC +01AE;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T RETROFLEX HOOK;;;0288; +01AF;LATIN CAPITAL LETTER U WITH HORN;Lu;0;L;0055 031B;;;;N;LATIN CAPITAL LETTER U HORN;;;01B0; +01B0;LATIN SMALL LETTER U WITH HORN;Ll;0;L;0075 031B;;;;N;LATIN SMALL LETTER U HORN;;01AF;;01AF +01B1;LATIN CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;028A; +01B2;LATIN CAPITAL LETTER V WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER SCRIPT V;;;028B; +01B3;LATIN CAPITAL LETTER Y WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Y HOOK;;;01B4; +01B4;LATIN SMALL LETTER Y WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Y HOOK;;01B3;;01B3 +01B5;LATIN CAPITAL LETTER Z WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Z BAR;;;01B6; +01B6;LATIN SMALL LETTER Z WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER Z BAR;;01B5;;01B5 +01B7;LATIN CAPITAL LETTER EZH;Lu;0;L;;;;;N;LATIN CAPITAL LETTER YOGH;;;0292; +01B8;LATIN CAPITAL LETTER EZH REVERSED;Lu;0;L;;;;;N;LATIN CAPITAL LETTER REVERSED YOGH;;;01B9; +01B9;LATIN SMALL LETTER EZH REVERSED;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED YOGH;;01B8;;01B8 +01BA;LATIN SMALL LETTER EZH WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH WITH TAIL;;;; +01BB;LATIN LETTER TWO WITH STROKE;Lo;0;L;;;;;N;LATIN LETTER TWO BAR;;;; +01BC;LATIN CAPITAL LETTER TONE FIVE;Lu;0;L;;;;;N;;;;01BD; +01BD;LATIN SMALL LETTER TONE FIVE;Ll;0;L;;;;;N;;;01BC;;01BC +01BE;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER INVERTED GLOTTAL STOP BAR;;;; +01BF;LATIN LETTER WYNN;Ll;0;L;;;;;N;;;01F7;;01F7 +01C0;LATIN LETTER DENTAL CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE;;;; +01C1;LATIN LETTER LATERAL CLICK;Lo;0;L;;;;;N;LATIN LETTER DOUBLE PIPE;;;; +01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;; +01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;; +01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L;<compat> 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5 +01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L;<compat> 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6;01C5 +01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L;<compat> 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5 +01C7;LATIN CAPITAL LETTER LJ;Lu;0;L;<compat> 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8 +01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L;<compat> 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9;01C8 +01C9;LATIN SMALL LETTER LJ;Ll;0;L;<compat> 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8 +01CA;LATIN CAPITAL LETTER NJ;Lu;0;L;<compat> 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB +01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L;<compat> 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC;01CB +01CC;LATIN SMALL LETTER NJ;Ll;0;L;<compat> 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB +01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE; +01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD +01CF;LATIN CAPITAL LETTER I WITH CARON;Lu;0;L;0049 030C;;;;N;LATIN CAPITAL LETTER I HACEK;;;01D0; +01D0;LATIN SMALL LETTER I WITH CARON;Ll;0;L;0069 030C;;;;N;LATIN SMALL LETTER I HACEK;;01CF;;01CF +01D1;LATIN CAPITAL LETTER O WITH CARON;Lu;0;L;004F 030C;;;;N;LATIN CAPITAL LETTER O HACEK;;;01D2; +01D2;LATIN SMALL LETTER O WITH CARON;Ll;0;L;006F 030C;;;;N;LATIN SMALL LETTER O HACEK;;01D1;;01D1 +01D3;LATIN CAPITAL LETTER U WITH CARON;Lu;0;L;0055 030C;;;;N;LATIN CAPITAL LETTER U HACEK;;;01D4; +01D4;LATIN SMALL LETTER U WITH CARON;Ll;0;L;0075 030C;;;;N;LATIN SMALL LETTER U HACEK;;01D3;;01D3 +01D5;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON;Lu;0;L;00DC 0304;;;;N;LATIN CAPITAL LETTER U DIAERESIS MACRON;;;01D6; +01D6;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON;Ll;0;L;00FC 0304;;;;N;LATIN SMALL LETTER U DIAERESIS MACRON;;01D5;;01D5 +01D7;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE;Lu;0;L;00DC 0301;;;;N;LATIN CAPITAL LETTER U DIAERESIS ACUTE;;;01D8; +01D8;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE;Ll;0;L;00FC 0301;;;;N;LATIN SMALL LETTER U DIAERESIS ACUTE;;01D7;;01D7 +01D9;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON;Lu;0;L;00DC 030C;;;;N;LATIN CAPITAL LETTER U DIAERESIS HACEK;;;01DA; +01DA;LATIN SMALL LETTER U WITH DIAERESIS AND CARON;Ll;0;L;00FC 030C;;;;N;LATIN SMALL LETTER U DIAERESIS HACEK;;01D9;;01D9 +01DB;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE;Lu;0;L;00DC 0300;;;;N;LATIN CAPITAL LETTER U DIAERESIS GRAVE;;;01DC; +01DC;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE;Ll;0;L;00FC 0300;;;;N;LATIN SMALL LETTER U DIAERESIS GRAVE;;01DB;;01DB +01DD;LATIN SMALL LETTER TURNED E;Ll;0;L;;;;;N;;;018E;;018E +01DE;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON;Lu;0;L;00C4 0304;;;;N;LATIN CAPITAL LETTER A DIAERESIS MACRON;;;01DF; +01DF;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON;Ll;0;L;00E4 0304;;;;N;LATIN SMALL LETTER A DIAERESIS MACRON;;01DE;;01DE +01E0;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON;Lu;0;L;0226 0304;;;;N;LATIN CAPITAL LETTER A DOT MACRON;;;01E1; +01E1;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON;Ll;0;L;0227 0304;;;;N;LATIN SMALL LETTER A DOT MACRON;;01E0;;01E0 +01E2;LATIN CAPITAL LETTER AE WITH MACRON;Lu;0;L;00C6 0304;;;;N;LATIN CAPITAL LETTER A E MACRON;;;01E3; +01E3;LATIN SMALL LETTER AE WITH MACRON;Ll;0;L;00E6 0304;;;;N;LATIN SMALL LETTER A E MACRON;;01E2;;01E2 +01E4;LATIN CAPITAL LETTER G WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G BAR;;;01E5; +01E5;LATIN SMALL LETTER G WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER G BAR;;01E4;;01E4 +01E6;LATIN CAPITAL LETTER G WITH CARON;Lu;0;L;0047 030C;;;;N;LATIN CAPITAL LETTER G HACEK;;;01E7; +01E7;LATIN SMALL LETTER G WITH CARON;Ll;0;L;0067 030C;;;;N;LATIN SMALL LETTER G HACEK;;01E6;;01E6 +01E8;LATIN CAPITAL LETTER K WITH CARON;Lu;0;L;004B 030C;;;;N;LATIN CAPITAL LETTER K HACEK;;;01E9; +01E9;LATIN SMALL LETTER K WITH CARON;Ll;0;L;006B 030C;;;;N;LATIN SMALL LETTER K HACEK;;01E8;;01E8 +01EA;LATIN CAPITAL LETTER O WITH OGONEK;Lu;0;L;004F 0328;;;;N;LATIN CAPITAL LETTER O OGONEK;;;01EB; +01EB;LATIN SMALL LETTER O WITH OGONEK;Ll;0;L;006F 0328;;;;N;LATIN SMALL LETTER O OGONEK;;01EA;;01EA +01EC;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON;Lu;0;L;01EA 0304;;;;N;LATIN CAPITAL LETTER O OGONEK MACRON;;;01ED; +01ED;LATIN SMALL LETTER O WITH OGONEK AND MACRON;Ll;0;L;01EB 0304;;;;N;LATIN SMALL LETTER O OGONEK MACRON;;01EC;;01EC +01EE;LATIN CAPITAL LETTER EZH WITH CARON;Lu;0;L;01B7 030C;;;;N;LATIN CAPITAL LETTER YOGH HACEK;;;01EF; +01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE +01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;; +01F1;LATIN CAPITAL LETTER DZ;Lu;0;L;<compat> 0044 005A;;;;N;;;;01F3;01F2 +01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L;<compat> 0044 007A;;;;N;;;01F1;01F3;01F2 +01F3;LATIN SMALL LETTER DZ;Ll;0;L;<compat> 0064 007A;;;;N;;;01F1;;01F2 +01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5; +01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4 +01F6;LATIN CAPITAL LETTER HWAIR;Lu;0;L;;;;;N;;;;0195; +01F7;LATIN CAPITAL LETTER WYNN;Lu;0;L;;;;;N;;;;01BF; +01F8;LATIN CAPITAL LETTER N WITH GRAVE;Lu;0;L;004E 0300;;;;N;;;;01F9; +01F9;LATIN SMALL LETTER N WITH GRAVE;Ll;0;L;006E 0300;;;;N;;;01F8;;01F8 +01FA;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE;Lu;0;L;00C5 0301;;;;N;;;;01FB; +01FB;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE;Ll;0;L;00E5 0301;;;;N;;;01FA;;01FA +01FC;LATIN CAPITAL LETTER AE WITH ACUTE;Lu;0;L;00C6 0301;;;;N;;;;01FD; +01FD;LATIN SMALL LETTER AE WITH ACUTE;Ll;0;L;00E6 0301;;;;N;;;01FC;;01FC +01FE;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE;Lu;0;L;00D8 0301;;;;N;;;;01FF; +01FF;LATIN SMALL LETTER O WITH STROKE AND ACUTE;Ll;0;L;00F8 0301;;;;N;;;01FE;;01FE +0200;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE;Lu;0;L;0041 030F;;;;N;;;;0201; +0201;LATIN SMALL LETTER A WITH DOUBLE GRAVE;Ll;0;L;0061 030F;;;;N;;;0200;;0200 +0202;LATIN CAPITAL LETTER A WITH INVERTED BREVE;Lu;0;L;0041 0311;;;;N;;;;0203; +0203;LATIN SMALL LETTER A WITH INVERTED BREVE;Ll;0;L;0061 0311;;;;N;;;0202;;0202 +0204;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE;Lu;0;L;0045 030F;;;;N;;;;0205; +0205;LATIN SMALL LETTER E WITH DOUBLE GRAVE;Ll;0;L;0065 030F;;;;N;;;0204;;0204 +0206;LATIN CAPITAL LETTER E WITH INVERTED BREVE;Lu;0;L;0045 0311;;;;N;;;;0207; +0207;LATIN SMALL LETTER E WITH INVERTED BREVE;Ll;0;L;0065 0311;;;;N;;;0206;;0206 +0208;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE;Lu;0;L;0049 030F;;;;N;;;;0209; +0209;LATIN SMALL LETTER I WITH DOUBLE GRAVE;Ll;0;L;0069 030F;;;;N;;;0208;;0208 +020A;LATIN CAPITAL LETTER I WITH INVERTED BREVE;Lu;0;L;0049 0311;;;;N;;;;020B; +020B;LATIN SMALL LETTER I WITH INVERTED BREVE;Ll;0;L;0069 0311;;;;N;;;020A;;020A +020C;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE;Lu;0;L;004F 030F;;;;N;;;;020D; +020D;LATIN SMALL LETTER O WITH DOUBLE GRAVE;Ll;0;L;006F 030F;;;;N;;;020C;;020C +020E;LATIN CAPITAL LETTER O WITH INVERTED BREVE;Lu;0;L;004F 0311;;;;N;;;;020F; +020F;LATIN SMALL LETTER O WITH INVERTED BREVE;Ll;0;L;006F 0311;;;;N;;;020E;;020E +0210;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE;Lu;0;L;0052 030F;;;;N;;;;0211; +0211;LATIN SMALL LETTER R WITH DOUBLE GRAVE;Ll;0;L;0072 030F;;;;N;;;0210;;0210 +0212;LATIN CAPITAL LETTER R WITH INVERTED BREVE;Lu;0;L;0052 0311;;;;N;;;;0213; +0213;LATIN SMALL LETTER R WITH INVERTED BREVE;Ll;0;L;0072 0311;;;;N;;;0212;;0212 +0214;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE;Lu;0;L;0055 030F;;;;N;;;;0215; +0215;LATIN SMALL LETTER U WITH DOUBLE GRAVE;Ll;0;L;0075 030F;;;;N;;;0214;;0214 +0216;LATIN CAPITAL LETTER U WITH INVERTED BREVE;Lu;0;L;0055 0311;;;;N;;;;0217; +0217;LATIN SMALL LETTER U WITH INVERTED BREVE;Ll;0;L;0075 0311;;;;N;;;0216;;0216 +0218;LATIN CAPITAL LETTER S WITH COMMA BELOW;Lu;0;L;0053 0326;;;;N;;;;0219; +0219;LATIN SMALL LETTER S WITH COMMA BELOW;Ll;0;L;0073 0326;;;;N;;;0218;;0218 +021A;LATIN CAPITAL LETTER T WITH COMMA BELOW;Lu;0;L;0054 0326;;;;N;;;;021B; +021B;LATIN SMALL LETTER T WITH COMMA BELOW;Ll;0;L;0074 0326;;;;N;;;021A;;021A +021C;LATIN CAPITAL LETTER YOGH;Lu;0;L;;;;;N;;;;021D; +021D;LATIN SMALL LETTER YOGH;Ll;0;L;;;;;N;;;021C;;021C +021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F; +021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E +0220;LATIN CAPITAL LETTER N WITH LONG RIGHT LEG;Lu;0;L;;;;;N;;;;019E; +0221;LATIN SMALL LETTER D WITH CURL;Ll;0;L;;;;;N;;;;; +0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223; +0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222 +0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225; +0225;LATIN SMALL LETTER Z WITH HOOK;Ll;0;L;;;;;N;;;0224;;0224 +0226;LATIN CAPITAL LETTER A WITH DOT ABOVE;Lu;0;L;0041 0307;;;;N;;;;0227; +0227;LATIN SMALL LETTER A WITH DOT ABOVE;Ll;0;L;0061 0307;;;;N;;;0226;;0226 +0228;LATIN CAPITAL LETTER E WITH CEDILLA;Lu;0;L;0045 0327;;;;N;;;;0229; +0229;LATIN SMALL LETTER E WITH CEDILLA;Ll;0;L;0065 0327;;;;N;;;0228;;0228 +022A;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON;Lu;0;L;00D6 0304;;;;N;;;;022B; +022B;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON;Ll;0;L;00F6 0304;;;;N;;;022A;;022A +022C;LATIN CAPITAL LETTER O WITH TILDE AND MACRON;Lu;0;L;00D5 0304;;;;N;;;;022D; +022D;LATIN SMALL LETTER O WITH TILDE AND MACRON;Ll;0;L;00F5 0304;;;;N;;;022C;;022C +022E;LATIN CAPITAL LETTER O WITH DOT ABOVE;Lu;0;L;004F 0307;;;;N;;;;022F; +022F;LATIN SMALL LETTER O WITH DOT ABOVE;Ll;0;L;006F 0307;;;;N;;;022E;;022E +0230;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON;Lu;0;L;022E 0304;;;;N;;;;0231; +0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230 +0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233; +0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232 +0234;LATIN SMALL LETTER L WITH CURL;Ll;0;L;;;;;N;;;;; +0235;LATIN SMALL LETTER N WITH CURL;Ll;0;L;;;;;N;;;;; +0236;LATIN SMALL LETTER T WITH CURL;Ll;0;L;;;;;N;;;;; +0237;LATIN SMALL LETTER DOTLESS J;Ll;0;L;;;;;N;;;;; +0238;LATIN SMALL LETTER DB DIGRAPH;Ll;0;L;;;;;N;;;;; +0239;LATIN SMALL LETTER QP DIGRAPH;Ll;0;L;;;;;N;;;;; +023A;LATIN CAPITAL LETTER A WITH STROKE;Lu;0;L;;;;;N;;;;2C65; +023B;LATIN CAPITAL LETTER C WITH STROKE;Lu;0;L;;;;;N;;;;023C; +023C;LATIN SMALL LETTER C WITH STROKE;Ll;0;L;;;;;N;;;023B;;023B +023D;LATIN CAPITAL LETTER L WITH BAR;Lu;0;L;;;;;N;;;;019A; +023E;LATIN CAPITAL LETTER T WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;2C66; +023F;LATIN SMALL LETTER S WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7E;;2C7E +0240;LATIN SMALL LETTER Z WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7F;;2C7F +0241;LATIN CAPITAL LETTER GLOTTAL STOP;Lu;0;L;;;;;N;;;;0242; +0242;LATIN SMALL LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;0241;;0241 +0243;LATIN CAPITAL LETTER B WITH STROKE;Lu;0;L;;;;;N;;;;0180; +0244;LATIN CAPITAL LETTER U BAR;Lu;0;L;;;;;N;;;;0289; +0245;LATIN CAPITAL LETTER TURNED V;Lu;0;L;;;;;N;;;;028C; +0246;LATIN CAPITAL LETTER E WITH STROKE;Lu;0;L;;;;;N;;;;0247; +0247;LATIN SMALL LETTER E WITH STROKE;Ll;0;L;;;;;N;;;0246;;0246 +0248;LATIN CAPITAL LETTER J WITH STROKE;Lu;0;L;;;;;N;;;;0249; +0249;LATIN SMALL LETTER J WITH STROKE;Ll;0;L;;;;;N;;;0248;;0248 +024A;LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL;Lu;0;L;;;;;N;;;;024B; +024B;LATIN SMALL LETTER Q WITH HOOK TAIL;Ll;0;L;;;;;N;;;024A;;024A +024C;LATIN CAPITAL LETTER R WITH STROKE;Lu;0;L;;;;;N;;;;024D; +024D;LATIN SMALL LETTER R WITH STROKE;Ll;0;L;;;;;N;;;024C;;024C +024E;LATIN CAPITAL LETTER Y WITH STROKE;Lu;0;L;;;;;N;;;;024F; +024F;LATIN SMALL LETTER Y WITH STROKE;Ll;0;L;;;;;N;;;024E;;024E +0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;2C6F;;2C6F +0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;2C6D;;2C6D +0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;2C70;;2C70 +0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181 +0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186 +0255;LATIN SMALL LETTER C WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER C CURL;;;; +0256;LATIN SMALL LETTER D WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER D RETROFLEX HOOK;;0189;;0189 +0257;LATIN SMALL LETTER D WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER D HOOK;;018A;;018A +0258;LATIN SMALL LETTER REVERSED E;Ll;0;L;;;;;N;;;;; +0259;LATIN SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;018F;;018F +025A;LATIN SMALL LETTER SCHWA WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCHWA HOOK;;;; +025B;LATIN SMALL LETTER OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER EPSILON;;0190;;0190 +025C;LATIN SMALL LETTER REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON;;;; +025D;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON HOOK;;;; +025E;LATIN SMALL LETTER CLOSED REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED REVERSED EPSILON;;;; +025F;LATIN SMALL LETTER DOTLESS J WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR;;;; +0260;LATIN SMALL LETTER G WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER G HOOK;;0193;;0193 +0261;LATIN SMALL LETTER SCRIPT G;Ll;0;L;;;;;N;;;;; +0262;LATIN LETTER SMALL CAPITAL G;Ll;0;L;;;;;N;;;;; +0263;LATIN SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0194;;0194 +0264;LATIN SMALL LETTER RAMS HORN;Ll;0;L;;;;;N;LATIN SMALL LETTER BABY GAMMA;;;; +0265;LATIN SMALL LETTER TURNED H;Ll;0;L;;;;;N;;;;; +0266;LATIN SMALL LETTER H WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER H HOOK;;;; +0267;LATIN SMALL LETTER HENG WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER HENG HOOK;;;; +0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197 +0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196 +026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;;; +026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;2C62;;2C62 +026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;;; +026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;; +026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;; +026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C +0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;; +0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;2C6E;;2C6E +0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D +0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;; +0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;; +0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F +0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;; +0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;; +0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;; +0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;; +027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;; +027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;; +027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;; +027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;2C64;;2C64 +027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;; +027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;; +0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;;01A6;;01A6 +0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;; +0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;;; +0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9 +0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;; +0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;; +0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;; +0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;;; +0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE +0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;0244;;0244 +028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1 +028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2 +028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;0245;;0245 +028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;; +028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;; +028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;; +0290;LATIN SMALL LETTER Z WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Z RETROFLEX HOOK;;;; +0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;; +0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7 +0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;; +0294;LATIN LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;; +0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;; +0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;; +0298;LATIN LETTER BILABIAL CLICK;Ll;0;L;;;;;N;LATIN LETTER BULLSEYE;;;; +0299;LATIN LETTER SMALL CAPITAL B;Ll;0;L;;;;;N;;;;; +029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;; +029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;; +029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;; +029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;;; +029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;;; +029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;; +02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;; +02A1;LATIN LETTER GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER GLOTTAL STOP BAR;;;; +02A2;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP BAR;;;; +02A3;LATIN SMALL LETTER DZ DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z;;;; +02A4;LATIN SMALL LETTER DEZH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D YOGH;;;; +02A5;LATIN SMALL LETTER DZ DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z CURL;;;; +02A6;LATIN SMALL LETTER TS DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T S;;;; +02A7;LATIN SMALL LETTER TESH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T ESH;;;; +02A8;LATIN SMALL LETTER TC DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER T C CURL;;;; +02A9;LATIN SMALL LETTER FENG DIGRAPH;Ll;0;L;;;;;N;;;;; +02AA;LATIN SMALL LETTER LS DIGRAPH;Ll;0;L;;;;;N;;;;; +02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;; +02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; +02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; +02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK;Ll;0;L;;;;;N;;;;; +02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;Ll;0;L;;;;;N;;;;; +02B0;MODIFIER LETTER SMALL H;Lm;0;L;<super> 0068;;;;N;;;;; +02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L;<super> 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;; +02B2;MODIFIER LETTER SMALL J;Lm;0;L;<super> 006A;;;;N;;;;; +02B3;MODIFIER LETTER SMALL R;Lm;0;L;<super> 0072;;;;N;;;;; +02B4;MODIFIER LETTER SMALL TURNED R;Lm;0;L;<super> 0279;;;;N;;;;; +02B5;MODIFIER LETTER SMALL TURNED R WITH HOOK;Lm;0;L;<super> 027B;;;;N;MODIFIER LETTER SMALL TURNED R HOOK;;;; +02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L;<super> 0281;;;;N;;;;; +02B7;MODIFIER LETTER SMALL W;Lm;0;L;<super> 0077;;;;N;;;;; +02B8;MODIFIER LETTER SMALL Y;Lm;0;L;<super> 0079;;;;N;;;;; +02B9;MODIFIER LETTER PRIME;Lm;0;ON;;;;;N;;;;; +02BA;MODIFIER LETTER DOUBLE PRIME;Lm;0;ON;;;;;N;;;;; +02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;; +02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;; +02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;; +02BE;MODIFIER LETTER RIGHT HALF RING;Lm;0;L;;;;;N;;;;; +02BF;MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; +02C0;MODIFIER LETTER GLOTTAL STOP;Lm;0;L;;;;;N;;;;; +02C1;MODIFIER LETTER REVERSED GLOTTAL STOP;Lm;0;L;;;;;N;;;;; +02C2;MODIFIER LETTER LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;; +02C7;CARON;Lm;0;ON;;;;;N;MODIFIER LETTER HACEK;;;; +02C8;MODIFIER LETTER VERTICAL LINE;Lm;0;ON;;;;;N;;;;; +02C9;MODIFIER LETTER MACRON;Lm;0;ON;;;;;N;;;;; +02CA;MODIFIER LETTER ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER ACUTE;;;; +02CB;MODIFIER LETTER GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER GRAVE;;;; +02CC;MODIFIER LETTER LOW VERTICAL LINE;Lm;0;ON;;;;;N;;;;; +02CD;MODIFIER LETTER LOW MACRON;Lm;0;ON;;;;;N;;;;; +02CE;MODIFIER LETTER LOW GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;; +02CF;MODIFIER LETTER LOW ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;; +02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; +02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; +02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;; +02D3;MODIFIER LETTER CENTRED LEFT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED LEFT HALF RING;;;; +02D4;MODIFIER LETTER UP TACK;Sk;0;ON;;;;;N;;;;; +02D5;MODIFIER LETTER DOWN TACK;Sk;0;ON;;;;;N;;;;; +02D6;MODIFIER LETTER PLUS SIGN;Sk;0;ON;;;;;N;;;;; +02D7;MODIFIER LETTER MINUS SIGN;Sk;0;ON;;;;;N;;;;; +02D8;BREVE;Sk;0;ON;<compat> 0020 0306;;;;N;SPACING BREVE;;;; +02D9;DOT ABOVE;Sk;0;ON;<compat> 0020 0307;;;;N;SPACING DOT ABOVE;;;; +02DA;RING ABOVE;Sk;0;ON;<compat> 0020 030A;;;;N;SPACING RING ABOVE;;;; +02DB;OGONEK;Sk;0;ON;<compat> 0020 0328;;;;N;SPACING OGONEK;;;; +02DC;SMALL TILDE;Sk;0;ON;<compat> 0020 0303;;;;N;SPACING TILDE;;;; +02DD;DOUBLE ACUTE ACCENT;Sk;0;ON;<compat> 0020 030B;;;;N;SPACING DOUBLE ACUTE;;;; +02DE;MODIFIER LETTER RHOTIC HOOK;Sk;0;ON;;;;;N;;;;; +02DF;MODIFIER LETTER CROSS ACCENT;Sk;0;ON;;;;;N;;;;; +02E0;MODIFIER LETTER SMALL GAMMA;Lm;0;L;<super> 0263;;;;N;;;;; +02E1;MODIFIER LETTER SMALL L;Lm;0;L;<super> 006C;;;;N;;;;; +02E2;MODIFIER LETTER SMALL S;Lm;0;L;<super> 0073;;;;N;;;;; +02E3;MODIFIER LETTER SMALL X;Lm;0;L;<super> 0078;;;;N;;;;; +02E4;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP;Lm;0;L;<super> 0295;;;;N;;;;; +02E5;MODIFIER LETTER EXTRA-HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; +02E6;MODIFIER LETTER HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; +02E7;MODIFIER LETTER MID TONE BAR;Sk;0;ON;;;;;N;;;;; +02E8;MODIFIER LETTER LOW TONE BAR;Sk;0;ON;;;;;N;;;;; +02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;; +02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; +02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; +02EC;MODIFIER LETTER VOICING;Lm;0;ON;;;;;N;;;;; +02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;; +02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;; +02EF;MODIFIER LETTER LOW DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F0;MODIFIER LETTER LOW UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F1;MODIFIER LETTER LOW LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F2;MODIFIER LETTER LOW RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F3;MODIFIER LETTER LOW RING;Sk;0;ON;;;;;N;;;;; +02F4;MODIFIER LETTER MIDDLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;; +02F5;MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;; +02F6;MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT;Sk;0;ON;;;;;N;;;;; +02F7;MODIFIER LETTER LOW TILDE;Sk;0;ON;;;;;N;;;;; +02F8;MODIFIER LETTER RAISED COLON;Sk;0;ON;;;;;N;;;;; +02F9;MODIFIER LETTER BEGIN HIGH TONE;Sk;0;ON;;;;;N;;;;; +02FA;MODIFIER LETTER END HIGH TONE;Sk;0;ON;;;;;N;;;;; +02FB;MODIFIER LETTER BEGIN LOW TONE;Sk;0;ON;;;;;N;;;;; +02FC;MODIFIER LETTER END LOW TONE;Sk;0;ON;;;;;N;;;;; +02FD;MODIFIER LETTER SHELF;Sk;0;ON;;;;;N;;;;; +02FE;MODIFIER LETTER OPEN SHELF;Sk;0;ON;;;;;N;;;;; +02FF;MODIFIER LETTER LOW LEFT ARROW;Sk;0;ON;;;;;N;;;;; +0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;;;; +0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;;;; +0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;; +0303;COMBINING TILDE;Mn;230;NSM;;;;;N;NON-SPACING TILDE;;;; +0304;COMBINING MACRON;Mn;230;NSM;;;;;N;NON-SPACING MACRON;;;; +0305;COMBINING OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING OVERSCORE;;;; +0306;COMBINING BREVE;Mn;230;NSM;;;;;N;NON-SPACING BREVE;;;; +0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;; +0308;COMBINING DIAERESIS;Mn;230;NSM;;;;;N;NON-SPACING DIAERESIS;;;; +0309;COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;NON-SPACING HOOK ABOVE;;;; +030A;COMBINING RING ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RING ABOVE;;;; +030B;COMBINING DOUBLE ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE ACUTE;;;; +030C;COMBINING CARON;Mn;230;NSM;;;;;N;NON-SPACING HACEK;;;; +030D;COMBINING VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL LINE ABOVE;;;; +030E;COMBINING DOUBLE VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE VERTICAL LINE ABOVE;;;; +030F;COMBINING DOUBLE GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE GRAVE;;;; +0310;COMBINING CANDRABINDU;Mn;230;NSM;;;;;N;NON-SPACING CANDRABINDU;;;; +0311;COMBINING INVERTED BREVE;Mn;230;NSM;;;;;N;NON-SPACING INVERTED BREVE;;;; +0312;COMBINING TURNED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING TURNED COMMA ABOVE;;;; +0313;COMBINING COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING COMMA ABOVE;;;; +0314;COMBINING REVERSED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING REVERSED COMMA ABOVE;;;; +0315;COMBINING COMMA ABOVE RIGHT;Mn;232;NSM;;;;;N;NON-SPACING COMMA ABOVE RIGHT;;;; +0316;COMBINING GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING GRAVE BELOW;;;; +0317;COMBINING ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING ACUTE BELOW;;;; +0318;COMBINING LEFT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT TACK BELOW;;;; +0319;COMBINING RIGHT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT TACK BELOW;;;; +031A;COMBINING LEFT ANGLE ABOVE;Mn;232;NSM;;;;;N;NON-SPACING LEFT ANGLE ABOVE;;;; +031B;COMBINING HORN;Mn;216;NSM;;;;;N;NON-SPACING HORN;;;; +031C;COMBINING LEFT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT HALF RING BELOW;;;; +031D;COMBINING UP TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING UP TACK BELOW;;;; +031E;COMBINING DOWN TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOWN TACK BELOW;;;; +031F;COMBINING PLUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING PLUS SIGN BELOW;;;; +0320;COMBINING MINUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING MINUS SIGN BELOW;;;; +0321;COMBINING PALATALIZED HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING PALATALIZED HOOK BELOW;;;; +0322;COMBINING RETROFLEX HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING RETROFLEX HOOK BELOW;;;; +0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;; +0324;COMBINING DIAERESIS BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE DOT BELOW;;;; +0325;COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;; +0326;COMBINING COMMA BELOW;Mn;220;NSM;;;;;N;NON-SPACING COMMA BELOW;;;; +0327;COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;; +0328;COMBINING OGONEK;Mn;202;NSM;;;;;N;NON-SPACING OGONEK;;;; +0329;COMBINING VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;NON-SPACING VERTICAL LINE BELOW;;;; +032A;COMBINING BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BRIDGE BELOW;;;; +032B;COMBINING INVERTED DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED DOUBLE ARCH BELOW;;;; +032C;COMBINING CARON BELOW;Mn;220;NSM;;;;;N;NON-SPACING HACEK BELOW;;;; +032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;; +032E;COMBINING BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BREVE BELOW;;;; +032F;COMBINING INVERTED BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BREVE BELOW;;;; +0330;COMBINING TILDE BELOW;Mn;220;NSM;;;;;N;NON-SPACING TILDE BELOW;;;; +0331;COMBINING MACRON BELOW;Mn;220;NSM;;;;;N;NON-SPACING MACRON BELOW;;;; +0332;COMBINING LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING UNDERSCORE;;;; +0333;COMBINING DOUBLE LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE UNDERSCORE;;;; +0334;COMBINING TILDE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING TILDE OVERLAY;;;; +0335;COMBINING SHORT STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT BAR OVERLAY;;;; +0336;COMBINING LONG STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG BAR OVERLAY;;;; +0337;COMBINING SHORT SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT SLASH OVERLAY;;;; +0338;COMBINING LONG SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG SLASH OVERLAY;;;; +0339;COMBINING RIGHT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT HALF RING BELOW;;;; +033A;COMBINING INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BRIDGE BELOW;;;; +033B;COMBINING SQUARE BELOW;Mn;220;NSM;;;;;N;NON-SPACING SQUARE BELOW;;;; +033C;COMBINING SEAGULL BELOW;Mn;220;NSM;;;;;N;NON-SPACING SEAGULL BELOW;;;; +033D;COMBINING X ABOVE;Mn;230;NSM;;;;;N;NON-SPACING X ABOVE;;;; +033E;COMBINING VERTICAL TILDE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL TILDE;;;; +033F;COMBINING DOUBLE OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE OVERSCORE;;;; +0340;COMBINING GRAVE TONE MARK;Mn;230;NSM;0300;;;;N;NON-SPACING GRAVE TONE MARK;;;; +0341;COMBINING ACUTE TONE MARK;Mn;230;NSM;0301;;;;N;NON-SPACING ACUTE TONE MARK;;;; +0342;COMBINING GREEK PERISPOMENI;Mn;230;NSM;;;;;N;;;;; +0343;COMBINING GREEK KORONIS;Mn;230;NSM;0313;;;;N;;;;; +0344;COMBINING GREEK DIALYTIKA TONOS;Mn;230;NSM;0308 0301;;;;N;GREEK NON-SPACING DIAERESIS TONOS;;;; +0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA BELOW;;0399;;0399 +0346;COMBINING BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; +0347;COMBINING EQUALS SIGN BELOW;Mn;220;NSM;;;;;N;;;;; +0348;COMBINING DOUBLE VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;;;;; +0349;COMBINING LEFT ANGLE BELOW;Mn;220;NSM;;;;;N;;;;; +034A;COMBINING NOT TILDE ABOVE;Mn;230;NSM;;;;;N;;;;; +034B;COMBINING HOMOTHETIC ABOVE;Mn;230;NSM;;;;;N;;;;; +034C;COMBINING ALMOST EQUAL TO ABOVE;Mn;230;NSM;;;;;N;;;;; +034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +034F;COMBINING GRAPHEME JOINER;Mn;0;NSM;;;;;N;;;;; +0350;COMBINING RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +0351;COMBINING LEFT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; +0352;COMBINING FERMATA;Mn;230;NSM;;;;;N;;;;; +0353;COMBINING X BELOW;Mn;220;NSM;;;;;N;;;;; +0354;COMBINING LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0355;COMBINING RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0356;COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0357;COMBINING RIGHT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; +0358;COMBINING DOT ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;; +0359;COMBINING ASTERISK BELOW;Mn;220;NSM;;;;;N;;;;; +035A;COMBINING DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; +035B;COMBINING ZIGZAG ABOVE;Mn;230;NSM;;;;;N;;;;; +035C;COMBINING DOUBLE BREVE BELOW;Mn;233;NSM;;;;;N;;;;; +035D;COMBINING DOUBLE BREVE;Mn;234;NSM;;;;;N;;;;; +035E;COMBINING DOUBLE MACRON;Mn;234;NSM;;;;;N;;;;; +035F;COMBINING DOUBLE MACRON BELOW;Mn;233;NSM;;;;;N;;;;; +0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;; +0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;; +0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;; +0363;COMBINING LATIN SMALL LETTER A;Mn;230;NSM;;;;;N;;;;; +0364;COMBINING LATIN SMALL LETTER E;Mn;230;NSM;;;;;N;;;;; +0365;COMBINING LATIN SMALL LETTER I;Mn;230;NSM;;;;;N;;;;; +0366;COMBINING LATIN SMALL LETTER O;Mn;230;NSM;;;;;N;;;;; +0367;COMBINING LATIN SMALL LETTER U;Mn;230;NSM;;;;;N;;;;; +0368;COMBINING LATIN SMALL LETTER C;Mn;230;NSM;;;;;N;;;;; +0369;COMBINING LATIN SMALL LETTER D;Mn;230;NSM;;;;;N;;;;; +036A;COMBINING LATIN SMALL LETTER H;Mn;230;NSM;;;;;N;;;;; +036B;COMBINING LATIN SMALL LETTER M;Mn;230;NSM;;;;;N;;;;; +036C;COMBINING LATIN SMALL LETTER R;Mn;230;NSM;;;;;N;;;;; +036D;COMBINING LATIN SMALL LETTER T;Mn;230;NSM;;;;;N;;;;; +036E;COMBINING LATIN SMALL LETTER V;Mn;230;NSM;;;;;N;;;;; +036F;COMBINING LATIN SMALL LETTER X;Mn;230;NSM;;;;;N;;;;; +0370;GREEK CAPITAL LETTER HETA;Lu;0;L;;;;;N;;;;0371; +0371;GREEK SMALL LETTER HETA;Ll;0;L;;;;;N;;;0370;;0370 +0372;GREEK CAPITAL LETTER ARCHAIC SAMPI;Lu;0;L;;;;;N;;;;0373; +0373;GREEK SMALL LETTER ARCHAIC SAMPI;Ll;0;L;;;;;N;;;0372;;0372 +0374;GREEK NUMERAL SIGN;Lm;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;;;; +0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;;;; +0376;GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA;Lu;0;L;;;;;N;;;;0377; +0377;GREEK SMALL LETTER PAMPHYLIAN DIGAMMA;Ll;0;L;;;;;N;;;0376;;0376 +037A;GREEK YPOGEGRAMMENI;Lm;0;L;<compat> 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;; +037B;GREEK SMALL REVERSED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FD;;03FD +037C;GREEK SMALL DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FE;;03FE +037D;GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FF;;03FF +037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;;;; +0384;GREEK TONOS;Sk;0;ON;<compat> 0020 0301;;;;N;GREEK SPACING TONOS;;;; +0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;; +0386;GREEK CAPITAL LETTER ALPHA WITH TONOS;Lu;0;L;0391 0301;;;;N;GREEK CAPITAL LETTER ALPHA TONOS;;;03AC; +0387;GREEK ANO TELEIA;Po;0;ON;00B7;;;;N;;;;; +0388;GREEK CAPITAL LETTER EPSILON WITH TONOS;Lu;0;L;0395 0301;;;;N;GREEK CAPITAL LETTER EPSILON TONOS;;;03AD; +0389;GREEK CAPITAL LETTER ETA WITH TONOS;Lu;0;L;0397 0301;;;;N;GREEK CAPITAL LETTER ETA TONOS;;;03AE; +038A;GREEK CAPITAL LETTER IOTA WITH TONOS;Lu;0;L;0399 0301;;;;N;GREEK CAPITAL LETTER IOTA TONOS;;;03AF; +038C;GREEK CAPITAL LETTER OMICRON WITH TONOS;Lu;0;L;039F 0301;;;;N;GREEK CAPITAL LETTER OMICRON TONOS;;;03CC; +038E;GREEK CAPITAL LETTER UPSILON WITH TONOS;Lu;0;L;03A5 0301;;;;N;GREEK CAPITAL LETTER UPSILON TONOS;;;03CD; +038F;GREEK CAPITAL LETTER OMEGA WITH TONOS;Lu;0;L;03A9 0301;;;;N;GREEK CAPITAL LETTER OMEGA TONOS;;;03CE; +0390;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS;Ll;0;L;03CA 0301;;;;N;GREEK SMALL LETTER IOTA DIAERESIS TONOS;;;; +0391;GREEK CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;03B1; +0392;GREEK CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;03B2; +0393;GREEK CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;03B3; +0394;GREEK CAPITAL LETTER DELTA;Lu;0;L;;;;;N;;;;03B4; +0395;GREEK CAPITAL LETTER EPSILON;Lu;0;L;;;;;N;;;;03B5; +0396;GREEK CAPITAL LETTER ZETA;Lu;0;L;;;;;N;;;;03B6; +0397;GREEK CAPITAL LETTER ETA;Lu;0;L;;;;;N;;;;03B7; +0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8; +0399;GREEK CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;03B9; +039A;GREEK CAPITAL LETTER KAPPA;Lu;0;L;;;;;N;;;;03BA; +039B;GREEK CAPITAL LETTER LAMDA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER LAMBDA;;;03BB; +039C;GREEK CAPITAL LETTER MU;Lu;0;L;;;;;N;;;;03BC; +039D;GREEK CAPITAL LETTER NU;Lu;0;L;;;;;N;;;;03BD; +039E;GREEK CAPITAL LETTER XI;Lu;0;L;;;;;N;;;;03BE; +039F;GREEK CAPITAL LETTER OMICRON;Lu;0;L;;;;;N;;;;03BF; +03A0;GREEK CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;03C0; +03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1; +03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3; +03A4;GREEK CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;03C4; +03A5;GREEK CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;03C5; +03A6;GREEK CAPITAL LETTER PHI;Lu;0;L;;;;;N;;;;03C6; +03A7;GREEK CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;03C7; +03A8;GREEK CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;03C8; +03A9;GREEK CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;03C9; +03AA;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA;Lu;0;L;0399 0308;;;;N;GREEK CAPITAL LETTER IOTA DIAERESIS;;;03CA; +03AB;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA;Lu;0;L;03A5 0308;;;;N;GREEK CAPITAL LETTER UPSILON DIAERESIS;;;03CB; +03AC;GREEK SMALL LETTER ALPHA WITH TONOS;Ll;0;L;03B1 0301;;;;N;GREEK SMALL LETTER ALPHA TONOS;;0386;;0386 +03AD;GREEK SMALL LETTER EPSILON WITH TONOS;Ll;0;L;03B5 0301;;;;N;GREEK SMALL LETTER EPSILON TONOS;;0388;;0388 +03AE;GREEK SMALL LETTER ETA WITH TONOS;Ll;0;L;03B7 0301;;;;N;GREEK SMALL LETTER ETA TONOS;;0389;;0389 +03AF;GREEK SMALL LETTER IOTA WITH TONOS;Ll;0;L;03B9 0301;;;;N;GREEK SMALL LETTER IOTA TONOS;;038A;;038A +03B0;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS;Ll;0;L;03CB 0301;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS TONOS;;;; +03B1;GREEK SMALL LETTER ALPHA;Ll;0;L;;;;;N;;;0391;;0391 +03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392 +03B3;GREEK SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0393;;0393 +03B4;GREEK SMALL LETTER DELTA;Ll;0;L;;;;;N;;;0394;;0394 +03B5;GREEK SMALL LETTER EPSILON;Ll;0;L;;;;;N;;;0395;;0395 +03B6;GREEK SMALL LETTER ZETA;Ll;0;L;;;;;N;;;0396;;0396 +03B7;GREEK SMALL LETTER ETA;Ll;0;L;;;;;N;;;0397;;0397 +03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398 +03B9;GREEK SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0399;;0399 +03BA;GREEK SMALL LETTER KAPPA;Ll;0;L;;;;;N;;;039A;;039A +03BB;GREEK SMALL LETTER LAMDA;Ll;0;L;;;;;N;GREEK SMALL LETTER LAMBDA;;039B;;039B +03BC;GREEK SMALL LETTER MU;Ll;0;L;;;;;N;;;039C;;039C +03BD;GREEK SMALL LETTER NU;Ll;0;L;;;;;N;;;039D;;039D +03BE;GREEK SMALL LETTER XI;Ll;0;L;;;;;N;;;039E;;039E +03BF;GREEK SMALL LETTER OMICRON;Ll;0;L;;;;;N;;;039F;;039F +03C0;GREEK SMALL LETTER PI;Ll;0;L;;;;;N;;;03A0;;03A0 +03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1 +03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 +03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 +03C4;GREEK SMALL LETTER TAU;Ll;0;L;;;;;N;;;03A4;;03A4 +03C5;GREEK SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;03A5;;03A5 +03C6;GREEK SMALL LETTER PHI;Ll;0;L;;;;;N;;;03A6;;03A6 +03C7;GREEK SMALL LETTER CHI;Ll;0;L;;;;;N;;;03A7;;03A7 +03C8;GREEK SMALL LETTER PSI;Ll;0;L;;;;;N;;;03A8;;03A8 +03C9;GREEK SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;03A9;;03A9 +03CA;GREEK SMALL LETTER IOTA WITH DIALYTIKA;Ll;0;L;03B9 0308;;;;N;GREEK SMALL LETTER IOTA DIAERESIS;;03AA;;03AA +03CB;GREEK SMALL LETTER UPSILON WITH DIALYTIKA;Ll;0;L;03C5 0308;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS;;03AB;;03AB +03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C +03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E +03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F +03CF;GREEK CAPITAL KAI SYMBOL;Lu;0;L;;;;;N;;;;03D7; +03D0;GREEK BETA SYMBOL;Ll;0;L;<compat> 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392 +03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398 +03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L;<compat> 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;; +03D3;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL;Lu;0;L;03D2 0301;;;;N;GREEK CAPITAL LETTER UPSILON HOOK TONOS;;;; +03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;; +03D5;GREEK PHI SYMBOL;Ll;0;L;<compat> 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6 +03D6;GREEK PI SYMBOL;Ll;0;L;<compat> 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0 +03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;03CF;;03CF +03D8;GREEK LETTER ARCHAIC KOPPA;Lu;0;L;;;;;N;;;;03D9; +03D9;GREEK SMALL LETTER ARCHAIC KOPPA;Ll;0;L;;;;;N;;;03D8;;03D8 +03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB; +03DB;GREEK SMALL LETTER STIGMA;Ll;0;L;;;;;N;;;03DA;;03DA +03DC;GREEK LETTER DIGAMMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DIGAMMA;;;03DD; +03DD;GREEK SMALL LETTER DIGAMMA;Ll;0;L;;;;;N;;;03DC;;03DC +03DE;GREEK LETTER KOPPA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KOPPA;;;03DF; +03DF;GREEK SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;03DE;;03DE +03E0;GREEK LETTER SAMPI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SAMPI;;;03E1; +03E1;GREEK SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;03E0;;03E0 +03E2;COPTIC CAPITAL LETTER SHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHEI;;;03E3; +03E3;COPTIC SMALL LETTER SHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER SHEI;;03E2;;03E2 +03E4;COPTIC CAPITAL LETTER FEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER FEI;;;03E5; +03E5;COPTIC SMALL LETTER FEI;Ll;0;L;;;;;N;GREEK SMALL LETTER FEI;;03E4;;03E4 +03E6;COPTIC CAPITAL LETTER KHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KHEI;;;03E7; +03E7;COPTIC SMALL LETTER KHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER KHEI;;03E6;;03E6 +03E8;COPTIC CAPITAL LETTER HORI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER HORI;;;03E9; +03E9;COPTIC SMALL LETTER HORI;Ll;0;L;;;;;N;GREEK SMALL LETTER HORI;;03E8;;03E8 +03EA;COPTIC CAPITAL LETTER GANGIA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER GANGIA;;;03EB; +03EB;COPTIC SMALL LETTER GANGIA;Ll;0;L;;;;;N;GREEK SMALL LETTER GANGIA;;03EA;;03EA +03EC;COPTIC CAPITAL LETTER SHIMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHIMA;;;03ED; +03ED;COPTIC SMALL LETTER SHIMA;Ll;0;L;;;;;N;GREEK SMALL LETTER SHIMA;;03EC;;03EC +03EE;COPTIC CAPITAL LETTER DEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DEI;;;03EF; +03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE +03F0;GREEK KAPPA SYMBOL;Ll;0;L;<compat> 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A +03F1;GREEK RHO SYMBOL;Ll;0;L;<compat> 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1 +03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L;<compat> 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03F9;;03F9 +03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;;; +03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L;<compat> 0398;;;;N;;;;03B8; +03F5;GREEK LUNATE EPSILON SYMBOL;Ll;0;L;<compat> 03B5;;;;N;;;0395;;0395 +03F6;GREEK REVERSED LUNATE EPSILON SYMBOL;Sm;0;ON;;;;;N;;;;; +03F7;GREEK CAPITAL LETTER SHO;Lu;0;L;;;;;N;;;;03F8; +03F8;GREEK SMALL LETTER SHO;Ll;0;L;;;;;N;;;03F7;;03F7 +03F9;GREEK CAPITAL LUNATE SIGMA SYMBOL;Lu;0;L;<compat> 03A3;;;;N;;;;03F2; +03FA;GREEK CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;03FB; +03FB;GREEK SMALL LETTER SAN;Ll;0;L;;;;;N;;;03FA;;03FA +03FC;GREEK RHO WITH STROKE SYMBOL;Ll;0;L;;;;;N;;;;; +03FD;GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037B; +03FE;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037C; +03FF;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037D; +0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450; +0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451; +0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;;;0452; +0403;CYRILLIC CAPITAL LETTER GJE;Lu;0;L;0413 0301;;;;N;;;;0453; +0404;CYRILLIC CAPITAL LETTER UKRAINIAN IE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER E;;;0454; +0405;CYRILLIC CAPITAL LETTER DZE;Lu;0;L;;;;;N;;;;0455; +0406;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER I;;;0456; +0407;CYRILLIC CAPITAL LETTER YI;Lu;0;L;0406 0308;;;;N;;;;0457; +0408;CYRILLIC CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;0458; +0409;CYRILLIC CAPITAL LETTER LJE;Lu;0;L;;;;;N;;;;0459; +040A;CYRILLIC CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;045A; +040B;CYRILLIC CAPITAL LETTER TSHE;Lu;0;L;;;;;N;;;;045B; +040C;CYRILLIC CAPITAL LETTER KJE;Lu;0;L;041A 0301;;;;N;;;;045C; +040D;CYRILLIC CAPITAL LETTER I WITH GRAVE;Lu;0;L;0418 0300;;;;N;;;;045D; +040E;CYRILLIC CAPITAL LETTER SHORT U;Lu;0;L;0423 0306;;;;N;;;;045E; +040F;CYRILLIC CAPITAL LETTER DZHE;Lu;0;L;;;;;N;;;;045F; +0410;CYRILLIC CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0430; +0411;CYRILLIC CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;0431; +0412;CYRILLIC CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;0432; +0413;CYRILLIC CAPITAL LETTER GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE;;;0433; +0414;CYRILLIC CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;0434; +0415;CYRILLIC CAPITAL LETTER IE;Lu;0;L;;;;;N;;;;0435; +0416;CYRILLIC CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;0436; +0417;CYRILLIC CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;0437; +0418;CYRILLIC CAPITAL LETTER I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER II;;;0438; +0419;CYRILLIC CAPITAL LETTER SHORT I;Lu;0;L;0418 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT II;;;0439; +041A;CYRILLIC CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;043A; +041B;CYRILLIC CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;043B; +041C;CYRILLIC CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;043C; +041D;CYRILLIC CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;043D; +041E;CYRILLIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;043E; +041F;CYRILLIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;043F; +0420;CYRILLIC CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;0440; +0421;CYRILLIC CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;0441; +0422;CYRILLIC CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;0442; +0423;CYRILLIC CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0443; +0424;CYRILLIC CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;0444; +0425;CYRILLIC CAPITAL LETTER HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA;;;0445; +0426;CYRILLIC CAPITAL LETTER TSE;Lu;0;L;;;;;N;;;;0446; +0427;CYRILLIC CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;0447; +0428;CYRILLIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0448; +0429;CYRILLIC CAPITAL LETTER SHCHA;Lu;0;L;;;;;N;;;;0449; +042A;CYRILLIC CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;044A; +042B;CYRILLIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER YERI;;;044B; +042C;CYRILLIC CAPITAL LETTER SOFT SIGN;Lu;0;L;;;;;N;;;;044C; +042D;CYRILLIC CAPITAL LETTER E;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED E;;;044D; +042E;CYRILLIC CAPITAL LETTER YU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IU;;;044E; +042F;CYRILLIC CAPITAL LETTER YA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IA;;;044F; +0430;CYRILLIC SMALL LETTER A;Ll;0;L;;;;;N;;;0410;;0410 +0431;CYRILLIC SMALL LETTER BE;Ll;0;L;;;;;N;;;0411;;0411 +0432;CYRILLIC SMALL LETTER VE;Ll;0;L;;;;;N;;;0412;;0412 +0433;CYRILLIC SMALL LETTER GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE;;0413;;0413 +0434;CYRILLIC SMALL LETTER DE;Ll;0;L;;;;;N;;;0414;;0414 +0435;CYRILLIC SMALL LETTER IE;Ll;0;L;;;;;N;;;0415;;0415 +0436;CYRILLIC SMALL LETTER ZHE;Ll;0;L;;;;;N;;;0416;;0416 +0437;CYRILLIC SMALL LETTER ZE;Ll;0;L;;;;;N;;;0417;;0417 +0438;CYRILLIC SMALL LETTER I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER II;;0418;;0418 +0439;CYRILLIC SMALL LETTER SHORT I;Ll;0;L;0438 0306;;;;N;CYRILLIC SMALL LETTER SHORT II;;0419;;0419 +043A;CYRILLIC SMALL LETTER KA;Ll;0;L;;;;;N;;;041A;;041A +043B;CYRILLIC SMALL LETTER EL;Ll;0;L;;;;;N;;;041B;;041B +043C;CYRILLIC SMALL LETTER EM;Ll;0;L;;;;;N;;;041C;;041C +043D;CYRILLIC SMALL LETTER EN;Ll;0;L;;;;;N;;;041D;;041D +043E;CYRILLIC SMALL LETTER O;Ll;0;L;;;;;N;;;041E;;041E +043F;CYRILLIC SMALL LETTER PE;Ll;0;L;;;;;N;;;041F;;041F +0440;CYRILLIC SMALL LETTER ER;Ll;0;L;;;;;N;;;0420;;0420 +0441;CYRILLIC SMALL LETTER ES;Ll;0;L;;;;;N;;;0421;;0421 +0442;CYRILLIC SMALL LETTER TE;Ll;0;L;;;;;N;;;0422;;0422 +0443;CYRILLIC SMALL LETTER U;Ll;0;L;;;;;N;;;0423;;0423 +0444;CYRILLIC SMALL LETTER EF;Ll;0;L;;;;;N;;;0424;;0424 +0445;CYRILLIC SMALL LETTER HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA;;0425;;0425 +0446;CYRILLIC SMALL LETTER TSE;Ll;0;L;;;;;N;;;0426;;0426 +0447;CYRILLIC SMALL LETTER CHE;Ll;0;L;;;;;N;;;0427;;0427 +0448;CYRILLIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;0428;;0428 +0449;CYRILLIC SMALL LETTER SHCHA;Ll;0;L;;;;;N;;;0429;;0429 +044A;CYRILLIC SMALL LETTER HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A +044B;CYRILLIC SMALL LETTER YERU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER YERI;;042B;;042B +044C;CYRILLIC SMALL LETTER SOFT SIGN;Ll;0;L;;;;;N;;;042C;;042C +044D;CYRILLIC SMALL LETTER E;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED E;;042D;;042D +044E;CYRILLIC SMALL LETTER YU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IU;;042E;;042E +044F;CYRILLIC SMALL LETTER YA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IA;;042F;;042F +0450;CYRILLIC SMALL LETTER IE WITH GRAVE;Ll;0;L;0435 0300;;;;N;;;0400;;0400 +0451;CYRILLIC SMALL LETTER IO;Ll;0;L;0435 0308;;;;N;;;0401;;0401 +0452;CYRILLIC SMALL LETTER DJE;Ll;0;L;;;;;N;;;0402;;0402 +0453;CYRILLIC SMALL LETTER GJE;Ll;0;L;0433 0301;;;;N;;;0403;;0403 +0454;CYRILLIC SMALL LETTER UKRAINIAN IE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER E;;0404;;0404 +0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405 +0456;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER I;;0406;;0406 +0457;CYRILLIC SMALL LETTER YI;Ll;0;L;0456 0308;;;;N;;;0407;;0407 +0458;CYRILLIC SMALL LETTER JE;Ll;0;L;;;;;N;;;0408;;0408 +0459;CYRILLIC SMALL LETTER LJE;Ll;0;L;;;;;N;;;0409;;0409 +045A;CYRILLIC SMALL LETTER NJE;Ll;0;L;;;;;N;;;040A;;040A +045B;CYRILLIC SMALL LETTER TSHE;Ll;0;L;;;;;N;;;040B;;040B +045C;CYRILLIC SMALL LETTER KJE;Ll;0;L;043A 0301;;;;N;;;040C;;040C +045D;CYRILLIC SMALL LETTER I WITH GRAVE;Ll;0;L;0438 0300;;;;N;;;040D;;040D +045E;CYRILLIC SMALL LETTER SHORT U;Ll;0;L;0443 0306;;;;N;;;040E;;040E +045F;CYRILLIC SMALL LETTER DZHE;Ll;0;L;;;;;N;;;040F;;040F +0460;CYRILLIC CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;0461; +0461;CYRILLIC SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;0460;;0460 +0462;CYRILLIC CAPITAL LETTER YAT;Lu;0;L;;;;;N;;;;0463; +0463;CYRILLIC SMALL LETTER YAT;Ll;0;L;;;;;N;;;0462;;0462 +0464;CYRILLIC CAPITAL LETTER IOTIFIED E;Lu;0;L;;;;;N;;;;0465; +0465;CYRILLIC SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;0464;;0464 +0466;CYRILLIC CAPITAL LETTER LITTLE YUS;Lu;0;L;;;;;N;;;;0467; +0467;CYRILLIC SMALL LETTER LITTLE YUS;Ll;0;L;;;;;N;;;0466;;0466 +0468;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS;Lu;0;L;;;;;N;;;;0469; +0469;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS;Ll;0;L;;;;;N;;;0468;;0468 +046A;CYRILLIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;046B; +046B;CYRILLIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;046A;;046A +046C;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS;Lu;0;L;;;;;N;;;;046D; +046D;CYRILLIC SMALL LETTER IOTIFIED BIG YUS;Ll;0;L;;;;;N;;;046C;;046C +046E;CYRILLIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;046F; +046F;CYRILLIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;046E;;046E +0470;CYRILLIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;0471; +0471;CYRILLIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;0470;;0470 +0472;CYRILLIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;0473; +0473;CYRILLIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;0472;;0472 +0474;CYRILLIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;0475; +0475;CYRILLIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;0474;;0474 +0476;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Lu;0;L;0474 030F;;;;N;CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE;;;0477; +0477;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Ll;0;L;0475 030F;;;;N;CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE;;0476;;0476 +0478;CYRILLIC CAPITAL LETTER UK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER UK DIGRAPH;;;0479; +0479;CYRILLIC SMALL LETTER UK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER UK DIGRAPH;;0478;;0478 +047A;CYRILLIC CAPITAL LETTER ROUND OMEGA;Lu;0;L;;;;;N;;;;047B; +047B;CYRILLIC SMALL LETTER ROUND OMEGA;Ll;0;L;;;;;N;;;047A;;047A +047C;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER OMEGA TITLO;;;047D; +047D;CYRILLIC SMALL LETTER OMEGA WITH TITLO;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER OMEGA TITLO;;047C;;047C +047E;CYRILLIC CAPITAL LETTER OT;Lu;0;L;;;;;N;;;;047F; +047F;CYRILLIC SMALL LETTER OT;Ll;0;L;;;;;N;;;047E;;047E +0480;CYRILLIC CAPITAL LETTER KOPPA;Lu;0;L;;;;;N;;;;0481; +0481;CYRILLIC SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;0480;;0480 +0482;CYRILLIC THOUSANDS SIGN;So;0;L;;;;;N;;;;; +0483;COMBINING CYRILLIC TITLO;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING TITLO;;;; +0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;; +0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;; +0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;; +0487;COMBINING CYRILLIC POKRYTIE;Mn;230;NSM;;;;;N;;;;; +0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;; +0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +048A;CYRILLIC CAPITAL LETTER SHORT I WITH TAIL;Lu;0;L;;;;;N;;;;048B; +048B;CYRILLIC SMALL LETTER SHORT I WITH TAIL;Ll;0;L;;;;;N;;;048A;;048A +048C;CYRILLIC CAPITAL LETTER SEMISOFT SIGN;Lu;0;L;;;;;N;;;;048D; +048D;CYRILLIC SMALL LETTER SEMISOFT SIGN;Ll;0;L;;;;;N;;;048C;;048C +048E;CYRILLIC CAPITAL LETTER ER WITH TICK;Lu;0;L;;;;;N;;;;048F; +048F;CYRILLIC SMALL LETTER ER WITH TICK;Ll;0;L;;;;;N;;;048E;;048E +0490;CYRILLIC CAPITAL LETTER GHE WITH UPTURN;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE WITH UPTURN;;;0491; +0491;CYRILLIC SMALL LETTER GHE WITH UPTURN;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE WITH UPTURN;;0490;;0490 +0492;CYRILLIC CAPITAL LETTER GHE WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE BAR;;;0493; +0493;CYRILLIC SMALL LETTER GHE WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE BAR;;0492;;0492 +0494;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE HOOK;;;0495; +0495;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE HOOK;;0494;;0494 +0496;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER;;;0497; +0497;CYRILLIC SMALL LETTER ZHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER;;0496;;0496 +0498;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZE CEDILLA;;;0499; +0499;CYRILLIC SMALL LETTER ZE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZE CEDILLA;;0498;;0498 +049A;CYRILLIC CAPITAL LETTER KA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER;;;049B; +049B;CYRILLIC SMALL LETTER KA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER;;049A;;049A +049C;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA VERTICAL BAR;;;049D; +049D;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA VERTICAL BAR;;049C;;049C +049E;CYRILLIC CAPITAL LETTER KA WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA BAR;;;049F; +049F;CYRILLIC SMALL LETTER KA WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA BAR;;049E;;049E +04A0;CYRILLIC CAPITAL LETTER BASHKIR KA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED GE KA;;;04A1; +04A1;CYRILLIC SMALL LETTER BASHKIR KA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED GE KA;;04A0;;04A0 +04A2;CYRILLIC CAPITAL LETTER EN WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER;;;04A3; +04A3;CYRILLIC SMALL LETTER EN WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER;;04A2;;04A2 +04A4;CYRILLIC CAPITAL LIGATURE EN GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN GE;;;04A5; +04A5;CYRILLIC SMALL LIGATURE EN GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN GE;;04A4;;04A4 +04A6;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER PE HOOK;;;04A7; +04A7;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER PE HOOK;;04A6;;04A6 +04A8;CYRILLIC CAPITAL LETTER ABKHASIAN HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER O HOOK;;;04A9; +04A9;CYRILLIC SMALL LETTER ABKHASIAN HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER O HOOK;;04A8;;04A8 +04AA;CYRILLIC CAPITAL LETTER ES WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ES CEDILLA;;;04AB; +04AB;CYRILLIC SMALL LETTER ES WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ES CEDILLA;;04AA;;04AA +04AC;CYRILLIC CAPITAL LETTER TE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER;;;04AD; +04AD;CYRILLIC SMALL LETTER TE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER;;04AC;;04AC +04AE;CYRILLIC CAPITAL LETTER STRAIGHT U;Lu;0;L;;;;;N;;;;04AF; +04AF;CYRILLIC SMALL LETTER STRAIGHT U;Ll;0;L;;;;;N;;;04AE;;04AE +04B0;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER STRAIGHT U BAR;;;04B1; +04B1;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER STRAIGHT U BAR;;04B0;;04B0 +04B2;CYRILLIC CAPITAL LETTER HA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER;;;04B3; +04B3;CYRILLIC SMALL LETTER HA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER;;04B2;;04B2 +04B4;CYRILLIC CAPITAL LIGATURE TE TSE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE TSE;;;04B5; +04B5;CYRILLIC SMALL LIGATURE TE TSE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE TSE;;04B4;;04B4 +04B6;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER;;;04B7; +04B7;CYRILLIC SMALL LETTER CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER;;04B6;;04B6 +04B8;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE VERTICAL BAR;;;04B9; +04B9;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE VERTICAL BAR;;04B8;;04B8 +04BA;CYRILLIC CAPITAL LETTER SHHA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER H;;;04BB; +04BB;CYRILLIC SMALL LETTER SHHA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER H;;04BA;;04BA +04BC;CYRILLIC CAPITAL LETTER ABKHASIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK;;;04BD; +04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC +04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF; +04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE +04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;04CF; +04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2; +04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1 +04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4; +04C4;CYRILLIC SMALL LETTER KA WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA HOOK;;04C3;;04C3 +04C5;CYRILLIC CAPITAL LETTER EL WITH TAIL;Lu;0;L;;;;;N;;;;04C6; +04C6;CYRILLIC SMALL LETTER EL WITH TAIL;Ll;0;L;;;;;N;;;04C5;;04C5 +04C7;CYRILLIC CAPITAL LETTER EN WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN HOOK;;;04C8; +04C8;CYRILLIC SMALL LETTER EN WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN HOOK;;04C7;;04C7 +04C9;CYRILLIC CAPITAL LETTER EN WITH TAIL;Lu;0;L;;;;;N;;;;04CA; +04CA;CYRILLIC SMALL LETTER EN WITH TAIL;Ll;0;L;;;;;N;;;04C9;;04C9 +04CB;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER;;;04CC; +04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB +04CD;CYRILLIC CAPITAL LETTER EM WITH TAIL;Lu;0;L;;;;;N;;;;04CE; +04CE;CYRILLIC SMALL LETTER EM WITH TAIL;Ll;0;L;;;;;N;;;04CD;;04CD +04CF;CYRILLIC SMALL LETTER PALOCHKA;Ll;0;L;;;;;N;;;04C0;;04C0 +04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1; +04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0 +04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3; +04D3;CYRILLIC SMALL LETTER A WITH DIAERESIS;Ll;0;L;0430 0308;;;;N;;;04D2;;04D2 +04D4;CYRILLIC CAPITAL LIGATURE A IE;Lu;0;L;;;;;N;;;;04D5; +04D5;CYRILLIC SMALL LIGATURE A IE;Ll;0;L;;;;;N;;;04D4;;04D4 +04D6;CYRILLIC CAPITAL LETTER IE WITH BREVE;Lu;0;L;0415 0306;;;;N;;;;04D7; +04D7;CYRILLIC SMALL LETTER IE WITH BREVE;Ll;0;L;0435 0306;;;;N;;;04D6;;04D6 +04D8;CYRILLIC CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;04D9; +04D9;CYRILLIC SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;04D8;;04D8 +04DA;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS;Lu;0;L;04D8 0308;;;;N;;;;04DB; +04DB;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS;Ll;0;L;04D9 0308;;;;N;;;04DA;;04DA +04DC;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS;Lu;0;L;0416 0308;;;;N;;;;04DD; +04DD;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS;Ll;0;L;0436 0308;;;;N;;;04DC;;04DC +04DE;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS;Lu;0;L;0417 0308;;;;N;;;;04DF; +04DF;CYRILLIC SMALL LETTER ZE WITH DIAERESIS;Ll;0;L;0437 0308;;;;N;;;04DE;;04DE +04E0;CYRILLIC CAPITAL LETTER ABKHASIAN DZE;Lu;0;L;;;;;N;;;;04E1; +04E1;CYRILLIC SMALL LETTER ABKHASIAN DZE;Ll;0;L;;;;;N;;;04E0;;04E0 +04E2;CYRILLIC CAPITAL LETTER I WITH MACRON;Lu;0;L;0418 0304;;;;N;;;;04E3; +04E3;CYRILLIC SMALL LETTER I WITH MACRON;Ll;0;L;0438 0304;;;;N;;;04E2;;04E2 +04E4;CYRILLIC CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0418 0308;;;;N;;;;04E5; +04E5;CYRILLIC SMALL LETTER I WITH DIAERESIS;Ll;0;L;0438 0308;;;;N;;;04E4;;04E4 +04E6;CYRILLIC CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;041E 0308;;;;N;;;;04E7; +04E7;CYRILLIC SMALL LETTER O WITH DIAERESIS;Ll;0;L;043E 0308;;;;N;;;04E6;;04E6 +04E8;CYRILLIC CAPITAL LETTER BARRED O;Lu;0;L;;;;;N;;;;04E9; +04E9;CYRILLIC SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;04E8;;04E8 +04EA;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS;Lu;0;L;04E8 0308;;;;N;;;;04EB; +04EB;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS;Ll;0;L;04E9 0308;;;;N;;;04EA;;04EA +04EC;CYRILLIC CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;042D 0308;;;;N;;;;04ED; +04ED;CYRILLIC SMALL LETTER E WITH DIAERESIS;Ll;0;L;044D 0308;;;;N;;;04EC;;04EC +04EE;CYRILLIC CAPITAL LETTER U WITH MACRON;Lu;0;L;0423 0304;;;;N;;;;04EF; +04EF;CYRILLIC SMALL LETTER U WITH MACRON;Ll;0;L;0443 0304;;;;N;;;04EE;;04EE +04F0;CYRILLIC CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0423 0308;;;;N;;;;04F1; +04F1;CYRILLIC SMALL LETTER U WITH DIAERESIS;Ll;0;L;0443 0308;;;;N;;;04F0;;04F0 +04F2;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0423 030B;;;;N;;;;04F3; +04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2 +04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5; +04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4 +04F6;CYRILLIC CAPITAL LETTER GHE WITH DESCENDER;Lu;0;L;;;;;N;;;;04F7; +04F7;CYRILLIC SMALL LETTER GHE WITH DESCENDER;Ll;0;L;;;;;N;;;04F6;;04F6 +04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9; +04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8 +04FA;CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK;Lu;0;L;;;;;N;;;;04FB; +04FB;CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK;Ll;0;L;;;;;N;;;04FA;;04FA +04FC;CYRILLIC CAPITAL LETTER HA WITH HOOK;Lu;0;L;;;;;N;;;;04FD; +04FD;CYRILLIC SMALL LETTER HA WITH HOOK;Ll;0;L;;;;;N;;;04FC;;04FC +04FE;CYRILLIC CAPITAL LETTER HA WITH STROKE;Lu;0;L;;;;;N;;;;04FF; +04FF;CYRILLIC SMALL LETTER HA WITH STROKE;Ll;0;L;;;;;N;;;04FE;;04FE +0500;CYRILLIC CAPITAL LETTER KOMI DE;Lu;0;L;;;;;N;;;;0501; +0501;CYRILLIC SMALL LETTER KOMI DE;Ll;0;L;;;;;N;;;0500;;0500 +0502;CYRILLIC CAPITAL LETTER KOMI DJE;Lu;0;L;;;;;N;;;;0503; +0503;CYRILLIC SMALL LETTER KOMI DJE;Ll;0;L;;;;;N;;;0502;;0502 +0504;CYRILLIC CAPITAL LETTER KOMI ZJE;Lu;0;L;;;;;N;;;;0505; +0505;CYRILLIC SMALL LETTER KOMI ZJE;Ll;0;L;;;;;N;;;0504;;0504 +0506;CYRILLIC CAPITAL LETTER KOMI DZJE;Lu;0;L;;;;;N;;;;0507; +0507;CYRILLIC SMALL LETTER KOMI DZJE;Ll;0;L;;;;;N;;;0506;;0506 +0508;CYRILLIC CAPITAL LETTER KOMI LJE;Lu;0;L;;;;;N;;;;0509; +0509;CYRILLIC SMALL LETTER KOMI LJE;Ll;0;L;;;;;N;;;0508;;0508 +050A;CYRILLIC CAPITAL LETTER KOMI NJE;Lu;0;L;;;;;N;;;;050B; +050B;CYRILLIC SMALL LETTER KOMI NJE;Ll;0;L;;;;;N;;;050A;;050A +050C;CYRILLIC CAPITAL LETTER KOMI SJE;Lu;0;L;;;;;N;;;;050D; +050D;CYRILLIC SMALL LETTER KOMI SJE;Ll;0;L;;;;;N;;;050C;;050C +050E;CYRILLIC CAPITAL LETTER KOMI TJE;Lu;0;L;;;;;N;;;;050F; +050F;CYRILLIC SMALL LETTER KOMI TJE;Ll;0;L;;;;;N;;;050E;;050E +0510;CYRILLIC CAPITAL LETTER REVERSED ZE;Lu;0;L;;;;;N;;;;0511; +0511;CYRILLIC SMALL LETTER REVERSED ZE;Ll;0;L;;;;;N;;;0510;;0510 +0512;CYRILLIC CAPITAL LETTER EL WITH HOOK;Lu;0;L;;;;;N;;;;0513; +0513;CYRILLIC SMALL LETTER EL WITH HOOK;Ll;0;L;;;;;N;;;0512;;0512 +0514;CYRILLIC CAPITAL LETTER LHA;Lu;0;L;;;;;N;;;;0515; +0515;CYRILLIC SMALL LETTER LHA;Ll;0;L;;;;;N;;;0514;;0514 +0516;CYRILLIC CAPITAL LETTER RHA;Lu;0;L;;;;;N;;;;0517; +0517;CYRILLIC SMALL LETTER RHA;Ll;0;L;;;;;N;;;0516;;0516 +0518;CYRILLIC CAPITAL LETTER YAE;Lu;0;L;;;;;N;;;;0519; +0519;CYRILLIC SMALL LETTER YAE;Ll;0;L;;;;;N;;;0518;;0518 +051A;CYRILLIC CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;051B; +051B;CYRILLIC SMALL LETTER QA;Ll;0;L;;;;;N;;;051A;;051A +051C;CYRILLIC CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;051D; +051D;CYRILLIC SMALL LETTER WE;Ll;0;L;;;;;N;;;051C;;051C +051E;CYRILLIC CAPITAL LETTER ALEUT KA;Lu;0;L;;;;;N;;;;051F; +051F;CYRILLIC SMALL LETTER ALEUT KA;Ll;0;L;;;;;N;;;051E;;051E +0520;CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0521; +0521;CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0520;;0520 +0522;CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0523; +0523;CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0522;;0522 +0524;CYRILLIC CAPITAL LETTER PE WITH DESCENDER;Lu;0;L;;;;;N;;;;0525; +0525;CYRILLIC SMALL LETTER PE WITH DESCENDER;Ll;0;L;;;;;N;;;0524;;0524 +0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561; +0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562; +0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563; +0534;ARMENIAN CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;0564; +0535;ARMENIAN CAPITAL LETTER ECH;Lu;0;L;;;;;N;;;;0565; +0536;ARMENIAN CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;0566; +0537;ARMENIAN CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;0567; +0538;ARMENIAN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;0568; +0539;ARMENIAN CAPITAL LETTER TO;Lu;0;L;;;;;N;;;;0569; +053A;ARMENIAN CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;056A; +053B;ARMENIAN CAPITAL LETTER INI;Lu;0;L;;;;;N;;;;056B; +053C;ARMENIAN CAPITAL LETTER LIWN;Lu;0;L;;;;;N;;;;056C; +053D;ARMENIAN CAPITAL LETTER XEH;Lu;0;L;;;;;N;;;;056D; +053E;ARMENIAN CAPITAL LETTER CA;Lu;0;L;;;;;N;;;;056E; +053F;ARMENIAN CAPITAL LETTER KEN;Lu;0;L;;;;;N;;;;056F; +0540;ARMENIAN CAPITAL LETTER HO;Lu;0;L;;;;;N;;;;0570; +0541;ARMENIAN CAPITAL LETTER JA;Lu;0;L;;;;;N;;;;0571; +0542;ARMENIAN CAPITAL LETTER GHAD;Lu;0;L;;;;;N;ARMENIAN CAPITAL LETTER LAD;;;0572; +0543;ARMENIAN CAPITAL LETTER CHEH;Lu;0;L;;;;;N;;;;0573; +0544;ARMENIAN CAPITAL LETTER MEN;Lu;0;L;;;;;N;;;;0574; +0545;ARMENIAN CAPITAL LETTER YI;Lu;0;L;;;;;N;;;;0575; +0546;ARMENIAN CAPITAL LETTER NOW;Lu;0;L;;;;;N;;;;0576; +0547;ARMENIAN CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0577; +0548;ARMENIAN CAPITAL LETTER VO;Lu;0;L;;;;;N;;;;0578; +0549;ARMENIAN CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;0579; +054A;ARMENIAN CAPITAL LETTER PEH;Lu;0;L;;;;;N;;;;057A; +054B;ARMENIAN CAPITAL LETTER JHEH;Lu;0;L;;;;;N;;;;057B; +054C;ARMENIAN CAPITAL LETTER RA;Lu;0;L;;;;;N;;;;057C; +054D;ARMENIAN CAPITAL LETTER SEH;Lu;0;L;;;;;N;;;;057D; +054E;ARMENIAN CAPITAL LETTER VEW;Lu;0;L;;;;;N;;;;057E; +054F;ARMENIAN CAPITAL LETTER TIWN;Lu;0;L;;;;;N;;;;057F; +0550;ARMENIAN CAPITAL LETTER REH;Lu;0;L;;;;;N;;;;0580; +0551;ARMENIAN CAPITAL LETTER CO;Lu;0;L;;;;;N;;;;0581; +0552;ARMENIAN CAPITAL LETTER YIWN;Lu;0;L;;;;;N;;;;0582; +0553;ARMENIAN CAPITAL LETTER PIWR;Lu;0;L;;;;;N;;;;0583; +0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584; +0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585; +0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586; +0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; +055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;; +055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;; +055C;ARMENIAN EXCLAMATION MARK;Po;0;L;;;;;N;;;;; +055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;; +055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;; +055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;; +0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531 +0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532 +0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533 +0564;ARMENIAN SMALL LETTER DA;Ll;0;L;;;;;N;;;0534;;0534 +0565;ARMENIAN SMALL LETTER ECH;Ll;0;L;;;;;N;;;0535;;0535 +0566;ARMENIAN SMALL LETTER ZA;Ll;0;L;;;;;N;;;0536;;0536 +0567;ARMENIAN SMALL LETTER EH;Ll;0;L;;;;;N;;;0537;;0537 +0568;ARMENIAN SMALL LETTER ET;Ll;0;L;;;;;N;;;0538;;0538 +0569;ARMENIAN SMALL LETTER TO;Ll;0;L;;;;;N;;;0539;;0539 +056A;ARMENIAN SMALL LETTER ZHE;Ll;0;L;;;;;N;;;053A;;053A +056B;ARMENIAN SMALL LETTER INI;Ll;0;L;;;;;N;;;053B;;053B +056C;ARMENIAN SMALL LETTER LIWN;Ll;0;L;;;;;N;;;053C;;053C +056D;ARMENIAN SMALL LETTER XEH;Ll;0;L;;;;;N;;;053D;;053D +056E;ARMENIAN SMALL LETTER CA;Ll;0;L;;;;;N;;;053E;;053E +056F;ARMENIAN SMALL LETTER KEN;Ll;0;L;;;;;N;;;053F;;053F +0570;ARMENIAN SMALL LETTER HO;Ll;0;L;;;;;N;;;0540;;0540 +0571;ARMENIAN SMALL LETTER JA;Ll;0;L;;;;;N;;;0541;;0541 +0572;ARMENIAN SMALL LETTER GHAD;Ll;0;L;;;;;N;ARMENIAN SMALL LETTER LAD;;0542;;0542 +0573;ARMENIAN SMALL LETTER CHEH;Ll;0;L;;;;;N;;;0543;;0543 +0574;ARMENIAN SMALL LETTER MEN;Ll;0;L;;;;;N;;;0544;;0544 +0575;ARMENIAN SMALL LETTER YI;Ll;0;L;;;;;N;;;0545;;0545 +0576;ARMENIAN SMALL LETTER NOW;Ll;0;L;;;;;N;;;0546;;0546 +0577;ARMENIAN SMALL LETTER SHA;Ll;0;L;;;;;N;;;0547;;0547 +0578;ARMENIAN SMALL LETTER VO;Ll;0;L;;;;;N;;;0548;;0548 +0579;ARMENIAN SMALL LETTER CHA;Ll;0;L;;;;;N;;;0549;;0549 +057A;ARMENIAN SMALL LETTER PEH;Ll;0;L;;;;;N;;;054A;;054A +057B;ARMENIAN SMALL LETTER JHEH;Ll;0;L;;;;;N;;;054B;;054B +057C;ARMENIAN SMALL LETTER RA;Ll;0;L;;;;;N;;;054C;;054C +057D;ARMENIAN SMALL LETTER SEH;Ll;0;L;;;;;N;;;054D;;054D +057E;ARMENIAN SMALL LETTER VEW;Ll;0;L;;;;;N;;;054E;;054E +057F;ARMENIAN SMALL LETTER TIWN;Ll;0;L;;;;;N;;;054F;;054F +0580;ARMENIAN SMALL LETTER REH;Ll;0;L;;;;;N;;;0550;;0550 +0581;ARMENIAN SMALL LETTER CO;Ll;0;L;;;;;N;;;0551;;0551 +0582;ARMENIAN SMALL LETTER YIWN;Ll;0;L;;;;;N;;;0552;;0552 +0583;ARMENIAN SMALL LETTER PIWR;Ll;0;L;;;;;N;;;0553;;0553 +0584;ARMENIAN SMALL LETTER KEH;Ll;0;L;;;;;N;;;0554;;0554 +0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555 +0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556 +0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L;<compat> 0565 0582;;;;N;;;;; +0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;; +058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;; +0591;HEBREW ACCENT ETNAHTA;Mn;220;NSM;;;;;N;;;;; +0592;HEBREW ACCENT SEGOL;Mn;230;NSM;;;;;N;;;;; +0593;HEBREW ACCENT SHALSHELET;Mn;230;NSM;;;;;N;;;;; +0594;HEBREW ACCENT ZAQEF QATAN;Mn;230;NSM;;;;;N;;;;; +0595;HEBREW ACCENT ZAQEF GADOL;Mn;230;NSM;;;;;N;;;;; +0596;HEBREW ACCENT TIPEHA;Mn;220;NSM;;;;;N;;;;; +0597;HEBREW ACCENT REVIA;Mn;230;NSM;;;;;N;;;;; +0598;HEBREW ACCENT ZARQA;Mn;230;NSM;;;;;N;;;;; +0599;HEBREW ACCENT PASHTA;Mn;230;NSM;;;;;N;;;;; +059A;HEBREW ACCENT YETIV;Mn;222;NSM;;;;;N;;;;; +059B;HEBREW ACCENT TEVIR;Mn;220;NSM;;;;;N;;;;; +059C;HEBREW ACCENT GERESH;Mn;230;NSM;;;;;N;;;;; +059D;HEBREW ACCENT GERESH MUQDAM;Mn;230;NSM;;;;;N;;;;; +059E;HEBREW ACCENT GERSHAYIM;Mn;230;NSM;;;;;N;;;;; +059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;; +05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;; +05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;; +05A2;HEBREW ACCENT ATNAH HAFUKH;Mn;220;NSM;;;;;N;;;;; +05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;; +05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;; +05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;;;; +05A6;HEBREW ACCENT MERKHA KEFULA;Mn;220;NSM;;;;;N;;;;; +05A7;HEBREW ACCENT DARGA;Mn;220;NSM;;;;;N;;;;; +05A8;HEBREW ACCENT QADMA;Mn;230;NSM;;;;;N;;;;; +05A9;HEBREW ACCENT TELISHA QETANA;Mn;230;NSM;;;;;N;;;;; +05AA;HEBREW ACCENT YERAH BEN YOMO;Mn;220;NSM;;;;;N;;;;; +05AB;HEBREW ACCENT OLE;Mn;230;NSM;;;;;N;;;;; +05AC;HEBREW ACCENT ILUY;Mn;230;NSM;;;;;N;;;;; +05AD;HEBREW ACCENT DEHI;Mn;222;NSM;;;;;N;;;;; +05AE;HEBREW ACCENT ZINOR;Mn;228;NSM;;;;;N;;;;; +05AF;HEBREW MARK MASORA CIRCLE;Mn;230;NSM;;;;;N;;;;; +05B0;HEBREW POINT SHEVA;Mn;10;NSM;;;;;N;;;;; +05B1;HEBREW POINT HATAF SEGOL;Mn;11;NSM;;;;;N;;;;; +05B2;HEBREW POINT HATAF PATAH;Mn;12;NSM;;;;;N;;;;; +05B3;HEBREW POINT HATAF QAMATS;Mn;13;NSM;;;;;N;;;;; +05B4;HEBREW POINT HIRIQ;Mn;14;NSM;;;;;N;;;;; +05B5;HEBREW POINT TSERE;Mn;15;NSM;;;;;N;;;;; +05B6;HEBREW POINT SEGOL;Mn;16;NSM;;;;;N;;;;; +05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;; +05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;; +05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;; +05BA;HEBREW POINT HOLAM HASER FOR VAV;Mn;19;NSM;;;;;N;;;;; +05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;; +05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;;;; +05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;;;; +05BE;HEBREW PUNCTUATION MAQAF;Pd;0;R;;;;;N;;;;; +05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;; +05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;;;; +05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;; +05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;; +05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;;;; +05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;; +05C5;HEBREW MARK LOWER DOT;Mn;220;NSM;;;;;N;;;;; +05C6;HEBREW PUNCTUATION NUN HAFUKHA;Po;0;R;;;;;N;;;;; +05C7;HEBREW POINT QAMATS QATAN;Mn;18;NSM;;;;;N;;;;; +05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;; +05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;; +05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;; +05D3;HEBREW LETTER DALET;Lo;0;R;;;;;N;;;;; +05D4;HEBREW LETTER HE;Lo;0;R;;;;;N;;;;; +05D5;HEBREW LETTER VAV;Lo;0;R;;;;;N;;;;; +05D6;HEBREW LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +05D7;HEBREW LETTER HET;Lo;0;R;;;;;N;;;;; +05D8;HEBREW LETTER TET;Lo;0;R;;;;;N;;;;; +05D9;HEBREW LETTER YOD;Lo;0;R;;;;;N;;;;; +05DA;HEBREW LETTER FINAL KAF;Lo;0;R;;;;;N;;;;; +05DB;HEBREW LETTER KAF;Lo;0;R;;;;;N;;;;; +05DC;HEBREW LETTER LAMED;Lo;0;R;;;;;N;;;;; +05DD;HEBREW LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; +05DE;HEBREW LETTER MEM;Lo;0;R;;;;;N;;;;; +05DF;HEBREW LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +05E0;HEBREW LETTER NUN;Lo;0;R;;;;;N;;;;; +05E1;HEBREW LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +05E2;HEBREW LETTER AYIN;Lo;0;R;;;;;N;;;;; +05E3;HEBREW LETTER FINAL PE;Lo;0;R;;;;;N;;;;; +05E4;HEBREW LETTER PE;Lo;0;R;;;;;N;;;;; +05E5;HEBREW LETTER FINAL TSADI;Lo;0;R;;;;;N;;;;; +05E6;HEBREW LETTER TSADI;Lo;0;R;;;;;N;;;;; +05E7;HEBREW LETTER QOF;Lo;0;R;;;;;N;;;;; +05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;; +05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;; +05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;; +05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;; +05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;; +05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;; +05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;; +05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;; +0600;ARABIC NUMBER SIGN;Cf;0;AN;;;;;N;;;;; +0601;ARABIC SIGN SANAH;Cf;0;AN;;;;;N;;;;; +0602;ARABIC FOOTNOTE MARKER;Cf;0;AN;;;;;N;;;;; +0603;ARABIC SIGN SAFHA;Cf;0;AN;;;;;N;;;;; +0606;ARABIC-INDIC CUBE ROOT;Sm;0;ON;;;;;N;;;;; +0607;ARABIC-INDIC FOURTH ROOT;Sm;0;ON;;;;;N;;;;; +0608;ARABIC RAY;Sm;0;AL;;;;;N;;;;; +0609;ARABIC-INDIC PER MILLE SIGN;Po;0;ET;;;;;N;;;;; +060A;ARABIC-INDIC PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; +060B;AFGHANI SIGN;Sc;0;AL;;;;;N;;;;; +060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;; +060D;ARABIC DATE SEPARATOR;Po;0;AL;;;;;N;;;;; +060E;ARABIC POETIC VERSE SIGN;So;0;ON;;;;;N;;;;; +060F;ARABIC SIGN MISRA;So;0;ON;;;;;N;;;;; +0610;ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM;Mn;230;NSM;;;;;N;;;;; +0611;ARABIC SIGN ALAYHE ASSALLAM;Mn;230;NSM;;;;;N;;;;; +0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;; +0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;; +0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;; +0615;ARABIC SMALL HIGH TAH;Mn;230;NSM;;;;;N;;;;; +0616;ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH;Mn;230;NSM;;;;;N;;;;; +0617;ARABIC SMALL HIGH ZAIN;Mn;230;NSM;;;;;N;;;;; +0618;ARABIC SMALL FATHA;Mn;30;NSM;;;;;N;;;;; +0619;ARABIC SMALL DAMMA;Mn;31;NSM;;;;;N;;;;; +061A;ARABIC SMALL KASRA;Mn;32;NSM;;;;;N;;;;; +061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;; +061E;ARABIC TRIPLE DOT PUNCTUATION MARK;Po;0;AL;;;;;N;;;;; +061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;; +0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;; +0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;; +0623;ARABIC LETTER ALEF WITH HAMZA ABOVE;Lo;0;AL;0627 0654;;;;N;ARABIC LETTER HAMZAH ON ALEF;;;; +0624;ARABIC LETTER WAW WITH HAMZA ABOVE;Lo;0;AL;0648 0654;;;;N;ARABIC LETTER HAMZAH ON WAW;;;; +0625;ARABIC LETTER ALEF WITH HAMZA BELOW;Lo;0;AL;0627 0655;;;;N;ARABIC LETTER HAMZAH UNDER ALEF;;;; +0626;ARABIC LETTER YEH WITH HAMZA ABOVE;Lo;0;AL;064A 0654;;;;N;ARABIC LETTER HAMZAH ON YA;;;; +0627;ARABIC LETTER ALEF;Lo;0;AL;;;;;N;;;;; +0628;ARABIC LETTER BEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA;;;; +0629;ARABIC LETTER TEH MARBUTA;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH;;;; +062A;ARABIC LETTER TEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA;;;; +062B;ARABIC LETTER THEH;Lo;0;AL;;;;;N;ARABIC LETTER THAA;;;; +062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;; +062D;ARABIC LETTER HAH;Lo;0;AL;;;;;N;ARABIC LETTER HAA;;;; +062E;ARABIC LETTER KHAH;Lo;0;AL;;;;;N;ARABIC LETTER KHAA;;;; +062F;ARABIC LETTER DAL;Lo;0;AL;;;;;N;;;;; +0630;ARABIC LETTER THAL;Lo;0;AL;;;;;N;;;;; +0631;ARABIC LETTER REH;Lo;0;AL;;;;;N;ARABIC LETTER RA;;;; +0632;ARABIC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; +0633;ARABIC LETTER SEEN;Lo;0;AL;;;;;N;;;;; +0634;ARABIC LETTER SHEEN;Lo;0;AL;;;;;N;;;;; +0635;ARABIC LETTER SAD;Lo;0;AL;;;;;N;;;;; +0636;ARABIC LETTER DAD;Lo;0;AL;;;;;N;;;;; +0637;ARABIC LETTER TAH;Lo;0;AL;;;;;N;;;;; +0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;; +0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;; +063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;; +063B;ARABIC LETTER KEHEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +063C;ARABIC LETTER KEHEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +063D;ARABIC LETTER FARSI YEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +063E;ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +063F;ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;; +0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;; +0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;; +0643;ARABIC LETTER KAF;Lo;0;AL;;;;;N;ARABIC LETTER CAF;;;; +0644;ARABIC LETTER LAM;Lo;0;AL;;;;;N;;;;; +0645;ARABIC LETTER MEEM;Lo;0;AL;;;;;N;;;;; +0646;ARABIC LETTER NOON;Lo;0;AL;;;;;N;;;;; +0647;ARABIC LETTER HEH;Lo;0;AL;;;;;N;ARABIC LETTER HA;;;; +0648;ARABIC LETTER WAW;Lo;0;AL;;;;;N;;;;; +0649;ARABIC LETTER ALEF MAKSURA;Lo;0;AL;;;;;N;ARABIC LETTER ALEF MAQSURAH;;;; +064A;ARABIC LETTER YEH;Lo;0;AL;;;;;N;ARABIC LETTER YA;;;; +064B;ARABIC FATHATAN;Mn;27;NSM;;;;;N;;;;; +064C;ARABIC DAMMATAN;Mn;28;NSM;;;;;N;;;;; +064D;ARABIC KASRATAN;Mn;29;NSM;;;;;N;;;;; +064E;ARABIC FATHA;Mn;30;NSM;;;;;N;ARABIC FATHAH;;;; +064F;ARABIC DAMMA;Mn;31;NSM;;;;;N;ARABIC DAMMAH;;;; +0650;ARABIC KASRA;Mn;32;NSM;;;;;N;ARABIC KASRAH;;;; +0651;ARABIC SHADDA;Mn;33;NSM;;;;;N;ARABIC SHADDAH;;;; +0652;ARABIC SUKUN;Mn;34;NSM;;;;;N;;;;; +0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;; +0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;; +0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; +0656;ARABIC SUBSCRIPT ALEF;Mn;220;NSM;;;;;N;;;;; +0657;ARABIC INVERTED DAMMA;Mn;230;NSM;;;;;N;;;;; +0658;ARABIC MARK NOON GHUNNA;Mn;230;NSM;;;;;N;;;;; +0659;ARABIC ZWARAKAY;Mn;230;NSM;;;;;N;;;;; +065A;ARABIC VOWEL SIGN SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; +065B;ARABIC VOWEL SIGN INVERTED SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; +065C;ARABIC VOWEL SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; +065D;ARABIC REVERSED DAMMA;Mn;230;NSM;;;;;N;;;;; +065E;ARABIC FATHA WITH TWO DOTS;Mn;230;NSM;;;;;N;;;;; +0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;; +0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;; +0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;; +0663;ARABIC-INDIC DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;; +0664;ARABIC-INDIC DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;; +0665;ARABIC-INDIC DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;; +0666;ARABIC-INDIC DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;; +0667;ARABIC-INDIC DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;; +0668;ARABIC-INDIC DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;; +0669;ARABIC-INDIC DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;; +066A;ARABIC PERCENT SIGN;Po;0;ET;;;;;N;;;;; +066B;ARABIC DECIMAL SEPARATOR;Po;0;AN;;;;;N;;;;; +066C;ARABIC THOUSANDS SEPARATOR;Po;0;AN;;;;;N;;;;; +066D;ARABIC FIVE POINTED STAR;Po;0;AL;;;;;N;;;;; +066E;ARABIC LETTER DOTLESS BEH;Lo;0;AL;;;;;N;;;;; +066F;ARABIC LETTER DOTLESS QAF;Lo;0;AL;;;;;N;;;;; +0670;ARABIC LETTER SUPERSCRIPT ALEF;Mn;35;NSM;;;;;N;ARABIC ALEF ABOVE;;;; +0671;ARABIC LETTER ALEF WASLA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAT WASL ON ALEF;;;; +0672;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH ON ALEF;;;; +0673;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH UNDER ALEF;;;; +0674;ARABIC LETTER HIGH HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HIGH HAMZAH;;;; +0675;ARABIC LETTER HIGH HAMZA ALEF;Lo;0;AL;<compat> 0627 0674;;;;N;ARABIC LETTER HIGH HAMZAH ALEF;;;; +0676;ARABIC LETTER HIGH HAMZA WAW;Lo;0;AL;<compat> 0648 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW;;;; +0677;ARABIC LETTER U WITH HAMZA ABOVE;Lo;0;AL;<compat> 06C7 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH;;;; +0678;ARABIC LETTER HIGH HAMZA YEH;Lo;0;AL;<compat> 064A 0674;;;;N;ARABIC LETTER HIGH HAMZAH YA;;;; +0679;ARABIC LETTER TTEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH SMALL TAH;;;; +067A;ARABIC LETTER TTEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE;;;; +067B;ARABIC LETTER BEEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW;;;; +067C;ARABIC LETTER TEH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH RING;;;; +067D;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD;;;; +067E;ARABIC LETTER PEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS BELOW;;;; +067F;ARABIC LETTER TEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH FOUR DOTS ABOVE;;;; +0680;ARABIC LETTER BEHEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH FOUR DOTS BELOW;;;; +0681;ARABIC LETTER HAH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH ON HAA;;;; +0682;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE;;;; +0683;ARABIC LETTER NYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS;;;; +0684;ARABIC LETTER DYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL;;;; +0685;ARABIC LETTER HAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH THREE DOTS ABOVE;;;; +0686;ARABIC LETTER TCHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD;;;; +0687;ARABIC LETTER TCHEHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE FOUR DOTS;;;; +0688;ARABIC LETTER DDAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH SMALL TAH;;;; +0689;ARABIC LETTER DAL WITH RING;Lo;0;AL;;;;;N;;;;; +068A;ARABIC LETTER DAL WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +068B;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; +068C;ARABIC LETTER DAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS ABOVE;;;; +068D;ARABIC LETTER DDAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS BELOW;;;; +068E;ARABIC LETTER DUL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE;;;; +068F;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD;;;; +0690;ARABIC LETTER DAL WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0691;ARABIC LETTER RREH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL TAH;;;; +0692;ARABIC LETTER REH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V;;;; +0693;ARABIC LETTER REH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH RING;;;; +0694;ARABIC LETTER REH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW;;;; +0695;ARABIC LETTER REH WITH SMALL V BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V BELOW;;;; +0696;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE;;;; +0697;ARABIC LETTER REH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH TWO DOTS ABOVE;;;; +0698;ARABIC LETTER JEH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH THREE DOTS ABOVE;;;; +0699;ARABIC LETTER REH WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH FOUR DOTS ABOVE;;;; +069A;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +069B;ARABIC LETTER SEEN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +069C;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +069D;ARABIC LETTER SAD WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +069E;ARABIC LETTER SAD WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +069F;ARABIC LETTER TAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A0;ARABIC LETTER AIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A1;ARABIC LETTER DOTLESS FEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS FA;;;; +06A2;ARABIC LETTER FEH WITH DOT MOVED BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT MOVED BELOW;;;; +06A3;ARABIC LETTER FEH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT BELOW;;;; +06A4;ARABIC LETTER VEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS ABOVE;;;; +06A5;ARABIC LETTER FEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS BELOW;;;; +06A6;ARABIC LETTER PEHEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH FOUR DOTS ABOVE;;;; +06A7;ARABIC LETTER QAF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06A8;ARABIC LETTER QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A9;ARABIC LETTER KEHEH;Lo;0;AL;;;;;N;ARABIC LETTER OPEN CAF;;;; +06AA;ARABIC LETTER SWASH KAF;Lo;0;AL;;;;;N;ARABIC LETTER SWASH CAF;;;; +06AB;ARABIC LETTER KAF WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH RING;;;; +06AC;ARABIC LETTER KAF WITH DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH DOT ABOVE;;;; +06AD;ARABIC LETTER NG;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS ABOVE;;;; +06AE;ARABIC LETTER KAF WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS BELOW;;;; +06AF;ARABIC LETTER GAF;Lo;0;AL;;;;;N;;;;; +06B0;ARABIC LETTER GAF WITH RING;Lo;0;AL;;;;;N;;;;; +06B1;ARABIC LETTER NGOEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS ABOVE;;;; +06B2;ARABIC LETTER GAF WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +06B3;ARABIC LETTER GUEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW;;;; +06B4;ARABIC LETTER GAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06B5;ARABIC LETTER LAM WITH SMALL V;Lo;0;AL;;;;;N;;;;; +06B6;ARABIC LETTER LAM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06B7;ARABIC LETTER LAM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06B8;ARABIC LETTER LAM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +06B9;ARABIC LETTER NOON WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06BA;ARABIC LETTER NOON GHUNNA;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON;;;; +06BB;ARABIC LETTER RNOON;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON WITH SMALL TAH;;;; +06BC;ARABIC LETTER NOON WITH RING;Lo;0;AL;;;;;N;;;;; +06BD;ARABIC LETTER NOON WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06BE;ARABIC LETTER HEH DOACHASHMEE;Lo;0;AL;;;;;N;ARABIC LETTER KNOTTED HA;;;; +06BF;ARABIC LETTER TCHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06C0;ARABIC LETTER HEH WITH YEH ABOVE;Lo;0;AL;06D5 0654;;;;N;ARABIC LETTER HAMZAH ON HA;;;; +06C1;ARABIC LETTER HEH GOAL;Lo;0;AL;;;;;N;ARABIC LETTER HA GOAL;;;; +06C2;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE;Lo;0;AL;06C1 0654;;;;N;ARABIC LETTER HAMZAH ON HA GOAL;;;; +06C3;ARABIC LETTER TEH MARBUTA GOAL;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH GOAL;;;; +06C4;ARABIC LETTER WAW WITH RING;Lo;0;AL;;;;;N;;;;; +06C5;ARABIC LETTER KIRGHIZ OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH BAR;;;; +06C6;ARABIC LETTER OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH SMALL V;;;; +06C7;ARABIC LETTER U;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH DAMMAH;;;; +06C8;ARABIC LETTER YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH ALEF ABOVE;;;; +06C9;ARABIC LETTER KIRGHIZ YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH INVERTED SMALL V;;;; +06CA;ARABIC LETTER WAW WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06CB;ARABIC LETTER VE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH THREE DOTS ABOVE;;;; +06CC;ARABIC LETTER FARSI YEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS YA;;;; +06CD;ARABIC LETTER YEH WITH TAIL;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TAIL;;;; +06CE;ARABIC LETTER YEH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH SMALL V;;;; +06CF;ARABIC LETTER WAW WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06D0;ARABIC LETTER E;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW;;;; +06D1;ARABIC LETTER YEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH THREE DOTS BELOW;;;; +06D2;ARABIC LETTER YEH BARREE;Lo;0;AL;;;;;N;ARABIC LETTER YA BARREE;;;; +06D3;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE;Lo;0;AL;06D2 0654;;;;N;ARABIC LETTER HAMZAH ON YA BARREE;;;; +06D4;ARABIC FULL STOP;Po;0;AL;;;;;N;ARABIC PERIOD;;;; +06D5;ARABIC LETTER AE;Lo;0;AL;;;;;N;;;;; +06D6;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; +06D7;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; +06D8;ARABIC SMALL HIGH MEEM INITIAL FORM;Mn;230;NSM;;;;;N;;;;; +06D9;ARABIC SMALL HIGH LAM ALEF;Mn;230;NSM;;;;;N;;;;; +06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;; +06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;; +06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;; +06DD;ARABIC END OF AYAH;Cf;0;AN;;;;;N;;;;; +06DE;ARABIC START OF RUB EL HIZB;Me;0;NSM;;;;;N;;;;; +06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;; +06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;; +06E1;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH;Mn;230;NSM;;;;;N;;;;; +06E2;ARABIC SMALL HIGH MEEM ISOLATED FORM;Mn;230;NSM;;;;;N;;;;; +06E3;ARABIC SMALL LOW SEEN;Mn;220;NSM;;;;;N;;;;; +06E4;ARABIC SMALL HIGH MADDA;Mn;230;NSM;;;;;N;;;;; +06E5;ARABIC SMALL WAW;Lm;0;AL;;;;;N;;;;; +06E6;ARABIC SMALL YEH;Lm;0;AL;;;;;N;;;;; +06E7;ARABIC SMALL HIGH YEH;Mn;230;NSM;;;;;N;;;;; +06E8;ARABIC SMALL HIGH NOON;Mn;230;NSM;;;;;N;;;;; +06E9;ARABIC PLACE OF SAJDAH;So;0;ON;;;;;N;;;;; +06EA;ARABIC EMPTY CENTRE LOW STOP;Mn;220;NSM;;;;;N;;;;; +06EB;ARABIC EMPTY CENTRE HIGH STOP;Mn;230;NSM;;;;;N;;;;; +06EC;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE;Mn;230;NSM;;;;;N;;;;; +06ED;ARABIC SMALL LOW MEEM;Mn;220;NSM;;;;;N;;;;; +06EE;ARABIC LETTER DAL WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +06EF;ARABIC LETTER REH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +06F0;EXTENDED ARABIC-INDIC DIGIT ZERO;Nd;0;EN;;0;0;0;N;EASTERN ARABIC-INDIC DIGIT ZERO;;;; +06F1;EXTENDED ARABIC-INDIC DIGIT ONE;Nd;0;EN;;1;1;1;N;EASTERN ARABIC-INDIC DIGIT ONE;;;; +06F2;EXTENDED ARABIC-INDIC DIGIT TWO;Nd;0;EN;;2;2;2;N;EASTERN ARABIC-INDIC DIGIT TWO;;;; +06F3;EXTENDED ARABIC-INDIC DIGIT THREE;Nd;0;EN;;3;3;3;N;EASTERN ARABIC-INDIC DIGIT THREE;;;; +06F4;EXTENDED ARABIC-INDIC DIGIT FOUR;Nd;0;EN;;4;4;4;N;EASTERN ARABIC-INDIC DIGIT FOUR;;;; +06F5;EXTENDED ARABIC-INDIC DIGIT FIVE;Nd;0;EN;;5;5;5;N;EASTERN ARABIC-INDIC DIGIT FIVE;;;; +06F6;EXTENDED ARABIC-INDIC DIGIT SIX;Nd;0;EN;;6;6;6;N;EASTERN ARABIC-INDIC DIGIT SIX;;;; +06F7;EXTENDED ARABIC-INDIC DIGIT SEVEN;Nd;0;EN;;7;7;7;N;EASTERN ARABIC-INDIC DIGIT SEVEN;;;; +06F8;EXTENDED ARABIC-INDIC DIGIT EIGHT;Nd;0;EN;;8;8;8;N;EASTERN ARABIC-INDIC DIGIT EIGHT;;;; +06F9;EXTENDED ARABIC-INDIC DIGIT NINE;Nd;0;EN;;9;9;9;N;EASTERN ARABIC-INDIC DIGIT NINE;;;; +06FA;ARABIC LETTER SHEEN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FB;ARABIC LETTER DAD WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FC;ARABIC LETTER GHAIN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FD;ARABIC SIGN SINDHI AMPERSAND;So;0;AL;;;;;N;;;;; +06FE;ARABIC SIGN SINDHI POSTPOSITION MEN;So;0;AL;;;;;N;;;;; +06FF;ARABIC LETTER HEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +0700;SYRIAC END OF PARAGRAPH;Po;0;AL;;;;;N;;;;; +0701;SYRIAC SUPRALINEAR FULL STOP;Po;0;AL;;;;;N;;;;; +0702;SYRIAC SUBLINEAR FULL STOP;Po;0;AL;;;;;N;;;;; +0703;SYRIAC SUPRALINEAR COLON;Po;0;AL;;;;;N;;;;; +0704;SYRIAC SUBLINEAR COLON;Po;0;AL;;;;;N;;;;; +0705;SYRIAC HORIZONTAL COLON;Po;0;AL;;;;;N;;;;; +0706;SYRIAC COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; +0707;SYRIAC COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; +0708;SYRIAC SUPRALINEAR COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; +0709;SYRIAC SUBLINEAR COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; +070A;SYRIAC CONTRACTION;Po;0;AL;;;;;N;;;;; +070B;SYRIAC HARKLEAN OBELUS;Po;0;AL;;;;;N;;;;; +070C;SYRIAC HARKLEAN METOBELUS;Po;0;AL;;;;;N;;;;; +070D;SYRIAC HARKLEAN ASTERISCUS;Po;0;AL;;;;;N;;;;; +070F;SYRIAC ABBREVIATION MARK;Cf;0;BN;;;;;N;;;;; +0710;SYRIAC LETTER ALAPH;Lo;0;AL;;;;;N;;;;; +0711;SYRIAC LETTER SUPERSCRIPT ALAPH;Mn;36;NSM;;;;;N;;;;; +0712;SYRIAC LETTER BETH;Lo;0;AL;;;;;N;;;;; +0713;SYRIAC LETTER GAMAL;Lo;0;AL;;;;;N;;;;; +0714;SYRIAC LETTER GAMAL GARSHUNI;Lo;0;AL;;;;;N;;;;; +0715;SYRIAC LETTER DALATH;Lo;0;AL;;;;;N;;;;; +0716;SYRIAC LETTER DOTLESS DALATH RISH;Lo;0;AL;;;;;N;;;;; +0717;SYRIAC LETTER HE;Lo;0;AL;;;;;N;;;;; +0718;SYRIAC LETTER WAW;Lo;0;AL;;;;;N;;;;; +0719;SYRIAC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; +071A;SYRIAC LETTER HETH;Lo;0;AL;;;;;N;;;;; +071B;SYRIAC LETTER TETH;Lo;0;AL;;;;;N;;;;; +071C;SYRIAC LETTER TETH GARSHUNI;Lo;0;AL;;;;;N;;;;; +071D;SYRIAC LETTER YUDH;Lo;0;AL;;;;;N;;;;; +071E;SYRIAC LETTER YUDH HE;Lo;0;AL;;;;;N;;;;; +071F;SYRIAC LETTER KAPH;Lo;0;AL;;;;;N;;;;; +0720;SYRIAC LETTER LAMADH;Lo;0;AL;;;;;N;;;;; +0721;SYRIAC LETTER MIM;Lo;0;AL;;;;;N;;;;; +0722;SYRIAC LETTER NUN;Lo;0;AL;;;;;N;;;;; +0723;SYRIAC LETTER SEMKATH;Lo;0;AL;;;;;N;;;;; +0724;SYRIAC LETTER FINAL SEMKATH;Lo;0;AL;;;;;N;;;;; +0725;SYRIAC LETTER E;Lo;0;AL;;;;;N;;;;; +0726;SYRIAC LETTER PE;Lo;0;AL;;;;;N;;;;; +0727;SYRIAC LETTER REVERSED PE;Lo;0;AL;;;;;N;;;;; +0728;SYRIAC LETTER SADHE;Lo;0;AL;;;;;N;;;;; +0729;SYRIAC LETTER QAPH;Lo;0;AL;;;;;N;;;;; +072A;SYRIAC LETTER RISH;Lo;0;AL;;;;;N;;;;; +072B;SYRIAC LETTER SHIN;Lo;0;AL;;;;;N;;;;; +072C;SYRIAC LETTER TAW;Lo;0;AL;;;;;N;;;;; +072D;SYRIAC LETTER PERSIAN BHETH;Lo;0;AL;;;;;N;;;;; +072E;SYRIAC LETTER PERSIAN GHAMAL;Lo;0;AL;;;;;N;;;;; +072F;SYRIAC LETTER PERSIAN DHALATH;Lo;0;AL;;;;;N;;;;; +0730;SYRIAC PTHAHA ABOVE;Mn;230;NSM;;;;;N;;;;; +0731;SYRIAC PTHAHA BELOW;Mn;220;NSM;;;;;N;;;;; +0732;SYRIAC PTHAHA DOTTED;Mn;230;NSM;;;;;N;;;;; +0733;SYRIAC ZQAPHA ABOVE;Mn;230;NSM;;;;;N;;;;; +0734;SYRIAC ZQAPHA BELOW;Mn;220;NSM;;;;;N;;;;; +0735;SYRIAC ZQAPHA DOTTED;Mn;230;NSM;;;;;N;;;;; +0736;SYRIAC RBASA ABOVE;Mn;230;NSM;;;;;N;;;;; +0737;SYRIAC RBASA BELOW;Mn;220;NSM;;;;;N;;;;; +0738;SYRIAC DOTTED ZLAMA HORIZONTAL;Mn;220;NSM;;;;;N;;;;; +0739;SYRIAC DOTTED ZLAMA ANGULAR;Mn;220;NSM;;;;;N;;;;; +073A;SYRIAC HBASA ABOVE;Mn;230;NSM;;;;;N;;;;; +073B;SYRIAC HBASA BELOW;Mn;220;NSM;;;;;N;;;;; +073C;SYRIAC HBASA-ESASA DOTTED;Mn;220;NSM;;;;;N;;;;; +073D;SYRIAC ESASA ABOVE;Mn;230;NSM;;;;;N;;;;; +073E;SYRIAC ESASA BELOW;Mn;220;NSM;;;;;N;;;;; +073F;SYRIAC RWAHA;Mn;230;NSM;;;;;N;;;;; +0740;SYRIAC FEMININE DOT;Mn;230;NSM;;;;;N;;;;; +0741;SYRIAC QUSHSHAYA;Mn;230;NSM;;;;;N;;;;; +0742;SYRIAC RUKKAKHA;Mn;220;NSM;;;;;N;;;;; +0743;SYRIAC TWO VERTICAL DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +0744;SYRIAC TWO VERTICAL DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +0745;SYRIAC THREE DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +0746;SYRIAC THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +0747;SYRIAC OBLIQUE LINE ABOVE;Mn;230;NSM;;;;;N;;;;; +0748;SYRIAC OBLIQUE LINE BELOW;Mn;220;NSM;;;;;N;;;;; +0749;SYRIAC MUSIC;Mn;230;NSM;;;;;N;;;;; +074A;SYRIAC BARREKH;Mn;230;NSM;;;;;N;;;;; +074D;SYRIAC LETTER SOGDIAN ZHAIN;Lo;0;AL;;;;;N;;;;; +074E;SYRIAC LETTER SOGDIAN KHAPH;Lo;0;AL;;;;;N;;;;; +074F;SYRIAC LETTER SOGDIAN FE;Lo;0;AL;;;;;N;;;;; +0750;ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW;Lo;0;AL;;;;;N;;;;; +0751;ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0752;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0753;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0754;ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0755;ARABIC LETTER BEH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +0756;ARABIC LETTER BEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +0757;ARABIC LETTER HAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0758;ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0759;ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; +075A;ARABIC LETTER DAL WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +075B;ARABIC LETTER REH WITH STROKE;Lo;0;AL;;;;;N;;;;; +075C;ARABIC LETTER SEEN WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +075D;ARABIC LETTER AIN WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +075E;ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE;Lo;0;AL;;;;;N;;;;; +075F;ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +0760;ARABIC LETTER FEH WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0761;ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0762;ARABIC LETTER KEHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0763;ARABIC LETTER KEHEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0764;ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0765;ARABIC LETTER MEEM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0766;ARABIC LETTER MEEM WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +0767;ARABIC LETTER NOON WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0768;ARABIC LETTER NOON WITH SMALL TAH;Lo;0;AL;;;;;N;;;;; +0769;ARABIC LETTER NOON WITH SMALL V;Lo;0;AL;;;;;N;;;;; +076A;ARABIC LETTER LAM WITH BAR;Lo;0;AL;;;;;N;;;;; +076B;ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +076C;ARABIC LETTER REH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; +076D;ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +076E;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW;Lo;0;AL;;;;;N;;;;; +076F;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0770;ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0771;ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0772;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;; +0773;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0774;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +0775;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0776;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +0777;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; +0778;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0779;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +077A;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +077B;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +077C;ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; +077D;ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE;Lo;0;AL;;;;;N;;;;; +077E;ARABIC LETTER SEEN WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +077F;ARABIC LETTER KAF WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;; +0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;; +0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;; +0783;THAANA LETTER RAA;Lo;0;AL;;;;;N;;;;; +0784;THAANA LETTER BAA;Lo;0;AL;;;;;N;;;;; +0785;THAANA LETTER LHAVIYANI;Lo;0;AL;;;;;N;;;;; +0786;THAANA LETTER KAAFU;Lo;0;AL;;;;;N;;;;; +0787;THAANA LETTER ALIFU;Lo;0;AL;;;;;N;;;;; +0788;THAANA LETTER VAAVU;Lo;0;AL;;;;;N;;;;; +0789;THAANA LETTER MEEMU;Lo;0;AL;;;;;N;;;;; +078A;THAANA LETTER FAAFU;Lo;0;AL;;;;;N;;;;; +078B;THAANA LETTER DHAALU;Lo;0;AL;;;;;N;;;;; +078C;THAANA LETTER THAA;Lo;0;AL;;;;;N;;;;; +078D;THAANA LETTER LAAMU;Lo;0;AL;;;;;N;;;;; +078E;THAANA LETTER GAAFU;Lo;0;AL;;;;;N;;;;; +078F;THAANA LETTER GNAVIYANI;Lo;0;AL;;;;;N;;;;; +0790;THAANA LETTER SEENU;Lo;0;AL;;;;;N;;;;; +0791;THAANA LETTER DAVIYANI;Lo;0;AL;;;;;N;;;;; +0792;THAANA LETTER ZAVIYANI;Lo;0;AL;;;;;N;;;;; +0793;THAANA LETTER TAVIYANI;Lo;0;AL;;;;;N;;;;; +0794;THAANA LETTER YAA;Lo;0;AL;;;;;N;;;;; +0795;THAANA LETTER PAVIYANI;Lo;0;AL;;;;;N;;;;; +0796;THAANA LETTER JAVIYANI;Lo;0;AL;;;;;N;;;;; +0797;THAANA LETTER CHAVIYANI;Lo;0;AL;;;;;N;;;;; +0798;THAANA LETTER TTAA;Lo;0;AL;;;;;N;;;;; +0799;THAANA LETTER HHAA;Lo;0;AL;;;;;N;;;;; +079A;THAANA LETTER KHAA;Lo;0;AL;;;;;N;;;;; +079B;THAANA LETTER THAALU;Lo;0;AL;;;;;N;;;;; +079C;THAANA LETTER ZAA;Lo;0;AL;;;;;N;;;;; +079D;THAANA LETTER SHEENU;Lo;0;AL;;;;;N;;;;; +079E;THAANA LETTER SAADHU;Lo;0;AL;;;;;N;;;;; +079F;THAANA LETTER DAADHU;Lo;0;AL;;;;;N;;;;; +07A0;THAANA LETTER TO;Lo;0;AL;;;;;N;;;;; +07A1;THAANA LETTER ZO;Lo;0;AL;;;;;N;;;;; +07A2;THAANA LETTER AINU;Lo;0;AL;;;;;N;;;;; +07A3;THAANA LETTER GHAINU;Lo;0;AL;;;;;N;;;;; +07A4;THAANA LETTER QAAFU;Lo;0;AL;;;;;N;;;;; +07A5;THAANA LETTER WAAVU;Lo;0;AL;;;;;N;;;;; +07A6;THAANA ABAFILI;Mn;0;NSM;;;;;N;;;;; +07A7;THAANA AABAAFILI;Mn;0;NSM;;;;;N;;;;; +07A8;THAANA IBIFILI;Mn;0;NSM;;;;;N;;;;; +07A9;THAANA EEBEEFILI;Mn;0;NSM;;;;;N;;;;; +07AA;THAANA UBUFILI;Mn;0;NSM;;;;;N;;;;; +07AB;THAANA OOBOOFILI;Mn;0;NSM;;;;;N;;;;; +07AC;THAANA EBEFILI;Mn;0;NSM;;;;;N;;;;; +07AD;THAANA EYBEYFILI;Mn;0;NSM;;;;;N;;;;; +07AE;THAANA OBOFILI;Mn;0;NSM;;;;;N;;;;; +07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;; +07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;; +07B1;THAANA LETTER NAA;Lo;0;AL;;;;;N;;;;; +07C0;NKO DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;; +07C1;NKO DIGIT ONE;Nd;0;R;;1;1;1;N;;;;; +07C2;NKO DIGIT TWO;Nd;0;R;;2;2;2;N;;;;; +07C3;NKO DIGIT THREE;Nd;0;R;;3;3;3;N;;;;; +07C4;NKO DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;; +07C5;NKO DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;; +07C6;NKO DIGIT SIX;Nd;0;R;;6;6;6;N;;;;; +07C7;NKO DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;; +07C8;NKO DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;; +07C9;NKO DIGIT NINE;Nd;0;R;;9;9;9;N;;;;; +07CA;NKO LETTER A;Lo;0;R;;;;;N;;;;; +07CB;NKO LETTER EE;Lo;0;R;;;;;N;;;;; +07CC;NKO LETTER I;Lo;0;R;;;;;N;;;;; +07CD;NKO LETTER E;Lo;0;R;;;;;N;;;;; +07CE;NKO LETTER U;Lo;0;R;;;;;N;;;;; +07CF;NKO LETTER OO;Lo;0;R;;;;;N;;;;; +07D0;NKO LETTER O;Lo;0;R;;;;;N;;;;; +07D1;NKO LETTER DAGBASINNA;Lo;0;R;;;;;N;;;;; +07D2;NKO LETTER N;Lo;0;R;;;;;N;;;;; +07D3;NKO LETTER BA;Lo;0;R;;;;;N;;;;; +07D4;NKO LETTER PA;Lo;0;R;;;;;N;;;;; +07D5;NKO LETTER TA;Lo;0;R;;;;;N;;;;; +07D6;NKO LETTER JA;Lo;0;R;;;;;N;;;;; +07D7;NKO LETTER CHA;Lo;0;R;;;;;N;;;;; +07D8;NKO LETTER DA;Lo;0;R;;;;;N;;;;; +07D9;NKO LETTER RA;Lo;0;R;;;;;N;;;;; +07DA;NKO LETTER RRA;Lo;0;R;;;;;N;;;;; +07DB;NKO LETTER SA;Lo;0;R;;;;;N;;;;; +07DC;NKO LETTER GBA;Lo;0;R;;;;;N;;;;; +07DD;NKO LETTER FA;Lo;0;R;;;;;N;;;;; +07DE;NKO LETTER KA;Lo;0;R;;;;;N;;;;; +07DF;NKO LETTER LA;Lo;0;R;;;;;N;;;;; +07E0;NKO LETTER NA WOLOSO;Lo;0;R;;;;;N;;;;; +07E1;NKO LETTER MA;Lo;0;R;;;;;N;;;;; +07E2;NKO LETTER NYA;Lo;0;R;;;;;N;;;;; +07E3;NKO LETTER NA;Lo;0;R;;;;;N;;;;; +07E4;NKO LETTER HA;Lo;0;R;;;;;N;;;;; +07E5;NKO LETTER WA;Lo;0;R;;;;;N;;;;; +07E6;NKO LETTER YA;Lo;0;R;;;;;N;;;;; +07E7;NKO LETTER NYA WOLOSO;Lo;0;R;;;;;N;;;;; +07E8;NKO LETTER JONA JA;Lo;0;R;;;;;N;;;;; +07E9;NKO LETTER JONA CHA;Lo;0;R;;;;;N;;;;; +07EA;NKO LETTER JONA RA;Lo;0;R;;;;;N;;;;; +07EB;NKO COMBINING SHORT HIGH TONE;Mn;230;NSM;;;;;N;;;;; +07EC;NKO COMBINING SHORT LOW TONE;Mn;230;NSM;;;;;N;;;;; +07ED;NKO COMBINING SHORT RISING TONE;Mn;230;NSM;;;;;N;;;;; +07EE;NKO COMBINING LONG DESCENDING TONE;Mn;230;NSM;;;;;N;;;;; +07EF;NKO COMBINING LONG HIGH TONE;Mn;230;NSM;;;;;N;;;;; +07F0;NKO COMBINING LONG LOW TONE;Mn;230;NSM;;;;;N;;;;; +07F1;NKO COMBINING LONG RISING TONE;Mn;230;NSM;;;;;N;;;;; +07F2;NKO COMBINING NASALIZATION MARK;Mn;220;NSM;;;;;N;;;;; +07F3;NKO COMBINING DOUBLE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +07F4;NKO HIGH TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; +07F5;NKO LOW TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; +07F6;NKO SYMBOL OO DENNEN;So;0;ON;;;;;N;;;;; +07F7;NKO SYMBOL GBAKURUNEN;Po;0;ON;;;;;N;;;;; +07F8;NKO COMMA;Po;0;ON;;;;;N;;;;; +07F9;NKO EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +07FA;NKO LAJANYALAN;Lm;0;R;;;;;N;;;;; +0800;SAMARITAN LETTER ALAF;Lo;0;R;;;;;N;;;;; +0801;SAMARITAN LETTER BIT;Lo;0;R;;;;;N;;;;; +0802;SAMARITAN LETTER GAMAN;Lo;0;R;;;;;N;;;;; +0803;SAMARITAN LETTER DALAT;Lo;0;R;;;;;N;;;;; +0804;SAMARITAN LETTER IY;Lo;0;R;;;;;N;;;;; +0805;SAMARITAN LETTER BAA;Lo;0;R;;;;;N;;;;; +0806;SAMARITAN LETTER ZEN;Lo;0;R;;;;;N;;;;; +0807;SAMARITAN LETTER IT;Lo;0;R;;;;;N;;;;; +0808;SAMARITAN LETTER TIT;Lo;0;R;;;;;N;;;;; +0809;SAMARITAN LETTER YUT;Lo;0;R;;;;;N;;;;; +080A;SAMARITAN LETTER KAAF;Lo;0;R;;;;;N;;;;; +080B;SAMARITAN LETTER LABAT;Lo;0;R;;;;;N;;;;; +080C;SAMARITAN LETTER MIM;Lo;0;R;;;;;N;;;;; +080D;SAMARITAN LETTER NUN;Lo;0;R;;;;;N;;;;; +080E;SAMARITAN LETTER SINGAAT;Lo;0;R;;;;;N;;;;; +080F;SAMARITAN LETTER IN;Lo;0;R;;;;;N;;;;; +0810;SAMARITAN LETTER FI;Lo;0;R;;;;;N;;;;; +0811;SAMARITAN LETTER TSAADIY;Lo;0;R;;;;;N;;;;; +0812;SAMARITAN LETTER QUF;Lo;0;R;;;;;N;;;;; +0813;SAMARITAN LETTER RISH;Lo;0;R;;;;;N;;;;; +0814;SAMARITAN LETTER SHAN;Lo;0;R;;;;;N;;;;; +0815;SAMARITAN LETTER TAAF;Lo;0;R;;;;;N;;;;; +0816;SAMARITAN MARK IN;Mn;230;NSM;;;;;N;;;;; +0817;SAMARITAN MARK IN-ALAF;Mn;230;NSM;;;;;N;;;;; +0818;SAMARITAN MARK OCCLUSION;Mn;230;NSM;;;;;N;;;;; +0819;SAMARITAN MARK DAGESH;Mn;230;NSM;;;;;N;;;;; +081A;SAMARITAN MODIFIER LETTER EPENTHETIC YUT;Lm;0;R;;;;;N;;;;; +081B;SAMARITAN MARK EPENTHETIC YUT;Mn;230;NSM;;;;;N;;;;; +081C;SAMARITAN VOWEL SIGN LONG E;Mn;230;NSM;;;;;N;;;;; +081D;SAMARITAN VOWEL SIGN E;Mn;230;NSM;;;;;N;;;;; +081E;SAMARITAN VOWEL SIGN OVERLONG AA;Mn;230;NSM;;;;;N;;;;; +081F;SAMARITAN VOWEL SIGN LONG AA;Mn;230;NSM;;;;;N;;;;; +0820;SAMARITAN VOWEL SIGN AA;Mn;230;NSM;;;;;N;;;;; +0821;SAMARITAN VOWEL SIGN OVERLONG A;Mn;230;NSM;;;;;N;;;;; +0822;SAMARITAN VOWEL SIGN LONG A;Mn;230;NSM;;;;;N;;;;; +0823;SAMARITAN VOWEL SIGN A;Mn;230;NSM;;;;;N;;;;; +0824;SAMARITAN MODIFIER LETTER SHORT A;Lm;0;R;;;;;N;;;;; +0825;SAMARITAN VOWEL SIGN SHORT A;Mn;230;NSM;;;;;N;;;;; +0826;SAMARITAN VOWEL SIGN LONG U;Mn;230;NSM;;;;;N;;;;; +0827;SAMARITAN VOWEL SIGN U;Mn;230;NSM;;;;;N;;;;; +0828;SAMARITAN MODIFIER LETTER I;Lm;0;R;;;;;N;;;;; +0829;SAMARITAN VOWEL SIGN LONG I;Mn;230;NSM;;;;;N;;;;; +082A;SAMARITAN VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; +082B;SAMARITAN VOWEL SIGN O;Mn;230;NSM;;;;;N;;;;; +082C;SAMARITAN VOWEL SIGN SUKUN;Mn;230;NSM;;;;;N;;;;; +082D;SAMARITAN MARK NEQUDAA;Mn;230;NSM;;;;;N;;;;; +0830;SAMARITAN PUNCTUATION NEQUDAA;Po;0;R;;;;;N;;;;; +0831;SAMARITAN PUNCTUATION AFSAAQ;Po;0;R;;;;;N;;;;; +0832;SAMARITAN PUNCTUATION ANGED;Po;0;R;;;;;N;;;;; +0833;SAMARITAN PUNCTUATION BAU;Po;0;R;;;;;N;;;;; +0834;SAMARITAN PUNCTUATION ATMAAU;Po;0;R;;;;;N;;;;; +0835;SAMARITAN PUNCTUATION SHIYYAALAA;Po;0;R;;;;;N;;;;; +0836;SAMARITAN ABBREVIATION MARK;Po;0;R;;;;;N;;;;; +0837;SAMARITAN PUNCTUATION MELODIC QITSA;Po;0;R;;;;;N;;;;; +0838;SAMARITAN PUNCTUATION ZIQAA;Po;0;R;;;;;N;;;;; +0839;SAMARITAN PUNCTUATION QITSA;Po;0;R;;;;;N;;;;; +083A;SAMARITAN PUNCTUATION ZAEF;Po;0;R;;;;;N;;;;; +083B;SAMARITAN PUNCTUATION TURU;Po;0;R;;;;;N;;;;; +083C;SAMARITAN PUNCTUATION ARKAANU;Po;0;R;;;;;N;;;;; +083D;SAMARITAN PUNCTUATION SOF MASHFAAT;Po;0;R;;;;;N;;;;; +083E;SAMARITAN PUNCTUATION ANNAAU;Po;0;R;;;;;N;;;;; +0900;DEVANAGARI SIGN INVERTED CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0904;DEVANAGARI LETTER SHORT A;Lo;0;L;;;;;N;;;;; +0905;DEVANAGARI LETTER A;Lo;0;L;;;;;N;;;;; +0906;DEVANAGARI LETTER AA;Lo;0;L;;;;;N;;;;; +0907;DEVANAGARI LETTER I;Lo;0;L;;;;;N;;;;; +0908;DEVANAGARI LETTER II;Lo;0;L;;;;;N;;;;; +0909;DEVANAGARI LETTER U;Lo;0;L;;;;;N;;;;; +090A;DEVANAGARI LETTER UU;Lo;0;L;;;;;N;;;;; +090B;DEVANAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +090C;DEVANAGARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +090D;DEVANAGARI LETTER CANDRA E;Lo;0;L;;;;;N;;;;; +090E;DEVANAGARI LETTER SHORT E;Lo;0;L;;;;;N;;;;; +090F;DEVANAGARI LETTER E;Lo;0;L;;;;;N;;;;; +0910;DEVANAGARI LETTER AI;Lo;0;L;;;;;N;;;;; +0911;DEVANAGARI LETTER CANDRA O;Lo;0;L;;;;;N;;;;; +0912;DEVANAGARI LETTER SHORT O;Lo;0;L;;;;;N;;;;; +0913;DEVANAGARI LETTER O;Lo;0;L;;;;;N;;;;; +0914;DEVANAGARI LETTER AU;Lo;0;L;;;;;N;;;;; +0915;DEVANAGARI LETTER KA;Lo;0;L;;;;;N;;;;; +0916;DEVANAGARI LETTER KHA;Lo;0;L;;;;;N;;;;; +0917;DEVANAGARI LETTER GA;Lo;0;L;;;;;N;;;;; +0918;DEVANAGARI LETTER GHA;Lo;0;L;;;;;N;;;;; +0919;DEVANAGARI LETTER NGA;Lo;0;L;;;;;N;;;;; +091A;DEVANAGARI LETTER CA;Lo;0;L;;;;;N;;;;; +091B;DEVANAGARI LETTER CHA;Lo;0;L;;;;;N;;;;; +091C;DEVANAGARI LETTER JA;Lo;0;L;;;;;N;;;;; +091D;DEVANAGARI LETTER JHA;Lo;0;L;;;;;N;;;;; +091E;DEVANAGARI LETTER NYA;Lo;0;L;;;;;N;;;;; +091F;DEVANAGARI LETTER TTA;Lo;0;L;;;;;N;;;;; +0920;DEVANAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0921;DEVANAGARI LETTER DDA;Lo;0;L;;;;;N;;;;; +0922;DEVANAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0923;DEVANAGARI LETTER NNA;Lo;0;L;;;;;N;;;;; +0924;DEVANAGARI LETTER TA;Lo;0;L;;;;;N;;;;; +0925;DEVANAGARI LETTER THA;Lo;0;L;;;;;N;;;;; +0926;DEVANAGARI LETTER DA;Lo;0;L;;;;;N;;;;; +0927;DEVANAGARI LETTER DHA;Lo;0;L;;;;;N;;;;; +0928;DEVANAGARI LETTER NA;Lo;0;L;;;;;N;;;;; +0929;DEVANAGARI LETTER NNNA;Lo;0;L;0928 093C;;;;N;;;;; +092A;DEVANAGARI LETTER PA;Lo;0;L;;;;;N;;;;; +092B;DEVANAGARI LETTER PHA;Lo;0;L;;;;;N;;;;; +092C;DEVANAGARI LETTER BA;Lo;0;L;;;;;N;;;;; +092D;DEVANAGARI LETTER BHA;Lo;0;L;;;;;N;;;;; +092E;DEVANAGARI LETTER MA;Lo;0;L;;;;;N;;;;; +092F;DEVANAGARI LETTER YA;Lo;0;L;;;;;N;;;;; +0930;DEVANAGARI LETTER RA;Lo;0;L;;;;;N;;;;; +0931;DEVANAGARI LETTER RRA;Lo;0;L;0930 093C;;;;N;;;;; +0932;DEVANAGARI LETTER LA;Lo;0;L;;;;;N;;;;; +0933;DEVANAGARI LETTER LLA;Lo;0;L;;;;;N;;;;; +0934;DEVANAGARI LETTER LLLA;Lo;0;L;0933 093C;;;;N;;;;; +0935;DEVANAGARI LETTER VA;Lo;0;L;;;;;N;;;;; +0936;DEVANAGARI LETTER SHA;Lo;0;L;;;;;N;;;;; +0937;DEVANAGARI LETTER SSA;Lo;0;L;;;;;N;;;;; +0938;DEVANAGARI LETTER SA;Lo;0;L;;;;;N;;;;; +0939;DEVANAGARI LETTER HA;Lo;0;L;;;;;N;;;;; +093C;DEVANAGARI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +093D;DEVANAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +093E;DEVANAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +093F;DEVANAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0940;DEVANAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0941;DEVANAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0942;DEVANAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0943;DEVANAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0944;DEVANAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0945;DEVANAGARI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; +0946;DEVANAGARI VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; +0947;DEVANAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0948;DEVANAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0949;DEVANAGARI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; +094A;DEVANAGARI VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; +094B;DEVANAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +094C;DEVANAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +094D;DEVANAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +094E;DEVANAGARI VOWEL SIGN PRISHTHAMATRA E;Mc;0;L;;;;;N;;;;; +0950;DEVANAGARI OM;Lo;0;L;;;;;N;;;;; +0951;DEVANAGARI STRESS SIGN UDATTA;Mn;230;NSM;;;;;N;;;;; +0952;DEVANAGARI STRESS SIGN ANUDATTA;Mn;220;NSM;;;;;N;;;;; +0953;DEVANAGARI GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; +0954;DEVANAGARI ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; +0955;DEVANAGARI VOWEL SIGN CANDRA LONG E;Mn;0;NSM;;;;;N;;;;; +0958;DEVANAGARI LETTER QA;Lo;0;L;0915 093C;;;;N;;;;; +0959;DEVANAGARI LETTER KHHA;Lo;0;L;0916 093C;;;;N;;;;; +095A;DEVANAGARI LETTER GHHA;Lo;0;L;0917 093C;;;;N;;;;; +095B;DEVANAGARI LETTER ZA;Lo;0;L;091C 093C;;;;N;;;;; +095C;DEVANAGARI LETTER DDDHA;Lo;0;L;0921 093C;;;;N;;;;; +095D;DEVANAGARI LETTER RHA;Lo;0;L;0922 093C;;;;N;;;;; +095E;DEVANAGARI LETTER FA;Lo;0;L;092B 093C;;;;N;;;;; +095F;DEVANAGARI LETTER YYA;Lo;0;L;092F 093C;;;;N;;;;; +0960;DEVANAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0961;DEVANAGARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0962;DEVANAGARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0963;DEVANAGARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0964;DEVANAGARI DANDA;Po;0;L;;;;;N;;;;; +0965;DEVANAGARI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +0966;DEVANAGARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0967;DEVANAGARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0968;DEVANAGARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0969;DEVANAGARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +096A;DEVANAGARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +096B;DEVANAGARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +096C;DEVANAGARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +096D;DEVANAGARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +0971;DEVANAGARI SIGN HIGH SPACING DOT;Lm;0;L;;;;;N;;;;; +0972;DEVANAGARI LETTER CANDRA A;Lo;0;L;;;;;N;;;;; +0979;DEVANAGARI LETTER ZHA;Lo;0;L;;;;;N;;;;; +097A;DEVANAGARI LETTER HEAVY YA;Lo;0;L;;;;;N;;;;; +097B;DEVANAGARI LETTER GGA;Lo;0;L;;;;;N;;;;; +097C;DEVANAGARI LETTER JJA;Lo;0;L;;;;;N;;;;; +097D;DEVANAGARI LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +097E;DEVANAGARI LETTER DDDA;Lo;0;L;;;;;N;;;;; +097F;DEVANAGARI LETTER BBA;Lo;0;L;;;;;N;;;;; +0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0985;BENGALI LETTER A;Lo;0;L;;;;;N;;;;; +0986;BENGALI LETTER AA;Lo;0;L;;;;;N;;;;; +0987;BENGALI LETTER I;Lo;0;L;;;;;N;;;;; +0988;BENGALI LETTER II;Lo;0;L;;;;;N;;;;; +0989;BENGALI LETTER U;Lo;0;L;;;;;N;;;;; +098A;BENGALI LETTER UU;Lo;0;L;;;;;N;;;;; +098B;BENGALI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +098C;BENGALI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +098F;BENGALI LETTER E;Lo;0;L;;;;;N;;;;; +0990;BENGALI LETTER AI;Lo;0;L;;;;;N;;;;; +0993;BENGALI LETTER O;Lo;0;L;;;;;N;;;;; +0994;BENGALI LETTER AU;Lo;0;L;;;;;N;;;;; +0995;BENGALI LETTER KA;Lo;0;L;;;;;N;;;;; +0996;BENGALI LETTER KHA;Lo;0;L;;;;;N;;;;; +0997;BENGALI LETTER GA;Lo;0;L;;;;;N;;;;; +0998;BENGALI LETTER GHA;Lo;0;L;;;;;N;;;;; +0999;BENGALI LETTER NGA;Lo;0;L;;;;;N;;;;; +099A;BENGALI LETTER CA;Lo;0;L;;;;;N;;;;; +099B;BENGALI LETTER CHA;Lo;0;L;;;;;N;;;;; +099C;BENGALI LETTER JA;Lo;0;L;;;;;N;;;;; +099D;BENGALI LETTER JHA;Lo;0;L;;;;;N;;;;; +099E;BENGALI LETTER NYA;Lo;0;L;;;;;N;;;;; +099F;BENGALI LETTER TTA;Lo;0;L;;;;;N;;;;; +09A0;BENGALI LETTER TTHA;Lo;0;L;;;;;N;;;;; +09A1;BENGALI LETTER DDA;Lo;0;L;;;;;N;;;;; +09A2;BENGALI LETTER DDHA;Lo;0;L;;;;;N;;;;; +09A3;BENGALI LETTER NNA;Lo;0;L;;;;;N;;;;; +09A4;BENGALI LETTER TA;Lo;0;L;;;;;N;;;;; +09A5;BENGALI LETTER THA;Lo;0;L;;;;;N;;;;; +09A6;BENGALI LETTER DA;Lo;0;L;;;;;N;;;;; +09A7;BENGALI LETTER DHA;Lo;0;L;;;;;N;;;;; +09A8;BENGALI LETTER NA;Lo;0;L;;;;;N;;;;; +09AA;BENGALI LETTER PA;Lo;0;L;;;;;N;;;;; +09AB;BENGALI LETTER PHA;Lo;0;L;;;;;N;;;;; +09AC;BENGALI LETTER BA;Lo;0;L;;;;;N;;;;; +09AD;BENGALI LETTER BHA;Lo;0;L;;;;;N;;;;; +09AE;BENGALI LETTER MA;Lo;0;L;;;;;N;;;;; +09AF;BENGALI LETTER YA;Lo;0;L;;;;;N;;;;; +09B0;BENGALI LETTER RA;Lo;0;L;;;;;N;;;;; +09B2;BENGALI LETTER LA;Lo;0;L;;;;;N;;;;; +09B6;BENGALI LETTER SHA;Lo;0;L;;;;;N;;;;; +09B7;BENGALI LETTER SSA;Lo;0;L;;;;;N;;;;; +09B8;BENGALI LETTER SA;Lo;0;L;;;;;N;;;;; +09B9;BENGALI LETTER HA;Lo;0;L;;;;;N;;;;; +09BC;BENGALI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +09BD;BENGALI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +09BE;BENGALI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +09BF;BENGALI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +09C0;BENGALI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +09C1;BENGALI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +09C2;BENGALI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +09C3;BENGALI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +09C4;BENGALI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +09C7;BENGALI VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +09C8;BENGALI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;; +09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;; +09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +09CE;BENGALI LETTER KHANDA TA;Lo;0;L;;;;;N;;;;; +09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;; +09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;; +09DF;BENGALI LETTER YYA;Lo;0;L;09AF 09BC;;;;N;;;;; +09E0;BENGALI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +09E1;BENGALI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +09E2;BENGALI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +09E3;BENGALI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +09E6;BENGALI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +09E7;BENGALI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +09E8;BENGALI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +09E9;BENGALI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +09EA;BENGALI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +09EB;BENGALI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +09EC;BENGALI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +09ED;BENGALI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +09EE;BENGALI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +09EF;BENGALI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +09F0;BENGALI LETTER RA WITH MIDDLE DIAGONAL;Lo;0;L;;;;;N;;;;; +09F1;BENGALI LETTER RA WITH LOWER DIAGONAL;Lo;0;L;;;;;N;BENGALI LETTER VA WITH LOWER DIAGONAL;;;; +09F2;BENGALI RUPEE MARK;Sc;0;ET;;;;;N;;;;; +09F3;BENGALI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +09F4;BENGALI CURRENCY NUMERATOR ONE;No;0;L;;;;1/16;N;;;;; +09F5;BENGALI CURRENCY NUMERATOR TWO;No;0;L;;;;1/8;N;;;;; +09F6;BENGALI CURRENCY NUMERATOR THREE;No;0;L;;;;3/16;N;;;;; +09F7;BENGALI CURRENCY NUMERATOR FOUR;No;0;L;;;;1/4;N;;;;; +09F8;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR;No;0;L;;;;3/4;N;;;;; +09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;; +09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;; +09FB;BENGALI GANDA MARK;Sc;0;ET;;;;;N;;;;; +0A01;GURMUKHI SIGN ADAK BINDI;Mn;0;NSM;;;;;N;;;;; +0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;; +0A03;GURMUKHI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0A05;GURMUKHI LETTER A;Lo;0;L;;;;;N;;;;; +0A06;GURMUKHI LETTER AA;Lo;0;L;;;;;N;;;;; +0A07;GURMUKHI LETTER I;Lo;0;L;;;;;N;;;;; +0A08;GURMUKHI LETTER II;Lo;0;L;;;;;N;;;;; +0A09;GURMUKHI LETTER U;Lo;0;L;;;;;N;;;;; +0A0A;GURMUKHI LETTER UU;Lo;0;L;;;;;N;;;;; +0A0F;GURMUKHI LETTER EE;Lo;0;L;;;;;N;;;;; +0A10;GURMUKHI LETTER AI;Lo;0;L;;;;;N;;;;; +0A13;GURMUKHI LETTER OO;Lo;0;L;;;;;N;;;;; +0A14;GURMUKHI LETTER AU;Lo;0;L;;;;;N;;;;; +0A15;GURMUKHI LETTER KA;Lo;0;L;;;;;N;;;;; +0A16;GURMUKHI LETTER KHA;Lo;0;L;;;;;N;;;;; +0A17;GURMUKHI LETTER GA;Lo;0;L;;;;;N;;;;; +0A18;GURMUKHI LETTER GHA;Lo;0;L;;;;;N;;;;; +0A19;GURMUKHI LETTER NGA;Lo;0;L;;;;;N;;;;; +0A1A;GURMUKHI LETTER CA;Lo;0;L;;;;;N;;;;; +0A1B;GURMUKHI LETTER CHA;Lo;0;L;;;;;N;;;;; +0A1C;GURMUKHI LETTER JA;Lo;0;L;;;;;N;;;;; +0A1D;GURMUKHI LETTER JHA;Lo;0;L;;;;;N;;;;; +0A1E;GURMUKHI LETTER NYA;Lo;0;L;;;;;N;;;;; +0A1F;GURMUKHI LETTER TTA;Lo;0;L;;;;;N;;;;; +0A20;GURMUKHI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0A21;GURMUKHI LETTER DDA;Lo;0;L;;;;;N;;;;; +0A22;GURMUKHI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0A23;GURMUKHI LETTER NNA;Lo;0;L;;;;;N;;;;; +0A24;GURMUKHI LETTER TA;Lo;0;L;;;;;N;;;;; +0A25;GURMUKHI LETTER THA;Lo;0;L;;;;;N;;;;; +0A26;GURMUKHI LETTER DA;Lo;0;L;;;;;N;;;;; +0A27;GURMUKHI LETTER DHA;Lo;0;L;;;;;N;;;;; +0A28;GURMUKHI LETTER NA;Lo;0;L;;;;;N;;;;; +0A2A;GURMUKHI LETTER PA;Lo;0;L;;;;;N;;;;; +0A2B;GURMUKHI LETTER PHA;Lo;0;L;;;;;N;;;;; +0A2C;GURMUKHI LETTER BA;Lo;0;L;;;;;N;;;;; +0A2D;GURMUKHI LETTER BHA;Lo;0;L;;;;;N;;;;; +0A2E;GURMUKHI LETTER MA;Lo;0;L;;;;;N;;;;; +0A2F;GURMUKHI LETTER YA;Lo;0;L;;;;;N;;;;; +0A30;GURMUKHI LETTER RA;Lo;0;L;;;;;N;;;;; +0A32;GURMUKHI LETTER LA;Lo;0;L;;;;;N;;;;; +0A33;GURMUKHI LETTER LLA;Lo;0;L;0A32 0A3C;;;;N;;;;; +0A35;GURMUKHI LETTER VA;Lo;0;L;;;;;N;;;;; +0A36;GURMUKHI LETTER SHA;Lo;0;L;0A38 0A3C;;;;N;;;;; +0A38;GURMUKHI LETTER SA;Lo;0;L;;;;;N;;;;; +0A39;GURMUKHI LETTER HA;Lo;0;L;;;;;N;;;;; +0A3C;GURMUKHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0A3E;GURMUKHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0A3F;GURMUKHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0A40;GURMUKHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0A41;GURMUKHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0A42;GURMUKHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0A47;GURMUKHI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +0A48;GURMUKHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; +0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0A51;GURMUKHI SIGN UDAAT;Mn;0;NSM;;;;;N;;;;; +0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;; +0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;; +0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;; +0A5C;GURMUKHI LETTER RRA;Lo;0;L;;;;;N;;;;; +0A5E;GURMUKHI LETTER FA;Lo;0;L;0A2B 0A3C;;;;N;;;;; +0A66;GURMUKHI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0A67;GURMUKHI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0A68;GURMUKHI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0A69;GURMUKHI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0A6A;GURMUKHI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0A6B;GURMUKHI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0A6C;GURMUKHI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0A6D;GURMUKHI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0A6E;GURMUKHI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0A6F;GURMUKHI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0A70;GURMUKHI TIPPI;Mn;0;NSM;;;;;N;;;;; +0A71;GURMUKHI ADDAK;Mn;0;NSM;;;;;N;;;;; +0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;; +0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;; +0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;; +0A75;GURMUKHI SIGN YAKASH;Mn;0;NSM;;;;;N;;;;; +0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0A85;GUJARATI LETTER A;Lo;0;L;;;;;N;;;;; +0A86;GUJARATI LETTER AA;Lo;0;L;;;;;N;;;;; +0A87;GUJARATI LETTER I;Lo;0;L;;;;;N;;;;; +0A88;GUJARATI LETTER II;Lo;0;L;;;;;N;;;;; +0A89;GUJARATI LETTER U;Lo;0;L;;;;;N;;;;; +0A8A;GUJARATI LETTER UU;Lo;0;L;;;;;N;;;;; +0A8B;GUJARATI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0A8C;GUJARATI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0A8D;GUJARATI VOWEL CANDRA E;Lo;0;L;;;;;N;;;;; +0A8F;GUJARATI LETTER E;Lo;0;L;;;;;N;;;;; +0A90;GUJARATI LETTER AI;Lo;0;L;;;;;N;;;;; +0A91;GUJARATI VOWEL CANDRA O;Lo;0;L;;;;;N;;;;; +0A93;GUJARATI LETTER O;Lo;0;L;;;;;N;;;;; +0A94;GUJARATI LETTER AU;Lo;0;L;;;;;N;;;;; +0A95;GUJARATI LETTER KA;Lo;0;L;;;;;N;;;;; +0A96;GUJARATI LETTER KHA;Lo;0;L;;;;;N;;;;; +0A97;GUJARATI LETTER GA;Lo;0;L;;;;;N;;;;; +0A98;GUJARATI LETTER GHA;Lo;0;L;;;;;N;;;;; +0A99;GUJARATI LETTER NGA;Lo;0;L;;;;;N;;;;; +0A9A;GUJARATI LETTER CA;Lo;0;L;;;;;N;;;;; +0A9B;GUJARATI LETTER CHA;Lo;0;L;;;;;N;;;;; +0A9C;GUJARATI LETTER JA;Lo;0;L;;;;;N;;;;; +0A9D;GUJARATI LETTER JHA;Lo;0;L;;;;;N;;;;; +0A9E;GUJARATI LETTER NYA;Lo;0;L;;;;;N;;;;; +0A9F;GUJARATI LETTER TTA;Lo;0;L;;;;;N;;;;; +0AA0;GUJARATI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0AA1;GUJARATI LETTER DDA;Lo;0;L;;;;;N;;;;; +0AA2;GUJARATI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0AA3;GUJARATI LETTER NNA;Lo;0;L;;;;;N;;;;; +0AA4;GUJARATI LETTER TA;Lo;0;L;;;;;N;;;;; +0AA5;GUJARATI LETTER THA;Lo;0;L;;;;;N;;;;; +0AA6;GUJARATI LETTER DA;Lo;0;L;;;;;N;;;;; +0AA7;GUJARATI LETTER DHA;Lo;0;L;;;;;N;;;;; +0AA8;GUJARATI LETTER NA;Lo;0;L;;;;;N;;;;; +0AAA;GUJARATI LETTER PA;Lo;0;L;;;;;N;;;;; +0AAB;GUJARATI LETTER PHA;Lo;0;L;;;;;N;;;;; +0AAC;GUJARATI LETTER BA;Lo;0;L;;;;;N;;;;; +0AAD;GUJARATI LETTER BHA;Lo;0;L;;;;;N;;;;; +0AAE;GUJARATI LETTER MA;Lo;0;L;;;;;N;;;;; +0AAF;GUJARATI LETTER YA;Lo;0;L;;;;;N;;;;; +0AB0;GUJARATI LETTER RA;Lo;0;L;;;;;N;;;;; +0AB2;GUJARATI LETTER LA;Lo;0;L;;;;;N;;;;; +0AB3;GUJARATI LETTER LLA;Lo;0;L;;;;;N;;;;; +0AB5;GUJARATI LETTER VA;Lo;0;L;;;;;N;;;;; +0AB6;GUJARATI LETTER SHA;Lo;0;L;;;;;N;;;;; +0AB7;GUJARATI LETTER SSA;Lo;0;L;;;;;N;;;;; +0AB8;GUJARATI LETTER SA;Lo;0;L;;;;;N;;;;; +0AB9;GUJARATI LETTER HA;Lo;0;L;;;;;N;;;;; +0ABC;GUJARATI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0ABD;GUJARATI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0ABE;GUJARATI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0ABF;GUJARATI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0AC0;GUJARATI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0AC1;GUJARATI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0AC2;GUJARATI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0AC3;GUJARATI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0AC4;GUJARATI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0AC5;GUJARATI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; +0AC7;GUJARATI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0AC8;GUJARATI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0AC9;GUJARATI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; +0ACB;GUJARATI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +0ACC;GUJARATI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +0ACD;GUJARATI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0AD0;GUJARATI OM;Lo;0;L;;;;;N;;;;; +0AE0;GUJARATI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0AE1;GUJARATI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0AE2;GUJARATI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0AE3;GUJARATI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0AE6;GUJARATI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0AE7;GUJARATI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0AE8;GUJARATI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0AE9;GUJARATI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0AEA;GUJARATI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0AEB;GUJARATI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0AEC;GUJARATI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0AED;GUJARATI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0AEE;GUJARATI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0B05;ORIYA LETTER A;Lo;0;L;;;;;N;;;;; +0B06;ORIYA LETTER AA;Lo;0;L;;;;;N;;;;; +0B07;ORIYA LETTER I;Lo;0;L;;;;;N;;;;; +0B08;ORIYA LETTER II;Lo;0;L;;;;;N;;;;; +0B09;ORIYA LETTER U;Lo;0;L;;;;;N;;;;; +0B0A;ORIYA LETTER UU;Lo;0;L;;;;;N;;;;; +0B0B;ORIYA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0B0C;ORIYA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0B0F;ORIYA LETTER E;Lo;0;L;;;;;N;;;;; +0B10;ORIYA LETTER AI;Lo;0;L;;;;;N;;;;; +0B13;ORIYA LETTER O;Lo;0;L;;;;;N;;;;; +0B14;ORIYA LETTER AU;Lo;0;L;;;;;N;;;;; +0B15;ORIYA LETTER KA;Lo;0;L;;;;;N;;;;; +0B16;ORIYA LETTER KHA;Lo;0;L;;;;;N;;;;; +0B17;ORIYA LETTER GA;Lo;0;L;;;;;N;;;;; +0B18;ORIYA LETTER GHA;Lo;0;L;;;;;N;;;;; +0B19;ORIYA LETTER NGA;Lo;0;L;;;;;N;;;;; +0B1A;ORIYA LETTER CA;Lo;0;L;;;;;N;;;;; +0B1B;ORIYA LETTER CHA;Lo;0;L;;;;;N;;;;; +0B1C;ORIYA LETTER JA;Lo;0;L;;;;;N;;;;; +0B1D;ORIYA LETTER JHA;Lo;0;L;;;;;N;;;;; +0B1E;ORIYA LETTER NYA;Lo;0;L;;;;;N;;;;; +0B1F;ORIYA LETTER TTA;Lo;0;L;;;;;N;;;;; +0B20;ORIYA LETTER TTHA;Lo;0;L;;;;;N;;;;; +0B21;ORIYA LETTER DDA;Lo;0;L;;;;;N;;;;; +0B22;ORIYA LETTER DDHA;Lo;0;L;;;;;N;;;;; +0B23;ORIYA LETTER NNA;Lo;0;L;;;;;N;;;;; +0B24;ORIYA LETTER TA;Lo;0;L;;;;;N;;;;; +0B25;ORIYA LETTER THA;Lo;0;L;;;;;N;;;;; +0B26;ORIYA LETTER DA;Lo;0;L;;;;;N;;;;; +0B27;ORIYA LETTER DHA;Lo;0;L;;;;;N;;;;; +0B28;ORIYA LETTER NA;Lo;0;L;;;;;N;;;;; +0B2A;ORIYA LETTER PA;Lo;0;L;;;;;N;;;;; +0B2B;ORIYA LETTER PHA;Lo;0;L;;;;;N;;;;; +0B2C;ORIYA LETTER BA;Lo;0;L;;;;;N;;;;; +0B2D;ORIYA LETTER BHA;Lo;0;L;;;;;N;;;;; +0B2E;ORIYA LETTER MA;Lo;0;L;;;;;N;;;;; +0B2F;ORIYA LETTER YA;Lo;0;L;;;;;N;;;;; +0B30;ORIYA LETTER RA;Lo;0;L;;;;;N;;;;; +0B32;ORIYA LETTER LA;Lo;0;L;;;;;N;;;;; +0B33;ORIYA LETTER LLA;Lo;0;L;;;;;N;;;;; +0B35;ORIYA LETTER VA;Lo;0;L;;;;;N;;;;; +0B36;ORIYA LETTER SHA;Lo;0;L;;;;;N;;;;; +0B37;ORIYA LETTER SSA;Lo;0;L;;;;;N;;;;; +0B38;ORIYA LETTER SA;Lo;0;L;;;;;N;;;;; +0B39;ORIYA LETTER HA;Lo;0;L;;;;;N;;;;; +0B3C;ORIYA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0B3D;ORIYA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0B3E;ORIYA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0B3F;ORIYA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0B40;ORIYA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0B44;ORIYA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;; +0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;; +0B4C;ORIYA VOWEL SIGN AU;Mc;0;L;0B47 0B57;;;;N;;;;; +0B4D;ORIYA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0B56;ORIYA AI LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +0B57;ORIYA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0B5C;ORIYA LETTER RRA;Lo;0;L;0B21 0B3C;;;;N;;;;; +0B5D;ORIYA LETTER RHA;Lo;0;L;0B22 0B3C;;;;N;;;;; +0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;; +0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0B62;ORIYA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0B63;ORIYA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0B69;ORIYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0B6A;ORIYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0B6B;ORIYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0B6C;ORIYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0B6D;ORIYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0B6E;ORIYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0B6F;ORIYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0B70;ORIYA ISSHAR;So;0;L;;;;;N;;;;; +0B71;ORIYA LETTER WA;Lo;0;L;;;;;N;;;;; +0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0B83;TAMIL SIGN VISARGA;Lo;0;L;;;;;N;;;;; +0B85;TAMIL LETTER A;Lo;0;L;;;;;N;;;;; +0B86;TAMIL LETTER AA;Lo;0;L;;;;;N;;;;; +0B87;TAMIL LETTER I;Lo;0;L;;;;;N;;;;; +0B88;TAMIL LETTER II;Lo;0;L;;;;;N;;;;; +0B89;TAMIL LETTER U;Lo;0;L;;;;;N;;;;; +0B8A;TAMIL LETTER UU;Lo;0;L;;;;;N;;;;; +0B8E;TAMIL LETTER E;Lo;0;L;;;;;N;;;;; +0B8F;TAMIL LETTER EE;Lo;0;L;;;;;N;;;;; +0B90;TAMIL LETTER AI;Lo;0;L;;;;;N;;;;; +0B92;TAMIL LETTER O;Lo;0;L;;;;;N;;;;; +0B93;TAMIL LETTER OO;Lo;0;L;;;;;N;;;;; +0B94;TAMIL LETTER AU;Lo;0;L;0B92 0BD7;;;;N;;;;; +0B95;TAMIL LETTER KA;Lo;0;L;;;;;N;;;;; +0B99;TAMIL LETTER NGA;Lo;0;L;;;;;N;;;;; +0B9A;TAMIL LETTER CA;Lo;0;L;;;;;N;;;;; +0B9C;TAMIL LETTER JA;Lo;0;L;;;;;N;;;;; +0B9E;TAMIL LETTER NYA;Lo;0;L;;;;;N;;;;; +0B9F;TAMIL LETTER TTA;Lo;0;L;;;;;N;;;;; +0BA3;TAMIL LETTER NNA;Lo;0;L;;;;;N;;;;; +0BA4;TAMIL LETTER TA;Lo;0;L;;;;;N;;;;; +0BA8;TAMIL LETTER NA;Lo;0;L;;;;;N;;;;; +0BA9;TAMIL LETTER NNNA;Lo;0;L;;;;;N;;;;; +0BAA;TAMIL LETTER PA;Lo;0;L;;;;;N;;;;; +0BAE;TAMIL LETTER MA;Lo;0;L;;;;;N;;;;; +0BAF;TAMIL LETTER YA;Lo;0;L;;;;;N;;;;; +0BB0;TAMIL LETTER RA;Lo;0;L;;;;;N;;;;; +0BB1;TAMIL LETTER RRA;Lo;0;L;;;;;N;;;;; +0BB2;TAMIL LETTER LA;Lo;0;L;;;;;N;;;;; +0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;; +0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;; +0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;; +0BB6;TAMIL LETTER SHA;Lo;0;L;;;;;N;;;;; +0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;; +0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;; +0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;; +0BBE;TAMIL VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0BBF;TAMIL VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0BC0;TAMIL VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0BC1;TAMIL VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0BC2;TAMIL VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0BC6;TAMIL VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0BC7;TAMIL VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +0BC8;TAMIL VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +0BCA;TAMIL VOWEL SIGN O;Mc;0;L;0BC6 0BBE;;;;N;;;;; +0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;; +0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;; +0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0BD0;TAMIL OM;Lo;0;L;;;;;N;;;;; +0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0BE6;TAMIL DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0BEA;TAMIL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0BEB;TAMIL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0BEC;TAMIL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0BED;TAMIL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0BEE;TAMIL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0BEF;TAMIL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0BF0;TAMIL NUMBER TEN;No;0;L;;;;10;N;;;;; +0BF1;TAMIL NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +0BF2;TAMIL NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +0BF3;TAMIL DAY SIGN;So;0;ON;;;;;N;;;;; +0BF4;TAMIL MONTH SIGN;So;0;ON;;;;;N;;;;; +0BF5;TAMIL YEAR SIGN;So;0;ON;;;;;N;;;;; +0BF6;TAMIL DEBIT SIGN;So;0;ON;;;;;N;;;;; +0BF7;TAMIL CREDIT SIGN;So;0;ON;;;;;N;;;;; +0BF8;TAMIL AS ABOVE SIGN;So;0;ON;;;;;N;;;;; +0BF9;TAMIL RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +0BFA;TAMIL NUMBER SIGN;So;0;ON;;;;;N;;;;; +0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; +0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;; +0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;; +0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;; +0C08;TELUGU LETTER II;Lo;0;L;;;;;N;;;;; +0C09;TELUGU LETTER U;Lo;0;L;;;;;N;;;;; +0C0A;TELUGU LETTER UU;Lo;0;L;;;;;N;;;;; +0C0B;TELUGU LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0C0C;TELUGU LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0C0E;TELUGU LETTER E;Lo;0;L;;;;;N;;;;; +0C0F;TELUGU LETTER EE;Lo;0;L;;;;;N;;;;; +0C10;TELUGU LETTER AI;Lo;0;L;;;;;N;;;;; +0C12;TELUGU LETTER O;Lo;0;L;;;;;N;;;;; +0C13;TELUGU LETTER OO;Lo;0;L;;;;;N;;;;; +0C14;TELUGU LETTER AU;Lo;0;L;;;;;N;;;;; +0C15;TELUGU LETTER KA;Lo;0;L;;;;;N;;;;; +0C16;TELUGU LETTER KHA;Lo;0;L;;;;;N;;;;; +0C17;TELUGU LETTER GA;Lo;0;L;;;;;N;;;;; +0C18;TELUGU LETTER GHA;Lo;0;L;;;;;N;;;;; +0C19;TELUGU LETTER NGA;Lo;0;L;;;;;N;;;;; +0C1A;TELUGU LETTER CA;Lo;0;L;;;;;N;;;;; +0C1B;TELUGU LETTER CHA;Lo;0;L;;;;;N;;;;; +0C1C;TELUGU LETTER JA;Lo;0;L;;;;;N;;;;; +0C1D;TELUGU LETTER JHA;Lo;0;L;;;;;N;;;;; +0C1E;TELUGU LETTER NYA;Lo;0;L;;;;;N;;;;; +0C1F;TELUGU LETTER TTA;Lo;0;L;;;;;N;;;;; +0C20;TELUGU LETTER TTHA;Lo;0;L;;;;;N;;;;; +0C21;TELUGU LETTER DDA;Lo;0;L;;;;;N;;;;; +0C22;TELUGU LETTER DDHA;Lo;0;L;;;;;N;;;;; +0C23;TELUGU LETTER NNA;Lo;0;L;;;;;N;;;;; +0C24;TELUGU LETTER TA;Lo;0;L;;;;;N;;;;; +0C25;TELUGU LETTER THA;Lo;0;L;;;;;N;;;;; +0C26;TELUGU LETTER DA;Lo;0;L;;;;;N;;;;; +0C27;TELUGU LETTER DHA;Lo;0;L;;;;;N;;;;; +0C28;TELUGU LETTER NA;Lo;0;L;;;;;N;;;;; +0C2A;TELUGU LETTER PA;Lo;0;L;;;;;N;;;;; +0C2B;TELUGU LETTER PHA;Lo;0;L;;;;;N;;;;; +0C2C;TELUGU LETTER BA;Lo;0;L;;;;;N;;;;; +0C2D;TELUGU LETTER BHA;Lo;0;L;;;;;N;;;;; +0C2E;TELUGU LETTER MA;Lo;0;L;;;;;N;;;;; +0C2F;TELUGU LETTER YA;Lo;0;L;;;;;N;;;;; +0C30;TELUGU LETTER RA;Lo;0;L;;;;;N;;;;; +0C31;TELUGU LETTER RRA;Lo;0;L;;;;;N;;;;; +0C32;TELUGU LETTER LA;Lo;0;L;;;;;N;;;;; +0C33;TELUGU LETTER LLA;Lo;0;L;;;;;N;;;;; +0C35;TELUGU LETTER VA;Lo;0;L;;;;;N;;;;; +0C36;TELUGU LETTER SHA;Lo;0;L;;;;;N;;;;; +0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;; +0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;; +0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;; +0C3D;TELUGU SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0C41;TELUGU VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0C42;TELUGU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0C43;TELUGU VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +0C44;TELUGU VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +0C46;TELUGU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0C47;TELUGU VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +0C48;TELUGU VOWEL SIGN AI;Mn;0;NSM;0C46 0C56;;;;N;;;;; +0C4A;TELUGU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +0C4B;TELUGU VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; +0C4C;TELUGU VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;; +0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;; +0C58;TELUGU LETTER TSA;Lo;0;L;;;;;N;;;;; +0C59;TELUGU LETTER DZA;Lo;0;L;;;;;N;;;;; +0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0C62;TELUGU VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0C63;TELUGU VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0C69;TELUGU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0C6A;TELUGU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0C6B;TELUGU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0C6C;TELUGU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0C78;TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR;No;0;ON;;;;0;N;;;;; +0C79;TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR;No;0;ON;;;;1;N;;;;; +0C7A;TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR;No;0;ON;;;;2;N;;;;; +0C7B;TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR;No;0;ON;;;;3;N;;;;; +0C7C;TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR;No;0;ON;;;;1;N;;;;; +0C7D;TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR;No;0;ON;;;;2;N;;;;; +0C7E;TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR;No;0;ON;;;;3;N;;;;; +0C7F;TELUGU SIGN TUUMU;So;0;L;;;;;N;;;;; +0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;; +0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;; +0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;; +0C88;KANNADA LETTER II;Lo;0;L;;;;;N;;;;; +0C89;KANNADA LETTER U;Lo;0;L;;;;;N;;;;; +0C8A;KANNADA LETTER UU;Lo;0;L;;;;;N;;;;; +0C8B;KANNADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0C8C;KANNADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0C8E;KANNADA LETTER E;Lo;0;L;;;;;N;;;;; +0C8F;KANNADA LETTER EE;Lo;0;L;;;;;N;;;;; +0C90;KANNADA LETTER AI;Lo;0;L;;;;;N;;;;; +0C92;KANNADA LETTER O;Lo;0;L;;;;;N;;;;; +0C93;KANNADA LETTER OO;Lo;0;L;;;;;N;;;;; +0C94;KANNADA LETTER AU;Lo;0;L;;;;;N;;;;; +0C95;KANNADA LETTER KA;Lo;0;L;;;;;N;;;;; +0C96;KANNADA LETTER KHA;Lo;0;L;;;;;N;;;;; +0C97;KANNADA LETTER GA;Lo;0;L;;;;;N;;;;; +0C98;KANNADA LETTER GHA;Lo;0;L;;;;;N;;;;; +0C99;KANNADA LETTER NGA;Lo;0;L;;;;;N;;;;; +0C9A;KANNADA LETTER CA;Lo;0;L;;;;;N;;;;; +0C9B;KANNADA LETTER CHA;Lo;0;L;;;;;N;;;;; +0C9C;KANNADA LETTER JA;Lo;0;L;;;;;N;;;;; +0C9D;KANNADA LETTER JHA;Lo;0;L;;;;;N;;;;; +0C9E;KANNADA LETTER NYA;Lo;0;L;;;;;N;;;;; +0C9F;KANNADA LETTER TTA;Lo;0;L;;;;;N;;;;; +0CA0;KANNADA LETTER TTHA;Lo;0;L;;;;;N;;;;; +0CA1;KANNADA LETTER DDA;Lo;0;L;;;;;N;;;;; +0CA2;KANNADA LETTER DDHA;Lo;0;L;;;;;N;;;;; +0CA3;KANNADA LETTER NNA;Lo;0;L;;;;;N;;;;; +0CA4;KANNADA LETTER TA;Lo;0;L;;;;;N;;;;; +0CA5;KANNADA LETTER THA;Lo;0;L;;;;;N;;;;; +0CA6;KANNADA LETTER DA;Lo;0;L;;;;;N;;;;; +0CA7;KANNADA LETTER DHA;Lo;0;L;;;;;N;;;;; +0CA8;KANNADA LETTER NA;Lo;0;L;;;;;N;;;;; +0CAA;KANNADA LETTER PA;Lo;0;L;;;;;N;;;;; +0CAB;KANNADA LETTER PHA;Lo;0;L;;;;;N;;;;; +0CAC;KANNADA LETTER BA;Lo;0;L;;;;;N;;;;; +0CAD;KANNADA LETTER BHA;Lo;0;L;;;;;N;;;;; +0CAE;KANNADA LETTER MA;Lo;0;L;;;;;N;;;;; +0CAF;KANNADA LETTER YA;Lo;0;L;;;;;N;;;;; +0CB0;KANNADA LETTER RA;Lo;0;L;;;;;N;;;;; +0CB1;KANNADA LETTER RRA;Lo;0;L;;;;;N;;;;; +0CB2;KANNADA LETTER LA;Lo;0;L;;;;;N;;;;; +0CB3;KANNADA LETTER LLA;Lo;0;L;;;;;N;;;;; +0CB5;KANNADA LETTER VA;Lo;0;L;;;;;N;;;;; +0CB6;KANNADA LETTER SHA;Lo;0;L;;;;;N;;;;; +0CB7;KANNADA LETTER SSA;Lo;0;L;;;;;N;;;;; +0CB8;KANNADA LETTER SA;Lo;0;L;;;;;N;;;;; +0CB9;KANNADA LETTER HA;Lo;0;L;;;;;N;;;;; +0CBC;KANNADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0CBD;KANNADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0CBF;KANNADA VOWEL SIGN I;Mn;0;L;;;;;N;;;;; +0CC0;KANNADA VOWEL SIGN II;Mc;0;L;0CBF 0CD5;;;;N;;;;; +0CC1;KANNADA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0CC2;KANNADA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0CC3;KANNADA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +0CC4;KANNADA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +0CC6;KANNADA VOWEL SIGN E;Mn;0;L;;;;;N;;;;; +0CC7;KANNADA VOWEL SIGN EE;Mc;0;L;0CC6 0CD5;;;;N;;;;; +0CC8;KANNADA VOWEL SIGN AI;Mc;0;L;0CC6 0CD6;;;;N;;;;; +0CCA;KANNADA VOWEL SIGN O;Mc;0;L;0CC6 0CC2;;;;N;;;;; +0CCB;KANNADA VOWEL SIGN OO;Mc;0;L;0CCA 0CD5;;;;N;;;;; +0CCC;KANNADA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0CCD;KANNADA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0CD5;KANNADA LENGTH MARK;Mc;0;L;;;;;N;;;;; +0CD6;KANNADA AI LENGTH MARK;Mc;0;L;;;;;N;;;;; +0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;; +0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0CE2;KANNADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0CE3;KANNADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0CE9;KANNADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0CEA;KANNADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0CEB;KANNADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0CEC;KANNADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0CF1;KANNADA SIGN JIHVAMULIYA;So;0;ON;;;;;N;;;;; +0CF2;KANNADA SIGN UPADHMANIYA;So;0;ON;;;;;N;;;;; +0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;; +0D06;MALAYALAM LETTER AA;Lo;0;L;;;;;N;;;;; +0D07;MALAYALAM LETTER I;Lo;0;L;;;;;N;;;;; +0D08;MALAYALAM LETTER II;Lo;0;L;;;;;N;;;;; +0D09;MALAYALAM LETTER U;Lo;0;L;;;;;N;;;;; +0D0A;MALAYALAM LETTER UU;Lo;0;L;;;;;N;;;;; +0D0B;MALAYALAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0D0C;MALAYALAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0D0E;MALAYALAM LETTER E;Lo;0;L;;;;;N;;;;; +0D0F;MALAYALAM LETTER EE;Lo;0;L;;;;;N;;;;; +0D10;MALAYALAM LETTER AI;Lo;0;L;;;;;N;;;;; +0D12;MALAYALAM LETTER O;Lo;0;L;;;;;N;;;;; +0D13;MALAYALAM LETTER OO;Lo;0;L;;;;;N;;;;; +0D14;MALAYALAM LETTER AU;Lo;0;L;;;;;N;;;;; +0D15;MALAYALAM LETTER KA;Lo;0;L;;;;;N;;;;; +0D16;MALAYALAM LETTER KHA;Lo;0;L;;;;;N;;;;; +0D17;MALAYALAM LETTER GA;Lo;0;L;;;;;N;;;;; +0D18;MALAYALAM LETTER GHA;Lo;0;L;;;;;N;;;;; +0D19;MALAYALAM LETTER NGA;Lo;0;L;;;;;N;;;;; +0D1A;MALAYALAM LETTER CA;Lo;0;L;;;;;N;;;;; +0D1B;MALAYALAM LETTER CHA;Lo;0;L;;;;;N;;;;; +0D1C;MALAYALAM LETTER JA;Lo;0;L;;;;;N;;;;; +0D1D;MALAYALAM LETTER JHA;Lo;0;L;;;;;N;;;;; +0D1E;MALAYALAM LETTER NYA;Lo;0;L;;;;;N;;;;; +0D1F;MALAYALAM LETTER TTA;Lo;0;L;;;;;N;;;;; +0D20;MALAYALAM LETTER TTHA;Lo;0;L;;;;;N;;;;; +0D21;MALAYALAM LETTER DDA;Lo;0;L;;;;;N;;;;; +0D22;MALAYALAM LETTER DDHA;Lo;0;L;;;;;N;;;;; +0D23;MALAYALAM LETTER NNA;Lo;0;L;;;;;N;;;;; +0D24;MALAYALAM LETTER TA;Lo;0;L;;;;;N;;;;; +0D25;MALAYALAM LETTER THA;Lo;0;L;;;;;N;;;;; +0D26;MALAYALAM LETTER DA;Lo;0;L;;;;;N;;;;; +0D27;MALAYALAM LETTER DHA;Lo;0;L;;;;;N;;;;; +0D28;MALAYALAM LETTER NA;Lo;0;L;;;;;N;;;;; +0D2A;MALAYALAM LETTER PA;Lo;0;L;;;;;N;;;;; +0D2B;MALAYALAM LETTER PHA;Lo;0;L;;;;;N;;;;; +0D2C;MALAYALAM LETTER BA;Lo;0;L;;;;;N;;;;; +0D2D;MALAYALAM LETTER BHA;Lo;0;L;;;;;N;;;;; +0D2E;MALAYALAM LETTER MA;Lo;0;L;;;;;N;;;;; +0D2F;MALAYALAM LETTER YA;Lo;0;L;;;;;N;;;;; +0D30;MALAYALAM LETTER RA;Lo;0;L;;;;;N;;;;; +0D31;MALAYALAM LETTER RRA;Lo;0;L;;;;;N;;;;; +0D32;MALAYALAM LETTER LA;Lo;0;L;;;;;N;;;;; +0D33;MALAYALAM LETTER LLA;Lo;0;L;;;;;N;;;;; +0D34;MALAYALAM LETTER LLLA;Lo;0;L;;;;;N;;;;; +0D35;MALAYALAM LETTER VA;Lo;0;L;;;;;N;;;;; +0D36;MALAYALAM LETTER SHA;Lo;0;L;;;;;N;;;;; +0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;; +0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;; +0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;; +0D3D;MALAYALAM SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0D44;MALAYALAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +0D4A;MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;; +0D4B;MALAYALAM VOWEL SIGN OO;Mc;0;L;0D47 0D3E;;;;N;;;;; +0D4C;MALAYALAM VOWEL SIGN AU;Mc;0;L;0D46 0D57;;;;N;;;;; +0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0D62;MALAYALAM VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0D63;MALAYALAM VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0D69;MALAYALAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0D6A;MALAYALAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0D6B;MALAYALAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0D6C;MALAYALAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0D70;MALAYALAM NUMBER TEN;No;0;L;;;;10;N;;;;; +0D71;MALAYALAM NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +0D72;MALAYALAM NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +0D73;MALAYALAM FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +0D74;MALAYALAM FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; +0D75;MALAYALAM FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +0D79;MALAYALAM DATE MARK;So;0;L;;;;;N;;;;; +0D7A;MALAYALAM LETTER CHILLU NN;Lo;0;L;;;;;N;;;;; +0D7B;MALAYALAM LETTER CHILLU N;Lo;0;L;;;;;N;;;;; +0D7C;MALAYALAM LETTER CHILLU RR;Lo;0;L;;;;;N;;;;; +0D7D;MALAYALAM LETTER CHILLU L;Lo;0;L;;;;;N;;;;; +0D7E;MALAYALAM LETTER CHILLU LL;Lo;0;L;;;;;N;;;;; +0D7F;MALAYALAM LETTER CHILLU K;Lo;0;L;;;;;N;;;;; +0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;; +0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;; +0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;; +0D86;SINHALA LETTER AAYANNA;Lo;0;L;;;;;N;;;;; +0D87;SINHALA LETTER AEYANNA;Lo;0;L;;;;;N;;;;; +0D88;SINHALA LETTER AEEYANNA;Lo;0;L;;;;;N;;;;; +0D89;SINHALA LETTER IYANNA;Lo;0;L;;;;;N;;;;; +0D8A;SINHALA LETTER IIYANNA;Lo;0;L;;;;;N;;;;; +0D8B;SINHALA LETTER UYANNA;Lo;0;L;;;;;N;;;;; +0D8C;SINHALA LETTER UUYANNA;Lo;0;L;;;;;N;;;;; +0D8D;SINHALA LETTER IRUYANNA;Lo;0;L;;;;;N;;;;; +0D8E;SINHALA LETTER IRUUYANNA;Lo;0;L;;;;;N;;;;; +0D8F;SINHALA LETTER ILUYANNA;Lo;0;L;;;;;N;;;;; +0D90;SINHALA LETTER ILUUYANNA;Lo;0;L;;;;;N;;;;; +0D91;SINHALA LETTER EYANNA;Lo;0;L;;;;;N;;;;; +0D92;SINHALA LETTER EEYANNA;Lo;0;L;;;;;N;;;;; +0D93;SINHALA LETTER AIYANNA;Lo;0;L;;;;;N;;;;; +0D94;SINHALA LETTER OYANNA;Lo;0;L;;;;;N;;;;; +0D95;SINHALA LETTER OOYANNA;Lo;0;L;;;;;N;;;;; +0D96;SINHALA LETTER AUYANNA;Lo;0;L;;;;;N;;;;; +0D9A;SINHALA LETTER ALPAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; +0D9B;SINHALA LETTER MAHAAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; +0D9C;SINHALA LETTER ALPAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; +0D9D;SINHALA LETTER MAHAAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; +0D9E;SINHALA LETTER KANTAJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; +0D9F;SINHALA LETTER SANYAKA GAYANNA;Lo;0;L;;;;;N;;;;; +0DA0;SINHALA LETTER ALPAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; +0DA1;SINHALA LETTER MAHAAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; +0DA2;SINHALA LETTER ALPAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA3;SINHALA LETTER MAHAAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA4;SINHALA LETTER TAALUJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; +0DA5;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA;Lo;0;L;;;;;N;;;;; +0DA6;SINHALA LETTER SANYAKA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA7;SINHALA LETTER ALPAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; +0DA8;SINHALA LETTER MAHAAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; +0DA9;SINHALA LETTER ALPAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAA;SINHALA LETTER MAHAAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAB;SINHALA LETTER MUURDHAJA NAYANNA;Lo;0;L;;;;;N;;;;; +0DAC;SINHALA LETTER SANYAKA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAD;SINHALA LETTER ALPAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; +0DAE;SINHALA LETTER MAHAAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; +0DAF;SINHALA LETTER ALPAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB0;SINHALA LETTER MAHAAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB1;SINHALA LETTER DANTAJA NAYANNA;Lo;0;L;;;;;N;;;;; +0DB3;SINHALA LETTER SANYAKA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB4;SINHALA LETTER ALPAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; +0DB5;SINHALA LETTER MAHAAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; +0DB6;SINHALA LETTER ALPAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; +0DB7;SINHALA LETTER MAHAAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; +0DB8;SINHALA LETTER MAYANNA;Lo;0;L;;;;;N;;;;; +0DB9;SINHALA LETTER AMBA BAYANNA;Lo;0;L;;;;;N;;;;; +0DBA;SINHALA LETTER YAYANNA;Lo;0;L;;;;;N;;;;; +0DBB;SINHALA LETTER RAYANNA;Lo;0;L;;;;;N;;;;; +0DBD;SINHALA LETTER DANTAJA LAYANNA;Lo;0;L;;;;;N;;;;; +0DC0;SINHALA LETTER VAYANNA;Lo;0;L;;;;;N;;;;; +0DC1;SINHALA LETTER TAALUJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC2;SINHALA LETTER MUURDHAJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC3;SINHALA LETTER DANTAJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC4;SINHALA LETTER HAYANNA;Lo;0;L;;;;;N;;;;; +0DC5;SINHALA LETTER MUURDHAJA LAYANNA;Lo;0;L;;;;;N;;;;; +0DC6;SINHALA LETTER FAYANNA;Lo;0;L;;;;;N;;;;; +0DCA;SINHALA SIGN AL-LAKUNA;Mn;9;NSM;;;;;N;;;;; +0DCF;SINHALA VOWEL SIGN AELA-PILLA;Mc;0;L;;;;;N;;;;; +0DD0;SINHALA VOWEL SIGN KETTI AEDA-PILLA;Mc;0;L;;;;;N;;;;; +0DD1;SINHALA VOWEL SIGN DIGA AEDA-PILLA;Mc;0;L;;;;;N;;;;; +0DD2;SINHALA VOWEL SIGN KETTI IS-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD3;SINHALA VOWEL SIGN DIGA IS-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD4;SINHALA VOWEL SIGN KETTI PAA-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD6;SINHALA VOWEL SIGN DIGA PAA-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD8;SINHALA VOWEL SIGN GAETTA-PILLA;Mc;0;L;;;;;N;;;;; +0DD9;SINHALA VOWEL SIGN KOMBUVA;Mc;0;L;;;;;N;;;;; +0DDA;SINHALA VOWEL SIGN DIGA KOMBUVA;Mc;0;L;0DD9 0DCA;;;;N;;;;; +0DDB;SINHALA VOWEL SIGN KOMBU DEKA;Mc;0;L;;;;;N;;;;; +0DDC;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA;Mc;0;L;0DD9 0DCF;;;;N;;;;; +0DDD;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA;Mc;0;L;0DDC 0DCA;;;;N;;;;; +0DDE;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA;Mc;0;L;0DD9 0DDF;;;;N;;;;; +0DDF;SINHALA VOWEL SIGN GAYANUKITTA;Mc;0;L;;;;;N;;;;; +0DF2;SINHALA VOWEL SIGN DIGA GAETTA-PILLA;Mc;0;L;;;;;N;;;;; +0DF3;SINHALA VOWEL SIGN DIGA GAYANUKITTA;Mc;0;L;;;;;N;;;;; +0DF4;SINHALA PUNCTUATION KUNDDALIYA;Po;0;L;;;;;N;;;;; +0E01;THAI CHARACTER KO KAI;Lo;0;L;;;;;N;THAI LETTER KO KAI;;;; +0E02;THAI CHARACTER KHO KHAI;Lo;0;L;;;;;N;THAI LETTER KHO KHAI;;;; +0E03;THAI CHARACTER KHO KHUAT;Lo;0;L;;;;;N;THAI LETTER KHO KHUAT;;;; +0E04;THAI CHARACTER KHO KHWAI;Lo;0;L;;;;;N;THAI LETTER KHO KHWAI;;;; +0E05;THAI CHARACTER KHO KHON;Lo;0;L;;;;;N;THAI LETTER KHO KHON;;;; +0E06;THAI CHARACTER KHO RAKHANG;Lo;0;L;;;;;N;THAI LETTER KHO RAKHANG;;;; +0E07;THAI CHARACTER NGO NGU;Lo;0;L;;;;;N;THAI LETTER NGO NGU;;;; +0E08;THAI CHARACTER CHO CHAN;Lo;0;L;;;;;N;THAI LETTER CHO CHAN;;;; +0E09;THAI CHARACTER CHO CHING;Lo;0;L;;;;;N;THAI LETTER CHO CHING;;;; +0E0A;THAI CHARACTER CHO CHANG;Lo;0;L;;;;;N;THAI LETTER CHO CHANG;;;; +0E0B;THAI CHARACTER SO SO;Lo;0;L;;;;;N;THAI LETTER SO SO;;;; +0E0C;THAI CHARACTER CHO CHOE;Lo;0;L;;;;;N;THAI LETTER CHO CHOE;;;; +0E0D;THAI CHARACTER YO YING;Lo;0;L;;;;;N;THAI LETTER YO YING;;;; +0E0E;THAI CHARACTER DO CHADA;Lo;0;L;;;;;N;THAI LETTER DO CHADA;;;; +0E0F;THAI CHARACTER TO PATAK;Lo;0;L;;;;;N;THAI LETTER TO PATAK;;;; +0E10;THAI CHARACTER THO THAN;Lo;0;L;;;;;N;THAI LETTER THO THAN;;;; +0E11;THAI CHARACTER THO NANGMONTHO;Lo;0;L;;;;;N;THAI LETTER THO NANGMONTHO;;;; +0E12;THAI CHARACTER THO PHUTHAO;Lo;0;L;;;;;N;THAI LETTER THO PHUTHAO;;;; +0E13;THAI CHARACTER NO NEN;Lo;0;L;;;;;N;THAI LETTER NO NEN;;;; +0E14;THAI CHARACTER DO DEK;Lo;0;L;;;;;N;THAI LETTER DO DEK;;;; +0E15;THAI CHARACTER TO TAO;Lo;0;L;;;;;N;THAI LETTER TO TAO;;;; +0E16;THAI CHARACTER THO THUNG;Lo;0;L;;;;;N;THAI LETTER THO THUNG;;;; +0E17;THAI CHARACTER THO THAHAN;Lo;0;L;;;;;N;THAI LETTER THO THAHAN;;;; +0E18;THAI CHARACTER THO THONG;Lo;0;L;;;;;N;THAI LETTER THO THONG;;;; +0E19;THAI CHARACTER NO NU;Lo;0;L;;;;;N;THAI LETTER NO NU;;;; +0E1A;THAI CHARACTER BO BAIMAI;Lo;0;L;;;;;N;THAI LETTER BO BAIMAI;;;; +0E1B;THAI CHARACTER PO PLA;Lo;0;L;;;;;N;THAI LETTER PO PLA;;;; +0E1C;THAI CHARACTER PHO PHUNG;Lo;0;L;;;;;N;THAI LETTER PHO PHUNG;;;; +0E1D;THAI CHARACTER FO FA;Lo;0;L;;;;;N;THAI LETTER FO FA;;;; +0E1E;THAI CHARACTER PHO PHAN;Lo;0;L;;;;;N;THAI LETTER PHO PHAN;;;; +0E1F;THAI CHARACTER FO FAN;Lo;0;L;;;;;N;THAI LETTER FO FAN;;;; +0E20;THAI CHARACTER PHO SAMPHAO;Lo;0;L;;;;;N;THAI LETTER PHO SAMPHAO;;;; +0E21;THAI CHARACTER MO MA;Lo;0;L;;;;;N;THAI LETTER MO MA;;;; +0E22;THAI CHARACTER YO YAK;Lo;0;L;;;;;N;THAI LETTER YO YAK;;;; +0E23;THAI CHARACTER RO RUA;Lo;0;L;;;;;N;THAI LETTER RO RUA;;;; +0E24;THAI CHARACTER RU;Lo;0;L;;;;;N;THAI LETTER RU;;;; +0E25;THAI CHARACTER LO LING;Lo;0;L;;;;;N;THAI LETTER LO LING;;;; +0E26;THAI CHARACTER LU;Lo;0;L;;;;;N;THAI LETTER LU;;;; +0E27;THAI CHARACTER WO WAEN;Lo;0;L;;;;;N;THAI LETTER WO WAEN;;;; +0E28;THAI CHARACTER SO SALA;Lo;0;L;;;;;N;THAI LETTER SO SALA;;;; +0E29;THAI CHARACTER SO RUSI;Lo;0;L;;;;;N;THAI LETTER SO RUSI;;;; +0E2A;THAI CHARACTER SO SUA;Lo;0;L;;;;;N;THAI LETTER SO SUA;;;; +0E2B;THAI CHARACTER HO HIP;Lo;0;L;;;;;N;THAI LETTER HO HIP;;;; +0E2C;THAI CHARACTER LO CHULA;Lo;0;L;;;;;N;THAI LETTER LO CHULA;;;; +0E2D;THAI CHARACTER O ANG;Lo;0;L;;;;;N;THAI LETTER O ANG;;;; +0E2E;THAI CHARACTER HO NOKHUK;Lo;0;L;;;;;N;THAI LETTER HO NOK HUK;;;; +0E2F;THAI CHARACTER PAIYANNOI;Lo;0;L;;;;;N;THAI PAI YAN NOI;;;; +0E30;THAI CHARACTER SARA A;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA A;;;; +0E31;THAI CHARACTER MAI HAN-AKAT;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI HAN-AKAT;;;; +0E32;THAI CHARACTER SARA AA;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AA;;;; +0E33;THAI CHARACTER SARA AM;Lo;0;L;<compat> 0E4D 0E32;;;;N;THAI VOWEL SIGN SARA AM;;;; +0E34;THAI CHARACTER SARA I;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA I;;;; +0E35;THAI CHARACTER SARA II;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA II;;;; +0E36;THAI CHARACTER SARA UE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UE;;;; +0E37;THAI CHARACTER SARA UEE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UEE;;;; +0E38;THAI CHARACTER SARA U;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA U;;;; +0E39;THAI CHARACTER SARA UU;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA UU;;;; +0E3A;THAI CHARACTER PHINTHU;Mn;9;NSM;;;;;N;THAI VOWEL SIGN PHINTHU;;;; +0E3F;THAI CURRENCY SYMBOL BAHT;Sc;0;ET;;;;;N;THAI BAHT SIGN;;;; +0E40;THAI CHARACTER SARA E;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA E;;;; +0E41;THAI CHARACTER SARA AE;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AE;;;; +0E42;THAI CHARACTER SARA O;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA O;;;; +0E43;THAI CHARACTER SARA AI MAIMUAN;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MUAN;;;; +0E44;THAI CHARACTER SARA AI MAIMALAI;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MALAI;;;; +0E45;THAI CHARACTER LAKKHANGYAO;Lo;0;L;;;;;N;THAI LAK KHANG YAO;;;; +0E46;THAI CHARACTER MAIYAMOK;Lm;0;L;;;;;N;THAI MAI YAMOK;;;; +0E47;THAI CHARACTER MAITAIKHU;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI TAI KHU;;;; +0E48;THAI CHARACTER MAI EK;Mn;107;NSM;;;;;N;THAI TONE MAI EK;;;; +0E49;THAI CHARACTER MAI THO;Mn;107;NSM;;;;;N;THAI TONE MAI THO;;;; +0E4A;THAI CHARACTER MAI TRI;Mn;107;NSM;;;;;N;THAI TONE MAI TRI;;;; +0E4B;THAI CHARACTER MAI CHATTAWA;Mn;107;NSM;;;;;N;THAI TONE MAI CHATTAWA;;;; +0E4C;THAI CHARACTER THANTHAKHAT;Mn;0;NSM;;;;;N;THAI THANTHAKHAT;;;; +0E4D;THAI CHARACTER NIKHAHIT;Mn;0;NSM;;;;;N;THAI NIKKHAHIT;;;; +0E4E;THAI CHARACTER YAMAKKAN;Mn;0;NSM;;;;;N;THAI YAMAKKAN;;;; +0E4F;THAI CHARACTER FONGMAN;Po;0;L;;;;;N;THAI FONGMAN;;;; +0E50;THAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0E51;THAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0E52;THAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0E53;THAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0E54;THAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0E55;THAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0E56;THAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0E57;THAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0E58;THAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0E59;THAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0E5A;THAI CHARACTER ANGKHANKHU;Po;0;L;;;;;N;THAI ANGKHANKHU;;;; +0E5B;THAI CHARACTER KHOMUT;Po;0;L;;;;;N;THAI KHOMUT;;;; +0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;; +0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;; +0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;; +0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;; +0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;; +0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;; +0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;; +0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;; +0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;; +0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;; +0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;; +0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;; +0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;; +0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;; +0E9C;LAO LETTER PHO SUNG;Lo;0;L;;;;;N;;;;; +0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;; +0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;; +0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;; +0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;; +0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;; +0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;; +0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;; +0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;; +0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;; +0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;; +0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;; +0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;; +0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;; +0EB0;LAO VOWEL SIGN A;Lo;0;L;;;;;N;;;;; +0EB1;LAO VOWEL SIGN MAI KAN;Mn;0;NSM;;;;;N;;;;; +0EB2;LAO VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; +0EB3;LAO VOWEL SIGN AM;Lo;0;L;<compat> 0ECD 0EB2;;;;N;;;;; +0EB4;LAO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0EB5;LAO VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0EB6;LAO VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; +0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; +0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;; +0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;; +0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;; +0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;; +0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;; +0EC0;LAO VOWEL SIGN E;Lo;0;L;;;;;N;;;;; +0EC1;LAO VOWEL SIGN EI;Lo;0;L;;;;;N;;;;; +0EC2;LAO VOWEL SIGN O;Lo;0;L;;;;;N;;;;; +0EC3;LAO VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; +0EC4;LAO VOWEL SIGN AI;Lo;0;L;;;;;N;;;;; +0EC6;LAO KO LA;Lm;0;L;;;;;N;;;;; +0EC8;LAO TONE MAI EK;Mn;122;NSM;;;;;N;;;;; +0EC9;LAO TONE MAI THO;Mn;122;NSM;;;;;N;;;;; +0ECA;LAO TONE MAI TI;Mn;122;NSM;;;;;N;;;;; +0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;; +0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;; +0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;; +0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0ED3;LAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0ED4;LAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0ED5;LAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0ED6;LAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0ED7;LAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0ED8;LAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0ED9;LAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0EDC;LAO HO NO;Lo;0;L;<compat> 0EAB 0E99;;;;N;;;;; +0EDD;LAO HO MO;Lo;0;L;<compat> 0EAB 0EA1;;;;N;;;;; +0F00;TIBETAN SYLLABLE OM;Lo;0;L;;;;;N;;;;; +0F01;TIBETAN MARK GTER YIG MGO TRUNCATED A;So;0;L;;;;;N;;;;; +0F02;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA;So;0;L;;;;;N;;;;; +0F03;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA;So;0;L;;;;;N;;;;; +0F04;TIBETAN MARK INITIAL YIG MGO MDUN MA;Po;0;L;;;;;N;TIBETAN SINGLE ORNAMENT;;;; +0F05;TIBETAN MARK CLOSING YIG MGO SGAB MA;Po;0;L;;;;;N;;;;; +0F06;TIBETAN MARK CARET YIG MGO PHUR SHAD MA;Po;0;L;;;;;N;;;;; +0F07;TIBETAN MARK YIG MGO TSHEG SHAD MA;Po;0;L;;;;;N;;;;; +0F08;TIBETAN MARK SBRUL SHAD;Po;0;L;;;;;N;TIBETAN RGYANSHAD;;;; +0F09;TIBETAN MARK BSKUR YIG MGO;Po;0;L;;;;;N;;;;; +0F0A;TIBETAN MARK BKA- SHOG YIG MGO;Po;0;L;;;;;N;;;;; +0F0B;TIBETAN MARK INTERSYLLABIC TSHEG;Po;0;L;;;;;N;TIBETAN TSEG;;;; +0F0C;TIBETAN MARK DELIMITER TSHEG BSTAR;Po;0;L;<noBreak> 0F0B;;;;N;;;;; +0F0D;TIBETAN MARK SHAD;Po;0;L;;;;;N;TIBETAN SHAD;;;; +0F0E;TIBETAN MARK NYIS SHAD;Po;0;L;;;;;N;TIBETAN DOUBLE SHAD;;;; +0F0F;TIBETAN MARK TSHEG SHAD;Po;0;L;;;;;N;;;;; +0F10;TIBETAN MARK NYIS TSHEG SHAD;Po;0;L;;;;;N;;;;; +0F11;TIBETAN MARK RIN CHEN SPUNGS SHAD;Po;0;L;;;;;N;TIBETAN RINCHANPHUNGSHAD;;;; +0F12;TIBETAN MARK RGYA GRAM SHAD;Po;0;L;;;;;N;;;;; +0F13;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN;So;0;L;;;;;N;;;;; +0F14;TIBETAN MARK GTER TSHEG;So;0;L;;;;;N;TIBETAN COMMA;;;; +0F15;TIBETAN LOGOTYPE SIGN CHAD RTAGS;So;0;L;;;;;N;;;;; +0F16;TIBETAN LOGOTYPE SIGN LHAG RTAGS;So;0;L;;;;;N;;;;; +0F17;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS;So;0;L;;;;;N;;;;; +0F18;TIBETAN ASTROLOGICAL SIGN -KHYUD PA;Mn;220;NSM;;;;;N;;;;; +0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS;Mn;220;NSM;;;;;N;;;;; +0F1A;TIBETAN SIGN RDEL DKAR GCIG;So;0;L;;;;;N;;;;; +0F1B;TIBETAN SIGN RDEL DKAR GNYIS;So;0;L;;;;;N;;;;; +0F1C;TIBETAN SIGN RDEL DKAR GSUM;So;0;L;;;;;N;;;;; +0F1D;TIBETAN SIGN RDEL NAG GCIG;So;0;L;;;;;N;;;;; +0F1E;TIBETAN SIGN RDEL NAG GNYIS;So;0;L;;;;;N;;;;; +0F1F;TIBETAN SIGN RDEL DKAR RDEL NAG;So;0;L;;;;;N;;;;; +0F20;TIBETAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0F21;TIBETAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0F22;TIBETAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0F23;TIBETAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0F24;TIBETAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0F25;TIBETAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0F26;TIBETAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;1/2;N;;;;; +0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;3/2;N;;;;; +0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;5/2;N;;;;; +0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;7/2;N;;;;; +0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;9/2;N;;;;; +0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;11/2;N;;;;; +0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;13/2;N;;;;; +0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;15/2;N;;;;; +0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;17/2;N;;;;; +0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;N;;;;; +0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;;;; +0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;;;; +0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;;;; +0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;;;; +0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;;;; +0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;;;; +0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;Y;;;;; +0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;Y;;;;; +0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;Y;TIBETAN LEFT BRACE;;;; +0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;Y;TIBETAN RIGHT BRACE;;;; +0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;;;; +0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;;;; +0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;; +0F41;TIBETAN LETTER KHA;Lo;0;L;;;;;N;;;;; +0F42;TIBETAN LETTER GA;Lo;0;L;;;;;N;;;;; +0F43;TIBETAN LETTER GHA;Lo;0;L;0F42 0FB7;;;;N;;;;; +0F44;TIBETAN LETTER NGA;Lo;0;L;;;;;N;;;;; +0F45;TIBETAN LETTER CA;Lo;0;L;;;;;N;;;;; +0F46;TIBETAN LETTER CHA;Lo;0;L;;;;;N;;;;; +0F47;TIBETAN LETTER JA;Lo;0;L;;;;;N;;;;; +0F49;TIBETAN LETTER NYA;Lo;0;L;;;;;N;;;;; +0F4A;TIBETAN LETTER TTA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED TA;;;; +0F4B;TIBETAN LETTER TTHA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED THA;;;; +0F4C;TIBETAN LETTER DDA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED DA;;;; +0F4D;TIBETAN LETTER DDHA;Lo;0;L;0F4C 0FB7;;;;N;;;;; +0F4E;TIBETAN LETTER NNA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED NA;;;; +0F4F;TIBETAN LETTER TA;Lo;0;L;;;;;N;;;;; +0F50;TIBETAN LETTER THA;Lo;0;L;;;;;N;;;;; +0F51;TIBETAN LETTER DA;Lo;0;L;;;;;N;;;;; +0F52;TIBETAN LETTER DHA;Lo;0;L;0F51 0FB7;;;;N;;;;; +0F53;TIBETAN LETTER NA;Lo;0;L;;;;;N;;;;; +0F54;TIBETAN LETTER PA;Lo;0;L;;;;;N;;;;; +0F55;TIBETAN LETTER PHA;Lo;0;L;;;;;N;;;;; +0F56;TIBETAN LETTER BA;Lo;0;L;;;;;N;;;;; +0F57;TIBETAN LETTER BHA;Lo;0;L;0F56 0FB7;;;;N;;;;; +0F58;TIBETAN LETTER MA;Lo;0;L;;;;;N;;;;; +0F59;TIBETAN LETTER TSA;Lo;0;L;;;;;N;;;;; +0F5A;TIBETAN LETTER TSHA;Lo;0;L;;;;;N;;;;; +0F5B;TIBETAN LETTER DZA;Lo;0;L;;;;;N;;;;; +0F5C;TIBETAN LETTER DZHA;Lo;0;L;0F5B 0FB7;;;;N;;;;; +0F5D;TIBETAN LETTER WA;Lo;0;L;;;;;N;;;;; +0F5E;TIBETAN LETTER ZHA;Lo;0;L;;;;;N;;;;; +0F5F;TIBETAN LETTER ZA;Lo;0;L;;;;;N;;;;; +0F60;TIBETAN LETTER -A;Lo;0;L;;;;;N;TIBETAN LETTER AA;;;; +0F61;TIBETAN LETTER YA;Lo;0;L;;;;;N;;;;; +0F62;TIBETAN LETTER RA;Lo;0;L;;;;;N;;;;; +0F63;TIBETAN LETTER LA;Lo;0;L;;;;;N;;;;; +0F64;TIBETAN LETTER SHA;Lo;0;L;;;;;N;;;;; +0F65;TIBETAN LETTER SSA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED SHA;;;; +0F66;TIBETAN LETTER SA;Lo;0;L;;;;;N;;;;; +0F67;TIBETAN LETTER HA;Lo;0;L;;;;;N;;;;; +0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;; +0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;; +0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;;;; +0F6B;TIBETAN LETTER KKA;Lo;0;L;;;;;N;;;;; +0F6C;TIBETAN LETTER RRA;Lo;0;L;;;;;N;;;;; +0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;; +0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;; +0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;; +0F74;TIBETAN VOWEL SIGN U;Mn;132;NSM;;;;;N;;;;; +0F75;TIBETAN VOWEL SIGN UU;Mn;0;NSM;0F71 0F74;;;;N;;;;; +0F76;TIBETAN VOWEL SIGN VOCALIC R;Mn;0;NSM;0FB2 0F80;;;;N;;;;; +0F77;TIBETAN VOWEL SIGN VOCALIC RR;Mn;0;NSM;<compat> 0FB2 0F81;;;;N;;;;; +0F78;TIBETAN VOWEL SIGN VOCALIC L;Mn;0;NSM;0FB3 0F80;;;;N;;;;; +0F79;TIBETAN VOWEL SIGN VOCALIC LL;Mn;0;NSM;<compat> 0FB3 0F81;;;;N;;;;; +0F7A;TIBETAN VOWEL SIGN E;Mn;130;NSM;;;;;N;;;;; +0F7B;TIBETAN VOWEL SIGN EE;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AI;;;; +0F7C;TIBETAN VOWEL SIGN O;Mn;130;NSM;;;;;N;;;;; +0F7D;TIBETAN VOWEL SIGN OO;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AU;;;; +0F7E;TIBETAN SIGN RJES SU NGA RO;Mn;0;NSM;;;;;N;TIBETAN ANUSVARA;;;; +0F7F;TIBETAN SIGN RNAM BCAD;Mc;0;L;;;;;N;TIBETAN VISARGA;;;; +0F80;TIBETAN VOWEL SIGN REVERSED I;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN SHORT I;;;; +0F81;TIBETAN VOWEL SIGN REVERSED II;Mn;0;NSM;0F71 0F80;;;;N;;;;; +0F82;TIBETAN SIGN NYI ZLA NAA DA;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU WITH ORNAMENT;;;; +0F83;TIBETAN SIGN SNA LDAN;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU;;;; +0F84;TIBETAN MARK HALANTA;Mn;9;NSM;;;;;N;TIBETAN VIRAMA;;;; +0F85;TIBETAN MARK PALUTA;Po;0;L;;;;;N;TIBETAN CHUCHENYIGE;;;; +0F86;TIBETAN SIGN LCI RTAGS;Mn;230;NSM;;;;;N;;;;; +0F87;TIBETAN SIGN YANG RTAGS;Mn;230;NSM;;;;;N;;;;; +0F88;TIBETAN SIGN LCE TSA CAN;Lo;0;L;;;;;N;;;;; +0F89;TIBETAN SIGN MCHU CAN;Lo;0;L;;;;;N;;;;; +0F8A;TIBETAN SIGN GRU CAN RGYINGS;Lo;0;L;;;;;N;;;;; +0F8B;TIBETAN SIGN GRU MED RGYINGS;Lo;0;L;;;;;N;;;;; +0F90;TIBETAN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;; +0F91;TIBETAN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;; +0F92;TIBETAN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;; +0F93;TIBETAN SUBJOINED LETTER GHA;Mn;0;NSM;0F92 0FB7;;;;N;;;;; +0F94;TIBETAN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;; +0F95;TIBETAN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;; +0F96;TIBETAN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;; +0F97;TIBETAN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;; +0F99;TIBETAN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;; +0F9A;TIBETAN SUBJOINED LETTER TTA;Mn;0;NSM;;;;;N;;;;; +0F9B;TIBETAN SUBJOINED LETTER TTHA;Mn;0;NSM;;;;;N;;;;; +0F9C;TIBETAN SUBJOINED LETTER DDA;Mn;0;NSM;;;;;N;;;;; +0F9D;TIBETAN SUBJOINED LETTER DDHA;Mn;0;NSM;0F9C 0FB7;;;;N;;;;; +0F9E;TIBETAN SUBJOINED LETTER NNA;Mn;0;NSM;;;;;N;;;;; +0F9F;TIBETAN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;; +0FA0;TIBETAN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;; +0FA1;TIBETAN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;; +0FA2;TIBETAN SUBJOINED LETTER DHA;Mn;0;NSM;0FA1 0FB7;;;;N;;;;; +0FA3;TIBETAN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;; +0FA4;TIBETAN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;; +0FA5;TIBETAN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;; +0FA6;TIBETAN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;; +0FA7;TIBETAN SUBJOINED LETTER BHA;Mn;0;NSM;0FA6 0FB7;;;;N;;;;; +0FA8;TIBETAN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;; +0FA9;TIBETAN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;; +0FAA;TIBETAN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;; +0FAB;TIBETAN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;; +0FAC;TIBETAN SUBJOINED LETTER DZHA;Mn;0;NSM;0FAB 0FB7;;;;N;;;;; +0FAD;TIBETAN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;;;; +0FAE;TIBETAN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;; +0FAF;TIBETAN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;; +0FB0;TIBETAN SUBJOINED LETTER -A;Mn;0;NSM;;;;;N;;;;; +0FB1;TIBETAN SUBJOINED LETTER YA;Mn;0;NSM;;;;;N;;;;; +0FB2;TIBETAN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;;;; +0FB3;TIBETAN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;; +0FB4;TIBETAN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;; +0FB5;TIBETAN SUBJOINED LETTER SSA;Mn;0;NSM;;;;;N;;;;; +0FB6;TIBETAN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;; +0FB7;TIBETAN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;; +0FB8;TIBETAN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;; +0FB9;TIBETAN SUBJOINED LETTER KSSA;Mn;0;NSM;0F90 0FB5;;;;N;;;;; +0FBA;TIBETAN SUBJOINED LETTER FIXED-FORM WA;Mn;0;NSM;;;;;N;;;;; +0FBB;TIBETAN SUBJOINED LETTER FIXED-FORM YA;Mn;0;NSM;;;;;N;;;;; +0FBC;TIBETAN SUBJOINED LETTER FIXED-FORM RA;Mn;0;NSM;;;;;N;;;;; +0FBE;TIBETAN KU RU KHA;So;0;L;;;;;N;;;;; +0FBF;TIBETAN KU RU KHA BZHI MIG CAN;So;0;L;;;;;N;;;;; +0FC0;TIBETAN CANTILLATION SIGN HEAVY BEAT;So;0;L;;;;;N;;;;; +0FC1;TIBETAN CANTILLATION SIGN LIGHT BEAT;So;0;L;;;;;N;;;;; +0FC2;TIBETAN CANTILLATION SIGN CANG TE-U;So;0;L;;;;;N;;;;; +0FC3;TIBETAN CANTILLATION SIGN SBUB -CHAL;So;0;L;;;;;N;;;;; +0FC4;TIBETAN SYMBOL DRIL BU;So;0;L;;;;;N;;;;; +0FC5;TIBETAN SYMBOL RDO RJE;So;0;L;;;;;N;;;;; +0FC6;TIBETAN SYMBOL PADMA GDAN;Mn;220;NSM;;;;;N;;;;; +0FC7;TIBETAN SYMBOL RDO RJE RGYA GRAM;So;0;L;;;;;N;;;;; +0FC8;TIBETAN SYMBOL PHUR PA;So;0;L;;;;;N;;;;; +0FC9;TIBETAN SYMBOL NOR BU;So;0;L;;;;;N;;;;; +0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;;;; +0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;;;; +0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;;;; +0FCE;TIBETAN SIGN RDEL NAG RDEL DKAR;So;0;L;;;;;N;;;;; +0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;;;; +0FD0;TIBETAN MARK BSKA- SHOG GI MGO RGYAN;Po;0;L;;;;;N;;;;; +0FD1;TIBETAN MARK MNYAM YIG GI MGO RGYAN;Po;0;L;;;;;N;;;;; +0FD2;TIBETAN MARK NYIS TSHEG;Po;0;L;;;;;N;;;;; +0FD3;TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA;Po;0;L;;;;;N;;;;; +0FD4;TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA;Po;0;L;;;;;N;;;;; +0FD5;RIGHT-FACING SVASTI SIGN;So;0;L;;;;;N;;;;; +0FD6;LEFT-FACING SVASTI SIGN;So;0;L;;;;;N;;;;; +0FD7;RIGHT-FACING SVASTI SIGN WITH DOTS;So;0;L;;;;;N;;;;; +0FD8;LEFT-FACING SVASTI SIGN WITH DOTS;So;0;L;;;;;N;;;;; +1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;; +1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;; +1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;; +1003;MYANMAR LETTER GHA;Lo;0;L;;;;;N;;;;; +1004;MYANMAR LETTER NGA;Lo;0;L;;;;;N;;;;; +1005;MYANMAR LETTER CA;Lo;0;L;;;;;N;;;;; +1006;MYANMAR LETTER CHA;Lo;0;L;;;;;N;;;;; +1007;MYANMAR LETTER JA;Lo;0;L;;;;;N;;;;; +1008;MYANMAR LETTER JHA;Lo;0;L;;;;;N;;;;; +1009;MYANMAR LETTER NYA;Lo;0;L;;;;;N;;;;; +100A;MYANMAR LETTER NNYA;Lo;0;L;;;;;N;;;;; +100B;MYANMAR LETTER TTA;Lo;0;L;;;;;N;;;;; +100C;MYANMAR LETTER TTHA;Lo;0;L;;;;;N;;;;; +100D;MYANMAR LETTER DDA;Lo;0;L;;;;;N;;;;; +100E;MYANMAR LETTER DDHA;Lo;0;L;;;;;N;;;;; +100F;MYANMAR LETTER NNA;Lo;0;L;;;;;N;;;;; +1010;MYANMAR LETTER TA;Lo;0;L;;;;;N;;;;; +1011;MYANMAR LETTER THA;Lo;0;L;;;;;N;;;;; +1012;MYANMAR LETTER DA;Lo;0;L;;;;;N;;;;; +1013;MYANMAR LETTER DHA;Lo;0;L;;;;;N;;;;; +1014;MYANMAR LETTER NA;Lo;0;L;;;;;N;;;;; +1015;MYANMAR LETTER PA;Lo;0;L;;;;;N;;;;; +1016;MYANMAR LETTER PHA;Lo;0;L;;;;;N;;;;; +1017;MYANMAR LETTER BA;Lo;0;L;;;;;N;;;;; +1018;MYANMAR LETTER BHA;Lo;0;L;;;;;N;;;;; +1019;MYANMAR LETTER MA;Lo;0;L;;;;;N;;;;; +101A;MYANMAR LETTER YA;Lo;0;L;;;;;N;;;;; +101B;MYANMAR LETTER RA;Lo;0;L;;;;;N;;;;; +101C;MYANMAR LETTER LA;Lo;0;L;;;;;N;;;;; +101D;MYANMAR LETTER WA;Lo;0;L;;;;;N;;;;; +101E;MYANMAR LETTER SA;Lo;0;L;;;;;N;;;;; +101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;; +1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;; +1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;; +1022;MYANMAR LETTER SHAN A;Lo;0;L;;;;;N;;;;; +1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;; +1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;; +1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;; +1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;; +1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;; +1028;MYANMAR LETTER MON E;Lo;0;L;;;;;N;;;;; +1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;; +102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;; +102B;MYANMAR VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;; +102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +102F;MYANMAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1033;MYANMAR VOWEL SIGN MON II;Mn;0;NSM;;;;;N;;;;; +1034;MYANMAR VOWEL SIGN MON O;Mn;0;NSM;;;;;N;;;;; +1035;MYANMAR VOWEL SIGN E ABOVE;Mn;0;NSM;;;;;N;;;;; +1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;; +1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;; +1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +103A;MYANMAR SIGN ASAT;Mn;9;NSM;;;;;N;;;;; +103B;MYANMAR CONSONANT SIGN MEDIAL YA;Mc;0;L;;;;;N;;;;; +103C;MYANMAR CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; +103D;MYANMAR CONSONANT SIGN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; +103E;MYANMAR CONSONANT SIGN MEDIAL HA;Mn;0;NSM;;;;;N;;;;; +103F;MYANMAR LETTER GREAT SA;Lo;0;L;;;;;N;;;;; +1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1043;MYANMAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1044;MYANMAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1045;MYANMAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1046;MYANMAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1047;MYANMAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1048;MYANMAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1049;MYANMAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +104A;MYANMAR SIGN LITTLE SECTION;Po;0;L;;;;;N;;;;; +104B;MYANMAR SIGN SECTION;Po;0;L;;;;;N;;;;; +104C;MYANMAR SYMBOL LOCATIVE;Po;0;L;;;;;N;;;;; +104D;MYANMAR SYMBOL COMPLETED;Po;0;L;;;;;N;;;;; +104E;MYANMAR SYMBOL AFOREMENTIONED;Po;0;L;;;;;N;;;;; +104F;MYANMAR SYMBOL GENITIVE;Po;0;L;;;;;N;;;;; +1050;MYANMAR LETTER SHA;Lo;0;L;;;;;N;;;;; +1051;MYANMAR LETTER SSA;Lo;0;L;;;;;N;;;;; +1052;MYANMAR LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1053;MYANMAR LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +1054;MYANMAR LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1055;MYANMAR LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1056;MYANMAR VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +105A;MYANMAR LETTER MON NGA;Lo;0;L;;;;;N;;;;; +105B;MYANMAR LETTER MON JHA;Lo;0;L;;;;;N;;;;; +105C;MYANMAR LETTER MON BBA;Lo;0;L;;;;;N;;;;; +105D;MYANMAR LETTER MON BBE;Lo;0;L;;;;;N;;;;; +105E;MYANMAR CONSONANT SIGN MON MEDIAL NA;Mn;0;NSM;;;;;N;;;;; +105F;MYANMAR CONSONANT SIGN MON MEDIAL MA;Mn;0;NSM;;;;;N;;;;; +1060;MYANMAR CONSONANT SIGN MON MEDIAL LA;Mn;0;NSM;;;;;N;;;;; +1061;MYANMAR LETTER SGAW KAREN SHA;Lo;0;L;;;;;N;;;;; +1062;MYANMAR VOWEL SIGN SGAW KAREN EU;Mc;0;L;;;;;N;;;;; +1063;MYANMAR TONE MARK SGAW KAREN HATHI;Mc;0;L;;;;;N;;;;; +1064;MYANMAR TONE MARK SGAW KAREN KE PHO;Mc;0;L;;;;;N;;;;; +1065;MYANMAR LETTER WESTERN PWO KAREN THA;Lo;0;L;;;;;N;;;;; +1066;MYANMAR LETTER WESTERN PWO KAREN PWA;Lo;0;L;;;;;N;;;;; +1067;MYANMAR VOWEL SIGN WESTERN PWO KAREN EU;Mc;0;L;;;;;N;;;;; +1068;MYANMAR VOWEL SIGN WESTERN PWO KAREN UE;Mc;0;L;;;;;N;;;;; +1069;MYANMAR SIGN WESTERN PWO KAREN TONE-1;Mc;0;L;;;;;N;;;;; +106A;MYANMAR SIGN WESTERN PWO KAREN TONE-2;Mc;0;L;;;;;N;;;;; +106B;MYANMAR SIGN WESTERN PWO KAREN TONE-3;Mc;0;L;;;;;N;;;;; +106C;MYANMAR SIGN WESTERN PWO KAREN TONE-4;Mc;0;L;;;;;N;;;;; +106D;MYANMAR SIGN WESTERN PWO KAREN TONE-5;Mc;0;L;;;;;N;;;;; +106E;MYANMAR LETTER EASTERN PWO KAREN NNA;Lo;0;L;;;;;N;;;;; +106F;MYANMAR LETTER EASTERN PWO KAREN YWA;Lo;0;L;;;;;N;;;;; +1070;MYANMAR LETTER EASTERN PWO KAREN GHWA;Lo;0;L;;;;;N;;;;; +1071;MYANMAR VOWEL SIGN GEBA KAREN I;Mn;0;NSM;;;;;N;;;;; +1072;MYANMAR VOWEL SIGN KAYAH OE;Mn;0;NSM;;;;;N;;;;; +1073;MYANMAR VOWEL SIGN KAYAH U;Mn;0;NSM;;;;;N;;;;; +1074;MYANMAR VOWEL SIGN KAYAH EE;Mn;0;NSM;;;;;N;;;;; +1075;MYANMAR LETTER SHAN KA;Lo;0;L;;;;;N;;;;; +1076;MYANMAR LETTER SHAN KHA;Lo;0;L;;;;;N;;;;; +1077;MYANMAR LETTER SHAN GA;Lo;0;L;;;;;N;;;;; +1078;MYANMAR LETTER SHAN CA;Lo;0;L;;;;;N;;;;; +1079;MYANMAR LETTER SHAN ZA;Lo;0;L;;;;;N;;;;; +107A;MYANMAR LETTER SHAN NYA;Lo;0;L;;;;;N;;;;; +107B;MYANMAR LETTER SHAN DA;Lo;0;L;;;;;N;;;;; +107C;MYANMAR LETTER SHAN NA;Lo;0;L;;;;;N;;;;; +107D;MYANMAR LETTER SHAN PHA;Lo;0;L;;;;;N;;;;; +107E;MYANMAR LETTER SHAN FA;Lo;0;L;;;;;N;;;;; +107F;MYANMAR LETTER SHAN BA;Lo;0;L;;;;;N;;;;; +1080;MYANMAR LETTER SHAN THA;Lo;0;L;;;;;N;;;;; +1081;MYANMAR LETTER SHAN HA;Lo;0;L;;;;;N;;;;; +1082;MYANMAR CONSONANT SIGN SHAN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; +1083;MYANMAR VOWEL SIGN SHAN AA;Mc;0;L;;;;;N;;;;; +1084;MYANMAR VOWEL SIGN SHAN E;Mc;0;L;;;;;N;;;;; +1085;MYANMAR VOWEL SIGN SHAN E ABOVE;Mn;0;NSM;;;;;N;;;;; +1086;MYANMAR VOWEL SIGN SHAN FINAL Y;Mn;0;NSM;;;;;N;;;;; +1087;MYANMAR SIGN SHAN TONE-2;Mc;0;L;;;;;N;;;;; +1088;MYANMAR SIGN SHAN TONE-3;Mc;0;L;;;;;N;;;;; +1089;MYANMAR SIGN SHAN TONE-5;Mc;0;L;;;;;N;;;;; +108A;MYANMAR SIGN SHAN TONE-6;Mc;0;L;;;;;N;;;;; +108B;MYANMAR SIGN SHAN COUNCIL TONE-2;Mc;0;L;;;;;N;;;;; +108C;MYANMAR SIGN SHAN COUNCIL TONE-3;Mc;0;L;;;;;N;;;;; +108D;MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE;Mn;220;NSM;;;;;N;;;;; +108E;MYANMAR LETTER RUMAI PALAUNG FA;Lo;0;L;;;;;N;;;;; +108F;MYANMAR SIGN RUMAI PALAUNG TONE-5;Mc;0;L;;;;;N;;;;; +1090;MYANMAR SHAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1091;MYANMAR SHAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1092;MYANMAR SHAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1093;MYANMAR SHAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1094;MYANMAR SHAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1095;MYANMAR SHAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1096;MYANMAR SHAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1097;MYANMAR SHAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1098;MYANMAR SHAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1099;MYANMAR SHAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +109A;MYANMAR SIGN KHAMTI TONE-1;Mc;0;L;;;;;N;;;;; +109B;MYANMAR SIGN KHAMTI TONE-3;Mc;0;L;;;;;N;;;;; +109C;MYANMAR VOWEL SIGN AITON A;Mc;0;L;;;;;N;;;;; +109D;MYANMAR VOWEL SIGN AITON AI;Mn;0;NSM;;;;;N;;;;; +109E;MYANMAR SYMBOL SHAN ONE;So;0;L;;;;;N;;;;; +109F;MYANMAR SYMBOL SHAN EXCLAMATION;So;0;L;;;;;N;;;;; +10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;;;2D00; +10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;;;2D01; +10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;;;2D02; +10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;;;2D03; +10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;2D04; +10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;;;2D05; +10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;;;2D06; +10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;;;2D07; +10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;;;2D08; +10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;;;2D09; +10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;;;2D0A; +10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;;;2D0B; +10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;;;2D0C; +10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;;;2D0D; +10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;;;2D0E; +10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;;;2D0F; +10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;;;2D10; +10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;2D11; +10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;;;2D12; +10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;;;2D13; +10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;;;2D14; +10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;;;2D15; +10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;;;2D16; +10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;;;2D17; +10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;;;2D18; +10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;;;2D19; +10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;;;2D1A; +10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;;;2D1B; +10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;;;2D1C; +10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;;;2D1D; +10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;;;2D1E; +10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;;;2D1F; +10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;;;2D20; +10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;;;2D21; +10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;;;2D22; +10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;2D23; +10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;2D24; +10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;;;2D25; +10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;; +10D1;GEORGIAN LETTER BAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;;; +10D2;GEORGIAN LETTER GAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;;; +10D3;GEORGIAN LETTER DON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;;; +10D4;GEORGIAN LETTER EN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;;; +10D5;GEORGIAN LETTER VIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;;; +10D6;GEORGIAN LETTER ZEN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;;; +10D7;GEORGIAN LETTER TAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;;; +10D8;GEORGIAN LETTER IN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;;; +10D9;GEORGIAN LETTER KAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;;; +10DA;GEORGIAN LETTER LAS;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;;; +10DB;GEORGIAN LETTER MAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;;; +10DC;GEORGIAN LETTER NAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;;; +10DD;GEORGIAN LETTER ON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;;; +10DE;GEORGIAN LETTER PAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;;; +10DF;GEORGIAN LETTER ZHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;;; +10E0;GEORGIAN LETTER RAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;;; +10E1;GEORGIAN LETTER SAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;;; +10E2;GEORGIAN LETTER TAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;;; +10E3;GEORGIAN LETTER UN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;;; +10E4;GEORGIAN LETTER PHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;;; +10E5;GEORGIAN LETTER KHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;;; +10E6;GEORGIAN LETTER GHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;;; +10E7;GEORGIAN LETTER QAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;;; +10E8;GEORGIAN LETTER SHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;;; +10E9;GEORGIAN LETTER CHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;;; +10EA;GEORGIAN LETTER CAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;;; +10EB;GEORGIAN LETTER JIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;;; +10EC;GEORGIAN LETTER CIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;;; +10ED;GEORGIAN LETTER CHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;;; +10EE;GEORGIAN LETTER XAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;;; +10EF;GEORGIAN LETTER JHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;;; +10F0;GEORGIAN LETTER HAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;;; +10F1;GEORGIAN LETTER HE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;;; +10F2;GEORGIAN LETTER HIE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;;; +10F3;GEORGIAN LETTER WE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;;; +10F4;GEORGIAN LETTER HAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;;; +10F5;GEORGIAN LETTER HOE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;;; +10F6;GEORGIAN LETTER FI;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;;; +10F7;GEORGIAN LETTER YN;Lo;0;L;;;;;N;;;;; +10F8;GEORGIAN LETTER ELIFI;Lo;0;L;;;;;N;;;;; +10F9;GEORGIAN LETTER TURNED GAN;Lo;0;L;;;;;N;;;;; +10FA;GEORGIAN LETTER AIN;Lo;0;L;;;;;N;;;;; +10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; +10FC;MODIFIER LETTER GEORGIAN NAR;Lm;0;L;<super> 10DC;;;;N;;;;; +1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;;;; +1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;;;; +1103;HANGUL CHOSEONG TIKEUT;Lo;0;L;;;;;N;;;;; +1104;HANGUL CHOSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;;;; +1105;HANGUL CHOSEONG RIEUL;Lo;0;L;;;;;N;;;;; +1106;HANGUL CHOSEONG MIEUM;Lo;0;L;;;;;N;;;;; +1107;HANGUL CHOSEONG PIEUP;Lo;0;L;;;;;N;;;;; +1108;HANGUL CHOSEONG SSANGPIEUP;Lo;0;L;;;;;N;;;;; +1109;HANGUL CHOSEONG SIOS;Lo;0;L;;;;;N;;;;; +110A;HANGUL CHOSEONG SSANGSIOS;Lo;0;L;;;;;N;;;;; +110B;HANGUL CHOSEONG IEUNG;Lo;0;L;;;;;N;;;;; +110C;HANGUL CHOSEONG CIEUC;Lo;0;L;;;;;N;;;;; +110D;HANGUL CHOSEONG SSANGCIEUC;Lo;0;L;;;;;N;;;;; +110E;HANGUL CHOSEONG CHIEUCH;Lo;0;L;;;;;N;;;;; +110F;HANGUL CHOSEONG KHIEUKH;Lo;0;L;;;;;N;;;;; +1110;HANGUL CHOSEONG THIEUTH;Lo;0;L;;;;;N;;;;; +1111;HANGUL CHOSEONG PHIEUPH;Lo;0;L;;;;;N;;;;; +1112;HANGUL CHOSEONG HIEUH;Lo;0;L;;;;;N;;;;; +1113;HANGUL CHOSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; +1114;HANGUL CHOSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; +1115;HANGUL CHOSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; +1116;HANGUL CHOSEONG NIEUN-PIEUP;Lo;0;L;;;;;N;;;;; +1117;HANGUL CHOSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; +1118;HANGUL CHOSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; +1119;HANGUL CHOSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; +111A;HANGUL CHOSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; +111B;HANGUL CHOSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; +111C;HANGUL CHOSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; +111D;HANGUL CHOSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; +111E;HANGUL CHOSEONG PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; +111F;HANGUL CHOSEONG PIEUP-NIEUN;Lo;0;L;;;;;N;;;;; +1120;HANGUL CHOSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +1121;HANGUL CHOSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +1122;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +1123;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +1124;HANGUL CHOSEONG PIEUP-SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +1125;HANGUL CHOSEONG PIEUP-SSANGSIOS;Lo;0;L;;;;;N;;;;; +1126;HANGUL CHOSEONG PIEUP-SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +1127;HANGUL CHOSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; +1128;HANGUL CHOSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; +1129;HANGUL CHOSEONG PIEUP-THIEUTH;Lo;0;L;;;;;N;;;;; +112A;HANGUL CHOSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +112B;HANGUL CHOSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +112C;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP;Lo;0;L;;;;;N;;;;; +112D;HANGUL CHOSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +112E;HANGUL CHOSEONG SIOS-NIEUN;Lo;0;L;;;;;N;;;;; +112F;HANGUL CHOSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +1130;HANGUL CHOSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; +1131;HANGUL CHOSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; +1132;HANGUL CHOSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +1133;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; +1134;HANGUL CHOSEONG SIOS-SSANGSIOS;Lo;0;L;;;;;N;;;;; +1135;HANGUL CHOSEONG SIOS-IEUNG;Lo;0;L;;;;;N;;;;; +1136;HANGUL CHOSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +1137;HANGUL CHOSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; +1138;HANGUL CHOSEONG SIOS-KHIEUKH;Lo;0;L;;;;;N;;;;; +1139;HANGUL CHOSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +113A;HANGUL CHOSEONG SIOS-PHIEUPH;Lo;0;L;;;;;N;;;;; +113B;HANGUL CHOSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; +113C;HANGUL CHOSEONG CHITUEUMSIOS;Lo;0;L;;;;;N;;;;; +113D;HANGUL CHOSEONG CHITUEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; +113E;HANGUL CHOSEONG CEONGCHIEUMSIOS;Lo;0;L;;;;;N;;;;; +113F;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; +1140;HANGUL CHOSEONG PANSIOS;Lo;0;L;;;;;N;;;;; +1141;HANGUL CHOSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; +1142;HANGUL CHOSEONG IEUNG-TIKEUT;Lo;0;L;;;;;N;;;;; +1143;HANGUL CHOSEONG IEUNG-MIEUM;Lo;0;L;;;;;N;;;;; +1144;HANGUL CHOSEONG IEUNG-PIEUP;Lo;0;L;;;;;N;;;;; +1145;HANGUL CHOSEONG IEUNG-SIOS;Lo;0;L;;;;;N;;;;; +1146;HANGUL CHOSEONG IEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; +1147;HANGUL CHOSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; +1148;HANGUL CHOSEONG IEUNG-CIEUC;Lo;0;L;;;;;N;;;;; +1149;HANGUL CHOSEONG IEUNG-CHIEUCH;Lo;0;L;;;;;N;;;;; +114A;HANGUL CHOSEONG IEUNG-THIEUTH;Lo;0;L;;;;;N;;;;; +114B;HANGUL CHOSEONG IEUNG-PHIEUPH;Lo;0;L;;;;;N;;;;; +114C;HANGUL CHOSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; +114D;HANGUL CHOSEONG CIEUC-IEUNG;Lo;0;L;;;;;N;;;;; +114E;HANGUL CHOSEONG CHITUEUMCIEUC;Lo;0;L;;;;;N;;;;; +114F;HANGUL CHOSEONG CHITUEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; +1150;HANGUL CHOSEONG CEONGCHIEUMCIEUC;Lo;0;L;;;;;N;;;;; +1151;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; +1152;HANGUL CHOSEONG CHIEUCH-KHIEUKH;Lo;0;L;;;;;N;;;;; +1153;HANGUL CHOSEONG CHIEUCH-HIEUH;Lo;0;L;;;;;N;;;;; +1154;HANGUL CHOSEONG CHITUEUMCHIEUCH;Lo;0;L;;;;;N;;;;; +1155;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH;Lo;0;L;;;;;N;;;;; +1156;HANGUL CHOSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; +1157;HANGUL CHOSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; +1158;HANGUL CHOSEONG SSANGHIEUH;Lo;0;L;;;;;N;;;;; +1159;HANGUL CHOSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; +115A;HANGUL CHOSEONG KIYEOK-TIKEUT;Lo;0;L;;;;;N;;;;; +115B;HANGUL CHOSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; +115C;HANGUL CHOSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;;;; +115D;HANGUL CHOSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;;;; +115E;HANGUL CHOSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; +115F;HANGUL CHOSEONG FILLER;Lo;0;L;;;;;N;;;;; +1160;HANGUL JUNGSEONG FILLER;Lo;0;L;;;;;N;;;;; +1161;HANGUL JUNGSEONG A;Lo;0;L;;;;;N;;;;; +1162;HANGUL JUNGSEONG AE;Lo;0;L;;;;;N;;;;; +1163;HANGUL JUNGSEONG YA;Lo;0;L;;;;;N;;;;; +1164;HANGUL JUNGSEONG YAE;Lo;0;L;;;;;N;;;;; +1165;HANGUL JUNGSEONG EO;Lo;0;L;;;;;N;;;;; +1166;HANGUL JUNGSEONG E;Lo;0;L;;;;;N;;;;; +1167;HANGUL JUNGSEONG YEO;Lo;0;L;;;;;N;;;;; +1168;HANGUL JUNGSEONG YE;Lo;0;L;;;;;N;;;;; +1169;HANGUL JUNGSEONG O;Lo;0;L;;;;;N;;;;; +116A;HANGUL JUNGSEONG WA;Lo;0;L;;;;;N;;;;; +116B;HANGUL JUNGSEONG WAE;Lo;0;L;;;;;N;;;;; +116C;HANGUL JUNGSEONG OE;Lo;0;L;;;;;N;;;;; +116D;HANGUL JUNGSEONG YO;Lo;0;L;;;;;N;;;;; +116E;HANGUL JUNGSEONG U;Lo;0;L;;;;;N;;;;; +116F;HANGUL JUNGSEONG WEO;Lo;0;L;;;;;N;;;;; +1170;HANGUL JUNGSEONG WE;Lo;0;L;;;;;N;;;;; +1171;HANGUL JUNGSEONG WI;Lo;0;L;;;;;N;;;;; +1172;HANGUL JUNGSEONG YU;Lo;0;L;;;;;N;;;;; +1173;HANGUL JUNGSEONG EU;Lo;0;L;;;;;N;;;;; +1174;HANGUL JUNGSEONG YI;Lo;0;L;;;;;N;;;;; +1175;HANGUL JUNGSEONG I;Lo;0;L;;;;;N;;;;; +1176;HANGUL JUNGSEONG A-O;Lo;0;L;;;;;N;;;;; +1177;HANGUL JUNGSEONG A-U;Lo;0;L;;;;;N;;;;; +1178;HANGUL JUNGSEONG YA-O;Lo;0;L;;;;;N;;;;; +1179;HANGUL JUNGSEONG YA-YO;Lo;0;L;;;;;N;;;;; +117A;HANGUL JUNGSEONG EO-O;Lo;0;L;;;;;N;;;;; +117B;HANGUL JUNGSEONG EO-U;Lo;0;L;;;;;N;;;;; +117C;HANGUL JUNGSEONG EO-EU;Lo;0;L;;;;;N;;;;; +117D;HANGUL JUNGSEONG YEO-O;Lo;0;L;;;;;N;;;;; +117E;HANGUL JUNGSEONG YEO-U;Lo;0;L;;;;;N;;;;; +117F;HANGUL JUNGSEONG O-EO;Lo;0;L;;;;;N;;;;; +1180;HANGUL JUNGSEONG O-E;Lo;0;L;;;;;N;;;;; +1181;HANGUL JUNGSEONG O-YE;Lo;0;L;;;;;N;;;;; +1182;HANGUL JUNGSEONG O-O;Lo;0;L;;;;;N;;;;; +1183;HANGUL JUNGSEONG O-U;Lo;0;L;;;;;N;;;;; +1184;HANGUL JUNGSEONG YO-YA;Lo;0;L;;;;;N;;;;; +1185;HANGUL JUNGSEONG YO-YAE;Lo;0;L;;;;;N;;;;; +1186;HANGUL JUNGSEONG YO-YEO;Lo;0;L;;;;;N;;;;; +1187;HANGUL JUNGSEONG YO-O;Lo;0;L;;;;;N;;;;; +1188;HANGUL JUNGSEONG YO-I;Lo;0;L;;;;;N;;;;; +1189;HANGUL JUNGSEONG U-A;Lo;0;L;;;;;N;;;;; +118A;HANGUL JUNGSEONG U-AE;Lo;0;L;;;;;N;;;;; +118B;HANGUL JUNGSEONG U-EO-EU;Lo;0;L;;;;;N;;;;; +118C;HANGUL JUNGSEONG U-YE;Lo;0;L;;;;;N;;;;; +118D;HANGUL JUNGSEONG U-U;Lo;0;L;;;;;N;;;;; +118E;HANGUL JUNGSEONG YU-A;Lo;0;L;;;;;N;;;;; +118F;HANGUL JUNGSEONG YU-EO;Lo;0;L;;;;;N;;;;; +1190;HANGUL JUNGSEONG YU-E;Lo;0;L;;;;;N;;;;; +1191;HANGUL JUNGSEONG YU-YEO;Lo;0;L;;;;;N;;;;; +1192;HANGUL JUNGSEONG YU-YE;Lo;0;L;;;;;N;;;;; +1193;HANGUL JUNGSEONG YU-U;Lo;0;L;;;;;N;;;;; +1194;HANGUL JUNGSEONG YU-I;Lo;0;L;;;;;N;;;;; +1195;HANGUL JUNGSEONG EU-U;Lo;0;L;;;;;N;;;;; +1196;HANGUL JUNGSEONG EU-EU;Lo;0;L;;;;;N;;;;; +1197;HANGUL JUNGSEONG YI-U;Lo;0;L;;;;;N;;;;; +1198;HANGUL JUNGSEONG I-A;Lo;0;L;;;;;N;;;;; +1199;HANGUL JUNGSEONG I-YA;Lo;0;L;;;;;N;;;;; +119A;HANGUL JUNGSEONG I-O;Lo;0;L;;;;;N;;;;; +119B;HANGUL JUNGSEONG I-U;Lo;0;L;;;;;N;;;;; +119C;HANGUL JUNGSEONG I-EU;Lo;0;L;;;;;N;;;;; +119D;HANGUL JUNGSEONG I-ARAEA;Lo;0;L;;;;;N;;;;; +119E;HANGUL JUNGSEONG ARAEA;Lo;0;L;;;;;N;;;;; +119F;HANGUL JUNGSEONG ARAEA-EO;Lo;0;L;;;;;N;;;;; +11A0;HANGUL JUNGSEONG ARAEA-U;Lo;0;L;;;;;N;;;;; +11A1;HANGUL JUNGSEONG ARAEA-I;Lo;0;L;;;;;N;;;;; +11A2;HANGUL JUNGSEONG SSANGARAEA;Lo;0;L;;;;;N;;;;; +11A3;HANGUL JUNGSEONG A-EU;Lo;0;L;;;;;N;;;;; +11A4;HANGUL JUNGSEONG YA-U;Lo;0;L;;;;;N;;;;; +11A5;HANGUL JUNGSEONG YEO-YA;Lo;0;L;;;;;N;;;;; +11A6;HANGUL JUNGSEONG O-YA;Lo;0;L;;;;;N;;;;; +11A7;HANGUL JUNGSEONG O-YAE;Lo;0;L;;;;;N;;;;; +11A8;HANGUL JONGSEONG KIYEOK;Lo;0;L;;;;;N;;;;; +11A9;HANGUL JONGSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +11AA;HANGUL JONGSEONG KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; +11AB;HANGUL JONGSEONG NIEUN;Lo;0;L;;;;;N;;;;; +11AC;HANGUL JONGSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;;;; +11AD;HANGUL JONGSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;;;; +11AE;HANGUL JONGSEONG TIKEUT;Lo;0;L;;;;;N;;;;; +11AF;HANGUL JONGSEONG RIEUL;Lo;0;L;;;;;N;;;;; +11B0;HANGUL JONGSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;;;; +11B1;HANGUL JONGSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;;;; +11B2;HANGUL JONGSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;;;; +11B3;HANGUL JONGSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;;;; +11B4;HANGUL JONGSEONG RIEUL-THIEUTH;Lo;0;L;;;;;N;;;;; +11B5;HANGUL JONGSEONG RIEUL-PHIEUPH;Lo;0;L;;;;;N;;;;; +11B6;HANGUL JONGSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; +11B7;HANGUL JONGSEONG MIEUM;Lo;0;L;;;;;N;;;;; +11B8;HANGUL JONGSEONG PIEUP;Lo;0;L;;;;;N;;;;; +11B9;HANGUL JONGSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +11BA;HANGUL JONGSEONG SIOS;Lo;0;L;;;;;N;;;;; +11BB;HANGUL JONGSEONG SSANGSIOS;Lo;0;L;;;;;N;;;;; +11BC;HANGUL JONGSEONG IEUNG;Lo;0;L;;;;;N;;;;; +11BD;HANGUL JONGSEONG CIEUC;Lo;0;L;;;;;N;;;;; +11BE;HANGUL JONGSEONG CHIEUCH;Lo;0;L;;;;;N;;;;; +11BF;HANGUL JONGSEONG KHIEUKH;Lo;0;L;;;;;N;;;;; +11C0;HANGUL JONGSEONG THIEUTH;Lo;0;L;;;;;N;;;;; +11C1;HANGUL JONGSEONG PHIEUPH;Lo;0;L;;;;;N;;;;; +11C2;HANGUL JONGSEONG HIEUH;Lo;0;L;;;;;N;;;;; +11C3;HANGUL JONGSEONG KIYEOK-RIEUL;Lo;0;L;;;;;N;;;;; +11C4;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +11C5;HANGUL JONGSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; +11C6;HANGUL JONGSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; +11C7;HANGUL JONGSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; +11C8;HANGUL JONGSEONG NIEUN-PANSIOS;Lo;0;L;;;;;N;;;;; +11C9;HANGUL JONGSEONG NIEUN-THIEUTH;Lo;0;L;;;;;N;;;;; +11CA;HANGUL JONGSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; +11CB;HANGUL JONGSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; +11CC;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; +11CD;HANGUL JONGSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; +11CE;HANGUL JONGSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; +11CF;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH;Lo;0;L;;;;;N;;;;; +11D0;HANGUL JONGSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; +11D1;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +11D2;HANGUL JONGSEONG RIEUL-MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +11D3;HANGUL JONGSEONG RIEUL-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +11D4;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +11D5;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +11D6;HANGUL JONGSEONG RIEUL-SSANGSIOS;Lo;0;L;;;;;N;;;;; +11D7;HANGUL JONGSEONG RIEUL-PANSIOS;Lo;0;L;;;;;N;;;;; +11D8;HANGUL JONGSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +11D9;HANGUL JONGSEONG RIEUL-YEORINHIEUH;Lo;0;L;;;;;N;;;;; +11DA;HANGUL JONGSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +11DB;HANGUL JONGSEONG MIEUM-RIEUL;Lo;0;L;;;;;N;;;;; +11DC;HANGUL JONGSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; +11DD;HANGUL JONGSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +11DE;HANGUL JONGSEONG MIEUM-SSANGSIOS;Lo;0;L;;;;;N;;;;; +11DF;HANGUL JONGSEONG MIEUM-PANSIOS;Lo;0;L;;;;;N;;;;; +11E0;HANGUL JONGSEONG MIEUM-CHIEUCH;Lo;0;L;;;;;N;;;;; +11E1;HANGUL JONGSEONG MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; +11E2;HANGUL JONGSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; +11E3;HANGUL JONGSEONG PIEUP-RIEUL;Lo;0;L;;;;;N;;;;; +11E4;HANGUL JONGSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +11E5;HANGUL JONGSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +11E6;HANGUL JONGSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +11E7;HANGUL JONGSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +11E8;HANGUL JONGSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +11E9;HANGUL JONGSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; +11EA;HANGUL JONGSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +11EB;HANGUL JONGSEONG PANSIOS;Lo;0;L;;;;;N;;;;; +11EC;HANGUL JONGSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; +11ED;HANGUL JONGSEONG IEUNG-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +11EE;HANGUL JONGSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; +11EF;HANGUL JONGSEONG IEUNG-KHIEUKH;Lo;0;L;;;;;N;;;;; +11F0;HANGUL JONGSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; +11F1;HANGUL JONGSEONG YESIEUNG-SIOS;Lo;0;L;;;;;N;;;;; +11F2;HANGUL JONGSEONG YESIEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; +11F3;HANGUL JONGSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; +11F4;HANGUL JONGSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; +11F5;HANGUL JONGSEONG HIEUH-NIEUN;Lo;0;L;;;;;N;;;;; +11F6;HANGUL JONGSEONG HIEUH-RIEUL;Lo;0;L;;;;;N;;;;; +11F7;HANGUL JONGSEONG HIEUH-MIEUM;Lo;0;L;;;;;N;;;;; +11F8;HANGUL JONGSEONG HIEUH-PIEUP;Lo;0;L;;;;;N;;;;; +11F9;HANGUL JONGSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; +11FA;HANGUL JONGSEONG KIYEOK-NIEUN;Lo;0;L;;;;;N;;;;; +11FB;HANGUL JONGSEONG KIYEOK-PIEUP;Lo;0;L;;;;;N;;;;; +11FC;HANGUL JONGSEONG KIYEOK-CHIEUCH;Lo;0;L;;;;;N;;;;; +11FD;HANGUL JONGSEONG KIYEOK-KHIEUKH;Lo;0;L;;;;;N;;;;; +11FE;HANGUL JONGSEONG KIYEOK-HIEUH;Lo;0;L;;;;;N;;;;; +11FF;HANGUL JONGSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; +1200;ETHIOPIC SYLLABLE HA;Lo;0;L;;;;;N;;;;; +1201;ETHIOPIC SYLLABLE HU;Lo;0;L;;;;;N;;;;; +1202;ETHIOPIC SYLLABLE HI;Lo;0;L;;;;;N;;;;; +1203;ETHIOPIC SYLLABLE HAA;Lo;0;L;;;;;N;;;;; +1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;; +1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;; +1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;; +1207;ETHIOPIC SYLLABLE HOA;Lo;0;L;;;;;N;;;;; +1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;; +1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;; +120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;; +120B;ETHIOPIC SYLLABLE LAA;Lo;0;L;;;;;N;;;;; +120C;ETHIOPIC SYLLABLE LEE;Lo;0;L;;;;;N;;;;; +120D;ETHIOPIC SYLLABLE LE;Lo;0;L;;;;;N;;;;; +120E;ETHIOPIC SYLLABLE LO;Lo;0;L;;;;;N;;;;; +120F;ETHIOPIC SYLLABLE LWA;Lo;0;L;;;;;N;;;;; +1210;ETHIOPIC SYLLABLE HHA;Lo;0;L;;;;;N;;;;; +1211;ETHIOPIC SYLLABLE HHU;Lo;0;L;;;;;N;;;;; +1212;ETHIOPIC SYLLABLE HHI;Lo;0;L;;;;;N;;;;; +1213;ETHIOPIC SYLLABLE HHAA;Lo;0;L;;;;;N;;;;; +1214;ETHIOPIC SYLLABLE HHEE;Lo;0;L;;;;;N;;;;; +1215;ETHIOPIC SYLLABLE HHE;Lo;0;L;;;;;N;;;;; +1216;ETHIOPIC SYLLABLE HHO;Lo;0;L;;;;;N;;;;; +1217;ETHIOPIC SYLLABLE HHWA;Lo;0;L;;;;;N;;;;; +1218;ETHIOPIC SYLLABLE MA;Lo;0;L;;;;;N;;;;; +1219;ETHIOPIC SYLLABLE MU;Lo;0;L;;;;;N;;;;; +121A;ETHIOPIC SYLLABLE MI;Lo;0;L;;;;;N;;;;; +121B;ETHIOPIC SYLLABLE MAA;Lo;0;L;;;;;N;;;;; +121C;ETHIOPIC SYLLABLE MEE;Lo;0;L;;;;;N;;;;; +121D;ETHIOPIC SYLLABLE ME;Lo;0;L;;;;;N;;;;; +121E;ETHIOPIC SYLLABLE MO;Lo;0;L;;;;;N;;;;; +121F;ETHIOPIC SYLLABLE MWA;Lo;0;L;;;;;N;;;;; +1220;ETHIOPIC SYLLABLE SZA;Lo;0;L;;;;;N;;;;; +1221;ETHIOPIC SYLLABLE SZU;Lo;0;L;;;;;N;;;;; +1222;ETHIOPIC SYLLABLE SZI;Lo;0;L;;;;;N;;;;; +1223;ETHIOPIC SYLLABLE SZAA;Lo;0;L;;;;;N;;;;; +1224;ETHIOPIC SYLLABLE SZEE;Lo;0;L;;;;;N;;;;; +1225;ETHIOPIC SYLLABLE SZE;Lo;0;L;;;;;N;;;;; +1226;ETHIOPIC SYLLABLE SZO;Lo;0;L;;;;;N;;;;; +1227;ETHIOPIC SYLLABLE SZWA;Lo;0;L;;;;;N;;;;; +1228;ETHIOPIC SYLLABLE RA;Lo;0;L;;;;;N;;;;; +1229;ETHIOPIC SYLLABLE RU;Lo;0;L;;;;;N;;;;; +122A;ETHIOPIC SYLLABLE RI;Lo;0;L;;;;;N;;;;; +122B;ETHIOPIC SYLLABLE RAA;Lo;0;L;;;;;N;;;;; +122C;ETHIOPIC SYLLABLE REE;Lo;0;L;;;;;N;;;;; +122D;ETHIOPIC SYLLABLE RE;Lo;0;L;;;;;N;;;;; +122E;ETHIOPIC SYLLABLE RO;Lo;0;L;;;;;N;;;;; +122F;ETHIOPIC SYLLABLE RWA;Lo;0;L;;;;;N;;;;; +1230;ETHIOPIC SYLLABLE SA;Lo;0;L;;;;;N;;;;; +1231;ETHIOPIC SYLLABLE SU;Lo;0;L;;;;;N;;;;; +1232;ETHIOPIC SYLLABLE SI;Lo;0;L;;;;;N;;;;; +1233;ETHIOPIC SYLLABLE SAA;Lo;0;L;;;;;N;;;;; +1234;ETHIOPIC SYLLABLE SEE;Lo;0;L;;;;;N;;;;; +1235;ETHIOPIC SYLLABLE SE;Lo;0;L;;;;;N;;;;; +1236;ETHIOPIC SYLLABLE SO;Lo;0;L;;;;;N;;;;; +1237;ETHIOPIC SYLLABLE SWA;Lo;0;L;;;;;N;;;;; +1238;ETHIOPIC SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +1239;ETHIOPIC SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +123A;ETHIOPIC SYLLABLE SHI;Lo;0;L;;;;;N;;;;; +123B;ETHIOPIC SYLLABLE SHAA;Lo;0;L;;;;;N;;;;; +123C;ETHIOPIC SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; +123D;ETHIOPIC SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +123E;ETHIOPIC SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +123F;ETHIOPIC SYLLABLE SHWA;Lo;0;L;;;;;N;;;;; +1240;ETHIOPIC SYLLABLE QA;Lo;0;L;;;;;N;;;;; +1241;ETHIOPIC SYLLABLE QU;Lo;0;L;;;;;N;;;;; +1242;ETHIOPIC SYLLABLE QI;Lo;0;L;;;;;N;;;;; +1243;ETHIOPIC SYLLABLE QAA;Lo;0;L;;;;;N;;;;; +1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;; +1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;; +1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;; +1247;ETHIOPIC SYLLABLE QOA;Lo;0;L;;;;;N;;;;; +1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;; +124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;; +124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;; +124C;ETHIOPIC SYLLABLE QWEE;Lo;0;L;;;;;N;;;;; +124D;ETHIOPIC SYLLABLE QWE;Lo;0;L;;;;;N;;;;; +1250;ETHIOPIC SYLLABLE QHA;Lo;0;L;;;;;N;;;;; +1251;ETHIOPIC SYLLABLE QHU;Lo;0;L;;;;;N;;;;; +1252;ETHIOPIC SYLLABLE QHI;Lo;0;L;;;;;N;;;;; +1253;ETHIOPIC SYLLABLE QHAA;Lo;0;L;;;;;N;;;;; +1254;ETHIOPIC SYLLABLE QHEE;Lo;0;L;;;;;N;;;;; +1255;ETHIOPIC SYLLABLE QHE;Lo;0;L;;;;;N;;;;; +1256;ETHIOPIC SYLLABLE QHO;Lo;0;L;;;;;N;;;;; +1258;ETHIOPIC SYLLABLE QHWA;Lo;0;L;;;;;N;;;;; +125A;ETHIOPIC SYLLABLE QHWI;Lo;0;L;;;;;N;;;;; +125B;ETHIOPIC SYLLABLE QHWAA;Lo;0;L;;;;;N;;;;; +125C;ETHIOPIC SYLLABLE QHWEE;Lo;0;L;;;;;N;;;;; +125D;ETHIOPIC SYLLABLE QHWE;Lo;0;L;;;;;N;;;;; +1260;ETHIOPIC SYLLABLE BA;Lo;0;L;;;;;N;;;;; +1261;ETHIOPIC SYLLABLE BU;Lo;0;L;;;;;N;;;;; +1262;ETHIOPIC SYLLABLE BI;Lo;0;L;;;;;N;;;;; +1263;ETHIOPIC SYLLABLE BAA;Lo;0;L;;;;;N;;;;; +1264;ETHIOPIC SYLLABLE BEE;Lo;0;L;;;;;N;;;;; +1265;ETHIOPIC SYLLABLE BE;Lo;0;L;;;;;N;;;;; +1266;ETHIOPIC SYLLABLE BO;Lo;0;L;;;;;N;;;;; +1267;ETHIOPIC SYLLABLE BWA;Lo;0;L;;;;;N;;;;; +1268;ETHIOPIC SYLLABLE VA;Lo;0;L;;;;;N;;;;; +1269;ETHIOPIC SYLLABLE VU;Lo;0;L;;;;;N;;;;; +126A;ETHIOPIC SYLLABLE VI;Lo;0;L;;;;;N;;;;; +126B;ETHIOPIC SYLLABLE VAA;Lo;0;L;;;;;N;;;;; +126C;ETHIOPIC SYLLABLE VEE;Lo;0;L;;;;;N;;;;; +126D;ETHIOPIC SYLLABLE VE;Lo;0;L;;;;;N;;;;; +126E;ETHIOPIC SYLLABLE VO;Lo;0;L;;;;;N;;;;; +126F;ETHIOPIC SYLLABLE VWA;Lo;0;L;;;;;N;;;;; +1270;ETHIOPIC SYLLABLE TA;Lo;0;L;;;;;N;;;;; +1271;ETHIOPIC SYLLABLE TU;Lo;0;L;;;;;N;;;;; +1272;ETHIOPIC SYLLABLE TI;Lo;0;L;;;;;N;;;;; +1273;ETHIOPIC SYLLABLE TAA;Lo;0;L;;;;;N;;;;; +1274;ETHIOPIC SYLLABLE TEE;Lo;0;L;;;;;N;;;;; +1275;ETHIOPIC SYLLABLE TE;Lo;0;L;;;;;N;;;;; +1276;ETHIOPIC SYLLABLE TO;Lo;0;L;;;;;N;;;;; +1277;ETHIOPIC SYLLABLE TWA;Lo;0;L;;;;;N;;;;; +1278;ETHIOPIC SYLLABLE CA;Lo;0;L;;;;;N;;;;; +1279;ETHIOPIC SYLLABLE CU;Lo;0;L;;;;;N;;;;; +127A;ETHIOPIC SYLLABLE CI;Lo;0;L;;;;;N;;;;; +127B;ETHIOPIC SYLLABLE CAA;Lo;0;L;;;;;N;;;;; +127C;ETHIOPIC SYLLABLE CEE;Lo;0;L;;;;;N;;;;; +127D;ETHIOPIC SYLLABLE CE;Lo;0;L;;;;;N;;;;; +127E;ETHIOPIC SYLLABLE CO;Lo;0;L;;;;;N;;;;; +127F;ETHIOPIC SYLLABLE CWA;Lo;0;L;;;;;N;;;;; +1280;ETHIOPIC SYLLABLE XA;Lo;0;L;;;;;N;;;;; +1281;ETHIOPIC SYLLABLE XU;Lo;0;L;;;;;N;;;;; +1282;ETHIOPIC SYLLABLE XI;Lo;0;L;;;;;N;;;;; +1283;ETHIOPIC SYLLABLE XAA;Lo;0;L;;;;;N;;;;; +1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;; +1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;; +1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;; +1287;ETHIOPIC SYLLABLE XOA;Lo;0;L;;;;;N;;;;; +1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;; +128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;; +128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;; +128C;ETHIOPIC SYLLABLE XWEE;Lo;0;L;;;;;N;;;;; +128D;ETHIOPIC SYLLABLE XWE;Lo;0;L;;;;;N;;;;; +1290;ETHIOPIC SYLLABLE NA;Lo;0;L;;;;;N;;;;; +1291;ETHIOPIC SYLLABLE NU;Lo;0;L;;;;;N;;;;; +1292;ETHIOPIC SYLLABLE NI;Lo;0;L;;;;;N;;;;; +1293;ETHIOPIC SYLLABLE NAA;Lo;0;L;;;;;N;;;;; +1294;ETHIOPIC SYLLABLE NEE;Lo;0;L;;;;;N;;;;; +1295;ETHIOPIC SYLLABLE NE;Lo;0;L;;;;;N;;;;; +1296;ETHIOPIC SYLLABLE NO;Lo;0;L;;;;;N;;;;; +1297;ETHIOPIC SYLLABLE NWA;Lo;0;L;;;;;N;;;;; +1298;ETHIOPIC SYLLABLE NYA;Lo;0;L;;;;;N;;;;; +1299;ETHIOPIC SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +129A;ETHIOPIC SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +129B;ETHIOPIC SYLLABLE NYAA;Lo;0;L;;;;;N;;;;; +129C;ETHIOPIC SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; +129D;ETHIOPIC SYLLABLE NYE;Lo;0;L;;;;;N;;;;; +129E;ETHIOPIC SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +129F;ETHIOPIC SYLLABLE NYWA;Lo;0;L;;;;;N;;;;; +12A0;ETHIOPIC SYLLABLE GLOTTAL A;Lo;0;L;;;;;N;;;;; +12A1;ETHIOPIC SYLLABLE GLOTTAL U;Lo;0;L;;;;;N;;;;; +12A2;ETHIOPIC SYLLABLE GLOTTAL I;Lo;0;L;;;;;N;;;;; +12A3;ETHIOPIC SYLLABLE GLOTTAL AA;Lo;0;L;;;;;N;;;;; +12A4;ETHIOPIC SYLLABLE GLOTTAL EE;Lo;0;L;;;;;N;;;;; +12A5;ETHIOPIC SYLLABLE GLOTTAL E;Lo;0;L;;;;;N;;;;; +12A6;ETHIOPIC SYLLABLE GLOTTAL O;Lo;0;L;;;;;N;;;;; +12A7;ETHIOPIC SYLLABLE GLOTTAL WA;Lo;0;L;;;;;N;;;;; +12A8;ETHIOPIC SYLLABLE KA;Lo;0;L;;;;;N;;;;; +12A9;ETHIOPIC SYLLABLE KU;Lo;0;L;;;;;N;;;;; +12AA;ETHIOPIC SYLLABLE KI;Lo;0;L;;;;;N;;;;; +12AB;ETHIOPIC SYLLABLE KAA;Lo;0;L;;;;;N;;;;; +12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;; +12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;; +12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;; +12AF;ETHIOPIC SYLLABLE KOA;Lo;0;L;;;;;N;;;;; +12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;; +12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;; +12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;; +12B4;ETHIOPIC SYLLABLE KWEE;Lo;0;L;;;;;N;;;;; +12B5;ETHIOPIC SYLLABLE KWE;Lo;0;L;;;;;N;;;;; +12B8;ETHIOPIC SYLLABLE KXA;Lo;0;L;;;;;N;;;;; +12B9;ETHIOPIC SYLLABLE KXU;Lo;0;L;;;;;N;;;;; +12BA;ETHIOPIC SYLLABLE KXI;Lo;0;L;;;;;N;;;;; +12BB;ETHIOPIC SYLLABLE KXAA;Lo;0;L;;;;;N;;;;; +12BC;ETHIOPIC SYLLABLE KXEE;Lo;0;L;;;;;N;;;;; +12BD;ETHIOPIC SYLLABLE KXE;Lo;0;L;;;;;N;;;;; +12BE;ETHIOPIC SYLLABLE KXO;Lo;0;L;;;;;N;;;;; +12C0;ETHIOPIC SYLLABLE KXWA;Lo;0;L;;;;;N;;;;; +12C2;ETHIOPIC SYLLABLE KXWI;Lo;0;L;;;;;N;;;;; +12C3;ETHIOPIC SYLLABLE KXWAA;Lo;0;L;;;;;N;;;;; +12C4;ETHIOPIC SYLLABLE KXWEE;Lo;0;L;;;;;N;;;;; +12C5;ETHIOPIC SYLLABLE KXWE;Lo;0;L;;;;;N;;;;; +12C8;ETHIOPIC SYLLABLE WA;Lo;0;L;;;;;N;;;;; +12C9;ETHIOPIC SYLLABLE WU;Lo;0;L;;;;;N;;;;; +12CA;ETHIOPIC SYLLABLE WI;Lo;0;L;;;;;N;;;;; +12CB;ETHIOPIC SYLLABLE WAA;Lo;0;L;;;;;N;;;;; +12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;; +12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;; +12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;; +12CF;ETHIOPIC SYLLABLE WOA;Lo;0;L;;;;;N;;;;; +12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;; +12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;; +12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;; +12D3;ETHIOPIC SYLLABLE PHARYNGEAL AA;Lo;0;L;;;;;N;;;;; +12D4;ETHIOPIC SYLLABLE PHARYNGEAL EE;Lo;0;L;;;;;N;;;;; +12D5;ETHIOPIC SYLLABLE PHARYNGEAL E;Lo;0;L;;;;;N;;;;; +12D6;ETHIOPIC SYLLABLE PHARYNGEAL O;Lo;0;L;;;;;N;;;;; +12D8;ETHIOPIC SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +12D9;ETHIOPIC SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +12DA;ETHIOPIC SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +12DB;ETHIOPIC SYLLABLE ZAA;Lo;0;L;;;;;N;;;;; +12DC;ETHIOPIC SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; +12DD;ETHIOPIC SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +12DE;ETHIOPIC SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +12DF;ETHIOPIC SYLLABLE ZWA;Lo;0;L;;;;;N;;;;; +12E0;ETHIOPIC SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +12E1;ETHIOPIC SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +12E2;ETHIOPIC SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; +12E3;ETHIOPIC SYLLABLE ZHAA;Lo;0;L;;;;;N;;;;; +12E4;ETHIOPIC SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; +12E5;ETHIOPIC SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +12E6;ETHIOPIC SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +12E7;ETHIOPIC SYLLABLE ZHWA;Lo;0;L;;;;;N;;;;; +12E8;ETHIOPIC SYLLABLE YA;Lo;0;L;;;;;N;;;;; +12E9;ETHIOPIC SYLLABLE YU;Lo;0;L;;;;;N;;;;; +12EA;ETHIOPIC SYLLABLE YI;Lo;0;L;;;;;N;;;;; +12EB;ETHIOPIC SYLLABLE YAA;Lo;0;L;;;;;N;;;;; +12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;; +12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;; +12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;; +12EF;ETHIOPIC SYLLABLE YOA;Lo;0;L;;;;;N;;;;; +12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;; +12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;; +12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;; +12F3;ETHIOPIC SYLLABLE DAA;Lo;0;L;;;;;N;;;;; +12F4;ETHIOPIC SYLLABLE DEE;Lo;0;L;;;;;N;;;;; +12F5;ETHIOPIC SYLLABLE DE;Lo;0;L;;;;;N;;;;; +12F6;ETHIOPIC SYLLABLE DO;Lo;0;L;;;;;N;;;;; +12F7;ETHIOPIC SYLLABLE DWA;Lo;0;L;;;;;N;;;;; +12F8;ETHIOPIC SYLLABLE DDA;Lo;0;L;;;;;N;;;;; +12F9;ETHIOPIC SYLLABLE DDU;Lo;0;L;;;;;N;;;;; +12FA;ETHIOPIC SYLLABLE DDI;Lo;0;L;;;;;N;;;;; +12FB;ETHIOPIC SYLLABLE DDAA;Lo;0;L;;;;;N;;;;; +12FC;ETHIOPIC SYLLABLE DDEE;Lo;0;L;;;;;N;;;;; +12FD;ETHIOPIC SYLLABLE DDE;Lo;0;L;;;;;N;;;;; +12FE;ETHIOPIC SYLLABLE DDO;Lo;0;L;;;;;N;;;;; +12FF;ETHIOPIC SYLLABLE DDWA;Lo;0;L;;;;;N;;;;; +1300;ETHIOPIC SYLLABLE JA;Lo;0;L;;;;;N;;;;; +1301;ETHIOPIC SYLLABLE JU;Lo;0;L;;;;;N;;;;; +1302;ETHIOPIC SYLLABLE JI;Lo;0;L;;;;;N;;;;; +1303;ETHIOPIC SYLLABLE JAA;Lo;0;L;;;;;N;;;;; +1304;ETHIOPIC SYLLABLE JEE;Lo;0;L;;;;;N;;;;; +1305;ETHIOPIC SYLLABLE JE;Lo;0;L;;;;;N;;;;; +1306;ETHIOPIC SYLLABLE JO;Lo;0;L;;;;;N;;;;; +1307;ETHIOPIC SYLLABLE JWA;Lo;0;L;;;;;N;;;;; +1308;ETHIOPIC SYLLABLE GA;Lo;0;L;;;;;N;;;;; +1309;ETHIOPIC SYLLABLE GU;Lo;0;L;;;;;N;;;;; +130A;ETHIOPIC SYLLABLE GI;Lo;0;L;;;;;N;;;;; +130B;ETHIOPIC SYLLABLE GAA;Lo;0;L;;;;;N;;;;; +130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;; +130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;; +130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;; +130F;ETHIOPIC SYLLABLE GOA;Lo;0;L;;;;;N;;;;; +1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;; +1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;; +1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;; +1314;ETHIOPIC SYLLABLE GWEE;Lo;0;L;;;;;N;;;;; +1315;ETHIOPIC SYLLABLE GWE;Lo;0;L;;;;;N;;;;; +1318;ETHIOPIC SYLLABLE GGA;Lo;0;L;;;;;N;;;;; +1319;ETHIOPIC SYLLABLE GGU;Lo;0;L;;;;;N;;;;; +131A;ETHIOPIC SYLLABLE GGI;Lo;0;L;;;;;N;;;;; +131B;ETHIOPIC SYLLABLE GGAA;Lo;0;L;;;;;N;;;;; +131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;; +131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;; +131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;; +131F;ETHIOPIC SYLLABLE GGWAA;Lo;0;L;;;;;N;;;;; +1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;; +1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;; +1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;; +1323;ETHIOPIC SYLLABLE THAA;Lo;0;L;;;;;N;;;;; +1324;ETHIOPIC SYLLABLE THEE;Lo;0;L;;;;;N;;;;; +1325;ETHIOPIC SYLLABLE THE;Lo;0;L;;;;;N;;;;; +1326;ETHIOPIC SYLLABLE THO;Lo;0;L;;;;;N;;;;; +1327;ETHIOPIC SYLLABLE THWA;Lo;0;L;;;;;N;;;;; +1328;ETHIOPIC SYLLABLE CHA;Lo;0;L;;;;;N;;;;; +1329;ETHIOPIC SYLLABLE CHU;Lo;0;L;;;;;N;;;;; +132A;ETHIOPIC SYLLABLE CHI;Lo;0;L;;;;;N;;;;; +132B;ETHIOPIC SYLLABLE CHAA;Lo;0;L;;;;;N;;;;; +132C;ETHIOPIC SYLLABLE CHEE;Lo;0;L;;;;;N;;;;; +132D;ETHIOPIC SYLLABLE CHE;Lo;0;L;;;;;N;;;;; +132E;ETHIOPIC SYLLABLE CHO;Lo;0;L;;;;;N;;;;; +132F;ETHIOPIC SYLLABLE CHWA;Lo;0;L;;;;;N;;;;; +1330;ETHIOPIC SYLLABLE PHA;Lo;0;L;;;;;N;;;;; +1331;ETHIOPIC SYLLABLE PHU;Lo;0;L;;;;;N;;;;; +1332;ETHIOPIC SYLLABLE PHI;Lo;0;L;;;;;N;;;;; +1333;ETHIOPIC SYLLABLE PHAA;Lo;0;L;;;;;N;;;;; +1334;ETHIOPIC SYLLABLE PHEE;Lo;0;L;;;;;N;;;;; +1335;ETHIOPIC SYLLABLE PHE;Lo;0;L;;;;;N;;;;; +1336;ETHIOPIC SYLLABLE PHO;Lo;0;L;;;;;N;;;;; +1337;ETHIOPIC SYLLABLE PHWA;Lo;0;L;;;;;N;;;;; +1338;ETHIOPIC SYLLABLE TSA;Lo;0;L;;;;;N;;;;; +1339;ETHIOPIC SYLLABLE TSU;Lo;0;L;;;;;N;;;;; +133A;ETHIOPIC SYLLABLE TSI;Lo;0;L;;;;;N;;;;; +133B;ETHIOPIC SYLLABLE TSAA;Lo;0;L;;;;;N;;;;; +133C;ETHIOPIC SYLLABLE TSEE;Lo;0;L;;;;;N;;;;; +133D;ETHIOPIC SYLLABLE TSE;Lo;0;L;;;;;N;;;;; +133E;ETHIOPIC SYLLABLE TSO;Lo;0;L;;;;;N;;;;; +133F;ETHIOPIC SYLLABLE TSWA;Lo;0;L;;;;;N;;;;; +1340;ETHIOPIC SYLLABLE TZA;Lo;0;L;;;;;N;;;;; +1341;ETHIOPIC SYLLABLE TZU;Lo;0;L;;;;;N;;;;; +1342;ETHIOPIC SYLLABLE TZI;Lo;0;L;;;;;N;;;;; +1343;ETHIOPIC SYLLABLE TZAA;Lo;0;L;;;;;N;;;;; +1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;; +1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;; +1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;; +1347;ETHIOPIC SYLLABLE TZOA;Lo;0;L;;;;;N;;;;; +1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;; +1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;; +134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;; +134B;ETHIOPIC SYLLABLE FAA;Lo;0;L;;;;;N;;;;; +134C;ETHIOPIC SYLLABLE FEE;Lo;0;L;;;;;N;;;;; +134D;ETHIOPIC SYLLABLE FE;Lo;0;L;;;;;N;;;;; +134E;ETHIOPIC SYLLABLE FO;Lo;0;L;;;;;N;;;;; +134F;ETHIOPIC SYLLABLE FWA;Lo;0;L;;;;;N;;;;; +1350;ETHIOPIC SYLLABLE PA;Lo;0;L;;;;;N;;;;; +1351;ETHIOPIC SYLLABLE PU;Lo;0;L;;;;;N;;;;; +1352;ETHIOPIC SYLLABLE PI;Lo;0;L;;;;;N;;;;; +1353;ETHIOPIC SYLLABLE PAA;Lo;0;L;;;;;N;;;;; +1354;ETHIOPIC SYLLABLE PEE;Lo;0;L;;;;;N;;;;; +1355;ETHIOPIC SYLLABLE PE;Lo;0;L;;;;;N;;;;; +1356;ETHIOPIC SYLLABLE PO;Lo;0;L;;;;;N;;;;; +1357;ETHIOPIC SYLLABLE PWA;Lo;0;L;;;;;N;;;;; +1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;; +1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;; +135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;; +135F;ETHIOPIC COMBINING GEMINATION MARK;Mn;230;NSM;;;;;N;;;;; +1360;ETHIOPIC SECTION MARK;So;0;L;;;;;N;;;;; +1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;; +1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;; +1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;; +1364;ETHIOPIC SEMICOLON;Po;0;L;;;;;N;;;;; +1365;ETHIOPIC COLON;Po;0;L;;;;;N;;;;; +1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;; +1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;; +1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; +1369;ETHIOPIC DIGIT ONE;No;0;L;;;1;1;N;;;;; +136A;ETHIOPIC DIGIT TWO;No;0;L;;;2;2;N;;;;; +136B;ETHIOPIC DIGIT THREE;No;0;L;;;3;3;N;;;;; +136C;ETHIOPIC DIGIT FOUR;No;0;L;;;4;4;N;;;;; +136D;ETHIOPIC DIGIT FIVE;No;0;L;;;5;5;N;;;;; +136E;ETHIOPIC DIGIT SIX;No;0;L;;;6;6;N;;;;; +136F;ETHIOPIC DIGIT SEVEN;No;0;L;;;7;7;N;;;;; +1370;ETHIOPIC DIGIT EIGHT;No;0;L;;;8;8;N;;;;; +1371;ETHIOPIC DIGIT NINE;No;0;L;;;9;9;N;;;;; +1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;; +1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; +1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; +1375;ETHIOPIC NUMBER FORTY;No;0;L;;;;40;N;;;;; +1376;ETHIOPIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; +1377;ETHIOPIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; +1378;ETHIOPIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +1379;ETHIOPIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;; +137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;; +137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; +1380;ETHIOPIC SYLLABLE SEBATBEIT MWA;Lo;0;L;;;;;N;;;;; +1381;ETHIOPIC SYLLABLE MWI;Lo;0;L;;;;;N;;;;; +1382;ETHIOPIC SYLLABLE MWEE;Lo;0;L;;;;;N;;;;; +1383;ETHIOPIC SYLLABLE MWE;Lo;0;L;;;;;N;;;;; +1384;ETHIOPIC SYLLABLE SEBATBEIT BWA;Lo;0;L;;;;;N;;;;; +1385;ETHIOPIC SYLLABLE BWI;Lo;0;L;;;;;N;;;;; +1386;ETHIOPIC SYLLABLE BWEE;Lo;0;L;;;;;N;;;;; +1387;ETHIOPIC SYLLABLE BWE;Lo;0;L;;;;;N;;;;; +1388;ETHIOPIC SYLLABLE SEBATBEIT FWA;Lo;0;L;;;;;N;;;;; +1389;ETHIOPIC SYLLABLE FWI;Lo;0;L;;;;;N;;;;; +138A;ETHIOPIC SYLLABLE FWEE;Lo;0;L;;;;;N;;;;; +138B;ETHIOPIC SYLLABLE FWE;Lo;0;L;;;;;N;;;;; +138C;ETHIOPIC SYLLABLE SEBATBEIT PWA;Lo;0;L;;;;;N;;;;; +138D;ETHIOPIC SYLLABLE PWI;Lo;0;L;;;;;N;;;;; +138E;ETHIOPIC SYLLABLE PWEE;Lo;0;L;;;;;N;;;;; +138F;ETHIOPIC SYLLABLE PWE;Lo;0;L;;;;;N;;;;; +1390;ETHIOPIC TONAL MARK YIZET;So;0;ON;;;;;N;;;;; +1391;ETHIOPIC TONAL MARK DERET;So;0;ON;;;;;N;;;;; +1392;ETHIOPIC TONAL MARK RIKRIK;So;0;ON;;;;;N;;;;; +1393;ETHIOPIC TONAL MARK SHORT RIKRIK;So;0;ON;;;;;N;;;;; +1394;ETHIOPIC TONAL MARK DIFAT;So;0;ON;;;;;N;;;;; +1395;ETHIOPIC TONAL MARK KENAT;So;0;ON;;;;;N;;;;; +1396;ETHIOPIC TONAL MARK CHIRET;So;0;ON;;;;;N;;;;; +1397;ETHIOPIC TONAL MARK HIDET;So;0;ON;;;;;N;;;;; +1398;ETHIOPIC TONAL MARK DERET-HIDET;So;0;ON;;;;;N;;;;; +1399;ETHIOPIC TONAL MARK KURT;So;0;ON;;;;;N;;;;; +13A0;CHEROKEE LETTER A;Lo;0;L;;;;;N;;;;; +13A1;CHEROKEE LETTER E;Lo;0;L;;;;;N;;;;; +13A2;CHEROKEE LETTER I;Lo;0;L;;;;;N;;;;; +13A3;CHEROKEE LETTER O;Lo;0;L;;;;;N;;;;; +13A4;CHEROKEE LETTER U;Lo;0;L;;;;;N;;;;; +13A5;CHEROKEE LETTER V;Lo;0;L;;;;;N;;;;; +13A6;CHEROKEE LETTER GA;Lo;0;L;;;;;N;;;;; +13A7;CHEROKEE LETTER KA;Lo;0;L;;;;;N;;;;; +13A8;CHEROKEE LETTER GE;Lo;0;L;;;;;N;;;;; +13A9;CHEROKEE LETTER GI;Lo;0;L;;;;;N;;;;; +13AA;CHEROKEE LETTER GO;Lo;0;L;;;;;N;;;;; +13AB;CHEROKEE LETTER GU;Lo;0;L;;;;;N;;;;; +13AC;CHEROKEE LETTER GV;Lo;0;L;;;;;N;;;;; +13AD;CHEROKEE LETTER HA;Lo;0;L;;;;;N;;;;; +13AE;CHEROKEE LETTER HE;Lo;0;L;;;;;N;;;;; +13AF;CHEROKEE LETTER HI;Lo;0;L;;;;;N;;;;; +13B0;CHEROKEE LETTER HO;Lo;0;L;;;;;N;;;;; +13B1;CHEROKEE LETTER HU;Lo;0;L;;;;;N;;;;; +13B2;CHEROKEE LETTER HV;Lo;0;L;;;;;N;;;;; +13B3;CHEROKEE LETTER LA;Lo;0;L;;;;;N;;;;; +13B4;CHEROKEE LETTER LE;Lo;0;L;;;;;N;;;;; +13B5;CHEROKEE LETTER LI;Lo;0;L;;;;;N;;;;; +13B6;CHEROKEE LETTER LO;Lo;0;L;;;;;N;;;;; +13B7;CHEROKEE LETTER LU;Lo;0;L;;;;;N;;;;; +13B8;CHEROKEE LETTER LV;Lo;0;L;;;;;N;;;;; +13B9;CHEROKEE LETTER MA;Lo;0;L;;;;;N;;;;; +13BA;CHEROKEE LETTER ME;Lo;0;L;;;;;N;;;;; +13BB;CHEROKEE LETTER MI;Lo;0;L;;;;;N;;;;; +13BC;CHEROKEE LETTER MO;Lo;0;L;;;;;N;;;;; +13BD;CHEROKEE LETTER MU;Lo;0;L;;;;;N;;;;; +13BE;CHEROKEE LETTER NA;Lo;0;L;;;;;N;;;;; +13BF;CHEROKEE LETTER HNA;Lo;0;L;;;;;N;;;;; +13C0;CHEROKEE LETTER NAH;Lo;0;L;;;;;N;;;;; +13C1;CHEROKEE LETTER NE;Lo;0;L;;;;;N;;;;; +13C2;CHEROKEE LETTER NI;Lo;0;L;;;;;N;;;;; +13C3;CHEROKEE LETTER NO;Lo;0;L;;;;;N;;;;; +13C4;CHEROKEE LETTER NU;Lo;0;L;;;;;N;;;;; +13C5;CHEROKEE LETTER NV;Lo;0;L;;;;;N;;;;; +13C6;CHEROKEE LETTER QUA;Lo;0;L;;;;;N;;;;; +13C7;CHEROKEE LETTER QUE;Lo;0;L;;;;;N;;;;; +13C8;CHEROKEE LETTER QUI;Lo;0;L;;;;;N;;;;; +13C9;CHEROKEE LETTER QUO;Lo;0;L;;;;;N;;;;; +13CA;CHEROKEE LETTER QUU;Lo;0;L;;;;;N;;;;; +13CB;CHEROKEE LETTER QUV;Lo;0;L;;;;;N;;;;; +13CC;CHEROKEE LETTER SA;Lo;0;L;;;;;N;;;;; +13CD;CHEROKEE LETTER S;Lo;0;L;;;;;N;;;;; +13CE;CHEROKEE LETTER SE;Lo;0;L;;;;;N;;;;; +13CF;CHEROKEE LETTER SI;Lo;0;L;;;;;N;;;;; +13D0;CHEROKEE LETTER SO;Lo;0;L;;;;;N;;;;; +13D1;CHEROKEE LETTER SU;Lo;0;L;;;;;N;;;;; +13D2;CHEROKEE LETTER SV;Lo;0;L;;;;;N;;;;; +13D3;CHEROKEE LETTER DA;Lo;0;L;;;;;N;;;;; +13D4;CHEROKEE LETTER TA;Lo;0;L;;;;;N;;;;; +13D5;CHEROKEE LETTER DE;Lo;0;L;;;;;N;;;;; +13D6;CHEROKEE LETTER TE;Lo;0;L;;;;;N;;;;; +13D7;CHEROKEE LETTER DI;Lo;0;L;;;;;N;;;;; +13D8;CHEROKEE LETTER TI;Lo;0;L;;;;;N;;;;; +13D9;CHEROKEE LETTER DO;Lo;0;L;;;;;N;;;;; +13DA;CHEROKEE LETTER DU;Lo;0;L;;;;;N;;;;; +13DB;CHEROKEE LETTER DV;Lo;0;L;;;;;N;;;;; +13DC;CHEROKEE LETTER DLA;Lo;0;L;;;;;N;;;;; +13DD;CHEROKEE LETTER TLA;Lo;0;L;;;;;N;;;;; +13DE;CHEROKEE LETTER TLE;Lo;0;L;;;;;N;;;;; +13DF;CHEROKEE LETTER TLI;Lo;0;L;;;;;N;;;;; +13E0;CHEROKEE LETTER TLO;Lo;0;L;;;;;N;;;;; +13E1;CHEROKEE LETTER TLU;Lo;0;L;;;;;N;;;;; +13E2;CHEROKEE LETTER TLV;Lo;0;L;;;;;N;;;;; +13E3;CHEROKEE LETTER TSA;Lo;0;L;;;;;N;;;;; +13E4;CHEROKEE LETTER TSE;Lo;0;L;;;;;N;;;;; +13E5;CHEROKEE LETTER TSI;Lo;0;L;;;;;N;;;;; +13E6;CHEROKEE LETTER TSO;Lo;0;L;;;;;N;;;;; +13E7;CHEROKEE LETTER TSU;Lo;0;L;;;;;N;;;;; +13E8;CHEROKEE LETTER TSV;Lo;0;L;;;;;N;;;;; +13E9;CHEROKEE LETTER WA;Lo;0;L;;;;;N;;;;; +13EA;CHEROKEE LETTER WE;Lo;0;L;;;;;N;;;;; +13EB;CHEROKEE LETTER WI;Lo;0;L;;;;;N;;;;; +13EC;CHEROKEE LETTER WO;Lo;0;L;;;;;N;;;;; +13ED;CHEROKEE LETTER WU;Lo;0;L;;;;;N;;;;; +13EE;CHEROKEE LETTER WV;Lo;0;L;;;;;N;;;;; +13EF;CHEROKEE LETTER YA;Lo;0;L;;;;;N;;;;; +13F0;CHEROKEE LETTER YE;Lo;0;L;;;;;N;;;;; +13F1;CHEROKEE LETTER YI;Lo;0;L;;;;;N;;;;; +13F2;CHEROKEE LETTER YO;Lo;0;L;;;;;N;;;;; +13F3;CHEROKEE LETTER YU;Lo;0;L;;;;;N;;;;; +13F4;CHEROKEE LETTER YV;Lo;0;L;;;;;N;;;;; +1400;CANADIAN SYLLABICS HYPHEN;Pd;0;ON;;;;;N;;;;; +1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;; +1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;; +1403;CANADIAN SYLLABICS I;Lo;0;L;;;;;N;;;;; +1404;CANADIAN SYLLABICS II;Lo;0;L;;;;;N;;;;; +1405;CANADIAN SYLLABICS O;Lo;0;L;;;;;N;;;;; +1406;CANADIAN SYLLABICS OO;Lo;0;L;;;;;N;;;;; +1407;CANADIAN SYLLABICS Y-CREE OO;Lo;0;L;;;;;N;;;;; +1408;CANADIAN SYLLABICS CARRIER EE;Lo;0;L;;;;;N;;;;; +1409;CANADIAN SYLLABICS CARRIER I;Lo;0;L;;;;;N;;;;; +140A;CANADIAN SYLLABICS A;Lo;0;L;;;;;N;;;;; +140B;CANADIAN SYLLABICS AA;Lo;0;L;;;;;N;;;;; +140C;CANADIAN SYLLABICS WE;Lo;0;L;;;;;N;;;;; +140D;CANADIAN SYLLABICS WEST-CREE WE;Lo;0;L;;;;;N;;;;; +140E;CANADIAN SYLLABICS WI;Lo;0;L;;;;;N;;;;; +140F;CANADIAN SYLLABICS WEST-CREE WI;Lo;0;L;;;;;N;;;;; +1410;CANADIAN SYLLABICS WII;Lo;0;L;;;;;N;;;;; +1411;CANADIAN SYLLABICS WEST-CREE WII;Lo;0;L;;;;;N;;;;; +1412;CANADIAN SYLLABICS WO;Lo;0;L;;;;;N;;;;; +1413;CANADIAN SYLLABICS WEST-CREE WO;Lo;0;L;;;;;N;;;;; +1414;CANADIAN SYLLABICS WOO;Lo;0;L;;;;;N;;;;; +1415;CANADIAN SYLLABICS WEST-CREE WOO;Lo;0;L;;;;;N;;;;; +1416;CANADIAN SYLLABICS NASKAPI WOO;Lo;0;L;;;;;N;;;;; +1417;CANADIAN SYLLABICS WA;Lo;0;L;;;;;N;;;;; +1418;CANADIAN SYLLABICS WEST-CREE WA;Lo;0;L;;;;;N;;;;; +1419;CANADIAN SYLLABICS WAA;Lo;0;L;;;;;N;;;;; +141A;CANADIAN SYLLABICS WEST-CREE WAA;Lo;0;L;;;;;N;;;;; +141B;CANADIAN SYLLABICS NASKAPI WAA;Lo;0;L;;;;;N;;;;; +141C;CANADIAN SYLLABICS AI;Lo;0;L;;;;;N;;;;; +141D;CANADIAN SYLLABICS Y-CREE W;Lo;0;L;;;;;N;;;;; +141E;CANADIAN SYLLABICS GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +141F;CANADIAN SYLLABICS FINAL ACUTE;Lo;0;L;;;;;N;;;;; +1420;CANADIAN SYLLABICS FINAL GRAVE;Lo;0;L;;;;;N;;;;; +1421;CANADIAN SYLLABICS FINAL BOTTOM HALF RING;Lo;0;L;;;;;N;;;;; +1422;CANADIAN SYLLABICS FINAL TOP HALF RING;Lo;0;L;;;;;N;;;;; +1423;CANADIAN SYLLABICS FINAL RIGHT HALF RING;Lo;0;L;;;;;N;;;;; +1424;CANADIAN SYLLABICS FINAL RING;Lo;0;L;;;;;N;;;;; +1425;CANADIAN SYLLABICS FINAL DOUBLE ACUTE;Lo;0;L;;;;;N;;;;; +1426;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES;Lo;0;L;;;;;N;;;;; +1427;CANADIAN SYLLABICS FINAL MIDDLE DOT;Lo;0;L;;;;;N;;;;; +1428;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE;Lo;0;L;;;;;N;;;;; +1429;CANADIAN SYLLABICS FINAL PLUS;Lo;0;L;;;;;N;;;;; +142A;CANADIAN SYLLABICS FINAL DOWN TACK;Lo;0;L;;;;;N;;;;; +142B;CANADIAN SYLLABICS EN;Lo;0;L;;;;;N;;;;; +142C;CANADIAN SYLLABICS IN;Lo;0;L;;;;;N;;;;; +142D;CANADIAN SYLLABICS ON;Lo;0;L;;;;;N;;;;; +142E;CANADIAN SYLLABICS AN;Lo;0;L;;;;;N;;;;; +142F;CANADIAN SYLLABICS PE;Lo;0;L;;;;;N;;;;; +1430;CANADIAN SYLLABICS PAAI;Lo;0;L;;;;;N;;;;; +1431;CANADIAN SYLLABICS PI;Lo;0;L;;;;;N;;;;; +1432;CANADIAN SYLLABICS PII;Lo;0;L;;;;;N;;;;; +1433;CANADIAN SYLLABICS PO;Lo;0;L;;;;;N;;;;; +1434;CANADIAN SYLLABICS POO;Lo;0;L;;;;;N;;;;; +1435;CANADIAN SYLLABICS Y-CREE POO;Lo;0;L;;;;;N;;;;; +1436;CANADIAN SYLLABICS CARRIER HEE;Lo;0;L;;;;;N;;;;; +1437;CANADIAN SYLLABICS CARRIER HI;Lo;0;L;;;;;N;;;;; +1438;CANADIAN SYLLABICS PA;Lo;0;L;;;;;N;;;;; +1439;CANADIAN SYLLABICS PAA;Lo;0;L;;;;;N;;;;; +143A;CANADIAN SYLLABICS PWE;Lo;0;L;;;;;N;;;;; +143B;CANADIAN SYLLABICS WEST-CREE PWE;Lo;0;L;;;;;N;;;;; +143C;CANADIAN SYLLABICS PWI;Lo;0;L;;;;;N;;;;; +143D;CANADIAN SYLLABICS WEST-CREE PWI;Lo;0;L;;;;;N;;;;; +143E;CANADIAN SYLLABICS PWII;Lo;0;L;;;;;N;;;;; +143F;CANADIAN SYLLABICS WEST-CREE PWII;Lo;0;L;;;;;N;;;;; +1440;CANADIAN SYLLABICS PWO;Lo;0;L;;;;;N;;;;; +1441;CANADIAN SYLLABICS WEST-CREE PWO;Lo;0;L;;;;;N;;;;; +1442;CANADIAN SYLLABICS PWOO;Lo;0;L;;;;;N;;;;; +1443;CANADIAN SYLLABICS WEST-CREE PWOO;Lo;0;L;;;;;N;;;;; +1444;CANADIAN SYLLABICS PWA;Lo;0;L;;;;;N;;;;; +1445;CANADIAN SYLLABICS WEST-CREE PWA;Lo;0;L;;;;;N;;;;; +1446;CANADIAN SYLLABICS PWAA;Lo;0;L;;;;;N;;;;; +1447;CANADIAN SYLLABICS WEST-CREE PWAA;Lo;0;L;;;;;N;;;;; +1448;CANADIAN SYLLABICS Y-CREE PWAA;Lo;0;L;;;;;N;;;;; +1449;CANADIAN SYLLABICS P;Lo;0;L;;;;;N;;;;; +144A;CANADIAN SYLLABICS WEST-CREE P;Lo;0;L;;;;;N;;;;; +144B;CANADIAN SYLLABICS CARRIER H;Lo;0;L;;;;;N;;;;; +144C;CANADIAN SYLLABICS TE;Lo;0;L;;;;;N;;;;; +144D;CANADIAN SYLLABICS TAAI;Lo;0;L;;;;;N;;;;; +144E;CANADIAN SYLLABICS TI;Lo;0;L;;;;;N;;;;; +144F;CANADIAN SYLLABICS TII;Lo;0;L;;;;;N;;;;; +1450;CANADIAN SYLLABICS TO;Lo;0;L;;;;;N;;;;; +1451;CANADIAN SYLLABICS TOO;Lo;0;L;;;;;N;;;;; +1452;CANADIAN SYLLABICS Y-CREE TOO;Lo;0;L;;;;;N;;;;; +1453;CANADIAN SYLLABICS CARRIER DEE;Lo;0;L;;;;;N;;;;; +1454;CANADIAN SYLLABICS CARRIER DI;Lo;0;L;;;;;N;;;;; +1455;CANADIAN SYLLABICS TA;Lo;0;L;;;;;N;;;;; +1456;CANADIAN SYLLABICS TAA;Lo;0;L;;;;;N;;;;; +1457;CANADIAN SYLLABICS TWE;Lo;0;L;;;;;N;;;;; +1458;CANADIAN SYLLABICS WEST-CREE TWE;Lo;0;L;;;;;N;;;;; +1459;CANADIAN SYLLABICS TWI;Lo;0;L;;;;;N;;;;; +145A;CANADIAN SYLLABICS WEST-CREE TWI;Lo;0;L;;;;;N;;;;; +145B;CANADIAN SYLLABICS TWII;Lo;0;L;;;;;N;;;;; +145C;CANADIAN SYLLABICS WEST-CREE TWII;Lo;0;L;;;;;N;;;;; +145D;CANADIAN SYLLABICS TWO;Lo;0;L;;;;;N;;;;; +145E;CANADIAN SYLLABICS WEST-CREE TWO;Lo;0;L;;;;;N;;;;; +145F;CANADIAN SYLLABICS TWOO;Lo;0;L;;;;;N;;;;; +1460;CANADIAN SYLLABICS WEST-CREE TWOO;Lo;0;L;;;;;N;;;;; +1461;CANADIAN SYLLABICS TWA;Lo;0;L;;;;;N;;;;; +1462;CANADIAN SYLLABICS WEST-CREE TWA;Lo;0;L;;;;;N;;;;; +1463;CANADIAN SYLLABICS TWAA;Lo;0;L;;;;;N;;;;; +1464;CANADIAN SYLLABICS WEST-CREE TWAA;Lo;0;L;;;;;N;;;;; +1465;CANADIAN SYLLABICS NASKAPI TWAA;Lo;0;L;;;;;N;;;;; +1466;CANADIAN SYLLABICS T;Lo;0;L;;;;;N;;;;; +1467;CANADIAN SYLLABICS TTE;Lo;0;L;;;;;N;;;;; +1468;CANADIAN SYLLABICS TTI;Lo;0;L;;;;;N;;;;; +1469;CANADIAN SYLLABICS TTO;Lo;0;L;;;;;N;;;;; +146A;CANADIAN SYLLABICS TTA;Lo;0;L;;;;;N;;;;; +146B;CANADIAN SYLLABICS KE;Lo;0;L;;;;;N;;;;; +146C;CANADIAN SYLLABICS KAAI;Lo;0;L;;;;;N;;;;; +146D;CANADIAN SYLLABICS KI;Lo;0;L;;;;;N;;;;; +146E;CANADIAN SYLLABICS KII;Lo;0;L;;;;;N;;;;; +146F;CANADIAN SYLLABICS KO;Lo;0;L;;;;;N;;;;; +1470;CANADIAN SYLLABICS KOO;Lo;0;L;;;;;N;;;;; +1471;CANADIAN SYLLABICS Y-CREE KOO;Lo;0;L;;;;;N;;;;; +1472;CANADIAN SYLLABICS KA;Lo;0;L;;;;;N;;;;; +1473;CANADIAN SYLLABICS KAA;Lo;0;L;;;;;N;;;;; +1474;CANADIAN SYLLABICS KWE;Lo;0;L;;;;;N;;;;; +1475;CANADIAN SYLLABICS WEST-CREE KWE;Lo;0;L;;;;;N;;;;; +1476;CANADIAN SYLLABICS KWI;Lo;0;L;;;;;N;;;;; +1477;CANADIAN SYLLABICS WEST-CREE KWI;Lo;0;L;;;;;N;;;;; +1478;CANADIAN SYLLABICS KWII;Lo;0;L;;;;;N;;;;; +1479;CANADIAN SYLLABICS WEST-CREE KWII;Lo;0;L;;;;;N;;;;; +147A;CANADIAN SYLLABICS KWO;Lo;0;L;;;;;N;;;;; +147B;CANADIAN SYLLABICS WEST-CREE KWO;Lo;0;L;;;;;N;;;;; +147C;CANADIAN SYLLABICS KWOO;Lo;0;L;;;;;N;;;;; +147D;CANADIAN SYLLABICS WEST-CREE KWOO;Lo;0;L;;;;;N;;;;; +147E;CANADIAN SYLLABICS KWA;Lo;0;L;;;;;N;;;;; +147F;CANADIAN SYLLABICS WEST-CREE KWA;Lo;0;L;;;;;N;;;;; +1480;CANADIAN SYLLABICS KWAA;Lo;0;L;;;;;N;;;;; +1481;CANADIAN SYLLABICS WEST-CREE KWAA;Lo;0;L;;;;;N;;;;; +1482;CANADIAN SYLLABICS NASKAPI KWAA;Lo;0;L;;;;;N;;;;; +1483;CANADIAN SYLLABICS K;Lo;0;L;;;;;N;;;;; +1484;CANADIAN SYLLABICS KW;Lo;0;L;;;;;N;;;;; +1485;CANADIAN SYLLABICS SOUTH-SLAVEY KEH;Lo;0;L;;;;;N;;;;; +1486;CANADIAN SYLLABICS SOUTH-SLAVEY KIH;Lo;0;L;;;;;N;;;;; +1487;CANADIAN SYLLABICS SOUTH-SLAVEY KOH;Lo;0;L;;;;;N;;;;; +1488;CANADIAN SYLLABICS SOUTH-SLAVEY KAH;Lo;0;L;;;;;N;;;;; +1489;CANADIAN SYLLABICS CE;Lo;0;L;;;;;N;;;;; +148A;CANADIAN SYLLABICS CAAI;Lo;0;L;;;;;N;;;;; +148B;CANADIAN SYLLABICS CI;Lo;0;L;;;;;N;;;;; +148C;CANADIAN SYLLABICS CII;Lo;0;L;;;;;N;;;;; +148D;CANADIAN SYLLABICS CO;Lo;0;L;;;;;N;;;;; +148E;CANADIAN SYLLABICS COO;Lo;0;L;;;;;N;;;;; +148F;CANADIAN SYLLABICS Y-CREE COO;Lo;0;L;;;;;N;;;;; +1490;CANADIAN SYLLABICS CA;Lo;0;L;;;;;N;;;;; +1491;CANADIAN SYLLABICS CAA;Lo;0;L;;;;;N;;;;; +1492;CANADIAN SYLLABICS CWE;Lo;0;L;;;;;N;;;;; +1493;CANADIAN SYLLABICS WEST-CREE CWE;Lo;0;L;;;;;N;;;;; +1494;CANADIAN SYLLABICS CWI;Lo;0;L;;;;;N;;;;; +1495;CANADIAN SYLLABICS WEST-CREE CWI;Lo;0;L;;;;;N;;;;; +1496;CANADIAN SYLLABICS CWII;Lo;0;L;;;;;N;;;;; +1497;CANADIAN SYLLABICS WEST-CREE CWII;Lo;0;L;;;;;N;;;;; +1498;CANADIAN SYLLABICS CWO;Lo;0;L;;;;;N;;;;; +1499;CANADIAN SYLLABICS WEST-CREE CWO;Lo;0;L;;;;;N;;;;; +149A;CANADIAN SYLLABICS CWOO;Lo;0;L;;;;;N;;;;; +149B;CANADIAN SYLLABICS WEST-CREE CWOO;Lo;0;L;;;;;N;;;;; +149C;CANADIAN SYLLABICS CWA;Lo;0;L;;;;;N;;;;; +149D;CANADIAN SYLLABICS WEST-CREE CWA;Lo;0;L;;;;;N;;;;; +149E;CANADIAN SYLLABICS CWAA;Lo;0;L;;;;;N;;;;; +149F;CANADIAN SYLLABICS WEST-CREE CWAA;Lo;0;L;;;;;N;;;;; +14A0;CANADIAN SYLLABICS NASKAPI CWAA;Lo;0;L;;;;;N;;;;; +14A1;CANADIAN SYLLABICS C;Lo;0;L;;;;;N;;;;; +14A2;CANADIAN SYLLABICS SAYISI TH;Lo;0;L;;;;;N;;;;; +14A3;CANADIAN SYLLABICS ME;Lo;0;L;;;;;N;;;;; +14A4;CANADIAN SYLLABICS MAAI;Lo;0;L;;;;;N;;;;; +14A5;CANADIAN SYLLABICS MI;Lo;0;L;;;;;N;;;;; +14A6;CANADIAN SYLLABICS MII;Lo;0;L;;;;;N;;;;; +14A7;CANADIAN SYLLABICS MO;Lo;0;L;;;;;N;;;;; +14A8;CANADIAN SYLLABICS MOO;Lo;0;L;;;;;N;;;;; +14A9;CANADIAN SYLLABICS Y-CREE MOO;Lo;0;L;;;;;N;;;;; +14AA;CANADIAN SYLLABICS MA;Lo;0;L;;;;;N;;;;; +14AB;CANADIAN SYLLABICS MAA;Lo;0;L;;;;;N;;;;; +14AC;CANADIAN SYLLABICS MWE;Lo;0;L;;;;;N;;;;; +14AD;CANADIAN SYLLABICS WEST-CREE MWE;Lo;0;L;;;;;N;;;;; +14AE;CANADIAN SYLLABICS MWI;Lo;0;L;;;;;N;;;;; +14AF;CANADIAN SYLLABICS WEST-CREE MWI;Lo;0;L;;;;;N;;;;; +14B0;CANADIAN SYLLABICS MWII;Lo;0;L;;;;;N;;;;; +14B1;CANADIAN SYLLABICS WEST-CREE MWII;Lo;0;L;;;;;N;;;;; +14B2;CANADIAN SYLLABICS MWO;Lo;0;L;;;;;N;;;;; +14B3;CANADIAN SYLLABICS WEST-CREE MWO;Lo;0;L;;;;;N;;;;; +14B4;CANADIAN SYLLABICS MWOO;Lo;0;L;;;;;N;;;;; +14B5;CANADIAN SYLLABICS WEST-CREE MWOO;Lo;0;L;;;;;N;;;;; +14B6;CANADIAN SYLLABICS MWA;Lo;0;L;;;;;N;;;;; +14B7;CANADIAN SYLLABICS WEST-CREE MWA;Lo;0;L;;;;;N;;;;; +14B8;CANADIAN SYLLABICS MWAA;Lo;0;L;;;;;N;;;;; +14B9;CANADIAN SYLLABICS WEST-CREE MWAA;Lo;0;L;;;;;N;;;;; +14BA;CANADIAN SYLLABICS NASKAPI MWAA;Lo;0;L;;;;;N;;;;; +14BB;CANADIAN SYLLABICS M;Lo;0;L;;;;;N;;;;; +14BC;CANADIAN SYLLABICS WEST-CREE M;Lo;0;L;;;;;N;;;;; +14BD;CANADIAN SYLLABICS MH;Lo;0;L;;;;;N;;;;; +14BE;CANADIAN SYLLABICS ATHAPASCAN M;Lo;0;L;;;;;N;;;;; +14BF;CANADIAN SYLLABICS SAYISI M;Lo;0;L;;;;;N;;;;; +14C0;CANADIAN SYLLABICS NE;Lo;0;L;;;;;N;;;;; +14C1;CANADIAN SYLLABICS NAAI;Lo;0;L;;;;;N;;;;; +14C2;CANADIAN SYLLABICS NI;Lo;0;L;;;;;N;;;;; +14C3;CANADIAN SYLLABICS NII;Lo;0;L;;;;;N;;;;; +14C4;CANADIAN SYLLABICS NO;Lo;0;L;;;;;N;;;;; +14C5;CANADIAN SYLLABICS NOO;Lo;0;L;;;;;N;;;;; +14C6;CANADIAN SYLLABICS Y-CREE NOO;Lo;0;L;;;;;N;;;;; +14C7;CANADIAN SYLLABICS NA;Lo;0;L;;;;;N;;;;; +14C8;CANADIAN SYLLABICS NAA;Lo;0;L;;;;;N;;;;; +14C9;CANADIAN SYLLABICS NWE;Lo;0;L;;;;;N;;;;; +14CA;CANADIAN SYLLABICS WEST-CREE NWE;Lo;0;L;;;;;N;;;;; +14CB;CANADIAN SYLLABICS NWA;Lo;0;L;;;;;N;;;;; +14CC;CANADIAN SYLLABICS WEST-CREE NWA;Lo;0;L;;;;;N;;;;; +14CD;CANADIAN SYLLABICS NWAA;Lo;0;L;;;;;N;;;;; +14CE;CANADIAN SYLLABICS WEST-CREE NWAA;Lo;0;L;;;;;N;;;;; +14CF;CANADIAN SYLLABICS NASKAPI NWAA;Lo;0;L;;;;;N;;;;; +14D0;CANADIAN SYLLABICS N;Lo;0;L;;;;;N;;;;; +14D1;CANADIAN SYLLABICS CARRIER NG;Lo;0;L;;;;;N;;;;; +14D2;CANADIAN SYLLABICS NH;Lo;0;L;;;;;N;;;;; +14D3;CANADIAN SYLLABICS LE;Lo;0;L;;;;;N;;;;; +14D4;CANADIAN SYLLABICS LAAI;Lo;0;L;;;;;N;;;;; +14D5;CANADIAN SYLLABICS LI;Lo;0;L;;;;;N;;;;; +14D6;CANADIAN SYLLABICS LII;Lo;0;L;;;;;N;;;;; +14D7;CANADIAN SYLLABICS LO;Lo;0;L;;;;;N;;;;; +14D8;CANADIAN SYLLABICS LOO;Lo;0;L;;;;;N;;;;; +14D9;CANADIAN SYLLABICS Y-CREE LOO;Lo;0;L;;;;;N;;;;; +14DA;CANADIAN SYLLABICS LA;Lo;0;L;;;;;N;;;;; +14DB;CANADIAN SYLLABICS LAA;Lo;0;L;;;;;N;;;;; +14DC;CANADIAN SYLLABICS LWE;Lo;0;L;;;;;N;;;;; +14DD;CANADIAN SYLLABICS WEST-CREE LWE;Lo;0;L;;;;;N;;;;; +14DE;CANADIAN SYLLABICS LWI;Lo;0;L;;;;;N;;;;; +14DF;CANADIAN SYLLABICS WEST-CREE LWI;Lo;0;L;;;;;N;;;;; +14E0;CANADIAN SYLLABICS LWII;Lo;0;L;;;;;N;;;;; +14E1;CANADIAN SYLLABICS WEST-CREE LWII;Lo;0;L;;;;;N;;;;; +14E2;CANADIAN SYLLABICS LWO;Lo;0;L;;;;;N;;;;; +14E3;CANADIAN SYLLABICS WEST-CREE LWO;Lo;0;L;;;;;N;;;;; +14E4;CANADIAN SYLLABICS LWOO;Lo;0;L;;;;;N;;;;; +14E5;CANADIAN SYLLABICS WEST-CREE LWOO;Lo;0;L;;;;;N;;;;; +14E6;CANADIAN SYLLABICS LWA;Lo;0;L;;;;;N;;;;; +14E7;CANADIAN SYLLABICS WEST-CREE LWA;Lo;0;L;;;;;N;;;;; +14E8;CANADIAN SYLLABICS LWAA;Lo;0;L;;;;;N;;;;; +14E9;CANADIAN SYLLABICS WEST-CREE LWAA;Lo;0;L;;;;;N;;;;; +14EA;CANADIAN SYLLABICS L;Lo;0;L;;;;;N;;;;; +14EB;CANADIAN SYLLABICS WEST-CREE L;Lo;0;L;;;;;N;;;;; +14EC;CANADIAN SYLLABICS MEDIAL L;Lo;0;L;;;;;N;;;;; +14ED;CANADIAN SYLLABICS SE;Lo;0;L;;;;;N;;;;; +14EE;CANADIAN SYLLABICS SAAI;Lo;0;L;;;;;N;;;;; +14EF;CANADIAN SYLLABICS SI;Lo;0;L;;;;;N;;;;; +14F0;CANADIAN SYLLABICS SII;Lo;0;L;;;;;N;;;;; +14F1;CANADIAN SYLLABICS SO;Lo;0;L;;;;;N;;;;; +14F2;CANADIAN SYLLABICS SOO;Lo;0;L;;;;;N;;;;; +14F3;CANADIAN SYLLABICS Y-CREE SOO;Lo;0;L;;;;;N;;;;; +14F4;CANADIAN SYLLABICS SA;Lo;0;L;;;;;N;;;;; +14F5;CANADIAN SYLLABICS SAA;Lo;0;L;;;;;N;;;;; +14F6;CANADIAN SYLLABICS SWE;Lo;0;L;;;;;N;;;;; +14F7;CANADIAN SYLLABICS WEST-CREE SWE;Lo;0;L;;;;;N;;;;; +14F8;CANADIAN SYLLABICS SWI;Lo;0;L;;;;;N;;;;; +14F9;CANADIAN SYLLABICS WEST-CREE SWI;Lo;0;L;;;;;N;;;;; +14FA;CANADIAN SYLLABICS SWII;Lo;0;L;;;;;N;;;;; +14FB;CANADIAN SYLLABICS WEST-CREE SWII;Lo;0;L;;;;;N;;;;; +14FC;CANADIAN SYLLABICS SWO;Lo;0;L;;;;;N;;;;; +14FD;CANADIAN SYLLABICS WEST-CREE SWO;Lo;0;L;;;;;N;;;;; +14FE;CANADIAN SYLLABICS SWOO;Lo;0;L;;;;;N;;;;; +14FF;CANADIAN SYLLABICS WEST-CREE SWOO;Lo;0;L;;;;;N;;;;; +1500;CANADIAN SYLLABICS SWA;Lo;0;L;;;;;N;;;;; +1501;CANADIAN SYLLABICS WEST-CREE SWA;Lo;0;L;;;;;N;;;;; +1502;CANADIAN SYLLABICS SWAA;Lo;0;L;;;;;N;;;;; +1503;CANADIAN SYLLABICS WEST-CREE SWAA;Lo;0;L;;;;;N;;;;; +1504;CANADIAN SYLLABICS NASKAPI SWAA;Lo;0;L;;;;;N;;;;; +1505;CANADIAN SYLLABICS S;Lo;0;L;;;;;N;;;;; +1506;CANADIAN SYLLABICS ATHAPASCAN S;Lo;0;L;;;;;N;;;;; +1507;CANADIAN SYLLABICS SW;Lo;0;L;;;;;N;;;;; +1508;CANADIAN SYLLABICS BLACKFOOT S;Lo;0;L;;;;;N;;;;; +1509;CANADIAN SYLLABICS MOOSE-CREE SK;Lo;0;L;;;;;N;;;;; +150A;CANADIAN SYLLABICS NASKAPI SKW;Lo;0;L;;;;;N;;;;; +150B;CANADIAN SYLLABICS NASKAPI S-W;Lo;0;L;;;;;N;;;;; +150C;CANADIAN SYLLABICS NASKAPI SPWA;Lo;0;L;;;;;N;;;;; +150D;CANADIAN SYLLABICS NASKAPI STWA;Lo;0;L;;;;;N;;;;; +150E;CANADIAN SYLLABICS NASKAPI SKWA;Lo;0;L;;;;;N;;;;; +150F;CANADIAN SYLLABICS NASKAPI SCWA;Lo;0;L;;;;;N;;;;; +1510;CANADIAN SYLLABICS SHE;Lo;0;L;;;;;N;;;;; +1511;CANADIAN SYLLABICS SHI;Lo;0;L;;;;;N;;;;; +1512;CANADIAN SYLLABICS SHII;Lo;0;L;;;;;N;;;;; +1513;CANADIAN SYLLABICS SHO;Lo;0;L;;;;;N;;;;; +1514;CANADIAN SYLLABICS SHOO;Lo;0;L;;;;;N;;;;; +1515;CANADIAN SYLLABICS SHA;Lo;0;L;;;;;N;;;;; +1516;CANADIAN SYLLABICS SHAA;Lo;0;L;;;;;N;;;;; +1517;CANADIAN SYLLABICS SHWE;Lo;0;L;;;;;N;;;;; +1518;CANADIAN SYLLABICS WEST-CREE SHWE;Lo;0;L;;;;;N;;;;; +1519;CANADIAN SYLLABICS SHWI;Lo;0;L;;;;;N;;;;; +151A;CANADIAN SYLLABICS WEST-CREE SHWI;Lo;0;L;;;;;N;;;;; +151B;CANADIAN SYLLABICS SHWII;Lo;0;L;;;;;N;;;;; +151C;CANADIAN SYLLABICS WEST-CREE SHWII;Lo;0;L;;;;;N;;;;; +151D;CANADIAN SYLLABICS SHWO;Lo;0;L;;;;;N;;;;; +151E;CANADIAN SYLLABICS WEST-CREE SHWO;Lo;0;L;;;;;N;;;;; +151F;CANADIAN SYLLABICS SHWOO;Lo;0;L;;;;;N;;;;; +1520;CANADIAN SYLLABICS WEST-CREE SHWOO;Lo;0;L;;;;;N;;;;; +1521;CANADIAN SYLLABICS SHWA;Lo;0;L;;;;;N;;;;; +1522;CANADIAN SYLLABICS WEST-CREE SHWA;Lo;0;L;;;;;N;;;;; +1523;CANADIAN SYLLABICS SHWAA;Lo;0;L;;;;;N;;;;; +1524;CANADIAN SYLLABICS WEST-CREE SHWAA;Lo;0;L;;;;;N;;;;; +1525;CANADIAN SYLLABICS SH;Lo;0;L;;;;;N;;;;; +1526;CANADIAN SYLLABICS YE;Lo;0;L;;;;;N;;;;; +1527;CANADIAN SYLLABICS YAAI;Lo;0;L;;;;;N;;;;; +1528;CANADIAN SYLLABICS YI;Lo;0;L;;;;;N;;;;; +1529;CANADIAN SYLLABICS YII;Lo;0;L;;;;;N;;;;; +152A;CANADIAN SYLLABICS YO;Lo;0;L;;;;;N;;;;; +152B;CANADIAN SYLLABICS YOO;Lo;0;L;;;;;N;;;;; +152C;CANADIAN SYLLABICS Y-CREE YOO;Lo;0;L;;;;;N;;;;; +152D;CANADIAN SYLLABICS YA;Lo;0;L;;;;;N;;;;; +152E;CANADIAN SYLLABICS YAA;Lo;0;L;;;;;N;;;;; +152F;CANADIAN SYLLABICS YWE;Lo;0;L;;;;;N;;;;; +1530;CANADIAN SYLLABICS WEST-CREE YWE;Lo;0;L;;;;;N;;;;; +1531;CANADIAN SYLLABICS YWI;Lo;0;L;;;;;N;;;;; +1532;CANADIAN SYLLABICS WEST-CREE YWI;Lo;0;L;;;;;N;;;;; +1533;CANADIAN SYLLABICS YWII;Lo;0;L;;;;;N;;;;; +1534;CANADIAN SYLLABICS WEST-CREE YWII;Lo;0;L;;;;;N;;;;; +1535;CANADIAN SYLLABICS YWO;Lo;0;L;;;;;N;;;;; +1536;CANADIAN SYLLABICS WEST-CREE YWO;Lo;0;L;;;;;N;;;;; +1537;CANADIAN SYLLABICS YWOO;Lo;0;L;;;;;N;;;;; +1538;CANADIAN SYLLABICS WEST-CREE YWOO;Lo;0;L;;;;;N;;;;; +1539;CANADIAN SYLLABICS YWA;Lo;0;L;;;;;N;;;;; +153A;CANADIAN SYLLABICS WEST-CREE YWA;Lo;0;L;;;;;N;;;;; +153B;CANADIAN SYLLABICS YWAA;Lo;0;L;;;;;N;;;;; +153C;CANADIAN SYLLABICS WEST-CREE YWAA;Lo;0;L;;;;;N;;;;; +153D;CANADIAN SYLLABICS NASKAPI YWAA;Lo;0;L;;;;;N;;;;; +153E;CANADIAN SYLLABICS Y;Lo;0;L;;;;;N;;;;; +153F;CANADIAN SYLLABICS BIBLE-CREE Y;Lo;0;L;;;;;N;;;;; +1540;CANADIAN SYLLABICS WEST-CREE Y;Lo;0;L;;;;;N;;;;; +1541;CANADIAN SYLLABICS SAYISI YI;Lo;0;L;;;;;N;;;;; +1542;CANADIAN SYLLABICS RE;Lo;0;L;;;;;N;;;;; +1543;CANADIAN SYLLABICS R-CREE RE;Lo;0;L;;;;;N;;;;; +1544;CANADIAN SYLLABICS WEST-CREE LE;Lo;0;L;;;;;N;;;;; +1545;CANADIAN SYLLABICS RAAI;Lo;0;L;;;;;N;;;;; +1546;CANADIAN SYLLABICS RI;Lo;0;L;;;;;N;;;;; +1547;CANADIAN SYLLABICS RII;Lo;0;L;;;;;N;;;;; +1548;CANADIAN SYLLABICS RO;Lo;0;L;;;;;N;;;;; +1549;CANADIAN SYLLABICS ROO;Lo;0;L;;;;;N;;;;; +154A;CANADIAN SYLLABICS WEST-CREE LO;Lo;0;L;;;;;N;;;;; +154B;CANADIAN SYLLABICS RA;Lo;0;L;;;;;N;;;;; +154C;CANADIAN SYLLABICS RAA;Lo;0;L;;;;;N;;;;; +154D;CANADIAN SYLLABICS WEST-CREE LA;Lo;0;L;;;;;N;;;;; +154E;CANADIAN SYLLABICS RWAA;Lo;0;L;;;;;N;;;;; +154F;CANADIAN SYLLABICS WEST-CREE RWAA;Lo;0;L;;;;;N;;;;; +1550;CANADIAN SYLLABICS R;Lo;0;L;;;;;N;;;;; +1551;CANADIAN SYLLABICS WEST-CREE R;Lo;0;L;;;;;N;;;;; +1552;CANADIAN SYLLABICS MEDIAL R;Lo;0;L;;;;;N;;;;; +1553;CANADIAN SYLLABICS FE;Lo;0;L;;;;;N;;;;; +1554;CANADIAN SYLLABICS FAAI;Lo;0;L;;;;;N;;;;; +1555;CANADIAN SYLLABICS FI;Lo;0;L;;;;;N;;;;; +1556;CANADIAN SYLLABICS FII;Lo;0;L;;;;;N;;;;; +1557;CANADIAN SYLLABICS FO;Lo;0;L;;;;;N;;;;; +1558;CANADIAN SYLLABICS FOO;Lo;0;L;;;;;N;;;;; +1559;CANADIAN SYLLABICS FA;Lo;0;L;;;;;N;;;;; +155A;CANADIAN SYLLABICS FAA;Lo;0;L;;;;;N;;;;; +155B;CANADIAN SYLLABICS FWAA;Lo;0;L;;;;;N;;;;; +155C;CANADIAN SYLLABICS WEST-CREE FWAA;Lo;0;L;;;;;N;;;;; +155D;CANADIAN SYLLABICS F;Lo;0;L;;;;;N;;;;; +155E;CANADIAN SYLLABICS THE;Lo;0;L;;;;;N;;;;; +155F;CANADIAN SYLLABICS N-CREE THE;Lo;0;L;;;;;N;;;;; +1560;CANADIAN SYLLABICS THI;Lo;0;L;;;;;N;;;;; +1561;CANADIAN SYLLABICS N-CREE THI;Lo;0;L;;;;;N;;;;; +1562;CANADIAN SYLLABICS THII;Lo;0;L;;;;;N;;;;; +1563;CANADIAN SYLLABICS N-CREE THII;Lo;0;L;;;;;N;;;;; +1564;CANADIAN SYLLABICS THO;Lo;0;L;;;;;N;;;;; +1565;CANADIAN SYLLABICS THOO;Lo;0;L;;;;;N;;;;; +1566;CANADIAN SYLLABICS THA;Lo;0;L;;;;;N;;;;; +1567;CANADIAN SYLLABICS THAA;Lo;0;L;;;;;N;;;;; +1568;CANADIAN SYLLABICS THWAA;Lo;0;L;;;;;N;;;;; +1569;CANADIAN SYLLABICS WEST-CREE THWAA;Lo;0;L;;;;;N;;;;; +156A;CANADIAN SYLLABICS TH;Lo;0;L;;;;;N;;;;; +156B;CANADIAN SYLLABICS TTHE;Lo;0;L;;;;;N;;;;; +156C;CANADIAN SYLLABICS TTHI;Lo;0;L;;;;;N;;;;; +156D;CANADIAN SYLLABICS TTHO;Lo;0;L;;;;;N;;;;; +156E;CANADIAN SYLLABICS TTHA;Lo;0;L;;;;;N;;;;; +156F;CANADIAN SYLLABICS TTH;Lo;0;L;;;;;N;;;;; +1570;CANADIAN SYLLABICS TYE;Lo;0;L;;;;;N;;;;; +1571;CANADIAN SYLLABICS TYI;Lo;0;L;;;;;N;;;;; +1572;CANADIAN SYLLABICS TYO;Lo;0;L;;;;;N;;;;; +1573;CANADIAN SYLLABICS TYA;Lo;0;L;;;;;N;;;;; +1574;CANADIAN SYLLABICS NUNAVIK HE;Lo;0;L;;;;;N;;;;; +1575;CANADIAN SYLLABICS NUNAVIK HI;Lo;0;L;;;;;N;;;;; +1576;CANADIAN SYLLABICS NUNAVIK HII;Lo;0;L;;;;;N;;;;; +1577;CANADIAN SYLLABICS NUNAVIK HO;Lo;0;L;;;;;N;;;;; +1578;CANADIAN SYLLABICS NUNAVIK HOO;Lo;0;L;;;;;N;;;;; +1579;CANADIAN SYLLABICS NUNAVIK HA;Lo;0;L;;;;;N;;;;; +157A;CANADIAN SYLLABICS NUNAVIK HAA;Lo;0;L;;;;;N;;;;; +157B;CANADIAN SYLLABICS NUNAVIK H;Lo;0;L;;;;;N;;;;; +157C;CANADIAN SYLLABICS NUNAVUT H;Lo;0;L;;;;;N;;;;; +157D;CANADIAN SYLLABICS HK;Lo;0;L;;;;;N;;;;; +157E;CANADIAN SYLLABICS QAAI;Lo;0;L;;;;;N;;;;; +157F;CANADIAN SYLLABICS QI;Lo;0;L;;;;;N;;;;; +1580;CANADIAN SYLLABICS QII;Lo;0;L;;;;;N;;;;; +1581;CANADIAN SYLLABICS QO;Lo;0;L;;;;;N;;;;; +1582;CANADIAN SYLLABICS QOO;Lo;0;L;;;;;N;;;;; +1583;CANADIAN SYLLABICS QA;Lo;0;L;;;;;N;;;;; +1584;CANADIAN SYLLABICS QAA;Lo;0;L;;;;;N;;;;; +1585;CANADIAN SYLLABICS Q;Lo;0;L;;;;;N;;;;; +1586;CANADIAN SYLLABICS TLHE;Lo;0;L;;;;;N;;;;; +1587;CANADIAN SYLLABICS TLHI;Lo;0;L;;;;;N;;;;; +1588;CANADIAN SYLLABICS TLHO;Lo;0;L;;;;;N;;;;; +1589;CANADIAN SYLLABICS TLHA;Lo;0;L;;;;;N;;;;; +158A;CANADIAN SYLLABICS WEST-CREE RE;Lo;0;L;;;;;N;;;;; +158B;CANADIAN SYLLABICS WEST-CREE RI;Lo;0;L;;;;;N;;;;; +158C;CANADIAN SYLLABICS WEST-CREE RO;Lo;0;L;;;;;N;;;;; +158D;CANADIAN SYLLABICS WEST-CREE RA;Lo;0;L;;;;;N;;;;; +158E;CANADIAN SYLLABICS NGAAI;Lo;0;L;;;;;N;;;;; +158F;CANADIAN SYLLABICS NGI;Lo;0;L;;;;;N;;;;; +1590;CANADIAN SYLLABICS NGII;Lo;0;L;;;;;N;;;;; +1591;CANADIAN SYLLABICS NGO;Lo;0;L;;;;;N;;;;; +1592;CANADIAN SYLLABICS NGOO;Lo;0;L;;;;;N;;;;; +1593;CANADIAN SYLLABICS NGA;Lo;0;L;;;;;N;;;;; +1594;CANADIAN SYLLABICS NGAA;Lo;0;L;;;;;N;;;;; +1595;CANADIAN SYLLABICS NG;Lo;0;L;;;;;N;;;;; +1596;CANADIAN SYLLABICS NNG;Lo;0;L;;;;;N;;;;; +1597;CANADIAN SYLLABICS SAYISI SHE;Lo;0;L;;;;;N;;;;; +1598;CANADIAN SYLLABICS SAYISI SHI;Lo;0;L;;;;;N;;;;; +1599;CANADIAN SYLLABICS SAYISI SHO;Lo;0;L;;;;;N;;;;; +159A;CANADIAN SYLLABICS SAYISI SHA;Lo;0;L;;;;;N;;;;; +159B;CANADIAN SYLLABICS WOODS-CREE THE;Lo;0;L;;;;;N;;;;; +159C;CANADIAN SYLLABICS WOODS-CREE THI;Lo;0;L;;;;;N;;;;; +159D;CANADIAN SYLLABICS WOODS-CREE THO;Lo;0;L;;;;;N;;;;; +159E;CANADIAN SYLLABICS WOODS-CREE THA;Lo;0;L;;;;;N;;;;; +159F;CANADIAN SYLLABICS WOODS-CREE TH;Lo;0;L;;;;;N;;;;; +15A0;CANADIAN SYLLABICS LHI;Lo;0;L;;;;;N;;;;; +15A1;CANADIAN SYLLABICS LHII;Lo;0;L;;;;;N;;;;; +15A2;CANADIAN SYLLABICS LHO;Lo;0;L;;;;;N;;;;; +15A3;CANADIAN SYLLABICS LHOO;Lo;0;L;;;;;N;;;;; +15A4;CANADIAN SYLLABICS LHA;Lo;0;L;;;;;N;;;;; +15A5;CANADIAN SYLLABICS LHAA;Lo;0;L;;;;;N;;;;; +15A6;CANADIAN SYLLABICS LH;Lo;0;L;;;;;N;;;;; +15A7;CANADIAN SYLLABICS TH-CREE THE;Lo;0;L;;;;;N;;;;; +15A8;CANADIAN SYLLABICS TH-CREE THI;Lo;0;L;;;;;N;;;;; +15A9;CANADIAN SYLLABICS TH-CREE THII;Lo;0;L;;;;;N;;;;; +15AA;CANADIAN SYLLABICS TH-CREE THO;Lo;0;L;;;;;N;;;;; +15AB;CANADIAN SYLLABICS TH-CREE THOO;Lo;0;L;;;;;N;;;;; +15AC;CANADIAN SYLLABICS TH-CREE THA;Lo;0;L;;;;;N;;;;; +15AD;CANADIAN SYLLABICS TH-CREE THAA;Lo;0;L;;;;;N;;;;; +15AE;CANADIAN SYLLABICS TH-CREE TH;Lo;0;L;;;;;N;;;;; +15AF;CANADIAN SYLLABICS AIVILIK B;Lo;0;L;;;;;N;;;;; +15B0;CANADIAN SYLLABICS BLACKFOOT E;Lo;0;L;;;;;N;;;;; +15B1;CANADIAN SYLLABICS BLACKFOOT I;Lo;0;L;;;;;N;;;;; +15B2;CANADIAN SYLLABICS BLACKFOOT O;Lo;0;L;;;;;N;;;;; +15B3;CANADIAN SYLLABICS BLACKFOOT A;Lo;0;L;;;;;N;;;;; +15B4;CANADIAN SYLLABICS BLACKFOOT WE;Lo;0;L;;;;;N;;;;; +15B5;CANADIAN SYLLABICS BLACKFOOT WI;Lo;0;L;;;;;N;;;;; +15B6;CANADIAN SYLLABICS BLACKFOOT WO;Lo;0;L;;;;;N;;;;; +15B7;CANADIAN SYLLABICS BLACKFOOT WA;Lo;0;L;;;;;N;;;;; +15B8;CANADIAN SYLLABICS BLACKFOOT NE;Lo;0;L;;;;;N;;;;; +15B9;CANADIAN SYLLABICS BLACKFOOT NI;Lo;0;L;;;;;N;;;;; +15BA;CANADIAN SYLLABICS BLACKFOOT NO;Lo;0;L;;;;;N;;;;; +15BB;CANADIAN SYLLABICS BLACKFOOT NA;Lo;0;L;;;;;N;;;;; +15BC;CANADIAN SYLLABICS BLACKFOOT KE;Lo;0;L;;;;;N;;;;; +15BD;CANADIAN SYLLABICS BLACKFOOT KI;Lo;0;L;;;;;N;;;;; +15BE;CANADIAN SYLLABICS BLACKFOOT KO;Lo;0;L;;;;;N;;;;; +15BF;CANADIAN SYLLABICS BLACKFOOT KA;Lo;0;L;;;;;N;;;;; +15C0;CANADIAN SYLLABICS SAYISI HE;Lo;0;L;;;;;N;;;;; +15C1;CANADIAN SYLLABICS SAYISI HI;Lo;0;L;;;;;N;;;;; +15C2;CANADIAN SYLLABICS SAYISI HO;Lo;0;L;;;;;N;;;;; +15C3;CANADIAN SYLLABICS SAYISI HA;Lo;0;L;;;;;N;;;;; +15C4;CANADIAN SYLLABICS CARRIER GHU;Lo;0;L;;;;;N;;;;; +15C5;CANADIAN SYLLABICS CARRIER GHO;Lo;0;L;;;;;N;;;;; +15C6;CANADIAN SYLLABICS CARRIER GHE;Lo;0;L;;;;;N;;;;; +15C7;CANADIAN SYLLABICS CARRIER GHEE;Lo;0;L;;;;;N;;;;; +15C8;CANADIAN SYLLABICS CARRIER GHI;Lo;0;L;;;;;N;;;;; +15C9;CANADIAN SYLLABICS CARRIER GHA;Lo;0;L;;;;;N;;;;; +15CA;CANADIAN SYLLABICS CARRIER RU;Lo;0;L;;;;;N;;;;; +15CB;CANADIAN SYLLABICS CARRIER RO;Lo;0;L;;;;;N;;;;; +15CC;CANADIAN SYLLABICS CARRIER RE;Lo;0;L;;;;;N;;;;; +15CD;CANADIAN SYLLABICS CARRIER REE;Lo;0;L;;;;;N;;;;; +15CE;CANADIAN SYLLABICS CARRIER RI;Lo;0;L;;;;;N;;;;; +15CF;CANADIAN SYLLABICS CARRIER RA;Lo;0;L;;;;;N;;;;; +15D0;CANADIAN SYLLABICS CARRIER WU;Lo;0;L;;;;;N;;;;; +15D1;CANADIAN SYLLABICS CARRIER WO;Lo;0;L;;;;;N;;;;; +15D2;CANADIAN SYLLABICS CARRIER WE;Lo;0;L;;;;;N;;;;; +15D3;CANADIAN SYLLABICS CARRIER WEE;Lo;0;L;;;;;N;;;;; +15D4;CANADIAN SYLLABICS CARRIER WI;Lo;0;L;;;;;N;;;;; +15D5;CANADIAN SYLLABICS CARRIER WA;Lo;0;L;;;;;N;;;;; +15D6;CANADIAN SYLLABICS CARRIER HWU;Lo;0;L;;;;;N;;;;; +15D7;CANADIAN SYLLABICS CARRIER HWO;Lo;0;L;;;;;N;;;;; +15D8;CANADIAN SYLLABICS CARRIER HWE;Lo;0;L;;;;;N;;;;; +15D9;CANADIAN SYLLABICS CARRIER HWEE;Lo;0;L;;;;;N;;;;; +15DA;CANADIAN SYLLABICS CARRIER HWI;Lo;0;L;;;;;N;;;;; +15DB;CANADIAN SYLLABICS CARRIER HWA;Lo;0;L;;;;;N;;;;; +15DC;CANADIAN SYLLABICS CARRIER THU;Lo;0;L;;;;;N;;;;; +15DD;CANADIAN SYLLABICS CARRIER THO;Lo;0;L;;;;;N;;;;; +15DE;CANADIAN SYLLABICS CARRIER THE;Lo;0;L;;;;;N;;;;; +15DF;CANADIAN SYLLABICS CARRIER THEE;Lo;0;L;;;;;N;;;;; +15E0;CANADIAN SYLLABICS CARRIER THI;Lo;0;L;;;;;N;;;;; +15E1;CANADIAN SYLLABICS CARRIER THA;Lo;0;L;;;;;N;;;;; +15E2;CANADIAN SYLLABICS CARRIER TTU;Lo;0;L;;;;;N;;;;; +15E3;CANADIAN SYLLABICS CARRIER TTO;Lo;0;L;;;;;N;;;;; +15E4;CANADIAN SYLLABICS CARRIER TTE;Lo;0;L;;;;;N;;;;; +15E5;CANADIAN SYLLABICS CARRIER TTEE;Lo;0;L;;;;;N;;;;; +15E6;CANADIAN SYLLABICS CARRIER TTI;Lo;0;L;;;;;N;;;;; +15E7;CANADIAN SYLLABICS CARRIER TTA;Lo;0;L;;;;;N;;;;; +15E8;CANADIAN SYLLABICS CARRIER PU;Lo;0;L;;;;;N;;;;; +15E9;CANADIAN SYLLABICS CARRIER PO;Lo;0;L;;;;;N;;;;; +15EA;CANADIAN SYLLABICS CARRIER PE;Lo;0;L;;;;;N;;;;; +15EB;CANADIAN SYLLABICS CARRIER PEE;Lo;0;L;;;;;N;;;;; +15EC;CANADIAN SYLLABICS CARRIER PI;Lo;0;L;;;;;N;;;;; +15ED;CANADIAN SYLLABICS CARRIER PA;Lo;0;L;;;;;N;;;;; +15EE;CANADIAN SYLLABICS CARRIER P;Lo;0;L;;;;;N;;;;; +15EF;CANADIAN SYLLABICS CARRIER GU;Lo;0;L;;;;;N;;;;; +15F0;CANADIAN SYLLABICS CARRIER GO;Lo;0;L;;;;;N;;;;; +15F1;CANADIAN SYLLABICS CARRIER GE;Lo;0;L;;;;;N;;;;; +15F2;CANADIAN SYLLABICS CARRIER GEE;Lo;0;L;;;;;N;;;;; +15F3;CANADIAN SYLLABICS CARRIER GI;Lo;0;L;;;;;N;;;;; +15F4;CANADIAN SYLLABICS CARRIER GA;Lo;0;L;;;;;N;;;;; +15F5;CANADIAN SYLLABICS CARRIER KHU;Lo;0;L;;;;;N;;;;; +15F6;CANADIAN SYLLABICS CARRIER KHO;Lo;0;L;;;;;N;;;;; +15F7;CANADIAN SYLLABICS CARRIER KHE;Lo;0;L;;;;;N;;;;; +15F8;CANADIAN SYLLABICS CARRIER KHEE;Lo;0;L;;;;;N;;;;; +15F9;CANADIAN SYLLABICS CARRIER KHI;Lo;0;L;;;;;N;;;;; +15FA;CANADIAN SYLLABICS CARRIER KHA;Lo;0;L;;;;;N;;;;; +15FB;CANADIAN SYLLABICS CARRIER KKU;Lo;0;L;;;;;N;;;;; +15FC;CANADIAN SYLLABICS CARRIER KKO;Lo;0;L;;;;;N;;;;; +15FD;CANADIAN SYLLABICS CARRIER KKE;Lo;0;L;;;;;N;;;;; +15FE;CANADIAN SYLLABICS CARRIER KKEE;Lo;0;L;;;;;N;;;;; +15FF;CANADIAN SYLLABICS CARRIER KKI;Lo;0;L;;;;;N;;;;; +1600;CANADIAN SYLLABICS CARRIER KKA;Lo;0;L;;;;;N;;;;; +1601;CANADIAN SYLLABICS CARRIER KK;Lo;0;L;;;;;N;;;;; +1602;CANADIAN SYLLABICS CARRIER NU;Lo;0;L;;;;;N;;;;; +1603;CANADIAN SYLLABICS CARRIER NO;Lo;0;L;;;;;N;;;;; +1604;CANADIAN SYLLABICS CARRIER NE;Lo;0;L;;;;;N;;;;; +1605;CANADIAN SYLLABICS CARRIER NEE;Lo;0;L;;;;;N;;;;; +1606;CANADIAN SYLLABICS CARRIER NI;Lo;0;L;;;;;N;;;;; +1607;CANADIAN SYLLABICS CARRIER NA;Lo;0;L;;;;;N;;;;; +1608;CANADIAN SYLLABICS CARRIER MU;Lo;0;L;;;;;N;;;;; +1609;CANADIAN SYLLABICS CARRIER MO;Lo;0;L;;;;;N;;;;; +160A;CANADIAN SYLLABICS CARRIER ME;Lo;0;L;;;;;N;;;;; +160B;CANADIAN SYLLABICS CARRIER MEE;Lo;0;L;;;;;N;;;;; +160C;CANADIAN SYLLABICS CARRIER MI;Lo;0;L;;;;;N;;;;; +160D;CANADIAN SYLLABICS CARRIER MA;Lo;0;L;;;;;N;;;;; +160E;CANADIAN SYLLABICS CARRIER YU;Lo;0;L;;;;;N;;;;; +160F;CANADIAN SYLLABICS CARRIER YO;Lo;0;L;;;;;N;;;;; +1610;CANADIAN SYLLABICS CARRIER YE;Lo;0;L;;;;;N;;;;; +1611;CANADIAN SYLLABICS CARRIER YEE;Lo;0;L;;;;;N;;;;; +1612;CANADIAN SYLLABICS CARRIER YI;Lo;0;L;;;;;N;;;;; +1613;CANADIAN SYLLABICS CARRIER YA;Lo;0;L;;;;;N;;;;; +1614;CANADIAN SYLLABICS CARRIER JU;Lo;0;L;;;;;N;;;;; +1615;CANADIAN SYLLABICS SAYISI JU;Lo;0;L;;;;;N;;;;; +1616;CANADIAN SYLLABICS CARRIER JO;Lo;0;L;;;;;N;;;;; +1617;CANADIAN SYLLABICS CARRIER JE;Lo;0;L;;;;;N;;;;; +1618;CANADIAN SYLLABICS CARRIER JEE;Lo;0;L;;;;;N;;;;; +1619;CANADIAN SYLLABICS CARRIER JI;Lo;0;L;;;;;N;;;;; +161A;CANADIAN SYLLABICS SAYISI JI;Lo;0;L;;;;;N;;;;; +161B;CANADIAN SYLLABICS CARRIER JA;Lo;0;L;;;;;N;;;;; +161C;CANADIAN SYLLABICS CARRIER JJU;Lo;0;L;;;;;N;;;;; +161D;CANADIAN SYLLABICS CARRIER JJO;Lo;0;L;;;;;N;;;;; +161E;CANADIAN SYLLABICS CARRIER JJE;Lo;0;L;;;;;N;;;;; +161F;CANADIAN SYLLABICS CARRIER JJEE;Lo;0;L;;;;;N;;;;; +1620;CANADIAN SYLLABICS CARRIER JJI;Lo;0;L;;;;;N;;;;; +1621;CANADIAN SYLLABICS CARRIER JJA;Lo;0;L;;;;;N;;;;; +1622;CANADIAN SYLLABICS CARRIER LU;Lo;0;L;;;;;N;;;;; +1623;CANADIAN SYLLABICS CARRIER LO;Lo;0;L;;;;;N;;;;; +1624;CANADIAN SYLLABICS CARRIER LE;Lo;0;L;;;;;N;;;;; +1625;CANADIAN SYLLABICS CARRIER LEE;Lo;0;L;;;;;N;;;;; +1626;CANADIAN SYLLABICS CARRIER LI;Lo;0;L;;;;;N;;;;; +1627;CANADIAN SYLLABICS CARRIER LA;Lo;0;L;;;;;N;;;;; +1628;CANADIAN SYLLABICS CARRIER DLU;Lo;0;L;;;;;N;;;;; +1629;CANADIAN SYLLABICS CARRIER DLO;Lo;0;L;;;;;N;;;;; +162A;CANADIAN SYLLABICS CARRIER DLE;Lo;0;L;;;;;N;;;;; +162B;CANADIAN SYLLABICS CARRIER DLEE;Lo;0;L;;;;;N;;;;; +162C;CANADIAN SYLLABICS CARRIER DLI;Lo;0;L;;;;;N;;;;; +162D;CANADIAN SYLLABICS CARRIER DLA;Lo;0;L;;;;;N;;;;; +162E;CANADIAN SYLLABICS CARRIER LHU;Lo;0;L;;;;;N;;;;; +162F;CANADIAN SYLLABICS CARRIER LHO;Lo;0;L;;;;;N;;;;; +1630;CANADIAN SYLLABICS CARRIER LHE;Lo;0;L;;;;;N;;;;; +1631;CANADIAN SYLLABICS CARRIER LHEE;Lo;0;L;;;;;N;;;;; +1632;CANADIAN SYLLABICS CARRIER LHI;Lo;0;L;;;;;N;;;;; +1633;CANADIAN SYLLABICS CARRIER LHA;Lo;0;L;;;;;N;;;;; +1634;CANADIAN SYLLABICS CARRIER TLHU;Lo;0;L;;;;;N;;;;; +1635;CANADIAN SYLLABICS CARRIER TLHO;Lo;0;L;;;;;N;;;;; +1636;CANADIAN SYLLABICS CARRIER TLHE;Lo;0;L;;;;;N;;;;; +1637;CANADIAN SYLLABICS CARRIER TLHEE;Lo;0;L;;;;;N;;;;; +1638;CANADIAN SYLLABICS CARRIER TLHI;Lo;0;L;;;;;N;;;;; +1639;CANADIAN SYLLABICS CARRIER TLHA;Lo;0;L;;;;;N;;;;; +163A;CANADIAN SYLLABICS CARRIER TLU;Lo;0;L;;;;;N;;;;; +163B;CANADIAN SYLLABICS CARRIER TLO;Lo;0;L;;;;;N;;;;; +163C;CANADIAN SYLLABICS CARRIER TLE;Lo;0;L;;;;;N;;;;; +163D;CANADIAN SYLLABICS CARRIER TLEE;Lo;0;L;;;;;N;;;;; +163E;CANADIAN SYLLABICS CARRIER TLI;Lo;0;L;;;;;N;;;;; +163F;CANADIAN SYLLABICS CARRIER TLA;Lo;0;L;;;;;N;;;;; +1640;CANADIAN SYLLABICS CARRIER ZU;Lo;0;L;;;;;N;;;;; +1641;CANADIAN SYLLABICS CARRIER ZO;Lo;0;L;;;;;N;;;;; +1642;CANADIAN SYLLABICS CARRIER ZE;Lo;0;L;;;;;N;;;;; +1643;CANADIAN SYLLABICS CARRIER ZEE;Lo;0;L;;;;;N;;;;; +1644;CANADIAN SYLLABICS CARRIER ZI;Lo;0;L;;;;;N;;;;; +1645;CANADIAN SYLLABICS CARRIER ZA;Lo;0;L;;;;;N;;;;; +1646;CANADIAN SYLLABICS CARRIER Z;Lo;0;L;;;;;N;;;;; +1647;CANADIAN SYLLABICS CARRIER INITIAL Z;Lo;0;L;;;;;N;;;;; +1648;CANADIAN SYLLABICS CARRIER DZU;Lo;0;L;;;;;N;;;;; +1649;CANADIAN SYLLABICS CARRIER DZO;Lo;0;L;;;;;N;;;;; +164A;CANADIAN SYLLABICS CARRIER DZE;Lo;0;L;;;;;N;;;;; +164B;CANADIAN SYLLABICS CARRIER DZEE;Lo;0;L;;;;;N;;;;; +164C;CANADIAN SYLLABICS CARRIER DZI;Lo;0;L;;;;;N;;;;; +164D;CANADIAN SYLLABICS CARRIER DZA;Lo;0;L;;;;;N;;;;; +164E;CANADIAN SYLLABICS CARRIER SU;Lo;0;L;;;;;N;;;;; +164F;CANADIAN SYLLABICS CARRIER SO;Lo;0;L;;;;;N;;;;; +1650;CANADIAN SYLLABICS CARRIER SE;Lo;0;L;;;;;N;;;;; +1651;CANADIAN SYLLABICS CARRIER SEE;Lo;0;L;;;;;N;;;;; +1652;CANADIAN SYLLABICS CARRIER SI;Lo;0;L;;;;;N;;;;; +1653;CANADIAN SYLLABICS CARRIER SA;Lo;0;L;;;;;N;;;;; +1654;CANADIAN SYLLABICS CARRIER SHU;Lo;0;L;;;;;N;;;;; +1655;CANADIAN SYLLABICS CARRIER SHO;Lo;0;L;;;;;N;;;;; +1656;CANADIAN SYLLABICS CARRIER SHE;Lo;0;L;;;;;N;;;;; +1657;CANADIAN SYLLABICS CARRIER SHEE;Lo;0;L;;;;;N;;;;; +1658;CANADIAN SYLLABICS CARRIER SHI;Lo;0;L;;;;;N;;;;; +1659;CANADIAN SYLLABICS CARRIER SHA;Lo;0;L;;;;;N;;;;; +165A;CANADIAN SYLLABICS CARRIER SH;Lo;0;L;;;;;N;;;;; +165B;CANADIAN SYLLABICS CARRIER TSU;Lo;0;L;;;;;N;;;;; +165C;CANADIAN SYLLABICS CARRIER TSO;Lo;0;L;;;;;N;;;;; +165D;CANADIAN SYLLABICS CARRIER TSE;Lo;0;L;;;;;N;;;;; +165E;CANADIAN SYLLABICS CARRIER TSEE;Lo;0;L;;;;;N;;;;; +165F;CANADIAN SYLLABICS CARRIER TSI;Lo;0;L;;;;;N;;;;; +1660;CANADIAN SYLLABICS CARRIER TSA;Lo;0;L;;;;;N;;;;; +1661;CANADIAN SYLLABICS CARRIER CHU;Lo;0;L;;;;;N;;;;; +1662;CANADIAN SYLLABICS CARRIER CHO;Lo;0;L;;;;;N;;;;; +1663;CANADIAN SYLLABICS CARRIER CHE;Lo;0;L;;;;;N;;;;; +1664;CANADIAN SYLLABICS CARRIER CHEE;Lo;0;L;;;;;N;;;;; +1665;CANADIAN SYLLABICS CARRIER CHI;Lo;0;L;;;;;N;;;;; +1666;CANADIAN SYLLABICS CARRIER CHA;Lo;0;L;;;;;N;;;;; +1667;CANADIAN SYLLABICS CARRIER TTSU;Lo;0;L;;;;;N;;;;; +1668;CANADIAN SYLLABICS CARRIER TTSO;Lo;0;L;;;;;N;;;;; +1669;CANADIAN SYLLABICS CARRIER TTSE;Lo;0;L;;;;;N;;;;; +166A;CANADIAN SYLLABICS CARRIER TTSEE;Lo;0;L;;;;;N;;;;; +166B;CANADIAN SYLLABICS CARRIER TTSI;Lo;0;L;;;;;N;;;;; +166C;CANADIAN SYLLABICS CARRIER TTSA;Lo;0;L;;;;;N;;;;; +166D;CANADIAN SYLLABICS CHI SIGN;Po;0;L;;;;;N;;;;; +166E;CANADIAN SYLLABICS FULL STOP;Po;0;L;;;;;N;;;;; +166F;CANADIAN SYLLABICS QAI;Lo;0;L;;;;;N;;;;; +1670;CANADIAN SYLLABICS NGAI;Lo;0;L;;;;;N;;;;; +1671;CANADIAN SYLLABICS NNGI;Lo;0;L;;;;;N;;;;; +1672;CANADIAN SYLLABICS NNGII;Lo;0;L;;;;;N;;;;; +1673;CANADIAN SYLLABICS NNGO;Lo;0;L;;;;;N;;;;; +1674;CANADIAN SYLLABICS NNGOO;Lo;0;L;;;;;N;;;;; +1675;CANADIAN SYLLABICS NNGA;Lo;0;L;;;;;N;;;;; +1676;CANADIAN SYLLABICS NNGAA;Lo;0;L;;;;;N;;;;; +1677;CANADIAN SYLLABICS WOODS-CREE THWEE;Lo;0;L;;;;;N;;;;; +1678;CANADIAN SYLLABICS WOODS-CREE THWI;Lo;0;L;;;;;N;;;;; +1679;CANADIAN SYLLABICS WOODS-CREE THWII;Lo;0;L;;;;;N;;;;; +167A;CANADIAN SYLLABICS WOODS-CREE THWO;Lo;0;L;;;;;N;;;;; +167B;CANADIAN SYLLABICS WOODS-CREE THWOO;Lo;0;L;;;;;N;;;;; +167C;CANADIAN SYLLABICS WOODS-CREE THWA;Lo;0;L;;;;;N;;;;; +167D;CANADIAN SYLLABICS WOODS-CREE THWAA;Lo;0;L;;;;;N;;;;; +167E;CANADIAN SYLLABICS WOODS-CREE FINAL TH;Lo;0;L;;;;;N;;;;; +167F;CANADIAN SYLLABICS BLACKFOOT W;Lo;0;L;;;;;N;;;;; +1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;; +1681;OGHAM LETTER BEITH;Lo;0;L;;;;;N;;;;; +1682;OGHAM LETTER LUIS;Lo;0;L;;;;;N;;;;; +1683;OGHAM LETTER FEARN;Lo;0;L;;;;;N;;;;; +1684;OGHAM LETTER SAIL;Lo;0;L;;;;;N;;;;; +1685;OGHAM LETTER NION;Lo;0;L;;;;;N;;;;; +1686;OGHAM LETTER UATH;Lo;0;L;;;;;N;;;;; +1687;OGHAM LETTER DAIR;Lo;0;L;;;;;N;;;;; +1688;OGHAM LETTER TINNE;Lo;0;L;;;;;N;;;;; +1689;OGHAM LETTER COLL;Lo;0;L;;;;;N;;;;; +168A;OGHAM LETTER CEIRT;Lo;0;L;;;;;N;;;;; +168B;OGHAM LETTER MUIN;Lo;0;L;;;;;N;;;;; +168C;OGHAM LETTER GORT;Lo;0;L;;;;;N;;;;; +168D;OGHAM LETTER NGEADAL;Lo;0;L;;;;;N;;;;; +168E;OGHAM LETTER STRAIF;Lo;0;L;;;;;N;;;;; +168F;OGHAM LETTER RUIS;Lo;0;L;;;;;N;;;;; +1690;OGHAM LETTER AILM;Lo;0;L;;;;;N;;;;; +1691;OGHAM LETTER ONN;Lo;0;L;;;;;N;;;;; +1692;OGHAM LETTER UR;Lo;0;L;;;;;N;;;;; +1693;OGHAM LETTER EADHADH;Lo;0;L;;;;;N;;;;; +1694;OGHAM LETTER IODHADH;Lo;0;L;;;;;N;;;;; +1695;OGHAM LETTER EABHADH;Lo;0;L;;;;;N;;;;; +1696;OGHAM LETTER OR;Lo;0;L;;;;;N;;;;; +1697;OGHAM LETTER UILLEANN;Lo;0;L;;;;;N;;;;; +1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;; +1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;; +169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;; +169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;Y;;;;; +169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;Y;;;;; +16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;; +16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;; +16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;; +16A3;RUNIC LETTER YR;Lo;0;L;;;;;N;;;;; +16A4;RUNIC LETTER Y;Lo;0;L;;;;;N;;;;; +16A5;RUNIC LETTER W;Lo;0;L;;;;;N;;;;; +16A6;RUNIC LETTER THURISAZ THURS THORN;Lo;0;L;;;;;N;;;;; +16A7;RUNIC LETTER ETH;Lo;0;L;;;;;N;;;;; +16A8;RUNIC LETTER ANSUZ A;Lo;0;L;;;;;N;;;;; +16A9;RUNIC LETTER OS O;Lo;0;L;;;;;N;;;;; +16AA;RUNIC LETTER AC A;Lo;0;L;;;;;N;;;;; +16AB;RUNIC LETTER AESC;Lo;0;L;;;;;N;;;;; +16AC;RUNIC LETTER LONG-BRANCH-OSS O;Lo;0;L;;;;;N;;;;; +16AD;RUNIC LETTER SHORT-TWIG-OSS O;Lo;0;L;;;;;N;;;;; +16AE;RUNIC LETTER O;Lo;0;L;;;;;N;;;;; +16AF;RUNIC LETTER OE;Lo;0;L;;;;;N;;;;; +16B0;RUNIC LETTER ON;Lo;0;L;;;;;N;;;;; +16B1;RUNIC LETTER RAIDO RAD REID R;Lo;0;L;;;;;N;;;;; +16B2;RUNIC LETTER KAUNA;Lo;0;L;;;;;N;;;;; +16B3;RUNIC LETTER CEN;Lo;0;L;;;;;N;;;;; +16B4;RUNIC LETTER KAUN K;Lo;0;L;;;;;N;;;;; +16B5;RUNIC LETTER G;Lo;0;L;;;;;N;;;;; +16B6;RUNIC LETTER ENG;Lo;0;L;;;;;N;;;;; +16B7;RUNIC LETTER GEBO GYFU G;Lo;0;L;;;;;N;;;;; +16B8;RUNIC LETTER GAR;Lo;0;L;;;;;N;;;;; +16B9;RUNIC LETTER WUNJO WYNN W;Lo;0;L;;;;;N;;;;; +16BA;RUNIC LETTER HAGLAZ H;Lo;0;L;;;;;N;;;;; +16BB;RUNIC LETTER HAEGL H;Lo;0;L;;;;;N;;;;; +16BC;RUNIC LETTER LONG-BRANCH-HAGALL H;Lo;0;L;;;;;N;;;;; +16BD;RUNIC LETTER SHORT-TWIG-HAGALL H;Lo;0;L;;;;;N;;;;; +16BE;RUNIC LETTER NAUDIZ NYD NAUD N;Lo;0;L;;;;;N;;;;; +16BF;RUNIC LETTER SHORT-TWIG-NAUD N;Lo;0;L;;;;;N;;;;; +16C0;RUNIC LETTER DOTTED-N;Lo;0;L;;;;;N;;;;; +16C1;RUNIC LETTER ISAZ IS ISS I;Lo;0;L;;;;;N;;;;; +16C2;RUNIC LETTER E;Lo;0;L;;;;;N;;;;; +16C3;RUNIC LETTER JERAN J;Lo;0;L;;;;;N;;;;; +16C4;RUNIC LETTER GER;Lo;0;L;;;;;N;;;;; +16C5;RUNIC LETTER LONG-BRANCH-AR AE;Lo;0;L;;;;;N;;;;; +16C6;RUNIC LETTER SHORT-TWIG-AR A;Lo;0;L;;;;;N;;;;; +16C7;RUNIC LETTER IWAZ EOH;Lo;0;L;;;;;N;;;;; +16C8;RUNIC LETTER PERTHO PEORTH P;Lo;0;L;;;;;N;;;;; +16C9;RUNIC LETTER ALGIZ EOLHX;Lo;0;L;;;;;N;;;;; +16CA;RUNIC LETTER SOWILO S;Lo;0;L;;;;;N;;;;; +16CB;RUNIC LETTER SIGEL LONG-BRANCH-SOL S;Lo;0;L;;;;;N;;;;; +16CC;RUNIC LETTER SHORT-TWIG-SOL S;Lo;0;L;;;;;N;;;;; +16CD;RUNIC LETTER C;Lo;0;L;;;;;N;;;;; +16CE;RUNIC LETTER Z;Lo;0;L;;;;;N;;;;; +16CF;RUNIC LETTER TIWAZ TIR TYR T;Lo;0;L;;;;;N;;;;; +16D0;RUNIC LETTER SHORT-TWIG-TYR T;Lo;0;L;;;;;N;;;;; +16D1;RUNIC LETTER D;Lo;0;L;;;;;N;;;;; +16D2;RUNIC LETTER BERKANAN BEORC BJARKAN B;Lo;0;L;;;;;N;;;;; +16D3;RUNIC LETTER SHORT-TWIG-BJARKAN B;Lo;0;L;;;;;N;;;;; +16D4;RUNIC LETTER DOTTED-P;Lo;0;L;;;;;N;;;;; +16D5;RUNIC LETTER OPEN-P;Lo;0;L;;;;;N;;;;; +16D6;RUNIC LETTER EHWAZ EH E;Lo;0;L;;;;;N;;;;; +16D7;RUNIC LETTER MANNAZ MAN M;Lo;0;L;;;;;N;;;;; +16D8;RUNIC LETTER LONG-BRANCH-MADR M;Lo;0;L;;;;;N;;;;; +16D9;RUNIC LETTER SHORT-TWIG-MADR M;Lo;0;L;;;;;N;;;;; +16DA;RUNIC LETTER LAUKAZ LAGU LOGR L;Lo;0;L;;;;;N;;;;; +16DB;RUNIC LETTER DOTTED-L;Lo;0;L;;;;;N;;;;; +16DC;RUNIC LETTER INGWAZ;Lo;0;L;;;;;N;;;;; +16DD;RUNIC LETTER ING;Lo;0;L;;;;;N;;;;; +16DE;RUNIC LETTER DAGAZ DAEG D;Lo;0;L;;;;;N;;;;; +16DF;RUNIC LETTER OTHALAN ETHEL O;Lo;0;L;;;;;N;;;;; +16E0;RUNIC LETTER EAR;Lo;0;L;;;;;N;;;;; +16E1;RUNIC LETTER IOR;Lo;0;L;;;;;N;;;;; +16E2;RUNIC LETTER CWEORTH;Lo;0;L;;;;;N;;;;; +16E3;RUNIC LETTER CALC;Lo;0;L;;;;;N;;;;; +16E4;RUNIC LETTER CEALC;Lo;0;L;;;;;N;;;;; +16E5;RUNIC LETTER STAN;Lo;0;L;;;;;N;;;;; +16E6;RUNIC LETTER LONG-BRANCH-YR;Lo;0;L;;;;;N;;;;; +16E7;RUNIC LETTER SHORT-TWIG-YR;Lo;0;L;;;;;N;;;;; +16E8;RUNIC LETTER ICELANDIC-YR;Lo;0;L;;;;;N;;;;; +16E9;RUNIC LETTER Q;Lo;0;L;;;;;N;;;;; +16EA;RUNIC LETTER X;Lo;0;L;;;;;N;;;;; +16EB;RUNIC SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; +16EC;RUNIC MULTIPLE PUNCTUATION;Po;0;L;;;;;N;;;;; +16ED;RUNIC CROSS PUNCTUATION;Po;0;L;;;;;N;;;;; +16EE;RUNIC ARLAUG SYMBOL;Nl;0;L;;;;17;N;;;;; +16EF;RUNIC TVIMADUR SYMBOL;Nl;0;L;;;;18;N;;;;; +16F0;RUNIC BELGTHOR SYMBOL;Nl;0;L;;;;19;N;;;;; +1700;TAGALOG LETTER A;Lo;0;L;;;;;N;;;;; +1701;TAGALOG LETTER I;Lo;0;L;;;;;N;;;;; +1702;TAGALOG LETTER U;Lo;0;L;;;;;N;;;;; +1703;TAGALOG LETTER KA;Lo;0;L;;;;;N;;;;; +1704;TAGALOG LETTER GA;Lo;0;L;;;;;N;;;;; +1705;TAGALOG LETTER NGA;Lo;0;L;;;;;N;;;;; +1706;TAGALOG LETTER TA;Lo;0;L;;;;;N;;;;; +1707;TAGALOG LETTER DA;Lo;0;L;;;;;N;;;;; +1708;TAGALOG LETTER NA;Lo;0;L;;;;;N;;;;; +1709;TAGALOG LETTER PA;Lo;0;L;;;;;N;;;;; +170A;TAGALOG LETTER BA;Lo;0;L;;;;;N;;;;; +170B;TAGALOG LETTER MA;Lo;0;L;;;;;N;;;;; +170C;TAGALOG LETTER YA;Lo;0;L;;;;;N;;;;; +170E;TAGALOG LETTER LA;Lo;0;L;;;;;N;;;;; +170F;TAGALOG LETTER WA;Lo;0;L;;;;;N;;;;; +1710;TAGALOG LETTER SA;Lo;0;L;;;;;N;;;;; +1711;TAGALOG LETTER HA;Lo;0;L;;;;;N;;;;; +1712;TAGALOG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1713;TAGALOG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1714;TAGALOG SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +1720;HANUNOO LETTER A;Lo;0;L;;;;;N;;;;; +1721;HANUNOO LETTER I;Lo;0;L;;;;;N;;;;; +1722;HANUNOO LETTER U;Lo;0;L;;;;;N;;;;; +1723;HANUNOO LETTER KA;Lo;0;L;;;;;N;;;;; +1724;HANUNOO LETTER GA;Lo;0;L;;;;;N;;;;; +1725;HANUNOO LETTER NGA;Lo;0;L;;;;;N;;;;; +1726;HANUNOO LETTER TA;Lo;0;L;;;;;N;;;;; +1727;HANUNOO LETTER DA;Lo;0;L;;;;;N;;;;; +1728;HANUNOO LETTER NA;Lo;0;L;;;;;N;;;;; +1729;HANUNOO LETTER PA;Lo;0;L;;;;;N;;;;; +172A;HANUNOO LETTER BA;Lo;0;L;;;;;N;;;;; +172B;HANUNOO LETTER MA;Lo;0;L;;;;;N;;;;; +172C;HANUNOO LETTER YA;Lo;0;L;;;;;N;;;;; +172D;HANUNOO LETTER RA;Lo;0;L;;;;;N;;;;; +172E;HANUNOO LETTER LA;Lo;0;L;;;;;N;;;;; +172F;HANUNOO LETTER WA;Lo;0;L;;;;;N;;;;; +1730;HANUNOO LETTER SA;Lo;0;L;;;;;N;;;;; +1731;HANUNOO LETTER HA;Lo;0;L;;;;;N;;;;; +1732;HANUNOO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1733;HANUNOO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1734;HANUNOO SIGN PAMUDPOD;Mn;9;NSM;;;;;N;;;;; +1735;PHILIPPINE SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; +1736;PHILIPPINE DOUBLE PUNCTUATION;Po;0;L;;;;;N;;;;; +1740;BUHID LETTER A;Lo;0;L;;;;;N;;;;; +1741;BUHID LETTER I;Lo;0;L;;;;;N;;;;; +1742;BUHID LETTER U;Lo;0;L;;;;;N;;;;; +1743;BUHID LETTER KA;Lo;0;L;;;;;N;;;;; +1744;BUHID LETTER GA;Lo;0;L;;;;;N;;;;; +1745;BUHID LETTER NGA;Lo;0;L;;;;;N;;;;; +1746;BUHID LETTER TA;Lo;0;L;;;;;N;;;;; +1747;BUHID LETTER DA;Lo;0;L;;;;;N;;;;; +1748;BUHID LETTER NA;Lo;0;L;;;;;N;;;;; +1749;BUHID LETTER PA;Lo;0;L;;;;;N;;;;; +174A;BUHID LETTER BA;Lo;0;L;;;;;N;;;;; +174B;BUHID LETTER MA;Lo;0;L;;;;;N;;;;; +174C;BUHID LETTER YA;Lo;0;L;;;;;N;;;;; +174D;BUHID LETTER RA;Lo;0;L;;;;;N;;;;; +174E;BUHID LETTER LA;Lo;0;L;;;;;N;;;;; +174F;BUHID LETTER WA;Lo;0;L;;;;;N;;;;; +1750;BUHID LETTER SA;Lo;0;L;;;;;N;;;;; +1751;BUHID LETTER HA;Lo;0;L;;;;;N;;;;; +1752;BUHID VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1753;BUHID VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1760;TAGBANWA LETTER A;Lo;0;L;;;;;N;;;;; +1761;TAGBANWA LETTER I;Lo;0;L;;;;;N;;;;; +1762;TAGBANWA LETTER U;Lo;0;L;;;;;N;;;;; +1763;TAGBANWA LETTER KA;Lo;0;L;;;;;N;;;;; +1764;TAGBANWA LETTER GA;Lo;0;L;;;;;N;;;;; +1765;TAGBANWA LETTER NGA;Lo;0;L;;;;;N;;;;; +1766;TAGBANWA LETTER TA;Lo;0;L;;;;;N;;;;; +1767;TAGBANWA LETTER DA;Lo;0;L;;;;;N;;;;; +1768;TAGBANWA LETTER NA;Lo;0;L;;;;;N;;;;; +1769;TAGBANWA LETTER PA;Lo;0;L;;;;;N;;;;; +176A;TAGBANWA LETTER BA;Lo;0;L;;;;;N;;;;; +176B;TAGBANWA LETTER MA;Lo;0;L;;;;;N;;;;; +176C;TAGBANWA LETTER YA;Lo;0;L;;;;;N;;;;; +176E;TAGBANWA LETTER LA;Lo;0;L;;;;;N;;;;; +176F;TAGBANWA LETTER WA;Lo;0;L;;;;;N;;;;; +1770;TAGBANWA LETTER SA;Lo;0;L;;;;;N;;;;; +1772;TAGBANWA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1773;TAGBANWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1780;KHMER LETTER KA;Lo;0;L;;;;;N;;;;; +1781;KHMER LETTER KHA;Lo;0;L;;;;;N;;;;; +1782;KHMER LETTER KO;Lo;0;L;;;;;N;;;;; +1783;KHMER LETTER KHO;Lo;0;L;;;;;N;;;;; +1784;KHMER LETTER NGO;Lo;0;L;;;;;N;;;;; +1785;KHMER LETTER CA;Lo;0;L;;;;;N;;;;; +1786;KHMER LETTER CHA;Lo;0;L;;;;;N;;;;; +1787;KHMER LETTER CO;Lo;0;L;;;;;N;;;;; +1788;KHMER LETTER CHO;Lo;0;L;;;;;N;;;;; +1789;KHMER LETTER NYO;Lo;0;L;;;;;N;;;;; +178A;KHMER LETTER DA;Lo;0;L;;;;;N;;;;; +178B;KHMER LETTER TTHA;Lo;0;L;;;;;N;;;;; +178C;KHMER LETTER DO;Lo;0;L;;;;;N;;;;; +178D;KHMER LETTER TTHO;Lo;0;L;;;;;N;;;;; +178E;KHMER LETTER NNO;Lo;0;L;;;;;N;;;;; +178F;KHMER LETTER TA;Lo;0;L;;;;;N;;;;; +1790;KHMER LETTER THA;Lo;0;L;;;;;N;;;;; +1791;KHMER LETTER TO;Lo;0;L;;;;;N;;;;; +1792;KHMER LETTER THO;Lo;0;L;;;;;N;;;;; +1793;KHMER LETTER NO;Lo;0;L;;;;;N;;;;; +1794;KHMER LETTER BA;Lo;0;L;;;;;N;;;;; +1795;KHMER LETTER PHA;Lo;0;L;;;;;N;;;;; +1796;KHMER LETTER PO;Lo;0;L;;;;;N;;;;; +1797;KHMER LETTER PHO;Lo;0;L;;;;;N;;;;; +1798;KHMER LETTER MO;Lo;0;L;;;;;N;;;;; +1799;KHMER LETTER YO;Lo;0;L;;;;;N;;;;; +179A;KHMER LETTER RO;Lo;0;L;;;;;N;;;;; +179B;KHMER LETTER LO;Lo;0;L;;;;;N;;;;; +179C;KHMER LETTER VO;Lo;0;L;;;;;N;;;;; +179D;KHMER LETTER SHA;Lo;0;L;;;;;N;;;;; +179E;KHMER LETTER SSO;Lo;0;L;;;;;N;;;;; +179F;KHMER LETTER SA;Lo;0;L;;;;;N;;;;; +17A0;KHMER LETTER HA;Lo;0;L;;;;;N;;;;; +17A1;KHMER LETTER LA;Lo;0;L;;;;;N;;;;; +17A2;KHMER LETTER QA;Lo;0;L;;;;;N;;;;; +17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;;;; +17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;;;; +17A5;KHMER INDEPENDENT VOWEL QI;Lo;0;L;;;;;N;;;;; +17A6;KHMER INDEPENDENT VOWEL QII;Lo;0;L;;;;;N;;;;; +17A7;KHMER INDEPENDENT VOWEL QU;Lo;0;L;;;;;N;;;;; +17A8;KHMER INDEPENDENT VOWEL QUK;Lo;0;L;;;;;N;;;;; +17A9;KHMER INDEPENDENT VOWEL QUU;Lo;0;L;;;;;N;;;;; +17AA;KHMER INDEPENDENT VOWEL QUUV;Lo;0;L;;;;;N;;;;; +17AB;KHMER INDEPENDENT VOWEL RY;Lo;0;L;;;;;N;;;;; +17AC;KHMER INDEPENDENT VOWEL RYY;Lo;0;L;;;;;N;;;;; +17AD;KHMER INDEPENDENT VOWEL LY;Lo;0;L;;;;;N;;;;; +17AE;KHMER INDEPENDENT VOWEL LYY;Lo;0;L;;;;;N;;;;; +17AF;KHMER INDEPENDENT VOWEL QE;Lo;0;L;;;;;N;;;;; +17B0;KHMER INDEPENDENT VOWEL QAI;Lo;0;L;;;;;N;;;;; +17B1;KHMER INDEPENDENT VOWEL QOO TYPE ONE;Lo;0;L;;;;;N;;;;; +17B2;KHMER INDEPENDENT VOWEL QOO TYPE TWO;Lo;0;L;;;;;N;;;;; +17B3;KHMER INDEPENDENT VOWEL QAU;Lo;0;L;;;;;N;;;;; +17B4;KHMER VOWEL INHERENT AQ;Cf;0;L;;;;;N;;;;; +17B5;KHMER VOWEL INHERENT AA;Cf;0;L;;;;;N;;;;; +17B6;KHMER VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +17B7;KHMER VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +17B8;KHMER VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +17B9;KHMER VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; +17BA;KHMER VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; +17BB;KHMER VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +17BC;KHMER VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +17BD;KHMER VOWEL SIGN UA;Mn;0;NSM;;;;;N;;;;; +17BE;KHMER VOWEL SIGN OE;Mc;0;L;;;;;N;;;;; +17BF;KHMER VOWEL SIGN YA;Mc;0;L;;;;;N;;;;; +17C0;KHMER VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; +17C1;KHMER VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +17C2;KHMER VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +17C3;KHMER VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +17C4;KHMER VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +17C5;KHMER VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +17C6;KHMER SIGN NIKAHIT;Mn;0;NSM;;;;;N;;;;; +17C7;KHMER SIGN REAHMUK;Mc;0;L;;;;;N;;;;; +17C8;KHMER SIGN YUUKALEAPINTU;Mc;0;L;;;;;N;;;;; +17C9;KHMER SIGN MUUSIKATOAN;Mn;0;NSM;;;;;N;;;;; +17CA;KHMER SIGN TRIISAP;Mn;0;NSM;;;;;N;;;;; +17CB;KHMER SIGN BANTOC;Mn;0;NSM;;;;;N;;;;; +17CC;KHMER SIGN ROBAT;Mn;0;NSM;;;;;N;;;;; +17CD;KHMER SIGN TOANDAKHIAT;Mn;0;NSM;;;;;N;;;;; +17CE;KHMER SIGN KAKABAT;Mn;0;NSM;;;;;N;;;;; +17CF;KHMER SIGN AHSDA;Mn;0;NSM;;;;;N;;;;; +17D0;KHMER SIGN SAMYOK SANNYA;Mn;0;NSM;;;;;N;;;;; +17D1;KHMER SIGN VIRIAM;Mn;0;NSM;;;;;N;;;;; +17D2;KHMER SIGN COENG;Mn;9;NSM;;;;;N;;;;; +17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;;;; +17D4;KHMER SIGN KHAN;Po;0;L;;;;;N;;;;; +17D5;KHMER SIGN BARIYOOSAN;Po;0;L;;;;;N;;;;; +17D6;KHMER SIGN CAMNUC PII KUUH;Po;0;L;;;;;N;;;;; +17D7;KHMER SIGN LEK TOO;Lm;0;L;;;;;N;;;;; +17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;;;; +17D9;KHMER SIGN PHNAEK MUAN;Po;0;L;;;;;N;;;;; +17DA;KHMER SIGN KOOMUUT;Po;0;L;;;;;N;;;;; +17DB;KHMER CURRENCY SYMBOL RIEL;Sc;0;ET;;;;;N;;;;; +17DC;KHMER SIGN AVAKRAHASANYA;Lo;0;L;;;;;N;;;;; +17DD;KHMER SIGN ATTHACAN;Mn;230;NSM;;;;;N;;;;; +17E0;KHMER DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +17E1;KHMER DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +17E2;KHMER DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +17E3;KHMER DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +17E4;KHMER DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +17E5;KHMER DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +17E6;KHMER DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +17E7;KHMER DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +17E8;KHMER DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +17E9;KHMER DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +17F0;KHMER SYMBOL LEK ATTAK SON;No;0;ON;;;;0;N;;;;; +17F1;KHMER SYMBOL LEK ATTAK MUOY;No;0;ON;;;;1;N;;;;; +17F2;KHMER SYMBOL LEK ATTAK PII;No;0;ON;;;;2;N;;;;; +17F3;KHMER SYMBOL LEK ATTAK BEI;No;0;ON;;;;3;N;;;;; +17F4;KHMER SYMBOL LEK ATTAK BUON;No;0;ON;;;;4;N;;;;; +17F5;KHMER SYMBOL LEK ATTAK PRAM;No;0;ON;;;;5;N;;;;; +17F6;KHMER SYMBOL LEK ATTAK PRAM-MUOY;No;0;ON;;;;6;N;;;;; +17F7;KHMER SYMBOL LEK ATTAK PRAM-PII;No;0;ON;;;;7;N;;;;; +17F8;KHMER SYMBOL LEK ATTAK PRAM-BEI;No;0;ON;;;;8;N;;;;; +17F9;KHMER SYMBOL LEK ATTAK PRAM-BUON;No;0;ON;;;;9;N;;;;; +1800;MONGOLIAN BIRGA;Po;0;ON;;;;;N;;;;; +1801;MONGOLIAN ELLIPSIS;Po;0;ON;;;;;N;;;;; +1802;MONGOLIAN COMMA;Po;0;ON;;;;;N;;;;; +1803;MONGOLIAN FULL STOP;Po;0;ON;;;;;N;;;;; +1804;MONGOLIAN COLON;Po;0;ON;;;;;N;;;;; +1805;MONGOLIAN FOUR DOTS;Po;0;ON;;;;;N;;;;; +1806;MONGOLIAN TODO SOFT HYPHEN;Pd;0;ON;;;;;N;;;;; +1807;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER;Po;0;ON;;;;;N;;;;; +1808;MONGOLIAN MANCHU COMMA;Po;0;ON;;;;;N;;;;; +1809;MONGOLIAN MANCHU FULL STOP;Po;0;ON;;;;;N;;;;; +180A;MONGOLIAN NIRUGU;Po;0;ON;;;;;N;;;;; +180B;MONGOLIAN FREE VARIATION SELECTOR ONE;Mn;0;NSM;;;;;N;;;;; +180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Mn;0;NSM;;;;;N;;;;; +180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Mn;0;NSM;;;;;N;;;;; +180E;MONGOLIAN VOWEL SEPARATOR;Zs;0;WS;;;;;N;;;;; +1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1813;MONGOLIAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1814;MONGOLIAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1815;MONGOLIAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1816;MONGOLIAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1817;MONGOLIAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1818;MONGOLIAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1819;MONGOLIAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1820;MONGOLIAN LETTER A;Lo;0;L;;;;;N;;;;; +1821;MONGOLIAN LETTER E;Lo;0;L;;;;;N;;;;; +1822;MONGOLIAN LETTER I;Lo;0;L;;;;;N;;;;; +1823;MONGOLIAN LETTER O;Lo;0;L;;;;;N;;;;; +1824;MONGOLIAN LETTER U;Lo;0;L;;;;;N;;;;; +1825;MONGOLIAN LETTER OE;Lo;0;L;;;;;N;;;;; +1826;MONGOLIAN LETTER UE;Lo;0;L;;;;;N;;;;; +1827;MONGOLIAN LETTER EE;Lo;0;L;;;;;N;;;;; +1828;MONGOLIAN LETTER NA;Lo;0;L;;;;;N;;;;; +1829;MONGOLIAN LETTER ANG;Lo;0;L;;;;;N;;;;; +182A;MONGOLIAN LETTER BA;Lo;0;L;;;;;N;;;;; +182B;MONGOLIAN LETTER PA;Lo;0;L;;;;;N;;;;; +182C;MONGOLIAN LETTER QA;Lo;0;L;;;;;N;;;;; +182D;MONGOLIAN LETTER GA;Lo;0;L;;;;;N;;;;; +182E;MONGOLIAN LETTER MA;Lo;0;L;;;;;N;;;;; +182F;MONGOLIAN LETTER LA;Lo;0;L;;;;;N;;;;; +1830;MONGOLIAN LETTER SA;Lo;0;L;;;;;N;;;;; +1831;MONGOLIAN LETTER SHA;Lo;0;L;;;;;N;;;;; +1832;MONGOLIAN LETTER TA;Lo;0;L;;;;;N;;;;; +1833;MONGOLIAN LETTER DA;Lo;0;L;;;;;N;;;;; +1834;MONGOLIAN LETTER CHA;Lo;0;L;;;;;N;;;;; +1835;MONGOLIAN LETTER JA;Lo;0;L;;;;;N;;;;; +1836;MONGOLIAN LETTER YA;Lo;0;L;;;;;N;;;;; +1837;MONGOLIAN LETTER RA;Lo;0;L;;;;;N;;;;; +1838;MONGOLIAN LETTER WA;Lo;0;L;;;;;N;;;;; +1839;MONGOLIAN LETTER FA;Lo;0;L;;;;;N;;;;; +183A;MONGOLIAN LETTER KA;Lo;0;L;;;;;N;;;;; +183B;MONGOLIAN LETTER KHA;Lo;0;L;;;;;N;;;;; +183C;MONGOLIAN LETTER TSA;Lo;0;L;;;;;N;;;;; +183D;MONGOLIAN LETTER ZA;Lo;0;L;;;;;N;;;;; +183E;MONGOLIAN LETTER HAA;Lo;0;L;;;;;N;;;;; +183F;MONGOLIAN LETTER ZRA;Lo;0;L;;;;;N;;;;; +1840;MONGOLIAN LETTER LHA;Lo;0;L;;;;;N;;;;; +1841;MONGOLIAN LETTER ZHI;Lo;0;L;;;;;N;;;;; +1842;MONGOLIAN LETTER CHI;Lo;0;L;;;;;N;;;;; +1843;MONGOLIAN LETTER TODO LONG VOWEL SIGN;Lm;0;L;;;;;N;;;;; +1844;MONGOLIAN LETTER TODO E;Lo;0;L;;;;;N;;;;; +1845;MONGOLIAN LETTER TODO I;Lo;0;L;;;;;N;;;;; +1846;MONGOLIAN LETTER TODO O;Lo;0;L;;;;;N;;;;; +1847;MONGOLIAN LETTER TODO U;Lo;0;L;;;;;N;;;;; +1848;MONGOLIAN LETTER TODO OE;Lo;0;L;;;;;N;;;;; +1849;MONGOLIAN LETTER TODO UE;Lo;0;L;;;;;N;;;;; +184A;MONGOLIAN LETTER TODO ANG;Lo;0;L;;;;;N;;;;; +184B;MONGOLIAN LETTER TODO BA;Lo;0;L;;;;;N;;;;; +184C;MONGOLIAN LETTER TODO PA;Lo;0;L;;;;;N;;;;; +184D;MONGOLIAN LETTER TODO QA;Lo;0;L;;;;;N;;;;; +184E;MONGOLIAN LETTER TODO GA;Lo;0;L;;;;;N;;;;; +184F;MONGOLIAN LETTER TODO MA;Lo;0;L;;;;;N;;;;; +1850;MONGOLIAN LETTER TODO TA;Lo;0;L;;;;;N;;;;; +1851;MONGOLIAN LETTER TODO DA;Lo;0;L;;;;;N;;;;; +1852;MONGOLIAN LETTER TODO CHA;Lo;0;L;;;;;N;;;;; +1853;MONGOLIAN LETTER TODO JA;Lo;0;L;;;;;N;;;;; +1854;MONGOLIAN LETTER TODO TSA;Lo;0;L;;;;;N;;;;; +1855;MONGOLIAN LETTER TODO YA;Lo;0;L;;;;;N;;;;; +1856;MONGOLIAN LETTER TODO WA;Lo;0;L;;;;;N;;;;; +1857;MONGOLIAN LETTER TODO KA;Lo;0;L;;;;;N;;;;; +1858;MONGOLIAN LETTER TODO GAA;Lo;0;L;;;;;N;;;;; +1859;MONGOLIAN LETTER TODO HAA;Lo;0;L;;;;;N;;;;; +185A;MONGOLIAN LETTER TODO JIA;Lo;0;L;;;;;N;;;;; +185B;MONGOLIAN LETTER TODO NIA;Lo;0;L;;;;;N;;;;; +185C;MONGOLIAN LETTER TODO DZA;Lo;0;L;;;;;N;;;;; +185D;MONGOLIAN LETTER SIBE E;Lo;0;L;;;;;N;;;;; +185E;MONGOLIAN LETTER SIBE I;Lo;0;L;;;;;N;;;;; +185F;MONGOLIAN LETTER SIBE IY;Lo;0;L;;;;;N;;;;; +1860;MONGOLIAN LETTER SIBE UE;Lo;0;L;;;;;N;;;;; +1861;MONGOLIAN LETTER SIBE U;Lo;0;L;;;;;N;;;;; +1862;MONGOLIAN LETTER SIBE ANG;Lo;0;L;;;;;N;;;;; +1863;MONGOLIAN LETTER SIBE KA;Lo;0;L;;;;;N;;;;; +1864;MONGOLIAN LETTER SIBE GA;Lo;0;L;;;;;N;;;;; +1865;MONGOLIAN LETTER SIBE HA;Lo;0;L;;;;;N;;;;; +1866;MONGOLIAN LETTER SIBE PA;Lo;0;L;;;;;N;;;;; +1867;MONGOLIAN LETTER SIBE SHA;Lo;0;L;;;;;N;;;;; +1868;MONGOLIAN LETTER SIBE TA;Lo;0;L;;;;;N;;;;; +1869;MONGOLIAN LETTER SIBE DA;Lo;0;L;;;;;N;;;;; +186A;MONGOLIAN LETTER SIBE JA;Lo;0;L;;;;;N;;;;; +186B;MONGOLIAN LETTER SIBE FA;Lo;0;L;;;;;N;;;;; +186C;MONGOLIAN LETTER SIBE GAA;Lo;0;L;;;;;N;;;;; +186D;MONGOLIAN LETTER SIBE HAA;Lo;0;L;;;;;N;;;;; +186E;MONGOLIAN LETTER SIBE TSA;Lo;0;L;;;;;N;;;;; +186F;MONGOLIAN LETTER SIBE ZA;Lo;0;L;;;;;N;;;;; +1870;MONGOLIAN LETTER SIBE RAA;Lo;0;L;;;;;N;;;;; +1871;MONGOLIAN LETTER SIBE CHA;Lo;0;L;;;;;N;;;;; +1872;MONGOLIAN LETTER SIBE ZHA;Lo;0;L;;;;;N;;;;; +1873;MONGOLIAN LETTER MANCHU I;Lo;0;L;;;;;N;;;;; +1874;MONGOLIAN LETTER MANCHU KA;Lo;0;L;;;;;N;;;;; +1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;; +1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;; +1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;; +1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;; +1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;; +1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;; +1883;MONGOLIAN LETTER ALI GALI UBADAMA;Lo;0;L;;;;;N;;;;; +1884;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA;Lo;0;L;;;;;N;;;;; +1885;MONGOLIAN LETTER ALI GALI BALUDA;Lo;0;L;;;;;N;;;;; +1886;MONGOLIAN LETTER ALI GALI THREE BALUDA;Lo;0;L;;;;;N;;;;; +1887;MONGOLIAN LETTER ALI GALI A;Lo;0;L;;;;;N;;;;; +1888;MONGOLIAN LETTER ALI GALI I;Lo;0;L;;;;;N;;;;; +1889;MONGOLIAN LETTER ALI GALI KA;Lo;0;L;;;;;N;;;;; +188A;MONGOLIAN LETTER ALI GALI NGA;Lo;0;L;;;;;N;;;;; +188B;MONGOLIAN LETTER ALI GALI CA;Lo;0;L;;;;;N;;;;; +188C;MONGOLIAN LETTER ALI GALI TTA;Lo;0;L;;;;;N;;;;; +188D;MONGOLIAN LETTER ALI GALI TTHA;Lo;0;L;;;;;N;;;;; +188E;MONGOLIAN LETTER ALI GALI DDA;Lo;0;L;;;;;N;;;;; +188F;MONGOLIAN LETTER ALI GALI NNA;Lo;0;L;;;;;N;;;;; +1890;MONGOLIAN LETTER ALI GALI TA;Lo;0;L;;;;;N;;;;; +1891;MONGOLIAN LETTER ALI GALI DA;Lo;0;L;;;;;N;;;;; +1892;MONGOLIAN LETTER ALI GALI PA;Lo;0;L;;;;;N;;;;; +1893;MONGOLIAN LETTER ALI GALI PHA;Lo;0;L;;;;;N;;;;; +1894;MONGOLIAN LETTER ALI GALI SSA;Lo;0;L;;;;;N;;;;; +1895;MONGOLIAN LETTER ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +1896;MONGOLIAN LETTER ALI GALI ZA;Lo;0;L;;;;;N;;;;; +1897;MONGOLIAN LETTER ALI GALI AH;Lo;0;L;;;;;N;;;;; +1898;MONGOLIAN LETTER TODO ALI GALI TA;Lo;0;L;;;;;N;;;;; +1899;MONGOLIAN LETTER TODO ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +189A;MONGOLIAN LETTER MANCHU ALI GALI GHA;Lo;0;L;;;;;N;;;;; +189B;MONGOLIAN LETTER MANCHU ALI GALI NGA;Lo;0;L;;;;;N;;;;; +189C;MONGOLIAN LETTER MANCHU ALI GALI CA;Lo;0;L;;;;;N;;;;; +189D;MONGOLIAN LETTER MANCHU ALI GALI JHA;Lo;0;L;;;;;N;;;;; +189E;MONGOLIAN LETTER MANCHU ALI GALI TTA;Lo;0;L;;;;;N;;;;; +189F;MONGOLIAN LETTER MANCHU ALI GALI DDHA;Lo;0;L;;;;;N;;;;; +18A0;MONGOLIAN LETTER MANCHU ALI GALI TA;Lo;0;L;;;;;N;;;;; +18A1;MONGOLIAN LETTER MANCHU ALI GALI DHA;Lo;0;L;;;;;N;;;;; +18A2;MONGOLIAN LETTER MANCHU ALI GALI SSA;Lo;0;L;;;;;N;;;;; +18A3;MONGOLIAN LETTER MANCHU ALI GALI CYA;Lo;0;L;;;;;N;;;;; +18A4;MONGOLIAN LETTER MANCHU ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +18A5;MONGOLIAN LETTER MANCHU ALI GALI ZA;Lo;0;L;;;;;N;;;;; +18A6;MONGOLIAN LETTER ALI GALI HALF U;Lo;0;L;;;;;N;;;;; +18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;; +18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;; +18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;; +18AA;MONGOLIAN LETTER MANCHU ALI GALI LHA;Lo;0;L;;;;;N;;;;; +18B0;CANADIAN SYLLABICS OY;Lo;0;L;;;;;N;;;;; +18B1;CANADIAN SYLLABICS AY;Lo;0;L;;;;;N;;;;; +18B2;CANADIAN SYLLABICS AAY;Lo;0;L;;;;;N;;;;; +18B3;CANADIAN SYLLABICS WAY;Lo;0;L;;;;;N;;;;; +18B4;CANADIAN SYLLABICS POY;Lo;0;L;;;;;N;;;;; +18B5;CANADIAN SYLLABICS PAY;Lo;0;L;;;;;N;;;;; +18B6;CANADIAN SYLLABICS PWOY;Lo;0;L;;;;;N;;;;; +18B7;CANADIAN SYLLABICS TAY;Lo;0;L;;;;;N;;;;; +18B8;CANADIAN SYLLABICS KAY;Lo;0;L;;;;;N;;;;; +18B9;CANADIAN SYLLABICS KWAY;Lo;0;L;;;;;N;;;;; +18BA;CANADIAN SYLLABICS MAY;Lo;0;L;;;;;N;;;;; +18BB;CANADIAN SYLLABICS NOY;Lo;0;L;;;;;N;;;;; +18BC;CANADIAN SYLLABICS NAY;Lo;0;L;;;;;N;;;;; +18BD;CANADIAN SYLLABICS LAY;Lo;0;L;;;;;N;;;;; +18BE;CANADIAN SYLLABICS SOY;Lo;0;L;;;;;N;;;;; +18BF;CANADIAN SYLLABICS SAY;Lo;0;L;;;;;N;;;;; +18C0;CANADIAN SYLLABICS SHOY;Lo;0;L;;;;;N;;;;; +18C1;CANADIAN SYLLABICS SHAY;Lo;0;L;;;;;N;;;;; +18C2;CANADIAN SYLLABICS SHWOY;Lo;0;L;;;;;N;;;;; +18C3;CANADIAN SYLLABICS YOY;Lo;0;L;;;;;N;;;;; +18C4;CANADIAN SYLLABICS YAY;Lo;0;L;;;;;N;;;;; +18C5;CANADIAN SYLLABICS RAY;Lo;0;L;;;;;N;;;;; +18C6;CANADIAN SYLLABICS NWI;Lo;0;L;;;;;N;;;;; +18C7;CANADIAN SYLLABICS OJIBWAY NWI;Lo;0;L;;;;;N;;;;; +18C8;CANADIAN SYLLABICS NWII;Lo;0;L;;;;;N;;;;; +18C9;CANADIAN SYLLABICS OJIBWAY NWII;Lo;0;L;;;;;N;;;;; +18CA;CANADIAN SYLLABICS NWO;Lo;0;L;;;;;N;;;;; +18CB;CANADIAN SYLLABICS OJIBWAY NWO;Lo;0;L;;;;;N;;;;; +18CC;CANADIAN SYLLABICS NWOO;Lo;0;L;;;;;N;;;;; +18CD;CANADIAN SYLLABICS OJIBWAY NWOO;Lo;0;L;;;;;N;;;;; +18CE;CANADIAN SYLLABICS RWEE;Lo;0;L;;;;;N;;;;; +18CF;CANADIAN SYLLABICS RWI;Lo;0;L;;;;;N;;;;; +18D0;CANADIAN SYLLABICS RWII;Lo;0;L;;;;;N;;;;; +18D1;CANADIAN SYLLABICS RWO;Lo;0;L;;;;;N;;;;; +18D2;CANADIAN SYLLABICS RWOO;Lo;0;L;;;;;N;;;;; +18D3;CANADIAN SYLLABICS RWA;Lo;0;L;;;;;N;;;;; +18D4;CANADIAN SYLLABICS OJIBWAY P;Lo;0;L;;;;;N;;;;; +18D5;CANADIAN SYLLABICS OJIBWAY T;Lo;0;L;;;;;N;;;;; +18D6;CANADIAN SYLLABICS OJIBWAY K;Lo;0;L;;;;;N;;;;; +18D7;CANADIAN SYLLABICS OJIBWAY C;Lo;0;L;;;;;N;;;;; +18D8;CANADIAN SYLLABICS OJIBWAY M;Lo;0;L;;;;;N;;;;; +18D9;CANADIAN SYLLABICS OJIBWAY N;Lo;0;L;;;;;N;;;;; +18DA;CANADIAN SYLLABICS OJIBWAY S;Lo;0;L;;;;;N;;;;; +18DB;CANADIAN SYLLABICS OJIBWAY SH;Lo;0;L;;;;;N;;;;; +18DC;CANADIAN SYLLABICS EASTERN W;Lo;0;L;;;;;N;;;;; +18DD;CANADIAN SYLLABICS WESTERN W;Lo;0;L;;;;;N;;;;; +18DE;CANADIAN SYLLABICS FINAL SMALL RING;Lo;0;L;;;;;N;;;;; +18DF;CANADIAN SYLLABICS FINAL RAISED DOT;Lo;0;L;;;;;N;;;;; +18E0;CANADIAN SYLLABICS R-CREE RWE;Lo;0;L;;;;;N;;;;; +18E1;CANADIAN SYLLABICS WEST-CREE LOO;Lo;0;L;;;;;N;;;;; +18E2;CANADIAN SYLLABICS WEST-CREE LAA;Lo;0;L;;;;;N;;;;; +18E3;CANADIAN SYLLABICS THWE;Lo;0;L;;;;;N;;;;; +18E4;CANADIAN SYLLABICS THWA;Lo;0;L;;;;;N;;;;; +18E5;CANADIAN SYLLABICS TTHWE;Lo;0;L;;;;;N;;;;; +18E6;CANADIAN SYLLABICS TTHOO;Lo;0;L;;;;;N;;;;; +18E7;CANADIAN SYLLABICS TTHAA;Lo;0;L;;;;;N;;;;; +18E8;CANADIAN SYLLABICS TLHWE;Lo;0;L;;;;;N;;;;; +18E9;CANADIAN SYLLABICS TLHOO;Lo;0;L;;;;;N;;;;; +18EA;CANADIAN SYLLABICS SAYISI SHWE;Lo;0;L;;;;;N;;;;; +18EB;CANADIAN SYLLABICS SAYISI SHOO;Lo;0;L;;;;;N;;;;; +18EC;CANADIAN SYLLABICS SAYISI HOO;Lo;0;L;;;;;N;;;;; +18ED;CANADIAN SYLLABICS CARRIER GWU;Lo;0;L;;;;;N;;;;; +18EE;CANADIAN SYLLABICS CARRIER DENE GEE;Lo;0;L;;;;;N;;;;; +18EF;CANADIAN SYLLABICS CARRIER GAA;Lo;0;L;;;;;N;;;;; +18F0;CANADIAN SYLLABICS CARRIER GWA;Lo;0;L;;;;;N;;;;; +18F1;CANADIAN SYLLABICS SAYISI JUU;Lo;0;L;;;;;N;;;;; +18F2;CANADIAN SYLLABICS CARRIER JWA;Lo;0;L;;;;;N;;;;; +18F3;CANADIAN SYLLABICS BEAVER DENE L;Lo;0;L;;;;;N;;;;; +18F4;CANADIAN SYLLABICS BEAVER DENE R;Lo;0;L;;;;;N;;;;; +18F5;CANADIAN SYLLABICS CARRIER DENTAL S;Lo;0;L;;;;;N;;;;; +1900;LIMBU VOWEL-CARRIER LETTER;Lo;0;L;;;;;N;;;;; +1901;LIMBU LETTER KA;Lo;0;L;;;;;N;;;;; +1902;LIMBU LETTER KHA;Lo;0;L;;;;;N;;;;; +1903;LIMBU LETTER GA;Lo;0;L;;;;;N;;;;; +1904;LIMBU LETTER GHA;Lo;0;L;;;;;N;;;;; +1905;LIMBU LETTER NGA;Lo;0;L;;;;;N;;;;; +1906;LIMBU LETTER CA;Lo;0;L;;;;;N;;;;; +1907;LIMBU LETTER CHA;Lo;0;L;;;;;N;;;;; +1908;LIMBU LETTER JA;Lo;0;L;;;;;N;;;;; +1909;LIMBU LETTER JHA;Lo;0;L;;;;;N;;;;; +190A;LIMBU LETTER YAN;Lo;0;L;;;;;N;;;;; +190B;LIMBU LETTER TA;Lo;0;L;;;;;N;;;;; +190C;LIMBU LETTER THA;Lo;0;L;;;;;N;;;;; +190D;LIMBU LETTER DA;Lo;0;L;;;;;N;;;;; +190E;LIMBU LETTER DHA;Lo;0;L;;;;;N;;;;; +190F;LIMBU LETTER NA;Lo;0;L;;;;;N;;;;; +1910;LIMBU LETTER PA;Lo;0;L;;;;;N;;;;; +1911;LIMBU LETTER PHA;Lo;0;L;;;;;N;;;;; +1912;LIMBU LETTER BA;Lo;0;L;;;;;N;;;;; +1913;LIMBU LETTER BHA;Lo;0;L;;;;;N;;;;; +1914;LIMBU LETTER MA;Lo;0;L;;;;;N;;;;; +1915;LIMBU LETTER YA;Lo;0;L;;;;;N;;;;; +1916;LIMBU LETTER RA;Lo;0;L;;;;;N;;;;; +1917;LIMBU LETTER LA;Lo;0;L;;;;;N;;;;; +1918;LIMBU LETTER WA;Lo;0;L;;;;;N;;;;; +1919;LIMBU LETTER SHA;Lo;0;L;;;;;N;;;;; +191A;LIMBU LETTER SSA;Lo;0;L;;;;;N;;;;; +191B;LIMBU LETTER SA;Lo;0;L;;;;;N;;;;; +191C;LIMBU LETTER HA;Lo;0;L;;;;;N;;;;; +1920;LIMBU VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;; +1921;LIMBU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1922;LIMBU VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1923;LIMBU VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +1924;LIMBU VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +1925;LIMBU VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1926;LIMBU VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +1927;LIMBU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1928;LIMBU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +1929;LIMBU SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; +192A;LIMBU SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; +192B;LIMBU SUBJOINED LETTER WA;Mc;0;L;;;;;N;;;;; +1930;LIMBU SMALL LETTER KA;Mc;0;L;;;;;N;;;;; +1931;LIMBU SMALL LETTER NGA;Mc;0;L;;;;;N;;;;; +1932;LIMBU SMALL LETTER ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1933;LIMBU SMALL LETTER TA;Mc;0;L;;;;;N;;;;; +1934;LIMBU SMALL LETTER NA;Mc;0;L;;;;;N;;;;; +1935;LIMBU SMALL LETTER PA;Mc;0;L;;;;;N;;;;; +1936;LIMBU SMALL LETTER MA;Mc;0;L;;;;;N;;;;; +1937;LIMBU SMALL LETTER RA;Mc;0;L;;;;;N;;;;; +1938;LIMBU SMALL LETTER LA;Mc;0;L;;;;;N;;;;; +1939;LIMBU SIGN MUKPHRENG;Mn;222;NSM;;;;;N;;;;; +193A;LIMBU SIGN KEMPHRENG;Mn;230;NSM;;;;;N;;;;; +193B;LIMBU SIGN SA-I;Mn;220;NSM;;;;;N;;;;; +1940;LIMBU SIGN LOO;So;0;ON;;;;;N;;;;; +1944;LIMBU EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +1945;LIMBU QUESTION MARK;Po;0;ON;;;;;N;;;;; +1946;LIMBU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1947;LIMBU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1948;LIMBU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1949;LIMBU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +194A;LIMBU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +194B;LIMBU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +194C;LIMBU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +194D;LIMBU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +194E;LIMBU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +194F;LIMBU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1950;TAI LE LETTER KA;Lo;0;L;;;;;N;;;;; +1951;TAI LE LETTER XA;Lo;0;L;;;;;N;;;;; +1952;TAI LE LETTER NGA;Lo;0;L;;;;;N;;;;; +1953;TAI LE LETTER TSA;Lo;0;L;;;;;N;;;;; +1954;TAI LE LETTER SA;Lo;0;L;;;;;N;;;;; +1955;TAI LE LETTER YA;Lo;0;L;;;;;N;;;;; +1956;TAI LE LETTER TA;Lo;0;L;;;;;N;;;;; +1957;TAI LE LETTER THA;Lo;0;L;;;;;N;;;;; +1958;TAI LE LETTER LA;Lo;0;L;;;;;N;;;;; +1959;TAI LE LETTER PA;Lo;0;L;;;;;N;;;;; +195A;TAI LE LETTER PHA;Lo;0;L;;;;;N;;;;; +195B;TAI LE LETTER MA;Lo;0;L;;;;;N;;;;; +195C;TAI LE LETTER FA;Lo;0;L;;;;;N;;;;; +195D;TAI LE LETTER VA;Lo;0;L;;;;;N;;;;; +195E;TAI LE LETTER HA;Lo;0;L;;;;;N;;;;; +195F;TAI LE LETTER QA;Lo;0;L;;;;;N;;;;; +1960;TAI LE LETTER KHA;Lo;0;L;;;;;N;;;;; +1961;TAI LE LETTER TSHA;Lo;0;L;;;;;N;;;;; +1962;TAI LE LETTER NA;Lo;0;L;;;;;N;;;;; +1963;TAI LE LETTER A;Lo;0;L;;;;;N;;;;; +1964;TAI LE LETTER I;Lo;0;L;;;;;N;;;;; +1965;TAI LE LETTER EE;Lo;0;L;;;;;N;;;;; +1966;TAI LE LETTER EH;Lo;0;L;;;;;N;;;;; +1967;TAI LE LETTER U;Lo;0;L;;;;;N;;;;; +1968;TAI LE LETTER OO;Lo;0;L;;;;;N;;;;; +1969;TAI LE LETTER O;Lo;0;L;;;;;N;;;;; +196A;TAI LE LETTER UE;Lo;0;L;;;;;N;;;;; +196B;TAI LE LETTER E;Lo;0;L;;;;;N;;;;; +196C;TAI LE LETTER AUE;Lo;0;L;;;;;N;;;;; +196D;TAI LE LETTER AI;Lo;0;L;;;;;N;;;;; +1970;TAI LE LETTER TONE-2;Lo;0;L;;;;;N;;;;; +1971;TAI LE LETTER TONE-3;Lo;0;L;;;;;N;;;;; +1972;TAI LE LETTER TONE-4;Lo;0;L;;;;;N;;;;; +1973;TAI LE LETTER TONE-5;Lo;0;L;;;;;N;;;;; +1974;TAI LE LETTER TONE-6;Lo;0;L;;;;;N;;;;; +1980;NEW TAI LUE LETTER HIGH QA;Lo;0;L;;;;;N;;;;; +1981;NEW TAI LUE LETTER LOW QA;Lo;0;L;;;;;N;;;;; +1982;NEW TAI LUE LETTER HIGH KA;Lo;0;L;;;;;N;;;;; +1983;NEW TAI LUE LETTER HIGH XA;Lo;0;L;;;;;N;;;;; +1984;NEW TAI LUE LETTER HIGH NGA;Lo;0;L;;;;;N;;;;; +1985;NEW TAI LUE LETTER LOW KA;Lo;0;L;;;;;N;;;;; +1986;NEW TAI LUE LETTER LOW XA;Lo;0;L;;;;;N;;;;; +1987;NEW TAI LUE LETTER LOW NGA;Lo;0;L;;;;;N;;;;; +1988;NEW TAI LUE LETTER HIGH TSA;Lo;0;L;;;;;N;;;;; +1989;NEW TAI LUE LETTER HIGH SA;Lo;0;L;;;;;N;;;;; +198A;NEW TAI LUE LETTER HIGH YA;Lo;0;L;;;;;N;;;;; +198B;NEW TAI LUE LETTER LOW TSA;Lo;0;L;;;;;N;;;;; +198C;NEW TAI LUE LETTER LOW SA;Lo;0;L;;;;;N;;;;; +198D;NEW TAI LUE LETTER LOW YA;Lo;0;L;;;;;N;;;;; +198E;NEW TAI LUE LETTER HIGH TA;Lo;0;L;;;;;N;;;;; +198F;NEW TAI LUE LETTER HIGH THA;Lo;0;L;;;;;N;;;;; +1990;NEW TAI LUE LETTER HIGH NA;Lo;0;L;;;;;N;;;;; +1991;NEW TAI LUE LETTER LOW TA;Lo;0;L;;;;;N;;;;; +1992;NEW TAI LUE LETTER LOW THA;Lo;0;L;;;;;N;;;;; +1993;NEW TAI LUE LETTER LOW NA;Lo;0;L;;;;;N;;;;; +1994;NEW TAI LUE LETTER HIGH PA;Lo;0;L;;;;;N;;;;; +1995;NEW TAI LUE LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; +1996;NEW TAI LUE LETTER HIGH MA;Lo;0;L;;;;;N;;;;; +1997;NEW TAI LUE LETTER LOW PA;Lo;0;L;;;;;N;;;;; +1998;NEW TAI LUE LETTER LOW PHA;Lo;0;L;;;;;N;;;;; +1999;NEW TAI LUE LETTER LOW MA;Lo;0;L;;;;;N;;;;; +199A;NEW TAI LUE LETTER HIGH FA;Lo;0;L;;;;;N;;;;; +199B;NEW TAI LUE LETTER HIGH VA;Lo;0;L;;;;;N;;;;; +199C;NEW TAI LUE LETTER HIGH LA;Lo;0;L;;;;;N;;;;; +199D;NEW TAI LUE LETTER LOW FA;Lo;0;L;;;;;N;;;;; +199E;NEW TAI LUE LETTER LOW VA;Lo;0;L;;;;;N;;;;; +199F;NEW TAI LUE LETTER LOW LA;Lo;0;L;;;;;N;;;;; +19A0;NEW TAI LUE LETTER HIGH HA;Lo;0;L;;;;;N;;;;; +19A1;NEW TAI LUE LETTER HIGH DA;Lo;0;L;;;;;N;;;;; +19A2;NEW TAI LUE LETTER HIGH BA;Lo;0;L;;;;;N;;;;; +19A3;NEW TAI LUE LETTER LOW HA;Lo;0;L;;;;;N;;;;; +19A4;NEW TAI LUE LETTER LOW DA;Lo;0;L;;;;;N;;;;; +19A5;NEW TAI LUE LETTER LOW BA;Lo;0;L;;;;;N;;;;; +19A6;NEW TAI LUE LETTER HIGH KVA;Lo;0;L;;;;;N;;;;; +19A7;NEW TAI LUE LETTER HIGH XVA;Lo;0;L;;;;;N;;;;; +19A8;NEW TAI LUE LETTER LOW KVA;Lo;0;L;;;;;N;;;;; +19A9;NEW TAI LUE LETTER LOW XVA;Lo;0;L;;;;;N;;;;; +19AA;NEW TAI LUE LETTER HIGH SUA;Lo;0;L;;;;;N;;;;; +19AB;NEW TAI LUE LETTER LOW SUA;Lo;0;L;;;;;N;;;;; +19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Mc;0;L;;;;;N;;;;; +19B1;NEW TAI LUE VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +19B2;NEW TAI LUE VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +19B3;NEW TAI LUE VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +19B4;NEW TAI LUE VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +19B5;NEW TAI LUE VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +19B6;NEW TAI LUE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +19B7;NEW TAI LUE VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +19B8;NEW TAI LUE VOWEL SIGN OA;Mc;0;L;;;;;N;;;;; +19B9;NEW TAI LUE VOWEL SIGN UE;Mc;0;L;;;;;N;;;;; +19BA;NEW TAI LUE VOWEL SIGN AY;Mc;0;L;;;;;N;;;;; +19BB;NEW TAI LUE VOWEL SIGN AAY;Mc;0;L;;;;;N;;;;; +19BC;NEW TAI LUE VOWEL SIGN UY;Mc;0;L;;;;;N;;;;; +19BD;NEW TAI LUE VOWEL SIGN OY;Mc;0;L;;;;;N;;;;; +19BE;NEW TAI LUE VOWEL SIGN OAY;Mc;0;L;;;;;N;;;;; +19BF;NEW TAI LUE VOWEL SIGN UEY;Mc;0;L;;;;;N;;;;; +19C0;NEW TAI LUE VOWEL SIGN IY;Mc;0;L;;;;;N;;;;; +19C1;NEW TAI LUE LETTER FINAL V;Lo;0;L;;;;;N;;;;; +19C2;NEW TAI LUE LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +19C3;NEW TAI LUE LETTER FINAL N;Lo;0;L;;;;;N;;;;; +19C4;NEW TAI LUE LETTER FINAL M;Lo;0;L;;;;;N;;;;; +19C5;NEW TAI LUE LETTER FINAL K;Lo;0;L;;;;;N;;;;; +19C6;NEW TAI LUE LETTER FINAL D;Lo;0;L;;;;;N;;;;; +19C7;NEW TAI LUE LETTER FINAL B;Lo;0;L;;;;;N;;;;; +19C8;NEW TAI LUE TONE MARK-1;Mc;0;L;;;;;N;;;;; +19C9;NEW TAI LUE TONE MARK-2;Mc;0;L;;;;;N;;;;; +19D0;NEW TAI LUE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +19D1;NEW TAI LUE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +19D2;NEW TAI LUE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +19D3;NEW TAI LUE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +19D4;NEW TAI LUE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +19D5;NEW TAI LUE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +19D6;NEW TAI LUE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +19D7;NEW TAI LUE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +19D8;NEW TAI LUE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +19D9;NEW TAI LUE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +19DA;NEW TAI LUE THAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +19DE;NEW TAI LUE SIGN LAE;Po;0;ON;;;;;N;;;;; +19DF;NEW TAI LUE SIGN LAEV;Po;0;ON;;;;;N;;;;; +19E0;KHMER SYMBOL PATHAMASAT;So;0;ON;;;;;N;;;;; +19E1;KHMER SYMBOL MUOY KOET;So;0;ON;;;;;N;;;;; +19E2;KHMER SYMBOL PII KOET;So;0;ON;;;;;N;;;;; +19E3;KHMER SYMBOL BEI KOET;So;0;ON;;;;;N;;;;; +19E4;KHMER SYMBOL BUON KOET;So;0;ON;;;;;N;;;;; +19E5;KHMER SYMBOL PRAM KOET;So;0;ON;;;;;N;;;;; +19E6;KHMER SYMBOL PRAM-MUOY KOET;So;0;ON;;;;;N;;;;; +19E7;KHMER SYMBOL PRAM-PII KOET;So;0;ON;;;;;N;;;;; +19E8;KHMER SYMBOL PRAM-BEI KOET;So;0;ON;;;;;N;;;;; +19E9;KHMER SYMBOL PRAM-BUON KOET;So;0;ON;;;;;N;;;;; +19EA;KHMER SYMBOL DAP KOET;So;0;ON;;;;;N;;;;; +19EB;KHMER SYMBOL DAP-MUOY KOET;So;0;ON;;;;;N;;;;; +19EC;KHMER SYMBOL DAP-PII KOET;So;0;ON;;;;;N;;;;; +19ED;KHMER SYMBOL DAP-BEI KOET;So;0;ON;;;;;N;;;;; +19EE;KHMER SYMBOL DAP-BUON KOET;So;0;ON;;;;;N;;;;; +19EF;KHMER SYMBOL DAP-PRAM KOET;So;0;ON;;;;;N;;;;; +19F0;KHMER SYMBOL TUTEYASAT;So;0;ON;;;;;N;;;;; +19F1;KHMER SYMBOL MUOY ROC;So;0;ON;;;;;N;;;;; +19F2;KHMER SYMBOL PII ROC;So;0;ON;;;;;N;;;;; +19F3;KHMER SYMBOL BEI ROC;So;0;ON;;;;;N;;;;; +19F4;KHMER SYMBOL BUON ROC;So;0;ON;;;;;N;;;;; +19F5;KHMER SYMBOL PRAM ROC;So;0;ON;;;;;N;;;;; +19F6;KHMER SYMBOL PRAM-MUOY ROC;So;0;ON;;;;;N;;;;; +19F7;KHMER SYMBOL PRAM-PII ROC;So;0;ON;;;;;N;;;;; +19F8;KHMER SYMBOL PRAM-BEI ROC;So;0;ON;;;;;N;;;;; +19F9;KHMER SYMBOL PRAM-BUON ROC;So;0;ON;;;;;N;;;;; +19FA;KHMER SYMBOL DAP ROC;So;0;ON;;;;;N;;;;; +19FB;KHMER SYMBOL DAP-MUOY ROC;So;0;ON;;;;;N;;;;; +19FC;KHMER SYMBOL DAP-PII ROC;So;0;ON;;;;;N;;;;; +19FD;KHMER SYMBOL DAP-BEI ROC;So;0;ON;;;;;N;;;;; +19FE;KHMER SYMBOL DAP-BUON ROC;So;0;ON;;;;;N;;;;; +19FF;KHMER SYMBOL DAP-PRAM ROC;So;0;ON;;;;;N;;;;; +1A00;BUGINESE LETTER KA;Lo;0;L;;;;;N;;;;; +1A01;BUGINESE LETTER GA;Lo;0;L;;;;;N;;;;; +1A02;BUGINESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1A03;BUGINESE LETTER NGKA;Lo;0;L;;;;;N;;;;; +1A04;BUGINESE LETTER PA;Lo;0;L;;;;;N;;;;; +1A05;BUGINESE LETTER BA;Lo;0;L;;;;;N;;;;; +1A06;BUGINESE LETTER MA;Lo;0;L;;;;;N;;;;; +1A07;BUGINESE LETTER MPA;Lo;0;L;;;;;N;;;;; +1A08;BUGINESE LETTER TA;Lo;0;L;;;;;N;;;;; +1A09;BUGINESE LETTER DA;Lo;0;L;;;;;N;;;;; +1A0A;BUGINESE LETTER NA;Lo;0;L;;;;;N;;;;; +1A0B;BUGINESE LETTER NRA;Lo;0;L;;;;;N;;;;; +1A0C;BUGINESE LETTER CA;Lo;0;L;;;;;N;;;;; +1A0D;BUGINESE LETTER JA;Lo;0;L;;;;;N;;;;; +1A0E;BUGINESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1A0F;BUGINESE LETTER NYCA;Lo;0;L;;;;;N;;;;; +1A10;BUGINESE LETTER YA;Lo;0;L;;;;;N;;;;; +1A11;BUGINESE LETTER RA;Lo;0;L;;;;;N;;;;; +1A12;BUGINESE LETTER LA;Lo;0;L;;;;;N;;;;; +1A13;BUGINESE LETTER VA;Lo;0;L;;;;;N;;;;; +1A14;BUGINESE LETTER SA;Lo;0;L;;;;;N;;;;; +1A15;BUGINESE LETTER A;Lo;0;L;;;;;N;;;;; +1A16;BUGINESE LETTER HA;Lo;0;L;;;;;N;;;;; +1A17;BUGINESE VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; +1A18;BUGINESE VOWEL SIGN U;Mn;220;NSM;;;;;N;;;;; +1A19;BUGINESE VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1A1A;BUGINESE VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1A1B;BUGINESE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +1A1E;BUGINESE PALLAWA;Po;0;L;;;;;N;;;;; +1A1F;BUGINESE END OF SECTION;Po;0;L;;;;;N;;;;; +1A20;TAI THAM LETTER HIGH KA;Lo;0;L;;;;;N;;;;; +1A21;TAI THAM LETTER HIGH KHA;Lo;0;L;;;;;N;;;;; +1A22;TAI THAM LETTER HIGH KXA;Lo;0;L;;;;;N;;;;; +1A23;TAI THAM LETTER LOW KA;Lo;0;L;;;;;N;;;;; +1A24;TAI THAM LETTER LOW KXA;Lo;0;L;;;;;N;;;;; +1A25;TAI THAM LETTER LOW KHA;Lo;0;L;;;;;N;;;;; +1A26;TAI THAM LETTER NGA;Lo;0;L;;;;;N;;;;; +1A27;TAI THAM LETTER HIGH CA;Lo;0;L;;;;;N;;;;; +1A28;TAI THAM LETTER HIGH CHA;Lo;0;L;;;;;N;;;;; +1A29;TAI THAM LETTER LOW CA;Lo;0;L;;;;;N;;;;; +1A2A;TAI THAM LETTER LOW SA;Lo;0;L;;;;;N;;;;; +1A2B;TAI THAM LETTER LOW CHA;Lo;0;L;;;;;N;;;;; +1A2C;TAI THAM LETTER NYA;Lo;0;L;;;;;N;;;;; +1A2D;TAI THAM LETTER RATA;Lo;0;L;;;;;N;;;;; +1A2E;TAI THAM LETTER HIGH RATHA;Lo;0;L;;;;;N;;;;; +1A2F;TAI THAM LETTER DA;Lo;0;L;;;;;N;;;;; +1A30;TAI THAM LETTER LOW RATHA;Lo;0;L;;;;;N;;;;; +1A31;TAI THAM LETTER RANA;Lo;0;L;;;;;N;;;;; +1A32;TAI THAM LETTER HIGH TA;Lo;0;L;;;;;N;;;;; +1A33;TAI THAM LETTER HIGH THA;Lo;0;L;;;;;N;;;;; +1A34;TAI THAM LETTER LOW TA;Lo;0;L;;;;;N;;;;; +1A35;TAI THAM LETTER LOW THA;Lo;0;L;;;;;N;;;;; +1A36;TAI THAM LETTER NA;Lo;0;L;;;;;N;;;;; +1A37;TAI THAM LETTER BA;Lo;0;L;;;;;N;;;;; +1A38;TAI THAM LETTER HIGH PA;Lo;0;L;;;;;N;;;;; +1A39;TAI THAM LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; +1A3A;TAI THAM LETTER HIGH FA;Lo;0;L;;;;;N;;;;; +1A3B;TAI THAM LETTER LOW PA;Lo;0;L;;;;;N;;;;; +1A3C;TAI THAM LETTER LOW FA;Lo;0;L;;;;;N;;;;; +1A3D;TAI THAM LETTER LOW PHA;Lo;0;L;;;;;N;;;;; +1A3E;TAI THAM LETTER MA;Lo;0;L;;;;;N;;;;; +1A3F;TAI THAM LETTER LOW YA;Lo;0;L;;;;;N;;;;; +1A40;TAI THAM LETTER HIGH YA;Lo;0;L;;;;;N;;;;; +1A41;TAI THAM LETTER RA;Lo;0;L;;;;;N;;;;; +1A42;TAI THAM LETTER RUE;Lo;0;L;;;;;N;;;;; +1A43;TAI THAM LETTER LA;Lo;0;L;;;;;N;;;;; +1A44;TAI THAM LETTER LUE;Lo;0;L;;;;;N;;;;; +1A45;TAI THAM LETTER WA;Lo;0;L;;;;;N;;;;; +1A46;TAI THAM LETTER HIGH SHA;Lo;0;L;;;;;N;;;;; +1A47;TAI THAM LETTER HIGH SSA;Lo;0;L;;;;;N;;;;; +1A48;TAI THAM LETTER HIGH SA;Lo;0;L;;;;;N;;;;; +1A49;TAI THAM LETTER HIGH HA;Lo;0;L;;;;;N;;;;; +1A4A;TAI THAM LETTER LLA;Lo;0;L;;;;;N;;;;; +1A4B;TAI THAM LETTER A;Lo;0;L;;;;;N;;;;; +1A4C;TAI THAM LETTER LOW HA;Lo;0;L;;;;;N;;;;; +1A4D;TAI THAM LETTER I;Lo;0;L;;;;;N;;;;; +1A4E;TAI THAM LETTER II;Lo;0;L;;;;;N;;;;; +1A4F;TAI THAM LETTER U;Lo;0;L;;;;;N;;;;; +1A50;TAI THAM LETTER UU;Lo;0;L;;;;;N;;;;; +1A51;TAI THAM LETTER EE;Lo;0;L;;;;;N;;;;; +1A52;TAI THAM LETTER OO;Lo;0;L;;;;;N;;;;; +1A53;TAI THAM LETTER LAE;Lo;0;L;;;;;N;;;;; +1A54;TAI THAM LETTER GREAT SA;Lo;0;L;;;;;N;;;;; +1A55;TAI THAM CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; +1A56;TAI THAM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;; +1A57;TAI THAM CONSONANT SIGN LA TANG LAI;Mc;0;L;;;;;N;;;;; +1A58;TAI THAM SIGN MAI KANG LAI;Mn;0;NSM;;;;;N;;;;; +1A59;TAI THAM CONSONANT SIGN FINAL NGA;Mn;0;NSM;;;;;N;;;;; +1A5A;TAI THAM CONSONANT SIGN LOW PA;Mn;0;NSM;;;;;N;;;;; +1A5B;TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA;Mn;0;NSM;;;;;N;;;;; +1A5C;TAI THAM CONSONANT SIGN MA;Mn;0;NSM;;;;;N;;;;; +1A5D;TAI THAM CONSONANT SIGN BA;Mn;0;NSM;;;;;N;;;;; +1A5E;TAI THAM CONSONANT SIGN SA;Mn;0;NSM;;;;;N;;;;; +1A60;TAI THAM SIGN SAKOT;Mn;9;NSM;;;;;N;;;;; +1A61;TAI THAM VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +1A62;TAI THAM VOWEL SIGN MAI SAT;Mn;0;NSM;;;;;N;;;;; +1A63;TAI THAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1A64;TAI THAM VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;; +1A65;TAI THAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1A66;TAI THAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +1A67;TAI THAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +1A68;TAI THAM VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;; +1A69;TAI THAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1A6A;TAI THAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1A6B;TAI THAM VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +1A6C;TAI THAM VOWEL SIGN OA BELOW;Mn;0;NSM;;;;;N;;;;; +1A6D;TAI THAM VOWEL SIGN OY;Mc;0;L;;;;;N;;;;; +1A6E;TAI THAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1A6F;TAI THAM VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +1A70;TAI THAM VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1A71;TAI THAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +1A72;TAI THAM VOWEL SIGN THAM AI;Mc;0;L;;;;;N;;;;; +1A73;TAI THAM VOWEL SIGN OA ABOVE;Mn;0;NSM;;;;;N;;;;; +1A74;TAI THAM SIGN MAI KANG;Mn;0;NSM;;;;;N;;;;; +1A75;TAI THAM SIGN TONE-1;Mn;230;NSM;;;;;N;;;;; +1A76;TAI THAM SIGN TONE-2;Mn;230;NSM;;;;;N;;;;; +1A77;TAI THAM SIGN KHUEN TONE-3;Mn;230;NSM;;;;;N;;;;; +1A78;TAI THAM SIGN KHUEN TONE-4;Mn;230;NSM;;;;;N;;;;; +1A79;TAI THAM SIGN KHUEN TONE-5;Mn;230;NSM;;;;;N;;;;; +1A7A;TAI THAM SIGN RA HAAM;Mn;230;NSM;;;;;N;;;;; +1A7B;TAI THAM SIGN MAI SAM;Mn;230;NSM;;;;;N;;;;; +1A7C;TAI THAM SIGN KHUEN-LUE KARAN;Mn;230;NSM;;;;;N;;;;; +1A7F;TAI THAM COMBINING CRYPTOGRAMMIC DOT;Mn;220;NSM;;;;;N;;;;; +1A80;TAI THAM HORA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1A81;TAI THAM HORA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1A82;TAI THAM HORA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1A83;TAI THAM HORA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1A84;TAI THAM HORA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1A85;TAI THAM HORA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1A86;TAI THAM HORA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1A87;TAI THAM HORA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1A88;TAI THAM HORA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1A89;TAI THAM HORA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1A90;TAI THAM THAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1A91;TAI THAM THAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1A92;TAI THAM THAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1A93;TAI THAM THAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1A94;TAI THAM THAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1A95;TAI THAM THAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1A96;TAI THAM THAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1A97;TAI THAM THAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1A98;TAI THAM THAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1A99;TAI THAM THAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1AA0;TAI THAM SIGN WIANG;Po;0;L;;;;;N;;;;; +1AA1;TAI THAM SIGN WIANGWAAK;Po;0;L;;;;;N;;;;; +1AA2;TAI THAM SIGN SAWAN;Po;0;L;;;;;N;;;;; +1AA3;TAI THAM SIGN KEOW;Po;0;L;;;;;N;;;;; +1AA4;TAI THAM SIGN HOY;Po;0;L;;;;;N;;;;; +1AA5;TAI THAM SIGN DOKMAI;Po;0;L;;;;;N;;;;; +1AA6;TAI THAM SIGN REVERSED ROTATED RANA;Po;0;L;;;;;N;;;;; +1AA7;TAI THAM SIGN MAI YAMOK;Lm;0;L;;;;;N;;;;; +1AA8;TAI THAM SIGN KAAN;Po;0;L;;;;;N;;;;; +1AA9;TAI THAM SIGN KAANKUU;Po;0;L;;;;;N;;;;; +1AAA;TAI THAM SIGN SATKAAN;Po;0;L;;;;;N;;;;; +1AAB;TAI THAM SIGN SATKAANKUU;Po;0;L;;;;;N;;;;; +1AAC;TAI THAM SIGN HANG;Po;0;L;;;;;N;;;;; +1AAD;TAI THAM SIGN CAANG;Po;0;L;;;;;N;;;;; +1B00;BALINESE SIGN ULU RICEM;Mn;0;NSM;;;;;N;;;;; +1B01;BALINESE SIGN ULU CANDRA;Mn;0;NSM;;;;;N;;;;; +1B02;BALINESE SIGN CECEK;Mn;0;NSM;;;;;N;;;;; +1B03;BALINESE SIGN SURANG;Mn;0;NSM;;;;;N;;;;; +1B04;BALINESE SIGN BISAH;Mc;0;L;;;;;N;;;;; +1B05;BALINESE LETTER AKARA;Lo;0;L;;;;;N;;;;; +1B06;BALINESE LETTER AKARA TEDUNG;Lo;0;L;1B05 1B35;;;;N;;;;; +1B07;BALINESE LETTER IKARA;Lo;0;L;;;;;N;;;;; +1B08;BALINESE LETTER IKARA TEDUNG;Lo;0;L;1B07 1B35;;;;N;;;;; +1B09;BALINESE LETTER UKARA;Lo;0;L;;;;;N;;;;; +1B0A;BALINESE LETTER UKARA TEDUNG;Lo;0;L;1B09 1B35;;;;N;;;;; +1B0B;BALINESE LETTER RA REPA;Lo;0;L;;;;;N;;;;; +1B0C;BALINESE LETTER RA REPA TEDUNG;Lo;0;L;1B0B 1B35;;;;N;;;;; +1B0D;BALINESE LETTER LA LENGA;Lo;0;L;;;;;N;;;;; +1B0E;BALINESE LETTER LA LENGA TEDUNG;Lo;0;L;1B0D 1B35;;;;N;;;;; +1B0F;BALINESE LETTER EKARA;Lo;0;L;;;;;N;;;;; +1B10;BALINESE LETTER AIKARA;Lo;0;L;;;;;N;;;;; +1B11;BALINESE LETTER OKARA;Lo;0;L;;;;;N;;;;; +1B12;BALINESE LETTER OKARA TEDUNG;Lo;0;L;1B11 1B35;;;;N;;;;; +1B13;BALINESE LETTER KA;Lo;0;L;;;;;N;;;;; +1B14;BALINESE LETTER KA MAHAPRANA;Lo;0;L;;;;;N;;;;; +1B15;BALINESE LETTER GA;Lo;0;L;;;;;N;;;;; +1B16;BALINESE LETTER GA GORA;Lo;0;L;;;;;N;;;;; +1B17;BALINESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1B18;BALINESE LETTER CA;Lo;0;L;;;;;N;;;;; +1B19;BALINESE LETTER CA LACA;Lo;0;L;;;;;N;;;;; +1B1A;BALINESE LETTER JA;Lo;0;L;;;;;N;;;;; +1B1B;BALINESE LETTER JA JERA;Lo;0;L;;;;;N;;;;; +1B1C;BALINESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1B1D;BALINESE LETTER TA LATIK;Lo;0;L;;;;;N;;;;; +1B1E;BALINESE LETTER TA MURDA MAHAPRANA;Lo;0;L;;;;;N;;;;; +1B1F;BALINESE LETTER DA MURDA ALPAPRANA;Lo;0;L;;;;;N;;;;; +1B20;BALINESE LETTER DA MURDA MAHAPRANA;Lo;0;L;;;;;N;;;;; +1B21;BALINESE LETTER NA RAMBAT;Lo;0;L;;;;;N;;;;; +1B22;BALINESE LETTER TA;Lo;0;L;;;;;N;;;;; +1B23;BALINESE LETTER TA TAWA;Lo;0;L;;;;;N;;;;; +1B24;BALINESE LETTER DA;Lo;0;L;;;;;N;;;;; +1B25;BALINESE LETTER DA MADU;Lo;0;L;;;;;N;;;;; +1B26;BALINESE LETTER NA;Lo;0;L;;;;;N;;;;; +1B27;BALINESE LETTER PA;Lo;0;L;;;;;N;;;;; +1B28;BALINESE LETTER PA KAPAL;Lo;0;L;;;;;N;;;;; +1B29;BALINESE LETTER BA;Lo;0;L;;;;;N;;;;; +1B2A;BALINESE LETTER BA KEMBANG;Lo;0;L;;;;;N;;;;; +1B2B;BALINESE LETTER MA;Lo;0;L;;;;;N;;;;; +1B2C;BALINESE LETTER YA;Lo;0;L;;;;;N;;;;; +1B2D;BALINESE LETTER RA;Lo;0;L;;;;;N;;;;; +1B2E;BALINESE LETTER LA;Lo;0;L;;;;;N;;;;; +1B2F;BALINESE LETTER WA;Lo;0;L;;;;;N;;;;; +1B30;BALINESE LETTER SA SAGA;Lo;0;L;;;;;N;;;;; +1B31;BALINESE LETTER SA SAPA;Lo;0;L;;;;;N;;;;; +1B32;BALINESE LETTER SA;Lo;0;L;;;;;N;;;;; +1B33;BALINESE LETTER HA;Lo;0;L;;;;;N;;;;; +1B34;BALINESE SIGN REREKAN;Mn;7;NSM;;;;;N;;;;; +1B35;BALINESE VOWEL SIGN TEDUNG;Mc;0;L;;;;;N;;;;; +1B36;BALINESE VOWEL SIGN ULU;Mn;0;NSM;;;;;N;;;;; +1B37;BALINESE VOWEL SIGN ULU SARI;Mn;0;NSM;;;;;N;;;;; +1B38;BALINESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;; +1B39;BALINESE VOWEL SIGN SUKU ILUT;Mn;0;NSM;;;;;N;;;;; +1B3A;BALINESE VOWEL SIGN RA REPA;Mn;0;NSM;;;;;N;;;;; +1B3B;BALINESE VOWEL SIGN RA REPA TEDUNG;Mc;0;L;1B3A 1B35;;;;N;;;;; +1B3C;BALINESE VOWEL SIGN LA LENGA;Mn;0;NSM;;;;;N;;;;; +1B3D;BALINESE VOWEL SIGN LA LENGA TEDUNG;Mc;0;L;1B3C 1B35;;;;N;;;;; +1B3E;BALINESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;; +1B3F;BALINESE VOWEL SIGN TALING REPA;Mc;0;L;;;;;N;;;;; +1B40;BALINESE VOWEL SIGN TALING TEDUNG;Mc;0;L;1B3E 1B35;;;;N;;;;; +1B41;BALINESE VOWEL SIGN TALING REPA TEDUNG;Mc;0;L;1B3F 1B35;;;;N;;;;; +1B42;BALINESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;; +1B43;BALINESE VOWEL SIGN PEPET TEDUNG;Mc;0;L;1B42 1B35;;;;N;;;;; +1B44;BALINESE ADEG ADEG;Mc;9;L;;;;;N;;;;; +1B45;BALINESE LETTER KAF SASAK;Lo;0;L;;;;;N;;;;; +1B46;BALINESE LETTER KHOT SASAK;Lo;0;L;;;;;N;;;;; +1B47;BALINESE LETTER TZIR SASAK;Lo;0;L;;;;;N;;;;; +1B48;BALINESE LETTER EF SASAK;Lo;0;L;;;;;N;;;;; +1B49;BALINESE LETTER VE SASAK;Lo;0;L;;;;;N;;;;; +1B4A;BALINESE LETTER ZAL SASAK;Lo;0;L;;;;;N;;;;; +1B4B;BALINESE LETTER ASYURA SASAK;Lo;0;L;;;;;N;;;;; +1B50;BALINESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1B51;BALINESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1B52;BALINESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1B53;BALINESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1B54;BALINESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1B55;BALINESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1B56;BALINESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1B57;BALINESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1B58;BALINESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1B59;BALINESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1B5A;BALINESE PANTI;Po;0;L;;;;;N;;;;; +1B5B;BALINESE PAMADA;Po;0;L;;;;;N;;;;; +1B5C;BALINESE WINDU;Po;0;L;;;;;N;;;;; +1B5D;BALINESE CARIK PAMUNGKAH;Po;0;L;;;;;N;;;;; +1B5E;BALINESE CARIK SIKI;Po;0;L;;;;;N;;;;; +1B5F;BALINESE CARIK PAREREN;Po;0;L;;;;;N;;;;; +1B60;BALINESE PAMENENG;Po;0;L;;;;;N;;;;; +1B61;BALINESE MUSICAL SYMBOL DONG;So;0;L;;;;;N;;;;; +1B62;BALINESE MUSICAL SYMBOL DENG;So;0;L;;;;;N;;;;; +1B63;BALINESE MUSICAL SYMBOL DUNG;So;0;L;;;;;N;;;;; +1B64;BALINESE MUSICAL SYMBOL DANG;So;0;L;;;;;N;;;;; +1B65;BALINESE MUSICAL SYMBOL DANG SURANG;So;0;L;;;;;N;;;;; +1B66;BALINESE MUSICAL SYMBOL DING;So;0;L;;;;;N;;;;; +1B67;BALINESE MUSICAL SYMBOL DAENG;So;0;L;;;;;N;;;;; +1B68;BALINESE MUSICAL SYMBOL DEUNG;So;0;L;;;;;N;;;;; +1B69;BALINESE MUSICAL SYMBOL DAING;So;0;L;;;;;N;;;;; +1B6A;BALINESE MUSICAL SYMBOL DANG GEDE;So;0;L;;;;;N;;;;; +1B6B;BALINESE MUSICAL SYMBOL COMBINING TEGEH;Mn;230;NSM;;;;;N;;;;; +1B6C;BALINESE MUSICAL SYMBOL COMBINING ENDEP;Mn;220;NSM;;;;;N;;;;; +1B6D;BALINESE MUSICAL SYMBOL COMBINING KEMPUL;Mn;230;NSM;;;;;N;;;;; +1B6E;BALINESE MUSICAL SYMBOL COMBINING KEMPLI;Mn;230;NSM;;;;;N;;;;; +1B6F;BALINESE MUSICAL SYMBOL COMBINING JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B70;BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B71;BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B72;BALINESE MUSICAL SYMBOL COMBINING BENDE;Mn;230;NSM;;;;;N;;;;; +1B73;BALINESE MUSICAL SYMBOL COMBINING GONG;Mn;230;NSM;;;;;N;;;;; +1B74;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG;So;0;L;;;;;N;;;;; +1B75;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG;So;0;L;;;;;N;;;;; +1B76;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK;So;0;L;;;;;N;;;;; +1B77;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK;So;0;L;;;;;N;;;;; +1B78;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG;So;0;L;;;;;N;;;;; +1B79;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG;So;0;L;;;;;N;;;;; +1B7A;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK;So;0;L;;;;;N;;;;; +1B7B;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK;So;0;L;;;;;N;;;;; +1B7C;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING;So;0;L;;;;;N;;;;; +1B80;SUNDANESE SIGN PANYECEK;Mn;0;NSM;;;;;N;;;;; +1B81;SUNDANESE SIGN PANGLAYAR;Mn;0;NSM;;;;;N;;;;; +1B82;SUNDANESE SIGN PANGWISAD;Mc;0;L;;;;;N;;;;; +1B83;SUNDANESE LETTER A;Lo;0;L;;;;;N;;;;; +1B84;SUNDANESE LETTER I;Lo;0;L;;;;;N;;;;; +1B85;SUNDANESE LETTER U;Lo;0;L;;;;;N;;;;; +1B86;SUNDANESE LETTER AE;Lo;0;L;;;;;N;;;;; +1B87;SUNDANESE LETTER O;Lo;0;L;;;;;N;;;;; +1B88;SUNDANESE LETTER E;Lo;0;L;;;;;N;;;;; +1B89;SUNDANESE LETTER EU;Lo;0;L;;;;;N;;;;; +1B8A;SUNDANESE LETTER KA;Lo;0;L;;;;;N;;;;; +1B8B;SUNDANESE LETTER QA;Lo;0;L;;;;;N;;;;; +1B8C;SUNDANESE LETTER GA;Lo;0;L;;;;;N;;;;; +1B8D;SUNDANESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1B8E;SUNDANESE LETTER CA;Lo;0;L;;;;;N;;;;; +1B8F;SUNDANESE LETTER JA;Lo;0;L;;;;;N;;;;; +1B90;SUNDANESE LETTER ZA;Lo;0;L;;;;;N;;;;; +1B91;SUNDANESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1B92;SUNDANESE LETTER TA;Lo;0;L;;;;;N;;;;; +1B93;SUNDANESE LETTER DA;Lo;0;L;;;;;N;;;;; +1B94;SUNDANESE LETTER NA;Lo;0;L;;;;;N;;;;; +1B95;SUNDANESE LETTER PA;Lo;0;L;;;;;N;;;;; +1B96;SUNDANESE LETTER FA;Lo;0;L;;;;;N;;;;; +1B97;SUNDANESE LETTER VA;Lo;0;L;;;;;N;;;;; +1B98;SUNDANESE LETTER BA;Lo;0;L;;;;;N;;;;; +1B99;SUNDANESE LETTER MA;Lo;0;L;;;;;N;;;;; +1B9A;SUNDANESE LETTER YA;Lo;0;L;;;;;N;;;;; +1B9B;SUNDANESE LETTER RA;Lo;0;L;;;;;N;;;;; +1B9C;SUNDANESE LETTER LA;Lo;0;L;;;;;N;;;;; +1B9D;SUNDANESE LETTER WA;Lo;0;L;;;;;N;;;;; +1B9E;SUNDANESE LETTER SA;Lo;0;L;;;;;N;;;;; +1B9F;SUNDANESE LETTER XA;Lo;0;L;;;;;N;;;;; +1BA0;SUNDANESE LETTER HA;Lo;0;L;;;;;N;;;;; +1BA1;SUNDANESE CONSONANT SIGN PAMINGKAL;Mc;0;L;;;;;N;;;;; +1BA2;SUNDANESE CONSONANT SIGN PANYAKRA;Mn;0;NSM;;;;;N;;;;; +1BA3;SUNDANESE CONSONANT SIGN PANYIKU;Mn;0;NSM;;;;;N;;;;; +1BA4;SUNDANESE VOWEL SIGN PANGHULU;Mn;0;NSM;;;;;N;;;;; +1BA5;SUNDANESE VOWEL SIGN PANYUKU;Mn;0;NSM;;;;;N;;;;; +1BA6;SUNDANESE VOWEL SIGN PANAELAENG;Mc;0;L;;;;;N;;;;; +1BA7;SUNDANESE VOWEL SIGN PANOLONG;Mc;0;L;;;;;N;;;;; +1BA8;SUNDANESE VOWEL SIGN PAMEPET;Mn;0;NSM;;;;;N;;;;; +1BA9;SUNDANESE VOWEL SIGN PANEULEUNG;Mn;0;NSM;;;;;N;;;;; +1BAA;SUNDANESE SIGN PAMAAEH;Mc;9;L;;;;;N;;;;; +1BAE;SUNDANESE LETTER KHA;Lo;0;L;;;;;N;;;;; +1BAF;SUNDANESE LETTER SYA;Lo;0;L;;;;;N;;;;; +1BB0;SUNDANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1BB1;SUNDANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1BB2;SUNDANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1BB3;SUNDANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1BB4;SUNDANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1BB5;SUNDANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1BB6;SUNDANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1BB7;SUNDANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1BB8;SUNDANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1BB9;SUNDANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1C00;LEPCHA LETTER KA;Lo;0;L;;;;;N;;;;; +1C01;LEPCHA LETTER KLA;Lo;0;L;;;;;N;;;;; +1C02;LEPCHA LETTER KHA;Lo;0;L;;;;;N;;;;; +1C03;LEPCHA LETTER GA;Lo;0;L;;;;;N;;;;; +1C04;LEPCHA LETTER GLA;Lo;0;L;;;;;N;;;;; +1C05;LEPCHA LETTER NGA;Lo;0;L;;;;;N;;;;; +1C06;LEPCHA LETTER CA;Lo;0;L;;;;;N;;;;; +1C07;LEPCHA LETTER CHA;Lo;0;L;;;;;N;;;;; +1C08;LEPCHA LETTER JA;Lo;0;L;;;;;N;;;;; +1C09;LEPCHA LETTER NYA;Lo;0;L;;;;;N;;;;; +1C0A;LEPCHA LETTER TA;Lo;0;L;;;;;N;;;;; +1C0B;LEPCHA LETTER THA;Lo;0;L;;;;;N;;;;; +1C0C;LEPCHA LETTER DA;Lo;0;L;;;;;N;;;;; +1C0D;LEPCHA LETTER NA;Lo;0;L;;;;;N;;;;; +1C0E;LEPCHA LETTER PA;Lo;0;L;;;;;N;;;;; +1C0F;LEPCHA LETTER PLA;Lo;0;L;;;;;N;;;;; +1C10;LEPCHA LETTER PHA;Lo;0;L;;;;;N;;;;; +1C11;LEPCHA LETTER FA;Lo;0;L;;;;;N;;;;; +1C12;LEPCHA LETTER FLA;Lo;0;L;;;;;N;;;;; +1C13;LEPCHA LETTER BA;Lo;0;L;;;;;N;;;;; +1C14;LEPCHA LETTER BLA;Lo;0;L;;;;;N;;;;; +1C15;LEPCHA LETTER MA;Lo;0;L;;;;;N;;;;; +1C16;LEPCHA LETTER MLA;Lo;0;L;;;;;N;;;;; +1C17;LEPCHA LETTER TSA;Lo;0;L;;;;;N;;;;; +1C18;LEPCHA LETTER TSHA;Lo;0;L;;;;;N;;;;; +1C19;LEPCHA LETTER DZA;Lo;0;L;;;;;N;;;;; +1C1A;LEPCHA LETTER YA;Lo;0;L;;;;;N;;;;; +1C1B;LEPCHA LETTER RA;Lo;0;L;;;;;N;;;;; +1C1C;LEPCHA LETTER LA;Lo;0;L;;;;;N;;;;; +1C1D;LEPCHA LETTER HA;Lo;0;L;;;;;N;;;;; +1C1E;LEPCHA LETTER HLA;Lo;0;L;;;;;N;;;;; +1C1F;LEPCHA LETTER VA;Lo;0;L;;;;;N;;;;; +1C20;LEPCHA LETTER SA;Lo;0;L;;;;;N;;;;; +1C21;LEPCHA LETTER SHA;Lo;0;L;;;;;N;;;;; +1C22;LEPCHA LETTER WA;Lo;0;L;;;;;N;;;;; +1C23;LEPCHA LETTER A;Lo;0;L;;;;;N;;;;; +1C24;LEPCHA SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; +1C25;LEPCHA SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; +1C26;LEPCHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1C27;LEPCHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1C28;LEPCHA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1C29;LEPCHA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1C2A;LEPCHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +1C2B;LEPCHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +1C2C;LEPCHA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1C2D;LEPCHA CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;; +1C2E;LEPCHA CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;; +1C2F;LEPCHA CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;; +1C30;LEPCHA CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +1C31;LEPCHA CONSONANT SIGN P;Mn;0;NSM;;;;;N;;;;; +1C32;LEPCHA CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +1C33;LEPCHA CONSONANT SIGN T;Mn;0;NSM;;;;;N;;;;; +1C34;LEPCHA CONSONANT SIGN NYIN-DO;Mc;0;L;;;;;N;;;;; +1C35;LEPCHA CONSONANT SIGN KANG;Mc;0;L;;;;;N;;;;; +1C36;LEPCHA SIGN RAN;Mn;0;NSM;;;;;N;;;;; +1C37;LEPCHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +1C3B;LEPCHA PUNCTUATION TA-ROL;Po;0;L;;;;;N;;;;; +1C3C;LEPCHA PUNCTUATION NYET THYOOM TA-ROL;Po;0;L;;;;;N;;;;; +1C3D;LEPCHA PUNCTUATION CER-WA;Po;0;L;;;;;N;;;;; +1C3E;LEPCHA PUNCTUATION TSHOOK CER-WA;Po;0;L;;;;;N;;;;; +1C3F;LEPCHA PUNCTUATION TSHOOK;Po;0;L;;;;;N;;;;; +1C40;LEPCHA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1C41;LEPCHA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1C42;LEPCHA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1C43;LEPCHA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1C44;LEPCHA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1C45;LEPCHA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1C46;LEPCHA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1C47;LEPCHA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1C48;LEPCHA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1C49;LEPCHA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1C4D;LEPCHA LETTER TTA;Lo;0;L;;;;;N;;;;; +1C4E;LEPCHA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1C4F;LEPCHA LETTER DDA;Lo;0;L;;;;;N;;;;; +1C50;OL CHIKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1C51;OL CHIKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1C52;OL CHIKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1C53;OL CHIKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1C54;OL CHIKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1C55;OL CHIKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1C56;OL CHIKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1C57;OL CHIKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1C58;OL CHIKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1C59;OL CHIKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1C5A;OL CHIKI LETTER LA;Lo;0;L;;;;;N;;;;; +1C5B;OL CHIKI LETTER AT;Lo;0;L;;;;;N;;;;; +1C5C;OL CHIKI LETTER AG;Lo;0;L;;;;;N;;;;; +1C5D;OL CHIKI LETTER ANG;Lo;0;L;;;;;N;;;;; +1C5E;OL CHIKI LETTER AL;Lo;0;L;;;;;N;;;;; +1C5F;OL CHIKI LETTER LAA;Lo;0;L;;;;;N;;;;; +1C60;OL CHIKI LETTER AAK;Lo;0;L;;;;;N;;;;; +1C61;OL CHIKI LETTER AAJ;Lo;0;L;;;;;N;;;;; +1C62;OL CHIKI LETTER AAM;Lo;0;L;;;;;N;;;;; +1C63;OL CHIKI LETTER AAW;Lo;0;L;;;;;N;;;;; +1C64;OL CHIKI LETTER LI;Lo;0;L;;;;;N;;;;; +1C65;OL CHIKI LETTER IS;Lo;0;L;;;;;N;;;;; +1C66;OL CHIKI LETTER IH;Lo;0;L;;;;;N;;;;; +1C67;OL CHIKI LETTER INY;Lo;0;L;;;;;N;;;;; +1C68;OL CHIKI LETTER IR;Lo;0;L;;;;;N;;;;; +1C69;OL CHIKI LETTER LU;Lo;0;L;;;;;N;;;;; +1C6A;OL CHIKI LETTER UC;Lo;0;L;;;;;N;;;;; +1C6B;OL CHIKI LETTER UD;Lo;0;L;;;;;N;;;;; +1C6C;OL CHIKI LETTER UNN;Lo;0;L;;;;;N;;;;; +1C6D;OL CHIKI LETTER UY;Lo;0;L;;;;;N;;;;; +1C6E;OL CHIKI LETTER LE;Lo;0;L;;;;;N;;;;; +1C6F;OL CHIKI LETTER EP;Lo;0;L;;;;;N;;;;; +1C70;OL CHIKI LETTER EDD;Lo;0;L;;;;;N;;;;; +1C71;OL CHIKI LETTER EN;Lo;0;L;;;;;N;;;;; +1C72;OL CHIKI LETTER ERR;Lo;0;L;;;;;N;;;;; +1C73;OL CHIKI LETTER LO;Lo;0;L;;;;;N;;;;; +1C74;OL CHIKI LETTER OTT;Lo;0;L;;;;;N;;;;; +1C75;OL CHIKI LETTER OB;Lo;0;L;;;;;N;;;;; +1C76;OL CHIKI LETTER OV;Lo;0;L;;;;;N;;;;; +1C77;OL CHIKI LETTER OH;Lo;0;L;;;;;N;;;;; +1C78;OL CHIKI MU TTUDDAG;Lm;0;L;;;;;N;;;;; +1C79;OL CHIKI GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; +1C7A;OL CHIKI MU-GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; +1C7B;OL CHIKI RELAA;Lm;0;L;;;;;N;;;;; +1C7C;OL CHIKI PHAARKAA;Lm;0;L;;;;;N;;;;; +1C7D;OL CHIKI AHAD;Lm;0;L;;;;;N;;;;; +1C7E;OL CHIKI PUNCTUATION MUCAAD;Po;0;L;;;;;N;;;;; +1C7F;OL CHIKI PUNCTUATION DOUBLE MUCAAD;Po;0;L;;;;;N;;;;; +1CD0;VEDIC TONE KARSHANA;Mn;230;NSM;;;;;N;;;;; +1CD1;VEDIC TONE SHARA;Mn;230;NSM;;;;;N;;;;; +1CD2;VEDIC TONE PRENKHA;Mn;230;NSM;;;;;N;;;;; +1CD3;VEDIC SIGN NIHSHVASA;Po;0;L;;;;;N;;;;; +1CD4;VEDIC SIGN YAJURVEDIC MIDLINE SVARITA;Mn;1;NSM;;;;;N;;;;; +1CD5;VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; +1CD6;VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; +1CD7;VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; +1CD8;VEDIC TONE CANDRA BELOW;Mn;220;NSM;;;;;N;;;;; +1CD9;VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER;Mn;220;NSM;;;;;N;;;;; +1CDA;VEDIC TONE DOUBLE SVARITA;Mn;230;NSM;;;;;N;;;;; +1CDB;VEDIC TONE TRIPLE SVARITA;Mn;230;NSM;;;;;N;;;;; +1CDC;VEDIC TONE KATHAKA ANUDATTA;Mn;220;NSM;;;;;N;;;;; +1CDD;VEDIC TONE DOT BELOW;Mn;220;NSM;;;;;N;;;;; +1CDE;VEDIC TONE TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +1CDF;VEDIC TONE THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +1CE0;VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA;Mn;230;NSM;;;;;N;;;;; +1CE1;VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA;Mc;0;L;;;;;N;;;;; +1CE2;VEDIC SIGN VISARGA SVARITA;Mn;1;NSM;;;;;N;;;;; +1CE3;VEDIC SIGN VISARGA UDATTA;Mn;1;NSM;;;;;N;;;;; +1CE4;VEDIC SIGN REVERSED VISARGA UDATTA;Mn;1;NSM;;;;;N;;;;; +1CE5;VEDIC SIGN VISARGA ANUDATTA;Mn;1;NSM;;;;;N;;;;; +1CE6;VEDIC SIGN REVERSED VISARGA ANUDATTA;Mn;1;NSM;;;;;N;;;;; +1CE7;VEDIC SIGN VISARGA UDATTA WITH TAIL;Mn;1;NSM;;;;;N;;;;; +1CE8;VEDIC SIGN VISARGA ANUDATTA WITH TAIL;Mn;1;NSM;;;;;N;;;;; +1CE9;VEDIC SIGN ANUSVARA ANTARGOMUKHA;Lo;0;L;;;;;N;;;;; +1CEA;VEDIC SIGN ANUSVARA BAHIRGOMUKHA;Lo;0;L;;;;;N;;;;; +1CEB;VEDIC SIGN ANUSVARA VAMAGOMUKHA;Lo;0;L;;;;;N;;;;; +1CEC;VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL;Lo;0;L;;;;;N;;;;; +1CED;VEDIC SIGN TIRYAK;Mn;220;NSM;;;;;N;;;;; +1CEE;VEDIC SIGN HEXIFORM LONG ANUSVARA;Lo;0;L;;;;;N;;;;; +1CEF;VEDIC SIGN LONG ANUSVARA;Lo;0;L;;;;;N;;;;; +1CF0;VEDIC SIGN RTHANG LONG ANUSVARA;Lo;0;L;;;;;N;;;;; +1CF1;VEDIC SIGN ANUSVARA UBHAYATO MUKHA;Lo;0;L;;;;;N;;;;; +1CF2;VEDIC SIGN ARDHAVISARGA;Mc;0;L;;;;;N;;;;; +1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;; +1D01;LATIN LETTER SMALL CAPITAL AE;Ll;0;L;;;;;N;;;;; +1D02;LATIN SMALL LETTER TURNED AE;Ll;0;L;;;;;N;;;;; +1D03;LATIN LETTER SMALL CAPITAL BARRED B;Ll;0;L;;;;;N;;;;; +1D04;LATIN LETTER SMALL CAPITAL C;Ll;0;L;;;;;N;;;;; +1D05;LATIN LETTER SMALL CAPITAL D;Ll;0;L;;;;;N;;;;; +1D06;LATIN LETTER SMALL CAPITAL ETH;Ll;0;L;;;;;N;;;;; +1D07;LATIN LETTER SMALL CAPITAL E;Ll;0;L;;;;;N;;;;; +1D08;LATIN SMALL LETTER TURNED OPEN E;Ll;0;L;;;;;N;;;;; +1D09;LATIN SMALL LETTER TURNED I;Ll;0;L;;;;;N;;;;; +1D0A;LATIN LETTER SMALL CAPITAL J;Ll;0;L;;;;;N;;;;; +1D0B;LATIN LETTER SMALL CAPITAL K;Ll;0;L;;;;;N;;;;; +1D0C;LATIN LETTER SMALL CAPITAL L WITH STROKE;Ll;0;L;;;;;N;;;;; +1D0D;LATIN LETTER SMALL CAPITAL M;Ll;0;L;;;;;N;;;;; +1D0E;LATIN LETTER SMALL CAPITAL REVERSED N;Ll;0;L;;;;;N;;;;; +1D0F;LATIN LETTER SMALL CAPITAL O;Ll;0;L;;;;;N;;;;; +1D10;LATIN LETTER SMALL CAPITAL OPEN O;Ll;0;L;;;;;N;;;;; +1D11;LATIN SMALL LETTER SIDEWAYS O;Ll;0;L;;;;;N;;;;; +1D12;LATIN SMALL LETTER SIDEWAYS OPEN O;Ll;0;L;;;;;N;;;;; +1D13;LATIN SMALL LETTER SIDEWAYS O WITH STROKE;Ll;0;L;;;;;N;;;;; +1D14;LATIN SMALL LETTER TURNED OE;Ll;0;L;;;;;N;;;;; +1D15;LATIN LETTER SMALL CAPITAL OU;Ll;0;L;;;;;N;;;;; +1D16;LATIN SMALL LETTER TOP HALF O;Ll;0;L;;;;;N;;;;; +1D17;LATIN SMALL LETTER BOTTOM HALF O;Ll;0;L;;;;;N;;;;; +1D18;LATIN LETTER SMALL CAPITAL P;Ll;0;L;;;;;N;;;;; +1D19;LATIN LETTER SMALL CAPITAL REVERSED R;Ll;0;L;;;;;N;;;;; +1D1A;LATIN LETTER SMALL CAPITAL TURNED R;Ll;0;L;;;;;N;;;;; +1D1B;LATIN LETTER SMALL CAPITAL T;Ll;0;L;;;;;N;;;;; +1D1C;LATIN LETTER SMALL CAPITAL U;Ll;0;L;;;;;N;;;;; +1D1D;LATIN SMALL LETTER SIDEWAYS U;Ll;0;L;;;;;N;;;;; +1D1E;LATIN SMALL LETTER SIDEWAYS DIAERESIZED U;Ll;0;L;;;;;N;;;;; +1D1F;LATIN SMALL LETTER SIDEWAYS TURNED M;Ll;0;L;;;;;N;;;;; +1D20;LATIN LETTER SMALL CAPITAL V;Ll;0;L;;;;;N;;;;; +1D21;LATIN LETTER SMALL CAPITAL W;Ll;0;L;;;;;N;;;;; +1D22;LATIN LETTER SMALL CAPITAL Z;Ll;0;L;;;;;N;;;;; +1D23;LATIN LETTER SMALL CAPITAL EZH;Ll;0;L;;;;;N;;;;; +1D24;LATIN LETTER VOICED LARYNGEAL SPIRANT;Ll;0;L;;;;;N;;;;; +1D25;LATIN LETTER AIN;Ll;0;L;;;;;N;;;;; +1D26;GREEK LETTER SMALL CAPITAL GAMMA;Ll;0;L;;;;;N;;;;; +1D27;GREEK LETTER SMALL CAPITAL LAMDA;Ll;0;L;;;;;N;;;;; +1D28;GREEK LETTER SMALL CAPITAL PI;Ll;0;L;;;;;N;;;;; +1D29;GREEK LETTER SMALL CAPITAL RHO;Ll;0;L;;;;;N;;;;; +1D2A;GREEK LETTER SMALL CAPITAL PSI;Ll;0;L;;;;;N;;;;; +1D2B;CYRILLIC LETTER SMALL CAPITAL EL;Ll;0;L;;;;;N;;;;; +1D2C;MODIFIER LETTER CAPITAL A;Lm;0;L;<super> 0041;;;;N;;;;; +1D2D;MODIFIER LETTER CAPITAL AE;Lm;0;L;<super> 00C6;;;;N;;;;; +1D2E;MODIFIER LETTER CAPITAL B;Lm;0;L;<super> 0042;;;;N;;;;; +1D2F;MODIFIER LETTER CAPITAL BARRED B;Lm;0;L;;;;;N;;;;; +1D30;MODIFIER LETTER CAPITAL D;Lm;0;L;<super> 0044;;;;N;;;;; +1D31;MODIFIER LETTER CAPITAL E;Lm;0;L;<super> 0045;;;;N;;;;; +1D32;MODIFIER LETTER CAPITAL REVERSED E;Lm;0;L;<super> 018E;;;;N;;;;; +1D33;MODIFIER LETTER CAPITAL G;Lm;0;L;<super> 0047;;;;N;;;;; +1D34;MODIFIER LETTER CAPITAL H;Lm;0;L;<super> 0048;;;;N;;;;; +1D35;MODIFIER LETTER CAPITAL I;Lm;0;L;<super> 0049;;;;N;;;;; +1D36;MODIFIER LETTER CAPITAL J;Lm;0;L;<super> 004A;;;;N;;;;; +1D37;MODIFIER LETTER CAPITAL K;Lm;0;L;<super> 004B;;;;N;;;;; +1D38;MODIFIER LETTER CAPITAL L;Lm;0;L;<super> 004C;;;;N;;;;; +1D39;MODIFIER LETTER CAPITAL M;Lm;0;L;<super> 004D;;;;N;;;;; +1D3A;MODIFIER LETTER CAPITAL N;Lm;0;L;<super> 004E;;;;N;;;;; +1D3B;MODIFIER LETTER CAPITAL REVERSED N;Lm;0;L;;;;;N;;;;; +1D3C;MODIFIER LETTER CAPITAL O;Lm;0;L;<super> 004F;;;;N;;;;; +1D3D;MODIFIER LETTER CAPITAL OU;Lm;0;L;<super> 0222;;;;N;;;;; +1D3E;MODIFIER LETTER CAPITAL P;Lm;0;L;<super> 0050;;;;N;;;;; +1D3F;MODIFIER LETTER CAPITAL R;Lm;0;L;<super> 0052;;;;N;;;;; +1D40;MODIFIER LETTER CAPITAL T;Lm;0;L;<super> 0054;;;;N;;;;; +1D41;MODIFIER LETTER CAPITAL U;Lm;0;L;<super> 0055;;;;N;;;;; +1D42;MODIFIER LETTER CAPITAL W;Lm;0;L;<super> 0057;;;;N;;;;; +1D43;MODIFIER LETTER SMALL A;Lm;0;L;<super> 0061;;;;N;;;;; +1D44;MODIFIER LETTER SMALL TURNED A;Lm;0;L;<super> 0250;;;;N;;;;; +1D45;MODIFIER LETTER SMALL ALPHA;Lm;0;L;<super> 0251;;;;N;;;;; +1D46;MODIFIER LETTER SMALL TURNED AE;Lm;0;L;<super> 1D02;;;;N;;;;; +1D47;MODIFIER LETTER SMALL B;Lm;0;L;<super> 0062;;;;N;;;;; +1D48;MODIFIER LETTER SMALL D;Lm;0;L;<super> 0064;;;;N;;;;; +1D49;MODIFIER LETTER SMALL E;Lm;0;L;<super> 0065;;;;N;;;;; +1D4A;MODIFIER LETTER SMALL SCHWA;Lm;0;L;<super> 0259;;;;N;;;;; +1D4B;MODIFIER LETTER SMALL OPEN E;Lm;0;L;<super> 025B;;;;N;;;;; +1D4C;MODIFIER LETTER SMALL TURNED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;; +1D4D;MODIFIER LETTER SMALL G;Lm;0;L;<super> 0067;;;;N;;;;; +1D4E;MODIFIER LETTER SMALL TURNED I;Lm;0;L;;;;;N;;;;; +1D4F;MODIFIER LETTER SMALL K;Lm;0;L;<super> 006B;;;;N;;;;; +1D50;MODIFIER LETTER SMALL M;Lm;0;L;<super> 006D;;;;N;;;;; +1D51;MODIFIER LETTER SMALL ENG;Lm;0;L;<super> 014B;;;;N;;;;; +1D52;MODIFIER LETTER SMALL O;Lm;0;L;<super> 006F;;;;N;;;;; +1D53;MODIFIER LETTER SMALL OPEN O;Lm;0;L;<super> 0254;;;;N;;;;; +1D54;MODIFIER LETTER SMALL TOP HALF O;Lm;0;L;<super> 1D16;;;;N;;;;; +1D55;MODIFIER LETTER SMALL BOTTOM HALF O;Lm;0;L;<super> 1D17;;;;N;;;;; +1D56;MODIFIER LETTER SMALL P;Lm;0;L;<super> 0070;;;;N;;;;; +1D57;MODIFIER LETTER SMALL T;Lm;0;L;<super> 0074;;;;N;;;;; +1D58;MODIFIER LETTER SMALL U;Lm;0;L;<super> 0075;;;;N;;;;; +1D59;MODIFIER LETTER SMALL SIDEWAYS U;Lm;0;L;<super> 1D1D;;;;N;;;;; +1D5A;MODIFIER LETTER SMALL TURNED M;Lm;0;L;<super> 026F;;;;N;;;;; +1D5B;MODIFIER LETTER SMALL V;Lm;0;L;<super> 0076;;;;N;;;;; +1D5C;MODIFIER LETTER SMALL AIN;Lm;0;L;<super> 1D25;;;;N;;;;; +1D5D;MODIFIER LETTER SMALL BETA;Lm;0;L;<super> 03B2;;;;N;;;;; +1D5E;MODIFIER LETTER SMALL GREEK GAMMA;Lm;0;L;<super> 03B3;;;;N;;;;; +1D5F;MODIFIER LETTER SMALL DELTA;Lm;0;L;<super> 03B4;;;;N;;;;; +1D60;MODIFIER LETTER SMALL GREEK PHI;Lm;0;L;<super> 03C6;;;;N;;;;; +1D61;MODIFIER LETTER SMALL CHI;Lm;0;L;<super> 03C7;;;;N;;;;; +1D62;LATIN SUBSCRIPT SMALL LETTER I;Ll;0;L;<sub> 0069;;;;N;;;;; +1D63;LATIN SUBSCRIPT SMALL LETTER R;Ll;0;L;<sub> 0072;;;;N;;;;; +1D64;LATIN SUBSCRIPT SMALL LETTER U;Ll;0;L;<sub> 0075;;;;N;;;;; +1D65;LATIN SUBSCRIPT SMALL LETTER V;Ll;0;L;<sub> 0076;;;;N;;;;; +1D66;GREEK SUBSCRIPT SMALL LETTER BETA;Ll;0;L;<sub> 03B2;;;;N;;;;; +1D67;GREEK SUBSCRIPT SMALL LETTER GAMMA;Ll;0;L;<sub> 03B3;;;;N;;;;; +1D68;GREEK SUBSCRIPT SMALL LETTER RHO;Ll;0;L;<sub> 03C1;;;;N;;;;; +1D69;GREEK SUBSCRIPT SMALL LETTER PHI;Ll;0;L;<sub> 03C6;;;;N;;;;; +1D6A;GREEK SUBSCRIPT SMALL LETTER CHI;Ll;0;L;<sub> 03C7;;;;N;;;;; +1D6B;LATIN SMALL LETTER UE;Ll;0;L;;;;;N;;;;; +1D6C;LATIN SMALL LETTER B WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6D;LATIN SMALL LETTER D WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6E;LATIN SMALL LETTER F WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6F;LATIN SMALL LETTER M WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D70;LATIN SMALL LETTER N WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D71;LATIN SMALL LETTER P WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D72;LATIN SMALL LETTER R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D73;LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D74;LATIN SMALL LETTER S WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D75;LATIN SMALL LETTER T WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D76;LATIN SMALL LETTER Z WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D77;LATIN SMALL LETTER TURNED G;Ll;0;L;;;;;N;;;;; +1D78;MODIFIER LETTER CYRILLIC EN;Lm;0;L;<super> 043D;;;;N;;;;; +1D79;LATIN SMALL LETTER INSULAR G;Ll;0;L;;;;;N;;;A77D;;A77D +1D7A;LATIN SMALL LETTER TH WITH STRIKETHROUGH;Ll;0;L;;;;;N;;;;; +1D7B;LATIN SMALL CAPITAL LETTER I WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7C;LATIN SMALL LETTER IOTA WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7D;LATIN SMALL LETTER P WITH STROKE;Ll;0;L;;;;;N;;;2C63;;2C63 +1D7E;LATIN SMALL CAPITAL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7F;LATIN SMALL LETTER UPSILON WITH STROKE;Ll;0;L;;;;;N;;;;; +1D80;LATIN SMALL LETTER B WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D81;LATIN SMALL LETTER D WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D82;LATIN SMALL LETTER F WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D83;LATIN SMALL LETTER G WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D84;LATIN SMALL LETTER K WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D85;LATIN SMALL LETTER L WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D86;LATIN SMALL LETTER M WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D87;LATIN SMALL LETTER N WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D88;LATIN SMALL LETTER P WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D89;LATIN SMALL LETTER R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8A;LATIN SMALL LETTER S WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8B;LATIN SMALL LETTER ESH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8C;LATIN SMALL LETTER V WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8D;LATIN SMALL LETTER X WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8E;LATIN SMALL LETTER Z WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8F;LATIN SMALL LETTER A WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D90;LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D91;LATIN SMALL LETTER D WITH HOOK AND TAIL;Ll;0;L;;;;;N;;;;; +1D92;LATIN SMALL LETTER E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D93;LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D94;LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D95;LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D96;LATIN SMALL LETTER I WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D97;LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D98;LATIN SMALL LETTER ESH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D99;LATIN SMALL LETTER U WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D9A;LATIN SMALL LETTER EZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D9B;MODIFIER LETTER SMALL TURNED ALPHA;Lm;0;L;<super> 0252;;;;N;;;;; +1D9C;MODIFIER LETTER SMALL C;Lm;0;L;<super> 0063;;;;N;;;;; +1D9D;MODIFIER LETTER SMALL C WITH CURL;Lm;0;L;<super> 0255;;;;N;;;;; +1D9E;MODIFIER LETTER SMALL ETH;Lm;0;L;<super> 00F0;;;;N;;;;; +1D9F;MODIFIER LETTER SMALL REVERSED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;; +1DA0;MODIFIER LETTER SMALL F;Lm;0;L;<super> 0066;;;;N;;;;; +1DA1;MODIFIER LETTER SMALL DOTLESS J WITH STROKE;Lm;0;L;<super> 025F;;;;N;;;;; +1DA2;MODIFIER LETTER SMALL SCRIPT G;Lm;0;L;<super> 0261;;;;N;;;;; +1DA3;MODIFIER LETTER SMALL TURNED H;Lm;0;L;<super> 0265;;;;N;;;;; +1DA4;MODIFIER LETTER SMALL I WITH STROKE;Lm;0;L;<super> 0268;;;;N;;;;; +1DA5;MODIFIER LETTER SMALL IOTA;Lm;0;L;<super> 0269;;;;N;;;;; +1DA6;MODIFIER LETTER SMALL CAPITAL I;Lm;0;L;<super> 026A;;;;N;;;;; +1DA7;MODIFIER LETTER SMALL CAPITAL I WITH STROKE;Lm;0;L;<super> 1D7B;;;;N;;;;; +1DA8;MODIFIER LETTER SMALL J WITH CROSSED-TAIL;Lm;0;L;<super> 029D;;;;N;;;;; +1DA9;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK;Lm;0;L;<super> 026D;;;;N;;;;; +1DAA;MODIFIER LETTER SMALL L WITH PALATAL HOOK;Lm;0;L;<super> 1D85;;;;N;;;;; +1DAB;MODIFIER LETTER SMALL CAPITAL L;Lm;0;L;<super> 029F;;;;N;;;;; +1DAC;MODIFIER LETTER SMALL M WITH HOOK;Lm;0;L;<super> 0271;;;;N;;;;; +1DAD;MODIFIER LETTER SMALL TURNED M WITH LONG LEG;Lm;0;L;<super> 0270;;;;N;;;;; +1DAE;MODIFIER LETTER SMALL N WITH LEFT HOOK;Lm;0;L;<super> 0272;;;;N;;;;; +1DAF;MODIFIER LETTER SMALL N WITH RETROFLEX HOOK;Lm;0;L;<super> 0273;;;;N;;;;; +1DB0;MODIFIER LETTER SMALL CAPITAL N;Lm;0;L;<super> 0274;;;;N;;;;; +1DB1;MODIFIER LETTER SMALL BARRED O;Lm;0;L;<super> 0275;;;;N;;;;; +1DB2;MODIFIER LETTER SMALL PHI;Lm;0;L;<super> 0278;;;;N;;;;; +1DB3;MODIFIER LETTER SMALL S WITH HOOK;Lm;0;L;<super> 0282;;;;N;;;;; +1DB4;MODIFIER LETTER SMALL ESH;Lm;0;L;<super> 0283;;;;N;;;;; +1DB5;MODIFIER LETTER SMALL T WITH PALATAL HOOK;Lm;0;L;<super> 01AB;;;;N;;;;; +1DB6;MODIFIER LETTER SMALL U BAR;Lm;0;L;<super> 0289;;;;N;;;;; +1DB7;MODIFIER LETTER SMALL UPSILON;Lm;0;L;<super> 028A;;;;N;;;;; +1DB8;MODIFIER LETTER SMALL CAPITAL U;Lm;0;L;<super> 1D1C;;;;N;;;;; +1DB9;MODIFIER LETTER SMALL V WITH HOOK;Lm;0;L;<super> 028B;;;;N;;;;; +1DBA;MODIFIER LETTER SMALL TURNED V;Lm;0;L;<super> 028C;;;;N;;;;; +1DBB;MODIFIER LETTER SMALL Z;Lm;0;L;<super> 007A;;;;N;;;;; +1DBC;MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK;Lm;0;L;<super> 0290;;;;N;;;;; +1DBD;MODIFIER LETTER SMALL Z WITH CURL;Lm;0;L;<super> 0291;;;;N;;;;; +1DBE;MODIFIER LETTER SMALL EZH;Lm;0;L;<super> 0292;;;;N;;;;; +1DBF;MODIFIER LETTER SMALL THETA;Lm;0;L;<super> 03B8;;;;N;;;;; +1DC0;COMBINING DOTTED GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; +1DC1;COMBINING DOTTED ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; +1DC2;COMBINING SNAKE BELOW;Mn;220;NSM;;;;;N;;;;; +1DC3;COMBINING SUSPENSION MARK;Mn;230;NSM;;;;;N;;;;; +1DC4;COMBINING MACRON-ACUTE;Mn;230;NSM;;;;;N;;;;; +1DC5;COMBINING GRAVE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DC6;COMBINING MACRON-GRAVE;Mn;230;NSM;;;;;N;;;;; +1DC7;COMBINING ACUTE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DC8;COMBINING GRAVE-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;; +1DC9;COMBINING ACUTE-GRAVE-ACUTE;Mn;230;NSM;;;;;N;;;;; +1DCA;COMBINING LATIN SMALL LETTER R BELOW;Mn;220;NSM;;;;;N;;;;; +1DCB;COMBINING BREVE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DCC;COMBINING MACRON-BREVE;Mn;230;NSM;;;;;N;;;;; +1DCD;COMBINING DOUBLE CIRCUMFLEX ABOVE;Mn;234;NSM;;;;;N;;;;; +1DCE;COMBINING OGONEK ABOVE;Mn;214;NSM;;;;;N;;;;; +1DCF;COMBINING ZIGZAG BELOW;Mn;220;NSM;;;;;N;;;;; +1DD0;COMBINING IS BELOW;Mn;202;NSM;;;;;N;;;;; +1DD1;COMBINING UR ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD2;COMBINING US ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD3;COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD4;COMBINING LATIN SMALL LETTER AE;Mn;230;NSM;;;;;N;;;;; +1DD5;COMBINING LATIN SMALL LETTER AO;Mn;230;NSM;;;;;N;;;;; +1DD6;COMBINING LATIN SMALL LETTER AV;Mn;230;NSM;;;;;N;;;;; +1DD7;COMBINING LATIN SMALL LETTER C CEDILLA;Mn;230;NSM;;;;;N;;;;; +1DD8;COMBINING LATIN SMALL LETTER INSULAR D;Mn;230;NSM;;;;;N;;;;; +1DD9;COMBINING LATIN SMALL LETTER ETH;Mn;230;NSM;;;;;N;;;;; +1DDA;COMBINING LATIN SMALL LETTER G;Mn;230;NSM;;;;;N;;;;; +1DDB;COMBINING LATIN LETTER SMALL CAPITAL G;Mn;230;NSM;;;;;N;;;;; +1DDC;COMBINING LATIN SMALL LETTER K;Mn;230;NSM;;;;;N;;;;; +1DDD;COMBINING LATIN SMALL LETTER L;Mn;230;NSM;;;;;N;;;;; +1DDE;COMBINING LATIN LETTER SMALL CAPITAL L;Mn;230;NSM;;;;;N;;;;; +1DDF;COMBINING LATIN LETTER SMALL CAPITAL M;Mn;230;NSM;;;;;N;;;;; +1DE0;COMBINING LATIN SMALL LETTER N;Mn;230;NSM;;;;;N;;;;; +1DE1;COMBINING LATIN LETTER SMALL CAPITAL N;Mn;230;NSM;;;;;N;;;;; +1DE2;COMBINING LATIN LETTER SMALL CAPITAL R;Mn;230;NSM;;;;;N;;;;; +1DE3;COMBINING LATIN SMALL LETTER R ROTUNDA;Mn;230;NSM;;;;;N;;;;; +1DE4;COMBINING LATIN SMALL LETTER S;Mn;230;NSM;;;;;N;;;;; +1DE5;COMBINING LATIN SMALL LETTER LONG S;Mn;230;NSM;;;;;N;;;;; +1DE6;COMBINING LATIN SMALL LETTER Z;Mn;230;NSM;;;;;N;;;;; +1DFD;COMBINING ALMOST EQUAL TO BELOW;Mn;220;NSM;;;;;N;;;;; +1DFE;COMBINING LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +1DFF;COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01; +1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00 +1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03; +1E03;LATIN SMALL LETTER B WITH DOT ABOVE;Ll;0;L;0062 0307;;;;N;;;1E02;;1E02 +1E04;LATIN CAPITAL LETTER B WITH DOT BELOW;Lu;0;L;0042 0323;;;;N;;;;1E05; +1E05;LATIN SMALL LETTER B WITH DOT BELOW;Ll;0;L;0062 0323;;;;N;;;1E04;;1E04 +1E06;LATIN CAPITAL LETTER B WITH LINE BELOW;Lu;0;L;0042 0331;;;;N;;;;1E07; +1E07;LATIN SMALL LETTER B WITH LINE BELOW;Ll;0;L;0062 0331;;;;N;;;1E06;;1E06 +1E08;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE;Lu;0;L;00C7 0301;;;;N;;;;1E09; +1E09;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE;Ll;0;L;00E7 0301;;;;N;;;1E08;;1E08 +1E0A;LATIN CAPITAL LETTER D WITH DOT ABOVE;Lu;0;L;0044 0307;;;;N;;;;1E0B; +1E0B;LATIN SMALL LETTER D WITH DOT ABOVE;Ll;0;L;0064 0307;;;;N;;;1E0A;;1E0A +1E0C;LATIN CAPITAL LETTER D WITH DOT BELOW;Lu;0;L;0044 0323;;;;N;;;;1E0D; +1E0D;LATIN SMALL LETTER D WITH DOT BELOW;Ll;0;L;0064 0323;;;;N;;;1E0C;;1E0C +1E0E;LATIN CAPITAL LETTER D WITH LINE BELOW;Lu;0;L;0044 0331;;;;N;;;;1E0F; +1E0F;LATIN SMALL LETTER D WITH LINE BELOW;Ll;0;L;0064 0331;;;;N;;;1E0E;;1E0E +1E10;LATIN CAPITAL LETTER D WITH CEDILLA;Lu;0;L;0044 0327;;;;N;;;;1E11; +1E11;LATIN SMALL LETTER D WITH CEDILLA;Ll;0;L;0064 0327;;;;N;;;1E10;;1E10 +1E12;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW;Lu;0;L;0044 032D;;;;N;;;;1E13; +1E13;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW;Ll;0;L;0064 032D;;;;N;;;1E12;;1E12 +1E14;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE;Lu;0;L;0112 0300;;;;N;;;;1E15; +1E15;LATIN SMALL LETTER E WITH MACRON AND GRAVE;Ll;0;L;0113 0300;;;;N;;;1E14;;1E14 +1E16;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE;Lu;0;L;0112 0301;;;;N;;;;1E17; +1E17;LATIN SMALL LETTER E WITH MACRON AND ACUTE;Ll;0;L;0113 0301;;;;N;;;1E16;;1E16 +1E18;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW;Lu;0;L;0045 032D;;;;N;;;;1E19; +1E19;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW;Ll;0;L;0065 032D;;;;N;;;1E18;;1E18 +1E1A;LATIN CAPITAL LETTER E WITH TILDE BELOW;Lu;0;L;0045 0330;;;;N;;;;1E1B; +1E1B;LATIN SMALL LETTER E WITH TILDE BELOW;Ll;0;L;0065 0330;;;;N;;;1E1A;;1E1A +1E1C;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE;Lu;0;L;0228 0306;;;;N;;;;1E1D; +1E1D;LATIN SMALL LETTER E WITH CEDILLA AND BREVE;Ll;0;L;0229 0306;;;;N;;;1E1C;;1E1C +1E1E;LATIN CAPITAL LETTER F WITH DOT ABOVE;Lu;0;L;0046 0307;;;;N;;;;1E1F; +1E1F;LATIN SMALL LETTER F WITH DOT ABOVE;Ll;0;L;0066 0307;;;;N;;;1E1E;;1E1E +1E20;LATIN CAPITAL LETTER G WITH MACRON;Lu;0;L;0047 0304;;;;N;;;;1E21; +1E21;LATIN SMALL LETTER G WITH MACRON;Ll;0;L;0067 0304;;;;N;;;1E20;;1E20 +1E22;LATIN CAPITAL LETTER H WITH DOT ABOVE;Lu;0;L;0048 0307;;;;N;;;;1E23; +1E23;LATIN SMALL LETTER H WITH DOT ABOVE;Ll;0;L;0068 0307;;;;N;;;1E22;;1E22 +1E24;LATIN CAPITAL LETTER H WITH DOT BELOW;Lu;0;L;0048 0323;;;;N;;;;1E25; +1E25;LATIN SMALL LETTER H WITH DOT BELOW;Ll;0;L;0068 0323;;;;N;;;1E24;;1E24 +1E26;LATIN CAPITAL LETTER H WITH DIAERESIS;Lu;0;L;0048 0308;;;;N;;;;1E27; +1E27;LATIN SMALL LETTER H WITH DIAERESIS;Ll;0;L;0068 0308;;;;N;;;1E26;;1E26 +1E28;LATIN CAPITAL LETTER H WITH CEDILLA;Lu;0;L;0048 0327;;;;N;;;;1E29; +1E29;LATIN SMALL LETTER H WITH CEDILLA;Ll;0;L;0068 0327;;;;N;;;1E28;;1E28 +1E2A;LATIN CAPITAL LETTER H WITH BREVE BELOW;Lu;0;L;0048 032E;;;;N;;;;1E2B; +1E2B;LATIN SMALL LETTER H WITH BREVE BELOW;Ll;0;L;0068 032E;;;;N;;;1E2A;;1E2A +1E2C;LATIN CAPITAL LETTER I WITH TILDE BELOW;Lu;0;L;0049 0330;;;;N;;;;1E2D; +1E2D;LATIN SMALL LETTER I WITH TILDE BELOW;Ll;0;L;0069 0330;;;;N;;;1E2C;;1E2C +1E2E;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE;Lu;0;L;00CF 0301;;;;N;;;;1E2F; +1E2F;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE;Ll;0;L;00EF 0301;;;;N;;;1E2E;;1E2E +1E30;LATIN CAPITAL LETTER K WITH ACUTE;Lu;0;L;004B 0301;;;;N;;;;1E31; +1E31;LATIN SMALL LETTER K WITH ACUTE;Ll;0;L;006B 0301;;;;N;;;1E30;;1E30 +1E32;LATIN CAPITAL LETTER K WITH DOT BELOW;Lu;0;L;004B 0323;;;;N;;;;1E33; +1E33;LATIN SMALL LETTER K WITH DOT BELOW;Ll;0;L;006B 0323;;;;N;;;1E32;;1E32 +1E34;LATIN CAPITAL LETTER K WITH LINE BELOW;Lu;0;L;004B 0331;;;;N;;;;1E35; +1E35;LATIN SMALL LETTER K WITH LINE BELOW;Ll;0;L;006B 0331;;;;N;;;1E34;;1E34 +1E36;LATIN CAPITAL LETTER L WITH DOT BELOW;Lu;0;L;004C 0323;;;;N;;;;1E37; +1E37;LATIN SMALL LETTER L WITH DOT BELOW;Ll;0;L;006C 0323;;;;N;;;1E36;;1E36 +1E38;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON;Lu;0;L;1E36 0304;;;;N;;;;1E39; +1E39;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON;Ll;0;L;1E37 0304;;;;N;;;1E38;;1E38 +1E3A;LATIN CAPITAL LETTER L WITH LINE BELOW;Lu;0;L;004C 0331;;;;N;;;;1E3B; +1E3B;LATIN SMALL LETTER L WITH LINE BELOW;Ll;0;L;006C 0331;;;;N;;;1E3A;;1E3A +1E3C;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW;Lu;0;L;004C 032D;;;;N;;;;1E3D; +1E3D;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW;Ll;0;L;006C 032D;;;;N;;;1E3C;;1E3C +1E3E;LATIN CAPITAL LETTER M WITH ACUTE;Lu;0;L;004D 0301;;;;N;;;;1E3F; +1E3F;LATIN SMALL LETTER M WITH ACUTE;Ll;0;L;006D 0301;;;;N;;;1E3E;;1E3E +1E40;LATIN CAPITAL LETTER M WITH DOT ABOVE;Lu;0;L;004D 0307;;;;N;;;;1E41; +1E41;LATIN SMALL LETTER M WITH DOT ABOVE;Ll;0;L;006D 0307;;;;N;;;1E40;;1E40 +1E42;LATIN CAPITAL LETTER M WITH DOT BELOW;Lu;0;L;004D 0323;;;;N;;;;1E43; +1E43;LATIN SMALL LETTER M WITH DOT BELOW;Ll;0;L;006D 0323;;;;N;;;1E42;;1E42 +1E44;LATIN CAPITAL LETTER N WITH DOT ABOVE;Lu;0;L;004E 0307;;;;N;;;;1E45; +1E45;LATIN SMALL LETTER N WITH DOT ABOVE;Ll;0;L;006E 0307;;;;N;;;1E44;;1E44 +1E46;LATIN CAPITAL LETTER N WITH DOT BELOW;Lu;0;L;004E 0323;;;;N;;;;1E47; +1E47;LATIN SMALL LETTER N WITH DOT BELOW;Ll;0;L;006E 0323;;;;N;;;1E46;;1E46 +1E48;LATIN CAPITAL LETTER N WITH LINE BELOW;Lu;0;L;004E 0331;;;;N;;;;1E49; +1E49;LATIN SMALL LETTER N WITH LINE BELOW;Ll;0;L;006E 0331;;;;N;;;1E48;;1E48 +1E4A;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW;Lu;0;L;004E 032D;;;;N;;;;1E4B; +1E4B;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW;Ll;0;L;006E 032D;;;;N;;;1E4A;;1E4A +1E4C;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE;Lu;0;L;00D5 0301;;;;N;;;;1E4D; +1E4D;LATIN SMALL LETTER O WITH TILDE AND ACUTE;Ll;0;L;00F5 0301;;;;N;;;1E4C;;1E4C +1E4E;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS;Lu;0;L;00D5 0308;;;;N;;;;1E4F; +1E4F;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS;Ll;0;L;00F5 0308;;;;N;;;1E4E;;1E4E +1E50;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE;Lu;0;L;014C 0300;;;;N;;;;1E51; +1E51;LATIN SMALL LETTER O WITH MACRON AND GRAVE;Ll;0;L;014D 0300;;;;N;;;1E50;;1E50 +1E52;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE;Lu;0;L;014C 0301;;;;N;;;;1E53; +1E53;LATIN SMALL LETTER O WITH MACRON AND ACUTE;Ll;0;L;014D 0301;;;;N;;;1E52;;1E52 +1E54;LATIN CAPITAL LETTER P WITH ACUTE;Lu;0;L;0050 0301;;;;N;;;;1E55; +1E55;LATIN SMALL LETTER P WITH ACUTE;Ll;0;L;0070 0301;;;;N;;;1E54;;1E54 +1E56;LATIN CAPITAL LETTER P WITH DOT ABOVE;Lu;0;L;0050 0307;;;;N;;;;1E57; +1E57;LATIN SMALL LETTER P WITH DOT ABOVE;Ll;0;L;0070 0307;;;;N;;;1E56;;1E56 +1E58;LATIN CAPITAL LETTER R WITH DOT ABOVE;Lu;0;L;0052 0307;;;;N;;;;1E59; +1E59;LATIN SMALL LETTER R WITH DOT ABOVE;Ll;0;L;0072 0307;;;;N;;;1E58;;1E58 +1E5A;LATIN CAPITAL LETTER R WITH DOT BELOW;Lu;0;L;0052 0323;;;;N;;;;1E5B; +1E5B;LATIN SMALL LETTER R WITH DOT BELOW;Ll;0;L;0072 0323;;;;N;;;1E5A;;1E5A +1E5C;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON;Lu;0;L;1E5A 0304;;;;N;;;;1E5D; +1E5D;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON;Ll;0;L;1E5B 0304;;;;N;;;1E5C;;1E5C +1E5E;LATIN CAPITAL LETTER R WITH LINE BELOW;Lu;0;L;0052 0331;;;;N;;;;1E5F; +1E5F;LATIN SMALL LETTER R WITH LINE BELOW;Ll;0;L;0072 0331;;;;N;;;1E5E;;1E5E +1E60;LATIN CAPITAL LETTER S WITH DOT ABOVE;Lu;0;L;0053 0307;;;;N;;;;1E61; +1E61;LATIN SMALL LETTER S WITH DOT ABOVE;Ll;0;L;0073 0307;;;;N;;;1E60;;1E60 +1E62;LATIN CAPITAL LETTER S WITH DOT BELOW;Lu;0;L;0053 0323;;;;N;;;;1E63; +1E63;LATIN SMALL LETTER S WITH DOT BELOW;Ll;0;L;0073 0323;;;;N;;;1E62;;1E62 +1E64;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE;Lu;0;L;015A 0307;;;;N;;;;1E65; +1E65;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE;Ll;0;L;015B 0307;;;;N;;;1E64;;1E64 +1E66;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE;Lu;0;L;0160 0307;;;;N;;;;1E67; +1E67;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE;Ll;0;L;0161 0307;;;;N;;;1E66;;1E66 +1E68;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE;Lu;0;L;1E62 0307;;;;N;;;;1E69; +1E69;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE;Ll;0;L;1E63 0307;;;;N;;;1E68;;1E68 +1E6A;LATIN CAPITAL LETTER T WITH DOT ABOVE;Lu;0;L;0054 0307;;;;N;;;;1E6B; +1E6B;LATIN SMALL LETTER T WITH DOT ABOVE;Ll;0;L;0074 0307;;;;N;;;1E6A;;1E6A +1E6C;LATIN CAPITAL LETTER T WITH DOT BELOW;Lu;0;L;0054 0323;;;;N;;;;1E6D; +1E6D;LATIN SMALL LETTER T WITH DOT BELOW;Ll;0;L;0074 0323;;;;N;;;1E6C;;1E6C +1E6E;LATIN CAPITAL LETTER T WITH LINE BELOW;Lu;0;L;0054 0331;;;;N;;;;1E6F; +1E6F;LATIN SMALL LETTER T WITH LINE BELOW;Ll;0;L;0074 0331;;;;N;;;1E6E;;1E6E +1E70;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW;Lu;0;L;0054 032D;;;;N;;;;1E71; +1E71;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW;Ll;0;L;0074 032D;;;;N;;;1E70;;1E70 +1E72;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW;Lu;0;L;0055 0324;;;;N;;;;1E73; +1E73;LATIN SMALL LETTER U WITH DIAERESIS BELOW;Ll;0;L;0075 0324;;;;N;;;1E72;;1E72 +1E74;LATIN CAPITAL LETTER U WITH TILDE BELOW;Lu;0;L;0055 0330;;;;N;;;;1E75; +1E75;LATIN SMALL LETTER U WITH TILDE BELOW;Ll;0;L;0075 0330;;;;N;;;1E74;;1E74 +1E76;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW;Lu;0;L;0055 032D;;;;N;;;;1E77; +1E77;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW;Ll;0;L;0075 032D;;;;N;;;1E76;;1E76 +1E78;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE;Lu;0;L;0168 0301;;;;N;;;;1E79; +1E79;LATIN SMALL LETTER U WITH TILDE AND ACUTE;Ll;0;L;0169 0301;;;;N;;;1E78;;1E78 +1E7A;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS;Lu;0;L;016A 0308;;;;N;;;;1E7B; +1E7B;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS;Ll;0;L;016B 0308;;;;N;;;1E7A;;1E7A +1E7C;LATIN CAPITAL LETTER V WITH TILDE;Lu;0;L;0056 0303;;;;N;;;;1E7D; +1E7D;LATIN SMALL LETTER V WITH TILDE;Ll;0;L;0076 0303;;;;N;;;1E7C;;1E7C +1E7E;LATIN CAPITAL LETTER V WITH DOT BELOW;Lu;0;L;0056 0323;;;;N;;;;1E7F; +1E7F;LATIN SMALL LETTER V WITH DOT BELOW;Ll;0;L;0076 0323;;;;N;;;1E7E;;1E7E +1E80;LATIN CAPITAL LETTER W WITH GRAVE;Lu;0;L;0057 0300;;;;N;;;;1E81; +1E81;LATIN SMALL LETTER W WITH GRAVE;Ll;0;L;0077 0300;;;;N;;;1E80;;1E80 +1E82;LATIN CAPITAL LETTER W WITH ACUTE;Lu;0;L;0057 0301;;;;N;;;;1E83; +1E83;LATIN SMALL LETTER W WITH ACUTE;Ll;0;L;0077 0301;;;;N;;;1E82;;1E82 +1E84;LATIN CAPITAL LETTER W WITH DIAERESIS;Lu;0;L;0057 0308;;;;N;;;;1E85; +1E85;LATIN SMALL LETTER W WITH DIAERESIS;Ll;0;L;0077 0308;;;;N;;;1E84;;1E84 +1E86;LATIN CAPITAL LETTER W WITH DOT ABOVE;Lu;0;L;0057 0307;;;;N;;;;1E87; +1E87;LATIN SMALL LETTER W WITH DOT ABOVE;Ll;0;L;0077 0307;;;;N;;;1E86;;1E86 +1E88;LATIN CAPITAL LETTER W WITH DOT BELOW;Lu;0;L;0057 0323;;;;N;;;;1E89; +1E89;LATIN SMALL LETTER W WITH DOT BELOW;Ll;0;L;0077 0323;;;;N;;;1E88;;1E88 +1E8A;LATIN CAPITAL LETTER X WITH DOT ABOVE;Lu;0;L;0058 0307;;;;N;;;;1E8B; +1E8B;LATIN SMALL LETTER X WITH DOT ABOVE;Ll;0;L;0078 0307;;;;N;;;1E8A;;1E8A +1E8C;LATIN CAPITAL LETTER X WITH DIAERESIS;Lu;0;L;0058 0308;;;;N;;;;1E8D; +1E8D;LATIN SMALL LETTER X WITH DIAERESIS;Ll;0;L;0078 0308;;;;N;;;1E8C;;1E8C +1E8E;LATIN CAPITAL LETTER Y WITH DOT ABOVE;Lu;0;L;0059 0307;;;;N;;;;1E8F; +1E8F;LATIN SMALL LETTER Y WITH DOT ABOVE;Ll;0;L;0079 0307;;;;N;;;1E8E;;1E8E +1E90;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX;Lu;0;L;005A 0302;;;;N;;;;1E91; +1E91;LATIN SMALL LETTER Z WITH CIRCUMFLEX;Ll;0;L;007A 0302;;;;N;;;1E90;;1E90 +1E92;LATIN CAPITAL LETTER Z WITH DOT BELOW;Lu;0;L;005A 0323;;;;N;;;;1E93; +1E93;LATIN SMALL LETTER Z WITH DOT BELOW;Ll;0;L;007A 0323;;;;N;;;1E92;;1E92 +1E94;LATIN CAPITAL LETTER Z WITH LINE BELOW;Lu;0;L;005A 0331;;;;N;;;;1E95; +1E95;LATIN SMALL LETTER Z WITH LINE BELOW;Ll;0;L;007A 0331;;;;N;;;1E94;;1E94 +1E96;LATIN SMALL LETTER H WITH LINE BELOW;Ll;0;L;0068 0331;;;;N;;;;; +1E97;LATIN SMALL LETTER T WITH DIAERESIS;Ll;0;L;0074 0308;;;;N;;;;; +1E98;LATIN SMALL LETTER W WITH RING ABOVE;Ll;0;L;0077 030A;;;;N;;;;; +1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;; +1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L;<compat> 0061 02BE;;;;N;;;;; +1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60 +1E9C;LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;;; +1E9D;LATIN SMALL LETTER LONG S WITH HIGH STROKE;Ll;0;L;;;;;N;;;;; +1E9E;LATIN CAPITAL LETTER SHARP S;Lu;0;L;;;;;N;;;;00DF; +1E9F;LATIN SMALL LETTER DELTA;Ll;0;L;;;;;N;;;;; +1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1; +1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0 +1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3; +1EA3;LATIN SMALL LETTER A WITH HOOK ABOVE;Ll;0;L;0061 0309;;;;N;;;1EA2;;1EA2 +1EA4;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00C2 0301;;;;N;;;;1EA5; +1EA5;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00E2 0301;;;;N;;;1EA4;;1EA4 +1EA6;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00C2 0300;;;;N;;;;1EA7; +1EA7;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00E2 0300;;;;N;;;1EA6;;1EA6 +1EA8;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00C2 0309;;;;N;;;;1EA9; +1EA9;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00E2 0309;;;;N;;;1EA8;;1EA8 +1EAA;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE;Lu;0;L;00C2 0303;;;;N;;;;1EAB; +1EAB;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE;Ll;0;L;00E2 0303;;;;N;;;1EAA;;1EAA +1EAC;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EA0 0302;;;;N;;;;1EAD; +1EAD;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EA1 0302;;;;N;;;1EAC;;1EAC +1EAE;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE;Lu;0;L;0102 0301;;;;N;;;;1EAF; +1EAF;LATIN SMALL LETTER A WITH BREVE AND ACUTE;Ll;0;L;0103 0301;;;;N;;;1EAE;;1EAE +1EB0;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE;Lu;0;L;0102 0300;;;;N;;;;1EB1; +1EB1;LATIN SMALL LETTER A WITH BREVE AND GRAVE;Ll;0;L;0103 0300;;;;N;;;1EB0;;1EB0 +1EB2;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE;Lu;0;L;0102 0309;;;;N;;;;1EB3; +1EB3;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE;Ll;0;L;0103 0309;;;;N;;;1EB2;;1EB2 +1EB4;LATIN CAPITAL LETTER A WITH BREVE AND TILDE;Lu;0;L;0102 0303;;;;N;;;;1EB5; +1EB5;LATIN SMALL LETTER A WITH BREVE AND TILDE;Ll;0;L;0103 0303;;;;N;;;1EB4;;1EB4 +1EB6;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW;Lu;0;L;1EA0 0306;;;;N;;;;1EB7; +1EB7;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW;Ll;0;L;1EA1 0306;;;;N;;;1EB6;;1EB6 +1EB8;LATIN CAPITAL LETTER E WITH DOT BELOW;Lu;0;L;0045 0323;;;;N;;;;1EB9; +1EB9;LATIN SMALL LETTER E WITH DOT BELOW;Ll;0;L;0065 0323;;;;N;;;1EB8;;1EB8 +1EBA;LATIN CAPITAL LETTER E WITH HOOK ABOVE;Lu;0;L;0045 0309;;;;N;;;;1EBB; +1EBB;LATIN SMALL LETTER E WITH HOOK ABOVE;Ll;0;L;0065 0309;;;;N;;;1EBA;;1EBA +1EBC;LATIN CAPITAL LETTER E WITH TILDE;Lu;0;L;0045 0303;;;;N;;;;1EBD; +1EBD;LATIN SMALL LETTER E WITH TILDE;Ll;0;L;0065 0303;;;;N;;;1EBC;;1EBC +1EBE;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00CA 0301;;;;N;;;;1EBF; +1EBF;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00EA 0301;;;;N;;;1EBE;;1EBE +1EC0;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00CA 0300;;;;N;;;;1EC1; +1EC1;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00EA 0300;;;;N;;;1EC0;;1EC0 +1EC2;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00CA 0309;;;;N;;;;1EC3; +1EC3;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00EA 0309;;;;N;;;1EC2;;1EC2 +1EC4;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE;Lu;0;L;00CA 0303;;;;N;;;;1EC5; +1EC5;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE;Ll;0;L;00EA 0303;;;;N;;;1EC4;;1EC4 +1EC6;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EB8 0302;;;;N;;;;1EC7; +1EC7;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EB9 0302;;;;N;;;1EC6;;1EC6 +1EC8;LATIN CAPITAL LETTER I WITH HOOK ABOVE;Lu;0;L;0049 0309;;;;N;;;;1EC9; +1EC9;LATIN SMALL LETTER I WITH HOOK ABOVE;Ll;0;L;0069 0309;;;;N;;;1EC8;;1EC8 +1ECA;LATIN CAPITAL LETTER I WITH DOT BELOW;Lu;0;L;0049 0323;;;;N;;;;1ECB; +1ECB;LATIN SMALL LETTER I WITH DOT BELOW;Ll;0;L;0069 0323;;;;N;;;1ECA;;1ECA +1ECC;LATIN CAPITAL LETTER O WITH DOT BELOW;Lu;0;L;004F 0323;;;;N;;;;1ECD; +1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC +1ECE;LATIN CAPITAL LETTER O WITH HOOK ABOVE;Lu;0;L;004F 0309;;;;N;;;;1ECF; +1ECF;LATIN SMALL LETTER O WITH HOOK ABOVE;Ll;0;L;006F 0309;;;;N;;;1ECE;;1ECE +1ED0;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00D4 0301;;;;N;;;;1ED1; +1ED1;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00F4 0301;;;;N;;;1ED0;;1ED0 +1ED2;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00D4 0300;;;;N;;;;1ED3; +1ED3;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00F4 0300;;;;N;;;1ED2;;1ED2 +1ED4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00D4 0309;;;;N;;;;1ED5; +1ED5;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00F4 0309;;;;N;;;1ED4;;1ED4 +1ED6;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE;Lu;0;L;00D4 0303;;;;N;;;;1ED7; +1ED7;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE;Ll;0;L;00F4 0303;;;;N;;;1ED6;;1ED6 +1ED8;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1ECC 0302;;;;N;;;;1ED9; +1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8 +1EDA;LATIN CAPITAL LETTER O WITH HORN AND ACUTE;Lu;0;L;01A0 0301;;;;N;;;;1EDB; +1EDB;LATIN SMALL LETTER O WITH HORN AND ACUTE;Ll;0;L;01A1 0301;;;;N;;;1EDA;;1EDA +1EDC;LATIN CAPITAL LETTER O WITH HORN AND GRAVE;Lu;0;L;01A0 0300;;;;N;;;;1EDD; +1EDD;LATIN SMALL LETTER O WITH HORN AND GRAVE;Ll;0;L;01A1 0300;;;;N;;;1EDC;;1EDC +1EDE;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE;Lu;0;L;01A0 0309;;;;N;;;;1EDF; +1EDF;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE;Ll;0;L;01A1 0309;;;;N;;;1EDE;;1EDE +1EE0;LATIN CAPITAL LETTER O WITH HORN AND TILDE;Lu;0;L;01A0 0303;;;;N;;;;1EE1; +1EE1;LATIN SMALL LETTER O WITH HORN AND TILDE;Ll;0;L;01A1 0303;;;;N;;;1EE0;;1EE0 +1EE2;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW;Lu;0;L;01A0 0323;;;;N;;;;1EE3; +1EE3;LATIN SMALL LETTER O WITH HORN AND DOT BELOW;Ll;0;L;01A1 0323;;;;N;;;1EE2;;1EE2 +1EE4;LATIN CAPITAL LETTER U WITH DOT BELOW;Lu;0;L;0055 0323;;;;N;;;;1EE5; +1EE5;LATIN SMALL LETTER U WITH DOT BELOW;Ll;0;L;0075 0323;;;;N;;;1EE4;;1EE4 +1EE6;LATIN CAPITAL LETTER U WITH HOOK ABOVE;Lu;0;L;0055 0309;;;;N;;;;1EE7; +1EE7;LATIN SMALL LETTER U WITH HOOK ABOVE;Ll;0;L;0075 0309;;;;N;;;1EE6;;1EE6 +1EE8;LATIN CAPITAL LETTER U WITH HORN AND ACUTE;Lu;0;L;01AF 0301;;;;N;;;;1EE9; +1EE9;LATIN SMALL LETTER U WITH HORN AND ACUTE;Ll;0;L;01B0 0301;;;;N;;;1EE8;;1EE8 +1EEA;LATIN CAPITAL LETTER U WITH HORN AND GRAVE;Lu;0;L;01AF 0300;;;;N;;;;1EEB; +1EEB;LATIN SMALL LETTER U WITH HORN AND GRAVE;Ll;0;L;01B0 0300;;;;N;;;1EEA;;1EEA +1EEC;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE;Lu;0;L;01AF 0309;;;;N;;;;1EED; +1EED;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE;Ll;0;L;01B0 0309;;;;N;;;1EEC;;1EEC +1EEE;LATIN CAPITAL LETTER U WITH HORN AND TILDE;Lu;0;L;01AF 0303;;;;N;;;;1EEF; +1EEF;LATIN SMALL LETTER U WITH HORN AND TILDE;Ll;0;L;01B0 0303;;;;N;;;1EEE;;1EEE +1EF0;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW;Lu;0;L;01AF 0323;;;;N;;;;1EF1; +1EF1;LATIN SMALL LETTER U WITH HORN AND DOT BELOW;Ll;0;L;01B0 0323;;;;N;;;1EF0;;1EF0 +1EF2;LATIN CAPITAL LETTER Y WITH GRAVE;Lu;0;L;0059 0300;;;;N;;;;1EF3; +1EF3;LATIN SMALL LETTER Y WITH GRAVE;Ll;0;L;0079 0300;;;;N;;;1EF2;;1EF2 +1EF4;LATIN CAPITAL LETTER Y WITH DOT BELOW;Lu;0;L;0059 0323;;;;N;;;;1EF5; +1EF5;LATIN SMALL LETTER Y WITH DOT BELOW;Ll;0;L;0079 0323;;;;N;;;1EF4;;1EF4 +1EF6;LATIN CAPITAL LETTER Y WITH HOOK ABOVE;Lu;0;L;0059 0309;;;;N;;;;1EF7; +1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6 +1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9; +1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8 +1EFA;LATIN CAPITAL LETTER MIDDLE-WELSH LL;Lu;0;L;;;;;N;;;;1EFB; +1EFB;LATIN SMALL LETTER MIDDLE-WELSH LL;Ll;0;L;;;;;N;;;1EFA;;1EFA +1EFC;LATIN CAPITAL LETTER MIDDLE-WELSH V;Lu;0;L;;;;;N;;;;1EFD; +1EFD;LATIN SMALL LETTER MIDDLE-WELSH V;Ll;0;L;;;;;N;;;1EFC;;1EFC +1EFE;LATIN CAPITAL LETTER Y WITH LOOP;Lu;0;L;;;;;N;;;;1EFF; +1EFF;LATIN SMALL LETTER Y WITH LOOP;Ll;0;L;;;;;N;;;1EFE;;1EFE +1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08 +1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09 +1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A +1F03;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA;Ll;0;L;1F01 0300;;;;N;;;1F0B;;1F0B +1F04;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA;Ll;0;L;1F00 0301;;;;N;;;1F0C;;1F0C +1F05;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA;Ll;0;L;1F01 0301;;;;N;;;1F0D;;1F0D +1F06;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI;Ll;0;L;1F00 0342;;;;N;;;1F0E;;1F0E +1F07;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI;Ll;0;L;1F01 0342;;;;N;;;1F0F;;1F0F +1F08;GREEK CAPITAL LETTER ALPHA WITH PSILI;Lu;0;L;0391 0313;;;;N;;;;1F00; +1F09;GREEK CAPITAL LETTER ALPHA WITH DASIA;Lu;0;L;0391 0314;;;;N;;;;1F01; +1F0A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA;Lu;0;L;1F08 0300;;;;N;;;;1F02; +1F0B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA;Lu;0;L;1F09 0300;;;;N;;;;1F03; +1F0C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA;Lu;0;L;1F08 0301;;;;N;;;;1F04; +1F0D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA;Lu;0;L;1F09 0301;;;;N;;;;1F05; +1F0E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI;Lu;0;L;1F08 0342;;;;N;;;;1F06; +1F0F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI;Lu;0;L;1F09 0342;;;;N;;;;1F07; +1F10;GREEK SMALL LETTER EPSILON WITH PSILI;Ll;0;L;03B5 0313;;;;N;;;1F18;;1F18 +1F11;GREEK SMALL LETTER EPSILON WITH DASIA;Ll;0;L;03B5 0314;;;;N;;;1F19;;1F19 +1F12;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA;Ll;0;L;1F10 0300;;;;N;;;1F1A;;1F1A +1F13;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA;Ll;0;L;1F11 0300;;;;N;;;1F1B;;1F1B +1F14;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA;Ll;0;L;1F10 0301;;;;N;;;1F1C;;1F1C +1F15;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA;Ll;0;L;1F11 0301;;;;N;;;1F1D;;1F1D +1F18;GREEK CAPITAL LETTER EPSILON WITH PSILI;Lu;0;L;0395 0313;;;;N;;;;1F10; +1F19;GREEK CAPITAL LETTER EPSILON WITH DASIA;Lu;0;L;0395 0314;;;;N;;;;1F11; +1F1A;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA;Lu;0;L;1F18 0300;;;;N;;;;1F12; +1F1B;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA;Lu;0;L;1F19 0300;;;;N;;;;1F13; +1F1C;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA;Lu;0;L;1F18 0301;;;;N;;;;1F14; +1F1D;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA;Lu;0;L;1F19 0301;;;;N;;;;1F15; +1F20;GREEK SMALL LETTER ETA WITH PSILI;Ll;0;L;03B7 0313;;;;N;;;1F28;;1F28 +1F21;GREEK SMALL LETTER ETA WITH DASIA;Ll;0;L;03B7 0314;;;;N;;;1F29;;1F29 +1F22;GREEK SMALL LETTER ETA WITH PSILI AND VARIA;Ll;0;L;1F20 0300;;;;N;;;1F2A;;1F2A +1F23;GREEK SMALL LETTER ETA WITH DASIA AND VARIA;Ll;0;L;1F21 0300;;;;N;;;1F2B;;1F2B +1F24;GREEK SMALL LETTER ETA WITH PSILI AND OXIA;Ll;0;L;1F20 0301;;;;N;;;1F2C;;1F2C +1F25;GREEK SMALL LETTER ETA WITH DASIA AND OXIA;Ll;0;L;1F21 0301;;;;N;;;1F2D;;1F2D +1F26;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI;Ll;0;L;1F20 0342;;;;N;;;1F2E;;1F2E +1F27;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI;Ll;0;L;1F21 0342;;;;N;;;1F2F;;1F2F +1F28;GREEK CAPITAL LETTER ETA WITH PSILI;Lu;0;L;0397 0313;;;;N;;;;1F20; +1F29;GREEK CAPITAL LETTER ETA WITH DASIA;Lu;0;L;0397 0314;;;;N;;;;1F21; +1F2A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA;Lu;0;L;1F28 0300;;;;N;;;;1F22; +1F2B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA;Lu;0;L;1F29 0300;;;;N;;;;1F23; +1F2C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA;Lu;0;L;1F28 0301;;;;N;;;;1F24; +1F2D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA;Lu;0;L;1F29 0301;;;;N;;;;1F25; +1F2E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI;Lu;0;L;1F28 0342;;;;N;;;;1F26; +1F2F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI;Lu;0;L;1F29 0342;;;;N;;;;1F27; +1F30;GREEK SMALL LETTER IOTA WITH PSILI;Ll;0;L;03B9 0313;;;;N;;;1F38;;1F38 +1F31;GREEK SMALL LETTER IOTA WITH DASIA;Ll;0;L;03B9 0314;;;;N;;;1F39;;1F39 +1F32;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA;Ll;0;L;1F30 0300;;;;N;;;1F3A;;1F3A +1F33;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA;Ll;0;L;1F31 0300;;;;N;;;1F3B;;1F3B +1F34;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA;Ll;0;L;1F30 0301;;;;N;;;1F3C;;1F3C +1F35;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA;Ll;0;L;1F31 0301;;;;N;;;1F3D;;1F3D +1F36;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI;Ll;0;L;1F30 0342;;;;N;;;1F3E;;1F3E +1F37;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI;Ll;0;L;1F31 0342;;;;N;;;1F3F;;1F3F +1F38;GREEK CAPITAL LETTER IOTA WITH PSILI;Lu;0;L;0399 0313;;;;N;;;;1F30; +1F39;GREEK CAPITAL LETTER IOTA WITH DASIA;Lu;0;L;0399 0314;;;;N;;;;1F31; +1F3A;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA;Lu;0;L;1F38 0300;;;;N;;;;1F32; +1F3B;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA;Lu;0;L;1F39 0300;;;;N;;;;1F33; +1F3C;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA;Lu;0;L;1F38 0301;;;;N;;;;1F34; +1F3D;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA;Lu;0;L;1F39 0301;;;;N;;;;1F35; +1F3E;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI;Lu;0;L;1F38 0342;;;;N;;;;1F36; +1F3F;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI;Lu;0;L;1F39 0342;;;;N;;;;1F37; +1F40;GREEK SMALL LETTER OMICRON WITH PSILI;Ll;0;L;03BF 0313;;;;N;;;1F48;;1F48 +1F41;GREEK SMALL LETTER OMICRON WITH DASIA;Ll;0;L;03BF 0314;;;;N;;;1F49;;1F49 +1F42;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA;Ll;0;L;1F40 0300;;;;N;;;1F4A;;1F4A +1F43;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA;Ll;0;L;1F41 0300;;;;N;;;1F4B;;1F4B +1F44;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA;Ll;0;L;1F40 0301;;;;N;;;1F4C;;1F4C +1F45;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA;Ll;0;L;1F41 0301;;;;N;;;1F4D;;1F4D +1F48;GREEK CAPITAL LETTER OMICRON WITH PSILI;Lu;0;L;039F 0313;;;;N;;;;1F40; +1F49;GREEK CAPITAL LETTER OMICRON WITH DASIA;Lu;0;L;039F 0314;;;;N;;;;1F41; +1F4A;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA;Lu;0;L;1F48 0300;;;;N;;;;1F42; +1F4B;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA;Lu;0;L;1F49 0300;;;;N;;;;1F43; +1F4C;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA;Lu;0;L;1F48 0301;;;;N;;;;1F44; +1F4D;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA;Lu;0;L;1F49 0301;;;;N;;;;1F45; +1F50;GREEK SMALL LETTER UPSILON WITH PSILI;Ll;0;L;03C5 0313;;;;N;;;;; +1F51;GREEK SMALL LETTER UPSILON WITH DASIA;Ll;0;L;03C5 0314;;;;N;;;1F59;;1F59 +1F52;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA;Ll;0;L;1F50 0300;;;;N;;;;; +1F53;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA;Ll;0;L;1F51 0300;;;;N;;;1F5B;;1F5B +1F54;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA;Ll;0;L;1F50 0301;;;;N;;;;; +1F55;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA;Ll;0;L;1F51 0301;;;;N;;;1F5D;;1F5D +1F56;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI;Ll;0;L;1F50 0342;;;;N;;;;; +1F57;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI;Ll;0;L;1F51 0342;;;;N;;;1F5F;;1F5F +1F59;GREEK CAPITAL LETTER UPSILON WITH DASIA;Lu;0;L;03A5 0314;;;;N;;;;1F51; +1F5B;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA;Lu;0;L;1F59 0300;;;;N;;;;1F53; +1F5D;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA;Lu;0;L;1F59 0301;;;;N;;;;1F55; +1F5F;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI;Lu;0;L;1F59 0342;;;;N;;;;1F57; +1F60;GREEK SMALL LETTER OMEGA WITH PSILI;Ll;0;L;03C9 0313;;;;N;;;1F68;;1F68 +1F61;GREEK SMALL LETTER OMEGA WITH DASIA;Ll;0;L;03C9 0314;;;;N;;;1F69;;1F69 +1F62;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA;Ll;0;L;1F60 0300;;;;N;;;1F6A;;1F6A +1F63;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA;Ll;0;L;1F61 0300;;;;N;;;1F6B;;1F6B +1F64;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA;Ll;0;L;1F60 0301;;;;N;;;1F6C;;1F6C +1F65;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA;Ll;0;L;1F61 0301;;;;N;;;1F6D;;1F6D +1F66;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI;Ll;0;L;1F60 0342;;;;N;;;1F6E;;1F6E +1F67;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI;Ll;0;L;1F61 0342;;;;N;;;1F6F;;1F6F +1F68;GREEK CAPITAL LETTER OMEGA WITH PSILI;Lu;0;L;03A9 0313;;;;N;;;;1F60; +1F69;GREEK CAPITAL LETTER OMEGA WITH DASIA;Lu;0;L;03A9 0314;;;;N;;;;1F61; +1F6A;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA;Lu;0;L;1F68 0300;;;;N;;;;1F62; +1F6B;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA;Lu;0;L;1F69 0300;;;;N;;;;1F63; +1F6C;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA;Lu;0;L;1F68 0301;;;;N;;;;1F64; +1F6D;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA;Lu;0;L;1F69 0301;;;;N;;;;1F65; +1F6E;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI;Lu;0;L;1F68 0342;;;;N;;;;1F66; +1F6F;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI;Lu;0;L;1F69 0342;;;;N;;;;1F67; +1F70;GREEK SMALL LETTER ALPHA WITH VARIA;Ll;0;L;03B1 0300;;;;N;;;1FBA;;1FBA +1F71;GREEK SMALL LETTER ALPHA WITH OXIA;Ll;0;L;03AC;;;;N;;;1FBB;;1FBB +1F72;GREEK SMALL LETTER EPSILON WITH VARIA;Ll;0;L;03B5 0300;;;;N;;;1FC8;;1FC8 +1F73;GREEK SMALL LETTER EPSILON WITH OXIA;Ll;0;L;03AD;;;;N;;;1FC9;;1FC9 +1F74;GREEK SMALL LETTER ETA WITH VARIA;Ll;0;L;03B7 0300;;;;N;;;1FCA;;1FCA +1F75;GREEK SMALL LETTER ETA WITH OXIA;Ll;0;L;03AE;;;;N;;;1FCB;;1FCB +1F76;GREEK SMALL LETTER IOTA WITH VARIA;Ll;0;L;03B9 0300;;;;N;;;1FDA;;1FDA +1F77;GREEK SMALL LETTER IOTA WITH OXIA;Ll;0;L;03AF;;;;N;;;1FDB;;1FDB +1F78;GREEK SMALL LETTER OMICRON WITH VARIA;Ll;0;L;03BF 0300;;;;N;;;1FF8;;1FF8 +1F79;GREEK SMALL LETTER OMICRON WITH OXIA;Ll;0;L;03CC;;;;N;;;1FF9;;1FF9 +1F7A;GREEK SMALL LETTER UPSILON WITH VARIA;Ll;0;L;03C5 0300;;;;N;;;1FEA;;1FEA +1F7B;GREEK SMALL LETTER UPSILON WITH OXIA;Ll;0;L;03CD;;;;N;;;1FEB;;1FEB +1F7C;GREEK SMALL LETTER OMEGA WITH VARIA;Ll;0;L;03C9 0300;;;;N;;;1FFA;;1FFA +1F7D;GREEK SMALL LETTER OMEGA WITH OXIA;Ll;0;L;03CE;;;;N;;;1FFB;;1FFB +1F80;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F00 0345;;;;N;;;1F88;;1F88 +1F81;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F01 0345;;;;N;;;1F89;;1F89 +1F82;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F02 0345;;;;N;;;1F8A;;1F8A +1F83;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F03 0345;;;;N;;;1F8B;;1F8B +1F84;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F04 0345;;;;N;;;1F8C;;1F8C +1F85;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F05 0345;;;;N;;;1F8D;;1F8D +1F86;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F06 0345;;;;N;;;1F8E;;1F8E +1F87;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F07 0345;;;;N;;;1F8F;;1F8F +1F88;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F08 0345;;;;N;;;;1F80; +1F89;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F09 0345;;;;N;;;;1F81; +1F8A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0A 0345;;;;N;;;;1F82; +1F8B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0B 0345;;;;N;;;;1F83; +1F8C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0C 0345;;;;N;;;;1F84; +1F8D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0D 0345;;;;N;;;;1F85; +1F8E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0E 0345;;;;N;;;;1F86; +1F8F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0F 0345;;;;N;;;;1F87; +1F90;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F20 0345;;;;N;;;1F98;;1F98 +1F91;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F21 0345;;;;N;;;1F99;;1F99 +1F92;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F22 0345;;;;N;;;1F9A;;1F9A +1F93;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F23 0345;;;;N;;;1F9B;;1F9B +1F94;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F24 0345;;;;N;;;1F9C;;1F9C +1F95;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F25 0345;;;;N;;;1F9D;;1F9D +1F96;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F26 0345;;;;N;;;1F9E;;1F9E +1F97;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F27 0345;;;;N;;;1F9F;;1F9F +1F98;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F28 0345;;;;N;;;;1F90; +1F99;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F29 0345;;;;N;;;;1F91; +1F9A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2A 0345;;;;N;;;;1F92; +1F9B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2B 0345;;;;N;;;;1F93; +1F9C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2C 0345;;;;N;;;;1F94; +1F9D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2D 0345;;;;N;;;;1F95; +1F9E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2E 0345;;;;N;;;;1F96; +1F9F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2F 0345;;;;N;;;;1F97; +1FA0;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F60 0345;;;;N;;;1FA8;;1FA8 +1FA1;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F61 0345;;;;N;;;1FA9;;1FA9 +1FA2;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F62 0345;;;;N;;;1FAA;;1FAA +1FA3;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F63 0345;;;;N;;;1FAB;;1FAB +1FA4;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F64 0345;;;;N;;;1FAC;;1FAC +1FA5;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F65 0345;;;;N;;;1FAD;;1FAD +1FA6;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F66 0345;;;;N;;;1FAE;;1FAE +1FA7;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F67 0345;;;;N;;;1FAF;;1FAF +1FA8;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F68 0345;;;;N;;;;1FA0; +1FA9;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F69 0345;;;;N;;;;1FA1; +1FAA;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6A 0345;;;;N;;;;1FA2; +1FAB;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6B 0345;;;;N;;;;1FA3; +1FAC;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6C 0345;;;;N;;;;1FA4; +1FAD;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6D 0345;;;;N;;;;1FA5; +1FAE;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6E 0345;;;;N;;;;1FA6; +1FAF;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6F 0345;;;;N;;;;1FA7; +1FB0;GREEK SMALL LETTER ALPHA WITH VRACHY;Ll;0;L;03B1 0306;;;;N;;;1FB8;;1FB8 +1FB1;GREEK SMALL LETTER ALPHA WITH MACRON;Ll;0;L;03B1 0304;;;;N;;;1FB9;;1FB9 +1FB2;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F70 0345;;;;N;;;;; +1FB3;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI;Ll;0;L;03B1 0345;;;;N;;;1FBC;;1FBC +1FB4;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AC 0345;;;;N;;;;; +1FB6;GREEK SMALL LETTER ALPHA WITH PERISPOMENI;Ll;0;L;03B1 0342;;;;N;;;;; +1FB7;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FB6 0345;;;;N;;;;; +1FB8;GREEK CAPITAL LETTER ALPHA WITH VRACHY;Lu;0;L;0391 0306;;;;N;;;;1FB0; +1FB9;GREEK CAPITAL LETTER ALPHA WITH MACRON;Lu;0;L;0391 0304;;;;N;;;;1FB1; +1FBA;GREEK CAPITAL LETTER ALPHA WITH VARIA;Lu;0;L;0391 0300;;;;N;;;;1F70; +1FBB;GREEK CAPITAL LETTER ALPHA WITH OXIA;Lu;0;L;0386;;;;N;;;;1F71; +1FBC;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI;Lt;0;L;0391 0345;;;;N;;;;1FB3; +1FBD;GREEK KORONIS;Sk;0;ON;<compat> 0020 0313;;;;N;;;;; +1FBE;GREEK PROSGEGRAMMENI;Ll;0;L;03B9;;;;N;;;0399;;0399 +1FBF;GREEK PSILI;Sk;0;ON;<compat> 0020 0313;;;;N;;;;; +1FC0;GREEK PERISPOMENI;Sk;0;ON;<compat> 0020 0342;;;;N;;;;; +1FC1;GREEK DIALYTIKA AND PERISPOMENI;Sk;0;ON;00A8 0342;;;;N;;;;; +1FC2;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F74 0345;;;;N;;;;; +1FC3;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI;Ll;0;L;03B7 0345;;;;N;;;1FCC;;1FCC +1FC4;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AE 0345;;;;N;;;;; +1FC6;GREEK SMALL LETTER ETA WITH PERISPOMENI;Ll;0;L;03B7 0342;;;;N;;;;; +1FC7;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FC6 0345;;;;N;;;;; +1FC8;GREEK CAPITAL LETTER EPSILON WITH VARIA;Lu;0;L;0395 0300;;;;N;;;;1F72; +1FC9;GREEK CAPITAL LETTER EPSILON WITH OXIA;Lu;0;L;0388;;;;N;;;;1F73; +1FCA;GREEK CAPITAL LETTER ETA WITH VARIA;Lu;0;L;0397 0300;;;;N;;;;1F74; +1FCB;GREEK CAPITAL LETTER ETA WITH OXIA;Lu;0;L;0389;;;;N;;;;1F75; +1FCC;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI;Lt;0;L;0397 0345;;;;N;;;;1FC3; +1FCD;GREEK PSILI AND VARIA;Sk;0;ON;1FBF 0300;;;;N;;;;; +1FCE;GREEK PSILI AND OXIA;Sk;0;ON;1FBF 0301;;;;N;;;;; +1FCF;GREEK PSILI AND PERISPOMENI;Sk;0;ON;1FBF 0342;;;;N;;;;; +1FD0;GREEK SMALL LETTER IOTA WITH VRACHY;Ll;0;L;03B9 0306;;;;N;;;1FD8;;1FD8 +1FD1;GREEK SMALL LETTER IOTA WITH MACRON;Ll;0;L;03B9 0304;;;;N;;;1FD9;;1FD9 +1FD2;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA;Ll;0;L;03CA 0300;;;;N;;;;; +1FD3;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA;Ll;0;L;0390;;;;N;;;;; +1FD6;GREEK SMALL LETTER IOTA WITH PERISPOMENI;Ll;0;L;03B9 0342;;;;N;;;;; +1FD7;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CA 0342;;;;N;;;;; +1FD8;GREEK CAPITAL LETTER IOTA WITH VRACHY;Lu;0;L;0399 0306;;;;N;;;;1FD0; +1FD9;GREEK CAPITAL LETTER IOTA WITH MACRON;Lu;0;L;0399 0304;;;;N;;;;1FD1; +1FDA;GREEK CAPITAL LETTER IOTA WITH VARIA;Lu;0;L;0399 0300;;;;N;;;;1F76; +1FDB;GREEK CAPITAL LETTER IOTA WITH OXIA;Lu;0;L;038A;;;;N;;;;1F77; +1FDD;GREEK DASIA AND VARIA;Sk;0;ON;1FFE 0300;;;;N;;;;; +1FDE;GREEK DASIA AND OXIA;Sk;0;ON;1FFE 0301;;;;N;;;;; +1FDF;GREEK DASIA AND PERISPOMENI;Sk;0;ON;1FFE 0342;;;;N;;;;; +1FE0;GREEK SMALL LETTER UPSILON WITH VRACHY;Ll;0;L;03C5 0306;;;;N;;;1FE8;;1FE8 +1FE1;GREEK SMALL LETTER UPSILON WITH MACRON;Ll;0;L;03C5 0304;;;;N;;;1FE9;;1FE9 +1FE2;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA;Ll;0;L;03CB 0300;;;;N;;;;; +1FE3;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA;Ll;0;L;03B0;;;;N;;;;; +1FE4;GREEK SMALL LETTER RHO WITH PSILI;Ll;0;L;03C1 0313;;;;N;;;;; +1FE5;GREEK SMALL LETTER RHO WITH DASIA;Ll;0;L;03C1 0314;;;;N;;;1FEC;;1FEC +1FE6;GREEK SMALL LETTER UPSILON WITH PERISPOMENI;Ll;0;L;03C5 0342;;;;N;;;;; +1FE7;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CB 0342;;;;N;;;;; +1FE8;GREEK CAPITAL LETTER UPSILON WITH VRACHY;Lu;0;L;03A5 0306;;;;N;;;;1FE0; +1FE9;GREEK CAPITAL LETTER UPSILON WITH MACRON;Lu;0;L;03A5 0304;;;;N;;;;1FE1; +1FEA;GREEK CAPITAL LETTER UPSILON WITH VARIA;Lu;0;L;03A5 0300;;;;N;;;;1F7A; +1FEB;GREEK CAPITAL LETTER UPSILON WITH OXIA;Lu;0;L;038E;;;;N;;;;1F7B; +1FEC;GREEK CAPITAL LETTER RHO WITH DASIA;Lu;0;L;03A1 0314;;;;N;;;;1FE5; +1FED;GREEK DIALYTIKA AND VARIA;Sk;0;ON;00A8 0300;;;;N;;;;; +1FEE;GREEK DIALYTIKA AND OXIA;Sk;0;ON;0385;;;;N;;;;; +1FEF;GREEK VARIA;Sk;0;ON;0060;;;;N;;;;; +1FF2;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F7C 0345;;;;N;;;;; +1FF3;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI;Ll;0;L;03C9 0345;;;;N;;;1FFC;;1FFC +1FF4;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03CE 0345;;;;N;;;;; +1FF6;GREEK SMALL LETTER OMEGA WITH PERISPOMENI;Ll;0;L;03C9 0342;;;;N;;;;; +1FF7;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FF6 0345;;;;N;;;;; +1FF8;GREEK CAPITAL LETTER OMICRON WITH VARIA;Lu;0;L;039F 0300;;;;N;;;;1F78; +1FF9;GREEK CAPITAL LETTER OMICRON WITH OXIA;Lu;0;L;038C;;;;N;;;;1F79; +1FFA;GREEK CAPITAL LETTER OMEGA WITH VARIA;Lu;0;L;03A9 0300;;;;N;;;;1F7C; +1FFB;GREEK CAPITAL LETTER OMEGA WITH OXIA;Lu;0;L;038F;;;;N;;;;1F7D; +1FFC;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI;Lt;0;L;03A9 0345;;;;N;;;;1FF3; +1FFD;GREEK OXIA;Sk;0;ON;00B4;;;;N;;;;; +1FFE;GREEK DASIA;Sk;0;ON;<compat> 0020 0314;;;;N;;;;; +2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;; +2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;; +2002;EN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2003;EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2004;THREE-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2005;FOUR-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2006;SIX-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2007;FIGURE SPACE;Zs;0;WS;<noBreak> 0020;;;;N;;;;; +2008;PUNCTUATION SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2009;THIN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +200A;HAIR SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +200B;ZERO WIDTH SPACE;Cf;0;BN;;;;;N;;;;; +200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;; +200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;; +200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;; +200F;RIGHT-TO-LEFT MARK;Cf;0;R;;;;;N;;;;; +2010;HYPHEN;Pd;0;ON;;;;;N;;;;; +2011;NON-BREAKING HYPHEN;Pd;0;ON;<noBreak> 2010;;;;N;;;;; +2012;FIGURE DASH;Pd;0;ON;;;;;N;;;;; +2013;EN DASH;Pd;0;ON;;;;;N;;;;; +2014;EM DASH;Pd;0;ON;;;;;N;;;;; +2015;HORIZONTAL BAR;Pd;0;ON;;;;;N;QUOTATION DASH;;;; +2016;DOUBLE VERTICAL LINE;Po;0;ON;;;;;N;DOUBLE VERTICAL BAR;;;; +2017;DOUBLE LOW LINE;Po;0;ON;<compat> 0020 0333;;;;N;SPACING DOUBLE UNDERSCORE;;;; +2018;LEFT SINGLE QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE TURNED COMMA QUOTATION MARK;;;; +2019;RIGHT SINGLE QUOTATION MARK;Pf;0;ON;;;;;N;SINGLE COMMA QUOTATION MARK;;;; +201A;SINGLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW SINGLE COMMA QUOTATION MARK;;;; +201B;SINGLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE REVERSED COMMA QUOTATION MARK;;;; +201C;LEFT DOUBLE QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE TURNED COMMA QUOTATION MARK;;;; +201D;RIGHT DOUBLE QUOTATION MARK;Pf;0;ON;;;;;N;DOUBLE COMMA QUOTATION MARK;;;; +201E;DOUBLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW DOUBLE COMMA QUOTATION MARK;;;; +201F;DOUBLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE REVERSED COMMA QUOTATION MARK;;;; +2020;DAGGER;Po;0;ON;;;;;N;;;;; +2021;DOUBLE DAGGER;Po;0;ON;;;;;N;;;;; +2022;BULLET;Po;0;ON;;;;;N;;;;; +2023;TRIANGULAR BULLET;Po;0;ON;;;;;N;;;;; +2024;ONE DOT LEADER;Po;0;ON;<compat> 002E;;;;N;;;;; +2025;TWO DOT LEADER;Po;0;ON;<compat> 002E 002E;;;;N;;;;; +2026;HORIZONTAL ELLIPSIS;Po;0;ON;<compat> 002E 002E 002E;;;;N;;;;; +2027;HYPHENATION POINT;Po;0;ON;;;;;N;;;;; +2028;LINE SEPARATOR;Zl;0;WS;;;;;N;;;;; +2029;PARAGRAPH SEPARATOR;Zp;0;B;;;;;N;;;;; +202A;LEFT-TO-RIGHT EMBEDDING;Cf;0;LRE;;;;;N;;;;; +202B;RIGHT-TO-LEFT EMBEDDING;Cf;0;RLE;;;;;N;;;;; +202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;; +202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;; +202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;; +202F;NARROW NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;;;;; +2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;; +2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; +2032;PRIME;Po;0;ET;;;;;N;;;;; +2033;DOUBLE PRIME;Po;0;ET;<compat> 2032 2032;;;;N;;;;; +2034;TRIPLE PRIME;Po;0;ET;<compat> 2032 2032 2032;;;;N;;;;; +2035;REVERSED PRIME;Po;0;ON;;;;;N;;;;; +2036;REVERSED DOUBLE PRIME;Po;0;ON;<compat> 2035 2035;;;;N;;;;; +2037;REVERSED TRIPLE PRIME;Po;0;ON;<compat> 2035 2035 2035;;;;N;;;;; +2038;CARET;Po;0;ON;;;;;N;;;;; +2039;SINGLE LEFT-POINTING ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING SINGLE GUILLEMET;;;; +203A;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING SINGLE GUILLEMET;;;; +203B;REFERENCE MARK;Po;0;ON;;;;;N;;;;; +203C;DOUBLE EXCLAMATION MARK;Po;0;ON;<compat> 0021 0021;;;;N;;;;; +203D;INTERROBANG;Po;0;ON;;;;;N;;;;; +203E;OVERLINE;Po;0;ON;<compat> 0020 0305;;;;N;SPACING OVERSCORE;;;; +203F;UNDERTIE;Pc;0;ON;;;;;N;;;;; +2040;CHARACTER TIE;Pc;0;ON;;;;;N;;;;; +2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;; +2042;ASTERISM;Po;0;ON;;;;;N;;;;; +2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;; +2044;FRACTION SLASH;Sm;0;CS;;;;;N;;;;; +2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;; +2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;; +2047;DOUBLE QUESTION MARK;Po;0;ON;<compat> 003F 003F;;;;N;;;;; +2048;QUESTION EXCLAMATION MARK;Po;0;ON;<compat> 003F 0021;;;;N;;;;; +2049;EXCLAMATION QUESTION MARK;Po;0;ON;<compat> 0021 003F;;;;N;;;;; +204A;TIRONIAN SIGN ET;Po;0;ON;;;;;N;;;;; +204B;REVERSED PILCROW SIGN;Po;0;ON;;;;;N;;;;; +204C;BLACK LEFTWARDS BULLET;Po;0;ON;;;;;N;;;;; +204D;BLACK RIGHTWARDS BULLET;Po;0;ON;;;;;N;;;;; +204E;LOW ASTERISK;Po;0;ON;;;;;N;;;;; +204F;REVERSED SEMICOLON;Po;0;ON;;;;;N;;;;; +2050;CLOSE UP;Po;0;ON;;;;;N;;;;; +2051;TWO ASTERISKS ALIGNED VERTICALLY;Po;0;ON;;;;;N;;;;; +2052;COMMERCIAL MINUS SIGN;Sm;0;ON;;;;;N;;;;; +2053;SWUNG DASH;Po;0;ON;;;;;N;;;;; +2054;INVERTED UNDERTIE;Pc;0;ON;;;;;N;;;;; +2055;FLOWER PUNCTUATION MARK;Po;0;ON;;;;;N;;;;; +2056;THREE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2057;QUADRUPLE PRIME;Po;0;ON;<compat> 2032 2032 2032 2032;;;;N;;;;; +2058;FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2059;FIVE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +205A;TWO DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +205B;FOUR DOT MARK;Po;0;ON;;;;;N;;;;; +205C;DOTTED CROSS;Po;0;ON;;;;;N;;;;; +205D;TRICOLON;Po;0;ON;;;;;N;;;;; +205E;VERTICAL FOUR DOTS;Po;0;ON;;;;;N;;;;; +205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2060;WORD JOINER;Cf;0;BN;;;;;N;;;;; +2061;FUNCTION APPLICATION;Cf;0;BN;;;;;N;;;;; +2062;INVISIBLE TIMES;Cf;0;BN;;;;;N;;;;; +2063;INVISIBLE SEPARATOR;Cf;0;BN;;;;;N;;;;; +2064;INVISIBLE PLUS;Cf;0;BN;;;;;N;;;;; +206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; +206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; +206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; +206D;ACTIVATE ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; +206E;NATIONAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; +206F;NOMINAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; +2070;SUPERSCRIPT ZERO;No;0;EN;<super> 0030;;0;0;N;SUPERSCRIPT DIGIT ZERO;;;; +2071;SUPERSCRIPT LATIN SMALL LETTER I;Lm;0;L;<super> 0069;;;;N;;;;; +2074;SUPERSCRIPT FOUR;No;0;EN;<super> 0034;;4;4;N;SUPERSCRIPT DIGIT FOUR;;;; +2075;SUPERSCRIPT FIVE;No;0;EN;<super> 0035;;5;5;N;SUPERSCRIPT DIGIT FIVE;;;; +2076;SUPERSCRIPT SIX;No;0;EN;<super> 0036;;6;6;N;SUPERSCRIPT DIGIT SIX;;;; +2077;SUPERSCRIPT SEVEN;No;0;EN;<super> 0037;;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;; +2078;SUPERSCRIPT EIGHT;No;0;EN;<super> 0038;;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;; +2079;SUPERSCRIPT NINE;No;0;EN;<super> 0039;;9;9;N;SUPERSCRIPT DIGIT NINE;;;; +207A;SUPERSCRIPT PLUS SIGN;Sm;0;ES;<super> 002B;;;;N;;;;; +207B;SUPERSCRIPT MINUS;Sm;0;ES;<super> 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;; +207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON;<super> 003D;;;;N;;;;; +207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON;<super> 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;; +207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<super> 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;; +207F;SUPERSCRIPT LATIN SMALL LETTER N;Lm;0;L;<super> 006E;;;;N;;;;; +2080;SUBSCRIPT ZERO;No;0;EN;<sub> 0030;;0;0;N;SUBSCRIPT DIGIT ZERO;;;; +2081;SUBSCRIPT ONE;No;0;EN;<sub> 0031;;1;1;N;SUBSCRIPT DIGIT ONE;;;; +2082;SUBSCRIPT TWO;No;0;EN;<sub> 0032;;2;2;N;SUBSCRIPT DIGIT TWO;;;; +2083;SUBSCRIPT THREE;No;0;EN;<sub> 0033;;3;3;N;SUBSCRIPT DIGIT THREE;;;; +2084;SUBSCRIPT FOUR;No;0;EN;<sub> 0034;;4;4;N;SUBSCRIPT DIGIT FOUR;;;; +2085;SUBSCRIPT FIVE;No;0;EN;<sub> 0035;;5;5;N;SUBSCRIPT DIGIT FIVE;;;; +2086;SUBSCRIPT SIX;No;0;EN;<sub> 0036;;6;6;N;SUBSCRIPT DIGIT SIX;;;; +2087;SUBSCRIPT SEVEN;No;0;EN;<sub> 0037;;7;7;N;SUBSCRIPT DIGIT SEVEN;;;; +2088;SUBSCRIPT EIGHT;No;0;EN;<sub> 0038;;8;8;N;SUBSCRIPT DIGIT EIGHT;;;; +2089;SUBSCRIPT NINE;No;0;EN;<sub> 0039;;9;9;N;SUBSCRIPT DIGIT NINE;;;; +208A;SUBSCRIPT PLUS SIGN;Sm;0;ES;<sub> 002B;;;;N;;;;; +208B;SUBSCRIPT MINUS;Sm;0;ES;<sub> 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;; +208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON;<sub> 003D;;;;N;;;;; +208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON;<sub> 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;; +208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<sub> 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;; +2090;LATIN SUBSCRIPT SMALL LETTER A;Lm;0;L;<sub> 0061;;;;N;;;;; +2091;LATIN SUBSCRIPT SMALL LETTER E;Lm;0;L;<sub> 0065;;;;N;;;;; +2092;LATIN SUBSCRIPT SMALL LETTER O;Lm;0;L;<sub> 006F;;;;N;;;;; +2093;LATIN SUBSCRIPT SMALL LETTER X;Lm;0;L;<sub> 0078;;;;N;;;;; +2094;LATIN SUBSCRIPT SMALL LETTER SCHWA;Lm;0;L;<sub> 0259;;;;N;;;;; +20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; +20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;; +20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;; +20A3;FRENCH FRANC SIGN;Sc;0;ET;;;;;N;;;;; +20A4;LIRA SIGN;Sc;0;ET;;;;;N;;;;; +20A5;MILL SIGN;Sc;0;ET;;;;;N;;;;; +20A6;NAIRA SIGN;Sc;0;ET;;;;;N;;;;; +20A7;PESETA SIGN;Sc;0;ET;;;;;N;;;;; +20A8;RUPEE SIGN;Sc;0;ET;<compat> 0052 0073;;;;N;;;;; +20A9;WON SIGN;Sc;0;ET;;;;;N;;;;; +20AA;NEW SHEQEL SIGN;Sc;0;ET;;;;;N;;;;; +20AB;DONG SIGN;Sc;0;ET;;;;;N;;;;; +20AC;EURO SIGN;Sc;0;ET;;;;;N;;;;; +20AD;KIP SIGN;Sc;0;ET;;;;;N;;;;; +20AE;TUGRIK SIGN;Sc;0;ET;;;;;N;;;;; +20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;; +20B0;GERMAN PENNY SIGN;Sc;0;ET;;;;;N;;;;; +20B1;PESO SIGN;Sc;0;ET;;;;;N;;;;; +20B2;GUARANI SIGN;Sc;0;ET;;;;;N;;;;; +20B3;AUSTRAL SIGN;Sc;0;ET;;;;;N;;;;; +20B4;HRYVNIA SIGN;Sc;0;ET;;;;;N;;;;; +20B5;CEDI SIGN;Sc;0;ET;;;;;N;;;;; +20B6;LIVRE TOURNOIS SIGN;Sc;0;ET;;;;;N;;;;; +20B7;SPESMILO SIGN;Sc;0;ET;;;;;N;;;;; +20B8;TENGE SIGN;Sc;0;ET;;;;;N;;;;; +20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;; +20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;; +20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;; +20D3;COMBINING SHORT VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT VERTICAL BAR OVERLAY;;;; +20D4;COMBINING ANTICLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING ANTICLOCKWISE ARROW ABOVE;;;; +20D5;COMBINING CLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING CLOCKWISE ARROW ABOVE;;;; +20D6;COMBINING LEFT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT ARROW ABOVE;;;; +20D7;COMBINING RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT ARROW ABOVE;;;; +20D8;COMBINING RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING RING OVERLAY;;;; +20D9;COMBINING CLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING CLOCKWISE RING OVERLAY;;;; +20DA;COMBINING ANTICLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING ANTICLOCKWISE RING OVERLAY;;;; +20DB;COMBINING THREE DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING THREE DOTS ABOVE;;;; +20DC;COMBINING FOUR DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING FOUR DOTS ABOVE;;;; +20DD;COMBINING ENCLOSING CIRCLE;Me;0;NSM;;;;;N;ENCLOSING CIRCLE;;;; +20DE;COMBINING ENCLOSING SQUARE;Me;0;NSM;;;;;N;ENCLOSING SQUARE;;;; +20DF;COMBINING ENCLOSING DIAMOND;Me;0;NSM;;;;;N;ENCLOSING DIAMOND;;;; +20E0;COMBINING ENCLOSING CIRCLE BACKSLASH;Me;0;NSM;;;;;N;ENCLOSING CIRCLE SLASH;;;; +20E1;COMBINING LEFT RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT RIGHT ARROW ABOVE;;;; +20E2;COMBINING ENCLOSING SCREEN;Me;0;NSM;;;;;N;;;;; +20E3;COMBINING ENCLOSING KEYCAP;Me;0;NSM;;;;;N;;;;; +20E4;COMBINING ENCLOSING UPWARD POINTING TRIANGLE;Me;0;NSM;;;;;N;;;;; +20E5;COMBINING REVERSE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; +20E6;COMBINING DOUBLE VERTICAL STROKE OVERLAY;Mn;1;NSM;;;;;N;;;;; +20E7;COMBINING ANNUITY SYMBOL;Mn;230;NSM;;;;;N;;;;; +20E8;COMBINING TRIPLE UNDERDOT;Mn;220;NSM;;;;;N;;;;; +20E9;COMBINING WIDE BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; +20EA;COMBINING LEFTWARDS ARROW OVERLAY;Mn;1;NSM;;;;;N;;;;; +20EB;COMBINING LONG DOUBLE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; +20EC;COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; +20ED;COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; +20EE;COMBINING LEFT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +20EF;COMBINING RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +20F0;COMBINING ASTERISK ABOVE;Mn;230;NSM;;;;;N;;;;; +2100;ACCOUNT OF;So;0;ON;<compat> 0061 002F 0063;;;;N;;;;; +2101;ADDRESSED TO THE SUBJECT;So;0;ON;<compat> 0061 002F 0073;;;;N;;;;; +2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L;<font> 0043;;;;N;DOUBLE-STRUCK C;;;; +2103;DEGREE CELSIUS;So;0;ON;<compat> 00B0 0043;;;;N;DEGREES CENTIGRADE;;;; +2104;CENTRE LINE SYMBOL;So;0;ON;;;;;N;C L SYMBOL;;;; +2105;CARE OF;So;0;ON;<compat> 0063 002F 006F;;;;N;;;;; +2106;CADA UNA;So;0;ON;<compat> 0063 002F 0075;;;;N;;;;; +2107;EULER CONSTANT;Lu;0;L;<compat> 0190;;;;N;EULERS;;;; +2108;SCRUPLE;So;0;ON;;;;;N;;;;; +2109;DEGREE FAHRENHEIT;So;0;ON;<compat> 00B0 0046;;;;N;DEGREES FAHRENHEIT;;;; +210A;SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +210B;SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;SCRIPT H;;;; +210C;BLACK-LETTER CAPITAL H;Lu;0;L;<font> 0048;;;;N;BLACK-LETTER H;;;; +210D;DOUBLE-STRUCK CAPITAL H;Lu;0;L;<font> 0048;;;;N;DOUBLE-STRUCK H;;;; +210E;PLANCK CONSTANT;Ll;0;L;<font> 0068;;;;N;;;;; +210F;PLANCK CONSTANT OVER TWO PI;Ll;0;L;<font> 0127;;;;N;PLANCK CONSTANT OVER 2 PI;;;; +2110;SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;SCRIPT I;;;; +2111;BLACK-LETTER CAPITAL I;Lu;0;L;<font> 0049;;;;N;BLACK-LETTER I;;;; +2112;SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;SCRIPT L;;;; +2113;SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +2114;L B BAR SYMBOL;So;0;ON;;;;;N;;;;; +2115;DOUBLE-STRUCK CAPITAL N;Lu;0;L;<font> 004E;;;;N;DOUBLE-STRUCK N;;;; +2116;NUMERO SIGN;So;0;ON;<compat> 004E 006F;;;;N;NUMERO;;;; +2117;SOUND RECORDING COPYRIGHT;So;0;ON;;;;;N;;;;; +2118;SCRIPT CAPITAL P;So;0;ON;;;;;N;SCRIPT P;;;; +2119;DOUBLE-STRUCK CAPITAL P;Lu;0;L;<font> 0050;;;;N;DOUBLE-STRUCK P;;;; +211A;DOUBLE-STRUCK CAPITAL Q;Lu;0;L;<font> 0051;;;;N;DOUBLE-STRUCK Q;;;; +211B;SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;SCRIPT R;;;; +211C;BLACK-LETTER CAPITAL R;Lu;0;L;<font> 0052;;;;N;BLACK-LETTER R;;;; +211D;DOUBLE-STRUCK CAPITAL R;Lu;0;L;<font> 0052;;;;N;DOUBLE-STRUCK R;;;; +211E;PRESCRIPTION TAKE;So;0;ON;;;;;N;;;;; +211F;RESPONSE;So;0;ON;;;;;N;;;;; +2120;SERVICE MARK;So;0;ON;<super> 0053 004D;;;;N;;;;; +2121;TELEPHONE SIGN;So;0;ON;<compat> 0054 0045 004C;;;;N;T E L SYMBOL;;;; +2122;TRADE MARK SIGN;So;0;ON;<super> 0054 004D;;;;N;TRADEMARK;;;; +2123;VERSICLE;So;0;ON;;;;;N;;;;; +2124;DOUBLE-STRUCK CAPITAL Z;Lu;0;L;<font> 005A;;;;N;DOUBLE-STRUCK Z;;;; +2125;OUNCE SIGN;So;0;ON;;;;;N;OUNCE;;;; +2126;OHM SIGN;Lu;0;L;03A9;;;;N;OHM;;;03C9; +2127;INVERTED OHM SIGN;So;0;ON;;;;;N;MHO;;;; +2128;BLACK-LETTER CAPITAL Z;Lu;0;L;<font> 005A;;;;N;BLACK-LETTER Z;;;; +2129;TURNED GREEK SMALL LETTER IOTA;So;0;ON;;;;;N;;;;; +212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B; +212B;ANGSTROM SIGN;Lu;0;L;00C5;;;;N;ANGSTROM UNIT;;;00E5; +212C;SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;SCRIPT B;;;; +212D;BLACK-LETTER CAPITAL C;Lu;0;L;<font> 0043;;;;N;BLACK-LETTER C;;;; +212E;ESTIMATED SYMBOL;So;0;ET;;;;;N;;;;; +212F;SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +2130;SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;SCRIPT E;;;; +2131;SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;SCRIPT F;;;; +2132;TURNED CAPITAL F;Lu;0;L;;;;;N;TURNED F;;;214E; +2133;SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;SCRIPT M;;;; +2134;SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +2135;ALEF SYMBOL;Lo;0;L;<compat> 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;; +2136;BET SYMBOL;Lo;0;L;<compat> 05D1;;;;N;SECOND TRANSFINITE CARDINAL;;;; +2137;GIMEL SYMBOL;Lo;0;L;<compat> 05D2;;;;N;THIRD TRANSFINITE CARDINAL;;;; +2138;DALET SYMBOL;Lo;0;L;<compat> 05D3;;;;N;FOURTH TRANSFINITE CARDINAL;;;; +2139;INFORMATION SOURCE;Ll;0;L;<font> 0069;;;;N;;;;; +213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;; +213B;FACSIMILE SIGN;So;0;ON;<compat> 0046 0041 0058;;;;N;;;;; +213C;DOUBLE-STRUCK SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +213D;DOUBLE-STRUCK SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +213E;DOUBLE-STRUCK CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +213F;DOUBLE-STRUCK CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +2140;DOUBLE-STRUCK N-ARY SUMMATION;Sm;0;ON;<font> 2211;;;;Y;;;;; +2141;TURNED SANS-SERIF CAPITAL G;Sm;0;ON;;;;;N;;;;; +2142;TURNED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;; +2143;REVERSED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;; +2144;TURNED SANS-SERIF CAPITAL Y;Sm;0;ON;;;;;N;;;;; +2145;DOUBLE-STRUCK ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +2146;DOUBLE-STRUCK ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +2147;DOUBLE-STRUCK ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +2148;DOUBLE-STRUCK ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +2149;DOUBLE-STRUCK ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +214A;PROPERTY LINE;So;0;ON;;;;;N;;;;; +214B;TURNED AMPERSAND;Sm;0;ON;;;;;N;;;;; +214C;PER SIGN;So;0;ON;;;;;N;;;;; +214D;AKTIESELSKAB;So;0;ON;;;;;N;;;;; +214E;TURNED SMALL F;Ll;0;L;;;;;N;;;2132;;2132 +214F;SYMBOL FOR SAMARITAN SOURCE;So;0;L;;;;;N;;;;; +2150;VULGAR FRACTION ONE SEVENTH;No;0;ON;<fraction> 0031 2044 0037;;;1/7;N;;;;; +2151;VULGAR FRACTION ONE NINTH;No;0;ON;<fraction> 0031 2044 0039;;;1/9;N;;;;; +2152;VULGAR FRACTION ONE TENTH;No;0;ON;<fraction> 0031 2044 0031 0030;;;1/10;N;;;;; +2153;VULGAR FRACTION ONE THIRD;No;0;ON;<fraction> 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;; +2154;VULGAR FRACTION TWO THIRDS;No;0;ON;<fraction> 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;; +2155;VULGAR FRACTION ONE FIFTH;No;0;ON;<fraction> 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;; +2156;VULGAR FRACTION TWO FIFTHS;No;0;ON;<fraction> 0032 2044 0035;;;2/5;N;FRACTION TWO FIFTHS;;;; +2157;VULGAR FRACTION THREE FIFTHS;No;0;ON;<fraction> 0033 2044 0035;;;3/5;N;FRACTION THREE FIFTHS;;;; +2158;VULGAR FRACTION FOUR FIFTHS;No;0;ON;<fraction> 0034 2044 0035;;;4/5;N;FRACTION FOUR FIFTHS;;;; +2159;VULGAR FRACTION ONE SIXTH;No;0;ON;<fraction> 0031 2044 0036;;;1/6;N;FRACTION ONE SIXTH;;;; +215A;VULGAR FRACTION FIVE SIXTHS;No;0;ON;<fraction> 0035 2044 0036;;;5/6;N;FRACTION FIVE SIXTHS;;;; +215B;VULGAR FRACTION ONE EIGHTH;No;0;ON;<fraction> 0031 2044 0038;;;1/8;N;FRACTION ONE EIGHTH;;;; +215C;VULGAR FRACTION THREE EIGHTHS;No;0;ON;<fraction> 0033 2044 0038;;;3/8;N;FRACTION THREE EIGHTHS;;;; +215D;VULGAR FRACTION FIVE EIGHTHS;No;0;ON;<fraction> 0035 2044 0038;;;5/8;N;FRACTION FIVE EIGHTHS;;;; +215E;VULGAR FRACTION SEVEN EIGHTHS;No;0;ON;<fraction> 0037 2044 0038;;;7/8;N;FRACTION SEVEN EIGHTHS;;;; +215F;FRACTION NUMERATOR ONE;No;0;ON;<fraction> 0031 2044;;;1;N;;;;; +2160;ROMAN NUMERAL ONE;Nl;0;L;<compat> 0049;;;1;N;;;;2170; +2161;ROMAN NUMERAL TWO;Nl;0;L;<compat> 0049 0049;;;2;N;;;;2171; +2162;ROMAN NUMERAL THREE;Nl;0;L;<compat> 0049 0049 0049;;;3;N;;;;2172; +2163;ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0049 0056;;;4;N;;;;2173; +2164;ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0056;;;5;N;;;;2174; +2165;ROMAN NUMERAL SIX;Nl;0;L;<compat> 0056 0049;;;6;N;;;;2175; +2166;ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0056 0049 0049;;;7;N;;;;2176; +2167;ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0056 0049 0049 0049;;;8;N;;;;2177; +2168;ROMAN NUMERAL NINE;Nl;0;L;<compat> 0049 0058;;;9;N;;;;2178; +2169;ROMAN NUMERAL TEN;Nl;0;L;<compat> 0058;;;10;N;;;;2179; +216A;ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0058 0049;;;11;N;;;;217A; +216B;ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0058 0049 0049;;;12;N;;;;217B; +216C;ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 004C;;;50;N;;;;217C; +216D;ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0043;;;100;N;;;;217D; +216E;ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0044;;;500;N;;;;217E; +216F;ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 004D;;;1000;N;;;;217F; +2170;SMALL ROMAN NUMERAL ONE;Nl;0;L;<compat> 0069;;;1;N;;;2160;;2160 +2171;SMALL ROMAN NUMERAL TWO;Nl;0;L;<compat> 0069 0069;;;2;N;;;2161;;2161 +2172;SMALL ROMAN NUMERAL THREE;Nl;0;L;<compat> 0069 0069 0069;;;3;N;;;2162;;2162 +2173;SMALL ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0069 0076;;;4;N;;;2163;;2163 +2174;SMALL ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0076;;;5;N;;;2164;;2164 +2175;SMALL ROMAN NUMERAL SIX;Nl;0;L;<compat> 0076 0069;;;6;N;;;2165;;2165 +2176;SMALL ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0076 0069 0069;;;7;N;;;2166;;2166 +2177;SMALL ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0076 0069 0069 0069;;;8;N;;;2167;;2167 +2178;SMALL ROMAN NUMERAL NINE;Nl;0;L;<compat> 0069 0078;;;9;N;;;2168;;2168 +2179;SMALL ROMAN NUMERAL TEN;Nl;0;L;<compat> 0078;;;10;N;;;2169;;2169 +217A;SMALL ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0078 0069;;;11;N;;;216A;;216A +217B;SMALL ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0078 0069 0069;;;12;N;;;216B;;216B +217C;SMALL ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 006C;;;50;N;;;216C;;216C +217D;SMALL ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0063;;;100;N;;;216D;;216D +217E;SMALL ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0064;;;500;N;;;216E;;216E +217F;SMALL ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 006D;;;1000;N;;;216F;;216F +2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;; +2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;; +2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;; +2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Lu;0;L;;;;;N;;;;2184; +2184;LATIN SMALL LETTER REVERSED C;Ll;0;L;;;;;N;;;2183;;2183 +2185;ROMAN NUMERAL SIX LATE FORM;Nl;0;L;;;;6;N;;;;; +2186;ROMAN NUMERAL FIFTY EARLY FORM;Nl;0;L;;;;50;N;;;;; +2187;ROMAN NUMERAL FIFTY THOUSAND;Nl;0;L;;;;50000;N;;;;; +2188;ROMAN NUMERAL ONE HUNDRED THOUSAND;Nl;0;L;;;;100000;N;;;;; +2189;VULGAR FRACTION ZERO THIRDS;No;0;ON;<fraction> 0030 2044 0033;;;0;N;;;;; +2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;; +2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;; +2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;; +2193;DOWNWARDS ARROW;Sm;0;ON;;;;;N;DOWN ARROW;;;; +2194;LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; +2195;UP DOWN ARROW;So;0;ON;;;;;N;;;;; +2196;NORTH WEST ARROW;So;0;ON;;;;;N;UPPER LEFT ARROW;;;; +2197;NORTH EAST ARROW;So;0;ON;;;;;N;UPPER RIGHT ARROW;;;; +2198;SOUTH EAST ARROW;So;0;ON;;;;;N;LOWER RIGHT ARROW;;;; +2199;SOUTH WEST ARROW;So;0;ON;;;;;N;LOWER LEFT ARROW;;;; +219A;LEFTWARDS ARROW WITH STROKE;Sm;0;ON;2190 0338;;;;N;LEFT ARROW WITH STROKE;;;; +219B;RIGHTWARDS ARROW WITH STROKE;Sm;0;ON;2192 0338;;;;N;RIGHT ARROW WITH STROKE;;;; +219C;LEFTWARDS WAVE ARROW;So;0;ON;;;;;N;LEFT WAVE ARROW;;;; +219D;RIGHTWARDS WAVE ARROW;So;0;ON;;;;;N;RIGHT WAVE ARROW;;;; +219E;LEFTWARDS TWO HEADED ARROW;So;0;ON;;;;;N;LEFT TWO HEADED ARROW;;;; +219F;UPWARDS TWO HEADED ARROW;So;0;ON;;;;;N;UP TWO HEADED ARROW;;;; +21A0;RIGHTWARDS TWO HEADED ARROW;Sm;0;ON;;;;;N;RIGHT TWO HEADED ARROW;;;; +21A1;DOWNWARDS TWO HEADED ARROW;So;0;ON;;;;;N;DOWN TWO HEADED ARROW;;;; +21A2;LEFTWARDS ARROW WITH TAIL;So;0;ON;;;;;N;LEFT ARROW WITH TAIL;;;; +21A3;RIGHTWARDS ARROW WITH TAIL;Sm;0;ON;;;;;N;RIGHT ARROW WITH TAIL;;;; +21A4;LEFTWARDS ARROW FROM BAR;So;0;ON;;;;;N;LEFT ARROW FROM BAR;;;; +21A5;UPWARDS ARROW FROM BAR;So;0;ON;;;;;N;UP ARROW FROM BAR;;;; +21A6;RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;RIGHT ARROW FROM BAR;;;; +21A7;DOWNWARDS ARROW FROM BAR;So;0;ON;;;;;N;DOWN ARROW FROM BAR;;;; +21A8;UP DOWN ARROW WITH BASE;So;0;ON;;;;;N;;;;; +21A9;LEFTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;LEFT ARROW WITH HOOK;;;; +21AA;RIGHTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;RIGHT ARROW WITH HOOK;;;; +21AB;LEFTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;LEFT ARROW WITH LOOP;;;; +21AC;RIGHTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;RIGHT ARROW WITH LOOP;;;; +21AD;LEFT RIGHT WAVE ARROW;So;0;ON;;;;;N;;;;; +21AE;LEFT RIGHT ARROW WITH STROKE;Sm;0;ON;2194 0338;;;;N;;;;; +21AF;DOWNWARDS ZIGZAG ARROW;So;0;ON;;;;;N;DOWN ZIGZAG ARROW;;;; +21B0;UPWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP LEFT;;;; +21B1;UPWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP RIGHT;;;; +21B2;DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP LEFT;;;; +21B3;DOWNWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP RIGHT;;;; +21B4;RIGHTWARDS ARROW WITH CORNER DOWNWARDS;So;0;ON;;;;;N;RIGHT ARROW WITH CORNER DOWN;;;; +21B5;DOWNWARDS ARROW WITH CORNER LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH CORNER LEFT;;;; +21B6;ANTICLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; +21B7;CLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; +21B8;NORTH WEST ARROW TO LONG BAR;So;0;ON;;;;;N;UPPER LEFT ARROW TO LONG BAR;;;; +21B9;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR;;;; +21BA;ANTICLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +21BB;CLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +21BC;LEFTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB UP;;;; +21BD;LEFTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB DOWN;;;; +21BE;UPWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB RIGHT;;;; +21BF;UPWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB LEFT;;;; +21C0;RIGHTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB UP;;;; +21C1;RIGHTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB DOWN;;;; +21C2;DOWNWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB RIGHT;;;; +21C3;DOWNWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB LEFT;;;; +21C4;RIGHTWARDS ARROW OVER LEFTWARDS ARROW;So;0;ON;;;;;N;RIGHT ARROW OVER LEFT ARROW;;;; +21C5;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW;So;0;ON;;;;;N;UP ARROW LEFT OF DOWN ARROW;;;; +21C6;LEFTWARDS ARROW OVER RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT ARROW OVER RIGHT ARROW;;;; +21C7;LEFTWARDS PAIRED ARROWS;So;0;ON;;;;;N;LEFT PAIRED ARROWS;;;; +21C8;UPWARDS PAIRED ARROWS;So;0;ON;;;;;N;UP PAIRED ARROWS;;;; +21C9;RIGHTWARDS PAIRED ARROWS;So;0;ON;;;;;N;RIGHT PAIRED ARROWS;;;; +21CA;DOWNWARDS PAIRED ARROWS;So;0;ON;;;;;N;DOWN PAIRED ARROWS;;;; +21CB;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON;So;0;ON;;;;;N;LEFT HARPOON OVER RIGHT HARPOON;;;; +21CC;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON;So;0;ON;;;;;N;RIGHT HARPOON OVER LEFT HARPOON;;;; +21CD;LEFTWARDS DOUBLE ARROW WITH STROKE;So;0;ON;21D0 0338;;;;N;LEFT DOUBLE ARROW WITH STROKE;;;; +21CE;LEFT RIGHT DOUBLE ARROW WITH STROKE;Sm;0;ON;21D4 0338;;;;N;;;;; +21CF;RIGHTWARDS DOUBLE ARROW WITH STROKE;Sm;0;ON;21D2 0338;;;;N;RIGHT DOUBLE ARROW WITH STROKE;;;; +21D0;LEFTWARDS DOUBLE ARROW;So;0;ON;;;;;N;LEFT DOUBLE ARROW;;;; +21D1;UPWARDS DOUBLE ARROW;So;0;ON;;;;;N;UP DOUBLE ARROW;;;; +21D2;RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;RIGHT DOUBLE ARROW;;;; +21D3;DOWNWARDS DOUBLE ARROW;So;0;ON;;;;;N;DOWN DOUBLE ARROW;;;; +21D4;LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +21D5;UP DOWN DOUBLE ARROW;So;0;ON;;;;;N;;;;; +21D6;NORTH WEST DOUBLE ARROW;So;0;ON;;;;;N;UPPER LEFT DOUBLE ARROW;;;; +21D7;NORTH EAST DOUBLE ARROW;So;0;ON;;;;;N;UPPER RIGHT DOUBLE ARROW;;;; +21D8;SOUTH EAST DOUBLE ARROW;So;0;ON;;;;;N;LOWER RIGHT DOUBLE ARROW;;;; +21D9;SOUTH WEST DOUBLE ARROW;So;0;ON;;;;;N;LOWER LEFT DOUBLE ARROW;;;; +21DA;LEFTWARDS TRIPLE ARROW;So;0;ON;;;;;N;LEFT TRIPLE ARROW;;;; +21DB;RIGHTWARDS TRIPLE ARROW;So;0;ON;;;;;N;RIGHT TRIPLE ARROW;;;; +21DC;LEFTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;LEFT SQUIGGLE ARROW;;;; +21DD;RIGHTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;RIGHT SQUIGGLE ARROW;;;; +21DE;UPWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;UP ARROW WITH DOUBLE STROKE;;;; +21DF;DOWNWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;DOWN ARROW WITH DOUBLE STROKE;;;; +21E0;LEFTWARDS DASHED ARROW;So;0;ON;;;;;N;LEFT DASHED ARROW;;;; +21E1;UPWARDS DASHED ARROW;So;0;ON;;;;;N;UP DASHED ARROW;;;; +21E2;RIGHTWARDS DASHED ARROW;So;0;ON;;;;;N;RIGHT DASHED ARROW;;;; +21E3;DOWNWARDS DASHED ARROW;So;0;ON;;;;;N;DOWN DASHED ARROW;;;; +21E4;LEFTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR;;;; +21E5;RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;RIGHT ARROW TO BAR;;;; +21E6;LEFTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE LEFT ARROW;;;; +21E7;UPWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE UP ARROW;;;; +21E8;RIGHTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE RIGHT ARROW;;;; +21E9;DOWNWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE DOWN ARROW;;;; +21EA;UPWARDS WHITE ARROW FROM BAR;So;0;ON;;;;;N;WHITE UP ARROW FROM BAR;;;; +21EB;UPWARDS WHITE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; +21EC;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; +21ED;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; +21EE;UPWARDS WHITE DOUBLE ARROW;So;0;ON;;;;;N;;;;; +21EF;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; +21F0;RIGHTWARDS WHITE ARROW FROM WALL;So;0;ON;;;;;N;;;;; +21F1;NORTH WEST ARROW TO CORNER;So;0;ON;;;;;N;;;;; +21F2;SOUTH EAST ARROW TO CORNER;So;0;ON;;;;;N;;;;; +21F3;UP DOWN WHITE ARROW;So;0;ON;;;;;N;;;;; +21F4;RIGHT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +21F5;DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW;Sm;0;ON;;;;;N;;;;; +21F6;THREE RIGHTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; +21F7;LEFTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21F8;RIGHTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21F9;LEFT RIGHT ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FA;LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FB;RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FC;LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FD;LEFTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +21FE;RIGHTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +21FF;LEFT RIGHT OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +2200;FOR ALL;Sm;0;ON;;;;;N;;;;; +2201;COMPLEMENT;Sm;0;ON;;;;;Y;;;;; +2202;PARTIAL DIFFERENTIAL;Sm;0;ON;;;;;Y;;;;; +2203;THERE EXISTS;Sm;0;ON;;;;;Y;;;;; +2204;THERE DOES NOT EXIST;Sm;0;ON;2203 0338;;;;Y;;;;; +2205;EMPTY SET;Sm;0;ON;;;;;N;;;;; +2206;INCREMENT;Sm;0;ON;;;;;N;;;;; +2207;NABLA;Sm;0;ON;;;;;N;;;;; +2208;ELEMENT OF;Sm;0;ON;;;;;Y;;;;; +2209;NOT AN ELEMENT OF;Sm;0;ON;2208 0338;;;;Y;;;;; +220A;SMALL ELEMENT OF;Sm;0;ON;;;;;Y;;;;; +220B;CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; +220C;DOES NOT CONTAIN AS MEMBER;Sm;0;ON;220B 0338;;;;Y;;;;; +220D;SMALL CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; +220E;END OF PROOF;Sm;0;ON;;;;;N;;;;; +220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;; +2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;; +2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;; +2212;MINUS SIGN;Sm;0;ES;;;;;N;;;;; +2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;; +2214;DOT PLUS;Sm;0;ON;;;;;N;;;;; +2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; +2216;SET MINUS;Sm;0;ON;;;;;Y;;;;; +2217;ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; +2218;RING OPERATOR;Sm;0;ON;;;;;N;;;;; +2219;BULLET OPERATOR;Sm;0;ON;;;;;N;;;;; +221A;SQUARE ROOT;Sm;0;ON;;;;;Y;;;;; +221B;CUBE ROOT;Sm;0;ON;;;;;Y;;;;; +221C;FOURTH ROOT;Sm;0;ON;;;;;Y;;;;; +221D;PROPORTIONAL TO;Sm;0;ON;;;;;Y;;;;; +221E;INFINITY;Sm;0;ON;;;;;N;;;;; +221F;RIGHT ANGLE;Sm;0;ON;;;;;Y;;;;; +2220;ANGLE;Sm;0;ON;;;;;Y;;;;; +2221;MEASURED ANGLE;Sm;0;ON;;;;;Y;;;;; +2222;SPHERICAL ANGLE;Sm;0;ON;;;;;Y;;;;; +2223;DIVIDES;Sm;0;ON;;;;;N;;;;; +2224;DOES NOT DIVIDE;Sm;0;ON;2223 0338;;;;Y;;;;; +2225;PARALLEL TO;Sm;0;ON;;;;;N;;;;; +2226;NOT PARALLEL TO;Sm;0;ON;2225 0338;;;;Y;;;;; +2227;LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2228;LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2229;INTERSECTION;Sm;0;ON;;;;;N;;;;; +222A;UNION;Sm;0;ON;;;;;N;;;;; +222B;INTEGRAL;Sm;0;ON;;;;;Y;;;;; +222C;DOUBLE INTEGRAL;Sm;0;ON;<compat> 222B 222B;;;;Y;;;;; +222D;TRIPLE INTEGRAL;Sm;0;ON;<compat> 222B 222B 222B;;;;Y;;;;; +222E;CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +222F;SURFACE INTEGRAL;Sm;0;ON;<compat> 222E 222E;;;;Y;;;;; +2230;VOLUME INTEGRAL;Sm;0;ON;<compat> 222E 222E 222E;;;;Y;;;;; +2231;CLOCKWISE INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2232;CLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2233;ANTICLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2234;THEREFORE;Sm;0;ON;;;;;N;;;;; +2235;BECAUSE;Sm;0;ON;;;;;N;;;;; +2236;RATIO;Sm;0;ON;;;;;N;;;;; +2237;PROPORTION;Sm;0;ON;;;;;N;;;;; +2238;DOT MINUS;Sm;0;ON;;;;;N;;;;; +2239;EXCESS;Sm;0;ON;;;;;Y;;;;; +223A;GEOMETRIC PROPORTION;Sm;0;ON;;;;;N;;;;; +223B;HOMOTHETIC;Sm;0;ON;;;;;Y;;;;; +223C;TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +223D;REVERSED TILDE;Sm;0;ON;;;;;Y;;;;; +223E;INVERTED LAZY S;Sm;0;ON;;;;;Y;;;;; +223F;SINE WAVE;Sm;0;ON;;;;;Y;;;;; +2240;WREATH PRODUCT;Sm;0;ON;;;;;Y;;;;; +2241;NOT TILDE;Sm;0;ON;223C 0338;;;;Y;;;;; +2242;MINUS TILDE;Sm;0;ON;;;;;Y;;;;; +2243;ASYMPTOTICALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2244;NOT ASYMPTOTICALLY EQUAL TO;Sm;0;ON;2243 0338;;;;Y;;;;; +2245;APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2246;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2247;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO;Sm;0;ON;2245 0338;;;;Y;;;;; +2248;ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2249;NOT ALMOST EQUAL TO;Sm;0;ON;2248 0338;;;;Y;;;;; +224A;ALMOST EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +224B;TRIPLE TILDE;Sm;0;ON;;;;;Y;;;;; +224C;ALL EQUAL TO;Sm;0;ON;;;;;Y;;;;; +224D;EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +224E;GEOMETRICALLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +224F;DIFFERENCE BETWEEN;Sm;0;ON;;;;;N;;;;; +2250;APPROACHES THE LIMIT;Sm;0;ON;;;;;N;;;;; +2251;GEOMETRICALLY EQUAL TO;Sm;0;ON;;;;;N;;;;; +2252;APPROXIMATELY EQUAL TO OR THE IMAGE OF;Sm;0;ON;;;;;Y;;;;; +2253;IMAGE OF OR APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2254;COLON EQUALS;Sm;0;ON;;;;;Y;COLON EQUAL;;;; +2255;EQUALS COLON;Sm;0;ON;;;;;Y;EQUAL COLON;;;; +2256;RING IN EQUAL TO;Sm;0;ON;;;;;N;;;;; +2257;RING EQUAL TO;Sm;0;ON;;;;;N;;;;; +2258;CORRESPONDS TO;Sm;0;ON;;;;;N;;;;; +2259;ESTIMATES;Sm;0;ON;;;;;N;;;;; +225A;EQUIANGULAR TO;Sm;0;ON;;;;;N;;;;; +225B;STAR EQUALS;Sm;0;ON;;;;;N;;;;; +225C;DELTA EQUAL TO;Sm;0;ON;;;;;N;;;;; +225D;EQUAL TO BY DEFINITION;Sm;0;ON;;;;;N;;;;; +225E;MEASURED BY;Sm;0;ON;;;;;N;;;;; +225F;QUESTIONED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2260;NOT EQUAL TO;Sm;0;ON;003D 0338;;;;Y;;;;; +2261;IDENTICAL TO;Sm;0;ON;;;;;N;;;;; +2262;NOT IDENTICAL TO;Sm;0;ON;2261 0338;;;;Y;;;;; +2263;STRICTLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +2264;LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUAL TO;;;; +2265;GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUAL TO;;;; +2266;LESS-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OVER EQUAL TO;;;; +2267;GREATER-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OVER EQUAL TO;;;; +2268;LESS-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUAL TO;;;; +2269;GREATER-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUAL TO;;;; +226A;MUCH LESS-THAN;Sm;0;ON;;;;;Y;MUCH LESS THAN;;;; +226B;MUCH GREATER-THAN;Sm;0;ON;;;;;Y;MUCH GREATER THAN;;;; +226C;BETWEEN;Sm;0;ON;;;;;N;;;;; +226D;NOT EQUIVALENT TO;Sm;0;ON;224D 0338;;;;N;;;;; +226E;NOT LESS-THAN;Sm;0;ON;003C 0338;;;;Y;NOT LESS THAN;;;; +226F;NOT GREATER-THAN;Sm;0;ON;003E 0338;;;;Y;NOT GREATER THAN;;;; +2270;NEITHER LESS-THAN NOR EQUAL TO;Sm;0;ON;2264 0338;;;;Y;NEITHER LESS THAN NOR EQUAL TO;;;; +2271;NEITHER GREATER-THAN NOR EQUAL TO;Sm;0;ON;2265 0338;;;;Y;NEITHER GREATER THAN NOR EQUAL TO;;;; +2272;LESS-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUIVALENT TO;;;; +2273;GREATER-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUIVALENT TO;;;; +2274;NEITHER LESS-THAN NOR EQUIVALENT TO;Sm;0;ON;2272 0338;;;;Y;NEITHER LESS THAN NOR EQUIVALENT TO;;;; +2275;NEITHER GREATER-THAN NOR EQUIVALENT TO;Sm;0;ON;2273 0338;;;;Y;NEITHER GREATER THAN NOR EQUIVALENT TO;;;; +2276;LESS-THAN OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN OR GREATER THAN;;;; +2277;GREATER-THAN OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN OR LESS THAN;;;; +2278;NEITHER LESS-THAN NOR GREATER-THAN;Sm;0;ON;2276 0338;;;;Y;NEITHER LESS THAN NOR GREATER THAN;;;; +2279;NEITHER GREATER-THAN NOR LESS-THAN;Sm;0;ON;2277 0338;;;;Y;NEITHER GREATER THAN NOR LESS THAN;;;; +227A;PRECEDES;Sm;0;ON;;;;;Y;;;;; +227B;SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +227C;PRECEDES OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +227D;SUCCEEDS OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +227E;PRECEDES OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +227F;SUCCEEDS OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +2280;DOES NOT PRECEDE;Sm;0;ON;227A 0338;;;;Y;;;;; +2281;DOES NOT SUCCEED;Sm;0;ON;227B 0338;;;;Y;;;;; +2282;SUBSET OF;Sm;0;ON;;;;;Y;;;;; +2283;SUPERSET OF;Sm;0;ON;;;;;Y;;;;; +2284;NOT A SUBSET OF;Sm;0;ON;2282 0338;;;;Y;;;;; +2285;NOT A SUPERSET OF;Sm;0;ON;2283 0338;;;;Y;;;;; +2286;SUBSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2287;SUPERSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2288;NEITHER A SUBSET OF NOR EQUAL TO;Sm;0;ON;2286 0338;;;;Y;;;;; +2289;NEITHER A SUPERSET OF NOR EQUAL TO;Sm;0;ON;2287 0338;;;;Y;;;;; +228A;SUBSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUBSET OF OR NOT EQUAL TO;;;; +228B;SUPERSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUPERSET OF OR NOT EQUAL TO;;;; +228C;MULTISET;Sm;0;ON;;;;;Y;;;;; +228D;MULTISET MULTIPLICATION;Sm;0;ON;;;;;N;;;;; +228E;MULTISET UNION;Sm;0;ON;;;;;N;;;;; +228F;SQUARE IMAGE OF;Sm;0;ON;;;;;Y;;;;; +2290;SQUARE ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; +2291;SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2292;SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2293;SQUARE CAP;Sm;0;ON;;;;;N;;;;; +2294;SQUARE CUP;Sm;0;ON;;;;;N;;;;; +2295;CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +2296;CIRCLED MINUS;Sm;0;ON;;;;;N;;;;; +2297;CIRCLED TIMES;Sm;0;ON;;;;;N;;;;; +2298;CIRCLED DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; +2299;CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +229A;CIRCLED RING OPERATOR;Sm;0;ON;;;;;N;;;;; +229B;CIRCLED ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; +229C;CIRCLED EQUALS;Sm;0;ON;;;;;N;;;;; +229D;CIRCLED DASH;Sm;0;ON;;;;;N;;;;; +229E;SQUARED PLUS;Sm;0;ON;;;;;N;;;;; +229F;SQUARED MINUS;Sm;0;ON;;;;;N;;;;; +22A0;SQUARED TIMES;Sm;0;ON;;;;;N;;;;; +22A1;SQUARED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +22A2;RIGHT TACK;Sm;0;ON;;;;;Y;;;;; +22A3;LEFT TACK;Sm;0;ON;;;;;Y;;;;; +22A4;DOWN TACK;Sm;0;ON;;;;;N;;;;; +22A5;UP TACK;Sm;0;ON;;;;;N;;;;; +22A6;ASSERTION;Sm;0;ON;;;;;Y;;;;; +22A7;MODELS;Sm;0;ON;;;;;Y;;;;; +22A8;TRUE;Sm;0;ON;;;;;Y;;;;; +22A9;FORCES;Sm;0;ON;;;;;Y;;;;; +22AA;TRIPLE VERTICAL BAR RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +22AB;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +22AC;DOES NOT PROVE;Sm;0;ON;22A2 0338;;;;Y;;;;; +22AD;NOT TRUE;Sm;0;ON;22A8 0338;;;;Y;;;;; +22AE;DOES NOT FORCE;Sm;0;ON;22A9 0338;;;;Y;;;;; +22AF;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;22AB 0338;;;;Y;;;;; +22B0;PRECEDES UNDER RELATION;Sm;0;ON;;;;;Y;;;;; +22B1;SUCCEEDS UNDER RELATION;Sm;0;ON;;;;;Y;;;;; +22B2;NORMAL SUBGROUP OF;Sm;0;ON;;;;;Y;;;;; +22B3;CONTAINS AS NORMAL SUBGROUP;Sm;0;ON;;;;;Y;;;;; +22B4;NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22B5;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22B6;ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; +22B7;IMAGE OF;Sm;0;ON;;;;;Y;;;;; +22B8;MULTIMAP;Sm;0;ON;;;;;Y;;;;; +22B9;HERMITIAN CONJUGATE MATRIX;Sm;0;ON;;;;;N;;;;; +22BA;INTERCALATE;Sm;0;ON;;;;;N;;;;; +22BB;XOR;Sm;0;ON;;;;;N;;;;; +22BC;NAND;Sm;0;ON;;;;;N;;;;; +22BD;NOR;Sm;0;ON;;;;;N;;;;; +22BE;RIGHT ANGLE WITH ARC;Sm;0;ON;;;;;Y;;;;; +22BF;RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +22C0;N-ARY LOGICAL AND;Sm;0;ON;;;;;N;;;;; +22C1;N-ARY LOGICAL OR;Sm;0;ON;;;;;N;;;;; +22C2;N-ARY INTERSECTION;Sm;0;ON;;;;;N;;;;; +22C3;N-ARY UNION;Sm;0;ON;;;;;N;;;;; +22C4;DIAMOND OPERATOR;Sm;0;ON;;;;;N;;;;; +22C5;DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +22C6;STAR OPERATOR;Sm;0;ON;;;;;N;;;;; +22C7;DIVISION TIMES;Sm;0;ON;;;;;N;;;;; +22C8;BOWTIE;Sm;0;ON;;;;;N;;;;; +22C9;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CA;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CB;LEFT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CC;RIGHT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CD;REVERSED TILDE EQUALS;Sm;0;ON;;;;;Y;;;;; +22CE;CURLY LOGICAL OR;Sm;0;ON;;;;;N;;;;; +22CF;CURLY LOGICAL AND;Sm;0;ON;;;;;N;;;;; +22D0;DOUBLE SUBSET;Sm;0;ON;;;;;Y;;;;; +22D1;DOUBLE SUPERSET;Sm;0;ON;;;;;Y;;;;; +22D2;DOUBLE INTERSECTION;Sm;0;ON;;;;;N;;;;; +22D3;DOUBLE UNION;Sm;0;ON;;;;;N;;;;; +22D4;PITCHFORK;Sm;0;ON;;;;;N;;;;; +22D5;EQUAL AND PARALLEL TO;Sm;0;ON;;;;;N;;;;; +22D6;LESS-THAN WITH DOT;Sm;0;ON;;;;;Y;LESS THAN WITH DOT;;;; +22D7;GREATER-THAN WITH DOT;Sm;0;ON;;;;;Y;GREATER THAN WITH DOT;;;; +22D8;VERY MUCH LESS-THAN;Sm;0;ON;;;;;Y;VERY MUCH LESS THAN;;;; +22D9;VERY MUCH GREATER-THAN;Sm;0;ON;;;;;Y;VERY MUCH GREATER THAN;;;; +22DA;LESS-THAN EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN EQUAL TO OR GREATER THAN;;;; +22DB;GREATER-THAN EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN EQUAL TO OR LESS THAN;;;; +22DC;EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR LESS THAN;;;; +22DD;EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR GREATER THAN;;;; +22DE;EQUAL TO OR PRECEDES;Sm;0;ON;;;;;Y;;;;; +22DF;EQUAL TO OR SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +22E0;DOES NOT PRECEDE OR EQUAL;Sm;0;ON;227C 0338;;;;Y;;;;; +22E1;DOES NOT SUCCEED OR EQUAL;Sm;0;ON;227D 0338;;;;Y;;;;; +22E2;NOT SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;2291 0338;;;;Y;;;;; +22E3;NOT SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;2292 0338;;;;Y;;;;; +22E4;SQUARE IMAGE OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22E5;SQUARE ORIGINAL OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22E6;LESS-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUIVALENT TO;;;; +22E7;GREATER-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUIVALENT TO;;;; +22E8;PRECEDES BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +22E9;SUCCEEDS BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +22EA;NOT NORMAL SUBGROUP OF;Sm;0;ON;22B2 0338;;;;Y;;;;; +22EB;DOES NOT CONTAIN AS NORMAL SUBGROUP;Sm;0;ON;22B3 0338;;;;Y;;;;; +22EC;NOT NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;22B4 0338;;;;Y;;;;; +22ED;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL;Sm;0;ON;22B5 0338;;;;Y;;;;; +22EE;VERTICAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; +22EF;MIDLINE HORIZONTAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; +22F0;UP RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; +22F1;DOWN RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; +22F2;ELEMENT OF WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F3;ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F4;SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F5;ELEMENT OF WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +22F6;ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22F7;SMALL ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22F8;ELEMENT OF WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +22F9;ELEMENT OF WITH TWO HORIZONTAL STROKES;Sm;0;ON;;;;;Y;;;;; +22FA;CONTAINS WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FB;CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FC;SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FD;CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22FE;SMALL CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22FF;Z NOTATION BAG MEMBERSHIP;Sm;0;ON;;;;;Y;;;;; +2300;DIAMETER SIGN;So;0;ON;;;;;N;;;;; +2301;ELECTRIC ARROW;So;0;ON;;;;;N;;;;; +2302;HOUSE;So;0;ON;;;;;N;;;;; +2303;UP ARROWHEAD;So;0;ON;;;;;N;;;;; +2304;DOWN ARROWHEAD;So;0;ON;;;;;N;;;;; +2305;PROJECTIVE;So;0;ON;;;;;N;;;;; +2306;PERSPECTIVE;So;0;ON;;;;;N;;;;; +2307;WAVY LINE;So;0;ON;;;;;N;;;;; +2308;LEFT CEILING;Sm;0;ON;;;;;Y;;;;; +2309;RIGHT CEILING;Sm;0;ON;;;;;Y;;;;; +230A;LEFT FLOOR;Sm;0;ON;;;;;Y;;;;; +230B;RIGHT FLOOR;Sm;0;ON;;;;;Y;;;;; +230C;BOTTOM RIGHT CROP;So;0;ON;;;;;N;;;;; +230D;BOTTOM LEFT CROP;So;0;ON;;;;;N;;;;; +230E;TOP RIGHT CROP;So;0;ON;;;;;N;;;;; +230F;TOP LEFT CROP;So;0;ON;;;;;N;;;;; +2310;REVERSED NOT SIGN;So;0;ON;;;;;N;;;;; +2311;SQUARE LOZENGE;So;0;ON;;;;;N;;;;; +2312;ARC;So;0;ON;;;;;N;;;;; +2313;SEGMENT;So;0;ON;;;;;N;;;;; +2314;SECTOR;So;0;ON;;;;;N;;;;; +2315;TELEPHONE RECORDER;So;0;ON;;;;;N;;;;; +2316;POSITION INDICATOR;So;0;ON;;;;;N;;;;; +2317;VIEWDATA SQUARE;So;0;ON;;;;;N;;;;; +2318;PLACE OF INTEREST SIGN;So;0;ON;;;;;N;COMMAND KEY;;;; +2319;TURNED NOT SIGN;So;0;ON;;;;;N;;;;; +231A;WATCH;So;0;ON;;;;;N;;;;; +231B;HOURGLASS;So;0;ON;;;;;N;;;;; +231C;TOP LEFT CORNER;So;0;ON;;;;;N;;;;; +231D;TOP RIGHT CORNER;So;0;ON;;;;;N;;;;; +231E;BOTTOM LEFT CORNER;So;0;ON;;;;;N;;;;; +231F;BOTTOM RIGHT CORNER;So;0;ON;;;;;N;;;;; +2320;TOP HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2321;BOTTOM HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2322;FROWN;So;0;ON;;;;;N;;;;; +2323;SMILE;So;0;ON;;;;;N;;;;; +2324;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS;So;0;ON;;;;;N;ENTER KEY;;;; +2325;OPTION KEY;So;0;ON;;;;;N;;;;; +2326;ERASE TO THE RIGHT;So;0;ON;;;;;N;DELETE TO THE RIGHT KEY;;;; +2327;X IN A RECTANGLE BOX;So;0;ON;;;;;N;CLEAR KEY;;;; +2328;KEYBOARD;So;0;ON;;;;;N;;;;; +2329;LEFT-POINTING ANGLE BRACKET;Ps;0;ON;3008;;;;Y;BRA;;;; +232A;RIGHT-POINTING ANGLE BRACKET;Pe;0;ON;3009;;;;Y;KET;;;; +232B;ERASE TO THE LEFT;So;0;ON;;;;;N;DELETE TO THE LEFT KEY;;;; +232C;BENZENE RING;So;0;ON;;;;;N;;;;; +232D;CYLINDRICITY;So;0;ON;;;;;N;;;;; +232E;ALL AROUND-PROFILE;So;0;ON;;;;;N;;;;; +232F;SYMMETRY;So;0;ON;;;;;N;;;;; +2330;TOTAL RUNOUT;So;0;ON;;;;;N;;;;; +2331;DIMENSION ORIGIN;So;0;ON;;;;;N;;;;; +2332;CONICAL TAPER;So;0;ON;;;;;N;;;;; +2333;SLOPE;So;0;ON;;;;;N;;;;; +2334;COUNTERBORE;So;0;ON;;;;;N;;;;; +2335;COUNTERSINK;So;0;ON;;;;;N;;;;; +2336;APL FUNCTIONAL SYMBOL I-BEAM;So;0;L;;;;;N;;;;; +2337;APL FUNCTIONAL SYMBOL SQUISH QUAD;So;0;L;;;;;N;;;;; +2338;APL FUNCTIONAL SYMBOL QUAD EQUAL;So;0;L;;;;;N;;;;; +2339;APL FUNCTIONAL SYMBOL QUAD DIVIDE;So;0;L;;;;;N;;;;; +233A;APL FUNCTIONAL SYMBOL QUAD DIAMOND;So;0;L;;;;;N;;;;; +233B;APL FUNCTIONAL SYMBOL QUAD JOT;So;0;L;;;;;N;;;;; +233C;APL FUNCTIONAL SYMBOL QUAD CIRCLE;So;0;L;;;;;N;;;;; +233D;APL FUNCTIONAL SYMBOL CIRCLE STILE;So;0;L;;;;;N;;;;; +233E;APL FUNCTIONAL SYMBOL CIRCLE JOT;So;0;L;;;;;N;;;;; +233F;APL FUNCTIONAL SYMBOL SLASH BAR;So;0;L;;;;;N;;;;; +2340;APL FUNCTIONAL SYMBOL BACKSLASH BAR;So;0;L;;;;;N;;;;; +2341;APL FUNCTIONAL SYMBOL QUAD SLASH;So;0;L;;;;;N;;;;; +2342;APL FUNCTIONAL SYMBOL QUAD BACKSLASH;So;0;L;;;;;N;;;;; +2343;APL FUNCTIONAL SYMBOL QUAD LESS-THAN;So;0;L;;;;;N;;;;; +2344;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN;So;0;L;;;;;N;;;;; +2345;APL FUNCTIONAL SYMBOL LEFTWARDS VANE;So;0;L;;;;;N;;;;; +2346;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE;So;0;L;;;;;N;;;;; +2347;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW;So;0;L;;;;;N;;;;; +2348;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW;So;0;L;;;;;N;;;;; +2349;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH;So;0;L;;;;;N;;;;; +234A;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR;So;0;L;;;;;N;;;;; +234B;APL FUNCTIONAL SYMBOL DELTA STILE;So;0;L;;;;;N;;;;; +234C;APL FUNCTIONAL SYMBOL QUAD DOWN CARET;So;0;L;;;;;N;;;;; +234D;APL FUNCTIONAL SYMBOL QUAD DELTA;So;0;L;;;;;N;;;;; +234E;APL FUNCTIONAL SYMBOL DOWN TACK JOT;So;0;L;;;;;N;;;;; +234F;APL FUNCTIONAL SYMBOL UPWARDS VANE;So;0;L;;;;;N;;;;; +2350;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW;So;0;L;;;;;N;;;;; +2351;APL FUNCTIONAL SYMBOL UP TACK OVERBAR;So;0;L;;;;;N;;;;; +2352;APL FUNCTIONAL SYMBOL DEL STILE;So;0;L;;;;;N;;;;; +2353;APL FUNCTIONAL SYMBOL QUAD UP CARET;So;0;L;;;;;N;;;;; +2354;APL FUNCTIONAL SYMBOL QUAD DEL;So;0;L;;;;;N;;;;; +2355;APL FUNCTIONAL SYMBOL UP TACK JOT;So;0;L;;;;;N;;;;; +2356;APL FUNCTIONAL SYMBOL DOWNWARDS VANE;So;0;L;;;;;N;;;;; +2357;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW;So;0;L;;;;;N;;;;; +2358;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR;So;0;L;;;;;N;;;;; +2359;APL FUNCTIONAL SYMBOL DELTA UNDERBAR;So;0;L;;;;;N;;;;; +235A;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR;So;0;L;;;;;N;;;;; +235B;APL FUNCTIONAL SYMBOL JOT UNDERBAR;So;0;L;;;;;N;;;;; +235C;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR;So;0;L;;;;;N;;;;; +235D;APL FUNCTIONAL SYMBOL UP SHOE JOT;So;0;L;;;;;N;;;;; +235E;APL FUNCTIONAL SYMBOL QUOTE QUAD;So;0;L;;;;;N;;;;; +235F;APL FUNCTIONAL SYMBOL CIRCLE STAR;So;0;L;;;;;N;;;;; +2360;APL FUNCTIONAL SYMBOL QUAD COLON;So;0;L;;;;;N;;;;; +2361;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS;So;0;L;;;;;N;;;;; +2362;APL FUNCTIONAL SYMBOL DEL DIAERESIS;So;0;L;;;;;N;;;;; +2363;APL FUNCTIONAL SYMBOL STAR DIAERESIS;So;0;L;;;;;N;;;;; +2364;APL FUNCTIONAL SYMBOL JOT DIAERESIS;So;0;L;;;;;N;;;;; +2365;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS;So;0;L;;;;;N;;;;; +2366;APL FUNCTIONAL SYMBOL DOWN SHOE STILE;So;0;L;;;;;N;;;;; +2367;APL FUNCTIONAL SYMBOL LEFT SHOE STILE;So;0;L;;;;;N;;;;; +2368;APL FUNCTIONAL SYMBOL TILDE DIAERESIS;So;0;L;;;;;N;;;;; +2369;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS;So;0;L;;;;;N;;;;; +236A;APL FUNCTIONAL SYMBOL COMMA BAR;So;0;L;;;;;N;;;;; +236B;APL FUNCTIONAL SYMBOL DEL TILDE;So;0;L;;;;;N;;;;; +236C;APL FUNCTIONAL SYMBOL ZILDE;So;0;L;;;;;N;;;;; +236D;APL FUNCTIONAL SYMBOL STILE TILDE;So;0;L;;;;;N;;;;; +236E;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR;So;0;L;;;;;N;;;;; +236F;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL;So;0;L;;;;;N;;;;; +2370;APL FUNCTIONAL SYMBOL QUAD QUESTION;So;0;L;;;;;N;;;;; +2371;APL FUNCTIONAL SYMBOL DOWN CARET TILDE;So;0;L;;;;;N;;;;; +2372;APL FUNCTIONAL SYMBOL UP CARET TILDE;So;0;L;;;;;N;;;;; +2373;APL FUNCTIONAL SYMBOL IOTA;So;0;L;;;;;N;;;;; +2374;APL FUNCTIONAL SYMBOL RHO;So;0;L;;;;;N;;;;; +2375;APL FUNCTIONAL SYMBOL OMEGA;So;0;L;;;;;N;;;;; +2376;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR;So;0;L;;;;;N;;;;; +2377;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR;So;0;L;;;;;N;;;;; +2378;APL FUNCTIONAL SYMBOL IOTA UNDERBAR;So;0;L;;;;;N;;;;; +2379;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR;So;0;L;;;;;N;;;;; +237A;APL FUNCTIONAL SYMBOL ALPHA;So;0;L;;;;;N;;;;; +237B;NOT CHECK MARK;So;0;ON;;;;;N;;;;; +237C;RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW;Sm;0;ON;;;;;N;;;;; +237D;SHOULDERED OPEN BOX;So;0;ON;;;;;N;;;;; +237E;BELL SYMBOL;So;0;ON;;;;;N;;;;; +237F;VERTICAL LINE WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; +2380;INSERTION SYMBOL;So;0;ON;;;;;N;;;;; +2381;CONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; +2382;DISCONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; +2383;EMPHASIS SYMBOL;So;0;ON;;;;;N;;;;; +2384;COMPOSITION SYMBOL;So;0;ON;;;;;N;;;;; +2385;WHITE SQUARE WITH CENTRE VERTICAL LINE;So;0;ON;;;;;N;;;;; +2386;ENTER SYMBOL;So;0;ON;;;;;N;;;;; +2387;ALTERNATIVE KEY SYMBOL;So;0;ON;;;;;N;;;;; +2388;HELM SYMBOL;So;0;ON;;;;;N;;;;; +2389;CIRCLED HORIZONTAL BAR WITH NOTCH;So;0;ON;;;;;N;;;;; +238A;CIRCLED TRIANGLE DOWN;So;0;ON;;;;;N;;;;; +238B;BROKEN CIRCLE WITH NORTHWEST ARROW;So;0;ON;;;;;N;;;;; +238C;UNDO SYMBOL;So;0;ON;;;;;N;;;;; +238D;MONOSTABLE SYMBOL;So;0;ON;;;;;N;;;;; +238E;HYSTERESIS SYMBOL;So;0;ON;;;;;N;;;;; +238F;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL;So;0;ON;;;;;N;;;;; +2390;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL;So;0;ON;;;;;N;;;;; +2391;PASSIVE-PULL-DOWN-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; +2392;PASSIVE-PULL-UP-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; +2393;DIRECT CURRENT SYMBOL FORM TWO;So;0;ON;;;;;N;;;;; +2394;SOFTWARE-FUNCTION SYMBOL;So;0;ON;;;;;N;;;;; +2395;APL FUNCTIONAL SYMBOL QUAD;So;0;L;;;;;N;;;;; +2396;DECIMAL SEPARATOR KEY SYMBOL;So;0;ON;;;;;N;;;;; +2397;PREVIOUS PAGE;So;0;ON;;;;;N;;;;; +2398;NEXT PAGE;So;0;ON;;;;;N;;;;; +2399;PRINT SCREEN SYMBOL;So;0;ON;;;;;N;;;;; +239A;CLEAR SCREEN SYMBOL;So;0;ON;;;;;N;;;;; +239B;LEFT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;; +239C;LEFT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;; +239D;LEFT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;; +239E;RIGHT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;; +239F;RIGHT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;; +23A0;RIGHT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23A1;LEFT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;; +23A2;LEFT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23A3;LEFT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;; +23A4;RIGHT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;; +23A5;RIGHT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23A6;RIGHT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;; +23A7;LEFT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;; +23A8;LEFT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;; +23A9;LEFT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23AA;CURLY BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23AB;RIGHT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;; +23AC;RIGHT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;; +23AD;RIGHT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23AE;INTEGRAL EXTENSION;Sm;0;ON;;;;;N;;;;; +23AF;HORIZONTAL LINE EXTENSION;Sm;0;ON;;;;;N;;;;; +23B0;UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; +23B1;UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; +23B2;SUMMATION TOP;Sm;0;ON;;;;;N;;;;; +23B3;SUMMATION BOTTOM;Sm;0;ON;;;;;N;;;;; +23B4;TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B5;BOTTOM SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B7;RADICAL SYMBOL BOTTOM;So;0;ON;;;;;N;;;;; +23B8;LEFT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; +23B9;RIGHT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; +23BA;HORIZONTAL SCAN LINE-1;So;0;ON;;;;;N;;;;; +23BB;HORIZONTAL SCAN LINE-3;So;0;ON;;;;;N;;;;; +23BC;HORIZONTAL SCAN LINE-7;So;0;ON;;;;;N;;;;; +23BD;HORIZONTAL SCAN LINE-9;So;0;ON;;;;;N;;;;; +23BE;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT;So;0;ON;;;;;N;;;;; +23BF;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT;So;0;ON;;;;;N;;;;; +23C0;DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C1;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C2;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C3;DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C4;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C5;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C6;DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE;So;0;ON;;;;;N;;;;; +23C7;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;; +23C8;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;; +23C9;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;;;;; +23CA;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;;;;; +23CB;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT;So;0;ON;;;;;N;;;;; +23CC;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT;So;0;ON;;;;;N;;;;; +23CD;SQUARE FOOT;So;0;ON;;;;;N;;;;; +23CE;RETURN SYMBOL;So;0;ON;;;;;N;;;;; +23CF;EJECT SYMBOL;So;0;ON;;;;;N;;;;; +23D0;VERTICAL LINE EXTENSION;So;0;ON;;;;;N;;;;; +23D1;METRICAL BREVE;So;0;ON;;;;;N;;;;; +23D2;METRICAL LONG OVER SHORT;So;0;ON;;;;;N;;;;; +23D3;METRICAL SHORT OVER LONG;So;0;ON;;;;;N;;;;; +23D4;METRICAL LONG OVER TWO SHORTS;So;0;ON;;;;;N;;;;; +23D5;METRICAL TWO SHORTS OVER LONG;So;0;ON;;;;;N;;;;; +23D6;METRICAL TWO SHORTS JOINED;So;0;ON;;;;;N;;;;; +23D7;METRICAL TRISEME;So;0;ON;;;;;N;;;;; +23D8;METRICAL TETRASEME;So;0;ON;;;;;N;;;;; +23D9;METRICAL PENTASEME;So;0;ON;;;;;N;;;;; +23DA;EARTH GROUND;So;0;ON;;;;;N;;;;; +23DB;FUSE;So;0;ON;;;;;N;;;;; +23DC;TOP PARENTHESIS;Sm;0;ON;;;;;N;;;;; +23DD;BOTTOM PARENTHESIS;Sm;0;ON;;;;;N;;;;; +23DE;TOP CURLY BRACKET;Sm;0;ON;;;;;N;;;;; +23DF;BOTTOM CURLY BRACKET;Sm;0;ON;;;;;N;;;;; +23E0;TOP TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;;;; +23E1;BOTTOM TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;;;; +23E2;WHITE TRAPEZIUM;So;0;ON;;;;;N;;;;; +23E3;BENZENE RING WITH CIRCLE;So;0;ON;;;;;N;;;;; +23E4;STRAIGHTNESS;So;0;ON;;;;;N;;;;; +23E5;FLATNESS;So;0;ON;;;;;N;;;;; +23E6;AC CURRENT;So;0;ON;;;;;N;;;;; +23E7;ELECTRICAL INTERSECTION;So;0;ON;;;;;N;;;;; +23E8;DECIMAL EXPONENT SYMBOL;So;0;ON;;;;;N;;;;; +2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;; +2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;; +2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;; +2403;SYMBOL FOR END OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR END OF TEXT;;;; +2404;SYMBOL FOR END OF TRANSMISSION;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION;;;; +2405;SYMBOL FOR ENQUIRY;So;0;ON;;;;;N;GRAPHIC FOR ENQUIRY;;;; +2406;SYMBOL FOR ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR ACKNOWLEDGE;;;; +2407;SYMBOL FOR BELL;So;0;ON;;;;;N;GRAPHIC FOR BELL;;;; +2408;SYMBOL FOR BACKSPACE;So;0;ON;;;;;N;GRAPHIC FOR BACKSPACE;;;; +2409;SYMBOL FOR HORIZONTAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR HORIZONTAL TABULATION;;;; +240A;SYMBOL FOR LINE FEED;So;0;ON;;;;;N;GRAPHIC FOR LINE FEED;;;; +240B;SYMBOL FOR VERTICAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR VERTICAL TABULATION;;;; +240C;SYMBOL FOR FORM FEED;So;0;ON;;;;;N;GRAPHIC FOR FORM FEED;;;; +240D;SYMBOL FOR CARRIAGE RETURN;So;0;ON;;;;;N;GRAPHIC FOR CARRIAGE RETURN;;;; +240E;SYMBOL FOR SHIFT OUT;So;0;ON;;;;;N;GRAPHIC FOR SHIFT OUT;;;; +240F;SYMBOL FOR SHIFT IN;So;0;ON;;;;;N;GRAPHIC FOR SHIFT IN;;;; +2410;SYMBOL FOR DATA LINK ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR DATA LINK ESCAPE;;;; +2411;SYMBOL FOR DEVICE CONTROL ONE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL ONE;;;; +2412;SYMBOL FOR DEVICE CONTROL TWO;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL TWO;;;; +2413;SYMBOL FOR DEVICE CONTROL THREE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL THREE;;;; +2414;SYMBOL FOR DEVICE CONTROL FOUR;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL FOUR;;;; +2415;SYMBOL FOR NEGATIVE ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR NEGATIVE ACKNOWLEDGE;;;; +2416;SYMBOL FOR SYNCHRONOUS IDLE;So;0;ON;;;;;N;GRAPHIC FOR SYNCHRONOUS IDLE;;;; +2417;SYMBOL FOR END OF TRANSMISSION BLOCK;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION BLOCK;;;; +2418;SYMBOL FOR CANCEL;So;0;ON;;;;;N;GRAPHIC FOR CANCEL;;;; +2419;SYMBOL FOR END OF MEDIUM;So;0;ON;;;;;N;GRAPHIC FOR END OF MEDIUM;;;; +241A;SYMBOL FOR SUBSTITUTE;So;0;ON;;;;;N;GRAPHIC FOR SUBSTITUTE;;;; +241B;SYMBOL FOR ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR ESCAPE;;;; +241C;SYMBOL FOR FILE SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR FILE SEPARATOR;;;; +241D;SYMBOL FOR GROUP SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR GROUP SEPARATOR;;;; +241E;SYMBOL FOR RECORD SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR RECORD SEPARATOR;;;; +241F;SYMBOL FOR UNIT SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR UNIT SEPARATOR;;;; +2420;SYMBOL FOR SPACE;So;0;ON;;;;;N;GRAPHIC FOR SPACE;;;; +2421;SYMBOL FOR DELETE;So;0;ON;;;;;N;GRAPHIC FOR DELETE;;;; +2422;BLANK SYMBOL;So;0;ON;;;;;N;BLANK;;;; +2423;OPEN BOX;So;0;ON;;;;;N;;;;; +2424;SYMBOL FOR NEWLINE;So;0;ON;;;;;N;GRAPHIC FOR NEWLINE;;;; +2425;SYMBOL FOR DELETE FORM TWO;So;0;ON;;;;;N;;;;; +2426;SYMBOL FOR SUBSTITUTE FORM TWO;So;0;ON;;;;;N;;;;; +2440;OCR HOOK;So;0;ON;;;;;N;;;;; +2441;OCR CHAIR;So;0;ON;;;;;N;;;;; +2442;OCR FORK;So;0;ON;;;;;N;;;;; +2443;OCR INVERTED FORK;So;0;ON;;;;;N;;;;; +2444;OCR BELT BUCKLE;So;0;ON;;;;;N;;;;; +2445;OCR BOW TIE;So;0;ON;;;;;N;;;;; +2446;OCR BRANCH BANK IDENTIFICATION;So;0;ON;;;;;N;;;;; +2447;OCR AMOUNT OF CHECK;So;0;ON;;;;;N;;;;; +2448;OCR DASH;So;0;ON;;;;;N;;;;; +2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;; +244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;; +2460;CIRCLED DIGIT ONE;No;0;ON;<circle> 0031;;1;1;N;;;;; +2461;CIRCLED DIGIT TWO;No;0;ON;<circle> 0032;;2;2;N;;;;; +2462;CIRCLED DIGIT THREE;No;0;ON;<circle> 0033;;3;3;N;;;;; +2463;CIRCLED DIGIT FOUR;No;0;ON;<circle> 0034;;4;4;N;;;;; +2464;CIRCLED DIGIT FIVE;No;0;ON;<circle> 0035;;5;5;N;;;;; +2465;CIRCLED DIGIT SIX;No;0;ON;<circle> 0036;;6;6;N;;;;; +2466;CIRCLED DIGIT SEVEN;No;0;ON;<circle> 0037;;7;7;N;;;;; +2467;CIRCLED DIGIT EIGHT;No;0;ON;<circle> 0038;;8;8;N;;;;; +2468;CIRCLED DIGIT NINE;No;0;ON;<circle> 0039;;9;9;N;;;;; +2469;CIRCLED NUMBER TEN;No;0;ON;<circle> 0031 0030;;;10;N;;;;; +246A;CIRCLED NUMBER ELEVEN;No;0;ON;<circle> 0031 0031;;;11;N;;;;; +246B;CIRCLED NUMBER TWELVE;No;0;ON;<circle> 0031 0032;;;12;N;;;;; +246C;CIRCLED NUMBER THIRTEEN;No;0;ON;<circle> 0031 0033;;;13;N;;;;; +246D;CIRCLED NUMBER FOURTEEN;No;0;ON;<circle> 0031 0034;;;14;N;;;;; +246E;CIRCLED NUMBER FIFTEEN;No;0;ON;<circle> 0031 0035;;;15;N;;;;; +246F;CIRCLED NUMBER SIXTEEN;No;0;ON;<circle> 0031 0036;;;16;N;;;;; +2470;CIRCLED NUMBER SEVENTEEN;No;0;ON;<circle> 0031 0037;;;17;N;;;;; +2471;CIRCLED NUMBER EIGHTEEN;No;0;ON;<circle> 0031 0038;;;18;N;;;;; +2472;CIRCLED NUMBER NINETEEN;No;0;ON;<circle> 0031 0039;;;19;N;;;;; +2473;CIRCLED NUMBER TWENTY;No;0;ON;<circle> 0032 0030;;;20;N;;;;; +2474;PARENTHESIZED DIGIT ONE;No;0;ON;<compat> 0028 0031 0029;;1;1;N;;;;; +2475;PARENTHESIZED DIGIT TWO;No;0;ON;<compat> 0028 0032 0029;;2;2;N;;;;; +2476;PARENTHESIZED DIGIT THREE;No;0;ON;<compat> 0028 0033 0029;;3;3;N;;;;; +2477;PARENTHESIZED DIGIT FOUR;No;0;ON;<compat> 0028 0034 0029;;4;4;N;;;;; +2478;PARENTHESIZED DIGIT FIVE;No;0;ON;<compat> 0028 0035 0029;;5;5;N;;;;; +2479;PARENTHESIZED DIGIT SIX;No;0;ON;<compat> 0028 0036 0029;;6;6;N;;;;; +247A;PARENTHESIZED DIGIT SEVEN;No;0;ON;<compat> 0028 0037 0029;;7;7;N;;;;; +247B;PARENTHESIZED DIGIT EIGHT;No;0;ON;<compat> 0028 0038 0029;;8;8;N;;;;; +247C;PARENTHESIZED DIGIT NINE;No;0;ON;<compat> 0028 0039 0029;;9;9;N;;;;; +247D;PARENTHESIZED NUMBER TEN;No;0;ON;<compat> 0028 0031 0030 0029;;;10;N;;;;; +247E;PARENTHESIZED NUMBER ELEVEN;No;0;ON;<compat> 0028 0031 0031 0029;;;11;N;;;;; +247F;PARENTHESIZED NUMBER TWELVE;No;0;ON;<compat> 0028 0031 0032 0029;;;12;N;;;;; +2480;PARENTHESIZED NUMBER THIRTEEN;No;0;ON;<compat> 0028 0031 0033 0029;;;13;N;;;;; +2481;PARENTHESIZED NUMBER FOURTEEN;No;0;ON;<compat> 0028 0031 0034 0029;;;14;N;;;;; +2482;PARENTHESIZED NUMBER FIFTEEN;No;0;ON;<compat> 0028 0031 0035 0029;;;15;N;;;;; +2483;PARENTHESIZED NUMBER SIXTEEN;No;0;ON;<compat> 0028 0031 0036 0029;;;16;N;;;;; +2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;ON;<compat> 0028 0031 0037 0029;;;17;N;;;;; +2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;ON;<compat> 0028 0031 0038 0029;;;18;N;;;;; +2486;PARENTHESIZED NUMBER NINETEEN;No;0;ON;<compat> 0028 0031 0039 0029;;;19;N;;;;; +2487;PARENTHESIZED NUMBER TWENTY;No;0;ON;<compat> 0028 0032 0030 0029;;;20;N;;;;; +2488;DIGIT ONE FULL STOP;No;0;EN;<compat> 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;; +2489;DIGIT TWO FULL STOP;No;0;EN;<compat> 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;; +248A;DIGIT THREE FULL STOP;No;0;EN;<compat> 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;; +248B;DIGIT FOUR FULL STOP;No;0;EN;<compat> 0034 002E;;4;4;N;DIGIT FOUR PERIOD;;;; +248C;DIGIT FIVE FULL STOP;No;0;EN;<compat> 0035 002E;;5;5;N;DIGIT FIVE PERIOD;;;; +248D;DIGIT SIX FULL STOP;No;0;EN;<compat> 0036 002E;;6;6;N;DIGIT SIX PERIOD;;;; +248E;DIGIT SEVEN FULL STOP;No;0;EN;<compat> 0037 002E;;7;7;N;DIGIT SEVEN PERIOD;;;; +248F;DIGIT EIGHT FULL STOP;No;0;EN;<compat> 0038 002E;;8;8;N;DIGIT EIGHT PERIOD;;;; +2490;DIGIT NINE FULL STOP;No;0;EN;<compat> 0039 002E;;9;9;N;DIGIT NINE PERIOD;;;; +2491;NUMBER TEN FULL STOP;No;0;EN;<compat> 0031 0030 002E;;;10;N;NUMBER TEN PERIOD;;;; +2492;NUMBER ELEVEN FULL STOP;No;0;EN;<compat> 0031 0031 002E;;;11;N;NUMBER ELEVEN PERIOD;;;; +2493;NUMBER TWELVE FULL STOP;No;0;EN;<compat> 0031 0032 002E;;;12;N;NUMBER TWELVE PERIOD;;;; +2494;NUMBER THIRTEEN FULL STOP;No;0;EN;<compat> 0031 0033 002E;;;13;N;NUMBER THIRTEEN PERIOD;;;; +2495;NUMBER FOURTEEN FULL STOP;No;0;EN;<compat> 0031 0034 002E;;;14;N;NUMBER FOURTEEN PERIOD;;;; +2496;NUMBER FIFTEEN FULL STOP;No;0;EN;<compat> 0031 0035 002E;;;15;N;NUMBER FIFTEEN PERIOD;;;; +2497;NUMBER SIXTEEN FULL STOP;No;0;EN;<compat> 0031 0036 002E;;;16;N;NUMBER SIXTEEN PERIOD;;;; +2498;NUMBER SEVENTEEN FULL STOP;No;0;EN;<compat> 0031 0037 002E;;;17;N;NUMBER SEVENTEEN PERIOD;;;; +2499;NUMBER EIGHTEEN FULL STOP;No;0;EN;<compat> 0031 0038 002E;;;18;N;NUMBER EIGHTEEN PERIOD;;;; +249A;NUMBER NINETEEN FULL STOP;No;0;EN;<compat> 0031 0039 002E;;;19;N;NUMBER NINETEEN PERIOD;;;; +249B;NUMBER TWENTY FULL STOP;No;0;EN;<compat> 0032 0030 002E;;;20;N;NUMBER TWENTY PERIOD;;;; +249C;PARENTHESIZED LATIN SMALL LETTER A;So;0;L;<compat> 0028 0061 0029;;;;N;;;;; +249D;PARENTHESIZED LATIN SMALL LETTER B;So;0;L;<compat> 0028 0062 0029;;;;N;;;;; +249E;PARENTHESIZED LATIN SMALL LETTER C;So;0;L;<compat> 0028 0063 0029;;;;N;;;;; +249F;PARENTHESIZED LATIN SMALL LETTER D;So;0;L;<compat> 0028 0064 0029;;;;N;;;;; +24A0;PARENTHESIZED LATIN SMALL LETTER E;So;0;L;<compat> 0028 0065 0029;;;;N;;;;; +24A1;PARENTHESIZED LATIN SMALL LETTER F;So;0;L;<compat> 0028 0066 0029;;;;N;;;;; +24A2;PARENTHESIZED LATIN SMALL LETTER G;So;0;L;<compat> 0028 0067 0029;;;;N;;;;; +24A3;PARENTHESIZED LATIN SMALL LETTER H;So;0;L;<compat> 0028 0068 0029;;;;N;;;;; +24A4;PARENTHESIZED LATIN SMALL LETTER I;So;0;L;<compat> 0028 0069 0029;;;;N;;;;; +24A5;PARENTHESIZED LATIN SMALL LETTER J;So;0;L;<compat> 0028 006A 0029;;;;N;;;;; +24A6;PARENTHESIZED LATIN SMALL LETTER K;So;0;L;<compat> 0028 006B 0029;;;;N;;;;; +24A7;PARENTHESIZED LATIN SMALL LETTER L;So;0;L;<compat> 0028 006C 0029;;;;N;;;;; +24A8;PARENTHESIZED LATIN SMALL LETTER M;So;0;L;<compat> 0028 006D 0029;;;;N;;;;; +24A9;PARENTHESIZED LATIN SMALL LETTER N;So;0;L;<compat> 0028 006E 0029;;;;N;;;;; +24AA;PARENTHESIZED LATIN SMALL LETTER O;So;0;L;<compat> 0028 006F 0029;;;;N;;;;; +24AB;PARENTHESIZED LATIN SMALL LETTER P;So;0;L;<compat> 0028 0070 0029;;;;N;;;;; +24AC;PARENTHESIZED LATIN SMALL LETTER Q;So;0;L;<compat> 0028 0071 0029;;;;N;;;;; +24AD;PARENTHESIZED LATIN SMALL LETTER R;So;0;L;<compat> 0028 0072 0029;;;;N;;;;; +24AE;PARENTHESIZED LATIN SMALL LETTER S;So;0;L;<compat> 0028 0073 0029;;;;N;;;;; +24AF;PARENTHESIZED LATIN SMALL LETTER T;So;0;L;<compat> 0028 0074 0029;;;;N;;;;; +24B0;PARENTHESIZED LATIN SMALL LETTER U;So;0;L;<compat> 0028 0075 0029;;;;N;;;;; +24B1;PARENTHESIZED LATIN SMALL LETTER V;So;0;L;<compat> 0028 0076 0029;;;;N;;;;; +24B2;PARENTHESIZED LATIN SMALL LETTER W;So;0;L;<compat> 0028 0077 0029;;;;N;;;;; +24B3;PARENTHESIZED LATIN SMALL LETTER X;So;0;L;<compat> 0028 0078 0029;;;;N;;;;; +24B4;PARENTHESIZED LATIN SMALL LETTER Y;So;0;L;<compat> 0028 0079 0029;;;;N;;;;; +24B5;PARENTHESIZED LATIN SMALL LETTER Z;So;0;L;<compat> 0028 007A 0029;;;;N;;;;; +24B6;CIRCLED LATIN CAPITAL LETTER A;So;0;L;<circle> 0041;;;;N;;;;24D0; +24B7;CIRCLED LATIN CAPITAL LETTER B;So;0;L;<circle> 0042;;;;N;;;;24D1; +24B8;CIRCLED LATIN CAPITAL LETTER C;So;0;L;<circle> 0043;;;;N;;;;24D2; +24B9;CIRCLED LATIN CAPITAL LETTER D;So;0;L;<circle> 0044;;;;N;;;;24D3; +24BA;CIRCLED LATIN CAPITAL LETTER E;So;0;L;<circle> 0045;;;;N;;;;24D4; +24BB;CIRCLED LATIN CAPITAL LETTER F;So;0;L;<circle> 0046;;;;N;;;;24D5; +24BC;CIRCLED LATIN CAPITAL LETTER G;So;0;L;<circle> 0047;;;;N;;;;24D6; +24BD;CIRCLED LATIN CAPITAL LETTER H;So;0;L;<circle> 0048;;;;N;;;;24D7; +24BE;CIRCLED LATIN CAPITAL LETTER I;So;0;L;<circle> 0049;;;;N;;;;24D8; +24BF;CIRCLED LATIN CAPITAL LETTER J;So;0;L;<circle> 004A;;;;N;;;;24D9; +24C0;CIRCLED LATIN CAPITAL LETTER K;So;0;L;<circle> 004B;;;;N;;;;24DA; +24C1;CIRCLED LATIN CAPITAL LETTER L;So;0;L;<circle> 004C;;;;N;;;;24DB; +24C2;CIRCLED LATIN CAPITAL LETTER M;So;0;L;<circle> 004D;;;;N;;;;24DC; +24C3;CIRCLED LATIN CAPITAL LETTER N;So;0;L;<circle> 004E;;;;N;;;;24DD; +24C4;CIRCLED LATIN CAPITAL LETTER O;So;0;L;<circle> 004F;;;;N;;;;24DE; +24C5;CIRCLED LATIN CAPITAL LETTER P;So;0;L;<circle> 0050;;;;N;;;;24DF; +24C6;CIRCLED LATIN CAPITAL LETTER Q;So;0;L;<circle> 0051;;;;N;;;;24E0; +24C7;CIRCLED LATIN CAPITAL LETTER R;So;0;L;<circle> 0052;;;;N;;;;24E1; +24C8;CIRCLED LATIN CAPITAL LETTER S;So;0;L;<circle> 0053;;;;N;;;;24E2; +24C9;CIRCLED LATIN CAPITAL LETTER T;So;0;L;<circle> 0054;;;;N;;;;24E3; +24CA;CIRCLED LATIN CAPITAL LETTER U;So;0;L;<circle> 0055;;;;N;;;;24E4; +24CB;CIRCLED LATIN CAPITAL LETTER V;So;0;L;<circle> 0056;;;;N;;;;24E5; +24CC;CIRCLED LATIN CAPITAL LETTER W;So;0;L;<circle> 0057;;;;N;;;;24E6; +24CD;CIRCLED LATIN CAPITAL LETTER X;So;0;L;<circle> 0058;;;;N;;;;24E7; +24CE;CIRCLED LATIN CAPITAL LETTER Y;So;0;L;<circle> 0059;;;;N;;;;24E8; +24CF;CIRCLED LATIN CAPITAL LETTER Z;So;0;L;<circle> 005A;;;;N;;;;24E9; +24D0;CIRCLED LATIN SMALL LETTER A;So;0;L;<circle> 0061;;;;N;;;24B6;;24B6 +24D1;CIRCLED LATIN SMALL LETTER B;So;0;L;<circle> 0062;;;;N;;;24B7;;24B7 +24D2;CIRCLED LATIN SMALL LETTER C;So;0;L;<circle> 0063;;;;N;;;24B8;;24B8 +24D3;CIRCLED LATIN SMALL LETTER D;So;0;L;<circle> 0064;;;;N;;;24B9;;24B9 +24D4;CIRCLED LATIN SMALL LETTER E;So;0;L;<circle> 0065;;;;N;;;24BA;;24BA +24D5;CIRCLED LATIN SMALL LETTER F;So;0;L;<circle> 0066;;;;N;;;24BB;;24BB +24D6;CIRCLED LATIN SMALL LETTER G;So;0;L;<circle> 0067;;;;N;;;24BC;;24BC +24D7;CIRCLED LATIN SMALL LETTER H;So;0;L;<circle> 0068;;;;N;;;24BD;;24BD +24D8;CIRCLED LATIN SMALL LETTER I;So;0;L;<circle> 0069;;;;N;;;24BE;;24BE +24D9;CIRCLED LATIN SMALL LETTER J;So;0;L;<circle> 006A;;;;N;;;24BF;;24BF +24DA;CIRCLED LATIN SMALL LETTER K;So;0;L;<circle> 006B;;;;N;;;24C0;;24C0 +24DB;CIRCLED LATIN SMALL LETTER L;So;0;L;<circle> 006C;;;;N;;;24C1;;24C1 +24DC;CIRCLED LATIN SMALL LETTER M;So;0;L;<circle> 006D;;;;N;;;24C2;;24C2 +24DD;CIRCLED LATIN SMALL LETTER N;So;0;L;<circle> 006E;;;;N;;;24C3;;24C3 +24DE;CIRCLED LATIN SMALL LETTER O;So;0;L;<circle> 006F;;;;N;;;24C4;;24C4 +24DF;CIRCLED LATIN SMALL LETTER P;So;0;L;<circle> 0070;;;;N;;;24C5;;24C5 +24E0;CIRCLED LATIN SMALL LETTER Q;So;0;L;<circle> 0071;;;;N;;;24C6;;24C6 +24E1;CIRCLED LATIN SMALL LETTER R;So;0;L;<circle> 0072;;;;N;;;24C7;;24C7 +24E2;CIRCLED LATIN SMALL LETTER S;So;0;L;<circle> 0073;;;;N;;;24C8;;24C8 +24E3;CIRCLED LATIN SMALL LETTER T;So;0;L;<circle> 0074;;;;N;;;24C9;;24C9 +24E4;CIRCLED LATIN SMALL LETTER U;So;0;L;<circle> 0075;;;;N;;;24CA;;24CA +24E5;CIRCLED LATIN SMALL LETTER V;So;0;L;<circle> 0076;;;;N;;;24CB;;24CB +24E6;CIRCLED LATIN SMALL LETTER W;So;0;L;<circle> 0077;;;;N;;;24CC;;24CC +24E7;CIRCLED LATIN SMALL LETTER X;So;0;L;<circle> 0078;;;;N;;;24CD;;24CD +24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L;<circle> 0079;;;;N;;;24CE;;24CE +24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L;<circle> 007A;;;;N;;;24CF;;24CF +24EA;CIRCLED DIGIT ZERO;No;0;ON;<circle> 0030;;0;0;N;;;;; +24EB;NEGATIVE CIRCLED NUMBER ELEVEN;No;0;ON;;;;11;N;;;;; +24EC;NEGATIVE CIRCLED NUMBER TWELVE;No;0;ON;;;;12;N;;;;; +24ED;NEGATIVE CIRCLED NUMBER THIRTEEN;No;0;ON;;;;13;N;;;;; +24EE;NEGATIVE CIRCLED NUMBER FOURTEEN;No;0;ON;;;;14;N;;;;; +24EF;NEGATIVE CIRCLED NUMBER FIFTEEN;No;0;ON;;;;15;N;;;;; +24F0;NEGATIVE CIRCLED NUMBER SIXTEEN;No;0;ON;;;;16;N;;;;; +24F1;NEGATIVE CIRCLED NUMBER SEVENTEEN;No;0;ON;;;;17;N;;;;; +24F2;NEGATIVE CIRCLED NUMBER EIGHTEEN;No;0;ON;;;;18;N;;;;; +24F3;NEGATIVE CIRCLED NUMBER NINETEEN;No;0;ON;;;;19;N;;;;; +24F4;NEGATIVE CIRCLED NUMBER TWENTY;No;0;ON;;;;20;N;;;;; +24F5;DOUBLE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;;;;; +24F6;DOUBLE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;;;;; +24F7;DOUBLE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;;;;; +24F8;DOUBLE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;;;;; +24F9;DOUBLE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;;;;; +24FA;DOUBLE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;;;;; +24FB;DOUBLE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;;;;; +24FC;DOUBLE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;;;;; +24FD;DOUBLE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;;;;; +24FE;DOUBLE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;;;;; +24FF;NEGATIVE CIRCLED DIGIT ZERO;No;0;ON;;;0;0;N;;;;; +2500;BOX DRAWINGS LIGHT HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT HORIZONTAL;;;; +2501;BOX DRAWINGS HEAVY HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY HORIZONTAL;;;; +2502;BOX DRAWINGS LIGHT VERTICAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL;;;; +2503;BOX DRAWINGS HEAVY VERTICAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL;;;; +2504;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH HORIZONTAL;;;; +2505;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH HORIZONTAL;;;; +2506;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH VERTICAL;;;; +2507;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH VERTICAL;;;; +2508;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH HORIZONTAL;;;; +2509;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH HORIZONTAL;;;; +250A;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH VERTICAL;;;; +250B;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH VERTICAL;;;; +250C;BOX DRAWINGS LIGHT DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND RIGHT;;;; +250D;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT HEAVY;;;; +250E;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT LIGHT;;;; +250F;BOX DRAWINGS HEAVY DOWN AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND RIGHT;;;; +2510;BOX DRAWINGS LIGHT DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND LEFT;;;; +2511;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT HEAVY;;;; +2512;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT LIGHT;;;; +2513;BOX DRAWINGS HEAVY DOWN AND LEFT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND LEFT;;;; +2514;BOX DRAWINGS LIGHT UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT UP AND RIGHT;;;; +2515;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT HEAVY;;;; +2516;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT LIGHT;;;; +2517;BOX DRAWINGS HEAVY UP AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY UP AND RIGHT;;;; +2518;BOX DRAWINGS LIGHT UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT UP AND LEFT;;;; +2519;BOX DRAWINGS UP LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT HEAVY;;;; +251A;BOX DRAWINGS UP HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT LIGHT;;;; +251B;BOX DRAWINGS HEAVY UP AND LEFT;So;0;ON;;;;;N;FORMS HEAVY UP AND LEFT;;;; +251C;BOX DRAWINGS LIGHT VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND RIGHT;;;; +251D;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND RIGHT HEAVY;;;; +251E;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT DOWN LIGHT;;;; +251F;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT UP LIGHT;;;; +2520;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND RIGHT LIGHT;;;; +2521;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT UP HEAVY;;;; +2522;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT DOWN HEAVY;;;; +2523;BOX DRAWINGS HEAVY VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND RIGHT;;;; +2524;BOX DRAWINGS LIGHT VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND LEFT;;;; +2525;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND LEFT HEAVY;;;; +2526;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT DOWN LIGHT;;;; +2527;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT UP LIGHT;;;; +2528;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND LEFT LIGHT;;;; +2529;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT UP HEAVY;;;; +252A;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT DOWN HEAVY;;;; +252B;BOX DRAWINGS HEAVY VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND LEFT;;;; +252C;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOWN AND HORIZONTAL;;;; +252D;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT DOWN LIGHT;;;; +252E;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT DOWN LIGHT;;;; +252F;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND HORIZONTAL HEAVY;;;; +2530;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND HORIZONTAL LIGHT;;;; +2531;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT DOWN HEAVY;;;; +2532;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT DOWN HEAVY;;;; +2533;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOWN AND HORIZONTAL;;;; +2534;BOX DRAWINGS LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT UP AND HORIZONTAL;;;; +2535;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT UP LIGHT;;;; +2536;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT UP LIGHT;;;; +2537;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND HORIZONTAL HEAVY;;;; +2538;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND HORIZONTAL LIGHT;;;; +2539;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT UP HEAVY;;;; +253A;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT UP HEAVY;;;; +253B;BOX DRAWINGS HEAVY UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY UP AND HORIZONTAL;;;; +253C;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND HORIZONTAL;;;; +253D;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT;;;; +253E;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT;;;; +253F;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY;;;; +2540;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT;;;; +2541;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT;;;; +2542;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT;;;; +2543;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT;;;; +2544;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT;;;; +2545;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT;;;; +2546;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT;;;; +2547;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY;;;; +2548;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY;;;; +2549;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY;;;; +254A;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY;;;; +254B;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND HORIZONTAL;;;; +254C;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH HORIZONTAL;;;; +254D;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH HORIZONTAL;;;; +254E;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH VERTICAL;;;; +254F;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH VERTICAL;;;; +2550;BOX DRAWINGS DOUBLE HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE HORIZONTAL;;;; +2551;BOX DRAWINGS DOUBLE VERTICAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL;;;; +2552;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND RIGHT DOUBLE;;;; +2553;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND RIGHT SINGLE;;;; +2554;BOX DRAWINGS DOUBLE DOWN AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND RIGHT;;;; +2555;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND LEFT DOUBLE;;;; +2556;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND LEFT SINGLE;;;; +2557;BOX DRAWINGS DOUBLE DOWN AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND LEFT;;;; +2558;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND RIGHT DOUBLE;;;; +2559;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND RIGHT SINGLE;;;; +255A;BOX DRAWINGS DOUBLE UP AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE UP AND RIGHT;;;; +255B;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND LEFT DOUBLE;;;; +255C;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND LEFT SINGLE;;;; +255D;BOX DRAWINGS DOUBLE UP AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE UP AND LEFT;;;; +255E;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND RIGHT DOUBLE;;;; +255F;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND RIGHT SINGLE;;;; +2560;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND RIGHT;;;; +2561;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND LEFT DOUBLE;;;; +2562;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND LEFT SINGLE;;;; +2563;BOX DRAWINGS DOUBLE VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND LEFT;;;; +2564;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND HORIZONTAL DOUBLE;;;; +2565;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND HORIZONTAL SINGLE;;;; +2566;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND HORIZONTAL;;;; +2567;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND HORIZONTAL DOUBLE;;;; +2568;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND HORIZONTAL SINGLE;;;; +2569;BOX DRAWINGS DOUBLE UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE UP AND HORIZONTAL;;;; +256A;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE;;;; +256B;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE;;;; +256C;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND HORIZONTAL;;;; +256D;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND RIGHT;;;; +256E;BOX DRAWINGS LIGHT ARC DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND LEFT;;;; +256F;BOX DRAWINGS LIGHT ARC UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND LEFT;;;; +2570;BOX DRAWINGS LIGHT ARC UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND RIGHT;;;; +2571;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;;;; +2572;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;;;; +2573;BOX DRAWINGS LIGHT DIAGONAL CROSS;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL CROSS;;;; +2574;BOX DRAWINGS LIGHT LEFT;So;0;ON;;;;;N;FORMS LIGHT LEFT;;;; +2575;BOX DRAWINGS LIGHT UP;So;0;ON;;;;;N;FORMS LIGHT UP;;;; +2576;BOX DRAWINGS LIGHT RIGHT;So;0;ON;;;;;N;FORMS LIGHT RIGHT;;;; +2577;BOX DRAWINGS LIGHT DOWN;So;0;ON;;;;;N;FORMS LIGHT DOWN;;;; +2578;BOX DRAWINGS HEAVY LEFT;So;0;ON;;;;;N;FORMS HEAVY LEFT;;;; +2579;BOX DRAWINGS HEAVY UP;So;0;ON;;;;;N;FORMS HEAVY UP;;;; +257A;BOX DRAWINGS HEAVY RIGHT;So;0;ON;;;;;N;FORMS HEAVY RIGHT;;;; +257B;BOX DRAWINGS HEAVY DOWN;So;0;ON;;;;;N;FORMS HEAVY DOWN;;;; +257C;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT;So;0;ON;;;;;N;FORMS LIGHT LEFT AND HEAVY RIGHT;;;; +257D;BOX DRAWINGS LIGHT UP AND HEAVY DOWN;So;0;ON;;;;;N;FORMS LIGHT UP AND HEAVY DOWN;;;; +257E;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT;So;0;ON;;;;;N;FORMS HEAVY LEFT AND LIGHT RIGHT;;;; +257F;BOX DRAWINGS HEAVY UP AND LIGHT DOWN;So;0;ON;;;;;N;FORMS HEAVY UP AND LIGHT DOWN;;;; +2580;UPPER HALF BLOCK;So;0;ON;;;;;N;;;;; +2581;LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2582;LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +2583;LOWER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2584;LOWER HALF BLOCK;So;0;ON;;;;;N;;;;; +2585;LOWER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2586;LOWER THREE QUARTERS BLOCK;So;0;ON;;;;;N;LOWER THREE QUARTER BLOCK;;;; +2587;LOWER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2588;FULL BLOCK;So;0;ON;;;;;N;;;;; +2589;LEFT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258A;LEFT THREE QUARTERS BLOCK;So;0;ON;;;;;N;LEFT THREE QUARTER BLOCK;;;; +258B;LEFT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258C;LEFT HALF BLOCK;So;0;ON;;;;;N;;;;; +258D;LEFT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258E;LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +258F;LEFT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2590;RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;; +2591;LIGHT SHADE;So;0;ON;;;;;N;;;;; +2592;MEDIUM SHADE;So;0;ON;;;;;N;;;;; +2593;DARK SHADE;So;0;ON;;;;;N;;;;; +2594;UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2595;RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2596;QUADRANT LOWER LEFT;So;0;ON;;;;;N;;;;; +2597;QUADRANT LOWER RIGHT;So;0;ON;;;;;N;;;;; +2598;QUADRANT UPPER LEFT;So;0;ON;;;;;N;;;;; +2599;QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259A;QUADRANT UPPER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259B;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;; +259C;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259D;QUADRANT UPPER RIGHT;So;0;ON;;;;;N;;;;; +259E;QUADRANT UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;; +259F;QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +25A0;BLACK SQUARE;So;0;ON;;;;;N;;;;; +25A1;WHITE SQUARE;So;0;ON;;;;;N;;;;; +25A2;WHITE SQUARE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; +25A3;WHITE SQUARE CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; +25A4;SQUARE WITH HORIZONTAL FILL;So;0;ON;;;;;N;;;;; +25A5;SQUARE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; +25A6;SQUARE WITH ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; +25A7;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;; +25A8;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;; +25A9;SQUARE WITH DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; +25AA;BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; +25AB;WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;; +25AC;BLACK RECTANGLE;So;0;ON;;;;;N;;;;; +25AD;WHITE RECTANGLE;So;0;ON;;;;;N;;;;; +25AE;BLACK VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; +25AF;WHITE VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; +25B0;BLACK PARALLELOGRAM;So;0;ON;;;;;N;;;;; +25B1;WHITE PARALLELOGRAM;So;0;ON;;;;;N;;;;; +25B2;BLACK UP-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING TRIANGLE;;;; +25B3;WHITE UP-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE;;;; +25B4;BLACK UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING SMALL TRIANGLE;;;; +25B5;WHITE UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING SMALL TRIANGLE;;;; +25B6;BLACK RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING TRIANGLE;;;; +25B7;WHITE RIGHT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE RIGHT POINTING TRIANGLE;;;; +25B8;BLACK RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING SMALL TRIANGLE;;;; +25B9;WHITE RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE RIGHT POINTING SMALL TRIANGLE;;;; +25BA;BLACK RIGHT-POINTING POINTER;So;0;ON;;;;;N;BLACK RIGHT POINTING POINTER;;;; +25BB;WHITE RIGHT-POINTING POINTER;So;0;ON;;;;;N;WHITE RIGHT POINTING POINTER;;;; +25BC;BLACK DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING TRIANGLE;;;; +25BD;WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING TRIANGLE;;;; +25BE;BLACK DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING SMALL TRIANGLE;;;; +25BF;WHITE DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING SMALL TRIANGLE;;;; +25C0;BLACK LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING TRIANGLE;;;; +25C1;WHITE LEFT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE LEFT POINTING TRIANGLE;;;; +25C2;BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING SMALL TRIANGLE;;;; +25C3;WHITE LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE LEFT POINTING SMALL TRIANGLE;;;; +25C4;BLACK LEFT-POINTING POINTER;So;0;ON;;;;;N;BLACK LEFT POINTING POINTER;;;; +25C5;WHITE LEFT-POINTING POINTER;So;0;ON;;;;;N;WHITE LEFT POINTING POINTER;;;; +25C6;BLACK DIAMOND;So;0;ON;;;;;N;;;;; +25C7;WHITE DIAMOND;So;0;ON;;;;;N;;;;; +25C8;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; +25C9;FISHEYE;So;0;ON;;;;;N;;;;; +25CA;LOZENGE;So;0;ON;;;;;N;;;;; +25CB;WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25CC;DOTTED CIRCLE;So;0;ON;;;;;N;;;;; +25CD;CIRCLE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; +25CE;BULLSEYE;So;0;ON;;;;;N;;;;; +25CF;BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D0;CIRCLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +25D1;CIRCLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +25D2;CIRCLE WITH LOWER HALF BLACK;So;0;ON;;;;;N;;;;; +25D3;CIRCLE WITH UPPER HALF BLACK;So;0;ON;;;;;N;;;;; +25D4;CIRCLE WITH UPPER RIGHT QUADRANT BLACK;So;0;ON;;;;;N;;;;; +25D5;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK;So;0;ON;;;;;N;;;;; +25D6;LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D7;RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D8;INVERSE BULLET;So;0;ON;;;;;N;;;;; +25D9;INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DA;UPPER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DB;LOWER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DC;UPPER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DD;UPPER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DE;LOWER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DF;LOWER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25E0;UPPER HALF CIRCLE;So;0;ON;;;;;N;;;;; +25E1;LOWER HALF CIRCLE;So;0;ON;;;;;N;;;;; +25E2;BLACK LOWER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +25E3;BLACK LOWER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; +25E4;BLACK UPPER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; +25E5;BLACK UPPER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +25E6;WHITE BULLET;So;0;ON;;;;;N;;;;; +25E7;SQUARE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +25E8;SQUARE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +25E9;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +25EA;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +25EB;WHITE SQUARE WITH VERTICAL BISECTING LINE;So;0;ON;;;;;N;;;;; +25EC;WHITE UP-POINTING TRIANGLE WITH DOT;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE WITH DOT;;;; +25ED;UP-POINTING TRIANGLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH LEFT HALF BLACK;;;; +25EE;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH RIGHT HALF BLACK;;;; +25EF;LARGE CIRCLE;So;0;ON;;;;;N;;;;; +25F0;WHITE SQUARE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F1;WHITE SQUARE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F2;WHITE SQUARE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F3;WHITE SQUARE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F4;WHITE CIRCLE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F5;WHITE CIRCLE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F6;WHITE CIRCLE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F7;WHITE CIRCLE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F8;UPPER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25F9;UPPER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25FA;LOWER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25FB;WHITE MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;; +25FC;BLACK MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;; +25FD;WHITE MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;; +25FE;BLACK MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;; +25FF;LOWER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;; +2600;BLACK SUN WITH RAYS;So;0;ON;;;;;N;;;;; +2601;CLOUD;So;0;ON;;;;;N;;;;; +2602;UMBRELLA;So;0;ON;;;;;N;;;;; +2603;SNOWMAN;So;0;ON;;;;;N;;;;; +2604;COMET;So;0;ON;;;;;N;;;;; +2605;BLACK STAR;So;0;ON;;;;;N;;;;; +2606;WHITE STAR;So;0;ON;;;;;N;;;;; +2607;LIGHTNING;So;0;ON;;;;;N;;;;; +2608;THUNDERSTORM;So;0;ON;;;;;N;;;;; +2609;SUN;So;0;ON;;;;;N;;;;; +260A;ASCENDING NODE;So;0;ON;;;;;N;;;;; +260B;DESCENDING NODE;So;0;ON;;;;;N;;;;; +260C;CONJUNCTION;So;0;ON;;;;;N;;;;; +260D;OPPOSITION;So;0;ON;;;;;N;;;;; +260E;BLACK TELEPHONE;So;0;ON;;;;;N;;;;; +260F;WHITE TELEPHONE;So;0;ON;;;;;N;;;;; +2610;BALLOT BOX;So;0;ON;;;;;N;;;;; +2611;BALLOT BOX WITH CHECK;So;0;ON;;;;;N;;;;; +2612;BALLOT BOX WITH X;So;0;ON;;;;;N;;;;; +2613;SALTIRE;So;0;ON;;;;;N;;;;; +2614;UMBRELLA WITH RAIN DROPS;So;0;ON;;;;;N;;;;; +2615;HOT BEVERAGE;So;0;ON;;;;;N;;;;; +2616;WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; +2617;BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; +2618;SHAMROCK;So;0;ON;;;;;N;;;;; +2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; +261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +261C;WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +261D;WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; +261E;WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +261F;WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; +2620;SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; +2621;CAUTION SIGN;So;0;ON;;;;;N;;;;; +2622;RADIOACTIVE SIGN;So;0;ON;;;;;N;;;;; +2623;BIOHAZARD SIGN;So;0;ON;;;;;N;;;;; +2624;CADUCEUS;So;0;ON;;;;;N;;;;; +2625;ANKH;So;0;ON;;;;;N;;;;; +2626;ORTHODOX CROSS;So;0;ON;;;;;N;;;;; +2627;CHI RHO;So;0;ON;;;;;N;;;;; +2628;CROSS OF LORRAINE;So;0;ON;;;;;N;;;;; +2629;CROSS OF JERUSALEM;So;0;ON;;;;;N;;;;; +262A;STAR AND CRESCENT;So;0;ON;;;;;N;;;;; +262B;FARSI SYMBOL;So;0;ON;;;;;N;SYMBOL OF IRAN;;;; +262C;ADI SHAKTI;So;0;ON;;;;;N;;;;; +262D;HAMMER AND SICKLE;So;0;ON;;;;;N;;;;; +262E;PEACE SYMBOL;So;0;ON;;;;;N;;;;; +262F;YIN YANG;So;0;ON;;;;;N;;;;; +2630;TRIGRAM FOR HEAVEN;So;0;ON;;;;;N;;;;; +2631;TRIGRAM FOR LAKE;So;0;ON;;;;;N;;;;; +2632;TRIGRAM FOR FIRE;So;0;ON;;;;;N;;;;; +2633;TRIGRAM FOR THUNDER;So;0;ON;;;;;N;;;;; +2634;TRIGRAM FOR WIND;So;0;ON;;;;;N;;;;; +2635;TRIGRAM FOR WATER;So;0;ON;;;;;N;;;;; +2636;TRIGRAM FOR MOUNTAIN;So;0;ON;;;;;N;;;;; +2637;TRIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +2638;WHEEL OF DHARMA;So;0;ON;;;;;N;;;;; +2639;WHITE FROWNING FACE;So;0;ON;;;;;N;;;;; +263A;WHITE SMILING FACE;So;0;ON;;;;;N;;;;; +263B;BLACK SMILING FACE;So;0;ON;;;;;N;;;;; +263C;WHITE SUN WITH RAYS;So;0;ON;;;;;N;;;;; +263D;FIRST QUARTER MOON;So;0;ON;;;;;N;;;;; +263E;LAST QUARTER MOON;So;0;ON;;;;;N;;;;; +263F;MERCURY;So;0;ON;;;;;N;;;;; +2640;FEMALE SIGN;So;0;ON;;;;;N;;;;; +2641;EARTH;So;0;ON;;;;;N;;;;; +2642;MALE SIGN;So;0;ON;;;;;N;;;;; +2643;JUPITER;So;0;ON;;;;;N;;;;; +2644;SATURN;So;0;ON;;;;;N;;;;; +2645;URANUS;So;0;ON;;;;;N;;;;; +2646;NEPTUNE;So;0;ON;;;;;N;;;;; +2647;PLUTO;So;0;ON;;;;;N;;;;; +2648;ARIES;So;0;ON;;;;;N;;;;; +2649;TAURUS;So;0;ON;;;;;N;;;;; +264A;GEMINI;So;0;ON;;;;;N;;;;; +264B;CANCER;So;0;ON;;;;;N;;;;; +264C;LEO;So;0;ON;;;;;N;;;;; +264D;VIRGO;So;0;ON;;;;;N;;;;; +264E;LIBRA;So;0;ON;;;;;N;;;;; +264F;SCORPIUS;So;0;ON;;;;;N;;;;; +2650;SAGITTARIUS;So;0;ON;;;;;N;;;;; +2651;CAPRICORN;So;0;ON;;;;;N;;;;; +2652;AQUARIUS;So;0;ON;;;;;N;;;;; +2653;PISCES;So;0;ON;;;;;N;;;;; +2654;WHITE CHESS KING;So;0;ON;;;;;N;;;;; +2655;WHITE CHESS QUEEN;So;0;ON;;;;;N;;;;; +2656;WHITE CHESS ROOK;So;0;ON;;;;;N;;;;; +2657;WHITE CHESS BISHOP;So;0;ON;;;;;N;;;;; +2658;WHITE CHESS KNIGHT;So;0;ON;;;;;N;;;;; +2659;WHITE CHESS PAWN;So;0;ON;;;;;N;;;;; +265A;BLACK CHESS KING;So;0;ON;;;;;N;;;;; +265B;BLACK CHESS QUEEN;So;0;ON;;;;;N;;;;; +265C;BLACK CHESS ROOK;So;0;ON;;;;;N;;;;; +265D;BLACK CHESS BISHOP;So;0;ON;;;;;N;;;;; +265E;BLACK CHESS KNIGHT;So;0;ON;;;;;N;;;;; +265F;BLACK CHESS PAWN;So;0;ON;;;;;N;;;;; +2660;BLACK SPADE SUIT;So;0;ON;;;;;N;;;;; +2661;WHITE HEART SUIT;So;0;ON;;;;;N;;;;; +2662;WHITE DIAMOND SUIT;So;0;ON;;;;;N;;;;; +2663;BLACK CLUB SUIT;So;0;ON;;;;;N;;;;; +2664;WHITE SPADE SUIT;So;0;ON;;;;;N;;;;; +2665;BLACK HEART SUIT;So;0;ON;;;;;N;;;;; +2666;BLACK DIAMOND SUIT;So;0;ON;;;;;N;;;;; +2667;WHITE CLUB SUIT;So;0;ON;;;;;N;;;;; +2668;HOT SPRINGS;So;0;ON;;;;;N;;;;; +2669;QUARTER NOTE;So;0;ON;;;;;N;;;;; +266A;EIGHTH NOTE;So;0;ON;;;;;N;;;;; +266B;BEAMED EIGHTH NOTES;So;0;ON;;;;;N;BARRED EIGHTH NOTES;;;; +266C;BEAMED SIXTEENTH NOTES;So;0;ON;;;;;N;BARRED SIXTEENTH NOTES;;;; +266D;MUSIC FLAT SIGN;So;0;ON;;;;;N;FLAT;;;; +266E;MUSIC NATURAL SIGN;So;0;ON;;;;;N;NATURAL;;;; +266F;MUSIC SHARP SIGN;Sm;0;ON;;;;;N;SHARP;;;; +2670;WEST SYRIAC CROSS;So;0;ON;;;;;N;;;;; +2671;EAST SYRIAC CROSS;So;0;ON;;;;;N;;;;; +2672;UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; +2673;RECYCLING SYMBOL FOR TYPE-1 PLASTICS;So;0;ON;;;;;N;;;;; +2674;RECYCLING SYMBOL FOR TYPE-2 PLASTICS;So;0;ON;;;;;N;;;;; +2675;RECYCLING SYMBOL FOR TYPE-3 PLASTICS;So;0;ON;;;;;N;;;;; +2676;RECYCLING SYMBOL FOR TYPE-4 PLASTICS;So;0;ON;;;;;N;;;;; +2677;RECYCLING SYMBOL FOR TYPE-5 PLASTICS;So;0;ON;;;;;N;;;;; +2678;RECYCLING SYMBOL FOR TYPE-6 PLASTICS;So;0;ON;;;;;N;;;;; +2679;RECYCLING SYMBOL FOR TYPE-7 PLASTICS;So;0;ON;;;;;N;;;;; +267A;RECYCLING SYMBOL FOR GENERIC MATERIALS;So;0;ON;;;;;N;;;;; +267B;BLACK UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; +267C;RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; +267D;PARTIALLY-RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; +267E;PERMANENT PAPER SIGN;So;0;ON;;;;;N;;;;; +267F;WHEELCHAIR SYMBOL;So;0;ON;;;;;N;;;;; +2680;DIE FACE-1;So;0;ON;;;;;N;;;;; +2681;DIE FACE-2;So;0;ON;;;;;N;;;;; +2682;DIE FACE-3;So;0;ON;;;;;N;;;;; +2683;DIE FACE-4;So;0;ON;;;;;N;;;;; +2684;DIE FACE-5;So;0;ON;;;;;N;;;;; +2685;DIE FACE-6;So;0;ON;;;;;N;;;;; +2686;WHITE CIRCLE WITH DOT RIGHT;So;0;ON;;;;;N;;;;; +2687;WHITE CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;; +2688;BLACK CIRCLE WITH WHITE DOT RIGHT;So;0;ON;;;;;N;;;;; +2689;BLACK CIRCLE WITH TWO WHITE DOTS;So;0;ON;;;;;N;;;;; +268A;MONOGRAM FOR YANG;So;0;ON;;;;;N;;;;; +268B;MONOGRAM FOR YIN;So;0;ON;;;;;N;;;;; +268C;DIGRAM FOR GREATER YANG;So;0;ON;;;;;N;;;;; +268D;DIGRAM FOR LESSER YIN;So;0;ON;;;;;N;;;;; +268E;DIGRAM FOR LESSER YANG;So;0;ON;;;;;N;;;;; +268F;DIGRAM FOR GREATER YIN;So;0;ON;;;;;N;;;;; +2690;WHITE FLAG;So;0;ON;;;;;N;;;;; +2691;BLACK FLAG;So;0;ON;;;;;N;;;;; +2692;HAMMER AND PICK;So;0;ON;;;;;N;;;;; +2693;ANCHOR;So;0;ON;;;;;N;;;;; +2694;CROSSED SWORDS;So;0;ON;;;;;N;;;;; +2695;STAFF OF AESCULAPIUS;So;0;ON;;;;;N;;;;; +2696;SCALES;So;0;ON;;;;;N;;;;; +2697;ALEMBIC;So;0;ON;;;;;N;;;;; +2698;FLOWER;So;0;ON;;;;;N;;;;; +2699;GEAR;So;0;ON;;;;;N;;;;; +269A;STAFF OF HERMES;So;0;ON;;;;;N;;;;; +269B;ATOM SYMBOL;So;0;ON;;;;;N;;;;; +269C;FLEUR-DE-LIS;So;0;ON;;;;;N;;;;; +269D;OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; +269E;THREE LINES CONVERGING RIGHT;So;0;ON;;;;;N;;;;; +269F;THREE LINES CONVERGING LEFT;So;0;ON;;;;;N;;;;; +26A0;WARNING SIGN;So;0;ON;;;;;N;;;;; +26A1;HIGH VOLTAGE SIGN;So;0;ON;;;;;N;;;;; +26A2;DOUBLED FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A3;DOUBLED MALE SIGN;So;0;ON;;;;;N;;;;; +26A4;INTERLOCKED FEMALE AND MALE SIGN;So;0;ON;;;;;N;;;;; +26A5;MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A6;MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26A7;MALE WITH STROKE AND MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A8;VERTICAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26A9;HORIZONTAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26AA;MEDIUM WHITE CIRCLE;So;0;ON;;;;;N;;;;; +26AB;MEDIUM BLACK CIRCLE;So;0;ON;;;;;N;;;;; +26AC;MEDIUM SMALL WHITE CIRCLE;So;0;L;;;;;N;;;;; +26AD;MARRIAGE SYMBOL;So;0;ON;;;;;N;;;;; +26AE;DIVORCE SYMBOL;So;0;ON;;;;;N;;;;; +26AF;UNMARRIED PARTNERSHIP SYMBOL;So;0;ON;;;;;N;;;;; +26B0;COFFIN;So;0;ON;;;;;N;;;;; +26B1;FUNERAL URN;So;0;ON;;;;;N;;;;; +26B2;NEUTER;So;0;ON;;;;;N;;;;; +26B3;CERES;So;0;ON;;;;;N;;;;; +26B4;PALLAS;So;0;ON;;;;;N;;;;; +26B5;JUNO;So;0;ON;;;;;N;;;;; +26B6;VESTA;So;0;ON;;;;;N;;;;; +26B7;CHIRON;So;0;ON;;;;;N;;;;; +26B8;BLACK MOON LILITH;So;0;ON;;;;;N;;;;; +26B9;SEXTILE;So;0;ON;;;;;N;;;;; +26BA;SEMISEXTILE;So;0;ON;;;;;N;;;;; +26BB;QUINCUNX;So;0;ON;;;;;N;;;;; +26BC;SESQUIQUADRATE;So;0;ON;;;;;N;;;;; +26BD;SOCCER BALL;So;0;ON;;;;;N;;;;; +26BE;BASEBALL;So;0;ON;;;;;N;;;;; +26BF;SQUARED KEY;So;0;ON;;;;;N;;;;; +26C0;WHITE DRAUGHTS MAN;So;0;ON;;;;;N;;;;; +26C1;WHITE DRAUGHTS KING;So;0;ON;;;;;N;;;;; +26C2;BLACK DRAUGHTS MAN;So;0;ON;;;;;N;;;;; +26C3;BLACK DRAUGHTS KING;So;0;ON;;;;;N;;;;; +26C4;SNOWMAN WITHOUT SNOW;So;0;ON;;;;;N;;;;; +26C5;SUN BEHIND CLOUD;So;0;ON;;;;;N;;;;; +26C6;RAIN;So;0;ON;;;;;N;;;;; +26C7;BLACK SNOWMAN;So;0;ON;;;;;N;;;;; +26C8;THUNDER CLOUD AND RAIN;So;0;ON;;;;;N;;;;; +26C9;TURNED WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; +26CA;TURNED BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; +26CB;WHITE DIAMOND IN SQUARE;So;0;ON;;;;;N;;;;; +26CC;CROSSING LANES;So;0;ON;;;;;N;;;;; +26CD;DISABLED CAR;So;0;ON;;;;;N;;;;; +26CF;PICK;So;0;ON;;;;;N;;;;; +26D0;CAR SLIDING;So;0;ON;;;;;N;;;;; +26D1;HELMET WITH WHITE CROSS;So;0;ON;;;;;N;;;;; +26D2;CIRCLED CROSSING LANES;So;0;ON;;;;;N;;;;; +26D3;CHAINS;So;0;ON;;;;;N;;;;; +26D4;NO ENTRY;So;0;ON;;;;;N;;;;; +26D5;ALTERNATE ONE-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; +26D6;BLACK TWO-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; +26D7;WHITE TWO-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; +26D8;BLACK LEFT LANE MERGE;So;0;ON;;;;;N;;;;; +26D9;WHITE LEFT LANE MERGE;So;0;ON;;;;;N;;;;; +26DA;DRIVE SLOW SIGN;So;0;ON;;;;;N;;;;; +26DB;HEAVY WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +26DC;LEFT CLOSED ENTRY;So;0;ON;;;;;N;;;;; +26DD;SQUARED SALTIRE;So;0;ON;;;;;N;;;;; +26DE;FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE;So;0;ON;;;;;N;;;;; +26DF;BLACK TRUCK;So;0;ON;;;;;N;;;;; +26E0;RESTRICTED LEFT ENTRY-1;So;0;ON;;;;;N;;;;; +26E1;RESTRICTED LEFT ENTRY-2;So;0;ON;;;;;N;;;;; +26E3;HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE;So;0;ON;;;;;N;;;;; +26E8;BLACK CROSS ON SHIELD;So;0;ON;;;;;N;;;;; +26E9;SHINTO SHRINE;So;0;ON;;;;;N;;;;; +26EA;CHURCH;So;0;ON;;;;;N;;;;; +26EB;CASTLE;So;0;ON;;;;;N;;;;; +26EC;HISTORIC SITE;So;0;ON;;;;;N;;;;; +26ED;GEAR WITHOUT HUB;So;0;ON;;;;;N;;;;; +26EE;GEAR WITH HANDLES;So;0;ON;;;;;N;;;;; +26EF;MAP SYMBOL FOR LIGHTHOUSE;So;0;ON;;;;;N;;;;; +26F0;MOUNTAIN;So;0;ON;;;;;N;;;;; +26F1;UMBRELLA ON GROUND;So;0;ON;;;;;N;;;;; +26F2;FOUNTAIN;So;0;ON;;;;;N;;;;; +26F3;FLAG IN HOLE;So;0;ON;;;;;N;;;;; +26F4;FERRY;So;0;ON;;;;;N;;;;; +26F5;SAILBOAT;So;0;ON;;;;;N;;;;; +26F6;SQUARE FOUR CORNERS;So;0;ON;;;;;N;;;;; +26F7;SKIER;So;0;ON;;;;;N;;;;; +26F8;ICE SKATE;So;0;ON;;;;;N;;;;; +26F9;PERSON WITH BALL;So;0;ON;;;;;N;;;;; +26FA;TENT;So;0;ON;;;;;N;;;;; +26FB;JAPANESE BANK SYMBOL;So;0;ON;;;;;N;;;;; +26FC;HEADSTONE GRAVEYARD SYMBOL;So;0;ON;;;;;N;;;;; +26FD;FUEL PUMP;So;0;ON;;;;;N;;;;; +26FE;CUP ON BLACK SQUARE;So;0;ON;;;;;N;;;;; +26FF;WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE;So;0;ON;;;;;N;;;;; +2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;; +2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;; +2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;; +2704;WHITE SCISSORS;So;0;ON;;;;;N;;;;; +2706;TELEPHONE LOCATION SIGN;So;0;ON;;;;;N;;;;; +2707;TAPE DRIVE;So;0;ON;;;;;N;;;;; +2708;AIRPLANE;So;0;ON;;;;;N;;;;; +2709;ENVELOPE;So;0;ON;;;;;N;;;;; +270C;VICTORY HAND;So;0;ON;;;;;N;;;;; +270D;WRITING HAND;So;0;ON;;;;;N;;;;; +270E;LOWER RIGHT PENCIL;So;0;ON;;;;;N;;;;; +270F;PENCIL;So;0;ON;;;;;N;;;;; +2710;UPPER RIGHT PENCIL;So;0;ON;;;;;N;;;;; +2711;WHITE NIB;So;0;ON;;;;;N;;;;; +2712;BLACK NIB;So;0;ON;;;;;N;;;;; +2713;CHECK MARK;So;0;ON;;;;;N;;;;; +2714;HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; +2715;MULTIPLICATION X;So;0;ON;;;;;N;;;;; +2716;HEAVY MULTIPLICATION X;So;0;ON;;;;;N;;;;; +2717;BALLOT X;So;0;ON;;;;;N;;;;; +2718;HEAVY BALLOT X;So;0;ON;;;;;N;;;;; +2719;OUTLINED GREEK CROSS;So;0;ON;;;;;N;;;;; +271A;HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; +271B;OPEN CENTRE CROSS;So;0;ON;;;;;N;OPEN CENTER CROSS;;;; +271C;HEAVY OPEN CENTRE CROSS;So;0;ON;;;;;N;HEAVY OPEN CENTER CROSS;;;; +271D;LATIN CROSS;So;0;ON;;;;;N;;;;; +271E;SHADOWED WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; +271F;OUTLINED LATIN CROSS;So;0;ON;;;;;N;;;;; +2720;MALTESE CROSS;So;0;ON;;;;;N;;;;; +2721;STAR OF DAVID;So;0;ON;;;;;N;;;;; +2722;FOUR TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2723;FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2724;HEAVY FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2725;FOUR CLUB-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2726;BLACK FOUR POINTED STAR;So;0;ON;;;;;N;;;;; +2727;WHITE FOUR POINTED STAR;So;0;ON;;;;;N;;;;; +2729;STRESS OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; +272A;CIRCLED WHITE STAR;So;0;ON;;;;;N;;;;; +272B;OPEN CENTRE BLACK STAR;So;0;ON;;;;;N;OPEN CENTER BLACK STAR;;;; +272C;BLACK CENTRE WHITE STAR;So;0;ON;;;;;N;BLACK CENTER WHITE STAR;;;; +272D;OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; +272E;HEAVY OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; +272F;PINWHEEL STAR;So;0;ON;;;;;N;;;;; +2730;SHADOWED WHITE STAR;So;0;ON;;;;;N;;;;; +2731;HEAVY ASTERISK;So;0;ON;;;;;N;;;;; +2732;OPEN CENTRE ASTERISK;So;0;ON;;;;;N;OPEN CENTER ASTERISK;;;; +2733;EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2734;EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +2735;EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +2736;SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +2737;EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; +2738;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; +2739;TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +273A;SIXTEEN POINTED ASTERISK;So;0;ON;;;;;N;;;;; +273B;TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +273C;OPEN CENTRE TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;OPEN CENTER TEARDROP-SPOKED ASTERISK;;;; +273D;HEAVY TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +273E;SIX PETALLED BLACK AND WHITE FLORETTE;So;0;ON;;;;;N;;;;; +273F;BLACK FLORETTE;So;0;ON;;;;;N;;;;; +2740;WHITE FLORETTE;So;0;ON;;;;;N;;;;; +2741;EIGHT PETALLED OUTLINED BLACK FLORETTE;So;0;ON;;;;;N;;;;; +2742;CIRCLED OPEN CENTRE EIGHT POINTED STAR;So;0;ON;;;;;N;CIRCLED OPEN CENTER EIGHT POINTED STAR;;;; +2743;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK;So;0;ON;;;;;N;;;;; +2744;SNOWFLAKE;So;0;ON;;;;;N;;;;; +2745;TIGHT TRIFOLIATE SNOWFLAKE;So;0;ON;;;;;N;;;;; +2746;HEAVY CHEVRON SNOWFLAKE;So;0;ON;;;;;N;;;;; +2747;SPARKLE;So;0;ON;;;;;N;;;;; +2748;HEAVY SPARKLE;So;0;ON;;;;;N;;;;; +2749;BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +274A;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; +274B;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; +274D;SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; +274F;LOWER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2750;UPPER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2751;LOWER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2752;UPPER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2756;BLACK DIAMOND MINUS WHITE X;So;0;ON;;;;;N;;;;; +2757;HEAVY EXCLAMATION MARK SYMBOL;So;0;ON;;;;;N;;;;; +2758;LIGHT VERTICAL BAR;So;0;ON;;;;;N;;;;; +2759;MEDIUM VERTICAL BAR;So;0;ON;;;;;N;;;;; +275A;HEAVY VERTICAL BAR;So;0;ON;;;;;N;;;;; +275B;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275C;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275D;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275E;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2761;CURVED STEM PARAGRAPH SIGN ORNAMENT;So;0;ON;;;;;N;;;;; +2762;HEAVY EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2763;HEAVY HEART EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2764;HEAVY BLACK HEART;So;0;ON;;;;;N;;;;; +2765;ROTATED HEAVY BLACK HEART BULLET;So;0;ON;;;;;N;;;;; +2766;FLORAL HEART;So;0;ON;;;;;N;;;;; +2767;ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; +2768;MEDIUM LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2769;MEDIUM RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276A;MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276B;MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276C;MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276D;MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276E;HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276F;HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2770;HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2771;HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2772;LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2773;LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2774;MEDIUM LEFT CURLY BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2775;MEDIUM RIGHT CURLY BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2776;DINGBAT NEGATIVE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED DIGIT ONE;;;; +2777;DINGBAT NEGATIVE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED DIGIT TWO;;;; +2778;DINGBAT NEGATIVE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED DIGIT THREE;;;; +2779;DINGBAT NEGATIVE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED DIGIT FOUR;;;; +277A;DINGBAT NEGATIVE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED DIGIT FIVE;;;; +277B;DINGBAT NEGATIVE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED DIGIT SIX;;;; +277C;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED DIGIT SEVEN;;;; +277D;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED DIGIT EIGHT;;;; +277E;DINGBAT NEGATIVE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED DIGIT NINE;;;; +277F;DINGBAT NEGATIVE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED NUMBER TEN;;;; +2780;DINGBAT CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;CIRCLED SANS-SERIF DIGIT ONE;;;; +2781;DINGBAT CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;CIRCLED SANS-SERIF DIGIT TWO;;;; +2782;DINGBAT CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;CIRCLED SANS-SERIF DIGIT THREE;;;; +2783;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;CIRCLED SANS-SERIF DIGIT FOUR;;;; +2784;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;CIRCLED SANS-SERIF DIGIT FIVE;;;; +2785;DINGBAT CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;CIRCLED SANS-SERIF DIGIT SIX;;;; +2786;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;CIRCLED SANS-SERIF DIGIT SEVEN;;;; +2787;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;CIRCLED SANS-SERIF DIGIT EIGHT;;;; +2788;DINGBAT CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;CIRCLED SANS-SERIF DIGIT NINE;;;; +2789;DINGBAT CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;CIRCLED SANS-SERIF NUMBER TEN;;;; +278A;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED SANS-SERIF DIGIT ONE;;;; +278B;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED SANS-SERIF DIGIT TWO;;;; +278C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED SANS-SERIF DIGIT THREE;;;; +278D;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED SANS-SERIF DIGIT FOUR;;;; +278E;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED SANS-SERIF DIGIT FIVE;;;; +278F;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED SANS-SERIF DIGIT SIX;;;; +2790;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED SANS-SERIF DIGIT SEVEN;;;; +2791;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED SANS-SERIF DIGIT EIGHT;;;; +2792;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED SANS-SERIF DIGIT NINE;;;; +2793;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED SANS-SERIF NUMBER TEN;;;; +2794;HEAVY WIDE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WIDE-HEADED RIGHT ARROW;;;; +2798;HEAVY SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT ARROW;;;; +2799;HEAVY RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY RIGHT ARROW;;;; +279A;HEAVY NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT ARROW;;;; +279B;DRAFTING POINT RIGHTWARDS ARROW;So;0;ON;;;;;N;DRAFTING POINT RIGHT ARROW;;;; +279C;HEAVY ROUND-TIPPED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY ROUND-TIPPED RIGHT ARROW;;;; +279D;TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;TRIANGLE-HEADED RIGHT ARROW;;;; +279E;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TRIANGLE-HEADED RIGHT ARROW;;;; +279F;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;DASHED TRIANGLE-HEADED RIGHT ARROW;;;; +27A0;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW;;;; +27A1;BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK RIGHT ARROW;;;; +27A2;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D TOP-LIGHTED RIGHT ARROWHEAD;;;; +27A3;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD;;;; +27A4;BLACK RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;BLACK RIGHT ARROWHEAD;;;; +27A5;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED DOWN AND RIGHT ARROW;;;; +27A6;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED UP AND RIGHT ARROW;;;; +27A7;SQUAT BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;SQUAT BLACK RIGHT ARROW;;;; +27A8;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY CONCAVE-POINTED BLACK RIGHT ARROW;;;; +27A9;RIGHT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;RIGHT-SHADED WHITE RIGHT ARROW;;;; +27AA;LEFT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT-SHADED WHITE RIGHT ARROW;;;; +27AB;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;BACK-TILTED SHADOWED WHITE RIGHT ARROW;;;; +27AC;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;FRONT-TILTED SHADOWED WHITE RIGHT ARROW;;;; +27AD;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27AE;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27AF;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27B1;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27B2;CIRCLED HEAVY WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;CIRCLED HEAVY WHITE RIGHT ARROW;;;; +27B3;WHITE-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;WHITE-FEATHERED RIGHT ARROW;;;; +27B4;BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED LOWER RIGHT ARROW;;;; +27B5;BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK-FEATHERED RIGHT ARROW;;;; +27B6;BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED UPPER RIGHT ARROW;;;; +27B7;HEAVY BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED LOWER RIGHT ARROW;;;; +27B8;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED RIGHT ARROW;;;; +27B9;HEAVY BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED UPPER RIGHT ARROW;;;; +27BA;TEARDROP-BARBED RIGHTWARDS ARROW;So;0;ON;;;;;N;TEARDROP-BARBED RIGHT ARROW;;;; +27BB;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TEARDROP-SHANKED RIGHT ARROW;;;; +27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;; +27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;; +27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;; +27C0;THREE DIMENSIONAL ANGLE;Sm;0;ON;;;;;Y;;;;; +27C1;WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE;Sm;0;ON;;;;;N;;;;; +27C2;PERPENDICULAR;Sm;0;ON;;;;;N;;;;; +27C3;OPEN SUBSET;Sm;0;ON;;;;;Y;;;;; +27C4;OPEN SUPERSET;Sm;0;ON;;;;;Y;;;;; +27C5;LEFT S-SHAPED BAG DELIMITER;Ps;0;ON;;;;;Y;;;;; +27C6;RIGHT S-SHAPED BAG DELIMITER;Pe;0;ON;;;;;Y;;;;; +27C7;OR WITH DOT INSIDE;Sm;0;ON;;;;;N;;;;; +27C8;REVERSE SOLIDUS PRECEDING SUBSET;Sm;0;ON;;;;;Y;;;;; +27C9;SUPERSET PRECEDING SOLIDUS;Sm;0;ON;;;;;Y;;;;; +27CA;VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +27CC;LONG DIVISION;Sm;0;ON;;;;;Y;;;;; +27D0;WHITE DIAMOND WITH CENTRED DOT;Sm;0;ON;;;;;N;;;;; +27D1;AND WITH DOT;Sm;0;ON;;;;;N;;;;; +27D2;ELEMENT OF OPENING UPWARDS;Sm;0;ON;;;;;N;;;;; +27D3;LOWER RIGHT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;; +27D4;UPPER LEFT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;; +27D5;LEFT OUTER JOIN;Sm;0;ON;;;;;Y;;;;; +27D6;RIGHT OUTER JOIN;Sm;0;ON;;;;;Y;;;;; +27D7;FULL OUTER JOIN;Sm;0;ON;;;;;N;;;;; +27D8;LARGE UP TACK;Sm;0;ON;;;;;N;;;;; +27D9;LARGE DOWN TACK;Sm;0;ON;;;;;N;;;;; +27DA;LEFT AND RIGHT DOUBLE TURNSTILE;Sm;0;ON;;;;;N;;;;; +27DB;LEFT AND RIGHT TACK;Sm;0;ON;;;;;N;;;;; +27DC;LEFT MULTIMAP;Sm;0;ON;;;;;Y;;;;; +27DD;LONG RIGHT TACK;Sm;0;ON;;;;;Y;;;;; +27DE;LONG LEFT TACK;Sm;0;ON;;;;;Y;;;;; +27DF;UP TACK WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +27E0;LOZENGE DIVIDED BY HORIZONTAL RULE;Sm;0;ON;;;;;N;;;;; +27E1;WHITE CONCAVE-SIDED DIAMOND;Sm;0;ON;;;;;N;;;;; +27E2;WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E3;WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E4;WHITE SQUARE WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E5;WHITE SQUARE WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E6;MATHEMATICAL LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;;;;; +27E7;MATHEMATICAL RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;;;;; +27E8;MATHEMATICAL LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +27E9;MATHEMATICAL RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +27EA;MATHEMATICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +27EB;MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +27EC;MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; +27ED;MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; +27EE;MATHEMATICAL LEFT FLATTENED PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +27EF;MATHEMATICAL RIGHT FLATTENED PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +27F0;UPWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; +27F1;DOWNWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; +27F2;ANTICLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +27F3;CLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +27F4;RIGHT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +27F5;LONG LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +27F6;LONG RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +27F7;LONG LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; +27F8;LONG LEFTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27F9;LONG RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27FA;LONG LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27FB;LONG LEFTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FC;LONG RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FD;LONG LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FE;LONG RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FF;LONG RIGHTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; +2800;BRAILLE PATTERN BLANK;So;0;L;;;;;N;;;;; +2801;BRAILLE PATTERN DOTS-1;So;0;L;;;;;N;;;;; +2802;BRAILLE PATTERN DOTS-2;So;0;L;;;;;N;;;;; +2803;BRAILLE PATTERN DOTS-12;So;0;L;;;;;N;;;;; +2804;BRAILLE PATTERN DOTS-3;So;0;L;;;;;N;;;;; +2805;BRAILLE PATTERN DOTS-13;So;0;L;;;;;N;;;;; +2806;BRAILLE PATTERN DOTS-23;So;0;L;;;;;N;;;;; +2807;BRAILLE PATTERN DOTS-123;So;0;L;;;;;N;;;;; +2808;BRAILLE PATTERN DOTS-4;So;0;L;;;;;N;;;;; +2809;BRAILLE PATTERN DOTS-14;So;0;L;;;;;N;;;;; +280A;BRAILLE PATTERN DOTS-24;So;0;L;;;;;N;;;;; +280B;BRAILLE PATTERN DOTS-124;So;0;L;;;;;N;;;;; +280C;BRAILLE PATTERN DOTS-34;So;0;L;;;;;N;;;;; +280D;BRAILLE PATTERN DOTS-134;So;0;L;;;;;N;;;;; +280E;BRAILLE PATTERN DOTS-234;So;0;L;;;;;N;;;;; +280F;BRAILLE PATTERN DOTS-1234;So;0;L;;;;;N;;;;; +2810;BRAILLE PATTERN DOTS-5;So;0;L;;;;;N;;;;; +2811;BRAILLE PATTERN DOTS-15;So;0;L;;;;;N;;;;; +2812;BRAILLE PATTERN DOTS-25;So;0;L;;;;;N;;;;; +2813;BRAILLE PATTERN DOTS-125;So;0;L;;;;;N;;;;; +2814;BRAILLE PATTERN DOTS-35;So;0;L;;;;;N;;;;; +2815;BRAILLE PATTERN DOTS-135;So;0;L;;;;;N;;;;; +2816;BRAILLE PATTERN DOTS-235;So;0;L;;;;;N;;;;; +2817;BRAILLE PATTERN DOTS-1235;So;0;L;;;;;N;;;;; +2818;BRAILLE PATTERN DOTS-45;So;0;L;;;;;N;;;;; +2819;BRAILLE PATTERN DOTS-145;So;0;L;;;;;N;;;;; +281A;BRAILLE PATTERN DOTS-245;So;0;L;;;;;N;;;;; +281B;BRAILLE PATTERN DOTS-1245;So;0;L;;;;;N;;;;; +281C;BRAILLE PATTERN DOTS-345;So;0;L;;;;;N;;;;; +281D;BRAILLE PATTERN DOTS-1345;So;0;L;;;;;N;;;;; +281E;BRAILLE PATTERN DOTS-2345;So;0;L;;;;;N;;;;; +281F;BRAILLE PATTERN DOTS-12345;So;0;L;;;;;N;;;;; +2820;BRAILLE PATTERN DOTS-6;So;0;L;;;;;N;;;;; +2821;BRAILLE PATTERN DOTS-16;So;0;L;;;;;N;;;;; +2822;BRAILLE PATTERN DOTS-26;So;0;L;;;;;N;;;;; +2823;BRAILLE PATTERN DOTS-126;So;0;L;;;;;N;;;;; +2824;BRAILLE PATTERN DOTS-36;So;0;L;;;;;N;;;;; +2825;BRAILLE PATTERN DOTS-136;So;0;L;;;;;N;;;;; +2826;BRAILLE PATTERN DOTS-236;So;0;L;;;;;N;;;;; +2827;BRAILLE PATTERN DOTS-1236;So;0;L;;;;;N;;;;; +2828;BRAILLE PATTERN DOTS-46;So;0;L;;;;;N;;;;; +2829;BRAILLE PATTERN DOTS-146;So;0;L;;;;;N;;;;; +282A;BRAILLE PATTERN DOTS-246;So;0;L;;;;;N;;;;; +282B;BRAILLE PATTERN DOTS-1246;So;0;L;;;;;N;;;;; +282C;BRAILLE PATTERN DOTS-346;So;0;L;;;;;N;;;;; +282D;BRAILLE PATTERN DOTS-1346;So;0;L;;;;;N;;;;; +282E;BRAILLE PATTERN DOTS-2346;So;0;L;;;;;N;;;;; +282F;BRAILLE PATTERN DOTS-12346;So;0;L;;;;;N;;;;; +2830;BRAILLE PATTERN DOTS-56;So;0;L;;;;;N;;;;; +2831;BRAILLE PATTERN DOTS-156;So;0;L;;;;;N;;;;; +2832;BRAILLE PATTERN DOTS-256;So;0;L;;;;;N;;;;; +2833;BRAILLE PATTERN DOTS-1256;So;0;L;;;;;N;;;;; +2834;BRAILLE PATTERN DOTS-356;So;0;L;;;;;N;;;;; +2835;BRAILLE PATTERN DOTS-1356;So;0;L;;;;;N;;;;; +2836;BRAILLE PATTERN DOTS-2356;So;0;L;;;;;N;;;;; +2837;BRAILLE PATTERN DOTS-12356;So;0;L;;;;;N;;;;; +2838;BRAILLE PATTERN DOTS-456;So;0;L;;;;;N;;;;; +2839;BRAILLE PATTERN DOTS-1456;So;0;L;;;;;N;;;;; +283A;BRAILLE PATTERN DOTS-2456;So;0;L;;;;;N;;;;; +283B;BRAILLE PATTERN DOTS-12456;So;0;L;;;;;N;;;;; +283C;BRAILLE PATTERN DOTS-3456;So;0;L;;;;;N;;;;; +283D;BRAILLE PATTERN DOTS-13456;So;0;L;;;;;N;;;;; +283E;BRAILLE PATTERN DOTS-23456;So;0;L;;;;;N;;;;; +283F;BRAILLE PATTERN DOTS-123456;So;0;L;;;;;N;;;;; +2840;BRAILLE PATTERN DOTS-7;So;0;L;;;;;N;;;;; +2841;BRAILLE PATTERN DOTS-17;So;0;L;;;;;N;;;;; +2842;BRAILLE PATTERN DOTS-27;So;0;L;;;;;N;;;;; +2843;BRAILLE PATTERN DOTS-127;So;0;L;;;;;N;;;;; +2844;BRAILLE PATTERN DOTS-37;So;0;L;;;;;N;;;;; +2845;BRAILLE PATTERN DOTS-137;So;0;L;;;;;N;;;;; +2846;BRAILLE PATTERN DOTS-237;So;0;L;;;;;N;;;;; +2847;BRAILLE PATTERN DOTS-1237;So;0;L;;;;;N;;;;; +2848;BRAILLE PATTERN DOTS-47;So;0;L;;;;;N;;;;; +2849;BRAILLE PATTERN DOTS-147;So;0;L;;;;;N;;;;; +284A;BRAILLE PATTERN DOTS-247;So;0;L;;;;;N;;;;; +284B;BRAILLE PATTERN DOTS-1247;So;0;L;;;;;N;;;;; +284C;BRAILLE PATTERN DOTS-347;So;0;L;;;;;N;;;;; +284D;BRAILLE PATTERN DOTS-1347;So;0;L;;;;;N;;;;; +284E;BRAILLE PATTERN DOTS-2347;So;0;L;;;;;N;;;;; +284F;BRAILLE PATTERN DOTS-12347;So;0;L;;;;;N;;;;; +2850;BRAILLE PATTERN DOTS-57;So;0;L;;;;;N;;;;; +2851;BRAILLE PATTERN DOTS-157;So;0;L;;;;;N;;;;; +2852;BRAILLE PATTERN DOTS-257;So;0;L;;;;;N;;;;; +2853;BRAILLE PATTERN DOTS-1257;So;0;L;;;;;N;;;;; +2854;BRAILLE PATTERN DOTS-357;So;0;L;;;;;N;;;;; +2855;BRAILLE PATTERN DOTS-1357;So;0;L;;;;;N;;;;; +2856;BRAILLE PATTERN DOTS-2357;So;0;L;;;;;N;;;;; +2857;BRAILLE PATTERN DOTS-12357;So;0;L;;;;;N;;;;; +2858;BRAILLE PATTERN DOTS-457;So;0;L;;;;;N;;;;; +2859;BRAILLE PATTERN DOTS-1457;So;0;L;;;;;N;;;;; +285A;BRAILLE PATTERN DOTS-2457;So;0;L;;;;;N;;;;; +285B;BRAILLE PATTERN DOTS-12457;So;0;L;;;;;N;;;;; +285C;BRAILLE PATTERN DOTS-3457;So;0;L;;;;;N;;;;; +285D;BRAILLE PATTERN DOTS-13457;So;0;L;;;;;N;;;;; +285E;BRAILLE PATTERN DOTS-23457;So;0;L;;;;;N;;;;; +285F;BRAILLE PATTERN DOTS-123457;So;0;L;;;;;N;;;;; +2860;BRAILLE PATTERN DOTS-67;So;0;L;;;;;N;;;;; +2861;BRAILLE PATTERN DOTS-167;So;0;L;;;;;N;;;;; +2862;BRAILLE PATTERN DOTS-267;So;0;L;;;;;N;;;;; +2863;BRAILLE PATTERN DOTS-1267;So;0;L;;;;;N;;;;; +2864;BRAILLE PATTERN DOTS-367;So;0;L;;;;;N;;;;; +2865;BRAILLE PATTERN DOTS-1367;So;0;L;;;;;N;;;;; +2866;BRAILLE PATTERN DOTS-2367;So;0;L;;;;;N;;;;; +2867;BRAILLE PATTERN DOTS-12367;So;0;L;;;;;N;;;;; +2868;BRAILLE PATTERN DOTS-467;So;0;L;;;;;N;;;;; +2869;BRAILLE PATTERN DOTS-1467;So;0;L;;;;;N;;;;; +286A;BRAILLE PATTERN DOTS-2467;So;0;L;;;;;N;;;;; +286B;BRAILLE PATTERN DOTS-12467;So;0;L;;;;;N;;;;; +286C;BRAILLE PATTERN DOTS-3467;So;0;L;;;;;N;;;;; +286D;BRAILLE PATTERN DOTS-13467;So;0;L;;;;;N;;;;; +286E;BRAILLE PATTERN DOTS-23467;So;0;L;;;;;N;;;;; +286F;BRAILLE PATTERN DOTS-123467;So;0;L;;;;;N;;;;; +2870;BRAILLE PATTERN DOTS-567;So;0;L;;;;;N;;;;; +2871;BRAILLE PATTERN DOTS-1567;So;0;L;;;;;N;;;;; +2872;BRAILLE PATTERN DOTS-2567;So;0;L;;;;;N;;;;; +2873;BRAILLE PATTERN DOTS-12567;So;0;L;;;;;N;;;;; +2874;BRAILLE PATTERN DOTS-3567;So;0;L;;;;;N;;;;; +2875;BRAILLE PATTERN DOTS-13567;So;0;L;;;;;N;;;;; +2876;BRAILLE PATTERN DOTS-23567;So;0;L;;;;;N;;;;; +2877;BRAILLE PATTERN DOTS-123567;So;0;L;;;;;N;;;;; +2878;BRAILLE PATTERN DOTS-4567;So;0;L;;;;;N;;;;; +2879;BRAILLE PATTERN DOTS-14567;So;0;L;;;;;N;;;;; +287A;BRAILLE PATTERN DOTS-24567;So;0;L;;;;;N;;;;; +287B;BRAILLE PATTERN DOTS-124567;So;0;L;;;;;N;;;;; +287C;BRAILLE PATTERN DOTS-34567;So;0;L;;;;;N;;;;; +287D;BRAILLE PATTERN DOTS-134567;So;0;L;;;;;N;;;;; +287E;BRAILLE PATTERN DOTS-234567;So;0;L;;;;;N;;;;; +287F;BRAILLE PATTERN DOTS-1234567;So;0;L;;;;;N;;;;; +2880;BRAILLE PATTERN DOTS-8;So;0;L;;;;;N;;;;; +2881;BRAILLE PATTERN DOTS-18;So;0;L;;;;;N;;;;; +2882;BRAILLE PATTERN DOTS-28;So;0;L;;;;;N;;;;; +2883;BRAILLE PATTERN DOTS-128;So;0;L;;;;;N;;;;; +2884;BRAILLE PATTERN DOTS-38;So;0;L;;;;;N;;;;; +2885;BRAILLE PATTERN DOTS-138;So;0;L;;;;;N;;;;; +2886;BRAILLE PATTERN DOTS-238;So;0;L;;;;;N;;;;; +2887;BRAILLE PATTERN DOTS-1238;So;0;L;;;;;N;;;;; +2888;BRAILLE PATTERN DOTS-48;So;0;L;;;;;N;;;;; +2889;BRAILLE PATTERN DOTS-148;So;0;L;;;;;N;;;;; +288A;BRAILLE PATTERN DOTS-248;So;0;L;;;;;N;;;;; +288B;BRAILLE PATTERN DOTS-1248;So;0;L;;;;;N;;;;; +288C;BRAILLE PATTERN DOTS-348;So;0;L;;;;;N;;;;; +288D;BRAILLE PATTERN DOTS-1348;So;0;L;;;;;N;;;;; +288E;BRAILLE PATTERN DOTS-2348;So;0;L;;;;;N;;;;; +288F;BRAILLE PATTERN DOTS-12348;So;0;L;;;;;N;;;;; +2890;BRAILLE PATTERN DOTS-58;So;0;L;;;;;N;;;;; +2891;BRAILLE PATTERN DOTS-158;So;0;L;;;;;N;;;;; +2892;BRAILLE PATTERN DOTS-258;So;0;L;;;;;N;;;;; +2893;BRAILLE PATTERN DOTS-1258;So;0;L;;;;;N;;;;; +2894;BRAILLE PATTERN DOTS-358;So;0;L;;;;;N;;;;; +2895;BRAILLE PATTERN DOTS-1358;So;0;L;;;;;N;;;;; +2896;BRAILLE PATTERN DOTS-2358;So;0;L;;;;;N;;;;; +2897;BRAILLE PATTERN DOTS-12358;So;0;L;;;;;N;;;;; +2898;BRAILLE PATTERN DOTS-458;So;0;L;;;;;N;;;;; +2899;BRAILLE PATTERN DOTS-1458;So;0;L;;;;;N;;;;; +289A;BRAILLE PATTERN DOTS-2458;So;0;L;;;;;N;;;;; +289B;BRAILLE PATTERN DOTS-12458;So;0;L;;;;;N;;;;; +289C;BRAILLE PATTERN DOTS-3458;So;0;L;;;;;N;;;;; +289D;BRAILLE PATTERN DOTS-13458;So;0;L;;;;;N;;;;; +289E;BRAILLE PATTERN DOTS-23458;So;0;L;;;;;N;;;;; +289F;BRAILLE PATTERN DOTS-123458;So;0;L;;;;;N;;;;; +28A0;BRAILLE PATTERN DOTS-68;So;0;L;;;;;N;;;;; +28A1;BRAILLE PATTERN DOTS-168;So;0;L;;;;;N;;;;; +28A2;BRAILLE PATTERN DOTS-268;So;0;L;;;;;N;;;;; +28A3;BRAILLE PATTERN DOTS-1268;So;0;L;;;;;N;;;;; +28A4;BRAILLE PATTERN DOTS-368;So;0;L;;;;;N;;;;; +28A5;BRAILLE PATTERN DOTS-1368;So;0;L;;;;;N;;;;; +28A6;BRAILLE PATTERN DOTS-2368;So;0;L;;;;;N;;;;; +28A7;BRAILLE PATTERN DOTS-12368;So;0;L;;;;;N;;;;; +28A8;BRAILLE PATTERN DOTS-468;So;0;L;;;;;N;;;;; +28A9;BRAILLE PATTERN DOTS-1468;So;0;L;;;;;N;;;;; +28AA;BRAILLE PATTERN DOTS-2468;So;0;L;;;;;N;;;;; +28AB;BRAILLE PATTERN DOTS-12468;So;0;L;;;;;N;;;;; +28AC;BRAILLE PATTERN DOTS-3468;So;0;L;;;;;N;;;;; +28AD;BRAILLE PATTERN DOTS-13468;So;0;L;;;;;N;;;;; +28AE;BRAILLE PATTERN DOTS-23468;So;0;L;;;;;N;;;;; +28AF;BRAILLE PATTERN DOTS-123468;So;0;L;;;;;N;;;;; +28B0;BRAILLE PATTERN DOTS-568;So;0;L;;;;;N;;;;; +28B1;BRAILLE PATTERN DOTS-1568;So;0;L;;;;;N;;;;; +28B2;BRAILLE PATTERN DOTS-2568;So;0;L;;;;;N;;;;; +28B3;BRAILLE PATTERN DOTS-12568;So;0;L;;;;;N;;;;; +28B4;BRAILLE PATTERN DOTS-3568;So;0;L;;;;;N;;;;; +28B5;BRAILLE PATTERN DOTS-13568;So;0;L;;;;;N;;;;; +28B6;BRAILLE PATTERN DOTS-23568;So;0;L;;;;;N;;;;; +28B7;BRAILLE PATTERN DOTS-123568;So;0;L;;;;;N;;;;; +28B8;BRAILLE PATTERN DOTS-4568;So;0;L;;;;;N;;;;; +28B9;BRAILLE PATTERN DOTS-14568;So;0;L;;;;;N;;;;; +28BA;BRAILLE PATTERN DOTS-24568;So;0;L;;;;;N;;;;; +28BB;BRAILLE PATTERN DOTS-124568;So;0;L;;;;;N;;;;; +28BC;BRAILLE PATTERN DOTS-34568;So;0;L;;;;;N;;;;; +28BD;BRAILLE PATTERN DOTS-134568;So;0;L;;;;;N;;;;; +28BE;BRAILLE PATTERN DOTS-234568;So;0;L;;;;;N;;;;; +28BF;BRAILLE PATTERN DOTS-1234568;So;0;L;;;;;N;;;;; +28C0;BRAILLE PATTERN DOTS-78;So;0;L;;;;;N;;;;; +28C1;BRAILLE PATTERN DOTS-178;So;0;L;;;;;N;;;;; +28C2;BRAILLE PATTERN DOTS-278;So;0;L;;;;;N;;;;; +28C3;BRAILLE PATTERN DOTS-1278;So;0;L;;;;;N;;;;; +28C4;BRAILLE PATTERN DOTS-378;So;0;L;;;;;N;;;;; +28C5;BRAILLE PATTERN DOTS-1378;So;0;L;;;;;N;;;;; +28C6;BRAILLE PATTERN DOTS-2378;So;0;L;;;;;N;;;;; +28C7;BRAILLE PATTERN DOTS-12378;So;0;L;;;;;N;;;;; +28C8;BRAILLE PATTERN DOTS-478;So;0;L;;;;;N;;;;; +28C9;BRAILLE PATTERN DOTS-1478;So;0;L;;;;;N;;;;; +28CA;BRAILLE PATTERN DOTS-2478;So;0;L;;;;;N;;;;; +28CB;BRAILLE PATTERN DOTS-12478;So;0;L;;;;;N;;;;; +28CC;BRAILLE PATTERN DOTS-3478;So;0;L;;;;;N;;;;; +28CD;BRAILLE PATTERN DOTS-13478;So;0;L;;;;;N;;;;; +28CE;BRAILLE PATTERN DOTS-23478;So;0;L;;;;;N;;;;; +28CF;BRAILLE PATTERN DOTS-123478;So;0;L;;;;;N;;;;; +28D0;BRAILLE PATTERN DOTS-578;So;0;L;;;;;N;;;;; +28D1;BRAILLE PATTERN DOTS-1578;So;0;L;;;;;N;;;;; +28D2;BRAILLE PATTERN DOTS-2578;So;0;L;;;;;N;;;;; +28D3;BRAILLE PATTERN DOTS-12578;So;0;L;;;;;N;;;;; +28D4;BRAILLE PATTERN DOTS-3578;So;0;L;;;;;N;;;;; +28D5;BRAILLE PATTERN DOTS-13578;So;0;L;;;;;N;;;;; +28D6;BRAILLE PATTERN DOTS-23578;So;0;L;;;;;N;;;;; +28D7;BRAILLE PATTERN DOTS-123578;So;0;L;;;;;N;;;;; +28D8;BRAILLE PATTERN DOTS-4578;So;0;L;;;;;N;;;;; +28D9;BRAILLE PATTERN DOTS-14578;So;0;L;;;;;N;;;;; +28DA;BRAILLE PATTERN DOTS-24578;So;0;L;;;;;N;;;;; +28DB;BRAILLE PATTERN DOTS-124578;So;0;L;;;;;N;;;;; +28DC;BRAILLE PATTERN DOTS-34578;So;0;L;;;;;N;;;;; +28DD;BRAILLE PATTERN DOTS-134578;So;0;L;;;;;N;;;;; +28DE;BRAILLE PATTERN DOTS-234578;So;0;L;;;;;N;;;;; +28DF;BRAILLE PATTERN DOTS-1234578;So;0;L;;;;;N;;;;; +28E0;BRAILLE PATTERN DOTS-678;So;0;L;;;;;N;;;;; +28E1;BRAILLE PATTERN DOTS-1678;So;0;L;;;;;N;;;;; +28E2;BRAILLE PATTERN DOTS-2678;So;0;L;;;;;N;;;;; +28E3;BRAILLE PATTERN DOTS-12678;So;0;L;;;;;N;;;;; +28E4;BRAILLE PATTERN DOTS-3678;So;0;L;;;;;N;;;;; +28E5;BRAILLE PATTERN DOTS-13678;So;0;L;;;;;N;;;;; +28E6;BRAILLE PATTERN DOTS-23678;So;0;L;;;;;N;;;;; +28E7;BRAILLE PATTERN DOTS-123678;So;0;L;;;;;N;;;;; +28E8;BRAILLE PATTERN DOTS-4678;So;0;L;;;;;N;;;;; +28E9;BRAILLE PATTERN DOTS-14678;So;0;L;;;;;N;;;;; +28EA;BRAILLE PATTERN DOTS-24678;So;0;L;;;;;N;;;;; +28EB;BRAILLE PATTERN DOTS-124678;So;0;L;;;;;N;;;;; +28EC;BRAILLE PATTERN DOTS-34678;So;0;L;;;;;N;;;;; +28ED;BRAILLE PATTERN DOTS-134678;So;0;L;;;;;N;;;;; +28EE;BRAILLE PATTERN DOTS-234678;So;0;L;;;;;N;;;;; +28EF;BRAILLE PATTERN DOTS-1234678;So;0;L;;;;;N;;;;; +28F0;BRAILLE PATTERN DOTS-5678;So;0;L;;;;;N;;;;; +28F1;BRAILLE PATTERN DOTS-15678;So;0;L;;;;;N;;;;; +28F2;BRAILLE PATTERN DOTS-25678;So;0;L;;;;;N;;;;; +28F3;BRAILLE PATTERN DOTS-125678;So;0;L;;;;;N;;;;; +28F4;BRAILLE PATTERN DOTS-35678;So;0;L;;;;;N;;;;; +28F5;BRAILLE PATTERN DOTS-135678;So;0;L;;;;;N;;;;; +28F6;BRAILLE PATTERN DOTS-235678;So;0;L;;;;;N;;;;; +28F7;BRAILLE PATTERN DOTS-1235678;So;0;L;;;;;N;;;;; +28F8;BRAILLE PATTERN DOTS-45678;So;0;L;;;;;N;;;;; +28F9;BRAILLE PATTERN DOTS-145678;So;0;L;;;;;N;;;;; +28FA;BRAILLE PATTERN DOTS-245678;So;0;L;;;;;N;;;;; +28FB;BRAILLE PATTERN DOTS-1245678;So;0;L;;;;;N;;;;; +28FC;BRAILLE PATTERN DOTS-345678;So;0;L;;;;;N;;;;; +28FD;BRAILLE PATTERN DOTS-1345678;So;0;L;;;;;N;;;;; +28FE;BRAILLE PATTERN DOTS-2345678;So;0;L;;;;;N;;;;; +28FF;BRAILLE PATTERN DOTS-12345678;So;0;L;;;;;N;;;;; +2900;RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2901;RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2902;LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2903;RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2904;LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2905;RIGHTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2906;LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2907;RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2908;DOWNWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2909;UPWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +290A;UPWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;; +290B;DOWNWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;; +290C;LEFTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290D;RIGHTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290E;LEFTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290F;RIGHTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2910;RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2911;RIGHTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; +2912;UPWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;; +2913;DOWNWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;; +2914;RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2915;RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2916;RIGHTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; +2917;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2918;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2919;LEFTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291A;RIGHTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291B;LEFTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291C;RIGHTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291D;LEFTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +291E;RIGHTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +291F;LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +2920;RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +2921;NORTH WEST AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2922;NORTH EAST AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +2923;NORTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2924;NORTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2925;SOUTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2926;SOUTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2927;NORTH WEST ARROW AND NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2928;NORTH EAST ARROW AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2929;SOUTH EAST ARROW AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +292A;SOUTH WEST ARROW AND NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +292B;RISING DIAGONAL CROSSING FALLING DIAGONAL;Sm;0;ON;;;;;N;;;;; +292C;FALLING DIAGONAL CROSSING RISING DIAGONAL;Sm;0;ON;;;;;N;;;;; +292D;SOUTH EAST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +292E;NORTH EAST ARROW CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +292F;FALLING DIAGONAL CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2930;RISING DIAGONAL CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2931;NORTH EAST ARROW CROSSING NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +2932;NORTH WEST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2933;WAVE ARROW POINTING DIRECTLY RIGHT;Sm;0;ON;;;;;N;;;;; +2934;ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS;Sm;0;ON;;;;;N;;;;; +2935;ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS;Sm;0;ON;;;;;N;;;;; +2936;ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS;Sm;0;ON;;;;;N;;;;; +2937;ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS;Sm;0;ON;;;;;N;;;;; +2938;RIGHT-SIDE ARC CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +2939;LEFT-SIDE ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293A;TOP ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293B;BOTTOM ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293C;TOP ARC CLOCKWISE ARROW WITH MINUS;Sm;0;ON;;;;;N;;;;; +293D;TOP ARC ANTICLOCKWISE ARROW WITH PLUS;Sm;0;ON;;;;;N;;;;; +293E;LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293F;LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +2940;ANTICLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +2941;CLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +2942;RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2943;LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2944;SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2945;RIGHTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;; +2946;LEFTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;; +2947;RIGHTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; +2948;LEFT RIGHT ARROW THROUGH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +2949;UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +294A;LEFT BARB UP RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;; +294B;LEFT BARB DOWN RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;; +294C;UP BARB RIGHT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;; +294D;UP BARB LEFT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;; +294E;LEFT BARB UP RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;; +294F;UP BARB RIGHT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;; +2950;LEFT BARB DOWN RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;; +2951;UP BARB LEFT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;; +2952;LEFTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;; +2953;RIGHTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;; +2954;UPWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;; +2955;DOWNWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;; +2956;LEFTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;; +2957;RIGHTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;; +2958;UPWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;; +2959;DOWNWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;; +295A;LEFTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;; +295B;RIGHTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;; +295C;UPWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;; +295D;DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;; +295E;LEFTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;; +295F;RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;; +2960;UPWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;; +2961;DOWNWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;; +2962;LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2963;UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2964;RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2965;DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2966;LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;; +2967;LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2968;RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;; +2969;RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +296A;LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;; +296B;LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;; +296C;RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;; +296D;RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;; +296E;UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +296F;DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2970;RIGHT DOUBLE ARROW WITH ROUNDED HEAD;Sm;0;ON;;;;;N;;;;; +2971;EQUALS SIGN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2972;TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2973;LEFTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2974;RIGHTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2975;RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2976;LESS-THAN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2977;LEFTWARDS ARROW THROUGH LESS-THAN;Sm;0;ON;;;;;N;;;;; +2978;GREATER-THAN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2979;SUBSET ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +297A;LEFTWARDS ARROW THROUGH SUBSET;Sm;0;ON;;;;;N;;;;; +297B;SUPERSET ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +297C;LEFT FISH TAIL;Sm;0;ON;;;;;N;;;;; +297D;RIGHT FISH TAIL;Sm;0;ON;;;;;N;;;;; +297E;UP FISH TAIL;Sm;0;ON;;;;;N;;;;; +297F;DOWN FISH TAIL;Sm;0;ON;;;;;N;;;;; +2980;TRIPLE VERTICAL BAR DELIMITER;Sm;0;ON;;;;;N;;;;; +2981;Z NOTATION SPOT;Sm;0;ON;;;;;N;;;;; +2982;Z NOTATION TYPE COLON;Sm;0;ON;;;;;N;;;;; +2983;LEFT WHITE CURLY BRACKET;Ps;0;ON;;;;;Y;;;;; +2984;RIGHT WHITE CURLY BRACKET;Pe;0;ON;;;;;Y;;;;; +2985;LEFT WHITE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2986;RIGHT WHITE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2987;Z NOTATION LEFT IMAGE BRACKET;Ps;0;ON;;;;;Y;;;;; +2988;Z NOTATION RIGHT IMAGE BRACKET;Pe;0;ON;;;;;Y;;;;; +2989;Z NOTATION LEFT BINDING BRACKET;Ps;0;ON;;;;;Y;;;;; +298A;Z NOTATION RIGHT BINDING BRACKET;Pe;0;ON;;;;;Y;;;;; +298B;LEFT SQUARE BRACKET WITH UNDERBAR;Ps;0;ON;;;;;Y;;;;; +298C;RIGHT SQUARE BRACKET WITH UNDERBAR;Pe;0;ON;;;;;Y;;;;; +298D;LEFT SQUARE BRACKET WITH TICK IN TOP CORNER;Ps;0;ON;;;;;Y;;;;; +298E;RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Pe;0;ON;;;;;Y;;;;; +298F;LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Ps;0;ON;;;;;Y;;;;; +2990;RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER;Pe;0;ON;;;;;Y;;;;; +2991;LEFT ANGLE BRACKET WITH DOT;Ps;0;ON;;;;;Y;;;;; +2992;RIGHT ANGLE BRACKET WITH DOT;Pe;0;ON;;;;;Y;;;;; +2993;LEFT ARC LESS-THAN BRACKET;Ps;0;ON;;;;;Y;;;;; +2994;RIGHT ARC GREATER-THAN BRACKET;Pe;0;ON;;;;;Y;;;;; +2995;DOUBLE LEFT ARC GREATER-THAN BRACKET;Ps;0;ON;;;;;Y;;;;; +2996;DOUBLE RIGHT ARC LESS-THAN BRACKET;Pe;0;ON;;;;;Y;;;;; +2997;LEFT BLACK TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; +2998;RIGHT BLACK TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; +2999;DOTTED FENCE;Sm;0;ON;;;;;N;;;;; +299A;VERTICAL ZIGZAG LINE;Sm;0;ON;;;;;N;;;;; +299B;MEASURED ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;; +299C;RIGHT ANGLE VARIANT WITH SQUARE;Sm;0;ON;;;;;Y;;;;; +299D;MEASURED RIGHT ANGLE WITH DOT;Sm;0;ON;;;;;Y;;;;; +299E;ANGLE WITH S INSIDE;Sm;0;ON;;;;;Y;;;;; +299F;ACUTE ANGLE;Sm;0;ON;;;;;Y;;;;; +29A0;SPHERICAL ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;; +29A1;SPHERICAL ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;; +29A2;TURNED ANGLE;Sm;0;ON;;;;;Y;;;;; +29A3;REVERSED ANGLE;Sm;0;ON;;;;;Y;;;;; +29A4;ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +29A5;REVERSED ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +29A6;OBLIQUE ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;; +29A7;OBLIQUE ANGLE OPENING DOWN;Sm;0;ON;;;;;Y;;;;; +29A8;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT;Sm;0;ON;;;;;Y;;;;; +29A9;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT;Sm;0;ON;;;;;Y;;;;; +29AA;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT;Sm;0;ON;;;;;Y;;;;; +29AB;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT;Sm;0;ON;;;;;Y;;;;; +29AC;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP;Sm;0;ON;;;;;Y;;;;; +29AD;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP;Sm;0;ON;;;;;Y;;;;; +29AE;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN;Sm;0;ON;;;;;Y;;;;; +29AF;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN;Sm;0;ON;;;;;Y;;;;; +29B0;REVERSED EMPTY SET;Sm;0;ON;;;;;N;;;;; +29B1;EMPTY SET WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +29B2;EMPTY SET WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +29B3;EMPTY SET WITH RIGHT ARROW ABOVE;Sm;0;ON;;;;;N;;;;; +29B4;EMPTY SET WITH LEFT ARROW ABOVE;Sm;0;ON;;;;;N;;;;; +29B5;CIRCLE WITH HORIZONTAL BAR;Sm;0;ON;;;;;N;;;;; +29B6;CIRCLED VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29B7;CIRCLED PARALLEL;Sm;0;ON;;;;;N;;;;; +29B8;CIRCLED REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29B9;CIRCLED PERPENDICULAR;Sm;0;ON;;;;;N;;;;; +29BA;CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29BB;CIRCLE WITH SUPERIMPOSED X;Sm;0;ON;;;;;N;;;;; +29BC;CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +29BD;UP ARROW THROUGH CIRCLE;Sm;0;ON;;;;;N;;;;; +29BE;CIRCLED WHITE BULLET;Sm;0;ON;;;;;N;;;;; +29BF;CIRCLED BULLET;Sm;0;ON;;;;;N;;;;; +29C0;CIRCLED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +29C1;CIRCLED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +29C2;CIRCLE WITH SMALL CIRCLE TO THE RIGHT;Sm;0;ON;;;;;Y;;;;; +29C3;CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT;Sm;0;ON;;;;;Y;;;;; +29C4;SQUARED RISING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;; +29C5;SQUARED FALLING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;; +29C6;SQUARED ASTERISK;Sm;0;ON;;;;;N;;;;; +29C7;SQUARED SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +29C8;SQUARED SQUARE;Sm;0;ON;;;;;N;;;;; +29C9;TWO JOINED SQUARES;Sm;0;ON;;;;;Y;;;;; +29CA;TRIANGLE WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +29CB;TRIANGLE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +29CC;S IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +29CD;TRIANGLE WITH SERIFS AT BOTTOM;Sm;0;ON;;;;;N;;;;; +29CE;RIGHT TRIANGLE ABOVE LEFT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +29CF;LEFT TRIANGLE BESIDE VERTICAL BAR;Sm;0;ON;;;;;Y;;;;; +29D0;VERTICAL BAR BESIDE RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +29D1;BOWTIE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D2;BOWTIE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D3;BLACK BOWTIE;Sm;0;ON;;;;;N;;;;; +29D4;TIMES WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D5;TIMES WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D6;WHITE HOURGLASS;Sm;0;ON;;;;;N;;;;; +29D7;BLACK HOURGLASS;Sm;0;ON;;;;;N;;;;; +29D8;LEFT WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;; +29D9;RIGHT WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;; +29DA;LEFT DOUBLE WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;; +29DB;RIGHT DOUBLE WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;; +29DC;INCOMPLETE INFINITY;Sm;0;ON;;;;;Y;;;;; +29DD;TIE OVER INFINITY;Sm;0;ON;;;;;N;;;;; +29DE;INFINITY NEGATED WITH VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29DF;DOUBLE-ENDED MULTIMAP;Sm;0;ON;;;;;N;;;;; +29E0;SQUARE WITH CONTOURED OUTLINE;Sm;0;ON;;;;;N;;;;; +29E1;INCREASES AS;Sm;0;ON;;;;;Y;;;;; +29E2;SHUFFLE PRODUCT;Sm;0;ON;;;;;N;;;;; +29E3;EQUALS SIGN AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;; +29E4;EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;; +29E5;IDENTICAL TO AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;; +29E6;GLEICH STARK;Sm;0;ON;;;;;N;;;;; +29E7;THERMODYNAMIC;Sm;0;ON;;;;;N;;;;; +29E8;DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29E9;DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29EA;BLACK DIAMOND WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29EB;BLACK LOZENGE;Sm;0;ON;;;;;N;;;;; +29EC;WHITE CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29ED;BLACK CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29EE;ERROR-BARRED WHITE SQUARE;Sm;0;ON;;;;;N;;;;; +29EF;ERROR-BARRED BLACK SQUARE;Sm;0;ON;;;;;N;;;;; +29F0;ERROR-BARRED WHITE DIAMOND;Sm;0;ON;;;;;N;;;;; +29F1;ERROR-BARRED BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +29F2;ERROR-BARRED WHITE CIRCLE;Sm;0;ON;;;;;N;;;;; +29F3;ERROR-BARRED BLACK CIRCLE;Sm;0;ON;;;;;N;;;;; +29F4;RULE-DELAYED;Sm;0;ON;;;;;Y;;;;; +29F5;REVERSE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;; +29F6;SOLIDUS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +29F7;REVERSE SOLIDUS WITH HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +29F8;BIG SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29F9;BIG REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29FA;DOUBLE PLUS;Sm;0;ON;;;;;N;;;;; +29FB;TRIPLE PLUS;Sm;0;ON;;;;;N;;;;; +29FC;LEFT-POINTING CURVED ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +29FD;RIGHT-POINTING CURVED ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +29FE;TINY;Sm;0;ON;;;;;N;;;;; +29FF;MINY;Sm;0;ON;;;;;N;;;;; +2A00;N-ARY CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +2A01;N-ARY CIRCLED PLUS OPERATOR;Sm;0;ON;;;;;N;;;;; +2A02;N-ARY CIRCLED TIMES OPERATOR;Sm;0;ON;;;;;N;;;;; +2A03;N-ARY UNION OPERATOR WITH DOT;Sm;0;ON;;;;;N;;;;; +2A04;N-ARY UNION OPERATOR WITH PLUS;Sm;0;ON;;;;;N;;;;; +2A05;N-ARY SQUARE INTERSECTION OPERATOR;Sm;0;ON;;;;;N;;;;; +2A06;N-ARY SQUARE UNION OPERATOR;Sm;0;ON;;;;;N;;;;; +2A07;TWO LOGICAL AND OPERATOR;Sm;0;ON;;;;;N;;;;; +2A08;TWO LOGICAL OR OPERATOR;Sm;0;ON;;;;;N;;;;; +2A09;N-ARY TIMES OPERATOR;Sm;0;ON;;;;;N;;;;; +2A0A;MODULO TWO SUM;Sm;0;ON;;;;;Y;;;;; +2A0B;SUMMATION WITH INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2A0C;QUADRUPLE INTEGRAL OPERATOR;Sm;0;ON;<compat> 222B 222B 222B 222B;;;;Y;;;;; +2A0D;FINITE PART INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2A0E;INTEGRAL WITH DOUBLE STROKE;Sm;0;ON;;;;;Y;;;;; +2A0F;INTEGRAL AVERAGE WITH SLASH;Sm;0;ON;;;;;Y;;;;; +2A10;CIRCULATION FUNCTION;Sm;0;ON;;;;;Y;;;;; +2A11;ANTICLOCKWISE INTEGRATION;Sm;0;ON;;;;;Y;;;;; +2A12;LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;; +2A13;LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;; +2A14;LINE INTEGRATION NOT INCLUDING THE POLE;Sm;0;ON;;;;;Y;;;;; +2A15;INTEGRAL AROUND A POINT OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A16;QUATERNION INTEGRAL OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A17;INTEGRAL WITH LEFTWARDS ARROW WITH HOOK;Sm;0;ON;;;;;Y;;;;; +2A18;INTEGRAL WITH TIMES SIGN;Sm;0;ON;;;;;Y;;;;; +2A19;INTEGRAL WITH INTERSECTION;Sm;0;ON;;;;;Y;;;;; +2A1A;INTEGRAL WITH UNION;Sm;0;ON;;;;;Y;;;;; +2A1B;INTEGRAL WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +2A1C;INTEGRAL WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +2A1D;JOIN;Sm;0;ON;;;;;N;;;;; +2A1E;LARGE LEFT TRIANGLE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A1F;Z NOTATION SCHEMA COMPOSITION;Sm;0;ON;;;;;Y;;;;; +2A20;Z NOTATION SCHEMA PIPING;Sm;0;ON;;;;;Y;;;;; +2A21;Z NOTATION SCHEMA PROJECTION;Sm;0;ON;;;;;Y;;;;; +2A22;PLUS SIGN WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +2A23;PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE;Sm;0;ON;;;;;N;;;;; +2A24;PLUS SIGN WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;; +2A25;PLUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A26;PLUS SIGN WITH TILDE BELOW;Sm;0;ON;;;;;Y;;;;; +2A27;PLUS SIGN WITH SUBSCRIPT TWO;Sm;0;ON;;;;;N;;;;; +2A28;PLUS SIGN WITH BLACK TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A29;MINUS SIGN WITH COMMA ABOVE;Sm;0;ON;;;;;Y;;;;; +2A2A;MINUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A2B;MINUS SIGN WITH FALLING DOTS;Sm;0;ON;;;;;Y;;;;; +2A2C;MINUS SIGN WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;; +2A2D;PLUS SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A2E;PLUS SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A2F;VECTOR OR CROSS PRODUCT;Sm;0;ON;;;;;N;;;;; +2A30;MULTIPLICATION SIGN WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A31;MULTIPLICATION SIGN WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A32;SEMIDIRECT PRODUCT WITH BOTTOM CLOSED;Sm;0;ON;;;;;N;;;;; +2A33;SMASH PRODUCT;Sm;0;ON;;;;;N;;;;; +2A34;MULTIPLICATION SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A35;MULTIPLICATION SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A36;CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;N;;;;; +2A37;MULTIPLICATION SIGN IN DOUBLE CIRCLE;Sm;0;ON;;;;;N;;;;; +2A38;CIRCLED DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +2A39;PLUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3A;MINUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3B;MULTIPLICATION SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3C;INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;; +2A3D;RIGHTHAND INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;; +2A3E;Z NOTATION RELATIONAL COMPOSITION;Sm;0;ON;;;;;Y;;;;; +2A3F;AMALGAMATION OR COPRODUCT;Sm;0;ON;;;;;N;;;;; +2A40;INTERSECTION WITH DOT;Sm;0;ON;;;;;N;;;;; +2A41;UNION WITH MINUS SIGN;Sm;0;ON;;;;;N;;;;; +2A42;UNION WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2A43;INTERSECTION WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2A44;INTERSECTION WITH LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A45;UNION WITH LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A46;UNION ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A47;INTERSECTION ABOVE UNION;Sm;0;ON;;;;;N;;;;; +2A48;UNION ABOVE BAR ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A49;INTERSECTION ABOVE BAR ABOVE UNION;Sm;0;ON;;;;;N;;;;; +2A4A;UNION BESIDE AND JOINED WITH UNION;Sm;0;ON;;;;;N;;;;; +2A4B;INTERSECTION BESIDE AND JOINED WITH INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A4C;CLOSED UNION WITH SERIFS;Sm;0;ON;;;;;N;;;;; +2A4D;CLOSED INTERSECTION WITH SERIFS;Sm;0;ON;;;;;N;;;;; +2A4E;DOUBLE SQUARE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A4F;DOUBLE SQUARE UNION;Sm;0;ON;;;;;N;;;;; +2A50;CLOSED UNION WITH SERIFS AND SMASH PRODUCT;Sm;0;ON;;;;;N;;;;; +2A51;LOGICAL AND WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A52;LOGICAL OR WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A53;DOUBLE LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A54;DOUBLE LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A55;TWO INTERSECTING LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A56;TWO INTERSECTING LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A57;SLOPING LARGE OR;Sm;0;ON;;;;;Y;;;;; +2A58;SLOPING LARGE AND;Sm;0;ON;;;;;Y;;;;; +2A59;LOGICAL OR OVERLAPPING LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A5A;LOGICAL AND WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;; +2A5B;LOGICAL OR WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;; +2A5C;LOGICAL AND WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;; +2A5D;LOGICAL OR WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;; +2A5E;LOGICAL AND WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;; +2A5F;LOGICAL AND WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A60;LOGICAL AND WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A61;SMALL VEE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A62;LOGICAL OR WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;; +2A63;LOGICAL OR WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A64;Z NOTATION DOMAIN ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;; +2A65;Z NOTATION RANGE ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;; +2A66;EQUALS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A67;IDENTICAL WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A68;TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2A69;TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2A6A;TILDE OPERATOR WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A6B;TILDE OPERATOR WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;; +2A6C;SIMILAR MINUS SIMILAR;Sm;0;ON;;;;;Y;;;;; +2A6D;CONGRUENT WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A6E;EQUALS WITH ASTERISK;Sm;0;ON;;;;;N;;;;; +2A6F;ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;Y;;;;; +2A70;APPROXIMATELY EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A71;EQUALS SIGN ABOVE PLUS SIGN;Sm;0;ON;;;;;N;;;;; +2A72;PLUS SIGN ABOVE EQUALS SIGN;Sm;0;ON;;;;;N;;;;; +2A73;EQUALS SIGN ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A74;DOUBLE COLON EQUAL;Sm;0;ON;<compat> 003A 003A 003D;;;;Y;;;;; +2A75;TWO CONSECUTIVE EQUALS SIGNS;Sm;0;ON;<compat> 003D 003D;;;;N;;;;; +2A76;THREE CONSECUTIVE EQUALS SIGNS;Sm;0;ON;<compat> 003D 003D 003D;;;;N;;;;; +2A77;EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW;Sm;0;ON;;;;;N;;;;; +2A78;EQUIVALENT WITH FOUR DOTS ABOVE;Sm;0;ON;;;;;N;;;;; +2A79;LESS-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;; +2A7A;GREATER-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;; +2A7B;LESS-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;; +2A7C;GREATER-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;; +2A7D;LESS-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A7E;GREATER-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A7F;LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A80;GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A81;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A82;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A83;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT;Sm;0;ON;;;;;Y;;;;; +2A84;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT;Sm;0;ON;;;;;Y;;;;; +2A85;LESS-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A86;GREATER-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A87;LESS-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A88;GREATER-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A89;LESS-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A8A;GREATER-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A8B;LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A8C;GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A8D;LESS-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;; +2A8E;GREATER-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;; +2A8F;LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A90;GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A91;LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;; +2A92;GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;; +2A93;LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2A94;GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2A95;SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A96;SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A97;SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A98;SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A99;DOUBLE-LINE EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9A;DOUBLE-LINE EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9B;DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9C;DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9D;SIMILAR OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9E;SIMILAR OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9F;SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AA0;SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AA1;DOUBLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2AA2;DOUBLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2AA3;DOUBLE NESTED LESS-THAN WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +2AA4;GREATER-THAN OVERLAPPING LESS-THAN;Sm;0;ON;;;;;N;;;;; +2AA5;GREATER-THAN BESIDE LESS-THAN;Sm;0;ON;;;;;N;;;;; +2AA6;LESS-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;; +2AA7;GREATER-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;; +2AA8;LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2AA9;GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2AAA;SMALLER THAN;Sm;0;ON;;;;;Y;;;;; +2AAB;LARGER THAN;Sm;0;ON;;;;;Y;;;;; +2AAC;SMALLER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AAD;LARGER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AAE;EQUALS SIGN WITH BUMPY ABOVE;Sm;0;ON;;;;;N;;;;; +2AAF;PRECEDES ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB0;SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB1;PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB2;SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB3;PRECEDES ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB4;SUCCEEDS ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB5;PRECEDES ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB6;SUCCEEDS ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB7;PRECEDES ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB8;SUCCEEDS ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB9;PRECEDES ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ABA;SUCCEEDS ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ABB;DOUBLE PRECEDES;Sm;0;ON;;;;;Y;;;;; +2ABC;DOUBLE SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +2ABD;SUBSET WITH DOT;Sm;0;ON;;;;;Y;;;;; +2ABE;SUPERSET WITH DOT;Sm;0;ON;;;;;Y;;;;; +2ABF;SUBSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC0;SUPERSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC1;SUBSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC2;SUPERSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC3;SUBSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2AC4;SUPERSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2AC5;SUBSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AC6;SUPERSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AC7;SUBSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AC8;SUPERSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AC9;SUBSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACA;SUPERSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACB;SUBSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACC;SUPERSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACD;SQUARE LEFT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; +2ACE;SQUARE RIGHT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; +2ACF;CLOSED SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD0;CLOSED SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD1;CLOSED SUBSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AD2;CLOSED SUPERSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AD3;SUBSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD4;SUPERSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD5;SUBSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD6;SUPERSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD7;SUPERSET BESIDE SUBSET;Sm;0;ON;;;;;N;;;;; +2AD8;SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET;Sm;0;ON;;;;;N;;;;; +2AD9;ELEMENT OF OPENING DOWNWARDS;Sm;0;ON;;;;;N;;;;; +2ADA;PITCHFORK WITH TEE TOP;Sm;0;ON;;;;;N;;;;; +2ADB;TRANSVERSAL INTERSECTION;Sm;0;ON;;;;;N;;;;; +2ADC;FORKING;Sm;0;ON;2ADD 0338;;;;Y;;;;; +2ADD;NONFORKING;Sm;0;ON;;;;;N;;;;; +2ADE;SHORT LEFT TACK;Sm;0;ON;;;;;Y;;;;; +2ADF;SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AE0;SHORT UP TACK;Sm;0;ON;;;;;N;;;;; +2AE1;PERPENDICULAR WITH S;Sm;0;ON;;;;;N;;;;; +2AE2;VERTICAL BAR TRIPLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE3;DOUBLE VERTICAL BAR LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE4;VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE5;DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE6;LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL;Sm;0;ON;;;;;Y;;;;; +2AE7;SHORT DOWN TACK WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2AE8;SHORT UP TACK WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2AE9;SHORT UP TACK ABOVE SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AEA;DOUBLE DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AEB;DOUBLE UP TACK;Sm;0;ON;;;;;N;;;;; +2AEC;DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;; +2AED;REVERSED DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;; +2AEE;DOES NOT DIVIDE WITH REVERSED NEGATION SLASH;Sm;0;ON;;;;;Y;;;;; +2AEF;VERTICAL LINE WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +2AF0;VERTICAL LINE WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;; +2AF1;DOWN TACK WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;; +2AF2;PARALLEL WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2AF3;PARALLEL WITH TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AF4;TRIPLE VERTICAL BAR BINARY RELATION;Sm;0;ON;;;;;N;;;;; +2AF5;TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2AF6;TRIPLE COLON OPERATOR;Sm;0;ON;;;;;N;;;;; +2AF7;TRIPLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2AF8;TRIPLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2AF9;DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AFA;DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AFB;TRIPLE SOLIDUS BINARY RELATION;Sm;0;ON;;;;;Y;;;;; +2AFC;LARGE TRIPLE VERTICAL BAR OPERATOR;Sm;0;ON;;;;;N;;;;; +2AFD;DOUBLE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AFE;WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +2AFF;N-ARY WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +2B00;NORTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B01;NORTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B02;SOUTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B03;SOUTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B04;LEFT RIGHT WHITE ARROW;So;0;ON;;;;;N;;;;; +2B05;LEFTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B06;UPWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B07;DOWNWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B08;NORTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B09;NORTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0A;SOUTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0B;SOUTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0C;LEFT RIGHT BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0D;UP DOWN BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0E;RIGHTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2B0F;RIGHTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; +2B10;LEFTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2B11;LEFTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; +2B12;SQUARE WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; +2B13;SQUARE WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; +2B14;SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +2B15;SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +2B16;DIAMOND WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +2B17;DIAMOND WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +2B18;DIAMOND WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; +2B19;DIAMOND WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; +2B1A;DOTTED SQUARE;So;0;ON;;;;;N;;;;; +2B1B;BLACK LARGE SQUARE;So;0;ON;;;;;N;;;;; +2B1C;WHITE LARGE SQUARE;So;0;ON;;;;;N;;;;; +2B1D;BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +2B1E;WHITE VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +2B1F;BLACK PENTAGON;So;0;ON;;;;;N;;;;; +2B20;WHITE PENTAGON;So;0;ON;;;;;N;;;;; +2B21;WHITE HEXAGON;So;0;ON;;;;;N;;;;; +2B22;BLACK HEXAGON;So;0;ON;;;;;N;;;;; +2B23;HORIZONTAL BLACK HEXAGON;So;0;ON;;;;;N;;;;; +2B24;BLACK LARGE CIRCLE;So;0;ON;;;;;N;;;;; +2B25;BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +2B26;WHITE MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +2B27;BLACK MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; +2B28;WHITE MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; +2B29;BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; +2B2A;BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;; +2B2B;WHITE SMALL LOZENGE;So;0;ON;;;;;N;;;;; +2B2C;BLACK HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2D;WHITE HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2E;BLACK VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2F;WHITE VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B30;LEFT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +2B31;THREE LEFTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; +2B32;LEFT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +2B33;LONG LEFTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; +2B34;LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B35;LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B36;LEFTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2B37;LEFTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2B38;LEFTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; +2B39;LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3A;LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3B;LEFTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; +2B3C;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3D;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3E;LEFTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; +2B3F;WAVE ARROW POINTING DIRECTLY LEFT;Sm;0;ON;;;;;N;;;;; +2B40;EQUALS SIGN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B41;REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B42;LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B43;RIGHTWARDS ARROW THROUGH GREATER-THAN;Sm;0;ON;;;;;N;;;;; +2B44;RIGHTWARDS ARROW THROUGH SUPERSET;Sm;0;ON;;;;;N;;;;; +2B45;LEFTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; +2B46;RIGHTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; +2B47;REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B48;RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B49;TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B4A;LEFTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B4B;LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2B4C;RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2B50;WHITE MEDIUM STAR;So;0;ON;;;;;N;;;;; +2B51;BLACK SMALL STAR;So;0;ON;;;;;N;;;;; +2B52;WHITE SMALL STAR;So;0;ON;;;;;N;;;;; +2B53;BLACK RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; +2B54;WHITE RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; +2B55;HEAVY LARGE CIRCLE;So;0;ON;;;;;N;;;;; +2B56;HEAVY OVAL WITH OVAL INSIDE;So;0;ON;;;;;N;;;;; +2B57;HEAVY CIRCLE WITH CIRCLE INSIDE;So;0;ON;;;;;N;;;;; +2B58;HEAVY CIRCLE;So;0;ON;;;;;N;;;;; +2B59;HEAVY CIRCLED SALTIRE;So;0;ON;;;;;N;;;;; +2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30; +2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31; +2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32; +2C03;GLAGOLITIC CAPITAL LETTER GLAGOLI;Lu;0;L;;;;;N;;;;2C33; +2C04;GLAGOLITIC CAPITAL LETTER DOBRO;Lu;0;L;;;;;N;;;;2C34; +2C05;GLAGOLITIC CAPITAL LETTER YESTU;Lu;0;L;;;;;N;;;;2C35; +2C06;GLAGOLITIC CAPITAL LETTER ZHIVETE;Lu;0;L;;;;;N;;;;2C36; +2C07;GLAGOLITIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;2C37; +2C08;GLAGOLITIC CAPITAL LETTER ZEMLJA;Lu;0;L;;;;;N;;;;2C38; +2C09;GLAGOLITIC CAPITAL LETTER IZHE;Lu;0;L;;;;;N;;;;2C39; +2C0A;GLAGOLITIC CAPITAL LETTER INITIAL IZHE;Lu;0;L;;;;;N;;;;2C3A; +2C0B;GLAGOLITIC CAPITAL LETTER I;Lu;0;L;;;;;N;;;;2C3B; +2C0C;GLAGOLITIC CAPITAL LETTER DJERVI;Lu;0;L;;;;;N;;;;2C3C; +2C0D;GLAGOLITIC CAPITAL LETTER KAKO;Lu;0;L;;;;;N;;;;2C3D; +2C0E;GLAGOLITIC CAPITAL LETTER LJUDIJE;Lu;0;L;;;;;N;;;;2C3E; +2C0F;GLAGOLITIC CAPITAL LETTER MYSLITE;Lu;0;L;;;;;N;;;;2C3F; +2C10;GLAGOLITIC CAPITAL LETTER NASHI;Lu;0;L;;;;;N;;;;2C40; +2C11;GLAGOLITIC CAPITAL LETTER ONU;Lu;0;L;;;;;N;;;;2C41; +2C12;GLAGOLITIC CAPITAL LETTER POKOJI;Lu;0;L;;;;;N;;;;2C42; +2C13;GLAGOLITIC CAPITAL LETTER RITSI;Lu;0;L;;;;;N;;;;2C43; +2C14;GLAGOLITIC CAPITAL LETTER SLOVO;Lu;0;L;;;;;N;;;;2C44; +2C15;GLAGOLITIC CAPITAL LETTER TVRIDO;Lu;0;L;;;;;N;;;;2C45; +2C16;GLAGOLITIC CAPITAL LETTER UKU;Lu;0;L;;;;;N;;;;2C46; +2C17;GLAGOLITIC CAPITAL LETTER FRITU;Lu;0;L;;;;;N;;;;2C47; +2C18;GLAGOLITIC CAPITAL LETTER HERU;Lu;0;L;;;;;N;;;;2C48; +2C19;GLAGOLITIC CAPITAL LETTER OTU;Lu;0;L;;;;;N;;;;2C49; +2C1A;GLAGOLITIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;2C4A; +2C1B;GLAGOLITIC CAPITAL LETTER SHTA;Lu;0;L;;;;;N;;;;2C4B; +2C1C;GLAGOLITIC CAPITAL LETTER TSI;Lu;0;L;;;;;N;;;;2C4C; +2C1D;GLAGOLITIC CAPITAL LETTER CHRIVI;Lu;0;L;;;;;N;;;;2C4D; +2C1E;GLAGOLITIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;2C4E; +2C1F;GLAGOLITIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;;;;2C4F; +2C20;GLAGOLITIC CAPITAL LETTER YERI;Lu;0;L;;;;;N;;;;2C50; +2C21;GLAGOLITIC CAPITAL LETTER YATI;Lu;0;L;;;;;N;;;;2C51; +2C22;GLAGOLITIC CAPITAL LETTER SPIDERY HA;Lu;0;L;;;;;N;;;;2C52; +2C23;GLAGOLITIC CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;2C53; +2C24;GLAGOLITIC CAPITAL LETTER SMALL YUS;Lu;0;L;;;;;N;;;;2C54; +2C25;GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL;Lu;0;L;;;;;N;;;;2C55; +2C26;GLAGOLITIC CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;2C56; +2C27;GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS;Lu;0;L;;;;;N;;;;2C57; +2C28;GLAGOLITIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;2C58; +2C29;GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS;Lu;0;L;;;;;N;;;;2C59; +2C2A;GLAGOLITIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;2C5A; +2C2B;GLAGOLITIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;2C5B; +2C2C;GLAGOLITIC CAPITAL LETTER SHTAPIC;Lu;0;L;;;;;N;;;;2C5C; +2C2D;GLAGOLITIC CAPITAL LETTER TROKUTASTI A;Lu;0;L;;;;;N;;;;2C5D; +2C2E;GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE;Lu;0;L;;;;;N;;;;2C5E; +2C30;GLAGOLITIC SMALL LETTER AZU;Ll;0;L;;;;;N;;;2C00;;2C00 +2C31;GLAGOLITIC SMALL LETTER BUKY;Ll;0;L;;;;;N;;;2C01;;2C01 +2C32;GLAGOLITIC SMALL LETTER VEDE;Ll;0;L;;;;;N;;;2C02;;2C02 +2C33;GLAGOLITIC SMALL LETTER GLAGOLI;Ll;0;L;;;;;N;;;2C03;;2C03 +2C34;GLAGOLITIC SMALL LETTER DOBRO;Ll;0;L;;;;;N;;;2C04;;2C04 +2C35;GLAGOLITIC SMALL LETTER YESTU;Ll;0;L;;;;;N;;;2C05;;2C05 +2C36;GLAGOLITIC SMALL LETTER ZHIVETE;Ll;0;L;;;;;N;;;2C06;;2C06 +2C37;GLAGOLITIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;2C07;;2C07 +2C38;GLAGOLITIC SMALL LETTER ZEMLJA;Ll;0;L;;;;;N;;;2C08;;2C08 +2C39;GLAGOLITIC SMALL LETTER IZHE;Ll;0;L;;;;;N;;;2C09;;2C09 +2C3A;GLAGOLITIC SMALL LETTER INITIAL IZHE;Ll;0;L;;;;;N;;;2C0A;;2C0A +2C3B;GLAGOLITIC SMALL LETTER I;Ll;0;L;;;;;N;;;2C0B;;2C0B +2C3C;GLAGOLITIC SMALL LETTER DJERVI;Ll;0;L;;;;;N;;;2C0C;;2C0C +2C3D;GLAGOLITIC SMALL LETTER KAKO;Ll;0;L;;;;;N;;;2C0D;;2C0D +2C3E;GLAGOLITIC SMALL LETTER LJUDIJE;Ll;0;L;;;;;N;;;2C0E;;2C0E +2C3F;GLAGOLITIC SMALL LETTER MYSLITE;Ll;0;L;;;;;N;;;2C0F;;2C0F +2C40;GLAGOLITIC SMALL LETTER NASHI;Ll;0;L;;;;;N;;;2C10;;2C10 +2C41;GLAGOLITIC SMALL LETTER ONU;Ll;0;L;;;;;N;;;2C11;;2C11 +2C42;GLAGOLITIC SMALL LETTER POKOJI;Ll;0;L;;;;;N;;;2C12;;2C12 +2C43;GLAGOLITIC SMALL LETTER RITSI;Ll;0;L;;;;;N;;;2C13;;2C13 +2C44;GLAGOLITIC SMALL LETTER SLOVO;Ll;0;L;;;;;N;;;2C14;;2C14 +2C45;GLAGOLITIC SMALL LETTER TVRIDO;Ll;0;L;;;;;N;;;2C15;;2C15 +2C46;GLAGOLITIC SMALL LETTER UKU;Ll;0;L;;;;;N;;;2C16;;2C16 +2C47;GLAGOLITIC SMALL LETTER FRITU;Ll;0;L;;;;;N;;;2C17;;2C17 +2C48;GLAGOLITIC SMALL LETTER HERU;Ll;0;L;;;;;N;;;2C18;;2C18 +2C49;GLAGOLITIC SMALL LETTER OTU;Ll;0;L;;;;;N;;;2C19;;2C19 +2C4A;GLAGOLITIC SMALL LETTER PE;Ll;0;L;;;;;N;;;2C1A;;2C1A +2C4B;GLAGOLITIC SMALL LETTER SHTA;Ll;0;L;;;;;N;;;2C1B;;2C1B +2C4C;GLAGOLITIC SMALL LETTER TSI;Ll;0;L;;;;;N;;;2C1C;;2C1C +2C4D;GLAGOLITIC SMALL LETTER CHRIVI;Ll;0;L;;;;;N;;;2C1D;;2C1D +2C4E;GLAGOLITIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;2C1E;;2C1E +2C4F;GLAGOLITIC SMALL LETTER YERU;Ll;0;L;;;;;N;;;2C1F;;2C1F +2C50;GLAGOLITIC SMALL LETTER YERI;Ll;0;L;;;;;N;;;2C20;;2C20 +2C51;GLAGOLITIC SMALL LETTER YATI;Ll;0;L;;;;;N;;;2C21;;2C21 +2C52;GLAGOLITIC SMALL LETTER SPIDERY HA;Ll;0;L;;;;;N;;;2C22;;2C22 +2C53;GLAGOLITIC SMALL LETTER YU;Ll;0;L;;;;;N;;;2C23;;2C23 +2C54;GLAGOLITIC SMALL LETTER SMALL YUS;Ll;0;L;;;;;N;;;2C24;;2C24 +2C55;GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL;Ll;0;L;;;;;N;;;2C25;;2C25 +2C56;GLAGOLITIC SMALL LETTER YO;Ll;0;L;;;;;N;;;2C26;;2C26 +2C57;GLAGOLITIC SMALL LETTER IOTATED SMALL YUS;Ll;0;L;;;;;N;;;2C27;;2C27 +2C58;GLAGOLITIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;2C28;;2C28 +2C59;GLAGOLITIC SMALL LETTER IOTATED BIG YUS;Ll;0;L;;;;;N;;;2C29;;2C29 +2C5A;GLAGOLITIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;2C2A;;2C2A +2C5B;GLAGOLITIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;2C2B;;2C2B +2C5C;GLAGOLITIC SMALL LETTER SHTAPIC;Ll;0;L;;;;;N;;;2C2C;;2C2C +2C5D;GLAGOLITIC SMALL LETTER TROKUTASTI A;Ll;0;L;;;;;N;;;2C2D;;2C2D +2C5E;GLAGOLITIC SMALL LETTER LATINATE MYSLITE;Ll;0;L;;;;;N;;;2C2E;;2C2E +2C60;LATIN CAPITAL LETTER L WITH DOUBLE BAR;Lu;0;L;;;;;N;;;;2C61; +2C61;LATIN SMALL LETTER L WITH DOUBLE BAR;Ll;0;L;;;;;N;;;2C60;;2C60 +2C62;LATIN CAPITAL LETTER L WITH MIDDLE TILDE;Lu;0;L;;;;;N;;;;026B; +2C63;LATIN CAPITAL LETTER P WITH STROKE;Lu;0;L;;;;;N;;;;1D7D; +2C64;LATIN CAPITAL LETTER R WITH TAIL;Lu;0;L;;;;;N;;;;027D; +2C65;LATIN SMALL LETTER A WITH STROKE;Ll;0;L;;;;;N;;;023A;;023A +2C66;LATIN SMALL LETTER T WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;023E;;023E +2C67;LATIN CAPITAL LETTER H WITH DESCENDER;Lu;0;L;;;;;N;;;;2C68; +2C68;LATIN SMALL LETTER H WITH DESCENDER;Ll;0;L;;;;;N;;;2C67;;2C67 +2C69;LATIN CAPITAL LETTER K WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6A; +2C6A;LATIN SMALL LETTER K WITH DESCENDER;Ll;0;L;;;;;N;;;2C69;;2C69 +2C6B;LATIN CAPITAL LETTER Z WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6C; +2C6C;LATIN SMALL LETTER Z WITH DESCENDER;Ll;0;L;;;;;N;;;2C6B;;2C6B +2C6D;LATIN CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;0251; +2C6E;LATIN CAPITAL LETTER M WITH HOOK;Lu;0;L;;;;;N;;;;0271; +2C6F;LATIN CAPITAL LETTER TURNED A;Lu;0;L;;;;;N;;;;0250; +2C70;LATIN CAPITAL LETTER TURNED ALPHA;Lu;0;L;;;;;N;;;;0252; +2C71;LATIN SMALL LETTER V WITH RIGHT HOOK;Ll;0;L;;;;;N;;;;; +2C72;LATIN CAPITAL LETTER W WITH HOOK;Lu;0;L;;;;;N;;;;2C73; +2C73;LATIN SMALL LETTER W WITH HOOK;Ll;0;L;;;;;N;;;2C72;;2C72 +2C74;LATIN SMALL LETTER V WITH CURL;Ll;0;L;;;;;N;;;;; +2C75;LATIN CAPITAL LETTER HALF H;Lu;0;L;;;;;N;;;;2C76; +2C76;LATIN SMALL LETTER HALF H;Ll;0;L;;;;;N;;;2C75;;2C75 +2C77;LATIN SMALL LETTER TAILLESS PHI;Ll;0;L;;;;;N;;;;; +2C78;LATIN SMALL LETTER E WITH NOTCH;Ll;0;L;;;;;N;;;;; +2C79;LATIN SMALL LETTER TURNED R WITH TAIL;Ll;0;L;;;;;N;;;;; +2C7A;LATIN SMALL LETTER O WITH LOW RING INSIDE;Ll;0;L;;;;;N;;;;; +2C7B;LATIN LETTER SMALL CAPITAL TURNED E;Ll;0;L;;;;;N;;;;; +2C7C;LATIN SUBSCRIPT SMALL LETTER J;Ll;0;L;<sub> 006A;;;;N;;;;; +2C7D;MODIFIER LETTER CAPITAL V;Lm;0;L;<super> 0056;;;;N;;;;; +2C7E;LATIN CAPITAL LETTER S WITH SWASH TAIL;Lu;0;L;;;;;N;;;;023F; +2C7F;LATIN CAPITAL LETTER Z WITH SWASH TAIL;Lu;0;L;;;;;N;;;;0240; +2C80;COPTIC CAPITAL LETTER ALFA;Lu;0;L;;;;;N;;;;2C81; +2C81;COPTIC SMALL LETTER ALFA;Ll;0;L;;;;;N;;;2C80;;2C80 +2C82;COPTIC CAPITAL LETTER VIDA;Lu;0;L;;;;;N;;;;2C83; +2C83;COPTIC SMALL LETTER VIDA;Ll;0;L;;;;;N;;;2C82;;2C82 +2C84;COPTIC CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;2C85; +2C85;COPTIC SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;2C84;;2C84 +2C86;COPTIC CAPITAL LETTER DALDA;Lu;0;L;;;;;N;;;;2C87; +2C87;COPTIC SMALL LETTER DALDA;Ll;0;L;;;;;N;;;2C86;;2C86 +2C88;COPTIC CAPITAL LETTER EIE;Lu;0;L;;;;;N;;;;2C89; +2C89;COPTIC SMALL LETTER EIE;Ll;0;L;;;;;N;;;2C88;;2C88 +2C8A;COPTIC CAPITAL LETTER SOU;Lu;0;L;;;;;N;;;;2C8B; +2C8B;COPTIC SMALL LETTER SOU;Ll;0;L;;;;;N;;;2C8A;;2C8A +2C8C;COPTIC CAPITAL LETTER ZATA;Lu;0;L;;;;;N;;;;2C8D; +2C8D;COPTIC SMALL LETTER ZATA;Ll;0;L;;;;;N;;;2C8C;;2C8C +2C8E;COPTIC CAPITAL LETTER HATE;Lu;0;L;;;;;N;;;;2C8F; +2C8F;COPTIC SMALL LETTER HATE;Ll;0;L;;;;;N;;;2C8E;;2C8E +2C90;COPTIC CAPITAL LETTER THETHE;Lu;0;L;;;;;N;;;;2C91; +2C91;COPTIC SMALL LETTER THETHE;Ll;0;L;;;;;N;;;2C90;;2C90 +2C92;COPTIC CAPITAL LETTER IAUDA;Lu;0;L;;;;;N;;;;2C93; +2C93;COPTIC SMALL LETTER IAUDA;Ll;0;L;;;;;N;;;2C92;;2C92 +2C94;COPTIC CAPITAL LETTER KAPA;Lu;0;L;;;;;N;;;;2C95; +2C95;COPTIC SMALL LETTER KAPA;Ll;0;L;;;;;N;;;2C94;;2C94 +2C96;COPTIC CAPITAL LETTER LAULA;Lu;0;L;;;;;N;;;;2C97; +2C97;COPTIC SMALL LETTER LAULA;Ll;0;L;;;;;N;;;2C96;;2C96 +2C98;COPTIC CAPITAL LETTER MI;Lu;0;L;;;;;N;;;;2C99; +2C99;COPTIC SMALL LETTER MI;Ll;0;L;;;;;N;;;2C98;;2C98 +2C9A;COPTIC CAPITAL LETTER NI;Lu;0;L;;;;;N;;;;2C9B; +2C9B;COPTIC SMALL LETTER NI;Ll;0;L;;;;;N;;;2C9A;;2C9A +2C9C;COPTIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;2C9D; +2C9D;COPTIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;2C9C;;2C9C +2C9E;COPTIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;2C9F; +2C9F;COPTIC SMALL LETTER O;Ll;0;L;;;;;N;;;2C9E;;2C9E +2CA0;COPTIC CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;2CA1; +2CA1;COPTIC SMALL LETTER PI;Ll;0;L;;;;;N;;;2CA0;;2CA0 +2CA2;COPTIC CAPITAL LETTER RO;Lu;0;L;;;;;N;;;;2CA3; +2CA3;COPTIC SMALL LETTER RO;Ll;0;L;;;;;N;;;2CA2;;2CA2 +2CA4;COPTIC CAPITAL LETTER SIMA;Lu;0;L;;;;;N;;;;2CA5; +2CA5;COPTIC SMALL LETTER SIMA;Ll;0;L;;;;;N;;;2CA4;;2CA4 +2CA6;COPTIC CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;2CA7; +2CA7;COPTIC SMALL LETTER TAU;Ll;0;L;;;;;N;;;2CA6;;2CA6 +2CA8;COPTIC CAPITAL LETTER UA;Lu;0;L;;;;;N;;;;2CA9; +2CA9;COPTIC SMALL LETTER UA;Ll;0;L;;;;;N;;;2CA8;;2CA8 +2CAA;COPTIC CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;2CAB; +2CAB;COPTIC SMALL LETTER FI;Ll;0;L;;;;;N;;;2CAA;;2CAA +2CAC;COPTIC CAPITAL LETTER KHI;Lu;0;L;;;;;N;;;;2CAD; +2CAD;COPTIC SMALL LETTER KHI;Ll;0;L;;;;;N;;;2CAC;;2CAC +2CAE;COPTIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;2CAF; +2CAF;COPTIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;2CAE;;2CAE +2CB0;COPTIC CAPITAL LETTER OOU;Lu;0;L;;;;;N;;;;2CB1; +2CB1;COPTIC SMALL LETTER OOU;Ll;0;L;;;;;N;;;2CB0;;2CB0 +2CB2;COPTIC CAPITAL LETTER DIALECT-P ALEF;Lu;0;L;;;;;N;;;;2CB3; +2CB3;COPTIC SMALL LETTER DIALECT-P ALEF;Ll;0;L;;;;;N;;;2CB2;;2CB2 +2CB4;COPTIC CAPITAL LETTER OLD COPTIC AIN;Lu;0;L;;;;;N;;;;2CB5; +2CB5;COPTIC SMALL LETTER OLD COPTIC AIN;Ll;0;L;;;;;N;;;2CB4;;2CB4 +2CB6;COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE;Lu;0;L;;;;;N;;;;2CB7; +2CB7;COPTIC SMALL LETTER CRYPTOGRAMMIC EIE;Ll;0;L;;;;;N;;;2CB6;;2CB6 +2CB8;COPTIC CAPITAL LETTER DIALECT-P KAPA;Lu;0;L;;;;;N;;;;2CB9; +2CB9;COPTIC SMALL LETTER DIALECT-P KAPA;Ll;0;L;;;;;N;;;2CB8;;2CB8 +2CBA;COPTIC CAPITAL LETTER DIALECT-P NI;Lu;0;L;;;;;N;;;;2CBB; +2CBB;COPTIC SMALL LETTER DIALECT-P NI;Ll;0;L;;;;;N;;;2CBA;;2CBA +2CBC;COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI;Lu;0;L;;;;;N;;;;2CBD; +2CBD;COPTIC SMALL LETTER CRYPTOGRAMMIC NI;Ll;0;L;;;;;N;;;2CBC;;2CBC +2CBE;COPTIC CAPITAL LETTER OLD COPTIC OOU;Lu;0;L;;;;;N;;;;2CBF; +2CBF;COPTIC SMALL LETTER OLD COPTIC OOU;Ll;0;L;;;;;N;;;2CBE;;2CBE +2CC0;COPTIC CAPITAL LETTER SAMPI;Lu;0;L;;;;;N;;;;2CC1; +2CC1;COPTIC SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;2CC0;;2CC0 +2CC2;COPTIC CAPITAL LETTER CROSSED SHEI;Lu;0;L;;;;;N;;;;2CC3; +2CC3;COPTIC SMALL LETTER CROSSED SHEI;Ll;0;L;;;;;N;;;2CC2;;2CC2 +2CC4;COPTIC CAPITAL LETTER OLD COPTIC SHEI;Lu;0;L;;;;;N;;;;2CC5; +2CC5;COPTIC SMALL LETTER OLD COPTIC SHEI;Ll;0;L;;;;;N;;;2CC4;;2CC4 +2CC6;COPTIC CAPITAL LETTER OLD COPTIC ESH;Lu;0;L;;;;;N;;;;2CC7; +2CC7;COPTIC SMALL LETTER OLD COPTIC ESH;Ll;0;L;;;;;N;;;2CC6;;2CC6 +2CC8;COPTIC CAPITAL LETTER AKHMIMIC KHEI;Lu;0;L;;;;;N;;;;2CC9; +2CC9;COPTIC SMALL LETTER AKHMIMIC KHEI;Ll;0;L;;;;;N;;;2CC8;;2CC8 +2CCA;COPTIC CAPITAL LETTER DIALECT-P HORI;Lu;0;L;;;;;N;;;;2CCB; +2CCB;COPTIC SMALL LETTER DIALECT-P HORI;Ll;0;L;;;;;N;;;2CCA;;2CCA +2CCC;COPTIC CAPITAL LETTER OLD COPTIC HORI;Lu;0;L;;;;;N;;;;2CCD; +2CCD;COPTIC SMALL LETTER OLD COPTIC HORI;Ll;0;L;;;;;N;;;2CCC;;2CCC +2CCE;COPTIC CAPITAL LETTER OLD COPTIC HA;Lu;0;L;;;;;N;;;;2CCF; +2CCF;COPTIC SMALL LETTER OLD COPTIC HA;Ll;0;L;;;;;N;;;2CCE;;2CCE +2CD0;COPTIC CAPITAL LETTER L-SHAPED HA;Lu;0;L;;;;;N;;;;2CD1; +2CD1;COPTIC SMALL LETTER L-SHAPED HA;Ll;0;L;;;;;N;;;2CD0;;2CD0 +2CD2;COPTIC CAPITAL LETTER OLD COPTIC HEI;Lu;0;L;;;;;N;;;;2CD3; +2CD3;COPTIC SMALL LETTER OLD COPTIC HEI;Ll;0;L;;;;;N;;;2CD2;;2CD2 +2CD4;COPTIC CAPITAL LETTER OLD COPTIC HAT;Lu;0;L;;;;;N;;;;2CD5; +2CD5;COPTIC SMALL LETTER OLD COPTIC HAT;Ll;0;L;;;;;N;;;2CD4;;2CD4 +2CD6;COPTIC CAPITAL LETTER OLD COPTIC GANGIA;Lu;0;L;;;;;N;;;;2CD7; +2CD7;COPTIC SMALL LETTER OLD COPTIC GANGIA;Ll;0;L;;;;;N;;;2CD6;;2CD6 +2CD8;COPTIC CAPITAL LETTER OLD COPTIC DJA;Lu;0;L;;;;;N;;;;2CD9; +2CD9;COPTIC SMALL LETTER OLD COPTIC DJA;Ll;0;L;;;;;N;;;2CD8;;2CD8 +2CDA;COPTIC CAPITAL LETTER OLD COPTIC SHIMA;Lu;0;L;;;;;N;;;;2CDB; +2CDB;COPTIC SMALL LETTER OLD COPTIC SHIMA;Ll;0;L;;;;;N;;;2CDA;;2CDA +2CDC;COPTIC CAPITAL LETTER OLD NUBIAN SHIMA;Lu;0;L;;;;;N;;;;2CDD; +2CDD;COPTIC SMALL LETTER OLD NUBIAN SHIMA;Ll;0;L;;;;;N;;;2CDC;;2CDC +2CDE;COPTIC CAPITAL LETTER OLD NUBIAN NGI;Lu;0;L;;;;;N;;;;2CDF; +2CDF;COPTIC SMALL LETTER OLD NUBIAN NGI;Ll;0;L;;;;;N;;;2CDE;;2CDE +2CE0;COPTIC CAPITAL LETTER OLD NUBIAN NYI;Lu;0;L;;;;;N;;;;2CE1; +2CE1;COPTIC SMALL LETTER OLD NUBIAN NYI;Ll;0;L;;;;;N;;;2CE0;;2CE0 +2CE2;COPTIC CAPITAL LETTER OLD NUBIAN WAU;Lu;0;L;;;;;N;;;;2CE3; +2CE3;COPTIC SMALL LETTER OLD NUBIAN WAU;Ll;0;L;;;;;N;;;2CE2;;2CE2 +2CE4;COPTIC SYMBOL KAI;Ll;0;L;;;;;N;;;;; +2CE5;COPTIC SYMBOL MI RO;So;0;ON;;;;;N;;;;; +2CE6;COPTIC SYMBOL PI RO;So;0;ON;;;;;N;;;;; +2CE7;COPTIC SYMBOL STAUROS;So;0;ON;;;;;N;;;;; +2CE8;COPTIC SYMBOL TAU RO;So;0;ON;;;;;N;;;;; +2CE9;COPTIC SYMBOL KHI RO;So;0;ON;;;;;N;;;;; +2CEA;COPTIC SYMBOL SHIMA SIMA;So;0;ON;;;;;N;;;;; +2CEB;COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI;Lu;0;L;;;;;N;;;;2CEC; +2CEC;COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI;Ll;0;L;;;;;N;;;2CEB;;2CEB +2CED;COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA;Lu;0;L;;;;;N;;;;2CEE; +2CEE;COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA;Ll;0;L;;;;;N;;;2CED;;2CED +2CEF;COPTIC COMBINING NI ABOVE;Mn;230;NSM;;;;;N;;;;; +2CF0;COPTIC COMBINING SPIRITUS ASPER;Mn;230;NSM;;;;;N;;;;; +2CF1;COPTIC COMBINING SPIRITUS LENIS;Mn;230;NSM;;;;;N;;;;; +2CF9;COPTIC OLD NUBIAN FULL STOP;Po;0;ON;;;;;N;;;;; +2CFA;COPTIC OLD NUBIAN DIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; +2CFB;COPTIC OLD NUBIAN INDIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; +2CFC;COPTIC OLD NUBIAN VERSE DIVIDER;Po;0;ON;;;;;N;;;;; +2CFD;COPTIC FRACTION ONE HALF;No;0;ON;;;;1/2;N;;;;; +2CFE;COPTIC FULL STOP;Po;0;ON;;;;;N;;;;; +2CFF;COPTIC MORPHOLOGICAL DIVIDER;Po;0;ON;;;;;N;;;;; +2D00;GEORGIAN SMALL LETTER AN;Ll;0;L;;;;;N;;;10A0;;10A0 +2D01;GEORGIAN SMALL LETTER BAN;Ll;0;L;;;;;N;;;10A1;;10A1 +2D02;GEORGIAN SMALL LETTER GAN;Ll;0;L;;;;;N;;;10A2;;10A2 +2D03;GEORGIAN SMALL LETTER DON;Ll;0;L;;;;;N;;;10A3;;10A3 +2D04;GEORGIAN SMALL LETTER EN;Ll;0;L;;;;;N;;;10A4;;10A4 +2D05;GEORGIAN SMALL LETTER VIN;Ll;0;L;;;;;N;;;10A5;;10A5 +2D06;GEORGIAN SMALL LETTER ZEN;Ll;0;L;;;;;N;;;10A6;;10A6 +2D07;GEORGIAN SMALL LETTER TAN;Ll;0;L;;;;;N;;;10A7;;10A7 +2D08;GEORGIAN SMALL LETTER IN;Ll;0;L;;;;;N;;;10A8;;10A8 +2D09;GEORGIAN SMALL LETTER KAN;Ll;0;L;;;;;N;;;10A9;;10A9 +2D0A;GEORGIAN SMALL LETTER LAS;Ll;0;L;;;;;N;;;10AA;;10AA +2D0B;GEORGIAN SMALL LETTER MAN;Ll;0;L;;;;;N;;;10AB;;10AB +2D0C;GEORGIAN SMALL LETTER NAR;Ll;0;L;;;;;N;;;10AC;;10AC +2D0D;GEORGIAN SMALL LETTER ON;Ll;0;L;;;;;N;;;10AD;;10AD +2D0E;GEORGIAN SMALL LETTER PAR;Ll;0;L;;;;;N;;;10AE;;10AE +2D0F;GEORGIAN SMALL LETTER ZHAR;Ll;0;L;;;;;N;;;10AF;;10AF +2D10;GEORGIAN SMALL LETTER RAE;Ll;0;L;;;;;N;;;10B0;;10B0 +2D11;GEORGIAN SMALL LETTER SAN;Ll;0;L;;;;;N;;;10B1;;10B1 +2D12;GEORGIAN SMALL LETTER TAR;Ll;0;L;;;;;N;;;10B2;;10B2 +2D13;GEORGIAN SMALL LETTER UN;Ll;0;L;;;;;N;;;10B3;;10B3 +2D14;GEORGIAN SMALL LETTER PHAR;Ll;0;L;;;;;N;;;10B4;;10B4 +2D15;GEORGIAN SMALL LETTER KHAR;Ll;0;L;;;;;N;;;10B5;;10B5 +2D16;GEORGIAN SMALL LETTER GHAN;Ll;0;L;;;;;N;;;10B6;;10B6 +2D17;GEORGIAN SMALL LETTER QAR;Ll;0;L;;;;;N;;;10B7;;10B7 +2D18;GEORGIAN SMALL LETTER SHIN;Ll;0;L;;;;;N;;;10B8;;10B8 +2D19;GEORGIAN SMALL LETTER CHIN;Ll;0;L;;;;;N;;;10B9;;10B9 +2D1A;GEORGIAN SMALL LETTER CAN;Ll;0;L;;;;;N;;;10BA;;10BA +2D1B;GEORGIAN SMALL LETTER JIL;Ll;0;L;;;;;N;;;10BB;;10BB +2D1C;GEORGIAN SMALL LETTER CIL;Ll;0;L;;;;;N;;;10BC;;10BC +2D1D;GEORGIAN SMALL LETTER CHAR;Ll;0;L;;;;;N;;;10BD;;10BD +2D1E;GEORGIAN SMALL LETTER XAN;Ll;0;L;;;;;N;;;10BE;;10BE +2D1F;GEORGIAN SMALL LETTER JHAN;Ll;0;L;;;;;N;;;10BF;;10BF +2D20;GEORGIAN SMALL LETTER HAE;Ll;0;L;;;;;N;;;10C0;;10C0 +2D21;GEORGIAN SMALL LETTER HE;Ll;0;L;;;;;N;;;10C1;;10C1 +2D22;GEORGIAN SMALL LETTER HIE;Ll;0;L;;;;;N;;;10C2;;10C2 +2D23;GEORGIAN SMALL LETTER WE;Ll;0;L;;;;;N;;;10C3;;10C3 +2D24;GEORGIAN SMALL LETTER HAR;Ll;0;L;;;;;N;;;10C4;;10C4 +2D25;GEORGIAN SMALL LETTER HOE;Ll;0;L;;;;;N;;;10C5;;10C5 +2D30;TIFINAGH LETTER YA;Lo;0;L;;;;;N;;;;; +2D31;TIFINAGH LETTER YAB;Lo;0;L;;;;;N;;;;; +2D32;TIFINAGH LETTER YABH;Lo;0;L;;;;;N;;;;; +2D33;TIFINAGH LETTER YAG;Lo;0;L;;;;;N;;;;; +2D34;TIFINAGH LETTER YAGHH;Lo;0;L;;;;;N;;;;; +2D35;TIFINAGH LETTER BERBER ACADEMY YAJ;Lo;0;L;;;;;N;;;;; +2D36;TIFINAGH LETTER YAJ;Lo;0;L;;;;;N;;;;; +2D37;TIFINAGH LETTER YAD;Lo;0;L;;;;;N;;;;; +2D38;TIFINAGH LETTER YADH;Lo;0;L;;;;;N;;;;; +2D39;TIFINAGH LETTER YADD;Lo;0;L;;;;;N;;;;; +2D3A;TIFINAGH LETTER YADDH;Lo;0;L;;;;;N;;;;; +2D3B;TIFINAGH LETTER YEY;Lo;0;L;;;;;N;;;;; +2D3C;TIFINAGH LETTER YAF;Lo;0;L;;;;;N;;;;; +2D3D;TIFINAGH LETTER YAK;Lo;0;L;;;;;N;;;;; +2D3E;TIFINAGH LETTER TUAREG YAK;Lo;0;L;;;;;N;;;;; +2D3F;TIFINAGH LETTER YAKHH;Lo;0;L;;;;;N;;;;; +2D40;TIFINAGH LETTER YAH;Lo;0;L;;;;;N;;;;; +2D41;TIFINAGH LETTER BERBER ACADEMY YAH;Lo;0;L;;;;;N;;;;; +2D42;TIFINAGH LETTER TUAREG YAH;Lo;0;L;;;;;N;;;;; +2D43;TIFINAGH LETTER YAHH;Lo;0;L;;;;;N;;;;; +2D44;TIFINAGH LETTER YAA;Lo;0;L;;;;;N;;;;; +2D45;TIFINAGH LETTER YAKH;Lo;0;L;;;;;N;;;;; +2D46;TIFINAGH LETTER TUAREG YAKH;Lo;0;L;;;;;N;;;;; +2D47;TIFINAGH LETTER YAQ;Lo;0;L;;;;;N;;;;; +2D48;TIFINAGH LETTER TUAREG YAQ;Lo;0;L;;;;;N;;;;; +2D49;TIFINAGH LETTER YI;Lo;0;L;;;;;N;;;;; +2D4A;TIFINAGH LETTER YAZH;Lo;0;L;;;;;N;;;;; +2D4B;TIFINAGH LETTER AHAGGAR YAZH;Lo;0;L;;;;;N;;;;; +2D4C;TIFINAGH LETTER TUAREG YAZH;Lo;0;L;;;;;N;;;;; +2D4D;TIFINAGH LETTER YAL;Lo;0;L;;;;;N;;;;; +2D4E;TIFINAGH LETTER YAM;Lo;0;L;;;;;N;;;;; +2D4F;TIFINAGH LETTER YAN;Lo;0;L;;;;;N;;;;; +2D50;TIFINAGH LETTER TUAREG YAGN;Lo;0;L;;;;;N;;;;; +2D51;TIFINAGH LETTER TUAREG YANG;Lo;0;L;;;;;N;;;;; +2D52;TIFINAGH LETTER YAP;Lo;0;L;;;;;N;;;;; +2D53;TIFINAGH LETTER YU;Lo;0;L;;;;;N;;;;; +2D54;TIFINAGH LETTER YAR;Lo;0;L;;;;;N;;;;; +2D55;TIFINAGH LETTER YARR;Lo;0;L;;;;;N;;;;; +2D56;TIFINAGH LETTER YAGH;Lo;0;L;;;;;N;;;;; +2D57;TIFINAGH LETTER TUAREG YAGH;Lo;0;L;;;;;N;;;;; +2D58;TIFINAGH LETTER AYER YAGH;Lo;0;L;;;;;N;;;;; +2D59;TIFINAGH LETTER YAS;Lo;0;L;;;;;N;;;;; +2D5A;TIFINAGH LETTER YASS;Lo;0;L;;;;;N;;;;; +2D5B;TIFINAGH LETTER YASH;Lo;0;L;;;;;N;;;;; +2D5C;TIFINAGH LETTER YAT;Lo;0;L;;;;;N;;;;; +2D5D;TIFINAGH LETTER YATH;Lo;0;L;;;;;N;;;;; +2D5E;TIFINAGH LETTER YACH;Lo;0;L;;;;;N;;;;; +2D5F;TIFINAGH LETTER YATT;Lo;0;L;;;;;N;;;;; +2D60;TIFINAGH LETTER YAV;Lo;0;L;;;;;N;;;;; +2D61;TIFINAGH LETTER YAW;Lo;0;L;;;;;N;;;;; +2D62;TIFINAGH LETTER YAY;Lo;0;L;;;;;N;;;;; +2D63;TIFINAGH LETTER YAZ;Lo;0;L;;;;;N;;;;; +2D64;TIFINAGH LETTER TAWELLEMET YAZ;Lo;0;L;;;;;N;;;;; +2D65;TIFINAGH LETTER YAZZ;Lo;0;L;;;;;N;;;;; +2D6F;TIFINAGH MODIFIER LETTER LABIALIZATION MARK;Lm;0;L;<super> 2D61;;;;N;;;;; +2D80;ETHIOPIC SYLLABLE LOA;Lo;0;L;;;;;N;;;;; +2D81;ETHIOPIC SYLLABLE MOA;Lo;0;L;;;;;N;;;;; +2D82;ETHIOPIC SYLLABLE ROA;Lo;0;L;;;;;N;;;;; +2D83;ETHIOPIC SYLLABLE SOA;Lo;0;L;;;;;N;;;;; +2D84;ETHIOPIC SYLLABLE SHOA;Lo;0;L;;;;;N;;;;; +2D85;ETHIOPIC SYLLABLE BOA;Lo;0;L;;;;;N;;;;; +2D86;ETHIOPIC SYLLABLE TOA;Lo;0;L;;;;;N;;;;; +2D87;ETHIOPIC SYLLABLE COA;Lo;0;L;;;;;N;;;;; +2D88;ETHIOPIC SYLLABLE NOA;Lo;0;L;;;;;N;;;;; +2D89;ETHIOPIC SYLLABLE NYOA;Lo;0;L;;;;;N;;;;; +2D8A;ETHIOPIC SYLLABLE GLOTTAL OA;Lo;0;L;;;;;N;;;;; +2D8B;ETHIOPIC SYLLABLE ZOA;Lo;0;L;;;;;N;;;;; +2D8C;ETHIOPIC SYLLABLE DOA;Lo;0;L;;;;;N;;;;; +2D8D;ETHIOPIC SYLLABLE DDOA;Lo;0;L;;;;;N;;;;; +2D8E;ETHIOPIC SYLLABLE JOA;Lo;0;L;;;;;N;;;;; +2D8F;ETHIOPIC SYLLABLE THOA;Lo;0;L;;;;;N;;;;; +2D90;ETHIOPIC SYLLABLE CHOA;Lo;0;L;;;;;N;;;;; +2D91;ETHIOPIC SYLLABLE PHOA;Lo;0;L;;;;;N;;;;; +2D92;ETHIOPIC SYLLABLE POA;Lo;0;L;;;;;N;;;;; +2D93;ETHIOPIC SYLLABLE GGWA;Lo;0;L;;;;;N;;;;; +2D94;ETHIOPIC SYLLABLE GGWI;Lo;0;L;;;;;N;;;;; +2D95;ETHIOPIC SYLLABLE GGWEE;Lo;0;L;;;;;N;;;;; +2D96;ETHIOPIC SYLLABLE GGWE;Lo;0;L;;;;;N;;;;; +2DA0;ETHIOPIC SYLLABLE SSA;Lo;0;L;;;;;N;;;;; +2DA1;ETHIOPIC SYLLABLE SSU;Lo;0;L;;;;;N;;;;; +2DA2;ETHIOPIC SYLLABLE SSI;Lo;0;L;;;;;N;;;;; +2DA3;ETHIOPIC SYLLABLE SSAA;Lo;0;L;;;;;N;;;;; +2DA4;ETHIOPIC SYLLABLE SSEE;Lo;0;L;;;;;N;;;;; +2DA5;ETHIOPIC SYLLABLE SSE;Lo;0;L;;;;;N;;;;; +2DA6;ETHIOPIC SYLLABLE SSO;Lo;0;L;;;;;N;;;;; +2DA8;ETHIOPIC SYLLABLE CCA;Lo;0;L;;;;;N;;;;; +2DA9;ETHIOPIC SYLLABLE CCU;Lo;0;L;;;;;N;;;;; +2DAA;ETHIOPIC SYLLABLE CCI;Lo;0;L;;;;;N;;;;; +2DAB;ETHIOPIC SYLLABLE CCAA;Lo;0;L;;;;;N;;;;; +2DAC;ETHIOPIC SYLLABLE CCEE;Lo;0;L;;;;;N;;;;; +2DAD;ETHIOPIC SYLLABLE CCE;Lo;0;L;;;;;N;;;;; +2DAE;ETHIOPIC SYLLABLE CCO;Lo;0;L;;;;;N;;;;; +2DB0;ETHIOPIC SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; +2DB1;ETHIOPIC SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; +2DB2;ETHIOPIC SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; +2DB3;ETHIOPIC SYLLABLE ZZAA;Lo;0;L;;;;;N;;;;; +2DB4;ETHIOPIC SYLLABLE ZZEE;Lo;0;L;;;;;N;;;;; +2DB5;ETHIOPIC SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; +2DB6;ETHIOPIC SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; +2DB8;ETHIOPIC SYLLABLE CCHA;Lo;0;L;;;;;N;;;;; +2DB9;ETHIOPIC SYLLABLE CCHU;Lo;0;L;;;;;N;;;;; +2DBA;ETHIOPIC SYLLABLE CCHI;Lo;0;L;;;;;N;;;;; +2DBB;ETHIOPIC SYLLABLE CCHAA;Lo;0;L;;;;;N;;;;; +2DBC;ETHIOPIC SYLLABLE CCHEE;Lo;0;L;;;;;N;;;;; +2DBD;ETHIOPIC SYLLABLE CCHE;Lo;0;L;;;;;N;;;;; +2DBE;ETHIOPIC SYLLABLE CCHO;Lo;0;L;;;;;N;;;;; +2DC0;ETHIOPIC SYLLABLE QYA;Lo;0;L;;;;;N;;;;; +2DC1;ETHIOPIC SYLLABLE QYU;Lo;0;L;;;;;N;;;;; +2DC2;ETHIOPIC SYLLABLE QYI;Lo;0;L;;;;;N;;;;; +2DC3;ETHIOPIC SYLLABLE QYAA;Lo;0;L;;;;;N;;;;; +2DC4;ETHIOPIC SYLLABLE QYEE;Lo;0;L;;;;;N;;;;; +2DC5;ETHIOPIC SYLLABLE QYE;Lo;0;L;;;;;N;;;;; +2DC6;ETHIOPIC SYLLABLE QYO;Lo;0;L;;;;;N;;;;; +2DC8;ETHIOPIC SYLLABLE KYA;Lo;0;L;;;;;N;;;;; +2DC9;ETHIOPIC SYLLABLE KYU;Lo;0;L;;;;;N;;;;; +2DCA;ETHIOPIC SYLLABLE KYI;Lo;0;L;;;;;N;;;;; +2DCB;ETHIOPIC SYLLABLE KYAA;Lo;0;L;;;;;N;;;;; +2DCC;ETHIOPIC SYLLABLE KYEE;Lo;0;L;;;;;N;;;;; +2DCD;ETHIOPIC SYLLABLE KYE;Lo;0;L;;;;;N;;;;; +2DCE;ETHIOPIC SYLLABLE KYO;Lo;0;L;;;;;N;;;;; +2DD0;ETHIOPIC SYLLABLE XYA;Lo;0;L;;;;;N;;;;; +2DD1;ETHIOPIC SYLLABLE XYU;Lo;0;L;;;;;N;;;;; +2DD2;ETHIOPIC SYLLABLE XYI;Lo;0;L;;;;;N;;;;; +2DD3;ETHIOPIC SYLLABLE XYAA;Lo;0;L;;;;;N;;;;; +2DD4;ETHIOPIC SYLLABLE XYEE;Lo;0;L;;;;;N;;;;; +2DD5;ETHIOPIC SYLLABLE XYE;Lo;0;L;;;;;N;;;;; +2DD6;ETHIOPIC SYLLABLE XYO;Lo;0;L;;;;;N;;;;; +2DD8;ETHIOPIC SYLLABLE GYA;Lo;0;L;;;;;N;;;;; +2DD9;ETHIOPIC SYLLABLE GYU;Lo;0;L;;;;;N;;;;; +2DDA;ETHIOPIC SYLLABLE GYI;Lo;0;L;;;;;N;;;;; +2DDB;ETHIOPIC SYLLABLE GYAA;Lo;0;L;;;;;N;;;;; +2DDC;ETHIOPIC SYLLABLE GYEE;Lo;0;L;;;;;N;;;;; +2DDD;ETHIOPIC SYLLABLE GYE;Lo;0;L;;;;;N;;;;; +2DDE;ETHIOPIC SYLLABLE GYO;Lo;0;L;;;;;N;;;;; +2DE0;COMBINING CYRILLIC LETTER BE;Mn;230;NSM;;;;;N;;;;; +2DE1;COMBINING CYRILLIC LETTER VE;Mn;230;NSM;;;;;N;;;;; +2DE2;COMBINING CYRILLIC LETTER GHE;Mn;230;NSM;;;;;N;;;;; +2DE3;COMBINING CYRILLIC LETTER DE;Mn;230;NSM;;;;;N;;;;; +2DE4;COMBINING CYRILLIC LETTER ZHE;Mn;230;NSM;;;;;N;;;;; +2DE5;COMBINING CYRILLIC LETTER ZE;Mn;230;NSM;;;;;N;;;;; +2DE6;COMBINING CYRILLIC LETTER KA;Mn;230;NSM;;;;;N;;;;; +2DE7;COMBINING CYRILLIC LETTER EL;Mn;230;NSM;;;;;N;;;;; +2DE8;COMBINING CYRILLIC LETTER EM;Mn;230;NSM;;;;;N;;;;; +2DE9;COMBINING CYRILLIC LETTER EN;Mn;230;NSM;;;;;N;;;;; +2DEA;COMBINING CYRILLIC LETTER O;Mn;230;NSM;;;;;N;;;;; +2DEB;COMBINING CYRILLIC LETTER PE;Mn;230;NSM;;;;;N;;;;; +2DEC;COMBINING CYRILLIC LETTER ER;Mn;230;NSM;;;;;N;;;;; +2DED;COMBINING CYRILLIC LETTER ES;Mn;230;NSM;;;;;N;;;;; +2DEE;COMBINING CYRILLIC LETTER TE;Mn;230;NSM;;;;;N;;;;; +2DEF;COMBINING CYRILLIC LETTER HA;Mn;230;NSM;;;;;N;;;;; +2DF0;COMBINING CYRILLIC LETTER TSE;Mn;230;NSM;;;;;N;;;;; +2DF1;COMBINING CYRILLIC LETTER CHE;Mn;230;NSM;;;;;N;;;;; +2DF2;COMBINING CYRILLIC LETTER SHA;Mn;230;NSM;;;;;N;;;;; +2DF3;COMBINING CYRILLIC LETTER SHCHA;Mn;230;NSM;;;;;N;;;;; +2DF4;COMBINING CYRILLIC LETTER FITA;Mn;230;NSM;;;;;N;;;;; +2DF5;COMBINING CYRILLIC LETTER ES-TE;Mn;230;NSM;;;;;N;;;;; +2DF6;COMBINING CYRILLIC LETTER A;Mn;230;NSM;;;;;N;;;;; +2DF7;COMBINING CYRILLIC LETTER IE;Mn;230;NSM;;;;;N;;;;; +2DF8;COMBINING CYRILLIC LETTER DJERV;Mn;230;NSM;;;;;N;;;;; +2DF9;COMBINING CYRILLIC LETTER MONOGRAPH UK;Mn;230;NSM;;;;;N;;;;; +2DFA;COMBINING CYRILLIC LETTER YAT;Mn;230;NSM;;;;;N;;;;; +2DFB;COMBINING CYRILLIC LETTER YU;Mn;230;NSM;;;;;N;;;;; +2DFC;COMBINING CYRILLIC LETTER IOTIFIED A;Mn;230;NSM;;;;;N;;;;; +2DFD;COMBINING CYRILLIC LETTER LITTLE YUS;Mn;230;NSM;;;;;N;;;;; +2DFE;COMBINING CYRILLIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;; +2DFF;COMBINING CYRILLIC LETTER IOTIFIED BIG YUS;Mn;230;NSM;;;;;N;;;;; +2E00;RIGHT ANGLE SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; +2E01;RIGHT ANGLE DOTTED SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; +2E02;LEFT SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E03;RIGHT SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E04;LEFT DOTTED SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E05;RIGHT DOTTED SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E06;RAISED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; +2E07;RAISED DOTTED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; +2E08;DOTTED TRANSPOSITION MARKER;Po;0;ON;;;;;N;;;;; +2E09;LEFT TRANSPOSITION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E0A;RIGHT TRANSPOSITION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E0B;RAISED SQUARE;Po;0;ON;;;;;N;;;;; +2E0C;LEFT RAISED OMISSION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E0D;RIGHT RAISED OMISSION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E0E;EDITORIAL CORONIS;Po;0;ON;;;;;N;;;;; +2E0F;PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E10;FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E11;REVERSED FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E12;HYPODIASTOLE;Po;0;ON;;;;;N;;;;; +2E13;DOTTED OBELOS;Po;0;ON;;;;;N;;;;; +2E14;DOWNWARDS ANCORA;Po;0;ON;;;;;N;;;;; +2E15;UPWARDS ANCORA;Po;0;ON;;;;;N;;;;; +2E16;DOTTED RIGHT-POINTING ANGLE;Po;0;ON;;;;;N;;;;; +2E17;DOUBLE OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;; +2E18;INVERTED INTERROBANG;Po;0;ON;;;;;N;;;;; +2E19;PALM BRANCH;Po;0;ON;;;;;N;;;;; +2E1A;HYPHEN WITH DIAERESIS;Pd;0;ON;;;;;N;;;;; +2E1B;TILDE WITH RING ABOVE;Po;0;ON;;;;;N;;;;; +2E1C;LEFT LOW PARAPHRASE BRACKET;Pi;0;ON;;;;;Y;;;;; +2E1D;RIGHT LOW PARAPHRASE BRACKET;Pf;0;ON;;;;;Y;;;;; +2E1E;TILDE WITH DOT ABOVE;Po;0;ON;;;;;N;;;;; +2E1F;TILDE WITH DOT BELOW;Po;0;ON;;;;;N;;;;; +2E20;LEFT VERTICAL BAR WITH QUILL;Pi;0;ON;;;;;Y;;;;; +2E21;RIGHT VERTICAL BAR WITH QUILL;Pf;0;ON;;;;;Y;;;;; +2E22;TOP LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; +2E23;TOP RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; +2E24;BOTTOM LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; +2E25;BOTTOM RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; +2E26;LEFT SIDEWAYS U BRACKET;Ps;0;ON;;;;;Y;;;;; +2E27;RIGHT SIDEWAYS U BRACKET;Pe;0;ON;;;;;Y;;;;; +2E28;LEFT DOUBLE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2E29;RIGHT DOUBLE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2E2A;TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2B;ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2C;SQUARED FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2D;FIVE DOT MARK;Po;0;ON;;;;;N;;;;; +2E2E;REVERSED QUESTION MARK;Po;0;ON;;;;;N;;;;; +2E2F;VERTICAL TILDE;Lm;0;ON;;;;;N;;;;; +2E30;RING POINT;Po;0;ON;;;;;N;;;;; +2E31;WORD SEPARATOR MIDDLE DOT;Po;0;ON;;;;;N;;;;; +2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;; +2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;; +2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;; +2E83;CJK RADICAL SECOND TWO;So;0;ON;;;;;N;;;;; +2E84;CJK RADICAL SECOND THREE;So;0;ON;;;;;N;;;;; +2E85;CJK RADICAL PERSON;So;0;ON;;;;;N;;;;; +2E86;CJK RADICAL BOX;So;0;ON;;;;;N;;;;; +2E87;CJK RADICAL TABLE;So;0;ON;;;;;N;;;;; +2E88;CJK RADICAL KNIFE ONE;So;0;ON;;;;;N;;;;; +2E89;CJK RADICAL KNIFE TWO;So;0;ON;;;;;N;;;;; +2E8A;CJK RADICAL DIVINATION;So;0;ON;;;;;N;;;;; +2E8B;CJK RADICAL SEAL;So;0;ON;;;;;N;;;;; +2E8C;CJK RADICAL SMALL ONE;So;0;ON;;;;;N;;;;; +2E8D;CJK RADICAL SMALL TWO;So;0;ON;;;;;N;;;;; +2E8E;CJK RADICAL LAME ONE;So;0;ON;;;;;N;;;;; +2E8F;CJK RADICAL LAME TWO;So;0;ON;;;;;N;;;;; +2E90;CJK RADICAL LAME THREE;So;0;ON;;;;;N;;;;; +2E91;CJK RADICAL LAME FOUR;So;0;ON;;;;;N;;;;; +2E92;CJK RADICAL SNAKE;So;0;ON;;;;;N;;;;; +2E93;CJK RADICAL THREAD;So;0;ON;;;;;N;;;;; +2E94;CJK RADICAL SNOUT ONE;So;0;ON;;;;;N;;;;; +2E95;CJK RADICAL SNOUT TWO;So;0;ON;;;;;N;;;;; +2E96;CJK RADICAL HEART ONE;So;0;ON;;;;;N;;;;; +2E97;CJK RADICAL HEART TWO;So;0;ON;;;;;N;;;;; +2E98;CJK RADICAL HAND;So;0;ON;;;;;N;;;;; +2E99;CJK RADICAL RAP;So;0;ON;;;;;N;;;;; +2E9B;CJK RADICAL CHOKE;So;0;ON;;;;;N;;;;; +2E9C;CJK RADICAL SUN;So;0;ON;;;;;N;;;;; +2E9D;CJK RADICAL MOON;So;0;ON;;;;;N;;;;; +2E9E;CJK RADICAL DEATH;So;0;ON;;;;;N;;;;; +2E9F;CJK RADICAL MOTHER;So;0;ON;<compat> 6BCD;;;;N;;;;; +2EA0;CJK RADICAL CIVILIAN;So;0;ON;;;;;N;;;;; +2EA1;CJK RADICAL WATER ONE;So;0;ON;;;;;N;;;;; +2EA2;CJK RADICAL WATER TWO;So;0;ON;;;;;N;;;;; +2EA3;CJK RADICAL FIRE;So;0;ON;;;;;N;;;;; +2EA4;CJK RADICAL PAW ONE;So;0;ON;;;;;N;;;;; +2EA5;CJK RADICAL PAW TWO;So;0;ON;;;;;N;;;;; +2EA6;CJK RADICAL SIMPLIFIED HALF TREE TRUNK;So;0;ON;;;;;N;;;;; +2EA7;CJK RADICAL COW;So;0;ON;;;;;N;;;;; +2EA8;CJK RADICAL DOG;So;0;ON;;;;;N;;;;; +2EA9;CJK RADICAL JADE;So;0;ON;;;;;N;;;;; +2EAA;CJK RADICAL BOLT OF CLOTH;So;0;ON;;;;;N;;;;; +2EAB;CJK RADICAL EYE;So;0;ON;;;;;N;;;;; +2EAC;CJK RADICAL SPIRIT ONE;So;0;ON;;;;;N;;;;; +2EAD;CJK RADICAL SPIRIT TWO;So;0;ON;;;;;N;;;;; +2EAE;CJK RADICAL BAMBOO;So;0;ON;;;;;N;;;;; +2EAF;CJK RADICAL SILK;So;0;ON;;;;;N;;;;; +2EB0;CJK RADICAL C-SIMPLIFIED SILK;So;0;ON;;;;;N;;;;; +2EB1;CJK RADICAL NET ONE;So;0;ON;;;;;N;;;;; +2EB2;CJK RADICAL NET TWO;So;0;ON;;;;;N;;;;; +2EB3;CJK RADICAL NET THREE;So;0;ON;;;;;N;;;;; +2EB4;CJK RADICAL NET FOUR;So;0;ON;;;;;N;;;;; +2EB5;CJK RADICAL MESH;So;0;ON;;;;;N;;;;; +2EB6;CJK RADICAL SHEEP;So;0;ON;;;;;N;;;;; +2EB7;CJK RADICAL RAM;So;0;ON;;;;;N;;;;; +2EB8;CJK RADICAL EWE;So;0;ON;;;;;N;;;;; +2EB9;CJK RADICAL OLD;So;0;ON;;;;;N;;;;; +2EBA;CJK RADICAL BRUSH ONE;So;0;ON;;;;;N;;;;; +2EBB;CJK RADICAL BRUSH TWO;So;0;ON;;;;;N;;;;; +2EBC;CJK RADICAL MEAT;So;0;ON;;;;;N;;;;; +2EBD;CJK RADICAL MORTAR;So;0;ON;;;;;N;;;;; +2EBE;CJK RADICAL GRASS ONE;So;0;ON;;;;;N;;;;; +2EBF;CJK RADICAL GRASS TWO;So;0;ON;;;;;N;;;;; +2EC0;CJK RADICAL GRASS THREE;So;0;ON;;;;;N;;;;; +2EC1;CJK RADICAL TIGER;So;0;ON;;;;;N;;;;; +2EC2;CJK RADICAL CLOTHES;So;0;ON;;;;;N;;;;; +2EC3;CJK RADICAL WEST ONE;So;0;ON;;;;;N;;;;; +2EC4;CJK RADICAL WEST TWO;So;0;ON;;;;;N;;;;; +2EC5;CJK RADICAL C-SIMPLIFIED SEE;So;0;ON;;;;;N;;;;; +2EC6;CJK RADICAL SIMPLIFIED HORN;So;0;ON;;;;;N;;;;; +2EC7;CJK RADICAL HORN;So;0;ON;;;;;N;;;;; +2EC8;CJK RADICAL C-SIMPLIFIED SPEECH;So;0;ON;;;;;N;;;;; +2EC9;CJK RADICAL C-SIMPLIFIED SHELL;So;0;ON;;;;;N;;;;; +2ECA;CJK RADICAL FOOT;So;0;ON;;;;;N;;;;; +2ECB;CJK RADICAL C-SIMPLIFIED CART;So;0;ON;;;;;N;;;;; +2ECC;CJK RADICAL SIMPLIFIED WALK;So;0;ON;;;;;N;;;;; +2ECD;CJK RADICAL WALK ONE;So;0;ON;;;;;N;;;;; +2ECE;CJK RADICAL WALK TWO;So;0;ON;;;;;N;;;;; +2ECF;CJK RADICAL CITY;So;0;ON;;;;;N;;;;; +2ED0;CJK RADICAL C-SIMPLIFIED GOLD;So;0;ON;;;;;N;;;;; +2ED1;CJK RADICAL LONG ONE;So;0;ON;;;;;N;;;;; +2ED2;CJK RADICAL LONG TWO;So;0;ON;;;;;N;;;;; +2ED3;CJK RADICAL C-SIMPLIFIED LONG;So;0;ON;;;;;N;;;;; +2ED4;CJK RADICAL C-SIMPLIFIED GATE;So;0;ON;;;;;N;;;;; +2ED5;CJK RADICAL MOUND ONE;So;0;ON;;;;;N;;;;; +2ED6;CJK RADICAL MOUND TWO;So;0;ON;;;;;N;;;;; +2ED7;CJK RADICAL RAIN;So;0;ON;;;;;N;;;;; +2ED8;CJK RADICAL BLUE;So;0;ON;;;;;N;;;;; +2ED9;CJK RADICAL C-SIMPLIFIED TANNED LEATHER;So;0;ON;;;;;N;;;;; +2EDA;CJK RADICAL C-SIMPLIFIED LEAF;So;0;ON;;;;;N;;;;; +2EDB;CJK RADICAL C-SIMPLIFIED WIND;So;0;ON;;;;;N;;;;; +2EDC;CJK RADICAL C-SIMPLIFIED FLY;So;0;ON;;;;;N;;;;; +2EDD;CJK RADICAL EAT ONE;So;0;ON;;;;;N;;;;; +2EDE;CJK RADICAL EAT TWO;So;0;ON;;;;;N;;;;; +2EDF;CJK RADICAL EAT THREE;So;0;ON;;;;;N;;;;; +2EE0;CJK RADICAL C-SIMPLIFIED EAT;So;0;ON;;;;;N;;;;; +2EE1;CJK RADICAL HEAD;So;0;ON;;;;;N;;;;; +2EE2;CJK RADICAL C-SIMPLIFIED HORSE;So;0;ON;;;;;N;;;;; +2EE3;CJK RADICAL BONE;So;0;ON;;;;;N;;;;; +2EE4;CJK RADICAL GHOST;So;0;ON;;;;;N;;;;; +2EE5;CJK RADICAL C-SIMPLIFIED FISH;So;0;ON;;;;;N;;;;; +2EE6;CJK RADICAL C-SIMPLIFIED BIRD;So;0;ON;;;;;N;;;;; +2EE7;CJK RADICAL C-SIMPLIFIED SALT;So;0;ON;;;;;N;;;;; +2EE8;CJK RADICAL SIMPLIFIED WHEAT;So;0;ON;;;;;N;;;;; +2EE9;CJK RADICAL SIMPLIFIED YELLOW;So;0;ON;;;;;N;;;;; +2EEA;CJK RADICAL C-SIMPLIFIED FROG;So;0;ON;;;;;N;;;;; +2EEB;CJK RADICAL J-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; +2EEC;CJK RADICAL C-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; +2EED;CJK RADICAL J-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; +2EEE;CJK RADICAL C-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; +2EEF;CJK RADICAL J-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; +2EF0;CJK RADICAL C-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; +2EF1;CJK RADICAL TURTLE;So;0;ON;;;;;N;;;;; +2EF2;CJK RADICAL J-SIMPLIFIED TURTLE;So;0;ON;;;;;N;;;;; +2EF3;CJK RADICAL C-SIMPLIFIED TURTLE;So;0;ON;<compat> 9F9F;;;;N;;;;; +2F00;KANGXI RADICAL ONE;So;0;ON;<compat> 4E00;;;;N;;;;; +2F01;KANGXI RADICAL LINE;So;0;ON;<compat> 4E28;;;;N;;;;; +2F02;KANGXI RADICAL DOT;So;0;ON;<compat> 4E36;;;;N;;;;; +2F03;KANGXI RADICAL SLASH;So;0;ON;<compat> 4E3F;;;;N;;;;; +2F04;KANGXI RADICAL SECOND;So;0;ON;<compat> 4E59;;;;N;;;;; +2F05;KANGXI RADICAL HOOK;So;0;ON;<compat> 4E85;;;;N;;;;; +2F06;KANGXI RADICAL TWO;So;0;ON;<compat> 4E8C;;;;N;;;;; +2F07;KANGXI RADICAL LID;So;0;ON;<compat> 4EA0;;;;N;;;;; +2F08;KANGXI RADICAL MAN;So;0;ON;<compat> 4EBA;;;;N;;;;; +2F09;KANGXI RADICAL LEGS;So;0;ON;<compat> 513F;;;;N;;;;; +2F0A;KANGXI RADICAL ENTER;So;0;ON;<compat> 5165;;;;N;;;;; +2F0B;KANGXI RADICAL EIGHT;So;0;ON;<compat> 516B;;;;N;;;;; +2F0C;KANGXI RADICAL DOWN BOX;So;0;ON;<compat> 5182;;;;N;;;;; +2F0D;KANGXI RADICAL COVER;So;0;ON;<compat> 5196;;;;N;;;;; +2F0E;KANGXI RADICAL ICE;So;0;ON;<compat> 51AB;;;;N;;;;; +2F0F;KANGXI RADICAL TABLE;So;0;ON;<compat> 51E0;;;;N;;;;; +2F10;KANGXI RADICAL OPEN BOX;So;0;ON;<compat> 51F5;;;;N;;;;; +2F11;KANGXI RADICAL KNIFE;So;0;ON;<compat> 5200;;;;N;;;;; +2F12;KANGXI RADICAL POWER;So;0;ON;<compat> 529B;;;;N;;;;; +2F13;KANGXI RADICAL WRAP;So;0;ON;<compat> 52F9;;;;N;;;;; +2F14;KANGXI RADICAL SPOON;So;0;ON;<compat> 5315;;;;N;;;;; +2F15;KANGXI RADICAL RIGHT OPEN BOX;So;0;ON;<compat> 531A;;;;N;;;;; +2F16;KANGXI RADICAL HIDING ENCLOSURE;So;0;ON;<compat> 5338;;;;N;;;;; +2F17;KANGXI RADICAL TEN;So;0;ON;<compat> 5341;;;;N;;;;; +2F18;KANGXI RADICAL DIVINATION;So;0;ON;<compat> 535C;;;;N;;;;; +2F19;KANGXI RADICAL SEAL;So;0;ON;<compat> 5369;;;;N;;;;; +2F1A;KANGXI RADICAL CLIFF;So;0;ON;<compat> 5382;;;;N;;;;; +2F1B;KANGXI RADICAL PRIVATE;So;0;ON;<compat> 53B6;;;;N;;;;; +2F1C;KANGXI RADICAL AGAIN;So;0;ON;<compat> 53C8;;;;N;;;;; +2F1D;KANGXI RADICAL MOUTH;So;0;ON;<compat> 53E3;;;;N;;;;; +2F1E;KANGXI RADICAL ENCLOSURE;So;0;ON;<compat> 56D7;;;;N;;;;; +2F1F;KANGXI RADICAL EARTH;So;0;ON;<compat> 571F;;;;N;;;;; +2F20;KANGXI RADICAL SCHOLAR;So;0;ON;<compat> 58EB;;;;N;;;;; +2F21;KANGXI RADICAL GO;So;0;ON;<compat> 5902;;;;N;;;;; +2F22;KANGXI RADICAL GO SLOWLY;So;0;ON;<compat> 590A;;;;N;;;;; +2F23;KANGXI RADICAL EVENING;So;0;ON;<compat> 5915;;;;N;;;;; +2F24;KANGXI RADICAL BIG;So;0;ON;<compat> 5927;;;;N;;;;; +2F25;KANGXI RADICAL WOMAN;So;0;ON;<compat> 5973;;;;N;;;;; +2F26;KANGXI RADICAL CHILD;So;0;ON;<compat> 5B50;;;;N;;;;; +2F27;KANGXI RADICAL ROOF;So;0;ON;<compat> 5B80;;;;N;;;;; +2F28;KANGXI RADICAL INCH;So;0;ON;<compat> 5BF8;;;;N;;;;; +2F29;KANGXI RADICAL SMALL;So;0;ON;<compat> 5C0F;;;;N;;;;; +2F2A;KANGXI RADICAL LAME;So;0;ON;<compat> 5C22;;;;N;;;;; +2F2B;KANGXI RADICAL CORPSE;So;0;ON;<compat> 5C38;;;;N;;;;; +2F2C;KANGXI RADICAL SPROUT;So;0;ON;<compat> 5C6E;;;;N;;;;; +2F2D;KANGXI RADICAL MOUNTAIN;So;0;ON;<compat> 5C71;;;;N;;;;; +2F2E;KANGXI RADICAL RIVER;So;0;ON;<compat> 5DDB;;;;N;;;;; +2F2F;KANGXI RADICAL WORK;So;0;ON;<compat> 5DE5;;;;N;;;;; +2F30;KANGXI RADICAL ONESELF;So;0;ON;<compat> 5DF1;;;;N;;;;; +2F31;KANGXI RADICAL TURBAN;So;0;ON;<compat> 5DFE;;;;N;;;;; +2F32;KANGXI RADICAL DRY;So;0;ON;<compat> 5E72;;;;N;;;;; +2F33;KANGXI RADICAL SHORT THREAD;So;0;ON;<compat> 5E7A;;;;N;;;;; +2F34;KANGXI RADICAL DOTTED CLIFF;So;0;ON;<compat> 5E7F;;;;N;;;;; +2F35;KANGXI RADICAL LONG STRIDE;So;0;ON;<compat> 5EF4;;;;N;;;;; +2F36;KANGXI RADICAL TWO HANDS;So;0;ON;<compat> 5EFE;;;;N;;;;; +2F37;KANGXI RADICAL SHOOT;So;0;ON;<compat> 5F0B;;;;N;;;;; +2F38;KANGXI RADICAL BOW;So;0;ON;<compat> 5F13;;;;N;;;;; +2F39;KANGXI RADICAL SNOUT;So;0;ON;<compat> 5F50;;;;N;;;;; +2F3A;KANGXI RADICAL BRISTLE;So;0;ON;<compat> 5F61;;;;N;;;;; +2F3B;KANGXI RADICAL STEP;So;0;ON;<compat> 5F73;;;;N;;;;; +2F3C;KANGXI RADICAL HEART;So;0;ON;<compat> 5FC3;;;;N;;;;; +2F3D;KANGXI RADICAL HALBERD;So;0;ON;<compat> 6208;;;;N;;;;; +2F3E;KANGXI RADICAL DOOR;So;0;ON;<compat> 6236;;;;N;;;;; +2F3F;KANGXI RADICAL HAND;So;0;ON;<compat> 624B;;;;N;;;;; +2F40;KANGXI RADICAL BRANCH;So;0;ON;<compat> 652F;;;;N;;;;; +2F41;KANGXI RADICAL RAP;So;0;ON;<compat> 6534;;;;N;;;;; +2F42;KANGXI RADICAL SCRIPT;So;0;ON;<compat> 6587;;;;N;;;;; +2F43;KANGXI RADICAL DIPPER;So;0;ON;<compat> 6597;;;;N;;;;; +2F44;KANGXI RADICAL AXE;So;0;ON;<compat> 65A4;;;;N;;;;; +2F45;KANGXI RADICAL SQUARE;So;0;ON;<compat> 65B9;;;;N;;;;; +2F46;KANGXI RADICAL NOT;So;0;ON;<compat> 65E0;;;;N;;;;; +2F47;KANGXI RADICAL SUN;So;0;ON;<compat> 65E5;;;;N;;;;; +2F48;KANGXI RADICAL SAY;So;0;ON;<compat> 66F0;;;;N;;;;; +2F49;KANGXI RADICAL MOON;So;0;ON;<compat> 6708;;;;N;;;;; +2F4A;KANGXI RADICAL TREE;So;0;ON;<compat> 6728;;;;N;;;;; +2F4B;KANGXI RADICAL LACK;So;0;ON;<compat> 6B20;;;;N;;;;; +2F4C;KANGXI RADICAL STOP;So;0;ON;<compat> 6B62;;;;N;;;;; +2F4D;KANGXI RADICAL DEATH;So;0;ON;<compat> 6B79;;;;N;;;;; +2F4E;KANGXI RADICAL WEAPON;So;0;ON;<compat> 6BB3;;;;N;;;;; +2F4F;KANGXI RADICAL DO NOT;So;0;ON;<compat> 6BCB;;;;N;;;;; +2F50;KANGXI RADICAL COMPARE;So;0;ON;<compat> 6BD4;;;;N;;;;; +2F51;KANGXI RADICAL FUR;So;0;ON;<compat> 6BDB;;;;N;;;;; +2F52;KANGXI RADICAL CLAN;So;0;ON;<compat> 6C0F;;;;N;;;;; +2F53;KANGXI RADICAL STEAM;So;0;ON;<compat> 6C14;;;;N;;;;; +2F54;KANGXI RADICAL WATER;So;0;ON;<compat> 6C34;;;;N;;;;; +2F55;KANGXI RADICAL FIRE;So;0;ON;<compat> 706B;;;;N;;;;; +2F56;KANGXI RADICAL CLAW;So;0;ON;<compat> 722A;;;;N;;;;; +2F57;KANGXI RADICAL FATHER;So;0;ON;<compat> 7236;;;;N;;;;; +2F58;KANGXI RADICAL DOUBLE X;So;0;ON;<compat> 723B;;;;N;;;;; +2F59;KANGXI RADICAL HALF TREE TRUNK;So;0;ON;<compat> 723F;;;;N;;;;; +2F5A;KANGXI RADICAL SLICE;So;0;ON;<compat> 7247;;;;N;;;;; +2F5B;KANGXI RADICAL FANG;So;0;ON;<compat> 7259;;;;N;;;;; +2F5C;KANGXI RADICAL COW;So;0;ON;<compat> 725B;;;;N;;;;; +2F5D;KANGXI RADICAL DOG;So;0;ON;<compat> 72AC;;;;N;;;;; +2F5E;KANGXI RADICAL PROFOUND;So;0;ON;<compat> 7384;;;;N;;;;; +2F5F;KANGXI RADICAL JADE;So;0;ON;<compat> 7389;;;;N;;;;; +2F60;KANGXI RADICAL MELON;So;0;ON;<compat> 74DC;;;;N;;;;; +2F61;KANGXI RADICAL TILE;So;0;ON;<compat> 74E6;;;;N;;;;; +2F62;KANGXI RADICAL SWEET;So;0;ON;<compat> 7518;;;;N;;;;; +2F63;KANGXI RADICAL LIFE;So;0;ON;<compat> 751F;;;;N;;;;; +2F64;KANGXI RADICAL USE;So;0;ON;<compat> 7528;;;;N;;;;; +2F65;KANGXI RADICAL FIELD;So;0;ON;<compat> 7530;;;;N;;;;; +2F66;KANGXI RADICAL BOLT OF CLOTH;So;0;ON;<compat> 758B;;;;N;;;;; +2F67;KANGXI RADICAL SICKNESS;So;0;ON;<compat> 7592;;;;N;;;;; +2F68;KANGXI RADICAL DOTTED TENT;So;0;ON;<compat> 7676;;;;N;;;;; +2F69;KANGXI RADICAL WHITE;So;0;ON;<compat> 767D;;;;N;;;;; +2F6A;KANGXI RADICAL SKIN;So;0;ON;<compat> 76AE;;;;N;;;;; +2F6B;KANGXI RADICAL DISH;So;0;ON;<compat> 76BF;;;;N;;;;; +2F6C;KANGXI RADICAL EYE;So;0;ON;<compat> 76EE;;;;N;;;;; +2F6D;KANGXI RADICAL SPEAR;So;0;ON;<compat> 77DB;;;;N;;;;; +2F6E;KANGXI RADICAL ARROW;So;0;ON;<compat> 77E2;;;;N;;;;; +2F6F;KANGXI RADICAL STONE;So;0;ON;<compat> 77F3;;;;N;;;;; +2F70;KANGXI RADICAL SPIRIT;So;0;ON;<compat> 793A;;;;N;;;;; +2F71;KANGXI RADICAL TRACK;So;0;ON;<compat> 79B8;;;;N;;;;; +2F72;KANGXI RADICAL GRAIN;So;0;ON;<compat> 79BE;;;;N;;;;; +2F73;KANGXI RADICAL CAVE;So;0;ON;<compat> 7A74;;;;N;;;;; +2F74;KANGXI RADICAL STAND;So;0;ON;<compat> 7ACB;;;;N;;;;; +2F75;KANGXI RADICAL BAMBOO;So;0;ON;<compat> 7AF9;;;;N;;;;; +2F76;KANGXI RADICAL RICE;So;0;ON;<compat> 7C73;;;;N;;;;; +2F77;KANGXI RADICAL SILK;So;0;ON;<compat> 7CF8;;;;N;;;;; +2F78;KANGXI RADICAL JAR;So;0;ON;<compat> 7F36;;;;N;;;;; +2F79;KANGXI RADICAL NET;So;0;ON;<compat> 7F51;;;;N;;;;; +2F7A;KANGXI RADICAL SHEEP;So;0;ON;<compat> 7F8A;;;;N;;;;; +2F7B;KANGXI RADICAL FEATHER;So;0;ON;<compat> 7FBD;;;;N;;;;; +2F7C;KANGXI RADICAL OLD;So;0;ON;<compat> 8001;;;;N;;;;; +2F7D;KANGXI RADICAL AND;So;0;ON;<compat> 800C;;;;N;;;;; +2F7E;KANGXI RADICAL PLOW;So;0;ON;<compat> 8012;;;;N;;;;; +2F7F;KANGXI RADICAL EAR;So;0;ON;<compat> 8033;;;;N;;;;; +2F80;KANGXI RADICAL BRUSH;So;0;ON;<compat> 807F;;;;N;;;;; +2F81;KANGXI RADICAL MEAT;So;0;ON;<compat> 8089;;;;N;;;;; +2F82;KANGXI RADICAL MINISTER;So;0;ON;<compat> 81E3;;;;N;;;;; +2F83;KANGXI RADICAL SELF;So;0;ON;<compat> 81EA;;;;N;;;;; +2F84;KANGXI RADICAL ARRIVE;So;0;ON;<compat> 81F3;;;;N;;;;; +2F85;KANGXI RADICAL MORTAR;So;0;ON;<compat> 81FC;;;;N;;;;; +2F86;KANGXI RADICAL TONGUE;So;0;ON;<compat> 820C;;;;N;;;;; +2F87;KANGXI RADICAL OPPOSE;So;0;ON;<compat> 821B;;;;N;;;;; +2F88;KANGXI RADICAL BOAT;So;0;ON;<compat> 821F;;;;N;;;;; +2F89;KANGXI RADICAL STOPPING;So;0;ON;<compat> 826E;;;;N;;;;; +2F8A;KANGXI RADICAL COLOR;So;0;ON;<compat> 8272;;;;N;;;;; +2F8B;KANGXI RADICAL GRASS;So;0;ON;<compat> 8278;;;;N;;;;; +2F8C;KANGXI RADICAL TIGER;So;0;ON;<compat> 864D;;;;N;;;;; +2F8D;KANGXI RADICAL INSECT;So;0;ON;<compat> 866B;;;;N;;;;; +2F8E;KANGXI RADICAL BLOOD;So;0;ON;<compat> 8840;;;;N;;;;; +2F8F;KANGXI RADICAL WALK ENCLOSURE;So;0;ON;<compat> 884C;;;;N;;;;; +2F90;KANGXI RADICAL CLOTHES;So;0;ON;<compat> 8863;;;;N;;;;; +2F91;KANGXI RADICAL WEST;So;0;ON;<compat> 897E;;;;N;;;;; +2F92;KANGXI RADICAL SEE;So;0;ON;<compat> 898B;;;;N;;;;; +2F93;KANGXI RADICAL HORN;So;0;ON;<compat> 89D2;;;;N;;;;; +2F94;KANGXI RADICAL SPEECH;So;0;ON;<compat> 8A00;;;;N;;;;; +2F95;KANGXI RADICAL VALLEY;So;0;ON;<compat> 8C37;;;;N;;;;; +2F96;KANGXI RADICAL BEAN;So;0;ON;<compat> 8C46;;;;N;;;;; +2F97;KANGXI RADICAL PIG;So;0;ON;<compat> 8C55;;;;N;;;;; +2F98;KANGXI RADICAL BADGER;So;0;ON;<compat> 8C78;;;;N;;;;; +2F99;KANGXI RADICAL SHELL;So;0;ON;<compat> 8C9D;;;;N;;;;; +2F9A;KANGXI RADICAL RED;So;0;ON;<compat> 8D64;;;;N;;;;; +2F9B;KANGXI RADICAL RUN;So;0;ON;<compat> 8D70;;;;N;;;;; +2F9C;KANGXI RADICAL FOOT;So;0;ON;<compat> 8DB3;;;;N;;;;; +2F9D;KANGXI RADICAL BODY;So;0;ON;<compat> 8EAB;;;;N;;;;; +2F9E;KANGXI RADICAL CART;So;0;ON;<compat> 8ECA;;;;N;;;;; +2F9F;KANGXI RADICAL BITTER;So;0;ON;<compat> 8F9B;;;;N;;;;; +2FA0;KANGXI RADICAL MORNING;So;0;ON;<compat> 8FB0;;;;N;;;;; +2FA1;KANGXI RADICAL WALK;So;0;ON;<compat> 8FB5;;;;N;;;;; +2FA2;KANGXI RADICAL CITY;So;0;ON;<compat> 9091;;;;N;;;;; +2FA3;KANGXI RADICAL WINE;So;0;ON;<compat> 9149;;;;N;;;;; +2FA4;KANGXI RADICAL DISTINGUISH;So;0;ON;<compat> 91C6;;;;N;;;;; +2FA5;KANGXI RADICAL VILLAGE;So;0;ON;<compat> 91CC;;;;N;;;;; +2FA6;KANGXI RADICAL GOLD;So;0;ON;<compat> 91D1;;;;N;;;;; +2FA7;KANGXI RADICAL LONG;So;0;ON;<compat> 9577;;;;N;;;;; +2FA8;KANGXI RADICAL GATE;So;0;ON;<compat> 9580;;;;N;;;;; +2FA9;KANGXI RADICAL MOUND;So;0;ON;<compat> 961C;;;;N;;;;; +2FAA;KANGXI RADICAL SLAVE;So;0;ON;<compat> 96B6;;;;N;;;;; +2FAB;KANGXI RADICAL SHORT TAILED BIRD;So;0;ON;<compat> 96B9;;;;N;;;;; +2FAC;KANGXI RADICAL RAIN;So;0;ON;<compat> 96E8;;;;N;;;;; +2FAD;KANGXI RADICAL BLUE;So;0;ON;<compat> 9751;;;;N;;;;; +2FAE;KANGXI RADICAL WRONG;So;0;ON;<compat> 975E;;;;N;;;;; +2FAF;KANGXI RADICAL FACE;So;0;ON;<compat> 9762;;;;N;;;;; +2FB0;KANGXI RADICAL LEATHER;So;0;ON;<compat> 9769;;;;N;;;;; +2FB1;KANGXI RADICAL TANNED LEATHER;So;0;ON;<compat> 97CB;;;;N;;;;; +2FB2;KANGXI RADICAL LEEK;So;0;ON;<compat> 97ED;;;;N;;;;; +2FB3;KANGXI RADICAL SOUND;So;0;ON;<compat> 97F3;;;;N;;;;; +2FB4;KANGXI RADICAL LEAF;So;0;ON;<compat> 9801;;;;N;;;;; +2FB5;KANGXI RADICAL WIND;So;0;ON;<compat> 98A8;;;;N;;;;; +2FB6;KANGXI RADICAL FLY;So;0;ON;<compat> 98DB;;;;N;;;;; +2FB7;KANGXI RADICAL EAT;So;0;ON;<compat> 98DF;;;;N;;;;; +2FB8;KANGXI RADICAL HEAD;So;0;ON;<compat> 9996;;;;N;;;;; +2FB9;KANGXI RADICAL FRAGRANT;So;0;ON;<compat> 9999;;;;N;;;;; +2FBA;KANGXI RADICAL HORSE;So;0;ON;<compat> 99AC;;;;N;;;;; +2FBB;KANGXI RADICAL BONE;So;0;ON;<compat> 9AA8;;;;N;;;;; +2FBC;KANGXI RADICAL TALL;So;0;ON;<compat> 9AD8;;;;N;;;;; +2FBD;KANGXI RADICAL HAIR;So;0;ON;<compat> 9ADF;;;;N;;;;; +2FBE;KANGXI RADICAL FIGHT;So;0;ON;<compat> 9B25;;;;N;;;;; +2FBF;KANGXI RADICAL SACRIFICIAL WINE;So;0;ON;<compat> 9B2F;;;;N;;;;; +2FC0;KANGXI RADICAL CAULDRON;So;0;ON;<compat> 9B32;;;;N;;;;; +2FC1;KANGXI RADICAL GHOST;So;0;ON;<compat> 9B3C;;;;N;;;;; +2FC2;KANGXI RADICAL FISH;So;0;ON;<compat> 9B5A;;;;N;;;;; +2FC3;KANGXI RADICAL BIRD;So;0;ON;<compat> 9CE5;;;;N;;;;; +2FC4;KANGXI RADICAL SALT;So;0;ON;<compat> 9E75;;;;N;;;;; +2FC5;KANGXI RADICAL DEER;So;0;ON;<compat> 9E7F;;;;N;;;;; +2FC6;KANGXI RADICAL WHEAT;So;0;ON;<compat> 9EA5;;;;N;;;;; +2FC7;KANGXI RADICAL HEMP;So;0;ON;<compat> 9EBB;;;;N;;;;; +2FC8;KANGXI RADICAL YELLOW;So;0;ON;<compat> 9EC3;;;;N;;;;; +2FC9;KANGXI RADICAL MILLET;So;0;ON;<compat> 9ECD;;;;N;;;;; +2FCA;KANGXI RADICAL BLACK;So;0;ON;<compat> 9ED1;;;;N;;;;; +2FCB;KANGXI RADICAL EMBROIDERY;So;0;ON;<compat> 9EF9;;;;N;;;;; +2FCC;KANGXI RADICAL FROG;So;0;ON;<compat> 9EFD;;;;N;;;;; +2FCD;KANGXI RADICAL TRIPOD;So;0;ON;<compat> 9F0E;;;;N;;;;; +2FCE;KANGXI RADICAL DRUM;So;0;ON;<compat> 9F13;;;;N;;;;; +2FCF;KANGXI RADICAL RAT;So;0;ON;<compat> 9F20;;;;N;;;;; +2FD0;KANGXI RADICAL NOSE;So;0;ON;<compat> 9F3B;;;;N;;;;; +2FD1;KANGXI RADICAL EVEN;So;0;ON;<compat> 9F4A;;;;N;;;;; +2FD2;KANGXI RADICAL TOOTH;So;0;ON;<compat> 9F52;;;;N;;;;; +2FD3;KANGXI RADICAL DRAGON;So;0;ON;<compat> 9F8D;;;;N;;;;; +2FD4;KANGXI RADICAL TURTLE;So;0;ON;<compat> 9F9C;;;;N;;;;; +2FD5;KANGXI RADICAL FLUTE;So;0;ON;<compat> 9FA0;;;;N;;;;; +2FF0;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT;So;0;ON;;;;;N;;;;; +2FF1;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW;So;0;ON;;;;;N;;;;; +2FF2;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT;So;0;ON;;;;;N;;;;; +2FF3;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW;So;0;ON;;;;;N;;;;; +2FF4;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND;So;0;ON;;;;;N;;;;; +2FF5;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE;So;0;ON;;;;;N;;;;; +2FF6;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW;So;0;ON;;;;;N;;;;; +2FF7;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT;So;0;ON;;;;;N;;;;; +2FF8;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT;So;0;ON;;;;;N;;;;; +2FF9;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT;So;0;ON;;;;;N;;;;; +2FFA;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT;So;0;ON;;;;;N;;;;; +2FFB;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID;So;0;ON;;;;;N;;;;; +3000;IDEOGRAPHIC SPACE;Zs;0;WS;<wide> 0020;;;;N;;;;; +3001;IDEOGRAPHIC COMMA;Po;0;ON;;;;;N;;;;; +3002;IDEOGRAPHIC FULL STOP;Po;0;ON;;;;;N;IDEOGRAPHIC PERIOD;;;; +3003;DITTO MARK;Po;0;ON;;;;;N;;;;; +3004;JAPANESE INDUSTRIAL STANDARD SYMBOL;So;0;ON;;;;;N;;;;; +3005;IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; +3006;IDEOGRAPHIC CLOSING MARK;Lo;0;L;;;;;N;;;;; +3007;IDEOGRAPHIC NUMBER ZERO;Nl;0;L;;;;0;N;;;;; +3008;LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING ANGLE BRACKET;;;; +3009;RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING ANGLE BRACKET;;;; +300A;LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING DOUBLE ANGLE BRACKET;;;; +300B;RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING DOUBLE ANGLE BRACKET;;;; +300C;LEFT CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING CORNER BRACKET;;;; +300D;RIGHT CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING CORNER BRACKET;;;; +300E;LEFT WHITE CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE CORNER BRACKET;;;; +300F;RIGHT WHITE CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE CORNER BRACKET;;;; +3010;LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING BLACK LENTICULAR BRACKET;;;; +3011;RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING BLACK LENTICULAR BRACKET;;;; +3012;POSTAL MARK;So;0;ON;;;;;N;;;;; +3013;GETA MARK;So;0;ON;;;;;N;;;;; +3014;LEFT TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING TORTOISE SHELL BRACKET;;;; +3015;RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING TORTOISE SHELL BRACKET;;;; +3016;LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE LENTICULAR BRACKET;;;; +3017;RIGHT WHITE LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE LENTICULAR BRACKET;;;; +3018;LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE TORTOISE SHELL BRACKET;;;; +3019;RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE TORTOISE SHELL BRACKET;;;; +301A;LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE SQUARE BRACKET;;;; +301B;RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE SQUARE BRACKET;;;; +301C;WAVE DASH;Pd;0;ON;;;;;N;;;;; +301D;REVERSED DOUBLE PRIME QUOTATION MARK;Ps;0;ON;;;;;N;;;;; +301E;DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; +301F;LOW DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; +3020;POSTAL MARK FACE;So;0;ON;;;;;N;;;;; +3021;HANGZHOU NUMERAL ONE;Nl;0;L;;;;1;N;;;;; +3022;HANGZHOU NUMERAL TWO;Nl;0;L;;;;2;N;;;;; +3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;; +3024;HANGZHOU NUMERAL FOUR;Nl;0;L;;;;4;N;;;;; +3025;HANGZHOU NUMERAL FIVE;Nl;0;L;;;;5;N;;;;; +3026;HANGZHOU NUMERAL SIX;Nl;0;L;;;;6;N;;;;; +3027;HANGZHOU NUMERAL SEVEN;Nl;0;L;;;;7;N;;;;; +3028;HANGZHOU NUMERAL EIGHT;Nl;0;L;;;;8;N;;;;; +3029;HANGZHOU NUMERAL NINE;Nl;0;L;;;;9;N;;;;; +302A;IDEOGRAPHIC LEVEL TONE MARK;Mn;218;NSM;;;;;N;;;;; +302B;IDEOGRAPHIC RISING TONE MARK;Mn;228;NSM;;;;;N;;;;; +302C;IDEOGRAPHIC DEPARTING TONE MARK;Mn;232;NSM;;;;;N;;;;; +302D;IDEOGRAPHIC ENTERING TONE MARK;Mn;222;NSM;;;;;N;;;;; +302E;HANGUL SINGLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;; +302F;HANGUL DOUBLE DOT TONE MARK;Mn;224;NSM;;;;;N;;;;; +3030;WAVY DASH;Pd;0;ON;;;;;N;;;;; +3031;VERTICAL KANA REPEAT MARK;Lm;0;L;;;;;N;;;;; +3032;VERTICAL KANA REPEAT WITH VOICED SOUND MARK;Lm;0;L;;;;;N;;;;; +3033;VERTICAL KANA REPEAT MARK UPPER HALF;Lm;0;L;;;;;N;;;;; +3034;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF;Lm;0;L;;;;;N;;;;; +3035;VERTICAL KANA REPEAT MARK LOWER HALF;Lm;0;L;;;;;N;;;;; +3036;CIRCLED POSTAL MARK;So;0;ON;<compat> 3012;;;;N;;;;; +3037;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL;So;0;ON;;;;;N;;;;; +3038;HANGZHOU NUMERAL TEN;Nl;0;L;<compat> 5341;;;10;N;;;;; +3039;HANGZHOU NUMERAL TWENTY;Nl;0;L;<compat> 5344;;;20;N;;;;; +303A;HANGZHOU NUMERAL THIRTY;Nl;0;L;<compat> 5345;;;30;N;;;;; +303B;VERTICAL IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; +303C;MASU MARK;Lo;0;L;;;;;N;;;;; +303D;PART ALTERNATION MARK;Po;0;ON;;;;;N;;;;; +303E;IDEOGRAPHIC VARIATION INDICATOR;So;0;ON;;;;;N;;;;; +303F;IDEOGRAPHIC HALF FILL SPACE;So;0;ON;;;;;N;;;;; +3041;HIRAGANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +3042;HIRAGANA LETTER A;Lo;0;L;;;;;N;;;;; +3043;HIRAGANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; +3044;HIRAGANA LETTER I;Lo;0;L;;;;;N;;;;; +3045;HIRAGANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; +3046;HIRAGANA LETTER U;Lo;0;L;;;;;N;;;;; +3047;HIRAGANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; +3048;HIRAGANA LETTER E;Lo;0;L;;;;;N;;;;; +3049;HIRAGANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; +304A;HIRAGANA LETTER O;Lo;0;L;;;;;N;;;;; +304B;HIRAGANA LETTER KA;Lo;0;L;;;;;N;;;;; +304C;HIRAGANA LETTER GA;Lo;0;L;304B 3099;;;;N;;;;; +304D;HIRAGANA LETTER KI;Lo;0;L;;;;;N;;;;; +304E;HIRAGANA LETTER GI;Lo;0;L;304D 3099;;;;N;;;;; +304F;HIRAGANA LETTER KU;Lo;0;L;;;;;N;;;;; +3050;HIRAGANA LETTER GU;Lo;0;L;304F 3099;;;;N;;;;; +3051;HIRAGANA LETTER KE;Lo;0;L;;;;;N;;;;; +3052;HIRAGANA LETTER GE;Lo;0;L;3051 3099;;;;N;;;;; +3053;HIRAGANA LETTER KO;Lo;0;L;;;;;N;;;;; +3054;HIRAGANA LETTER GO;Lo;0;L;3053 3099;;;;N;;;;; +3055;HIRAGANA LETTER SA;Lo;0;L;;;;;N;;;;; +3056;HIRAGANA LETTER ZA;Lo;0;L;3055 3099;;;;N;;;;; +3057;HIRAGANA LETTER SI;Lo;0;L;;;;;N;;;;; +3058;HIRAGANA LETTER ZI;Lo;0;L;3057 3099;;;;N;;;;; +3059;HIRAGANA LETTER SU;Lo;0;L;;;;;N;;;;; +305A;HIRAGANA LETTER ZU;Lo;0;L;3059 3099;;;;N;;;;; +305B;HIRAGANA LETTER SE;Lo;0;L;;;;;N;;;;; +305C;HIRAGANA LETTER ZE;Lo;0;L;305B 3099;;;;N;;;;; +305D;HIRAGANA LETTER SO;Lo;0;L;;;;;N;;;;; +305E;HIRAGANA LETTER ZO;Lo;0;L;305D 3099;;;;N;;;;; +305F;HIRAGANA LETTER TA;Lo;0;L;;;;;N;;;;; +3060;HIRAGANA LETTER DA;Lo;0;L;305F 3099;;;;N;;;;; +3061;HIRAGANA LETTER TI;Lo;0;L;;;;;N;;;;; +3062;HIRAGANA LETTER DI;Lo;0;L;3061 3099;;;;N;;;;; +3063;HIRAGANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; +3064;HIRAGANA LETTER TU;Lo;0;L;;;;;N;;;;; +3065;HIRAGANA LETTER DU;Lo;0;L;3064 3099;;;;N;;;;; +3066;HIRAGANA LETTER TE;Lo;0;L;;;;;N;;;;; +3067;HIRAGANA LETTER DE;Lo;0;L;3066 3099;;;;N;;;;; +3068;HIRAGANA LETTER TO;Lo;0;L;;;;;N;;;;; +3069;HIRAGANA LETTER DO;Lo;0;L;3068 3099;;;;N;;;;; +306A;HIRAGANA LETTER NA;Lo;0;L;;;;;N;;;;; +306B;HIRAGANA LETTER NI;Lo;0;L;;;;;N;;;;; +306C;HIRAGANA LETTER NU;Lo;0;L;;;;;N;;;;; +306D;HIRAGANA LETTER NE;Lo;0;L;;;;;N;;;;; +306E;HIRAGANA LETTER NO;Lo;0;L;;;;;N;;;;; +306F;HIRAGANA LETTER HA;Lo;0;L;;;;;N;;;;; +3070;HIRAGANA LETTER BA;Lo;0;L;306F 3099;;;;N;;;;; +3071;HIRAGANA LETTER PA;Lo;0;L;306F 309A;;;;N;;;;; +3072;HIRAGANA LETTER HI;Lo;0;L;;;;;N;;;;; +3073;HIRAGANA LETTER BI;Lo;0;L;3072 3099;;;;N;;;;; +3074;HIRAGANA LETTER PI;Lo;0;L;3072 309A;;;;N;;;;; +3075;HIRAGANA LETTER HU;Lo;0;L;;;;;N;;;;; +3076;HIRAGANA LETTER BU;Lo;0;L;3075 3099;;;;N;;;;; +3077;HIRAGANA LETTER PU;Lo;0;L;3075 309A;;;;N;;;;; +3078;HIRAGANA LETTER HE;Lo;0;L;;;;;N;;;;; +3079;HIRAGANA LETTER BE;Lo;0;L;3078 3099;;;;N;;;;; +307A;HIRAGANA LETTER PE;Lo;0;L;3078 309A;;;;N;;;;; +307B;HIRAGANA LETTER HO;Lo;0;L;;;;;N;;;;; +307C;HIRAGANA LETTER BO;Lo;0;L;307B 3099;;;;N;;;;; +307D;HIRAGANA LETTER PO;Lo;0;L;307B 309A;;;;N;;;;; +307E;HIRAGANA LETTER MA;Lo;0;L;;;;;N;;;;; +307F;HIRAGANA LETTER MI;Lo;0;L;;;;;N;;;;; +3080;HIRAGANA LETTER MU;Lo;0;L;;;;;N;;;;; +3081;HIRAGANA LETTER ME;Lo;0;L;;;;;N;;;;; +3082;HIRAGANA LETTER MO;Lo;0;L;;;;;N;;;;; +3083;HIRAGANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; +3084;HIRAGANA LETTER YA;Lo;0;L;;;;;N;;;;; +3085;HIRAGANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; +3086;HIRAGANA LETTER YU;Lo;0;L;;;;;N;;;;; +3087;HIRAGANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; +3088;HIRAGANA LETTER YO;Lo;0;L;;;;;N;;;;; +3089;HIRAGANA LETTER RA;Lo;0;L;;;;;N;;;;; +308A;HIRAGANA LETTER RI;Lo;0;L;;;;;N;;;;; +308B;HIRAGANA LETTER RU;Lo;0;L;;;;;N;;;;; +308C;HIRAGANA LETTER RE;Lo;0;L;;;;;N;;;;; +308D;HIRAGANA LETTER RO;Lo;0;L;;;;;N;;;;; +308E;HIRAGANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; +308F;HIRAGANA LETTER WA;Lo;0;L;;;;;N;;;;; +3090;HIRAGANA LETTER WI;Lo;0;L;;;;;N;;;;; +3091;HIRAGANA LETTER WE;Lo;0;L;;;;;N;;;;; +3092;HIRAGANA LETTER WO;Lo;0;L;;;;;N;;;;; +3093;HIRAGANA LETTER N;Lo;0;L;;;;;N;;;;; +3094;HIRAGANA LETTER VU;Lo;0;L;3046 3099;;;;N;;;;; +3095;HIRAGANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; +3096;HIRAGANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; +3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;; +309A;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;;;; +309B;KATAKANA-HIRAGANA VOICED SOUND MARK;Sk;0;ON;<compat> 0020 3099;;;;N;;;;; +309C;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Sk;0;ON;<compat> 0020 309A;;;;N;;;;; +309D;HIRAGANA ITERATION MARK;Lm;0;L;;;;;N;;;;; +309E;HIRAGANA VOICED ITERATION MARK;Lm;0;L;309D 3099;;;;N;;;;; +309F;HIRAGANA DIGRAPH YORI;Lo;0;L;<vertical> 3088 308A;;;;N;;;;; +30A0;KATAKANA-HIRAGANA DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;; +30A1;KATAKANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +30A2;KATAKANA LETTER A;Lo;0;L;;;;;N;;;;; +30A3;KATAKANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; +30A4;KATAKANA LETTER I;Lo;0;L;;;;;N;;;;; +30A5;KATAKANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; +30A6;KATAKANA LETTER U;Lo;0;L;;;;;N;;;;; +30A7;KATAKANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; +30A8;KATAKANA LETTER E;Lo;0;L;;;;;N;;;;; +30A9;KATAKANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; +30AA;KATAKANA LETTER O;Lo;0;L;;;;;N;;;;; +30AB;KATAKANA LETTER KA;Lo;0;L;;;;;N;;;;; +30AC;KATAKANA LETTER GA;Lo;0;L;30AB 3099;;;;N;;;;; +30AD;KATAKANA LETTER KI;Lo;0;L;;;;;N;;;;; +30AE;KATAKANA LETTER GI;Lo;0;L;30AD 3099;;;;N;;;;; +30AF;KATAKANA LETTER KU;Lo;0;L;;;;;N;;;;; +30B0;KATAKANA LETTER GU;Lo;0;L;30AF 3099;;;;N;;;;; +30B1;KATAKANA LETTER KE;Lo;0;L;;;;;N;;;;; +30B2;KATAKANA LETTER GE;Lo;0;L;30B1 3099;;;;N;;;;; +30B3;KATAKANA LETTER KO;Lo;0;L;;;;;N;;;;; +30B4;KATAKANA LETTER GO;Lo;0;L;30B3 3099;;;;N;;;;; +30B5;KATAKANA LETTER SA;Lo;0;L;;;;;N;;;;; +30B6;KATAKANA LETTER ZA;Lo;0;L;30B5 3099;;;;N;;;;; +30B7;KATAKANA LETTER SI;Lo;0;L;;;;;N;;;;; +30B8;KATAKANA LETTER ZI;Lo;0;L;30B7 3099;;;;N;;;;; +30B9;KATAKANA LETTER SU;Lo;0;L;;;;;N;;;;; +30BA;KATAKANA LETTER ZU;Lo;0;L;30B9 3099;;;;N;;;;; +30BB;KATAKANA LETTER SE;Lo;0;L;;;;;N;;;;; +30BC;KATAKANA LETTER ZE;Lo;0;L;30BB 3099;;;;N;;;;; +30BD;KATAKANA LETTER SO;Lo;0;L;;;;;N;;;;; +30BE;KATAKANA LETTER ZO;Lo;0;L;30BD 3099;;;;N;;;;; +30BF;KATAKANA LETTER TA;Lo;0;L;;;;;N;;;;; +30C0;KATAKANA LETTER DA;Lo;0;L;30BF 3099;;;;N;;;;; +30C1;KATAKANA LETTER TI;Lo;0;L;;;;;N;;;;; +30C2;KATAKANA LETTER DI;Lo;0;L;30C1 3099;;;;N;;;;; +30C3;KATAKANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; +30C4;KATAKANA LETTER TU;Lo;0;L;;;;;N;;;;; +30C5;KATAKANA LETTER DU;Lo;0;L;30C4 3099;;;;N;;;;; +30C6;KATAKANA LETTER TE;Lo;0;L;;;;;N;;;;; +30C7;KATAKANA LETTER DE;Lo;0;L;30C6 3099;;;;N;;;;; +30C8;KATAKANA LETTER TO;Lo;0;L;;;;;N;;;;; +30C9;KATAKANA LETTER DO;Lo;0;L;30C8 3099;;;;N;;;;; +30CA;KATAKANA LETTER NA;Lo;0;L;;;;;N;;;;; +30CB;KATAKANA LETTER NI;Lo;0;L;;;;;N;;;;; +30CC;KATAKANA LETTER NU;Lo;0;L;;;;;N;;;;; +30CD;KATAKANA LETTER NE;Lo;0;L;;;;;N;;;;; +30CE;KATAKANA LETTER NO;Lo;0;L;;;;;N;;;;; +30CF;KATAKANA LETTER HA;Lo;0;L;;;;;N;;;;; +30D0;KATAKANA LETTER BA;Lo;0;L;30CF 3099;;;;N;;;;; +30D1;KATAKANA LETTER PA;Lo;0;L;30CF 309A;;;;N;;;;; +30D2;KATAKANA LETTER HI;Lo;0;L;;;;;N;;;;; +30D3;KATAKANA LETTER BI;Lo;0;L;30D2 3099;;;;N;;;;; +30D4;KATAKANA LETTER PI;Lo;0;L;30D2 309A;;;;N;;;;; +30D5;KATAKANA LETTER HU;Lo;0;L;;;;;N;;;;; +30D6;KATAKANA LETTER BU;Lo;0;L;30D5 3099;;;;N;;;;; +30D7;KATAKANA LETTER PU;Lo;0;L;30D5 309A;;;;N;;;;; +30D8;KATAKANA LETTER HE;Lo;0;L;;;;;N;;;;; +30D9;KATAKANA LETTER BE;Lo;0;L;30D8 3099;;;;N;;;;; +30DA;KATAKANA LETTER PE;Lo;0;L;30D8 309A;;;;N;;;;; +30DB;KATAKANA LETTER HO;Lo;0;L;;;;;N;;;;; +30DC;KATAKANA LETTER BO;Lo;0;L;30DB 3099;;;;N;;;;; +30DD;KATAKANA LETTER PO;Lo;0;L;30DB 309A;;;;N;;;;; +30DE;KATAKANA LETTER MA;Lo;0;L;;;;;N;;;;; +30DF;KATAKANA LETTER MI;Lo;0;L;;;;;N;;;;; +30E0;KATAKANA LETTER MU;Lo;0;L;;;;;N;;;;; +30E1;KATAKANA LETTER ME;Lo;0;L;;;;;N;;;;; +30E2;KATAKANA LETTER MO;Lo;0;L;;;;;N;;;;; +30E3;KATAKANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; +30E4;KATAKANA LETTER YA;Lo;0;L;;;;;N;;;;; +30E5;KATAKANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; +30E6;KATAKANA LETTER YU;Lo;0;L;;;;;N;;;;; +30E7;KATAKANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; +30E8;KATAKANA LETTER YO;Lo;0;L;;;;;N;;;;; +30E9;KATAKANA LETTER RA;Lo;0;L;;;;;N;;;;; +30EA;KATAKANA LETTER RI;Lo;0;L;;;;;N;;;;; +30EB;KATAKANA LETTER RU;Lo;0;L;;;;;N;;;;; +30EC;KATAKANA LETTER RE;Lo;0;L;;;;;N;;;;; +30ED;KATAKANA LETTER RO;Lo;0;L;;;;;N;;;;; +30EE;KATAKANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; +30EF;KATAKANA LETTER WA;Lo;0;L;;;;;N;;;;; +30F0;KATAKANA LETTER WI;Lo;0;L;;;;;N;;;;; +30F1;KATAKANA LETTER WE;Lo;0;L;;;;;N;;;;; +30F2;KATAKANA LETTER WO;Lo;0;L;;;;;N;;;;; +30F3;KATAKANA LETTER N;Lo;0;L;;;;;N;;;;; +30F4;KATAKANA LETTER VU;Lo;0;L;30A6 3099;;;;N;;;;; +30F5;KATAKANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; +30F6;KATAKANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; +30F7;KATAKANA LETTER VA;Lo;0;L;30EF 3099;;;;N;;;;; +30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;; +30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;; +30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;; +30FB;KATAKANA MIDDLE DOT;Po;0;ON;;;;;N;;;;; +30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;; +30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;; +30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;; +30FF;KATAKANA DIGRAPH KOTO;Lo;0;L;<vertical> 30B3 30C8;;;;N;;;;; +3105;BOPOMOFO LETTER B;Lo;0;L;;;;;N;;;;; +3106;BOPOMOFO LETTER P;Lo;0;L;;;;;N;;;;; +3107;BOPOMOFO LETTER M;Lo;0;L;;;;;N;;;;; +3108;BOPOMOFO LETTER F;Lo;0;L;;;;;N;;;;; +3109;BOPOMOFO LETTER D;Lo;0;L;;;;;N;;;;; +310A;BOPOMOFO LETTER T;Lo;0;L;;;;;N;;;;; +310B;BOPOMOFO LETTER N;Lo;0;L;;;;;N;;;;; +310C;BOPOMOFO LETTER L;Lo;0;L;;;;;N;;;;; +310D;BOPOMOFO LETTER G;Lo;0;L;;;;;N;;;;; +310E;BOPOMOFO LETTER K;Lo;0;L;;;;;N;;;;; +310F;BOPOMOFO LETTER H;Lo;0;L;;;;;N;;;;; +3110;BOPOMOFO LETTER J;Lo;0;L;;;;;N;;;;; +3111;BOPOMOFO LETTER Q;Lo;0;L;;;;;N;;;;; +3112;BOPOMOFO LETTER X;Lo;0;L;;;;;N;;;;; +3113;BOPOMOFO LETTER ZH;Lo;0;L;;;;;N;;;;; +3114;BOPOMOFO LETTER CH;Lo;0;L;;;;;N;;;;; +3115;BOPOMOFO LETTER SH;Lo;0;L;;;;;N;;;;; +3116;BOPOMOFO LETTER R;Lo;0;L;;;;;N;;;;; +3117;BOPOMOFO LETTER Z;Lo;0;L;;;;;N;;;;; +3118;BOPOMOFO LETTER C;Lo;0;L;;;;;N;;;;; +3119;BOPOMOFO LETTER S;Lo;0;L;;;;;N;;;;; +311A;BOPOMOFO LETTER A;Lo;0;L;;;;;N;;;;; +311B;BOPOMOFO LETTER O;Lo;0;L;;;;;N;;;;; +311C;BOPOMOFO LETTER E;Lo;0;L;;;;;N;;;;; +311D;BOPOMOFO LETTER EH;Lo;0;L;;;;;N;;;;; +311E;BOPOMOFO LETTER AI;Lo;0;L;;;;;N;;;;; +311F;BOPOMOFO LETTER EI;Lo;0;L;;;;;N;;;;; +3120;BOPOMOFO LETTER AU;Lo;0;L;;;;;N;;;;; +3121;BOPOMOFO LETTER OU;Lo;0;L;;;;;N;;;;; +3122;BOPOMOFO LETTER AN;Lo;0;L;;;;;N;;;;; +3123;BOPOMOFO LETTER EN;Lo;0;L;;;;;N;;;;; +3124;BOPOMOFO LETTER ANG;Lo;0;L;;;;;N;;;;; +3125;BOPOMOFO LETTER ENG;Lo;0;L;;;;;N;;;;; +3126;BOPOMOFO LETTER ER;Lo;0;L;;;;;N;;;;; +3127;BOPOMOFO LETTER I;Lo;0;L;;;;;N;;;;; +3128;BOPOMOFO LETTER U;Lo;0;L;;;;;N;;;;; +3129;BOPOMOFO LETTER IU;Lo;0;L;;;;;N;;;;; +312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;; +312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;; +312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;; +312D;BOPOMOFO LETTER IH;Lo;0;L;;;;;N;;;;; +3131;HANGUL LETTER KIYEOK;Lo;0;L;<compat> 1100;;;;N;HANGUL LETTER GIYEOG;;;; +3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L;<compat> 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;; +3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<compat> 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; +3134;HANGUL LETTER NIEUN;Lo;0;L;<compat> 1102;;;;N;;;;; +3135;HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<compat> 11AC;;;;N;HANGUL LETTER NIEUN JIEUJ;;;; +3136;HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<compat> 11AD;;;;N;HANGUL LETTER NIEUN HIEUH;;;; +3137;HANGUL LETTER TIKEUT;Lo;0;L;<compat> 1103;;;;N;HANGUL LETTER DIGEUD;;;; +3138;HANGUL LETTER SSANGTIKEUT;Lo;0;L;<compat> 1104;;;;N;HANGUL LETTER SSANG DIGEUD;;;; +3139;HANGUL LETTER RIEUL;Lo;0;L;<compat> 1105;;;;N;HANGUL LETTER LIEUL;;;; +313A;HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<compat> 11B0;;;;N;HANGUL LETTER LIEUL GIYEOG;;;; +313B;HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<compat> 11B1;;;;N;HANGUL LETTER LIEUL MIEUM;;;; +313C;HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<compat> 11B2;;;;N;HANGUL LETTER LIEUL BIEUB;;;; +313D;HANGUL LETTER RIEUL-SIOS;Lo;0;L;<compat> 11B3;;;;N;HANGUL LETTER LIEUL SIOS;;;; +313E;HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<compat> 11B4;;;;N;HANGUL LETTER LIEUL TIEUT;;;; +313F;HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<compat> 11B5;;;;N;HANGUL LETTER LIEUL PIEUP;;;; +3140;HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<compat> 111A;;;;N;HANGUL LETTER LIEUL HIEUH;;;; +3141;HANGUL LETTER MIEUM;Lo;0;L;<compat> 1106;;;;N;;;;; +3142;HANGUL LETTER PIEUP;Lo;0;L;<compat> 1107;;;;N;HANGUL LETTER BIEUB;;;; +3143;HANGUL LETTER SSANGPIEUP;Lo;0;L;<compat> 1108;;;;N;HANGUL LETTER SSANG BIEUB;;;; +3144;HANGUL LETTER PIEUP-SIOS;Lo;0;L;<compat> 1121;;;;N;HANGUL LETTER BIEUB SIOS;;;; +3145;HANGUL LETTER SIOS;Lo;0;L;<compat> 1109;;;;N;;;;; +3146;HANGUL LETTER SSANGSIOS;Lo;0;L;<compat> 110A;;;;N;HANGUL LETTER SSANG SIOS;;;; +3147;HANGUL LETTER IEUNG;Lo;0;L;<compat> 110B;;;;N;;;;; +3148;HANGUL LETTER CIEUC;Lo;0;L;<compat> 110C;;;;N;HANGUL LETTER JIEUJ;;;; +3149;HANGUL LETTER SSANGCIEUC;Lo;0;L;<compat> 110D;;;;N;HANGUL LETTER SSANG JIEUJ;;;; +314A;HANGUL LETTER CHIEUCH;Lo;0;L;<compat> 110E;;;;N;HANGUL LETTER CIEUC;;;; +314B;HANGUL LETTER KHIEUKH;Lo;0;L;<compat> 110F;;;;N;HANGUL LETTER KIYEOK;;;; +314C;HANGUL LETTER THIEUTH;Lo;0;L;<compat> 1110;;;;N;HANGUL LETTER TIEUT;;;; +314D;HANGUL LETTER PHIEUPH;Lo;0;L;<compat> 1111;;;;N;HANGUL LETTER PIEUP;;;; +314E;HANGUL LETTER HIEUH;Lo;0;L;<compat> 1112;;;;N;;;;; +314F;HANGUL LETTER A;Lo;0;L;<compat> 1161;;;;N;;;;; +3150;HANGUL LETTER AE;Lo;0;L;<compat> 1162;;;;N;;;;; +3151;HANGUL LETTER YA;Lo;0;L;<compat> 1163;;;;N;;;;; +3152;HANGUL LETTER YAE;Lo;0;L;<compat> 1164;;;;N;;;;; +3153;HANGUL LETTER EO;Lo;0;L;<compat> 1165;;;;N;;;;; +3154;HANGUL LETTER E;Lo;0;L;<compat> 1166;;;;N;;;;; +3155;HANGUL LETTER YEO;Lo;0;L;<compat> 1167;;;;N;;;;; +3156;HANGUL LETTER YE;Lo;0;L;<compat> 1168;;;;N;;;;; +3157;HANGUL LETTER O;Lo;0;L;<compat> 1169;;;;N;;;;; +3158;HANGUL LETTER WA;Lo;0;L;<compat> 116A;;;;N;;;;; +3159;HANGUL LETTER WAE;Lo;0;L;<compat> 116B;;;;N;;;;; +315A;HANGUL LETTER OE;Lo;0;L;<compat> 116C;;;;N;;;;; +315B;HANGUL LETTER YO;Lo;0;L;<compat> 116D;;;;N;;;;; +315C;HANGUL LETTER U;Lo;0;L;<compat> 116E;;;;N;;;;; +315D;HANGUL LETTER WEO;Lo;0;L;<compat> 116F;;;;N;;;;; +315E;HANGUL LETTER WE;Lo;0;L;<compat> 1170;;;;N;;;;; +315F;HANGUL LETTER WI;Lo;0;L;<compat> 1171;;;;N;;;;; +3160;HANGUL LETTER YU;Lo;0;L;<compat> 1172;;;;N;;;;; +3161;HANGUL LETTER EU;Lo;0;L;<compat> 1173;;;;N;;;;; +3162;HANGUL LETTER YI;Lo;0;L;<compat> 1174;;;;N;;;;; +3163;HANGUL LETTER I;Lo;0;L;<compat> 1175;;;;N;;;;; +3164;HANGUL FILLER;Lo;0;L;<compat> 1160;;;;N;HANGUL CAE OM;;;; +3165;HANGUL LETTER SSANGNIEUN;Lo;0;L;<compat> 1114;;;;N;HANGUL LETTER SSANG NIEUN;;;; +3166;HANGUL LETTER NIEUN-TIKEUT;Lo;0;L;<compat> 1115;;;;N;HANGUL LETTER NIEUN DIGEUD;;;; +3167;HANGUL LETTER NIEUN-SIOS;Lo;0;L;<compat> 11C7;;;;N;HANGUL LETTER NIEUN SIOS;;;; +3168;HANGUL LETTER NIEUN-PANSIOS;Lo;0;L;<compat> 11C8;;;;N;HANGUL LETTER NIEUN BAN CHI EUM;;;; +3169;HANGUL LETTER RIEUL-KIYEOK-SIOS;Lo;0;L;<compat> 11CC;;;;N;HANGUL LETTER LIEUL GIYEOG SIOS;;;; +316A;HANGUL LETTER RIEUL-TIKEUT;Lo;0;L;<compat> 11CE;;;;N;HANGUL LETTER LIEUL DIGEUD;;;; +316B;HANGUL LETTER RIEUL-PIEUP-SIOS;Lo;0;L;<compat> 11D3;;;;N;HANGUL LETTER LIEUL BIEUB SIOS;;;; +316C;HANGUL LETTER RIEUL-PANSIOS;Lo;0;L;<compat> 11D7;;;;N;HANGUL LETTER LIEUL BAN CHI EUM;;;; +316D;HANGUL LETTER RIEUL-YEORINHIEUH;Lo;0;L;<compat> 11D9;;;;N;HANGUL LETTER LIEUL YEOLIN HIEUH;;;; +316E;HANGUL LETTER MIEUM-PIEUP;Lo;0;L;<compat> 111C;;;;N;HANGUL LETTER MIEUM BIEUB;;;; +316F;HANGUL LETTER MIEUM-SIOS;Lo;0;L;<compat> 11DD;;;;N;HANGUL LETTER MIEUM SIOS;;;; +3170;HANGUL LETTER MIEUM-PANSIOS;Lo;0;L;<compat> 11DF;;;;N;HANGUL LETTER BIEUB BAN CHI EUM;;;; +3171;HANGUL LETTER KAPYEOUNMIEUM;Lo;0;L;<compat> 111D;;;;N;HANGUL LETTER MIEUM SUN GYEONG EUM;;;; +3172;HANGUL LETTER PIEUP-KIYEOK;Lo;0;L;<compat> 111E;;;;N;HANGUL LETTER BIEUB GIYEOG;;;; +3173;HANGUL LETTER PIEUP-TIKEUT;Lo;0;L;<compat> 1120;;;;N;HANGUL LETTER BIEUB DIGEUD;;;; +3174;HANGUL LETTER PIEUP-SIOS-KIYEOK;Lo;0;L;<compat> 1122;;;;N;HANGUL LETTER BIEUB SIOS GIYEOG;;;; +3175;HANGUL LETTER PIEUP-SIOS-TIKEUT;Lo;0;L;<compat> 1123;;;;N;HANGUL LETTER BIEUB SIOS DIGEUD;;;; +3176;HANGUL LETTER PIEUP-CIEUC;Lo;0;L;<compat> 1127;;;;N;HANGUL LETTER BIEUB JIEUJ;;;; +3177;HANGUL LETTER PIEUP-THIEUTH;Lo;0;L;<compat> 1129;;;;N;HANGUL LETTER BIEUB TIEUT;;;; +3178;HANGUL LETTER KAPYEOUNPIEUP;Lo;0;L;<compat> 112B;;;;N;HANGUL LETTER BIEUB SUN GYEONG EUM;;;; +3179;HANGUL LETTER KAPYEOUNSSANGPIEUP;Lo;0;L;<compat> 112C;;;;N;HANGUL LETTER SSANG BIEUB SUN GYEONG EUM;;;; +317A;HANGUL LETTER SIOS-KIYEOK;Lo;0;L;<compat> 112D;;;;N;HANGUL LETTER SIOS GIYEOG;;;; +317B;HANGUL LETTER SIOS-NIEUN;Lo;0;L;<compat> 112E;;;;N;HANGUL LETTER SIOS NIEUN;;;; +317C;HANGUL LETTER SIOS-TIKEUT;Lo;0;L;<compat> 112F;;;;N;HANGUL LETTER SIOS DIGEUD;;;; +317D;HANGUL LETTER SIOS-PIEUP;Lo;0;L;<compat> 1132;;;;N;HANGUL LETTER SIOS BIEUB;;;; +317E;HANGUL LETTER SIOS-CIEUC;Lo;0;L;<compat> 1136;;;;N;HANGUL LETTER SIOS JIEUJ;;;; +317F;HANGUL LETTER PANSIOS;Lo;0;L;<compat> 1140;;;;N;HANGUL LETTER BAN CHI EUM;;;; +3180;HANGUL LETTER SSANGIEUNG;Lo;0;L;<compat> 1147;;;;N;HANGUL LETTER SSANG IEUNG;;;; +3181;HANGUL LETTER YESIEUNG;Lo;0;L;<compat> 114C;;;;N;HANGUL LETTER NGIEUNG;;;; +3182;HANGUL LETTER YESIEUNG-SIOS;Lo;0;L;<compat> 11F1;;;;N;HANGUL LETTER NGIEUNG SIOS;;;; +3183;HANGUL LETTER YESIEUNG-PANSIOS;Lo;0;L;<compat> 11F2;;;;N;HANGUL LETTER NGIEUNG BAN CHI EUM;;;; +3184;HANGUL LETTER KAPYEOUNPHIEUPH;Lo;0;L;<compat> 1157;;;;N;HANGUL LETTER PIEUP SUN GYEONG EUM;;;; +3185;HANGUL LETTER SSANGHIEUH;Lo;0;L;<compat> 1158;;;;N;HANGUL LETTER SSANG HIEUH;;;; +3186;HANGUL LETTER YEORINHIEUH;Lo;0;L;<compat> 1159;;;;N;HANGUL LETTER YEOLIN HIEUH;;;; +3187;HANGUL LETTER YO-YA;Lo;0;L;<compat> 1184;;;;N;HANGUL LETTER YOYA;;;; +3188;HANGUL LETTER YO-YAE;Lo;0;L;<compat> 1185;;;;N;HANGUL LETTER YOYAE;;;; +3189;HANGUL LETTER YO-I;Lo;0;L;<compat> 1188;;;;N;HANGUL LETTER YOI;;;; +318A;HANGUL LETTER YU-YEO;Lo;0;L;<compat> 1191;;;;N;HANGUL LETTER YUYEO;;;; +318B;HANGUL LETTER YU-YE;Lo;0;L;<compat> 1192;;;;N;HANGUL LETTER YUYE;;;; +318C;HANGUL LETTER YU-I;Lo;0;L;<compat> 1194;;;;N;HANGUL LETTER YUI;;;; +318D;HANGUL LETTER ARAEA;Lo;0;L;<compat> 119E;;;;N;HANGUL LETTER ALAE A;;;; +318E;HANGUL LETTER ARAEAE;Lo;0;L;<compat> 11A1;;;;N;HANGUL LETTER ALAE AE;;;; +3190;IDEOGRAPHIC ANNOTATION LINKING MARK;So;0;L;;;;;N;KANBUN TATETEN;;;; +3191;IDEOGRAPHIC ANNOTATION REVERSE MARK;So;0;L;;;;;N;KAERITEN RE;;;; +3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L;<super> 4E00;;;1;N;KAERITEN ITI;;;; +3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L;<super> 4E8C;;;2;N;KAERITEN NI;;;; +3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L;<super> 4E09;;;3;N;KAERITEN SAN;;;; +3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L;<super> 56DB;;;4;N;KAERITEN SI;;;; +3196;IDEOGRAPHIC ANNOTATION TOP MARK;So;0;L;<super> 4E0A;;;;N;KAERITEN ZYOU;;;; +3197;IDEOGRAPHIC ANNOTATION MIDDLE MARK;So;0;L;<super> 4E2D;;;;N;KAERITEN TYUU;;;; +3198;IDEOGRAPHIC ANNOTATION BOTTOM MARK;So;0;L;<super> 4E0B;;;;N;KAERITEN GE;;;; +3199;IDEOGRAPHIC ANNOTATION FIRST MARK;So;0;L;<super> 7532;;;;N;KAERITEN KOU;;;; +319A;IDEOGRAPHIC ANNOTATION SECOND MARK;So;0;L;<super> 4E59;;;;N;KAERITEN OTU;;;; +319B;IDEOGRAPHIC ANNOTATION THIRD MARK;So;0;L;<super> 4E19;;;;N;KAERITEN HEI;;;; +319C;IDEOGRAPHIC ANNOTATION FOURTH MARK;So;0;L;<super> 4E01;;;;N;KAERITEN TEI;;;; +319D;IDEOGRAPHIC ANNOTATION HEAVEN MARK;So;0;L;<super> 5929;;;;N;KAERITEN TEN;;;; +319E;IDEOGRAPHIC ANNOTATION EARTH MARK;So;0;L;<super> 5730;;;;N;KAERITEN TI;;;; +319F;IDEOGRAPHIC ANNOTATION MAN MARK;So;0;L;<super> 4EBA;;;;N;KAERITEN ZIN;;;; +31A0;BOPOMOFO LETTER BU;Lo;0;L;;;;;N;;;;; +31A1;BOPOMOFO LETTER ZI;Lo;0;L;;;;;N;;;;; +31A2;BOPOMOFO LETTER JI;Lo;0;L;;;;;N;;;;; +31A3;BOPOMOFO LETTER GU;Lo;0;L;;;;;N;;;;; +31A4;BOPOMOFO LETTER EE;Lo;0;L;;;;;N;;;;; +31A5;BOPOMOFO LETTER ENN;Lo;0;L;;;;;N;;;;; +31A6;BOPOMOFO LETTER OO;Lo;0;L;;;;;N;;;;; +31A7;BOPOMOFO LETTER ONN;Lo;0;L;;;;;N;;;;; +31A8;BOPOMOFO LETTER IR;Lo;0;L;;;;;N;;;;; +31A9;BOPOMOFO LETTER ANN;Lo;0;L;;;;;N;;;;; +31AA;BOPOMOFO LETTER INN;Lo;0;L;;;;;N;;;;; +31AB;BOPOMOFO LETTER UNN;Lo;0;L;;;;;N;;;;; +31AC;BOPOMOFO LETTER IM;Lo;0;L;;;;;N;;;;; +31AD;BOPOMOFO LETTER NGG;Lo;0;L;;;;;N;;;;; +31AE;BOPOMOFO LETTER AINN;Lo;0;L;;;;;N;;;;; +31AF;BOPOMOFO LETTER AUNN;Lo;0;L;;;;;N;;;;; +31B0;BOPOMOFO LETTER AM;Lo;0;L;;;;;N;;;;; +31B1;BOPOMOFO LETTER OM;Lo;0;L;;;;;N;;;;; +31B2;BOPOMOFO LETTER ONG;Lo;0;L;;;;;N;;;;; +31B3;BOPOMOFO LETTER INNN;Lo;0;L;;;;;N;;;;; +31B4;BOPOMOFO FINAL LETTER P;Lo;0;L;;;;;N;;;;; +31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;; +31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;; +31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;; +31C0;CJK STROKE T;So;0;ON;;;;;N;;;;; +31C1;CJK STROKE WG;So;0;ON;;;;;N;;;;; +31C2;CJK STROKE XG;So;0;ON;;;;;N;;;;; +31C3;CJK STROKE BXG;So;0;ON;;;;;N;;;;; +31C4;CJK STROKE SW;So;0;ON;;;;;N;;;;; +31C5;CJK STROKE HZZ;So;0;ON;;;;;N;;;;; +31C6;CJK STROKE HZG;So;0;ON;;;;;N;;;;; +31C7;CJK STROKE HP;So;0;ON;;;;;N;;;;; +31C8;CJK STROKE HZWG;So;0;ON;;;;;N;;;;; +31C9;CJK STROKE SZWG;So;0;ON;;;;;N;;;;; +31CA;CJK STROKE HZT;So;0;ON;;;;;N;;;;; +31CB;CJK STROKE HZZP;So;0;ON;;;;;N;;;;; +31CC;CJK STROKE HPWG;So;0;ON;;;;;N;;;;; +31CD;CJK STROKE HZW;So;0;ON;;;;;N;;;;; +31CE;CJK STROKE HZZZ;So;0;ON;;;;;N;;;;; +31CF;CJK STROKE N;So;0;ON;;;;;N;;;;; +31D0;CJK STROKE H;So;0;ON;;;;;N;;;;; +31D1;CJK STROKE S;So;0;ON;;;;;N;;;;; +31D2;CJK STROKE P;So;0;ON;;;;;N;;;;; +31D3;CJK STROKE SP;So;0;ON;;;;;N;;;;; +31D4;CJK STROKE D;So;0;ON;;;;;N;;;;; +31D5;CJK STROKE HZ;So;0;ON;;;;;N;;;;; +31D6;CJK STROKE HG;So;0;ON;;;;;N;;;;; +31D7;CJK STROKE SZ;So;0;ON;;;;;N;;;;; +31D8;CJK STROKE SWZ;So;0;ON;;;;;N;;;;; +31D9;CJK STROKE ST;So;0;ON;;;;;N;;;;; +31DA;CJK STROKE SG;So;0;ON;;;;;N;;;;; +31DB;CJK STROKE PD;So;0;ON;;;;;N;;;;; +31DC;CJK STROKE PZ;So;0;ON;;;;;N;;;;; +31DD;CJK STROKE TN;So;0;ON;;;;;N;;;;; +31DE;CJK STROKE SZZ;So;0;ON;;;;;N;;;;; +31DF;CJK STROKE SWG;So;0;ON;;;;;N;;;;; +31E0;CJK STROKE HXWG;So;0;ON;;;;;N;;;;; +31E1;CJK STROKE HZZZG;So;0;ON;;;;;N;;;;; +31E2;CJK STROKE PG;So;0;ON;;;;;N;;;;; +31E3;CJK STROKE Q;So;0;ON;;;;;N;;;;; +31F0;KATAKANA LETTER SMALL KU;Lo;0;L;;;;;N;;;;; +31F1;KATAKANA LETTER SMALL SI;Lo;0;L;;;;;N;;;;; +31F2;KATAKANA LETTER SMALL SU;Lo;0;L;;;;;N;;;;; +31F3;KATAKANA LETTER SMALL TO;Lo;0;L;;;;;N;;;;; +31F4;KATAKANA LETTER SMALL NU;Lo;0;L;;;;;N;;;;; +31F5;KATAKANA LETTER SMALL HA;Lo;0;L;;;;;N;;;;; +31F6;KATAKANA LETTER SMALL HI;Lo;0;L;;;;;N;;;;; +31F7;KATAKANA LETTER SMALL HU;Lo;0;L;;;;;N;;;;; +31F8;KATAKANA LETTER SMALL HE;Lo;0;L;;;;;N;;;;; +31F9;KATAKANA LETTER SMALL HO;Lo;0;L;;;;;N;;;;; +31FA;KATAKANA LETTER SMALL MU;Lo;0;L;;;;;N;;;;; +31FB;KATAKANA LETTER SMALL RA;Lo;0;L;;;;;N;;;;; +31FC;KATAKANA LETTER SMALL RI;Lo;0;L;;;;;N;;;;; +31FD;KATAKANA LETTER SMALL RU;Lo;0;L;;;;;N;;;;; +31FE;KATAKANA LETTER SMALL RE;Lo;0;L;;;;;N;;;;; +31FF;KATAKANA LETTER SMALL RO;Lo;0;L;;;;;N;;;;; +3200;PARENTHESIZED HANGUL KIYEOK;So;0;L;<compat> 0028 1100 0029;;;;N;PARENTHESIZED HANGUL GIYEOG;;;; +3201;PARENTHESIZED HANGUL NIEUN;So;0;L;<compat> 0028 1102 0029;;;;N;;;;; +3202;PARENTHESIZED HANGUL TIKEUT;So;0;L;<compat> 0028 1103 0029;;;;N;PARENTHESIZED HANGUL DIGEUD;;;; +3203;PARENTHESIZED HANGUL RIEUL;So;0;L;<compat> 0028 1105 0029;;;;N;PARENTHESIZED HANGUL LIEUL;;;; +3204;PARENTHESIZED HANGUL MIEUM;So;0;L;<compat> 0028 1106 0029;;;;N;;;;; +3205;PARENTHESIZED HANGUL PIEUP;So;0;L;<compat> 0028 1107 0029;;;;N;PARENTHESIZED HANGUL BIEUB;;;; +3206;PARENTHESIZED HANGUL SIOS;So;0;L;<compat> 0028 1109 0029;;;;N;;;;; +3207;PARENTHESIZED HANGUL IEUNG;So;0;L;<compat> 0028 110B 0029;;;;N;;;;; +3208;PARENTHESIZED HANGUL CIEUC;So;0;L;<compat> 0028 110C 0029;;;;N;PARENTHESIZED HANGUL JIEUJ;;;; +3209;PARENTHESIZED HANGUL CHIEUCH;So;0;L;<compat> 0028 110E 0029;;;;N;PARENTHESIZED HANGUL CIEUC;;;; +320A;PARENTHESIZED HANGUL KHIEUKH;So;0;L;<compat> 0028 110F 0029;;;;N;PARENTHESIZED HANGUL KIYEOK;;;; +320B;PARENTHESIZED HANGUL THIEUTH;So;0;L;<compat> 0028 1110 0029;;;;N;PARENTHESIZED HANGUL TIEUT;;;; +320C;PARENTHESIZED HANGUL PHIEUPH;So;0;L;<compat> 0028 1111 0029;;;;N;PARENTHESIZED HANGUL PIEUP;;;; +320D;PARENTHESIZED HANGUL HIEUH;So;0;L;<compat> 0028 1112 0029;;;;N;;;;; +320E;PARENTHESIZED HANGUL KIYEOK A;So;0;L;<compat> 0028 1100 1161 0029;;;;N;PARENTHESIZED HANGUL GA;;;; +320F;PARENTHESIZED HANGUL NIEUN A;So;0;L;<compat> 0028 1102 1161 0029;;;;N;PARENTHESIZED HANGUL NA;;;; +3210;PARENTHESIZED HANGUL TIKEUT A;So;0;L;<compat> 0028 1103 1161 0029;;;;N;PARENTHESIZED HANGUL DA;;;; +3211;PARENTHESIZED HANGUL RIEUL A;So;0;L;<compat> 0028 1105 1161 0029;;;;N;PARENTHESIZED HANGUL LA;;;; +3212;PARENTHESIZED HANGUL MIEUM A;So;0;L;<compat> 0028 1106 1161 0029;;;;N;PARENTHESIZED HANGUL MA;;;; +3213;PARENTHESIZED HANGUL PIEUP A;So;0;L;<compat> 0028 1107 1161 0029;;;;N;PARENTHESIZED HANGUL BA;;;; +3214;PARENTHESIZED HANGUL SIOS A;So;0;L;<compat> 0028 1109 1161 0029;;;;N;PARENTHESIZED HANGUL SA;;;; +3215;PARENTHESIZED HANGUL IEUNG A;So;0;L;<compat> 0028 110B 1161 0029;;;;N;PARENTHESIZED HANGUL A;;;; +3216;PARENTHESIZED HANGUL CIEUC A;So;0;L;<compat> 0028 110C 1161 0029;;;;N;PARENTHESIZED HANGUL JA;;;; +3217;PARENTHESIZED HANGUL CHIEUCH A;So;0;L;<compat> 0028 110E 1161 0029;;;;N;PARENTHESIZED HANGUL CA;;;; +3218;PARENTHESIZED HANGUL KHIEUKH A;So;0;L;<compat> 0028 110F 1161 0029;;;;N;PARENTHESIZED HANGUL KA;;;; +3219;PARENTHESIZED HANGUL THIEUTH A;So;0;L;<compat> 0028 1110 1161 0029;;;;N;PARENTHESIZED HANGUL TA;;;; +321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L;<compat> 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;; +321B;PARENTHESIZED HANGUL HIEUH A;So;0;L;<compat> 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;; +321C;PARENTHESIZED HANGUL CIEUC U;So;0;L;<compat> 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;; +321D;PARENTHESIZED KOREAN CHARACTER OJEON;So;0;ON;<compat> 0028 110B 1169 110C 1165 11AB 0029;;;;N;;;;; +321E;PARENTHESIZED KOREAN CHARACTER O HU;So;0;ON;<compat> 0028 110B 1169 1112 116E 0029;;;;N;;;;; +3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L;<compat> 0028 4E00 0029;;;1;N;;;;; +3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L;<compat> 0028 4E8C 0029;;;2;N;;;;; +3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L;<compat> 0028 4E09 0029;;;3;N;;;;; +3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L;<compat> 0028 56DB 0029;;;4;N;;;;; +3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L;<compat> 0028 4E94 0029;;;5;N;;;;; +3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L;<compat> 0028 516D 0029;;;6;N;;;;; +3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L;<compat> 0028 4E03 0029;;;7;N;;;;; +3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L;<compat> 0028 516B 0029;;;8;N;;;;; +3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L;<compat> 0028 4E5D 0029;;;9;N;;;;; +3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L;<compat> 0028 5341 0029;;;10;N;;;;; +322A;PARENTHESIZED IDEOGRAPH MOON;So;0;L;<compat> 0028 6708 0029;;;;N;;;;; +322B;PARENTHESIZED IDEOGRAPH FIRE;So;0;L;<compat> 0028 706B 0029;;;;N;;;;; +322C;PARENTHESIZED IDEOGRAPH WATER;So;0;L;<compat> 0028 6C34 0029;;;;N;;;;; +322D;PARENTHESIZED IDEOGRAPH WOOD;So;0;L;<compat> 0028 6728 0029;;;;N;;;;; +322E;PARENTHESIZED IDEOGRAPH METAL;So;0;L;<compat> 0028 91D1 0029;;;;N;;;;; +322F;PARENTHESIZED IDEOGRAPH EARTH;So;0;L;<compat> 0028 571F 0029;;;;N;;;;; +3230;PARENTHESIZED IDEOGRAPH SUN;So;0;L;<compat> 0028 65E5 0029;;;;N;;;;; +3231;PARENTHESIZED IDEOGRAPH STOCK;So;0;L;<compat> 0028 682A 0029;;;;N;;;;; +3232;PARENTHESIZED IDEOGRAPH HAVE;So;0;L;<compat> 0028 6709 0029;;;;N;;;;; +3233;PARENTHESIZED IDEOGRAPH SOCIETY;So;0;L;<compat> 0028 793E 0029;;;;N;;;;; +3234;PARENTHESIZED IDEOGRAPH NAME;So;0;L;<compat> 0028 540D 0029;;;;N;;;;; +3235;PARENTHESIZED IDEOGRAPH SPECIAL;So;0;L;<compat> 0028 7279 0029;;;;N;;;;; +3236;PARENTHESIZED IDEOGRAPH FINANCIAL;So;0;L;<compat> 0028 8CA1 0029;;;;N;;;;; +3237;PARENTHESIZED IDEOGRAPH CONGRATULATION;So;0;L;<compat> 0028 795D 0029;;;;N;;;;; +3238;PARENTHESIZED IDEOGRAPH LABOR;So;0;L;<compat> 0028 52B4 0029;;;;N;;;;; +3239;PARENTHESIZED IDEOGRAPH REPRESENT;So;0;L;<compat> 0028 4EE3 0029;;;;N;;;;; +323A;PARENTHESIZED IDEOGRAPH CALL;So;0;L;<compat> 0028 547C 0029;;;;N;;;;; +323B;PARENTHESIZED IDEOGRAPH STUDY;So;0;L;<compat> 0028 5B66 0029;;;;N;;;;; +323C;PARENTHESIZED IDEOGRAPH SUPERVISE;So;0;L;<compat> 0028 76E3 0029;;;;N;;;;; +323D;PARENTHESIZED IDEOGRAPH ENTERPRISE;So;0;L;<compat> 0028 4F01 0029;;;;N;;;;; +323E;PARENTHESIZED IDEOGRAPH RESOURCE;So;0;L;<compat> 0028 8CC7 0029;;;;N;;;;; +323F;PARENTHESIZED IDEOGRAPH ALLIANCE;So;0;L;<compat> 0028 5354 0029;;;;N;;;;; +3240;PARENTHESIZED IDEOGRAPH FESTIVAL;So;0;L;<compat> 0028 796D 0029;;;;N;;;;; +3241;PARENTHESIZED IDEOGRAPH REST;So;0;L;<compat> 0028 4F11 0029;;;;N;;;;; +3242;PARENTHESIZED IDEOGRAPH SELF;So;0;L;<compat> 0028 81EA 0029;;;;N;;;;; +3243;PARENTHESIZED IDEOGRAPH REACH;So;0;L;<compat> 0028 81F3 0029;;;;N;;;;; +3244;CIRCLED IDEOGRAPH QUESTION;So;0;L;<circle> 554F;;;;N;;;;; +3245;CIRCLED IDEOGRAPH KINDERGARTEN;So;0;L;<circle> 5E7C;;;;N;;;;; +3246;CIRCLED IDEOGRAPH SCHOOL;So;0;L;<circle> 6587;;;;N;;;;; +3247;CIRCLED IDEOGRAPH KOTO;So;0;L;<circle> 7B8F;;;;N;;;;; +3248;CIRCLED NUMBER TEN ON BLACK SQUARE;So;0;L;;;;;N;;;;; +3249;CIRCLED NUMBER TWENTY ON BLACK SQUARE;So;0;L;;;;;N;;;;; +324A;CIRCLED NUMBER THIRTY ON BLACK SQUARE;So;0;L;;;;;N;;;;; +324B;CIRCLED NUMBER FORTY ON BLACK SQUARE;So;0;L;;;;;N;;;;; +324C;CIRCLED NUMBER FIFTY ON BLACK SQUARE;So;0;L;;;;;N;;;;; +324D;CIRCLED NUMBER SIXTY ON BLACK SQUARE;So;0;L;;;;;N;;;;; +324E;CIRCLED NUMBER SEVENTY ON BLACK SQUARE;So;0;L;;;;;N;;;;; +324F;CIRCLED NUMBER EIGHTY ON BLACK SQUARE;So;0;L;;;;;N;;;;; +3250;PARTNERSHIP SIGN;So;0;ON;<square> 0050 0054 0045;;;;N;;;;; +3251;CIRCLED NUMBER TWENTY ONE;No;0;ON;<circle> 0032 0031;;;21;N;;;;; +3252;CIRCLED NUMBER TWENTY TWO;No;0;ON;<circle> 0032 0032;;;22;N;;;;; +3253;CIRCLED NUMBER TWENTY THREE;No;0;ON;<circle> 0032 0033;;;23;N;;;;; +3254;CIRCLED NUMBER TWENTY FOUR;No;0;ON;<circle> 0032 0034;;;24;N;;;;; +3255;CIRCLED NUMBER TWENTY FIVE;No;0;ON;<circle> 0032 0035;;;25;N;;;;; +3256;CIRCLED NUMBER TWENTY SIX;No;0;ON;<circle> 0032 0036;;;26;N;;;;; +3257;CIRCLED NUMBER TWENTY SEVEN;No;0;ON;<circle> 0032 0037;;;27;N;;;;; +3258;CIRCLED NUMBER TWENTY EIGHT;No;0;ON;<circle> 0032 0038;;;28;N;;;;; +3259;CIRCLED NUMBER TWENTY NINE;No;0;ON;<circle> 0032 0039;;;29;N;;;;; +325A;CIRCLED NUMBER THIRTY;No;0;ON;<circle> 0033 0030;;;30;N;;;;; +325B;CIRCLED NUMBER THIRTY ONE;No;0;ON;<circle> 0033 0031;;;31;N;;;;; +325C;CIRCLED NUMBER THIRTY TWO;No;0;ON;<circle> 0033 0032;;;32;N;;;;; +325D;CIRCLED NUMBER THIRTY THREE;No;0;ON;<circle> 0033 0033;;;33;N;;;;; +325E;CIRCLED NUMBER THIRTY FOUR;No;0;ON;<circle> 0033 0034;;;34;N;;;;; +325F;CIRCLED NUMBER THIRTY FIVE;No;0;ON;<circle> 0033 0035;;;35;N;;;;; +3260;CIRCLED HANGUL KIYEOK;So;0;L;<circle> 1100;;;;N;CIRCLED HANGUL GIYEOG;;;; +3261;CIRCLED HANGUL NIEUN;So;0;L;<circle> 1102;;;;N;;;;; +3262;CIRCLED HANGUL TIKEUT;So;0;L;<circle> 1103;;;;N;CIRCLED HANGUL DIGEUD;;;; +3263;CIRCLED HANGUL RIEUL;So;0;L;<circle> 1105;;;;N;CIRCLED HANGUL LIEUL;;;; +3264;CIRCLED HANGUL MIEUM;So;0;L;<circle> 1106;;;;N;;;;; +3265;CIRCLED HANGUL PIEUP;So;0;L;<circle> 1107;;;;N;CIRCLED HANGUL BIEUB;;;; +3266;CIRCLED HANGUL SIOS;So;0;L;<circle> 1109;;;;N;;;;; +3267;CIRCLED HANGUL IEUNG;So;0;L;<circle> 110B;;;;N;;;;; +3268;CIRCLED HANGUL CIEUC;So;0;L;<circle> 110C;;;;N;CIRCLED HANGUL JIEUJ;;;; +3269;CIRCLED HANGUL CHIEUCH;So;0;L;<circle> 110E;;;;N;CIRCLED HANGUL CIEUC;;;; +326A;CIRCLED HANGUL KHIEUKH;So;0;L;<circle> 110F;;;;N;CIRCLED HANGUL KIYEOK;;;; +326B;CIRCLED HANGUL THIEUTH;So;0;L;<circle> 1110;;;;N;CIRCLED HANGUL TIEUT;;;; +326C;CIRCLED HANGUL PHIEUPH;So;0;L;<circle> 1111;;;;N;CIRCLED HANGUL PIEUP;;;; +326D;CIRCLED HANGUL HIEUH;So;0;L;<circle> 1112;;;;N;;;;; +326E;CIRCLED HANGUL KIYEOK A;So;0;L;<circle> 1100 1161;;;;N;CIRCLED HANGUL GA;;;; +326F;CIRCLED HANGUL NIEUN A;So;0;L;<circle> 1102 1161;;;;N;CIRCLED HANGUL NA;;;; +3270;CIRCLED HANGUL TIKEUT A;So;0;L;<circle> 1103 1161;;;;N;CIRCLED HANGUL DA;;;; +3271;CIRCLED HANGUL RIEUL A;So;0;L;<circle> 1105 1161;;;;N;CIRCLED HANGUL LA;;;; +3272;CIRCLED HANGUL MIEUM A;So;0;L;<circle> 1106 1161;;;;N;CIRCLED HANGUL MA;;;; +3273;CIRCLED HANGUL PIEUP A;So;0;L;<circle> 1107 1161;;;;N;CIRCLED HANGUL BA;;;; +3274;CIRCLED HANGUL SIOS A;So;0;L;<circle> 1109 1161;;;;N;CIRCLED HANGUL SA;;;; +3275;CIRCLED HANGUL IEUNG A;So;0;L;<circle> 110B 1161;;;;N;CIRCLED HANGUL A;;;; +3276;CIRCLED HANGUL CIEUC A;So;0;L;<circle> 110C 1161;;;;N;CIRCLED HANGUL JA;;;; +3277;CIRCLED HANGUL CHIEUCH A;So;0;L;<circle> 110E 1161;;;;N;CIRCLED HANGUL CA;;;; +3278;CIRCLED HANGUL KHIEUKH A;So;0;L;<circle> 110F 1161;;;;N;CIRCLED HANGUL KA;;;; +3279;CIRCLED HANGUL THIEUTH A;So;0;L;<circle> 1110 1161;;;;N;CIRCLED HANGUL TA;;;; +327A;CIRCLED HANGUL PHIEUPH A;So;0;L;<circle> 1111 1161;;;;N;CIRCLED HANGUL PA;;;; +327B;CIRCLED HANGUL HIEUH A;So;0;L;<circle> 1112 1161;;;;N;CIRCLED HANGUL HA;;;; +327C;CIRCLED KOREAN CHARACTER CHAMKO;So;0;ON;<circle> 110E 1161 11B7 1100 1169;;;;N;;;;; +327D;CIRCLED KOREAN CHARACTER JUEUI;So;0;ON;<circle> 110C 116E 110B 1174;;;;N;;;;; +327E;CIRCLED HANGUL IEUNG U;So;0;ON;<circle> 110B 116E;;;;N;;;;; +327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;; +3280;CIRCLED IDEOGRAPH ONE;No;0;L;<circle> 4E00;;;1;N;;;;; +3281;CIRCLED IDEOGRAPH TWO;No;0;L;<circle> 4E8C;;;2;N;;;;; +3282;CIRCLED IDEOGRAPH THREE;No;0;L;<circle> 4E09;;;3;N;;;;; +3283;CIRCLED IDEOGRAPH FOUR;No;0;L;<circle> 56DB;;;4;N;;;;; +3284;CIRCLED IDEOGRAPH FIVE;No;0;L;<circle> 4E94;;;5;N;;;;; +3285;CIRCLED IDEOGRAPH SIX;No;0;L;<circle> 516D;;;6;N;;;;; +3286;CIRCLED IDEOGRAPH SEVEN;No;0;L;<circle> 4E03;;;7;N;;;;; +3287;CIRCLED IDEOGRAPH EIGHT;No;0;L;<circle> 516B;;;8;N;;;;; +3288;CIRCLED IDEOGRAPH NINE;No;0;L;<circle> 4E5D;;;9;N;;;;; +3289;CIRCLED IDEOGRAPH TEN;No;0;L;<circle> 5341;;;10;N;;;;; +328A;CIRCLED IDEOGRAPH MOON;So;0;L;<circle> 6708;;;;N;;;;; +328B;CIRCLED IDEOGRAPH FIRE;So;0;L;<circle> 706B;;;;N;;;;; +328C;CIRCLED IDEOGRAPH WATER;So;0;L;<circle> 6C34;;;;N;;;;; +328D;CIRCLED IDEOGRAPH WOOD;So;0;L;<circle> 6728;;;;N;;;;; +328E;CIRCLED IDEOGRAPH METAL;So;0;L;<circle> 91D1;;;;N;;;;; +328F;CIRCLED IDEOGRAPH EARTH;So;0;L;<circle> 571F;;;;N;;;;; +3290;CIRCLED IDEOGRAPH SUN;So;0;L;<circle> 65E5;;;;N;;;;; +3291;CIRCLED IDEOGRAPH STOCK;So;0;L;<circle> 682A;;;;N;;;;; +3292;CIRCLED IDEOGRAPH HAVE;So;0;L;<circle> 6709;;;;N;;;;; +3293;CIRCLED IDEOGRAPH SOCIETY;So;0;L;<circle> 793E;;;;N;;;;; +3294;CIRCLED IDEOGRAPH NAME;So;0;L;<circle> 540D;;;;N;;;;; +3295;CIRCLED IDEOGRAPH SPECIAL;So;0;L;<circle> 7279;;;;N;;;;; +3296;CIRCLED IDEOGRAPH FINANCIAL;So;0;L;<circle> 8CA1;;;;N;;;;; +3297;CIRCLED IDEOGRAPH CONGRATULATION;So;0;L;<circle> 795D;;;;N;;;;; +3298;CIRCLED IDEOGRAPH LABOR;So;0;L;<circle> 52B4;;;;N;;;;; +3299;CIRCLED IDEOGRAPH SECRET;So;0;L;<circle> 79D8;;;;N;;;;; +329A;CIRCLED IDEOGRAPH MALE;So;0;L;<circle> 7537;;;;N;;;;; +329B;CIRCLED IDEOGRAPH FEMALE;So;0;L;<circle> 5973;;;;N;;;;; +329C;CIRCLED IDEOGRAPH SUITABLE;So;0;L;<circle> 9069;;;;N;;;;; +329D;CIRCLED IDEOGRAPH EXCELLENT;So;0;L;<circle> 512A;;;;N;;;;; +329E;CIRCLED IDEOGRAPH PRINT;So;0;L;<circle> 5370;;;;N;;;;; +329F;CIRCLED IDEOGRAPH ATTENTION;So;0;L;<circle> 6CE8;;;;N;;;;; +32A0;CIRCLED IDEOGRAPH ITEM;So;0;L;<circle> 9805;;;;N;;;;; +32A1;CIRCLED IDEOGRAPH REST;So;0;L;<circle> 4F11;;;;N;;;;; +32A2;CIRCLED IDEOGRAPH COPY;So;0;L;<circle> 5199;;;;N;;;;; +32A3;CIRCLED IDEOGRAPH CORRECT;So;0;L;<circle> 6B63;;;;N;;;;; +32A4;CIRCLED IDEOGRAPH HIGH;So;0;L;<circle> 4E0A;;;;N;;;;; +32A5;CIRCLED IDEOGRAPH CENTRE;So;0;L;<circle> 4E2D;;;;N;CIRCLED IDEOGRAPH CENTER;;;; +32A6;CIRCLED IDEOGRAPH LOW;So;0;L;<circle> 4E0B;;;;N;;;;; +32A7;CIRCLED IDEOGRAPH LEFT;So;0;L;<circle> 5DE6;;;;N;;;;; +32A8;CIRCLED IDEOGRAPH RIGHT;So;0;L;<circle> 53F3;;;;N;;;;; +32A9;CIRCLED IDEOGRAPH MEDICINE;So;0;L;<circle> 533B;;;;N;;;;; +32AA;CIRCLED IDEOGRAPH RELIGION;So;0;L;<circle> 5B97;;;;N;;;;; +32AB;CIRCLED IDEOGRAPH STUDY;So;0;L;<circle> 5B66;;;;N;;;;; +32AC;CIRCLED IDEOGRAPH SUPERVISE;So;0;L;<circle> 76E3;;;;N;;;;; +32AD;CIRCLED IDEOGRAPH ENTERPRISE;So;0;L;<circle> 4F01;;;;N;;;;; +32AE;CIRCLED IDEOGRAPH RESOURCE;So;0;L;<circle> 8CC7;;;;N;;;;; +32AF;CIRCLED IDEOGRAPH ALLIANCE;So;0;L;<circle> 5354;;;;N;;;;; +32B0;CIRCLED IDEOGRAPH NIGHT;So;0;L;<circle> 591C;;;;N;;;;; +32B1;CIRCLED NUMBER THIRTY SIX;No;0;ON;<circle> 0033 0036;;;36;N;;;;; +32B2;CIRCLED NUMBER THIRTY SEVEN;No;0;ON;<circle> 0033 0037;;;37;N;;;;; +32B3;CIRCLED NUMBER THIRTY EIGHT;No;0;ON;<circle> 0033 0038;;;38;N;;;;; +32B4;CIRCLED NUMBER THIRTY NINE;No;0;ON;<circle> 0033 0039;;;39;N;;;;; +32B5;CIRCLED NUMBER FORTY;No;0;ON;<circle> 0034 0030;;;40;N;;;;; +32B6;CIRCLED NUMBER FORTY ONE;No;0;ON;<circle> 0034 0031;;;41;N;;;;; +32B7;CIRCLED NUMBER FORTY TWO;No;0;ON;<circle> 0034 0032;;;42;N;;;;; +32B8;CIRCLED NUMBER FORTY THREE;No;0;ON;<circle> 0034 0033;;;43;N;;;;; +32B9;CIRCLED NUMBER FORTY FOUR;No;0;ON;<circle> 0034 0034;;;44;N;;;;; +32BA;CIRCLED NUMBER FORTY FIVE;No;0;ON;<circle> 0034 0035;;;45;N;;;;; +32BB;CIRCLED NUMBER FORTY SIX;No;0;ON;<circle> 0034 0036;;;46;N;;;;; +32BC;CIRCLED NUMBER FORTY SEVEN;No;0;ON;<circle> 0034 0037;;;47;N;;;;; +32BD;CIRCLED NUMBER FORTY EIGHT;No;0;ON;<circle> 0034 0038;;;48;N;;;;; +32BE;CIRCLED NUMBER FORTY NINE;No;0;ON;<circle> 0034 0039;;;49;N;;;;; +32BF;CIRCLED NUMBER FIFTY;No;0;ON;<circle> 0035 0030;;;50;N;;;;; +32C0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY;So;0;L;<compat> 0031 6708;;;;N;;;;; +32C1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY;So;0;L;<compat> 0032 6708;;;;N;;;;; +32C2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH;So;0;L;<compat> 0033 6708;;;;N;;;;; +32C3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL;So;0;L;<compat> 0034 6708;;;;N;;;;; +32C4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY;So;0;L;<compat> 0035 6708;;;;N;;;;; +32C5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE;So;0;L;<compat> 0036 6708;;;;N;;;;; +32C6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY;So;0;L;<compat> 0037 6708;;;;N;;;;; +32C7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST;So;0;L;<compat> 0038 6708;;;;N;;;;; +32C8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER;So;0;L;<compat> 0039 6708;;;;N;;;;; +32C9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER;So;0;L;<compat> 0031 0030 6708;;;;N;;;;; +32CA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER;So;0;L;<compat> 0031 0031 6708;;;;N;;;;; +32CB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER;So;0;L;<compat> 0031 0032 6708;;;;N;;;;; +32CC;SQUARE HG;So;0;ON;<square> 0048 0067;;;;N;;;;; +32CD;SQUARE ERG;So;0;ON;<square> 0065 0072 0067;;;;N;;;;; +32CE;SQUARE EV;So;0;ON;<square> 0065 0056;;;;N;;;;; +32CF;LIMITED LIABILITY SIGN;So;0;ON;<square> 004C 0054 0044;;;;N;;;;; +32D0;CIRCLED KATAKANA A;So;0;L;<circle> 30A2;;;;N;;;;; +32D1;CIRCLED KATAKANA I;So;0;L;<circle> 30A4;;;;N;;;;; +32D2;CIRCLED KATAKANA U;So;0;L;<circle> 30A6;;;;N;;;;; +32D3;CIRCLED KATAKANA E;So;0;L;<circle> 30A8;;;;N;;;;; +32D4;CIRCLED KATAKANA O;So;0;L;<circle> 30AA;;;;N;;;;; +32D5;CIRCLED KATAKANA KA;So;0;L;<circle> 30AB;;;;N;;;;; +32D6;CIRCLED KATAKANA KI;So;0;L;<circle> 30AD;;;;N;;;;; +32D7;CIRCLED KATAKANA KU;So;0;L;<circle> 30AF;;;;N;;;;; +32D8;CIRCLED KATAKANA KE;So;0;L;<circle> 30B1;;;;N;;;;; +32D9;CIRCLED KATAKANA KO;So;0;L;<circle> 30B3;;;;N;;;;; +32DA;CIRCLED KATAKANA SA;So;0;L;<circle> 30B5;;;;N;;;;; +32DB;CIRCLED KATAKANA SI;So;0;L;<circle> 30B7;;;;N;;;;; +32DC;CIRCLED KATAKANA SU;So;0;L;<circle> 30B9;;;;N;;;;; +32DD;CIRCLED KATAKANA SE;So;0;L;<circle> 30BB;;;;N;;;;; +32DE;CIRCLED KATAKANA SO;So;0;L;<circle> 30BD;;;;N;;;;; +32DF;CIRCLED KATAKANA TA;So;0;L;<circle> 30BF;;;;N;;;;; +32E0;CIRCLED KATAKANA TI;So;0;L;<circle> 30C1;;;;N;;;;; +32E1;CIRCLED KATAKANA TU;So;0;L;<circle> 30C4;;;;N;;;;; +32E2;CIRCLED KATAKANA TE;So;0;L;<circle> 30C6;;;;N;;;;; +32E3;CIRCLED KATAKANA TO;So;0;L;<circle> 30C8;;;;N;;;;; +32E4;CIRCLED KATAKANA NA;So;0;L;<circle> 30CA;;;;N;;;;; +32E5;CIRCLED KATAKANA NI;So;0;L;<circle> 30CB;;;;N;;;;; +32E6;CIRCLED KATAKANA NU;So;0;L;<circle> 30CC;;;;N;;;;; +32E7;CIRCLED KATAKANA NE;So;0;L;<circle> 30CD;;;;N;;;;; +32E8;CIRCLED KATAKANA NO;So;0;L;<circle> 30CE;;;;N;;;;; +32E9;CIRCLED KATAKANA HA;So;0;L;<circle> 30CF;;;;N;;;;; +32EA;CIRCLED KATAKANA HI;So;0;L;<circle> 30D2;;;;N;;;;; +32EB;CIRCLED KATAKANA HU;So;0;L;<circle> 30D5;;;;N;;;;; +32EC;CIRCLED KATAKANA HE;So;0;L;<circle> 30D8;;;;N;;;;; +32ED;CIRCLED KATAKANA HO;So;0;L;<circle> 30DB;;;;N;;;;; +32EE;CIRCLED KATAKANA MA;So;0;L;<circle> 30DE;;;;N;;;;; +32EF;CIRCLED KATAKANA MI;So;0;L;<circle> 30DF;;;;N;;;;; +32F0;CIRCLED KATAKANA MU;So;0;L;<circle> 30E0;;;;N;;;;; +32F1;CIRCLED KATAKANA ME;So;0;L;<circle> 30E1;;;;N;;;;; +32F2;CIRCLED KATAKANA MO;So;0;L;<circle> 30E2;;;;N;;;;; +32F3;CIRCLED KATAKANA YA;So;0;L;<circle> 30E4;;;;N;;;;; +32F4;CIRCLED KATAKANA YU;So;0;L;<circle> 30E6;;;;N;;;;; +32F5;CIRCLED KATAKANA YO;So;0;L;<circle> 30E8;;;;N;;;;; +32F6;CIRCLED KATAKANA RA;So;0;L;<circle> 30E9;;;;N;;;;; +32F7;CIRCLED KATAKANA RI;So;0;L;<circle> 30EA;;;;N;;;;; +32F8;CIRCLED KATAKANA RU;So;0;L;<circle> 30EB;;;;N;;;;; +32F9;CIRCLED KATAKANA RE;So;0;L;<circle> 30EC;;;;N;;;;; +32FA;CIRCLED KATAKANA RO;So;0;L;<circle> 30ED;;;;N;;;;; +32FB;CIRCLED KATAKANA WA;So;0;L;<circle> 30EF;;;;N;;;;; +32FC;CIRCLED KATAKANA WI;So;0;L;<circle> 30F0;;;;N;;;;; +32FD;CIRCLED KATAKANA WE;So;0;L;<circle> 30F1;;;;N;;;;; +32FE;CIRCLED KATAKANA WO;So;0;L;<circle> 30F2;;;;N;;;;; +3300;SQUARE APAATO;So;0;L;<square> 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;; +3301;SQUARE ARUHUA;So;0;L;<square> 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;; +3302;SQUARE ANPEA;So;0;L;<square> 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;; +3303;SQUARE AARU;So;0;L;<square> 30A2 30FC 30EB;;;;N;SQUARED AARU;;;; +3304;SQUARE ININGU;So;0;L;<square> 30A4 30CB 30F3 30B0;;;;N;SQUARED ININGU;;;; +3305;SQUARE INTI;So;0;L;<square> 30A4 30F3 30C1;;;;N;SQUARED INTI;;;; +3306;SQUARE UON;So;0;L;<square> 30A6 30A9 30F3;;;;N;SQUARED UON;;;; +3307;SQUARE ESUKUUDO;So;0;L;<square> 30A8 30B9 30AF 30FC 30C9;;;;N;SQUARED ESUKUUDO;;;; +3308;SQUARE EEKAA;So;0;L;<square> 30A8 30FC 30AB 30FC;;;;N;SQUARED EEKAA;;;; +3309;SQUARE ONSU;So;0;L;<square> 30AA 30F3 30B9;;;;N;SQUARED ONSU;;;; +330A;SQUARE OOMU;So;0;L;<square> 30AA 30FC 30E0;;;;N;SQUARED OOMU;;;; +330B;SQUARE KAIRI;So;0;L;<square> 30AB 30A4 30EA;;;;N;SQUARED KAIRI;;;; +330C;SQUARE KARATTO;So;0;L;<square> 30AB 30E9 30C3 30C8;;;;N;SQUARED KARATTO;;;; +330D;SQUARE KARORII;So;0;L;<square> 30AB 30ED 30EA 30FC;;;;N;SQUARED KARORII;;;; +330E;SQUARE GARON;So;0;L;<square> 30AC 30ED 30F3;;;;N;SQUARED GARON;;;; +330F;SQUARE GANMA;So;0;L;<square> 30AC 30F3 30DE;;;;N;SQUARED GANMA;;;; +3310;SQUARE GIGA;So;0;L;<square> 30AE 30AC;;;;N;SQUARED GIGA;;;; +3311;SQUARE GINII;So;0;L;<square> 30AE 30CB 30FC;;;;N;SQUARED GINII;;;; +3312;SQUARE KYURII;So;0;L;<square> 30AD 30E5 30EA 30FC;;;;N;SQUARED KYURII;;;; +3313;SQUARE GIRUDAA;So;0;L;<square> 30AE 30EB 30C0 30FC;;;;N;SQUARED GIRUDAA;;;; +3314;SQUARE KIRO;So;0;L;<square> 30AD 30ED;;;;N;SQUARED KIRO;;;; +3315;SQUARE KIROGURAMU;So;0;L;<square> 30AD 30ED 30B0 30E9 30E0;;;;N;SQUARED KIROGURAMU;;;; +3316;SQUARE KIROMEETORU;So;0;L;<square> 30AD 30ED 30E1 30FC 30C8 30EB;;;;N;SQUARED KIROMEETORU;;;; +3317;SQUARE KIROWATTO;So;0;L;<square> 30AD 30ED 30EF 30C3 30C8;;;;N;SQUARED KIROWATTO;;;; +3318;SQUARE GURAMU;So;0;L;<square> 30B0 30E9 30E0;;;;N;SQUARED GURAMU;;;; +3319;SQUARE GURAMUTON;So;0;L;<square> 30B0 30E9 30E0 30C8 30F3;;;;N;SQUARED GURAMUTON;;;; +331A;SQUARE KURUZEIRO;So;0;L;<square> 30AF 30EB 30BC 30A4 30ED;;;;N;SQUARED KURUZEIRO;;;; +331B;SQUARE KUROONE;So;0;L;<square> 30AF 30ED 30FC 30CD;;;;N;SQUARED KUROONE;;;; +331C;SQUARE KEESU;So;0;L;<square> 30B1 30FC 30B9;;;;N;SQUARED KEESU;;;; +331D;SQUARE KORUNA;So;0;L;<square> 30B3 30EB 30CA;;;;N;SQUARED KORUNA;;;; +331E;SQUARE KOOPO;So;0;L;<square> 30B3 30FC 30DD;;;;N;SQUARED KOOPO;;;; +331F;SQUARE SAIKURU;So;0;L;<square> 30B5 30A4 30AF 30EB;;;;N;SQUARED SAIKURU;;;; +3320;SQUARE SANTIIMU;So;0;L;<square> 30B5 30F3 30C1 30FC 30E0;;;;N;SQUARED SANTIIMU;;;; +3321;SQUARE SIRINGU;So;0;L;<square> 30B7 30EA 30F3 30B0;;;;N;SQUARED SIRINGU;;;; +3322;SQUARE SENTI;So;0;L;<square> 30BB 30F3 30C1;;;;N;SQUARED SENTI;;;; +3323;SQUARE SENTO;So;0;L;<square> 30BB 30F3 30C8;;;;N;SQUARED SENTO;;;; +3324;SQUARE DAASU;So;0;L;<square> 30C0 30FC 30B9;;;;N;SQUARED DAASU;;;; +3325;SQUARE DESI;So;0;L;<square> 30C7 30B7;;;;N;SQUARED DESI;;;; +3326;SQUARE DORU;So;0;L;<square> 30C9 30EB;;;;N;SQUARED DORU;;;; +3327;SQUARE TON;So;0;L;<square> 30C8 30F3;;;;N;SQUARED TON;;;; +3328;SQUARE NANO;So;0;L;<square> 30CA 30CE;;;;N;SQUARED NANO;;;; +3329;SQUARE NOTTO;So;0;L;<square> 30CE 30C3 30C8;;;;N;SQUARED NOTTO;;;; +332A;SQUARE HAITU;So;0;L;<square> 30CF 30A4 30C4;;;;N;SQUARED HAITU;;;; +332B;SQUARE PAASENTO;So;0;L;<square> 30D1 30FC 30BB 30F3 30C8;;;;N;SQUARED PAASENTO;;;; +332C;SQUARE PAATU;So;0;L;<square> 30D1 30FC 30C4;;;;N;SQUARED PAATU;;;; +332D;SQUARE BAARERU;So;0;L;<square> 30D0 30FC 30EC 30EB;;;;N;SQUARED BAARERU;;;; +332E;SQUARE PIASUTORU;So;0;L;<square> 30D4 30A2 30B9 30C8 30EB;;;;N;SQUARED PIASUTORU;;;; +332F;SQUARE PIKURU;So;0;L;<square> 30D4 30AF 30EB;;;;N;SQUARED PIKURU;;;; +3330;SQUARE PIKO;So;0;L;<square> 30D4 30B3;;;;N;SQUARED PIKO;;;; +3331;SQUARE BIRU;So;0;L;<square> 30D3 30EB;;;;N;SQUARED BIRU;;;; +3332;SQUARE HUARADDO;So;0;L;<square> 30D5 30A1 30E9 30C3 30C9;;;;N;SQUARED HUARADDO;;;; +3333;SQUARE HUIITO;So;0;L;<square> 30D5 30A3 30FC 30C8;;;;N;SQUARED HUIITO;;;; +3334;SQUARE BUSSYERU;So;0;L;<square> 30D6 30C3 30B7 30A7 30EB;;;;N;SQUARED BUSSYERU;;;; +3335;SQUARE HURAN;So;0;L;<square> 30D5 30E9 30F3;;;;N;SQUARED HURAN;;;; +3336;SQUARE HEKUTAARU;So;0;L;<square> 30D8 30AF 30BF 30FC 30EB;;;;N;SQUARED HEKUTAARU;;;; +3337;SQUARE PESO;So;0;L;<square> 30DA 30BD;;;;N;SQUARED PESO;;;; +3338;SQUARE PENIHI;So;0;L;<square> 30DA 30CB 30D2;;;;N;SQUARED PENIHI;;;; +3339;SQUARE HERUTU;So;0;L;<square> 30D8 30EB 30C4;;;;N;SQUARED HERUTU;;;; +333A;SQUARE PENSU;So;0;L;<square> 30DA 30F3 30B9;;;;N;SQUARED PENSU;;;; +333B;SQUARE PEEZI;So;0;L;<square> 30DA 30FC 30B8;;;;N;SQUARED PEEZI;;;; +333C;SQUARE BEETA;So;0;L;<square> 30D9 30FC 30BF;;;;N;SQUARED BEETA;;;; +333D;SQUARE POINTO;So;0;L;<square> 30DD 30A4 30F3 30C8;;;;N;SQUARED POINTO;;;; +333E;SQUARE BORUTO;So;0;L;<square> 30DC 30EB 30C8;;;;N;SQUARED BORUTO;;;; +333F;SQUARE HON;So;0;L;<square> 30DB 30F3;;;;N;SQUARED HON;;;; +3340;SQUARE PONDO;So;0;L;<square> 30DD 30F3 30C9;;;;N;SQUARED PONDO;;;; +3341;SQUARE HOORU;So;0;L;<square> 30DB 30FC 30EB;;;;N;SQUARED HOORU;;;; +3342;SQUARE HOON;So;0;L;<square> 30DB 30FC 30F3;;;;N;SQUARED HOON;;;; +3343;SQUARE MAIKURO;So;0;L;<square> 30DE 30A4 30AF 30ED;;;;N;SQUARED MAIKURO;;;; +3344;SQUARE MAIRU;So;0;L;<square> 30DE 30A4 30EB;;;;N;SQUARED MAIRU;;;; +3345;SQUARE MAHHA;So;0;L;<square> 30DE 30C3 30CF;;;;N;SQUARED MAHHA;;;; +3346;SQUARE MARUKU;So;0;L;<square> 30DE 30EB 30AF;;;;N;SQUARED MARUKU;;;; +3347;SQUARE MANSYON;So;0;L;<square> 30DE 30F3 30B7 30E7 30F3;;;;N;SQUARED MANSYON;;;; +3348;SQUARE MIKURON;So;0;L;<square> 30DF 30AF 30ED 30F3;;;;N;SQUARED MIKURON;;;; +3349;SQUARE MIRI;So;0;L;<square> 30DF 30EA;;;;N;SQUARED MIRI;;;; +334A;SQUARE MIRIBAARU;So;0;L;<square> 30DF 30EA 30D0 30FC 30EB;;;;N;SQUARED MIRIBAARU;;;; +334B;SQUARE MEGA;So;0;L;<square> 30E1 30AC;;;;N;SQUARED MEGA;;;; +334C;SQUARE MEGATON;So;0;L;<square> 30E1 30AC 30C8 30F3;;;;N;SQUARED MEGATON;;;; +334D;SQUARE MEETORU;So;0;L;<square> 30E1 30FC 30C8 30EB;;;;N;SQUARED MEETORU;;;; +334E;SQUARE YAADO;So;0;L;<square> 30E4 30FC 30C9;;;;N;SQUARED YAADO;;;; +334F;SQUARE YAARU;So;0;L;<square> 30E4 30FC 30EB;;;;N;SQUARED YAARU;;;; +3350;SQUARE YUAN;So;0;L;<square> 30E6 30A2 30F3;;;;N;SQUARED YUAN;;;; +3351;SQUARE RITTORU;So;0;L;<square> 30EA 30C3 30C8 30EB;;;;N;SQUARED RITTORU;;;; +3352;SQUARE RIRA;So;0;L;<square> 30EA 30E9;;;;N;SQUARED RIRA;;;; +3353;SQUARE RUPII;So;0;L;<square> 30EB 30D4 30FC;;;;N;SQUARED RUPII;;;; +3354;SQUARE RUUBURU;So;0;L;<square> 30EB 30FC 30D6 30EB;;;;N;SQUARED RUUBURU;;;; +3355;SQUARE REMU;So;0;L;<square> 30EC 30E0;;;;N;SQUARED REMU;;;; +3356;SQUARE RENTOGEN;So;0;L;<square> 30EC 30F3 30C8 30B2 30F3;;;;N;SQUARED RENTOGEN;;;; +3357;SQUARE WATTO;So;0;L;<square> 30EF 30C3 30C8;;;;N;SQUARED WATTO;;;; +3358;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO;So;0;L;<compat> 0030 70B9;;;;N;;;;; +3359;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE;So;0;L;<compat> 0031 70B9;;;;N;;;;; +335A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO;So;0;L;<compat> 0032 70B9;;;;N;;;;; +335B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE;So;0;L;<compat> 0033 70B9;;;;N;;;;; +335C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR;So;0;L;<compat> 0034 70B9;;;;N;;;;; +335D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE;So;0;L;<compat> 0035 70B9;;;;N;;;;; +335E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX;So;0;L;<compat> 0036 70B9;;;;N;;;;; +335F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN;So;0;L;<compat> 0037 70B9;;;;N;;;;; +3360;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT;So;0;L;<compat> 0038 70B9;;;;N;;;;; +3361;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE;So;0;L;<compat> 0039 70B9;;;;N;;;;; +3362;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN;So;0;L;<compat> 0031 0030 70B9;;;;N;;;;; +3363;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN;So;0;L;<compat> 0031 0031 70B9;;;;N;;;;; +3364;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE;So;0;L;<compat> 0031 0032 70B9;;;;N;;;;; +3365;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN;So;0;L;<compat> 0031 0033 70B9;;;;N;;;;; +3366;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN;So;0;L;<compat> 0031 0034 70B9;;;;N;;;;; +3367;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN;So;0;L;<compat> 0031 0035 70B9;;;;N;;;;; +3368;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN;So;0;L;<compat> 0031 0036 70B9;;;;N;;;;; +3369;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN;So;0;L;<compat> 0031 0037 70B9;;;;N;;;;; +336A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN;So;0;L;<compat> 0031 0038 70B9;;;;N;;;;; +336B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN;So;0;L;<compat> 0031 0039 70B9;;;;N;;;;; +336C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY;So;0;L;<compat> 0032 0030 70B9;;;;N;;;;; +336D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE;So;0;L;<compat> 0032 0031 70B9;;;;N;;;;; +336E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO;So;0;L;<compat> 0032 0032 70B9;;;;N;;;;; +336F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE;So;0;L;<compat> 0032 0033 70B9;;;;N;;;;; +3370;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR;So;0;L;<compat> 0032 0034 70B9;;;;N;;;;; +3371;SQUARE HPA;So;0;L;<square> 0068 0050 0061;;;;N;;;;; +3372;SQUARE DA;So;0;L;<square> 0064 0061;;;;N;;;;; +3373;SQUARE AU;So;0;L;<square> 0041 0055;;;;N;;;;; +3374;SQUARE BAR;So;0;L;<square> 0062 0061 0072;;;;N;;;;; +3375;SQUARE OV;So;0;L;<square> 006F 0056;;;;N;;;;; +3376;SQUARE PC;So;0;L;<square> 0070 0063;;;;N;;;;; +3377;SQUARE DM;So;0;ON;<square> 0064 006D;;;;N;;;;; +3378;SQUARE DM SQUARED;So;0;ON;<square> 0064 006D 00B2;;;;N;;;;; +3379;SQUARE DM CUBED;So;0;ON;<square> 0064 006D 00B3;;;;N;;;;; +337A;SQUARE IU;So;0;ON;<square> 0049 0055;;;;N;;;;; +337B;SQUARE ERA NAME HEISEI;So;0;L;<square> 5E73 6210;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME HEISEI;;;; +337C;SQUARE ERA NAME SYOUWA;So;0;L;<square> 662D 548C;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA;;;; +337D;SQUARE ERA NAME TAISYOU;So;0;L;<square> 5927 6B63;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU;;;; +337E;SQUARE ERA NAME MEIZI;So;0;L;<square> 660E 6CBB;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME MEIZI;;;; +337F;SQUARE CORPORATION;So;0;L;<square> 682A 5F0F 4F1A 793E;;;;N;SQUARED FOUR IDEOGRAPHS CORPORATION;;;; +3380;SQUARE PA AMPS;So;0;L;<square> 0070 0041;;;;N;SQUARED PA AMPS;;;; +3381;SQUARE NA;So;0;L;<square> 006E 0041;;;;N;SQUARED NA;;;; +3382;SQUARE MU A;So;0;L;<square> 03BC 0041;;;;N;SQUARED MU A;;;; +3383;SQUARE MA;So;0;L;<square> 006D 0041;;;;N;SQUARED MA;;;; +3384;SQUARE KA;So;0;L;<square> 006B 0041;;;;N;SQUARED KA;;;; +3385;SQUARE KB;So;0;L;<square> 004B 0042;;;;N;SQUARED KB;;;; +3386;SQUARE MB;So;0;L;<square> 004D 0042;;;;N;SQUARED MB;;;; +3387;SQUARE GB;So;0;L;<square> 0047 0042;;;;N;SQUARED GB;;;; +3388;SQUARE CAL;So;0;L;<square> 0063 0061 006C;;;;N;SQUARED CAL;;;; +3389;SQUARE KCAL;So;0;L;<square> 006B 0063 0061 006C;;;;N;SQUARED KCAL;;;; +338A;SQUARE PF;So;0;L;<square> 0070 0046;;;;N;SQUARED PF;;;; +338B;SQUARE NF;So;0;L;<square> 006E 0046;;;;N;SQUARED NF;;;; +338C;SQUARE MU F;So;0;L;<square> 03BC 0046;;;;N;SQUARED MU F;;;; +338D;SQUARE MU G;So;0;L;<square> 03BC 0067;;;;N;SQUARED MU G;;;; +338E;SQUARE MG;So;0;L;<square> 006D 0067;;;;N;SQUARED MG;;;; +338F;SQUARE KG;So;0;L;<square> 006B 0067;;;;N;SQUARED KG;;;; +3390;SQUARE HZ;So;0;L;<square> 0048 007A;;;;N;SQUARED HZ;;;; +3391;SQUARE KHZ;So;0;L;<square> 006B 0048 007A;;;;N;SQUARED KHZ;;;; +3392;SQUARE MHZ;So;0;L;<square> 004D 0048 007A;;;;N;SQUARED MHZ;;;; +3393;SQUARE GHZ;So;0;L;<square> 0047 0048 007A;;;;N;SQUARED GHZ;;;; +3394;SQUARE THZ;So;0;L;<square> 0054 0048 007A;;;;N;SQUARED THZ;;;; +3395;SQUARE MU L;So;0;L;<square> 03BC 2113;;;;N;SQUARED MU L;;;; +3396;SQUARE ML;So;0;L;<square> 006D 2113;;;;N;SQUARED ML;;;; +3397;SQUARE DL;So;0;L;<square> 0064 2113;;;;N;SQUARED DL;;;; +3398;SQUARE KL;So;0;L;<square> 006B 2113;;;;N;SQUARED KL;;;; +3399;SQUARE FM;So;0;L;<square> 0066 006D;;;;N;SQUARED FM;;;; +339A;SQUARE NM;So;0;L;<square> 006E 006D;;;;N;SQUARED NM;;;; +339B;SQUARE MU M;So;0;L;<square> 03BC 006D;;;;N;SQUARED MU M;;;; +339C;SQUARE MM;So;0;L;<square> 006D 006D;;;;N;SQUARED MM;;;; +339D;SQUARE CM;So;0;L;<square> 0063 006D;;;;N;SQUARED CM;;;; +339E;SQUARE KM;So;0;L;<square> 006B 006D;;;;N;SQUARED KM;;;; +339F;SQUARE MM SQUARED;So;0;L;<square> 006D 006D 00B2;;;;N;SQUARED MM SQUARED;;;; +33A0;SQUARE CM SQUARED;So;0;L;<square> 0063 006D 00B2;;;;N;SQUARED CM SQUARED;;;; +33A1;SQUARE M SQUARED;So;0;L;<square> 006D 00B2;;;;N;SQUARED M SQUARED;;;; +33A2;SQUARE KM SQUARED;So;0;L;<square> 006B 006D 00B2;;;;N;SQUARED KM SQUARED;;;; +33A3;SQUARE MM CUBED;So;0;L;<square> 006D 006D 00B3;;;;N;SQUARED MM CUBED;;;; +33A4;SQUARE CM CUBED;So;0;L;<square> 0063 006D 00B3;;;;N;SQUARED CM CUBED;;;; +33A5;SQUARE M CUBED;So;0;L;<square> 006D 00B3;;;;N;SQUARED M CUBED;;;; +33A6;SQUARE KM CUBED;So;0;L;<square> 006B 006D 00B3;;;;N;SQUARED KM CUBED;;;; +33A7;SQUARE M OVER S;So;0;L;<square> 006D 2215 0073;;;;N;SQUARED M OVER S;;;; +33A8;SQUARE M OVER S SQUARED;So;0;L;<square> 006D 2215 0073 00B2;;;;N;SQUARED M OVER S SQUARED;;;; +33A9;SQUARE PA;So;0;L;<square> 0050 0061;;;;N;SQUARED PA;;;; +33AA;SQUARE KPA;So;0;L;<square> 006B 0050 0061;;;;N;SQUARED KPA;;;; +33AB;SQUARE MPA;So;0;L;<square> 004D 0050 0061;;;;N;SQUARED MPA;;;; +33AC;SQUARE GPA;So;0;L;<square> 0047 0050 0061;;;;N;SQUARED GPA;;;; +33AD;SQUARE RAD;So;0;L;<square> 0072 0061 0064;;;;N;SQUARED RAD;;;; +33AE;SQUARE RAD OVER S;So;0;L;<square> 0072 0061 0064 2215 0073;;;;N;SQUARED RAD OVER S;;;; +33AF;SQUARE RAD OVER S SQUARED;So;0;L;<square> 0072 0061 0064 2215 0073 00B2;;;;N;SQUARED RAD OVER S SQUARED;;;; +33B0;SQUARE PS;So;0;L;<square> 0070 0073;;;;N;SQUARED PS;;;; +33B1;SQUARE NS;So;0;L;<square> 006E 0073;;;;N;SQUARED NS;;;; +33B2;SQUARE MU S;So;0;L;<square> 03BC 0073;;;;N;SQUARED MU S;;;; +33B3;SQUARE MS;So;0;L;<square> 006D 0073;;;;N;SQUARED MS;;;; +33B4;SQUARE PV;So;0;L;<square> 0070 0056;;;;N;SQUARED PV;;;; +33B5;SQUARE NV;So;0;L;<square> 006E 0056;;;;N;SQUARED NV;;;; +33B6;SQUARE MU V;So;0;L;<square> 03BC 0056;;;;N;SQUARED MU V;;;; +33B7;SQUARE MV;So;0;L;<square> 006D 0056;;;;N;SQUARED MV;;;; +33B8;SQUARE KV;So;0;L;<square> 006B 0056;;;;N;SQUARED KV;;;; +33B9;SQUARE MV MEGA;So;0;L;<square> 004D 0056;;;;N;SQUARED MV MEGA;;;; +33BA;SQUARE PW;So;0;L;<square> 0070 0057;;;;N;SQUARED PW;;;; +33BB;SQUARE NW;So;0;L;<square> 006E 0057;;;;N;SQUARED NW;;;; +33BC;SQUARE MU W;So;0;L;<square> 03BC 0057;;;;N;SQUARED MU W;;;; +33BD;SQUARE MW;So;0;L;<square> 006D 0057;;;;N;SQUARED MW;;;; +33BE;SQUARE KW;So;0;L;<square> 006B 0057;;;;N;SQUARED KW;;;; +33BF;SQUARE MW MEGA;So;0;L;<square> 004D 0057;;;;N;SQUARED MW MEGA;;;; +33C0;SQUARE K OHM;So;0;L;<square> 006B 03A9;;;;N;SQUARED K OHM;;;; +33C1;SQUARE M OHM;So;0;L;<square> 004D 03A9;;;;N;SQUARED M OHM;;;; +33C2;SQUARE AM;So;0;L;<square> 0061 002E 006D 002E;;;;N;SQUARED AM;;;; +33C3;SQUARE BQ;So;0;L;<square> 0042 0071;;;;N;SQUARED BQ;;;; +33C4;SQUARE CC;So;0;L;<square> 0063 0063;;;;N;SQUARED CC;;;; +33C5;SQUARE CD;So;0;L;<square> 0063 0064;;;;N;SQUARED CD;;;; +33C6;SQUARE C OVER KG;So;0;L;<square> 0043 2215 006B 0067;;;;N;SQUARED C OVER KG;;;; +33C7;SQUARE CO;So;0;L;<square> 0043 006F 002E;;;;N;SQUARED CO;;;; +33C8;SQUARE DB;So;0;L;<square> 0064 0042;;;;N;SQUARED DB;;;; +33C9;SQUARE GY;So;0;L;<square> 0047 0079;;;;N;SQUARED GY;;;; +33CA;SQUARE HA;So;0;L;<square> 0068 0061;;;;N;SQUARED HA;;;; +33CB;SQUARE HP;So;0;L;<square> 0048 0050;;;;N;SQUARED HP;;;; +33CC;SQUARE IN;So;0;L;<square> 0069 006E;;;;N;SQUARED IN;;;; +33CD;SQUARE KK;So;0;L;<square> 004B 004B;;;;N;SQUARED KK;;;; +33CE;SQUARE KM CAPITAL;So;0;L;<square> 004B 004D;;;;N;SQUARED KM CAPITAL;;;; +33CF;SQUARE KT;So;0;L;<square> 006B 0074;;;;N;SQUARED KT;;;; +33D0;SQUARE LM;So;0;L;<square> 006C 006D;;;;N;SQUARED LM;;;; +33D1;SQUARE LN;So;0;L;<square> 006C 006E;;;;N;SQUARED LN;;;; +33D2;SQUARE LOG;So;0;L;<square> 006C 006F 0067;;;;N;SQUARED LOG;;;; +33D3;SQUARE LX;So;0;L;<square> 006C 0078;;;;N;SQUARED LX;;;; +33D4;SQUARE MB SMALL;So;0;L;<square> 006D 0062;;;;N;SQUARED MB SMALL;;;; +33D5;SQUARE MIL;So;0;L;<square> 006D 0069 006C;;;;N;SQUARED MIL;;;; +33D6;SQUARE MOL;So;0;L;<square> 006D 006F 006C;;;;N;SQUARED MOL;;;; +33D7;SQUARE PH;So;0;L;<square> 0050 0048;;;;N;SQUARED PH;;;; +33D8;SQUARE PM;So;0;L;<square> 0070 002E 006D 002E;;;;N;SQUARED PM;;;; +33D9;SQUARE PPM;So;0;L;<square> 0050 0050 004D;;;;N;SQUARED PPM;;;; +33DA;SQUARE PR;So;0;L;<square> 0050 0052;;;;N;SQUARED PR;;;; +33DB;SQUARE SR;So;0;L;<square> 0073 0072;;;;N;SQUARED SR;;;; +33DC;SQUARE SV;So;0;L;<square> 0053 0076;;;;N;SQUARED SV;;;; +33DD;SQUARE WB;So;0;L;<square> 0057 0062;;;;N;SQUARED WB;;;; +33DE;SQUARE V OVER M;So;0;ON;<square> 0056 2215 006D;;;;N;;;;; +33DF;SQUARE A OVER M;So;0;ON;<square> 0041 2215 006D;;;;N;;;;; +33E0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE;So;0;L;<compat> 0031 65E5;;;;N;;;;; +33E1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO;So;0;L;<compat> 0032 65E5;;;;N;;;;; +33E2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE;So;0;L;<compat> 0033 65E5;;;;N;;;;; +33E3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR;So;0;L;<compat> 0034 65E5;;;;N;;;;; +33E4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE;So;0;L;<compat> 0035 65E5;;;;N;;;;; +33E5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX;So;0;L;<compat> 0036 65E5;;;;N;;;;; +33E6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN;So;0;L;<compat> 0037 65E5;;;;N;;;;; +33E7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT;So;0;L;<compat> 0038 65E5;;;;N;;;;; +33E8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE;So;0;L;<compat> 0039 65E5;;;;N;;;;; +33E9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN;So;0;L;<compat> 0031 0030 65E5;;;;N;;;;; +33EA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN;So;0;L;<compat> 0031 0031 65E5;;;;N;;;;; +33EB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE;So;0;L;<compat> 0031 0032 65E5;;;;N;;;;; +33EC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN;So;0;L;<compat> 0031 0033 65E5;;;;N;;;;; +33ED;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN;So;0;L;<compat> 0031 0034 65E5;;;;N;;;;; +33EE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN;So;0;L;<compat> 0031 0035 65E5;;;;N;;;;; +33EF;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN;So;0;L;<compat> 0031 0036 65E5;;;;N;;;;; +33F0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN;So;0;L;<compat> 0031 0037 65E5;;;;N;;;;; +33F1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN;So;0;L;<compat> 0031 0038 65E5;;;;N;;;;; +33F2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN;So;0;L;<compat> 0031 0039 65E5;;;;N;;;;; +33F3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY;So;0;L;<compat> 0032 0030 65E5;;;;N;;;;; +33F4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE;So;0;L;<compat> 0032 0031 65E5;;;;N;;;;; +33F5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO;So;0;L;<compat> 0032 0032 65E5;;;;N;;;;; +33F6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE;So;0;L;<compat> 0032 0033 65E5;;;;N;;;;; +33F7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR;So;0;L;<compat> 0032 0034 65E5;;;;N;;;;; +33F8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE;So;0;L;<compat> 0032 0035 65E5;;;;N;;;;; +33F9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX;So;0;L;<compat> 0032 0036 65E5;;;;N;;;;; +33FA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN;So;0;L;<compat> 0032 0037 65E5;;;;N;;;;; +33FB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT;So;0;L;<compat> 0032 0038 65E5;;;;N;;;;; +33FC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE;So;0;L;<compat> 0032 0039 65E5;;;;N;;;;; +33FD;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY;So;0;L;<compat> 0033 0030 65E5;;;;N;;;;; +33FE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE;So;0;L;<compat> 0033 0031 65E5;;;;N;;;;; +33FF;SQUARE GAL;So;0;ON;<square> 0067 0061 006C;;;;N;;;;; +3400;<CJK Ideograph Extension A, First>;Lo;0;L;;;;;N;;;;; +4DB5;<CJK Ideograph Extension A, Last>;Lo;0;L;;;;;N;;;;; +4DC0;HEXAGRAM FOR THE CREATIVE HEAVEN;So;0;ON;;;;;N;;;;; +4DC1;HEXAGRAM FOR THE RECEPTIVE EARTH;So;0;ON;;;;;N;;;;; +4DC2;HEXAGRAM FOR DIFFICULTY AT THE BEGINNING;So;0;ON;;;;;N;;;;; +4DC3;HEXAGRAM FOR YOUTHFUL FOLLY;So;0;ON;;;;;N;;;;; +4DC4;HEXAGRAM FOR WAITING;So;0;ON;;;;;N;;;;; +4DC5;HEXAGRAM FOR CONFLICT;So;0;ON;;;;;N;;;;; +4DC6;HEXAGRAM FOR THE ARMY;So;0;ON;;;;;N;;;;; +4DC7;HEXAGRAM FOR HOLDING TOGETHER;So;0;ON;;;;;N;;;;; +4DC8;HEXAGRAM FOR SMALL TAMING;So;0;ON;;;;;N;;;;; +4DC9;HEXAGRAM FOR TREADING;So;0;ON;;;;;N;;;;; +4DCA;HEXAGRAM FOR PEACE;So;0;ON;;;;;N;;;;; +4DCB;HEXAGRAM FOR STANDSTILL;So;0;ON;;;;;N;;;;; +4DCC;HEXAGRAM FOR FELLOWSHIP;So;0;ON;;;;;N;;;;; +4DCD;HEXAGRAM FOR GREAT POSSESSION;So;0;ON;;;;;N;;;;; +4DCE;HEXAGRAM FOR MODESTY;So;0;ON;;;;;N;;;;; +4DCF;HEXAGRAM FOR ENTHUSIASM;So;0;ON;;;;;N;;;;; +4DD0;HEXAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;; +4DD1;HEXAGRAM FOR WORK ON THE DECAYED;So;0;ON;;;;;N;;;;; +4DD2;HEXAGRAM FOR APPROACH;So;0;ON;;;;;N;;;;; +4DD3;HEXAGRAM FOR CONTEMPLATION;So;0;ON;;;;;N;;;;; +4DD4;HEXAGRAM FOR BITING THROUGH;So;0;ON;;;;;N;;;;; +4DD5;HEXAGRAM FOR GRACE;So;0;ON;;;;;N;;;;; +4DD6;HEXAGRAM FOR SPLITTING APART;So;0;ON;;;;;N;;;;; +4DD7;HEXAGRAM FOR RETURN;So;0;ON;;;;;N;;;;; +4DD8;HEXAGRAM FOR INNOCENCE;So;0;ON;;;;;N;;;;; +4DD9;HEXAGRAM FOR GREAT TAMING;So;0;ON;;;;;N;;;;; +4DDA;HEXAGRAM FOR MOUTH CORNERS;So;0;ON;;;;;N;;;;; +4DDB;HEXAGRAM FOR GREAT PREPONDERANCE;So;0;ON;;;;;N;;;;; +4DDC;HEXAGRAM FOR THE ABYSMAL WATER;So;0;ON;;;;;N;;;;; +4DDD;HEXAGRAM FOR THE CLINGING FIRE;So;0;ON;;;;;N;;;;; +4DDE;HEXAGRAM FOR INFLUENCE;So;0;ON;;;;;N;;;;; +4DDF;HEXAGRAM FOR DURATION;So;0;ON;;;;;N;;;;; +4DE0;HEXAGRAM FOR RETREAT;So;0;ON;;;;;N;;;;; +4DE1;HEXAGRAM FOR GREAT POWER;So;0;ON;;;;;N;;;;; +4DE2;HEXAGRAM FOR PROGRESS;So;0;ON;;;;;N;;;;; +4DE3;HEXAGRAM FOR DARKENING OF THE LIGHT;So;0;ON;;;;;N;;;;; +4DE4;HEXAGRAM FOR THE FAMILY;So;0;ON;;;;;N;;;;; +4DE5;HEXAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;; +4DE6;HEXAGRAM FOR OBSTRUCTION;So;0;ON;;;;;N;;;;; +4DE7;HEXAGRAM FOR DELIVERANCE;So;0;ON;;;;;N;;;;; +4DE8;HEXAGRAM FOR DECREASE;So;0;ON;;;;;N;;;;; +4DE9;HEXAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;; +4DEA;HEXAGRAM FOR BREAKTHROUGH;So;0;ON;;;;;N;;;;; +4DEB;HEXAGRAM FOR COMING TO MEET;So;0;ON;;;;;N;;;;; +4DEC;HEXAGRAM FOR GATHERING TOGETHER;So;0;ON;;;;;N;;;;; +4DED;HEXAGRAM FOR PUSHING UPWARD;So;0;ON;;;;;N;;;;; +4DEE;HEXAGRAM FOR OPPRESSION;So;0;ON;;;;;N;;;;; +4DEF;HEXAGRAM FOR THE WELL;So;0;ON;;;;;N;;;;; +4DF0;HEXAGRAM FOR REVOLUTION;So;0;ON;;;;;N;;;;; +4DF1;HEXAGRAM FOR THE CAULDRON;So;0;ON;;;;;N;;;;; +4DF2;HEXAGRAM FOR THE AROUSING THUNDER;So;0;ON;;;;;N;;;;; +4DF3;HEXAGRAM FOR THE KEEPING STILL MOUNTAIN;So;0;ON;;;;;N;;;;; +4DF4;HEXAGRAM FOR DEVELOPMENT;So;0;ON;;;;;N;;;;; +4DF5;HEXAGRAM FOR THE MARRYING MAIDEN;So;0;ON;;;;;N;;;;; +4DF6;HEXAGRAM FOR ABUNDANCE;So;0;ON;;;;;N;;;;; +4DF7;HEXAGRAM FOR THE WANDERER;So;0;ON;;;;;N;;;;; +4DF8;HEXAGRAM FOR THE GENTLE WIND;So;0;ON;;;;;N;;;;; +4DF9;HEXAGRAM FOR THE JOYOUS LAKE;So;0;ON;;;;;N;;;;; +4DFA;HEXAGRAM FOR DISPERSION;So;0;ON;;;;;N;;;;; +4DFB;HEXAGRAM FOR LIMITATION;So;0;ON;;;;;N;;;;; +4DFC;HEXAGRAM FOR INNER TRUTH;So;0;ON;;;;;N;;;;; +4DFD;HEXAGRAM FOR SMALL PREPONDERANCE;So;0;ON;;;;;N;;;;; +4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;; +4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;; +4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;; +9FCB;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;; +A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;; +A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;; +A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;; +A003;YI SYLLABLE IP;Lo;0;L;;;;;N;;;;; +A004;YI SYLLABLE IET;Lo;0;L;;;;;N;;;;; +A005;YI SYLLABLE IEX;Lo;0;L;;;;;N;;;;; +A006;YI SYLLABLE IE;Lo;0;L;;;;;N;;;;; +A007;YI SYLLABLE IEP;Lo;0;L;;;;;N;;;;; +A008;YI SYLLABLE AT;Lo;0;L;;;;;N;;;;; +A009;YI SYLLABLE AX;Lo;0;L;;;;;N;;;;; +A00A;YI SYLLABLE A;Lo;0;L;;;;;N;;;;; +A00B;YI SYLLABLE AP;Lo;0;L;;;;;N;;;;; +A00C;YI SYLLABLE UOX;Lo;0;L;;;;;N;;;;; +A00D;YI SYLLABLE UO;Lo;0;L;;;;;N;;;;; +A00E;YI SYLLABLE UOP;Lo;0;L;;;;;N;;;;; +A00F;YI SYLLABLE OT;Lo;0;L;;;;;N;;;;; +A010;YI SYLLABLE OX;Lo;0;L;;;;;N;;;;; +A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;; +A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;; +A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;; +A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;; +A015;YI SYLLABLE WU;Lm;0;L;;;;;N;;;;; +A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;; +A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;; +A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;; +A019;YI SYLLABLE BIP;Lo;0;L;;;;;N;;;;; +A01A;YI SYLLABLE BIET;Lo;0;L;;;;;N;;;;; +A01B;YI SYLLABLE BIEX;Lo;0;L;;;;;N;;;;; +A01C;YI SYLLABLE BIE;Lo;0;L;;;;;N;;;;; +A01D;YI SYLLABLE BIEP;Lo;0;L;;;;;N;;;;; +A01E;YI SYLLABLE BAT;Lo;0;L;;;;;N;;;;; +A01F;YI SYLLABLE BAX;Lo;0;L;;;;;N;;;;; +A020;YI SYLLABLE BA;Lo;0;L;;;;;N;;;;; +A021;YI SYLLABLE BAP;Lo;0;L;;;;;N;;;;; +A022;YI SYLLABLE BUOX;Lo;0;L;;;;;N;;;;; +A023;YI SYLLABLE BUO;Lo;0;L;;;;;N;;;;; +A024;YI SYLLABLE BUOP;Lo;0;L;;;;;N;;;;; +A025;YI SYLLABLE BOT;Lo;0;L;;;;;N;;;;; +A026;YI SYLLABLE BOX;Lo;0;L;;;;;N;;;;; +A027;YI SYLLABLE BO;Lo;0;L;;;;;N;;;;; +A028;YI SYLLABLE BOP;Lo;0;L;;;;;N;;;;; +A029;YI SYLLABLE BEX;Lo;0;L;;;;;N;;;;; +A02A;YI SYLLABLE BE;Lo;0;L;;;;;N;;;;; +A02B;YI SYLLABLE BEP;Lo;0;L;;;;;N;;;;; +A02C;YI SYLLABLE BUT;Lo;0;L;;;;;N;;;;; +A02D;YI SYLLABLE BUX;Lo;0;L;;;;;N;;;;; +A02E;YI SYLLABLE BU;Lo;0;L;;;;;N;;;;; +A02F;YI SYLLABLE BUP;Lo;0;L;;;;;N;;;;; +A030;YI SYLLABLE BURX;Lo;0;L;;;;;N;;;;; +A031;YI SYLLABLE BUR;Lo;0;L;;;;;N;;;;; +A032;YI SYLLABLE BYT;Lo;0;L;;;;;N;;;;; +A033;YI SYLLABLE BYX;Lo;0;L;;;;;N;;;;; +A034;YI SYLLABLE BY;Lo;0;L;;;;;N;;;;; +A035;YI SYLLABLE BYP;Lo;0;L;;;;;N;;;;; +A036;YI SYLLABLE BYRX;Lo;0;L;;;;;N;;;;; +A037;YI SYLLABLE BYR;Lo;0;L;;;;;N;;;;; +A038;YI SYLLABLE PIT;Lo;0;L;;;;;N;;;;; +A039;YI SYLLABLE PIX;Lo;0;L;;;;;N;;;;; +A03A;YI SYLLABLE PI;Lo;0;L;;;;;N;;;;; +A03B;YI SYLLABLE PIP;Lo;0;L;;;;;N;;;;; +A03C;YI SYLLABLE PIEX;Lo;0;L;;;;;N;;;;; +A03D;YI SYLLABLE PIE;Lo;0;L;;;;;N;;;;; +A03E;YI SYLLABLE PIEP;Lo;0;L;;;;;N;;;;; +A03F;YI SYLLABLE PAT;Lo;0;L;;;;;N;;;;; +A040;YI SYLLABLE PAX;Lo;0;L;;;;;N;;;;; +A041;YI SYLLABLE PA;Lo;0;L;;;;;N;;;;; +A042;YI SYLLABLE PAP;Lo;0;L;;;;;N;;;;; +A043;YI SYLLABLE PUOX;Lo;0;L;;;;;N;;;;; +A044;YI SYLLABLE PUO;Lo;0;L;;;;;N;;;;; +A045;YI SYLLABLE PUOP;Lo;0;L;;;;;N;;;;; +A046;YI SYLLABLE POT;Lo;0;L;;;;;N;;;;; +A047;YI SYLLABLE POX;Lo;0;L;;;;;N;;;;; +A048;YI SYLLABLE PO;Lo;0;L;;;;;N;;;;; +A049;YI SYLLABLE POP;Lo;0;L;;;;;N;;;;; +A04A;YI SYLLABLE PUT;Lo;0;L;;;;;N;;;;; +A04B;YI SYLLABLE PUX;Lo;0;L;;;;;N;;;;; +A04C;YI SYLLABLE PU;Lo;0;L;;;;;N;;;;; +A04D;YI SYLLABLE PUP;Lo;0;L;;;;;N;;;;; +A04E;YI SYLLABLE PURX;Lo;0;L;;;;;N;;;;; +A04F;YI SYLLABLE PUR;Lo;0;L;;;;;N;;;;; +A050;YI SYLLABLE PYT;Lo;0;L;;;;;N;;;;; +A051;YI SYLLABLE PYX;Lo;0;L;;;;;N;;;;; +A052;YI SYLLABLE PY;Lo;0;L;;;;;N;;;;; +A053;YI SYLLABLE PYP;Lo;0;L;;;;;N;;;;; +A054;YI SYLLABLE PYRX;Lo;0;L;;;;;N;;;;; +A055;YI SYLLABLE PYR;Lo;0;L;;;;;N;;;;; +A056;YI SYLLABLE BBIT;Lo;0;L;;;;;N;;;;; +A057;YI SYLLABLE BBIX;Lo;0;L;;;;;N;;;;; +A058;YI SYLLABLE BBI;Lo;0;L;;;;;N;;;;; +A059;YI SYLLABLE BBIP;Lo;0;L;;;;;N;;;;; +A05A;YI SYLLABLE BBIET;Lo;0;L;;;;;N;;;;; +A05B;YI SYLLABLE BBIEX;Lo;0;L;;;;;N;;;;; +A05C;YI SYLLABLE BBIE;Lo;0;L;;;;;N;;;;; +A05D;YI SYLLABLE BBIEP;Lo;0;L;;;;;N;;;;; +A05E;YI SYLLABLE BBAT;Lo;0;L;;;;;N;;;;; +A05F;YI SYLLABLE BBAX;Lo;0;L;;;;;N;;;;; +A060;YI SYLLABLE BBA;Lo;0;L;;;;;N;;;;; +A061;YI SYLLABLE BBAP;Lo;0;L;;;;;N;;;;; +A062;YI SYLLABLE BBUOX;Lo;0;L;;;;;N;;;;; +A063;YI SYLLABLE BBUO;Lo;0;L;;;;;N;;;;; +A064;YI SYLLABLE BBUOP;Lo;0;L;;;;;N;;;;; +A065;YI SYLLABLE BBOT;Lo;0;L;;;;;N;;;;; +A066;YI SYLLABLE BBOX;Lo;0;L;;;;;N;;;;; +A067;YI SYLLABLE BBO;Lo;0;L;;;;;N;;;;; +A068;YI SYLLABLE BBOP;Lo;0;L;;;;;N;;;;; +A069;YI SYLLABLE BBEX;Lo;0;L;;;;;N;;;;; +A06A;YI SYLLABLE BBE;Lo;0;L;;;;;N;;;;; +A06B;YI SYLLABLE BBEP;Lo;0;L;;;;;N;;;;; +A06C;YI SYLLABLE BBUT;Lo;0;L;;;;;N;;;;; +A06D;YI SYLLABLE BBUX;Lo;0;L;;;;;N;;;;; +A06E;YI SYLLABLE BBU;Lo;0;L;;;;;N;;;;; +A06F;YI SYLLABLE BBUP;Lo;0;L;;;;;N;;;;; +A070;YI SYLLABLE BBURX;Lo;0;L;;;;;N;;;;; +A071;YI SYLLABLE BBUR;Lo;0;L;;;;;N;;;;; +A072;YI SYLLABLE BBYT;Lo;0;L;;;;;N;;;;; +A073;YI SYLLABLE BBYX;Lo;0;L;;;;;N;;;;; +A074;YI SYLLABLE BBY;Lo;0;L;;;;;N;;;;; +A075;YI SYLLABLE BBYP;Lo;0;L;;;;;N;;;;; +A076;YI SYLLABLE NBIT;Lo;0;L;;;;;N;;;;; +A077;YI SYLLABLE NBIX;Lo;0;L;;;;;N;;;;; +A078;YI SYLLABLE NBI;Lo;0;L;;;;;N;;;;; +A079;YI SYLLABLE NBIP;Lo;0;L;;;;;N;;;;; +A07A;YI SYLLABLE NBIEX;Lo;0;L;;;;;N;;;;; +A07B;YI SYLLABLE NBIE;Lo;0;L;;;;;N;;;;; +A07C;YI SYLLABLE NBIEP;Lo;0;L;;;;;N;;;;; +A07D;YI SYLLABLE NBAT;Lo;0;L;;;;;N;;;;; +A07E;YI SYLLABLE NBAX;Lo;0;L;;;;;N;;;;; +A07F;YI SYLLABLE NBA;Lo;0;L;;;;;N;;;;; +A080;YI SYLLABLE NBAP;Lo;0;L;;;;;N;;;;; +A081;YI SYLLABLE NBOT;Lo;0;L;;;;;N;;;;; +A082;YI SYLLABLE NBOX;Lo;0;L;;;;;N;;;;; +A083;YI SYLLABLE NBO;Lo;0;L;;;;;N;;;;; +A084;YI SYLLABLE NBOP;Lo;0;L;;;;;N;;;;; +A085;YI SYLLABLE NBUT;Lo;0;L;;;;;N;;;;; +A086;YI SYLLABLE NBUX;Lo;0;L;;;;;N;;;;; +A087;YI SYLLABLE NBU;Lo;0;L;;;;;N;;;;; +A088;YI SYLLABLE NBUP;Lo;0;L;;;;;N;;;;; +A089;YI SYLLABLE NBURX;Lo;0;L;;;;;N;;;;; +A08A;YI SYLLABLE NBUR;Lo;0;L;;;;;N;;;;; +A08B;YI SYLLABLE NBYT;Lo;0;L;;;;;N;;;;; +A08C;YI SYLLABLE NBYX;Lo;0;L;;;;;N;;;;; +A08D;YI SYLLABLE NBY;Lo;0;L;;;;;N;;;;; +A08E;YI SYLLABLE NBYP;Lo;0;L;;;;;N;;;;; +A08F;YI SYLLABLE NBYRX;Lo;0;L;;;;;N;;;;; +A090;YI SYLLABLE NBYR;Lo;0;L;;;;;N;;;;; +A091;YI SYLLABLE HMIT;Lo;0;L;;;;;N;;;;; +A092;YI SYLLABLE HMIX;Lo;0;L;;;;;N;;;;; +A093;YI SYLLABLE HMI;Lo;0;L;;;;;N;;;;; +A094;YI SYLLABLE HMIP;Lo;0;L;;;;;N;;;;; +A095;YI SYLLABLE HMIEX;Lo;0;L;;;;;N;;;;; +A096;YI SYLLABLE HMIE;Lo;0;L;;;;;N;;;;; +A097;YI SYLLABLE HMIEP;Lo;0;L;;;;;N;;;;; +A098;YI SYLLABLE HMAT;Lo;0;L;;;;;N;;;;; +A099;YI SYLLABLE HMAX;Lo;0;L;;;;;N;;;;; +A09A;YI SYLLABLE HMA;Lo;0;L;;;;;N;;;;; +A09B;YI SYLLABLE HMAP;Lo;0;L;;;;;N;;;;; +A09C;YI SYLLABLE HMUOX;Lo;0;L;;;;;N;;;;; +A09D;YI SYLLABLE HMUO;Lo;0;L;;;;;N;;;;; +A09E;YI SYLLABLE HMUOP;Lo;0;L;;;;;N;;;;; +A09F;YI SYLLABLE HMOT;Lo;0;L;;;;;N;;;;; +A0A0;YI SYLLABLE HMOX;Lo;0;L;;;;;N;;;;; +A0A1;YI SYLLABLE HMO;Lo;0;L;;;;;N;;;;; +A0A2;YI SYLLABLE HMOP;Lo;0;L;;;;;N;;;;; +A0A3;YI SYLLABLE HMUT;Lo;0;L;;;;;N;;;;; +A0A4;YI SYLLABLE HMUX;Lo;0;L;;;;;N;;;;; +A0A5;YI SYLLABLE HMU;Lo;0;L;;;;;N;;;;; +A0A6;YI SYLLABLE HMUP;Lo;0;L;;;;;N;;;;; +A0A7;YI SYLLABLE HMURX;Lo;0;L;;;;;N;;;;; +A0A8;YI SYLLABLE HMUR;Lo;0;L;;;;;N;;;;; +A0A9;YI SYLLABLE HMYX;Lo;0;L;;;;;N;;;;; +A0AA;YI SYLLABLE HMY;Lo;0;L;;;;;N;;;;; +A0AB;YI SYLLABLE HMYP;Lo;0;L;;;;;N;;;;; +A0AC;YI SYLLABLE HMYRX;Lo;0;L;;;;;N;;;;; +A0AD;YI SYLLABLE HMYR;Lo;0;L;;;;;N;;;;; +A0AE;YI SYLLABLE MIT;Lo;0;L;;;;;N;;;;; +A0AF;YI SYLLABLE MIX;Lo;0;L;;;;;N;;;;; +A0B0;YI SYLLABLE MI;Lo;0;L;;;;;N;;;;; +A0B1;YI SYLLABLE MIP;Lo;0;L;;;;;N;;;;; +A0B2;YI SYLLABLE MIEX;Lo;0;L;;;;;N;;;;; +A0B3;YI SYLLABLE MIE;Lo;0;L;;;;;N;;;;; +A0B4;YI SYLLABLE MIEP;Lo;0;L;;;;;N;;;;; +A0B5;YI SYLLABLE MAT;Lo;0;L;;;;;N;;;;; +A0B6;YI SYLLABLE MAX;Lo;0;L;;;;;N;;;;; +A0B7;YI SYLLABLE MA;Lo;0;L;;;;;N;;;;; +A0B8;YI SYLLABLE MAP;Lo;0;L;;;;;N;;;;; +A0B9;YI SYLLABLE MUOT;Lo;0;L;;;;;N;;;;; +A0BA;YI SYLLABLE MUOX;Lo;0;L;;;;;N;;;;; +A0BB;YI SYLLABLE MUO;Lo;0;L;;;;;N;;;;; +A0BC;YI SYLLABLE MUOP;Lo;0;L;;;;;N;;;;; +A0BD;YI SYLLABLE MOT;Lo;0;L;;;;;N;;;;; +A0BE;YI SYLLABLE MOX;Lo;0;L;;;;;N;;;;; +A0BF;YI SYLLABLE MO;Lo;0;L;;;;;N;;;;; +A0C0;YI SYLLABLE MOP;Lo;0;L;;;;;N;;;;; +A0C1;YI SYLLABLE MEX;Lo;0;L;;;;;N;;;;; +A0C2;YI SYLLABLE ME;Lo;0;L;;;;;N;;;;; +A0C3;YI SYLLABLE MUT;Lo;0;L;;;;;N;;;;; +A0C4;YI SYLLABLE MUX;Lo;0;L;;;;;N;;;;; +A0C5;YI SYLLABLE MU;Lo;0;L;;;;;N;;;;; +A0C6;YI SYLLABLE MUP;Lo;0;L;;;;;N;;;;; +A0C7;YI SYLLABLE MURX;Lo;0;L;;;;;N;;;;; +A0C8;YI SYLLABLE MUR;Lo;0;L;;;;;N;;;;; +A0C9;YI SYLLABLE MYT;Lo;0;L;;;;;N;;;;; +A0CA;YI SYLLABLE MYX;Lo;0;L;;;;;N;;;;; +A0CB;YI SYLLABLE MY;Lo;0;L;;;;;N;;;;; +A0CC;YI SYLLABLE MYP;Lo;0;L;;;;;N;;;;; +A0CD;YI SYLLABLE FIT;Lo;0;L;;;;;N;;;;; +A0CE;YI SYLLABLE FIX;Lo;0;L;;;;;N;;;;; +A0CF;YI SYLLABLE FI;Lo;0;L;;;;;N;;;;; +A0D0;YI SYLLABLE FIP;Lo;0;L;;;;;N;;;;; +A0D1;YI SYLLABLE FAT;Lo;0;L;;;;;N;;;;; +A0D2;YI SYLLABLE FAX;Lo;0;L;;;;;N;;;;; +A0D3;YI SYLLABLE FA;Lo;0;L;;;;;N;;;;; +A0D4;YI SYLLABLE FAP;Lo;0;L;;;;;N;;;;; +A0D5;YI SYLLABLE FOX;Lo;0;L;;;;;N;;;;; +A0D6;YI SYLLABLE FO;Lo;0;L;;;;;N;;;;; +A0D7;YI SYLLABLE FOP;Lo;0;L;;;;;N;;;;; +A0D8;YI SYLLABLE FUT;Lo;0;L;;;;;N;;;;; +A0D9;YI SYLLABLE FUX;Lo;0;L;;;;;N;;;;; +A0DA;YI SYLLABLE FU;Lo;0;L;;;;;N;;;;; +A0DB;YI SYLLABLE FUP;Lo;0;L;;;;;N;;;;; +A0DC;YI SYLLABLE FURX;Lo;0;L;;;;;N;;;;; +A0DD;YI SYLLABLE FUR;Lo;0;L;;;;;N;;;;; +A0DE;YI SYLLABLE FYT;Lo;0;L;;;;;N;;;;; +A0DF;YI SYLLABLE FYX;Lo;0;L;;;;;N;;;;; +A0E0;YI SYLLABLE FY;Lo;0;L;;;;;N;;;;; +A0E1;YI SYLLABLE FYP;Lo;0;L;;;;;N;;;;; +A0E2;YI SYLLABLE VIT;Lo;0;L;;;;;N;;;;; +A0E3;YI SYLLABLE VIX;Lo;0;L;;;;;N;;;;; +A0E4;YI SYLLABLE VI;Lo;0;L;;;;;N;;;;; +A0E5;YI SYLLABLE VIP;Lo;0;L;;;;;N;;;;; +A0E6;YI SYLLABLE VIET;Lo;0;L;;;;;N;;;;; +A0E7;YI SYLLABLE VIEX;Lo;0;L;;;;;N;;;;; +A0E8;YI SYLLABLE VIE;Lo;0;L;;;;;N;;;;; +A0E9;YI SYLLABLE VIEP;Lo;0;L;;;;;N;;;;; +A0EA;YI SYLLABLE VAT;Lo;0;L;;;;;N;;;;; +A0EB;YI SYLLABLE VAX;Lo;0;L;;;;;N;;;;; +A0EC;YI SYLLABLE VA;Lo;0;L;;;;;N;;;;; +A0ED;YI SYLLABLE VAP;Lo;0;L;;;;;N;;;;; +A0EE;YI SYLLABLE VOT;Lo;0;L;;;;;N;;;;; +A0EF;YI SYLLABLE VOX;Lo;0;L;;;;;N;;;;; +A0F0;YI SYLLABLE VO;Lo;0;L;;;;;N;;;;; +A0F1;YI SYLLABLE VOP;Lo;0;L;;;;;N;;;;; +A0F2;YI SYLLABLE VEX;Lo;0;L;;;;;N;;;;; +A0F3;YI SYLLABLE VEP;Lo;0;L;;;;;N;;;;; +A0F4;YI SYLLABLE VUT;Lo;0;L;;;;;N;;;;; +A0F5;YI SYLLABLE VUX;Lo;0;L;;;;;N;;;;; +A0F6;YI SYLLABLE VU;Lo;0;L;;;;;N;;;;; +A0F7;YI SYLLABLE VUP;Lo;0;L;;;;;N;;;;; +A0F8;YI SYLLABLE VURX;Lo;0;L;;;;;N;;;;; +A0F9;YI SYLLABLE VUR;Lo;0;L;;;;;N;;;;; +A0FA;YI SYLLABLE VYT;Lo;0;L;;;;;N;;;;; +A0FB;YI SYLLABLE VYX;Lo;0;L;;;;;N;;;;; +A0FC;YI SYLLABLE VY;Lo;0;L;;;;;N;;;;; +A0FD;YI SYLLABLE VYP;Lo;0;L;;;;;N;;;;; +A0FE;YI SYLLABLE VYRX;Lo;0;L;;;;;N;;;;; +A0FF;YI SYLLABLE VYR;Lo;0;L;;;;;N;;;;; +A100;YI SYLLABLE DIT;Lo;0;L;;;;;N;;;;; +A101;YI SYLLABLE DIX;Lo;0;L;;;;;N;;;;; +A102;YI SYLLABLE DI;Lo;0;L;;;;;N;;;;; +A103;YI SYLLABLE DIP;Lo;0;L;;;;;N;;;;; +A104;YI SYLLABLE DIEX;Lo;0;L;;;;;N;;;;; +A105;YI SYLLABLE DIE;Lo;0;L;;;;;N;;;;; +A106;YI SYLLABLE DIEP;Lo;0;L;;;;;N;;;;; +A107;YI SYLLABLE DAT;Lo;0;L;;;;;N;;;;; +A108;YI SYLLABLE DAX;Lo;0;L;;;;;N;;;;; +A109;YI SYLLABLE DA;Lo;0;L;;;;;N;;;;; +A10A;YI SYLLABLE DAP;Lo;0;L;;;;;N;;;;; +A10B;YI SYLLABLE DUOX;Lo;0;L;;;;;N;;;;; +A10C;YI SYLLABLE DUO;Lo;0;L;;;;;N;;;;; +A10D;YI SYLLABLE DOT;Lo;0;L;;;;;N;;;;; +A10E;YI SYLLABLE DOX;Lo;0;L;;;;;N;;;;; +A10F;YI SYLLABLE DO;Lo;0;L;;;;;N;;;;; +A110;YI SYLLABLE DOP;Lo;0;L;;;;;N;;;;; +A111;YI SYLLABLE DEX;Lo;0;L;;;;;N;;;;; +A112;YI SYLLABLE DE;Lo;0;L;;;;;N;;;;; +A113;YI SYLLABLE DEP;Lo;0;L;;;;;N;;;;; +A114;YI SYLLABLE DUT;Lo;0;L;;;;;N;;;;; +A115;YI SYLLABLE DUX;Lo;0;L;;;;;N;;;;; +A116;YI SYLLABLE DU;Lo;0;L;;;;;N;;;;; +A117;YI SYLLABLE DUP;Lo;0;L;;;;;N;;;;; +A118;YI SYLLABLE DURX;Lo;0;L;;;;;N;;;;; +A119;YI SYLLABLE DUR;Lo;0;L;;;;;N;;;;; +A11A;YI SYLLABLE TIT;Lo;0;L;;;;;N;;;;; +A11B;YI SYLLABLE TIX;Lo;0;L;;;;;N;;;;; +A11C;YI SYLLABLE TI;Lo;0;L;;;;;N;;;;; +A11D;YI SYLLABLE TIP;Lo;0;L;;;;;N;;;;; +A11E;YI SYLLABLE TIEX;Lo;0;L;;;;;N;;;;; +A11F;YI SYLLABLE TIE;Lo;0;L;;;;;N;;;;; +A120;YI SYLLABLE TIEP;Lo;0;L;;;;;N;;;;; +A121;YI SYLLABLE TAT;Lo;0;L;;;;;N;;;;; +A122;YI SYLLABLE TAX;Lo;0;L;;;;;N;;;;; +A123;YI SYLLABLE TA;Lo;0;L;;;;;N;;;;; +A124;YI SYLLABLE TAP;Lo;0;L;;;;;N;;;;; +A125;YI SYLLABLE TUOT;Lo;0;L;;;;;N;;;;; +A126;YI SYLLABLE TUOX;Lo;0;L;;;;;N;;;;; +A127;YI SYLLABLE TUO;Lo;0;L;;;;;N;;;;; +A128;YI SYLLABLE TUOP;Lo;0;L;;;;;N;;;;; +A129;YI SYLLABLE TOT;Lo;0;L;;;;;N;;;;; +A12A;YI SYLLABLE TOX;Lo;0;L;;;;;N;;;;; +A12B;YI SYLLABLE TO;Lo;0;L;;;;;N;;;;; +A12C;YI SYLLABLE TOP;Lo;0;L;;;;;N;;;;; +A12D;YI SYLLABLE TEX;Lo;0;L;;;;;N;;;;; +A12E;YI SYLLABLE TE;Lo;0;L;;;;;N;;;;; +A12F;YI SYLLABLE TEP;Lo;0;L;;;;;N;;;;; +A130;YI SYLLABLE TUT;Lo;0;L;;;;;N;;;;; +A131;YI SYLLABLE TUX;Lo;0;L;;;;;N;;;;; +A132;YI SYLLABLE TU;Lo;0;L;;;;;N;;;;; +A133;YI SYLLABLE TUP;Lo;0;L;;;;;N;;;;; +A134;YI SYLLABLE TURX;Lo;0;L;;;;;N;;;;; +A135;YI SYLLABLE TUR;Lo;0;L;;;;;N;;;;; +A136;YI SYLLABLE DDIT;Lo;0;L;;;;;N;;;;; +A137;YI SYLLABLE DDIX;Lo;0;L;;;;;N;;;;; +A138;YI SYLLABLE DDI;Lo;0;L;;;;;N;;;;; +A139;YI SYLLABLE DDIP;Lo;0;L;;;;;N;;;;; +A13A;YI SYLLABLE DDIEX;Lo;0;L;;;;;N;;;;; +A13B;YI SYLLABLE DDIE;Lo;0;L;;;;;N;;;;; +A13C;YI SYLLABLE DDIEP;Lo;0;L;;;;;N;;;;; +A13D;YI SYLLABLE DDAT;Lo;0;L;;;;;N;;;;; +A13E;YI SYLLABLE DDAX;Lo;0;L;;;;;N;;;;; +A13F;YI SYLLABLE DDA;Lo;0;L;;;;;N;;;;; +A140;YI SYLLABLE DDAP;Lo;0;L;;;;;N;;;;; +A141;YI SYLLABLE DDUOX;Lo;0;L;;;;;N;;;;; +A142;YI SYLLABLE DDUO;Lo;0;L;;;;;N;;;;; +A143;YI SYLLABLE DDUOP;Lo;0;L;;;;;N;;;;; +A144;YI SYLLABLE DDOT;Lo;0;L;;;;;N;;;;; +A145;YI SYLLABLE DDOX;Lo;0;L;;;;;N;;;;; +A146;YI SYLLABLE DDO;Lo;0;L;;;;;N;;;;; +A147;YI SYLLABLE DDOP;Lo;0;L;;;;;N;;;;; +A148;YI SYLLABLE DDEX;Lo;0;L;;;;;N;;;;; +A149;YI SYLLABLE DDE;Lo;0;L;;;;;N;;;;; +A14A;YI SYLLABLE DDEP;Lo;0;L;;;;;N;;;;; +A14B;YI SYLLABLE DDUT;Lo;0;L;;;;;N;;;;; +A14C;YI SYLLABLE DDUX;Lo;0;L;;;;;N;;;;; +A14D;YI SYLLABLE DDU;Lo;0;L;;;;;N;;;;; +A14E;YI SYLLABLE DDUP;Lo;0;L;;;;;N;;;;; +A14F;YI SYLLABLE DDURX;Lo;0;L;;;;;N;;;;; +A150;YI SYLLABLE DDUR;Lo;0;L;;;;;N;;;;; +A151;YI SYLLABLE NDIT;Lo;0;L;;;;;N;;;;; +A152;YI SYLLABLE NDIX;Lo;0;L;;;;;N;;;;; +A153;YI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; +A154;YI SYLLABLE NDIP;Lo;0;L;;;;;N;;;;; +A155;YI SYLLABLE NDIEX;Lo;0;L;;;;;N;;;;; +A156;YI SYLLABLE NDIE;Lo;0;L;;;;;N;;;;; +A157;YI SYLLABLE NDAT;Lo;0;L;;;;;N;;;;; +A158;YI SYLLABLE NDAX;Lo;0;L;;;;;N;;;;; +A159;YI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; +A15A;YI SYLLABLE NDAP;Lo;0;L;;;;;N;;;;; +A15B;YI SYLLABLE NDOT;Lo;0;L;;;;;N;;;;; +A15C;YI SYLLABLE NDOX;Lo;0;L;;;;;N;;;;; +A15D;YI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; +A15E;YI SYLLABLE NDOP;Lo;0;L;;;;;N;;;;; +A15F;YI SYLLABLE NDEX;Lo;0;L;;;;;N;;;;; +A160;YI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; +A161;YI SYLLABLE NDEP;Lo;0;L;;;;;N;;;;; +A162;YI SYLLABLE NDUT;Lo;0;L;;;;;N;;;;; +A163;YI SYLLABLE NDUX;Lo;0;L;;;;;N;;;;; +A164;YI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; +A165;YI SYLLABLE NDUP;Lo;0;L;;;;;N;;;;; +A166;YI SYLLABLE NDURX;Lo;0;L;;;;;N;;;;; +A167;YI SYLLABLE NDUR;Lo;0;L;;;;;N;;;;; +A168;YI SYLLABLE HNIT;Lo;0;L;;;;;N;;;;; +A169;YI SYLLABLE HNIX;Lo;0;L;;;;;N;;;;; +A16A;YI SYLLABLE HNI;Lo;0;L;;;;;N;;;;; +A16B;YI SYLLABLE HNIP;Lo;0;L;;;;;N;;;;; +A16C;YI SYLLABLE HNIET;Lo;0;L;;;;;N;;;;; +A16D;YI SYLLABLE HNIEX;Lo;0;L;;;;;N;;;;; +A16E;YI SYLLABLE HNIE;Lo;0;L;;;;;N;;;;; +A16F;YI SYLLABLE HNIEP;Lo;0;L;;;;;N;;;;; +A170;YI SYLLABLE HNAT;Lo;0;L;;;;;N;;;;; +A171;YI SYLLABLE HNAX;Lo;0;L;;;;;N;;;;; +A172;YI SYLLABLE HNA;Lo;0;L;;;;;N;;;;; +A173;YI SYLLABLE HNAP;Lo;0;L;;;;;N;;;;; +A174;YI SYLLABLE HNUOX;Lo;0;L;;;;;N;;;;; +A175;YI SYLLABLE HNUO;Lo;0;L;;;;;N;;;;; +A176;YI SYLLABLE HNOT;Lo;0;L;;;;;N;;;;; +A177;YI SYLLABLE HNOX;Lo;0;L;;;;;N;;;;; +A178;YI SYLLABLE HNOP;Lo;0;L;;;;;N;;;;; +A179;YI SYLLABLE HNEX;Lo;0;L;;;;;N;;;;; +A17A;YI SYLLABLE HNE;Lo;0;L;;;;;N;;;;; +A17B;YI SYLLABLE HNEP;Lo;0;L;;;;;N;;;;; +A17C;YI SYLLABLE HNUT;Lo;0;L;;;;;N;;;;; +A17D;YI SYLLABLE NIT;Lo;0;L;;;;;N;;;;; +A17E;YI SYLLABLE NIX;Lo;0;L;;;;;N;;;;; +A17F;YI SYLLABLE NI;Lo;0;L;;;;;N;;;;; +A180;YI SYLLABLE NIP;Lo;0;L;;;;;N;;;;; +A181;YI SYLLABLE NIEX;Lo;0;L;;;;;N;;;;; +A182;YI SYLLABLE NIE;Lo;0;L;;;;;N;;;;; +A183;YI SYLLABLE NIEP;Lo;0;L;;;;;N;;;;; +A184;YI SYLLABLE NAX;Lo;0;L;;;;;N;;;;; +A185;YI SYLLABLE NA;Lo;0;L;;;;;N;;;;; +A186;YI SYLLABLE NAP;Lo;0;L;;;;;N;;;;; +A187;YI SYLLABLE NUOX;Lo;0;L;;;;;N;;;;; +A188;YI SYLLABLE NUO;Lo;0;L;;;;;N;;;;; +A189;YI SYLLABLE NUOP;Lo;0;L;;;;;N;;;;; +A18A;YI SYLLABLE NOT;Lo;0;L;;;;;N;;;;; +A18B;YI SYLLABLE NOX;Lo;0;L;;;;;N;;;;; +A18C;YI SYLLABLE NO;Lo;0;L;;;;;N;;;;; +A18D;YI SYLLABLE NOP;Lo;0;L;;;;;N;;;;; +A18E;YI SYLLABLE NEX;Lo;0;L;;;;;N;;;;; +A18F;YI SYLLABLE NE;Lo;0;L;;;;;N;;;;; +A190;YI SYLLABLE NEP;Lo;0;L;;;;;N;;;;; +A191;YI SYLLABLE NUT;Lo;0;L;;;;;N;;;;; +A192;YI SYLLABLE NUX;Lo;0;L;;;;;N;;;;; +A193;YI SYLLABLE NU;Lo;0;L;;;;;N;;;;; +A194;YI SYLLABLE NUP;Lo;0;L;;;;;N;;;;; +A195;YI SYLLABLE NURX;Lo;0;L;;;;;N;;;;; +A196;YI SYLLABLE NUR;Lo;0;L;;;;;N;;;;; +A197;YI SYLLABLE HLIT;Lo;0;L;;;;;N;;;;; +A198;YI SYLLABLE HLIX;Lo;0;L;;;;;N;;;;; +A199;YI SYLLABLE HLI;Lo;0;L;;;;;N;;;;; +A19A;YI SYLLABLE HLIP;Lo;0;L;;;;;N;;;;; +A19B;YI SYLLABLE HLIEX;Lo;0;L;;;;;N;;;;; +A19C;YI SYLLABLE HLIE;Lo;0;L;;;;;N;;;;; +A19D;YI SYLLABLE HLIEP;Lo;0;L;;;;;N;;;;; +A19E;YI SYLLABLE HLAT;Lo;0;L;;;;;N;;;;; +A19F;YI SYLLABLE HLAX;Lo;0;L;;;;;N;;;;; +A1A0;YI SYLLABLE HLA;Lo;0;L;;;;;N;;;;; +A1A1;YI SYLLABLE HLAP;Lo;0;L;;;;;N;;;;; +A1A2;YI SYLLABLE HLUOX;Lo;0;L;;;;;N;;;;; +A1A3;YI SYLLABLE HLUO;Lo;0;L;;;;;N;;;;; +A1A4;YI SYLLABLE HLUOP;Lo;0;L;;;;;N;;;;; +A1A5;YI SYLLABLE HLOX;Lo;0;L;;;;;N;;;;; +A1A6;YI SYLLABLE HLO;Lo;0;L;;;;;N;;;;; +A1A7;YI SYLLABLE HLOP;Lo;0;L;;;;;N;;;;; +A1A8;YI SYLLABLE HLEX;Lo;0;L;;;;;N;;;;; +A1A9;YI SYLLABLE HLE;Lo;0;L;;;;;N;;;;; +A1AA;YI SYLLABLE HLEP;Lo;0;L;;;;;N;;;;; +A1AB;YI SYLLABLE HLUT;Lo;0;L;;;;;N;;;;; +A1AC;YI SYLLABLE HLUX;Lo;0;L;;;;;N;;;;; +A1AD;YI SYLLABLE HLU;Lo;0;L;;;;;N;;;;; +A1AE;YI SYLLABLE HLUP;Lo;0;L;;;;;N;;;;; +A1AF;YI SYLLABLE HLURX;Lo;0;L;;;;;N;;;;; +A1B0;YI SYLLABLE HLUR;Lo;0;L;;;;;N;;;;; +A1B1;YI SYLLABLE HLYT;Lo;0;L;;;;;N;;;;; +A1B2;YI SYLLABLE HLYX;Lo;0;L;;;;;N;;;;; +A1B3;YI SYLLABLE HLY;Lo;0;L;;;;;N;;;;; +A1B4;YI SYLLABLE HLYP;Lo;0;L;;;;;N;;;;; +A1B5;YI SYLLABLE HLYRX;Lo;0;L;;;;;N;;;;; +A1B6;YI SYLLABLE HLYR;Lo;0;L;;;;;N;;;;; +A1B7;YI SYLLABLE LIT;Lo;0;L;;;;;N;;;;; +A1B8;YI SYLLABLE LIX;Lo;0;L;;;;;N;;;;; +A1B9;YI SYLLABLE LI;Lo;0;L;;;;;N;;;;; +A1BA;YI SYLLABLE LIP;Lo;0;L;;;;;N;;;;; +A1BB;YI SYLLABLE LIET;Lo;0;L;;;;;N;;;;; +A1BC;YI SYLLABLE LIEX;Lo;0;L;;;;;N;;;;; +A1BD;YI SYLLABLE LIE;Lo;0;L;;;;;N;;;;; +A1BE;YI SYLLABLE LIEP;Lo;0;L;;;;;N;;;;; +A1BF;YI SYLLABLE LAT;Lo;0;L;;;;;N;;;;; +A1C0;YI SYLLABLE LAX;Lo;0;L;;;;;N;;;;; +A1C1;YI SYLLABLE LA;Lo;0;L;;;;;N;;;;; +A1C2;YI SYLLABLE LAP;Lo;0;L;;;;;N;;;;; +A1C3;YI SYLLABLE LUOT;Lo;0;L;;;;;N;;;;; +A1C4;YI SYLLABLE LUOX;Lo;0;L;;;;;N;;;;; +A1C5;YI SYLLABLE LUO;Lo;0;L;;;;;N;;;;; +A1C6;YI SYLLABLE LUOP;Lo;0;L;;;;;N;;;;; +A1C7;YI SYLLABLE LOT;Lo;0;L;;;;;N;;;;; +A1C8;YI SYLLABLE LOX;Lo;0;L;;;;;N;;;;; +A1C9;YI SYLLABLE LO;Lo;0;L;;;;;N;;;;; +A1CA;YI SYLLABLE LOP;Lo;0;L;;;;;N;;;;; +A1CB;YI SYLLABLE LEX;Lo;0;L;;;;;N;;;;; +A1CC;YI SYLLABLE LE;Lo;0;L;;;;;N;;;;; +A1CD;YI SYLLABLE LEP;Lo;0;L;;;;;N;;;;; +A1CE;YI SYLLABLE LUT;Lo;0;L;;;;;N;;;;; +A1CF;YI SYLLABLE LUX;Lo;0;L;;;;;N;;;;; +A1D0;YI SYLLABLE LU;Lo;0;L;;;;;N;;;;; +A1D1;YI SYLLABLE LUP;Lo;0;L;;;;;N;;;;; +A1D2;YI SYLLABLE LURX;Lo;0;L;;;;;N;;;;; +A1D3;YI SYLLABLE LUR;Lo;0;L;;;;;N;;;;; +A1D4;YI SYLLABLE LYT;Lo;0;L;;;;;N;;;;; +A1D5;YI SYLLABLE LYX;Lo;0;L;;;;;N;;;;; +A1D6;YI SYLLABLE LY;Lo;0;L;;;;;N;;;;; +A1D7;YI SYLLABLE LYP;Lo;0;L;;;;;N;;;;; +A1D8;YI SYLLABLE LYRX;Lo;0;L;;;;;N;;;;; +A1D9;YI SYLLABLE LYR;Lo;0;L;;;;;N;;;;; +A1DA;YI SYLLABLE GIT;Lo;0;L;;;;;N;;;;; +A1DB;YI SYLLABLE GIX;Lo;0;L;;;;;N;;;;; +A1DC;YI SYLLABLE GI;Lo;0;L;;;;;N;;;;; +A1DD;YI SYLLABLE GIP;Lo;0;L;;;;;N;;;;; +A1DE;YI SYLLABLE GIET;Lo;0;L;;;;;N;;;;; +A1DF;YI SYLLABLE GIEX;Lo;0;L;;;;;N;;;;; +A1E0;YI SYLLABLE GIE;Lo;0;L;;;;;N;;;;; +A1E1;YI SYLLABLE GIEP;Lo;0;L;;;;;N;;;;; +A1E2;YI SYLLABLE GAT;Lo;0;L;;;;;N;;;;; +A1E3;YI SYLLABLE GAX;Lo;0;L;;;;;N;;;;; +A1E4;YI SYLLABLE GA;Lo;0;L;;;;;N;;;;; +A1E5;YI SYLLABLE GAP;Lo;0;L;;;;;N;;;;; +A1E6;YI SYLLABLE GUOT;Lo;0;L;;;;;N;;;;; +A1E7;YI SYLLABLE GUOX;Lo;0;L;;;;;N;;;;; +A1E8;YI SYLLABLE GUO;Lo;0;L;;;;;N;;;;; +A1E9;YI SYLLABLE GUOP;Lo;0;L;;;;;N;;;;; +A1EA;YI SYLLABLE GOT;Lo;0;L;;;;;N;;;;; +A1EB;YI SYLLABLE GOX;Lo;0;L;;;;;N;;;;; +A1EC;YI SYLLABLE GO;Lo;0;L;;;;;N;;;;; +A1ED;YI SYLLABLE GOP;Lo;0;L;;;;;N;;;;; +A1EE;YI SYLLABLE GET;Lo;0;L;;;;;N;;;;; +A1EF;YI SYLLABLE GEX;Lo;0;L;;;;;N;;;;; +A1F0;YI SYLLABLE GE;Lo;0;L;;;;;N;;;;; +A1F1;YI SYLLABLE GEP;Lo;0;L;;;;;N;;;;; +A1F2;YI SYLLABLE GUT;Lo;0;L;;;;;N;;;;; +A1F3;YI SYLLABLE GUX;Lo;0;L;;;;;N;;;;; +A1F4;YI SYLLABLE GU;Lo;0;L;;;;;N;;;;; +A1F5;YI SYLLABLE GUP;Lo;0;L;;;;;N;;;;; +A1F6;YI SYLLABLE GURX;Lo;0;L;;;;;N;;;;; +A1F7;YI SYLLABLE GUR;Lo;0;L;;;;;N;;;;; +A1F8;YI SYLLABLE KIT;Lo;0;L;;;;;N;;;;; +A1F9;YI SYLLABLE KIX;Lo;0;L;;;;;N;;;;; +A1FA;YI SYLLABLE KI;Lo;0;L;;;;;N;;;;; +A1FB;YI SYLLABLE KIP;Lo;0;L;;;;;N;;;;; +A1FC;YI SYLLABLE KIEX;Lo;0;L;;;;;N;;;;; +A1FD;YI SYLLABLE KIE;Lo;0;L;;;;;N;;;;; +A1FE;YI SYLLABLE KIEP;Lo;0;L;;;;;N;;;;; +A1FF;YI SYLLABLE KAT;Lo;0;L;;;;;N;;;;; +A200;YI SYLLABLE KAX;Lo;0;L;;;;;N;;;;; +A201;YI SYLLABLE KA;Lo;0;L;;;;;N;;;;; +A202;YI SYLLABLE KAP;Lo;0;L;;;;;N;;;;; +A203;YI SYLLABLE KUOX;Lo;0;L;;;;;N;;;;; +A204;YI SYLLABLE KUO;Lo;0;L;;;;;N;;;;; +A205;YI SYLLABLE KUOP;Lo;0;L;;;;;N;;;;; +A206;YI SYLLABLE KOT;Lo;0;L;;;;;N;;;;; +A207;YI SYLLABLE KOX;Lo;0;L;;;;;N;;;;; +A208;YI SYLLABLE KO;Lo;0;L;;;;;N;;;;; +A209;YI SYLLABLE KOP;Lo;0;L;;;;;N;;;;; +A20A;YI SYLLABLE KET;Lo;0;L;;;;;N;;;;; +A20B;YI SYLLABLE KEX;Lo;0;L;;;;;N;;;;; +A20C;YI SYLLABLE KE;Lo;0;L;;;;;N;;;;; +A20D;YI SYLLABLE KEP;Lo;0;L;;;;;N;;;;; +A20E;YI SYLLABLE KUT;Lo;0;L;;;;;N;;;;; +A20F;YI SYLLABLE KUX;Lo;0;L;;;;;N;;;;; +A210;YI SYLLABLE KU;Lo;0;L;;;;;N;;;;; +A211;YI SYLLABLE KUP;Lo;0;L;;;;;N;;;;; +A212;YI SYLLABLE KURX;Lo;0;L;;;;;N;;;;; +A213;YI SYLLABLE KUR;Lo;0;L;;;;;N;;;;; +A214;YI SYLLABLE GGIT;Lo;0;L;;;;;N;;;;; +A215;YI SYLLABLE GGIX;Lo;0;L;;;;;N;;;;; +A216;YI SYLLABLE GGI;Lo;0;L;;;;;N;;;;; +A217;YI SYLLABLE GGIEX;Lo;0;L;;;;;N;;;;; +A218;YI SYLLABLE GGIE;Lo;0;L;;;;;N;;;;; +A219;YI SYLLABLE GGIEP;Lo;0;L;;;;;N;;;;; +A21A;YI SYLLABLE GGAT;Lo;0;L;;;;;N;;;;; +A21B;YI SYLLABLE GGAX;Lo;0;L;;;;;N;;;;; +A21C;YI SYLLABLE GGA;Lo;0;L;;;;;N;;;;; +A21D;YI SYLLABLE GGAP;Lo;0;L;;;;;N;;;;; +A21E;YI SYLLABLE GGUOT;Lo;0;L;;;;;N;;;;; +A21F;YI SYLLABLE GGUOX;Lo;0;L;;;;;N;;;;; +A220;YI SYLLABLE GGUO;Lo;0;L;;;;;N;;;;; +A221;YI SYLLABLE GGUOP;Lo;0;L;;;;;N;;;;; +A222;YI SYLLABLE GGOT;Lo;0;L;;;;;N;;;;; +A223;YI SYLLABLE GGOX;Lo;0;L;;;;;N;;;;; +A224;YI SYLLABLE GGO;Lo;0;L;;;;;N;;;;; +A225;YI SYLLABLE GGOP;Lo;0;L;;;;;N;;;;; +A226;YI SYLLABLE GGET;Lo;0;L;;;;;N;;;;; +A227;YI SYLLABLE GGEX;Lo;0;L;;;;;N;;;;; +A228;YI SYLLABLE GGE;Lo;0;L;;;;;N;;;;; +A229;YI SYLLABLE GGEP;Lo;0;L;;;;;N;;;;; +A22A;YI SYLLABLE GGUT;Lo;0;L;;;;;N;;;;; +A22B;YI SYLLABLE GGUX;Lo;0;L;;;;;N;;;;; +A22C;YI SYLLABLE GGU;Lo;0;L;;;;;N;;;;; +A22D;YI SYLLABLE GGUP;Lo;0;L;;;;;N;;;;; +A22E;YI SYLLABLE GGURX;Lo;0;L;;;;;N;;;;; +A22F;YI SYLLABLE GGUR;Lo;0;L;;;;;N;;;;; +A230;YI SYLLABLE MGIEX;Lo;0;L;;;;;N;;;;; +A231;YI SYLLABLE MGIE;Lo;0;L;;;;;N;;;;; +A232;YI SYLLABLE MGAT;Lo;0;L;;;;;N;;;;; +A233;YI SYLLABLE MGAX;Lo;0;L;;;;;N;;;;; +A234;YI SYLLABLE MGA;Lo;0;L;;;;;N;;;;; +A235;YI SYLLABLE MGAP;Lo;0;L;;;;;N;;;;; +A236;YI SYLLABLE MGUOX;Lo;0;L;;;;;N;;;;; +A237;YI SYLLABLE MGUO;Lo;0;L;;;;;N;;;;; +A238;YI SYLLABLE MGUOP;Lo;0;L;;;;;N;;;;; +A239;YI SYLLABLE MGOT;Lo;0;L;;;;;N;;;;; +A23A;YI SYLLABLE MGOX;Lo;0;L;;;;;N;;;;; +A23B;YI SYLLABLE MGO;Lo;0;L;;;;;N;;;;; +A23C;YI SYLLABLE MGOP;Lo;0;L;;;;;N;;;;; +A23D;YI SYLLABLE MGEX;Lo;0;L;;;;;N;;;;; +A23E;YI SYLLABLE MGE;Lo;0;L;;;;;N;;;;; +A23F;YI SYLLABLE MGEP;Lo;0;L;;;;;N;;;;; +A240;YI SYLLABLE MGUT;Lo;0;L;;;;;N;;;;; +A241;YI SYLLABLE MGUX;Lo;0;L;;;;;N;;;;; +A242;YI SYLLABLE MGU;Lo;0;L;;;;;N;;;;; +A243;YI SYLLABLE MGUP;Lo;0;L;;;;;N;;;;; +A244;YI SYLLABLE MGURX;Lo;0;L;;;;;N;;;;; +A245;YI SYLLABLE MGUR;Lo;0;L;;;;;N;;;;; +A246;YI SYLLABLE HXIT;Lo;0;L;;;;;N;;;;; +A247;YI SYLLABLE HXIX;Lo;0;L;;;;;N;;;;; +A248;YI SYLLABLE HXI;Lo;0;L;;;;;N;;;;; +A249;YI SYLLABLE HXIP;Lo;0;L;;;;;N;;;;; +A24A;YI SYLLABLE HXIET;Lo;0;L;;;;;N;;;;; +A24B;YI SYLLABLE HXIEX;Lo;0;L;;;;;N;;;;; +A24C;YI SYLLABLE HXIE;Lo;0;L;;;;;N;;;;; +A24D;YI SYLLABLE HXIEP;Lo;0;L;;;;;N;;;;; +A24E;YI SYLLABLE HXAT;Lo;0;L;;;;;N;;;;; +A24F;YI SYLLABLE HXAX;Lo;0;L;;;;;N;;;;; +A250;YI SYLLABLE HXA;Lo;0;L;;;;;N;;;;; +A251;YI SYLLABLE HXAP;Lo;0;L;;;;;N;;;;; +A252;YI SYLLABLE HXUOT;Lo;0;L;;;;;N;;;;; +A253;YI SYLLABLE HXUOX;Lo;0;L;;;;;N;;;;; +A254;YI SYLLABLE HXUO;Lo;0;L;;;;;N;;;;; +A255;YI SYLLABLE HXUOP;Lo;0;L;;;;;N;;;;; +A256;YI SYLLABLE HXOT;Lo;0;L;;;;;N;;;;; +A257;YI SYLLABLE HXOX;Lo;0;L;;;;;N;;;;; +A258;YI SYLLABLE HXO;Lo;0;L;;;;;N;;;;; +A259;YI SYLLABLE HXOP;Lo;0;L;;;;;N;;;;; +A25A;YI SYLLABLE HXEX;Lo;0;L;;;;;N;;;;; +A25B;YI SYLLABLE HXE;Lo;0;L;;;;;N;;;;; +A25C;YI SYLLABLE HXEP;Lo;0;L;;;;;N;;;;; +A25D;YI SYLLABLE NGIEX;Lo;0;L;;;;;N;;;;; +A25E;YI SYLLABLE NGIE;Lo;0;L;;;;;N;;;;; +A25F;YI SYLLABLE NGIEP;Lo;0;L;;;;;N;;;;; +A260;YI SYLLABLE NGAT;Lo;0;L;;;;;N;;;;; +A261;YI SYLLABLE NGAX;Lo;0;L;;;;;N;;;;; +A262;YI SYLLABLE NGA;Lo;0;L;;;;;N;;;;; +A263;YI SYLLABLE NGAP;Lo;0;L;;;;;N;;;;; +A264;YI SYLLABLE NGUOT;Lo;0;L;;;;;N;;;;; +A265;YI SYLLABLE NGUOX;Lo;0;L;;;;;N;;;;; +A266;YI SYLLABLE NGUO;Lo;0;L;;;;;N;;;;; +A267;YI SYLLABLE NGOT;Lo;0;L;;;;;N;;;;; +A268;YI SYLLABLE NGOX;Lo;0;L;;;;;N;;;;; +A269;YI SYLLABLE NGO;Lo;0;L;;;;;N;;;;; +A26A;YI SYLLABLE NGOP;Lo;0;L;;;;;N;;;;; +A26B;YI SYLLABLE NGEX;Lo;0;L;;;;;N;;;;; +A26C;YI SYLLABLE NGE;Lo;0;L;;;;;N;;;;; +A26D;YI SYLLABLE NGEP;Lo;0;L;;;;;N;;;;; +A26E;YI SYLLABLE HIT;Lo;0;L;;;;;N;;;;; +A26F;YI SYLLABLE HIEX;Lo;0;L;;;;;N;;;;; +A270;YI SYLLABLE HIE;Lo;0;L;;;;;N;;;;; +A271;YI SYLLABLE HAT;Lo;0;L;;;;;N;;;;; +A272;YI SYLLABLE HAX;Lo;0;L;;;;;N;;;;; +A273;YI SYLLABLE HA;Lo;0;L;;;;;N;;;;; +A274;YI SYLLABLE HAP;Lo;0;L;;;;;N;;;;; +A275;YI SYLLABLE HUOT;Lo;0;L;;;;;N;;;;; +A276;YI SYLLABLE HUOX;Lo;0;L;;;;;N;;;;; +A277;YI SYLLABLE HUO;Lo;0;L;;;;;N;;;;; +A278;YI SYLLABLE HUOP;Lo;0;L;;;;;N;;;;; +A279;YI SYLLABLE HOT;Lo;0;L;;;;;N;;;;; +A27A;YI SYLLABLE HOX;Lo;0;L;;;;;N;;;;; +A27B;YI SYLLABLE HO;Lo;0;L;;;;;N;;;;; +A27C;YI SYLLABLE HOP;Lo;0;L;;;;;N;;;;; +A27D;YI SYLLABLE HEX;Lo;0;L;;;;;N;;;;; +A27E;YI SYLLABLE HE;Lo;0;L;;;;;N;;;;; +A27F;YI SYLLABLE HEP;Lo;0;L;;;;;N;;;;; +A280;YI SYLLABLE WAT;Lo;0;L;;;;;N;;;;; +A281;YI SYLLABLE WAX;Lo;0;L;;;;;N;;;;; +A282;YI SYLLABLE WA;Lo;0;L;;;;;N;;;;; +A283;YI SYLLABLE WAP;Lo;0;L;;;;;N;;;;; +A284;YI SYLLABLE WUOX;Lo;0;L;;;;;N;;;;; +A285;YI SYLLABLE WUO;Lo;0;L;;;;;N;;;;; +A286;YI SYLLABLE WUOP;Lo;0;L;;;;;N;;;;; +A287;YI SYLLABLE WOX;Lo;0;L;;;;;N;;;;; +A288;YI SYLLABLE WO;Lo;0;L;;;;;N;;;;; +A289;YI SYLLABLE WOP;Lo;0;L;;;;;N;;;;; +A28A;YI SYLLABLE WEX;Lo;0;L;;;;;N;;;;; +A28B;YI SYLLABLE WE;Lo;0;L;;;;;N;;;;; +A28C;YI SYLLABLE WEP;Lo;0;L;;;;;N;;;;; +A28D;YI SYLLABLE ZIT;Lo;0;L;;;;;N;;;;; +A28E;YI SYLLABLE ZIX;Lo;0;L;;;;;N;;;;; +A28F;YI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +A290;YI SYLLABLE ZIP;Lo;0;L;;;;;N;;;;; +A291;YI SYLLABLE ZIEX;Lo;0;L;;;;;N;;;;; +A292;YI SYLLABLE ZIE;Lo;0;L;;;;;N;;;;; +A293;YI SYLLABLE ZIEP;Lo;0;L;;;;;N;;;;; +A294;YI SYLLABLE ZAT;Lo;0;L;;;;;N;;;;; +A295;YI SYLLABLE ZAX;Lo;0;L;;;;;N;;;;; +A296;YI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +A297;YI SYLLABLE ZAP;Lo;0;L;;;;;N;;;;; +A298;YI SYLLABLE ZUOX;Lo;0;L;;;;;N;;;;; +A299;YI SYLLABLE ZUO;Lo;0;L;;;;;N;;;;; +A29A;YI SYLLABLE ZUOP;Lo;0;L;;;;;N;;;;; +A29B;YI SYLLABLE ZOT;Lo;0;L;;;;;N;;;;; +A29C;YI SYLLABLE ZOX;Lo;0;L;;;;;N;;;;; +A29D;YI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +A29E;YI SYLLABLE ZOP;Lo;0;L;;;;;N;;;;; +A29F;YI SYLLABLE ZEX;Lo;0;L;;;;;N;;;;; +A2A0;YI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +A2A1;YI SYLLABLE ZEP;Lo;0;L;;;;;N;;;;; +A2A2;YI SYLLABLE ZUT;Lo;0;L;;;;;N;;;;; +A2A3;YI SYLLABLE ZUX;Lo;0;L;;;;;N;;;;; +A2A4;YI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +A2A5;YI SYLLABLE ZUP;Lo;0;L;;;;;N;;;;; +A2A6;YI SYLLABLE ZURX;Lo;0;L;;;;;N;;;;; +A2A7;YI SYLLABLE ZUR;Lo;0;L;;;;;N;;;;; +A2A8;YI SYLLABLE ZYT;Lo;0;L;;;;;N;;;;; +A2A9;YI SYLLABLE ZYX;Lo;0;L;;;;;N;;;;; +A2AA;YI SYLLABLE ZY;Lo;0;L;;;;;N;;;;; +A2AB;YI SYLLABLE ZYP;Lo;0;L;;;;;N;;;;; +A2AC;YI SYLLABLE ZYRX;Lo;0;L;;;;;N;;;;; +A2AD;YI SYLLABLE ZYR;Lo;0;L;;;;;N;;;;; +A2AE;YI SYLLABLE CIT;Lo;0;L;;;;;N;;;;; +A2AF;YI SYLLABLE CIX;Lo;0;L;;;;;N;;;;; +A2B0;YI SYLLABLE CI;Lo;0;L;;;;;N;;;;; +A2B1;YI SYLLABLE CIP;Lo;0;L;;;;;N;;;;; +A2B2;YI SYLLABLE CIET;Lo;0;L;;;;;N;;;;; +A2B3;YI SYLLABLE CIEX;Lo;0;L;;;;;N;;;;; +A2B4;YI SYLLABLE CIE;Lo;0;L;;;;;N;;;;; +A2B5;YI SYLLABLE CIEP;Lo;0;L;;;;;N;;;;; +A2B6;YI SYLLABLE CAT;Lo;0;L;;;;;N;;;;; +A2B7;YI SYLLABLE CAX;Lo;0;L;;;;;N;;;;; +A2B8;YI SYLLABLE CA;Lo;0;L;;;;;N;;;;; +A2B9;YI SYLLABLE CAP;Lo;0;L;;;;;N;;;;; +A2BA;YI SYLLABLE CUOX;Lo;0;L;;;;;N;;;;; +A2BB;YI SYLLABLE CUO;Lo;0;L;;;;;N;;;;; +A2BC;YI SYLLABLE CUOP;Lo;0;L;;;;;N;;;;; +A2BD;YI SYLLABLE COT;Lo;0;L;;;;;N;;;;; +A2BE;YI SYLLABLE COX;Lo;0;L;;;;;N;;;;; +A2BF;YI SYLLABLE CO;Lo;0;L;;;;;N;;;;; +A2C0;YI SYLLABLE COP;Lo;0;L;;;;;N;;;;; +A2C1;YI SYLLABLE CEX;Lo;0;L;;;;;N;;;;; +A2C2;YI SYLLABLE CE;Lo;0;L;;;;;N;;;;; +A2C3;YI SYLLABLE CEP;Lo;0;L;;;;;N;;;;; +A2C4;YI SYLLABLE CUT;Lo;0;L;;;;;N;;;;; +A2C5;YI SYLLABLE CUX;Lo;0;L;;;;;N;;;;; +A2C6;YI SYLLABLE CU;Lo;0;L;;;;;N;;;;; +A2C7;YI SYLLABLE CUP;Lo;0;L;;;;;N;;;;; +A2C8;YI SYLLABLE CURX;Lo;0;L;;;;;N;;;;; +A2C9;YI SYLLABLE CUR;Lo;0;L;;;;;N;;;;; +A2CA;YI SYLLABLE CYT;Lo;0;L;;;;;N;;;;; +A2CB;YI SYLLABLE CYX;Lo;0;L;;;;;N;;;;; +A2CC;YI SYLLABLE CY;Lo;0;L;;;;;N;;;;; +A2CD;YI SYLLABLE CYP;Lo;0;L;;;;;N;;;;; +A2CE;YI SYLLABLE CYRX;Lo;0;L;;;;;N;;;;; +A2CF;YI SYLLABLE CYR;Lo;0;L;;;;;N;;;;; +A2D0;YI SYLLABLE ZZIT;Lo;0;L;;;;;N;;;;; +A2D1;YI SYLLABLE ZZIX;Lo;0;L;;;;;N;;;;; +A2D2;YI SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; +A2D3;YI SYLLABLE ZZIP;Lo;0;L;;;;;N;;;;; +A2D4;YI SYLLABLE ZZIET;Lo;0;L;;;;;N;;;;; +A2D5;YI SYLLABLE ZZIEX;Lo;0;L;;;;;N;;;;; +A2D6;YI SYLLABLE ZZIE;Lo;0;L;;;;;N;;;;; +A2D7;YI SYLLABLE ZZIEP;Lo;0;L;;;;;N;;;;; +A2D8;YI SYLLABLE ZZAT;Lo;0;L;;;;;N;;;;; +A2D9;YI SYLLABLE ZZAX;Lo;0;L;;;;;N;;;;; +A2DA;YI SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; +A2DB;YI SYLLABLE ZZAP;Lo;0;L;;;;;N;;;;; +A2DC;YI SYLLABLE ZZOX;Lo;0;L;;;;;N;;;;; +A2DD;YI SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; +A2DE;YI SYLLABLE ZZOP;Lo;0;L;;;;;N;;;;; +A2DF;YI SYLLABLE ZZEX;Lo;0;L;;;;;N;;;;; +A2E0;YI SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; +A2E1;YI SYLLABLE ZZEP;Lo;0;L;;;;;N;;;;; +A2E2;YI SYLLABLE ZZUX;Lo;0;L;;;;;N;;;;; +A2E3;YI SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; +A2E4;YI SYLLABLE ZZUP;Lo;0;L;;;;;N;;;;; +A2E5;YI SYLLABLE ZZURX;Lo;0;L;;;;;N;;;;; +A2E6;YI SYLLABLE ZZUR;Lo;0;L;;;;;N;;;;; +A2E7;YI SYLLABLE ZZYT;Lo;0;L;;;;;N;;;;; +A2E8;YI SYLLABLE ZZYX;Lo;0;L;;;;;N;;;;; +A2E9;YI SYLLABLE ZZY;Lo;0;L;;;;;N;;;;; +A2EA;YI SYLLABLE ZZYP;Lo;0;L;;;;;N;;;;; +A2EB;YI SYLLABLE ZZYRX;Lo;0;L;;;;;N;;;;; +A2EC;YI SYLLABLE ZZYR;Lo;0;L;;;;;N;;;;; +A2ED;YI SYLLABLE NZIT;Lo;0;L;;;;;N;;;;; +A2EE;YI SYLLABLE NZIX;Lo;0;L;;;;;N;;;;; +A2EF;YI SYLLABLE NZI;Lo;0;L;;;;;N;;;;; +A2F0;YI SYLLABLE NZIP;Lo;0;L;;;;;N;;;;; +A2F1;YI SYLLABLE NZIEX;Lo;0;L;;;;;N;;;;; +A2F2;YI SYLLABLE NZIE;Lo;0;L;;;;;N;;;;; +A2F3;YI SYLLABLE NZIEP;Lo;0;L;;;;;N;;;;; +A2F4;YI SYLLABLE NZAT;Lo;0;L;;;;;N;;;;; +A2F5;YI SYLLABLE NZAX;Lo;0;L;;;;;N;;;;; +A2F6;YI SYLLABLE NZA;Lo;0;L;;;;;N;;;;; +A2F7;YI SYLLABLE NZAP;Lo;0;L;;;;;N;;;;; +A2F8;YI SYLLABLE NZUOX;Lo;0;L;;;;;N;;;;; +A2F9;YI SYLLABLE NZUO;Lo;0;L;;;;;N;;;;; +A2FA;YI SYLLABLE NZOX;Lo;0;L;;;;;N;;;;; +A2FB;YI SYLLABLE NZOP;Lo;0;L;;;;;N;;;;; +A2FC;YI SYLLABLE NZEX;Lo;0;L;;;;;N;;;;; +A2FD;YI SYLLABLE NZE;Lo;0;L;;;;;N;;;;; +A2FE;YI SYLLABLE NZUX;Lo;0;L;;;;;N;;;;; +A2FF;YI SYLLABLE NZU;Lo;0;L;;;;;N;;;;; +A300;YI SYLLABLE NZUP;Lo;0;L;;;;;N;;;;; +A301;YI SYLLABLE NZURX;Lo;0;L;;;;;N;;;;; +A302;YI SYLLABLE NZUR;Lo;0;L;;;;;N;;;;; +A303;YI SYLLABLE NZYT;Lo;0;L;;;;;N;;;;; +A304;YI SYLLABLE NZYX;Lo;0;L;;;;;N;;;;; +A305;YI SYLLABLE NZY;Lo;0;L;;;;;N;;;;; +A306;YI SYLLABLE NZYP;Lo;0;L;;;;;N;;;;; +A307;YI SYLLABLE NZYRX;Lo;0;L;;;;;N;;;;; +A308;YI SYLLABLE NZYR;Lo;0;L;;;;;N;;;;; +A309;YI SYLLABLE SIT;Lo;0;L;;;;;N;;;;; +A30A;YI SYLLABLE SIX;Lo;0;L;;;;;N;;;;; +A30B;YI SYLLABLE SI;Lo;0;L;;;;;N;;;;; +A30C;YI SYLLABLE SIP;Lo;0;L;;;;;N;;;;; +A30D;YI SYLLABLE SIEX;Lo;0;L;;;;;N;;;;; +A30E;YI SYLLABLE SIE;Lo;0;L;;;;;N;;;;; +A30F;YI SYLLABLE SIEP;Lo;0;L;;;;;N;;;;; +A310;YI SYLLABLE SAT;Lo;0;L;;;;;N;;;;; +A311;YI SYLLABLE SAX;Lo;0;L;;;;;N;;;;; +A312;YI SYLLABLE SA;Lo;0;L;;;;;N;;;;; +A313;YI SYLLABLE SAP;Lo;0;L;;;;;N;;;;; +A314;YI SYLLABLE SUOX;Lo;0;L;;;;;N;;;;; +A315;YI SYLLABLE SUO;Lo;0;L;;;;;N;;;;; +A316;YI SYLLABLE SUOP;Lo;0;L;;;;;N;;;;; +A317;YI SYLLABLE SOT;Lo;0;L;;;;;N;;;;; +A318;YI SYLLABLE SOX;Lo;0;L;;;;;N;;;;; +A319;YI SYLLABLE SO;Lo;0;L;;;;;N;;;;; +A31A;YI SYLLABLE SOP;Lo;0;L;;;;;N;;;;; +A31B;YI SYLLABLE SEX;Lo;0;L;;;;;N;;;;; +A31C;YI SYLLABLE SE;Lo;0;L;;;;;N;;;;; +A31D;YI SYLLABLE SEP;Lo;0;L;;;;;N;;;;; +A31E;YI SYLLABLE SUT;Lo;0;L;;;;;N;;;;; +A31F;YI SYLLABLE SUX;Lo;0;L;;;;;N;;;;; +A320;YI SYLLABLE SU;Lo;0;L;;;;;N;;;;; +A321;YI SYLLABLE SUP;Lo;0;L;;;;;N;;;;; +A322;YI SYLLABLE SURX;Lo;0;L;;;;;N;;;;; +A323;YI SYLLABLE SUR;Lo;0;L;;;;;N;;;;; +A324;YI SYLLABLE SYT;Lo;0;L;;;;;N;;;;; +A325;YI SYLLABLE SYX;Lo;0;L;;;;;N;;;;; +A326;YI SYLLABLE SY;Lo;0;L;;;;;N;;;;; +A327;YI SYLLABLE SYP;Lo;0;L;;;;;N;;;;; +A328;YI SYLLABLE SYRX;Lo;0;L;;;;;N;;;;; +A329;YI SYLLABLE SYR;Lo;0;L;;;;;N;;;;; +A32A;YI SYLLABLE SSIT;Lo;0;L;;;;;N;;;;; +A32B;YI SYLLABLE SSIX;Lo;0;L;;;;;N;;;;; +A32C;YI SYLLABLE SSI;Lo;0;L;;;;;N;;;;; +A32D;YI SYLLABLE SSIP;Lo;0;L;;;;;N;;;;; +A32E;YI SYLLABLE SSIEX;Lo;0;L;;;;;N;;;;; +A32F;YI SYLLABLE SSIE;Lo;0;L;;;;;N;;;;; +A330;YI SYLLABLE SSIEP;Lo;0;L;;;;;N;;;;; +A331;YI SYLLABLE SSAT;Lo;0;L;;;;;N;;;;; +A332;YI SYLLABLE SSAX;Lo;0;L;;;;;N;;;;; +A333;YI SYLLABLE SSA;Lo;0;L;;;;;N;;;;; +A334;YI SYLLABLE SSAP;Lo;0;L;;;;;N;;;;; +A335;YI SYLLABLE SSOT;Lo;0;L;;;;;N;;;;; +A336;YI SYLLABLE SSOX;Lo;0;L;;;;;N;;;;; +A337;YI SYLLABLE SSO;Lo;0;L;;;;;N;;;;; +A338;YI SYLLABLE SSOP;Lo;0;L;;;;;N;;;;; +A339;YI SYLLABLE SSEX;Lo;0;L;;;;;N;;;;; +A33A;YI SYLLABLE SSE;Lo;0;L;;;;;N;;;;; +A33B;YI SYLLABLE SSEP;Lo;0;L;;;;;N;;;;; +A33C;YI SYLLABLE SSUT;Lo;0;L;;;;;N;;;;; +A33D;YI SYLLABLE SSUX;Lo;0;L;;;;;N;;;;; +A33E;YI SYLLABLE SSU;Lo;0;L;;;;;N;;;;; +A33F;YI SYLLABLE SSUP;Lo;0;L;;;;;N;;;;; +A340;YI SYLLABLE SSYT;Lo;0;L;;;;;N;;;;; +A341;YI SYLLABLE SSYX;Lo;0;L;;;;;N;;;;; +A342;YI SYLLABLE SSY;Lo;0;L;;;;;N;;;;; +A343;YI SYLLABLE SSYP;Lo;0;L;;;;;N;;;;; +A344;YI SYLLABLE SSYRX;Lo;0;L;;;;;N;;;;; +A345;YI SYLLABLE SSYR;Lo;0;L;;;;;N;;;;; +A346;YI SYLLABLE ZHAT;Lo;0;L;;;;;N;;;;; +A347;YI SYLLABLE ZHAX;Lo;0;L;;;;;N;;;;; +A348;YI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +A349;YI SYLLABLE ZHAP;Lo;0;L;;;;;N;;;;; +A34A;YI SYLLABLE ZHUOX;Lo;0;L;;;;;N;;;;; +A34B;YI SYLLABLE ZHUO;Lo;0;L;;;;;N;;;;; +A34C;YI SYLLABLE ZHUOP;Lo;0;L;;;;;N;;;;; +A34D;YI SYLLABLE ZHOT;Lo;0;L;;;;;N;;;;; +A34E;YI SYLLABLE ZHOX;Lo;0;L;;;;;N;;;;; +A34F;YI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +A350;YI SYLLABLE ZHOP;Lo;0;L;;;;;N;;;;; +A351;YI SYLLABLE ZHET;Lo;0;L;;;;;N;;;;; +A352;YI SYLLABLE ZHEX;Lo;0;L;;;;;N;;;;; +A353;YI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +A354;YI SYLLABLE ZHEP;Lo;0;L;;;;;N;;;;; +A355;YI SYLLABLE ZHUT;Lo;0;L;;;;;N;;;;; +A356;YI SYLLABLE ZHUX;Lo;0;L;;;;;N;;;;; +A357;YI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +A358;YI SYLLABLE ZHUP;Lo;0;L;;;;;N;;;;; +A359;YI SYLLABLE ZHURX;Lo;0;L;;;;;N;;;;; +A35A;YI SYLLABLE ZHUR;Lo;0;L;;;;;N;;;;; +A35B;YI SYLLABLE ZHYT;Lo;0;L;;;;;N;;;;; +A35C;YI SYLLABLE ZHYX;Lo;0;L;;;;;N;;;;; +A35D;YI SYLLABLE ZHY;Lo;0;L;;;;;N;;;;; +A35E;YI SYLLABLE ZHYP;Lo;0;L;;;;;N;;;;; +A35F;YI SYLLABLE ZHYRX;Lo;0;L;;;;;N;;;;; +A360;YI SYLLABLE ZHYR;Lo;0;L;;;;;N;;;;; +A361;YI SYLLABLE CHAT;Lo;0;L;;;;;N;;;;; +A362;YI SYLLABLE CHAX;Lo;0;L;;;;;N;;;;; +A363;YI SYLLABLE CHA;Lo;0;L;;;;;N;;;;; +A364;YI SYLLABLE CHAP;Lo;0;L;;;;;N;;;;; +A365;YI SYLLABLE CHUOT;Lo;0;L;;;;;N;;;;; +A366;YI SYLLABLE CHUOX;Lo;0;L;;;;;N;;;;; +A367;YI SYLLABLE CHUO;Lo;0;L;;;;;N;;;;; +A368;YI SYLLABLE CHUOP;Lo;0;L;;;;;N;;;;; +A369;YI SYLLABLE CHOT;Lo;0;L;;;;;N;;;;; +A36A;YI SYLLABLE CHOX;Lo;0;L;;;;;N;;;;; +A36B;YI SYLLABLE CHO;Lo;0;L;;;;;N;;;;; +A36C;YI SYLLABLE CHOP;Lo;0;L;;;;;N;;;;; +A36D;YI SYLLABLE CHET;Lo;0;L;;;;;N;;;;; +A36E;YI SYLLABLE CHEX;Lo;0;L;;;;;N;;;;; +A36F;YI SYLLABLE CHE;Lo;0;L;;;;;N;;;;; +A370;YI SYLLABLE CHEP;Lo;0;L;;;;;N;;;;; +A371;YI SYLLABLE CHUX;Lo;0;L;;;;;N;;;;; +A372;YI SYLLABLE CHU;Lo;0;L;;;;;N;;;;; +A373;YI SYLLABLE CHUP;Lo;0;L;;;;;N;;;;; +A374;YI SYLLABLE CHURX;Lo;0;L;;;;;N;;;;; +A375;YI SYLLABLE CHUR;Lo;0;L;;;;;N;;;;; +A376;YI SYLLABLE CHYT;Lo;0;L;;;;;N;;;;; +A377;YI SYLLABLE CHYX;Lo;0;L;;;;;N;;;;; +A378;YI SYLLABLE CHY;Lo;0;L;;;;;N;;;;; +A379;YI SYLLABLE CHYP;Lo;0;L;;;;;N;;;;; +A37A;YI SYLLABLE CHYRX;Lo;0;L;;;;;N;;;;; +A37B;YI SYLLABLE CHYR;Lo;0;L;;;;;N;;;;; +A37C;YI SYLLABLE RRAX;Lo;0;L;;;;;N;;;;; +A37D;YI SYLLABLE RRA;Lo;0;L;;;;;N;;;;; +A37E;YI SYLLABLE RRUOX;Lo;0;L;;;;;N;;;;; +A37F;YI SYLLABLE RRUO;Lo;0;L;;;;;N;;;;; +A380;YI SYLLABLE RROT;Lo;0;L;;;;;N;;;;; +A381;YI SYLLABLE RROX;Lo;0;L;;;;;N;;;;; +A382;YI SYLLABLE RRO;Lo;0;L;;;;;N;;;;; +A383;YI SYLLABLE RROP;Lo;0;L;;;;;N;;;;; +A384;YI SYLLABLE RRET;Lo;0;L;;;;;N;;;;; +A385;YI SYLLABLE RREX;Lo;0;L;;;;;N;;;;; +A386;YI SYLLABLE RRE;Lo;0;L;;;;;N;;;;; +A387;YI SYLLABLE RREP;Lo;0;L;;;;;N;;;;; +A388;YI SYLLABLE RRUT;Lo;0;L;;;;;N;;;;; +A389;YI SYLLABLE RRUX;Lo;0;L;;;;;N;;;;; +A38A;YI SYLLABLE RRU;Lo;0;L;;;;;N;;;;; +A38B;YI SYLLABLE RRUP;Lo;0;L;;;;;N;;;;; +A38C;YI SYLLABLE RRURX;Lo;0;L;;;;;N;;;;; +A38D;YI SYLLABLE RRUR;Lo;0;L;;;;;N;;;;; +A38E;YI SYLLABLE RRYT;Lo;0;L;;;;;N;;;;; +A38F;YI SYLLABLE RRYX;Lo;0;L;;;;;N;;;;; +A390;YI SYLLABLE RRY;Lo;0;L;;;;;N;;;;; +A391;YI SYLLABLE RRYP;Lo;0;L;;;;;N;;;;; +A392;YI SYLLABLE RRYRX;Lo;0;L;;;;;N;;;;; +A393;YI SYLLABLE RRYR;Lo;0;L;;;;;N;;;;; +A394;YI SYLLABLE NRAT;Lo;0;L;;;;;N;;;;; +A395;YI SYLLABLE NRAX;Lo;0;L;;;;;N;;;;; +A396;YI SYLLABLE NRA;Lo;0;L;;;;;N;;;;; +A397;YI SYLLABLE NRAP;Lo;0;L;;;;;N;;;;; +A398;YI SYLLABLE NROX;Lo;0;L;;;;;N;;;;; +A399;YI SYLLABLE NRO;Lo;0;L;;;;;N;;;;; +A39A;YI SYLLABLE NROP;Lo;0;L;;;;;N;;;;; +A39B;YI SYLLABLE NRET;Lo;0;L;;;;;N;;;;; +A39C;YI SYLLABLE NREX;Lo;0;L;;;;;N;;;;; +A39D;YI SYLLABLE NRE;Lo;0;L;;;;;N;;;;; +A39E;YI SYLLABLE NREP;Lo;0;L;;;;;N;;;;; +A39F;YI SYLLABLE NRUT;Lo;0;L;;;;;N;;;;; +A3A0;YI SYLLABLE NRUX;Lo;0;L;;;;;N;;;;; +A3A1;YI SYLLABLE NRU;Lo;0;L;;;;;N;;;;; +A3A2;YI SYLLABLE NRUP;Lo;0;L;;;;;N;;;;; +A3A3;YI SYLLABLE NRURX;Lo;0;L;;;;;N;;;;; +A3A4;YI SYLLABLE NRUR;Lo;0;L;;;;;N;;;;; +A3A5;YI SYLLABLE NRYT;Lo;0;L;;;;;N;;;;; +A3A6;YI SYLLABLE NRYX;Lo;0;L;;;;;N;;;;; +A3A7;YI SYLLABLE NRY;Lo;0;L;;;;;N;;;;; +A3A8;YI SYLLABLE NRYP;Lo;0;L;;;;;N;;;;; +A3A9;YI SYLLABLE NRYRX;Lo;0;L;;;;;N;;;;; +A3AA;YI SYLLABLE NRYR;Lo;0;L;;;;;N;;;;; +A3AB;YI SYLLABLE SHAT;Lo;0;L;;;;;N;;;;; +A3AC;YI SYLLABLE SHAX;Lo;0;L;;;;;N;;;;; +A3AD;YI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +A3AE;YI SYLLABLE SHAP;Lo;0;L;;;;;N;;;;; +A3AF;YI SYLLABLE SHUOX;Lo;0;L;;;;;N;;;;; +A3B0;YI SYLLABLE SHUO;Lo;0;L;;;;;N;;;;; +A3B1;YI SYLLABLE SHUOP;Lo;0;L;;;;;N;;;;; +A3B2;YI SYLLABLE SHOT;Lo;0;L;;;;;N;;;;; +A3B3;YI SYLLABLE SHOX;Lo;0;L;;;;;N;;;;; +A3B4;YI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +A3B5;YI SYLLABLE SHOP;Lo;0;L;;;;;N;;;;; +A3B6;YI SYLLABLE SHET;Lo;0;L;;;;;N;;;;; +A3B7;YI SYLLABLE SHEX;Lo;0;L;;;;;N;;;;; +A3B8;YI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +A3B9;YI SYLLABLE SHEP;Lo;0;L;;;;;N;;;;; +A3BA;YI SYLLABLE SHUT;Lo;0;L;;;;;N;;;;; +A3BB;YI SYLLABLE SHUX;Lo;0;L;;;;;N;;;;; +A3BC;YI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +A3BD;YI SYLLABLE SHUP;Lo;0;L;;;;;N;;;;; +A3BE;YI SYLLABLE SHURX;Lo;0;L;;;;;N;;;;; +A3BF;YI SYLLABLE SHUR;Lo;0;L;;;;;N;;;;; +A3C0;YI SYLLABLE SHYT;Lo;0;L;;;;;N;;;;; +A3C1;YI SYLLABLE SHYX;Lo;0;L;;;;;N;;;;; +A3C2;YI SYLLABLE SHY;Lo;0;L;;;;;N;;;;; +A3C3;YI SYLLABLE SHYP;Lo;0;L;;;;;N;;;;; +A3C4;YI SYLLABLE SHYRX;Lo;0;L;;;;;N;;;;; +A3C5;YI SYLLABLE SHYR;Lo;0;L;;;;;N;;;;; +A3C6;YI SYLLABLE RAT;Lo;0;L;;;;;N;;;;; +A3C7;YI SYLLABLE RAX;Lo;0;L;;;;;N;;;;; +A3C8;YI SYLLABLE RA;Lo;0;L;;;;;N;;;;; +A3C9;YI SYLLABLE RAP;Lo;0;L;;;;;N;;;;; +A3CA;YI SYLLABLE RUOX;Lo;0;L;;;;;N;;;;; +A3CB;YI SYLLABLE RUO;Lo;0;L;;;;;N;;;;; +A3CC;YI SYLLABLE RUOP;Lo;0;L;;;;;N;;;;; +A3CD;YI SYLLABLE ROT;Lo;0;L;;;;;N;;;;; +A3CE;YI SYLLABLE ROX;Lo;0;L;;;;;N;;;;; +A3CF;YI SYLLABLE RO;Lo;0;L;;;;;N;;;;; +A3D0;YI SYLLABLE ROP;Lo;0;L;;;;;N;;;;; +A3D1;YI SYLLABLE REX;Lo;0;L;;;;;N;;;;; +A3D2;YI SYLLABLE RE;Lo;0;L;;;;;N;;;;; +A3D3;YI SYLLABLE REP;Lo;0;L;;;;;N;;;;; +A3D4;YI SYLLABLE RUT;Lo;0;L;;;;;N;;;;; +A3D5;YI SYLLABLE RUX;Lo;0;L;;;;;N;;;;; +A3D6;YI SYLLABLE RU;Lo;0;L;;;;;N;;;;; +A3D7;YI SYLLABLE RUP;Lo;0;L;;;;;N;;;;; +A3D8;YI SYLLABLE RURX;Lo;0;L;;;;;N;;;;; +A3D9;YI SYLLABLE RUR;Lo;0;L;;;;;N;;;;; +A3DA;YI SYLLABLE RYT;Lo;0;L;;;;;N;;;;; +A3DB;YI SYLLABLE RYX;Lo;0;L;;;;;N;;;;; +A3DC;YI SYLLABLE RY;Lo;0;L;;;;;N;;;;; +A3DD;YI SYLLABLE RYP;Lo;0;L;;;;;N;;;;; +A3DE;YI SYLLABLE RYRX;Lo;0;L;;;;;N;;;;; +A3DF;YI SYLLABLE RYR;Lo;0;L;;;;;N;;;;; +A3E0;YI SYLLABLE JIT;Lo;0;L;;;;;N;;;;; +A3E1;YI SYLLABLE JIX;Lo;0;L;;;;;N;;;;; +A3E2;YI SYLLABLE JI;Lo;0;L;;;;;N;;;;; +A3E3;YI SYLLABLE JIP;Lo;0;L;;;;;N;;;;; +A3E4;YI SYLLABLE JIET;Lo;0;L;;;;;N;;;;; +A3E5;YI SYLLABLE JIEX;Lo;0;L;;;;;N;;;;; +A3E6;YI SYLLABLE JIE;Lo;0;L;;;;;N;;;;; +A3E7;YI SYLLABLE JIEP;Lo;0;L;;;;;N;;;;; +A3E8;YI SYLLABLE JUOT;Lo;0;L;;;;;N;;;;; +A3E9;YI SYLLABLE JUOX;Lo;0;L;;;;;N;;;;; +A3EA;YI SYLLABLE JUO;Lo;0;L;;;;;N;;;;; +A3EB;YI SYLLABLE JUOP;Lo;0;L;;;;;N;;;;; +A3EC;YI SYLLABLE JOT;Lo;0;L;;;;;N;;;;; +A3ED;YI SYLLABLE JOX;Lo;0;L;;;;;N;;;;; +A3EE;YI SYLLABLE JO;Lo;0;L;;;;;N;;;;; +A3EF;YI SYLLABLE JOP;Lo;0;L;;;;;N;;;;; +A3F0;YI SYLLABLE JUT;Lo;0;L;;;;;N;;;;; +A3F1;YI SYLLABLE JUX;Lo;0;L;;;;;N;;;;; +A3F2;YI SYLLABLE JU;Lo;0;L;;;;;N;;;;; +A3F3;YI SYLLABLE JUP;Lo;0;L;;;;;N;;;;; +A3F4;YI SYLLABLE JURX;Lo;0;L;;;;;N;;;;; +A3F5;YI SYLLABLE JUR;Lo;0;L;;;;;N;;;;; +A3F6;YI SYLLABLE JYT;Lo;0;L;;;;;N;;;;; +A3F7;YI SYLLABLE JYX;Lo;0;L;;;;;N;;;;; +A3F8;YI SYLLABLE JY;Lo;0;L;;;;;N;;;;; +A3F9;YI SYLLABLE JYP;Lo;0;L;;;;;N;;;;; +A3FA;YI SYLLABLE JYRX;Lo;0;L;;;;;N;;;;; +A3FB;YI SYLLABLE JYR;Lo;0;L;;;;;N;;;;; +A3FC;YI SYLLABLE QIT;Lo;0;L;;;;;N;;;;; +A3FD;YI SYLLABLE QIX;Lo;0;L;;;;;N;;;;; +A3FE;YI SYLLABLE QI;Lo;0;L;;;;;N;;;;; +A3FF;YI SYLLABLE QIP;Lo;0;L;;;;;N;;;;; +A400;YI SYLLABLE QIET;Lo;0;L;;;;;N;;;;; +A401;YI SYLLABLE QIEX;Lo;0;L;;;;;N;;;;; +A402;YI SYLLABLE QIE;Lo;0;L;;;;;N;;;;; +A403;YI SYLLABLE QIEP;Lo;0;L;;;;;N;;;;; +A404;YI SYLLABLE QUOT;Lo;0;L;;;;;N;;;;; +A405;YI SYLLABLE QUOX;Lo;0;L;;;;;N;;;;; +A406;YI SYLLABLE QUO;Lo;0;L;;;;;N;;;;; +A407;YI SYLLABLE QUOP;Lo;0;L;;;;;N;;;;; +A408;YI SYLLABLE QOT;Lo;0;L;;;;;N;;;;; +A409;YI SYLLABLE QOX;Lo;0;L;;;;;N;;;;; +A40A;YI SYLLABLE QO;Lo;0;L;;;;;N;;;;; +A40B;YI SYLLABLE QOP;Lo;0;L;;;;;N;;;;; +A40C;YI SYLLABLE QUT;Lo;0;L;;;;;N;;;;; +A40D;YI SYLLABLE QUX;Lo;0;L;;;;;N;;;;; +A40E;YI SYLLABLE QU;Lo;0;L;;;;;N;;;;; +A40F;YI SYLLABLE QUP;Lo;0;L;;;;;N;;;;; +A410;YI SYLLABLE QURX;Lo;0;L;;;;;N;;;;; +A411;YI SYLLABLE QUR;Lo;0;L;;;;;N;;;;; +A412;YI SYLLABLE QYT;Lo;0;L;;;;;N;;;;; +A413;YI SYLLABLE QYX;Lo;0;L;;;;;N;;;;; +A414;YI SYLLABLE QY;Lo;0;L;;;;;N;;;;; +A415;YI SYLLABLE QYP;Lo;0;L;;;;;N;;;;; +A416;YI SYLLABLE QYRX;Lo;0;L;;;;;N;;;;; +A417;YI SYLLABLE QYR;Lo;0;L;;;;;N;;;;; +A418;YI SYLLABLE JJIT;Lo;0;L;;;;;N;;;;; +A419;YI SYLLABLE JJIX;Lo;0;L;;;;;N;;;;; +A41A;YI SYLLABLE JJI;Lo;0;L;;;;;N;;;;; +A41B;YI SYLLABLE JJIP;Lo;0;L;;;;;N;;;;; +A41C;YI SYLLABLE JJIET;Lo;0;L;;;;;N;;;;; +A41D;YI SYLLABLE JJIEX;Lo;0;L;;;;;N;;;;; +A41E;YI SYLLABLE JJIE;Lo;0;L;;;;;N;;;;; +A41F;YI SYLLABLE JJIEP;Lo;0;L;;;;;N;;;;; +A420;YI SYLLABLE JJUOX;Lo;0;L;;;;;N;;;;; +A421;YI SYLLABLE JJUO;Lo;0;L;;;;;N;;;;; +A422;YI SYLLABLE JJUOP;Lo;0;L;;;;;N;;;;; +A423;YI SYLLABLE JJOT;Lo;0;L;;;;;N;;;;; +A424;YI SYLLABLE JJOX;Lo;0;L;;;;;N;;;;; +A425;YI SYLLABLE JJO;Lo;0;L;;;;;N;;;;; +A426;YI SYLLABLE JJOP;Lo;0;L;;;;;N;;;;; +A427;YI SYLLABLE JJUT;Lo;0;L;;;;;N;;;;; +A428;YI SYLLABLE JJUX;Lo;0;L;;;;;N;;;;; +A429;YI SYLLABLE JJU;Lo;0;L;;;;;N;;;;; +A42A;YI SYLLABLE JJUP;Lo;0;L;;;;;N;;;;; +A42B;YI SYLLABLE JJURX;Lo;0;L;;;;;N;;;;; +A42C;YI SYLLABLE JJUR;Lo;0;L;;;;;N;;;;; +A42D;YI SYLLABLE JJYT;Lo;0;L;;;;;N;;;;; +A42E;YI SYLLABLE JJYX;Lo;0;L;;;;;N;;;;; +A42F;YI SYLLABLE JJY;Lo;0;L;;;;;N;;;;; +A430;YI SYLLABLE JJYP;Lo;0;L;;;;;N;;;;; +A431;YI SYLLABLE NJIT;Lo;0;L;;;;;N;;;;; +A432;YI SYLLABLE NJIX;Lo;0;L;;;;;N;;;;; +A433;YI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; +A434;YI SYLLABLE NJIP;Lo;0;L;;;;;N;;;;; +A435;YI SYLLABLE NJIET;Lo;0;L;;;;;N;;;;; +A436;YI SYLLABLE NJIEX;Lo;0;L;;;;;N;;;;; +A437;YI SYLLABLE NJIE;Lo;0;L;;;;;N;;;;; +A438;YI SYLLABLE NJIEP;Lo;0;L;;;;;N;;;;; +A439;YI SYLLABLE NJUOX;Lo;0;L;;;;;N;;;;; +A43A;YI SYLLABLE NJUO;Lo;0;L;;;;;N;;;;; +A43B;YI SYLLABLE NJOT;Lo;0;L;;;;;N;;;;; +A43C;YI SYLLABLE NJOX;Lo;0;L;;;;;N;;;;; +A43D;YI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; +A43E;YI SYLLABLE NJOP;Lo;0;L;;;;;N;;;;; +A43F;YI SYLLABLE NJUX;Lo;0;L;;;;;N;;;;; +A440;YI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; +A441;YI SYLLABLE NJUP;Lo;0;L;;;;;N;;;;; +A442;YI SYLLABLE NJURX;Lo;0;L;;;;;N;;;;; +A443;YI SYLLABLE NJUR;Lo;0;L;;;;;N;;;;; +A444;YI SYLLABLE NJYT;Lo;0;L;;;;;N;;;;; +A445;YI SYLLABLE NJYX;Lo;0;L;;;;;N;;;;; +A446;YI SYLLABLE NJY;Lo;0;L;;;;;N;;;;; +A447;YI SYLLABLE NJYP;Lo;0;L;;;;;N;;;;; +A448;YI SYLLABLE NJYRX;Lo;0;L;;;;;N;;;;; +A449;YI SYLLABLE NJYR;Lo;0;L;;;;;N;;;;; +A44A;YI SYLLABLE NYIT;Lo;0;L;;;;;N;;;;; +A44B;YI SYLLABLE NYIX;Lo;0;L;;;;;N;;;;; +A44C;YI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +A44D;YI SYLLABLE NYIP;Lo;0;L;;;;;N;;;;; +A44E;YI SYLLABLE NYIET;Lo;0;L;;;;;N;;;;; +A44F;YI SYLLABLE NYIEX;Lo;0;L;;;;;N;;;;; +A450;YI SYLLABLE NYIE;Lo;0;L;;;;;N;;;;; +A451;YI SYLLABLE NYIEP;Lo;0;L;;;;;N;;;;; +A452;YI SYLLABLE NYUOX;Lo;0;L;;;;;N;;;;; +A453;YI SYLLABLE NYUO;Lo;0;L;;;;;N;;;;; +A454;YI SYLLABLE NYUOP;Lo;0;L;;;;;N;;;;; +A455;YI SYLLABLE NYOT;Lo;0;L;;;;;N;;;;; +A456;YI SYLLABLE NYOX;Lo;0;L;;;;;N;;;;; +A457;YI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +A458;YI SYLLABLE NYOP;Lo;0;L;;;;;N;;;;; +A459;YI SYLLABLE NYUT;Lo;0;L;;;;;N;;;;; +A45A;YI SYLLABLE NYUX;Lo;0;L;;;;;N;;;;; +A45B;YI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +A45C;YI SYLLABLE NYUP;Lo;0;L;;;;;N;;;;; +A45D;YI SYLLABLE XIT;Lo;0;L;;;;;N;;;;; +A45E;YI SYLLABLE XIX;Lo;0;L;;;;;N;;;;; +A45F;YI SYLLABLE XI;Lo;0;L;;;;;N;;;;; +A460;YI SYLLABLE XIP;Lo;0;L;;;;;N;;;;; +A461;YI SYLLABLE XIET;Lo;0;L;;;;;N;;;;; +A462;YI SYLLABLE XIEX;Lo;0;L;;;;;N;;;;; +A463;YI SYLLABLE XIE;Lo;0;L;;;;;N;;;;; +A464;YI SYLLABLE XIEP;Lo;0;L;;;;;N;;;;; +A465;YI SYLLABLE XUOX;Lo;0;L;;;;;N;;;;; +A466;YI SYLLABLE XUO;Lo;0;L;;;;;N;;;;; +A467;YI SYLLABLE XOT;Lo;0;L;;;;;N;;;;; +A468;YI SYLLABLE XOX;Lo;0;L;;;;;N;;;;; +A469;YI SYLLABLE XO;Lo;0;L;;;;;N;;;;; +A46A;YI SYLLABLE XOP;Lo;0;L;;;;;N;;;;; +A46B;YI SYLLABLE XYT;Lo;0;L;;;;;N;;;;; +A46C;YI SYLLABLE XYX;Lo;0;L;;;;;N;;;;; +A46D;YI SYLLABLE XY;Lo;0;L;;;;;N;;;;; +A46E;YI SYLLABLE XYP;Lo;0;L;;;;;N;;;;; +A46F;YI SYLLABLE XYRX;Lo;0;L;;;;;N;;;;; +A470;YI SYLLABLE XYR;Lo;0;L;;;;;N;;;;; +A471;YI SYLLABLE YIT;Lo;0;L;;;;;N;;;;; +A472;YI SYLLABLE YIX;Lo;0;L;;;;;N;;;;; +A473;YI SYLLABLE YI;Lo;0;L;;;;;N;;;;; +A474;YI SYLLABLE YIP;Lo;0;L;;;;;N;;;;; +A475;YI SYLLABLE YIET;Lo;0;L;;;;;N;;;;; +A476;YI SYLLABLE YIEX;Lo;0;L;;;;;N;;;;; +A477;YI SYLLABLE YIE;Lo;0;L;;;;;N;;;;; +A478;YI SYLLABLE YIEP;Lo;0;L;;;;;N;;;;; +A479;YI SYLLABLE YUOT;Lo;0;L;;;;;N;;;;; +A47A;YI SYLLABLE YUOX;Lo;0;L;;;;;N;;;;; +A47B;YI SYLLABLE YUO;Lo;0;L;;;;;N;;;;; +A47C;YI SYLLABLE YUOP;Lo;0;L;;;;;N;;;;; +A47D;YI SYLLABLE YOT;Lo;0;L;;;;;N;;;;; +A47E;YI SYLLABLE YOX;Lo;0;L;;;;;N;;;;; +A47F;YI SYLLABLE YO;Lo;0;L;;;;;N;;;;; +A480;YI SYLLABLE YOP;Lo;0;L;;;;;N;;;;; +A481;YI SYLLABLE YUT;Lo;0;L;;;;;N;;;;; +A482;YI SYLLABLE YUX;Lo;0;L;;;;;N;;;;; +A483;YI SYLLABLE YU;Lo;0;L;;;;;N;;;;; +A484;YI SYLLABLE YUP;Lo;0;L;;;;;N;;;;; +A485;YI SYLLABLE YURX;Lo;0;L;;;;;N;;;;; +A486;YI SYLLABLE YUR;Lo;0;L;;;;;N;;;;; +A487;YI SYLLABLE YYT;Lo;0;L;;;;;N;;;;; +A488;YI SYLLABLE YYX;Lo;0;L;;;;;N;;;;; +A489;YI SYLLABLE YY;Lo;0;L;;;;;N;;;;; +A48A;YI SYLLABLE YYP;Lo;0;L;;;;;N;;;;; +A48B;YI SYLLABLE YYRX;Lo;0;L;;;;;N;;;;; +A48C;YI SYLLABLE YYR;Lo;0;L;;;;;N;;;;; +A490;YI RADICAL QOT;So;0;ON;;;;;N;;;;; +A491;YI RADICAL LI;So;0;ON;;;;;N;;;;; +A492;YI RADICAL KIT;So;0;ON;;;;;N;;;;; +A493;YI RADICAL NYIP;So;0;ON;;;;;N;;;;; +A494;YI RADICAL CYP;So;0;ON;;;;;N;;;;; +A495;YI RADICAL SSI;So;0;ON;;;;;N;;;;; +A496;YI RADICAL GGOP;So;0;ON;;;;;N;;;;; +A497;YI RADICAL GEP;So;0;ON;;;;;N;;;;; +A498;YI RADICAL MI;So;0;ON;;;;;N;;;;; +A499;YI RADICAL HXIT;So;0;ON;;;;;N;;;;; +A49A;YI RADICAL LYR;So;0;ON;;;;;N;;;;; +A49B;YI RADICAL BBUT;So;0;ON;;;;;N;;;;; +A49C;YI RADICAL MOP;So;0;ON;;;;;N;;;;; +A49D;YI RADICAL YO;So;0;ON;;;;;N;;;;; +A49E;YI RADICAL PUT;So;0;ON;;;;;N;;;;; +A49F;YI RADICAL HXUO;So;0;ON;;;;;N;;;;; +A4A0;YI RADICAL TAT;So;0;ON;;;;;N;;;;; +A4A1;YI RADICAL GA;So;0;ON;;;;;N;;;;; +A4A2;YI RADICAL ZUP;So;0;ON;;;;;N;;;;; +A4A3;YI RADICAL CYT;So;0;ON;;;;;N;;;;; +A4A4;YI RADICAL DDUR;So;0;ON;;;;;N;;;;; +A4A5;YI RADICAL BUR;So;0;ON;;;;;N;;;;; +A4A6;YI RADICAL GGUO;So;0;ON;;;;;N;;;;; +A4A7;YI RADICAL NYOP;So;0;ON;;;;;N;;;;; +A4A8;YI RADICAL TU;So;0;ON;;;;;N;;;;; +A4A9;YI RADICAL OP;So;0;ON;;;;;N;;;;; +A4AA;YI RADICAL JJUT;So;0;ON;;;;;N;;;;; +A4AB;YI RADICAL ZOT;So;0;ON;;;;;N;;;;; +A4AC;YI RADICAL PYT;So;0;ON;;;;;N;;;;; +A4AD;YI RADICAL HMO;So;0;ON;;;;;N;;;;; +A4AE;YI RADICAL YIT;So;0;ON;;;;;N;;;;; +A4AF;YI RADICAL VUR;So;0;ON;;;;;N;;;;; +A4B0;YI RADICAL SHY;So;0;ON;;;;;N;;;;; +A4B1;YI RADICAL VEP;So;0;ON;;;;;N;;;;; +A4B2;YI RADICAL ZA;So;0;ON;;;;;N;;;;; +A4B3;YI RADICAL JO;So;0;ON;;;;;N;;;;; +A4B4;YI RADICAL NZUP;So;0;ON;;;;;N;;;;; +A4B5;YI RADICAL JJY;So;0;ON;;;;;N;;;;; +A4B6;YI RADICAL GOT;So;0;ON;;;;;N;;;;; +A4B7;YI RADICAL JJIE;So;0;ON;;;;;N;;;;; +A4B8;YI RADICAL WO;So;0;ON;;;;;N;;;;; +A4B9;YI RADICAL DU;So;0;ON;;;;;N;;;;; +A4BA;YI RADICAL SHUR;So;0;ON;;;;;N;;;;; +A4BB;YI RADICAL LIE;So;0;ON;;;;;N;;;;; +A4BC;YI RADICAL CY;So;0;ON;;;;;N;;;;; +A4BD;YI RADICAL CUOP;So;0;ON;;;;;N;;;;; +A4BE;YI RADICAL CIP;So;0;ON;;;;;N;;;;; +A4BF;YI RADICAL HXOP;So;0;ON;;;;;N;;;;; +A4C0;YI RADICAL SHAT;So;0;ON;;;;;N;;;;; +A4C1;YI RADICAL ZUR;So;0;ON;;;;;N;;;;; +A4C2;YI RADICAL SHOP;So;0;ON;;;;;N;;;;; +A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;; +A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;; +A4C5;YI RADICAL NBIE;So;0;ON;;;;;N;;;;; +A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;; +A4D0;LISU LETTER BA;Lo;0;L;;;;;N;;;;; +A4D1;LISU LETTER PA;Lo;0;L;;;;;N;;;;; +A4D2;LISU LETTER PHA;Lo;0;L;;;;;N;;;;; +A4D3;LISU LETTER DA;Lo;0;L;;;;;N;;;;; +A4D4;LISU LETTER TA;Lo;0;L;;;;;N;;;;; +A4D5;LISU LETTER THA;Lo;0;L;;;;;N;;;;; +A4D6;LISU LETTER GA;Lo;0;L;;;;;N;;;;; +A4D7;LISU LETTER KA;Lo;0;L;;;;;N;;;;; +A4D8;LISU LETTER KHA;Lo;0;L;;;;;N;;;;; +A4D9;LISU LETTER JA;Lo;0;L;;;;;N;;;;; +A4DA;LISU LETTER CA;Lo;0;L;;;;;N;;;;; +A4DB;LISU LETTER CHA;Lo;0;L;;;;;N;;;;; +A4DC;LISU LETTER DZA;Lo;0;L;;;;;N;;;;; +A4DD;LISU LETTER TSA;Lo;0;L;;;;;N;;;;; +A4DE;LISU LETTER TSHA;Lo;0;L;;;;;N;;;;; +A4DF;LISU LETTER MA;Lo;0;L;;;;;N;;;;; +A4E0;LISU LETTER NA;Lo;0;L;;;;;N;;;;; +A4E1;LISU LETTER LA;Lo;0;L;;;;;N;;;;; +A4E2;LISU LETTER SA;Lo;0;L;;;;;N;;;;; +A4E3;LISU LETTER ZHA;Lo;0;L;;;;;N;;;;; +A4E4;LISU LETTER ZA;Lo;0;L;;;;;N;;;;; +A4E5;LISU LETTER NGA;Lo;0;L;;;;;N;;;;; +A4E6;LISU LETTER HA;Lo;0;L;;;;;N;;;;; +A4E7;LISU LETTER XA;Lo;0;L;;;;;N;;;;; +A4E8;LISU LETTER HHA;Lo;0;L;;;;;N;;;;; +A4E9;LISU LETTER FA;Lo;0;L;;;;;N;;;;; +A4EA;LISU LETTER WA;Lo;0;L;;;;;N;;;;; +A4EB;LISU LETTER SHA;Lo;0;L;;;;;N;;;;; +A4EC;LISU LETTER YA;Lo;0;L;;;;;N;;;;; +A4ED;LISU LETTER GHA;Lo;0;L;;;;;N;;;;; +A4EE;LISU LETTER A;Lo;0;L;;;;;N;;;;; +A4EF;LISU LETTER AE;Lo;0;L;;;;;N;;;;; +A4F0;LISU LETTER E;Lo;0;L;;;;;N;;;;; +A4F1;LISU LETTER EU;Lo;0;L;;;;;N;;;;; +A4F2;LISU LETTER I;Lo;0;L;;;;;N;;;;; +A4F3;LISU LETTER O;Lo;0;L;;;;;N;;;;; +A4F4;LISU LETTER U;Lo;0;L;;;;;N;;;;; +A4F5;LISU LETTER UE;Lo;0;L;;;;;N;;;;; +A4F6;LISU LETTER UH;Lo;0;L;;;;;N;;;;; +A4F7;LISU LETTER OE;Lo;0;L;;;;;N;;;;; +A4F8;LISU LETTER TONE MYA TI;Lm;0;L;;;;;N;;;;; +A4F9;LISU LETTER TONE NA PO;Lm;0;L;;;;;N;;;;; +A4FA;LISU LETTER TONE MYA CYA;Lm;0;L;;;;;N;;;;; +A4FB;LISU LETTER TONE MYA BO;Lm;0;L;;;;;N;;;;; +A4FC;LISU LETTER TONE MYA NA;Lm;0;L;;;;;N;;;;; +A4FD;LISU LETTER TONE MYA JEU;Lm;0;L;;;;;N;;;;; +A4FE;LISU PUNCTUATION COMMA;Po;0;L;;;;;N;;;;; +A4FF;LISU PUNCTUATION FULL STOP;Po;0;L;;;;;N;;;;; +A500;VAI SYLLABLE EE;Lo;0;L;;;;;N;;;;; +A501;VAI SYLLABLE EEN;Lo;0;L;;;;;N;;;;; +A502;VAI SYLLABLE HEE;Lo;0;L;;;;;N;;;;; +A503;VAI SYLLABLE WEE;Lo;0;L;;;;;N;;;;; +A504;VAI SYLLABLE WEEN;Lo;0;L;;;;;N;;;;; +A505;VAI SYLLABLE PEE;Lo;0;L;;;;;N;;;;; +A506;VAI SYLLABLE BHEE;Lo;0;L;;;;;N;;;;; +A507;VAI SYLLABLE BEE;Lo;0;L;;;;;N;;;;; +A508;VAI SYLLABLE MBEE;Lo;0;L;;;;;N;;;;; +A509;VAI SYLLABLE KPEE;Lo;0;L;;;;;N;;;;; +A50A;VAI SYLLABLE MGBEE;Lo;0;L;;;;;N;;;;; +A50B;VAI SYLLABLE GBEE;Lo;0;L;;;;;N;;;;; +A50C;VAI SYLLABLE FEE;Lo;0;L;;;;;N;;;;; +A50D;VAI SYLLABLE VEE;Lo;0;L;;;;;N;;;;; +A50E;VAI SYLLABLE TEE;Lo;0;L;;;;;N;;;;; +A50F;VAI SYLLABLE THEE;Lo;0;L;;;;;N;;;;; +A510;VAI SYLLABLE DHEE;Lo;0;L;;;;;N;;;;; +A511;VAI SYLLABLE DHHEE;Lo;0;L;;;;;N;;;;; +A512;VAI SYLLABLE LEE;Lo;0;L;;;;;N;;;;; +A513;VAI SYLLABLE REE;Lo;0;L;;;;;N;;;;; +A514;VAI SYLLABLE DEE;Lo;0;L;;;;;N;;;;; +A515;VAI SYLLABLE NDEE;Lo;0;L;;;;;N;;;;; +A516;VAI SYLLABLE SEE;Lo;0;L;;;;;N;;;;; +A517;VAI SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; +A518;VAI SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; +A519;VAI SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; +A51A;VAI SYLLABLE CEE;Lo;0;L;;;;;N;;;;; +A51B;VAI SYLLABLE JEE;Lo;0;L;;;;;N;;;;; +A51C;VAI SYLLABLE NJEE;Lo;0;L;;;;;N;;;;; +A51D;VAI SYLLABLE YEE;Lo;0;L;;;;;N;;;;; +A51E;VAI SYLLABLE KEE;Lo;0;L;;;;;N;;;;; +A51F;VAI SYLLABLE NGGEE;Lo;0;L;;;;;N;;;;; +A520;VAI SYLLABLE GEE;Lo;0;L;;;;;N;;;;; +A521;VAI SYLLABLE MEE;Lo;0;L;;;;;N;;;;; +A522;VAI SYLLABLE NEE;Lo;0;L;;;;;N;;;;; +A523;VAI SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; +A524;VAI SYLLABLE I;Lo;0;L;;;;;N;;;;; +A525;VAI SYLLABLE IN;Lo;0;L;;;;;N;;;;; +A526;VAI SYLLABLE HI;Lo;0;L;;;;;N;;;;; +A527;VAI SYLLABLE HIN;Lo;0;L;;;;;N;;;;; +A528;VAI SYLLABLE WI;Lo;0;L;;;;;N;;;;; +A529;VAI SYLLABLE WIN;Lo;0;L;;;;;N;;;;; +A52A;VAI SYLLABLE PI;Lo;0;L;;;;;N;;;;; +A52B;VAI SYLLABLE BHI;Lo;0;L;;;;;N;;;;; +A52C;VAI SYLLABLE BI;Lo;0;L;;;;;N;;;;; +A52D;VAI SYLLABLE MBI;Lo;0;L;;;;;N;;;;; +A52E;VAI SYLLABLE KPI;Lo;0;L;;;;;N;;;;; +A52F;VAI SYLLABLE MGBI;Lo;0;L;;;;;N;;;;; +A530;VAI SYLLABLE GBI;Lo;0;L;;;;;N;;;;; +A531;VAI SYLLABLE FI;Lo;0;L;;;;;N;;;;; +A532;VAI SYLLABLE VI;Lo;0;L;;;;;N;;;;; +A533;VAI SYLLABLE TI;Lo;0;L;;;;;N;;;;; +A534;VAI SYLLABLE THI;Lo;0;L;;;;;N;;;;; +A535;VAI SYLLABLE DHI;Lo;0;L;;;;;N;;;;; +A536;VAI SYLLABLE DHHI;Lo;0;L;;;;;N;;;;; +A537;VAI SYLLABLE LI;Lo;0;L;;;;;N;;;;; +A538;VAI SYLLABLE RI;Lo;0;L;;;;;N;;;;; +A539;VAI SYLLABLE DI;Lo;0;L;;;;;N;;;;; +A53A;VAI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; +A53B;VAI SYLLABLE SI;Lo;0;L;;;;;N;;;;; +A53C;VAI SYLLABLE SHI;Lo;0;L;;;;;N;;;;; +A53D;VAI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +A53E;VAI SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; +A53F;VAI SYLLABLE CI;Lo;0;L;;;;;N;;;;; +A540;VAI SYLLABLE JI;Lo;0;L;;;;;N;;;;; +A541;VAI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; +A542;VAI SYLLABLE YI;Lo;0;L;;;;;N;;;;; +A543;VAI SYLLABLE KI;Lo;0;L;;;;;N;;;;; +A544;VAI SYLLABLE NGGI;Lo;0;L;;;;;N;;;;; +A545;VAI SYLLABLE GI;Lo;0;L;;;;;N;;;;; +A546;VAI SYLLABLE MI;Lo;0;L;;;;;N;;;;; +A547;VAI SYLLABLE NI;Lo;0;L;;;;;N;;;;; +A548;VAI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +A549;VAI SYLLABLE A;Lo;0;L;;;;;N;;;;; +A54A;VAI SYLLABLE AN;Lo;0;L;;;;;N;;;;; +A54B;VAI SYLLABLE NGAN;Lo;0;L;;;;;N;;;;; +A54C;VAI SYLLABLE HA;Lo;0;L;;;;;N;;;;; +A54D;VAI SYLLABLE HAN;Lo;0;L;;;;;N;;;;; +A54E;VAI SYLLABLE WA;Lo;0;L;;;;;N;;;;; +A54F;VAI SYLLABLE WAN;Lo;0;L;;;;;N;;;;; +A550;VAI SYLLABLE PA;Lo;0;L;;;;;N;;;;; +A551;VAI SYLLABLE BHA;Lo;0;L;;;;;N;;;;; +A552;VAI SYLLABLE BA;Lo;0;L;;;;;N;;;;; +A553;VAI SYLLABLE MBA;Lo;0;L;;;;;N;;;;; +A554;VAI SYLLABLE KPA;Lo;0;L;;;;;N;;;;; +A555;VAI SYLLABLE KPAN;Lo;0;L;;;;;N;;;;; +A556;VAI SYLLABLE MGBA;Lo;0;L;;;;;N;;;;; +A557;VAI SYLLABLE GBA;Lo;0;L;;;;;N;;;;; +A558;VAI SYLLABLE FA;Lo;0;L;;;;;N;;;;; +A559;VAI SYLLABLE VA;Lo;0;L;;;;;N;;;;; +A55A;VAI SYLLABLE TA;Lo;0;L;;;;;N;;;;; +A55B;VAI SYLLABLE THA;Lo;0;L;;;;;N;;;;; +A55C;VAI SYLLABLE DHA;Lo;0;L;;;;;N;;;;; +A55D;VAI SYLLABLE DHHA;Lo;0;L;;;;;N;;;;; +A55E;VAI SYLLABLE LA;Lo;0;L;;;;;N;;;;; +A55F;VAI SYLLABLE RA;Lo;0;L;;;;;N;;;;; +A560;VAI SYLLABLE DA;Lo;0;L;;;;;N;;;;; +A561;VAI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; +A562;VAI SYLLABLE SA;Lo;0;L;;;;;N;;;;; +A563;VAI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +A564;VAI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +A565;VAI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +A566;VAI SYLLABLE CA;Lo;0;L;;;;;N;;;;; +A567;VAI SYLLABLE JA;Lo;0;L;;;;;N;;;;; +A568;VAI SYLLABLE NJA;Lo;0;L;;;;;N;;;;; +A569;VAI SYLLABLE YA;Lo;0;L;;;;;N;;;;; +A56A;VAI SYLLABLE KA;Lo;0;L;;;;;N;;;;; +A56B;VAI SYLLABLE KAN;Lo;0;L;;;;;N;;;;; +A56C;VAI SYLLABLE NGGA;Lo;0;L;;;;;N;;;;; +A56D;VAI SYLLABLE GA;Lo;0;L;;;;;N;;;;; +A56E;VAI SYLLABLE MA;Lo;0;L;;;;;N;;;;; +A56F;VAI SYLLABLE NA;Lo;0;L;;;;;N;;;;; +A570;VAI SYLLABLE NYA;Lo;0;L;;;;;N;;;;; +A571;VAI SYLLABLE OO;Lo;0;L;;;;;N;;;;; +A572;VAI SYLLABLE OON;Lo;0;L;;;;;N;;;;; +A573;VAI SYLLABLE HOO;Lo;0;L;;;;;N;;;;; +A574;VAI SYLLABLE WOO;Lo;0;L;;;;;N;;;;; +A575;VAI SYLLABLE WOON;Lo;0;L;;;;;N;;;;; +A576;VAI SYLLABLE POO;Lo;0;L;;;;;N;;;;; +A577;VAI SYLLABLE BHOO;Lo;0;L;;;;;N;;;;; +A578;VAI SYLLABLE BOO;Lo;0;L;;;;;N;;;;; +A579;VAI SYLLABLE MBOO;Lo;0;L;;;;;N;;;;; +A57A;VAI SYLLABLE KPOO;Lo;0;L;;;;;N;;;;; +A57B;VAI SYLLABLE MGBOO;Lo;0;L;;;;;N;;;;; +A57C;VAI SYLLABLE GBOO;Lo;0;L;;;;;N;;;;; +A57D;VAI SYLLABLE FOO;Lo;0;L;;;;;N;;;;; +A57E;VAI SYLLABLE VOO;Lo;0;L;;;;;N;;;;; +A57F;VAI SYLLABLE TOO;Lo;0;L;;;;;N;;;;; +A580;VAI SYLLABLE THOO;Lo;0;L;;;;;N;;;;; +A581;VAI SYLLABLE DHOO;Lo;0;L;;;;;N;;;;; +A582;VAI SYLLABLE DHHOO;Lo;0;L;;;;;N;;;;; +A583;VAI SYLLABLE LOO;Lo;0;L;;;;;N;;;;; +A584;VAI SYLLABLE ROO;Lo;0;L;;;;;N;;;;; +A585;VAI SYLLABLE DOO;Lo;0;L;;;;;N;;;;; +A586;VAI SYLLABLE NDOO;Lo;0;L;;;;;N;;;;; +A587;VAI SYLLABLE SOO;Lo;0;L;;;;;N;;;;; +A588;VAI SYLLABLE SHOO;Lo;0;L;;;;;N;;;;; +A589;VAI SYLLABLE ZOO;Lo;0;L;;;;;N;;;;; +A58A;VAI SYLLABLE ZHOO;Lo;0;L;;;;;N;;;;; +A58B;VAI SYLLABLE COO;Lo;0;L;;;;;N;;;;; +A58C;VAI SYLLABLE JOO;Lo;0;L;;;;;N;;;;; +A58D;VAI SYLLABLE NJOO;Lo;0;L;;;;;N;;;;; +A58E;VAI SYLLABLE YOO;Lo;0;L;;;;;N;;;;; +A58F;VAI SYLLABLE KOO;Lo;0;L;;;;;N;;;;; +A590;VAI SYLLABLE NGGOO;Lo;0;L;;;;;N;;;;; +A591;VAI SYLLABLE GOO;Lo;0;L;;;;;N;;;;; +A592;VAI SYLLABLE MOO;Lo;0;L;;;;;N;;;;; +A593;VAI SYLLABLE NOO;Lo;0;L;;;;;N;;;;; +A594;VAI SYLLABLE NYOO;Lo;0;L;;;;;N;;;;; +A595;VAI SYLLABLE U;Lo;0;L;;;;;N;;;;; +A596;VAI SYLLABLE UN;Lo;0;L;;;;;N;;;;; +A597;VAI SYLLABLE HU;Lo;0;L;;;;;N;;;;; +A598;VAI SYLLABLE HUN;Lo;0;L;;;;;N;;;;; +A599;VAI SYLLABLE WU;Lo;0;L;;;;;N;;;;; +A59A;VAI SYLLABLE WUN;Lo;0;L;;;;;N;;;;; +A59B;VAI SYLLABLE PU;Lo;0;L;;;;;N;;;;; +A59C;VAI SYLLABLE BHU;Lo;0;L;;;;;N;;;;; +A59D;VAI SYLLABLE BU;Lo;0;L;;;;;N;;;;; +A59E;VAI SYLLABLE MBU;Lo;0;L;;;;;N;;;;; +A59F;VAI SYLLABLE KPU;Lo;0;L;;;;;N;;;;; +A5A0;VAI SYLLABLE MGBU;Lo;0;L;;;;;N;;;;; +A5A1;VAI SYLLABLE GBU;Lo;0;L;;;;;N;;;;; +A5A2;VAI SYLLABLE FU;Lo;0;L;;;;;N;;;;; +A5A3;VAI SYLLABLE VU;Lo;0;L;;;;;N;;;;; +A5A4;VAI SYLLABLE TU;Lo;0;L;;;;;N;;;;; +A5A5;VAI SYLLABLE THU;Lo;0;L;;;;;N;;;;; +A5A6;VAI SYLLABLE DHU;Lo;0;L;;;;;N;;;;; +A5A7;VAI SYLLABLE DHHU;Lo;0;L;;;;;N;;;;; +A5A8;VAI SYLLABLE LU;Lo;0;L;;;;;N;;;;; +A5A9;VAI SYLLABLE RU;Lo;0;L;;;;;N;;;;; +A5AA;VAI SYLLABLE DU;Lo;0;L;;;;;N;;;;; +A5AB;VAI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; +A5AC;VAI SYLLABLE SU;Lo;0;L;;;;;N;;;;; +A5AD;VAI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +A5AE;VAI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +A5AF;VAI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +A5B0;VAI SYLLABLE CU;Lo;0;L;;;;;N;;;;; +A5B1;VAI SYLLABLE JU;Lo;0;L;;;;;N;;;;; +A5B2;VAI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; +A5B3;VAI SYLLABLE YU;Lo;0;L;;;;;N;;;;; +A5B4;VAI SYLLABLE KU;Lo;0;L;;;;;N;;;;; +A5B5;VAI SYLLABLE NGGU;Lo;0;L;;;;;N;;;;; +A5B6;VAI SYLLABLE GU;Lo;0;L;;;;;N;;;;; +A5B7;VAI SYLLABLE MU;Lo;0;L;;;;;N;;;;; +A5B8;VAI SYLLABLE NU;Lo;0;L;;;;;N;;;;; +A5B9;VAI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +A5BA;VAI SYLLABLE O;Lo;0;L;;;;;N;;;;; +A5BB;VAI SYLLABLE ON;Lo;0;L;;;;;N;;;;; +A5BC;VAI SYLLABLE NGON;Lo;0;L;;;;;N;;;;; +A5BD;VAI SYLLABLE HO;Lo;0;L;;;;;N;;;;; +A5BE;VAI SYLLABLE HON;Lo;0;L;;;;;N;;;;; +A5BF;VAI SYLLABLE WO;Lo;0;L;;;;;N;;;;; +A5C0;VAI SYLLABLE WON;Lo;0;L;;;;;N;;;;; +A5C1;VAI SYLLABLE PO;Lo;0;L;;;;;N;;;;; +A5C2;VAI SYLLABLE BHO;Lo;0;L;;;;;N;;;;; +A5C3;VAI SYLLABLE BO;Lo;0;L;;;;;N;;;;; +A5C4;VAI SYLLABLE MBO;Lo;0;L;;;;;N;;;;; +A5C5;VAI SYLLABLE KPO;Lo;0;L;;;;;N;;;;; +A5C6;VAI SYLLABLE MGBO;Lo;0;L;;;;;N;;;;; +A5C7;VAI SYLLABLE GBO;Lo;0;L;;;;;N;;;;; +A5C8;VAI SYLLABLE GBON;Lo;0;L;;;;;N;;;;; +A5C9;VAI SYLLABLE FO;Lo;0;L;;;;;N;;;;; +A5CA;VAI SYLLABLE VO;Lo;0;L;;;;;N;;;;; +A5CB;VAI SYLLABLE TO;Lo;0;L;;;;;N;;;;; +A5CC;VAI SYLLABLE THO;Lo;0;L;;;;;N;;;;; +A5CD;VAI SYLLABLE DHO;Lo;0;L;;;;;N;;;;; +A5CE;VAI SYLLABLE DHHO;Lo;0;L;;;;;N;;;;; +A5CF;VAI SYLLABLE LO;Lo;0;L;;;;;N;;;;; +A5D0;VAI SYLLABLE RO;Lo;0;L;;;;;N;;;;; +A5D1;VAI SYLLABLE DO;Lo;0;L;;;;;N;;;;; +A5D2;VAI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; +A5D3;VAI SYLLABLE SO;Lo;0;L;;;;;N;;;;; +A5D4;VAI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +A5D5;VAI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +A5D6;VAI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +A5D7;VAI SYLLABLE CO;Lo;0;L;;;;;N;;;;; +A5D8;VAI SYLLABLE JO;Lo;0;L;;;;;N;;;;; +A5D9;VAI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; +A5DA;VAI SYLLABLE YO;Lo;0;L;;;;;N;;;;; +A5DB;VAI SYLLABLE KO;Lo;0;L;;;;;N;;;;; +A5DC;VAI SYLLABLE NGGO;Lo;0;L;;;;;N;;;;; +A5DD;VAI SYLLABLE GO;Lo;0;L;;;;;N;;;;; +A5DE;VAI SYLLABLE MO;Lo;0;L;;;;;N;;;;; +A5DF;VAI SYLLABLE NO;Lo;0;L;;;;;N;;;;; +A5E0;VAI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +A5E1;VAI SYLLABLE E;Lo;0;L;;;;;N;;;;; +A5E2;VAI SYLLABLE EN;Lo;0;L;;;;;N;;;;; +A5E3;VAI SYLLABLE NGEN;Lo;0;L;;;;;N;;;;; +A5E4;VAI SYLLABLE HE;Lo;0;L;;;;;N;;;;; +A5E5;VAI SYLLABLE HEN;Lo;0;L;;;;;N;;;;; +A5E6;VAI SYLLABLE WE;Lo;0;L;;;;;N;;;;; +A5E7;VAI SYLLABLE WEN;Lo;0;L;;;;;N;;;;; +A5E8;VAI SYLLABLE PE;Lo;0;L;;;;;N;;;;; +A5E9;VAI SYLLABLE BHE;Lo;0;L;;;;;N;;;;; +A5EA;VAI SYLLABLE BE;Lo;0;L;;;;;N;;;;; +A5EB;VAI SYLLABLE MBE;Lo;0;L;;;;;N;;;;; +A5EC;VAI SYLLABLE KPE;Lo;0;L;;;;;N;;;;; +A5ED;VAI SYLLABLE KPEN;Lo;0;L;;;;;N;;;;; +A5EE;VAI SYLLABLE MGBE;Lo;0;L;;;;;N;;;;; +A5EF;VAI SYLLABLE GBE;Lo;0;L;;;;;N;;;;; +A5F0;VAI SYLLABLE GBEN;Lo;0;L;;;;;N;;;;; +A5F1;VAI SYLLABLE FE;Lo;0;L;;;;;N;;;;; +A5F2;VAI SYLLABLE VE;Lo;0;L;;;;;N;;;;; +A5F3;VAI SYLLABLE TE;Lo;0;L;;;;;N;;;;; +A5F4;VAI SYLLABLE THE;Lo;0;L;;;;;N;;;;; +A5F5;VAI SYLLABLE DHE;Lo;0;L;;;;;N;;;;; +A5F6;VAI SYLLABLE DHHE;Lo;0;L;;;;;N;;;;; +A5F7;VAI SYLLABLE LE;Lo;0;L;;;;;N;;;;; +A5F8;VAI SYLLABLE RE;Lo;0;L;;;;;N;;;;; +A5F9;VAI SYLLABLE DE;Lo;0;L;;;;;N;;;;; +A5FA;VAI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; +A5FB;VAI SYLLABLE SE;Lo;0;L;;;;;N;;;;; +A5FC;VAI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +A5FD;VAI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +A5FE;VAI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +A5FF;VAI SYLLABLE CE;Lo;0;L;;;;;N;;;;; +A600;VAI SYLLABLE JE;Lo;0;L;;;;;N;;;;; +A601;VAI SYLLABLE NJE;Lo;0;L;;;;;N;;;;; +A602;VAI SYLLABLE YE;Lo;0;L;;;;;N;;;;; +A603;VAI SYLLABLE KE;Lo;0;L;;;;;N;;;;; +A604;VAI SYLLABLE NGGE;Lo;0;L;;;;;N;;;;; +A605;VAI SYLLABLE NGGEN;Lo;0;L;;;;;N;;;;; +A606;VAI SYLLABLE GE;Lo;0;L;;;;;N;;;;; +A607;VAI SYLLABLE GEN;Lo;0;L;;;;;N;;;;; +A608;VAI SYLLABLE ME;Lo;0;L;;;;;N;;;;; +A609;VAI SYLLABLE NE;Lo;0;L;;;;;N;;;;; +A60A;VAI SYLLABLE NYE;Lo;0;L;;;;;N;;;;; +A60B;VAI SYLLABLE NG;Lo;0;L;;;;;N;;;;; +A60C;VAI SYLLABLE LENGTHENER;Lm;0;L;;;;;N;;;;; +A60D;VAI COMMA;Po;0;ON;;;;;N;;;;; +A60E;VAI FULL STOP;Po;0;ON;;;;;N;;;;; +A60F;VAI QUESTION MARK;Po;0;ON;;;;;N;;;;; +A610;VAI SYLLABLE NDOLE FA;Lo;0;L;;;;;N;;;;; +A611;VAI SYLLABLE NDOLE KA;Lo;0;L;;;;;N;;;;; +A612;VAI SYLLABLE NDOLE SOO;Lo;0;L;;;;;N;;;;; +A613;VAI SYMBOL FEENG;Lo;0;L;;;;;N;;;;; +A614;VAI SYMBOL KEENG;Lo;0;L;;;;;N;;;;; +A615;VAI SYMBOL TING;Lo;0;L;;;;;N;;;;; +A616;VAI SYMBOL NII;Lo;0;L;;;;;N;;;;; +A617;VAI SYMBOL BANG;Lo;0;L;;;;;N;;;;; +A618;VAI SYMBOL FAA;Lo;0;L;;;;;N;;;;; +A619;VAI SYMBOL TAA;Lo;0;L;;;;;N;;;;; +A61A;VAI SYMBOL DANG;Lo;0;L;;;;;N;;;;; +A61B;VAI SYMBOL DOONG;Lo;0;L;;;;;N;;;;; +A61C;VAI SYMBOL KUNG;Lo;0;L;;;;;N;;;;; +A61D;VAI SYMBOL TONG;Lo;0;L;;;;;N;;;;; +A61E;VAI SYMBOL DO-O;Lo;0;L;;;;;N;;;;; +A61F;VAI SYMBOL JONG;Lo;0;L;;;;;N;;;;; +A620;VAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A621;VAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A622;VAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A623;VAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A624;VAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A625;VAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A626;VAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A627;VAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A628;VAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A629;VAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A62A;VAI SYLLABLE NDOLE MA;Lo;0;L;;;;;N;;;;; +A62B;VAI SYLLABLE NDOLE DO;Lo;0;L;;;;;N;;;;; +A640;CYRILLIC CAPITAL LETTER ZEMLYA;Lu;0;L;;;;;N;;;;A641; +A641;CYRILLIC SMALL LETTER ZEMLYA;Ll;0;L;;;;;N;;;A640;;A640 +A642;CYRILLIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;A643; +A643;CYRILLIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;A642;;A642 +A644;CYRILLIC CAPITAL LETTER REVERSED DZE;Lu;0;L;;;;;N;;;;A645; +A645;CYRILLIC SMALL LETTER REVERSED DZE;Ll;0;L;;;;;N;;;A644;;A644 +A646;CYRILLIC CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;A647; +A647;CYRILLIC SMALL LETTER IOTA;Ll;0;L;;;;;N;;;A646;;A646 +A648;CYRILLIC CAPITAL LETTER DJERV;Lu;0;L;;;;;N;;;;A649; +A649;CYRILLIC SMALL LETTER DJERV;Ll;0;L;;;;;N;;;A648;;A648 +A64A;CYRILLIC CAPITAL LETTER MONOGRAPH UK;Lu;0;L;;;;;N;;;;A64B; +A64B;CYRILLIC SMALL LETTER MONOGRAPH UK;Ll;0;L;;;;;N;;;A64A;;A64A +A64C;CYRILLIC CAPITAL LETTER BROAD OMEGA;Lu;0;L;;;;;N;;;;A64D; +A64D;CYRILLIC SMALL LETTER BROAD OMEGA;Ll;0;L;;;;;N;;;A64C;;A64C +A64E;CYRILLIC CAPITAL LETTER NEUTRAL YER;Lu;0;L;;;;;N;;;;A64F; +A64F;CYRILLIC SMALL LETTER NEUTRAL YER;Ll;0;L;;;;;N;;;A64E;;A64E +A650;CYRILLIC CAPITAL LETTER YERU WITH BACK YER;Lu;0;L;;;;;N;;;;A651; +A651;CYRILLIC SMALL LETTER YERU WITH BACK YER;Ll;0;L;;;;;N;;;A650;;A650 +A652;CYRILLIC CAPITAL LETTER IOTIFIED YAT;Lu;0;L;;;;;N;;;;A653; +A653;CYRILLIC SMALL LETTER IOTIFIED YAT;Ll;0;L;;;;;N;;;A652;;A652 +A654;CYRILLIC CAPITAL LETTER REVERSED YU;Lu;0;L;;;;;N;;;;A655; +A655;CYRILLIC SMALL LETTER REVERSED YU;Ll;0;L;;;;;N;;;A654;;A654 +A656;CYRILLIC CAPITAL LETTER IOTIFIED A;Lu;0;L;;;;;N;;;;A657; +A657;CYRILLIC SMALL LETTER IOTIFIED A;Ll;0;L;;;;;N;;;A656;;A656 +A658;CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A659; +A659;CYRILLIC SMALL LETTER CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A658;;A658 +A65A;CYRILLIC CAPITAL LETTER BLENDED YUS;Lu;0;L;;;;;N;;;;A65B; +A65B;CYRILLIC SMALL LETTER BLENDED YUS;Ll;0;L;;;;;N;;;A65A;;A65A +A65C;CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A65D; +A65D;CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A65C;;A65C +A65E;CYRILLIC CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;A65F; +A65F;CYRILLIC SMALL LETTER YN;Ll;0;L;;;;;N;;;A65E;;A65E +A662;CYRILLIC CAPITAL LETTER SOFT DE;Lu;0;L;;;;;N;;;;A663; +A663;CYRILLIC SMALL LETTER SOFT DE;Ll;0;L;;;;;N;;;A662;;A662 +A664;CYRILLIC CAPITAL LETTER SOFT EL;Lu;0;L;;;;;N;;;;A665; +A665;CYRILLIC SMALL LETTER SOFT EL;Ll;0;L;;;;;N;;;A664;;A664 +A666;CYRILLIC CAPITAL LETTER SOFT EM;Lu;0;L;;;;;N;;;;A667; +A667;CYRILLIC SMALL LETTER SOFT EM;Ll;0;L;;;;;N;;;A666;;A666 +A668;CYRILLIC CAPITAL LETTER MONOCULAR O;Lu;0;L;;;;;N;;;;A669; +A669;CYRILLIC SMALL LETTER MONOCULAR O;Ll;0;L;;;;;N;;;A668;;A668 +A66A;CYRILLIC CAPITAL LETTER BINOCULAR O;Lu;0;L;;;;;N;;;;A66B; +A66B;CYRILLIC SMALL LETTER BINOCULAR O;Ll;0;L;;;;;N;;;A66A;;A66A +A66C;CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O;Lu;0;L;;;;;N;;;;A66D; +A66D;CYRILLIC SMALL LETTER DOUBLE MONOCULAR O;Ll;0;L;;;;;N;;;A66C;;A66C +A66E;CYRILLIC LETTER MULTIOCULAR O;Lo;0;L;;;;;N;;;;; +A66F;COMBINING CYRILLIC VZMET;Mn;230;NSM;;;;;N;;;;; +A670;COMBINING CYRILLIC TEN MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A671;COMBINING CYRILLIC HUNDRED MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A672;COMBINING CYRILLIC THOUSAND MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A673;SLAVONIC ASTERISK;Po;0;ON;;;;;N;;;;; +A67C;COMBINING CYRILLIC KAVYKA;Mn;230;NSM;;;;;N;;;;; +A67D;COMBINING CYRILLIC PAYEROK;Mn;230;NSM;;;;;N;;;;; +A67E;CYRILLIC KAVYKA;Po;0;ON;;;;;N;;;;; +A67F;CYRILLIC PAYEROK;Lm;0;ON;;;;;N;;;;; +A680;CYRILLIC CAPITAL LETTER DWE;Lu;0;L;;;;;N;;;;A681; +A681;CYRILLIC SMALL LETTER DWE;Ll;0;L;;;;;N;;;A680;;A680 +A682;CYRILLIC CAPITAL LETTER DZWE;Lu;0;L;;;;;N;;;;A683; +A683;CYRILLIC SMALL LETTER DZWE;Ll;0;L;;;;;N;;;A682;;A682 +A684;CYRILLIC CAPITAL LETTER ZHWE;Lu;0;L;;;;;N;;;;A685; +A685;CYRILLIC SMALL LETTER ZHWE;Ll;0;L;;;;;N;;;A684;;A684 +A686;CYRILLIC CAPITAL LETTER CCHE;Lu;0;L;;;;;N;;;;A687; +A687;CYRILLIC SMALL LETTER CCHE;Ll;0;L;;;;;N;;;A686;;A686 +A688;CYRILLIC CAPITAL LETTER DZZE;Lu;0;L;;;;;N;;;;A689; +A689;CYRILLIC SMALL LETTER DZZE;Ll;0;L;;;;;N;;;A688;;A688 +A68A;CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;A68B; +A68B;CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;A68A;;A68A +A68C;CYRILLIC CAPITAL LETTER TWE;Lu;0;L;;;;;N;;;;A68D; +A68D;CYRILLIC SMALL LETTER TWE;Ll;0;L;;;;;N;;;A68C;;A68C +A68E;CYRILLIC CAPITAL LETTER TSWE;Lu;0;L;;;;;N;;;;A68F; +A68F;CYRILLIC SMALL LETTER TSWE;Ll;0;L;;;;;N;;;A68E;;A68E +A690;CYRILLIC CAPITAL LETTER TSSE;Lu;0;L;;;;;N;;;;A691; +A691;CYRILLIC SMALL LETTER TSSE;Ll;0;L;;;;;N;;;A690;;A690 +A692;CYRILLIC CAPITAL LETTER TCHE;Lu;0;L;;;;;N;;;;A693; +A693;CYRILLIC SMALL LETTER TCHE;Ll;0;L;;;;;N;;;A692;;A692 +A694;CYRILLIC CAPITAL LETTER HWE;Lu;0;L;;;;;N;;;;A695; +A695;CYRILLIC SMALL LETTER HWE;Ll;0;L;;;;;N;;;A694;;A694 +A696;CYRILLIC CAPITAL LETTER SHWE;Lu;0;L;;;;;N;;;;A697; +A697;CYRILLIC SMALL LETTER SHWE;Ll;0;L;;;;;N;;;A696;;A696 +A6A0;BAMUM LETTER A;Lo;0;L;;;;;N;;;;; +A6A1;BAMUM LETTER KA;Lo;0;L;;;;;N;;;;; +A6A2;BAMUM LETTER U;Lo;0;L;;;;;N;;;;; +A6A3;BAMUM LETTER KU;Lo;0;L;;;;;N;;;;; +A6A4;BAMUM LETTER EE;Lo;0;L;;;;;N;;;;; +A6A5;BAMUM LETTER REE;Lo;0;L;;;;;N;;;;; +A6A6;BAMUM LETTER TAE;Lo;0;L;;;;;N;;;;; +A6A7;BAMUM LETTER O;Lo;0;L;;;;;N;;;;; +A6A8;BAMUM LETTER NYI;Lo;0;L;;;;;N;;;;; +A6A9;BAMUM LETTER I;Lo;0;L;;;;;N;;;;; +A6AA;BAMUM LETTER LA;Lo;0;L;;;;;N;;;;; +A6AB;BAMUM LETTER PA;Lo;0;L;;;;;N;;;;; +A6AC;BAMUM LETTER RII;Lo;0;L;;;;;N;;;;; +A6AD;BAMUM LETTER RIEE;Lo;0;L;;;;;N;;;;; +A6AE;BAMUM LETTER LEEEE;Lo;0;L;;;;;N;;;;; +A6AF;BAMUM LETTER MEEEE;Lo;0;L;;;;;N;;;;; +A6B0;BAMUM LETTER TAA;Lo;0;L;;;;;N;;;;; +A6B1;BAMUM LETTER NDAA;Lo;0;L;;;;;N;;;;; +A6B2;BAMUM LETTER NJAEM;Lo;0;L;;;;;N;;;;; +A6B3;BAMUM LETTER M;Lo;0;L;;;;;N;;;;; +A6B4;BAMUM LETTER SUU;Lo;0;L;;;;;N;;;;; +A6B5;BAMUM LETTER MU;Lo;0;L;;;;;N;;;;; +A6B6;BAMUM LETTER SHII;Lo;0;L;;;;;N;;;;; +A6B7;BAMUM LETTER SI;Lo;0;L;;;;;N;;;;; +A6B8;BAMUM LETTER SHEUX;Lo;0;L;;;;;N;;;;; +A6B9;BAMUM LETTER SEUX;Lo;0;L;;;;;N;;;;; +A6BA;BAMUM LETTER KYEE;Lo;0;L;;;;;N;;;;; +A6BB;BAMUM LETTER KET;Lo;0;L;;;;;N;;;;; +A6BC;BAMUM LETTER NUAE;Lo;0;L;;;;;N;;;;; +A6BD;BAMUM LETTER NU;Lo;0;L;;;;;N;;;;; +A6BE;BAMUM LETTER NJUAE;Lo;0;L;;;;;N;;;;; +A6BF;BAMUM LETTER YOQ;Lo;0;L;;;;;N;;;;; +A6C0;BAMUM LETTER SHU;Lo;0;L;;;;;N;;;;; +A6C1;BAMUM LETTER YUQ;Lo;0;L;;;;;N;;;;; +A6C2;BAMUM LETTER YA;Lo;0;L;;;;;N;;;;; +A6C3;BAMUM LETTER NSHA;Lo;0;L;;;;;N;;;;; +A6C4;BAMUM LETTER KEUX;Lo;0;L;;;;;N;;;;; +A6C5;BAMUM LETTER PEUX;Lo;0;L;;;;;N;;;;; +A6C6;BAMUM LETTER NJEE;Lo;0;L;;;;;N;;;;; +A6C7;BAMUM LETTER NTEE;Lo;0;L;;;;;N;;;;; +A6C8;BAMUM LETTER PUE;Lo;0;L;;;;;N;;;;; +A6C9;BAMUM LETTER WUE;Lo;0;L;;;;;N;;;;; +A6CA;BAMUM LETTER PEE;Lo;0;L;;;;;N;;;;; +A6CB;BAMUM LETTER FEE;Lo;0;L;;;;;N;;;;; +A6CC;BAMUM LETTER RU;Lo;0;L;;;;;N;;;;; +A6CD;BAMUM LETTER LU;Lo;0;L;;;;;N;;;;; +A6CE;BAMUM LETTER MI;Lo;0;L;;;;;N;;;;; +A6CF;BAMUM LETTER NI;Lo;0;L;;;;;N;;;;; +A6D0;BAMUM LETTER REUX;Lo;0;L;;;;;N;;;;; +A6D1;BAMUM LETTER RAE;Lo;0;L;;;;;N;;;;; +A6D2;BAMUM LETTER KEN;Lo;0;L;;;;;N;;;;; +A6D3;BAMUM LETTER NGKWAEN;Lo;0;L;;;;;N;;;;; +A6D4;BAMUM LETTER NGGA;Lo;0;L;;;;;N;;;;; +A6D5;BAMUM LETTER NGA;Lo;0;L;;;;;N;;;;; +A6D6;BAMUM LETTER SHO;Lo;0;L;;;;;N;;;;; +A6D7;BAMUM LETTER PUAE;Lo;0;L;;;;;N;;;;; +A6D8;BAMUM LETTER FU;Lo;0;L;;;;;N;;;;; +A6D9;BAMUM LETTER FOM;Lo;0;L;;;;;N;;;;; +A6DA;BAMUM LETTER WA;Lo;0;L;;;;;N;;;;; +A6DB;BAMUM LETTER NA;Lo;0;L;;;;;N;;;;; +A6DC;BAMUM LETTER LI;Lo;0;L;;;;;N;;;;; +A6DD;BAMUM LETTER PI;Lo;0;L;;;;;N;;;;; +A6DE;BAMUM LETTER LOQ;Lo;0;L;;;;;N;;;;; +A6DF;BAMUM LETTER KO;Lo;0;L;;;;;N;;;;; +A6E0;BAMUM LETTER MBEN;Lo;0;L;;;;;N;;;;; +A6E1;BAMUM LETTER REN;Lo;0;L;;;;;N;;;;; +A6E2;BAMUM LETTER MEN;Lo;0;L;;;;;N;;;;; +A6E3;BAMUM LETTER MA;Lo;0;L;;;;;N;;;;; +A6E4;BAMUM LETTER TI;Lo;0;L;;;;;N;;;;; +A6E5;BAMUM LETTER KI;Lo;0;L;;;;;N;;;;; +A6E6;BAMUM LETTER MO;Nl;0;L;;;;1;N;;;;; +A6E7;BAMUM LETTER MBAA;Nl;0;L;;;;2;N;;;;; +A6E8;BAMUM LETTER TET;Nl;0;L;;;;3;N;;;;; +A6E9;BAMUM LETTER KPA;Nl;0;L;;;;4;N;;;;; +A6EA;BAMUM LETTER TEN;Nl;0;L;;;;5;N;;;;; +A6EB;BAMUM LETTER NTUU;Nl;0;L;;;;6;N;;;;; +A6EC;BAMUM LETTER SAMBA;Nl;0;L;;;;7;N;;;;; +A6ED;BAMUM LETTER FAAMAE;Nl;0;L;;;;8;N;;;;; +A6EE;BAMUM LETTER KOVUU;Nl;0;L;;;;9;N;;;;; +A6EF;BAMUM LETTER KOGHOM;Nl;0;L;;;;0;N;;;;; +A6F0;BAMUM COMBINING MARK KOQNDON;Mn;230;NSM;;;;;N;;;;; +A6F1;BAMUM COMBINING MARK TUKWENTIS;Mn;230;NSM;;;;;N;;;;; +A6F2;BAMUM NJAEMLI;Po;0;L;;;;;N;;;;; +A6F3;BAMUM FULL STOP;Po;0;L;;;;;N;;;;; +A6F4;BAMUM COLON;Po;0;L;;;;;N;;;;; +A6F5;BAMUM COMMA;Po;0;L;;;;;N;;;;; +A6F6;BAMUM SEMICOLON;Po;0;L;;;;;N;;;;; +A6F7;BAMUM QUESTION MARK;Po;0;L;;;;;N;;;;; +A700;MODIFIER LETTER CHINESE TONE YIN PING;Sk;0;ON;;;;;N;;;;; +A701;MODIFIER LETTER CHINESE TONE YANG PING;Sk;0;ON;;;;;N;;;;; +A702;MODIFIER LETTER CHINESE TONE YIN SHANG;Sk;0;ON;;;;;N;;;;; +A703;MODIFIER LETTER CHINESE TONE YANG SHANG;Sk;0;ON;;;;;N;;;;; +A704;MODIFIER LETTER CHINESE TONE YIN QU;Sk;0;ON;;;;;N;;;;; +A705;MODIFIER LETTER CHINESE TONE YANG QU;Sk;0;ON;;;;;N;;;;; +A706;MODIFIER LETTER CHINESE TONE YIN RU;Sk;0;ON;;;;;N;;;;; +A707;MODIFIER LETTER CHINESE TONE YANG RU;Sk;0;ON;;;;;N;;;;; +A708;MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A709;MODIFIER LETTER HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70A;MODIFIER LETTER MID DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70B;MODIFIER LETTER LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70C;MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70D;MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A70E;MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A70F;MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A710;MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A711;MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A712;MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A713;MODIFIER LETTER HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A714;MODIFIER LETTER MID LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A715;MODIFIER LETTER LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A716;MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A717;MODIFIER LETTER DOT VERTICAL BAR;Lm;0;ON;;;;;N;;;;; +A718;MODIFIER LETTER DOT SLASH;Lm;0;ON;;;;;N;;;;; +A719;MODIFIER LETTER DOT HORIZONTAL BAR;Lm;0;ON;;;;;N;;;;; +A71A;MODIFIER LETTER LOWER RIGHT CORNER ANGLE;Lm;0;ON;;;;;N;;;;; +A71B;MODIFIER LETTER RAISED UP ARROW;Lm;0;ON;;;;;N;;;;; +A71C;MODIFIER LETTER RAISED DOWN ARROW;Lm;0;ON;;;;;N;;;;; +A71D;MODIFIER LETTER RAISED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A71E;MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A71F;MODIFIER LETTER LOW INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A720;MODIFIER LETTER STRESS AND HIGH TONE;Sk;0;ON;;;;;N;;;;; +A721;MODIFIER LETTER STRESS AND LOW TONE;Sk;0;ON;;;;;N;;;;; +A722;LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF;Lu;0;L;;;;;N;;;;A723; +A723;LATIN SMALL LETTER EGYPTOLOGICAL ALEF;Ll;0;L;;;;;N;;;A722;;A722 +A724;LATIN CAPITAL LETTER EGYPTOLOGICAL AIN;Lu;0;L;;;;;N;;;;A725; +A725;LATIN SMALL LETTER EGYPTOLOGICAL AIN;Ll;0;L;;;;;N;;;A724;;A724 +A726;LATIN CAPITAL LETTER HENG;Lu;0;L;;;;;N;;;;A727; +A727;LATIN SMALL LETTER HENG;Ll;0;L;;;;;N;;;A726;;A726 +A728;LATIN CAPITAL LETTER TZ;Lu;0;L;;;;;N;;;;A729; +A729;LATIN SMALL LETTER TZ;Ll;0;L;;;;;N;;;A728;;A728 +A72A;LATIN CAPITAL LETTER TRESILLO;Lu;0;L;;;;;N;;;;A72B; +A72B;LATIN SMALL LETTER TRESILLO;Ll;0;L;;;;;N;;;A72A;;A72A +A72C;LATIN CAPITAL LETTER CUATRILLO;Lu;0;L;;;;;N;;;;A72D; +A72D;LATIN SMALL LETTER CUATRILLO;Ll;0;L;;;;;N;;;A72C;;A72C +A72E;LATIN CAPITAL LETTER CUATRILLO WITH COMMA;Lu;0;L;;;;;N;;;;A72F; +A72F;LATIN SMALL LETTER CUATRILLO WITH COMMA;Ll;0;L;;;;;N;;;A72E;;A72E +A730;LATIN LETTER SMALL CAPITAL F;Ll;0;L;;;;;N;;;;; +A731;LATIN LETTER SMALL CAPITAL S;Ll;0;L;;;;;N;;;;; +A732;LATIN CAPITAL LETTER AA;Lu;0;L;;;;;N;;;;A733; +A733;LATIN SMALL LETTER AA;Ll;0;L;;;;;N;;;A732;;A732 +A734;LATIN CAPITAL LETTER AO;Lu;0;L;;;;;N;;;;A735; +A735;LATIN SMALL LETTER AO;Ll;0;L;;;;;N;;;A734;;A734 +A736;LATIN CAPITAL LETTER AU;Lu;0;L;;;;;N;;;;A737; +A737;LATIN SMALL LETTER AU;Ll;0;L;;;;;N;;;A736;;A736 +A738;LATIN CAPITAL LETTER AV;Lu;0;L;;;;;N;;;;A739; +A739;LATIN SMALL LETTER AV;Ll;0;L;;;;;N;;;A738;;A738 +A73A;LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR;Lu;0;L;;;;;N;;;;A73B; +A73B;LATIN SMALL LETTER AV WITH HORIZONTAL BAR;Ll;0;L;;;;;N;;;A73A;;A73A +A73C;LATIN CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;A73D; +A73D;LATIN SMALL LETTER AY;Ll;0;L;;;;;N;;;A73C;;A73C +A73E;LATIN CAPITAL LETTER REVERSED C WITH DOT;Lu;0;L;;;;;N;;;;A73F; +A73F;LATIN SMALL LETTER REVERSED C WITH DOT;Ll;0;L;;;;;N;;;A73E;;A73E +A740;LATIN CAPITAL LETTER K WITH STROKE;Lu;0;L;;;;;N;;;;A741; +A741;LATIN SMALL LETTER K WITH STROKE;Ll;0;L;;;;;N;;;A740;;A740 +A742;LATIN CAPITAL LETTER K WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A743; +A743;LATIN SMALL LETTER K WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A742;;A742 +A744;LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A745; +A745;LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE;Ll;0;L;;;;;N;;;A744;;A744 +A746;LATIN CAPITAL LETTER BROKEN L;Lu;0;L;;;;;N;;;;A747; +A747;LATIN SMALL LETTER BROKEN L;Ll;0;L;;;;;N;;;A746;;A746 +A748;LATIN CAPITAL LETTER L WITH HIGH STROKE;Lu;0;L;;;;;N;;;;A749; +A749;LATIN SMALL LETTER L WITH HIGH STROKE;Ll;0;L;;;;;N;;;A748;;A748 +A74A;LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY;Lu;0;L;;;;;N;;;;A74B; +A74B;LATIN SMALL LETTER O WITH LONG STROKE OVERLAY;Ll;0;L;;;;;N;;;A74A;;A74A +A74C;LATIN CAPITAL LETTER O WITH LOOP;Lu;0;L;;;;;N;;;;A74D; +A74D;LATIN SMALL LETTER O WITH LOOP;Ll;0;L;;;;;N;;;A74C;;A74C +A74E;LATIN CAPITAL LETTER OO;Lu;0;L;;;;;N;;;;A74F; +A74F;LATIN SMALL LETTER OO;Ll;0;L;;;;;N;;;A74E;;A74E +A750;LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A751; +A751;LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A750;;A750 +A752;LATIN CAPITAL LETTER P WITH FLOURISH;Lu;0;L;;;;;N;;;;A753; +A753;LATIN SMALL LETTER P WITH FLOURISH;Ll;0;L;;;;;N;;;A752;;A752 +A754;LATIN CAPITAL LETTER P WITH SQUIRREL TAIL;Lu;0;L;;;;;N;;;;A755; +A755;LATIN SMALL LETTER P WITH SQUIRREL TAIL;Ll;0;L;;;;;N;;;A754;;A754 +A756;LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A757; +A757;LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A756;;A756 +A758;LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A759; +A759;LATIN SMALL LETTER Q WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A758;;A758 +A75A;LATIN CAPITAL LETTER R ROTUNDA;Lu;0;L;;;;;N;;;;A75B; +A75B;LATIN SMALL LETTER R ROTUNDA;Ll;0;L;;;;;N;;;A75A;;A75A +A75C;LATIN CAPITAL LETTER RUM ROTUNDA;Lu;0;L;;;;;N;;;;A75D; +A75D;LATIN SMALL LETTER RUM ROTUNDA;Ll;0;L;;;;;N;;;A75C;;A75C +A75E;LATIN CAPITAL LETTER V WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A75F; +A75F;LATIN SMALL LETTER V WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A75E;;A75E +A760;LATIN CAPITAL LETTER VY;Lu;0;L;;;;;N;;;;A761; +A761;LATIN SMALL LETTER VY;Ll;0;L;;;;;N;;;A760;;A760 +A762;LATIN CAPITAL LETTER VISIGOTHIC Z;Lu;0;L;;;;;N;;;;A763; +A763;LATIN SMALL LETTER VISIGOTHIC Z;Ll;0;L;;;;;N;;;A762;;A762 +A764;LATIN CAPITAL LETTER THORN WITH STROKE;Lu;0;L;;;;;N;;;;A765; +A765;LATIN SMALL LETTER THORN WITH STROKE;Ll;0;L;;;;;N;;;A764;;A764 +A766;LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A767; +A767;LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A766;;A766 +A768;LATIN CAPITAL LETTER VEND;Lu;0;L;;;;;N;;;;A769; +A769;LATIN SMALL LETTER VEND;Ll;0;L;;;;;N;;;A768;;A768 +A76A;LATIN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;A76B; +A76B;LATIN SMALL LETTER ET;Ll;0;L;;;;;N;;;A76A;;A76A +A76C;LATIN CAPITAL LETTER IS;Lu;0;L;;;;;N;;;;A76D; +A76D;LATIN SMALL LETTER IS;Ll;0;L;;;;;N;;;A76C;;A76C +A76E;LATIN CAPITAL LETTER CON;Lu;0;L;;;;;N;;;;A76F; +A76F;LATIN SMALL LETTER CON;Ll;0;L;;;;;N;;;A76E;;A76E +A770;MODIFIER LETTER US;Lm;0;L;<super> A76F;;;;N;;;;; +A771;LATIN SMALL LETTER DUM;Ll;0;L;;;;;N;;;;; +A772;LATIN SMALL LETTER LUM;Ll;0;L;;;;;N;;;;; +A773;LATIN SMALL LETTER MUM;Ll;0;L;;;;;N;;;;; +A774;LATIN SMALL LETTER NUM;Ll;0;L;;;;;N;;;;; +A775;LATIN SMALL LETTER RUM;Ll;0;L;;;;;N;;;;; +A776;LATIN LETTER SMALL CAPITAL RUM;Ll;0;L;;;;;N;;;;; +A777;LATIN SMALL LETTER TUM;Ll;0;L;;;;;N;;;;; +A778;LATIN SMALL LETTER UM;Ll;0;L;;;;;N;;;;; +A779;LATIN CAPITAL LETTER INSULAR D;Lu;0;L;;;;;N;;;;A77A; +A77A;LATIN SMALL LETTER INSULAR D;Ll;0;L;;;;;N;;;A779;;A779 +A77B;LATIN CAPITAL LETTER INSULAR F;Lu;0;L;;;;;N;;;;A77C; +A77C;LATIN SMALL LETTER INSULAR F;Ll;0;L;;;;;N;;;A77B;;A77B +A77D;LATIN CAPITAL LETTER INSULAR G;Lu;0;L;;;;;N;;;;1D79; +A77E;LATIN CAPITAL LETTER TURNED INSULAR G;Lu;0;L;;;;;N;;;;A77F; +A77F;LATIN SMALL LETTER TURNED INSULAR G;Ll;0;L;;;;;N;;;A77E;;A77E +A780;LATIN CAPITAL LETTER TURNED L;Lu;0;L;;;;;N;;;;A781; +A781;LATIN SMALL LETTER TURNED L;Ll;0;L;;;;;N;;;A780;;A780 +A782;LATIN CAPITAL LETTER INSULAR R;Lu;0;L;;;;;N;;;;A783; +A783;LATIN SMALL LETTER INSULAR R;Ll;0;L;;;;;N;;;A782;;A782 +A784;LATIN CAPITAL LETTER INSULAR S;Lu;0;L;;;;;N;;;;A785; +A785;LATIN SMALL LETTER INSULAR S;Ll;0;L;;;;;N;;;A784;;A784 +A786;LATIN CAPITAL LETTER INSULAR T;Lu;0;L;;;;;N;;;;A787; +A787;LATIN SMALL LETTER INSULAR T;Ll;0;L;;;;;N;;;A786;;A786 +A788;MODIFIER LETTER LOW CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;;;;; +A789;MODIFIER LETTER COLON;Sk;0;L;;;;;N;;;;; +A78A;MODIFIER LETTER SHORT EQUALS SIGN;Sk;0;L;;;;;N;;;;; +A78B;LATIN CAPITAL LETTER SALTILLO;Lu;0;L;;;;;N;;;;A78C; +A78C;LATIN SMALL LETTER SALTILLO;Ll;0;L;;;;;N;;;A78B;;A78B +A7FB;LATIN EPIGRAPHIC LETTER REVERSED F;Lo;0;L;;;;;N;;;;; +A7FC;LATIN EPIGRAPHIC LETTER REVERSED P;Lo;0;L;;;;;N;;;;; +A7FD;LATIN EPIGRAPHIC LETTER INVERTED M;Lo;0;L;;;;;N;;;;; +A7FE;LATIN EPIGRAPHIC LETTER I LONGA;Lo;0;L;;;;;N;;;;; +A7FF;LATIN EPIGRAPHIC LETTER ARCHAIC M;Lo;0;L;;;;;N;;;;; +A800;SYLOTI NAGRI LETTER A;Lo;0;L;;;;;N;;;;; +A801;SYLOTI NAGRI LETTER I;Lo;0;L;;;;;N;;;;; +A802;SYLOTI NAGRI SIGN DVISVARA;Mn;0;NSM;;;;;N;;;;; +A803;SYLOTI NAGRI LETTER U;Lo;0;L;;;;;N;;;;; +A804;SYLOTI NAGRI LETTER E;Lo;0;L;;;;;N;;;;; +A805;SYLOTI NAGRI LETTER O;Lo;0;L;;;;;N;;;;; +A806;SYLOTI NAGRI SIGN HASANTA;Mn;9;NSM;;;;;N;;;;; +A807;SYLOTI NAGRI LETTER KO;Lo;0;L;;;;;N;;;;; +A808;SYLOTI NAGRI LETTER KHO;Lo;0;L;;;;;N;;;;; +A809;SYLOTI NAGRI LETTER GO;Lo;0;L;;;;;N;;;;; +A80A;SYLOTI NAGRI LETTER GHO;Lo;0;L;;;;;N;;;;; +A80B;SYLOTI NAGRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +A80C;SYLOTI NAGRI LETTER CO;Lo;0;L;;;;;N;;;;; +A80D;SYLOTI NAGRI LETTER CHO;Lo;0;L;;;;;N;;;;; +A80E;SYLOTI NAGRI LETTER JO;Lo;0;L;;;;;N;;;;; +A80F;SYLOTI NAGRI LETTER JHO;Lo;0;L;;;;;N;;;;; +A810;SYLOTI NAGRI LETTER TTO;Lo;0;L;;;;;N;;;;; +A811;SYLOTI NAGRI LETTER TTHO;Lo;0;L;;;;;N;;;;; +A812;SYLOTI NAGRI LETTER DDO;Lo;0;L;;;;;N;;;;; +A813;SYLOTI NAGRI LETTER DDHO;Lo;0;L;;;;;N;;;;; +A814;SYLOTI NAGRI LETTER TO;Lo;0;L;;;;;N;;;;; +A815;SYLOTI NAGRI LETTER THO;Lo;0;L;;;;;N;;;;; +A816;SYLOTI NAGRI LETTER DO;Lo;0;L;;;;;N;;;;; +A817;SYLOTI NAGRI LETTER DHO;Lo;0;L;;;;;N;;;;; +A818;SYLOTI NAGRI LETTER NO;Lo;0;L;;;;;N;;;;; +A819;SYLOTI NAGRI LETTER PO;Lo;0;L;;;;;N;;;;; +A81A;SYLOTI NAGRI LETTER PHO;Lo;0;L;;;;;N;;;;; +A81B;SYLOTI NAGRI LETTER BO;Lo;0;L;;;;;N;;;;; +A81C;SYLOTI NAGRI LETTER BHO;Lo;0;L;;;;;N;;;;; +A81D;SYLOTI NAGRI LETTER MO;Lo;0;L;;;;;N;;;;; +A81E;SYLOTI NAGRI LETTER RO;Lo;0;L;;;;;N;;;;; +A81F;SYLOTI NAGRI LETTER LO;Lo;0;L;;;;;N;;;;; +A820;SYLOTI NAGRI LETTER RRO;Lo;0;L;;;;;N;;;;; +A821;SYLOTI NAGRI LETTER SO;Lo;0;L;;;;;N;;;;; +A822;SYLOTI NAGRI LETTER HO;Lo;0;L;;;;;N;;;;; +A823;SYLOTI NAGRI VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +A824;SYLOTI NAGRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +A825;SYLOTI NAGRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +A826;SYLOTI NAGRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +A827;SYLOTI NAGRI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +A828;SYLOTI NAGRI POETRY MARK-1;So;0;ON;;;;;N;;;;; +A829;SYLOTI NAGRI POETRY MARK-2;So;0;ON;;;;;N;;;;; +A82A;SYLOTI NAGRI POETRY MARK-3;So;0;ON;;;;;N;;;;; +A82B;SYLOTI NAGRI POETRY MARK-4;So;0;ON;;;;;N;;;;; +A830;NORTH INDIC FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +A831;NORTH INDIC FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; +A832;NORTH INDIC FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +A833;NORTH INDIC FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; +A834;NORTH INDIC FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; +A835;NORTH INDIC FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; +A836;NORTH INDIC QUARTER MARK;So;0;L;;;;;N;;;;; +A837;NORTH INDIC PLACEHOLDER MARK;So;0;L;;;;;N;;;;; +A838;NORTH INDIC RUPEE MARK;Sc;0;ET;;;;;N;;;;; +A839;NORTH INDIC QUANTITY MARK;So;0;ET;;;;;N;;;;; +A840;PHAGS-PA LETTER KA;Lo;0;L;;;;;N;;;;; +A841;PHAGS-PA LETTER KHA;Lo;0;L;;;;;N;;;;; +A842;PHAGS-PA LETTER GA;Lo;0;L;;;;;N;;;;; +A843;PHAGS-PA LETTER NGA;Lo;0;L;;;;;N;;;;; +A844;PHAGS-PA LETTER CA;Lo;0;L;;;;;N;;;;; +A845;PHAGS-PA LETTER CHA;Lo;0;L;;;;;N;;;;; +A846;PHAGS-PA LETTER JA;Lo;0;L;;;;;N;;;;; +A847;PHAGS-PA LETTER NYA;Lo;0;L;;;;;N;;;;; +A848;PHAGS-PA LETTER TA;Lo;0;L;;;;;N;;;;; +A849;PHAGS-PA LETTER THA;Lo;0;L;;;;;N;;;;; +A84A;PHAGS-PA LETTER DA;Lo;0;L;;;;;N;;;;; +A84B;PHAGS-PA LETTER NA;Lo;0;L;;;;;N;;;;; +A84C;PHAGS-PA LETTER PA;Lo;0;L;;;;;N;;;;; +A84D;PHAGS-PA LETTER PHA;Lo;0;L;;;;;N;;;;; +A84E;PHAGS-PA LETTER BA;Lo;0;L;;;;;N;;;;; +A84F;PHAGS-PA LETTER MA;Lo;0;L;;;;;N;;;;; +A850;PHAGS-PA LETTER TSA;Lo;0;L;;;;;N;;;;; +A851;PHAGS-PA LETTER TSHA;Lo;0;L;;;;;N;;;;; +A852;PHAGS-PA LETTER DZA;Lo;0;L;;;;;N;;;;; +A853;PHAGS-PA LETTER WA;Lo;0;L;;;;;N;;;;; +A854;PHAGS-PA LETTER ZHA;Lo;0;L;;;;;N;;;;; +A855;PHAGS-PA LETTER ZA;Lo;0;L;;;;;N;;;;; +A856;PHAGS-PA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +A857;PHAGS-PA LETTER YA;Lo;0;L;;;;;N;;;;; +A858;PHAGS-PA LETTER RA;Lo;0;L;;;;;N;;;;; +A859;PHAGS-PA LETTER LA;Lo;0;L;;;;;N;;;;; +A85A;PHAGS-PA LETTER SHA;Lo;0;L;;;;;N;;;;; +A85B;PHAGS-PA LETTER SA;Lo;0;L;;;;;N;;;;; +A85C;PHAGS-PA LETTER HA;Lo;0;L;;;;;N;;;;; +A85D;PHAGS-PA LETTER A;Lo;0;L;;;;;N;;;;; +A85E;PHAGS-PA LETTER I;Lo;0;L;;;;;N;;;;; +A85F;PHAGS-PA LETTER U;Lo;0;L;;;;;N;;;;; +A860;PHAGS-PA LETTER E;Lo;0;L;;;;;N;;;;; +A861;PHAGS-PA LETTER O;Lo;0;L;;;;;N;;;;; +A862;PHAGS-PA LETTER QA;Lo;0;L;;;;;N;;;;; +A863;PHAGS-PA LETTER XA;Lo;0;L;;;;;N;;;;; +A864;PHAGS-PA LETTER FA;Lo;0;L;;;;;N;;;;; +A865;PHAGS-PA LETTER GGA;Lo;0;L;;;;;N;;;;; +A866;PHAGS-PA LETTER EE;Lo;0;L;;;;;N;;;;; +A867;PHAGS-PA SUBJOINED LETTER WA;Lo;0;L;;;;;N;;;;; +A868;PHAGS-PA SUBJOINED LETTER YA;Lo;0;L;;;;;N;;;;; +A869;PHAGS-PA LETTER TTA;Lo;0;L;;;;;N;;;;; +A86A;PHAGS-PA LETTER TTHA;Lo;0;L;;;;;N;;;;; +A86B;PHAGS-PA LETTER DDA;Lo;0;L;;;;;N;;;;; +A86C;PHAGS-PA LETTER NNA;Lo;0;L;;;;;N;;;;; +A86D;PHAGS-PA LETTER ALTERNATE YA;Lo;0;L;;;;;N;;;;; +A86E;PHAGS-PA LETTER VOICELESS SHA;Lo;0;L;;;;;N;;;;; +A86F;PHAGS-PA LETTER VOICED HA;Lo;0;L;;;;;N;;;;; +A870;PHAGS-PA LETTER ASPIRATED FA;Lo;0;L;;;;;N;;;;; +A871;PHAGS-PA SUBJOINED LETTER RA;Lo;0;L;;;;;N;;;;; +A872;PHAGS-PA SUPERFIXED LETTER RA;Lo;0;L;;;;;N;;;;; +A873;PHAGS-PA LETTER CANDRABINDU;Lo;0;L;;;;;N;;;;; +A874;PHAGS-PA SINGLE HEAD MARK;Po;0;ON;;;;;N;;;;; +A875;PHAGS-PA DOUBLE HEAD MARK;Po;0;ON;;;;;N;;;;; +A876;PHAGS-PA MARK SHAD;Po;0;ON;;;;;N;;;;; +A877;PHAGS-PA MARK DOUBLE SHAD;Po;0;ON;;;;;N;;;;; +A880;SAURASHTRA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +A881;SAURASHTRA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +A882;SAURASHTRA LETTER A;Lo;0;L;;;;;N;;;;; +A883;SAURASHTRA LETTER AA;Lo;0;L;;;;;N;;;;; +A884;SAURASHTRA LETTER I;Lo;0;L;;;;;N;;;;; +A885;SAURASHTRA LETTER II;Lo;0;L;;;;;N;;;;; +A886;SAURASHTRA LETTER U;Lo;0;L;;;;;N;;;;; +A887;SAURASHTRA LETTER UU;Lo;0;L;;;;;N;;;;; +A888;SAURASHTRA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +A889;SAURASHTRA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +A88A;SAURASHTRA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +A88B;SAURASHTRA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +A88C;SAURASHTRA LETTER E;Lo;0;L;;;;;N;;;;; +A88D;SAURASHTRA LETTER EE;Lo;0;L;;;;;N;;;;; +A88E;SAURASHTRA LETTER AI;Lo;0;L;;;;;N;;;;; +A88F;SAURASHTRA LETTER O;Lo;0;L;;;;;N;;;;; +A890;SAURASHTRA LETTER OO;Lo;0;L;;;;;N;;;;; +A891;SAURASHTRA LETTER AU;Lo;0;L;;;;;N;;;;; +A892;SAURASHTRA LETTER KA;Lo;0;L;;;;;N;;;;; +A893;SAURASHTRA LETTER KHA;Lo;0;L;;;;;N;;;;; +A894;SAURASHTRA LETTER GA;Lo;0;L;;;;;N;;;;; +A895;SAURASHTRA LETTER GHA;Lo;0;L;;;;;N;;;;; +A896;SAURASHTRA LETTER NGA;Lo;0;L;;;;;N;;;;; +A897;SAURASHTRA LETTER CA;Lo;0;L;;;;;N;;;;; +A898;SAURASHTRA LETTER CHA;Lo;0;L;;;;;N;;;;; +A899;SAURASHTRA LETTER JA;Lo;0;L;;;;;N;;;;; +A89A;SAURASHTRA LETTER JHA;Lo;0;L;;;;;N;;;;; +A89B;SAURASHTRA LETTER NYA;Lo;0;L;;;;;N;;;;; +A89C;SAURASHTRA LETTER TTA;Lo;0;L;;;;;N;;;;; +A89D;SAURASHTRA LETTER TTHA;Lo;0;L;;;;;N;;;;; +A89E;SAURASHTRA LETTER DDA;Lo;0;L;;;;;N;;;;; +A89F;SAURASHTRA LETTER DDHA;Lo;0;L;;;;;N;;;;; +A8A0;SAURASHTRA LETTER NNA;Lo;0;L;;;;;N;;;;; +A8A1;SAURASHTRA LETTER TA;Lo;0;L;;;;;N;;;;; +A8A2;SAURASHTRA LETTER THA;Lo;0;L;;;;;N;;;;; +A8A3;SAURASHTRA LETTER DA;Lo;0;L;;;;;N;;;;; +A8A4;SAURASHTRA LETTER DHA;Lo;0;L;;;;;N;;;;; +A8A5;SAURASHTRA LETTER NA;Lo;0;L;;;;;N;;;;; +A8A6;SAURASHTRA LETTER PA;Lo;0;L;;;;;N;;;;; +A8A7;SAURASHTRA LETTER PHA;Lo;0;L;;;;;N;;;;; +A8A8;SAURASHTRA LETTER BA;Lo;0;L;;;;;N;;;;; +A8A9;SAURASHTRA LETTER BHA;Lo;0;L;;;;;N;;;;; +A8AA;SAURASHTRA LETTER MA;Lo;0;L;;;;;N;;;;; +A8AB;SAURASHTRA LETTER YA;Lo;0;L;;;;;N;;;;; +A8AC;SAURASHTRA LETTER RA;Lo;0;L;;;;;N;;;;; +A8AD;SAURASHTRA LETTER LA;Lo;0;L;;;;;N;;;;; +A8AE;SAURASHTRA LETTER VA;Lo;0;L;;;;;N;;;;; +A8AF;SAURASHTRA LETTER SHA;Lo;0;L;;;;;N;;;;; +A8B0;SAURASHTRA LETTER SSA;Lo;0;L;;;;;N;;;;; +A8B1;SAURASHTRA LETTER SA;Lo;0;L;;;;;N;;;;; +A8B2;SAURASHTRA LETTER HA;Lo;0;L;;;;;N;;;;; +A8B3;SAURASHTRA LETTER LLA;Lo;0;L;;;;;N;;;;; +A8B4;SAURASHTRA CONSONANT SIGN HAARU;Mc;0;L;;;;;N;;;;; +A8B5;SAURASHTRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +A8B6;SAURASHTRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +A8B7;SAURASHTRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +A8B8;SAURASHTRA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +A8B9;SAURASHTRA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +A8BA;SAURASHTRA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +A8BB;SAURASHTRA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +A8BC;SAURASHTRA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;; +A8BD;SAURASHTRA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;; +A8BE;SAURASHTRA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +A8BF;SAURASHTRA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +A8C0;SAURASHTRA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +A8C1;SAURASHTRA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +A8C2;SAURASHTRA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +A8C3;SAURASHTRA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +A8C4;SAURASHTRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +A8CE;SAURASHTRA DANDA;Po;0;L;;;;;N;;;;; +A8CF;SAURASHTRA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +A8D0;SAURASHTRA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A8D1;SAURASHTRA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A8D2;SAURASHTRA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A8D3;SAURASHTRA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A8D4;SAURASHTRA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A8D5;SAURASHTRA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A8D6;SAURASHTRA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A8D7;SAURASHTRA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A8D8;SAURASHTRA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A8D9;SAURASHTRA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A8E0;COMBINING DEVANAGARI DIGIT ZERO;Mn;230;NSM;;;;;N;;;;; +A8E1;COMBINING DEVANAGARI DIGIT ONE;Mn;230;NSM;;;;;N;;;;; +A8E2;COMBINING DEVANAGARI DIGIT TWO;Mn;230;NSM;;;;;N;;;;; +A8E3;COMBINING DEVANAGARI DIGIT THREE;Mn;230;NSM;;;;;N;;;;; +A8E4;COMBINING DEVANAGARI DIGIT FOUR;Mn;230;NSM;;;;;N;;;;; +A8E5;COMBINING DEVANAGARI DIGIT FIVE;Mn;230;NSM;;;;;N;;;;; +A8E6;COMBINING DEVANAGARI DIGIT SIX;Mn;230;NSM;;;;;N;;;;; +A8E7;COMBINING DEVANAGARI DIGIT SEVEN;Mn;230;NSM;;;;;N;;;;; +A8E8;COMBINING DEVANAGARI DIGIT EIGHT;Mn;230;NSM;;;;;N;;;;; +A8E9;COMBINING DEVANAGARI DIGIT NINE;Mn;230;NSM;;;;;N;;;;; +A8EA;COMBINING DEVANAGARI LETTER A;Mn;230;NSM;;;;;N;;;;; +A8EB;COMBINING DEVANAGARI LETTER U;Mn;230;NSM;;;;;N;;;;; +A8EC;COMBINING DEVANAGARI LETTER KA;Mn;230;NSM;;;;;N;;;;; +A8ED;COMBINING DEVANAGARI LETTER NA;Mn;230;NSM;;;;;N;;;;; +A8EE;COMBINING DEVANAGARI LETTER PA;Mn;230;NSM;;;;;N;;;;; +A8EF;COMBINING DEVANAGARI LETTER RA;Mn;230;NSM;;;;;N;;;;; +A8F0;COMBINING DEVANAGARI LETTER VI;Mn;230;NSM;;;;;N;;;;; +A8F1;COMBINING DEVANAGARI SIGN AVAGRAHA;Mn;230;NSM;;;;;N;;;;; +A8F2;DEVANAGARI SIGN SPACING CANDRABINDU;Lo;0;L;;;;;N;;;;; +A8F3;DEVANAGARI SIGN CANDRABINDU VIRAMA;Lo;0;L;;;;;N;;;;; +A8F4;DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA;Lo;0;L;;;;;N;;;;; +A8F5;DEVANAGARI SIGN CANDRABINDU TWO;Lo;0;L;;;;;N;;;;; +A8F6;DEVANAGARI SIGN CANDRABINDU THREE;Lo;0;L;;;;;N;;;;; +A8F7;DEVANAGARI SIGN CANDRABINDU AVAGRAHA;Lo;0;L;;;;;N;;;;; +A8F8;DEVANAGARI SIGN PUSHPIKA;Po;0;L;;;;;N;;;;; +A8F9;DEVANAGARI GAP FILLER;Po;0;L;;;;;N;;;;; +A8FA;DEVANAGARI CARET;Po;0;L;;;;;N;;;;; +A8FB;DEVANAGARI HEADSTROKE;Lo;0;L;;;;;N;;;;; +A900;KAYAH LI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A901;KAYAH LI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A902;KAYAH LI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A903;KAYAH LI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A904;KAYAH LI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A905;KAYAH LI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A906;KAYAH LI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A907;KAYAH LI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A908;KAYAH LI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A909;KAYAH LI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A90A;KAYAH LI LETTER KA;Lo;0;L;;;;;N;;;;; +A90B;KAYAH LI LETTER KHA;Lo;0;L;;;;;N;;;;; +A90C;KAYAH LI LETTER GA;Lo;0;L;;;;;N;;;;; +A90D;KAYAH LI LETTER NGA;Lo;0;L;;;;;N;;;;; +A90E;KAYAH LI LETTER SA;Lo;0;L;;;;;N;;;;; +A90F;KAYAH LI LETTER SHA;Lo;0;L;;;;;N;;;;; +A910;KAYAH LI LETTER ZA;Lo;0;L;;;;;N;;;;; +A911;KAYAH LI LETTER NYA;Lo;0;L;;;;;N;;;;; +A912;KAYAH LI LETTER TA;Lo;0;L;;;;;N;;;;; +A913;KAYAH LI LETTER HTA;Lo;0;L;;;;;N;;;;; +A914;KAYAH LI LETTER NA;Lo;0;L;;;;;N;;;;; +A915;KAYAH LI LETTER PA;Lo;0;L;;;;;N;;;;; +A916;KAYAH LI LETTER PHA;Lo;0;L;;;;;N;;;;; +A917;KAYAH LI LETTER MA;Lo;0;L;;;;;N;;;;; +A918;KAYAH LI LETTER DA;Lo;0;L;;;;;N;;;;; +A919;KAYAH LI LETTER BA;Lo;0;L;;;;;N;;;;; +A91A;KAYAH LI LETTER RA;Lo;0;L;;;;;N;;;;; +A91B;KAYAH LI LETTER YA;Lo;0;L;;;;;N;;;;; +A91C;KAYAH LI LETTER LA;Lo;0;L;;;;;N;;;;; +A91D;KAYAH LI LETTER WA;Lo;0;L;;;;;N;;;;; +A91E;KAYAH LI LETTER THA;Lo;0;L;;;;;N;;;;; +A91F;KAYAH LI LETTER HA;Lo;0;L;;;;;N;;;;; +A920;KAYAH LI LETTER VA;Lo;0;L;;;;;N;;;;; +A921;KAYAH LI LETTER CA;Lo;0;L;;;;;N;;;;; +A922;KAYAH LI LETTER A;Lo;0;L;;;;;N;;;;; +A923;KAYAH LI LETTER OE;Lo;0;L;;;;;N;;;;; +A924;KAYAH LI LETTER I;Lo;0;L;;;;;N;;;;; +A925;KAYAH LI LETTER OO;Lo;0;L;;;;;N;;;;; +A926;KAYAH LI VOWEL UE;Mn;0;NSM;;;;;N;;;;; +A927;KAYAH LI VOWEL E;Mn;0;NSM;;;;;N;;;;; +A928;KAYAH LI VOWEL U;Mn;0;NSM;;;;;N;;;;; +A929;KAYAH LI VOWEL EE;Mn;0;NSM;;;;;N;;;;; +A92A;KAYAH LI VOWEL O;Mn;0;NSM;;;;;N;;;;; +A92B;KAYAH LI TONE PLOPHU;Mn;220;NSM;;;;;N;;;;; +A92C;KAYAH LI TONE CALYA;Mn;220;NSM;;;;;N;;;;; +A92D;KAYAH LI TONE CALYA PLOPHU;Mn;220;NSM;;;;;N;;;;; +A92E;KAYAH LI SIGN CWI;Po;0;L;;;;;N;;;;; +A92F;KAYAH LI SIGN SHYA;Po;0;L;;;;;N;;;;; +A930;REJANG LETTER KA;Lo;0;L;;;;;N;;;;; +A931;REJANG LETTER GA;Lo;0;L;;;;;N;;;;; +A932;REJANG LETTER NGA;Lo;0;L;;;;;N;;;;; +A933;REJANG LETTER TA;Lo;0;L;;;;;N;;;;; +A934;REJANG LETTER DA;Lo;0;L;;;;;N;;;;; +A935;REJANG LETTER NA;Lo;0;L;;;;;N;;;;; +A936;REJANG LETTER PA;Lo;0;L;;;;;N;;;;; +A937;REJANG LETTER BA;Lo;0;L;;;;;N;;;;; +A938;REJANG LETTER MA;Lo;0;L;;;;;N;;;;; +A939;REJANG LETTER CA;Lo;0;L;;;;;N;;;;; +A93A;REJANG LETTER JA;Lo;0;L;;;;;N;;;;; +A93B;REJANG LETTER NYA;Lo;0;L;;;;;N;;;;; +A93C;REJANG LETTER SA;Lo;0;L;;;;;N;;;;; +A93D;REJANG LETTER RA;Lo;0;L;;;;;N;;;;; +A93E;REJANG LETTER LA;Lo;0;L;;;;;N;;;;; +A93F;REJANG LETTER YA;Lo;0;L;;;;;N;;;;; +A940;REJANG LETTER WA;Lo;0;L;;;;;N;;;;; +A941;REJANG LETTER HA;Lo;0;L;;;;;N;;;;; +A942;REJANG LETTER MBA;Lo;0;L;;;;;N;;;;; +A943;REJANG LETTER NGGA;Lo;0;L;;;;;N;;;;; +A944;REJANG LETTER NDA;Lo;0;L;;;;;N;;;;; +A945;REJANG LETTER NYJA;Lo;0;L;;;;;N;;;;; +A946;REJANG LETTER A;Lo;0;L;;;;;N;;;;; +A947;REJANG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +A948;REJANG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +A949;REJANG VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +A94A;REJANG VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +A94B;REJANG VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +A94C;REJANG VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +A94D;REJANG VOWEL SIGN EU;Mn;0;NSM;;;;;N;;;;; +A94E;REJANG VOWEL SIGN EA;Mn;0;NSM;;;;;N;;;;; +A94F;REJANG CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; +A950;REJANG CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +A951;REJANG CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +A952;REJANG CONSONANT SIGN H;Mc;0;L;;;;;N;;;;; +A953;REJANG VIRAMA;Mc;9;L;;;;;N;;;;; +A95F;REJANG SECTION MARK;Po;0;L;;;;;N;;;;; +A960;HANGUL CHOSEONG TIKEUT-MIEUM;Lo;0;L;;;;;N;;;;; +A961;HANGUL CHOSEONG TIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; +A962;HANGUL CHOSEONG TIKEUT-SIOS;Lo;0;L;;;;;N;;;;; +A963;HANGUL CHOSEONG TIKEUT-CIEUC;Lo;0;L;;;;;N;;;;; +A964;HANGUL CHOSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;;;; +A965;HANGUL CHOSEONG RIEUL-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +A966;HANGUL CHOSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; +A967;HANGUL CHOSEONG RIEUL-SSANGTIKEUT;Lo;0;L;;;;;N;;;;; +A968;HANGUL CHOSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;;;; +A969;HANGUL CHOSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;;;; +A96A;HANGUL CHOSEONG RIEUL-SSANGPIEUP;Lo;0;L;;;;;N;;;;; +A96B;HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +A96C;HANGUL CHOSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;;;; +A96D;HANGUL CHOSEONG RIEUL-CIEUC;Lo;0;L;;;;;N;;;;; +A96E;HANGUL CHOSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +A96F;HANGUL CHOSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +A970;HANGUL CHOSEONG MIEUM-TIKEUT;Lo;0;L;;;;;N;;;;; +A971;HANGUL CHOSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +A972;HANGUL CHOSEONG PIEUP-SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +A973;HANGUL CHOSEONG PIEUP-KHIEUKH;Lo;0;L;;;;;N;;;;; +A974;HANGUL CHOSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +A975;HANGUL CHOSEONG SSANGSIOS-PIEUP;Lo;0;L;;;;;N;;;;; +A976;HANGUL CHOSEONG IEUNG-RIEUL;Lo;0;L;;;;;N;;;;; +A977;HANGUL CHOSEONG IEUNG-HIEUH;Lo;0;L;;;;;N;;;;; +A978;HANGUL CHOSEONG SSANGCIEUC-HIEUH;Lo;0;L;;;;;N;;;;; +A979;HANGUL CHOSEONG SSANGTHIEUTH;Lo;0;L;;;;;N;;;;; +A97A;HANGUL CHOSEONG PHIEUPH-HIEUH;Lo;0;L;;;;;N;;;;; +A97B;HANGUL CHOSEONG HIEUH-SIOS;Lo;0;L;;;;;N;;;;; +A97C;HANGUL CHOSEONG SSANGYEORINHIEUH;Lo;0;L;;;;;N;;;;; +A980;JAVANESE SIGN PANYANGGA;Mn;0;NSM;;;;;N;;;;; +A981;JAVANESE SIGN CECAK;Mn;0;NSM;;;;;N;;;;; +A982;JAVANESE SIGN LAYAR;Mn;0;NSM;;;;;N;;;;; +A983;JAVANESE SIGN WIGNYAN;Mc;0;L;;;;;N;;;;; +A984;JAVANESE LETTER A;Lo;0;L;;;;;N;;;;; +A985;JAVANESE LETTER I KAWI;Lo;0;L;;;;;N;;;;; +A986;JAVANESE LETTER I;Lo;0;L;;;;;N;;;;; +A987;JAVANESE LETTER II;Lo;0;L;;;;;N;;;;; +A988;JAVANESE LETTER U;Lo;0;L;;;;;N;;;;; +A989;JAVANESE LETTER PA CEREK;Lo;0;L;;;;;N;;;;; +A98A;JAVANESE LETTER NGA LELET;Lo;0;L;;;;;N;;;;; +A98B;JAVANESE LETTER NGA LELET RASWADI;Lo;0;L;;;;;N;;;;; +A98C;JAVANESE LETTER E;Lo;0;L;;;;;N;;;;; +A98D;JAVANESE LETTER AI;Lo;0;L;;;;;N;;;;; +A98E;JAVANESE LETTER O;Lo;0;L;;;;;N;;;;; +A98F;JAVANESE LETTER KA;Lo;0;L;;;;;N;;;;; +A990;JAVANESE LETTER KA SASAK;Lo;0;L;;;;;N;;;;; +A991;JAVANESE LETTER KA MURDA;Lo;0;L;;;;;N;;;;; +A992;JAVANESE LETTER GA;Lo;0;L;;;;;N;;;;; +A993;JAVANESE LETTER GA MURDA;Lo;0;L;;;;;N;;;;; +A994;JAVANESE LETTER NGA;Lo;0;L;;;;;N;;;;; +A995;JAVANESE LETTER CA;Lo;0;L;;;;;N;;;;; +A996;JAVANESE LETTER CA MURDA;Lo;0;L;;;;;N;;;;; +A997;JAVANESE LETTER JA;Lo;0;L;;;;;N;;;;; +A998;JAVANESE LETTER NYA MURDA;Lo;0;L;;;;;N;;;;; +A999;JAVANESE LETTER JA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A99A;JAVANESE LETTER NYA;Lo;0;L;;;;;N;;;;; +A99B;JAVANESE LETTER TTA;Lo;0;L;;;;;N;;;;; +A99C;JAVANESE LETTER TTA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A99D;JAVANESE LETTER DDA;Lo;0;L;;;;;N;;;;; +A99E;JAVANESE LETTER DDA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A99F;JAVANESE LETTER NA MURDA;Lo;0;L;;;;;N;;;;; +A9A0;JAVANESE LETTER TA;Lo;0;L;;;;;N;;;;; +A9A1;JAVANESE LETTER TA MURDA;Lo;0;L;;;;;N;;;;; +A9A2;JAVANESE LETTER DA;Lo;0;L;;;;;N;;;;; +A9A3;JAVANESE LETTER DA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A9A4;JAVANESE LETTER NA;Lo;0;L;;;;;N;;;;; +A9A5;JAVANESE LETTER PA;Lo;0;L;;;;;N;;;;; +A9A6;JAVANESE LETTER PA MURDA;Lo;0;L;;;;;N;;;;; +A9A7;JAVANESE LETTER BA;Lo;0;L;;;;;N;;;;; +A9A8;JAVANESE LETTER BA MURDA;Lo;0;L;;;;;N;;;;; +A9A9;JAVANESE LETTER MA;Lo;0;L;;;;;N;;;;; +A9AA;JAVANESE LETTER YA;Lo;0;L;;;;;N;;;;; +A9AB;JAVANESE LETTER RA;Lo;0;L;;;;;N;;;;; +A9AC;JAVANESE LETTER RA AGUNG;Lo;0;L;;;;;N;;;;; +A9AD;JAVANESE LETTER LA;Lo;0;L;;;;;N;;;;; +A9AE;JAVANESE LETTER WA;Lo;0;L;;;;;N;;;;; +A9AF;JAVANESE LETTER SA MURDA;Lo;0;L;;;;;N;;;;; +A9B0;JAVANESE LETTER SA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A9B1;JAVANESE LETTER SA;Lo;0;L;;;;;N;;;;; +A9B2;JAVANESE LETTER HA;Lo;0;L;;;;;N;;;;; +A9B3;JAVANESE SIGN CECAK TELU;Mn;7;NSM;;;;;N;;;;; +A9B4;JAVANESE VOWEL SIGN TARUNG;Mc;0;L;;;;;N;;;;; +A9B5;JAVANESE VOWEL SIGN TOLONG;Mc;0;L;;;;;N;;;;; +A9B6;JAVANESE VOWEL SIGN WULU;Mn;0;NSM;;;;;N;;;;; +A9B7;JAVANESE VOWEL SIGN WULU MELIK;Mn;0;NSM;;;;;N;;;;; +A9B8;JAVANESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;; +A9B9;JAVANESE VOWEL SIGN SUKU MENDUT;Mn;0;NSM;;;;;N;;;;; +A9BA;JAVANESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;; +A9BB;JAVANESE VOWEL SIGN DIRGA MURE;Mc;0;L;;;;;N;;;;; +A9BC;JAVANESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;; +A9BD;JAVANESE CONSONANT SIGN KERET;Mc;0;L;;;;;N;;;;; +A9BE;JAVANESE CONSONANT SIGN PENGKAL;Mc;0;L;;;;;N;;;;; +A9BF;JAVANESE CONSONANT SIGN CAKRA;Mc;0;L;;;;;N;;;;; +A9C0;JAVANESE PANGKON;Mc;9;L;;;;;N;;;;; +A9C1;JAVANESE LEFT RERENGGAN;Po;0;L;;;;;N;;;;; +A9C2;JAVANESE RIGHT RERENGGAN;Po;0;L;;;;;N;;;;; +A9C3;JAVANESE PADA ANDAP;Po;0;L;;;;;N;;;;; +A9C4;JAVANESE PADA MADYA;Po;0;L;;;;;N;;;;; +A9C5;JAVANESE PADA LUHUR;Po;0;L;;;;;N;;;;; +A9C6;JAVANESE PADA WINDU;Po;0;L;;;;;N;;;;; +A9C7;JAVANESE PADA PANGKAT;Po;0;L;;;;;N;;;;; +A9C8;JAVANESE PADA LINGSA;Po;0;L;;;;;N;;;;; +A9C9;JAVANESE PADA LUNGSI;Po;0;L;;;;;N;;;;; +A9CA;JAVANESE PADA ADEG;Po;0;L;;;;;N;;;;; +A9CB;JAVANESE PADA ADEG ADEG;Po;0;L;;;;;N;;;;; +A9CC;JAVANESE PADA PISELEH;Po;0;L;;;;;N;;;;; +A9CD;JAVANESE TURNED PADA PISELEH;Po;0;L;;;;;N;;;;; +A9CF;JAVANESE PANGRANGKEP;Lm;0;L;;;;;N;;;;; +A9D0;JAVANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A9D1;JAVANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A9D2;JAVANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A9D3;JAVANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A9D4;JAVANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A9D5;JAVANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A9D6;JAVANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A9D7;JAVANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A9D8;JAVANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A9D9;JAVANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A9DE;JAVANESE PADA TIRTA TUMETES;Po;0;L;;;;;N;;;;; +A9DF;JAVANESE PADA ISEN-ISEN;Po;0;L;;;;;N;;;;; +AA00;CHAM LETTER A;Lo;0;L;;;;;N;;;;; +AA01;CHAM LETTER I;Lo;0;L;;;;;N;;;;; +AA02;CHAM LETTER U;Lo;0;L;;;;;N;;;;; +AA03;CHAM LETTER E;Lo;0;L;;;;;N;;;;; +AA04;CHAM LETTER AI;Lo;0;L;;;;;N;;;;; +AA05;CHAM LETTER O;Lo;0;L;;;;;N;;;;; +AA06;CHAM LETTER KA;Lo;0;L;;;;;N;;;;; +AA07;CHAM LETTER KHA;Lo;0;L;;;;;N;;;;; +AA08;CHAM LETTER GA;Lo;0;L;;;;;N;;;;; +AA09;CHAM LETTER GHA;Lo;0;L;;;;;N;;;;; +AA0A;CHAM LETTER NGUE;Lo;0;L;;;;;N;;;;; +AA0B;CHAM LETTER NGA;Lo;0;L;;;;;N;;;;; +AA0C;CHAM LETTER CHA;Lo;0;L;;;;;N;;;;; +AA0D;CHAM LETTER CHHA;Lo;0;L;;;;;N;;;;; +AA0E;CHAM LETTER JA;Lo;0;L;;;;;N;;;;; +AA0F;CHAM LETTER JHA;Lo;0;L;;;;;N;;;;; +AA10;CHAM LETTER NHUE;Lo;0;L;;;;;N;;;;; +AA11;CHAM LETTER NHA;Lo;0;L;;;;;N;;;;; +AA12;CHAM LETTER NHJA;Lo;0;L;;;;;N;;;;; +AA13;CHAM LETTER TA;Lo;0;L;;;;;N;;;;; +AA14;CHAM LETTER THA;Lo;0;L;;;;;N;;;;; +AA15;CHAM LETTER DA;Lo;0;L;;;;;N;;;;; +AA16;CHAM LETTER DHA;Lo;0;L;;;;;N;;;;; +AA17;CHAM LETTER NUE;Lo;0;L;;;;;N;;;;; +AA18;CHAM LETTER NA;Lo;0;L;;;;;N;;;;; +AA19;CHAM LETTER DDA;Lo;0;L;;;;;N;;;;; +AA1A;CHAM LETTER PA;Lo;0;L;;;;;N;;;;; +AA1B;CHAM LETTER PPA;Lo;0;L;;;;;N;;;;; +AA1C;CHAM LETTER PHA;Lo;0;L;;;;;N;;;;; +AA1D;CHAM LETTER BA;Lo;0;L;;;;;N;;;;; +AA1E;CHAM LETTER BHA;Lo;0;L;;;;;N;;;;; +AA1F;CHAM LETTER MUE;Lo;0;L;;;;;N;;;;; +AA20;CHAM LETTER MA;Lo;0;L;;;;;N;;;;; +AA21;CHAM LETTER BBA;Lo;0;L;;;;;N;;;;; +AA22;CHAM LETTER YA;Lo;0;L;;;;;N;;;;; +AA23;CHAM LETTER RA;Lo;0;L;;;;;N;;;;; +AA24;CHAM LETTER LA;Lo;0;L;;;;;N;;;;; +AA25;CHAM LETTER VA;Lo;0;L;;;;;N;;;;; +AA26;CHAM LETTER SSA;Lo;0;L;;;;;N;;;;; +AA27;CHAM LETTER SA;Lo;0;L;;;;;N;;;;; +AA28;CHAM LETTER HA;Lo;0;L;;;;;N;;;;; +AA29;CHAM VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +AA2A;CHAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +AA2B;CHAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +AA2C;CHAM VOWEL SIGN EI;Mn;0;NSM;;;;;N;;;;; +AA2D;CHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +AA2E;CHAM VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +AA2F;CHAM VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +AA30;CHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +AA31;CHAM VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +AA32;CHAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +AA33;CHAM CONSONANT SIGN YA;Mc;0;L;;;;;N;;;;; +AA34;CHAM CONSONANT SIGN RA;Mc;0;L;;;;;N;;;;; +AA35;CHAM CONSONANT SIGN LA;Mn;0;NSM;;;;;N;;;;; +AA36;CHAM CONSONANT SIGN WA;Mn;0;NSM;;;;;N;;;;; +AA40;CHAM LETTER FINAL K;Lo;0;L;;;;;N;;;;; +AA41;CHAM LETTER FINAL G;Lo;0;L;;;;;N;;;;; +AA42;CHAM LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +AA43;CHAM CONSONANT SIGN FINAL NG;Mn;0;NSM;;;;;N;;;;; +AA44;CHAM LETTER FINAL CH;Lo;0;L;;;;;N;;;;; +AA45;CHAM LETTER FINAL T;Lo;0;L;;;;;N;;;;; +AA46;CHAM LETTER FINAL N;Lo;0;L;;;;;N;;;;; +AA47;CHAM LETTER FINAL P;Lo;0;L;;;;;N;;;;; +AA48;CHAM LETTER FINAL Y;Lo;0;L;;;;;N;;;;; +AA49;CHAM LETTER FINAL R;Lo;0;L;;;;;N;;;;; +AA4A;CHAM LETTER FINAL L;Lo;0;L;;;;;N;;;;; +AA4B;CHAM LETTER FINAL SS;Lo;0;L;;;;;N;;;;; +AA4C;CHAM CONSONANT SIGN FINAL M;Mn;0;NSM;;;;;N;;;;; +AA4D;CHAM CONSONANT SIGN FINAL H;Mc;0;L;;;;;N;;;;; +AA50;CHAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +AA51;CHAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +AA52;CHAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +AA53;CHAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +AA54;CHAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +AA55;CHAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +AA56;CHAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +AA57;CHAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +AA58;CHAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +AA59;CHAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +AA5C;CHAM PUNCTUATION SPIRAL;Po;0;L;;;;;N;;;;; +AA5D;CHAM PUNCTUATION DANDA;Po;0;L;;;;;N;;;;; +AA5E;CHAM PUNCTUATION DOUBLE DANDA;Po;0;L;;;;;N;;;;; +AA5F;CHAM PUNCTUATION TRIPLE DANDA;Po;0;L;;;;;N;;;;; +AA60;MYANMAR LETTER KHAMTI GA;Lo;0;L;;;;;N;;;;; +AA61;MYANMAR LETTER KHAMTI CA;Lo;0;L;;;;;N;;;;; +AA62;MYANMAR LETTER KHAMTI CHA;Lo;0;L;;;;;N;;;;; +AA63;MYANMAR LETTER KHAMTI JA;Lo;0;L;;;;;N;;;;; +AA64;MYANMAR LETTER KHAMTI JHA;Lo;0;L;;;;;N;;;;; +AA65;MYANMAR LETTER KHAMTI NYA;Lo;0;L;;;;;N;;;;; +AA66;MYANMAR LETTER KHAMTI TTA;Lo;0;L;;;;;N;;;;; +AA67;MYANMAR LETTER KHAMTI TTHA;Lo;0;L;;;;;N;;;;; +AA68;MYANMAR LETTER KHAMTI DDA;Lo;0;L;;;;;N;;;;; +AA69;MYANMAR LETTER KHAMTI DDHA;Lo;0;L;;;;;N;;;;; +AA6A;MYANMAR LETTER KHAMTI DHA;Lo;0;L;;;;;N;;;;; +AA6B;MYANMAR LETTER KHAMTI NA;Lo;0;L;;;;;N;;;;; +AA6C;MYANMAR LETTER KHAMTI SA;Lo;0;L;;;;;N;;;;; +AA6D;MYANMAR LETTER KHAMTI HA;Lo;0;L;;;;;N;;;;; +AA6E;MYANMAR LETTER KHAMTI HHA;Lo;0;L;;;;;N;;;;; +AA6F;MYANMAR LETTER KHAMTI FA;Lo;0;L;;;;;N;;;;; +AA70;MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION;Lm;0;L;;;;;N;;;;; +AA71;MYANMAR LETTER KHAMTI XA;Lo;0;L;;;;;N;;;;; +AA72;MYANMAR LETTER KHAMTI ZA;Lo;0;L;;;;;N;;;;; +AA73;MYANMAR LETTER KHAMTI RA;Lo;0;L;;;;;N;;;;; +AA74;MYANMAR LOGOGRAM KHAMTI OAY;Lo;0;L;;;;;N;;;;; +AA75;MYANMAR LOGOGRAM KHAMTI QN;Lo;0;L;;;;;N;;;;; +AA76;MYANMAR LOGOGRAM KHAMTI HM;Lo;0;L;;;;;N;;;;; +AA77;MYANMAR SYMBOL AITON EXCLAMATION;So;0;L;;;;;N;;;;; +AA78;MYANMAR SYMBOL AITON ONE;So;0;L;;;;;N;;;;; +AA79;MYANMAR SYMBOL AITON TWO;So;0;L;;;;;N;;;;; +AA7A;MYANMAR LETTER AITON RA;Lo;0;L;;;;;N;;;;; +AA7B;MYANMAR SIGN PAO KAREN TONE;Mc;0;L;;;;;N;;;;; +AA80;TAI VIET LETTER LOW KO;Lo;0;L;;;;;N;;;;; +AA81;TAI VIET LETTER HIGH KO;Lo;0;L;;;;;N;;;;; +AA82;TAI VIET LETTER LOW KHO;Lo;0;L;;;;;N;;;;; +AA83;TAI VIET LETTER HIGH KHO;Lo;0;L;;;;;N;;;;; +AA84;TAI VIET LETTER LOW KHHO;Lo;0;L;;;;;N;;;;; +AA85;TAI VIET LETTER HIGH KHHO;Lo;0;L;;;;;N;;;;; +AA86;TAI VIET LETTER LOW GO;Lo;0;L;;;;;N;;;;; +AA87;TAI VIET LETTER HIGH GO;Lo;0;L;;;;;N;;;;; +AA88;TAI VIET LETTER LOW NGO;Lo;0;L;;;;;N;;;;; +AA89;TAI VIET LETTER HIGH NGO;Lo;0;L;;;;;N;;;;; +AA8A;TAI VIET LETTER LOW CO;Lo;0;L;;;;;N;;;;; +AA8B;TAI VIET LETTER HIGH CO;Lo;0;L;;;;;N;;;;; +AA8C;TAI VIET LETTER LOW CHO;Lo;0;L;;;;;N;;;;; +AA8D;TAI VIET LETTER HIGH CHO;Lo;0;L;;;;;N;;;;; +AA8E;TAI VIET LETTER LOW SO;Lo;0;L;;;;;N;;;;; +AA8F;TAI VIET LETTER HIGH SO;Lo;0;L;;;;;N;;;;; +AA90;TAI VIET LETTER LOW NYO;Lo;0;L;;;;;N;;;;; +AA91;TAI VIET LETTER HIGH NYO;Lo;0;L;;;;;N;;;;; +AA92;TAI VIET LETTER LOW DO;Lo;0;L;;;;;N;;;;; +AA93;TAI VIET LETTER HIGH DO;Lo;0;L;;;;;N;;;;; +AA94;TAI VIET LETTER LOW TO;Lo;0;L;;;;;N;;;;; +AA95;TAI VIET LETTER HIGH TO;Lo;0;L;;;;;N;;;;; +AA96;TAI VIET LETTER LOW THO;Lo;0;L;;;;;N;;;;; +AA97;TAI VIET LETTER HIGH THO;Lo;0;L;;;;;N;;;;; +AA98;TAI VIET LETTER LOW NO;Lo;0;L;;;;;N;;;;; +AA99;TAI VIET LETTER HIGH NO;Lo;0;L;;;;;N;;;;; +AA9A;TAI VIET LETTER LOW BO;Lo;0;L;;;;;N;;;;; +AA9B;TAI VIET LETTER HIGH BO;Lo;0;L;;;;;N;;;;; +AA9C;TAI VIET LETTER LOW PO;Lo;0;L;;;;;N;;;;; +AA9D;TAI VIET LETTER HIGH PO;Lo;0;L;;;;;N;;;;; +AA9E;TAI VIET LETTER LOW PHO;Lo;0;L;;;;;N;;;;; +AA9F;TAI VIET LETTER HIGH PHO;Lo;0;L;;;;;N;;;;; +AAA0;TAI VIET LETTER LOW FO;Lo;0;L;;;;;N;;;;; +AAA1;TAI VIET LETTER HIGH FO;Lo;0;L;;;;;N;;;;; +AAA2;TAI VIET LETTER LOW MO;Lo;0;L;;;;;N;;;;; +AAA3;TAI VIET LETTER HIGH MO;Lo;0;L;;;;;N;;;;; +AAA4;TAI VIET LETTER LOW YO;Lo;0;L;;;;;N;;;;; +AAA5;TAI VIET LETTER HIGH YO;Lo;0;L;;;;;N;;;;; +AAA6;TAI VIET LETTER LOW RO;Lo;0;L;;;;;N;;;;; +AAA7;TAI VIET LETTER HIGH RO;Lo;0;L;;;;;N;;;;; +AAA8;TAI VIET LETTER LOW LO;Lo;0;L;;;;;N;;;;; +AAA9;TAI VIET LETTER HIGH LO;Lo;0;L;;;;;N;;;;; +AAAA;TAI VIET LETTER LOW VO;Lo;0;L;;;;;N;;;;; +AAAB;TAI VIET LETTER HIGH VO;Lo;0;L;;;;;N;;;;; +AAAC;TAI VIET LETTER LOW HO;Lo;0;L;;;;;N;;;;; +AAAD;TAI VIET LETTER HIGH HO;Lo;0;L;;;;;N;;;;; +AAAE;TAI VIET LETTER LOW O;Lo;0;L;;;;;N;;;;; +AAAF;TAI VIET LETTER HIGH O;Lo;0;L;;;;;N;;;;; +AAB0;TAI VIET MAI KANG;Mn;230;NSM;;;;;N;;;;; +AAB1;TAI VIET VOWEL AA;Lo;0;L;;;;;N;;;;; +AAB2;TAI VIET VOWEL I;Mn;230;NSM;;;;;N;;;;; +AAB3;TAI VIET VOWEL UE;Mn;230;NSM;;;;;N;;;;; +AAB4;TAI VIET VOWEL U;Mn;220;NSM;;;;;N;;;;; +AAB5;TAI VIET VOWEL E;Lo;0;L;;;;;N;;;;; +AAB6;TAI VIET VOWEL O;Lo;0;L;;;;;N;;;;; +AAB7;TAI VIET MAI KHIT;Mn;230;NSM;;;;;N;;;;; +AAB8;TAI VIET VOWEL IA;Mn;230;NSM;;;;;N;;;;; +AAB9;TAI VIET VOWEL UEA;Lo;0;L;;;;;N;;;;; +AABA;TAI VIET VOWEL UA;Lo;0;L;;;;;N;;;;; +AABB;TAI VIET VOWEL AUE;Lo;0;L;;;;;N;;;;; +AABC;TAI VIET VOWEL AY;Lo;0;L;;;;;N;;;;; +AABD;TAI VIET VOWEL AN;Lo;0;L;;;;;N;;;;; +AABE;TAI VIET VOWEL AM;Mn;230;NSM;;;;;N;;;;; +AABF;TAI VIET TONE MAI EK;Mn;230;NSM;;;;;N;;;;; +AAC0;TAI VIET TONE MAI NUENG;Lo;0;L;;;;;N;;;;; +AAC1;TAI VIET TONE MAI THO;Mn;230;NSM;;;;;N;;;;; +AAC2;TAI VIET TONE MAI SONG;Lo;0;L;;;;;N;;;;; +AADB;TAI VIET SYMBOL KON;Lo;0;L;;;;;N;;;;; +AADC;TAI VIET SYMBOL NUENG;Lo;0;L;;;;;N;;;;; +AADD;TAI VIET SYMBOL SAM;Lm;0;L;;;;;N;;;;; +AADE;TAI VIET SYMBOL HO HOI;Po;0;L;;;;;N;;;;; +AADF;TAI VIET SYMBOL KOI KOI;Po;0;L;;;;;N;;;;; +ABC0;MEETEI MAYEK LETTER KOK;Lo;0;L;;;;;N;;;;; +ABC1;MEETEI MAYEK LETTER SAM;Lo;0;L;;;;;N;;;;; +ABC2;MEETEI MAYEK LETTER LAI;Lo;0;L;;;;;N;;;;; +ABC3;MEETEI MAYEK LETTER MIT;Lo;0;L;;;;;N;;;;; +ABC4;MEETEI MAYEK LETTER PA;Lo;0;L;;;;;N;;;;; +ABC5;MEETEI MAYEK LETTER NA;Lo;0;L;;;;;N;;;;; +ABC6;MEETEI MAYEK LETTER CHIL;Lo;0;L;;;;;N;;;;; +ABC7;MEETEI MAYEK LETTER TIL;Lo;0;L;;;;;N;;;;; +ABC8;MEETEI MAYEK LETTER KHOU;Lo;0;L;;;;;N;;;;; +ABC9;MEETEI MAYEK LETTER NGOU;Lo;0;L;;;;;N;;;;; +ABCA;MEETEI MAYEK LETTER THOU;Lo;0;L;;;;;N;;;;; +ABCB;MEETEI MAYEK LETTER WAI;Lo;0;L;;;;;N;;;;; +ABCC;MEETEI MAYEK LETTER YANG;Lo;0;L;;;;;N;;;;; +ABCD;MEETEI MAYEK LETTER HUK;Lo;0;L;;;;;N;;;;; +ABCE;MEETEI MAYEK LETTER UN;Lo;0;L;;;;;N;;;;; +ABCF;MEETEI MAYEK LETTER I;Lo;0;L;;;;;N;;;;; +ABD0;MEETEI MAYEK LETTER PHAM;Lo;0;L;;;;;N;;;;; +ABD1;MEETEI MAYEK LETTER ATIYA;Lo;0;L;;;;;N;;;;; +ABD2;MEETEI MAYEK LETTER GOK;Lo;0;L;;;;;N;;;;; +ABD3;MEETEI MAYEK LETTER JHAM;Lo;0;L;;;;;N;;;;; +ABD4;MEETEI MAYEK LETTER RAI;Lo;0;L;;;;;N;;;;; +ABD5;MEETEI MAYEK LETTER BA;Lo;0;L;;;;;N;;;;; +ABD6;MEETEI MAYEK LETTER JIL;Lo;0;L;;;;;N;;;;; +ABD7;MEETEI MAYEK LETTER DIL;Lo;0;L;;;;;N;;;;; +ABD8;MEETEI MAYEK LETTER GHOU;Lo;0;L;;;;;N;;;;; +ABD9;MEETEI MAYEK LETTER DHOU;Lo;0;L;;;;;N;;;;; +ABDA;MEETEI MAYEK LETTER BHAM;Lo;0;L;;;;;N;;;;; +ABDB;MEETEI MAYEK LETTER KOK LONSUM;Lo;0;L;;;;;N;;;;; +ABDC;MEETEI MAYEK LETTER LAI LONSUM;Lo;0;L;;;;;N;;;;; +ABDD;MEETEI MAYEK LETTER MIT LONSUM;Lo;0;L;;;;;N;;;;; +ABDE;MEETEI MAYEK LETTER PA LONSUM;Lo;0;L;;;;;N;;;;; +ABDF;MEETEI MAYEK LETTER NA LONSUM;Lo;0;L;;;;;N;;;;; +ABE0;MEETEI MAYEK LETTER TIL LONSUM;Lo;0;L;;;;;N;;;;; +ABE1;MEETEI MAYEK LETTER NGOU LONSUM;Lo;0;L;;;;;N;;;;; +ABE2;MEETEI MAYEK LETTER I LONSUM;Lo;0;L;;;;;N;;;;; +ABE3;MEETEI MAYEK VOWEL SIGN ONAP;Mc;0;L;;;;;N;;;;; +ABE4;MEETEI MAYEK VOWEL SIGN INAP;Mc;0;L;;;;;N;;;;; +ABE5;MEETEI MAYEK VOWEL SIGN ANAP;Mn;0;NSM;;;;;N;;;;; +ABE6;MEETEI MAYEK VOWEL SIGN YENAP;Mc;0;L;;;;;N;;;;; +ABE7;MEETEI MAYEK VOWEL SIGN SOUNAP;Mc;0;L;;;;;N;;;;; +ABE8;MEETEI MAYEK VOWEL SIGN UNAP;Mn;0;NSM;;;;;N;;;;; +ABE9;MEETEI MAYEK VOWEL SIGN CHEINAP;Mc;0;L;;;;;N;;;;; +ABEA;MEETEI MAYEK VOWEL SIGN NUNG;Mc;0;L;;;;;N;;;;; +ABEB;MEETEI MAYEK CHEIKHEI;Po;0;L;;;;;N;;;;; +ABEC;MEETEI MAYEK LUM IYEK;Mc;0;L;;;;;N;;;;; +ABED;MEETEI MAYEK APUN IYEK;Mn;9;NSM;;;;;N;;;;; +ABF0;MEETEI MAYEK DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +ABF1;MEETEI MAYEK DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +ABF2;MEETEI MAYEK DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +ABF3;MEETEI MAYEK DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +ABF4;MEETEI MAYEK DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +ABF5;MEETEI MAYEK DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +ABF6;MEETEI MAYEK DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +ABF7;MEETEI MAYEK DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +ABF8;MEETEI MAYEK DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +ABF9;MEETEI MAYEK DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +AC00;<Hangul Syllable, First>;Lo;0;L;;;;;N;;;;; +D7A3;<Hangul Syllable, Last>;Lo;0;L;;;;;N;;;;; +D7B0;HANGUL JUNGSEONG O-YEO;Lo;0;L;;;;;N;;;;; +D7B1;HANGUL JUNGSEONG O-O-I;Lo;0;L;;;;;N;;;;; +D7B2;HANGUL JUNGSEONG YO-A;Lo;0;L;;;;;N;;;;; +D7B3;HANGUL JUNGSEONG YO-AE;Lo;0;L;;;;;N;;;;; +D7B4;HANGUL JUNGSEONG YO-EO;Lo;0;L;;;;;N;;;;; +D7B5;HANGUL JUNGSEONG U-YEO;Lo;0;L;;;;;N;;;;; +D7B6;HANGUL JUNGSEONG U-I-I;Lo;0;L;;;;;N;;;;; +D7B7;HANGUL JUNGSEONG YU-AE;Lo;0;L;;;;;N;;;;; +D7B8;HANGUL JUNGSEONG YU-O;Lo;0;L;;;;;N;;;;; +D7B9;HANGUL JUNGSEONG EU-A;Lo;0;L;;;;;N;;;;; +D7BA;HANGUL JUNGSEONG EU-EO;Lo;0;L;;;;;N;;;;; +D7BB;HANGUL JUNGSEONG EU-E;Lo;0;L;;;;;N;;;;; +D7BC;HANGUL JUNGSEONG EU-O;Lo;0;L;;;;;N;;;;; +D7BD;HANGUL JUNGSEONG I-YA-O;Lo;0;L;;;;;N;;;;; +D7BE;HANGUL JUNGSEONG I-YAE;Lo;0;L;;;;;N;;;;; +D7BF;HANGUL JUNGSEONG I-YEO;Lo;0;L;;;;;N;;;;; +D7C0;HANGUL JUNGSEONG I-YE;Lo;0;L;;;;;N;;;;; +D7C1;HANGUL JUNGSEONG I-O-I;Lo;0;L;;;;;N;;;;; +D7C2;HANGUL JUNGSEONG I-YO;Lo;0;L;;;;;N;;;;; +D7C3;HANGUL JUNGSEONG I-YU;Lo;0;L;;;;;N;;;;; +D7C4;HANGUL JUNGSEONG I-I;Lo;0;L;;;;;N;;;;; +D7C5;HANGUL JUNGSEONG ARAEA-A;Lo;0;L;;;;;N;;;;; +D7C6;HANGUL JUNGSEONG ARAEA-E;Lo;0;L;;;;;N;;;;; +D7CB;HANGUL JONGSEONG NIEUN-RIEUL;Lo;0;L;;;;;N;;;;; +D7CC;HANGUL JONGSEONG NIEUN-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7CD;HANGUL JONGSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;;;; +D7CE;HANGUL JONGSEONG SSANGTIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; +D7CF;HANGUL JONGSEONG TIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; +D7D0;HANGUL JONGSEONG TIKEUT-SIOS;Lo;0;L;;;;;N;;;;; +D7D1;HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +D7D2;HANGUL JONGSEONG TIKEUT-CIEUC;Lo;0;L;;;;;N;;;;; +D7D3;HANGUL JONGSEONG TIKEUT-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7D4;HANGUL JONGSEONG TIKEUT-THIEUTH;Lo;0;L;;;;;N;;;;; +D7D5;HANGUL JONGSEONG RIEUL-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +D7D6;HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH;Lo;0;L;;;;;N;;;;; +D7D7;HANGUL JONGSEONG SSANGRIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +D7D8;HANGUL JONGSEONG RIEUL-MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; +D7D9;HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +D7DA;HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +D7DB;HANGUL JONGSEONG RIEUL-YESIEUNG;Lo;0;L;;;;;N;;;;; +D7DC;HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH;Lo;0;L;;;;;N;;;;; +D7DD;HANGUL JONGSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; +D7DE;HANGUL JONGSEONG MIEUM-NIEUN;Lo;0;L;;;;;N;;;;; +D7DF;HANGUL JONGSEONG MIEUM-SSANGNIEUN;Lo;0;L;;;;;N;;;;; +D7E0;HANGUL JONGSEONG SSANGMIEUM;Lo;0;L;;;;;N;;;;; +D7E1;HANGUL JONGSEONG MIEUM-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +D7E2;HANGUL JONGSEONG MIEUM-CIEUC;Lo;0;L;;;;;N;;;;; +D7E3;HANGUL JONGSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +D7E4;HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH;Lo;0;L;;;;;N;;;;; +D7E5;HANGUL JONGSEONG PIEUP-MIEUM;Lo;0;L;;;;;N;;;;; +D7E6;HANGUL JONGSEONG SSANGPIEUP;Lo;0;L;;;;;N;;;;; +D7E7;HANGUL JONGSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +D7E8;HANGUL JONGSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; +D7E9;HANGUL JONGSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7EA;HANGUL JONGSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; +D7EB;HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +D7EC;HANGUL JONGSEONG SSANGSIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +D7ED;HANGUL JONGSEONG SSANGSIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +D7EE;HANGUL JONGSEONG SIOS-PANSIOS;Lo;0;L;;;;;N;;;;; +D7EF;HANGUL JONGSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +D7F0;HANGUL JONGSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7F1;HANGUL JONGSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +D7F2;HANGUL JONGSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; +D7F3;HANGUL JONGSEONG PANSIOS-PIEUP;Lo;0;L;;;;;N;;;;; +D7F4;HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +D7F5;HANGUL JONGSEONG YESIEUNG-MIEUM;Lo;0;L;;;;;N;;;;; +D7F6;HANGUL JONGSEONG YESIEUNG-HIEUH;Lo;0;L;;;;;N;;;;; +D7F7;HANGUL JONGSEONG CIEUC-PIEUP;Lo;0;L;;;;;N;;;;; +D7F8;HANGUL JONGSEONG CIEUC-SSANGPIEUP;Lo;0;L;;;;;N;;;;; +D7F9;HANGUL JONGSEONG SSANGCIEUC;Lo;0;L;;;;;N;;;;; +D7FA;HANGUL JONGSEONG PHIEUPH-SIOS;Lo;0;L;;;;;N;;;;; +D7FB;HANGUL JONGSEONG PHIEUPH-THIEUTH;Lo;0;L;;;;;N;;;;; +D800;<Non Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;; +DB7F;<Non Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;; +DB80;<Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;; +DBFF;<Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;; +DC00;<Low Surrogate, First>;Cs;0;L;;;;;N;;;;; +DFFF;<Low Surrogate, Last>;Cs;0;L;;;;;N;;;;; +E000;<Private Use, First>;Co;0;L;;;;;N;;;;; +F8FF;<Private Use, Last>;Co;0;L;;;;;N;;;;; +F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;; +F901;CJK COMPATIBILITY IDEOGRAPH-F901;Lo;0;L;66F4;;;;N;;;;; +F902;CJK COMPATIBILITY IDEOGRAPH-F902;Lo;0;L;8ECA;;;;N;;;;; +F903;CJK COMPATIBILITY IDEOGRAPH-F903;Lo;0;L;8CC8;;;;N;;;;; +F904;CJK COMPATIBILITY IDEOGRAPH-F904;Lo;0;L;6ED1;;;;N;;;;; +F905;CJK COMPATIBILITY IDEOGRAPH-F905;Lo;0;L;4E32;;;;N;;;;; +F906;CJK COMPATIBILITY IDEOGRAPH-F906;Lo;0;L;53E5;;;;N;;;;; +F907;CJK COMPATIBILITY IDEOGRAPH-F907;Lo;0;L;9F9C;;;;N;;;;; +F908;CJK COMPATIBILITY IDEOGRAPH-F908;Lo;0;L;9F9C;;;;N;;;;; +F909;CJK COMPATIBILITY IDEOGRAPH-F909;Lo;0;L;5951;;;;N;;;;; +F90A;CJK COMPATIBILITY IDEOGRAPH-F90A;Lo;0;L;91D1;;;;N;;;;; +F90B;CJK COMPATIBILITY IDEOGRAPH-F90B;Lo;0;L;5587;;;;N;;;;; +F90C;CJK COMPATIBILITY IDEOGRAPH-F90C;Lo;0;L;5948;;;;N;;;;; +F90D;CJK COMPATIBILITY IDEOGRAPH-F90D;Lo;0;L;61F6;;;;N;;;;; +F90E;CJK COMPATIBILITY IDEOGRAPH-F90E;Lo;0;L;7669;;;;N;;;;; +F90F;CJK COMPATIBILITY IDEOGRAPH-F90F;Lo;0;L;7F85;;;;N;;;;; +F910;CJK COMPATIBILITY IDEOGRAPH-F910;Lo;0;L;863F;;;;N;;;;; +F911;CJK COMPATIBILITY IDEOGRAPH-F911;Lo;0;L;87BA;;;;N;;;;; +F912;CJK COMPATIBILITY IDEOGRAPH-F912;Lo;0;L;88F8;;;;N;;;;; +F913;CJK COMPATIBILITY IDEOGRAPH-F913;Lo;0;L;908F;;;;N;;;;; +F914;CJK COMPATIBILITY IDEOGRAPH-F914;Lo;0;L;6A02;;;;N;;;;; +F915;CJK COMPATIBILITY IDEOGRAPH-F915;Lo;0;L;6D1B;;;;N;;;;; +F916;CJK COMPATIBILITY IDEOGRAPH-F916;Lo;0;L;70D9;;;;N;;;;; +F917;CJK COMPATIBILITY IDEOGRAPH-F917;Lo;0;L;73DE;;;;N;;;;; +F918;CJK COMPATIBILITY IDEOGRAPH-F918;Lo;0;L;843D;;;;N;;;;; +F919;CJK COMPATIBILITY IDEOGRAPH-F919;Lo;0;L;916A;;;;N;;;;; +F91A;CJK COMPATIBILITY IDEOGRAPH-F91A;Lo;0;L;99F1;;;;N;;;;; +F91B;CJK COMPATIBILITY IDEOGRAPH-F91B;Lo;0;L;4E82;;;;N;;;;; +F91C;CJK COMPATIBILITY IDEOGRAPH-F91C;Lo;0;L;5375;;;;N;;;;; +F91D;CJK COMPATIBILITY IDEOGRAPH-F91D;Lo;0;L;6B04;;;;N;;;;; +F91E;CJK COMPATIBILITY IDEOGRAPH-F91E;Lo;0;L;721B;;;;N;;;;; +F91F;CJK COMPATIBILITY IDEOGRAPH-F91F;Lo;0;L;862D;;;;N;;;;; +F920;CJK COMPATIBILITY IDEOGRAPH-F920;Lo;0;L;9E1E;;;;N;;;;; +F921;CJK COMPATIBILITY IDEOGRAPH-F921;Lo;0;L;5D50;;;;N;;;;; +F922;CJK COMPATIBILITY IDEOGRAPH-F922;Lo;0;L;6FEB;;;;N;;;;; +F923;CJK COMPATIBILITY IDEOGRAPH-F923;Lo;0;L;85CD;;;;N;;;;; +F924;CJK COMPATIBILITY IDEOGRAPH-F924;Lo;0;L;8964;;;;N;;;;; +F925;CJK COMPATIBILITY IDEOGRAPH-F925;Lo;0;L;62C9;;;;N;;;;; +F926;CJK COMPATIBILITY IDEOGRAPH-F926;Lo;0;L;81D8;;;;N;;;;; +F927;CJK COMPATIBILITY IDEOGRAPH-F927;Lo;0;L;881F;;;;N;;;;; +F928;CJK COMPATIBILITY IDEOGRAPH-F928;Lo;0;L;5ECA;;;;N;;;;; +F929;CJK COMPATIBILITY IDEOGRAPH-F929;Lo;0;L;6717;;;;N;;;;; +F92A;CJK COMPATIBILITY IDEOGRAPH-F92A;Lo;0;L;6D6A;;;;N;;;;; +F92B;CJK COMPATIBILITY IDEOGRAPH-F92B;Lo;0;L;72FC;;;;N;;;;; +F92C;CJK COMPATIBILITY IDEOGRAPH-F92C;Lo;0;L;90CE;;;;N;;;;; +F92D;CJK COMPATIBILITY IDEOGRAPH-F92D;Lo;0;L;4F86;;;;N;;;;; +F92E;CJK COMPATIBILITY IDEOGRAPH-F92E;Lo;0;L;51B7;;;;N;;;;; +F92F;CJK COMPATIBILITY IDEOGRAPH-F92F;Lo;0;L;52DE;;;;N;;;;; +F930;CJK COMPATIBILITY IDEOGRAPH-F930;Lo;0;L;64C4;;;;N;;;;; +F931;CJK COMPATIBILITY IDEOGRAPH-F931;Lo;0;L;6AD3;;;;N;;;;; +F932;CJK COMPATIBILITY IDEOGRAPH-F932;Lo;0;L;7210;;;;N;;;;; +F933;CJK COMPATIBILITY IDEOGRAPH-F933;Lo;0;L;76E7;;;;N;;;;; +F934;CJK COMPATIBILITY IDEOGRAPH-F934;Lo;0;L;8001;;;;N;;;;; +F935;CJK COMPATIBILITY IDEOGRAPH-F935;Lo;0;L;8606;;;;N;;;;; +F936;CJK COMPATIBILITY IDEOGRAPH-F936;Lo;0;L;865C;;;;N;;;;; +F937;CJK COMPATIBILITY IDEOGRAPH-F937;Lo;0;L;8DEF;;;;N;;;;; +F938;CJK COMPATIBILITY IDEOGRAPH-F938;Lo;0;L;9732;;;;N;;;;; +F939;CJK COMPATIBILITY IDEOGRAPH-F939;Lo;0;L;9B6F;;;;N;;;;; +F93A;CJK COMPATIBILITY IDEOGRAPH-F93A;Lo;0;L;9DFA;;;;N;;;;; +F93B;CJK COMPATIBILITY IDEOGRAPH-F93B;Lo;0;L;788C;;;;N;;;;; +F93C;CJK COMPATIBILITY IDEOGRAPH-F93C;Lo;0;L;797F;;;;N;;;;; +F93D;CJK COMPATIBILITY IDEOGRAPH-F93D;Lo;0;L;7DA0;;;;N;;;;; +F93E;CJK COMPATIBILITY IDEOGRAPH-F93E;Lo;0;L;83C9;;;;N;;;;; +F93F;CJK COMPATIBILITY IDEOGRAPH-F93F;Lo;0;L;9304;;;;N;;;;; +F940;CJK COMPATIBILITY IDEOGRAPH-F940;Lo;0;L;9E7F;;;;N;;;;; +F941;CJK COMPATIBILITY IDEOGRAPH-F941;Lo;0;L;8AD6;;;;N;;;;; +F942;CJK COMPATIBILITY IDEOGRAPH-F942;Lo;0;L;58DF;;;;N;;;;; +F943;CJK COMPATIBILITY IDEOGRAPH-F943;Lo;0;L;5F04;;;;N;;;;; +F944;CJK COMPATIBILITY IDEOGRAPH-F944;Lo;0;L;7C60;;;;N;;;;; +F945;CJK COMPATIBILITY IDEOGRAPH-F945;Lo;0;L;807E;;;;N;;;;; +F946;CJK COMPATIBILITY IDEOGRAPH-F946;Lo;0;L;7262;;;;N;;;;; +F947;CJK COMPATIBILITY IDEOGRAPH-F947;Lo;0;L;78CA;;;;N;;;;; +F948;CJK COMPATIBILITY IDEOGRAPH-F948;Lo;0;L;8CC2;;;;N;;;;; +F949;CJK COMPATIBILITY IDEOGRAPH-F949;Lo;0;L;96F7;;;;N;;;;; +F94A;CJK COMPATIBILITY IDEOGRAPH-F94A;Lo;0;L;58D8;;;;N;;;;; +F94B;CJK COMPATIBILITY IDEOGRAPH-F94B;Lo;0;L;5C62;;;;N;;;;; +F94C;CJK COMPATIBILITY IDEOGRAPH-F94C;Lo;0;L;6A13;;;;N;;;;; +F94D;CJK COMPATIBILITY IDEOGRAPH-F94D;Lo;0;L;6DDA;;;;N;;;;; +F94E;CJK COMPATIBILITY IDEOGRAPH-F94E;Lo;0;L;6F0F;;;;N;;;;; +F94F;CJK COMPATIBILITY IDEOGRAPH-F94F;Lo;0;L;7D2F;;;;N;;;;; +F950;CJK COMPATIBILITY IDEOGRAPH-F950;Lo;0;L;7E37;;;;N;;;;; +F951;CJK COMPATIBILITY IDEOGRAPH-F951;Lo;0;L;964B;;;;N;;;;; +F952;CJK COMPATIBILITY IDEOGRAPH-F952;Lo;0;L;52D2;;;;N;;;;; +F953;CJK COMPATIBILITY IDEOGRAPH-F953;Lo;0;L;808B;;;;N;;;;; +F954;CJK COMPATIBILITY IDEOGRAPH-F954;Lo;0;L;51DC;;;;N;;;;; +F955;CJK COMPATIBILITY IDEOGRAPH-F955;Lo;0;L;51CC;;;;N;;;;; +F956;CJK COMPATIBILITY IDEOGRAPH-F956;Lo;0;L;7A1C;;;;N;;;;; +F957;CJK COMPATIBILITY IDEOGRAPH-F957;Lo;0;L;7DBE;;;;N;;;;; +F958;CJK COMPATIBILITY IDEOGRAPH-F958;Lo;0;L;83F1;;;;N;;;;; +F959;CJK COMPATIBILITY IDEOGRAPH-F959;Lo;0;L;9675;;;;N;;;;; +F95A;CJK COMPATIBILITY IDEOGRAPH-F95A;Lo;0;L;8B80;;;;N;;;;; +F95B;CJK COMPATIBILITY IDEOGRAPH-F95B;Lo;0;L;62CF;;;;N;;;;; +F95C;CJK COMPATIBILITY IDEOGRAPH-F95C;Lo;0;L;6A02;;;;N;;;;; +F95D;CJK COMPATIBILITY IDEOGRAPH-F95D;Lo;0;L;8AFE;;;;N;;;;; +F95E;CJK COMPATIBILITY IDEOGRAPH-F95E;Lo;0;L;4E39;;;;N;;;;; +F95F;CJK COMPATIBILITY IDEOGRAPH-F95F;Lo;0;L;5BE7;;;;N;;;;; +F960;CJK COMPATIBILITY IDEOGRAPH-F960;Lo;0;L;6012;;;;N;;;;; +F961;CJK COMPATIBILITY IDEOGRAPH-F961;Lo;0;L;7387;;;;N;;;;; +F962;CJK COMPATIBILITY IDEOGRAPH-F962;Lo;0;L;7570;;;;N;;;;; +F963;CJK COMPATIBILITY IDEOGRAPH-F963;Lo;0;L;5317;;;;N;;;;; +F964;CJK COMPATIBILITY IDEOGRAPH-F964;Lo;0;L;78FB;;;;N;;;;; +F965;CJK COMPATIBILITY IDEOGRAPH-F965;Lo;0;L;4FBF;;;;N;;;;; +F966;CJK COMPATIBILITY IDEOGRAPH-F966;Lo;0;L;5FA9;;;;N;;;;; +F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;; +F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;; +F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;; +F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;; +F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;3;N;;;;; +F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;; +F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;; +F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;; +F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;; +F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;; +F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;; +F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;; +F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;10;N;;;;; +F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;; +F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;; +F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;; +F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;; +F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;2;N;;;;; +F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;; +F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;; +F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;; +F97C;CJK COMPATIBILITY IDEOGRAPH-F97C;Lo;0;L;826F;;;;N;;;;; +F97D;CJK COMPATIBILITY IDEOGRAPH-F97D;Lo;0;L;8AD2;;;;N;;;;; +F97E;CJK COMPATIBILITY IDEOGRAPH-F97E;Lo;0;L;91CF;;;;N;;;;; +F97F;CJK COMPATIBILITY IDEOGRAPH-F97F;Lo;0;L;52F5;;;;N;;;;; +F980;CJK COMPATIBILITY IDEOGRAPH-F980;Lo;0;L;5442;;;;N;;;;; +F981;CJK COMPATIBILITY IDEOGRAPH-F981;Lo;0;L;5973;;;;N;;;;; +F982;CJK COMPATIBILITY IDEOGRAPH-F982;Lo;0;L;5EEC;;;;N;;;;; +F983;CJK COMPATIBILITY IDEOGRAPH-F983;Lo;0;L;65C5;;;;N;;;;; +F984;CJK COMPATIBILITY IDEOGRAPH-F984;Lo;0;L;6FFE;;;;N;;;;; +F985;CJK COMPATIBILITY IDEOGRAPH-F985;Lo;0;L;792A;;;;N;;;;; +F986;CJK COMPATIBILITY IDEOGRAPH-F986;Lo;0;L;95AD;;;;N;;;;; +F987;CJK COMPATIBILITY IDEOGRAPH-F987;Lo;0;L;9A6A;;;;N;;;;; +F988;CJK COMPATIBILITY IDEOGRAPH-F988;Lo;0;L;9E97;;;;N;;;;; +F989;CJK COMPATIBILITY IDEOGRAPH-F989;Lo;0;L;9ECE;;;;N;;;;; +F98A;CJK COMPATIBILITY IDEOGRAPH-F98A;Lo;0;L;529B;;;;N;;;;; +F98B;CJK COMPATIBILITY IDEOGRAPH-F98B;Lo;0;L;66C6;;;;N;;;;; +F98C;CJK COMPATIBILITY IDEOGRAPH-F98C;Lo;0;L;6B77;;;;N;;;;; +F98D;CJK COMPATIBILITY IDEOGRAPH-F98D;Lo;0;L;8F62;;;;N;;;;; +F98E;CJK COMPATIBILITY IDEOGRAPH-F98E;Lo;0;L;5E74;;;;N;;;;; +F98F;CJK COMPATIBILITY IDEOGRAPH-F98F;Lo;0;L;6190;;;;N;;;;; +F990;CJK COMPATIBILITY IDEOGRAPH-F990;Lo;0;L;6200;;;;N;;;;; +F991;CJK COMPATIBILITY IDEOGRAPH-F991;Lo;0;L;649A;;;;N;;;;; +F992;CJK COMPATIBILITY IDEOGRAPH-F992;Lo;0;L;6F23;;;;N;;;;; +F993;CJK COMPATIBILITY IDEOGRAPH-F993;Lo;0;L;7149;;;;N;;;;; +F994;CJK COMPATIBILITY IDEOGRAPH-F994;Lo;0;L;7489;;;;N;;;;; +F995;CJK COMPATIBILITY IDEOGRAPH-F995;Lo;0;L;79CA;;;;N;;;;; +F996;CJK COMPATIBILITY IDEOGRAPH-F996;Lo;0;L;7DF4;;;;N;;;;; +F997;CJK COMPATIBILITY IDEOGRAPH-F997;Lo;0;L;806F;;;;N;;;;; +F998;CJK COMPATIBILITY IDEOGRAPH-F998;Lo;0;L;8F26;;;;N;;;;; +F999;CJK COMPATIBILITY IDEOGRAPH-F999;Lo;0;L;84EE;;;;N;;;;; +F99A;CJK COMPATIBILITY IDEOGRAPH-F99A;Lo;0;L;9023;;;;N;;;;; +F99B;CJK COMPATIBILITY IDEOGRAPH-F99B;Lo;0;L;934A;;;;N;;;;; +F99C;CJK COMPATIBILITY IDEOGRAPH-F99C;Lo;0;L;5217;;;;N;;;;; +F99D;CJK COMPATIBILITY IDEOGRAPH-F99D;Lo;0;L;52A3;;;;N;;;;; +F99E;CJK COMPATIBILITY IDEOGRAPH-F99E;Lo;0;L;54BD;;;;N;;;;; +F99F;CJK COMPATIBILITY IDEOGRAPH-F99F;Lo;0;L;70C8;;;;N;;;;; +F9A0;CJK COMPATIBILITY IDEOGRAPH-F9A0;Lo;0;L;88C2;;;;N;;;;; +F9A1;CJK COMPATIBILITY IDEOGRAPH-F9A1;Lo;0;L;8AAA;;;;N;;;;; +F9A2;CJK COMPATIBILITY IDEOGRAPH-F9A2;Lo;0;L;5EC9;;;;N;;;;; +F9A3;CJK COMPATIBILITY IDEOGRAPH-F9A3;Lo;0;L;5FF5;;;;N;;;;; +F9A4;CJK COMPATIBILITY IDEOGRAPH-F9A4;Lo;0;L;637B;;;;N;;;;; +F9A5;CJK COMPATIBILITY IDEOGRAPH-F9A5;Lo;0;L;6BAE;;;;N;;;;; +F9A6;CJK COMPATIBILITY IDEOGRAPH-F9A6;Lo;0;L;7C3E;;;;N;;;;; +F9A7;CJK COMPATIBILITY IDEOGRAPH-F9A7;Lo;0;L;7375;;;;N;;;;; +F9A8;CJK COMPATIBILITY IDEOGRAPH-F9A8;Lo;0;L;4EE4;;;;N;;;;; +F9A9;CJK COMPATIBILITY IDEOGRAPH-F9A9;Lo;0;L;56F9;;;;N;;;;; +F9AA;CJK COMPATIBILITY IDEOGRAPH-F9AA;Lo;0;L;5BE7;;;;N;;;;; +F9AB;CJK COMPATIBILITY IDEOGRAPH-F9AB;Lo;0;L;5DBA;;;;N;;;;; +F9AC;CJK COMPATIBILITY IDEOGRAPH-F9AC;Lo;0;L;601C;;;;N;;;;; +F9AD;CJK COMPATIBILITY IDEOGRAPH-F9AD;Lo;0;L;73B2;;;;N;;;;; +F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;; +F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;; +F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;; +F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;; +F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;0;N;;;;; +F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;; +F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;; +F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;; +F9B6;CJK COMPATIBILITY IDEOGRAPH-F9B6;Lo;0;L;79AE;;;;N;;;;; +F9B7;CJK COMPATIBILITY IDEOGRAPH-F9B7;Lo;0;L;91B4;;;;N;;;;; +F9B8;CJK COMPATIBILITY IDEOGRAPH-F9B8;Lo;0;L;96B8;;;;N;;;;; +F9B9;CJK COMPATIBILITY IDEOGRAPH-F9B9;Lo;0;L;60E1;;;;N;;;;; +F9BA;CJK COMPATIBILITY IDEOGRAPH-F9BA;Lo;0;L;4E86;;;;N;;;;; +F9BB;CJK COMPATIBILITY IDEOGRAPH-F9BB;Lo;0;L;50DA;;;;N;;;;; +F9BC;CJK COMPATIBILITY IDEOGRAPH-F9BC;Lo;0;L;5BEE;;;;N;;;;; +F9BD;CJK COMPATIBILITY IDEOGRAPH-F9BD;Lo;0;L;5C3F;;;;N;;;;; +F9BE;CJK COMPATIBILITY IDEOGRAPH-F9BE;Lo;0;L;6599;;;;N;;;;; +F9BF;CJK COMPATIBILITY IDEOGRAPH-F9BF;Lo;0;L;6A02;;;;N;;;;; +F9C0;CJK COMPATIBILITY IDEOGRAPH-F9C0;Lo;0;L;71CE;;;;N;;;;; +F9C1;CJK COMPATIBILITY IDEOGRAPH-F9C1;Lo;0;L;7642;;;;N;;;;; +F9C2;CJK COMPATIBILITY IDEOGRAPH-F9C2;Lo;0;L;84FC;;;;N;;;;; +F9C3;CJK COMPATIBILITY IDEOGRAPH-F9C3;Lo;0;L;907C;;;;N;;;;; +F9C4;CJK COMPATIBILITY IDEOGRAPH-F9C4;Lo;0;L;9F8D;;;;N;;;;; +F9C5;CJK COMPATIBILITY IDEOGRAPH-F9C5;Lo;0;L;6688;;;;N;;;;; +F9C6;CJK COMPATIBILITY IDEOGRAPH-F9C6;Lo;0;L;962E;;;;N;;;;; +F9C7;CJK COMPATIBILITY IDEOGRAPH-F9C7;Lo;0;L;5289;;;;N;;;;; +F9C8;CJK COMPATIBILITY IDEOGRAPH-F9C8;Lo;0;L;677B;;;;N;;;;; +F9C9;CJK COMPATIBILITY IDEOGRAPH-F9C9;Lo;0;L;67F3;;;;N;;;;; +F9CA;CJK COMPATIBILITY IDEOGRAPH-F9CA;Lo;0;L;6D41;;;;N;;;;; +F9CB;CJK COMPATIBILITY IDEOGRAPH-F9CB;Lo;0;L;6E9C;;;;N;;;;; +F9CC;CJK COMPATIBILITY IDEOGRAPH-F9CC;Lo;0;L;7409;;;;N;;;;; +F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;; +F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;; +F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;; +F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;; +F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;6;N;;;;; +F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;; +F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;6;N;;;;; +F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;; +F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;; +F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;; +F9D7;CJK COMPATIBILITY IDEOGRAPH-F9D7;Lo;0;L;8F2A;;;;N;;;;; +F9D8;CJK COMPATIBILITY IDEOGRAPH-F9D8;Lo;0;L;5F8B;;;;N;;;;; +F9D9;CJK COMPATIBILITY IDEOGRAPH-F9D9;Lo;0;L;6144;;;;N;;;;; +F9DA;CJK COMPATIBILITY IDEOGRAPH-F9DA;Lo;0;L;6817;;;;N;;;;; +F9DB;CJK COMPATIBILITY IDEOGRAPH-F9DB;Lo;0;L;7387;;;;N;;;;; +F9DC;CJK COMPATIBILITY IDEOGRAPH-F9DC;Lo;0;L;9686;;;;N;;;;; +F9DD;CJK COMPATIBILITY IDEOGRAPH-F9DD;Lo;0;L;5229;;;;N;;;;; +F9DE;CJK COMPATIBILITY IDEOGRAPH-F9DE;Lo;0;L;540F;;;;N;;;;; +F9DF;CJK COMPATIBILITY IDEOGRAPH-F9DF;Lo;0;L;5C65;;;;N;;;;; +F9E0;CJK COMPATIBILITY IDEOGRAPH-F9E0;Lo;0;L;6613;;;;N;;;;; +F9E1;CJK COMPATIBILITY IDEOGRAPH-F9E1;Lo;0;L;674E;;;;N;;;;; +F9E2;CJK COMPATIBILITY IDEOGRAPH-F9E2;Lo;0;L;68A8;;;;N;;;;; +F9E3;CJK COMPATIBILITY IDEOGRAPH-F9E3;Lo;0;L;6CE5;;;;N;;;;; +F9E4;CJK COMPATIBILITY IDEOGRAPH-F9E4;Lo;0;L;7406;;;;N;;;;; +F9E5;CJK COMPATIBILITY IDEOGRAPH-F9E5;Lo;0;L;75E2;;;;N;;;;; +F9E6;CJK COMPATIBILITY IDEOGRAPH-F9E6;Lo;0;L;7F79;;;;N;;;;; +F9E7;CJK COMPATIBILITY IDEOGRAPH-F9E7;Lo;0;L;88CF;;;;N;;;;; +F9E8;CJK COMPATIBILITY IDEOGRAPH-F9E8;Lo;0;L;88E1;;;;N;;;;; +F9E9;CJK COMPATIBILITY IDEOGRAPH-F9E9;Lo;0;L;91CC;;;;N;;;;; +F9EA;CJK COMPATIBILITY IDEOGRAPH-F9EA;Lo;0;L;96E2;;;;N;;;;; +F9EB;CJK COMPATIBILITY IDEOGRAPH-F9EB;Lo;0;L;533F;;;;N;;;;; +F9EC;CJK COMPATIBILITY IDEOGRAPH-F9EC;Lo;0;L;6EBA;;;;N;;;;; +F9ED;CJK COMPATIBILITY IDEOGRAPH-F9ED;Lo;0;L;541D;;;;N;;;;; +F9EE;CJK COMPATIBILITY IDEOGRAPH-F9EE;Lo;0;L;71D0;;;;N;;;;; +F9EF;CJK COMPATIBILITY IDEOGRAPH-F9EF;Lo;0;L;7498;;;;N;;;;; +F9F0;CJK COMPATIBILITY IDEOGRAPH-F9F0;Lo;0;L;85FA;;;;N;;;;; +F9F1;CJK COMPATIBILITY IDEOGRAPH-F9F1;Lo;0;L;96A3;;;;N;;;;; +F9F2;CJK COMPATIBILITY IDEOGRAPH-F9F2;Lo;0;L;9C57;;;;N;;;;; +F9F3;CJK COMPATIBILITY IDEOGRAPH-F9F3;Lo;0;L;9E9F;;;;N;;;;; +F9F4;CJK COMPATIBILITY IDEOGRAPH-F9F4;Lo;0;L;6797;;;;N;;;;; +F9F5;CJK COMPATIBILITY IDEOGRAPH-F9F5;Lo;0;L;6DCB;;;;N;;;;; +F9F6;CJK COMPATIBILITY IDEOGRAPH-F9F6;Lo;0;L;81E8;;;;N;;;;; +F9F7;CJK COMPATIBILITY IDEOGRAPH-F9F7;Lo;0;L;7ACB;;;;N;;;;; +F9F8;CJK COMPATIBILITY IDEOGRAPH-F9F8;Lo;0;L;7B20;;;;N;;;;; +F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;; +F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;; +F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;; +F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;; +F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;10;N;;;;; +F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;; +F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;; +FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;; +FA01;CJK COMPATIBILITY IDEOGRAPH-FA01;Lo;0;L;5EA6;;;;N;;;;; +FA02;CJK COMPATIBILITY IDEOGRAPH-FA02;Lo;0;L;62D3;;;;N;;;;; +FA03;CJK COMPATIBILITY IDEOGRAPH-FA03;Lo;0;L;7CD6;;;;N;;;;; +FA04;CJK COMPATIBILITY IDEOGRAPH-FA04;Lo;0;L;5B85;;;;N;;;;; +FA05;CJK COMPATIBILITY IDEOGRAPH-FA05;Lo;0;L;6D1E;;;;N;;;;; +FA06;CJK COMPATIBILITY IDEOGRAPH-FA06;Lo;0;L;66B4;;;;N;;;;; +FA07;CJK COMPATIBILITY IDEOGRAPH-FA07;Lo;0;L;8F3B;;;;N;;;;; +FA08;CJK COMPATIBILITY IDEOGRAPH-FA08;Lo;0;L;884C;;;;N;;;;; +FA09;CJK COMPATIBILITY IDEOGRAPH-FA09;Lo;0;L;964D;;;;N;;;;; +FA0A;CJK COMPATIBILITY IDEOGRAPH-FA0A;Lo;0;L;898B;;;;N;;;;; +FA0B;CJK COMPATIBILITY IDEOGRAPH-FA0B;Lo;0;L;5ED3;;;;N;;;;; +FA0C;CJK COMPATIBILITY IDEOGRAPH-FA0C;Lo;0;L;5140;;;;N;;;;; +FA0D;CJK COMPATIBILITY IDEOGRAPH-FA0D;Lo;0;L;55C0;;;;N;;;;; +FA0E;CJK COMPATIBILITY IDEOGRAPH-FA0E;Lo;0;L;;;;;N;;;;; +FA0F;CJK COMPATIBILITY IDEOGRAPH-FA0F;Lo;0;L;;;;;N;;;;; +FA10;CJK COMPATIBILITY IDEOGRAPH-FA10;Lo;0;L;585A;;;;N;;;;; +FA11;CJK COMPATIBILITY IDEOGRAPH-FA11;Lo;0;L;;;;;N;;;;; +FA12;CJK COMPATIBILITY IDEOGRAPH-FA12;Lo;0;L;6674;;;;N;;;;; +FA13;CJK COMPATIBILITY IDEOGRAPH-FA13;Lo;0;L;;;;;N;;;;; +FA14;CJK COMPATIBILITY IDEOGRAPH-FA14;Lo;0;L;;;;;N;;;;; +FA15;CJK COMPATIBILITY IDEOGRAPH-FA15;Lo;0;L;51DE;;;;N;;;;; +FA16;CJK COMPATIBILITY IDEOGRAPH-FA16;Lo;0;L;732A;;;;N;;;;; +FA17;CJK COMPATIBILITY IDEOGRAPH-FA17;Lo;0;L;76CA;;;;N;;;;; +FA18;CJK COMPATIBILITY IDEOGRAPH-FA18;Lo;0;L;793C;;;;N;;;;; +FA19;CJK COMPATIBILITY IDEOGRAPH-FA19;Lo;0;L;795E;;;;N;;;;; +FA1A;CJK COMPATIBILITY IDEOGRAPH-FA1A;Lo;0;L;7965;;;;N;;;;; +FA1B;CJK COMPATIBILITY IDEOGRAPH-FA1B;Lo;0;L;798F;;;;N;;;;; +FA1C;CJK COMPATIBILITY IDEOGRAPH-FA1C;Lo;0;L;9756;;;;N;;;;; +FA1D;CJK COMPATIBILITY IDEOGRAPH-FA1D;Lo;0;L;7CBE;;;;N;;;;; +FA1E;CJK COMPATIBILITY IDEOGRAPH-FA1E;Lo;0;L;7FBD;;;;N;;;;; +FA1F;CJK COMPATIBILITY IDEOGRAPH-FA1F;Lo;0;L;;;;;N;;;;; +FA20;CJK COMPATIBILITY IDEOGRAPH-FA20;Lo;0;L;8612;;;;N;;;;; +FA21;CJK COMPATIBILITY IDEOGRAPH-FA21;Lo;0;L;;;;;N;;;;; +FA22;CJK COMPATIBILITY IDEOGRAPH-FA22;Lo;0;L;8AF8;;;;N;;;;; +FA23;CJK COMPATIBILITY IDEOGRAPH-FA23;Lo;0;L;;;;;N;;;;; +FA24;CJK COMPATIBILITY IDEOGRAPH-FA24;Lo;0;L;;;;;N;;;;; +FA25;CJK COMPATIBILITY IDEOGRAPH-FA25;Lo;0;L;9038;;;;N;;;;; +FA26;CJK COMPATIBILITY IDEOGRAPH-FA26;Lo;0;L;90FD;;;;N;;;;; +FA27;CJK COMPATIBILITY IDEOGRAPH-FA27;Lo;0;L;;;;;N;;;;; +FA28;CJK COMPATIBILITY IDEOGRAPH-FA28;Lo;0;L;;;;;N;;;;; +FA29;CJK COMPATIBILITY IDEOGRAPH-FA29;Lo;0;L;;;;;N;;;;; +FA2A;CJK COMPATIBILITY IDEOGRAPH-FA2A;Lo;0;L;98EF;;;;N;;;;; +FA2B;CJK COMPATIBILITY IDEOGRAPH-FA2B;Lo;0;L;98FC;;;;N;;;;; +FA2C;CJK COMPATIBILITY IDEOGRAPH-FA2C;Lo;0;L;9928;;;;N;;;;; +FA2D;CJK COMPATIBILITY IDEOGRAPH-FA2D;Lo;0;L;9DB4;;;;N;;;;; +FA30;CJK COMPATIBILITY IDEOGRAPH-FA30;Lo;0;L;4FAE;;;;N;;;;; +FA31;CJK COMPATIBILITY IDEOGRAPH-FA31;Lo;0;L;50E7;;;;N;;;;; +FA32;CJK COMPATIBILITY IDEOGRAPH-FA32;Lo;0;L;514D;;;;N;;;;; +FA33;CJK COMPATIBILITY IDEOGRAPH-FA33;Lo;0;L;52C9;;;;N;;;;; +FA34;CJK COMPATIBILITY IDEOGRAPH-FA34;Lo;0;L;52E4;;;;N;;;;; +FA35;CJK COMPATIBILITY IDEOGRAPH-FA35;Lo;0;L;5351;;;;N;;;;; +FA36;CJK COMPATIBILITY IDEOGRAPH-FA36;Lo;0;L;559D;;;;N;;;;; +FA37;CJK COMPATIBILITY IDEOGRAPH-FA37;Lo;0;L;5606;;;;N;;;;; +FA38;CJK COMPATIBILITY IDEOGRAPH-FA38;Lo;0;L;5668;;;;N;;;;; +FA39;CJK COMPATIBILITY IDEOGRAPH-FA39;Lo;0;L;5840;;;;N;;;;; +FA3A;CJK COMPATIBILITY IDEOGRAPH-FA3A;Lo;0;L;58A8;;;;N;;;;; +FA3B;CJK COMPATIBILITY IDEOGRAPH-FA3B;Lo;0;L;5C64;;;;N;;;;; +FA3C;CJK COMPATIBILITY IDEOGRAPH-FA3C;Lo;0;L;5C6E;;;;N;;;;; +FA3D;CJK COMPATIBILITY IDEOGRAPH-FA3D;Lo;0;L;6094;;;;N;;;;; +FA3E;CJK COMPATIBILITY IDEOGRAPH-FA3E;Lo;0;L;6168;;;;N;;;;; +FA3F;CJK COMPATIBILITY IDEOGRAPH-FA3F;Lo;0;L;618E;;;;N;;;;; +FA40;CJK COMPATIBILITY IDEOGRAPH-FA40;Lo;0;L;61F2;;;;N;;;;; +FA41;CJK COMPATIBILITY IDEOGRAPH-FA41;Lo;0;L;654F;;;;N;;;;; +FA42;CJK COMPATIBILITY IDEOGRAPH-FA42;Lo;0;L;65E2;;;;N;;;;; +FA43;CJK COMPATIBILITY IDEOGRAPH-FA43;Lo;0;L;6691;;;;N;;;;; +FA44;CJK COMPATIBILITY IDEOGRAPH-FA44;Lo;0;L;6885;;;;N;;;;; +FA45;CJK COMPATIBILITY IDEOGRAPH-FA45;Lo;0;L;6D77;;;;N;;;;; +FA46;CJK COMPATIBILITY IDEOGRAPH-FA46;Lo;0;L;6E1A;;;;N;;;;; +FA47;CJK COMPATIBILITY IDEOGRAPH-FA47;Lo;0;L;6F22;;;;N;;;;; +FA48;CJK COMPATIBILITY IDEOGRAPH-FA48;Lo;0;L;716E;;;;N;;;;; +FA49;CJK COMPATIBILITY IDEOGRAPH-FA49;Lo;0;L;722B;;;;N;;;;; +FA4A;CJK COMPATIBILITY IDEOGRAPH-FA4A;Lo;0;L;7422;;;;N;;;;; +FA4B;CJK COMPATIBILITY IDEOGRAPH-FA4B;Lo;0;L;7891;;;;N;;;;; +FA4C;CJK COMPATIBILITY IDEOGRAPH-FA4C;Lo;0;L;793E;;;;N;;;;; +FA4D;CJK COMPATIBILITY IDEOGRAPH-FA4D;Lo;0;L;7949;;;;N;;;;; +FA4E;CJK COMPATIBILITY IDEOGRAPH-FA4E;Lo;0;L;7948;;;;N;;;;; +FA4F;CJK COMPATIBILITY IDEOGRAPH-FA4F;Lo;0;L;7950;;;;N;;;;; +FA50;CJK COMPATIBILITY IDEOGRAPH-FA50;Lo;0;L;7956;;;;N;;;;; +FA51;CJK COMPATIBILITY IDEOGRAPH-FA51;Lo;0;L;795D;;;;N;;;;; +FA52;CJK COMPATIBILITY IDEOGRAPH-FA52;Lo;0;L;798D;;;;N;;;;; +FA53;CJK COMPATIBILITY IDEOGRAPH-FA53;Lo;0;L;798E;;;;N;;;;; +FA54;CJK COMPATIBILITY IDEOGRAPH-FA54;Lo;0;L;7A40;;;;N;;;;; +FA55;CJK COMPATIBILITY IDEOGRAPH-FA55;Lo;0;L;7A81;;;;N;;;;; +FA56;CJK COMPATIBILITY IDEOGRAPH-FA56;Lo;0;L;7BC0;;;;N;;;;; +FA57;CJK COMPATIBILITY IDEOGRAPH-FA57;Lo;0;L;7DF4;;;;N;;;;; +FA58;CJK COMPATIBILITY IDEOGRAPH-FA58;Lo;0;L;7E09;;;;N;;;;; +FA59;CJK COMPATIBILITY IDEOGRAPH-FA59;Lo;0;L;7E41;;;;N;;;;; +FA5A;CJK COMPATIBILITY IDEOGRAPH-FA5A;Lo;0;L;7F72;;;;N;;;;; +FA5B;CJK COMPATIBILITY IDEOGRAPH-FA5B;Lo;0;L;8005;;;;N;;;;; +FA5C;CJK COMPATIBILITY IDEOGRAPH-FA5C;Lo;0;L;81ED;;;;N;;;;; +FA5D;CJK COMPATIBILITY IDEOGRAPH-FA5D;Lo;0;L;8279;;;;N;;;;; +FA5E;CJK COMPATIBILITY IDEOGRAPH-FA5E;Lo;0;L;8279;;;;N;;;;; +FA5F;CJK COMPATIBILITY IDEOGRAPH-FA5F;Lo;0;L;8457;;;;N;;;;; +FA60;CJK COMPATIBILITY IDEOGRAPH-FA60;Lo;0;L;8910;;;;N;;;;; +FA61;CJK COMPATIBILITY IDEOGRAPH-FA61;Lo;0;L;8996;;;;N;;;;; +FA62;CJK COMPATIBILITY IDEOGRAPH-FA62;Lo;0;L;8B01;;;;N;;;;; +FA63;CJK COMPATIBILITY IDEOGRAPH-FA63;Lo;0;L;8B39;;;;N;;;;; +FA64;CJK COMPATIBILITY IDEOGRAPH-FA64;Lo;0;L;8CD3;;;;N;;;;; +FA65;CJK COMPATIBILITY IDEOGRAPH-FA65;Lo;0;L;8D08;;;;N;;;;; +FA66;CJK COMPATIBILITY IDEOGRAPH-FA66;Lo;0;L;8FB6;;;;N;;;;; +FA67;CJK COMPATIBILITY IDEOGRAPH-FA67;Lo;0;L;9038;;;;N;;;;; +FA68;CJK COMPATIBILITY IDEOGRAPH-FA68;Lo;0;L;96E3;;;;N;;;;; +FA69;CJK COMPATIBILITY IDEOGRAPH-FA69;Lo;0;L;97FF;;;;N;;;;; +FA6A;CJK COMPATIBILITY IDEOGRAPH-FA6A;Lo;0;L;983B;;;;N;;;;; +FA6B;CJK COMPATIBILITY IDEOGRAPH-FA6B;Lo;0;L;6075;;;;N;;;;; +FA6C;CJK COMPATIBILITY IDEOGRAPH-FA6C;Lo;0;L;242EE;;;;N;;;;; +FA6D;CJK COMPATIBILITY IDEOGRAPH-FA6D;Lo;0;L;8218;;;;N;;;;; +FA70;CJK COMPATIBILITY IDEOGRAPH-FA70;Lo;0;L;4E26;;;;N;;;;; +FA71;CJK COMPATIBILITY IDEOGRAPH-FA71;Lo;0;L;51B5;;;;N;;;;; +FA72;CJK COMPATIBILITY IDEOGRAPH-FA72;Lo;0;L;5168;;;;N;;;;; +FA73;CJK COMPATIBILITY IDEOGRAPH-FA73;Lo;0;L;4F80;;;;N;;;;; +FA74;CJK COMPATIBILITY IDEOGRAPH-FA74;Lo;0;L;5145;;;;N;;;;; +FA75;CJK COMPATIBILITY IDEOGRAPH-FA75;Lo;0;L;5180;;;;N;;;;; +FA76;CJK COMPATIBILITY IDEOGRAPH-FA76;Lo;0;L;52C7;;;;N;;;;; +FA77;CJK COMPATIBILITY IDEOGRAPH-FA77;Lo;0;L;52FA;;;;N;;;;; +FA78;CJK COMPATIBILITY IDEOGRAPH-FA78;Lo;0;L;559D;;;;N;;;;; +FA79;CJK COMPATIBILITY IDEOGRAPH-FA79;Lo;0;L;5555;;;;N;;;;; +FA7A;CJK COMPATIBILITY IDEOGRAPH-FA7A;Lo;0;L;5599;;;;N;;;;; +FA7B;CJK COMPATIBILITY IDEOGRAPH-FA7B;Lo;0;L;55E2;;;;N;;;;; +FA7C;CJK COMPATIBILITY IDEOGRAPH-FA7C;Lo;0;L;585A;;;;N;;;;; +FA7D;CJK COMPATIBILITY IDEOGRAPH-FA7D;Lo;0;L;58B3;;;;N;;;;; +FA7E;CJK COMPATIBILITY IDEOGRAPH-FA7E;Lo;0;L;5944;;;;N;;;;; +FA7F;CJK COMPATIBILITY IDEOGRAPH-FA7F;Lo;0;L;5954;;;;N;;;;; +FA80;CJK COMPATIBILITY IDEOGRAPH-FA80;Lo;0;L;5A62;;;;N;;;;; +FA81;CJK COMPATIBILITY IDEOGRAPH-FA81;Lo;0;L;5B28;;;;N;;;;; +FA82;CJK COMPATIBILITY IDEOGRAPH-FA82;Lo;0;L;5ED2;;;;N;;;;; +FA83;CJK COMPATIBILITY IDEOGRAPH-FA83;Lo;0;L;5ED9;;;;N;;;;; +FA84;CJK COMPATIBILITY IDEOGRAPH-FA84;Lo;0;L;5F69;;;;N;;;;; +FA85;CJK COMPATIBILITY IDEOGRAPH-FA85;Lo;0;L;5FAD;;;;N;;;;; +FA86;CJK COMPATIBILITY IDEOGRAPH-FA86;Lo;0;L;60D8;;;;N;;;;; +FA87;CJK COMPATIBILITY IDEOGRAPH-FA87;Lo;0;L;614E;;;;N;;;;; +FA88;CJK COMPATIBILITY IDEOGRAPH-FA88;Lo;0;L;6108;;;;N;;;;; +FA89;CJK COMPATIBILITY IDEOGRAPH-FA89;Lo;0;L;618E;;;;N;;;;; +FA8A;CJK COMPATIBILITY IDEOGRAPH-FA8A;Lo;0;L;6160;;;;N;;;;; +FA8B;CJK COMPATIBILITY IDEOGRAPH-FA8B;Lo;0;L;61F2;;;;N;;;;; +FA8C;CJK COMPATIBILITY IDEOGRAPH-FA8C;Lo;0;L;6234;;;;N;;;;; +FA8D;CJK COMPATIBILITY IDEOGRAPH-FA8D;Lo;0;L;63C4;;;;N;;;;; +FA8E;CJK COMPATIBILITY IDEOGRAPH-FA8E;Lo;0;L;641C;;;;N;;;;; +FA8F;CJK COMPATIBILITY IDEOGRAPH-FA8F;Lo;0;L;6452;;;;N;;;;; +FA90;CJK COMPATIBILITY IDEOGRAPH-FA90;Lo;0;L;6556;;;;N;;;;; +FA91;CJK COMPATIBILITY IDEOGRAPH-FA91;Lo;0;L;6674;;;;N;;;;; +FA92;CJK COMPATIBILITY IDEOGRAPH-FA92;Lo;0;L;6717;;;;N;;;;; +FA93;CJK COMPATIBILITY IDEOGRAPH-FA93;Lo;0;L;671B;;;;N;;;;; +FA94;CJK COMPATIBILITY IDEOGRAPH-FA94;Lo;0;L;6756;;;;N;;;;; +FA95;CJK COMPATIBILITY IDEOGRAPH-FA95;Lo;0;L;6B79;;;;N;;;;; +FA96;CJK COMPATIBILITY IDEOGRAPH-FA96;Lo;0;L;6BBA;;;;N;;;;; +FA97;CJK COMPATIBILITY IDEOGRAPH-FA97;Lo;0;L;6D41;;;;N;;;;; +FA98;CJK COMPATIBILITY IDEOGRAPH-FA98;Lo;0;L;6EDB;;;;N;;;;; +FA99;CJK COMPATIBILITY IDEOGRAPH-FA99;Lo;0;L;6ECB;;;;N;;;;; +FA9A;CJK COMPATIBILITY IDEOGRAPH-FA9A;Lo;0;L;6F22;;;;N;;;;; +FA9B;CJK COMPATIBILITY IDEOGRAPH-FA9B;Lo;0;L;701E;;;;N;;;;; +FA9C;CJK COMPATIBILITY IDEOGRAPH-FA9C;Lo;0;L;716E;;;;N;;;;; +FA9D;CJK COMPATIBILITY IDEOGRAPH-FA9D;Lo;0;L;77A7;;;;N;;;;; +FA9E;CJK COMPATIBILITY IDEOGRAPH-FA9E;Lo;0;L;7235;;;;N;;;;; +FA9F;CJK COMPATIBILITY IDEOGRAPH-FA9F;Lo;0;L;72AF;;;;N;;;;; +FAA0;CJK COMPATIBILITY IDEOGRAPH-FAA0;Lo;0;L;732A;;;;N;;;;; +FAA1;CJK COMPATIBILITY IDEOGRAPH-FAA1;Lo;0;L;7471;;;;N;;;;; +FAA2;CJK COMPATIBILITY IDEOGRAPH-FAA2;Lo;0;L;7506;;;;N;;;;; +FAA3;CJK COMPATIBILITY IDEOGRAPH-FAA3;Lo;0;L;753B;;;;N;;;;; +FAA4;CJK COMPATIBILITY IDEOGRAPH-FAA4;Lo;0;L;761D;;;;N;;;;; +FAA5;CJK COMPATIBILITY IDEOGRAPH-FAA5;Lo;0;L;761F;;;;N;;;;; +FAA6;CJK COMPATIBILITY IDEOGRAPH-FAA6;Lo;0;L;76CA;;;;N;;;;; +FAA7;CJK COMPATIBILITY IDEOGRAPH-FAA7;Lo;0;L;76DB;;;;N;;;;; +FAA8;CJK COMPATIBILITY IDEOGRAPH-FAA8;Lo;0;L;76F4;;;;N;;;;; +FAA9;CJK COMPATIBILITY IDEOGRAPH-FAA9;Lo;0;L;774A;;;;N;;;;; +FAAA;CJK COMPATIBILITY IDEOGRAPH-FAAA;Lo;0;L;7740;;;;N;;;;; +FAAB;CJK COMPATIBILITY IDEOGRAPH-FAAB;Lo;0;L;78CC;;;;N;;;;; +FAAC;CJK COMPATIBILITY IDEOGRAPH-FAAC;Lo;0;L;7AB1;;;;N;;;;; +FAAD;CJK COMPATIBILITY IDEOGRAPH-FAAD;Lo;0;L;7BC0;;;;N;;;;; +FAAE;CJK COMPATIBILITY IDEOGRAPH-FAAE;Lo;0;L;7C7B;;;;N;;;;; +FAAF;CJK COMPATIBILITY IDEOGRAPH-FAAF;Lo;0;L;7D5B;;;;N;;;;; +FAB0;CJK COMPATIBILITY IDEOGRAPH-FAB0;Lo;0;L;7DF4;;;;N;;;;; +FAB1;CJK COMPATIBILITY IDEOGRAPH-FAB1;Lo;0;L;7F3E;;;;N;;;;; +FAB2;CJK COMPATIBILITY IDEOGRAPH-FAB2;Lo;0;L;8005;;;;N;;;;; +FAB3;CJK COMPATIBILITY IDEOGRAPH-FAB3;Lo;0;L;8352;;;;N;;;;; +FAB4;CJK COMPATIBILITY IDEOGRAPH-FAB4;Lo;0;L;83EF;;;;N;;;;; +FAB5;CJK COMPATIBILITY IDEOGRAPH-FAB5;Lo;0;L;8779;;;;N;;;;; +FAB6;CJK COMPATIBILITY IDEOGRAPH-FAB6;Lo;0;L;8941;;;;N;;;;; +FAB7;CJK COMPATIBILITY IDEOGRAPH-FAB7;Lo;0;L;8986;;;;N;;;;; +FAB8;CJK COMPATIBILITY IDEOGRAPH-FAB8;Lo;0;L;8996;;;;N;;;;; +FAB9;CJK COMPATIBILITY IDEOGRAPH-FAB9;Lo;0;L;8ABF;;;;N;;;;; +FABA;CJK COMPATIBILITY IDEOGRAPH-FABA;Lo;0;L;8AF8;;;;N;;;;; +FABB;CJK COMPATIBILITY IDEOGRAPH-FABB;Lo;0;L;8ACB;;;;N;;;;; +FABC;CJK COMPATIBILITY IDEOGRAPH-FABC;Lo;0;L;8B01;;;;N;;;;; +FABD;CJK COMPATIBILITY IDEOGRAPH-FABD;Lo;0;L;8AFE;;;;N;;;;; +FABE;CJK COMPATIBILITY IDEOGRAPH-FABE;Lo;0;L;8AED;;;;N;;;;; +FABF;CJK COMPATIBILITY IDEOGRAPH-FABF;Lo;0;L;8B39;;;;N;;;;; +FAC0;CJK COMPATIBILITY IDEOGRAPH-FAC0;Lo;0;L;8B8A;;;;N;;;;; +FAC1;CJK COMPATIBILITY IDEOGRAPH-FAC1;Lo;0;L;8D08;;;;N;;;;; +FAC2;CJK COMPATIBILITY IDEOGRAPH-FAC2;Lo;0;L;8F38;;;;N;;;;; +FAC3;CJK COMPATIBILITY IDEOGRAPH-FAC3;Lo;0;L;9072;;;;N;;;;; +FAC4;CJK COMPATIBILITY IDEOGRAPH-FAC4;Lo;0;L;9199;;;;N;;;;; +FAC5;CJK COMPATIBILITY IDEOGRAPH-FAC5;Lo;0;L;9276;;;;N;;;;; +FAC6;CJK COMPATIBILITY IDEOGRAPH-FAC6;Lo;0;L;967C;;;;N;;;;; +FAC7;CJK COMPATIBILITY IDEOGRAPH-FAC7;Lo;0;L;96E3;;;;N;;;;; +FAC8;CJK COMPATIBILITY IDEOGRAPH-FAC8;Lo;0;L;9756;;;;N;;;;; +FAC9;CJK COMPATIBILITY IDEOGRAPH-FAC9;Lo;0;L;97DB;;;;N;;;;; +FACA;CJK COMPATIBILITY IDEOGRAPH-FACA;Lo;0;L;97FF;;;;N;;;;; +FACB;CJK COMPATIBILITY IDEOGRAPH-FACB;Lo;0;L;980B;;;;N;;;;; +FACC;CJK COMPATIBILITY IDEOGRAPH-FACC;Lo;0;L;983B;;;;N;;;;; +FACD;CJK COMPATIBILITY IDEOGRAPH-FACD;Lo;0;L;9B12;;;;N;;;;; +FACE;CJK COMPATIBILITY IDEOGRAPH-FACE;Lo;0;L;9F9C;;;;N;;;;; +FACF;CJK COMPATIBILITY IDEOGRAPH-FACF;Lo;0;L;2284A;;;;N;;;;; +FAD0;CJK COMPATIBILITY IDEOGRAPH-FAD0;Lo;0;L;22844;;;;N;;;;; +FAD1;CJK COMPATIBILITY IDEOGRAPH-FAD1;Lo;0;L;233D5;;;;N;;;;; +FAD2;CJK COMPATIBILITY IDEOGRAPH-FAD2;Lo;0;L;3B9D;;;;N;;;;; +FAD3;CJK COMPATIBILITY IDEOGRAPH-FAD3;Lo;0;L;4018;;;;N;;;;; +FAD4;CJK COMPATIBILITY IDEOGRAPH-FAD4;Lo;0;L;4039;;;;N;;;;; +FAD5;CJK COMPATIBILITY IDEOGRAPH-FAD5;Lo;0;L;25249;;;;N;;;;; +FAD6;CJK COMPATIBILITY IDEOGRAPH-FAD6;Lo;0;L;25CD0;;;;N;;;;; +FAD7;CJK COMPATIBILITY IDEOGRAPH-FAD7;Lo;0;L;27ED3;;;;N;;;;; +FAD8;CJK COMPATIBILITY IDEOGRAPH-FAD8;Lo;0;L;9F43;;;;N;;;;; +FAD9;CJK COMPATIBILITY IDEOGRAPH-FAD9;Lo;0;L;9F8E;;;;N;;;;; +FB00;LATIN SMALL LIGATURE FF;Ll;0;L;<compat> 0066 0066;;;;N;;;;; +FB01;LATIN SMALL LIGATURE FI;Ll;0;L;<compat> 0066 0069;;;;N;;;;; +FB02;LATIN SMALL LIGATURE FL;Ll;0;L;<compat> 0066 006C;;;;N;;;;; +FB03;LATIN SMALL LIGATURE FFI;Ll;0;L;<compat> 0066 0066 0069;;;;N;;;;; +FB04;LATIN SMALL LIGATURE FFL;Ll;0;L;<compat> 0066 0066 006C;;;;N;;;;; +FB05;LATIN SMALL LIGATURE LONG S T;Ll;0;L;<compat> 017F 0074;;;;N;;;;; +FB06;LATIN SMALL LIGATURE ST;Ll;0;L;<compat> 0073 0074;;;;N;;;;; +FB13;ARMENIAN SMALL LIGATURE MEN NOW;Ll;0;L;<compat> 0574 0576;;;;N;;;;; +FB14;ARMENIAN SMALL LIGATURE MEN ECH;Ll;0;L;<compat> 0574 0565;;;;N;;;;; +FB15;ARMENIAN SMALL LIGATURE MEN INI;Ll;0;L;<compat> 0574 056B;;;;N;;;;; +FB16;ARMENIAN SMALL LIGATURE VEW NOW;Ll;0;L;<compat> 057E 0576;;;;N;;;;; +FB17;ARMENIAN SMALL LIGATURE MEN XEH;Ll;0;L;<compat> 0574 056D;;;;N;;;;; +FB1D;HEBREW LETTER YOD WITH HIRIQ;Lo;0;R;05D9 05B4;;;;N;;;;; +FB1E;HEBREW POINT JUDEO-SPANISH VARIKA;Mn;26;NSM;;;;;N;HEBREW POINT VARIKA;;;; +FB1F;HEBREW LIGATURE YIDDISH YOD YOD PATAH;Lo;0;R;05F2 05B7;;;;N;;;;; +FB20;HEBREW LETTER ALTERNATIVE AYIN;Lo;0;R;<font> 05E2;;;;N;;;;; +FB21;HEBREW LETTER WIDE ALEF;Lo;0;R;<font> 05D0;;;;N;;;;; +FB22;HEBREW LETTER WIDE DALET;Lo;0;R;<font> 05D3;;;;N;;;;; +FB23;HEBREW LETTER WIDE HE;Lo;0;R;<font> 05D4;;;;N;;;;; +FB24;HEBREW LETTER WIDE KAF;Lo;0;R;<font> 05DB;;;;N;;;;; +FB25;HEBREW LETTER WIDE LAMED;Lo;0;R;<font> 05DC;;;;N;;;;; +FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R;<font> 05DD;;;;N;;;;; +FB27;HEBREW LETTER WIDE RESH;Lo;0;R;<font> 05E8;;;;N;;;;; +FB28;HEBREW LETTER WIDE TAV;Lo;0;R;<font> 05EA;;;;N;;;;; +FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ES;<font> 002B;;;;N;;;;; +FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;; +FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;; +FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;; +FB2D;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT;Lo;0;R;FB49 05C2;;;;N;;;;; +FB2E;HEBREW LETTER ALEF WITH PATAH;Lo;0;R;05D0 05B7;;;;N;;;;; +FB2F;HEBREW LETTER ALEF WITH QAMATS;Lo;0;R;05D0 05B8;;;;N;;;;; +FB30;HEBREW LETTER ALEF WITH MAPIQ;Lo;0;R;05D0 05BC;;;;N;;;;; +FB31;HEBREW LETTER BET WITH DAGESH;Lo;0;R;05D1 05BC;;;;N;;;;; +FB32;HEBREW LETTER GIMEL WITH DAGESH;Lo;0;R;05D2 05BC;;;;N;;;;; +FB33;HEBREW LETTER DALET WITH DAGESH;Lo;0;R;05D3 05BC;;;;N;;;;; +FB34;HEBREW LETTER HE WITH MAPIQ;Lo;0;R;05D4 05BC;;;;N;;;;; +FB35;HEBREW LETTER VAV WITH DAGESH;Lo;0;R;05D5 05BC;;;;N;;;;; +FB36;HEBREW LETTER ZAYIN WITH DAGESH;Lo;0;R;05D6 05BC;;;;N;;;;; +FB38;HEBREW LETTER TET WITH DAGESH;Lo;0;R;05D8 05BC;;;;N;;;;; +FB39;HEBREW LETTER YOD WITH DAGESH;Lo;0;R;05D9 05BC;;;;N;;;;; +FB3A;HEBREW LETTER FINAL KAF WITH DAGESH;Lo;0;R;05DA 05BC;;;;N;;;;; +FB3B;HEBREW LETTER KAF WITH DAGESH;Lo;0;R;05DB 05BC;;;;N;;;;; +FB3C;HEBREW LETTER LAMED WITH DAGESH;Lo;0;R;05DC 05BC;;;;N;;;;; +FB3E;HEBREW LETTER MEM WITH DAGESH;Lo;0;R;05DE 05BC;;;;N;;;;; +FB40;HEBREW LETTER NUN WITH DAGESH;Lo;0;R;05E0 05BC;;;;N;;;;; +FB41;HEBREW LETTER SAMEKH WITH DAGESH;Lo;0;R;05E1 05BC;;;;N;;;;; +FB43;HEBREW LETTER FINAL PE WITH DAGESH;Lo;0;R;05E3 05BC;;;;N;;;;; +FB44;HEBREW LETTER PE WITH DAGESH;Lo;0;R;05E4 05BC;;;;N;;;;; +FB46;HEBREW LETTER TSADI WITH DAGESH;Lo;0;R;05E6 05BC;;;;N;;;;; +FB47;HEBREW LETTER QOF WITH DAGESH;Lo;0;R;05E7 05BC;;;;N;;;;; +FB48;HEBREW LETTER RESH WITH DAGESH;Lo;0;R;05E8 05BC;;;;N;;;;; +FB49;HEBREW LETTER SHIN WITH DAGESH;Lo;0;R;05E9 05BC;;;;N;;;;; +FB4A;HEBREW LETTER TAV WITH DAGESH;Lo;0;R;05EA 05BC;;;;N;;;;; +FB4B;HEBREW LETTER VAV WITH HOLAM;Lo;0;R;05D5 05B9;;;;N;;;;; +FB4C;HEBREW LETTER BET WITH RAFE;Lo;0;R;05D1 05BF;;;;N;;;;; +FB4D;HEBREW LETTER KAF WITH RAFE;Lo;0;R;05DB 05BF;;;;N;;;;; +FB4E;HEBREW LETTER PE WITH RAFE;Lo;0;R;05E4 05BF;;;;N;;;;; +FB4F;HEBREW LIGATURE ALEF LAMED;Lo;0;R;<compat> 05D0 05DC;;;;N;;;;; +FB50;ARABIC LETTER ALEF WASLA ISOLATED FORM;Lo;0;AL;<isolated> 0671;;;;N;;;;; +FB51;ARABIC LETTER ALEF WASLA FINAL FORM;Lo;0;AL;<final> 0671;;;;N;;;;; +FB52;ARABIC LETTER BEEH ISOLATED FORM;Lo;0;AL;<isolated> 067B;;;;N;;;;; +FB53;ARABIC LETTER BEEH FINAL FORM;Lo;0;AL;<final> 067B;;;;N;;;;; +FB54;ARABIC LETTER BEEH INITIAL FORM;Lo;0;AL;<initial> 067B;;;;N;;;;; +FB55;ARABIC LETTER BEEH MEDIAL FORM;Lo;0;AL;<medial> 067B;;;;N;;;;; +FB56;ARABIC LETTER PEH ISOLATED FORM;Lo;0;AL;<isolated> 067E;;;;N;;;;; +FB57;ARABIC LETTER PEH FINAL FORM;Lo;0;AL;<final> 067E;;;;N;;;;; +FB58;ARABIC LETTER PEH INITIAL FORM;Lo;0;AL;<initial> 067E;;;;N;;;;; +FB59;ARABIC LETTER PEH MEDIAL FORM;Lo;0;AL;<medial> 067E;;;;N;;;;; +FB5A;ARABIC LETTER BEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0680;;;;N;;;;; +FB5B;ARABIC LETTER BEHEH FINAL FORM;Lo;0;AL;<final> 0680;;;;N;;;;; +FB5C;ARABIC LETTER BEHEH INITIAL FORM;Lo;0;AL;<initial> 0680;;;;N;;;;; +FB5D;ARABIC LETTER BEHEH MEDIAL FORM;Lo;0;AL;<medial> 0680;;;;N;;;;; +FB5E;ARABIC LETTER TTEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067A;;;;N;;;;; +FB5F;ARABIC LETTER TTEHEH FINAL FORM;Lo;0;AL;<final> 067A;;;;N;;;;; +FB60;ARABIC LETTER TTEHEH INITIAL FORM;Lo;0;AL;<initial> 067A;;;;N;;;;; +FB61;ARABIC LETTER TTEHEH MEDIAL FORM;Lo;0;AL;<medial> 067A;;;;N;;;;; +FB62;ARABIC LETTER TEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067F;;;;N;;;;; +FB63;ARABIC LETTER TEHEH FINAL FORM;Lo;0;AL;<final> 067F;;;;N;;;;; +FB64;ARABIC LETTER TEHEH INITIAL FORM;Lo;0;AL;<initial> 067F;;;;N;;;;; +FB65;ARABIC LETTER TEHEH MEDIAL FORM;Lo;0;AL;<medial> 067F;;;;N;;;;; +FB66;ARABIC LETTER TTEH ISOLATED FORM;Lo;0;AL;<isolated> 0679;;;;N;;;;; +FB67;ARABIC LETTER TTEH FINAL FORM;Lo;0;AL;<final> 0679;;;;N;;;;; +FB68;ARABIC LETTER TTEH INITIAL FORM;Lo;0;AL;<initial> 0679;;;;N;;;;; +FB69;ARABIC LETTER TTEH MEDIAL FORM;Lo;0;AL;<medial> 0679;;;;N;;;;; +FB6A;ARABIC LETTER VEH ISOLATED FORM;Lo;0;AL;<isolated> 06A4;;;;N;;;;; +FB6B;ARABIC LETTER VEH FINAL FORM;Lo;0;AL;<final> 06A4;;;;N;;;;; +FB6C;ARABIC LETTER VEH INITIAL FORM;Lo;0;AL;<initial> 06A4;;;;N;;;;; +FB6D;ARABIC LETTER VEH MEDIAL FORM;Lo;0;AL;<medial> 06A4;;;;N;;;;; +FB6E;ARABIC LETTER PEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A6;;;;N;;;;; +FB6F;ARABIC LETTER PEHEH FINAL FORM;Lo;0;AL;<final> 06A6;;;;N;;;;; +FB70;ARABIC LETTER PEHEH INITIAL FORM;Lo;0;AL;<initial> 06A6;;;;N;;;;; +FB71;ARABIC LETTER PEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A6;;;;N;;;;; +FB72;ARABIC LETTER DYEH ISOLATED FORM;Lo;0;AL;<isolated> 0684;;;;N;;;;; +FB73;ARABIC LETTER DYEH FINAL FORM;Lo;0;AL;<final> 0684;;;;N;;;;; +FB74;ARABIC LETTER DYEH INITIAL FORM;Lo;0;AL;<initial> 0684;;;;N;;;;; +FB75;ARABIC LETTER DYEH MEDIAL FORM;Lo;0;AL;<medial> 0684;;;;N;;;;; +FB76;ARABIC LETTER NYEH ISOLATED FORM;Lo;0;AL;<isolated> 0683;;;;N;;;;; +FB77;ARABIC LETTER NYEH FINAL FORM;Lo;0;AL;<final> 0683;;;;N;;;;; +FB78;ARABIC LETTER NYEH INITIAL FORM;Lo;0;AL;<initial> 0683;;;;N;;;;; +FB79;ARABIC LETTER NYEH MEDIAL FORM;Lo;0;AL;<medial> 0683;;;;N;;;;; +FB7A;ARABIC LETTER TCHEH ISOLATED FORM;Lo;0;AL;<isolated> 0686;;;;N;;;;; +FB7B;ARABIC LETTER TCHEH FINAL FORM;Lo;0;AL;<final> 0686;;;;N;;;;; +FB7C;ARABIC LETTER TCHEH INITIAL FORM;Lo;0;AL;<initial> 0686;;;;N;;;;; +FB7D;ARABIC LETTER TCHEH MEDIAL FORM;Lo;0;AL;<medial> 0686;;;;N;;;;; +FB7E;ARABIC LETTER TCHEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0687;;;;N;;;;; +FB7F;ARABIC LETTER TCHEHEH FINAL FORM;Lo;0;AL;<final> 0687;;;;N;;;;; +FB80;ARABIC LETTER TCHEHEH INITIAL FORM;Lo;0;AL;<initial> 0687;;;;N;;;;; +FB81;ARABIC LETTER TCHEHEH MEDIAL FORM;Lo;0;AL;<medial> 0687;;;;N;;;;; +FB82;ARABIC LETTER DDAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068D;;;;N;;;;; +FB83;ARABIC LETTER DDAHAL FINAL FORM;Lo;0;AL;<final> 068D;;;;N;;;;; +FB84;ARABIC LETTER DAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068C;;;;N;;;;; +FB85;ARABIC LETTER DAHAL FINAL FORM;Lo;0;AL;<final> 068C;;;;N;;;;; +FB86;ARABIC LETTER DUL ISOLATED FORM;Lo;0;AL;<isolated> 068E;;;;N;;;;; +FB87;ARABIC LETTER DUL FINAL FORM;Lo;0;AL;<final> 068E;;;;N;;;;; +FB88;ARABIC LETTER DDAL ISOLATED FORM;Lo;0;AL;<isolated> 0688;;;;N;;;;; +FB89;ARABIC LETTER DDAL FINAL FORM;Lo;0;AL;<final> 0688;;;;N;;;;; +FB8A;ARABIC LETTER JEH ISOLATED FORM;Lo;0;AL;<isolated> 0698;;;;N;;;;; +FB8B;ARABIC LETTER JEH FINAL FORM;Lo;0;AL;<final> 0698;;;;N;;;;; +FB8C;ARABIC LETTER RREH ISOLATED FORM;Lo;0;AL;<isolated> 0691;;;;N;;;;; +FB8D;ARABIC LETTER RREH FINAL FORM;Lo;0;AL;<final> 0691;;;;N;;;;; +FB8E;ARABIC LETTER KEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A9;;;;N;;;;; +FB8F;ARABIC LETTER KEHEH FINAL FORM;Lo;0;AL;<final> 06A9;;;;N;;;;; +FB90;ARABIC LETTER KEHEH INITIAL FORM;Lo;0;AL;<initial> 06A9;;;;N;;;;; +FB91;ARABIC LETTER KEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A9;;;;N;;;;; +FB92;ARABIC LETTER GAF ISOLATED FORM;Lo;0;AL;<isolated> 06AF;;;;N;;;;; +FB93;ARABIC LETTER GAF FINAL FORM;Lo;0;AL;<final> 06AF;;;;N;;;;; +FB94;ARABIC LETTER GAF INITIAL FORM;Lo;0;AL;<initial> 06AF;;;;N;;;;; +FB95;ARABIC LETTER GAF MEDIAL FORM;Lo;0;AL;<medial> 06AF;;;;N;;;;; +FB96;ARABIC LETTER GUEH ISOLATED FORM;Lo;0;AL;<isolated> 06B3;;;;N;;;;; +FB97;ARABIC LETTER GUEH FINAL FORM;Lo;0;AL;<final> 06B3;;;;N;;;;; +FB98;ARABIC LETTER GUEH INITIAL FORM;Lo;0;AL;<initial> 06B3;;;;N;;;;; +FB99;ARABIC LETTER GUEH MEDIAL FORM;Lo;0;AL;<medial> 06B3;;;;N;;;;; +FB9A;ARABIC LETTER NGOEH ISOLATED FORM;Lo;0;AL;<isolated> 06B1;;;;N;;;;; +FB9B;ARABIC LETTER NGOEH FINAL FORM;Lo;0;AL;<final> 06B1;;;;N;;;;; +FB9C;ARABIC LETTER NGOEH INITIAL FORM;Lo;0;AL;<initial> 06B1;;;;N;;;;; +FB9D;ARABIC LETTER NGOEH MEDIAL FORM;Lo;0;AL;<medial> 06B1;;;;N;;;;; +FB9E;ARABIC LETTER NOON GHUNNA ISOLATED FORM;Lo;0;AL;<isolated> 06BA;;;;N;;;;; +FB9F;ARABIC LETTER NOON GHUNNA FINAL FORM;Lo;0;AL;<final> 06BA;;;;N;;;;; +FBA0;ARABIC LETTER RNOON ISOLATED FORM;Lo;0;AL;<isolated> 06BB;;;;N;;;;; +FBA1;ARABIC LETTER RNOON FINAL FORM;Lo;0;AL;<final> 06BB;;;;N;;;;; +FBA2;ARABIC LETTER RNOON INITIAL FORM;Lo;0;AL;<initial> 06BB;;;;N;;;;; +FBA3;ARABIC LETTER RNOON MEDIAL FORM;Lo;0;AL;<medial> 06BB;;;;N;;;;; +FBA4;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06C0;;;;N;;;;; +FBA5;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM;Lo;0;AL;<final> 06C0;;;;N;;;;; +FBA6;ARABIC LETTER HEH GOAL ISOLATED FORM;Lo;0;AL;<isolated> 06C1;;;;N;;;;; +FBA7;ARABIC LETTER HEH GOAL FINAL FORM;Lo;0;AL;<final> 06C1;;;;N;;;;; +FBA8;ARABIC LETTER HEH GOAL INITIAL FORM;Lo;0;AL;<initial> 06C1;;;;N;;;;; +FBA9;ARABIC LETTER HEH GOAL MEDIAL FORM;Lo;0;AL;<medial> 06C1;;;;N;;;;; +FBAA;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM;Lo;0;AL;<isolated> 06BE;;;;N;;;;; +FBAB;ARABIC LETTER HEH DOACHASHMEE FINAL FORM;Lo;0;AL;<final> 06BE;;;;N;;;;; +FBAC;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM;Lo;0;AL;<initial> 06BE;;;;N;;;;; +FBAD;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM;Lo;0;AL;<medial> 06BE;;;;N;;;;; +FBAE;ARABIC LETTER YEH BARREE ISOLATED FORM;Lo;0;AL;<isolated> 06D2;;;;N;;;;; +FBAF;ARABIC LETTER YEH BARREE FINAL FORM;Lo;0;AL;<final> 06D2;;;;N;;;;; +FBB0;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06D3;;;;N;;;;; +FBB1;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 06D3;;;;N;;;;; +FBD3;ARABIC LETTER NG ISOLATED FORM;Lo;0;AL;<isolated> 06AD;;;;N;;;;; +FBD4;ARABIC LETTER NG FINAL FORM;Lo;0;AL;<final> 06AD;;;;N;;;;; +FBD5;ARABIC LETTER NG INITIAL FORM;Lo;0;AL;<initial> 06AD;;;;N;;;;; +FBD6;ARABIC LETTER NG MEDIAL FORM;Lo;0;AL;<medial> 06AD;;;;N;;;;; +FBD7;ARABIC LETTER U ISOLATED FORM;Lo;0;AL;<isolated> 06C7;;;;N;;;;; +FBD8;ARABIC LETTER U FINAL FORM;Lo;0;AL;<final> 06C7;;;;N;;;;; +FBD9;ARABIC LETTER OE ISOLATED FORM;Lo;0;AL;<isolated> 06C6;;;;N;;;;; +FBDA;ARABIC LETTER OE FINAL FORM;Lo;0;AL;<final> 06C6;;;;N;;;;; +FBDB;ARABIC LETTER YU ISOLATED FORM;Lo;0;AL;<isolated> 06C8;;;;N;;;;; +FBDC;ARABIC LETTER YU FINAL FORM;Lo;0;AL;<final> 06C8;;;;N;;;;; +FBDD;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0677;;;;N;;;;; +FBDE;ARABIC LETTER VE ISOLATED FORM;Lo;0;AL;<isolated> 06CB;;;;N;;;;; +FBDF;ARABIC LETTER VE FINAL FORM;Lo;0;AL;<final> 06CB;;;;N;;;;; +FBE0;ARABIC LETTER KIRGHIZ OE ISOLATED FORM;Lo;0;AL;<isolated> 06C5;;;;N;;;;; +FBE1;ARABIC LETTER KIRGHIZ OE FINAL FORM;Lo;0;AL;<final> 06C5;;;;N;;;;; +FBE2;ARABIC LETTER KIRGHIZ YU ISOLATED FORM;Lo;0;AL;<isolated> 06C9;;;;N;;;;; +FBE3;ARABIC LETTER KIRGHIZ YU FINAL FORM;Lo;0;AL;<final> 06C9;;;;N;;;;; +FBE4;ARABIC LETTER E ISOLATED FORM;Lo;0;AL;<isolated> 06D0;;;;N;;;;; +FBE5;ARABIC LETTER E FINAL FORM;Lo;0;AL;<final> 06D0;;;;N;;;;; +FBE6;ARABIC LETTER E INITIAL FORM;Lo;0;AL;<initial> 06D0;;;;N;;;;; +FBE7;ARABIC LETTER E MEDIAL FORM;Lo;0;AL;<medial> 06D0;;;;N;;;;; +FBE8;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0649;;;;N;;;;; +FBE9;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM;Lo;0;AL;<medial> 0649;;;;N;;;;; +FBEA;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0626 0627;;;;N;;;;; +FBEB;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM;Lo;0;AL;<final> 0626 0627;;;;N;;;;; +FBEC;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D5;;;;N;;;;; +FBED;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM;Lo;0;AL;<final> 0626 06D5;;;;N;;;;; +FBEE;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM;Lo;0;AL;<isolated> 0626 0648;;;;N;;;;; +FBEF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM;Lo;0;AL;<final> 0626 0648;;;;N;;;;; +FBF0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C7;;;;N;;;;; +FBF1;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM;Lo;0;AL;<final> 0626 06C7;;;;N;;;;; +FBF2;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C6;;;;N;;;;; +FBF3;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM;Lo;0;AL;<final> 0626 06C6;;;;N;;;;; +FBF4;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C8;;;;N;;;;; +FBF5;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM;Lo;0;AL;<final> 0626 06C8;;;;N;;;;; +FBF6;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D0;;;;N;;;;; +FBF7;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM;Lo;0;AL;<final> 0626 06D0;;;;N;;;;; +FBF8;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM;Lo;0;AL;<initial> 0626 06D0;;;;N;;;;; +FBF9;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;; +FBFA;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;; +FBFB;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0626 0649;;;;N;;;;; +FBFC;ARABIC LETTER FARSI YEH ISOLATED FORM;Lo;0;AL;<isolated> 06CC;;;;N;;;;; +FBFD;ARABIC LETTER FARSI YEH FINAL FORM;Lo;0;AL;<final> 06CC;;;;N;;;;; +FBFE;ARABIC LETTER FARSI YEH INITIAL FORM;Lo;0;AL;<initial> 06CC;;;;N;;;;; +FBFF;ARABIC LETTER FARSI YEH MEDIAL FORM;Lo;0;AL;<medial> 06CC;;;;N;;;;; +FC00;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 062C;;;;N;;;;; +FC01;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0626 062D;;;;N;;;;; +FC02;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 0645;;;;N;;;;; +FC03;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;; +FC04;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0626 064A;;;;N;;;;; +FC05;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 062C;;;;N;;;;; +FC06;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062D;;;;N;;;;; +FC07;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062E;;;;N;;;;; +FC08;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 0645;;;;N;;;;; +FC09;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0628 0649;;;;N;;;;; +FC0A;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0628 064A;;;;N;;;;; +FC0B;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 062C;;;;N;;;;; +FC0C;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062D;;;;N;;;;; +FC0D;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062E;;;;N;;;;; +FC0E;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 0645;;;;N;;;;; +FC0F;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062A 0649;;;;N;;;;; +FC10;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062A 064A;;;;N;;;;; +FC11;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 062C;;;;N;;;;; +FC12;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 0645;;;;N;;;;; +FC13;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062B 0649;;;;N;;;;; +FC14;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062B 064A;;;;N;;;;; +FC15;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062C 062D;;;;N;;;;; +FC16;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C 0645;;;;N;;;;; +FC17;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 062C;;;;N;;;;; +FC18;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 0645;;;;N;;;;; +FC19;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 062C;;;;N;;;;; +FC1A;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062E 062D;;;;N;;;;; +FC1B;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 0645;;;;N;;;;; +FC1C;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 062C;;;;N;;;;; +FC1D;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062D;;;;N;;;;; +FC1E;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062E;;;;N;;;;; +FC1F;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 0645;;;;N;;;;; +FC20;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0635 062D;;;;N;;;;; +FC21;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0645;;;;N;;;;; +FC22;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 062C;;;;N;;;;; +FC23;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062D;;;;N;;;;; +FC24;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062E;;;;N;;;;; +FC25;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 0645;;;;N;;;;; +FC26;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0637 062D;;;;N;;;;; +FC27;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0637 0645;;;;N;;;;; +FC28;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0638 0645;;;;N;;;;; +FC29;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 062C;;;;N;;;;; +FC2A;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 0645;;;;N;;;;; +FC2B;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 062C;;;;N;;;;; +FC2C;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 0645;;;;N;;;;; +FC2D;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 062C;;;;N;;;;; +FC2E;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062D;;;;N;;;;; +FC2F;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062E;;;;N;;;;; +FC30;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 0645;;;;N;;;;; +FC31;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0641 0649;;;;N;;;;; +FC32;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0641 064A;;;;N;;;;; +FC33;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0642 062D;;;;N;;;;; +FC34;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0642 0645;;;;N;;;;; +FC35;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0642 0649;;;;N;;;;; +FC36;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0642 064A;;;;N;;;;; +FC37;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0643 0627;;;;N;;;;; +FC38;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 062C;;;;N;;;;; +FC39;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062D;;;;N;;;;; +FC3A;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062E;;;;N;;;;; +FC3B;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0644;;;;N;;;;; +FC3C;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0645;;;;N;;;;; +FC3D;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0643 0649;;;;N;;;;; +FC3E;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0643 064A;;;;N;;;;; +FC3F;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 062C;;;;N;;;;; +FC40;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062D;;;;N;;;;; +FC41;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062E;;;;N;;;;; +FC42;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 0645;;;;N;;;;; +FC43;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0644 0649;;;;N;;;;; +FC44;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0644 064A;;;;N;;;;; +FC45;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 062C;;;;N;;;;; +FC46;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D;;;;N;;;;; +FC47;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062E;;;;N;;;;; +FC48;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 0645;;;;N;;;;; +FC49;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0645 0649;;;;N;;;;; +FC4A;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0645 064A;;;;N;;;;; +FC4B;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 062C;;;;N;;;;; +FC4C;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062D;;;;N;;;;; +FC4D;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062E;;;;N;;;;; +FC4E;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 0645;;;;N;;;;; +FC4F;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0646 0649;;;;N;;;;; +FC50;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0646 064A;;;;N;;;;; +FC51;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 062C;;;;N;;;;; +FC52;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 0645;;;;N;;;;; +FC53;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0647 0649;;;;N;;;;; +FC54;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0647 064A;;;;N;;;;; +FC55;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 062C;;;;N;;;;; +FC56;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062D;;;;N;;;;; +FC57;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062E;;;;N;;;;; +FC58;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 0645;;;;N;;;;; +FC59;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 064A 0649;;;;N;;;;; +FC5A;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A 064A;;;;N;;;;; +FC5B;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0630 0670;;;;N;;;;; +FC5C;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0631 0670;;;;N;;;;; +FC5D;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0649 0670;;;;N;;;;; +FC5E;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C 0651;;;;N;;;;; +FC5F;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D 0651;;;;N;;;;; +FC60;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E 0651;;;;N;;;;; +FC61;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F 0651;;;;N;;;;; +FC62;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650 0651;;;;N;;;;; +FC63;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651 0670;;;;N;;;;; +FC64;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM;Lo;0;AL;<final> 0626 0631;;;;N;;;;; +FC65;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0626 0632;;;;N;;;;; +FC66;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM;Lo;0;AL;<final> 0626 0645;;;;N;;;;; +FC67;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM;Lo;0;AL;<final> 0626 0646;;;;N;;;;; +FC68;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;; +FC69;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM;Lo;0;AL;<final> 0626 064A;;;;N;;;;; +FC6A;ARABIC LIGATURE BEH WITH REH FINAL FORM;Lo;0;AL;<final> 0628 0631;;;;N;;;;; +FC6B;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0628 0632;;;;N;;;;; +FC6C;ARABIC LIGATURE BEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0628 0645;;;;N;;;;; +FC6D;ARABIC LIGATURE BEH WITH NOON FINAL FORM;Lo;0;AL;<final> 0628 0646;;;;N;;;;; +FC6E;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0628 0649;;;;N;;;;; +FC6F;ARABIC LIGATURE BEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 064A;;;;N;;;;; +FC70;ARABIC LIGATURE TEH WITH REH FINAL FORM;Lo;0;AL;<final> 062A 0631;;;;N;;;;; +FC71;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062A 0632;;;;N;;;;; +FC72;ARABIC LIGATURE TEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062A 0645;;;;N;;;;; +FC73;ARABIC LIGATURE TEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062A 0646;;;;N;;;;; +FC74;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0649;;;;N;;;;; +FC75;ARABIC LIGATURE TEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 064A;;;;N;;;;; +FC76;ARABIC LIGATURE THEH WITH REH FINAL FORM;Lo;0;AL;<final> 062B 0631;;;;N;;;;; +FC77;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062B 0632;;;;N;;;;; +FC78;ARABIC LIGATURE THEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062B 0645;;;;N;;;;; +FC79;ARABIC LIGATURE THEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062B 0646;;;;N;;;;; +FC7A;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062B 0649;;;;N;;;;; +FC7B;ARABIC LIGATURE THEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062B 064A;;;;N;;;;; +FC7C;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0641 0649;;;;N;;;;; +FC7D;ARABIC LIGATURE FEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 064A;;;;N;;;;; +FC7E;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0642 0649;;;;N;;;;; +FC7F;ARABIC LIGATURE QAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 064A;;;;N;;;;; +FC80;ARABIC LIGATURE KAF WITH ALEF FINAL FORM;Lo;0;AL;<final> 0643 0627;;;;N;;;;; +FC81;ARABIC LIGATURE KAF WITH LAM FINAL FORM;Lo;0;AL;<final> 0643 0644;;;;N;;;;; +FC82;ARABIC LIGATURE KAF WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645;;;;N;;;;; +FC83;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0643 0649;;;;N;;;;; +FC84;ARABIC LIGATURE KAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 064A;;;;N;;;;; +FC85;ARABIC LIGATURE LAM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 0645;;;;N;;;;; +FC86;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 0649;;;;N;;;;; +FC87;ARABIC LIGATURE LAM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 064A;;;;N;;;;; +FC88;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0645 0627;;;;N;;;;; +FC89;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0645 0645;;;;N;;;;; +FC8A;ARABIC LIGATURE NOON WITH REH FINAL FORM;Lo;0;AL;<final> 0646 0631;;;;N;;;;; +FC8B;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0646 0632;;;;N;;;;; +FC8C;ARABIC LIGATURE NOON WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 0645;;;;N;;;;; +FC8D;ARABIC LIGATURE NOON WITH NOON FINAL FORM;Lo;0;AL;<final> 0646 0646;;;;N;;;;; +FC8E;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0649;;;;N;;;;; +FC8F;ARABIC LIGATURE NOON WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 064A;;;;N;;;;; +FC90;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM;Lo;0;AL;<final> 0649 0670;;;;N;;;;; +FC91;ARABIC LIGATURE YEH WITH REH FINAL FORM;Lo;0;AL;<final> 064A 0631;;;;N;;;;; +FC92;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 064A 0632;;;;N;;;;; +FC93;ARABIC LIGATURE YEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645;;;;N;;;;; +FC94;ARABIC LIGATURE YEH WITH NOON FINAL FORM;Lo;0;AL;<final> 064A 0646;;;;N;;;;; +FC95;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 064A 0649;;;;N;;;;; +FC96;ARABIC LIGATURE YEH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 064A;;;;N;;;;; +FC97;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0626 062C;;;;N;;;;; +FC98;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0626 062D;;;;N;;;;; +FC99;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0626 062E;;;;N;;;;; +FC9A;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0626 0645;;;;N;;;;; +FC9B;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0626 0647;;;;N;;;;; +FC9C;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0628 062C;;;;N;;;;; +FC9D;ARABIC LIGATURE BEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0628 062D;;;;N;;;;; +FC9E;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0628 062E;;;;N;;;;; +FC9F;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0628 0645;;;;N;;;;; +FCA0;ARABIC LIGATURE BEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0628 0647;;;;N;;;;; +FCA1;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C;;;;N;;;;; +FCA2;ARABIC LIGATURE TEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 062D;;;;N;;;;; +FCA3;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 062E;;;;N;;;;; +FCA4;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645;;;;N;;;;; +FCA5;ARABIC LIGATURE TEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 062A 0647;;;;N;;;;; +FCA6;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062B 0645;;;;N;;;;; +FCA7;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 062D;;;;N;;;;; +FCA8;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062C 0645;;;;N;;;;; +FCA9;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062D 062C;;;;N;;;;; +FCAA;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062D 0645;;;;N;;;;; +FCAB;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062E 062C;;;;N;;;;; +FCAC;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062E 0645;;;;N;;;;; +FCAD;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062C;;;;N;;;;; +FCAE;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062D;;;;N;;;;; +FCAF;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0633 062E;;;;N;;;;; +FCB0;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645;;;;N;;;;; +FCB1;ARABIC LIGATURE SAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D;;;;N;;;;; +FCB2;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0635 062E;;;;N;;;;; +FCB3;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645;;;;N;;;;; +FCB4;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062C;;;;N;;;;; +FCB5;ARABIC LIGATURE DAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0636 062D;;;;N;;;;; +FCB6;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0636 062E;;;;N;;;;; +FCB7;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 0645;;;;N;;;;; +FCB8;ARABIC LIGATURE TAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 062D;;;;N;;;;; +FCB9;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0638 0645;;;;N;;;;; +FCBA;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C;;;;N;;;;; +FCBB;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645;;;;N;;;;; +FCBC;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 063A 062C;;;;N;;;;; +FCBD;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 063A 0645;;;;N;;;;; +FCBE;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062C;;;;N;;;;; +FCBF;ARABIC LIGATURE FEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0641 062D;;;;N;;;;; +FCC0;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0641 062E;;;;N;;;;; +FCC1;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 0645;;;;N;;;;; +FCC2;ARABIC LIGATURE QAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 062D;;;;N;;;;; +FCC3;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0642 0645;;;;N;;;;; +FCC4;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0643 062C;;;;N;;;;; +FCC5;ARABIC LIGATURE KAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0643 062D;;;;N;;;;; +FCC6;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0643 062E;;;;N;;;;; +FCC7;ARABIC LIGATURE KAF WITH LAM INITIAL FORM;Lo;0;AL;<initial> 0643 0644;;;;N;;;;; +FCC8;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645;;;;N;;;;; +FCC9;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C;;;;N;;;;; +FCCA;ARABIC LIGATURE LAM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 062D;;;;N;;;;; +FCCB;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0644 062E;;;;N;;;;; +FCCC;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 0645;;;;N;;;;; +FCCD;ARABIC LIGATURE LAM WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0644 0647;;;;N;;;;; +FCCE;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C;;;;N;;;;; +FCCF;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062D;;;;N;;;;; +FCD0;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062E;;;;N;;;;; +FCD1;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 0645;;;;N;;;;; +FCD2;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C;;;;N;;;;; +FCD3;ARABIC LIGATURE NOON WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062D;;;;N;;;;; +FCD4;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0646 062E;;;;N;;;;; +FCD5;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 0645;;;;N;;;;; +FCD6;ARABIC LIGATURE NOON WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0646 0647;;;;N;;;;; +FCD7;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 062C;;;;N;;;;; +FCD8;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645;;;;N;;;;; +FCD9;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM;Lo;0;AL;<initial> 0647 0670;;;;N;;;;; +FCDA;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 064A 062C;;;;N;;;;; +FCDB;ARABIC LIGATURE YEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 064A 062D;;;;N;;;;; +FCDC;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 064A 062E;;;;N;;;;; +FCDD;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645;;;;N;;;;; +FCDE;ARABIC LIGATURE YEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 064A 0647;;;;N;;;;; +FCDF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0626 0645;;;;N;;;;; +FCE0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0626 0647;;;;N;;;;; +FCE1;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0628 0645;;;;N;;;;; +FCE2;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0628 0647;;;;N;;;;; +FCE3;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062A 0645;;;;N;;;;; +FCE4;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062A 0647;;;;N;;;;; +FCE5;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062B 0645;;;;N;;;;; +FCE6;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062B 0647;;;;N;;;;; +FCE7;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 0645;;;;N;;;;; +FCE8;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0633 0647;;;;N;;;;; +FCE9;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 0645;;;;N;;;;; +FCEA;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0634 0647;;;;N;;;;; +FCEB;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM;Lo;0;AL;<medial> 0643 0644;;;;N;;;;; +FCEC;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0643 0645;;;;N;;;;; +FCED;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0644 0645;;;;N;;;;; +FCEE;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0646 0645;;;;N;;;;; +FCEF;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0646 0647;;;;N;;;;; +FCF0;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 064A 0645;;;;N;;;;; +FCF1;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 064A 0647;;;;N;;;;; +FCF2;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E 0651;;;;N;;;;; +FCF3;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F 0651;;;;N;;;;; +FCF4;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650 0651;;;;N;;;;; +FCF5;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0637 0649;;;;N;;;;; +FCF6;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0637 064A;;;;N;;;;; +FCF7;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0639 0649;;;;N;;;;; +FCF8;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0639 064A;;;;N;;;;; +FCF9;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 063A 0649;;;;N;;;;; +FCFA;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 063A 064A;;;;N;;;;; +FCFB;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0633 0649;;;;N;;;;; +FCFC;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0633 064A;;;;N;;;;; +FCFD;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0634 0649;;;;N;;;;; +FCFE;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0634 064A;;;;N;;;;; +FCFF;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062D 0649;;;;N;;;;; +FD00;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062D 064A;;;;N;;;;; +FD01;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062C 0649;;;;N;;;;; +FD02;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062C 064A;;;;N;;;;; +FD03;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062E 0649;;;;N;;;;; +FD04;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062E 064A;;;;N;;;;; +FD05;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0649;;;;N;;;;; +FD06;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0635 064A;;;;N;;;;; +FD07;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0636 0649;;;;N;;;;; +FD08;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0636 064A;;;;N;;;;; +FD09;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 062C;;;;N;;;;; +FD0A;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062D;;;;N;;;;; +FD0B;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062E;;;;N;;;;; +FD0C;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 0645;;;;N;;;;; +FD0D;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0634 0631;;;;N;;;;; +FD0E;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0633 0631;;;;N;;;;; +FD0F;ARABIC LIGATURE SAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0635 0631;;;;N;;;;; +FD10;ARABIC LIGATURE DAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0636 0631;;;;N;;;;; +FD11;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0637 0649;;;;N;;;;; +FD12;ARABIC LIGATURE TAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 064A;;;;N;;;;; +FD13;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0649;;;;N;;;;; +FD14;ARABIC LIGATURE AIN WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 064A;;;;N;;;;; +FD15;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0649;;;;N;;;;; +FD16;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 064A;;;;N;;;;; +FD17;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 0649;;;;N;;;;; +FD18;ARABIC LIGATURE SEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 064A;;;;N;;;;; +FD19;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0634 0649;;;;N;;;;; +FD1A;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 064A;;;;N;;;;; +FD1B;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0649;;;;N;;;;; +FD1C;ARABIC LIGATURE HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 064A;;;;N;;;;; +FD1D;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0649;;;;N;;;;; +FD1E;ARABIC LIGATURE JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 064A;;;;N;;;;; +FD1F;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062E 0649;;;;N;;;;; +FD20;ARABIC LIGATURE KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062E 064A;;;;N;;;;; +FD21;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0635 0649;;;;N;;;;; +FD22;ARABIC LIGATURE SAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 064A;;;;N;;;;; +FD23;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 0649;;;;N;;;;; +FD24;ARABIC LIGATURE DAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 064A;;;;N;;;;; +FD25;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM;Lo;0;AL;<final> 0634 062C;;;;N;;;;; +FD26;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM;Lo;0;AL;<final> 0634 062D;;;;N;;;;; +FD27;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 062E;;;;N;;;;; +FD28;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645;;;;N;;;;; +FD29;ARABIC LIGATURE SHEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0634 0631;;;;N;;;;; +FD2A;ARABIC LIGATURE SEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0633 0631;;;;N;;;;; +FD2B;ARABIC LIGATURE SAD WITH REH FINAL FORM;Lo;0;AL;<final> 0635 0631;;;;N;;;;; +FD2C;ARABIC LIGATURE DAD WITH REH FINAL FORM;Lo;0;AL;<final> 0636 0631;;;;N;;;;; +FD2D;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062C;;;;N;;;;; +FD2E;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0634 062D;;;;N;;;;; +FD2F;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 062E;;;;N;;;;; +FD30;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645;;;;N;;;;; +FD31;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0633 0647;;;;N;;;;; +FD32;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0634 0647;;;;N;;;;; +FD33;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645;;;;N;;;;; +FD34;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 062C;;;;N;;;;; +FD35;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062D;;;;N;;;;; +FD36;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062E;;;;N;;;;; +FD37;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 062C;;;;N;;;;; +FD38;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062D;;;;N;;;;; +FD39;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062E;;;;N;;;;; +FD3A;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0637 0645;;;;N;;;;; +FD3B;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0638 0645;;;;N;;;;; +FD3C;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM;Lo;0;AL;<final> 0627 064B;;;;N;;;;; +FD3D;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0627 064B;;;;N;;;;; +FD3E;ORNATE LEFT PARENTHESIS;Ps;0;ON;;;;;N;;;;; +FD3F;ORNATE RIGHT PARENTHESIS;Pe;0;ON;;;;;N;;;;; +FD50;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C 0645;;;;N;;;;; +FD51;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM;Lo;0;AL;<final> 062A 062D 062C;;;;N;;;;; +FD52;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 062C;;;;N;;;;; +FD53;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 0645;;;;N;;;;; +FD54;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062E 0645;;;;N;;;;; +FD55;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062C;;;;N;;;;; +FD56;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062D;;;;N;;;;; +FD57;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062E;;;;N;;;;; +FD58;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 062C 0645 062D;;;;N;;;;; +FD59;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 0645 062D;;;;N;;;;; +FD5A;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 0645 064A;;;;N;;;;; +FD5B;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0645 0649;;;;N;;;;; +FD5C;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062D 062C;;;;N;;;;; +FD5D;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062C 062D;;;;N;;;;; +FD5E;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062C 0649;;;;N;;;;; +FD5F;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0633 0645 062D;;;;N;;;;; +FD60;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062D;;;;N;;;;; +FD61;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062C;;;;N;;;;; +FD62;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0633 0645 0645;;;;N;;;;; +FD63;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 0645;;;;N;;;;; +FD64;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM;Lo;0;AL;<final> 0635 062D 062D;;;;N;;;;; +FD65;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D 062D;;;;N;;;;; +FD66;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0635 0645 0645;;;;N;;;;; +FD67;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 062D 0645;;;;N;;;;; +FD68;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062D 0645;;;;N;;;;; +FD69;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062C 064A;;;;N;;;;; +FD6A;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 0645 062E;;;;N;;;;; +FD6B;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 0645 062E;;;;N;;;;; +FD6C;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645 0645;;;;N;;;;; +FD6D;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645 0645;;;;N;;;;; +FD6E;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 062D 0649;;;;N;;;;; +FD6F;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0636 062E 0645;;;;N;;;;; +FD70;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062E 0645;;;;N;;;;; +FD71;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0637 0645 062D;;;;N;;;;; +FD72;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 0645 062D;;;;N;;;;; +FD73;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645 0645;;;;N;;;;; +FD74;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 0645 064A;;;;N;;;;; +FD75;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 062C 0645;;;;N;;;;; +FD76;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 0645 0645;;;;N;;;;; +FD77;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645 0645;;;;N;;;;; +FD78;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0645 0649;;;;N;;;;; +FD79;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 063A 0645 0645;;;;N;;;;; +FD7A;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 0645 064A;;;;N;;;;; +FD7B;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0645 0649;;;;N;;;;; +FD7C;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0641 062E 0645;;;;N;;;;; +FD7D;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062E 0645;;;;N;;;;; +FD7E;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0642 0645 062D;;;;N;;;;; +FD7F;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0642 0645 0645;;;;N;;;;; +FD80;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062D 0645;;;;N;;;;; +FD81;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062D 064A;;;;N;;;;; +FD82;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 062D 0649;;;;N;;;;; +FD83;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 062C;;;;N;;;;; +FD84;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 062C;;;;N;;;;; +FD85;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062E 0645;;;;N;;;;; +FD86;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062E 0645;;;;N;;;;; +FD87;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0644 0645 062D;;;;N;;;;; +FD88;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 0645 062D;;;;N;;;;; +FD89;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 062C;;;;N;;;;; +FD8A;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 0645;;;;N;;;;; +FD8B;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062D 064A;;;;N;;;;; +FD8C;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062D;;;;N;;;;; +FD8D;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C 0645;;;;N;;;;; +FD8E;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 062C;;;;N;;;;; +FD8F;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 0645;;;;N;;;;; +FD92;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062E;;;;N;;;;; +FD93;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 062C;;;;N;;;;; +FD94;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 0645;;;;N;;;;; +FD95;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062D 0645;;;;N;;;;; +FD96;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062D 0649;;;;N;;;;; +FD97;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 062C 0645;;;;N;;;;; +FD98;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C 0645;;;;N;;;;; +FD99;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062C 0649;;;;N;;;;; +FD9A;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 0645 064A;;;;N;;;;; +FD9B;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0645 0649;;;;N;;;;; +FD9C;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645 0645;;;;N;;;;; +FD9D;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645 0645;;;;N;;;;; +FD9E;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062E 064A;;;;N;;;;; +FD9F;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062C 064A;;;;N;;;;; +FDA0;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062C 0649;;;;N;;;;; +FDA1;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062E 064A;;;;N;;;;; +FDA2;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062E 0649;;;;N;;;;; +FDA3;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 0645 064A;;;;N;;;;; +FDA4;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0645 0649;;;;N;;;;; +FDA5;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 0645 064A;;;;N;;;;; +FDA6;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 062D 0649;;;;N;;;;; +FDA7;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0645 0649;;;;N;;;;; +FDA8;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062E 0649;;;;N;;;;; +FDA9;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 062D 064A;;;;N;;;;; +FDAA;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062D 064A;;;;N;;;;; +FDAB;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 062D 064A;;;;N;;;;; +FDAC;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062C 064A;;;;N;;;;; +FDAD;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 0645 064A;;;;N;;;;; +FDAE;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062D 064A;;;;N;;;;; +FDAF;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062C 064A;;;;N;;;;; +FDB0;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 0645 064A;;;;N;;;;; +FDB1;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 0645 064A;;;;N;;;;; +FDB2;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 0645 064A;;;;N;;;;; +FDB3;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062D 064A;;;;N;;;;; +FDB4;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 0645 062D;;;;N;;;;; +FDB5;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062D 0645;;;;N;;;;; +FDB6;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 0645 064A;;;;N;;;;; +FDB7;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 0645 064A;;;;N;;;;; +FDB8;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062C 062D;;;;N;;;;; +FDB9;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062E 064A;;;;N;;;;; +FDBA;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 0645;;;;N;;;;; +FDBB;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645 0645;;;;N;;;;; +FDBC;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 0645;;;;N;;;;; +FDBD;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0646 062C 062D;;;;N;;;;; +FDBE;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 062D 064A;;;;N;;;;; +FDBF;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 062C 064A;;;;N;;;;; +FDC0;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062C 064A;;;;N;;;;; +FDC1;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 0645 064A;;;;N;;;;; +FDC2;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062D 064A;;;;N;;;;; +FDC3;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645 0645;;;;N;;;;; +FDC4;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C 0645;;;;N;;;;; +FDC5;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645 0645;;;;N;;;;; +FDC6;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 062E 064A;;;;N;;;;; +FDC7;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062C 064A;;;;N;;;;; +FDF0;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 06D2;;;;N;;;;; +FDF1;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0642 0644 06D2;;;;N;;;;; +FDF2;ARABIC LIGATURE ALLAH ISOLATED FORM;Lo;0;AL;<isolated> 0627 0644 0644 0647;;;;N;;;;; +FDF3;ARABIC LIGATURE AKBAR ISOLATED FORM;Lo;0;AL;<isolated> 0627 0643 0628 0631;;;;N;;;;; +FDF4;ARABIC LIGATURE MOHAMMAD ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D 0645 062F;;;;N;;;;; +FDF5;ARABIC LIGATURE SALAM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0639 0645;;;;N;;;;; +FDF6;ARABIC LIGATURE RASOUL ISOLATED FORM;Lo;0;AL;<isolated> 0631 0633 0648 0644;;;;N;;;;; +FDF7;ARABIC LIGATURE ALAYHE ISOLATED FORM;Lo;0;AL;<isolated> 0639 0644 064A 0647;;;;N;;;;; +FDF8;ARABIC LIGATURE WASALLAM ISOLATED FORM;Lo;0;AL;<isolated> 0648 0633 0644 0645;;;;N;;;;; +FDF9;ARABIC LIGATURE SALLA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0649;;;;N;;;;; +FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL;<isolated> 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;;;;N;ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM;;;; +FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL;<isolated> 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;; +FDFC;RIAL SIGN;Sc;0;AL;<isolated> 0631 06CC 0627 0644;;;;N;;;;; +FDFD;ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM;So;0;ON;;;;;N;;;;; +FE00;VARIATION SELECTOR-1;Mn;0;NSM;;;;;N;;;;; +FE01;VARIATION SELECTOR-2;Mn;0;NSM;;;;;N;;;;; +FE02;VARIATION SELECTOR-3;Mn;0;NSM;;;;;N;;;;; +FE03;VARIATION SELECTOR-4;Mn;0;NSM;;;;;N;;;;; +FE04;VARIATION SELECTOR-5;Mn;0;NSM;;;;;N;;;;; +FE05;VARIATION SELECTOR-6;Mn;0;NSM;;;;;N;;;;; +FE06;VARIATION SELECTOR-7;Mn;0;NSM;;;;;N;;;;; +FE07;VARIATION SELECTOR-8;Mn;0;NSM;;;;;N;;;;; +FE08;VARIATION SELECTOR-9;Mn;0;NSM;;;;;N;;;;; +FE09;VARIATION SELECTOR-10;Mn;0;NSM;;;;;N;;;;; +FE0A;VARIATION SELECTOR-11;Mn;0;NSM;;;;;N;;;;; +FE0B;VARIATION SELECTOR-12;Mn;0;NSM;;;;;N;;;;; +FE0C;VARIATION SELECTOR-13;Mn;0;NSM;;;;;N;;;;; +FE0D;VARIATION SELECTOR-14;Mn;0;NSM;;;;;N;;;;; +FE0E;VARIATION SELECTOR-15;Mn;0;NSM;;;;;N;;;;; +FE0F;VARIATION SELECTOR-16;Mn;0;NSM;;;;;N;;;;; +FE10;PRESENTATION FORM FOR VERTICAL COMMA;Po;0;ON;<vertical> 002C;;;;N;;;;; +FE11;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA;Po;0;ON;<vertical> 3001;;;;N;;;;; +FE12;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP;Po;0;ON;<vertical> 3002;;;;N;;;;; +FE13;PRESENTATION FORM FOR VERTICAL COLON;Po;0;ON;<vertical> 003A;;;;N;;;;; +FE14;PRESENTATION FORM FOR VERTICAL SEMICOLON;Po;0;ON;<vertical> 003B;;;;N;;;;; +FE15;PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK;Po;0;ON;<vertical> 0021;;;;N;;;;; +FE16;PRESENTATION FORM FOR VERTICAL QUESTION MARK;Po;0;ON;<vertical> 003F;;;;N;;;;; +FE17;PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;<vertical> 3016;;;;N;;;;; +FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET;Pe;0;ON;<vertical> 3017;;;;N;;;;; +FE19;PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS;Po;0;ON;<vertical> 2026;;;;N;;;;; +FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE24;COMBINING MACRON LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE25;COMBINING MACRON RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE26;COMBINING CONJOINING MACRON;Mn;230;NSM;;;;;N;;;;; +FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON;<vertical> 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;; +FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON;<vertical> 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;; +FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON;<vertical> 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;; +FE33;PRESENTATION FORM FOR VERTICAL LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING UNDERSCORE;;;; +FE34;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE;;;; +FE35;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS;Ps;0;ON;<vertical> 0028;;;;N;GLYPH FOR VERTICAL OPENING PARENTHESIS;;;; +FE36;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS;Pe;0;ON;<vertical> 0029;;;;N;GLYPH FOR VERTICAL CLOSING PARENTHESIS;;;; +FE37;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET;Ps;0;ON;<vertical> 007B;;;;N;GLYPH FOR VERTICAL OPENING CURLY BRACKET;;;; +FE38;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET;Pe;0;ON;<vertical> 007D;;;;N;GLYPH FOR VERTICAL CLOSING CURLY BRACKET;;;; +FE39;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<vertical> 3014;;;;N;GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET;;;; +FE3A;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<vertical> 3015;;;;N;GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET;;;; +FE3B;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;<vertical> 3010;;;;N;GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET;;;; +FE3C;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;<vertical> 3011;;;;N;GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET;;;; +FE3D;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;<vertical> 300A;;;;N;GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET;;;; +FE3E;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;<vertical> 300B;;;;N;GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET;;;; +FE3F;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET;Ps;0;ON;<vertical> 3008;;;;N;GLYPH FOR VERTICAL OPENING ANGLE BRACKET;;;; +FE40;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET;Pe;0;ON;<vertical> 3009;;;;N;GLYPH FOR VERTICAL CLOSING ANGLE BRACKET;;;; +FE41;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET;Ps;0;ON;<vertical> 300C;;;;N;GLYPH FOR VERTICAL OPENING CORNER BRACKET;;;; +FE42;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET;Pe;0;ON;<vertical> 300D;;;;N;GLYPH FOR VERTICAL CLOSING CORNER BRACKET;;;; +FE43;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET;Ps;0;ON;<vertical> 300E;;;;N;GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET;;;; +FE44;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET;Pe;0;ON;<vertical> 300F;;;;N;GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET;;;; +FE45;SESAME DOT;Po;0;ON;;;;;N;;;;; +FE46;WHITE SESAME DOT;Po;0;ON;;;;;N;;;;; +FE47;PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET;Ps;0;ON;<vertical> 005B;;;;N;;;;; +FE48;PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET;Pe;0;ON;<vertical> 005D;;;;N;;;;; +FE49;DASHED OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DASHED OVERSCORE;;;; +FE4A;CENTRELINE OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING CENTERLINE OVERSCORE;;;; +FE4B;WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING WAVY OVERSCORE;;;; +FE4C;DOUBLE WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DOUBLE WAVY OVERSCORE;;;; +FE4D;DASHED LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING DASHED UNDERSCORE;;;; +FE4E;CENTRELINE LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING CENTERLINE UNDERSCORE;;;; +FE4F;WAVY LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING WAVY UNDERSCORE;;;; +FE50;SMALL COMMA;Po;0;CS;<small> 002C;;;;N;;;;; +FE51;SMALL IDEOGRAPHIC COMMA;Po;0;ON;<small> 3001;;;;N;;;;; +FE52;SMALL FULL STOP;Po;0;CS;<small> 002E;;;;N;SMALL PERIOD;;;; +FE54;SMALL SEMICOLON;Po;0;ON;<small> 003B;;;;N;;;;; +FE55;SMALL COLON;Po;0;CS;<small> 003A;;;;N;;;;; +FE56;SMALL QUESTION MARK;Po;0;ON;<small> 003F;;;;N;;;;; +FE57;SMALL EXCLAMATION MARK;Po;0;ON;<small> 0021;;;;N;;;;; +FE58;SMALL EM DASH;Pd;0;ON;<small> 2014;;;;N;;;;; +FE59;SMALL LEFT PARENTHESIS;Ps;0;ON;<small> 0028;;;;Y;SMALL OPENING PARENTHESIS;;;; +FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON;<small> 0029;;;;Y;SMALL CLOSING PARENTHESIS;;;; +FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON;<small> 007B;;;;Y;SMALL OPENING CURLY BRACKET;;;; +FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON;<small> 007D;;;;Y;SMALL CLOSING CURLY BRACKET;;;; +FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<small> 3014;;;;Y;SMALL OPENING TORTOISE SHELL BRACKET;;;; +FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<small> 3015;;;;Y;SMALL CLOSING TORTOISE SHELL BRACKET;;;; +FE5F;SMALL NUMBER SIGN;Po;0;ET;<small> 0023;;;;N;;;;; +FE60;SMALL AMPERSAND;Po;0;ON;<small> 0026;;;;N;;;;; +FE61;SMALL ASTERISK;Po;0;ON;<small> 002A;;;;N;;;;; +FE62;SMALL PLUS SIGN;Sm;0;ES;<small> 002B;;;;N;;;;; +FE63;SMALL HYPHEN-MINUS;Pd;0;ES;<small> 002D;;;;N;;;;; +FE64;SMALL LESS-THAN SIGN;Sm;0;ON;<small> 003C;;;;Y;;;;; +FE65;SMALL GREATER-THAN SIGN;Sm;0;ON;<small> 003E;;;;Y;;;;; +FE66;SMALL EQUALS SIGN;Sm;0;ON;<small> 003D;;;;N;;;;; +FE68;SMALL REVERSE SOLIDUS;Po;0;ON;<small> 005C;;;;N;SMALL BACKSLASH;;;; +FE69;SMALL DOLLAR SIGN;Sc;0;ET;<small> 0024;;;;N;;;;; +FE6A;SMALL PERCENT SIGN;Po;0;ET;<small> 0025;;;;N;;;;; +FE6B;SMALL COMMERCIAL AT;Po;0;ON;<small> 0040;;;;N;;;;; +FE70;ARABIC FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064B;;;;N;ARABIC SPACING FATHATAN;;;; +FE71;ARABIC TATWEEL WITH FATHATAN ABOVE;Lo;0;AL;<medial> 0640 064B;;;;N;ARABIC FATHATAN ON TATWEEL;;;; +FE72;ARABIC DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C;;;;N;ARABIC SPACING DAMMATAN;;;; +FE73;ARABIC TAIL FRAGMENT;Lo;0;AL;;;;;N;;;;; +FE74;ARABIC KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D;;;;N;ARABIC SPACING KASRATAN;;;; +FE76;ARABIC FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E;;;;N;ARABIC SPACING FATHAH;;;; +FE77;ARABIC FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E;;;;N;ARABIC FATHAH ON TATWEEL;;;; +FE78;ARABIC DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F;;;;N;ARABIC SPACING DAMMAH;;;; +FE79;ARABIC DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F;;;;N;ARABIC DAMMAH ON TATWEEL;;;; +FE7A;ARABIC KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650;;;;N;ARABIC SPACING KASRAH;;;; +FE7B;ARABIC KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650;;;;N;ARABIC KASRAH ON TATWEEL;;;; +FE7C;ARABIC SHADDA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651;;;;N;ARABIC SPACING SHADDAH;;;; +FE7D;ARABIC SHADDA MEDIAL FORM;Lo;0;AL;<medial> 0640 0651;;;;N;ARABIC SHADDAH ON TATWEEL;;;; +FE7E;ARABIC SUKUN ISOLATED FORM;Lo;0;AL;<isolated> 0020 0652;;;;N;ARABIC SPACING SUKUN;;;; +FE7F;ARABIC SUKUN MEDIAL FORM;Lo;0;AL;<medial> 0640 0652;;;;N;ARABIC SUKUN ON TATWEEL;;;; +FE80;ARABIC LETTER HAMZA ISOLATED FORM;Lo;0;AL;<isolated> 0621;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH;;;; +FE81;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF;;;; +FE82;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON ALEF;;;; +FE83;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF;;;; +FE84;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON ALEF;;;; +FE85;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0624;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW;;;; +FE86;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0624;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON WAW;;;; +FE87;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF;;;; +FE88;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF;;;; +FE89;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0626;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON YA;;;; +FE8A;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0626;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON YA;;;; +FE8B;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM;Lo;0;AL;<initial> 0626;;;;N;GLYPH FOR INITIAL ARABIC HAMZAH ON YA;;;; +FE8C;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM;Lo;0;AL;<medial> 0626;;;;N;GLYPH FOR MEDIAL ARABIC HAMZAH ON YA;;;; +FE8D;ARABIC LETTER ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0627;;;;N;GLYPH FOR ISOLATE ARABIC ALEF;;;; +FE8E;ARABIC LETTER ALEF FINAL FORM;Lo;0;AL;<final> 0627;;;;N;GLYPH FOR FINAL ARABIC ALEF;;;; +FE8F;ARABIC LETTER BEH ISOLATED FORM;Lo;0;AL;<isolated> 0628;;;;N;GLYPH FOR ISOLATE ARABIC BAA;;;; +FE90;ARABIC LETTER BEH FINAL FORM;Lo;0;AL;<final> 0628;;;;N;GLYPH FOR FINAL ARABIC BAA;;;; +FE91;ARABIC LETTER BEH INITIAL FORM;Lo;0;AL;<initial> 0628;;;;N;GLYPH FOR INITIAL ARABIC BAA;;;; +FE92;ARABIC LETTER BEH MEDIAL FORM;Lo;0;AL;<medial> 0628;;;;N;GLYPH FOR MEDIAL ARABIC BAA;;;; +FE93;ARABIC LETTER TEH MARBUTA ISOLATED FORM;Lo;0;AL;<isolated> 0629;;;;N;GLYPH FOR ISOLATE ARABIC TAA MARBUTAH;;;; +FE94;ARABIC LETTER TEH MARBUTA FINAL FORM;Lo;0;AL;<final> 0629;;;;N;GLYPH FOR FINAL ARABIC TAA MARBUTAH;;;; +FE95;ARABIC LETTER TEH ISOLATED FORM;Lo;0;AL;<isolated> 062A;;;;N;GLYPH FOR ISOLATE ARABIC TAA;;;; +FE96;ARABIC LETTER TEH FINAL FORM;Lo;0;AL;<final> 062A;;;;N;GLYPH FOR FINAL ARABIC TAA;;;; +FE97;ARABIC LETTER TEH INITIAL FORM;Lo;0;AL;<initial> 062A;;;;N;GLYPH FOR INITIAL ARABIC TAA;;;; +FE98;ARABIC LETTER TEH MEDIAL FORM;Lo;0;AL;<medial> 062A;;;;N;GLYPH FOR MEDIAL ARABIC TAA;;;; +FE99;ARABIC LETTER THEH ISOLATED FORM;Lo;0;AL;<isolated> 062B;;;;N;GLYPH FOR ISOLATE ARABIC THAA;;;; +FE9A;ARABIC LETTER THEH FINAL FORM;Lo;0;AL;<final> 062B;;;;N;GLYPH FOR FINAL ARABIC THAA;;;; +FE9B;ARABIC LETTER THEH INITIAL FORM;Lo;0;AL;<initial> 062B;;;;N;GLYPH FOR INITIAL ARABIC THAA;;;; +FE9C;ARABIC LETTER THEH MEDIAL FORM;Lo;0;AL;<medial> 062B;;;;N;GLYPH FOR MEDIAL ARABIC THAA;;;; +FE9D;ARABIC LETTER JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C;;;;N;GLYPH FOR ISOLATE ARABIC JEEM;;;; +FE9E;ARABIC LETTER JEEM FINAL FORM;Lo;0;AL;<final> 062C;;;;N;GLYPH FOR FINAL ARABIC JEEM;;;; +FE9F;ARABIC LETTER JEEM INITIAL FORM;Lo;0;AL;<initial> 062C;;;;N;GLYPH FOR INITIAL ARABIC JEEM;;;; +FEA0;ARABIC LETTER JEEM MEDIAL FORM;Lo;0;AL;<medial> 062C;;;;N;GLYPH FOR MEDIAL ARABIC JEEM;;;; +FEA1;ARABIC LETTER HAH ISOLATED FORM;Lo;0;AL;<isolated> 062D;;;;N;GLYPH FOR ISOLATE ARABIC HAA;;;; +FEA2;ARABIC LETTER HAH FINAL FORM;Lo;0;AL;<final> 062D;;;;N;GLYPH FOR FINAL ARABIC HAA;;;; +FEA3;ARABIC LETTER HAH INITIAL FORM;Lo;0;AL;<initial> 062D;;;;N;GLYPH FOR INITIAL ARABIC HAA;;;; +FEA4;ARABIC LETTER HAH MEDIAL FORM;Lo;0;AL;<medial> 062D;;;;N;GLYPH FOR MEDIAL ARABIC HAA;;;; +FEA5;ARABIC LETTER KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062E;;;;N;GLYPH FOR ISOLATE ARABIC KHAA;;;; +FEA6;ARABIC LETTER KHAH FINAL FORM;Lo;0;AL;<final> 062E;;;;N;GLYPH FOR FINAL ARABIC KHAA;;;; +FEA7;ARABIC LETTER KHAH INITIAL FORM;Lo;0;AL;<initial> 062E;;;;N;GLYPH FOR INITIAL ARABIC KHAA;;;; +FEA8;ARABIC LETTER KHAH MEDIAL FORM;Lo;0;AL;<medial> 062E;;;;N;GLYPH FOR MEDIAL ARABIC KHAA;;;; +FEA9;ARABIC LETTER DAL ISOLATED FORM;Lo;0;AL;<isolated> 062F;;;;N;GLYPH FOR ISOLATE ARABIC DAL;;;; +FEAA;ARABIC LETTER DAL FINAL FORM;Lo;0;AL;<final> 062F;;;;N;GLYPH FOR FINAL ARABIC DAL;;;; +FEAB;ARABIC LETTER THAL ISOLATED FORM;Lo;0;AL;<isolated> 0630;;;;N;GLYPH FOR ISOLATE ARABIC THAL;;;; +FEAC;ARABIC LETTER THAL FINAL FORM;Lo;0;AL;<final> 0630;;;;N;GLYPH FOR FINAL ARABIC THAL;;;; +FEAD;ARABIC LETTER REH ISOLATED FORM;Lo;0;AL;<isolated> 0631;;;;N;GLYPH FOR ISOLATE ARABIC RA;;;; +FEAE;ARABIC LETTER REH FINAL FORM;Lo;0;AL;<final> 0631;;;;N;GLYPH FOR FINAL ARABIC RA;;;; +FEAF;ARABIC LETTER ZAIN ISOLATED FORM;Lo;0;AL;<isolated> 0632;;;;N;GLYPH FOR ISOLATE ARABIC ZAIN;;;; +FEB0;ARABIC LETTER ZAIN FINAL FORM;Lo;0;AL;<final> 0632;;;;N;GLYPH FOR FINAL ARABIC ZAIN;;;; +FEB1;ARABIC LETTER SEEN ISOLATED FORM;Lo;0;AL;<isolated> 0633;;;;N;GLYPH FOR ISOLATE ARABIC SEEN;;;; +FEB2;ARABIC LETTER SEEN FINAL FORM;Lo;0;AL;<final> 0633;;;;N;GLYPH FOR FINAL ARABIC SEEN;;;; +FEB3;ARABIC LETTER SEEN INITIAL FORM;Lo;0;AL;<initial> 0633;;;;N;GLYPH FOR INITIAL ARABIC SEEN;;;; +FEB4;ARABIC LETTER SEEN MEDIAL FORM;Lo;0;AL;<medial> 0633;;;;N;GLYPH FOR MEDIAL ARABIC SEEN;;;; +FEB5;ARABIC LETTER SHEEN ISOLATED FORM;Lo;0;AL;<isolated> 0634;;;;N;GLYPH FOR ISOLATE ARABIC SHEEN;;;; +FEB6;ARABIC LETTER SHEEN FINAL FORM;Lo;0;AL;<final> 0634;;;;N;GLYPH FOR FINAL ARABIC SHEEN;;;; +FEB7;ARABIC LETTER SHEEN INITIAL FORM;Lo;0;AL;<initial> 0634;;;;N;GLYPH FOR INITIAL ARABIC SHEEN;;;; +FEB8;ARABIC LETTER SHEEN MEDIAL FORM;Lo;0;AL;<medial> 0634;;;;N;GLYPH FOR MEDIAL ARABIC SHEEN;;;; +FEB9;ARABIC LETTER SAD ISOLATED FORM;Lo;0;AL;<isolated> 0635;;;;N;GLYPH FOR ISOLATE ARABIC SAD;;;; +FEBA;ARABIC LETTER SAD FINAL FORM;Lo;0;AL;<final> 0635;;;;N;GLYPH FOR FINAL ARABIC SAD;;;; +FEBB;ARABIC LETTER SAD INITIAL FORM;Lo;0;AL;<initial> 0635;;;;N;GLYPH FOR INITIAL ARABIC SAD;;;; +FEBC;ARABIC LETTER SAD MEDIAL FORM;Lo;0;AL;<medial> 0635;;;;N;GLYPH FOR MEDIAL ARABIC SAD;;;; +FEBD;ARABIC LETTER DAD ISOLATED FORM;Lo;0;AL;<isolated> 0636;;;;N;GLYPH FOR ISOLATE ARABIC DAD;;;; +FEBE;ARABIC LETTER DAD FINAL FORM;Lo;0;AL;<final> 0636;;;;N;GLYPH FOR FINAL ARABIC DAD;;;; +FEBF;ARABIC LETTER DAD INITIAL FORM;Lo;0;AL;<initial> 0636;;;;N;GLYPH FOR INITIAL ARABIC DAD;;;; +FEC0;ARABIC LETTER DAD MEDIAL FORM;Lo;0;AL;<medial> 0636;;;;N;GLYPH FOR MEDIAL ARABIC DAD;;;; +FEC1;ARABIC LETTER TAH ISOLATED FORM;Lo;0;AL;<isolated> 0637;;;;N;GLYPH FOR ISOLATE ARABIC TAH;;;; +FEC2;ARABIC LETTER TAH FINAL FORM;Lo;0;AL;<final> 0637;;;;N;GLYPH FOR FINAL ARABIC TAH;;;; +FEC3;ARABIC LETTER TAH INITIAL FORM;Lo;0;AL;<initial> 0637;;;;N;GLYPH FOR INITIAL ARABIC TAH;;;; +FEC4;ARABIC LETTER TAH MEDIAL FORM;Lo;0;AL;<medial> 0637;;;;N;GLYPH FOR MEDIAL ARABIC TAH;;;; +FEC5;ARABIC LETTER ZAH ISOLATED FORM;Lo;0;AL;<isolated> 0638;;;;N;GLYPH FOR ISOLATE ARABIC DHAH;;;; +FEC6;ARABIC LETTER ZAH FINAL FORM;Lo;0;AL;<final> 0638;;;;N;GLYPH FOR FINAL ARABIC DHAH;;;; +FEC7;ARABIC LETTER ZAH INITIAL FORM;Lo;0;AL;<initial> 0638;;;;N;GLYPH FOR INITIAL ARABIC DHAH;;;; +FEC8;ARABIC LETTER ZAH MEDIAL FORM;Lo;0;AL;<medial> 0638;;;;N;GLYPH FOR MEDIAL ARABIC DHAH;;;; +FEC9;ARABIC LETTER AIN ISOLATED FORM;Lo;0;AL;<isolated> 0639;;;;N;GLYPH FOR ISOLATE ARABIC AIN;;;; +FECA;ARABIC LETTER AIN FINAL FORM;Lo;0;AL;<final> 0639;;;;N;GLYPH FOR FINAL ARABIC AIN;;;; +FECB;ARABIC LETTER AIN INITIAL FORM;Lo;0;AL;<initial> 0639;;;;N;GLYPH FOR INITIAL ARABIC AIN;;;; +FECC;ARABIC LETTER AIN MEDIAL FORM;Lo;0;AL;<medial> 0639;;;;N;GLYPH FOR MEDIAL ARABIC AIN;;;; +FECD;ARABIC LETTER GHAIN ISOLATED FORM;Lo;0;AL;<isolated> 063A;;;;N;GLYPH FOR ISOLATE ARABIC GHAIN;;;; +FECE;ARABIC LETTER GHAIN FINAL FORM;Lo;0;AL;<final> 063A;;;;N;GLYPH FOR FINAL ARABIC GHAIN;;;; +FECF;ARABIC LETTER GHAIN INITIAL FORM;Lo;0;AL;<initial> 063A;;;;N;GLYPH FOR INITIAL ARABIC GHAIN;;;; +FED0;ARABIC LETTER GHAIN MEDIAL FORM;Lo;0;AL;<medial> 063A;;;;N;GLYPH FOR MEDIAL ARABIC GHAIN;;;; +FED1;ARABIC LETTER FEH ISOLATED FORM;Lo;0;AL;<isolated> 0641;;;;N;GLYPH FOR ISOLATE ARABIC FA;;;; +FED2;ARABIC LETTER FEH FINAL FORM;Lo;0;AL;<final> 0641;;;;N;GLYPH FOR FINAL ARABIC FA;;;; +FED3;ARABIC LETTER FEH INITIAL FORM;Lo;0;AL;<initial> 0641;;;;N;GLYPH FOR INITIAL ARABIC FA;;;; +FED4;ARABIC LETTER FEH MEDIAL FORM;Lo;0;AL;<medial> 0641;;;;N;GLYPH FOR MEDIAL ARABIC FA;;;; +FED5;ARABIC LETTER QAF ISOLATED FORM;Lo;0;AL;<isolated> 0642;;;;N;GLYPH FOR ISOLATE ARABIC QAF;;;; +FED6;ARABIC LETTER QAF FINAL FORM;Lo;0;AL;<final> 0642;;;;N;GLYPH FOR FINAL ARABIC QAF;;;; +FED7;ARABIC LETTER QAF INITIAL FORM;Lo;0;AL;<initial> 0642;;;;N;GLYPH FOR INITIAL ARABIC QAF;;;; +FED8;ARABIC LETTER QAF MEDIAL FORM;Lo;0;AL;<medial> 0642;;;;N;GLYPH FOR MEDIAL ARABIC QAF;;;; +FED9;ARABIC LETTER KAF ISOLATED FORM;Lo;0;AL;<isolated> 0643;;;;N;GLYPH FOR ISOLATE ARABIC CAF;;;; +FEDA;ARABIC LETTER KAF FINAL FORM;Lo;0;AL;<final> 0643;;;;N;GLYPH FOR FINAL ARABIC CAF;;;; +FEDB;ARABIC LETTER KAF INITIAL FORM;Lo;0;AL;<initial> 0643;;;;N;GLYPH FOR INITIAL ARABIC CAF;;;; +FEDC;ARABIC LETTER KAF MEDIAL FORM;Lo;0;AL;<medial> 0643;;;;N;GLYPH FOR MEDIAL ARABIC CAF;;;; +FEDD;ARABIC LETTER LAM ISOLATED FORM;Lo;0;AL;<isolated> 0644;;;;N;GLYPH FOR ISOLATE ARABIC LAM;;;; +FEDE;ARABIC LETTER LAM FINAL FORM;Lo;0;AL;<final> 0644;;;;N;GLYPH FOR FINAL ARABIC LAM;;;; +FEDF;ARABIC LETTER LAM INITIAL FORM;Lo;0;AL;<initial> 0644;;;;N;GLYPH FOR INITIAL ARABIC LAM;;;; +FEE0;ARABIC LETTER LAM MEDIAL FORM;Lo;0;AL;<medial> 0644;;;;N;GLYPH FOR MEDIAL ARABIC LAM;;;; +FEE1;ARABIC LETTER MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645;;;;N;GLYPH FOR ISOLATE ARABIC MEEM;;;; +FEE2;ARABIC LETTER MEEM FINAL FORM;Lo;0;AL;<final> 0645;;;;N;GLYPH FOR FINAL ARABIC MEEM;;;; +FEE3;ARABIC LETTER MEEM INITIAL FORM;Lo;0;AL;<initial> 0645;;;;N;GLYPH FOR INITIAL ARABIC MEEM;;;; +FEE4;ARABIC LETTER MEEM MEDIAL FORM;Lo;0;AL;<medial> 0645;;;;N;GLYPH FOR MEDIAL ARABIC MEEM;;;; +FEE5;ARABIC LETTER NOON ISOLATED FORM;Lo;0;AL;<isolated> 0646;;;;N;GLYPH FOR ISOLATE ARABIC NOON;;;; +FEE6;ARABIC LETTER NOON FINAL FORM;Lo;0;AL;<final> 0646;;;;N;GLYPH FOR FINAL ARABIC NOON;;;; +FEE7;ARABIC LETTER NOON INITIAL FORM;Lo;0;AL;<initial> 0646;;;;N;GLYPH FOR INITIAL ARABIC NOON;;;; +FEE8;ARABIC LETTER NOON MEDIAL FORM;Lo;0;AL;<medial> 0646;;;;N;GLYPH FOR MEDIAL ARABIC NOON;;;; +FEE9;ARABIC LETTER HEH ISOLATED FORM;Lo;0;AL;<isolated> 0647;;;;N;GLYPH FOR ISOLATE ARABIC HA;;;; +FEEA;ARABIC LETTER HEH FINAL FORM;Lo;0;AL;<final> 0647;;;;N;GLYPH FOR FINAL ARABIC HA;;;; +FEEB;ARABIC LETTER HEH INITIAL FORM;Lo;0;AL;<initial> 0647;;;;N;GLYPH FOR INITIAL ARABIC HA;;;; +FEEC;ARABIC LETTER HEH MEDIAL FORM;Lo;0;AL;<medial> 0647;;;;N;GLYPH FOR MEDIAL ARABIC HA;;;; +FEED;ARABIC LETTER WAW ISOLATED FORM;Lo;0;AL;<isolated> 0648;;;;N;GLYPH FOR ISOLATE ARABIC WAW;;;; +FEEE;ARABIC LETTER WAW FINAL FORM;Lo;0;AL;<final> 0648;;;;N;GLYPH FOR FINAL ARABIC WAW;;;; +FEEF;ARABIC LETTER ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0649;;;;N;GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH;;;; +FEF0;ARABIC LETTER ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0649;;;;N;GLYPH FOR FINAL ARABIC ALEF MAQSURAH;;;; +FEF1;ARABIC LETTER YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A;;;;N;GLYPH FOR ISOLATE ARABIC YA;;;; +FEF2;ARABIC LETTER YEH FINAL FORM;Lo;0;AL;<final> 064A;;;;N;GLYPH FOR FINAL ARABIC YA;;;; +FEF3;ARABIC LETTER YEH INITIAL FORM;Lo;0;AL;<initial> 064A;;;;N;GLYPH FOR INITIAL ARABIC YA;;;; +FEF4;ARABIC LETTER YEH MEDIAL FORM;Lo;0;AL;<medial> 064A;;;;N;GLYPH FOR MEDIAL ARABIC YA;;;; +FEF5;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF;;;; +FEF6;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF;;;; +FEF7;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; +FEF8;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; +FEF9;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0644 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; +FEFA;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0644 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; +FEFB;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0644 0627;;;;N;GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF;;;; +FEFC;ARABIC LIGATURE LAM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0644 0627;;;;N;GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF;;;; +FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;; +FF01;FULLWIDTH EXCLAMATION MARK;Po;0;ON;<wide> 0021;;;;N;;;;; +FF02;FULLWIDTH QUOTATION MARK;Po;0;ON;<wide> 0022;;;;N;;;;; +FF03;FULLWIDTH NUMBER SIGN;Po;0;ET;<wide> 0023;;;;N;;;;; +FF04;FULLWIDTH DOLLAR SIGN;Sc;0;ET;<wide> 0024;;;;N;;;;; +FF05;FULLWIDTH PERCENT SIGN;Po;0;ET;<wide> 0025;;;;N;;;;; +FF06;FULLWIDTH AMPERSAND;Po;0;ON;<wide> 0026;;;;N;;;;; +FF07;FULLWIDTH APOSTROPHE;Po;0;ON;<wide> 0027;;;;N;;;;; +FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON;<wide> 0028;;;;Y;FULLWIDTH OPENING PARENTHESIS;;;; +FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON;<wide> 0029;;;;Y;FULLWIDTH CLOSING PARENTHESIS;;;; +FF0A;FULLWIDTH ASTERISK;Po;0;ON;<wide> 002A;;;;N;;;;; +FF0B;FULLWIDTH PLUS SIGN;Sm;0;ES;<wide> 002B;;;;N;;;;; +FF0C;FULLWIDTH COMMA;Po;0;CS;<wide> 002C;;;;N;;;;; +FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ES;<wide> 002D;;;;N;;;;; +FF0E;FULLWIDTH FULL STOP;Po;0;CS;<wide> 002E;;;;N;FULLWIDTH PERIOD;;;; +FF0F;FULLWIDTH SOLIDUS;Po;0;CS;<wide> 002F;;;;N;FULLWIDTH SLASH;;;; +FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN;<wide> 0030;0;0;0;N;;;;; +FF11;FULLWIDTH DIGIT ONE;Nd;0;EN;<wide> 0031;1;1;1;N;;;;; +FF12;FULLWIDTH DIGIT TWO;Nd;0;EN;<wide> 0032;2;2;2;N;;;;; +FF13;FULLWIDTH DIGIT THREE;Nd;0;EN;<wide> 0033;3;3;3;N;;;;; +FF14;FULLWIDTH DIGIT FOUR;Nd;0;EN;<wide> 0034;4;4;4;N;;;;; +FF15;FULLWIDTH DIGIT FIVE;Nd;0;EN;<wide> 0035;5;5;5;N;;;;; +FF16;FULLWIDTH DIGIT SIX;Nd;0;EN;<wide> 0036;6;6;6;N;;;;; +FF17;FULLWIDTH DIGIT SEVEN;Nd;0;EN;<wide> 0037;7;7;7;N;;;;; +FF18;FULLWIDTH DIGIT EIGHT;Nd;0;EN;<wide> 0038;8;8;8;N;;;;; +FF19;FULLWIDTH DIGIT NINE;Nd;0;EN;<wide> 0039;9;9;9;N;;;;; +FF1A;FULLWIDTH COLON;Po;0;CS;<wide> 003A;;;;N;;;;; +FF1B;FULLWIDTH SEMICOLON;Po;0;ON;<wide> 003B;;;;N;;;;; +FF1C;FULLWIDTH LESS-THAN SIGN;Sm;0;ON;<wide> 003C;;;;Y;;;;; +FF1D;FULLWIDTH EQUALS SIGN;Sm;0;ON;<wide> 003D;;;;N;;;;; +FF1E;FULLWIDTH GREATER-THAN SIGN;Sm;0;ON;<wide> 003E;;;;Y;;;;; +FF1F;FULLWIDTH QUESTION MARK;Po;0;ON;<wide> 003F;;;;N;;;;; +FF20;FULLWIDTH COMMERCIAL AT;Po;0;ON;<wide> 0040;;;;N;;;;; +FF21;FULLWIDTH LATIN CAPITAL LETTER A;Lu;0;L;<wide> 0041;;;;N;;;;FF41; +FF22;FULLWIDTH LATIN CAPITAL LETTER B;Lu;0;L;<wide> 0042;;;;N;;;;FF42; +FF23;FULLWIDTH LATIN CAPITAL LETTER C;Lu;0;L;<wide> 0043;;;;N;;;;FF43; +FF24;FULLWIDTH LATIN CAPITAL LETTER D;Lu;0;L;<wide> 0044;;;;N;;;;FF44; +FF25;FULLWIDTH LATIN CAPITAL LETTER E;Lu;0;L;<wide> 0045;;;;N;;;;FF45; +FF26;FULLWIDTH LATIN CAPITAL LETTER F;Lu;0;L;<wide> 0046;;;;N;;;;FF46; +FF27;FULLWIDTH LATIN CAPITAL LETTER G;Lu;0;L;<wide> 0047;;;;N;;;;FF47; +FF28;FULLWIDTH LATIN CAPITAL LETTER H;Lu;0;L;<wide> 0048;;;;N;;;;FF48; +FF29;FULLWIDTH LATIN CAPITAL LETTER I;Lu;0;L;<wide> 0049;;;;N;;;;FF49; +FF2A;FULLWIDTH LATIN CAPITAL LETTER J;Lu;0;L;<wide> 004A;;;;N;;;;FF4A; +FF2B;FULLWIDTH LATIN CAPITAL LETTER K;Lu;0;L;<wide> 004B;;;;N;;;;FF4B; +FF2C;FULLWIDTH LATIN CAPITAL LETTER L;Lu;0;L;<wide> 004C;;;;N;;;;FF4C; +FF2D;FULLWIDTH LATIN CAPITAL LETTER M;Lu;0;L;<wide> 004D;;;;N;;;;FF4D; +FF2E;FULLWIDTH LATIN CAPITAL LETTER N;Lu;0;L;<wide> 004E;;;;N;;;;FF4E; +FF2F;FULLWIDTH LATIN CAPITAL LETTER O;Lu;0;L;<wide> 004F;;;;N;;;;FF4F; +FF30;FULLWIDTH LATIN CAPITAL LETTER P;Lu;0;L;<wide> 0050;;;;N;;;;FF50; +FF31;FULLWIDTH LATIN CAPITAL LETTER Q;Lu;0;L;<wide> 0051;;;;N;;;;FF51; +FF32;FULLWIDTH LATIN CAPITAL LETTER R;Lu;0;L;<wide> 0052;;;;N;;;;FF52; +FF33;FULLWIDTH LATIN CAPITAL LETTER S;Lu;0;L;<wide> 0053;;;;N;;;;FF53; +FF34;FULLWIDTH LATIN CAPITAL LETTER T;Lu;0;L;<wide> 0054;;;;N;;;;FF54; +FF35;FULLWIDTH LATIN CAPITAL LETTER U;Lu;0;L;<wide> 0055;;;;N;;;;FF55; +FF36;FULLWIDTH LATIN CAPITAL LETTER V;Lu;0;L;<wide> 0056;;;;N;;;;FF56; +FF37;FULLWIDTH LATIN CAPITAL LETTER W;Lu;0;L;<wide> 0057;;;;N;;;;FF57; +FF38;FULLWIDTH LATIN CAPITAL LETTER X;Lu;0;L;<wide> 0058;;;;N;;;;FF58; +FF39;FULLWIDTH LATIN CAPITAL LETTER Y;Lu;0;L;<wide> 0059;;;;N;;;;FF59; +FF3A;FULLWIDTH LATIN CAPITAL LETTER Z;Lu;0;L;<wide> 005A;;;;N;;;;FF5A; +FF3B;FULLWIDTH LEFT SQUARE BRACKET;Ps;0;ON;<wide> 005B;;;;Y;FULLWIDTH OPENING SQUARE BRACKET;;;; +FF3C;FULLWIDTH REVERSE SOLIDUS;Po;0;ON;<wide> 005C;;;;N;FULLWIDTH BACKSLASH;;;; +FF3D;FULLWIDTH RIGHT SQUARE BRACKET;Pe;0;ON;<wide> 005D;;;;Y;FULLWIDTH CLOSING SQUARE BRACKET;;;; +FF3E;FULLWIDTH CIRCUMFLEX ACCENT;Sk;0;ON;<wide> 005E;;;;N;FULLWIDTH SPACING CIRCUMFLEX;;;; +FF3F;FULLWIDTH LOW LINE;Pc;0;ON;<wide> 005F;;;;N;FULLWIDTH SPACING UNDERSCORE;;;; +FF40;FULLWIDTH GRAVE ACCENT;Sk;0;ON;<wide> 0060;;;;N;FULLWIDTH SPACING GRAVE;;;; +FF41;FULLWIDTH LATIN SMALL LETTER A;Ll;0;L;<wide> 0061;;;;N;;;FF21;;FF21 +FF42;FULLWIDTH LATIN SMALL LETTER B;Ll;0;L;<wide> 0062;;;;N;;;FF22;;FF22 +FF43;FULLWIDTH LATIN SMALL LETTER C;Ll;0;L;<wide> 0063;;;;N;;;FF23;;FF23 +FF44;FULLWIDTH LATIN SMALL LETTER D;Ll;0;L;<wide> 0064;;;;N;;;FF24;;FF24 +FF45;FULLWIDTH LATIN SMALL LETTER E;Ll;0;L;<wide> 0065;;;;N;;;FF25;;FF25 +FF46;FULLWIDTH LATIN SMALL LETTER F;Ll;0;L;<wide> 0066;;;;N;;;FF26;;FF26 +FF47;FULLWIDTH LATIN SMALL LETTER G;Ll;0;L;<wide> 0067;;;;N;;;FF27;;FF27 +FF48;FULLWIDTH LATIN SMALL LETTER H;Ll;0;L;<wide> 0068;;;;N;;;FF28;;FF28 +FF49;FULLWIDTH LATIN SMALL LETTER I;Ll;0;L;<wide> 0069;;;;N;;;FF29;;FF29 +FF4A;FULLWIDTH LATIN SMALL LETTER J;Ll;0;L;<wide> 006A;;;;N;;;FF2A;;FF2A +FF4B;FULLWIDTH LATIN SMALL LETTER K;Ll;0;L;<wide> 006B;;;;N;;;FF2B;;FF2B +FF4C;FULLWIDTH LATIN SMALL LETTER L;Ll;0;L;<wide> 006C;;;;N;;;FF2C;;FF2C +FF4D;FULLWIDTH LATIN SMALL LETTER M;Ll;0;L;<wide> 006D;;;;N;;;FF2D;;FF2D +FF4E;FULLWIDTH LATIN SMALL LETTER N;Ll;0;L;<wide> 006E;;;;N;;;FF2E;;FF2E +FF4F;FULLWIDTH LATIN SMALL LETTER O;Ll;0;L;<wide> 006F;;;;N;;;FF2F;;FF2F +FF50;FULLWIDTH LATIN SMALL LETTER P;Ll;0;L;<wide> 0070;;;;N;;;FF30;;FF30 +FF51;FULLWIDTH LATIN SMALL LETTER Q;Ll;0;L;<wide> 0071;;;;N;;;FF31;;FF31 +FF52;FULLWIDTH LATIN SMALL LETTER R;Ll;0;L;<wide> 0072;;;;N;;;FF32;;FF32 +FF53;FULLWIDTH LATIN SMALL LETTER S;Ll;0;L;<wide> 0073;;;;N;;;FF33;;FF33 +FF54;FULLWIDTH LATIN SMALL LETTER T;Ll;0;L;<wide> 0074;;;;N;;;FF34;;FF34 +FF55;FULLWIDTH LATIN SMALL LETTER U;Ll;0;L;<wide> 0075;;;;N;;;FF35;;FF35 +FF56;FULLWIDTH LATIN SMALL LETTER V;Ll;0;L;<wide> 0076;;;;N;;;FF36;;FF36 +FF57;FULLWIDTH LATIN SMALL LETTER W;Ll;0;L;<wide> 0077;;;;N;;;FF37;;FF37 +FF58;FULLWIDTH LATIN SMALL LETTER X;Ll;0;L;<wide> 0078;;;;N;;;FF38;;FF38 +FF59;FULLWIDTH LATIN SMALL LETTER Y;Ll;0;L;<wide> 0079;;;;N;;;FF39;;FF39 +FF5A;FULLWIDTH LATIN SMALL LETTER Z;Ll;0;L;<wide> 007A;;;;N;;;FF3A;;FF3A +FF5B;FULLWIDTH LEFT CURLY BRACKET;Ps;0;ON;<wide> 007B;;;;Y;FULLWIDTH OPENING CURLY BRACKET;;;; +FF5C;FULLWIDTH VERTICAL LINE;Sm;0;ON;<wide> 007C;;;;N;FULLWIDTH VERTICAL BAR;;;; +FF5D;FULLWIDTH RIGHT CURLY BRACKET;Pe;0;ON;<wide> 007D;;;;Y;FULLWIDTH CLOSING CURLY BRACKET;;;; +FF5E;FULLWIDTH TILDE;Sm;0;ON;<wide> 007E;;;;N;FULLWIDTH SPACING TILDE;;;; +FF5F;FULLWIDTH LEFT WHITE PARENTHESIS;Ps;0;ON;<wide> 2985;;;;Y;;;;; +FF60;FULLWIDTH RIGHT WHITE PARENTHESIS;Pe;0;ON;<wide> 2986;;;;Y;;;;; +FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON;<narrow> 3002;;;;N;HALFWIDTH IDEOGRAPHIC PERIOD;;;; +FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON;<narrow> 300C;;;;Y;HALFWIDTH OPENING CORNER BRACKET;;;; +FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON;<narrow> 300D;;;;Y;HALFWIDTH CLOSING CORNER BRACKET;;;; +FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON;<narrow> 3001;;;;N;;;;; +FF65;HALFWIDTH KATAKANA MIDDLE DOT;Po;0;ON;<narrow> 30FB;;;;N;;;;; +FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L;<narrow> 30F2;;;;N;;;;; +FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L;<narrow> 30A1;;;;N;;;;; +FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L;<narrow> 30A3;;;;N;;;;; +FF69;HALFWIDTH KATAKANA LETTER SMALL U;Lo;0;L;<narrow> 30A5;;;;N;;;;; +FF6A;HALFWIDTH KATAKANA LETTER SMALL E;Lo;0;L;<narrow> 30A7;;;;N;;;;; +FF6B;HALFWIDTH KATAKANA LETTER SMALL O;Lo;0;L;<narrow> 30A9;;;;N;;;;; +FF6C;HALFWIDTH KATAKANA LETTER SMALL YA;Lo;0;L;<narrow> 30E3;;;;N;;;;; +FF6D;HALFWIDTH KATAKANA LETTER SMALL YU;Lo;0;L;<narrow> 30E5;;;;N;;;;; +FF6E;HALFWIDTH KATAKANA LETTER SMALL YO;Lo;0;L;<narrow> 30E7;;;;N;;;;; +FF6F;HALFWIDTH KATAKANA LETTER SMALL TU;Lo;0;L;<narrow> 30C3;;;;N;;;;; +FF70;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;<narrow> 30FC;;;;N;;;;; +FF71;HALFWIDTH KATAKANA LETTER A;Lo;0;L;<narrow> 30A2;;;;N;;;;; +FF72;HALFWIDTH KATAKANA LETTER I;Lo;0;L;<narrow> 30A4;;;;N;;;;; +FF73;HALFWIDTH KATAKANA LETTER U;Lo;0;L;<narrow> 30A6;;;;N;;;;; +FF74;HALFWIDTH KATAKANA LETTER E;Lo;0;L;<narrow> 30A8;;;;N;;;;; +FF75;HALFWIDTH KATAKANA LETTER O;Lo;0;L;<narrow> 30AA;;;;N;;;;; +FF76;HALFWIDTH KATAKANA LETTER KA;Lo;0;L;<narrow> 30AB;;;;N;;;;; +FF77;HALFWIDTH KATAKANA LETTER KI;Lo;0;L;<narrow> 30AD;;;;N;;;;; +FF78;HALFWIDTH KATAKANA LETTER KU;Lo;0;L;<narrow> 30AF;;;;N;;;;; +FF79;HALFWIDTH KATAKANA LETTER KE;Lo;0;L;<narrow> 30B1;;;;N;;;;; +FF7A;HALFWIDTH KATAKANA LETTER KO;Lo;0;L;<narrow> 30B3;;;;N;;;;; +FF7B;HALFWIDTH KATAKANA LETTER SA;Lo;0;L;<narrow> 30B5;;;;N;;;;; +FF7C;HALFWIDTH KATAKANA LETTER SI;Lo;0;L;<narrow> 30B7;;;;N;;;;; +FF7D;HALFWIDTH KATAKANA LETTER SU;Lo;0;L;<narrow> 30B9;;;;N;;;;; +FF7E;HALFWIDTH KATAKANA LETTER SE;Lo;0;L;<narrow> 30BB;;;;N;;;;; +FF7F;HALFWIDTH KATAKANA LETTER SO;Lo;0;L;<narrow> 30BD;;;;N;;;;; +FF80;HALFWIDTH KATAKANA LETTER TA;Lo;0;L;<narrow> 30BF;;;;N;;;;; +FF81;HALFWIDTH KATAKANA LETTER TI;Lo;0;L;<narrow> 30C1;;;;N;;;;; +FF82;HALFWIDTH KATAKANA LETTER TU;Lo;0;L;<narrow> 30C4;;;;N;;;;; +FF83;HALFWIDTH KATAKANA LETTER TE;Lo;0;L;<narrow> 30C6;;;;N;;;;; +FF84;HALFWIDTH KATAKANA LETTER TO;Lo;0;L;<narrow> 30C8;;;;N;;;;; +FF85;HALFWIDTH KATAKANA LETTER NA;Lo;0;L;<narrow> 30CA;;;;N;;;;; +FF86;HALFWIDTH KATAKANA LETTER NI;Lo;0;L;<narrow> 30CB;;;;N;;;;; +FF87;HALFWIDTH KATAKANA LETTER NU;Lo;0;L;<narrow> 30CC;;;;N;;;;; +FF88;HALFWIDTH KATAKANA LETTER NE;Lo;0;L;<narrow> 30CD;;;;N;;;;; +FF89;HALFWIDTH KATAKANA LETTER NO;Lo;0;L;<narrow> 30CE;;;;N;;;;; +FF8A;HALFWIDTH KATAKANA LETTER HA;Lo;0;L;<narrow> 30CF;;;;N;;;;; +FF8B;HALFWIDTH KATAKANA LETTER HI;Lo;0;L;<narrow> 30D2;;;;N;;;;; +FF8C;HALFWIDTH KATAKANA LETTER HU;Lo;0;L;<narrow> 30D5;;;;N;;;;; +FF8D;HALFWIDTH KATAKANA LETTER HE;Lo;0;L;<narrow> 30D8;;;;N;;;;; +FF8E;HALFWIDTH KATAKANA LETTER HO;Lo;0;L;<narrow> 30DB;;;;N;;;;; +FF8F;HALFWIDTH KATAKANA LETTER MA;Lo;0;L;<narrow> 30DE;;;;N;;;;; +FF90;HALFWIDTH KATAKANA LETTER MI;Lo;0;L;<narrow> 30DF;;;;N;;;;; +FF91;HALFWIDTH KATAKANA LETTER MU;Lo;0;L;<narrow> 30E0;;;;N;;;;; +FF92;HALFWIDTH KATAKANA LETTER ME;Lo;0;L;<narrow> 30E1;;;;N;;;;; +FF93;HALFWIDTH KATAKANA LETTER MO;Lo;0;L;<narrow> 30E2;;;;N;;;;; +FF94;HALFWIDTH KATAKANA LETTER YA;Lo;0;L;<narrow> 30E4;;;;N;;;;; +FF95;HALFWIDTH KATAKANA LETTER YU;Lo;0;L;<narrow> 30E6;;;;N;;;;; +FF96;HALFWIDTH KATAKANA LETTER YO;Lo;0;L;<narrow> 30E8;;;;N;;;;; +FF97;HALFWIDTH KATAKANA LETTER RA;Lo;0;L;<narrow> 30E9;;;;N;;;;; +FF98;HALFWIDTH KATAKANA LETTER RI;Lo;0;L;<narrow> 30EA;;;;N;;;;; +FF99;HALFWIDTH KATAKANA LETTER RU;Lo;0;L;<narrow> 30EB;;;;N;;;;; +FF9A;HALFWIDTH KATAKANA LETTER RE;Lo;0;L;<narrow> 30EC;;;;N;;;;; +FF9B;HALFWIDTH KATAKANA LETTER RO;Lo;0;L;<narrow> 30ED;;;;N;;;;; +FF9C;HALFWIDTH KATAKANA LETTER WA;Lo;0;L;<narrow> 30EF;;;;N;;;;; +FF9D;HALFWIDTH KATAKANA LETTER N;Lo;0;L;<narrow> 30F3;;;;N;;;;; +FF9E;HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L;<narrow> 3099;;;;N;;;;; +FF9F;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L;<narrow> 309A;;;;N;;;;; +FFA0;HALFWIDTH HANGUL FILLER;Lo;0;L;<narrow> 3164;;;;N;HALFWIDTH HANGUL CAE OM;;;; +FFA1;HALFWIDTH HANGUL LETTER KIYEOK;Lo;0;L;<narrow> 3131;;;;N;HALFWIDTH HANGUL LETTER GIYEOG;;;; +FFA2;HALFWIDTH HANGUL LETTER SSANGKIYEOK;Lo;0;L;<narrow> 3132;;;;N;HALFWIDTH HANGUL LETTER SSANG GIYEOG;;;; +FFA3;HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<narrow> 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;; +FFA4;HALFWIDTH HANGUL LETTER NIEUN;Lo;0;L;<narrow> 3134;;;;N;;;;; +FFA5;HALFWIDTH HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<narrow> 3135;;;;N;HALFWIDTH HANGUL LETTER NIEUN JIEUJ;;;; +FFA6;HALFWIDTH HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<narrow> 3136;;;;N;HALFWIDTH HANGUL LETTER NIEUN HIEUH;;;; +FFA7;HALFWIDTH HANGUL LETTER TIKEUT;Lo;0;L;<narrow> 3137;;;;N;HALFWIDTH HANGUL LETTER DIGEUD;;;; +FFA8;HALFWIDTH HANGUL LETTER SSANGTIKEUT;Lo;0;L;<narrow> 3138;;;;N;HALFWIDTH HANGUL LETTER SSANG DIGEUD;;;; +FFA9;HALFWIDTH HANGUL LETTER RIEUL;Lo;0;L;<narrow> 3139;;;;N;HALFWIDTH HANGUL LETTER LIEUL;;;; +FFAA;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<narrow> 313A;;;;N;HALFWIDTH HANGUL LETTER LIEUL GIYEOG;;;; +FFAB;HALFWIDTH HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<narrow> 313B;;;;N;HALFWIDTH HANGUL LETTER LIEUL MIEUM;;;; +FFAC;HALFWIDTH HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<narrow> 313C;;;;N;HALFWIDTH HANGUL LETTER LIEUL BIEUB;;;; +FFAD;HALFWIDTH HANGUL LETTER RIEUL-SIOS;Lo;0;L;<narrow> 313D;;;;N;HALFWIDTH HANGUL LETTER LIEUL SIOS;;;; +FFAE;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<narrow> 313E;;;;N;HALFWIDTH HANGUL LETTER LIEUL TIEUT;;;; +FFAF;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<narrow> 313F;;;;N;HALFWIDTH HANGUL LETTER LIEUL PIEUP;;;; +FFB0;HALFWIDTH HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<narrow> 3140;;;;N;HALFWIDTH HANGUL LETTER LIEUL HIEUH;;;; +FFB1;HALFWIDTH HANGUL LETTER MIEUM;Lo;0;L;<narrow> 3141;;;;N;;;;; +FFB2;HALFWIDTH HANGUL LETTER PIEUP;Lo;0;L;<narrow> 3142;;;;N;HALFWIDTH HANGUL LETTER BIEUB;;;; +FFB3;HALFWIDTH HANGUL LETTER SSANGPIEUP;Lo;0;L;<narrow> 3143;;;;N;HALFWIDTH HANGUL LETTER SSANG BIEUB;;;; +FFB4;HALFWIDTH HANGUL LETTER PIEUP-SIOS;Lo;0;L;<narrow> 3144;;;;N;HALFWIDTH HANGUL LETTER BIEUB SIOS;;;; +FFB5;HALFWIDTH HANGUL LETTER SIOS;Lo;0;L;<narrow> 3145;;;;N;;;;; +FFB6;HALFWIDTH HANGUL LETTER SSANGSIOS;Lo;0;L;<narrow> 3146;;;;N;HALFWIDTH HANGUL LETTER SSANG SIOS;;;; +FFB7;HALFWIDTH HANGUL LETTER IEUNG;Lo;0;L;<narrow> 3147;;;;N;;;;; +FFB8;HALFWIDTH HANGUL LETTER CIEUC;Lo;0;L;<narrow> 3148;;;;N;HALFWIDTH HANGUL LETTER JIEUJ;;;; +FFB9;HALFWIDTH HANGUL LETTER SSANGCIEUC;Lo;0;L;<narrow> 3149;;;;N;HALFWIDTH HANGUL LETTER SSANG JIEUJ;;;; +FFBA;HALFWIDTH HANGUL LETTER CHIEUCH;Lo;0;L;<narrow> 314A;;;;N;HALFWIDTH HANGUL LETTER CIEUC;;;; +FFBB;HALFWIDTH HANGUL LETTER KHIEUKH;Lo;0;L;<narrow> 314B;;;;N;HALFWIDTH HANGUL LETTER KIYEOK;;;; +FFBC;HALFWIDTH HANGUL LETTER THIEUTH;Lo;0;L;<narrow> 314C;;;;N;HALFWIDTH HANGUL LETTER TIEUT;;;; +FFBD;HALFWIDTH HANGUL LETTER PHIEUPH;Lo;0;L;<narrow> 314D;;;;N;HALFWIDTH HANGUL LETTER PIEUP;;;; +FFBE;HALFWIDTH HANGUL LETTER HIEUH;Lo;0;L;<narrow> 314E;;;;N;;;;; +FFC2;HALFWIDTH HANGUL LETTER A;Lo;0;L;<narrow> 314F;;;;N;;;;; +FFC3;HALFWIDTH HANGUL LETTER AE;Lo;0;L;<narrow> 3150;;;;N;;;;; +FFC4;HALFWIDTH HANGUL LETTER YA;Lo;0;L;<narrow> 3151;;;;N;;;;; +FFC5;HALFWIDTH HANGUL LETTER YAE;Lo;0;L;<narrow> 3152;;;;N;;;;; +FFC6;HALFWIDTH HANGUL LETTER EO;Lo;0;L;<narrow> 3153;;;;N;;;;; +FFC7;HALFWIDTH HANGUL LETTER E;Lo;0;L;<narrow> 3154;;;;N;;;;; +FFCA;HALFWIDTH HANGUL LETTER YEO;Lo;0;L;<narrow> 3155;;;;N;;;;; +FFCB;HALFWIDTH HANGUL LETTER YE;Lo;0;L;<narrow> 3156;;;;N;;;;; +FFCC;HALFWIDTH HANGUL LETTER O;Lo;0;L;<narrow> 3157;;;;N;;;;; +FFCD;HALFWIDTH HANGUL LETTER WA;Lo;0;L;<narrow> 3158;;;;N;;;;; +FFCE;HALFWIDTH HANGUL LETTER WAE;Lo;0;L;<narrow> 3159;;;;N;;;;; +FFCF;HALFWIDTH HANGUL LETTER OE;Lo;0;L;<narrow> 315A;;;;N;;;;; +FFD2;HALFWIDTH HANGUL LETTER YO;Lo;0;L;<narrow> 315B;;;;N;;;;; +FFD3;HALFWIDTH HANGUL LETTER U;Lo;0;L;<narrow> 315C;;;;N;;;;; +FFD4;HALFWIDTH HANGUL LETTER WEO;Lo;0;L;<narrow> 315D;;;;N;;;;; +FFD5;HALFWIDTH HANGUL LETTER WE;Lo;0;L;<narrow> 315E;;;;N;;;;; +FFD6;HALFWIDTH HANGUL LETTER WI;Lo;0;L;<narrow> 315F;;;;N;;;;; +FFD7;HALFWIDTH HANGUL LETTER YU;Lo;0;L;<narrow> 3160;;;;N;;;;; +FFDA;HALFWIDTH HANGUL LETTER EU;Lo;0;L;<narrow> 3161;;;;N;;;;; +FFDB;HALFWIDTH HANGUL LETTER YI;Lo;0;L;<narrow> 3162;;;;N;;;;; +FFDC;HALFWIDTH HANGUL LETTER I;Lo;0;L;<narrow> 3163;;;;N;;;;; +FFE0;FULLWIDTH CENT SIGN;Sc;0;ET;<wide> 00A2;;;;N;;;;; +FFE1;FULLWIDTH POUND SIGN;Sc;0;ET;<wide> 00A3;;;;N;;;;; +FFE2;FULLWIDTH NOT SIGN;Sm;0;ON;<wide> 00AC;;;;N;;;;; +FFE3;FULLWIDTH MACRON;Sk;0;ON;<wide> 00AF;;;;N;FULLWIDTH SPACING MACRON;;;; +FFE4;FULLWIDTH BROKEN BAR;So;0;ON;<wide> 00A6;;;;N;FULLWIDTH BROKEN VERTICAL BAR;;;; +FFE5;FULLWIDTH YEN SIGN;Sc;0;ET;<wide> 00A5;;;;N;;;;; +FFE6;FULLWIDTH WON SIGN;Sc;0;ET;<wide> 20A9;;;;N;;;;; +FFE8;HALFWIDTH FORMS LIGHT VERTICAL;So;0;ON;<narrow> 2502;;;;N;;;;; +FFE9;HALFWIDTH LEFTWARDS ARROW;Sm;0;ON;<narrow> 2190;;;;N;;;;; +FFEA;HALFWIDTH UPWARDS ARROW;Sm;0;ON;<narrow> 2191;;;;N;;;;; +FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON;<narrow> 2192;;;;N;;;;; +FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON;<narrow> 2193;;;;N;;;;; +FFED;HALFWIDTH BLACK SQUARE;So;0;ON;<narrow> 25A0;;;;N;;;;; +FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON;<narrow> 25CB;;;;N;;;;; +FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;ON;;;;;N;;;;; +FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;ON;;;;;N;;;;; +FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;ON;;;;;N;;;;; +FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; +FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; +10000;LINEAR B SYLLABLE B008 A;Lo;0;L;;;;;N;;;;; +10001;LINEAR B SYLLABLE B038 E;Lo;0;L;;;;;N;;;;; +10002;LINEAR B SYLLABLE B028 I;Lo;0;L;;;;;N;;;;; +10003;LINEAR B SYLLABLE B061 O;Lo;0;L;;;;;N;;;;; +10004;LINEAR B SYLLABLE B010 U;Lo;0;L;;;;;N;;;;; +10005;LINEAR B SYLLABLE B001 DA;Lo;0;L;;;;;N;;;;; +10006;LINEAR B SYLLABLE B045 DE;Lo;0;L;;;;;N;;;;; +10007;LINEAR B SYLLABLE B007 DI;Lo;0;L;;;;;N;;;;; +10008;LINEAR B SYLLABLE B014 DO;Lo;0;L;;;;;N;;;;; +10009;LINEAR B SYLLABLE B051 DU;Lo;0;L;;;;;N;;;;; +1000A;LINEAR B SYLLABLE B057 JA;Lo;0;L;;;;;N;;;;; +1000B;LINEAR B SYLLABLE B046 JE;Lo;0;L;;;;;N;;;;; +1000D;LINEAR B SYLLABLE B036 JO;Lo;0;L;;;;;N;;;;; +1000E;LINEAR B SYLLABLE B065 JU;Lo;0;L;;;;;N;;;;; +1000F;LINEAR B SYLLABLE B077 KA;Lo;0;L;;;;;N;;;;; +10010;LINEAR B SYLLABLE B044 KE;Lo;0;L;;;;;N;;;;; +10011;LINEAR B SYLLABLE B067 KI;Lo;0;L;;;;;N;;;;; +10012;LINEAR B SYLLABLE B070 KO;Lo;0;L;;;;;N;;;;; +10013;LINEAR B SYLLABLE B081 KU;Lo;0;L;;;;;N;;;;; +10014;LINEAR B SYLLABLE B080 MA;Lo;0;L;;;;;N;;;;; +10015;LINEAR B SYLLABLE B013 ME;Lo;0;L;;;;;N;;;;; +10016;LINEAR B SYLLABLE B073 MI;Lo;0;L;;;;;N;;;;; +10017;LINEAR B SYLLABLE B015 MO;Lo;0;L;;;;;N;;;;; +10018;LINEAR B SYLLABLE B023 MU;Lo;0;L;;;;;N;;;;; +10019;LINEAR B SYLLABLE B006 NA;Lo;0;L;;;;;N;;;;; +1001A;LINEAR B SYLLABLE B024 NE;Lo;0;L;;;;;N;;;;; +1001B;LINEAR B SYLLABLE B030 NI;Lo;0;L;;;;;N;;;;; +1001C;LINEAR B SYLLABLE B052 NO;Lo;0;L;;;;;N;;;;; +1001D;LINEAR B SYLLABLE B055 NU;Lo;0;L;;;;;N;;;;; +1001E;LINEAR B SYLLABLE B003 PA;Lo;0;L;;;;;N;;;;; +1001F;LINEAR B SYLLABLE B072 PE;Lo;0;L;;;;;N;;;;; +10020;LINEAR B SYLLABLE B039 PI;Lo;0;L;;;;;N;;;;; +10021;LINEAR B SYLLABLE B011 PO;Lo;0;L;;;;;N;;;;; +10022;LINEAR B SYLLABLE B050 PU;Lo;0;L;;;;;N;;;;; +10023;LINEAR B SYLLABLE B016 QA;Lo;0;L;;;;;N;;;;; +10024;LINEAR B SYLLABLE B078 QE;Lo;0;L;;;;;N;;;;; +10025;LINEAR B SYLLABLE B021 QI;Lo;0;L;;;;;N;;;;; +10026;LINEAR B SYLLABLE B032 QO;Lo;0;L;;;;;N;;;;; +10028;LINEAR B SYLLABLE B060 RA;Lo;0;L;;;;;N;;;;; +10029;LINEAR B SYLLABLE B027 RE;Lo;0;L;;;;;N;;;;; +1002A;LINEAR B SYLLABLE B053 RI;Lo;0;L;;;;;N;;;;; +1002B;LINEAR B SYLLABLE B002 RO;Lo;0;L;;;;;N;;;;; +1002C;LINEAR B SYLLABLE B026 RU;Lo;0;L;;;;;N;;;;; +1002D;LINEAR B SYLLABLE B031 SA;Lo;0;L;;;;;N;;;;; +1002E;LINEAR B SYLLABLE B009 SE;Lo;0;L;;;;;N;;;;; +1002F;LINEAR B SYLLABLE B041 SI;Lo;0;L;;;;;N;;;;; +10030;LINEAR B SYLLABLE B012 SO;Lo;0;L;;;;;N;;;;; +10031;LINEAR B SYLLABLE B058 SU;Lo;0;L;;;;;N;;;;; +10032;LINEAR B SYLLABLE B059 TA;Lo;0;L;;;;;N;;;;; +10033;LINEAR B SYLLABLE B004 TE;Lo;0;L;;;;;N;;;;; +10034;LINEAR B SYLLABLE B037 TI;Lo;0;L;;;;;N;;;;; +10035;LINEAR B SYLLABLE B005 TO;Lo;0;L;;;;;N;;;;; +10036;LINEAR B SYLLABLE B069 TU;Lo;0;L;;;;;N;;;;; +10037;LINEAR B SYLLABLE B054 WA;Lo;0;L;;;;;N;;;;; +10038;LINEAR B SYLLABLE B075 WE;Lo;0;L;;;;;N;;;;; +10039;LINEAR B SYLLABLE B040 WI;Lo;0;L;;;;;N;;;;; +1003A;LINEAR B SYLLABLE B042 WO;Lo;0;L;;;;;N;;;;; +1003C;LINEAR B SYLLABLE B017 ZA;Lo;0;L;;;;;N;;;;; +1003D;LINEAR B SYLLABLE B074 ZE;Lo;0;L;;;;;N;;;;; +1003F;LINEAR B SYLLABLE B020 ZO;Lo;0;L;;;;;N;;;;; +10040;LINEAR B SYLLABLE B025 A2;Lo;0;L;;;;;N;;;;; +10041;LINEAR B SYLLABLE B043 A3;Lo;0;L;;;;;N;;;;; +10042;LINEAR B SYLLABLE B085 AU;Lo;0;L;;;;;N;;;;; +10043;LINEAR B SYLLABLE B071 DWE;Lo;0;L;;;;;N;;;;; +10044;LINEAR B SYLLABLE B090 DWO;Lo;0;L;;;;;N;;;;; +10045;LINEAR B SYLLABLE B048 NWA;Lo;0;L;;;;;N;;;;; +10046;LINEAR B SYLLABLE B029 PU2;Lo;0;L;;;;;N;;;;; +10047;LINEAR B SYLLABLE B062 PTE;Lo;0;L;;;;;N;;;;; +10048;LINEAR B SYLLABLE B076 RA2;Lo;0;L;;;;;N;;;;; +10049;LINEAR B SYLLABLE B033 RA3;Lo;0;L;;;;;N;;;;; +1004A;LINEAR B SYLLABLE B068 RO2;Lo;0;L;;;;;N;;;;; +1004B;LINEAR B SYLLABLE B066 TA2;Lo;0;L;;;;;N;;;;; +1004C;LINEAR B SYLLABLE B087 TWE;Lo;0;L;;;;;N;;;;; +1004D;LINEAR B SYLLABLE B091 TWO;Lo;0;L;;;;;N;;;;; +10050;LINEAR B SYMBOL B018;Lo;0;L;;;;;N;;;;; +10051;LINEAR B SYMBOL B019;Lo;0;L;;;;;N;;;;; +10052;LINEAR B SYMBOL B022;Lo;0;L;;;;;N;;;;; +10053;LINEAR B SYMBOL B034;Lo;0;L;;;;;N;;;;; +10054;LINEAR B SYMBOL B047;Lo;0;L;;;;;N;;;;; +10055;LINEAR B SYMBOL B049;Lo;0;L;;;;;N;;;;; +10056;LINEAR B SYMBOL B056;Lo;0;L;;;;;N;;;;; +10057;LINEAR B SYMBOL B063;Lo;0;L;;;;;N;;;;; +10058;LINEAR B SYMBOL B064;Lo;0;L;;;;;N;;;;; +10059;LINEAR B SYMBOL B079;Lo;0;L;;;;;N;;;;; +1005A;LINEAR B SYMBOL B082;Lo;0;L;;;;;N;;;;; +1005B;LINEAR B SYMBOL B083;Lo;0;L;;;;;N;;;;; +1005C;LINEAR B SYMBOL B086;Lo;0;L;;;;;N;;;;; +1005D;LINEAR B SYMBOL B089;Lo;0;L;;;;;N;;;;; +10080;LINEAR B IDEOGRAM B100 MAN;Lo;0;L;;;;;N;;;;; +10081;LINEAR B IDEOGRAM B102 WOMAN;Lo;0;L;;;;;N;;;;; +10082;LINEAR B IDEOGRAM B104 DEER;Lo;0;L;;;;;N;;;;; +10083;LINEAR B IDEOGRAM B105 EQUID;Lo;0;L;;;;;N;;;;; +10084;LINEAR B IDEOGRAM B105F MARE;Lo;0;L;;;;;N;;;;; +10085;LINEAR B IDEOGRAM B105M STALLION;Lo;0;L;;;;;N;;;;; +10086;LINEAR B IDEOGRAM B106F EWE;Lo;0;L;;;;;N;;;;; +10087;LINEAR B IDEOGRAM B106M RAM;Lo;0;L;;;;;N;;;;; +10088;LINEAR B IDEOGRAM B107F SHE-GOAT;Lo;0;L;;;;;N;;;;; +10089;LINEAR B IDEOGRAM B107M HE-GOAT;Lo;0;L;;;;;N;;;;; +1008A;LINEAR B IDEOGRAM B108F SOW;Lo;0;L;;;;;N;;;;; +1008B;LINEAR B IDEOGRAM B108M BOAR;Lo;0;L;;;;;N;;;;; +1008C;LINEAR B IDEOGRAM B109F COW;Lo;0;L;;;;;N;;;;; +1008D;LINEAR B IDEOGRAM B109M BULL;Lo;0;L;;;;;N;;;;; +1008E;LINEAR B IDEOGRAM B120 WHEAT;Lo;0;L;;;;;N;;;;; +1008F;LINEAR B IDEOGRAM B121 BARLEY;Lo;0;L;;;;;N;;;;; +10090;LINEAR B IDEOGRAM B122 OLIVE;Lo;0;L;;;;;N;;;;; +10091;LINEAR B IDEOGRAM B123 SPICE;Lo;0;L;;;;;N;;;;; +10092;LINEAR B IDEOGRAM B125 CYPERUS;Lo;0;L;;;;;N;;;;; +10093;LINEAR B MONOGRAM B127 KAPO;Lo;0;L;;;;;N;;;;; +10094;LINEAR B MONOGRAM B128 KANAKO;Lo;0;L;;;;;N;;;;; +10095;LINEAR B IDEOGRAM B130 OIL;Lo;0;L;;;;;N;;;;; +10096;LINEAR B IDEOGRAM B131 WINE;Lo;0;L;;;;;N;;;;; +10097;LINEAR B IDEOGRAM B132;Lo;0;L;;;;;N;;;;; +10098;LINEAR B MONOGRAM B133 AREPA;Lo;0;L;;;;;N;;;;; +10099;LINEAR B MONOGRAM B135 MERI;Lo;0;L;;;;;N;;;;; +1009A;LINEAR B IDEOGRAM B140 BRONZE;Lo;0;L;;;;;N;;;;; +1009B;LINEAR B IDEOGRAM B141 GOLD;Lo;0;L;;;;;N;;;;; +1009C;LINEAR B IDEOGRAM B142;Lo;0;L;;;;;N;;;;; +1009D;LINEAR B IDEOGRAM B145 WOOL;Lo;0;L;;;;;N;;;;; +1009E;LINEAR B IDEOGRAM B146;Lo;0;L;;;;;N;;;;; +1009F;LINEAR B IDEOGRAM B150;Lo;0;L;;;;;N;;;;; +100A0;LINEAR B IDEOGRAM B151 HORN;Lo;0;L;;;;;N;;;;; +100A1;LINEAR B IDEOGRAM B152;Lo;0;L;;;;;N;;;;; +100A2;LINEAR B IDEOGRAM B153;Lo;0;L;;;;;N;;;;; +100A3;LINEAR B IDEOGRAM B154;Lo;0;L;;;;;N;;;;; +100A4;LINEAR B MONOGRAM B156 TURO2;Lo;0;L;;;;;N;;;;; +100A5;LINEAR B IDEOGRAM B157;Lo;0;L;;;;;N;;;;; +100A6;LINEAR B IDEOGRAM B158;Lo;0;L;;;;;N;;;;; +100A7;LINEAR B IDEOGRAM B159 CLOTH;Lo;0;L;;;;;N;;;;; +100A8;LINEAR B IDEOGRAM B160;Lo;0;L;;;;;N;;;;; +100A9;LINEAR B IDEOGRAM B161;Lo;0;L;;;;;N;;;;; +100AA;LINEAR B IDEOGRAM B162 GARMENT;Lo;0;L;;;;;N;;;;; +100AB;LINEAR B IDEOGRAM B163 ARMOUR;Lo;0;L;;;;;N;;;;; +100AC;LINEAR B IDEOGRAM B164;Lo;0;L;;;;;N;;;;; +100AD;LINEAR B IDEOGRAM B165;Lo;0;L;;;;;N;;;;; +100AE;LINEAR B IDEOGRAM B166;Lo;0;L;;;;;N;;;;; +100AF;LINEAR B IDEOGRAM B167;Lo;0;L;;;;;N;;;;; +100B0;LINEAR B IDEOGRAM B168;Lo;0;L;;;;;N;;;;; +100B1;LINEAR B IDEOGRAM B169;Lo;0;L;;;;;N;;;;; +100B2;LINEAR B IDEOGRAM B170;Lo;0;L;;;;;N;;;;; +100B3;LINEAR B IDEOGRAM B171;Lo;0;L;;;;;N;;;;; +100B4;LINEAR B IDEOGRAM B172;Lo;0;L;;;;;N;;;;; +100B5;LINEAR B IDEOGRAM B173 MONTH;Lo;0;L;;;;;N;;;;; +100B6;LINEAR B IDEOGRAM B174;Lo;0;L;;;;;N;;;;; +100B7;LINEAR B IDEOGRAM B176 TREE;Lo;0;L;;;;;N;;;;; +100B8;LINEAR B IDEOGRAM B177;Lo;0;L;;;;;N;;;;; +100B9;LINEAR B IDEOGRAM B178;Lo;0;L;;;;;N;;;;; +100BA;LINEAR B IDEOGRAM B179;Lo;0;L;;;;;N;;;;; +100BB;LINEAR B IDEOGRAM B180;Lo;0;L;;;;;N;;;;; +100BC;LINEAR B IDEOGRAM B181;Lo;0;L;;;;;N;;;;; +100BD;LINEAR B IDEOGRAM B182;Lo;0;L;;;;;N;;;;; +100BE;LINEAR B IDEOGRAM B183;Lo;0;L;;;;;N;;;;; +100BF;LINEAR B IDEOGRAM B184;Lo;0;L;;;;;N;;;;; +100C0;LINEAR B IDEOGRAM B185;Lo;0;L;;;;;N;;;;; +100C1;LINEAR B IDEOGRAM B189;Lo;0;L;;;;;N;;;;; +100C2;LINEAR B IDEOGRAM B190;Lo;0;L;;;;;N;;;;; +100C3;LINEAR B IDEOGRAM B191 HELMET;Lo;0;L;;;;;N;;;;; +100C4;LINEAR B IDEOGRAM B220 FOOTSTOOL;Lo;0;L;;;;;N;;;;; +100C5;LINEAR B IDEOGRAM B225 BATHTUB;Lo;0;L;;;;;N;;;;; +100C6;LINEAR B IDEOGRAM B230 SPEAR;Lo;0;L;;;;;N;;;;; +100C7;LINEAR B IDEOGRAM B231 ARROW;Lo;0;L;;;;;N;;;;; +100C8;LINEAR B IDEOGRAM B232;Lo;0;L;;;;;N;;;;; +100C9;LINEAR B IDEOGRAM B233 SWORD;Lo;0;L;;;;;N;;;;; +100CA;LINEAR B IDEOGRAM B234;Lo;0;L;;;;;N;;;;; +100CB;LINEAR B IDEOGRAM B236;Lo;0;L;;;;;N;;;;; +100CC;LINEAR B IDEOGRAM B240 WHEELED CHARIOT;Lo;0;L;;;;;N;;;;; +100CD;LINEAR B IDEOGRAM B241 CHARIOT;Lo;0;L;;;;;N;;;;; +100CE;LINEAR B IDEOGRAM B242 CHARIOT FRAME;Lo;0;L;;;;;N;;;;; +100CF;LINEAR B IDEOGRAM B243 WHEEL;Lo;0;L;;;;;N;;;;; +100D0;LINEAR B IDEOGRAM B245;Lo;0;L;;;;;N;;;;; +100D1;LINEAR B IDEOGRAM B246;Lo;0;L;;;;;N;;;;; +100D2;LINEAR B MONOGRAM B247 DIPTE;Lo;0;L;;;;;N;;;;; +100D3;LINEAR B IDEOGRAM B248;Lo;0;L;;;;;N;;;;; +100D4;LINEAR B IDEOGRAM B249;Lo;0;L;;;;;N;;;;; +100D5;LINEAR B IDEOGRAM B251;Lo;0;L;;;;;N;;;;; +100D6;LINEAR B IDEOGRAM B252;Lo;0;L;;;;;N;;;;; +100D7;LINEAR B IDEOGRAM B253;Lo;0;L;;;;;N;;;;; +100D8;LINEAR B IDEOGRAM B254 DART;Lo;0;L;;;;;N;;;;; +100D9;LINEAR B IDEOGRAM B255;Lo;0;L;;;;;N;;;;; +100DA;LINEAR B IDEOGRAM B256;Lo;0;L;;;;;N;;;;; +100DB;LINEAR B IDEOGRAM B257;Lo;0;L;;;;;N;;;;; +100DC;LINEAR B IDEOGRAM B258;Lo;0;L;;;;;N;;;;; +100DD;LINEAR B IDEOGRAM B259;Lo;0;L;;;;;N;;;;; +100DE;LINEAR B IDEOGRAM VESSEL B155;Lo;0;L;;;;;N;;;;; +100DF;LINEAR B IDEOGRAM VESSEL B200;Lo;0;L;;;;;N;;;;; +100E0;LINEAR B IDEOGRAM VESSEL B201;Lo;0;L;;;;;N;;;;; +100E1;LINEAR B IDEOGRAM VESSEL B202;Lo;0;L;;;;;N;;;;; +100E2;LINEAR B IDEOGRAM VESSEL B203;Lo;0;L;;;;;N;;;;; +100E3;LINEAR B IDEOGRAM VESSEL B204;Lo;0;L;;;;;N;;;;; +100E4;LINEAR B IDEOGRAM VESSEL B205;Lo;0;L;;;;;N;;;;; +100E5;LINEAR B IDEOGRAM VESSEL B206;Lo;0;L;;;;;N;;;;; +100E6;LINEAR B IDEOGRAM VESSEL B207;Lo;0;L;;;;;N;;;;; +100E7;LINEAR B IDEOGRAM VESSEL B208;Lo;0;L;;;;;N;;;;; +100E8;LINEAR B IDEOGRAM VESSEL B209;Lo;0;L;;;;;N;;;;; +100E9;LINEAR B IDEOGRAM VESSEL B210;Lo;0;L;;;;;N;;;;; +100EA;LINEAR B IDEOGRAM VESSEL B211;Lo;0;L;;;;;N;;;;; +100EB;LINEAR B IDEOGRAM VESSEL B212;Lo;0;L;;;;;N;;;;; +100EC;LINEAR B IDEOGRAM VESSEL B213;Lo;0;L;;;;;N;;;;; +100ED;LINEAR B IDEOGRAM VESSEL B214;Lo;0;L;;;;;N;;;;; +100EE;LINEAR B IDEOGRAM VESSEL B215;Lo;0;L;;;;;N;;;;; +100EF;LINEAR B IDEOGRAM VESSEL B216;Lo;0;L;;;;;N;;;;; +100F0;LINEAR B IDEOGRAM VESSEL B217;Lo;0;L;;;;;N;;;;; +100F1;LINEAR B IDEOGRAM VESSEL B218;Lo;0;L;;;;;N;;;;; +100F2;LINEAR B IDEOGRAM VESSEL B219;Lo;0;L;;;;;N;;;;; +100F3;LINEAR B IDEOGRAM VESSEL B221;Lo;0;L;;;;;N;;;;; +100F4;LINEAR B IDEOGRAM VESSEL B222;Lo;0;L;;;;;N;;;;; +100F5;LINEAR B IDEOGRAM VESSEL B226;Lo;0;L;;;;;N;;;;; +100F6;LINEAR B IDEOGRAM VESSEL B227;Lo;0;L;;;;;N;;;;; +100F7;LINEAR B IDEOGRAM VESSEL B228;Lo;0;L;;;;;N;;;;; +100F8;LINEAR B IDEOGRAM VESSEL B229;Lo;0;L;;;;;N;;;;; +100F9;LINEAR B IDEOGRAM VESSEL B250;Lo;0;L;;;;;N;;;;; +100FA;LINEAR B IDEOGRAM VESSEL B305;Lo;0;L;;;;;N;;;;; +10100;AEGEAN WORD SEPARATOR LINE;Po;0;L;;;;;N;;;;; +10101;AEGEAN WORD SEPARATOR DOT;Po;0;ON;;;;;N;;;;; +10102;AEGEAN CHECK MARK;So;0;L;;;;;N;;;;; +10107;AEGEAN NUMBER ONE;No;0;L;;;;1;N;;;;; +10108;AEGEAN NUMBER TWO;No;0;L;;;;2;N;;;;; +10109;AEGEAN NUMBER THREE;No;0;L;;;;3;N;;;;; +1010A;AEGEAN NUMBER FOUR;No;0;L;;;;4;N;;;;; +1010B;AEGEAN NUMBER FIVE;No;0;L;;;;5;N;;;;; +1010C;AEGEAN NUMBER SIX;No;0;L;;;;6;N;;;;; +1010D;AEGEAN NUMBER SEVEN;No;0;L;;;;7;N;;;;; +1010E;AEGEAN NUMBER EIGHT;No;0;L;;;;8;N;;;;; +1010F;AEGEAN NUMBER NINE;No;0;L;;;;9;N;;;;; +10110;AEGEAN NUMBER TEN;No;0;L;;;;10;N;;;;; +10111;AEGEAN NUMBER TWENTY;No;0;L;;;;20;N;;;;; +10112;AEGEAN NUMBER THIRTY;No;0;L;;;;30;N;;;;; +10113;AEGEAN NUMBER FORTY;No;0;L;;;;40;N;;;;; +10114;AEGEAN NUMBER FIFTY;No;0;L;;;;50;N;;;;; +10115;AEGEAN NUMBER SIXTY;No;0;L;;;;60;N;;;;; +10116;AEGEAN NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +10117;AEGEAN NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +10118;AEGEAN NUMBER NINETY;No;0;L;;;;90;N;;;;; +10119;AEGEAN NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +1011A;AEGEAN NUMBER TWO HUNDRED;No;0;L;;;;200;N;;;;; +1011B;AEGEAN NUMBER THREE HUNDRED;No;0;L;;;;300;N;;;;; +1011C;AEGEAN NUMBER FOUR HUNDRED;No;0;L;;;;400;N;;;;; +1011D;AEGEAN NUMBER FIVE HUNDRED;No;0;L;;;;500;N;;;;; +1011E;AEGEAN NUMBER SIX HUNDRED;No;0;L;;;;600;N;;;;; +1011F;AEGEAN NUMBER SEVEN HUNDRED;No;0;L;;;;700;N;;;;; +10120;AEGEAN NUMBER EIGHT HUNDRED;No;0;L;;;;800;N;;;;; +10121;AEGEAN NUMBER NINE HUNDRED;No;0;L;;;;900;N;;;;; +10122;AEGEAN NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +10123;AEGEAN NUMBER TWO THOUSAND;No;0;L;;;;2000;N;;;;; +10124;AEGEAN NUMBER THREE THOUSAND;No;0;L;;;;3000;N;;;;; +10125;AEGEAN NUMBER FOUR THOUSAND;No;0;L;;;;4000;N;;;;; +10126;AEGEAN NUMBER FIVE THOUSAND;No;0;L;;;;5000;N;;;;; +10127;AEGEAN NUMBER SIX THOUSAND;No;0;L;;;;6000;N;;;;; +10128;AEGEAN NUMBER SEVEN THOUSAND;No;0;L;;;;7000;N;;;;; +10129;AEGEAN NUMBER EIGHT THOUSAND;No;0;L;;;;8000;N;;;;; +1012A;AEGEAN NUMBER NINE THOUSAND;No;0;L;;;;9000;N;;;;; +1012B;AEGEAN NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; +1012C;AEGEAN NUMBER TWENTY THOUSAND;No;0;L;;;;20000;N;;;;; +1012D;AEGEAN NUMBER THIRTY THOUSAND;No;0;L;;;;30000;N;;;;; +1012E;AEGEAN NUMBER FORTY THOUSAND;No;0;L;;;;40000;N;;;;; +1012F;AEGEAN NUMBER FIFTY THOUSAND;No;0;L;;;;50000;N;;;;; +10130;AEGEAN NUMBER SIXTY THOUSAND;No;0;L;;;;60000;N;;;;; +10131;AEGEAN NUMBER SEVENTY THOUSAND;No;0;L;;;;70000;N;;;;; +10132;AEGEAN NUMBER EIGHTY THOUSAND;No;0;L;;;;80000;N;;;;; +10133;AEGEAN NUMBER NINETY THOUSAND;No;0;L;;;;90000;N;;;;; +10137;AEGEAN WEIGHT BASE UNIT;So;0;L;;;;;N;;;;; +10138;AEGEAN WEIGHT FIRST SUBUNIT;So;0;L;;;;;N;;;;; +10139;AEGEAN WEIGHT SECOND SUBUNIT;So;0;L;;;;;N;;;;; +1013A;AEGEAN WEIGHT THIRD SUBUNIT;So;0;L;;;;;N;;;;; +1013B;AEGEAN WEIGHT FOURTH SUBUNIT;So;0;L;;;;;N;;;;; +1013C;AEGEAN DRY MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; +1013D;AEGEAN LIQUID MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; +1013E;AEGEAN MEASURE SECOND SUBUNIT;So;0;L;;;;;N;;;;; +1013F;AEGEAN MEASURE THIRD SUBUNIT;So;0;L;;;;;N;;;;; +10140;GREEK ACROPHONIC ATTIC ONE QUARTER;Nl;0;ON;;;;1/4;N;;;;; +10141;GREEK ACROPHONIC ATTIC ONE HALF;Nl;0;ON;;;;1/2;N;;;;; +10142;GREEK ACROPHONIC ATTIC ONE DRACHMA;Nl;0;ON;;;;1;N;;;;; +10143;GREEK ACROPHONIC ATTIC FIVE;Nl;0;ON;;;;5;N;;;;; +10144;GREEK ACROPHONIC ATTIC FIFTY;Nl;0;ON;;;;50;N;;;;; +10145;GREEK ACROPHONIC ATTIC FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10146;GREEK ACROPHONIC ATTIC FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; +10147;GREEK ACROPHONIC ATTIC FIFTY THOUSAND;Nl;0;ON;;;;50000;N;;;;; +10148;GREEK ACROPHONIC ATTIC FIVE TALENTS;Nl;0;ON;;;;5;N;;;;; +10149;GREEK ACROPHONIC ATTIC TEN TALENTS;Nl;0;ON;;;;10;N;;;;; +1014A;GREEK ACROPHONIC ATTIC FIFTY TALENTS;Nl;0;ON;;;;50;N;;;;; +1014B;GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS;Nl;0;ON;;;;100;N;;;;; +1014C;GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS;Nl;0;ON;;;;500;N;;;;; +1014D;GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS;Nl;0;ON;;;;1000;N;;;;; +1014E;GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS;Nl;0;ON;;;;5000;N;;;;; +1014F;GREEK ACROPHONIC ATTIC FIVE STATERS;Nl;0;ON;;;;5;N;;;;; +10150;GREEK ACROPHONIC ATTIC TEN STATERS;Nl;0;ON;;;;10;N;;;;; +10151;GREEK ACROPHONIC ATTIC FIFTY STATERS;Nl;0;ON;;;;50;N;;;;; +10152;GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS;Nl;0;ON;;;;100;N;;;;; +10153;GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS;Nl;0;ON;;;;500;N;;;;; +10154;GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS;Nl;0;ON;;;;1000;N;;;;; +10155;GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS;Nl;0;ON;;;;10000;N;;;;; +10156;GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS;Nl;0;ON;;;;50000;N;;;;; +10157;GREEK ACROPHONIC ATTIC TEN MNAS;Nl;0;ON;;;;10;N;;;;; +10158;GREEK ACROPHONIC HERAEUM ONE PLETHRON;Nl;0;ON;;;;1;N;;;;; +10159;GREEK ACROPHONIC THESPIAN ONE;Nl;0;ON;;;;1;N;;;;; +1015A;GREEK ACROPHONIC HERMIONIAN ONE;Nl;0;ON;;;;1;N;;;;; +1015B;GREEK ACROPHONIC EPIDAUREAN TWO;Nl;0;ON;;;;2;N;;;;; +1015C;GREEK ACROPHONIC THESPIAN TWO;Nl;0;ON;;;;2;N;;;;; +1015D;GREEK ACROPHONIC CYRENAIC TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; +1015E;GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; +1015F;GREEK ACROPHONIC TROEZENIAN FIVE;Nl;0;ON;;;;5;N;;;;; +10160;GREEK ACROPHONIC TROEZENIAN TEN;Nl;0;ON;;;;10;N;;;;; +10161;GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM;Nl;0;ON;;;;10;N;;;;; +10162;GREEK ACROPHONIC HERMIONIAN TEN;Nl;0;ON;;;;10;N;;;;; +10163;GREEK ACROPHONIC MESSENIAN TEN;Nl;0;ON;;;;10;N;;;;; +10164;GREEK ACROPHONIC THESPIAN TEN;Nl;0;ON;;;;10;N;;;;; +10165;GREEK ACROPHONIC THESPIAN THIRTY;Nl;0;ON;;;;30;N;;;;; +10166;GREEK ACROPHONIC TROEZENIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +10167;GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM;Nl;0;ON;;;;50;N;;;;; +10168;GREEK ACROPHONIC HERMIONIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +10169;GREEK ACROPHONIC THESPIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +1016A;GREEK ACROPHONIC THESPIAN ONE HUNDRED;Nl;0;ON;;;;100;N;;;;; +1016B;GREEK ACROPHONIC THESPIAN THREE HUNDRED;Nl;0;ON;;;;300;N;;;;; +1016C;GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016D;GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016E;GREEK ACROPHONIC THESPIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016F;GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10170;GREEK ACROPHONIC NAXIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10171;GREEK ACROPHONIC THESPIAN ONE THOUSAND;Nl;0;ON;;;;1000;N;;;;; +10172;GREEK ACROPHONIC THESPIAN FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; +10173;GREEK ACROPHONIC DELPHIC FIVE MNAS;Nl;0;ON;;;;5;N;;;;; +10174;GREEK ACROPHONIC STRATIAN FIFTY MNAS;Nl;0;ON;;;;50;N;;;;; +10175;GREEK ONE HALF SIGN;No;0;ON;;;;1/2;N;;;;; +10176;GREEK ONE HALF SIGN ALTERNATE FORM;No;0;ON;;;;1/2;N;;;;; +10177;GREEK TWO THIRDS SIGN;No;0;ON;;;;2/3;N;;;;; +10178;GREEK THREE QUARTERS SIGN;No;0;ON;;;;3/4;N;;;;; +10179;GREEK YEAR SIGN;So;0;ON;;;;;N;;;;; +1017A;GREEK TALENT SIGN;So;0;ON;;;;;N;;;;; +1017B;GREEK DRACHMA SIGN;So;0;ON;;;;;N;;;;; +1017C;GREEK OBOL SIGN;So;0;ON;;;;;N;;;;; +1017D;GREEK TWO OBOLS SIGN;So;0;ON;;;;;N;;;;; +1017E;GREEK THREE OBOLS SIGN;So;0;ON;;;;;N;;;;; +1017F;GREEK FOUR OBOLS SIGN;So;0;ON;;;;;N;;;;; +10180;GREEK FIVE OBOLS SIGN;So;0;ON;;;;;N;;;;; +10181;GREEK METRETES SIGN;So;0;ON;;;;;N;;;;; +10182;GREEK KYATHOS BASE SIGN;So;0;ON;;;;;N;;;;; +10183;GREEK LITRA SIGN;So;0;ON;;;;;N;;;;; +10184;GREEK OUNKIA SIGN;So;0;ON;;;;;N;;;;; +10185;GREEK XESTES SIGN;So;0;ON;;;;;N;;;;; +10186;GREEK ARTABE SIGN;So;0;ON;;;;;N;;;;; +10187;GREEK AROURA SIGN;So;0;ON;;;;;N;;;;; +10188;GREEK GRAMMA SIGN;So;0;ON;;;;;N;;;;; +10189;GREEK TRYBLION BASE SIGN;So;0;ON;;;;;N;;;;; +1018A;GREEK ZERO SIGN;No;0;ON;;;;0;N;;;;; +10190;ROMAN SEXTANS SIGN;So;0;ON;;;;;N;;;;; +10191;ROMAN UNCIA SIGN;So;0;ON;;;;;N;;;;; +10192;ROMAN SEMUNCIA SIGN;So;0;ON;;;;;N;;;;; +10193;ROMAN SEXTULA SIGN;So;0;ON;;;;;N;;;;; +10194;ROMAN DIMIDIA SEXTULA SIGN;So;0;ON;;;;;N;;;;; +10195;ROMAN SILIQUA SIGN;So;0;ON;;;;;N;;;;; +10196;ROMAN DENARIUS SIGN;So;0;ON;;;;;N;;;;; +10197;ROMAN QUINARIUS SIGN;So;0;ON;;;;;N;;;;; +10198;ROMAN SESTERTIUS SIGN;So;0;ON;;;;;N;;;;; +10199;ROMAN DUPONDIUS SIGN;So;0;ON;;;;;N;;;;; +1019A;ROMAN AS SIGN;So;0;ON;;;;;N;;;;; +1019B;ROMAN CENTURIAL SIGN;So;0;ON;;;;;N;;;;; +101D0;PHAISTOS DISC SIGN PEDESTRIAN;So;0;L;;;;;N;;;;; +101D1;PHAISTOS DISC SIGN PLUMED HEAD;So;0;L;;;;;N;;;;; +101D2;PHAISTOS DISC SIGN TATTOOED HEAD;So;0;L;;;;;N;;;;; +101D3;PHAISTOS DISC SIGN CAPTIVE;So;0;L;;;;;N;;;;; +101D4;PHAISTOS DISC SIGN CHILD;So;0;L;;;;;N;;;;; +101D5;PHAISTOS DISC SIGN WOMAN;So;0;L;;;;;N;;;;; +101D6;PHAISTOS DISC SIGN HELMET;So;0;L;;;;;N;;;;; +101D7;PHAISTOS DISC SIGN GAUNTLET;So;0;L;;;;;N;;;;; +101D8;PHAISTOS DISC SIGN TIARA;So;0;L;;;;;N;;;;; +101D9;PHAISTOS DISC SIGN ARROW;So;0;L;;;;;N;;;;; +101DA;PHAISTOS DISC SIGN BOW;So;0;L;;;;;N;;;;; +101DB;PHAISTOS DISC SIGN SHIELD;So;0;L;;;;;N;;;;; +101DC;PHAISTOS DISC SIGN CLUB;So;0;L;;;;;N;;;;; +101DD;PHAISTOS DISC SIGN MANACLES;So;0;L;;;;;N;;;;; +101DE;PHAISTOS DISC SIGN MATTOCK;So;0;L;;;;;N;;;;; +101DF;PHAISTOS DISC SIGN SAW;So;0;L;;;;;N;;;;; +101E0;PHAISTOS DISC SIGN LID;So;0;L;;;;;N;;;;; +101E1;PHAISTOS DISC SIGN BOOMERANG;So;0;L;;;;;N;;;;; +101E2;PHAISTOS DISC SIGN CARPENTRY PLANE;So;0;L;;;;;N;;;;; +101E3;PHAISTOS DISC SIGN DOLIUM;So;0;L;;;;;N;;;;; +101E4;PHAISTOS DISC SIGN COMB;So;0;L;;;;;N;;;;; +101E5;PHAISTOS DISC SIGN SLING;So;0;L;;;;;N;;;;; +101E6;PHAISTOS DISC SIGN COLUMN;So;0;L;;;;;N;;;;; +101E7;PHAISTOS DISC SIGN BEEHIVE;So;0;L;;;;;N;;;;; +101E8;PHAISTOS DISC SIGN SHIP;So;0;L;;;;;N;;;;; +101E9;PHAISTOS DISC SIGN HORN;So;0;L;;;;;N;;;;; +101EA;PHAISTOS DISC SIGN HIDE;So;0;L;;;;;N;;;;; +101EB;PHAISTOS DISC SIGN BULLS LEG;So;0;L;;;;;N;;;;; +101EC;PHAISTOS DISC SIGN CAT;So;0;L;;;;;N;;;;; +101ED;PHAISTOS DISC SIGN RAM;So;0;L;;;;;N;;;;; +101EE;PHAISTOS DISC SIGN EAGLE;So;0;L;;;;;N;;;;; +101EF;PHAISTOS DISC SIGN DOVE;So;0;L;;;;;N;;;;; +101F0;PHAISTOS DISC SIGN TUNNY;So;0;L;;;;;N;;;;; +101F1;PHAISTOS DISC SIGN BEE;So;0;L;;;;;N;;;;; +101F2;PHAISTOS DISC SIGN PLANE TREE;So;0;L;;;;;N;;;;; +101F3;PHAISTOS DISC SIGN VINE;So;0;L;;;;;N;;;;; +101F4;PHAISTOS DISC SIGN PAPYRUS;So;0;L;;;;;N;;;;; +101F5;PHAISTOS DISC SIGN ROSETTE;So;0;L;;;;;N;;;;; +101F6;PHAISTOS DISC SIGN LILY;So;0;L;;;;;N;;;;; +101F7;PHAISTOS DISC SIGN OX BACK;So;0;L;;;;;N;;;;; +101F8;PHAISTOS DISC SIGN FLUTE;So;0;L;;;;;N;;;;; +101F9;PHAISTOS DISC SIGN GRATER;So;0;L;;;;;N;;;;; +101FA;PHAISTOS DISC SIGN STRAINER;So;0;L;;;;;N;;;;; +101FB;PHAISTOS DISC SIGN SMALL AXE;So;0;L;;;;;N;;;;; +101FC;PHAISTOS DISC SIGN WAVY BAND;So;0;L;;;;;N;;;;; +101FD;PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE;Mn;220;NSM;;;;;N;;;;; +10280;LYCIAN LETTER A;Lo;0;L;;;;;N;;;;; +10281;LYCIAN LETTER E;Lo;0;L;;;;;N;;;;; +10282;LYCIAN LETTER B;Lo;0;L;;;;;N;;;;; +10283;LYCIAN LETTER BH;Lo;0;L;;;;;N;;;;; +10284;LYCIAN LETTER G;Lo;0;L;;;;;N;;;;; +10285;LYCIAN LETTER D;Lo;0;L;;;;;N;;;;; +10286;LYCIAN LETTER I;Lo;0;L;;;;;N;;;;; +10287;LYCIAN LETTER W;Lo;0;L;;;;;N;;;;; +10288;LYCIAN LETTER Z;Lo;0;L;;;;;N;;;;; +10289;LYCIAN LETTER TH;Lo;0;L;;;;;N;;;;; +1028A;LYCIAN LETTER J;Lo;0;L;;;;;N;;;;; +1028B;LYCIAN LETTER K;Lo;0;L;;;;;N;;;;; +1028C;LYCIAN LETTER Q;Lo;0;L;;;;;N;;;;; +1028D;LYCIAN LETTER L;Lo;0;L;;;;;N;;;;; +1028E;LYCIAN LETTER M;Lo;0;L;;;;;N;;;;; +1028F;LYCIAN LETTER N;Lo;0;L;;;;;N;;;;; +10290;LYCIAN LETTER MM;Lo;0;L;;;;;N;;;;; +10291;LYCIAN LETTER NN;Lo;0;L;;;;;N;;;;; +10292;LYCIAN LETTER U;Lo;0;L;;;;;N;;;;; +10293;LYCIAN LETTER P;Lo;0;L;;;;;N;;;;; +10294;LYCIAN LETTER KK;Lo;0;L;;;;;N;;;;; +10295;LYCIAN LETTER R;Lo;0;L;;;;;N;;;;; +10296;LYCIAN LETTER S;Lo;0;L;;;;;N;;;;; +10297;LYCIAN LETTER T;Lo;0;L;;;;;N;;;;; +10298;LYCIAN LETTER TT;Lo;0;L;;;;;N;;;;; +10299;LYCIAN LETTER AN;Lo;0;L;;;;;N;;;;; +1029A;LYCIAN LETTER EN;Lo;0;L;;;;;N;;;;; +1029B;LYCIAN LETTER H;Lo;0;L;;;;;N;;;;; +1029C;LYCIAN LETTER X;Lo;0;L;;;;;N;;;;; +102A0;CARIAN LETTER A;Lo;0;L;;;;;N;;;;; +102A1;CARIAN LETTER P2;Lo;0;L;;;;;N;;;;; +102A2;CARIAN LETTER D;Lo;0;L;;;;;N;;;;; +102A3;CARIAN LETTER L;Lo;0;L;;;;;N;;;;; +102A4;CARIAN LETTER UUU;Lo;0;L;;;;;N;;;;; +102A5;CARIAN LETTER R;Lo;0;L;;;;;N;;;;; +102A6;CARIAN LETTER LD;Lo;0;L;;;;;N;;;;; +102A7;CARIAN LETTER A2;Lo;0;L;;;;;N;;;;; +102A8;CARIAN LETTER Q;Lo;0;L;;;;;N;;;;; +102A9;CARIAN LETTER B;Lo;0;L;;;;;N;;;;; +102AA;CARIAN LETTER M;Lo;0;L;;;;;N;;;;; +102AB;CARIAN LETTER O;Lo;0;L;;;;;N;;;;; +102AC;CARIAN LETTER D2;Lo;0;L;;;;;N;;;;; +102AD;CARIAN LETTER T;Lo;0;L;;;;;N;;;;; +102AE;CARIAN LETTER SH;Lo;0;L;;;;;N;;;;; +102AF;CARIAN LETTER SH2;Lo;0;L;;;;;N;;;;; +102B0;CARIAN LETTER S;Lo;0;L;;;;;N;;;;; +102B1;CARIAN LETTER C-18;Lo;0;L;;;;;N;;;;; +102B2;CARIAN LETTER U;Lo;0;L;;;;;N;;;;; +102B3;CARIAN LETTER NN;Lo;0;L;;;;;N;;;;; +102B4;CARIAN LETTER X;Lo;0;L;;;;;N;;;;; +102B5;CARIAN LETTER N;Lo;0;L;;;;;N;;;;; +102B6;CARIAN LETTER TT2;Lo;0;L;;;;;N;;;;; +102B7;CARIAN LETTER P;Lo;0;L;;;;;N;;;;; +102B8;CARIAN LETTER SS;Lo;0;L;;;;;N;;;;; +102B9;CARIAN LETTER I;Lo;0;L;;;;;N;;;;; +102BA;CARIAN LETTER E;Lo;0;L;;;;;N;;;;; +102BB;CARIAN LETTER UUUU;Lo;0;L;;;;;N;;;;; +102BC;CARIAN LETTER K;Lo;0;L;;;;;N;;;;; +102BD;CARIAN LETTER K2;Lo;0;L;;;;;N;;;;; +102BE;CARIAN LETTER ND;Lo;0;L;;;;;N;;;;; +102BF;CARIAN LETTER UU;Lo;0;L;;;;;N;;;;; +102C0;CARIAN LETTER G;Lo;0;L;;;;;N;;;;; +102C1;CARIAN LETTER G2;Lo;0;L;;;;;N;;;;; +102C2;CARIAN LETTER ST;Lo;0;L;;;;;N;;;;; +102C3;CARIAN LETTER ST2;Lo;0;L;;;;;N;;;;; +102C4;CARIAN LETTER NG;Lo;0;L;;;;;N;;;;; +102C5;CARIAN LETTER II;Lo;0;L;;;;;N;;;;; +102C6;CARIAN LETTER C-39;Lo;0;L;;;;;N;;;;; +102C7;CARIAN LETTER TT;Lo;0;L;;;;;N;;;;; +102C8;CARIAN LETTER UUU2;Lo;0;L;;;;;N;;;;; +102C9;CARIAN LETTER RR;Lo;0;L;;;;;N;;;;; +102CA;CARIAN LETTER MB;Lo;0;L;;;;;N;;;;; +102CB;CARIAN LETTER MB2;Lo;0;L;;;;;N;;;;; +102CC;CARIAN LETTER MB3;Lo;0;L;;;;;N;;;;; +102CD;CARIAN LETTER MB4;Lo;0;L;;;;;N;;;;; +102CE;CARIAN LETTER LD2;Lo;0;L;;;;;N;;;;; +102CF;CARIAN LETTER E2;Lo;0;L;;;;;N;;;;; +102D0;CARIAN LETTER UUU3;Lo;0;L;;;;;N;;;;; +10300;OLD ITALIC LETTER A;Lo;0;L;;;;;N;;;;; +10301;OLD ITALIC LETTER BE;Lo;0;L;;;;;N;;;;; +10302;OLD ITALIC LETTER KE;Lo;0;L;;;;;N;;;;; +10303;OLD ITALIC LETTER DE;Lo;0;L;;;;;N;;;;; +10304;OLD ITALIC LETTER E;Lo;0;L;;;;;N;;;;; +10305;OLD ITALIC LETTER VE;Lo;0;L;;;;;N;;;;; +10306;OLD ITALIC LETTER ZE;Lo;0;L;;;;;N;;;;; +10307;OLD ITALIC LETTER HE;Lo;0;L;;;;;N;;;;; +10308;OLD ITALIC LETTER THE;Lo;0;L;;;;;N;;;;; +10309;OLD ITALIC LETTER I;Lo;0;L;;;;;N;;;;; +1030A;OLD ITALIC LETTER KA;Lo;0;L;;;;;N;;;;; +1030B;OLD ITALIC LETTER EL;Lo;0;L;;;;;N;;;;; +1030C;OLD ITALIC LETTER EM;Lo;0;L;;;;;N;;;;; +1030D;OLD ITALIC LETTER EN;Lo;0;L;;;;;N;;;;; +1030E;OLD ITALIC LETTER ESH;Lo;0;L;;;;;N;;;;; +1030F;OLD ITALIC LETTER O;Lo;0;L;;;;;N;;;;; +10310;OLD ITALIC LETTER PE;Lo;0;L;;;;;N;;;;; +10311;OLD ITALIC LETTER SHE;Lo;0;L;;;;;N;;;;; +10312;OLD ITALIC LETTER KU;Lo;0;L;;;;;N;;;;; +10313;OLD ITALIC LETTER ER;Lo;0;L;;;;;N;;;;; +10314;OLD ITALIC LETTER ES;Lo;0;L;;;;;N;;;;; +10315;OLD ITALIC LETTER TE;Lo;0;L;;;;;N;;;;; +10316;OLD ITALIC LETTER U;Lo;0;L;;;;;N;;;;; +10317;OLD ITALIC LETTER EKS;Lo;0;L;;;;;N;;;;; +10318;OLD ITALIC LETTER PHE;Lo;0;L;;;;;N;;;;; +10319;OLD ITALIC LETTER KHE;Lo;0;L;;;;;N;;;;; +1031A;OLD ITALIC LETTER EF;Lo;0;L;;;;;N;;;;; +1031B;OLD ITALIC LETTER ERS;Lo;0;L;;;;;N;;;;; +1031C;OLD ITALIC LETTER CHE;Lo;0;L;;;;;N;;;;; +1031D;OLD ITALIC LETTER II;Lo;0;L;;;;;N;;;;; +1031E;OLD ITALIC LETTER UU;Lo;0;L;;;;;N;;;;; +10320;OLD ITALIC NUMERAL ONE;No;0;L;;;;1;N;;;;; +10321;OLD ITALIC NUMERAL FIVE;No;0;L;;;;5;N;;;;; +10322;OLD ITALIC NUMERAL TEN;No;0;L;;;;10;N;;;;; +10323;OLD ITALIC NUMERAL FIFTY;No;0;L;;;;50;N;;;;; +10330;GOTHIC LETTER AHSA;Lo;0;L;;;;;N;;;;; +10331;GOTHIC LETTER BAIRKAN;Lo;0;L;;;;;N;;;;; +10332;GOTHIC LETTER GIBA;Lo;0;L;;;;;N;;;;; +10333;GOTHIC LETTER DAGS;Lo;0;L;;;;;N;;;;; +10334;GOTHIC LETTER AIHVUS;Lo;0;L;;;;;N;;;;; +10335;GOTHIC LETTER QAIRTHRA;Lo;0;L;;;;;N;;;;; +10336;GOTHIC LETTER IUJA;Lo;0;L;;;;;N;;;;; +10337;GOTHIC LETTER HAGL;Lo;0;L;;;;;N;;;;; +10338;GOTHIC LETTER THIUTH;Lo;0;L;;;;;N;;;;; +10339;GOTHIC LETTER EIS;Lo;0;L;;;;;N;;;;; +1033A;GOTHIC LETTER KUSMA;Lo;0;L;;;;;N;;;;; +1033B;GOTHIC LETTER LAGUS;Lo;0;L;;;;;N;;;;; +1033C;GOTHIC LETTER MANNA;Lo;0;L;;;;;N;;;;; +1033D;GOTHIC LETTER NAUTHS;Lo;0;L;;;;;N;;;;; +1033E;GOTHIC LETTER JER;Lo;0;L;;;;;N;;;;; +1033F;GOTHIC LETTER URUS;Lo;0;L;;;;;N;;;;; +10340;GOTHIC LETTER PAIRTHRA;Lo;0;L;;;;;N;;;;; +10341;GOTHIC LETTER NINETY;Nl;0;L;;;;90;N;;;;; +10342;GOTHIC LETTER RAIDA;Lo;0;L;;;;;N;;;;; +10343;GOTHIC LETTER SAUIL;Lo;0;L;;;;;N;;;;; +10344;GOTHIC LETTER TEIWS;Lo;0;L;;;;;N;;;;; +10345;GOTHIC LETTER WINJA;Lo;0;L;;;;;N;;;;; +10346;GOTHIC LETTER FAIHU;Lo;0;L;;;;;N;;;;; +10347;GOTHIC LETTER IGGWS;Lo;0;L;;;;;N;;;;; +10348;GOTHIC LETTER HWAIR;Lo;0;L;;;;;N;;;;; +10349;GOTHIC LETTER OTHAL;Lo;0;L;;;;;N;;;;; +1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;900;N;;;;; +10380;UGARITIC LETTER ALPA;Lo;0;L;;;;;N;;;;; +10381;UGARITIC LETTER BETA;Lo;0;L;;;;;N;;;;; +10382;UGARITIC LETTER GAMLA;Lo;0;L;;;;;N;;;;; +10383;UGARITIC LETTER KHA;Lo;0;L;;;;;N;;;;; +10384;UGARITIC LETTER DELTA;Lo;0;L;;;;;N;;;;; +10385;UGARITIC LETTER HO;Lo;0;L;;;;;N;;;;; +10386;UGARITIC LETTER WO;Lo;0;L;;;;;N;;;;; +10387;UGARITIC LETTER ZETA;Lo;0;L;;;;;N;;;;; +10388;UGARITIC LETTER HOTA;Lo;0;L;;;;;N;;;;; +10389;UGARITIC LETTER TET;Lo;0;L;;;;;N;;;;; +1038A;UGARITIC LETTER YOD;Lo;0;L;;;;;N;;;;; +1038B;UGARITIC LETTER KAF;Lo;0;L;;;;;N;;;;; +1038C;UGARITIC LETTER SHIN;Lo;0;L;;;;;N;;;;; +1038D;UGARITIC LETTER LAMDA;Lo;0;L;;;;;N;;;;; +1038E;UGARITIC LETTER MEM;Lo;0;L;;;;;N;;;;; +1038F;UGARITIC LETTER DHAL;Lo;0;L;;;;;N;;;;; +10390;UGARITIC LETTER NUN;Lo;0;L;;;;;N;;;;; +10391;UGARITIC LETTER ZU;Lo;0;L;;;;;N;;;;; +10392;UGARITIC LETTER SAMKA;Lo;0;L;;;;;N;;;;; +10393;UGARITIC LETTER AIN;Lo;0;L;;;;;N;;;;; +10394;UGARITIC LETTER PU;Lo;0;L;;;;;N;;;;; +10395;UGARITIC LETTER SADE;Lo;0;L;;;;;N;;;;; +10396;UGARITIC LETTER QOPA;Lo;0;L;;;;;N;;;;; +10397;UGARITIC LETTER RASHA;Lo;0;L;;;;;N;;;;; +10398;UGARITIC LETTER THANNA;Lo;0;L;;;;;N;;;;; +10399;UGARITIC LETTER GHAIN;Lo;0;L;;;;;N;;;;; +1039A;UGARITIC LETTER TO;Lo;0;L;;;;;N;;;;; +1039B;UGARITIC LETTER I;Lo;0;L;;;;;N;;;;; +1039C;UGARITIC LETTER U;Lo;0;L;;;;;N;;;;; +1039D;UGARITIC LETTER SSU;Lo;0;L;;;;;N;;;;; +1039F;UGARITIC WORD DIVIDER;Po;0;L;;;;;N;;;;; +103A0;OLD PERSIAN SIGN A;Lo;0;L;;;;;N;;;;; +103A1;OLD PERSIAN SIGN I;Lo;0;L;;;;;N;;;;; +103A2;OLD PERSIAN SIGN U;Lo;0;L;;;;;N;;;;; +103A3;OLD PERSIAN SIGN KA;Lo;0;L;;;;;N;;;;; +103A4;OLD PERSIAN SIGN KU;Lo;0;L;;;;;N;;;;; +103A5;OLD PERSIAN SIGN GA;Lo;0;L;;;;;N;;;;; +103A6;OLD PERSIAN SIGN GU;Lo;0;L;;;;;N;;;;; +103A7;OLD PERSIAN SIGN XA;Lo;0;L;;;;;N;;;;; +103A8;OLD PERSIAN SIGN CA;Lo;0;L;;;;;N;;;;; +103A9;OLD PERSIAN SIGN JA;Lo;0;L;;;;;N;;;;; +103AA;OLD PERSIAN SIGN JI;Lo;0;L;;;;;N;;;;; +103AB;OLD PERSIAN SIGN TA;Lo;0;L;;;;;N;;;;; +103AC;OLD PERSIAN SIGN TU;Lo;0;L;;;;;N;;;;; +103AD;OLD PERSIAN SIGN DA;Lo;0;L;;;;;N;;;;; +103AE;OLD PERSIAN SIGN DI;Lo;0;L;;;;;N;;;;; +103AF;OLD PERSIAN SIGN DU;Lo;0;L;;;;;N;;;;; +103B0;OLD PERSIAN SIGN THA;Lo;0;L;;;;;N;;;;; +103B1;OLD PERSIAN SIGN PA;Lo;0;L;;;;;N;;;;; +103B2;OLD PERSIAN SIGN BA;Lo;0;L;;;;;N;;;;; +103B3;OLD PERSIAN SIGN FA;Lo;0;L;;;;;N;;;;; +103B4;OLD PERSIAN SIGN NA;Lo;0;L;;;;;N;;;;; +103B5;OLD PERSIAN SIGN NU;Lo;0;L;;;;;N;;;;; +103B6;OLD PERSIAN SIGN MA;Lo;0;L;;;;;N;;;;; +103B7;OLD PERSIAN SIGN MI;Lo;0;L;;;;;N;;;;; +103B8;OLD PERSIAN SIGN MU;Lo;0;L;;;;;N;;;;; +103B9;OLD PERSIAN SIGN YA;Lo;0;L;;;;;N;;;;; +103BA;OLD PERSIAN SIGN VA;Lo;0;L;;;;;N;;;;; +103BB;OLD PERSIAN SIGN VI;Lo;0;L;;;;;N;;;;; +103BC;OLD PERSIAN SIGN RA;Lo;0;L;;;;;N;;;;; +103BD;OLD PERSIAN SIGN RU;Lo;0;L;;;;;N;;;;; +103BE;OLD PERSIAN SIGN LA;Lo;0;L;;;;;N;;;;; +103BF;OLD PERSIAN SIGN SA;Lo;0;L;;;;;N;;;;; +103C0;OLD PERSIAN SIGN ZA;Lo;0;L;;;;;N;;;;; +103C1;OLD PERSIAN SIGN SHA;Lo;0;L;;;;;N;;;;; +103C2;OLD PERSIAN SIGN SSA;Lo;0;L;;;;;N;;;;; +103C3;OLD PERSIAN SIGN HA;Lo;0;L;;;;;N;;;;; +103C8;OLD PERSIAN SIGN AURAMAZDAA;Lo;0;L;;;;;N;;;;; +103C9;OLD PERSIAN SIGN AURAMAZDAA-2;Lo;0;L;;;;;N;;;;; +103CA;OLD PERSIAN SIGN AURAMAZDAAHA;Lo;0;L;;;;;N;;;;; +103CB;OLD PERSIAN SIGN XSHAAYATHIYA;Lo;0;L;;;;;N;;;;; +103CC;OLD PERSIAN SIGN DAHYAAUSH;Lo;0;L;;;;;N;;;;; +103CD;OLD PERSIAN SIGN DAHYAAUSH-2;Lo;0;L;;;;;N;;;;; +103CE;OLD PERSIAN SIGN BAGA;Lo;0;L;;;;;N;;;;; +103CF;OLD PERSIAN SIGN BUUMISH;Lo;0;L;;;;;N;;;;; +103D0;OLD PERSIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; +103D1;OLD PERSIAN NUMBER ONE;Nl;0;L;;;;1;N;;;;; +103D2;OLD PERSIAN NUMBER TWO;Nl;0;L;;;;2;N;;;;; +103D3;OLD PERSIAN NUMBER TEN;Nl;0;L;;;;10;N;;;;; +103D4;OLD PERSIAN NUMBER TWENTY;Nl;0;L;;;;20;N;;;;; +103D5;OLD PERSIAN NUMBER HUNDRED;Nl;0;L;;;;100;N;;;;; +10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428; +10401;DESERET CAPITAL LETTER LONG E;Lu;0;L;;;;;N;;;;10429; +10402;DESERET CAPITAL LETTER LONG A;Lu;0;L;;;;;N;;;;1042A; +10403;DESERET CAPITAL LETTER LONG AH;Lu;0;L;;;;;N;;;;1042B; +10404;DESERET CAPITAL LETTER LONG O;Lu;0;L;;;;;N;;;;1042C; +10405;DESERET CAPITAL LETTER LONG OO;Lu;0;L;;;;;N;;;;1042D; +10406;DESERET CAPITAL LETTER SHORT I;Lu;0;L;;;;;N;;;;1042E; +10407;DESERET CAPITAL LETTER SHORT E;Lu;0;L;;;;;N;;;;1042F; +10408;DESERET CAPITAL LETTER SHORT A;Lu;0;L;;;;;N;;;;10430; +10409;DESERET CAPITAL LETTER SHORT AH;Lu;0;L;;;;;N;;;;10431; +1040A;DESERET CAPITAL LETTER SHORT O;Lu;0;L;;;;;N;;;;10432; +1040B;DESERET CAPITAL LETTER SHORT OO;Lu;0;L;;;;;N;;;;10433; +1040C;DESERET CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;10434; +1040D;DESERET CAPITAL LETTER OW;Lu;0;L;;;;;N;;;;10435; +1040E;DESERET CAPITAL LETTER WU;Lu;0;L;;;;;N;;;;10436; +1040F;DESERET CAPITAL LETTER YEE;Lu;0;L;;;;;N;;;;10437; +10410;DESERET CAPITAL LETTER H;Lu;0;L;;;;;N;;;;10438; +10411;DESERET CAPITAL LETTER PEE;Lu;0;L;;;;;N;;;;10439; +10412;DESERET CAPITAL LETTER BEE;Lu;0;L;;;;;N;;;;1043A; +10413;DESERET CAPITAL LETTER TEE;Lu;0;L;;;;;N;;;;1043B; +10414;DESERET CAPITAL LETTER DEE;Lu;0;L;;;;;N;;;;1043C; +10415;DESERET CAPITAL LETTER CHEE;Lu;0;L;;;;;N;;;;1043D; +10416;DESERET CAPITAL LETTER JEE;Lu;0;L;;;;;N;;;;1043E; +10417;DESERET CAPITAL LETTER KAY;Lu;0;L;;;;;N;;;;1043F; +10418;DESERET CAPITAL LETTER GAY;Lu;0;L;;;;;N;;;;10440; +10419;DESERET CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;10441; +1041A;DESERET CAPITAL LETTER VEE;Lu;0;L;;;;;N;;;;10442; +1041B;DESERET CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;10443; +1041C;DESERET CAPITAL LETTER THEE;Lu;0;L;;;;;N;;;;10444; +1041D;DESERET CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;10445; +1041E;DESERET CAPITAL LETTER ZEE;Lu;0;L;;;;;N;;;;10446; +1041F;DESERET CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;10447; +10420;DESERET CAPITAL LETTER ZHEE;Lu;0;L;;;;;N;;;;10448; +10421;DESERET CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;10449; +10422;DESERET CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;1044A; +10423;DESERET CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;1044B; +10424;DESERET CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;1044C; +10425;DESERET CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;1044D; +10426;DESERET CAPITAL LETTER OI;Lu;0;L;;;;;N;;;;1044E; +10427;DESERET CAPITAL LETTER EW;Lu;0;L;;;;;N;;;;1044F; +10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400 +10429;DESERET SMALL LETTER LONG E;Ll;0;L;;;;;N;;;10401;;10401 +1042A;DESERET SMALL LETTER LONG A;Ll;0;L;;;;;N;;;10402;;10402 +1042B;DESERET SMALL LETTER LONG AH;Ll;0;L;;;;;N;;;10403;;10403 +1042C;DESERET SMALL LETTER LONG O;Ll;0;L;;;;;N;;;10404;;10404 +1042D;DESERET SMALL LETTER LONG OO;Ll;0;L;;;;;N;;;10405;;10405 +1042E;DESERET SMALL LETTER SHORT I;Ll;0;L;;;;;N;;;10406;;10406 +1042F;DESERET SMALL LETTER SHORT E;Ll;0;L;;;;;N;;;10407;;10407 +10430;DESERET SMALL LETTER SHORT A;Ll;0;L;;;;;N;;;10408;;10408 +10431;DESERET SMALL LETTER SHORT AH;Ll;0;L;;;;;N;;;10409;;10409 +10432;DESERET SMALL LETTER SHORT O;Ll;0;L;;;;;N;;;1040A;;1040A +10433;DESERET SMALL LETTER SHORT OO;Ll;0;L;;;;;N;;;1040B;;1040B +10434;DESERET SMALL LETTER AY;Ll;0;L;;;;;N;;;1040C;;1040C +10435;DESERET SMALL LETTER OW;Ll;0;L;;;;;N;;;1040D;;1040D +10436;DESERET SMALL LETTER WU;Ll;0;L;;;;;N;;;1040E;;1040E +10437;DESERET SMALL LETTER YEE;Ll;0;L;;;;;N;;;1040F;;1040F +10438;DESERET SMALL LETTER H;Ll;0;L;;;;;N;;;10410;;10410 +10439;DESERET SMALL LETTER PEE;Ll;0;L;;;;;N;;;10411;;10411 +1043A;DESERET SMALL LETTER BEE;Ll;0;L;;;;;N;;;10412;;10412 +1043B;DESERET SMALL LETTER TEE;Ll;0;L;;;;;N;;;10413;;10413 +1043C;DESERET SMALL LETTER DEE;Ll;0;L;;;;;N;;;10414;;10414 +1043D;DESERET SMALL LETTER CHEE;Ll;0;L;;;;;N;;;10415;;10415 +1043E;DESERET SMALL LETTER JEE;Ll;0;L;;;;;N;;;10416;;10416 +1043F;DESERET SMALL LETTER KAY;Ll;0;L;;;;;N;;;10417;;10417 +10440;DESERET SMALL LETTER GAY;Ll;0;L;;;;;N;;;10418;;10418 +10441;DESERET SMALL LETTER EF;Ll;0;L;;;;;N;;;10419;;10419 +10442;DESERET SMALL LETTER VEE;Ll;0;L;;;;;N;;;1041A;;1041A +10443;DESERET SMALL LETTER ETH;Ll;0;L;;;;;N;;;1041B;;1041B +10444;DESERET SMALL LETTER THEE;Ll;0;L;;;;;N;;;1041C;;1041C +10445;DESERET SMALL LETTER ES;Ll;0;L;;;;;N;;;1041D;;1041D +10446;DESERET SMALL LETTER ZEE;Ll;0;L;;;;;N;;;1041E;;1041E +10447;DESERET SMALL LETTER ESH;Ll;0;L;;;;;N;;;1041F;;1041F +10448;DESERET SMALL LETTER ZHEE;Ll;0;L;;;;;N;;;10420;;10420 +10449;DESERET SMALL LETTER ER;Ll;0;L;;;;;N;;;10421;;10421 +1044A;DESERET SMALL LETTER EL;Ll;0;L;;;;;N;;;10422;;10422 +1044B;DESERET SMALL LETTER EM;Ll;0;L;;;;;N;;;10423;;10423 +1044C;DESERET SMALL LETTER EN;Ll;0;L;;;;;N;;;10424;;10424 +1044D;DESERET SMALL LETTER ENG;Ll;0;L;;;;;N;;;10425;;10425 +1044E;DESERET SMALL LETTER OI;Ll;0;L;;;;;N;;;10426;;10426 +1044F;DESERET SMALL LETTER EW;Ll;0;L;;;;;N;;;10427;;10427 +10450;SHAVIAN LETTER PEEP;Lo;0;L;;;;;N;;;;; +10451;SHAVIAN LETTER TOT;Lo;0;L;;;;;N;;;;; +10452;SHAVIAN LETTER KICK;Lo;0;L;;;;;N;;;;; +10453;SHAVIAN LETTER FEE;Lo;0;L;;;;;N;;;;; +10454;SHAVIAN LETTER THIGH;Lo;0;L;;;;;N;;;;; +10455;SHAVIAN LETTER SO;Lo;0;L;;;;;N;;;;; +10456;SHAVIAN LETTER SURE;Lo;0;L;;;;;N;;;;; +10457;SHAVIAN LETTER CHURCH;Lo;0;L;;;;;N;;;;; +10458;SHAVIAN LETTER YEA;Lo;0;L;;;;;N;;;;; +10459;SHAVIAN LETTER HUNG;Lo;0;L;;;;;N;;;;; +1045A;SHAVIAN LETTER BIB;Lo;0;L;;;;;N;;;;; +1045B;SHAVIAN LETTER DEAD;Lo;0;L;;;;;N;;;;; +1045C;SHAVIAN LETTER GAG;Lo;0;L;;;;;N;;;;; +1045D;SHAVIAN LETTER VOW;Lo;0;L;;;;;N;;;;; +1045E;SHAVIAN LETTER THEY;Lo;0;L;;;;;N;;;;; +1045F;SHAVIAN LETTER ZOO;Lo;0;L;;;;;N;;;;; +10460;SHAVIAN LETTER MEASURE;Lo;0;L;;;;;N;;;;; +10461;SHAVIAN LETTER JUDGE;Lo;0;L;;;;;N;;;;; +10462;SHAVIAN LETTER WOE;Lo;0;L;;;;;N;;;;; +10463;SHAVIAN LETTER HA-HA;Lo;0;L;;;;;N;;;;; +10464;SHAVIAN LETTER LOLL;Lo;0;L;;;;;N;;;;; +10465;SHAVIAN LETTER MIME;Lo;0;L;;;;;N;;;;; +10466;SHAVIAN LETTER IF;Lo;0;L;;;;;N;;;;; +10467;SHAVIAN LETTER EGG;Lo;0;L;;;;;N;;;;; +10468;SHAVIAN LETTER ASH;Lo;0;L;;;;;N;;;;; +10469;SHAVIAN LETTER ADO;Lo;0;L;;;;;N;;;;; +1046A;SHAVIAN LETTER ON;Lo;0;L;;;;;N;;;;; +1046B;SHAVIAN LETTER WOOL;Lo;0;L;;;;;N;;;;; +1046C;SHAVIAN LETTER OUT;Lo;0;L;;;;;N;;;;; +1046D;SHAVIAN LETTER AH;Lo;0;L;;;;;N;;;;; +1046E;SHAVIAN LETTER ROAR;Lo;0;L;;;;;N;;;;; +1046F;SHAVIAN LETTER NUN;Lo;0;L;;;;;N;;;;; +10470;SHAVIAN LETTER EAT;Lo;0;L;;;;;N;;;;; +10471;SHAVIAN LETTER AGE;Lo;0;L;;;;;N;;;;; +10472;SHAVIAN LETTER ICE;Lo;0;L;;;;;N;;;;; +10473;SHAVIAN LETTER UP;Lo;0;L;;;;;N;;;;; +10474;SHAVIAN LETTER OAK;Lo;0;L;;;;;N;;;;; +10475;SHAVIAN LETTER OOZE;Lo;0;L;;;;;N;;;;; +10476;SHAVIAN LETTER OIL;Lo;0;L;;;;;N;;;;; +10477;SHAVIAN LETTER AWE;Lo;0;L;;;;;N;;;;; +10478;SHAVIAN LETTER ARE;Lo;0;L;;;;;N;;;;; +10479;SHAVIAN LETTER OR;Lo;0;L;;;;;N;;;;; +1047A;SHAVIAN LETTER AIR;Lo;0;L;;;;;N;;;;; +1047B;SHAVIAN LETTER ERR;Lo;0;L;;;;;N;;;;; +1047C;SHAVIAN LETTER ARRAY;Lo;0;L;;;;;N;;;;; +1047D;SHAVIAN LETTER EAR;Lo;0;L;;;;;N;;;;; +1047E;SHAVIAN LETTER IAN;Lo;0;L;;;;;N;;;;; +1047F;SHAVIAN LETTER YEW;Lo;0;L;;;;;N;;;;; +10480;OSMANYA LETTER ALEF;Lo;0;L;;;;;N;;;;; +10481;OSMANYA LETTER BA;Lo;0;L;;;;;N;;;;; +10482;OSMANYA LETTER TA;Lo;0;L;;;;;N;;;;; +10483;OSMANYA LETTER JA;Lo;0;L;;;;;N;;;;; +10484;OSMANYA LETTER XA;Lo;0;L;;;;;N;;;;; +10485;OSMANYA LETTER KHA;Lo;0;L;;;;;N;;;;; +10486;OSMANYA LETTER DEEL;Lo;0;L;;;;;N;;;;; +10487;OSMANYA LETTER RA;Lo;0;L;;;;;N;;;;; +10488;OSMANYA LETTER SA;Lo;0;L;;;;;N;;;;; +10489;OSMANYA LETTER SHIIN;Lo;0;L;;;;;N;;;;; +1048A;OSMANYA LETTER DHA;Lo;0;L;;;;;N;;;;; +1048B;OSMANYA LETTER CAYN;Lo;0;L;;;;;N;;;;; +1048C;OSMANYA LETTER GA;Lo;0;L;;;;;N;;;;; +1048D;OSMANYA LETTER FA;Lo;0;L;;;;;N;;;;; +1048E;OSMANYA LETTER QAAF;Lo;0;L;;;;;N;;;;; +1048F;OSMANYA LETTER KAAF;Lo;0;L;;;;;N;;;;; +10490;OSMANYA LETTER LAAN;Lo;0;L;;;;;N;;;;; +10491;OSMANYA LETTER MIIN;Lo;0;L;;;;;N;;;;; +10492;OSMANYA LETTER NUUN;Lo;0;L;;;;;N;;;;; +10493;OSMANYA LETTER WAW;Lo;0;L;;;;;N;;;;; +10494;OSMANYA LETTER HA;Lo;0;L;;;;;N;;;;; +10495;OSMANYA LETTER YA;Lo;0;L;;;;;N;;;;; +10496;OSMANYA LETTER A;Lo;0;L;;;;;N;;;;; +10497;OSMANYA LETTER E;Lo;0;L;;;;;N;;;;; +10498;OSMANYA LETTER I;Lo;0;L;;;;;N;;;;; +10499;OSMANYA LETTER O;Lo;0;L;;;;;N;;;;; +1049A;OSMANYA LETTER U;Lo;0;L;;;;;N;;;;; +1049B;OSMANYA LETTER AA;Lo;0;L;;;;;N;;;;; +1049C;OSMANYA LETTER EE;Lo;0;L;;;;;N;;;;; +1049D;OSMANYA LETTER OO;Lo;0;L;;;;;N;;;;; +104A0;OSMANYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +104A1;OSMANYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +104A2;OSMANYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +104A3;OSMANYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +104A4;OSMANYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +104A5;OSMANYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +104A6;OSMANYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +104A7;OSMANYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +104A8;OSMANYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +104A9;OSMANYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +10800;CYPRIOT SYLLABLE A;Lo;0;R;;;;;N;;;;; +10801;CYPRIOT SYLLABLE E;Lo;0;R;;;;;N;;;;; +10802;CYPRIOT SYLLABLE I;Lo;0;R;;;;;N;;;;; +10803;CYPRIOT SYLLABLE O;Lo;0;R;;;;;N;;;;; +10804;CYPRIOT SYLLABLE U;Lo;0;R;;;;;N;;;;; +10805;CYPRIOT SYLLABLE JA;Lo;0;R;;;;;N;;;;; +10808;CYPRIOT SYLLABLE JO;Lo;0;R;;;;;N;;;;; +1080A;CYPRIOT SYLLABLE KA;Lo;0;R;;;;;N;;;;; +1080B;CYPRIOT SYLLABLE KE;Lo;0;R;;;;;N;;;;; +1080C;CYPRIOT SYLLABLE KI;Lo;0;R;;;;;N;;;;; +1080D;CYPRIOT SYLLABLE KO;Lo;0;R;;;;;N;;;;; +1080E;CYPRIOT SYLLABLE KU;Lo;0;R;;;;;N;;;;; +1080F;CYPRIOT SYLLABLE LA;Lo;0;R;;;;;N;;;;; +10810;CYPRIOT SYLLABLE LE;Lo;0;R;;;;;N;;;;; +10811;CYPRIOT SYLLABLE LI;Lo;0;R;;;;;N;;;;; +10812;CYPRIOT SYLLABLE LO;Lo;0;R;;;;;N;;;;; +10813;CYPRIOT SYLLABLE LU;Lo;0;R;;;;;N;;;;; +10814;CYPRIOT SYLLABLE MA;Lo;0;R;;;;;N;;;;; +10815;CYPRIOT SYLLABLE ME;Lo;0;R;;;;;N;;;;; +10816;CYPRIOT SYLLABLE MI;Lo;0;R;;;;;N;;;;; +10817;CYPRIOT SYLLABLE MO;Lo;0;R;;;;;N;;;;; +10818;CYPRIOT SYLLABLE MU;Lo;0;R;;;;;N;;;;; +10819;CYPRIOT SYLLABLE NA;Lo;0;R;;;;;N;;;;; +1081A;CYPRIOT SYLLABLE NE;Lo;0;R;;;;;N;;;;; +1081B;CYPRIOT SYLLABLE NI;Lo;0;R;;;;;N;;;;; +1081C;CYPRIOT SYLLABLE NO;Lo;0;R;;;;;N;;;;; +1081D;CYPRIOT SYLLABLE NU;Lo;0;R;;;;;N;;;;; +1081E;CYPRIOT SYLLABLE PA;Lo;0;R;;;;;N;;;;; +1081F;CYPRIOT SYLLABLE PE;Lo;0;R;;;;;N;;;;; +10820;CYPRIOT SYLLABLE PI;Lo;0;R;;;;;N;;;;; +10821;CYPRIOT SYLLABLE PO;Lo;0;R;;;;;N;;;;; +10822;CYPRIOT SYLLABLE PU;Lo;0;R;;;;;N;;;;; +10823;CYPRIOT SYLLABLE RA;Lo;0;R;;;;;N;;;;; +10824;CYPRIOT SYLLABLE RE;Lo;0;R;;;;;N;;;;; +10825;CYPRIOT SYLLABLE RI;Lo;0;R;;;;;N;;;;; +10826;CYPRIOT SYLLABLE RO;Lo;0;R;;;;;N;;;;; +10827;CYPRIOT SYLLABLE RU;Lo;0;R;;;;;N;;;;; +10828;CYPRIOT SYLLABLE SA;Lo;0;R;;;;;N;;;;; +10829;CYPRIOT SYLLABLE SE;Lo;0;R;;;;;N;;;;; +1082A;CYPRIOT SYLLABLE SI;Lo;0;R;;;;;N;;;;; +1082B;CYPRIOT SYLLABLE SO;Lo;0;R;;;;;N;;;;; +1082C;CYPRIOT SYLLABLE SU;Lo;0;R;;;;;N;;;;; +1082D;CYPRIOT SYLLABLE TA;Lo;0;R;;;;;N;;;;; +1082E;CYPRIOT SYLLABLE TE;Lo;0;R;;;;;N;;;;; +1082F;CYPRIOT SYLLABLE TI;Lo;0;R;;;;;N;;;;; +10830;CYPRIOT SYLLABLE TO;Lo;0;R;;;;;N;;;;; +10831;CYPRIOT SYLLABLE TU;Lo;0;R;;;;;N;;;;; +10832;CYPRIOT SYLLABLE WA;Lo;0;R;;;;;N;;;;; +10833;CYPRIOT SYLLABLE WE;Lo;0;R;;;;;N;;;;; +10834;CYPRIOT SYLLABLE WI;Lo;0;R;;;;;N;;;;; +10835;CYPRIOT SYLLABLE WO;Lo;0;R;;;;;N;;;;; +10837;CYPRIOT SYLLABLE XA;Lo;0;R;;;;;N;;;;; +10838;CYPRIOT SYLLABLE XE;Lo;0;R;;;;;N;;;;; +1083C;CYPRIOT SYLLABLE ZA;Lo;0;R;;;;;N;;;;; +1083F;CYPRIOT SYLLABLE ZO;Lo;0;R;;;;;N;;;;; +10840;IMPERIAL ARAMAIC LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10841;IMPERIAL ARAMAIC LETTER BETH;Lo;0;R;;;;;N;;;;; +10842;IMPERIAL ARAMAIC LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10843;IMPERIAL ARAMAIC LETTER DALETH;Lo;0;R;;;;;N;;;;; +10844;IMPERIAL ARAMAIC LETTER HE;Lo;0;R;;;;;N;;;;; +10845;IMPERIAL ARAMAIC LETTER WAW;Lo;0;R;;;;;N;;;;; +10846;IMPERIAL ARAMAIC LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10847;IMPERIAL ARAMAIC LETTER HETH;Lo;0;R;;;;;N;;;;; +10848;IMPERIAL ARAMAIC LETTER TETH;Lo;0;R;;;;;N;;;;; +10849;IMPERIAL ARAMAIC LETTER YODH;Lo;0;R;;;;;N;;;;; +1084A;IMPERIAL ARAMAIC LETTER KAPH;Lo;0;R;;;;;N;;;;; +1084B;IMPERIAL ARAMAIC LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +1084C;IMPERIAL ARAMAIC LETTER MEM;Lo;0;R;;;;;N;;;;; +1084D;IMPERIAL ARAMAIC LETTER NUN;Lo;0;R;;;;;N;;;;; +1084E;IMPERIAL ARAMAIC LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +1084F;IMPERIAL ARAMAIC LETTER AYIN;Lo;0;R;;;;;N;;;;; +10850;IMPERIAL ARAMAIC LETTER PE;Lo;0;R;;;;;N;;;;; +10851;IMPERIAL ARAMAIC LETTER SADHE;Lo;0;R;;;;;N;;;;; +10852;IMPERIAL ARAMAIC LETTER QOPH;Lo;0;R;;;;;N;;;;; +10853;IMPERIAL ARAMAIC LETTER RESH;Lo;0;R;;;;;N;;;;; +10854;IMPERIAL ARAMAIC LETTER SHIN;Lo;0;R;;;;;N;;;;; +10855;IMPERIAL ARAMAIC LETTER TAW;Lo;0;R;;;;;N;;;;; +10857;IMPERIAL ARAMAIC SECTION SIGN;Po;0;R;;;;;N;;;;; +10858;IMPERIAL ARAMAIC NUMBER ONE;No;0;R;;;;1;N;;;;; +10859;IMPERIAL ARAMAIC NUMBER TWO;No;0;R;;;;2;N;;;;; +1085A;IMPERIAL ARAMAIC NUMBER THREE;No;0;R;;;;3;N;;;;; +1085B;IMPERIAL ARAMAIC NUMBER TEN;No;0;R;;;;10;N;;;;; +1085C;IMPERIAL ARAMAIC NUMBER TWENTY;No;0;R;;;;20;N;;;;; +1085D;IMPERIAL ARAMAIC NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +1085E;IMPERIAL ARAMAIC NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +1085F;IMPERIAL ARAMAIC NUMBER TEN THOUSAND;No;0;R;;;;10000;N;;;;; +10900;PHOENICIAN LETTER ALF;Lo;0;R;;;;;N;;;;; +10901;PHOENICIAN LETTER BET;Lo;0;R;;;;;N;;;;; +10902;PHOENICIAN LETTER GAML;Lo;0;R;;;;;N;;;;; +10903;PHOENICIAN LETTER DELT;Lo;0;R;;;;;N;;;;; +10904;PHOENICIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10905;PHOENICIAN LETTER WAU;Lo;0;R;;;;;N;;;;; +10906;PHOENICIAN LETTER ZAI;Lo;0;R;;;;;N;;;;; +10907;PHOENICIAN LETTER HET;Lo;0;R;;;;;N;;;;; +10908;PHOENICIAN LETTER TET;Lo;0;R;;;;;N;;;;; +10909;PHOENICIAN LETTER YOD;Lo;0;R;;;;;N;;;;; +1090A;PHOENICIAN LETTER KAF;Lo;0;R;;;;;N;;;;; +1090B;PHOENICIAN LETTER LAMD;Lo;0;R;;;;;N;;;;; +1090C;PHOENICIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +1090D;PHOENICIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +1090E;PHOENICIAN LETTER SEMK;Lo;0;R;;;;;N;;;;; +1090F;PHOENICIAN LETTER AIN;Lo;0;R;;;;;N;;;;; +10910;PHOENICIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10911;PHOENICIAN LETTER SADE;Lo;0;R;;;;;N;;;;; +10912;PHOENICIAN LETTER QOF;Lo;0;R;;;;;N;;;;; +10913;PHOENICIAN LETTER ROSH;Lo;0;R;;;;;N;;;;; +10914;PHOENICIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10915;PHOENICIAN LETTER TAU;Lo;0;R;;;;;N;;;;; +10916;PHOENICIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10917;PHOENICIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10918;PHOENICIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10919;PHOENICIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +1091A;PHOENICIAN NUMBER TWO;No;0;R;;;;2;N;;;;; +1091B;PHOENICIAN NUMBER THREE;No;0;R;;;;3;N;;;;; +1091F;PHOENICIAN WORD SEPARATOR;Po;0;ON;;;;;N;;;;; +10920;LYDIAN LETTER A;Lo;0;R;;;;;N;;;;; +10921;LYDIAN LETTER B;Lo;0;R;;;;;N;;;;; +10922;LYDIAN LETTER G;Lo;0;R;;;;;N;;;;; +10923;LYDIAN LETTER D;Lo;0;R;;;;;N;;;;; +10924;LYDIAN LETTER E;Lo;0;R;;;;;N;;;;; +10925;LYDIAN LETTER V;Lo;0;R;;;;;N;;;;; +10926;LYDIAN LETTER I;Lo;0;R;;;;;N;;;;; +10927;LYDIAN LETTER Y;Lo;0;R;;;;;N;;;;; +10928;LYDIAN LETTER K;Lo;0;R;;;;;N;;;;; +10929;LYDIAN LETTER L;Lo;0;R;;;;;N;;;;; +1092A;LYDIAN LETTER M;Lo;0;R;;;;;N;;;;; +1092B;LYDIAN LETTER N;Lo;0;R;;;;;N;;;;; +1092C;LYDIAN LETTER O;Lo;0;R;;;;;N;;;;; +1092D;LYDIAN LETTER R;Lo;0;R;;;;;N;;;;; +1092E;LYDIAN LETTER SS;Lo;0;R;;;;;N;;;;; +1092F;LYDIAN LETTER T;Lo;0;R;;;;;N;;;;; +10930;LYDIAN LETTER U;Lo;0;R;;;;;N;;;;; +10931;LYDIAN LETTER F;Lo;0;R;;;;;N;;;;; +10932;LYDIAN LETTER Q;Lo;0;R;;;;;N;;;;; +10933;LYDIAN LETTER S;Lo;0;R;;;;;N;;;;; +10934;LYDIAN LETTER TT;Lo;0;R;;;;;N;;;;; +10935;LYDIAN LETTER AN;Lo;0;R;;;;;N;;;;; +10936;LYDIAN LETTER EN;Lo;0;R;;;;;N;;;;; +10937;LYDIAN LETTER LY;Lo;0;R;;;;;N;;;;; +10938;LYDIAN LETTER NN;Lo;0;R;;;;;N;;;;; +10939;LYDIAN LETTER C;Lo;0;R;;;;;N;;;;; +1093F;LYDIAN TRIANGULAR MARK;Po;0;R;;;;;N;;;;; +10A00;KHAROSHTHI LETTER A;Lo;0;R;;;;;N;;;;; +10A01;KHAROSHTHI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +10A02;KHAROSHTHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +10A03;KHAROSHTHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +10A05;KHAROSHTHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +10A06;KHAROSHTHI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +10A0C;KHAROSHTHI VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +10A0D;KHAROSHTHI SIGN DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; +10A0E;KHAROSHTHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +10A0F;KHAROSHTHI SIGN VISARGA;Mn;230;NSM;;;;;N;;;;; +10A10;KHAROSHTHI LETTER KA;Lo;0;R;;;;;N;;;;; +10A11;KHAROSHTHI LETTER KHA;Lo;0;R;;;;;N;;;;; +10A12;KHAROSHTHI LETTER GA;Lo;0;R;;;;;N;;;;; +10A13;KHAROSHTHI LETTER GHA;Lo;0;R;;;;;N;;;;; +10A15;KHAROSHTHI LETTER CA;Lo;0;R;;;;;N;;;;; +10A16;KHAROSHTHI LETTER CHA;Lo;0;R;;;;;N;;;;; +10A17;KHAROSHTHI LETTER JA;Lo;0;R;;;;;N;;;;; +10A19;KHAROSHTHI LETTER NYA;Lo;0;R;;;;;N;;;;; +10A1A;KHAROSHTHI LETTER TTA;Lo;0;R;;;;;N;;;;; +10A1B;KHAROSHTHI LETTER TTHA;Lo;0;R;;;;;N;;;;; +10A1C;KHAROSHTHI LETTER DDA;Lo;0;R;;;;;N;;;;; +10A1D;KHAROSHTHI LETTER DDHA;Lo;0;R;;;;;N;;;;; +10A1E;KHAROSHTHI LETTER NNA;Lo;0;R;;;;;N;;;;; +10A1F;KHAROSHTHI LETTER TA;Lo;0;R;;;;;N;;;;; +10A20;KHAROSHTHI LETTER THA;Lo;0;R;;;;;N;;;;; +10A21;KHAROSHTHI LETTER DA;Lo;0;R;;;;;N;;;;; +10A22;KHAROSHTHI LETTER DHA;Lo;0;R;;;;;N;;;;; +10A23;KHAROSHTHI LETTER NA;Lo;0;R;;;;;N;;;;; +10A24;KHAROSHTHI LETTER PA;Lo;0;R;;;;;N;;;;; +10A25;KHAROSHTHI LETTER PHA;Lo;0;R;;;;;N;;;;; +10A26;KHAROSHTHI LETTER BA;Lo;0;R;;;;;N;;;;; +10A27;KHAROSHTHI LETTER BHA;Lo;0;R;;;;;N;;;;; +10A28;KHAROSHTHI LETTER MA;Lo;0;R;;;;;N;;;;; +10A29;KHAROSHTHI LETTER YA;Lo;0;R;;;;;N;;;;; +10A2A;KHAROSHTHI LETTER RA;Lo;0;R;;;;;N;;;;; +10A2B;KHAROSHTHI LETTER LA;Lo;0;R;;;;;N;;;;; +10A2C;KHAROSHTHI LETTER VA;Lo;0;R;;;;;N;;;;; +10A2D;KHAROSHTHI LETTER SHA;Lo;0;R;;;;;N;;;;; +10A2E;KHAROSHTHI LETTER SSA;Lo;0;R;;;;;N;;;;; +10A2F;KHAROSHTHI LETTER SA;Lo;0;R;;;;;N;;;;; +10A30;KHAROSHTHI LETTER ZA;Lo;0;R;;;;;N;;;;; +10A31;KHAROSHTHI LETTER HA;Lo;0;R;;;;;N;;;;; +10A32;KHAROSHTHI LETTER KKA;Lo;0;R;;;;;N;;;;; +10A33;KHAROSHTHI LETTER TTTHA;Lo;0;R;;;;;N;;;;; +10A38;KHAROSHTHI SIGN BAR ABOVE;Mn;230;NSM;;;;;N;;;;; +10A39;KHAROSHTHI SIGN CAUDA;Mn;1;NSM;;;;;N;;;;; +10A3A;KHAROSHTHI SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; +10A3F;KHAROSHTHI VIRAMA;Mn;9;NSM;;;;;N;;;;; +10A40;KHAROSHTHI DIGIT ONE;No;0;R;;;1;1;N;;;;; +10A41;KHAROSHTHI DIGIT TWO;No;0;R;;;2;2;N;;;;; +10A42;KHAROSHTHI DIGIT THREE;No;0;R;;;3;3;N;;;;; +10A43;KHAROSHTHI DIGIT FOUR;No;0;R;;;4;4;N;;;;; +10A44;KHAROSHTHI NUMBER TEN;No;0;R;;;;10;N;;;;; +10A45;KHAROSHTHI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10A46;KHAROSHTHI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10A47;KHAROSHTHI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10A50;KHAROSHTHI PUNCTUATION DOT;Po;0;R;;;;;N;;;;; +10A51;KHAROSHTHI PUNCTUATION SMALL CIRCLE;Po;0;R;;;;;N;;;;; +10A52;KHAROSHTHI PUNCTUATION CIRCLE;Po;0;R;;;;;N;;;;; +10A53;KHAROSHTHI PUNCTUATION CRESCENT BAR;Po;0;R;;;;;N;;;;; +10A54;KHAROSHTHI PUNCTUATION MANGALAM;Po;0;R;;;;;N;;;;; +10A55;KHAROSHTHI PUNCTUATION LOTUS;Po;0;R;;;;;N;;;;; +10A56;KHAROSHTHI PUNCTUATION DANDA;Po;0;R;;;;;N;;;;; +10A57;KHAROSHTHI PUNCTUATION DOUBLE DANDA;Po;0;R;;;;;N;;;;; +10A58;KHAROSHTHI PUNCTUATION LINES;Po;0;R;;;;;N;;;;; +10A60;OLD SOUTH ARABIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10A61;OLD SOUTH ARABIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10A62;OLD SOUTH ARABIAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10A63;OLD SOUTH ARABIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10A64;OLD SOUTH ARABIAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +10A65;OLD SOUTH ARABIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10A66;OLD SOUTH ARABIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10A67;OLD SOUTH ARABIAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10A68;OLD SOUTH ARABIAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10A69;OLD SOUTH ARABIAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10A6A;OLD SOUTH ARABIAN LETTER SAT;Lo;0;R;;;;;N;;;;; +10A6B;OLD SOUTH ARABIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10A6C;OLD SOUTH ARABIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10A6D;OLD SOUTH ARABIAN LETTER KHETH;Lo;0;R;;;;;N;;;;; +10A6E;OLD SOUTH ARABIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10A6F;OLD SOUTH ARABIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10A70;OLD SOUTH ARABIAN LETTER FE;Lo;0;R;;;;;N;;;;; +10A71;OLD SOUTH ARABIAN LETTER ALEF;Lo;0;R;;;;;N;;;;; +10A72;OLD SOUTH ARABIAN LETTER AYN;Lo;0;R;;;;;N;;;;; +10A73;OLD SOUTH ARABIAN LETTER DHADHE;Lo;0;R;;;;;N;;;;; +10A74;OLD SOUTH ARABIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10A75;OLD SOUTH ARABIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10A76;OLD SOUTH ARABIAN LETTER GHAYN;Lo;0;R;;;;;N;;;;; +10A77;OLD SOUTH ARABIAN LETTER TETH;Lo;0;R;;;;;N;;;;; +10A78;OLD SOUTH ARABIAN LETTER ZAYN;Lo;0;R;;;;;N;;;;; +10A79;OLD SOUTH ARABIAN LETTER DHALETH;Lo;0;R;;;;;N;;;;; +10A7A;OLD SOUTH ARABIAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10A7B;OLD SOUTH ARABIAN LETTER THAW;Lo;0;R;;;;;N;;;;; +10A7C;OLD SOUTH ARABIAN LETTER THETH;Lo;0;R;;;;;N;;;;; +10A7D;OLD SOUTH ARABIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10A7E;OLD SOUTH ARABIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;; +10A7F;OLD SOUTH ARABIAN NUMERIC INDICATOR;Po;0;R;;;;;N;;;;; +10B00;AVESTAN LETTER A;Lo;0;R;;;;;N;;;;; +10B01;AVESTAN LETTER AA;Lo;0;R;;;;;N;;;;; +10B02;AVESTAN LETTER AO;Lo;0;R;;;;;N;;;;; +10B03;AVESTAN LETTER AAO;Lo;0;R;;;;;N;;;;; +10B04;AVESTAN LETTER AN;Lo;0;R;;;;;N;;;;; +10B05;AVESTAN LETTER AAN;Lo;0;R;;;;;N;;;;; +10B06;AVESTAN LETTER AE;Lo;0;R;;;;;N;;;;; +10B07;AVESTAN LETTER AEE;Lo;0;R;;;;;N;;;;; +10B08;AVESTAN LETTER E;Lo;0;R;;;;;N;;;;; +10B09;AVESTAN LETTER EE;Lo;0;R;;;;;N;;;;; +10B0A;AVESTAN LETTER O;Lo;0;R;;;;;N;;;;; +10B0B;AVESTAN LETTER OO;Lo;0;R;;;;;N;;;;; +10B0C;AVESTAN LETTER I;Lo;0;R;;;;;N;;;;; +10B0D;AVESTAN LETTER II;Lo;0;R;;;;;N;;;;; +10B0E;AVESTAN LETTER U;Lo;0;R;;;;;N;;;;; +10B0F;AVESTAN LETTER UU;Lo;0;R;;;;;N;;;;; +10B10;AVESTAN LETTER KE;Lo;0;R;;;;;N;;;;; +10B11;AVESTAN LETTER XE;Lo;0;R;;;;;N;;;;; +10B12;AVESTAN LETTER XYE;Lo;0;R;;;;;N;;;;; +10B13;AVESTAN LETTER XVE;Lo;0;R;;;;;N;;;;; +10B14;AVESTAN LETTER GE;Lo;0;R;;;;;N;;;;; +10B15;AVESTAN LETTER GGE;Lo;0;R;;;;;N;;;;; +10B16;AVESTAN LETTER GHE;Lo;0;R;;;;;N;;;;; +10B17;AVESTAN LETTER CE;Lo;0;R;;;;;N;;;;; +10B18;AVESTAN LETTER JE;Lo;0;R;;;;;N;;;;; +10B19;AVESTAN LETTER TE;Lo;0;R;;;;;N;;;;; +10B1A;AVESTAN LETTER THE;Lo;0;R;;;;;N;;;;; +10B1B;AVESTAN LETTER DE;Lo;0;R;;;;;N;;;;; +10B1C;AVESTAN LETTER DHE;Lo;0;R;;;;;N;;;;; +10B1D;AVESTAN LETTER TTE;Lo;0;R;;;;;N;;;;; +10B1E;AVESTAN LETTER PE;Lo;0;R;;;;;N;;;;; +10B1F;AVESTAN LETTER FE;Lo;0;R;;;;;N;;;;; +10B20;AVESTAN LETTER BE;Lo;0;R;;;;;N;;;;; +10B21;AVESTAN LETTER BHE;Lo;0;R;;;;;N;;;;; +10B22;AVESTAN LETTER NGE;Lo;0;R;;;;;N;;;;; +10B23;AVESTAN LETTER NGYE;Lo;0;R;;;;;N;;;;; +10B24;AVESTAN LETTER NGVE;Lo;0;R;;;;;N;;;;; +10B25;AVESTAN LETTER NE;Lo;0;R;;;;;N;;;;; +10B26;AVESTAN LETTER NYE;Lo;0;R;;;;;N;;;;; +10B27;AVESTAN LETTER NNE;Lo;0;R;;;;;N;;;;; +10B28;AVESTAN LETTER ME;Lo;0;R;;;;;N;;;;; +10B29;AVESTAN LETTER HME;Lo;0;R;;;;;N;;;;; +10B2A;AVESTAN LETTER YYE;Lo;0;R;;;;;N;;;;; +10B2B;AVESTAN LETTER YE;Lo;0;R;;;;;N;;;;; +10B2C;AVESTAN LETTER VE;Lo;0;R;;;;;N;;;;; +10B2D;AVESTAN LETTER RE;Lo;0;R;;;;;N;;;;; +10B2E;AVESTAN LETTER LE;Lo;0;R;;;;;N;;;;; +10B2F;AVESTAN LETTER SE;Lo;0;R;;;;;N;;;;; +10B30;AVESTAN LETTER ZE;Lo;0;R;;;;;N;;;;; +10B31;AVESTAN LETTER SHE;Lo;0;R;;;;;N;;;;; +10B32;AVESTAN LETTER ZHE;Lo;0;R;;;;;N;;;;; +10B33;AVESTAN LETTER SHYE;Lo;0;R;;;;;N;;;;; +10B34;AVESTAN LETTER SSHE;Lo;0;R;;;;;N;;;;; +10B35;AVESTAN LETTER HE;Lo;0;R;;;;;N;;;;; +10B39;AVESTAN ABBREVIATION MARK;Po;0;ON;;;;;N;;;;; +10B3A;TINY TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3B;SMALL TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3C;LARGE TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3D;LARGE ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3E;LARGE TWO RINGS OVER ONE RING PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3F;LARGE ONE RING OVER TWO RINGS PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B40;INSCRIPTIONAL PARTHIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10B41;INSCRIPTIONAL PARTHIAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10B42;INSCRIPTIONAL PARTHIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10B43;INSCRIPTIONAL PARTHIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10B44;INSCRIPTIONAL PARTHIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10B45;INSCRIPTIONAL PARTHIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10B46;INSCRIPTIONAL PARTHIAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10B47;INSCRIPTIONAL PARTHIAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10B48;INSCRIPTIONAL PARTHIAN LETTER TETH;Lo;0;R;;;;;N;;;;; +10B49;INSCRIPTIONAL PARTHIAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10B4A;INSCRIPTIONAL PARTHIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10B4B;INSCRIPTIONAL PARTHIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10B4C;INSCRIPTIONAL PARTHIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10B4D;INSCRIPTIONAL PARTHIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10B4E;INSCRIPTIONAL PARTHIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10B4F;INSCRIPTIONAL PARTHIAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10B50;INSCRIPTIONAL PARTHIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10B51;INSCRIPTIONAL PARTHIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10B52;INSCRIPTIONAL PARTHIAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +10B53;INSCRIPTIONAL PARTHIAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10B54;INSCRIPTIONAL PARTHIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10B55;INSCRIPTIONAL PARTHIAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10B58;INSCRIPTIONAL PARTHIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10B59;INSCRIPTIONAL PARTHIAN NUMBER TWO;No;0;R;;;;2;N;;;;; +10B5A;INSCRIPTIONAL PARTHIAN NUMBER THREE;No;0;R;;;;3;N;;;;; +10B5B;INSCRIPTIONAL PARTHIAN NUMBER FOUR;No;0;R;;;;4;N;;;;; +10B5C;INSCRIPTIONAL PARTHIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10B5D;INSCRIPTIONAL PARTHIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10B5E;INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10B5F;INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10B60;INSCRIPTIONAL PAHLAVI LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10B61;INSCRIPTIONAL PAHLAVI LETTER BETH;Lo;0;R;;;;;N;;;;; +10B62;INSCRIPTIONAL PAHLAVI LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10B63;INSCRIPTIONAL PAHLAVI LETTER DALETH;Lo;0;R;;;;;N;;;;; +10B64;INSCRIPTIONAL PAHLAVI LETTER HE;Lo;0;R;;;;;N;;;;; +10B65;INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH;Lo;0;R;;;;;N;;;;; +10B66;INSCRIPTIONAL PAHLAVI LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10B67;INSCRIPTIONAL PAHLAVI LETTER HETH;Lo;0;R;;;;;N;;;;; +10B68;INSCRIPTIONAL PAHLAVI LETTER TETH;Lo;0;R;;;;;N;;;;; +10B69;INSCRIPTIONAL PAHLAVI LETTER YODH;Lo;0;R;;;;;N;;;;; +10B6A;INSCRIPTIONAL PAHLAVI LETTER KAPH;Lo;0;R;;;;;N;;;;; +10B6B;INSCRIPTIONAL PAHLAVI LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10B6C;INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH;Lo;0;R;;;;;N;;;;; +10B6D;INSCRIPTIONAL PAHLAVI LETTER NUN;Lo;0;R;;;;;N;;;;; +10B6E;INSCRIPTIONAL PAHLAVI LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10B6F;INSCRIPTIONAL PAHLAVI LETTER PE;Lo;0;R;;;;;N;;;;; +10B70;INSCRIPTIONAL PAHLAVI LETTER SADHE;Lo;0;R;;;;;N;;;;; +10B71;INSCRIPTIONAL PAHLAVI LETTER SHIN;Lo;0;R;;;;;N;;;;; +10B72;INSCRIPTIONAL PAHLAVI LETTER TAW;Lo;0;R;;;;;N;;;;; +10B78;INSCRIPTIONAL PAHLAVI NUMBER ONE;No;0;R;;;;1;N;;;;; +10B79;INSCRIPTIONAL PAHLAVI NUMBER TWO;No;0;R;;;;2;N;;;;; +10B7A;INSCRIPTIONAL PAHLAVI NUMBER THREE;No;0;R;;;;3;N;;;;; +10B7B;INSCRIPTIONAL PAHLAVI NUMBER FOUR;No;0;R;;;;4;N;;;;; +10B7C;INSCRIPTIONAL PAHLAVI NUMBER TEN;No;0;R;;;;10;N;;;;; +10B7D;INSCRIPTIONAL PAHLAVI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10B7E;INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10B7F;INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10C00;OLD TURKIC LETTER ORKHON A;Lo;0;R;;;;;N;;;;; +10C01;OLD TURKIC LETTER YENISEI A;Lo;0;R;;;;;N;;;;; +10C02;OLD TURKIC LETTER YENISEI AE;Lo;0;R;;;;;N;;;;; +10C03;OLD TURKIC LETTER ORKHON I;Lo;0;R;;;;;N;;;;; +10C04;OLD TURKIC LETTER YENISEI I;Lo;0;R;;;;;N;;;;; +10C05;OLD TURKIC LETTER YENISEI E;Lo;0;R;;;;;N;;;;; +10C06;OLD TURKIC LETTER ORKHON O;Lo;0;R;;;;;N;;;;; +10C07;OLD TURKIC LETTER ORKHON OE;Lo;0;R;;;;;N;;;;; +10C08;OLD TURKIC LETTER YENISEI OE;Lo;0;R;;;;;N;;;;; +10C09;OLD TURKIC LETTER ORKHON AB;Lo;0;R;;;;;N;;;;; +10C0A;OLD TURKIC LETTER YENISEI AB;Lo;0;R;;;;;N;;;;; +10C0B;OLD TURKIC LETTER ORKHON AEB;Lo;0;R;;;;;N;;;;; +10C0C;OLD TURKIC LETTER YENISEI AEB;Lo;0;R;;;;;N;;;;; +10C0D;OLD TURKIC LETTER ORKHON AG;Lo;0;R;;;;;N;;;;; +10C0E;OLD TURKIC LETTER YENISEI AG;Lo;0;R;;;;;N;;;;; +10C0F;OLD TURKIC LETTER ORKHON AEG;Lo;0;R;;;;;N;;;;; +10C10;OLD TURKIC LETTER YENISEI AEG;Lo;0;R;;;;;N;;;;; +10C11;OLD TURKIC LETTER ORKHON AD;Lo;0;R;;;;;N;;;;; +10C12;OLD TURKIC LETTER YENISEI AD;Lo;0;R;;;;;N;;;;; +10C13;OLD TURKIC LETTER ORKHON AED;Lo;0;R;;;;;N;;;;; +10C14;OLD TURKIC LETTER ORKHON EZ;Lo;0;R;;;;;N;;;;; +10C15;OLD TURKIC LETTER YENISEI EZ;Lo;0;R;;;;;N;;;;; +10C16;OLD TURKIC LETTER ORKHON AY;Lo;0;R;;;;;N;;;;; +10C17;OLD TURKIC LETTER YENISEI AY;Lo;0;R;;;;;N;;;;; +10C18;OLD TURKIC LETTER ORKHON AEY;Lo;0;R;;;;;N;;;;; +10C19;OLD TURKIC LETTER YENISEI AEY;Lo;0;R;;;;;N;;;;; +10C1A;OLD TURKIC LETTER ORKHON AEK;Lo;0;R;;;;;N;;;;; +10C1B;OLD TURKIC LETTER YENISEI AEK;Lo;0;R;;;;;N;;;;; +10C1C;OLD TURKIC LETTER ORKHON OEK;Lo;0;R;;;;;N;;;;; +10C1D;OLD TURKIC LETTER YENISEI OEK;Lo;0;R;;;;;N;;;;; +10C1E;OLD TURKIC LETTER ORKHON AL;Lo;0;R;;;;;N;;;;; +10C1F;OLD TURKIC LETTER YENISEI AL;Lo;0;R;;;;;N;;;;; +10C20;OLD TURKIC LETTER ORKHON AEL;Lo;0;R;;;;;N;;;;; +10C21;OLD TURKIC LETTER ORKHON ELT;Lo;0;R;;;;;N;;;;; +10C22;OLD TURKIC LETTER ORKHON EM;Lo;0;R;;;;;N;;;;; +10C23;OLD TURKIC LETTER ORKHON AN;Lo;0;R;;;;;N;;;;; +10C24;OLD TURKIC LETTER ORKHON AEN;Lo;0;R;;;;;N;;;;; +10C25;OLD TURKIC LETTER YENISEI AEN;Lo;0;R;;;;;N;;;;; +10C26;OLD TURKIC LETTER ORKHON ENT;Lo;0;R;;;;;N;;;;; +10C27;OLD TURKIC LETTER YENISEI ENT;Lo;0;R;;;;;N;;;;; +10C28;OLD TURKIC LETTER ORKHON ENC;Lo;0;R;;;;;N;;;;; +10C29;OLD TURKIC LETTER YENISEI ENC;Lo;0;R;;;;;N;;;;; +10C2A;OLD TURKIC LETTER ORKHON ENY;Lo;0;R;;;;;N;;;;; +10C2B;OLD TURKIC LETTER YENISEI ENY;Lo;0;R;;;;;N;;;;; +10C2C;OLD TURKIC LETTER YENISEI ANG;Lo;0;R;;;;;N;;;;; +10C2D;OLD TURKIC LETTER ORKHON ENG;Lo;0;R;;;;;N;;;;; +10C2E;OLD TURKIC LETTER YENISEI AENG;Lo;0;R;;;;;N;;;;; +10C2F;OLD TURKIC LETTER ORKHON EP;Lo;0;R;;;;;N;;;;; +10C30;OLD TURKIC LETTER ORKHON OP;Lo;0;R;;;;;N;;;;; +10C31;OLD TURKIC LETTER ORKHON IC;Lo;0;R;;;;;N;;;;; +10C32;OLD TURKIC LETTER ORKHON EC;Lo;0;R;;;;;N;;;;; +10C33;OLD TURKIC LETTER YENISEI EC;Lo;0;R;;;;;N;;;;; +10C34;OLD TURKIC LETTER ORKHON AQ;Lo;0;R;;;;;N;;;;; +10C35;OLD TURKIC LETTER YENISEI AQ;Lo;0;R;;;;;N;;;;; +10C36;OLD TURKIC LETTER ORKHON IQ;Lo;0;R;;;;;N;;;;; +10C37;OLD TURKIC LETTER YENISEI IQ;Lo;0;R;;;;;N;;;;; +10C38;OLD TURKIC LETTER ORKHON OQ;Lo;0;R;;;;;N;;;;; +10C39;OLD TURKIC LETTER YENISEI OQ;Lo;0;R;;;;;N;;;;; +10C3A;OLD TURKIC LETTER ORKHON AR;Lo;0;R;;;;;N;;;;; +10C3B;OLD TURKIC LETTER YENISEI AR;Lo;0;R;;;;;N;;;;; +10C3C;OLD TURKIC LETTER ORKHON AER;Lo;0;R;;;;;N;;;;; +10C3D;OLD TURKIC LETTER ORKHON AS;Lo;0;R;;;;;N;;;;; +10C3E;OLD TURKIC LETTER ORKHON AES;Lo;0;R;;;;;N;;;;; +10C3F;OLD TURKIC LETTER ORKHON ASH;Lo;0;R;;;;;N;;;;; +10C40;OLD TURKIC LETTER YENISEI ASH;Lo;0;R;;;;;N;;;;; +10C41;OLD TURKIC LETTER ORKHON ESH;Lo;0;R;;;;;N;;;;; +10C42;OLD TURKIC LETTER YENISEI ESH;Lo;0;R;;;;;N;;;;; +10C43;OLD TURKIC LETTER ORKHON AT;Lo;0;R;;;;;N;;;;; +10C44;OLD TURKIC LETTER YENISEI AT;Lo;0;R;;;;;N;;;;; +10C45;OLD TURKIC LETTER ORKHON AET;Lo;0;R;;;;;N;;;;; +10C46;OLD TURKIC LETTER YENISEI AET;Lo;0;R;;;;;N;;;;; +10C47;OLD TURKIC LETTER ORKHON OT;Lo;0;R;;;;;N;;;;; +10C48;OLD TURKIC LETTER ORKHON BASH;Lo;0;R;;;;;N;;;;; +10E60;RUMI DIGIT ONE;No;0;AN;;;1;1;N;;;;; +10E61;RUMI DIGIT TWO;No;0;AN;;;2;2;N;;;;; +10E62;RUMI DIGIT THREE;No;0;AN;;;3;3;N;;;;; +10E63;RUMI DIGIT FOUR;No;0;AN;;;4;4;N;;;;; +10E64;RUMI DIGIT FIVE;No;0;AN;;;5;5;N;;;;; +10E65;RUMI DIGIT SIX;No;0;AN;;;6;6;N;;;;; +10E66;RUMI DIGIT SEVEN;No;0;AN;;;7;7;N;;;;; +10E67;RUMI DIGIT EIGHT;No;0;AN;;;8;8;N;;;;; +10E68;RUMI DIGIT NINE;No;0;AN;;;9;9;N;;;;; +10E69;RUMI NUMBER TEN;No;0;AN;;;;10;N;;;;; +10E6A;RUMI NUMBER TWENTY;No;0;AN;;;;20;N;;;;; +10E6B;RUMI NUMBER THIRTY;No;0;AN;;;;30;N;;;;; +10E6C;RUMI NUMBER FORTY;No;0;AN;;;;40;N;;;;; +10E6D;RUMI NUMBER FIFTY;No;0;AN;;;;50;N;;;;; +10E6E;RUMI NUMBER SIXTY;No;0;AN;;;;60;N;;;;; +10E6F;RUMI NUMBER SEVENTY;No;0;AN;;;;70;N;;;;; +10E70;RUMI NUMBER EIGHTY;No;0;AN;;;;80;N;;;;; +10E71;RUMI NUMBER NINETY;No;0;AN;;;;90;N;;;;; +10E72;RUMI NUMBER ONE HUNDRED;No;0;AN;;;;100;N;;;;; +10E73;RUMI NUMBER TWO HUNDRED;No;0;AN;;;;200;N;;;;; +10E74;RUMI NUMBER THREE HUNDRED;No;0;AN;;;;300;N;;;;; +10E75;RUMI NUMBER FOUR HUNDRED;No;0;AN;;;;400;N;;;;; +10E76;RUMI NUMBER FIVE HUNDRED;No;0;AN;;;;500;N;;;;; +10E77;RUMI NUMBER SIX HUNDRED;No;0;AN;;;;600;N;;;;; +10E78;RUMI NUMBER SEVEN HUNDRED;No;0;AN;;;;700;N;;;;; +10E79;RUMI NUMBER EIGHT HUNDRED;No;0;AN;;;;800;N;;;;; +10E7A;RUMI NUMBER NINE HUNDRED;No;0;AN;;;;900;N;;;;; +10E7B;RUMI FRACTION ONE HALF;No;0;AN;;;;1/2;N;;;;; +10E7C;RUMI FRACTION ONE QUARTER;No;0;AN;;;;1/4;N;;;;; +10E7D;RUMI FRACTION ONE THIRD;No;0;AN;;;;1/3;N;;;;; +10E7E;RUMI FRACTION TWO THIRDS;No;0;AN;;;;2/3;N;;;;; +11080;KAITHI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11081;KAITHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11082;KAITHI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11083;KAITHI LETTER A;Lo;0;L;;;;;N;;;;; +11084;KAITHI LETTER AA;Lo;0;L;;;;;N;;;;; +11085;KAITHI LETTER I;Lo;0;L;;;;;N;;;;; +11086;KAITHI LETTER II;Lo;0;L;;;;;N;;;;; +11087;KAITHI LETTER U;Lo;0;L;;;;;N;;;;; +11088;KAITHI LETTER UU;Lo;0;L;;;;;N;;;;; +11089;KAITHI LETTER E;Lo;0;L;;;;;N;;;;; +1108A;KAITHI LETTER AI;Lo;0;L;;;;;N;;;;; +1108B;KAITHI LETTER O;Lo;0;L;;;;;N;;;;; +1108C;KAITHI LETTER AU;Lo;0;L;;;;;N;;;;; +1108D;KAITHI LETTER KA;Lo;0;L;;;;;N;;;;; +1108E;KAITHI LETTER KHA;Lo;0;L;;;;;N;;;;; +1108F;KAITHI LETTER GA;Lo;0;L;;;;;N;;;;; +11090;KAITHI LETTER GHA;Lo;0;L;;;;;N;;;;; +11091;KAITHI LETTER NGA;Lo;0;L;;;;;N;;;;; +11092;KAITHI LETTER CA;Lo;0;L;;;;;N;;;;; +11093;KAITHI LETTER CHA;Lo;0;L;;;;;N;;;;; +11094;KAITHI LETTER JA;Lo;0;L;;;;;N;;;;; +11095;KAITHI LETTER JHA;Lo;0;L;;;;;N;;;;; +11096;KAITHI LETTER NYA;Lo;0;L;;;;;N;;;;; +11097;KAITHI LETTER TTA;Lo;0;L;;;;;N;;;;; +11098;KAITHI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11099;KAITHI LETTER DDA;Lo;0;L;;;;;N;;;;; +1109A;KAITHI LETTER DDDHA;Lo;0;L;11099 110BA;;;;N;;;;; +1109B;KAITHI LETTER DDHA;Lo;0;L;;;;;N;;;;; +1109C;KAITHI LETTER RHA;Lo;0;L;1109B 110BA;;;;N;;;;; +1109D;KAITHI LETTER NNA;Lo;0;L;;;;;N;;;;; +1109E;KAITHI LETTER TA;Lo;0;L;;;;;N;;;;; +1109F;KAITHI LETTER THA;Lo;0;L;;;;;N;;;;; +110A0;KAITHI LETTER DA;Lo;0;L;;;;;N;;;;; +110A1;KAITHI LETTER DHA;Lo;0;L;;;;;N;;;;; +110A2;KAITHI LETTER NA;Lo;0;L;;;;;N;;;;; +110A3;KAITHI LETTER PA;Lo;0;L;;;;;N;;;;; +110A4;KAITHI LETTER PHA;Lo;0;L;;;;;N;;;;; +110A5;KAITHI LETTER BA;Lo;0;L;;;;;N;;;;; +110A6;KAITHI LETTER BHA;Lo;0;L;;;;;N;;;;; +110A7;KAITHI LETTER MA;Lo;0;L;;;;;N;;;;; +110A8;KAITHI LETTER YA;Lo;0;L;;;;;N;;;;; +110A9;KAITHI LETTER RA;Lo;0;L;;;;;N;;;;; +110AA;KAITHI LETTER LA;Lo;0;L;;;;;N;;;;; +110AB;KAITHI LETTER VA;Lo;0;L;110A5 110BA;;;;N;;;;; +110AC;KAITHI LETTER SHA;Lo;0;L;;;;;N;;;;; +110AD;KAITHI LETTER SSA;Lo;0;L;;;;;N;;;;; +110AE;KAITHI LETTER SA;Lo;0;L;;;;;N;;;;; +110AF;KAITHI LETTER HA;Lo;0;L;;;;;N;;;;; +110B0;KAITHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +110B1;KAITHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +110B2;KAITHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +110B3;KAITHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +110B4;KAITHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +110B5;KAITHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +110B6;KAITHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +110B7;KAITHI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +110B8;KAITHI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +110B9;KAITHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +110BA;KAITHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +110BB;KAITHI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +110BC;KAITHI ENUMERATION SIGN;Po;0;L;;;;;N;;;;; +110BD;KAITHI NUMBER SIGN;Cf;0;L;;;;;N;;;;; +110BE;KAITHI SECTION MARK;Po;0;L;;;;;N;;;;; +110BF;KAITHI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;; +110C0;KAITHI DANDA;Po;0;L;;;;;N;;;;; +110C1;KAITHI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;; +12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;; +12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;; +12003;CUNEIFORM SIGN A TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12004;CUNEIFORM SIGN A TIMES HA;Lo;0;L;;;;;N;;;;; +12005;CUNEIFORM SIGN A TIMES IGI;Lo;0;L;;;;;N;;;;; +12006;CUNEIFORM SIGN A TIMES LAGAR GUNU;Lo;0;L;;;;;N;;;;; +12007;CUNEIFORM SIGN A TIMES MUSH;Lo;0;L;;;;;N;;;;; +12008;CUNEIFORM SIGN A TIMES SAG;Lo;0;L;;;;;N;;;;; +12009;CUNEIFORM SIGN A2;Lo;0;L;;;;;N;;;;; +1200A;CUNEIFORM SIGN AB;Lo;0;L;;;;;N;;;;; +1200B;CUNEIFORM SIGN AB TIMES ASH2;Lo;0;L;;;;;N;;;;; +1200C;CUNEIFORM SIGN AB TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; +1200D;CUNEIFORM SIGN AB TIMES GAL;Lo;0;L;;;;;N;;;;; +1200E;CUNEIFORM SIGN AB TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1200F;CUNEIFORM SIGN AB TIMES HA;Lo;0;L;;;;;N;;;;; +12010;CUNEIFORM SIGN AB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12011;CUNEIFORM SIGN AB TIMES IMIN;Lo;0;L;;;;;N;;;;; +12012;CUNEIFORM SIGN AB TIMES LAGAB;Lo;0;L;;;;;N;;;;; +12013;CUNEIFORM SIGN AB TIMES SHESH;Lo;0;L;;;;;N;;;;; +12014;CUNEIFORM SIGN AB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +12015;CUNEIFORM SIGN AB GUNU;Lo;0;L;;;;;N;;;;; +12016;CUNEIFORM SIGN AB2;Lo;0;L;;;;;N;;;;; +12017;CUNEIFORM SIGN AB2 TIMES BALAG;Lo;0;L;;;;;N;;;;; +12018;CUNEIFORM SIGN AB2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12019;CUNEIFORM SIGN AB2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +1201A;CUNEIFORM SIGN AB2 TIMES SHA3;Lo;0;L;;;;;N;;;;; +1201B;CUNEIFORM SIGN AB2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1201C;CUNEIFORM SIGN AD;Lo;0;L;;;;;N;;;;; +1201D;CUNEIFORM SIGN AK;Lo;0;L;;;;;N;;;;; +1201E;CUNEIFORM SIGN AK TIMES ERIN2;Lo;0;L;;;;;N;;;;; +1201F;CUNEIFORM SIGN AK TIMES SHITA PLUS GISH;Lo;0;L;;;;;N;;;;; +12020;CUNEIFORM SIGN AL;Lo;0;L;;;;;N;;;;; +12021;CUNEIFORM SIGN AL TIMES AL;Lo;0;L;;;;;N;;;;; +12022;CUNEIFORM SIGN AL TIMES DIM2;Lo;0;L;;;;;N;;;;; +12023;CUNEIFORM SIGN AL TIMES GISH;Lo;0;L;;;;;N;;;;; +12024;CUNEIFORM SIGN AL TIMES HA;Lo;0;L;;;;;N;;;;; +12025;CUNEIFORM SIGN AL TIMES KAD3;Lo;0;L;;;;;N;;;;; +12026;CUNEIFORM SIGN AL TIMES KI;Lo;0;L;;;;;N;;;;; +12027;CUNEIFORM SIGN AL TIMES SHE;Lo;0;L;;;;;N;;;;; +12028;CUNEIFORM SIGN AL TIMES USH;Lo;0;L;;;;;N;;;;; +12029;CUNEIFORM SIGN ALAN;Lo;0;L;;;;;N;;;;; +1202A;CUNEIFORM SIGN ALEPH;Lo;0;L;;;;;N;;;;; +1202B;CUNEIFORM SIGN AMAR;Lo;0;L;;;;;N;;;;; +1202C;CUNEIFORM SIGN AMAR TIMES SHE;Lo;0;L;;;;;N;;;;; +1202D;CUNEIFORM SIGN AN;Lo;0;L;;;;;N;;;;; +1202E;CUNEIFORM SIGN AN OVER AN;Lo;0;L;;;;;N;;;;; +1202F;CUNEIFORM SIGN AN THREE TIMES;Lo;0;L;;;;;N;;;;; +12030;CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA;Lo;0;L;;;;;N;;;;; +12031;CUNEIFORM SIGN AN PLUS NAGA SQUARED;Lo;0;L;;;;;N;;;;; +12032;CUNEIFORM SIGN ANSHE;Lo;0;L;;;;;N;;;;; +12033;CUNEIFORM SIGN APIN;Lo;0;L;;;;;N;;;;; +12034;CUNEIFORM SIGN ARAD;Lo;0;L;;;;;N;;;;; +12035;CUNEIFORM SIGN ARAD TIMES KUR;Lo;0;L;;;;;N;;;;; +12036;CUNEIFORM SIGN ARKAB;Lo;0;L;;;;;N;;;;; +12037;CUNEIFORM SIGN ASAL2;Lo;0;L;;;;;N;;;;; +12038;CUNEIFORM SIGN ASH;Lo;0;L;;;;;N;;;;; +12039;CUNEIFORM SIGN ASH ZIDA TENU;Lo;0;L;;;;;N;;;;; +1203A;CUNEIFORM SIGN ASH KABA TENU;Lo;0;L;;;;;N;;;;; +1203B;CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP;Lo;0;L;;;;;N;;;;; +1203C;CUNEIFORM SIGN ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; +1203D;CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; +1203E;CUNEIFORM SIGN ASH2;Lo;0;L;;;;;N;;;;; +1203F;CUNEIFORM SIGN ASHGAB;Lo;0;L;;;;;N;;;;; +12040;CUNEIFORM SIGN BA;Lo;0;L;;;;;N;;;;; +12041;CUNEIFORM SIGN BAD;Lo;0;L;;;;;N;;;;; +12042;CUNEIFORM SIGN BAG3;Lo;0;L;;;;;N;;;;; +12043;CUNEIFORM SIGN BAHAR2;Lo;0;L;;;;;N;;;;; +12044;CUNEIFORM SIGN BAL;Lo;0;L;;;;;N;;;;; +12045;CUNEIFORM SIGN BAL OVER BAL;Lo;0;L;;;;;N;;;;; +12046;CUNEIFORM SIGN BALAG;Lo;0;L;;;;;N;;;;; +12047;CUNEIFORM SIGN BAR;Lo;0;L;;;;;N;;;;; +12048;CUNEIFORM SIGN BARA2;Lo;0;L;;;;;N;;;;; +12049;CUNEIFORM SIGN BI;Lo;0;L;;;;;N;;;;; +1204A;CUNEIFORM SIGN BI TIMES A;Lo;0;L;;;;;N;;;;; +1204B;CUNEIFORM SIGN BI TIMES GAR;Lo;0;L;;;;;N;;;;; +1204C;CUNEIFORM SIGN BI TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1204D;CUNEIFORM SIGN BU;Lo;0;L;;;;;N;;;;; +1204E;CUNEIFORM SIGN BU OVER BU AB;Lo;0;L;;;;;N;;;;; +1204F;CUNEIFORM SIGN BU OVER BU UN;Lo;0;L;;;;;N;;;;; +12050;CUNEIFORM SIGN BU CROSSING BU;Lo;0;L;;;;;N;;;;; +12051;CUNEIFORM SIGN BULUG;Lo;0;L;;;;;N;;;;; +12052;CUNEIFORM SIGN BULUG OVER BULUG;Lo;0;L;;;;;N;;;;; +12053;CUNEIFORM SIGN BUR;Lo;0;L;;;;;N;;;;; +12054;CUNEIFORM SIGN BUR2;Lo;0;L;;;;;N;;;;; +12055;CUNEIFORM SIGN DA;Lo;0;L;;;;;N;;;;; +12056;CUNEIFORM SIGN DAG;Lo;0;L;;;;;N;;;;; +12057;CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH;Lo;0;L;;;;;N;;;;; +12058;CUNEIFORM SIGN DAG KISIM5 TIMES AMAR;Lo;0;L;;;;;N;;;;; +12059;CUNEIFORM SIGN DAG KISIM5 TIMES BALAG;Lo;0;L;;;;;N;;;;; +1205A;CUNEIFORM SIGN DAG KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; +1205B;CUNEIFORM SIGN DAG KISIM5 TIMES GA;Lo;0;L;;;;;N;;;;; +1205C;CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH;Lo;0;L;;;;;N;;;;; +1205D;CUNEIFORM SIGN DAG KISIM5 TIMES GI;Lo;0;L;;;;;N;;;;; +1205E;CUNEIFORM SIGN DAG KISIM5 TIMES GIR2;Lo;0;L;;;;;N;;;;; +1205F;CUNEIFORM SIGN DAG KISIM5 TIMES GUD;Lo;0;L;;;;;N;;;;; +12060;CUNEIFORM SIGN DAG KISIM5 TIMES HA;Lo;0;L;;;;;N;;;;; +12061;CUNEIFORM SIGN DAG KISIM5 TIMES IR;Lo;0;L;;;;;N;;;;; +12062;CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU;Lo;0;L;;;;;N;;;;; +12063;CUNEIFORM SIGN DAG KISIM5 TIMES KAK;Lo;0;L;;;;;N;;;;; +12064;CUNEIFORM SIGN DAG KISIM5 TIMES LA;Lo;0;L;;;;;N;;;;; +12065;CUNEIFORM SIGN DAG KISIM5 TIMES LU;Lo;0;L;;;;;N;;;;; +12066;CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2;Lo;0;L;;;;;N;;;;; +12067;CUNEIFORM SIGN DAG KISIM5 TIMES LUM;Lo;0;L;;;;;N;;;;; +12068;CUNEIFORM SIGN DAG KISIM5 TIMES NE;Lo;0;L;;;;;N;;;;; +12069;CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;; +1206A;CUNEIFORM SIGN DAG KISIM5 TIMES SI;Lo;0;L;;;;;N;;;;; +1206B;CUNEIFORM SIGN DAG KISIM5 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1206C;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2;Lo;0;L;;;;;N;;;;; +1206D;CUNEIFORM SIGN DAG KISIM5 TIMES USH;Lo;0;L;;;;;N;;;;; +1206E;CUNEIFORM SIGN DAM;Lo;0;L;;;;;N;;;;; +1206F;CUNEIFORM SIGN DAR;Lo;0;L;;;;;N;;;;; +12070;CUNEIFORM SIGN DARA3;Lo;0;L;;;;;N;;;;; +12071;CUNEIFORM SIGN DARA4;Lo;0;L;;;;;N;;;;; +12072;CUNEIFORM SIGN DI;Lo;0;L;;;;;N;;;;; +12073;CUNEIFORM SIGN DIB;Lo;0;L;;;;;N;;;;; +12074;CUNEIFORM SIGN DIM;Lo;0;L;;;;;N;;;;; +12075;CUNEIFORM SIGN DIM TIMES SHE;Lo;0;L;;;;;N;;;;; +12076;CUNEIFORM SIGN DIM2;Lo;0;L;;;;;N;;;;; +12077;CUNEIFORM SIGN DIN;Lo;0;L;;;;;N;;;;; +12078;CUNEIFORM SIGN DIN KASKAL U GUNU DISH;Lo;0;L;;;;;N;;;;; +12079;CUNEIFORM SIGN DISH;Lo;0;L;;;;;N;;;;; +1207A;CUNEIFORM SIGN DU;Lo;0;L;;;;;N;;;;; +1207B;CUNEIFORM SIGN DU OVER DU;Lo;0;L;;;;;N;;;;; +1207C;CUNEIFORM SIGN DU GUNU;Lo;0;L;;;;;N;;;;; +1207D;CUNEIFORM SIGN DU SHESHIG;Lo;0;L;;;;;N;;;;; +1207E;CUNEIFORM SIGN DUB;Lo;0;L;;;;;N;;;;; +1207F;CUNEIFORM SIGN DUB TIMES ESH2;Lo;0;L;;;;;N;;;;; +12080;CUNEIFORM SIGN DUB2;Lo;0;L;;;;;N;;;;; +12081;CUNEIFORM SIGN DUG;Lo;0;L;;;;;N;;;;; +12082;CUNEIFORM SIGN DUGUD;Lo;0;L;;;;;N;;;;; +12083;CUNEIFORM SIGN DUH;Lo;0;L;;;;;N;;;;; +12084;CUNEIFORM SIGN DUN;Lo;0;L;;;;;N;;;;; +12085;CUNEIFORM SIGN DUN3;Lo;0;L;;;;;N;;;;; +12086;CUNEIFORM SIGN DUN3 GUNU;Lo;0;L;;;;;N;;;;; +12087;CUNEIFORM SIGN DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +12088;CUNEIFORM SIGN DUN4;Lo;0;L;;;;;N;;;;; +12089;CUNEIFORM SIGN DUR2;Lo;0;L;;;;;N;;;;; +1208A;CUNEIFORM SIGN E;Lo;0;L;;;;;N;;;;; +1208B;CUNEIFORM SIGN E TIMES PAP;Lo;0;L;;;;;N;;;;; +1208C;CUNEIFORM SIGN E OVER E NUN OVER NUN;Lo;0;L;;;;;N;;;;; +1208D;CUNEIFORM SIGN E2;Lo;0;L;;;;;N;;;;; +1208E;CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA;Lo;0;L;;;;;N;;;;; +1208F;CUNEIFORM SIGN E2 TIMES GAR;Lo;0;L;;;;;N;;;;; +12090;CUNEIFORM SIGN E2 TIMES MI;Lo;0;L;;;;;N;;;;; +12091;CUNEIFORM SIGN E2 TIMES SAL;Lo;0;L;;;;;N;;;;; +12092;CUNEIFORM SIGN E2 TIMES SHE;Lo;0;L;;;;;N;;;;; +12093;CUNEIFORM SIGN E2 TIMES U;Lo;0;L;;;;;N;;;;; +12094;CUNEIFORM SIGN EDIN;Lo;0;L;;;;;N;;;;; +12095;CUNEIFORM SIGN EGIR;Lo;0;L;;;;;N;;;;; +12096;CUNEIFORM SIGN EL;Lo;0;L;;;;;N;;;;; +12097;CUNEIFORM SIGN EN;Lo;0;L;;;;;N;;;;; +12098;CUNEIFORM SIGN EN TIMES GAN2;Lo;0;L;;;;;N;;;;; +12099;CUNEIFORM SIGN EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1209A;CUNEIFORM SIGN EN TIMES ME;Lo;0;L;;;;;N;;;;; +1209B;CUNEIFORM SIGN EN CROSSING EN;Lo;0;L;;;;;N;;;;; +1209C;CUNEIFORM SIGN EN OPPOSING EN;Lo;0;L;;;;;N;;;;; +1209D;CUNEIFORM SIGN EN SQUARED;Lo;0;L;;;;;N;;;;; +1209E;CUNEIFORM SIGN EREN;Lo;0;L;;;;;N;;;;; +1209F;CUNEIFORM SIGN ERIN2;Lo;0;L;;;;;N;;;;; +120A0;CUNEIFORM SIGN ESH2;Lo;0;L;;;;;N;;;;; +120A1;CUNEIFORM SIGN EZEN;Lo;0;L;;;;;N;;;;; +120A2;CUNEIFORM SIGN EZEN TIMES A;Lo;0;L;;;;;N;;;;; +120A3;CUNEIFORM SIGN EZEN TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; +120A4;CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +120A5;CUNEIFORM SIGN EZEN TIMES AN;Lo;0;L;;;;;N;;;;; +120A6;CUNEIFORM SIGN EZEN TIMES BAD;Lo;0;L;;;;;N;;;;; +120A7;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; +120A8;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +120A9;CUNEIFORM SIGN EZEN TIMES HA;Lo;0;L;;;;;N;;;;; +120AA;CUNEIFORM SIGN EZEN TIMES HA GUNU;Lo;0;L;;;;;N;;;;; +120AB;CUNEIFORM SIGN EZEN TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +120AC;CUNEIFORM SIGN EZEN TIMES KASKAL;Lo;0;L;;;;;N;;;;; +120AD;CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED;Lo;0;L;;;;;N;;;;; +120AE;CUNEIFORM SIGN EZEN TIMES KU3;Lo;0;L;;;;;N;;;;; +120AF;CUNEIFORM SIGN EZEN TIMES LA;Lo;0;L;;;;;N;;;;; +120B0;CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +120B1;CUNEIFORM SIGN EZEN TIMES LI;Lo;0;L;;;;;N;;;;; +120B2;CUNEIFORM SIGN EZEN TIMES LU;Lo;0;L;;;;;N;;;;; +120B3;CUNEIFORM SIGN EZEN TIMES U2;Lo;0;L;;;;;N;;;;; +120B4;CUNEIFORM SIGN EZEN TIMES UD;Lo;0;L;;;;;N;;;;; +120B5;CUNEIFORM SIGN GA;Lo;0;L;;;;;N;;;;; +120B6;CUNEIFORM SIGN GA GUNU;Lo;0;L;;;;;N;;;;; +120B7;CUNEIFORM SIGN GA2;Lo;0;L;;;;;N;;;;; +120B8;CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; +120B9;CUNEIFORM SIGN GA2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; +120BA;CUNEIFORM SIGN GA2 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; +120BB;CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB;Lo;0;L;;;;;N;;;;; +120BC;CUNEIFORM SIGN GA2 TIMES AN;Lo;0;L;;;;;N;;;;; +120BD;CUNEIFORM SIGN GA2 TIMES ASH;Lo;0;L;;;;;N;;;;; +120BE;CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL;Lo;0;L;;;;;N;;;;; +120BF;CUNEIFORM SIGN GA2 TIMES BAD;Lo;0;L;;;;;N;;;;; +120C0;CUNEIFORM SIGN GA2 TIMES BAR PLUS RA;Lo;0;L;;;;;N;;;;; +120C1;CUNEIFORM SIGN GA2 TIMES BUR;Lo;0;L;;;;;N;;;;; +120C2;CUNEIFORM SIGN GA2 TIMES BUR PLUS RA;Lo;0;L;;;;;N;;;;; +120C3;CUNEIFORM SIGN GA2 TIMES DA;Lo;0;L;;;;;N;;;;; +120C4;CUNEIFORM SIGN GA2 TIMES DI;Lo;0;L;;;;;N;;;;; +120C5;CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE;Lo;0;L;;;;;N;;;;; +120C6;CUNEIFORM SIGN GA2 TIMES DUB;Lo;0;L;;;;;N;;;;; +120C7;CUNEIFORM SIGN GA2 TIMES EL;Lo;0;L;;;;;N;;;;; +120C8;CUNEIFORM SIGN GA2 TIMES EL PLUS LA;Lo;0;L;;;;;N;;;;; +120C9;CUNEIFORM SIGN GA2 TIMES EN;Lo;0;L;;;;;N;;;;; +120CA;CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +120CB;CUNEIFORM SIGN GA2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +120CC;CUNEIFORM SIGN GA2 TIMES GAR;Lo;0;L;;;;;N;;;;; +120CD;CUNEIFORM SIGN GA2 TIMES GI;Lo;0;L;;;;;N;;;;; +120CE;CUNEIFORM SIGN GA2 TIMES GI4;Lo;0;L;;;;;N;;;;; +120CF;CUNEIFORM SIGN GA2 TIMES GI4 PLUS A;Lo;0;L;;;;;N;;;;; +120D0;CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU;Lo;0;L;;;;;N;;;;; +120D1;CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2;Lo;0;L;;;;;N;;;;; +120D2;CUNEIFORM SIGN GA2 TIMES HAL;Lo;0;L;;;;;N;;;;; +120D3;CUNEIFORM SIGN GA2 TIMES HAL PLUS LA;Lo;0;L;;;;;N;;;;; +120D4;CUNEIFORM SIGN GA2 TIMES HI PLUS LI;Lo;0;L;;;;;N;;;;; +120D5;CUNEIFORM SIGN GA2 TIMES HUB2;Lo;0;L;;;;;N;;;;; +120D6;CUNEIFORM SIGN GA2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +120D7;CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH;Lo;0;L;;;;;N;;;;; +120D8;CUNEIFORM SIGN GA2 TIMES KAK;Lo;0;L;;;;;N;;;;; +120D9;CUNEIFORM SIGN GA2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +120DA;CUNEIFORM SIGN GA2 TIMES KID;Lo;0;L;;;;;N;;;;; +120DB;CUNEIFORM SIGN GA2 TIMES KID PLUS LAL;Lo;0;L;;;;;N;;;;; +120DC;CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN;Lo;0;L;;;;;N;;;;; +120DD;CUNEIFORM SIGN GA2 TIMES LA;Lo;0;L;;;;;N;;;;; +120DE;CUNEIFORM SIGN GA2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +120DF;CUNEIFORM SIGN GA2 TIMES MI;Lo;0;L;;;;;N;;;;; +120E0;CUNEIFORM SIGN GA2 TIMES NUN;Lo;0;L;;;;;N;;;;; +120E1;CUNEIFORM SIGN GA2 TIMES NUN OVER NUN;Lo;0;L;;;;;N;;;;; +120E2;CUNEIFORM SIGN GA2 TIMES PA;Lo;0;L;;;;;N;;;;; +120E3;CUNEIFORM SIGN GA2 TIMES SAL;Lo;0;L;;;;;N;;;;; +120E4;CUNEIFORM SIGN GA2 TIMES SAR;Lo;0;L;;;;;N;;;;; +120E5;CUNEIFORM SIGN GA2 TIMES SHE;Lo;0;L;;;;;N;;;;; +120E6;CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR;Lo;0;L;;;;;N;;;;; +120E7;CUNEIFORM SIGN GA2 TIMES SHID;Lo;0;L;;;;;N;;;;; +120E8;CUNEIFORM SIGN GA2 TIMES SUM;Lo;0;L;;;;;N;;;;; +120E9;CUNEIFORM SIGN GA2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +120EA;CUNEIFORM SIGN GA2 TIMES U;Lo;0;L;;;;;N;;;;; +120EB;CUNEIFORM SIGN GA2 TIMES UD;Lo;0;L;;;;;N;;;;; +120EC;CUNEIFORM SIGN GA2 TIMES UD PLUS DU;Lo;0;L;;;;;N;;;;; +120ED;CUNEIFORM SIGN GA2 OVER GA2;Lo;0;L;;;;;N;;;;; +120EE;CUNEIFORM SIGN GABA;Lo;0;L;;;;;N;;;;; +120EF;CUNEIFORM SIGN GABA CROSSING GABA;Lo;0;L;;;;;N;;;;; +120F0;CUNEIFORM SIGN GAD;Lo;0;L;;;;;N;;;;; +120F1;CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +120F2;CUNEIFORM SIGN GAL;Lo;0;L;;;;;N;;;;; +120F3;CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +120F4;CUNEIFORM SIGN GALAM;Lo;0;L;;;;;N;;;;; +120F5;CUNEIFORM SIGN GAM;Lo;0;L;;;;;N;;;;; +120F6;CUNEIFORM SIGN GAN;Lo;0;L;;;;;N;;;;; +120F7;CUNEIFORM SIGN GAN2;Lo;0;L;;;;;N;;;;; +120F8;CUNEIFORM SIGN GAN2 TENU;Lo;0;L;;;;;N;;;;; +120F9;CUNEIFORM SIGN GAN2 OVER GAN2;Lo;0;L;;;;;N;;;;; +120FA;CUNEIFORM SIGN GAN2 CROSSING GAN2;Lo;0;L;;;;;N;;;;; +120FB;CUNEIFORM SIGN GAR;Lo;0;L;;;;;N;;;;; +120FC;CUNEIFORM SIGN GAR3;Lo;0;L;;;;;N;;;;; +120FD;CUNEIFORM SIGN GASHAN;Lo;0;L;;;;;N;;;;; +120FE;CUNEIFORM SIGN GESHTIN;Lo;0;L;;;;;N;;;;; +120FF;CUNEIFORM SIGN GESHTIN TIMES KUR;Lo;0;L;;;;;N;;;;; +12100;CUNEIFORM SIGN GI;Lo;0;L;;;;;N;;;;; +12101;CUNEIFORM SIGN GI TIMES E;Lo;0;L;;;;;N;;;;; +12102;CUNEIFORM SIGN GI TIMES U;Lo;0;L;;;;;N;;;;; +12103;CUNEIFORM SIGN GI CROSSING GI;Lo;0;L;;;;;N;;;;; +12104;CUNEIFORM SIGN GI4;Lo;0;L;;;;;N;;;;; +12105;CUNEIFORM SIGN GI4 OVER GI4;Lo;0;L;;;;;N;;;;; +12106;CUNEIFORM SIGN GI4 CROSSING GI4;Lo;0;L;;;;;N;;;;; +12107;CUNEIFORM SIGN GIDIM;Lo;0;L;;;;;N;;;;; +12108;CUNEIFORM SIGN GIR2;Lo;0;L;;;;;N;;;;; +12109;CUNEIFORM SIGN GIR2 GUNU;Lo;0;L;;;;;N;;;;; +1210A;CUNEIFORM SIGN GIR3;Lo;0;L;;;;;N;;;;; +1210B;CUNEIFORM SIGN GIR3 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; +1210C;CUNEIFORM SIGN GIR3 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1210D;CUNEIFORM SIGN GIR3 TIMES IGI;Lo;0;L;;;;;N;;;;; +1210E;CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI;Lo;0;L;;;;;N;;;;; +1210F;CUNEIFORM SIGN GIR3 TIMES PA;Lo;0;L;;;;;N;;;;; +12110;CUNEIFORM SIGN GISAL;Lo;0;L;;;;;N;;;;; +12111;CUNEIFORM SIGN GISH;Lo;0;L;;;;;N;;;;; +12112;CUNEIFORM SIGN GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +12113;CUNEIFORM SIGN GISH TIMES BAD;Lo;0;L;;;;;N;;;;; +12114;CUNEIFORM SIGN GISH TIMES TAK4;Lo;0;L;;;;;N;;;;; +12115;CUNEIFORM SIGN GISH TENU;Lo;0;L;;;;;N;;;;; +12116;CUNEIFORM SIGN GU;Lo;0;L;;;;;N;;;;; +12117;CUNEIFORM SIGN GU CROSSING GU;Lo;0;L;;;;;N;;;;; +12118;CUNEIFORM SIGN GU2;Lo;0;L;;;;;N;;;;; +12119;CUNEIFORM SIGN GU2 TIMES KAK;Lo;0;L;;;;;N;;;;; +1211A;CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1211B;CUNEIFORM SIGN GU2 TIMES NUN;Lo;0;L;;;;;N;;;;; +1211C;CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2;Lo;0;L;;;;;N;;;;; +1211D;CUNEIFORM SIGN GU2 GUNU;Lo;0;L;;;;;N;;;;; +1211E;CUNEIFORM SIGN GUD;Lo;0;L;;;;;N;;;;; +1211F;CUNEIFORM SIGN GUD TIMES A PLUS KUR;Lo;0;L;;;;;N;;;;; +12120;CUNEIFORM SIGN GUD TIMES KUR;Lo;0;L;;;;;N;;;;; +12121;CUNEIFORM SIGN GUD OVER GUD LUGAL;Lo;0;L;;;;;N;;;;; +12122;CUNEIFORM SIGN GUL;Lo;0;L;;;;;N;;;;; +12123;CUNEIFORM SIGN GUM;Lo;0;L;;;;;N;;;;; +12124;CUNEIFORM SIGN GUM TIMES SHE;Lo;0;L;;;;;N;;;;; +12125;CUNEIFORM SIGN GUR;Lo;0;L;;;;;N;;;;; +12126;CUNEIFORM SIGN GUR7;Lo;0;L;;;;;N;;;;; +12127;CUNEIFORM SIGN GURUN;Lo;0;L;;;;;N;;;;; +12128;CUNEIFORM SIGN GURUSH;Lo;0;L;;;;;N;;;;; +12129;CUNEIFORM SIGN HA;Lo;0;L;;;;;N;;;;; +1212A;CUNEIFORM SIGN HA TENU;Lo;0;L;;;;;N;;;;; +1212B;CUNEIFORM SIGN HA GUNU;Lo;0;L;;;;;N;;;;; +1212C;CUNEIFORM SIGN HAL;Lo;0;L;;;;;N;;;;; +1212D;CUNEIFORM SIGN HI;Lo;0;L;;;;;N;;;;; +1212E;CUNEIFORM SIGN HI TIMES ASH;Lo;0;L;;;;;N;;;;; +1212F;CUNEIFORM SIGN HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +12130;CUNEIFORM SIGN HI TIMES BAD;Lo;0;L;;;;;N;;;;; +12131;CUNEIFORM SIGN HI TIMES DISH;Lo;0;L;;;;;N;;;;; +12132;CUNEIFORM SIGN HI TIMES GAD;Lo;0;L;;;;;N;;;;; +12133;CUNEIFORM SIGN HI TIMES KIN;Lo;0;L;;;;;N;;;;; +12134;CUNEIFORM SIGN HI TIMES NUN;Lo;0;L;;;;;N;;;;; +12135;CUNEIFORM SIGN HI TIMES SHE;Lo;0;L;;;;;N;;;;; +12136;CUNEIFORM SIGN HI TIMES U;Lo;0;L;;;;;N;;;;; +12137;CUNEIFORM SIGN HU;Lo;0;L;;;;;N;;;;; +12138;CUNEIFORM SIGN HUB2;Lo;0;L;;;;;N;;;;; +12139;CUNEIFORM SIGN HUB2 TIMES AN;Lo;0;L;;;;;N;;;;; +1213A;CUNEIFORM SIGN HUB2 TIMES HAL;Lo;0;L;;;;;N;;;;; +1213B;CUNEIFORM SIGN HUB2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1213C;CUNEIFORM SIGN HUB2 TIMES LISH;Lo;0;L;;;;;N;;;;; +1213D;CUNEIFORM SIGN HUB2 TIMES UD;Lo;0;L;;;;;N;;;;; +1213E;CUNEIFORM SIGN HUL2;Lo;0;L;;;;;N;;;;; +1213F;CUNEIFORM SIGN I;Lo;0;L;;;;;N;;;;; +12140;CUNEIFORM SIGN I A;Lo;0;L;;;;;N;;;;; +12141;CUNEIFORM SIGN IB;Lo;0;L;;;;;N;;;;; +12142;CUNEIFORM SIGN IDIM;Lo;0;L;;;;;N;;;;; +12143;CUNEIFORM SIGN IDIM OVER IDIM BUR;Lo;0;L;;;;;N;;;;; +12144;CUNEIFORM SIGN IDIM OVER IDIM SQUARED;Lo;0;L;;;;;N;;;;; +12145;CUNEIFORM SIGN IG;Lo;0;L;;;;;N;;;;; +12146;CUNEIFORM SIGN IGI;Lo;0;L;;;;;N;;;;; +12147;CUNEIFORM SIGN IGI DIB;Lo;0;L;;;;;N;;;;; +12148;CUNEIFORM SIGN IGI RI;Lo;0;L;;;;;N;;;;; +12149;CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD;Lo;0;L;;;;;N;;;;; +1214A;CUNEIFORM SIGN IGI GUNU;Lo;0;L;;;;;N;;;;; +1214B;CUNEIFORM SIGN IL;Lo;0;L;;;;;N;;;;; +1214C;CUNEIFORM SIGN IL TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1214D;CUNEIFORM SIGN IL2;Lo;0;L;;;;;N;;;;; +1214E;CUNEIFORM SIGN IM;Lo;0;L;;;;;N;;;;; +1214F;CUNEIFORM SIGN IM TIMES TAK4;Lo;0;L;;;;;N;;;;; +12150;CUNEIFORM SIGN IM CROSSING IM;Lo;0;L;;;;;N;;;;; +12151;CUNEIFORM SIGN IM OPPOSING IM;Lo;0;L;;;;;N;;;;; +12152;CUNEIFORM SIGN IM SQUARED;Lo;0;L;;;;;N;;;;; +12153;CUNEIFORM SIGN IMIN;Lo;0;L;;;;;N;;;;; +12154;CUNEIFORM SIGN IN;Lo;0;L;;;;;N;;;;; +12155;CUNEIFORM SIGN IR;Lo;0;L;;;;;N;;;;; +12156;CUNEIFORM SIGN ISH;Lo;0;L;;;;;N;;;;; +12157;CUNEIFORM SIGN KA;Lo;0;L;;;;;N;;;;; +12158;CUNEIFORM SIGN KA TIMES A;Lo;0;L;;;;;N;;;;; +12159;CUNEIFORM SIGN KA TIMES AD;Lo;0;L;;;;;N;;;;; +1215A;CUNEIFORM SIGN KA TIMES AD PLUS KU3;Lo;0;L;;;;;N;;;;; +1215B;CUNEIFORM SIGN KA TIMES ASH2;Lo;0;L;;;;;N;;;;; +1215C;CUNEIFORM SIGN KA TIMES BAD;Lo;0;L;;;;;N;;;;; +1215D;CUNEIFORM SIGN KA TIMES BALAG;Lo;0;L;;;;;N;;;;; +1215E;CUNEIFORM SIGN KA TIMES BAR;Lo;0;L;;;;;N;;;;; +1215F;CUNEIFORM SIGN KA TIMES BI;Lo;0;L;;;;;N;;;;; +12160;CUNEIFORM SIGN KA TIMES ERIN2;Lo;0;L;;;;;N;;;;; +12161;CUNEIFORM SIGN KA TIMES ESH2;Lo;0;L;;;;;N;;;;; +12162;CUNEIFORM SIGN KA TIMES GA;Lo;0;L;;;;;N;;;;; +12163;CUNEIFORM SIGN KA TIMES GAL;Lo;0;L;;;;;N;;;;; +12164;CUNEIFORM SIGN KA TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12165;CUNEIFORM SIGN KA TIMES GAR;Lo;0;L;;;;;N;;;;; +12166;CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A;Lo;0;L;;;;;N;;;;; +12167;CUNEIFORM SIGN KA TIMES GI;Lo;0;L;;;;;N;;;;; +12168;CUNEIFORM SIGN KA TIMES GIR2;Lo;0;L;;;;;N;;;;; +12169;CUNEIFORM SIGN KA TIMES GISH PLUS SAR;Lo;0;L;;;;;N;;;;; +1216A;CUNEIFORM SIGN KA TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +1216B;CUNEIFORM SIGN KA TIMES GU;Lo;0;L;;;;;N;;;;; +1216C;CUNEIFORM SIGN KA TIMES GUR7;Lo;0;L;;;;;N;;;;; +1216D;CUNEIFORM SIGN KA TIMES IGI;Lo;0;L;;;;;N;;;;; +1216E;CUNEIFORM SIGN KA TIMES IM;Lo;0;L;;;;;N;;;;; +1216F;CUNEIFORM SIGN KA TIMES KAK;Lo;0;L;;;;;N;;;;; +12170;CUNEIFORM SIGN KA TIMES KI;Lo;0;L;;;;;N;;;;; +12171;CUNEIFORM SIGN KA TIMES KID;Lo;0;L;;;;;N;;;;; +12172;CUNEIFORM SIGN KA TIMES LI;Lo;0;L;;;;;N;;;;; +12173;CUNEIFORM SIGN KA TIMES LU;Lo;0;L;;;;;N;;;;; +12174;CUNEIFORM SIGN KA TIMES ME;Lo;0;L;;;;;N;;;;; +12175;CUNEIFORM SIGN KA TIMES ME PLUS DU;Lo;0;L;;;;;N;;;;; +12176;CUNEIFORM SIGN KA TIMES ME PLUS GI;Lo;0;L;;;;;N;;;;; +12177;CUNEIFORM SIGN KA TIMES ME PLUS TE;Lo;0;L;;;;;N;;;;; +12178;CUNEIFORM SIGN KA TIMES MI;Lo;0;L;;;;;N;;;;; +12179;CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ;Lo;0;L;;;;;N;;;;; +1217A;CUNEIFORM SIGN KA TIMES NE;Lo;0;L;;;;;N;;;;; +1217B;CUNEIFORM SIGN KA TIMES NUN;Lo;0;L;;;;;N;;;;; +1217C;CUNEIFORM SIGN KA TIMES PI;Lo;0;L;;;;;N;;;;; +1217D;CUNEIFORM SIGN KA TIMES RU;Lo;0;L;;;;;N;;;;; +1217E;CUNEIFORM SIGN KA TIMES SA;Lo;0;L;;;;;N;;;;; +1217F;CUNEIFORM SIGN KA TIMES SAR;Lo;0;L;;;;;N;;;;; +12180;CUNEIFORM SIGN KA TIMES SHA;Lo;0;L;;;;;N;;;;; +12181;CUNEIFORM SIGN KA TIMES SHE;Lo;0;L;;;;;N;;;;; +12182;CUNEIFORM SIGN KA TIMES SHID;Lo;0;L;;;;;N;;;;; +12183;CUNEIFORM SIGN KA TIMES SHU;Lo;0;L;;;;;N;;;;; +12184;CUNEIFORM SIGN KA TIMES SIG;Lo;0;L;;;;;N;;;;; +12185;CUNEIFORM SIGN KA TIMES SUHUR;Lo;0;L;;;;;N;;;;; +12186;CUNEIFORM SIGN KA TIMES TAR;Lo;0;L;;;;;N;;;;; +12187;CUNEIFORM SIGN KA TIMES U;Lo;0;L;;;;;N;;;;; +12188;CUNEIFORM SIGN KA TIMES U2;Lo;0;L;;;;;N;;;;; +12189;CUNEIFORM SIGN KA TIMES UD;Lo;0;L;;;;;N;;;;; +1218A;CUNEIFORM SIGN KA TIMES UMUM TIMES PA;Lo;0;L;;;;;N;;;;; +1218B;CUNEIFORM SIGN KA TIMES USH;Lo;0;L;;;;;N;;;;; +1218C;CUNEIFORM SIGN KA TIMES ZI;Lo;0;L;;;;;N;;;;; +1218D;CUNEIFORM SIGN KA2;Lo;0;L;;;;;N;;;;; +1218E;CUNEIFORM SIGN KA2 CROSSING KA2;Lo;0;L;;;;;N;;;;; +1218F;CUNEIFORM SIGN KAB;Lo;0;L;;;;;N;;;;; +12190;CUNEIFORM SIGN KAD2;Lo;0;L;;;;;N;;;;; +12191;CUNEIFORM SIGN KAD3;Lo;0;L;;;;;N;;;;; +12192;CUNEIFORM SIGN KAD4;Lo;0;L;;;;;N;;;;; +12193;CUNEIFORM SIGN KAD5;Lo;0;L;;;;;N;;;;; +12194;CUNEIFORM SIGN KAD5 OVER KAD5;Lo;0;L;;;;;N;;;;; +12195;CUNEIFORM SIGN KAK;Lo;0;L;;;;;N;;;;; +12196;CUNEIFORM SIGN KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12197;CUNEIFORM SIGN KAL;Lo;0;L;;;;;N;;;;; +12198;CUNEIFORM SIGN KAL TIMES BAD;Lo;0;L;;;;;N;;;;; +12199;CUNEIFORM SIGN KAL CROSSING KAL;Lo;0;L;;;;;N;;;;; +1219A;CUNEIFORM SIGN KAM2;Lo;0;L;;;;;N;;;;; +1219B;CUNEIFORM SIGN KAM4;Lo;0;L;;;;;N;;;;; +1219C;CUNEIFORM SIGN KASKAL;Lo;0;L;;;;;N;;;;; +1219D;CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +1219E;CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +1219F;CUNEIFORM SIGN KESH2;Lo;0;L;;;;;N;;;;; +121A0;CUNEIFORM SIGN KI;Lo;0;L;;;;;N;;;;; +121A1;CUNEIFORM SIGN KI TIMES BAD;Lo;0;L;;;;;N;;;;; +121A2;CUNEIFORM SIGN KI TIMES U;Lo;0;L;;;;;N;;;;; +121A3;CUNEIFORM SIGN KI TIMES UD;Lo;0;L;;;;;N;;;;; +121A4;CUNEIFORM SIGN KID;Lo;0;L;;;;;N;;;;; +121A5;CUNEIFORM SIGN KIN;Lo;0;L;;;;;N;;;;; +121A6;CUNEIFORM SIGN KISAL;Lo;0;L;;;;;N;;;;; +121A7;CUNEIFORM SIGN KISH;Lo;0;L;;;;;N;;;;; +121A8;CUNEIFORM SIGN KISIM5;Lo;0;L;;;;;N;;;;; +121A9;CUNEIFORM SIGN KISIM5 OVER KISIM5;Lo;0;L;;;;;N;;;;; +121AA;CUNEIFORM SIGN KU;Lo;0;L;;;;;N;;;;; +121AB;CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +121AC;CUNEIFORM SIGN KU3;Lo;0;L;;;;;N;;;;; +121AD;CUNEIFORM SIGN KU4;Lo;0;L;;;;;N;;;;; +121AE;CUNEIFORM SIGN KU4 VARIANT FORM;Lo;0;L;;;;;N;;;;; +121AF;CUNEIFORM SIGN KU7;Lo;0;L;;;;;N;;;;; +121B0;CUNEIFORM SIGN KUL;Lo;0;L;;;;;N;;;;; +121B1;CUNEIFORM SIGN KUL GUNU;Lo;0;L;;;;;N;;;;; +121B2;CUNEIFORM SIGN KUN;Lo;0;L;;;;;N;;;;; +121B3;CUNEIFORM SIGN KUR;Lo;0;L;;;;;N;;;;; +121B4;CUNEIFORM SIGN KUR OPPOSING KUR;Lo;0;L;;;;;N;;;;; +121B5;CUNEIFORM SIGN KUSHU2;Lo;0;L;;;;;N;;;;; +121B6;CUNEIFORM SIGN KWU318;Lo;0;L;;;;;N;;;;; +121B7;CUNEIFORM SIGN LA;Lo;0;L;;;;;N;;;;; +121B8;CUNEIFORM SIGN LAGAB;Lo;0;L;;;;;N;;;;; +121B9;CUNEIFORM SIGN LAGAB TIMES A;Lo;0;L;;;;;N;;;;; +121BA;CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; +121BB;CUNEIFORM SIGN LAGAB TIMES A PLUS GAR;Lo;0;L;;;;;N;;;;; +121BC;CUNEIFORM SIGN LAGAB TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; +121BD;CUNEIFORM SIGN LAGAB TIMES AL;Lo;0;L;;;;;N;;;;; +121BE;CUNEIFORM SIGN LAGAB TIMES AN;Lo;0;L;;;;;N;;;;; +121BF;CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU;Lo;0;L;;;;;N;;;;; +121C0;CUNEIFORM SIGN LAGAB TIMES BAD;Lo;0;L;;;;;N;;;;; +121C1;CUNEIFORM SIGN LAGAB TIMES BI;Lo;0;L;;;;;N;;;;; +121C2;CUNEIFORM SIGN LAGAB TIMES DAR;Lo;0;L;;;;;N;;;;; +121C3;CUNEIFORM SIGN LAGAB TIMES EN;Lo;0;L;;;;;N;;;;; +121C4;CUNEIFORM SIGN LAGAB TIMES GA;Lo;0;L;;;;;N;;;;; +121C5;CUNEIFORM SIGN LAGAB TIMES GAR;Lo;0;L;;;;;N;;;;; +121C6;CUNEIFORM SIGN LAGAB TIMES GUD;Lo;0;L;;;;;N;;;;; +121C7;CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD;Lo;0;L;;;;;N;;;;; +121C8;CUNEIFORM SIGN LAGAB TIMES HA;Lo;0;L;;;;;N;;;;; +121C9;CUNEIFORM SIGN LAGAB TIMES HAL;Lo;0;L;;;;;N;;;;; +121CA;CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN;Lo;0;L;;;;;N;;;;; +121CB;CUNEIFORM SIGN LAGAB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +121CC;CUNEIFORM SIGN LAGAB TIMES IM;Lo;0;L;;;;;N;;;;; +121CD;CUNEIFORM SIGN LAGAB TIMES IM PLUS HA;Lo;0;L;;;;;N;;;;; +121CE;CUNEIFORM SIGN LAGAB TIMES IM PLUS LU;Lo;0;L;;;;;N;;;;; +121CF;CUNEIFORM SIGN LAGAB TIMES KI;Lo;0;L;;;;;N;;;;; +121D0;CUNEIFORM SIGN LAGAB TIMES KIN;Lo;0;L;;;;;N;;;;; +121D1;CUNEIFORM SIGN LAGAB TIMES KU3;Lo;0;L;;;;;N;;;;; +121D2;CUNEIFORM SIGN LAGAB TIMES KUL;Lo;0;L;;;;;N;;;;; +121D3;CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A;Lo;0;L;;;;;N;;;;; +121D4;CUNEIFORM SIGN LAGAB TIMES LAGAB;Lo;0;L;;;;;N;;;;; +121D5;CUNEIFORM SIGN LAGAB TIMES LISH;Lo;0;L;;;;;N;;;;; +121D6;CUNEIFORM SIGN LAGAB TIMES LU;Lo;0;L;;;;;N;;;;; +121D7;CUNEIFORM SIGN LAGAB TIMES LUL;Lo;0;L;;;;;N;;;;; +121D8;CUNEIFORM SIGN LAGAB TIMES ME;Lo;0;L;;;;;N;;;;; +121D9;CUNEIFORM SIGN LAGAB TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +121DA;CUNEIFORM SIGN LAGAB TIMES MUSH;Lo;0;L;;;;;N;;;;; +121DB;CUNEIFORM SIGN LAGAB TIMES NE;Lo;0;L;;;;;N;;;;; +121DC;CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; +121DD;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2;Lo;0;L;;;;;N;;;;; +121DE;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU;Lo;0;L;;;;;N;;;;; +121DF;CUNEIFORM SIGN LAGAB TIMES SHU2;Lo;0;L;;;;;N;;;;; +121E0;CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2;Lo;0;L;;;;;N;;;;; +121E1;CUNEIFORM SIGN LAGAB TIMES SUM;Lo;0;L;;;;;N;;;;; +121E2;CUNEIFORM SIGN LAGAB TIMES TAG;Lo;0;L;;;;;N;;;;; +121E3;CUNEIFORM SIGN LAGAB TIMES TAK4;Lo;0;L;;;;;N;;;;; +121E4;CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA;Lo;0;L;;;;;N;;;;; +121E5;CUNEIFORM SIGN LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +121E6;CUNEIFORM SIGN LAGAB TIMES U PLUS A;Lo;0;L;;;;;N;;;;; +121E7;CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +121E8;CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +121E9;CUNEIFORM SIGN LAGAB TIMES UD;Lo;0;L;;;;;N;;;;; +121EA;CUNEIFORM SIGN LAGAB TIMES USH;Lo;0;L;;;;;N;;;;; +121EB;CUNEIFORM SIGN LAGAB SQUARED;Lo;0;L;;;;;N;;;;; +121EC;CUNEIFORM SIGN LAGAR;Lo;0;L;;;;;N;;;;; +121ED;CUNEIFORM SIGN LAGAR TIMES SHE;Lo;0;L;;;;;N;;;;; +121EE;CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; +121EF;CUNEIFORM SIGN LAGAR GUNU;Lo;0;L;;;;;N;;;;; +121F0;CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE;Lo;0;L;;;;;N;;;;; +121F1;CUNEIFORM SIGN LAHSHU;Lo;0;L;;;;;N;;;;; +121F2;CUNEIFORM SIGN LAL;Lo;0;L;;;;;N;;;;; +121F3;CUNEIFORM SIGN LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +121F4;CUNEIFORM SIGN LAM;Lo;0;L;;;;;N;;;;; +121F5;CUNEIFORM SIGN LAM TIMES KUR;Lo;0;L;;;;;N;;;;; +121F6;CUNEIFORM SIGN LAM TIMES KUR PLUS RU;Lo;0;L;;;;;N;;;;; +121F7;CUNEIFORM SIGN LI;Lo;0;L;;;;;N;;;;; +121F8;CUNEIFORM SIGN LIL;Lo;0;L;;;;;N;;;;; +121F9;CUNEIFORM SIGN LIMMU2;Lo;0;L;;;;;N;;;;; +121FA;CUNEIFORM SIGN LISH;Lo;0;L;;;;;N;;;;; +121FB;CUNEIFORM SIGN LU;Lo;0;L;;;;;N;;;;; +121FC;CUNEIFORM SIGN LU TIMES BAD;Lo;0;L;;;;;N;;;;; +121FD;CUNEIFORM SIGN LU2;Lo;0;L;;;;;N;;;;; +121FE;CUNEIFORM SIGN LU2 TIMES AL;Lo;0;L;;;;;N;;;;; +121FF;CUNEIFORM SIGN LU2 TIMES BAD;Lo;0;L;;;;;N;;;;; +12200;CUNEIFORM SIGN LU2 TIMES ESH2;Lo;0;L;;;;;N;;;;; +12201;CUNEIFORM SIGN LU2 TIMES ESH2 TENU;Lo;0;L;;;;;N;;;;; +12202;CUNEIFORM SIGN LU2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12203;CUNEIFORM SIGN LU2 TIMES HI TIMES BAD;Lo;0;L;;;;;N;;;;; +12204;CUNEIFORM SIGN LU2 TIMES IM;Lo;0;L;;;;;N;;;;; +12205;CUNEIFORM SIGN LU2 TIMES KAD2;Lo;0;L;;;;;N;;;;; +12206;CUNEIFORM SIGN LU2 TIMES KAD3;Lo;0;L;;;;;N;;;;; +12207;CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH;Lo;0;L;;;;;N;;;;; +12208;CUNEIFORM SIGN LU2 TIMES KI;Lo;0;L;;;;;N;;;;; +12209;CUNEIFORM SIGN LU2 TIMES LA PLUS ASH;Lo;0;L;;;;;N;;;;; +1220A;CUNEIFORM SIGN LU2 TIMES LAGAB;Lo;0;L;;;;;N;;;;; +1220B;CUNEIFORM SIGN LU2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +1220C;CUNEIFORM SIGN LU2 TIMES NE;Lo;0;L;;;;;N;;;;; +1220D;CUNEIFORM SIGN LU2 TIMES NU;Lo;0;L;;;;;N;;;;; +1220E;CUNEIFORM SIGN LU2 TIMES SI PLUS ASH;Lo;0;L;;;;;N;;;;; +1220F;CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU;Lo;0;L;;;;;N;;;;; +12210;CUNEIFORM SIGN LU2 TIMES TUG2;Lo;0;L;;;;;N;;;;; +12211;CUNEIFORM SIGN LU2 TENU;Lo;0;L;;;;;N;;;;; +12212;CUNEIFORM SIGN LU2 CROSSING LU2;Lo;0;L;;;;;N;;;;; +12213;CUNEIFORM SIGN LU2 OPPOSING LU2;Lo;0;L;;;;;N;;;;; +12214;CUNEIFORM SIGN LU2 SQUARED;Lo;0;L;;;;;N;;;;; +12215;CUNEIFORM SIGN LU2 SHESHIG;Lo;0;L;;;;;N;;;;; +12216;CUNEIFORM SIGN LU3;Lo;0;L;;;;;N;;;;; +12217;CUNEIFORM SIGN LUGAL;Lo;0;L;;;;;N;;;;; +12218;CUNEIFORM SIGN LUGAL OVER LUGAL;Lo;0;L;;;;;N;;;;; +12219;CUNEIFORM SIGN LUGAL OPPOSING LUGAL;Lo;0;L;;;;;N;;;;; +1221A;CUNEIFORM SIGN LUGAL SHESHIG;Lo;0;L;;;;;N;;;;; +1221B;CUNEIFORM SIGN LUH;Lo;0;L;;;;;N;;;;; +1221C;CUNEIFORM SIGN LUL;Lo;0;L;;;;;N;;;;; +1221D;CUNEIFORM SIGN LUM;Lo;0;L;;;;;N;;;;; +1221E;CUNEIFORM SIGN LUM OVER LUM;Lo;0;L;;;;;N;;;;; +1221F;CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR;Lo;0;L;;;;;N;;;;; +12220;CUNEIFORM SIGN MA;Lo;0;L;;;;;N;;;;; +12221;CUNEIFORM SIGN MA TIMES TAK4;Lo;0;L;;;;;N;;;;; +12222;CUNEIFORM SIGN MA GUNU;Lo;0;L;;;;;N;;;;; +12223;CUNEIFORM SIGN MA2;Lo;0;L;;;;;N;;;;; +12224;CUNEIFORM SIGN MAH;Lo;0;L;;;;;N;;;;; +12225;CUNEIFORM SIGN MAR;Lo;0;L;;;;;N;;;;; +12226;CUNEIFORM SIGN MASH;Lo;0;L;;;;;N;;;;; +12227;CUNEIFORM SIGN MASH2;Lo;0;L;;;;;N;;;;; +12228;CUNEIFORM SIGN ME;Lo;0;L;;;;;N;;;;; +12229;CUNEIFORM SIGN MES;Lo;0;L;;;;;N;;;;; +1222A;CUNEIFORM SIGN MI;Lo;0;L;;;;;N;;;;; +1222B;CUNEIFORM SIGN MIN;Lo;0;L;;;;;N;;;;; +1222C;CUNEIFORM SIGN MU;Lo;0;L;;;;;N;;;;; +1222D;CUNEIFORM SIGN MU OVER MU;Lo;0;L;;;;;N;;;;; +1222E;CUNEIFORM SIGN MUG;Lo;0;L;;;;;N;;;;; +1222F;CUNEIFORM SIGN MUG GUNU;Lo;0;L;;;;;N;;;;; +12230;CUNEIFORM SIGN MUNSUB;Lo;0;L;;;;;N;;;;; +12231;CUNEIFORM SIGN MURGU2;Lo;0;L;;;;;N;;;;; +12232;CUNEIFORM SIGN MUSH;Lo;0;L;;;;;N;;;;; +12233;CUNEIFORM SIGN MUSH TIMES A;Lo;0;L;;;;;N;;;;; +12234;CUNEIFORM SIGN MUSH TIMES KUR;Lo;0;L;;;;;N;;;;; +12235;CUNEIFORM SIGN MUSH TIMES ZA;Lo;0;L;;;;;N;;;;; +12236;CUNEIFORM SIGN MUSH OVER MUSH;Lo;0;L;;;;;N;;;;; +12237;CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; +12238;CUNEIFORM SIGN MUSH CROSSING MUSH;Lo;0;L;;;;;N;;;;; +12239;CUNEIFORM SIGN MUSH3;Lo;0;L;;;;;N;;;;; +1223A;CUNEIFORM SIGN MUSH3 TIMES A;Lo;0;L;;;;;N;;;;; +1223B;CUNEIFORM SIGN MUSH3 TIMES A PLUS DI;Lo;0;L;;;;;N;;;;; +1223C;CUNEIFORM SIGN MUSH3 TIMES DI;Lo;0;L;;;;;N;;;;; +1223D;CUNEIFORM SIGN MUSH3 GUNU;Lo;0;L;;;;;N;;;;; +1223E;CUNEIFORM SIGN NA;Lo;0;L;;;;;N;;;;; +1223F;CUNEIFORM SIGN NA2;Lo;0;L;;;;;N;;;;; +12240;CUNEIFORM SIGN NAGA;Lo;0;L;;;;;N;;;;; +12241;CUNEIFORM SIGN NAGA INVERTED;Lo;0;L;;;;;N;;;;; +12242;CUNEIFORM SIGN NAGA TIMES SHU TENU;Lo;0;L;;;;;N;;;;; +12243;CUNEIFORM SIGN NAGA OPPOSING NAGA;Lo;0;L;;;;;N;;;;; +12244;CUNEIFORM SIGN NAGAR;Lo;0;L;;;;;N;;;;; +12245;CUNEIFORM SIGN NAM NUTILLU;Lo;0;L;;;;;N;;;;; +12246;CUNEIFORM SIGN NAM;Lo;0;L;;;;;N;;;;; +12247;CUNEIFORM SIGN NAM2;Lo;0;L;;;;;N;;;;; +12248;CUNEIFORM SIGN NE;Lo;0;L;;;;;N;;;;; +12249;CUNEIFORM SIGN NE TIMES A;Lo;0;L;;;;;N;;;;; +1224A;CUNEIFORM SIGN NE TIMES UD;Lo;0;L;;;;;N;;;;; +1224B;CUNEIFORM SIGN NE SHESHIG;Lo;0;L;;;;;N;;;;; +1224C;CUNEIFORM SIGN NI;Lo;0;L;;;;;N;;;;; +1224D;CUNEIFORM SIGN NI TIMES E;Lo;0;L;;;;;N;;;;; +1224E;CUNEIFORM SIGN NI2;Lo;0;L;;;;;N;;;;; +1224F;CUNEIFORM SIGN NIM;Lo;0;L;;;;;N;;;;; +12250;CUNEIFORM SIGN NIM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12251;CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; +12252;CUNEIFORM SIGN NINDA2;Lo;0;L;;;;;N;;;;; +12253;CUNEIFORM SIGN NINDA2 TIMES AN;Lo;0;L;;;;;N;;;;; +12254;CUNEIFORM SIGN NINDA2 TIMES ASH;Lo;0;L;;;;;N;;;;; +12255;CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH;Lo;0;L;;;;;N;;;;; +12256;CUNEIFORM SIGN NINDA2 TIMES GUD;Lo;0;L;;;;;N;;;;; +12257;CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; +12258;CUNEIFORM SIGN NINDA2 TIMES NE;Lo;0;L;;;;;N;;;;; +12259;CUNEIFORM SIGN NINDA2 TIMES NUN;Lo;0;L;;;;;N;;;;; +1225A;CUNEIFORM SIGN NINDA2 TIMES SHE;Lo;0;L;;;;;N;;;;; +1225B;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN;Lo;0;L;;;;;N;;;;; +1225C;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH;Lo;0;L;;;;;N;;;;; +1225D;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH;Lo;0;L;;;;;N;;;;; +1225E;CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +1225F;CUNEIFORM SIGN NINDA2 TIMES USH;Lo;0;L;;;;;N;;;;; +12260;CUNEIFORM SIGN NISAG;Lo;0;L;;;;;N;;;;; +12261;CUNEIFORM SIGN NU;Lo;0;L;;;;;N;;;;; +12262;CUNEIFORM SIGN NU11;Lo;0;L;;;;;N;;;;; +12263;CUNEIFORM SIGN NUN;Lo;0;L;;;;;N;;;;; +12264;CUNEIFORM SIGN NUN LAGAR TIMES GAR;Lo;0;L;;;;;N;;;;; +12265;CUNEIFORM SIGN NUN LAGAR TIMES MASH;Lo;0;L;;;;;N;;;;; +12266;CUNEIFORM SIGN NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; +12267;CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; +12268;CUNEIFORM SIGN NUN LAGAR TIMES USH;Lo;0;L;;;;;N;;;;; +12269;CUNEIFORM SIGN NUN TENU;Lo;0;L;;;;;N;;;;; +1226A;CUNEIFORM SIGN NUN OVER NUN;Lo;0;L;;;;;N;;;;; +1226B;CUNEIFORM SIGN NUN CROSSING NUN;Lo;0;L;;;;;N;;;;; +1226C;CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR;Lo;0;L;;;;;N;;;;; +1226D;CUNEIFORM SIGN NUNUZ;Lo;0;L;;;;;N;;;;; +1226E;CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB;Lo;0;L;;;;;N;;;;; +1226F;CUNEIFORM SIGN NUNUZ AB2 TIMES BI;Lo;0;L;;;;;N;;;;; +12270;CUNEIFORM SIGN NUNUZ AB2 TIMES DUG;Lo;0;L;;;;;N;;;;; +12271;CUNEIFORM SIGN NUNUZ AB2 TIMES GUD;Lo;0;L;;;;;N;;;;; +12272;CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12273;CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3;Lo;0;L;;;;;N;;;;; +12274;CUNEIFORM SIGN NUNUZ AB2 TIMES LA;Lo;0;L;;;;;N;;;;; +12275;CUNEIFORM SIGN NUNUZ AB2 TIMES NE;Lo;0;L;;;;;N;;;;; +12276;CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3;Lo;0;L;;;;;N;;;;; +12277;CUNEIFORM SIGN NUNUZ AB2 TIMES U2;Lo;0;L;;;;;N;;;;; +12278;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; +12279;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U;Lo;0;L;;;;;N;;;;; +1227A;CUNEIFORM SIGN PA;Lo;0;L;;;;;N;;;;; +1227B;CUNEIFORM SIGN PAD;Lo;0;L;;;;;N;;;;; +1227C;CUNEIFORM SIGN PAN;Lo;0;L;;;;;N;;;;; +1227D;CUNEIFORM SIGN PAP;Lo;0;L;;;;;N;;;;; +1227E;CUNEIFORM SIGN PESH2;Lo;0;L;;;;;N;;;;; +1227F;CUNEIFORM SIGN PI;Lo;0;L;;;;;N;;;;; +12280;CUNEIFORM SIGN PI TIMES A;Lo;0;L;;;;;N;;;;; +12281;CUNEIFORM SIGN PI TIMES AB;Lo;0;L;;;;;N;;;;; +12282;CUNEIFORM SIGN PI TIMES BI;Lo;0;L;;;;;N;;;;; +12283;CUNEIFORM SIGN PI TIMES BU;Lo;0;L;;;;;N;;;;; +12284;CUNEIFORM SIGN PI TIMES E;Lo;0;L;;;;;N;;;;; +12285;CUNEIFORM SIGN PI TIMES I;Lo;0;L;;;;;N;;;;; +12286;CUNEIFORM SIGN PI TIMES IB;Lo;0;L;;;;;N;;;;; +12287;CUNEIFORM SIGN PI TIMES U;Lo;0;L;;;;;N;;;;; +12288;CUNEIFORM SIGN PI TIMES U2;Lo;0;L;;;;;N;;;;; +12289;CUNEIFORM SIGN PI CROSSING PI;Lo;0;L;;;;;N;;;;; +1228A;CUNEIFORM SIGN PIRIG;Lo;0;L;;;;;N;;;;; +1228B;CUNEIFORM SIGN PIRIG TIMES KAL;Lo;0;L;;;;;N;;;;; +1228C;CUNEIFORM SIGN PIRIG TIMES UD;Lo;0;L;;;;;N;;;;; +1228D;CUNEIFORM SIGN PIRIG TIMES ZA;Lo;0;L;;;;;N;;;;; +1228E;CUNEIFORM SIGN PIRIG OPPOSING PIRIG;Lo;0;L;;;;;N;;;;; +1228F;CUNEIFORM SIGN RA;Lo;0;L;;;;;N;;;;; +12290;CUNEIFORM SIGN RAB;Lo;0;L;;;;;N;;;;; +12291;CUNEIFORM SIGN RI;Lo;0;L;;;;;N;;;;; +12292;CUNEIFORM SIGN RU;Lo;0;L;;;;;N;;;;; +12293;CUNEIFORM SIGN SA;Lo;0;L;;;;;N;;;;; +12294;CUNEIFORM SIGN SAG NUTILLU;Lo;0;L;;;;;N;;;;; +12295;CUNEIFORM SIGN SAG;Lo;0;L;;;;;N;;;;; +12296;CUNEIFORM SIGN SAG TIMES A;Lo;0;L;;;;;N;;;;; +12297;CUNEIFORM SIGN SAG TIMES DU;Lo;0;L;;;;;N;;;;; +12298;CUNEIFORM SIGN SAG TIMES DUB;Lo;0;L;;;;;N;;;;; +12299;CUNEIFORM SIGN SAG TIMES HA;Lo;0;L;;;;;N;;;;; +1229A;CUNEIFORM SIGN SAG TIMES KAK;Lo;0;L;;;;;N;;;;; +1229B;CUNEIFORM SIGN SAG TIMES KUR;Lo;0;L;;;;;N;;;;; +1229C;CUNEIFORM SIGN SAG TIMES LUM;Lo;0;L;;;;;N;;;;; +1229D;CUNEIFORM SIGN SAG TIMES MI;Lo;0;L;;;;;N;;;;; +1229E;CUNEIFORM SIGN SAG TIMES NUN;Lo;0;L;;;;;N;;;;; +1229F;CUNEIFORM SIGN SAG TIMES SAL;Lo;0;L;;;;;N;;;;; +122A0;CUNEIFORM SIGN SAG TIMES SHID;Lo;0;L;;;;;N;;;;; +122A1;CUNEIFORM SIGN SAG TIMES TAB;Lo;0;L;;;;;N;;;;; +122A2;CUNEIFORM SIGN SAG TIMES U2;Lo;0;L;;;;;N;;;;; +122A3;CUNEIFORM SIGN SAG TIMES UB;Lo;0;L;;;;;N;;;;; +122A4;CUNEIFORM SIGN SAG TIMES UM;Lo;0;L;;;;;N;;;;; +122A5;CUNEIFORM SIGN SAG TIMES UR;Lo;0;L;;;;;N;;;;; +122A6;CUNEIFORM SIGN SAG TIMES USH;Lo;0;L;;;;;N;;;;; +122A7;CUNEIFORM SIGN SAG OVER SAG;Lo;0;L;;;;;N;;;;; +122A8;CUNEIFORM SIGN SAG GUNU;Lo;0;L;;;;;N;;;;; +122A9;CUNEIFORM SIGN SAL;Lo;0;L;;;;;N;;;;; +122AA;CUNEIFORM SIGN SAL LAGAB TIMES ASH2;Lo;0;L;;;;;N;;;;; +122AB;CUNEIFORM SIGN SANGA2;Lo;0;L;;;;;N;;;;; +122AC;CUNEIFORM SIGN SAR;Lo;0;L;;;;;N;;;;; +122AD;CUNEIFORM SIGN SHA;Lo;0;L;;;;;N;;;;; +122AE;CUNEIFORM SIGN SHA3;Lo;0;L;;;;;N;;;;; +122AF;CUNEIFORM SIGN SHA3 TIMES A;Lo;0;L;;;;;N;;;;; +122B0;CUNEIFORM SIGN SHA3 TIMES BAD;Lo;0;L;;;;;N;;;;; +122B1;CUNEIFORM SIGN SHA3 TIMES GISH;Lo;0;L;;;;;N;;;;; +122B2;CUNEIFORM SIGN SHA3 TIMES NE;Lo;0;L;;;;;N;;;;; +122B3;CUNEIFORM SIGN SHA3 TIMES SHU2;Lo;0;L;;;;;N;;;;; +122B4;CUNEIFORM SIGN SHA3 TIMES TUR;Lo;0;L;;;;;N;;;;; +122B5;CUNEIFORM SIGN SHA3 TIMES U;Lo;0;L;;;;;N;;;;; +122B6;CUNEIFORM SIGN SHA3 TIMES U PLUS A;Lo;0;L;;;;;N;;;;; +122B7;CUNEIFORM SIGN SHA6;Lo;0;L;;;;;N;;;;; +122B8;CUNEIFORM SIGN SHAB6;Lo;0;L;;;;;N;;;;; +122B9;CUNEIFORM SIGN SHAR2;Lo;0;L;;;;;N;;;;; +122BA;CUNEIFORM SIGN SHE;Lo;0;L;;;;;N;;;;; +122BB;CUNEIFORM SIGN SHE HU;Lo;0;L;;;;;N;;;;; +122BC;CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +122BD;CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR;Lo;0;L;;;;;N;;;;; +122BE;CUNEIFORM SIGN SHEG9;Lo;0;L;;;;;N;;;;; +122BF;CUNEIFORM SIGN SHEN;Lo;0;L;;;;;N;;;;; +122C0;CUNEIFORM SIGN SHESH;Lo;0;L;;;;;N;;;;; +122C1;CUNEIFORM SIGN SHESH2;Lo;0;L;;;;;N;;;;; +122C2;CUNEIFORM SIGN SHESHLAM;Lo;0;L;;;;;N;;;;; +122C3;CUNEIFORM SIGN SHID;Lo;0;L;;;;;N;;;;; +122C4;CUNEIFORM SIGN SHID TIMES A;Lo;0;L;;;;;N;;;;; +122C5;CUNEIFORM SIGN SHID TIMES IM;Lo;0;L;;;;;N;;;;; +122C6;CUNEIFORM SIGN SHIM;Lo;0;L;;;;;N;;;;; +122C7;CUNEIFORM SIGN SHIM TIMES A;Lo;0;L;;;;;N;;;;; +122C8;CUNEIFORM SIGN SHIM TIMES BAL;Lo;0;L;;;;;N;;;;; +122C9;CUNEIFORM SIGN SHIM TIMES BULUG;Lo;0;L;;;;;N;;;;; +122CA;CUNEIFORM SIGN SHIM TIMES DIN;Lo;0;L;;;;;N;;;;; +122CB;CUNEIFORM SIGN SHIM TIMES GAR;Lo;0;L;;;;;N;;;;; +122CC;CUNEIFORM SIGN SHIM TIMES IGI;Lo;0;L;;;;;N;;;;; +122CD;CUNEIFORM SIGN SHIM TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +122CE;CUNEIFORM SIGN SHIM TIMES KUSHU2;Lo;0;L;;;;;N;;;;; +122CF;CUNEIFORM SIGN SHIM TIMES LUL;Lo;0;L;;;;;N;;;;; +122D0;CUNEIFORM SIGN SHIM TIMES MUG;Lo;0;L;;;;;N;;;;; +122D1;CUNEIFORM SIGN SHIM TIMES SAL;Lo;0;L;;;;;N;;;;; +122D2;CUNEIFORM SIGN SHINIG;Lo;0;L;;;;;N;;;;; +122D3;CUNEIFORM SIGN SHIR;Lo;0;L;;;;;N;;;;; +122D4;CUNEIFORM SIGN SHIR TENU;Lo;0;L;;;;;N;;;;; +122D5;CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR;Lo;0;L;;;;;N;;;;; +122D6;CUNEIFORM SIGN SHITA;Lo;0;L;;;;;N;;;;; +122D7;CUNEIFORM SIGN SHU;Lo;0;L;;;;;N;;;;; +122D8;CUNEIFORM SIGN SHU OVER INVERTED SHU;Lo;0;L;;;;;N;;;;; +122D9;CUNEIFORM SIGN SHU2;Lo;0;L;;;;;N;;;;; +122DA;CUNEIFORM SIGN SHUBUR;Lo;0;L;;;;;N;;;;; +122DB;CUNEIFORM SIGN SI;Lo;0;L;;;;;N;;;;; +122DC;CUNEIFORM SIGN SI GUNU;Lo;0;L;;;;;N;;;;; +122DD;CUNEIFORM SIGN SIG;Lo;0;L;;;;;N;;;;; +122DE;CUNEIFORM SIGN SIG4;Lo;0;L;;;;;N;;;;; +122DF;CUNEIFORM SIGN SIG4 OVER SIG4 SHU2;Lo;0;L;;;;;N;;;;; +122E0;CUNEIFORM SIGN SIK2;Lo;0;L;;;;;N;;;;; +122E1;CUNEIFORM SIGN SILA3;Lo;0;L;;;;;N;;;;; +122E2;CUNEIFORM SIGN SU;Lo;0;L;;;;;N;;;;; +122E3;CUNEIFORM SIGN SU OVER SU;Lo;0;L;;;;;N;;;;; +122E4;CUNEIFORM SIGN SUD;Lo;0;L;;;;;N;;;;; +122E5;CUNEIFORM SIGN SUD2;Lo;0;L;;;;;N;;;;; +122E6;CUNEIFORM SIGN SUHUR;Lo;0;L;;;;;N;;;;; +122E7;CUNEIFORM SIGN SUM;Lo;0;L;;;;;N;;;;; +122E8;CUNEIFORM SIGN SUMASH;Lo;0;L;;;;;N;;;;; +122E9;CUNEIFORM SIGN SUR;Lo;0;L;;;;;N;;;;; +122EA;CUNEIFORM SIGN SUR9;Lo;0;L;;;;;N;;;;; +122EB;CUNEIFORM SIGN TA;Lo;0;L;;;;;N;;;;; +122EC;CUNEIFORM SIGN TA ASTERISK;Lo;0;L;;;;;N;;;;; +122ED;CUNEIFORM SIGN TA TIMES HI;Lo;0;L;;;;;N;;;;; +122EE;CUNEIFORM SIGN TA TIMES MI;Lo;0;L;;;;;N;;;;; +122EF;CUNEIFORM SIGN TA GUNU;Lo;0;L;;;;;N;;;;; +122F0;CUNEIFORM SIGN TAB;Lo;0;L;;;;;N;;;;; +122F1;CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH;Lo;0;L;;;;;N;;;;; +122F2;CUNEIFORM SIGN TAB SQUARED;Lo;0;L;;;;;N;;;;; +122F3;CUNEIFORM SIGN TAG;Lo;0;L;;;;;N;;;;; +122F4;CUNEIFORM SIGN TAG TIMES BI;Lo;0;L;;;;;N;;;;; +122F5;CUNEIFORM SIGN TAG TIMES GUD;Lo;0;L;;;;;N;;;;; +122F6;CUNEIFORM SIGN TAG TIMES SHE;Lo;0;L;;;;;N;;;;; +122F7;CUNEIFORM SIGN TAG TIMES SHU;Lo;0;L;;;;;N;;;;; +122F8;CUNEIFORM SIGN TAG TIMES TUG2;Lo;0;L;;;;;N;;;;; +122F9;CUNEIFORM SIGN TAG TIMES UD;Lo;0;L;;;;;N;;;;; +122FA;CUNEIFORM SIGN TAK4;Lo;0;L;;;;;N;;;;; +122FB;CUNEIFORM SIGN TAR;Lo;0;L;;;;;N;;;;; +122FC;CUNEIFORM SIGN TE;Lo;0;L;;;;;N;;;;; +122FD;CUNEIFORM SIGN TE GUNU;Lo;0;L;;;;;N;;;;; +122FE;CUNEIFORM SIGN TI;Lo;0;L;;;;;N;;;;; +122FF;CUNEIFORM SIGN TI TENU;Lo;0;L;;;;;N;;;;; +12300;CUNEIFORM SIGN TIL;Lo;0;L;;;;;N;;;;; +12301;CUNEIFORM SIGN TIR;Lo;0;L;;;;;N;;;;; +12302;CUNEIFORM SIGN TIR TIMES TAK4;Lo;0;L;;;;;N;;;;; +12303;CUNEIFORM SIGN TIR OVER TIR;Lo;0;L;;;;;N;;;;; +12304;CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +12305;CUNEIFORM SIGN TU;Lo;0;L;;;;;N;;;;; +12306;CUNEIFORM SIGN TUG2;Lo;0;L;;;;;N;;;;; +12307;CUNEIFORM SIGN TUK;Lo;0;L;;;;;N;;;;; +12308;CUNEIFORM SIGN TUM;Lo;0;L;;;;;N;;;;; +12309;CUNEIFORM SIGN TUR;Lo;0;L;;;;;N;;;;; +1230A;CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA;Lo;0;L;;;;;N;;;;; +1230B;CUNEIFORM SIGN U;Lo;0;L;;;;;N;;;;; +1230C;CUNEIFORM SIGN U GUD;Lo;0;L;;;;;N;;;;; +1230D;CUNEIFORM SIGN U U U;Lo;0;L;;;;;N;;;;; +1230E;CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR;Lo;0;L;;;;;N;;;;; +1230F;CUNEIFORM SIGN U OVER U SUR OVER SUR;Lo;0;L;;;;;N;;;;; +12310;CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED;Lo;0;L;;;;;N;;;;; +12311;CUNEIFORM SIGN U2;Lo;0;L;;;;;N;;;;; +12312;CUNEIFORM SIGN UB;Lo;0;L;;;;;N;;;;; +12313;CUNEIFORM SIGN UD;Lo;0;L;;;;;N;;;;; +12314;CUNEIFORM SIGN UD KUSHU2;Lo;0;L;;;;;N;;;;; +12315;CUNEIFORM SIGN UD TIMES BAD;Lo;0;L;;;;;N;;;;; +12316;CUNEIFORM SIGN UD TIMES MI;Lo;0;L;;;;;N;;;;; +12317;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +12318;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU;Lo;0;L;;;;;N;;;;; +12319;CUNEIFORM SIGN UD GUNU;Lo;0;L;;;;;N;;;;; +1231A;CUNEIFORM SIGN UD SHESHIG;Lo;0;L;;;;;N;;;;; +1231B;CUNEIFORM SIGN UD SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;; +1231C;CUNEIFORM SIGN UDUG;Lo;0;L;;;;;N;;;;; +1231D;CUNEIFORM SIGN UM;Lo;0;L;;;;;N;;;;; +1231E;CUNEIFORM SIGN UM TIMES LAGAB;Lo;0;L;;;;;N;;;;; +1231F;CUNEIFORM SIGN UM TIMES ME PLUS DA;Lo;0;L;;;;;N;;;;; +12320;CUNEIFORM SIGN UM TIMES SHA3;Lo;0;L;;;;;N;;;;; +12321;CUNEIFORM SIGN UM TIMES U;Lo;0;L;;;;;N;;;;; +12322;CUNEIFORM SIGN UMBIN;Lo;0;L;;;;;N;;;;; +12323;CUNEIFORM SIGN UMUM;Lo;0;L;;;;;N;;;;; +12324;CUNEIFORM SIGN UMUM TIMES KASKAL;Lo;0;L;;;;;N;;;;; +12325;CUNEIFORM SIGN UMUM TIMES PA;Lo;0;L;;;;;N;;;;; +12326;CUNEIFORM SIGN UN;Lo;0;L;;;;;N;;;;; +12327;CUNEIFORM SIGN UN GUNU;Lo;0;L;;;;;N;;;;; +12328;CUNEIFORM SIGN UR;Lo;0;L;;;;;N;;;;; +12329;CUNEIFORM SIGN UR CROSSING UR;Lo;0;L;;;;;N;;;;; +1232A;CUNEIFORM SIGN UR SHESHIG;Lo;0;L;;;;;N;;;;; +1232B;CUNEIFORM SIGN UR2;Lo;0;L;;;;;N;;;;; +1232C;CUNEIFORM SIGN UR2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; +1232D;CUNEIFORM SIGN UR2 TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; +1232E;CUNEIFORM SIGN UR2 TIMES AL;Lo;0;L;;;;;N;;;;; +1232F;CUNEIFORM SIGN UR2 TIMES HA;Lo;0;L;;;;;N;;;;; +12330;CUNEIFORM SIGN UR2 TIMES NUN;Lo;0;L;;;;;N;;;;; +12331;CUNEIFORM SIGN UR2 TIMES U2;Lo;0;L;;;;;N;;;;; +12332;CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +12333;CUNEIFORM SIGN UR2 TIMES U2 PLUS BI;Lo;0;L;;;;;N;;;;; +12334;CUNEIFORM SIGN UR4;Lo;0;L;;;;;N;;;;; +12335;CUNEIFORM SIGN URI;Lo;0;L;;;;;N;;;;; +12336;CUNEIFORM SIGN URI3;Lo;0;L;;;;;N;;;;; +12337;CUNEIFORM SIGN URU;Lo;0;L;;;;;N;;;;; +12338;CUNEIFORM SIGN URU TIMES A;Lo;0;L;;;;;N;;;;; +12339;CUNEIFORM SIGN URU TIMES ASHGAB;Lo;0;L;;;;;N;;;;; +1233A;CUNEIFORM SIGN URU TIMES BAR;Lo;0;L;;;;;N;;;;; +1233B;CUNEIFORM SIGN URU TIMES DUN;Lo;0;L;;;;;N;;;;; +1233C;CUNEIFORM SIGN URU TIMES GA;Lo;0;L;;;;;N;;;;; +1233D;CUNEIFORM SIGN URU TIMES GAL;Lo;0;L;;;;;N;;;;; +1233E;CUNEIFORM SIGN URU TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1233F;CUNEIFORM SIGN URU TIMES GAR;Lo;0;L;;;;;N;;;;; +12340;CUNEIFORM SIGN URU TIMES GU;Lo;0;L;;;;;N;;;;; +12341;CUNEIFORM SIGN URU TIMES HA;Lo;0;L;;;;;N;;;;; +12342;CUNEIFORM SIGN URU TIMES IGI;Lo;0;L;;;;;N;;;;; +12343;CUNEIFORM SIGN URU TIMES IM;Lo;0;L;;;;;N;;;;; +12344;CUNEIFORM SIGN URU TIMES ISH;Lo;0;L;;;;;N;;;;; +12345;CUNEIFORM SIGN URU TIMES KI;Lo;0;L;;;;;N;;;;; +12346;CUNEIFORM SIGN URU TIMES LUM;Lo;0;L;;;;;N;;;;; +12347;CUNEIFORM SIGN URU TIMES MIN;Lo;0;L;;;;;N;;;;; +12348;CUNEIFORM SIGN URU TIMES PA;Lo;0;L;;;;;N;;;;; +12349;CUNEIFORM SIGN URU TIMES SHE;Lo;0;L;;;;;N;;;;; +1234A;CUNEIFORM SIGN URU TIMES SIG4;Lo;0;L;;;;;N;;;;; +1234B;CUNEIFORM SIGN URU TIMES TU;Lo;0;L;;;;;N;;;;; +1234C;CUNEIFORM SIGN URU TIMES U PLUS GUD;Lo;0;L;;;;;N;;;;; +1234D;CUNEIFORM SIGN URU TIMES UD;Lo;0;L;;;;;N;;;;; +1234E;CUNEIFORM SIGN URU TIMES URUDA;Lo;0;L;;;;;N;;;;; +1234F;CUNEIFORM SIGN URUDA;Lo;0;L;;;;;N;;;;; +12350;CUNEIFORM SIGN URUDA TIMES U;Lo;0;L;;;;;N;;;;; +12351;CUNEIFORM SIGN USH;Lo;0;L;;;;;N;;;;; +12352;CUNEIFORM SIGN USH TIMES A;Lo;0;L;;;;;N;;;;; +12353;CUNEIFORM SIGN USH TIMES KU;Lo;0;L;;;;;N;;;;; +12354;CUNEIFORM SIGN USH TIMES KUR;Lo;0;L;;;;;N;;;;; +12355;CUNEIFORM SIGN USH TIMES TAK4;Lo;0;L;;;;;N;;;;; +12356;CUNEIFORM SIGN USHX;Lo;0;L;;;;;N;;;;; +12357;CUNEIFORM SIGN USH2;Lo;0;L;;;;;N;;;;; +12358;CUNEIFORM SIGN USHUMX;Lo;0;L;;;;;N;;;;; +12359;CUNEIFORM SIGN UTUKI;Lo;0;L;;;;;N;;;;; +1235A;CUNEIFORM SIGN UZ3;Lo;0;L;;;;;N;;;;; +1235B;CUNEIFORM SIGN UZ3 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1235C;CUNEIFORM SIGN UZU;Lo;0;L;;;;;N;;;;; +1235D;CUNEIFORM SIGN ZA;Lo;0;L;;;;;N;;;;; +1235E;CUNEIFORM SIGN ZA TENU;Lo;0;L;;;;;N;;;;; +1235F;CUNEIFORM SIGN ZA SQUARED TIMES KUR;Lo;0;L;;;;;N;;;;; +12360;CUNEIFORM SIGN ZAG;Lo;0;L;;;;;N;;;;; +12361;CUNEIFORM SIGN ZAMX;Lo;0;L;;;;;N;;;;; +12362;CUNEIFORM SIGN ZE2;Lo;0;L;;;;;N;;;;; +12363;CUNEIFORM SIGN ZI;Lo;0;L;;;;;N;;;;; +12364;CUNEIFORM SIGN ZI OVER ZI;Lo;0;L;;;;;N;;;;; +12365;CUNEIFORM SIGN ZI3;Lo;0;L;;;;;N;;;;; +12366;CUNEIFORM SIGN ZIB;Lo;0;L;;;;;N;;;;; +12367;CUNEIFORM SIGN ZIB KABA TENU;Lo;0;L;;;;;N;;;;; +12368;CUNEIFORM SIGN ZIG;Lo;0;L;;;;;N;;;;; +12369;CUNEIFORM SIGN ZIZ2;Lo;0;L;;;;;N;;;;; +1236A;CUNEIFORM SIGN ZU;Lo;0;L;;;;;N;;;;; +1236B;CUNEIFORM SIGN ZU5;Lo;0;L;;;;;N;;;;; +1236C;CUNEIFORM SIGN ZU5 TIMES A;Lo;0;L;;;;;N;;;;; +1236D;CUNEIFORM SIGN ZUBUR;Lo;0;L;;;;;N;;;;; +1236E;CUNEIFORM SIGN ZUM;Lo;0;L;;;;;N;;;;; +12400;CUNEIFORM NUMERIC SIGN TWO ASH;Nl;0;L;;;;2;N;;;;; +12401;CUNEIFORM NUMERIC SIGN THREE ASH;Nl;0;L;;;;3;N;;;;; +12402;CUNEIFORM NUMERIC SIGN FOUR ASH;Nl;0;L;;;;4;N;;;;; +12403;CUNEIFORM NUMERIC SIGN FIVE ASH;Nl;0;L;;;;5;N;;;;; +12404;CUNEIFORM NUMERIC SIGN SIX ASH;Nl;0;L;;;;6;N;;;;; +12405;CUNEIFORM NUMERIC SIGN SEVEN ASH;Nl;0;L;;;;7;N;;;;; +12406;CUNEIFORM NUMERIC SIGN EIGHT ASH;Nl;0;L;;;;8;N;;;;; +12407;CUNEIFORM NUMERIC SIGN NINE ASH;Nl;0;L;;;;9;N;;;;; +12408;CUNEIFORM NUMERIC SIGN THREE DISH;Nl;0;L;;;;3;N;;;;; +12409;CUNEIFORM NUMERIC SIGN FOUR DISH;Nl;0;L;;;;4;N;;;;; +1240A;CUNEIFORM NUMERIC SIGN FIVE DISH;Nl;0;L;;;;5;N;;;;; +1240B;CUNEIFORM NUMERIC SIGN SIX DISH;Nl;0;L;;;;6;N;;;;; +1240C;CUNEIFORM NUMERIC SIGN SEVEN DISH;Nl;0;L;;;;7;N;;;;; +1240D;CUNEIFORM NUMERIC SIGN EIGHT DISH;Nl;0;L;;;;8;N;;;;; +1240E;CUNEIFORM NUMERIC SIGN NINE DISH;Nl;0;L;;;;9;N;;;;; +1240F;CUNEIFORM NUMERIC SIGN FOUR U;Nl;0;L;;;;4;N;;;;; +12410;CUNEIFORM NUMERIC SIGN FIVE U;Nl;0;L;;;;5;N;;;;; +12411;CUNEIFORM NUMERIC SIGN SIX U;Nl;0;L;;;;6;N;;;;; +12412;CUNEIFORM NUMERIC SIGN SEVEN U;Nl;0;L;;;;7;N;;;;; +12413;CUNEIFORM NUMERIC SIGN EIGHT U;Nl;0;L;;;;8;N;;;;; +12414;CUNEIFORM NUMERIC SIGN NINE U;Nl;0;L;;;;9;N;;;;; +12415;CUNEIFORM NUMERIC SIGN ONE GESH2;Nl;0;L;;;;1;N;;;;; +12416;CUNEIFORM NUMERIC SIGN TWO GESH2;Nl;0;L;;;;2;N;;;;; +12417;CUNEIFORM NUMERIC SIGN THREE GESH2;Nl;0;L;;;;3;N;;;;; +12418;CUNEIFORM NUMERIC SIGN FOUR GESH2;Nl;0;L;;;;4;N;;;;; +12419;CUNEIFORM NUMERIC SIGN FIVE GESH2;Nl;0;L;;;;5;N;;;;; +1241A;CUNEIFORM NUMERIC SIGN SIX GESH2;Nl;0;L;;;;6;N;;;;; +1241B;CUNEIFORM NUMERIC SIGN SEVEN GESH2;Nl;0;L;;;;7;N;;;;; +1241C;CUNEIFORM NUMERIC SIGN EIGHT GESH2;Nl;0;L;;;;8;N;;;;; +1241D;CUNEIFORM NUMERIC SIGN NINE GESH2;Nl;0;L;;;;9;N;;;;; +1241E;CUNEIFORM NUMERIC SIGN ONE GESHU;Nl;0;L;;;;1;N;;;;; +1241F;CUNEIFORM NUMERIC SIGN TWO GESHU;Nl;0;L;;;;2;N;;;;; +12420;CUNEIFORM NUMERIC SIGN THREE GESHU;Nl;0;L;;;;3;N;;;;; +12421;CUNEIFORM NUMERIC SIGN FOUR GESHU;Nl;0;L;;;;4;N;;;;; +12422;CUNEIFORM NUMERIC SIGN FIVE GESHU;Nl;0;L;;;;5;N;;;;; +12423;CUNEIFORM NUMERIC SIGN TWO SHAR2;Nl;0;L;;;;2;N;;;;; +12424;CUNEIFORM NUMERIC SIGN THREE SHAR2;Nl;0;L;;;;3;N;;;;; +12425;CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12426;CUNEIFORM NUMERIC SIGN FOUR SHAR2;Nl;0;L;;;;4;N;;;;; +12427;CUNEIFORM NUMERIC SIGN FIVE SHAR2;Nl;0;L;;;;5;N;;;;; +12428;CUNEIFORM NUMERIC SIGN SIX SHAR2;Nl;0;L;;;;6;N;;;;; +12429;CUNEIFORM NUMERIC SIGN SEVEN SHAR2;Nl;0;L;;;;7;N;;;;; +1242A;CUNEIFORM NUMERIC SIGN EIGHT SHAR2;Nl;0;L;;;;8;N;;;;; +1242B;CUNEIFORM NUMERIC SIGN NINE SHAR2;Nl;0;L;;;;9;N;;;;; +1242C;CUNEIFORM NUMERIC SIGN ONE SHARU;Nl;0;L;;;;1;N;;;;; +1242D;CUNEIFORM NUMERIC SIGN TWO SHARU;Nl;0;L;;;;2;N;;;;; +1242E;CUNEIFORM NUMERIC SIGN THREE SHARU;Nl;0;L;;;;3;N;;;;; +1242F;CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12430;CUNEIFORM NUMERIC SIGN FOUR SHARU;Nl;0;L;;;;4;N;;;;; +12431;CUNEIFORM NUMERIC SIGN FIVE SHARU;Nl;0;L;;;;5;N;;;;; +12432;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH;Nl;0;L;;;;;N;;;;; +12433;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN;Nl;0;L;;;;;N;;;;; +12434;CUNEIFORM NUMERIC SIGN ONE BURU;Nl;0;L;;;;1;N;;;;; +12435;CUNEIFORM NUMERIC SIGN TWO BURU;Nl;0;L;;;;2;N;;;;; +12436;CUNEIFORM NUMERIC SIGN THREE BURU;Nl;0;L;;;;3;N;;;;; +12437;CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12438;CUNEIFORM NUMERIC SIGN FOUR BURU;Nl;0;L;;;;4;N;;;;; +12439;CUNEIFORM NUMERIC SIGN FIVE BURU;Nl;0;L;;;;5;N;;;;; +1243A;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16;Nl;0;L;;;;3;N;;;;; +1243B;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21;Nl;0;L;;;;3;N;;;;; +1243C;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU;Nl;0;L;;;;4;N;;;;; +1243D;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4;Nl;0;L;;;;4;N;;;;; +1243E;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A;Nl;0;L;;;;4;N;;;;; +1243F;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B;Nl;0;L;;;;4;N;;;;; +12440;CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9;Nl;0;L;;;;6;N;;;;; +12441;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3;Nl;0;L;;;;7;N;;;;; +12442;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A;Nl;0;L;;;;7;N;;;;; +12443;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B;Nl;0;L;;;;7;N;;;;; +12444;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU;Nl;0;L;;;;8;N;;;;; +12445;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3;Nl;0;L;;;;8;N;;;;; +12446;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU;Nl;0;L;;;;9;N;;;;; +12447;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3;Nl;0;L;;;;9;N;;;;; +12448;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4;Nl;0;L;;;;9;N;;;;; +12449;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A;Nl;0;L;;;;9;N;;;;; +1244A;CUNEIFORM NUMERIC SIGN TWO ASH TENU;Nl;0;L;;;;2;N;;;;; +1244B;CUNEIFORM NUMERIC SIGN THREE ASH TENU;Nl;0;L;;;;3;N;;;;; +1244C;CUNEIFORM NUMERIC SIGN FOUR ASH TENU;Nl;0;L;;;;4;N;;;;; +1244D;CUNEIFORM NUMERIC SIGN FIVE ASH TENU;Nl;0;L;;;;5;N;;;;; +1244E;CUNEIFORM NUMERIC SIGN SIX ASH TENU;Nl;0;L;;;;6;N;;;;; +1244F;CUNEIFORM NUMERIC SIGN ONE BAN2;Nl;0;L;;;;1;N;;;;; +12450;CUNEIFORM NUMERIC SIGN TWO BAN2;Nl;0;L;;;;2;N;;;;; +12451;CUNEIFORM NUMERIC SIGN THREE BAN2;Nl;0;L;;;;3;N;;;;; +12452;CUNEIFORM NUMERIC SIGN FOUR BAN2;Nl;0;L;;;;4;N;;;;; +12453;CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM;Nl;0;L;;;;4;N;;;;; +12454;CUNEIFORM NUMERIC SIGN FIVE BAN2;Nl;0;L;;;;5;N;;;;; +12455;CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM;Nl;0;L;;;;5;N;;;;; +12456;CUNEIFORM NUMERIC SIGN NIGIDAMIN;Nl;0;L;;;;;N;;;;; +12457;CUNEIFORM NUMERIC SIGN NIGIDAESH;Nl;0;L;;;;;N;;;;; +12458;CUNEIFORM NUMERIC SIGN ONE ESHE3;Nl;0;L;;;;1;N;;;;; +12459;CUNEIFORM NUMERIC SIGN TWO ESHE3;Nl;0;L;;;;2;N;;;;; +1245A;CUNEIFORM NUMERIC SIGN ONE THIRD DISH;Nl;0;L;;;;1/3;N;;;;; +1245B;CUNEIFORM NUMERIC SIGN TWO THIRDS DISH;Nl;0;L;;;;2/3;N;;;;; +1245C;CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH;Nl;0;L;;;;5/6;N;;;;; +1245D;CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A;Nl;0;L;;;;1/3;N;;;;; +1245E;CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A;Nl;0;L;;;;2/3;N;;;;; +1245F;CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH;Nl;0;L;;;;1/8;N;;;;; +12460;CUNEIFORM NUMERIC SIGN ONE QUARTER ASH;Nl;0;L;;;;1/4;N;;;;; +12461;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH;Nl;0;L;;;;1/6;N;;;;; +12462;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER;Nl;0;L;;;;1/4;N;;;;; +12470;CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; +12471;CUNEIFORM PUNCTUATION SIGN VERTICAL COLON;Po;0;L;;;;;N;;;;; +12472;CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON;Po;0;L;;;;;N;;;;; +12473;CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON;Po;0;L;;;;;N;;;;; +13000;EGYPTIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;; +13001;EGYPTIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;; +13002;EGYPTIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;; +13003;EGYPTIAN HIEROGLYPH A004;Lo;0;L;;;;;N;;;;; +13004;EGYPTIAN HIEROGLYPH A005;Lo;0;L;;;;;N;;;;; +13005;EGYPTIAN HIEROGLYPH A005A;Lo;0;L;;;;;N;;;;; +13006;EGYPTIAN HIEROGLYPH A006;Lo;0;L;;;;;N;;;;; +13007;EGYPTIAN HIEROGLYPH A006A;Lo;0;L;;;;;N;;;;; +13008;EGYPTIAN HIEROGLYPH A006B;Lo;0;L;;;;;N;;;;; +13009;EGYPTIAN HIEROGLYPH A007;Lo;0;L;;;;;N;;;;; +1300A;EGYPTIAN HIEROGLYPH A008;Lo;0;L;;;;;N;;;;; +1300B;EGYPTIAN HIEROGLYPH A009;Lo;0;L;;;;;N;;;;; +1300C;EGYPTIAN HIEROGLYPH A010;Lo;0;L;;;;;N;;;;; +1300D;EGYPTIAN HIEROGLYPH A011;Lo;0;L;;;;;N;;;;; +1300E;EGYPTIAN HIEROGLYPH A012;Lo;0;L;;;;;N;;;;; +1300F;EGYPTIAN HIEROGLYPH A013;Lo;0;L;;;;;N;;;;; +13010;EGYPTIAN HIEROGLYPH A014;Lo;0;L;;;;;N;;;;; +13011;EGYPTIAN HIEROGLYPH A014A;Lo;0;L;;;;;N;;;;; +13012;EGYPTIAN HIEROGLYPH A015;Lo;0;L;;;;;N;;;;; +13013;EGYPTIAN HIEROGLYPH A016;Lo;0;L;;;;;N;;;;; +13014;EGYPTIAN HIEROGLYPH A017;Lo;0;L;;;;;N;;;;; +13015;EGYPTIAN HIEROGLYPH A017A;Lo;0;L;;;;;N;;;;; +13016;EGYPTIAN HIEROGLYPH A018;Lo;0;L;;;;;N;;;;; +13017;EGYPTIAN HIEROGLYPH A019;Lo;0;L;;;;;N;;;;; +13018;EGYPTIAN HIEROGLYPH A020;Lo;0;L;;;;;N;;;;; +13019;EGYPTIAN HIEROGLYPH A021;Lo;0;L;;;;;N;;;;; +1301A;EGYPTIAN HIEROGLYPH A022;Lo;0;L;;;;;N;;;;; +1301B;EGYPTIAN HIEROGLYPH A023;Lo;0;L;;;;;N;;;;; +1301C;EGYPTIAN HIEROGLYPH A024;Lo;0;L;;;;;N;;;;; +1301D;EGYPTIAN HIEROGLYPH A025;Lo;0;L;;;;;N;;;;; +1301E;EGYPTIAN HIEROGLYPH A026;Lo;0;L;;;;;N;;;;; +1301F;EGYPTIAN HIEROGLYPH A027;Lo;0;L;;;;;N;;;;; +13020;EGYPTIAN HIEROGLYPH A028;Lo;0;L;;;;;N;;;;; +13021;EGYPTIAN HIEROGLYPH A029;Lo;0;L;;;;;N;;;;; +13022;EGYPTIAN HIEROGLYPH A030;Lo;0;L;;;;;N;;;;; +13023;EGYPTIAN HIEROGLYPH A031;Lo;0;L;;;;;N;;;;; +13024;EGYPTIAN HIEROGLYPH A032;Lo;0;L;;;;;N;;;;; +13025;EGYPTIAN HIEROGLYPH A032A;Lo;0;L;;;;;N;;;;; +13026;EGYPTIAN HIEROGLYPH A033;Lo;0;L;;;;;N;;;;; +13027;EGYPTIAN HIEROGLYPH A034;Lo;0;L;;;;;N;;;;; +13028;EGYPTIAN HIEROGLYPH A035;Lo;0;L;;;;;N;;;;; +13029;EGYPTIAN HIEROGLYPH A036;Lo;0;L;;;;;N;;;;; +1302A;EGYPTIAN HIEROGLYPH A037;Lo;0;L;;;;;N;;;;; +1302B;EGYPTIAN HIEROGLYPH A038;Lo;0;L;;;;;N;;;;; +1302C;EGYPTIAN HIEROGLYPH A039;Lo;0;L;;;;;N;;;;; +1302D;EGYPTIAN HIEROGLYPH A040;Lo;0;L;;;;;N;;;;; +1302E;EGYPTIAN HIEROGLYPH A040A;Lo;0;L;;;;;N;;;;; +1302F;EGYPTIAN HIEROGLYPH A041;Lo;0;L;;;;;N;;;;; +13030;EGYPTIAN HIEROGLYPH A042;Lo;0;L;;;;;N;;;;; +13031;EGYPTIAN HIEROGLYPH A042A;Lo;0;L;;;;;N;;;;; +13032;EGYPTIAN HIEROGLYPH A043;Lo;0;L;;;;;N;;;;; +13033;EGYPTIAN HIEROGLYPH A043A;Lo;0;L;;;;;N;;;;; +13034;EGYPTIAN HIEROGLYPH A044;Lo;0;L;;;;;N;;;;; +13035;EGYPTIAN HIEROGLYPH A045;Lo;0;L;;;;;N;;;;; +13036;EGYPTIAN HIEROGLYPH A045A;Lo;0;L;;;;;N;;;;; +13037;EGYPTIAN HIEROGLYPH A046;Lo;0;L;;;;;N;;;;; +13038;EGYPTIAN HIEROGLYPH A047;Lo;0;L;;;;;N;;;;; +13039;EGYPTIAN HIEROGLYPH A048;Lo;0;L;;;;;N;;;;; +1303A;EGYPTIAN HIEROGLYPH A049;Lo;0;L;;;;;N;;;;; +1303B;EGYPTIAN HIEROGLYPH A050;Lo;0;L;;;;;N;;;;; +1303C;EGYPTIAN HIEROGLYPH A051;Lo;0;L;;;;;N;;;;; +1303D;EGYPTIAN HIEROGLYPH A052;Lo;0;L;;;;;N;;;;; +1303E;EGYPTIAN HIEROGLYPH A053;Lo;0;L;;;;;N;;;;; +1303F;EGYPTIAN HIEROGLYPH A054;Lo;0;L;;;;;N;;;;; +13040;EGYPTIAN HIEROGLYPH A055;Lo;0;L;;;;;N;;;;; +13041;EGYPTIAN HIEROGLYPH A056;Lo;0;L;;;;;N;;;;; +13042;EGYPTIAN HIEROGLYPH A057;Lo;0;L;;;;;N;;;;; +13043;EGYPTIAN HIEROGLYPH A058;Lo;0;L;;;;;N;;;;; +13044;EGYPTIAN HIEROGLYPH A059;Lo;0;L;;;;;N;;;;; +13045;EGYPTIAN HIEROGLYPH A060;Lo;0;L;;;;;N;;;;; +13046;EGYPTIAN HIEROGLYPH A061;Lo;0;L;;;;;N;;;;; +13047;EGYPTIAN HIEROGLYPH A062;Lo;0;L;;;;;N;;;;; +13048;EGYPTIAN HIEROGLYPH A063;Lo;0;L;;;;;N;;;;; +13049;EGYPTIAN HIEROGLYPH A064;Lo;0;L;;;;;N;;;;; +1304A;EGYPTIAN HIEROGLYPH A065;Lo;0;L;;;;;N;;;;; +1304B;EGYPTIAN HIEROGLYPH A066;Lo;0;L;;;;;N;;;;; +1304C;EGYPTIAN HIEROGLYPH A067;Lo;0;L;;;;;N;;;;; +1304D;EGYPTIAN HIEROGLYPH A068;Lo;0;L;;;;;N;;;;; +1304E;EGYPTIAN HIEROGLYPH A069;Lo;0;L;;;;;N;;;;; +1304F;EGYPTIAN HIEROGLYPH A070;Lo;0;L;;;;;N;;;;; +13050;EGYPTIAN HIEROGLYPH B001;Lo;0;L;;;;;N;;;;; +13051;EGYPTIAN HIEROGLYPH B002;Lo;0;L;;;;;N;;;;; +13052;EGYPTIAN HIEROGLYPH B003;Lo;0;L;;;;;N;;;;; +13053;EGYPTIAN HIEROGLYPH B004;Lo;0;L;;;;;N;;;;; +13054;EGYPTIAN HIEROGLYPH B005;Lo;0;L;;;;;N;;;;; +13055;EGYPTIAN HIEROGLYPH B005A;Lo;0;L;;;;;N;;;;; +13056;EGYPTIAN HIEROGLYPH B006;Lo;0;L;;;;;N;;;;; +13057;EGYPTIAN HIEROGLYPH B007;Lo;0;L;;;;;N;;;;; +13058;EGYPTIAN HIEROGLYPH B008;Lo;0;L;;;;;N;;;;; +13059;EGYPTIAN HIEROGLYPH B009;Lo;0;L;;;;;N;;;;; +1305A;EGYPTIAN HIEROGLYPH C001;Lo;0;L;;;;;N;;;;; +1305B;EGYPTIAN HIEROGLYPH C002;Lo;0;L;;;;;N;;;;; +1305C;EGYPTIAN HIEROGLYPH C002A;Lo;0;L;;;;;N;;;;; +1305D;EGYPTIAN HIEROGLYPH C002B;Lo;0;L;;;;;N;;;;; +1305E;EGYPTIAN HIEROGLYPH C002C;Lo;0;L;;;;;N;;;;; +1305F;EGYPTIAN HIEROGLYPH C003;Lo;0;L;;;;;N;;;;; +13060;EGYPTIAN HIEROGLYPH C004;Lo;0;L;;;;;N;;;;; +13061;EGYPTIAN HIEROGLYPH C005;Lo;0;L;;;;;N;;;;; +13062;EGYPTIAN HIEROGLYPH C006;Lo;0;L;;;;;N;;;;; +13063;EGYPTIAN HIEROGLYPH C007;Lo;0;L;;;;;N;;;;; +13064;EGYPTIAN HIEROGLYPH C008;Lo;0;L;;;;;N;;;;; +13065;EGYPTIAN HIEROGLYPH C009;Lo;0;L;;;;;N;;;;; +13066;EGYPTIAN HIEROGLYPH C010;Lo;0;L;;;;;N;;;;; +13067;EGYPTIAN HIEROGLYPH C010A;Lo;0;L;;;;;N;;;;; +13068;EGYPTIAN HIEROGLYPH C011;Lo;0;L;;;;;N;;;;; +13069;EGYPTIAN HIEROGLYPH C012;Lo;0;L;;;;;N;;;;; +1306A;EGYPTIAN HIEROGLYPH C013;Lo;0;L;;;;;N;;;;; +1306B;EGYPTIAN HIEROGLYPH C014;Lo;0;L;;;;;N;;;;; +1306C;EGYPTIAN HIEROGLYPH C015;Lo;0;L;;;;;N;;;;; +1306D;EGYPTIAN HIEROGLYPH C016;Lo;0;L;;;;;N;;;;; +1306E;EGYPTIAN HIEROGLYPH C017;Lo;0;L;;;;;N;;;;; +1306F;EGYPTIAN HIEROGLYPH C018;Lo;0;L;;;;;N;;;;; +13070;EGYPTIAN HIEROGLYPH C019;Lo;0;L;;;;;N;;;;; +13071;EGYPTIAN HIEROGLYPH C020;Lo;0;L;;;;;N;;;;; +13072;EGYPTIAN HIEROGLYPH C021;Lo;0;L;;;;;N;;;;; +13073;EGYPTIAN HIEROGLYPH C022;Lo;0;L;;;;;N;;;;; +13074;EGYPTIAN HIEROGLYPH C023;Lo;0;L;;;;;N;;;;; +13075;EGYPTIAN HIEROGLYPH C024;Lo;0;L;;;;;N;;;;; +13076;EGYPTIAN HIEROGLYPH D001;Lo;0;L;;;;;N;;;;; +13077;EGYPTIAN HIEROGLYPH D002;Lo;0;L;;;;;N;;;;; +13078;EGYPTIAN HIEROGLYPH D003;Lo;0;L;;;;;N;;;;; +13079;EGYPTIAN HIEROGLYPH D004;Lo;0;L;;;;;N;;;;; +1307A;EGYPTIAN HIEROGLYPH D005;Lo;0;L;;;;;N;;;;; +1307B;EGYPTIAN HIEROGLYPH D006;Lo;0;L;;;;;N;;;;; +1307C;EGYPTIAN HIEROGLYPH D007;Lo;0;L;;;;;N;;;;; +1307D;EGYPTIAN HIEROGLYPH D008;Lo;0;L;;;;;N;;;;; +1307E;EGYPTIAN HIEROGLYPH D008A;Lo;0;L;;;;;N;;;;; +1307F;EGYPTIAN HIEROGLYPH D009;Lo;0;L;;;;;N;;;;; +13080;EGYPTIAN HIEROGLYPH D010;Lo;0;L;;;;;N;;;;; +13081;EGYPTIAN HIEROGLYPH D011;Lo;0;L;;;;;N;;;;; +13082;EGYPTIAN HIEROGLYPH D012;Lo;0;L;;;;;N;;;;; +13083;EGYPTIAN HIEROGLYPH D013;Lo;0;L;;;;;N;;;;; +13084;EGYPTIAN HIEROGLYPH D014;Lo;0;L;;;;;N;;;;; +13085;EGYPTIAN HIEROGLYPH D015;Lo;0;L;;;;;N;;;;; +13086;EGYPTIAN HIEROGLYPH D016;Lo;0;L;;;;;N;;;;; +13087;EGYPTIAN HIEROGLYPH D017;Lo;0;L;;;;;N;;;;; +13088;EGYPTIAN HIEROGLYPH D018;Lo;0;L;;;;;N;;;;; +13089;EGYPTIAN HIEROGLYPH D019;Lo;0;L;;;;;N;;;;; +1308A;EGYPTIAN HIEROGLYPH D020;Lo;0;L;;;;;N;;;;; +1308B;EGYPTIAN HIEROGLYPH D021;Lo;0;L;;;;;N;;;;; +1308C;EGYPTIAN HIEROGLYPH D022;Lo;0;L;;;;;N;;;;; +1308D;EGYPTIAN HIEROGLYPH D023;Lo;0;L;;;;;N;;;;; +1308E;EGYPTIAN HIEROGLYPH D024;Lo;0;L;;;;;N;;;;; +1308F;EGYPTIAN HIEROGLYPH D025;Lo;0;L;;;;;N;;;;; +13090;EGYPTIAN HIEROGLYPH D026;Lo;0;L;;;;;N;;;;; +13091;EGYPTIAN HIEROGLYPH D027;Lo;0;L;;;;;N;;;;; +13092;EGYPTIAN HIEROGLYPH D027A;Lo;0;L;;;;;N;;;;; +13093;EGYPTIAN HIEROGLYPH D028;Lo;0;L;;;;;N;;;;; +13094;EGYPTIAN HIEROGLYPH D029;Lo;0;L;;;;;N;;;;; +13095;EGYPTIAN HIEROGLYPH D030;Lo;0;L;;;;;N;;;;; +13096;EGYPTIAN HIEROGLYPH D031;Lo;0;L;;;;;N;;;;; +13097;EGYPTIAN HIEROGLYPH D031A;Lo;0;L;;;;;N;;;;; +13098;EGYPTIAN HIEROGLYPH D032;Lo;0;L;;;;;N;;;;; +13099;EGYPTIAN HIEROGLYPH D033;Lo;0;L;;;;;N;;;;; +1309A;EGYPTIAN HIEROGLYPH D034;Lo;0;L;;;;;N;;;;; +1309B;EGYPTIAN HIEROGLYPH D034A;Lo;0;L;;;;;N;;;;; +1309C;EGYPTIAN HIEROGLYPH D035;Lo;0;L;;;;;N;;;;; +1309D;EGYPTIAN HIEROGLYPH D036;Lo;0;L;;;;;N;;;;; +1309E;EGYPTIAN HIEROGLYPH D037;Lo;0;L;;;;;N;;;;; +1309F;EGYPTIAN HIEROGLYPH D038;Lo;0;L;;;;;N;;;;; +130A0;EGYPTIAN HIEROGLYPH D039;Lo;0;L;;;;;N;;;;; +130A1;EGYPTIAN HIEROGLYPH D040;Lo;0;L;;;;;N;;;;; +130A2;EGYPTIAN HIEROGLYPH D041;Lo;0;L;;;;;N;;;;; +130A3;EGYPTIAN HIEROGLYPH D042;Lo;0;L;;;;;N;;;;; +130A4;EGYPTIAN HIEROGLYPH D043;Lo;0;L;;;;;N;;;;; +130A5;EGYPTIAN HIEROGLYPH D044;Lo;0;L;;;;;N;;;;; +130A6;EGYPTIAN HIEROGLYPH D045;Lo;0;L;;;;;N;;;;; +130A7;EGYPTIAN HIEROGLYPH D046;Lo;0;L;;;;;N;;;;; +130A8;EGYPTIAN HIEROGLYPH D046A;Lo;0;L;;;;;N;;;;; +130A9;EGYPTIAN HIEROGLYPH D047;Lo;0;L;;;;;N;;;;; +130AA;EGYPTIAN HIEROGLYPH D048;Lo;0;L;;;;;N;;;;; +130AB;EGYPTIAN HIEROGLYPH D048A;Lo;0;L;;;;;N;;;;; +130AC;EGYPTIAN HIEROGLYPH D049;Lo;0;L;;;;;N;;;;; +130AD;EGYPTIAN HIEROGLYPH D050;Lo;0;L;;;;;N;;;;; +130AE;EGYPTIAN HIEROGLYPH D050A;Lo;0;L;;;;;N;;;;; +130AF;EGYPTIAN HIEROGLYPH D050B;Lo;0;L;;;;;N;;;;; +130B0;EGYPTIAN HIEROGLYPH D050C;Lo;0;L;;;;;N;;;;; +130B1;EGYPTIAN HIEROGLYPH D050D;Lo;0;L;;;;;N;;;;; +130B2;EGYPTIAN HIEROGLYPH D050E;Lo;0;L;;;;;N;;;;; +130B3;EGYPTIAN HIEROGLYPH D050F;Lo;0;L;;;;;N;;;;; +130B4;EGYPTIAN HIEROGLYPH D050G;Lo;0;L;;;;;N;;;;; +130B5;EGYPTIAN HIEROGLYPH D050H;Lo;0;L;;;;;N;;;;; +130B6;EGYPTIAN HIEROGLYPH D050I;Lo;0;L;;;;;N;;;;; +130B7;EGYPTIAN HIEROGLYPH D051;Lo;0;L;;;;;N;;;;; +130B8;EGYPTIAN HIEROGLYPH D052;Lo;0;L;;;;;N;;;;; +130B9;EGYPTIAN HIEROGLYPH D052A;Lo;0;L;;;;;N;;;;; +130BA;EGYPTIAN HIEROGLYPH D053;Lo;0;L;;;;;N;;;;; +130BB;EGYPTIAN HIEROGLYPH D054;Lo;0;L;;;;;N;;;;; +130BC;EGYPTIAN HIEROGLYPH D054A;Lo;0;L;;;;;N;;;;; +130BD;EGYPTIAN HIEROGLYPH D055;Lo;0;L;;;;;N;;;;; +130BE;EGYPTIAN HIEROGLYPH D056;Lo;0;L;;;;;N;;;;; +130BF;EGYPTIAN HIEROGLYPH D057;Lo;0;L;;;;;N;;;;; +130C0;EGYPTIAN HIEROGLYPH D058;Lo;0;L;;;;;N;;;;; +130C1;EGYPTIAN HIEROGLYPH D059;Lo;0;L;;;;;N;;;;; +130C2;EGYPTIAN HIEROGLYPH D060;Lo;0;L;;;;;N;;;;; +130C3;EGYPTIAN HIEROGLYPH D061;Lo;0;L;;;;;N;;;;; +130C4;EGYPTIAN HIEROGLYPH D062;Lo;0;L;;;;;N;;;;; +130C5;EGYPTIAN HIEROGLYPH D063;Lo;0;L;;;;;N;;;;; +130C6;EGYPTIAN HIEROGLYPH D064;Lo;0;L;;;;;N;;;;; +130C7;EGYPTIAN HIEROGLYPH D065;Lo;0;L;;;;;N;;;;; +130C8;EGYPTIAN HIEROGLYPH D066;Lo;0;L;;;;;N;;;;; +130C9;EGYPTIAN HIEROGLYPH D067;Lo;0;L;;;;;N;;;;; +130CA;EGYPTIAN HIEROGLYPH D067A;Lo;0;L;;;;;N;;;;; +130CB;EGYPTIAN HIEROGLYPH D067B;Lo;0;L;;;;;N;;;;; +130CC;EGYPTIAN HIEROGLYPH D067C;Lo;0;L;;;;;N;;;;; +130CD;EGYPTIAN HIEROGLYPH D067D;Lo;0;L;;;;;N;;;;; +130CE;EGYPTIAN HIEROGLYPH D067E;Lo;0;L;;;;;N;;;;; +130CF;EGYPTIAN HIEROGLYPH D067F;Lo;0;L;;;;;N;;;;; +130D0;EGYPTIAN HIEROGLYPH D067G;Lo;0;L;;;;;N;;;;; +130D1;EGYPTIAN HIEROGLYPH D067H;Lo;0;L;;;;;N;;;;; +130D2;EGYPTIAN HIEROGLYPH E001;Lo;0;L;;;;;N;;;;; +130D3;EGYPTIAN HIEROGLYPH E002;Lo;0;L;;;;;N;;;;; +130D4;EGYPTIAN HIEROGLYPH E003;Lo;0;L;;;;;N;;;;; +130D5;EGYPTIAN HIEROGLYPH E004;Lo;0;L;;;;;N;;;;; +130D6;EGYPTIAN HIEROGLYPH E005;Lo;0;L;;;;;N;;;;; +130D7;EGYPTIAN HIEROGLYPH E006;Lo;0;L;;;;;N;;;;; +130D8;EGYPTIAN HIEROGLYPH E007;Lo;0;L;;;;;N;;;;; +130D9;EGYPTIAN HIEROGLYPH E008;Lo;0;L;;;;;N;;;;; +130DA;EGYPTIAN HIEROGLYPH E008A;Lo;0;L;;;;;N;;;;; +130DB;EGYPTIAN HIEROGLYPH E009;Lo;0;L;;;;;N;;;;; +130DC;EGYPTIAN HIEROGLYPH E009A;Lo;0;L;;;;;N;;;;; +130DD;EGYPTIAN HIEROGLYPH E010;Lo;0;L;;;;;N;;;;; +130DE;EGYPTIAN HIEROGLYPH E011;Lo;0;L;;;;;N;;;;; +130DF;EGYPTIAN HIEROGLYPH E012;Lo;0;L;;;;;N;;;;; +130E0;EGYPTIAN HIEROGLYPH E013;Lo;0;L;;;;;N;;;;; +130E1;EGYPTIAN HIEROGLYPH E014;Lo;0;L;;;;;N;;;;; +130E2;EGYPTIAN HIEROGLYPH E015;Lo;0;L;;;;;N;;;;; +130E3;EGYPTIAN HIEROGLYPH E016;Lo;0;L;;;;;N;;;;; +130E4;EGYPTIAN HIEROGLYPH E016A;Lo;0;L;;;;;N;;;;; +130E5;EGYPTIAN HIEROGLYPH E017;Lo;0;L;;;;;N;;;;; +130E6;EGYPTIAN HIEROGLYPH E017A;Lo;0;L;;;;;N;;;;; +130E7;EGYPTIAN HIEROGLYPH E018;Lo;0;L;;;;;N;;;;; +130E8;EGYPTIAN HIEROGLYPH E019;Lo;0;L;;;;;N;;;;; +130E9;EGYPTIAN HIEROGLYPH E020;Lo;0;L;;;;;N;;;;; +130EA;EGYPTIAN HIEROGLYPH E020A;Lo;0;L;;;;;N;;;;; +130EB;EGYPTIAN HIEROGLYPH E021;Lo;0;L;;;;;N;;;;; +130EC;EGYPTIAN HIEROGLYPH E022;Lo;0;L;;;;;N;;;;; +130ED;EGYPTIAN HIEROGLYPH E023;Lo;0;L;;;;;N;;;;; +130EE;EGYPTIAN HIEROGLYPH E024;Lo;0;L;;;;;N;;;;; +130EF;EGYPTIAN HIEROGLYPH E025;Lo;0;L;;;;;N;;;;; +130F0;EGYPTIAN HIEROGLYPH E026;Lo;0;L;;;;;N;;;;; +130F1;EGYPTIAN HIEROGLYPH E027;Lo;0;L;;;;;N;;;;; +130F2;EGYPTIAN HIEROGLYPH E028;Lo;0;L;;;;;N;;;;; +130F3;EGYPTIAN HIEROGLYPH E028A;Lo;0;L;;;;;N;;;;; +130F4;EGYPTIAN HIEROGLYPH E029;Lo;0;L;;;;;N;;;;; +130F5;EGYPTIAN HIEROGLYPH E030;Lo;0;L;;;;;N;;;;; +130F6;EGYPTIAN HIEROGLYPH E031;Lo;0;L;;;;;N;;;;; +130F7;EGYPTIAN HIEROGLYPH E032;Lo;0;L;;;;;N;;;;; +130F8;EGYPTIAN HIEROGLYPH E033;Lo;0;L;;;;;N;;;;; +130F9;EGYPTIAN HIEROGLYPH E034;Lo;0;L;;;;;N;;;;; +130FA;EGYPTIAN HIEROGLYPH E034A;Lo;0;L;;;;;N;;;;; +130FB;EGYPTIAN HIEROGLYPH E036;Lo;0;L;;;;;N;;;;; +130FC;EGYPTIAN HIEROGLYPH E037;Lo;0;L;;;;;N;;;;; +130FD;EGYPTIAN HIEROGLYPH E038;Lo;0;L;;;;;N;;;;; +130FE;EGYPTIAN HIEROGLYPH F001;Lo;0;L;;;;;N;;;;; +130FF;EGYPTIAN HIEROGLYPH F001A;Lo;0;L;;;;;N;;;;; +13100;EGYPTIAN HIEROGLYPH F002;Lo;0;L;;;;;N;;;;; +13101;EGYPTIAN HIEROGLYPH F003;Lo;0;L;;;;;N;;;;; +13102;EGYPTIAN HIEROGLYPH F004;Lo;0;L;;;;;N;;;;; +13103;EGYPTIAN HIEROGLYPH F005;Lo;0;L;;;;;N;;;;; +13104;EGYPTIAN HIEROGLYPH F006;Lo;0;L;;;;;N;;;;; +13105;EGYPTIAN HIEROGLYPH F007;Lo;0;L;;;;;N;;;;; +13106;EGYPTIAN HIEROGLYPH F008;Lo;0;L;;;;;N;;;;; +13107;EGYPTIAN HIEROGLYPH F009;Lo;0;L;;;;;N;;;;; +13108;EGYPTIAN HIEROGLYPH F010;Lo;0;L;;;;;N;;;;; +13109;EGYPTIAN HIEROGLYPH F011;Lo;0;L;;;;;N;;;;; +1310A;EGYPTIAN HIEROGLYPH F012;Lo;0;L;;;;;N;;;;; +1310B;EGYPTIAN HIEROGLYPH F013;Lo;0;L;;;;;N;;;;; +1310C;EGYPTIAN HIEROGLYPH F013A;Lo;0;L;;;;;N;;;;; +1310D;EGYPTIAN HIEROGLYPH F014;Lo;0;L;;;;;N;;;;; +1310E;EGYPTIAN HIEROGLYPH F015;Lo;0;L;;;;;N;;;;; +1310F;EGYPTIAN HIEROGLYPH F016;Lo;0;L;;;;;N;;;;; +13110;EGYPTIAN HIEROGLYPH F017;Lo;0;L;;;;;N;;;;; +13111;EGYPTIAN HIEROGLYPH F018;Lo;0;L;;;;;N;;;;; +13112;EGYPTIAN HIEROGLYPH F019;Lo;0;L;;;;;N;;;;; +13113;EGYPTIAN HIEROGLYPH F020;Lo;0;L;;;;;N;;;;; +13114;EGYPTIAN HIEROGLYPH F021;Lo;0;L;;;;;N;;;;; +13115;EGYPTIAN HIEROGLYPH F021A;Lo;0;L;;;;;N;;;;; +13116;EGYPTIAN HIEROGLYPH F022;Lo;0;L;;;;;N;;;;; +13117;EGYPTIAN HIEROGLYPH F023;Lo;0;L;;;;;N;;;;; +13118;EGYPTIAN HIEROGLYPH F024;Lo;0;L;;;;;N;;;;; +13119;EGYPTIAN HIEROGLYPH F025;Lo;0;L;;;;;N;;;;; +1311A;EGYPTIAN HIEROGLYPH F026;Lo;0;L;;;;;N;;;;; +1311B;EGYPTIAN HIEROGLYPH F027;Lo;0;L;;;;;N;;;;; +1311C;EGYPTIAN HIEROGLYPH F028;Lo;0;L;;;;;N;;;;; +1311D;EGYPTIAN HIEROGLYPH F029;Lo;0;L;;;;;N;;;;; +1311E;EGYPTIAN HIEROGLYPH F030;Lo;0;L;;;;;N;;;;; +1311F;EGYPTIAN HIEROGLYPH F031;Lo;0;L;;;;;N;;;;; +13120;EGYPTIAN HIEROGLYPH F031A;Lo;0;L;;;;;N;;;;; +13121;EGYPTIAN HIEROGLYPH F032;Lo;0;L;;;;;N;;;;; +13122;EGYPTIAN HIEROGLYPH F033;Lo;0;L;;;;;N;;;;; +13123;EGYPTIAN HIEROGLYPH F034;Lo;0;L;;;;;N;;;;; +13124;EGYPTIAN HIEROGLYPH F035;Lo;0;L;;;;;N;;;;; +13125;EGYPTIAN HIEROGLYPH F036;Lo;0;L;;;;;N;;;;; +13126;EGYPTIAN HIEROGLYPH F037;Lo;0;L;;;;;N;;;;; +13127;EGYPTIAN HIEROGLYPH F037A;Lo;0;L;;;;;N;;;;; +13128;EGYPTIAN HIEROGLYPH F038;Lo;0;L;;;;;N;;;;; +13129;EGYPTIAN HIEROGLYPH F038A;Lo;0;L;;;;;N;;;;; +1312A;EGYPTIAN HIEROGLYPH F039;Lo;0;L;;;;;N;;;;; +1312B;EGYPTIAN HIEROGLYPH F040;Lo;0;L;;;;;N;;;;; +1312C;EGYPTIAN HIEROGLYPH F041;Lo;0;L;;;;;N;;;;; +1312D;EGYPTIAN HIEROGLYPH F042;Lo;0;L;;;;;N;;;;; +1312E;EGYPTIAN HIEROGLYPH F043;Lo;0;L;;;;;N;;;;; +1312F;EGYPTIAN HIEROGLYPH F044;Lo;0;L;;;;;N;;;;; +13130;EGYPTIAN HIEROGLYPH F045;Lo;0;L;;;;;N;;;;; +13131;EGYPTIAN HIEROGLYPH F045A;Lo;0;L;;;;;N;;;;; +13132;EGYPTIAN HIEROGLYPH F046;Lo;0;L;;;;;N;;;;; +13133;EGYPTIAN HIEROGLYPH F046A;Lo;0;L;;;;;N;;;;; +13134;EGYPTIAN HIEROGLYPH F047;Lo;0;L;;;;;N;;;;; +13135;EGYPTIAN HIEROGLYPH F047A;Lo;0;L;;;;;N;;;;; +13136;EGYPTIAN HIEROGLYPH F048;Lo;0;L;;;;;N;;;;; +13137;EGYPTIAN HIEROGLYPH F049;Lo;0;L;;;;;N;;;;; +13138;EGYPTIAN HIEROGLYPH F050;Lo;0;L;;;;;N;;;;; +13139;EGYPTIAN HIEROGLYPH F051;Lo;0;L;;;;;N;;;;; +1313A;EGYPTIAN HIEROGLYPH F051A;Lo;0;L;;;;;N;;;;; +1313B;EGYPTIAN HIEROGLYPH F051B;Lo;0;L;;;;;N;;;;; +1313C;EGYPTIAN HIEROGLYPH F051C;Lo;0;L;;;;;N;;;;; +1313D;EGYPTIAN HIEROGLYPH F052;Lo;0;L;;;;;N;;;;; +1313E;EGYPTIAN HIEROGLYPH F053;Lo;0;L;;;;;N;;;;; +1313F;EGYPTIAN HIEROGLYPH G001;Lo;0;L;;;;;N;;;;; +13140;EGYPTIAN HIEROGLYPH G002;Lo;0;L;;;;;N;;;;; +13141;EGYPTIAN HIEROGLYPH G003;Lo;0;L;;;;;N;;;;; +13142;EGYPTIAN HIEROGLYPH G004;Lo;0;L;;;;;N;;;;; +13143;EGYPTIAN HIEROGLYPH G005;Lo;0;L;;;;;N;;;;; +13144;EGYPTIAN HIEROGLYPH G006;Lo;0;L;;;;;N;;;;; +13145;EGYPTIAN HIEROGLYPH G006A;Lo;0;L;;;;;N;;;;; +13146;EGYPTIAN HIEROGLYPH G007;Lo;0;L;;;;;N;;;;; +13147;EGYPTIAN HIEROGLYPH G007A;Lo;0;L;;;;;N;;;;; +13148;EGYPTIAN HIEROGLYPH G007B;Lo;0;L;;;;;N;;;;; +13149;EGYPTIAN HIEROGLYPH G008;Lo;0;L;;;;;N;;;;; +1314A;EGYPTIAN HIEROGLYPH G009;Lo;0;L;;;;;N;;;;; +1314B;EGYPTIAN HIEROGLYPH G010;Lo;0;L;;;;;N;;;;; +1314C;EGYPTIAN HIEROGLYPH G011;Lo;0;L;;;;;N;;;;; +1314D;EGYPTIAN HIEROGLYPH G011A;Lo;0;L;;;;;N;;;;; +1314E;EGYPTIAN HIEROGLYPH G012;Lo;0;L;;;;;N;;;;; +1314F;EGYPTIAN HIEROGLYPH G013;Lo;0;L;;;;;N;;;;; +13150;EGYPTIAN HIEROGLYPH G014;Lo;0;L;;;;;N;;;;; +13151;EGYPTIAN HIEROGLYPH G015;Lo;0;L;;;;;N;;;;; +13152;EGYPTIAN HIEROGLYPH G016;Lo;0;L;;;;;N;;;;; +13153;EGYPTIAN HIEROGLYPH G017;Lo;0;L;;;;;N;;;;; +13154;EGYPTIAN HIEROGLYPH G018;Lo;0;L;;;;;N;;;;; +13155;EGYPTIAN HIEROGLYPH G019;Lo;0;L;;;;;N;;;;; +13156;EGYPTIAN HIEROGLYPH G020;Lo;0;L;;;;;N;;;;; +13157;EGYPTIAN HIEROGLYPH G020A;Lo;0;L;;;;;N;;;;; +13158;EGYPTIAN HIEROGLYPH G021;Lo;0;L;;;;;N;;;;; +13159;EGYPTIAN HIEROGLYPH G022;Lo;0;L;;;;;N;;;;; +1315A;EGYPTIAN HIEROGLYPH G023;Lo;0;L;;;;;N;;;;; +1315B;EGYPTIAN HIEROGLYPH G024;Lo;0;L;;;;;N;;;;; +1315C;EGYPTIAN HIEROGLYPH G025;Lo;0;L;;;;;N;;;;; +1315D;EGYPTIAN HIEROGLYPH G026;Lo;0;L;;;;;N;;;;; +1315E;EGYPTIAN HIEROGLYPH G026A;Lo;0;L;;;;;N;;;;; +1315F;EGYPTIAN HIEROGLYPH G027;Lo;0;L;;;;;N;;;;; +13160;EGYPTIAN HIEROGLYPH G028;Lo;0;L;;;;;N;;;;; +13161;EGYPTIAN HIEROGLYPH G029;Lo;0;L;;;;;N;;;;; +13162;EGYPTIAN HIEROGLYPH G030;Lo;0;L;;;;;N;;;;; +13163;EGYPTIAN HIEROGLYPH G031;Lo;0;L;;;;;N;;;;; +13164;EGYPTIAN HIEROGLYPH G032;Lo;0;L;;;;;N;;;;; +13165;EGYPTIAN HIEROGLYPH G033;Lo;0;L;;;;;N;;;;; +13166;EGYPTIAN HIEROGLYPH G034;Lo;0;L;;;;;N;;;;; +13167;EGYPTIAN HIEROGLYPH G035;Lo;0;L;;;;;N;;;;; +13168;EGYPTIAN HIEROGLYPH G036;Lo;0;L;;;;;N;;;;; +13169;EGYPTIAN HIEROGLYPH G036A;Lo;0;L;;;;;N;;;;; +1316A;EGYPTIAN HIEROGLYPH G037;Lo;0;L;;;;;N;;;;; +1316B;EGYPTIAN HIEROGLYPH G037A;Lo;0;L;;;;;N;;;;; +1316C;EGYPTIAN HIEROGLYPH G038;Lo;0;L;;;;;N;;;;; +1316D;EGYPTIAN HIEROGLYPH G039;Lo;0;L;;;;;N;;;;; +1316E;EGYPTIAN HIEROGLYPH G040;Lo;0;L;;;;;N;;;;; +1316F;EGYPTIAN HIEROGLYPH G041;Lo;0;L;;;;;N;;;;; +13170;EGYPTIAN HIEROGLYPH G042;Lo;0;L;;;;;N;;;;; +13171;EGYPTIAN HIEROGLYPH G043;Lo;0;L;;;;;N;;;;; +13172;EGYPTIAN HIEROGLYPH G043A;Lo;0;L;;;;;N;;;;; +13173;EGYPTIAN HIEROGLYPH G044;Lo;0;L;;;;;N;;;;; +13174;EGYPTIAN HIEROGLYPH G045;Lo;0;L;;;;;N;;;;; +13175;EGYPTIAN HIEROGLYPH G045A;Lo;0;L;;;;;N;;;;; +13176;EGYPTIAN HIEROGLYPH G046;Lo;0;L;;;;;N;;;;; +13177;EGYPTIAN HIEROGLYPH G047;Lo;0;L;;;;;N;;;;; +13178;EGYPTIAN HIEROGLYPH G048;Lo;0;L;;;;;N;;;;; +13179;EGYPTIAN HIEROGLYPH G049;Lo;0;L;;;;;N;;;;; +1317A;EGYPTIAN HIEROGLYPH G050;Lo;0;L;;;;;N;;;;; +1317B;EGYPTIAN HIEROGLYPH G051;Lo;0;L;;;;;N;;;;; +1317C;EGYPTIAN HIEROGLYPH G052;Lo;0;L;;;;;N;;;;; +1317D;EGYPTIAN HIEROGLYPH G053;Lo;0;L;;;;;N;;;;; +1317E;EGYPTIAN HIEROGLYPH G054;Lo;0;L;;;;;N;;;;; +1317F;EGYPTIAN HIEROGLYPH H001;Lo;0;L;;;;;N;;;;; +13180;EGYPTIAN HIEROGLYPH H002;Lo;0;L;;;;;N;;;;; +13181;EGYPTIAN HIEROGLYPH H003;Lo;0;L;;;;;N;;;;; +13182;EGYPTIAN HIEROGLYPH H004;Lo;0;L;;;;;N;;;;; +13183;EGYPTIAN HIEROGLYPH H005;Lo;0;L;;;;;N;;;;; +13184;EGYPTIAN HIEROGLYPH H006;Lo;0;L;;;;;N;;;;; +13185;EGYPTIAN HIEROGLYPH H006A;Lo;0;L;;;;;N;;;;; +13186;EGYPTIAN HIEROGLYPH H007;Lo;0;L;;;;;N;;;;; +13187;EGYPTIAN HIEROGLYPH H008;Lo;0;L;;;;;N;;;;; +13188;EGYPTIAN HIEROGLYPH I001;Lo;0;L;;;;;N;;;;; +13189;EGYPTIAN HIEROGLYPH I002;Lo;0;L;;;;;N;;;;; +1318A;EGYPTIAN HIEROGLYPH I003;Lo;0;L;;;;;N;;;;; +1318B;EGYPTIAN HIEROGLYPH I004;Lo;0;L;;;;;N;;;;; +1318C;EGYPTIAN HIEROGLYPH I005;Lo;0;L;;;;;N;;;;; +1318D;EGYPTIAN HIEROGLYPH I005A;Lo;0;L;;;;;N;;;;; +1318E;EGYPTIAN HIEROGLYPH I006;Lo;0;L;;;;;N;;;;; +1318F;EGYPTIAN HIEROGLYPH I007;Lo;0;L;;;;;N;;;;; +13190;EGYPTIAN HIEROGLYPH I008;Lo;0;L;;;;;N;;;;; +13191;EGYPTIAN HIEROGLYPH I009;Lo;0;L;;;;;N;;;;; +13192;EGYPTIAN HIEROGLYPH I009A;Lo;0;L;;;;;N;;;;; +13193;EGYPTIAN HIEROGLYPH I010;Lo;0;L;;;;;N;;;;; +13194;EGYPTIAN HIEROGLYPH I010A;Lo;0;L;;;;;N;;;;; +13195;EGYPTIAN HIEROGLYPH I011;Lo;0;L;;;;;N;;;;; +13196;EGYPTIAN HIEROGLYPH I011A;Lo;0;L;;;;;N;;;;; +13197;EGYPTIAN HIEROGLYPH I012;Lo;0;L;;;;;N;;;;; +13198;EGYPTIAN HIEROGLYPH I013;Lo;0;L;;;;;N;;;;; +13199;EGYPTIAN HIEROGLYPH I014;Lo;0;L;;;;;N;;;;; +1319A;EGYPTIAN HIEROGLYPH I015;Lo;0;L;;;;;N;;;;; +1319B;EGYPTIAN HIEROGLYPH K001;Lo;0;L;;;;;N;;;;; +1319C;EGYPTIAN HIEROGLYPH K002;Lo;0;L;;;;;N;;;;; +1319D;EGYPTIAN HIEROGLYPH K003;Lo;0;L;;;;;N;;;;; +1319E;EGYPTIAN HIEROGLYPH K004;Lo;0;L;;;;;N;;;;; +1319F;EGYPTIAN HIEROGLYPH K005;Lo;0;L;;;;;N;;;;; +131A0;EGYPTIAN HIEROGLYPH K006;Lo;0;L;;;;;N;;;;; +131A1;EGYPTIAN HIEROGLYPH K007;Lo;0;L;;;;;N;;;;; +131A2;EGYPTIAN HIEROGLYPH K008;Lo;0;L;;;;;N;;;;; +131A3;EGYPTIAN HIEROGLYPH L001;Lo;0;L;;;;;N;;;;; +131A4;EGYPTIAN HIEROGLYPH L002;Lo;0;L;;;;;N;;;;; +131A5;EGYPTIAN HIEROGLYPH L002A;Lo;0;L;;;;;N;;;;; +131A6;EGYPTIAN HIEROGLYPH L003;Lo;0;L;;;;;N;;;;; +131A7;EGYPTIAN HIEROGLYPH L004;Lo;0;L;;;;;N;;;;; +131A8;EGYPTIAN HIEROGLYPH L005;Lo;0;L;;;;;N;;;;; +131A9;EGYPTIAN HIEROGLYPH L006;Lo;0;L;;;;;N;;;;; +131AA;EGYPTIAN HIEROGLYPH L006A;Lo;0;L;;;;;N;;;;; +131AB;EGYPTIAN HIEROGLYPH L007;Lo;0;L;;;;;N;;;;; +131AC;EGYPTIAN HIEROGLYPH L008;Lo;0;L;;;;;N;;;;; +131AD;EGYPTIAN HIEROGLYPH M001;Lo;0;L;;;;;N;;;;; +131AE;EGYPTIAN HIEROGLYPH M001A;Lo;0;L;;;;;N;;;;; +131AF;EGYPTIAN HIEROGLYPH M001B;Lo;0;L;;;;;N;;;;; +131B0;EGYPTIAN HIEROGLYPH M002;Lo;0;L;;;;;N;;;;; +131B1;EGYPTIAN HIEROGLYPH M003;Lo;0;L;;;;;N;;;;; +131B2;EGYPTIAN HIEROGLYPH M003A;Lo;0;L;;;;;N;;;;; +131B3;EGYPTIAN HIEROGLYPH M004;Lo;0;L;;;;;N;;;;; +131B4;EGYPTIAN HIEROGLYPH M005;Lo;0;L;;;;;N;;;;; +131B5;EGYPTIAN HIEROGLYPH M006;Lo;0;L;;;;;N;;;;; +131B6;EGYPTIAN HIEROGLYPH M007;Lo;0;L;;;;;N;;;;; +131B7;EGYPTIAN HIEROGLYPH M008;Lo;0;L;;;;;N;;;;; +131B8;EGYPTIAN HIEROGLYPH M009;Lo;0;L;;;;;N;;;;; +131B9;EGYPTIAN HIEROGLYPH M010;Lo;0;L;;;;;N;;;;; +131BA;EGYPTIAN HIEROGLYPH M010A;Lo;0;L;;;;;N;;;;; +131BB;EGYPTIAN HIEROGLYPH M011;Lo;0;L;;;;;N;;;;; +131BC;EGYPTIAN HIEROGLYPH M012;Lo;0;L;;;;;N;;;;; +131BD;EGYPTIAN HIEROGLYPH M012A;Lo;0;L;;;;;N;;;;; +131BE;EGYPTIAN HIEROGLYPH M012B;Lo;0;L;;;;;N;;;;; +131BF;EGYPTIAN HIEROGLYPH M012C;Lo;0;L;;;;;N;;;;; +131C0;EGYPTIAN HIEROGLYPH M012D;Lo;0;L;;;;;N;;;;; +131C1;EGYPTIAN HIEROGLYPH M012E;Lo;0;L;;;;;N;;;;; +131C2;EGYPTIAN HIEROGLYPH M012F;Lo;0;L;;;;;N;;;;; +131C3;EGYPTIAN HIEROGLYPH M012G;Lo;0;L;;;;;N;;;;; +131C4;EGYPTIAN HIEROGLYPH M012H;Lo;0;L;;;;;N;;;;; +131C5;EGYPTIAN HIEROGLYPH M013;Lo;0;L;;;;;N;;;;; +131C6;EGYPTIAN HIEROGLYPH M014;Lo;0;L;;;;;N;;;;; +131C7;EGYPTIAN HIEROGLYPH M015;Lo;0;L;;;;;N;;;;; +131C8;EGYPTIAN HIEROGLYPH M015A;Lo;0;L;;;;;N;;;;; +131C9;EGYPTIAN HIEROGLYPH M016;Lo;0;L;;;;;N;;;;; +131CA;EGYPTIAN HIEROGLYPH M016A;Lo;0;L;;;;;N;;;;; +131CB;EGYPTIAN HIEROGLYPH M017;Lo;0;L;;;;;N;;;;; +131CC;EGYPTIAN HIEROGLYPH M017A;Lo;0;L;;;;;N;;;;; +131CD;EGYPTIAN HIEROGLYPH M018;Lo;0;L;;;;;N;;;;; +131CE;EGYPTIAN HIEROGLYPH M019;Lo;0;L;;;;;N;;;;; +131CF;EGYPTIAN HIEROGLYPH M020;Lo;0;L;;;;;N;;;;; +131D0;EGYPTIAN HIEROGLYPH M021;Lo;0;L;;;;;N;;;;; +131D1;EGYPTIAN HIEROGLYPH M022;Lo;0;L;;;;;N;;;;; +131D2;EGYPTIAN HIEROGLYPH M022A;Lo;0;L;;;;;N;;;;; +131D3;EGYPTIAN HIEROGLYPH M023;Lo;0;L;;;;;N;;;;; +131D4;EGYPTIAN HIEROGLYPH M024;Lo;0;L;;;;;N;;;;; +131D5;EGYPTIAN HIEROGLYPH M024A;Lo;0;L;;;;;N;;;;; +131D6;EGYPTIAN HIEROGLYPH M025;Lo;0;L;;;;;N;;;;; +131D7;EGYPTIAN HIEROGLYPH M026;Lo;0;L;;;;;N;;;;; +131D8;EGYPTIAN HIEROGLYPH M027;Lo;0;L;;;;;N;;;;; +131D9;EGYPTIAN HIEROGLYPH M028;Lo;0;L;;;;;N;;;;; +131DA;EGYPTIAN HIEROGLYPH M028A;Lo;0;L;;;;;N;;;;; +131DB;EGYPTIAN HIEROGLYPH M029;Lo;0;L;;;;;N;;;;; +131DC;EGYPTIAN HIEROGLYPH M030;Lo;0;L;;;;;N;;;;; +131DD;EGYPTIAN HIEROGLYPH M031;Lo;0;L;;;;;N;;;;; +131DE;EGYPTIAN HIEROGLYPH M031A;Lo;0;L;;;;;N;;;;; +131DF;EGYPTIAN HIEROGLYPH M032;Lo;0;L;;;;;N;;;;; +131E0;EGYPTIAN HIEROGLYPH M033;Lo;0;L;;;;;N;;;;; +131E1;EGYPTIAN HIEROGLYPH M033A;Lo;0;L;;;;;N;;;;; +131E2;EGYPTIAN HIEROGLYPH M033B;Lo;0;L;;;;;N;;;;; +131E3;EGYPTIAN HIEROGLYPH M034;Lo;0;L;;;;;N;;;;; +131E4;EGYPTIAN HIEROGLYPH M035;Lo;0;L;;;;;N;;;;; +131E5;EGYPTIAN HIEROGLYPH M036;Lo;0;L;;;;;N;;;;; +131E6;EGYPTIAN HIEROGLYPH M037;Lo;0;L;;;;;N;;;;; +131E7;EGYPTIAN HIEROGLYPH M038;Lo;0;L;;;;;N;;;;; +131E8;EGYPTIAN HIEROGLYPH M039;Lo;0;L;;;;;N;;;;; +131E9;EGYPTIAN HIEROGLYPH M040;Lo;0;L;;;;;N;;;;; +131EA;EGYPTIAN HIEROGLYPH M040A;Lo;0;L;;;;;N;;;;; +131EB;EGYPTIAN HIEROGLYPH M041;Lo;0;L;;;;;N;;;;; +131EC;EGYPTIAN HIEROGLYPH M042;Lo;0;L;;;;;N;;;;; +131ED;EGYPTIAN HIEROGLYPH M043;Lo;0;L;;;;;N;;;;; +131EE;EGYPTIAN HIEROGLYPH M044;Lo;0;L;;;;;N;;;;; +131EF;EGYPTIAN HIEROGLYPH N001;Lo;0;L;;;;;N;;;;; +131F0;EGYPTIAN HIEROGLYPH N002;Lo;0;L;;;;;N;;;;; +131F1;EGYPTIAN HIEROGLYPH N003;Lo;0;L;;;;;N;;;;; +131F2;EGYPTIAN HIEROGLYPH N004;Lo;0;L;;;;;N;;;;; +131F3;EGYPTIAN HIEROGLYPH N005;Lo;0;L;;;;;N;;;;; +131F4;EGYPTIAN HIEROGLYPH N006;Lo;0;L;;;;;N;;;;; +131F5;EGYPTIAN HIEROGLYPH N007;Lo;0;L;;;;;N;;;;; +131F6;EGYPTIAN HIEROGLYPH N008;Lo;0;L;;;;;N;;;;; +131F7;EGYPTIAN HIEROGLYPH N009;Lo;0;L;;;;;N;;;;; +131F8;EGYPTIAN HIEROGLYPH N010;Lo;0;L;;;;;N;;;;; +131F9;EGYPTIAN HIEROGLYPH N011;Lo;0;L;;;;;N;;;;; +131FA;EGYPTIAN HIEROGLYPH N012;Lo;0;L;;;;;N;;;;; +131FB;EGYPTIAN HIEROGLYPH N013;Lo;0;L;;;;;N;;;;; +131FC;EGYPTIAN HIEROGLYPH N014;Lo;0;L;;;;;N;;;;; +131FD;EGYPTIAN HIEROGLYPH N015;Lo;0;L;;;;;N;;;;; +131FE;EGYPTIAN HIEROGLYPH N016;Lo;0;L;;;;;N;;;;; +131FF;EGYPTIAN HIEROGLYPH N017;Lo;0;L;;;;;N;;;;; +13200;EGYPTIAN HIEROGLYPH N018;Lo;0;L;;;;;N;;;;; +13201;EGYPTIAN HIEROGLYPH N018A;Lo;0;L;;;;;N;;;;; +13202;EGYPTIAN HIEROGLYPH N018B;Lo;0;L;;;;;N;;;;; +13203;EGYPTIAN HIEROGLYPH N019;Lo;0;L;;;;;N;;;;; +13204;EGYPTIAN HIEROGLYPH N020;Lo;0;L;;;;;N;;;;; +13205;EGYPTIAN HIEROGLYPH N021;Lo;0;L;;;;;N;;;;; +13206;EGYPTIAN HIEROGLYPH N022;Lo;0;L;;;;;N;;;;; +13207;EGYPTIAN HIEROGLYPH N023;Lo;0;L;;;;;N;;;;; +13208;EGYPTIAN HIEROGLYPH N024;Lo;0;L;;;;;N;;;;; +13209;EGYPTIAN HIEROGLYPH N025;Lo;0;L;;;;;N;;;;; +1320A;EGYPTIAN HIEROGLYPH N025A;Lo;0;L;;;;;N;;;;; +1320B;EGYPTIAN HIEROGLYPH N026;Lo;0;L;;;;;N;;;;; +1320C;EGYPTIAN HIEROGLYPH N027;Lo;0;L;;;;;N;;;;; +1320D;EGYPTIAN HIEROGLYPH N028;Lo;0;L;;;;;N;;;;; +1320E;EGYPTIAN HIEROGLYPH N029;Lo;0;L;;;;;N;;;;; +1320F;EGYPTIAN HIEROGLYPH N030;Lo;0;L;;;;;N;;;;; +13210;EGYPTIAN HIEROGLYPH N031;Lo;0;L;;;;;N;;;;; +13211;EGYPTIAN HIEROGLYPH N032;Lo;0;L;;;;;N;;;;; +13212;EGYPTIAN HIEROGLYPH N033;Lo;0;L;;;;;N;;;;; +13213;EGYPTIAN HIEROGLYPH N033A;Lo;0;L;;;;;N;;;;; +13214;EGYPTIAN HIEROGLYPH N034;Lo;0;L;;;;;N;;;;; +13215;EGYPTIAN HIEROGLYPH N034A;Lo;0;L;;;;;N;;;;; +13216;EGYPTIAN HIEROGLYPH N035;Lo;0;L;;;;;N;;;;; +13217;EGYPTIAN HIEROGLYPH N035A;Lo;0;L;;;;;N;;;;; +13218;EGYPTIAN HIEROGLYPH N036;Lo;0;L;;;;;N;;;;; +13219;EGYPTIAN HIEROGLYPH N037;Lo;0;L;;;;;N;;;;; +1321A;EGYPTIAN HIEROGLYPH N037A;Lo;0;L;;;;;N;;;;; +1321B;EGYPTIAN HIEROGLYPH N038;Lo;0;L;;;;;N;;;;; +1321C;EGYPTIAN HIEROGLYPH N039;Lo;0;L;;;;;N;;;;; +1321D;EGYPTIAN HIEROGLYPH N040;Lo;0;L;;;;;N;;;;; +1321E;EGYPTIAN HIEROGLYPH N041;Lo;0;L;;;;;N;;;;; +1321F;EGYPTIAN HIEROGLYPH N042;Lo;0;L;;;;;N;;;;; +13220;EGYPTIAN HIEROGLYPH NL001;Lo;0;L;;;;;N;;;;; +13221;EGYPTIAN HIEROGLYPH NL002;Lo;0;L;;;;;N;;;;; +13222;EGYPTIAN HIEROGLYPH NL003;Lo;0;L;;;;;N;;;;; +13223;EGYPTIAN HIEROGLYPH NL004;Lo;0;L;;;;;N;;;;; +13224;EGYPTIAN HIEROGLYPH NL005;Lo;0;L;;;;;N;;;;; +13225;EGYPTIAN HIEROGLYPH NL005A;Lo;0;L;;;;;N;;;;; +13226;EGYPTIAN HIEROGLYPH NL006;Lo;0;L;;;;;N;;;;; +13227;EGYPTIAN HIEROGLYPH NL007;Lo;0;L;;;;;N;;;;; +13228;EGYPTIAN HIEROGLYPH NL008;Lo;0;L;;;;;N;;;;; +13229;EGYPTIAN HIEROGLYPH NL009;Lo;0;L;;;;;N;;;;; +1322A;EGYPTIAN HIEROGLYPH NL010;Lo;0;L;;;;;N;;;;; +1322B;EGYPTIAN HIEROGLYPH NL011;Lo;0;L;;;;;N;;;;; +1322C;EGYPTIAN HIEROGLYPH NL012;Lo;0;L;;;;;N;;;;; +1322D;EGYPTIAN HIEROGLYPH NL013;Lo;0;L;;;;;N;;;;; +1322E;EGYPTIAN HIEROGLYPH NL014;Lo;0;L;;;;;N;;;;; +1322F;EGYPTIAN HIEROGLYPH NL015;Lo;0;L;;;;;N;;;;; +13230;EGYPTIAN HIEROGLYPH NL016;Lo;0;L;;;;;N;;;;; +13231;EGYPTIAN HIEROGLYPH NL017;Lo;0;L;;;;;N;;;;; +13232;EGYPTIAN HIEROGLYPH NL017A;Lo;0;L;;;;;N;;;;; +13233;EGYPTIAN HIEROGLYPH NL018;Lo;0;L;;;;;N;;;;; +13234;EGYPTIAN HIEROGLYPH NL019;Lo;0;L;;;;;N;;;;; +13235;EGYPTIAN HIEROGLYPH NL020;Lo;0;L;;;;;N;;;;; +13236;EGYPTIAN HIEROGLYPH NU001;Lo;0;L;;;;;N;;;;; +13237;EGYPTIAN HIEROGLYPH NU002;Lo;0;L;;;;;N;;;;; +13238;EGYPTIAN HIEROGLYPH NU003;Lo;0;L;;;;;N;;;;; +13239;EGYPTIAN HIEROGLYPH NU004;Lo;0;L;;;;;N;;;;; +1323A;EGYPTIAN HIEROGLYPH NU005;Lo;0;L;;;;;N;;;;; +1323B;EGYPTIAN HIEROGLYPH NU006;Lo;0;L;;;;;N;;;;; +1323C;EGYPTIAN HIEROGLYPH NU007;Lo;0;L;;;;;N;;;;; +1323D;EGYPTIAN HIEROGLYPH NU008;Lo;0;L;;;;;N;;;;; +1323E;EGYPTIAN HIEROGLYPH NU009;Lo;0;L;;;;;N;;;;; +1323F;EGYPTIAN HIEROGLYPH NU010;Lo;0;L;;;;;N;;;;; +13240;EGYPTIAN HIEROGLYPH NU010A;Lo;0;L;;;;;N;;;;; +13241;EGYPTIAN HIEROGLYPH NU011;Lo;0;L;;;;;N;;;;; +13242;EGYPTIAN HIEROGLYPH NU011A;Lo;0;L;;;;;N;;;;; +13243;EGYPTIAN HIEROGLYPH NU012;Lo;0;L;;;;;N;;;;; +13244;EGYPTIAN HIEROGLYPH NU013;Lo;0;L;;;;;N;;;;; +13245;EGYPTIAN HIEROGLYPH NU014;Lo;0;L;;;;;N;;;;; +13246;EGYPTIAN HIEROGLYPH NU015;Lo;0;L;;;;;N;;;;; +13247;EGYPTIAN HIEROGLYPH NU016;Lo;0;L;;;;;N;;;;; +13248;EGYPTIAN HIEROGLYPH NU017;Lo;0;L;;;;;N;;;;; +13249;EGYPTIAN HIEROGLYPH NU018;Lo;0;L;;;;;N;;;;; +1324A;EGYPTIAN HIEROGLYPH NU018A;Lo;0;L;;;;;N;;;;; +1324B;EGYPTIAN HIEROGLYPH NU019;Lo;0;L;;;;;N;;;;; +1324C;EGYPTIAN HIEROGLYPH NU020;Lo;0;L;;;;;N;;;;; +1324D;EGYPTIAN HIEROGLYPH NU021;Lo;0;L;;;;;N;;;;; +1324E;EGYPTIAN HIEROGLYPH NU022;Lo;0;L;;;;;N;;;;; +1324F;EGYPTIAN HIEROGLYPH NU022A;Lo;0;L;;;;;N;;;;; +13250;EGYPTIAN HIEROGLYPH O001;Lo;0;L;;;;;N;;;;; +13251;EGYPTIAN HIEROGLYPH O001A;Lo;0;L;;;;;N;;;;; +13252;EGYPTIAN HIEROGLYPH O002;Lo;0;L;;;;;N;;;;; +13253;EGYPTIAN HIEROGLYPH O003;Lo;0;L;;;;;N;;;;; +13254;EGYPTIAN HIEROGLYPH O004;Lo;0;L;;;;;N;;;;; +13255;EGYPTIAN HIEROGLYPH O005;Lo;0;L;;;;;N;;;;; +13256;EGYPTIAN HIEROGLYPH O005A;Lo;0;L;;;;;N;;;;; +13257;EGYPTIAN HIEROGLYPH O006;Lo;0;L;;;;;N;;;;; +13258;EGYPTIAN HIEROGLYPH O006A;Lo;0;L;;;;;N;;;;; +13259;EGYPTIAN HIEROGLYPH O006B;Lo;0;L;;;;;N;;;;; +1325A;EGYPTIAN HIEROGLYPH O006C;Lo;0;L;;;;;N;;;;; +1325B;EGYPTIAN HIEROGLYPH O006D;Lo;0;L;;;;;N;;;;; +1325C;EGYPTIAN HIEROGLYPH O006E;Lo;0;L;;;;;N;;;;; +1325D;EGYPTIAN HIEROGLYPH O006F;Lo;0;L;;;;;N;;;;; +1325E;EGYPTIAN HIEROGLYPH O007;Lo;0;L;;;;;N;;;;; +1325F;EGYPTIAN HIEROGLYPH O008;Lo;0;L;;;;;N;;;;; +13260;EGYPTIAN HIEROGLYPH O009;Lo;0;L;;;;;N;;;;; +13261;EGYPTIAN HIEROGLYPH O010;Lo;0;L;;;;;N;;;;; +13262;EGYPTIAN HIEROGLYPH O010A;Lo;0;L;;;;;N;;;;; +13263;EGYPTIAN HIEROGLYPH O010B;Lo;0;L;;;;;N;;;;; +13264;EGYPTIAN HIEROGLYPH O010C;Lo;0;L;;;;;N;;;;; +13265;EGYPTIAN HIEROGLYPH O011;Lo;0;L;;;;;N;;;;; +13266;EGYPTIAN HIEROGLYPH O012;Lo;0;L;;;;;N;;;;; +13267;EGYPTIAN HIEROGLYPH O013;Lo;0;L;;;;;N;;;;; +13268;EGYPTIAN HIEROGLYPH O014;Lo;0;L;;;;;N;;;;; +13269;EGYPTIAN HIEROGLYPH O015;Lo;0;L;;;;;N;;;;; +1326A;EGYPTIAN HIEROGLYPH O016;Lo;0;L;;;;;N;;;;; +1326B;EGYPTIAN HIEROGLYPH O017;Lo;0;L;;;;;N;;;;; +1326C;EGYPTIAN HIEROGLYPH O018;Lo;0;L;;;;;N;;;;; +1326D;EGYPTIAN HIEROGLYPH O019;Lo;0;L;;;;;N;;;;; +1326E;EGYPTIAN HIEROGLYPH O019A;Lo;0;L;;;;;N;;;;; +1326F;EGYPTIAN HIEROGLYPH O020;Lo;0;L;;;;;N;;;;; +13270;EGYPTIAN HIEROGLYPH O020A;Lo;0;L;;;;;N;;;;; +13271;EGYPTIAN HIEROGLYPH O021;Lo;0;L;;;;;N;;;;; +13272;EGYPTIAN HIEROGLYPH O022;Lo;0;L;;;;;N;;;;; +13273;EGYPTIAN HIEROGLYPH O023;Lo;0;L;;;;;N;;;;; +13274;EGYPTIAN HIEROGLYPH O024;Lo;0;L;;;;;N;;;;; +13275;EGYPTIAN HIEROGLYPH O024A;Lo;0;L;;;;;N;;;;; +13276;EGYPTIAN HIEROGLYPH O025;Lo;0;L;;;;;N;;;;; +13277;EGYPTIAN HIEROGLYPH O025A;Lo;0;L;;;;;N;;;;; +13278;EGYPTIAN HIEROGLYPH O026;Lo;0;L;;;;;N;;;;; +13279;EGYPTIAN HIEROGLYPH O027;Lo;0;L;;;;;N;;;;; +1327A;EGYPTIAN HIEROGLYPH O028;Lo;0;L;;;;;N;;;;; +1327B;EGYPTIAN HIEROGLYPH O029;Lo;0;L;;;;;N;;;;; +1327C;EGYPTIAN HIEROGLYPH O029A;Lo;0;L;;;;;N;;;;; +1327D;EGYPTIAN HIEROGLYPH O030;Lo;0;L;;;;;N;;;;; +1327E;EGYPTIAN HIEROGLYPH O030A;Lo;0;L;;;;;N;;;;; +1327F;EGYPTIAN HIEROGLYPH O031;Lo;0;L;;;;;N;;;;; +13280;EGYPTIAN HIEROGLYPH O032;Lo;0;L;;;;;N;;;;; +13281;EGYPTIAN HIEROGLYPH O033;Lo;0;L;;;;;N;;;;; +13282;EGYPTIAN HIEROGLYPH O033A;Lo;0;L;;;;;N;;;;; +13283;EGYPTIAN HIEROGLYPH O034;Lo;0;L;;;;;N;;;;; +13284;EGYPTIAN HIEROGLYPH O035;Lo;0;L;;;;;N;;;;; +13285;EGYPTIAN HIEROGLYPH O036;Lo;0;L;;;;;N;;;;; +13286;EGYPTIAN HIEROGLYPH O036A;Lo;0;L;;;;;N;;;;; +13287;EGYPTIAN HIEROGLYPH O036B;Lo;0;L;;;;;N;;;;; +13288;EGYPTIAN HIEROGLYPH O036C;Lo;0;L;;;;;N;;;;; +13289;EGYPTIAN HIEROGLYPH O036D;Lo;0;L;;;;;N;;;;; +1328A;EGYPTIAN HIEROGLYPH O037;Lo;0;L;;;;;N;;;;; +1328B;EGYPTIAN HIEROGLYPH O038;Lo;0;L;;;;;N;;;;; +1328C;EGYPTIAN HIEROGLYPH O039;Lo;0;L;;;;;N;;;;; +1328D;EGYPTIAN HIEROGLYPH O040;Lo;0;L;;;;;N;;;;; +1328E;EGYPTIAN HIEROGLYPH O041;Lo;0;L;;;;;N;;;;; +1328F;EGYPTIAN HIEROGLYPH O042;Lo;0;L;;;;;N;;;;; +13290;EGYPTIAN HIEROGLYPH O043;Lo;0;L;;;;;N;;;;; +13291;EGYPTIAN HIEROGLYPH O044;Lo;0;L;;;;;N;;;;; +13292;EGYPTIAN HIEROGLYPH O045;Lo;0;L;;;;;N;;;;; +13293;EGYPTIAN HIEROGLYPH O046;Lo;0;L;;;;;N;;;;; +13294;EGYPTIAN HIEROGLYPH O047;Lo;0;L;;;;;N;;;;; +13295;EGYPTIAN HIEROGLYPH O048;Lo;0;L;;;;;N;;;;; +13296;EGYPTIAN HIEROGLYPH O049;Lo;0;L;;;;;N;;;;; +13297;EGYPTIAN HIEROGLYPH O050;Lo;0;L;;;;;N;;;;; +13298;EGYPTIAN HIEROGLYPH O050A;Lo;0;L;;;;;N;;;;; +13299;EGYPTIAN HIEROGLYPH O050B;Lo;0;L;;;;;N;;;;; +1329A;EGYPTIAN HIEROGLYPH O051;Lo;0;L;;;;;N;;;;; +1329B;EGYPTIAN HIEROGLYPH P001;Lo;0;L;;;;;N;;;;; +1329C;EGYPTIAN HIEROGLYPH P001A;Lo;0;L;;;;;N;;;;; +1329D;EGYPTIAN HIEROGLYPH P002;Lo;0;L;;;;;N;;;;; +1329E;EGYPTIAN HIEROGLYPH P003;Lo;0;L;;;;;N;;;;; +1329F;EGYPTIAN HIEROGLYPH P003A;Lo;0;L;;;;;N;;;;; +132A0;EGYPTIAN HIEROGLYPH P004;Lo;0;L;;;;;N;;;;; +132A1;EGYPTIAN HIEROGLYPH P005;Lo;0;L;;;;;N;;;;; +132A2;EGYPTIAN HIEROGLYPH P006;Lo;0;L;;;;;N;;;;; +132A3;EGYPTIAN HIEROGLYPH P007;Lo;0;L;;;;;N;;;;; +132A4;EGYPTIAN HIEROGLYPH P008;Lo;0;L;;;;;N;;;;; +132A5;EGYPTIAN HIEROGLYPH P009;Lo;0;L;;;;;N;;;;; +132A6;EGYPTIAN HIEROGLYPH P010;Lo;0;L;;;;;N;;;;; +132A7;EGYPTIAN HIEROGLYPH P011;Lo;0;L;;;;;N;;;;; +132A8;EGYPTIAN HIEROGLYPH Q001;Lo;0;L;;;;;N;;;;; +132A9;EGYPTIAN HIEROGLYPH Q002;Lo;0;L;;;;;N;;;;; +132AA;EGYPTIAN HIEROGLYPH Q003;Lo;0;L;;;;;N;;;;; +132AB;EGYPTIAN HIEROGLYPH Q004;Lo;0;L;;;;;N;;;;; +132AC;EGYPTIAN HIEROGLYPH Q005;Lo;0;L;;;;;N;;;;; +132AD;EGYPTIAN HIEROGLYPH Q006;Lo;0;L;;;;;N;;;;; +132AE;EGYPTIAN HIEROGLYPH Q007;Lo;0;L;;;;;N;;;;; +132AF;EGYPTIAN HIEROGLYPH R001;Lo;0;L;;;;;N;;;;; +132B0;EGYPTIAN HIEROGLYPH R002;Lo;0;L;;;;;N;;;;; +132B1;EGYPTIAN HIEROGLYPH R002A;Lo;0;L;;;;;N;;;;; +132B2;EGYPTIAN HIEROGLYPH R003;Lo;0;L;;;;;N;;;;; +132B3;EGYPTIAN HIEROGLYPH R003A;Lo;0;L;;;;;N;;;;; +132B4;EGYPTIAN HIEROGLYPH R003B;Lo;0;L;;;;;N;;;;; +132B5;EGYPTIAN HIEROGLYPH R004;Lo;0;L;;;;;N;;;;; +132B6;EGYPTIAN HIEROGLYPH R005;Lo;0;L;;;;;N;;;;; +132B7;EGYPTIAN HIEROGLYPH R006;Lo;0;L;;;;;N;;;;; +132B8;EGYPTIAN HIEROGLYPH R007;Lo;0;L;;;;;N;;;;; +132B9;EGYPTIAN HIEROGLYPH R008;Lo;0;L;;;;;N;;;;; +132BA;EGYPTIAN HIEROGLYPH R009;Lo;0;L;;;;;N;;;;; +132BB;EGYPTIAN HIEROGLYPH R010;Lo;0;L;;;;;N;;;;; +132BC;EGYPTIAN HIEROGLYPH R010A;Lo;0;L;;;;;N;;;;; +132BD;EGYPTIAN HIEROGLYPH R011;Lo;0;L;;;;;N;;;;; +132BE;EGYPTIAN HIEROGLYPH R012;Lo;0;L;;;;;N;;;;; +132BF;EGYPTIAN HIEROGLYPH R013;Lo;0;L;;;;;N;;;;; +132C0;EGYPTIAN HIEROGLYPH R014;Lo;0;L;;;;;N;;;;; +132C1;EGYPTIAN HIEROGLYPH R015;Lo;0;L;;;;;N;;;;; +132C2;EGYPTIAN HIEROGLYPH R016;Lo;0;L;;;;;N;;;;; +132C3;EGYPTIAN HIEROGLYPH R016A;Lo;0;L;;;;;N;;;;; +132C4;EGYPTIAN HIEROGLYPH R017;Lo;0;L;;;;;N;;;;; +132C5;EGYPTIAN HIEROGLYPH R018;Lo;0;L;;;;;N;;;;; +132C6;EGYPTIAN HIEROGLYPH R019;Lo;0;L;;;;;N;;;;; +132C7;EGYPTIAN HIEROGLYPH R020;Lo;0;L;;;;;N;;;;; +132C8;EGYPTIAN HIEROGLYPH R021;Lo;0;L;;;;;N;;;;; +132C9;EGYPTIAN HIEROGLYPH R022;Lo;0;L;;;;;N;;;;; +132CA;EGYPTIAN HIEROGLYPH R023;Lo;0;L;;;;;N;;;;; +132CB;EGYPTIAN HIEROGLYPH R024;Lo;0;L;;;;;N;;;;; +132CC;EGYPTIAN HIEROGLYPH R025;Lo;0;L;;;;;N;;;;; +132CD;EGYPTIAN HIEROGLYPH R026;Lo;0;L;;;;;N;;;;; +132CE;EGYPTIAN HIEROGLYPH R027;Lo;0;L;;;;;N;;;;; +132CF;EGYPTIAN HIEROGLYPH R028;Lo;0;L;;;;;N;;;;; +132D0;EGYPTIAN HIEROGLYPH R029;Lo;0;L;;;;;N;;;;; +132D1;EGYPTIAN HIEROGLYPH S001;Lo;0;L;;;;;N;;;;; +132D2;EGYPTIAN HIEROGLYPH S002;Lo;0;L;;;;;N;;;;; +132D3;EGYPTIAN HIEROGLYPH S002A;Lo;0;L;;;;;N;;;;; +132D4;EGYPTIAN HIEROGLYPH S003;Lo;0;L;;;;;N;;;;; +132D5;EGYPTIAN HIEROGLYPH S004;Lo;0;L;;;;;N;;;;; +132D6;EGYPTIAN HIEROGLYPH S005;Lo;0;L;;;;;N;;;;; +132D7;EGYPTIAN HIEROGLYPH S006;Lo;0;L;;;;;N;;;;; +132D8;EGYPTIAN HIEROGLYPH S006A;Lo;0;L;;;;;N;;;;; +132D9;EGYPTIAN HIEROGLYPH S007;Lo;0;L;;;;;N;;;;; +132DA;EGYPTIAN HIEROGLYPH S008;Lo;0;L;;;;;N;;;;; +132DB;EGYPTIAN HIEROGLYPH S009;Lo;0;L;;;;;N;;;;; +132DC;EGYPTIAN HIEROGLYPH S010;Lo;0;L;;;;;N;;;;; +132DD;EGYPTIAN HIEROGLYPH S011;Lo;0;L;;;;;N;;;;; +132DE;EGYPTIAN HIEROGLYPH S012;Lo;0;L;;;;;N;;;;; +132DF;EGYPTIAN HIEROGLYPH S013;Lo;0;L;;;;;N;;;;; +132E0;EGYPTIAN HIEROGLYPH S014;Lo;0;L;;;;;N;;;;; +132E1;EGYPTIAN HIEROGLYPH S014A;Lo;0;L;;;;;N;;;;; +132E2;EGYPTIAN HIEROGLYPH S014B;Lo;0;L;;;;;N;;;;; +132E3;EGYPTIAN HIEROGLYPH S015;Lo;0;L;;;;;N;;;;; +132E4;EGYPTIAN HIEROGLYPH S016;Lo;0;L;;;;;N;;;;; +132E5;EGYPTIAN HIEROGLYPH S017;Lo;0;L;;;;;N;;;;; +132E6;EGYPTIAN HIEROGLYPH S017A;Lo;0;L;;;;;N;;;;; +132E7;EGYPTIAN HIEROGLYPH S018;Lo;0;L;;;;;N;;;;; +132E8;EGYPTIAN HIEROGLYPH S019;Lo;0;L;;;;;N;;;;; +132E9;EGYPTIAN HIEROGLYPH S020;Lo;0;L;;;;;N;;;;; +132EA;EGYPTIAN HIEROGLYPH S021;Lo;0;L;;;;;N;;;;; +132EB;EGYPTIAN HIEROGLYPH S022;Lo;0;L;;;;;N;;;;; +132EC;EGYPTIAN HIEROGLYPH S023;Lo;0;L;;;;;N;;;;; +132ED;EGYPTIAN HIEROGLYPH S024;Lo;0;L;;;;;N;;;;; +132EE;EGYPTIAN HIEROGLYPH S025;Lo;0;L;;;;;N;;;;; +132EF;EGYPTIAN HIEROGLYPH S026;Lo;0;L;;;;;N;;;;; +132F0;EGYPTIAN HIEROGLYPH S026A;Lo;0;L;;;;;N;;;;; +132F1;EGYPTIAN HIEROGLYPH S026B;Lo;0;L;;;;;N;;;;; +132F2;EGYPTIAN HIEROGLYPH S027;Lo;0;L;;;;;N;;;;; +132F3;EGYPTIAN HIEROGLYPH S028;Lo;0;L;;;;;N;;;;; +132F4;EGYPTIAN HIEROGLYPH S029;Lo;0;L;;;;;N;;;;; +132F5;EGYPTIAN HIEROGLYPH S030;Lo;0;L;;;;;N;;;;; +132F6;EGYPTIAN HIEROGLYPH S031;Lo;0;L;;;;;N;;;;; +132F7;EGYPTIAN HIEROGLYPH S032;Lo;0;L;;;;;N;;;;; +132F8;EGYPTIAN HIEROGLYPH S033;Lo;0;L;;;;;N;;;;; +132F9;EGYPTIAN HIEROGLYPH S034;Lo;0;L;;;;;N;;;;; +132FA;EGYPTIAN HIEROGLYPH S035;Lo;0;L;;;;;N;;;;; +132FB;EGYPTIAN HIEROGLYPH S035A;Lo;0;L;;;;;N;;;;; +132FC;EGYPTIAN HIEROGLYPH S036;Lo;0;L;;;;;N;;;;; +132FD;EGYPTIAN HIEROGLYPH S037;Lo;0;L;;;;;N;;;;; +132FE;EGYPTIAN HIEROGLYPH S038;Lo;0;L;;;;;N;;;;; +132FF;EGYPTIAN HIEROGLYPH S039;Lo;0;L;;;;;N;;;;; +13300;EGYPTIAN HIEROGLYPH S040;Lo;0;L;;;;;N;;;;; +13301;EGYPTIAN HIEROGLYPH S041;Lo;0;L;;;;;N;;;;; +13302;EGYPTIAN HIEROGLYPH S042;Lo;0;L;;;;;N;;;;; +13303;EGYPTIAN HIEROGLYPH S043;Lo;0;L;;;;;N;;;;; +13304;EGYPTIAN HIEROGLYPH S044;Lo;0;L;;;;;N;;;;; +13305;EGYPTIAN HIEROGLYPH S045;Lo;0;L;;;;;N;;;;; +13306;EGYPTIAN HIEROGLYPH S046;Lo;0;L;;;;;N;;;;; +13307;EGYPTIAN HIEROGLYPH T001;Lo;0;L;;;;;N;;;;; +13308;EGYPTIAN HIEROGLYPH T002;Lo;0;L;;;;;N;;;;; +13309;EGYPTIAN HIEROGLYPH T003;Lo;0;L;;;;;N;;;;; +1330A;EGYPTIAN HIEROGLYPH T003A;Lo;0;L;;;;;N;;;;; +1330B;EGYPTIAN HIEROGLYPH T004;Lo;0;L;;;;;N;;;;; +1330C;EGYPTIAN HIEROGLYPH T005;Lo;0;L;;;;;N;;;;; +1330D;EGYPTIAN HIEROGLYPH T006;Lo;0;L;;;;;N;;;;; +1330E;EGYPTIAN HIEROGLYPH T007;Lo;0;L;;;;;N;;;;; +1330F;EGYPTIAN HIEROGLYPH T007A;Lo;0;L;;;;;N;;;;; +13310;EGYPTIAN HIEROGLYPH T008;Lo;0;L;;;;;N;;;;; +13311;EGYPTIAN HIEROGLYPH T008A;Lo;0;L;;;;;N;;;;; +13312;EGYPTIAN HIEROGLYPH T009;Lo;0;L;;;;;N;;;;; +13313;EGYPTIAN HIEROGLYPH T009A;Lo;0;L;;;;;N;;;;; +13314;EGYPTIAN HIEROGLYPH T010;Lo;0;L;;;;;N;;;;; +13315;EGYPTIAN HIEROGLYPH T011;Lo;0;L;;;;;N;;;;; +13316;EGYPTIAN HIEROGLYPH T011A;Lo;0;L;;;;;N;;;;; +13317;EGYPTIAN HIEROGLYPH T012;Lo;0;L;;;;;N;;;;; +13318;EGYPTIAN HIEROGLYPH T013;Lo;0;L;;;;;N;;;;; +13319;EGYPTIAN HIEROGLYPH T014;Lo;0;L;;;;;N;;;;; +1331A;EGYPTIAN HIEROGLYPH T015;Lo;0;L;;;;;N;;;;; +1331B;EGYPTIAN HIEROGLYPH T016;Lo;0;L;;;;;N;;;;; +1331C;EGYPTIAN HIEROGLYPH T016A;Lo;0;L;;;;;N;;;;; +1331D;EGYPTIAN HIEROGLYPH T017;Lo;0;L;;;;;N;;;;; +1331E;EGYPTIAN HIEROGLYPH T018;Lo;0;L;;;;;N;;;;; +1331F;EGYPTIAN HIEROGLYPH T019;Lo;0;L;;;;;N;;;;; +13320;EGYPTIAN HIEROGLYPH T020;Lo;0;L;;;;;N;;;;; +13321;EGYPTIAN HIEROGLYPH T021;Lo;0;L;;;;;N;;;;; +13322;EGYPTIAN HIEROGLYPH T022;Lo;0;L;;;;;N;;;;; +13323;EGYPTIAN HIEROGLYPH T023;Lo;0;L;;;;;N;;;;; +13324;EGYPTIAN HIEROGLYPH T024;Lo;0;L;;;;;N;;;;; +13325;EGYPTIAN HIEROGLYPH T025;Lo;0;L;;;;;N;;;;; +13326;EGYPTIAN HIEROGLYPH T026;Lo;0;L;;;;;N;;;;; +13327;EGYPTIAN HIEROGLYPH T027;Lo;0;L;;;;;N;;;;; +13328;EGYPTIAN HIEROGLYPH T028;Lo;0;L;;;;;N;;;;; +13329;EGYPTIAN HIEROGLYPH T029;Lo;0;L;;;;;N;;;;; +1332A;EGYPTIAN HIEROGLYPH T030;Lo;0;L;;;;;N;;;;; +1332B;EGYPTIAN HIEROGLYPH T031;Lo;0;L;;;;;N;;;;; +1332C;EGYPTIAN HIEROGLYPH T032;Lo;0;L;;;;;N;;;;; +1332D;EGYPTIAN HIEROGLYPH T032A;Lo;0;L;;;;;N;;;;; +1332E;EGYPTIAN HIEROGLYPH T033;Lo;0;L;;;;;N;;;;; +1332F;EGYPTIAN HIEROGLYPH T033A;Lo;0;L;;;;;N;;;;; +13330;EGYPTIAN HIEROGLYPH T034;Lo;0;L;;;;;N;;;;; +13331;EGYPTIAN HIEROGLYPH T035;Lo;0;L;;;;;N;;;;; +13332;EGYPTIAN HIEROGLYPH T036;Lo;0;L;;;;;N;;;;; +13333;EGYPTIAN HIEROGLYPH U001;Lo;0;L;;;;;N;;;;; +13334;EGYPTIAN HIEROGLYPH U002;Lo;0;L;;;;;N;;;;; +13335;EGYPTIAN HIEROGLYPH U003;Lo;0;L;;;;;N;;;;; +13336;EGYPTIAN HIEROGLYPH U004;Lo;0;L;;;;;N;;;;; +13337;EGYPTIAN HIEROGLYPH U005;Lo;0;L;;;;;N;;;;; +13338;EGYPTIAN HIEROGLYPH U006;Lo;0;L;;;;;N;;;;; +13339;EGYPTIAN HIEROGLYPH U006A;Lo;0;L;;;;;N;;;;; +1333A;EGYPTIAN HIEROGLYPH U006B;Lo;0;L;;;;;N;;;;; +1333B;EGYPTIAN HIEROGLYPH U007;Lo;0;L;;;;;N;;;;; +1333C;EGYPTIAN HIEROGLYPH U008;Lo;0;L;;;;;N;;;;; +1333D;EGYPTIAN HIEROGLYPH U009;Lo;0;L;;;;;N;;;;; +1333E;EGYPTIAN HIEROGLYPH U010;Lo;0;L;;;;;N;;;;; +1333F;EGYPTIAN HIEROGLYPH U011;Lo;0;L;;;;;N;;;;; +13340;EGYPTIAN HIEROGLYPH U012;Lo;0;L;;;;;N;;;;; +13341;EGYPTIAN HIEROGLYPH U013;Lo;0;L;;;;;N;;;;; +13342;EGYPTIAN HIEROGLYPH U014;Lo;0;L;;;;;N;;;;; +13343;EGYPTIAN HIEROGLYPH U015;Lo;0;L;;;;;N;;;;; +13344;EGYPTIAN HIEROGLYPH U016;Lo;0;L;;;;;N;;;;; +13345;EGYPTIAN HIEROGLYPH U017;Lo;0;L;;;;;N;;;;; +13346;EGYPTIAN HIEROGLYPH U018;Lo;0;L;;;;;N;;;;; +13347;EGYPTIAN HIEROGLYPH U019;Lo;0;L;;;;;N;;;;; +13348;EGYPTIAN HIEROGLYPH U020;Lo;0;L;;;;;N;;;;; +13349;EGYPTIAN HIEROGLYPH U021;Lo;0;L;;;;;N;;;;; +1334A;EGYPTIAN HIEROGLYPH U022;Lo;0;L;;;;;N;;;;; +1334B;EGYPTIAN HIEROGLYPH U023;Lo;0;L;;;;;N;;;;; +1334C;EGYPTIAN HIEROGLYPH U023A;Lo;0;L;;;;;N;;;;; +1334D;EGYPTIAN HIEROGLYPH U024;Lo;0;L;;;;;N;;;;; +1334E;EGYPTIAN HIEROGLYPH U025;Lo;0;L;;;;;N;;;;; +1334F;EGYPTIAN HIEROGLYPH U026;Lo;0;L;;;;;N;;;;; +13350;EGYPTIAN HIEROGLYPH U027;Lo;0;L;;;;;N;;;;; +13351;EGYPTIAN HIEROGLYPH U028;Lo;0;L;;;;;N;;;;; +13352;EGYPTIAN HIEROGLYPH U029;Lo;0;L;;;;;N;;;;; +13353;EGYPTIAN HIEROGLYPH U029A;Lo;0;L;;;;;N;;;;; +13354;EGYPTIAN HIEROGLYPH U030;Lo;0;L;;;;;N;;;;; +13355;EGYPTIAN HIEROGLYPH U031;Lo;0;L;;;;;N;;;;; +13356;EGYPTIAN HIEROGLYPH U032;Lo;0;L;;;;;N;;;;; +13357;EGYPTIAN HIEROGLYPH U032A;Lo;0;L;;;;;N;;;;; +13358;EGYPTIAN HIEROGLYPH U033;Lo;0;L;;;;;N;;;;; +13359;EGYPTIAN HIEROGLYPH U034;Lo;0;L;;;;;N;;;;; +1335A;EGYPTIAN HIEROGLYPH U035;Lo;0;L;;;;;N;;;;; +1335B;EGYPTIAN HIEROGLYPH U036;Lo;0;L;;;;;N;;;;; +1335C;EGYPTIAN HIEROGLYPH U037;Lo;0;L;;;;;N;;;;; +1335D;EGYPTIAN HIEROGLYPH U038;Lo;0;L;;;;;N;;;;; +1335E;EGYPTIAN HIEROGLYPH U039;Lo;0;L;;;;;N;;;;; +1335F;EGYPTIAN HIEROGLYPH U040;Lo;0;L;;;;;N;;;;; +13360;EGYPTIAN HIEROGLYPH U041;Lo;0;L;;;;;N;;;;; +13361;EGYPTIAN HIEROGLYPH U042;Lo;0;L;;;;;N;;;;; +13362;EGYPTIAN HIEROGLYPH V001;Lo;0;L;;;;;N;;;;; +13363;EGYPTIAN HIEROGLYPH V001A;Lo;0;L;;;;;N;;;;; +13364;EGYPTIAN HIEROGLYPH V001B;Lo;0;L;;;;;N;;;;; +13365;EGYPTIAN HIEROGLYPH V001C;Lo;0;L;;;;;N;;;;; +13366;EGYPTIAN HIEROGLYPH V001D;Lo;0;L;;;;;N;;;;; +13367;EGYPTIAN HIEROGLYPH V001E;Lo;0;L;;;;;N;;;;; +13368;EGYPTIAN HIEROGLYPH V001F;Lo;0;L;;;;;N;;;;; +13369;EGYPTIAN HIEROGLYPH V001G;Lo;0;L;;;;;N;;;;; +1336A;EGYPTIAN HIEROGLYPH V001H;Lo;0;L;;;;;N;;;;; +1336B;EGYPTIAN HIEROGLYPH V001I;Lo;0;L;;;;;N;;;;; +1336C;EGYPTIAN HIEROGLYPH V002;Lo;0;L;;;;;N;;;;; +1336D;EGYPTIAN HIEROGLYPH V002A;Lo;0;L;;;;;N;;;;; +1336E;EGYPTIAN HIEROGLYPH V003;Lo;0;L;;;;;N;;;;; +1336F;EGYPTIAN HIEROGLYPH V004;Lo;0;L;;;;;N;;;;; +13370;EGYPTIAN HIEROGLYPH V005;Lo;0;L;;;;;N;;;;; +13371;EGYPTIAN HIEROGLYPH V006;Lo;0;L;;;;;N;;;;; +13372;EGYPTIAN HIEROGLYPH V007;Lo;0;L;;;;;N;;;;; +13373;EGYPTIAN HIEROGLYPH V007A;Lo;0;L;;;;;N;;;;; +13374;EGYPTIAN HIEROGLYPH V007B;Lo;0;L;;;;;N;;;;; +13375;EGYPTIAN HIEROGLYPH V008;Lo;0;L;;;;;N;;;;; +13376;EGYPTIAN HIEROGLYPH V009;Lo;0;L;;;;;N;;;;; +13377;EGYPTIAN HIEROGLYPH V010;Lo;0;L;;;;;N;;;;; +13378;EGYPTIAN HIEROGLYPH V011;Lo;0;L;;;;;N;;;;; +13379;EGYPTIAN HIEROGLYPH V011A;Lo;0;L;;;;;N;;;;; +1337A;EGYPTIAN HIEROGLYPH V011B;Lo;0;L;;;;;N;;;;; +1337B;EGYPTIAN HIEROGLYPH V011C;Lo;0;L;;;;;N;;;;; +1337C;EGYPTIAN HIEROGLYPH V012;Lo;0;L;;;;;N;;;;; +1337D;EGYPTIAN HIEROGLYPH V012A;Lo;0;L;;;;;N;;;;; +1337E;EGYPTIAN HIEROGLYPH V012B;Lo;0;L;;;;;N;;;;; +1337F;EGYPTIAN HIEROGLYPH V013;Lo;0;L;;;;;N;;;;; +13380;EGYPTIAN HIEROGLYPH V014;Lo;0;L;;;;;N;;;;; +13381;EGYPTIAN HIEROGLYPH V015;Lo;0;L;;;;;N;;;;; +13382;EGYPTIAN HIEROGLYPH V016;Lo;0;L;;;;;N;;;;; +13383;EGYPTIAN HIEROGLYPH V017;Lo;0;L;;;;;N;;;;; +13384;EGYPTIAN HIEROGLYPH V018;Lo;0;L;;;;;N;;;;; +13385;EGYPTIAN HIEROGLYPH V019;Lo;0;L;;;;;N;;;;; +13386;EGYPTIAN HIEROGLYPH V020;Lo;0;L;;;;;N;;;;; +13387;EGYPTIAN HIEROGLYPH V020A;Lo;0;L;;;;;N;;;;; +13388;EGYPTIAN HIEROGLYPH V020B;Lo;0;L;;;;;N;;;;; +13389;EGYPTIAN HIEROGLYPH V020C;Lo;0;L;;;;;N;;;;; +1338A;EGYPTIAN HIEROGLYPH V020D;Lo;0;L;;;;;N;;;;; +1338B;EGYPTIAN HIEROGLYPH V020E;Lo;0;L;;;;;N;;;;; +1338C;EGYPTIAN HIEROGLYPH V020F;Lo;0;L;;;;;N;;;;; +1338D;EGYPTIAN HIEROGLYPH V020G;Lo;0;L;;;;;N;;;;; +1338E;EGYPTIAN HIEROGLYPH V020H;Lo;0;L;;;;;N;;;;; +1338F;EGYPTIAN HIEROGLYPH V020I;Lo;0;L;;;;;N;;;;; +13390;EGYPTIAN HIEROGLYPH V020J;Lo;0;L;;;;;N;;;;; +13391;EGYPTIAN HIEROGLYPH V020K;Lo;0;L;;;;;N;;;;; +13392;EGYPTIAN HIEROGLYPH V020L;Lo;0;L;;;;;N;;;;; +13393;EGYPTIAN HIEROGLYPH V021;Lo;0;L;;;;;N;;;;; +13394;EGYPTIAN HIEROGLYPH V022;Lo;0;L;;;;;N;;;;; +13395;EGYPTIAN HIEROGLYPH V023;Lo;0;L;;;;;N;;;;; +13396;EGYPTIAN HIEROGLYPH V023A;Lo;0;L;;;;;N;;;;; +13397;EGYPTIAN HIEROGLYPH V024;Lo;0;L;;;;;N;;;;; +13398;EGYPTIAN HIEROGLYPH V025;Lo;0;L;;;;;N;;;;; +13399;EGYPTIAN HIEROGLYPH V026;Lo;0;L;;;;;N;;;;; +1339A;EGYPTIAN HIEROGLYPH V027;Lo;0;L;;;;;N;;;;; +1339B;EGYPTIAN HIEROGLYPH V028;Lo;0;L;;;;;N;;;;; +1339C;EGYPTIAN HIEROGLYPH V028A;Lo;0;L;;;;;N;;;;; +1339D;EGYPTIAN HIEROGLYPH V029;Lo;0;L;;;;;N;;;;; +1339E;EGYPTIAN HIEROGLYPH V029A;Lo;0;L;;;;;N;;;;; +1339F;EGYPTIAN HIEROGLYPH V030;Lo;0;L;;;;;N;;;;; +133A0;EGYPTIAN HIEROGLYPH V030A;Lo;0;L;;;;;N;;;;; +133A1;EGYPTIAN HIEROGLYPH V031;Lo;0;L;;;;;N;;;;; +133A2;EGYPTIAN HIEROGLYPH V031A;Lo;0;L;;;;;N;;;;; +133A3;EGYPTIAN HIEROGLYPH V032;Lo;0;L;;;;;N;;;;; +133A4;EGYPTIAN HIEROGLYPH V033;Lo;0;L;;;;;N;;;;; +133A5;EGYPTIAN HIEROGLYPH V033A;Lo;0;L;;;;;N;;;;; +133A6;EGYPTIAN HIEROGLYPH V034;Lo;0;L;;;;;N;;;;; +133A7;EGYPTIAN HIEROGLYPH V035;Lo;0;L;;;;;N;;;;; +133A8;EGYPTIAN HIEROGLYPH V036;Lo;0;L;;;;;N;;;;; +133A9;EGYPTIAN HIEROGLYPH V037;Lo;0;L;;;;;N;;;;; +133AA;EGYPTIAN HIEROGLYPH V037A;Lo;0;L;;;;;N;;;;; +133AB;EGYPTIAN HIEROGLYPH V038;Lo;0;L;;;;;N;;;;; +133AC;EGYPTIAN HIEROGLYPH V039;Lo;0;L;;;;;N;;;;; +133AD;EGYPTIAN HIEROGLYPH V040;Lo;0;L;;;;;N;;;;; +133AE;EGYPTIAN HIEROGLYPH V040A;Lo;0;L;;;;;N;;;;; +133AF;EGYPTIAN HIEROGLYPH W001;Lo;0;L;;;;;N;;;;; +133B0;EGYPTIAN HIEROGLYPH W002;Lo;0;L;;;;;N;;;;; +133B1;EGYPTIAN HIEROGLYPH W003;Lo;0;L;;;;;N;;;;; +133B2;EGYPTIAN HIEROGLYPH W003A;Lo;0;L;;;;;N;;;;; +133B3;EGYPTIAN HIEROGLYPH W004;Lo;0;L;;;;;N;;;;; +133B4;EGYPTIAN HIEROGLYPH W005;Lo;0;L;;;;;N;;;;; +133B5;EGYPTIAN HIEROGLYPH W006;Lo;0;L;;;;;N;;;;; +133B6;EGYPTIAN HIEROGLYPH W007;Lo;0;L;;;;;N;;;;; +133B7;EGYPTIAN HIEROGLYPH W008;Lo;0;L;;;;;N;;;;; +133B8;EGYPTIAN HIEROGLYPH W009;Lo;0;L;;;;;N;;;;; +133B9;EGYPTIAN HIEROGLYPH W009A;Lo;0;L;;;;;N;;;;; +133BA;EGYPTIAN HIEROGLYPH W010;Lo;0;L;;;;;N;;;;; +133BB;EGYPTIAN HIEROGLYPH W010A;Lo;0;L;;;;;N;;;;; +133BC;EGYPTIAN HIEROGLYPH W011;Lo;0;L;;;;;N;;;;; +133BD;EGYPTIAN HIEROGLYPH W012;Lo;0;L;;;;;N;;;;; +133BE;EGYPTIAN HIEROGLYPH W013;Lo;0;L;;;;;N;;;;; +133BF;EGYPTIAN HIEROGLYPH W014;Lo;0;L;;;;;N;;;;; +133C0;EGYPTIAN HIEROGLYPH W014A;Lo;0;L;;;;;N;;;;; +133C1;EGYPTIAN HIEROGLYPH W015;Lo;0;L;;;;;N;;;;; +133C2;EGYPTIAN HIEROGLYPH W016;Lo;0;L;;;;;N;;;;; +133C3;EGYPTIAN HIEROGLYPH W017;Lo;0;L;;;;;N;;;;; +133C4;EGYPTIAN HIEROGLYPH W017A;Lo;0;L;;;;;N;;;;; +133C5;EGYPTIAN HIEROGLYPH W018;Lo;0;L;;;;;N;;;;; +133C6;EGYPTIAN HIEROGLYPH W018A;Lo;0;L;;;;;N;;;;; +133C7;EGYPTIAN HIEROGLYPH W019;Lo;0;L;;;;;N;;;;; +133C8;EGYPTIAN HIEROGLYPH W020;Lo;0;L;;;;;N;;;;; +133C9;EGYPTIAN HIEROGLYPH W021;Lo;0;L;;;;;N;;;;; +133CA;EGYPTIAN HIEROGLYPH W022;Lo;0;L;;;;;N;;;;; +133CB;EGYPTIAN HIEROGLYPH W023;Lo;0;L;;;;;N;;;;; +133CC;EGYPTIAN HIEROGLYPH W024;Lo;0;L;;;;;N;;;;; +133CD;EGYPTIAN HIEROGLYPH W024A;Lo;0;L;;;;;N;;;;; +133CE;EGYPTIAN HIEROGLYPH W025;Lo;0;L;;;;;N;;;;; +133CF;EGYPTIAN HIEROGLYPH X001;Lo;0;L;;;;;N;;;;; +133D0;EGYPTIAN HIEROGLYPH X002;Lo;0;L;;;;;N;;;;; +133D1;EGYPTIAN HIEROGLYPH X003;Lo;0;L;;;;;N;;;;; +133D2;EGYPTIAN HIEROGLYPH X004;Lo;0;L;;;;;N;;;;; +133D3;EGYPTIAN HIEROGLYPH X004A;Lo;0;L;;;;;N;;;;; +133D4;EGYPTIAN HIEROGLYPH X004B;Lo;0;L;;;;;N;;;;; +133D5;EGYPTIAN HIEROGLYPH X005;Lo;0;L;;;;;N;;;;; +133D6;EGYPTIAN HIEROGLYPH X006;Lo;0;L;;;;;N;;;;; +133D7;EGYPTIAN HIEROGLYPH X006A;Lo;0;L;;;;;N;;;;; +133D8;EGYPTIAN HIEROGLYPH X007;Lo;0;L;;;;;N;;;;; +133D9;EGYPTIAN HIEROGLYPH X008;Lo;0;L;;;;;N;;;;; +133DA;EGYPTIAN HIEROGLYPH X008A;Lo;0;L;;;;;N;;;;; +133DB;EGYPTIAN HIEROGLYPH Y001;Lo;0;L;;;;;N;;;;; +133DC;EGYPTIAN HIEROGLYPH Y001A;Lo;0;L;;;;;N;;;;; +133DD;EGYPTIAN HIEROGLYPH Y002;Lo;0;L;;;;;N;;;;; +133DE;EGYPTIAN HIEROGLYPH Y003;Lo;0;L;;;;;N;;;;; +133DF;EGYPTIAN HIEROGLYPH Y004;Lo;0;L;;;;;N;;;;; +133E0;EGYPTIAN HIEROGLYPH Y005;Lo;0;L;;;;;N;;;;; +133E1;EGYPTIAN HIEROGLYPH Y006;Lo;0;L;;;;;N;;;;; +133E2;EGYPTIAN HIEROGLYPH Y007;Lo;0;L;;;;;N;;;;; +133E3;EGYPTIAN HIEROGLYPH Y008;Lo;0;L;;;;;N;;;;; +133E4;EGYPTIAN HIEROGLYPH Z001;Lo;0;L;;;;;N;;;;; +133E5;EGYPTIAN HIEROGLYPH Z002;Lo;0;L;;;;;N;;;;; +133E6;EGYPTIAN HIEROGLYPH Z002A;Lo;0;L;;;;;N;;;;; +133E7;EGYPTIAN HIEROGLYPH Z002B;Lo;0;L;;;;;N;;;;; +133E8;EGYPTIAN HIEROGLYPH Z002C;Lo;0;L;;;;;N;;;;; +133E9;EGYPTIAN HIEROGLYPH Z002D;Lo;0;L;;;;;N;;;;; +133EA;EGYPTIAN HIEROGLYPH Z003;Lo;0;L;;;;;N;;;;; +133EB;EGYPTIAN HIEROGLYPH Z003A;Lo;0;L;;;;;N;;;;; +133EC;EGYPTIAN HIEROGLYPH Z003B;Lo;0;L;;;;;N;;;;; +133ED;EGYPTIAN HIEROGLYPH Z004;Lo;0;L;;;;;N;;;;; +133EE;EGYPTIAN HIEROGLYPH Z004A;Lo;0;L;;;;;N;;;;; +133EF;EGYPTIAN HIEROGLYPH Z005;Lo;0;L;;;;;N;;;;; +133F0;EGYPTIAN HIEROGLYPH Z005A;Lo;0;L;;;;;N;;;;; +133F1;EGYPTIAN HIEROGLYPH Z006;Lo;0;L;;;;;N;;;;; +133F2;EGYPTIAN HIEROGLYPH Z007;Lo;0;L;;;;;N;;;;; +133F3;EGYPTIAN HIEROGLYPH Z008;Lo;0;L;;;;;N;;;;; +133F4;EGYPTIAN HIEROGLYPH Z009;Lo;0;L;;;;;N;;;;; +133F5;EGYPTIAN HIEROGLYPH Z010;Lo;0;L;;;;;N;;;;; +133F6;EGYPTIAN HIEROGLYPH Z011;Lo;0;L;;;;;N;;;;; +133F7;EGYPTIAN HIEROGLYPH Z012;Lo;0;L;;;;;N;;;;; +133F8;EGYPTIAN HIEROGLYPH Z013;Lo;0;L;;;;;N;;;;; +133F9;EGYPTIAN HIEROGLYPH Z014;Lo;0;L;;;;;N;;;;; +133FA;EGYPTIAN HIEROGLYPH Z015;Lo;0;L;;;;;N;;;;; +133FB;EGYPTIAN HIEROGLYPH Z015A;Lo;0;L;;;;;N;;;;; +133FC;EGYPTIAN HIEROGLYPH Z015B;Lo;0;L;;;;;N;;;;; +133FD;EGYPTIAN HIEROGLYPH Z015C;Lo;0;L;;;;;N;;;;; +133FE;EGYPTIAN HIEROGLYPH Z015D;Lo;0;L;;;;;N;;;;; +133FF;EGYPTIAN HIEROGLYPH Z015E;Lo;0;L;;;;;N;;;;; +13400;EGYPTIAN HIEROGLYPH Z015F;Lo;0;L;;;;;N;;;;; +13401;EGYPTIAN HIEROGLYPH Z015G;Lo;0;L;;;;;N;;;;; +13402;EGYPTIAN HIEROGLYPH Z015H;Lo;0;L;;;;;N;;;;; +13403;EGYPTIAN HIEROGLYPH Z015I;Lo;0;L;;;;;N;;;;; +13404;EGYPTIAN HIEROGLYPH Z016;Lo;0;L;;;;;N;;;;; +13405;EGYPTIAN HIEROGLYPH Z016A;Lo;0;L;;;;;N;;;;; +13406;EGYPTIAN HIEROGLYPH Z016B;Lo;0;L;;;;;N;;;;; +13407;EGYPTIAN HIEROGLYPH Z016C;Lo;0;L;;;;;N;;;;; +13408;EGYPTIAN HIEROGLYPH Z016D;Lo;0;L;;;;;N;;;;; +13409;EGYPTIAN HIEROGLYPH Z016E;Lo;0;L;;;;;N;;;;; +1340A;EGYPTIAN HIEROGLYPH Z016F;Lo;0;L;;;;;N;;;;; +1340B;EGYPTIAN HIEROGLYPH Z016G;Lo;0;L;;;;;N;;;;; +1340C;EGYPTIAN HIEROGLYPH Z016H;Lo;0;L;;;;;N;;;;; +1340D;EGYPTIAN HIEROGLYPH AA001;Lo;0;L;;;;;N;;;;; +1340E;EGYPTIAN HIEROGLYPH AA002;Lo;0;L;;;;;N;;;;; +1340F;EGYPTIAN HIEROGLYPH AA003;Lo;0;L;;;;;N;;;;; +13410;EGYPTIAN HIEROGLYPH AA004;Lo;0;L;;;;;N;;;;; +13411;EGYPTIAN HIEROGLYPH AA005;Lo;0;L;;;;;N;;;;; +13412;EGYPTIAN HIEROGLYPH AA006;Lo;0;L;;;;;N;;;;; +13413;EGYPTIAN HIEROGLYPH AA007;Lo;0;L;;;;;N;;;;; +13414;EGYPTIAN HIEROGLYPH AA007A;Lo;0;L;;;;;N;;;;; +13415;EGYPTIAN HIEROGLYPH AA007B;Lo;0;L;;;;;N;;;;; +13416;EGYPTIAN HIEROGLYPH AA008;Lo;0;L;;;;;N;;;;; +13417;EGYPTIAN HIEROGLYPH AA009;Lo;0;L;;;;;N;;;;; +13418;EGYPTIAN HIEROGLYPH AA010;Lo;0;L;;;;;N;;;;; +13419;EGYPTIAN HIEROGLYPH AA011;Lo;0;L;;;;;N;;;;; +1341A;EGYPTIAN HIEROGLYPH AA012;Lo;0;L;;;;;N;;;;; +1341B;EGYPTIAN HIEROGLYPH AA013;Lo;0;L;;;;;N;;;;; +1341C;EGYPTIAN HIEROGLYPH AA014;Lo;0;L;;;;;N;;;;; +1341D;EGYPTIAN HIEROGLYPH AA015;Lo;0;L;;;;;N;;;;; +1341E;EGYPTIAN HIEROGLYPH AA016;Lo;0;L;;;;;N;;;;; +1341F;EGYPTIAN HIEROGLYPH AA017;Lo;0;L;;;;;N;;;;; +13420;EGYPTIAN HIEROGLYPH AA018;Lo;0;L;;;;;N;;;;; +13421;EGYPTIAN HIEROGLYPH AA019;Lo;0;L;;;;;N;;;;; +13422;EGYPTIAN HIEROGLYPH AA020;Lo;0;L;;;;;N;;;;; +13423;EGYPTIAN HIEROGLYPH AA021;Lo;0;L;;;;;N;;;;; +13424;EGYPTIAN HIEROGLYPH AA022;Lo;0;L;;;;;N;;;;; +13425;EGYPTIAN HIEROGLYPH AA023;Lo;0;L;;;;;N;;;;; +13426;EGYPTIAN HIEROGLYPH AA024;Lo;0;L;;;;;N;;;;; +13427;EGYPTIAN HIEROGLYPH AA025;Lo;0;L;;;;;N;;;;; +13428;EGYPTIAN HIEROGLYPH AA026;Lo;0;L;;;;;N;;;;; +13429;EGYPTIAN HIEROGLYPH AA027;Lo;0;L;;;;;N;;;;; +1342A;EGYPTIAN HIEROGLYPH AA028;Lo;0;L;;;;;N;;;;; +1342B;EGYPTIAN HIEROGLYPH AA029;Lo;0;L;;;;;N;;;;; +1342C;EGYPTIAN HIEROGLYPH AA030;Lo;0;L;;;;;N;;;;; +1342D;EGYPTIAN HIEROGLYPH AA031;Lo;0;L;;;;;N;;;;; +1342E;EGYPTIAN HIEROGLYPH AA032;Lo;0;L;;;;;N;;;;; +1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;; +1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;; +1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;; +1D003;BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON;So;0;L;;;;;N;;;;; +1D004;BYZANTINE MUSICAL SYMBOL OXEIA DIPLI;So;0;L;;;;;N;;;;; +1D005;BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON;So;0;L;;;;;N;;;;; +1D006;BYZANTINE MUSICAL SYMBOL VAREIA DIPLI;So;0;L;;;;;N;;;;; +1D007;BYZANTINE MUSICAL SYMBOL KATHISTI;So;0;L;;;;;N;;;;; +1D008;BYZANTINE MUSICAL SYMBOL SYRMATIKI;So;0;L;;;;;N;;;;; +1D009;BYZANTINE MUSICAL SYMBOL PARAKLITIKI;So;0;L;;;;;N;;;;; +1D00A;BYZANTINE MUSICAL SYMBOL YPOKRISIS;So;0;L;;;;;N;;;;; +1D00B;BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI;So;0;L;;;;;N;;;;; +1D00C;BYZANTINE MUSICAL SYMBOL KREMASTI;So;0;L;;;;;N;;;;; +1D00D;BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON;So;0;L;;;;;N;;;;; +1D00E;BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON;So;0;L;;;;;N;;;;; +1D00F;BYZANTINE MUSICAL SYMBOL TELEIA;So;0;L;;;;;N;;;;; +1D010;BYZANTINE MUSICAL SYMBOL KENTIMATA;So;0;L;;;;;N;;;;; +1D011;BYZANTINE MUSICAL SYMBOL APOSTROFOS;So;0;L;;;;;N;;;;; +1D012;BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI;So;0;L;;;;;N;;;;; +1D013;BYZANTINE MUSICAL SYMBOL SYNEVMA;So;0;L;;;;;N;;;;; +1D014;BYZANTINE MUSICAL SYMBOL THITA;So;0;L;;;;;N;;;;; +1D015;BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION;So;0;L;;;;;N;;;;; +1D016;BYZANTINE MUSICAL SYMBOL GORGON ARCHAION;So;0;L;;;;;N;;;;; +1D017;BYZANTINE MUSICAL SYMBOL PSILON;So;0;L;;;;;N;;;;; +1D018;BYZANTINE MUSICAL SYMBOL CHAMILON;So;0;L;;;;;N;;;;; +1D019;BYZANTINE MUSICAL SYMBOL VATHY;So;0;L;;;;;N;;;;; +1D01A;BYZANTINE MUSICAL SYMBOL ISON ARCHAION;So;0;L;;;;;N;;;;; +1D01B;BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION;So;0;L;;;;;N;;;;; +1D01C;BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION;So;0;L;;;;;N;;;;; +1D01D;BYZANTINE MUSICAL SYMBOL SAXIMATA;So;0;L;;;;;N;;;;; +1D01E;BYZANTINE MUSICAL SYMBOL PARICHON;So;0;L;;;;;N;;;;; +1D01F;BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA;So;0;L;;;;;N;;;;; +1D020;BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION;So;0;L;;;;;N;;;;; +1D021;BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION;So;0;L;;;;;N;;;;; +1D022;BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION;So;0;L;;;;;N;;;;; +1D023;BYZANTINE MUSICAL SYMBOL APOTHEMA;So;0;L;;;;;N;;;;; +1D024;BYZANTINE MUSICAL SYMBOL KLASMA;So;0;L;;;;;N;;;;; +1D025;BYZANTINE MUSICAL SYMBOL REVMA;So;0;L;;;;;N;;;;; +1D026;BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION;So;0;L;;;;;N;;;;; +1D027;BYZANTINE MUSICAL SYMBOL TINAGMA;So;0;L;;;;;N;;;;; +1D028;BYZANTINE MUSICAL SYMBOL ANATRICHISMA;So;0;L;;;;;N;;;;; +1D029;BYZANTINE MUSICAL SYMBOL SEISMA;So;0;L;;;;;N;;;;; +1D02A;BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION;So;0;L;;;;;N;;;;; +1D02B;BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU;So;0;L;;;;;N;;;;; +1D02C;BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION;So;0;L;;;;;N;;;;; +1D02D;BYZANTINE MUSICAL SYMBOL THEMA;So;0;L;;;;;N;;;;; +1D02E;BYZANTINE MUSICAL SYMBOL LEMOI;So;0;L;;;;;N;;;;; +1D02F;BYZANTINE MUSICAL SYMBOL DYO;So;0;L;;;;;N;;;;; +1D030;BYZANTINE MUSICAL SYMBOL TRIA;So;0;L;;;;;N;;;;; +1D031;BYZANTINE MUSICAL SYMBOL TESSERA;So;0;L;;;;;N;;;;; +1D032;BYZANTINE MUSICAL SYMBOL KRATIMATA;So;0;L;;;;;N;;;;; +1D033;BYZANTINE MUSICAL SYMBOL APESO EXO NEO;So;0;L;;;;;N;;;;; +1D034;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION;So;0;L;;;;;N;;;;; +1D035;BYZANTINE MUSICAL SYMBOL IMIFTHORA;So;0;L;;;;;N;;;;; +1D036;BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION;So;0;L;;;;;N;;;;; +1D037;BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON;So;0;L;;;;;N;;;;; +1D038;BYZANTINE MUSICAL SYMBOL PELASTON;So;0;L;;;;;N;;;;; +1D039;BYZANTINE MUSICAL SYMBOL PSIFISTON;So;0;L;;;;;N;;;;; +1D03A;BYZANTINE MUSICAL SYMBOL KONTEVMA;So;0;L;;;;;N;;;;; +1D03B;BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION;So;0;L;;;;;N;;;;; +1D03C;BYZANTINE MUSICAL SYMBOL RAPISMA;So;0;L;;;;;N;;;;; +1D03D;BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION;So;0;L;;;;;N;;;;; +1D03E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION;So;0;L;;;;;N;;;;; +1D03F;BYZANTINE MUSICAL SYMBOL ICHADIN;So;0;L;;;;;N;;;;; +1D040;BYZANTINE MUSICAL SYMBOL NANA;So;0;L;;;;;N;;;;; +1D041;BYZANTINE MUSICAL SYMBOL PETASMA;So;0;L;;;;;N;;;;; +1D042;BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO;So;0;L;;;;;N;;;;; +1D043;BYZANTINE MUSICAL SYMBOL TROMIKON ALLO;So;0;L;;;;;N;;;;; +1D044;BYZANTINE MUSICAL SYMBOL STRAGGISMATA;So;0;L;;;;;N;;;;; +1D045;BYZANTINE MUSICAL SYMBOL GRONTHISMATA;So;0;L;;;;;N;;;;; +1D046;BYZANTINE MUSICAL SYMBOL ISON NEO;So;0;L;;;;;N;;;;; +1D047;BYZANTINE MUSICAL SYMBOL OLIGON NEO;So;0;L;;;;;N;;;;; +1D048;BYZANTINE MUSICAL SYMBOL OXEIA NEO;So;0;L;;;;;N;;;;; +1D049;BYZANTINE MUSICAL SYMBOL PETASTI;So;0;L;;;;;N;;;;; +1D04A;BYZANTINE MUSICAL SYMBOL KOUFISMA;So;0;L;;;;;N;;;;; +1D04B;BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA;So;0;L;;;;;N;;;;; +1D04C;BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA;So;0;L;;;;;N;;;;; +1D04D;BYZANTINE MUSICAL SYMBOL PELASTON NEO;So;0;L;;;;;N;;;;; +1D04E;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO;So;0;L;;;;;N;;;;; +1D04F;BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO;So;0;L;;;;;N;;;;; +1D050;BYZANTINE MUSICAL SYMBOL YPSILI;So;0;L;;;;;N;;;;; +1D051;BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO;So;0;L;;;;;N;;;;; +1D052;BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO;So;0;L;;;;;N;;;;; +1D053;BYZANTINE MUSICAL SYMBOL YPORROI;So;0;L;;;;;N;;;;; +1D054;BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON;So;0;L;;;;;N;;;;; +1D055;BYZANTINE MUSICAL SYMBOL ELAFRON;So;0;L;;;;;N;;;;; +1D056;BYZANTINE MUSICAL SYMBOL CHAMILI;So;0;L;;;;;N;;;;; +1D057;BYZANTINE MUSICAL SYMBOL MIKRON ISON;So;0;L;;;;;N;;;;; +1D058;BYZANTINE MUSICAL SYMBOL VAREIA NEO;So;0;L;;;;;N;;;;; +1D059;BYZANTINE MUSICAL SYMBOL PIASMA NEO;So;0;L;;;;;N;;;;; +1D05A;BYZANTINE MUSICAL SYMBOL PSIFISTON NEO;So;0;L;;;;;N;;;;; +1D05B;BYZANTINE MUSICAL SYMBOL OMALON;So;0;L;;;;;N;;;;; +1D05C;BYZANTINE MUSICAL SYMBOL ANTIKENOMA;So;0;L;;;;;N;;;;; +1D05D;BYZANTINE MUSICAL SYMBOL LYGISMA;So;0;L;;;;;N;;;;; +1D05E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO;So;0;L;;;;;N;;;;; +1D05F;BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO;So;0;L;;;;;N;;;;; +1D060;BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA;So;0;L;;;;;N;;;;; +1D061;BYZANTINE MUSICAL SYMBOL KYLISMA;So;0;L;;;;;N;;;;; +1D062;BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA;So;0;L;;;;;N;;;;; +1D063;BYZANTINE MUSICAL SYMBOL TROMIKON NEO;So;0;L;;;;;N;;;;; +1D064;BYZANTINE MUSICAL SYMBOL EKSTREPTON;So;0;L;;;;;N;;;;; +1D065;BYZANTINE MUSICAL SYMBOL SYNAGMA NEO;So;0;L;;;;;N;;;;; +1D066;BYZANTINE MUSICAL SYMBOL SYRMA;So;0;L;;;;;N;;;;; +1D067;BYZANTINE MUSICAL SYMBOL CHOREVMA NEO;So;0;L;;;;;N;;;;; +1D068;BYZANTINE MUSICAL SYMBOL EPEGERMA;So;0;L;;;;;N;;;;; +1D069;BYZANTINE MUSICAL SYMBOL SEISMA NEO;So;0;L;;;;;N;;;;; +1D06A;BYZANTINE MUSICAL SYMBOL XIRON KLASMA;So;0;L;;;;;N;;;;; +1D06B;BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON;So;0;L;;;;;N;;;;; +1D06C;BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA;So;0;L;;;;;N;;;;; +1D06D;BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA;So;0;L;;;;;N;;;;; +1D06E;BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA;So;0;L;;;;;N;;;;; +1D06F;BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA;So;0;L;;;;;N;;;;; +1D070;BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA;So;0;L;;;;;N;;;;; +1D071;BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA;So;0;L;;;;;N;;;;; +1D072;BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON;So;0;L;;;;;N;;;;; +1D073;BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON;So;0;L;;;;;N;;;;; +1D074;BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON;So;0;L;;;;;N;;;;; +1D075;BYZANTINE MUSICAL SYMBOL OYRANISMA NEO;So;0;L;;;;;N;;;;; +1D076;BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO;So;0;L;;;;;N;;;;; +1D077;BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO;So;0;L;;;;;N;;;;; +1D078;BYZANTINE MUSICAL SYMBOL THEMA APLOUN;So;0;L;;;;;N;;;;; +1D079;BYZANTINE MUSICAL SYMBOL THES KAI APOTHES;So;0;L;;;;;N;;;;; +1D07A;BYZANTINE MUSICAL SYMBOL KATAVASMA;So;0;L;;;;;N;;;;; +1D07B;BYZANTINE MUSICAL SYMBOL ENDOFONON;So;0;L;;;;;N;;;;; +1D07C;BYZANTINE MUSICAL SYMBOL YFEN KATO;So;0;L;;;;;N;;;;; +1D07D;BYZANTINE MUSICAL SYMBOL YFEN ANO;So;0;L;;;;;N;;;;; +1D07E;BYZANTINE MUSICAL SYMBOL STAVROS;So;0;L;;;;;N;;;;; +1D07F;BYZANTINE MUSICAL SYMBOL KLASMA ANO;So;0;L;;;;;N;;;;; +1D080;BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION;So;0;L;;;;;N;;;;; +1D081;BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION;So;0;L;;;;;N;;;;; +1D082;BYZANTINE MUSICAL SYMBOL KRATIMA ALLO;So;0;L;;;;;N;;;;; +1D083;BYZANTINE MUSICAL SYMBOL KRATIMA NEO;So;0;L;;;;;N;;;;; +1D084;BYZANTINE MUSICAL SYMBOL APODERMA NEO;So;0;L;;;;;N;;;;; +1D085;BYZANTINE MUSICAL SYMBOL APLI;So;0;L;;;;;N;;;;; +1D086;BYZANTINE MUSICAL SYMBOL DIPLI;So;0;L;;;;;N;;;;; +1D087;BYZANTINE MUSICAL SYMBOL TRIPLI;So;0;L;;;;;N;;;;; +1D088;BYZANTINE MUSICAL SYMBOL TETRAPLI;So;0;L;;;;;N;;;;; +1D089;BYZANTINE MUSICAL SYMBOL KORONIS;So;0;L;;;;;N;;;;; +1D08A;BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU;So;0;L;;;;;N;;;;; +1D08B;BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON;So;0;L;;;;;N;;;;; +1D08C;BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON;So;0;L;;;;;N;;;;; +1D08D;BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON;So;0;L;;;;;N;;;;; +1D08E;BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU;So;0;L;;;;;N;;;;; +1D08F;BYZANTINE MUSICAL SYMBOL GORGON NEO ANO;So;0;L;;;;;N;;;;; +1D090;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA;So;0;L;;;;;N;;;;; +1D091;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; +1D092;BYZANTINE MUSICAL SYMBOL DIGORGON;So;0;L;;;;;N;;;;; +1D093;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO;So;0;L;;;;;N;;;;; +1D094;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO;So;0;L;;;;;N;;;;; +1D095;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; +1D096;BYZANTINE MUSICAL SYMBOL TRIGORGON;So;0;L;;;;;N;;;;; +1D097;BYZANTINE MUSICAL SYMBOL ARGON;So;0;L;;;;;N;;;;; +1D098;BYZANTINE MUSICAL SYMBOL IMIDIARGON;So;0;L;;;;;N;;;;; +1D099;BYZANTINE MUSICAL SYMBOL DIARGON;So;0;L;;;;;N;;;;; +1D09A;BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI;So;0;L;;;;;N;;;;; +1D09B;BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI;So;0;L;;;;;N;;;;; +1D09C;BYZANTINE MUSICAL SYMBOL AGOGI ARGI;So;0;L;;;;;N;;;;; +1D09D;BYZANTINE MUSICAL SYMBOL AGOGI METRIA;So;0;L;;;;;N;;;;; +1D09E;BYZANTINE MUSICAL SYMBOL AGOGI MESI;So;0;L;;;;;N;;;;; +1D09F;BYZANTINE MUSICAL SYMBOL AGOGI GORGI;So;0;L;;;;;N;;;;; +1D0A0;BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI;So;0;L;;;;;N;;;;; +1D0A1;BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI;So;0;L;;;;;N;;;;; +1D0A2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A3;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A4;BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS;So;0;L;;;;;N;;;;; +1D0A5;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS;So;0;L;;;;;N;;;;; +1D0A6;BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS;So;0;L;;;;;N;;;;; +1D0A7;BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS;So;0;L;;;;;N;;;;; +1D0A8;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A9;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS;So;0;L;;;;;N;;;;; +1D0AA;BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS;So;0;L;;;;;N;;;;; +1D0AB;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS;So;0;L;;;;;N;;;;; +1D0AC;BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; +1D0AD;BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; +1D0AE;BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS;So;0;L;;;;;N;;;;; +1D0AF;BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS;So;0;L;;;;;N;;;;; +1D0B0;BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS;So;0;L;;;;;N;;;;; +1D0B1;BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS;So;0;L;;;;;N;;;;; +1D0B2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS;So;0;L;;;;;N;;;;; +1D0B3;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS;So;0;L;;;;;N;;;;; +1D0B4;BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN;So;0;L;;;;;N;;;;; +1D0B5;BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN;So;0;L;;;;;N;;;;; +1D0B6;BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU;So;0;L;;;;;N;;;;; +1D0B7;BYZANTINE MUSICAL SYMBOL IMIFONON;So;0;L;;;;;N;;;;; +1D0B8;BYZANTINE MUSICAL SYMBOL IMIFTHORON;So;0;L;;;;;N;;;;; +1D0B9;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU;So;0;L;;;;;N;;;;; +1D0BA;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA;So;0;L;;;;;N;;;;; +1D0BB;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA;So;0;L;;;;;N;;;;; +1D0BC;BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS;So;0;L;;;;;N;;;;; +1D0BD;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI;So;0;L;;;;;N;;;;; +1D0BE;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI;So;0;L;;;;;N;;;;; +1D0BF;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE;So;0;L;;;;;N;;;;; +1D0C0;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO;So;0;L;;;;;N;;;;; +1D0C1;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO;So;0;L;;;;;N;;;;; +1D0C2;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO;So;0;L;;;;;N;;;;; +1D0C3;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS;So;0;L;;;;;N;;;;; +1D0C4;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS;So;0;L;;;;;N;;;;; +1D0C5;BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS;So;0;L;;;;;N;;;;; +1D0C6;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI;So;0;L;;;;;N;;;;; +1D0C7;BYZANTINE MUSICAL SYMBOL FTHORA NENANO;So;0;L;;;;;N;;;;; +1D0C8;BYZANTINE MUSICAL SYMBOL CHROA ZYGOS;So;0;L;;;;;N;;;;; +1D0C9;BYZANTINE MUSICAL SYMBOL CHROA KLITON;So;0;L;;;;;N;;;;; +1D0CA;BYZANTINE MUSICAL SYMBOL CHROA SPATHI;So;0;L;;;;;N;;;;; +1D0CB;BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION;So;0;L;;;;;N;;;;; +1D0CC;BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA;So;0;L;;;;;N;;;;; +1D0CD;BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION;So;0;L;;;;;N;;;;; +1D0CE;BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION;So;0;L;;;;;N;;;;; +1D0CF;BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION;So;0;L;;;;;N;;;;; +1D0D0;BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; +1D0D1;BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; +1D0D2;BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; +1D0D3;BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; +1D0D4;BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; +1D0D5;BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; +1D0D6;BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; +1D0D7;BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; +1D0D8;BYZANTINE MUSICAL SYMBOL GENIKI DIESIS;So;0;L;;;;;N;;;;; +1D0D9;BYZANTINE MUSICAL SYMBOL GENIKI YFESIS;So;0;L;;;;;N;;;;; +1D0DA;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI;So;0;L;;;;;N;;;;; +1D0DB;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI;So;0;L;;;;;N;;;;; +1D0DC;BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI;So;0;L;;;;;N;;;;; +1D0DD;BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS;So;0;L;;;;;N;;;;; +1D0DE;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS;So;0;L;;;;;N;;;;; +1D0DF;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU;So;0;L;;;;;N;;;;; +1D0E0;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU;So;0;L;;;;;N;;;;; +1D0E1;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU;So;0;L;;;;;N;;;;; +1D0E2;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS;So;0;L;;;;;N;;;;; +1D0E3;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU;So;0;L;;;;;N;;;;; +1D0E4;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU;So;0;L;;;;;N;;;;; +1D0E5;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU;So;0;L;;;;;N;;;;; +1D0E6;BYZANTINE MUSICAL SYMBOL DIGRAMMA GG;So;0;L;;;;;N;;;;; +1D0E7;BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU;So;0;L;;;;;N;;;;; +1D0E8;BYZANTINE MUSICAL SYMBOL STIGMA;So;0;L;;;;;N;;;;; +1D0E9;BYZANTINE MUSICAL SYMBOL ARKTIKO PA;So;0;L;;;;;N;;;;; +1D0EA;BYZANTINE MUSICAL SYMBOL ARKTIKO VOU;So;0;L;;;;;N;;;;; +1D0EB;BYZANTINE MUSICAL SYMBOL ARKTIKO GA;So;0;L;;;;;N;;;;; +1D0EC;BYZANTINE MUSICAL SYMBOL ARKTIKO DI;So;0;L;;;;;N;;;;; +1D0ED;BYZANTINE MUSICAL SYMBOL ARKTIKO KE;So;0;L;;;;;N;;;;; +1D0EE;BYZANTINE MUSICAL SYMBOL ARKTIKO ZO;So;0;L;;;;;N;;;;; +1D0EF;BYZANTINE MUSICAL SYMBOL ARKTIKO NI;So;0;L;;;;;N;;;;; +1D0F0;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO;So;0;L;;;;;N;;;;; +1D0F1;BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO;So;0;L;;;;;N;;;;; +1D0F2;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO;So;0;L;;;;;N;;;;; +1D0F3;BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO;So;0;L;;;;;N;;;;; +1D0F4;BYZANTINE MUSICAL SYMBOL KLASMA KATO;So;0;L;;;;;N;;;;; +1D0F5;BYZANTINE MUSICAL SYMBOL GORGON NEO KATO;So;0;L;;;;;N;;;;; +1D100;MUSICAL SYMBOL SINGLE BARLINE;So;0;L;;;;;N;;;;; +1D101;MUSICAL SYMBOL DOUBLE BARLINE;So;0;L;;;;;N;;;;; +1D102;MUSICAL SYMBOL FINAL BARLINE;So;0;L;;;;;N;;;;; +1D103;MUSICAL SYMBOL REVERSE FINAL BARLINE;So;0;L;;;;;N;;;;; +1D104;MUSICAL SYMBOL DASHED BARLINE;So;0;L;;;;;N;;;;; +1D105;MUSICAL SYMBOL SHORT BARLINE;So;0;L;;;;;N;;;;; +1D106;MUSICAL SYMBOL LEFT REPEAT SIGN;So;0;L;;;;;N;;;;; +1D107;MUSICAL SYMBOL RIGHT REPEAT SIGN;So;0;L;;;;;N;;;;; +1D108;MUSICAL SYMBOL REPEAT DOTS;So;0;L;;;;;N;;;;; +1D109;MUSICAL SYMBOL DAL SEGNO;So;0;L;;;;;N;;;;; +1D10A;MUSICAL SYMBOL DA CAPO;So;0;L;;;;;N;;;;; +1D10B;MUSICAL SYMBOL SEGNO;So;0;L;;;;;N;;;;; +1D10C;MUSICAL SYMBOL CODA;So;0;L;;;;;N;;;;; +1D10D;MUSICAL SYMBOL REPEATED FIGURE-1;So;0;L;;;;;N;;;;; +1D10E;MUSICAL SYMBOL REPEATED FIGURE-2;So;0;L;;;;;N;;;;; +1D10F;MUSICAL SYMBOL REPEATED FIGURE-3;So;0;L;;;;;N;;;;; +1D110;MUSICAL SYMBOL FERMATA;So;0;L;;;;;N;;;;; +1D111;MUSICAL SYMBOL FERMATA BELOW;So;0;L;;;;;N;;;;; +1D112;MUSICAL SYMBOL BREATH MARK;So;0;L;;;;;N;;;;; +1D113;MUSICAL SYMBOL CAESURA;So;0;L;;;;;N;;;;; +1D114;MUSICAL SYMBOL BRACE;So;0;L;;;;;N;;;;; +1D115;MUSICAL SYMBOL BRACKET;So;0;L;;;;;N;;;;; +1D116;MUSICAL SYMBOL ONE-LINE STAFF;So;0;L;;;;;N;;;;; +1D117;MUSICAL SYMBOL TWO-LINE STAFF;So;0;L;;;;;N;;;;; +1D118;MUSICAL SYMBOL THREE-LINE STAFF;So;0;L;;;;;N;;;;; +1D119;MUSICAL SYMBOL FOUR-LINE STAFF;So;0;L;;;;;N;;;;; +1D11A;MUSICAL SYMBOL FIVE-LINE STAFF;So;0;L;;;;;N;;;;; +1D11B;MUSICAL SYMBOL SIX-LINE STAFF;So;0;L;;;;;N;;;;; +1D11C;MUSICAL SYMBOL SIX-STRING FRETBOARD;So;0;L;;;;;N;;;;; +1D11D;MUSICAL SYMBOL FOUR-STRING FRETBOARD;So;0;L;;;;;N;;;;; +1D11E;MUSICAL SYMBOL G CLEF;So;0;L;;;;;N;;;;; +1D11F;MUSICAL SYMBOL G CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D120;MUSICAL SYMBOL G CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D121;MUSICAL SYMBOL C CLEF;So;0;L;;;;;N;;;;; +1D122;MUSICAL SYMBOL F CLEF;So;0;L;;;;;N;;;;; +1D123;MUSICAL SYMBOL F CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D124;MUSICAL SYMBOL F CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D125;MUSICAL SYMBOL DRUM CLEF-1;So;0;L;;;;;N;;;;; +1D126;MUSICAL SYMBOL DRUM CLEF-2;So;0;L;;;;;N;;;;; +1D129;MUSICAL SYMBOL MULTIPLE MEASURE REST;So;0;L;;;;;N;;;;; +1D12A;MUSICAL SYMBOL DOUBLE SHARP;So;0;L;;;;;N;;;;; +1D12B;MUSICAL SYMBOL DOUBLE FLAT;So;0;L;;;;;N;;;;; +1D12C;MUSICAL SYMBOL FLAT UP;So;0;L;;;;;N;;;;; +1D12D;MUSICAL SYMBOL FLAT DOWN;So;0;L;;;;;N;;;;; +1D12E;MUSICAL SYMBOL NATURAL UP;So;0;L;;;;;N;;;;; +1D12F;MUSICAL SYMBOL NATURAL DOWN;So;0;L;;;;;N;;;;; +1D130;MUSICAL SYMBOL SHARP UP;So;0;L;;;;;N;;;;; +1D131;MUSICAL SYMBOL SHARP DOWN;So;0;L;;;;;N;;;;; +1D132;MUSICAL SYMBOL QUARTER TONE SHARP;So;0;L;;;;;N;;;;; +1D133;MUSICAL SYMBOL QUARTER TONE FLAT;So;0;L;;;;;N;;;;; +1D134;MUSICAL SYMBOL COMMON TIME;So;0;L;;;;;N;;;;; +1D135;MUSICAL SYMBOL CUT TIME;So;0;L;;;;;N;;;;; +1D136;MUSICAL SYMBOL OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D137;MUSICAL SYMBOL OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D138;MUSICAL SYMBOL QUINDICESIMA ALTA;So;0;L;;;;;N;;;;; +1D139;MUSICAL SYMBOL QUINDICESIMA BASSA;So;0;L;;;;;N;;;;; +1D13A;MUSICAL SYMBOL MULTI REST;So;0;L;;;;;N;;;;; +1D13B;MUSICAL SYMBOL WHOLE REST;So;0;L;;;;;N;;;;; +1D13C;MUSICAL SYMBOL HALF REST;So;0;L;;;;;N;;;;; +1D13D;MUSICAL SYMBOL QUARTER REST;So;0;L;;;;;N;;;;; +1D13E;MUSICAL SYMBOL EIGHTH REST;So;0;L;;;;;N;;;;; +1D13F;MUSICAL SYMBOL SIXTEENTH REST;So;0;L;;;;;N;;;;; +1D140;MUSICAL SYMBOL THIRTY-SECOND REST;So;0;L;;;;;N;;;;; +1D141;MUSICAL SYMBOL SIXTY-FOURTH REST;So;0;L;;;;;N;;;;; +1D142;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST;So;0;L;;;;;N;;;;; +1D143;MUSICAL SYMBOL X NOTEHEAD;So;0;L;;;;;N;;;;; +1D144;MUSICAL SYMBOL PLUS NOTEHEAD;So;0;L;;;;;N;;;;; +1D145;MUSICAL SYMBOL CIRCLE X NOTEHEAD;So;0;L;;;;;N;;;;; +1D146;MUSICAL SYMBOL SQUARE NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D147;MUSICAL SYMBOL SQUARE NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D148;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE;So;0;L;;;;;N;;;;; +1D149;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK;So;0;L;;;;;N;;;;; +1D14A;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE;So;0;L;;;;;N;;;;; +1D14B;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK;So;0;L;;;;;N;;;;; +1D14C;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE;So;0;L;;;;;N;;;;; +1D14D;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK;So;0;L;;;;;N;;;;; +1D14E;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; +1D14F;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; +1D150;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE;So;0;L;;;;;N;;;;; +1D151;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK;So;0;L;;;;;N;;;;; +1D152;MUSICAL SYMBOL MOON NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D153;MUSICAL SYMBOL MOON NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D154;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; +1D155;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; +1D156;MUSICAL SYMBOL PARENTHESIS NOTEHEAD;So;0;L;;;;;N;;;;; +1D157;MUSICAL SYMBOL VOID NOTEHEAD;So;0;L;;;;;N;;;;; +1D158;MUSICAL SYMBOL NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D159;MUSICAL SYMBOL NULL NOTEHEAD;So;0;L;;;;;N;;;;; +1D15A;MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D15B;MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D15C;MUSICAL SYMBOL BREVE;So;0;L;;;;;N;;;;; +1D15D;MUSICAL SYMBOL WHOLE NOTE;So;0;L;;;;;N;;;;; +1D15E;MUSICAL SYMBOL HALF NOTE;So;0;L;1D157 1D165;;;;N;;;;; +1D15F;MUSICAL SYMBOL QUARTER NOTE;So;0;L;1D158 1D165;;;;N;;;;; +1D160;MUSICAL SYMBOL EIGHTH NOTE;So;0;L;1D15F 1D16E;;;;N;;;;; +1D161;MUSICAL SYMBOL SIXTEENTH NOTE;So;0;L;1D15F 1D16F;;;;N;;;;; +1D162;MUSICAL SYMBOL THIRTY-SECOND NOTE;So;0;L;1D15F 1D170;;;;N;;;;; +1D163;MUSICAL SYMBOL SIXTY-FOURTH NOTE;So;0;L;1D15F 1D171;;;;N;;;;; +1D164;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE;So;0;L;1D15F 1D172;;;;N;;;;; +1D165;MUSICAL SYMBOL COMBINING STEM;Mc;216;L;;;;;N;;;;; +1D166;MUSICAL SYMBOL COMBINING SPRECHGESANG STEM;Mc;216;L;;;;;N;;;;; +1D167;MUSICAL SYMBOL COMBINING TREMOLO-1;Mn;1;NSM;;;;;N;;;;; +1D168;MUSICAL SYMBOL COMBINING TREMOLO-2;Mn;1;NSM;;;;;N;;;;; +1D169;MUSICAL SYMBOL COMBINING TREMOLO-3;Mn;1;NSM;;;;;N;;;;; +1D16A;MUSICAL SYMBOL FINGERED TREMOLO-1;So;0;L;;;;;N;;;;; +1D16B;MUSICAL SYMBOL FINGERED TREMOLO-2;So;0;L;;;;;N;;;;; +1D16C;MUSICAL SYMBOL FINGERED TREMOLO-3;So;0;L;;;;;N;;;;; +1D16D;MUSICAL SYMBOL COMBINING AUGMENTATION DOT;Mc;226;L;;;;;N;;;;; +1D16E;MUSICAL SYMBOL COMBINING FLAG-1;Mc;216;L;;;;;N;;;;; +1D16F;MUSICAL SYMBOL COMBINING FLAG-2;Mc;216;L;;;;;N;;;;; +1D170;MUSICAL SYMBOL COMBINING FLAG-3;Mc;216;L;;;;;N;;;;; +1D171;MUSICAL SYMBOL COMBINING FLAG-4;Mc;216;L;;;;;N;;;;; +1D172;MUSICAL SYMBOL COMBINING FLAG-5;Mc;216;L;;;;;N;;;;; +1D173;MUSICAL SYMBOL BEGIN BEAM;Cf;0;BN;;;;;N;;;;; +1D174;MUSICAL SYMBOL END BEAM;Cf;0;BN;;;;;N;;;;; +1D175;MUSICAL SYMBOL BEGIN TIE;Cf;0;BN;;;;;N;;;;; +1D176;MUSICAL SYMBOL END TIE;Cf;0;BN;;;;;N;;;;; +1D177;MUSICAL SYMBOL BEGIN SLUR;Cf;0;BN;;;;;N;;;;; +1D178;MUSICAL SYMBOL END SLUR;Cf;0;BN;;;;;N;;;;; +1D179;MUSICAL SYMBOL BEGIN PHRASE;Cf;0;BN;;;;;N;;;;; +1D17A;MUSICAL SYMBOL END PHRASE;Cf;0;BN;;;;;N;;;;; +1D17B;MUSICAL SYMBOL COMBINING ACCENT;Mn;220;NSM;;;;;N;;;;; +1D17C;MUSICAL SYMBOL COMBINING STACCATO;Mn;220;NSM;;;;;N;;;;; +1D17D;MUSICAL SYMBOL COMBINING TENUTO;Mn;220;NSM;;;;;N;;;;; +1D17E;MUSICAL SYMBOL COMBINING STACCATISSIMO;Mn;220;NSM;;;;;N;;;;; +1D17F;MUSICAL SYMBOL COMBINING MARCATO;Mn;220;NSM;;;;;N;;;;; +1D180;MUSICAL SYMBOL COMBINING MARCATO-STACCATO;Mn;220;NSM;;;;;N;;;;; +1D181;MUSICAL SYMBOL COMBINING ACCENT-STACCATO;Mn;220;NSM;;;;;N;;;;; +1D182;MUSICAL SYMBOL COMBINING LOURE;Mn;220;NSM;;;;;N;;;;; +1D183;MUSICAL SYMBOL ARPEGGIATO UP;So;0;L;;;;;N;;;;; +1D184;MUSICAL SYMBOL ARPEGGIATO DOWN;So;0;L;;;;;N;;;;; +1D185;MUSICAL SYMBOL COMBINING DOIT;Mn;230;NSM;;;;;N;;;;; +1D186;MUSICAL SYMBOL COMBINING RIP;Mn;230;NSM;;;;;N;;;;; +1D187;MUSICAL SYMBOL COMBINING FLIP;Mn;230;NSM;;;;;N;;;;; +1D188;MUSICAL SYMBOL COMBINING SMEAR;Mn;230;NSM;;;;;N;;;;; +1D189;MUSICAL SYMBOL COMBINING BEND;Mn;230;NSM;;;;;N;;;;; +1D18A;MUSICAL SYMBOL COMBINING DOUBLE TONGUE;Mn;220;NSM;;;;;N;;;;; +1D18B;MUSICAL SYMBOL COMBINING TRIPLE TONGUE;Mn;220;NSM;;;;;N;;;;; +1D18C;MUSICAL SYMBOL RINFORZANDO;So;0;L;;;;;N;;;;; +1D18D;MUSICAL SYMBOL SUBITO;So;0;L;;;;;N;;;;; +1D18E;MUSICAL SYMBOL Z;So;0;L;;;;;N;;;;; +1D18F;MUSICAL SYMBOL PIANO;So;0;L;;;;;N;;;;; +1D190;MUSICAL SYMBOL MEZZO;So;0;L;;;;;N;;;;; +1D191;MUSICAL SYMBOL FORTE;So;0;L;;;;;N;;;;; +1D192;MUSICAL SYMBOL CRESCENDO;So;0;L;;;;;N;;;;; +1D193;MUSICAL SYMBOL DECRESCENDO;So;0;L;;;;;N;;;;; +1D194;MUSICAL SYMBOL GRACE NOTE SLASH;So;0;L;;;;;N;;;;; +1D195;MUSICAL SYMBOL GRACE NOTE NO SLASH;So;0;L;;;;;N;;;;; +1D196;MUSICAL SYMBOL TR;So;0;L;;;;;N;;;;; +1D197;MUSICAL SYMBOL TURN;So;0;L;;;;;N;;;;; +1D198;MUSICAL SYMBOL INVERTED TURN;So;0;L;;;;;N;;;;; +1D199;MUSICAL SYMBOL TURN SLASH;So;0;L;;;;;N;;;;; +1D19A;MUSICAL SYMBOL TURN UP;So;0;L;;;;;N;;;;; +1D19B;MUSICAL SYMBOL ORNAMENT STROKE-1;So;0;L;;;;;N;;;;; +1D19C;MUSICAL SYMBOL ORNAMENT STROKE-2;So;0;L;;;;;N;;;;; +1D19D;MUSICAL SYMBOL ORNAMENT STROKE-3;So;0;L;;;;;N;;;;; +1D19E;MUSICAL SYMBOL ORNAMENT STROKE-4;So;0;L;;;;;N;;;;; +1D19F;MUSICAL SYMBOL ORNAMENT STROKE-5;So;0;L;;;;;N;;;;; +1D1A0;MUSICAL SYMBOL ORNAMENT STROKE-6;So;0;L;;;;;N;;;;; +1D1A1;MUSICAL SYMBOL ORNAMENT STROKE-7;So;0;L;;;;;N;;;;; +1D1A2;MUSICAL SYMBOL ORNAMENT STROKE-8;So;0;L;;;;;N;;;;; +1D1A3;MUSICAL SYMBOL ORNAMENT STROKE-9;So;0;L;;;;;N;;;;; +1D1A4;MUSICAL SYMBOL ORNAMENT STROKE-10;So;0;L;;;;;N;;;;; +1D1A5;MUSICAL SYMBOL ORNAMENT STROKE-11;So;0;L;;;;;N;;;;; +1D1A6;MUSICAL SYMBOL HAUPTSTIMME;So;0;L;;;;;N;;;;; +1D1A7;MUSICAL SYMBOL NEBENSTIMME;So;0;L;;;;;N;;;;; +1D1A8;MUSICAL SYMBOL END OF STIMME;So;0;L;;;;;N;;;;; +1D1A9;MUSICAL SYMBOL DEGREE SLASH;So;0;L;;;;;N;;;;; +1D1AA;MUSICAL SYMBOL COMBINING DOWN BOW;Mn;230;NSM;;;;;N;;;;; +1D1AB;MUSICAL SYMBOL COMBINING UP BOW;Mn;230;NSM;;;;;N;;;;; +1D1AC;MUSICAL SYMBOL COMBINING HARMONIC;Mn;230;NSM;;;;;N;;;;; +1D1AD;MUSICAL SYMBOL COMBINING SNAP PIZZICATO;Mn;230;NSM;;;;;N;;;;; +1D1AE;MUSICAL SYMBOL PEDAL MARK;So;0;L;;;;;N;;;;; +1D1AF;MUSICAL SYMBOL PEDAL UP MARK;So;0;L;;;;;N;;;;; +1D1B0;MUSICAL SYMBOL HALF PEDAL MARK;So;0;L;;;;;N;;;;; +1D1B1;MUSICAL SYMBOL GLISSANDO UP;So;0;L;;;;;N;;;;; +1D1B2;MUSICAL SYMBOL GLISSANDO DOWN;So;0;L;;;;;N;;;;; +1D1B3;MUSICAL SYMBOL WITH FINGERNAILS;So;0;L;;;;;N;;;;; +1D1B4;MUSICAL SYMBOL DAMP;So;0;L;;;;;N;;;;; +1D1B5;MUSICAL SYMBOL DAMP ALL;So;0;L;;;;;N;;;;; +1D1B6;MUSICAL SYMBOL MAXIMA;So;0;L;;;;;N;;;;; +1D1B7;MUSICAL SYMBOL LONGA;So;0;L;;;;;N;;;;; +1D1B8;MUSICAL SYMBOL BREVIS;So;0;L;;;;;N;;;;; +1D1B9;MUSICAL SYMBOL SEMIBREVIS WHITE;So;0;L;;;;;N;;;;; +1D1BA;MUSICAL SYMBOL SEMIBREVIS BLACK;So;0;L;;;;;N;;;;; +1D1BB;MUSICAL SYMBOL MINIMA;So;0;L;1D1B9 1D165;;;;N;;;;; +1D1BC;MUSICAL SYMBOL MINIMA BLACK;So;0;L;1D1BA 1D165;;;;N;;;;; +1D1BD;MUSICAL SYMBOL SEMIMINIMA WHITE;So;0;L;1D1BB 1D16E;;;;N;;;;; +1D1BE;MUSICAL SYMBOL SEMIMINIMA BLACK;So;0;L;1D1BC 1D16E;;;;N;;;;; +1D1BF;MUSICAL SYMBOL FUSA WHITE;So;0;L;1D1BB 1D16F;;;;N;;;;; +1D1C0;MUSICAL SYMBOL FUSA BLACK;So;0;L;1D1BC 1D16F;;;;N;;;;; +1D1C1;MUSICAL SYMBOL LONGA PERFECTA REST;So;0;L;;;;;N;;;;; +1D1C2;MUSICAL SYMBOL LONGA IMPERFECTA REST;So;0;L;;;;;N;;;;; +1D1C3;MUSICAL SYMBOL BREVIS REST;So;0;L;;;;;N;;;;; +1D1C4;MUSICAL SYMBOL SEMIBREVIS REST;So;0;L;;;;;N;;;;; +1D1C5;MUSICAL SYMBOL MINIMA REST;So;0;L;;;;;N;;;;; +1D1C6;MUSICAL SYMBOL SEMIMINIMA REST;So;0;L;;;;;N;;;;; +1D1C7;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; +1D1C8;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; +1D1C9;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; +1D1CA;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; +1D1CB;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; +1D1CC;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; +1D1CD;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2;So;0;L;;;;;N;;;;; +1D1CE;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3;So;0;L;;;;;N;;;;; +1D1CF;MUSICAL SYMBOL CROIX;So;0;L;;;;;N;;;;; +1D1D0;MUSICAL SYMBOL GREGORIAN C CLEF;So;0;L;;;;;N;;;;; +1D1D1;MUSICAL SYMBOL GREGORIAN F CLEF;So;0;L;;;;;N;;;;; +1D1D2;MUSICAL SYMBOL SQUARE B;So;0;L;;;;;N;;;;; +1D1D3;MUSICAL SYMBOL VIRGA;So;0;L;;;;;N;;;;; +1D1D4;MUSICAL SYMBOL PODATUS;So;0;L;;;;;N;;;;; +1D1D5;MUSICAL SYMBOL CLIVIS;So;0;L;;;;;N;;;;; +1D1D6;MUSICAL SYMBOL SCANDICUS;So;0;L;;;;;N;;;;; +1D1D7;MUSICAL SYMBOL CLIMACUS;So;0;L;;;;;N;;;;; +1D1D8;MUSICAL SYMBOL TORCULUS;So;0;L;;;;;N;;;;; +1D1D9;MUSICAL SYMBOL PORRECTUS;So;0;L;;;;;N;;;;; +1D1DA;MUSICAL SYMBOL PORRECTUS FLEXUS;So;0;L;;;;;N;;;;; +1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;; +1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;; +1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;; +1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; +1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; +1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;; +1D203;GREEK VOCAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; +1D204;GREEK VOCAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; +1D205;GREEK VOCAL NOTATION SYMBOL-6;So;0;ON;;;;;N;;;;; +1D206;GREEK VOCAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; +1D207;GREEK VOCAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; +1D208;GREEK VOCAL NOTATION SYMBOL-9;So;0;ON;;;;;N;;;;; +1D209;GREEK VOCAL NOTATION SYMBOL-10;So;0;ON;;;;;N;;;;; +1D20A;GREEK VOCAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; +1D20B;GREEK VOCAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; +1D20C;GREEK VOCAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; +1D20D;GREEK VOCAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; +1D20E;GREEK VOCAL NOTATION SYMBOL-15;So;0;ON;;;;;N;;;;; +1D20F;GREEK VOCAL NOTATION SYMBOL-16;So;0;ON;;;;;N;;;;; +1D210;GREEK VOCAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; +1D211;GREEK VOCAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; +1D212;GREEK VOCAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; +1D213;GREEK VOCAL NOTATION SYMBOL-20;So;0;ON;;;;;N;;;;; +1D214;GREEK VOCAL NOTATION SYMBOL-21;So;0;ON;;;;;N;;;;; +1D215;GREEK VOCAL NOTATION SYMBOL-22;So;0;ON;;;;;N;;;;; +1D216;GREEK VOCAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; +1D217;GREEK VOCAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; +1D218;GREEK VOCAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; +1D219;GREEK VOCAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; +1D21A;GREEK VOCAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; +1D21B;GREEK VOCAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; +1D21C;GREEK VOCAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; +1D21D;GREEK INSTRUMENTAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; +1D21E;GREEK INSTRUMENTAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; +1D21F;GREEK INSTRUMENTAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; +1D220;GREEK INSTRUMENTAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; +1D221;GREEK INSTRUMENTAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; +1D222;GREEK INSTRUMENTAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; +1D223;GREEK INSTRUMENTAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; +1D224;GREEK INSTRUMENTAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; +1D225;GREEK INSTRUMENTAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; +1D226;GREEK INSTRUMENTAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; +1D227;GREEK INSTRUMENTAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; +1D228;GREEK INSTRUMENTAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; +1D229;GREEK INSTRUMENTAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; +1D22A;GREEK INSTRUMENTAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; +1D22B;GREEK INSTRUMENTAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; +1D22C;GREEK INSTRUMENTAL NOTATION SYMBOL-25;So;0;ON;;;;;N;;;;; +1D22D;GREEK INSTRUMENTAL NOTATION SYMBOL-26;So;0;ON;;;;;N;;;;; +1D22E;GREEK INSTRUMENTAL NOTATION SYMBOL-27;So;0;ON;;;;;N;;;;; +1D22F;GREEK INSTRUMENTAL NOTATION SYMBOL-29;So;0;ON;;;;;N;;;;; +1D230;GREEK INSTRUMENTAL NOTATION SYMBOL-30;So;0;ON;;;;;N;;;;; +1D231;GREEK INSTRUMENTAL NOTATION SYMBOL-32;So;0;ON;;;;;N;;;;; +1D232;GREEK INSTRUMENTAL NOTATION SYMBOL-36;So;0;ON;;;;;N;;;;; +1D233;GREEK INSTRUMENTAL NOTATION SYMBOL-37;So;0;ON;;;;;N;;;;; +1D234;GREEK INSTRUMENTAL NOTATION SYMBOL-38;So;0;ON;;;;;N;;;;; +1D235;GREEK INSTRUMENTAL NOTATION SYMBOL-39;So;0;ON;;;;;N;;;;; +1D236;GREEK INSTRUMENTAL NOTATION SYMBOL-40;So;0;ON;;;;;N;;;;; +1D237;GREEK INSTRUMENTAL NOTATION SYMBOL-42;So;0;ON;;;;;N;;;;; +1D238;GREEK INSTRUMENTAL NOTATION SYMBOL-43;So;0;ON;;;;;N;;;;; +1D239;GREEK INSTRUMENTAL NOTATION SYMBOL-45;So;0;ON;;;;;N;;;;; +1D23A;GREEK INSTRUMENTAL NOTATION SYMBOL-47;So;0;ON;;;;;N;;;;; +1D23B;GREEK INSTRUMENTAL NOTATION SYMBOL-48;So;0;ON;;;;;N;;;;; +1D23C;GREEK INSTRUMENTAL NOTATION SYMBOL-49;So;0;ON;;;;;N;;;;; +1D23D;GREEK INSTRUMENTAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; +1D23E;GREEK INSTRUMENTAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; +1D23F;GREEK INSTRUMENTAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; +1D240;GREEK INSTRUMENTAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; +1D241;GREEK INSTRUMENTAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; +1D242;COMBINING GREEK MUSICAL TRISEME;Mn;230;NSM;;;;;N;;;;; +1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;; +1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;; +1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;; +1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;;;; +1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;;;; +1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;;;; +1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;;;; +1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +1D306;TETRAGRAM FOR CENTRE;So;0;ON;;;;;N;;;;; +1D307;TETRAGRAM FOR FULL CIRCLE;So;0;ON;;;;;N;;;;; +1D308;TETRAGRAM FOR MIRED;So;0;ON;;;;;N;;;;; +1D309;TETRAGRAM FOR BARRIER;So;0;ON;;;;;N;;;;; +1D30A;TETRAGRAM FOR KEEPING SMALL;So;0;ON;;;;;N;;;;; +1D30B;TETRAGRAM FOR CONTRARIETY;So;0;ON;;;;;N;;;;; +1D30C;TETRAGRAM FOR ASCENT;So;0;ON;;;;;N;;;;; +1D30D;TETRAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;; +1D30E;TETRAGRAM FOR BRANCHING OUT;So;0;ON;;;;;N;;;;; +1D30F;TETRAGRAM FOR DEFECTIVENESS OR DISTORTION;So;0;ON;;;;;N;;;;; +1D310;TETRAGRAM FOR DIVERGENCE;So;0;ON;;;;;N;;;;; +1D311;TETRAGRAM FOR YOUTHFULNESS;So;0;ON;;;;;N;;;;; +1D312;TETRAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;; +1D313;TETRAGRAM FOR PENETRATION;So;0;ON;;;;;N;;;;; +1D314;TETRAGRAM FOR REACH;So;0;ON;;;;;N;;;;; +1D315;TETRAGRAM FOR CONTACT;So;0;ON;;;;;N;;;;; +1D316;TETRAGRAM FOR HOLDING BACK;So;0;ON;;;;;N;;;;; +1D317;TETRAGRAM FOR WAITING;So;0;ON;;;;;N;;;;; +1D318;TETRAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;; +1D319;TETRAGRAM FOR ADVANCE;So;0;ON;;;;;N;;;;; +1D31A;TETRAGRAM FOR RELEASE;So;0;ON;;;;;N;;;;; +1D31B;TETRAGRAM FOR RESISTANCE;So;0;ON;;;;;N;;;;; +1D31C;TETRAGRAM FOR EASE;So;0;ON;;;;;N;;;;; +1D31D;TETRAGRAM FOR JOY;So;0;ON;;;;;N;;;;; +1D31E;TETRAGRAM FOR CONTENTION;So;0;ON;;;;;N;;;;; +1D31F;TETRAGRAM FOR ENDEAVOUR;So;0;ON;;;;;N;;;;; +1D320;TETRAGRAM FOR DUTIES;So;0;ON;;;;;N;;;;; +1D321;TETRAGRAM FOR CHANGE;So;0;ON;;;;;N;;;;; +1D322;TETRAGRAM FOR DECISIVENESS;So;0;ON;;;;;N;;;;; +1D323;TETRAGRAM FOR BOLD RESOLUTION;So;0;ON;;;;;N;;;;; +1D324;TETRAGRAM FOR PACKING;So;0;ON;;;;;N;;;;; +1D325;TETRAGRAM FOR LEGION;So;0;ON;;;;;N;;;;; +1D326;TETRAGRAM FOR CLOSENESS;So;0;ON;;;;;N;;;;; +1D327;TETRAGRAM FOR KINSHIP;So;0;ON;;;;;N;;;;; +1D328;TETRAGRAM FOR GATHERING;So;0;ON;;;;;N;;;;; +1D329;TETRAGRAM FOR STRENGTH;So;0;ON;;;;;N;;;;; +1D32A;TETRAGRAM FOR PURITY;So;0;ON;;;;;N;;;;; +1D32B;TETRAGRAM FOR FULLNESS;So;0;ON;;;;;N;;;;; +1D32C;TETRAGRAM FOR RESIDENCE;So;0;ON;;;;;N;;;;; +1D32D;TETRAGRAM FOR LAW OR MODEL;So;0;ON;;;;;N;;;;; +1D32E;TETRAGRAM FOR RESPONSE;So;0;ON;;;;;N;;;;; +1D32F;TETRAGRAM FOR GOING TO MEET;So;0;ON;;;;;N;;;;; +1D330;TETRAGRAM FOR ENCOUNTERS;So;0;ON;;;;;N;;;;; +1D331;TETRAGRAM FOR STOVE;So;0;ON;;;;;N;;;;; +1D332;TETRAGRAM FOR GREATNESS;So;0;ON;;;;;N;;;;; +1D333;TETRAGRAM FOR ENLARGEMENT;So;0;ON;;;;;N;;;;; +1D334;TETRAGRAM FOR PATTERN;So;0;ON;;;;;N;;;;; +1D335;TETRAGRAM FOR RITUAL;So;0;ON;;;;;N;;;;; +1D336;TETRAGRAM FOR FLIGHT;So;0;ON;;;;;N;;;;; +1D337;TETRAGRAM FOR VASTNESS OR WASTING;So;0;ON;;;;;N;;;;; +1D338;TETRAGRAM FOR CONSTANCY;So;0;ON;;;;;N;;;;; +1D339;TETRAGRAM FOR MEASURE;So;0;ON;;;;;N;;;;; +1D33A;TETRAGRAM FOR ETERNITY;So;0;ON;;;;;N;;;;; +1D33B;TETRAGRAM FOR UNITY;So;0;ON;;;;;N;;;;; +1D33C;TETRAGRAM FOR DIMINISHMENT;So;0;ON;;;;;N;;;;; +1D33D;TETRAGRAM FOR CLOSED MOUTH;So;0;ON;;;;;N;;;;; +1D33E;TETRAGRAM FOR GUARDEDNESS;So;0;ON;;;;;N;;;;; +1D33F;TETRAGRAM FOR GATHERING IN;So;0;ON;;;;;N;;;;; +1D340;TETRAGRAM FOR MASSING;So;0;ON;;;;;N;;;;; +1D341;TETRAGRAM FOR ACCUMULATION;So;0;ON;;;;;N;;;;; +1D342;TETRAGRAM FOR EMBELLISHMENT;So;0;ON;;;;;N;;;;; +1D343;TETRAGRAM FOR DOUBT;So;0;ON;;;;;N;;;;; +1D344;TETRAGRAM FOR WATCH;So;0;ON;;;;;N;;;;; +1D345;TETRAGRAM FOR SINKING;So;0;ON;;;;;N;;;;; +1D346;TETRAGRAM FOR INNER;So;0;ON;;;;;N;;;;; +1D347;TETRAGRAM FOR DEPARTURE;So;0;ON;;;;;N;;;;; +1D348;TETRAGRAM FOR DARKENING;So;0;ON;;;;;N;;;;; +1D349;TETRAGRAM FOR DIMMING;So;0;ON;;;;;N;;;;; +1D34A;TETRAGRAM FOR EXHAUSTION;So;0;ON;;;;;N;;;;; +1D34B;TETRAGRAM FOR SEVERANCE;So;0;ON;;;;;N;;;;; +1D34C;TETRAGRAM FOR STOPPAGE;So;0;ON;;;;;N;;;;; +1D34D;TETRAGRAM FOR HARDNESS;So;0;ON;;;;;N;;;;; +1D34E;TETRAGRAM FOR COMPLETION;So;0;ON;;;;;N;;;;; +1D34F;TETRAGRAM FOR CLOSURE;So;0;ON;;;;;N;;;;; +1D350;TETRAGRAM FOR FAILURE;So;0;ON;;;;;N;;;;; +1D351;TETRAGRAM FOR AGGRAVATION;So;0;ON;;;;;N;;;;; +1D352;TETRAGRAM FOR COMPLIANCE;So;0;ON;;;;;N;;;;; +1D353;TETRAGRAM FOR ON THE VERGE;So;0;ON;;;;;N;;;;; +1D354;TETRAGRAM FOR DIFFICULTIES;So;0;ON;;;;;N;;;;; +1D355;TETRAGRAM FOR LABOURING;So;0;ON;;;;;N;;;;; +1D356;TETRAGRAM FOR FOSTERING;So;0;ON;;;;;N;;;;; +1D360;COUNTING ROD UNIT DIGIT ONE;No;0;L;;;;1;N;;;;; +1D361;COUNTING ROD UNIT DIGIT TWO;No;0;L;;;;2;N;;;;; +1D362;COUNTING ROD UNIT DIGIT THREE;No;0;L;;;;3;N;;;;; +1D363;COUNTING ROD UNIT DIGIT FOUR;No;0;L;;;;4;N;;;;; +1D364;COUNTING ROD UNIT DIGIT FIVE;No;0;L;;;;5;N;;;;; +1D365;COUNTING ROD UNIT DIGIT SIX;No;0;L;;;;6;N;;;;; +1D366;COUNTING ROD UNIT DIGIT SEVEN;No;0;L;;;;7;N;;;;; +1D367;COUNTING ROD UNIT DIGIT EIGHT;No;0;L;;;;8;N;;;;; +1D368;COUNTING ROD UNIT DIGIT NINE;No;0;L;;;;9;N;;;;; +1D369;COUNTING ROD TENS DIGIT ONE;No;0;L;;;;10;N;;;;; +1D36A;COUNTING ROD TENS DIGIT TWO;No;0;L;;;;20;N;;;;; +1D36B;COUNTING ROD TENS DIGIT THREE;No;0;L;;;;30;N;;;;; +1D36C;COUNTING ROD TENS DIGIT FOUR;No;0;L;;;;40;N;;;;; +1D36D;COUNTING ROD TENS DIGIT FIVE;No;0;L;;;;50;N;;;;; +1D36E;COUNTING ROD TENS DIGIT SIX;No;0;L;;;;60;N;;;;; +1D36F;COUNTING ROD TENS DIGIT SEVEN;No;0;L;;;;70;N;;;;; +1D370;COUNTING ROD TENS DIGIT EIGHT;No;0;L;;;;80;N;;;;; +1D371;COUNTING ROD TENS DIGIT NINE;No;0;L;;;;90;N;;;;; +1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D403;MATHEMATICAL BOLD CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D404;MATHEMATICAL BOLD CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D405;MATHEMATICAL BOLD CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D406;MATHEMATICAL BOLD CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D407;MATHEMATICAL BOLD CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D408;MATHEMATICAL BOLD CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D409;MATHEMATICAL BOLD CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D40A;MATHEMATICAL BOLD CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D40B;MATHEMATICAL BOLD CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D40C;MATHEMATICAL BOLD CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D40D;MATHEMATICAL BOLD CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D40E;MATHEMATICAL BOLD CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D40F;MATHEMATICAL BOLD CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D410;MATHEMATICAL BOLD CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D411;MATHEMATICAL BOLD CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D412;MATHEMATICAL BOLD CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D413;MATHEMATICAL BOLD CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D414;MATHEMATICAL BOLD CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D415;MATHEMATICAL BOLD CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D416;MATHEMATICAL BOLD CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D417;MATHEMATICAL BOLD CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D418;MATHEMATICAL BOLD CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D419;MATHEMATICAL BOLD CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D41A;MATHEMATICAL BOLD SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D41B;MATHEMATICAL BOLD SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D41C;MATHEMATICAL BOLD SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D41D;MATHEMATICAL BOLD SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D41E;MATHEMATICAL BOLD SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D41F;MATHEMATICAL BOLD SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D420;MATHEMATICAL BOLD SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D421;MATHEMATICAL BOLD SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D422;MATHEMATICAL BOLD SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D423;MATHEMATICAL BOLD SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D424;MATHEMATICAL BOLD SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D425;MATHEMATICAL BOLD SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D426;MATHEMATICAL BOLD SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D427;MATHEMATICAL BOLD SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D428;MATHEMATICAL BOLD SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D429;MATHEMATICAL BOLD SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D42A;MATHEMATICAL BOLD SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D42B;MATHEMATICAL BOLD SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D42C;MATHEMATICAL BOLD SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D42D;MATHEMATICAL BOLD SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D42E;MATHEMATICAL BOLD SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D42F;MATHEMATICAL BOLD SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D430;MATHEMATICAL BOLD SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D431;MATHEMATICAL BOLD SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D432;MATHEMATICAL BOLD SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D433;MATHEMATICAL BOLD SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D434;MATHEMATICAL ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D435;MATHEMATICAL ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D436;MATHEMATICAL ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D437;MATHEMATICAL ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D438;MATHEMATICAL ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D439;MATHEMATICAL ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D43A;MATHEMATICAL ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D43B;MATHEMATICAL ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D43C;MATHEMATICAL ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D43D;MATHEMATICAL ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D43E;MATHEMATICAL ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D43F;MATHEMATICAL ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D440;MATHEMATICAL ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D441;MATHEMATICAL ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D442;MATHEMATICAL ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D443;MATHEMATICAL ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D444;MATHEMATICAL ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D445;MATHEMATICAL ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D446;MATHEMATICAL ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D447;MATHEMATICAL ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D448;MATHEMATICAL ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D449;MATHEMATICAL ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D44A;MATHEMATICAL ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D44B;MATHEMATICAL ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D44C;MATHEMATICAL ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D44D;MATHEMATICAL ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D44E;MATHEMATICAL ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D44F;MATHEMATICAL ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D450;MATHEMATICAL ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D451;MATHEMATICAL ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D452;MATHEMATICAL ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D453;MATHEMATICAL ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D454;MATHEMATICAL ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D456;MATHEMATICAL ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D457;MATHEMATICAL ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D458;MATHEMATICAL ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D459;MATHEMATICAL ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D45A;MATHEMATICAL ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D45B;MATHEMATICAL ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D45C;MATHEMATICAL ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D45D;MATHEMATICAL ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D45E;MATHEMATICAL ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D45F;MATHEMATICAL ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D460;MATHEMATICAL ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D461;MATHEMATICAL ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D462;MATHEMATICAL ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D463;MATHEMATICAL ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D464;MATHEMATICAL ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D465;MATHEMATICAL ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D466;MATHEMATICAL ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D467;MATHEMATICAL ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D468;MATHEMATICAL BOLD ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D469;MATHEMATICAL BOLD ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D46A;MATHEMATICAL BOLD ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D46B;MATHEMATICAL BOLD ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D46C;MATHEMATICAL BOLD ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D46D;MATHEMATICAL BOLD ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D46E;MATHEMATICAL BOLD ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D46F;MATHEMATICAL BOLD ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D470;MATHEMATICAL BOLD ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D471;MATHEMATICAL BOLD ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D472;MATHEMATICAL BOLD ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D473;MATHEMATICAL BOLD ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D474;MATHEMATICAL BOLD ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D475;MATHEMATICAL BOLD ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D476;MATHEMATICAL BOLD ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D477;MATHEMATICAL BOLD ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D478;MATHEMATICAL BOLD ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D479;MATHEMATICAL BOLD ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D47A;MATHEMATICAL BOLD ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D47B;MATHEMATICAL BOLD ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D47C;MATHEMATICAL BOLD ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D47D;MATHEMATICAL BOLD ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D47E;MATHEMATICAL BOLD ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D47F;MATHEMATICAL BOLD ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D480;MATHEMATICAL BOLD ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D481;MATHEMATICAL BOLD ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D482;MATHEMATICAL BOLD ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D483;MATHEMATICAL BOLD ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D484;MATHEMATICAL BOLD ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D485;MATHEMATICAL BOLD ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D486;MATHEMATICAL BOLD ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D487;MATHEMATICAL BOLD ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D488;MATHEMATICAL BOLD ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D489;MATHEMATICAL BOLD ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D48A;MATHEMATICAL BOLD ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D48B;MATHEMATICAL BOLD ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D48C;MATHEMATICAL BOLD ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D48D;MATHEMATICAL BOLD ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D48E;MATHEMATICAL BOLD ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D48F;MATHEMATICAL BOLD ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D490;MATHEMATICAL BOLD ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D491;MATHEMATICAL BOLD ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D492;MATHEMATICAL BOLD ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D493;MATHEMATICAL BOLD ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D494;MATHEMATICAL BOLD ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D495;MATHEMATICAL BOLD ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D496;MATHEMATICAL BOLD ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D497;MATHEMATICAL BOLD ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D498;MATHEMATICAL BOLD ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D499;MATHEMATICAL BOLD ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D49A;MATHEMATICAL BOLD ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D49B;MATHEMATICAL BOLD ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D49C;MATHEMATICAL SCRIPT CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D49E;MATHEMATICAL SCRIPT CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D49F;MATHEMATICAL SCRIPT CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D4A2;MATHEMATICAL SCRIPT CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D4A5;MATHEMATICAL SCRIPT CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D4A6;MATHEMATICAL SCRIPT CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D4A9;MATHEMATICAL SCRIPT CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D4AA;MATHEMATICAL SCRIPT CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D4AB;MATHEMATICAL SCRIPT CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D4AC;MATHEMATICAL SCRIPT CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D4AE;MATHEMATICAL SCRIPT CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D4AF;MATHEMATICAL SCRIPT CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D4B0;MATHEMATICAL SCRIPT CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D4B1;MATHEMATICAL SCRIPT CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D4B2;MATHEMATICAL SCRIPT CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D4B3;MATHEMATICAL SCRIPT CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D4B4;MATHEMATICAL SCRIPT CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D4B5;MATHEMATICAL SCRIPT CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D4B6;MATHEMATICAL SCRIPT SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D4B7;MATHEMATICAL SCRIPT SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D4B8;MATHEMATICAL SCRIPT SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D4B9;MATHEMATICAL SCRIPT SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D4BB;MATHEMATICAL SCRIPT SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D4BD;MATHEMATICAL SCRIPT SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D4BE;MATHEMATICAL SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D4BF;MATHEMATICAL SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D4C0;MATHEMATICAL SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D4C1;MATHEMATICAL SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D4C2;MATHEMATICAL SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D4C3;MATHEMATICAL SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D4C5;MATHEMATICAL SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D4C6;MATHEMATICAL SCRIPT SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D4C7;MATHEMATICAL SCRIPT SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D4C8;MATHEMATICAL SCRIPT SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D4C9;MATHEMATICAL SCRIPT SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D4CA;MATHEMATICAL SCRIPT SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D4CB;MATHEMATICAL SCRIPT SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D4CC;MATHEMATICAL SCRIPT SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D4CD;MATHEMATICAL SCRIPT SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D4CE;MATHEMATICAL SCRIPT SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D4CF;MATHEMATICAL SCRIPT SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D4D0;MATHEMATICAL BOLD SCRIPT CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D4D1;MATHEMATICAL BOLD SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D4D2;MATHEMATICAL BOLD SCRIPT CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D4D3;MATHEMATICAL BOLD SCRIPT CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D4D4;MATHEMATICAL BOLD SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D4D5;MATHEMATICAL BOLD SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D4D6;MATHEMATICAL BOLD SCRIPT CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D4D7;MATHEMATICAL BOLD SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D4D8;MATHEMATICAL BOLD SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D4D9;MATHEMATICAL BOLD SCRIPT CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D4DA;MATHEMATICAL BOLD SCRIPT CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D4DB;MATHEMATICAL BOLD SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D4DC;MATHEMATICAL BOLD SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D4DD;MATHEMATICAL BOLD SCRIPT CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D4DE;MATHEMATICAL BOLD SCRIPT CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D4DF;MATHEMATICAL BOLD SCRIPT CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D4E0;MATHEMATICAL BOLD SCRIPT CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D4E1;MATHEMATICAL BOLD SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D4E2;MATHEMATICAL BOLD SCRIPT CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D4E3;MATHEMATICAL BOLD SCRIPT CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D4E4;MATHEMATICAL BOLD SCRIPT CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D4E5;MATHEMATICAL BOLD SCRIPT CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D4E6;MATHEMATICAL BOLD SCRIPT CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D4E7;MATHEMATICAL BOLD SCRIPT CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D4E8;MATHEMATICAL BOLD SCRIPT CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D4E9;MATHEMATICAL BOLD SCRIPT CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D4EA;MATHEMATICAL BOLD SCRIPT SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D4EB;MATHEMATICAL BOLD SCRIPT SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D4EC;MATHEMATICAL BOLD SCRIPT SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D4ED;MATHEMATICAL BOLD SCRIPT SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D4EE;MATHEMATICAL BOLD SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D4EF;MATHEMATICAL BOLD SCRIPT SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D4F0;MATHEMATICAL BOLD SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D4F1;MATHEMATICAL BOLD SCRIPT SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D4F2;MATHEMATICAL BOLD SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D4F3;MATHEMATICAL BOLD SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D4F4;MATHEMATICAL BOLD SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D4F5;MATHEMATICAL BOLD SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D4F6;MATHEMATICAL BOLD SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D4F7;MATHEMATICAL BOLD SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D4F8;MATHEMATICAL BOLD SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D4F9;MATHEMATICAL BOLD SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D4FA;MATHEMATICAL BOLD SCRIPT SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D4FB;MATHEMATICAL BOLD SCRIPT SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D4FC;MATHEMATICAL BOLD SCRIPT SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D4FD;MATHEMATICAL BOLD SCRIPT SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D4FE;MATHEMATICAL BOLD SCRIPT SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D4FF;MATHEMATICAL BOLD SCRIPT SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D500;MATHEMATICAL BOLD SCRIPT SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D501;MATHEMATICAL BOLD SCRIPT SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D502;MATHEMATICAL BOLD SCRIPT SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D503;MATHEMATICAL BOLD SCRIPT SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D504;MATHEMATICAL FRAKTUR CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D505;MATHEMATICAL FRAKTUR CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D507;MATHEMATICAL FRAKTUR CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D508;MATHEMATICAL FRAKTUR CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D509;MATHEMATICAL FRAKTUR CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D50A;MATHEMATICAL FRAKTUR CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D50D;MATHEMATICAL FRAKTUR CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D50E;MATHEMATICAL FRAKTUR CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D50F;MATHEMATICAL FRAKTUR CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D510;MATHEMATICAL FRAKTUR CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D511;MATHEMATICAL FRAKTUR CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D512;MATHEMATICAL FRAKTUR CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D513;MATHEMATICAL FRAKTUR CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D514;MATHEMATICAL FRAKTUR CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D516;MATHEMATICAL FRAKTUR CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D517;MATHEMATICAL FRAKTUR CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D518;MATHEMATICAL FRAKTUR CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D519;MATHEMATICAL FRAKTUR CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D51A;MATHEMATICAL FRAKTUR CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D51B;MATHEMATICAL FRAKTUR CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D51C;MATHEMATICAL FRAKTUR CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D51E;MATHEMATICAL FRAKTUR SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D51F;MATHEMATICAL FRAKTUR SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D520;MATHEMATICAL FRAKTUR SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D521;MATHEMATICAL FRAKTUR SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D522;MATHEMATICAL FRAKTUR SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D523;MATHEMATICAL FRAKTUR SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D524;MATHEMATICAL FRAKTUR SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D525;MATHEMATICAL FRAKTUR SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D526;MATHEMATICAL FRAKTUR SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D527;MATHEMATICAL FRAKTUR SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D528;MATHEMATICAL FRAKTUR SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D529;MATHEMATICAL FRAKTUR SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D52A;MATHEMATICAL FRAKTUR SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D52B;MATHEMATICAL FRAKTUR SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D52C;MATHEMATICAL FRAKTUR SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D52D;MATHEMATICAL FRAKTUR SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D52E;MATHEMATICAL FRAKTUR SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D52F;MATHEMATICAL FRAKTUR SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D530;MATHEMATICAL FRAKTUR SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D531;MATHEMATICAL FRAKTUR SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D532;MATHEMATICAL FRAKTUR SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D533;MATHEMATICAL FRAKTUR SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D534;MATHEMATICAL FRAKTUR SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D535;MATHEMATICAL FRAKTUR SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D536;MATHEMATICAL FRAKTUR SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D537;MATHEMATICAL FRAKTUR SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D538;MATHEMATICAL DOUBLE-STRUCK CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D539;MATHEMATICAL DOUBLE-STRUCK CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D53B;MATHEMATICAL DOUBLE-STRUCK CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D53C;MATHEMATICAL DOUBLE-STRUCK CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D53D;MATHEMATICAL DOUBLE-STRUCK CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D53E;MATHEMATICAL DOUBLE-STRUCK CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D540;MATHEMATICAL DOUBLE-STRUCK CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D541;MATHEMATICAL DOUBLE-STRUCK CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D542;MATHEMATICAL DOUBLE-STRUCK CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D543;MATHEMATICAL DOUBLE-STRUCK CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D544;MATHEMATICAL DOUBLE-STRUCK CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D546;MATHEMATICAL DOUBLE-STRUCK CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D54A;MATHEMATICAL DOUBLE-STRUCK CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D54B;MATHEMATICAL DOUBLE-STRUCK CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D54C;MATHEMATICAL DOUBLE-STRUCK CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D54D;MATHEMATICAL DOUBLE-STRUCK CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D54E;MATHEMATICAL DOUBLE-STRUCK CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D54F;MATHEMATICAL DOUBLE-STRUCK CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D550;MATHEMATICAL DOUBLE-STRUCK CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D552;MATHEMATICAL DOUBLE-STRUCK SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D553;MATHEMATICAL DOUBLE-STRUCK SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D554;MATHEMATICAL DOUBLE-STRUCK SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D555;MATHEMATICAL DOUBLE-STRUCK SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D556;MATHEMATICAL DOUBLE-STRUCK SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D557;MATHEMATICAL DOUBLE-STRUCK SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D558;MATHEMATICAL DOUBLE-STRUCK SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D559;MATHEMATICAL DOUBLE-STRUCK SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D55A;MATHEMATICAL DOUBLE-STRUCK SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D55B;MATHEMATICAL DOUBLE-STRUCK SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D55C;MATHEMATICAL DOUBLE-STRUCK SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D55D;MATHEMATICAL DOUBLE-STRUCK SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D55E;MATHEMATICAL DOUBLE-STRUCK SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D55F;MATHEMATICAL DOUBLE-STRUCK SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D560;MATHEMATICAL DOUBLE-STRUCK SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D561;MATHEMATICAL DOUBLE-STRUCK SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D562;MATHEMATICAL DOUBLE-STRUCK SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D563;MATHEMATICAL DOUBLE-STRUCK SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D564;MATHEMATICAL DOUBLE-STRUCK SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D565;MATHEMATICAL DOUBLE-STRUCK SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D566;MATHEMATICAL DOUBLE-STRUCK SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D567;MATHEMATICAL DOUBLE-STRUCK SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D568;MATHEMATICAL DOUBLE-STRUCK SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D569;MATHEMATICAL DOUBLE-STRUCK SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D56A;MATHEMATICAL DOUBLE-STRUCK SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D56B;MATHEMATICAL DOUBLE-STRUCK SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D56C;MATHEMATICAL BOLD FRAKTUR CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D56D;MATHEMATICAL BOLD FRAKTUR CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D56E;MATHEMATICAL BOLD FRAKTUR CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D56F;MATHEMATICAL BOLD FRAKTUR CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D570;MATHEMATICAL BOLD FRAKTUR CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D571;MATHEMATICAL BOLD FRAKTUR CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D572;MATHEMATICAL BOLD FRAKTUR CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D573;MATHEMATICAL BOLD FRAKTUR CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D574;MATHEMATICAL BOLD FRAKTUR CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D575;MATHEMATICAL BOLD FRAKTUR CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D576;MATHEMATICAL BOLD FRAKTUR CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D577;MATHEMATICAL BOLD FRAKTUR CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D578;MATHEMATICAL BOLD FRAKTUR CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D579;MATHEMATICAL BOLD FRAKTUR CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D57A;MATHEMATICAL BOLD FRAKTUR CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D57B;MATHEMATICAL BOLD FRAKTUR CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D57C;MATHEMATICAL BOLD FRAKTUR CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D57D;MATHEMATICAL BOLD FRAKTUR CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D57E;MATHEMATICAL BOLD FRAKTUR CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D57F;MATHEMATICAL BOLD FRAKTUR CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D580;MATHEMATICAL BOLD FRAKTUR CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D581;MATHEMATICAL BOLD FRAKTUR CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D582;MATHEMATICAL BOLD FRAKTUR CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D583;MATHEMATICAL BOLD FRAKTUR CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D584;MATHEMATICAL BOLD FRAKTUR CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D585;MATHEMATICAL BOLD FRAKTUR CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D586;MATHEMATICAL BOLD FRAKTUR SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D587;MATHEMATICAL BOLD FRAKTUR SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D588;MATHEMATICAL BOLD FRAKTUR SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D589;MATHEMATICAL BOLD FRAKTUR SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D58A;MATHEMATICAL BOLD FRAKTUR SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D58B;MATHEMATICAL BOLD FRAKTUR SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D58C;MATHEMATICAL BOLD FRAKTUR SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D58D;MATHEMATICAL BOLD FRAKTUR SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D58E;MATHEMATICAL BOLD FRAKTUR SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D58F;MATHEMATICAL BOLD FRAKTUR SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D590;MATHEMATICAL BOLD FRAKTUR SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D591;MATHEMATICAL BOLD FRAKTUR SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D592;MATHEMATICAL BOLD FRAKTUR SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D593;MATHEMATICAL BOLD FRAKTUR SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D594;MATHEMATICAL BOLD FRAKTUR SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D595;MATHEMATICAL BOLD FRAKTUR SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D596;MATHEMATICAL BOLD FRAKTUR SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D597;MATHEMATICAL BOLD FRAKTUR SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D598;MATHEMATICAL BOLD FRAKTUR SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D599;MATHEMATICAL BOLD FRAKTUR SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D59A;MATHEMATICAL BOLD FRAKTUR SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D59B;MATHEMATICAL BOLD FRAKTUR SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D59C;MATHEMATICAL BOLD FRAKTUR SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D59D;MATHEMATICAL BOLD FRAKTUR SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D59E;MATHEMATICAL BOLD FRAKTUR SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D59F;MATHEMATICAL BOLD FRAKTUR SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D5A0;MATHEMATICAL SANS-SERIF CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D5A1;MATHEMATICAL SANS-SERIF CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D5A2;MATHEMATICAL SANS-SERIF CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D5A3;MATHEMATICAL SANS-SERIF CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D5A4;MATHEMATICAL SANS-SERIF CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D5A5;MATHEMATICAL SANS-SERIF CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D5A6;MATHEMATICAL SANS-SERIF CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D5A7;MATHEMATICAL SANS-SERIF CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D5A8;MATHEMATICAL SANS-SERIF CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D5A9;MATHEMATICAL SANS-SERIF CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D5AA;MATHEMATICAL SANS-SERIF CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D5AB;MATHEMATICAL SANS-SERIF CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D5AC;MATHEMATICAL SANS-SERIF CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D5AD;MATHEMATICAL SANS-SERIF CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D5AE;MATHEMATICAL SANS-SERIF CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D5AF;MATHEMATICAL SANS-SERIF CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D5B0;MATHEMATICAL SANS-SERIF CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D5B1;MATHEMATICAL SANS-SERIF CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D5B2;MATHEMATICAL SANS-SERIF CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D5B3;MATHEMATICAL SANS-SERIF CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D5B4;MATHEMATICAL SANS-SERIF CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D5B5;MATHEMATICAL SANS-SERIF CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D5B6;MATHEMATICAL SANS-SERIF CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D5B7;MATHEMATICAL SANS-SERIF CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D5B8;MATHEMATICAL SANS-SERIF CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D5B9;MATHEMATICAL SANS-SERIF CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D5BA;MATHEMATICAL SANS-SERIF SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D5BB;MATHEMATICAL SANS-SERIF SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D5BC;MATHEMATICAL SANS-SERIF SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D5BD;MATHEMATICAL SANS-SERIF SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D5BE;MATHEMATICAL SANS-SERIF SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D5BF;MATHEMATICAL SANS-SERIF SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D5C0;MATHEMATICAL SANS-SERIF SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D5C1;MATHEMATICAL SANS-SERIF SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D5C2;MATHEMATICAL SANS-SERIF SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D5C3;MATHEMATICAL SANS-SERIF SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D5C4;MATHEMATICAL SANS-SERIF SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D5C5;MATHEMATICAL SANS-SERIF SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D5C6;MATHEMATICAL SANS-SERIF SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D5C7;MATHEMATICAL SANS-SERIF SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D5C8;MATHEMATICAL SANS-SERIF SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D5C9;MATHEMATICAL SANS-SERIF SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D5CA;MATHEMATICAL SANS-SERIF SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D5CB;MATHEMATICAL SANS-SERIF SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D5CC;MATHEMATICAL SANS-SERIF SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D5CD;MATHEMATICAL SANS-SERIF SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D5CE;MATHEMATICAL SANS-SERIF SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D5CF;MATHEMATICAL SANS-SERIF SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D5D0;MATHEMATICAL SANS-SERIF SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D5D1;MATHEMATICAL SANS-SERIF SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D5D2;MATHEMATICAL SANS-SERIF SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D5D3;MATHEMATICAL SANS-SERIF SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D5D4;MATHEMATICAL SANS-SERIF BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D5D5;MATHEMATICAL SANS-SERIF BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D5D6;MATHEMATICAL SANS-SERIF BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D5D7;MATHEMATICAL SANS-SERIF BOLD CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D5D8;MATHEMATICAL SANS-SERIF BOLD CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D5D9;MATHEMATICAL SANS-SERIF BOLD CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D5DA;MATHEMATICAL SANS-SERIF BOLD CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D5DB;MATHEMATICAL SANS-SERIF BOLD CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D5DC;MATHEMATICAL SANS-SERIF BOLD CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D5DD;MATHEMATICAL SANS-SERIF BOLD CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D5DE;MATHEMATICAL SANS-SERIF BOLD CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D5DF;MATHEMATICAL SANS-SERIF BOLD CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D5E0;MATHEMATICAL SANS-SERIF BOLD CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D5E1;MATHEMATICAL SANS-SERIF BOLD CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D5E2;MATHEMATICAL SANS-SERIF BOLD CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D5E3;MATHEMATICAL SANS-SERIF BOLD CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D5E4;MATHEMATICAL SANS-SERIF BOLD CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D5E5;MATHEMATICAL SANS-SERIF BOLD CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D5E6;MATHEMATICAL SANS-SERIF BOLD CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D5E7;MATHEMATICAL SANS-SERIF BOLD CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D5E8;MATHEMATICAL SANS-SERIF BOLD CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D5E9;MATHEMATICAL SANS-SERIF BOLD CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D5EA;MATHEMATICAL SANS-SERIF BOLD CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D5EB;MATHEMATICAL SANS-SERIF BOLD CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D5EC;MATHEMATICAL SANS-SERIF BOLD CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D5ED;MATHEMATICAL SANS-SERIF BOLD CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D5EE;MATHEMATICAL SANS-SERIF BOLD SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D5EF;MATHEMATICAL SANS-SERIF BOLD SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D5F0;MATHEMATICAL SANS-SERIF BOLD SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D5F1;MATHEMATICAL SANS-SERIF BOLD SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D5F2;MATHEMATICAL SANS-SERIF BOLD SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D5F3;MATHEMATICAL SANS-SERIF BOLD SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D5F4;MATHEMATICAL SANS-SERIF BOLD SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D5F5;MATHEMATICAL SANS-SERIF BOLD SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D5F6;MATHEMATICAL SANS-SERIF BOLD SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D5F7;MATHEMATICAL SANS-SERIF BOLD SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D5F8;MATHEMATICAL SANS-SERIF BOLD SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D5F9;MATHEMATICAL SANS-SERIF BOLD SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D5FA;MATHEMATICAL SANS-SERIF BOLD SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D5FB;MATHEMATICAL SANS-SERIF BOLD SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D5FC;MATHEMATICAL SANS-SERIF BOLD SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D5FD;MATHEMATICAL SANS-SERIF BOLD SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D5FE;MATHEMATICAL SANS-SERIF BOLD SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D5FF;MATHEMATICAL SANS-SERIF BOLD SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D600;MATHEMATICAL SANS-SERIF BOLD SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D601;MATHEMATICAL SANS-SERIF BOLD SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D602;MATHEMATICAL SANS-SERIF BOLD SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D603;MATHEMATICAL SANS-SERIF BOLD SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D604;MATHEMATICAL SANS-SERIF BOLD SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D605;MATHEMATICAL SANS-SERIF BOLD SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D606;MATHEMATICAL SANS-SERIF BOLD SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D607;MATHEMATICAL SANS-SERIF BOLD SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D608;MATHEMATICAL SANS-SERIF ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D609;MATHEMATICAL SANS-SERIF ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D60A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D60B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D60C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D60D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D60E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D60F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D610;MATHEMATICAL SANS-SERIF ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D611;MATHEMATICAL SANS-SERIF ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D612;MATHEMATICAL SANS-SERIF ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D613;MATHEMATICAL SANS-SERIF ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D614;MATHEMATICAL SANS-SERIF ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D615;MATHEMATICAL SANS-SERIF ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D616;MATHEMATICAL SANS-SERIF ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D617;MATHEMATICAL SANS-SERIF ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D618;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D619;MATHEMATICAL SANS-SERIF ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D61A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D61B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D61C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D61D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D61E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D61F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D620;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D621;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D622;MATHEMATICAL SANS-SERIF ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D623;MATHEMATICAL SANS-SERIF ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D624;MATHEMATICAL SANS-SERIF ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D625;MATHEMATICAL SANS-SERIF ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D626;MATHEMATICAL SANS-SERIF ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D627;MATHEMATICAL SANS-SERIF ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D628;MATHEMATICAL SANS-SERIF ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D629;MATHEMATICAL SANS-SERIF ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D62A;MATHEMATICAL SANS-SERIF ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D62B;MATHEMATICAL SANS-SERIF ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D62C;MATHEMATICAL SANS-SERIF ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D62D;MATHEMATICAL SANS-SERIF ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D62E;MATHEMATICAL SANS-SERIF ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D62F;MATHEMATICAL SANS-SERIF ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D630;MATHEMATICAL SANS-SERIF ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D631;MATHEMATICAL SANS-SERIF ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D632;MATHEMATICAL SANS-SERIF ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D633;MATHEMATICAL SANS-SERIF ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D634;MATHEMATICAL SANS-SERIF ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D635;MATHEMATICAL SANS-SERIF ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D636;MATHEMATICAL SANS-SERIF ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D637;MATHEMATICAL SANS-SERIF ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D638;MATHEMATICAL SANS-SERIF ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D639;MATHEMATICAL SANS-SERIF ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D63A;MATHEMATICAL SANS-SERIF ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D63B;MATHEMATICAL SANS-SERIF ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D63C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D63D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D63E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D63F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D640;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D641;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D642;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D643;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D644;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D645;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D646;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D647;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D648;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D649;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D64A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D64B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D64C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D64D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D64E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D64F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D650;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D651;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D652;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D653;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D654;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D655;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D656;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D657;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D658;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D659;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D65A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D65B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D65C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D65D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D65E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D65F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D660;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D661;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D662;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D663;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D664;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D665;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D666;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D667;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D668;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D669;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D66A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D66B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D66C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D66D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D66E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D66F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D670;MATHEMATICAL MONOSPACE CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D671;MATHEMATICAL MONOSPACE CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D672;MATHEMATICAL MONOSPACE CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D673;MATHEMATICAL MONOSPACE CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D674;MATHEMATICAL MONOSPACE CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D675;MATHEMATICAL MONOSPACE CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D676;MATHEMATICAL MONOSPACE CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D677;MATHEMATICAL MONOSPACE CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D678;MATHEMATICAL MONOSPACE CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D679;MATHEMATICAL MONOSPACE CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D67A;MATHEMATICAL MONOSPACE CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D67B;MATHEMATICAL MONOSPACE CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D67C;MATHEMATICAL MONOSPACE CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D67D;MATHEMATICAL MONOSPACE CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D67E;MATHEMATICAL MONOSPACE CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D67F;MATHEMATICAL MONOSPACE CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D680;MATHEMATICAL MONOSPACE CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D681;MATHEMATICAL MONOSPACE CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D682;MATHEMATICAL MONOSPACE CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D683;MATHEMATICAL MONOSPACE CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D684;MATHEMATICAL MONOSPACE CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D685;MATHEMATICAL MONOSPACE CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D686;MATHEMATICAL MONOSPACE CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D687;MATHEMATICAL MONOSPACE CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D688;MATHEMATICAL MONOSPACE CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D689;MATHEMATICAL MONOSPACE CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D68A;MATHEMATICAL MONOSPACE SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D68B;MATHEMATICAL MONOSPACE SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D68C;MATHEMATICAL MONOSPACE SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D68D;MATHEMATICAL MONOSPACE SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D68E;MATHEMATICAL MONOSPACE SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D68F;MATHEMATICAL MONOSPACE SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D690;MATHEMATICAL MONOSPACE SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D691;MATHEMATICAL MONOSPACE SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D692;MATHEMATICAL MONOSPACE SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D693;MATHEMATICAL MONOSPACE SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D694;MATHEMATICAL MONOSPACE SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D695;MATHEMATICAL MONOSPACE SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D696;MATHEMATICAL MONOSPACE SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D697;MATHEMATICAL MONOSPACE SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D698;MATHEMATICAL MONOSPACE SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D699;MATHEMATICAL MONOSPACE SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D69A;MATHEMATICAL MONOSPACE SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D69B;MATHEMATICAL MONOSPACE SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D69C;MATHEMATICAL MONOSPACE SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D69D;MATHEMATICAL MONOSPACE SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D69E;MATHEMATICAL MONOSPACE SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D69F;MATHEMATICAL MONOSPACE SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D6A0;MATHEMATICAL MONOSPACE SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D6A1;MATHEMATICAL MONOSPACE SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D6A2;MATHEMATICAL MONOSPACE SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D6A4;MATHEMATICAL ITALIC SMALL DOTLESS I;Ll;0;L;<font> 0131;;;;N;;;;; +1D6A5;MATHEMATICAL ITALIC SMALL DOTLESS J;Ll;0;L;<font> 0237;;;;N;;;;; +1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; +1D6A9;MATHEMATICAL BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; +1D6AA;MATHEMATICAL BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +1D6AB;MATHEMATICAL BOLD CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; +1D6AC;MATHEMATICAL BOLD CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; +1D6AD;MATHEMATICAL BOLD CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; +1D6AE;MATHEMATICAL BOLD CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; +1D6AF;MATHEMATICAL BOLD CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; +1D6B0;MATHEMATICAL BOLD CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; +1D6B1;MATHEMATICAL BOLD CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; +1D6B2;MATHEMATICAL BOLD CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; +1D6B3;MATHEMATICAL BOLD CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; +1D6B4;MATHEMATICAL BOLD CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; +1D6B5;MATHEMATICAL BOLD CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; +1D6B6;MATHEMATICAL BOLD CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; +1D6B7;MATHEMATICAL BOLD CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +1D6B8;MATHEMATICAL BOLD CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; +1D6B9;MATHEMATICAL BOLD CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; +1D6BA;MATHEMATICAL BOLD CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; +1D6BB;MATHEMATICAL BOLD CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; +1D6BC;MATHEMATICAL BOLD CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; +1D6BD;MATHEMATICAL BOLD CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; +1D6BE;MATHEMATICAL BOLD CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; +1D6BF;MATHEMATICAL BOLD CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; +1D6C0;MATHEMATICAL BOLD CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; +1D6C1;MATHEMATICAL BOLD NABLA;Sm;0;L;<font> 2207;;;;N;;;;; +1D6C2;MATHEMATICAL BOLD SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; +1D6C3;MATHEMATICAL BOLD SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; +1D6C4;MATHEMATICAL BOLD SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +1D6C5;MATHEMATICAL BOLD SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; +1D6C6;MATHEMATICAL BOLD SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; +1D6C7;MATHEMATICAL BOLD SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; +1D6C8;MATHEMATICAL BOLD SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; +1D6C9;MATHEMATICAL BOLD SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; +1D6CA;MATHEMATICAL BOLD SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; +1D6CB;MATHEMATICAL BOLD SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; +1D6CC;MATHEMATICAL BOLD SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; +1D6CD;MATHEMATICAL BOLD SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; +1D6CE;MATHEMATICAL BOLD SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; +1D6CF;MATHEMATICAL BOLD SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; +1D6D0;MATHEMATICAL BOLD SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; +1D6D1;MATHEMATICAL BOLD SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +1D6D2;MATHEMATICAL BOLD SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; +1D6D3;MATHEMATICAL BOLD SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; +1D6D4;MATHEMATICAL BOLD SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; +1D6D5;MATHEMATICAL BOLD SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; +1D6D6;MATHEMATICAL BOLD SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; +1D6D7;MATHEMATICAL BOLD SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; +1D6D8;MATHEMATICAL BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; +1D6D9;MATHEMATICAL BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; +1D6DA;MATHEMATICAL BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; +1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;; +1D6DC;MATHEMATICAL BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; +1D6DD;MATHEMATICAL BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; +1D6DE;MATHEMATICAL BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; +1D6DF;MATHEMATICAL BOLD PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; +1D6E0;MATHEMATICAL BOLD RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; +1D6E1;MATHEMATICAL BOLD PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; +1D6E2;MATHEMATICAL ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; +1D6E3;MATHEMATICAL ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; +1D6E4;MATHEMATICAL ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +1D6E5;MATHEMATICAL ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; +1D6E6;MATHEMATICAL ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; +1D6E7;MATHEMATICAL ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; +1D6E8;MATHEMATICAL ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; +1D6E9;MATHEMATICAL ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; +1D6EA;MATHEMATICAL ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; +1D6EB;MATHEMATICAL ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; +1D6EC;MATHEMATICAL ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; +1D6ED;MATHEMATICAL ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; +1D6EE;MATHEMATICAL ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; +1D6EF;MATHEMATICAL ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; +1D6F0;MATHEMATICAL ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; +1D6F1;MATHEMATICAL ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +1D6F2;MATHEMATICAL ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; +1D6F3;MATHEMATICAL ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; +1D6F4;MATHEMATICAL ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; +1D6F5;MATHEMATICAL ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; +1D6F6;MATHEMATICAL ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; +1D6F7;MATHEMATICAL ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; +1D6F8;MATHEMATICAL ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; +1D6F9;MATHEMATICAL ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; +1D6FA;MATHEMATICAL ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; +1D6FB;MATHEMATICAL ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;; +1D6FC;MATHEMATICAL ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; +1D6FD;MATHEMATICAL ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; +1D6FE;MATHEMATICAL ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +1D6FF;MATHEMATICAL ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; +1D700;MATHEMATICAL ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; +1D701;MATHEMATICAL ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; +1D702;MATHEMATICAL ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; +1D703;MATHEMATICAL ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; +1D704;MATHEMATICAL ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; +1D705;MATHEMATICAL ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; +1D706;MATHEMATICAL ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; +1D707;MATHEMATICAL ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; +1D708;MATHEMATICAL ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; +1D709;MATHEMATICAL ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; +1D70A;MATHEMATICAL ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; +1D70B;MATHEMATICAL ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +1D70C;MATHEMATICAL ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; +1D70D;MATHEMATICAL ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; +1D70E;MATHEMATICAL ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; +1D70F;MATHEMATICAL ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; +1D710;MATHEMATICAL ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; +1D711;MATHEMATICAL ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; +1D712;MATHEMATICAL ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; +1D713;MATHEMATICAL ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; +1D714;MATHEMATICAL ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; +1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;; +1D716;MATHEMATICAL ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; +1D717;MATHEMATICAL ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; +1D718;MATHEMATICAL ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; +1D719;MATHEMATICAL ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; +1D71A;MATHEMATICAL ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; +1D71B;MATHEMATICAL ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; +1D71C;MATHEMATICAL BOLD ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; +1D71D;MATHEMATICAL BOLD ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; +1D71E;MATHEMATICAL BOLD ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +1D71F;MATHEMATICAL BOLD ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; +1D720;MATHEMATICAL BOLD ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; +1D721;MATHEMATICAL BOLD ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; +1D722;MATHEMATICAL BOLD ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; +1D723;MATHEMATICAL BOLD ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; +1D724;MATHEMATICAL BOLD ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; +1D725;MATHEMATICAL BOLD ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; +1D726;MATHEMATICAL BOLD ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; +1D727;MATHEMATICAL BOLD ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; +1D728;MATHEMATICAL BOLD ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; +1D729;MATHEMATICAL BOLD ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; +1D72A;MATHEMATICAL BOLD ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; +1D72B;MATHEMATICAL BOLD ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +1D72C;MATHEMATICAL BOLD ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; +1D72D;MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; +1D72E;MATHEMATICAL BOLD ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; +1D72F;MATHEMATICAL BOLD ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; +1D730;MATHEMATICAL BOLD ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; +1D731;MATHEMATICAL BOLD ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; +1D732;MATHEMATICAL BOLD ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; +1D733;MATHEMATICAL BOLD ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; +1D734;MATHEMATICAL BOLD ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; +1D735;MATHEMATICAL BOLD ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;; +1D736;MATHEMATICAL BOLD ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; +1D737;MATHEMATICAL BOLD ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; +1D738;MATHEMATICAL BOLD ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +1D739;MATHEMATICAL BOLD ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; +1D73A;MATHEMATICAL BOLD ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; +1D73B;MATHEMATICAL BOLD ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; +1D73C;MATHEMATICAL BOLD ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; +1D73D;MATHEMATICAL BOLD ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; +1D73E;MATHEMATICAL BOLD ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; +1D73F;MATHEMATICAL BOLD ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; +1D740;MATHEMATICAL BOLD ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; +1D741;MATHEMATICAL BOLD ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; +1D742;MATHEMATICAL BOLD ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; +1D743;MATHEMATICAL BOLD ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; +1D744;MATHEMATICAL BOLD ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; +1D745;MATHEMATICAL BOLD ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +1D746;MATHEMATICAL BOLD ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; +1D747;MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; +1D748;MATHEMATICAL BOLD ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; +1D749;MATHEMATICAL BOLD ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; +1D74A;MATHEMATICAL BOLD ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; +1D74B;MATHEMATICAL BOLD ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; +1D74C;MATHEMATICAL BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; +1D74D;MATHEMATICAL BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; +1D74E;MATHEMATICAL BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; +1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;; +1D750;MATHEMATICAL BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; +1D751;MATHEMATICAL BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; +1D752;MATHEMATICAL BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; +1D753;MATHEMATICAL BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; +1D754;MATHEMATICAL BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; +1D755;MATHEMATICAL BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; +1D756;MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; +1D757;MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; +1D758;MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +1D759;MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; +1D75A;MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; +1D75B;MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; +1D75C;MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; +1D75D;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; +1D75E;MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; +1D75F;MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; +1D760;MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; +1D761;MATHEMATICAL SANS-SERIF BOLD CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; +1D762;MATHEMATICAL SANS-SERIF BOLD CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; +1D763;MATHEMATICAL SANS-SERIF BOLD CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; +1D764;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; +1D765;MATHEMATICAL SANS-SERIF BOLD CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +1D766;MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; +1D767;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; +1D768;MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; +1D769;MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; +1D76A;MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; +1D76B;MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; +1D76C;MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; +1D76D;MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; +1D76E;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; +1D76F;MATHEMATICAL SANS-SERIF BOLD NABLA;Sm;0;L;<font> 2207;;;;N;;;;; +1D770;MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; +1D771;MATHEMATICAL SANS-SERIF BOLD SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; +1D772;MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +1D773;MATHEMATICAL SANS-SERIF BOLD SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; +1D774;MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; +1D775;MATHEMATICAL SANS-SERIF BOLD SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; +1D776;MATHEMATICAL SANS-SERIF BOLD SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; +1D777;MATHEMATICAL SANS-SERIF BOLD SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; +1D778;MATHEMATICAL SANS-SERIF BOLD SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; +1D779;MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; +1D77A;MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; +1D77B;MATHEMATICAL SANS-SERIF BOLD SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; +1D77C;MATHEMATICAL SANS-SERIF BOLD SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; +1D77D;MATHEMATICAL SANS-SERIF BOLD SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; +1D77E;MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; +1D77F;MATHEMATICAL SANS-SERIF BOLD SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +1D780;MATHEMATICAL SANS-SERIF BOLD SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; +1D781;MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; +1D782;MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; +1D783;MATHEMATICAL SANS-SERIF BOLD SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; +1D784;MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; +1D785;MATHEMATICAL SANS-SERIF BOLD SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; +1D786;MATHEMATICAL SANS-SERIF BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; +1D787;MATHEMATICAL SANS-SERIF BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; +1D788;MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; +1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;; +1D78A;MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; +1D78B;MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; +1D78C;MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; +1D78D;MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; +1D78E;MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; +1D78F;MATHEMATICAL SANS-SERIF BOLD PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; +1D790;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; +1D791;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; +1D792;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +1D793;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; +1D794;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; +1D795;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; +1D796;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; +1D797;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; +1D798;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; +1D799;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; +1D79A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; +1D79B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; +1D79C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; +1D79D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; +1D79E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; +1D79F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +1D7A0;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; +1D7A1;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; +1D7A2;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; +1D7A3;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; +1D7A4;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; +1D7A5;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; +1D7A6;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; +1D7A7;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; +1D7A8;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; +1D7A9;MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;; +1D7AA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; +1D7AB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; +1D7AC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +1D7AD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; +1D7AE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; +1D7AF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; +1D7B0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; +1D7B1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; +1D7B2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; +1D7B3;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; +1D7B4;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; +1D7B5;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; +1D7B6;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; +1D7B7;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; +1D7B8;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; +1D7B9;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +1D7BA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; +1D7BB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; +1D7BC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; +1D7BD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; +1D7BE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; +1D7BF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; +1D7C0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; +1D7C1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; +1D7C2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; +1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;; +1D7C4;MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; +1D7C5;MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; +1D7C6;MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; +1D7C7;MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; +1D7C8;MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; +1D7C9;MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; +1D7CA;MATHEMATICAL BOLD CAPITAL DIGAMMA;Lu;0;L;<font> 03DC;;;;N;;;;; +1D7CB;MATHEMATICAL BOLD SMALL DIGAMMA;Ll;0;L;<font> 03DD;;;;N;;;;; +1D7CE;MATHEMATICAL BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; +1D7CF;MATHEMATICAL BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; +1D7D0;MATHEMATICAL BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; +1D7D1;MATHEMATICAL BOLD DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; +1D7D2;MATHEMATICAL BOLD DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; +1D7D3;MATHEMATICAL BOLD DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; +1D7D4;MATHEMATICAL BOLD DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; +1D7D5;MATHEMATICAL BOLD DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; +1D7D6;MATHEMATICAL BOLD DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; +1D7D7;MATHEMATICAL BOLD DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +1D7D8;MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; +1D7D9;MATHEMATICAL DOUBLE-STRUCK DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; +1D7DA;MATHEMATICAL DOUBLE-STRUCK DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; +1D7DB;MATHEMATICAL DOUBLE-STRUCK DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; +1D7DC;MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; +1D7DD;MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; +1D7DE;MATHEMATICAL DOUBLE-STRUCK DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; +1D7DF;MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; +1D7E0;MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; +1D7E1;MATHEMATICAL DOUBLE-STRUCK DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +1D7E2;MATHEMATICAL SANS-SERIF DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; +1D7E3;MATHEMATICAL SANS-SERIF DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; +1D7E4;MATHEMATICAL SANS-SERIF DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; +1D7E5;MATHEMATICAL SANS-SERIF DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; +1D7E6;MATHEMATICAL SANS-SERIF DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; +1D7E7;MATHEMATICAL SANS-SERIF DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; +1D7E8;MATHEMATICAL SANS-SERIF DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; +1D7E9;MATHEMATICAL SANS-SERIF DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; +1D7EA;MATHEMATICAL SANS-SERIF DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; +1D7EB;MATHEMATICAL SANS-SERIF DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +1D7EC;MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; +1D7ED;MATHEMATICAL SANS-SERIF BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; +1D7EE;MATHEMATICAL SANS-SERIF BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; +1D7EF;MATHEMATICAL SANS-SERIF BOLD DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; +1D7F0;MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; +1D7F1;MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; +1D7F2;MATHEMATICAL SANS-SERIF BOLD DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; +1D7F3;MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; +1D7F4;MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; +1D7F5;MATHEMATICAL SANS-SERIF BOLD DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +1D7F6;MATHEMATICAL MONOSPACE DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; +1D7F7;MATHEMATICAL MONOSPACE DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; +1D7F8;MATHEMATICAL MONOSPACE DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; +1D7F9;MATHEMATICAL MONOSPACE DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; +1D7FA;MATHEMATICAL MONOSPACE DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; +1D7FB;MATHEMATICAL MONOSPACE DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; +1D7FC;MATHEMATICAL MONOSPACE DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; +1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; +1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; +1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +1F000;MAHJONG TILE EAST WIND;So;0;ON;;;;;N;;;;; +1F001;MAHJONG TILE SOUTH WIND;So;0;ON;;;;;N;;;;; +1F002;MAHJONG TILE WEST WIND;So;0;ON;;;;;N;;;;; +1F003;MAHJONG TILE NORTH WIND;So;0;ON;;;;;N;;;;; +1F004;MAHJONG TILE RED DRAGON;So;0;ON;;;;;N;;;;; +1F005;MAHJONG TILE GREEN DRAGON;So;0;ON;;;;;N;;;;; +1F006;MAHJONG TILE WHITE DRAGON;So;0;ON;;;;;N;;;;; +1F007;MAHJONG TILE ONE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F008;MAHJONG TILE TWO OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F009;MAHJONG TILE THREE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00A;MAHJONG TILE FOUR OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00B;MAHJONG TILE FIVE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00C;MAHJONG TILE SIX OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00D;MAHJONG TILE SEVEN OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00E;MAHJONG TILE EIGHT OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00F;MAHJONG TILE NINE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F010;MAHJONG TILE ONE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F011;MAHJONG TILE TWO OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F012;MAHJONG TILE THREE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F013;MAHJONG TILE FOUR OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F014;MAHJONG TILE FIVE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F015;MAHJONG TILE SIX OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F016;MAHJONG TILE SEVEN OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F017;MAHJONG TILE EIGHT OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F018;MAHJONG TILE NINE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F019;MAHJONG TILE ONE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01A;MAHJONG TILE TWO OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01B;MAHJONG TILE THREE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01C;MAHJONG TILE FOUR OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01D;MAHJONG TILE FIVE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01E;MAHJONG TILE SIX OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01F;MAHJONG TILE SEVEN OF CIRCLES;So;0;ON;;;;;N;;;;; +1F020;MAHJONG TILE EIGHT OF CIRCLES;So;0;ON;;;;;N;;;;; +1F021;MAHJONG TILE NINE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F022;MAHJONG TILE PLUM;So;0;ON;;;;;N;;;;; +1F023;MAHJONG TILE ORCHID;So;0;ON;;;;;N;;;;; +1F024;MAHJONG TILE BAMBOO;So;0;ON;;;;;N;;;;; +1F025;MAHJONG TILE CHRYSANTHEMUM;So;0;ON;;;;;N;;;;; +1F026;MAHJONG TILE SPRING;So;0;ON;;;;;N;;;;; +1F027;MAHJONG TILE SUMMER;So;0;ON;;;;;N;;;;; +1F028;MAHJONG TILE AUTUMN;So;0;ON;;;;;N;;;;; +1F029;MAHJONG TILE WINTER;So;0;ON;;;;;N;;;;; +1F02A;MAHJONG TILE JOKER;So;0;ON;;;;;N;;;;; +1F02B;MAHJONG TILE BACK;So;0;ON;;;;;N;;;;; +1F030;DOMINO TILE HORIZONTAL BACK;So;0;ON;;;;;N;;;;; +1F031;DOMINO TILE HORIZONTAL-00-00;So;0;ON;;;;;N;;;;; +1F032;DOMINO TILE HORIZONTAL-00-01;So;0;ON;;;;;N;;;;; +1F033;DOMINO TILE HORIZONTAL-00-02;So;0;ON;;;;;N;;;;; +1F034;DOMINO TILE HORIZONTAL-00-03;So;0;ON;;;;;N;;;;; +1F035;DOMINO TILE HORIZONTAL-00-04;So;0;ON;;;;;N;;;;; +1F036;DOMINO TILE HORIZONTAL-00-05;So;0;ON;;;;;N;;;;; +1F037;DOMINO TILE HORIZONTAL-00-06;So;0;ON;;;;;N;;;;; +1F038;DOMINO TILE HORIZONTAL-01-00;So;0;ON;;;;;N;;;;; +1F039;DOMINO TILE HORIZONTAL-01-01;So;0;ON;;;;;N;;;;; +1F03A;DOMINO TILE HORIZONTAL-01-02;So;0;ON;;;;;N;;;;; +1F03B;DOMINO TILE HORIZONTAL-01-03;So;0;ON;;;;;N;;;;; +1F03C;DOMINO TILE HORIZONTAL-01-04;So;0;ON;;;;;N;;;;; +1F03D;DOMINO TILE HORIZONTAL-01-05;So;0;ON;;;;;N;;;;; +1F03E;DOMINO TILE HORIZONTAL-01-06;So;0;ON;;;;;N;;;;; +1F03F;DOMINO TILE HORIZONTAL-02-00;So;0;ON;;;;;N;;;;; +1F040;DOMINO TILE HORIZONTAL-02-01;So;0;ON;;;;;N;;;;; +1F041;DOMINO TILE HORIZONTAL-02-02;So;0;ON;;;;;N;;;;; +1F042;DOMINO TILE HORIZONTAL-02-03;So;0;ON;;;;;N;;;;; +1F043;DOMINO TILE HORIZONTAL-02-04;So;0;ON;;;;;N;;;;; +1F044;DOMINO TILE HORIZONTAL-02-05;So;0;ON;;;;;N;;;;; +1F045;DOMINO TILE HORIZONTAL-02-06;So;0;ON;;;;;N;;;;; +1F046;DOMINO TILE HORIZONTAL-03-00;So;0;ON;;;;;N;;;;; +1F047;DOMINO TILE HORIZONTAL-03-01;So;0;ON;;;;;N;;;;; +1F048;DOMINO TILE HORIZONTAL-03-02;So;0;ON;;;;;N;;;;; +1F049;DOMINO TILE HORIZONTAL-03-03;So;0;ON;;;;;N;;;;; +1F04A;DOMINO TILE HORIZONTAL-03-04;So;0;ON;;;;;N;;;;; +1F04B;DOMINO TILE HORIZONTAL-03-05;So;0;ON;;;;;N;;;;; +1F04C;DOMINO TILE HORIZONTAL-03-06;So;0;ON;;;;;N;;;;; +1F04D;DOMINO TILE HORIZONTAL-04-00;So;0;ON;;;;;N;;;;; +1F04E;DOMINO TILE HORIZONTAL-04-01;So;0;ON;;;;;N;;;;; +1F04F;DOMINO TILE HORIZONTAL-04-02;So;0;ON;;;;;N;;;;; +1F050;DOMINO TILE HORIZONTAL-04-03;So;0;ON;;;;;N;;;;; +1F051;DOMINO TILE HORIZONTAL-04-04;So;0;ON;;;;;N;;;;; +1F052;DOMINO TILE HORIZONTAL-04-05;So;0;ON;;;;;N;;;;; +1F053;DOMINO TILE HORIZONTAL-04-06;So;0;ON;;;;;N;;;;; +1F054;DOMINO TILE HORIZONTAL-05-00;So;0;ON;;;;;N;;;;; +1F055;DOMINO TILE HORIZONTAL-05-01;So;0;ON;;;;;N;;;;; +1F056;DOMINO TILE HORIZONTAL-05-02;So;0;ON;;;;;N;;;;; +1F057;DOMINO TILE HORIZONTAL-05-03;So;0;ON;;;;;N;;;;; +1F058;DOMINO TILE HORIZONTAL-05-04;So;0;ON;;;;;N;;;;; +1F059;DOMINO TILE HORIZONTAL-05-05;So;0;ON;;;;;N;;;;; +1F05A;DOMINO TILE HORIZONTAL-05-06;So;0;ON;;;;;N;;;;; +1F05B;DOMINO TILE HORIZONTAL-06-00;So;0;ON;;;;;N;;;;; +1F05C;DOMINO TILE HORIZONTAL-06-01;So;0;ON;;;;;N;;;;; +1F05D;DOMINO TILE HORIZONTAL-06-02;So;0;ON;;;;;N;;;;; +1F05E;DOMINO TILE HORIZONTAL-06-03;So;0;ON;;;;;N;;;;; +1F05F;DOMINO TILE HORIZONTAL-06-04;So;0;ON;;;;;N;;;;; +1F060;DOMINO TILE HORIZONTAL-06-05;So;0;ON;;;;;N;;;;; +1F061;DOMINO TILE HORIZONTAL-06-06;So;0;ON;;;;;N;;;;; +1F062;DOMINO TILE VERTICAL BACK;So;0;ON;;;;;N;;;;; +1F063;DOMINO TILE VERTICAL-00-00;So;0;ON;;;;;N;;;;; +1F064;DOMINO TILE VERTICAL-00-01;So;0;ON;;;;;N;;;;; +1F065;DOMINO TILE VERTICAL-00-02;So;0;ON;;;;;N;;;;; +1F066;DOMINO TILE VERTICAL-00-03;So;0;ON;;;;;N;;;;; +1F067;DOMINO TILE VERTICAL-00-04;So;0;ON;;;;;N;;;;; +1F068;DOMINO TILE VERTICAL-00-05;So;0;ON;;;;;N;;;;; +1F069;DOMINO TILE VERTICAL-00-06;So;0;ON;;;;;N;;;;; +1F06A;DOMINO TILE VERTICAL-01-00;So;0;ON;;;;;N;;;;; +1F06B;DOMINO TILE VERTICAL-01-01;So;0;ON;;;;;N;;;;; +1F06C;DOMINO TILE VERTICAL-01-02;So;0;ON;;;;;N;;;;; +1F06D;DOMINO TILE VERTICAL-01-03;So;0;ON;;;;;N;;;;; +1F06E;DOMINO TILE VERTICAL-01-04;So;0;ON;;;;;N;;;;; +1F06F;DOMINO TILE VERTICAL-01-05;So;0;ON;;;;;N;;;;; +1F070;DOMINO TILE VERTICAL-01-06;So;0;ON;;;;;N;;;;; +1F071;DOMINO TILE VERTICAL-02-00;So;0;ON;;;;;N;;;;; +1F072;DOMINO TILE VERTICAL-02-01;So;0;ON;;;;;N;;;;; +1F073;DOMINO TILE VERTICAL-02-02;So;0;ON;;;;;N;;;;; +1F074;DOMINO TILE VERTICAL-02-03;So;0;ON;;;;;N;;;;; +1F075;DOMINO TILE VERTICAL-02-04;So;0;ON;;;;;N;;;;; +1F076;DOMINO TILE VERTICAL-02-05;So;0;ON;;;;;N;;;;; +1F077;DOMINO TILE VERTICAL-02-06;So;0;ON;;;;;N;;;;; +1F078;DOMINO TILE VERTICAL-03-00;So;0;ON;;;;;N;;;;; +1F079;DOMINO TILE VERTICAL-03-01;So;0;ON;;;;;N;;;;; +1F07A;DOMINO TILE VERTICAL-03-02;So;0;ON;;;;;N;;;;; +1F07B;DOMINO TILE VERTICAL-03-03;So;0;ON;;;;;N;;;;; +1F07C;DOMINO TILE VERTICAL-03-04;So;0;ON;;;;;N;;;;; +1F07D;DOMINO TILE VERTICAL-03-05;So;0;ON;;;;;N;;;;; +1F07E;DOMINO TILE VERTICAL-03-06;So;0;ON;;;;;N;;;;; +1F07F;DOMINO TILE VERTICAL-04-00;So;0;ON;;;;;N;;;;; +1F080;DOMINO TILE VERTICAL-04-01;So;0;ON;;;;;N;;;;; +1F081;DOMINO TILE VERTICAL-04-02;So;0;ON;;;;;N;;;;; +1F082;DOMINO TILE VERTICAL-04-03;So;0;ON;;;;;N;;;;; +1F083;DOMINO TILE VERTICAL-04-04;So;0;ON;;;;;N;;;;; +1F084;DOMINO TILE VERTICAL-04-05;So;0;ON;;;;;N;;;;; +1F085;DOMINO TILE VERTICAL-04-06;So;0;ON;;;;;N;;;;; +1F086;DOMINO TILE VERTICAL-05-00;So;0;ON;;;;;N;;;;; +1F087;DOMINO TILE VERTICAL-05-01;So;0;ON;;;;;N;;;;; +1F088;DOMINO TILE VERTICAL-05-02;So;0;ON;;;;;N;;;;; +1F089;DOMINO TILE VERTICAL-05-03;So;0;ON;;;;;N;;;;; +1F08A;DOMINO TILE VERTICAL-05-04;So;0;ON;;;;;N;;;;; +1F08B;DOMINO TILE VERTICAL-05-05;So;0;ON;;;;;N;;;;; +1F08C;DOMINO TILE VERTICAL-05-06;So;0;ON;;;;;N;;;;; +1F08D;DOMINO TILE VERTICAL-06-00;So;0;ON;;;;;N;;;;; +1F08E;DOMINO TILE VERTICAL-06-01;So;0;ON;;;;;N;;;;; +1F08F;DOMINO TILE VERTICAL-06-02;So;0;ON;;;;;N;;;;; +1F090;DOMINO TILE VERTICAL-06-03;So;0;ON;;;;;N;;;;; +1F091;DOMINO TILE VERTICAL-06-04;So;0;ON;;;;;N;;;;; +1F092;DOMINO TILE VERTICAL-06-05;So;0;ON;;;;;N;;;;; +1F093;DOMINO TILE VERTICAL-06-06;So;0;ON;;;;;N;;;;; +1F100;DIGIT ZERO FULL STOP;No;0;EN;<compat> 0030 002E;;0;0;N;;;;; +1F101;DIGIT ZERO COMMA;No;0;EN;<compat> 0030 002C;;0;0;N;;;;; +1F102;DIGIT ONE COMMA;No;0;EN;<compat> 0031 002C;;1;1;N;;;;; +1F103;DIGIT TWO COMMA;No;0;EN;<compat> 0032 002C;;2;2;N;;;;; +1F104;DIGIT THREE COMMA;No;0;EN;<compat> 0033 002C;;3;3;N;;;;; +1F105;DIGIT FOUR COMMA;No;0;EN;<compat> 0034 002C;;4;4;N;;;;; +1F106;DIGIT FIVE COMMA;No;0;EN;<compat> 0035 002C;;5;5;N;;;;; +1F107;DIGIT SIX COMMA;No;0;EN;<compat> 0036 002C;;6;6;N;;;;; +1F108;DIGIT SEVEN COMMA;No;0;EN;<compat> 0037 002C;;7;7;N;;;;; +1F109;DIGIT EIGHT COMMA;No;0;EN;<compat> 0038 002C;;8;8;N;;;;; +1F10A;DIGIT NINE COMMA;No;0;EN;<compat> 0039 002C;;9;9;N;;;;; +1F110;PARENTHESIZED LATIN CAPITAL LETTER A;So;0;L;<compat> 0028 0041 0029;;;;N;;;;; +1F111;PARENTHESIZED LATIN CAPITAL LETTER B;So;0;L;<compat> 0028 0042 0029;;;;N;;;;; +1F112;PARENTHESIZED LATIN CAPITAL LETTER C;So;0;L;<compat> 0028 0043 0029;;;;N;;;;; +1F113;PARENTHESIZED LATIN CAPITAL LETTER D;So;0;L;<compat> 0028 0044 0029;;;;N;;;;; +1F114;PARENTHESIZED LATIN CAPITAL LETTER E;So;0;L;<compat> 0028 0045 0029;;;;N;;;;; +1F115;PARENTHESIZED LATIN CAPITAL LETTER F;So;0;L;<compat> 0028 0046 0029;;;;N;;;;; +1F116;PARENTHESIZED LATIN CAPITAL LETTER G;So;0;L;<compat> 0028 0047 0029;;;;N;;;;; +1F117;PARENTHESIZED LATIN CAPITAL LETTER H;So;0;L;<compat> 0028 0048 0029;;;;N;;;;; +1F118;PARENTHESIZED LATIN CAPITAL LETTER I;So;0;L;<compat> 0028 0049 0029;;;;N;;;;; +1F119;PARENTHESIZED LATIN CAPITAL LETTER J;So;0;L;<compat> 0028 004A 0029;;;;N;;;;; +1F11A;PARENTHESIZED LATIN CAPITAL LETTER K;So;0;L;<compat> 0028 004B 0029;;;;N;;;;; +1F11B;PARENTHESIZED LATIN CAPITAL LETTER L;So;0;L;<compat> 0028 004C 0029;;;;N;;;;; +1F11C;PARENTHESIZED LATIN CAPITAL LETTER M;So;0;L;<compat> 0028 004D 0029;;;;N;;;;; +1F11D;PARENTHESIZED LATIN CAPITAL LETTER N;So;0;L;<compat> 0028 004E 0029;;;;N;;;;; +1F11E;PARENTHESIZED LATIN CAPITAL LETTER O;So;0;L;<compat> 0028 004F 0029;;;;N;;;;; +1F11F;PARENTHESIZED LATIN CAPITAL LETTER P;So;0;L;<compat> 0028 0050 0029;;;;N;;;;; +1F120;PARENTHESIZED LATIN CAPITAL LETTER Q;So;0;L;<compat> 0028 0051 0029;;;;N;;;;; +1F121;PARENTHESIZED LATIN CAPITAL LETTER R;So;0;L;<compat> 0028 0052 0029;;;;N;;;;; +1F122;PARENTHESIZED LATIN CAPITAL LETTER S;So;0;L;<compat> 0028 0053 0029;;;;N;;;;; +1F123;PARENTHESIZED LATIN CAPITAL LETTER T;So;0;L;<compat> 0028 0054 0029;;;;N;;;;; +1F124;PARENTHESIZED LATIN CAPITAL LETTER U;So;0;L;<compat> 0028 0055 0029;;;;N;;;;; +1F125;PARENTHESIZED LATIN CAPITAL LETTER V;So;0;L;<compat> 0028 0056 0029;;;;N;;;;; +1F126;PARENTHESIZED LATIN CAPITAL LETTER W;So;0;L;<compat> 0028 0057 0029;;;;N;;;;; +1F127;PARENTHESIZED LATIN CAPITAL LETTER X;So;0;L;<compat> 0028 0058 0029;;;;N;;;;; +1F128;PARENTHESIZED LATIN CAPITAL LETTER Y;So;0;L;<compat> 0028 0059 0029;;;;N;;;;; +1F129;PARENTHESIZED LATIN CAPITAL LETTER Z;So;0;L;<compat> 0028 005A 0029;;;;N;;;;; +1F12A;TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S;So;0;L;<compat> 3014 0053 3015;;;;N;;;;; +1F12B;CIRCLED ITALIC LATIN CAPITAL LETTER C;So;0;L;<circle> 0043;;;;N;;;;; +1F12C;CIRCLED ITALIC LATIN CAPITAL LETTER R;So;0;L;<circle> 0052;;;;N;;;;; +1F12D;CIRCLED CD;So;0;L;<circle> 0043 0044;;;;N;;;;; +1F12E;CIRCLED WZ;So;0;L;<circle> 0057 005A;;;;N;;;;; +1F131;SQUARED LATIN CAPITAL LETTER B;So;0;L;<square> 0042;;;;N;;;;; +1F13D;SQUARED LATIN CAPITAL LETTER N;So;0;L;<square> 004E;;;;N;;;;; +1F13F;SQUARED LATIN CAPITAL LETTER P;So;0;L;<square> 0050;;;;N;;;;; +1F142;SQUARED LATIN CAPITAL LETTER S;So;0;L;<square> 0053;;;;N;;;;; +1F146;SQUARED LATIN CAPITAL LETTER W;So;0;L;<square> 0057;;;;N;;;;; +1F14A;SQUARED HV;So;0;L;<square> 0048 0056;;;;N;;;;; +1F14B;SQUARED MV;So;0;L;<square> 004D 0056;;;;N;;;;; +1F14C;SQUARED SD;So;0;L;<square> 0053 0044;;;;N;;;;; +1F14D;SQUARED SS;So;0;L;<square> 0053 0053;;;;N;;;;; +1F14E;SQUARED PPV;So;0;L;<square> 0050 0050 0056;;;;N;;;;; +1F157;NEGATIVE CIRCLED LATIN CAPITAL LETTER H;So;0;L;;;;;N;;;;; +1F15F;NEGATIVE CIRCLED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; +1F179;NEGATIVE SQUARED LATIN CAPITAL LETTER J;So;0;L;;;;;N;;;;; +1F17B;NEGATIVE SQUARED LATIN CAPITAL LETTER L;So;0;L;;;;;N;;;;; +1F17C;NEGATIVE SQUARED LATIN CAPITAL LETTER M;So;0;L;;;;;N;;;;; +1F17F;NEGATIVE SQUARED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; +1F18A;CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; +1F18B;NEGATIVE SQUARED IC;So;0;L;;;;;N;;;;; +1F18C;NEGATIVE SQUARED PA;So;0;L;;;;;N;;;;; +1F18D;NEGATIVE SQUARED SA;So;0;L;;;;;N;;;;; +1F190;SQUARE DJ;So;0;L;<square> 0044 004A;;;;N;;;;; +1F200;SQUARE HIRAGANA HOKA;So;0;L;<square> 307B 304B;;;;N;;;;; +1F210;SQUARED CJK UNIFIED IDEOGRAPH-624B;So;0;L;<square> 624B;;;;N;;;;; +1F211;SQUARED CJK UNIFIED IDEOGRAPH-5B57;So;0;L;<square> 5B57;;;;N;;;;; +1F212;SQUARED CJK UNIFIED IDEOGRAPH-53CC;So;0;L;<square> 53CC;;;;N;;;;; +1F213;SQUARED KATAKANA DE;So;0;L;<square> 30C7;;;;N;;;;; +1F214;SQUARED CJK UNIFIED IDEOGRAPH-4E8C;So;0;L;<square> 4E8C;;;;N;;;;; +1F215;SQUARED CJK UNIFIED IDEOGRAPH-591A;So;0;L;<square> 591A;;;;N;;;;; +1F216;SQUARED CJK UNIFIED IDEOGRAPH-89E3;So;0;L;<square> 89E3;;;;N;;;;; +1F217;SQUARED CJK UNIFIED IDEOGRAPH-5929;So;0;L;<square> 5929;;;;N;;;;; +1F218;SQUARED CJK UNIFIED IDEOGRAPH-4EA4;So;0;L;<square> 4EA4;;;;N;;;;; +1F219;SQUARED CJK UNIFIED IDEOGRAPH-6620;So;0;L;<square> 6620;;;;N;;;;; +1F21A;SQUARED CJK UNIFIED IDEOGRAPH-7121;So;0;L;<square> 7121;;;;N;;;;; +1F21B;SQUARED CJK UNIFIED IDEOGRAPH-6599;So;0;L;<square> 6599;;;;N;;;;; +1F21C;SQUARED CJK UNIFIED IDEOGRAPH-524D;So;0;L;<square> 524D;;;;N;;;;; +1F21D;SQUARED CJK UNIFIED IDEOGRAPH-5F8C;So;0;L;<square> 5F8C;;;;N;;;;; +1F21E;SQUARED CJK UNIFIED IDEOGRAPH-518D;So;0;L;<square> 518D;;;;N;;;;; +1F21F;SQUARED CJK UNIFIED IDEOGRAPH-65B0;So;0;L;<square> 65B0;;;;N;;;;; +1F220;SQUARED CJK UNIFIED IDEOGRAPH-521D;So;0;L;<square> 521D;;;;N;;;;; +1F221;SQUARED CJK UNIFIED IDEOGRAPH-7D42;So;0;L;<square> 7D42;;;;N;;;;; +1F222;SQUARED CJK UNIFIED IDEOGRAPH-751F;So;0;L;<square> 751F;;;;N;;;;; +1F223;SQUARED CJK UNIFIED IDEOGRAPH-8CA9;So;0;L;<square> 8CA9;;;;N;;;;; +1F224;SQUARED CJK UNIFIED IDEOGRAPH-58F0;So;0;L;<square> 58F0;;;;N;;;;; +1F225;SQUARED CJK UNIFIED IDEOGRAPH-5439;So;0;L;<square> 5439;;;;N;;;;; +1F226;SQUARED CJK UNIFIED IDEOGRAPH-6F14;So;0;L;<square> 6F14;;;;N;;;;; +1F227;SQUARED CJK UNIFIED IDEOGRAPH-6295;So;0;L;<square> 6295;;;;N;;;;; +1F228;SQUARED CJK UNIFIED IDEOGRAPH-6355;So;0;L;<square> 6355;;;;N;;;;; +1F229;SQUARED CJK UNIFIED IDEOGRAPH-4E00;So;0;L;<square> 4E00;;;;N;;;;; +1F22A;SQUARED CJK UNIFIED IDEOGRAPH-4E09;So;0;L;<square> 4E09;;;;N;;;;; +1F22B;SQUARED CJK UNIFIED IDEOGRAPH-904A;So;0;L;<square> 904A;;;;N;;;;; +1F22C;SQUARED CJK UNIFIED IDEOGRAPH-5DE6;So;0;L;<square> 5DE6;;;;N;;;;; +1F22D;SQUARED CJK UNIFIED IDEOGRAPH-4E2D;So;0;L;<square> 4E2D;;;;N;;;;; +1F22E;SQUARED CJK UNIFIED IDEOGRAPH-53F3;So;0;L;<square> 53F3;;;;N;;;;; +1F22F;SQUARED CJK UNIFIED IDEOGRAPH-6307;So;0;L;<square> 6307;;;;N;;;;; +1F230;SQUARED CJK UNIFIED IDEOGRAPH-8D70;So;0;L;<square> 8D70;;;;N;;;;; +1F231;SQUARED CJK UNIFIED IDEOGRAPH-6253;So;0;L;<square> 6253;;;;N;;;;; +1F240;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C;So;0;L;<compat> 3014 672C 3015;;;;N;;;;; +1F241;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09;So;0;L;<compat> 3014 4E09 3015;;;;N;;;;; +1F242;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C;So;0;L;<compat> 3014 4E8C 3015;;;;N;;;;; +1F243;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89;So;0;L;<compat> 3014 5B89 3015;;;;N;;;;; +1F244;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9;So;0;L;<compat> 3014 70B9 3015;;;;N;;;;; +1F245;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253;So;0;L;<compat> 3014 6253 3015;;;;N;;;;; +1F246;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7;So;0;L;<compat> 3014 76D7 3015;;;;N;;;;; +1F247;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD;So;0;L;<compat> 3014 52DD 3015;;;;N;;;;; +1F248;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557;So;0;L;<compat> 3014 6557 3015;;;;N;;;;; +20000;<CJK Ideograph Extension B, First>;Lo;0;L;;;;;N;;;;; +2A6D6;<CJK Ideograph Extension B, Last>;Lo;0;L;;;;;N;;;;; +2A700;<CJK Ideograph Extension C, First>;Lo;0;L;;;;;N;;;;; +2B734;<CJK Ideograph Extension C, Last>;Lo;0;L;;;;;N;;;;; +2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;; +2F801;CJK COMPATIBILITY IDEOGRAPH-2F801;Lo;0;L;4E38;;;;N;;;;; +2F802;CJK COMPATIBILITY IDEOGRAPH-2F802;Lo;0;L;4E41;;;;N;;;;; +2F803;CJK COMPATIBILITY IDEOGRAPH-2F803;Lo;0;L;20122;;;;N;;;;; +2F804;CJK COMPATIBILITY IDEOGRAPH-2F804;Lo;0;L;4F60;;;;N;;;;; +2F805;CJK COMPATIBILITY IDEOGRAPH-2F805;Lo;0;L;4FAE;;;;N;;;;; +2F806;CJK COMPATIBILITY IDEOGRAPH-2F806;Lo;0;L;4FBB;;;;N;;;;; +2F807;CJK COMPATIBILITY IDEOGRAPH-2F807;Lo;0;L;5002;;;;N;;;;; +2F808;CJK COMPATIBILITY IDEOGRAPH-2F808;Lo;0;L;507A;;;;N;;;;; +2F809;CJK COMPATIBILITY IDEOGRAPH-2F809;Lo;0;L;5099;;;;N;;;;; +2F80A;CJK COMPATIBILITY IDEOGRAPH-2F80A;Lo;0;L;50E7;;;;N;;;;; +2F80B;CJK COMPATIBILITY IDEOGRAPH-2F80B;Lo;0;L;50CF;;;;N;;;;; +2F80C;CJK COMPATIBILITY IDEOGRAPH-2F80C;Lo;0;L;349E;;;;N;;;;; +2F80D;CJK COMPATIBILITY IDEOGRAPH-2F80D;Lo;0;L;2063A;;;;N;;;;; +2F80E;CJK COMPATIBILITY IDEOGRAPH-2F80E;Lo;0;L;514D;;;;N;;;;; +2F80F;CJK COMPATIBILITY IDEOGRAPH-2F80F;Lo;0;L;5154;;;;N;;;;; +2F810;CJK COMPATIBILITY IDEOGRAPH-2F810;Lo;0;L;5164;;;;N;;;;; +2F811;CJK COMPATIBILITY IDEOGRAPH-2F811;Lo;0;L;5177;;;;N;;;;; +2F812;CJK COMPATIBILITY IDEOGRAPH-2F812;Lo;0;L;2051C;;;;N;;;;; +2F813;CJK COMPATIBILITY IDEOGRAPH-2F813;Lo;0;L;34B9;;;;N;;;;; +2F814;CJK COMPATIBILITY IDEOGRAPH-2F814;Lo;0;L;5167;;;;N;;;;; +2F815;CJK COMPATIBILITY IDEOGRAPH-2F815;Lo;0;L;518D;;;;N;;;;; +2F816;CJK COMPATIBILITY IDEOGRAPH-2F816;Lo;0;L;2054B;;;;N;;;;; +2F817;CJK COMPATIBILITY IDEOGRAPH-2F817;Lo;0;L;5197;;;;N;;;;; +2F818;CJK COMPATIBILITY IDEOGRAPH-2F818;Lo;0;L;51A4;;;;N;;;;; +2F819;CJK COMPATIBILITY IDEOGRAPH-2F819;Lo;0;L;4ECC;;;;N;;;;; +2F81A;CJK COMPATIBILITY IDEOGRAPH-2F81A;Lo;0;L;51AC;;;;N;;;;; +2F81B;CJK COMPATIBILITY IDEOGRAPH-2F81B;Lo;0;L;51B5;;;;N;;;;; +2F81C;CJK COMPATIBILITY IDEOGRAPH-2F81C;Lo;0;L;291DF;;;;N;;;;; +2F81D;CJK COMPATIBILITY IDEOGRAPH-2F81D;Lo;0;L;51F5;;;;N;;;;; +2F81E;CJK COMPATIBILITY IDEOGRAPH-2F81E;Lo;0;L;5203;;;;N;;;;; +2F81F;CJK COMPATIBILITY IDEOGRAPH-2F81F;Lo;0;L;34DF;;;;N;;;;; +2F820;CJK COMPATIBILITY IDEOGRAPH-2F820;Lo;0;L;523B;;;;N;;;;; +2F821;CJK COMPATIBILITY IDEOGRAPH-2F821;Lo;0;L;5246;;;;N;;;;; +2F822;CJK COMPATIBILITY IDEOGRAPH-2F822;Lo;0;L;5272;;;;N;;;;; +2F823;CJK COMPATIBILITY IDEOGRAPH-2F823;Lo;0;L;5277;;;;N;;;;; +2F824;CJK COMPATIBILITY IDEOGRAPH-2F824;Lo;0;L;3515;;;;N;;;;; +2F825;CJK COMPATIBILITY IDEOGRAPH-2F825;Lo;0;L;52C7;;;;N;;;;; +2F826;CJK COMPATIBILITY IDEOGRAPH-2F826;Lo;0;L;52C9;;;;N;;;;; +2F827;CJK COMPATIBILITY IDEOGRAPH-2F827;Lo;0;L;52E4;;;;N;;;;; +2F828;CJK COMPATIBILITY IDEOGRAPH-2F828;Lo;0;L;52FA;;;;N;;;;; +2F829;CJK COMPATIBILITY IDEOGRAPH-2F829;Lo;0;L;5305;;;;N;;;;; +2F82A;CJK COMPATIBILITY IDEOGRAPH-2F82A;Lo;0;L;5306;;;;N;;;;; +2F82B;CJK COMPATIBILITY IDEOGRAPH-2F82B;Lo;0;L;5317;;;;N;;;;; +2F82C;CJK COMPATIBILITY IDEOGRAPH-2F82C;Lo;0;L;5349;;;;N;;;;; +2F82D;CJK COMPATIBILITY IDEOGRAPH-2F82D;Lo;0;L;5351;;;;N;;;;; +2F82E;CJK COMPATIBILITY IDEOGRAPH-2F82E;Lo;0;L;535A;;;;N;;;;; +2F82F;CJK COMPATIBILITY IDEOGRAPH-2F82F;Lo;0;L;5373;;;;N;;;;; +2F830;CJK COMPATIBILITY IDEOGRAPH-2F830;Lo;0;L;537D;;;;N;;;;; +2F831;CJK COMPATIBILITY IDEOGRAPH-2F831;Lo;0;L;537F;;;;N;;;;; +2F832;CJK COMPATIBILITY IDEOGRAPH-2F832;Lo;0;L;537F;;;;N;;;;; +2F833;CJK COMPATIBILITY IDEOGRAPH-2F833;Lo;0;L;537F;;;;N;;;;; +2F834;CJK COMPATIBILITY IDEOGRAPH-2F834;Lo;0;L;20A2C;;;;N;;;;; +2F835;CJK COMPATIBILITY IDEOGRAPH-2F835;Lo;0;L;7070;;;;N;;;;; +2F836;CJK COMPATIBILITY IDEOGRAPH-2F836;Lo;0;L;53CA;;;;N;;;;; +2F837;CJK COMPATIBILITY IDEOGRAPH-2F837;Lo;0;L;53DF;;;;N;;;;; +2F838;CJK COMPATIBILITY IDEOGRAPH-2F838;Lo;0;L;20B63;;;;N;;;;; +2F839;CJK COMPATIBILITY IDEOGRAPH-2F839;Lo;0;L;53EB;;;;N;;;;; +2F83A;CJK COMPATIBILITY IDEOGRAPH-2F83A;Lo;0;L;53F1;;;;N;;;;; +2F83B;CJK COMPATIBILITY IDEOGRAPH-2F83B;Lo;0;L;5406;;;;N;;;;; +2F83C;CJK COMPATIBILITY IDEOGRAPH-2F83C;Lo;0;L;549E;;;;N;;;;; +2F83D;CJK COMPATIBILITY IDEOGRAPH-2F83D;Lo;0;L;5438;;;;N;;;;; +2F83E;CJK COMPATIBILITY IDEOGRAPH-2F83E;Lo;0;L;5448;;;;N;;;;; +2F83F;CJK COMPATIBILITY IDEOGRAPH-2F83F;Lo;0;L;5468;;;;N;;;;; +2F840;CJK COMPATIBILITY IDEOGRAPH-2F840;Lo;0;L;54A2;;;;N;;;;; +2F841;CJK COMPATIBILITY IDEOGRAPH-2F841;Lo;0;L;54F6;;;;N;;;;; +2F842;CJK COMPATIBILITY IDEOGRAPH-2F842;Lo;0;L;5510;;;;N;;;;; +2F843;CJK COMPATIBILITY IDEOGRAPH-2F843;Lo;0;L;5553;;;;N;;;;; +2F844;CJK COMPATIBILITY IDEOGRAPH-2F844;Lo;0;L;5563;;;;N;;;;; +2F845;CJK COMPATIBILITY IDEOGRAPH-2F845;Lo;0;L;5584;;;;N;;;;; +2F846;CJK COMPATIBILITY IDEOGRAPH-2F846;Lo;0;L;5584;;;;N;;;;; +2F847;CJK COMPATIBILITY IDEOGRAPH-2F847;Lo;0;L;5599;;;;N;;;;; +2F848;CJK COMPATIBILITY IDEOGRAPH-2F848;Lo;0;L;55AB;;;;N;;;;; +2F849;CJK COMPATIBILITY IDEOGRAPH-2F849;Lo;0;L;55B3;;;;N;;;;; +2F84A;CJK COMPATIBILITY IDEOGRAPH-2F84A;Lo;0;L;55C2;;;;N;;;;; +2F84B;CJK COMPATIBILITY IDEOGRAPH-2F84B;Lo;0;L;5716;;;;N;;;;; +2F84C;CJK COMPATIBILITY IDEOGRAPH-2F84C;Lo;0;L;5606;;;;N;;;;; +2F84D;CJK COMPATIBILITY IDEOGRAPH-2F84D;Lo;0;L;5717;;;;N;;;;; +2F84E;CJK COMPATIBILITY IDEOGRAPH-2F84E;Lo;0;L;5651;;;;N;;;;; +2F84F;CJK COMPATIBILITY IDEOGRAPH-2F84F;Lo;0;L;5674;;;;N;;;;; +2F850;CJK COMPATIBILITY IDEOGRAPH-2F850;Lo;0;L;5207;;;;N;;;;; +2F851;CJK COMPATIBILITY IDEOGRAPH-2F851;Lo;0;L;58EE;;;;N;;;;; +2F852;CJK COMPATIBILITY IDEOGRAPH-2F852;Lo;0;L;57CE;;;;N;;;;; +2F853;CJK COMPATIBILITY IDEOGRAPH-2F853;Lo;0;L;57F4;;;;N;;;;; +2F854;CJK COMPATIBILITY IDEOGRAPH-2F854;Lo;0;L;580D;;;;N;;;;; +2F855;CJK COMPATIBILITY IDEOGRAPH-2F855;Lo;0;L;578B;;;;N;;;;; +2F856;CJK COMPATIBILITY IDEOGRAPH-2F856;Lo;0;L;5832;;;;N;;;;; +2F857;CJK COMPATIBILITY IDEOGRAPH-2F857;Lo;0;L;5831;;;;N;;;;; +2F858;CJK COMPATIBILITY IDEOGRAPH-2F858;Lo;0;L;58AC;;;;N;;;;; +2F859;CJK COMPATIBILITY IDEOGRAPH-2F859;Lo;0;L;214E4;;;;N;;;;; +2F85A;CJK COMPATIBILITY IDEOGRAPH-2F85A;Lo;0;L;58F2;;;;N;;;;; +2F85B;CJK COMPATIBILITY IDEOGRAPH-2F85B;Lo;0;L;58F7;;;;N;;;;; +2F85C;CJK COMPATIBILITY IDEOGRAPH-2F85C;Lo;0;L;5906;;;;N;;;;; +2F85D;CJK COMPATIBILITY IDEOGRAPH-2F85D;Lo;0;L;591A;;;;N;;;;; +2F85E;CJK COMPATIBILITY IDEOGRAPH-2F85E;Lo;0;L;5922;;;;N;;;;; +2F85F;CJK COMPATIBILITY IDEOGRAPH-2F85F;Lo;0;L;5962;;;;N;;;;; +2F860;CJK COMPATIBILITY IDEOGRAPH-2F860;Lo;0;L;216A8;;;;N;;;;; +2F861;CJK COMPATIBILITY IDEOGRAPH-2F861;Lo;0;L;216EA;;;;N;;;;; +2F862;CJK COMPATIBILITY IDEOGRAPH-2F862;Lo;0;L;59EC;;;;N;;;;; +2F863;CJK COMPATIBILITY IDEOGRAPH-2F863;Lo;0;L;5A1B;;;;N;;;;; +2F864;CJK COMPATIBILITY IDEOGRAPH-2F864;Lo;0;L;5A27;;;;N;;;;; +2F865;CJK COMPATIBILITY IDEOGRAPH-2F865;Lo;0;L;59D8;;;;N;;;;; +2F866;CJK COMPATIBILITY IDEOGRAPH-2F866;Lo;0;L;5A66;;;;N;;;;; +2F867;CJK COMPATIBILITY IDEOGRAPH-2F867;Lo;0;L;36EE;;;;N;;;;; +2F868;CJK COMPATIBILITY IDEOGRAPH-2F868;Lo;0;L;36FC;;;;N;;;;; +2F869;CJK COMPATIBILITY IDEOGRAPH-2F869;Lo;0;L;5B08;;;;N;;;;; +2F86A;CJK COMPATIBILITY IDEOGRAPH-2F86A;Lo;0;L;5B3E;;;;N;;;;; +2F86B;CJK COMPATIBILITY IDEOGRAPH-2F86B;Lo;0;L;5B3E;;;;N;;;;; +2F86C;CJK COMPATIBILITY IDEOGRAPH-2F86C;Lo;0;L;219C8;;;;N;;;;; +2F86D;CJK COMPATIBILITY IDEOGRAPH-2F86D;Lo;0;L;5BC3;;;;N;;;;; +2F86E;CJK COMPATIBILITY IDEOGRAPH-2F86E;Lo;0;L;5BD8;;;;N;;;;; +2F86F;CJK COMPATIBILITY IDEOGRAPH-2F86F;Lo;0;L;5BE7;;;;N;;;;; +2F870;CJK COMPATIBILITY IDEOGRAPH-2F870;Lo;0;L;5BF3;;;;N;;;;; +2F871;CJK COMPATIBILITY IDEOGRAPH-2F871;Lo;0;L;21B18;;;;N;;;;; +2F872;CJK COMPATIBILITY IDEOGRAPH-2F872;Lo;0;L;5BFF;;;;N;;;;; +2F873;CJK COMPATIBILITY IDEOGRAPH-2F873;Lo;0;L;5C06;;;;N;;;;; +2F874;CJK COMPATIBILITY IDEOGRAPH-2F874;Lo;0;L;5F53;;;;N;;;;; +2F875;CJK COMPATIBILITY IDEOGRAPH-2F875;Lo;0;L;5C22;;;;N;;;;; +2F876;CJK COMPATIBILITY IDEOGRAPH-2F876;Lo;0;L;3781;;;;N;;;;; +2F877;CJK COMPATIBILITY IDEOGRAPH-2F877;Lo;0;L;5C60;;;;N;;;;; +2F878;CJK COMPATIBILITY IDEOGRAPH-2F878;Lo;0;L;5C6E;;;;N;;;;; +2F879;CJK COMPATIBILITY IDEOGRAPH-2F879;Lo;0;L;5CC0;;;;N;;;;; +2F87A;CJK COMPATIBILITY IDEOGRAPH-2F87A;Lo;0;L;5C8D;;;;N;;;;; +2F87B;CJK COMPATIBILITY IDEOGRAPH-2F87B;Lo;0;L;21DE4;;;;N;;;;; +2F87C;CJK COMPATIBILITY IDEOGRAPH-2F87C;Lo;0;L;5D43;;;;N;;;;; +2F87D;CJK COMPATIBILITY IDEOGRAPH-2F87D;Lo;0;L;21DE6;;;;N;;;;; +2F87E;CJK COMPATIBILITY IDEOGRAPH-2F87E;Lo;0;L;5D6E;;;;N;;;;; +2F87F;CJK COMPATIBILITY IDEOGRAPH-2F87F;Lo;0;L;5D6B;;;;N;;;;; +2F880;CJK COMPATIBILITY IDEOGRAPH-2F880;Lo;0;L;5D7C;;;;N;;;;; +2F881;CJK COMPATIBILITY IDEOGRAPH-2F881;Lo;0;L;5DE1;;;;N;;;;; +2F882;CJK COMPATIBILITY IDEOGRAPH-2F882;Lo;0;L;5DE2;;;;N;;;;; +2F883;CJK COMPATIBILITY IDEOGRAPH-2F883;Lo;0;L;382F;;;;N;;;;; +2F884;CJK COMPATIBILITY IDEOGRAPH-2F884;Lo;0;L;5DFD;;;;N;;;;; +2F885;CJK COMPATIBILITY IDEOGRAPH-2F885;Lo;0;L;5E28;;;;N;;;;; +2F886;CJK COMPATIBILITY IDEOGRAPH-2F886;Lo;0;L;5E3D;;;;N;;;;; +2F887;CJK COMPATIBILITY IDEOGRAPH-2F887;Lo;0;L;5E69;;;;N;;;;; +2F888;CJK COMPATIBILITY IDEOGRAPH-2F888;Lo;0;L;3862;;;;N;;;;; +2F889;CJK COMPATIBILITY IDEOGRAPH-2F889;Lo;0;L;22183;;;;N;;;;; +2F88A;CJK COMPATIBILITY IDEOGRAPH-2F88A;Lo;0;L;387C;;;;N;;;;; +2F88B;CJK COMPATIBILITY IDEOGRAPH-2F88B;Lo;0;L;5EB0;;;;N;;;;; +2F88C;CJK COMPATIBILITY IDEOGRAPH-2F88C;Lo;0;L;5EB3;;;;N;;;;; +2F88D;CJK COMPATIBILITY IDEOGRAPH-2F88D;Lo;0;L;5EB6;;;;N;;;;; +2F88E;CJK COMPATIBILITY IDEOGRAPH-2F88E;Lo;0;L;5ECA;;;;N;;;;; +2F88F;CJK COMPATIBILITY IDEOGRAPH-2F88F;Lo;0;L;2A392;;;;N;;;;; +2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;9;N;;;;; +2F891;CJK COMPATIBILITY IDEOGRAPH-2F891;Lo;0;L;22331;;;;N;;;;; +2F892;CJK COMPATIBILITY IDEOGRAPH-2F892;Lo;0;L;22331;;;;N;;;;; +2F893;CJK COMPATIBILITY IDEOGRAPH-2F893;Lo;0;L;8201;;;;N;;;;; +2F894;CJK COMPATIBILITY IDEOGRAPH-2F894;Lo;0;L;5F22;;;;N;;;;; +2F895;CJK COMPATIBILITY IDEOGRAPH-2F895;Lo;0;L;5F22;;;;N;;;;; +2F896;CJK COMPATIBILITY IDEOGRAPH-2F896;Lo;0;L;38C7;;;;N;;;;; +2F897;CJK COMPATIBILITY IDEOGRAPH-2F897;Lo;0;L;232B8;;;;N;;;;; +2F898;CJK COMPATIBILITY IDEOGRAPH-2F898;Lo;0;L;261DA;;;;N;;;;; +2F899;CJK COMPATIBILITY IDEOGRAPH-2F899;Lo;0;L;5F62;;;;N;;;;; +2F89A;CJK COMPATIBILITY IDEOGRAPH-2F89A;Lo;0;L;5F6B;;;;N;;;;; +2F89B;CJK COMPATIBILITY IDEOGRAPH-2F89B;Lo;0;L;38E3;;;;N;;;;; +2F89C;CJK COMPATIBILITY IDEOGRAPH-2F89C;Lo;0;L;5F9A;;;;N;;;;; +2F89D;CJK COMPATIBILITY IDEOGRAPH-2F89D;Lo;0;L;5FCD;;;;N;;;;; +2F89E;CJK COMPATIBILITY IDEOGRAPH-2F89E;Lo;0;L;5FD7;;;;N;;;;; +2F89F;CJK COMPATIBILITY IDEOGRAPH-2F89F;Lo;0;L;5FF9;;;;N;;;;; +2F8A0;CJK COMPATIBILITY IDEOGRAPH-2F8A0;Lo;0;L;6081;;;;N;;;;; +2F8A1;CJK COMPATIBILITY IDEOGRAPH-2F8A1;Lo;0;L;393A;;;;N;;;;; +2F8A2;CJK COMPATIBILITY IDEOGRAPH-2F8A2;Lo;0;L;391C;;;;N;;;;; +2F8A3;CJK COMPATIBILITY IDEOGRAPH-2F8A3;Lo;0;L;6094;;;;N;;;;; +2F8A4;CJK COMPATIBILITY IDEOGRAPH-2F8A4;Lo;0;L;226D4;;;;N;;;;; +2F8A5;CJK COMPATIBILITY IDEOGRAPH-2F8A5;Lo;0;L;60C7;;;;N;;;;; +2F8A6;CJK COMPATIBILITY IDEOGRAPH-2F8A6;Lo;0;L;6148;;;;N;;;;; +2F8A7;CJK COMPATIBILITY IDEOGRAPH-2F8A7;Lo;0;L;614C;;;;N;;;;; +2F8A8;CJK COMPATIBILITY IDEOGRAPH-2F8A8;Lo;0;L;614E;;;;N;;;;; +2F8A9;CJK COMPATIBILITY IDEOGRAPH-2F8A9;Lo;0;L;614C;;;;N;;;;; +2F8AA;CJK COMPATIBILITY IDEOGRAPH-2F8AA;Lo;0;L;617A;;;;N;;;;; +2F8AB;CJK COMPATIBILITY IDEOGRAPH-2F8AB;Lo;0;L;618E;;;;N;;;;; +2F8AC;CJK COMPATIBILITY IDEOGRAPH-2F8AC;Lo;0;L;61B2;;;;N;;;;; +2F8AD;CJK COMPATIBILITY IDEOGRAPH-2F8AD;Lo;0;L;61A4;;;;N;;;;; +2F8AE;CJK COMPATIBILITY IDEOGRAPH-2F8AE;Lo;0;L;61AF;;;;N;;;;; +2F8AF;CJK COMPATIBILITY IDEOGRAPH-2F8AF;Lo;0;L;61DE;;;;N;;;;; +2F8B0;CJK COMPATIBILITY IDEOGRAPH-2F8B0;Lo;0;L;61F2;;;;N;;;;; +2F8B1;CJK COMPATIBILITY IDEOGRAPH-2F8B1;Lo;0;L;61F6;;;;N;;;;; +2F8B2;CJK COMPATIBILITY IDEOGRAPH-2F8B2;Lo;0;L;6210;;;;N;;;;; +2F8B3;CJK COMPATIBILITY IDEOGRAPH-2F8B3;Lo;0;L;621B;;;;N;;;;; +2F8B4;CJK COMPATIBILITY IDEOGRAPH-2F8B4;Lo;0;L;625D;;;;N;;;;; +2F8B5;CJK COMPATIBILITY IDEOGRAPH-2F8B5;Lo;0;L;62B1;;;;N;;;;; +2F8B6;CJK COMPATIBILITY IDEOGRAPH-2F8B6;Lo;0;L;62D4;;;;N;;;;; +2F8B7;CJK COMPATIBILITY IDEOGRAPH-2F8B7;Lo;0;L;6350;;;;N;;;;; +2F8B8;CJK COMPATIBILITY IDEOGRAPH-2F8B8;Lo;0;L;22B0C;;;;N;;;;; +2F8B9;CJK COMPATIBILITY IDEOGRAPH-2F8B9;Lo;0;L;633D;;;;N;;;;; +2F8BA;CJK COMPATIBILITY IDEOGRAPH-2F8BA;Lo;0;L;62FC;;;;N;;;;; +2F8BB;CJK COMPATIBILITY IDEOGRAPH-2F8BB;Lo;0;L;6368;;;;N;;;;; +2F8BC;CJK COMPATIBILITY IDEOGRAPH-2F8BC;Lo;0;L;6383;;;;N;;;;; +2F8BD;CJK COMPATIBILITY IDEOGRAPH-2F8BD;Lo;0;L;63E4;;;;N;;;;; +2F8BE;CJK COMPATIBILITY IDEOGRAPH-2F8BE;Lo;0;L;22BF1;;;;N;;;;; +2F8BF;CJK COMPATIBILITY IDEOGRAPH-2F8BF;Lo;0;L;6422;;;;N;;;;; +2F8C0;CJK COMPATIBILITY IDEOGRAPH-2F8C0;Lo;0;L;63C5;;;;N;;;;; +2F8C1;CJK COMPATIBILITY IDEOGRAPH-2F8C1;Lo;0;L;63A9;;;;N;;;;; +2F8C2;CJK COMPATIBILITY IDEOGRAPH-2F8C2;Lo;0;L;3A2E;;;;N;;;;; +2F8C3;CJK COMPATIBILITY IDEOGRAPH-2F8C3;Lo;0;L;6469;;;;N;;;;; +2F8C4;CJK COMPATIBILITY IDEOGRAPH-2F8C4;Lo;0;L;647E;;;;N;;;;; +2F8C5;CJK COMPATIBILITY IDEOGRAPH-2F8C5;Lo;0;L;649D;;;;N;;;;; +2F8C6;CJK COMPATIBILITY IDEOGRAPH-2F8C6;Lo;0;L;6477;;;;N;;;;; +2F8C7;CJK COMPATIBILITY IDEOGRAPH-2F8C7;Lo;0;L;3A6C;;;;N;;;;; +2F8C8;CJK COMPATIBILITY IDEOGRAPH-2F8C8;Lo;0;L;654F;;;;N;;;;; +2F8C9;CJK COMPATIBILITY IDEOGRAPH-2F8C9;Lo;0;L;656C;;;;N;;;;; +2F8CA;CJK COMPATIBILITY IDEOGRAPH-2F8CA;Lo;0;L;2300A;;;;N;;;;; +2F8CB;CJK COMPATIBILITY IDEOGRAPH-2F8CB;Lo;0;L;65E3;;;;N;;;;; +2F8CC;CJK COMPATIBILITY IDEOGRAPH-2F8CC;Lo;0;L;66F8;;;;N;;;;; +2F8CD;CJK COMPATIBILITY IDEOGRAPH-2F8CD;Lo;0;L;6649;;;;N;;;;; +2F8CE;CJK COMPATIBILITY IDEOGRAPH-2F8CE;Lo;0;L;3B19;;;;N;;;;; +2F8CF;CJK COMPATIBILITY IDEOGRAPH-2F8CF;Lo;0;L;6691;;;;N;;;;; +2F8D0;CJK COMPATIBILITY IDEOGRAPH-2F8D0;Lo;0;L;3B08;;;;N;;;;; +2F8D1;CJK COMPATIBILITY IDEOGRAPH-2F8D1;Lo;0;L;3AE4;;;;N;;;;; +2F8D2;CJK COMPATIBILITY IDEOGRAPH-2F8D2;Lo;0;L;5192;;;;N;;;;; +2F8D3;CJK COMPATIBILITY IDEOGRAPH-2F8D3;Lo;0;L;5195;;;;N;;;;; +2F8D4;CJK COMPATIBILITY IDEOGRAPH-2F8D4;Lo;0;L;6700;;;;N;;;;; +2F8D5;CJK COMPATIBILITY IDEOGRAPH-2F8D5;Lo;0;L;669C;;;;N;;;;; +2F8D6;CJK COMPATIBILITY IDEOGRAPH-2F8D6;Lo;0;L;80AD;;;;N;;;;; +2F8D7;CJK COMPATIBILITY IDEOGRAPH-2F8D7;Lo;0;L;43D9;;;;N;;;;; +2F8D8;CJK COMPATIBILITY IDEOGRAPH-2F8D8;Lo;0;L;6717;;;;N;;;;; +2F8D9;CJK COMPATIBILITY IDEOGRAPH-2F8D9;Lo;0;L;671B;;;;N;;;;; +2F8DA;CJK COMPATIBILITY IDEOGRAPH-2F8DA;Lo;0;L;6721;;;;N;;;;; +2F8DB;CJK COMPATIBILITY IDEOGRAPH-2F8DB;Lo;0;L;675E;;;;N;;;;; +2F8DC;CJK COMPATIBILITY IDEOGRAPH-2F8DC;Lo;0;L;6753;;;;N;;;;; +2F8DD;CJK COMPATIBILITY IDEOGRAPH-2F8DD;Lo;0;L;233C3;;;;N;;;;; +2F8DE;CJK COMPATIBILITY IDEOGRAPH-2F8DE;Lo;0;L;3B49;;;;N;;;;; +2F8DF;CJK COMPATIBILITY IDEOGRAPH-2F8DF;Lo;0;L;67FA;;;;N;;;;; +2F8E0;CJK COMPATIBILITY IDEOGRAPH-2F8E0;Lo;0;L;6785;;;;N;;;;; +2F8E1;CJK COMPATIBILITY IDEOGRAPH-2F8E1;Lo;0;L;6852;;;;N;;;;; +2F8E2;CJK COMPATIBILITY IDEOGRAPH-2F8E2;Lo;0;L;6885;;;;N;;;;; +2F8E3;CJK COMPATIBILITY IDEOGRAPH-2F8E3;Lo;0;L;2346D;;;;N;;;;; +2F8E4;CJK COMPATIBILITY IDEOGRAPH-2F8E4;Lo;0;L;688E;;;;N;;;;; +2F8E5;CJK COMPATIBILITY IDEOGRAPH-2F8E5;Lo;0;L;681F;;;;N;;;;; +2F8E6;CJK COMPATIBILITY IDEOGRAPH-2F8E6;Lo;0;L;6914;;;;N;;;;; +2F8E7;CJK COMPATIBILITY IDEOGRAPH-2F8E7;Lo;0;L;3B9D;;;;N;;;;; +2F8E8;CJK COMPATIBILITY IDEOGRAPH-2F8E8;Lo;0;L;6942;;;;N;;;;; +2F8E9;CJK COMPATIBILITY IDEOGRAPH-2F8E9;Lo;0;L;69A3;;;;N;;;;; +2F8EA;CJK COMPATIBILITY IDEOGRAPH-2F8EA;Lo;0;L;69EA;;;;N;;;;; +2F8EB;CJK COMPATIBILITY IDEOGRAPH-2F8EB;Lo;0;L;6AA8;;;;N;;;;; +2F8EC;CJK COMPATIBILITY IDEOGRAPH-2F8EC;Lo;0;L;236A3;;;;N;;;;; +2F8ED;CJK COMPATIBILITY IDEOGRAPH-2F8ED;Lo;0;L;6ADB;;;;N;;;;; +2F8EE;CJK COMPATIBILITY IDEOGRAPH-2F8EE;Lo;0;L;3C18;;;;N;;;;; +2F8EF;CJK COMPATIBILITY IDEOGRAPH-2F8EF;Lo;0;L;6B21;;;;N;;;;; +2F8F0;CJK COMPATIBILITY IDEOGRAPH-2F8F0;Lo;0;L;238A7;;;;N;;;;; +2F8F1;CJK COMPATIBILITY IDEOGRAPH-2F8F1;Lo;0;L;6B54;;;;N;;;;; +2F8F2;CJK COMPATIBILITY IDEOGRAPH-2F8F2;Lo;0;L;3C4E;;;;N;;;;; +2F8F3;CJK COMPATIBILITY IDEOGRAPH-2F8F3;Lo;0;L;6B72;;;;N;;;;; +2F8F4;CJK COMPATIBILITY IDEOGRAPH-2F8F4;Lo;0;L;6B9F;;;;N;;;;; +2F8F5;CJK COMPATIBILITY IDEOGRAPH-2F8F5;Lo;0;L;6BBA;;;;N;;;;; +2F8F6;CJK COMPATIBILITY IDEOGRAPH-2F8F6;Lo;0;L;6BBB;;;;N;;;;; +2F8F7;CJK COMPATIBILITY IDEOGRAPH-2F8F7;Lo;0;L;23A8D;;;;N;;;;; +2F8F8;CJK COMPATIBILITY IDEOGRAPH-2F8F8;Lo;0;L;21D0B;;;;N;;;;; +2F8F9;CJK COMPATIBILITY IDEOGRAPH-2F8F9;Lo;0;L;23AFA;;;;N;;;;; +2F8FA;CJK COMPATIBILITY IDEOGRAPH-2F8FA;Lo;0;L;6C4E;;;;N;;;;; +2F8FB;CJK COMPATIBILITY IDEOGRAPH-2F8FB;Lo;0;L;23CBC;;;;N;;;;; +2F8FC;CJK COMPATIBILITY IDEOGRAPH-2F8FC;Lo;0;L;6CBF;;;;N;;;;; +2F8FD;CJK COMPATIBILITY IDEOGRAPH-2F8FD;Lo;0;L;6CCD;;;;N;;;;; +2F8FE;CJK COMPATIBILITY IDEOGRAPH-2F8FE;Lo;0;L;6C67;;;;N;;;;; +2F8FF;CJK COMPATIBILITY IDEOGRAPH-2F8FF;Lo;0;L;6D16;;;;N;;;;; +2F900;CJK COMPATIBILITY IDEOGRAPH-2F900;Lo;0;L;6D3E;;;;N;;;;; +2F901;CJK COMPATIBILITY IDEOGRAPH-2F901;Lo;0;L;6D77;;;;N;;;;; +2F902;CJK COMPATIBILITY IDEOGRAPH-2F902;Lo;0;L;6D41;;;;N;;;;; +2F903;CJK COMPATIBILITY IDEOGRAPH-2F903;Lo;0;L;6D69;;;;N;;;;; +2F904;CJK COMPATIBILITY IDEOGRAPH-2F904;Lo;0;L;6D78;;;;N;;;;; +2F905;CJK COMPATIBILITY IDEOGRAPH-2F905;Lo;0;L;6D85;;;;N;;;;; +2F906;CJK COMPATIBILITY IDEOGRAPH-2F906;Lo;0;L;23D1E;;;;N;;;;; +2F907;CJK COMPATIBILITY IDEOGRAPH-2F907;Lo;0;L;6D34;;;;N;;;;; +2F908;CJK COMPATIBILITY IDEOGRAPH-2F908;Lo;0;L;6E2F;;;;N;;;;; +2F909;CJK COMPATIBILITY IDEOGRAPH-2F909;Lo;0;L;6E6E;;;;N;;;;; +2F90A;CJK COMPATIBILITY IDEOGRAPH-2F90A;Lo;0;L;3D33;;;;N;;;;; +2F90B;CJK COMPATIBILITY IDEOGRAPH-2F90B;Lo;0;L;6ECB;;;;N;;;;; +2F90C;CJK COMPATIBILITY IDEOGRAPH-2F90C;Lo;0;L;6EC7;;;;N;;;;; +2F90D;CJK COMPATIBILITY IDEOGRAPH-2F90D;Lo;0;L;23ED1;;;;N;;;;; +2F90E;CJK COMPATIBILITY IDEOGRAPH-2F90E;Lo;0;L;6DF9;;;;N;;;;; +2F90F;CJK COMPATIBILITY IDEOGRAPH-2F90F;Lo;0;L;6F6E;;;;N;;;;; +2F910;CJK COMPATIBILITY IDEOGRAPH-2F910;Lo;0;L;23F5E;;;;N;;;;; +2F911;CJK COMPATIBILITY IDEOGRAPH-2F911;Lo;0;L;23F8E;;;;N;;;;; +2F912;CJK COMPATIBILITY IDEOGRAPH-2F912;Lo;0;L;6FC6;;;;N;;;;; +2F913;CJK COMPATIBILITY IDEOGRAPH-2F913;Lo;0;L;7039;;;;N;;;;; +2F914;CJK COMPATIBILITY IDEOGRAPH-2F914;Lo;0;L;701E;;;;N;;;;; +2F915;CJK COMPATIBILITY IDEOGRAPH-2F915;Lo;0;L;701B;;;;N;;;;; +2F916;CJK COMPATIBILITY IDEOGRAPH-2F916;Lo;0;L;3D96;;;;N;;;;; +2F917;CJK COMPATIBILITY IDEOGRAPH-2F917;Lo;0;L;704A;;;;N;;;;; +2F918;CJK COMPATIBILITY IDEOGRAPH-2F918;Lo;0;L;707D;;;;N;;;;; +2F919;CJK COMPATIBILITY IDEOGRAPH-2F919;Lo;0;L;7077;;;;N;;;;; +2F91A;CJK COMPATIBILITY IDEOGRAPH-2F91A;Lo;0;L;70AD;;;;N;;;;; +2F91B;CJK COMPATIBILITY IDEOGRAPH-2F91B;Lo;0;L;20525;;;;N;;;;; +2F91C;CJK COMPATIBILITY IDEOGRAPH-2F91C;Lo;0;L;7145;;;;N;;;;; +2F91D;CJK COMPATIBILITY IDEOGRAPH-2F91D;Lo;0;L;24263;;;;N;;;;; +2F91E;CJK COMPATIBILITY IDEOGRAPH-2F91E;Lo;0;L;719C;;;;N;;;;; +2F91F;CJK COMPATIBILITY IDEOGRAPH-2F91F;Lo;0;L;243AB;;;;N;;;;; +2F920;CJK COMPATIBILITY IDEOGRAPH-2F920;Lo;0;L;7228;;;;N;;;;; +2F921;CJK COMPATIBILITY IDEOGRAPH-2F921;Lo;0;L;7235;;;;N;;;;; +2F922;CJK COMPATIBILITY IDEOGRAPH-2F922;Lo;0;L;7250;;;;N;;;;; +2F923;CJK COMPATIBILITY IDEOGRAPH-2F923;Lo;0;L;24608;;;;N;;;;; +2F924;CJK COMPATIBILITY IDEOGRAPH-2F924;Lo;0;L;7280;;;;N;;;;; +2F925;CJK COMPATIBILITY IDEOGRAPH-2F925;Lo;0;L;7295;;;;N;;;;; +2F926;CJK COMPATIBILITY IDEOGRAPH-2F926;Lo;0;L;24735;;;;N;;;;; +2F927;CJK COMPATIBILITY IDEOGRAPH-2F927;Lo;0;L;24814;;;;N;;;;; +2F928;CJK COMPATIBILITY IDEOGRAPH-2F928;Lo;0;L;737A;;;;N;;;;; +2F929;CJK COMPATIBILITY IDEOGRAPH-2F929;Lo;0;L;738B;;;;N;;;;; +2F92A;CJK COMPATIBILITY IDEOGRAPH-2F92A;Lo;0;L;3EAC;;;;N;;;;; +2F92B;CJK COMPATIBILITY IDEOGRAPH-2F92B;Lo;0;L;73A5;;;;N;;;;; +2F92C;CJK COMPATIBILITY IDEOGRAPH-2F92C;Lo;0;L;3EB8;;;;N;;;;; +2F92D;CJK COMPATIBILITY IDEOGRAPH-2F92D;Lo;0;L;3EB8;;;;N;;;;; +2F92E;CJK COMPATIBILITY IDEOGRAPH-2F92E;Lo;0;L;7447;;;;N;;;;; +2F92F;CJK COMPATIBILITY IDEOGRAPH-2F92F;Lo;0;L;745C;;;;N;;;;; +2F930;CJK COMPATIBILITY IDEOGRAPH-2F930;Lo;0;L;7471;;;;N;;;;; +2F931;CJK COMPATIBILITY IDEOGRAPH-2F931;Lo;0;L;7485;;;;N;;;;; +2F932;CJK COMPATIBILITY IDEOGRAPH-2F932;Lo;0;L;74CA;;;;N;;;;; +2F933;CJK COMPATIBILITY IDEOGRAPH-2F933;Lo;0;L;3F1B;;;;N;;;;; +2F934;CJK COMPATIBILITY IDEOGRAPH-2F934;Lo;0;L;7524;;;;N;;;;; +2F935;CJK COMPATIBILITY IDEOGRAPH-2F935;Lo;0;L;24C36;;;;N;;;;; +2F936;CJK COMPATIBILITY IDEOGRAPH-2F936;Lo;0;L;753E;;;;N;;;;; +2F937;CJK COMPATIBILITY IDEOGRAPH-2F937;Lo;0;L;24C92;;;;N;;;;; +2F938;CJK COMPATIBILITY IDEOGRAPH-2F938;Lo;0;L;7570;;;;N;;;;; +2F939;CJK COMPATIBILITY IDEOGRAPH-2F939;Lo;0;L;2219F;;;;N;;;;; +2F93A;CJK COMPATIBILITY IDEOGRAPH-2F93A;Lo;0;L;7610;;;;N;;;;; +2F93B;CJK COMPATIBILITY IDEOGRAPH-2F93B;Lo;0;L;24FA1;;;;N;;;;; +2F93C;CJK COMPATIBILITY IDEOGRAPH-2F93C;Lo;0;L;24FB8;;;;N;;;;; +2F93D;CJK COMPATIBILITY IDEOGRAPH-2F93D;Lo;0;L;25044;;;;N;;;;; +2F93E;CJK COMPATIBILITY IDEOGRAPH-2F93E;Lo;0;L;3FFC;;;;N;;;;; +2F93F;CJK COMPATIBILITY IDEOGRAPH-2F93F;Lo;0;L;4008;;;;N;;;;; +2F940;CJK COMPATIBILITY IDEOGRAPH-2F940;Lo;0;L;76F4;;;;N;;;;; +2F941;CJK COMPATIBILITY IDEOGRAPH-2F941;Lo;0;L;250F3;;;;N;;;;; +2F942;CJK COMPATIBILITY IDEOGRAPH-2F942;Lo;0;L;250F2;;;;N;;;;; +2F943;CJK COMPATIBILITY IDEOGRAPH-2F943;Lo;0;L;25119;;;;N;;;;; +2F944;CJK COMPATIBILITY IDEOGRAPH-2F944;Lo;0;L;25133;;;;N;;;;; +2F945;CJK COMPATIBILITY IDEOGRAPH-2F945;Lo;0;L;771E;;;;N;;;;; +2F946;CJK COMPATIBILITY IDEOGRAPH-2F946;Lo;0;L;771F;;;;N;;;;; +2F947;CJK COMPATIBILITY IDEOGRAPH-2F947;Lo;0;L;771F;;;;N;;;;; +2F948;CJK COMPATIBILITY IDEOGRAPH-2F948;Lo;0;L;774A;;;;N;;;;; +2F949;CJK COMPATIBILITY IDEOGRAPH-2F949;Lo;0;L;4039;;;;N;;;;; +2F94A;CJK COMPATIBILITY IDEOGRAPH-2F94A;Lo;0;L;778B;;;;N;;;;; +2F94B;CJK COMPATIBILITY IDEOGRAPH-2F94B;Lo;0;L;4046;;;;N;;;;; +2F94C;CJK COMPATIBILITY IDEOGRAPH-2F94C;Lo;0;L;4096;;;;N;;;;; +2F94D;CJK COMPATIBILITY IDEOGRAPH-2F94D;Lo;0;L;2541D;;;;N;;;;; +2F94E;CJK COMPATIBILITY IDEOGRAPH-2F94E;Lo;0;L;784E;;;;N;;;;; +2F94F;CJK COMPATIBILITY IDEOGRAPH-2F94F;Lo;0;L;788C;;;;N;;;;; +2F950;CJK COMPATIBILITY IDEOGRAPH-2F950;Lo;0;L;78CC;;;;N;;;;; +2F951;CJK COMPATIBILITY IDEOGRAPH-2F951;Lo;0;L;40E3;;;;N;;;;; +2F952;CJK COMPATIBILITY IDEOGRAPH-2F952;Lo;0;L;25626;;;;N;;;;; +2F953;CJK COMPATIBILITY IDEOGRAPH-2F953;Lo;0;L;7956;;;;N;;;;; +2F954;CJK COMPATIBILITY IDEOGRAPH-2F954;Lo;0;L;2569A;;;;N;;;;; +2F955;CJK COMPATIBILITY IDEOGRAPH-2F955;Lo;0;L;256C5;;;;N;;;;; +2F956;CJK COMPATIBILITY IDEOGRAPH-2F956;Lo;0;L;798F;;;;N;;;;; +2F957;CJK COMPATIBILITY IDEOGRAPH-2F957;Lo;0;L;79EB;;;;N;;;;; +2F958;CJK COMPATIBILITY IDEOGRAPH-2F958;Lo;0;L;412F;;;;N;;;;; +2F959;CJK COMPATIBILITY IDEOGRAPH-2F959;Lo;0;L;7A40;;;;N;;;;; +2F95A;CJK COMPATIBILITY IDEOGRAPH-2F95A;Lo;0;L;7A4A;;;;N;;;;; +2F95B;CJK COMPATIBILITY IDEOGRAPH-2F95B;Lo;0;L;7A4F;;;;N;;;;; +2F95C;CJK COMPATIBILITY IDEOGRAPH-2F95C;Lo;0;L;2597C;;;;N;;;;; +2F95D;CJK COMPATIBILITY IDEOGRAPH-2F95D;Lo;0;L;25AA7;;;;N;;;;; +2F95E;CJK COMPATIBILITY IDEOGRAPH-2F95E;Lo;0;L;25AA7;;;;N;;;;; +2F95F;CJK COMPATIBILITY IDEOGRAPH-2F95F;Lo;0;L;7AEE;;;;N;;;;; +2F960;CJK COMPATIBILITY IDEOGRAPH-2F960;Lo;0;L;4202;;;;N;;;;; +2F961;CJK COMPATIBILITY IDEOGRAPH-2F961;Lo;0;L;25BAB;;;;N;;;;; +2F962;CJK COMPATIBILITY IDEOGRAPH-2F962;Lo;0;L;7BC6;;;;N;;;;; +2F963;CJK COMPATIBILITY IDEOGRAPH-2F963;Lo;0;L;7BC9;;;;N;;;;; +2F964;CJK COMPATIBILITY IDEOGRAPH-2F964;Lo;0;L;4227;;;;N;;;;; +2F965;CJK COMPATIBILITY IDEOGRAPH-2F965;Lo;0;L;25C80;;;;N;;;;; +2F966;CJK COMPATIBILITY IDEOGRAPH-2F966;Lo;0;L;7CD2;;;;N;;;;; +2F967;CJK COMPATIBILITY IDEOGRAPH-2F967;Lo;0;L;42A0;;;;N;;;;; +2F968;CJK COMPATIBILITY IDEOGRAPH-2F968;Lo;0;L;7CE8;;;;N;;;;; +2F969;CJK COMPATIBILITY IDEOGRAPH-2F969;Lo;0;L;7CE3;;;;N;;;;; +2F96A;CJK COMPATIBILITY IDEOGRAPH-2F96A;Lo;0;L;7D00;;;;N;;;;; +2F96B;CJK COMPATIBILITY IDEOGRAPH-2F96B;Lo;0;L;25F86;;;;N;;;;; +2F96C;CJK COMPATIBILITY IDEOGRAPH-2F96C;Lo;0;L;7D63;;;;N;;;;; +2F96D;CJK COMPATIBILITY IDEOGRAPH-2F96D;Lo;0;L;4301;;;;N;;;;; +2F96E;CJK COMPATIBILITY IDEOGRAPH-2F96E;Lo;0;L;7DC7;;;;N;;;;; +2F96F;CJK COMPATIBILITY IDEOGRAPH-2F96F;Lo;0;L;7E02;;;;N;;;;; +2F970;CJK COMPATIBILITY IDEOGRAPH-2F970;Lo;0;L;7E45;;;;N;;;;; +2F971;CJK COMPATIBILITY IDEOGRAPH-2F971;Lo;0;L;4334;;;;N;;;;; +2F972;CJK COMPATIBILITY IDEOGRAPH-2F972;Lo;0;L;26228;;;;N;;;;; +2F973;CJK COMPATIBILITY IDEOGRAPH-2F973;Lo;0;L;26247;;;;N;;;;; +2F974;CJK COMPATIBILITY IDEOGRAPH-2F974;Lo;0;L;4359;;;;N;;;;; +2F975;CJK COMPATIBILITY IDEOGRAPH-2F975;Lo;0;L;262D9;;;;N;;;;; +2F976;CJK COMPATIBILITY IDEOGRAPH-2F976;Lo;0;L;7F7A;;;;N;;;;; +2F977;CJK COMPATIBILITY IDEOGRAPH-2F977;Lo;0;L;2633E;;;;N;;;;; +2F978;CJK COMPATIBILITY IDEOGRAPH-2F978;Lo;0;L;7F95;;;;N;;;;; +2F979;CJK COMPATIBILITY IDEOGRAPH-2F979;Lo;0;L;7FFA;;;;N;;;;; +2F97A;CJK COMPATIBILITY IDEOGRAPH-2F97A;Lo;0;L;8005;;;;N;;;;; +2F97B;CJK COMPATIBILITY IDEOGRAPH-2F97B;Lo;0;L;264DA;;;;N;;;;; +2F97C;CJK COMPATIBILITY IDEOGRAPH-2F97C;Lo;0;L;26523;;;;N;;;;; +2F97D;CJK COMPATIBILITY IDEOGRAPH-2F97D;Lo;0;L;8060;;;;N;;;;; +2F97E;CJK COMPATIBILITY IDEOGRAPH-2F97E;Lo;0;L;265A8;;;;N;;;;; +2F97F;CJK COMPATIBILITY IDEOGRAPH-2F97F;Lo;0;L;8070;;;;N;;;;; +2F980;CJK COMPATIBILITY IDEOGRAPH-2F980;Lo;0;L;2335F;;;;N;;;;; +2F981;CJK COMPATIBILITY IDEOGRAPH-2F981;Lo;0;L;43D5;;;;N;;;;; +2F982;CJK COMPATIBILITY IDEOGRAPH-2F982;Lo;0;L;80B2;;;;N;;;;; +2F983;CJK COMPATIBILITY IDEOGRAPH-2F983;Lo;0;L;8103;;;;N;;;;; +2F984;CJK COMPATIBILITY IDEOGRAPH-2F984;Lo;0;L;440B;;;;N;;;;; +2F985;CJK COMPATIBILITY IDEOGRAPH-2F985;Lo;0;L;813E;;;;N;;;;; +2F986;CJK COMPATIBILITY IDEOGRAPH-2F986;Lo;0;L;5AB5;;;;N;;;;; +2F987;CJK COMPATIBILITY IDEOGRAPH-2F987;Lo;0;L;267A7;;;;N;;;;; +2F988;CJK COMPATIBILITY IDEOGRAPH-2F988;Lo;0;L;267B5;;;;N;;;;; +2F989;CJK COMPATIBILITY IDEOGRAPH-2F989;Lo;0;L;23393;;;;N;;;;; +2F98A;CJK COMPATIBILITY IDEOGRAPH-2F98A;Lo;0;L;2339C;;;;N;;;;; +2F98B;CJK COMPATIBILITY IDEOGRAPH-2F98B;Lo;0;L;8201;;;;N;;;;; +2F98C;CJK COMPATIBILITY IDEOGRAPH-2F98C;Lo;0;L;8204;;;;N;;;;; +2F98D;CJK COMPATIBILITY IDEOGRAPH-2F98D;Lo;0;L;8F9E;;;;N;;;;; +2F98E;CJK COMPATIBILITY IDEOGRAPH-2F98E;Lo;0;L;446B;;;;N;;;;; +2F98F;CJK COMPATIBILITY IDEOGRAPH-2F98F;Lo;0;L;8291;;;;N;;;;; +2F990;CJK COMPATIBILITY IDEOGRAPH-2F990;Lo;0;L;828B;;;;N;;;;; +2F991;CJK COMPATIBILITY IDEOGRAPH-2F991;Lo;0;L;829D;;;;N;;;;; +2F992;CJK COMPATIBILITY IDEOGRAPH-2F992;Lo;0;L;52B3;;;;N;;;;; +2F993;CJK COMPATIBILITY IDEOGRAPH-2F993;Lo;0;L;82B1;;;;N;;;;; +2F994;CJK COMPATIBILITY IDEOGRAPH-2F994;Lo;0;L;82B3;;;;N;;;;; +2F995;CJK COMPATIBILITY IDEOGRAPH-2F995;Lo;0;L;82BD;;;;N;;;;; +2F996;CJK COMPATIBILITY IDEOGRAPH-2F996;Lo;0;L;82E6;;;;N;;;;; +2F997;CJK COMPATIBILITY IDEOGRAPH-2F997;Lo;0;L;26B3C;;;;N;;;;; +2F998;CJK COMPATIBILITY IDEOGRAPH-2F998;Lo;0;L;82E5;;;;N;;;;; +2F999;CJK COMPATIBILITY IDEOGRAPH-2F999;Lo;0;L;831D;;;;N;;;;; +2F99A;CJK COMPATIBILITY IDEOGRAPH-2F99A;Lo;0;L;8363;;;;N;;;;; +2F99B;CJK COMPATIBILITY IDEOGRAPH-2F99B;Lo;0;L;83AD;;;;N;;;;; +2F99C;CJK COMPATIBILITY IDEOGRAPH-2F99C;Lo;0;L;8323;;;;N;;;;; +2F99D;CJK COMPATIBILITY IDEOGRAPH-2F99D;Lo;0;L;83BD;;;;N;;;;; +2F99E;CJK COMPATIBILITY IDEOGRAPH-2F99E;Lo;0;L;83E7;;;;N;;;;; +2F99F;CJK COMPATIBILITY IDEOGRAPH-2F99F;Lo;0;L;8457;;;;N;;;;; +2F9A0;CJK COMPATIBILITY IDEOGRAPH-2F9A0;Lo;0;L;8353;;;;N;;;;; +2F9A1;CJK COMPATIBILITY IDEOGRAPH-2F9A1;Lo;0;L;83CA;;;;N;;;;; +2F9A2;CJK COMPATIBILITY IDEOGRAPH-2F9A2;Lo;0;L;83CC;;;;N;;;;; +2F9A3;CJK COMPATIBILITY IDEOGRAPH-2F9A3;Lo;0;L;83DC;;;;N;;;;; +2F9A4;CJK COMPATIBILITY IDEOGRAPH-2F9A4;Lo;0;L;26C36;;;;N;;;;; +2F9A5;CJK COMPATIBILITY IDEOGRAPH-2F9A5;Lo;0;L;26D6B;;;;N;;;;; +2F9A6;CJK COMPATIBILITY IDEOGRAPH-2F9A6;Lo;0;L;26CD5;;;;N;;;;; +2F9A7;CJK COMPATIBILITY IDEOGRAPH-2F9A7;Lo;0;L;452B;;;;N;;;;; +2F9A8;CJK COMPATIBILITY IDEOGRAPH-2F9A8;Lo;0;L;84F1;;;;N;;;;; +2F9A9;CJK COMPATIBILITY IDEOGRAPH-2F9A9;Lo;0;L;84F3;;;;N;;;;; +2F9AA;CJK COMPATIBILITY IDEOGRAPH-2F9AA;Lo;0;L;8516;;;;N;;;;; +2F9AB;CJK COMPATIBILITY IDEOGRAPH-2F9AB;Lo;0;L;273CA;;;;N;;;;; +2F9AC;CJK COMPATIBILITY IDEOGRAPH-2F9AC;Lo;0;L;8564;;;;N;;;;; +2F9AD;CJK COMPATIBILITY IDEOGRAPH-2F9AD;Lo;0;L;26F2C;;;;N;;;;; +2F9AE;CJK COMPATIBILITY IDEOGRAPH-2F9AE;Lo;0;L;455D;;;;N;;;;; +2F9AF;CJK COMPATIBILITY IDEOGRAPH-2F9AF;Lo;0;L;4561;;;;N;;;;; +2F9B0;CJK COMPATIBILITY IDEOGRAPH-2F9B0;Lo;0;L;26FB1;;;;N;;;;; +2F9B1;CJK COMPATIBILITY IDEOGRAPH-2F9B1;Lo;0;L;270D2;;;;N;;;;; +2F9B2;CJK COMPATIBILITY IDEOGRAPH-2F9B2;Lo;0;L;456B;;;;N;;;;; +2F9B3;CJK COMPATIBILITY IDEOGRAPH-2F9B3;Lo;0;L;8650;;;;N;;;;; +2F9B4;CJK COMPATIBILITY IDEOGRAPH-2F9B4;Lo;0;L;865C;;;;N;;;;; +2F9B5;CJK COMPATIBILITY IDEOGRAPH-2F9B5;Lo;0;L;8667;;;;N;;;;; +2F9B6;CJK COMPATIBILITY IDEOGRAPH-2F9B6;Lo;0;L;8669;;;;N;;;;; +2F9B7;CJK COMPATIBILITY IDEOGRAPH-2F9B7;Lo;0;L;86A9;;;;N;;;;; +2F9B8;CJK COMPATIBILITY IDEOGRAPH-2F9B8;Lo;0;L;8688;;;;N;;;;; +2F9B9;CJK COMPATIBILITY IDEOGRAPH-2F9B9;Lo;0;L;870E;;;;N;;;;; +2F9BA;CJK COMPATIBILITY IDEOGRAPH-2F9BA;Lo;0;L;86E2;;;;N;;;;; +2F9BB;CJK COMPATIBILITY IDEOGRAPH-2F9BB;Lo;0;L;8779;;;;N;;;;; +2F9BC;CJK COMPATIBILITY IDEOGRAPH-2F9BC;Lo;0;L;8728;;;;N;;;;; +2F9BD;CJK COMPATIBILITY IDEOGRAPH-2F9BD;Lo;0;L;876B;;;;N;;;;; +2F9BE;CJK COMPATIBILITY IDEOGRAPH-2F9BE;Lo;0;L;8786;;;;N;;;;; +2F9BF;CJK COMPATIBILITY IDEOGRAPH-2F9BF;Lo;0;L;45D7;;;;N;;;;; +2F9C0;CJK COMPATIBILITY IDEOGRAPH-2F9C0;Lo;0;L;87E1;;;;N;;;;; +2F9C1;CJK COMPATIBILITY IDEOGRAPH-2F9C1;Lo;0;L;8801;;;;N;;;;; +2F9C2;CJK COMPATIBILITY IDEOGRAPH-2F9C2;Lo;0;L;45F9;;;;N;;;;; +2F9C3;CJK COMPATIBILITY IDEOGRAPH-2F9C3;Lo;0;L;8860;;;;N;;;;; +2F9C4;CJK COMPATIBILITY IDEOGRAPH-2F9C4;Lo;0;L;8863;;;;N;;;;; +2F9C5;CJK COMPATIBILITY IDEOGRAPH-2F9C5;Lo;0;L;27667;;;;N;;;;; +2F9C6;CJK COMPATIBILITY IDEOGRAPH-2F9C6;Lo;0;L;88D7;;;;N;;;;; +2F9C7;CJK COMPATIBILITY IDEOGRAPH-2F9C7;Lo;0;L;88DE;;;;N;;;;; +2F9C8;CJK COMPATIBILITY IDEOGRAPH-2F9C8;Lo;0;L;4635;;;;N;;;;; +2F9C9;CJK COMPATIBILITY IDEOGRAPH-2F9C9;Lo;0;L;88FA;;;;N;;;;; +2F9CA;CJK COMPATIBILITY IDEOGRAPH-2F9CA;Lo;0;L;34BB;;;;N;;;;; +2F9CB;CJK COMPATIBILITY IDEOGRAPH-2F9CB;Lo;0;L;278AE;;;;N;;;;; +2F9CC;CJK COMPATIBILITY IDEOGRAPH-2F9CC;Lo;0;L;27966;;;;N;;;;; +2F9CD;CJK COMPATIBILITY IDEOGRAPH-2F9CD;Lo;0;L;46BE;;;;N;;;;; +2F9CE;CJK COMPATIBILITY IDEOGRAPH-2F9CE;Lo;0;L;46C7;;;;N;;;;; +2F9CF;CJK COMPATIBILITY IDEOGRAPH-2F9CF;Lo;0;L;8AA0;;;;N;;;;; +2F9D0;CJK COMPATIBILITY IDEOGRAPH-2F9D0;Lo;0;L;8AED;;;;N;;;;; +2F9D1;CJK COMPATIBILITY IDEOGRAPH-2F9D1;Lo;0;L;8B8A;;;;N;;;;; +2F9D2;CJK COMPATIBILITY IDEOGRAPH-2F9D2;Lo;0;L;8C55;;;;N;;;;; +2F9D3;CJK COMPATIBILITY IDEOGRAPH-2F9D3;Lo;0;L;27CA8;;;;N;;;;; +2F9D4;CJK COMPATIBILITY IDEOGRAPH-2F9D4;Lo;0;L;8CAB;;;;N;;;;; +2F9D5;CJK COMPATIBILITY IDEOGRAPH-2F9D5;Lo;0;L;8CC1;;;;N;;;;; +2F9D6;CJK COMPATIBILITY IDEOGRAPH-2F9D6;Lo;0;L;8D1B;;;;N;;;;; +2F9D7;CJK COMPATIBILITY IDEOGRAPH-2F9D7;Lo;0;L;8D77;;;;N;;;;; +2F9D8;CJK COMPATIBILITY IDEOGRAPH-2F9D8;Lo;0;L;27F2F;;;;N;;;;; +2F9D9;CJK COMPATIBILITY IDEOGRAPH-2F9D9;Lo;0;L;20804;;;;N;;;;; +2F9DA;CJK COMPATIBILITY IDEOGRAPH-2F9DA;Lo;0;L;8DCB;;;;N;;;;; +2F9DB;CJK COMPATIBILITY IDEOGRAPH-2F9DB;Lo;0;L;8DBC;;;;N;;;;; +2F9DC;CJK COMPATIBILITY IDEOGRAPH-2F9DC;Lo;0;L;8DF0;;;;N;;;;; +2F9DD;CJK COMPATIBILITY IDEOGRAPH-2F9DD;Lo;0;L;208DE;;;;N;;;;; +2F9DE;CJK COMPATIBILITY IDEOGRAPH-2F9DE;Lo;0;L;8ED4;;;;N;;;;; +2F9DF;CJK COMPATIBILITY IDEOGRAPH-2F9DF;Lo;0;L;8F38;;;;N;;;;; +2F9E0;CJK COMPATIBILITY IDEOGRAPH-2F9E0;Lo;0;L;285D2;;;;N;;;;; +2F9E1;CJK COMPATIBILITY IDEOGRAPH-2F9E1;Lo;0;L;285ED;;;;N;;;;; +2F9E2;CJK COMPATIBILITY IDEOGRAPH-2F9E2;Lo;0;L;9094;;;;N;;;;; +2F9E3;CJK COMPATIBILITY IDEOGRAPH-2F9E3;Lo;0;L;90F1;;;;N;;;;; +2F9E4;CJK COMPATIBILITY IDEOGRAPH-2F9E4;Lo;0;L;9111;;;;N;;;;; +2F9E5;CJK COMPATIBILITY IDEOGRAPH-2F9E5;Lo;0;L;2872E;;;;N;;;;; +2F9E6;CJK COMPATIBILITY IDEOGRAPH-2F9E6;Lo;0;L;911B;;;;N;;;;; +2F9E7;CJK COMPATIBILITY IDEOGRAPH-2F9E7;Lo;0;L;9238;;;;N;;;;; +2F9E8;CJK COMPATIBILITY IDEOGRAPH-2F9E8;Lo;0;L;92D7;;;;N;;;;; +2F9E9;CJK COMPATIBILITY IDEOGRAPH-2F9E9;Lo;0;L;92D8;;;;N;;;;; +2F9EA;CJK COMPATIBILITY IDEOGRAPH-2F9EA;Lo;0;L;927C;;;;N;;;;; +2F9EB;CJK COMPATIBILITY IDEOGRAPH-2F9EB;Lo;0;L;93F9;;;;N;;;;; +2F9EC;CJK COMPATIBILITY IDEOGRAPH-2F9EC;Lo;0;L;9415;;;;N;;;;; +2F9ED;CJK COMPATIBILITY IDEOGRAPH-2F9ED;Lo;0;L;28BFA;;;;N;;;;; +2F9EE;CJK COMPATIBILITY IDEOGRAPH-2F9EE;Lo;0;L;958B;;;;N;;;;; +2F9EF;CJK COMPATIBILITY IDEOGRAPH-2F9EF;Lo;0;L;4995;;;;N;;;;; +2F9F0;CJK COMPATIBILITY IDEOGRAPH-2F9F0;Lo;0;L;95B7;;;;N;;;;; +2F9F1;CJK COMPATIBILITY IDEOGRAPH-2F9F1;Lo;0;L;28D77;;;;N;;;;; +2F9F2;CJK COMPATIBILITY IDEOGRAPH-2F9F2;Lo;0;L;49E6;;;;N;;;;; +2F9F3;CJK COMPATIBILITY IDEOGRAPH-2F9F3;Lo;0;L;96C3;;;;N;;;;; +2F9F4;CJK COMPATIBILITY IDEOGRAPH-2F9F4;Lo;0;L;5DB2;;;;N;;;;; +2F9F5;CJK COMPATIBILITY IDEOGRAPH-2F9F5;Lo;0;L;9723;;;;N;;;;; +2F9F6;CJK COMPATIBILITY IDEOGRAPH-2F9F6;Lo;0;L;29145;;;;N;;;;; +2F9F7;CJK COMPATIBILITY IDEOGRAPH-2F9F7;Lo;0;L;2921A;;;;N;;;;; +2F9F8;CJK COMPATIBILITY IDEOGRAPH-2F9F8;Lo;0;L;4A6E;;;;N;;;;; +2F9F9;CJK COMPATIBILITY IDEOGRAPH-2F9F9;Lo;0;L;4A76;;;;N;;;;; +2F9FA;CJK COMPATIBILITY IDEOGRAPH-2F9FA;Lo;0;L;97E0;;;;N;;;;; +2F9FB;CJK COMPATIBILITY IDEOGRAPH-2F9FB;Lo;0;L;2940A;;;;N;;;;; +2F9FC;CJK COMPATIBILITY IDEOGRAPH-2F9FC;Lo;0;L;4AB2;;;;N;;;;; +2F9FD;CJK COMPATIBILITY IDEOGRAPH-2F9FD;Lo;0;L;29496;;;;N;;;;; +2F9FE;CJK COMPATIBILITY IDEOGRAPH-2F9FE;Lo;0;L;980B;;;;N;;;;; +2F9FF;CJK COMPATIBILITY IDEOGRAPH-2F9FF;Lo;0;L;980B;;;;N;;;;; +2FA00;CJK COMPATIBILITY IDEOGRAPH-2FA00;Lo;0;L;9829;;;;N;;;;; +2FA01;CJK COMPATIBILITY IDEOGRAPH-2FA01;Lo;0;L;295B6;;;;N;;;;; +2FA02;CJK COMPATIBILITY IDEOGRAPH-2FA02;Lo;0;L;98E2;;;;N;;;;; +2FA03;CJK COMPATIBILITY IDEOGRAPH-2FA03;Lo;0;L;4B33;;;;N;;;;; +2FA04;CJK COMPATIBILITY IDEOGRAPH-2FA04;Lo;0;L;9929;;;;N;;;;; +2FA05;CJK COMPATIBILITY IDEOGRAPH-2FA05;Lo;0;L;99A7;;;;N;;;;; +2FA06;CJK COMPATIBILITY IDEOGRAPH-2FA06;Lo;0;L;99C2;;;;N;;;;; +2FA07;CJK COMPATIBILITY IDEOGRAPH-2FA07;Lo;0;L;99FE;;;;N;;;;; +2FA08;CJK COMPATIBILITY IDEOGRAPH-2FA08;Lo;0;L;4BCE;;;;N;;;;; +2FA09;CJK COMPATIBILITY IDEOGRAPH-2FA09;Lo;0;L;29B30;;;;N;;;;; +2FA0A;CJK COMPATIBILITY IDEOGRAPH-2FA0A;Lo;0;L;9B12;;;;N;;;;; +2FA0B;CJK COMPATIBILITY IDEOGRAPH-2FA0B;Lo;0;L;9C40;;;;N;;;;; +2FA0C;CJK COMPATIBILITY IDEOGRAPH-2FA0C;Lo;0;L;9CFD;;;;N;;;;; +2FA0D;CJK COMPATIBILITY IDEOGRAPH-2FA0D;Lo;0;L;4CCE;;;;N;;;;; +2FA0E;CJK COMPATIBILITY IDEOGRAPH-2FA0E;Lo;0;L;4CED;;;;N;;;;; +2FA0F;CJK COMPATIBILITY IDEOGRAPH-2FA0F;Lo;0;L;9D67;;;;N;;;;; +2FA10;CJK COMPATIBILITY IDEOGRAPH-2FA10;Lo;0;L;2A0CE;;;;N;;;;; +2FA11;CJK COMPATIBILITY IDEOGRAPH-2FA11;Lo;0;L;4CF8;;;;N;;;;; +2FA12;CJK COMPATIBILITY IDEOGRAPH-2FA12;Lo;0;L;2A105;;;;N;;;;; +2FA13;CJK COMPATIBILITY IDEOGRAPH-2FA13;Lo;0;L;2A20E;;;;N;;;;; +2FA14;CJK COMPATIBILITY IDEOGRAPH-2FA14;Lo;0;L;2A291;;;;N;;;;; +2FA15;CJK COMPATIBILITY IDEOGRAPH-2FA15;Lo;0;L;9EBB;;;;N;;;;; +2FA16;CJK COMPATIBILITY IDEOGRAPH-2FA16;Lo;0;L;4D56;;;;N;;;;; +2FA17;CJK COMPATIBILITY IDEOGRAPH-2FA17;Lo;0;L;9EF9;;;;N;;;;; +2FA18;CJK COMPATIBILITY IDEOGRAPH-2FA18;Lo;0;L;9EFE;;;;N;;;;; +2FA19;CJK COMPATIBILITY IDEOGRAPH-2FA19;Lo;0;L;9F05;;;;N;;;;; +2FA1A;CJK COMPATIBILITY IDEOGRAPH-2FA1A;Lo;0;L;9F0F;;;;N;;;;; +2FA1B;CJK COMPATIBILITY IDEOGRAPH-2FA1B;Lo;0;L;9F16;;;;N;;;;; +2FA1C;CJK COMPATIBILITY IDEOGRAPH-2FA1C;Lo;0;L;9F3B;;;;N;;;;; +2FA1D;CJK COMPATIBILITY IDEOGRAPH-2FA1D;Lo;0;L;2A600;;;;N;;;;; diff --git a/application/third_party/mpdf/utils/UnicodeRanges.php b/application/third_party/mpdf/utils/UnicodeRanges.php new file mode 100644 index 0000000..387c3a9 --- /dev/null +++ b/application/third_party/mpdf/utils/UnicodeRanges.php @@ -0,0 +1,218 @@ +<?php + +///////////////// +$unicode_ranges = array( +array('starthex'=> '0000', 'endhex'=>'007E', 'startdec'=> 0, 'enddec'=>126 , 'range'=>'Basic Latin'), +array('starthex'=> '00A0', 'endhex'=>'00FF', 'startdec'=> 160, 'enddec'=>255 , 'range'=>'Latin-1 Supplement'), +array('starthex'=> '0100', 'endhex'=>'017F', 'startdec'=> 256, 'enddec'=>383 , 'range'=>'Latin Extended-A'), +array('starthex'=> '0180', 'endhex'=>'024F', 'startdec'=> 384, 'enddec'=>591 , 'range'=>'Latin Extended-B'), +array('starthex'=> '0250', 'endhex'=>'02AF', 'startdec'=> 592, 'enddec'=>687 , 'range'=>'IPA Extensions'), +array('starthex'=> '02B0', 'endhex'=>'02FF', 'startdec'=> 688, 'enddec'=>767 , 'range'=>'Spacing Modifier Letters'), +array('starthex'=> '0300', 'endhex'=>'036F', 'startdec'=> 768, 'enddec'=>879 , 'range'=>'Combining Diacritical Marks', 'combining'=>true), +array('starthex'=> '0370', 'endhex'=>'03FF', 'startdec'=> 880, 'enddec'=>1023 , 'range'=>'Greek'), +array('starthex'=> '0400', 'endhex'=>'04FF', 'startdec'=> 1024, 'enddec'=>1279 , 'range'=>'Cyrillic'), +array('starthex'=> '0500', 'endhex'=>'052F', 'startdec'=> 1280, 'enddec'=>1327 , 'range'=>'Cyrillic Supplement'), +array('starthex'=> '0530', 'endhex'=>'058F', 'startdec'=> 1328, 'enddec'=>1423 , 'range'=>'Armenian'), +array('starthex'=> '0590', 'endhex'=>'05FF', 'startdec'=> 1424, 'enddec'=>1535 , 'range'=>'Hebrew', 'rtl'=>true, 'special'=>true), +array('starthex'=> '0600', 'endhex'=>'06FF', 'startdec'=> 1536, 'enddec'=>1791 , 'range'=>'Arabic', 'rtl'=>true, 'special'=>true), +array('starthex'=> '0700', 'endhex'=>'074F', 'startdec'=> 1792, 'enddec'=>1871 , 'range'=>'Syriac', 'rtl'=>true, 'special'=>true), +array('starthex'=> '0750', 'endhex'=>'077F', 'startdec'=> 1872, 'enddec'=>1919 , 'range'=>'Arabic Supplement', 'rtl'=>true, 'special'=>true), +array('starthex'=> '0780', 'endhex'=>'07BF', 'startdec'=> 1920, 'enddec'=>1983 , 'range'=>'Thaana', 'rtl'=>true, 'special'=>true), +array('starthex'=> '07C0', 'endhex'=>'07FF', 'startdec'=> 1984, 'enddec'=>2047 , 'range'=>'N\'Ko (Mandenkan)', 'rtl'=>true), +array('starthex'=> '0800', 'endhex'=>'083E', 'startdec'=> 2048, 'enddec'=> 2110, 'range'=>'Samaritan', 'rtl'=>true), +array('starthex'=> '0900', 'endhex'=>'097F', 'startdec'=> 2304, 'enddec'=>2431 , 'range'=>'Devanagari', 'indic'=>true, 'special'=>true), +array('starthex'=> '0980', 'endhex'=>'09FF', 'startdec'=> 2432, 'enddec'=>2559 , 'range'=>'Bengali', 'indic'=>true, 'special'=>true), +array('starthex'=> '0A00', 'endhex'=>'0A7F', 'startdec'=> 2560, 'enddec'=>2687 , 'range'=>'Gurmukhi', 'indic'=>true, 'special'=>true), +array('starthex'=> '0A80', 'endhex'=>'0AFF', 'startdec'=> 2688, 'enddec'=>2815 , 'range'=>'Gujarati', 'indic'=>true, 'special'=>true), +array('starthex'=> '0B00', 'endhex'=>'0B7F', 'startdec'=> 2816, 'enddec'=>2943 , 'range'=>'Oriya', 'indic'=>true, 'special'=>true), +array('starthex'=> '0B80', 'endhex'=>'0BFF', 'startdec'=> 2944, 'enddec'=>3071 , 'range'=>'Tamil', 'indic'=>true, 'special'=>true), +array('starthex'=> '0C00', 'endhex'=>'0C7F', 'startdec'=> 3072, 'enddec'=>3199 , 'range'=>'Telugu', 'indic'=>true, 'special'=>true), +array('starthex'=> '0C80', 'endhex'=>'0CFF', 'startdec'=> 3200, 'enddec'=>3327 , 'range'=>'Kannada', 'indic'=>true, 'special'=>true), +array('starthex'=> '0D00', 'endhex'=>'0D7F', 'startdec'=> 3328, 'enddec'=>3455 , 'range'=>'Malayalam', 'indic'=>true, 'special'=>true), +array('starthex'=> '0D80', 'endhex'=>'0DFF', 'startdec'=> 3456, 'enddec'=>3583 , 'range'=>'Sinhala', 'special'=>true), +array('starthex'=> '0E00', 'endhex'=>'0E7F', 'startdec'=> 3584, 'enddec'=>3711 , 'range'=>'Thai'), +array('starthex'=> '0E80', 'endhex'=>'0EFF', 'startdec'=> 3712, 'enddec'=>3839 , 'range'=>'Lao'), +array('starthex'=> '0F00', 'endhex'=>'0FFF', 'startdec'=> 3840, 'enddec'=>4095 , 'range'=>'Tibetan', 'special'=>true), +array('starthex'=> '1000', 'endhex'=>'109F', 'startdec'=> 4096, 'enddec'=>4255 , 'range'=>'Myanmar', 'special'=>true), +array('starthex'=> '10A0', 'endhex'=>'10FF', 'startdec'=> 4256, 'enddec'=>4351 , 'range'=>'Georgian'), +array('starthex'=> '1100', 'endhex'=>'11FF', 'startdec'=> 4352, 'enddec'=>4607 , 'range'=>'Hangul Jamo', 'cjk'=>true), +array('starthex'=> '1200', 'endhex'=>'137F', 'startdec'=> 4608, 'enddec'=>4991 , 'range'=>'Ethiopic'), +array('starthex'=> '1380', 'endhex'=>'139F', 'startdec'=> 4992, 'enddec'=>5023 , 'range'=>'Ethiopic Supplement'), +array('starthex'=> '13A0', 'endhex'=>'13FF', 'startdec'=> 5024, 'enddec'=>5119 , 'range'=>'Cherokee'), +array('starthex'=> '1400', 'endhex'=>'167F', 'startdec'=> 5120, 'enddec'=>5759 , 'range'=>'Unified Canadian Aboriginal Syllabics'), +array('starthex'=> '1680', 'endhex'=>'169F', 'startdec'=> 5760, 'enddec'=>5791 , 'range'=>'Ogham'), +array('starthex'=> '16A0', 'endhex'=>'16FF', 'startdec'=> 5792, 'enddec'=>5887 , 'range'=>'Runic'), +array('starthex'=> '1700', 'endhex'=>'171F', 'startdec'=> 5888, 'enddec'=> 5919, 'range'=>'Tagalog (Philippine)'), +array('starthex'=> '1720', 'endhex'=>'173F', 'startdec'=> 5920, 'enddec'=> 5951, 'range'=>'Hanunoo (Philippine)'), +array('starthex'=> '1740', 'endhex'=>'175F', 'startdec'=> 5952, 'enddec'=> 5983, 'range'=>'Buhid (Philippine)'), +array('starthex'=> '1760', 'endhex'=>'177F', 'startdec'=> 5984, 'enddec'=> 6015, 'range'=>'Tagbanwa (Philippine)'), +array('starthex'=> '1780', 'endhex'=>'17FF', 'startdec'=> 6016, 'enddec'=>6143 , 'range'=>'Khmer', 'special'=>true), +array('starthex'=> '1800', 'endhex'=>'18AF', 'startdec'=> 6144, 'enddec'=>6319 , 'range'=>'Mongolian', 'vertical'=>true), +array('starthex'=> '18B0', 'endhex'=>'18F5', 'startdec'=> 6320, 'enddec'=>6389 , 'range'=>'Canadian Syllabics'), +array('starthex'=> '1900', 'endhex'=>'194F', 'startdec'=> 6400, 'enddec'=> 6479, 'range'=>'Limbu'), +array('starthex'=> '1950', 'endhex'=>'197F', 'startdec'=> 6480, 'enddec'=> 6527, 'range'=>'Tai Le'), +array('starthex'=> '1980', 'endhex'=>'19DF', 'startdec'=> 6528, 'enddec'=> 6623, 'range'=>'New Tai Lue'), +array('starthex'=> '19E0', 'endhex'=>'19FF', 'startdec'=> 6624, 'enddec'=> 6655, 'range'=>'Khmer Symbols', 'special'=>true), +array('starthex'=> '1A00', 'endhex'=>'1A1F', 'startdec'=> 6656, 'enddec'=> 6687, 'range'=>'Buginese'), +array('starthex'=> '1A20', 'endhex'=>'1AAF', 'startdec'=> 6688, 'enddec'=> 6831, 'range'=>'Tai Tham'), +array('starthex'=> '1B00', 'endhex'=>'1B7F', 'startdec'=> 6912, 'enddec'=> 7039, 'range'=>'Balinese', 'special'=>true), +array('starthex'=> '1B80', 'endhex'=>'1BBF', 'startdec'=> 7040, 'enddec'=> 7103, 'range'=>'Sundanese'), +array('starthex'=> '1C00', 'endhex'=>'1C4F', 'startdec'=> 7168, 'enddec'=> 7247, 'range'=>'Lepcha (Rong)'), +array('starthex'=> '1C50', 'endhex'=>'1C7F', 'startdec'=> 7248, 'enddec'=> 7295, 'range'=>'Ol Chiki (Santali / Ol Cemet)'), +array('starthex'=> '1CD0', 'endhex'=>'1CFF', 'startdec'=> 7376, 'enddec'=> 7423, 'range'=>'Vedic Extensions'), +array('starthex'=> '1D00', 'endhex'=>'1D7F', 'startdec'=> 7424, 'enddec'=> 7551, 'range'=>'Phonetic Extensions'), +array('starthex'=> '1D80', 'endhex'=>'1DBF', 'startdec'=> 7552, 'enddec'=> 7615, 'range'=>'Phonetic Extensions Supplement'), +array('starthex'=> '1DC0', 'endhex'=>'1DFF', 'startdec'=> 7616, 'enddec'=> 7679, 'range'=>'Combining Diacritical Marks Supplement', 'combining'=>true), +array('starthex'=> '1E00', 'endhex'=>'1EFF', 'startdec'=> 7680, 'enddec'=>7935 , 'range'=>'Latin Extended Additional'), +array('starthex'=> '1F00', 'endhex'=>'1FFF', 'startdec'=> 7936, 'enddec'=>8191 , 'range'=>'Greek Extended'), +array('starthex'=> '2000', 'endhex'=>'206F', 'startdec'=> 8192, 'enddec'=>8303 , 'range'=>'General Punctuation'), +array('starthex'=> '2070', 'endhex'=>'209F', 'startdec'=> 8304, 'enddec'=>8351 , 'range'=>'Superscripts and Subscripts'), +array('starthex'=> '20A0', 'endhex'=>'20CF', 'startdec'=> 8352, 'enddec'=>8399 , 'range'=>'Currency Symbols'), +array('starthex'=> '20D0', 'endhex'=>'20FF', 'startdec'=> 8400, 'enddec'=>8447 , 'range'=>'Combining Marks for Symbols', 'combining'=>true), +array('starthex'=> '2100', 'endhex'=>'214F', 'startdec'=> 8448, 'enddec'=>8527 , 'range'=>'Letterlike Symbols'), +array('starthex'=> '2150', 'endhex'=>'218F', 'startdec'=> 8528, 'enddec'=>8591 , 'range'=>'Number Forms'), +array('starthex'=> '2190', 'endhex'=>'21FF', 'startdec'=> 8592, 'enddec'=>8703 , 'range'=>'Arrows'), +array('starthex'=> '2200', 'endhex'=>'22FF', 'startdec'=> 8704, 'enddec'=>8959 , 'range'=>'Mathematical Operators'), +array('starthex'=> '2300', 'endhex'=>'23FF', 'startdec'=> 8960, 'enddec'=>9215 , 'range'=>'Miscellaneous Technical'), +array('starthex'=> '2400', 'endhex'=>'243F', 'startdec'=> 9216, 'enddec'=>9279 , 'range'=>'Control Pictures'), +array('starthex'=> '2440', 'endhex'=>'245F', 'startdec'=> 9280, 'enddec'=>9311 , 'range'=>'Optical Character Recognition'), +array('starthex'=> '2460', 'endhex'=>'24FF', 'startdec'=> 9312, 'enddec'=>9471 , 'range'=>'Enclosed Alphanumerics'), +array('starthex'=> '2500', 'endhex'=>'257F', 'startdec'=> 9472, 'enddec'=>9599 , 'range'=>'Box Drawing'), +array('starthex'=> '2580', 'endhex'=>'259F', 'startdec'=> 9600, 'enddec'=>9631 , 'range'=>'Block Elements'), +array('starthex'=> '25A0', 'endhex'=>'25FF', 'startdec'=> 9632, 'enddec'=>9727 , 'range'=>'Geometric Shapes'), +array('starthex'=> '2600', 'endhex'=>'26FF', 'startdec'=> 9728, 'enddec'=>9983 , 'range'=>'Miscellaneous Symbols'), +array('starthex'=> '2700', 'endhex'=>'27BF', 'startdec'=> 9984, 'enddec'=>10175 , 'range'=>'Dingbats'), +array('starthex'=> '27C0', 'endhex'=>'27EF', 'startdec'=> 10176, 'enddec'=> 10223, 'range'=>'Miscellaneous Mathematical Symbols-A'), +array('starthex'=> '27F0', 'endhex'=>'27FF', 'startdec'=> 10224, 'enddec'=> 10239, 'range'=>'Supplemental Arrows-A'), +array('starthex'=> '2800', 'endhex'=>'28FF', 'startdec'=> 10240, 'enddec'=>10495 , 'range'=>'Braille Patterns'), +array('starthex'=> '2900', 'endhex'=>'297F', 'startdec'=> 10496, 'enddec'=> 10623, 'range'=>'Supplemental Arrows-B'), +array('starthex'=> '2980', 'endhex'=>'29FF', 'startdec'=> 10624, 'enddec'=> 10751, 'range'=>'Miscellaneous Mathematical Symbols-B'), +array('starthex'=> '2A00', 'endhex'=>'2AFF', 'startdec'=> 10752, 'enddec'=> 11007, 'range'=>'Supplemental Mathematical Operators'), +array('starthex'=> '2B00', 'endhex'=>'2BFF', 'startdec'=> 11008, 'enddec'=> 11263, 'range'=>'Miscellaneous Symbols and Arrows'), +array('starthex'=> '2C00', 'endhex'=>'2C5F', 'startdec'=> 11264, 'enddec'=> 11359, 'range'=>'Glagolitic'), +array('starthex'=> '2C60', 'endhex'=>'2C7F', 'startdec'=> 11360, 'enddec'=> 11391, 'range'=>'Latin Extended-C'), +array('starthex'=> '2C80', 'endhex'=>'2CFF', 'startdec'=> 11392, 'enddec'=> 11519, 'range'=>'Coptic'), +array('starthex'=> '2D00', 'endhex'=>'2D2F', 'startdec'=> 11520, 'enddec'=> 11567, 'range'=>'Georgian Supplement'), +array('starthex'=> '2D30', 'endhex'=>'2D7F', 'startdec'=> 11568, 'enddec'=> 11647, 'range'=>'Tifinagh'), +array('starthex'=> '2D80', 'endhex'=>'2DDF', 'startdec'=> 11648, 'enddec'=> 11743, 'range'=>'Ethiopic Extended'), +array('starthex'=> '2DE0', 'endhex'=>'2DFF', 'startdec'=> 11744, 'enddec'=> 11775, 'range'=>'Cyrillic Extended-A'), +array('starthex'=> '2E00', 'endhex'=>'2E7F', 'startdec'=> 11776, 'enddec'=> 11903, 'range'=>'Supplemental Punctuation'), + +array('starthex'=> '2E80', 'endhex'=>'2EFF', 'startdec'=> 11904, 'enddec'=>12031 , 'range'=>'CJK Radicals Supplement', 'cjk'=>true), +array('starthex'=> '2F00', 'endhex'=>'2FDF', 'startdec'=> 12032, 'enddec'=>12255 , 'range'=>'Kangxi Radicals', 'cjk'=>true), +array('starthex'=> '2FF0', 'endhex'=>'2FFF', 'startdec'=> 12272, 'enddec'=>12287 , 'range'=>'Ideographic Description Characters', 'cjk'=>true), +array('starthex'=> '3000', 'endhex'=>'303F', 'startdec'=> 12288, 'enddec'=>12351 , 'range'=>'CJK Symbols and Punctuation', 'cjk'=>true), +array('starthex'=> '3040', 'endhex'=>'309F', 'startdec'=> 12352, 'enddec'=>12447 , 'range'=>'Hiragana', 'cjk'=>true), +array('starthex'=> '30A0', 'endhex'=>'30FF', 'startdec'=> 12448, 'enddec'=>12543 , 'range'=>'Katakana', 'cjk'=>true), +array('starthex'=> '3100', 'endhex'=>'312F', 'startdec'=> 12544, 'enddec'=>12591 , 'range'=>'Bopomofo', 'cjk'=>true), +array('starthex'=> '3130', 'endhex'=>'318F', 'startdec'=> 12592, 'enddec'=>12687 , 'range'=>'Hangul Compatibility Jamo', 'cjk'=>true), +array('starthex'=> '3190', 'endhex'=>'319F', 'startdec'=> 12688, 'enddec'=>12703 , 'range'=>'Kanbun', 'cjk'=>true), +array('starthex'=> '31A0', 'endhex'=>'31BF', 'startdec'=> 12704, 'enddec'=>12735 , 'range'=>'Bopomofo Extended', 'cjk'=>true), +array('starthex'=> '31C0', 'endhex'=>'31EF', 'startdec'=> 12736, 'enddec'=> 12783, 'range'=>'CJK Strokes', 'cjk'=>true), +array('starthex'=> '31F0', 'endhex'=>'31FF', 'startdec'=> 12784, 'enddec'=> 12799, 'range'=>'Katakana Phonetic Extensions', 'cjk'=>true), +array('starthex'=> '3200', 'endhex'=>'32FF', 'startdec'=> 12800, 'enddec'=>13055 , 'range'=>'Enclosed CJK Letters and Months', 'cjk'=>true), +array('starthex'=> '3300', 'endhex'=>'33FF', 'startdec'=> 13056, 'enddec'=>13311 , 'range'=>'CJK Compatibility', 'cjk'=>true), +array('starthex'=> '3400', 'endhex'=>'4DB5', 'startdec'=> 13312, 'enddec'=>19893 , 'range'=>'CJK Unified Ideographs Extension A', 'cjk'=>true), +array('starthex'=> '4DC0', 'endhex'=>'4DFF', 'startdec'=> 19904, 'enddec'=> 19967, 'range'=>'Yijing Hexagram Symbols', 'cjk'=>true), +array('starthex'=> '4E00', 'endhex'=>'9FFF', 'startdec'=> 19968, 'enddec'=>40959 , 'range'=>'CJK Unified Ideographs', 'cjk'=>true), +array('starthex'=> 'A000', 'endhex'=>'A48F', 'startdec'=> 40960, 'enddec'=>42127 , 'range'=>'Yi Syllables', 'cjk'=>true), +array('starthex'=> 'A490', 'endhex'=>'A4CF', 'startdec'=> 42128, 'enddec'=> 42191, 'range'=>'Yi Radicals', 'cjk'=>true), + +array('starthex'=> 'A4D0', 'endhex'=>'A4FF', 'startdec'=> 42192, 'enddec'=> 42239, 'range'=>'Lisu'), + +array('starthex'=> 'A500', 'endhex'=>'A63F', 'startdec'=> 42240, 'enddec'=> 42559, 'range'=>'Vai'), +array('starthex'=> 'A640', 'endhex'=>'A69F', 'startdec'=> 42560, 'enddec'=> 42655, 'range'=>'Cyrillic Extended-B'), + +array('starthex'=> 'A6A0', 'endhex'=>'A6FF', 'startdec'=> 42656, 'enddec'=> 42751, 'range'=>'Bamum'), + +array('starthex'=> 'A700', 'endhex'=>'A71F', 'startdec'=> 42752, 'enddec'=> 42783, 'range'=>'Modifier Tone Letters'), +array('starthex'=> 'A720', 'endhex'=>'A7FF', 'startdec'=> 42784, 'enddec'=> 43007, 'range'=>'Latin Extended-D'), +array('starthex'=> 'A800', 'endhex'=>'A82F', 'startdec'=> 43008, 'enddec'=> 43055, 'range'=>'Syloti Nagri'), + +array('starthex'=> 'A840', 'endhex'=>'A87F', 'startdec'=> 43072, 'enddec'=> 43135, 'range'=>'Phags-pa', 'vertical'=>true), +array('starthex'=> 'A880', 'endhex'=>'A8DF', 'startdec'=> 43136, 'enddec'=> 43231, 'range'=>'Saurashtra'), + +array('starthex'=> 'A900', 'endhex'=>'A92F', 'startdec'=> 43264, 'enddec'=> 43311, 'range'=>'Kayah Li'), +array('starthex'=> 'A930', 'endhex'=>'A95F', 'startdec'=> 43312, 'enddec'=> 43359, 'range'=>'Rejang'), + +array('starthex'=> 'A960', 'endhex'=>'A97F', 'startdec'=> 43360, 'enddec'=> 43391, 'range'=>'Hangul Choseong', 'cjk'=>true), +array('starthex'=> 'A980', 'endhex'=>'A9DF', 'startdec'=> 43392, 'enddec'=> 43487, 'range'=>'Javanese'), + +array('starthex'=> 'AA00', 'endhex'=>'AA5F', 'startdec'=> 43520, 'enddec'=> 43615, 'range'=>'Cham'), +array('starthex'=> 'AA60', 'endhex'=>'AA7B', 'startdec'=> 43616, 'enddec'=> 43647, 'range'=>'Myanmar', 'special'=>true), +array('starthex'=> 'AA80', 'endhex'=>'AADF', 'startdec'=> 43648, 'enddec'=> 43743, 'range'=>'Tai Viet'), + +array('starthex'=> 'ABC0', 'endhex'=>'ABF9', 'startdec'=> 43968, 'enddec'=> 44025, 'range'=>'Meetei Mayek'), + +array('starthex'=> 'AC00', 'endhex'=>'D7FF', 'startdec'=> 44032, 'enddec'=>55295 , 'range'=>'Hangul Syllables', 'cjk'=>true), + +/* +array('starthex'=> 'D800', 'endhex'=>'DB7F', 'startdec'=> 55296, 'enddec'=>56191 , 'range'=>'High Surrogates', 'reserved'=>true), +array('starthex'=> 'DB80', 'endhex'=>'DBFF', 'startdec'=> 56192, 'enddec'=>56319 , 'range'=>'High Private Use Surrogates', 'reserved'=>true), +array('starthex'=> 'DC00', 'endhex'=>'DFFF', 'startdec'=> 56320, 'enddec'=>57343 , 'range'=>'Low Surrogates', 'reserved'=>true), +*/ + +array('starthex'=> 'E000', 'endhex'=>'F8FF', 'startdec'=> 57344, 'enddec'=>63743 , 'range'=>'Private Use', 'pua'=>true), + +array('starthex'=> 'F900', 'endhex'=>'FAFF', 'startdec'=> 63744, 'enddec'=>64255 , 'range'=>'CJK Compatibility Ideographs', 'cjk'=>true), +array('starthex'=> 'FB00', 'endhex'=>'FB4F', 'startdec'=> 64256, 'enddec'=>64335 , 'range'=>'Alphabetic Presentation Forms'), +array('starthex'=> 'FB50', 'endhex'=>'FDFF', 'startdec'=> 64336, 'enddec'=>65023 , 'range'=>'Arabic Presentation Forms-A', 'rtl'=>true), + +array('starthex'=> 'FE00', 'endhex'=>'FE0F', 'startdec'=> 65024, 'enddec'=> 65039, 'range'=>'Variation Selectors'), + +array('starthex'=> 'FE10', 'endhex'=>'FE1F', 'startdec'=> 65040, 'enddec'=> 65055, 'range'=>'Vertical Forms'), +array('starthex'=> 'FE20', 'endhex'=>'FE2F', 'startdec'=> 65056, 'enddec'=>65071 , 'range'=>'Combining Half Marks', 'combining'=>true), +array('starthex'=> 'FE30', 'endhex'=>'FE4F', 'startdec'=> 65072, 'enddec'=>65103 , 'range'=>'CJK Compatibility Forms', 'cjk'=>true), +array('starthex'=> 'FE50', 'endhex'=>'FE6F', 'startdec'=> 65104, 'enddec'=>65135 , 'range'=>'Small Form Variants', 'cjk'=>true), +array('starthex'=> 'FE70', 'endhex'=>'FEFE', 'startdec'=> 65136, 'enddec'=>65278 , 'range'=>'Arabic Presentation Forms-B', 'rtl'=>true), +array('starthex'=> 'FEFF', 'endhex'=>'FEFF', 'startdec'=> 65279, 'enddec'=>65279 , 'range'=>'Specials'), +array('starthex'=> 'FF00', 'endhex'=>'FFEF', 'startdec'=> 65280, 'enddec'=>65519 , 'range'=>'Halfwidth and Fullwidth Forms', 'cjk'=>true), +array('starthex'=> 'FFF0', 'endhex'=>'FFFD', 'startdec'=> 65520, 'enddec'=>65533 , 'range'=>'Specials'), + +/* PLANE 1 */ + +array('starthex'=> '10000', 'endhex'=>'1007F', 'startdec'=> 65536 , 'enddec'=> 65663, 'range'=>'Linear B Syllabary'), +array('starthex'=> '10080', 'endhex'=>'100FF', 'startdec'=> 65664 , 'enddec'=> 65791, 'range'=>'Linear B Ideograms'), +array('starthex'=> '10100', 'endhex'=>'1013F', 'startdec'=> 65792 , 'enddec'=> 65855, 'range'=>'Aegean Numbers'), +array('starthex'=> '10140', 'endhex'=>'1018F', 'startdec'=> 65856 , 'enddec'=> 65935, 'range'=>'Ancient Greek Numbers'), +array('starthex'=> '10190', 'endhex'=>'101CF', 'startdec'=> 65936 , 'enddec'=> 65999, 'range'=>'Ancient Symbols'), +array('starthex'=> '101D0', 'endhex'=>'101FF', 'startdec'=> 66000 , 'enddec'=> 66047, 'range'=>'Phaistos Disc'), +array('starthex'=> '10280', 'endhex'=>'1029F', 'startdec'=> 66176 , 'enddec'=> 66207, 'range'=>'Lycian'), +array('starthex'=> '102A0', 'endhex'=>'102DF', 'startdec'=> 66208 , 'enddec'=> 66271, 'range'=>'Carian'), +array('starthex'=> '10300', 'endhex'=>'1032F', 'startdec'=> 66304 , 'enddec'=> 66351, 'range'=>'Old Italic'), +array('starthex'=> '10330', 'endhex'=>'1034F', 'startdec'=> 66352 , 'enddec'=> 66383, 'range'=>'Gothic'), +array('starthex'=> '10380', 'endhex'=>'1039F', 'startdec'=> 66432 , 'enddec'=> 66463, 'range'=>'Ugaritic'), +array('starthex'=> '103A0', 'endhex'=>'103DF', 'startdec'=> 66464 , 'enddec'=> 66527, 'range'=>'Old Persian'), +array('starthex'=> '10400', 'endhex'=>'1044F', 'startdec'=> 66560 , 'enddec'=> 66639, 'range'=>'Deseret'), +array('starthex'=> '10450', 'endhex'=>'1047F', 'startdec'=> 66640 , 'enddec'=> 66687, 'range'=>'Shavian'), +array('starthex'=> '10480', 'endhex'=>'104AF', 'startdec'=> 66688 , 'enddec'=> 66735, 'range'=>'Osmanya'), +array('starthex'=> '10800', 'endhex'=>'1083F', 'startdec'=> 67584 , 'enddec'=> 67647, 'range'=>'Cypriot Syllabary'), +array('starthex'=> '10900', 'endhex'=>'1091F', 'startdec'=> 67840 , 'enddec'=> 67871, 'range'=>'Phoenician'), +array('starthex'=> '10920', 'endhex'=>'1093F', 'startdec'=> 67872 , 'enddec'=> 67903, 'range'=>'Lydian'), +array('starthex'=> '10A00', 'endhex'=>'10A5F', 'startdec'=> 68096 , 'enddec'=> 68191, 'range'=>'Kharoshthi'), + +array('starthex'=> '11080', 'endhex'=>'110CF', 'startdec'=> 69760 , 'enddec'=> 69839, 'range'=>'Kaithi'), + +array('starthex'=> '12000', 'endhex'=>'123FF', 'startdec'=> 73728 , 'enddec'=> 74751, 'range'=>'Cuneiform (Sumero-Akkadian)'), +array('starthex'=> '12400', 'endhex'=>'1247F', 'startdec'=> 74752 , 'enddec'=> 74879, 'range'=>'Cuneiform Numbers and Punctuation'), + +array('starthex'=> '13000', 'endhex'=>'1342F', 'startdec'=> 77824 , 'enddec'=> 78895, 'range'=>'Egyptian Hieroglyphs'), + +array('starthex'=> '1D000', 'endhex'=>'1D0FF', 'startdec'=> 118784 , 'enddec'=> 119039, 'range'=>'Byzantine Musical Symbols'), +array('starthex'=> '1D100', 'endhex'=>'1D1FF', 'startdec'=> 119040 , 'enddec'=> 119295, 'range'=>'Musical Symbols'), +array('starthex'=> '1D200', 'endhex'=>'1D24F', 'startdec'=> 119296 , 'enddec'=> 119375, 'range'=>'Ancient Greek Musical Notation'), +array('starthex'=> '1D300', 'endhex'=>'1D35F', 'startdec'=> 119552 , 'enddec'=> 119647, 'range'=>'Tai Xuan Jing Symbols'), +array('starthex'=> '1D360', 'endhex'=>'1D37F', 'startdec'=> 119648 , 'enddec'=> 119679, 'range'=>'Counting Rod Numerals'), +array('starthex'=> '1D400', 'endhex'=>'1D7FF', 'startdec'=> 119808 , 'enddec'=> 120831, 'range'=>'Mathematical Alphanumeric Symbols'), +array('starthex'=> '1F000', 'endhex'=>'1F02F', 'startdec'=> 126976 , 'enddec'=> 127023, 'range'=>'Mahjong Tiles'), +array('starthex'=> '1F030', 'endhex'=>'1F09F', 'startdec'=> 127024 , 'enddec'=> 127135, 'range'=>'Domino Tiles'), + +/* PLANE 2 */ + +array('starthex'=> '20000', 'endhex'=>'2A6DF', 'startdec'=> 131072 , 'enddec'=> 173791, 'range'=>'CJK Unified Ideographs Extension B'), +array('starthex'=> '2A700', 'endhex'=>'2B734', 'startdec'=> 173824 , 'enddec'=> 177972, 'range'=>'CJK Unified Ideographs Extension C'), +array('starthex'=> '2F800', 'endhex'=>'2FA1F', 'startdec'=> 194560 , 'enddec'=> 195103, 'range'=>'CJK Compatibility Ideographs Supplement'), + +); + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/utils/font_collections.php b/application/third_party/mpdf/utils/font_collections.php new file mode 100644 index 0000000..8226739 --- /dev/null +++ b/application/third_party/mpdf/utils/font_collections.php @@ -0,0 +1,72 @@ +<?php + +/* This script prints out details of any TrueType collection font files + in your font directory. Files ending wih .otc are examined. + Point your browser to + http://your.domain/your_path_to _mpdf/utils/font_collections.php + By default this will examine the folder /ttfonts/ (or the default font + directory defined by _MPDF_TTFONTPATH. + You can optionally define an alternative folder to examine by setting + the variable below (must be a relative path, or filesystem path): +*/ + + +$checkdir = ''; + + +////////////////////////////////// +////////////////////////////////// +////////////////////////////////// + +ini_set("memory_limit","256M"); + + +define('_MPDF_PATH','../'); + +include("../mpdf.php"); +$mpdf=new mPDF(''); +if ($checkdir) { + $ttfdir = $checkdir; +} +else { $ttfdir = _MPDF_TTFONTPATH; } + + + +$mqr=ini_get("magic_quotes_runtime"); +if ($mqr) { set_magic_quotes_runtime(0); } +if (!class_exists('TTFontFile_Analysis', false)) { include(_MPDF_PATH .'classes/ttfontsuni_analysis.php'); } +$ttf = new TTFontFile_Analysis(); + +$ff = scandir($ttfdir); + +echo '<h3>Font collection files found in '.$ttfdir.' directory</h3>'; +foreach($ff AS $f) { + $ret = array(); + if (strtolower(substr($f,-4,4))=='.ttc' || strtolower(substr($f,-4,4))=='.ttcf') { // Mac ttcf + $ttf->getTTCFonts($ttfdir.$f); + $nf = $ttf->numTTCFonts; + echo '<p>Font collection file ('.$f.') contains the following fonts:</p>'; + for ($i=1; $i<=$nf; $i++) { + $ret = $ttf->extractCoreInfo($ttfdir.$f, $i); + $tfname = $ret[0]; + $bold = $ret[1]; + $italic = $ret[2]; + $fname = strtolower($tfname ); + $fname = preg_replace('/[ ()]/','',$fname ); + $style = ''; + if ($bold) { $style .= 'Bold'; } + if ($italic) { $style .= 'Italic'; } + if (!$style) { $style = 'Regular'; } + + + echo '<div>['.$i.'] '.$tfname.' ('.$fname.') '.$style.'</div>'; + + } + echo '<hr />'; + } +} + + +exit; + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/utils/font_coverage.php b/application/third_party/mpdf/utils/font_coverage.php new file mode 100644 index 0000000..63074b6 --- /dev/null +++ b/application/third_party/mpdf/utils/font_coverage.php @@ -0,0 +1,255 @@ +<?php + +/* This script prints out the Unicode coverage of all TrueType font files + in your font directory. + Point your browser to + http://your.domain/your_path_to _mpdf/utils/font_coverage.php + By default this will examine the folder /ttfonts/ (or the default font + directory defined by _MPDF_TTFONTPATH. + You can optionally define an alternative folder to examine by setting + the variable below (must be a relative path, or filesystem path): +*/ + + +$checkdir = ''; + + +////////////////////////////////// +////////////////////////////////// +////////////////////////////////// + + +set_time_limit(600); +ini_set("memory_limit","256M"); + +//============================================================== +//============================================================== +include("../mpdf.php"); + +$mpdf=new mPDF('','A4-L','','',10,10,10,10); +$mpdf->SetDisplayMode('fullpage'); +$mpdf->useSubstitutions = true; +$mpdf->debug = true; +$mpdf->simpleTables = true; +if ($checkdir) { + $ttfdir = $checkdir; +} +else { $ttfdir = _MPDF_TTFONTPATH; } + + + +$mqr=ini_get("magic_quotes_runtime"); +if ($mqr) { set_magic_quotes_runtime(0); } +if (!class_exists('TTFontFile_Analysis', false)) { include(_MPDF_PATH .'classes/ttfontsuni_analysis.php'); } + +//============================================================== + $smp = true; + $maxt = 131071; +//============================================================== +//============================================================== +$unifile = file('UnicodeData.txt'); +$unichars = array(); +foreach($unifile AS $line) { + if (preg_match('/<control>/',$line,$m)) { + $rangename = ''; + continue; + } + else if (preg_match('/^([12]{0,1}[0-9A-Za-z]{4});<(.*?), Last>/',$line,$m)) { + if ($rangename && $rangename == $m[2]) { + $endrange = hexdec($m[1]); + for ($i=$startrange;$i<=$endrange; $i++) { + $unichars[$i] = $i; + } + } + $rangename = ''; + } + else if (preg_match('/^([12]{0,1}[0-9A-Za-z]{4});<(.*?), First>/',$line,$m)) { + $startrange = hexdec($m[1]); + $rangename = $m[2]; + } + else if (preg_match('/^([12]{0,1}[0-9A-Za-z]{4});/',$line,$m)) { + $unichars[hexdec($m[1])] = hexdec($m[1]); + $rangename = ''; + } +} + +// loads array $unicode_ranges +include('UnicodeRanges.php'); +//============================================================== +$html = '<html><head><style>td { border: 0.1mm solid #555555; } +body { font-weight: normal; font-family: helvetica;font-size:8pt; } +td { font-family: helvetica;font-size:8pt; vertical-align: top;} +</style></head><body>'; + +//============================================================== +$ff = scandir($ttfdir); +$tempfontdata = array(); +foreach($ff AS $f) { + $ttf = new TTFontFile_Analysis(); + $ret = array(); + $isTTC = false; + if (strtolower(substr($f,-4,4))=='.ttf' || strtolower(substr($f,-4,4))=='.otf') { + $ret[] = $ttf->extractCoreInfo($ttfdir.$f); + } + for ($i=0; $i<count($ret); $i++) { + if (is_array($ret[$i])) { + $tfname = $ret[$i][0]; + $bold = $ret[$i][1]; + $italic = $ret[$i][2]; + $fname = strtolower($tfname ); + $fname = preg_replace('/[ ()]/','',$fname ); + //$tempfonttrans[$tfname] = $fname; + $style = ''; + if ($bold) { $style .= 'B'; } + if ($italic) { $style .= 'I'; } + if (!$style) { + $tempfontdata[$fname]['file'] = $f; + if ($isTTC) { + $tempfontdata[$fname]['TTCfontID'] = $ret[$i][4]; + } + } + } + } + unset($ttf); + +} + +$fullcovers = array(); +$nearlycovers = array(); +ksort($tempfontdata); +$ningroup = 14; +$nofgroups = ceil(count($unicode_ranges)/$ningroup); + +//============================================================== + + +for ($urgp = 0; $urgp < $nofgroups; $urgp++) { + + + $html .= '<table cellpadding="2" cellspacing="0" style="page-break-inside:avoid; text-align:center; border-collapse: collapse; ">'; + $html .= '<thead><tr><td></td>'; + + foreach($unicode_ranges AS $urk => $ur) { + if ($urk >= ($urgp*$ningroup) && $urk < (($urgp+1)*$ningroup)) { + $rangekey = $urk; + $range = $ur['range']; + $rangestart = $ur['starthex']; + $rangeend = $ur['endhex']; + $html .= '<td style="font-family:helvetica;font-size:8pt;font-weight:bold;">'.strtoupper($range).' (U+'.$rangestart .'-U+'.$rangeend.')</td>'; + } + } + $html .= '</tr></thead>'; + + + foreach ($tempfontdata AS $fname => $v) { + $cw = ''; + if (file_exists((_MPDF_TTFONTDATAPATH.$fname.'.cw.dat'))) { $cw = file_get_contents(_MPDF_TTFONTDATAPATH.$fname.'.cw.dat'); } + else { + $mpdf->fontdata[$fname]['R'] = $tempfontdata[$fname]['file']; + $mpdf->AddFont($fname); + $cw = file_get_contents(_MPDF_TTFONTDATAPATH.$fname.'.cw.dat'); + } + if (!$cw) { + continue; + die("Font data not available for $fname"); + } + + $counter=0; + $max = $maxt; + + // create HTML content + $html .= '<tr>'; + $html .= '<td>'.$fname.'</td>'; + + foreach($unicode_ranges AS $urk => $ur) { + if ($urk >= ($urgp*$ningroup) && $urk < (($urgp+1)*$ningroup)) { + if ($ur['pua'] || $ur['reserved'] || $ur['control']) { + $html .= '<td style="background-color: #000000;"></td>'; + } + else { + $rangekey = $urk; + $range = $ur['range']; + $rangestart = $ur['starthex']; + $rangeend = $ur['endhex']; + $rangestartdec = $ur['startdec']; + $rangeenddec = $ur['enddec']; + $uniinrange = 0; + $fontinrange = 0; + for ($i=$rangestartdec; $i<=$rangeenddec; $i++) { + //if (isset($cw[$i])) { $fontinrange++; } + if ($mpdf->_charDefined($cw, $i)) { $fontinrange++; } + if (isset($unichars[$i])) { $uniinrange++; } + } + if ($uniinrange) { + if ($fontinrange) { + $pc = ($fontinrange/$uniinrange); + $str = '('.$fontinrange.'/'.$uniinrange.')'; + if ($pc==1) { + $fullcovers[$urk][] = $fname; + $html .= '<td style="background-color: #00FF00;"></td>'; + } + else if ($pc>1) { + $fullcovers[$urk][] = $fname; + $html .= '<td style="background-color: #00FF00;">'.$str.'</td>'; + } + else if ($pc>=0.9) { + $html .= '<td style="background-color: #AAFFAA;">'.$str.'</td>'; + $nearlycovers[$urk][] = $fname; + } + else if ($pc>0.75) { $html .= '<td style="background-color: #00FFAA;">'.$str.'</td>'; } + else if ($pc>0.5) { $html .= '<td style="background-color: #AAAAFF;">'.$str.'</td>'; } + else if ($pc>0.25) { $html .= '<td style="background-color: #FFFFAA;">'.$str.'</td>'; } + else { $html .= '<td style="background-color: #FFAAAA;">'.$str.'</td>'; } + } + else { $html .= '<td style="background-color: #555555;">(0/0)</td>'; } + } + else { $html .= '<td style="background-color: #000000;"></td>'; } + } + } + } + + + $html .= '</tr>'; + + } +//============================================================== + $html .= '</table><pagebreak />'; +} + +$html .= '<h4>Fonts with full coverage of Unicode Ranges</h4>'; +$html .= '<table>'; +//$html .= '<tr><td></td><td></td></tr>'; +foreach($unicode_ranges AS $urk => $ur) { + if ($ur['pua'] || $ur['reserved'] || $ur['control']) { continue; } + $rangekey = $urk; + $range = $ur['range']; + $rangestart = $ur['starthex']; + $rangeend = $ur['endhex']; + $ext = $ext2 = ''; + if ($ur['combining']) { $ext = 'background-color:#DDDDFF;'; $ext2 = '<br /><span style="color:#AA0000">Special positioning required</span>'; } + if ($ur['vertical']) { $ext = 'background-color:#FFDDDD;'; $ext2 = '<br /><span style="color:#AA0000">Vertical positioning required</span>'; } + if ($ur['special']) { $ext = 'background-color:#FFDDDD;'; $ext2 = '<br /><span style="color:#AA0000">Special processing required</span>'; } + + + $html .= '<tr><td style="font-family:helvetica;font-size:8pt;font-weight:bold;'.$ext.'">'.strtoupper($range).' (U+'.$rangestart .'-U+'.$rangeend.')'.$ext2.'</td>'; + $arr = $fullcovers[$urk]; + $narr = $nearlycovers[$urk]; + if (is_array($arr)) { $html .= '<td>'. implode(', ',$arr). '</td></tr>'; } + else if (is_array($narr)) { $html .= '<td style="background-color: #AAAAAA;">'. implode(', ',$narr). ' (>90%)</td></tr>'; } + else { $html .= '<td style="background-color: #555555;"> </td></tr>'; } +} +$html.= '</table>'; + + +//============================================================== +echo $html; + +exit; + +//============================================================== +//============================================================== +//============================================================== +//============================================================== + + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/utils/font_dump.php b/application/third_party/mpdf/utils/font_dump.php new file mode 100644 index 0000000..74fb9f2 --- /dev/null +++ b/application/third_party/mpdf/utils/font_dump.php @@ -0,0 +1,222 @@ +<?php + +/* + This script prints out all characters in a TrueType font file + to a PDF document. Point your browser to + http://your.domain/your_path_to _mpdf/utils/font_dump.php + The font file must be located in /ttfonts/ (or the default font + directory defined by _MPDF_TTFONTPATH. + By default this will examine the font dejavusanscondensed. + You can optionally define an alternative font file to examine by setting + the variable below (must be a relative path, or filesystem path): +*/ + + +$font = 'dejavusanscondensed'; // Use internal mPDF font-name + +$showmissing = true; // Show all missing unicode blocks / characters + + +////////////////////////////////// +////////////////////////////////// +////////////////////////////////// + +set_time_limit(600); +ini_set("memory_limit","256M"); + +//============================================================== +//============================================================== +define('_MPDF_URI', '../'); +include("../mpdf.php"); + +$mpdf=new mPDF(''); +$mpdf->StartProgressBarOutput(2); + +$mpdf->SetDisplayMode('fullpage'); + +$mpdf->useSubstitutions = true; +$mpdf->debug = true; +$mpdf->simpleTables = true; +// force fonts to be embedded whole i.e. NOT susbet +$mpdf->percentSubset = 0; + +//============================================================== +//============================================================== +//============================================================== +//============================================================== + +// This generates a .mtx.php file if not already generated +$mpdf->WriteHTML('<style>td { border: 0.1mm solid #555555; } body { font-weight: normal; }</style>'); +$mpdf->WriteHTML('<h3 style="font-family:'.$font.'">'.strtoupper($font).'</h3>'); // Separate Paragraphs defined by font +$html = ''; +//============================================================== +//============================================================== +//============================================================== +//============================================================== +$unifile = file('UnicodeData.txt'); +$unichars = array(); + +foreach($unifile AS $line) { + if ($smp && preg_match('/^(1[0-9A-Za-z]{4});/',$line,$m)) { + $unichars[hexdec($m[1])] = hexdec($m[1]); + } + else if (preg_match('/^([0-9A-Za-z]{4});/',$line,$m)) { + $unichars[hexdec($m[1])] = hexdec($m[1]); + } +} + +// loads array $unicode_ranges +include('UnicodeRanges.php'); +//============================================================== +//============================================================== + + + +$cw = file_get_contents(_MPDF_TTFONTDATAPATH.$font.'.cw.dat'); +if (!$cw) { die("Error - Must be able to read font metrics file: "._MPDF_TTFONTDATAPATH.$font.'.cw.dat'); } +$counter=0; + + +include(_MPDF_TTFONTDATAPATH.$font.'.mtx.php'); + +if ($smp) { + $max = 131071; +} +else { + $max = 65535; +} + + +$justfinishedblank = false; +$justfinishedblankinvalid = false; + + foreach($unicode_ranges AS $urk => $ur) { + if (0 >= $ur['startdec'] && 0 <= $ur['enddec']) { + $rangekey = $urk; + $range = $ur['range']; + $rangestart = $ur['starthex']; + $rangeend = $ur['endhex']; + break; + } + } + $lastrange = $range ; + // create HTML content + $html .= '<table cellpadding="2" cellspacing="0" style="font-family:'.$font.';text-align:center; border-collapse: collapse; ">'; + $html .= '<tr><td colspan="18" style="font-family:helvetica;font-weight:bold">'.strtoupper($font).'</td></tr>'; + $html .= '<tr><td colspan="18" style="font-family:helvetica;font-size:8pt;font-weight:bold">'.strtoupper($range).' (U+'.$rangestart .'-U+'.$rangeend.')</td></tr>'; + $html .= '<tr><td></td>'; + + $html .= '<td></td>'; + for ($i = 0; $i < 16; $i++) { + $html .= '<td><b>-'.sprintf('%X', $i).'</b></td>'; + } + + + // print each character + for ($i = 32; $i < $max; ++$i) { + if (($i > 0) AND (($i % 16) == 0)) { + $notthisline = true; + while($notthisline) { + for ($j = 0; $j < 16; $j++) { + if ($mpdf->_charDefined($cw, ($i + $j))) { + //if (isset($cw[($i+$j)])) { + $notthisline = false; + } + } + if ($notthisline) { + if ($showmissing) { + $range = ''; + foreach($unicode_ranges AS $urk => $ur) { + if ($i >= $ur['startdec'] && $i <= $ur['enddec']) { + $rangekey = $urk; + $range = $ur['range']; + $rangestart = $ur['starthex']; + $rangeend = $ur['endhex']; + break; + } + } + $anyvalid = false; + for ($j = 0; $j < 16; $j++) { + if (isset($unichars[$i+$j])) { $anyvalid = true; break; } + } + if ($range && $range == $lastrange) { + if (!$anyvalid) { + if (!$justfinishedblankinvalid) { + $html .= '<tr><td colspan="18" style="background-color:#555555; font-size: 4pt;">&nbsp;</td></tr>'; + } + $justfinishedblankinvalid = true; + } + else if (!$justfinishedblank ) { + $html .= '<tr><td colspan="18" style="background-color:#FFAAAA; font-size: 4pt;">&nbsp;</td></tr>'; + $justfinishedblank = true; + } + } + else if($range) { + $html .= '</tr></table><br />'; + $mpdf->WriteHTML($html); $html = ''; + $html .= '<table cellpadding="2" cellspacing="0" style="font-family:'.$font.';text-align:center; border-collapse: collapse; ">'; + $html .= '<tr><td colspan="18" style="font-family:helvetica;font-size:8pt;font-weight:bold">'.strtoupper($range).' (U+'.$rangestart.'-U+'.$rangeend.')</td></tr>'; + $html .= '<tr><td></td>'; + $html .= '<td></td>'; + for ($k = 0; $k < 16; $k++) { + $html .= '<td><b>-'.sprintf('%X', $k).'</b></td>'; + } + $justfinishedblank = false; + $justfinishedblankinvalid = false; + } + $lastrange = $range ; + } + $i +=16; + if ($i > $max) { break 2; } + } + } + foreach($unicode_ranges AS $urk => $ur) { + if ($i >= $ur['startdec'] && $i <= $ur['enddec']) { + $rangekey = $urk; + $range = $ur['range']; + $rangestart = $ur['starthex']; + $rangeend = $ur['endhex']; + break; + } + } + + if ($i > 0 && ($i % 16) == 0 && ($range != $lastrange)) { + $html .= '</tr></table><br />'; + $mpdf->WriteHTML($html); $html = ''; + $html .= '<table cellpadding="2" cellspacing="0" style="font-family:'.$font.';text-align:center; border-collapse: collapse; ">'; + $html .= '<tr><td colspan="18" style="font-family:helvetica;font-size:8pt;font-weight:bold">'.strtoupper($range).' (U+'.$rangestart.'-U+'.$rangeend.')</td></tr>'; + $html .= '<tr><td></td>'; + $html .= '<td></td>'; + for ($k = 0; $k < 16; $k++) { + $html .= '<td><b>-'.sprintf('%X', $k).'</b></td>'; + } + } + $lastrange = $range ; + $justfinishedblank = false; + $justfinishedblankinvalid = false; + $html .= '</tr><tr><td><i>'.(floor($i / 16)*16).'</i></td>'; + $html .= '<td><b>'.sprintf('%03X', floor($i / 16)).'-</b></td>'; + } + if ($mpdf->_charDefined($cw, $i)) { $html .= '<td>&#'.$i.';</td>'; $counter++; } + else if (isset($unichars[$i])) { $html .= '<td style="background-color: #FFAAAA;"></td>'; } + else { $html .= '<td style="background-color: #555555;"></td>'; } + } + + if (($i % 16) > 0) { + for ($j = ($i % 16); $j < 16; ++$j) { $html .= '<td style="background-color: #555555;"></td>'; } + } + $html .= '</tr></table><br />'; +//============================================================== +//============================================================== +$mpdf->WriteHTML($html); // Separate Paragraphs defined by font + +$mpdf->Output(); +exit; + +//============================================================== +//============================================================== +//============================================================== +//============================================================== + + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/utils/font_names.php b/application/third_party/mpdf/utils/font_names.php new file mode 100644 index 0000000..9057bca --- /dev/null +++ b/application/third_party/mpdf/utils/font_names.php @@ -0,0 +1,200 @@ +<?php + +/* This script examines your font directory. + Point your browser to + http://your.domain/your_path_to _mpdf/utils/font_names.php + By default this will examine the folder /ttfonts/ (or the default font + directory defined by _MPDF_TTFONTPATH. + You can optionally define an alternative folder to examine by setting + the variable checkdir below (must be a relative path, or filesystem path). + You can optionally output just the font samples as a PDF file by setting $pdf=true. +*/ + + +$checkdir = ''; + +$pdf = false; + +////////////////////////////////// +////////////////////////////////// +////////////////////////////////// + +ini_set("memory_limit","256M"); + +define('_MPDF_PATH','../'); + +include("../mpdf.php"); +$mpdf=new mPDF('s'); +$mpdf->useSubstitutions = true; +if ($checkdir) { + $ttfdir = $checkdir; +} +else { $ttfdir = _MPDF_TTFONTPATH; } + +$mqr=ini_get("magic_quotes_runtime"); +if ($mqr) { set_magic_quotes_runtime(0); } +if (!class_exists('TTFontFile', false)) { include(_MPDF_PATH .'classes/ttfontsuni.php'); } +$ttf = new TTFontFile(); + +$tempfontdata = array(); +$tempsansfonts = array(); +$tempseriffonts = array(); +$tempmonofonts = array(); +$tempfonttrans = array(); + +$ff = scandir($ttfdir); + +foreach($ff AS $f) { + $ret = array(); + $isTTC = false; + if (strtolower(substr($f,-4,4))=='.ttc' || strtolower(substr($f,-5,5))=='.ttcf') { // Mac ttcf + $isTTC = true; + $ttf->getTTCFonts($ttfdir.$f); + $nf = $ttf->numTTCFonts; + for ($i=1; $i<=$nf; $i++) { + $ret[] = $ttf->extractCoreInfo($ttfdir.$f, $i); + } + } + else if (strtolower(substr($f,-4,4))=='.ttf' || strtolower(substr($f,-4,4))=='.otf' ) { + $ret[] = $ttf->extractCoreInfo($ttfdir.$f); + } + for ($i=0; $i<count($ret); $i++) { + if (!is_array($ret[$i])) { + if (!$pdf) echo $ret[$i].'<br />'; + } + else { + $tfname = $ret[$i][0]; + $bold = $ret[$i][1]; + $italic = $ret[$i][2]; + $fname = strtolower($tfname ); + $fname = preg_replace('/[ ()]/','',$fname ); + $tempfonttrans[$tfname] = $fname; + $style = ''; + if ($bold) { $style .= 'B'; } + if ($italic) { $style .= 'I'; } + if (!$style) { $style = 'R'; } + $tempfontdata[$fname][$style] = $f; + if ($isTTC) { + $tempfontdata[$fname]['TTCfontID'][$style] = $ret[$i][4]; + } + //if ($ret[$i][5]) { $tempfontdata[$fname]['rtl'] = true; } + //if ($ret[$i][7]) { $tempfontdata[$fname]['cjk'] = true; } + if ($ret[$i][8]) { $tempfontdata[$fname]['sip'] = true; } + if ($ret[$i][9]) { $tempfontdata[$fname]['smp'] = true; } + + $ftype = $ret[$i][3]; // mono, sans or serif + if ($ftype=='sans') { $tempsansfonts[] = $fname; } + else if ($ftype=='serif') { $tempseriffonts[] = $fname; } + else if ($ftype=='mono') { $tempmonofonts[] = $fname; } + } + } + +} +$tempsansfonts = array_unique($tempsansfonts); +$tempseriffonts = array_unique($tempseriffonts ); +$tempmonofonts = array_unique($tempmonofonts ); +$tempfonttrans = array_unique($tempfonttrans); + +if (!$pdf) { + echo '<h3>Information</h3>'; +} + +foreach ($tempfontdata AS $fname => $v) { + if (!isset($tempfontdata[$fname]['R']) || !$tempfontdata[$fname]['R']) { + if (!$pdf) echo 'WARNING - Font file for '.$fname.' may be an italic cursive script, or extra-bold etc.<br />'; + if (isset($tempfontdata[$fname]['I']) && $tempfontdata[$fname]['I']) { + $tempfontdata[$fname]['R'] = $tempfontdata[$fname]['I']; + } + else if (isset($tempfontdata[$fname]['B']) && $tempfontdata[$fname]['B']) { + $tempfontdata[$fname]['R'] = $tempfontdata[$fname]['B']; + } + else if (isset($tempfontdata[$fname]['BI']) && $tempfontdata[$fname]['BI']) { + $tempfontdata[$fname]['R'] = $tempfontdata[$fname]['BI']; + } + } + if (isset($tempfontdata[$fname]['smp']) && $tempfontdata[$fname]['smp']) { + if (!$pdf) echo 'INFO - Font file '.$fname.' contains characters in Unicode Plane 1 SMP<br />'; + $tempfontdata[$fname]['smp'] = false; + } + if (isset($tempfontdata[$fname]['sip']) && $tempfontdata[$fname]['sip']) { + if (!$pdf) echo 'INFO - Font file '.$fname.' contains characters in Unicode Plane 2 SIP<br />'; + if (preg_match('/^(.*)-extb/',$fname, $fm)) { + if (isset($tempfontdata[($fm[1])]) && $tempfontdata[($fm[1])]) { + $tempfontdata[($fm[1])]['sip-ext'] = $fname; + if (!$pdf) echo 'INFO - Font file '.$fname.' has been defined as a CJK ext-B for '.($fm[1]).'<br />'; + } + else if (isset($tempfontdata[($fm[1].'-exta')]) && $tempfontdata[($fm[1].'-exta')]) { + $tempfontdata[($fm[1].'-exta')]['sip-ext'] = $fname; + if (!$pdf) echo 'INFO - Font file '.$fname.' has been defined as a CJK ext-B for '.($fm[1].'-exta').'<br />'; + } + } + // else { unset($tempfontdata[$fname]['sip']); } + } + unset($tempfontdata[$fname]['sip']); + unset($tempfontdata[$fname]['smp']); +} + +$mpdf->fontdata = array_merge($tempfontdata ,$mpdf->fontdata); + + $mpdf->available_unifonts = array(); + foreach ($mpdf->fontdata AS $f => $fs) { + if (isset($fs['R']) && $fs['R']) { $mpdf->available_unifonts[] = $f; } + if (isset($fs['B']) && $fs['B']) { $mpdf->available_unifonts[] = $f.'B'; } + if (isset($fs['I']) && $fs['I']) { $mpdf->available_unifonts[] = $f.'I'; } + if (isset($fs['BI']) && $fs['BI']) { $mpdf->available_unifonts[] = $f.'BI'; } + } + + $mpdf->default_available_fonts = $mpdf->available_unifonts; + +if (!$pdf) { + echo '<hr />'; + echo '<h3>Font names as parsed by mPDF</h3>'; +} + +ksort($tempfonttrans); +$html = ''; +foreach($tempfonttrans AS $on=>$mn) { + if (!file_exists($ttfdir.$mpdf->fontdata[$mn]['R'])) { continue; } + $ond = '"'.$on.'"'; + $html .= '<p style="font-family:'.$on.';">'.$ond.' font is available as '.$mn; + if (isset($mpdf->fontdata[$mn]['sip-ext']) && $mpdf->fontdata[$mn]['sip-ext']) { + $html .= '; CJK ExtB: '.$mpdf->fontdata[$mn]['sip-ext']; + } + $html .= '</p>'; +} + +if ($pdf) { + $mpdf->WriteHTML($html); + $mpdf->Output(); + exit; +} + +foreach($tempfonttrans AS $on=>$mn) { + $ond = '"'.$on.'"'; + echo '<div style="font-family:\''.$on.'\';">'.$ond.' font is available as '.$mn; + if (isset($mpdf->fontdata[$mn]['sip-ext']) && $mpdf->fontdata[$mn]['sip-ext']) { + echo '; CJK ExtB: '.$mpdf->fontdata[$mn]['sip-ext']; + } + echo '</div>'; +} +echo '<hr />'; + +echo '<h3>Sample config_fonts.php file</h3>'; +echo '<div>Remember to edit the following arrays to place your preferred default first in order:</div>'; + +echo '<pre>'; + +ksort($tempfontdata); +echo '$this->fontdata = '.var_export($tempfontdata,true).";\n"; + +sort($tempsansfonts); +echo '$this->sans_fonts = array(\''.implode("', '", $tempsansfonts)."');\n"; +sort($tempseriffonts); +echo '$this->serif_fonts = array(\''.implode("', '", $tempseriffonts)."');\n"; +sort($tempmonofonts); +echo '$this->mono_fonts = array(\''.implode("', '", $tempmonofonts)."');\n"; +echo '</pre>'; + +exit; + +?> \ No newline at end of file diff --git a/application/third_party/mpdf/utils/index.php b/application/third_party/mpdf/utils/index.php new file mode 100644 index 0000000..63ba0cb --- /dev/null +++ b/application/third_party/mpdf/utils/index.php @@ -0,0 +1,26 @@ + +<html> +<head> +</head> +<body bgcolor=#FFFFFF text=#001C66> + +<h2>mPDF Font Utility scripts for Version 5.0</h2> +<p> +<a href="font_dump.php">Dump all characters from a font (font_dump.php)</a> +</p> +<p> +<a href="font_names.php">Show a list of all font names available (font_names.php)</a> +</p> +<p> +<a href="font_collections.php">Show fonts in Collections .ttc (font_collections.php)</a> +</p> +<p> +<a href="font_coverage.php">Show coverage of characters from all fonts (font_coverage.php)</a> +</p> + +<p>Edit the scripts to change the font folder if you wish - this is set by default to /ttfonts/</p> + + + +</body> +</html> diff --git a/application/views/anjungan/v_admin_anjungan.php b/application/views/anjungan/v_admin_anjungan.php new file mode 100644 index 0000000..d5590dc --- /dev/null +++ b/application/views/anjungan/v_admin_anjungan.php @@ -0,0 +1,308 @@ +<body class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h1>Admin Anjungan<small></small></h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li class="active"><?php echo $title ?></li> + </ol> + </section> + <script> + window.onload = function () { + document.getElementById("barcode").autofocus; + //alert("tes"); + } + </script> + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class=" col-xs-12"> + <div class="box"> + <div class="box-body"> + <br /> + <div class="form-group"> + <label for="barcode" class="col-sm-2 control-label">BARCODE</label> + <div class="col-sm-3"> + <input id="barcode" onkeyup="barcode()" class="form-control" name="barcode" type="text" placeholder="Masukan Barcode" autocomplete="off" value="" autofocus="auofocus" /> + </div> + <div class="col-sm-4"> + <code> + Tekan Enter. (Barcode depan nomor selalu ada huruf lain, Ex: j200730100005 "Hiraukan huruf 'j' nya") + </code> + </div> + <div class="col-sm-3"> + <a href="#" class="btn bg-aqua pull-right btn-block" data-toggle="modal" data-dismiss="modal" data-target="#modal_online"><b>Pendaftaran Online</b></a> + </div> + </div> + </div> + <div class="box-body"> + <?php if($this->session->flashdata('message')){?> + <div class="alert alert-success alert-dismissable"> + <button id="alertbutton" name="alertbutton" type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-check"></i> Alert!</h4> + <?php echo $this->session->flashdata('message');?> + </div> + <?php }?> + <?php if($this->session->flashdata('messagefail')){?> + <div class="alert alert-danger alert-dismissable"> + <button id="alertbutton" name="alertbutton" type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-times"></i> Alert!</h4> + <?php echo $this->session->flashdata('messagefail');?> + </div> + <?php }?> + <?php if($this->session->flashdata('messagewarning')){?> + <div class="alert alert-warning alert-dismissable"> + <button id="alertbutton" name="alertbutton" type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-times"></i> Alert!</h4> + <?php echo $this->session->flashdata('messagewarning');?> + </div> + <?php }?> + <?php if($this->session->flashdata('messageblue')){?> + <div class="alert alert-info alert-dismissable"> + <button id="alertbutton" name="alertbutton" type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-times"></i> Alert!</h4> + <?php echo $this->session->flashdata('messageblue');?> + </div> + <?php }?> + </div> + <script type="text/javascript"> + var url="<?php echo base_url();?>"; + function barcode(){ + var cekbarcode = document.getElementById('barcode').value; + var barjadi = cekbarcode.substring(1, 13); + var barawal = cekbarcode.substring(0, 1); + if(12<cekbarcode.length){ + document.getElementById('barcode').value=""; + window.location = url+"index.php/ps_anjungan/barcode/"+barjadi; + //alert(barjadi); + }else if(11<cekbarcode.length){ + if(barawal!="j"){ + //alert(cekbarcode); + document.getElementById('barcode').value=""; + window.location = url+"index.php/ps_anjungan/barcode/"+cekbarcode; + } + } + + } + + setTimeout(function(){ + $(".alert").fadeTo(500, 0).slideUp(500, function() { + $(this).remove(); + }); + }, 4000); + </script> + <br /> + <div class="panel box box-warning"> + <label class="col-sm-5 control-label text-yellow">DATA PENGUNJUNG TERLAMBAT</label> + <div class="box-body"> + <br /> + <div class="form-group"> + <div class="col-sm-12"> + <table id="example1" class="table table-bordered table-striped"> + <thead> + <tr> + <th>No</th> + <th>Jam Panggil</th> + <th>Lama Terlambat</th> + <th>No. Antrian</th> + <th>Barcode</th> + <th>Shift</th> + <!--th>Aksi</th--> + </tr> + </thead> + <tbody> + <?php + $noterlambat=0; + foreach ($tr as $dataterlambat){$noterlambat++; + + $awal = strtotime($dataterlambat->prt_tanggal); //waktu awal + $akhir = strtotime(date("Y-m-d H:i:s")); //waktu akhir + $diff = $akhir-$awal; + $jam = floor($diff / (60 * 60)); + $menit = $diff - $jam * (60 * 60); + ?> + <tr> + <td><?php echo $noterlambat;?></td> + <td><?php echo date("d-m-Y H:i:s", strtotime($dataterlambat->prt_tanggal))?></td> + <td><?php echo $jam." Jam ".floor($menit/60)." Menit";?></a></td> + <td><?php echo $dataterlambat->pp_nomor_antrian;?></td> + <td><?php echo $dataterlambat->pp_barcode;?></td> + <td>Shift <?php echo $dataterlambat->pp_shift;?></td> + <!--td><?php echo "<a href='".base_url()."index.php/ps_anjungan/proses_datang/".$dataterlambat->prt_id."' class='btn btn-success btn-xs'>Datang</a>";?></td--> + </tr> + <?php }?> + </tbody> + </table> + </div> + </div> + </div> + </div> + <br /> + <div class="panel box box-danger"> + <label class="col-sm-2 control-label text-red">DATA PENGUNJUNG</label> + <div class="box-body"> + <br /> + <div class="form-group"> + <div class="col-sm-12"> + <table id="example2" class="table table-bordered table-striped"> + <thead> + <tr> + <th>No</th> + <th>Tgl Daftar</th> + <th>RM</th> + <th>Barcode</th> + <th>No. Antrian</th> + <th>No. Klinik</th> + <th>Shift</th> + <th>Klinik</th> + <th>Pembayaran</th> + <th>Masuk</th> + <th>Aksi</th> + </tr> + </thead> + <tbody> + <?php + $nomor=0; + foreach ($fs as $datapengunjung){$nomor++; + ?> + <tr> + <td><?php echo $nomor;?></td> + <td><?php echo date("d-m-Y H:i:s", strtotime($datapengunjung->pp_tanggal_datang))?></td> + <td><?php echo $datapengunjung->pp_rekamedik;?></td></td> + <td><?php echo $datapengunjung->pp_barcode;?></td> + <td><?php echo $datapengunjung->pp_nomor_antrian; if($datapengunjung->pp_pendaftaran_online!=null){echo " | Online ".$datapengunjung->pp_pendaftaran_online;}?></td> + <td><?php echo $datapengunjung->pp_nomor_antrian_klinik;?></td> + <td><?php echo "Shift ".$datapengunjung->pp_shift;?></td> + <td><?php echo $datapengunjung->mk_nama;?></td> + <td> + <?php if($datapengunjung->pp_pembayaran=="1"){echo "UMUM";} ?> + <?php if($datapengunjung->pp_pembayaran=="2"){echo "JKN";} ?> + </td> + <td><?php if($datapengunjung->prt_aktif=="1"){echo "<b>TERLAMBAT</b>";}elseif($datapengunjung->prt_aktif=="2"){echo "TIDAK";}elseif($datapengunjung->pp_status=="1"){echo "<code>YA</code>";}else{echo "TIDAK";}?></td> + <td><?php echo "<a href='".base_url()."index.php/ps_anjungan/print_ulang/".$datapengunjung->pp_id."/1' class='btn btn-success btn-xs'>Tiket</a>";?> + <?php echo "<a href='".base_url()."index.php/ps_anjungan/print_ulang/".$datapengunjung->pp_id."/2' class='btn btn-success btn-xs'>Tiket Pengantar</a>";?> + + <?php + if($this->session->userdata('s_ID_User')=="1"){ + if($datapengunjung->pp_status!="1"){ + echo "<a href='".base_url()."index.php/ps_anjungan/proses_bypass/".$datapengunjung->pp_id."' class='btn btn-info btn-xs'>ByPass</a>"; + } + } + ?> + </td> + </tr> + <?php }?> + </tbody> + </table> + </div> + </div> + </div> + </div> + + </div> + </div> + </div> + </section> + <div class="control-sidebar-bg"></div> +</body> +<script type="text/javascript"> + //function formfocus() { + //document.getElementById('barcode').focus(); + //} + //window.onload = formfocus; +</script> +<!------------------------Start modal daftar online-----------------------------------------------------------------------!> +<div class="modal fade" id="modal_online" tabindex="-1" role="dialog" aria-labelledby="largeModal" aria-hidden="true"> + <form class="form-horizontal" id="form_online" action="<?php echo(base_url()); ?>index.php/ps_anjungan/daftar_online" method="post" autocomplete="off"> + <div class="modal-dialog"> + <div class="modal-content"> + + <!--start data dari pilih klinik--> + <input type="hidden" id="idklinikonline" name="idklinikonline" value="" /> + <!--end data dari pilih klinik--> + + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button> + <h3 class="modal-title" id="myModalLabel">Pemesanan Antrian Poliklinik Pendaftaran Online</h3> + </div> + <div class="modal-body"> + <div class="form-group"> + <label for="nopendaftaran" class="col-sm-3 control-label">Pilih Klinik</label> + <div class="col-sm-8"> + <select onchange="getshift()" id="klinik" name="klinik" class="form-control select" > + <option value="">Pilih Klinik</option> + <?php + foreach ($mk as $dat) { + $select=""; + if($settipeuser==$dat->mk_id){$select="selected='selected'";} + echo "<option value='".$dat->mk_id."'".$select.">".$dat->mk_nama."</option>"; + } + ?> + </select> + </div> + </div> + <div class="form-group"> + <label for="nopendaftaran" class="col-sm-3 control-label">No Pendaftaran</label> + <div class="col-sm-8"> + <input autocomplete="off" id="nopendaftaran" class="form-control" name="nopendaftaran" type="number" placeholder="Masukan Nomor Pendaftaran Online" value=""/> + </div> + </div> + <div class="form-group"> + <label for="norm" class="col-sm-3 control-label">No Rekamedik</label> + <div class="col-sm-8"> + <input autocomplete="off" id="norm" class="form-control" name="norm" type="number" placeholder="Masukan Nomor Rekamedik" value=""/> + </div> + </div> + <script> + var url_data="<?php echo base_url();?>index.php/"; + function getshift(a){ + document.getElementById("shiftonline").value = "0"; + var items=""; + var pilih="selected='selected'"; + $("#shiftonline").html(""); + $.ajax({ + type: "POST", + url: url_data+"ps_anjungan/data_shift_klinik", + dataType: "json", + data: "klinik="+$('#klinik').val(), + success: function(result) { + //items+="<option value='"+'0'+"' "+pilih+">"+'Pilih Shift'+"</option>"; + $.each(result, function(index, value) { + var res = value.mk_jam_shift.split("|"); + var ni = 0; + for (var i = 1; i <= value.mk_shift; i++) { + items+="<option value='"+i+"'>Shift "+i+" &plusmn Mulai Pukul "+res[ni]+"</option>";ni++; + } + }); + $("#shiftonline").html(items); + } + }); + } + + </script> + <div class="form-group"> + <label for="shift" class="col-sm-3 control-label">Shift</label> + <div class="col-sm-8"> + <select id="shiftonline" name="shiftonline" class="form-control select"> + <option value="1"> Shift 1 &plusmn Mulai Pukul 07:00</option> + </select> + </div> + </div> + <div class="form-group"> + <label for="pembayaran" class="col-sm-3 control-label">Jenis Pembayaran</label> + <div class="col-sm-8"> + <select id="pembayaran" name="pembayaran" class="form-control select"> + <option value="1"> UMUM </option> + <option value="2"> JKN </option> + </select> + </div> + </div> + </div> + <div class="modal-footer"> + <button class="btn btn-success" type="submit"> Simpan </button> + <button class="btn" data-dismiss="modal" aria-hidden="true">Tutup</button> + </div> + </div> + </div> + </form> +</div> +<!------------------------End modal daftar online-----------------------------------------------------------------------!> \ No newline at end of file diff --git a/application/views/anjungan/v_anjungan.php b/application/views/anjungan/v_anjungan.php new file mode 100644 index 0000000..c24fb90 --- /dev/null +++ b/application/views/anjungan/v_anjungan.php @@ -0,0 +1,476 @@ +<body class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h1>Anjungan RSSA <small>Pilih Klinik Tekan Tombol Hijau, Tombol Merah Penuh / Klinik Tutup</small></h1> + <ol class="breadcrumb"> + <li><!--a href="<?php echo base_url()?>index.php"><i class="fa fa-backward"></i> Kembali</a--></li> + </ol> + </section> + <!-- Main content --> + <section class="content"> + + <div class="row"> + <div class=" col-xs-12"> + <div class="box"> + <div class="box-body"> + <?php if($this->session->flashdata('messagefalse')){?> + <div id="msfalse" class="alert alert-danger alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-check"></i> Alert!</h4> + <?php echo $this->session->flashdata('messagefalse');?> + <script> + setTimeout(function() { + $('#msfalse').hide('fast'); + }, 1000); + </script> + </div> + <?php }?> + <?php + foreach ($mk as $klinik) { + $optiononline = ""; + $cekpenuh= $klinik->mk_aktif; + $shiftpenuh = $klinik->mk_shift_penuh; + + ?> + <div class="col-lg-3 col-xs-4"> + <div class="small-box <?php if($cekpenuh==0){echo "bg-green";} else{ echo "bg-red"; } ?>"> + <?php $setjamshift = ""; $setshift = "";?> + <!---start set shift pesanan----!> + <textarea id="datashiftonline<?php echo $klinik->mk_id;?>" hidden=""> + <?php + //---------------------get data mk_jam_shift--------------------// + $pecahjamshift = explode("|",$klinik->mk_jam_shift); + $countjamshift = count($pecahjamshift); + $setshiftjum = 1; + for ($x = 0; $x < $countjamshift; $x++){ + if($pecahjamshift[$x]!=""){ + echo "<option id='delshiftonline$setshiftjum' value='$setshiftjum'>Shift $setshiftjum &plusmn Mulai Pukul $pecahjamshift[$x] </option>"; + } + //------------start set shift info modal-------// + if($klinik->mk_status_shift==$setshiftjum){ + $setjamshift=$pecahjamshift[$x]; + $setshift=$setshiftjum; + } + //------------end set shift info modal-------// + $setshiftjum++; + } + ?> + </textarea> + + <input type="hidden" id="shift<?php echo $klinik->mk_id;?>" name="shift<?php echo $klinik->mk_id;?>" value="<?php echo $setshift; ?>" /> + <!---end set shift pesanan----!> + + <input type="hidden" id="jumshift" value="<?php echo $klinik->mk_shift;?>" /> + + <!--start button pilih klinik hijau-----> + <a onclick="setklinik(<?php echo $klinik->mk_id;?>,<?php echo $klinik->mk_status_shift;?>)" href="#" data-toggle="modal" data-target="<?php if($cekpenuh==0){echo "#modal_kunjungan1";}else{ if($this->session->userdata('validated')){echo "#modal_kunjungan2";} }?>" class="small-box-footer"> + <div class="inner"> + <h3><b><?php echo $klinik->mk_nama;?></b></h3> + <p> <?php if($klinik->mk_keterangan!=null){echo "<b>( ".$klinik->mk_keterangan." )</b> "; } if($shiftpenuh==1){ echo "Jadwal Hari Ini Penuh";} elseif($cekpenuh==0){ echo "<b>SHIFT $klinik->mk_status_shift </b>";}else{ echo "Jadwal Hari Ini Tutup";} ?></p> + <p><?php if($cekpenuh==0){ echo "Mulai &plusmn Pukul $setjamshift";}else{ if($this->session->userdata('validated')){echo "Hanya Dapat Memesan";}else{echo "Silahkan Memesan Jadwal Dipetugas";}} ?></p> + </div> + <div class="icon"> + <?php if($cekpenuh==0){ echo "<i class='ion ion-person-add'></i>";} else{echo "<i class='fa fa-ban'></i>";}?> + </div> + </a> + <!--end button pilih klinik hijau-----> + </div> + </div> + <?php + }?> + <script> + //--------start set data klinik untuk modal-------// + function setklinik(a,b){ + document.getElementById('idkliniksekarang').value=a; + document.getElementById('shiftsekarang').value=b; + document.getElementById('idklinikpesan').value=a; + document.getElementById('idkliniksekarangFS').value=a; + document.getElementById('shiftsekarangFS').value=b; + + document.getElementById('tanggalpesan').value=""; + document.getElementById('shiftpesan').value=0; + + var datoptiononline = document.getElementById('datashiftonline'+a).value; + for (i = 1; i < 10; i++) { + $('#delshiftpesan'+i).remove(); + } + } + //--------end set data klinik untuk modal-------// + </script> + </div> + </div> + </div> + </div> + </section> + <div class="control-sidebar-bg"></div> +</body> + +<!------------------------Start modal pilih kunjungan 1-----------------------------------------------------------------------> +<div class="modal fade" id="modal_kunjungan1" tabindex="-1" role="dialog" aria-labelledby="largeModal" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button> + <h3 class="modal-title" id="myModalLabel">Pilih Kunjungan</h3> + </div> + <div class="modal-body"> + <div class="form-group"> + <div class="small-box bg-blue"> + <a href="#" onclick="cekjamsekarang()" class="small-box-footer" data-toggle="modal" data-dismiss="modal" data-target="#modal_pembayaran"> + <div class="inner"> + <h3>SEKARANG</h3> + </div> + </a> + </div> + </div> + <script> + function setkosong(){ + document.getElementById("tanggalpesan").value=""; + document.getElementById("shiftpesan").value=""; + document.getElementById("pembayaran").value=""; + document.getElementById("submit").disabled = true; + + document.getElementById("penanggungjawab").value=""; + document.getElementById("norek").value=""; + document.getElementById("namapas").value=""; + document.getElementById("ket").value=""; + document.getElementById("pembayaranfs").value=""; + } + //-----------------------start cek jam daftar old------------------// + + function cekjamsekarang(){ + //-----------------------start cek jam daftar------------------// + var url="<?php echo base_url();?>"; + var datenow = new Date(); + var jamnow = datenow.getHours(); + var daynow = datenow.getDay(); + var jamtutup = ''; + + //if(daynow=="5"){jamtutup = '10';}else{jamtutup = '12';} + if(daynow=="5"){jamtutup = '10';}else{jamtutup = '11';} + if(jamnow>=jamtutup){ + $('#modal_pembayaran').modal().hide(); + $("#modal_tutup").modal(); + $("#texttutup").remove(); + $("#divtexttutup").append("<h3 id='texttutup'>TUTUP JAM "+jamtutup+":00</h3>"); + } + } + //-----------------------start cek jam daftar------------------// + + // function cekjamsekarang(){ + + // var url="<?php echo base_url();?>"; + // var datenow = new Date(); + // var jamnow = datenow.getHours(); + // var minnow = datenow.getMinutes(); + // var daynow = datenow.getDay(); + // var jamtutup = ''; + // var jamtutupdisplay = ''; + + // var setjam = jamnow+""+minnow; + + // if(daynow=="5"){jamtutup = '1000'; jamtutupdisplay = '10:00'; + // }else{jamtutup = '1130'; jamtutupdisplay = '11:30';} + + // if(setjam>=jamtutup){ + // $('#modal_pembayaran').modal().hide(); + // $("#modal_tutup").modal(); + // $("#texttutup").remove(); + // $("#divtexttutup").append("<h3 id='texttutup'>TUTUP JAM "+jamtutupdisplay+"</h3>"); + // } + // } + + //-----------------------end cek jam daftar------------------// + </script> + <?php if($this->session->userdata('validated')){?> + <div class="form-group"> + <div class="small-box bg-yellow"> + <a href="#" onclick="setkosong()" class="small-box-footer" data-toggle="modal" data-dismiss="modal" data-target="#modal_pesan"> + <div class="inner"> + <h3>PESAN</h3> + </div> + </a> + </div> + </div> + <div class="form-group"> + <div class="small-box bg-red"> + <a href="#" onclick="setkosong()" class="small-box-footer" data-toggle="modal" data-dismiss="modal" data-target="#modal_fasttrack"> + <div class="inner"> + <h3>FAST TRACK</h3> + </div> + </a> + </div> + </div> + <?php }?> + </div> + <div class="modal-footer"> + <button class="btn" data-dismiss="modal" aria-hidden="true">Tutup</button> + </div> + </div> + </div> +</div> +<!------------------------End modal pilih kunjungan-----------------------------------------------------------------------> +<!------------------------Start modal tutup----------------------------------------------------------------------> +<div class="modal fade" id="modal_tutup" tabindex="-1" role="dialog" aria-labelledby="largeModal" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button> + <h3 class="modal-title" id="myModalLabel">Pilih Kunjungan</h3> + </div> + <div class="modal-body"> + <div class="form-group"> + <div class="small-box bg-yellow"> + <a href="<?php echo base_url()."index.php/ps_anjungan"; ?>" class="small-box-footer"> + <div class="inner" id="divtexttutup"> + <h3 id="texttutup">PENDAFTARAN DITUTUP JAM </h3> + </div> + </a> + </div> + </div> + </div> + <div class="modal-footer"> + <button class="btn" data-dismiss="modal" aria-hidden="true">Tutup</button> + </div> + </div> + </div> +</div> +<!------------------------End modal tutup-----------------------------------------------------------------------> +<!------------------------Start modal pilih kunjungan 2-----------------------------------------------------------------------> +<div class="modal fade" id="modal_kunjungan2" tabindex="-1" role="dialog" aria-labelledby="largeModal" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button> + <h3 class="modal-title" id="myModalLabel">Pilih Kunjungan</h3> + </div> + <?php if($this->session->userdata('validated')){?> + <div class="modal-body"> + <div class="form-group"> + <div class="small-box bg-yellow"> + <a href="#" onclick="setkosong()" class="small-box-footer" data-toggle="modal" data-dismiss="modal" data-target="#modal_pesan"> + <div class="inner"> + <h3>PESAN</h3> + </div> + </a> + </div> + </div> + <div class="form-group"> + <div class="small-box bg-red"> + <a href="#" onclick="setkosong()" class="small-box-footer" data-toggle="modal" data-dismiss="modal" data-target="#modal_fasttrack"> + <div class="inner"> + <h3>FAST TRACK</h3> + </div> + </a> + </div> + </div> + <?php }?> + </div> + <div class="modal-footer"> + <button class="btn" data-dismiss="modal" aria-hidden="true">Tutup</button> + </div> + </div> + </div> +</div> +<!------------------------End modal pilih kunjungan-----------------------------------------------------------------------> +<!------------------------Start modal pemesanan-----------------------------------------------------------------------> +<div class="modal fade" id="modal_pesan" tabindex="-1" role="dialog" aria-labelledby="largeModal" aria-hidden="true"> + <form class="form-horizontal" id="form" action="<?php echo(base_url()); ?>index.php/ps_anjungan/pesan" method="post" autocomplete="off"> + <div class="modal-dialog"> + <div class="modal-content"> + + <!--start data dari pilih klinik--> + <input type="hidden" id="idklinikpesan" name="idklinikpesan" value="" /> + <!--end data dari pilih klinik--> + + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button> + <h3 class="modal-title" id="myModalLabel">Pemesanan Antrian Poliklinik</h3> + </div> + <div class="modal-body"> + <div class="form-group"> + <label for="shift" class="col-sm-2 control-label">Tanggal</label> + <div class="col-sm-9"> + <div class="input-group date" data-provide="datepicker"> + <div class="input-group-addon"> + <span class="fa fa-calendar"></span> + </div> + <input id="tanggalpesan" name="tanggalpesan" type="text" class="form-control" onchange="getshift()" /> + </div> + </div> + </div> + <script> + var url_data="<?php echo base_url();?>index.php/"; + function getshift(a){ + document.getElementById("shiftpesan").value = "0"; + var tanggal = document.getElementById("tanggalpesan").value; + var items=""; + $("#shiftpesan").html(""); + $.ajax({ + type: "POST", + url: url_data+"ps_anjungan/datashift_pesan/"+tanggal, + dataType: "json", + data: "idk="+$('#idklinikpesan').val(), + + success: function(result) { + //items+="<option value='"+''+"' >"+'Pilih Shift'+"</option>"; + $.each(result, function(index, value) { + items+=value.datashiftpesan; + }); + $("#shiftpesan").html(items); + } + }); + } + + </script> + <div class="form-group"> + <label for="shift" class="col-sm-2 control-label">Shift</label> + <div class="col-sm-9"> + <select onchange="cek()" id="shiftpesan" name="shiftpesan" class="form-control select"> + <option value=""> Pilih Shift </option> + </select> + </div> + </div> + <div class="form-group"> + <label for="pembayaran" class="col-sm-2 control-label">Pembayaran</label> + <div class="col-sm-9"> + <select onchange="cek()" id="pembayaran" name="pembayaran" class="form-control select"> + <option value=""> Pilih Pembayaran </option> + <option value="1"> UMUM/JKMM/SPM/JAMPERSAL/T4/KARYAWAN </option> + <option value="2"> BPJS </option> + </select> + </div> + </div> + </div> + <script> + function cek(){ + var jumisi = 0; + var jstanggal = document.getElementById("tanggalpesan").value; + var jsshift = document.getElementById("shiftpesan").value; + var jspembayaran= document.getElementById("pembayaran").value; + if(jstanggal){jumisi=jumisi+1;} + if(jsshift){jumisi=jumisi+1;} + if(jspembayaran){jumisi=jumisi+1;} + if(jumisi==3){document.getElementById("submit").disabled = false;} + + } + </script> + <div class="modal-footer"> + <button id="submit" disabled="" class="btn btn-success" type="submit"> Simpan </button> + <button class="btn" data-dismiss="modal" aria-hidden="true">Tutup</button> + </div> + </div> + </div> + </form> +</div> +<!------------------------End modal pemesanan-----------------------------------------------------------------------> +<!------------------------Start modal pembayaran-----------------------------------------------------------------------> +<div class="modal fade" id="modal_pembayaran" tabindex="-1" role="dialog" aria-labelledby="largeModal" aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <!--input type="hidden" id="idklinik" name="idklinik" value="" /--> + <input type="hidden" id="idkliniksekarang" name="idkliniksekarang" value="" /> + <input type="hidden" id="shiftsekarang" name="shiftsekarang" value="" /> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button> + <h3 class="modal-title" id="myModalLabel">Jenis Pembayaran</h3> + </div> + + <div class="modal-body"> + <div class="form-group" id="btndiv"> + <div class="small-box bg-green"> + <a href="#" id="btnjkn" onclick="sekarang(2)" type="submit" class="small-box-footer"> + <div class="inner"> + <h3>BPJS</h3> + </div> + </a> + </div> + <div class="small-box bg-blue"> + <a href="#" id="btnumum" onclick="sekarang(1)" type="submit" class="small-box-footer"> + <div class="inner"> + <h3>UMUM / JKMM / SPM / DLL</h3> + </div> + </a> + </div> + </div> + </div> + <div class="modal-footer"> + <button class="btn" data-dismiss="modal" aria-hidden="true">Tutup</button> + </div> + </div> + </div> +</div> +<!------------------------End modal pembayaran-----------------------------------------------------------------------> +<!------------------------Start modal Fasttrack-----------------------------------------------------------------------> +<div class="modal fade" id="modal_fasttrack" tabindex="-1" role="dialog" aria-labelledby="largeModal" aria-hidden="true"> + <form class="form-horizontal" action="<?php echo(base_url()); ?>index.php/ps_anjungan/fasttrack" method="post" autocomplete="off"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button> + <h3 class="modal-title" id="myModalLabel">Form Fast Track</h3> + </div> + <div class="modal-body"> + <input hidden="" id="idkliniksekarangFS" name="idkliniksekarangFS" value="" /> + <input hidden="" id="shiftsekarangFS" name="shiftsekarangFS" value="" /> + <div class="form-group"> + <label for="penanggungjawab" class="col-sm-4 control-label">Penanggung Jawab</label> + <div class="col-sm-7"> + <input type="text" id="penanggungjawab" name="penanggungjawab" value="" class="form-control select" onkeyup="this.value = this.value.toUpperCase()"/> + </div> + </div> + <div class="form-group"> + <label for="norek" class="col-sm-4 control-label">No Rekamedik</label> + <div class="col-sm-7"> + <input type="number" id="norek" name="norek" value="" class="form-control select" /> + </div> + </div> + <div class="form-group"> + <label for="namapas" class="col-sm-4 control-label">Nama Pasien</label> + <div class="col-sm-7"> + <input type="text" id="namapas" name="namapas" value="" class="form-control select" onkeyup="this.value = this.value.toUpperCase()"/> + </div> + </div> + <div class="form-group"> + <label for="ket" class="col-sm-4 control-label">Alasan Fast Track</label> + <div class="col-sm-7"> + <textarea class="form-control select" id="ket" name="ket" onkeyup="this.value = this.value.toUpperCase()" ></textarea> + </div> + </div> + <div class="form-group"> + <label for="pembayaranfs" class="col-sm-4 control-label">Pembayaran</label> + <div class="col-sm-7"> + <select onchange="cek()" id="pembayaranfs" name="pembayaranfs" class="form-control select"> + <option value=""> Pilih Pembayaran </option> + <option value="1"> UMUM/JKMM/SPM/JAMPERSAL/T4/KARYAWAN </option> + <option value="2"> BPJS </option> + </select> + </div> + </div> + </div> + <div class="modal-footer"> + <button class="btn btn-success" id="tbnsubmit" type="submit"> Simpan </button> + <button class="btn" data-dismiss="modal" aria-hidden="true">Tutup</button> + </div> + </div> + </div> + </form> +</div> +<!------------------------End modal Fasttrack-----------------------------------------------------------------------> +<script> + var url="<?php echo base_url();?>"; + function sekarang(a){ + $("#btndiv").html(""); + + $("#btndiv").html("<div class='small-box bg-green'><a href='#' class='small-box-footer' ><div class='inner'><h3>TUNGGU SAMPAI TERCETAK....</h3></div></a></div>"); + + + var idklinik = document.getElementById('idkliniksekarang').value; + var setshift = document.getElementById('shift'+idklinik).value; + window.location=url+"index.php/ps_anjungan/sekarang/"+idklinik+"/"+setshift+"/"+a; + //alert("Sukses Membuat Tiket, Tunggu Sampai Tercetak (Jangan Terlalu Banyak di tekan) !!"); + } + + setTimeout(function(){ + window.location.reload(1); + }, 50000); +</script> diff --git a/application/views/anjungan/v_home.php b/application/views/anjungan/v_home.php new file mode 100644 index 0000000..f52a8d2 --- /dev/null +++ b/application/views/anjungan/v_home.php @@ -0,0 +1,98 @@ +<body class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h1>Home Anjungan<small></small></h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li class="active"><?php echo $title ?></li> + </ol> + </section> + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class=" col-xs-12"> + <div class="box"> + <div class="box-body"> + <br /> + <div class="form-group"> + <label for="barcode" class="col-sm-2 control-label">Barcode</label> + <div class="col-sm-3"> + <input id="barcode" onkeypress="barcode()" class="form-control" name="barcode" type="text" placeholder="Masukan Barcode" autocomplete="off" value="" autofocus="auofocus" /> + </div> + </div> + </div> + <div class="box-body"> + <?php if($this->session->flashdata('message')){?> + <div class="alert alert-success alert-dismissable"> + <button id="alertbutton" name="alertbutton" type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-check"></i> Alert!</h4> + <?php echo $this->session->flashdata('message');?> + </div> + <?php }?> + <?php if($this->session->flashdata('messagefail')){?> + <div class="alert alert-danger alert-dismissable"> + <button id="alertbutton" name="alertbutton" type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-times"></i> Alert!</h4> + <?php echo $this->session->flashdata('messagefail');?> + </div> + <?php }?> + </div> + <script type="text/javascript"> + var url="<?php echo base_url();?>"; + function barcode(){ + var cekbarcode=document.getElementById('barcode').value; + //alert (cekbarcode.length); + if(cekbarcode.length==12){ + window.location = url+"index.php/ps_anjungan/barcode/"+cekbarcode; + } + } + + setTimeout(function(){ + $(".alert").fadeTo(500, 0).slideUp(500, function() { + $(this).remove(); + }); + }, 1000); + </script> + <br /> + <div class="panel box box-warning"> + <div class="box-body"> + <br /> + <div class="form-group"> + <label class="col-sm-2 control-label text-yellow">Data Pengunjung Terlambat</label> + <div class="col-sm-10"> + <table id="example1" class="table table-bordered table-striped"> + <thead> + <tr> + <th>No</th> + <th>Tanggal Periksa</th> + <th>No. Antrian</th> + <th>Barcode</th> + <th>Shift</th> + <th>Aksi</th> + </tr> + </thead> + <tbody> + <?php + $noterlambat=0; + foreach ($tr as $dataterlambat){$noterlambat++; + ?> + <tr> + <td><?php echo $noterlambat;?></td> + <td><?php echo $dataterlambat->pp_tanggal_periksa;?></td> + <td><?php echo $dataterlambat->pp_nomor_antrian;?></td> + <td><?php echo $dataterlambat->pp_barcode;?></td> + <td>Shift <?php echo $dataterlambat->pp_shift;?></td> + <td><?php echo "<a href='".base_url()."index.php/ps_anjungan/proses_datang/".$dataterlambat->prt_id."' class='btn btn-success btn-xs'>Datang</a>";?></td> + </tr> + <?php }?> + </tbody> + </table> + </div> + </div> + </div> + </div> + </div> + </div> + </div> + </section> + <div class="control-sidebar-bg"></div> +</body> diff --git a/application/views/anjungan/v_info_anjungan.php b/application/views/anjungan/v_info_anjungan.php new file mode 100644 index 0000000..eac0080 --- /dev/null +++ b/application/views/anjungan/v_info_anjungan.php @@ -0,0 +1,218 @@ +<body onload="panggilload()" class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h1 style="text-align: center;"><b>Antrian Pendaftaran - <code>NOMOR YANG TERTERA DI LAYAR SILAHKAN MENUJU KE PETUGAS BARCODE</code></b></h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php/"><i class="fa fa-backward"></i> Kembali</a></li> + </ol> + </section> + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class=" col-xs-12"> + <div class="box"> + <div class="box-body"> + <?php + $noidpp = 0; + $noantr = 0; + $namaklinik=""; + $noset=0; + foreach ($ip as $dat_pp){ + if($dat_pp->pp_panggil_anjungan!=null){ + $noset++; + if($noset==1){ + $noidpp=$dat_pp->pp_id; + $noantr=$dat_pp->pp_nomor_antrian; + $namaklinik=$dat_pp->mk_nama; + ?> + + <?php + } + } + ?> + <?php if($dat_pp->pp_panggil_anjungan!=null){ + if($noset==1){ + ?> + <div class="col-lg-1 col-xs-5"></div> + <div class="col-lg-10 col-xs-5"> + <div class="small-box <?php if($dat_pp->pp_panggil_anjungan==null){echo "bg-green";}elseif($noset==1){echo "bg-red";}else{ echo "bg-yellow";}?>"> + <h3 style="text-align: center;"><?php echo $dat_pp->mk_nama; if($dat_pp->mk_keterangan!=null){ echo " | ".$dat_pp->mk_keterangan;} ?></h3> + <a class="small-box-footer"> + <div class="inner"> + <h1 style="font-family: Arial Narrow; font-size:300px; font-weight: bold;"><?php if($dat_pp->pp_posisi_status==2){echo "<span style='text-decoration: line-through;'>$dat_pp->pp_nomor_antrian</span>";}else{ echo $dat_pp->pp_nomor_antrian;}?></h1> + </div> + </a> + </div> + </div> + <div class="col-lg-1 col-xs-5"></div> + <div class="col-lg-12"><br /><br /><br /><hr /></div> + <?php + }else{ + ?> + <div class="col-lg-3 col-xs-5"> + <div class="small-box <?php if($dat_pp->pp_panggil_anjungan==null){echo "bg-green";}elseif($noset==1){echo "bg-red";}else{ echo "bg-yellow";}?>"> + <a class="small-box-footer"> + <div class="inner"> + <h1 style="font-family: Arial Narrow; font-size:72px; font-weight: bold;"><?php if($dat_pp->pp_posisi_status==2){echo "<span style='text-decoration: line-through;'>$dat_pp->pp_nomor_antrian</span>";}else{ echo $dat_pp->pp_nomor_antrian;}?></h1> + </div> + </a> + </div> + </div> + <?php + + } + } + + }if($noset==0){echo "</br></br><h1 style='text-align: center;font-family: Arial Narrow; font-size:72px; font-weight: bold;'><code>Tunggu Panggilan Selanjutnya</code><h1>";} + ?> + <input type="hidden" id="idpp" value="<?php echo $noidpp;?>" /> + <input type="hidden" id="noantrian" value="<?php echo $noantr;?>" /> + <input type="hidden" id="namaklinik" value="<?php echo $namaklinik;?>" /> + </div> + </div> + </div> + </div> + </section> + <div class="control-sidebar-bg"></div> +</body> + +<script> + var url="<?php echo base_url();?>"; + function panggilload(){ + var idpp = document.getElementById('idpp').value; + var kode = document.getElementById('noantrian').value; + var namakl = document.getElementById('namaklinik').value; + + if(idpp!=0){ + var pecah = kode.split("",-2); + var hasil = ""; + for (i=0;i<6;i++){ + if(i<=1){ + hasil = hasil+" "+pecah[i]+" . "; + }else{ + hasil = hasil+" "+pecah[i]+", "; + } + } + + responsiveVoice.speak( + "Antrian "+namakl+". "+hasil+". Sekali Lagi, Antrian "+namakl+". "+hasil, + "Indonesian Female", + { + pitch: 1, + //rate: 0.8, + rate: 1, + volume: 1 + } + ); + } + } + + setTimeout(function(){ + var idpp = document.getElementById('idpp').value; + if(idpp!=0){ + window.location = url+"index.php/ps_anjungan/panggil_anjungan_null/"+idpp; + }else{ + window.location.reload(1); + } + }, 16000); +</script> +<script src="https://code.responsivevoice.org/responsivevoice.js?key=rTw3TbhF"></script> + +<!-- +<body onload="panggilload()" class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h1 style="text-align: center;"><b>Antrian Pendaftaran - <code>NOMOR YANG TERTERA DI LAYAR SILAHKAN MENUJU KE PETUGAS BARCODE</code></b></h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php/"><i class="fa fa-backward"></i> Kembali</a></li> + </ol> + </section> + <section class="content"> + <div class="row"> + <div class=" col-xs-12"> + <div class="box"> + <div class="box-body"> + <?php + $noidpp = 0; + $noantr = 0; + $namaklinik=""; + $noset=0; + foreach ($ip as $dat_pp){ + if($dat_pp->pp_panggil_anjungan!=null){$noset++; + if($noset==1){ + $noidpp=$dat_pp->pp_id; + $noantr=$dat_pp->pp_nomor_antrian; + $namaklinik=$dat_pp->mk_nama; + ?> + + <?php + } + } + ?> + <?php if($dat_pp->pp_panggil_anjungan!=null){ + + ?> + <div class="col-lg-3 col-xs-2"> + <div class="small-box <?php if($dat_pp->pp_panggil_anjungan==null){echo "bg-green";}elseif($noset==1){echo "bg-red";}else{ echo "bg-yellow";}?>"> + <a class="small-box-footer"> + <div class="inner"> + <h1 style="font-family: Arial Narrow; font-size:72px; font-weight: bold;"><?php if($dat_pp->pp_posisi_status==2){echo "<span style='text-decoration: line-through;'>$dat_pp->pp_nomor_antrian</span>";}else{ echo $dat_pp->pp_nomor_antrian;}?></h1> + </div> + </a> + </div> + </div> + <?php + } + + } + ?> + <input type="hidden" id="idpp" value="<?php echo $noidpp;?>" /> + <input type="hidden" id="noantrian" value="<?php echo $noantr;?>" /> + <input type="hidden" id="namaklinik" value="<?php echo $namaklinik;?>" /> + </div> + </div> + </div> + </div> + </section> + <div class="control-sidebar-bg"></div> +</body> + +<script> + var url="<?php echo base_url();?>"; + function panggilload(){ + var idpp = document.getElementById('idpp').value; + var kode = document.getElementById('noantrian').value; + var namakl = document.getElementById('namaklinik').value; + + if(idpp!=0){ + var pecah = kode.split("",-2); + var hasil = ""; + for (i=0;i<6;i++){ + if(i<=1){ + hasil = hasil+" "+pecah[i]+" . "; + }else{ + hasil = hasil+" "+pecah[i]+", "; + } + } + + responsiveVoice.speak( + "Antrian "+namakl+". "+hasil+". Sekali Lagi, Antrian "+namakl+". "+hasil, + "Indonesian Female", + { + pitch: 1, + rate: 0.8, + volume: 1 + } + ); + } + } + + setTimeout(function(){ + var idpp = document.getElementById('idpp').value; + if(idpp!=0){ + window.location = url+"index.php/ps_anjungan/panggil_anjungan_null/"+idpp; + }else{ + window.location.reload(1); + } + }, 15000); +</script> +<script src="https://code.responsivevoice.org/responsivevoice.js?key=VZgeKlw3"></script> +--> \ No newline at end of file diff --git a/application/views/anjungan/v_info_anjungan2.php b/application/views/anjungan/v_info_anjungan2.php new file mode 100644 index 0000000..02bddd3 --- /dev/null +++ b/application/views/anjungan/v_info_anjungan2.php @@ -0,0 +1,105 @@ +<body class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <!--h1 style="text-align: center;"><b>List Antrian Pendaftaran Yang Dipanggil - <code>Silahkan Menuju Ke Petugas Barcode </code></b></h1--> + <h1 style="text-align: center;"><b>LOKET 1 SETELAH AMBIL NOMOR ANTRIAN SILAHKAN MENUJU PENDAFTARAN DI LOKET LANTAI 2</b></h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php/"><i class="fa fa-backward"></i> Kembali</a></li> + </ol> + </section> + <!-- Main content --> + <section class="content"> + <div class="row"> + <table class="table table-striped"> + + <?php + $setklinik=""; $tabsatu=""; $tabdua=""; + $no=0; $sethr=0; + foreach ($ml as $dat_ml){ + $no++; + switch($no){ + case '1':$color = "green";break; + case '2':$color = "red";break; + case '3':$color = "yellow";break; + case '4':$color = "blue";break; + case '5':$color = "navy";break; + case '6':$color = "teal";break; + case '7':$color = "purple";break; + case '8':$color = "orange";break; + case '9':$color = "maroon";break; + case '10':$color = "gray";break; + case '11':$color = "black";break; + case '12':$color = "info";break; + case '13':$color = "red";break; + case '14':$color = "yellow";break; + default: $color = "green";break; + } + + $datapp=""; + $pecahpelayanan = explode(",",$dat_ml->ml_pelayanan); + $jumlayanan = count($pecahpelayanan); + + $numrow=0; + $baris=0; + $isi=1; + + foreach ($ip as $dat_pp){ + for ($x = 0; $x < $jumlayanan; $x++){ + if($pecahpelayanan[$x]==$dat_pp->pp_klinik_id){ + if($dat_pp->pp_pembayaran==$dat_ml->ml_pembayaran){ + $numrow++;$baris++; + if($isi<=18){ + if($baris==3){ + $baris=0; + $datapp=$datapp."<td style='text-align: center;' class='bg-$color'><div class='small-box'><h3>".$dat_pp->pp_nomor_antrian."</h3></div></td></tr>"; + $isi++; + } + elseif($baris==2){ + $datapp=$datapp."<td style='text-align: center;' class='bg-$color'><div class='small-box'><h3>".$dat_pp->pp_nomor_antrian."</h3></div></td>"; + $isi++; + }else{ + $datapp=$datapp."<tr><td style='text-align: center;' class='bg-$color'><div class='small-box'><h3>".$dat_pp->pp_nomor_antrian."</h3></div></td>"; + $isi++; + } + } + } + } + } + } + if($numrow!=0 ){$sethr++; + if($sethr<=7){ + if($sethr<=4){ + $tabsatu = $tabsatu."<td><table class='table table-striped'><tr><td colspan='3' style='text-align: center;' class='bg-$color'><div class='small-box'><h3>$dat_ml->ml_nama</h3></div></td></tr>$datapp</table></td>"; + }else{ + $tabdua = $tabdua."<td><table class='table table-striped'><tr><td colspan='3' style='text-align: center;' class='bg-$color'><div class='small-box'><h3>$dat_ml->ml_nama</h3></div></td></tr>$datapp</table></td>"; + } + //$tabsatu = $tabsatu."<td><table class='table table-striped'><tr><td colspan='3' style='text-align: center;' class='bg-$color'><div class='small-box'><h3>$dat_ml->ml_nama</h3></div></td></tr>$datapp</table></td>"; + }else{ + //$tabdua = $tabdua."<td><table class='table table-striped'><tr><td colspan='3' style='text-align: center;' class='bg-$color'><div class='small-box'><h3>$dat_ml->ml_nama</h3></div></td></tr>$datapp</table></td>"; + } + + } + } + ?> + <tr> + <td><?php echo $tabsatu;?></td> + </tr> + <tr> + <td><?php echo $tabdua;?></td> + </tr> + </table> + <marquee bgcolor="black"> + <h1 style="color: white;"><b>NOMOR ANTRIAN YANG TERTERA PADA LAYAR HARAP MENUJU KE PETUGAS BARCODE YANG ADA DI PINTU MASUK LOBBY</b></h1> + </marquee> + </div> + </section> + <div class="control-sidebar-bg"></div> +</body> + +<script> + var url="<?php echo base_url();?>"; + + setTimeout(function(){ + window.location.reload(1); + + }, 53000); +</script> \ No newline at end of file diff --git a/application/views/anjungan/v_info_anjungan3.php b/application/views/anjungan/v_info_anjungan3.php new file mode 100644 index 0000000..b758b9f --- /dev/null +++ b/application/views/anjungan/v_info_anjungan3.php @@ -0,0 +1,105 @@ +<body class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <!--h1 style="text-align: center;"><b>List Antrian Pendaftaran Yang Dipanggil - <code>Silahkan Menuju Ke Petugas Barcode </code></b></h1--> + <h1 style="text-align: center;"><b>LOKET 1 SETELAH AMBIL NOMOR ANTRIAN SILAHKAN MENUJU PENDAFTARAN DI LOKET LANTAI 2</b></h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php/"><i class="fa fa-backward"></i> Kembali</a></li> + </ol> + </section> + <!-- Main content --> + <section class="content"> + <div class="row"> + <table class="table table-striped"> + + <?php + $setklinik=""; $tabsatu=""; $tabdua=""; + $no=0; $sethr=0; + foreach ($ml as $dat_ml){ + $no++; + switch($no){ + case '1':$color = "green";break; + case '2':$color = "red";break; + case '3':$color = "yellow";break; + case '4':$color = "blue";break; + case '5':$color = "navy";break; + case '6':$color = "teal";break; + case '7':$color = "purple";break; + case '8':$color = "orange";break; + case '9':$color = "maroon";break; + case '10':$color = "gray";break; + case '11':$color = "black";break; + case '12':$color = "info";break; + case '13':$color = "red";break; + case '14':$color = "yellow";break; + default: $color = "green";break; + } + + $datapp=""; + $pecahpelayanan = explode(",",$dat_ml->ml_pelayanan); + $jumlayanan = count($pecahpelayanan); + + $numrow=0; + $baris=0; + $isi=1; + + foreach ($ip as $dat_pp){ + for ($x = 0; $x < $jumlayanan; $x++){ + if($pecahpelayanan[$x]==$dat_pp->pp_klinik_id){ + if($dat_pp->pp_pembayaran==$dat_ml->ml_pembayaran){ + $numrow++;$baris++; + if($isi<=18){ + if($baris==3){ + $baris=0; + $datapp=$datapp."<td style='text-align: center;' class='bg-$color'><div class='small-box'><h3>".$dat_pp->pp_nomor_antrian."</h3></div></td></tr>"; + $isi++; + } + elseif($baris==2){ + $datapp=$datapp."<td style='text-align: center;' class='bg-$color'><div class='small-box'><h3>".$dat_pp->pp_nomor_antrian."</h3></div></td>"; + $isi++; + }else{ + $datapp=$datapp."<tr><td style='text-align: center;' class='bg-$color'><div class='small-box'><h3>".$dat_pp->pp_nomor_antrian."</h3></div></td>"; + $isi++; + } + } + } + } + } + } + if($numrow!=0 ){$sethr++; + if($sethr<=7){ + //$tabsatu = $tabsatu."<td><table class='table table-striped'><tr><td colspan='3' style='text-align: center;' class='bg-$color'><div class='small-box'><h3>$dat_ml->ml_nama</h3></div></td></tr>$datapp</table></td>"; + }else{ + //$tabdua = $tabdua."<td><table class='table table-striped'><tr><td colspan='3' style='text-align: center;' class='bg-$color'><div class='small-box'><h3>$dat_ml->ml_nama</h3></div></td></tr>$datapp</table></td>"; + if($sethr<=11){ + $tabsatu = $tabsatu."<td><table class='table table-striped'><tr><td colspan='3' style='text-align: center;' class='bg-$color'><div class='small-box'><h3>$dat_ml->ml_nama</h3></div></td></tr>$datapp</table></td>"; + }else{ + $tabdua = $tabdua."<td><table class='table table-striped'><tr><td colspan='3' style='text-align: center;' class='bg-$color'><div class='small-box'><h3>$dat_ml->ml_nama</h3></div></td></tr>$datapp</table></td>"; + } + } + + } + } + ?> + <tr> + <td><?php echo $tabsatu;?></td> + </tr> + <tr> + <td><?php echo $tabdua;?></td> + </tr> + </table> + <marquee bgcolor="black"> + <h1 style="color: white;"><b>NOMOR ANTRIAN YANG TERTERA PADA LAYAR HARAP MENUJU KE PETUGAS BARCODE YANG ADA DI PINTU MASUK LOBBY</b></h1> + </marquee> + </div> + </section> + <div class="control-sidebar-bg"></div> +</body> + +<script> + var url="<?php echo base_url();?>"; + + setTimeout(function(){ + window.location.reload(1); + + }, 53000); +</script> \ No newline at end of file diff --git a/application/views/anjungan/v_info_klinik.php b/application/views/anjungan/v_info_klinik.php new file mode 100644 index 0000000..ef1685c --- /dev/null +++ b/application/views/anjungan/v_info_klinik.php @@ -0,0 +1,95 @@ +<?php + $idpp = 0; + $noantrian = ""; + $loket = ""; + foreach ($pg as $dat_pg){ + //echo $dat_pg->pp_panggil."<br/>"; + $idpp =$dat_pg->pp_id; + $noantrian =$dat_pg->pp_nomor_antrian; + $loket =$dat_pg->pp_panggil_loket; + } + ?> + <input type="hidden" id="idpp" value="<?php echo $idpp;?>" /> + <input type="hidden" id="noantrian" value="<?php echo $noantrian;?>" /> + <input type="hidden" id="loket" value="<?php echo $loket;?>" /> + +<body onload="panggilload()" class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h1>Antrian Klinik<small>Diharapkan Menunggu No Antrian | Contoh : KLXX 999 | KLXX (Kode Klinik) 999 (No. Antrian)</small></h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php/"><i class="fa fa-backward"></i> Kembali</a></li> + </ol> + </section> + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class=" col-xs-12"> + <div class="box"> + <div class="box-body"> + <?php + $nomor = 0; + foreach ($ip as $dat_pp){ + $nomor++; + if($nomor<=20){ + ?> + <div class="col-lg-3 col-xs-2"> + <div class="small-box bg-green"> + <a class="small-box-footer"> + <div class="inner"> + <h1 style="font-family: Arial Narrow; font-size:72px; font-weight: bold; "><?php echo $dat_pp->pp_nomor_antrian_klinik;?></h1> + </div> + </a> + </div> + </div> + <?php + } + } + ?> + </div> + </div> + </div> + </div> + </section> + <div class="control-sidebar-bg"></div> +</body> + +<script type="text/javascript"> + var url="<?php echo base_url();?>"; + function panggilload(){ + var idpp = document.getElementById('idpp').value; + var kode = document.getElementById('noantrian').value; + var loket = document.getElementById('loket').value; + + if(idpp!=0){ + var pecah = kode.split("",-2); + var hasil = ""; + for (i=0;i<6;i++){ + if(i<=1){ + hasil = hasil+" "+pecah[i]+" . "; + }else{ + hasil = hasil+" "+pecah[i]+", "; + } + } + + responsiveVoice.speak( + "Nomor Antrian. "+hasil+" , ke "+loket+". Sekali lagi. Nomor Antrian. "+hasil+" , ke "+loket, + "Indonesian Female", + { + pitch: 1, + rate: 0.8, + volume: 1 + } + ); + } + } + + setTimeout(function(){ + var idpp = document.getElementById('idpp').value; + if(idpp!=0){ + window.location = url+"index.php/ps_anjungan/panggil_admin_null/"+idpp; + }else{ + window.location.reload(1); + } + }, 17000); +</script> +<script src="https://code.responsivevoice.org/responsivevoice.js?key=VZgeKlw3"></script> \ No newline at end of file diff --git a/application/views/fasttrack/v_fasttrack.php b/application/views/fasttrack/v_fasttrack.php new file mode 100644 index 0000000..eaa12b9 --- /dev/null +++ b/application/views/fasttrack/v_fasttrack.php @@ -0,0 +1,234 @@ +<body class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h1> + <small></small> + </h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li class="active"><?php echo $title ?></li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title"><?php echo $title ?></h3> + </div><!-- /.box-header --> + <div class="box-body"> + <?php if(validation_errors()){ ?> + <div class="alert alert-danger alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4><i class="icon fa fa-ban"></i> Alert!</h4> + <?php echo validation_errors() ?> + </div> + <?php } ?> + + <?php if($this->session->flashdata('message')){?> + <div class="alert alert-success alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-check"></i> Alert!</h4> + <?php echo $this->session->flashdata('message');?> + </div> + <?php }?> + <div class="box-body table-responsive no-padding"> + <table id="example1" class="table table-bordered table-striped"> + <thead> + <tr> + <th width="5%">No</th> + <th>Barcode</th> + <th>Tanggal / Jam Daftar</th> + <th>No Antrian</th> + <th>RM</th> + <th>Shift</th> + <th>Klinik</th> + <th>PJ</th> + <th>Keterangan</th> + <th>Pembayaran</th> + <th width="20%">Status</th> + <th width="8%">Aksi</th> + </tr> + </thead> + <tbody> + <?php + $no=0; $pj=""; $np=""; $ket=""; $color=""; + foreach ($fs as $fasttrack) { + $no++; + //---------------------start check access action-------------------// + $editbutton=""; + $edithakakses=""; + $viewbutton=""; + $setdisabled=""; + $status=""; + $rekamedik=""; + $pembayaran=""; + + if(isset($fasttrack->pp_fasttrack)){ + $pecahdata=explode("|",$fasttrack->pp_fasttrack); + $pj=$pecahdata[0]; + $np=$pecahdata[1]; + $ket=$pecahdata[2]; + $color= "style='background-color: #FFB6C1;'"; + } + + if($fasttrack->pp_status==null){$status=0;}else{$status=$fasttrack->pp_status;} + if($fasttrack->pp_rekamedik==null){$rekamedik=0;}else{$rekamedik=$fasttrack->pp_rekamedik;} + + if(!empty($this->varedit)){ + if($fasttrack->prt_status<6){ + if($fasttrack->pp_fasttrack!=null){ + $editbutton=" <a href='#' onclick='fasttrack($fasttrack->pp_id,$status,$rekamedik)' class='btn btn-warning btn-xs' data-toggle='modal' data-target='#fasttrack'>Edit</a>"; + } + else{ + $editbutton=" <a href='#' onclick='fasttrack($fasttrack->pp_id,$status,$rekamedik)' class='btn btn-primary btn-xs' data-toggle='modal' data-target='#fasttrack'>Fast Track</a>"; + } + } + + }else{$setdisabled='disabled';} + if(!empty($this->varview)){ + if($fasttrack->pp_fasttrack!=null){$viewbutton=" <a href='#' onclick='viewfasttrack($fasttrack->pp_id,$rekamedik)' class='btn btn-primary btn-xs' data-toggle='modal' data-target='#fasttrack'>View</a>";} + } + $date=date_create($fasttrack->pp_tanggal_datang); + //---------------------end check access action-------------------// + + switch($fasttrack->prt_status){ + case '0':$statusnya = "<p class='text-blue' > Proses Barcode </p>";break; + case '1':$statusnya = "<p class='text-aqua' > Tunggu Daftar </p>";break; + case '2':$statusnya = "<p class='text-blue' > Proses Daftar </p>";break; + case '3':$statusnya = "<p class='text-red' > Pending Daftar </p>";break; + case '4':$statusnya = "<p class='text-aqua' > Tunggu Klinik </p>";break; + case '5':$statusnya = "<p class='text-yellow' > Panggil Klinik </p>";break; + case '6':$statusnya = "<p class='text-aqua' > Tunggu Proses Klinik </p>";break; + case '7':$statusnya = "<p class='text-blue' > Proses Klinik </p>";break; + case '8':$statusnya = "<p class='text-red' > Pending Klinik </p>";break; + case '9':$statusnya = "<p class='text-green' > Selesai </p>";break; + + default:$statusnya = "Anjungan";break; + } + + if($fasttrack->pp_pembayaran=="1"){$pembayaran= "UMUM";} + if($fasttrack->pp_pembayaran=="2"){$pembayaran= "JKN";} + if($fasttrack->pp_pembayaran=="3"){$pembayaran= "LAINNYA";} + + echo(" + <input hidden='' id='pj$fasttrack->pp_id' name='pj$fasttrack->pp_id' value='$pj' /> + <input hidden='' id='np$fasttrack->pp_id' name='np$fasttrack->pp_id' value='$np' /> + <input hidden='' id='ket$fasttrack->pp_id' name='ket$fasttrack->pp_id' value='$ket' /> + <tr $color> + <td>".$no."</td> + <td>".$fasttrack->pp_barcode."</td> + <td>".date_format($date,'d-m-Y / H:i')."</td> + <td>".$fasttrack->pp_nomor_antrian."</td> + <td>".$fasttrack->pp_rekamedik."</td> + <td>Shift ".$fasttrack->pp_shift."</td> + <td>".$fasttrack->mk_nama."</td> + <td>".$pj."</td> + <td>".$ket."</td> + <td>".$pembayaran."</td> + <td>".$statusnya."</td> + <td>".$viewbutton.$editbutton."</td> + </tr> + ");$pj=""; $np=""; $ket=""; $color=""; + } + ?> + </tbody> + </table> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + </section> + <div class="control-sidebar-bg"></div> +</body> +<script> + function fasttrack(id,status,rm){ + if(rm==0){rm="";} + document.getElementById('idpengunjung').value=id; + document.getElementById('ppstatus').value=status; + document.getElementById('norek').value=rm; + document.getElementById('tbnsubmit').style.visibility = 'visible'; + document.getElementById('penanggungjawab').value=document.getElementById('pj'+id).value; + document.getElementById('namapas').value=document.getElementById('np'+id).value; + document.getElementById('ket').value=document.getElementById('ket'+id).value; + + document.getElementById("penanggungjawab").disabled = false; + document.getElementById("norek").disabled = false; + document.getElementById("namapas").disabled = false; + document.getElementById("ket").disabled = false; + } + + function viewfasttrack(id,rm){ + document.getElementById('idpengunjung').value=id; + document.getElementById('norek').value=rm; + document.getElementById('tbnsubmit').style.visibility = 'hidden'; + document.getElementById('penanggungjawab').value=document.getElementById('pj'+id).value; + document.getElementById('namapas').value=document.getElementById('np'+id).value; + document.getElementById('ket').value=document.getElementById('ket'+id).value; + + document.getElementById("penanggungjawab").disabled = true; + document.getElementById("norek").disabled = true; + document.getElementById("namapas").disabled = true; + document.getElementById("ket").disabled = true; + } + +</script> + +<div class="modal fade" id="fasttrack" tabindex="-1" role="dialog" aria-labelledby="largeModal" aria-hidden="true"> + <form class="form-horizontal" id="form_online" action="<?php echo(base_url()); ?>index.php/ps_fasttrack/set_fasttrack" method="post" autocomplete="off"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button> + <h3 class="modal-title" id="myModalLabel">Form Fast Track</h3> + </div> + <div class="modal-body"> + <input type="hidden" id="idpengunjung" name="idpengunjung" value="" /> + <input type="hidden" id="ppstatus" name="ppstatus" value="" /> + <div class="form-group"> + <label for="penanggungjawab" class="col-sm-4 control-label">Penanggung Jawab</label> + <div class="col-sm-7"> + <input <?php echo $setdisabled;?> type="text" id="penanggungjawab" name="penanggungjawab" value="" class="form-control select" onkeyup="this.value = this.value.toUpperCase()"/> + </div> + </div> + <div class="form-group"> + <label for="norek" class="col-sm-4 control-label">No Rekamedik</label> + <div class="col-sm-7"> + <input <?php echo $setdisabled;?> type="number" id="norek" name="norek" value="" class="form-control select" /> + </div> + </div> + <div class="form-group"> + <label for="namapas" class="col-sm-4 control-label">Nama Pasien</label> + <div class="col-sm-7"> + <input <?php echo $setdisabled;?> type="text" id="namapas" name="namapas" value="" class="form-control select" onkeyup="this.value = this.value.toUpperCase()"/> + </div> + </div> + <div class="form-group"> + <label for="ket" class="col-sm-4 control-label">Alasan Fast Track</label> + <div class="col-sm-7"> + <textarea <?php echo $setdisabled;?> class="form-control select" id="ket" name="ket" onkeyup="this.value = this.value.toUpperCase()" ></textarea> + </div> + </div> + </div> + <div class="modal-footer"> + <button class="btn btn-success" id="tbnsubmit" type="submit"> Simpan </button> + <button class="btn" data-dismiss="modal" aria-hidden="true">Tutup</button> + </div> + </div> + </div> + </form> +</div> + +<script type="text/javascript"> +// var url="<?php echo base_url();?>"; +// function del(id){ +// var isi=document.getElementById('isi'+id).value; +// var r=confirm("Apakah anda ingin menghapus klinik "+isi+"?") +// if (r==true) +// window.location = url+"index.php/ps_klinik/delete/"+id; +// else +// return false; +// } +</script> \ No newline at end of file diff --git a/application/views/home/v_home.php b/application/views/home/v_home.php new file mode 100644 index 0000000..54737e0 --- /dev/null +++ b/application/views/home/v_home.php @@ -0,0 +1,146 @@ +<link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/morris/morris.css"> + +<section class="content-header"> + <h1> + Dashboard + <small><?php echo date('d, D M Y');?></small> + </h1> + <ol class="breadcrumb"> + <li class="active"><a href="#"><i class="fa fa-home"></i> Home</a></li> + </ol> +</section> +<?php + $jumall=0; + $jumoff=0; + $jumon=0; + foreach ($lp as $listpasien) { + $jumall++; + if($listpasien->pp_pendaftaran_online!=null){ + $jumon++; + }else{ + $jumoff++; + } + + } + $on[]=0; + $off[]=0; + $bulantahun[]=""; + + for ($x = 0; $x <= 8; $x++) { + $tglend= date('Y-m', strtotime('-'.$x.'month', strtotime( date("Y-m") ))); + + $this->db->like('pp_tanggal_periksa', $tglend , 'after'); + $this->db->where('pp_pendaftaran_online is NOT NULL'); + $query = $this->db->get('proses_pengunjung'); + echo "<input hidden='' id='online$x' value='$query->num_rows' /> "; + + $tglend= date('Y-m', strtotime('-'.$x.' month', strtotime( date("Y-m") ))); + $this->db->like('pp_tanggal_periksa', $tglend , 'after'); + $this->db->where('pp_pendaftaran_online is NULL'); + $query = $this->db->get('proses_pengunjung'); + echo "<input hidden='' id='offline$x' value='$query->num_rows' /> "; + + echo "<input hidden='' id='bulantahun$x' value='$tglend' /> "; + + } + //echo count($bulantahun); + //echo $on[0]." | ".$off[0]; +?> +<input hidden="" id="online" value="" /> + +<section class="content"> + <div class="row"> + <div class="col-lg-4 col-xs-6"> + <!-- small box --> + <div class="small-box bg-aqua"> + <div class="inner"> + <h3><?php echo $jumall;?></h3> + <p>Jumlah Pengunjung</p> + </div> + <div class="icon"> + <i class="fa fa-users"></i> + </div> + </div> + </div><!-- ./col --> + <div class="col-lg-4 col-xs-6"> + <!-- small box --> + <div class="small-box bg-green"> + <div class="inner"> + <h3><?php echo $jumoff;?></h3> + <p>Pendaftar OFFLINE</p> + </div> + <div class="icon"> + <i class="fa fa-wheelchair"></i> + </div> + </div> + </div><!-- ./col --> + <div class="col-lg-4 col-xs-6"> + <!-- small box --> + <div class="small-box bg-yellow"> + <div class="inner"> + <h3><?php echo $jumon;?></h3> + <p>Pendaftar ONLINE</p> + </div> + <div class="icon"> + <i class="fa fa-mobile-phone"></i> + </div> + </div> + </div><!-- ./col --> + </div><!-- /.row --> + +<div class="row"> + <div class="col-md-12"> + <!-- AREA CHART --> + <div class="box box-primary"> + <div class="box-header with-border"> + <h3 class="box-title">Data Pengunjung Bulan <code><?php echo date('M Y', strtotime('-8month', strtotime( date("M Y") ))); ?></code> S/D <code><?php echo date('M Y'); ?></code> </h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + </div> + </div> + <div class="box-body chart-responsive"> + <div class="chart" id="revenue-chart" style="height: 300px;"></div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> +</div> +</section> +<script src="<?php echo base_url();?>/theme/bootstrap/plugins/jQuery/jQuery-2.1.4.min.js"></script> +<script src="<?php echo base_url();?>/theme/bootstrap/plugins/chartjs/Chart.min.js"></script> + +<!-- Morris.js charts --> +<script src="<?php echo base_url();?>assets/raphael-min.js"></script> +<script src="<?php echo base_url();?>theme/bootstrap/plugins/morris/morris.min.js"></script> + + +<script> + $(function () { + "use strict"; + + // AREA CHART + var area = new Morris.Area({ + element: 'revenue-chart', + resize: true, + data: [ + {y: document.getElementById("bulantahun0").value, item1: document.getElementById("online0").value, item2: document.getElementById("offline0").value}, + {y: document.getElementById("bulantahun1").value, item1: document.getElementById("online1").value, item2: document.getElementById("offline1").value}, + {y: document.getElementById("bulantahun2").value, item1: document.getElementById("online2").value, item2: document.getElementById("offline2").value}, + {y: document.getElementById("bulantahun3").value, item1: document.getElementById("online3").value, item2: document.getElementById("offline3").value}, + {y: document.getElementById("bulantahun4").value, item1: document.getElementById("online4").value, item2: document.getElementById("offline4").value}, + {y: document.getElementById("bulantahun5").value, item1: document.getElementById("online5").value, item2: document.getElementById("offline5").value}, + {y: document.getElementById("bulantahun6").value, item1: document.getElementById("online6").value, item2: document.getElementById("offline6").value}, + {y: document.getElementById("bulantahun7").value, item1: document.getElementById("online7").value, item2: document.getElementById("offline7").value}, + {y: document.getElementById("bulantahun8").value, item1: document.getElementById("online8").value, item2: document.getElementById("offline8").value} + ], + xkey: 'y', + ykeys: ['item1', 'item2'], + labels: ['Online', 'Offline'], + lineColors: ['#FF7400', '#48B25D'], + hideHover: 'auto' + }); + + }); + </script> + + + \ No newline at end of file diff --git a/application/views/includes/header.php b/application/views/includes/header.php new file mode 100644 index 0000000..ce63c5f --- /dev/null +++ b/application/views/includes/header.php @@ -0,0 +1,58 @@ +<?php + $tipeuserText="Admin"; + + $iduser=$this->session->userdata('s_ID_User'); + $foto=""; + $namalengkap=""; + + $data = $this->db->query("select * from master_user inner join master_tipeuser on master_user.mu_tipeuser_id = master_tipeuser.mt_id where mu_id='$iduser'")->result(); + foreach($data as $dat){ + if($dat->mu_nama_user){ + $namalengkap=$dat->mu_nama_lengkap; + $tipeuserText=$dat->mt_nama; + }else{ + $namalengkap="-"; + $tipeuserText="-"; + } + + $foto="admin.png"; + + } +?> +<header class="main-header"> + <a href="#" class="logo"> + <span class="logo-mini"><b>R</b>SSA</span> + <span class="logo-lg"><b>Antrean </b>RSSA</span> + </a> + <nav class="navbar navbar-static-top" role="navigation"> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="<?php echo base_url(); ?>img/<?php echo $foto;?>" class="user-image" alt="User Image"> + <span class="hidden-xs"><?php echo $namalengkap;?></span> + </a> + <ul class="dropdown-menu"> + <li class="user-header"> + <img src="<?php echo base_url(); ?>img/<?php echo $foto;?>" class="img-circle" alt="User Image"> + <p> + <?php echo $namalengkap;?> - <?php echo $tipeuserText;?> + </p> + </li> + <li class="user-footer"> + <div class="pull-right"> + <a href="<?php echo base_url();?>index.php/login/logout" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <li> + <a href="<?php echo base_url();?>assets/Manual Book 01.pdf" target="_blank"><i class="fa fa-book"></i></a> + </li> + </ul> + </div> + </nav> +</header> \ No newline at end of file diff --git a/application/views/includes/sidebar.php b/application/views/includes/sidebar.php new file mode 100644 index 0000000..4a6e6ec --- /dev/null +++ b/application/views/includes/sidebar.php @@ -0,0 +1,93 @@ +<aside class="main-sidebar"> + <section class="sidebar"> + + <ul class="sidebar-menu"> + <li class="header">MENU</li> +<!-- MENU --> + <?php + $linknow=$this->uri->segment(1, 0); + $linkseg1=$this->uri->segment(1); + $linkseg2=$this->uri->segment(2); + $linkseg3=$linkseg1."/".$linkseg2; + //echo $linkseg3; + $TU = $this->session->userdata('s_FK_TipeUser'); + //$UM = $this->db->query("select * from master_user_menu INNER JOIN master_menu ON mm_id = mum_menu_id where mum_tipeuser_id='$TU' order by 'mm_urutan' asc")->result(); + + $this->db->join('master_menu', 'mm_id = mum_menu_id'); + $this->db->order_by('mm_urutan', 'asc'); + $this->db->where('mum_tipeuser_id', $TU); + $this->db->where('mm_aktif', "1"); + $UM = $this->db->get('master_user_menu'); + //return $UM->result(); + + foreach($UM->result() as $usermenu){ + $menudata1 = $this->db->query("select * from master_menu where mm_id=$usermenu->mum_menu_id and mm_level=1 and mm_aktif=1 order by mm_urutan asc")->result(); + foreach($menudata1 as $menuD){ + if($menuD->mm_link!='#'){ + + //--------------------------start cek posisi tidak memiliki parent-----------------// + $aktifBig=""; + if($linknow===$menuD->mm_link){ + $aktifBig="class='active'"; + } + //--------------------------end cek posisi tidak memiliki parent-------------------// + + ?> + <li <?php echo $aktifBig;?> > + <a href="<?php echo base_url();?>index.php/<?php echo $menuD->mm_link;?>"> + <i class="<?php echo $menuD->mm_icon;?>"></i> <span><?php echo $menuD->mm_nama;?> + </a> + </li> + <?php + }else{ + + //--------------------------start cek posisi jika memiliki parent-----------------// + $aktifTreeView=""; + $linkcekParent=$this->db->query("SELECT * FROM master_menu WHERE mm_link='$linknow' order by mm_urutan asc")->result(); + foreach($linkcekParent as $cekthis){ + $linkcekParent2=$this->db->query("SELECT * FROM master_menu WHERE mm_id='$cekthis->mm_parent' order by mm_urutan asc")->result(); + foreach($linkcekParent2 as $cekthis2){ + if($cekthis2->mm_nama==$menuD->mm_nama){ + $aktifTreeView="active"; + } + } + } + //--------------------------end cek posisi jika memiliki parent-------------------// + + ?> + <li class="treeview <?php echo $aktifTreeView;?>"> + <a href="#"> + <i class="<?php echo $menuD->mm_icon;?>"></i> <span><?php echo $menuD->mm_nama;?></span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <?php + $menudata2 = $this->db->query("SELECT * FROM master_user_menu INNER JOIN master_menu ON master_user_menu.mum_menu_id = master_menu.mm_id WHERE mm_parent=$menuD->mm_id AND mum_tipeuser_id=$TU and mm_aktif=1 order by mm_urutan asc")->result(); + foreach($menudata2 as $menuParent){ + + //--------------------------start cek posisi pada parent-----------------// + $aktifParent=""; + if($linknow===$menuParent->mm_link){ + if($linkseg2){}else{$aktifParent="class='active'";} + } + if($linkseg3===$menuParent->mm_link){ + $aktifParent="class='active'"; + } + //--------------------------end cek posisi pada parent-------------------// + + ?> + <li <?php echo $aktifParent;?>><a href="<?php echo base_url();?>index.php/<?php echo $menuParent->mm_link;?>"><i class="fa fa-caret-right"></i><?php echo $menuParent->mm_nama;?></a></li> + <?php + } + ?> + + </ul> + </li> + <?php + } + } + } + ?> +<!-- MENU --> + </ul> + </section> +</aside> \ No newline at end of file diff --git a/application/views/includes/template.php b/application/views/includes/template.php new file mode 100644 index 0000000..1fc238b --- /dev/null +++ b/application/views/includes/template.php @@ -0,0 +1,189 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"/> + <meta http-equiv="X-UA-Compatible" content="IE=edge"/> + <link rel="icon" type="image/png" href="<?php echo base_url();?>img/logo-rssa.png" /> + <title>Antrian RSSA</title> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/bootstrap/css/bootstrap.min.css"/> + + <!--link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"/--> + <!--link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"/--> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/font-awesome/css/font-awesome.min.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/font-awesome/css/font-awesome.css"/> + + <link rel="stylesheet" href="<?php echo base_url();?>/assets/ionicons.min.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/dist/css/AdminLTE.min.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/dist/css/skins/_all-skins.min.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/iCheck/flat/blue.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/jvectormap/jquery-jvectormap-1.2.2.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/datepicker/datepicker3.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/daterangepicker/daterangepicker-bs3.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/datatables/dataTables.bootstrap.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/select2/select2.min.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/dist/css/skins/_all-skins.min.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/iCheck/all.css"/> + + </head> + <body class="hold-transition sidebar-mini wysihtml5-supported skin-green-light"> + <div class="wrapper"> + <div class="row-fluid"> + <?php $this->load->view("includes/header"); ?> + </div> + <div id="main-container"> + <?php $this->load->view("includes/sidebar"); ?> + <div class="content-wrapper"> + <?php $this->load->view($main_content); ?> + </div> + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Antrean RSSA Ver.</b> 0.2 + </div> + <strong><a href="http://rsusaifulanwar.jatimprov.go.id">RSUD Dr. Saiful Anwar Malang</a></strong> | Jl. Jaksa Agung Suprapto No. 2 Malang | Telp : 0341- 362101 | Fax : 0341-369384 + </footer> + </div> + </div> + + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/jQuery/jQuery-2.1.4.min.js"></script> + + <!--script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script--> + <script src="<?php echo base_url();?>/assets/jquery-ui.min.js"></script> + <script>$.widget.bridge('uibutton', $.ui.button);</script> + + <script src="<?php echo base_url();?>/theme/bootstrap/bootstrap/js/bootstrap.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/sparkline/jquery.sparkline.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/jvectormap/jquery-jvectormap-1.2.2.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/jvectormap/jquery-jvectormap-world-mill-en.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/knob/jquery.knob.js"></script> + + <!--script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.2/moment.min.js"></script--> + <script src="<?php echo base_url();?>/assets/moment.min.js"></script> + + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/daterangepicker/daterangepicker.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/datepicker/bootstrap-datepicker.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/slimScroll/jquery.slimscroll.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/fastclick/fastclick.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/dist/js/app.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/dist/js/demo.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/datatables/jquery.dataTables.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/datatables/dataTables.bootstrap.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/select2/select2.full.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/input-mask/jquery.inputmask.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/input-mask/jquery.inputmask.date.extensions.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/input-mask/jquery.inputmask.extensions.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/slimScroll/jquery.slimscroll.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/fastclick/fastclick.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/dist/js/demo.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/iCheck/icheck.min.js"></script> + <script src="<?php echo base_url();?>/js/terbilang.js"></script> + <script src="<?php echo base_url();?>/js/terbilang.min.js"></script> + <script src="<?php echo base_url();?>/js/my.js"></script> + + <script> + $(function () { + $("#example1").DataTable(); + $("#example2").DataTable(); + $("#example3").DataTable(); + $("#example4").DataTable(); + $("#example5").DataTable(); + $("#example6").DataTable(); +// $('#example2').DataTable({ +// "paging" : true, +// "lengthChange" : false, +// "searching" : false, +// "ordering" : true, +// "info" : true, +// "autoWidth" : false +// }); + }); + </script> + <script> +// $(function () { +// $(".select2").select2(); +// $("#datemask").inputmask("dd/mm/yyyy", {"placeholder": "dd/mm/yyyy"}); +// $("#datemask2").inputmask("mm/dd/yyyy", {"placeholder": "mm/dd/yyyy"}); +// $("[data-mask]").inputmask(); +// +// $('input[type="checkbox"].minimal, input[type="radio"].minimal').iCheck({ +// checkboxClass: 'icheckbox_minimal-blue', +// radioClass: 'iradio_minimal-blue' +// }); +// +// $('input[type="checkbox"].minimal-red, input[type="radio"].minimal-red').iCheck({ +// checkboxClass: 'icheckbox_minimal-red', +// radioClass: 'iradio_minimal-red' +// }); +// +// $('input[type="checkbox"].flat-red, input[type="radio"].flat-red').iCheck({ +// checkboxClass: 'icheckbox_flat-green', +// radioClass: 'iradio_flat-green' +// }); +// }); + </script> + <script> + $(function () { + //Initialize Select2 Elements + $(".select2").select2(); + + //Datemask dd/mm/yyyy + $("#datemask").inputmask("dd/mm/yyyy", {"placeholder": "dd/mm/yyyy"}); + //Datemask2 mm/dd/yyyy + $("#datemask2").inputmask("mm/dd/yyyy", {"placeholder": "mm/dd/yyyy"}); + //Money Euro + $("[data-mask]").inputmask(); + + //Date range picker + $('#reservation').daterangepicker(); + //Date range picker with time picker + $('#reservationtime').daterangepicker({timePicker: true, timePickerIncrement: 30, format: 'MM/DD/YYYY h:mm A'}); + //Date range as a button + $('#daterange-btn').daterangepicker( + { + ranges: { + 'Today': [moment(), moment()], + 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], + 'Last 7 Days': [moment().subtract(6, 'days'), moment()], + 'Last 30 Days': [moment().subtract(29, 'days'), moment()], + 'This Month': [moment().startOf('month'), moment().endOf('month')], + 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')] + }, + startDate: moment().subtract(29, 'days'), + endDate: moment() + }, + function (start, end) { + $('#reportrange span').html(start.format('MMMM D, YYYY') + ' - ' + end.format('MMMM D, YYYY')); + } + ); + + //iCheck for checkbox and radio inputs + $('input[type="checkbox"].minimal, input[type="radio"].minimal').iCheck({ + checkboxClass: 'icheckbox_minimal-blue', + radioClass: 'iradio_minimal-blue' + }); + //Red color scheme for iCheck + $('input[type="checkbox"].minimal-red, input[type="radio"].minimal-red').iCheck({ + checkboxClass: 'icheckbox_minimal-red', + radioClass: 'iradio_minimal-red' + }); + //Flat red color scheme for iCheck + $('input[type="checkbox"].flat-red, input[type="radio"].flat-red').iCheck({ + checkboxClass: 'icheckbox_flat-green', + radioClass: 'iradio_flat-green' + }); + + //Colorpicker + //$(".my-colorpicker1").colorpicker(); + //color picker with addon + //$(".my-colorpicker2").colorpicker(); + + //Timepicker + //$(".timepicker").timepicker({ + // showInputs: false + //}); + }); + </script> + </body> +</html> \ No newline at end of file diff --git a/application/views/includes2/header.php b/application/views/includes2/header.php new file mode 100644 index 0000000..923c39f --- /dev/null +++ b/application/views/includes2/header.php @@ -0,0 +1,30 @@ +<?php + $tipeuserText="Admin"; + + $iduser=$this->session->userdata('s_ID_User'); + $foto=""; + $namalengkap=""; + + $data = $this->db->query("select * from master_user where mu_id='$iduser'")->result(); + foreach($data as $dat){ + if($dat->mu_nama_user){ + $namalengkap=$dat->mu_nama_lengkap; + }else{ + $namalengkap="-"; + } + + $foto="admin.png"; + + } +?> +<header class="main-header"> + <a href="#" class="logo"> + <span class="logo-mini"><b>R</b>SSA</span> + <span class="logo-lg"><b>Anjungan </b>RSSA</span> + </a> + <nav class="navbar navbar-static-top" role="navigation"> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + </a> + </nav> +</header> \ No newline at end of file diff --git a/application/views/includes2/sidebar.php b/application/views/includes2/sidebar.php new file mode 100644 index 0000000..63bb675 --- /dev/null +++ b/application/views/includes2/sidebar.php @@ -0,0 +1,28 @@ +<aside class="main-sidebar"> + <section class="sidebar"> + <ul class="sidebar-menu"> + <li class="header">MENU</li> + <li> + <a href="<?php echo base_url();?>index.php/ps_anjungan"> + <i class="fa fa-desktop"></i> <span>Anjungan</span> + </a> + </li> + <li> + <a href="<?php echo base_url();?>index.php/ps_anjungan/terlambat"> + <i class="fa fa-warning"></i> <span>List Terlambat</span> + </a> + </li> + <li> + <a href="<?php echo base_url();?>index.php/ps_anjungan/info_anjungan"> + <i class="fa fa-info-circle"></i> <span>Info Panggilan Anjungan</span> + </a> + </li> + <li> + <a href="<?php echo base_url();?>index.php/ps_anjungan/info_klinik"> + <i class="fa fa-ambulance"></i> <span>Info Panggilan Klinik</span> + </a> + </li> + </ul> + + </section> +</aside> \ No newline at end of file diff --git a/application/views/includes2/template.php b/application/views/includes2/template.php new file mode 100644 index 0000000..3fe912d --- /dev/null +++ b/application/views/includes2/template.php @@ -0,0 +1,182 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"/> + <meta http-equiv="X-UA-Compatible" content="IE=edge"/> + <link rel="icon" type="image/png" href="<?php echo base_url();?>img/logo-rssa.png" /> + <title>Anjungan RSSA Malang</title> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/bootstrap/css/bootstrap.min.css"/> + + <!--link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"/> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"/--> + + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/font-awesome/css/font-awesome.min.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/font-awesome/css/font-awesome.css"/> + + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/dist/css/AdminLTE.min.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/dist/css/skins/_all-skins.min.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/iCheck/flat/blue.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/jvectormap/jquery-jvectormap-1.2.2.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/datepicker/datepicker3.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/daterangepicker/daterangepicker-bs3.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/datatables/dataTables.bootstrap.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/select2/select2.min.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/dist/css/skins/_all-skins.min.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/iCheck/all.css"/> + + </head> + <body class="skin-black-light"> + + <div class="row-fluid"> + <?php $this->load->view("includes2/header"); ?> + </div> + <div id="main-container"> + <?php $this->load->view("includes2/sidebar"); ?> + <div class="content-wrapper"> + <?php $this->load->view($main_content); ?> + </div> + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>ITikom Antrian RSSA Ver.</b> 0.2 + </div> + <strong><a href="http://rsusaifulanwar.jatimprov.go.id">RSUD Dr. Saiful Anwar Malang</a></strong> | Jl. Jaksa Agung Suprapto No. 2 Malang | Telp : 0341- 362101 | Fax : 0341-369384 + </footer> + </div> + + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/jQuery/jQuery-2.1.4.min.js"></script> + + <!--script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script--> + <script src="<?php echo base_url();?>/assets/jquery-ui.min.js"></script> + <script>$.widget.bridge('uibutton', $.ui.button);</script> + + <script src="<?php echo base_url();?>/theme/bootstrap/bootstrap/js/bootstrap.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/sparkline/jquery.sparkline.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/jvectormap/jquery-jvectormap-1.2.2.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/jvectormap/jquery-jvectormap-world-mill-en.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/knob/jquery.knob.js"></script> + + <!--script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.2/moment.min.js"></script--> + <script src="<?php echo base_url();?>/assets/moment.min.js"></script> + + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/daterangepicker/daterangepicker.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/datepicker/bootstrap-datepicker.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/slimScroll/jquery.slimscroll.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/fastclick/fastclick.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/dist/js/app.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/dist/js/demo.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/datatables/jquery.dataTables.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/datatables/dataTables.bootstrap.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/select2/select2.full.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/input-mask/jquery.inputmask.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/input-mask/jquery.inputmask.date.extensions.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/input-mask/jquery.inputmask.extensions.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/slimScroll/jquery.slimscroll.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/fastclick/fastclick.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/dist/js/demo.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/iCheck/icheck.min.js"></script> + <script src="<?php echo base_url();?>/js/terbilang.js"></script> + <script src="<?php echo base_url();?>/js/terbilang.min.js"></script> + <script src="<?php echo base_url();?>/js/my.js"></script> + <script> + $(function () { + $("#example1").DataTable(); + $('#example2').DataTable({ + "paging" : true, + "lengthChange" : false, + "searching" : false, + "ordering" : true, + "info" : true, + "autoWidth" : false + }); + }); + </script> + <script> +// $(function () { +// $(".select2").select2(); +// $("#datemask").inputmask("dd/mm/yyyy", {"placeholder": "dd/mm/yyyy"}); +// $("#datemask2").inputmask("mm/dd/yyyy", {"placeholder": "mm/dd/yyyy"}); +// $("[data-mask]").inputmask(); +// +// $('input[type="checkbox"].minimal, input[type="radio"].minimal').iCheck({ +// checkboxClass: 'icheckbox_minimal-blue', +// radioClass: 'iradio_minimal-blue' +// }); +// +// $('input[type="checkbox"].minimal-red, input[type="radio"].minimal-red').iCheck({ +// checkboxClass: 'icheckbox_minimal-red', +// radioClass: 'iradio_minimal-red' +// }); +// +// $('input[type="checkbox"].flat-red, input[type="radio"].flat-red').iCheck({ +// checkboxClass: 'icheckbox_flat-green', +// radioClass: 'iradio_flat-green' +// }); +// }); + </script> + <script> + $(function () { + //Initialize Select2 Elements + $(".select2").select2(); + + //Datemask dd/mm/yyyy + $("#datemask").inputmask("dd/mm/yyyy", {"placeholder": "dd/mm/yyyy"}); + //Datemask2 mm/dd/yyyy + $("#datemask2").inputmask("mm/dd/yyyy", {"placeholder": "mm/dd/yyyy"}); + //Money Euro + $("[data-mask]").inputmask(); + + //Date range picker + $('#reservation').daterangepicker(); + //Date range picker with time picker + $('#reservationtime').daterangepicker({timePicker: true, timePickerIncrement: 30, format: 'MM/DD/YYYY h:mm A'}); + //Date range as a button + $('#daterange-btn').daterangepicker( + { + ranges: { + 'Today': [moment(), moment()], + 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], + 'Last 7 Days': [moment().subtract(6, 'days'), moment()], + 'Last 30 Days': [moment().subtract(29, 'days'), moment()], + 'This Month': [moment().startOf('month'), moment().endOf('month')], + 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')] + }, + startDate: moment().subtract(29, 'days'), + endDate: moment() + }, + function (start, end) { + $('#reportrange span').html(start.format('MMMM D, YYYY') + ' - ' + end.format('MMMM D, YYYY')); + } + ); + + //iCheck for checkbox and radio inputs + $('input[type="checkbox"].minimal, input[type="radio"].minimal').iCheck({ + checkboxClass: 'icheckbox_minimal-blue', + radioClass: 'iradio_minimal-blue' + }); + //Red color scheme for iCheck + $('input[type="checkbox"].minimal-red, input[type="radio"].minimal-red').iCheck({ + checkboxClass: 'icheckbox_minimal-red', + radioClass: 'iradio_minimal-red' + }); + //Flat red color scheme for iCheck + $('input[type="checkbox"].flat-red, input[type="radio"].flat-red').iCheck({ + checkboxClass: 'icheckbox_flat-green', + radioClass: 'iradio_flat-green' + }); + + //Colorpicker + //$(".my-colorpicker1").colorpicker(); + //color picker with addon + //$(".my-colorpicker2").colorpicker(); + + //Timepicker + //$(".timepicker").timepicker({ + // showInputs: false + //}); + }); + </script> + </body> +</html> \ No newline at end of file diff --git a/application/views/includes3/template.php b/application/views/includes3/template.php new file mode 100644 index 0000000..3a11a31 --- /dev/null +++ b/application/views/includes3/template.php @@ -0,0 +1,171 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"/> + <meta http-equiv="X-UA-Compatible" content="IE=edge"/> + <link rel="icon" type="image/png" href="<?php echo base_url();?>img/logo-rssa.png" /> + <title>Anjungan RSSA Malang</title> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/bootstrap/css/bootstrap.min.css"/> + <!--link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"/> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"/--> + + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/font-awesome/css/font-awesome.min.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/font-awesome/css/font-awesome.css"/> + + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/dist/css/AdminLTE.min.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/dist/css/skins/_all-skins.min.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/iCheck/flat/blue.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/jvectormap/jquery-jvectormap-1.2.2.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/datepicker/datepicker3.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/daterangepicker/daterangepicker-bs3.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/datatables/dataTables.bootstrap.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/select2/select2.min.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/dist/css/skins/_all-skins.min.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/iCheck/all.css"/> + + </head> + <body class="skin-black-light"> + <div id="main-container"> + <?php $this->load->view($main_content); ?> + </div> + + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/jQuery/jQuery-2.1.4.min.js"></script> + + <!--script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script--> + <script src="<?php echo base_url();?>/assets/jquery-ui.min.js"></script> + <script>$.widget.bridge('uibutton', $.ui.button);</script> + + <script src="<?php echo base_url();?>/theme/bootstrap/bootstrap/js/bootstrap.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/sparkline/jquery.sparkline.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/jvectormap/jquery-jvectormap-1.2.2.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/jvectormap/jquery-jvectormap-world-mill-en.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/knob/jquery.knob.js"></script> + + <!--script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.2/moment.min.js"></script--> + <script src="<?php echo base_url();?>/assets/moment.min.js"></script> + + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/daterangepicker/daterangepicker.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/datepicker/bootstrap-datepicker.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/slimScroll/jquery.slimscroll.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/fastclick/fastclick.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/dist/js/app.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/dist/js/demo.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/datatables/jquery.dataTables.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/datatables/dataTables.bootstrap.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/select2/select2.full.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/input-mask/jquery.inputmask.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/input-mask/jquery.inputmask.date.extensions.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/input-mask/jquery.inputmask.extensions.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/slimScroll/jquery.slimscroll.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/fastclick/fastclick.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/dist/js/demo.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/iCheck/icheck.min.js"></script> + <script src="<?php echo base_url();?>/js/terbilang.js"></script> + <script src="<?php echo base_url();?>/js/terbilang.min.js"></script> + <script src="<?php echo base_url();?>/js/my.js"></script> + + <!--script src="https://code.responsivevoice.org/responsivevoice.js?key=VZgeKlw3"></script--> + + <script> + $(function () { + $("#example1").DataTable(); + $('#example2').DataTable({ + "paging" : true, + "lengthChange" : false, + "searching" : false, + "ordering" : true, + "info" : true, + "autoWidth" : false + }); + }); + </script> + <script> +// $(function () { +// $(".select2").select2(); +// $("#datemask").inputmask("dd/mm/yyyy", {"placeholder": "dd/mm/yyyy"}); +// $("#datemask2").inputmask("mm/dd/yyyy", {"placeholder": "mm/dd/yyyy"}); +// $("[data-mask]").inputmask(); +// +// $('input[type="checkbox"].minimal, input[type="radio"].minimal').iCheck({ +// checkboxClass: 'icheckbox_minimal-blue', +// radioClass: 'iradio_minimal-blue' +// }); +// +// $('input[type="checkbox"].minimal-red, input[type="radio"].minimal-red').iCheck({ +// checkboxClass: 'icheckbox_minimal-red', +// radioClass: 'iradio_minimal-red' +// }); +// +// $('input[type="checkbox"].flat-red, input[type="radio"].flat-red').iCheck({ +// checkboxClass: 'icheckbox_flat-green', +// radioClass: 'iradio_flat-green' +// }); +// }); + </script> + <script> + $(function () { + //Initialize Select2 Elements + $(".select2").select2(); + + //Datemask dd/mm/yyyy + $("#datemask").inputmask("dd/mm/yyyy", {"placeholder": "dd/mm/yyyy"}); + //Datemask2 mm/dd/yyyy + $("#datemask2").inputmask("mm/dd/yyyy", {"placeholder": "mm/dd/yyyy"}); + //Money Euro + $("[data-mask]").inputmask(); + + //Date range picker + $('#reservation').daterangepicker(); + //Date range picker with time picker + $('#reservationtime').daterangepicker({timePicker: true, timePickerIncrement: 30, format: 'MM/DD/YYYY h:mm A'}); + //Date range as a button + $('#daterange-btn').daterangepicker( + { + ranges: { + 'Today': [moment(), moment()], + 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], + 'Last 7 Days': [moment().subtract(6, 'days'), moment()], + 'Last 30 Days': [moment().subtract(29, 'days'), moment()], + 'This Month': [moment().startOf('month'), moment().endOf('month')], + 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')] + }, + startDate: moment().subtract(29, 'days'), + endDate: moment() + }, + function (start, end) { + $('#reportrange span').html(start.format('MMMM D, YYYY') + ' - ' + end.format('MMMM D, YYYY')); + } + ); + + //iCheck for checkbox and radio inputs + $('input[type="checkbox"].minimal, input[type="radio"].minimal').iCheck({ + checkboxClass: 'icheckbox_minimal-blue', + radioClass: 'iradio_minimal-blue' + }); + //Red color scheme for iCheck + $('input[type="checkbox"].minimal-red, input[type="radio"].minimal-red').iCheck({ + checkboxClass: 'icheckbox_minimal-red', + radioClass: 'iradio_minimal-red' + }); + //Flat red color scheme for iCheck + $('input[type="checkbox"].flat-red, input[type="radio"].flat-red').iCheck({ + checkboxClass: 'icheckbox_flat-green', + radioClass: 'iradio_flat-green' + }); + + //Colorpicker + //$(".my-colorpicker1").colorpicker(); + //color picker with addon + //$(".my-colorpicker2").colorpicker(); + + //Timepicker + //$(".timepicker").timepicker({ + // showInputs: false + //}); + }); + </script> + </body> +</html> \ No newline at end of file diff --git a/application/views/index.html b/application/views/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/application/views/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/application/views/klinik/v_klinik_admin.php b/application/views/klinik/v_klinik_admin.php new file mode 100644 index 0000000..3901b0a --- /dev/null +++ b/application/views/klinik/v_klinik_admin.php @@ -0,0 +1,397 @@ +<body class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h1> + <small></small> + <?php + $jumpershift=0; + for($i=1;$i<=$jumshift;$i++){ + foreach($ip as $datpengunjung){ + if($datpengunjung->pp_shift==$i){ + $jumpershift++; + } + } + if($i<=$shiftbuka){ + echo "<span class='label label-success'> SHIFT $i ($jumpershift) </span>&nbsp;&nbsp;"; + }else{ + echo "<span class='label label-danger'><a href='#' class='btn-danger' >SHIFT $i ($jumpershift)</a></span>&nbsp;&nbsp;"; + } + $jumpershift=0; + } + echo "<span class='label bg-gray'> Max Quota Bangku $quotabangkuklinik </span>&nbsp;&nbsp;"; + ?> + <!--small><code>Otomatis Shift</code> <input id="cekboxauto" title="Otomatis Jam Shift Sesuai Aplikasi" name="cekboxauto" onclick="setauto(<?php echo $idklinik;?>)" type="checkbox" <?php if($autoshift==1){echo "checked";}?> /></small--> + + </h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li class="active"><?php echo $title ?></li> + </ol> + </section> + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box box-success"> + <div class="box-header with-border"> + <h3 class="box-title "><?php echo $title;?></h3> + + <div class="col-xs-1 pull-right"> + <a href="#" onclick="panggilpengunjung(20,<?php echo $idklinik;?>)" class="btn btn-danger pull-right btn-block btn-sm"> 20 </a>&nbsp; + </div> + <div class="col-xs-1 pull-right"> + <a href="#" onclick="panggilpengunjung(10,<?php echo $idklinik;?>)" class="btn btn-warning pull-right btn-block btn-sm"> 10 </a>&nbsp; + </div> + <div class="col-xs-1 pull-right"> + <a href="#" onclick="panggilpengunjung(5,<?php echo $idklinik;?>)" class="btn btn-primary pull-right btn-block btn-sm"> 5 </a>&nbsp; + </div> + <div class="col-xs-1 pull-right"> + <a href="#" onclick="panggilpengunjung(1,<?php echo $idklinik;?>)" class="btn btn-success pull-right btn-block btn-sm"> 1 </a>&nbsp; + </div> + <input id="quotaklinik" type="hidden" value="<?php echo $quotabangkuklinik;?>" /> + </div><!-- /.box-header --> + <div class="box-body"> + <?php if($this->session->flashdata('message')){?> + <div class="alert alert-success alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-check"></i> Alert!</h4> + <?php echo $this->session->flashdata('message');?> + </div> + <?php }?> + <div class="box-body table-responsive no-padding"> + <table id="example1" class="table table-bordered table-striped"> + <thead> + <tr> + <th width="5%">No</th> + <th>No Loket</th> + <th>Barcode</th> + <th>No Rekamedik</th> + <th>No Antrian</th> + <th>Shift</th> + <th>Ket</th> + <th>Fast Track</th> + <th>Pembayaran</th> + <th width="5%">Panggil</th> + <th width="15%">Aksi</th> + </tr> + </thead> + <tbody> + <?php + $nomor=0; + $setbutton="";$color="";$pj=""; $np=""; $ket=""; $rm="";$buttonviewft=""; + foreach ($pk as $pengunjungklinik){$nomor++; + if($pengunjungklinik->prt_status==5){ + $setbutton = " + <a href='".base_url()."index.php/ps_klinik_admin/proses_admin/".$pengunjungklinik->prt_id."/7' class='btn btn-primary btn-xs'>Datang</a>"; + }elseif($pengunjungklinik->prt_status==6){ + $setbutton = " + <a href='".base_url()."index.php/ps_klinik_admin/proses_admin/".$pengunjungklinik->prt_id."/7' class='btn btn-primary btn-xs'>Proses</a>"; + } + elseif($pengunjungklinik->prt_status==7){ + $setbutton = " + + <a href='".base_url()."index.php/ps_klinik_admin/proses_admin/".$pengunjungklinik->prt_id."/9' class='btn btn-success btn-xs'>Selesai</a> + <a onclick='pending($pengunjungklinik->prt_id,8)' href='#' class='btn btn-danger btn-xs'>Pending</a> + <a href='#' onclick='ubahklinik($pengunjungklinik->pp_id,$pengunjungklinik->pp_klinik_id,$pengunjungklinik->prt_id)' class='btn btn-warning btn-xs' data-toggle='modal' data-target='#ubah_klinik'>Edit</a>"; + }elseif($pengunjungklinik->prt_status==8){ + $setbutton = " + <a href='".base_url()."index.php/ps_klinik_admin/proses_admin/".$pengunjungklinik->prt_id."/9' class='btn btn-success btn-xs'>Pending Selesai</a> + <a href='#' onclick='ubahklinik($pengunjungklinik->pp_id,$pengunjungklinik->pp_klinik_id,$pengunjungklinik->prt_id)' class='btn btn-warning btn-xs' data-toggle='modal' data-target='#ubah_klinik'>Edit</a>"; + } + $bgkonsul = ""; + if(isset($pengunjungklinik->pp_konsul)){$bgkonsul = 'style="background-color:#FFFF00"';} + if(isset($pengunjungklinik->pp_fasttrack)){ + $color= "style='background-color: #FFB6C1;'"; + $pecahdata=explode("|",$pengunjungklinik->pp_fasttrack); + $pj=$pecahdata[0]; + $np=$pecahdata[1]; + $ket=$pecahdata[2]; + $rm=$pengunjungklinik->pp_rekamedik; + $buttonviewft="<a href='#' onclick='viewfasttrack($pengunjungklinik->pp_id,$pengunjungklinik->pp_rekamedik)' class='btn btn-primary btn-xs' data-toggle='modal' data-target='#fasttrack'>View Fastrack</a>"; + } + echo " + <input hidden='' id='rm$pengunjungklinik->pp_id' name='rm$pengunjungklinik->pp_id' value='$rm' /> + <input hidden='' id='pj$pengunjungklinik->pp_id' name='pj$pengunjungklinik->pp_id' value='$pj' /> + <input hidden='' id='np$pengunjungklinik->pp_id' name='np$pengunjungklinik->pp_id' value='$np' /> + <input hidden='' id='ket$pengunjungklinik->pp_id' name='ket$pengunjungklinik->pp_id' value='$ket' />"; + ?> + <tr <?php echo $bgkonsul; echo $color;?>> + <input type="hidden" id="no_antrian<?php echo $pengunjungklinik->prt_id;?>" value="<?php echo $pengunjungklinik->pp_nomor_antrian_klinik;?>" /> + <td><?php echo $nomor;?></td> + <td><?php echo $pengunjungklinik->pp_nomor_antrian;?></td> + <td><?php echo $pengunjungklinik->pp_barcode;?></td> + <td><?php echo $pengunjungklinik->pp_rekamedik;?></td> + <td><?php echo $pengunjungklinik->pp_nomor_antrian_klinik;if($pengunjungklinik->pp_pendaftaran_online){echo " Online - ".$pengunjungklinik->pp_pendaftaran_online;}?></td> + <td>Shift <?php echo $pengunjungklinik->pp_shift;?></td> + <td><?php if(isset($pengunjungklinik->pp_konsul)){echo "Konsultasi";}?></td> + <td><?php echo $buttonviewft;?></td> + <td> + <?php + if($pengunjungklinik->pp_pembayaran==1){echo "UMUM";} + if($pengunjungklinik->pp_pembayaran==2){echo "JKN";} + ?> + <?php if($pengunjungklinik->pp_pendaftaran_online!=null){echo " / JKN / ONLINE";}?> + </td> + <td><?php echo "<button onclick='play($pengunjungklinik->prt_id)' class='btn btn-info btn-xs'>Panggil</button>";?></td> + <td><?php echo $setbutton;?></td> + </tr> + <?php $color="";$buttonviewft="";$pj=""; $np=""; $ket="";$rm=""; + }?> + </tbody> + </table> + <input id="jumpas" type="hidden" value="<?php echo $nomor;?>" /> + <input id="namaklinik" type="hidden" value="<?php echo $namaklinik;?>" /> + </div> + <br /> + </div><!-- /.box-body --> + </div><!-- /.box --> + <div class="box box-primary"> + <div class="box-header with-border"> + <h3 class="box-title ">Data Pengunjung <code><?php echo $title;?></code></h3> + </div><!-- /.box-header --> + <div class="box-body"> + <div class="box-body table-responsive no-padding"> + <table id="example2" class="table table-bordered table-striped"> + <thead> + <tr> + <th width="5%">No</th> + <th>Barcode</th> + <th>No Rekamedik</th> + <th>No Antrian</th> + <th>No Antrian Klinik</th> + <th>Shift</th> + <th>Pembayaran</th> + <th width="20%">Status</th> + </tr> + </thead> + <tbody> + <?php + $no=0; $ketfastrack=""; + foreach ($dp as $datpeng){$no++; + + if(isset($datpeng->pp_fasttrack)){ + $ketfastrack="<code>| Fastrack</code>"; + } + ?> + <tr> + <td><?php echo $no;?></td> + <td><?php echo $datpeng->pp_barcode;?></td> + <td><?php echo $datpeng->pp_rekamedik;?></td> + <td><?php echo $datpeng->pp_nomor_antrian;?></td> + <td><?php echo $datpeng->pp_nomor_antrian_klinik;?></td> + <td><?php echo "Shift ".$datpeng->pp_shift;?></td> + <td> + <?php + if($datpeng->pp_pembayaran==1){echo "UMUM";} + if($datpeng->pp_pembayaran==2){echo "JKN";} + if($datpeng->pp_pembayaran==3){echo "LAINNYA";} + ?> + </td> + <td><?php + + switch($datpeng->prt_status){ + case '0':$statusnya = "<p class='text-blue' > Proses Barcode $ketfastrack</p>";break; + case '1':$statusnya = "<p class='text-aqua' > Tunggu Daftar $ketfastrack</p>";break; + case '2':$statusnya = "<p class='text-blue' > Proses Daftar $ketfastrack</p>";break; + case '3':$statusnya = "<p class='text-red' > Pending Daftar $ketfastrack</p>";break; + case '4':$statusnya = "<p class='text-aqua' > Tunggu Klinik $ketfastrack</p>";break; + case '5':$statusnya = "<p class='text-yellow' > Panggil Klinik $ketfastrack</p>";break; + case '6':$statusnya = "<p class='text-aqua' > Tunggu Proses Klinik $ketfastrack</p>";break; + case '7':$statusnya = "<p class='text-blue' > Proses Klinik $ketfastrack</p>";break; + case '8':$statusnya = "<p class='text-red' > Pending Klinik $ketfastrack</p>";break; + case '9':$statusnya = "<p class='text-green' > <a href='".base_url()."index.php/ps_klinik_admin/aktif/".$datpeng->prt_id."' class='btn btn-success btn-xs'>Aktif</a> Selesai $ketfastrack</p> ";break; + + default:$statusnya = "Anjungan";break; + }echo $statusnya; + $ketfastrack=""; + ?></td> + </tr> + <?php + }?> + </tbody> + </table> + </div> + <br /> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + </section> + + <div class="control-sidebar-bg"></div> +</body> +<script> + function ubahklinik(id,kl,prt){ + document.getElementById('idpengunjung').value=id; + document.getElementById('klinik').value=kl; + document.getElementById('idprt').value=prt; + } +</script> +<div class="modal fade" id="ubah_klinik" tabindex="-1" role="dialog" aria-labelledby="largeModal" aria-hidden="true"> + <form class="form-horizontal" id="form_online" action="<?php echo(base_url()); ?>index.php/ps_klinik_admin/ubahklinik" method="post" autocomplete="off"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button> + <h3 class="modal-title" id="myModalLabel">Konsultasi / Ubah Klinik</h3> + </div> + <div class="modal-body"> + <input type="hidden" id="idpengunjung" name="idpengunjung" value="" /> + <input type="hidden" id="idprt" name="idprt" value="" /> + <div class="form-group"> + <label for="ket" class="col-sm-2 control-label">Keterangan</label> + <div class="col-sm-3"> + <label> + <input type="radio" name="ket" value="1" class="flat-red" checked> + Ubah Klinik + </label> + </div> + <div class="col-sm-3"> + <label> + <input type="radio" name="ket" value="2" class="flat-red" checked> + Konsultasi + </label> + </div> + </div> + <div class="form-group"> + <label for="klinik" class="col-sm-2 control-label">Klinik</label> + <div class="col-sm-9"> + <select id="klinik" name="klinik" class="form-control select"> + <option value="0"> Pilih Klinik</option> + <?php foreach ($kl as $datklinik){ + echo "<option value='$datklinik->mk_id'> $datklinik->mk_nama</option>"; + }?> + </select> + </div> + </div> + </div> + <div class="modal-footer"> + <button class="btn btn-success" type="submit"> Simpan </button> + <button class="btn" data-dismiss="modal" aria-hidden="true">Tutup</button> + </div> + </div> + </div> + </form> +</div> +<script> +function viewfasttrack(id,rm){ + document.getElementById('idpengunjung').value=id; + document.getElementById('norek').value=rm; + document.getElementById('tbnsubmit').style.visibility = 'hidden'; + document.getElementById('penanggungjawab').value=document.getElementById('pj'+id).value; + document.getElementById('namapas').value=document.getElementById('np'+id).value; + document.getElementById('ket').value=document.getElementById('ket'+id).value; +} +</script> +<div class="modal fade" id="fasttrack" tabindex="-1" role="dialog" aria-labelledby="largeModal" aria-hidden="true"> + <form class="form-horizontal" id="form_online" action="<?php echo(base_url()); ?>index.php/ps_fasttrack/set_fasttrack" method="post" autocomplete="off"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button> + <h3 class="modal-title" id="myModalLabel">Form Fast Track</h3> + </div> + <div class="modal-body"> + <input type="hidden" id="idpengunjung" name="idpengunjung" value="" /> + <input type="hidden" id="ppstatus" name="ppstatus" value="" /> + <div class="form-group"> + <label for="penanggungjawab" class="col-sm-4 control-label">Penanggung Jawab</label> + <div class="col-sm-7"> + <input type="text" disabled="" id="penanggungjawab" name="penanggungjawab" value="" class="form-control select" onkeyup="this.value = this.value.toUpperCase()"/> + </div> + </div> + <div class="form-group"> + <label for="norek" class="col-sm-4 control-label">No Rekamedik</label> + <div class="col-sm-7"> + <input type="number" disabled="" id="norek" name="norek" value="" class="form-control select" /> + </div> + </div> + <div class="form-group"> + <label for="namapas" class="col-sm-4 control-label">Nama Pasien</label> + <div class="col-sm-7"> + <input type="text" disabled="" id="namapas" name="namapas" value="" class="form-control select" onkeyup="this.value = this.value.toUpperCase()"/> + </div> + </div> + <div class="form-group"> + <label for="ket" class="col-sm-4 control-label">Alasan Fast Track</label> + <div class="col-sm-7"> + <textarea class="form-control select" disabled="" id="ket" name="ket" onkeyup="this.value = this.value.toUpperCase()" ></textarea> + </div> + </div> + </div> + <div class="modal-footer"> + <button class="btn btn-success" id="tbnsubmit" type="submit"> Simpan </button> + <button class="btn" data-dismiss="modal" aria-hidden="true">Tutup</button> + </div> + </div> + </div> + </form> +</div> +<script src="https://code.responsivevoice.org/responsivevoice.js?key=VZgeKlw3"></script> +<script type="text/javascript"> + var url="<?php echo base_url();?>"; + function panggilpengunjung(jumlah,klinik){ + var quota = document.getElementById('quotaklinik').value; + var pasien = document.getElementById('jumpas').value; + if(parseInt(pasien)>=parseInt(quota)){ + alert("Anda tidak bisa memanggil pengunjung, karena tidak memiliki quota"); + }else{ + var tot = parseInt(jumlah)+parseInt(pasien); + if(parseInt(quota) >= parseInt(tot)){ + var r=confirm("Apakah anda ingin memanggil pengunjung sebanyak "+jumlah+" orang?") + if (r==true) + window.location = url+"index.php/ps_klinik_admin/panggilpengunjung/"+jumlah+"/"+klinik; + else + return false; + }else{ + alert("Anda tidak bisa memanggil pengunjung dengan jumlah melebihi quota"); + } + } + } + + function pending(id,code){ + var r=confirm("Apakah anda ingin melakukan pending ?") + if (r==true) + window.location = url+"index.php/ps_klinik_admin/proses_admin/"+id+"/"+code; + else + return false; + } + + function setauto(id){ + var checkbox = document.getElementById('cekboxauto'); + if (checkbox.checked != true) + {window.location = url+"index.php/ps_klinik_admin/autoshift/"+id+"/0";} + else + {window.location = url+"index.php/ps_klinik_admin/autoshift/"+id+"/1";} + } + + setTimeout(function(){ + $(".alert").fadeTo(500, 0).slideUp(500, function() { + $(this).remove(); + }); + }, 2000); +</script> +<script type="text/javascript"> + function play (id){ + var kode = document.getElementById('no_antrian'+id).value; + var nama = document.getElementById('namaklinik').value; + var pecah = kode.split("",-4); + var hasil = ""; + for (i=0;i<7;i++){ + if(i<=2){ + hasil = hasil+" "+pecah[i]+" . "; + }else{ + hasil = hasil+" "+pecah[i]+", "; + } + } + responsiveVoice.speak( + "Klinik "+nama+". Nomor Antrian, "+hasil, + "Indonesian Female", + { + pitch: 1, + rate: 0.6, + volume: 1 + } + ); + } + + </script> \ No newline at end of file diff --git a/application/views/listpasien/v_laporanpasien.php b/application/views/listpasien/v_laporanpasien.php new file mode 100644 index 0000000..46ab6db --- /dev/null +++ b/application/views/listpasien/v_laporanpasien.php @@ -0,0 +1,215 @@ +<body class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h1> + <small> + + </small> + </h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li class="active"><?php echo $title ?></li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title"><?php echo $title ?></h3> + </div><!-- /.box-header --> + <form class="form-horizontal" id="form" action="<?php echo(base_url()); ?>index.php/ps_listpasien/laporanpasien" method="post" autocomplete="off"> + <?php + if(isset($bulanset)){ + $setbulan=$bulanset; + $settahun=$tahunset; + }else{ + $setbulan=date("m"); + $settahun=date("Y"); + } + ?> + <div class="box-body"> + <div class="col-xs-1"> + <select name="tahunkunjungan" class="form-control"> + <option <?php if($settahun=="2025"){echo "selected=''";}?> value="2025">2025</option> + <option <?php if($settahun=="2024"){echo "selected=''";}?> value="2024">2024</option> + <option <?php if($settahun=="2023"){echo "selected=''";}?> value="2023">2023</option> + <option <?php if($settahun=="2022"){echo "selected=''";}?> value="2022">2022</option> + <option <?php if($settahun=="2021"){echo "selected=''";}?> value="2021">2021</option> + <option <?php if($settahun=="2020"){echo "selected=''";}?> value="2020">2020</option> + </select> + </div> + <div class="col-xs-1"> + <select name="bulankunjungan" class="form-control"> + <option <?php if($setbulan=="01"){echo "selected=''";}?> value="01">Januari</option> + <option <?php if($setbulan=="02"){echo "selected=''";}?> value="02">Febuari</option> + <option <?php if($setbulan=="03"){echo "selected=''";}?> value="03">Maret</option> + <option <?php if($setbulan=="04"){echo "selected=''";}?> value="04">April</option> + <option <?php if($setbulan=="05"){echo "selected=''";}?> value="05">Mei</option> + <option <?php if($setbulan=="06"){echo "selected=''";}?> value="06">Juni</option> + <option <?php if($setbulan=="07"){echo "selected=''";}?> value="07">Juli</option> + <option <?php if($setbulan=="08"){echo "selected=''";}?> value="08">Agustus</option> + <option <?php if($setbulan=="09"){echo "selected=''";}?> value="09">September</option> + <option <?php if($setbulan=="10"){echo "selected=''";}?> value="10">Oktober</option> + <option <?php if($setbulan=="11"){echo "selected=''";}?> value="11">November</option> + <option <?php if($setbulan=="12"){echo "selected=''";}?> value="12">Desember</option> + </select> + </div> + <div class="col-xs-1"> + <button type="submit" class="btn btn-primary">Search</button> + </div> + </div> + </form> + <div class="box-body"> + <?php if($this->session->flashdata('message')){?> + <div class="alert alert-success alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-check"></i> Alert!</h4> + <?php echo $this->session->flashdata('message');?> + </div> + <?php }?> + <div class="box-body table-responsive no-padding"> + <table id="example1" class="table table-bordered table-striped"> + <thead> + <tr> + <th>Tanggal</th> + <th>Offline Umum</th> + <th>Offline JKN</th> + <th>Online Umum</th> + <th>Online JKN</th> + <th>M-jkn</th> + <th>Total</th> + </tr> + </thead> + <tbody> + <?php + $tahun = $settahun; //Mengambil tahun saat ini + $bulan = $setbulan; //Mengambil bulan saat ini + $tanggal = cal_days_in_month(CAL_GREGORIAN, $bulan, $tahun); + for ($i=1; $i < $tanggal+1; $i++) { + $tglday = ""; + $hit = strlen($i); + if($hit==1){ + $tglday="0".$i; + }else{ + $tglday=$i; + } + ?> + <tr> + <td><?php echo $tglday."/".$setbulan."/".$settahun; ?></td> + <?php + $ofum = 0;$ofjkn = 0;$onum = 0;$onjkn = 0;$mjkn = 0; $tot = 0; + $datenya = $settahun."-".$setbulan."-".$tglday; + $this->db->join('proses_ruang_tunggu', 'proses_pengunjung.pp_id = proses_ruang_tunggu.prt_pengunjung_id', 'left '); + //$this->db->where('prt_status >=', "1"); + $this->db->where('pp_tanggal_periksa', $datenya ); + $query = $this->db->get('proses_pengunjung'); + foreach($query->result() as $datarow){ $tot++; + if($datarow->pp_pendaftaran_online==null && $datarow->pp_pembayaran == 1){ + $ofum++; + }elseif($datarow->pp_pendaftaran_online==null && $datarow->pp_pembayaran == 2){ + $ofjkn++; + }elseif($datarow->pp_pendaftaran_online!=null && $datarow->pp_pembayaran == 1){ + $onum++; + }elseif($datarow->pp_pendaftaran_online!=null && $datarow->pp_pendaftaran_online!="M-JKN" && $datarow->pp_pembayaran == 2){ + $onjkn++; + }elseif($datarow->pp_pendaftaran_online=="M-JKN"){ + $mjkn++; + } + } + + ?> + <td><?php echo $ofum;?></td> + <td><?php echo $ofjkn;?></td> + <td><?php echo $onum;?></td> + <td><?php echo $onjkn;?></td> + <td><?php echo $mjkn;?></td> + <td><?php echo $tot;?></td> + </tr> + <?php + } + + ?> + </tbody> + </table> + <!--table id="example1" class="table table-bordered table-striped"> + <thead> + <tr> + <th width="5%">No</th> + <th>Tgl Periksa</th> + <th>NIK</th> + <th>RM</th> + <th>Barcode</th> + <th>No Antrian</th> + <th>Klinik</th> + <th>First Name Last Name</th> + <th>Shift</th> + <th>Pembayaran</th> + <th>Keterangan</th> + <th>Status</th> + </tr> + </thead> + <tbody> + <?php + $no=0; + foreach ($lp as $listpasien) { + $online="Offline"; + if(isset($listpasien->pp_pendaftaran_online)){ + $online="<code>Online </code>| ".$listpasien->pp_pendaftaran_online; + } + $setpembayaran=""; + if($listpasien->pp_pembayaran=="2"){ + $setpembayaran="JKN"; + }else{$setpembayaran="UMUM";} + + $newDate = date("d/m/Y", strtotime($listpasien->pp_tanggal_periksa)); + + $datastatus = $listpasien->prt_status; + $statusnya = ""; + switch ($datastatus) { + case "0":$statusnya = "Barcode";break; + case "1":$statusnya = "Tunggu Daftar";break; + case "2":$statusnya = "Proses Daftar";break; + case "3":$statusnya = "Pending Daftar";break; + case "4":$statusnya = "Tunggu Klinik";break; + case "5":$statusnya = "Panggil Klinik";break; + case "6":$statusnya = "Tunggu Proses Klinik";break; + case "7":$statusnya = "Proses Klinik";break; + case "8":$statusnya = "Pending Klinik";break; + case "9":$statusnya = "Selesai";break; + default:$statusnya = "Anjungan"; + } + + $no++; + echo(" + <tr> + <td>".$no."</td> + <td>".$newDate."</td> + <td>".$listpasien->var_nik."</td> + <td>".$listpasien->pp_rekamedik."</td> + <td>".$listpasien->pp_barcode."</td> + <td>".$listpasien->pp_nomor_antrian."</td> + <td>".$listpasien->mk_nama."</td> + <td>".$listpasien->var_nama_depan." ".$listpasien->var_nama_belakang."</td> + <td>Shift ".$listpasien->pp_shift."</td> + <td>".$setpembayaran."</td> + <td>".$online."</td> + <td>".$statusnya."</td> + </tr> + "); + + } + ?> + </tbody> + </table--> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + </section> + <div class="control-sidebar-bg"></div> +</body> +<script type="text/javascript"> +</script> \ No newline at end of file diff --git a/application/views/listpasien/v_laporanpasienperklinik.php b/application/views/listpasien/v_laporanpasienperklinik.php new file mode 100644 index 0000000..4d7ec8b --- /dev/null +++ b/application/views/listpasien/v_laporanpasienperklinik.php @@ -0,0 +1,132 @@ +<body class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h1> + <small> + + </small> + </h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li class="active"><?php echo $title ?></li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title"><?php echo $title ?></h3> + </div><!-- /.box-header --> + <form class="form-horizontal" id="form" action="<?php echo(base_url()); ?>index.php/ps_listpasien/laporanpasienperklinik" method="post" autocomplete="off"> + <?php + if(isset($bulanset)){ + $setbulan=$bulanset; + $settahun=$tahunset; + }else{ + $setbulan=date("m"); + $settahun=date("Y"); + } + ?> + <div class="box-body"> + <div class="col-xs-1"> + <select name="tahunkunjungan" class="form-control"> + <option <?php if($settahun=="2025"){echo "selected=''";}?> value="2025">2025</option> + <option <?php if($settahun=="2024"){echo "selected=''";}?> value="2024">2024</option> + <option <?php if($settahun=="2023"){echo "selected=''";}?> value="2023">2023</option> + <option <?php if($settahun=="2022"){echo "selected=''";}?> value="2022">2022</option> + <option <?php if($settahun=="2021"){echo "selected=''";}?> value="2021">2021</option> + <option <?php if($settahun=="2020"){echo "selected=''";}?> value="2020">2020</option> + </select> + </div> + <div class="col-xs-1"> + <select name="bulankunjungan" class="form-control"> + <option <?php if($setbulan=="01"){echo "selected=''";}?> value="01">Januari</option> + <option <?php if($setbulan=="02"){echo "selected=''";}?> value="02">Febuari</option> + <option <?php if($setbulan=="03"){echo "selected=''";}?> value="03">Maret</option> + <option <?php if($setbulan=="04"){echo "selected=''";}?> value="04">April</option> + <option <?php if($setbulan=="05"){echo "selected=''";}?> value="05">Mei</option> + <option <?php if($setbulan=="06"){echo "selected=''";}?> value="06">Juni</option> + <option <?php if($setbulan=="07"){echo "selected=''";}?> value="07">Juli</option> + <option <?php if($setbulan=="08"){echo "selected=''";}?> value="08">Agustus</option> + <option <?php if($setbulan=="09"){echo "selected=''";}?> value="09">September</option> + <option <?php if($setbulan=="10"){echo "selected=''";}?> value="10">Oktober</option> + <option <?php if($setbulan=="11"){echo "selected=''";}?> value="11">November</option> + <option <?php if($setbulan=="12"){echo "selected=''";}?> value="12">Desember</option> + </select> + </div> + <div class="col-xs-1"> + <button type="submit" class="btn btn-primary">Search</button> + </div> + </div> + </form> + <div class="box-body"> + <?php if($this->session->flashdata('message')){?> + <div class="alert alert-success alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-check"></i> Alert!</h4> + <?php echo $this->session->flashdata('message');?> + </div> + <?php }?> + <div class="box-body table-responsive no-padding"> + <table id="example1" class="table table-bordered table-striped"> + <thead> + <tr> + <th>Klinik</th> + <th>Offline Umum</th> + <th>Offline JKN</th> + <th>Online Umum</th> + <th>Online JKN</th> + <th>M-jkn</th> + <th>Total</th> + </tr> + </thead> + <tbody> + <?php + foreach($mk as $datmk){ + $ofum = 0;$ofjkn = 0;$onum = 0;$onjkn = 0;$mjkn = 0; $tot = 0; + $datenya = $settahun."-".$setbulan; + $this->db->join('master_klinik', 'master_klinik.mk_id = proses_pengunjung.pp_klinik_id', 'left '); + $this->db->where('pp_klinik_id', $datmk->mk_id); + $this->db->like('pp_tanggal_periksa', $datenya); + $query = $this->db->get('proses_pengunjung'); + foreach($query->result() as $datarow){ $tot++; + if($datarow->pp_pendaftaran_online==null && $datarow->pp_pembayaran == 1){ + $ofum++; + }elseif($datarow->pp_pendaftaran_online==null && $datarow->pp_pembayaran == 2){ + $ofjkn++; + }elseif($datarow->pp_pendaftaran_online!=null && $datarow->pp_pembayaran == 1){ + $onum++; + }elseif($datarow->pp_pendaftaran_online!=null && $datarow->pp_pendaftaran_online!="M-JKN" && $datarow->pp_pembayaran == 2){ + $onjkn++; + }elseif($datarow->pp_pendaftaran_online!=null && $datarow->pp_pendaftaran_online=="M-JKN" && $datarow->pp_pembayaran == 2){ + $mjkn++; + } + } + ?> + <tr> + <td><?php echo $datmk->mk_nama;?></td> + <td><?php echo $ofum;?></td> + <td><?php echo $ofjkn;?></td> + <td><?php echo $onum;?></td> + <td><?php echo $onjkn;?></td> + <td><?php echo $mjkn;?></td> + <td><?php echo $tot;?></td> + </tr> + <?php + } + + ?> + </tbody> + </table> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + </section> + <div class="control-sidebar-bg"></div> +</body> +<script type="text/javascript"> +</script> \ No newline at end of file diff --git a/application/views/listpasien/v_listpasien.php b/application/views/listpasien/v_listpasien.php new file mode 100644 index 0000000..6ddce90 --- /dev/null +++ b/application/views/listpasien/v_listpasien.php @@ -0,0 +1,147 @@ +<body class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h1> + <small> + + </small> + </h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li class="active"><?php echo $title ?></li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title"><?php echo $title ?></h3> + </div><!-- /.box-header --> + <form class="form-horizontal" id="form" action="<?php echo(base_url()); ?>index.php/ps_listpasien/search" method="post" autocomplete="off"> + <?php + if(isset($tglset)){ + $setdate=$tglset; + $setket = $ketset; + }else{ + $setdate=date("d/m/Y"); + $setket=""; + } + ?> + <div class="box-body"> + <div class="col-xs-3"> + <div class="input-group"> + <div class="input-group-addon"> + <i class="fa fa-calendar"></i> + </div> + <input name="tglperiksa" type="text" class="form-control" data-inputmask="'alias': 'dd/mm/yyyy'" data-mask="" value="<?php echo $setdate;?>" /> + </div> + </div> + <div class="col-xs-1"> + <select name="ketkunjungan" class="form-control"> + <option <?php if($setket=="all"){echo "selected=''";}?> value="all">Semua</option> + <option <?php if($setket=="online"){echo "selected=''";}?> value="online">Online</option> + <option <?php if($setket=="offline"){echo "selected=''";}?> value="offline">Offline</option> + </select> + </div> + <div class="col-xs-1"> + <button type="submit" class="btn btn-primary">Search</button> + </div> + <div class="col-xs-1"> + <a href="<?php echo base_url()?>index.php/ps_listpasien/laporanpasien" type="button" class="btn btn-primary">Laporan Pasien</a> + </div> + <div class="col-xs-1"> + <a href="<?php echo base_url()?>index.php/ps_listpasien/laporanpasienperklinik" type="button" class="btn btn-primary">Laporan Pasien Per Klinik</a> + </div> + </div> + </form> + <div class="box-body"> + <?php if($this->session->flashdata('message')){?> + <div class="alert alert-success alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-check"></i> Alert!</h4> + <?php echo $this->session->flashdata('message');?> + </div> + <?php }?> + <div class="box-body table-responsive no-padding"> + <table id="example1" class="table table-bordered table-striped"> + <thead> + <tr> + <th width="5%">No</th> + <th>Tgl Periksa</th> + <th>NIK</th> + <th>RM</th> + <th>Barcode</th> + <th>No Antrian</th> + <th>Klinik</th> + <th>First Name Last Name</th> + <th>Shift</th> + <th>Pembayaran</th> + <th>Keterangan</th> + <th>Status</th> + </tr> + </thead> + <tbody> + <?php + $no=0; + foreach ($lp as $listpasien) { + $online="Offline"; + if(isset($listpasien->pp_pendaftaran_online)){ + $online="<code>Online </code>| ".$listpasien->pp_pendaftaran_online; + } + $setpembayaran=""; + if($listpasien->pp_pembayaran=="2"){ + $setpembayaran="JKN"; + }else{$setpembayaran="UMUM";} + + $newDate = date("d/m/Y", strtotime($listpasien->pp_tanggal_periksa)); + + $datastatus = $listpasien->prt_status; + $statusnya = ""; + switch ($datastatus) { + case "0":$statusnya = "Barcode";break; + case "1":$statusnya = "Tunggu Daftar";break; + case "2":$statusnya = "Proses Daftar";break; + case "3":$statusnya = "Pending Daftar";break; + case "4":$statusnya = "Tunggu Klinik";break; + case "5":$statusnya = "Panggil Klinik";break; + case "6":$statusnya = "Tunggu Proses Klinik";break; + case "7":$statusnya = "Proses Klinik";break; + case "8":$statusnya = "Pending Klinik";break; + case "9":$statusnya = "Selesai";break; + default:$statusnya = "Anjungan"; + } + + $no++; + echo(" + <tr> + <td>".$no."</td> + <td>".$newDate."</td> + <td>".$listpasien->var_nik."</td> + <td>".$listpasien->pp_rekamedik."</td> + <td>".$listpasien->pp_barcode."</td> + <td>".$listpasien->pp_nomor_antrian."</td> + <td>".$listpasien->mk_nama."</td> + <td>".$listpasien->var_nama_depan." ".$listpasien->var_nama_belakang."</td> + <td>Shift ".$listpasien->pp_shift."</td> + <td>".$setpembayaran."</td> + <td>".$online."</td> + <td>".$statusnya."</td> + </tr> + "); + + } + ?> + </tbody> + </table> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + </section> + <div class="control-sidebar-bg"></div> +</body> +<script type="text/javascript"> +</script> \ No newline at end of file diff --git a/application/views/login/v_login.php b/application/views/login/v_login.php new file mode 100644 index 0000000..874c70a --- /dev/null +++ b/application/views/login/v_login.php @@ -0,0 +1,48 @@ +<!--DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'--> + <!--html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'--> + <html> + <head> + <meta charset="utf-8"/> + <meta http-equiv="X-UA-Compatible" content="IE=edge"/> + <title>RSSA | Log in</title> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/bootstrap/css/bootstrap.min.css"/> + <!-- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"/> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"/> --> + <link rel="stylesheet" href="<?php echo base_url();?>/assets/font-awesome.min.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/assets/ionicons.min.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/dist/css/AdminLTE.min.css"/> + <link rel="stylesheet" href="<?php echo base_url();?>/theme/bootstrap/plugins/iCheck/square/blue.css"/> + </head> + <!--body class="hold-transition" background="<?php echo base_url();?>img/background2.jpg"--> + <body class="hold-transition"> + <div class="login-box"> + + <div class="login-box-body"> + <div class="login-logo"> + <a href="#"><b>Antrean</b> RSSA</a> + </div> + <p class="login-box-msg">Masukan Nama User dan Password</p> + <p><?php echo $error?></p> + <form action="<?php echo base_url();?>index.php/login/process" name="process" method="post"> + <div class="form-group has-feedback"> + <input name="username" class="form-control" placeholder="Nama User"/> + <span class="glyphicon glyphicon-user form-control-feedback"></span> + </div> + <div class="form-group has-feedback"> + <input name="password" type="password" class="form-control" placeholder="Password"/> + <span class="glyphicon glyphicon-lock form-control-feedback"></span> + </div> + <div class="row"> + <div class="col-xs-12"> + <input type="submit" value="Login" class="btn btn-success btn-block btn-flat" /> + </div> + </div> + </form> + </div> + </div> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/jQuery/jQuery-2.1.4.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/bootstrap/js/bootstrap.min.js"></script> + <script src="<?php echo base_url();?>/theme/bootstrap/plugins/iCheck/icheck.min.js"></script> + </body> + </html> \ No newline at end of file diff --git a/application/views/loket/v_loket_admin.php b/application/views/loket/v_loket_admin.php new file mode 100644 index 0000000..158f978 --- /dev/null +++ b/application/views/loket/v_loket_admin.php @@ -0,0 +1,1062 @@ +<body class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h1> + <?php + if(isset($idklinik)){ + $exidklinik = explode('|', $idklinik); + $exshiftbuka = explode('|', $shiftbuka); + $exnamaklinik = explode('|', $namaklinik); + $exaktifklinik = explode('|', $aktifklinik); + $exjumshift = explode('|', $jumshift); + $jumdat = count($exidklinik); + $jumlahpanggil=0; + $totalpanggil=0; + $warna=1;$setwarna=""; + + for($i=0;$i<$jumdat;$i++){ + if($exnamaklinik[$i]){ + foreach ($ip as $infopengunjung){ + if($infopengunjung->pp_klinik_id==$exidklinik[$i]){ + if($infopengunjung->pp_status==null){ + if($infopengunjung->pp_shift<=$exshiftbuka[$i]){ + if($infopengunjung->pp_pembayaran==$pembayaran){ + $jumlahpanggil++;$totalpanggil++;//echo $warna; + if($warna==1){$setwarna="bg-purple";$warna++;} + elseif($warna==2){$setwarna="label-info";$warna++;} + elseif($warna==3){$setwarna="bg-teal";$warna++;} + elseif($warna==4){$setwarna="label-warning";$warna=0;} + } + } + }else{ + if($infopengunjung->prt_aktif==2){ + if($infopengunjung->pp_shift<=$exshiftbuka[$i]){ + if($infopengunjung->pp_pembayaran==$pembayaran){ + $jumlahpanggil++;$totalpanggil++;//echo $warna; + if($warna==1){$setwarna="bg-purple";$warna++;} + elseif($warna==2){$setwarna="label-info";$warna++;} + elseif($warna==3){$setwarna="bg-teal";$warna++;} + elseif($warna==4){$setwarna="label-warning";$warna=0;} + } + } + + } + } + } + } + if($jumlahpanggil==0){ + if($jumdat<=5){echo "<span class='label label-success'> $exnamaklinik[$i] ($jumlahpanggil) </span>&nbsp;&nbsp;";} + }else{ + if($jumdat<=5){echo "<span class='label $setwarna'> $exnamaklinik[$i] ($jumlahpanggil) </span>&nbsp;&nbsp;";} + } + $jumlahpanggil=0; + } + } + } + $warna=0; + echo "<span class='label bg-navy'> Total $totalpanggil </span>&nbsp;&nbsp;"; + echo "<span class='label bg-gray'> Max $quotaloket Pasien </span>"; + + ?> + <!--small></small--> + <!--span class="label label-info">Pengunjung Yang Dapat Di Panggil : 10</span--> + <!--span class="label label-warning">Pengunjung Shift Belum Buka : 20</span--> + </h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li class="active"><?php echo $title ?></li> + <input type="hidden" id="namaloket" name="namaloket" value="<?php echo $namaloket;?>" /> + <input type="hidden" id="idloket" name="idloket" value="<?php echo $idloket;?>" /> + </ol> + </section> + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box box-info"> + <div class="box-header with-border"> + <h3 class="box-title "><?php echo $title;?></h3> + + <div class="col-xs-1 pull-right"> + <a href="#" onclick="panggilpengunjung(20)" class="btn btn-danger pull-right btn-block btn-sm"> 20 </a>&nbsp; + </div> + <div class="col-xs-1 pull-right"> + <a href="#" onclick="panggilpengunjung(10)" class="btn btn-warning pull-right btn-block btn-sm"> 10 </a>&nbsp; + </div> + <div class="col-xs-1 pull-right"> + <a href="#" onclick="panggilpengunjung(5)" class="btn btn-primary pull-right btn-block btn-sm"> 5 </a>&nbsp; + </div> + <div class="col-xs-1 pull-right"> + <a href="#" onclick="panggilpengunjung(1)" class="btn btn-success pull-right btn-block btn-sm"> 1 </a>&nbsp; + </div> + <input id="quotaloket" type="hidden" value="<?php echo $quotaloket;?>" /> + </div><!-- /.box-header --> + <div class="box-body"> + <?php + $noantr = ""; + $nmklin = ""; + $jnpemb = ""; + $shiftp = ""; + $nobarc = ""; + $ketonl = null; + $ketfas = null; + $setpan = null; + $setnext = 0; + $setprtnext = ""; + $setppnext = ""; + $pengselno = "KOSONG"; + + $prtid = ""; + $ppid = ""; + $kliid = ""; + $setawal= 0; + + foreach ($pg as $pengunjung) { + if($pengunjung->pp_loket==$this->session->userdata('s_loket')){ + if($klinik){ + $klinikpecah = explode(",",$klinik); + $jumlah = count($klinikpecah); + for($i=0;$i<$jumlah;$i++){ + if($klinikpecah[$i]==$pengunjung->pp_klinik_id){ + if($pengunjung->prt_status <= '2'){ + if($pengunjung->pp_pembayaran==$pembayaran){ + if($pengunjung->prt_status=='1' && $setnext==0){ + $pengselno = $pengunjung->pp_nomor_antrian; + $setprtnext = $pengunjung->prt_id; + $setppnext = $pengunjung->pp_id; + $setnext = 1; + } + if($pengunjung->prt_status=='2'&&$setawal==0){ + //echo $pengunjung->pp_nomor_antrian." | ".$pengunjung->prt_status." | "; + $noantr = $pengunjung->pp_nomor_antrian; + $nmklin = $pengunjung->mk_nama; + $jnpemb = $pengunjung->pp_pembayaran; + $shiftp = $pengunjung->pp_shift; + $nobarc = $pengunjung->pp_barcode; + $ketonl = $pengunjung->pp_pendaftaran_online; + $ketfas = $pengunjung->pp_fasttrack; + $setpan = $pengunjung->pp_panggil; + + $kliid = $pengunjung->mk_id; + $prtid = $pengunjung->prt_id; + $ppid = $pengunjung->pp_id; + $setawal = 1; + } + } + } + } + } + } + } + }?> + <?php if($noantr==""){ + ?> + <div class="col-md-12"> + <div class="col-lg-4 col-xs-6"></div> + <div class="col-lg-4 col-xs-6 btn" onclick="panggiladdawal(<?php echo $setprtnext;?>,<?php echo $setppnext;?>)"> + <div class="small-box bg-green"> + <div class="inner text-left"> + <h3>NEXT</h3> + <p>Pasien : <?php echo $pengselno;?></p> + </div> + <a href="#"> + <div class="icon"> + <i class="fa fa-play"></i> + </div> + </a> + <a href="#" class="small-box-footer">Klik untuk memanggil pasien selanjutnya</a> + </div> + </div> + <div class="col-lg-4 col-xs-6"></div> + </div> + <?php + }else{?> + <div class="col-md-12"> + <?php if($setpan==null){?> + <div class="col-lg-4 col-xs-6 btn" onclick="panggiladd(<?php echo $prtid;?>,<?php echo $ppid;?>)"> + <div class="small-box bg-aqua"> + <div class="inner text-left"> + <h3>PANGGIL</h3> + <p>Pasien</p> + </div> + <a href="#"> + <div class="icon"> + <i class="fa fa-microphone"></i> + </div> + </a> + <a href="#" class="small-box-footer">Klik untuk memanggil pasien di loket</a> + </div> + </div> + <?php }else{?> + <div class="col-lg-4 col-xs-6 btn" onclick="window.location.reload();"> + <div class="small-box bg-maroon"> + <div class="inner text-left"> + <h3>TUNGGU</h3> + <p>Panggilan</p> + </div> + <a href="./ps_loket_admin"> + <div class="icon"> + <i class="fa fa-refresh"></i> + </div> + </a> + <a href="./ps_loket_admin" class="small-box-footer">Klik untuk Refresh Page [F5] cek pasien apa sudah di panggil.</a> + </div> + </div> + <?php } ?> + + <div class="col-lg-4 col-xs-6 btn" onclick="window.location.reload();"> + <div class="small-box bg-primary"> + <div class="inner text-left"> + <h3><?php echo $noantr;?> - <?php echo $nmklin;?></h3> + <p>Jenis Pembayaran : <?php if($jnpemb='1'){echo "JKN";}else{echo "Umum";};?> (Shift <?php echo $shiftp;?>)</p> + </div> + <div class="icon"> + <i class="fa fa-user"></i> + </div> + <a href="#" class="small-box-footer"><?php echo $nobarc;?> <?php if($ketonl!=null){echo " - ONLINE ";} if($ketfas!=null){echo " | FASTTRACK ";}?></a> + </div> + </div> + <div class="col-lg-4 col-xs-6 btn" onclick="prosses(<?php echo $prtid;?>,<?php echo $ppid;?>)" data-toggle='modal' data-target='#proses_P'> + <div class="small-box bg-green"> + <div class="inner text-left"> + <h3>SELESAI</h3> + <p>Pelayanan</p> + </div> + <a href="#"> + <div class="icon"> + <i class="fa fa-star"></i> + </div> + </a> + <a href="#" class="small-box-footer">Masukan Nomor Rekamedik</a> + </div> + </div> + </div> + <div class="col-md-12"> + <div class="col-lg-4"> + <a href="#" onclick="pending(<?php echo $prtid;?>,3)" class="btn bg-red btn-xs col-lg-12"><div class="inner"><h4>Pending</h4></div></a> + </div> + <div class="col-lg-4"> + <a href='#' onclick='ubahklinik(<?php echo $ppid;?>,<?php echo $kliid;?>,<?php echo $prtid;?>)' class='btn btn-warning btn-xs col-lg-12' data-toggle='modal' data-target='#ubah_klinik'><div class="inner"><h4>Ubah Klinik</h4></div></a> + </div> + <div class="col-lg-4"> + <a href="#" onclick="terlambat(<?php echo $prtid;?>)" class="btn bg-black btn-xs col-lg-12"><div class="inner"><h4>Terlambat</h4></div></a> + </div> + </div> + <?php } ?> + </div> + </div> + </div> + <div class="col-xs-12"> + <div class="box box-success"> + <div class="box-body"> + <?php if($this->session->flashdata('message')){?> + <div class="alert alert-success alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-check"></i> Alert!</h4> + <?php echo $this->session->flashdata('message');?> + </div> + <?php }?> + + <?php if($this->session->flashdata('messagefalse')){?> + <div class="alert alert-danger alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-check"></i> Alert!</h4> + <?php echo $this->session->flashdata('messagefalse');?> + </div> + <?php }?> + + + <div class="box-body table-responsive no-padding"> + <table id="example1" class="table table-bordered table-striped"> + <thead> + <tr> + <th width="5%">No</th> + <th>Jam Panggil</th> + <th>Barcode</th> + <th>No Antrean</th> + <th>Shift</th> + <th>Klinik</th> + <th>Fast Track</th> + <th>Pembayaran</th> + <th width="5%">Panggil</th> + <th width="20%">Aksi</th> + </tr> + </thead> + <tbody> + <?php + $no=0;$color="";$pj=""; $np=""; $ket=""; $rm="";$buttonviewft="";$nomorurut=0; + foreach ($pg as $pengunjung) { + if($pengunjung->pp_loket==$this->session->userdata('s_loket')){ + $rm=$pengunjung->pp_rekamedik; + if(isset($pengunjung->pp_fasttrack)){ + $color= "style='background-color: #FFB6C1;'"; + $pecahdata=explode("|",$pengunjung->pp_fasttrack); + $pj=$pecahdata[0]; + $np=$pecahdata[1]; + $ket=$pecahdata[2]; + $buttonviewft="<a href='#' onclick='viewfasttrack($pengunjung->pp_id,$pengunjung->pp_rekamedik)' class='btn btn-primary btn-xs' data-toggle='modal' data-target='#fasttrack'>View Fastrack</a>"; + } + + //------------start data pasien pendaftaran online--------------// + if($online==2){ + if($pengunjung->pp_pembayaran==$pembayaran){ + $color2= "style='background-color: #F0E68C;'"; + if($pengunjung->pp_pendaftaran_online!=null){ + $setbutton=""; + $no++; + + if($klinik){ + $klinikpecah = explode(",",$klinik); + $jumlah = count($klinikpecah); + for($i=0;$i<$jumlah;$i++){ + if($klinikpecah[$i]==$pengunjung->pp_klinik_id){ + $buttonpanggil = ""; + if($pengunjung->pp_panggil==null){ + $buttonpanggil = "<button onclick='panggiladd($pengunjung->prt_id,$pengunjung->pp_id)' class='btn btn-info btn-xs'>Panggil</button>"; + }else{ + $buttonpanggil = "<button class='btn bg-navy btn-xs'>Tunggu</button> "; + } + if($pengunjung->pp_panggil_anjungan==null){ + $buttonanjungan = "<button onclick='panggilanjungan($pengunjung->prt_id,$pengunjung->pp_id)' class='btn btn-primary btn-xs'>Call Outside</button>"; + }else{ + $buttonanjungan = "<button class='btn bg-navy btn-xs'>Tunggu</button> "; + } + + //--------------login sebagai user loket + if($pengunjung->prt_status==0){ + $setbutton = "<code> Belum Barcode </code> $buttonanjungan <a onclick='terlambat($pengunjung->prt_id)' href='#' class='btn bg-black btn-xs'>Terlambat</a> + <a onclick='barcode($pengunjung->prt_id)' href='#' class='btn btn-primary btn-xs'>Barcode</a> + "; + }elseif($pengunjung->prt_status==1){ + + $setbutton =" + <a href='".base_url()."index.php/ps_loket_admin/proses_admin/".$pengunjung->prt_id."/2' class='btn btn-primary btn-xs'>Proses</a> + <a onclick='prosses($pengunjung->prt_id,$pengunjung->pp_id)' class='btn btn-success btn-xs' data-toggle='modal' data-target='#proses_P'>Selesai</a> + "; + + }elseif($pengunjung->prt_status==2){ + $setbutton = " + <a onclick='prosses($pengunjung->prt_id,$pengunjung->pp_id)' class='btn btn-success btn-xs' data-toggle='modal' data-target='#proses_P'>Selesai</a> + <a onclick='pending($pengunjung->prt_id,3)' href='#' class='btn btn-danger btn-xs'>Pending</a> + <a href='#' onclick='ubahklinik($pengunjung->pp_id,$pengunjung->pp_klinik_id,$pengunjung->prt_id)' class='btn btn-warning btn-xs' data-toggle='modal' data-target='#ubah_klinik'>Ubah Klinik</a> + <a onclick='terlambat($pengunjung->prt_id)' href='#' class='btn bg-black btn-xs'>Terlambat</a>"; + + }elseif($pengunjung->prt_status==3){ + $setbutton = " + <a onclick='prosses($pengunjung->prt_id,$pengunjung->pp_id)' class='btn btn-success btn-xs' data-toggle='modal' data-target='#proses_P'>Pending Selesai</a> + <a href='#' onclick='ubahklinik($pengunjung->pp_id,$pengunjung->pp_klinik_id,$pengunjung->prt_id)' class='btn btn-warning btn-xs' data-toggle='modal' data-target='#ubah_klinik'>Ubah Klinik</a> + <a onclick='terlambat($pengunjung->prt_id)' href='#' class='btn bg-black btn-xs'>Terlambat</a> + "; + } + // else{ + // $setbutton = "<p class='text-green'>Menunggu Panggilan Klinik</p>"; + // } + echo " + <input hidden='' id='rm$pengunjung->pp_id' name='rm$pengunjung->pp_id' value='$rm' /> + <input hidden='' id='pj$pengunjung->pp_id' name='pj$pengunjung->pp_id' value='$pj' /> + <input hidden='' id='np$pengunjung->pp_id' name='np$pengunjung->pp_id' value='$np' /> + <input hidden='' id='ket$pengunjung->pp_id' name='ket$pengunjung->pp_id' value='$ket' />"; + + + if($pengunjung->prt_status!=4){ + $nomorurut++; + ?> + <tr <?php echo $color2;?>> + <input type="hidden" id="idklinik_fp<?php echo $pengunjung->prt_id;?>" value="<?php echo $pengunjung->pp_klinik_id;?>" /> + <input type="hidden" id="kodeklinik_fp<?php echo $pengunjung->prt_id;?>" value="<?php echo $pengunjung->mk_kode;?>" /> + <input type="hidden" id="no_antrian<?php echo $pengunjung->prt_id;?>" value="<?php echo $pengunjung->pp_nomor_antrian;?>" /> + <input type="hidden" id="iddat_fast<?php echo $pengunjung->prt_id;?>" value="<?php echo $pengunjung->pp_fasttrack;?>" /> + <td><?php echo $nomorurut;?></td> + <td><?php echo date("H:i", strtotime($pengunjung->prt_tanggal));?></td> + <td><?php echo $pengunjung->pp_barcode;?></td> + <td><?php echo $pengunjung->pp_nomor_antrian; if($pengunjung->pp_pendaftaran_online){echo " | Online - ".$pengunjung->pp_pendaftaran_online;}?></td> + <td>Shift <?php echo $pengunjung->pp_shift;?></td> + <td><?php echo $pengunjung->mk_nama;?></td> + <td><?php echo $buttonviewft;?></td> + <td> + <?php + if($pengunjung->pp_pembayaran==1){echo "UMUM";} + if($pengunjung->pp_pembayaran==2){echo "JKN";} + ?> + </td> + <td><?php echo $buttonpanggil;?></td> + <td><?php echo $setbutton;?></td> + </tr> + <?php + } + } + } + } + $color=""; + } + } + } + //------------end data pasien pendaftaran online--------------// + + if($pengunjung->pp_pembayaran==$pembayaran){ + if($pengunjung->pp_pendaftaran_online==null){ + $setbutton=""; + if($klinik){ + $klinikpecah = explode(",",$klinik); + $jumlah = count($klinikpecah); + for($i=0;$i<$jumlah;$i++){ + if($klinikpecah[$i]==$pengunjung->pp_klinik_id){ + $buttonpanggil = ""; + $no++; + if($pengunjung->pp_panggil_anjungan==null){ + $buttonanjungan = "<button onclick='panggilanjungan($pengunjung->prt_id,$pengunjung->pp_id)' class='btn btn-primary btn-xs'>Call Outside</button>"; + }else{ + $buttonanjungan = "<button class='btn bg-navy btn-xs'>Tunggu</button> "; + } + + if($pengunjung->pp_panggil==null){ + if($pengunjung->prt_status==0){$buttonpanggil = $buttonanjungan; + }else{$buttonpanggil = "<button onclick='panggiladd($pengunjung->prt_id,$pengunjung->pp_id)' class='btn btn-info btn-xs'>Panggil</button>";} + }else{$buttonpanggil = "<button class='btn bg-navy btn-xs'>Tunggu</button> ";} + + //--------------login sebagai user loket + if($pengunjung->prt_status==0){ + $setbutton = "<code> Belum Barcode </code> <a onclick='terlambat($pengunjung->prt_id)' href='#' class='btn bg-black btn-xs'>Terlambat</a> + <a onclick='barcode($pengunjung->prt_id)' href='#' class='btn btn-primary btn-xs'>Barcode</a>"; + }elseif($pengunjung->prt_status==1){ + $setbutton =" + <a href='".base_url()."index.php/ps_loket_admin/proses_admin/".$pengunjung->prt_id."/2' class='btn btn-primary btn-xs'>Proses</a> + <a onclick='prosses($pengunjung->prt_id,$pengunjung->pp_id)' class='btn btn-success btn-xs' data-toggle='modal' data-target='#proses_P'>Selesai</a> + "; + }elseif($pengunjung->prt_status==2){ + $setbutton = "<a onclick='prosses($pengunjung->prt_id,$pengunjung->pp_id)' class='btn btn-success btn-xs' data-toggle='modal' data-target='#proses_P'>Selesai</a> + <a onclick='pending($pengunjung->prt_id,3)' href='#' class='btn btn-danger btn-xs'>Pending</a> + <a href='#' onclick='ubahklinik($pengunjung->pp_id,$pengunjung->pp_klinik_id,$pengunjung->prt_id)' class='btn btn-warning btn-xs' data-toggle='modal' data-target='#ubah_klinik'>Ubah Klinik</a> + <a onclick='terlambat($pengunjung->prt_id)' href='#' class='btn bg-black btn-xs'>Terlambat</a> + "; + }elseif($pengunjung->prt_status==3){ + $setbutton = "<a onclick='prosses($pengunjung->prt_id,$pengunjung->pp_id)' class='btn btn-success btn-xs' data-toggle='modal' data-target='#proses_P'>Pending Selesai</a> + <a href='#' onclick='ubahklinik($pengunjung->pp_id,$pengunjung->pp_klinik_id,$pengunjung->prt_id)' class='btn btn-warning btn-xs' data-toggle='modal' data-target='#ubah_klinik'>Ubah Klinik</a> + <a onclick='terlambat($pengunjung->prt_id)' href='#' class='btn bg-black btn-xs'>Terlambat</a>"; + } + // else{ + // $setbutton = "<a class='text-green'>Menunggu Klinik</a> + // <a href='".base_url()."index.php/ps_loket_admin/cetakulang/".$pengunjung->pp_id."' class='btn btn-success btn-xs'>Print Ulang</a>"; + // } + echo " <input hidden='' id='rm$pengunjung->pp_id' name='rm$pengunjung->pp_id' value='$rm' /> + <input hidden='' id='pj$pengunjung->pp_id' name='pj$pengunjung->pp_id' value='$pj' /> + <input hidden='' id='np$pengunjung->pp_id' name='np$pengunjung->pp_id' value='$np' /> + <input hidden='' id='ket$pengunjung->pp_id' name='ket$pengunjung->pp_id' value='$ket' />"; + + if($pengunjung->prt_status!=4){ + $nomorurut++; + ?> + <tr <?php echo $color;?>> + <input type="hidden" id="idklinik_fp<?php echo $pengunjung->prt_id;?>" value="<?php echo $pengunjung->pp_klinik_id;?>" /> + <input type="hidden" id="kodeklinik_fp<?php echo $pengunjung->prt_id;?>" value="<?php echo $pengunjung->mk_kode;?>" /> + <input type="hidden" id="no_antrian<?php echo $pengunjung->prt_id;?>" value="<?php echo $pengunjung->pp_nomor_antrian;?>" /> + <input type="hidden" id="iddat_fast<?php echo $pengunjung->prt_id;?>" value="<?php echo $pengunjung->pp_fasttrack;?>" /> + <td><?php echo $nomorurut;?></td> + <td><?php echo date("H:i", strtotime($pengunjung->prt_tanggal));?></td> + <td><?php echo $pengunjung->pp_barcode;?></td> + <td><?php echo $pengunjung->pp_nomor_antrian; if($pengunjung->pp_pendaftaran_online){echo " | Online - ".$pengunjung->pp_pendaftaran_online;}?></td> + <td>Shift <?php echo $pengunjung->pp_shift;?></td> + <td><?php echo $pengunjung->mk_nama;?></td> + <td><?php echo $buttonviewft;?></td> + <td> + <?php + if($pengunjung->pp_pembayaran==1){echo "UMUM";} + if($pengunjung->pp_pembayaran==2){echo "JKN";} + ?> + </td> + <td><?php echo $buttonpanggil;?></td> + <td><?php echo $setbutton;?></td> + </tr> + <?php + } + } + } + } + } + }$color="";$buttonviewft="";$pj=""; $np=""; $ket="";$rm=""; + } + } + ?> + </tbody> + </table> + <input id="jumpas" type="hidden" value="<?php echo $no;?>" /> + </div> + <br /> + </div><!-- /.box-body --> + </div><!-- /.box --> + <h1><span class="label bg-aqua col-sm-12"> Total Quota Terpakai <?php echo $no;?> </span></h1> + <br /><br /><br /> + <div class="box box-warning"> + <div class="box-body"> + <div class="box-header"> + <h3 class="box-title">Info Pasien Lapor Terlambat</h3> + <code>Aktifkan Pasien Milik Anda SAJA!!</code> + </div> + <div class="box-body table-responsive no-padding"> + <table id="example3" class="table table-bordered table-striped"> + <thead> + <tr> + <th>No</th> + <th>Barcode</th> + <th>No Antrean</th> + <th>Shift</th> + <th>Klinik</th> + <th>Aksi</th> + </tr> + </thead> + <tbody> + <?php + $nom =0; + foreach($tr as $datterlambat){ $nom++; + $po=""; + if($datterlambat->pp_pendaftaran_online){$po = " Online - ".$datterlambat->pp_pendaftaran_online;} + echo " + <tr> + <td>$nom</td> + <td>$datterlambat->pp_barcode</td> + <td>$datterlambat->pp_nomor_antrian $po</td> + <td>Shift $datterlambat->pp_shift</td> + <td>$datterlambat->mk_nama</td> + <td><a onclick='aktif($datterlambat->prt_id)' href='#' class='btn-success btn-xs'>Aktif</a></td> + </tr>"; + } ?> + </tbody> + </table> + </div> + </div> + </div> + <div class="box box-danger"> + <div class="box-body"> + <div class="box-header"> + <h3 class="box-title">Info Pasien Masuk Klinik</h3> + </div> + <div class="box-body table-responsive no-padding"> + <table id="example2" class="table table-bordered table-striped"> + <thead> + <tr> + <th style="width: 10px">#</th> + <th>Barcode</th> + <th>No Antrean</th> + <th>No Klinik</th> + <th>No RM</th> + <th>Shift</th> + <th>Klinik</th> + <th>Fast Track</th> + <th>Pembayaran</th> + <th>Aksi</th> + </tr> + </thead> + <tbody> + <?php + $nopeng=0; + foreach ($pk as $pengunjung) { + if($pengunjung->pp_pembayaran==$pembayaran){ + if($online==2){ + if($pengunjung->pp_pendaftaran_online!=null){ + $klinikpecah = explode(",",$klinik); + $jumlah = count($klinikpecah); + for($i=0;$i<$jumlah;$i++){ + if($klinikpecah[$i]==$pengunjung->pp_klinik_id){ + $nopeng++; + ?> + <tr> + <td><?php echo $nopeng;?></td> + <td><?php echo $pengunjung->pp_barcode;?></td> + <td><?php echo $pengunjung->pp_nomor_antrian." | Online - ".$pengunjung->pp_pendaftaran_online;?></td> + <td><?php echo $pengunjung->pp_nomor_antrian_klinik;?></td> + <td><?php echo $pengunjung->pp_rekamedik;?></td> + <td><?php echo "Shift ".$pengunjung->pp_shift;?></td> + <td><?php echo $pengunjung->mk_nama;?></td> + <td><?php if($pengunjung->pp_fasttrack!=null){echo "Pasien Fast Track";}?></td> + <td><?php + if($pengunjung->pp_pembayaran==1){echo "UMUM";} + if($pengunjung->pp_pembayaran==2){echo "JKN";} + ?> + </td> + <td> + <?php + if($pengunjung->prt_status==4){ + echo "<a class='text-green'>Menunggu Klinik</a> <a href='".base_url()."index.php/ps_loket_admin/cetakulang/".$pengunjung->pp_id."' class='btn btn-success btn-xs'>Print Ulang</a>"; + }else{ + echo "<code>Masuk Klinik</code>"; + } + ?> + </td> + </tr> + <?php + } + } + } + + } + if($pengunjung->pp_pendaftaran_online==null){ + $klinikpecah = explode(",",$klinik); + $jumlah = count($klinikpecah); + for($i=0;$i<$jumlah;$i++){ + if($klinikpecah[$i]==$pengunjung->pp_klinik_id){ + $nopeng++; + ?> + <tr> + <td><?php echo $nopeng;?></td> + <td><?php echo $pengunjung->pp_barcode;?></td> + <td><?php echo $pengunjung->pp_nomor_antrian;?></td> + <td><?php echo $pengunjung->pp_nomor_antrian_klinik;?></td> + <td><?php echo $pengunjung->pp_rekamedik;?></td> + <td><?php echo "Shift ".$pengunjung->pp_shift;?></td> + <td><?php echo $pengunjung->mk_nama;?></td> + <td><?php if($pengunjung->pp_fasttrack!=null){echo "Pasien Fast Track";}?></td> + <td><?php + if($pengunjung->pp_pembayaran==1){echo "UMUM";} + if($pengunjung->pp_pembayaran==2){echo "JKN";} + ?> + </td> + <td> + <?php + if($pengunjung->prt_status==4){ + echo "<a class='text-green'>Menunggu Klinik</a> <a href='".base_url()."index.php/ps_loket_admin/cetakulang/".$pengunjung->pp_id."' class='btn btn-success btn-xs'>Print Ulang</a>"; + }else{ + echo "<code>Masuk Klinik</code>"; + } + ?> + </td> + </tr> + <?php + } + } + } + } + } + + ?> + + </tbody> + </table> + </div> + </div> + </div> + <div class="box box-primary"> + <div class="box-body"> + <div class="box-header"> + <h3 class="box-title">Info Klinik</h3> + </div> + <div class="box-body table-responsive no-padding"> + <table class="table table-striped"> + <tbody> + <tr> + <th style="width: 10px">#</th> + <th>Klinik</th> + <th>Jumlah Shift</th> + <th>Quota Per Shift</th> + <th>Status</th> + <th>Dapat Di Panggil</th> + <th>Shift Belum Buka</th> + <!--th>Barcode</th> + <th>Terlambat</th> + <th>Proses</th> + <th>Selesai</th> + <th>Total</th> + <th colspan="2" style="text-align: center;">Progres</th--> + </tr> + <?php + $totalddp=0; + $totalsbb=0; + $totalps=0; + $totalbc=0; + $totaltlb=0; + $totalsls=0; + + $totalall=0; + if(isset($idklinik)){ + $exidklinik = explode('|', $idklinik); + $exshiftbuka = explode('|', $shiftbuka); + $exnamaklinik = explode('|', $namaklinik); + $exaktifklinik = explode('|', $aktifklinik); + $exjumshift = explode('|', $jumshift); + $exshiftpenuh = explode('|', $shiftpenuh); + $exquotaklinik = explode('|', $quotaklinik); + + $jumdat = count($exidklinik); $status=""; + $nomor=0; + $ddp=0;//-----dapat di panggil + $sbb=0;//-----shift belum buka + $ps=0;//------pengunjung proses + $bc=0;//------pengunjung barcode + $tlb=0;//-----pengunjung terlambat + $sls=0;//-----pengunjung selesai + for($i=0;$i<$jumdat;$i++){$nomor++; + if($exnamaklinik[$i]){ + + foreach ($ip as $infopengunjung){ + if($infopengunjung->pp_klinik_id==$exidklinik[$i]){ + if($infopengunjung->pp_status==null){ + if($infopengunjung->pp_shift<=$exshiftbuka[$i]){ + if($infopengunjung->pp_pembayaran==$pembayaran){$ddp++;} + }else{ + if($infopengunjung->pp_pembayaran==$pembayaran){$sbb++;} + } + }else{ + //------------cek posisi pengunjung -> barcode + $this->db->where('prt_pengunjung_id', $infopengunjung->pp_id); + $prt = $this->db->get('proses_ruang_tunggu'); + foreach ($prt->result() as $datprt){ + if($datprt->prt_status==0&&$datprt->prt_aktif==0){ + $bc++; + }elseif($datprt->prt_aktif==1){ + $tlb++; + }elseif($datprt->prt_status>0&&$datprt->prt_status<=3){ + $ps++; + }elseif($datprt->prt_status==4){ + $sls++; + } + } + + } + } + } + $hitpersentase=0;$warnabar="";$warnalabel=""; + if($ddp+$sbb+$ps+$bc+$tlb+$sls!=0){ + $hitpersentase=(($sls)/($ddp+$sbb+$ps+$bc+$tlb+$sls))*100; + } + if($exshiftpenuh[$i]==1){$status="<code>Penuh</code>";}elseif($exaktifklinik[$i]==0||$hitpersentase!=0){$status="Buka - Shift ".$exshiftbuka[$i];}else{$status="<code>Tutup</code>";} + + //-------0-25 + if($hitpersentase<=25){$warnabar="progress-bar-danger";$warnalabel="bg-red";} + //-------0-50 + elseif($hitpersentase<=50){$warnabar="progress-bar-warning";$warnalabel="bg-yellow";} + //-------0-75 + elseif($hitpersentase<=75){$warnabar="progress-bar-primary";$warnalabel="bg-blue";} + //-------0-100 + elseif($hitpersentase<=100){$warnabar="progress-bar-success";$warnalabel="bg-green";} + ?> + <tr> + <td><?php echo $nomor;?></td> + <td><?php echo $exnamaklinik[$i];?></td> + <td><?php echo $exjumshift[$i]." Shift";?></td> + <td><?php echo $exquotaklinik[$i];?></td> + <td><?php echo $status;?></td> + <td><?php if($ddp==0){echo "-";}else{echo $ddp;} ?></td> + <td><?php if($sbb==0){echo "-";}else{echo $sbb;} ?></td> + <!--td><?php if($bc==0){echo "-";}else{echo $bc;} ?></td> + <td><?php if($tlb==0){echo "-";}else{echo $tlb;} ?></td> + <td><?php if($ps==0){echo "-";}else{echo $ps;} ?></td> + <td><?php if($sls==0){echo "-";}else{echo $sls;} ?></td> + <td><?php if($ddp+$sbb+$ps+$bc+$tlb+$sls==0){echo "-";}else{echo $ddp+$sbb+$ps+$bc+$tlb+$sls;}?></td> + <td style="width: 15%"> + <div class="progress progress-xs"> + <div class="progress-bar <?php echo $warnabar;?>" style="width: <?php echo round($hitpersentase,1); ?>%"></div> + </div> + </td> + <td style="width: 40px"><span class="badge <?php echo $warnalabel;?>"><?php echo round($hitpersentase,1);?>%</span></td--> + </tr> + <?php + $totalddp=$totalddp+$ddp; + $totalsbb=$totalsbb+$sbb; + $totalps=$totalps+$ps; + $totalbc=$totalbc+$bc; + $totaltlb=$totaltlb+$tlb; + $totalsls=$totalsls+$sls; + + $totalall=$totalall+$ddp+$sbb+$ps+$bc+$tlb+$sls; + //--------untuk reset nilai-------------// + $ddp=0;$sbb=0;$ps=0;$hitpersentase=0;$bc=0;$tlb=0;$sls=0; + } + } + } + + $hitpersentase2=0;$warnabar2="";$warnalabel2=""; + if($totalddp+$totalsbb+$totalps+$totalbc+$totaltlb+$totalsls!=0){ + $hitpersentase2=(($totalsls)/($totalddp+$totalsbb+$totalps+$totalbc+$totaltlb+$totalsls))*100; + } + //-------0-25 + if($hitpersentase2<=25){$warnabar2="progress-bar-danger";$warnalabel2="bg-red";} + //-------0-50 + elseif($hitpersentase2<=50){$warnabar2="progress-bar-warning";$warnalabel2="bg-yellow";} + //-------0-75 + elseif($hitpersentase2<=75){$warnabar2="progress-bar-primary";$warnalabel2="bg-blue";} + //-------0-100 + elseif($hitpersentase2<=100){$warnabar2="progress-bar-success";$warnalabel2="bg-green";} + ?> + <?php //if($jumlahonline!=0){ $totalddp=$totalddp+$jumlahonline; ?> + <!--tr> + <th><?php echo $nomor;?></th> + <th>ONLINE</th> + <th></th> + <th></th> + <th></th> + <th><?php echo $jumlahonline;?></th> + <th></th> + </tr--> + <?php //}?> + <tr> + <th colspan="5">Total : </th> + <th><?php echo $totalddp;?></th> + <th><?php echo $totalsbb;?></th> + <!--th><?php echo $totalbc;?></th> + <th><?php echo $totaltlb;?></th> + <th><?php echo $totalps;?></th> + <th><?php echo $totalsls;?></th> + <th><?php echo $totalall;?></th> + <td> + <div class="progress progress-xs"> + <div class="progress-bar <?php echo $warnabar2;?>" style="width: <?php echo round($hitpersentase2,1); ?>%"></div> + </div> + </td> + <td><span class="badge <?php echo $warnalabel2;?>"><?php echo round($hitpersentase2,1); ?>%</span></td--> + </tr> + </tbody> + </table> + </div> + </div> + </div> + </div><!-- /.col --> + </div><!-- /.row --> + </section> + <div class="control-sidebar-bg"></div> +</body> +<script> + function ubahklinik(id,kl,prt){ + document.getElementById('idpengunjung').value=id; + document.getElementById('klinik').value=kl; + document.getElementById('idprt').value=prt; + } + + function prosses(idprt,idpp){ + document.getElementById('idprt_proses').value=idprt; + document.getElementById('idpp_proses').value=idpp; + document.getElementById('idklinik_proses').value=document.getElementById('idklinik_fp'+idprt).value; + document.getElementById('kodeklinik_proses').value=document.getElementById('kodeklinik_fp'+idprt).value; + document.getElementById('loket_proses').value=document.getElementById('namaloket').value; + document.getElementById('norm').value=document.getElementById('rm'+idpp).value; + document.getElementById('data_fastrack').value=document.getElementById('iddat_fast'+idprt).value; + setrm(); + } +</script> +<div class="modal fade" id="ubah_klinik" tabindex="-1" role="dialog" aria-labelledby="largeModal" aria-hidden="true"> + <form class="form-horizontal" id="form_online" action="<?php echo(base_url()); ?>index.php/ps_loket_admin/ubahklinik" method="post" autocomplete="off"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button> + <h3 class="modal-title" id="myModalLabel">Ubah Klinik</h3> + </div> + <div class="modal-body"> + <input type="hidden" id="idpengunjung" name="idpengunjung" value="" /> + <input type="hidden" id="idprt" name="idprt" value="" /> + <div class="form-group"> + <label for="klinik" class="col-sm-2 control-label">Klinik</label> + <div class="col-sm-9"> + <select id="klinik" name="klinik" class="form-control select"> + <option value="0"> Pilih Klinik</option> + <?php foreach ($kl as $datklinik){ + echo "<option value='$datklinik->mk_id'> $datklinik->mk_nama</option>"; + }?> + </select> + </div> + </div> + <div class="form-group"> + <label for="pembayaran" class="col-sm-2 control-label">Pembayaran</label> + <div class="col-sm-9"> + <select id="pembayaran" name="pembayaran" class="form-control select"> + <option value=""> Pilih Pembayaran</option> + <option value="1"> UMUM / PENDAFTARAN ONLINE </option> + <option value="2"> JKN </option> + </select> + </div> + </div> + </div> + <div class="modal-footer"> + <button class="btn btn-success" type="submit"> Simpan </button> + <button class="btn" data-dismiss="modal" aria-hidden="true">Tutup</button> + </div> + </div> + </div> + </form> +</div> + +<div class="modal fade" id="proses_P" tabindex="-1" role="dialog" aria-labelledby="largeModal" aria-hidden="true"> + <form class="form-horizontal" id="prossespengunjung" action="<?php echo(base_url()); ?>index.php/ps_loket_admin/proses_pengunjung" method="post" autocomplete="off"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button> + <h3 class="modal-title" id="myModalLabel">Masukan Nomor RM - <code>Tidak Boleh Kosong</code></h3> + </div> + <div class="modal-body"> + <input type="hidden" id="idpp_proses" name="idpp_proses" value="" /> + <input type="hidden" id="idprt_proses" name="idprt_proses" value="" /> + <input type="hidden" id="idklinik_proses" name="idklinik_proses" value="" /> + <input type="hidden" id="kodeklinik_proses" name="kodeklinik_proses" value="" /> + <input type="hidden" id="loket_proses" name="loket_proses" value="" /> + <input type="hidden" id="data_fastrack" name="data_fastrack" value="" /> + <div class="form-group"> + <label for="norm" class="col-sm-2 control-label">RM</label> + <div class="col-sm-9"> + <input type="number" oninput="setrm()" id="norm" name="norm" value="" class="form-control select" /> + </div> + </div> + </div> + <div class="modal-footer"> + <button class="btn btn-success" disabled="" id="submit" type="submit"> Simpan </button> + <button class="btn" data-dismiss="modal" aria-hidden="true">Tutup</button> + </div> + </div> + </div> + </form> +</div> +<script> + function setrm(){ + if(document.getElementById('norm').value!=""){ + document.getElementById("submit").disabled = false; + } + } +</script> + +<script> +function viewfasttrack(id,rm){ + document.getElementById('idpengunjung').value=id; + document.getElementById('norek').value=rm; + document.getElementById('tbnsubmit').style.visibility = 'hidden'; + document.getElementById('penanggungjawab').value=document.getElementById('pj'+id).value; + document.getElementById('namapas').value=document.getElementById('np'+id).value; + document.getElementById('ket').value=document.getElementById('ket'+id).value; +} +</script> + +<div class="modal fade" id="fasttrack" tabindex="-1" role="dialog" aria-labelledby="largeModal" aria-hidden="true"> + <form class="form-horizontal" id="form_online" action="<?php echo(base_url()); ?>index.php/ps_fasttrack/set_fasttrack" method="post" autocomplete="off"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button> + <h3 class="modal-title" id="myModalLabel">Form Fast Track</h3> + </div> + <div class="modal-body"> + <input type="hidden" id="idpengunjung" name="idpengunjung" value="" /> + <input type="hidden" id="ppstatus" name="ppstatus" value="" /> + <div class="form-group"> + <label for="penanggungjawab" class="col-sm-4 control-label">Penanggung Jawab</label> + <div class="col-sm-7"> + <input type="text" disabled="" id="penanggungjawab" name="penanggungjawab" value="" class="form-control select" onkeyup="this.value = this.value.toUpperCase()"/> + </div> + </div> + <div class="form-group"> + <label for="norek" class="col-sm-4 control-label">No Rekamedik</label> + <div class="col-sm-7"> + <input type="number" disabled="" id="norek" name="norek" value="" class="form-control select" /> + </div> + </div> + <div class="form-group"> + <label for="namapas" class="col-sm-4 control-label">Nama Pasien</label> + <div class="col-sm-7"> + <input type="text" disabled="" id="namapas" name="namapas" value="" class="form-control select" onkeyup="this.value = this.value.toUpperCase()"/> + </div> + </div> + <div class="form-group"> + <label for="ket" class="col-sm-4 control-label">Alasan Fast Track</label> + <div class="col-sm-7"> + <textarea class="form-control select" disabled="" id="ket" name="ket" onkeyup="this.value = this.value.toUpperCase()" ></textarea> + </div> + </div> + </div> + <div class="modal-footer"> + <button class="btn btn-success" id="tbnsubmit" type="submit"> Simpan </button> + <button class="btn" data-dismiss="modal" aria-hidden="true">Tutup</button> + </div> + </div> + </div> + </form> +</div> +<script type="text/javascript"> + var url="<?php echo base_url();?>"; + function panggilpengunjung(jumlah){ + var quota =parseInt(document.getElementById('quotaloket').value); + var pasien =parseInt(document.getElementById('jumpas').value); + var jumquota = pasien+jumlah; + //alert (jumquota); + if(jumquota>quota){ + alert("Anda tidak bisa memanggil pengunjung, karena quota penuh"); + }else{ + var r=confirm("Apakah anda ingin memanggil pengunjung sebanyak "+jumlah+" orang?") + if (r==true) + window.location = url+"index.php/ps_loket_admin/panggilpengunjung/"+jumlah; + else + return false; + } + } + + function terlambat(id){ + var r=confirm("Apakah anda ingin melakukan terlambat ?") + if (r==true) + window.location = url+"index.php/ps_loket_admin/terlambat/"+id; + else + return false; + } + + function aktif(id){ + var r=confirm("Apakah anda ingin melakukan mengaktifkan kembali ?") + if (r==true) + window.location = url+"index.php/ps_loket_admin/aktif/"+id; + else + return false; + } + + function barcode(id){ + window.location = url+"index.php/ps_loket_admin/barcode/"+id; + } + + function pending(id,code){ + var r=confirm("Apakah anda ingin melakukan pending ?") + if (r==true) + window.location = url+"index.php/ps_loket_admin/proses_admin/"+id+"/"+code; + else + return false; + } + + setTimeout(function(){ + $(".alert").fadeTo(500, 0).slideUp(500, function() { + $(this).remove(); + }); + }, 1500); +</script> +<script type="text/javascript"> + +// function play (id){ +// var loket = document.getElementById('namaloket').value; +// var kode = document.getElementById('no_antrian'+id).value; +// var pecah = kode.split("",-2); +// var hasil = ""; +// for (i=0;i<6;i++){ +// if(i<=1){ +// hasil = hasil+" "+pecah[i]+" . "; +// }else{ +// hasil = hasil+" "+pecah[i]+", "; +// } +// +// } +// +// responsiveVoice.speak( +// "Nomor Antrian, "+hasil+" , ke "+loket , +// "Indonesian Female", +// { +// pitch: 1, +// rate: 0.6, +// volume: 1 +// } +// ); +// } + + function panggiladd(idprt,idpp){ + var loket = document.getElementById('idloket').value; + window.location = url+"index.php/ps_loket_admin/panggil_admin/"+idprt+"/"+idpp+"/"+loket; + } + + function panggiladdawal(idprt,idpp){ + var loket = document.getElementById('idloket').value; + window.location = url+"index.php/ps_loket_admin/panggil_admin_awal/"+idprt+"/"+idpp+"/"+loket; + } + + function panggilanjungan(idprt,idpp){ + window.location = url+"index.php/ps_loket_admin/panggil_anjungan_admin/"+idprt+"/"+idpp; + } + + </script> + \ No newline at end of file diff --git a/application/views/maintenance.php b/application/views/maintenance.php new file mode 100644 index 0000000..a592efe --- /dev/null +++ b/application/views/maintenance.php @@ -0,0 +1,26 @@ +<body class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h1> + <small></small> + </h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li class="active"><?php echo $title ?></li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="error-page"> + <h2 class="headline text-yellow"> 404</h2> + <div class="error-content"> + <h3><i class="fa fa-warning text-yellow"></i> Oops! Halaman Tidak Di temukan.</h3> + <p> + Mohon Maaf Halaman sedang dalam perbaikan "<strong>maintenance</strong>" , coba nanti beberapa saat lakukan refresh halaman ( F5 ). Terima kasih. . . . + </p> + <form class="search-form"> + </form> + </div><!-- /.error-content --> + </div><!-- /.error-page --> + </section><!-- /.content --> +</body> \ No newline at end of file diff --git a/application/views/pasien/form_pasien.php b/application/views/pasien/form_pasien.php new file mode 100644 index 0000000..eea8359 --- /dev/null +++ b/application/views/pasien/form_pasien.php @@ -0,0 +1,223 @@ +<section class="content-header"> + <h1> + <small></small> + </h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li><a href="<?php echo base_url()?>index.php/ps_pasien">Data Pasien</a></li> + <li class="active"><?php echo $title;?></li> + </ol> +</section> +<section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title"><?php echo $title; ?></h3> + </div> + <div class="box-body"> + <?php if(validation_errors()){ ?> + <div class="alert alert-danger alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4><i class="icon fa fa-ban"></i> Alert!</h4> + <?php echo validation_errors() ?> + </div> + <?php } + + $setdisabled =""; + $setidedit =""; + + $settgl_daftar =""; + $settgl_periksa =""; + $setbarcode =""; + $setno_antrian =""; + $setno_klinik =""; + $setno_rm =""; + $setklinik =""; + $setshift =""; + $setket_online =""; + $setket_konsul =""; + $setket_fasttrack =""; + $setpembayaran =""; + + + if ($actionform=="prosesview"){ + $setdisabled="disabled=''"; + } + if ($actionform!="prosesadd"){ + $setidedit =$mp->row('pp_id'); + + $settgl_daftar =$mp->row('pp_tanggal_datang'); + $settgl_periksa =$mp->row('pp_tanggal_periksa'); + $setbarcode =$mp->row('pp_barcode'); + $setno_antrian =$mp->row('pp_nomor_antrian'); + $setno_klinik =$mp->row('pp_nomor_antrian_klinik'); + $setno_rm =$mp->row('pp_rekamedik'); + $setklinik =$mp->row('pp_klinik_id'); + $setshift =$mp->row('pp_shift'); + $setket_online =$mp->row('pp_pendaftaran_online'); + $setket_konsul =$mp->row('pp_konsul'); + $setket_fasttrack =$mp->row('pp_fasttrack'); + $setpembayaran =$mp->row('pp_pembayaran'); + } + + ?> + <form class="form-horizontal" id="form" action="<?php echo(base_url()); ?>index.php/ps_pasien/<?php echo $actionform; ?>" method="post" autocomplete="off"> + <div class="box-body"> + <div class="form-group"> + <label for="tgldaftar" class="col-sm-2 control-label">Tanggal Daftar</label> + <div class="col-sm-6"> + <input type="hidden" name="id" value="<?php echo $setidedit;?>"/> + <input id="tgldaftar" class="form-control" disabled="" name="tgldaftar" type="text" placeholder="Masukan Tanggal Daftar" autocomplete="off" value="<?php echo $settgl_daftar;?>"/> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="tglperiksa" class="col-sm-2 control-label">Tanggal Periksa</label> + <div class="col-sm-6"> + <input id="tglperiksa" class="form-control" disabled="" name="tglperiksa" type="text" placeholder="Masukan Tanggal Periksa" autocomplete="off" value="<?php echo $settgl_periksa;?>"/> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="nobarcode" class="col-sm-2 control-label">No Barcode</label> + <div class="col-sm-6"> + <input id="nobarcode" class="form-control" disabled="" name="nobarcode" type="text" placeholder="Masukan Barcode" autocomplete="off" value="<?php echo $setbarcode;?>"/> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="noantrian" class="col-sm-2 control-label">No Antrian</label> + <div class="col-sm-6"> + <input id="noantrian" class="form-control" disabled="" name="noantrian" type="text" placeholder="Masukan Nomor Antrian" autocomplete="off" value="<?php echo $setno_antrian;?>"/> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="noklinik" class="col-sm-2 control-label">No Klinik</label> + <div class="col-sm-6"> + <input id="noklinik" class="form-control" disabled="" name="noklinik" type="text" placeholder="Belum Mendapatkan Antrian Klinik" autocomplete="off" value="<?php echo $setno_klinik;?>"/> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="norek" class="col-sm-2 control-label">No Rekamedik</label> + <div class="col-sm-6"> + <input id="norek" class="form-control" <?php echo $setdisabled; ?> name="norek" type="number" placeholder="Masukan Nomor Rekamedik" autocomplete="off" value="<?php echo $setno_rm;?>"/> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="klinik" class="col-sm-2 control-label">Klinik</label> + <div class="col-sm-6"> + <select disabled="" <?php //echo $setdisabled; ?> onchange="list_shift()" id="klinik" name="klinik" class="form-control select" > + <option value="">Pilih Klinik</option> + <?php + foreach ($mk as $dat) { + $select=""; + if($setklinik==$dat->mk_id){$select="selected='selected'";} + echo "<option value='".$dat->mk_id."'".$select.">".$dat->mk_nama."</option>"; + } + ?> + </select> + </div> + </div> + </div> + <script> + var url_data="<?php echo base_url();?>index.php/"; + function list_shift(a){ + document.getElementById("shift").value = "0"; + var items=""; + var pilih="selected='selected'"; + $("#shift").html(""); + $.ajax({ + type: "POST", + url: url_data+"ps_pasien/datashift", + dataType: "json", + data: "idklinik="+$('#klinik').val(), + success: function(result) { + items+="<option value='"+''+"' >"+'Pilih Shift'+"</option>"; + $.each(result, function(index, value) { + items+=value.datashift; + }); + $("#shift").html(items); + } + }); + } + + </script> + <div class="box-body"> + <div class="form-group"> + <label for="shift" class="col-sm-2 control-label">Shift</label> + <div class="col-sm-6"> + <select disabled="" <?php //echo $setdisabled; ?> id="shift" name="shift" class="form-control select"> + <option value=""> Pilih Shift </option> + <?php + foreach ($mk as $dat) { + $select=""; + if($setklinik==$dat->mk_id){ + $jumshift=$dat->mk_shift; + $jamshift=$dat->mk_jam_shift; + $pecahjamshift = explode("|",$jamshift); + $numpecah = 0; + + for($i=1;$i<=$jumshift;$i++){ + if($i==$setshift){$select="selected='selected'"; + }else{$select="";} + echo "<option value='$i' $select >Shift $i &plusmn Mulai Pukul $pecahjamshift[$numpecah] </option>"; + $numpecah++; + } + } + } + ?> + </select> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label class="col-sm-2 control-label">Keterangan</label> + <div class="col-sm-6"> + <label class="control-label"> + <?php + $cek=0; + if ($setket_online){echo "<code>PENDAFTARAN ONLINE</code> ";$cek=1;} + if ($setket_fasttrack){echo "<code>FASTTRACK</code> ";$cek=1;} + if ($setket_konsul){echo "<code>KONSUL</code> ";$cek=1;} + if ($cek==0){echo "<b>TIDAK ADA KETERANGAN</b>";} + ?> + </label> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="pembayaran" class="col-sm-2 control-label">Pembayaran</label> + <div class="col-sm-6"> + <select disabled="" <?php //echo $setdisabled; ?> id="pembayaran" name="pembayaran" class="form-control select" > + <option value="">Pilih Pembayaran</option> + <option value="1" <?php if($setpembayaran==1){echo "selected='selected'";}?> >UMUM / JKMM / SPM / JAMPERSAL / T4</option> + <option value="2" <?php if($setpembayaran==2){echo "selected='selected'";}?> >JKN</option> + </select> + </div> + </div> + </div> + <div class="box-footer"> + <a href="<?php echo base_url();?>index.php/ps_pasien" class="btn btn-default">Cancel</a> + <?php if ($actionform!="prosesview"){ ?> + <button type="submit" class="btn btn-warning">Submit</button> + <?php } ?> + </div> + </div> + </form> + </div> + </div> + </div> + </div> +</section> \ No newline at end of file diff --git a/application/views/pasien/v_pasien.php b/application/views/pasien/v_pasien.php new file mode 100644 index 0000000..cc0f155 --- /dev/null +++ b/application/views/pasien/v_pasien.php @@ -0,0 +1,143 @@ +<body class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h1> + <br /> + </h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li class="active"><?php echo $title ?></li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title"><?php echo $title ?></h3> + </div><!-- /.box-header --> + <div class="box-body"> + <?php if($this->session->flashdata('message')){?> + <div class="alert alert-success alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-check"></i> Alert!</h4> + <?php echo $this->session->flashdata('message');?> + </div> + <?php }?> + <div class="box-body table-responsive no-padding"> + <table id="example1" class="table table-bordered table-striped"> + <thead> + <tr> + <th width="5%">No</th> + <th>Tgl Daftar</th> + <th>No Barcode</th> + <th>No Antrian</th> + <th>No Klinik</th> + <th>RM</th> + <th>Klinik</th> + <th>Shift</th> + <th>Ket</th> + <th>Pembayaran</th> + <th>Status</th> + <th width="10%">Aksi</th> + </tr> + </thead> + <tbody> + <?php + $no=0; + foreach ($mp as $datapasien) { + $no++; + //---------------------start check access action-------------------// + $editbutton=""; + $deletebutton=""; + $viewbutton=""; + if(!empty($this->varedit)){ + $editbutton="<a href='".base_url()."index.php/ps_pasien/edit/".$datapasien->pp_id."' class='btn btn-warning btn-xs'><i class='fa fa-edit'></i> Edit</a> "; + } + if(!empty($this->vardelete)){ + $deletebutton="<a onclick='del(".$datapasien->pp_id.")' class='btn btn-danger btn-xs'><i class='fa fa-trash'></i> Delete</a><input type='hidden' id='isi".$datapasien->pp_id."' value='".$datapasien->pp_nomor_antrian."'> "; + } + if(!empty($this->varview)){ + $viewbutton="<a href='".base_url()."index.php/ps_pasien/view/".$datapasien->pp_id."' class='btn btn-primary btn-xs'><i class='fa fa-eye'></i> View</a> "; + } + //---------------------end check access action-------------------// + + $ketonline=""; + if($datapasien->pp_pendaftaran_online!=null){ + $ketonline="<code> Online $datapasien->pp_pendaftaran_online </code>"; + } + + $ketpembayaran=""; + if($datapasien->pp_pembayaran==2){ + $ketpembayaran="JKN"; + }else{ + $ketpembayaran="UMUM"; + } + + $ketkonsul=""; + if($datapasien->pp_konsul!=null){ + $ketkonsul="<code> Konsul </code>"; + } + + $ketfasttrack=""; + if($datapasien->pp_fasttrack!=null){ + $ketfasttrack="<code> Fast Track </code>"; + } + + $datastatus = $datapasien->prt_status; + $statusnya = ""; + switch ($datastatus) { + case "0":$statusnya = "Barcode";break; + case "1":$statusnya = "Tunggu Daftar";break; + case "2":$statusnya = "Proses Daftar";break; + case "3":$statusnya = "Pending Daftar";break; + case "4":$statusnya = "Tunggu Klinik";break; + case "5":$statusnya = "Panggil Klinik";break; + case "6":$statusnya = "Tunggu Proses Klinik";break; + case "7":$statusnya = "Proses Klinik";break; + case "8":$statusnya = "Pending Klinik";break; + case "9":$statusnya = "Selesai";break; + default:$statusnya = "Anjungan"; + } + + echo(" + <tr> + <td>".$no."</td> + <td>".$datapasien->pp_tanggal_datang."</td> + <td>".$datapasien->pp_barcode."</td> + <td>".$datapasien->pp_nomor_antrian."</td> + <td>".$datapasien->pp_nomor_antrian_klinik."</td> + <td>".$datapasien->pp_rekamedik."</td> + <td>".$datapasien->mk_nama."</td> + <td>Shift ".$datapasien->pp_shift."</td> + <td>".$ketonline.$ketkonsul.$ketfasttrack."</td> + <td>".$ketpembayaran."</td> + <td>".$statusnya."</td> + <td>".$viewbutton.$editbutton."</td> + </tr> + "); + + } + ?> + </tbody> + </table> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + </section> + <div class="control-sidebar-bg"></div> +</body> +<script type="text/javascript"> + var url="<?php echo base_url();?>"; + function del(id){ + var isi=document.getElementById('isi'+id).value; + var r=confirm("Apakah anda ingin menghapus user "+isi+"?") + if (r==true) + window.location = url+"index.php/ps_pasien/delete/"+id; + else + return false; + } +</script> \ No newline at end of file diff --git a/application/views/print/print_anjungan/p_fasttrack.php b/application/views/print/print_anjungan/p_fasttrack.php new file mode 100644 index 0000000..fd617eb --- /dev/null +++ b/application/views/print/print_anjungan/p_fasttrack.php @@ -0,0 +1,195 @@ +<?php + + //phpinfo(); + $idpp = ""; + $klinik = ""; + $tglperiksa = ""; + $shift = ""; + $noantrian = ""; + $loket = ""; + $jambuka = ""; + $barcode = ""; + $tgldaftar = ""; + $rekamedik = ""; + $nodafonline= ""; + $pembayaran = ""; + $namapembayaran = ""; + + foreach ($dp as $datapasien){ + $idpp =$datapasien->pp_id; + $klinik =$datapasien->mk_nama; + $tglperiksa =date("d/m/Y", strtotime($datapasien->pp_tanggal_periksa)); + $shift =$datapasien->pp_shift; + $noantrian =$datapasien->pp_nomor_antrian; + $barcode =$datapasien->pp_barcode; + $jambuka =$datapasien->mk_jam_shift; + $tgldaftar =date("d/m/Y", strtotime($datapasien->pp_tanggal_datang)); + $rekamedik =$datapasien->pp_rekamedik; + $nodafonline=$datapasien->pp_pendaftaran_online; + $pembayaran =$datapasien->pp_pembayaran; + if($pembayaran==1){$namapembayaran="UMUM/DLL";} + if($pembayaran==2){$namapembayaran="JKN";} + } + + $pecahjambuka = explode("|",$jambuka); + + $pelayanan = ""; + foreach ($lk as $dataloket){ + $pecahpelayanan = explode(",",$dataloket->ml_pelayanan); + $jumlayanan = count($pecahpelayanan); + for ($x = 0; $x < $jumlayanan; $x++){ + if($pecahpelayanan[$x]==$idklinik){ + if($pembayaran==$dataloket->ml_pembayaran){ + $pelayanan=$pelayanan." | ".$dataloket->ml_nama; + } + } + } + } + $pelayanan=$pelayanan." | "; + +?> +<table style="margin-left: auto; margin-right: auto; font-family: arial; "> + <tr> + <th colspan="3"> + Nomor Antrian + </th> + </tr> + <tr><td> </td></tr> + <tr><td> </td></tr> + <tr> + <th colspan="3"><h1><?php echo $noantrian;?></h1></th> + </tr> + <tr> + <th style="text-align: left;"> + Klinik + </th> + <th>:</th> + <td> + <?php echo $klinik;?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + No. Shift + </th> + <th>:</th> + <td> + SHIFT <?php echo $shift;?> + </td> + </tr> + <?php if($ket==3){?> + <tr> + <th style="text-align: left;"> + No. Rekamedik + </th> + <th>:</th> + <td> + <?php echo $rekamedik;?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + Daftar Online + </th> + <th>:</th> + <td> + <?php echo $nodafonline;?> + </td> + </tr> + <?php }?> + <tr> + <th style="text-align: left;"> + Shift Buka + </th> + <th>:</th> + <td> + <?php echo $pecahjambuka[($shift-1)];?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + Tgl Periksa + </th> + <th>:</th> + <td> + <?php echo $tglperiksa;?> + </td> + </tr> + <?php if($ket==2){?> + <tr> + <th style="text-align: left;"> + Tgl Pesan + </th> + <th>:</th> + <td> + <?php echo $tgldaftar;?> + </td> + </tr> + <?php }?> + <tr> + <th style="text-align: left;"> + Ket. + </th> + <th>:</th> + <th> + <u>FASTTRACK</u> + </th> + </tr> + <tr> + <th style="text-align: left;"> + Pembayaran + </th> + <th>:</th> + <td> + <?php echo $namapembayaran;?> + </td> + </tr> + <tr> + <td style="text-align: center;" colspan="3"><?php echo $pelayanan; ?></td> + </tr> + <tr><td> </td></tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3"><?php echo '<img src="'.base_url().'/assets/php-barcode-master/barcode.php?text='.$barcode.'&print=true&size=30" />';?></td> + </tr> + <tr> + <td style="font-size: 11px; text-align: center;" colspan="3">Jangan sampai hilang, tidak dapat di cetak ulang</td> + </tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3">Tgl Cetak : <?php echo date('d/m/Y H:i:s')?></td> + </tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3">RSUD Dr. Saiful Anwar Malang</td> + </tr> + + +</table> +<input hidden="" id="ket" value="<?php echo $ket;?>" /> +<input hidden="" id="idpp" value="<?php echo $idpp;?>" /> + +<script> + var url="<?php echo base_url();?>"; + var ket = document.getElementById("ket").value; + var idpp = document.getElementById("idpp").value; + + window.print(); + var ket = document.getElementById("ket").value; + window.addEventListener('afterprint', (event) => { +// window.location = url+"index.php/ps_anjungan/print_pengantar/"+idpp+"/"+ket; + if(ket==3){ + window.location = url+"index.php/ps_anjungan/admin_anjungan"; + }else{ + window.location = url+"index.php/ps_anjungan"; + } + }); + + setTimeout(function(){ + if(ket==3){ + window.location = url+"index.php/ps_anjungan/admin_anjungan"; + }else{ + window.location = url+"index.php/ps_anjungan"; + + } + }, 1000); +</script> + +<?php //redirect('index.php/ps_anjungan');?> diff --git a/application/views/print/print_anjungan/p_fasttrack2.php b/application/views/print/print_anjungan/p_fasttrack2.php new file mode 100644 index 0000000..aa5a8b0 --- /dev/null +++ b/application/views/print/print_anjungan/p_fasttrack2.php @@ -0,0 +1,163 @@ +<?php + + //phpinfo(); + $idpp = ""; + $klinik = ""; + $tglperiksa = ""; + $shift = ""; + $noantrian = ""; + $loket = ""; + $jambuka = ""; + $barcode = ""; + $tgldaftar = ""; + $rekamedik = ""; + $nodafonline= ""; + $idklinik = ""; + $pembayaran = ""; + $namapembayaran = ""; + + foreach ($cu as $datapasien){ + $idpp =$datapasien->pp_id; + $klinik =$datapasien->mk_nama; + $tglperiksa =date("d/m/Y", strtotime($datapasien->pp_tanggal_periksa)); + $shift =$datapasien->pp_shift; + $noantrian =$datapasien->pp_nomor_antrian; + $barcode =$datapasien->pp_barcode; + $jambuka =$datapasien->mk_jam_shift; + $tgldaftar =date("d/m/Y", strtotime($datapasien->pp_tanggal_datang)); + $rekamedik =$datapasien->pp_rekamedik; + $nodafonline=$datapasien->pp_pendaftaran_online; + $idklinik =$datapasien->mk_id; + $pembayaran =$datapasien->pp_pembayaran; + if($pembayaran==1){$namapembayaran="UMUM/DLL";} + if($pembayaran==2){$namapembayaran="JKN";} + } + + $pecahjambuka = explode("|",$jambuka); + + $pelayanan = ""; + foreach ($lk as $dataloket){ + $pecahpelayanan = explode(",",$dataloket->ml_pelayanan); + $jumlayanan = count($pecahpelayanan); + for ($x = 0; $x < $jumlayanan; $x++){ + if($pecahpelayanan[$x]==$idklinik){ + if($pembayaran==$dataloket->ml_pembayaran){ + $pelayanan=$pelayanan." | ".$dataloket->ml_nama; + } + } + } + } + $pelayanan=$pelayanan." | "; + +?> +<table style="margin-left: auto; margin-right: auto; font-family: arial; "> + <tr> + <th colspan="3"> + Nomor Antrian + </th> + </tr> + <tr><td> </td></tr> + <tr><td> </td></tr> + <tr> + <th colspan="3"><h1><?php echo $noantrian;?></h1></th> + </tr> + <tr> + <th style="text-align: left;"> + Klinik + </th> + <th>:</th> + <td> + <?php echo $klinik;?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + No. Shift + </th> + <th>:</th> + <td> + SHIFT <?php echo $shift;?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + No. Rekamedik + </th> + <th>:</th> + <td> + <?php echo $rekamedik;?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + Shift Buka + </th> + <th>:</th> + <td> + <?php echo $pecahjambuka[($shift-1)];?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + Tgl Periksa + </th> + <th>:</th> + <td> + <?php echo $tglperiksa;?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + Keterangan + </th> + <th>:</th> + <th> + <u>FASTTRACK</u> + </th> + </tr> + <tr> + <th style="text-align: left;"> + Pembayaran + </th> + <th>:</th> + <td> + <?php echo $namapembayaran;?> + </td> + </tr> + <tr> + <td style="text-align: center;" colspan="3"><?php echo $pelayanan; ?></td> + </tr> + <tr><td> </td></tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3"><?php echo '<img src="'.base_url().'/assets/php-barcode-master/barcode.php?text='.$barcode.'&print=true&size=30" />';?></td> + </tr> + <tr> + <td style="font-size: 11px; text-align: center;" colspan="3">Jangan sampai hilang, tidak dapat di cetak ulang</td> + </tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3">Tgl Cetak : <?php echo date('d/m/Y H:i:s')?></td> + </tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3">RSUD Dr. Saiful Anwar Malang</td> + </tr> + + +</table> +<input hidden="" id="idpp" value="<?php echo $idpp;?>" /> + + +<script> + var url="<?php echo base_url();?>"; + var idpp = document.getElementById("idpp").value; + window.print(); + window.addEventListener('afterprint', (event) => { + //window.location = url+"index.php/ps_anjungan/print_pengantar/"+idpp+"/5"; + window.location = url+"index.php/ps_fasttrack"; + }); + + setTimeout(function(){ + window.location = url+"index.php/ps_fasttrack"; + }, 1000); +</script> + +<?php //redirect('index.php/ps_anjungan');?> diff --git a/application/views/print/print_anjungan/p_pengantar.php b/application/views/print/print_anjungan/p_pengantar.php new file mode 100644 index 0000000..c6c67ba --- /dev/null +++ b/application/views/print/print_anjungan/p_pengantar.php @@ -0,0 +1,151 @@ +<?php + + //phpinfo(); + + $tglperiksa = ""; + $klinik = ""; + $shift = ""; + $noantrian = ""; + $loket = ""; + $jambuka = ""; + $barcode = ""; + $tgldaftar = ""; + $rekamedik = ""; + $nodafonline= ""; + + foreach ($dp as $datapasien){ + $tglperiksa =date("d/m/Y", strtotime($datapasien->pp_tanggal_periksa)); + $shift =$datapasien->pp_shift; + $klinik =$datapasien->mk_nama; + $noantrian =$datapasien->pp_nomor_antrian; + $barcode ="99".substr($datapasien->pp_barcode,2); + $jambuka =$datapasien->mk_jam_shift; + $tgldaftar =date("d/m/Y", strtotime($datapasien->pp_tanggal_datang)); + $rekamedik =$datapasien->pp_rekamedik; + $nodafonline=$datapasien->pp_pendaftaran_online; + } + + $pecahjambuka = explode("|",$jambuka); + +?> +<table style="margin-left: auto; margin-right: auto; font-family: arial; "> + <tr> + <th colspan="3"> + Nomor Antrian + </th> + </tr> + <tr><td> </td></tr> + <tr><td> </td></tr> + <tr> + <th colspan="3"><h1><?php echo $noantrian;?></h1></th> + </tr> + <tr> + <th style="text-align: left;"> + Klinik + </th> + <th>:</th> + <td> + <?php echo $klinik;?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + No. Shift + </th> + <th>:</th> + <td> + SHIFT <?php echo $shift;?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + Shift Buka + </th> + <th>:</th> + <td> + <?php echo $pecahjambuka[($shift-1)];?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + Tgl Periksa + </th> + <th>:</th> + <td> + <?php echo $tglperiksa;?> + </td> + </tr> + <?php if($ket==4){?> + <tr> + <th style="text-align: left;"> + Ket. + </th> + <th>:</th> + <th> + <u>FASTTRACK</u> + </th> + </tr> + <?php }?> + <?php if($ket==5){?> + <tr> + <th style="text-align: left;"> + Ket. + </th> + <th>:</th> + <th> + <u>FASTTRACK</u> + </th> + </tr> + <?php }?> + <tr><td> </td></tr> + <tr><td> </td></tr> + <tr> + <th style="text-align: center;" colspan="3"><u>| PENUNGGU PASIEN |</u></th> + </tr> + <tr><td> </td></tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3"><?php echo '<img src="'.base_url().'/assets/php-barcode-master/barcode.php?text='.$barcode.'&print=true&size=30" />';?></td> + </tr> + <tr> + <td style="font-size: 11px; text-align: center;" colspan="3">Jangan sampai hilang, tidak dapat di cetak ulang</td> + </tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3">Tgl Cetak : <?php echo date('d/m/Y H:i:s')?></td> + </tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3">RSUD Dr. Saiful Anwar Malang</td> + </tr> + + +</table> +<input hidden="" id="ket" value="<?php echo $ket;?>" /> + +<script> + var url="<?php echo base_url();?>"; + + window.print(); + var ket = document.getElementById("ket").value; + window.addEventListener('afterprint', (event) => { + if(ket==3){ + window.location = url+"index.php/ps_anjungan/admin_anjungan"; + } else if(ket==5){ + window.location = url+"index.php/ps_fasttrack"; + } + else{ + window.location = url+"index.php/ps_anjungan"; + } + }); + + setTimeout(function(){ + if(ket==3){ + window.location = url+"index.php/ps_anjungan/admin_anjungan"; + } else if(ket==5){ + window.location = url+"index.php/ps_fasttrack"; + } + else{ + window.location = url+"index.php/ps_anjungan"; + } + }, 1000); +</script> + +<?php //redirect('index.php/ps_anjungan');?> diff --git a/application/views/print/print_anjungan/p_pesan.php b/application/views/print/print_anjungan/p_pesan.php new file mode 100644 index 0000000..6dc1cc9 --- /dev/null +++ b/application/views/print/print_anjungan/p_pesan.php @@ -0,0 +1,149 @@ +<?php + + //phpinfo(); + $idpp = ""; + $klinik = ""; + $tglperiksa = ""; + $shift = ""; + $noantrian = ""; + $loket = ""; + $jambuka = ""; + $barcode = ""; + $pembayaran = ""; + $namapembayaran = ""; + + foreach ($dp as $datapasien){ + $idpp =$datapasien->pp_id; + $klinik =$datapasien->mk_nama; + $tglperiksa =date("d/m/Y", strtotime($datapasien->pp_tanggal_periksa)); + $shift =$datapasien->pp_shift; + $noantrian =$datapasien->pp_nomor_antrian; + $barcode =$datapasien->pp_barcode; + $jambuka =$datapasien->mk_jam_shift; + $pembayaran =$datapasien->pp_pembayaran; + if($pembayaran==1){$namapembayaran="UMUM/DLL";} + if($pembayaran==2){$namapembayaran="JKN";} + } + + $pecahjambuka = explode("|",$jambuka); + + $pelayanan = ""; + foreach ($lk as $dataloket){ + $pecahpelayanan = explode(",",$dataloket->ml_pelayanan); + $jumlayanan = count($pecahpelayanan); + for ($x = 0; $x < $jumlayanan; $x++){ + if($pecahpelayanan[$x]==$idklinik){ + if($pembayaran==$dataloket->ml_pembayaran){ + $pelayanan=$pelayanan." | ".$dataloket->ml_nama; + } + } + } + } + $pelayanan=$pelayanan." | "; + +?> + +<table style="margin-left: auto; margin-right: auto; font-family: arial; "> + <tr> + <th colspan="3"> + Nomor Antrian + </th> + </tr> + <tr><td> </td></tr> + <tr><td> </td></tr> + <!--tr> + <th style="text-align: left;"> + No. Antrian + </th> + <th>:</th> + <th style="text-align: left;"> + <?php echo $noantrian;?> + </th> + </tr--> + <tr> + <th colspan="3"><h1><?php echo $noantrian;?></h1></th> + </tr> + <tr> + <th style="text-align: left;"> + Klinik + </th> + <th>:</th> + <td> + <?php echo $klinik;?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + No. Shift + </th> + <th>:</th> + <td> + SHIFT <?php echo $shift;?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + Shift Buka + </th> + <th>:</th> + <td> + <?php echo $pecahjambuka[($shift-1)];?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + Tanggal Periksa + </th> + <th>:</th> + <td> + <?php echo $tglperiksa;?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + Pembayaran + </th> + <th>:</th> + <td> + <?php echo $namapembayaran;?> + </td> + </tr> + <tr> + <td style="text-align: center;" colspan="3"><?php echo $pelayanan; ?></td> + </tr> + <tr><td> </td></tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3"><?php echo '<img src="'.base_url().'/assets/php-barcode-master/barcode.php?text=' . $barcode . '&print=true&size=30" />';?></td> + </tr> + <tr> + <td style="font-size: 11px; text-align: center;" colspan="3">Jangan sampai hilang, tidak dapat di cetak ulang</td> + </tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3">Tgl Cetak : <?php echo date('d/m/Y H:i:s')?></td> + </tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3">RSUD Dr. Saiful Anwar Malang</td> + </tr> + + +</table> +<input hidden="" id="ket" value="<?php echo $ket;?>" /> +<input hidden="" id="idpp" value="<?php echo $idpp;?>" /> + +<script> + var url="<?php echo base_url();?>"; + var ket = document.getElementById("ket").value; + var idpp = document.getElementById("idpp").value; + + window.print(); + window.addEventListener('afterprint', (event) => { + //window.location = url+"index.php/ps_anjungan/print_pengantar/"+idpp+"/"+ket; + window.location = url+"index.php/ps_anjungan"; + }); + + setTimeout(function(){ + window.location = url+"index.php/ps_anjungan"; + }, 1000); +</script> + +<?php //redirect('index.php/ps_anjungan');?> diff --git a/application/views/print/print_anjungan/p_print_ulang.php b/application/views/print/print_anjungan/p_print_ulang.php new file mode 100644 index 0000000..2d2275e --- /dev/null +++ b/application/views/print/print_anjungan/p_print_ulang.php @@ -0,0 +1,193 @@ +<?php + + //phpinfo(); + + $tglperiksa = ""; + $klinik = ""; + $shift = ""; + $noantrian = ""; + $loket = ""; + $jambuka = ""; + $barcode = ""; + $tgldaftar = ""; + $rekamedik = ""; + $nodafonline= ""; + $idklinik = ""; + $pembayaran = ""; + $namapembayaran = ""; + + foreach ($cu as $datapasien){ + $tglperiksa =date("d/m/Y", strtotime($datapasien->pp_tanggal_periksa)); + $klinik =$datapasien->mk_nama; + $shift =$datapasien->pp_shift; + $noantrian =$datapasien->pp_nomor_antrian; + $barcode =$datapasien->pp_barcode; + $jambuka =$datapasien->mk_jam_shift; + $tgldaftar =date("d/m/Y", strtotime($datapasien->pp_tanggal_datang)); + $rekamedik =$datapasien->pp_rekamedik; + $nodafonline=$datapasien->pp_pendaftaran_online; + $idklinik =$datapasien->mk_id; + $pembayaran =$datapasien->pp_pembayaran; + if($pembayaran==1){$namapembayaran="UMUM/DLL";} + if($pembayaran==2){$namapembayaran="JKN";} + if($datapasien->pp_pendaftaran_online==null){$online=1;}else{$online=2;} + + if($ket==2){ + $barcode ="99".substr($datapasien->pp_barcode,2); + } + } + + $pecahjambuka = explode("|",$jambuka); + + $pelayanan = ""; + foreach ($lk as $dataloket){ +// if($online==2){ +// if($dataloket->ml_online==2){ +// $pelayanan=$pelayanan." | ".$dataloket->ml_nama; +// } +// }else{ + $pecahpelayanan = explode(",",$dataloket->ml_pelayanan); + $jumlayanan = count($pecahpelayanan); + for ($x = 0; $x < $jumlayanan; $x++){ + if($pecahpelayanan[$x]==$idklinik){ + if($pembayaran==$dataloket->ml_pembayaran){ + $pelayanan=$pelayanan." | ".$dataloket->ml_nama; + } + } + } +// } + } + $pelayanan=$pelayanan." | "; + +?> +<table style="margin-left: auto; margin-right: auto; font-family: arial; "> + <tr> + <th colspan="3"> + Nomor Antrian + </th> + </tr> + <tr><td> </td></tr> + <tr><td> </td></tr> + <tr> + <th colspan="3"><h1><?php echo $noantrian;?></h1></th> + </tr> + <tr> + <th style="text-align: left;"> + Klinik + </th> + <th>:</th> + <td> + <?php echo $klinik;?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + No. Shift + </th> + <th>:</th> + <td> + SHIFT <?php echo $shift;?> + </td> + </tr> + <?php if($nodafonline!=null){?> + <tr> + <th style="text-align: left;"> + No. Rekamedik + </th> + <th>:</th> + <td> + <?php echo $rekamedik;?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + Daftar Online + </th> + <th>:</th> + <td> + <?php echo $nodafonline;?> + </td> + </tr> + <?php }?> + <tr> + <th style="text-align: left;"> + Shift Buka + </th> + <th>:</th> + <td> + <?php echo $pecahjambuka[($shift-1)];?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + Tgl Periksa + </th> + <th>:</th> + <td> + <?php echo $tglperiksa;?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + Tgl Pesan + </th> + <th>:</th> + <td> + <?php echo $tgldaftar;?> + </td> + </tr> + <?php if($ket==2){ + ?> + <tr><td> </td></tr> + <tr><td> </td></tr> + <tr> + <th style="text-align: center;" colspan="3"><u>| PENUNGGU PASIEN |</u></th> + </tr> + <?php + }else{ + ?> + <tr> + <th style="text-align: left;"> + Pembayaran + </th> + <th>:</th> + <td> + <?php echo $namapembayaran;?> + </td> + </tr> + <tr> + <td style="text-align: center;" colspan="3"><?php echo $pelayanan; ?></td> + </tr> + <?php + }?> + <tr><td> </td></tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3"><?php echo '<img src="'.base_url().'/assets/php-barcode-master/barcode.php?text='.$barcode.'&print=true&size=30" />';?></td> + </tr> + <tr> + <td style="font-size: 11px; text-align: center;" colspan="3"><strong>Tiket ini cetakan ulang.</strong></td> + </tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3">Tgl Cetak : <?php echo date('d/m/Y H:i:s')?></td> + </tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3">RSUD Dr. Saiful Anwar Malang</td> + </tr> + + +</table> + +<script> + var url="<?php echo base_url();?>"; + + window.print(); + window.addEventListener('afterprint', (event) => { + window.location = url+"index.php/ps_anjungan/admin_anjungan"; + }); + + setTimeout(function(){ + window.location = url+"index.php/ps_anjungan/admin_anjungan"; + }, 1000); +</script> + +<?php //redirect('index.php/ps_anjungan');?> diff --git a/application/views/print/print_anjungan/p_sekarang.php b/application/views/print/print_anjungan/p_sekarang.php new file mode 100644 index 0000000..4103419 --- /dev/null +++ b/application/views/print/print_anjungan/p_sekarang.php @@ -0,0 +1,195 @@ +<?php + + //phpinfo(); + $idpp = ""; + $klinik = ""; + $tglperiksa = ""; + $shift = ""; + $noantrian = ""; + $loket = ""; + $jambuka = ""; + $barcode = ""; + $tgldaftar = ""; + $rekamedik = ""; + $nodafonline= ""; + $pembayaran = ""; + $namapembayaran = ""; + $online = ""; + + foreach ($dp as $datapasien){ + $idpp =$datapasien->pp_id; + $klinik =$datapasien->mk_nama; + $tglperiksa =date("d/m/Y", strtotime($datapasien->pp_tanggal_periksa)); + $shift =$datapasien->pp_shift; + $noantrian =$datapasien->pp_nomor_antrian; + $barcode =$datapasien->pp_barcode; + $jambuka =$datapasien->mk_jam_shift; + $tgldaftar =date("d/m/Y", strtotime($datapasien->pp_tanggal_datang)); + $rekamedik =$datapasien->pp_rekamedik; + $nodafonline=$datapasien->pp_pendaftaran_online; + $pembayaran =$datapasien->pp_pembayaran; + if($pembayaran==1){$namapembayaran="UMUM/DLL";} + if($pembayaran==2){$namapembayaran="JKN";} + if($datapasien->pp_pendaftaran_online==null){$online=1;}else{$online=2;} + } + + $pecahjambuka = explode("|",$jambuka); + + $pelayanan = ""; + + foreach ($lk as $dataloket){ +// if($online==2){ +// if($dataloket->ml_online==2){ +// $pelayanan=$pelayanan." | ".$dataloket->ml_nama; +// } +// }else{ + $pecahpelayanan = explode(",",$dataloket->ml_pelayanan); + $jumlayanan = count($pecahpelayanan); + for ($x = 0; $x < $jumlayanan; $x++){ + if($pecahpelayanan[$x]==$idklinik){ + if($pembayaran==$dataloket->ml_pembayaran){ + $pelayanan=$pelayanan." | ".$dataloket->ml_nama; + } + } + } +// } + } + $pelayanan=$pelayanan." | "; + +?> +<table style="margin-left: auto; margin-right: auto; font-family: arial; "> + <tr> + <th colspan="3"> + Nomor Antrian + </th> + </tr> + <tr><td> </td></tr> + <tr><td> </td></tr> + <tr> + <th colspan="3"><h1><?php echo $noantrian;?></h1></th> + </tr> + <tr> + <th style="text-align: left;"> + Klinik + </th> + <th>:</th> + <td> + <?php echo $klinik;?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + No. Shift + </th> + <th>:</th> + <td> + SHIFT <?php echo $shift;?> + </td> + </tr> + <?php if($ket==3){?> + <tr> + <th style="text-align: left;"> + No. Rekamedik + </th> + <th>:</th> + <td> + <?php echo $rekamedik;?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + Daftar Online + </th> + <th>:</th> + <td> + <?php echo $nodafonline;?> + </td> + </tr> + <?php }?> + <tr> + <th style="text-align: left;"> + Shift Buka + </th> + <th>:</th> + <td> + <?php echo $pecahjambuka[($shift-1)];?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + Tgl Periksa + </th> + <th>:</th> + <td> + <?php echo $tglperiksa;?> + </td> + </tr> + <?php if($ket==2){?> + <tr> + <th style="text-align: left;"> + Tgl Pesan + </th> + <th>:</th> + <td> + <?php echo $tgldaftar;?> + </td> + </tr> + <?php }?> + <tr> + <th style="text-align: left;"> + Pembayaran + </th> + <th>:</th> + <td> + <?php echo $namapembayaran;?> + </td> + </tr> + <tr> + <td style="text-align: center;" colspan="3"><?php echo $pelayanan; ?></td> + </tr> + <tr><td> </td></tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3"><?php echo '<img src="'.base_url().'/assets/php-barcode-master/barcode.php?text='.$barcode.'&print=true&size=30" />';?></td> + </tr> + <tr> + <td style="font-size: 11px; text-align: center;" colspan="3">Jangan sampai hilang, tidak dapat di cetak ulang</td> + </tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3">Tgl Cetak : <?php echo date('d/m/Y H:i:s')?></td> + </tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3">RSUD Dr. Saiful Anwar Malang</td> + </tr> + + +</table> +<input hidden="" id="ket" value="<?php echo $ket;?>" /> +<input hidden="" id="idpp" value="<?php echo $idpp;?>" /> + +<script> + var url="<?php echo base_url();?>"; + + window.print(); + var ket = document.getElementById("ket").value; + var idpp = document.getElementById("idpp").value; + window.addEventListener('afterprint', (event) => { +// window.location = url+"index.php/ps_anjungan/print_pengantar/"+idpp+"/"+ket; + if(ket==3){ + window.location = url+"index.php/ps_anjungan/admin_anjungan"; + }else{ + window.location = url+"index.php/ps_anjungan"; + + } + }); + + setTimeout(function(){ + if(ket==3){ + window.location = url+"index.php/ps_anjungan/admin_anjungan"; + }else{ + window.location = url+"index.php/ps_anjungan"; + + } + }, 1000); +</script> + +<?php //redirect('index.php/ps_anjungan');?> diff --git a/application/views/print/print_loket/p_tiket_baru.php b/application/views/print/print_loket/p_tiket_baru.php new file mode 100644 index 0000000..de0232e --- /dev/null +++ b/application/views/print/print_loket/p_tiket_baru.php @@ -0,0 +1,165 @@ +<?php + $id = ""; + $tglperiksa = ""; + $shift = ""; + $noanlok = ""; + $noantrian = ""; + $loket = ""; + $jambuka = ""; + $barcode = ""; + $tgldaftar = ""; + $rekamedik = ""; + $nodafonline= ""; + $namaklinik = ""; + $fasttrack = ""; + $pembayaran = ""; + $namapembayaran = ""; + + foreach ($pp as $datapasien){ + $id =$datapasien->pp_id; + $tglperiksa =date("d/m/Y", strtotime($datapasien->pp_tanggal_periksa)); + $shift =$datapasien->pp_shift; + $noanlok =$datapasien->pp_nomor_antrian; + $noantrian =$datapasien->pp_nomor_antrian_klinik; + $barcode =$datapasien->pp_barcode; + $jambuka =$datapasien->mk_jam_shift; + $tgldaftar =date("d/m/Y", strtotime($datapasien->pp_tanggal_datang)); + $rekamedik =$datapasien->pp_rekamedik; + $nodafonline=$datapasien->pp_pendaftaran_online; + $namaklinik =$datapasien->mk_nama; + $fasttrack =$datapasien->pp_fasttrack; + $pembayaran =$datapasien->pp_pembayaran; + if($pembayaran==1){$namapembayaran="UMUM";} + if($pembayaran==2){$namapembayaran="JKN";} + if($pembayaran==3){$namapembayaran="LAINNYA";} + } + + $pecahjambuka = explode("|",$jambuka); + + $pelayanan = ""; + +?> +<input hidden="" id="idpp" name="idpp" value="<?php echo $id;?>" /> +<input hidden="" id="namaloket" name="namaloket" value="<?php echo $namaloket;?>" /> +<table style="margin-left: auto; margin-right: auto; font-family: arial; "> + <tr> + <th colspan="3"> + Nomor Antrian + </th> + </tr> + <tr><td> </td></tr> + <tr><td> </td></tr> + <tr> + <th colspan="3"><h1><?php echo $noantrian;?></h1></th> + </tr> + <tr> + <th style="text-align: left;"> + No. Loket + </th> + <th>:</th> + <td> + <?php echo $noanlok;?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + No. Shift + </th> + <th>:</th> + <td> + SHIFT <?php echo $shift;?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + No. RM + </th> + <th>:</th> + <td> + <?php echo $rekamedik;?> + </td> + </tr> + <?php if(isset($nodafonline)){?> + <tr> + <th style="text-align: left;"> + Daftar Online + </th> + <th>:</th> + <td> + <?php echo $nodafonline;?> + </td> + </tr> + <?php }?> + <tr> + <th style="text-align: left;"> + Shift Buka + </th> + <th>:</th> + <td> + <?php echo $pecahjambuka[($shift-1)];?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + Tgl Periksa + </th> + <th>:</th> + <td> + <?php echo $tglperiksa;?> + </td> + </tr> + <?php if(isset($fasttrack)){?> + <tr> + <th style="text-align: left;"> + Ket. + </th> + <th>:</th> + <th><u>FASTTRACK</u></th> + </tr> + <?php }?> + <tr> + <th style="text-align: left;"> + Pembayaran + </th> + <th>:</th> + <td> + <?php echo $namapembayaran;?> + </td> + </tr> + <tr><td></td></tr> + <tr> + <td style="text-align: center;" colspan="3">|Klinik <?php echo $namaklinik;//echo $namaloket; ?>|</td> + </tr> + <tr><td> </td></tr> + <tr> + <td style="font-size: 11px; text-align: center;" colspan="3">Jangan sampai hilang, tidak dapat di cetak ulang</td> + </tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3">Tgl Cetak : <?php echo date('d/m/Y H:i:s')?></td> + </tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3">RSUD Dr. Saiful Anwar Malang</td> + </tr> + + +</table> + +<script> + var url="<?php echo base_url();?>"; + + window.print(); +// window.addEventListener('afterprint', (event) => { +// var id = document.getElementById('idpp').value; +// var nama = document.getElementById('namaloket').value; +// window.location = url+"index.php/ps_loket_admin/proses_pengunjung_berkas/"+id+"/"+nama; +// }); +// +// setTimeout(function(){ +// window.location = url+"index.php/ps_loket_admin/proses_pengunjung_berkas/"+id+"/"+nama; +// }, 1000); + + + setTimeout(function(){ + window.location = url+"index.php/ps_loket_admin"; + }, 1000); +</script> \ No newline at end of file diff --git a/application/views/print/print_loket/p_tiket_baru_berkas.php b/application/views/print/print_loket/p_tiket_baru_berkas.php new file mode 100644 index 0000000..fe6a824 --- /dev/null +++ b/application/views/print/print_loket/p_tiket_baru_berkas.php @@ -0,0 +1,155 @@ +<?php + + $tglperiksa = ""; + $shift = ""; + $noanlok = ""; + $noantrian = ""; + $loket = ""; + $jambuka = ""; + $barcode = ""; + $tgldaftar = ""; + $rekamedik = ""; + $nodafonline= ""; + $namaklinik = ""; + $fasttrack = ""; + $pembayaran = ""; + $namapembayaran = ""; + + foreach ($pp as $datapasien){ + $tglperiksa =date("d/m/Y", strtotime($datapasien->pp_tanggal_periksa)); + $shift =$datapasien->pp_shift; + $noanlok =$datapasien->pp_nomor_antrian; + $noantrian =$datapasien->pp_nomor_antrian_klinik; + $barcode =$datapasien->pp_barcode; + $jambuka =$datapasien->mk_jam_shift; + $tgldaftar =date("d/m/Y", strtotime($datapasien->pp_tanggal_datang)); + $rekamedik =$datapasien->pp_rekamedik; + $nodafonline=$datapasien->pp_pendaftaran_online; + $namaklinik =$datapasien->mk_nama; + $fasttrack =$datapasien->pp_fasttrack; + $pembayaran =$datapasien->pp_pembayaran; + if($pembayaran==1){$namapembayaran="UMUM";} + if($pembayaran==2){$namapembayaran="JKN";} + if($pembayaran==3){$namapembayaran="LAINNYA";} + } + + $pecahjambuka = explode("|",$jambuka); + + $pelayanan = ""; + +?> + +<table style="margin-left: auto; margin-right: auto; font-family: arial; "> + <tr> + <th colspan="3"> + Nomor Antrian + </th> + </tr> + <tr><td> </td></tr> + <tr><td> </td></tr> + <tr> + <th colspan="3"><h1><?php echo $noantrian;?></h1></th> + </tr> + <tr> + <th style="text-align: left;"> + No. Loket + </th> + <th>:</th> + <td> + <?php echo $noanlok;?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + No. Shift + </th> + <th>:</th> + <td> + SHIFT <?php echo $shift;?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + No. RM + </th> + <th>:</th> + <td> + <?php echo $rekamedik;?> + </td> + </tr> + <?php if(isset($nodafonline)){?> + <tr> + <th style="text-align: left;"> + Daftar Online + </th> + <th>:</th> + <td> + <?php echo $nodafonline;?> + </td> + </tr> + <?php }?> + <tr> + <th style="text-align: left;"> + Shift Buka + </th> + <th>:</th> + <td> + <?php echo $pecahjambuka[($shift-1)];?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + Tgl Periksa + </th> + <th>:</th> + <td> + <?php echo $tglperiksa;?> + </td> + </tr> + <?php if(isset($fasttrack)){?> + <tr> + <th style="text-align: left;"> + Ket. + </th> + <th>:</th> + <th><u>FASTTRACK</u></th> + </tr> + <?php }?> + <tr> + <th style="text-align: left;"> + Pembayaran + </th> + <th>:</th> + <td> + <?php echo $namapembayaran;?> + </td> + </tr> + <tr><td></td></tr> + <tr> + <td style="text-align: center;" colspan="3">|Klinik <?php echo $namaklinik; //$hasil = str_replace("%20", " " , $namaloket); echo $hasil; ?>|</td> + </tr> + <tr><td> </td></tr> + <tr> + <td style="text-align: center;" colspan="3"><b><u>JADIKAN SATU PADA BERKAS TRACER</b></u></td> + </tr> + <tr><td> </td></tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3">Tgl Cetak : <?php echo date('d/m/Y H:i:s')?></td> + </tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3">RSUD Dr. Saiful Anwar Malang</td> + </tr> +</table> + +<script> + var url="<?php echo base_url();?>"; + + window.print(); + window.addEventListener('afterprint', (event) => { + window.location = url+"index.php/ps_loket_admin"; + }); + + setTimeout(function(){ + window.location = url+"index.php/ps_loket_admin"; + }, 1000); +</script> \ No newline at end of file diff --git a/application/views/print/print_loket/p_ulang_tiket_baru.php b/application/views/print/print_loket/p_ulang_tiket_baru.php new file mode 100644 index 0000000..e48cbcb --- /dev/null +++ b/application/views/print/print_loket/p_ulang_tiket_baru.php @@ -0,0 +1,155 @@ +<?php + + $tglperiksa = ""; + $shift = ""; + $noanlok = ""; + $noantrian = ""; + $loket = ""; + $jambuka = ""; + $barcode = ""; + $tgldaftar = ""; + $rekamedik = ""; + $nodafonline= ""; + $namaklinik = ""; + $fasttrack = ""; + $pembayaran = ""; + $namapembayaran = ""; + + foreach ($pp as $datapasien){ + $tglperiksa =date("d/m/Y", strtotime($datapasien->pp_tanggal_periksa)); + $shift =$datapasien->pp_shift; + $noanlok =$datapasien->pp_nomor_antrian; + $noantrian =$datapasien->pp_nomor_antrian_klinik; + $barcode =$datapasien->pp_barcode; + $jambuka =$datapasien->mk_jam_shift; + $tgldaftar =date("d/m/Y", strtotime($datapasien->pp_tanggal_datang)); + $rekamedik =$datapasien->pp_rekamedik; + $nodafonline=$datapasien->pp_pendaftaran_online; + $namaklinik =$datapasien->mk_nama; + $fasttrack =$datapasien->pp_fasttrack; + $pembayaran =$datapasien->pp_pembayaran; + if($pembayaran==1){$namapembayaran="UMUM";} + if($pembayaran==2){$namapembayaran="JKN";} + } + + $pecahjambuka = explode("|",$jambuka); + + $pelayanan = ""; + +?> + +<table style="margin-left: auto; margin-right: auto; font-family: arial; "> + <tr> + <th colspan="3"> + Nomor Antrian + </th> + </tr> + <tr><td> </td></tr> + <tr><td> </td></tr> + <tr> + <th colspan="3"><h1><?php echo $noantrian;?></h1></th> + </tr> + <tr> + <th style="text-align: left;"> + No. Loket + </th> + <th>:</th> + <td> + <?php echo $noanlok;?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + No. Shift + </th> + <th>:</th> + <td> + SHIFT <?php echo $shift;?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + No. RM + </th> + <th>:</th> + <td> + <?php echo $rekamedik;?> + </td> + </tr> + <?php if(isset($nodafonline)){?> + <tr> + <th style="text-align: left;"> + Daftar Online + </th> + <th>:</th> + <td> + <?php echo $nodafonline;?> + </td> + </tr> + <?php }?> + <tr> + <th style="text-align: left;"> + Shift Buka + </th> + <th>:</th> + <td> + <?php echo $pecahjambuka[($shift-1)];?> + </td> + </tr> + <tr> + <th style="text-align: left;"> + Tgl Periksa + </th> + <th>:</th> + <td> + <?php echo $tglperiksa;?> + </td> + </tr> + <?php if(isset($fasttrack)){?> + <tr> + <th style="text-align: left;"> + Ket. + </th> + <th>:</th> + <th><u>FASTTRACK</u></th> + </tr> + <?php }?> + <tr> + <th style="text-align: left;"> + Pembayaran + </th> + <th>:</th> + <td> + <?php echo $namapembayaran;?> + </td> + </tr> + <tr><td></td></tr> + <tr> + <td style="text-align: center;" colspan="3">|Klinik <?php echo $namaklinik; ?>|</td> + </tr> + <tr><td> </td></tr> + <tr> + <td style="font-size: 11px; text-align: center;" colspan="3">Jangan sampai hilang, tidak dapat di cetak ulang</td> + </tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3">Tgl Cetak : <?php echo date('d/m/Y H:i:s')?></td> + </tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3">RSUD Dr. Saiful Anwar Malang</td> + </tr> + + +</table> + +<script> + var url="<?php echo base_url();?>"; + + window.print(); + window.addEventListener('afterprint', (event) => { + window.location = url+"index.php/ps_loket_admin"; + }); + + setTimeout(function(){ + window.location = url+"index.php/ps_loket_admin"; + }, 1000); +</script> \ No newline at end of file diff --git a/application/views/print/print_ranap/print_ranap.php b/application/views/print/print_ranap/print_ranap.php new file mode 100644 index 0000000..a7bffa6 --- /dev/null +++ b/application/views/print/print_ranap/print_ranap.php @@ -0,0 +1,54 @@ +<?php + +?> +<table style="margin-left: auto; margin-right: auto; font-family: arial; "> + <tr> + <th colspan="3"> + NOMOR ANTRIAN RAWAT INAP + </th> + </tr> + <tr><td> </td></tr> + <tr><td> </td></tr> + <tr> + <th colspan="3"><h1 style="font-size: 80px;"><?php echo $dp->row('ppr_nomor_antrian');?></h1></th> + </tr> + + <tr> + <th style="text-align: left;"> + Tgl Periksa + </th> + <th>:</th> + <td> + <?php echo date("d M Y", strtotime($dp->row('ppr_tanggal_periksa')));?> + </td> + </tr> + <tr> + <td></td> + </tr> + <tr> + <td style="font-size: 11px; text-align: center;" colspan="3">Jangan sampai hilang, tidak dapat di cetak ulang</td> + </tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3">Tgl Cetak : <?php echo date('d/m/Y H:i:s')?></td> + </tr> + <tr> + <td style="font-size: 10px; text-align: center;" colspan="3">RSUD Dr. Saiful Anwar Malang</td> + </tr> + + +</table> + +<script> + var url="<?php echo base_url();?>"; + + window.print(); + window.addEventListener('afterprint', (event) => { + window.location = url+"index.php/ps_ranap_admin"; + }); + + setTimeout(function(){ + window.location = url+"index.php/ps_ranap_admin"; + }, 1000); +</script> + +<?php //redirect('index.php/ps_anjungan');?> diff --git a/application/views/ranap/v_ranapadmin.php b/application/views/ranap/v_ranapadmin.php new file mode 100644 index 0000000..fb8e861 --- /dev/null +++ b/application/views/ranap/v_ranapadmin.php @@ -0,0 +1,181 @@ +<body class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h1> + <small> + <a href="<?php echo base_url();?>index.php/ps_ranap_admin/prosesadd" class="btn btn-block btn-primary btn-sm">Tambah Pengunjung</a> + </small> + <small> + <a href="<?php echo base_url();?>index.php/ps_ranap_admin" class="btn btn-block btn-info btn-sm">Reload &nbsp;&nbsp;&nbsp;<li class="fa fa-refresh"></li></a> + </small> + + </h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li class="active"><?php echo $title ?></li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-xs-8"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title"><?php echo $title ?></h3> + </div><!-- /.box-header --> + <div class="box-body"> + <?php if($this->session->flashdata('message')){?> + <div class="alert alert-success alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-check"></i> Alert!</h4> + <?php echo $this->session->flashdata('message');?> + </div> + <?php }?> + <div class="box-body table-responsive no-padding"> + <table id="example1" class="table table-bordered table-striped"> + <thead> + <tr> + <th width="5%">No</th> + <th>No Antrian</th> + <th>Daftar</th> + <th>Pelayanan</th> + <th width="20%">Aksi</th> + </tr> + </thead> + <tbody> + <?php $no=0; + foreach ($rn as $dataranap){ $no++; + ?> + <tr> + <td><?php echo $no;?></td> + <td><?php echo $dataranap->ppr_nomor_antrian;?></td> + <td><?php echo date("d M Y H:i:s", strtotime($dataranap->ppr_tanggal_periksa));?></td> + <td><?php if($dataranap->ppr_panggil!=null){echo date("H:i:s", strtotime($dataranap->ppr_panggil))." ".$dataranap->ml_nama;}else{ echo "<code>Belum Dilayanai</code>";}?></td> + <td> + <?php + if($dataranap->ppr_status=="0"){ +// if($dataranap->ppr_callsound==null){ +// echo " <button type='button' onclick='callsound($dataranap->ppr_id)' class='btn btn-primary btn-xs'>Panggil</button> "; +// } + echo " <button type='button' onclick='selesai($dataranap->ppr_id)' class='btn btn-success btn-xs'>Selesai</button> "; + }elseif($dataranap->ppr_status=="1"){ + echo " <button type='button' onclick='selesai($dataranap->ppr_id)' class='btn btn-success btn-xs'>Selesai</button> "; + echo " <button type='button' onclick='pending($dataranap->ppr_id)' class='btn btn-warning btn-xs'>Pending</button> "; + }elseif($dataranap->ppr_status=="2"){ + echo "<button type='button' onclick='pendingselesai($dataranap->ppr_id)' class='btn btn-warning btn-xs'>Pending Selesai</button>"; + } + + ?> + </td> + </tr> + + <?php + } + + ?> + </tbody> + </table> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + + <!-- small box --> + <?php if($sl->num_rows()==0){ + ?> + <div class="col-xs-4"> + <div onclick="next()" class="btn small-box bg-green"> + <div class="inner"> + <h3>NEXT</h3> + <p>Kosong</p> + </div> + <div class="icon"> + <i class="fa fa-play"></i> + </div> + <a href="#" class="small-box-footer">Klik untuk memanggil pasien selanjutnya</a> + </div> + </div> + <?php + }else{ + ?> + <div class="col-xs-4"> + <div class="small-box bg-purple"> + <div class="inner"> + <h3><?php echo $sl->row('ppr_nomor_antrian'); ?></h3> + <p>Jam Panggil : <?php echo $sl->row('ppr_panggil'); ?></p> + </div> + <div class="icon"> + <i class="fa fa-play"></i> + </div> + <a href="#" class="small-box-footer">Informasi Pengunjung</a> + </div> + </div> + <div class="col-xs-1"> + <!-- small box --> + <div onclick="pending(<?php echo $sl->row('ppr_id');?>)" class="btn small-box bg-yellow"> + <div class="inner"> + <h3><i class="fa fa-ban"></i></h3> + </div> + </div> + </div> + <div class="col-xs-1"> + <!-- small box --> + <div onclick="callsound(<?php echo $sl->row('ppr_id');?>)" class="btn small-box bg-blue"> + <div class="inner"> + <h3><i class="fa fa-microphone"></i></h3> + </div> + </div> + </div> + <div class="col-xs-2"> + <!-- small box --> + <div onclick="selesai(<?php echo $sl->row('ppr_id');?>)" class="btn small-box bg-green"> + <div class="inner"> + <h3>Selesai</h3> + </div> + </div> + </div> + <?php + }?> + </div><!-- /.row --> + </section> + <div class="control-sidebar-bg"></div> +</body> +<script type="text/javascript"> + var url="<?php echo base_url();?>"; + function next(){ + window.location = url+"index.php/ps_ranap_admin/next"; + } + + function selesai(id){ + window.location = url+"index.php/ps_ranap_admin/selesai/"+id; + } + + function callsound(id){ + window.location = url+"index.php/ps_ranap_admin/callsound/"+id; + } + + function pending(id){ + var r=confirm("Apakah anda ingin melakukan pending ?") + if (r==true) + window.location = url+"index.php/ps_ranap_admin/pending/"+id; + else + return false; + } + + function pendingselesai(id){ + var r=confirm("Apakah anda ingin selesaikan pending?") + if (r==true) + window.location = url+"index.php/ps_ranap_admin/selesai/"+id; + else + return false; + } + +// function del(id){ +// var isi=document.getElementById('isi'+id).value; +// var r=confirm("Apakah anda ingin menghapus nomor "+isi+"?") +// if (r==true) +// window.location = url+"index.php/ps_loket/delete/"+id; +// else +// return false; +// } +</script> \ No newline at end of file diff --git a/application/views/screen/v_info_klinik_split.php b/application/views/screen/v_info_klinik_split.php new file mode 100644 index 0000000..5b8988d --- /dev/null +++ b/application/views/screen/v_info_klinik_split.php @@ -0,0 +1,86 @@ +<body class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h1 style="text-align: center;"><b><?php echo $title;?></b> - <b><code>Silahkan Menuju Ke Klinik</code></b></h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php/"><i class="fa fa-backward"></i> Kembali</a></li> + </ol> + </section> + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="form-group"> + + <div class="col-sm-12"> + <table class="table"> + + <?php + $no=0;$sethr=0;$tabsatu=""; + foreach ($mk as $dataklinik){ + $no++; + switch($dataklinik->mk_id){ + case '1':$color = "green";break; + case '2':$color = "red";break; + case '3':$color = "yellow";break; + case '4':$color = "blue";break; + case '5':$color = "navy";break; + case '6':$color = "teal";break; + case '7':$color = "purple";break; + case '8':$color = "orange";break; + case '9':$color = "maroon";break; + case '10':$color = "gray";break; + case '11':$color = "black";break; + case '12':$color = "info";break; + case '13':$color = "green";break; + case '14':$color = "red";break; + case '15':$color = "yellow";break; + case '16':$color = "blue";break; + case '17':$color = "navy";break; + case '18':$color = "teal";break; + case '19':$color = "purple";break; + case '20':$color = "orange";break; + case '21':$color = "maroon";break; + case '22':$color = "gray";break; + case '23':$color = "black";break; + default: $color = "green";break; + } + + $numrow=0; + $baris=0; + $datapp=""; + foreach ($ip as $dat_pp){ + if($dataklinik->mk_id==$dat_pp->pp_klinik_id){ + $numrow++;$baris++; + if($baris==2){ + $baris=0; + $datapp=$datapp."<td style='text-align: center;' class='bg-$color'><span class='info-box-number'>".$dat_pp->pp_nomor_antrian_klinik."</span></td></tr>"; + } + else{ + $datapp=$datapp."<td style='text-align: center;' class='bg-$color'><span class='info-box-number'>".$dat_pp->pp_nomor_antrian_klinik."</span></td>"; + } + } + } + + $tabsatu = $tabsatu."<td><table class='table table-striped'><tr><td colspan='3' style='text-align: center;' class='bg-$color'><div class='small-box'><h3>$dataklinik->mk_nama</h3></div></td></tr>$datapp</table></td>"; + + }?> + <tr> + <td><?php echo $tabsatu;?></td> + </tr> + </table> + </div> + + + </div> + </div> + </section> + <div class="control-sidebar-bg"></div> +</body> + +<script> + var url="<?php echo base_url();?>"; + +// setTimeout(function(){ +// window.location.reload(1); +// +// }, 5000); +</script> diff --git a/application/views/screen/v_info_loket.php b/application/views/screen/v_info_loket.php new file mode 100644 index 0000000..5873952 --- /dev/null +++ b/application/views/screen/v_info_loket.php @@ -0,0 +1,143 @@ +<body onload="panggil()" class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h2 style="text-align: center;"><b></b></h2> + <ol class="breadcrumb"> + <li><!--a href="<?php echo base_url()?>index.php/"><i class="fa fa-backward"></i> Kembali</a--></li> + </ol> + </section> + <?php + $noantr = "TUNGGU"; + $nmklin = "-"; + $shiftp = ""; + $setnext= 1; + $setprtnext = ""; + $panggil= 0; + $info1="KOSONG"; + $info2="KOSONG"; + $info3="KOSONG"; + $info4="KOSONG"; + $info5="KOSONG"; + $info6="KOSONG"; + $info7="KOSONG"; + $info8="KOSONG"; + $info9="KOSONG"; + + $prtid = ""; + $ppid = ""; + $kliid = ""; + + foreach ($pg as $pengunjung) { + if($pengunjung->pp_loket==$idloket){ + if($klinik){ + $klinikpecah = explode(",",$klinik); + $jumlah = count($klinikpecah); + for($i=0;$i<$jumlah;$i++){ + if($klinikpecah[$i]==$pengunjung->pp_klinik_id){ + if($pengunjung->prt_status <= '2'){ + if($pengunjung->pp_pembayaran==$pembayaran){ + if($pengunjung->prt_status=='1' && $setnext<=6){ + if($setnext==1){$info1=$pengunjung->pp_nomor_antrian;if($pengunjung->pp_fasttrack!=null){$info1=$info1." - FS";}} + elseif($setnext==2){$info2=$pengunjung->pp_nomor_antrian;if($pengunjung->pp_fasttrack!=null){$info2=$info2." - FS";}} + elseif($setnext==3){$info3=$pengunjung->pp_nomor_antrian;if($pengunjung->pp_fasttrack!=null){$info3=$info3." - FS";}} + elseif($setnext==4){$info4=$pengunjung->pp_nomor_antrian;if($pengunjung->pp_fasttrack!=null){$info4=$info4." - FS";}} + elseif($setnext==5){$info5=$pengunjung->pp_nomor_antrian;if($pengunjung->pp_fasttrack!=null){$info5=$info5." - FS";}} + elseif($setnext==6){$info6=$pengunjung->pp_nomor_antrian;if($pengunjung->pp_fasttrack!=null){$info6=$info6." - FS";}} + elseif($setnext==7){$info6=$pengunjung->pp_nomor_antrian;if($pengunjung->pp_fasttrack!=null){$info7=$info7." - FS";}} + elseif($setnext==8){$info6=$pengunjung->pp_nomor_antrian;if($pengunjung->pp_fasttrack!=null){$info8=$info8." - FS";}} + elseif($setnext==9){$info6=$pengunjung->pp_nomor_antrian;if($pengunjung->pp_fasttrack!=null){$info9=$info9." - FS";}} + $setnext++; + + } + if($pengunjung->prt_status=='2'){ + //echo $pengunjung->pp_nomor_antrian." | ".$pengunjung->prt_status." | "; + $noantr = $pengunjung->pp_nomor_antrian; + $nmklin = $pengunjung->mk_nama; + $shiftp = " - SHIFT ".$pengunjung->pp_shift; + $fstr = $pengunjung->pp_fasttrack; + if($pengunjung->pp_panggil===null){ + $panggil= 0; + }else{ + $panggil= $pengunjung->pp_panggil; + } + } + } + } + } + } + } + } + }?> + <!-- Main content --> + <input type="hidden" id="idloket" value="<?php echo $idloket;?>" /> + <input type="hidden" id="loket" value="<?php echo $title;?>" /> + <input type="hidden" id="noantrian" value="<?php echo $noantr;?>" /> + <input type="hidden" id="pang" value="<?php echo $panggil;?>" /> + + <section class="content"> + <div class="row"> + <div class="form-group"> + <div class="col-sm-12"> + <div class="col-lg-0 col-xs-6"></div> + <div class="col-lg-12"> + <div class="small-box bg-purple"> + <div class="inner text-center"> + <h3>RSUD Dr. Saiful Anwar Malang </h3> + </div> + </div> + </div> + <div class="col-lg-2 col-xs-6"></div> + </div> + + <div class="col-sm-12"> + <div class="col-lg-0 col-xs-6"></div> + <div class="col-lg-12 col-xs-6"> + <div class="small-box <?php if(isset($fstr)){if($fstr!=null){echo "bg-red";}}else{echo "bg-green";}?>"> + <div class="inner text-center"> + <h3></h3> + <h3 style="font-size: 400px" ><?php echo $title;?></h3> + </div> + </div> + </div> + <div class="col-lg-0 col-xs-6"></div> + </div> + + <div class="col-sm-12"> + <div class="col-lg-0 col-xs-6"></div> + <div class="col-lg-12 col-xs-6"> + <div class="small-box bg-primary"> + <div class="inner text-center"> + <?php + if($title=="Loket 1"){ + ?> + <h3 style="font-size: 50px"> TINDAKAN KHUSUS </h3> + <h3 style="font-size: 70px" >( REHAB MEDIK, RADIOTERAPI, TINDAKAN DLL )</h3> + <?php + }elseif($title=="Loket 12"){ + ?> + <h3 style="font-size: 70px"> UMUM, KARYAWAN, GCU, </h3> + <h3 style="font-size: 70px"> SPM, JKMM & ASURANSI LAIN </h3> + <?php + } + ?> + </div> + </div> + </div> + <div class="col-lg-0 col-xs-6"></div> + </div> + + </div> + </div> + </section> + <div class="control-sidebar-bg"></div> +</body> +<script> + var url="<?php echo base_url();?>"; + setTimeout(function(){ + var id = document.getElementById('idloket').value; + if(id!=0){ + window.location = url+"index.php/ps_screen/screenloket/"+id; + }else{ + window.location.reload(1); + } + }, 15000); +</script> \ No newline at end of file diff --git a/application/views/screen/v_info_loketBK.php b/application/views/screen/v_info_loketBK.php new file mode 100644 index 0000000..65ab54d --- /dev/null +++ b/application/views/screen/v_info_loketBK.php @@ -0,0 +1,232 @@ +<body onload="panggil()" class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h2 style="text-align: center;"><b></b></h2> + <ol class="breadcrumb"> + <li><!--a href="<?php echo base_url()?>index.php/"><i class="fa fa-backward"></i> Kembali</a--></li> + </ol> + </section> + <?php + $noantr = "TUNGGU"; + $nmklin = "-"; + $shiftp = ""; + $setnext= 1; + $setprtnext = ""; + $panggil= 0; + $info1="KOSONG"; + $info2="KOSONG"; + $info3="KOSONG"; + $info4="KOSONG"; + $info5="KOSONG"; + $info6="KOSONG"; + $info7="KOSONG"; + $info8="KOSONG"; + $info9="KOSONG"; + + $prtid = ""; + $ppid = ""; + $kliid = ""; + + foreach ($pg as $pengunjung) { + if($pengunjung->pp_loket==$idloket){ + if($klinik){ + $klinikpecah = explode(",",$klinik); + $jumlah = count($klinikpecah); + for($i=0;$i<$jumlah;$i++){ + if($klinikpecah[$i]==$pengunjung->pp_klinik_id){ + if($pengunjung->prt_status <= '2'){ + if($pengunjung->pp_pembayaran==$pembayaran){ + if($pengunjung->prt_status=='1' && $setnext<=6){ + if($setnext==1){$info1=$pengunjung->pp_nomor_antrian;if($pengunjung->pp_fasttrack!=null){$info1=$info1." - FS";}} + elseif($setnext==2){$info2=$pengunjung->pp_nomor_antrian;if($pengunjung->pp_fasttrack!=null){$info2=$info2." - FS";}} + elseif($setnext==3){$info3=$pengunjung->pp_nomor_antrian;if($pengunjung->pp_fasttrack!=null){$info3=$info3." - FS";}} + elseif($setnext==4){$info4=$pengunjung->pp_nomor_antrian;if($pengunjung->pp_fasttrack!=null){$info4=$info4." - FS";}} + elseif($setnext==5){$info5=$pengunjung->pp_nomor_antrian;if($pengunjung->pp_fasttrack!=null){$info5=$info5." - FS";}} + elseif($setnext==6){$info6=$pengunjung->pp_nomor_antrian;if($pengunjung->pp_fasttrack!=null){$info6=$info6." - FS";}} + elseif($setnext==7){$info6=$pengunjung->pp_nomor_antrian;if($pengunjung->pp_fasttrack!=null){$info7=$info7." - FS";}} + elseif($setnext==8){$info6=$pengunjung->pp_nomor_antrian;if($pengunjung->pp_fasttrack!=null){$info8=$info8." - FS";}} + elseif($setnext==9){$info6=$pengunjung->pp_nomor_antrian;if($pengunjung->pp_fasttrack!=null){$info9=$info9." - FS";}} + $setnext++; + + } + if($pengunjung->prt_status=='2'){ + //echo $pengunjung->pp_nomor_antrian." | ".$pengunjung->prt_status." | "; + $noantr = $pengunjung->pp_nomor_antrian; + $nmklin = $pengunjung->mk_nama; + $shiftp = " - SHIFT ".$pengunjung->pp_shift; + $fstr = $pengunjung->pp_fasttrack; + if($pengunjung->pp_panggil===null){ + $panggil= 0; + }else{ + $panggil= $pengunjung->pp_panggil; + } + } + } + } + } + } + } + } + }?> + <!-- Main content --> + <input type="hidden" id="idloket" value="<?php echo $idloket;?>" /> + <input type="hidden" id="loket" value="<?php echo $title;?>" /> + <input type="hidden" id="noantrian" value="<?php echo $noantr;?>" /> + <input type="hidden" id="pang" value="<?php echo $panggil;?>" /> + + <section class="content"> + <div class="row"> + <div class="form-group"> + <div class="col-sm-12"> + <div class="col-lg-2 col-xs-6"></div> + <div class="col-lg-8"> + <div class="small-box bg-purple"> + <div class="inner text-center"> + <h3><?php echo $title;?></h3> + </div> + </div> + </div> + <div class="col-lg-2 col-xs-6"></div> + </div> + + <div class="col-sm-12"> + <div class="col-lg-2 col-xs-6"></div> + <div class="col-lg-8 col-xs-6"> + <div class="small-box <?php if(isset($fstr)){if($fstr!=null){echo "bg-red";}}else{echo "bg-green";}?>"> + <div class="inner text-center"> + <h3>Antrian Pelayanan Sekarang</h3> + <h3 style="font-size: 200px" ><?php echo $noantr;?> <?php if(isset($fstr)){if($fstr!=null){echo "FS";}}?></h3> + <p style="font-size: 20px"><?php echo $nmklin." ".$shiftp;?></p> + </div> + </div> + </div> + <div class="col-lg-2 col-xs-6"></div> + </div> + <div class="col-sm-12"> + <div class="col-lg-12"> + <div class="small-box bg-blue"> + <div class="inner text-center"> + <h3>Antrian <?php echo $title;?> Selanjutnya</h3> + </div> + </div> + </div> + </div> + <div class="col-sm-12"> + <div class="col-lg-4 col-xs-6"> + <div class="small-box bg-yellow"> + <div class="inner text-center"> + <h3 style="font-size: 50px"><?php echo $info1;?></h3> + </div> + </div> + </div> + <div class="col-lg-4 col-xs-6"> + <div class="small-box bg-yellow"> + <div class="inner text-center"> + <h3 style="font-size: 50px"><?php echo $info2;?></h3> + </div> + </div> + </div> + <div class="col-lg-4 col-xs-6"> + <div class="small-box bg-yellow"> + <div class="inner text-center"> + <h3 style="font-size: 50px"><?php echo $info3;?></h3> + </div> + </div> + </div> + </div> + <div class="col-sm-12"> + <div class="col-lg-4 col-xs-6"> + <div class="small-box bg-yellow"> + <div class="inner text-center"> + <h3 style="font-size: 50px"><?php echo $info4;?></h3> + </div> + </div> + </div> + <div class="col-lg-4 col-xs-6"> + <div class="small-box bg-yellow"> + <div class="inner text-center"> + <h3 style="font-size: 50px"><?php echo $info5;?></h3> + </div> + </div> + </div> + <div class="col-lg-4 col-xs-6"> + <div class="small-box bg-yellow"> + <div class="inner text-center"> + <h3 style="font-size: 50px"><?php echo $info6;?></h3> + </div> + </div> + </div> + </div> + <div class="col-sm-12"> + <div class="col-lg-4 col-xs-6"> + <div class="small-box bg-yellow"> + <div class="inner text-center"> + <h3 style="font-size: 50px"><?php echo $info7;?></h3> + </div> + </div> + </div> + <div class="col-lg-4 col-xs-6"> + <div class="small-box bg-yellow"> + <div class="inner text-center"> + <h3 style="font-size: 50px"><?php echo $info8;?></h3> + </div> + </div> + </div> + <div class="col-lg-4 col-xs-6"> + <div class="small-box bg-yellow"> + <div class="inner text-center"> + <h3 style="font-size: 50px"><?php echo $info9;?></h3> + </div> + </div> + </div> + </div> + </div> + </div> + </section> + <div class="control-sidebar-bg"></div> +</body> +<script> + var url="<?php echo base_url();?>"; + setTimeout(function(){ + var id = document.getElementById('idloket').value; + if(id!=0){ + window.location = url+"index.php/ps_screen/screenloket/"+id; + }else{ + window.location.reload(1); + } + }, 15000); + + function panggil(){ + //var idpp = document.getElementById('idpp').value; + var kode = document.getElementById('noantrian').value; + var loket = document.getElementById('loket').value; + var pangg = document.getElementById('pang').value; + + //alert(pangg); + + if(kode!="TUNGGU"){ + if(pang!=0){ + var pecah = kode.split("",-2); + var hasil = ""; + for (i=0;i<6;i++){ + if(i<=1){ + hasil = hasil+" "+pecah[i]+" . "; + }else{ + hasil = hasil+" "+pecah[i]+", "; + } + } + + responsiveVoice.speak( + "Nomor Antrian. "+hasil+" , ke "+loket+".", + "Indonesian Female", + { + pitch: 1, + rate: 0.8, + volume: 1 + } + ); + + } + } + } +</script> +<script src="https://code.responsivevoice.org/responsivevoice.js?key=VZgeKlw3"></script> \ No newline at end of file diff --git a/application/views/screen/v_ranap.php b/application/views/screen/v_ranap.php new file mode 100644 index 0000000..21bcf2d --- /dev/null +++ b/application/views/screen/v_ranap.php @@ -0,0 +1,208 @@ +<body onload="panggil()" class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h2 style="text-align: center;"><b></b></h2> + <ol class="breadcrumb"> + <li><!--a href="<?php echo base_url()?>index.php/"><i class="fa fa-backward"></i> Kembali</a--></li> + </ol> + </section> + <?php + $noantr = "TUNGGU"; + + $setnext= 1; + + $info1="KOSONG"; + $info2="KOSONG"; + $info3="KOSONG"; + $info4="KOSONG"; + $info5="KOSONG"; + $info6="KOSONG"; + $info7="KOSONG"; + $info8="KOSONG"; + $info9="KOSONG"; + $info10="KOSONG"; +// + foreach ($dp as $pengunjung) { + if($setnext<=10){ + if($setnext==1){$info1=$pengunjung->ppr_nomor_antrian;} + elseif($setnext==2){$info2=$pengunjung->ppr_nomor_antrian;} + elseif($setnext==3){$info3=$pengunjung->ppr_nomor_antrian;} + elseif($setnext==4){$info4=$pengunjung->ppr_nomor_antrian;} + elseif($setnext==5){$info5=$pengunjung->ppr_nomor_antrian;} + elseif($setnext==6){$info6=$pengunjung->ppr_nomor_antrian;} + elseif($setnext==7){$info7=$pengunjung->ppr_nomor_antrian;} + elseif($setnext==8){$info8=$pengunjung->ppr_nomor_antrian;} + elseif($setnext==9){$info9=$pengunjung->ppr_nomor_antrian;} + elseif($setnext==10){$info10=$pengunjung->ppr_nomor_antrian;} + $setnext++; + } + } + + $noan = "TUNGGU"; + $id = ""; + + $pang = 1; + $infopang1="KOSONG"; + foreach ($dps as $setpang){ + if($pang<=1){ + if($pang==1){ + $infopang1=$setpang->ppr_nomor_antrian; + if($setpang->ppr_callstatus=="1"){ + $noan = $setpang->ppr_nomor_antrian; + $id = $setpang->ppr_id; + } + } + $pang++; + } + } + ?> + <!-- Main content --> + <input type="hidden" id="noantrian" value="<?php echo $noan;?>" /> + <input type="hidden" id="idantrian" value="<?php echo $id;?>" /> + + + <section class="content"> + <div class="row"> + <div class="form-group"> + <div class="col-sm-12"> + <div class="col-lg-2"></div> + <div class="col-lg-8"> + <div class="small-box bg-purple"> + <div class="inner text-center"> + <h3>Loket Rawat Inap</h3> + </div> + </div> + <div class="small-box bg-green"> + <div class="inner text-center"> + <h3 style="font-size: 200px" ><?php echo $infopang1;?></h3> + </div> + </div> + </div> + <div class="col-lg-2"></div> + </div> + + <div class="col-sm-12"> + <div class="col-lg-12"> + <div class="small-box bg-blue"> + <div class="inner text-center"> + <h3>Antrian Rawat Inap Selanjutnya</h3> + </div> + </div> + </div> + </div> + <div class="col-sm-12"> + <div class="col-lg-4 col-xs-6"> + <div class="small-box bg-yellow"> + <div class="inner text-center"> + <h3 style="font-size: 50px"><?php echo $info1;?></h3> + </div> + </div> + </div> + <div class="col-lg-4 col-xs-6"> + <div class="small-box bg-yellow"> + <div class="inner text-center"> + <h3 style="font-size: 50px"><?php echo $info2;?></h3> + </div> + </div> + </div> + <div class="col-lg-4 col-xs-6"> + <div class="small-box bg-yellow"> + <div class="inner text-center"> + <h3 style="font-size: 50px"><?php echo $info3;?></h3> + </div> + </div> + </div> + </div> + <div class="col-sm-12"> + <div class="col-lg-4 col-xs-6"> + <div class="small-box bg-yellow"> + <div class="inner text-center"> + <h3 style="font-size: 50px"><?php echo $info4;?></h3> + </div> + </div> + </div> + <div class="col-lg-4 col-xs-6"> + <div class="small-box bg-yellow"> + <div class="inner text-center"> + <h3 style="font-size: 50px"><?php echo $info5;?></h3> + </div> + </div> + </div> + <div class="col-lg-4 col-xs-6"> + <div class="small-box bg-yellow"> + <div class="inner text-center"> + <h3 style="font-size: 50px"><?php echo $info6;?></h3> + </div> + </div> + </div> + </div> + <div class="col-sm-12"> + <div class="col-lg-4 col-xs-6"> + <div class="small-box bg-yellow"> + <div class="inner text-center"> + <h3 style="font-size: 50px"><?php echo $info7;?></h3> + </div> + </div> + </div> + <div class="col-lg-4 col-xs-6"> + <div class="small-box bg-yellow"> + <div class="inner text-center"> + <h3 style="font-size: 50px"><?php echo $info8;?></h3> + </div> + </div> + </div> + <div class="col-lg-4 col-xs-6"> + <div class="small-box bg-yellow"> + <div class="inner text-center"> + <h3 style="font-size: 50px"><?php echo $info9;?></h3> + </div> + </div> + </div> + </div> + </div> + </div> + </section> + <div class="control-sidebar-bg"></div> +</body> +<script> + var url="<?php echo base_url();?>"; + setTimeout(function(){ + var kode = document.getElementById('noantrian').value; + var id = document.getElementById('idantrian').value; + if(kode!="TUNGGU"){ + window.location = url+"index.php/ps_screenranap/set_null/"+id; + }else{ + window.location = url+"index.php/ps_screenranap"; + } + + + }, 15000); + + function panggil(){ + var kode = document.getElementById('noantrian').value; + if(kode!="TUNGGU"){ + + var pecah = kode.split("",-2); + var hasil = ""; + for (i=0;i<3;i++){ + if(i<=1){ + hasil = hasil+" "+pecah[i]+" . "; + }else{ + hasil = hasil+" "+pecah[i]+", "; + } + } + + responsiveVoice.speak( + "Nomor Antrian. "+hasil+" , silahkan menuju Loket. Sekali lagi, Nomor Antrian. "+hasil+", silahkan menuju Loket.", + "Indonesian Female", + { + pitch: 1, + rate: 1, + volume: 1 + } + ); + + + } + } +</script> +<script src="https://code.responsivevoice.org/responsivevoice.js?key=VZgeKlw3"></script> \ No newline at end of file diff --git a/application/views/setting/hakakses/form_hakakses.php b/application/views/setting/hakakses/form_hakakses.php new file mode 100644 index 0000000..c7f21a5 --- /dev/null +++ b/application/views/setting/hakakses/form_hakakses.php @@ -0,0 +1,136 @@ +<section class="content-header"> + <h1> + <small></small> + </h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php/home"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li>Setting</li> + <li><a href="<?php echo base_url()?>index.php/hakakses">Hak Akses</a></li> + <li class="active"><?php echo $title ?></li> + </ol> +</section> +<section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title"><?php echo $title ?> | <?php echo $tu->row('mt_nama');?> </h3> + </div><!-- /.box-header --> + <div class="box-body"> + <!-- form start --> + <?php if(validation_errors()){ ?> + <div class="alert alert-danger alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4><i class="icon fa fa-ban"></i> Alert!</h4> + <?php echo validation_errors() ?> + </div> + <?php } ?> + <form class="form-horizontal" id="form" action="<?php echo(base_url()); ?>index.php/ps_hakakses/prosesedithakakses" method="post"> + <?php //echo form_open_multipart('index.php/user/prosesedit');?> + <div class="box-body form-horizontal"> + <div class="box-body"> + <div class="box"> + <div class="box-body no-padding"> + <input type="hidden" name="id" value="<?php echo $tu->row('mt_id');?>"/> + <table class="table table-striped"> + <tr> + <th width="5%">No</th> + <th width="55%">Menu</th> + <th width="10%">Akses</th> + <th width="10%">View</th> + <th width="10%">Tambah</th> + <th width="10%">Edit</th> + <th width="10%">Delete</th> + </tr> + <?php + $no=0; + //$id_input=""; + foreach ($mn as $menu) { + $parentmenu=""; + //----cek parent menu----------------------------// + $this->db->where('mm_id', $menu->mm_parent); + $cekParent = $this->db->get('master_menu'); + foreach ($cekParent->result() as $par) + { + $parentmenu="<code>".$par->mm_nama." /</code> "; + } + //----cek parent menu----------------------------// + + $no++; + echo(" + <tr> + <td>".$no."</td> + <td><input type='hidden' name='id_menu' value='".$menu->mm_id."'>".$parentmenu.$menu->mm_nama."</td> + "); + $cekakses=""; + $cekview=""; + $cektambah=""; + $cekedit=""; + $cekdelete=""; + $idusermenu=""; + $setdisabled=""; + foreach($um as $usermenu){ + if($usermenu->mum_menu_id==$menu->mm_id){ + $cekakses="checked"; + + $this->db->where('mum_id', $usermenu->mum_id); + $query1 = $this->db->get('master_user_menu'); + foreach ($query1->result() as $row1) + { + if($row1->mum_lihat=="lihat"){ + $cekview="checked"; + } + if($row1->mum_tambah=="tambah"){ + $cektambah="checked"; + } + if($row1->mum_ubah=="ubah"){ + $cekedit="checked"; + } + if($row1->mum_hapus=="hapus"){ + $cekdelete="checked"; + } + } + } + } + if ($actionform=="prosesview"){ + $setdisabled="disabled=''"; + } + if($menu->mm_action=='true'){ + echo (" + <td><input type='checkbox'".$setdisabled." id='action".$no."' name='akses[]' class='flat-red'".$cekakses." value='".$tu->row('mt_id')."-".$menu->mm_id."'></td> + <td><input type='checkbox'".$setdisabled." id='view".$no."' name='view[]' class='flat-red'".$cekview." value='".$menu->mm_id."' ></td> + <td><input type='checkbox'".$setdisabled." id='tambah".$no."' name='tambah[]' class='flat-red'".$cektambah." value='".$menu->mm_id."' ></td> + <td><input type='checkbox'".$setdisabled." id='edit".$no."' name='edit[]' class='flat-red'".$cekedit." value='".$menu->mm_id."'></td> + <td><input type='checkbox'".$setdisabled." id='delete".$no."' name='delete[]' class='flat-red'".$cekdelete." value='".$menu->mm_id."'></td> + </tr> + "); + + }else{ + echo (" + <td><input type='checkbox'".$setdisabled." id='action".$no."' name='akses[]' class='flat-red'".$cekakses." value='".$tu->row('mt_id')."-".$menu->mm_id."'></td> + <td></td> + <td></td> + <td></td> + <td></td> + </tr> + "); + } + } + ?> + </table> + </div><!-- /.box-body --> + </div> + </div><!-- /.box-body --> + <div class="box-footer"> + <a href="<?php echo base_url();?>index.php/ps_hakakses" class="btn btn-default">Cancel</a> + <?php if ($actionform!="prosesview"){ ?> + <button type="submit" class="btn btn-warning">Submit</button> + <?php } ?> + </div><!-- /.box-footer --> + </form> + <!-- form end --> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> +</section> diff --git a/application/views/setting/hakakses/form_tipeuser.php b/application/views/setting/hakakses/form_tipeuser.php new file mode 100644 index 0000000..3ade18c --- /dev/null +++ b/application/views/setting/hakakses/form_tipeuser.php @@ -0,0 +1,62 @@ +<section class="content-header"> + <h1> + <small></small> + </h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li>Setting</li> + <li><a href="<?php echo base_url()?>index.php/hakakses">Hak Akses</a></li> + <li class="active"><?php echo $title;?></li> + </ol> +</section> +<section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title"><?php echo $title; ?></h3> + </div> + <div class="box-body"> + <?php if(validation_errors()){ ?> + <div class="alert alert-danger alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4><i class="icon fa fa-ban"></i> Alert!</h4> + <?php echo validation_errors() ?> + </div> + <?php } + + $setdisabled=""; + $setidedit=""; + $setnameedit=""; + if ($actionform=="prosesview"){ + $setdisabled="disabled=''"; + } + if ($actionform!="prosesadd"){ + $setidedit=$ha->row('mt_id'); + $setnameedit=$ha->row('mt_nama'); + } + + ?> + <form class="form-horizontal" id="form" action="<?php echo(base_url()); ?>index.php/ps_hakakses/<?php echo $actionform; ?>" method="post"> + <div class="box-body"> + <div class="form-group"> + <label for="namatipeuser" class="col-sm-2 control-label">Nama Tipe User</label> + <div class="col-sm-6"> + <input type="hidden" name="id" value="<?php echo $setidedit;?>"/> + <input id="namatipeuser" class="form-control" <?php echo $setdisabled; ?> name="namatipeuser" type="text" placeholder="Masukan Nama Tipe User" autocomplete="off" value="<?php echo $setnameedit;?>"/> + </div> + </div> + </div> + <div class="box-footer"> + <a href="<?php echo base_url();?>index.php/ps_hakakses" class="btn btn-default">Cancel</a> + <?php if ($actionform!="prosesview"){ ?> + <button type="submit" class="btn btn-warning">Submit</button> + <?php } ?> + </div> + </div> + </form> + </div> + </div> + </div> + </div> +</section> \ No newline at end of file diff --git a/application/views/setting/hakakses/v_hakakses.php b/application/views/setting/hakakses/v_hakakses.php new file mode 100644 index 0000000..8eca313 --- /dev/null +++ b/application/views/setting/hakakses/v_hakakses.php @@ -0,0 +1,95 @@ +<body class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h1> + <?php + //---------------------start check access action TAMBAH-------------------// + if(!empty($this->vartambah)){ echo "<small> <a href='".base_url()."index.php/ps_hakakses/add' class='btn btn-block btn-primary btn-sm'>Tambah Baru</a> </small>"; + }else{ echo "<small></small>";} + //---------------------end check access action TAMBAH-------------------// + ?> + </h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li>Setting</li> + <li class="active"><?php echo $title ?></li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title"><?php echo $title ?></h3> + </div><!-- /.box-header --> + <div class="box-body"> + <?php if($this->session->flashdata('message')){?> + <div class="alert alert-success alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-check"></i> Alert!</h4> + <?php echo $this->session->flashdata('message');?> + </div> + <?php }?> + <div class="box-body table-responsive no-padding"> + <table id="example1" class="table table-bordered table-striped"> + <thead> + <tr> + <th width="5%">No</th> + <th>Nama Tipe User</th> + <th width="25%">Aksi</th> + </tr> + </thead> + <tbody> + <?php + $no=0; + foreach ($ha as $tipeuser) { + $no++; + //---------------------start check access action-------------------// + $editbutton=""; + $edithakakses=""; + $deletebutton=""; + $viewbutton=""; + if(!empty($this->varedit)){ + $editbutton="<a href='".base_url()."index.php/ps_hakakses/edit/".$tipeuser->mt_id."' class='btn btn-warning btn-xs'><i class='fa fa-edit'></i> Edit</a> "; + } + if(!empty($this->varedit)){ + $edithakakses="<a href='".base_url()."index.php/ps_hakakses/edithakakses/".$tipeuser->mt_id."' class='btn btn-success btn-xs'><i class='fa fa-gear'></i> Hak Akses</a> "; + } + if(!empty($this->vardelete)){ + $deletebutton="<a onclick='del(".$tipeuser->mt_id.")' class='btn btn-danger btn-xs'><i class='fa fa-trash'></i> Delete</a><input type='hidden' id='isi".$tipeuser->mt_id."' value='".$tipeuser->mt_nama."'> "; + } + if(!empty($this->varview)){ + $viewbutton="<a href='".base_url()."index.php/ps_hakakses/view/".$tipeuser->mt_id."' class='btn btn-primary btn-xs'><i class='fa fa-eye'></i> View</a> "; + } + //---------------------end check access action-------------------// + echo(" + <tr> + <td>".$no."</td> + <td>".$tipeuser->mt_nama."</td> + <td>".$viewbutton.$editbutton.$deletebutton.$edithakakses."</td> + </tr> + "); + } + ?> + </tbody> + </table> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + </section> + <div class="control-sidebar-bg"></div> +</body> +<script type="text/javascript"> + var url="<?php echo base_url();?>"; + function del(id){ + var isi=document.getElementById('isi'+id).value; + var r=confirm("Apakah anda ingin menghapus tipe user "+isi+"?") + if (r==true) + window.location = url+"index.php/ps_hakakses/delete/"+id; + else + return false; + } +</script> \ No newline at end of file diff --git a/application/views/setting/klinik/form_klinik.php b/application/views/setting/klinik/form_klinik.php new file mode 100644 index 0000000..abae99b --- /dev/null +++ b/application/views/setting/klinik/form_klinik.php @@ -0,0 +1,283 @@ +<section class="content-header"> + <h1> + <small></small> + </h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li>Setting</li> + <li><a href="<?php echo base_url()?>index.php/ps_klinik">Master Klinik</a></li> + <li class="active"><?php echo $title;?></li> + </ol> +</section> +<section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title"><?php echo $title; ?></h3> + </div> + <div class="box-body"> + <?php if(validation_errors()){ ?> + <div class="alert alert-danger alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4><i class="icon fa fa-ban"></i> Alert!</h4> + <?php echo validation_errors() ?> + </div> + <?php } + + $setdisabled =""; + $setidedit =""; + + $setnama =""; + $setkode =""; + $setshift =""; + //$setmenit =""; + $setquota =""; + $setquotabangku =""; + $setstatusshift =""; + $setaktif =""; + $setjadwal =""; + $setautoshift =""; + + $jamawal =""; + $menitawal =""; + $waktu =""; + + $senin="";$selasa="";$rabu="";$kamis="";$jumat=""; + + if ($actionform=="prosesview"){ + $setdisabled="disabled=''"; + } + if ($actionform!="prosesadd"){ + $setidedit =$mk->row('mk_id'); + + $setnama =$mk->row('mk_nama'); + $setkode =$mk->row('mk_kode'); + $setshift =$mk->row('mk_shift'); + //$setmenit =$mk->row('mk_menit'); + $setquota =$mk->row('mk_quota'); + $setquotabangku =$mk->row('mk_quota_bangku'); + $setstatusshift =$mk->row('mk_status_shift'); + $setaktif =$mk->row('mk_aktif'); + + + if($mk->row('mk_auto_shift')=="1"){$setautoshift="checked";} + + $setjadwal =$mk->row('mk_jadwal'); + $pecahjadwal = explode("|",$setjadwal); + $jumdat = count($pecahjadwal); + for ($x = 0; $x <= $jumdat; $x++){ + if(isset($pecahjadwal[$x])){ + if($pecahjadwal[$x]=="senin"){$senin="checked";} + if($pecahjadwal[$x]=="selasa"){$selasa="checked";} + if($pecahjadwal[$x]=="rabu"){$rabu="checked";} + if($pecahjadwal[$x]=="kamis"){$kamis="checked";} + if($pecahjadwal[$x]=="jumat"){$jumat="checked";} + } + } + + $pecahwaktu = explode("|",$mk->row('mk_jam_shift')); + $jumwaktu = count($pecahwaktu); + for ($x = 0; $x < $jumwaktu; $x++){ + $pecahjammenit = explode(":",$pecahwaktu[$x]); + $jam = $pecahjammenit[0]; + if(isset($pecahjammenit[1])){$menit = $pecahjammenit[1];}else{$menit = "00";} + //$menit = $pecahjammenit[1]; + $numset = $x+1; + + if($x==0){ + $jamawal =$jam; + $menitawal =$menit; + }else{ + if($x!=($jumwaktu-1)){ + $waktu =$waktu." + <div class='box-body'> + <div class='form-group'> + <label class='col-sm-2 control-label'></label> + <div class='col-sm-2'> + <input id='jam$numset' class='form-control' $setdisabled name='jam[]' placeholder='Jam Buka Shift $numset' autocomplete='off' value='$jam'/> + </div> + <label for='jammulai' class='col-sm-2 control-label' style='text-align: center;'> : </label> + <div class='col-sm-2'> + <input id='menit$numset' class='form-control' $setdisabled name='menit[]' placeholder='Menit Buka Shift $numset' autocomplete='off' value='$menit' /> + </div> + </div> + </div> + + "; + } + } + } + } + + ?> + <form class="form-horizontal" id="form" action="<?php echo(base_url()); ?>index.php/ps_klinik/<?php echo $actionform; ?>" method="post" autocomplete="off"> + <div class="box-body"> + <div class="form-group"> + <label for="kode" class="col-sm-2 control-label">Kode</label> + <div class="col-sm-3"> + <input type="hidden" name="id" value="<?php echo $setidedit;?>"/> + <input id="kode" class="form-control" <?php echo $setdisabled; ?> name="kode" type="text" placeholder="Masukan Kode Klinik" autocomplete="off" value="<?php echo $setkode;?>" data-inputmask='"mask": "AA"' data-mask /> + </div> + <label class="col-sm-3 control-label"><code>Masukan Kode Klinik 2 Huruf</code></label> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="nama" class="col-sm-2 control-label">Nama</label> + <div class="col-sm-6"> + <input id="nama" class="form-control" <?php echo $setdisabled; ?> name="nama" type="text" placeholder="Masukan Nama Klinik" autocomplete="off" value="<?php echo $setnama;?>"/> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="shift" class="col-sm-2 control-label">Shift</label> + <div class="col-sm-2"> + <input id="shift" onchange="jamshift()" class="form-control" <?php echo $setdisabled; ?> name="shift" type="number" placeholder="Jumlah Shift" autocomplete="off" value="<?php echo $setshift;?>"/> + </div> + <label for="quota" class="col-sm-2 control-label" style="text-align: center;">Quota Shift</label> + <div class="col-sm-2"> + <input id="quota" class="form-control" <?php echo $setdisabled; ?> name="quota" type="number" placeholder="Quota Per Shift" autocomplete="off" value="<?php echo $setquota;?>"/> + </div> + </div> + </div> + <script> + function jamshift(){ + $("#deletejam").remove(); + $("#appendhere").append("<div id='deletejam'></div>"); + //----mulai jam 07:00 s/d 15:00 (8 jam = 480 menit) + var jumshift = document.getElementById('shift').value; + var bagijam = 480/jumshift; + //var jamawal = "08:00"; + var jamakhir = ""; + + document.getElementById('jam1').value="07"; + document.getElementById('menit1').value="00"; + + var d = new Date("2015-03-25 07:00"); + + for(i=2;i<=jumshift;i++){ + d.setMinutes(d.getMinutes() + bagijam); + var h = d.getHours("H"); + var m = d.getMinutes("M"); + if(h<10){h="0"+h;} + if(m<10){m="0"+m;} + $("#deletejam").append(""+ + "<div class='box-body'>"+ + "<div class='form-group'>"+ + "<label class='col-sm-2 control-label'></label>"+ + "<div class='col-sm-2'>"+ + "<input id='jam"+i+"' class='form-control' name='jam[]' placeholder='Jam Buka Shift "+i+"' autocomplete='off' value='"+h+"' />"+ + "</div>"+ + "<label class='col-sm-2 control-label' style='text-align: center;'> : </label>"+ + "<div class='col-sm-2'>"+ + "<input id='menit"+i+"' class='form-control' name='menit[]' placeholder='Menit Buka Shift "+i+"' autocomplete='off' value='"+m+"' />"+ + "</div>"+ + "</div>"+ + "</div>" + ); + } + } + </script> + <div class="box-body"> + <div class="form-group"> + <label for="jammulai" class="col-sm-2 control-label">Jam Shift</label> + <div class="col-sm-2"> + <input id="jam1" class="form-control" <?php echo $setdisabled; ?> name="jam[]" placeholder="Jam Buka Shift 1" autocomplete="off" value="<?php echo $jamawal;?>"/> + </div> + <label for="jammulai" class="col-sm-2 control-label" style="text-align: center;"> : </label> + <div class="col-sm-2"> + <input id="menit1" class="form-control" <?php echo $setdisabled; ?> name="menit[]" placeholder="Menit Buka Shift 1" autocomplete="off" value="<?php echo $menitawal;?>" /> + </div> + </div> + </div> + <div id="appendhere"><div id="deletejam"><?php echo $waktu;?><!-- Append JS Shift Jam --></div></div> + <div class="box-body"> + <div class="form-group"> + <label for="autoshift" class="col-sm-2 control-label">Auto Shift</label> + <div class="col-sm-6"> + <input id="autoshift" name="autoshift" type="checkbox" class="flat-red" <?php echo $setdisabled; ?> <?php echo $setautoshift;?> /> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="quotabangku" class="col-sm-2 control-label">Quota Bangku</label> + <div class="col-sm-6"> + <input id="quotabangku" class="form-control" <?php echo $setdisabled; ?> name="quotabangku" type="number" placeholder="Masukan Quota Bangku Klinik" autocomplete="off" value="<?php echo $setquotabangku;?>"/> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="jadwal" class="col-sm-2 control-label">Jadwal Klinik</label> + <div class="col-sm-6"> + <table class="table table-bordered"> + <tr> + <th style="width: 10px">#</th> + <th>Hari</th> + <th style="width: 40px">Pilih</th> + </tr> + <tr> + <td>1.</td> + <td>Senin</td> + <td> + <label> + <input id="senin" name="senin" type="checkbox" class="flat-red" <?php echo $setdisabled; ?> <?php echo $senin;?> /> + </label> + </td> + </tr> + <tr> + <td>2.</td> + <td>Selasa</td> + <td> + <label> + <input id="selasa" name="selasa" type="checkbox" class="flat-red" <?php echo $setdisabled; ?> <?php echo $selasa;?> /> + </label> + </td> + </tr> + <tr> + <td>3.</td> + <td>Rabu</td> + <td> + <label> + <input id="rabu" name="rabu" type="checkbox" class="flat-red" <?php echo $setdisabled; ?> <?php echo $rabu;?> /> + </label> + </td> + </tr> + <tr> + <td>4.</td> + <td>Kamis</td> + <td> + <label> + <input id="kamis" name="kamis" type="checkbox" class="flat-red" <?php echo $setdisabled; ?> <?php echo $kamis;?> /> + </label> + </td> + </tr> + <tr> + <td>5.</td> + <td>Jum'at</td> + <td> + <label> + <input id="jumat" name="jumat" type="checkbox" class="flat-red" <?php echo $setdisabled; ?> <?php echo $jumat;?> /> + </label> + </td> + </tr> + </table> + </div> + </div> + </div> + <div class="box-footer"> + <a href="<?php echo base_url();?>index.php/ps_klinik" class="btn btn-default">Cancel</a> + <?php if ($actionform!="prosesview"){ ?> + <button type="submit" class="btn btn-warning">Submit</button> + <?php } ?> + </div> + </form> + </div> + </div> + </div> + </div> +</section> +</div><!-- /.box --> diff --git a/application/views/setting/klinik/v_klinik.php b/application/views/setting/klinik/v_klinik.php new file mode 100644 index 0000000..b2a6661 --- /dev/null +++ b/application/views/setting/klinik/v_klinik.php @@ -0,0 +1,117 @@ +<body class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h1> + <?php + //---------------------start check access action TAMBAH-------------------// + if(!empty($this->vartambah)){ echo "<small> <a href='".base_url()."index.php/ps_klinik/add' class='btn btn-block btn-primary btn-sm'>Tambah Baru</a> </small>"; + }else{ echo "<small></small>";} + //---------------------end check access action TAMBAH-------------------// + ?> + </h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li>Setting</li> + <li class="active"><?php echo $title ?></li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title"><?php echo $title ?></h3> + </div><!-- /.box-header --> + <div class="box-body"> + <?php if($this->session->flashdata('message')){?> + <div class="alert alert-success alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-check"></i> Alert!</h4> + <?php echo $this->session->flashdata('message');?> + </div> + <?php } + //$this->session->userdata('s_klinik'); + ?> + + <div class="box-body table-responsive no-padding"> + <table id="example1" class="table table-bordered table-striped"> + <thead> + <tr> + <th width="5%">No</th> + <th>Kode</th> + <th>Nama Klinik</th> + <th>Shift</th> + <th>Quota Shift</th> + <th width="20%">Aksi</th> + </tr> + </thead> + <tbody> + <?php + $no=0; + foreach ($mk as $masterklinik) { + $no++; + //---------------------start check access action-------------------// + $editbutton=""; + $edithakakses=""; + $deletebutton=""; + $viewbutton=""; + $isidata =""; + if(!empty($this->varedit)){ + $editbutton="<a href='".base_url()."index.php/ps_klinik/edit/".$masterklinik->mk_id."' class='btn btn-warning btn-xs'><i class='fa fa-edit'></i> Edit</a> "; + } + if(!empty($this->vardelete)){ + $deletebutton="<a onclick='del(".$masterklinik->mk_id.")' class='btn btn-danger btn-xs'><i class='fa fa-trash'></i> Delete</a><input type='hidden' id='isi".$masterklinik->mk_id."' value='".$masterklinik->mk_nama."'> "; + } + if(!empty($this->varview)){ + $viewbutton="<a href='".base_url()."index.php/ps_klinik/view/".$masterklinik->mk_id."' class='btn btn-primary btn-xs'><i class='fa fa-eye'></i> View</a> "; + } + //---------------------end check access action-------------------// + if($this->session->userdata('s_FK_TipeUser')=="4"){ + if($this->session->userdata('s_klinik')==$masterklinik->mk_id){ + echo (" + <tr> + <td>".$no."</td> + <td>".$masterklinik->mk_kode."</td> + <td>".$masterklinik->mk_nama."</td> + <td>".$masterklinik->mk_shift."</td> + <td>".$masterklinik->mk_quota."</td> + <td>".$viewbutton.$editbutton.$deletebutton.$edithakakses."</td> + </tr> + "); + } + }else{ + echo (" + <tr> + <td>".$no."</td> + <td>".$masterklinik->mk_kode."</td> + <td>".$masterklinik->mk_nama."</td> + <td>".$masterklinik->mk_shift."</td> + <td>".$masterklinik->mk_quota."</td> + <td>".$viewbutton.$editbutton.$deletebutton.$edithakakses."</td> + </tr> + "); + } + } + ?> + </tbody> + </table> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + </section> + <div class="control-sidebar-bg"></div> +</body> +<script type="text/javascript"> + var url="<?php echo base_url();?>"; + function del(id){ + var isi=document.getElementById('isi'+id).value; + var r=confirm("Apakah anda ingin menghapus klinik "+isi+"?") + if (r==true) + window.location = url+"index.php/ps_klinik/delete/"+id; + else + return false; + } +</script> \ No newline at end of file diff --git a/application/views/setting/loket/form_loket.php b/application/views/setting/loket/form_loket.php new file mode 100644 index 0000000..07d182d --- /dev/null +++ b/application/views/setting/loket/form_loket.php @@ -0,0 +1,165 @@ +<section class="content-header"> + <h1> + <small></small> + </h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li>Setting</li> + <li><a href="<?php echo base_url()?>index.php/ps_loket">Master Loket</a></li> + <li class="active"><?php echo $title;?></li> + </ol> +</section> +<section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title"><?php echo $title; ?></h3> + </div> + <div class="box-body"> + <?php if(validation_errors()){ ?> + <div class="alert alert-danger alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4><i class="icon fa fa-ban"></i> Alert!</h4> + <?php echo validation_errors() ?> + </div> + <?php } + $setdisabled =""; + $setidedit =""; + + $setnama =""; + $setpelayanan =""; + $setquotabangku =""; + $statuspelayanan =""; + $pembayaran =""; + $online =""; + + if ($actionform=="prosesview"){ + $setdisabled="disabled=''"; + } + if ($actionform!="prosesadd"){ + $setidedit =$ml->row('ml_id'); + $setnama =$ml->row('ml_nama'); + $setpelayanan =$ml->row('ml_pelayanan'); + $setquotabangku =$ml->row('ml_quota_bangku'); + $statuspelayanan =$ml->row('ml_statuspelayanan'); + $pembayaran =$ml->row('ml_pembayaran'); + $online =$ml->row('ml_online'); + } + + ?> + <form class="form-horizontal" id="form" action="<?php echo(base_url()); ?>index.php/ps_loket/<?php echo $actionform; ?>" method="post" autocomplete="off"> + <div class="box-body"> + <div class="form-group"> + <label for="nama" class="col-sm-2 control-label">Nama</label> + <div class="col-sm-6"> + <input type="hidden" name="id" value="<?php echo $setidedit;?>"/> + <input id="nama" class="form-control" <?php echo $setdisabled; ?> name="nama" type="text" placeholder="Masukan Nama Loket" autocomplete="off" value="<?php echo $setnama;?>"/> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="quota" class="col-sm-2 control-label">Quota Bangku</label> + <div class="col-sm-6"> + <input id="quota" class="form-control" <?php echo $setdisabled; ?> name="quota" type="number" placeholder="Masukan Quota Bangku" autocomplete="off" value="<?php echo $setquotabangku;?>"/> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="statuspelayanan" class="col-sm-2 control-label">Status Pelayanan</label> + <div class="col-sm-6"> + <select id="statuspelayanan" name="statuspelayanan" class="form-control select"> + <option value=""> Pilih Status Pelayanan </option> + <option <?php if($statuspelayanan=="1"){echo "selected=''";} ?> value="1"> RAWAT JALAN</option> + <option <?php if($statuspelayanan=="2"){echo "selected=''";} ?> value="2"> RAWAT INAP </option> + </select> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="pembayaran" class="col-sm-2 control-label">Pembayaran</label> + <div class="col-sm-6"> + <select id="pembayaran" name="pembayaran" class="form-control select"> + <option value="0"> Pilih Pembayaran </option> + <option <?php if($pembayaran=="1"){echo "selected=''";} ?> value="1"> UMUM / SPM / JKMM / JAMPERSAL / T4 / KARYAWAN</option> + <option <?php if($pembayaran=="2"){echo "selected=''";} ?> value="2"> JKN </option> + </select> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="online" class="col-sm-2 control-label">Keterangan</label> + <div class="col-sm-6"> + <select id="online" name="online" class="form-control select"> + <option value="0"> Pilih Keterangan </option> + <option <?php if($online=="1"){echo "selected=''";} ?> value="1"> OFFLINE</option> + <option <?php if($online=="2"){echo "selected=''";} ?> value="2"> ONLINE</option> + </select> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="pelayanan" class="col-sm-2 control-label">Pelayanan</label> + <div class="col-sm-6"> + <!--input id="pelayanan" class="form-control" <?php echo $setdisabled; ?> name="pelayanan" type="text" placeholder="Masukan Pelayanan" autocomplete="off" value="<?php echo $setpelayanan;?>"/--> + <table class="table table-bordered"> + <tr> + <th style="width: 10px">#</th> + <th>Kode</th> + <th>Klinik</th> + <th style="width: 40px">Pilih</th> + </tr> + <?php + $setcek=""; + $no=0; + foreach ($mk as $masterklinik) { + $no++; + if ($actionform!="prosesadd"){ + $pedat_pelayanan = explode(",",$setpelayanan); + $jumrow = (count($pedat_pelayanan))-1; + for($x=0;$x<=$jumrow;$x++){ + if(isset($pedat_pelayanan[$x])){ + if($pedat_pelayanan[$x]==$masterklinik->mk_id){ + $setcek="checked"; + } + } + } + } + + echo (" + <tr> + <td>$no.</td> + <td>".$masterklinik->mk_kode."</td> + <td>".$masterklinik->mk_nama."</td> + <td> + <label> + <input id='klinik' name='klinik[]' type='checkbox' value='".$masterklinik->mk_id."' $setcek class='flat-red' $setdisabled /> + </label> + </td> + </tr> + "); + $setcek=""; + } + ?> + </table> + + </div> + </div> + </div> + <div class="box-footer"> + <a href="<?php echo base_url();?>index.php/ps_loket" class="btn btn-default">Cancel</a> + <?php if ($actionform!="prosesview"){ ?> + <button type="submit" class="btn btn-warning">Submit</button> + <?php } ?> + </div> + </form> + </div> + </div> + </div> + </div> +</section> \ No newline at end of file diff --git a/application/views/setting/loket/v_loket.php b/application/views/setting/loket/v_loket.php new file mode 100644 index 0000000..b9415a0 --- /dev/null +++ b/application/views/setting/loket/v_loket.php @@ -0,0 +1,139 @@ +<body class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h1> + <?php + //---------------------start check access action TAMBAH-------------------// + if(!empty($this->vartambah)){ echo "<small> <a href='".base_url()."index.php/ps_loket/add' class='btn btn-block btn-primary btn-sm'>Tambah Baru</a> </small>"; + }else{ echo "<small></small>";} + //---------------------end check access action TAMBAH-------------------// + ?> + </h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li>Setting</li> + <li class="active"><?php echo $title ?></li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title"><?php echo $title ?></h3> + </div><!-- /.box-header --> + <div class="box-body"> + <?php if($this->session->flashdata('message')){?> + <div class="alert alert-success alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-check"></i> Alert!</h4> + <?php echo $this->session->flashdata('message');?> + </div> + <?php }?> + <div class="box-body table-responsive no-padding"> + <table id="example1" class="table table-bordered table-striped"> + <thead> + <tr> + <th width="5%">No</th> + <th>Nama Loket</th> + <th>Quota</th> + <th>Pelayanan</th> + <th>Pembayaran</th> + <th>Keterangan</th> + <th width="20%">Aksi</th> + </tr> + </thead> + <tbody> + <?php + $no=0; + foreach ($ml as $masterloket) { + $no++; + //---------------------start check access action-------------------// + $editbutton=""; + $edithakakses=""; + $deletebutton=""; + $viewbutton=""; + + $infoklinik=""; + $infopembayaran=""; + $infoonline=""; + + $pecahpel = explode(",",$masterloket->ml_pelayanan); + $jumrow = (count($pecahpel)); + for($x=0;$x<=$jumrow;$x++){ + if(isset($pecahpel[$x])){ + $this->db->where('mk_id', $pecahpel[$x]); + $selectklinik = $this->db->get('master_klinik'); + foreach ($selectklinik->result() as $datklin){ + $infoklinik=$infoklinik."<code>".$datklin->mk_nama."</code> "; + } + } + } + + if($masterloket->ml_pembayaran=="1"){$infopembayaran="<b>UMUM / DLL</b>";} + if($masterloket->ml_pembayaran=="2"){$infopembayaran="JKN";} + + if($masterloket->ml_online=="1"){$infoonline="OFFLINE";} + if($masterloket->ml_online=="2"){$infoonline="<b>ONLINE</b>";} + + if(!empty($this->varedit)){ + $editbutton="<a href='".base_url()."index.php/ps_loket/edit/".$masterloket->ml_id."' class='btn btn-warning btn-xs'><i class='fa fa-edit'></i> Edit</a> "; + } + if(!empty($this->vardelete)){ + $deletebutton="<a onclick='del(".$masterloket->ml_id.")' class='btn btn-danger btn-xs'><i class='fa fa-trash'></i> Delete</a><input type='hidden' id='isi".$masterloket->ml_id."' value='".$masterloket->ml_nama."'> "; + } + if(!empty($this->varview)){ + $viewbutton="<a href='".base_url()."index.php/ps_loket/view/".$masterloket->ml_id."' class='btn btn-primary btn-xs'><i class='fa fa-eye'></i> View</a> "; + } + //---------------------end check access action-------------------// + if($this->session->userdata('s_FK_TipeUser')=="3"){ + if($this->session->userdata('s_loket')==$masterloket->ml_id){ + echo(" + <tr> + <td>".$no."</td> + <td>".$masterloket->ml_nama."</td> + <td>".$masterloket->ml_quota_bangku."</td> + <td>".$infoklinik."</td> + <td>".$infopembayaran."</td> + <td>".$infoonline."</td> + <td>".$viewbutton.$editbutton.$deletebutton.$edithakakses."</td> + </tr> + "); + } + }else{ + echo(" + <tr> + <td>".$no."</td> + <td>".$masterloket->ml_nama."</td> + <td>".$masterloket->ml_quota_bangku."</td> + <td>".$infoklinik."</td> + <td>".$infopembayaran."</td> + <td>".$infoonline."</td> + <td>".$viewbutton.$editbutton.$deletebutton.$edithakakses."</td> + </tr> + "); + } + } + ?> + </tbody> + </table> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + </section> + <div class="control-sidebar-bg"></div> +</body> +<script type="text/javascript"> + var url="<?php echo base_url();?>"; + function del(id){ + var isi=document.getElementById('isi'+id).value; + var r=confirm("Apakah anda ingin menghapus loket "+isi+"?") + if (r==true) + window.location = url+"index.php/ps_loket/delete/"+id; + else + return false; + } +</script> \ No newline at end of file diff --git a/application/views/setting/loket2/form_loket.php b/application/views/setting/loket2/form_loket.php new file mode 100644 index 0000000..353ae88 --- /dev/null +++ b/application/views/setting/loket2/form_loket.php @@ -0,0 +1,151 @@ +<section class="content-header"> + <h1> + <small></small> + </h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li>Setting</li> + <li><a href="<?php echo base_url()?>index.php/ps_loket">Master Loket</a></li> + <li class="active"><?php echo $title;?></li> + </ol> +</section> +<section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title"><?php echo $title; ?></h3> + </div> + <div class="box-body"> + <?php if(validation_errors()){ ?> + <div class="alert alert-danger alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4><i class="icon fa fa-ban"></i> Alert!</h4> + <?php echo validation_errors() ?> + </div> + <?php } + $setdisabled =""; + $setidedit =""; + + $setnama =""; + $setpelayanan =""; + $setquotabangku =""; + $pembayaran =""; + $online =""; + + if ($actionform=="prosesview"){ + $setdisabled="disabled=''"; + } + if ($actionform!="prosesadd"){ + $setidedit =$ml->row('ml_id'); + $setnama =$ml->row('ml_nama'); + $setpelayanan =$ml->row('ml_pelayanan'); + $setquotabangku =$ml->row('ml_quota_bangku'); + $pembayaran =$ml->row('ml_pembayaran'); + $online =$ml->row('ml_online'); + } + + ?> + <form class="form-horizontal" id="form" action="<?php echo(base_url()); ?>index.php/ps_loket/<?php echo $actionform; ?>" method="post" autocomplete="off"> + <div class="box-body"> + <div class="form-group"> + <label for="nama" class="col-sm-2 control-label">Nama</label> + <div class="col-sm-6"> + <input type="hidden" name="id" value="<?php echo $setidedit;?>"/> + <input id="nama" class="form-control" <?php echo $setdisabled; ?> name="nama" type="text" placeholder="Masukan Nama Loket" autocomplete="off" value="<?php echo $setnama;?>"/> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="quota" class="col-sm-2 control-label">Quota Bangku</label> + <div class="col-sm-6"> + <input id="quota" class="form-control" <?php echo $setdisabled; ?> name="quota" type="number" placeholder="Masukan Quota Bangku" autocomplete="off" value="<?php echo $setquotabangku;?>"/> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="pembayaran" class="col-sm-2 control-label">Pembayaran</label> + <div class="col-sm-6"> + <select id="pembayaran" name="pembayaran" class="form-control select"> + <option value=""> Pilih Pembayaran </option> + <option <?php if($pembayaran=="1"){echo "selected=''";} ?> value="1"> UMUM / SPM / JKMM / JAMPERSAL / T4 / KARYAWAN</option> + <option <?php if($pembayaran=="2"){echo "selected=''";} ?> value="2"> JKN </option> + </select> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="online" class="col-sm-2 control-label">Keterangan</label> + <div class="col-sm-6"> + <select id="online" name="online" class="form-control select"> + <option value=""> Pilih Keterangan </option> + <option <?php if($online=="1"){echo "selected=''";} ?> value="1"> OFFLINE</option> + <option <?php if($online=="2"){echo "selected=''";} ?> value="2"> ONLINE</option> + </select> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="pelayanan" class="col-sm-2 control-label">Pelayanan</label> + <div class="col-sm-6"> + <!--input id="pelayanan" class="form-control" <?php echo $setdisabled; ?> name="pelayanan" type="text" placeholder="Masukan Pelayanan" autocomplete="off" value="<?php echo $setpelayanan;?>"/--> + <table class="table table-bordered"> + <tr> + <th style="width: 10px">#</th> + <th>Kode</th> + <th>Klinik</th> + <th style="width: 40px">Pilih</th> + </tr> + <?php + $setcek=""; + $no=0; + foreach ($mk as $masterklinik) { + $no++; + if ($actionform!="prosesadd"){ + $pedat_pelayanan = explode(",",$setpelayanan); + $jumrow = (count($pedat_pelayanan))-1; + for($x=0;$x<=$jumrow;$x++){ + if(isset($pedat_pelayanan[$x])){ + if($pedat_pelayanan[$x]==$masterklinik->mk_id){ + $setcek="checked"; + } + } + } + } + + echo (" + <tr> + <td>$no.</td> + <td>".$masterklinik->mk_kode."</td> + <td>".$masterklinik->mk_nama."</td> + <td> + <label> + <input id='klinik' name='klinik[]' type='checkbox' value='".$masterklinik->mk_id."' $setcek class='flat-red' $setdisabled /> + </label> + </td> + </tr> + "); + $setcek=""; + } + ?> + </table> + + </div> + </div> + </div> + <div class="box-footer"> + <a href="<?php echo base_url();?>index.php/ps_loket" class="btn btn-default">Cancel</a> + <?php if ($actionform!="prosesview"){ ?> + <button type="submit" class="btn btn-warning">Submit</button> + <?php } ?> + </div> + </form> + </div> + </div> + </div> + </div> +</section> \ No newline at end of file diff --git a/application/views/setting/loket2/v_loket.php b/application/views/setting/loket2/v_loket.php new file mode 100644 index 0000000..b9415a0 --- /dev/null +++ b/application/views/setting/loket2/v_loket.php @@ -0,0 +1,139 @@ +<body class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h1> + <?php + //---------------------start check access action TAMBAH-------------------// + if(!empty($this->vartambah)){ echo "<small> <a href='".base_url()."index.php/ps_loket/add' class='btn btn-block btn-primary btn-sm'>Tambah Baru</a> </small>"; + }else{ echo "<small></small>";} + //---------------------end check access action TAMBAH-------------------// + ?> + </h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li>Setting</li> + <li class="active"><?php echo $title ?></li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title"><?php echo $title ?></h3> + </div><!-- /.box-header --> + <div class="box-body"> + <?php if($this->session->flashdata('message')){?> + <div class="alert alert-success alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-check"></i> Alert!</h4> + <?php echo $this->session->flashdata('message');?> + </div> + <?php }?> + <div class="box-body table-responsive no-padding"> + <table id="example1" class="table table-bordered table-striped"> + <thead> + <tr> + <th width="5%">No</th> + <th>Nama Loket</th> + <th>Quota</th> + <th>Pelayanan</th> + <th>Pembayaran</th> + <th>Keterangan</th> + <th width="20%">Aksi</th> + </tr> + </thead> + <tbody> + <?php + $no=0; + foreach ($ml as $masterloket) { + $no++; + //---------------------start check access action-------------------// + $editbutton=""; + $edithakakses=""; + $deletebutton=""; + $viewbutton=""; + + $infoklinik=""; + $infopembayaran=""; + $infoonline=""; + + $pecahpel = explode(",",$masterloket->ml_pelayanan); + $jumrow = (count($pecahpel)); + for($x=0;$x<=$jumrow;$x++){ + if(isset($pecahpel[$x])){ + $this->db->where('mk_id', $pecahpel[$x]); + $selectklinik = $this->db->get('master_klinik'); + foreach ($selectklinik->result() as $datklin){ + $infoklinik=$infoklinik."<code>".$datklin->mk_nama."</code> "; + } + } + } + + if($masterloket->ml_pembayaran=="1"){$infopembayaran="<b>UMUM / DLL</b>";} + if($masterloket->ml_pembayaran=="2"){$infopembayaran="JKN";} + + if($masterloket->ml_online=="1"){$infoonline="OFFLINE";} + if($masterloket->ml_online=="2"){$infoonline="<b>ONLINE</b>";} + + if(!empty($this->varedit)){ + $editbutton="<a href='".base_url()."index.php/ps_loket/edit/".$masterloket->ml_id."' class='btn btn-warning btn-xs'><i class='fa fa-edit'></i> Edit</a> "; + } + if(!empty($this->vardelete)){ + $deletebutton="<a onclick='del(".$masterloket->ml_id.")' class='btn btn-danger btn-xs'><i class='fa fa-trash'></i> Delete</a><input type='hidden' id='isi".$masterloket->ml_id."' value='".$masterloket->ml_nama."'> "; + } + if(!empty($this->varview)){ + $viewbutton="<a href='".base_url()."index.php/ps_loket/view/".$masterloket->ml_id."' class='btn btn-primary btn-xs'><i class='fa fa-eye'></i> View</a> "; + } + //---------------------end check access action-------------------// + if($this->session->userdata('s_FK_TipeUser')=="3"){ + if($this->session->userdata('s_loket')==$masterloket->ml_id){ + echo(" + <tr> + <td>".$no."</td> + <td>".$masterloket->ml_nama."</td> + <td>".$masterloket->ml_quota_bangku."</td> + <td>".$infoklinik."</td> + <td>".$infopembayaran."</td> + <td>".$infoonline."</td> + <td>".$viewbutton.$editbutton.$deletebutton.$edithakakses."</td> + </tr> + "); + } + }else{ + echo(" + <tr> + <td>".$no."</td> + <td>".$masterloket->ml_nama."</td> + <td>".$masterloket->ml_quota_bangku."</td> + <td>".$infoklinik."</td> + <td>".$infopembayaran."</td> + <td>".$infoonline."</td> + <td>".$viewbutton.$editbutton.$deletebutton.$edithakakses."</td> + </tr> + "); + } + } + ?> + </tbody> + </table> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + </section> + <div class="control-sidebar-bg"></div> +</body> +<script type="text/javascript"> + var url="<?php echo base_url();?>"; + function del(id){ + var isi=document.getElementById('isi'+id).value; + var r=confirm("Apakah anda ingin menghapus loket "+isi+"?") + if (r==true) + window.location = url+"index.php/ps_loket/delete/"+id; + else + return false; + } +</script> \ No newline at end of file diff --git a/application/views/setting/screen/form_screen.php b/application/views/setting/screen/form_screen.php new file mode 100644 index 0000000..ccce955 --- /dev/null +++ b/application/views/setting/screen/form_screen.php @@ -0,0 +1,83 @@ +<section class="content-header"> + <h1> + <small></small> + </h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li><a href="<?php echo base_url()?>index.php/ps_screen">Screen</a></li> + <li class="active"><?php echo $title;?></li> + </ol> +</section> +<section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title"><?php echo $title; ?></h3> + </div> + <div class="box-body"> + <?php if(validation_errors()){ ?> + <div class="alert alert-danger alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4><i class="icon fa fa-ban"></i> Alert!</h4> + <?php echo validation_errors() ?> + </div> + <?php } + + $setdisabled =""; + $setidedit =""; + + if ($actionform=="prosesview"){ + $setdisabled="disabled=''"; + } + + ?> + <form class="form-horizontal" id="form" action="<?php echo(base_url()); ?>index.php/ps_screen/<?php echo $actionform; ?>" method="post" autocomplete="off"> + <div class="box-body form-horizontal"> + <div class="box-body"> + <div class="box"> + <div class="box-body no-padding"> + <table class="table table-striped"> + <tr> + <th width="5%">No</th> + <th>Nama Klinik</th> + <th width="15%">Screen 1</th> + <th width="15%">Screen 2</th> + <th width="15%">Screen 3</th> + </tr> + <?php + $no=0; + foreach ($ms as $dataklinik){$no++; + + + ?> + <input hidden="" id="idk<?php echo $no;?>" name="idk<?php echo $no;?>" value="<?php echo $dataklinik->mk_id;?>" /> + <tr> + <td><?php echo $no;?></td> + <td><?php echo $dataklinik->mk_nama;?></td> + <td><input type="radio" name="sc<?php echo $no;?>" value="1" class="flat-red" <?php if($dataklinik->mk_screen==1){echo "checked";}else{echo $setdisabled;}?> /></td> + <td><input type="radio" name="sc<?php echo $no;?>" value="2" class="flat-red" <?php if($dataklinik->mk_screen==2){echo "checked";}else{echo $setdisabled;}?> /></td> + <td><input type="radio" name="sc<?php echo $no;?>" value="3" class="flat-red" <?php if($dataklinik->mk_screen==3){echo "checked";}else{echo $setdisabled;}?> /></td> + </tr> + <?php + }$lastnumber = $no; + + ?> + </table> + <input hidden="" id="lastnumber" name="lastnumber" value="<?php echo $no;?>" /> + </div> + </div> + </div> + <div class="box-footer"> + <a href="<?php echo base_url();?>index.php/ps_screen" class="btn btn-default">Cancel</a> + <?php if ($actionform!="prosesview"){ ?> + <button type="submit" class="btn btn-warning">Submit</button> + <?php } ?> + </div> + </div> + </form> + </div> + </div> + </div> + </div> +</section> \ No newline at end of file diff --git a/application/views/setting/screen/v_screen.php b/application/views/setting/screen/v_screen.php new file mode 100644 index 0000000..f7bf04a --- /dev/null +++ b/application/views/setting/screen/v_screen.php @@ -0,0 +1,82 @@ +<?php + //---------------------start check access action-------------------// + $editbutton=""; + $viewbutton=""; + if(!empty($this->varedit)){ + $editbutton="<a href='".base_url()."index.php/ps_screen/edit' class='btn btn-warning btn-sm'><i class='fa fa-edit'></i> Edit</a> "; + } + if(!empty($this->varview)){ + $viewbutton="<a href='".base_url()."index.php/ps_screen/view' class='btn btn-primary btn-sm'><i class='fa fa-eye'></i> View</a> "; + } + //---------------------end check access action-------------------// +?> + +<body class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h1><small> + <?php echo $viewbutton.$editbutton;?> + </small></h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li>Setting</li> + <li class="active"><?php echo $title ?></li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title"><?php echo $title ?></h3> + </div><!-- /.box-header --> + <div class="box-body"> + <?php if($this->session->flashdata('message')){?> + <div class="alert alert-success alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-check"></i> Alert!</h4> + <?php echo $this->session->flashdata('message');?> + </div> + <?php }?> + <div class="box-body table-responsive no-padding"> + <table id="example1" class="table table-bordered table-striped"> + <thead> + <tr> + <th width="5%">No</th> + <th>Nama Screen</th> + <th>Klinik</th> + </tr> + </thead> + <tbody> + <?php + $no=0; + for($i=1;$i<=3;$i++){ + $appendklinik =""; + foreach ($ms as $dataklinik) { + if($dataklinik->mk_screen==$i){ + $appendklinik = $appendklinik."<code>$dataklinik->mk_nama | </code>"; + } + } + + $no++; + ?> + <tr> + <td><?php echo $no;?></td> + <td>Layar Screen <?php echo $i;?></td> + <td><?php echo $appendklinik;?></td> + </tr> + + <?php + } + ?> + </tbody> + </table> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + </section> + <div class="control-sidebar-bg"></div> +</body> \ No newline at end of file diff --git a/application/views/setting/userlogin/form_userlogin.php b/application/views/setting/userlogin/form_userlogin.php new file mode 100644 index 0000000..194d41c --- /dev/null +++ b/application/views/setting/userlogin/form_userlogin.php @@ -0,0 +1,217 @@ +<section class="content-header"> + <h1> + <small></small> + </h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li>Setting</li> + <li><a href="<?php echo base_url()?>index.php/ps_userlogin">User Login</a></li> + <li class="active"><?php echo $title;?></li> + </ol> +</section> +<section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title"><?php echo $title; ?></h3> + </div> + <div class="box-body"> + <?php if(validation_errors()){ ?> + <div class="alert alert-danger alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4><i class="icon fa fa-ban"></i> Alert!</h4> + <?php echo validation_errors() ?> + </div> + <?php } + + $setdisabled =""; + $setidedit =""; + $setnama_lengkap =""; + $setnama_user =""; + $setpassword =""; + $setklinik =""; + $setloket =""; + $settipeuser =""; + + + if ($actionform=="prosesview"){ + $setdisabled="disabled=''"; + } + if ($actionform!="prosesadd"){ + $setidedit =$ul->row('mu_id'); + $setnama_lengkap =$ul->row('mu_nama_lengkap'); + $setnama_user =$ul->row('mu_nama_user'); + $setpassword =$ul->row('mu_password'); + $setklinik =$ul->row('mu_klinik_id'); + $setloket =$ul->row('mu_loket_id'); + $settipeuser =$ul->row('mu_tipeuser_id'); + } + + ?> + <form class="form-horizontal" id="form" action="<?php echo(base_url()); ?>index.php/ps_userlogin/<?php echo $actionform; ?>" method="post" autocomplete="off"> + <div class="box-body"> + <div class="form-group"> + <label for="namalengkapuser" class="col-sm-2 control-label">Nama Lengkap</label> + <div class="col-sm-6"> + <input type="hidden" name="id" value="<?php echo $setidedit;?>"/> + <input id="namalengkapuser" class="form-control" <?php echo $setdisabled; ?> name="namalengkapuser" type="text" placeholder="Masukan Nama Lengkap" autocomplete="off" value="<?php echo $setnama_lengkap;?>"/> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="namauser" class="col-sm-2 control-label">Nama User</label> + <div class="col-sm-6"> + <input id="namauser" class="form-control" <?php echo $setdisabled; ?> name="namauser" type="text" placeholder="Masukan Nama User" autocomplete="off" value="<?php echo $setnama_user;?>"/> + </div> + </div> + </div> + <?php + if($actionform!="prosesadd"){ + ?> + <div class="box-body"> + <div class="form-group"> + <label for="passworduser" class="col-sm-2 control-label">Password</label> + <div class="col-sm-6"> + <div class="input-group"> + <input disabled="" id="passworduser" class="form-control" name="passworduser" type="password" placeholder="Masukan Password" autocomplete="off" value=""/> + <span class="input-group-addon"> + <input <?php echo $setdisabled; ?> id="setaktif" type="checkbox" onchange="aktif()" /> + </span> + </div> + </div> + <div class="col-sm-2"> + <code>Ubah Password</code> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="passworduser" class="col-sm-2 control-label">Retype Password</label> + <div class="col-sm-6"> + <input disabled="" id="repassworduser" class="form-control" <?php if($actionform!="prosesadd"){}?> name="repassworduser" type="password" placeholder="Masukan Retype Password" autocomplete="off" value=""/> + </div> + </div> + </div> + <script> + function aktif(){ + if ($('#setaktif').is(":checked")) + { + $("#passworduser").prop('disabled', false); + $("#repassworduser").prop('disabled', false); + }else{ + document.getElementById('passworduser').value=""; + document.getElementById('repassworduser').value=""; + $("#passworduser").prop('disabled', true); + $("#repassworduser").prop('disabled', true); + } + } + </script> + <?php }else{ + ?> + <div class="box-body"> + <div class="form-group"> + <label for="passworduser" class="col-sm-2 control-label">Password</label> + <div class="col-sm-6"> + <input id="passworduser" class="form-control" name="passworduser" type="password" placeholder="Masukan Password" autocomplete="off" value=""/> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="passworduser" class="col-sm-2 control-label">Retype Password</label> + <div class="col-sm-6"> + <input id="repassworduser" class="form-control" name="repassworduser" type="password" placeholder="Masukan Retype Password" autocomplete="off" value=""/> + </div> + </div> + </div> + <?php + }?> + <div class="box-body"> + <div class="form-group"> + <label for="tipeuser" class="col-sm-2 control-label">Tipe User</label> + <div class="col-sm-6"> + <select onchange="setbagian()" <?php echo $setdisabled; ?> id="tipeuser" name="tipeuser" class="form-control select" > + <option value="">Pilih Tipe User</option> + <?php + foreach ($tu as $dat) { + $select=""; + if($settipeuser==$dat->mt_id){$select="selected='selected'";} + echo "<option value='".$dat->mt_id."'".$select.">".$dat->mt_nama."</option>"; + } + ?> + </select> + </div> + </div> + </div> + <script> + function setbagian(){ + var tipeuser = document.getElementById('tipeuser').value; + if(tipeuser==3){ + document.getElementById('klinik').value=""; + $("#klinik").prop('disabled', true); + $("#loket").prop('disabled', false); + }else if(tipeuser==4){ + document.getElementById('loket').value=""; + $("#loket").prop('disabled', true); + $("#klinik").prop('disabled', false); + }else if(tipeuser==10){ + document.getElementById('klinik').value=""; + $("#klinik").prop('disabled', true); + $("#loket").prop('disabled', false); + }else{ + document.getElementById('klinik').value=""; + document.getElementById('loket').value=""; + $("#loket").prop('disabled', true); + $("#klinik").prop('disabled', true); + } + } + </script> + <div class="box-body"> + <div class="form-group"> + <label for="loket" class="col-sm-2 control-label">Loket</label> + <div class="col-sm-6"> + <select <?php echo $setdisabled; if($settipeuser!=3 && $settipeuser!=7){echo "disabled=''";} ?> id="loket" name="loket" class="form-control select" > + <option value="">Pilih Loket</option> + <?php + foreach ($ml as $datml) { + $select=""; + if($setloket==$datml->ml_id){$select="selected='selected'";} + echo "<option value='".$datml->ml_id."'".$select.">".$datml->ml_nama."</option>"; + } + ?> + </select> + </div> + </div> + </div> + <div class="box-body"> + <div class="form-group"> + <label for="klinik" class="col-sm-2 control-label">Klinik</label> + <div class="col-sm-6"> + <select <?php echo $setdisabled; if($settipeuser!=4){echo "disabled=''";}?> id="klinik" name="klinik" class="form-control select" > + <option value="">Pilih Klinik</option> + <?php + foreach ($mk as $datmk) { + $select=""; + if($setklinik==$datmk->mk_id){$select="selected='selected'";} + echo "<option value='".$datmk->mk_id."'".$select.">".$datmk->mk_nama."</option>"; + } + ?> + </select> + </div> + </div> + </div> + <div class="box-footer"> + <a href="<?php echo base_url();?>index.php/ps_userlogin" class="btn btn-default">Cancel</a> + <?php if ($actionform!="prosesview"){ ?> + <button type="submit" class="btn btn-warning">Submit</button> + <?php } ?> + </div> + </div> + </form> + </div> + </div> + </div> + </div> +</section> \ No newline at end of file diff --git a/application/views/setting/userlogin/v_userlogin.php b/application/views/setting/userlogin/v_userlogin.php new file mode 100644 index 0000000..f341676 --- /dev/null +++ b/application/views/setting/userlogin/v_userlogin.php @@ -0,0 +1,100 @@ +<body class="hold-transition skin-blue sidebar-mini"> + <section class="content-header"> + <h1> + <?php + //---------------------start check access action TAMBAH-------------------// + if(!empty($this->vartambah)){ echo "<small> <a href='".base_url()."index.php/ps_userlogin/add' class='btn btn-block btn-primary btn-sm'>Tambah Baru</a> </small>"; + }else{ echo "<small></small>";} + //---------------------end check access action TAMBAH-------------------// + ?> + </h1> + <ol class="breadcrumb"> + <li><a href="<?php echo base_url()?>index.php"><i class="fa fa-dashboard"></i> Dashboard</a></li> + <li>Setting</li> + <li class="active"><?php echo $title ?></li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title"><?php echo $title ?></h3> + </div><!-- /.box-header --> + <div class="box-body"> + <?php if($this->session->flashdata('message')){?> + <div class="alert alert-success alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-check"></i> Alert!</h4> + <?php echo $this->session->flashdata('message');?> + </div> + <?php }?> + <div class="box-body table-responsive no-padding"> + <table id="example1" class="table table-bordered table-striped"> + <thead> + <tr> + <th width="5%">No</th> + <th>Nama Lengkap</th> + <th>Nama User</th> + <th>Tipe User</th> + <th>Ket</th> + <th width="20%">Aksi</th> + </tr> + </thead> + <tbody> + <?php + $no=0; + foreach ($ul as $userlogin) { + if($userlogin->mu_tipeuser_id!="1"){ + $no++; + //---------------------start check access action-------------------// + $editbutton=""; + $edithakakses=""; + $deletebutton=""; + $viewbutton=""; + if(!empty($this->varedit)){ + $editbutton="<a href='".base_url()."index.php/ps_userlogin/edit/".$userlogin->mu_id."' class='btn btn-warning btn-xs'><i class='fa fa-edit'></i> Edit</a> "; + } + if(!empty($this->vardelete)){ + $deletebutton="<a onclick='del(".$userlogin->mu_id.")' class='btn btn-danger btn-xs'><i class='fa fa-trash'></i> Delete</a><input type='hidden' id='isi".$userlogin->mu_id."' value='".$userlogin->mu_nama_user."'> "; + } + if(!empty($this->varview)){ + $viewbutton="<a href='".base_url()."index.php/ps_userlogin/view/".$userlogin->mu_id."' class='btn btn-primary btn-xs'><i class='fa fa-eye'></i> View</a> "; + } + //---------------------end check access action-------------------// + echo(" + <tr> + <td>".$no."</td> + <td>".$userlogin->mu_nama_lengkap."</td> + <td>".$userlogin->mu_nama_user."</td> + <td>".$userlogin->mt_nama."</td> + <td>".$userlogin->mk_nama."".$userlogin->ml_nama."</td> + <td>".$viewbutton.$editbutton.$deletebutton.$edithakakses."</td> + </tr> + "); + } + } + ?> + </tbody> + </table> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + </section> + <div class="control-sidebar-bg"></div> +</body> +<script type="text/javascript"> + var url="<?php echo base_url();?>"; + function del(id){ + var isi=document.getElementById('isi'+id).value; + var r=confirm("Apakah anda ingin menghapus user "+isi+"?") + if (r==true) + window.location = url+"index.php/ps_userlogin/delete/"+id; + else + return false; + } +</script> \ No newline at end of file diff --git a/application/views/welcome_message.php b/application/views/welcome_message.php new file mode 100644 index 0000000..0bf5a8d --- /dev/null +++ b/application/views/welcome_message.php @@ -0,0 +1,88 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>Welcome to CodeIgniter</title> + + <style type="text/css"> + + ::selection{ background-color: #E13300; color: white; } + ::moz-selection{ background-color: #E13300; color: white; } + ::webkit-selection{ background-color: #E13300; color: white; } + + body { + background-color: #fff; + margin: 40px; + font: 13px/20px normal Helvetica, Arial, sans-serif; + color: #4F5155; + } + + a { + color: #003399; + background-color: transparent; + font-weight: normal; + } + + h1 { + color: #444; + background-color: transparent; + border-bottom: 1px solid #D0D0D0; + font-size: 19px; + font-weight: normal; + margin: 0 0 14px 0; + padding: 14px 15px 10px 15px; + } + + code { + font-family: Consolas, Monaco, Courier New, Courier, monospace; + font-size: 12px; + background-color: #f9f9f9; + border: 1px solid #D0D0D0; + color: #002166; + display: block; + margin: 14px 0 14px 0; + padding: 12px 10px 12px 10px; + } + + #body{ + margin: 0 15px 0 15px; + } + + p.footer{ + text-align: right; + font-size: 11px; + border-top: 1px solid #D0D0D0; + line-height: 32px; + padding: 0 10px 0 10px; + margin: 20px 0 0 0; + } + + #container{ + margin: 10px; + border: 1px solid #D0D0D0; + -webkit-box-shadow: 0 0 8px #D0D0D0; + } + </style> +</head> +<body> + +<div id="container"> + <h1>Welcome to CodeIgniter!</h1> + + <div id="body"> + <p>The page you are looking at is being generated dynamically by CodeIgniter.</p> + + <p>If you would like to edit this page you'll find it located at:</p> + <code>application/views/welcome_message.php</code> + + <p>The corresponding controller for this page is found at:</p> + <code>application/controllers/welcome.php</code> + + <p>If you are exploring CodeIgniter for the very first time, you should start by reading the <a href="user_guide/">User Guide</a>.</p> + </div> + + <p class="footer">Page rendered in <strong>{elapsed_time}</strong> seconds</p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/assets/Manual Book 01.pdf b/assets/Manual Book 01.pdf new file mode 100644 index 0000000..836f5f5 Binary files /dev/null and b/assets/Manual Book 01.pdf differ diff --git a/assets/css.css b/assets/css.css new file mode 100644 index 0000000..7bd9afb --- /dev/null +++ b/assets/css.css @@ -0,0 +1,392 @@ +/* cyrillic-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 300; + src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKwdSBYKcSV-LCoeQqfX1RYOo3qPZZMkidh18Smxg.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 300; + src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKwdSBYKcSV-LCoeQqfX1RYOo3qPZZMkido18Smxg.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 300; + src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKwdSBYKcSV-LCoeQqfX1RYOo3qPZZMkidg18Smxg.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 300; + src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKwdSBYKcSV-LCoeQqfX1RYOo3qPZZMkidv18Smxg.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 300; + src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKwdSBYKcSV-LCoeQqfX1RYOo3qPZZMkidj18Smxg.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 300; + src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKwdSBYKcSV-LCoeQqfX1RYOo3qPZZMkidi18Smxg.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 300; + src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKwdSBYKcSV-LCoeQqfX1RYOo3qPZZMkids18Q.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 400; + src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7qsDJT9g.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 400; + src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7jsDJT9g.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 400; + src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7rsDJT9g.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 400; + src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7ksDJT9g.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 400; + src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7osDJT9g.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 400; + src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7psDJT9g.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 400; + src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xK1dSBYKcSV-LCoeQqfX1RYOo3qPZ7nsDI.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 600; + src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKwdSBYKcSV-LCoeQqfX1RYOo3qPZY4lCdh18Smxg.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 600; + src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKwdSBYKcSV-LCoeQqfX1RYOo3qPZY4lCdo18Smxg.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 600; + src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKwdSBYKcSV-LCoeQqfX1RYOo3qPZY4lCdg18Smxg.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 600; + src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKwdSBYKcSV-LCoeQqfX1RYOo3qPZY4lCdv18Smxg.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 600; + src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKwdSBYKcSV-LCoeQqfX1RYOo3qPZY4lCdj18Smxg.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 600; + src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKwdSBYKcSV-LCoeQqfX1RYOo3qPZY4lCdi18Smxg.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: italic; + font-weight: 600; + src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKwdSBYKcSV-LCoeQqfX1RYOo3qPZY4lCds18Q.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmhduz8A.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwkxduz8A.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmxduz8A.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlBduz8A.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmBduz8A.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwmRduz8A.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKydSBYKcSV-LCoeQqfX1RYOo3ik4zwlxdu.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNa7lqDY.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xK3dSBYKcSV-LCoeQqfX1RYOo3qPK7lqDY.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNK7lqDY.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xK3dSBYKcSV-LCoeQqfX1RYOo3qO67lqDY.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xK3dSBYKcSV-LCoeQqfX1RYOo3qN67lqDY.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xK3dSBYKcSV-LCoeQqfX1RYOo3qNq7lqDY.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xK3dSBYKcSV-LCoeQqfX1RYOo3qOK7l.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmhduz8A.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwkxduz8A.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmxduz8A.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlBduz8A.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmBduz8A.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwmRduz8A.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKydSBYKcSV-LCoeQqfX1RYOo3i54rwlxdu.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +/* cyrillic-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmhduz8A.woff2) format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwkxduz8A.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmxduz8A.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlBduz8A.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmBduz8A.woff2) format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwmRduz8A.woff2) format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url(https://fonts.gstatic.com/s/sourcesanspro/v14/6xKydSBYKcSV-LCoeQqfX1RYOo3ig4vwlxdu.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/assets/font-awesome.css b/assets/font-awesome.css new file mode 100644 index 0000000..e38cc6f --- /dev/null +++ b/assets/font-awesome.css @@ -0,0 +1,2337 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.7.0'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.28571429em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.85714286em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.fa-pull-left { + float: left; +} +.fa-pull-right { + float: right; +} +.fa.fa-pull-left { + margin-right: .3em; +} +.fa.fa-pull-right { + margin-left: .3em; +} +/* Deprecated as of 4.4.0 */ +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook-f:before, +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-feed:before, +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-desc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-asc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before, +.fa-gratipay:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} +.fa-space-shuttle:before { + content: "\f197"; +} +.fa-slack:before { + content: "\f198"; +} +.fa-envelope-square:before { + content: "\f199"; +} +.fa-wordpress:before { + content: "\f19a"; +} +.fa-openid:before { + content: "\f19b"; +} +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: "\f19c"; +} +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: "\f19d"; +} +.fa-yahoo:before { + content: "\f19e"; +} +.fa-google:before { + content: "\f1a0"; +} +.fa-reddit:before { + content: "\f1a1"; +} +.fa-reddit-square:before { + content: "\f1a2"; +} +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} +.fa-stumbleupon:before { + content: "\f1a4"; +} +.fa-delicious:before { + content: "\f1a5"; +} +.fa-digg:before { + content: "\f1a6"; +} +.fa-pied-piper-pp:before { + content: "\f1a7"; +} +.fa-pied-piper-alt:before { + content: "\f1a8"; +} +.fa-drupal:before { + content: "\f1a9"; +} +.fa-joomla:before { + content: "\f1aa"; +} +.fa-language:before { + content: "\f1ab"; +} +.fa-fax:before { + content: "\f1ac"; +} +.fa-building:before { + content: "\f1ad"; +} +.fa-child:before { + content: "\f1ae"; +} +.fa-paw:before { + content: "\f1b0"; +} +.fa-spoon:before { + content: "\f1b1"; +} +.fa-cube:before { + content: "\f1b2"; +} +.fa-cubes:before { + content: "\f1b3"; +} +.fa-behance:before { + content: "\f1b4"; +} +.fa-behance-square:before { + content: "\f1b5"; +} +.fa-steam:before { + content: "\f1b6"; +} +.fa-steam-square:before { + content: "\f1b7"; +} +.fa-recycle:before { + content: "\f1b8"; +} +.fa-automobile:before, +.fa-car:before { + content: "\f1b9"; +} +.fa-cab:before, +.fa-taxi:before { + content: "\f1ba"; +} +.fa-tree:before { + content: "\f1bb"; +} +.fa-spotify:before { + content: "\f1bc"; +} +.fa-deviantart:before { + content: "\f1bd"; +} +.fa-soundcloud:before { + content: "\f1be"; +} +.fa-database:before { + content: "\f1c0"; +} +.fa-file-pdf-o:before { + content: "\f1c1"; +} +.fa-file-word-o:before { + content: "\f1c2"; +} +.fa-file-excel-o:before { + content: "\f1c3"; +} +.fa-file-powerpoint-o:before { + content: "\f1c4"; +} +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: "\f1c5"; +} +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: "\f1c6"; +} +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: "\f1c7"; +} +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: "\f1c8"; +} +.fa-file-code-o:before { + content: "\f1c9"; +} +.fa-vine:before { + content: "\f1ca"; +} +.fa-codepen:before { + content: "\f1cb"; +} +.fa-jsfiddle:before { + content: "\f1cc"; +} +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: "\f1cd"; +} +.fa-circle-o-notch:before { + content: "\f1ce"; +} +.fa-ra:before, +.fa-resistance:before, +.fa-rebel:before { + content: "\f1d0"; +} +.fa-ge:before, +.fa-empire:before { + content: "\f1d1"; +} +.fa-git-square:before { + content: "\f1d2"; +} +.fa-git:before { + content: "\f1d3"; +} +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: "\f1d4"; +} +.fa-tencent-weibo:before { + content: "\f1d5"; +} +.fa-qq:before { + content: "\f1d6"; +} +.fa-wechat:before, +.fa-weixin:before { + content: "\f1d7"; +} +.fa-send:before, +.fa-paper-plane:before { + content: "\f1d8"; +} +.fa-send-o:before, +.fa-paper-plane-o:before { + content: "\f1d9"; +} +.fa-history:before { + content: "\f1da"; +} +.fa-circle-thin:before { + content: "\f1db"; +} +.fa-header:before { + content: "\f1dc"; +} +.fa-paragraph:before { + content: "\f1dd"; +} +.fa-sliders:before { + content: "\f1de"; +} +.fa-share-alt:before { + content: "\f1e0"; +} +.fa-share-alt-square:before { + content: "\f1e1"; +} +.fa-bomb:before { + content: "\f1e2"; +} +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: "\f1e3"; +} +.fa-tty:before { + content: "\f1e4"; +} +.fa-binoculars:before { + content: "\f1e5"; +} +.fa-plug:before { + content: "\f1e6"; +} +.fa-slideshare:before { + content: "\f1e7"; +} +.fa-twitch:before { + content: "\f1e8"; +} +.fa-yelp:before { + content: "\f1e9"; +} +.fa-newspaper-o:before { + content: "\f1ea"; +} +.fa-wifi:before { + content: "\f1eb"; +} +.fa-calculator:before { + content: "\f1ec"; +} +.fa-paypal:before { + content: "\f1ed"; +} +.fa-google-wallet:before { + content: "\f1ee"; +} +.fa-cc-visa:before { + content: "\f1f0"; +} +.fa-cc-mastercard:before { + content: "\f1f1"; +} +.fa-cc-discover:before { + content: "\f1f2"; +} +.fa-cc-amex:before { + content: "\f1f3"; +} +.fa-cc-paypal:before { + content: "\f1f4"; +} +.fa-cc-stripe:before { + content: "\f1f5"; +} +.fa-bell-slash:before { + content: "\f1f6"; +} +.fa-bell-slash-o:before { + content: "\f1f7"; +} +.fa-trash:before { + content: "\f1f8"; +} +.fa-copyright:before { + content: "\f1f9"; +} +.fa-at:before { + content: "\f1fa"; +} +.fa-eyedropper:before { + content: "\f1fb"; +} +.fa-paint-brush:before { + content: "\f1fc"; +} +.fa-birthday-cake:before { + content: "\f1fd"; +} +.fa-area-chart:before { + content: "\f1fe"; +} +.fa-pie-chart:before { + content: "\f200"; +} +.fa-line-chart:before { + content: "\f201"; +} +.fa-lastfm:before { + content: "\f202"; +} +.fa-lastfm-square:before { + content: "\f203"; +} +.fa-toggle-off:before { + content: "\f204"; +} +.fa-toggle-on:before { + content: "\f205"; +} +.fa-bicycle:before { + content: "\f206"; +} +.fa-bus:before { + content: "\f207"; +} +.fa-ioxhost:before { + content: "\f208"; +} +.fa-angellist:before { + content: "\f209"; +} +.fa-cc:before { + content: "\f20a"; +} +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: "\f20b"; +} +.fa-meanpath:before { + content: "\f20c"; +} +.fa-buysellads:before { + content: "\f20d"; +} +.fa-connectdevelop:before { + content: "\f20e"; +} +.fa-dashcube:before { + content: "\f210"; +} +.fa-forumbee:before { + content: "\f211"; +} +.fa-leanpub:before { + content: "\f212"; +} +.fa-sellsy:before { + content: "\f213"; +} +.fa-shirtsinbulk:before { + content: "\f214"; +} +.fa-simplybuilt:before { + content: "\f215"; +} +.fa-skyatlas:before { + content: "\f216"; +} +.fa-cart-plus:before { + content: "\f217"; +} +.fa-cart-arrow-down:before { + content: "\f218"; +} +.fa-diamond:before { + content: "\f219"; +} +.fa-ship:before { + content: "\f21a"; +} +.fa-user-secret:before { + content: "\f21b"; +} +.fa-motorcycle:before { + content: "\f21c"; +} +.fa-street-view:before { + content: "\f21d"; +} +.fa-heartbeat:before { + content: "\f21e"; +} +.fa-venus:before { + content: "\f221"; +} +.fa-mars:before { + content: "\f222"; +} +.fa-mercury:before { + content: "\f223"; +} +.fa-intersex:before, +.fa-transgender:before { + content: "\f224"; +} +.fa-transgender-alt:before { + content: "\f225"; +} +.fa-venus-double:before { + content: "\f226"; +} +.fa-mars-double:before { + content: "\f227"; +} +.fa-venus-mars:before { + content: "\f228"; +} +.fa-mars-stroke:before { + content: "\f229"; +} +.fa-mars-stroke-v:before { + content: "\f22a"; +} +.fa-mars-stroke-h:before { + content: "\f22b"; +} +.fa-neuter:before { + content: "\f22c"; +} +.fa-genderless:before { + content: "\f22d"; +} +.fa-facebook-official:before { + content: "\f230"; +} +.fa-pinterest-p:before { + content: "\f231"; +} +.fa-whatsapp:before { + content: "\f232"; +} +.fa-server:before { + content: "\f233"; +} +.fa-user-plus:before { + content: "\f234"; +} +.fa-user-times:before { + content: "\f235"; +} +.fa-hotel:before, +.fa-bed:before { + content: "\f236"; +} +.fa-viacoin:before { + content: "\f237"; +} +.fa-train:before { + content: "\f238"; +} +.fa-subway:before { + content: "\f239"; +} +.fa-medium:before { + content: "\f23a"; +} +.fa-yc:before, +.fa-y-combinator:before { + content: "\f23b"; +} +.fa-optin-monster:before { + content: "\f23c"; +} +.fa-opencart:before { + content: "\f23d"; +} +.fa-expeditedssl:before { + content: "\f23e"; +} +.fa-battery-4:before, +.fa-battery:before, +.fa-battery-full:before { + content: "\f240"; +} +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: "\f241"; +} +.fa-battery-2:before, +.fa-battery-half:before { + content: "\f242"; +} +.fa-battery-1:before, +.fa-battery-quarter:before { + content: "\f243"; +} +.fa-battery-0:before, +.fa-battery-empty:before { + content: "\f244"; +} +.fa-mouse-pointer:before { + content: "\f245"; +} +.fa-i-cursor:before { + content: "\f246"; +} +.fa-object-group:before { + content: "\f247"; +} +.fa-object-ungroup:before { + content: "\f248"; +} +.fa-sticky-note:before { + content: "\f249"; +} +.fa-sticky-note-o:before { + content: "\f24a"; +} +.fa-cc-jcb:before { + content: "\f24b"; +} +.fa-cc-diners-club:before { + content: "\f24c"; +} +.fa-clone:before { + content: "\f24d"; +} +.fa-balance-scale:before { + content: "\f24e"; +} +.fa-hourglass-o:before { + content: "\f250"; +} +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: "\f251"; +} +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: "\f252"; +} +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: "\f253"; +} +.fa-hourglass:before { + content: "\f254"; +} +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: "\f255"; +} +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: "\f256"; +} +.fa-hand-scissors-o:before { + content: "\f257"; +} +.fa-hand-lizard-o:before { + content: "\f258"; +} +.fa-hand-spock-o:before { + content: "\f259"; +} +.fa-hand-pointer-o:before { + content: "\f25a"; +} +.fa-hand-peace-o:before { + content: "\f25b"; +} +.fa-trademark:before { + content: "\f25c"; +} +.fa-registered:before { + content: "\f25d"; +} +.fa-creative-commons:before { + content: "\f25e"; +} +.fa-gg:before { + content: "\f260"; +} +.fa-gg-circle:before { + content: "\f261"; +} +.fa-tripadvisor:before { + content: "\f262"; +} +.fa-odnoklassniki:before { + content: "\f263"; +} +.fa-odnoklassniki-square:before { + content: "\f264"; +} +.fa-get-pocket:before { + content: "\f265"; +} +.fa-wikipedia-w:before { + content: "\f266"; +} +.fa-safari:before { + content: "\f267"; +} +.fa-chrome:before { + content: "\f268"; +} +.fa-firefox:before { + content: "\f269"; +} +.fa-opera:before { + content: "\f26a"; +} +.fa-internet-explorer:before { + content: "\f26b"; +} +.fa-tv:before, +.fa-television:before { + content: "\f26c"; +} +.fa-contao:before { + content: "\f26d"; +} +.fa-500px:before { + content: "\f26e"; +} +.fa-amazon:before { + content: "\f270"; +} +.fa-calendar-plus-o:before { + content: "\f271"; +} +.fa-calendar-minus-o:before { + content: "\f272"; +} +.fa-calendar-times-o:before { + content: "\f273"; +} +.fa-calendar-check-o:before { + content: "\f274"; +} +.fa-industry:before { + content: "\f275"; +} +.fa-map-pin:before { + content: "\f276"; +} +.fa-map-signs:before { + content: "\f277"; +} +.fa-map-o:before { + content: "\f278"; +} +.fa-map:before { + content: "\f279"; +} +.fa-commenting:before { + content: "\f27a"; +} +.fa-commenting-o:before { + content: "\f27b"; +} +.fa-houzz:before { + content: "\f27c"; +} +.fa-vimeo:before { + content: "\f27d"; +} +.fa-black-tie:before { + content: "\f27e"; +} +.fa-fonticons:before { + content: "\f280"; +} +.fa-reddit-alien:before { + content: "\f281"; +} +.fa-edge:before { + content: "\f282"; +} +.fa-credit-card-alt:before { + content: "\f283"; +} +.fa-codiepie:before { + content: "\f284"; +} +.fa-modx:before { + content: "\f285"; +} +.fa-fort-awesome:before { + content: "\f286"; +} +.fa-usb:before { + content: "\f287"; +} +.fa-product-hunt:before { + content: "\f288"; +} +.fa-mixcloud:before { + content: "\f289"; +} +.fa-scribd:before { + content: "\f28a"; +} +.fa-pause-circle:before { + content: "\f28b"; +} +.fa-pause-circle-o:before { + content: "\f28c"; +} +.fa-stop-circle:before { + content: "\f28d"; +} +.fa-stop-circle-o:before { + content: "\f28e"; +} +.fa-shopping-bag:before { + content: "\f290"; +} +.fa-shopping-basket:before { + content: "\f291"; +} +.fa-hashtag:before { + content: "\f292"; +} +.fa-bluetooth:before { + content: "\f293"; +} +.fa-bluetooth-b:before { + content: "\f294"; +} +.fa-percent:before { + content: "\f295"; +} +.fa-gitlab:before { + content: "\f296"; +} +.fa-wpbeginner:before { + content: "\f297"; +} +.fa-wpforms:before { + content: "\f298"; +} +.fa-envira:before { + content: "\f299"; +} +.fa-universal-access:before { + content: "\f29a"; +} +.fa-wheelchair-alt:before { + content: "\f29b"; +} +.fa-question-circle-o:before { + content: "\f29c"; +} +.fa-blind:before { + content: "\f29d"; +} +.fa-audio-description:before { + content: "\f29e"; +} +.fa-volume-control-phone:before { + content: "\f2a0"; +} +.fa-braille:before { + content: "\f2a1"; +} +.fa-assistive-listening-systems:before { + content: "\f2a2"; +} +.fa-asl-interpreting:before, +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; +} +.fa-deafness:before, +.fa-hard-of-hearing:before, +.fa-deaf:before { + content: "\f2a4"; +} +.fa-glide:before { + content: "\f2a5"; +} +.fa-glide-g:before { + content: "\f2a6"; +} +.fa-signing:before, +.fa-sign-language:before { + content: "\f2a7"; +} +.fa-low-vision:before { + content: "\f2a8"; +} +.fa-viadeo:before { + content: "\f2a9"; +} +.fa-viadeo-square:before { + content: "\f2aa"; +} +.fa-snapchat:before { + content: "\f2ab"; +} +.fa-snapchat-ghost:before { + content: "\f2ac"; +} +.fa-snapchat-square:before { + content: "\f2ad"; +} +.fa-pied-piper:before { + content: "\f2ae"; +} +.fa-first-order:before { + content: "\f2b0"; +} +.fa-yoast:before { + content: "\f2b1"; +} +.fa-themeisle:before { + content: "\f2b2"; +} +.fa-google-plus-circle:before, +.fa-google-plus-official:before { + content: "\f2b3"; +} +.fa-fa:before, +.fa-font-awesome:before { + content: "\f2b4"; +} +.fa-handshake-o:before { + content: "\f2b5"; +} +.fa-envelope-open:before { + content: "\f2b6"; +} +.fa-envelope-open-o:before { + content: "\f2b7"; +} +.fa-linode:before { + content: "\f2b8"; +} +.fa-address-book:before { + content: "\f2b9"; +} +.fa-address-book-o:before { + content: "\f2ba"; +} +.fa-vcard:before, +.fa-address-card:before { + content: "\f2bb"; +} +.fa-vcard-o:before, +.fa-address-card-o:before { + content: "\f2bc"; +} +.fa-user-circle:before { + content: "\f2bd"; +} +.fa-user-circle-o:before { + content: "\f2be"; +} +.fa-user-o:before { + content: "\f2c0"; +} +.fa-id-badge:before { + content: "\f2c1"; +} +.fa-drivers-license:before, +.fa-id-card:before { + content: "\f2c2"; +} +.fa-drivers-license-o:before, +.fa-id-card-o:before { + content: "\f2c3"; +} +.fa-quora:before { + content: "\f2c4"; +} +.fa-free-code-camp:before { + content: "\f2c5"; +} +.fa-telegram:before { + content: "\f2c6"; +} +.fa-thermometer-4:before, +.fa-thermometer:before, +.fa-thermometer-full:before { + content: "\f2c7"; +} +.fa-thermometer-3:before, +.fa-thermometer-three-quarters:before { + content: "\f2c8"; +} +.fa-thermometer-2:before, +.fa-thermometer-half:before { + content: "\f2c9"; +} +.fa-thermometer-1:before, +.fa-thermometer-quarter:before { + content: "\f2ca"; +} +.fa-thermometer-0:before, +.fa-thermometer-empty:before { + content: "\f2cb"; +} +.fa-shower:before { + content: "\f2cc"; +} +.fa-bathtub:before, +.fa-s15:before, +.fa-bath:before { + content: "\f2cd"; +} +.fa-podcast:before { + content: "\f2ce"; +} +.fa-window-maximize:before { + content: "\f2d0"; +} +.fa-window-minimize:before { + content: "\f2d1"; +} +.fa-window-restore:before { + content: "\f2d2"; +} +.fa-times-rectangle:before, +.fa-window-close:before { + content: "\f2d3"; +} +.fa-times-rectangle-o:before, +.fa-window-close-o:before { + content: "\f2d4"; +} +.fa-bandcamp:before { + content: "\f2d5"; +} +.fa-grav:before { + content: "\f2d6"; +} +.fa-etsy:before { + content: "\f2d7"; +} +.fa-imdb:before { + content: "\f2d8"; +} +.fa-ravelry:before { + content: "\f2d9"; +} +.fa-eercast:before { + content: "\f2da"; +} +.fa-microchip:before { + content: "\f2db"; +} +.fa-snowflake-o:before { + content: "\f2dc"; +} +.fa-superpowers:before { + content: "\f2dd"; +} +.fa-wpexplorer:before { + content: "\f2de"; +} +.fa-meetup:before { + content: "\f2e0"; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} diff --git a/assets/font-awesome.min.css b/assets/font-awesome.min.css new file mode 100644 index 0000000..5578ea5 --- /dev/null +++ b/assets/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/assets/html2pdf/_LGPL.txt b/assets/html2pdf/_LGPL.txt new file mode 100644 index 0000000..755013b --- /dev/null +++ b/assets/html2pdf/_LGPL.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/assets/html2pdf/_changelog.txt b/assets/html2pdf/_changelog.txt new file mode 100644 index 0000000..2fd3d65 --- /dev/null +++ b/assets/html2pdf/_changelog.txt @@ -0,0 +1,314 @@ +4.03 (2011-05-27) + correction de l'exemple "form.php" : vulnérabilité cross-site scripting corrigée + correction sur la gestion des retours à la ligne automatique + correction sur le calcul de la hauteur des balises H1->H6 + amélioration de la gestion des exceptions + +4.02 (2011-04-29) + ATTENTION : beaucoup de changements dans la structure du projet. version 3.xx abandonnée + uniformisation des fichiers du projet (standard Zend) + conversion des fichiers de langue en CSV, déplacement dans le répertoire "locale". création d'une classe spécifique à la gestion des locales + amélioration de la gestion de certaines erreurs + modification du nom de toutes les sous classes + déplacement de toutes les sous classes + modification du nom de toutes les méthodes protected + correction sur la gestion des tables + correction sur la lecture des path des SVG + premiere version de text-align:justify + correction sur la gestion de la balise BLOCKQUOTE + correction sur la gestion de la balise P + gestion des styles CSS pour les balises TEXTAREA, SELECT, INPUT + ajout de la propriété pagegroup="new" sur la balise PAGE + correction pour la balise INPUT de type radio : checked au lieu de selected + +3.30 / 4.01 (2010-05-07) + correction sur la gestion des textes + correction sur le parseur HTML + correction sur la gestion de border-collapse + correction sur la gestion des TDs, H1->H6 + ajout des balises fieldset et legend (cf exemple 4) + ajout de la langue CS + nombreuses améliorations + v4.01 uniquement : Utilisation de TCPDF 5.0.002 + v4.01 uniquement : Utilisation des QR-code de TCPDF, il n'y a plus besoin d'une librairie externe + v4.01 uniquement : Utilisation des exceptions PHP pour les erreurs. Tous les exemples ont été mis à jour en consequence + (merci à Pavel Kochman pour ses sugestions et ses ajouts) + +3.29 / 4.00 (2010-03-17) + modification des barcodes. ATTENTION : bar_w et bar_h n'existent plus ! + correction sur la gestion de page_footer + correction sur la gestion des html entities + correction sur le positionnement des textes + correction sur le positionnement des tableaux + nombreuses corrections sur les positionnements, les couleurs, ... + amélioration de la partie SVG (balise G, ...) + amélioration sur createIndex + harmonisation des noms des méthodes + correction sur la gestion des textes + v4.00 uniquement : HTML2PDF est maintenant écrit en PHP5 et basé sur TCPDF (=> unicode, utf8, ...) + v4.00 uniquement : utilisation de TCPDF pour les formulaires et les barcodes + v4.00 uniquement : amélioration de la partie SVG (alpha) + +3.28 (2010-01-18) + ajout de la gestion de la balise label + correction pour compatibilité PHP4 + +3.27 (2010-01-11) + correction sur page_header et page_footer + ajout de la possibilité de pouvoir mettre l'index automatique dans la page que l'on veut + correction sur la gestion du canal alpha pour les PNGs + correction sur la gestion des border-radius (cf exemple radius) conforme au CSS3 + correction sur la gestion du background-color + correction sur la gestion de thead, tfoot, et tbody + ajout du dessin verctoriel (cf exemples draw, tigre, sapin) + ajout de la propriété label="none/label" pour la balise <barcode> + nombreux petits correctifs + +3.26 (2009-11-16) + correction pour support des images générés en CGI + ajout de la gestion du canal alpha pour les PNGs (nécessite GD2) + ajout de la méthode setDefaultFont permettant de spécifier une fonte par défaut + ajout de la propriété format pour la balise <page> (cf exemple 4) + amélioration de la gestion des couleurs css RGB (cf exemple 2) + ajout de la gestion des couleurs css CMYK (cf exemple 2) + ajout de la propriété css overflow:hidden pour la balise <div> (cf exemple 2) + correction sur page_header et page_footer + ajout de la possibilité de pouvoir directement convertir le résultat d'une vraie page HTML + nombreux petits correctifs sur les styles + +3.25 (2009-10-07) + correctif sur le calcul des tableaux dans le page_footer + correctif sur l'interprétation des espaces entre certaines balises + correction sur la gestion des balises H1, H2, H3, H4, H5, H6 + correction sur la gestion de la balise table + support des balises xhtml du type <span /> + ajout des balises COL (cf exemple 5), DEL, INS, et QRCODE (cf exemple 13) + ajout de la propriété css text-transform + ajout de la propriété css rotate (uniquement sur les DIV, cf exemple 8) + ne plus rendre obligatoire l'existence d'une image (nouvelle méthode setTestIsImage) + ajout d'un mode DEBUG - les anciennes fonction d'analyse des ressources ont été supprimées + ajout de la méthode setEncoding + ajout de la langue danoise DA (merci à Daniel K.) + +3.24 (2009-08-05) + correction sur le calcul de la largeur des divs + modification pour compatibilité avec la localisation PHP + modification pour compatibilité avec PHP 5.3.0 + +3.23 (2009-07-30) + correction sur le calcul des DIVs + correction sur l'interpretation de certains styles CSS + correction de la fonction de creation d'index automatique CreateIndex + ATTENTION : la methode d'appel de CreateIndex a changé. Regardez l'exemple About !!!! + +3.22a (2009-06-16) + redistribution de HTML2PDF sous la licence LGPL !!! (au lieu de GPL) + +3.22 (2009-06-08) + correction sur le background-color + refonte totale de la gestion de text-align. les valeurs center et right marchent maintenant meme en cas de contenu riche + +3.21 (2009-05-05) + ajout de la propriété css FLOAT pour la balise IMG + correction sur la gestion des TFOOT + correction sur le positionnement des images + +3.20 (2009-04-06) + ajout de la gestion des margins pour la balise DIV + ajout de la gestion de la propriete css LINE-HEIGHT + correction sur l'interpretation de la valeur de certains styles CSS (background-image, background-position, ...) + correction sur la reconnaissance des balises thead et tfoot + correction sur la balise select + correction sur les fichiers de langue (merci à Sinan) + +3.19 (2009-03-11) + optimisation du parseur HTML - merci à Jezelinside + ajout de la balise TFOOT + amélioration de la gestion des tableaux : les contenus des balises THEAD et TFOOT sont maintenant répétés sur chaque page. + ajout de la balise spécifique BOOKMARK afin de créer des "marques-page" + possibilité de rajouter un index automatique en fin de fichier + ajout de la langue turque TR (merci à Hidayet) + amélioration de la méthode Output. Elle est maintenant également utilisable comme celle de FPDF + +3.18 (2009-02-22) + correction sur les sauts de page automatique pour les balises TABLE, UL, OL + correction sur l'interpretation des styles pour la balise HR + correction sur l'interpretation du style border-collapse pour la balise TABLE + prise en compte de margin:auto pour les tables et les divs + les commentaires dans les CSS sont acceptés + +3.17 (2008-12-30) + ajout de la gestion des balises INPUT (text, radio, checkbox, button, hidden, ...), SELECT, OPTION, TEXTAREA (cf exemple 14) + ajout de la possibilité de mettre des scripts dans le pdf, via $html2pdf->pdf->IncludeJS(...); (cf exemples JS) + correction sur le saut de page automatique pour les images + correction sur les sauts de lignes automatiques pour certaines balises (UL, P, ...) + ajout de la langue NL (merci à Roland) + +3.16 (2008-12-09) + ajout de la gestion de list-style: none (cf exemple 13) + correction dans la gestion des fontes ajoutées à fpdf (via la méthode AddFont) + nombreuses corrections sur le calcul des largeurs des éléments table, div, hr, td, th + ajout de l'exemple about.php + (pour info, les PDF générés à partir des exemples sont maintenant dans le répertoire /exemples/pdf/, et sont supprimables) + +3.15 (2008-12-01) + correction sur l'identification des styles en cas de valeurs multiples dans la propriete class + prise en compte de border-radius pour la limite des backgrounds (color et image) + ajout des proprietes CSS border-top-*, border-right-*, border-bottom-*, border-left-* + ajout de la propriété CSS list-style-image (cf exemple 12) + pour la balise table, ajout de l'interprétation de align="center" et align="right" (cf exemple 1) + correction dans le positionnement des images + correction de quelques bugs + ajout d'une fonction d'analyse des ressources HTML2PDFgetTimerDebug (cf début du fichier html2pdf.class.php) + +3.14 (2008-11-17) + ajout d'une langue (pt : Brazilian Portuguese language) et amelioration de la methode vueHTML (merci à Rodrigo) + correction du positionnement du contenu des DIVs. gestion des proprietes valign et align + ajout de la propriete CSS border-collapse (cf exemple 0) + ajout de la propriete CSS border-radius (cf exemple 1) + correction de quelques bugs + +3.13 (2008-09-24) + reecriture de la balise hr, avec prise en compte des styles (cf exemple 0) + ajout de la propriete backcolor pour la balise page (cf exemple 9) + ajout des proprietes backleft et backright pour la balise page afin de pouvoir changer les marges des pages (cf exemple 8) + nombreuses corrections sur les balises et les styles + +3.12 (2008-09-16) + ajout des balises ol, ul, li (cf exemple 12) + correction sur le calcul de la taille des td en cas de colspan et rowspan + ajout de la méthode setTestTdInOnePage afin de pouvoir desactiver le test sur la taille des TD (cf exemple 11) + correction de quelques bugs + +3.11 (2008-08-29) + ajout des balises div, p, pre, s + gestion des styles CSS position (relative, absolute), left, top, right, bottom (cf exemple 10) + meilleur gestion des border : border-style, border-color, border-width (cf exemple 10) + possibilité d'indiquer les marges par défault, via le constructeur (cf exemple 2) + +3.10a (2008-08-26) + correction pour compatibilité php4 / php5 + +3.10 (2008-08-25) + ajout des liens internes (cf exemple 7) + gestion complete des background : image, repeat, position, color (cf exemple 1) + gestion de underline, overline, linethrough (cf exemple 2) + correction de quelques bugs + +3.09 + mise à jour vers fpdf version 1.6, ajout de barcode, correction de l'affichage de certains caractères spéciaux + correction du calcul de la hauteur de ligne de la balise br + detection en cas de contenu trop grand dans un TD + amélioration de la balise page (ajout de l'attribue pageset, avec les valeurs new et old) + ajout de FPDF_PROTECTION, accesible via $pdf->pdf->SetProtection(...) + +3.08 + version opérationnelle de page_header + ajout de page_footer + correction des borders des tableaux + +3.07 + correction de l'interpretation de cellspacing, + amélioration de la balise page_header + +3.06 + première gestion de la balise page_header + correction des dimensions des tableaux + +3.05 + ajout de la propriété vertical-align + ajout de la gestion des fichiers de langue + +3.04 + correction du saut de page automatique pour les tableaux + Ajout de propriétés à la balise PAGE + +3.03 + correction de bugs au niveau de la gestion des images PHP par FPDF + meilleure gestion des erreurs + +3.02 + ajout de la gestion des noms des couleurs + correction de la gestion des images générées par php + correction de quelques bugs + +3.01 + correction de quelques bugs + ajout d'une protection pour les balises non existantes + +3.00 + refonte totale du calcul des tableaux + Prise en compte des colspan et rowspan + +2.85 + ajout de la propriété cellspacing + nouvelle gestion des padding des tableaux + +2.80 + ajout des types de border dotted et dasheds + +2.75 + ajout des top, left, right, bottom pour padding et border + +2.70 + correction de la balise HR, ajout de la propriété padding pour les table, th, td + correction des dimensions, les unités px, mm, in, pt sont enfin réellement reproduites, correction de font-size, border, ... + ajout d'une propriété à la balise page : footer + correction dans l'affichage et le calcul des tables + +2.55 + vérification de la validité du code (ouverture / fermeture) + ajout des unités mm, in, pt + +2.50 + correction de nobreak + correction des marges + ajout de nombreuses balises + +2.40 + refonte totale de l'identification des styles CSS (Les héritages marchent) + +2.39 + corrections diverses + ajout de certaines propriétés (bgcolor, ...) + +2.38 + meilleur identification des propriétés border et color + +2.37 + nombreuses corrections : + balise A + couleur de fond + retour à la ligne + gestion des images dans un texte + +2.36 + ajout de la balises STRONG + ajout de la balise EM + +2.35 + amélioration de la gestion des feuilles de style + +2.31 + correction de quelques bugs + +2.30 + première version opérationnel des feuilles de style + +2.25 + ajout de la balise LINK pour le type text/css + +2.20 + premier jet de la gestion des feuilles de style, ajout de la balise STYLE + +2.15 + n'interpréte plus l'HTML en commentaire <!-- --> + +2.10 + ajout des balises H1 -> H6 + +2.01 + correction de quelques bugs + +2.00 + première version diffusée \ No newline at end of file diff --git a/assets/html2pdf/_class/exception.class.php b/assets/html2pdf/_class/exception.class.php new file mode 100644 index 0000000..a1676ac --- /dev/null +++ b/assets/html2pdf/_class/exception.class.php @@ -0,0 +1,168 @@ +<?php +/** + * HTML2PDF Librairy - HTML2PDF Exception + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * @version 4.03 + */ + +class HTML2PDF_exception extends exception +{ + protected $_tag = null; + protected $_html = null; + protected $_other = null; + protected $_image = null; + protected $_messageHtml = ''; + + /** + * generate a HTML2PDF exception + * + * @param int $err error number + * @param mixed $other additionnal informations + * @return string $html optionnal code HTML associated to the error + */ + final public function __construct($err = 0, $other = null, $html = '') + { + // read the error + switch($err) + { + case 1: // Unsupported tag + $msg = (HTML2PDF_locale::get('err01')); + $msg = str_replace('[[OTHER]]', $other, $msg); + $this->_tag = $other; + break; + + case 2: // too long sentence + $msg = (HTML2PDF_locale::get('err02')); + $msg = str_replace('[[OTHER_0]]', $other[0], $msg); + $msg = str_replace('[[OTHER_1]]', $other[1], $msg); + $msg = str_replace('[[OTHER_2]]', $other[2], $msg); + break; + + case 3: // closing tag in excess + $msg = (HTML2PDF_locale::get('err03')); + $msg = str_replace('[[OTHER]]', $other, $msg); + $this->_tag = $other; + break; + + case 4: // tags closed in the wrong order + $msg = (HTML2PDF_locale::get('err04')); + $msg = str_replace('[[OTHER]]', print_r($other, true), $msg); + break; + + case 5: // unclosed tag + $msg = (HTML2PDF_locale::get('err05')); + $msg = str_replace('[[OTHER]]', print_r($other, true), $msg); + break; + + case 6: // image can not be loaded + $msg = (HTML2PDF_locale::get('err06')); + $msg = str_replace('[[OTHER]]', $other, $msg); + $this->_image = $other; + break; + + case 7: // too big TD content + $msg = (HTML2PDF_locale::get('err07')); + break; + + case 8: // SVG tag not in DRAW tag + $msg = (HTML2PDF_locale::get('err08')); + $msg = str_replace('[[OTHER]]', $other, $msg); + $this->_tag = $other; + break; + + case 9: // deprecated + $msg = (HTML2PDF_locale::get('err09')); + $msg = str_replace('[[OTHER_0]]', $other[0], $msg); + $msg = str_replace('[[OTHER_1]]', $other[1], $msg); + $this->_tag = $other[0]; + break; + + case 0: // specific error + default: + $msg = $other; + break; + } + + // create the HTML message + $this->_messageHtml = '<span style="color: #AA0000; font-weight: bold;">'.HTML2PDF_locale::get('txt01', 'error: ').$err.'</span><br>'; + $this->_messageHtml.= HTML2PDF_locale::get('txt02', 'file:').' '.$this->file.'<br>'; + $this->_messageHtml.= HTML2PDF_locale::get('txt03', 'line:').' '.$this->line.'<br>'; + $this->_messageHtml.= '<br>'; + $this->_messageHtml.= $msg; + + // create the text message + $msg = HTML2PDF_locale::get('txt01', 'error: ').$err.' : '.strip_tags($msg); + + // add the optionnal html content + if ($html) { + $this->_messageHtml.= "<br><br>HTML : ...".trim(htmlentities($html)).'...'; + $this->_html = $html; + $msg.= ' HTML : ...'.trim($html).'...'; + } + + // save the other informations + $this->_other = $other; + + // construct the exception + parent::__construct($msg, $err); + } + + /** + * get the message as string + * + * @access public + * @return string $messageHtml + */ + public function __toString() + { + return $this->_messageHtml; + } + + /** + * get the html tag name + * + * @access public + * @return string $tagName + */ + public function getTAG() + { + return $this->_tag; + } + + /** + * get the optional html code + * + * @access public + * @return string $html + */ + public function getHTML() + { + return $this->_html; + } + + /** + * get the optional other informations + * + * @access public + * @return mixed $other + */ + public function getOTHER() + { + return $this->_other; + } + + /** + * get the image source + * + * @access public + * @return string $imageSrc + */ + public function getIMAGE() + { + return $this->_image; + } +} \ No newline at end of file diff --git a/assets/html2pdf/_class/locale.class.php b/assets/html2pdf/_class/locale.class.php new file mode 100644 index 0000000..345343b --- /dev/null +++ b/assets/html2pdf/_class/locale.class.php @@ -0,0 +1,96 @@ +<?php +/** + * HTML2PDF Librairy - HTML2PDF Locale + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * @version 4.03 + */ + +class HTML2PDF_locale +{ + /** + * code of the current used locale + * @var string + */ + static protected $_code = null; + + /** + * texts of the current used locale + * @var array + */ + static protected $_list = array(); + + /** + * directory where locale files are + * @var string + */ + static protected $_directory = null; + + /** + * load the locale + * + * @access public + * @param string $code + */ + static public function load($code) + { + if (self::$_directory===null) { + self::$_directory = dirname(dirname(__FILE__)).'/locale/'; + } + + // must be in lower case + $code = strtolower($code); + + // must be [a-z-0-9] + if (!preg_match('/^([a-z0-9]+)$/isU', $code)) { + throw new HTML2PDF_exception(0, 'invalid language code ['.self::$_code.']'); + } + + // save the code + self::$_code = $code; + + // get the name of the locale file + $file = self::$_directory.self::$_code.'.csv'; + + // the file must exist + if (!is_file($file)) { + throw new HTML2PDF_exception(0, 'language code ['.self::$_code.'] unknown. You can create the translation file ['.$file.'] and send it to the webmaster of html2pdf in order to integrate it into a future release'); + } + + // load the file + self::$_list = array(); + $handle = fopen($file, 'r'); + while (!feof($handle)) { + $line = fgetcsv($handle); + if (count($line)!=2) continue; + self::$_list[trim($line[0])] = trim($line[1]); + } + fclose($handle); + } + + /** + * clean the locale + * + * @access public static + */ + static public function clean() + { + self::$_code = null; + self::$_list = array(); + } + + /** + * get a text + * + * @access public static + * @param string $key + * @return string + */ + static public function get($key, $default='######') + { + return (isset(self::$_list[$key]) ? self::$_list[$key] : $default); + } +} \ No newline at end of file diff --git a/assets/html2pdf/_class/myPdf.class.php b/assets/html2pdf/_class/myPdf.class.php new file mode 100644 index 0000000..19628bf --- /dev/null +++ b/assets/html2pdf/_class/myPdf.class.php @@ -0,0 +1,1415 @@ +<?php +/** + * HTML2PDF Librairy - myPdf class + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * @version 4.03 + */ + +require_once(dirname(__FILE__).'/tcpdfConfig.php'); +require_once(dirname(__FILE__).'/../_tcpdf_'.HTML2PDF_USED_TCPDF_VERSION.'/tcpdf.php'); + +class HTML2PDF_myPdf extends TCPDF +{ + protected $_footerParam = array(); + protected $_transf = array(); + protected $_myLastPageGroup = null; + protected $_myLastPageGroupNb = 0; + + // used to make a radius with bezier : (4/3 * (sqrt(2) - 1)) + const MY_ARC = 0.5522847498; + + // nb of segment to build a arc with bezier curv + const ARC_NB_SEGMENT = 8; + + /** + * class constructor + * + * @param string $orientation page orientation, same as TCPDF + * @param string $unit User measure unit, same as TCPDF + * @param mixed $format The format used for pages, same as TCPDF + * @param boolean $unicode TRUE means that the input text is unicode (default = true) + * @param String $encoding charset encoding; default is UTF-8 + * @param boolean $diskcache if TRUE reduce the RAM memory usage by caching temporary data on filesystem (slower). + * @access public + */ + public function __construct( + $orientation='P', + $unit='mm', + $format='A4', + $unicode=true, + $encoding='UTF-8', + $diskcache=false) + { + // call the parent constructor + parent::__construct($orientation, $unit, $format, $unicode, $encoding, $diskcache); + + // init the specific parameters used by HTML2PDF + $this->SetCreator(PDF_CREATOR); + $this->SetAutoPageBreak(false, 0); + $this->linestyleCap = '2 J'; + $this->setPrintHeader(false); + $this->jpeg_quality = 90; + + // prepare the automatic footer + $this->SetMyFooter(); + + $this->cMargin = 0; + } + + /** + * Set the parameters for the automatic footer + * + * @param boolean $page display the page number + * @param boolean $date display the date + * @param boolean $hour display the hour + * @param boolean $form display a warning abour forms + * @access public + */ + public function SetMyFooter($page = false, $date = false, $hour = false, $form = false) + { + $page = ($page ? true : false); + $date = ($date ? true : false); + $hour = ($hour ? true : false); + $form = ($form ? true : false); + + $this->_footerParam = array('page' => $page, 'date' => $date, 'hour' => $hour, 'form' => $form); + } + + /** + * This function is call automatically by TCPDF at the end of a page + * It takes no parameters + * + * @access public + */ + public function Footer() + { + // prepare the text from the tranlated text + $txt = ''; + if ($this->_footerParam['form']) { + $txt = (HTML2PDF_locale::get('pdf05')); + } + if ($this->_footerParam['date'] && $this->_footerParam['hour']) { + $txt.= ($txt ? ' - ' : '').(HTML2PDF_locale::get('pdf03')); + } + if ($this->_footerParam['date'] && !$this->_footerParam['hour']) { + $txt.= ($txt ? ' - ' : '').(HTML2PDF_locale::get('pdf01')); + } + if (!$this->_footerParam['date'] && $this->_footerParam['hour']) { + $txt.= ($txt ? ' - ' : '').(HTML2PDF_locale::get('pdf02')); + } + if ($this->_footerParam['page']) { + $txt.= ($txt ? ' - ' : '').(HTML2PDF_locale::get('pdf04')); + } + + if (strlen($txt)>0) { + // replace some values + $toReplace = array( + '[[date_d]]' => date('d'), + '[[date_m]]' => date('m'), + '[[date_y]]' => date('Y'), + '[[date_h]]' => date('H'), + '[[date_i]]' => date('i'), + '[[date_s]]' => date('s'), + '[[page_cu]]' => $this->getMyNumPage(), + '[[page_nb]]' => $this->getMyAliasNbPages(), + ); + $txt = str_replace(array_keys($toReplace), array_values($toReplace), $txt); + + // draw the footer + parent::SetY(-11); + $this->SetFont('helvetica', 'I', 8); + $this->Cell(0, 10, $txt, 0, 0, 'R'); + } + } + + /** + * after cloning a object, we does not want to clone all the front informations + * because it take a lot a time and a lot of memory => we use reference + * + * @param &HTML2PDF_myPdf object + * @access public + */ + public function cloneFontFrom(&$pdf) + { + $this->fonts = &$pdf->getFonts(); + $this->FontFiles = &$pdf->getFontFiles(); + $this->diffs = &$pdf->getDiffs(); + $this->fontlist = &$pdf->getFontList(); + $this->numfonts = &$pdf->getNumFonts(); + $this->fontkeys = &$pdf->getFontKeys(); + $this->font_obj_ids = &$pdf->getFontObjIds(); + $this->annotation_fonts = &$pdf->getAnnotFonts(); + } + + /** + * multiple public accessor for some private attributs + * used only by cloneFontFrom + * + * @return &array + * @access public + */ + public function &getFonts() + { + return $this->fonts; + } + public function &getFontFiles() + { + return $this->FontFiles; + } + public function &getDiffs() + { + return $this->diffs; + } + public function &getFontList() + { + return $this->fontlist; + } + public function &getNumFonts() + { + return $this->numfonts; + } + public function &getFontKeys() + { + return $this->fontkeys; + } + public function &getFontObjIds() + { + return $this->font_obj_ids; + } + public function &getAnnotFonts() + { + return $this->annotation_fonts; + } + + /** + * Verify that a Font is already loaded + * + * @param string Font Key + * @return boolean + * @access public + */ + public function isLoadedFont($fontKey) + { + if (isset($this->fonts[$fontKey])) { + return true; + } + + if (isset($this->CoreFonts[$fontKey])) { + return true; + } + + return false; + } + + /** + * Get the Word Spacing + * + * @access public + * @return float word spacing + */ + public function getWordSpacing() + { + return $this->ws; + } + + /** + * set the Word Spacing + * + * @param float word spacing + * @access public + */ + public function setWordSpacing($ws=0.) + { + $this->ws = $ws; + $this->_out(sprintf('%.3F Tw', $ws*$this->k)); + } + + /** + * start to use a rectangular Cliping Path with radius corners + * + * @param float $x (top left corner) + * @param float $y (top left corner) + * @param float $w (x+w = botom rigth corner) + * @param float $h (y+h = botom rigth corner) + * @param array $cornerTL radius of the Top Left corner + * @param array $cornerTR radius of the Top Right corner + * @param array $cornerBL radius of the Bottom Left corner + * @param array $cornerBR radius of the Bottom Right corner + * @access public + */ + public function clippingPathStart( + $x = null, + $y = null, + $w = null, + $h = null, + $cornerTL=null, + $cornerTR=null, + $cornerBL=null, + $cornerBR=null) + { + // init the path + $path = ''; + + // if we have the position and the size of the rectangle, we can proceed + if ($x!==null && $y!==null && $w!==null && $h!==null) { + // the positions of the rectangle's corners + $x1 = $x*$this->k; + $y1 = ($this->h-$y)*$this->k; + + $x2 = ($x+$w)*$this->k; + $y2 = ($this->h-$y)*$this->k; + + $x3 = ($x+$w)*$this->k; + $y3 = ($this->h-$y-$h)*$this->k; + + $x4 = $x*$this->k; + $y4 = ($this->h-$y-$h)*$this->k; + + // if we have at least one radius corner, then we proceed to a specific path, else it is just a rectangle + if ($cornerTL || $cornerTR || $cornerBL || $cornerBR) { + // prepare the radius values + if ($cornerTL) { + $cornerTL[0] = $cornerTL[0]*$this->k; + $cornerTL[1] =-$cornerTL[1]*$this->k; + } + if ($cornerTR) { + $cornerTR[0] = $cornerTR[0]*$this->k; + $cornerTR[1] =-$cornerTR[1]*$this->k; + } + if ($cornerBL) { + $cornerBL[0] = $cornerBL[0]*$this->k; + $cornerBL[1] =-$cornerBL[1]*$this->k; + } + if ($cornerBR) { + $cornerBR[0] = $cornerBR[0]*$this->k; + $cornerBR[1] =-$cornerBR[1]*$this->k; + } + + // if TL radius then specific start else (X1,Y1) + if ($cornerTL) { + $path.= sprintf('%.2F %.2F m ', $x1+$cornerTL[0], $y1); + } else { + $path.= sprintf('%.2F %.2F m ', $x1, $y1); + } + + // if TR radius then line + arc, else line to (X2,Y2) + if ($cornerTR) { + $xt1 = ($x2-$cornerTR[0])+$cornerTR[0]*self::MY_ARC; + $yt1 = ($y2+$cornerTR[1])-$cornerTR[1]; + $xt2 = ($x2-$cornerTR[0])+$cornerTR[0]; + $yt2 = ($y2+$cornerTR[1])-$cornerTR[1]*self::MY_ARC; + + $path.= sprintf('%.2F %.2F l ', $x2-$cornerTR[0], $y2); + $path.= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $x2, $y2+$cornerTR[1]); + } else { + $path.= sprintf('%.2F %.2F l ', $x2, $y2); + } + + // if BR radius then line + arc, else line to (X3, Y3) + if ($cornerBR) { + $xt1 = ($x3-$cornerBR[0])+$cornerBR[0]; + $yt1 = ($y3-$cornerBR[1])+$cornerBR[1]*self::MY_ARC; + $xt2 = ($x3-$cornerBR[0])+$cornerBR[0]*self::MY_ARC; + $yt2 = ($y3-$cornerBR[1])+$cornerBR[1]; + + $path.= sprintf('%.2F %.2F l ', $x3, $y3-$cornerBR[1]); + $path.= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $x3-$cornerBR[0], $y3); + } else { + $path.= sprintf('%.2F %.2F l ', $x3, $y3); + } + + // if BL radius then line + arc, else line to (X4, Y4) + if ($cornerBL) { + $xt1 = ($x4+$cornerBL[0])-$cornerBL[0]*self::MY_ARC; + $yt1 = ($y4-$cornerBL[1])+$cornerBL[1]; + $xt2 = ($x4+$cornerBL[0])-$cornerBL[0]; + $yt2 = ($y4-$cornerBL[1])+$cornerBL[1]*self::MY_ARC; + + $path.= sprintf('%.2F %.2F l ', $x4+$cornerBL[0], $y4); + $path.= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $x4, $y4-$cornerBL[1]); + } else { + $path.= sprintf('%.2F %.2F l ', $x4, $y4); + } + + // if RL radius then line + arc + if ($cornerTL) { + $xt1 = ($x1+$cornerTL[0])-$cornerTL[0]; + $yt1 = ($y1+$cornerTL[1])-$cornerTL[1]*self::MY_ARC; + $xt2 = ($x1+$cornerTL[0])-$cornerTL[0]*self::MY_ARC; + $yt2 = ($y1+$cornerTL[1])-$cornerTL[1]; + + $path.= sprintf('%.2F %.2F l ', $x1, $y1+$cornerTL[1]); + $path.= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $x1+$cornerTL[0], $y1); + } + } else { + $path.= sprintf('%.2F %.2F m ', $x1, $y1); + $path.= sprintf('%.2F %.2F l ', $x2, $y2); + $path.= sprintf('%.2F %.2F l ', $x3, $y3); + $path.= sprintf('%.2F %.2F l ', $x4, $y4); + } + + // close the path + $path.= ' h W n'; + } + + // using the path as a clipping path + $this->_out('q '.$path.' '); + } + + /** + * stop to use the Cliping Path + * + * @access public + */ + public function clippingPathStop() + { + $this->_out(' Q'); + } + + /** + * draw a filled corner of a border with a external and a internal radius + * /--------+ ext2 + * / | + * / /-------+ int2 + * / / + * | / + * | | + * | | + * ext1 +-+ int1 + cen + * + * @param float $ext1X + * @param float $ext1Y + * @param float $ext2X + * @param float $ext2Y + * @param float $int1X + * @param float $int1Y + * @param float $int2X + * @param float $int2Y + * @param float $cenX + * @param float $cenY + * @access public + */ + public function drawCurve($ext1X, $ext1Y, $ext2X, $ext2Y, $int1X, $int1Y, $int2X, $int2Y, $cenX, $cenY) + { + // prepare the coordinates + $ext1X = $ext1X*$this->k; + $ext2X = $ext2X*$this->k; + $int1X = $int1X*$this->k; + $int2X = $int2X*$this->k; + $cenX = $cenX*$this->k; + + $ext1Y = ($this->h-$ext1Y)*$this->k; + $ext2Y = ($this->h-$ext2Y)*$this->k; + $int1Y = ($this->h-$int1Y)*$this->k; + $int2Y = ($this->h-$int2Y)*$this->k; + $cenY = ($this->h-$cenY) *$this->k; + + // init the curve + $path = ''; + + if ($ext1X-$cenX!=0) { + $xt1 = $cenX+($ext1X-$cenX); + $yt1 = $cenY+($ext2Y-$cenY)*self::MY_ARC; + $xt2 = $cenX+($ext1X-$cenX)*self::MY_ARC; + $yt2 = $cenY+($ext2Y-$cenY); + } else { + $xt1 = $cenX+($ext2X-$cenX)*self::MY_ARC; + $yt1 = $cenY+($ext1Y-$cenY); + $xt2 = $cenX+($ext2X-$cenX); + $yt2 = $cenY+($ext1Y-$cenY)*self::MY_ARC; + } + $path.= sprintf('%.2F %.2F m ', $ext1X, $ext1Y); + $path.= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $ext2X, $ext2Y); + + if ($int1X-$cenX!=0) { + $xt1 = $cenX+($int1X-$cenX)*self::MY_ARC; + $yt1 = $cenY+($int2Y-$cenY); + $xt2 = $cenX+($int1X-$cenX); + $yt2 = $cenY+($int2Y-$cenY)*self::MY_ARC; + } else { + $xt1 = $cenX+($int2X-$cenX); + $yt1 = $cenY+($int1Y-$cenY)*self::MY_ARC; + $xt2 = $cenX+($int2X-$cenX)*self::MY_ARC; + $yt2 = $cenY+($int1Y-$cenY); + } + $path.= sprintf('%.2F %.2F l ', $int2X, $int2Y); + $path.= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $int1X, $int1Y); + + // draw the curve + $this->_out($path . 'f'); + } + + /** + * draw a filled corner of a border with only a external radius + * /--+ ext2 + * / | + * / | + * / | + * | | + * | | + * | | + * ext1 +-----+ int + cen + * + * @param float $ext1X + * @param float $ext1Y + * @param float $ext2X + * @param float $ext2Y + * @param float $intX + * @param float $intY + * @param float $cenX + * @param float $cenY + * @access public + */ + public function drawCorner($ext1X, $ext1Y, $ext2X, $ext2Y, $intX, $intY, $cenX, $cenY) + { + // prepare the coordinates + $ext1X = $ext1X*$this->k; + $ext2X = $ext2X*$this->k; + $intX = $intX*$this->k; + $cenX = $cenX*$this->k; + + $ext1Y = ($this->h-$ext1Y)*$this->k; + $ext2Y = ($this->h-$ext2Y)*$this->k; + $intY = ($this->h-$intY)*$this->k; + $cenY = ($this->h-$cenY)*$this->k; + + // init the curve + $path = ''; + + if ($ext1X-$cenX!=0) { + $xt1 = $cenX+($ext1X-$cenX); + $yt1 = $cenY+($ext2Y-$cenY)*self::MY_ARC; + $xt2 = $cenX+($ext1X-$cenX)*self::MY_ARC; + $yt2 = $cenY+($ext2Y-$cenY); + } else { + $xt1 = $cenX+($ext2X-$cenX)*self::MY_ARC; + $yt1 = $cenY+($ext1Y-$cenY); + $xt2 = $cenX+($ext2X-$cenX); + $yt2 = $cenY+($ext1Y-$cenY)*self::MY_ARC; + } + $path.= sprintf('%.2F %.2F m ', $ext1X, $ext1Y); + $path.= sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c ', $xt1, $yt1, $xt2, $yt2, $ext2X, $ext2Y); + $path.= sprintf('%.2F %.2F l ', $intX, $intY); + $path.= sprintf('%.2F %.2F l ', $ext1X, $ext1Y); + + // draw the curve + $this->_out($path . 'f'); + } + + /** + * Start a transformation + * + * @access public + */ + public function startTransform() + { + $this->_out('q'); + } + + /** + * Stop a transformation + * + * @access public + */ + public function stopTransform() + { + $this->_out('Q'); + } + + /** + * add a Translate transformation + * + * @param float $Tx + * @param float $Ty + * @access public + */ + public function setTranslate($xT, $yT) + { + // Matrix for Translate + $tm[0]=1; + $tm[1]=0; + $tm[2]=0; + $tm[3]=1; + $tm[4]=$xT*$this->k; + $tm[5]=-$yT*$this->k; + + // apply the Transform Matric + $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F cm', $tm[0], $tm[1], $tm[2], $tm[3], $tm[4], $tm[5])); + } + + /** + * add a Rotate transformation + * + * @param float $angle + * @param float $Cx + * @param float $Cy + * @access public + */ + public function setRotation($angle, $xC=null, $yC=null) + { + // if no center, rotate around the current posiition + if($xC === null) $xC=$this->x; + if($yC === null) $yC=$this->y; + + // prepare the coordinate + $yC=($this->h-$yC)*$this->k; + $xC*=$this->k; + + // Matrix for Rotate + $tm[0]=cos(deg2rad($angle)); + $tm[1]=sin(deg2rad($angle)); + $tm[2]=-$tm[1]; + $tm[3]=$tm[0]; + $tm[4]=$xC+$tm[1]*$yC-$tm[0]*$xC; + $tm[5]=$yC-$tm[0]*$yC-$tm[1]*$xC; + + // apply the Transform Matric + $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F cm', $tm[0], $tm[1], $tm[2], $tm[3], $tm[4], $tm[5])); + } + + /** + * we redifine the original SetX method, because we don't want the automatic treatment. + * It is HTML2PDF that make the treatment + * + * @param float $x + * @param boolean $rtloff NOT USED + * @access public + */ + public function SetX($x, $rtloff=false) + { + $this->x=$x; + } + + /** + * we redifine the original SetY method, because we don't want the automatic treatment. + * It is HTML2PDF that make the treatment + * + * @param float $y + * @param boolean $resetx Reset the X position + * @param boolean $rtloff NOT USED + * @access public + */ + public function SetY($y, $resetx=true, $rtloff=false) + { + if ($resetx) + $this->x=$this->lMargin; + + $this->y=$y; + } + + /** + * we redifine the original SetXY method, because we don't want the automatic treatment. + * It is HTML2PDF that make the treatment + * + * @param integer $x + * @param integer $y + * @param boolean $rtloff NOT USED + * @access public + */ + public function SetXY($x, $y, $rtloff=false) + { + $this->x=$x; + $this->y=$y; + } + + /** + * multiple public accessor because HTML2PDF need to use TCPDF without being a extend of it + * + * @param mixed + * @return mixed + * @access public + */ + public function getK() + { + return $this->k; + } + public function getW() + { + return $this->w; + } + public function getH() + { + return $this->h; + } + public function getlMargin() + { + return $this->lMargin; + } + public function getrMargin() + { + return $this->rMargin; + } + public function gettMargin() + { + return $this->tMargin; + } + public function getbMargin() + { + return $this->bMargin; + } + public function setbMargin($v) + { + $this->bMargin=$v; + } + + /** + * SVG - Convert a SVG Style in PDF Style + * + * @param array $styles SVG Style + * @return string PDF style + * @access public + */ + public function svgSetStyle($styles) + { + // init the PDF style + $style = ''; + + // Style : fill + if ($styles['fill']) { + $this->setFillColorArray($styles['fill']); + $style.= 'F'; + } + + // Style : stroke + if ($styles['stroke'] && $styles['stroke-width']) { + $this->SetDrawColorArray($styles['stroke']); + $this->SetLineWidth($styles['stroke-width']); + $style.= 'D'; + } + + // Style : opacity + if ($styles['fill-opacity']) { + $this->SetAlpha($styles['fill-opacity']); + } + + return $style; + } + + /** + * SVG - make a Rectangle + * + * @param float $x + * @param float $y + * @param float $w + * @param float $h + * @param string $style PDF Style + * @access public + */ + public function svgRect($x, $y, $w, $h, $style) + { + // prepare the 4 corners + $x1=$x; + $x2=$x+$w; + $x3=$x+$w; + $x4=$x; + + $y1=$y; + $y2=$y; + $y3=$y+$h; + $y4=$y+$h; + + // get the Closing operator from the PDF Style + if($style=='F') $op='f'; + elseif($style=='FD' || $style=='DF') $op='B'; + else $op='S'; + + // drawing + $this->_Point($x1, $y1, true); + $this->_Line($x2, $y2, true); + $this->_Line($x3, $y3, true); + $this->_Line($x4, $y4, true); + $this->_Line($x1, $y1, true); + $this->_out($op); + } + + /** + * SVG - make a Line + * + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + * @access public + */ + public function svgLine($x1, $y1, $x2, $y2) + { + // get the Closing operator + $op='S'; + + // drawing + $this->_Point($x1, $y1, true); + $this->_Line($x2, $y2, true); + $this->_out($op); + } + + /** + * SVG - make a Ellipse + * + * @param float $x0 x Center + * @param float $y0 y Center + * @param float $rx x radius + * @param float $ry y radius + * @param string $style PDF Style + * @access public + */ + public function svgEllipse($x0, $y0, $rx, $ry, $style) + { + // get the Closing operator from the PDF Style + if($style=='F') $op='f'; + elseif($style=='FD' || $style=='DF') $op='B'; + else $op='S'; + + // drawing + $this->_Arc($x0, $y0, $rx, $ry, 0, 2*M_PI, true, true, true); + $this->_out($op); + } + + /** + * SVG - make a Advanced Polygone + * + * @param array $actions list of actions + * @param string $style PDF Style + * @access public + */ + public function svgPolygone($actions, $style) + { + // get the Closing operator from the PDF Style + if($style=='F') $op='f'; + elseif($style=='FD' || $style=='DF') $op='B'; + else $op='S'; + + // To save the First action and the last point + $first = array('', 0, 0); + $last = array(0, 0, 0, 0); + + foreach ($actions as $action) { + switch($action[0]) + { + // Start the Path + case 'M': + case 'm': + $first = $action; + $x = $action[1]; $y = $action[2]; $xc = $x; $yc = $y; + $this->_Point($x, $y, true); + break; + + // Close the Path + case 'Z': + case 'z': + $x = $first[1]; $y = $first[2]; $xc = $x; $yc = $y; + $this->_Line($x, $y, true); + break; + + // Make a Line (new point) + case 'L': + $x = $action[1]; $y = $action[2]; $xc = $x; $yc = $y; + $this->_Line($x, $y, true); + break; + + // Make a Line (vector from last point) + case 'l': + $x = $last[0]+$action[1]; $y = $last[1]+$action[2]; $xc = $x; $yc = $y; + $this->_Line($x, $y, true); + break; + + // Make a Horizontal Line (new point) + case 'H': + $x = $action[1]; $y = $last[1]; $xc = $x; $yc = $y; + $this->_Line($x, $y, true); + break; + + // Make a Horisontal Line (vector from last point) + case 'h': + $x = $last[0]+$action[1]; $y = $last[1]; $xc = $x; $yc = $y; + $this->_Line($x, $y, true); + break; + + // Make a Vertical Line (new point) + case 'V': + $x = $last[0]; $y = $action[1]; $xc = $x; $yc = $y; + $this->_Line($x, $y, true); + break; + + // Make a Vertical Line (vector from last point) + case 'v': + $x = $last[0]; $y = $last[1]+$action[1]; $xc = $x; $yc = $y; + $this->_Line($x, $y, true); + break; + + // Make a Arc (new point) + case 'A': + $rx = $action[1]; // rx + $ry = $action[2]; // ry + $a = $action[3]; // deviation angle of the axis X + $l = $action[4]; // large-arc-flag + $s = $action[5]; // sweep-flag + $x1 = $last[0]; // begin x + $y1 = $last[1]; // begin y + $x2 = $action[6]; // final x + $y2 = $action[7]; // final y + + $this->_Arc2($x1, $y1, $x2, $y2, $rx, $ry, $a, $l, $s, true); + $x = $x2; $y = $y2; $xc = $x; $yc = $y; + break; + + // Make a Arc (vector from last point) + case 'a': + $rx = $action[1]; // rx + $ry = $action[2]; // ry + $a = $action[3]; // deviation angle of the axis X + $l = $action[4]; // large-arc-flag + $s = $action[5]; // sweep-flag + $x1 = $last[0]; // begin x + $y1 = $last[1]; // begin y + $x2 = $last[0]+$action[6]; // final x + $y2 = $last[1]+$action[7]; // final y + + $this->_Arc2($x1, $y1, $x2, $y2, $rx, $ry, $a, $l, $s, true); + $x = $x2; $y = $y2; $xc = $x; $yc = $y; + break; + + // Make a Bezier Curve (new point) + case 'C': + $x1 = $action[1]; + $y1 = $action[2]; + $x2 = $action[3]; + $y2 = $action[4]; + $xf = $action[5]; + $yf = $action[6]; + $this->_Curve($x1, $y1, $x2, $y2, $xf, $yf, true); + $x = $xf; $y = $yf; $xc = $x2; $yc = $y2; + break; + + // Make a Bezier Curve (vector from last point) + case 'c': + $x1 = $last[0]+$action[1]; + $y1 = $last[1]+$action[2]; + $x2 = $last[0]+$action[3]; + $y2 = $last[1]+$action[4]; + $xf = $last[0]+$action[5]; + $yf = $last[1]+$action[6]; + $this->_Curve($x1, $y1, $x2, $y2, $xf, $yf, true); + $x = $xf; $y = $yf; $xc = $x2; $yc = $y2; + break; + + // Unknown Path + default: + throw new HTML2PDF_exception(0, 'SVG Path Error : ['.$action[0].'] unkown'); + } + + // save the last point + $last = array($x, $y, $xc, $yc); + } + + // finish the path + $this->_out($op); + } + + /** + * SVG - go to a point + * + * @param float $x + * @param float $y + * @param boolean $trans apply transformation + * @access protected + */ + protected function _Point($x, $y, $trans = false) + { + if ($trans) $this->ptTransform($x, $y); + + $this->_out(sprintf('%.2F %.2F m', $x, $y)); + } + + /** + * SVG - make a line from the last point to (x,y) + * + * @param float $x + * @param float $y + * @param boolean $trans apply transformation + * @access protected + */ + protected function _Line($x, $y, $trans = false) + { + if ($trans) $this->ptTransform($x, $y); + + $this->_out(sprintf('%.2F %.2F l', $x, $y)); + } + + /** + * SVG - make a bezier curve from the last point to (xf,yf), with the 2 direction points (x1,y1) and (x2,y2) + * + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + * @param float $xf + * @param float $yf + * @param boolean $trans apply transformation + * @access protected + */ + protected function _Curve($x1, $y1, $x2, $y2, $xf, $yf, $trans = false) + { + if ($trans) { + $this->ptTransform($x1, $y1); + $this->ptTransform($x2, $y2); + $this->ptTransform($xf, $yf); + } + $this->_out(sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c', $x1, $y1, $x2, $y2, $xf, $yf)); + } + + /** + * SVG - make a arc with Center, Radius, from angleBegin to angleEnd + * + * @param float $xc + * @param float $yc + * @param float $rx + * @param float $ry + * @param float $angleBegin in radians + * @param float $angleEng in radians + * @param boolean $direction + * @param boolean $drawFirst, true => add the first point + * @param boolean $trans apply transformation + * @access protected + */ + protected function _Arc( + $xc, + $yc, + $rx, + $ry, + $angleBegin, + $angleEnd, + $direction = true, + $drawFirst = true, + $trans=false) + { + // if we want the no trigo direction : add 2PI to the begin angle, to invert the direction + if (!$direction) $angleBegin+= M_PI*2.; + + // cut in segment to convert in berize curv + $dt = ($angleEnd - $angleBegin)/self::ARC_NB_SEGMENT; + $dtm = $dt/3; + + // center of the arc + $x0 = $xc; $y0 = $yc; + + // calculing the first point + $t1 = $angleBegin; + $a0 = $x0 + ($rx * cos($t1)); + $b0 = $y0 + ($ry * sin($t1)); + $c0 = -$rx * sin($t1); + $d0 = $ry * cos($t1); + + // if drawFirst => draw the first point + if ($drawFirst) $this->_Point($a0, $b0, $trans); + + // foreach segment + for ($i = 1; $i <= self::ARC_NB_SEGMENT; $i++) { + // calculing the next point + $t1 = ($i * $dt)+$angleBegin; + $a1 = $x0 + ($rx * cos($t1)); + $b1 = $y0 + ($ry * sin($t1)); + $c1 = -$rx * sin($t1); + $d1 = $ry * cos($t1); + + // make the bezier curv + $this->_Curve( + $a0 + ($c0 * $dtm), $b0 + ($d0 * $dtm), + $a1 - ($c1 * $dtm), $b1 - ($d1 * $dtm), + $a1, $b1, + $trans + ); + + // save the point + $a0 = $a1; + $b0 = $b1; + $c0 = $c1; + $d0 = $d1; + } + } + + /** + * SVG - make a arc from Pt1 to Pt2, with Radius + * + * @param float $x1 + * @param float $y1 + * @param float $x2 + * @param float $y2 + * @param float $rx + * @param float $ry + * @param float $angle deviation angle of the axis X + * @param boolean $l large-arc-flag + * @param boolean $s sweep-flag + * @param boolean $trans apply transformation + * @access protected + */ + protected function _Arc2($x1, $y1, $x2, $y2, $rx, $ry, $angle=0., $l=0, $s=0, $trans = false) + { + // array to stock the parameters + $v = array(); + + // the original values + $v['x1'] = $x1; + $v['y1'] = $y1; + $v['x2'] = $x2; + $v['y2'] = $y2; + $v['rx'] = $rx; + $v['ry'] = $ry; + + // rotate with the deviation angle of the axis X + $v['xr1'] = $v['x1']*cos($angle) - $v['y1']*sin($angle); + $v['yr1'] = $v['x1']*sin($angle) + $v['y1']*cos($angle); + $v['xr2'] = $v['x2']*cos($angle) - $v['y2']*sin($angle); + $v['yr2'] = $v['x2']*sin($angle) + $v['y2']*cos($angle); + + // the normalized vector + $v['Xr1'] = $v['xr1']/$v['rx']; + $v['Yr1'] = $v['yr1']/$v['ry']; + $v['Xr2'] = $v['xr2']/$v['rx']; + $v['Yr2'] = $v['yr2']/$v['ry']; + $v['dXr'] = $v['Xr2']-$v['Xr1']; + $v['dYr'] = $v['Yr2']-$v['Yr1']; + $v['D'] = $v['dXr']*$v['dXr'] + $v['dYr']*$v['dYr']; + + // if |vector| is Null, or if |vector| > 2 : impossible to make a arc => Line + if ($v['D']==0 || $v['D']>4) { + $this->_Line($x2, $y2, $trans); + return false; + } + + // convert paramters for make a arc with Center, Radius, from angleBegin to angleEnd + $v['s1'] = array(); + $v['s1']['t'] = sqrt((4.-$v['D'])/$v['D']); + $v['s1']['Xr'] = ($v['Xr1']+$v['Xr2'])/2. + $v['s1']['t']*($v['Yr2']-$v['Yr1'])/2.; + $v['s1']['Yr'] = ($v['Yr1']+$v['Yr2'])/2. + $v['s1']['t']*($v['Xr1']-$v['Xr2'])/2.; + $v['s1']['xr'] = $v['s1']['Xr']*$v['rx']; + $v['s1']['yr'] = $v['s1']['Yr']*$v['ry']; + $v['s1']['x'] = $v['s1']['xr']*cos($angle)+$v['s1']['yr']*sin($angle); + $v['s1']['y'] =-$v['s1']['xr']*sin($angle)+$v['s1']['yr']*cos($angle); + $v['s1']['a1'] = atan2($v['y1']-$v['s1']['y'], $v['x1']-$v['s1']['x']); + $v['s1']['a2'] = atan2($v['y2']-$v['s1']['y'], $v['x2']-$v['s1']['x']); + if ($v['s1']['a1']>$v['s1']['a2']) $v['s1']['a1']-=2*M_PI; + + $v['s2'] = array(); + $v['s2']['t'] = -$v['s1']['t']; + $v['s2']['Xr'] = ($v['Xr1']+$v['Xr2'])/2. + $v['s2']['t']*($v['Yr2']-$v['Yr1'])/2.; + $v['s2']['Yr'] = ($v['Yr1']+$v['Yr2'])/2. + $v['s2']['t']*($v['Xr1']-$v['Xr2'])/2.; + $v['s2']['xr'] = $v['s2']['Xr']*$v['rx']; + $v['s2']['yr'] = $v['s2']['Yr']*$v['ry']; + $v['s2']['x'] = $v['s2']['xr']*cos($angle)+$v['s2']['yr']*sin($angle); + $v['s2']['y'] =-$v['s2']['xr']*sin($angle)+$v['s2']['yr']*cos($angle); + $v['s2']['a1'] = atan2($v['y1']-$v['s2']['y'], $v['x1']-$v['s2']['x']); + $v['s2']['a2'] = atan2($v['y2']-$v['s2']['y'], $v['x2']-$v['s2']['x']); + if ($v['s2']['a1']>$v['s2']['a2']) $v['s2']['a1']-=2*M_PI; + + if (!$l) { + if ($s) { + $xc = $v['s2']['x']; + $yc = $v['s2']['y']; + $a1 = $v['s2']['a1']; + $a2 = $v['s2']['a2']; + $this->_Arc($xc, $yc, $rx, $ry, $a1, $a2, true, false, $trans); + } else { + $xc = $v['s1']['x']; + $yc = $v['s1']['y']; + $a1 = $v['s1']['a1']; + $a2 = $v['s1']['a2']; + $this->_Arc($xc, $yc, $rx, $ry, $a1, $a2, false, false, $trans); + } + } else { + if ($s) { + $xc = $v['s1']['x']; + $yc = $v['s1']['y']; + $a1 = $v['s1']['a1']; + $a2 = $v['s1']['a2']; + $this->_Arc($xc, $yc, $rx, $ry, $a1, $a2, true, false, $trans); + } else { + $xc = $v['s2']['x']; + $yc = $v['s2']['y']; + $a1 = $v['s2']['a1']; + $a2 = $v['s2']['a2']; + $this->_Arc($xc, $yc, $rx, $ry, $a1, $a2, false, false, $trans); + } + } + } + + /** + * SVG - transform the point (reference) + * + * @param float &$x + * @param float &$y + * @param boolean $trans true => convert into PDF unit + * @return boolean + * @access public + */ + public function ptTransform(&$x, &$y, $trans=true) + { + // load the last Transfomation Matrix + $nb = count($this->_transf); + if ($nb) $m = $this->_transf[$nb-1]; + else $m = array(1,0,0,1,0,0); + + // apply the Transformation Matrix + list($x,$y) = array(($x*$m[0]+$y*$m[2]+$m[4]),($x*$m[1]+$y*$m[3]+$m[5])); + + // if true => convert into PDF unit + if ($trans) { + $x = $x*$this->k; + $y = ($this->h-$y)*$this->k; + } + + return true; + } + + /** + * SVG - add a transformation Matric + * + * @param array $n matrix + * @access public + */ + public function doTransform($n = null) + { + // get the last Transformation Matrix + $nb = count($this->_transf); + if ($nb) $m = $this->_transf[$nb-1]; + else $m = array(1,0,0,1,0,0); + + // if no transform, get the Identity Matrix + if (!$n) $n = array(1,0,0,1,0,0); + + // create the new Transformation Matrix + $this->_transf[] = array( + $m[0]*$n[0]+$m[2]*$n[1], + $m[1]*$n[0]+$m[3]*$n[1], + $m[0]*$n[2]+$m[2]*$n[3], + $m[1]*$n[2]+$m[3]*$n[3], + $m[0]*$n[4]+$m[2]*$n[5]+$m[4], + $m[1]*$n[4]+$m[3]*$n[5]+$m[5] + ); + } + + /** + * SVG - remove a transformation Matric + * + * @access public + */ + public function undoTransform() + { + array_pop($this->_transf); + } + + /** + * Convert a HTML2PDF barcode in a TCPDF barcode + * + * @param string $code code to print + * @param string $type type of barcode (see tcpdf/barcodes.php for supported formats) + * @param int $x x position in user units + * @param int $y y position in user units + * @param int $w width in user units + * @param int $h height in user units + * @param int $labelFontsize of the Test Label. If false : no Label + * @param array $color color of the foreground + * @access public + */ + public function myBarcode($code, $type, $x, $y, $w, $h, $labelFontsize, $color) + { + // the style of the barcode + $style = array( + 'position' => 'S', + 'text' => ($labelFontsize ? true : false), + 'fgcolor' => $color, + 'bgcolor' => false, + ); + + // build the barcode + $this->write1DBarcode($code, $type, $x, $y, $w, $h, '', $style, 'N'); + + // it Label => add the FontSize to the height + if ($labelFontsize) $h+= ($labelFontsize); + + // return the size of the barcode + return array($w, $h); + } + + /** + * create a automatic Index on a page + * + * @param html2pdf $obj parent object + * @param string $titre Title of the Index Page + * @param integer $sizeTitle Font size for hthe Title + * @param integer $sizeBookmark Font size for the bookmarks + * @param boolean $bookmarkTitle Bookmark the Title + * @param boolean $displayPage Display the page number for each bookmark + * @param integer $page draw the automatic Index on a specific Page. if null => add a page at the end + * @param string $fontName FontName to use + * @access public + */ + public function createIndex( + &$obj, + $titre = 'Index', + $sizeTitle = 20, + $sizeBookmark = 15, + $bookmarkTitle = true, + $displayPage = true, + $page = null, + $fontName = 'helvetica') + { + // bookmark the Title if wanted + if ($bookmarkTitle) $this->Bookmark($titre, 0, -1); + + // display the Title with the good Font size + $this->SetFont($fontName, '', $sizeTitle); + $this->Cell(0, 5, $titre, 0, 1, 'C'); + + // set the good Font size for the bookmarks + $this->SetFont($fontName, '', $sizeBookmark); + $this->Ln(10); + + // get the number of bookmarks + $size=sizeof($this->outlines); + + // get the size of the "P. xx" cell + $pageCellSize=$this->GetStringWidth('p. '.$this->outlines[$size-1]['p'])+2; + + // Foreach bookmark + for ($i=0;$i<$size;$i++) { + // if we need a new page => add a new page + if ($this->getY()+$this->FontSize>=($this->h - $this->bMargin)) { + $obj->_INDEX_NewPage($page); + $this->SetFont($fontName, '', $sizeBookmark); + } + + // Offset of the current level + $level=$this->outlines[$i]['l']; + if($level>0) $this->Cell($level*8); + + // Caption (cut to fit on the width page) + $str=$this->outlines[$i]['t']; + $strsize=$this->GetStringWidth($str); + $availableSize=$this->w-$this->lMargin-$this->rMargin-$pageCellSize-($level*8)-4; + while ($strsize>=$availableSize) { + $str=substr($str, 0, -1); + $strsize=$this->GetStringWidth($str); + } + + // if we want to display the page nmber + if ($displayPage) { + // display the Bookmark Caption + $this->Cell($strsize+2, $this->FontSize+2, $str); + + //Filling dots + $w=$this->w-$this->lMargin-$this->rMargin-$pageCellSize-($level*8)-($strsize+2); + $nb=$w/$this->GetStringWidth('.'); + $dots=str_repeat('.', $nb); + $this->Cell($w, $this->FontSize+2, $dots, 0, 0, 'R'); + + //Page number + $this->Cell($pageCellSize, $this->FontSize+2, 'p. '.$this->outlines[$i]['p'], 0, 1, 'R'); + } else { + // display the Bookmark Caption + $this->Cell($strsize+2, $this->FontSize+2, $str, 0, 1); + } + } + } + + /** + * Returns the string alias used for the total number of pages. + * + * @access public + * @return string; + * @see TCPDF::getAliasNbPages(), TCPDF::getPageGroupAlias() + */ + public function getMyAliasNbPages() + { + if ($this->_myLastPageGroupNb==0) { + return $this->getAliasNbPages(); + } else { + $old = $this->currpagegroup; + $this->currpagegroup = '{nb'.$this->_myLastPageGroupNb.'}'; + $new = $this->getPageGroupAlias(); + $this->currpagegroup = $old; + + return $new; + } + } + + /** + * Returns the current page number. + * + * @access public + * @param integer $page + * @return integer; + */ + public function getMyNumPage($page=null) + { + if ($page===null) { + $page = $this->page; + } + + if ($this->_myLastPageGroupNb==0) { + return $page; + } else { + return $page-$this->_myLastPageGroup; + } + } + + /** + * Start a new group of pages + * + * @access public + * @return integer; + * @see tcpdf::startPageGroup + */ + public function myStartPageGroup() + { + $this->_myLastPageGroup = $this->page-1; + $this->_myLastPageGroupNb++; + } + + /** + * get $_myLastPageGroup; + * + * @access public + * @return integer $_myLastPageGroup; + */ + public function getMyLastPageGroup() + { + return $this->_myLastPageGroup; + } + + /** + * set $_myLastPageGroup; + * + * @access public + * @param integer $myLastPageGroup; + */ + public function setMyLastPageGroup($myLastPageGroup) + { + $this->_myLastPageGroup = $myLastPageGroup; + } + + /** + * get $_myLastPageGroupNb; + * + * @access public + * @return integer $_myLastPageGroupNb; + */ + public function getMyLastPageGroupNb() + { + return $this->_myLastPageGroupNb; + } + + /** + * set $_myLastPageGroupNb; + * + * @access public + * @param integer $myLastPageGroupNb; + */ + public function setMyLastPageGroupNb($myLastPageGroupNb) + { + $this->_myLastPageGroupNb = $myLastPageGroupNb; + } +} diff --git a/assets/html2pdf/_class/parsingCss.class.php b/assets/html2pdf/_class/parsingCss.class.php new file mode 100644 index 0000000..eaca4d8 --- /dev/null +++ b/assets/html2pdf/_class/parsingCss.class.php @@ -0,0 +1,1812 @@ +<?php +/** + * HTML2PDF Librairy - parsingCss class + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * @version 4.03 + */ + +class HTML2PDF_parsingCss +{ + /** + * reference to the pdf object + * @var TCPDF + */ + protected $_pdf = null; + + protected $_htmlColor = array(); // list of the HTML colors + protected $_onlyLeft = false; // flag if we are in a sub html => only "text-align:left" is used + protected $_defaultFont = null; // default font to use if the asked font does not exist + + public $value = array(); // current values + public $css = array(); // css values + public $cssKeys = array(); // css key, for the execution order + public $table = array(); // level history + + /** + * Constructor + * + * @param &HTML2PDF_myPdf reference to the PDF $object + * @access public + */ + public function __construct(&$pdf) + { + $this->_init(); + $this->setPdfParent($pdf); + } + + /** + * Set the HTML2PDF parent object + * + * @param &HTML2PDF reference to the HTML2PDF parent $object + * @access public + */ + public function setPdfParent(&$pdf) + { + $this->_pdf = &$pdf; + } + + /** + * Inform that we want only "test-align:left" because we are in a sub HTML + * + * @access public + */ + public function setOnlyLeft() + { + $this->value['text-align'] = 'left'; + $this->_onlyLeft = true; + } + + /** + * Get the vales of the parent, if exist + * + * @return array CSS values + * @access public + */ + public function getOldValues() + { + return isset($this->table[count($this->table)-1]) ? $this->table[count($this->table)-1] : $this->value; + } + + /** + * define the Default Font to use, if the font does not exist, or if no font asked + * + * @param string default font-family. If null : Arial for no font asked, and error fot ont does not exist + * @return string old default font-family + * @access public + */ + public function setDefaultFont($default = null) + { + $old = $this->_defaultFont; + $this->_defaultFont = $default; + if ($default) $this->value['font-family'] = $default; + return $old; + } + + /** + * Init the object + * + * @access protected + */ + protected function _init() + { + // get the Web Colors from TCPDF + require(K_PATH_MAIN.'htmlcolors.php'); + $this->_htmlColor = $webcolor; + + // init the Style + $this->table = array(); + $this->value = array(); + $this->initStyle(); + + // Init the styles without legacy + $this->resetStyle(); + } + + /** + * Init the CSS Style + * + * @access public + */ + public function initStyle() + { + $this->value['id_tag'] = 'body'; // tag name + $this->value['id_name'] = null; // tag - attribute name + $this->value['id_id'] = null; // tag - attribute id + $this->value['id_class'] = null; // tag - attribute class + $this->value['id_lst'] = array('*'); // tag - list of legacy + $this->value['mini-size'] = 1.; // specific size report for sup, sub + $this->value['mini-decal'] = 0; // specific position report for sup, sub + $this->value['font-family'] = 'Arial'; + $this->value['font-bold'] = false; + $this->value['font-italic'] = false; + $this->value['font-underline'] = false; + $this->value['font-overline'] = false; + $this->value['font-linethrough'] = false; + $this->value['text-transform'] = 'none'; + $this->value['font-size'] = $this->convertToMM('10pt'); + $this->value['text-indent'] = 0; + $this->value['text-align'] = 'left'; + $this->value['vertical-align'] = 'middle'; + $this->value['line-height'] = 'normal'; + + $this->value['position'] = null; + $this->value['x'] = null; + $this->value['y'] = null; + $this->value['width'] = 0; + $this->value['height'] = 0; + $this->value['top'] = null; + $this->value['right'] = null; + $this->value['bottom'] = null; + $this->value['left'] = null; + $this->value['float'] = null; + $this->value['display'] = null; + $this->value['rotate'] = null; + $this->value['overflow'] = 'visible'; + + $this->value['color'] = array(0, 0, 0); + $this->value['background'] = array('color' => null, 'image' => null, 'position' => null, 'repeat' => null); + $this->value['border'] = array(); + $this->value['padding'] = array(); + $this->value['margin'] = array(); + $this->value['margin-auto'] = false; + + $this->value['list-style-type'] = ''; + $this->value['list-style-image'] = ''; + + $this->value['xc'] = null; + $this->value['yc'] = null; + } + + /** + * Init the CSS Style without legacy + * + * @param string tag name + * @access public + */ + public function resetStyle($tagName = '') + { + // prepare somme values + $border = $this->readBorder('solid 1px #000000'); + $units = array( + '1px' => $this->convertToMM('1px'), + '5px' => $this->convertToMM('5px'), + ); + + + // prepare the Collapse attribute + $collapse = isset($this->value['border']['collapse']) ? $this->value['border']['collapse'] : false; + if (!in_array($tagName, array('tr', 'td', 'th', 'thead', 'tbody', 'tfoot'))) $collapse = false; + + // set the global css values + $this->value['position'] = null; + $this->value['x'] = null; + $this->value['y'] = null; + $this->value['width'] = 0; + $this->value['height'] = 0; + $this->value['top'] = null; + $this->value['right'] = null; + $this->value['bottom'] = null; + $this->value['left'] = null; + $this->value['float'] = null; + $this->value['display'] = null; + $this->value['rotate'] = null; + $this->value['overflow'] = 'visible'; + $this->value['background'] = array('color' => null, 'image' => null, 'position' => null, 'repeat' => null); + $this->value['border'] = array( + 't' => $this->readBorder('none'), + 'r' => $this->readBorder('none'), + 'b' => $this->readBorder('none'), + 'l' => $this->readBorder('none'), + 'radius' => array( + 'tl' => array(0, 0), + 'tr' => array(0, 0), + 'br' => array(0, 0), + 'bl' => array(0, 0) + ), + 'collapse' => $collapse, + ); + + // specific values for some tags + if (!in_array($tagName, array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))) { + $this->value['margin'] = array('t'=>0,'r'=>0,'b'=>0,'l'=>0); + } + + if (in_array($tagName, array('input', 'select', 'textarea'))) { + $this->value['border']['t'] = null; + $this->value['border']['r'] = null; + $this->value['border']['b'] = null; + $this->value['border']['l'] = null; + } + + if ($tagName=='p') { + $this->value['margin']['t'] = null; + $this->value['margin']['b'] = null; + } + if ($tagName=='blockquote') { + $this->value['margin']['t'] = 3; + $this->value['margin']['r'] = 3; + $this->value['margin']['b'] = 3; + $this->value['margin']['l'] = 6; + } + $this->value['margin-auto'] = false; + + if (in_array($tagName, array('blockquote', 'div', 'fieldset'))) { + $this->value['vertical-align'] = 'top'; + } + + if (in_array($tagName, array('fieldset', 'legend'))) { + $this->value['border'] = array( + 't' => $border, + 'r' => $border, + 'b' => $border, + 'l' => $border, + 'radius' => array( + 'tl' => array($units['5px'], $units['5px']), + 'tr' => array($units['5px'], $units['5px']), + 'br' => array($units['5px'], $units['5px']), + 'bl' => array($units['5px'], $units['5px']) + ), + 'collapse' => false, + ); + } + + if (in_array($tagName, array('ul', 'li'))) { + $this->value['list-style-type'] = ''; + $this->value['list-style-image'] = ''; + } + + if (!in_array($tagName, array('tr', 'td'))) { + $this->value['padding'] = array( + 't' => 0, + 'r' => 0, + 'b' => 0, + 'l' => 0 + ); + } else { + $this->value['padding'] = array( + 't' => $units['1px'], + 'r' => $units['1px'], + 'b' => $units['1px'], + 'l' => $units['1px'] + ); + } + + if ($tagName=='hr') { + $this->value['border'] = array( + 't' => $border, + 'r' => $border, + 'b' => $border, + 'l' => $border, + 'radius' => array( + 'tl' => array(0, 0), + 'tr' => array(0, 0), + 'br' => array(0, 0), + 'bl' => array(0, 0) + ), + 'collapse' => false, + ); + $this->convertBackground('#FFFFFF', $this->value['background']); + } + + $this->value['xc'] = null; + $this->value['yc'] = null; + } + + /** + * Init the PDF Font + * + * @access public + */ + public function fontSet() + { + $family = strtolower($this->value['font-family']); + + $b = ($this->value['font-bold'] ? 'B' : ''); + $i = ($this->value['font-italic'] ? 'I' : ''); + $u = ($this->value['font-underline'] ? 'U' : ''); + $d = ($this->value['font-linethrough'] ? 'D' : ''); + $o = ($this->value['font-overline'] ? 'O' : ''); + + // font style + $style = $b.$i; + + if ($this->_defaultFont) { + if($family=='arial') + $family='helvetica'; + elseif($family=='symbol' || $family=='zapfdingbats') + $style=''; + + $fontkey = $family.$style; + if (!$this->_pdf->isLoadedFont($fontkey)) + $family = $this->_defaultFont; + } + + if($family=='arial') + $family='helvetica'; + elseif($family=='symbol' || $family=='zapfdingbats') + $style=''; + + // complete style + $style.= $u.$d.$o; + + // size : mm => pt + $size = $this->value['font-size']; + $size = 72 * $size / 25.4; + + // apply the font + $this->_pdf->SetFont($family, $style, $this->value['mini-size']*$size); + $this->_pdf->setTextColorArray($this->value['color']); + if ($this->value['background']['color']) + $this->_pdf->setFillColorArray($this->value['background']['color']); + else + $this->_pdf->setFillColor(255); + } + + /** + * add a level in the CSS history + * + * @access public + */ + public function save() + { + array_push($this->table, $this->value); + } + + /** + * remove a level in the CSS history + * + * @access public + */ + public function load() + { + if (count($this->table)) { + $this->value = array_pop($this->table); + } + } + + /** + * restore the Y positiony (used after a span) + * + * @access public + */ + public function restorePosition() + { + if ($this->value['y']==$this->_pdf->getY()) $this->_pdf->setY($this->value['yc'], false); + } + + /** + * set the New position for the current Tag + * + * @access public + */ + public function setPosition() + { + // get the current position + $currentX = $this->_pdf->getX(); + $currentY = $this->_pdf->getY(); + + // save it + $this->value['xc'] = $currentX; + $this->value['yc'] = $currentY; + + if ($this->value['position']=='relative' || $this->value['position']=='absolute') { + if ($this->value['right']!==null) { + $x = $this->getLastWidth(true) - $this->value['right'] - $this->value['width']; + if ($this->value['margin']['r']) $x-= $this->value['margin']['r']; + } else { + $x = $this->value['left']; + if ($this->value['margin']['l']) $x+= $this->value['margin']['l']; + } + + if ($this->value['bottom']!==null) { + $y = $this->getLastHeight(true) - $this->value['bottom'] - $this->value['height']; + if ($this->value['margin']['b']) $y-= $this->value['margin']['b']; + } else { + $y = $this->value['top']; + if ($this->value['margin']['t']) $y+= $this->value['margin']['t']; + } + + if ($this->value['position']=='relative') { + $this->value['x'] = $currentX + $x; + $this->value['y'] = $currentY + $y; + } else { + $this->value['x'] = $this->_getLastAbsoluteX()+$x; + $this->value['y'] = $this->_getLastAbsoluteY()+$y; + } + } else { + $this->value['x'] = $currentX; + $this->value['y'] = $currentY; + if ($this->value['margin']['l']) $this->value['x']+= $this->value['margin']['l']; + if ($this->value['margin']['t']) $this->value['y']+= $this->value['margin']['t']; + } + + // save the new position + $this->_pdf->setXY($this->value['x'], $this->value['y']); + } + + /** + * Analise the CSS style to convert it into Form style + * + * @access public + * @param array styles + */ + public function getFormStyle() + { + $prop = array(); + + $prop['alignment'] = $this->value['text-align']; + + if (isset($this->value['background']['color']) && is_array($this->value['background']['color'])) { + $prop['fillColor'] = $this->value['background']['color']; + } + + if (isset($this->value['border']['t']['color'])) { + $prop['strokeColor'] = $this->value['border']['t']['color']; + } + + if (isset($this->value['border']['t']['width'])) { + $prop['lineWidth'] = $this->value['border']['t']['width']; + } + + if (isset($this->value['border']['t']['type'])) { + $prop['borderStyle'] = $this->value['border']['t']['type']; + } + + if (!empty($this->value['color'])) { + $prop['textColor'] = $this->value['color']; + } + + if (!empty($this->value['font-size'])) { + $prop['textSize'] = $this->value['font-size']; + } + + return $prop; + } + + /** + * Analise the CSS style to convert it into SVG style + * + * @access public + * @param string tag name + * @param array styles + */ + public function getSvgStyle($tagName, &$param) + { + // prepare + $tagName = strtolower($tagName); + $id = isset($param['id']) ? strtolower(trim($param['id'])) : null; if (!$id) $id = null; + $name = isset($param['name']) ? strtolower(trim($param['name'])) : null; if (!$name) $name = null; + + // read the class attribute + $class = array(); + $tmp = isset($param['class']) ? strtolower(trim($param['class'])) : ''; + $tmp = explode(' ', $tmp); + foreach ($tmp as $k => $v) { + $v = trim($v); + if ($v) $class[] = $v; + } + + // identify the tag, and the direct styles + $this->value['id_tag'] = $tagName; + $this->value['id_name'] = $name; + $this->value['id_id'] = $id; + $this->value['id_class'] = $class; + $this->value['id_lst'] = array(); + $this->value['id_lst'][] = '*'; + $this->value['id_lst'][] = $tagName; + if (!isset($this->value['svg'])) { + $this->value['svg'] = array( + 'stroke' => null, + 'stroke-width' => $this->convertToMM('1pt'), + 'fill' => null, + 'fill-opacity' => null, + ); + } + + if (count($class)) { + foreach ($class as $v) { + $this->value['id_lst'][] = '*.'.$v; + $this->value['id_lst'][] = '.'.$v; + $this->value['id_lst'][] = $tagName.'.'.$v; + } + } + if ($id) { + $this->value['id_lst'][] = '*#'.$id; + $this->value['id_lst'][] = '#'.$id; + $this->value['id_lst'][] = $tagName.'#'.$id; + } + + // CSS style + $styles = $this->_getFromCSS(); + + // adding the style from the tag + $styles = array_merge($styles, $param['style']); + + if (isset($styles['stroke'])) $this->value['svg']['stroke'] = $this->convertToColor($styles['stroke'], $res); + if (isset($styles['stroke-width'])) $this->value['svg']['stroke-width'] = $this->convertToMM($styles['stroke-width']); + if (isset($styles['fill'])) $this->value['svg']['fill'] = $this->convertToColor($styles['fill'], $res); + if (isset($styles['fill-opacity'])) $this->value['svg']['fill-opacity'] = 1.*$styles['fill-opacity']; + + return $this->value['svg']; + } + + /** + * analyse the css properties from the HTML parsing + * + * @access public + * @param string $tagName + * @param array $param + * @param array $legacy + */ + public function analyse($tagName, &$param, $legacy = null) + { + // prepare the informations + $tagName = strtolower($tagName); + $id = isset($param['id']) ? strtolower(trim($param['id'])) : null; if (!$id) $id = null; + $name = isset($param['name']) ? strtolower(trim($param['name'])) : null; if (!$name) $name = null; + + // get the class names to use + $class = array(); + $tmp = isset($param['class']) ? strtolower(trim($param['class'])) : ''; + $tmp = explode(' ', $tmp); + foreach ($tmp as $k => $v) { + $v = trim($v); + if ($v) $class[] = $v; + } + + // prepare the values, and the list of css tags to identify + $this->value['id_tag'] = $tagName; + $this->value['id_name'] = $name; + $this->value['id_id'] = $id; + $this->value['id_class'] = $class; + $this->value['id_lst'] = array(); + $this->value['id_lst'][] = '*'; + $this->value['id_lst'][] = $tagName; + if (count($class)) { + foreach ($class as $v) { + $this->value['id_lst'][] = '*.'.$v; + $this->value['id_lst'][] = '.'.$v; + $this->value['id_lst'][] = $tagName.'.'.$v; + } + } + if ($id) { + $this->value['id_lst'][] = '*#'.$id; + $this->value['id_lst'][] = '#'.$id; + $this->value['id_lst'][] = $tagName.'#'.$id; + } + + // get the css styles from class + $styles = $this->_getFromCSS(); + + // merge with the css styles from tag + $styles = array_merge($styles, $param['style']); + if (isset($param['allwidth']) && !isset($styles['width'])) $styles['width'] = '100%'; + + // reset some styles, depending on the tag name + $this->resetStyle($tagName); + + // add the legacy values + if ($legacy) { + foreach ($legacy as $legacyName => $legacyValue) { + if (is_array($legacyValue)) { + foreach($legacyValue as $legacy2Name => $legacy2Value) + $this->value[$legacyName][$legacy2Name] = $legacy2Value; + } else { + $this->value[$legacyName] = $legacyValue; + } + } + } + + // some flags + $correctWidth = false; + $noWidth = true; + + // read all the css styles + foreach ($styles as $nom => $val) { + switch($nom) + { + case 'font-family': + $val = explode(',', $val); + $val = trim($val[0]); + if ($val) $this->value['font-family'] = $val; + break; + + case 'font-weight': + $this->value['font-bold'] = ($val=='bold'); + break; + + case 'font-style': + $this->value['font-italic'] = ($val=='italic'); + break; + + case 'text-decoration': + $val = explode(' ', $val); + $this->value['font-underline'] = (in_array('underline', $val)); + $this->value['font-overline'] = (in_array('overline', $val)); + $this->value['font-linethrough'] = (in_array('line-through', $val)); + break; + + case 'text-indent': + $this->value['text-indent'] = $this->convertToMM($val); + break; + + case 'text-transform': + if (!in_array($val, array('none', 'capitalize', 'uppercase', 'lowercase'))) $val = 'none'; + $this->value['text-transform'] = $val; + break; + + case 'font-size': + $val = $this->convertToMM($val, $this->value['font-size']); + if ($val) $this->value['font-size'] = $val; + break; + + case 'color': + $res = null; + $this->value['color'] = $this->convertToColor($val, $res); + if ($tagName=='hr') { + $this->value['border']['l']['color'] = $this->value['color']; + $this->value['border']['t']['color'] = $this->value['color']; + $this->value['border']['r']['color'] = $this->value['color']; + $this->value['border']['b']['color'] = $this->value['color']; + } + break; + + case 'text-align': + $val = strtolower($val); + if (!in_array($val, array('left', 'right', 'center', 'justify', 'li_right'))) $val = 'left'; + $this->value['text-align'] = $val; + break; + + case 'vertical-align': + $this->value['vertical-align'] = $val; + break; + + case 'width': + $this->value['width'] = $this->convertToMM($val, $this->getLastWidth()); + if ($this->value['width'] && substr($val, -1)=='%') $correctWidth=true; + $noWidth = false; + break; + + case 'height': + $this->value['height'] = $this->convertToMM($val, $this->getLastHeight()); + break; + + case 'line-height': + if (preg_match('/^[0-9\.]+$/isU', $val)) $val = floor($val*100).'%'; + $this->value['line-height'] = $val; + break; + + case 'rotate': + if (!in_array($val, array(0, -90, 90, 180, 270, -180, -270))) $val = null; + if ($val<0) $val+= 360; + $this->value['rotate'] = $val; + break; + + case 'overflow': + if (!in_array($val, array('visible', 'hidden'))) $val = 'visible'; + $this->value['overflow'] = $val; + break; + + case 'padding': + $val = explode(' ', $val); + foreach ($val as $k => $v) { + $v = trim($v); + if ($v!='') { + $val[$k] = $v; + } else { + unset($val[$k]); + } + } + $val = array_values($val); + $this->_duplicateBorder($val); + $this->value['padding']['t'] = $this->convertToMM($val[0], 0); + $this->value['padding']['r'] = $this->convertToMM($val[1], 0); + $this->value['padding']['b'] = $this->convertToMM($val[2], 0); + $this->value['padding']['l'] = $this->convertToMM($val[3], 0); + break; + + case 'padding-top': + $this->value['padding']['t'] = $this->convertToMM($val, 0); + break; + + case 'padding-right': + $this->value['padding']['r'] = $this->convertToMM($val, 0); + break; + + case 'padding-bottom': + $this->value['padding']['b'] = $this->convertToMM($val, 0); + break; + + case 'padding-left': + $this->value['padding']['l'] = $this->convertToMM($val, 0); + break; + + case 'margin': + if ($val=='auto') { + $this->value['margin-auto'] = true; + break; + } + $val = explode(' ', $val); + foreach ($val as $k => $v) { + $v = trim($v); + if ($v!='') { + $val[$k] = $v; + } else { + unset($val[$k]); + } + } + $val = array_values($val); + $this->_duplicateBorder($val); + $this->value['margin']['t'] = $this->convertToMM($val[0], 0); + $this->value['margin']['r'] = $this->convertToMM($val[1], 0); + $this->value['margin']['b'] = $this->convertToMM($val[2], 0); + $this->value['margin']['l'] = $this->convertToMM($val[3], 0); + break; + + case 'margin-top': + $this->value['margin']['t'] = $this->convertToMM($val, 0); + break; + + case 'margin-right': + $this->value['margin']['r'] = $this->convertToMM($val, 0); + break; + + case 'margin-bottom': + $this->value['margin']['b'] = $this->convertToMM($val, 0); + break; + + case 'margin-left': + $this->value['margin']['l'] = $this->convertToMM($val, 0); + break; + + case 'border': + $val = $this->readBorder($val); + $this->value['border']['t'] = $val; + $this->value['border']['r'] = $val; + $this->value['border']['b'] = $val; + $this->value['border']['l'] = $val; + break; + + case 'border-style': + $val = explode(' ', $val); + foreach ($val as $valK => $valV) { + if (!in_array($valV, array('solid', 'dotted', 'dashed'))) { + $val[$valK] = null; + } + } + $this->_duplicateBorder($val); + if ($val[0]) $this->value['border']['t']['type'] = $val[0]; + if ($val[1]) $this->value['border']['r']['type'] = $val[1]; + if ($val[2]) $this->value['border']['b']['type'] = $val[2]; + if ($val[3]) $this->value['border']['l']['type'] = $val[3]; + break; + + case 'border-top-style': + if (in_array($val, array('solid', 'dotted', 'dashed'))) { + $this->value['border']['t']['type'] = $val; + } + break; + + case 'border-right-style': + if (in_array($val, array('solid', 'dotted', 'dashed'))) { + $this->value['border']['r']['type'] = $val; + } + break; + + case 'border-bottom-style': + if (in_array($val, array('solid', 'dotted', 'dashed'))) { + $this->value['border']['b']['type'] = $val; + } + break; + + case 'border-left-style': + if (in_array($val, array('solid', 'dotted', 'dashed'))) + $this->value['border']['l']['type'] = $val; + break; + + case 'border-color': + $res = false; + $val = preg_replace('/,[\s]+/', ',', $val); + $val = explode(' ', $val); + foreach ($val as $valK => $valV) { + $val[$valK] = $this->convertToColor($valV, $res); + if (!$res) { + $val[$valK] = null; + } + } + $this->_duplicateBorder($val); + if (is_array($val[0])) $this->value['border']['t']['color'] = $val[0]; + if (is_array($val[1])) $this->value['border']['r']['color'] = $val[1]; + if (is_array($val[2])) $this->value['border']['b']['color'] = $val[2]; + if (is_array($val[3])) $this->value['border']['l']['color'] = $val[3]; + + break; + + case 'border-top-color': + $res = false; + $val = $this->convertToColor($val, $res); + if ($res) $this->value['border']['t']['color'] = $val; + break; + + case 'border-right-color': + $res = false; + $val = $this->convertToColor($val, $res); + if ($res) $this->value['border']['r']['color'] = $val; + break; + + case 'border-bottom-color': + $res = false; + $val = $this->convertToColor($val, $res); + if ($res) $this->value['border']['b']['color'] = $val; + break; + + case 'border-left-color': + $res = false; + $val = $this->convertToColor($val, $res); + if ($res) $this->value['border']['l']['color'] = $val; + break; + + case 'border-width': + $val = explode(' ', $val); + foreach ($val as $valK => $valV) { + $val[$valK] = $this->convertToMM($valV, 0); + } + $this->_duplicateBorder($val); + if ($val[0]) $this->value['border']['t']['width'] = $val[0]; + if ($val[1]) $this->value['border']['r']['width'] = $val[1]; + if ($val[2]) $this->value['border']['b']['width'] = $val[2]; + if ($val[3]) $this->value['border']['l']['width'] = $val[3]; + break; + + case 'border-top-width': + $val = $this->convertToMM($val, 0); + if ($val) $this->value['border']['t']['width'] = $val; + break; + + case 'border-right-width': + $val = $this->convertToMM($val, 0); + if ($val) $this->value['border']['r']['width'] = $val; + break; + + case 'border-bottom-width': + $val = $this->convertToMM($val, 0); + if ($val) $this->value['border']['b']['width'] = $val; + break; + + case 'border-left-width': + $val = $this->convertToMM($val, 0); + if ($val) $this->value['border']['l']['width'] = $val; + break; + + case 'border-collapse': + if ($tagName=='table') $this->value['border']['collapse'] = ($val=='collapse'); + break; + + case 'border-radius': + $val = explode('/', $val); + if (count($val)>2) { + break; + } + $valH = $this->convertToRadius(trim($val[0])); + if (count($valH)<1 || count($valH)>4) { + break; + } + if (!isset($valH[1])) $valH[1] = $valH[0]; + if (!isset($valH[2])) $valH = array($valH[0], $valH[0], $valH[1], $valH[1]); + if (!isset($valH[3])) $valH[3] = $valH[1]; + if (isset($val[1])) { + $valV = $this->convertToRadius(trim($val[1])); + if (count($valV)<1 || count($valV)>4) { + break; + } + if (!isset($valV[1])) $valV[1] = $valV[0]; + if (!isset($valV[2])) $valV = array($valV[0], $valV[0], $valV[1], $valV[1]); + if (!isset($valV[3])) $valV[3] = $valV[1]; + } else { + $valV = $valH; + } + $this->value['border']['radius'] = array( + 'tl' => array($valH[0], $valV[0]), + 'tr' => array($valH[1], $valV[1]), + 'br' => array($valH[2], $valV[2]), + 'bl' => array($valH[3], $valV[3]) + ); + break; + + case 'border-top-left-radius': + $val = $this->convertToRadius($val); + if (count($val)<1 || count($val)>2) { + break; + } + $this->value['border']['radius']['tl'] = array($val[0], isset($val[1]) ? $val[1] : $val[0]); + break; + + case 'border-top-right-radius': + $val = $this->convertToRadius($val); + if (count($val)<1 || count($val)>2) { + break; + } + $this->value['border']['radius']['tr'] = array($val[0], isset($val[1]) ? $val[1] : $val[0]); + break; + + case 'border-bottom-right-radius': + $val = $this->convertToRadius($val); + if (count($val)<1 || count($val)>2) { + break; + } + $this->value['border']['radius']['br'] = array($val[0], isset($val[1]) ? $val[1] : $val[0]); + break; + + case 'border-bottom-left-radius': + $val = $this->convertToRadius($val); + if (count($val)<1 || count($val)>2) { + break; + } + $this->value['border']['radius']['bl'] = array($val[0], isset($val[1]) ? $val[1] : $val[0]); + break; + + case 'border-top': + $this->value['border']['t'] = $this->readBorder($val); + break; + + case 'border-right': + $this->value['border']['r'] = $this->readBorder($val); + break; + + case 'border-bottom': + $this->value['border']['b'] = $this->readBorder($val); + break; + + case 'border-left': + $this->value['border']['l'] = $this->readBorder($val); + break; + + case 'background-color': + $this->value['background']['color'] = $this->convertBackgroundColor($val); + break; + + case 'background-image': + $this->value['background']['image'] = $this->convertBackgroundImage($val); + break; + + case 'background-position': + $res = null; + $this->value['background']['position'] = $this->convertBackgroundPosition($val, $res); + break; + + case 'background-repeat': + $this->value['background']['repeat'] = $this->convertBackgroundRepeat($val); + break; + + case 'background': + $this->convertBackground($val, $this->value['background']); + break; + + case 'position': + if ($val=='absolute') $this->value['position'] = 'absolute'; + else if ($val=='relative') $this->value['position'] = 'relative'; + else $this->value['position'] = null; + break; + + case 'float': + if ($val=='left') $this->value['float'] = 'left'; + else if ($val=='right') $this->value['float'] = 'right'; + else $this->value['float'] = null; + break; + + case 'display': + if ($val=='inline') $this->value['display'] = 'inline'; + else if ($val=='block') $this->value['display'] = 'block'; + else if ($val=='none') $this->value['display'] = 'none'; + else $this->value['display'] = null; + break; + + case 'top': + case 'bottom': + case 'left': + case 'right': + $this->value[$nom] = $val; + break; + + case 'list-style': + case 'list-style-type': + case 'list-style-image': + if ($nom=='list-style') $nom = 'list-style-type'; + $this->value[$nom] = $val; + break; + + default: + break; + } + } + + $return = true; + + // only for P tag + if ($this->value['margin']['t']===null) $this->value['margin']['t'] = $this->value['font-size']; + if ($this->value['margin']['b']===null) $this->value['margin']['b'] = $this->value['font-size']; + + // force the text align to left, if asked by html2pdf + if ($this->_onlyLeft) $this->value['text-align'] = 'left'; + + // correction on the width (quick box) + if ($noWidth && in_array($tagName, array('div', 'blockquote', 'fieldset')) && $this->value['position']!='absolute') { + $this->value['width'] = $this->getLastWidth(); + $this->value['width']-= $this->value['margin']['l'] + $this->value['margin']['r']; + } else { + if ($correctWidth) { + if (!in_array($tagName, array('table', 'div', 'blockquote', 'fieldset', 'hr'))) { + $this->value['width']-= $this->value['padding']['l'] + $this->value['padding']['r']; + $this->value['width']-= $this->value['border']['l']['width'] + $this->value['border']['r']['width']; + } + if (in_array($tagName, array('th', 'td'))) { + $this->value['width']-= $this->convertToMM(isset($param['cellspacing']) ? $param['cellspacing'] : '2px'); + $return = false; + } + if ($this->value['width']<0) $this->value['width']=0; + } else { + if ($this->value['width']) { + if ($this->value['border']['l']['width']) $this->value['width'] += $this->value['border']['l']['width']; + if ($this->value['border']['r']['width']) $this->value['width'] += $this->value['border']['r']['width']; + if ($this->value['padding']['l']) $this->value['width'] += $this->value['padding']['l']; + if ($this->value['padding']['r']) $this->value['width'] += $this->value['padding']['r']; + } + } + } + if ($this->value['height']) { + if ($this->value['border']['b']['width']) $this->value['height'] += $this->value['border']['b']['width']; + if ($this->value['border']['t']['width']) $this->value['height'] += $this->value['border']['t']['width']; + if ($this->value['padding']['b']) $this->value['height'] += $this->value['padding']['b']; + if ($this->value['padding']['t']) $this->value['height'] += $this->value['padding']['t']; + } + + if ($this->value['top']!=null) $this->value['top'] = $this->convertToMM($this->value['top'], $this->getLastHeight(true)); + if ($this->value['bottom']!=null) $this->value['bottom'] = $this->convertToMM($this->value['bottom'], $this->getLastHeight(true)); + if ($this->value['left']!=null) $this->value['left'] = $this->convertToMM($this->value['left'], $this->getLastWidth(true)); + if ($this->value['right']!=null) $this->value['right'] = $this->convertToMM($this->value['right'], $this->getLastWidth(true)); + + if ($this->value['top'] && $this->value['bottom'] && $this->value['height']) $this->value['bottom'] = null; + if ($this->value['left'] && $this->value['right'] && $this->value['width']) $this->value['right'] = null; + + return $return; + } + + /** + * get the height of the current line + * + * @access public + * @return float $height in mm + */ + public function getLineHeight() + { + $val = $this->value['line-height']; + if ($val=='normal') $val = '108%'; + return $this->convertToMM($val, $this->value['font-size']); + } + + /** + * get the width of the parent + * + * @access public + * @param boolean $mode true => adding padding and border + * @return float $width in mm + */ + public function getLastWidth($mode = false) + { + for ($k=count($this->table)-1; $k>=0; $k--) { + if ($this->table[$k]['width']) { + $w = $this->table[$k]['width']; + if ($mode) { + $w+= $this->table[$k]['border']['l']['width'] + $this->table[$k]['padding']['l'] + 0.02; + $w+= $this->table[$k]['border']['r']['width'] + $this->table[$k]['padding']['r'] + 0.02; + } + return $w; + } + } + return $this->_pdf->getW() - $this->_pdf->getlMargin() - $this->_pdf->getrMargin(); + } + + /** + * get the height of the parent + * + * @access public + * @param boolean $mode true => adding padding and border + * @return float $height in mm + */ + public function getLastHeight($mode = false) + { + for ($k=count($this->table)-1; $k>=0; $k--) { + if ($this->table[$k]['height']) { + $h = $this->table[$k]['height']; + if ($mode) { + $h+= $this->table[$k]['border']['t']['width'] + $this->table[$k]['padding']['t'] + 0.02; + $h+= $this->table[$k]['border']['b']['width'] + $this->table[$k]['padding']['b'] + 0.02; + } + return $h; + } + } + return $this->_pdf->getH() - $this->_pdf->gettMargin() - $this->_pdf->getbMargin(); + } + + /** + * get the value of the float property + * + * @access public + * @return $float left/right + */ + public function getFloat() + { + if ($this->value['float']=='left') return 'left'; + if ($this->value['float']=='right') return 'right'; + return null; + } + + /** + * get the last value for a specific key + * + * @access public + * @param string $key + * @return mixed + */ + public function getLastValue($key) + { + $nb = count($this->table); + if ($nb>0) { + return $this->table[$nb-1][$key]; + } else { + return null; + } + } + + /** + * get the last absolute X + * + * @access protected + * @return float $x + */ + protected function _getLastAbsoluteX() + { + for ($k=count($this->table)-1; $k>=0; $k--) { + if ($this->table[$k]['x'] && $this->table[$k]['position']) return $this->table[$k]['x']; + } + return $this->_pdf->getlMargin(); + } + + /** + * get the last absolute Y + * + * @access protected + * @return float $y + */ + protected function _getLastAbsoluteY() + { + for ($k=count($this->table)-1; $k>=0; $k--) { + if ($this->table[$k]['y'] && $this->table[$k]['position']) return $this->table[$k]['y']; + } + return $this->_pdf->gettMargin(); + } + + /** + * get the CSS properties of the current tag + * + * @access protected + * @return array $styles + */ + protected function _getFromCSS() + { + // styles to apply + $styles = array(); + + // list of the selectors to get in the CSS files + $getit = array(); + + // get the list of the selectors of each tags + $lst = array(); + $lst[] = $this->value['id_lst']; + for ($i=count($this->table)-1; $i>=0; $i--) { + $lst[] = $this->table[$i]['id_lst']; + } + + // foreach selectors in the CSS files, verify if it match with the list of selectors + foreach ($this->cssKeys as $key => $num) { + if ($this->_getReccursiveStyle($key, $lst)) { + $getit[$key] = $num; + } + } + + // if we have selectors + if (count($getit)) { + // get them, but in the definition order, because of priority + asort($getit); + foreach ($getit as $key => $val) $styles = array_merge($styles, $this->css[$key]); + } + + return $styles; + } + + /** + * identify if the selector $key match with the list of tag selectors + * + * @access protected + * @param string $key CSS selector to analyse + * @param array $lst list of the selectors of each tags + * @param string $next next step of parsing the selector + * @return boolean + */ + protected function _getReccursiveStyle($key, $lst, $next = null) + { + // if next step + if ($next!==null) { + // we remove this step + if ($next) $key = trim(substr($key, 0, -strlen($next))); + array_shift($lst); + + // if no more step to identify => return false + if (!count($lst)) { + return false; + } + } + + // for each selector of the current step + foreach ($lst[0] as $name) { + // if selector = key => ok + if ($key==$name) { + return true; + } + + // if the end of the key = the selector and the next step is ok => ok + if (substr($key, -strlen(' '.$name))==' '.$name && $this->_getReccursiveStyle($key, $lst, $name)) { + return true; + } + } + + // if we are not in the first step, we analyse the sub steps (the pareng tag of the current tag) + if ($next!==null && $this->_getReccursiveStyle($key, $lst, '')) { + return true; + } + + // no corresponding found + return false; + } + + /** + * Analyse a border + * + * @access public + * @param string $css css border properties + * @return array border properties + */ + public function readBorder($css) + { + // border none + $none = array('type' => 'none', 'width' => 0, 'color' => array(0, 0, 0)); + + // default value + $type = 'solid'; + $width = $this->convertToMM('1pt'); + $color = array(0, 0, 0); + + // clean up the values + $css = explode(' ', $css); + foreach ($css as $k => $v) { + $v = trim($v); + if ($v) $css[$k] = $v; + else unset($css[$k]); + } + $css = array_values($css); + + // read the values + $res = null; + foreach ($css as $value) { + + // if no border => return none + if ($value=='none' || $value=='hidden') { + return $none; + } + + // try to convert the value as a distance + $tmp = $this->convertToMM($value); + + // if the convert is ok => it is a width + if ($tmp!==null) { + $width = $tmp; + // else, it could be the type + } else if (in_array($value, array('solid', 'dotted', 'dashed', 'double'))) { + $type = $value; + // else, it could be the color + } else { + $tmp = $this->convertToColor($value, $res); + if ($res) $color = $tmp; + } + } + + // if no witdh => return none + if (!$width) return $none; + + // return the border properties + return array('type' => $type, 'width' => $width, 'color' => $color); + } + + /** + * duplicate the borders if needed + * + * @access protected + * @param &array $val + */ + protected function _duplicateBorder(&$val) + { + // 1 value => L => RTB + if (count($val)==1) { + $val[1] = $val[0]; + $val[2] = $val[0]; + $val[3] = $val[0]; + // 2 values => L => R & T => B + } else if (count($val)==2) { + $val[2] = $val[0]; + $val[3] = $val[1]; + // 3 values => T => B + } else if (count($val)==3) { + $val[3] = $val[1]; + } + } + + /** + * Analyse a background + * + * @access public + * @param string $css css background properties + * @param &array $value parsed values (by reference, because, ther is a legacy of the parent CSS properties) + */ + public function convertBackground($css, &$value) + { + // is there a image ? + $text = '/url\(([^)]*)\)/isU'; + if (preg_match($text, $css, $match)) { + // get the image + $value['image'] = $this->convertBackgroundImage($match[0]); + + // remove if from the css properties + $css = preg_replace($text, '', $css); + $css = preg_replace('/[\s]+/', ' ', $css); + } + + // protect some spaces + $css = preg_replace('/,[\s]+/', ',', $css); + + // explode the values + $css = explode(' ', $css); + + // background position to parse + $pos = ''; + + // foreach value + foreach ($css as $val) { + // try to parse the value as a color + $ok = false; + $color = $this->convertToColor($val, $ok); + + // if ok => it is a color + if ($ok) { + $value['color'] = $color; + // else if transparent => no coloàr + } else if ($val=='transparent') { + $value['color'] = null; + // else + } else { + // try to parse the value as a repeat + $repeat = $this->convertBackgroundRepeat($val); + + // if ok => it is repeat + if ($repeat) { + $value['repeat'] = $repeat; + // else => it could only be a position + } else { + $pos.= ($pos ? ' ' : '').$val; + } + } + } + + // if we have a position to parse + if ($pos) { + // try to read it + $pos = $this->convertBackgroundPosition($pos, $ok); + if ($ok) $value['position'] = $pos; + } + } + + /** + * parse a background color + * + * @access public + * @param string $css + * @return string $value + */ + public function convertBackgroundColor($css) + { + $res = null; + if ($css=='transparent') return null; + else return $this->convertToColor($css, $res); + } + + /** + * parse a background image + * + * @access public + * @param string $css + * @return string $value + */ + public function convertBackgroundImage($css) + { + if ($css=='none') + return null; + else if (preg_match('/^url\(([^)]*)\)$/isU', $css, $match)) + return $match[1]; + else + return null; + } + + /** + * parse a background position + * + * @access public + * @param string $css + * @param &boolean $res flag if conver is ok or not + * @return array ($x, $y) + */ + public function convertBackgroundPosition($css, &$res) + { + // init the res + $res = false; + + // explode the value + $css = explode(' ', $css); + + // we must have 2 values. if 0 or >2 : error. if 1 => put center for 2 + if (count($css)<2) { + if (!$css[0]) return null; + $css[1] = 'center'; + } + if (count($css)>2) return null; + + // prepare the values + $x = 0; + $y = 0; + $res = true; + + // convert the first value + if ($css[0]=='left') $x = '0%'; + else if ($css[0]=='center') $x = '50%'; + else if ($css[0]=='right') $x = '100%'; + else if ($css[0]=='top') $y = '0%'; + else if ($css[0]=='bottom') $y = '100%'; + else if (preg_match('/^[-]?[0-9\.]+%$/isU', $css[0])) $x = $css[0]; + else if ($this->convertToMM($css[0])) $x = $this->convertToMM($css[0]); + else $res = false; + + // convert the second value + if ($css[1]=='left') $x = '0%'; + else if ($css[1]=='right') $x = '100%'; + else if ($css[1]=='top') $y = '0%'; + else if ($css[1]=='center') $y = '50%'; + else if ($css[1]=='bottom') $y = '100%'; + else if (preg_match('/^[-]?[0-9\.]+%$/isU', $css[1])) $y = $css[1]; + else if ($this->convertToMM($css[1])) $y = $this->convertToMM($css[1]); + else $res = false; + + // return the values + return array($x, $y); + } + + /** + * parse a background repeat + * + * @access public + * @param string $css + * @return string $value + */ + public function convertBackgroundRepeat($css) + { + switch($css) + { + case 'repeat': + return array(true, true); + case 'repeat-x': + return array(true, false); + case 'repeat-y': + return array(false, true); + case 'no-repeat': + return array(false, false); + } + return null; + } + + /** + * convert a distance to mm + * + * @access public + * @param string $css distance to convert + * @param float $old parent distance + * @return float $value + */ + public function convertToMM($css, $old=0.) + { + $css = trim($css); + if (preg_match('/^[0-9\.\-]+$/isU', $css)) $css.= 'px'; + if (preg_match('/^[0-9\.\-]+px$/isU', $css)) $css = 25.4/96. * str_replace('px', '', $css); + else if (preg_match('/^[0-9\.\-]+pt$/isU', $css)) $css = 25.4/72. * str_replace('pt', '', $css); + else if (preg_match('/^[0-9\.\-]+in$/isU', $css)) $css = 25.4 * str_replace('in', '', $css); + else if (preg_match('/^[0-9\.\-]+mm$/isU', $css)) $css = 1.*str_replace('mm', '', $css); + else if (preg_match('/^[0-9\.\-]+%$/isU', $css)) $css = 1.*$old*str_replace('%', '', $css)/100.; + else $css = null; + + return $css; + } + + /** + * convert a css radius + * + * @access public + * @param string $css + * @return float $value + */ + public function convertToRadius($css) + { + // explode the value + $css = explode(' ', $css); + + foreach ($css as $k => $v) { + $v = trim($v); + if ($v) { + $v = $this->convertToMM($v, 0); + if ($v!==null) { + $css[$k] = $v; + } else { + unset($css[$k]); + } + } else { + unset($css[$k]); + } + } + + return array_values($css); + } + + /** + * convert a css color + * + * @access public + * @param string $css + * @param &boolean $res + * @return array (r,g, b) + */ + public function convertToColor($css, &$res) + { + // prepare the value + $css = trim($css); + $res = true; + + // if transparent => return null + if (strtolower($css)=='transparent') return array(null, null, null); + + // HTML color + if (isset($this->_htmlColor[strtolower($css)])) { + $css = $this->_htmlColor[strtolower($css)]; + $r = floatVal(hexdec(substr($css, 0, 2))); + $v = floatVal(hexdec(substr($css, 2, 2))); + $b = floatVal(hexdec(substr($css, 4, 2))); + return array($r, $v, $b); + } + + // like #FFFFFF + if (preg_match('/^#[0-9A-Fa-f]{6}$/isU', $css)) { + $r = floatVal(hexdec(substr($css, 1, 2))); + $v = floatVal(hexdec(substr($css, 3, 2))); + $b = floatVal(hexdec(substr($css, 5, 2))); + return array($r, $v, $b); + } + + // like #FFF + if (preg_match('/^#[0-9A-F]{3}$/isU', $css)) { + $r = floatVal(hexdec(substr($css, 1, 1).substr($css, 1, 1))); + $v = floatVal(hexdec(substr($css, 2, 1).substr($css, 2, 1))); + $b = floatVal(hexdec(substr($css, 3, 1).substr($css, 3, 1))); + return array($r, $v, $b); + } + + // like rgb(100, 100, 100) + if (preg_match('/rgb\([\s]*([0-9%\.]+)[\s]*,[\s]*([0-9%\.]+)[\s]*,[\s]*([0-9%\.]+)[\s]*\)/isU', $css, $match)) { + $r = $this->_convertSubColor($match[1]); + $v = $this->_convertSubColor($match[2]); + $b = $this->_convertSubColor($match[3]); + return array($r*255., $v*255., $b*255.); + } + + // like cmyk(100, 100, 100, 100) + if (preg_match('/cmyk\([\s]*([0-9%\.]+)[\s]*,[\s]*([0-9%\.]+)[\s]*,[\s]*([0-9%\.]+)[\s]*,[\s]*([0-9%\.]+)[\s]*\)/isU', $css, $match)) { + $c = $this->_convertSubColor($match[1]); + $m = $this->_convertSubColor($match[2]); + $y = $this->_convertSubColor($match[3]); + $k = $this->_convertSubColor($match[4]); + return array($c*100., $m*100., $y*100., $k*100.); + } + + $res = false; + return array(0., 0., 0.); + } + + /** + * color value to convert + * + * @access protected + * @param string $c + * @return float $c 0.->1. + */ + protected function _convertSubColor($c) + { + if (substr($c, -1)=='%') { + $c = floatVal(substr($c, 0, -1))/100.; + } else { + $c = floatVal($c); + if ($c>1) $c = $c/255.; + } + + return $c; + } + + /** + * read a css content + * + * @access protected + * @param &string $code + */ + protected function _analyseStyle(&$code) + { + // clean the spaces + $code = preg_replace('/[\s]+/', ' ', $code); + + // remove the comments + $code = preg_replace('/\/\*.*?\*\//s', '', $code); + + // split each CSS code "selector { value }" + preg_match_all('/([^{}]+){([^}]*)}/isU', $code, $match); + + // for each CSS code + for ($k=0; $k<count($match[0]); $k++) { + + // selectors + $names = strtolower(trim($match[1][$k])); + + // css style + $styles = trim($match[2][$k]); + + // explode each value + $styles = explode(';', $styles); + + // parse each value + $css = array(); + foreach ($styles as $style) { + $tmp = explode(':', $style); + if (count($tmp)>1) { + $cod = $tmp[0]; unset($tmp[0]); $tmp = implode(':', $tmp); + $css[trim(strtolower($cod))] = trim($tmp); + } + } + + // explode the names + $names = explode(',', $names); + + // save the values for each names + foreach ($names as $name) { + // clean the name + $name = trim($name); + + // if a selector with somethink lige :hover => continue + if (strpos($name, ':')!==false) continue; + + // save the value + if (!isset($this->css[$name])) + $this->css[$name] = $css; + else + $this->css[$name] = array_merge($this->css[$name], $css); + + } + } + + // get he list of the keys + $this->cssKeys = array_flip(array_keys($this->css)); + } + + /** + * Extract the css files from a html code + * + * @access public + * @param string &$html + */ + public function readStyle(&$html) + { + // the CSS content + $style = ' '; + + // extract the link tags, and remove them in the html code + preg_match_all('/<link([^>]*)>/isU', $html, $match); + $html = preg_replace('/<link[^>]*>/isU', '', $html); + $html = preg_replace('/<\/link[^>]*>/isU', '', $html); + + // analyse each link tag + foreach ($match[1] as $code) { + $tmp = array(); + + // read the attributes name=value + $prop = '([a-zA-Z0-9_]+)=([^"\'\s>]+)'; + preg_match_all('/'.$prop.'/is', $code, $match); + for ($k=0; $k<count($match[0]); $k++) { + $tmp[trim(strtolower($match[1][$k]))] = trim($match[2][$k]); + } + + // read the attributes name="value" + $prop = '([a-zA-Z0-9_]+)=["]([^"]*)["]'; + preg_match_all('/'.$prop.'/is', $code, $match); + for ($k=0; $k<count($match[0]); $k++) { + $tmp[trim(strtolower($match[1][$k]))] = trim($match[2][$k]); + } + + // read the attributes name='value' + $prop = "([a-zA-Z0-9_]+)=[']([^']*)[']"; + preg_match_all('/'.$prop.'/is', $code, $match); + for ($k=0; $k<count($match[0]); $k++) { + $tmp[trim(strtolower($match[1][$k]))] = trim($match[2][$k]); + } + + // if type text/css => we keep it + if (isset($tmp['type']) && strtolower($tmp['type'])=='text/css' && isset($tmp['href'])) { + + // get the href + $url = $tmp['href']; + + // get the content of the css file + $content = @file_get_contents($url); + + // if "http://" in the url + if (strpos($url, 'http://')!==false) { + + // get the domain "http://xxx/" + $url = str_replace('http://', '', $url); + $url = explode('/', $url); + $urlMain = 'http://'.$url[0].'/'; + + // get the absolute url of the path + $urlSelf = $url; unset($urlSelf[count($urlSelf)-1]); $urlSelf = 'http://'.implode('/', $urlSelf).'/'; + + // adapt the url in the css content + $content = preg_replace('/url\(([^\\\\][^)]*)\)/isU', 'url('.$urlSelf.'$1)', $content); + $content = preg_replace('/url\((\\\\[^)]*)\)/isU', 'url('.$urlMain.'$1)', $content); + } else { +// @TODO correction on url in absolute on a local css content + // $content = preg_replace('/url\(([^)]*)\)/isU', 'url('.dirname($url).'/$1)', $content); + } + + // add to the CSS content + $style.= $content."\n"; + } + } + + // extract the style tags des tags style, and remove them in the html code + preg_match_all('/<style[^>]*>(.*)<\/style[^>]*>/isU', $html, $match); + $html = preg_replace('/<style[^>]*>(.*)<\/style[^>]*>/isU', '', $html); + + // analyse each style tags + foreach ($match[1] as $code) { + // add to the CSS content + $code = str_replace('<!--', '', $code); + $code = str_replace('-->', '', $code); + $style.= $code."\n"; + } + + //analyse the css content + $this->_analyseStyle($style); + } +} \ No newline at end of file diff --git a/assets/html2pdf/_class/parsingHtml.class.php b/assets/html2pdf/_class/parsingHtml.class.php new file mode 100644 index 0000000..fa24449 --- /dev/null +++ b/assets/html2pdf/_class/parsingHtml.class.php @@ -0,0 +1,520 @@ +<?php +/** + * HTML2PDF Librairy - parsingHtml class + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * @version 4.03 + */ + +class HTML2PDF_parsingHtml +{ + protected $_html = ''; // HTML code to parse + protected $_num = 0; // table number + protected $_level = 0; // table level + protected $_encoding = ''; // encoding + public $code = array(); // parsed HTML codfe + + const HTML_TAB = ' '; + + /** + * main constructor + * + * @param string encoding + * @access public + */ + public function __construct($encoding = 'UTF-8') + { + $this->_num = 0; + $this->_level = array($this->_num); + $this->_html = ''; + $this->code = array(); + $this->setEncoding($encoding); + } + + /** + * change the encoding + * + * @param string encoding + * @access public + */ + public function setEncoding($encoding) + { + $this->_encoding = $encoding; + } + + /** + * Define the HTML code to parse + * + * @param string HTML code + * @access public + */ + public function setHTML($html) + { + // remove the HTML in comment + $html = preg_replace('/<!--(.*)-->/isU', '', $html); + + // save the HTML code + $this->_html = $html; + } + + /** + * parse the HTML code + * + * @access public + */ + public function parse() + { + $parents = array(); + + // flag : are we in a <pre> Tag ? + $tagPreIn = false; + + // action to use for each line of the content of a <pre> Tag + $tagPreBr = array( + 'name' => 'br', + 'close' => false, + 'param' => array( + 'style' => array(), + 'num' => 0 + ) + ); + + // tag that can be not closed + $tagsNotClosed = array( + 'br', 'hr', 'img', 'col', + 'input', 'link', 'option', + 'circle', 'ellipse', 'path', 'rect', 'line', 'polygon', 'polyline' + ); + + // search the HTML tags + $tmp = array(); + $this->_searchCode($tmp); + + // all the actions to do + $actions = array(); + + // foreach part of the HTML code + foreach ($tmp as $part) { + // if it is a tag code + if ($part[0]=='code') { + // analise the HTML code + $res = $this->_analiseCode($part[1]); + + // if it is a real HTML tag + if ($res) { + // save the current posistion in the HTML code + $res['html_pos'] = $part[2]; + + // if the tag must be closed + if (!in_array($res['name'], $tagsNotClosed)) { + // if it is a closure tag + if ($res['close']) { + // HTML validation + if (count($parents)<1) + throw new HTML2PDF_exception(3, $res['name'], $this->getHtmlErrorCode($res['html_pos'])); + else if ($parents[count($parents)-1]!=$res['name']) + throw new HTML2PDF_exception(4, $parents, $this->getHtmlErrorCode($res['html_pos'])); + else + unset($parents[count($parents)-1]); + } else { + // if it is a autoclosed tag + if ($res['autoclose']) { + // save the opened tag + $actions[] = $res; + + // prepare the closed tag + $res['params'] = array(); + $res['close'] = true; + } + // else :add a child for validation + else + $parents[count($parents)] = $res['name']; + } + + // if it is a <pre> tag (or <code> tag) not auclosed => update the flag + if (($res['name']=='pre' || $res['name']=='code') && !$res['autoclose']) { + $tagPreIn = !$res['close']; + } + } + + // save the actions to convert + $actions[] = $res; + } else { // else (it is not a real HTML tag => we transform it in Texte + $part[0]='txt'; + } + } + // if it is text + if ($part[0]=='txt') { + // if we are not in a <pre> tag + if (!$tagPreIn) { + // save the action + $actions[] = array( + 'name' => 'write', + 'close' => false, + 'param' => array('txt' => $this->_prepareTxt($part[1])), + ); + } else { // else (if we are in a <pre> tag) + // prepare the text + $part[1] = str_replace("\r", '', $part[1]); + $part[1] = explode("\n", $part[1]); + + // foreach line of the text + foreach ($part[1] as $k => $txt) { + // transform the line + $txt = str_replace("\t", self::HTML_TAB, $txt); + $txt = str_replace(' ', '&nbsp;', $txt); + + // add a break line + if ($k>0) $actions[] = $tagPreBr; + + // save the action + $actions[] = array( + 'name' => 'write', + 'close' => false, + 'param' => array('txt' => $this->_prepareTxt($txt, false)), + ); + } + } + } + } + + // for each indentified action, we have to clean up the begin and the end of the texte + // based on tags that surround it + + // list of the tags to clean + $tagsToClean = array( + 'page', 'page_header', 'page_footer', 'form', + 'table', 'thead', 'tfoot', 'tr', 'td', 'th', 'br', + 'div', 'hr', 'p', 'ul', 'ol', 'li', + 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', + 'bookmark', 'fieldset', 'legend', + 'draw', 'circle', 'ellipse', 'path', 'rect', 'line', 'g', 'polygon', 'polyline', + 'option' + ); + + // foreach action + $nb = count($actions); + for ($k=0; $k<$nb; $k++) { + // if it is a Text + if ($actions[$k]['name']=='write') { + // if the tag before the text is a tag to clean => ltrim on the text + if ($k>0 && in_array($actions[$k-1]['name'], $tagsToClean)) + $actions[$k]['param']['txt'] = ltrim($actions[$k]['param']['txt']); + + // if the tag after the text is a tag to clean => rtrim on the text + if ($k<$nb-1 && in_array($actions[$k+1]['name'], $tagsToClean)) + $actions[$k]['param']['txt'] = rtrim($actions[$k]['param']['txt']); + + // if the text is empty => remove the action + if (!strlen($actions[$k]['param']['txt'])) + unset($actions[$k]); + } + } + + // if we are not on the level 0 => HTML validator ERROR + if (count($parents)) throw new HTML2PDF_exception(5, $parents); + + // save the actions to do + $this->code = array_values($actions); + } + + /** + * prepare the text + * + * @param string texte + * @param boolean true => replace multiple space+\t+\r+\n by a single space + * @return string texte + * @access protected + */ + protected function _prepareTxt($txt, $spaces = true) + { + if ($spaces) $txt = preg_replace('/\s+/is', ' ', $txt); + $txt = str_replace('&euro;', '€', $txt); + $txt = html_entity_decode($txt, ENT_QUOTES, $this->_encoding); + return $txt; + } + + /** + * parse the HTML code + * + * @param &array array's result + * @return null + */ + protected function _searchCode(&$tmp) + { + // initialise the array + $tmp = array(); + + // regexp to separate the tags from the texts + $reg = '/(<[^>]+>)|([^<]+)+/isU'; + + // last match found + $str = ''; + $offset = 0; + + // As it finds a match + while (preg_match($reg, $this->_html, $parse, PREG_OFFSET_CAPTURE, $offset)) { + // if it is a tag + if ($parse[1][0]) { + // save the previous text if it exists + if ($str!=='') $tmp[] = array('txt', $str); + + // save the tag, with the offset + $tmp[] = array('code', trim($parse[1][0]), $offset); + + // init the current text + $str = ''; + } else { // else (if it is a text) + // add the new text to the current text + $str.= $parse[2][0]; + } + + // Update offset to the end of the match + $offset = $parse[0][1] + strlen($parse[0][0]); + unset($parse); + } + // if a text is present in the end, we save it + if ($str!='') $tmp[] = array('txt', $str); + unset($str); + } + + /** + * analise a HTML tag + * + * @param string HTML code to analise + * @return array corresponding action + */ + protected function _analiseCode($code) + { + // name of the tag, opening, closure, autoclosure + $tag = '<([\/]{0,1})([_a-z0-9]+)([\/>\s]+)'; + if (!preg_match('/'.$tag.'/isU', $code, $match)) return null; + $close = ($match[1]=='/' ? true : false); + $autoclose = preg_match('/\/>$/isU', $code); + $name = strtolower($match[2]); + + // required parameters (depends on the tag name) + $param = array(); + $param['style'] = ''; + if ($name=='img') { + $param['alt'] = ''; + $param['src'] = ''; + } + if ($name=='a') { + $param['href'] = ''; + } + + // read the parameters : nom=valeur + $prop = '([a-zA-Z0-9_]+)=([^"\'\s>]+)'; + preg_match_all('/'.$prop.'/is', $code, $match); + for($k=0; $k<count($match[0]); $k++) + $param[trim(strtolower($match[1][$k]))] = trim($match[2][$k]); + + // read the parameters : nom="valeur" + $prop = '([a-zA-Z0-9_]+)=["]([^"]*)["]'; + preg_match_all('/'.$prop.'/is', $code, $match); + for($k=0; $k<count($match[0]); $k++) + $param[trim(strtolower($match[1][$k]))] = trim($match[2][$k]); + + // read the parameters : nom='valeur' + $prop = "([a-zA-Z0-9_]+)=[']([^']*)[']"; + preg_match_all('/'.$prop.'/is', $code, $match); + for($k=0; $k<count($match[0]); $k++) + $param[trim(strtolower($match[1][$k]))] = trim($match[2][$k]); + + // compliance of each parameter + $color = "#000000"; + $border = null; + foreach ($param as $key => $val) { + $key = strtolower($key); + switch($key) + { + case 'width': + unset($param[$key]); + $param['style'] .= 'width: '.$val.'px; '; + break; + + case 'align': + if ($name==='img') { + unset($param[$key]); + $param['style'] .= 'float: '.$val.'; '; + } elseif ($name!=='table') { + unset($param[$key]); + $param['style'] .= 'text-align: '.$val.'; '; + } + break; + + case 'valign': + unset($param[$key]); + $param['style'] .= 'vertical-align: '.$val.'; '; + break; + + case 'height': + unset($param[$key]); + $param['style'] .= 'height: '.$val.'px; '; + break; + + case 'bgcolor': + unset($param[$key]); + $param['style'] .= 'background: '.$val.'; '; + break; + + case 'bordercolor': + unset($param[$key]); + $color = $val; + break; + + case 'border': + unset($param[$key]); + if (preg_match('/^[0-9]+$/isU', $val)) $val = $val.'px'; + $border = $val; + break; + + case 'cellpadding': + case 'cellspacing': + if (preg_match('/^([0-9]+)$/isU', $val)) $param[$key] = $val.'px'; + break; + + case 'colspan': + case 'rowspan': + $val = preg_replace('/[^0-9]/isU', '', $val); + if (!$val) $val = 1; + $param[$key] = $val; + break; + } + } + + // compliance of the border + if ($border!==null) { + if ($border) $border = 'border: solid '.$border.' '.$color; + else $border = 'border: none'; + + $param['style'] .= $border.'; '; + $param['border'] = $border; + } + + // reading styles: decomposition and standardization + $styles = explode(';', $param['style']); + $param['style'] = array(); + foreach ($styles as $style) { + $tmp = explode(':', $style); + if (count($tmp)>1) { + $cod = $tmp[0]; + unset($tmp[0]); + $tmp = implode(':', $tmp); + $param['style'][trim(strtolower($cod))] = preg_replace('/[\s]+/isU', ' ', trim($tmp)); + } + } + + // determining the level of table opening, with an added level + if (in_array($name, array('ul', 'ol', 'table')) && !$close) { + $this->_num++; + $this->_level[count($this->_level)] = $this->_num; + } + + // get the level of the table containing the element + if (!isset($param['num'])) { + $param['num'] = $this->_level[count($this->_level)-1]; + } + + // for closures table: remove a level + if (in_array($name, array('ul', 'ol', 'table')) && $close) { + unset($this->_level[count($this->_level)-1]); + } + + // prepare the parameters + if (isset($param['value'])) $param['value'] = $this->_prepareTxt($param['value']); + if (isset($param['alt'])) $param['alt'] = $this->_prepareTxt($param['alt']); + if (isset($param['title'])) $param['title'] = $this->_prepareTxt($param['title']); + if (isset($param['class'])) $param['class'] = $this->_prepareTxt($param['class']); + + // return the new action to do + return array('name' => $name, 'close' => $close ? 1 : 0, 'autoclose' => $autoclose, 'param' => $param); + } + + /** + * get a full level of HTML, between an opening and closing corresponding + * + * @param integer key + * @return array actions + */ + public function getLevel($k) + { + // if the code does not exist => return empty + if (!isset($this->code[$k])) return array(); + + // the tag to detect + $detect = $this->code[$k]['name']; + + // if it is a text => return + if ($detect=='write') { + return array($this->code[$k]); + } + + // + $level = 0; // depth level + $end = false; // end of the search + $code = array(); // extract code + + // while it's not ended + while (!$end) { + // current action + $row = $this->code[$k]; + + // if 'write' => we add the text + if ($row['name']=='write') { + $code[] = $row; + } else { // else, it is a html tag + $not = false; // flag for not taking into account the current tag + + // if it is the searched tag + if ($row['name']==$detect) { + // if we are just at the root level => dont take it + if ($level==0) { + $not = true; + } + + // update the level + $level+= ($row['close'] ? -1 : 1); + + // if we are now at the root level => it is the end, and dont take it + if ($level==0) { + $not = true; + $end = true; + } + } + + // if we can takin into account the current tag => save it + if (!$not) { + if (isset($row['style']['text-align'])) unset($row['style']['text-align']); + $code[] = $row; + } + } + + // it continues as long as there has code to analise + if (isset($this->code[$k+1])) + $k++; + else + $end = true; + } + + // return the extract + return $code; + } + + /** + * return a part of the HTML code, for error message + * + * @param integer position + * @param integer take before + * @param integer take after + * @return string part of the html code + */ + public function getHtmlErrorCode($pos, $before=30, $after=40) + { + return substr($this->_html, $pos-$before, $before+$after); + } +} \ No newline at end of file diff --git a/assets/html2pdf/_class/tcpdfConfig.php b/assets/html2pdf/_class/tcpdfConfig.php new file mode 100644 index 0000000..6f10893 --- /dev/null +++ b/assets/html2pdf/_class/tcpdfConfig.php @@ -0,0 +1,247 @@ +<?php +//============================================================+ +// File name : tcpdf_config.php +// Begin : 2004-06-11 +// Last Update : 2009-09-30 +// +// Description : Configuration file for TCPDF. +// +// Author: Nicola Asuni +// +// (c) Copyright: +// Nicola Asuni +// Tecnick.com s.r.l. +// Via Della Pace, 11 +// 09044 Quartucciu (CA) +// ITALY +// www.tecnick.com +// info@tecnick.com +//============================================================+ + +/** + * Configuration file for TCPDF. + * @author Nicola Asuni + * @copyright 2004-2008 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) + * Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com + * @package com.tecnick.tcpdf + * @version 4.0.014 + * @link http://tcpdf.sourceforge.net + * @license http://www.gnu.org/copyleft/lesser.html LGPL + * @since 2004-10-27 + */ + +// If you define the constant K_TCPDF_EXTERNAL_CONFIG, the following settings will be ignored. + +if (!defined('K_TCPDF_EXTERNAL_CONFIG')) { + + define('K_TCPDF_EXTERNAL_CONFIG', true); + + // DOCUMENT_ROOT fix for IIS Webserver + if ((!isset($_SERVER['DOCUMENT_ROOT'])) OR (empty($_SERVER['DOCUMENT_ROOT']))) { + if (isset($_SERVER['SCRIPT_FILENAME'])) { + $_SERVER['DOCUMENT_ROOT'] = str_replace( + '\\', + '/', + substr($_SERVER['SCRIPT_FILENAME'], 0, 0-strlen($_SERVER['PHP_SELF'])) + ); + } elseif (isset($_SERVER['PATH_TRANSLATED'])) { + $_SERVER['DOCUMENT_ROOT'] = str_replace( + '\\', + '/', + substr(str_replace('\\\\', '\\', $_SERVER['PATH_TRANSLATED']), 0, 0-strlen($_SERVER['PHP_SELF'])) + ); + } else { + // define here your DOCUMENT_ROOT path if the previous fails + $_SERVER['DOCUMENT_ROOT'] = '/var/www'; + } + } + + // Automatic calculation for the following K_PATH_MAIN constant + $kPathMain = str_replace('\\', '/', dirname(__FILE__)); + $kPathMain = dirname($kPathMain).'/'; // remove the current directory + $kPathMain.= '_tcpdf_'.HTML2PDF_USED_TCPDF_VERSION.'/'; + define('K_PATH_MAIN', $kPathMain); + + // Automatic calculation for the following K_PATH_URL constant + if (isset($_SERVER['HTTP_HOST']) AND (!empty($_SERVER['HTTP_HOST']))) { + if (isset($_SERVER['HTTPS']) AND (!empty($_SERVER['HTTPS'])) AND strtolower($_SERVER['HTTPS'])!='off') { + $kPathUrl = 'https://'; + } else { + $kPathUrl = 'http://'; + } + $kPathUrl .= $_SERVER['HTTP_HOST']; + $kPathUrl .= str_replace('\\', '/', substr(K_PATH_MAIN, (strlen($_SERVER['DOCUMENT_ROOT']) - 1))); + } + + /** + * URL path to tcpdf installation folder (http://localhost/tcpdf/). + * By default it is automatically calculated but you can also set it as a fixed string to improve performances. + */ + define('K_PATH_URL', $kPathUrl); + + /** + * path for PDF fonts + * use K_PATH_MAIN.'fonts/old/' for old non-UTF8 fonts + */ + define('K_PATH_FONTS', K_PATH_MAIN.'fonts/'); + + /** + * cache directory for temporary files (full path) + */ + define('K_PATH_CACHE', K_PATH_MAIN.'cache/'); + + /** + * cache directory for temporary files (url path) + */ + define('K_PATH_URL_CACHE', K_PATH_URL.'cache/'); + + /** + *images directory + */ + define('K_PATH_IMAGES', K_PATH_MAIN.'images/'); + + /** + * blank image + */ + define('K_BLANK_IMAGE', K_PATH_IMAGES.'_blank.png'); + + /** + * page format + */ + define('PDF_PAGE_FORMAT', 'A4'); + + /** + * page orientation (P=portrait, L=landscape) + */ + define('PDF_PAGE_ORIENTATION', 'P'); + + /** + * document creator + */ + define('PDF_CREATOR', 'HTML2PDF - TCPDF'); + + /** + * document author + */ + define('PDF_AUTHOR', 'HTML2PDF - TCPDF'); + + /** + * header title + */ + define('PDF_HEADER_TITLE', null); + + /** + * header description string + */ + define('PDF_HEADER_STRING', null); + + /** + * image logo + */ + define('PDF_HEADER_LOGO', null); + + /** + * header logo image width [mm] + */ + define('PDF_HEADER_LOGO_WIDTH', null); + + /** + * document unit of measure [pt=point, mm=millimeter, cm=centimeter, in=inch] + */ + define('PDF_UNIT', 'mm'); + + /** + * header margin + */ + define('PDF_MARGIN_HEADER', 0); + + /** + * footer margin + */ + define('PDF_MARGIN_FOOTER', 0); + + /** + * top margin + */ + define('PDF_MARGIN_TOP', 0); + + /** + * bottom margin + */ + define('PDF_MARGIN_BOTTOM', 0); + + /** + * left margin + */ + define('PDF_MARGIN_LEFT', 0); + + /** + * right margin + */ + define('PDF_MARGIN_RIGHT', 0); + + /** + * default main font name + */ + define('PDF_FONT_NAME_MAIN', 'helvetica'); + + /** + * default main font size + */ + define('PDF_FONT_SIZE_MAIN', 10); + + /** + * default data font name + */ + define('PDF_FONT_NAME_DATA', 'helvetica'); + + /** + * default data font size + */ + define('PDF_FONT_SIZE_DATA', 8); + + /** + * default monospaced font name + */ + define('PDF_FONT_MONOSPACED', 'courier'); + + /** + * ratio used to adjust the conversion of pixels to user units + */ + define('PDF_IMAGE_SCALE_RATIO', 1); + + /** + * magnification factor for titles + */ + define('HEAD_MAGNIFICATION', 1); + + /** + * height of cell repect font height + */ + define('K_CELL_HEIGHT_RATIO', 1); + + /** + * title magnification respect main font size + */ + define('K_TITLE_MAGNIFICATION', 1); + + /** + * reduction factor for small font + */ + define('K_SMALL_RATIO', 2/3); + + /** + * set to true to enable the special procedure used to avoid the overlappind of symbols on Thai language + */ + define('K_THAI_TOPCHARS', true); + + /** + * if true allows to call TCPDF methods using HTML syntax + * IMPORTANT: For security reason, disable this feature if you are printing user HTML content. + */ + define('K_TCPDF_CALLS_IN_HTML', false); +} + +//============================================================+ +// END OF FILE +//============================================================+ diff --git a/assets/html2pdf/_lisez_moi.txt b/assets/html2pdf/_lisez_moi.txt new file mode 100644 index 0000000..30091f9 --- /dev/null +++ b/assets/html2pdf/_lisez_moi.txt @@ -0,0 +1,95 @@ +******************************************************* +** Ce programme est distribué sous la licence LGPL, ** +** reportez-vous au fichier _LGPL.txt ou à ** +** http://www.gnu.org/licenses/lgpl.html ** +** pour en savoir plus. ** +** ** +** Copyright 2008-2011 par Laurent Minguet ** +******************************************************* +******************************* +* HTML2PDF v4.03 - 27/05/2011 * +******************************* + +Utilisation : +------------ + - nécessite au minimum PHP5 + + - regardez les exemples fournis, et lisez le wiki pour comprendre le fonctionnement. + + - il est TRES IMPORTANT de fournir du HTML 4.01 valide au convertisseur, + mais seulement ce que contient le <body> + + - pour les borders : il est conseillé qu'ils soient au format "solid 1mm #000000" + + - pour les paddings : ils ne sont applicables qu'aux balises table, th, td, div, li + + - Une fonte par défaut peut être précisée,au cas ou la fonte demandée n'existe pas ou si aucune fonte n'est indiquée : + $html2pdf->setDefaultFont('Arial'); + + - la possibilité de protéger vos PDF est présente, CF Exemple 7. + + - Certains tests peuvent être activés (true) ou de désactivés(false) : + * méthode setTestIsImage : tester que les images existent bien + * méthode setTestTdInOnePage : tester que le contenu des TDs rentre sur une seule page + * méthode setTestIsDeprecated : tester que les anciennes propriétes des balises spécifiques ne sont plus présentes + + - Un mode DEBUG permettant de connaitre les ressources utilisées lors de la construction du PDF est présent. + Il est activable en rajoutant la commande suivante juste après le constructeur (cf exemple 0): + $htmlpdf->setModeDebug(); + + - Certaines balises spécifiques ont été introduites : + * <page></page> (CF Exemple 7 & wiki) + permet de définir le format, l'orientation, les marges left, right, top et bottom, l'image + et la couleur de fond d'une page, sa taille et position, le footer. + Il est également possible de garder les header et footer des pages précédentes, + grâce à l'attribue pageset="old" (CF Exemple 3 & 4 & wiki) + + * <page_header></page_header> (CF Exemple 3 & wiki) + + * <page_footer></page_footer> (CF Exemple 3 & wiki) + + * <nobreak></nobreak> (cf wiki) + permet de forcer l'affichage d'une partie sur une même page. + Si cette partie ne rentre pas dans le reste de la page, un saut de page est + effectué avant. + + * <barcode></barcode> (CF Exemples 0 et 9 & wiki) + permet d'insérer des barcodes dans les pdfs, CF Exemples 0 et 9 + Les types de codebar possible sont ceux de TCPDF + + * <qrcode></qrcode> (CF Exemple 13 & wiki) + permet d'insérer un codebar à 2 dimensions de type QRcode + (QR Code is registered trademark of DENSO WAVE INCORPORATED | http://www.denso-wave.com/qrcode/) + + * <bookmark></bookmark> (CF Exemples 7 & About & wiki) + permet d'insérer des bookmarks dans les pdfs, CF Exemple 7 et About. + Il est également possible de créer un index automatiquement en fin de + document (cf wiki) + + * propriété css "rotate" : + valeurs possibles : 0, 90, 180, 270 + applicable uniquement sur les divs (cf exemple 8) + +change log : +----------- + regardez le fichier _changelog.txt + +Aide et Support : +---------------- + pour toutes questions et rapport de bug, merci d'utiliser exclusivement le lien de support ci-dessous. + Je ne répondrai à aucune question en dehors, afin que tout le monde puisse profiter des réponses. + +Informations : +------------- + Programmeur : Spipu + email : webmaster@html2pdf.fr + site : http://html2pdf.fr/ + wiki : http://html2pdf.fr/fr/wiki + support : http://html2pdf.fr/fr/forum + +Remerciement : +------------- + * Olivier Plathey pour avoir conçu FPDF + * Nicola Asuni pour les modifications qu'il a accepté d'apporter à TCPDF + * yAronet pour l'hébergement du forum de support + * toutes les personnes qui m'ont aidé à développer cette librairie, et à traduire les différents textes diff --git a/assets/html2pdf/_read_me.txt b/assets/html2pdf/_read_me.txt new file mode 100644 index 0000000..bb80e5a --- /dev/null +++ b/assets/html2pdf/_read_me.txt @@ -0,0 +1,93 @@ +********************************************************* +** This program is distributed under the LGPL License, ** +** for more information see file _LGPL.txt or ** +** http://www.gnu.org/licenses/lgpl.html ** +** ** +** Copyright 2008-2011 by Laurent Minguet ** +********************************************************* +******************************* +* HTML2PDF v4.03 - 2011-05-27 * +******************************* + +How to use : +------------ + - You need at least PHP 5 + + - Look at the examples provided to see how it works. + + - It is very important to provide valid HTML 4.01 to the converter, + but only what is in the <body> + + - for borders: it is advised that they are like "solid 1mm #000000" + + - for padding, they are applicable only on tags table, th, td, div, li + + - A default font can be specified, if the requested font does not exist or if no font is specified: + $html2pdf->setDefaultFont('Arial'); + + - The possibility to protect your PDF is present, CF Example 7. + + - Some tests can be enabled (true) or disabled (false) : + * setTestIsImage method: test that images must exist + * setTestTdInOnePage method: test that the contents of TDs fit on one page + * setTestIsDeprecated method: test that old properties of specific tags are not used anymore + + - A DEBUG mode to know the resources used is present + It is activated by adding the following command just after the contructor (see Example 0): + $htmlpdf->setModeDebug(); + + - Some specific tags have been introduced: + * <page></page> (CF Exemple 7 & wiki) + determines the orientation, margins left, right, top and bottom, the background image + and the background color of a page, its size and position, the footer. + It is also possible to keep the header and footer of the previous pages, + through the attribut pageset="old" (see Example 3 & 4 & wiki) + + * <page_header></page_header> (CF Example 3 & wiki) + + * <page_footer></page_footer> (CF Example 3 & wiki) + + * <nobreak></nobreak> (cd wiki) + used to force the display of a section on the same page. + If this section does not fit into the rest of the page, a page break is done before. + + * <barcode></barcode> (CF Examples 0 & 9 & wiki) + can insert barcodes in pdfs, CF Examples 0 and 9 + The possible types of codebar are alls of TCPDF + + * <qrcode></qrcode> (CF Example 13 & wiki) + can insert QRcode 2D barcodes + (QR Code is registered trademark of DENSO WAVE INCORPORATED | http://www.denso-wave.com/qrcode/) + + * <bookmark></bookmark> (CF Examples 7 & About & wiki) + can insert bookmark in pdfs, CF Example 7 and About. + It is also possible to automatically create an index at the end of + document (CF Example About & wiki) + + * css property "rotate" : + values : 0, 90, 180, 270 + works only on div (cf example 8) + +change log : +----------- + see on this page : http://html2pdf.fr/en/download + +Help & Support : +--------------- + For questions and bug reports, thank you to use only the support link below. + I will answer to your questions only on it... + +Informations : +------------- + Programmer : Spipu + email : webmaster@html2pdf.fr + web site : http://html2pdf.fr/ + wiki : http://html2pdf.fr/en/wiki + support : http://html2pdf.fr/en/forum + +Thanks : +------- + * Olivier Plathey: for have made FPDF + * Nicola Asuni: for the changes he has agreed to make to TCPDF + * yAronet: for hosting support forum + * everyone who helped me to develop this library and to bring the texts diff --git a/assets/html2pdf/_tcpdf_5.0.002/2dbarcodes.php b/assets/html2pdf/_tcpdf_5.0.002/2dbarcodes.php new file mode 100644 index 0000000..a266bfb --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/2dbarcodes.php @@ -0,0 +1,155 @@ +<?php +//============================================================+ +// File name : 2dbarcodes.php +// Begin : 2009-04-07 +// Last Update : 2010-04-30 +// Version : 1.0.003 +// License : GNU LGPL (http://www.gnu.org/copyleft/lesser.html) +// ---------------------------------------------------------------------------- +// Copyright (C) 2008-2009 Nicola Asuni - Tecnick.com S.r.l. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 2.1 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. +// +// See LICENSE.TXT file for more information. +// ---------------------------------------------------------------------------- +// +// Description : PHP class to creates array representations for +// 2D barcodes to be used with TCPDF. +// +// Author: Nicola Asuni +// +// (c) Copyright: +// Nicola Asuni +// Tecnick.com S.r.l. +// Via della Pace, 11 +// 09044 Quartucciu (CA) +// ITALY +// www.tecnick.com +// info@tecnick.com +//============================================================+ + +/** + * PHP class to creates array representations for 2D barcodes to be used with TCPDF. + * @package com.tecnick.tcpdf + * @abstract Functions for generating string representation of 2D barcodes. + * @author Nicola Asuni + * @copyright 2008-2009 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com + * @link http://www.tcpdf.org + * @license http://www.gnu.org/copyleft/lesser.html LGPL + * @version 1.0.003 + */ + + /** + * PHP class to creates array representations for 2D barcodes to be used with TCPDF (http://www.tcpdf.org).<br> + * @name TCPDFBarcode + * @package com.tecnick.tcpdf + * @version 1.0.003 + * @author Nicola Asuni + * @link http://www.tcpdf.org + * @license http://www.gnu.org/copyleft/lesser.html LGPL + */ +class TCPDF2DBarcode { + + /** + * @var array representation of barcode. + * @access protected + */ + protected $barcode_array = false; + + /** + * This is the class constructor. + * Return an array representations for 2D barcodes:<ul> + * <li>$arrcode['code'] code to be printed on text label</li> + * <li>$arrcode['num_rows'] required number of rows</li> + * <li>$arrcode['num_cols'] required number of columns</li> + * <li>$arrcode['bcode'][$r][$c] value of the cell is $r row and $c column (0 = transparent, 1 = black)</li></ul> + * @param string $code code to print + * @param string $type type of barcode: <ul>li>RAW: raw mode - comma-separad list of array rows</li><li>RAW2: raw mode - array rows are surrounded by square parenthesis.</li><li>QRCODE : QR-CODE Low error correction</li><li>QRCODE,L : QR-CODE Low error correction</li><li>QRCODE,M : QR-CODE Medium error correction</li><li>QRCODE,Q : QR-CODE Better error correction</li><li>QRCODE,H : QR-CODE Best error correction</li></ul> + */ + public function __construct($code, $type) { + $this->setBarcode($code, $type); + } + + /** + * Return an array representations of barcode. + * @return array + */ + public function getBarcodeArray() { + return $this->barcode_array; + } + + /** + * Set the barcode. + * @param string $code code to print + * @param string $type type of barcode: <ul><li>RAW: raw mode - comma-separad list of array rows</li><li>RAW2: raw mode - array rows are surrounded by square parenthesis.</li><li>QRCODE : QR-CODE Low error correction</li><li>QRCODE,L : QR-CODE Low error correction</li><li>QRCODE,M : QR-CODE Medium error correction</li><li>QRCODE,Q : QR-CODE Better error correction</li><li>QRCODE,H : QR-CODE Best error correction</li></ul> + * @return array + */ + public function setBarcode($code, $type) { + $mode = explode(',', $type); + $qrtype = strtoupper($mode[0]); + switch ($qrtype) { + case 'QRCODE': { // QR-CODE + require_once(dirname(__FILE__).'/qrcode.php'); + if (!isset($mode[1]) OR (!in_array($mode[1],array('L','M','Q','H')))) { + $mode[1] = 'L'; // Ddefault: Low error correction + } + $qrcode = new QRcode($code, strtoupper($mode[1])); + $this->barcode_array = $qrcode->getBarcodeArray(); + break; + } + case 'RAW': + case 'RAW2': { // RAW MODE + // remove spaces + $code = preg_replace('/[\s]*/si', '', $code); + if (strlen($code) < 3) { + break; + } + if ($qrtype == 'RAW') { + // comma-separated rows + $rows = explode(',', $code); + } else { + // rows enclosed in square parethesis + $code = substr($code, 1, -1); + $rows = explode('][', $code); + } + $this->barcode_array['num_rows'] = count($rows); + $this->barcode_array['num_cols'] = strlen($rows[0]); + $this->barcode_array['bcode'] = array(); + foreach ($rows as $r) { + $this->barcode_array['bcode'][] = str_split($r, 1); + } + break; + } + case 'TEST': { // TEST MODE + $this->barcode_array['num_rows'] = 5; + $this->barcode_array['num_cols'] = 15; + $this->barcode_array['bcode'] = array( + array(1,1,1,0,1,1,1,0,1,1,1,0,1,1,1), + array(0,1,0,0,1,0,0,0,1,0,0,0,0,1,0), + array(0,1,0,0,1,1,0,0,1,1,1,0,0,1,0), + array(0,1,0,0,1,0,0,0,0,0,1,0,0,1,0), + array(0,1,0,0,1,1,1,0,1,1,1,0,0,1,0)); + break; + } + default: { + $this->barcode_array = false; + } + } + } +} // end of class + +//============================================================+ +// END OF FILE +//============================================================+ +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/CHANGELOG.TXT b/assets/html2pdf/_tcpdf_5.0.002/CHANGELOG.TXT new file mode 100644 index 0000000..fdc2702 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/CHANGELOG.TXT @@ -0,0 +1,1384 @@ +5.0.002 (2010-05-06) + - Bookmark() and related methods were fixed to accept HTML code. + - A problem on HTML links was fixed. + +5.0.001 (2010-05-06) + - Protected method _putstream was re-added for backward compatibility. + - The following method were added to display HTML Table Of Content (see example n. 59): + addTOCPage(), endTOCPage(), addHTMLTOC(). + +5.0.000 (2010-05-05) + - Method ImageSVG() was added to embedd SVG images (see example n. 58). Note that not all SVG images are supported. + - Method setRasterizeVectorImages() was added to enable/disable rasterization for vector images via ImageMagick library. + - Method RoundedRectXY() was added. + - Method PieSectorXY() was added. + - Gradient() method is now public and support new features. + - Shading to transparency is now supported. + - Image alignments were fixed. + - Support for dynamic images were improved. + - PDF_IMAGE_SCALE_RATIO has been changed to 1.25 for better compatibility with SVG. + - RAW and RAW2 modes were added to 2D Barcodes (see example n. 50). + - Automatic padding feature was added on barcodes (see examples n. 27 and 50). + - Bug #2995003 "Reproduced thead bug" was fixed. + - The Output() method now accepts FI and FD destinations to save the document on server before sending it to the client. + - Ellipse() method was improved and fixed (see page 2 of example n. 12). + +-------------------------------------------------------------------------------- + +4.9.018 (2010-04-21) + - Bug item #2990356 "Current font size not respected with more than two HTML <p>" was fixed. + +4.9.017 (2010-04-21) + - Bug item #2990224 "Different behaviour for equivalent HTML strings" was fixed. + - Bug item #2990314 "Dash is not appearing with SHY character" was fixed. + +4.9.016 (2010-04-20) + - An error on htmlcolors.php was fixed. + - getImageFileType() method was improved. + - GIF images with transparency are now better supported. + - Automatic page orientation was improved. + +4.9.015 (2010-04-20) + - A new method copyPage() was added to clone pages (see example n. 44). + - Support for text overline was added. + - Underline and linethrough methods were fixed. + - Bug #2989058 "SHY character causes unnecessary word-wrapping" was fixed. + +4.9.014 (2010-04-18) + - Bug item #2988845 was fixed. + +4.9.013 (2010-04-15) + - Image() and ImageEPS() methods were fixed and improved; $fitonpage parameter was added. + +4.9.012 (2010-04-12) + - The hyphenateText() method was added to automatically hyphenate text (see example n. 46). + +4.9.011 (2010-04-07) + - Vertical alignments for Cell() method were improved (see example n. 57). + +4.9.010 (2010-04-06) + - Signature of Cell() method now includes new parameters for vertical alignment (see example n. 57). + - Text() method was extended to include all Cell() parameters. + - HTML line alignment procedure was changed to fix some bugs. + +4.9.009 (2010-04-05) + - Text() method was fixed for backward compatibility. + +4.9.008 (2010-04-03) + - Additional line space after table header was removed. + - Support for HTML lists in multicolumn mode was added. + - The method setTextRenderingMode() was added to set text rendering modes (see the example n. 26). + - The following HTML attributes were added to set text rendering modes (see the example n. 26): stroke, strokecolor, fill. + +4.9.007 (2010-04-03) + - Font Descent computation was fixed (patch #2981441). + +4.9.006 (2010-04-02) + - The constant K_TCPDF_CALLS_IN_HTML was added on configuration file to enable/disable the ability to call TCPDF methods in HTML. + - The usage of tcpdf tag in HTML mode was changed to remove the possible security flaw offered by the eval() function (thanks to Matthias Hecker for spotting this security problem). See the new example n. 49 for further information. + +4.9.005 (2010-04-01) + - Bug# 2980354 "Wrong File attachment description with security" was fixed. + - Several problems with HTML line alignment were fixed. + - The constant K_THAI_TOPCHAR was added on configuration file to enable/disable the special procedure used to avoid the overlappind of symbols on Thai language. + - A problem with font name directory was fixed. + - A bug on _destroy() method was fixed. + +4.9.004 (2010-03-31) + - Patch #979681 "GetCharWidth - default character width" was applied (bugfix). + +4.9.003 (2010-03-30) + - Problem of first <br /> on multiple columns was fixed. + - HTML line alignment was fixed. + - A QR-code bug was fixed. + +4.9.002 (2010-03-29) + - Patch #2978349 "$ignore_min_height is ignored in function Cell()" was applied. + - Bug #2978607 "2D Barcodes are wrong" was fixed. + - A problem with HTML block tags was fixed. + - Artificial italic for CID-0 fonts was added. + - Several multicolumn bugs were fixed. + - Support for HTML tables on multicolumn was added. + +4.9.001 (2010-03-28) + - QR Code minor bug was fixed. + - Multicolumn mode was added (see the new example n. 10). + - The following methods were added: setEqualColumns(), setColumnsArray(), selectColumn(). + - Thai diacritics support were changed (note that this is incompatible with html justification). + +4.9.000 (2010-03-27) + - QR Code (2D barcode) support was added (see example n. 50). + - The following methods were added to print crop and registration marks (see example n. 56): colorRegistrationBar(), cropMark(), registrationMark(). + - Limited support for CSS line-height property was added. + - Gradient method now supports Gray, RGB and CMYK space color. + - Example n. 51 was updated. + - Vertical alignment of font inside cell was fixed. + - Support for multiple Thai diacritics was added. + - Bug item #2974929 "Duplicate case values" was fixed. + - Bug item #2976729 "File attachment not working with security" was fixed. + +-------------------------------------------------------------------------------- + +4.8.039 (2010-03-20) + - Problems related to custom locale settings were fixed. + - Problems related to HTML on Header and Footer were fixed. + +4.8.038 (2010-03-13) + - Various bugs related to page-break in HTML mode were fixed. + - Bug item #2968974 "Another <thead> pagebreak problem" was fixed. + - Bug item #2969276 "justification problem" was fixed. + - Bug item #2969289 "bug when using justified text and custom headers" was fixed. + - Images are now automatically resized to be contained on the page. + - Some HTML line alignments were fixed. + - Signature of AddPage() and SetMargins() methods were changed to include an option to set default page margins. + +4.8.037 (2010-03-03) + - Bug item #2962068 was fixed. + - Bug item #2967017 "Problems with <thead> and pagebreaks" was fixed. + - Bug item #2967023 "table header lost with pagebreak" was fixed. + - Bug item #2967032 "Header lost with nested tables" was fixed. + +4.8.036 (2010-02-24) + - Automatic page break for HTML images was improved. + - Example 10 was updated. + - Japanese was removed from example 8 because the freeserif font doesn't contain japanese (you can display it using arialunicid0 font). + +4.8.035 (2010-02-23) + - Automatic page break for HTML images was added. + - Support for multicolumn HTML was added (example 10 was updated). + +4.8.034 (2010-02-17) + - Language files were updated. + +4.8.033 (2010-02-12) + - A bug related to protection mode with links was fixed. + +4.8.032 (2010-02-04) + - A bug related to $maxh parameter on Write() and MultiCell() was fixed. + - Support for body tag was added. + +4.8.031 (2010-01-30) + - Bug item #2941589 "paragraph justify not working on some non-C locales" was fixed. + +4.8.030 (2010-01-27) + - Some text alignment cases were fixed. + +4.8.029 (2010-01-27) + - Bug item #2941057 "TOC Error in PDF File Output" was fixed. + - Some text alignment cases were fixed. + +4.8.028 (2010-01-26) + - Text alignment for RTL mode was fixed. + +4.8.027 (2010-01-25) + - Bug item #2938412 "Table related problems - thead, nobr, table width" was fixed. + +4.8.026 (2010-01-19) + - The misspelled word "lenght" was replaced with "length" in some variables and comments. + +4.8.025 (2010-01-18) + - addExtGState() method was improved to reuse existing ExtGState objects. + +4.8.024 (2010-01-15) + - Justification mode for HTML was fixed (Bug item #2932470). + +4.8.023 (2010-01-15) + - Bug item #2932470 "Some HTML entities breaks justification" was fixed. + +4.8.022 (2010-01-14) + - Source code documentation was fixed. + +4.8.021 (2010-01-03) + - A Bug relative to Table Of Content index was fixed. + +4.8.020 (2009-12-21) + - Bug item #2918545 "Display problem of the first row of a table with larger font" was fixed. + - A Bug relative to table rowspan mode was fixed. + +4.8.019 (2009-12-16) + - Bug item #2915684 "Image size" was fixed. + - Bug item #2914995 "Image jpeg quality" was fixed. + - The signature of the Image() method was changed (check the documentation for the $resize parameter). + +4.8.018 (2009-12-15) + - Bug item #2914352 "write error" was fixed. + +4.8.017 (2009-11-27) + - THEAD problem when table is used on header/footer was fixed. + - A first line alignment on HTML justification was fixed. + - Method getImageFileType() was added. + - Images with unknown extension and type are now supported via ImageMagick PHP extension. + +4.8.016 (2009-11-21) + - Document Information Dictionary was fixed. + - CSS attributes 'page-break-before', 'page-break-after' and 'page-break-inside' are now supported. + - Problem of unclosed last page was fixed. + - Problem of 'thead' unnecessarily repeated on the next page was fixed. + +4.8.015 (2009-11-20) + - A problem with some PNG transparency images was fixed. + - Bug #2900762 "Sort issues in Bookmarks" was fixed. + - Text justification was fixed for various modes: underline, strikeout and background. + +4.8.014 (2009-11-04) + - Bug item #2891316 "writeHTML, underlining replacing spaces" was fixed. + - The handling of temporary RTL text direction mode was fixed. + +4.8.013 (2009-10-26) + - Bug item #2884729 "Problem with word-wrap and hyphen" was fixed. + +4.8.012 (2009-10-23) + - Table cell alignments for RTL booklet mode were fixed. + - Images and barcode alignments for booklet mode were fixed. + +4.8.011 (2009-10-22) + - DejaVu fonts were updated to latest version. + +4.8.010 (2009-10-21) + - Bookmark for TOC page was added. + - Signature of addTOC() method is changed. + - Bookmarks are now automatically sorted by page and Y position. + - Example n. 45 was updated. + - Example n. 55 was added to display all charactes available on core fonts. + +4.8.009 (2009-09-30) + - Compatibility with PHP 5.3 was improved. + - All examples were updated. + - Index file for examples was added. + +4.8.008 (2009-09-29) + - Example 49 was updated. + - Underline and linethrough now works with cell stretching mode. + +4.8.007 (2009-09-23) + - Infinite loop problem caused by nobr attribute was fixed. + +4.8.006 (2009-09-23) + - Bug item #2864522 "No images if DOCUMENT_ROOT=='/'" was fixed. + - Support for text-indent CSS attribute was added. + - Method rollbackTransaction() was changed to support self-reassigment of previous object (check source code documentation). + - Support for the HTML "nobr" attribute was added to avoid splitting a table or a table row on two pages (i.e.: <tr nobr="true">...</tr>). + +4.8.005 (2009-09-17) + - A bug relative to multiple transformations and annotations was fixed. + +4.8.004 (2009-09-16) + - A bug on _putannotsrefs() method was fixed. + +4.8.003 (2009-09-15) + - Bug item #2858754 "Division by zero" was fixed. + - A bug relative to HTML list items was fixed. + - A bug relative to form fields on multiple pages was fixed. + - PolyLine() method was added (see example n. 12). + - Signature of Polygon() method was changed. + +4.8.002 (2009-09-12) + - A problem related to CID-0 fonts offset was fixed: if the $cw[1] entry on the CID-0 font file is not defined, then a CID keys offset is introduced. + +4.8.001 (2009-09-09) + - The appearance streams (AP) for anotations form fields was fixed (see examples n. 14 and 54). + - Radiobuttons were fixed. + +4.8.000 (2009-09-07) + - This version includes some support for Forms fields (see example n. 14) and XHTML forms (see example n. 54). + - The following methods were changed to work without JavaScript: TextField(), RadioButton(), ListBox(), ComboBox(), CheckBox(), Button(). + - Support for Widget annotations was improved. + - Alignment of annotation objects was fixed (examples 36 and 41 were updated). + - addJavascriptObject() method was added. + - Signature of Image() method was changed. + - htmlcolors.php file was updated. + +-------------------------------------------------------------------------------- + +4.7.003 (2009-09-03) + - Support for TCPDF methods on HTML was improved (see example n. 49). + +4.7.002 (2009-09-02) + - Bug item #2848892 "writeHTML + table: Gaps between rows" was fixed. + - JavaScript support was fixed (see example n. 53). + +4.7.001 (2009-08-30) + - The Polygon() and Arrow() methods were fixed and improved (see example n. 12). + +4.7.000 (2009-08-29) + - This is a major release. + - Some procedures were internally optimized. + - The problem of mixed signature and annotations was fixed (example n. 52). + +4.6.030 (2009-08-29) + - IMPORTANT: percentages on table cell widths are now relative to the full table width (as in standard HTML). + - Various minor bugs were fixed. + - Example n. 52 (digital signature) was updated. + +4.6.029 (2009-08-26) + - PHP4 version was fixed. + +4.6.028 (2009-08-25) + - Signature algorithm was finally fixed (see example n. 52). + +4.6.027 (2009-08-24) + - TCPDF now supports unembedded TrueTypeUnicode Fonts (just comment the $file entry on the fonts' php file. + +4.6.026 (2009-08-21) + - Bug #2841693 "Problem with MultiCell and ishtml and justification" was fixed. + - Signature functions were improved but not yet fixed (tcpdf.crt and example n. 52 were updated). + +4.6.025 (2009-08-17) + - Carriage returns (\r) were removed from source code. + - Problem related to set_magic_quotes_runtime() depracated was fixed. + +4.6.024 (2009-08-07) + - Bug item #2833556 "justification using other units than mm" was fixed. + - Documentation was fixed/updated. + +4.6.023 (2009-08-02) + - Bug item #2830537 "MirrorH can show mask for transparent PNGs" was fixed. + +4.6.022 (2009-07-24) + - A bug relative to single line printing when using WriteHTMLCell() was fixed. + - Signature support were improved but is still experimental. + - Fonts Free and Dejavu were updated to latest versions. + +4.6.021 (2009-07-20) + - Bug item #2824015 "XHTML Ampersand &amp; in hyperlink bug" was fixed. + - Bug item #2824036 "Image as hyperlink in table, text displaced at page break" was fixed. + - Links alignment on justified text was fixed. + - Unicode "\u" modifier was added to re_spaces variable by default. + +4.6.020 (2009-07-16) + - Bug item #2821921 "issue in example 18" was fixed. + - Signature of SetRTL() method was changed. + +4.6.019 (2009-07-13) + - Bug item #2820703 "xref table broken" was fixed. + +4.6.018 (2009-07-10) + - Bug item #2819319 "Text over text" was fixed. + - Method Arrow() was added to print graphic arrows (example 12 was updated). + +4.6.017 (2009-07-05) + - Bug item #2816079 "Example 48 not working" was fixed. + - The signature of the checkPageBreak() was changed. The parameter $addpage was added to turn off the automatic page creation. + +4.6.016 (2009-06-16) + - Method setSpacesRE() was added to set the regular expression used for detecting withespaces or word separators. If you are using chinese, try: setSpacesRE('/[\s\p{Z}\p{Lo}]/');, otherwise you can use setSpacesRE('/[\s\p{Z}]/'); + - The method _putinfo() now automatically fills the metadata with '?' in case of empty string. + +4.6.015 (2009-06-11) + - Bug #2804667 "word wrap bug" was fixed. + +4.6.014 (2009-06-04) + - Bug #2800931 "Table thead tag bug" was fixed. + - A bug related to <pre> tag was fixed. + +4.6.013 (2009-05-28) + - List bullets position was fixed for RTL languages. + +4.6.012 (2009-05-23) + - setUserRights() method doesn't work anymore unless you call the setSignature() method with the Adobe private key! + +4.6.011 (2009-05-18) + - Signature of the Image() method was changed to include the new $fitbox parameter (see source code documentation). + +4.6.010 (2009-05-17) + - Image() method was improved: now is possible to specify the maximum dimensions for a constraint box defined by $w and $h parameters, and setting the $resize parameter to null. + - <tcpdf> tag indent problem was fixed. + - $y parameter was added to checkPageBreak() method. + - Bug n. 2791773 "writeHTML" was fixed. + +4.6.009 (2009-05-13) + - xref table for embedded files was fixed. + +4.6.008 (2009-05-07) + - setSignature() method was improved (but is still experimental). + - Example n. 52 was added. + +4.6.007 (2009-05-05) + - Bug #2786685 "writeHtmlCell and <br /> in custom footer" was fixed. + - Table header repeating bug was fixed. + - Some newlines and tabs are now automatically removed from HTML strings. + +4.6.006 (2009-04-28) + - Support for "<a name="...">...</a>" was added. + - By default TCPDF requires PCRE Unicode support turned on but now works also without it (with limited ability to detect some Unicode blank spaces). + +4.6.005 (2009-04-25) + - Points (pt) conversion in getHTMLUnitToUnits() was fixed. + - Default tcpdf.pem certificate file was added. + - Experimental support for signing document was added but it is not yet completed (some help is needed - I think that the calculation of the ByteRange is OK and the problem is on the signature calculation). + +4.6.004 (2009-04-23) + - Method deletePage() was added to delete pages (see example n. 44). + +4.6.003 (2009-04-21) + - The caching mechanism of the UTF8StringToArray() method was fixed. + +4.6.002 (2009-04-20) + - Documentation of rollbackTransaction() method was fixed. + - The setImageScale() and getImageScale() methods now set and get the adjusting parameter used by pixelsToUnits() method. + - HTML images now support other units of measure than pixels (getHTMLUnitToUnits() is now used instead of pixelsToUnits()). + - WARNING: PDF_IMAGE_SCALE_RATIO has been changed by default to 1. + +4.6.001 (2009-04-17) + - Spaces between HTML block tags are now automatically removed. + - The bug related to cMargin changes between tables was fixed. + +4.6.000 (2009-04-16) + - WARNING: THIS VERSION CHANGES THE BEHAVIOUR OF $x and $y parameters for several TCPDF methods: + zero coordinates for $x and $y are now valid coordinates; + set $x and $y as empty strings to get the current value. + - Some error caused by 'empty' funtion were fixed. + - Default color for convertHTMLColorToDec() method was changed to white and the return value for invalid color is false. + - HTML on footer bug was fixed. + - The following examples were fixed: 5,7,10,17,19,20,21,33,42,43. + +4.5.043 (2009-04-15) + - Barcode class (barcode.php) was extended to include new linear barcode types (see example n. 27): + C39 : CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9 + C39+ : CODE 39 with checksum + C39E : CODE 39 EXTENDED + C39E+ : CODE 39 EXTENDED + CHECKSUM + C93 : CODE 93 - USS-93 + S25 : Standard 2 of 5 + S25+ : Standard 2 of 5 + CHECKSUM + I25 : Interleaved 2 of 5 + I25+ : Interleaved 2 of 5 + CHECKSUM + C128A : CODE 128 A + C128B : CODE 128 B + C128C : CODE 128 C + EAN2 : 2-Digits UPC-Based Extention + EAN5 : 5-Digits UPC-Based Extention + EAN8 : EAN 8 + EAN13 : EAN 13 + UPCA : UPC-A + UPCE : UPC-E + MSI : MSI (Variation of Plessey code) + MSI+ : MSI + CHECKSUM (modulo 11) + POSTNET : POSTNET + PLANET : PLANET + RMS4CC : RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code) + KIX : KIX (Klant index - Customer index) + IMB: Intelligent Mail Barcode - Onecode - USPS-B-3200 (NOTE: requires BCMath PHP extension) + CODABAR : CODABAR + CODE11 : CODE 11 + PHARMA : PHARMACODE + PHARMA2T : PHARMACODE TWO-TRACKS + +4.5.042 (2009-04-15) + - Method Write() was fixed for the strings containing only zero value. + +4.5.041 (2009-04-14) + - Barcode methods were fixed. + +4.5.040 (2009-04-14) + - Method Write() was fixed to handle empty strings. + +4.5.039 (2009-04-11) + - Support for linear barcodes was extended (see example n. 27 and barcodes.php documentation). + +4.5.038 (2009-04-10) + - Write() method was improved to support separators for Japanese, Korean, Chinese Traditional and Chinese Simplified. + +4.5.037 (2009-04-09) + - General performances were improved. + - The signature of the method utf8Bidi() was changed. + - The method UniArrSubString() was added. + - Experimental support for 2D barcodes were added (see example n. 50 and 2dbarcodes.php class). + +4.5.036 (2009-04-03) + - TCPDF methods can be called inside the HTML code (see example n. 49). + - All tag attributes, such as <p align="center"> must be enclosed within double quotes. + +4.5.035 (2009-03-28) + - Bug #2717436 "writeHTML rowspan problem (continued)" was fixed. + - Bug #2719090 "writeHTML fix follow up" was fixed. + - The method _putuserrights() was changed to avoid Adobe Reader 9.1 crash. This broken the 'trick' that was used to display forms in Acrobat Reader. + +4.5.034 (2009-03-27) + - Bug #2716914 "Bug writeHTML of a table in body and footer related with pb" was fixed. + - Bug #2717056 ] "writeHTML problem when setting tr style" was fixed. + - The signature of the Cell() method was changed. + +4.5.033 (2009-03-27) + - The support for rowspan/colspan on HTML tables was improved (see example n. 48). + +4.5.032 (2009-03-23) + - setPrintFooter(false) bug was fixed. + +4.5.031 (2009-03-20) + - Table header support was extended to multiple pages. + +4.5.030 (2009-03-20) + - thead tag is now supported on HTML tables (header rows are repeated after page breaks). + - The startTransaction() was improved to autocommit. + - List bullets now uses the foreground color (putHtmlListBullet()). + +4.5.029 (2009-03-19) + - The following methods were added to UNDO commands (see example 47): startTransaction(), commitTransaction(), rollbackTransaction(). + - All examples were updated. + +4.5.028 (2009-03-18) + - Bug #2690945 "List Bugs" was fixed. + - HTML text alignment on lists was fixed. + - The constant PDF_FONT_MONOSPACED was added to the configuration file to define the default monospaced font. + - The following methods were fixed: getPageWidth(), getPageHeight(), getBreakMargin(). + - All examples were updated. + +4.5.027 (2009-03-16) + - Method getPageDimensions() was added to get page dimensions. + - The signature of the following methos were changed: getPageWidth(), getPageHeight(), getBreakMargin(). + - _parsepng() method was fixed for PNG URL images (fread bug). + +4.5.026 (2009-03-11) + - Bug #2681793 affecting URL images with spaces was fixed. + +4.5.025 (2009-03-10) + - A small bug affecting hyphenation support was fixed. + - The method SetDefaultMonospacedFont() was added to define the default monospaced font. + +4.5.024 (2009-03-07) + - The bug #2666493 was fixed "Footer corrupts document". + +4.5.023 (2009-03-06) + - The bug #2666688 was fixed "Rowspan in tables". + +4.5.022 (2009-03-05) + - The bug #2659676 was fixed "refer to #2157099 test 4 < BR > problem still not fixed". + - addTOC() function bug was fixed. + +4.5.020 (2009-03-03) + - The following bug was fixed: "function removeSHY corrupts unicode". + +4.5.019 (2009-02-28) + - The problem of decimal separator using different locale was fixed. + - The text hyphenation is now supported (see example n. 46). + +4.5.018 (2009-02-26) + - The _destroy() method was added to unset all class variables and frees memory. + - Now it's possible to call Output() method multiple times. + +4.5.017 (2009-02-24) + - A minor bug that raises a PHP warning was fixed. + +4.5.016 (2009-02-24) + - Bug item #2631200 "getNumLines() counts wrong" was fixed. + - Multiple attachments bug was fixed. + - All class variables are now cleared on Output() for memory otpimization. + +4.5.015 (2009-02-18) + - Bug item #2612553 "function Write() must not break a line on &nbsp; character" was fixed. + +4.5.014 (2009-02-13) + - Bug item #2595015 "POSTNET Barcode Checksum Error" was fixed (on barcode.php). + - Pagebreak bug for barcode was fixed. + +4.5.013 (2009-02-12) + - border attribute is now supported on HTML images (only accepts the same values accepted by Cell()). + +4.5.012 (2009-02-12) + - An error on image border feature was fixed. + +4.5.011 (2009-02-12) + - HTML links for images are now supported. + - height attribute is now supported on HTML cells. + - $border parameter was added to Image() and ImageEps() methods. + - The method getNumLines() was added to estimate the number of lines required for the specified text. + +4.5.010 (2009-01-29) + - Bug n. 2546108 "BarCode Y position" was fixed. + +4.5.009 (2009-01-26) + - Bug n. 2538094 "Empty pdf file created" was fixed. + +4.5.008 (2009-01-26) + - setPage() method was fixed to correctly restore graphic states. + - Source code was cleaned up for performances. + +4.5.007 (2009-01-24) + - checkPageBreak() and write1DBarcode() methods were fixed. + - Source code was cleaned up for performances. + - barcodes.php was updated. + +4.5.006 (2009-01-23) + - getHTMLUnitToPoints() method was replaced by getHTMLUnitToUnits() to fix HTML units bugs. + +4.5.005 (2009-01-23) + - Page closing bug was fixed. + +4.5.004 (2009-01-21) + - The access of convertHTMLColorToDec() method was changed to public + - Fixed bug on UL tag. + +4.5.003 (2009-01-19) + - Fonts on different folders are now supported. + +4.5.002 (2009-01-07) + - addTOC() function was improved (see example n. 45). + +4.5.001 (2009-01-04) + - The signature of startPageGroup() function was changed. + - Method Footer() was improved to automatically print page or page-group number (see example n. 23). + - Protected method formatTOCPageNumber() was added to customize the format of page numbers on the Table Of Content. + - The signature of addTOC() was changed to include the font used for page numbers. + +4.5.000 (2009-01-03) + - A new $diskcache parameter was added to class constructor to enable disk caching and reduce RAM memory usage (see example n. 43). + - The method movePageTo() was added to move pages to previous positions (see example n. 44). + - The methods getAliasNumPage() and getPageNumGroupAlias() were added to get the alias for page number (needed when using movepageTo()). + - The methods addTOC() was added to print a Table Of Content (see example n. 45). + - Imagick class constant was removed for better compatibility with PHP4. + - All existing examples were updated and new examples were added. + +4.4.009 (2008-12-29) + - Examples 1 and 35 were fixed. + +4.4.008 (2008-12-28) + - Bug #2472169 "Unordered bullet size not adjusted for unit type" was fixed. + +4.4.007 (2008-12-23) + - Bug #2459935 "no unit conversion for header line" was fixed. + - Example n. 42 for image alpha channel was added. + - All examples were updated. + +4.4.006 (2008-12-11) + - Method setLIsymbol() was changed to reflect latest changes in HTML list handling. + +4.4.005 (2008-12-10) + - Bug item #2413870 "ordered list override value" was fixed. + +4.4.004 (2008-12-10) + - The protected method getHTMLUnitToPoints() was added to accept various HTML units of measure (em, ex, px, in, cm, mm, pt, pc, %). + - The method intToRoman() was added to convert integer number to Roman representation. + - Support fot HTML lists was improved: the CSS property list-style-type is now supported. + +4.4.003 (2008-12-09) + - Bug item #2412147 "Warning on line 3367" was fixed. + - Method setHtmlLinksStyle() was added to set default HTML link colors and font style. + - Method addHtmlLink() was changed to use color and style defined on the inline CSS. + +4.4.002 (2008-12-09) + - Borders on Multicell() were fixed. + - Problem of Multicell() on Header function (Bug item #2407579) was fixed. + - Problem on graphics tranformations applied to Multicell() was fixed. + - Support for ImageMagick was added. + - Width calculation for nested tables was fixed. + +4.4.001 (2008-12-08) + - Some missing core fonts were added on fonts directory. + - CID0 fonts rendering was fixed. + - HTML support was improved (<pre> and <tt> tags are now supported). + - Bug item #2406022 "Left padding bug in MultiCell with maxh" was fixed. + +4.4.000 (2008-12-07) + - File attachments are now supported (see example n. 41). + - Font functions were optimized to reduce document size. + - makefont.php was updated. + - Linux binaries were added on /fonts/utils + - All fonts were updated. + - $autopadding parameter was added to Multicell() to disable automatic padding features. + - $maxh parameter was added to Multicell() and Write() to set a maximum height. + +4.3.009 (2008-12-05) + - Bug item #2392989 (Custom header + setlinewidth + cell border bug) was fixed. + +4.3.008 (2008-12-05) + - Bug item #2390566 "rect bug" was fixed. + - File path was fixed for font embedded files. + - SetFont() method signature was changed to include the font filename. + - Some font-related methods were improved. + - Methods getFontFamily() and getFontStyle() were added. + +4.3.007 (2008-12-03) + - PNG alpha channel is now supported (GD library is required). + - AddFont() function now support custom font file path on $file parameter. + - The default width variable ($dw) is now always defined for any font. + - The 'Style' attribute on CID-0 fonts was removed because of protection bug. + +4.3.006 (2008-12-01) + - A regular expression on getHtmlDomArray() to find HTML tags was fixed. + +4.3.005 (2008-11-25) + - makefont.php was fixed. + - Bug item #2339877 was fixed (false loop condition detected on WriteHTML()). + - Bug item #2336733 was fixed (lasth value update on Multicell() when border and fill are disabled). + - Bug item #2342303 was fixed (automatic page-break on Image() and ImageEPS()). + +4.3.004 (2008-11-19) + - Function _textstring() was fixed (bug 2309051). + - All examples were updated. + +4.3.003 (2008-11-18) + - CID-0 font bug was fixed. + - Some functions were optimized. + - Function getGroupPageNoFormatted() was added. + - Example n. 23 was updated. + +4.3.002 (2008-11-17) + - Bug item #2305518 "CID-0 font don't work with encryption" was fixed. + +4.3.001 (2008-11-17) + - Bug item #2300007 "download mimetype pdf" was fixed. + - Double quotes were replaced by single quotes to improve PHP performances. + - A bug relative to HTML cell borders was fixed. + +4.3.000 (2008-11-14) + - The function setOpenCell() was added to set the top/bottom cell sides to be open or closed when the cell cross the page. + - A bug relative to list items indentation was fixed. + - A bug relative to borders on HTML tables and Multicell was fixed. + - A bug relative to rowspanned cells was fixed. + - A bug relative to html images across pages was fixed. + +4.2.009 (2008-11-13) + - Spaces between li tags are now automatically removed. + +4.2.008 (2008-11-12) + - A bug relative to fill color on next page was fixed. + +4.2.007 (2008-11-12) + - The function setListIndentWidth() was added to set custom indentation widht for HTML lists. + +4.2.006 (2008-11-06) + - A bug relative to HTML justification was fixed. + +4.2.005 (2008-11-06) + - A bug relative to HTML justification was fixed. + - The methods formatPageNumber() and PageNoFormatted() were added to format page numbers. + - Default Footer() method was changed to use PageNoFormatted() instead of PageNo(). + - Example 6 was updated. + +4.2.004 (2008-11-04) + - Bug item n. 2217039 "filename handling improvement" was fixed. + +4.2.003 (2008-10-31) + - Font style bug was fixed. + +4.2.002 (2008-10-31) + - Bug item #2210922 (htm element br not work) was fixed. + - Write() function was improved to support margin changes. + +4.2.001 (2008-10-30) + - setHtmlVSpace($tagvs) function was added to set custom vertical spaces for HTML tags. + - writeHTML() function now support margin changes during execution. + - Signature of addHTMLVertSpace() function is changed. + +4.2.000 (2008-10-29) + - htmlcolors.php was changed to support class-loaders. + - ImageEps() function was improved in performances. + - Signature of Link() And Annotation() functions were changed. + - (Bug item #2198926) Links and Annotations alignment were fixed (support for geometric tranformations was added). + - rowspan mode for HTML table cells was improved and fixed. + - Booklet mode for double-sided pages was added; see SetBooklet() function and example n. 40. + - lastPage() signature is changed. + - Signature of Write() function is changed. + - Some HTML justification problems were fixed. + - Some functions were fixed to better support RTL mode. + - Example n. 10 was changed to support RTL mode. + - All examples were updated. + +4.1.004 (2008-10-23) + - unicode_data.php was changed to support class-loaders. + - Bug item #2186040/2 (writeHTML margin problem) was fixed. + +4.1.003 (2008-10-22) + - Bug item #2185399 was fixed (rowspan and page break). + - Bugs item #2186040 was fixed (writeHTML margin problem). + - Newline after table was removed. + +4.1.002 (2008-10-21) + - Bug item #2184525 was fixed (rowspan on HTML cell). + +4.1.001 (2008-10-21) + - Support for "start" attribute was added to HTML ordered list. + - unicode_data.php file was changed to include UTF-8 to ASCII table. + - Some functions were modified to better support UTF-8 extensions to core fonts. + - Support for images on HTML lists was improved. + - Examples n. 1 and 6 were updated. + +4.1.000 (2008-10-18) + - Page-break bug using HTML content was fixed. + - The "false" parameter was reintroduced to class_exists function on PHP5 version to avoid autoload. + - addHtmlLink() function was improved to support internal links (i.e.: <a href="#23">link to page 23</a>). + - Justification alignment is now supported on HTML (see example n. 39). + - example_006.php was updated. + +4.0.033 (2008-10-13) + - Bug n. 2157099 was fixed. + - SetX() and SetY() functions were improved. + - SetY() includes a new parameter to avoid the X reset. + +4.0.032 (2008-10-10) + - Bug n. 2156926 was fixed (bold, italic, underlined, linethrough). + - setStyle() method was removed. + - Configuration file was changed to use helvetica (non-unicode) font by default. + - The use of mixed font types was improved. + - All examples were updated. + +4.0.031 (2008-10-09) + - _putannots() and _putbookmarks() links alignments were fixed. + +4.0.030 (2008-10-07) + - _putbookmarks() function was fixed. + - _putannots() was fixed to include internal links. + +4.0.029 (2008-09-27) + - Infinite loop bug was fixed [Bug item #130309]. + - Multicell() problem on Header() was fixed. + +4.0.028 (2008-09-26) + - setLIsymbol() was added to set the LI symbol used on UL lists. + - Missing $padding and $encryption_key variables declarations were added [Bug item #2129058]. + +4.0.027 (2008-09-19) + - Bug #2118588 "Undefined offset in tcpdf.php on line 9581" was fixed. + - arailunicid0.php font was updated. + - The problem of javascript form fields duplication after saving was fixed. + +4.0.026 (2008-09-17) + - convertHTMLColorToDec() function was improved to support rgb(RR,GG,BB) notation. + - The following inline CSS attributes are now supported: text-decoration, color, background-color and font-size names: xx-small, x-small, small, medium, large, x-large, xx-large + - Example n. 6 was updated. + +4.0.025 (2008-09-15) + - _putcidfont0 function was improved to include CJK fonts (Chinese, Japanese, Korean, CJK, Asian fonts) without embedding. + - arialunicid0 font was added (see the new example n. 38). + - The following Unicode to CID-0 tables were added on fonts folder: uni2cid_ak12.php, uni2cid_aj16.php, uni2cid_ag15.php, uni2cid_ac15.php. + +4.0.024 (2008-09-12) + - "stripos" function was replaced with "strpos + strtolower" for backward compatibility with PHP4. + - support for Spot Colors were added. Check the new example n. 37 and the following new functions: + AddSpotColor() + SetDrawSpotColor() + SetFillSpotColor() + SetTextSpotColor() + _putspotcolors() + - Bookmark() function was improved to fix wrong levels. + - $lasth changes after header/footer calls were fixed. + +4.0.023 (2008-09-05) + - Some HTML related problems were fixed. + - Image alignment on HTML was changed, now it always defaults to the normal mode (see example_006.php). + +4.0.022 (2008-08-28) + - Line height on HTML was fixed. + - Image inside an HTML cell problem was fixed. + - A new "zarbold" persian font was added. + +4.0.021 (2008-08-24) + - HTTP headers were fixed on Output function(). + - getAliasNbPages() and getPageGroupAlias() functions were changed to support non-unicode fonts on unicode documents. + - Function Write() was fixed. + - The problem of additional vertical spaces on HTML was fixed. + - The problem of frame around HTML links was fixed. + +4.0.020 (2008-08-15) + - "[2052259] WriteHTML <u> & <b>" bug was fixed. + +4.0.019 (2008-08-13) + - "Rowspan on first cell" bug was fixed. + +4.0.018 (2008-08-08) + - Default cellpadding for HTML tables was fixed. + - Annotation() function was added to support some PDF annotations (see example_036.php and section 8.4 of PDF reference 1.7). + - HTML links are now correclty shifted during line alignments. + - function getAliasNbPages() was added and Footer() was updated. + - RowSpan mode for HTML tables was fixed. + - Bugs item #2043610 "Multiple sizes vertical align wrong" was fixed. + - ImageEPS() function was improved and RTL alignment was fixed (see example_032.php). + +4.0.017 (2008-08-05) + - Missing CNZ and CEO style modes were added to Rect() function. + - Fonts utils were updated to include support for OpenType fonts. + - getLastH() function was added. + +4.0.016 (2008-07-30) + - setPageMark() function was added. This function must be called after calling Image() function for a background image. + +4.0.015 (2008-07-29) + - Some functions were changed to support different page formats (see example_028.php). + - The signature of setPage() function is changed. + +4.0.014 (2008-07-29) + - K_PATH_MAIN calculation on tcpdf_config.php was fixed. + - HTML support for EPS/AI images was added (see example_006.php). + - Bugs item #2030807 "Truncated text on multipage html fields" was fixed. + - PDF header bug was fixed. + - helvetica was added as default font family. + - Stroke mode was fixed on Text function. + - several minor bugs were fixed. + +4.0.013 (2008-07-27) + - Bugs item #2027799 " Big spaces between lines after page break" was fixed. + - K_PATH_MAIN calculation on tcpdf_config.php was changed. + - Function setVisibility() was fixed to avoid the "Incorrect PDEObject type" error message. + +4.0.012 (2008-07-24) + - Addpage(), Header() and Footer() functions were changed to simplify the implementation of external header/footer functions. + - The following functions were added: + setHeader() + setFooter() + getImageRBX() + getImageRBY() + getCellHeightRatio() + getHeaderFont() + getFooterFont() + getRTL() + getBarcode() + getHeaderData() + getHeaderMargin() + getFooterMargin() + +4.0.011 (2008-07-23) + - Font support was improved. + - The folder /fonts/utils contains new utilities and instructions for embedd font files. + - Documentation was updated. + +4.0.010 (2008-07-22) + - HTML tables were fixed to work across pages. + - Header() and Footer() functions were updated to preserve previous settings. + - example_035.php was added. + +4.0.009 (2008-07-21) + - UTF8StringToArray() function was fixed for non-unicode mode. + +4.0.008 (2008-07-21) + - Barcodes alignment was fixed (see example_027.php). + - unicode_data.php was updated. + - Arabic shaping for "Zero-Width Non-Joiner" character (U+200C) was fixed. + +4.0.007 (2008-07-18) + - str_split was replaced by preg_split for compatibility with PHP4 version. + - Clipping mode was added to all graphic functions by using parameter $style = "CNZ" or "CEO" (see example_034.php). + +4.0.006 (2008-07-16) + - HTML rowspan bug was fixed. + - Line style for MultiCell() was fixed. + - WriteHTML() function was improved. + - CODE128C barcode was fixed (barcodes.php). + +4.0.005 (2008-07-11) + - Bug [2015715] "PHP Error/Warning" was fixed. + +4.0.004 (2008-07-09) + - HTML cell internal padding was fixed. + +4.0.003 (2008-07-08) + - Removed URL encoding when F option is selected on Output() function. + - fixed some minor bugs in html tables. + +4.0.002 (2008-07-07) + - Bug [2000861] was still unfixed and has been fixed. + +4.0.001 (2008-07-05) + - Bug [2000861] was fixed. + +4.0.000 (2008-07-03) + - THIS IS A MAIN RELEASE THAT INCLUDES SEVERAL NEW FEATURES AND BUGFIXES + - Signature fo SetTextColor() and SetFillColor() functions was changed (parameter $storeprev was removed). + - HTML support was completely rewritten and improved (see example 6). + - Alignments parameters were fixed. + - Functions GetArrStringWidth() and GetStringWidth() now include font parameters. + - Fonts support was improved. + - All core fonts were replaced and moved to fonts/ directory. + - The following functions were added: getMargins(), getFontSize(), getFontSizePt(). + - File config/tcpdf_config_old.php was renamed tcpdf_config_alt.php and updated. + - Multicell and WriteHTMLCell fill function was fixed. + - Several minor bugs were fixed. + - barcodes.php was updated. + - All examples were updated. + +------------------------------------------------------------ + +3.1.001 (2008-06-13) + - Bug [1992515] "K_PATH_FONTS default value wrong" was fixed. + - Vera font was removed, DejaVu font and Free fonts were updated. + - Image handling was improved. + - All examples were updated. + +3.1.000 (2008-06-11) + - setPDFVersion() was added to change the default PDF version (currently 1.7). + - setViewerPreferences() was added to control the way the document is to be presented on the screen or printed (see example 29). + - SetDisplayMode() signature was changed (new options were added). + - LinearGradient(), RadialGradient(), CoonsPatchMesh() functions were added to print various color gradients (see example 30). + - PieSector() function was added to render render pie charts (see example 31). + - ImageEps() was added to display EPS and AI images with limited support (see example 32). + - writeBarcode() function is now depracated, a new write1DBarcode() function was added. The barcode directory was removed and a new barcodes.php file was added. + - The new write1DBarcode() function support more barcodes and do not need the GD library (see example 027). All barcodes are directly written to PDF using graphic functions. + - HTML lists were improved and could be nested (you may now represent trees). + - AddFont() bug was fixed. + - _putfonts() bug was fixed. + - graphics functions were fixed. + - unicode_data.php file was updated (fixed). + - almohanad font was updated. + - example 18 was updated (Farsi and Arabic languages). + - source code cleanup. + - All examples were updated and new examples were added. + +3.0.015 (2008-06-06) + - AddPage() function signature is changed to include page format. + - example 28 was added to show page format changes. + - setPageUnit() function was added to change the page units of measure. + - setPageFormat() function was added to change the page format and orientation between pages. + - setPageOrientation() function was added to change the page orientation. + - Arabic font shaping was fixed for laa letter and square boxes (see the example 18). + +3.0.014 (2008-06-04) + - Arabic font shaping was fixed. + - setDefaultTableColumns() function was added. + - $cell_height_ratio variable was added. + - setCellHeightRatio() function was added to define the default height of cell repect font height. + +3.0.013 (2008-06-03) + - Multicell height parameter was fixed. + - Arabic font shaping was improved. + - unicode_data.php was updated. + +3.0.012 (2008-05-30) + - K_PATH_MAIN and K_PATH_URL constants are now automatically set on config file. + - DOCUMENT_ROOT constant was fixed for IIS Webserver (config file was updated). + - Arabic font shaping was improved. + - TranslateY() function was fixed (bug [1977962]). + - setVisibility() function was fixed. + - writeBarcode() function was fixed to scale using $xref parameter. + - All examples were updated. + +3.0.011 (2008-05-23) + - CMYK color support was added to all graphic functions. + - HTML table support was improved: + -- now it's possible to include additional html tags inside a cell; + -- colspan attribute was added. + - example 006 was updated. + +3.0.010 (2008-05-21) + - fixed $laa_array inclusion on utf8Bidi() function. + +3.0.009 (2008-05-20) + - unicode_data.php was updated. + - Arabic laa letter problem was fixed. + +3.0.008 (2008-05-12) + - Arabic support was fixed and improved (unicode_data.php was updated). + - Polycurve() function was added to draw a poly-Bezier curve. + - list items alignment was fixed. + - example 6 was updated. + +3.0.007 (2008-05-06) + - Arabic support was fixed and improved. + - AlMohanad (arabic) font was added. + - C128 barcode bugs were fixed. + +3.0.006 (2008-04-21) + - Condition to check negative width values was added. + +3.0.005 (2008-04-18) + - back-Slash character escape was fixed on writeHTML() function. + - Exampe 6 was updated. + +3.0.004 (2008-04-11) + - Bug [1939304] (Right to Left Issue) was fixed. + +3.0.003 (2008-04-07) + - Bug [1934523](Words between HTML tags in cell not kept on one line) was fixed. + - "face" attribute of "font" tag is now fully supported. + +3.0.002 (2008-04-01) + - Write() functions now return the number of cells and not the number of lines. + - TCPDF is released under LGPL 2.1, or any later version. + +3.0.001 (2008-05-28) + - _legacyparsejpeg() and _legacyparsepng() were renamed _parsejpeg() and _parsepng(). + - function writeBarcode() was fixed. + - all examples were updated. + - example 27 was added to show various barcodes. + +3.0.000 (2008-03-27) + - private function pixelsToMillimeters() was changed to public function pixelsToUnits() to fix html image size bug. + - Image-related functions were rewritten. + - resize parameter was added to Image() signature to reduce the image size and fit width and height (see example 9). + - TCPDF now supports all images supported by GD library: GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM. + - CMYK support was added to SetDrawColor(), SetFillColor(), SetTextColor() (see example 22). + - Page Groups were added (see example 23). + - setVisibility() function was added to restrict the rendering of some elements to screen or printout (see example 24). + - All private variables and functions were changed to protected. + - setAlpha() function was added to give transparency support for all objects (see example 25). + - Clipping and stroke modes were added to Text() function (see example 26). + - All examples were moved to "examples" directory. + - function setJPEGQuality() was added to set the JPEG image comrpession (see example 9). + +2.9.000 (2008-03-26) + - htmlcolors.php file was added to include html colors. + - Support for HTML color names and three-digit hexadecimal color codes was added. + - private function convertColorHexToDec() was renamed convertHTMLColorToDec(). + - color and bgcolor attributes are now supported on all HTML tags (color nesting is also supported). + - Write() function were fixed. + - example_006.php was updated. + - private function setUserRights() was added to release user rights on Acrobat Reader (this allows to display forms, see example 14) + +2.8.000 (2008-03-20) + - Private variables were changed to protected. + - Function Write() was fixed and improved. + - Support for dl, dt, dd, del HTML tags was introduced. + - Line-trought mode was added for HTML and text. + - Text vertical alignment on cells were fixed. + - Examples were updated to reflect changes. + +2.7.002 (2008-03-13) + - Bug "[1912142] Encrypted PDF created/modified date" was fixed. + +2.7.001 (2008-03-10) + - Cell justification was fixed for non-unicode mode. + +2.7.000 (2008-03-09) + - Cell() stretching mode 4 (forced character spacing) was fixed. + - writeHTMLCell() now uses Multicell() to write. + - Multicell() has a new parameter $ishtml to act as writeHTMLCell(). + - Write() speed was improved for non-arabic strings. + - Example n. 20 was changed. + +2.6.000 (2008-03-07) + - various alignments bugs were fixed. + +2.5.000 (2008-03-07) + - Several bugs were fixed. + - example_019.php was added to test non-unicode mode using old fonts. + +2.4.000 (2008-03-06) + - RTL support was deeply improved. + - GetStringWidth() was fixed to support RTL languages. + - Text() RTL alignment was fixed. + - Some functions were added: GetArrStringWidth(), GetCharWidth(), uniord(), utf8Bidi(). + - example_018.php was added and test_unicode.php was removed. + +2.3.000 (2008-03-05) + - MultiCell() signature is changed. Now support multiple columns across pages (see example_017). + - Write() signature is changed. Now support the cell mode to be used with MultiCell. + - Header() and Footer() were changed. + - The following functions were added: UTF8ArrSubString() and unichr(). + - Examples were updated to reflect last changes. + +2.2.004 (2008-03-04) + - Several examples were added. + - AddPage() Header() and Footer() were fixed. + - Documentation is now available on http://www.tcpdf.org + +2.2.003 (2008-03-03) + - [1894853] Performance of MultiCell() was improved. + - RadioButton and ListBox functions were added. + - javascript form functions were rewritten and properties names are changed. The properties function supported by form fields are listed on Possible values are listed on http://www.adobe.com/devnet/acrobat/pdfs/js_developer_guide.pdf. + +2.2.002 (2008-02-28) + - [1900495] html images path was fixed. + - Legacy image functions were reintroduced to allow PNG and JPEG support without GD library. + +2.2.001 (2008-02-16) + - The bug "[1894700] bug with replace relative path" was fixed + - Justification was fixed + +2.2.000 (2008-02-12) + - fixed javascript bug introduced with latest release + +2.1.002 (2008-02-12) + - Justify function was fixed on PHP4 version. + - Bookmank function was added ([1578250] Table of contents). + - Javascript and Form fields support was added ([1796359] Form fields). + +2.1.001 (2008-02-10) + - The bug "[1885776] Race Condition in function justitfy" was fixed. + - The bug "[1890217] xpdf complains that pdf is incorrect" was fixed. + +2.1.000 (2008-01-07) + - FPDF_FONTPATH constant was changed to K_PATH_FONTS on config file + - Bidirectional Algorithm to correctly reverse bidirectional languages was added. + - SetLeftMargin, SetTopMargin, SetRightMargin functions were fixed. + - SetCellPadding function was added. + - writeHTML was updated with new parameters. + - Text function was fixed. + - MultiCell function was fixed, now works also across multiple pages. + - Line width was fixed on Header and Footer functions and <hr> tag. + - "GetImageSize" was renamed "getimagesize". + - Document version was changed from 1.3 to 1.5. + - _begindoc() function was fixed. + - ChangeDate was fixed and ModDate was added. + - The following functions were added: + setPage() : Move pointer to the specified document page. + getPage() : Get current document page number. + lastpage() : Reset pointer to the last document page. + getNumPages() : Get the total number of inserted pages. + GetNumChars() : count the number of (UTF-8) characters in a string. + - $stretch parameter was added to Cell() function to fit text on cell: + 0 = disabled + 1 = horizontal scaling only if necessary + 2 = forced horizontal scaling + 3 = character spacing only if necessary + 4 = forced character spacing + - Line function was fixed for RTL. + - Graphic transformation functions were added [1811158]: + StartTransform() + StopTransform() + ScaleX() + ScaleY() + ScaleXY() + Scale() + MirrorH() + MirrorV() + MirrorP() + MirrorL() + TranslateX() + TranslateY() + Translate() + Rotate() + SkewX() + SkewY() + Skew() + - Graphic function were added/updated [1688549]: + SetLineStyle() + _outPoint() + _outLine() + _outRect() + _outCurve() + Line() + Rect() + Curve + Ellipse + Circle + Polygon + RegularPolygon + +2.0.000 (2008-01-04) + - RTL (Right-To-Left) languages support was added. Language direction is set using the $l['a_meta_dir'] setting on /configure/language/xxx.php language files. + - setRTL($enable) method was added to manually enable/disable the RTL text direction. + - The attribute "dir" was added to support custom text direction on HTML tags. Possible values are: ltr - for Left-To-Right and RTL for Right-To-Left. + - RC4 40bit encryption was added. Check the SetProtection method. + - [1815213] Improved image support for GIF, JPEG, PNG formats. + - [1800094] Attribute "value" was added to ordered list items <li>. + - Image function now has a new "align" parameter that indicates the alignment of the pointer next to image insertion and relative to image height. The value can be: + T: top-right for LTR or top-left for RTL + M: middle-right for LTR or middle-left for RTL + B: bottom-right for LTR or bottom-left for RTL + N: next line + - Attribute "align" was added to <img> html tag to set the above image "align" parameter. Possible values are: + top: top-right for LTR or top-left for RTL + middle: middle-right for LTR or middle-left for RTL + bottom: bottom-right for LTR or bottom-left for RTL + - [1798103] newline was added after </ul>, </ol> and </p> tages. + - [1816393] Documentation was updated. + - 'ln' parameter was fixed on writeHTMLCell. Now it's possible to print two or more columns across several pages; + - The method lastPage() was added to move the pointer on the last page; + +------------------------------------------------------------ + +1.53.0.TC034 (2007-07-30) + - fixed htmlentities conversion. + - MultiCell() function returns the number of cells. + +1.53.0.TC033 (2007-07-30) + - fixed bug 1762550: case sensitive for font files + - NOTE: all fonts files names must be in lowercase! + +1.53.0.TC032 (2007-07-27) + - setLastH method was added to resolve bug 1689071. + - all fonts names were converted in lowercase (bug 1713005). + - bug 1740954 was fixed. + - justification was added as Cell option. + +1.53.0.TC031 (2007-03-20) + - ToUnicode CMap were added on _puttruetypeunicode function. Now you may search and copy unicode text. + +1.53.0.TC030 (2007-03-06) + - fixed bug on PHP4 version. + +1.53.0.TC029 (2007-03-06) + - DejaVu Fonts were added. + +1.53.0.TC028 (2007-03-03) + - MultiCell function signature were changed: the $ln parameter were added. Check documentation for further information. + - Greek language were added on example sentences. + - setPrintHeader() and setPrintFooter() functions were added to enable or disable page header and footer. + +1.53.0.TC027 (2006-12-14) + - $attr['face'] bug were fixed. + - K_TCPDF_EXTERNAL_CONFIG control where introduced on /config/tcpdf_config.php to use external configuration files. + +1.53.0.TC026 (2006-10-28) + - writeHTML function call were fixed on examples. + +1.53.0.TC025 (2006-10-27) + - Bugs item #1421290 were fixed (0D - 0A substitution in some characters) + - Bugs item #1573174 were fixed (MultiCell documentation) + +1.53.0.TC024 (2006-09-26) + - getPageHeight() function were fixed (bug 1543476). + - fixed missing breaks on closedHTMLTagHandler function (bug 1535263). + - fixed extra spaces on Write function (bug 1535262). + +1.53.0.TC023 (2006-08-04) + - paths to barcode directory were fixed. + - documentation were updated. + +1.53.0.TC022 (2006-07-16) + - fixed bug: [ 1516858 ] Probs with PHP autoloader and class_exists() + +1.53.0.TC021 (2006-07-01) + - HTML attributes with whitespaces are now supported (thanks to Nelson Benitez for his support) + +1.53.0.TC020 (2006-06-23) + - code cleanup + +1.53.0.TC019 (2006-05-21) + - fixed <strong> and <em> closing tags + +1.53.0.TC018 (2006-05-18) + - fixed font names bug + +1.53.0.TC017 (2006-05-18) + - the TTF2UFM utility to convert True Type fonts for TCPDF were included on fonts folder. + - new free unicode fonts were included on /fonts/freefont. + - test_unicode.php example were exended. + - parameter $fill were added on Write, writeHTML and writeHTMLCell functions. + - documentation were updated. + +1.53.0.TC016 (2006-03-09) + - fixed closing <strong> tag on html parser. + +1.53.0.TC016 (2005-08-28) + - fpdf.php and tcpdf.php files were joined in one single class (you can still extend TCPDF with your own class). + - fixed problem when mb_internal_encoding is set. + +1.53.0.TC014 (2005-05-29) + - fixed WriteHTMLCell new page issue. + +1.53.0.TC013 (2005-05-29) + - fixed WriteHTMLCell across pages. + +1.53.0.TC012 (2005-05-29) + - font color attribute bug were fixed. + +1.53.0.TC011 (2005-03-31) + - SetFont function were fixed (thank Sjaak Lauwers for bug notice). + +1.53.0.TC010 (2005-03-22) + - the html functions were improved (thanks to Manfred Vervuert for bug reporting). + +1.53.0.TC009 (2005-03-19) + - a wrong reference to convertColorHexToDec were fixed. + +1.53.0.TC008 (2005-02-07) + - removed some extra bytes from PHP files. + +1.53.0.TC007 (2005-01-08) + - fill attribute were removed from writeHTMLCell method. + +1.53.0.TC006 (2005-01-08) + - the documentation were updated. + +1.53.0.TC005 (2005-01-05) + - Steven Wittens's unicode methods were removed. + - All unicode methods were rewritten from scratch. + - TCPDF is now licensed as LGPL. + +1.53.0.TC004 (2005-01-04) + - this changelog were added. + - removed commercial fonts for licensing issue. + - Bitstream Vera Fonts were added (http://www.bitstream.com/font_rendering/products/dev_fonts/vera.html). + - Now the AddFont and SetFont functions returns the basic font if the styled version do not exist. + +EOF ---------------------------------------------------------------------------- diff --git a/assets/html2pdf/_tcpdf_5.0.002/LICENSE.TXT b/assets/html2pdf/_tcpdf_5.0.002/LICENSE.TXT new file mode 100644 index 0000000..b1e3f5a --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/LICENSE.TXT @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + <one line to give the library's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + <signature of Ty Coon>, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/assets/html2pdf/_tcpdf_5.0.002/README.TXT b/assets/html2pdf/_tcpdf_5.0.002/README.TXT new file mode 100644 index 0000000..b65e2b8 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/README.TXT @@ -0,0 +1,84 @@ +TCPDF - README +============================================================ + +IF YOU'D LIKE TO SUPPORT TCPDF, PLEASE CONSIDER MAKING A +DONATION: +http://sourceforge.net/donate/index.php?group_id=128076 + +------------------------------------------------------------ + +Name: TCPDF +Version: 5.0.002 +Release date: 2010-05-06 +Author: Nicola Asuni + +Copyright (c) 2001-2010: + Nicola Asuni + Tecnick.com s.r.l. + Via Della Pace, 11 + 09044 Quartucciu (CA) + ITALY + www.tecnick.com + +URLs: + http://www.tcpdf.org + http://www.sourceforge.net/projects/tcpdf + +Description: + TCPDF is a PHP class for generating PDF files on-the-fly without requiring external extensions. + TCPDF has been originally derived from the Public Domain FPDF class by Olivier Plathey (http://www.fpdf.org). + +Main Features: +// * no external libraries are required for the basic functions; +// * all ISO page formats, custom page formats, custom margins and units of measure; +// * UTF-8 Unicode and Right-To-Left languages; +// * TrueTypeUnicode, OpenTypeUnicode, TrueType, OpenType, Type1 and CID-0 fonts; +// * methods to publish some XHTML code, Javascript and Forms; +// * images, graphic (geometric figures) and transformation methods; +// * supports JPEG, PNG and SVG images natively, all images supported by GD (GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM) and all images supported via ImagMagick (http://www.imagemagick.org/www/formats.html) +// * 1D and 2D barcodes: CODE 39, ANSI MH10.8M-1983, USD-3, 3 of 9, CODE 93, USS-93, Standard 2 of 5, Interleaved 2 of 5, CODE 128 A/B/C, 2 and 5 Digits UPC-Based Extention, EAN 8, EAN 13, UPC-A, UPC-E, MSI, POSTNET, PLANET, RMS4CC (Royal Mail 4-state Customer Code), CBC (Customer Bar Code), KIX (Klant index - Customer index), Intelligent Mail Barcode, Onecode, USPS-B-3200, CODABAR, CODE 11, PHARMACODE, PHARMACODE TWO-TRACKS, QR-Code; +// * Grayscale, RGB, CMYK, Spot Colors and Transparencies; +// * automatic page header and footer management; +// * document encryption and digital signature certifications; +// * transactions to UNDO commands; +// * PDF annotations, including links, text and file attachments; +// * text rendering modes (fill, stroke and clipping); +// * multiple columns mode; +// * bookmarks and table of content; +// * text hyphenation; +// * automatic page break, line break and text alignments including justification; +// * automatic page numbering and page groups; +// * move and delete pages; +// * page compression (requires php-zlib extension); + + +Installation (full instructions on http://www.tcpdf.org): + 1. copy the folder on your Web server + 2. set your installation path and other parameters on the config/tcpdf_config.php + 3. call the examples/example_001.php page with your browser to see an example + +Source Code Documentation: + doc/index.html + +For Additional Documentation: + http://www.tcpdf.org + +License + Copyright (C) 2002-2010 Nicola Asuni - Tecnick.com S.r.l. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 2.1 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + + See LICENSE.TXT file for more information. + +============================================================ diff --git a/assets/html2pdf/_tcpdf_5.0.002/barcodes.php b/assets/html2pdf/_tcpdf_5.0.002/barcodes.php new file mode 100644 index 0000000..c859595 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/barcodes.php @@ -0,0 +1,1978 @@ +<?php +//============================================================+ +// File name : barcodes.php +// Begin : 2008-06-09 +// Last Update : 2009-08-26 +// Version : 1.0.009 +// License : GNU LGPL (http://www.gnu.org/copyleft/lesser.html) +// ---------------------------------------------------------------------------- +// Copyright (C) 2008-2009 Nicola Asuni - Tecnick.com S.r.l. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 2.1 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. +// +// See LICENSE.TXT file for more information. +// ---------------------------------------------------------------------------- +// +// Description : PHP class to creates array representations for +// common 1D barcodes to be used with TCPDF. +// +// Author: Nicola Asuni +// +// (c) Copyright: +// Nicola Asuni +// Tecnick.com S.r.l. +// Via della Pace, 11 +// 09044 Quartucciu (CA) +// ITALY +// www.tecnick.com +// info@tecnick.com +//============================================================+ + +/** + * PHP class to creates array representations for common 1D barcodes to be used with TCPDF. + * @package com.tecnick.tcpdf + * @abstract Functions for generating string representation of common 1D barcodes. + * @author Nicola Asuni + * @copyright 2008-2009 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com + * @link http://www.tcpdf.org + * @license http://www.gnu.org/copyleft/lesser.html LGPL + * @version 1.0.008 + */ + + /** + * PHP class to creates array representations for common 1D barcodes to be used with TCPDF (http://www.tcpdf.org).<br> + * @name TCPDFBarcode + * @package com.tecnick.tcpdf + * @version 1.0.008 + * @author Nicola Asuni + * @link http://www.tcpdf.org + * @license http://www.gnu.org/copyleft/lesser.html LGPL + */ +class TCPDFBarcode { + + /** + * @var array representation of barcode. + * @access protected + */ + protected $barcode_array; + + /** + * This is the class constructor. + * Return an array representations for common 1D barcodes:<ul> + * <li>$arrcode['code'] code to be printed on text label</li> + * <li>$arrcode['maxh'] max bar height</li> + * <li>$arrcode['maxw'] max bar width</li> + * <li>$arrcode['bcode'][$k] single bar or space in $k position</li> + * <li>$arrcode['bcode'][$k]['t'] bar type: true = bar, false = space.</li> + * <li>$arrcode['bcode'][$k]['w'] bar width in units.</li> + * <li>$arrcode['bcode'][$k]['h'] bar height in units.</li> + * <li>$arrcode['bcode'][$k]['p'] bar top position (0 = top, 1 = middle)</li></ul> + * @param string $code code to print + * @param string $type type of barcode: <ul><li>C39 : CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9.</li><li>C39+ : CODE 39 with checksum</li><li>C39E : CODE 39 EXTENDED</li><li>C39E+ : CODE 39 EXTENDED + CHECKSUM</li><li>C93 : CODE 93 - USS-93</li><li>S25 : Standard 2 of 5</li><li>S25+ : Standard 2 of 5 + CHECKSUM</li><li>I25 : Interleaved 2 of 5</li><li>I25+ : Interleaved 2 of 5 + CHECKSUM</li><li>C128A : CODE 128 A</li><li>C128B : CODE 128 B</li><li>C128C : CODE 128 C</li><li>EAN2 : 2-Digits UPC-Based Extention</li><li>EAN5 : 5-Digits UPC-Based Extention</li><li>EAN8 : EAN 8</li><li>EAN13 : EAN 13</li><li>UPCA : UPC-A</li><li>UPCE : UPC-E</li><li>MSI : MSI (Variation of Plessey code)</li><li>MSI+ : MSI + CHECKSUM (modulo 11)</li><li>POSTNET : POSTNET</li><li>PLANET : PLANET</li><li>RMS4CC : RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code)</li><li>KIX : KIX (Klant index - Customer index)</li><li>IMB: Intelligent Mail Barcode - Onecode - USPS-B-3200</li><li>CODABAR : CODABAR</li><li>CODE11 : CODE 11</li><li>PHARMA : PHARMACODE</li><li>PHARMA2T : PHARMACODE TWO-TRACKS</li></ul> + */ + public function __construct($code, $type) { + $this->setBarcode($code, $type); + } + + /** + * Return an array representations of barcode. + * @return array + */ + public function getBarcodeArray() { + return $this->barcode_array; + } + + /** + * Set the barcode. + * @param string $code code to print + * @param string $type type of barcode: <ul><li>C39 : CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9.</li><li>C39+ : CODE 39 with checksum</li><li>C39E : CODE 39 EXTENDED</li><li>C39E+ : CODE 39 EXTENDED + CHECKSUM</li><li>C93 : CODE 93 - USS-93</li><li>S25 : Standard 2 of 5</li><li>S25+ : Standard 2 of 5 + CHECKSUM</li><li>I25 : Interleaved 2 of 5</li><li>I25+ : Interleaved 2 of 5 + CHECKSUM</li><li>C128A : CODE 128 A</li><li>C128B : CODE 128 B</li><li>C128C : CODE 128 C</li><li>EAN2 : 2-Digits UPC-Based Extention</li><li>EAN5 : 5-Digits UPC-Based Extention</li><li>EAN8 : EAN 8</li><li>EAN13 : EAN 13</li><li>UPCA : UPC-A</li><li>UPCE : UPC-E</li><li>MSI : MSI (Variation of Plessey code)</li><li>MSI+ : MSI + CHECKSUM (modulo 11)</li><li>POSTNET : POSTNET</li><li>PLANET : PLANET</li><li>RMS4CC : RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code)</li><li>KIX : KIX (Klant index - Customer index)</li><li>IMB: Intelligent Mail Barcode - Onecode - USPS-B-3200</li><li>CODABAR : CODABAR</li><li>CODE11 : CODE 11</li><li>PHARMA : PHARMACODE</li><li>PHARMA2T : PHARMACODE TWO-TRACKS</li></ul> + * @return array + */ + public function setBarcode($code, $type) { + switch (strtoupper($type)) { + case 'C39': { // CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9. + $arrcode = $this->barcode_code39($code, false, false); + break; + } + case 'C39+': { // CODE 39 with checksum + $arrcode = $this->barcode_code39($code, false, true); + break; + } + case 'C39E': { // CODE 39 EXTENDED + $arrcode = $this->barcode_code39($code, true, false); + break; + } + case 'C39E+': { // CODE 39 EXTENDED + CHECKSUM + $arrcode = $this->barcode_code39($code, true, true); + break; + } + case 'C93': { // CODE 93 - USS-93 + $arrcode = $this->barcode_code93($code); + break; + } + case 'S25': { // Standard 2 of 5 + $arrcode = $this->barcode_s25($code, false); + break; + } + case 'S25+': { // Standard 2 of 5 + CHECKSUM + $arrcode = $this->barcode_s25($code, true); + break; + } + case 'I25': { // Interleaved 2 of 5 + $arrcode = $this->barcode_i25($code, false); + break; + } + case 'I25+': { // Interleaved 2 of 5 + CHECKSUM + $arrcode = $this->barcode_i25($code, true); + break; + } + case 'C128A': { // CODE 128 A + $arrcode = $this->barcode_c128($code, 'A'); + break; + } + case 'C128B': { // CODE 128 B + $arrcode = $this->barcode_c128($code, 'B'); + break; + } + case 'C128C': { // CODE 128 C + $arrcode = $this->barcode_c128($code, 'C'); + break; + } + case 'EAN2': { // 2-Digits UPC-Based Extention + $arrcode = $this->barcode_eanext($code, 2); + break; + } + case 'EAN5': { // 5-Digits UPC-Based Extention + $arrcode = $this->barcode_eanext($code, 5); + break; + } + case 'EAN8': { // EAN 8 + $arrcode = $this->barcode_eanupc($code, 8); + break; + } + case 'EAN13': { // EAN 13 + $arrcode = $this->barcode_eanupc($code, 13); + break; + } + case 'UPCA': { // UPC-A + $arrcode = $this->barcode_eanupc($code, 12); + break; + } + case 'UPCE': { // UPC-E + $arrcode = $this->barcode_eanupc($code, 6); + break; + } + case 'MSI': { // MSI (Variation of Plessey code) + $arrcode = $this->barcode_msi($code, false); + break; + } + case 'MSI+': { // MSI + CHECKSUM (modulo 11) + $arrcode = $this->barcode_msi($code, true); + break; + } + case 'POSTNET': { // POSTNET + $arrcode = $this->barcode_postnet($code, false); + break; + } + case 'PLANET': { // PLANET + $arrcode = $this->barcode_postnet($code, true); + break; + } + case 'RMS4CC': { // RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code) + $arrcode = $this->barcode_rms4cc($code, false); + break; + } + case 'KIX': { // KIX (Klant index - Customer index) + $arrcode = $this->barcode_rms4cc($code, true); + break; + } + case 'IMB': { // IMB - Intelligent Mail Barcode - Onecode - USPS-B-3200 + $arrcode = $this->barcode_imb($code); + break; + } + case 'CODABAR': { // CODABAR + $arrcode = $this->barcode_codabar($code); + break; + } + case 'CODE11': { // CODE 11 + $arrcode = $this->barcode_code11($code); + break; + } + case 'PHARMA': { // PHARMACODE + $arrcode = $this->barcode_pharmacode($code); + break; + } + case 'PHARMA2T': { // PHARMACODE TWO-TRACKS + $arrcode = $this->barcode_pharmacode2t($code); + break; + } + default: { + $this->barcode_array = false; + $arrcode = false; + break; + } + } + $this->barcode_array = $arrcode; + } + + /** + * CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9. + * General-purpose code in very wide use world-wide + * @param string $code code to represent. + * @param boolean $checksum if true add a checksum to the code + * @return array barcode representation. + * @access protected + */ + protected function barcode_code39($code, $extended=false, $checksum=false) { + $chr['0'] = '111221211'; + $chr['1'] = '211211112'; + $chr['2'] = '112211112'; + $chr['3'] = '212211111'; + $chr['4'] = '111221112'; + $chr['5'] = '211221111'; + $chr['6'] = '112221111'; + $chr['7'] = '111211212'; + $chr['8'] = '211211211'; + $chr['9'] = '112211211'; + $chr['A'] = '211112112'; + $chr['B'] = '112112112'; + $chr['C'] = '212112111'; + $chr['D'] = '111122112'; + $chr['E'] = '211122111'; + $chr['F'] = '112122111'; + $chr['G'] = '111112212'; + $chr['H'] = '211112211'; + $chr['I'] = '112112211'; + $chr['J'] = '111122211'; + $chr['K'] = '211111122'; + $chr['L'] = '112111122'; + $chr['M'] = '212111121'; + $chr['N'] = '111121122'; + $chr['O'] = '211121121'; + $chr['P'] = '112121121'; + $chr['Q'] = '111111222'; + $chr['R'] = '211111221'; + $chr['S'] = '112111221'; + $chr['T'] = '111121221'; + $chr['U'] = '221111112'; + $chr['V'] = '122111112'; + $chr['W'] = '222111111'; + $chr['X'] = '121121112'; + $chr['Y'] = '221121111'; + $chr['Z'] = '122121111'; + $chr['-'] = '121111212'; + $chr['.'] = '221111211'; + $chr[' '] = '122111211'; + $chr['$'] = '121212111'; + $chr['/'] = '121211121'; + $chr['+'] = '121112121'; + $chr['%'] = '111212121'; + $chr['*'] = '121121211'; + + $code = strtoupper($code); + if ($extended) { + // extended mode + $code = $this->encode_code39_ext($code); + } + if ($code === false) { + return false; + } + if ($checksum) { + // checksum + $code .= $this->checksum_code39($code); + } + // add start and stop codes + $code = '*'.$code.'*'; + + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + $k = 0; + $clen = strlen($code); + for ($i = 0; $i < $clen; ++$i) { + $char = $code{$i}; + if(!isset($chr[$char])) { + // invalid character + return false; + } + for ($j = 0; $j < 9; ++$j) { + if (($j % 2) == 0) { + $t = true; // bar + } else { + $t = false; // space + } + $w = $chr[$char]{$j}; + $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); + $bararray['maxw'] += $w; + ++$k; + } + $bararray['bcode'][$k] = array('t' => false, 'w' => 1, 'h' => 1, 'p' => 0); + $bararray['maxw'] += 1; + ++$k; + } + return $bararray; + } + + /** + * Encode a string to be used for CODE 39 Extended mode. + * @param string $code code to represent. + * @return encoded string. + * @access protected + */ + protected function encode_code39_ext($code) { + $encode = array( + chr(0) => '%U', chr(1) => '$A', chr(2) => '$B', chr(3) => '$C', + chr(4) => '$D', chr(5) => '$E', chr(6) => '$F', chr(7) => '$G', + chr(8) => '$H', chr(9) => '$I', chr(10) => '$J', chr(11) => '£K', + chr(12) => '$L', chr(13) => '$M', chr(14) => '$N', chr(15) => '$O', + chr(16) => '$P', chr(17) => '$Q', chr(18) => '$R', chr(19) => '$S', + chr(20) => '$T', chr(21) => '$U', chr(22) => '$V', chr(23) => '$W', + chr(24) => '$X', chr(25) => '$Y', chr(26) => '$Z', chr(27) => '%A', + chr(28) => '%B', chr(29) => '%C', chr(30) => '%D', chr(31) => '%E', + chr(32) => ' ', chr(33) => '/A', chr(34) => '/B', chr(35) => '/C', + chr(36) => '/D', chr(37) => '/E', chr(38) => '/F', chr(39) => '/G', + chr(40) => '/H', chr(41) => '/I', chr(42) => '/J', chr(43) => '/K', + chr(44) => '/L', chr(45) => '-', chr(46) => '.', chr(47) => '/O', + chr(48) => '0', chr(49) => '1', chr(50) => '2', chr(51) => '3', + chr(52) => '4', chr(53) => '5', chr(54) => '6', chr(55) => '7', + chr(56) => '8', chr(57) => '9', chr(58) => '/Z', chr(59) => '%F', + chr(60) => '%G', chr(61) => '%H', chr(62) => '%I', chr(63) => '%J', + chr(64) => '%V', chr(65) => 'A', chr(66) => 'B', chr(67) => 'C', + chr(68) => 'D', chr(69) => 'E', chr(70) => 'F', chr(71) => 'G', + chr(72) => 'H', chr(73) => 'I', chr(74) => 'J', chr(75) => 'K', + chr(76) => 'L', chr(77) => 'M', chr(78) => 'N', chr(79) => 'O', + chr(80) => 'P', chr(81) => 'Q', chr(82) => 'R', chr(83) => 'S', + chr(84) => 'T', chr(85) => 'U', chr(86) => 'V', chr(87) => 'W', + chr(88) => 'X', chr(89) => 'Y', chr(90) => 'Z', chr(91) => '%K', + chr(92) => '%L', chr(93) => '%M', chr(94) => '%N', chr(95) => '%O', + chr(96) => '%W', chr(97) => '+A', chr(98) => '+B', chr(99) => '+C', + chr(100) => '+D', chr(101) => '+E', chr(102) => '+F', chr(103) => '+G', + chr(104) => '+H', chr(105) => '+I', chr(106) => '+J', chr(107) => '+K', + chr(108) => '+L', chr(109) => '+M', chr(110) => '+N', chr(111) => '+O', + chr(112) => '+P', chr(113) => '+Q', chr(114) => '+R', chr(115) => '+S', + chr(116) => '+T', chr(117) => '+U', chr(118) => '+V', chr(119) => '+W', + chr(120) => '+X', chr(121) => '+Y', chr(122) => '+Z', chr(123) => '%P', + chr(124) => '%Q', chr(125) => '%R', chr(126) => '%S', chr(127) => '%T'); + $code_ext = ''; + $clen = strlen($code); + for ($i = 0 ; $i < $clen; ++$i) { + if (ord($code{$i}) > 127) { + return false; + } + $code_ext .= $encode[$code{$i}]; + } + return $code_ext; + } + + /** + * Calculate CODE 39 checksum (modulo 43). + * @param string $code code to represent. + * @return char checksum. + * @access protected + */ + protected function checksum_code39($code) { + $chars = array( + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', + 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', + 'W', 'X', 'Y', 'Z', '-', '.', ' ', '$', '/', '+', '%'); + $sum = 0; + $clen = strlen($code); + for ($i = 0 ; $i < $clen; ++$i) { + $k = array_keys($chars, $code{$i}); + $sum += $k[0]; + } + $j = ($sum % 43); + return $chars[$j]; + } + + /** + * CODE 93 - USS-93 + * Compact code similar to Code 39 + * @param string $code code to represent. + * @param boolean $checksum if true add a checksum to the code + * @return array barcode representation. + * @access protected + */ + protected function barcode_code93($code) { + $chr['0'] = '131112'; + $chr['1'] = '111213'; + $chr['2'] = '111312'; + $chr['3'] = '111411'; + $chr['4'] = '121113'; + $chr['5'] = '121212'; + $chr['6'] = '121311'; + $chr['7'] = '111114'; + $chr['8'] = '131211'; + $chr['9'] = '141111'; + $chr['A'] = '211113'; + $chr['B'] = '211212'; + $chr['C'] = '211311'; + $chr['D'] = '221112'; + $chr['E'] = '221211'; + $chr['F'] = '231111'; + $chr['G'] = '112113'; + $chr['H'] = '112212'; + $chr['I'] = '112311'; + $chr['J'] = '122112'; + $chr['K'] = '132111'; + $chr['L'] = '111123'; + $chr['M'] = '111222'; + $chr['N'] = '111321'; + $chr['O'] = '121122'; + $chr['P'] = '131121'; + $chr['Q'] = '212112'; + $chr['R'] = '212211'; + $chr['S'] = '211122'; + $chr['T'] = '211221'; + $chr['U'] = '221121'; + $chr['V'] = '222111'; + $chr['W'] = '112122'; + $chr['X'] = '112221'; + $chr['Y'] = '122121'; + $chr['Z'] = '123111'; + $chr['-'] = '121131'; + $chr['.'] = '311112'; + $chr[' '] = '311211'; + $chr['$'] = '321111'; + $chr['/'] = '112131'; + $chr['+'] = '113121'; + $chr['%'] = '211131'; + $chr[128] = '121221'; // ($) + $chr[129] = '311121'; // (/) + $chr[130] = '122211'; // (+) + $chr[131] = '312111'; // (%) + $chr['*'] = '111141'; + $code = strtoupper($code); + $encode = array( + chr(0) => chr(131).'U', chr(1) => chr(128).'A', chr(2) => chr(128).'B', chr(3) => chr(128).'C', + chr(4) => chr(128).'D', chr(5) => chr(128).'E', chr(6) => chr(128).'F', chr(7) => chr(128).'G', + chr(8) => chr(128).'H', chr(9) => chr(128).'I', chr(10) => chr(128).'J', chr(11) => '£K', + chr(12) => chr(128).'L', chr(13) => chr(128).'M', chr(14) => chr(128).'N', chr(15) => chr(128).'O', + chr(16) => chr(128).'P', chr(17) => chr(128).'Q', chr(18) => chr(128).'R', chr(19) => chr(128).'S', + chr(20) => chr(128).'T', chr(21) => chr(128).'U', chr(22) => chr(128).'V', chr(23) => chr(128).'W', + chr(24) => chr(128).'X', chr(25) => chr(128).'Y', chr(26) => chr(128).'Z', chr(27) => chr(131).'A', + chr(28) => chr(131).'B', chr(29) => chr(131).'C', chr(30) => chr(131).'D', chr(31) => chr(131).'E', + chr(32) => ' ', chr(33) => chr(129).'A', chr(34) => chr(129).'B', chr(35) => chr(129).'C', + chr(36) => chr(129).'D', chr(37) => chr(129).'E', chr(38) => chr(129).'F', chr(39) => chr(129).'G', + chr(40) => chr(129).'H', chr(41) => chr(129).'I', chr(42) => chr(129).'J', chr(43) => chr(129).'K', + chr(44) => chr(129).'L', chr(45) => '-', chr(46) => '.', chr(47) => chr(129).'O', + chr(48) => '0', chr(49) => '1', chr(50) => '2', chr(51) => '3', + chr(52) => '4', chr(53) => '5', chr(54) => '6', chr(55) => '7', + chr(56) => '8', chr(57) => '9', chr(58) => chr(129).'Z', chr(59) => chr(131).'F', + chr(60) => chr(131).'G', chr(61) => chr(131).'H', chr(62) => chr(131).'I', chr(63) => chr(131).'J', + chr(64) => chr(131).'V', chr(65) => 'A', chr(66) => 'B', chr(67) => 'C', + chr(68) => 'D', chr(69) => 'E', chr(70) => 'F', chr(71) => 'G', + chr(72) => 'H', chr(73) => 'I', chr(74) => 'J', chr(75) => 'K', + chr(76) => 'L', chr(77) => 'M', chr(78) => 'N', chr(79) => 'O', + chr(80) => 'P', chr(81) => 'Q', chr(82) => 'R', chr(83) => 'S', + chr(84) => 'T', chr(85) => 'U', chr(86) => 'V', chr(87) => 'W', + chr(88) => 'X', chr(89) => 'Y', chr(90) => 'Z', chr(91) => chr(131).'K', + chr(92) => chr(131).'L', chr(93) => chr(131).'M', chr(94) => chr(131).'N', chr(95) => chr(131).'O', + chr(96) => chr(131).'W', chr(97) => chr(130).'A', chr(98) => chr(130).'B', chr(99) => chr(130).'C', + chr(100) => chr(130).'D', chr(101) => chr(130).'E', chr(102) => chr(130).'F', chr(103) => chr(130).'G', + chr(104) => chr(130).'H', chr(105) => chr(130).'I', chr(106) => chr(130).'J', chr(107) => chr(130).'K', + chr(108) => chr(130).'L', chr(109) => chr(130).'M', chr(110) => chr(130).'N', chr(111) => chr(130).'O', + chr(112) => chr(130).'P', chr(113) => chr(130).'Q', chr(114) => chr(130).'R', chr(115) => chr(130).'S', + chr(116) => chr(130).'T', chr(117) => chr(130).'U', chr(118) => chr(130).'V', chr(119) => chr(130).'W', + chr(120) => chr(130).'X', chr(121) => chr(130).'Y', chr(122) => chr(130).'Z', chr(123) => chr(131).'P', + chr(124) => chr(131).'Q', chr(125) => chr(131).'R', chr(126) => chr(131).'S', chr(127) => chr(131).'T'); + $code_ext = ''; + $clen = strlen($code); + for ($i = 0 ; $i < $clen; ++$i) { + if (ord($code{$i}) > 127) { + return false; + } + $code_ext .= $encode[$code{$i}]; + } + // checksum + $code .= $this->checksum_code93($code); + // add start and stop codes + $code = '*'.$code.'*'; + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + $k = 0; + $clen = strlen($code); + for ($i = 0; $i < $clen; ++$i) { + $char = $code{$i}; + if(!isset($chr[$char])) { + // invalid character + return false; + } + for ($j = 0; $j < 6; ++$j) { + if (($j % 2) == 0) { + $t = true; // bar + } else { + $t = false; // space + } + $w = $chr[$char]{$j}; + $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); + $bararray['maxw'] += $w; + ++$k; + } + } + $bararray['bcode'][$k] = array('t' => true, 'w' => 1, 'h' => 1, 'p' => 0); + $bararray['maxw'] += 1; + ++$k; + return $bararray; + } + + /** + * Calculate CODE 93 checksum (modulo 47). + * @param string $code code to represent. + * @return string checksum code. + * @access protected + */ + protected function checksum_code93($code) { + $chars = array( + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', + 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', + 'W', 'X', 'Y', 'Z', '-', '.', ' ', '$', '/', '+', '%'); + // translate special characters + $code = strtr($code, chr(128).chr(129).chr(130).chr(131), '$/+%'); + $len = strlen($code); + // calculate check digit C + $p = 1; + $check = 0; + for ($i = ($len - 1); $i >= 0; --$i) { + $k = array_keys($chars, $code{$i}); + $check += ($k[0] * $p); + ++$p; + if ($p > 20) { + $p = 1; + } + } + $check %= 47; + $c = $chars[$check]; + $code .= $c; + // calculate check digit K + $p = 1; + $check = 0; + for ($i = $len; $i >= 0; --$i) { + $k = array_keys($chars, $code{$i}); + $check += ($k[0] * $p); + ++$p; + if ($p > 15) { + $p = 1; + } + } + $check %= 47; + $k = $chars[$check]; + return $c.$k; + } + + /** + * Checksum for standard 2 of 5 barcodes. + * @param string $code code to process. + * @return int checksum. + * @access protected + */ + protected function checksum_s25($code) { + $len = strlen($code); + $sum = 0; + for ($i = 0; $i < $len; $i+=2) { + $sum += $code{$i}; + } + $sum *= 3; + for ($i = 1; $i < $len; $i+=2) { + $sum += ($code{$i}); + } + $r = $sum % 10; + if($r > 0) { + $r = (10 - $r); + } + return $r; + } + + /** + * MSI. + * Variation of Plessey code, with similar applications + * Contains digits (0 to 9) and encodes the data only in the width of bars. + * @param string $code code to represent. + * @param boolean $checksum if true add a checksum to the code (modulo 11) + * @return array barcode representation. + * @access protected + */ + protected function barcode_msi($code, $checksum=false) { + $chr['0'] = '100100100100'; + $chr['1'] = '100100100110'; + $chr['2'] = '100100110100'; + $chr['3'] = '100100110110'; + $chr['4'] = '100110100100'; + $chr['5'] = '100110100110'; + $chr['6'] = '100110110100'; + $chr['7'] = '100110110110'; + $chr['8'] = '110100100100'; + $chr['9'] = '110100100110'; + $chr['A'] = '110100110100'; + $chr['B'] = '110100110110'; + $chr['C'] = '110110100100'; + $chr['D'] = '110110100110'; + $chr['E'] = '110110110100'; + $chr['F'] = '110110110110'; + if ($checksum) { + // add checksum + $clen = strlen($code); + $p = 2; + $check = 0; + for ($i = ($clen - 1); $i >= 0; --$i) { + $check += (hexdec($code{$i}) * $p); + ++$p; + if ($p > 7) { + $p = 2; + } + } + $check %= 11; + if ($check > 0) { + $check = 11 - $check; + } + $code .= $check; + } + $seq = '110'; // left guard + $clen = strlen($code); + for ($i = 0; $i < $clen; ++$i) { + $digit = $code{$i}; + if (!isset($chr[$digit])) { + // invalid character + return false; + } + $seq .= $chr[$digit]; + } + $seq .= '1001'; // right guard + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + return $this->binseq_to_array($seq, $bararray); + } + + /** + * Standard 2 of 5 barcodes. + * Used in airline ticket marking, photofinishing + * Contains digits (0 to 9) and encodes the data only in the width of bars. + * @param string $code code to represent. + * @param boolean $checksum if true add a checksum to the code + * @return array barcode representation. + * @access protected + */ + protected function barcode_s25($code, $checksum=false) { + $chr['0'] = '10101110111010'; + $chr['1'] = '11101010101110'; + $chr['2'] = '10111010101110'; + $chr['3'] = '11101110101010'; + $chr['4'] = '10101110101110'; + $chr['5'] = '11101011101010'; + $chr['6'] = '10111011101010'; + $chr['7'] = '10101011101110'; + $chr['8'] = '10101110111010'; + $chr['9'] = '10111010111010'; + if ($checksum) { + // add checksum + $code .= $this->checksum_s25($code); + } + if((strlen($code) % 2) != 0) { + // add leading zero if code-length is odd + $code = '0'.$code; + } + $seq = '11011010'; + $clen = strlen($code); + for ($i = 0; $i < $clen; ++$i) { + $digit = $code{$i}; + if (!isset($chr[$digit])) { + // invalid character + return false; + } + $seq .= $chr[$digit]; + } + $seq .= '1101011'; + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + return $this->binseq_to_array($seq, $bararray); + } + + /** + * Convert binary barcode sequence to TCPDF barcode array + * @param string $seq barcode as binary sequence + * òparam array $bararray TCPDF barcode array to fill up + * @return array barcode representation. + * @access protected + */ + protected function binseq_to_array($seq, $bararray) { + $len = strlen($seq); + $w = 0; + $k = 0; + for ($i = 0; $i < $len; ++$i) { + $w += 1; + if (($i == ($len - 1)) OR (($i < ($len - 1)) AND ($seq{$i} != $seq{($i+1)}))) { + if ($seq{$i} == '1') { + $t = true; // bar + } else { + $t = false; // space + } + $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); + $bararray['maxw'] += $w; + ++$k; + $w = 0; + } + } + return $bararray; + } + + /** + * Interleaved 2 of 5 barcodes. + * Compact numeric code, widely used in industry, air cargo + * Contains digits (0 to 9) and encodes the data in the width of both bars and spaces. + * @param string $code code to represent. + * @param boolean $checksum if true add a checksum to the code + * @return array barcode representation. + * @access protected + */ + protected function barcode_i25($code, $checksum=false) { + $chr['0'] = '11221'; + $chr['1'] = '21112'; + $chr['2'] = '12112'; + $chr['3'] = '22111'; + $chr['4'] = '11212'; + $chr['5'] = '21211'; + $chr['6'] = '12211'; + $chr['7'] = '11122'; + $chr['8'] = '21121'; + $chr['9'] = '12121'; + $chr['A'] = '11'; + $chr['Z'] = '21'; + if ($checksum) { + // add checksum + $code .= $this->checksum_s25($code); + } + if((strlen($code) % 2) != 0) { + // add leading zero if code-length is odd + $code = '0'.$code; + } + // add start and stop codes + $code = 'AA'.strtolower($code).'ZA'; + + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + $k = 0; + $clen = strlen($code); + for ($i = 0; $i < $clen; $i = ($i + 2)) { + $char_bar = $code{$i}; + $char_space = $code{$i+1}; + if((!isset($chr[$char_bar])) OR (!isset($chr[$char_space]))) { + // invalid character + return false; + } + // create a bar-space sequence + $seq = ''; + $chrlen = strlen($chr[$char_bar]); + for ($s = 0; $s < $chrlen; $s++){ + $seq .= $chr[$char_bar]{$s} . $chr[$char_space]{$s}; + } + $seqlen = strlen($seq); + for ($j = 0; $j < $seqlen; ++$j) { + if (($j % 2) == 0) { + $t = true; // bar + } else { + $t = false; // space + } + $w = $seq{$j}; + $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); + $bararray['maxw'] += $w; + ++$k; + } + } + return $bararray; + } + + /** + * C128 barcodes. + * Very capable code, excellent density, high reliability; in very wide use world-wide + * @param string $code code to represent. + * @param string $type barcode type: A, B or C + * @return array barcode representation. + * @access protected + */ + protected function barcode_c128($code, $type='B') { + $chr = array( + '212222', /* 00 */ + '222122', /* 01 */ + '222221', /* 02 */ + '121223', /* 03 */ + '121322', /* 04 */ + '131222', /* 05 */ + '122213', /* 06 */ + '122312', /* 07 */ + '132212', /* 08 */ + '221213', /* 09 */ + '221312', /* 10 */ + '231212', /* 11 */ + '112232', /* 12 */ + '122132', /* 13 */ + '122231', /* 14 */ + '113222', /* 15 */ + '123122', /* 16 */ + '123221', /* 17 */ + '223211', /* 18 */ + '221132', /* 19 */ + '221231', /* 20 */ + '213212', /* 21 */ + '223112', /* 22 */ + '312131', /* 23 */ + '311222', /* 24 */ + '321122', /* 25 */ + '321221', /* 26 */ + '312212', /* 27 */ + '322112', /* 28 */ + '322211', /* 29 */ + '212123', /* 30 */ + '212321', /* 31 */ + '232121', /* 32 */ + '111323', /* 33 */ + '131123', /* 34 */ + '131321', /* 35 */ + '112313', /* 36 */ + '132113', /* 37 */ + '132311', /* 38 */ + '211313', /* 39 */ + '231113', /* 40 */ + '231311', /* 41 */ + '112133', /* 42 */ + '112331', /* 43 */ + '132131', /* 44 */ + '113123', /* 45 */ + '113321', /* 46 */ + '133121', /* 47 */ + '313121', /* 48 */ + '211331', /* 49 */ + '231131', /* 50 */ + '213113', /* 51 */ + '213311', /* 52 */ + '213131', /* 53 */ + '311123', /* 54 */ + '311321', /* 55 */ + '331121', /* 56 */ + '312113', /* 57 */ + '312311', /* 58 */ + '332111', /* 59 */ + '314111', /* 60 */ + '221411', /* 61 */ + '431111', /* 62 */ + '111224', /* 63 */ + '111422', /* 64 */ + '121124', /* 65 */ + '121421', /* 66 */ + '141122', /* 67 */ + '141221', /* 68 */ + '112214', /* 69 */ + '112412', /* 70 */ + '122114', /* 71 */ + '122411', /* 72 */ + '142112', /* 73 */ + '142211', /* 74 */ + '241211', /* 75 */ + '221114', /* 76 */ + '413111', /* 77 */ + '241112', /* 78 */ + '134111', /* 79 */ + '111242', /* 80 */ + '121142', /* 81 */ + '121241', /* 82 */ + '114212', /* 83 */ + '124112', /* 84 */ + '124211', /* 85 */ + '411212', /* 86 */ + '421112', /* 87 */ + '421211', /* 88 */ + '212141', /* 89 */ + '214121', /* 90 */ + '412121', /* 91 */ + '111143', /* 92 */ + '111341', /* 93 */ + '131141', /* 94 */ + '114113', /* 95 */ + '114311', /* 96 */ + '411113', /* 97 */ + '411311', /* 98 */ + '113141', /* 99 */ + '114131', /* 100 */ + '311141', /* 101 */ + '411131', /* 102 */ + '211412', /* 103 START A */ + '211214', /* 104 START B */ + '211232', /* 105 START C */ + '233111', /* STOP */ + '200000' /* END */ + ); + $keys = ''; + switch(strtoupper($type)) { + case 'A': { + $startid = 103; + $keys = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_'; + for ($i = 0; $i < 32; ++$i) { + $keys .= chr($i); + } + break; + } + case 'B': { + $startid = 104; + $keys = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'.chr(127); + break; + } + case 'C': { + $startid = 105; + $keys = ''; + if ((strlen($code) % 2) != 0) { + // The length of barcode value must be even ($code). You must pad the number with zeros + return false; + } + for ($i = 0; $i <= 99; ++$i) { + $keys .= chr($i); + } + $new_code = ''; + $hclen = (strlen($code) / 2); + for ($i = 0; $i < $hclen; ++$i) { + $new_code .= chr(intval($code{(2 * $i)}.$code{(2 * $i + 1)})); + } + $code = $new_code; + break; + } + default: { + return false; + } + } + // calculate check character + $sum = $startid; + $clen = strlen($code); + for ($i = 0; $i < $clen; ++$i) { + $sum += (strpos($keys, $code{$i}) * ($i+1)); + } + $check = ($sum % 103); + // add start, check and stop codes + $code = chr($startid).$code.chr($check).chr(106).chr(107); + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + $k = 0; + $len = strlen($code); + for ($i = 0; $i < $len; ++$i) { + $ck = strpos($keys, $code{$i}); + if (($i == 0) OR ($i > ($len-4))) { + $char_num = ord($code{$i}); + $seq = $chr[$char_num]; + } elseif(($ck >= 0) AND isset($chr[$ck])) { + $seq = $chr[$ck]; + } else { + // invalid character + return false; + } + for ($j = 0; $j < 6; ++$j) { + if (($j % 2) == 0) { + $t = true; // bar + } else { + $t = false; // space + } + $w = $seq{$j}; + $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); + $bararray['maxw'] += $w; + ++$k; + } + } + return $bararray; + } + + /** + * EAN13 and UPC-A barcodes. + * EAN13: European Article Numbering international retail product code + * UPC-A: Universal product code seen on almost all retail products in the USA and Canada + * UPC-E: Short version of UPC symbol + * @param string $code code to represent. + * @param string $len barcode type: 6 = UPC-E, 8 = EAN8, 13 = EAN13, 12 = UPC-A + * @return array barcode representation. + * @access protected + */ + protected function barcode_eanupc($code, $len=13) { + $upce = false; + if ($len == 6) { + $len = 12; // UPC-A + $upce = true; // UPC-E mode + } + $data_len = $len - 1; + //Padding + $code = str_pad($code, $data_len, '0', STR_PAD_LEFT); + $code_len = strlen($code); + // calculate check digit + $sum_a = 0; + for ($i = 1; $i < $data_len; $i+=2) { + $sum_a += $code{$i}; + } + if ($len > 12) { + $sum_a *= 3; + } + $sum_b = 0; + for ($i = 0; $i < $data_len; $i+=2) { + $sum_b += ($code{$i}); + } + if ($len < 13) { + $sum_b *= 3; + } + $r = ($sum_a + $sum_b) % 10; + if($r > 0) { + $r = (10 - $r); + } + if ($code_len == $data_len) { + // add check digit + $code .= $r; + } elseif ($r !== intval($code{$data_len})) { + // wrong checkdigit + return false; + } + if ($len == 12) { + // UPC-A + $code = '0'.$code; + ++$len; + } + if ($upce) { + // convert UPC-A to UPC-E + $tmp = substr($code, 4, 3); + if (($tmp == '000') OR ($tmp == '100') OR ($tmp == '200')) { + // manufacturer code ends in 000, 100, or 200 + $upce_code = substr($code, 2, 2).substr($code, 9, 3).substr($code, 4, 1); + } else { + $tmp = substr($code, 5, 2); + if ($tmp == '00') { + // manufacturer code ends in 00 + $upce_code = substr($code, 2, 3).substr($code, 10, 2).'3'; + } else { + $tmp = substr($code, 6, 1); + if ($tmp == '0') { + // manufacturer code ends in 0 + $upce_code = substr($code, 2, 4).substr($code, 11, 1).'4'; + } else { + // manufacturer code does not end in zero + $upce_code = substr($code, 2, 5).substr($code, 11, 1); + } + } + } + } + //Convert digits to bars + $codes = array( + 'A'=>array( // left odd parity + '0'=>'0001101', + '1'=>'0011001', + '2'=>'0010011', + '3'=>'0111101', + '4'=>'0100011', + '5'=>'0110001', + '6'=>'0101111', + '7'=>'0111011', + '8'=>'0110111', + '9'=>'0001011'), + 'B'=>array( // left even parity + '0'=>'0100111', + '1'=>'0110011', + '2'=>'0011011', + '3'=>'0100001', + '4'=>'0011101', + '5'=>'0111001', + '6'=>'0000101', + '7'=>'0010001', + '8'=>'0001001', + '9'=>'0010111'), + 'C'=>array( // right + '0'=>'1110010', + '1'=>'1100110', + '2'=>'1101100', + '3'=>'1000010', + '4'=>'1011100', + '5'=>'1001110', + '6'=>'1010000', + '7'=>'1000100', + '8'=>'1001000', + '9'=>'1110100') + ); + $parities = array( + '0'=>array('A','A','A','A','A','A'), + '1'=>array('A','A','B','A','B','B'), + '2'=>array('A','A','B','B','A','B'), + '3'=>array('A','A','B','B','B','A'), + '4'=>array('A','B','A','A','B','B'), + '5'=>array('A','B','B','A','A','B'), + '6'=>array('A','B','B','B','A','A'), + '7'=>array('A','B','A','B','A','B'), + '8'=>array('A','B','A','B','B','A'), + '9'=>array('A','B','B','A','B','A') + ); + $upce_parities = array(); + $upce_parities[0] = array( + '0'=>array('B','B','B','A','A','A'), + '1'=>array('B','B','A','B','A','A'), + '2'=>array('B','B','A','A','B','A'), + '3'=>array('B','B','A','A','A','B'), + '4'=>array('B','A','B','B','A','A'), + '5'=>array('B','A','A','B','B','A'), + '6'=>array('B','A','A','A','B','B'), + '7'=>array('B','A','B','A','B','A'), + '8'=>array('B','A','B','A','A','B'), + '9'=>array('B','A','A','B','A','B') + ); + $upce_parities[1] = array( + '0'=>array('A','A','A','B','B','B'), + '1'=>array('A','A','B','A','B','B'), + '2'=>array('A','A','B','B','A','B'), + '3'=>array('A','A','B','B','B','A'), + '4'=>array('A','B','A','A','B','B'), + '5'=>array('A','B','B','A','A','B'), + '6'=>array('A','B','B','B','A','A'), + '7'=>array('A','B','A','B','A','B'), + '8'=>array('A','B','A','B','B','A'), + '9'=>array('A','B','B','A','B','A') + ); + $k = 0; + $seq = '101'; // left guard bar + if ($upce) { + $bararray = array('code' => $upce_code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + $p = $upce_parities[$code{1}][$r]; + for ($i = 0; $i < 6; ++$i) { + $seq .= $codes[$p[$i]][$upce_code{$i}]; + } + $seq .= '010101'; // right guard bar + } else { + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + $half_len = ceil($len / 2); + if ($len == 8) { + for ($i = 0; $i < $half_len; ++$i) { + $seq .= $codes['A'][$code{$i}]; + } + } else { + $p = $parities[$code{0}]; + for ($i = 1; $i < $half_len; ++$i) { + $seq .= $codes[$p[$i-1]][$code{$i}]; + } + } + $seq .= '01010'; // center guard bar + for ($i = $half_len; $i < $len; ++$i) { + $seq .= $codes['C'][$code{$i}]; + } + $seq .= '101'; // right guard bar + } + $clen = strlen($seq); + $w = 0; + for ($i = 0; $i < $clen; ++$i) { + $w += 1; + if (($i == ($clen - 1)) OR (($i < ($clen - 1)) AND ($seq{$i} != $seq{($i+1)}))) { + if ($seq{$i} == '1') { + $t = true; // bar + } else { + $t = false; // space + } + $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); + $bararray['maxw'] += $w; + ++$k; + $w = 0; + } + } + return $bararray; + } + + /** + * UPC-Based Extentions + * 2-Digit Ext.: Used to indicate magazines and newspaper issue numbers + * 5-Digit Ext.: Used to mark suggested retail price of books + * @param string $code code to represent. + * @param string $len barcode type: 2 = 2-Digit, 5 = 5-Digit + * @return array barcode representation. + * @access protected + */ + protected function barcode_eanext($code, $len=5) { + //Padding + $code = str_pad($code, $len, '0', STR_PAD_LEFT); + // calculate check digit + if ($len == 2) { + $r = $code % 4; + } elseif ($len == 5) { + $r = (3 * ($code{0} + $code{2} + $code{4})) + (9 * ($code{1} + $code{3})); + $r %= 10; + } else { + return false; + } + //Convert digits to bars + $codes = array( + 'A'=>array( // left odd parity + '0'=>'0001101', + '1'=>'0011001', + '2'=>'0010011', + '3'=>'0111101', + '4'=>'0100011', + '5'=>'0110001', + '6'=>'0101111', + '7'=>'0111011', + '8'=>'0110111', + '9'=>'0001011'), + 'B'=>array( // left even parity + '0'=>'0100111', + '1'=>'0110011', + '2'=>'0011011', + '3'=>'0100001', + '4'=>'0011101', + '5'=>'0111001', + '6'=>'0000101', + '7'=>'0010001', + '8'=>'0001001', + '9'=>'0010111') + ); + $parities = array(); + $parities[2] = array( + '0'=>array('A','A'), + '1'=>array('A','B'), + '2'=>array('B','A'), + '3'=>array('B','B') + ); + $parities[5] = array( + '0'=>array('B','B','A','A','A'), + '1'=>array('B','A','B','A','A'), + '2'=>array('B','A','A','B','A'), + '3'=>array('B','A','A','A','B'), + '4'=>array('A','B','B','A','A'), + '5'=>array('A','A','B','B','A'), + '6'=>array('A','A','A','B','B'), + '7'=>array('A','B','A','B','A'), + '8'=>array('A','B','A','A','B'), + '9'=>array('A','A','B','A','B') + ); + $p = $parities[$len][$r]; + $seq = '1011'; // left guard bar + $seq .= $codes[$p[0]][$code{0}]; + for ($i = 1; $i < $len; ++$i) { + $seq .= '01'; // separator + $seq .= $codes[$p[$i]][$code{$i}]; + } + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + return $this->binseq_to_array($seq, $bararray); + } + + /** + * POSTNET and PLANET barcodes. + * Used by U.S. Postal Service for automated mail sorting + * @param string $code zip code to represent. Must be a string containing a zip code of the form DDDDD or DDDDD-DDDD. + * @param boolean $planet if true print the PLANET barcode, otherwise print POSTNET + * @return array barcode representation. + * @access protected + */ + protected function barcode_postnet($code, $planet=false) { + // bar lenght + if ($planet) { + $barlen = Array( + 0 => Array(1,1,2,2,2), + 1 => Array(2,2,2,1,1), + 2 => Array(2,2,1,2,1), + 3 => Array(2,2,1,1,2), + 4 => Array(2,1,2,2,1), + 5 => Array(2,1,2,1,2), + 6 => Array(2,1,1,2,2), + 7 => Array(1,2,2,2,1), + 8 => Array(1,2,2,1,2), + 9 => Array(1,2,1,2,2) + ); + } else { + $barlen = Array( + 0 => Array(2,2,1,1,1), + 1 => Array(1,1,1,2,2), + 2 => Array(1,1,2,1,2), + 3 => Array(1,1,2,2,1), + 4 => Array(1,2,1,1,2), + 5 => Array(1,2,1,2,1), + 6 => Array(1,2,2,1,1), + 7 => Array(2,1,1,1,2), + 8 => Array(2,1,1,2,1), + 9 => Array(2,1,2,1,1) + ); + } + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 2, 'bcode' => array()); + $k = 0; + $code = str_replace('-', '', $code); + $code = str_replace(' ', '', $code); + $len = strlen($code); + // calculate checksum + $sum = 0; + for ($i = 0; $i < $len; ++$i) { + $sum += intval($code{$i}); + } + $chkd = ($sum % 10); + if($chkd > 0) { + $chkd = (10 - $chkd); + } + $code .= $chkd; + $len = strlen($code); + // start bar + $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => 2, 'p' => 0); + $bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0); + $bararray['maxw'] += 2; + for ($i = 0; $i < $len; ++$i) { + for ($j = 0; $j < 5; ++$j) { + $h = $barlen[$code{$i}][$j]; + $p = floor(1 / $h); + $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => $h, 'p' => $p); + $bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0); + $bararray['maxw'] += 2; + } + } + // end bar + $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => 2, 'p' => 0); + $bararray['maxw'] += 1; + return $bararray; + } + + /** + * RMS4CC - CBC - KIX + * RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code) - KIX (Klant index - Customer index) + * RM4SCC is the name of the barcode symbology used by the Royal Mail for its Cleanmail service. + * @param string $code code to print + * @param boolean $kix if true prints the KIX variation (doesn't use the start and end symbols, and the checksum) - in this case the house number must be sufficed with an X and placed at the end of the code. + * @return array barcode representation. + * @access protected + */ + protected function barcode_rms4cc($code, $kix=false) { + $notkix = !$kix; + // bar mode + // 1 = pos 1, length 2 + // 2 = pos 1, length 3 + // 3 = pos 2, length 1 + // 4 = pos 2, length 2 + $barmode = array( + '0' => array(3,3,2,2), + '1' => array(3,4,1,2), + '2' => array(3,4,2,1), + '3' => array(4,3,1,2), + '4' => array(4,3,2,1), + '5' => array(4,4,1,1), + '6' => array(3,1,4,2), + '7' => array(3,2,3,2), + '8' => array(3,2,4,1), + '9' => array(4,1,3,2), + 'A' => array(4,1,4,1), + 'B' => array(4,2,3,1), + 'C' => array(3,1,2,4), + 'D' => array(3,2,1,4), + 'E' => array(3,2,2,3), + 'F' => array(4,1,1,4), + 'G' => array(4,1,2,3), + 'H' => array(4,2,1,3), + 'I' => array(1,3,4,2), + 'J' => array(1,4,3,2), + 'K' => array(1,4,4,1), + 'L' => array(2,3,3,2), + 'M' => array(2,3,4,1), + 'N' => array(2,4,3,1), + 'O' => array(1,3,2,4), + 'P' => array(1,4,1,4), + 'Q' => array(1,4,2,3), + 'R' => array(2,3,1,4), + 'S' => array(2,3,2,3), + 'T' => array(2,4,1,3), + 'U' => array(1,1,4,4), + 'V' => array(1,2,3,4), + 'W' => array(1,2,4,3), + 'X' => array(2,1,3,4), + 'Y' => array(2,1,4,3), + 'Z' => array(2,2,3,3) + ); + $code = strtoupper($code); + $len = strlen($code); + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 3, 'bcode' => array()); + if ($notkix) { + // table for checksum calculation (row,col) + $checktable = array( + '0' => array(1,1), + '1' => array(1,2), + '2' => array(1,3), + '3' => array(1,4), + '4' => array(1,5), + '5' => array(1,0), + '6' => array(2,1), + '7' => array(2,2), + '8' => array(2,3), + '9' => array(2,4), + 'A' => array(2,5), + 'B' => array(2,0), + 'C' => array(3,1), + 'D' => array(3,2), + 'E' => array(3,3), + 'F' => array(3,4), + 'G' => array(3,5), + 'H' => array(3,0), + 'I' => array(4,1), + 'J' => array(4,2), + 'K' => array(4,3), + 'L' => array(4,4), + 'M' => array(4,5), + 'N' => array(4,0), + 'O' => array(5,1), + 'P' => array(5,2), + 'Q' => array(5,3), + 'R' => array(5,4), + 'S' => array(5,5), + 'T' => array(5,0), + 'U' => array(0,1), + 'V' => array(0,2), + 'W' => array(0,3), + 'X' => array(0,4), + 'Y' => array(0,5), + 'Z' => array(0,0) + ); + $row = 0; + $col = 0; + for ($i = 0; $i < $len; ++$i) { + $row += $checktable[$code{$i}][0]; + $col += $checktable[$code{$i}][1]; + } + $row %= 6; + $col %= 6; + $chk = array_keys($checktable, array($row,$col)); + $code .= $chk[0]; + ++$len; + } + $k = 0; + if ($notkix) { + // start bar + $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => 2, 'p' => 0); + $bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0); + $bararray['maxw'] += 2; + } + for ($i = 0; $i < $len; ++$i) { + for ($j = 0; $j < 4; ++$j) { + switch ($barmode[$code{$i}][$j]) { + case 1: { + $p = 0; + $h = 2; + break; + } + case 2: { + $p = 0; + $h = 3; + break; + } + case 3: { + $p = 1; + $h = 1; + break; + } + case 4: { + $p = 1; + $h = 2; + break; + } + } + $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => $h, 'p' => $p); + $bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0); + $bararray['maxw'] += 2; + } + } + if ($notkix) { + // stop bar + $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => 3, 'p' => 0); + $bararray['maxw'] += 1; + } + return $bararray; + } + + /** + * CODABAR barcodes. + * Older code often used in library systems, sometimes in blood banks + * @param string $code code to represent. + * @return array barcode representation. + * @access protected + */ + protected function barcode_codabar($code) { + $chr = array( + '0' => '11111221', + '1' => '11112211', + '2' => '11121121', + '3' => '22111111', + '4' => '11211211', + '5' => '21111211', + '6' => '12111121', + '7' => '12112111', + '8' => '12211111', + '9' => '21121111', + '-' => '11122111', + '$' => '11221111', + ':' => '21112121', + '/' => '21211121', + '.' => '21212111', + '+' => '11222221', + 'A' => '11221211', + 'B' => '12121121', + 'C' => '11121221', + 'D' => '11122211' + ); + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + $k = 0; + $w = 0; + $seq = ''; + $code = 'A'.strtoupper($code).'A'; + $len = strlen($code); + for ($i = 0; $i < $len; ++$i) { + if (!isset($chr[$code{$i}])) { + return false; + } + $seq = $chr[$code{$i}]; + for ($j = 0; $j < 8; ++$j) { + if (($j % 2) == 0) { + $t = true; // bar + } else { + $t = false; // space + } + $w = $seq{$j}; + $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); + $bararray['maxw'] += $w; + ++$k; + } + } + return $bararray; + } + + /** + * CODE11 barcodes. + * Used primarily for labeling telecommunications equipment + * @param string $code code to represent. + * @return array barcode representation. + * @access protected + */ + protected function barcode_code11($code) { + $chr = array( + '0' => '111121', + '1' => '211121', + '2' => '121121', + '3' => '221111', + '4' => '112121', + '5' => '212111', + '6' => '122111', + '7' => '111221', + '8' => '211211', + '9' => '211111', + '-' => '112111', + 'S' => '112211' + ); + + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + $k = 0; + $w = 0; + $seq = ''; + $len = strlen($code); + // calculate check digit C + $p = 1; + $check = 0; + for ($i = ($len - 1); $i >= 0; --$i) { + $digit = $code{$i}; + if ($digit == '-') { + $dval = 10; + } else { + $dval = intval($digit); + } + $check += ($dval * $p); + ++$p; + if ($p > 10) { + $p = 1; + } + } + $check %= 11; + if ($check == 10) { + $check = '-'; + } + $code .= $check; + if ($len > 10) { + // calculate check digit K + $p = 1; + $check = 0; + for ($i = $len; $i >= 0; --$i) { + $digit = $code{$i}; + if ($digit == '-') { + $dval = 10; + } else { + $dval = intval($digit); + } + $check += ($dval * $p); + ++$p; + if ($p > 9) { + $p = 1; + } + } + $check %= 11; + $code .= $check; + ++$len; + } + $code = 'S'.$code.'S'; + $len += 3; + for ($i = 0; $i < $len; ++$i) { + if (!isset($chr[$code{$i}])) { + return false; + } + $seq = $chr[$code{$i}]; + for ($j = 0; $j < 6; ++$j) { + if (($j % 2) == 0) { + $t = true; // bar + } else { + $t = false; // space + } + $w = $seq{$j}; + $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0); + $bararray['maxw'] += $w; + ++$k; + } + } + return $bararray; + } + + /** + * Pharmacode + * Contains digits (0 to 9) + * @param string $code code to represent. + * @return array barcode representation. + * @access protected + */ + protected function barcode_pharmacode($code) { + $seq = ''; + $code = intval($code); + while ($code > 0) { + if (($code % 2) == 0) { + $seq .= '11100'; + $code -= 2; + } else { + $seq .= '100'; + $code -= 1; + } + $code /= 2; + } + $seq = substr($seq, 0, -2); + $seq = strrev($seq); + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array()); + return $this->binseq_to_array($seq, $bararray); + } + + /** + * Pharmacode two-track + * Contains digits (0 to 9) + * @param string $code code to represent. + * @return array barcode representation. + * @access protected + */ + protected function barcode_pharmacode2t($code) { + $seq = ''; + $code = intval($code); + do { + switch ($code % 3) { + case 0: { + $seq .= '3'; + $code = ($code - 3) / 3; + break; + } + case 1: { + $seq .= '1'; + $code = ($code - 1) / 3; + break; + } + case 2: { + $seq .= '2'; + $code = ($code - 2) / 3; + break; + } + } + } while($code != 0); + $seq = strrev($seq); + $k = 0; + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 2, 'bcode' => array()); + $len = strlen($seq); + for ($i = 0; $i < $len; ++$i) { + switch ($seq{$i}) { + case '1': { + $p = 1; + $h = 1; + break; + } + case '2': { + $p = 0; + $h = 1; + break; + } + case '3': { + $p = 0; + $h = 2; + break; + } + } + $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => $h, 'p' => $p); + $bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0); + $bararray['maxw'] += 2; + } + unset($bararray['bcode'][($k - 1)]); + --$bararray['maxw']; + return $bararray; + } + + + /** + * IMB - Intelligent Mail Barcode - Onecode - USPS-B-3200 + * (requires PHP bcmath extension) + * Intelligent Mail barcode is a 65-bar code for use on mail in the United States. + * The fields are described as follows:<ul><li>The Barcode Identifier shall be assigned by USPS to encode the presort identification that is currently printed in human readable form on the optional endorsement line (OEL) as well as for future USPS use. This shall be two digits, with the second digit in the range of 0–4. The allowable encoding ranges shall be 00–04, 10–14, 20–24, 30–34, 40–44, 50–54, 60–64, 70–74, 80–84, and 90–94.</li><li>The Service Type Identifier shall be assigned by USPS for any combination of services requested on the mailpiece. The allowable encoding range shall be 000http://it2.php.net/manual/en/function.dechex.php–999. Each 3-digit value shall correspond to a particular mail class with a particular combination of service(s). Each service program, such as OneCode Confirm and OneCode ACS, shall provide the list of Service Type Identifier values.</li><li>The Mailer or Customer Identifier shall be assigned by USPS as a unique, 6 or 9 digit number that identifies a business entity. The allowable encoding range for the 6 digit Mailer ID shall be 000000- 899999, while the allowable encoding range for the 9 digit Mailer ID shall be 900000000-999999999.</li><li>The Serial or Sequence Number shall be assigned by the mailer for uniquely identifying and tracking mailpieces. The allowable encoding range shall be 000000000–999999999 when used with a 6 digit Mailer ID and 000000-999999 when used with a 9 digit Mailer ID. e. The Delivery Point ZIP Code shall be assigned by the mailer for routing the mailpiece. This shall replace POSTNET for routing the mailpiece to its final delivery point. The length may be 0, 5, 9, or 11 digits. The allowable encoding ranges shall be no ZIP Code, 00000–99999, 000000000–999999999, and 00000000000–99999999999.</li></ul> + * @param string $code code to print, separate the ZIP (routing code) from the rest using a minus char '-' (BarcodeID_ServiceTypeID_MailerID_SerialNumber-RoutingCode) + * @return array barcode representation. + * @access protected + */ + protected function barcode_imb($code) { + $asc_chr = array(4,0,2,6,3,5,1,9,8,7,1,2,0,6,4,8,2,9,5,3,0,1,3,7,4,6,8,9,2,0,5,1,9,4,3,8,6,7,1,2,4,3,9,5,7,8,3,0,2,1,4,0,9,1,7,0,2,4,6,3,7,1,9,5,8); + $dsc_chr = array(7,1,9,5,8,0,2,4,6,3,5,8,9,7,3,0,6,1,7,4,6,8,9,2,5,1,7,5,4,3,8,7,6,0,2,5,4,9,3,0,1,6,8,2,0,4,5,9,6,7,5,2,6,3,8,5,1,9,8,7,4,0,2,6,3); + $asc_pos = array(3,0,8,11,1,12,8,11,10,6,4,12,2,7,9,6,7,9,2,8,4,0,12,7,10,9,0,7,10,5,7,9,6,8,2,12,1,4,2,0,1,5,4,6,12,1,0,9,4,7,5,10,2,6,9,11,2,12,6,7,5,11,0,3,2); + $dsc_pos = array(2,10,12,5,9,1,5,4,3,9,11,5,10,1,6,3,4,1,10,0,2,11,8,6,1,12,3,8,6,4,4,11,0,6,1,9,11,5,3,7,3,10,7,11,8,2,10,3,5,8,0,3,12,11,8,4,5,1,3,0,7,12,9,8,10); + $code_arr = explode('-', $code); + $tracking_number = $code_arr[0]; + if (isset($code_arr[1])) { + $routing_code = $code_arr[1]; + } else { + $routing_code = ''; + } + // Conversion of Routing Code + switch (strlen($routing_code)) { + case 0: { + $binary_code = 0; + break; + } + case 5: { + $binary_code = bcadd($routing_code, '1'); + break; + } + case 9: { + $binary_code = bcadd($routing_code, '100001'); + break; + } + case 11: { + $binary_code = bcadd($routing_code, '1000100001'); + break; + } + default: { + return false; + break; + } + } + $binary_code = bcmul($binary_code, 10); + $binary_code = bcadd($binary_code, $tracking_number{0}); + $binary_code = bcmul($binary_code, 5); + $binary_code = bcadd($binary_code, $tracking_number{1}); + $binary_code .= substr($tracking_number, 2, 18); + // convert to hexadecimal + $binary_code = $this->dec_to_hex($binary_code); + // pad to get 13 bytes + $binary_code = str_pad($binary_code, 26, '0', STR_PAD_LEFT); + // convert string to array of bytes + $binary_code_arr = chunk_split($binary_code, 2, "\r"); + $binary_code_arr = substr($binary_code_arr, 0, -1); + $binary_code_arr = explode("\r", $binary_code_arr); + // calculate frame check sequence + $fcs = $this->imb_crc11fcs($binary_code_arr); + // exclude first 2 bits from first byte + $first_byte = sprintf('%2s', dechex((hexdec($binary_code_arr[0]) << 2) >> 2)); + $binary_code_102bit = $first_byte.substr($binary_code, 2); + // convert binary data to codewords + $codewords = array(); + $data = $this->hex_to_dec($binary_code_102bit); + $codewords[0] = bcmod($data, 636) * 2; + $data = bcdiv($data, 636); + for ($i = 1; $i < 9; ++$i) { + $codewords[$i] = bcmod($data, 1365); + $data = bcdiv($data, 1365); + } + $codewords[9] = $data; + if (($fcs >> 10) == 1) { + $codewords[9] += 659; + } + // generate lookup tables + $table2of13 = $this->imb_tables(2, 78); + $table5of13 = $this->imb_tables(5, 1287); + // convert codewords to characters + $characters = array(); + $bitmask = 512; + foreach($codewords as $k => $val) { + if ($val <= 1286) { + $chrcode = $table5of13[$val]; + } else { + $chrcode = $table2of13[($val - 1287)]; + } + if (($fcs & $bitmask) > 0) { + // bitwise invert + $chrcode = ((~$chrcode) & 8191); + } + $characters[] = $chrcode; + $bitmask /= 2; + } + $characters = array_reverse($characters); + // build bars + $k = 0; + $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 3, 'bcode' => array()); + for ($i = 0; $i < 65; ++$i) { + $asc = (($characters[$asc_chr[$i]] & pow(2, $asc_pos[$i])) > 0); + $dsc = (($characters[$dsc_chr[$i]] & pow(2, $dsc_pos[$i])) > 0); + if ($asc AND $dsc) { + // full bar (F) + $p = 0; + $h = 3; + } elseif ($asc) { + // ascender (A) + $p = 0; + $h = 2; + } elseif ($dsc) { + // descender (D) + $p = 1; + $h = 2; + } else { + // tracker (T) + $p = 1; + $h = 1; + } + $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => $h, 'p' => $p); + $bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0); + $bararray['maxw'] += 2; + } + unset($bararray['bcode'][($k - 1)]); + --$bararray['maxw']; + return $bararray; + } + + /** + * Convert large integer number to hexadecimal representation. + * (requires PHP bcmath extension) + * @param string $number number to convert specified as a string + * @return string hexadecimal representation + */ + public function dec_to_hex($number) { + $i = 0; + $hex = array(); + if($number == 0) { + return '00'; + } + while($number > 0) { + if($number == 0) { + array_push($hex, '0'); + } else { + array_push($hex, strtoupper(dechex(bcmod($number, '16')))); + $number = bcdiv($number, '16', 0); + } + } + $hex = array_reverse($hex); + return implode($hex); + } + + /** + * Convert large hexadecimal number to decimal representation (string). + * (requires PHP bcmath extension) + * @param string $hex hexadecimal number to convert specified as a string + * @return string hexadecimal representation + */ + public function hex_to_dec($hex) { + $dec = 0; + $bitval = 1; + $len = strlen($hex); + for($pos = ($len - 1); $pos >= 0; --$pos) { + $dec = bcadd($dec, bcmul(hexdec($hex{$pos}), $bitval)); + $bitval = bcmul($bitval, 16); + } + return $dec; + } + + /** + * Intelligent Mail Barcode calculation of Frame Check Sequence + * @param string $code_arr array of hexadecimal values (13 bytes holding 102 bits right justified). + * @return int 11 bit Frame Check Sequence as integer (decimal base) + * @access protected + */ + protected function imb_crc11fcs($code_arr) { + $genpoly = 0x0F35; // generator polynomial + $fcs = 0x07FF; // Frame Check Sequence + // do most significant byte skipping the 2 most significant bits + $data = hexdec($code_arr[0]) << 5; + for ($bit = 2; $bit < 8; ++$bit) { + if (($fcs ^ $data) & 0x400) { + $fcs = ($fcs << 1) ^ $genpoly; + } else { + $fcs = ($fcs << 1); + } + $fcs &= 0x7FF; + $data <<= 1; + } + // do rest of bytes + for ($byte = 1; $byte < 13; ++$byte) { + $data = hexdec($code_arr[$byte]) << 3; + for ($bit = 0; $bit < 8; ++$bit) { + if (($fcs ^ $data) & 0x400) { + $fcs = ($fcs << 1) ^ $genpoly; + } else { + $fcs = ($fcs << 1); + } + $fcs &= 0x7FF; + $data <<= 1; + } + } + return $fcs; + } + + /** + * Reverse unsigned short value + * @param int $num value to reversr + * @return int reversed value + * @access protected + */ + protected function imb_reverse_us($num) { + $rev = 0; + for ($i = 0; $i < 16; ++$i) { + $rev <<= 1; + $rev |= ($num & 1); + $num >>= 1; + } + return $rev; + } + + /** + * generate Nof13 tables used for Intelligent Mail Barcode + * @param int $n is the type of table: 2 for 2of13 table, 5 for 5of13table + * @param int $size size of table (78 for n=2 and 1287 for n=5) + * @return array requested table + * @access protected + */ + protected function imb_tables($n, $size) { + $table = array(); + $lli = 0; // LUT lower index + $lui = $size - 1; // LUT upper index + for ($count = 0; $count < 8192; ++$count) { + $bit_count = 0; + for ($bit_index = 0; $bit_index < 13; ++$bit_index) { + $bit_count += intval(($count & (1 << $bit_index)) != 0); + } + // if we don't have the right number of bits on, go on to the next value + if ($bit_count == $n) { + $reverse = ($this->imb_reverse_us($count) >> 3); + // if the reverse is less than count, we have already visited this pair before + if ($reverse >= $count) { + // If count is symmetric, place it at the first free slot from the end of the list. + // Otherwise, place it at the first free slot from the beginning of the list AND place $reverse ath the next free slot from the beginning of the list + if ($reverse == $count) { + $table[$lui] = $count; + --$lui; + } else { + $table[$lli] = $count; + ++$lli; + $table[$lli] = $reverse; + ++$lli; + } + } + } + } + return $table; + } + +} // end of class + +//============================================================+ +// END OF FILE +//============================================================+ +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/cache/chapter_demo_1.txt b/assets/html2pdf/_tcpdf_5.0.002/cache/chapter_demo_1.txt new file mode 100644 index 0000000..422eb43 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/cache/chapter_demo_1.txt @@ -0,0 +1,10 @@ +The year 1866 was marked by a bizarre development, an unexplained and downright inexplicable phenomenon that surely no one has forgotten. Without getting into those rumors that upset civilians in the seaports and deranged the public mind even far inland, it must be said that professional seamen were especially alarmed. Traders, shipowners, captains of vessels, skippers, and master mariners from Europe and America, naval officers from every country, and at their heels the various national governments on these two continents, were all extremely disturbed by the business. +In essence, over a period of time several ships had encountered "an enormous thing" at sea, a long spindle-shaped object, sometimes giving off a phosphorescent glow, infinitely bigger and faster than any whale. +The relevant data on this apparition, as recorded in various logbooks, agreed pretty closely as to the structure of the object or creature in question, its unprecedented speed of movement, its startling locomotive power, and the unique vitality with which it seemed to be gifted. If it was a cetacean, it exceeded in bulk any whale previously classified by science. No naturalist, neither Cuvier nor Lacépède, neither Professor Dumeril nor Professor de Quatrefages, would have accepted the existence of such a monster sight unseen -- specifically, unseen by their own scientific eyes. +Striking an average of observations taken at different times -- rejecting those timid estimates that gave the object a length of 200 feet, and ignoring those exaggerated views that saw it as a mile wide and three long--you could still assert that this phenomenal creature greatly exceeded the dimensions of anything then known to ichthyologists, if it existed at all. +Now then, it did exist, this was an undeniable fact; and since the human mind dotes on objects of wonder, you can understand the worldwide excitement caused by this unearthly apparition. As for relegating it to the realm of fiction, that charge had to be dropped. +In essence, on July 20, 1866, the steamer Governor Higginson, from the Calcutta & Burnach Steam Navigation Co., encountered this moving mass five miles off the eastern shores of Australia. Captain Baker at first thought he was in the presence of an unknown reef; he was even about to fix its exact position when two waterspouts shot out of this inexplicable object and sprang hissing into the air some 150 feet. So, unless this reef was subject to the intermittent eruptions of a geyser, the Governor Higginson had fair and honest dealings with some aquatic mammal, until then unknown, that could spurt from its blowholes waterspouts mixed with air and steam. +Similar events were likewise observed in Pacific seas, on July 23 of the same year, by the Christopher Columbus from the West India & Pacific Steam Navigation Co. Consequently, this extraordinary cetacean could transfer itself from one locality to another with startling swiftness, since within an interval of just three days, the Governor Higginson and the Christopher Columbus had observed it at two positions on the charts separated by a distance of more than 700 nautical leagues. +Fifteen days later and 2,000 leagues farther, the Helvetia from the Compagnie Nationale and the Shannon from the Royal Mail line, running on opposite tacks in that part of the Atlantic lying between the United States and Europe, respectively signaled each other that the monster had been sighted in latitude 42 degrees 15' north and longitude 60 degrees 35' west of the meridian of Greenwich. From their simultaneous observations, they were able to estimate the mammal's minimum length at more than 350 English feet; this was because both the Shannon and the Helvetia were of smaller dimensions, although each measured 100 meters stem to stern. Now then, the biggest whales, those rorqual whales that frequent the waterways of the Aleutian Islands, have never exceeded a length of 56 meters--if they reach even that. +One after another, reports arrived that would profoundly affect public opinion: new observations taken by the transatlantic liner Pereire, the Inman line's Etna running afoul of the monster, an official report drawn up by officers on the French frigate Normandy, dead-earnest reckonings obtained by the general staff of Commodore Fitz-James aboard the Lord Clyde. In lighthearted countries, people joked about this phenomenon, but such serious, practical countries as England, America, and Germany were deeply concerned. +In every big city the monster was the latest rage; they sang about it in the coffee houses, they ridiculed it in the newspapers, they dramatized it in the theaters. The tabloids found it a fine opportunity for hatching all sorts of hoaxes. In those newspapers short of copy, you saw the reappearance of every gigantic imaginary creature, from "Moby Dick," that dreadful white whale from the High Arctic regions, to the stupendous kraken whose tentacles could entwine a 500-ton craft and drag it into the ocean depths. They even reprinted reports from ancient times: the views of Aristotle and Pliny accepting the existence of such monsters, then the Norwegian stories of Bishop Pontoppidan, the narratives of Paul Egede, and finally the reports of Captain Harrington -- whose good faith is above suspicion--in which he claims he saw, while aboard the Castilian in 1857, one of those enormous serpents that, until then, had frequented only the seas of France's old extremist newspaper, The Constitutionalist. diff --git a/assets/html2pdf/_tcpdf_5.0.002/cache/chapter_demo_2.txt b/assets/html2pdf/_tcpdf_5.0.002/cache/chapter_demo_2.txt new file mode 100644 index 0000000..6f7165c --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/cache/chapter_demo_2.txt @@ -0,0 +1,23 @@ +During the period in which these developments were occurring, I had returned from a scientific undertaking organized to explore the Nebraska badlands in the United States. In my capacity as Assistant Professor at the Paris Museum of Natural History, I had been attached to this expedition by the French government. After spending six months in Nebraska, I arrived in New York laden with valuable collections near the end of March. My departure for France was set for early May. In the meantime, then, I was busy classifying my mineralogical, botanical, and zoological treasures when that incident took place with the Scotia. +I was perfectly abreast of this question, which was the big news of the day, and how could I not have been? I had read and reread every American and European newspaper without being any farther along. This mystery puzzled me. Finding it impossible to form any views, I drifted from one extreme to the other. Something was out there, that much was certain, and any doubting Thomas was invited to place his finger on the Scotia's wound. +When I arrived in New York, the question was at the boiling point. The hypothesis of a drifting islet or an elusive reef, put forward by people not quite in their right minds, was completely eliminated. And indeed, unless this reef had an engine in its belly, how could it move about with such prodigious speed? +Also discredited was the idea of a floating hull or some other enormous wreckage, and again because of this speed of movement. +So only two possible solutions to the question were left, creating two very distinct groups of supporters: on one side, those favoring a monster of colossal strength; on the other, those favoring an "underwater boat" of tremendous motor power. +Now then, although the latter hypothesis was completely admissible, it couldn't stand up to inquiries conducted in both the New World and the Old. That a private individual had such a mechanism at his disposal was less than probable. Where and when had he built it, and how could he have built it in secret? +Only some government could own such an engine of destruction, and in these disaster-filled times, when men tax their ingenuity to build increasingly powerful aggressive weapons, it was possible that, unknown to the rest of the world, some nation could have been testing such a fearsome machine. The Chassepot rifle led to the torpedo, and the torpedo has led to this underwater battering ram, which in turn will lead to the world putting its foot down. At least I hope it will. +But this hypothesis of a war machine collapsed in the face of formal denials from the various governments. Since the public interest was at stake and transoceanic travel was suffering, the sincerity of these governments could not be doubted. Besides, how could the assembly of this underwater boat have escaped public notice? Keeping a secret under such circumstances would be difficult enough for an individual, and certainly impossible for a nation whose every move is under constant surveillance by rival powers. +So, after inquiries conducted in England, France, Russia, Prussia, Spain, Italy, America, and even Turkey, the hypothesis of an underwater Monitor was ultimately rejected. +After I arrived in New York, several people did me the honor of consulting me on the phenomenon in question. In France I had published a two-volume work, in quarto, entitled The Mysteries of the Great Ocean Depths. Well received in scholarly circles, this book had established me as a specialist in this pretty obscure field of natural history. My views were in demand. As long as I could deny the reality of the business, I confined myself to a flat "no comment." But soon, pinned to the wall, I had to explain myself straight out. And in this vein, "the honorable Pierre Aronnax, Professor at the Paris Museum," was summoned by The New York Herald to formulate his views no matter what. +I complied. Since I could no longer hold my tongue, I let it wag. I discussed the question in its every aspect, both political and scientific, and this is an excerpt from the well-padded article I published in the issue of April 30. + +"Therefore," I wrote, "after examining these different hypotheses one by one, we are forced, every other supposition having been refuted, to accept the existence of an extremely powerful marine animal. +"The deepest parts of the ocean are totally unknown to us. No soundings have been able to reach them. What goes on in those distant depths? What creatures inhabit, or could inhabit, those regions twelve or fifteen miles beneath the surface of the water? What is the constitution of these animals? It's almost beyond conjecture. +"However, the solution to this problem submitted to me can take the form of a choice between two alternatives. +"Either we know every variety of creature populating our planet, or we do not. +"If we do not know every one of them, if nature still keeps ichthyological secrets from us, nothing is more admissible than to accept the existence of fish or cetaceans of new species or even new genera, animals with a basically 'cast-iron' constitution that inhabit strata beyond the reach of our soundings, and which some development or other, an urge or a whim if you prefer, can bring to the upper level of the ocean for long intervals. +"If, on the other hand, we do know every living species, we must look for the animal in question among those marine creatures already cataloged, and in this event I would be inclined to accept the existence of a giant narwhale. +"The common narwhale, or sea unicorn, often reaches a length of sixty feet. Increase its dimensions fivefold or even tenfold, then give this cetacean a strength in proportion to its size while enlarging its offensive weapons, and you have the animal we're looking for. It would have the proportions determined by the officers of the Shannon, the instrument needed to perforate the Scotia, and the power to pierce a steamer's hull. +"In essence, the narwhale is armed with a sort of ivory sword, or lance, as certain naturalists have expressed it. It's a king-sized tooth as hard as steel. Some of these teeth have been found buried in the bodies of baleen whales, which the narwhale attacks with invariable success. Others have been wrenched, not without difficulty, from the undersides of vessels that narwhales have pierced clean through, as a gimlet pierces a wine barrel. The museum at the Faculty of Medicine in Paris owns one of these tusks with a length of 2.25 meters and a width at its base of forty-eight centimeters! +"All right then! Imagine this weapon to be ten times stronger and the animal ten times more powerful, launch it at a speed of twenty miles per hour, multiply its mass times its velocity, and you get just the collision we need to cause the specified catastrophe. +"So, until information becomes more abundant, I plump for a sea unicorn of colossal dimensions, no longer armed with a mere lance but with an actual spur, like ironclad frigates or those warships called 'rams,' whose mass and motor power it would possess simultaneously. +"This inexplicable phenomenon is thus explained away unless it's something else entirely, which, despite everything that has been sighted, studied, explored and experienced, is still possible!" diff --git a/assets/html2pdf/_tcpdf_5.0.002/cache/table_data_demo.txt b/assets/html2pdf/_tcpdf_5.0.002/cache/table_data_demo.txt new file mode 100644 index 0000000..5a48a42 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/cache/table_data_demo.txt @@ -0,0 +1,15 @@ +Austria;Vienna;83859;8075 +Belgium;Brussels;30518;10192 +Denmark;Copenhagen;43094;5295 +Finland;Helsinki;304529;5147 +France;Paris;543965;58728 +Germany;Berlin;357022;82057 +Greece;Athens;131625;10511 +Ireland;Dublin;70723;3694 +Italy;Roma;301316;57563 +Luxembourg;Luxembourg;2586;424 +Netherlands;Amsterdam;41526;15654 +Portugal;Lisbon;91906;9957 +Spain;Madrid;504790;39348 +Sweden;Stockholm;410934;8839 +United Kingdom;London;243820;58862 diff --git a/assets/html2pdf/_tcpdf_5.0.002/cache/utf8test.txt b/assets/html2pdf/_tcpdf_5.0.002/cache/utf8test.txt new file mode 100644 index 0000000..27cddb1 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/cache/utf8test.txt @@ -0,0 +1,120 @@ +Sentences that contain all letters commonly used in a language +-------------------------------------------------------------- + +Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/> -- 2001-09-02 + +This file is UTF-8 encoded. + + +Danish (da) +--------- + + Quizdeltagerne spiste jordbær med fløde, mens cirkusklovnen + Wolther spillede på xylofon. + (= Quiz contestants were eating strawbery with cream while Wolther + the circus clown played on xylophone.) + +German (de) +----------- + + Falsches Üben von Xylophonmusik quält jeden größeren Zwerg + (= Wrongful practicing of xylophone music tortures every larger dwarf) + + Zwölf Boxkämpfer jagten Eva quer über den Sylter Deich + (= Twelve boxing fighters hunted Eva across the dike of Sylt) + + Heizölrückstoßabdämpfung + (= fuel oil recoil absorber) + (jqvwxy missing, but all non-ASCII letters in one word) + +English (en) +------------ + + The quick brown fox jumps over the lazy dog + +Spanish (es) +------------ + + El pingüino Wenceslao hizo kilómetros bajo exhaustiva lluvia y + frío, añoraba a su querido cachorro. + (Contains every letter and every accent, but not every combination + of vowel + acute.) + +French (fr) +----------- + + Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à + côté de l'alcôve ovoïde, où les bûches se consument dans l'âtre, ce + qui lui permet de penser à la cænogenèse de l'être dont il est question + dans la cause ambiguë entendue à Moÿ, dans un capharnaüm qui, + pense-t-il, diminue çà et là la qualité de son œuvre. + + l'île exiguë + Où l'obèse jury mûr + Fête l'haï volapük, + Âne ex aéquo au whist, + Ôtez ce vœu déçu. + + Le cœur déçu mais l'âme plutôt naïve, Louÿs rêva de crapaüter en + canoë au delà des îles, près du mälström où brûlent les novæ. + +Irish Gaelic (ga) +----------------- + + D'fhuascail Íosa, Úrmhac na hÓighe Beannaithe, pór Éava agus Ádhaimh + +Hungarian (hu) +-------------- + + Árvíztűrő tükörfúrógép + (= flood-proof mirror-drilling machine, only all non-ASCII letters) + +Icelandic (is) +-------------- + + Kæmi ný öxi hér ykist þjófum nú bæði víl og ádrepa + + Sævör grét áðan því úlpan var ónýt + (some ASCII letters missing) + +Greek (el) +------------- + + Γαζέες καὶ μυρτιὲς δὲν θὰ βρῶ πιὰ στὸ χρυσαφὶ ξέφωτο + (= No more shall I see acacias or myrtles in the golden clearing) + + Ξεσκεπάζω τὴν ψυχοφθόρα βδελυγμία + (= I uncover the soul-destroying abhorrence) + +Hebrew (iw) +----------- + + ? דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה + +Polish (pl) +----------- + + Pchnąć w tę łódź jeża lub ośm skrzyń fig + (= To push a hedgehog or eight bins of figs in this boat) + +Russian (ru) +------------ + + В чащах юга жил бы цитрус? Да, но фальшивый экземпляр! + (= Would a citrus live in the bushes of south? Yes, but only a fake one!) + +Thai (th) +--------- + + [--------------------------|------------------------] + ๏ เป็นมนุษย์สุดประเสริฐเลิศคุณค่า กว่าบรรดาฝูงสัตว์เดรัจฉาน + จงฝ่าฟันพัฒนาวิชาการ อย่าล้างผลาญฤๅเข่นฆ่าบีฑาใคร + ไม่ถือโทษโกรธแช่งซัดฮึดฮัดด่า หัดอภัยเหมือนกีฬาอัชฌาสัย + ปฏิบัติประพฤติกฎกำหนดใจ พูดจาให้จ๊ะๆ จ๋าๆ น่าฟังเอย ฯ + + [The copyright for the Thai example is owned by The Computer + Association of Thailand under the Royal Patronage of His Majesty the + King.] + +Please let me know if you find others! Special thanks to the people +from all over the world who contributed these sentences. diff --git a/assets/html2pdf/_tcpdf_5.0.002/config/lang/bra.php b/assets/html2pdf/_tcpdf_5.0.002/config/lang/bra.php new file mode 100644 index 0000000..81c17d7 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/config/lang/bra.php @@ -0,0 +1,50 @@ +<?php +//============================================================+ +// File name : eng.php +// Begin : 2004-03-03 +// Last Update : 2010-02-17 +// +// Description : Language module for TCPDF +// (contains translated texts) +// +// Author: Nicola Asuni +// +// (c) Copyright: +// Nicola Asuni +// Tecnick.com s.r.l. +// Via Della Pace, 11 +// 09044 Quartucciu (CA) +// ITALY +// www.tecnick.com +// info@tecnick.com +//============================================================+ + +/** + * TCPDF language file (contains translated texts). + * @package com.tecnick.tcpdf + * @abstract TCPDF language file. + * @author Nicola Asuni + * @copyright 2004-2009 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com + * @link http://tcpdf.sourceforge.net + * @license http://www.gnu.org/copyleft/lesser.html LGPL + * @since 2004-03-03 + */ + +// ENGLISH + +global $l; +$l = Array(); + +// PAGE META DESCRIPTORS -------------------------------------- + +$l['a_meta_charset'] = 'UTF-8'; +$l['a_meta_dir'] = 'ltr'; +$l['a_meta_language'] = 'pt'; + +// TRANSLATIONS -------------------------------------- +$l['w_page'] = 'página'; + +//============================================================+ +// END OF FILE +//============================================================+ +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/config/lang/eng.php b/assets/html2pdf/_tcpdf_5.0.002/config/lang/eng.php new file mode 100644 index 0000000..6469105 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/config/lang/eng.php @@ -0,0 +1,50 @@ +<?php +//============================================================+ +// File name : eng.php +// Begin : 2004-03-03 +// Last Update : 2010-02-17 +// +// Description : Language module for TCPDF +// (contains translated texts) +// +// Author: Nicola Asuni +// +// (c) Copyright: +// Nicola Asuni +// Tecnick.com s.r.l. +// Via Della Pace, 11 +// 09044 Quartucciu (CA) +// ITALY +// www.tecnick.com +// info@tecnick.com +//============================================================+ + +/** + * TCPDF language file (contains translated texts). + * @package com.tecnick.tcpdf + * @abstract TCPDF language file. + * @author Nicola Asuni + * @copyright 2004-2009 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com + * @link http://tcpdf.sourceforge.net + * @license http://www.gnu.org/copyleft/lesser.html LGPL + * @since 2004-03-03 + */ + +// ENGLISH + +global $l; +$l = Array(); + +// PAGE META DESCRIPTORS -------------------------------------- + +$l['a_meta_charset'] = 'UTF-8'; +$l['a_meta_dir'] = 'ltr'; +$l['a_meta_language'] = 'en'; + +// TRANSLATIONS -------------------------------------- +$l['w_page'] = 'page'; + +//============================================================+ +// END OF FILE +//============================================================+ +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/config/lang/ger.php b/assets/html2pdf/_tcpdf_5.0.002/config/lang/ger.php new file mode 100644 index 0000000..2a70352 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/config/lang/ger.php @@ -0,0 +1,50 @@ +<?php +//============================================================+ +// File name : eng.php +// Begin : 2004-03-03 +// Last Update : 2010-02-17 +// +// Description : Language module for TCPDF +// (contains translated texts) +// +// Author: Nicola Asuni +// +// (c) Copyright: +// Nicola Asuni +// Tecnick.com s.r.l. +// Via Della Pace, 11 +// 09044 Quartucciu (CA) +// ITALY +// www.tecnick.com +// info@tecnick.com +//============================================================+ + +/** + * TCPDF language file (contains translated texts). + * @package com.tecnick.tcpdf + * @abstract TCPDF language file. + * @author Nicola Asuni + * @copyright 2004-2009 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com + * @link http://tcpdf.sourceforge.net + * @license http://www.gnu.org/copyleft/lesser.html LGPL + * @since 2004-03-03 + */ + +// ENGLISH + +global $l; +$l = Array(); + +// PAGE META DESCRIPTORS -------------------------------------- + +$l['a_meta_charset'] = 'UTF-8'; +$l['a_meta_dir'] = 'ltr'; +$l['a_meta_language'] = 'de'; + +// TRANSLATIONS -------------------------------------- +$l['w_page'] = 'seite'; + +//============================================================+ +// END OF FILE +//============================================================+ +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/config/lang/ita.php b/assets/html2pdf/_tcpdf_5.0.002/config/lang/ita.php new file mode 100644 index 0000000..25f9548 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/config/lang/ita.php @@ -0,0 +1,50 @@ +<?php +//============================================================+ +// File name : ita.php +// Begin : 2004-03-03 +// Last Update : 2010-02-17 +// +// Description : Language module for TCPDF +// (contains translated texts) +// +// Author: Nicola Asuni +// +// (c) Copyright: +// Nicola Asuni +// Tecnick.com s.r.l. +// Via Della Pace, 11 +// 09044 Quartucciu (CA) +// ITALY +// www.tecnick.com +// info@tecnick.com +//============================================================+ + +/** + * TCPDF language file (contains translated texts). + * @package com.tecnick.tcpdf + * @abstract TCPDF language file. + * @author Nicola Asuni + * @copyright 2004-2009 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com + * @link http://tcpdf.sourceforge.net + * @license http://www.gnu.org/copyleft/lesser.html LGPL + * @since 2004-03-03 + */ + +// ENGLISH + +global $l; +$l = Array(); + +// PAGE META DESCRIPTORS -------------------------------------- + +$l['a_meta_charset'] = 'UTF-8'; +$l['a_meta_dir'] = 'ltr'; +$l['a_meta_language'] = 'it'; + +// TRANSLATIONS -------------------------------------- +$l['w_page'] = 'pagina'; + +//============================================================+ +// END OF FILE +//============================================================+ +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/config/tcpdf_config.php b/assets/html2pdf/_tcpdf_5.0.002/config/tcpdf_config.php new file mode 100644 index 0000000..d824f5b --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/config/tcpdf_config.php @@ -0,0 +1,244 @@ +<?php +//============================================================+ +// File name : tcpdf_config.php +// Begin : 2004-06-11 +// Last Update : 2010-04-28 +// +// Description : Configuration file for TCPDF. +// +// Author: Nicola Asuni +// +// (c) Copyright: +// Nicola Asuni +// Tecnick.com s.r.l. +// Via Della Pace, 11 +// 09044 Quartucciu (CA) +// ITALY +// www.tecnick.com +// info@tecnick.com +//============================================================+ + +/** + * Configuration file for TCPDF. + * @author Nicola Asuni + * @copyright 2004-2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com + * @package com.tecnick.tcpdf + * @version 4.9.005 + * @link http://tcpdf.sourceforge.net + * @license http://www.gnu.org/copyleft/lesser.html LGPL + * @since 2004-10-27 + */ + +// If you define the constant K_TCPDF_EXTERNAL_CONFIG, the following settings will be ignored. + +if (!defined('K_TCPDF_EXTERNAL_CONFIG')) { + + // DOCUMENT_ROOT fix for IIS Webserver + if ((!isset($_SERVER['DOCUMENT_ROOT'])) OR (empty($_SERVER['DOCUMENT_ROOT']))) { + if(isset($_SERVER['SCRIPT_FILENAME'])) { + $_SERVER['DOCUMENT_ROOT'] = str_replace( '\\', '/', substr($_SERVER['SCRIPT_FILENAME'], 0, 0-strlen($_SERVER['PHP_SELF']))); + } elseif(isset($_SERVER['PATH_TRANSLATED'])) { + $_SERVER['DOCUMENT_ROOT'] = str_replace( '\\', '/', substr(str_replace('\\\\', '\\', $_SERVER['PATH_TRANSLATED']), 0, 0-strlen($_SERVER['PHP_SELF']))); + } else { + // define here your DOCUMENT_ROOT path if the previous fails + $_SERVER['DOCUMENT_ROOT'] = '/var/www'; + } + } + + // Automatic calculation for the following K_PATH_MAIN constant + $k_path_main = str_replace( '\\', '/', realpath(substr(dirname(__FILE__), 0, 0-strlen('config')))); + if (substr($k_path_main, -1) != '/') { + $k_path_main .= '/'; + } + + /** + * Installation path (/var/www/tcpdf/). + * By default it is automatically calculated but you can also set it as a fixed string to improve performances. + */ + define ('K_PATH_MAIN', $k_path_main); + + // Automatic calculation for the following K_PATH_URL constant + $k_path_url = $k_path_main; // default value for console mode + if (isset($_SERVER['HTTP_HOST']) AND (!empty($_SERVER['HTTP_HOST']))) { + if(isset($_SERVER['HTTPS']) AND (!empty($_SERVER['HTTPS'])) AND strtolower($_SERVER['HTTPS'])!='off') { + $k_path_url = 'https://'; + } else { + $k_path_url = 'http://'; + } + $k_path_url .= $_SERVER['HTTP_HOST']; + $k_path_url .= str_replace( '\\', '/', substr($_SERVER['PHP_SELF'], 0, -24)); + } + + /** + * URL path to tcpdf installation folder (http://localhost/tcpdf/). + * By default it is automatically calculated but you can also set it as a fixed string to improve performances. + */ + define ('K_PATH_URL', $k_path_url); + + /** + * path for PDF fonts + * use K_PATH_MAIN.'fonts/old/' for old non-UTF8 fonts + */ + define ('K_PATH_FONTS', K_PATH_MAIN.'fonts/'); + + /** + * cache directory for temporary files (full path) + */ + define ('K_PATH_CACHE', K_PATH_MAIN.'cache/'); + + /** + * cache directory for temporary files (url path) + */ + define ('K_PATH_URL_CACHE', K_PATH_URL.'cache/'); + + /** + *images directory + */ + define ('K_PATH_IMAGES', K_PATH_MAIN.'images/'); + + /** + * blank image + */ + define ('K_BLANK_IMAGE', K_PATH_IMAGES.'_blank.png'); + + /** + * page format + */ + define ('PDF_PAGE_FORMAT', 'A4'); + + /** + * page orientation (P=portrait, L=landscape) + */ + define ('PDF_PAGE_ORIENTATION', 'P'); + + /** + * document creator + */ + define ('PDF_CREATOR', 'TCPDF'); + + /** + * document author + */ + define ('PDF_AUTHOR', 'TCPDF'); + + /** + * header title + */ + define ('PDF_HEADER_TITLE', 'TCPDF Example'); + + /** + * header description string + */ + define ('PDF_HEADER_STRING', "by Nicola Asuni - Tecnick.com\nwww.tcpdf.org"); + + /** + * image logo + */ + define ('PDF_HEADER_LOGO', 'tcpdf_logo.jpg'); + + /** + * header logo image width [mm] + */ + define ('PDF_HEADER_LOGO_WIDTH', 30); + + /** + * document unit of measure [pt=point, mm=millimeter, cm=centimeter, in=inch] + */ + define ('PDF_UNIT', 'mm'); + + /** + * header margin + */ + define ('PDF_MARGIN_HEADER', 5); + + /** + * footer margin + */ + define ('PDF_MARGIN_FOOTER', 10); + + /** + * top margin + */ + define ('PDF_MARGIN_TOP', 27); + + /** + * bottom margin + */ + define ('PDF_MARGIN_BOTTOM', 25); + + /** + * left margin + */ + define ('PDF_MARGIN_LEFT', 15); + + /** + * right margin + */ + define ('PDF_MARGIN_RIGHT', 15); + + /** + * default main font name + */ + define ('PDF_FONT_NAME_MAIN', 'helvetica'); + + /** + * default main font size + */ + define ('PDF_FONT_SIZE_MAIN', 10); + + /** + * default data font name + */ + define ('PDF_FONT_NAME_DATA', 'helvetica'); + + /** + * default data font size + */ + define ('PDF_FONT_SIZE_DATA', 8); + + /** + * default monospaced font name + */ + define ('PDF_FONT_MONOSPACED', 'courier'); + + /** + * ratio used to adjust the conversion of pixels to user units + */ + define ('PDF_IMAGE_SCALE_RATIO', 1.25); + + /** + * magnification factor for titles + */ + define('HEAD_MAGNIFICATION', 1.1); + + /** + * height of cell repect font height + */ + define('K_CELL_HEIGHT_RATIO', 1.25); + + /** + * title magnification respect main font size + */ + define('K_TITLE_MAGNIFICATION', 1.3); + + /** + * reduction factor for small font + */ + define('K_SMALL_RATIO', 2/3); + + /** + * set to true to enable the special procedure used to avoid the overlappind of symbols on Thai language + */ + define('K_THAI_TOPCHARS', true); + + /** + * if true allows to call TCPDF methods using HTML syntax + * IMPORTANT: For security reason, disable this feature if you are printing user HTML content. + */ + define('K_TCPDF_CALLS_IN_HTML', true); +} + +//============================================================+ +// END OF FILE +//============================================================+ +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/config/tcpdf_config_alt.php b/assets/html2pdf/_tcpdf_5.0.002/config/tcpdf_config_alt.php new file mode 100644 index 0000000..471c2cc --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/config/tcpdf_config_alt.php @@ -0,0 +1,238 @@ +<?php +//============================================================+ +// File name : tcpdf_config.php +// Begin : 2004-06-11 +// Last Update : 2010-04-28 +// +// Description : Alternative configuration file for TCPDF. +// +// Author: Nicola Asuni +// +// (c) Copyright: +// Nicola Asuni +// Tecnick.com s.r.l. +// Via Della Pace, 11 +// 09044 Quartucciu (CA) +// ITALY +// www.tecnick.com +// info@tecnick.com +//============================================================+ + +/** + * Alternative configuration file for TCPDF. + * @author Nicola Asuni + * @copyright 2004-2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com + * @package com.tecnick.tcpdf + * @version 4.9.005 + * @link http://tcpdf.sourceforge.net + * @license http://www.gnu.org/copyleft/lesser.html LGPL + * @since 2004-10-27 + */ + +// DOCUMENT_ROOT fix for IIS Webserver +if ((!isset($_SERVER['DOCUMENT_ROOT'])) OR (empty($_SERVER['DOCUMENT_ROOT']))) { + if(isset($_SERVER['SCRIPT_FILENAME'])) { + $_SERVER['DOCUMENT_ROOT'] = str_replace( '\\', '/', substr($_SERVER['SCRIPT_FILENAME'], 0, 0-strlen($_SERVER['PHP_SELF']))); + } elseif(isset($_SERVER['PATH_TRANSLATED'])) { + $_SERVER['DOCUMENT_ROOT'] = str_replace( '\\', '/', substr(str_replace('\\\\', '\\', $_SERVER['PATH_TRANSLATED']), 0, 0-strlen($_SERVER['PHP_SELF']))); + } else { + // define here your DOCUMENT_ROOT path if the previous fails + $_SERVER['DOCUMENT_ROOT'] = '/var/www'; + } +} + +// Automatic calculation for the following K_PATH_MAIN constant +$k_path_main = str_replace( '\\', '/', realpath(substr(dirname(__FILE__), 0, 0-strlen('config')))); +if (substr($k_path_main, -1) != '/') { + $k_path_main .= '/'; +} + +/** + * Installation path (/var/www/tcpdf/). + * By default it is automatically calculated but you can also set it as a fixed string to improve performances. + */ +define ('K_PATH_MAIN', $k_path_main); + +// Automatic calculation for the following K_PATH_URL constant +if (isset($_SERVER['HTTP_HOST']) AND (!empty($_SERVER['HTTP_HOST']))) { + if(isset($_SERVER['HTTPS']) AND (!empty($_SERVER['HTTPS'])) AND strtolower($_SERVER['HTTPS'])!='off') { + $k_path_url = 'https://'; + } else { + $k_path_url = 'http://'; + } + $k_path_url .= $_SERVER['HTTP_HOST']; + $k_path_url .= str_replace( '\\', '/', substr($_SERVER['PHP_SELF'], 0, -24)); +} + +/** + * URL path to tcpdf installation folder (http://localhost/tcpdf/). + * By default it is automatically calculated but you can also set it as a fixed string to improve performances.. + */ +define ('K_PATH_URL', $k_path_url); + +/** + * path for PDF fonts + * use K_PATH_MAIN.'fonts/old/' for old non-UTF8 fonts + */ +define ('K_PATH_FONTS', K_PATH_MAIN.'fonts/'); + +/** + * cache directory for temporary files (full path) + */ +define ('K_PATH_CACHE', K_PATH_MAIN.'cache/'); + +/** + * cache directory for temporary files (url path) + */ +define ('K_PATH_URL_CACHE', K_PATH_URL.'cache/'); + +/** + *images directory + */ +define ('K_PATH_IMAGES', K_PATH_MAIN.'images/'); + +/** + * blank image + */ +define ('K_BLANK_IMAGE', K_PATH_IMAGES.'_blank.png'); + +/** + * page format + */ +define ('PDF_PAGE_FORMAT', 'A4'); + +/** + * page orientation (P=portrait, L=landscape) + */ +define ('PDF_PAGE_ORIENTATION', 'P'); + +/** + * document creator + */ +define ('PDF_CREATOR', 'TCPDF'); + +/** + * document author + */ +define ('PDF_AUTHOR', 'TCPDF'); + +/** + * header title + */ +define ('PDF_HEADER_TITLE', 'TCPDF Example'); + +/** + * header description string + */ +define ('PDF_HEADER_STRING', "by Nicola Asuni - Tecnick.com\nwww.tcpdf.org"); + +/** + * image logo + */ +define ('PDF_HEADER_LOGO', 'tcpdf_logo.jpg'); + +/** + * header logo image width [mm] + */ +define ('PDF_HEADER_LOGO_WIDTH', 30); + +/** + * document unit of measure [pt=point, mm=millimeter, cm=centimeter, in=inch] + */ +define ('PDF_UNIT', 'mm'); + +/** + * header margin + */ +define ('PDF_MARGIN_HEADER', 5); + +/** + * footer margin + */ +define ('PDF_MARGIN_FOOTER', 10); + +/** + * top margin + */ +define ('PDF_MARGIN_TOP', 27); + +/** + * bottom margin + */ +define ('PDF_MARGIN_BOTTOM', 25); + +/** + * left margin + */ +define ('PDF_MARGIN_LEFT', 15); + +/** + * right margin + */ +define ('PDF_MARGIN_RIGHT', 15); + +/** + * default main font name + */ +define ('PDF_FONT_NAME_MAIN', 'helvetica'); + +/** + * default main font size + */ +define ('PDF_FONT_SIZE_MAIN', 10); + +/** + * default data font name + */ +define ('PDF_FONT_NAME_DATA', 'helvetica'); + +/** + * default data font size + */ +define ('PDF_FONT_SIZE_DATA', 8); + +/** + * default monospaced font name + */ +define ('PDF_FONT_MONOSPACED', 'courier'); + +/** + * ratio used to adjust the conversion of pixels to user units + */ +define ('PDF_IMAGE_SCALE_RATIO', 1.25); + +/** + * magnification factor for titles + */ +define('HEAD_MAGNIFICATION', 1.1); + +/** + * height of cell repect font height + */ +define('K_CELL_HEIGHT_RATIO', 1.25); + +/** + * title magnification respect main font size + */ +define('K_TITLE_MAGNIFICATION', 1.3); + +/** + * reduction factor for small font + */ +define('K_SMALL_RATIO', 2/3); + +/** + * set to true to enable the special procedure used to avoid the overlappind of symbols on Thai language + */ +define('K_THAI_TOPCHARS', true); + +/** + * if true allows to call TCPDF methods using HTML syntax + * IMPORTANT: For security reason, disable this feature if you are printing user HTML content. + */ +define('K_TCPDF_CALLS_IN_HTML', true); + +//============================================================+ +// END OF FILE +//============================================================+ +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/doc/read_me.txt b/assets/html2pdf/_tcpdf_5.0.002/doc/read_me.txt new file mode 100644 index 0000000..6ab2179 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/doc/read_me.txt @@ -0,0 +1,3 @@ +You can read the documentation at : http://www.tecnick.com/pagefiles/tcpdf/doc/index.html + +it has been removed because of the size of the package of HTML2PDF... \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/examples/read_me.txt b/assets/html2pdf/_tcpdf_5.0.002/examples/read_me.txt new file mode 100644 index 0000000..de07e6b --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/examples/read_me.txt @@ -0,0 +1,3 @@ +You can read the documentation at : http://www.tecnick.com/public/code/cp_dpage.php?aiocp_dp=tcpdf_examples + +it has been removed because of the size of the package of HTML2PDF... \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/README.TXT b/assets/html2pdf/_tcpdf_5.0.002/fonts/README.TXT new file mode 100644 index 0000000..c27086f --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/README.TXT @@ -0,0 +1,3 @@ +This folder contains fonts descriptions for TCPDF. +All fonts names must be in lowercase. +Please read the documentation on subfolders for copyright, license and other information. \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/ZarBold.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/ZarBold.ctg.z new file mode 100644 index 0000000..e096e5c Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/ZarBold.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/ZarBold.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/ZarBold.z new file mode 100644 index 0000000..41df8da Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/ZarBold.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/almohanad.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/almohanad.ctg.z new file mode 100644 index 0000000..8e9b577 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/almohanad.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/almohanad.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/almohanad.php new file mode 100644 index 0000000..33930ec --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/almohanad.php @@ -0,0 +1,102 @@ +<?php +$type='TrueTypeUnicode'; +$name='AlMohanad'; +$desc=array('Ascent'=>1093,'Descent'=>-509,'CapHeight'=>1093,'Flags'=>32,'FontBBox'=>'[-278 -507 1124 1093]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>600); +$up=-136; +$ut=64; +$dw=600; +$cw=array( + 0=>0,32=>139,33=>185,34=>308,35=>278,36=>278,37=>556,38=>463,39=>154,40=>185,41=>185,42=>278,43=>317,44=>139,45=>185,46=>139, + 47=>154,48=>278,49=>278,50=>278,51=>278,52=>278,53=>278,54=>278,55=>278,56=>278,57=>278,58=>185,59=>185,60=>317,61=>317,62=>317, + 63=>278,64=>517,65=>401,66=>371,67=>401,68=>402,69=>371,70=>339,71=>432,72=>430,73=>214,74=>278,75=>424,76=>369,77=>524,78=>401, + 79=>432,80=>339,81=>432,82=>396,83=>309,84=>371,85=>401,86=>401,87=>556,88=>401,89=>401,90=>371,91=>185,92=>154,93=>185,94=>323, + 95=>278,96=>185,97=>278,98=>309,99=>247,100=>309,101=>247,102=>185,103=>278,104=>309,105=>154,106=>185,107=>309,108=>154,109=>463,110=>309, + 111=>278,112=>309,113=>309,114=>247,115=>216,116=>185,117=>309,118=>278,119=>401,120=>278,121=>278,122=>247,123=>219,124=>122,125=>219,126=>289, + 8364=>278,1027=>339,8218=>185,1107=>254,8222=>278,8230=>556,8224=>278,8225=>278,710=>185,8240=>556,352=>309,8249=>185,338=>556,1036=>432,381=>371,1039=>432, + 8216=>185,8217=>185,8220=>278,8221=>278,8226=>194,8211=>278,8212=>556,732=>185,8482=>556,353=>216,8250=>185,339=>401,1116=>297,382=>247,376=>401,161=>185, + 162=>278,163=>278,164=>278,165=>278,166=>122,167=>278,168=>185,169=>415,170=>167,171=>278,172=>317,174=>415,175=>185,176=>222,177=>317,178=>167, + 179=>167,180=>185,181=>309,182=>300,183=>139,184=>185,185=>167,186=>183,187=>278,188=>417,189=>417,190=>417,191=>278,192=>401,193=>401,194=>401, + 195=>401,196=>401,197=>401,198=>556,199=>401,200=>371,201=>371,202=>371,203=>371,204=>216,205=>216,206=>216,207=>216,208=>401,209=>401,210=>432, + 211=>432,212=>432,213=>432,214=>432,215=>317,216=>432,217=>401,218=>401,219=>401,220=>401,221=>401,222=>339,223=>309,224=>278,225=>278,226=>278, + 227=>278,228=>278,229=>278,230=>401,231=>247,232=>247,233=>247,234=>247,235=>247,236=>154,237=>154,238=>154,239=>154,240=>278,241=>309,242=>278, + 243=>278,244=>278,245=>278,246=>278,247=>317,248=>278,249=>309,250=>309,251=>309,252=>309,253=>278,254=>309,255=>278,256=>401,257=>278,258=>401, + 259=>278,260=>401,261=>278,262=>401,263=>247,264=>401,265=>247,266=>401,267=>247,268=>401,269=>247,270=>401,271=>309,272=>401,273=>309,274=>371, + 275=>247,276=>371,277=>247,278=>371,279=>247,280=>371,281=>247,282=>371,283=>247,284=>432,285=>278,286=>432,287=>278,288=>432,289=>278,290=>432, + 291=>278,292=>432,293=>309,294=>432,295=>309,296=>216,297=>154,298=>216,299=>154,300=>216,301=>154,302=>216,303=>154,304=>216,305=>154,306=>490, + 307=>270,308=>278,309=>185,310=>432,311=>309,312=>297,313=>371,314=>154,315=>371,316=>154,317=>371,318=>154,319=>371,320=>293,321=>371,322=>154, + 323=>401,324=>309,325=>401,326=>309,327=>401,328=>309,329=>391,330=>401,331=>309,332=>432,333=>278,334=>432,335=>278,336=>432,337=>278,340=>401, + 341=>247,342=>401,343=>247,344=>401,345=>247,346=>309,347=>216,348=>309,349=>216,350=>309,351=>216,354=>371,355=>185,356=>371,357=>185,358=>371, + 359=>185,360=>401,361=>309,362=>401,363=>309,364=>401,365=>309,366=>401,367=>309,368=>401,369=>309,370=>401,371=>309,372=>556,373=>401,374=>401, + 375=>278,377=>371,378=>247,379=>371,380=>247,383=>185,450=>317,477=>247,484=>432,485=>278,536=>309,537=>216,538=>371,539=>185,658=>282,711=>185, + 728=>185,729=>185,730=>185,731=>185,733=>185,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0, + 779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0, + 795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0, + 811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0, + 827=>0,828=>0,829=>0,830=>0,831=>0,864=>0,865=>0,884=>111,885=>111,890=>0,894=>185,900=>100,901=>183,902=>401,903=>139,904=>451, + 905=>532,906=>316,908=>451,910=>501,911=>451,912=>183,913=>401,914=>371,915=>339,916=>422,917=>371,918=>371,919=>432,920=>432,921=>216,922=>432, + 923=>401,924=>524,925=>401,926=>361,927=>432,928=>451,929=>339,931=>361,932=>371,933=>401,934=>482,935=>401,936=>482,937=>451,938=>0,939=>401, + 940=>336,941=>244,942=>336,943=>183,944=>306,945=>336,946=>306,947=>306,948=>306,949=>244,950=>275,951=>336,952=>306,953=>183,954=>338,955=>275, + 956=>336,957=>275,958=>275,959=>306,960=>336,961=>306,962=>244,963=>306,964=>244,965=>306,966=>367,967=>275,968=>397,969=>397,970=>183,971=>306, + 972=>306,973=>306,974=>397,976=>306,977=>306,978=>401,979=>401,980=>401,981=>367,982=>336,986=>283,987=>237,988=>339,989=>261,1024=>371,1025=>371, + 1026=>371,1028=>401,1029=>309,1030=>216,1031=>216,1032=>278,1033=>573,1034=>573,1035=>449,1037=>432,1038=>401,1040=>401,1041=>371,1042=>371,1043=>328,1044=>432, + 1045=>371,1046=>615,1047=>313,1048=>429,1049=>429,1050=>424,1051=>432,1052=>524,1053=>432,1054=>432,1055=>430,1056=>339,1057=>401,1058=>371,1059=>401,1060=>444, + 1061=>401,1062=>429,1063=>432,1064=>618,1065=>618,1066=>482,1067=>539,1068=>350,1069=>401,1070=>619,1071=>408,1072=>278,1073=>278,1074=>279,1075=>246,1076=>309, + 1077=>247,1078=>417,1079=>227,1080=>319,1081=>319,1082=>297,1083=>302,1084=>376,1085=>309,1086=>278,1087=>309,1088=>309,1089=>247,1090=>274,1091=>278,1092=>458, + 1093=>278,1094=>309,1095=>309,1096=>454,1097=>454,1098=>340,1099=>423,1100=>284,1101=>247,1102=>439,1103=>284,1104=>247,1105=>247,1106=>309,1108=>247,1109=>216, + 1110=>154,1111=>154,1112=>185,1113=>440,1114=>437,1115=>309,1117=>309,1118=>278,1119=>309,1164=>339,1165=>284,1166=>339,1167=>309,1168=>339,1169=>254,1170=>339, + 1171=>254,1172=>339,1173=>254,1174=>615,1175=>417,1176=>322,1177=>216,1178=>432,1179=>297,1180=>432,1181=>297,1182=>432,1183=>297,1184=>537,1185=>352,1186=>432, + 1187=>309,1188=>563,1189=>408,1190=>432,1191=>461,1192=>401,1193=>247,1194=>401,1195=>247,1196=>371,1197=>274,1198=>401,1199=>278,1200=>401,1201=>278,1202=>401, + 1203=>278,1204=>581,1205=>432,1206=>432,1207=>309,1208=>432,1209=>309,1210=>432,1211=>309,1212=>367,1213=>247,1214=>367,1215=>247,1216=>216,1217=>615,1218=>417, + 1219=>432,1220=>297,1223=>432,1224=>309,1227=>432,1228=>309,1232=>401,1233=>278,1234=>401,1235=>278,1236=>556,1237=>401,1238=>371,1239=>247,1240=>367,1241=>247, + 1242=>367,1243=>247,1244=>615,1245=>417,1246=>313,1247=>227,1248=>322,1249=>216,1250=>432,1251=>309,1252=>432,1253=>309,1254=>432,1255=>278,1256=>432,1257=>278, + 1258=>432,1259=>278,1260=>401,1261=>247,1262=>401,1263=>278,1264=>401,1265=>278,1266=>401,1267=>278,1268=>432,1269=>309,1272=>548,1273=>423,1488=>280,1489=>280, + 1490=>174,1491=>280,1492=>280,1493=>158,1494=>158,1495=>280,1496=>280,1497=>158,1498=>287,1499=>280,1500=>280,1501=>280,1502=>280,1503=>156,1504=>158,1505=>280, + 1506=>280,1507=>292,1508=>280,1509=>273,1510=>280,1511=>305,1512=>285,1513=>299,1514=>280,1548=>195,1563=>246,1567=>340,1569=>392,1570=>306,1571=>247,1572=>447, + 1573=>247,1574=>602,1575=>192,1576=>635,1577=>369,1578=>635,1579=>635,1580=>548,1581=>1173,1582=>548,1583=>363,1584=>363,1585=>439,1586=>442,1587=>875,1588=>875, + 1589=>1061,1590=>1061,1591=>811,1592=>811,1593=>549,1594=>547,1600=>389,1601=>755,1602=>574,1603=>717,1604=>555,1605=>423,1606=>532,1607=>371,1608=>454,1609=>633, + 1610=>643,1611=>-19,1612=>-26,1613=>-20,1614=>-19,1615=>-18,1616=>-19,1617=>-19,1618=>-15,1632=>383,1633=>383,1634=>383,1635=>383,1636=>383,1637=>383,1638=>383, + 1639=>383,1640=>383,1641=>383,1642=>383,1645=>398,7936=>336,7937=>336,7938=>336,7939=>336,7940=>336,7941=>336,7942=>336,7943=>336,7944=>401,7945=>401,7946=>401, + 7947=>401,7948=>401,7949=>401,7950=>401,7951=>401,7952=>244,7953=>244,7954=>244,7955=>244,7956=>244,7957=>244,7960=>371,7961=>371,7962=>371,7963=>371,7964=>371, + 7965=>371,7968=>336,7969=>336,7970=>336,7971=>336,7972=>336,7973=>336,7974=>336,7975=>336,7976=>432,7977=>432,7978=>432,7979=>432,7980=>432,7981=>432,7982=>432, + 7983=>432,7984=>183,7985=>183,7986=>183,7987=>183,7988=>183,7989=>183,7990=>183,7991=>183,7992=>216,7993=>216,7994=>216,7995=>216,7996=>216,7997=>216,7998=>216, + 7999=>216,8000=>306,8001=>306,8002=>306,8003=>306,8004=>306,8005=>306,8008=>432,8009=>432,8010=>432,8011=>432,8012=>432,8013=>432,8016=>306,8017=>306,8018=>306, + 8019=>306,8020=>306,8021=>306,8022=>306,8023=>306,8025=>401,8027=>401,8029=>401,8031=>401,8032=>397,8033=>397,8034=>397,8035=>397,8036=>397,8037=>397,8038=>397, + 8039=>397,8040=>451,8041=>451,8042=>451,8043=>451,8044=>451,8045=>451,8046=>451,8047=>451,8048=>336,8049=>336,8050=>244,8051=>244,8052=>336,8053=>336,8054=>183, + 8055=>183,8056=>306,8057=>306,8058=>306,8059=>306,8060=>397,8061=>397,8064=>336,8065=>336,8066=>336,8067=>336,8068=>336,8069=>336,8070=>336,8071=>336,8072=>401, + 8073=>401,8074=>401,8075=>401,8076=>401,8077=>401,8078=>401,8079=>401,8080=>336,8081=>336,8082=>336,8083=>336,8084=>336,8085=>336,8086=>336,8087=>336,8088=>432, + 8089=>432,8090=>432,8091=>432,8092=>432,8093=>432,8094=>432,8095=>432,8096=>397,8097=>397,8098=>397,8099=>397,8100=>397,8101=>397,8102=>397,8103=>397,8104=>451, + 8105=>451,8106=>451,8107=>451,8108=>451,8109=>451,8110=>451,8111=>451,8112=>336,8113=>336,8114=>336,8115=>336,8116=>336,8118=>336,8119=>336,8120=>401,8121=>401, + 8122=>401,8123=>401,8124=>401,8125=>278,8126=>0,8127=>278,8128=>278,8129=>306,8130=>336,8131=>336,8132=>336,8134=>336,8135=>336,8136=>371,8137=>371,8138=>432, + 8139=>432,8140=>432,8141=>278,8142=>278,8143=>278,8144=>183,8145=>183,8146=>183,8147=>183,8150=>183,8151=>183,8152=>216,8153=>216,8154=>216,8155=>216,8157=>278, + 8158=>278,8159=>278,8160=>306,8161=>306,8162=>306,8163=>306,8164=>306,8165=>306,8166=>306,8167=>306,8168=>401,8169=>401,8170=>401,8171=>401,8172=>339,8173=>306, + 8174=>306,8175=>278,8178=>397,8179=>397,8180=>397,8182=>397,8183=>397,8184=>432,8185=>432,8186=>451,8187=>451,8188=>451,8189=>278,8190=>278,8208=>185,8209=>185, + 8219=>185,8223=>278,8227=>311,8241=>1011,8248=>261,8251=>404,8253=>386,8255=>529,8256=>529,8257=>188,8258=>517,8259=>185,8260=>93,8261=>184,8262=>184,8267=>300, + 8308=>167,8309=>556,8321=>167,8322=>167,8323=>167,8324=>167,8352=>394,8353=>401,8354=>435,8355=>339,8356=>278,8357=>463,8358=>401,8359=>389,8361=>556,8470=>530, + 8471=>415,8479=>401,8483=>401,8486=>451,8487=>451,8494=>306,8498=>339,8543=>417,8706=>274,8710=>340,8721=>396,8722=>317,8730=>305,8734=>418,8800=>317,8804=>317, + 8805=>317,9674=>274,12353=>556,12354=>556,12355=>556,12356=>556,12357=>556,12358=>556,12359=>556,12360=>556,12361=>556,12362=>556,12363=>556,12364=>556,12365=>556,12366=>556, + 12367=>556,12368=>556,12369=>556,12370=>556,12371=>556,12372=>556,12373=>556,12374=>556,12375=>556,12376=>556,12377=>556,12378=>556,12379=>556,12380=>556,12381=>556,12382=>556, + 12383=>556,12384=>556,12385=>556,12386=>556,12387=>556,12388=>556,12389=>556,12390=>556,12391=>556,12392=>556,12393=>556,12394=>556,12395=>556,12396=>556,12397=>556,12398=>556, + 12399=>556,12400=>556,12401=>556,12402=>556,12403=>556,12404=>556,12405=>556,12406=>556,12407=>556,12408=>556,12409=>556,12410=>556,12411=>556,12412=>556,12413=>556,12414=>556, + 12415=>556,12416=>556,12417=>556,12418=>556,12419=>556,12420=>556,12421=>556,12422=>556,12423=>556,12424=>556,12425=>556,12426=>556,12427=>556,12428=>556,12429=>556,12430=>556, + 12431=>556,12432=>556,12433=>556,12434=>556,12435=>556,12449=>556,12450=>556,12451=>556,12452=>556,12453=>556,12454=>556,12455=>556,12456=>556,12457=>556,12458=>556,12459=>556, + 12460=>556,12461=>556,12462=>556,12463=>556,12464=>556,12465=>556,12466=>556,12467=>556,12468=>556,12469=>556,12470=>556,12471=>556,12472=>556,12473=>556,12474=>556,12475=>556, + 12476=>556,12477=>556,12478=>556,12479=>556,12480=>556,12481=>556,12482=>556,12483=>556,12484=>556,12485=>556,12486=>556,12487=>556,12488=>556,12489=>556,12490=>556,12491=>556, + 12492=>556,12493=>556,12494=>556,12495=>556,12496=>556,12497=>556,12498=>556,12499=>556,12500=>556,12501=>556,12502=>556,12503=>556,12504=>556,12505=>556,12506=>556,12507=>556, + 12508=>556,12509=>556,12510=>556,12511=>556,12512=>556,12513=>556,12514=>556,12515=>556,12516=>556,12517=>556,12518=>556,12519=>556,12520=>556,12521=>556,12522=>556,12523=>556, + 12524=>556,12525=>556,12526=>556,12527=>556,12528=>556,12529=>556,12530=>556,12531=>556,12532=>556,12533=>556,12534=>556,63033=>278,63034=>278,63035=>278,63036=>278,63037=>278, + 63038=>278,63039=>278,63040=>278,63041=>278,63171=>185,63196=>278,64256=>309,64257=>309,64258=>309,64259=>463,64260=>463,64262=>402,64606=>0,64607=>0,64608=>0,64609=>0, + 64610=>0,64830=>467,64831=>467,65010=>814,65152=>392,65153=>306,65154=>281,65155=>247,65156=>250,65157=>447,65158=>412,65159=>247,65160=>222,65161=>602,65162=>535,65163=>360, + 65164=>329,65165=>192,65166=>220,65167=>635,65168=>644,65169=>338,65170=>321,65171=>369,65172=>419,65173=>635,65174=>644,65175=>345,65176=>336,65177=>635,65178=>644,65179=>393, + 65180=>345,65181=>548,65182=>553,65183=>637,65184=>652,65185=>548,65186=>546,65187=>637,65188=>656,65189=>548,65190=>544,65191=>637,65192=>656,65193=>363,65194=>439,65195=>363, + 65196=>439,65197=>440,65198=>471,65199=>439,65200=>474,65201=>875,65202=>871,65203=>608,65204=>588,65205=>875,65206=>871,65207=>609,65208=>587,65209=>1061,65210=>1033,65211=>794, + 65212=>758,65213=>1061,65214=>1033,65215=>794,65216=>761,65217=>811,65218=>793,65219=>659,65220=>647,65221=>811,65222=>793,65223=>659,65224=>642,65225=>549,65226=>481,65227=>512, + 65228=>409,65229=>547,65230=>476,65231=>512,65232=>409,65233=>755,65234=>748,65235=>416,65236=>442,65237=>574,65238=>550,65239=>416,65240=>442,65241=>717,65242=>687,65243=>883, + 65244=>409,65245=>555,65246=>511,65247=>338,65248=>297,65249=>423,65250=>478,65251=>489,65252=>476,65253=>532,65254=>548,65255=>336,65256=>326,65257=>371,65258=>391,65259=>524, + 65260=>412,65261=>454,65262=>412,65263=>633,65264=>566,65265=>643,65266=>560,65267=>357,65268=>333,65269=>623,65270=>617,65271=>603,65272=>621,65273=>576,65274=>617,65275=>576, + 65276=>625); +$enc=''; +$diff=''; +$file='almohanad.z'; +$ctg='almohanad.ctg.z'; +$originalsize=227760; +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/almohanad.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/almohanad.z new file mode 100644 index 0000000..27426a6 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/almohanad.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/arialunicid0.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/arialunicid0.php new file mode 100644 index 0000000..554d58b --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/arialunicid0.php @@ -0,0 +1,1768 @@ +<?php +$type='cidfont0'; +$name='ArialUnicodeMS'; +$desc=array('Ascent'=>1069,'Descent'=>-271,'CapHeight'=>1069,'Flags'=>32,'FontBBox'=>'[-1011 -330 2260 1078]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>600); +$up=-100; +$ut=50; +$dw=1000; +$cw=array( + 32=>278,33=>278,34=>355,35=>556,36=>556,37=>889,38=>667,39=>191,40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278, + 48=>556,49=>556,50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>278,59=>278,60=>584,61=>584,62=>584,63=>556, + 64=>1015,65=>667,66=>667,67=>722,68=>722,69=>667,70=>611,71=>778,72=>722,73=>278,74=>500,75=>667,76=>556,77=>833,78=>722,79=>778, + 80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>278,92=>278,93=>278,94=>469,95=>500, + 96=>333,97=>556,98=>556,99=>500,100=>556,101=>556,102=>278,103=>556,104=>556,105=>222,106=>222,107=>500,108=>222,109=>833,110=>556,111=>556, + 112=>556,113=>556,114=>333,115=>500,116=>278,117=>556,118=>500,119=>722,120=>500,121=>500,122=>500,123=>334,124=>260,125=>334,126=>584,8364=>556, + 1027=>567,8218=>222,402=>278,8222=>333,8230=>1000,8224=>556,8225=>556,710=>333,8240=>1000,352=>667,8249=>333,338=>1000,1036=>584,381=>611,1039=>723,8216=>222, + 8217=>222,8220=>333,8221=>333,8226=>350,8211=>500,8212=>1000,732=>333,8482=>1000,353=>500,8250=>333,339=>944,1116=>437,382=>500,376=>667,160=>278,161=>333, + 162=>556,163=>556,164=>556,165=>556,166=>260,167=>556,168=>333,169=>737,170=>370,171=>556,172=>584,173=>333,174=>737,175=>500,176=>400,177=>584, + 178=>333,179=>333,180=>333,181=>556,182=>537,183=>278,184=>333,185=>333,186=>365,187=>556,188=>834,189=>834,190=>834,191=>611,192=>667,193=>667, + 194=>667,195=>667,196=>667,197=>667,198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278,208=>722,209=>722, + 210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722,218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556, + 226=>556,227=>556,228=>556,229=>556,230=>889,231=>500,232=>556,233=>556,234=>556,235=>556,236=>278,237=>278,238=>278,239=>278,240=>556,241=>556, + 242=>556,243=>556,244=>556,245=>556,246=>556,247=>584,248=>611,249=>556,250=>556,251=>556,252=>556,253=>500,254=>556,255=>500,256=>667,257=>556, + 258=>667,259=>556,260=>667,261=>556,262=>722,263=>500,264=>722,265=>500,266=>722,267=>500,268=>722,269=>500,270=>722,271=>627,272=>722,273=>556, + 274=>667,275=>556,276=>667,277=>556,278=>667,279=>556,280=>667,281=>556,282=>667,283=>556,284=>778,285=>556,286=>778,287=>556,288=>778,289=>556, + 290=>778,291=>556,292=>722,293=>556,294=>722,295=>556,296=>278,297=>222,298=>278,299=>222,300=>278,301=>222,302=>278,303=>222,304=>278,305=>278, + 306=>751,307=>444,308=>500,309=>222,310=>667,311=>500,312=>437,313=>556,314=>222,315=>556,316=>222,317=>556,318=>222,319=>556,320=>318,321=>556, + 322=>222,323=>722,324=>556,325=>722,326=>556,327=>722,328=>556,329=>626,330=>723,331=>556,332=>778,333=>556,334=>778,335=>556,336=>778,337=>556, + 340=>722,341=>333,342=>722,343=>333,344=>722,345=>333,346=>667,347=>500,348=>667,349=>500,350=>667,351=>500,354=>611,355=>278,356=>611,357=>406, + 358=>611,359=>278,360=>722,361=>556,362=>722,363=>556,364=>722,365=>556,366=>722,367=>556,368=>722,369=>556,370=>722,371=>556,372=>944,373=>722, + 374=>667,375=>500,377=>611,378=>500,379=>611,380=>500,383=>222,384=>556,385=>740,386=>655,387=>556,388=>556,389=>556,390=>722,391=>766,392=>579, + 393=>722,394=>789,395=>655,396=>556,397=>557,398=>667,399=>729,400=>604,401=>611,403=>791,404=>649,405=>806,406=>245,407=>322,408=>667,409=>500, + 410=>322,411=>500,412=>833,413=>722,414=>556,415=>778,416=>776,417=>556,418=>1019,419=>782,420=>735,421=>556,422=>722,423=>667,424=>500,425=>602, + 426=>366,427=>278,428=>571,429=>278,430=>611,431=>776,432=>620,433=>748,434=>667,435=>752,436=>615,437=>611,438=>500,439=>628,440=>628,441=>526, + 442=>480,443=>556,444=>556,445=>526,446=>556,447=>556,448=>278,449=>464,450=>474,451=>278,452=>1333,453=>1222,454=>1056,455=>1030,456=>778,457=>444, + 458=>1222,459=>944,460=>778,461=>667,462=>556,463=>278,464=>278,465=>778,466=>556,467=>722,468=>556,469=>722,470=>556,471=>722,472=>556,473=>722, + 474=>556,475=>722,476=>556,477=>556,478=>667,479=>556,480=>667,481=>556,482=>1000,483=>889,484=>778,485=>556,486=>778,487=>556,488=>667,489=>500, + 490=>778,491=>556,492=>778,493=>556,494=>534,495=>534,496=>222,497=>1333,498=>1222,499=>1056,500=>778,501=>556,506=>667,507=>556,508=>1000,509=>889, + 510=>778,511=>611,512=>667,513=>556,514=>667,515=>556,516=>667,517=>556,518=>667,519=>556,520=>278,521=>278,522=>278,523=>278,524=>778,525=>556, + 526=>778,527=>556,528=>722,529=>333,530=>722,531=>333,532=>722,533=>556,534=>722,535=>556,592=>556,593=>556,594=>556,595=>556,596=>500,597=>500, + 598=>556,599=>556,600=>556,601=>556,602=>777,603=>485,604=>485,605=>686,606=>519,607=>260,608=>556,609=>556,610=>557,611=>500,612=>500,613=>556, + 614=>556,615=>556,616=>242,617=>282,618=>356,619=>356,620=>425,621=>222,622=>635,623=>833,624=>833,625=>833,626=>556,627=>556,628=>558,629=>556, + 630=>715,631=>674,632=>558,633=>333,634=>333,635=>333,636=>333,637=>333,638=>312,639=>312,640=>530,641=>530,642=>500,643=>216,644=>276,645=>216, + 646=>222,647=>278,648=>278,649=>596,650=>558,651=>556,652=>500,653=>722,654=>500,655=>500,656=>500,657=>564,658=>530,659=>530,660=>464,661=>464, + 662=>464,663=>500,664=>614,665=>526,666=>519,667=>557,668=>558,669=>222,670=>500,671=>416,672=>556,673=>464,674=>464,675=>966,676=>966,677=>1030, + 678=>689,679=>484,680=>718,688=>326,689=>326,690=>153,691=>201,692=>201,693=>201,694=>304,695=>389,696=>278,697=>222,698=>372,699=>222,700=>222, + 701=>222,702=>222,703=>222,704=>250,705=>250,706=>320,707=>320,708=>320,709=>320,711=>333,712=>192,713=>333,714=>333,715=>333,716=>192,717=>333, + 718=>333,719=>333,720=>300,721=>300,722=>222,723=>222,724=>340,725=>340,726=>280,727=>362,728=>333,729=>333,730=>333,731=>333,733=>333,734=>333, + 736=>278,737=>153,738=>270,739=>274,740=>325,741=>360,742=>360,743=>360,744=>360,745=>360,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0, + 774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0, + 790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0, + 806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0, + 822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0, + 864=>0,865=>0,884=>308,885=>308,890=>278,894=>278,900=>278,901=>278,902=>667,903=>278,904=>704,905=>759,906=>315,908=>778,910=>746,911=>758, + 912=>222,913=>667,914=>667,915=>550,916=>682,917=>667,918=>611,919=>722,920=>778,921=>278,922=>667,923=>667,924=>833,925=>722,926=>650,927=>778, + 928=>722,929=>667,931=>602,932=>611,933=>667,934=>808,935=>667,936=>804,937=>758,938=>278,939=>667,940=>576,941=>434,942=>556,943=>222,944=>551, + 945=>576,946=>563,947=>500,948=>557,949=>434,950=>440,951=>556,952=>556,953=>222,954=>498,955=>500,956=>553,957=>500,958=>432,959=>556,960=>678, + 961=>571,962=>472,963=>619,964=>382,965=>551,966=>649,967=>522,968=>729,969=>766,970=>222,971=>551,972=>556,973=>551,974=>766,976=>563,977=>616, + 978=>631,979=>726,980=>631,981=>644,982=>781,986=>722,988=>578,990=>570,992=>692,994=>880,995=>833,996=>684,997=>558,998=>680,999=>529,1000=>557, + 1001=>505,1002=>623,1003=>603,1004=>610,1005=>611,1006=>568,1007=>434,1008=>600,1009=>571,1010=>500,1011=>222,1025=>667,1026=>865,1028=>717,1029=>667,1030=>278, + 1031=>278,1032=>500,1033=>1105,1034=>1009,1035=>867,1038=>635,1040=>667,1041=>655,1042=>667,1043=>567,1044=>677,1045=>667,1046=>923,1047=>604,1048=>722,1049=>722, + 1050=>584,1051=>705,1052=>833,1053=>722,1054=>778,1055=>723,1056=>667,1057=>722,1058=>611,1059=>635,1060=>760,1061=>667,1062=>740,1063=>684,1064=>920,1065=>939, + 1066=>793,1067=>883,1068=>655,1069=>717,1070=>1006,1071=>722,1072=>556,1073=>573,1074=>531,1075=>383,1076=>583,1077=>556,1078=>669,1079=>458,1080=>559,1081=>559, + 1082=>437,1083=>571,1084=>683,1085=>552,1086=>556,1087=>542,1088=>556,1089=>500,1090=>458,1091=>500,1092=>823,1093=>500,1094=>562,1095=>533,1096=>802,1097=>823, + 1098=>620,1099=>717,1100=>523,1101=>510,1102=>744,1103=>542,1105=>556,1106=>556,1107=>383,1108=>510,1109=>500,1110=>222,1111=>278,1112=>222,1113=>873,1114=>811, + 1115=>556,1118=>500,1119=>542,1120=>976,1121=>766,1122=>656,1123=>521,1124=>950,1125=>694,1126=>667,1127=>597,1128=>952,1129=>817,1130=>654,1131=>600,1132=>932, + 1133=>817,1134=>604,1135=>458,1136=>804,1137=>729,1138=>778,1139=>556,1140=>667,1141=>500,1142=>667,1143=>500,1144=>1279,1145=>1060,1146=>778,1147=>556,1148=>976, + 1149=>766,1150=>976,1151=>766,1152=>722,1153=>514,1154=>686,1155=>334,1156=>382,1157=>334,1158=>334,1168=>435,1169=>339,1170=>567,1171=>383,1172=>656,1173=>556, + 1174=>923,1175=>669,1176=>604,1177=>458,1178=>584,1179=>437,1180=>584,1181=>437,1182=>584,1183=>437,1184=>764,1185=>537,1186=>741,1187=>573,1188=>900,1189=>670, + 1190=>736,1191=>560,1192=>778,1193=>560,1194=>722,1195=>500,1196=>611,1197=>458,1198=>667,1199=>500,1200=>667,1201=>500,1202=>667,1203=>500,1204=>916,1205=>661, + 1206=>684,1207=>533,1208=>684,1209=>533,1210=>684,1211=>556,1212=>829,1213=>667,1214=>829,1215=>667,1216=>278,1217=>923,1218=>669,1219=>584,1220=>437,1223=>735, + 1224=>570,1227=>684,1228=>533,1232=>667,1233=>556,1234=>667,1235=>556,1236=>1000,1237=>889,1238=>667,1239=>556,1240=>729,1241=>556,1242=>729,1243=>556,1244=>923, + 1245=>669,1246=>604,1247=>458,1248=>604,1249=>492,1250=>722,1251=>559,1252=>722,1253=>559,1254=>778,1255=>556,1256=>778,1257=>556,1258=>778,1259=>556,1262=>635, + 1263=>500,1264=>635,1265=>500,1266=>635,1267=>500,1268=>684,1269=>533,1272=>883,1273=>717,1329=>635,1330=>531,1331=>583,1332=>583,1333=>531,1334=>531,1335=>427, + 1336=>531,1337=>750,1338=>635,1339=>531,1340=>375,1341=>583,1342=>698,1343=>531,1344=>427,1345=>531,1346=>583,1347=>531,1348=>635,1349=>698,1350=>635,1351=>635, + 1352=>531,1353=>531,1354=>698,1355=>531,1356=>635,1357=>531,1358=>698,1359=>583,1360=>479,1361=>583,1362=>531,1363=>698,1364=>698,1365=>635,1366=>750,1369=>271, + 1370=>271,1371=>150,1372=>300,1373=>271,1374=>271,1375=>420,1377=>583,1378=>427,1379=>427,1380=>427,1381=>427,1382=>427,1383=>427,1384=>427,1385=>459,1386=>427, + 1387=>427,1388=>323,1389=>531,1390=>427,1391=>427,1392=>427,1393=>427,1394=>427,1395=>427,1396=>427,1397=>271,1398=>427,1399=>375,1400=>427,1401=>375,1402=>583, + 1403=>427,1404=>427,1405=>427,1406=>427,1407=>583,1408=>427,1409=>427,1410=>323,1411=>583,1412=>375,1413=>375,1414=>583,1415=>527,1417=>271,1425=>360,1426=>360, + 1427=>360,1428=>360,1429=>360,1430=>360,1431=>360,1432=>360,1433=>360,1434=>360,1435=>360,1436=>360,1437=>360,1438=>360,1439=>360,1440=>360,1441=>360,1443=>360, + 1444=>360,1445=>360,1446=>360,1447=>360,1448=>360,1449=>360,1450=>360,1451=>360,1452=>360,1453=>360,1454=>360,1455=>360,1456=>360,1457=>360,1458=>360,1459=>360, + 1460=>360,1461=>360,1462=>360,1463=>360,1464=>360,1465=>360,1467=>360,1468=>360,1469=>360,1470=>366,1471=>360,1472=>225,1473=>360,1474=>360,1475=>238,1476=>360, + 1488=>577,1489=>563,1490=>411,1491=>512,1492=>594,1493=>316,1494=>326,1495=>594,1496=>594,1497=>316,1498=>507,1499=>527,1500=>484,1501=>594,1502=>594,1503=>316, + 1504=>338,1505=>604,1506=>550,1507=>567,1508=>569,1509=>505,1510=>514,1511=>583,1512=>507,1513=>700,1514=>633,1520=>590,1521=>590,1522=>590,1523=>216,1524=>412, + 1548=>278,1563=>278,1567=>556,1569=>529,1570=>243,1571=>243,1572=>470,1573=>243,1574=>731,1575=>243,1576=>771,1577=>514,1578=>771,1579=>771,1580=>544,1581=>544, + 1582=>544,1583=>430,1584=>430,1585=>421,1586=>421,1587=>1194,1588=>1194,1589=>1291,1590=>1291,1591=>843,1592=>843,1593=>594,1594=>594,1600=>279,1601=>957,1602=>800, + 1603=>757,1604=>662,1605=>589,1606=>692,1607=>514,1608=>470,1609=>731,1610=>731,1611=>0,1612=>0,1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0, + 1632=>480,1633=>480,1634=>480,1635=>480,1636=>480,1637=>480,1638=>480,1639=>480,1640=>480,1641=>480,1642=>547,1643=>278,1644=>278,1645=>438,1648=>0,1649=>243, + 1650=>243,1651=>243,1652=>0,1653=>380,1654=>470,1655=>548,1656=>772,1657=>771,1658=>771,1659=>771,1660=>771,1661=>771,1662=>771,1663=>771,1664=>771,1665=>544, + 1666=>544,1667=>544,1668=>544,1669=>544,1670=>544,1671=>544,1672=>430,1673=>430,1674=>430,1675=>430,1676=>430,1677=>430,1678=>430,1679=>430,1680=>430,1681=>421, + 1682=>421,1683=>421,1684=>421,1685=>421,1686=>419,1687=>421,1688=>421,1689=>421,1690=>1194,1691=>1194,1692=>1194,1693=>1291,1694=>1291,1695=>843,1696=>594,1697=>957, + 1698=>957,1699=>957,1700=>957,1701=>957,1702=>957,1703=>800,1704=>800,1705=>828,1706=>1058,1707=>828,1708=>757,1709=>757,1710=>757,1711=>828,1712=>828,1713=>828, + 1714=>828,1715=>828,1716=>828,1717=>662,1718=>662,1719=>662,1722=>692,1723=>692,1724=>692,1725=>692,1726=>706,1728=>514,1729=>509,1730=>509,1731=>509,1732=>470, + 1733=>470,1734=>470,1735=>470,1736=>470,1737=>470,1738=>470,1739=>470,1740=>731,1741=>841,1742=>731,1744=>731,1745=>731,1746=>550,1747=>550,1748=>279,1749=>514, + 1750=>726,1751=>558,1752=>321,1753=>318,1754=>342,1755=>373,1756=>716,1757=>688,1758=>852,1759=>288,1760=>288,1761=>388,1762=>350,1763=>716,1764=>146,1765=>282, + 1766=>339,1767=>339,1768=>415,1769=>514,1770=>220,1771=>220,1772=>220,1773=>350,1776=>480,1777=>480,1778=>480,1779=>480,1780=>480,1781=>480,1782=>480,1783=>480, + 1784=>480,1785=>480,2305=>0,2306=>0,2307=>294,2309=>693,2310=>910,2311=>533,2312=>533,2313=>590,2314=>713,2315=>920,2316=>677,2317=>611,2318=>611,2319=>611, + 2320=>611,2321=>910,2322=>910,2323=>910,2324=>910,2325=>667,2326=>732,2327=>593,2328=>639,2329=>624,2330=>688,2331=>713,2332=>688,2333=>712,2334=>697,2335=>502, + 2336=>533,2337=>583,2338=>523,2339=>693,2340=>585,2341=>638,2342=>533,2343=>640,2344=>585,2345=>585,2346=>565,2347=>699,2348=>592,2349=>689,2350=>633,2351=>600, + 2352=>486,2353=>486,2354=>680,2355=>730,2356=>730,2357=>592,2358=>684,2359=>608,2360=>646,2361=>546,2364=>0,2365=>373,2366=>319,2367=>319,2368=>319,2369=>0, + 2370=>0,2371=>0,2372=>0,2373=>0,2374=>0,2375=>0,2376=>0,2377=>319,2378=>319,2379=>319,2380=>319,2381=>0,2384=>884,2385=>0,2386=>0,2387=>0, + 2388=>0,2392=>667,2393=>732,2394=>593,2395=>688,2396=>583,2397=>523,2398=>699,2399=>600,2400=>920,2401=>677,2402=>0,2403=>0,2404=>331,2405=>513,2406=>639, + 2407=>639,2408=>639,2409=>639,2410=>639,2411=>639,2412=>639,2413=>639,2414=>639,2415=>639,2416=>362,2433=>0,2434=>430,2435=>430,2437=>786,2438=>1030,2439=>582, + 2440=>603,2441=>648,2442=>757,2443=>758,2444=>630,2447=>685,2448=>746,2451=>711,2452=>776,2453=>779,2454=>655,2455=>606,2456=>645,2457=>661,2458=>554,2459=>585, + 2460=>729,2461=>752,2462=>893,2463=>567,2464=>625,2465=>648,2466=>567,2467=>598,2468=>680,2469=>645,2470=>609,2471=>596,2472=>595,2474=>635,2475=>780,2476=>593, + 2477=>677,2478=>621,2479=>601,2480=>593,2482=>640,2486=>598,2487=>596,2488=>637,2489=>582,2492=>0,2494=>245,2495=>245,2496=>245,2497=>0,2498=>0,2499=>0, + 2500=>0,2503=>309,2504=>309,2507=>932,2508=>932,2509=>0,2519=>245,2524=>648,2525=>553,2527=>596,2528=>758,2529=>630,2530=>0,2531=>335,2534=>610,2535=>559, + 2536=>595,2537=>711,2538=>610,2539=>661,2540=>661,2541=>559,2542=>661,2543=>600,2544=>593,2545=>593,2546=>601,2547=>567,2548=>601,2549=>699,2550=>661,2551=>267, + 2552=>610,2553=>424,2554=>548,2562=>0,2565=>691,2566=>936,2567=>803,2568=>803,2569=>678,2570=>678,2575=>557,2576=>691,2579=>678,2580=>691,2581=>602,2582=>567, + 2583=>641,2584=>688,2585=>565,2586=>592,2587=>603,2588=>591,2589=>541,2590=>558,2591=>543,2592=>581,2593=>596,2594=>640,2595=>640,2596=>591,2597=>564,2598=>640, + 2599=>564,2600=>581,2602=>564,2603=>551,2604=>560,2605=>549,2606=>558,2607=>652,2608=>540,2610=>677,2611=>677,2613=>601,2614=>558,2616=>558,2617=>549,2620=>0, + 2622=>246,2623=>246,2624=>246,2625=>0,2626=>0,2631=>0,2632=>0,2635=>0,2636=>0,2637=>0,2649=>567,2650=>690,2651=>591,2652=>591,2654=>581,2662=>591, + 2663=>591,2664=>591,2665=>591,2666=>591,2667=>591,2668=>591,2669=>591,2670=>591,2671=>591,2672=>0,2673=>0,2674=>557,2675=>678,2676=>894,2689=>0,2690=>0, + 2691=>300,2693=>781,2694=>1044,2695=>589,2696=>589,2697=>560,2698=>758,2699=>806,2701=>781,2703=>781,2704=>781,2705=>1044,2707=>1044,2708=>1044,2709=>413,2710=>773, + 2711=>606,2712=>558,2713=>483,2714=>600,2715=>691,2716=>811,2717=>647,2718=>651,2719=>453,2720=>450,2721=>425,2722=>478,2723=>694,2724=>534,2725=>553,2726=>446, + 2727=>541,2728=>582,2730=>572,2731=>437,2732=>663,2733=>756,2734=>594,2735=>493,2736=>392,2738=>613,2739=>656,2741=>538,2742=>611,2743=>507,2744=>663,2745=>587, + 2748=>0,2749=>478,2750=>273,2751=>273,2752=>273,2753=>0,2754=>0,2755=>0,2756=>0,2757=>0,2759=>0,2760=>0,2761=>273,2763=>273,2764=>273,2765=>0, + 2768=>843,2784=>893,2790=>625,2791=>625,2792=>625,2793=>625,2794=>625,2795=>625,2796=>625,2797=>625,2798=>625,2799=>625,2817=>0,2818=>306,2819=>391,2821=>590, + 2822=>808,2823=>658,2824=>658,2825=>633,2826=>654,2827=>636,2828=>540,2831=>560,2832=>938,2835=>600,2836=>973,2837=>603,2838=>620,2839=>620,2840=>605,2841=>712, + 2842=>579,2843=>579,2844=>593,2845=>564,2846=>581,2847=>604,2848=>578,2849=>579,2850=>579,2851=>607,2852=>579,2853=>587,2854=>579,2855=>602,2856=>579,2858=>605, + 2859=>728,2860=>579,2861=>643,2862=>605,2863=>628,2864=>619,2866=>653,2867=>593,2870=>620,2871=>605,2872=>605,2873=>579,2876=>0,2877=>333,2878=>218,2879=>0, + 2880=>294,2881=>0,2882=>0,2883=>0,2887=>479,2888=>479,2891=>1026,2892=>1026,2893=>0,2902=>0,2903=>218,2908=>579,2909=>579,2911=>599,2912=>636,2913=>540, + 2918=>578,2919=>480,2920=>480,2921=>622,2922=>506,2923=>605,2924=>529,2925=>548,2926=>512,2927=>528,2928=>561,2946=>0,2947=>742,2949=>1002,2950=>1118,2951=>994, + 2952=>660,2953=>1012,2954=>1231,2958=>726,2959=>731,2960=>870,2962=>763,2963=>763,2964=>1636,2965=>667,2969=>830,2970=>584,2972=>876,2974=>986,2975=>802,2979=>1295, + 2980=>656,2984=>630,2985=>1012,2986=>694,2990=>727,2991=>790,2992=>545,2993=>718,2994=>821,2995=>871,2996=>724,2997=>873,2999=>1087,3000=>1098,3001=>1274,3006=>547, + 3007=>172,3008=>93,3009=>519,3010=>814,3014=>748,3015=>681,3016=>956,3018=>1666,3019=>1666,3020=>1994,3021=>0,3031=>871,3047=>667,3048=>1012,3049=>751,3050=>740, + 3051=>924,3052=>884,3053=>726,3054=>1002,3055=>825,3056=>717,3057=>719,3058=>774,3073=>365,3074=>601,3075=>346,3077=>720,3078=>786,3079=>567,3080=>1159,3081=>690, + 3082=>1047,3083=>1299,3084=>913,3086=>625,3087=>625,3088=>712,3090=>655,3091=>655,3092=>862,3093=>515,3094=>680,3095=>526,3096=>943,3097=>655,3098=>684,3099=>684, + 3100=>670,3101=>1205,3102=>732,3103=>888,3104=>597,3105=>709,3106=>709,3107=>809,3108=>715,3109=>702,3110=>702,3111=>702,3112=>607,3114=>623,3115=>623,3116=>681, + 3117=>681,3118=>932,3119=>1203,3120=>597,3121=>893,3122=>631,3123=>608,3125=>620,3126=>541,3127=>667,3128=>640,3129=>911,3134=>644,3135=>298,3136=>298,3137=>361, + 3138=>682,3139=>342,3140=>704,3142=>624,3143=>624,3144=>900,3146=>849,3147=>849,3148=>976,3149=>669,3157=>298,3158=>119,3168=>1620,3169=>1281,3174=>840,3175=>840, + 3176=>840,3177=>840,3178=>840,3179=>840,3180=>840,3181=>840,3182=>840,3183=>840,3202=>440,3203=>251,3205=>654,3206=>654,3207=>631,3208=>891,3209=>957,3210=>1293, + 3211=>1044,3212=>744,3214=>650,3215=>650,3216=>659,3218=>667,3219=>667,3220=>667,3221=>462,3222=>749,3223=>543,3224=>779,3225=>674,3226=>682,3227=>660,3228=>667, + 3229=>1171,3230=>926,3231=>671,3232=>557,3233=>669,3234=>669,3235=>728,3236=>544,3237=>672,3238=>672,3239=>672,3240=>560,3242=>668,3243=>668,3244=>681,3245=>687, + 3246=>972,3247=>1101,3248=>556,3249=>677,3250=>661,3251=>545,3253=>666,3254=>553,3255=>670,3256=>549,3257=>716,3262=>425,3263=>341,3264=>680,3265=>354,3266=>714, + 3267=>386,3268=>638,3270=>307,3271=>670,3272=>462,3274=>908,3275=>1251,3276=>434,3277=>336,3285=>344,3286=>404,3294=>673,3296=>1695,3297=>978,3302=>549,3303=>549, + 3304=>549,3305=>549,3306=>549,3307=>549,3308=>549,3309=>549,3310=>549,3311=>549,3330=>368,3331=>305,3333=>1201,3334=>1351,3335=>905,3336=>1459,3337=>635,3338=>1198, + 3339=>861,3340=>957,3342=>1211,3343=>1202,3344=>1839,3346=>642,3347=>1114,3348=>1195,3349=>861,3350=>982,3351=>874,3352=>1354,3353=>957,3354=>1016,3355=>1266,3356=>712, + 3357=>1454,3358=>1215,3359=>563,3360=>565,3361=>1192,3362=>1244,3363=>1268,3364=>878,3365=>966,3366=>545,3367=>879,3368=>879,3370=>1031,3371=>1175,3372=>1334,3373=>546, + 3374=>643,3375=>949,3376=>642,3377=>555,3378=>945,3379=>631,3380=>553,3381=>959,3382=>936,3383=>1122,3384=>1190,3385=>1112,3390=>475,3391=>418,3392=>442,3393=>340, + 3394=>340,3395=>473,3398=>640,3399=>530,3400=>1279,3402=>1368,3403=>1258,3404=>1447,3405=>0,3415=>553,3424=>861,3425=>1100,3430=>1095,3431=>929,3432=>854,3433=>1181, + 3434=>658,3435=>972,3436=>1210,3437=>650,3438=>959,3439=>896,3585=>595,3586=>648,3587=>665,3588=>608,3589=>608,3590=>665,3591=>471,3592=>556,3593=>652,3594=>664, + 3595=>681,3596=>816,3597=>849,3598=>620,3599=>620,3600=>541,3601=>785,3602=>826,3603=>887,3604=>598,3605=>605,3606=>595,3607=>650,3608=>541,3609=>652,3610=>608, + 3611=>608,3612=>630,3613=>630,3614=>695,3615=>695,3616=>620,3617=>581,3618=>588,3619=>501,3620=>595,3621=>569,3622=>620,3623=>519,3624=>592,3625=>659,3626=>574, + 3627=>654,3628=>695,3629=>566,3630=>574,3631=>517,3632=>452,3633=>0,3634=>496,3635=>496,3636=>0,3637=>0,3638=>0,3639=>0,3640=>0,3641=>0,3642=>0, + 3647=>687,3648=>302,3649=>571,3650=>478,3651=>515,3652=>515,3653=>496,3654=>506,3655=>0,3656=>0,3657=>0,3658=>0,3659=>0,3660=>0,3661=>0,3662=>0, + 3663=>555,3664=>598,3665=>640,3666=>688,3667=>690,3668=>657,3669=>657,3670=>635,3671=>839,3672=>693,3673=>769,3674=>673,3675=>994,3713=>775,3714=>707,3716=>724, + 3719=>524,3720=>690,3722=>678,3725=>711,3732=>719,3733=>834,3734=>776,3735=>916,3737=>744,3738=>740,3739=>740,3740=>834,3741=>834,3742=>854,3743=>854,3745=>775, + 3746=>724,3747=>697,3749=>700,3751=>700,3754=>708,3755=>916,3757=>700,3758=>697,3759=>658,3760=>432,3761=>534,3762=>476,3763=>476,3764=>778,3765=>778,3766=>778, + 3767=>778,3768=>778,3769=>778,3771=>778,3772=>778,3773=>670,3776=>420,3777=>806,3778=>430,3779=>446,3780=>346,3782=>571,3784=>778,3785=>778,3786=>778,3787=>778, + 3788=>778,3789=>778,3792=>721,3793=>719,3794=>601,3795=>711,3796=>686,3797=>686,3798=>834,3799=>756,3800=>724,3801=>906,3804=>1272,3805=>1272,3840=>600,3841=>600, + 3842=>600,3843=>600,3844=>600,3845=>600,3846=>600,3847=>600,3848=>600,3849=>600,3850=>600,3851=>600,3852=>600,3853=>600,3854=>600,3855=>600,3856=>600,3857=>600, + 3858=>600,3859=>600,3860=>600,3861=>600,3862=>600,3863=>600,3864=>600,3865=>600,3866=>600,3867=>600,3868=>600,3869=>600,3870=>600,3871=>600,3872=>600,3873=>600, + 3874=>600,3875=>600,3876=>600,3877=>600,3878=>600,3879=>600,3880=>600,3881=>600,3882=>600,3883=>600,3884=>600,3885=>600,3886=>600,3887=>600,3888=>600,3889=>600, + 3890=>600,3891=>600,3892=>600,3893=>600,3894=>600,3895=>600,3896=>600,3897=>600,3898=>600,3899=>600,3900=>600,3901=>600,3902=>600,3903=>600,3904=>600,3905=>600, + 3906=>600,3907=>600,3908=>600,3909=>600,3910=>600,3911=>600,3913=>600,3914=>600,3915=>600,3916=>600,3917=>600,3918=>600,3919=>600,3920=>600,3921=>600,3922=>600, + 3923=>600,3924=>600,3925=>600,3926=>600,3927=>600,3928=>600,3929=>600,3930=>600,3931=>600,3932=>600,3933=>600,3934=>600,3935=>600,3936=>600,3937=>600,3938=>600, + 3939=>600,3940=>600,3941=>600,3942=>600,3943=>600,3944=>600,3945=>600,3953=>600,3954=>600,3955=>600,3956=>600,3957=>600,3958=>600,3959=>600,3960=>600,3961=>600, + 3962=>600,3963=>600,3964=>600,3965=>600,3966=>600,3967=>600,3968=>600,3969=>600,3970=>600,3971=>600,3972=>600,3973=>600,3974=>600,3975=>600,3976=>600,3977=>600, + 3978=>600,3979=>600,3984=>600,3985=>600,3986=>600,3987=>600,3988=>600,3989=>600,3991=>600,3993=>600,3994=>600,3995=>600,3996=>600,3997=>600,3998=>600,3999=>600, + 4000=>600,4001=>600,4002=>600,4003=>600,4004=>600,4005=>600,4006=>600,4007=>600,4008=>600,4009=>600,4010=>600,4011=>600,4012=>600,4013=>600,4017=>600,4018=>600, + 4019=>600,4020=>600,4021=>600,4022=>600,4023=>600,4025=>600,4256=>662,4257=>677,4258=>708,4259=>696,4260=>609,4261=>790,4262=>664,4263=>785,4264=>560,4265=>634, + 4266=>782,4267=>701,4268=>629,4269=>682,4270=>705,4271=>692,4272=>734,4273=>615,4274=>592,4275=>680,4276=>679,4277=>705,4278=>643,4279=>623,4280=>623,4281=>629, + 4282=>633,4283=>770,4284=>592,4285=>662,4286=>629,4287=>672,4288=>735,4289=>576,4290=>606,4291=>605,4292=>676,4293=>792,4304=>435,4305=>556,4306=>565,4307=>872, + 4308=>506,4309=>544,4310=>723,4311=>868,4312=>530,4313=>532,4314=>955,4315=>552,4316=>565,4317=>712,4318=>547,4319=>574,4320=>685,4321=>554,4322=>806,4323=>810, + 4324=>777,4325=>502,4326=>686,4327=>512,4328=>552,4329=>496,4330=>568,4331=>552,4332=>592,4333=>565,4334=>552,4335=>741,4336=>549,4337=>659,4338=>559,4339=>524, + 4340=>482,4341=>565,4342=>822,4347=>506,4352=>1000,4353=>1000,4354=>1000,4355=>1000,4356=>1000,4357=>1000,4358=>1000,4359=>1000,4360=>1000,4361=>1000,4362=>1000,4363=>1000, + 4364=>1000,4365=>1000,4366=>1000,4367=>1000,4368=>1000,4369=>1000,4370=>1000,4371=>1000,4372=>1000,4373=>1000,4374=>1000,4375=>1000,4376=>1000,4377=>1000,4378=>1000,4379=>1000, + 4380=>1000,4381=>1000,4382=>1000,4383=>1000,4384=>1000,4385=>1000,4386=>1000,4387=>1000,4388=>1000,4389=>1000,4390=>1000,4391=>1000,4392=>1000,4393=>1000,4394=>1000,4395=>1000, + 4396=>1000,4397=>1000,4398=>1000,4399=>1000,4400=>1000,4401=>1000,4402=>1000,4403=>1000,4404=>1000,4405=>1000,4406=>1000,4407=>1000,4408=>1000,4409=>1000,4410=>1000,4411=>1000, + 4412=>1000,4413=>1000,4414=>1000,4415=>1000,4416=>1000,4417=>1000,4418=>1000,4419=>1000,4420=>1000,4421=>1000,4422=>1000,4423=>1000,4424=>1000,4425=>1000,4426=>1000,4427=>1000, + 4428=>1000,4429=>1000,4430=>1000,4431=>1000,4432=>1000,4433=>1000,4434=>1000,4435=>1000,4436=>1000,4437=>1000,4438=>1000,4439=>1000,4440=>1000,4441=>1000,4447=>1000,4448=>1000, + 4449=>1000,4450=>1000,4451=>1000,4452=>1000,4453=>1000,4454=>1000,4455=>1000,4456=>1000,4457=>1000,4458=>1000,4459=>1000,4460=>1000,4461=>1000,4462=>1000,4463=>1000,4464=>1000, + 4465=>1000,4466=>1000,4467=>1000,4468=>1000,4469=>1000,4470=>1000,4471=>1000,4472=>1000,4473=>1000,4474=>1000,4475=>1000,4476=>1000,4477=>1000,4478=>1000,4479=>1000,4480=>1000, + 4481=>1000,4482=>1000,4483=>1000,4484=>1000,4485=>1000,4486=>1000,4487=>1000,4488=>1000,4489=>1000,4490=>1000,4491=>1000,4492=>1000,4493=>1000,4494=>1000,4495=>1000,4496=>1000, + 4497=>1000,4498=>1000,4499=>1000,4500=>1000,4501=>1000,4502=>1000,4503=>1000,4504=>1000,4505=>1000,4506=>1000,4507=>1000,4508=>1000,4509=>1000,4510=>1000,4511=>1000,4512=>1000, + 4513=>1000,4514=>1000,4520=>1000,4521=>1000,4522=>1000,4523=>1000,4524=>1000,4525=>1000,4526=>1000,4527=>1000,4528=>1000,4529=>1000,4530=>1000,4531=>1000,4532=>1000,4533=>1000, + 4534=>1000,4535=>1000,4536=>1000,4537=>1000,4538=>1000,4539=>1000,4540=>1000,4541=>1000,4542=>1000,4543=>1000,4544=>1000,4545=>1000,4546=>1000,4547=>1000,4548=>1000,4549=>1000, + 4550=>1000,4551=>1000,4552=>1000,4553=>1000,4554=>1000,4555=>1000,4556=>1000,4557=>1000,4558=>1000,4559=>1000,4560=>1000,4561=>1000,4562=>1000,4563=>1000,4564=>1000,4565=>1000, + 4566=>1000,4567=>1000,4568=>1000,4569=>1000,4570=>1000,4571=>1000,4572=>1000,4573=>1000,4574=>1000,4575=>1000,4576=>1000,4577=>1000,4578=>1000,4579=>1000,4580=>1000,4581=>1000, + 4582=>1000,4583=>1000,4584=>1000,4585=>1000,4586=>1000,4587=>1000,4588=>1000,4589=>1000,4590=>1000,4591=>1000,4592=>1000,4593=>1000,4594=>1000,4595=>1000,4596=>1000,4597=>1000, + 4598=>1000,4599=>1000,4600=>1000,4601=>1000,7680=>667,7681=>556,7682=>667,7683=>556,7684=>667,7685=>556,7686=>667,7687=>556,7688=>722,7689=>500,7690=>722,7691=>556, + 7692=>722,7693=>556,7694=>722,7695=>556,7696=>722,7697=>556,7698=>722,7699=>556,7700=>667,7701=>556,7702=>667,7703=>556,7704=>667,7705=>556,7706=>667,7707=>556, + 7708=>667,7709=>556,7710=>611,7711=>278,7712=>778,7713=>556,7714=>722,7715=>556,7716=>722,7717=>556,7718=>722,7719=>556,7720=>722,7721=>556,7722=>722,7723=>556, + 7724=>278,7725=>222,7726=>278,7727=>278,7728=>667,7729=>500,7730=>667,7731=>500,7732=>667,7733=>500,7734=>556,7735=>222,7736=>556,7737=>222,7738=>556,7739=>222, + 7740=>556,7741=>222,7742=>833,7743=>833,7744=>833,7745=>833,7746=>833,7747=>833,7748=>722,7749=>556,7750=>722,7751=>556,7752=>722,7753=>556,7754=>722,7755=>556, + 7756=>778,7757=>556,7758=>778,7759=>556,7760=>778,7761=>556,7762=>778,7763=>556,7764=>667,7765=>556,7766=>667,7767=>556,7768=>722,7769=>333,7770=>722,7771=>333, + 7772=>722,7773=>333,7774=>722,7775=>333,7776=>667,7777=>500,7778=>667,7779=>500,7780=>667,7781=>500,7782=>667,7783=>500,7784=>667,7785=>500,7786=>611,7787=>278, + 7788=>611,7789=>278,7790=>611,7791=>278,7792=>611,7793=>278,7794=>722,7795=>556,7796=>722,7797=>556,7798=>722,7799=>556,7800=>722,7801=>556,7802=>722,7803=>556, + 7804=>667,7805=>500,7806=>667,7807=>500,7808=>944,7809=>722,7810=>944,7811=>722,7812=>944,7813=>722,7814=>944,7815=>722,7816=>944,7817=>722,7818=>667,7819=>500, + 7820=>667,7821=>500,7822=>667,7823=>500,7824=>611,7825=>500,7826=>611,7827=>500,7828=>611,7829=>500,7830=>556,7831=>278,7832=>722,7833=>500,7834=>556,7835=>278, + 7840=>667,7841=>556,7842=>667,7843=>556,7844=>667,7845=>556,7846=>667,7847=>556,7848=>667,7849=>556,7850=>667,7851=>556,7852=>667,7853=>556,7854=>667,7855=>556, + 7856=>667,7857=>556,7858=>667,7859=>556,7860=>667,7861=>556,7862=>667,7863=>556,7864=>667,7865=>556,7866=>667,7867=>556,7868=>667,7869=>556,7870=>667,7871=>556, + 7872=>667,7873=>556,7874=>667,7875=>556,7876=>667,7877=>556,7878=>667,7879=>556,7880=>278,7881=>278,7882=>278,7883=>222,7884=>778,7885=>556,7886=>778,7887=>556, + 7888=>778,7889=>556,7890=>778,7891=>556,7892=>778,7893=>556,7894=>778,7895=>556,7896=>778,7897=>556,7898=>776,7899=>556,7900=>776,7901=>556,7902=>776,7903=>556, + 7904=>776,7905=>556,7906=>776,7907=>556,7908=>722,7909=>556,7910=>722,7911=>556,7912=>776,7913=>620,7914=>776,7915=>620,7916=>776,7917=>620,7918=>776,7919=>620, + 7920=>776,7921=>620,7922=>667,7923=>500,7924=>667,7925=>500,7926=>667,7927=>500,7928=>667,7929=>500,7936=>576,7937=>576,7938=>576,7939=>576,7940=>576,7941=>576, + 7942=>576,7943=>576,7944=>667,7945=>667,7946=>680,7947=>680,7948=>680,7949=>680,7950=>718,7951=>718,7952=>434,7953=>434,7954=>434,7955=>434,7956=>434,7957=>434, + 7960=>692,7961=>692,7962=>823,7963=>823,7964=>823,7965=>823,7968=>556,7969=>556,7970=>556,7971=>556,7972=>556,7973=>556,7974=>556,7975=>556,7976=>747,7977=>747, + 7978=>878,7979=>878,7980=>878,7981=>878,7982=>923,7983=>923,7984=>222,7985=>222,7986=>222,7987=>222,7988=>222,7989=>222,7990=>222,7991=>222,7992=>303,7993=>303, + 7994=>434,7995=>434,7996=>434,7997=>434,7998=>479,7999=>479,8000=>556,8001=>556,8002=>556,8003=>556,8004=>556,8005=>556,8008=>778,8009=>778,8010=>894,8011=>894, + 8012=>894,8013=>894,8016=>551,8017=>551,8018=>551,8019=>551,8020=>551,8021=>551,8022=>551,8023=>551,8025=>777,8027=>893,8029=>885,8031=>940,8032=>766,8033=>766, + 8034=>766,8035=>766,8036=>766,8037=>766,8038=>766,8039=>766,8040=>758,8041=>758,8042=>874,8043=>874,8044=>868,8045=>867,8046=>911,8047=>911,8048=>576,8049=>576, + 8050=>434,8051=>434,8052=>556,8053=>556,8054=>222,8055=>222,8056=>556,8057=>556,8058=>551,8059=>551,8060=>766,8061=>766,8064=>576,8065=>576,8066=>576,8067=>576, + 8068=>576,8069=>576,8070=>576,8071=>576,8072=>667,8073=>667,8074=>680,8075=>680,8076=>680,8077=>680,8078=>718,8079=>718,8080=>556,8081=>556,8082=>556,8083=>556, + 8084=>556,8085=>556,8086=>556,8087=>556,8088=>747,8089=>747,8090=>878,8091=>878,8092=>878,8093=>878,8094=>923,8095=>923,8096=>766,8097=>766,8098=>766,8099=>766, + 8100=>766,8101=>766,8102=>766,8103=>766,8104=>758,8105=>758,8106=>874,8107=>874,8108=>868,8109=>867,8110=>911,8111=>911,8112=>576,8113=>576,8114=>576,8115=>576, + 8116=>576,8118=>576,8119=>576,8120=>667,8121=>667,8122=>667,8123=>667,8124=>667,8125=>278,8126=>278,8127=>278,8128=>278,8129=>278,8130=>556,8131=>556,8132=>556, + 8134=>556,8135=>556,8136=>693,8137=>704,8138=>748,8139=>759,8140=>722,8141=>278,8142=>278,8143=>278,8144=>222,8145=>222,8146=>222,8147=>222,8150=>222,8151=>222, + 8152=>278,8153=>278,8154=>304,8155=>304,8157=>278,8158=>278,8159=>278,8160=>551,8161=>551,8162=>551,8163=>551,8164=>571,8165=>571,8166=>551,8167=>551,8168=>667, + 8169=>667,8170=>742,8171=>746,8172=>693,8173=>278,8174=>278,8175=>278,8178=>766,8179=>766,8180=>766,8182=>766,8183=>766,8184=>778,8185=>778,8186=>758,8187=>758, + 8188=>758,8189=>278,8190=>278,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>556,8200=>278,8201=>100,8202=>50,8203=>0,8204=>0, + 8205=>0,8208=>333,8209=>333,8210=>556,8213=>564,8214=>428,8215=>500,8219=>222,8223=>333,8227=>350,8228=>278,8229=>556,8231=>278,8232=>0,8233=>0,8241=>1330, + 8242=>222,8243=>372,8244=>522,8245=>206,8246=>356,8247=>506,8248=>312,8251=>1000,8252=>471,8253=>556,8254=>500,8255=>945,8256=>945,8257=>312,8258=>820,8259=>333, + 8260=>167,8261=>278,8262=>278,8304=>333,8308=>333,8309=>333,8310=>333,8311=>333,8312=>333,8313=>333,8314=>333,8315=>333,8316=>333,8317=>210,8318=>210,8319=>333, + 8320=>333,8321=>333,8322=>333,8323=>333,8324=>333,8325=>333,8326=>333,8327=>333,8328=>333,8329=>333,8330=>333,8331=>333,8332=>333,8333=>210,8334=>210,8352=>556, + 8353=>556,8354=>556,8355=>556,8356=>556,8357=>833,8358=>556,8359=>556,8360=>1024,8361=>940,8362=>784,8363=>556,8400=>600,8401=>600,8402=>600,8403=>600,8404=>700, + 8405=>700,8406=>600,8407=>600,8408=>600,8409=>600,8410=>600,8411=>600,8412=>600,8413=>900,8414=>900,8415=>900,8416=>900,8417=>700,8448=>889,8449=>889,8450=>667, + 8451=>1022,8452=>611,8453=>889,8454=>889,8455=>501,8456=>667,8457=>921,8458=>510,8459=>906,8460=>988,8461=>722,8462=>500,8463=>500,8464=>688,8465=>553,8466=>708, + 8467=>291,8468=>778,8469=>722,8470=>1073,8471=>737,8472=>740,8473=>556,8474=>722,8475=>927,8476=>795,8477=>667,8478=>667,8479=>667,8480=>1000,8481=>1174,8483=>722, + 8484=>611,8485=>542,8486=>768,8487=>768,8488=>698,8489=>321,8490=>667,8491=>667,8492=>927,8493=>646,8494=>556,8495=>385,8496=>615,8497=>688,8498=>611,8499=>1115, + 8500=>406,8501=>688,8502=>688,8503=>344,8504=>688,8531=>834,8532=>834,8533=>834,8534=>834,8535=>834,8536=>834,8537=>834,8538=>834,8539=>834,8540=>834,8541=>834, + 8542=>834,8543=>834,8544=>278,8545=>555,8546=>832,8547=>933,8548=>667,8549=>934,8550=>1031,8551=>1268,8552=>944,8553=>667,8554=>944,8555=>1035,8556=>556,8557=>722, + 8558=>722,8559=>833,8560=>222,8561=>444,8562=>666,8563=>700,8564=>500,8565=>700,8566=>922,8567=>1144,8568=>712,8569=>500,8570=>712,8571=>934,8572=>222,8573=>500, + 8574=>556,8575=>833,8576=>983,8577=>722,8578=>983,8592=>713,8593=>713,8594=>713,8595=>713,8596=>713,8597=>713,8598=>713,8599=>713,8600=>713,8601=>713,8602=>713, + 8603=>713,8604=>713,8605=>713,8606=>713,8607=>713,8608=>713,8609=>713,8610=>713,8611=>713,8612=>713,8613=>713,8614=>713,8615=>713,8616=>713,8617=>713,8618=>713, + 8619=>713,8620=>713,8621=>813,8622=>813,8623=>713,8624=>713,8625=>713,8626=>713,8627=>713,8628=>713,8629=>713,8630=>713,8631=>713,8632=>713,8633=>713,8634=>800, + 8635=>800,8636=>713,8637=>713,8638=>713,8639=>713,8640=>713,8641=>713,8642=>713,8643=>713,8644=>713,8645=>713,8646=>713,8647=>713,8648=>713,8649=>713,8650=>713, + 8651=>713,8652=>713,8653=>713,8654=>950,8655=>713,8656=>713,8657=>713,8658=>713,8659=>713,8660=>863,8661=>713,8662=>713,8663=>713,8664=>713,8665=>713,8666=>713, + 8667=>713,8668=>813,8669=>813,8670=>713,8671=>713,8672=>713,8673=>713,8674=>713,8675=>713,8676=>713,8677=>713,8678=>713,8679=>713,8680=>713,8681=>713,8682=>713, + 8704=>600,8705=>600,8706=>494,8707=>600,8708=>600,8709=>800,8710=>612,8711=>612,8712=>549,8713=>549,8714=>549,8715=>549,8716=>549,8717=>549,8718=>549,8719=>823, + 8720=>823,8721=>713,8722=>584,8723=>584,8724=>584,8725=>167,8726=>278,8727=>389,8728=>400,8729=>400,8730=>600,8731=>600,8732=>600,8733=>549,8734=>549,8735=>584, + 8736=>584,8737=>584,8738=>584,8739=>260,8740=>444,8741=>418,8742=>602,8743=>561,8744=>561,8745=>561,8746=>561,8747=>506,8748=>806,8749=>1106,8750=>506,8751=>806, + 8752=>1106,8753=>506,8754=>506,8755=>506,8756=>561,8757=>561,8758=>422,8759=>561,8760=>584,8761=>584,8762=>584,8763=>584,8764=>584,8765=>584,8766=>584,8767=>584, + 8768=>422,8769=>584,8770=>584,8771=>584,8772=>584,8773=>584,8774=>584,8775=>584,8776=>584,8777=>584,8778=>584,8779=>584,8780=>584,8781=>584,8782=>584,8783=>584, + 8784=>584,8785=>584,8786=>584,8787=>584,8788=>737,8789=>737,8790=>584,8791=>584,8792=>584,8793=>584,8794=>584,8795=>584,8796=>584,8797=>584,8798=>584,8799=>584, + 8800=>584,8801=>584,8802=>584,8803=>584,8804=>584,8805=>584,8806=>584,8807=>584,8808=>584,8809=>584,8810=>969,8811=>969,8812=>584,8813=>584,8814=>584,8815=>584, + 8816=>584,8817=>584,8818=>584,8819=>584,8820=>584,8821=>584,8822=>584,8823=>584,8824=>584,8825=>584,8826=>584,8827=>584,8828=>584,8829=>584,8830=>584,8831=>584, + 8832=>584,8833=>584,8834=>678,8835=>678,8836=>678,8837=>678,8838=>678,8839=>678,8840=>678,8841=>678,8842=>678,8843=>678,8844=>561,8845=>561,8846=>561,8847=>678, + 8848=>678,8849=>673,8850=>673,8851=>561,8852=>561,8853=>800,8854=>800,8855=>800,8856=>800,8857=>800,8858=>800,8859=>800,8860=>800,8861=>800,8862=>800,8863=>800, + 8864=>800,8865=>800,8866=>549,8867=>549,8868=>549,8869=>549,8870=>399,8871=>399,8872=>549,8873=>549,8874=>549,8875=>672,8876=>549,8877=>549,8878=>549,8879=>672, + 8880=>549,8881=>549,8882=>549,8883=>549,8884=>549,8885=>549,8886=>713,8887=>713,8888=>713,8889=>549,8890=>549,8891=>584,8892=>584,8893=>584,8894=>584,8895=>584, + 8896=>561,8897=>561,8898=>561,8899=>561,8900=>549,8901=>250,8902=>549,8903=>649,8904=>630,8905=>630,8906=>630,8907=>630,8908=>630,8909=>584,8910=>561,8911=>561, + 8912=>668,8913=>668,8914=>668,8915=>668,8916=>561,8917=>602,8918=>584,8919=>584,8920=>1354,8921=>1354,8922=>584,8923=>584,8924=>584,8925=>584,8926=>584,8927=>584, + 8928=>584,8929=>584,8930=>673,8931=>673,8932=>673,8933=>673,8934=>584,8935=>584,8936=>584,8937=>584,8938=>584,8939=>584,8940=>584,8941=>584,8942=>278,8943=>1000, + 8944=>1000,8945=>1000,8960=>549,8962=>549,8963=>549,8964=>549,8965=>549,8966=>549,8967=>549,8968=>449,8969=>449,8970=>449,8971=>449,8972=>549,8973=>549,8974=>549, + 8975=>549,8976=>549,8977=>549,8978=>800,8979=>800,8980=>549,8981=>549,8982=>549,8983=>650,8984=>780,8985=>549,8986=>549,8987=>549,8988=>549,8989=>549,8990=>549, + 8991=>549,8992=>506,8993=>506,8994=>713,8995=>713,8996=>1000,8997=>1000,8998=>1000,8999=>1000,9000=>1000,9001=>329,9002=>329,9003=>1000,9004=>549,9005=>549,9006=>549, + 9007=>549,9008=>549,9009=>549,9010=>549,9011=>549,9012=>549,9013=>549,9014=>600,9015=>600,9016=>600,9017=>600,9018=>600,9019=>600,9020=>600,9021=>600,9022=>600, + 9023=>600,9024=>600,9025=>600,9026=>600,9027=>600,9028=>600,9029=>600,9030=>600,9031=>600,9032=>600,9033=>600,9034=>600,9035=>600,9036=>600,9037=>600,9038=>600, + 9039=>600,9040=>600,9041=>600,9042=>600,9043=>600,9044=>600,9045=>600,9046=>600,9047=>600,9048=>600,9049=>600,9050=>600,9051=>600,9052=>600,9053=>600,9054=>600, + 9055=>600,9056=>600,9057=>600,9058=>600,9059=>600,9060=>600,9061=>600,9062=>600,9063=>600,9064=>600,9065=>600,9066=>600,9067=>600,9068=>600,9069=>600,9070=>600, + 9071=>600,9072=>600,9073=>600,9074=>600,9075=>600,9076=>600,9077=>600,9078=>600,9079=>600,9080=>600,9081=>600,9082=>600,9109=>600,9216=>600,9217=>600,9218=>600, + 9219=>600,9220=>600,9221=>600,9222=>600,9223=>600,9224=>600,9225=>600,9226=>600,9227=>600,9228=>600,9229=>600,9230=>600,9231=>600,9232=>600,9233=>600,9234=>600, + 9235=>600,9236=>600,9237=>600,9238=>600,9239=>600,9240=>600,9241=>600,9242=>600,9243=>600,9244=>600,9245=>600,9246=>600,9247=>600,9248=>600,9249=>600,9250=>600, + 9251=>600,9252=>600,9280=>604,9281=>604,9282=>604,9283=>604,9284=>604,9285=>604,9286=>750,9287=>750,9288=>750,9289=>750,9290=>604,9312=>1000,9313=>1000,9314=>1000, + 9315=>1000,9316=>1000,9317=>1000,9318=>1000,9319=>1000,9320=>1000,9321=>1000,9322=>1000,9323=>1000,9324=>1000,9325=>1000,9326=>1000,9327=>1000,9328=>1000,9329=>1000,9330=>1000, + 9331=>1000,9332=>1000,9333=>1000,9334=>1000,9335=>1000,9336=>1000,9337=>1000,9338=>1000,9339=>1000,9340=>1000,9341=>1000,9342=>1000,9343=>1000,9344=>1000,9345=>1000,9346=>1000, + 9347=>1000,9348=>1000,9349=>1000,9350=>1000,9351=>1000,9352=>1000,9353=>1000,9354=>1000,9355=>1000,9356=>1000,9357=>1000,9358=>1000,9359=>1000,9360=>1000,9361=>1000,9362=>1000, + 9363=>1000,9364=>1000,9365=>1000,9366=>1000,9367=>1000,9368=>1000,9369=>1000,9370=>1000,9371=>1000,9372=>1000,9373=>1000,9374=>1000,9375=>1000,9376=>1000,9377=>1000,9378=>1000, + 9379=>1000,9380=>1000,9381=>1000,9382=>1000,9383=>1000,9384=>1000,9385=>1000,9386=>1000,9387=>1000,9388=>1000,9389=>1000,9390=>1000,9391=>1000,9392=>1000,9393=>1000,9394=>1000, + 9395=>1000,9396=>1000,9397=>1000,9398=>1000,9399=>1000,9400=>1000,9401=>1000,9402=>1000,9403=>1000,9404=>1000,9405=>1000,9406=>1000,9407=>1000,9408=>1000,9409=>1000,9410=>1000, + 9411=>1000,9412=>1000,9413=>1000,9414=>1000,9415=>1000,9416=>1000,9417=>1000,9418=>1000,9419=>1000,9420=>1000,9421=>1000,9422=>1000,9423=>1000,9424=>1000,9425=>1000,9426=>1000, + 9427=>1000,9428=>1000,9429=>1000,9430=>1000,9431=>1000,9432=>1000,9433=>1000,9434=>1000,9435=>1000,9436=>1000,9437=>1000,9438=>1000,9439=>1000,9440=>1000,9441=>1000,9442=>1000, + 9443=>1000,9444=>1000,9445=>1000,9446=>1000,9447=>1000,9448=>1000,9449=>1000,9450=>1000,9472=>600,9473=>600,9474=>600,9475=>600,9476=>600,9477=>600,9478=>600,9479=>600, + 9480=>600,9481=>600,9482=>600,9483=>600,9484=>600,9485=>600,9486=>600,9487=>600,9488=>600,9489=>600,9490=>600,9491=>600,9492=>600,9493=>600,9494=>600,9495=>600, + 9496=>600,9497=>600,9498=>600,9499=>600,9500=>600,9501=>600,9502=>600,9503=>600,9504=>600,9505=>600,9506=>600,9507=>600,9508=>600,9509=>600,9510=>600,9511=>600, + 9512=>600,9513=>600,9514=>600,9515=>600,9516=>600,9517=>600,9518=>600,9519=>600,9520=>600,9521=>600,9522=>600,9523=>600,9524=>600,9525=>600,9526=>600,9527=>600, + 9528=>600,9529=>600,9530=>600,9531=>600,9532=>600,9533=>600,9534=>600,9535=>600,9536=>600,9537=>600,9538=>600,9539=>600,9540=>600,9541=>600,9542=>600,9543=>600, + 9544=>600,9545=>600,9546=>600,9547=>600,9548=>600,9549=>600,9550=>600,9551=>600,9552=>600,9553=>600,9554=>600,9555=>600,9556=>600,9557=>600,9558=>600,9559=>600, + 9560=>600,9561=>600,9562=>600,9563=>600,9564=>600,9565=>600,9566=>600,9567=>600,9568=>600,9569=>600,9570=>600,9571=>600,9572=>600,9573=>600,9574=>600,9575=>600, + 9576=>600,9577=>600,9578=>600,9579=>600,9580=>600,9581=>600,9582=>600,9583=>600,9584=>600,9585=>600,9586=>600,9587=>600,9588=>600,9589=>600,9590=>600,9591=>600, + 9592=>600,9593=>600,9594=>600,9595=>600,9596=>600,9597=>600,9598=>600,9599=>600,9600=>600,9601=>600,9602=>600,9603=>600,9604=>600,9605=>600,9606=>600,9607=>600, + 9608=>600,9609=>600,9610=>600,9611=>600,9612=>600,9613=>600,9614=>600,9615=>600,9616=>600,9617=>600,9618=>600,9619=>600,9620=>600,9621=>600,9632=>600,9633=>600, + 9634=>600,9635=>600,9636=>600,9637=>600,9638=>600,9639=>600,9640=>600,9641=>600,9642=>600,9643=>600,9644=>600,9645=>600,9646=>600,9647=>600,9648=>600,9649=>600, + 9650=>600,9651=>600,9652=>600,9653=>600,9654=>600,9655=>600,9656=>600,9657=>600,9658=>600,9659=>600,9660=>600,9661=>600,9662=>600,9663=>600,9664=>600,9665=>600, + 9666=>600,9667=>600,9668=>600,9669=>600,9670=>600,9671=>600,9672=>600,9673=>600,9674=>600,9675=>600,9676=>600,9677=>600,9678=>600,9679=>600,9680=>600,9681=>600, + 9682=>600,9683=>600,9684=>600,9685=>600,9686=>600,9687=>600,9688=>600,9689=>600,9690=>600,9691=>600,9692=>600,9693=>600,9694=>600,9695=>600,9696=>600,9697=>600, + 9698=>600,9699=>600,9700=>600,9701=>600,9702=>600,9703=>600,9704=>600,9705=>600,9706=>600,9707=>600,9708=>600,9709=>600,9710=>600,9711=>600,9728=>750,9729=>1000, + 9730=>750,9731=>750,9732=>1000,9733=>816,9734=>823,9735=>500,9736=>500,9737=>800,9738=>800,9739=>800,9740=>800,9741=>800,9742=>719,9743=>719,9744=>734,9745=>734, + 9746=>734,9747=>762,9754=>960,9755=>960,9756=>939,9757=>939,9758=>939,9759=>939,9760=>750,9761=>600,9762=>750,9763=>750,9764=>580,9765=>460,9766=>444,9767=>650, + 9768=>444,9769=>768,9770=>800,9771=>850,9772=>675,9773=>800,9774=>750,9775=>750,9776=>900,9777=>900,9778=>900,9779=>900,9780=>900,9781=>900,9782=>900,9783=>900, + 9784=>750,9785=>750,9786=>750,9787=>750,9788=>750,9789=>750,9790=>750,9791=>740,9792=>740,9793=>740,9794=>740,9795=>653,9796=>490,9797=>632,9798=>780,9799=>560, + 9800=>838,9801=>780,9802=>734,9803=>887,9804=>780,9805=>1080,9806=>896,9807=>1080,9808=>804,9809=>868,9810=>922,9811=>696,9812=>1000,9813=>1000,9814=>1000,9815=>1000, + 9816=>1000,9817=>1000,9818=>1000,9819=>1000,9820=>1000,9821=>1000,9822=>1000,9823=>1000,9824=>722,9825=>734,9826=>674,9827=>804,9828=>722,9829=>734,9830=>674,9831=>804, + 9832=>860,9833=>423,9834=>592,9835=>750,9836=>750,9837=>439,9838=>439,9839=>439,9985=>974,9986=>961,9987=>974,9988=>980,9990=>789,9991=>790,9992=>791,9993=>690, + 9996=>549,9997=>855,9998=>911,9999=>933,10000=>911,10001=>945,10002=>974,10003=>755,10004=>846,10005=>762,10006=>761,10007=>571,10008=>677,10009=>763,10010=>760,10011=>759, + 10012=>754,10013=>494,10014=>552,10015=>537,10016=>577,10017=>692,10018=>786,10019=>788,10020=>788,10021=>790,10022=>793,10023=>794,10025=>823,10026=>789,10027=>841,10028=>823, + 10029=>833,10030=>816,10031=>831,10032=>923,10033=>744,10034=>723,10035=>749,10036=>790,10037=>792,10038=>695,10039=>776,10040=>768,10041=>792,10042=>759,10043=>707,10044=>708, + 10045=>682,10046=>701,10047=>826,10048=>815,10049=>789,10050=>789,10051=>707,10052=>687,10053=>696,10054=>689,10055=>786,10056=>787,10057=>713,10058=>791,10059=>785,10061=>873, + 10063=>762,10064=>762,10065=>759,10066=>759,10070=>784,10072=>138,10073=>277,10074=>415,10075=>392,10076=>392,10077=>668,10078=>668,10081=>732,10082=>544,10083=>544,10084=>910, + 10085=>667,10086=>760,10087=>760,10102=>788,10103=>788,10104=>788,10105=>788,10106=>788,10107=>788,10108=>788,10109=>788,10110=>788,10111=>788,10112=>788,10113=>788,10114=>788, + 10115=>788,10116=>788,10117=>788,10118=>788,10119=>788,10120=>788,10121=>788,10122=>788,10123=>788,10124=>788,10125=>788,10126=>788,10127=>788,10128=>788,10129=>788,10130=>788, + 10131=>788,10132=>894,10136=>748,10137=>924,10138=>748,10139=>918,10140=>927,10141=>928,10142=>928,10143=>834,10144=>873,10145=>828,10146=>924,10147=>924,10148=>917,10149=>930, + 10150=>931,10151=>463,10152=>883,10153=>836,10154=>836,10155=>867,10156=>867,10157=>696,10158=>696,10159=>874,10161=>874,10162=>760,10163=>946,10164=>771,10165=>865,10166=>771, + 10167=>888,10168=>967,10169=>888,10170=>831,10171=>873,10172=>927,10173=>970,10174=>918,12288=>1000,12289=>1000,12290=>1000,12291=>1000,12292=>1000,12293=>1000,12294=>1000,12295=>1000, + 12296=>1000,12297=>1000,12298=>1000,12299=>1000,12300=>1000,12301=>1000,12302=>1000,12303=>1000,12304=>1000,12305=>1000,12306=>1000,12307=>1000,12308=>1000,12309=>1000,12310=>1000,12311=>1000, + 12312=>1000,12313=>1000,12314=>1000,12315=>1000,12316=>1000,12317=>1000,12318=>1000,12319=>1000,12320=>1000,12321=>1000,12322=>1000,12323=>1000,12324=>1000,12325=>1000,12326=>1000,12327=>1000, + 12328=>1000,12329=>1000,12330=>1000,12331=>1000,12332=>1000,12333=>1000,12334=>1000,12335=>1000,12336=>1000,12337=>1000,12338=>1000,12339=>1000,12340=>1000,12341=>1000,12342=>1000,12343=>1000, + 12351=>1000,12353=>1000,12354=>1000,12355=>1000,12356=>1000,12357=>1000,12358=>1000,12359=>1000,12360=>1000,12361=>1000,12362=>1000,12363=>1000,12364=>1000,12365=>1000,12366=>1000,12367=>1000, + 12368=>1000,12369=>1000,12370=>1000,12371=>1000,12372=>1000,12373=>1000,12374=>1000,12375=>1000,12376=>1000,12377=>1000,12378=>1000,12379=>1000,12380=>1000,12381=>1000,12382=>1000,12383=>1000, + 12384=>1000,12385=>1000,12386=>1000,12387=>1000,12388=>1000,12389=>1000,12390=>1000,12391=>1000,12392=>1000,12393=>1000,12394=>1000,12395=>1000,12396=>1000,12397=>1000,12398=>1000,12399=>1000, + 12400=>1000,12401=>1000,12402=>1000,12403=>1000,12404=>1000,12405=>1000,12406=>1000,12407=>1000,12408=>1000,12409=>1000,12410=>1000,12411=>1000,12412=>1000,12413=>1000,12414=>1000,12415=>1000, + 12416=>1000,12417=>1000,12418=>1000,12419=>1000,12420=>1000,12421=>1000,12422=>1000,12423=>1000,12424=>1000,12425=>1000,12426=>1000,12427=>1000,12428=>1000,12429=>1000,12430=>1000,12431=>1000, + 12432=>1000,12433=>1000,12434=>1000,12435=>1000,12436=>1000,12441=>1000,12442=>1000,12443=>1000,12444=>1000,12445=>1000,12446=>1000,12449=>1000,12450=>1000,12451=>1000,12452=>1000,12453=>1000, + 12454=>1000,12455=>1000,12456=>1000,12457=>1000,12458=>1000,12459=>1000,12460=>1000,12461=>1000,12462=>1000,12463=>1000,12464=>1000,12465=>1000,12466=>1000,12467=>1000,12468=>1000,12469=>1000, + 12470=>1000,12471=>1000,12472=>1000,12473=>1000,12474=>1000,12475=>1000,12476=>1000,12477=>1000,12478=>1000,12479=>1000,12480=>1000,12481=>1000,12482=>1000,12483=>1000,12484=>1000,12485=>1000, + 12486=>1000,12487=>1000,12488=>1000,12489=>1000,12490=>1000,12491=>1000,12492=>1000,12493=>1000,12494=>1000,12495=>1000,12496=>1000,12497=>1000,12498=>1000,12499=>1000,12500=>1000,12501=>1000, + 12502=>1000,12503=>1000,12504=>1000,12505=>1000,12506=>1000,12507=>1000,12508=>1000,12509=>1000,12510=>1000,12511=>1000,12512=>1000,12513=>1000,12514=>1000,12515=>1000,12516=>1000,12517=>1000, + 12518=>1000,12519=>1000,12520=>1000,12521=>1000,12522=>1000,12523=>1000,12524=>1000,12525=>1000,12526=>1000,12527=>1000,12528=>1000,12529=>1000,12530=>1000,12531=>1000,12532=>1000,12533=>1000, + 12534=>1000,12535=>1000,12536=>1000,12537=>1000,12538=>1000,12539=>1000,12540=>1000,12541=>1000,12542=>1000,12549=>1000,12550=>1000,12551=>1000,12552=>1000,12553=>1000,12554=>1000,12555=>1000, + 12556=>1000,12557=>1000,12558=>1000,12559=>1000,12560=>1000,12561=>1000,12562=>1000,12563=>1000,12564=>1000,12565=>1000,12566=>1000,12567=>1000,12568=>1000,12569=>1000,12570=>1000,12571=>1000, + 12572=>1000,12573=>1000,12574=>1000,12575=>1000,12576=>1000,12577=>1000,12578=>1000,12579=>1000,12580=>1000,12581=>1000,12582=>1000,12583=>1000,12584=>1000,12585=>1000,12586=>1000,12587=>1000, + 12588=>1000,12593=>1000,12594=>1000,12595=>1000,12596=>1000,12597=>1000,12598=>1000,12599=>1000,12600=>1000,12601=>1000,12602=>1000,12603=>1000,12604=>1000,12605=>1000,12606=>1000,12607=>1000, + 12608=>1000,12609=>1000,12610=>1000,12611=>1000,12612=>1000,12613=>1000,12614=>1000,12615=>1000,12616=>1000,12617=>1000,12618=>1000,12619=>1000,12620=>1000,12621=>1000,12622=>1000,12623=>1000, + 12624=>1000,12625=>1000,12626=>1000,12627=>1000,12628=>1000,12629=>1000,12630=>1000,12631=>1000,12632=>1000,12633=>1000,12634=>1000,12635=>1000,12636=>1000,12637=>1000,12638=>1000,12639=>1000, + 12640=>1000,12641=>1000,12642=>1000,12643=>1000,12644=>1000,12645=>1000,12646=>1000,12647=>1000,12648=>1000,12649=>1000,12650=>1000,12651=>1000,12652=>1000,12653=>1000,12654=>1000,12655=>1000, + 12656=>1000,12657=>1000,12658=>1000,12659=>1000,12660=>1000,12661=>1000,12662=>1000,12663=>1000,12664=>1000,12665=>1000,12666=>1000,12667=>1000,12668=>1000,12669=>1000,12670=>1000,12671=>1000, + 12672=>1000,12673=>1000,12674=>1000,12675=>1000,12676=>1000,12677=>1000,12678=>1000,12679=>1000,12680=>1000,12681=>1000,12682=>1000,12683=>1000,12684=>1000,12685=>1000,12686=>1000,12688=>1000, + 12689=>1000,12690=>1000,12691=>1000,12692=>1000,12693=>1000,12694=>1000,12695=>1000,12696=>1000,12697=>1000,12698=>1000,12699=>1000,12700=>1000,12701=>1000,12702=>1000,12703=>1000,12800=>1000, + 12801=>1000,12802=>1000,12803=>1000,12804=>1000,12805=>1000,12806=>1000,12807=>1000,12808=>1000,12809=>1000,12810=>1000,12811=>1000,12812=>1000,12813=>1000,12814=>1000,12815=>1000,12816=>1000, + 12817=>1000,12818=>1000,12819=>1000,12820=>1000,12821=>1000,12822=>1000,12823=>1000,12824=>1000,12825=>1000,12826=>1000,12827=>1000,12828=>1000,12832=>1000,12833=>1000,12834=>1000,12835=>1000, + 12836=>1000,12837=>1000,12838=>1000,12839=>1000,12840=>1000,12841=>1000,12842=>1000,12843=>1000,12844=>1000,12845=>1000,12846=>1000,12847=>1000,12848=>1000,12849=>1000,12850=>1000,12851=>1000, + 12852=>1000,12853=>1000,12854=>1000,12855=>1000,12856=>1000,12857=>1000,12858=>1000,12859=>1000,12860=>1000,12861=>1000,12862=>1000,12863=>1000,12864=>1000,12865=>1000,12866=>1000,12867=>1000, + 12896=>1000,12897=>1000,12898=>1000,12899=>1000,12900=>1000,12901=>1000,12902=>1000,12903=>1000,12904=>1000,12905=>1000,12906=>1000,12907=>1000,12908=>1000,12909=>1000,12910=>1000,12911=>1000, + 12912=>1000,12913=>1000,12914=>1000,12915=>1000,12916=>1000,12917=>1000,12918=>1000,12919=>1000,12920=>1000,12921=>1000,12922=>1000,12923=>1000,12927=>1000,12928=>1000,12929=>1000,12930=>1000, + 12931=>1000,12932=>1000,12933=>1000,12934=>1000,12935=>1000,12936=>1000,12937=>1000,12938=>1000,12939=>1000,12940=>1000,12941=>1000,12942=>1000,12943=>1000,12944=>1000,12945=>1000,12946=>1000, + 12947=>1000,12948=>1000,12949=>1000,12950=>1000,12951=>1000,12952=>1000,12953=>1000,12954=>1000,12955=>1000,12956=>1000,12957=>1000,12958=>1000,12959=>1000,12960=>1000,12961=>1000,12962=>1000, + 12963=>1000,12964=>1000,12965=>1000,12966=>1000,12967=>1000,12968=>1000,12969=>1000,12970=>1000,12971=>1000,12972=>1000,12973=>1000,12974=>1000,12975=>1000,12976=>1000,12992=>1000,12993=>1000, + 12994=>1000,12995=>1000,12996=>1000,12997=>1000,12998=>1000,12999=>1000,13000=>1000,13001=>1000,13002=>1000,13003=>1000,13008=>1000,13009=>1000,13010=>1000,13011=>1000,13012=>1000,13013=>1000, + 13014=>1000,13015=>1000,13016=>1000,13017=>1000,13018=>1000,13019=>1000,13020=>1000,13021=>1000,13022=>1000,13023=>1000,13024=>1000,13025=>1000,13026=>1000,13027=>1000,13028=>1000,13029=>1000, + 13030=>1000,13031=>1000,13032=>1000,13033=>1000,13034=>1000,13035=>1000,13036=>1000,13037=>1000,13038=>1000,13039=>1000,13040=>1000,13041=>1000,13042=>1000,13043=>1000,13044=>1000,13045=>1000, + 13046=>1000,13047=>1000,13048=>1000,13049=>1000,13050=>1000,13051=>1000,13052=>1000,13053=>1000,13054=>1000,13056=>1000,13057=>1000,13058=>1000,13059=>1000,13060=>1000,13061=>1000,13062=>1000, + 13063=>1000,13064=>1000,13065=>1000,13066=>1000,13067=>1000,13068=>1000,13069=>1000,13070=>1000,13071=>1000,13072=>1000,13073=>1000,13074=>1000,13075=>1000,13076=>1000,13077=>1000,13078=>1000, + 13079=>1000,13080=>1000,13081=>1000,13082=>1000,13083=>1000,13084=>1000,13085=>1000,13086=>1000,13087=>1000,13088=>1000,13089=>1000,13090=>1000,13091=>1000,13092=>1000,13093=>1000,13094=>1000, + 13095=>1000,13096=>1000,13097=>1000,13098=>1000,13099=>1000,13100=>1000,13101=>1000,13102=>1000,13103=>1000,13104=>1000,13105=>1000,13106=>1000,13107=>1000,13108=>1000,13109=>1000,13110=>1000, + 13111=>1000,13112=>1000,13113=>1000,13114=>1000,13115=>1000,13116=>1000,13117=>1000,13118=>1000,13119=>1000,13120=>1000,13121=>1000,13122=>1000,13123=>1000,13124=>1000,13125=>1000,13126=>1000, + 13127=>1000,13128=>1000,13129=>1000,13130=>1000,13131=>1000,13132=>1000,13133=>1000,13134=>1000,13135=>1000,13136=>1000,13137=>1000,13138=>1000,13139=>1000,13140=>1000,13141=>1000,13142=>1000, + 13143=>1000,13144=>1000,13145=>1000,13146=>1000,13147=>1000,13148=>1000,13149=>1000,13150=>1000,13151=>1000,13152=>1000,13153=>1000,13154=>1000,13155=>1000,13156=>1000,13157=>1000,13158=>1000, + 13159=>1000,13160=>1000,13161=>1000,13162=>1000,13163=>1000,13164=>1000,13165=>1000,13166=>1000,13167=>1000,13168=>1000,13169=>1000,13170=>1000,13171=>1000,13172=>1000,13173=>1000,13174=>1000, + 13179=>1000,13180=>1000,13181=>1000,13182=>1000,13183=>1000,13184=>1000,13185=>1000,13186=>1000,13187=>1000,13188=>1000,13189=>1000,13190=>1000,13191=>1000,13192=>1000,13193=>1000,13194=>1000, + 13195=>1000,13196=>1000,13197=>1000,13198=>1000,13199=>1000,13200=>1000,13201=>1000,13202=>1000,13203=>1000,13204=>1000,13205=>1000,13206=>1000,13207=>1000,13208=>1000,13209=>1000,13210=>1000, + 13211=>1000,13212=>1000,13213=>1000,13214=>1000,13215=>1000,13216=>1000,13217=>1000,13218=>1000,13219=>1000,13220=>1000,13221=>1000,13222=>1000,13223=>1000,13224=>1000,13225=>1000,13226=>1000, + 13227=>1000,13228=>1000,13229=>1000,13230=>1000,13231=>1000,13232=>1000,13233=>1000,13234=>1000,13235=>1000,13236=>1000,13237=>1000,13238=>1000,13239=>1000,13240=>1000,13241=>1000,13242=>1000, + 13243=>1000,13244=>1000,13245=>1000,13246=>1000,13247=>1000,13248=>1000,13249=>1000,13250=>1000,13251=>1000,13252=>1000,13253=>1000,13254=>1000,13255=>1000,13256=>1000,13257=>1000,13258=>1000, + 13259=>1000,13260=>1000,13261=>1000,13262=>1000,13263=>1000,13264=>1000,13265=>1000,13266=>1000,13267=>1000,13268=>1000,13269=>1000,13270=>1000,13271=>1000,13272=>1000,13273=>1000,13274=>1000, + 13275=>1000,13276=>1000,13277=>1000,13280=>1000,13281=>1000,13282=>1000,13283=>1000,13284=>1000,13285=>1000,13286=>1000,13287=>1000,13288=>1000,13289=>1000,13290=>1000,13291=>1000,13292=>1000, + 13293=>1000,13294=>1000,13295=>1000,13296=>1000,13297=>1000,13298=>1000,13299=>1000,13300=>1000,13301=>1000,13302=>1000,13303=>1000,13304=>1000,13305=>1000,13306=>1000,13307=>1000,13308=>1000, + 13309=>1000,13310=>1000,59393=>316,59394=>507,59395=>507,59396=>484,59397=>484,59416=>0,59492=>480,59495=>480,59536=>458,59557=>466,59558=>480,59559=>903,61441=>500,61442=>500, + 63232=>541,63233=>0,63234=>0,63235=>0,63236=>0,63237=>0,63238=>0,63239=>0,63240=>0,63241=>0,63242=>0,63243=>0,63244=>0,63245=>0,63246=>0,63247=>849, + 63248=>0,63249=>0,63250=>0,63251=>0,63252=>0,63253=>0,63254=>0,63255=>0,63256=>0,63257=>0,63258=>0,63260=>333,63261=>287,63744=>1000,63745=>1000,63746=>1000, + 63747=>1000,63748=>1000,63749=>1000,63750=>1000,63751=>1000,63752=>1000,63753=>1000,63754=>1000,63755=>1000,63756=>1000,63757=>1000,63758=>1000,63759=>1000,63760=>1000,63761=>1000,63762=>1000, + 63763=>1000,63764=>1000,63765=>1000,63766=>1000,63767=>1000,63768=>1000,63769=>1000,63770=>1000,63771=>1000,63772=>1000,63773=>1000,63774=>1000,63775=>1000,63776=>1000,63777=>1000,63778=>1000, + 63779=>1000,63780=>1000,63781=>1000,63782=>1000,63783=>1000,63784=>1000,63785=>1000,63786=>1000,63787=>1000,63788=>1000,63789=>1000,63790=>1000,63791=>1000,63792=>1000,63793=>1000,63794=>1000, + 63795=>1000,63796=>1000,63797=>1000,63798=>1000,63799=>1000,63800=>1000,63801=>1000,63802=>1000,63803=>1000,63804=>1000,63805=>1000,63806=>1000,63807=>1000,63808=>1000,63809=>1000,63810=>1000, + 63811=>1000,63812=>1000,63813=>1000,63814=>1000,63815=>1000,63816=>1000,63817=>1000,63818=>1000,63819=>1000,63820=>1000,63821=>1000,63822=>1000,63823=>1000,63824=>1000,63825=>1000,63826=>1000, + 63827=>1000,63828=>1000,63829=>1000,63830=>1000,63831=>1000,63832=>1000,63833=>1000,63834=>1000,63835=>1000,63836=>1000,63837=>1000,63838=>1000,63839=>1000,63840=>1000,63841=>1000,63842=>1000, + 63843=>1000,63844=>1000,63845=>1000,63846=>1000,63847=>1000,63848=>1000,63849=>1000,63850=>1000,63851=>1000,63852=>1000,63853=>1000,63854=>1000,63855=>1000,63856=>1000,63857=>1000,63858=>1000, + 63859=>1000,63860=>1000,63861=>1000,63862=>1000,63863=>1000,63864=>1000,63865=>1000,63866=>1000,63867=>1000,63868=>1000,63869=>1000,63870=>1000,63871=>1000,63872=>1000,63873=>1000,63874=>1000, + 63875=>1000,63876=>1000,63877=>1000,63878=>1000,63879=>1000,63880=>1000,63881=>1000,63882=>1000,63883=>1000,63884=>1000,63885=>1000,63886=>1000,63887=>1000,63888=>1000,63889=>1000,63890=>1000, + 63891=>1000,63892=>1000,63893=>1000,63894=>1000,63895=>1000,63896=>1000,63897=>1000,63898=>1000,63899=>1000,63900=>1000,63901=>1000,63902=>1000,63903=>1000,63904=>1000,63905=>1000,63906=>1000, + 63907=>1000,63908=>1000,63909=>1000,63910=>1000,63911=>1000,63912=>1000,63913=>1000,63914=>1000,63915=>1000,63916=>1000,63917=>1000,63918=>1000,63919=>1000,63920=>1000,63921=>1000,63922=>1000, + 63923=>1000,63924=>1000,63925=>1000,63926=>1000,63927=>1000,63928=>1000,63929=>1000,63930=>1000,63931=>1000,63932=>1000,63933=>1000,63934=>1000,63935=>1000,63936=>1000,63937=>1000,63938=>1000, + 63939=>1000,63940=>1000,63941=>1000,63942=>1000,63943=>1000,63944=>1000,63945=>1000,63946=>1000,63947=>1000,63948=>1000,63949=>1000,63950=>1000,63951=>1000,63952=>1000,63953=>1000,63954=>1000, + 63955=>1000,63956=>1000,63957=>1000,63958=>1000,63959=>1000,63960=>1000,63961=>1000,63962=>1000,63963=>1000,63964=>1000,63965=>1000,63966=>1000,63967=>1000,63968=>1000,63969=>1000,63970=>1000, + 63971=>1000,63972=>1000,63973=>1000,63974=>1000,63975=>1000,63976=>1000,63977=>1000,63978=>1000,63979=>1000,63980=>1000,63981=>1000,63982=>1000,63983=>1000,63984=>1000,63985=>1000,63986=>1000, + 63987=>1000,63988=>1000,63989=>1000,63990=>1000,63991=>1000,63992=>1000,63993=>1000,63994=>1000,63995=>1000,63996=>1000,63997=>1000,63998=>1000,63999=>1000,64000=>1000,64001=>1000,64002=>1000, + 64003=>1000,64004=>1000,64005=>1000,64006=>1000,64007=>1000,64008=>1000,64009=>1000,64010=>1000,64011=>1000,64012=>1000,64013=>1000,64014=>1000,64015=>1000,64016=>1000,64017=>1000,64018=>1000, + 64019=>1000,64020=>1000,64021=>1000,64022=>1000,64023=>1000,64024=>1000,64025=>1000,64026=>1000,64027=>1000,64028=>1000,64029=>1000,64030=>1000,64031=>1000,64032=>1000,64033=>1000,64034=>1000, + 64035=>1000,64036=>1000,64037=>1000,64038=>1000,64039=>1000,64040=>1000,64041=>1000,64042=>1000,64043=>1000,64044=>1000,64045=>1000,64256=>537,64257=>500,64258=>500,64259=>778,64260=>750, + 64261=>532,64262=>758,64275=>784,64276=>784,64277=>784,64278=>784,64279=>893,64286=>333,64287=>590,64288=>550,64289=>709,64290=>649,64291=>730,64292=>656,64293=>605,64294=>730, + 64295=>633,64296=>794,64297=>584,64298=>700,64299=>700,64300=>700,64301=>700,64302=>577,64303=>577,64304=>577,64305=>563,64306=>411,64307=>512,64308=>594,64309=>316,64310=>326, + 64312=>594,64313=>316,64314=>507,64315=>527,64316=>484,64318=>594,64320=>338,64321=>604,64323=>567,64324=>569,64326=>514,64327=>583,64328=>507,64329=>700,64330=>633,64331=>316, + 64332=>563,64333=>527,64334=>569,64335=>577,64336=>243,64337=>273,64338=>771,64339=>788,64340=>276,64341=>243,64342=>771,64343=>788,64344=>276,64345=>243,64346=>771,64347=>788, + 64348=>276,64349=>243,64350=>771,64351=>788,64352=>276,64353=>243,64354=>771,64355=>788,64356=>276,64357=>243,64358=>771,64359=>788,64360=>276,64361=>243,64362=>957,64363=>903, + 64364=>466,64365=>480,64366=>957,64367=>903,64368=>466,64369=>480,64370=>544,64371=>658,64372=>646,64373=>637,64374=>544,64375=>658,64376=>646,64377=>637,64378=>544,64379=>658, + 64380=>646,64381=>637,64382=>544,64383=>658,64384=>646,64385=>637,64386=>430,64387=>458,64388=>430,64389=>458,64390=>430,64391=>458,64392=>430,64393=>458,64394=>421,64395=>436, + 64396=>421,64397=>436,64398=>828,64399=>942,64400=>432,64401=>549,64402=>828,64403=>942,64404=>432,64405=>549,64406=>828,64407=>942,64408=>432,64409=>549,64410=>828,64411=>942, + 64412=>432,64413=>549,64414=>692,64415=>723,64416=>692,64417=>723,64418=>276,64419=>243,64420=>514,64421=>477,64422=>514,64423=>509,64424=>273,64425=>427,64426=>706,64427=>706, + 64428=>686,64429=>686,64430=>550,64431=>461,64432=>550,64433=>461,64467=>757,64468=>733,64469=>432,64470=>549,64471=>470,64472=>466,64473=>470,64474=>466,64475=>470,64476=>466, + 64477=>470,64478=>470,64479=>466,64480=>470,64481=>466,64482=>470,64483=>466,64484=>781,64485=>933,64486=>276,64487=>243,64488=>276,64489=>243,64490=>547,64491=>517,64492=>783, + 64493=>753,64494=>740,64495=>710,64496=>740,64497=>710,64498=>740,64499=>710,64500=>740,64501=>710,64502=>1207,64503=>1177,64504=>517,64505=>1067,64506=>1037,64507=>517,64508=>731, + 64509=>793,64510=>276,64511=>243,64512=>932,64513=>932,64514=>914,64515=>1067,64516=>1077,64517=>935,64518=>935,64519=>935,64520=>917,64521=>1070,64522=>1080,64523=>932,64524=>932, + 64525=>932,64526=>914,64527=>1067,64528=>1077,64529=>932,64530=>914,64531=>1067,64532=>1077,64533=>1305,64534=>1287,64535=>1305,64536=>1287,64537=>1305,64538=>1305,64539=>1287,64540=>1429, + 64541=>1429,64542=>1429,64543=>1411,64544=>1476,64545=>1458,64546=>1476,64547=>1476,64548=>1476,64549=>1458,64550=>1392,64551=>1374,64552=>1374,64553=>1245,64554=>1227,64555=>1245,64556=>1227, + 64557=>1125,64558=>1125,64559=>1125,64560=>1107,64561=>1260,64562=>1270,64563=>1125,64564=>1107,64565=>1260,64566=>1270,64567=>706,64568=>1091,64569=>1091,64570=>1091,64571=>1106,64572=>1073, + 64573=>1226,64574=>1236,64575=>932,64576=>932,64577=>932,64578=>914,64579=>1067,64580=>1077,64581=>1140,64582=>1140,64583=>1140,64584=>1122,64585=>1275,64586=>1285,64587=>932,64588=>932, + 64589=>932,64590=>914,64591=>1067,64592=>1077,64593=>1345,64594=>1327,64595=>1480,64596=>1490,64597=>932,64598=>932,64599=>932,64600=>914,64601=>1067,64602=>1077,64603=>430,64604=>421, + 64605=>731,64606=>296,64607=>300,64608=>300,64609=>300,64610=>300,64611=>300,64612=>680,64613=>680,64614=>884,64615=>967,64616=>1037,64617=>1047,64618=>680,64619=>680,64620=>884, + 64621=>967,64622=>1037,64623=>1047,64624=>680,64625=>680,64626=>884,64627=>967,64628=>1037,64629=>1047,64630=>680,64631=>680,64632=>884,64633=>967,64634=>1037,64635=>1047,64636=>1274, + 64637=>1284,64638=>1274,64639=>1284,64640=>821,64641=>1221,64642=>1188,64643=>1341,64644=>1351,64645=>884,64646=>1037,64647=>1047,64648=>806,64649=>1173,64650=>680,64651=>680,64652=>884, + 64653=>967,64654=>1037,64655=>1047,64656=>793,64657=>680,64658=>680,64659=>884,64660=>967,64661=>1037,64662=>1047,64663=>911,64664=>911,64665=>911,64666=>806,64667=>679,64668=>911, + 64669=>911,64670=>911,64671=>806,64672=>679,64673=>911,64674=>911,64675=>911,64676=>806,64677=>679,64678=>806,64679=>1284,64680=>1179,64681=>1284,64682=>1179,64683=>1284,64684=>1179, + 64685=>1408,64686=>1408,64687=>1408,64688=>1303,64689=>1455,64690=>1455,64691=>1350,64692=>1455,64693=>1455,64694=>1455,64695=>1350,64696=>1371,64697=>1266,64698=>1224,64699=>1119,64700=>1224, + 64701=>1119,64702=>1104,64703=>1104,64704=>1104,64705=>999,64706=>1104,64707=>999,64708=>1070,64709=>1070,64710=>1070,64711=>676,64712=>965,64713=>911,64714=>911,64715=>911,64716=>806, + 64717=>679,64718=>1119,64719=>1119,64720=>1119,64721=>1014,64722=>911,64723=>911,64724=>911,64725=>806,64726=>679,64727=>1324,64728=>1219,64729=>686,64730=>911,64731=>911,64732=>911, + 64733=>806,64734=>679,64735=>776,64736=>649,64737=>776,64738=>649,64739=>776,64740=>649,64741=>776,64742=>649,64743=>1303,64744=>1176,64745=>1303,64746=>1176,64747=>793,64748=>1082, + 64749=>776,64750=>776,64751=>649,64752=>776,64753=>649,64754=>306,64755=>302,64756=>298,64757=>1527,64758=>1537,64759=>1380,64760=>1390,64761=>1380,64762=>1390,64763=>1564,64764=>1574, + 64765=>1564,64766=>1574,64767=>1440,64768=>1450,64769=>1440,64770=>1450,64771=>1440,64772=>1450,64773=>1611,64774=>1621,64775=>1611,64776=>1621,64777=>1429,64778=>1429,64779=>1429,64780=>1411, + 64781=>1207,64782=>1207,64783=>1254,64784=>1254,64785=>1527,64786=>1537,64787=>1348,64788=>1358,64789=>1348,64790=>1358,64791=>1564,64792=>1574,64793=>1564,64794=>1574,64795=>1431,64796=>1441, + 64797=>1431,64798=>1441,64799=>1431,64800=>1441,64801=>1611,64802=>1621,64803=>1611,64804=>1621,64805=>1429,64806=>1429,64807=>1429,64808=>1411,64809=>1207,64810=>1207,64811=>1254,64812=>1254, + 64813=>1408,64814=>1408,64815=>1408,64816=>1303,64817=>1176,64818=>1176,64819=>1266,64820=>1408,64821=>1408,64822=>1408,64823=>1408,64824=>1408,64825=>1408,64826=>1266,64827=>1266,64828=>273, + 64829=>243,64830=>600,64831=>600,64848=>1444,64849=>1541,64850=>1549,64851=>1444,64852=>1444,64853=>1444,64854=>1444,64855=>1444,64856=>1830,64857=>1817,64858=>1975,64859=>1964,64860=>2046, + 64861=>2046,64862=>2202,64863=>1962,64864=>1941,64865=>1941,64866=>1944,64867=>1836,64868=>2114,64869=>2093,64870=>1991,64871=>2049,64872=>1941,64873=>2212,64874=>1962,64875=>1941,64876=>1944, + 64877=>1836,64878=>2249,64879=>2096,64880=>1988,64881=>1925,64882=>1904,64883=>1799,64884=>2070,64885=>1833,64886=>1729,64887=>1652,64888=>1881,64889=>1729,64890=>1892,64891=>1881,64892=>1759, + 64893=>1637,64894=>1670,64895=>1654,64896=>1522,64897=>1686,64898=>1675,64899=>1549,64900=>1541,64901=>1522,64902=>1444,64903=>1436,64904=>1444,64905=>1757,64906=>1652,64907=>1975,64908=>1757, + 64909=>1652,64910=>1757,64911=>1652,64914=>1757,64915=>1857,64916=>1752,64917=>1444,64918=>1675,64919=>1522,64920=>1444,64921=>1675,64922=>1581,64923=>1570,64924=>1417,64925=>1362,64926=>1686, + 64927=>1686,64928=>1675,64929=>1686,64930=>1675,64931=>1581,64932=>1570,64933=>1975,64934=>2069,64935=>1964,64936=>2202,64937=>2259,64938=>2212,64939=>2259,64940=>1686,64941=>1581,64942=>1686, + 64943=>1686,64944=>1581,64945=>1870,64946=>1817,64947=>1686,64948=>1637,64949=>1444,64950=>1892,64951=>1886,64952=>1549,64953=>1975,64954=>1444,64955=>1723,64956=>1522,64957=>1541,64958=>2080, + 64959=>2080,64960=>1975,64961=>1817,64962=>1686,64963=>1499,64964=>1757,64965=>1883,64966=>2212,64967=>1686,65008=>1523,65009=>1172,65010=>1159,65011=>1356,65012=>2111,65013=>2258,65014=>2130, + 65015=>1552,65016=>2046,65017=>1856,65018=>1930,65019=>1070,65056=>450,65057=>450,65058=>450,65059=>450,65072=>1000,65073=>1000,65074=>1000,65075=>1000,65076=>1000,65077=>1000,65078=>1000, + 65079=>1000,65080=>1000,65081=>1000,65082=>1000,65083=>1000,65084=>1000,65085=>1000,65086=>1000,65087=>1000,65088=>1000,65089=>1000,65090=>1000,65091=>1000,65092=>1000,65097=>1000,65098=>1000, + 65099=>1000,65100=>1000,65101=>1000,65102=>1000,65103=>1000,65104=>167,65105=>250,65106=>167,65108=>167,65109=>167,65110=>334,65111=>167,65112=>600,65113=>200,65114=>200,65115=>200, + 65116=>200,65117=>200,65118=>200,65119=>334,65120=>400,65121=>233,65122=>350,65123=>200,65124=>350,65125=>350,65126=>350,65128=>167,65129=>334,65130=>533,65131=>609,65136=>300, + 65137=>298,65138=>296,65140=>298,65142=>300,65143=>298,65144=>300,65145=>302,65146=>298,65147=>296,65148=>306,65149=>306,65150=>154,65151=>154,65152=>529,65153=>243,65154=>273, + 65155=>243,65156=>273,65157=>470,65158=>466,65159=>243,65160=>273,65161=>731,65162=>793,65163=>276,65164=>243,65165=>243,65166=>273,65167=>771,65168=>788,65169=>276,65170=>243, + 65171=>514,65172=>477,65173=>771,65174=>788,65175=>276,65176=>243,65177=>771,65178=>788,65179=>276,65180=>243,65181=>544,65182=>658,65183=>646,65184=>637,65185=>544,65186=>658, + 65187=>646,65188=>637,65189=>544,65190=>658,65191=>646,65192=>637,65193=>430,65194=>458,65195=>430,65196=>458,65197=>421,65198=>436,65199=>421,65200=>436,65201=>1194,65202=>1194, + 65203=>770,65204=>770,65205=>1194,65206=>1194,65207=>770,65208=>770,65209=>1291,65210=>1291,65211=>817,65212=>817,65213=>1291,65214=>1291,65215=>817,65216=>817,65217=>843,65218=>843, + 65219=>733,65220=>733,65221=>843,65222=>843,65223=>733,65224=>733,65225=>594,65226=>556,65227=>586,65228=>554,65229=>594,65230=>556,65231=>586,65232=>554,65233=>957,65234=>903, + 65235=>466,65236=>480,65237=>800,65238=>823,65239=>466,65240=>480,65241=>757,65242=>733,65243=>432,65244=>549,65245=>662,65246=>673,65247=>273,65248=>243,65249=>589,65250=>640, + 65251=>481,65252=>532,65253=>692,65254=>723,65255=>276,65256=>243,65257=>514,65258=>477,65259=>686,65260=>405,65261=>470,65262=>466,65263=>731,65264=>793,65265=>731,65266=>803, + 65267=>276,65268=>243,65269=>551,65270=>603,65271=>551,65272=>603,65273=>551,65274=>603,65275=>551,65276=>603,65281=>1000,65282=>1000,65283=>1000,65284=>1000,65285=>1000,65286=>1000, + 65287=>1000,65288=>1000,65289=>1000,65290=>1000,65291=>1000,65292=>1000,65293=>1000,65294=>1000,65295=>1000,65296=>1000,65297=>1000,65298=>1000,65299=>1000,65300=>1000,65301=>1000,65302=>1000, + 65303=>1000,65304=>1000,65305=>1000,65306=>1000,65307=>1000,65308=>1000,65309=>1000,65310=>1000,65311=>1000,65312=>1000,65313=>1000,65314=>1000,65315=>1000,65316=>1000,65317=>1000,65318=>1000, + 65319=>1000,65320=>1000,65321=>1000,65322=>1000,65323=>1000,65324=>1000,65325=>1000,65326=>1000,65327=>1000,65328=>1000,65329=>1000,65330=>1000,65331=>1000,65332=>1000,65333=>1000,65334=>1000, + 65335=>1000,65336=>1000,65337=>1000,65338=>1000,65339=>1000,65340=>1000,65341=>1000,65342=>1000,65343=>1000,65344=>1000,65345=>1000,65346=>1000,65347=>1000,65348=>1000,65349=>1000,65350=>1000, + 65351=>1000,65352=>1000,65353=>1000,65354=>1000,65355=>1000,65356=>1000,65357=>1000,65358=>1000,65359=>1000,65360=>1000,65361=>1000,65362=>1000,65363=>1000,65364=>1000,65365=>1000,65366=>1000, + 65367=>1000,65368=>1000,65369=>1000,65370=>1000,65371=>1000,65372=>1000,65373=>1000,65374=>1000,65377=>500,65378=>500,65379=>500,65380=>500,65381=>500,65382=>500,65383=>500,65384=>500, + 65385=>500,65386=>500,65387=>500,65388=>500,65389=>500,65390=>500,65391=>500,65392=>500,65393=>500,65394=>500,65395=>500,65396=>500,65397=>500,65398=>500,65399=>500,65400=>500, + 65401=>500,65402=>500,65403=>500,65404=>500,65405=>500,65406=>500,65407=>500,65408=>500,65409=>500,65410=>500,65411=>500,65412=>500,65413=>500,65414=>500,65415=>500,65416=>500, + 65417=>500,65418=>500,65419=>500,65420=>500,65421=>500,65422=>500,65423=>500,65424=>500,65425=>500,65426=>500,65427=>500,65428=>500,65429=>500,65430=>500,65431=>500,65432=>500, + 65433=>500,65434=>500,65435=>500,65436=>500,65437=>500,65438=>500,65439=>500,65440=>500,65441=>500,65442=>500,65443=>500,65444=>500,65445=>500,65446=>500,65447=>500,65448=>500, + 65449=>500,65450=>500,65451=>500,65452=>500,65453=>500,65454=>500,65455=>500,65456=>500,65457=>500,65458=>500,65459=>500,65460=>500,65461=>500,65462=>500,65463=>500,65464=>500, + 65465=>500,65466=>500,65467=>500,65468=>500,65469=>500,65470=>500,65474=>500,65475=>500,65476=>500,65477=>500,65478=>500,65479=>500,65482=>500,65483=>500,65484=>500,65485=>500, + 65486=>500,65487=>500,65490=>500,65491=>500,65492=>500,65493=>500,65494=>500,65495=>500,65498=>500,65499=>500,65500=>500,65504=>1000,65505=>1000,65506=>1000,65507=>1000,65508=>1000, + 65509=>1000,65510=>1000,65512=>500,65513=>500,65514=>500,65515=>500,65516=>500,65517=>500,65518=>500,65532=>1000,65533=>1000,19968=>1000,19969=>1000,19970=>1000,19971=>1000,19972=>1000, + 19973=>1000,19974=>1000,19975=>1000,19976=>1000,19977=>1000,19978=>1000,19979=>1000,19980=>1000,19981=>1000,19982=>1000,19983=>1000,19984=>1000,19985=>1000,19986=>1000,19987=>1000,19988=>1000, + 19989=>1000,19990=>1000,19991=>1000,19992=>1000,19993=>1000,19994=>1000,19995=>1000,19996=>1000,19997=>1000,19998=>1000,19999=>1000,20000=>1000,20001=>1000,20002=>1000,20003=>1000,20004=>1000, + 20005=>1000,20006=>1000,20007=>1000,20008=>1000,20009=>1000,20010=>1000,20011=>1000,20012=>1000,20013=>1000,20014=>1000,20015=>1000,20016=>1000,20017=>1000,20018=>1000,20019=>1000,20020=>1000, + 20021=>1000,20022=>1000,20023=>1000,20024=>1000,20025=>1000,20026=>1000,20027=>1000,20028=>1000,20029=>1000,20030=>1000,20031=>1000,20032=>1000,20033=>1000,20034=>1000,20035=>1000,20036=>1000, + 20037=>1000,20038=>1000,20039=>1000,20040=>1000,20041=>1000,20042=>1000,20043=>1000,20044=>1000,20045=>1000,20046=>1000,20047=>1000,20048=>1000,20049=>1000,20050=>1000,20051=>1000,20052=>1000, + 20053=>1000,20054=>1000,20055=>1000,20056=>1000,20057=>1000,20058=>1000,20059=>1000,20060=>1000,20061=>1000,20062=>1000,20063=>1000,20064=>1000,20065=>1000,20066=>1000,20067=>1000,20068=>1000, + 20069=>1000,20070=>1000,20071=>1000,20072=>1000,20073=>1000,20074=>1000,20075=>1000,20076=>1000,20077=>1000,20078=>1000,20079=>1000,20080=>1000,20081=>1000,20082=>1000,20083=>1000,20084=>1000, + 20085=>1000,20086=>1000,20087=>1000,20088=>1000,20089=>1000,20090=>1000,20091=>1000,20092=>1000,20093=>1000,20094=>1000,20095=>1000,20096=>1000,20097=>1000,20098=>1000,20099=>1000,20100=>1000, + 20101=>1000,20102=>1000,20103=>1000,20104=>1000,20105=>1000,20106=>1000,20107=>1000,20108=>1000,20109=>1000,20110=>1000,20111=>1000,20112=>1000,20113=>1000,20114=>1000,20115=>1000,20116=>1000, + 20117=>1000,20118=>1000,20119=>1000,20120=>1000,20121=>1000,20122=>1000,20123=>1000,20124=>1000,20125=>1000,20126=>1000,20127=>1000,20128=>1000,20129=>1000,20130=>1000,20131=>1000,20132=>1000, + 20133=>1000,20134=>1000,20135=>1000,20136=>1000,20137=>1000,20138=>1000,20139=>1000,20140=>1000,20141=>1000,20142=>1000,20143=>1000,20144=>1000,20145=>1000,20146=>1000,20147=>1000,20148=>1000, + 20149=>1000,20150=>1000,20151=>1000,20152=>1000,20153=>1000,20154=>1000,20155=>1000,20156=>1000,20157=>1000,20158=>1000,20159=>1000,20160=>1000,20161=>1000,20162=>1000,20163=>1000,20164=>1000, + 20165=>1000,20166=>1000,20167=>1000,20168=>1000,20169=>1000,20170=>1000,20171=>1000,20172=>1000,20173=>1000,20174=>1000,20175=>1000,20176=>1000,20177=>1000,20178=>1000,20179=>1000,20180=>1000, + 20181=>1000,20182=>1000,20183=>1000,20184=>1000,20185=>1000,20186=>1000,20187=>1000,20188=>1000,20189=>1000,20190=>1000,20191=>1000,20192=>1000,20193=>1000,20194=>1000,20195=>1000,20196=>1000, + 20197=>1000,20198=>1000,20199=>1000,20200=>1000,20201=>1000,20202=>1000,20203=>1000,20204=>1000,20205=>1000,20206=>1000,20207=>1000,20208=>1000,20209=>1000,20210=>1000,20211=>1000,20212=>1000, + 20213=>1000,20214=>1000,20215=>1000,20216=>1000,20217=>1000,20218=>1000,20219=>1000,20220=>1000,20221=>1000,20222=>1000,20223=>1000,20224=>1000,20225=>1000,20226=>1000,20227=>1000,20228=>1000, + 20229=>1000,20230=>1000,20231=>1000,20232=>1000,20233=>1000,20234=>1000,20235=>1000,20236=>1000,20237=>1000,20238=>1000,20239=>1000,20240=>1000,20241=>1000,20242=>1000,20243=>1000,20244=>1000, + 20245=>1000,20246=>1000,20247=>1000,20248=>1000,20249=>1000,20250=>1000,20251=>1000,20252=>1000,20253=>1000,20254=>1000,20255=>1000,20256=>1000,20257=>1000,20258=>1000,20259=>1000,20260=>1000, + 20261=>1000,20262=>1000,20263=>1000,20264=>1000,20265=>1000,20266=>1000,20267=>1000,20268=>1000,20269=>1000,20270=>1000,20271=>1000,20272=>1000,20273=>1000,20274=>1000,20275=>1000,20276=>1000, + 20277=>1000,20278=>1000,20279=>1000,20280=>1000,20281=>1000,20282=>1000,20283=>1000,20284=>1000,20285=>1000,20286=>1000,20287=>1000,20288=>1000,20289=>1000,20290=>1000,20291=>1000,20292=>1000, + 20293=>1000,20294=>1000,20295=>1000,20296=>1000,20297=>1000,20298=>1000,20299=>1000,20300=>1000,20301=>1000,20302=>1000,20303=>1000,20304=>1000,20305=>1000,20306=>1000,20307=>1000,20308=>1000, + 20309=>1000,20310=>1000,20311=>1000,20312=>1000,20313=>1000,20314=>1000,20315=>1000,20316=>1000,20317=>1000,20318=>1000,20319=>1000,20320=>1000,20321=>1000,20322=>1000,20323=>1000,20324=>1000, + 20325=>1000,20326=>1000,20327=>1000,20328=>1000,20329=>1000,20330=>1000,20331=>1000,20332=>1000,20333=>1000,20334=>1000,20335=>1000,20336=>1000,20337=>1000,20338=>1000,20339=>1000,20340=>1000, + 20341=>1000,20342=>1000,20343=>1000,20344=>1000,20345=>1000,20346=>1000,20347=>1000,20348=>1000,20349=>1000,20350=>1000,20351=>1000,20352=>1000,20353=>1000,20354=>1000,20355=>1000,20356=>1000, + 20357=>1000,20358=>1000,20359=>1000,20360=>1000,20361=>1000,20362=>1000,20363=>1000,20364=>1000,20365=>1000,20366=>1000,20367=>1000,20368=>1000,20369=>1000,20370=>1000,20371=>1000,20372=>1000, + 20373=>1000,20374=>1000,20375=>1000,20376=>1000,20377=>1000,20378=>1000,20379=>1000,20380=>1000,20381=>1000,20382=>1000,20383=>1000,20384=>1000,20385=>1000,20386=>1000,20387=>1000,20388=>1000, + 20389=>1000,20390=>1000,20391=>1000,20392=>1000,20393=>1000,20394=>1000,20395=>1000,20396=>1000,20397=>1000,20398=>1000,20399=>1000,20400=>1000,20401=>1000,20402=>1000,20403=>1000,20404=>1000, + 20405=>1000,20406=>1000,20407=>1000,20408=>1000,20409=>1000,20410=>1000,20411=>1000,20412=>1000,20413=>1000,20414=>1000,20415=>1000,20416=>1000,20417=>1000,20418=>1000,20419=>1000,20420=>1000, + 20421=>1000,20422=>1000,20423=>1000,20424=>1000,20425=>1000,20426=>1000,20427=>1000,20428=>1000,20429=>1000,20430=>1000,20431=>1000,20432=>1000,20433=>1000,20434=>1000,20435=>1000,20436=>1000, + 20437=>1000,20438=>1000,20439=>1000,20440=>1000,20441=>1000,20442=>1000,20443=>1000,20444=>1000,20445=>1000,20446=>1000,20447=>1000,20448=>1000,20449=>1000,20450=>1000,20451=>1000,20452=>1000, + 20453=>1000,20454=>1000,20455=>1000,20456=>1000,20457=>1000,20458=>1000,20459=>1000,20460=>1000,20461=>1000,20462=>1000,20463=>1000,20464=>1000,20465=>1000,20466=>1000,20467=>1000,20468=>1000, + 20469=>1000,20470=>1000,20471=>1000,20472=>1000,20473=>1000,20474=>1000,20475=>1000,20476=>1000,20477=>1000,20478=>1000,20479=>1000,20480=>1000,20481=>1000,20482=>1000,20483=>1000,20484=>1000, + 20485=>1000,20486=>1000,20487=>1000,20488=>1000,20489=>1000,20490=>1000,20491=>1000,20492=>1000,20493=>1000,20494=>1000,20495=>1000,20496=>1000,20497=>1000,20498=>1000,20499=>1000,20500=>1000, + 20501=>1000,20502=>1000,20503=>1000,20504=>1000,20505=>1000,20506=>1000,20507=>1000,20508=>1000,20509=>1000,20510=>1000,20511=>1000,20512=>1000,20513=>1000,20514=>1000,20515=>1000,20516=>1000, + 20517=>1000,20518=>1000,20519=>1000,20520=>1000,20521=>1000,20522=>1000,20523=>1000,20524=>1000,20525=>1000,20526=>1000,20527=>1000,20528=>1000,20529=>1000,20530=>1000,20531=>1000,20532=>1000, + 20533=>1000,20534=>1000,20535=>1000,20536=>1000,20537=>1000,20538=>1000,20539=>1000,20540=>1000,20541=>1000,20542=>1000,20543=>1000,20544=>1000,20545=>1000,20546=>1000,20547=>1000,20548=>1000, + 20549=>1000,20550=>1000,20551=>1000,20552=>1000,20553=>1000,20554=>1000,20555=>1000,20556=>1000,20557=>1000,20558=>1000,20559=>1000,20560=>1000,20561=>1000,20562=>1000,20563=>1000,20564=>1000, + 20565=>1000,20566=>1000,20567=>1000,20568=>1000,20569=>1000,20570=>1000,20571=>1000,20572=>1000,20573=>1000,20574=>1000,20575=>1000,20576=>1000,20577=>1000,20578=>1000,20579=>1000,20580=>1000, + 20581=>1000,20582=>1000,20583=>1000,20584=>1000,20585=>1000,20586=>1000,20587=>1000,20588=>1000,20589=>1000,20590=>1000,20591=>1000,20592=>1000,20593=>1000,20594=>1000,20595=>1000,20596=>1000, + 20597=>1000,20598=>1000,20599=>1000,20600=>1000,20601=>1000,20602=>1000,20603=>1000,20604=>1000,20605=>1000,20606=>1000,20607=>1000,20608=>1000,20609=>1000,20610=>1000,20611=>1000,20612=>1000, + 20613=>1000,20614=>1000,20615=>1000,20616=>1000,20617=>1000,20618=>1000,20619=>1000,20620=>1000,20621=>1000,20622=>1000,20623=>1000,20624=>1000,20625=>1000,20626=>1000,20627=>1000,20628=>1000, + 20629=>1000,20630=>1000,20631=>1000,20632=>1000,20633=>1000,20634=>1000,20635=>1000,20636=>1000,20637=>1000,20638=>1000,20639=>1000,20640=>1000,20641=>1000,20642=>1000,20643=>1000,20644=>1000, + 20645=>1000,20646=>1000,20647=>1000,20648=>1000,20649=>1000,20650=>1000,20651=>1000,20652=>1000,20653=>1000,20654=>1000,20655=>1000,20656=>1000,20657=>1000,20658=>1000,20659=>1000,20660=>1000, + 20661=>1000,20662=>1000,20663=>1000,20664=>1000,20665=>1000,20666=>1000,20667=>1000,20668=>1000,20669=>1000,20670=>1000,20671=>1000,20672=>1000,20673=>1000,20674=>1000,20675=>1000,20676=>1000, + 20677=>1000,20678=>1000,20679=>1000,20680=>1000,20681=>1000,20682=>1000,20683=>1000,20684=>1000,20685=>1000,20686=>1000,20687=>1000,20688=>1000,20689=>1000,20690=>1000,20691=>1000,20692=>1000, + 20693=>1000,20694=>1000,20695=>1000,20696=>1000,20697=>1000,20698=>1000,20699=>1000,20700=>1000,20701=>1000,20702=>1000,20703=>1000,20704=>1000,20705=>1000,20706=>1000,20707=>1000,20708=>1000, + 20709=>1000,20710=>1000,20711=>1000,20712=>1000,20713=>1000,20714=>1000,20715=>1000,20716=>1000,20717=>1000,20718=>1000,20719=>1000,20720=>1000,20721=>1000,20722=>1000,20723=>1000,20724=>1000, + 20725=>1000,20726=>1000,20727=>1000,20728=>1000,20729=>1000,20730=>1000,20731=>1000,20732=>1000,20733=>1000,20734=>1000,20735=>1000,20736=>1000,20737=>1000,20738=>1000,20739=>1000,20740=>1000, + 20741=>1000,20742=>1000,20743=>1000,20744=>1000,20745=>1000,20746=>1000,20747=>1000,20748=>1000,20749=>1000,20750=>1000,20751=>1000,20752=>1000,20753=>1000,20754=>1000,20755=>1000,20756=>1000, + 20757=>1000,20758=>1000,20759=>1000,20760=>1000,20761=>1000,20762=>1000,20763=>1000,20764=>1000,20765=>1000,20766=>1000,20767=>1000,20768=>1000,20769=>1000,20770=>1000,20771=>1000,20772=>1000, + 20773=>1000,20774=>1000,20775=>1000,20776=>1000,20777=>1000,20778=>1000,20779=>1000,20780=>1000,20781=>1000,20782=>1000,20783=>1000,20784=>1000,20785=>1000,20786=>1000,20787=>1000,20788=>1000, + 20789=>1000,20790=>1000,20791=>1000,20792=>1000,20793=>1000,20794=>1000,20795=>1000,20796=>1000,20797=>1000,20798=>1000,20799=>1000,20800=>1000,20801=>1000,20802=>1000,20803=>1000,20804=>1000, + 20805=>1000,20806=>1000,20807=>1000,20808=>1000,20809=>1000,20810=>1000,20811=>1000,20812=>1000,20813=>1000,20814=>1000,20815=>1000,20816=>1000,20817=>1000,20818=>1000,20819=>1000,20820=>1000, + 20821=>1000,20822=>1000,20823=>1000,20824=>1000,20825=>1000,20826=>1000,20827=>1000,20828=>1000,20829=>1000,20830=>1000,20831=>1000,20832=>1000,20833=>1000,20834=>1000,20835=>1000,20836=>1000, + 20837=>1000,20838=>1000,20839=>1000,20840=>1000,20841=>1000,20842=>1000,20843=>1000,20844=>1000,20845=>1000,20846=>1000,20847=>1000,20848=>1000,20849=>1000,20850=>1000,20851=>1000,20852=>1000, + 20853=>1000,20854=>1000,20855=>1000,20856=>1000,20857=>1000,20858=>1000,20859=>1000,20860=>1000,20861=>1000,20862=>1000,20863=>1000,20864=>1000,20865=>1000,20866=>1000,20867=>1000,20868=>1000, + 20869=>1000,20870=>1000,20871=>1000,20872=>1000,20873=>1000,20874=>1000,20875=>1000,20876=>1000,20877=>1000,20878=>1000,20879=>1000,20880=>1000,20881=>1000,20882=>1000,20883=>1000,20884=>1000, + 20885=>1000,20886=>1000,20887=>1000,20888=>1000,20889=>1000,20890=>1000,20891=>1000,20892=>1000,20893=>1000,20894=>1000,20895=>1000,20896=>1000,20897=>1000,20898=>1000,20899=>1000,20900=>1000, + 20901=>1000,20902=>1000,20903=>1000,20904=>1000,20905=>1000,20906=>1000,20907=>1000,20908=>1000,20909=>1000,20910=>1000,20911=>1000,20912=>1000,20913=>1000,20914=>1000,20915=>1000,20916=>1000, + 20917=>1000,20918=>1000,20919=>1000,20920=>1000,20921=>1000,20922=>1000,20923=>1000,20924=>1000,20925=>1000,20926=>1000,20927=>1000,20928=>1000,20929=>1000,20930=>1000,20931=>1000,20932=>1000, + 20933=>1000,20934=>1000,20935=>1000,20936=>1000,20937=>1000,20938=>1000,20939=>1000,20940=>1000,20941=>1000,20942=>1000,20943=>1000,20944=>1000,20945=>1000,20946=>1000,20947=>1000,20948=>1000, + 20949=>1000,20950=>1000,20951=>1000,20952=>1000,20953=>1000,20954=>1000,20955=>1000,20956=>1000,20957=>1000,20958=>1000,20959=>1000,20960=>1000,20961=>1000,20962=>1000,20963=>1000,20964=>1000, + 20965=>1000,20966=>1000,20967=>1000,20968=>1000,20969=>1000,20970=>1000,20971=>1000,20972=>1000,20973=>1000,20974=>1000,20975=>1000,20976=>1000,20977=>1000,20978=>1000,20979=>1000,20980=>1000, + 20981=>1000,20982=>1000,20983=>1000,20984=>1000,20985=>1000,20986=>1000,20987=>1000,20988=>1000,20989=>1000,20990=>1000,20991=>1000,20992=>1000,20993=>1000,20994=>1000,20995=>1000,20996=>1000, + 20997=>1000,20998=>1000,20999=>1000,21000=>1000,21001=>1000,21002=>1000,21003=>1000,21004=>1000,21005=>1000,21006=>1000,21007=>1000,21008=>1000,21009=>1000,21010=>1000,21011=>1000,21012=>1000, + 21013=>1000,21014=>1000,21015=>1000,21016=>1000,21017=>1000,21018=>1000,21019=>1000,21020=>1000,21021=>1000,21022=>1000,21023=>1000,21024=>1000,21025=>1000,21026=>1000,21027=>1000,21028=>1000, + 21029=>1000,21030=>1000,21031=>1000,21032=>1000,21033=>1000,21034=>1000,21035=>1000,21036=>1000,21037=>1000,21038=>1000,21039=>1000,21040=>1000,21041=>1000,21042=>1000,21043=>1000,21044=>1000, + 21045=>1000,21046=>1000,21047=>1000,21048=>1000,21049=>1000,21050=>1000,21051=>1000,21052=>1000,21053=>1000,21054=>1000,21055=>1000,21056=>1000,21057=>1000,21058=>1000,21059=>1000,21060=>1000, + 21061=>1000,21062=>1000,21063=>1000,21064=>1000,21065=>1000,21066=>1000,21067=>1000,21068=>1000,21069=>1000,21070=>1000,21071=>1000,21072=>1000,21073=>1000,21074=>1000,21075=>1000,21076=>1000, + 21077=>1000,21078=>1000,21079=>1000,21080=>1000,21081=>1000,21082=>1000,21083=>1000,21084=>1000,21085=>1000,21086=>1000,21087=>1000,21088=>1000,21089=>1000,21090=>1000,21091=>1000,21092=>1000, + 21093=>1000,21094=>1000,21095=>1000,21096=>1000,21097=>1000,21098=>1000,21099=>1000,21100=>1000,21101=>1000,21102=>1000,21103=>1000,21104=>1000,21105=>1000,21106=>1000,21107=>1000,21108=>1000, + 21109=>1000,21110=>1000,21111=>1000,21112=>1000,21113=>1000,21114=>1000,21115=>1000,21116=>1000,21117=>1000,21118=>1000,21119=>1000,21120=>1000,21121=>1000,21122=>1000,21123=>1000,21124=>1000, + 21125=>1000,21126=>1000,21127=>1000,21128=>1000,21129=>1000,21130=>1000,21131=>1000,21132=>1000,21133=>1000,21134=>1000,21135=>1000,21136=>1000,21137=>1000,21138=>1000,21139=>1000,21140=>1000, + 21141=>1000,21142=>1000,21143=>1000,21144=>1000,21145=>1000,21146=>1000,21147=>1000,21148=>1000,21149=>1000,21150=>1000,21151=>1000,21152=>1000,21153=>1000,21154=>1000,21155=>1000,21156=>1000, + 21157=>1000,21158=>1000,21159=>1000,21160=>1000,21161=>1000,21162=>1000,21163=>1000,21164=>1000,21165=>1000,21166=>1000,21167=>1000,21168=>1000,21169=>1000,21170=>1000,21171=>1000,21172=>1000, + 21173=>1000,21174=>1000,21175=>1000,21176=>1000,21177=>1000,21178=>1000,21179=>1000,21180=>1000,21181=>1000,21182=>1000,21183=>1000,21184=>1000,21185=>1000,21186=>1000,21187=>1000,21188=>1000, + 21189=>1000,21190=>1000,21191=>1000,21192=>1000,21193=>1000,21194=>1000,21195=>1000,21196=>1000,21197=>1000,21198=>1000,21199=>1000,21200=>1000,21201=>1000,21202=>1000,21203=>1000,21204=>1000, + 21205=>1000,21206=>1000,21207=>1000,21208=>1000,21209=>1000,21210=>1000,21211=>1000,21212=>1000,21213=>1000,21214=>1000,21215=>1000,21216=>1000,21217=>1000,21218=>1000,21219=>1000,21220=>1000, + 21221=>1000,21222=>1000,21223=>1000,21224=>1000,21225=>1000,21226=>1000,21227=>1000,21228=>1000,21229=>1000,21230=>1000,21231=>1000,21232=>1000,21233=>1000,21234=>1000,21235=>1000,21236=>1000, + 21237=>1000,21238=>1000,21239=>1000,21240=>1000,21241=>1000,21242=>1000,21243=>1000,21244=>1000,21245=>1000,21246=>1000,21247=>1000,21248=>1000,21249=>1000,21250=>1000,21251=>1000,21252=>1000, + 21253=>1000,21254=>1000,21255=>1000,21256=>1000,21257=>1000,21258=>1000,21259=>1000,21260=>1000,21261=>1000,21262=>1000,21263=>1000,21264=>1000,21265=>1000,21266=>1000,21267=>1000,21268=>1000, + 21269=>1000,21270=>1000,21271=>1000,21272=>1000,21273=>1000,21274=>1000,21275=>1000,21276=>1000,21277=>1000,21278=>1000,21279=>1000,21280=>1000,21281=>1000,21282=>1000,21283=>1000,21284=>1000, + 21285=>1000,21286=>1000,21287=>1000,21288=>1000,21289=>1000,21290=>1000,21291=>1000,21292=>1000,21293=>994,21294=>1000,21295=>1000,21296=>1000,21297=>1000,21298=>1000,21299=>1000,21300=>1000, + 21301=>1000,21302=>1000,21303=>1000,21304=>1000,21305=>1000,21306=>1000,21307=>1000,21308=>1000,21309=>1000,21310=>1000,21311=>1000,21312=>1000,21313=>1000,21314=>1000,21315=>1000,21316=>1000, + 21317=>1000,21318=>1000,21319=>1000,21320=>1000,21321=>1000,21322=>1000,21323=>1000,21324=>1000,21325=>1000,21326=>1000,21327=>1000,21328=>1000,21329=>1000,21330=>1000,21331=>1000,21332=>1000, + 21333=>1000,21334=>1000,21335=>1000,21336=>1000,21337=>1000,21338=>1000,21339=>1000,21340=>1000,21341=>1000,21342=>1000,21343=>1000,21344=>1000,21345=>1000,21346=>1000,21347=>1000,21348=>1000, + 21349=>1000,21350=>1000,21351=>1000,21352=>1000,21353=>1000,21354=>1000,21355=>1000,21356=>1000,21357=>1000,21358=>1000,21359=>1000,21360=>1000,21361=>1000,21362=>1000,21363=>1000,21364=>1000, + 21365=>1000,21366=>1000,21367=>1000,21368=>1000,21369=>1000,21370=>1000,21371=>1000,21372=>1000,21373=>1000,21374=>1000,21375=>1000,21376=>1000,21377=>1000,21378=>1000,21379=>1000,21380=>1000, + 21381=>1000,21382=>1000,21383=>1000,21384=>1000,21385=>1000,21386=>1000,21387=>1000,21388=>1000,21389=>1000,21390=>1000,21391=>1000,21392=>1000,21393=>1000,21394=>1000,21395=>1000,21396=>1000, + 21397=>1000,21398=>1000,21399=>1000,21400=>1000,21401=>1000,21402=>1000,21403=>1000,21404=>1000,21405=>1000,21406=>1000,21407=>1000,21408=>1000,21409=>1000,21410=>1000,21411=>1000,21412=>1000, + 21413=>1000,21414=>1000,21415=>1000,21416=>1000,21417=>1000,21418=>1000,21419=>1000,21420=>1000,21421=>1000,21422=>1000,21423=>1000,21424=>1000,21425=>1000,21426=>1000,21427=>1000,21428=>1000, + 21429=>1000,21430=>1000,21431=>1000,21432=>1000,21433=>1000,21434=>1000,21435=>1000,21436=>1000,21437=>1000,21438=>1000,21439=>1000,21440=>1000,21441=>1000,21442=>1000,21443=>1000,21444=>1000, + 21445=>1000,21446=>1000,21447=>1000,21448=>1000,21449=>1000,21450=>1000,21451=>1000,21452=>1000,21453=>1000,21454=>1000,21455=>1000,21456=>1000,21457=>1000,21458=>1000,21459=>1000,21460=>1000, + 21461=>1000,21462=>1000,21463=>1000,21464=>1000,21465=>1000,21466=>1000,21467=>1000,21468=>1000,21469=>1000,21470=>1000,21471=>1000,21472=>1000,21473=>1000,21474=>1000,21475=>1000,21476=>1000, + 21477=>1000,21478=>1000,21479=>1000,21480=>1000,21481=>1000,21482=>1000,21483=>1000,21484=>1000,21485=>1000,21486=>1000,21487=>1000,21488=>1000,21489=>1000,21490=>1000,21491=>1000,21492=>1000, + 21493=>1000,21494=>1000,21495=>1000,21496=>1000,21497=>1000,21498=>1000,21499=>1000,21500=>1000,21501=>1000,21502=>1000,21503=>1000,21504=>1000,21505=>1000,21506=>1000,21507=>1000,21508=>1000, + 21509=>1000,21510=>1000,21511=>1000,21512=>1000,21513=>1000,21514=>1000,21515=>1000,21516=>1000,21517=>1000,21518=>1000,21519=>1000,21520=>1000,21521=>1000,21522=>1000,21523=>1000,21524=>1000, + 21525=>1000,21526=>1000,21527=>1000,21528=>1000,21529=>1000,21530=>1000,21531=>1000,21532=>1000,21533=>1000,21534=>1000,21535=>1000,21536=>1000,21537=>1000,21538=>1000,21539=>1000,21540=>1000, + 21541=>1000,21542=>1000,21543=>1000,21544=>1000,21545=>1000,21546=>1000,21547=>1000,21548=>1000,21549=>1000,21550=>1000,21551=>1000,21552=>1000,21553=>1000,21554=>1000,21555=>1000,21556=>1000, + 21557=>1000,21558=>1000,21559=>1000,21560=>1000,21561=>1000,21562=>1000,21563=>1000,21564=>1000,21565=>1000,21566=>1000,21567=>1000,21568=>1000,21569=>1000,21570=>1000,21571=>1000,21572=>1000, + 21573=>1000,21574=>1000,21575=>1000,21576=>1000,21577=>1000,21578=>1000,21579=>1000,21580=>1000,21581=>1000,21582=>1000,21583=>1000,21584=>1000,21585=>1000,21586=>1000,21587=>1000,21588=>1000, + 21589=>1000,21590=>1000,21591=>1000,21592=>1000,21593=>1000,21594=>1000,21595=>1000,21596=>1000,21597=>1000,21598=>1000,21599=>1000,21600=>1000,21601=>1000,21602=>1000,21603=>1000,21604=>1000, + 21605=>1000,21606=>1000,21607=>1000,21608=>1000,21609=>1000,21610=>1000,21611=>1000,21612=>1000,21613=>1000,21614=>1000,21615=>1000,21616=>1000,21617=>1000,21618=>1000,21619=>1000,21620=>1000, + 21621=>1000,21622=>1000,21623=>1000,21624=>1000,21625=>1000,21626=>1000,21627=>1000,21628=>1000,21629=>1000,21630=>1000,21631=>1000,21632=>1000,21633=>1000,21634=>1000,21635=>1000,21636=>1000, + 21637=>1000,21638=>1000,21639=>1000,21640=>1000,21641=>1000,21642=>1000,21643=>1000,21644=>1000,21645=>1000,21646=>1000,21647=>1000,21648=>1000,21649=>1000,21650=>1000,21651=>1000,21652=>1000, + 21653=>1000,21654=>1000,21655=>1000,21656=>1000,21657=>1000,21658=>1000,21659=>1000,21660=>1000,21661=>1000,21662=>1000,21663=>1000,21664=>1000,21665=>1000,21666=>1000,21667=>1000,21668=>1000, + 21669=>1000,21670=>1000,21671=>1000,21672=>1000,21673=>1000,21674=>1000,21675=>1000,21676=>1000,21677=>1000,21678=>1000,21679=>1000,21680=>1000,21681=>1000,21682=>1000,21683=>1000,21684=>1000, + 21685=>1000,21686=>1000,21687=>1000,21688=>1000,21689=>1000,21690=>1000,21691=>1000,21692=>1000,21693=>1000,21694=>1000,21695=>1000,21696=>1000,21697=>1000,21698=>1000,21699=>1000,21700=>1000, + 21701=>1000,21702=>1000,21703=>1000,21704=>1000,21705=>1000,21706=>1000,21707=>1000,21708=>1000,21709=>1000,21710=>1000,21711=>1000,21712=>1000,21713=>1000,21714=>1000,21715=>1000,21716=>1000, + 21717=>1000,21718=>1000,21719=>1000,21720=>1000,21721=>1000,21722=>1000,21723=>1000,21724=>1000,21725=>1000,21726=>1000,21727=>1000,21728=>1000,21729=>1000,21730=>1000,21731=>1000,21732=>1000, + 21733=>1000,21734=>1000,21735=>1000,21736=>1000,21737=>1000,21738=>1000,21739=>1000,21740=>1000,21741=>1000,21742=>1000,21743=>1000,21744=>1000,21745=>1000,21746=>1000,21747=>1000,21748=>1000, + 21749=>1000,21750=>1000,21751=>1000,21752=>1000,21753=>1000,21754=>1000,21755=>1000,21756=>1000,21757=>1000,21758=>1000,21759=>1000,21760=>1000,21761=>1000,21762=>1000,21763=>1000,21764=>1000, + 21765=>1000,21766=>1000,21767=>1000,21768=>1000,21769=>1000,21770=>1000,21771=>1000,21772=>1000,21773=>1000,21774=>1000,21775=>1000,21776=>1000,21777=>1000,21778=>1000,21779=>1000,21780=>1000, + 21781=>1000,21782=>1000,21783=>1000,21784=>1000,21785=>1000,21786=>1000,21787=>1000,21788=>1000,21789=>1000,21790=>1000,21791=>1000,21792=>1000,21793=>1000,21794=>1000,21795=>1000,21796=>1000, + 21797=>1000,21798=>1000,21799=>1000,21800=>1000,21801=>1000,21802=>1000,21803=>1000,21804=>1000,21805=>1000,21806=>1000,21807=>1000,21808=>1000,21809=>1000,21810=>1000,21811=>1000,21812=>1000, + 21813=>1000,21814=>1000,21815=>1000,21816=>1000,21817=>1000,21818=>1000,21819=>1000,21820=>1000,21821=>1000,21822=>1000,21823=>1000,21824=>1000,21825=>1000,21826=>1000,21827=>1000,21828=>1000, + 21829=>1000,21830=>1000,21831=>1000,21832=>1000,21833=>1000,21834=>1000,21835=>1000,21836=>1000,21837=>1000,21838=>1000,21839=>1000,21840=>1000,21841=>1000,21842=>1000,21843=>1000,21844=>1000, + 21845=>1000,21846=>1000,21847=>1000,21848=>1000,21849=>1000,21850=>1000,21851=>1000,21852=>1000,21853=>1000,21854=>1000,21855=>1000,21856=>1000,21857=>1000,21858=>1000,21859=>1000,21860=>1000, + 21861=>1000,21862=>1000,21863=>1000,21864=>1000,21865=>1000,21866=>1000,21867=>1000,21868=>1000,21869=>1000,21870=>1000,21871=>1000,21872=>1000,21873=>1000,21874=>1000,21875=>1000,21876=>1000, + 21877=>1000,21878=>1000,21879=>1000,21880=>1000,21881=>1000,21882=>1000,21883=>1000,21884=>1000,21885=>1000,21886=>1000,21887=>1000,21888=>1000,21889=>1000,21890=>1000,21891=>1000,21892=>1000, + 21893=>1000,21894=>1000,21895=>1000,21896=>1000,21897=>1000,21898=>1000,21899=>1000,21900=>1000,21901=>1000,21902=>1000,21903=>1000,21904=>1000,21905=>1000,21906=>1000,21907=>1000,21908=>1000, + 21909=>1000,21910=>1000,21911=>1000,21912=>1000,21913=>1000,21914=>1000,21915=>1000,21916=>1000,21917=>1000,21918=>1000,21919=>1000,21920=>1000,21921=>1000,21922=>1000,21923=>1000,21924=>1000, + 21925=>1000,21926=>1000,21927=>1000,21928=>1000,21929=>1000,21930=>1000,21931=>1000,21932=>1000,21933=>1000,21934=>1000,21935=>1000,21936=>1000,21937=>1000,21938=>1000,21939=>1000,21940=>1000, + 21941=>1000,21942=>1000,21943=>1000,21944=>1000,21945=>1000,21946=>1000,21947=>1000,21948=>1000,21949=>1000,21950=>1000,21951=>1000,21952=>1000,21953=>1000,21954=>1000,21955=>1000,21956=>1000, + 21957=>1000,21958=>1000,21959=>1000,21960=>1000,21961=>1000,21962=>1000,21963=>1000,21964=>1000,21965=>1000,21966=>1000,21967=>1000,21968=>1000,21969=>1000,21970=>1000,21971=>1000,21972=>1000, + 21973=>1000,21974=>1000,21975=>1000,21976=>1000,21977=>1000,21978=>1000,21979=>1000,21980=>1000,21981=>1000,21982=>1000,21983=>1000,21984=>1000,21985=>1000,21986=>1000,21987=>1000,21988=>1000, + 21989=>1000,21990=>1000,21991=>1000,21992=>1000,21993=>1000,21994=>1000,21995=>1000,21996=>1000,21997=>1000,21998=>1000,21999=>1000,22000=>1000,22001=>1000,22002=>1000,22003=>1000,22004=>1000, + 22005=>1000,22006=>1000,22007=>1000,22008=>1000,22009=>1000,22010=>1000,22011=>1000,22012=>1000,22013=>1000,22014=>1000,22015=>1000,22016=>1000,22017=>1000,22018=>1000,22019=>1000,22020=>1000, + 22021=>1000,22022=>1000,22023=>1000,22024=>1000,22025=>1000,22026=>1000,22027=>1000,22028=>1000,22029=>1000,22030=>1000,22031=>1000,22032=>1000,22033=>1000,22034=>1000,22035=>1000,22036=>1000, + 22037=>1000,22038=>1000,22039=>1000,22040=>1000,22041=>1000,22042=>1000,22043=>1000,22044=>1000,22045=>1000,22046=>1000,22047=>1000,22048=>1000,22049=>1000,22050=>1000,22051=>1000,22052=>1000, + 22053=>1000,22054=>1000,22055=>1000,22056=>1000,22057=>1000,22058=>1000,22059=>1000,22060=>1000,22061=>1000,22062=>1000,22063=>1000,22064=>1000,22065=>1000,22066=>1000,22067=>1000,22068=>1000, + 22069=>1000,22070=>1000,22071=>1000,22072=>1000,22073=>1000,22074=>1000,22075=>1000,22076=>1000,22077=>1000,22078=>1000,22079=>1000,22080=>1000,22081=>1000,22082=>1000,22083=>1000,22084=>1000, + 22085=>1000,22086=>1000,22087=>1000,22088=>1000,22089=>1000,22090=>1000,22091=>1000,22092=>1000,22093=>1000,22094=>1000,22095=>1000,22096=>1000,22097=>1000,22098=>1000,22099=>1000,22100=>1000, + 22101=>1000,22102=>1000,22103=>1000,22104=>1000,22105=>1000,22106=>1000,22107=>1000,22108=>1000,22109=>1000,22110=>1000,22111=>1000,22112=>1000,22113=>1000,22114=>1000,22115=>1000,22116=>1000, + 22117=>1000,22118=>1000,22119=>1000,22120=>1000,22121=>1000,22122=>1000,22123=>1000,22124=>1000,22125=>1000,22126=>1000,22127=>1000,22128=>1000,22129=>1000,22130=>1000,22131=>1000,22132=>1000, + 22133=>1000,22134=>1000,22135=>1000,22136=>1000,22137=>1000,22138=>1000,22139=>1000,22140=>1000,22141=>1000,22142=>1000,22143=>1000,22144=>1000,22145=>1000,22146=>1000,22147=>1000,22148=>1000, + 22149=>1000,22150=>1000,22151=>1000,22152=>1000,22153=>1000,22154=>1000,22155=>1000,22156=>1000,22157=>1000,22158=>1000,22159=>1000,22160=>1000,22161=>1000,22162=>1000,22163=>1000,22164=>1000, + 22165=>1000,22166=>1000,22167=>1000,22168=>1000,22169=>1000,22170=>1000,22171=>1000,22172=>1000,22173=>1000,22174=>1000,22175=>1000,22176=>1000,22177=>1000,22178=>1000,22179=>1000,22180=>1000, + 22181=>1000,22182=>1000,22183=>1000,22184=>1000,22185=>1000,22186=>1000,22187=>1000,22188=>1000,22189=>1000,22190=>1000,22191=>1000,22192=>1000,22193=>1000,22194=>1000,22195=>1000,22196=>1000, + 22197=>1000,22198=>1000,22199=>1000,22200=>1000,22201=>1000,22202=>1000,22203=>1000,22204=>1000,22205=>1000,22206=>1000,22207=>1000,22208=>1000,22209=>1000,22210=>1000,22211=>1000,22212=>1000, + 22213=>1000,22214=>1000,22215=>1000,22216=>1000,22217=>1000,22218=>1000,22219=>1000,22220=>1000,22221=>1000,22222=>1000,22223=>1000,22224=>1000,22225=>1000,22226=>1000,22227=>1000,22228=>1000, + 22229=>1000,22230=>1000,22231=>1000,22232=>1000,22233=>1000,22234=>1000,22235=>1000,22236=>1000,22237=>1000,22238=>1000,22239=>1000,22240=>1000,22241=>1000,22242=>1000,22243=>1000,22244=>1000, + 22245=>1000,22246=>1000,22247=>1000,22248=>1000,22249=>1000,22250=>1000,22251=>1000,22252=>1000,22253=>1000,22254=>1000,22255=>1000,22256=>1000,22257=>1000,22258=>1000,22259=>1000,22260=>1000, + 22261=>1000,22262=>1000,22263=>1000,22264=>1000,22265=>1000,22266=>1000,22267=>1000,22268=>1000,22269=>1000,22270=>1000,22271=>1000,22272=>1000,22273=>1000,22274=>1000,22275=>1000,22276=>1000, + 22277=>1000,22278=>1000,22279=>1000,22280=>1000,22281=>1000,22282=>1000,22283=>1000,22284=>1000,22285=>1000,22286=>1000,22287=>1000,22288=>1000,22289=>1000,22290=>1000,22291=>1000,22292=>1000, + 22293=>1000,22294=>1000,22295=>1000,22296=>1000,22297=>1000,22298=>1000,22299=>1000,22300=>1000,22301=>1000,22302=>1000,22303=>1000,22304=>1000,22305=>1000,22306=>1000,22307=>1000,22308=>1000, + 22309=>1000,22310=>1000,22311=>1000,22312=>1000,22313=>1000,22314=>1000,22315=>1000,22316=>1000,22317=>1000,22318=>1000,22319=>1000,22320=>1000,22321=>1000,22322=>1000,22323=>1000,22324=>1000, + 22325=>1000,22326=>1000,22327=>1000,22328=>1000,22329=>1000,22330=>1000,22331=>1000,22332=>1000,22333=>1000,22334=>1000,22335=>1000,22336=>1000,22337=>1000,22338=>1000,22339=>1000,22340=>1000, + 22341=>1000,22342=>1000,22343=>1000,22344=>1000,22345=>1000,22346=>1000,22347=>1000,22348=>1000,22349=>1000,22350=>1000,22351=>1000,22352=>1000,22353=>1000,22354=>1000,22355=>1000,22356=>1000, + 22357=>1000,22358=>1000,22359=>1000,22360=>1000,22361=>1000,22362=>1000,22363=>1000,22364=>1000,22365=>1000,22366=>1000,22367=>1000,22368=>1000,22369=>1000,22370=>1000,22371=>1000,22372=>1000, + 22373=>1000,22374=>1000,22375=>1000,22376=>1000,22377=>1000,22378=>1000,22379=>1000,22380=>1000,22381=>1000,22382=>1000,22383=>1000,22384=>1000,22385=>1000,22386=>1000,22387=>1000,22388=>1000, + 22389=>1000,22390=>1000,22391=>1000,22392=>1000,22393=>1000,22394=>1000,22395=>1000,22396=>1000,22397=>1000,22398=>1000,22399=>1000,22400=>1000,22401=>1000,22402=>1000,22403=>1000,22404=>1000, + 22405=>1000,22406=>1000,22407=>1000,22408=>1000,22409=>1000,22410=>1000,22411=>1000,22412=>1000,22413=>1000,22414=>1000,22415=>1000,22416=>1000,22417=>1000,22418=>1000,22419=>1000,22420=>1000, + 22421=>1000,22422=>1000,22423=>1000,22424=>1000,22425=>1000,22426=>1000,22427=>1000,22428=>1000,22429=>1000,22430=>1000,22431=>1000,22432=>1000,22433=>1000,22434=>1000,22435=>1000,22436=>1000, + 22437=>1000,22438=>1000,22439=>1000,22440=>1000,22441=>1000,22442=>1000,22443=>1000,22444=>1000,22445=>1000,22446=>1000,22447=>1000,22448=>1000,22449=>1000,22450=>1000,22451=>1000,22452=>1000, + 22453=>1000,22454=>1000,22455=>1000,22456=>1000,22457=>1000,22458=>1000,22459=>1000,22460=>1000,22461=>1000,22462=>1000,22463=>1000,22464=>1000,22465=>1000,22466=>1000,22467=>1000,22468=>1000, + 22469=>1000,22470=>1000,22471=>1000,22472=>1000,22473=>1000,22474=>1000,22475=>1000,22476=>1000,22477=>1000,22478=>1000,22479=>1000,22480=>1000,22481=>1000,22482=>1000,22483=>1000,22484=>1000, + 22485=>1000,22486=>1000,22487=>1000,22488=>1000,22489=>1000,22490=>1000,22491=>1000,22492=>1000,22493=>1000,22494=>1000,22495=>1000,22496=>1000,22497=>1000,22498=>1000,22499=>1000,22500=>1000, + 22501=>1000,22502=>1000,22503=>1000,22504=>1000,22505=>1000,22506=>1000,22507=>1000,22508=>1000,22509=>1000,22510=>1000,22511=>1000,22512=>1000,22513=>1000,22514=>1000,22515=>1000,22516=>1000, + 22517=>1000,22518=>1000,22519=>1000,22520=>1000,22521=>1000,22522=>1000,22523=>1000,22524=>1000,22525=>1000,22526=>1000,22527=>1000,22528=>1000,22529=>1000,22530=>1000,22531=>1000,22532=>1000, + 22533=>1000,22534=>1000,22535=>1000,22536=>1000,22537=>1000,22538=>1000,22539=>1000,22540=>1000,22541=>1000,22542=>1000,22543=>1000,22544=>1000,22545=>1000,22546=>1000,22547=>1000,22548=>1000, + 22549=>1000,22550=>1000,22551=>1000,22552=>1000,22553=>1000,22554=>1000,22555=>1000,22556=>1000,22557=>1000,22558=>1000,22559=>1000,22560=>1000,22561=>1000,22562=>1000,22563=>1000,22564=>1000, + 22565=>1000,22566=>1000,22567=>1000,22568=>1000,22569=>1000,22570=>1000,22571=>1000,22572=>1000,22573=>1000,22574=>1000,22575=>1000,22576=>1000,22577=>1000,22578=>1000,22579=>1000,22580=>1000, + 22581=>1000,22582=>1000,22583=>1000,22584=>1000,22585=>1000,22586=>1000,22587=>1000,22588=>1000,22589=>1000,22590=>1000,22591=>1000,22592=>1000,22593=>1000,22594=>1000,22595=>1000,22596=>1000, + 22597=>1000,22598=>1000,22599=>1000,22600=>1000,22601=>1000,22602=>1000,22603=>1000,22604=>1000,22605=>1000,22606=>1000,22607=>1000,22608=>1000,22609=>1000,22610=>1000,22611=>1000,22612=>1000, + 22613=>1000,22614=>1000,22615=>1000,22616=>1000,22617=>1000,22618=>1000,22619=>1000,22620=>1000,22621=>1000,22622=>1000,22623=>1000,22624=>1000,22625=>1000,22626=>1000,22627=>1000,22628=>1000, + 22629=>1000,22630=>1000,22631=>1000,22632=>1000,22633=>1000,22634=>1000,22635=>1000,22636=>1000,22637=>1000,22638=>1000,22639=>1000,22640=>1000,22641=>1000,22642=>1000,22643=>1000,22644=>1000, + 22645=>1000,22646=>1000,22647=>1000,22648=>1000,22649=>1000,22650=>1000,22651=>1000,22652=>1000,22653=>1000,22654=>1000,22655=>1000,22656=>1000,22657=>1000,22658=>1000,22659=>1000,22660=>1000, + 22661=>1000,22662=>1000,22663=>1000,22664=>1000,22665=>1000,22666=>1000,22667=>1000,22668=>1000,22669=>1000,22670=>1000,22671=>1000,22672=>1000,22673=>1000,22674=>1000,22675=>1000,22676=>1000, + 22677=>1000,22678=>1000,22679=>1000,22680=>1000,22681=>1000,22682=>1000,22683=>1000,22684=>1000,22685=>1000,22686=>1000,22687=>1000,22688=>1000,22689=>1000,22690=>1000,22691=>1000,22692=>1000, + 22693=>1000,22694=>1000,22695=>1000,22696=>1000,22697=>1000,22698=>1000,22699=>1000,22700=>1000,22701=>1000,22702=>1000,22703=>1000,22704=>1000,22705=>1000,22706=>1000,22707=>1000,22708=>1000, + 22709=>1000,22710=>1000,22711=>1000,22712=>1000,22713=>1000,22714=>1000,22715=>1000,22716=>1000,22717=>1000,22718=>1000,22719=>1000,22720=>1000,22721=>1000,22722=>1000,22723=>1000,22724=>1000, + 22725=>1000,22726=>1000,22727=>1000,22728=>1000,22729=>1000,22730=>1000,22731=>1000,22732=>1000,22733=>1000,22734=>1000,22735=>1000,22736=>1000,22737=>1000,22738=>1000,22739=>1000,22740=>1000, + 22741=>1000,22742=>1000,22743=>1000,22744=>1000,22745=>1000,22746=>1000,22747=>1000,22748=>1000,22749=>1000,22750=>1000,22751=>1000,22752=>1000,22753=>1000,22754=>1000,22755=>1000,22756=>1000, + 22757=>1000,22758=>1000,22759=>1000,22760=>1000,22761=>1000,22762=>1000,22763=>1000,22764=>1000,22765=>1000,22766=>1000,22767=>1000,22768=>1000,22769=>1000,22770=>1000,22771=>1000,22772=>1000, + 22773=>1000,22774=>1000,22775=>1000,22776=>1000,22777=>1000,22778=>1000,22779=>1000,22780=>1000,22781=>1000,22782=>1000,22783=>1000,22784=>1000,22785=>1000,22786=>1000,22787=>1000,22788=>1000, + 22789=>1000,22790=>1000,22791=>1000,22792=>1000,22793=>1000,22794=>1000,22795=>1000,22796=>1000,22797=>1000,22798=>1000,22799=>1000,22800=>1000,22801=>1000,22802=>1000,22803=>1000,22804=>1000, + 22805=>1000,22806=>1000,22807=>1000,22808=>1000,22809=>1000,22810=>1000,22811=>1000,22812=>1000,22813=>1000,22814=>1000,22815=>1000,22816=>1000,22817=>1000,22818=>1000,22819=>1000,22820=>1000, + 22821=>1000,22822=>1000,22823=>1000,22824=>1000,22825=>1000,22826=>1000,22827=>1000,22828=>1000,22829=>1000,22830=>1000,22831=>1000,22832=>1000,22833=>1000,22834=>1000,22835=>1000,22836=>1000, + 22837=>1000,22838=>1000,22839=>1000,22840=>1000,22841=>1000,22842=>1000,22843=>1000,22844=>1000,22845=>1000,22846=>1000,22847=>1000,22848=>1000,22849=>1000,22850=>1000,22851=>1000,22852=>1000, + 22853=>1000,22854=>1000,22855=>1000,22856=>1000,22857=>1000,22858=>1000,22859=>1000,22860=>1000,22861=>1000,22862=>1000,22863=>1000,22864=>1000,22865=>1000,22866=>1000,22867=>1000,22868=>1000, + 22869=>1000,22870=>1000,22871=>1000,22872=>1000,22873=>1000,22874=>1000,22875=>1000,22876=>1000,22877=>1000,22878=>1000,22879=>1000,22880=>1000,22881=>1000,22882=>1000,22883=>1000,22884=>1000, + 22885=>1000,22886=>1000,22887=>1000,22888=>1000,22889=>1000,22890=>1000,22891=>1000,22892=>1000,22893=>1000,22894=>1000,22895=>1000,22896=>1000,22897=>1000,22898=>1000,22899=>1000,22900=>1000, + 22901=>1000,22902=>1000,22903=>1000,22904=>1000,22905=>1000,22906=>1000,22907=>1000,22908=>1000,22909=>1000,22910=>1000,22911=>1000,22912=>1000,22913=>1000,22914=>1000,22915=>1000,22916=>1000, + 22917=>1000,22918=>1000,22919=>1000,22920=>1000,22921=>1000,22922=>1000,22923=>1000,22924=>1000,22925=>1000,22926=>1000,22927=>1000,22928=>1000,22929=>1000,22930=>1000,22931=>1000,22932=>1000, + 22933=>1000,22934=>1000,22935=>1000,22936=>1000,22937=>1000,22938=>1000,22939=>1000,22940=>1000,22941=>1000,22942=>1000,22943=>1000,22944=>1000,22945=>1000,22946=>1000,22947=>1000,22948=>1000, + 22949=>1000,22950=>1000,22951=>1000,22952=>1000,22953=>1000,22954=>1000,22955=>1000,22956=>1000,22957=>1000,22958=>1000,22959=>1000,22960=>1000,22961=>1000,22962=>1000,22963=>1000,22964=>1000, + 22965=>1000,22966=>1000,22967=>1000,22968=>1000,22969=>1000,22970=>1000,22971=>1000,22972=>1000,22973=>1000,22974=>1000,22975=>1000,22976=>1000,22977=>1000,22978=>1000,22979=>1000,22980=>1000, + 22981=>1000,22982=>1000,22983=>1000,22984=>1000,22985=>1000,22986=>1000,22987=>1000,22988=>1000,22989=>1000,22990=>1000,22991=>1000,22992=>1000,22993=>1000,22994=>1000,22995=>1000,22996=>1000, + 22997=>1000,22998=>1000,22999=>1000,23000=>1000,23001=>1000,23002=>1000,23003=>1000,23004=>1000,23005=>1000,23006=>1000,23007=>1000,23008=>1000,23009=>1000,23010=>1000,23011=>1000,23012=>1000, + 23013=>1000,23014=>1000,23015=>1000,23016=>1000,23017=>1000,23018=>1000,23019=>1000,23020=>1000,23021=>1000,23022=>1000,23023=>1000,23024=>1000,23025=>1000,23026=>1000,23027=>1000,23028=>1000, + 23029=>1000,23030=>1000,23031=>1000,23032=>1000,23033=>1000,23034=>1000,23035=>1000,23036=>1000,23037=>1000,23038=>1000,23039=>1000,23040=>1000,23041=>1000,23042=>1000,23043=>1000,23044=>1000, + 23045=>1000,23046=>1000,23047=>1000,23048=>1000,23049=>1000,23050=>1000,23051=>1000,23052=>1000,23053=>1000,23054=>1000,23055=>1000,23056=>1000,23057=>1000,23058=>1000,23059=>1000,23060=>1000, + 23061=>1000,23062=>1000,23063=>1000,23064=>1000,23065=>1000,23066=>1000,23067=>1000,23068=>1000,23069=>1000,23070=>1000,23071=>1000,23072=>1000,23073=>1000,23074=>1000,23075=>1000,23076=>1000, + 23077=>1000,23078=>1000,23079=>1000,23080=>1000,23081=>1000,23082=>1000,23083=>1000,23084=>1000,23085=>1000,23086=>1000,23087=>1000,23088=>1000,23089=>1000,23090=>1000,23091=>1000,23092=>1000, + 23093=>1000,23094=>1000,23095=>1000,23096=>1000,23097=>1000,23098=>1000,23099=>1000,23100=>1000,23101=>1000,23102=>1000,23103=>1000,23104=>1000,23105=>1000,23106=>1000,23107=>1000,23108=>1000, + 23109=>1000,23110=>1000,23111=>1000,23112=>1000,23113=>1000,23114=>1000,23115=>1000,23116=>1000,23117=>1000,23118=>1000,23119=>1000,23120=>1000,23121=>1000,23122=>1000,23123=>1000,23124=>1000, + 23125=>1000,23126=>1000,23127=>1000,23128=>1000,23129=>1000,23130=>1000,23131=>1000,23132=>1000,23133=>1000,23134=>1000,23135=>1000,23136=>1000,23137=>1000,23138=>1000,23139=>1000,23140=>1000, + 23141=>1000,23142=>1000,23143=>1000,23144=>1000,23145=>1000,23146=>1000,23147=>1000,23148=>1000,23149=>1000,23150=>1000,23151=>1000,23152=>1000,23153=>1000,23154=>1000,23155=>1000,23156=>1000, + 23157=>1000,23158=>1000,23159=>1000,23160=>1000,23161=>1000,23162=>1000,23163=>1000,23164=>1000,23165=>1000,23166=>1000,23167=>1000,23168=>1000,23169=>1000,23170=>1000,23171=>1000,23172=>1000, + 23173=>1000,23174=>1000,23175=>1000,23176=>1000,23177=>1000,23178=>1000,23179=>1000,23180=>1000,23181=>1000,23182=>1000,23183=>1000,23184=>1000,23185=>1000,23186=>1000,23187=>1000,23188=>1000, + 23189=>1000,23190=>1000,23191=>1000,23192=>1000,23193=>1000,23194=>1000,23195=>1000,23196=>1000,23197=>1000,23198=>1000,23199=>1000,23200=>1000,23201=>1000,23202=>1000,23203=>1000,23204=>1000, + 23205=>1000,23206=>1000,23207=>1000,23208=>1000,23209=>1000,23210=>1000,23211=>1000,23212=>1000,23213=>1000,23214=>1000,23215=>1000,23216=>1000,23217=>1000,23218=>1000,23219=>1000,23220=>1000, + 23221=>1000,23222=>1000,23223=>1000,23224=>1000,23225=>1000,23226=>1000,23227=>1000,23228=>1000,23229=>1000,23230=>1000,23231=>1000,23232=>1000,23233=>1000,23234=>1000,23235=>1000,23236=>1000, + 23237=>1000,23238=>1000,23239=>1000,23240=>1000,23241=>1000,23242=>1000,23243=>1000,23244=>1000,23245=>1000,23246=>1000,23247=>1000,23248=>1000,23249=>1000,23250=>1000,23251=>1000,23252=>1000, + 23253=>1000,23254=>1000,23255=>1000,23256=>1000,23257=>1000,23258=>1000,23259=>1000,23260=>1000,23261=>1000,23262=>1000,23263=>1000,23264=>1000,23265=>1000,23266=>1000,23267=>1000,23268=>1000, + 23269=>1000,23270=>1000,23271=>1000,23272=>1000,23273=>1000,23274=>1000,23275=>1000,23276=>1000,23277=>1000,23278=>1000,23279=>1000,23280=>1000,23281=>1000,23282=>1000,23283=>1000,23284=>1000, + 23285=>1000,23286=>1000,23287=>1000,23288=>1000,23289=>1000,23290=>1000,23291=>1000,23292=>1000,23293=>1000,23294=>1000,23295=>1000,23296=>1000,23297=>1000,23298=>1000,23299=>1000,23300=>1000, + 23301=>1000,23302=>1000,23303=>1000,23304=>1000,23305=>1000,23306=>1000,23307=>1000,23308=>1000,23309=>1000,23310=>1000,23311=>1000,23312=>1000,23313=>1000,23314=>1000,23315=>1000,23316=>1000, + 23317=>1000,23318=>1000,23319=>1000,23320=>1000,23321=>1000,23322=>1000,23323=>1000,23324=>1000,23325=>1000,23326=>1000,23327=>1000,23328=>1000,23329=>1000,23330=>1000,23331=>1000,23332=>1000, + 23333=>1000,23334=>1000,23335=>1000,23336=>1000,23337=>1000,23338=>1000,23339=>1000,23340=>1000,23341=>1000,23342=>1000,23343=>1000,23344=>1000,23345=>1000,23346=>1000,23347=>1000,23348=>1000, + 23349=>1000,23350=>1000,23351=>1000,23352=>1000,23353=>1000,23354=>1000,23355=>1000,23356=>1000,23357=>1000,23358=>1000,23359=>1000,23360=>1000,23361=>1000,23362=>1000,23363=>1000,23364=>1000, + 23365=>1000,23366=>1000,23367=>1000,23368=>1000,23369=>1000,23370=>1000,23371=>1000,23372=>1000,23373=>1000,23374=>1000,23375=>1000,23376=>1000,23377=>1000,23378=>1000,23379=>1000,23380=>1000, + 23381=>1000,23382=>1000,23383=>1000,23384=>1000,23385=>1000,23386=>1000,23387=>1000,23388=>1000,23389=>1000,23390=>1000,23391=>1000,23392=>1000,23393=>1000,23394=>1000,23395=>1000,23396=>1000, + 23397=>1000,23398=>1000,23399=>1000,23400=>1000,23401=>1000,23402=>1000,23403=>1000,23404=>1000,23405=>1000,23406=>1000,23407=>1000,23408=>1000,23409=>1000,23410=>1000,23411=>1000,23412=>1000, + 23413=>1000,23414=>1000,23415=>1000,23416=>1000,23417=>1000,23418=>1000,23419=>1000,23420=>1000,23421=>1000,23422=>1000,23423=>1000,23424=>1000,23425=>1000,23426=>1000,23427=>1000,23428=>1000, + 23429=>1000,23430=>1000,23431=>1000,23432=>1000,23433=>1000,23434=>1000,23435=>1000,23436=>1000,23437=>1000,23438=>1000,23439=>1000,23440=>1000,23441=>1000,23442=>1000,23443=>1000,23444=>1000, + 23445=>1000,23446=>1000,23447=>1000,23448=>1000,23449=>1000,23450=>1000,23451=>1000,23452=>1000,23453=>1000,23454=>1000,23455=>1000,23456=>1000,23457=>1000,23458=>1000,23459=>1000,23460=>1000, + 23461=>1000,23462=>1000,23463=>1000,23464=>1000,23465=>1000,23466=>1000,23467=>1000,23468=>1000,23469=>1000,23470=>1000,23471=>1000,23472=>1000,23473=>1000,23474=>1000,23475=>1000,23476=>1000, + 23477=>1000,23478=>1000,23479=>1000,23480=>1000,23481=>1000,23482=>1000,23483=>1000,23484=>1000,23485=>1000,23486=>1000,23487=>1000,23488=>1000,23489=>1000,23490=>1000,23491=>1000,23492=>1000, + 23493=>1000,23494=>1000,23495=>1000,23496=>1000,23497=>1000,23498=>1000,23499=>1000,23500=>1000,23501=>1000,23502=>1000,23503=>1000,23504=>1000,23505=>1000,23506=>1000,23507=>1000,23508=>1000, + 23509=>1000,23510=>1000,23511=>1000,23512=>1000,23513=>1000,23514=>1000,23515=>1000,23516=>1000,23517=>1000,23518=>1000,23519=>1000,23520=>1000,23521=>1000,23522=>1000,23523=>1000,23524=>1000, + 23525=>1000,23526=>1000,23527=>1000,23528=>1000,23529=>1000,23530=>1000,23531=>1000,23532=>1000,23533=>1000,23534=>1000,23535=>1000,23536=>1000,23537=>1000,23538=>1000,23539=>1000,23540=>1000, + 23541=>1000,23542=>1000,23543=>1000,23544=>1000,23545=>1000,23546=>1000,23547=>1000,23548=>1000,23549=>1000,23550=>1000,23551=>1000,23552=>1000,23553=>1000,23554=>1000,23555=>1000,23556=>1000, + 23557=>1000,23558=>1000,23559=>1000,23560=>1000,23561=>1000,23562=>1000,23563=>1000,23564=>1000,23565=>1000,23566=>1000,23567=>1000,23568=>1000,23569=>1000,23570=>1000,23571=>1000,23572=>1000, + 23573=>1000,23574=>1000,23575=>1000,23576=>1000,23577=>1000,23578=>1000,23579=>1000,23580=>1000,23581=>1000,23582=>1000,23583=>1000,23584=>1000,23585=>1000,23586=>1000,23587=>1000,23588=>1000, + 23589=>1000,23590=>1000,23591=>1000,23592=>1000,23593=>1000,23594=>1000,23595=>1000,23596=>1000,23597=>1000,23598=>1000,23599=>1000,23600=>1000,23601=>1000,23602=>1000,23603=>1000,23604=>1000, + 23605=>1000,23606=>1000,23607=>1000,23608=>1000,23609=>1000,23610=>1000,23611=>1000,23612=>1000,23613=>1000,23614=>1000,23615=>1000,23616=>1000,23617=>1000,23618=>1000,23619=>1000,23620=>1000, + 23621=>1000,23622=>1000,23623=>1000,23624=>1000,23625=>1000,23626=>1000,23627=>1000,23628=>1000,23629=>1000,23630=>1000,23631=>1000,23632=>1000,23633=>1000,23634=>1000,23635=>1000,23636=>1000, + 23637=>1000,23638=>1000,23639=>1000,23640=>1000,23641=>1000,23642=>1000,23643=>1000,23644=>1000,23645=>1000,23646=>1000,23647=>1000,23648=>1000,23649=>1000,23650=>1000,23651=>1000,23652=>1000, + 23653=>1000,23654=>1000,23655=>1000,23656=>1000,23657=>1000,23658=>1000,23659=>1000,23660=>1000,23661=>1000,23662=>1000,23663=>1000,23664=>1000,23665=>1000,23666=>1000,23667=>1000,23668=>1000, + 23669=>1000,23670=>1000,23671=>1000,23672=>1000,23673=>1000,23674=>1000,23675=>1000,23676=>1000,23677=>1000,23678=>1000,23679=>1000,23680=>1000,23681=>1000,23682=>1000,23683=>1000,23684=>1000, + 23685=>1000,23686=>1000,23687=>1000,23688=>1000,23689=>1000,23690=>1000,23691=>1000,23692=>1000,23693=>1000,23694=>1000,23695=>1000,23696=>1000,23697=>1000,23698=>1000,23699=>1000,23700=>1000, + 23701=>1000,23702=>1000,23703=>1000,23704=>1000,23705=>1000,23706=>1000,23707=>1000,23708=>1000,23709=>1000,23710=>1000,23711=>1000,23712=>1000,23713=>1000,23714=>1000,23715=>1000,23716=>1000, + 23717=>1000,23718=>1000,23719=>1000,23720=>1000,23721=>1000,23722=>1000,23723=>1000,23724=>1000,23725=>1000,23726=>1000,23727=>1000,23728=>1000,23729=>1000,23730=>1000,23731=>1000,23732=>1000, + 23733=>1000,23734=>1000,23735=>1000,23736=>1000,23737=>1000,23738=>1000,23739=>1000,23740=>1000,23741=>1000,23742=>1000,23743=>1000,23744=>1000,23745=>1000,23746=>1000,23747=>1000,23748=>1000, + 23749=>1000,23750=>1000,23751=>1000,23752=>1000,23753=>1000,23754=>1000,23755=>1000,23756=>1000,23757=>1000,23758=>1000,23759=>1000,23760=>1000,23761=>1000,23762=>1000,23763=>1000,23764=>1000, + 23765=>1000,23766=>1000,23767=>1000,23768=>1000,23769=>1000,23770=>1000,23771=>1000,23772=>1000,23773=>1000,23774=>1000,23775=>1000,23776=>1000,23777=>1000,23778=>1000,23779=>1000,23780=>1000, + 23781=>1000,23782=>1000,23783=>1000,23784=>1000,23785=>1000,23786=>1000,23787=>1000,23788=>1000,23789=>1000,23790=>1000,23791=>1000,23792=>1000,23793=>1000,23794=>1000,23795=>1000,23796=>1000, + 23797=>1000,23798=>1000,23799=>1000,23800=>1000,23801=>1000,23802=>1000,23803=>1000,23804=>1000,23805=>1000,23806=>1000,23807=>1000,23808=>1000,23809=>1000,23810=>1000,23811=>1000,23812=>1000, + 23813=>1000,23814=>1000,23815=>1000,23816=>1000,23817=>1000,23818=>1000,23819=>1000,23820=>1000,23821=>1000,23822=>1000,23823=>1000,23824=>1000,23825=>1000,23826=>1000,23827=>1000,23828=>1000, + 23829=>1000,23830=>1000,23831=>1000,23832=>1000,23833=>1000,23834=>1000,23835=>1000,23836=>1000,23837=>1000,23838=>1000,23839=>1000,23840=>1000,23841=>1000,23842=>1000,23843=>1000,23844=>1000, + 23845=>1000,23846=>1000,23847=>1000,23848=>1000,23849=>1000,23850=>1000,23851=>1000,23852=>1000,23853=>1000,23854=>1000,23855=>1000,23856=>1000,23857=>1000,23858=>1000,23859=>1000,23860=>1000, + 23861=>1000,23862=>1000,23863=>1000,23864=>1000,23865=>1000,23866=>1000,23867=>1000,23868=>1000,23869=>1000,23870=>1000,23871=>1000,23872=>1000,23873=>1000,23874=>1000,23875=>1000,23876=>1000, + 23877=>1000,23878=>1000,23879=>1000,23880=>1000,23881=>1000,23882=>1000,23883=>1000,23884=>1000,23885=>1000,23886=>1000,23887=>1000,23888=>1000,23889=>1000,23890=>1000,23891=>1000,23892=>1000, + 23893=>1000,23894=>1000,23895=>1000,23896=>1000,23897=>1000,23898=>1000,23899=>1000,23900=>1000,23901=>1000,23902=>1000,23903=>1000,23904=>1000,23905=>1000,23906=>1000,23907=>1000,23908=>1000, + 23909=>1000,23910=>1000,23911=>1000,23912=>1000,23913=>1000,23914=>1000,23915=>1000,23916=>1000,23917=>1000,23918=>1000,23919=>1000,23920=>1000,23921=>1000,23922=>1000,23923=>1000,23924=>1000, + 23925=>1000,23926=>1000,23927=>1000,23928=>1000,23929=>1000,23930=>1000,23931=>1000,23932=>1000,23933=>1000,23934=>1000,23935=>1000,23936=>1000,23937=>1000,23938=>1000,23939=>1000,23940=>1000, + 23941=>1000,23942=>1000,23943=>1000,23944=>1000,23945=>1000,23946=>1000,23947=>1000,23948=>1000,23949=>1000,23950=>1000,23951=>1000,23952=>1000,23953=>1000,23954=>1000,23955=>1000,23956=>1000, + 23957=>1000,23958=>1000,23959=>1000,23960=>1000,23961=>1000,23962=>1000,23963=>1000,23964=>1000,23965=>1000,23966=>1000,23967=>1000,23968=>1000,23969=>1000,23970=>1000,23971=>1000,23972=>1000, + 23973=>1000,23974=>1000,23975=>1000,23976=>1000,23977=>1000,23978=>1000,23979=>1000,23980=>1000,23981=>1000,23982=>1000,23983=>1000,23984=>1000,23985=>1000,23986=>1000,23987=>1000,23988=>1000, + 23989=>1000,23990=>1000,23991=>1000,23992=>1000,23993=>1000,23994=>1000,23995=>1000,23996=>1000,23997=>1000,23998=>1000,23999=>1000,24000=>1000,24001=>1000,24002=>1000,24003=>1000,24004=>1000, + 24005=>1000,24006=>1000,24007=>1000,24008=>1000,24009=>1000,24010=>1000,24011=>1000,24012=>1000,24013=>1000,24014=>1000,24015=>1000,24016=>1000,24017=>1000,24018=>1000,24019=>1000,24020=>1000, + 24021=>1000,24022=>1000,24023=>1000,24024=>1000,24025=>1000,24026=>1000,24027=>1000,24028=>1000,24029=>1000,24030=>1000,24031=>1000,24032=>1000,24033=>1000,24034=>1000,24035=>1000,24036=>1000, + 24037=>1000,24038=>1000,24039=>1000,24040=>1000,24041=>1000,24042=>1000,24043=>1000,24044=>1000,24045=>1000,24046=>1000,24047=>1000,24048=>1000,24049=>1000,24050=>1000,24051=>1000,24052=>1000, + 24053=>1000,24054=>1000,24055=>1000,24056=>1000,24057=>1000,24058=>1000,24059=>1000,24060=>1000,24061=>1000,24062=>1000,24063=>1000,24064=>1000,24065=>1000,24066=>1000,24067=>1000,24068=>1000, + 24069=>1000,24070=>1000,24071=>1000,24072=>1000,24073=>1000,24074=>1000,24075=>1000,24076=>1000,24077=>1000,24078=>1000,24079=>1000,24080=>1000,24081=>1000,24082=>1000,24083=>1000,24084=>1000, + 24085=>1000,24086=>1000,24087=>1000,24088=>1000,24089=>1000,24090=>1000,24091=>1000,24092=>1000,24093=>1000,24094=>1000,24095=>1000,24096=>1000,24097=>1000,24098=>1000,24099=>1000,24100=>1000, + 24101=>1000,24102=>1000,24103=>1000,24104=>1000,24105=>1000,24106=>1000,24107=>1000,24108=>1000,24109=>1000,24110=>1000,24111=>1000,24112=>1000,24113=>1000,24114=>1000,24115=>1000,24116=>1000, + 24117=>1000,24118=>1000,24119=>1000,24120=>1000,24121=>1000,24122=>1000,24123=>1000,24124=>1000,24125=>1000,24126=>1000,24127=>1000,24128=>1000,24129=>1000,24130=>1000,24131=>1000,24132=>1000, + 24133=>1000,24134=>1000,24135=>1000,24136=>1000,24137=>1000,24138=>1000,24139=>1000,24140=>1000,24141=>1000,24142=>1000,24143=>1000,24144=>1000,24145=>1000,24146=>1000,24147=>1000,24148=>1000, + 24149=>1000,24150=>1000,24151=>1000,24152=>1000,24153=>1000,24154=>1000,24155=>1000,24156=>1000,24157=>1000,24158=>1000,24159=>1000,24160=>1000,24161=>1000,24162=>1000,24163=>1000,24164=>1000, + 24165=>1000,24166=>1000,24167=>1000,24168=>1000,24169=>1000,24170=>1000,24171=>1000,24172=>1000,24173=>1000,24174=>1000,24175=>1000,24176=>1000,24177=>1000,24178=>1000,24179=>1000,24180=>1000, + 24181=>1000,24182=>1000,24183=>1000,24184=>1000,24185=>1000,24186=>1000,24187=>1000,24188=>1000,24189=>1000,24190=>1000,24191=>1000,24192=>1000,24193=>1000,24194=>1000,24195=>1000,24196=>1000, + 24197=>1000,24198=>1000,24199=>1000,24200=>1000,24201=>1000,24202=>1000,24203=>1000,24204=>1000,24205=>1000,24206=>1000,24207=>1000,24208=>1000,24209=>1000,24210=>1000,24211=>1000,24212=>1000, + 24213=>1000,24214=>1000,24215=>1000,24216=>1000,24217=>1000,24218=>1000,24219=>1000,24220=>1000,24221=>1000,24222=>1000,24223=>1000,24224=>1000,24225=>1000,24226=>1000,24227=>1000,24228=>1000, + 24229=>1000,24230=>1000,24231=>1000,24232=>1000,24233=>1000,24234=>1000,24235=>1000,24236=>1000,24237=>1000,24238=>1000,24239=>1000,24240=>1000,24241=>1000,24242=>1000,24243=>1000,24244=>1000, + 24245=>1000,24246=>1000,24247=>1000,24248=>1000,24249=>1000,24250=>1000,24251=>1000,24252=>1000,24253=>1000,24254=>1000,24255=>1000,24256=>1000,24257=>1000,24258=>1000,24259=>1000,24260=>1000, + 24261=>1000,24262=>1000,24263=>1000,24264=>1000,24265=>1000,24266=>1000,24267=>1000,24268=>1000,24269=>1000,24270=>1000,24271=>1000,24272=>1000,24273=>1000,24274=>1000,24275=>1000,24276=>1000, + 24277=>1000,24278=>1000,24279=>1000,24280=>1000,24281=>1000,24282=>1000,24283=>1000,24284=>1000,24285=>1000,24286=>1000,24287=>1000,24288=>1000,24289=>1000,24290=>1000,24291=>1000,24292=>1000, + 24293=>1000,24294=>1000,24295=>1000,24296=>1000,24297=>1000,24298=>1000,24299=>1000,24300=>1000,24301=>1000,24302=>1000,24303=>1000,24304=>1000,24305=>1000,24306=>1000,24307=>1000,24308=>1000, + 24309=>1000,24310=>1000,24311=>1000,24312=>1000,24313=>1000,24314=>1000,24315=>1000,24316=>1000,24317=>1000,24318=>1000,24319=>1000,24320=>1000,24321=>1000,24322=>1000,24323=>1000,24324=>1000, + 24325=>1000,24326=>1000,24327=>1000,24328=>1000,24329=>1000,24330=>1000,24331=>1000,24332=>1000,24333=>1000,24334=>1000,24335=>1000,24336=>1000,24337=>1000,24338=>1000,24339=>1000,24340=>1000, + 24341=>1000,24342=>1000,24343=>1000,24344=>1000,24345=>1000,24346=>1000,24347=>1000,24348=>1000,24349=>1000,24350=>1000,24351=>1000,24352=>1000,24353=>1000,24354=>1000,24355=>1000,24356=>1000, + 24357=>1000,24358=>1000,24359=>1000,24360=>1000,24361=>1000,24362=>1000,24363=>1000,24364=>1000,24365=>1000,24366=>1000,24367=>1000,24368=>1000,24369=>1000,24370=>1000,24371=>1000,24372=>1000, + 24373=>1000,24374=>1000,24375=>1000,24376=>1000,24377=>1000,24378=>1000,24379=>1000,24380=>1000,24381=>1000,24382=>1000,24383=>1000,24384=>1000,24385=>1000,24386=>1000,24387=>1000,24388=>1000, + 24389=>1000,24390=>1000,24391=>1000,24392=>1000,24393=>1000,24394=>1000,24395=>1000,24396=>1000,24397=>1000,24398=>1000,24399=>1000,24400=>1000,24401=>1000,24402=>1000,24403=>1000,24404=>1000, + 24405=>1000,24406=>1000,24407=>1000,24408=>1000,24409=>1000,24410=>1000,24411=>1000,24412=>1000,24413=>1000,24414=>1000,24415=>1000,24416=>1000,24417=>1000,24418=>1000,24419=>1000,24420=>1000, + 24421=>1000,24422=>1000,24423=>1000,24424=>1000,24425=>1000,24426=>1000,24427=>1000,24428=>1000,24429=>1000,24430=>1000,24431=>1000,24432=>1000,24433=>1000,24434=>1000,24435=>1000,24436=>1000, + 24437=>1000,24438=>1000,24439=>1000,24440=>1000,24441=>1000,24442=>1000,24443=>1000,24444=>1000,24445=>1000,24446=>1000,24447=>1000,24448=>1000,24449=>1000,24450=>1000,24451=>1000,24452=>1000, + 24453=>1000,24454=>1000,24455=>1000,24456=>1000,24457=>1000,24458=>1000,24459=>1000,24460=>1000,24461=>1000,24462=>1000,24463=>1000,24464=>1000,24465=>1000,24466=>1000,24467=>1000,24468=>1000, + 24469=>1000,24470=>1000,24471=>1000,24472=>1000,24473=>1000,24474=>1000,24475=>1000,24476=>1000,24477=>1000,24478=>1000,24479=>1000,24480=>1000,24481=>1000,24482=>1000,24483=>1000,24484=>1000, + 24485=>1000,24486=>1000,24487=>1000,24488=>1000,24489=>1000,24490=>1000,24491=>1000,24492=>1000,24493=>1000,24494=>1000,24495=>1000,24496=>1000,24497=>1000,24498=>1000,24499=>1000,24500=>1000, + 24501=>1000,24502=>1000,24503=>1000,24504=>1000,24505=>1000,24506=>1000,24507=>1000,24508=>1000,24509=>1000,24510=>1000,24511=>1000,24512=>1000,24513=>1000,24514=>1000,24515=>1000,24516=>1000, + 24517=>1000,24518=>1000,24519=>1000,24520=>1000,24521=>1000,24522=>1000,24523=>1000,24524=>1000,24525=>1000,24526=>1000,24527=>1000,24528=>1000,24529=>1000,24530=>1000,24531=>1000,24532=>1000, + 24533=>1000,24534=>1000,24535=>1000,24536=>1000,24537=>1000,24538=>1000,24539=>1000,24540=>1000,24541=>1000,24542=>1000,24543=>1000,24544=>1000,24545=>1000,24546=>1000,24547=>1000,24548=>1000, + 24549=>1000,24550=>1000,24551=>1000,24552=>1000,24553=>1000,24554=>1000,24555=>1000,24556=>1000,24557=>1000,24558=>1000,24559=>1000,24560=>1000,24561=>1000,24562=>1000,24563=>1000,24564=>1000, + 24565=>1000,24566=>1000,24567=>1000,24568=>1000,24569=>1000,24570=>1000,24571=>1000,24572=>1000,24573=>1000,24574=>1000,24575=>1000,24576=>1000,24577=>1000,24578=>1000,24579=>1000,24580=>1000, + 24581=>1000,24582=>1000,24583=>1000,24584=>1000,24585=>1000,24586=>1000,24587=>1000,24588=>1000,24589=>1000,24590=>1000,24591=>1000,24592=>1000,24593=>1000,24594=>1000,24595=>1000,24596=>1000, + 24597=>1000,24598=>1000,24599=>1000,24600=>1000,24601=>1000,24602=>1000,24603=>1000,24604=>1000,24605=>1000,24606=>1000,24607=>1000,24608=>1000,24609=>1000,24610=>1000,24611=>1000,24612=>1000, + 24613=>1000,24614=>1000,24615=>1000,24616=>1000,24617=>1000,24618=>1000,24619=>1000,24620=>1000,24621=>1000,24622=>1000,24623=>1000,24624=>1000,24625=>1000,24626=>1000,24627=>1000,24628=>1000, + 24629=>1000,24630=>1000,24631=>1000,24632=>1000,24633=>1000,24634=>1000,24635=>1000,24636=>1000,24637=>1000,24638=>1000,24639=>1000,24640=>1000,24641=>1000,24642=>1000,24643=>1000,24644=>1000, + 24645=>1000,24646=>1000,24647=>1000,24648=>1000,24649=>1000,24650=>1000,24651=>1000,24652=>1000,24653=>1000,24654=>1000,24655=>1000,24656=>1000,24657=>1000,24658=>1000,24659=>1000,24660=>1000, + 24661=>1000,24662=>1000,24663=>1000,24664=>1000,24665=>1000,24666=>1000,24667=>1000,24668=>1000,24669=>1000,24670=>1000,24671=>1000,24672=>1000,24673=>1000,24674=>1000,24675=>1000,24676=>1000, + 24677=>1000,24678=>1000,24679=>1000,24680=>1000,24681=>1000,24682=>1000,24683=>1000,24684=>1000,24685=>1000,24686=>1000,24687=>1000,24688=>1000,24689=>1000,24690=>1000,24691=>1000,24692=>1000, + 24693=>1000,24694=>1000,24695=>1000,24696=>1000,24697=>1000,24698=>1000,24699=>1000,24700=>1000,24701=>1000,24702=>1000,24703=>1000,24704=>1000,24705=>1000,24706=>1000,24707=>1000,24708=>1000, + 24709=>1000,24710=>1000,24711=>1000,24712=>1000,24713=>1000,24714=>1000,24715=>1000,24716=>1000,24717=>1000,24718=>1000,24719=>1000,24720=>1000,24721=>1000,24722=>1000,24723=>1000,24724=>1000, + 24725=>1000,24726=>1000,24727=>1000,24728=>1000,24729=>1000,24730=>1000,24731=>1000,24732=>1000,24733=>1000,24734=>1000,24735=>1000,24736=>1000,24737=>1000,24738=>1000,24739=>1000,24740=>1000, + 24741=>1000,24742=>1000,24743=>1000,24744=>1000,24745=>1000,24746=>1000,24747=>1000,24748=>1000,24749=>1000,24750=>1000,24751=>1000,24752=>1000,24753=>1000,24754=>1000,24755=>1000,24756=>1000, + 24757=>1000,24758=>1000,24759=>1000,24760=>1000,24761=>1000,24762=>1000,24763=>1000,24764=>1000,24765=>1000,24766=>1000,24767=>1000,24768=>1000,24769=>1000,24770=>1000,24771=>1000,24772=>1000, + 24773=>1000,24774=>1000,24775=>1000,24776=>1000,24777=>1000,24778=>1000,24779=>1000,24780=>1000,24781=>1000,24782=>1000,24783=>1000,24784=>1000,24785=>1000,24786=>1000,24787=>1000,24788=>1000, + 24789=>1000,24790=>1000,24791=>1000,24792=>1000,24793=>1000,24794=>1000,24795=>1000,24796=>1000,24797=>1000,24798=>1000,24799=>1000,24800=>1000,24801=>1000,24802=>1000,24803=>1000,24804=>1000, + 24805=>1000,24806=>1000,24807=>1000,24808=>1000,24809=>1000,24810=>1000,24811=>1000,24812=>1000,24813=>1000,24814=>1000,24815=>1000,24816=>1000,24817=>1000,24818=>1000,24819=>1000,24820=>1000, + 24821=>1000,24822=>1000,24823=>1000,24824=>1000,24825=>1000,24826=>1000,24827=>1000,24828=>1000,24829=>1000,24830=>1000,24831=>1000,24832=>1000,24833=>1000,24834=>1000,24835=>1000,24836=>1000, + 24837=>1000,24838=>1000,24839=>1000,24840=>1000,24841=>1000,24842=>1000,24843=>1000,24844=>1000,24845=>1000,24846=>1000,24847=>1000,24848=>1000,24849=>1000,24850=>1000,24851=>1000,24852=>1000, + 24853=>1000,24854=>1000,24855=>1000,24856=>1000,24857=>1000,24858=>1000,24859=>1000,24860=>1000,24861=>1000,24862=>1000,24863=>1000,24864=>1000,24865=>1000,24866=>1000,24867=>1000,24868=>1000, + 24869=>1000,24870=>1000,24871=>1000,24872=>1000,24873=>1000,24874=>1000,24875=>1000,24876=>1000,24877=>1000,24878=>1000,24879=>1000,24880=>1000,24881=>1000,24882=>1000,24883=>1000,24884=>1000, + 24885=>1000,24886=>1000,24887=>1000,24888=>1000,24889=>1000,24890=>1000,24891=>1000,24892=>1000,24893=>1000,24894=>1000,24895=>1000,24896=>1000,24897=>1000,24898=>1000,24899=>1000,24900=>1000, + 24901=>1000,24902=>1000,24903=>1000,24904=>1000,24905=>1000,24906=>1000,24907=>1000,24908=>1000,24909=>1000,24910=>1000,24911=>1000,24912=>1000,24913=>1000,24914=>1000,24915=>1000,24916=>1000, + 24917=>1000,24918=>1000,24919=>1000,24920=>1000,24921=>1000,24922=>1000,24923=>1000,24924=>1000,24925=>1000,24926=>1000,24927=>1000,24928=>1000,24929=>1000,24930=>1000,24931=>1000,24932=>1000, + 24933=>1000,24934=>1000,24935=>1000,24936=>1000,24937=>1000,24938=>1000,24939=>1000,24940=>1000,24941=>1000,24942=>1000,24943=>1000,24944=>1000,24945=>1000,24946=>1000,24947=>1000,24948=>1000, + 24949=>1000,24950=>1000,24951=>1000,24952=>1000,24953=>1000,24954=>1000,24955=>1000,24956=>1000,24957=>1000,24958=>1000,24959=>1000,24960=>1000,24961=>1001,24962=>1000,24963=>1000,24964=>1000, + 24965=>1000,24966=>1000,24967=>1000,24968=>1000,24969=>1000,24970=>1000,24971=>1000,24972=>1000,24973=>1000,24974=>1000,24975=>1000,24976=>1000,24977=>1000,24978=>1000,24979=>1000,24980=>1000, + 24981=>1000,24982=>1000,24983=>1000,24984=>1000,24985=>1000,24986=>1000,24987=>1000,24988=>1000,24989=>1000,24990=>1000,24991=>1000,24992=>1000,24993=>1000,24994=>1000,24995=>1000,24996=>1000, + 24997=>1000,24998=>1000,24999=>1000,25000=>1000,25001=>1000,25002=>1000,25003=>1000,25004=>1000,25005=>1000,25006=>1000,25007=>1000,25008=>1000,25009=>1000,25010=>1000,25011=>1000,25012=>1000, + 25013=>1000,25014=>1000,25015=>1000,25016=>1000,25017=>1000,25018=>1000,25019=>1000,25020=>1000,25021=>1000,25022=>1000,25023=>1000,25024=>1000,25025=>1000,25026=>1000,25027=>1000,25028=>1000, + 25029=>1000,25030=>1000,25031=>1000,25032=>1000,25033=>1000,25034=>1000,25035=>1000,25036=>1000,25037=>1000,25038=>1000,25039=>1000,25040=>1000,25041=>1000,25042=>1000,25043=>1000,25044=>1000, + 25045=>1000,25046=>1000,25047=>1000,25048=>1000,25049=>1000,25050=>1000,25051=>1000,25052=>1000,25053=>1000,25054=>1000,25055=>1000,25056=>1000,25057=>1000,25058=>1000,25059=>1000,25060=>1000, + 25061=>1000,25062=>1000,25063=>1000,25064=>1000,25065=>1000,25066=>1000,25067=>1000,25068=>1000,25069=>1000,25070=>1000,25071=>1000,25072=>1000,25073=>1000,25074=>1000,25075=>1000,25076=>1000, + 25077=>1000,25078=>1000,25079=>1000,25080=>1000,25081=>1000,25082=>1000,25083=>1000,25084=>1000,25085=>1000,25086=>1000,25087=>1000,25088=>1000,25089=>1000,25090=>1000,25091=>1000,25092=>1000, + 25093=>1000,25094=>1000,25095=>1000,25096=>1000,25097=>1000,25098=>1000,25099=>1000,25100=>1000,25101=>1000,25102=>1000,25103=>1000,25104=>1000,25105=>1000,25106=>1000,25107=>1000,25108=>1000, + 25109=>1000,25110=>1000,25111=>1000,25112=>1000,25113=>1000,25114=>1000,25115=>1000,25116=>1000,25117=>1000,25118=>1000,25119=>1000,25120=>1000,25121=>1000,25122=>1000,25123=>1000,25124=>1000, + 25125=>1000,25126=>1000,25127=>1000,25128=>1000,25129=>1000,25130=>1000,25131=>1000,25132=>1000,25133=>1000,25134=>1000,25135=>1000,25136=>1000,25137=>1000,25138=>1000,25139=>1000,25140=>1000, + 25141=>1000,25142=>1000,25143=>1000,25144=>1000,25145=>1000,25146=>1000,25147=>1000,25148=>1000,25149=>1000,25150=>1000,25151=>1000,25152=>1000,25153=>1000,25154=>1000,25155=>1000,25156=>1000, + 25157=>1000,25158=>1000,25159=>1000,25160=>1000,25161=>1000,25162=>1000,25163=>1000,25164=>1000,25165=>1000,25166=>1000,25167=>1000,25168=>1000,25169=>1000,25170=>1000,25171=>1000,25172=>1000, + 25173=>1000,25174=>1000,25175=>1000,25176=>1000,25177=>1000,25178=>1000,25179=>1000,25180=>1000,25181=>1000,25182=>1000,25183=>1000,25184=>1000,25185=>1000,25186=>1000,25187=>1000,25188=>1000, + 25189=>1000,25190=>1000,25191=>1000,25192=>1000,25193=>1000,25194=>1000,25195=>1000,25196=>1000,25197=>1000,25198=>1000,25199=>1000,25200=>1000,25201=>1000,25202=>1000,25203=>1000,25204=>1000, + 25205=>1000,25206=>1000,25207=>1000,25208=>1000,25209=>1000,25210=>1000,25211=>1000,25212=>1000,25213=>1000,25214=>1000,25215=>1000,25216=>1000,25217=>1000,25218=>1000,25219=>1000,25220=>1000, + 25221=>1000,25222=>1000,25223=>1000,25224=>1000,25225=>1000,25226=>1000,25227=>1000,25228=>1000,25229=>1000,25230=>1000,25231=>1000,25232=>1000,25233=>1000,25234=>1000,25235=>1000,25236=>1000, + 25237=>1000,25238=>1000,25239=>1000,25240=>1000,25241=>1000,25242=>1000,25243=>1000,25244=>1000,25245=>1000,25246=>1000,25247=>1000,25248=>1000,25249=>1000,25250=>1000,25251=>1000,25252=>1000, + 25253=>1000,25254=>1000,25255=>1000,25256=>1000,25257=>1000,25258=>1000,25259=>1000,25260=>1000,25261=>1000,25262=>1000,25263=>1000,25264=>1000,25265=>1000,25266=>1000,25267=>1000,25268=>1000, + 25269=>1000,25270=>1000,25271=>1000,25272=>1000,25273=>1000,25274=>1000,25275=>1000,25276=>1000,25277=>1000,25278=>1000,25279=>1000,25280=>1000,25281=>1000,25282=>1000,25283=>1000,25284=>1000, + 25285=>1000,25286=>1000,25287=>1000,25288=>1000,25289=>1000,25290=>1000,25291=>1000,25292=>1000,25293=>1000,25294=>1000,25295=>1000,25296=>1000,25297=>1000,25298=>1000,25299=>1000,25300=>1000, + 25301=>1000,25302=>1000,25303=>1000,25304=>1000,25305=>1000,25306=>1000,25307=>1000,25308=>1000,25309=>1000,25310=>1000,25311=>1000,25312=>1000,25313=>1000,25314=>1000,25315=>1000,25316=>1000, + 25317=>1000,25318=>1000,25319=>1000,25320=>1000,25321=>1000,25322=>1000,25323=>1000,25324=>1000,25325=>1000,25326=>1000,25327=>1000,25328=>1000,25329=>1000,25330=>1000,25331=>1000,25332=>1000, + 25333=>1000,25334=>1000,25335=>1000,25336=>1000,25337=>1000,25338=>1000,25339=>1000,25340=>1000,25341=>1000,25342=>1000,25343=>1000,25344=>1000,25345=>1000,25346=>1000,25347=>1000,25348=>1000, + 25349=>1000,25350=>1000,25351=>1000,25352=>1000,25353=>1000,25354=>1000,25355=>1000,25356=>1000,25357=>1000,25358=>1000,25359=>1000,25360=>1000,25361=>1000,25362=>1000,25363=>1000,25364=>1000, + 25365=>1000,25366=>1000,25367=>1000,25368=>1000,25369=>1000,25370=>1000,25371=>1000,25372=>1000,25373=>1000,25374=>1000,25375=>1000,25376=>1000,25377=>1000,25378=>1000,25379=>1000,25380=>1000, + 25381=>1000,25382=>1000,25383=>1000,25384=>1000,25385=>1000,25386=>1000,25387=>1000,25388=>1000,25389=>1000,25390=>1000,25391=>1000,25392=>1000,25393=>1000,25394=>1000,25395=>1000,25396=>1000, + 25397=>1000,25398=>1000,25399=>1000,25400=>1000,25401=>1000,25402=>1000,25403=>1000,25404=>1000,25405=>1000,25406=>1000,25407=>1000,25408=>1000,25409=>1000,25410=>1000,25411=>1000,25412=>1000, + 25413=>1000,25414=>1000,25415=>1000,25416=>1000,25417=>1000,25418=>1000,25419=>1000,25420=>1000,25421=>1000,25422=>1000,25423=>1000,25424=>1000,25425=>1000,25426=>1000,25427=>1000,25428=>1000, + 25429=>1000,25430=>1000,25431=>1000,25432=>1000,25433=>1000,25434=>1000,25435=>1000,25436=>1000,25437=>1000,25438=>1000,25439=>1000,25440=>1000,25441=>1000,25442=>1000,25443=>1000,25444=>1000, + 25445=>1000,25446=>1000,25447=>1000,25448=>1000,25449=>1000,25450=>1000,25451=>1000,25452=>1000,25453=>1000,25454=>1000,25455=>1000,25456=>1000,25457=>1000,25458=>1000,25459=>1000,25460=>1000, + 25461=>1000,25462=>1000,25463=>1000,25464=>1000,25465=>1000,25466=>1000,25467=>1000,25468=>1000,25469=>1000,25470=>1000,25471=>1000,25472=>1000,25473=>1000,25474=>1000,25475=>1000,25476=>1000, + 25477=>1000,25478=>1000,25479=>1000,25480=>1000,25481=>1000,25482=>1000,25483=>1000,25484=>1000,25485=>1000,25486=>1000,25487=>1000,25488=>1000,25489=>1000,25490=>1000,25491=>1000,25492=>1000, + 25493=>1000,25494=>1000,25495=>1000,25496=>1000,25497=>1000,25498=>1000,25499=>1000,25500=>1000,25501=>1000,25502=>1000,25503=>1000,25504=>1000,25505=>1000,25506=>1000,25507=>1000,25508=>1000, + 25509=>1000,25510=>1000,25511=>1000,25512=>1000,25513=>1000,25514=>1000,25515=>1000,25516=>1000,25517=>1000,25518=>1000,25519=>1000,25520=>1000,25521=>1000,25522=>1000,25523=>1000,25524=>1000, + 25525=>1000,25526=>1000,25527=>1000,25528=>1000,25529=>1000,25530=>1000,25531=>1000,25532=>1000,25533=>1000,25534=>1000,25535=>1000,25536=>1000,25537=>1000,25538=>1000,25539=>1000,25540=>1000, + 25541=>1000,25542=>1000,25543=>1000,25544=>1000,25545=>1000,25546=>1000,25547=>1000,25548=>1000,25549=>1000,25550=>1000,25551=>1000,25552=>1000,25553=>1000,25554=>1000,25555=>1000,25556=>1000, + 25557=>1000,25558=>1000,25559=>1000,25560=>1000,25561=>1000,25562=>1000,25563=>1000,25564=>1000,25565=>1000,25566=>1000,25567=>1000,25568=>1000,25569=>1000,25570=>1000,25571=>1000,25572=>1000, + 25573=>1000,25574=>1000,25575=>1000,25576=>1000,25577=>1000,25578=>1000,25579=>1000,25580=>1000,25581=>1000,25582=>1000,25583=>1000,25584=>1000,25585=>1000,25586=>1000,25587=>1000,25588=>1000, + 25589=>1000,25590=>1000,25591=>1000,25592=>1000,25593=>1000,25594=>1000,25595=>1000,25596=>1000,25597=>1000,25598=>1000,25599=>1000,25600=>1000,25601=>1000,25602=>1000,25603=>1000,25604=>1000, + 25605=>1000,25606=>1000,25607=>1000,25608=>1000,25609=>1000,25610=>1000,25611=>1000,25612=>1000,25613=>1000,25614=>1000,25615=>1000,25616=>1000,25617=>1000,25618=>1000,25619=>1000,25620=>1000, + 25621=>1000,25622=>1000,25623=>1000,25624=>1000,25625=>1000,25626=>1000,25627=>1000,25628=>1000,25629=>1000,25630=>1000,25631=>1000,25632=>1000,25633=>1000,25634=>1000,25635=>1000,25636=>1000, + 25637=>1000,25638=>1000,25639=>1000,25640=>1000,25641=>1000,25642=>1000,25643=>1000,25644=>1000,25645=>1000,25646=>1000,25647=>1000,25648=>1000,25649=>1000,25650=>1000,25651=>1000,25652=>1000, + 25653=>1000,25654=>1000,25655=>1000,25656=>1000,25657=>1000,25658=>1000,25659=>1000,25660=>1000,25661=>1000,25662=>1000,25663=>1000,25664=>1000,25665=>1000,25666=>1000,25667=>1000,25668=>1000, + 25669=>1000,25670=>1000,25671=>1000,25672=>1000,25673=>1000,25674=>1000,25675=>1000,25676=>1000,25677=>1000,25678=>1000,25679=>1000,25680=>1000,25681=>1000,25682=>1000,25683=>1000,25684=>1000, + 25685=>1000,25686=>1000,25687=>1000,25688=>1000,25689=>1000,25690=>1000,25691=>1000,25692=>1000,25693=>1000,25694=>1000,25695=>1000,25696=>1000,25697=>1000,25698=>1000,25699=>1000,25700=>1000, + 25701=>1000,25702=>1000,25703=>1000,25704=>1000,25705=>1000,25706=>1000,25707=>1000,25708=>1000,25709=>1000,25710=>1000,25711=>1000,25712=>1000,25713=>1000,25714=>1000,25715=>1000,25716=>1000, + 25717=>1000,25718=>1000,25719=>1000,25720=>1000,25721=>1000,25722=>1000,25723=>1000,25724=>1000,25725=>1000,25726=>1000,25727=>1000,25728=>1000,25729=>1000,25730=>1000,25731=>1000,25732=>1000, + 25733=>1000,25734=>1000,25735=>1000,25736=>1000,25737=>1000,25738=>1000,25739=>1000,25740=>1000,25741=>1000,25742=>1000,25743=>1000,25744=>1000,25745=>1000,25746=>1000,25747=>1000,25748=>1000, + 25749=>1000,25750=>1000,25751=>1000,25752=>1000,25753=>1000,25754=>1000,25755=>1000,25756=>1000,25757=>1000,25758=>1000,25759=>1000,25760=>1000,25761=>1000,25762=>1000,25763=>1000,25764=>1000, + 25765=>1000,25766=>1000,25767=>1000,25768=>1000,25769=>1000,25770=>1000,25771=>1000,25772=>1000,25773=>1000,25774=>1000,25775=>1000,25776=>1000,25777=>1000,25778=>1000,25779=>1000,25780=>1000, + 25781=>1000,25782=>1000,25783=>1000,25784=>1000,25785=>1000,25786=>1000,25787=>1000,25788=>1000,25789=>1000,25790=>1000,25791=>1000,25792=>1000,25793=>1000,25794=>1000,25795=>1000,25796=>1000, + 25797=>1000,25798=>1000,25799=>1000,25800=>1000,25801=>1000,25802=>1000,25803=>1000,25804=>1000,25805=>1000,25806=>1000,25807=>1000,25808=>1000,25809=>1000,25810=>1000,25811=>1000,25812=>1000, + 25813=>1000,25814=>1000,25815=>1000,25816=>1000,25817=>1000,25818=>1000,25819=>1000,25820=>1000,25821=>1000,25822=>1000,25823=>1000,25824=>1000,25825=>1000,25826=>1000,25827=>1000,25828=>1000, + 25829=>1000,25830=>1000,25831=>1000,25832=>1000,25833=>1000,25834=>1000,25835=>1000,25836=>1000,25837=>1000,25838=>1000,25839=>1000,25840=>1000,25841=>1000,25842=>1000,25843=>1000,25844=>1000, + 25845=>1000,25846=>1000,25847=>1000,25848=>1000,25849=>1000,25850=>1000,25851=>1000,25852=>1000,25853=>1000,25854=>1000,25855=>1000,25856=>1000,25857=>1000,25858=>1000,25859=>1000,25860=>1000, + 25861=>1000,25862=>1000,25863=>1000,25864=>1000,25865=>1000,25866=>1000,25867=>1000,25868=>1000,25869=>1000,25870=>1000,25871=>1000,25872=>1000,25873=>1000,25874=>1000,25875=>1000,25876=>1000, + 25877=>1000,25878=>1000,25879=>1000,25880=>1000,25881=>1000,25882=>1000,25883=>1000,25884=>1000,25885=>1000,25886=>1000,25887=>1000,25888=>1000,25889=>1000,25890=>1000,25891=>1000,25892=>1000, + 25893=>1000,25894=>1000,25895=>1000,25896=>1000,25897=>1000,25898=>1000,25899=>1000,25900=>1000,25901=>1000,25902=>1000,25903=>1000,25904=>1000,25905=>1000,25906=>1000,25907=>1000,25908=>1000, + 25909=>1000,25910=>1000,25911=>1000,25912=>1000,25913=>1000,25914=>1000,25915=>1000,25916=>1000,25917=>1000,25918=>1000,25919=>1000,25920=>1000,25921=>1000,25922=>1000,25923=>1000,25924=>1000, + 25925=>1000,25926=>1000,25927=>1000,25928=>1000,25929=>1000,25930=>1000,25931=>1000,25932=>1000,25933=>1000,25934=>1000,25935=>1000,25936=>1000,25937=>1000,25938=>1000,25939=>1000,25940=>1000, + 25941=>1000,25942=>1000,25943=>1000,25944=>1000,25945=>1000,25946=>1000,25947=>1000,25948=>1000,25949=>1000,25950=>1000,25951=>1000,25952=>1000,25953=>1000,25954=>1000,25955=>1000,25956=>1000, + 25957=>1000,25958=>1000,25959=>1000,25960=>1000,25961=>1000,25962=>1000,25963=>1000,25964=>1000,25965=>1000,25966=>1000,25967=>1000,25968=>1000,25969=>1000,25970=>1000,25971=>1000,25972=>1000, + 25973=>1000,25974=>1000,25975=>1000,25976=>1000,25977=>1000,25978=>1000,25979=>1000,25980=>1000,25981=>1000,25982=>1000,25983=>1000,25984=>1000,25985=>1000,25986=>1000,25987=>1000,25988=>1000, + 25989=>1000,25990=>1000,25991=>1000,25992=>1000,25993=>1000,25994=>1000,25995=>1000,25996=>1000,25997=>1000,25998=>1000,25999=>1000,26000=>1000,26001=>1000,26002=>1000,26003=>1000,26004=>1000, + 26005=>1000,26006=>1000,26007=>1000,26008=>1000,26009=>1000,26010=>1000,26011=>1000,26012=>1000,26013=>1000,26014=>1000,26015=>1000,26016=>1000,26017=>1000,26018=>1000,26019=>1000,26020=>1000, + 26021=>1000,26022=>1000,26023=>1000,26024=>1000,26025=>1000,26026=>1000,26027=>1000,26028=>1000,26029=>1000,26030=>1000,26031=>1000,26032=>1000,26033=>1000,26034=>1000,26035=>1000,26036=>1000, + 26037=>1000,26038=>1000,26039=>1000,26040=>1000,26041=>1000,26042=>1000,26043=>1000,26044=>1000,26045=>1000,26046=>1000,26047=>1000,26048=>1000,26049=>1000,26050=>1000,26051=>1000,26052=>1000, + 26053=>1000,26054=>1000,26055=>1000,26056=>1000,26057=>1000,26058=>1000,26059=>1000,26060=>1000,26061=>1000,26062=>1000,26063=>1000,26064=>1000,26065=>1000,26066=>1000,26067=>1000,26068=>1000, + 26069=>1000,26070=>1000,26071=>1000,26072=>1000,26073=>1000,26074=>1000,26075=>1000,26076=>1000,26077=>1000,26078=>1000,26079=>1000,26080=>1000,26081=>1000,26082=>1000,26083=>1000,26084=>1000, + 26085=>1000,26086=>1000,26087=>1000,26088=>1000,26089=>1000,26090=>1000,26091=>1000,26092=>1000,26093=>1000,26094=>1000,26095=>1000,26096=>1000,26097=>1000,26098=>1000,26099=>1000,26100=>1000, + 26101=>1000,26102=>1000,26103=>1000,26104=>1000,26105=>1000,26106=>1000,26107=>1000,26108=>1000,26109=>1000,26110=>1000,26111=>1000,26112=>1000,26113=>1000,26114=>1000,26115=>1000,26116=>1000, + 26117=>1000,26118=>1000,26119=>1000,26120=>1000,26121=>1000,26122=>1000,26123=>1000,26124=>1000,26125=>1000,26126=>1000,26127=>1000,26128=>1000,26129=>1000,26130=>1000,26131=>1000,26132=>1000, + 26133=>1000,26134=>1000,26135=>1000,26136=>1000,26137=>1000,26138=>1000,26139=>1000,26140=>1000,26141=>1000,26142=>1000,26143=>1000,26144=>1000,26145=>1000,26146=>1000,26147=>1000,26148=>1000, + 26149=>1000,26150=>1000,26151=>1000,26152=>1000,26153=>1000,26154=>1000,26155=>1000,26156=>1000,26157=>1000,26158=>1000,26159=>1000,26160=>1000,26161=>1000,26162=>1000,26163=>1000,26164=>1000, + 26165=>1000,26166=>1000,26167=>1000,26168=>1000,26169=>1000,26170=>1000,26171=>1000,26172=>1000,26173=>1000,26174=>1000,26175=>1000,26176=>1000,26177=>1000,26178=>1000,26179=>1000,26180=>1000, + 26181=>1000,26182=>1000,26183=>1000,26184=>1000,26185=>1000,26186=>1000,26187=>1000,26188=>1000,26189=>1000,26190=>1000,26191=>1000,26192=>1000,26193=>1000,26194=>1000,26195=>1000,26196=>1000, + 26197=>1000,26198=>1000,26199=>1000,26200=>1000,26201=>1000,26202=>1000,26203=>1000,26204=>1000,26205=>1000,26206=>1000,26207=>1000,26208=>1000,26209=>1000,26210=>1000,26211=>1000,26212=>1000, + 26213=>1000,26214=>1000,26215=>1000,26216=>1000,26217=>1000,26218=>1000,26219=>1000,26220=>1000,26221=>1000,26222=>1000,26223=>1000,26224=>1000,26225=>1000,26226=>1000,26227=>1000,26228=>1000, + 26229=>1000,26230=>1000,26231=>1000,26232=>1000,26233=>1000,26234=>1000,26235=>1000,26236=>1000,26237=>1000,26238=>1000,26239=>1000,26240=>1000,26241=>1000,26242=>1000,26243=>1000,26244=>1000, + 26245=>1000,26246=>1000,26247=>1000,26248=>1000,26249=>1000,26250=>1000,26251=>1000,26252=>1000,26253=>1000,26254=>1000,26255=>1000,26256=>1000,26257=>1000,26258=>1000,26259=>1000,26260=>1000, + 26261=>1000,26262=>1000,26263=>1000,26264=>1000,26265=>1000,26266=>1000,26267=>1000,26268=>1000,26269=>1000,26270=>1000,26271=>1000,26272=>1000,26273=>1000,26274=>1000,26275=>1000,26276=>1000, + 26277=>1000,26278=>1000,26279=>1000,26280=>1000,26281=>1000,26282=>1000,26283=>1000,26284=>1000,26285=>1000,26286=>1000,26287=>1000,26288=>1000,26289=>1000,26290=>1000,26291=>1000,26292=>1000, + 26293=>1000,26294=>1000,26295=>1000,26296=>1000,26297=>1000,26298=>1000,26299=>1000,26300=>1000,26301=>1000,26302=>1000,26303=>1000,26304=>1000,26305=>1000,26306=>1000,26307=>1000,26308=>1000, + 26309=>1000,26310=>1000,26311=>1000,26312=>1000,26313=>1000,26314=>1000,26315=>1000,26316=>1000,26317=>1000,26318=>1000,26319=>1000,26320=>1000,26321=>1000,26322=>1000,26323=>1000,26324=>1000, + 26325=>1000,26326=>1000,26327=>1000,26328=>1000,26329=>1000,26330=>1000,26331=>1000,26332=>1000,26333=>1000,26334=>1000,26335=>1000,26336=>1000,26337=>1000,26338=>1000,26339=>1000,26340=>1000, + 26341=>1000,26342=>1000,26343=>1000,26344=>1000,26345=>1000,26346=>1000,26347=>1000,26348=>1000,26349=>1000,26350=>1000,26351=>1000,26352=>1000,26353=>1000,26354=>1000,26355=>1000,26356=>1000, + 26357=>1000,26358=>1000,26359=>1000,26360=>1000,26361=>1000,26362=>1000,26363=>1000,26364=>1000,26365=>1000,26366=>1000,26367=>1000,26368=>1000,26369=>1000,26370=>1000,26371=>1000,26372=>1000, + 26373=>1000,26374=>1000,26375=>1000,26376=>1000,26377=>1000,26378=>1000,26379=>1000,26380=>1000,26381=>1000,26382=>1000,26383=>1000,26384=>1000,26385=>1000,26386=>1000,26387=>1000,26388=>1000, + 26389=>1000,26390=>1000,26391=>1000,26392=>1000,26393=>1000,26394=>1000,26395=>1000,26396=>1000,26397=>1000,26398=>1000,26399=>1000,26400=>1000,26401=>1000,26402=>1000,26403=>1000,26404=>1000, + 26405=>1000,26406=>1000,26407=>1000,26408=>1000,26409=>1000,26410=>1000,26411=>1000,26412=>1000,26413=>1000,26414=>1000,26415=>1000,26416=>1000,26417=>1000,26418=>1000,26419=>1000,26420=>1000, + 26421=>1000,26422=>1000,26423=>1000,26424=>1000,26425=>1000,26426=>1000,26427=>1000,26428=>1000,26429=>1000,26430=>1000,26431=>1000,26432=>1000,26433=>1000,26434=>1000,26435=>1000,26436=>1000, + 26437=>1000,26438=>1000,26439=>1000,26440=>1000,26441=>1000,26442=>1000,26443=>1000,26444=>1000,26445=>1000,26446=>1000,26447=>1000,26448=>1000,26449=>1000,26450=>1000,26451=>1000,26452=>1000, + 26453=>1000,26454=>1000,26455=>1000,26456=>1000,26457=>1000,26458=>1000,26459=>1000,26460=>1000,26461=>1000,26462=>1000,26463=>1000,26464=>1000,26465=>1000,26466=>1000,26467=>1000,26468=>1000, + 26469=>1000,26470=>1000,26471=>1000,26472=>1000,26473=>1000,26474=>1000,26475=>1000,26476=>1000,26477=>1000,26478=>1000,26479=>1000,26480=>1000,26481=>1000,26482=>1000,26483=>1000,26484=>1000, + 26485=>1000,26486=>1000,26487=>1000,26488=>1000,26489=>1000,26490=>1000,26491=>1000,26492=>1000,26493=>1000,26494=>1000,26495=>1000,26496=>1000,26497=>1000,26498=>1000,26499=>1000,26500=>1000, + 26501=>1000,26502=>1000,26503=>1000,26504=>1000,26505=>1000,26506=>1000,26507=>1000,26508=>1000,26509=>1000,26510=>1000,26511=>1000,26512=>1000,26513=>1000,26514=>1000,26515=>1000,26516=>1000, + 26517=>1000,26518=>1000,26519=>1000,26520=>1000,26521=>1000,26522=>1000,26523=>1000,26524=>1000,26525=>1000,26526=>1000,26527=>1000,26528=>1000,26529=>1000,26530=>1000,26531=>1000,26532=>1000, + 26533=>1000,26534=>1000,26535=>1000,26536=>1000,26537=>1000,26538=>1000,26539=>1000,26540=>1000,26541=>1000,26542=>1000,26543=>1000,26544=>1000,26545=>1000,26546=>1000,26547=>1000,26548=>1000, + 26549=>1000,26550=>1000,26551=>1000,26552=>1000,26553=>1000,26554=>1000,26555=>1000,26556=>1000,26557=>1000,26558=>1000,26559=>1000,26560=>1000,26561=>1000,26562=>1000,26563=>1000,26564=>1000, + 26565=>1000,26566=>1000,26567=>1000,26568=>1000,26569=>1000,26570=>1000,26571=>1000,26572=>1000,26573=>1000,26574=>1000,26575=>1000,26576=>1000,26577=>1000,26578=>1000,26579=>1000,26580=>1000, + 26581=>1000,26582=>1000,26583=>1000,26584=>1000,26585=>1000,26586=>1000,26587=>1000,26588=>1000,26589=>1000,26590=>1000,26591=>1000,26592=>1000,26593=>1000,26594=>1000,26595=>1000,26596=>1000, + 26597=>1000,26598=>1000,26599=>1000,26600=>1000,26601=>1000,26602=>1000,26603=>1000,26604=>1000,26605=>1000,26606=>1000,26607=>1000,26608=>1000,26609=>1000,26610=>1000,26611=>1000,26612=>1000, + 26613=>1000,26614=>1000,26615=>1000,26616=>1000,26617=>1000,26618=>1000,26619=>1000,26620=>1000,26621=>1000,26622=>1000,26623=>1000,26624=>1000,26625=>1000,26626=>1000,26627=>1000,26628=>1000, + 26629=>1000,26630=>1000,26631=>1000,26632=>1000,26633=>1000,26634=>1000,26635=>1000,26636=>1000,26637=>1000,26638=>1000,26639=>1000,26640=>1000,26641=>1000,26642=>1000,26643=>1000,26644=>1000, + 26645=>1000,26646=>1000,26647=>1000,26648=>1000,26649=>1000,26650=>1000,26651=>1000,26652=>1000,26653=>1000,26654=>1000,26655=>1000,26656=>1000,26657=>1000,26658=>1000,26659=>1000,26660=>1000, + 26661=>1000,26662=>1000,26663=>1000,26664=>1000,26665=>1000,26666=>1000,26667=>1000,26668=>1000,26669=>1000,26670=>1000,26671=>1000,26672=>1000,26673=>1000,26674=>1000,26675=>1000,26676=>1000, + 26677=>1000,26678=>1000,26679=>1000,26680=>1000,26681=>1000,26682=>1000,26683=>1000,26684=>1000,26685=>1000,26686=>1000,26687=>1000,26688=>1000,26689=>1000,26690=>1000,26691=>1000,26692=>1000, + 26693=>1000,26694=>1000,26695=>1000,26696=>1000,26697=>1000,26698=>1000,26699=>1000,26700=>1000,26701=>1000,26702=>1000,26703=>1000,26704=>1000,26705=>1000,26706=>1000,26707=>1000,26708=>1000, + 26709=>1000,26710=>1000,26711=>1000,26712=>1000,26713=>1000,26714=>1000,26715=>1000,26716=>1000,26717=>1000,26718=>1000,26719=>1000,26720=>1000,26721=>1000,26722=>1000,26723=>1000,26724=>1000, + 26725=>1000,26726=>1000,26727=>1000,26728=>1000,26729=>1000,26730=>1000,26731=>1000,26732=>1000,26733=>1000,26734=>1000,26735=>1000,26736=>1000,26737=>1000,26738=>1000,26739=>1000,26740=>1000, + 26741=>1000,26742=>1000,26743=>1000,26744=>1000,26745=>1000,26746=>1000,26747=>1000,26748=>1000,26749=>1000,26750=>1000,26751=>1000,26752=>1000,26753=>1000,26754=>1000,26755=>1000,26756=>1000, + 26757=>1000,26758=>1000,26759=>1000,26760=>1000,26761=>1000,26762=>1000,26763=>1000,26764=>1000,26765=>1000,26766=>1000,26767=>1000,26768=>1000,26769=>1000,26770=>1000,26771=>1000,26772=>1000, + 26773=>1000,26774=>1000,26775=>1000,26776=>1000,26777=>1000,26778=>1000,26779=>1000,26780=>1000,26781=>1000,26782=>1000,26783=>1000,26784=>1000,26785=>1000,26786=>1000,26787=>1000,26788=>1000, + 26789=>1000,26790=>1000,26791=>1000,26792=>1000,26793=>1000,26794=>1000,26795=>1000,26796=>1000,26797=>1000,26798=>1000,26799=>1000,26800=>1000,26801=>1000,26802=>1000,26803=>1000,26804=>1000, + 26805=>1000,26806=>1000,26807=>1000,26808=>1000,26809=>1000,26810=>1000,26811=>1000,26812=>1000,26813=>1000,26814=>1000,26815=>1000,26816=>1000,26817=>1000,26818=>1000,26819=>1000,26820=>1000, + 26821=>1000,26822=>1000,26823=>1000,26824=>1000,26825=>1000,26826=>1000,26827=>1000,26828=>1000,26829=>1000,26830=>1000,26831=>1000,26832=>1000,26833=>1000,26834=>1000,26835=>1000,26836=>1000, + 26837=>1000,26838=>1000,26839=>1000,26840=>1000,26841=>1000,26842=>1000,26843=>1000,26844=>1000,26845=>1000,26846=>1000,26847=>1000,26848=>1000,26849=>1000,26850=>1000,26851=>1000,26852=>1000, + 26853=>1000,26854=>1000,26855=>1000,26856=>1000,26857=>1000,26858=>1000,26859=>1000,26860=>1000,26861=>1000,26862=>1000,26863=>1000,26864=>1000,26865=>1000,26866=>1000,26867=>1000,26868=>1000, + 26869=>1000,26870=>1000,26871=>1000,26872=>1000,26873=>1000,26874=>1000,26875=>1000,26876=>1000,26877=>1000,26878=>1000,26879=>1000,26880=>1000,26881=>1000,26882=>1000,26883=>1000,26884=>1000, + 26885=>1000,26886=>1000,26887=>1000,26888=>1000,26889=>1000,26890=>1000,26891=>1000,26892=>1000,26893=>1000,26894=>1000,26895=>1000,26896=>1000,26897=>1000,26898=>1000,26899=>1000,26900=>1000, + 26901=>1000,26902=>1000,26903=>1000,26904=>1000,26905=>1000,26906=>1000,26907=>1000,26908=>1000,26909=>1000,26910=>1000,26911=>1000,26912=>1000,26913=>1000,26914=>1000,26915=>1000,26916=>1000, + 26917=>1000,26918=>1000,26919=>1000,26920=>1000,26921=>1000,26922=>1000,26923=>1000,26924=>1000,26925=>1000,26926=>1000,26927=>1000,26928=>1000,26929=>1000,26930=>1000,26931=>1000,26932=>1000, + 26933=>1000,26934=>1000,26935=>1000,26936=>1000,26937=>1000,26938=>1000,26939=>1000,26940=>1000,26941=>1000,26942=>1000,26943=>1000,26944=>1000,26945=>1000,26946=>1000,26947=>1000,26948=>1000, + 26949=>1000,26950=>1000,26951=>1000,26952=>1000,26953=>1000,26954=>1000,26955=>1000,26956=>1000,26957=>1000,26958=>1000,26959=>1000,26960=>1000,26961=>1000,26962=>1000,26963=>1000,26964=>1000, + 26965=>1000,26966=>1000,26967=>1000,26968=>1000,26969=>1000,26970=>1000,26971=>1000,26972=>1000,26973=>1000,26974=>1000,26975=>1000,26976=>1000,26977=>1000,26978=>1000,26979=>1000,26980=>1000, + 26981=>1000,26982=>1000,26983=>1000,26984=>1000,26985=>1000,26986=>1000,26987=>1000,26988=>1000,26989=>1000,26990=>1000,26991=>1000,26992=>1000,26993=>1000,26994=>1000,26995=>1000,26996=>1000, + 26997=>1000,26998=>1000,26999=>1000,27000=>1000,27001=>1000,27002=>1000,27003=>1000,27004=>1000,27005=>1000,27006=>1000,27007=>1000,27008=>1000,27009=>1000,27010=>1000,27011=>1000,27012=>1000, + 27013=>1000,27014=>1000,27015=>1000,27016=>1000,27017=>1000,27018=>1000,27019=>1000,27020=>1000,27021=>1000,27022=>1000,27023=>1000,27024=>1000,27025=>1000,27026=>1000,27027=>1000,27028=>1000, + 27029=>1000,27030=>1000,27031=>1000,27032=>1000,27033=>1000,27034=>1000,27035=>1000,27036=>1000,27037=>1000,27038=>1000,27039=>1000,27040=>1000,27041=>1000,27042=>1000,27043=>1000,27044=>1000, + 27045=>1000,27046=>1000,27047=>1000,27048=>1000,27049=>1000,27050=>1000,27051=>1000,27052=>1000,27053=>1000,27054=>1000,27055=>1000,27056=>1000,27057=>1000,27058=>1000,27059=>1000,27060=>1000, + 27061=>1000,27062=>1000,27063=>1000,27064=>1000,27065=>1000,27066=>1000,27067=>1000,27068=>1000,27069=>1000,27070=>1000,27071=>1000,27072=>1000,27073=>1000,27074=>1000,27075=>1000,27076=>1000, + 27077=>1000,27078=>1000,27079=>1000,27080=>1000,27081=>1000,27082=>1000,27083=>1000,27084=>1000,27085=>1000,27086=>1000,27087=>1000,27088=>1000,27089=>1000,27090=>1000,27091=>1000,27092=>1000, + 27093=>1000,27094=>1000,27095=>1000,27096=>1000,27097=>1000,27098=>1000,27099=>1000,27100=>1000,27101=>1000,27102=>1000,27103=>1000,27104=>1000,27105=>1000,27106=>1000,27107=>1000,27108=>1000, + 27109=>1000,27110=>1000,27111=>1000,27112=>1000,27113=>1000,27114=>1000,27115=>1000,27116=>1000,27117=>1000,27118=>1000,27119=>1000,27120=>1000,27121=>1000,27122=>1000,27123=>1000,27124=>1000, + 27125=>1000,27126=>1000,27127=>1000,27128=>1000,27129=>1000,27130=>1000,27131=>1000,27132=>1000,27133=>1000,27134=>1000,27135=>1000,27136=>1000,27137=>1000,27138=>1000,27139=>1000,27140=>1000, + 27141=>1000,27142=>1000,27143=>1000,27144=>1000,27145=>1000,27146=>1000,27147=>1000,27148=>1000,27149=>1000,27150=>1000,27151=>1000,27152=>1000,27153=>1000,27154=>1000,27155=>1000,27156=>1000, + 27157=>1000,27158=>1000,27159=>1000,27160=>1000,27161=>1000,27162=>1000,27163=>1000,27164=>1000,27165=>1000,27166=>1000,27167=>1000,27168=>1000,27169=>1000,27170=>1000,27171=>1000,27172=>1000, + 27173=>1000,27174=>1000,27175=>1000,27176=>1000,27177=>1000,27178=>1000,27179=>1000,27180=>1000,27181=>1000,27182=>1000,27183=>1000,27184=>1000,27185=>1000,27186=>1000,27187=>1000,27188=>1000, + 27189=>1000,27190=>1000,27191=>1000,27192=>1000,27193=>1000,27194=>1000,27195=>1000,27196=>1000,27197=>1000,27198=>1000,27199=>1000,27200=>1000,27201=>1000,27202=>1000,27203=>1000,27204=>1000, + 27205=>1000,27206=>1000,27207=>1000,27208=>1000,27209=>1000,27210=>1000,27211=>1000,27212=>1000,27213=>1000,27214=>1000,27215=>1000,27216=>1000,27217=>1000,27218=>1000,27219=>1000,27220=>1000, + 27221=>1000,27222=>1000,27223=>1000,27224=>1000,27225=>1000,27226=>1000,27227=>1000,27228=>1000,27229=>1000,27230=>1000,27231=>1000,27232=>1000,27233=>1000,27234=>1000,27235=>1000,27236=>1000, + 27237=>1000,27238=>1000,27239=>1000,27240=>1000,27241=>1000,27242=>1000,27243=>1000,27244=>1000,27245=>1000,27246=>1000,27247=>1000,27248=>1000,27249=>1000,27250=>1000,27251=>1000,27252=>1000, + 27253=>1000,27254=>1000,27255=>1000,27256=>1000,27257=>1000,27258=>1000,27259=>1000,27260=>1000,27261=>1000,27262=>1000,27263=>1000,27264=>1000,27265=>1000,27266=>1000,27267=>1000,27268=>1000, + 27269=>1000,27270=>1000,27271=>1000,27272=>1000,27273=>1000,27274=>1000,27275=>1000,27276=>1000,27277=>1000,27278=>1000,27279=>1000,27280=>1000,27281=>1000,27282=>1000,27283=>1000,27284=>1000, + 27285=>1000,27286=>1000,27287=>1000,27288=>1000,27289=>1000,27290=>1000,27291=>1000,27292=>1000,27293=>1000,27294=>1000,27295=>1000,27296=>1000,27297=>1000,27298=>1000,27299=>1000,27300=>1000, + 27301=>1000,27302=>1000,27303=>1000,27304=>1000,27305=>1000,27306=>1000,27307=>1000,27308=>1000,27309=>1000,27310=>1000,27311=>1000,27312=>1000,27313=>1000,27314=>1000,27315=>1000,27316=>1000, + 27317=>1000,27318=>1000,27319=>1000,27320=>1000,27321=>1000,27322=>1000,27323=>1000,27324=>1000,27325=>1000,27326=>1000,27327=>1000,27328=>1000,27329=>1000,27330=>1000,27331=>1000,27332=>1000, + 27333=>1000,27334=>1000,27335=>1000,27336=>1000,27337=>1000,27338=>1000,27339=>1000,27340=>1000,27341=>1000,27342=>1000,27343=>1000,27344=>1000,27345=>1000,27346=>1000,27347=>1000,27348=>1000, + 27349=>1000,27350=>1000,27351=>1000,27352=>1000,27353=>1000,27354=>1000,27355=>1000,27356=>1000,27357=>1000,27358=>1000,27359=>1000,27360=>1000,27361=>1000,27362=>1000,27363=>1000,27364=>1000, + 27365=>1000,27366=>1000,27367=>1000,27368=>1000,27369=>1000,27370=>1000,27371=>1000,27372=>1000,27373=>1000,27374=>1000,27375=>1000,27376=>1000,27377=>1000,27378=>1000,27379=>1000,27380=>1000, + 27381=>1000,27382=>1000,27383=>1000,27384=>1000,27385=>1000,27386=>1000,27387=>1000,27388=>1000,27389=>1000,27390=>1000,27391=>1000,27392=>1000,27393=>1000,27394=>1000,27395=>1000,27396=>1000, + 27397=>1000,27398=>1000,27399=>1000,27400=>1000,27401=>1000,27402=>1000,27403=>1000,27404=>1000,27405=>1000,27406=>1000,27407=>1000,27408=>1000,27409=>1000,27410=>1000,27411=>1000,27412=>1000, + 27413=>1000,27414=>1000,27415=>1000,27416=>1000,27417=>1000,27418=>1000,27419=>1000,27420=>1000,27421=>1000,27422=>1000,27423=>1000,27424=>1000,27425=>1000,27426=>1000,27427=>1000,27428=>1000, + 27429=>1000,27430=>1000,27431=>1000,27432=>1000,27433=>1000,27434=>1000,27435=>1000,27436=>1000,27437=>1000,27438=>1000,27439=>1000,27440=>1000,27441=>1000,27442=>1000,27443=>1000,27444=>1000, + 27445=>1000,27446=>1000,27447=>1000,27448=>1000,27449=>1000,27450=>1000,27451=>1000,27452=>1000,27453=>1000,27454=>1000,27455=>1000,27456=>1000,27457=>1000,27458=>1000,27459=>1000,27460=>1000, + 27461=>1000,27462=>1000,27463=>1000,27464=>1000,27465=>1000,27466=>1000,27467=>1000,27468=>1000,27469=>1000,27470=>1000,27471=>1000,27472=>1000,27473=>1000,27474=>1000,27475=>1000,27476=>1000, + 27477=>1000,27478=>1000,27479=>1000,27480=>1000,27481=>1000,27482=>1000,27483=>1000,27484=>1000,27485=>1000,27486=>1000,27487=>1000,27488=>1000,27489=>1000,27490=>1000,27491=>1000,27492=>1000, + 27493=>1000,27494=>1000,27495=>1000,27496=>1000,27497=>1000,27498=>1000,27499=>1000,27500=>1000,27501=>1000,27502=>1000,27503=>1000,27504=>1000,27505=>1000,27506=>1000,27507=>1000,27508=>1000, + 27509=>1000,27510=>1000,27511=>1000,27512=>1000,27513=>1000,27514=>1000,27515=>1000,27516=>1000,27517=>1000,27518=>1000,27519=>1000,27520=>1000,27521=>1000,27522=>1000,27523=>1000,27524=>1000, + 27525=>1000,27526=>1000,27527=>1000,27528=>1000,27529=>1000,27530=>1000,27531=>1000,27532=>1000,27533=>1000,27534=>1000,27535=>1000,27536=>1000,27537=>1000,27538=>1000,27539=>1000,27540=>1000, + 27541=>1000,27542=>1000,27543=>1000,27544=>1000,27545=>1000,27546=>1000,27547=>1000,27548=>1000,27549=>1000,27550=>1000,27551=>1000,27552=>1000,27553=>1000,27554=>1000,27555=>1000,27556=>1000, + 27557=>1000,27558=>1000,27559=>1000,27560=>1000,27561=>1000,27562=>1000,27563=>1000,27564=>1000,27565=>1000,27566=>1000,27567=>1000,27568=>1000,27569=>1000,27570=>1000,27571=>1000,27572=>1000, + 27573=>1000,27574=>1000,27575=>1000,27576=>1000,27577=>1000,27578=>1000,27579=>1000,27580=>1000,27581=>1000,27582=>1000,27583=>1000,27584=>1000,27585=>1000,27586=>1000,27587=>1000,27588=>1000, + 27589=>1000,27590=>1000,27591=>1000,27592=>1000,27593=>1000,27594=>1000,27595=>1000,27596=>1000,27597=>1000,27598=>1000,27599=>1000,27600=>1000,27601=>1000,27602=>1000,27603=>1000,27604=>1000, + 27605=>1000,27606=>1000,27607=>1000,27608=>1000,27609=>1000,27610=>1000,27611=>1000,27612=>1000,27613=>1000,27614=>1000,27615=>1000,27616=>1000,27617=>1000,27618=>1000,27619=>1000,27620=>1000, + 27621=>1000,27622=>1000,27623=>1000,27624=>1000,27625=>1000,27626=>1000,27627=>1000,27628=>1000,27629=>1000,27630=>1000,27631=>1000,27632=>1000,27633=>1000,27634=>1000,27635=>1000,27636=>1000, + 27637=>1000,27638=>1000,27639=>1000,27640=>1000,27641=>1000,27642=>1000,27643=>1000,27644=>1000,27645=>1000,27646=>1000,27647=>1000,27648=>1000,27649=>1000,27650=>1000,27651=>1000,27652=>1000, + 27653=>1000,27654=>1000,27655=>1000,27656=>1000,27657=>1000,27658=>1000,27659=>1000,27660=>1000,27661=>1000,27662=>1000,27663=>1000,27664=>1000,27665=>1000,27666=>1000,27667=>1000,27668=>1000, + 27669=>1000,27670=>1000,27671=>1000,27672=>1000,27673=>1000,27674=>1000,27675=>1000,27676=>1000,27677=>1000,27678=>1000,27679=>1000,27680=>1000,27681=>1000,27682=>1000,27683=>1000,27684=>1000, + 27685=>1000,27686=>1000,27687=>1000,27688=>1000,27689=>1000,27690=>1000,27691=>1000,27692=>1000,27693=>1000,27694=>1000,27695=>1000,27696=>1000,27697=>1000,27698=>1000,27699=>1000,27700=>1000, + 27701=>1000,27702=>1000,27703=>1000,27704=>1000,27705=>1000,27706=>1000,27707=>1000,27708=>1000,27709=>1000,27710=>1000,27711=>1000,27712=>1000,27713=>1000,27714=>1000,27715=>1000,27716=>1000, + 27717=>1000,27718=>1000,27719=>1000,27720=>1000,27721=>1000,27722=>1000,27723=>1000,27724=>1000,27725=>1000,27726=>1000,27727=>1000,27728=>1000,27729=>1000,27730=>1000,27731=>1000,27732=>1000, + 27733=>1000,27734=>1000,27735=>1000,27736=>1000,27737=>1000,27738=>1000,27739=>1000,27740=>1000,27741=>1000,27742=>1000,27743=>1000,27744=>1000,27745=>1000,27746=>1000,27747=>1000,27748=>1000, + 27749=>1000,27750=>1000,27751=>1000,27752=>1000,27753=>1000,27754=>1000,27755=>1000,27756=>1000,27757=>1000,27758=>1000,27759=>1000,27760=>1000,27761=>1000,27762=>1000,27763=>1000,27764=>1000, + 27765=>1000,27766=>1000,27767=>1000,27768=>1000,27769=>1000,27770=>1000,27771=>1000,27772=>1000,27773=>1000,27774=>1000,27775=>1000,27776=>1000,27777=>1000,27778=>1000,27779=>1000,27780=>1000, + 27781=>1000,27782=>1000,27783=>1000,27784=>1000,27785=>1000,27786=>1000,27787=>1000,27788=>1000,27789=>1000,27790=>1000,27791=>1000,27792=>1000,27793=>1000,27794=>1000,27795=>1000,27796=>1000, + 27797=>1000,27798=>1000,27799=>1000,27800=>1000,27801=>1000,27802=>1000,27803=>1000,27804=>1000,27805=>1000,27806=>1000,27807=>1000,27808=>1000,27809=>1000,27810=>1000,27811=>1000,27812=>1000, + 27813=>1000,27814=>1000,27815=>1000,27816=>1000,27817=>1000,27818=>1000,27819=>1000,27820=>1000,27821=>1000,27822=>1000,27823=>1000,27824=>1000,27825=>1000,27826=>1000,27827=>1000,27828=>1000, + 27829=>1000,27830=>1000,27831=>1000,27832=>1000,27833=>1000,27834=>1000,27835=>1000,27836=>1000,27837=>1000,27838=>1000,27839=>1000,27840=>1000,27841=>1000,27842=>1000,27843=>1000,27844=>1000, + 27845=>1000,27846=>1000,27847=>1000,27848=>1000,27849=>1000,27850=>1000,27851=>1000,27852=>1000,27853=>1000,27854=>1000,27855=>1000,27856=>1000,27857=>1000,27858=>1000,27859=>1000,27860=>1000, + 27861=>1000,27862=>1000,27863=>1000,27864=>1000,27865=>1000,27866=>1000,27867=>1000,27868=>1000,27869=>1000,27870=>1000,27871=>1000,27872=>1000,27873=>1000,27874=>1000,27875=>1000,27876=>1000, + 27877=>1000,27878=>1000,27879=>1000,27880=>1000,27881=>1000,27882=>1000,27883=>1000,27884=>1000,27885=>1000,27886=>1000,27887=>1000,27888=>1000,27889=>1000,27890=>1000,27891=>1000,27892=>1000, + 27893=>1000,27894=>1000,27895=>1000,27896=>1000,27897=>1000,27898=>1000,27899=>1000,27900=>1000,27901=>1000,27902=>1000,27903=>1000,27904=>1000,27905=>1000,27906=>1000,27907=>1000,27908=>1000, + 27909=>1000,27910=>1000,27911=>1000,27912=>1000,27913=>1000,27914=>1000,27915=>1000,27916=>1000,27917=>1000,27918=>1000,27919=>1000,27920=>1000,27921=>1000,27922=>1000,27923=>1000,27924=>1000, + 27925=>1000,27926=>1000,27927=>1000,27928=>1000,27929=>1000,27930=>1000,27931=>1000,27932=>1000,27933=>1000,27934=>1000,27935=>1000,27936=>1000,27937=>1000,27938=>1000,27939=>1000,27940=>1000, + 27941=>1000,27942=>1000,27943=>1000,27944=>1000,27945=>1000,27946=>1000,27947=>1000,27948=>1000,27949=>1000,27950=>1000,27951=>1000,27952=>1000,27953=>1000,27954=>1000,27955=>1000,27956=>1000, + 27957=>1000,27958=>1000,27959=>1000,27960=>1000,27961=>1000,27962=>1000,27963=>1000,27964=>1000,27965=>1000,27966=>1000,27967=>1000,27968=>1000,27969=>1000,27970=>1000,27971=>1000,27972=>1000, + 27973=>1000,27974=>1000,27975=>1000,27976=>1000,27977=>1000,27978=>1000,27979=>1000,27980=>1000,27981=>1000,27982=>1000,27983=>1000,27984=>1000,27985=>1000,27986=>1000,27987=>1000,27988=>1000, + 27989=>1000,27990=>1000,27991=>1000,27992=>1000,27993=>1000,27994=>1000,27995=>1000,27996=>1000,27997=>1000,27998=>1000,27999=>1000,28000=>1000,28001=>1000,28002=>1000,28003=>1000,28004=>1000, + 28005=>1000,28006=>1000,28007=>1000,28008=>1000,28009=>1000,28010=>1000,28011=>1000,28012=>1000,28013=>1000,28014=>1000,28015=>1000,28016=>1000,28017=>1000,28018=>1000,28019=>1000,28020=>1000, + 28021=>1000,28022=>1000,28023=>1000,28024=>1000,28025=>1000,28026=>1000,28027=>1000,28028=>1000,28029=>1000,28030=>1000,28031=>1000,28032=>1000,28033=>1000,28034=>1000,28035=>1000,28036=>1000, + 28037=>1000,28038=>1000,28039=>1000,28040=>1000,28041=>1000,28042=>1000,28043=>1000,28044=>1000,28045=>1000,28046=>1000,28047=>1000,28048=>1000,28049=>1000,28050=>1000,28051=>1000,28052=>1000, + 28053=>1000,28054=>1000,28055=>1000,28056=>1000,28057=>1000,28058=>1000,28059=>1000,28060=>1000,28061=>1000,28062=>1000,28063=>1000,28064=>1000,28065=>1000,28066=>1000,28067=>1000,28068=>1000, + 28069=>1000,28070=>1000,28071=>1000,28072=>1000,28073=>1000,28074=>1000,28075=>1000,28076=>1000,28077=>1000,28078=>1000,28079=>1000,28080=>1000,28081=>1000,28082=>1000,28083=>1000,28084=>1000, + 28085=>1000,28086=>1000,28087=>1000,28088=>1000,28089=>1000,28090=>1000,28091=>1000,28092=>1000,28093=>1000,28094=>1000,28095=>1000,28096=>1000,28097=>1000,28098=>1000,28099=>1000,28100=>1000, + 28101=>1000,28102=>1000,28103=>1000,28104=>1000,28105=>1000,28106=>1000,28107=>1000,28108=>1000,28109=>1000,28110=>1000,28111=>1000,28112=>1000,28113=>1000,28114=>1000,28115=>1000,28116=>1000, + 28117=>1000,28118=>1000,28119=>1000,28120=>1000,28121=>1000,28122=>1000,28123=>1000,28124=>1000,28125=>1000,28126=>1000,28127=>1000,28128=>1000,28129=>1000,28130=>1000,28131=>1000,28132=>1000, + 28133=>1000,28134=>1000,28135=>1000,28136=>1000,28137=>1000,28138=>1000,28139=>1000,28140=>1000,28141=>1000,28142=>1000,28143=>1000,28144=>1000,28145=>1000,28146=>1000,28147=>1000,28148=>1000, + 28149=>1000,28150=>1000,28151=>1000,28152=>1000,28153=>1000,28154=>1000,28155=>1000,28156=>1000,28157=>1000,28158=>1000,28159=>1000,28160=>1000,28161=>1000,28162=>1000,28163=>1000,28164=>1000, + 28165=>1000,28166=>1000,28167=>1000,28168=>1000,28169=>1000,28170=>1000,28171=>1000,28172=>1000,28173=>1000,28174=>1000,28175=>1000,28176=>1000,28177=>1000,28178=>1000,28179=>1000,28180=>1000, + 28181=>1000,28182=>1000,28183=>1000,28184=>1000,28185=>1000,28186=>1000,28187=>1000,28188=>1000,28189=>1000,28190=>1000,28191=>1000,28192=>1000,28193=>1000,28194=>1000,28195=>1000,28196=>1000, + 28197=>1000,28198=>1000,28199=>1000,28200=>1000,28201=>1000,28202=>1000,28203=>1000,28204=>1000,28205=>1000,28206=>1000,28207=>1000,28208=>1000,28209=>1000,28210=>1000,28211=>1000,28212=>1000, + 28213=>1000,28214=>1000,28215=>1000,28216=>1000,28217=>1000,28218=>1000,28219=>1000,28220=>1000,28221=>1000,28222=>1000,28223=>1000,28224=>1000,28225=>1000,28226=>1000,28227=>1000,28228=>1000, + 28229=>1000,28230=>1000,28231=>1000,28232=>1000,28233=>1000,28234=>1000,28235=>1000,28236=>1000,28237=>1000,28238=>1000,28239=>1000,28240=>1000,28241=>1000,28242=>1000,28243=>1000,28244=>1000, + 28245=>1000,28246=>1000,28247=>1000,28248=>1000,28249=>1000,28250=>1000,28251=>1000,28252=>1000,28253=>1000,28254=>1000,28255=>1000,28256=>1000,28257=>1000,28258=>1000,28259=>1000,28260=>1000, + 28261=>1000,28262=>1000,28263=>1000,28264=>1000,28265=>1000,28266=>1000,28267=>1000,28268=>1000,28269=>1000,28270=>1000,28271=>1000,28272=>1000,28273=>1000,28274=>1000,28275=>1000,28276=>1000, + 28277=>1000,28278=>1000,28279=>1000,28280=>1000,28281=>1000,28282=>1000,28283=>1000,28284=>1000,28285=>1000,28286=>1000,28287=>1000,28288=>1000,28289=>1000,28290=>1000,28291=>1000,28292=>1000, + 28293=>1000,28294=>1000,28295=>1000,28296=>1000,28297=>1000,28298=>1000,28299=>1000,28300=>1000,28301=>1000,28302=>1000,28303=>1000,28304=>1000,28305=>1000,28306=>1000,28307=>1000,28308=>1000, + 28309=>1000,28310=>1000,28311=>1000,28312=>1000,28313=>1000,28314=>1000,28315=>1000,28316=>1000,28317=>1000,28318=>1000,28319=>1000,28320=>1000,28321=>1000,28322=>1000,28323=>1000,28324=>1000, + 28325=>1000,28326=>1000,28327=>1000,28328=>1000,28329=>1000,28330=>1000,28331=>1000,28332=>1000,28333=>1000,28334=>1000,28335=>1000,28336=>1000,28337=>1000,28338=>1000,28339=>1000,28340=>1000, + 28341=>1000,28342=>1000,28343=>1000,28344=>1000,28345=>1000,28346=>1000,28347=>1000,28348=>1000,28349=>1000,28350=>1000,28351=>1000,28352=>1000,28353=>1000,28354=>1000,28355=>1000,28356=>1000, + 28357=>1000,28358=>1000,28359=>1000,28360=>1000,28361=>1000,28362=>1000,28363=>1000,28364=>1000,28365=>1000,28366=>1000,28367=>1000,28368=>1000,28369=>1000,28370=>1000,28371=>1000,28372=>1000, + 28373=>1000,28374=>1000,28375=>1000,28376=>1000,28377=>1000,28378=>1000,28379=>1000,28380=>1000,28381=>1000,28382=>1000,28383=>1000,28384=>1000,28385=>1000,28386=>1000,28387=>1000,28388=>1000, + 28389=>1000,28390=>1000,28391=>1000,28392=>1000,28393=>1000,28394=>1000,28395=>1000,28396=>1000,28397=>1000,28398=>1000,28399=>1000,28400=>1000,28401=>1000,28402=>1000,28403=>1000,28404=>1000, + 28405=>1000,28406=>1000,28407=>1000,28408=>1000,28409=>1000,28410=>1000,28411=>1000,28412=>1000,28413=>1000,28414=>1000,28415=>1000,28416=>1000,28417=>1000,28418=>1000,28419=>1000,28420=>1000, + 28421=>1000,28422=>1000,28423=>1000,28424=>1000,28425=>1000,28426=>1000,28427=>1000,28428=>1000,28429=>1000,28430=>1000,28431=>1000,28432=>1000,28433=>1000,28434=>1000,28435=>1000,28436=>1000, + 28437=>1000,28438=>1000,28439=>1000,28440=>1000,28441=>1000,28442=>1000,28443=>1000,28444=>1000,28445=>1000,28446=>1000,28447=>1000,28448=>1000,28449=>1000,28450=>1000,28451=>1000,28452=>1000, + 28453=>1000,28454=>1000,28455=>1000,28456=>1000,28457=>1000,28458=>1000,28459=>1000,28460=>1000,28461=>1000,28462=>1000,28463=>1000,28464=>1000,28465=>1000,28466=>1000,28467=>1000,28468=>1000, + 28469=>1000,28470=>1000,28471=>1000,28472=>1000,28473=>1000,28474=>1000,28475=>1000,28476=>1000,28477=>1000,28478=>1000,28479=>1000,28480=>1000,28481=>1000,28482=>1000,28483=>1000,28484=>1000, + 28485=>1000,28486=>1000,28487=>1000,28488=>1000,28489=>1000,28490=>1000,28491=>1000,28492=>1000,28493=>1000,28494=>1000,28495=>1000,28496=>1000,28497=>1000,28498=>1000,28499=>1000,28500=>1000, + 28501=>1000,28502=>1000,28503=>1000,28504=>1000,28505=>1000,28506=>1000,28507=>1000,28508=>1000,28509=>1000,28510=>1000,28511=>1000,28512=>1000,28513=>1000,28514=>1000,28515=>1000,28516=>1000, + 28517=>1000,28518=>1000,28519=>1000,28520=>1000,28521=>1000,28522=>1000,28523=>1000,28524=>1000,28525=>1000,28526=>1000,28527=>1000,28528=>1000,28529=>1000,28530=>1000,28531=>1000,28532=>1000, + 28533=>1000,28534=>1000,28535=>1000,28536=>1000,28537=>1000,28538=>1000,28539=>1000,28540=>1000,28541=>1000,28542=>1000,28543=>1000,28544=>1000,28545=>1000,28546=>1000,28547=>1000,28548=>1000, + 28549=>1000,28550=>1000,28551=>1000,28552=>1000,28553=>1000,28554=>1000,28555=>1000,28556=>1000,28557=>1000,28558=>1000,28559=>1000,28560=>1000,28561=>1000,28562=>1000,28563=>1000,28564=>1000, + 28565=>1000,28566=>1000,28567=>1000,28568=>1000,28569=>1000,28570=>1000,28571=>1000,28572=>1000,28573=>1000,28574=>1000,28575=>1000,28576=>1000,28577=>1000,28578=>1000,28579=>1000,28580=>1000, + 28581=>1000,28582=>1000,28583=>1000,28584=>1000,28585=>1000,28586=>1000,28587=>1000,28588=>1000,28589=>1000,28590=>1000,28591=>1000,28592=>1000,28593=>1000,28594=>1000,28595=>1000,28596=>1000, + 28597=>1000,28598=>1000,28599=>1000,28600=>1000,28601=>1000,28602=>1000,28603=>1000,28604=>1000,28605=>1000,28606=>1000,28607=>1000,28608=>1000,28609=>1000,28610=>1000,28611=>1000,28612=>1000, + 28613=>1000,28614=>1000,28615=>1000,28616=>1000,28617=>1000,28618=>1000,28619=>1000,28620=>1000,28621=>1000,28622=>1000,28623=>1000,28624=>1000,28625=>1000,28626=>1000,28627=>1000,28628=>1000, + 28629=>1000,28630=>1000,28631=>1000,28632=>1000,28633=>1000,28634=>1000,28635=>1000,28636=>1000,28637=>1000,28638=>1000,28639=>1000,28640=>1000,28641=>1000,28642=>1000,28643=>1000,28644=>1000, + 28645=>1000,28646=>1000,28647=>1000,28648=>1000,28649=>1000,28650=>1000,28651=>1000,28652=>1000,28653=>1000,28654=>1000,28655=>1000,28656=>1000,28657=>1000,28658=>1000,28659=>1000,28660=>1000, + 28661=>1000,28662=>1000,28663=>1000,28664=>1000,28665=>1000,28666=>1000,28667=>1000,28668=>1000,28669=>1000,28670=>1000,28671=>1000,28672=>1000,28673=>1000,28674=>1000,28675=>1000,28676=>1000, + 28677=>1000,28678=>1000,28679=>1000,28680=>1000,28681=>1000,28682=>1000,28683=>1000,28684=>1000,28685=>1000,28686=>1000,28687=>1000,28688=>1000,28689=>1000,28690=>1000,28691=>1000,28692=>1000, + 28693=>1000,28694=>1000,28695=>1000,28696=>1000,28697=>1000,28698=>1000,28699=>1000,28700=>1000,28701=>1000,28702=>1000,28703=>1000,28704=>1000,28705=>1000,28706=>1000,28707=>1000,28708=>1000, + 28709=>1000,28710=>1000,28711=>1000,28712=>1000,28713=>1000,28714=>1000,28715=>1000,28716=>1000,28717=>1000,28718=>1000,28719=>1000,28720=>1000,28721=>1000,28722=>1000,28723=>1000,28724=>1000, + 28725=>1000,28726=>1000,28727=>1000,28728=>1000,28729=>1000,28730=>1000,28731=>1000,28732=>1000,28733=>1000,28734=>1000,28735=>1000,28736=>1000,28737=>1000,28738=>1000,28739=>1000,28740=>1000, + 28741=>1000,28742=>1000,28743=>1000,28744=>1000,28745=>1000,28746=>1000,28747=>1000,28748=>1000,28749=>1000,28750=>1000,28751=>1000,28752=>1000,28753=>1000,28754=>1000,28755=>1000,28756=>1000, + 28757=>1000,28758=>1000,28759=>1000,28760=>1000,28761=>1000,28762=>1000,28763=>1000,28764=>1000,28765=>1000,28766=>1000,28767=>1000,28768=>1000,28769=>1000,28770=>1000,28771=>1000,28772=>1000, + 28773=>1000,28774=>1000,28775=>1000,28776=>1000,28777=>1000,28778=>1000,28779=>1000,28780=>1000,28781=>1000,28782=>1000,28783=>1000,28784=>1000,28785=>1000,28786=>1000,28787=>1000,28788=>1000, + 28789=>1000,28790=>1000,28791=>1000,28792=>1000,28793=>1000,28794=>1000,28795=>1000,28796=>1000,28797=>1000,28798=>1000,28799=>1000,28800=>1000,28801=>1000,28802=>1000,28803=>1000,28804=>1000, + 28805=>1000,28806=>1000,28807=>1000,28808=>1000,28809=>1000,28810=>1000,28811=>1000,28812=>1000,28813=>1000,28814=>1000,28815=>1000,28816=>1000,28817=>1000,28818=>1000,28819=>1000,28820=>1000, + 28821=>1000,28822=>1000,28823=>1000,28824=>1000,28825=>1000,28826=>1000,28827=>1000,28828=>1000,28829=>1000,28830=>1000,28831=>1000,28832=>1000,28833=>1000,28834=>1000,28835=>1000,28836=>1000, + 28837=>1000,28838=>1000,28839=>1000,28840=>1000,28841=>1000,28842=>1000,28843=>1000,28844=>1000,28845=>1000,28846=>1000,28847=>1000,28848=>1000,28849=>1000,28850=>1000,28851=>1000,28852=>1000, + 28853=>1000,28854=>1000,28855=>1000,28856=>1000,28857=>1000,28858=>1000,28859=>1000,28860=>1000,28861=>1000,28862=>1000,28863=>1000,28864=>1000,28865=>1000,28866=>1000,28867=>1000,28868=>1000, + 28869=>1000,28870=>1000,28871=>1000,28872=>1000,28873=>1000,28874=>1000,28875=>1000,28876=>1000,28877=>1000,28878=>1000,28879=>1000,28880=>1000,28881=>1000,28882=>1000,28883=>1000,28884=>1000, + 28885=>1000,28886=>1000,28887=>1000,28888=>1000,28889=>1000,28890=>1000,28891=>1000,28892=>1000,28893=>1000,28894=>1000,28895=>1000,28896=>1000,28897=>1000,28898=>1000,28899=>1000,28900=>1000, + 28901=>1000,28902=>1000,28903=>1000,28904=>1000,28905=>1000,28906=>1000,28907=>1000,28908=>1000,28909=>1000,28910=>1000,28911=>1000,28912=>1000,28913=>1000,28914=>1000,28915=>1000,28916=>1000, + 28917=>1000,28918=>1000,28919=>1000,28920=>1000,28921=>1000,28922=>1000,28923=>1000,28924=>1000,28925=>1000,28926=>1000,28927=>1000,28928=>1000,28929=>1000,28930=>1000,28931=>1000,28932=>1000, + 28933=>1000,28934=>1000,28935=>1000,28936=>1000,28937=>1000,28938=>1000,28939=>1000,28940=>1000,28941=>1000,28942=>1000,28943=>1000,28944=>1000,28945=>1000,28946=>1000,28947=>1000,28948=>1000, + 28949=>1000,28950=>1000,28951=>1000,28952=>1000,28953=>1000,28954=>1000,28955=>1000,28956=>1000,28957=>1000,28958=>1000,28959=>1000,28960=>1000,28961=>1000,28962=>1000,28963=>1000,28964=>1000, + 28965=>1000,28966=>1000,28967=>1000,28968=>1000,28969=>1000,28970=>1000,28971=>1000,28972=>1000,28973=>1000,28974=>1000,28975=>1000,28976=>1000,28977=>1000,28978=>1000,28979=>1000,28980=>1000, + 28981=>1000,28982=>1000,28983=>1000,28984=>1000,28985=>1000,28986=>1000,28987=>1000,28988=>1000,28989=>1000,28990=>1000,28991=>1000,28992=>1000,28993=>1000,28994=>1000,28995=>1000,28996=>1000, + 28997=>1000,28998=>1000,28999=>1000,29000=>1000,29001=>1000,29002=>1000,29003=>1000,29004=>1000,29005=>1000,29006=>1000,29007=>1000,29008=>1000,29009=>1000,29010=>1000,29011=>1000,29012=>1000, + 29013=>1000,29014=>1000,29015=>1000,29016=>1000,29017=>1000,29018=>1000,29019=>1000,29020=>1000,29021=>1000,29022=>1000,29023=>1000,29024=>1000,29025=>1000,29026=>1000,29027=>1000,29028=>1000, + 29029=>1000,29030=>1000,29031=>1000,29032=>1000,29033=>1000,29034=>1000,29035=>1000,29036=>1000,29037=>1000,29038=>1000,29039=>1000,29040=>1000,29041=>1000,29042=>1000,29043=>1000,29044=>1000, + 29045=>1000,29046=>1000,29047=>1000,29048=>1000,29049=>1000,29050=>1000,29051=>1000,29052=>1000,29053=>1000,29054=>1000,29055=>1000,29056=>1000,29057=>1000,29058=>1000,29059=>1000,29060=>1000, + 29061=>1000,29062=>1000,29063=>1000,29064=>1000,29065=>1000,29066=>1000,29067=>1000,29068=>1000,29069=>1000,29070=>1000,29071=>1000,29072=>1000,29073=>1000,29074=>1000,29075=>1000,29076=>1000, + 29077=>1000,29078=>1000,29079=>1000,29080=>1000,29081=>1000,29082=>1000,29083=>1000,29084=>1000,29085=>1000,29086=>1000,29087=>1000,29088=>1000,29089=>1000,29090=>1000,29091=>1000,29092=>1000, + 29093=>1000,29094=>1000,29095=>1000,29096=>1000,29097=>1000,29098=>1000,29099=>1000,29100=>1000,29101=>1000,29102=>1000,29103=>1000,29104=>1000,29105=>1000,29106=>1000,29107=>1000,29108=>1000, + 29109=>1000,29110=>1000,29111=>1000,29112=>1000,29113=>1000,29114=>1000,29115=>1000,29116=>1000,29117=>1000,29118=>1000,29119=>1000,29120=>1000,29121=>1000,29122=>1000,29123=>1000,29124=>1000, + 29125=>1000,29126=>1000,29127=>1000,29128=>1000,29129=>1000,29130=>1000,29131=>1000,29132=>1000,29133=>1000,29134=>1000,29135=>1000,29136=>1000,29137=>1000,29138=>1000,29139=>1000,29140=>1000, + 29141=>1000,29142=>1000,29143=>1000,29144=>1000,29145=>1000,29146=>1000,29147=>1000,29148=>1000,29149=>1000,29150=>1000,29151=>1000,29152=>1000,29153=>1000,29154=>1000,29155=>1000,29156=>1000, + 29157=>1000,29158=>1000,29159=>1000,29160=>1000,29161=>1000,29162=>1000,29163=>1000,29164=>1000,29165=>1000,29166=>1000,29167=>1000,29168=>1000,29169=>1000,29170=>1000,29171=>1000,29172=>1000, + 29173=>1000,29174=>1000,29175=>1000,29176=>1000,29177=>1000,29178=>1000,29179=>1000,29180=>1000,29181=>1000,29182=>1000,29183=>1000,29184=>1000,29185=>1000,29186=>1000,29187=>1000,29188=>1000, + 29189=>1000,29190=>1000,29191=>1000,29192=>1000,29193=>1000,29194=>1000,29195=>1000,29196=>1000,29197=>1000,29198=>1000,29199=>1000,29200=>1000,29201=>1000,29202=>1000,29203=>1000,29204=>1000, + 29205=>1000,29206=>1000,29207=>1000,29208=>1000,29209=>1000,29210=>1000,29211=>1000,29212=>1000,29213=>1000,29214=>1000,29215=>1000,29216=>1000,29217=>1000,29218=>1000,29219=>1000,29220=>1000, + 29221=>1000,29222=>1000,29223=>1000,29224=>1000,29225=>1000,29226=>1000,29227=>1000,29228=>1000,29229=>1000,29230=>1000,29231=>1000,29232=>1000,29233=>1000,29234=>1000,29235=>1000,29236=>1000, + 29237=>1000,29238=>1000,29239=>1000,29240=>1000,29241=>1000,29242=>1000,29243=>1000,29244=>1000,29245=>1000,29246=>1000,29247=>1000,29248=>1000,29249=>1000,29250=>1000,29251=>1000,29252=>1000, + 29253=>1000,29254=>1000,29255=>1000,29256=>1000,29257=>1000,29258=>1000,29259=>1000,29260=>1000,29261=>1000,29262=>1000,29263=>1000,29264=>1000,29265=>1000,29266=>1000,29267=>1000,29268=>1000, + 29269=>1000,29270=>1000,29271=>1000,29272=>1000,29273=>1000,29274=>1000,29275=>1000,29276=>1000,29277=>1000,29278=>1000,29279=>1000,29280=>1000,29281=>1000,29282=>1000,29283=>1000,29284=>1000, + 29285=>1000,29286=>1000,29287=>1000,29288=>1000,29289=>1000,29290=>1000,29291=>1000,29292=>1000,29293=>1000,29294=>1000,29295=>1000,29296=>1000,29297=>1000,29298=>1000,29299=>1000,29300=>1000, + 29301=>1000,29302=>1000,29303=>1000,29304=>1000,29305=>1000,29306=>1000,29307=>1000,29308=>1000,29309=>1000,29310=>1000,29311=>1000,29312=>1000,29313=>1000,29314=>1000,29315=>1000,29316=>1000, + 29317=>1000,29318=>1000,29319=>1000,29320=>1000,29321=>1000,29322=>1000,29323=>1000,29324=>1000,29325=>1000,29326=>1000,29327=>1000,29328=>1000,29329=>1000,29330=>1000,29331=>1000,29332=>1000, + 29333=>1000,29334=>1000,29335=>1000,29336=>1000,29337=>1000,29338=>1000,29339=>1000,29340=>1000,29341=>1000,29342=>1000,29343=>1000,29344=>1000,29345=>1000,29346=>1000,29347=>1000,29348=>1000, + 29349=>1000,29350=>1000,29351=>1000,29352=>1000,29353=>1000,29354=>1000,29355=>1000,29356=>1000,29357=>1000,29358=>1000,29359=>1000,29360=>1000,29361=>1000,29362=>1000,29363=>1000,29364=>1000, + 29365=>1000,29366=>1000,29367=>1000,29368=>1000,29369=>1000,29370=>1000,29371=>1000,29372=>1000,29373=>1000,29374=>1000,29375=>1000,29376=>1000,29377=>1000,29378=>1000,29379=>1000,29380=>1000, + 29381=>1000,29382=>1000,29383=>1000,29384=>1000,29385=>1000,29386=>1000,29387=>1000,29388=>1000,29389=>1000,29390=>1000,29391=>1000,29392=>1000,29393=>1000,29394=>1000,29395=>1000,29396=>1000, + 29397=>1000,29398=>1000,29399=>1000,29400=>1000,29401=>1000,29402=>1000,29403=>1000,29404=>1000,29405=>1000,29406=>1000,29407=>1000,29408=>1000,29409=>1000,29410=>1000,29411=>1000,29412=>1000, + 29413=>1000,29414=>1000,29415=>1000,29416=>1000,29417=>1000,29418=>1000,29419=>1000,29420=>1000,29421=>1000,29422=>1000,29423=>1000,29424=>1000,29425=>1000,29426=>1000,29427=>1000,29428=>1000, + 29429=>1000,29430=>1000,29431=>1000,29432=>1000,29433=>1000,29434=>1000,29435=>1000,29436=>1000,29437=>1000,29438=>1000,29439=>1000,29440=>1000,29441=>1000,29442=>1000,29443=>1000,29444=>1000, + 29445=>1000,29446=>1000,29447=>1000,29448=>1000,29449=>1000,29450=>1000,29451=>1000,29452=>1000,29453=>1000,29454=>1000,29455=>1000,29456=>1000,29457=>1000,29458=>1000,29459=>1000,29460=>1000, + 29461=>1000,29462=>1000,29463=>1000,29464=>1000,29465=>1000,29466=>1000,29467=>1000,29468=>1000,29469=>1000,29470=>1000,29471=>1000,29472=>1000,29473=>1000,29474=>1000,29475=>1000,29476=>1000, + 29477=>1000,29478=>1000,29479=>1000,29480=>1000,29481=>1000,29482=>1000,29483=>1000,29484=>1000,29485=>1000,29486=>1000,29487=>1000,29488=>1000,29489=>1000,29490=>1000,29491=>1000,29492=>1000, + 29493=>1000,29494=>1000,29495=>1000,29496=>1000,29497=>1000,29498=>1000,29499=>1000,29500=>1000,29501=>1000,29502=>1000,29503=>1000,29504=>1000,29505=>1000,29506=>1000,29507=>1000,29508=>1000, + 29509=>1000,29510=>1000,29511=>1000,29512=>1000,29513=>1000,29514=>1000,29515=>1000,29516=>1000,29517=>1000,29518=>1000,29519=>1000,29520=>1000,29521=>1000,29522=>1000,29523=>1000,29524=>1000, + 29525=>1000,29526=>1000,29527=>1000,29528=>1000,29529=>1000,29530=>1000,29531=>1000,29532=>1000,29533=>1000,29534=>1000,29535=>1000,29536=>1000,29537=>1000,29538=>1000,29539=>1000,29540=>1000, + 29541=>1000,29542=>1000,29543=>1000,29544=>1000,29545=>1000,29546=>1000,29547=>1000,29548=>1000,29549=>1000,29550=>1000,29551=>1000,29552=>1000,29553=>1000,29554=>1000,29555=>1000,29556=>1000, + 29557=>1000,29558=>1000,29559=>1000,29560=>1000,29561=>1000,29562=>1000,29563=>1000,29564=>1000,29565=>1000,29566=>1000,29567=>1000,29568=>1000,29569=>1000,29570=>1000,29571=>1000,29572=>1000, + 29573=>1000,29574=>1000,29575=>1000,29576=>1000,29577=>1000,29578=>1000,29579=>1000,29580=>1000,29581=>1000,29582=>1000,29583=>1000,29584=>1000,29585=>1000,29586=>1000,29587=>1000,29588=>1000, + 29589=>1000,29590=>1000,29591=>1000,29592=>1000,29593=>1000,29594=>1000,29595=>1000,29596=>1000,29597=>1000,29598=>1000,29599=>1000,29600=>1000,29601=>1000,29602=>1000,29603=>1000,29604=>1000, + 29605=>1000,29606=>1000,29607=>1000,29608=>1000,29609=>1000,29610=>1000,29611=>1000,29612=>1000,29613=>1000,29614=>1000,29615=>1000,29616=>1000,29617=>1000,29618=>1000,29619=>1000,29620=>1000, + 29621=>1000,29622=>1000,29623=>1000,29624=>1000,29625=>1000,29626=>1000,29627=>1000,29628=>1000,29629=>1000,29630=>1000,29631=>1000,29632=>1000,29633=>1000,29634=>1000,29635=>1000,29636=>1000, + 29637=>1000,29638=>1000,29639=>1000,29640=>1000,29641=>1000,29642=>1000,29643=>1000,29644=>1000,29645=>1000,29646=>1000,29647=>1000,29648=>1000,29649=>1000,29650=>1000,29651=>1000,29652=>1000, + 29653=>1000,29654=>1000,29655=>1000,29656=>1000,29657=>1000,29658=>1000,29659=>1000,29660=>1000,29661=>1000,29662=>1000,29663=>1000,29664=>1000,29665=>1000,29666=>1000,29667=>1000,29668=>1000, + 29669=>1000,29670=>1000,29671=>1000,29672=>1000,29673=>1000,29674=>1000,29675=>1000,29676=>1000,29677=>1000,29678=>1000,29679=>1000,29680=>1000,29681=>1000,29682=>1000,29683=>1000,29684=>1000, + 29685=>1000,29686=>1000,29687=>1000,29688=>1000,29689=>1000,29690=>1000,29691=>1000,29692=>1000,29693=>1000,29694=>1000,29695=>1000,29696=>1000,29697=>1000,29698=>1000,29699=>1000,29700=>1000, + 29701=>1000,29702=>1000,29703=>1000,29704=>1000,29705=>1000,29706=>1000,29707=>1000,29708=>1000,29709=>1000,29710=>1000,29711=>1000,29712=>1000,29713=>1000,29714=>1000,29715=>1000,29716=>1000, + 29717=>1000,29718=>1000,29719=>1000,29720=>1000,29721=>1000,29722=>1000,29723=>1000,29724=>1000,29725=>1000,29726=>1000,29727=>1000,29728=>1000,29729=>1000,29730=>1000,29731=>1000,29732=>1000, + 29733=>1000,29734=>1000,29735=>1000,29736=>1000,29737=>1000,29738=>1000,29739=>1000,29740=>1000,29741=>1000,29742=>1000,29743=>1000,29744=>1000,29745=>1000,29746=>1000,29747=>1000,29748=>1000, + 29749=>1000,29750=>1000,29751=>1000,29752=>1000,29753=>1000,29754=>1000,29755=>1000,29756=>1000,29757=>1000,29758=>1000,29759=>1000,29760=>1000,29761=>1000,29762=>1000,29763=>1000,29764=>1000, + 29765=>1000,29766=>1000,29767=>1000,29768=>1000,29769=>1000,29770=>1000,29771=>1000,29772=>1000,29773=>1000,29774=>1000,29775=>1000,29776=>1000,29777=>1000,29778=>1000,29779=>1000,29780=>1000, + 29781=>1000,29782=>1000,29783=>1000,29784=>1000,29785=>1000,29786=>1000,29787=>1000,29788=>1000,29789=>1000,29790=>1000,29791=>1000,29792=>1000,29793=>1000,29794=>1000,29795=>1000,29796=>1000, + 29797=>1000,29798=>1000,29799=>1000,29800=>1000,29801=>1000,29802=>1000,29803=>1000,29804=>1000,29805=>1000,29806=>1000,29807=>1000,29808=>1000,29809=>1000,29810=>1000,29811=>1000,29812=>1000, + 29813=>1000,29814=>1000,29815=>1000,29816=>1000,29817=>1000,29818=>1000,29819=>1000,29820=>1000,29821=>1000,29822=>1000,29823=>1000,29824=>1000,29825=>1000,29826=>1000,29827=>1000,29828=>1000, + 29829=>1000,29830=>1000,29831=>1000,29832=>1000,29833=>1000,29834=>1000,29835=>1000,29836=>1000,29837=>1000,29838=>1000,29839=>1000,29840=>1000,29841=>1000,29842=>1000,29843=>1000,29844=>1000, + 29845=>1000,29846=>1000,29847=>1000,29848=>1000,29849=>1000,29850=>1000,29851=>1000,29852=>1000,29853=>1000,29854=>1000,29855=>1000,29856=>1000,29857=>1000,29858=>1000,29859=>1000,29860=>1000, + 29861=>1000,29862=>1000,29863=>1000,29864=>1000,29865=>1000,29866=>1000,29867=>1000,29868=>1000,29869=>1000,29870=>1000,29871=>1000,29872=>1000,29873=>1000,29874=>1000,29875=>1000,29876=>1000, + 29877=>1000,29878=>1000,29879=>1000,29880=>1000,29881=>1000,29882=>1000,29883=>1000,29884=>1000,29885=>1000,29886=>1000,29887=>1000,29888=>1000,29889=>1000,29890=>1000,29891=>1000,29892=>1000, + 29893=>1000,29894=>1000,29895=>1000,29896=>1000,29897=>1000,29898=>1000,29899=>1000,29900=>1000,29901=>1000,29902=>1000,29903=>1000,29904=>1000,29905=>1000,29906=>1000,29907=>1000,29908=>1000, + 29909=>1000,29910=>1000,29911=>1000,29912=>1000,29913=>1000,29914=>1000,29915=>1000,29916=>1000,29917=>1000,29918=>1000,29919=>1000,29920=>1000,29921=>1000,29922=>1000,29923=>1000,29924=>1000, + 29925=>1000,29926=>1000,29927=>1000,29928=>1000,29929=>1000,29930=>1000,29931=>1000,29932=>1000,29933=>1000,29934=>1000,29935=>1000,29936=>1000,29937=>1000,29938=>1000,29939=>1000,29940=>1000, + 29941=>1000,29942=>1000,29943=>1000,29944=>1000,29945=>1000,29946=>1000,29947=>1000,29948=>1000,29949=>1000,29950=>1000,29951=>1000,29952=>1000,29953=>1000,29954=>1000,29955=>1000,29956=>1000, + 29957=>1000,29958=>1000,29959=>1000,29960=>1000,29961=>1000,29962=>1000,29963=>1000,29964=>1000,29965=>1000,29966=>1000,29967=>1000,29968=>1000,29969=>1000,29970=>1000,29971=>1000,29972=>1000, + 29973=>1000,29974=>1000,29975=>1000,29976=>1000,29977=>1000,29978=>1000,29979=>1000,29980=>1000,29981=>1000,29982=>1000,29983=>1000,29984=>1000,29985=>1000,29986=>1000,29987=>1000,29988=>1000, + 29989=>1000,29990=>1000,29991=>1000,29992=>1000,29993=>1000,29994=>1000,29995=>1000,29996=>1000,29997=>1000,29998=>1000,29999=>1000,30000=>1000,30001=>1000,30002=>1000,30003=>1000,30004=>1000, + 30005=>1000,30006=>1000,30007=>1000,30008=>1000,30009=>1000,30010=>1000,30011=>1000,30012=>1000,30013=>1000,30014=>1000,30015=>1000,30016=>1000,30017=>1000,30018=>1000,30019=>1000,30020=>1000, + 30021=>1000,30022=>1000,30023=>1000,30024=>1000,30025=>1000,30026=>1000,30027=>1000,30028=>1000,30029=>1000,30030=>1000,30031=>1000,30032=>1000,30033=>1000,30034=>1000,30035=>1000,30036=>1000, + 30037=>1000,30038=>1000,30039=>1000,30040=>1000,30041=>1000,30042=>1000,30043=>1000,30044=>1000,30045=>1000,30046=>1000,30047=>1000,30048=>1000,30049=>1000,30050=>1000,30051=>1000,30052=>1000, + 30053=>1000,30054=>1000,30055=>1000,30056=>1000,30057=>1000,30058=>1000,30059=>1000,30060=>1000,30061=>1000,30062=>1000,30063=>1000,30064=>1000,30065=>1000,30066=>1000,30067=>1000,30068=>1000, + 30069=>1000,30070=>1000,30071=>1000,30072=>1000,30073=>1000,30074=>1000,30075=>1000,30076=>1000,30077=>1000,30078=>1000,30079=>1000,30080=>1000,30081=>1000,30082=>1000,30083=>1000,30084=>1000, + 30085=>1000,30086=>1000,30087=>1000,30088=>1000,30089=>1000,30090=>1000,30091=>1000,30092=>1000,30093=>1000,30094=>1000,30095=>1000,30096=>1000,30097=>1000,30098=>1000,30099=>1000,30100=>1000, + 30101=>1000,30102=>1000,30103=>1000,30104=>1000,30105=>1000,30106=>1000,30107=>1000,30108=>1000,30109=>1000,30110=>1000,30111=>1000,30112=>1000,30113=>1000,30114=>1000,30115=>1000,30116=>1000, + 30117=>1000,30118=>1000,30119=>1000,30120=>1000,30121=>1000,30122=>1000,30123=>1000,30124=>1000,30125=>1000,30126=>1000,30127=>1000,30128=>1000,30129=>1000,30130=>1000,30131=>1000,30132=>1000, + 30133=>1000,30134=>1000,30135=>1000,30136=>1000,30137=>1000,30138=>1000,30139=>1000,30140=>1000,30141=>1000,30142=>1000,30143=>1000,30144=>1000,30145=>1000,30146=>1000,30147=>1000,30148=>1000, + 30149=>1000,30150=>1000,30151=>1000,30152=>1000,30153=>1000,30154=>1000,30155=>1000,30156=>1000,30157=>1000,30158=>1000,30159=>1000,30160=>1000,30161=>1000,30162=>1000,30163=>1000,30164=>1000, + 30165=>1000,30166=>1000,30167=>1000,30168=>1000,30169=>1000,30170=>1000,30171=>1000,30172=>1000,30173=>1000,30174=>1000,30175=>1000,30176=>1000,30177=>1000,30178=>1000,30179=>1000,30180=>1000, + 30181=>1000,30182=>1000,30183=>1000,30184=>1000,30185=>1000,30186=>1000,30187=>1000,30188=>1000,30189=>1000,30190=>1000,30191=>1000,30192=>1000,30193=>1000,30194=>1000,30195=>1000,30196=>1000, + 30197=>1000,30198=>1000,30199=>1000,30200=>1000,30201=>1000,30202=>1000,30203=>1000,30204=>1000,30205=>1000,30206=>1000,30207=>1000,30208=>1000,30209=>1000,30210=>1000,30211=>1000,30212=>1000, + 30213=>1000,30214=>1000,30215=>1000,30216=>1000,30217=>1000,30218=>1000,30219=>1000,30220=>1000,30221=>1000,30222=>1000,30223=>1000,30224=>1000,30225=>1000,30226=>1000,30227=>1000,30228=>1000, + 30229=>1000,30230=>1000,30231=>1000,30232=>1000,30233=>1000,30234=>1000,30235=>1000,30236=>1000,30237=>1000,30238=>1000,30239=>1000,30240=>1000,30241=>1000,30242=>1000,30243=>1000,30244=>1000, + 30245=>1000,30246=>1000,30247=>1000,30248=>1000,30249=>1000,30250=>1000,30251=>1000,30252=>1000,30253=>1000,30254=>1000,30255=>1000,30256=>1000,30257=>1000,30258=>1000,30259=>1000,30260=>1000, + 30261=>1000,30262=>1000,30263=>1000,30264=>1000,30265=>1000,30266=>1000,30267=>1000,30268=>1000,30269=>1000,30270=>1000,30271=>1000,30272=>1000,30273=>1000,30274=>1000,30275=>1000,30276=>1000, + 30277=>1000,30278=>1000,30279=>1000,30280=>1000,30281=>1000,30282=>1000,30283=>1000,30284=>1000,30285=>1000,30286=>1000,30287=>1000,30288=>1000,30289=>1000,30290=>1000,30291=>1000,30292=>1000, + 30293=>1000,30294=>1000,30295=>1000,30296=>1000,30297=>1000,30298=>1000,30299=>1000,30300=>1000,30301=>1000,30302=>1000,30303=>1000,30304=>1000,30305=>1000,30306=>1000,30307=>1000,30308=>1000, + 30309=>1000,30310=>1000,30311=>1000,30312=>1000,30313=>1000,30314=>1000,30315=>1000,30316=>1000,30317=>1000,30318=>1000,30319=>1000,30320=>1000,30321=>1000,30322=>1000,30323=>1000,30324=>1000, + 30325=>1000,30326=>1000,30327=>1000,30328=>1000,30329=>1000,30330=>1000,30331=>1000,30332=>1000,30333=>1000,30334=>1000,30335=>1000,30336=>1000,30337=>1000,30338=>1000,30339=>1000,30340=>1000, + 30341=>1000,30342=>1000,30343=>1000,30344=>1000,30345=>1000,30346=>1000,30347=>1000,30348=>1000,30349=>1000,30350=>1000,30351=>1000,30352=>1000,30353=>1000,30354=>1000,30355=>1000,30356=>1000, + 30357=>1000,30358=>1000,30359=>1000,30360=>1000,30361=>1000,30362=>1000,30363=>1000,30364=>1000,30365=>1000,30366=>1000,30367=>1000,30368=>1000,30369=>1000,30370=>1000,30371=>1000,30372=>1000, + 30373=>1000,30374=>1000,30375=>1000,30376=>1000,30377=>1000,30378=>1000,30379=>1000,30380=>1000,30381=>1000,30382=>1000,30383=>1000,30384=>1000,30385=>1000,30386=>1000,30387=>1000,30388=>1000, + 30389=>1000,30390=>1000,30391=>1000,30392=>1000,30393=>1000,30394=>1000,30395=>1000,30396=>1000,30397=>1000,30398=>1000,30399=>1000,30400=>1000,30401=>1000,30402=>1000,30403=>1000,30404=>1000, + 30405=>1000,30406=>1000,30407=>1000,30408=>1000,30409=>1000,30410=>1000,30411=>1000,30412=>1000,30413=>1000,30414=>1000,30415=>1000,30416=>1000,30417=>1000,30418=>1000,30419=>1000,30420=>1000, + 30421=>1000,30422=>1000,30423=>1000,30424=>1000,30425=>1000,30426=>1000,30427=>1000,30428=>1000,30429=>1000,30430=>1000,30431=>1000,30432=>1000,30433=>1000,30434=>1000,30435=>1000,30436=>1000, + 30437=>1000,30438=>1000,30439=>1000,30440=>1000,30441=>1000,30442=>1000,30443=>1000,30444=>1000,30445=>1000,30446=>1000,30447=>1000,30448=>1000,30449=>1000,30450=>1000,30451=>1000,30452=>1000, + 30453=>1000,30454=>1000,30455=>1000,30456=>1000,30457=>1000,30458=>1000,30459=>1000,30460=>1000,30461=>1000,30462=>1000,30463=>1000,30464=>1000,30465=>1000,30466=>1000,30467=>1000,30468=>1000, + 30469=>1000,30470=>1000,30471=>1000,30472=>1000,30473=>1000,30474=>1000,30475=>1000,30476=>1000,30477=>1000,30478=>1000,30479=>1000,30480=>1000,30481=>1000,30482=>1000,30483=>1000,30484=>1000, + 30485=>1000,30486=>1000,30487=>1000,30488=>1000,30489=>1000,30490=>1000,30491=>1000,30492=>1000,30493=>1000,30494=>1000,30495=>1000,30496=>1000,30497=>1000,30498=>1000,30499=>1000,30500=>1000, + 30501=>1000,30502=>1000,30503=>1000,30504=>1000,30505=>1000,30506=>1000,30507=>1000,30508=>1000,30509=>1000,30510=>1000,30511=>1000,30512=>1000,30513=>1000,30514=>1000,30515=>1000,30516=>1000, + 30517=>1000,30518=>1000,30519=>1000,30520=>1000,30521=>1000,30522=>1000,30523=>1000,30524=>1000,30525=>1000,30526=>1000,30527=>1000,30528=>1000,30529=>1000,30530=>1000,30531=>1000,30532=>1000, + 30533=>1000,30534=>1000,30535=>1000,30536=>1000,30537=>1000,30538=>1000,30539=>1000,30540=>1000,30541=>1000,30542=>1000,30543=>1000,30544=>1000,30545=>1000,30546=>1000,30547=>1000,30548=>1000, + 30549=>1000,30550=>1000,30551=>1000,30552=>1000,30553=>1000,30554=>1000,30555=>1000,30556=>1000,30557=>1000,30558=>1000,30559=>1000,30560=>1000,30561=>1000,30562=>1000,30563=>1000,30564=>1000, + 30565=>1000,30566=>1000,30567=>1000,30568=>1000,30569=>1000,30570=>1000,30571=>1000,30572=>1000,30573=>1000,30574=>1000,30575=>1000,30576=>1000,30577=>1000,30578=>1000,30579=>1000,30580=>1000, + 30581=>1000,30582=>1000,30583=>1000,30584=>1000,30585=>1000,30586=>1000,30587=>1000,30588=>1000,30589=>1000,30590=>1000,30591=>1000,30592=>1000,30593=>1000,30594=>1000,30595=>1000,30596=>1000, + 30597=>1000,30598=>1000,30599=>1000,30600=>1000,30601=>1000,30602=>1000,30603=>1000,30604=>1000,30605=>1000,30606=>1000,30607=>1000,30608=>1000,30609=>1000,30610=>1000,30611=>1000,30612=>1000, + 30613=>1000,30614=>1000,30615=>1000,30616=>1000,30617=>1000,30618=>1000,30619=>1000,30620=>1000,30621=>1000,30622=>1000,30623=>1000,30624=>1000,30625=>1000,30626=>1000,30627=>1000,30628=>1000, + 30629=>1000,30630=>1000,30631=>1000,30632=>1000,30633=>1000,30634=>1000,30635=>1000,30636=>1000,30637=>1000,30638=>1000,30639=>1000,30640=>1000,30641=>1000,30642=>1000,30643=>1000,30644=>1000, + 30645=>1000,30646=>1000,30647=>1000,30648=>1000,30649=>1000,30650=>1000,30651=>1000,30652=>1000,30653=>1000,30654=>1000,30655=>1000,30656=>1000,30657=>1000,30658=>1000,30659=>1000,30660=>1000, + 30661=>1000,30662=>1000,30663=>1000,30664=>1000,30665=>1000,30666=>1000,30667=>1000,30668=>1000,30669=>1000,30670=>1000,30671=>1000,30672=>1000,30673=>1000,30674=>1000,30675=>1000,30676=>1000, + 30677=>1000,30678=>1000,30679=>1000,30680=>1000,30681=>1000,30682=>1000,30683=>1000,30684=>1000,30685=>1000,30686=>1000,30687=>1000,30688=>1000,30689=>1000,30690=>1000,30691=>1000,30692=>1000, + 30693=>1000,30694=>1000,30695=>1000,30696=>1000,30697=>1000,30698=>1000,30699=>1000,30700=>1000,30701=>1000,30702=>1000,30703=>1000,30704=>1000,30705=>1000,30706=>1000,30707=>1000,30708=>1000, + 30709=>1000,30710=>1000,30711=>1000,30712=>1000,30713=>1000,30714=>1000,30715=>1000,30716=>1000,30717=>1000,30718=>1000,30719=>1000,30720=>1000,30721=>1000,30722=>1000,30723=>1000,30724=>1000, + 30725=>1000,30726=>1000,30727=>1000,30728=>1000,30729=>1000,30730=>1000,30731=>1000,30732=>1000,30733=>1000,30734=>1000,30735=>1000,30736=>1000,30737=>1000,30738=>1000,30739=>1000,30740=>1000, + 30741=>1000,30742=>1000,30743=>1000,30744=>1000,30745=>1000,30746=>1000,30747=>1000,30748=>1000,30749=>1000,30750=>1000,30751=>1000,30752=>1000,30753=>1000,30754=>1000,30755=>1000,30756=>1000, + 30757=>1000,30758=>1000,30759=>1000,30760=>1000,30761=>1000,30762=>1000,30763=>1000,30764=>1000,30765=>1000,30766=>1000,30767=>1000,30768=>1000,30769=>1000,30770=>1000,30771=>1000,30772=>1000, + 30773=>1000,30774=>1000,30775=>1000,30776=>1000,30777=>1000,30778=>1000,30779=>1000,30780=>1000,30781=>1000,30782=>1000,30783=>1000,30784=>1000,30785=>1000,30786=>1000,30787=>1000,30788=>1000, + 30789=>1000,30790=>1000,30791=>1000,30792=>1000,30793=>1000,30794=>1000,30795=>1000,30796=>1000,30797=>1000,30798=>1000,30799=>1000,30800=>1000,30801=>1000,30802=>1000,30803=>1000,30804=>1000, + 30805=>1000,30806=>1000,30807=>1000,30808=>1000,30809=>1000,30810=>1000,30811=>1000,30812=>1000,30813=>1000,30814=>1000,30815=>1000,30816=>1000,30817=>1000,30818=>1000,30819=>1000,30820=>1000, + 30821=>1000,30822=>1000,30823=>1000,30824=>1000,30825=>1000,30826=>1000,30827=>1000,30828=>1000,30829=>1000,30830=>1000,30831=>1000,30832=>1000,30833=>1000,30834=>1000,30835=>1000,30836=>1000, + 30837=>1000,30838=>1000,30839=>1000,30840=>1000,30841=>1000,30842=>1000,30843=>1000,30844=>1000,30845=>1000,30846=>1000,30847=>1000,30848=>1000,30849=>1000,30850=>1000,30851=>1000,30852=>1000, + 30853=>1000,30854=>1000,30855=>1000,30856=>1000,30857=>1000,30858=>1000,30859=>1000,30860=>1000,30861=>1000,30862=>1000,30863=>1000,30864=>1000,30865=>1000,30866=>1000,30867=>1000,30868=>1000, + 30869=>1000,30870=>1000,30871=>1000,30872=>1000,30873=>1000,30874=>1000,30875=>1000,30876=>1000,30877=>1000,30878=>1000,30879=>1000,30880=>1000,30881=>1000,30882=>1000,30883=>1000,30884=>1000, + 30885=>1000,30886=>1000,30887=>1000,30888=>1000,30889=>1000,30890=>1000,30891=>1000,30892=>1000,30893=>1000,30894=>1000,30895=>1000,30896=>1000,30897=>1000,30898=>1000,30899=>1000,30900=>1000, + 30901=>1000,30902=>1000,30903=>1000,30904=>1000,30905=>1000,30906=>1000,30907=>1000,30908=>1000,30909=>1000,30910=>1000,30911=>1000,30912=>1000,30913=>1000,30914=>1000,30915=>1000,30916=>1000, + 30917=>1000,30918=>1000,30919=>1000,30920=>1000,30921=>1000,30922=>1000,30923=>1000,30924=>1000,30925=>1000,30926=>1000,30927=>1000,30928=>1000,30929=>1000,30930=>1000,30931=>1000,30932=>1000, + 30933=>1000,30934=>1000,30935=>1000,30936=>1000,30937=>1000,30938=>1000,30939=>1000,30940=>1000,30941=>1000,30942=>1000,30943=>1000,30944=>1000,30945=>1000,30946=>1000,30947=>1000,30948=>1000, + 30949=>1000,30950=>1000,30951=>1000,30952=>1000,30953=>1000,30954=>1000,30955=>1000,30956=>1000,30957=>1000,30958=>1000,30959=>1000,30960=>1000,30961=>1000,30962=>1000,30963=>1000,30964=>1000, + 30965=>1000,30966=>1000,30967=>1000,30968=>1000,30969=>1000,30970=>1000,30971=>1000,30972=>1000,30973=>1000,30974=>1000,30975=>1000,30976=>1000,30977=>1000,30978=>1000,30979=>1000,30980=>1000, + 30981=>1000,30982=>1000,30983=>1000,30984=>1000,30985=>1000,30986=>1000,30987=>1000,30988=>1000,30989=>1000,30990=>1000,30991=>1000,30992=>1000,30993=>1000,30994=>1000,30995=>1000,30996=>1000, + 30997=>1000,30998=>1000,30999=>1000,31000=>1000,31001=>1000,31002=>1000,31003=>1000,31004=>1000,31005=>1000,31006=>1000,31007=>1000,31008=>1000,31009=>1000,31010=>1000,31011=>1000,31012=>1000, + 31013=>1000,31014=>1000,31015=>1000,31016=>1000,31017=>1000,31018=>1000,31019=>1000,31020=>1000,31021=>1000,31022=>1000,31023=>1000,31024=>1000,31025=>1000,31026=>1000,31027=>1000,31028=>1000, + 31029=>1000,31030=>1000,31031=>1000,31032=>1000,31033=>1000,31034=>1000,31035=>1000,31036=>1000,31037=>1000,31038=>1000,31039=>1000,31040=>1000,31041=>1000,31042=>1000,31043=>1000,31044=>1000, + 31045=>1000,31046=>1000,31047=>1000,31048=>1000,31049=>1000,31050=>1000,31051=>1000,31052=>1000,31053=>1000,31054=>1000,31055=>1000,31056=>1000,31057=>1000,31058=>1000,31059=>1000,31060=>1000, + 31061=>1000,31062=>1000,31063=>1000,31064=>1000,31065=>1000,31066=>1000,31067=>1000,31068=>1000,31069=>1000,31070=>1000,31071=>1000,31072=>1000,31073=>1000,31074=>1000,31075=>1000,31076=>1000, + 31077=>1000,31078=>1000,31079=>1000,31080=>1000,31081=>1000,31082=>1000,31083=>1000,31084=>1000,31085=>1000,31086=>1000,31087=>1000,31088=>1000,31089=>1000,31090=>1000,31091=>1000,31092=>1000, + 31093=>1000,31094=>1000,31095=>1000,31096=>1000,31097=>1000,31098=>1000,31099=>1000,31100=>1000,31101=>1000,31102=>1000,31103=>1000,31104=>1000,31105=>1000,31106=>1000,31107=>1000,31108=>1000, + 31109=>1000,31110=>1000,31111=>1000,31112=>1000,31113=>1000,31114=>1000,31115=>1000,31116=>1000,31117=>1000,31118=>1000,31119=>1000,31120=>1000,31121=>1000,31122=>1000,31123=>1000,31124=>1000, + 31125=>1000,31126=>1000,31127=>1000,31128=>1000,31129=>1000,31130=>1000,31131=>1000,31132=>1000,31133=>1000,31134=>1000,31135=>1000,31136=>1000,31137=>1000,31138=>1000,31139=>1000,31140=>1000, + 31141=>1000,31142=>1000,31143=>1000,31144=>1000,31145=>1000,31146=>1000,31147=>1000,31148=>1000,31149=>1000,31150=>1000,31151=>1000,31152=>1000,31153=>1000,31154=>1000,31155=>1000,31156=>1000, + 31157=>1000,31158=>1000,31159=>1000,31160=>1000,31161=>1000,31162=>1000,31163=>1000,31164=>1000,31165=>1000,31166=>1000,31167=>1000,31168=>1000,31169=>1000,31170=>1000,31171=>1000,31172=>1000, + 31173=>1000,31174=>1000,31175=>1000,31176=>1000,31177=>1000,31178=>1000,31179=>1000,31180=>1000,31181=>1000,31182=>1000,31183=>1000,31184=>1000,31185=>1000,31186=>1000,31187=>1000,31188=>1000, + 31189=>1000,31190=>1000,31191=>1000,31192=>1000,31193=>1000,31194=>1000,31195=>1000,31196=>1000,31197=>1000,31198=>1000,31199=>1000,31200=>1000,31201=>1000,31202=>1000,31203=>1000,31204=>1000, + 31205=>1000,31206=>1000,31207=>1000,31208=>1000,31209=>1000,31210=>1000,31211=>1000,31212=>1000,31213=>1000,31214=>1000,31215=>1000,31216=>1000,31217=>1000,31218=>1000,31219=>1000,31220=>1000, + 31221=>1000,31222=>1000,31223=>1000,31224=>1000,31225=>1000,31226=>1000,31227=>1000,31228=>1000,31229=>1000,31230=>1000,31231=>1000,31232=>1000,31233=>1000,31234=>1000,31235=>1000,31236=>1000, + 31237=>1000,31238=>1000,31239=>1000,31240=>1000,31241=>1000,31242=>1000,31243=>1000,31244=>1000,31245=>1000,31246=>1000,31247=>1000,31248=>1000,31249=>1000,31250=>1000,31251=>1000,31252=>1000, + 31253=>1000,31254=>1000,31255=>1000,31256=>1000,31257=>1000,31258=>1000,31259=>1000,31260=>1000,31261=>1000,31262=>1000,31263=>1000,31264=>1000,31265=>1000,31266=>1000,31267=>1000,31268=>1000, + 31269=>1000,31270=>1000,31271=>1000,31272=>1000,31273=>1000,31274=>1000,31275=>1000,31276=>1000,31277=>1000,31278=>1000,31279=>1000,31280=>1000,31281=>1000,31282=>1000,31283=>1000,31284=>1000, + 31285=>1000,31286=>1000,31287=>1000,31288=>1000,31289=>1000,31290=>1000,31291=>1000,31292=>1000,31293=>1000,31294=>1000,31295=>1000,31296=>1000,31297=>1000,31298=>1000,31299=>1000,31300=>1000, + 31301=>1000,31302=>1000,31303=>1000,31304=>1000,31305=>1000,31306=>1000,31307=>1000,31308=>1000,31309=>1000,31310=>1000,31311=>1000,31312=>1000,31313=>1000,31314=>1000,31315=>1000,31316=>1000, + 31317=>1000,31318=>1000,31319=>1000,31320=>1000,31321=>1000,31322=>1000,31323=>1000,31324=>1000,31325=>1000,31326=>1000,31327=>1000,31328=>1000,31329=>1000,31330=>1000,31331=>1000,31332=>1000, + 31333=>1000,31334=>1000,31335=>1000,31336=>1000,31337=>1000,31338=>1000,31339=>1000,31340=>1000,31341=>1000,31342=>1000,31343=>1000,31344=>1000,31345=>1000,31346=>1000,31347=>1000,31348=>1000, + 31349=>1000,31350=>1000,31351=>1000,31352=>1000,31353=>1000,31354=>1000,31355=>1000,31356=>1000,31357=>1000,31358=>1000,31359=>1000,31360=>1000,31361=>1000,31362=>1000,31363=>1000,31364=>1000, + 31365=>1000,31366=>1000,31367=>1000,31368=>1000,31369=>1000,31370=>1000,31371=>1000,31372=>1000,31373=>1000,31374=>1000,31375=>1000,31376=>1000,31377=>1000,31378=>1000,31379=>1000,31380=>1000, + 31381=>1000,31382=>1000,31383=>1000,31384=>1000,31385=>1000,31386=>1000,31387=>1000,31388=>1000,31389=>1000,31390=>1000,31391=>1000,31392=>1000,31393=>1000,31394=>1000,31395=>1000,31396=>1000, + 31397=>1000,31398=>1000,31399=>1000,31400=>1000,31401=>1000,31402=>1000,31403=>1000,31404=>1000,31405=>1000,31406=>1000,31407=>1000,31408=>1000,31409=>1000,31410=>1000,31411=>1000,31412=>1000, + 31413=>1000,31414=>1000,31415=>1000,31416=>1000,31417=>1000,31418=>1000,31419=>1000,31420=>1000,31421=>1000,31422=>1000,31423=>1000,31424=>1000,31425=>1000,31426=>1000,31427=>1000,31428=>1000, + 31429=>1000,31430=>1000,31431=>1000,31432=>1000,31433=>1000,31434=>1000,31435=>1000,31436=>1000,31437=>1000,31438=>1000,31439=>1000,31440=>1000,31441=>1000,31442=>1000,31443=>1000,31444=>1000, + 31445=>1000,31446=>1000,31447=>1000,31448=>1000,31449=>1000,31450=>1000,31451=>1000,31452=>1000,31453=>1000,31454=>1000,31455=>1000,31456=>1000,31457=>1000,31458=>1000,31459=>1000,31460=>1000, + 31461=>1000,31462=>1000,31463=>1000,31464=>1000,31465=>1000,31466=>1000,31467=>1000,31468=>1000,31469=>1000,31470=>1000,31471=>1000,31472=>1000,31473=>1000,31474=>1000,31475=>1000,31476=>1000, + 31477=>1000,31478=>1000,31479=>1000,31480=>1000,31481=>1000,31482=>1000,31483=>1000,31484=>1000,31485=>1000,31486=>1000,31487=>1000,31488=>1000,31489=>1000,31490=>1000,31491=>1000,31492=>1000, + 31493=>1000,31494=>1000,31495=>1000,31496=>1000,31497=>1000,31498=>1000,31499=>1000,31500=>1000,31501=>1000,31502=>1000,31503=>1000,31504=>1000,31505=>1000,31506=>1000,31507=>1000,31508=>1000, + 31509=>1000,31510=>1000,31511=>1000,31512=>1000,31513=>1000,31514=>1000,31515=>1000,31516=>1000,31517=>1000,31518=>1000,31519=>1000,31520=>1000,31521=>1000,31522=>1000,31523=>1000,31524=>1000, + 31525=>1000,31526=>1000,31527=>1000,31528=>1000,31529=>1000,31530=>1000,31531=>1000,31532=>1000,31533=>1000,31534=>1000,31535=>1000,31536=>1000,31537=>1000,31538=>1000,31539=>1000,31540=>1000, + 31541=>1000,31542=>1000,31543=>1000,31544=>1000,31545=>1000,31546=>1000,31547=>1000,31548=>1000,31549=>1000,31550=>1000,31551=>1000,31552=>1000,31553=>1000,31554=>1000,31555=>1000,31556=>1000, + 31557=>1000,31558=>1000,31559=>1000,31560=>1000,31561=>1000,31562=>1000,31563=>1000,31564=>1000,31565=>1000,31566=>1000,31567=>1000,31568=>1000,31569=>1000,31570=>1000,31571=>1000,31572=>1000, + 31573=>1000,31574=>1000,31575=>1000,31576=>1000,31577=>1000,31578=>1000,31579=>1000,31580=>1000,31581=>1000,31582=>1000,31583=>1000,31584=>1000,31585=>1000,31586=>1000,31587=>1000,31588=>1000, + 31589=>1000,31590=>1000,31591=>1000,31592=>1000,31593=>1000,31594=>1000,31595=>1000,31596=>1000,31597=>1000,31598=>1000,31599=>1000,31600=>1000,31601=>1000,31602=>1000,31603=>1000,31604=>1000, + 31605=>1000,31606=>1000,31607=>1000,31608=>1000,31609=>1000,31610=>1000,31611=>1000,31612=>1000,31613=>1000,31614=>1000,31615=>1000,31616=>1000,31617=>1000,31618=>1000,31619=>1000,31620=>1000, + 31621=>1000,31622=>1000,31623=>1000,31624=>1000,31625=>1000,31626=>1000,31627=>1000,31628=>1000,31629=>1000,31630=>1000,31631=>1000,31632=>1000,31633=>1000,31634=>1000,31635=>1000,31636=>1000, + 31637=>1000,31638=>1000,31639=>1000,31640=>1000,31641=>1000,31642=>1000,31643=>1000,31644=>1000,31645=>1000,31646=>1000,31647=>1000,31648=>1000,31649=>1000,31650=>1000,31651=>1000,31652=>1000, + 31653=>1000,31654=>1000,31655=>1000,31656=>1000,31657=>1000,31658=>1000,31659=>1000,31660=>1000,31661=>1000,31662=>1000,31663=>1000,31664=>1000,31665=>1000,31666=>1000,31667=>1000,31668=>1000, + 31669=>1000,31670=>1000,31671=>1000,31672=>1000,31673=>1000,31674=>1000,31675=>1000,31676=>1000,31677=>1000,31678=>1000,31679=>1000,31680=>1000,31681=>1000,31682=>1000,31683=>1000,31684=>1000, + 31685=>1000,31686=>1000,31687=>1000,31688=>1000,31689=>1000,31690=>1000,31691=>1000,31692=>1000,31693=>1000,31694=>1000,31695=>1000,31696=>1000,31697=>1000,31698=>1000,31699=>1000,31700=>1000, + 31701=>1000,31702=>1000,31703=>1000,31704=>1000,31705=>1000,31706=>1000,31707=>1000,31708=>1000,31709=>1000,31710=>1000,31711=>1000,31712=>1000,31713=>1000,31714=>1000,31715=>1000,31716=>1000, + 31717=>1000,31718=>1000,31719=>1000,31720=>1000,31721=>1000,31722=>1000,31723=>1000,31724=>1000,31725=>1000,31726=>1000,31727=>1000,31728=>1000,31729=>1000,31730=>1000,31731=>1000,31732=>1000, + 31733=>1000,31734=>1000,31735=>1000,31736=>1000,31737=>1000,31738=>1000,31739=>1000,31740=>1000,31741=>1000,31742=>1000,31743=>1000,31744=>1000,31745=>1000,31746=>1000,31747=>1000,31748=>1000, + 31749=>1000,31750=>1000,31751=>1000,31752=>1000,31753=>1000,31754=>1000,31755=>1000,31756=>1000,31757=>1000,31758=>1000,31759=>1000,31760=>1000,31761=>1000,31762=>1000,31763=>1000,31764=>1000, + 31765=>1000,31766=>1000,31767=>1000,31768=>1000,31769=>1000,31770=>1000,31771=>1000,31772=>1000,31773=>1000,31774=>1000,31775=>1000,31776=>1000,31777=>1000,31778=>1000,31779=>1000,31780=>1000, + 31781=>1000,31782=>1000,31783=>1000,31784=>1000,31785=>1000,31786=>1000,31787=>1000,31788=>1000,31789=>1000,31790=>1000,31791=>1000,31792=>1000,31793=>1000,31794=>1000,31795=>1000,31796=>1000, + 31797=>1000,31798=>1000,31799=>1000,31800=>1000,31801=>1000,31802=>1000,31803=>1000,31804=>1000,31805=>1000,31806=>1000,31807=>1000,31808=>1000,31809=>1000,31810=>1000,31811=>1000,31812=>1000, + 31813=>1000,31814=>1000,31815=>1000,31816=>1000,31817=>1000,31818=>1000,31819=>1000,31820=>1000,31821=>1000,31822=>1000,31823=>1000,31824=>1000,31825=>1000,31826=>1000,31827=>1000,31828=>1000, + 31829=>1000,31830=>1000,31831=>1000,31832=>1000,31833=>1000,31834=>1000,31835=>1000,31836=>1000,31837=>1000,31838=>1000,31839=>1000,31840=>1000,31841=>1000,31842=>1000,31843=>1000,31844=>1000, + 31845=>1000,31846=>1000,31847=>1000,31848=>1000,31849=>1000,31850=>1000,31851=>1000,31852=>1000,31853=>1000,31854=>1000,31855=>1000,31856=>1000,31857=>1000,31858=>1000,31859=>1000,31860=>1000, + 31861=>1000,31862=>1000,31863=>1000,31864=>1000,31865=>1000,31866=>1000,31867=>1000,31868=>1000,31869=>1000,31870=>1000,31871=>1000,31872=>1000,31873=>1000,31874=>1000,31875=>1000,31876=>1000, + 31877=>1000,31878=>1000,31879=>1000,31880=>1000,31881=>1000,31882=>1000,31883=>1000,31884=>1000,31885=>1000,31886=>1000,31887=>1000,31888=>1000,31889=>1000,31890=>1000,31891=>1000,31892=>1000, + 31893=>1000,31894=>1000,31895=>1000,31896=>1000,31897=>1000,31898=>1000,31899=>1000,31900=>1000,31901=>1000,31902=>1000,31903=>1000,31904=>1000,31905=>1000,31906=>1000,31907=>1000,31908=>1000, + 31909=>1000,31910=>1000,31911=>1000,31912=>1000,31913=>1000,31914=>1000,31915=>1000,31916=>1000,31917=>1000,31918=>1000,31919=>1000,31920=>1000,31921=>1000,31922=>1000,31923=>1000,31924=>1000, + 31925=>1000,31926=>1000,31927=>1000,31928=>1000,31929=>1000,31930=>1000,31931=>1000,31932=>1000,31933=>1000,31934=>1000,31935=>1000,31936=>1000,31937=>1000,31938=>1000,31939=>1000,31940=>1000, + 31941=>1000,31942=>1000,31943=>1000,31944=>1000,31945=>1000,31946=>1000,31947=>1000,31948=>1000,31949=>1000,31950=>1000,31951=>1000,31952=>1000,31953=>1000,31954=>1000,31955=>1000,31956=>1000, + 31957=>1000,31958=>1000,31959=>1000,31960=>1000,31961=>1000,31962=>1000,31963=>1000,31964=>1000,31965=>1000,31966=>1000,31967=>1000,31968=>1000,31969=>1000,31970=>1000,31971=>1000,31972=>1000, + 31973=>1000,31974=>1000,31975=>1000,31976=>1000,31977=>1000,31978=>1000,31979=>1000,31980=>1000,31981=>1000,31982=>1000,31983=>1000,31984=>1000,31985=>1000,31986=>1000,31987=>1000,31988=>1000, + 31989=>1000,31990=>1000,31991=>1000,31992=>1000,31993=>1000,31994=>1000,31995=>1000,31996=>1000,31997=>1000,31998=>1000,31999=>1000,32000=>1000,32001=>1000,32002=>1000,32003=>1000,32004=>1000, + 32005=>1000,32006=>1000,32007=>1000,32008=>1000,32009=>1000,32010=>1000,32011=>1000,32012=>1000,32013=>1000,32014=>1000,32015=>1000,32016=>1000,32017=>1000,32018=>1000,32019=>1000,32020=>1000, + 32021=>1000,32022=>1000,32023=>1000,32024=>1000,32025=>1000,32026=>1000,32027=>1000,32028=>1000,32029=>1000,32030=>1000,32031=>1000,32032=>1000,32033=>1000,32034=>1000,32035=>1000,32036=>1000, + 32037=>1000,32038=>1000,32039=>1000,32040=>1000,32041=>1000,32042=>1000,32043=>1000,32044=>1000,32045=>1000,32046=>1000,32047=>1000,32048=>1000,32049=>1000,32050=>1000,32051=>1000,32052=>1000, + 32053=>1000,32054=>1000,32055=>1000,32056=>1000,32057=>1000,32058=>1000,32059=>1000,32060=>1000,32061=>1000,32062=>1000,32063=>1000,32064=>1000,32065=>1000,32066=>1000,32067=>1000,32068=>1000, + 32069=>1000,32070=>1000,32071=>1000,32072=>1000,32073=>1000,32074=>1000,32075=>1000,32076=>1000,32077=>1000,32078=>1000,32079=>1000,32080=>1000,32081=>1000,32082=>1000,32083=>1000,32084=>1000, + 32085=>1000,32086=>1000,32087=>1000,32088=>1000,32089=>1000,32090=>1000,32091=>1000,32092=>1000,32093=>1000,32094=>1000,32095=>1000,32096=>1000,32097=>1000,32098=>1000,32099=>1000,32100=>1000, + 32101=>1000,32102=>1000,32103=>1000,32104=>1000,32105=>1000,32106=>1000,32107=>1000,32108=>1000,32109=>1000,32110=>1000,32111=>1000,32112=>1000,32113=>1000,32114=>1000,32115=>1000,32116=>1000, + 32117=>1000,32118=>1000,32119=>1000,32120=>1000,32121=>1000,32122=>1000,32123=>1000,32124=>1000,32125=>1000,32126=>1000,32127=>1000,32128=>1000,32129=>1000,32130=>1000,32131=>1000,32132=>1000, + 32133=>1000,32134=>1000,32135=>1000,32136=>1000,32137=>1000,32138=>1000,32139=>1000,32140=>1000,32141=>1000,32142=>1000,32143=>1000,32144=>1000,32145=>1000,32146=>1000,32147=>1000,32148=>1000, + 32149=>1000,32150=>1000,32151=>1000,32152=>1000,32153=>1000,32154=>1000,32155=>1000,32156=>1000,32157=>1000,32158=>1000,32159=>1000,32160=>1000,32161=>1000,32162=>1000,32163=>1000,32164=>1000, + 32165=>1000,32166=>1000,32167=>1000,32168=>1000,32169=>1000,32170=>1000,32171=>1000,32172=>1000,32173=>1000,32174=>1000,32175=>1000,32176=>1000,32177=>1000,32178=>1000,32179=>1000,32180=>1000, + 32181=>1000,32182=>1000,32183=>1000,32184=>1000,32185=>1000,32186=>1000,32187=>1000,32188=>1000,32189=>1000,32190=>1000,32191=>1000,32192=>1000,32193=>1000,32194=>1000,32195=>1000,32196=>1000, + 32197=>1000,32198=>1000,32199=>1000,32200=>1000,32201=>1000,32202=>1000,32203=>1000,32204=>1000,32205=>1000,32206=>1000,32207=>1000,32208=>1000,32209=>1000,32210=>1000,32211=>1000,32212=>1000, + 32213=>1000,32214=>1000,32215=>1000,32216=>1000,32217=>1000,32218=>1000,32219=>1000,32220=>1000,32221=>1000,32222=>1000,32223=>1000,32224=>1000,32225=>1000,32226=>1000,32227=>1000,32228=>1000, + 32229=>1000,32230=>1000,32231=>1000,32232=>1000,32233=>1000,32234=>1000,32235=>1000,32236=>1000,32237=>1000,32238=>1000,32239=>1000,32240=>1000,32241=>1000,32242=>1000,32243=>1000,32244=>1000, + 32245=>1000,32246=>1000,32247=>1000,32248=>1000,32249=>1000,32250=>1000,32251=>1000,32252=>1000,32253=>1000,32254=>1000,32255=>1000,32256=>1000,32257=>1000,32258=>1000,32259=>1000,32260=>1000, + 32261=>1000,32262=>1000,32263=>1000,32264=>1000,32265=>1000,32266=>1000,32267=>1000,32268=>1000,32269=>1000,32270=>1000,32271=>1000,32272=>1000,32273=>1000,32274=>1000,32275=>1000,32276=>1000, + 32277=>1000,32278=>1000,32279=>1000,32280=>1000,32281=>1000,32282=>1000,32283=>1000,32284=>1000,32285=>1000,32286=>1000,32287=>1000,32288=>1000,32289=>1000,32290=>1000,32291=>1000,32292=>1000, + 32293=>1000,32294=>1000,32295=>1000,32296=>1000,32297=>1000,32298=>1000,32299=>1000,32300=>1000,32301=>1000,32302=>1000,32303=>1000,32304=>1000,32305=>1000,32306=>1000,32307=>1000,32308=>1000, + 32309=>1000,32310=>1000,32311=>1000,32312=>1000,32313=>1000,32314=>1000,32315=>1000,32316=>1000,32317=>1000,32318=>1000,32319=>1000,32320=>1000,32321=>1000,32322=>1000,32323=>1000,32324=>1000, + 32325=>1000,32326=>1000,32327=>1000,32328=>1000,32329=>1000,32330=>1000,32331=>1000,32332=>1000,32333=>1000,32334=>1000,32335=>1000,32336=>1000,32337=>1000,32338=>1000,32339=>1000,32340=>1000, + 32341=>1000,32342=>1000,32343=>1000,32344=>1000,32345=>1000,32346=>1000,32347=>1000,32348=>1000,32349=>1000,32350=>1000,32351=>1000,32352=>1000,32353=>1000,32354=>1000,32355=>1000,32356=>1000, + 32357=>1000,32358=>1000,32359=>1000,32360=>1000,32361=>1000,32362=>1000,32363=>1000,32364=>1000,32365=>1000,32366=>1000,32367=>1000,32368=>1000,32369=>1000,32370=>1000,32371=>1000,32372=>1000, + 32373=>1000,32374=>1000,32375=>1000,32376=>1000,32377=>1000,32378=>1000,32379=>1000,32380=>1000,32381=>1000,32382=>1000,32383=>1000,32384=>1000,32385=>1000,32386=>1000,32387=>1000,32388=>1000, + 32389=>1000,32390=>1000,32391=>1000,32392=>1000,32393=>1000,32394=>1000,32395=>1000,32396=>1000,32397=>1000,32398=>1000,32399=>1000,32400=>1000,32401=>1000,32402=>1000,32403=>1000,32404=>1000, + 32405=>1000,32406=>1000,32407=>1000,32408=>1000,32409=>1000,32410=>1000,32411=>1000,32412=>1000,32413=>1000,32414=>1000,32415=>1000,32416=>1000,32417=>1000,32418=>1000,32419=>1000,32420=>1000, + 32421=>1000,32422=>1000,32423=>1000,32424=>1000,32425=>1000,32426=>1000,32427=>1000,32428=>1000,32429=>1000,32430=>1000,32431=>1000,32432=>1000,32433=>1000,32434=>1000,32435=>1000,32436=>1000, + 32437=>1000,32438=>1000,32439=>1000,32440=>1000,32441=>1000,32442=>1000,32443=>1000,32444=>1000,32445=>1000,32446=>1000,32447=>1000,32448=>1000,32449=>1000,32450=>1000,32451=>1000,32452=>1000, + 32453=>1000,32454=>1000,32455=>1000,32456=>1000,32457=>1000,32458=>1000,32459=>1000,32460=>1000,32461=>1000,32462=>1000,32463=>1000,32464=>1000,32465=>1000,32466=>1000,32467=>1000,32468=>1000, + 32469=>1000,32470=>1000,32471=>1000,32472=>1000,32473=>1000,32474=>1000,32475=>1000,32476=>1000,32477=>1000,32478=>1000,32479=>1000,32480=>1000,32481=>1000,32482=>1000,32483=>1000,32484=>1000, + 32485=>1000,32486=>1000,32487=>1000,32488=>1000,32489=>1000,32490=>1000,32491=>1000,32492=>1000,32493=>1000,32494=>1000,32495=>1000,32496=>1000,32497=>1000,32498=>1000,32499=>1000,32500=>1000, + 32501=>1000,32502=>1000,32503=>1000,32504=>1000,32505=>1000,32506=>1000,32507=>1000,32508=>1000,32509=>1000,32510=>1000,32511=>1000,32512=>1000,32513=>1000,32514=>1000,32515=>1000,32516=>1000, + 32517=>1000,32518=>1000,32519=>1000,32520=>1000,32521=>1000,32522=>1000,32523=>1000,32524=>1000,32525=>1000,32526=>1000,32527=>1000,32528=>1000,32529=>1000,32530=>1000,32531=>1000,32532=>1000, + 32533=>1000,32534=>1000,32535=>1000,32536=>1000,32537=>1000,32538=>1000,32539=>1000,32540=>1000,32541=>1000,32542=>1000,32543=>1000,32544=>1000,32545=>1000,32546=>1000,32547=>1000,32548=>1000, + 32549=>1000,32550=>1000,32551=>1000,32552=>1000,32553=>1000,32554=>1000,32555=>1000,32556=>1000,32557=>1000,32558=>1000,32559=>1000,32560=>1000,32561=>1000,32562=>1000,32563=>1000,32564=>1000, + 32565=>1000,32566=>1000,32567=>1000,32568=>1000,32569=>1000,32570=>1000,32571=>1000,32572=>1000,32573=>1000,32574=>1000,32575=>1000,32576=>1000,32577=>1000,32578=>1000,32579=>1000,32580=>1000, + 32581=>1000,32582=>1000,32583=>1000,32584=>1000,32585=>1000,32586=>1000,32587=>1000,32588=>1000,32589=>1000,32590=>1000,32591=>1000,32592=>1000,32593=>1000,32594=>1000,32595=>1000,32596=>1000, + 32597=>1000,32598=>1000,32599=>1000,32600=>1000,32601=>1000,32602=>1000,32603=>1000,32604=>1000,32605=>1000,32606=>1000,32607=>1000,32608=>1000,32609=>1000,32610=>1000,32611=>1000,32612=>1000, + 32613=>1000,32614=>1000,32615=>1000,32616=>1000,32617=>1000,32618=>1000,32619=>1000,32620=>1000,32621=>1000,32622=>1000,32623=>1000,32624=>1000,32625=>1000,32626=>1000,32627=>1000,32628=>1000, + 32629=>1000,32630=>1000,32631=>1000,32632=>1000,32633=>1000,32634=>1000,32635=>1000,32636=>1000,32637=>1000,32638=>1000,32639=>1000,32640=>1000,32641=>1000,32642=>1000,32643=>1000,32644=>1000, + 32645=>1000,32646=>1000,32647=>1000,32648=>1000,32649=>1000,32650=>1000,32651=>1000,32652=>1000,32653=>1000,32654=>1000,32655=>1000,32656=>1000,32657=>1000,32658=>1000,32659=>1000,32660=>1000, + 32661=>1000,32662=>1000,32663=>1000,32664=>1000,32665=>1000,32666=>1000,32667=>1000,32668=>1000,32669=>1000,32670=>1000,32671=>1000,32672=>1000,32673=>1000,32674=>1000,32675=>1000,32676=>1000, + 32677=>1000,32678=>1000,32679=>1000,32680=>1000,32681=>1000,32682=>1000,32683=>1000,32684=>1000,32685=>1000,32686=>1000,32687=>1000,32688=>1000,32689=>1000,32690=>1000,32691=>1000,32692=>1000, + 32693=>1000,32694=>1000,32695=>1000,32696=>1000,32697=>1000,32698=>1000,32699=>1000,32700=>1000,32701=>1000,32702=>1000,32703=>1000,32704=>1000,32705=>1000,32706=>1000,32707=>1000,32708=>1000, + 32709=>1000,32710=>1000,32711=>1000,32712=>1000,32713=>1000,32714=>1000,32715=>1000,32716=>1000,32717=>1000,32718=>1000,32719=>1000,32720=>1000,32721=>1000,32722=>1000,32723=>1000,32724=>1000, + 32725=>1000,32726=>1000,32727=>1000,32728=>1000,32729=>1000,32730=>1000,32731=>1000,32732=>1000,32733=>1000,32734=>1000,32735=>1000,32736=>1000,32737=>1000,32738=>1000,32739=>1000,32740=>1000, + 32741=>1000,32742=>1000,32743=>1000,32744=>1000,32745=>1000,32746=>1000,32747=>1000,32748=>1000,32749=>1000,32750=>1000,32751=>1000,32752=>1000,32753=>1000,32754=>1000,32755=>1000,32756=>1000, + 32757=>1000,32758=>1000,32759=>1000,32760=>1000,32761=>1000,32762=>1000,32763=>1000,32764=>1000,32765=>1000,32766=>1000,32767=>1000,32768=>1000,32769=>1000,32770=>1000,32771=>1000,32772=>1000, + 32773=>1000,32774=>1000,32775=>1000,32776=>1000,32777=>1000,32778=>1000,32779=>1000,32780=>1000,32781=>1000,32782=>1000,32783=>1000,32784=>1000,32785=>1000,32786=>1000,32787=>1000,32788=>1000, + 32789=>1000,32790=>1000,32791=>1000,32792=>1000,32793=>1000,32794=>1000,32795=>1000,32796=>1000,32797=>1000,32798=>1000,32799=>1000,32800=>1000,32801=>1000,32802=>1000,32803=>1000,32804=>1000, + 32805=>1000,32806=>1000,32807=>1000,32808=>1000,32809=>1000,32810=>1000,32811=>1000,32812=>1000,32813=>1000,32814=>1000,32815=>1000,32816=>1000,32817=>1000,32818=>1000,32819=>1000,32820=>1000, + 32821=>1000,32822=>1000,32823=>1000,32824=>1000,32825=>1000,32826=>1000,32827=>1000,32828=>1000,32829=>1000,32830=>1000,32831=>1000,32832=>1000,32833=>1000,32834=>1000,32835=>1000,32836=>1000, + 32837=>1000,32838=>1000,32839=>1000,32840=>1000,32841=>1000,32842=>1000,32843=>1000,32844=>1000,32845=>1000,32846=>1000,32847=>1000,32848=>1000,32849=>1000,32850=>1000,32851=>1000,32852=>1000, + 32853=>1000,32854=>1000,32855=>1000,32856=>1000,32857=>1000,32858=>1000,32859=>1000,32860=>1000,32861=>1000,32862=>1000,32863=>1000,32864=>1000,32865=>1000,32866=>1000,32867=>1000,32868=>1000, + 32869=>1000,32870=>1000,32871=>1000,32872=>1000,32873=>1000,32874=>1000,32875=>1000,32876=>1000,32877=>1000,32878=>1000,32879=>1000,32880=>1000,32881=>1000,32882=>1000,32883=>1000,32884=>1000, + 32885=>1000,32886=>1000,32887=>1000,32888=>1000,32889=>1000,32890=>1000,32891=>1000,32892=>1000,32893=>1000,32894=>1000,32895=>1000,32896=>1000,32897=>1000,32898=>1000,32899=>1000,32900=>1000, + 32901=>1000,32902=>1000,32903=>1000,32904=>1000,32905=>1000,32906=>1000,32907=>1000,32908=>1000,32909=>1000,32910=>1000,32911=>1000,32912=>1000,32913=>1000,32914=>1000,32915=>1000,32916=>1000, + 32917=>1000,32918=>1000,32919=>1000,32920=>1000,32921=>1000,32922=>1000,32923=>1000,32924=>1000,32925=>1000,32926=>1000,32927=>1000,32928=>1000,32929=>1000,32930=>1000,32931=>1000,32932=>1000, + 32933=>1000,32934=>1000,32935=>1000,32936=>1000,32937=>1000,32938=>1000,32939=>1000,32940=>1000,32941=>1000,32942=>1000,32943=>1000,32944=>1000,32945=>1000,32946=>1000,32947=>1000,32948=>1000, + 32949=>1000,32950=>1000,32951=>1000,32952=>1000,32953=>1000,32954=>1000,32955=>1000,32956=>1000,32957=>1000,32958=>1000,32959=>1000,32960=>1000,32961=>1000,32962=>1000,32963=>1000,32964=>1000, + 32965=>1000,32966=>1000,32967=>1000,32968=>1000,32969=>1000,32970=>1000,32971=>1000,32972=>1000,32973=>1000,32974=>1000,32975=>1000,32976=>1000,32977=>1000,32978=>1000,32979=>1000,32980=>1000, + 32981=>1000,32982=>1000,32983=>1000,32984=>1000,32985=>1000,32986=>1000,32987=>1000,32988=>1000,32989=>1000,32990=>1000,32991=>1000,32992=>1000,32993=>1000,32994=>1000,32995=>1000,32996=>1000, + 32997=>1000,32998=>1000,32999=>1000,33000=>1000,33001=>1000,33002=>1000,33003=>1000,33004=>1000,33005=>1000,33006=>1000,33007=>1000,33008=>1000,33009=>1000,33010=>1000,33011=>1000,33012=>1000, + 33013=>1000,33014=>1000,33015=>1000,33016=>1000,33017=>1000,33018=>1000,33019=>1000,33020=>1000,33021=>1000,33022=>1000,33023=>1000,33024=>1000,33025=>1000,33026=>1000,33027=>1000,33028=>1000, + 33029=>1000,33030=>1000,33031=>1000,33032=>1000,33033=>1000,33034=>1000,33035=>1000,33036=>1000,33037=>1000,33038=>1000,33039=>1000,33040=>1000,33041=>1000,33042=>1000,33043=>1000,33044=>1000, + 33045=>1000,33046=>1000,33047=>1000,33048=>1000,33049=>1000,33050=>1000,33051=>1000,33052=>1000,33053=>1000,33054=>1000,33055=>1000,33056=>1000,33057=>1000,33058=>1000,33059=>1000,33060=>1000, + 33061=>1000,33062=>1000,33063=>1000,33064=>1000,33065=>1000,33066=>1000,33067=>1000,33068=>1000,33069=>1000,33070=>1000,33071=>1000,33072=>1000,33073=>1000,33074=>1000,33075=>1000,33076=>1000, + 33077=>1000,33078=>1000,33079=>1000,33080=>1000,33081=>1000,33082=>1000,33083=>1000,33084=>1000,33085=>1000,33086=>1000,33087=>1000,33088=>1000,33089=>1000,33090=>1000,33091=>1000,33092=>1000, + 33093=>1000,33094=>1000,33095=>1000,33096=>1000,33097=>1000,33098=>1000,33099=>1000,33100=>1000,33101=>1000,33102=>1000,33103=>1000,33104=>1000,33105=>1000,33106=>1000,33107=>1000,33108=>1000, + 33109=>1000,33110=>1000,33111=>1000,33112=>1000,33113=>1000,33114=>1000,33115=>1000,33116=>1000,33117=>1000,33118=>1000,33119=>1000,33120=>1000,33121=>1000,33122=>1000,33123=>1000,33124=>1000, + 33125=>1000,33126=>1000,33127=>1000,33128=>1000,33129=>1000,33130=>1000,33131=>1000,33132=>1000,33133=>1000,33134=>1000,33135=>1000,33136=>1000,33137=>1000,33138=>1000,33139=>1000,33140=>1000, + 33141=>1000,33142=>1000,33143=>1000,33144=>1000,33145=>1000,33146=>1000,33147=>1000,33148=>1000,33149=>1000,33150=>1000,33151=>1000,33152=>1000,33153=>1000,33154=>1000,33155=>1000,33156=>1000, + 33157=>1000,33158=>1000,33159=>1000,33160=>1000,33161=>1000,33162=>1000,33163=>1000,33164=>1000,33165=>1000,33166=>1000,33167=>1000,33168=>1000,33169=>1000,33170=>1000,33171=>1000,33172=>1000, + 33173=>1000,33174=>1000,33175=>1000,33176=>1000,33177=>1000,33178=>1000,33179=>1000,33180=>1000,33181=>1000,33182=>1000,33183=>1000,33184=>1000,33185=>1000,33186=>1000,33187=>1000,33188=>1000, + 33189=>1000,33190=>1000,33191=>1000,33192=>1000,33193=>1000,33194=>1000,33195=>1000,33196=>1000,33197=>1000,33198=>1000,33199=>1000,33200=>1000,33201=>1000,33202=>1000,33203=>1000,33204=>1000, + 33205=>1000,33206=>1000,33207=>1000,33208=>1000,33209=>1000,33210=>1000,33211=>1000,33212=>1000,33213=>1000,33214=>1000,33215=>1000,33216=>1000,33217=>1000,33218=>1000,33219=>1000,33220=>1000, + 33221=>1000,33222=>1000,33223=>1000,33224=>1000,33225=>1000,33226=>1000,33227=>1000,33228=>1000,33229=>1000,33230=>1000,33231=>1000,33232=>1000,33233=>1000,33234=>1000,33235=>1000,33236=>1000, + 33237=>1000,33238=>1000,33239=>1000,33240=>1000,33241=>1000,33242=>1000,33243=>1000,33244=>1000,33245=>1000,33246=>1000,33247=>1000,33248=>1000,33249=>1000,33250=>1000,33251=>1000,33252=>1000, + 33253=>1000,33254=>1000,33255=>1000,33256=>1000,33257=>1000,33258=>1000,33259=>1000,33260=>1000,33261=>1000,33262=>1000,33263=>1000,33264=>1000,33265=>1000,33266=>1000,33267=>1000,33268=>1000, + 33269=>1000,33270=>1000,33271=>1000,33272=>1000,33273=>1000,33274=>1000,33275=>1000,33276=>1000,33277=>1000,33278=>1000,33279=>1000,33280=>1000,33281=>1000,33282=>1000,33283=>1000,33284=>1000, + 33285=>1000,33286=>1000,33287=>1000,33288=>1000,33289=>1000,33290=>1000,33291=>1000,33292=>1000,33293=>1000,33294=>1000,33295=>1000,33296=>1000,33297=>1000,33298=>1000,33299=>1000,33300=>1000, + 33301=>1000,33302=>1000,33303=>1000,33304=>1000,33305=>1000,33306=>1000,33307=>1000,33308=>1000,33309=>1000,33310=>1000,33311=>1000,33312=>1000,33313=>1000,33314=>1000,33315=>1000,33316=>1000, + 33317=>1000,33318=>1000,33319=>1000,33320=>1000,33321=>1000,33322=>1000,33323=>1000,33324=>1000,33325=>1000,33326=>1000,33327=>1000,33328=>1000,33329=>1000,33330=>1000,33331=>1000,33332=>1000, + 33333=>1000,33334=>1000,33335=>1000,33336=>1000,33337=>1000,33338=>1000,33339=>1000,33340=>1000,33341=>1000,33342=>1000,33343=>1000,33344=>1000,33345=>1000,33346=>1000,33347=>1000,33348=>1000, + 33349=>1000,33350=>1000,33351=>1000,33352=>1000,33353=>1000,33354=>1000,33355=>1000,33356=>1000,33357=>1000,33358=>1000,33359=>1000,33360=>1000,33361=>1000,33362=>1000,33363=>1000,33364=>1000, + 33365=>1000,33366=>1000,33367=>1000,33368=>1000,33369=>1000,33370=>1000,33371=>1000,33372=>1000,33373=>1000,33374=>1000,33375=>1000,33376=>1000,33377=>1000,33378=>1000,33379=>1000,33380=>1000, + 33381=>1000,33382=>1000,33383=>1000,33384=>1000,33385=>1000,33386=>1000,33387=>1000,33388=>1000,33389=>1000,33390=>1000,33391=>1000,33392=>1000,33393=>1000,33394=>1000,33395=>1000,33396=>1000, + 33397=>1000,33398=>1000,33399=>1000,33400=>1000,33401=>1000,33402=>1000,33403=>1000,33404=>1000,33405=>1000,33406=>1000,33407=>1000,33408=>1000,33409=>1000,33410=>1000,33411=>1000,33412=>1000, + 33413=>1000,33414=>1000,33415=>1000,33416=>1000,33417=>1000,33418=>1000,33419=>1000,33420=>1000,33421=>1000,33422=>1000,33423=>1000,33424=>1000,33425=>1000,33426=>1000,33427=>1000,33428=>1000, + 33429=>1000,33430=>1000,33431=>1000,33432=>1000,33433=>1000,33434=>1000,33435=>1000,33436=>1000,33437=>1000,33438=>1000,33439=>1000,33440=>1000,33441=>1000,33442=>1000,33443=>1000,33444=>1000, + 33445=>1000,33446=>1000,33447=>1000,33448=>1000,33449=>1000,33450=>1000,33451=>1000,33452=>1000,33453=>1000,33454=>1000,33455=>1000,33456=>1000,33457=>1000,33458=>1000,33459=>1000,33460=>1000, + 33461=>1000,33462=>1000,33463=>1000,33464=>1000,33465=>1000,33466=>1000,33467=>1000,33468=>1000,33469=>1000,33470=>1000,33471=>1000,33472=>1000,33473=>1000,33474=>1000,33475=>1000,33476=>1000, + 33477=>1000,33478=>1000,33479=>1000,33480=>1000,33481=>1000,33482=>1000,33483=>1000,33484=>1000,33485=>1000,33486=>1000,33487=>1000,33488=>1000,33489=>1000,33490=>1000,33491=>1000,33492=>1000, + 33493=>1000,33494=>1000,33495=>1000,33496=>1000,33497=>1000,33498=>1000,33499=>1000,33500=>1000,33501=>1000,33502=>1000,33503=>1000,33504=>1000,33505=>1000,33506=>1000,33507=>1000,33508=>1000, + 33509=>1000,33510=>1000,33511=>1000,33512=>1000,33513=>1000,33514=>1000,33515=>1000,33516=>1000,33517=>1000,33518=>1000,33519=>1000,33520=>1000,33521=>1000,33522=>1000,33523=>1000,33524=>1000, + 33525=>1000,33526=>1000,33527=>1000,33528=>1000,33529=>1000,33530=>1000,33531=>1000,33532=>1000,33533=>1000,33534=>1000,33535=>1000,33536=>1000,33537=>1000,33538=>1000,33539=>1000,33540=>1000, + 33541=>1000,33542=>1000,33543=>1000,33544=>1000,33545=>1000,33546=>1000,33547=>1000,33548=>1000,33549=>1000,33550=>1000,33551=>1000,33552=>1000,33553=>1000,33554=>1000,33555=>1000,33556=>1000, + 33557=>1000,33558=>1000,33559=>1000,33560=>1000,33561=>1000,33562=>1000,33563=>1000,33564=>1000,33565=>1000,33566=>1000,33567=>1000,33568=>1000,33569=>1000,33570=>1000,33571=>1000,33572=>1000, + 33573=>1000,33574=>1000,33575=>1000,33576=>1000,33577=>1000,33578=>1000,33579=>1000,33580=>1000,33581=>1000,33582=>1000,33583=>1000,33584=>1000,33585=>1000,33586=>1000,33587=>1000,33588=>1000, + 33589=>1000,33590=>1000,33591=>1000,33592=>1000,33593=>1000,33594=>1000,33595=>1000,33596=>1000,33597=>1000,33598=>1000,33599=>1000,33600=>1000,33601=>1000,33602=>1000,33603=>1000,33604=>1000, + 33605=>1000,33606=>1000,33607=>1000,33608=>1000,33609=>1000,33610=>1000,33611=>1000,33612=>1000,33613=>1000,33614=>1000,33615=>1000,33616=>1000,33617=>1000,33618=>1000,33619=>1000,33620=>1000, + 33621=>1000,33622=>1000,33623=>1000,33624=>1000,33625=>1000,33626=>1000,33627=>1000,33628=>1000,33629=>1000,33630=>1000,33631=>1000,33632=>1000,33633=>1000,33634=>1000,33635=>1000,33636=>1000, + 33637=>1000,33638=>1000,33639=>1000,33640=>1000,33641=>1000,33642=>1000,33643=>1000,33644=>1000,33645=>1000,33646=>1000,33647=>1000,33648=>1000,33649=>1000,33650=>1000,33651=>1000,33652=>1000, + 33653=>1000,33654=>1000,33655=>1000,33656=>1000,33657=>1000,33658=>1000,33659=>1000,33660=>1000,33661=>1000,33662=>1000,33663=>1000,33664=>1000,33665=>1000,33666=>1000,33667=>1000,33668=>1000, + 33669=>1000,33670=>1000,33671=>1000,33672=>1000,33673=>1000,33674=>1000,33675=>1000,33676=>1000,33677=>1000,33678=>1000,33679=>1000,33680=>1000,33681=>1000,33682=>1000,33683=>1000,33684=>1000, + 33685=>1000,33686=>1000,33687=>1000,33688=>1000,33689=>1000,33690=>1000,33691=>1000,33692=>1000,33693=>1000,33694=>1000,33695=>1000,33696=>1000,33697=>1000,33698=>1000,33699=>1000,33700=>1000, + 33701=>1000,33702=>1000,33703=>1000,33704=>1000,33705=>1000,33706=>1000,33707=>1000,33708=>1000,33709=>1000,33710=>1000,33711=>1000,33712=>1000,33713=>1000,33714=>1000,33715=>1000,33716=>1000, + 33717=>1000,33718=>1000,33719=>1000,33720=>1000,33721=>1000,33722=>1000,33723=>1000,33724=>1000,33725=>1000,33726=>1000,33727=>1000,33728=>1000,33729=>1000,33730=>1000,33731=>1000,33732=>1000, + 33733=>1000,33734=>1000,33735=>1000,33736=>1000,33737=>1000,33738=>1000,33739=>1000,33740=>1000,33741=>1000,33742=>1000,33743=>1000,33744=>1000,33745=>1000,33746=>1000,33747=>1000,33748=>1000, + 33749=>1000,33750=>1000,33751=>1000,33752=>1000,33753=>1000,33754=>1000,33755=>1000,33756=>1000,33757=>1000,33758=>1000,33759=>1000,33760=>1000,33761=>1000,33762=>1000,33763=>1000,33764=>1000, + 33765=>1000,33766=>1000,33767=>1000,33768=>1000,33769=>1000,33770=>1000,33771=>1000,33772=>1000,33773=>1000,33774=>1000,33775=>1000,33776=>1000,33777=>1000,33778=>1000,33779=>1000,33780=>1000, + 33781=>1000,33782=>1000,33783=>1000,33784=>1000,33785=>1000,33786=>1000,33787=>1000,33788=>1000,33789=>1000,33790=>1000,33791=>1000,33792=>1000,33793=>1000,33794=>1000,33795=>1000,33796=>1000, + 33797=>1000,33798=>1000,33799=>1000,33800=>1000,33801=>1000,33802=>1000,33803=>1000,33804=>1000,33805=>1000,33806=>1000,33807=>1000,33808=>1000,33809=>1000,33810=>1000,33811=>1000,33812=>1000, + 33813=>1000,33814=>1000,33815=>1000,33816=>1000,33817=>1000,33818=>1000,33819=>1000,33820=>1000,33821=>1000,33822=>1000,33823=>1000,33824=>1000,33825=>1000,33826=>1000,33827=>1000,33828=>1000, + 33829=>1000,33830=>1000,33831=>1000,33832=>1000,33833=>1000,33834=>1000,33835=>1000,33836=>1000,33837=>1000,33838=>1000,33839=>1000,33840=>1000,33841=>1000,33842=>1000,33843=>1000,33844=>1000, + 33845=>1000,33846=>1000,33847=>1000,33848=>1000,33849=>1000,33850=>1000,33851=>1000,33852=>1000,33853=>1000,33854=>1000,33855=>1000,33856=>1000,33857=>1000,33858=>1000,33859=>1000,33860=>1000, + 33861=>1000,33862=>1000,33863=>1000,33864=>1000,33865=>1000,33866=>1000,33867=>1000,33868=>1000,33869=>1000,33870=>1000,33871=>1000,33872=>1000,33873=>1000,33874=>1000,33875=>1000,33876=>1000, + 33877=>1000,33878=>1000,33879=>1000,33880=>1000,33881=>1000,33882=>1000,33883=>1000,33884=>1000,33885=>1000,33886=>1000,33887=>1000,33888=>1000,33889=>1000,33890=>1000,33891=>1000,33892=>1000, + 33893=>1000,33894=>1000,33895=>1000,33896=>1000,33897=>1000,33898=>1000,33899=>1000,33900=>1000,33901=>1000,33902=>1000,33903=>1000,33904=>1000,33905=>1000,33906=>1000,33907=>1000,33908=>1000, + 33909=>1000,33910=>1000,33911=>1000,33912=>1000,33913=>1000,33914=>1000,33915=>1000,33916=>1000,33917=>1000,33918=>1000,33919=>1000,33920=>1000,33921=>1000,33922=>1000,33923=>1000,33924=>1000, + 33925=>1000,33926=>1000,33927=>1000,33928=>1000,33929=>1000,33930=>1000,33931=>1000,33932=>1000,33933=>1000,33934=>1000,33935=>1000,33936=>1000,33937=>1000,33938=>1000,33939=>1000,33940=>1000, + 33941=>1000,33942=>1000,33943=>1000,33944=>1000,33945=>1000,33946=>1000,33947=>1000,33948=>1000,33949=>1000,33950=>1000,33951=>1000,33952=>1000,33953=>1000,33954=>1000,33955=>1000,33956=>1000, + 33957=>1000,33958=>1000,33959=>1000,33960=>1000,33961=>1000,33962=>1000,33963=>1000,33964=>1000,33965=>1000,33966=>1000,33967=>1000,33968=>1000,33969=>1000,33970=>1000,33971=>1000,33972=>1000, + 33973=>1000,33974=>1000,33975=>1000,33976=>1000,33977=>1000,33978=>1000,33979=>1000,33980=>1000,33981=>1000,33982=>1000,33983=>1000,33984=>1000,33985=>1000,33986=>1000,33987=>1000,33988=>1000, + 33989=>1000,33990=>1000,33991=>1000,33992=>1000,33993=>1000,33994=>1000,33995=>1000,33996=>1000,33997=>1000,33998=>1000,33999=>1000,34000=>1000,34001=>1000,34002=>1000,34003=>1000,34004=>1000, + 34005=>1000,34006=>1000,34007=>1000,34008=>1000,34009=>1000,34010=>1000,34011=>1000,34012=>1000,34013=>1000,34014=>1000,34015=>1000,34016=>1000,34017=>1000,34018=>1000,34019=>1000,34020=>1000, + 34021=>1000,34022=>1000,34023=>1000,34024=>1000,34025=>1000,34026=>1000,34027=>1000,34028=>1000,34029=>1000,34030=>1000,34031=>1000,34032=>1000,34033=>1000,34034=>1000,34035=>1000,34036=>1000, + 34037=>1000,34038=>1000,34039=>1000,34040=>1000,34041=>1000,34042=>1000,34043=>1000,34044=>1000,34045=>1000,34046=>1000,34047=>1000,34048=>1000,34049=>1000,34050=>1000,34051=>1000,34052=>1000, + 34053=>1000,34054=>1000,34055=>1000,34056=>1000,34057=>1000,34058=>1000,34059=>1000,34060=>1000,34061=>1000,34062=>1000,34063=>1000,34064=>1000,34065=>1000,34066=>1000,34067=>1000,34068=>1000, + 34069=>1000,34070=>1000,34071=>1000,34072=>1000,34073=>1000,34074=>1000,34075=>1000,34076=>1000,34077=>1000,34078=>1000,34079=>1000,34080=>1000,34081=>1000,34082=>1000,34083=>1000,34084=>1000, + 34085=>1000,34086=>1000,34087=>1000,34088=>1000,34089=>1000,34090=>1000,34091=>1000,34092=>1000,34093=>1000,34094=>1000,34095=>1000,34096=>1000,34097=>1000,34098=>1000,34099=>1000,34100=>1000, + 34101=>1000,34102=>1000,34103=>1000,34104=>1000,34105=>1000,34106=>1000,34107=>1000,34108=>1000,34109=>1000,34110=>1000,34111=>1000,34112=>1000,34113=>1000,34114=>1000,34115=>1000,34116=>1000, + 34117=>1000,34118=>1000,34119=>1000,34120=>1000,34121=>1000,34122=>1000,34123=>1000,34124=>1000,34125=>1000,34126=>1000,34127=>1000,34128=>1000,34129=>1000,34130=>1000,34131=>1000,34132=>1000, + 34133=>1000,34134=>1000,34135=>1000,34136=>1000,34137=>1000,34138=>1000,34139=>1000,34140=>1000,34141=>1000,34142=>1000,34143=>1000,34144=>1000,34145=>1000,34146=>1000,34147=>1000,34148=>1000, + 34149=>1000,34150=>1000,34151=>1000,34152=>1000,34153=>1000,34154=>1000,34155=>1000,34156=>1000,34157=>1000,34158=>1000,34159=>1000,34160=>1000,34161=>1000,34162=>1000,34163=>1000,34164=>1000, + 34165=>1000,34166=>1000,34167=>1000,34168=>1000,34169=>1000,34170=>1000,34171=>1000,34172=>1000,34173=>1000,34174=>1000,34175=>1000,34176=>1000,34177=>1000,34178=>1000,34179=>1000,34180=>1000, + 34181=>1000,34182=>1000,34183=>1000,34184=>1000,34185=>1000,34186=>1000,34187=>1000,34188=>1000,34189=>1000,34190=>1000,34191=>1000,34192=>1000,34193=>1000,34194=>1000,34195=>1000,34196=>1000, + 34197=>1000,34198=>1000,34199=>1000,34200=>1000,34201=>1000,34202=>1000,34203=>1000,34204=>1000,34205=>1000,34206=>1000,34207=>1000,34208=>1000,34209=>1000,34210=>1000,34211=>1000,34212=>1000, + 34213=>1000,34214=>1000,34215=>1000,34216=>1000,34217=>1000,34218=>1000,34219=>1000,34220=>1000,34221=>1000,34222=>1000,34223=>1000,34224=>1000,34225=>1000,34226=>1000,34227=>1000,34228=>1000, + 34229=>1000,34230=>1000,34231=>1000,34232=>1000,34233=>1000,34234=>1000,34235=>1000,34236=>1000,34237=>1000,34238=>1000,34239=>1000,34240=>1000,34241=>1000,34242=>1000,34243=>1000,34244=>1000, + 34245=>1000,34246=>1000,34247=>1000,34248=>1000,34249=>1000,34250=>1000,34251=>1000,34252=>1000,34253=>1000,34254=>1000,34255=>1000,34256=>1000,34257=>1000,34258=>1000,34259=>1000,34260=>1000, + 34261=>1000,34262=>1000,34263=>1000,34264=>1000,34265=>1000,34266=>1000,34267=>1000,34268=>1000,34269=>1000,34270=>1000,34271=>1000,34272=>1000,34273=>1000,34274=>1000,34275=>1000,34276=>1000, + 34277=>1000,34278=>1000,34279=>1000,34280=>1000,34281=>1000,34282=>1000,34283=>1000,34284=>1000,34285=>1000,34286=>1000,34287=>1000,34288=>1000,34289=>1000,34290=>1000,34291=>1000,34292=>1000, + 34293=>1000,34294=>1000,34295=>1000,34296=>1000,34297=>1000,34298=>1000,34299=>1000,34300=>1000,34301=>1000,34302=>1000,34303=>1000,34304=>1000,34305=>1000,34306=>1000,34307=>1000,34308=>1000, + 34309=>1000,34310=>1000,34311=>1000,34312=>1000,34313=>1000,34314=>1000,34315=>1000,34316=>1000,34317=>1000,34318=>1000,34319=>1000,34320=>1000,34321=>1000,34322=>1000,34323=>1000,34324=>1000, + 34325=>1000,34326=>1000,34327=>1000,34328=>1000,34329=>1000,34330=>1000,34331=>1000,34332=>1000,34333=>1000,34334=>1000,34335=>1000,34336=>1000,34337=>1000,34338=>1000,34339=>1000,34340=>1000, + 34341=>1000,34342=>1000,34343=>1000,34344=>1000,34345=>1000,34346=>1000,34347=>1000,34348=>1000,34349=>1000,34350=>1000,34351=>1000,34352=>1000,34353=>1000,34354=>1000,34355=>1000,34356=>1000, + 34357=>1000,34358=>1000,34359=>1000,34360=>1000,34361=>1000,34362=>1000,34363=>1000,34364=>1000,34365=>1000,34366=>1000,34367=>1000,34368=>1000,34369=>1000,34370=>1000,34371=>1000,34372=>1000, + 34373=>1000,34374=>1000,34375=>1000,34376=>1000,34377=>1000,34378=>1000,34379=>1000,34380=>1000,34381=>1000,34382=>1000,34383=>1000,34384=>1000,34385=>1000,34386=>1000,34387=>1000,34388=>1000, + 34389=>1000,34390=>1000,34391=>1000,34392=>1000,34393=>1000,34394=>1000,34395=>1000,34396=>1000,34397=>1000,34398=>1000,34399=>1000,34400=>1000,34401=>1000,34402=>1000,34403=>1000,34404=>1000, + 34405=>1000,34406=>1000,34407=>1000,34408=>1000,34409=>1000,34410=>1000,34411=>1000,34412=>1000,34413=>1000,34414=>1000,34415=>1000,34416=>1000,34417=>1000,34418=>1000,34419=>1000,34420=>1000, + 34421=>1000,34422=>1000,34423=>1000,34424=>1000,34425=>1000,34426=>1000,34427=>1000,34428=>1000,34429=>1000,34430=>1000,34431=>1000,34432=>1000,34433=>1000,34434=>1000,34435=>1000,34436=>1000, + 34437=>1000,34438=>1000,34439=>1000,34440=>1000,34441=>1000,34442=>1000,34443=>1000,34444=>1000,34445=>1000,34446=>1000,34447=>1000,34448=>1000,34449=>1000,34450=>1000,34451=>1000,34452=>1000, + 34453=>1000,34454=>1000,34455=>1000,34456=>1000,34457=>1000,34458=>1000,34459=>1000,34460=>1000,34461=>1000,34462=>1000,34463=>1000,34464=>1000,34465=>1000,34466=>1000,34467=>1000,34468=>1000, + 34469=>1000,34470=>1000,34471=>1000,34472=>1000,34473=>1000,34474=>1000,34475=>1000,34476=>1000,34477=>1000,34478=>1000,34479=>1000,34480=>1000,34481=>1000,34482=>1000,34483=>1000,34484=>1000, + 34485=>1000,34486=>1000,34487=>1000,34488=>1000,34489=>1000,34490=>1000,34491=>1000,34492=>1000,34493=>1000,34494=>1000,34495=>1000,34496=>1000,34497=>1000,34498=>1000,34499=>1000,34500=>1000, + 34501=>1000,34502=>1000,34503=>1000,34504=>1000,34505=>1000,34506=>1000,34507=>1000,34508=>1000,34509=>1000,34510=>1000,34511=>1000,34512=>1000,34513=>1000,34514=>1000,34515=>1000,34516=>1000, + 34517=>1000,34518=>1000,34519=>1000,34520=>1000,34521=>1000,34522=>1000,34523=>1000,34524=>1000,34525=>1000,34526=>1000,34527=>1000,34528=>1000,34529=>1000,34530=>1000,34531=>1000,34532=>1000, + 34533=>1000,34534=>1000,34535=>1000,34536=>1000,34537=>1000,34538=>1000,34539=>1000,34540=>1000,34541=>1000,34542=>1000,34543=>1000,34544=>1000,34545=>1000,34546=>1000,34547=>1000,34548=>1000, + 34549=>1000,34550=>1000,34551=>1000,34552=>1000,34553=>1000,34554=>1000,34555=>1000,34556=>1000,34557=>1000,34558=>1000,34559=>1000,34560=>1000,34561=>1000,34562=>1000,34563=>1000,34564=>1000, + 34565=>1000,34566=>1000,34567=>1000,34568=>1000,34569=>1000,34570=>1000,34571=>1000,34572=>1000,34573=>1000,34574=>1000,34575=>1000,34576=>1000,34577=>1000,34578=>1000,34579=>1000,34580=>1000, + 34581=>1000,34582=>1000,34583=>1000,34584=>1000,34585=>1000,34586=>1000,34587=>1000,34588=>1000,34589=>1000,34590=>1000,34591=>1000,34592=>1000,34593=>1000,34594=>1000,34595=>1000,34596=>1000, + 34597=>1000,34598=>1000,34599=>1000,34600=>1000,34601=>1000,34602=>1000,34603=>1000,34604=>1000,34605=>1000,34606=>1000,34607=>1000,34608=>1000,34609=>1000,34610=>1000,34611=>1000,34612=>1000, + 34613=>1000,34614=>1000,34615=>1000,34616=>1000,34617=>1000,34618=>1000,34619=>1000,34620=>1000,34621=>1000,34622=>1000,34623=>1000,34624=>1000,34625=>1000,34626=>1000,34627=>1000,34628=>1000, + 34629=>1000,34630=>1000,34631=>1000,34632=>1000,34633=>1000,34634=>1000,34635=>1000,34636=>1000,34637=>1000,34638=>1000,34639=>1000,34640=>1000,34641=>1000,34642=>1000,34643=>1000,34644=>1000, + 34645=>1000,34646=>1000,34647=>1000,34648=>1000,34649=>1000,34650=>1000,34651=>1000,34652=>1000,34653=>1000,34654=>1000,34655=>1000,34656=>1000,34657=>1000,34658=>1000,34659=>1000,34660=>1000, + 34661=>1000,34662=>1000,34663=>1000,34664=>1000,34665=>1000,34666=>1000,34667=>1000,34668=>1000,34669=>1000,34670=>1000,34671=>1000,34672=>1000,34673=>1000,34674=>1000,34675=>1000,34676=>1000, + 34677=>1000,34678=>1000,34679=>1000,34680=>1000,34681=>1000,34682=>1000,34683=>1000,34684=>1000,34685=>1000,34686=>1000,34687=>1000,34688=>1000,34689=>1000,34690=>1000,34691=>1000,34692=>1000, + 34693=>1000,34694=>1000,34695=>1000,34696=>1000,34697=>1000,34698=>1000,34699=>1000,34700=>1000,34701=>1000,34702=>1000,34703=>1000,34704=>1000,34705=>1000,34706=>1000,34707=>1000,34708=>1000, + 34709=>1000,34710=>1000,34711=>1000,34712=>1000,34713=>1000,34714=>1000,34715=>1000,34716=>1000,34717=>1000,34718=>1000,34719=>1000,34720=>1000,34721=>1000,34722=>1000,34723=>1000,34724=>1000, + 34725=>1000,34726=>1000,34727=>1000,34728=>1000,34729=>1000,34730=>1000,34731=>1000,34732=>1000,34733=>1000,34734=>1000,34735=>1000,34736=>1000,34737=>1000,34738=>1000,34739=>1000,34740=>1000, + 34741=>1000,34742=>1000,34743=>1000,34744=>1000,34745=>1000,34746=>1000,34747=>1000,34748=>1000,34749=>1000,34750=>1000,34751=>1000,34752=>1000,34753=>1000,34754=>1000,34755=>1000,34756=>1000, + 34757=>1000,34758=>1000,34759=>1000,34760=>1000,34761=>1000,34762=>1000,34763=>1000,34764=>1000,34765=>1000,34766=>1000,34767=>1000,34768=>1000,34769=>1000,34770=>1000,34771=>1000,34772=>1000, + 34773=>1000,34774=>1000,34775=>1000,34776=>1000,34777=>1000,34778=>1000,34779=>1000,34780=>1000,34781=>1000,34782=>1000,34783=>1000,34784=>1000,34785=>1000,34786=>1000,34787=>1000,34788=>1000, + 34789=>1000,34790=>1000,34791=>1000,34792=>1000,34793=>1000,34794=>1000,34795=>1000,34796=>1000,34797=>1000,34798=>1000,34799=>1000,34800=>1000,34801=>1000,34802=>1000,34803=>1000,34804=>1000, + 34805=>1000,34806=>1000,34807=>1000,34808=>1000,34809=>1000,34810=>1000,34811=>1000,34812=>1000,34813=>1000,34814=>1000,34815=>1000,34816=>1000,34817=>1000,34818=>1000,34819=>1000,34820=>1000, + 34821=>1000,34822=>1000,34823=>1000,34824=>1000,34825=>1000,34826=>1000,34827=>1000,34828=>1000,34829=>1000,34830=>1000,34831=>1000,34832=>1000,34833=>1000,34834=>1000,34835=>1000,34836=>1000, + 34837=>1000,34838=>1000,34839=>1000,34840=>1000,34841=>1000,34842=>1000,34843=>1000,34844=>1000,34845=>1000,34846=>1000,34847=>1000,34848=>1000,34849=>1000,34850=>1000,34851=>1000,34852=>1000, + 34853=>1000,34854=>1000,34855=>1000,34856=>1000,34857=>1000,34858=>1000,34859=>1000,34860=>1000,34861=>1000,34862=>1000,34863=>1000,34864=>1000,34865=>1000,34866=>1000,34867=>1000,34868=>1000, + 34869=>1000,34870=>1000,34871=>1000,34872=>1000,34873=>1000,34874=>1000,34875=>1000,34876=>1000,34877=>1000,34878=>1000,34879=>1000,34880=>1000,34881=>1000,34882=>1000,34883=>1000,34884=>1000, + 34885=>1000,34886=>1000,34887=>1000,34888=>1000,34889=>1000,34890=>1000,34891=>1000,34892=>1000,34893=>1000,34894=>1000,34895=>1000,34896=>1000,34897=>1000,34898=>1000,34899=>1000,34900=>1000, + 34901=>1000,34902=>1000,34903=>1000,34904=>1000,34905=>1000,34906=>1000,34907=>1000,34908=>1000,34909=>1000,34910=>1000,34911=>1000,34912=>1000,34913=>1000,34914=>1000,34915=>1000,34916=>1000, + 34917=>1000,34918=>1000,34919=>1000,34920=>1000,34921=>1000,34922=>1000,34923=>1000,34924=>1000,34925=>1000,34926=>1000,34927=>1000,34928=>1000,34929=>1000,34930=>1000,34931=>1000,34932=>1000, + 34933=>1000,34934=>1000,34935=>1000,34936=>1000,34937=>1000,34938=>1000,34939=>1000,34940=>1000,34941=>1000,34942=>1000,34943=>1000,34944=>1000,34945=>1000,34946=>1000,34947=>1000,34948=>1000, + 34949=>1000,34950=>1000,34951=>1000,34952=>1000,34953=>1000,34954=>1000,34955=>1000,34956=>1000,34957=>1000,34958=>1000,34959=>1000,34960=>1000,34961=>1000,34962=>1000,34963=>1000,34964=>1000, + 34965=>1000,34966=>1000,34967=>1000,34968=>1000,34969=>1000,34970=>1000,34971=>1000,34972=>1000,34973=>1000,34974=>1000,34975=>1000,34976=>1000,34977=>1000,34978=>1000,34979=>1000,34980=>1000, + 34981=>1000,34982=>1000,34983=>1000,34984=>1000,34985=>1000,34986=>1000,34987=>1000,34988=>1000,34989=>1000,34990=>1000,34991=>1000,34992=>1000,34993=>1000,34994=>1000,34995=>1000,34996=>1000, + 34997=>1000,34998=>1000,34999=>1000,35000=>1000,35001=>1000,35002=>1000,35003=>1000,35004=>1000,35005=>1000,35006=>1000,35007=>1000,35008=>1000,35009=>1000,35010=>1000,35011=>1000,35012=>1000, + 35013=>1000,35014=>1000,35015=>1000,35016=>1000,35017=>1000,35018=>1000,35019=>1000,35020=>1000,35021=>1000,35022=>1000,35023=>1000,35024=>1000,35025=>1000,35026=>1000,35027=>1000,35028=>1000, + 35029=>1000,35030=>1000,35031=>1000,35032=>1000,35033=>1000,35034=>1000,35035=>1000,35036=>1000,35037=>1000,35038=>1000,35039=>1000,35040=>1000,35041=>1000,35042=>1000,35043=>1000,35044=>1000, + 35045=>1000,35046=>1000,35047=>1000,35048=>1000,35049=>1000,35050=>1000,35051=>1000,35052=>1000,35053=>1000,35054=>1000,35055=>1000,35056=>1000,35057=>1000,35058=>1000,35059=>1000,35060=>1000, + 35061=>1000,35062=>1000,35063=>1000,35064=>1000,35065=>1000,35066=>1000,35067=>1000,35068=>1000,35069=>1000,35070=>1000,35071=>1000,35072=>1000,35073=>1000,35074=>1000,35075=>1000,35076=>1000, + 35077=>1000,35078=>1000,35079=>1000,35080=>1000,35081=>1000,35082=>1000,35083=>1000,35084=>1000,35085=>1000,35086=>1000,35087=>1000,35088=>1000,35089=>1000,35090=>1000,35091=>1000,35092=>1000, + 35093=>1000,35094=>1000,35095=>1000,35096=>1000,35097=>1000,35098=>1000,35099=>1000,35100=>1000,35101=>1000,35102=>1000,35103=>1000,35104=>1000,35105=>1000,35106=>1000,35107=>1000,35108=>1000, + 35109=>1000,35110=>1000,35111=>1000,35112=>1000,35113=>1000,35114=>1000,35115=>1000,35116=>1000,35117=>1000,35118=>1000,35119=>1000,35120=>1000,35121=>1000,35122=>1000,35123=>1000,35124=>1000, + 35125=>1000,35126=>1000,35127=>1000,35128=>1000,35129=>1000,35130=>1000,35131=>1000,35132=>1000,35133=>1000,35134=>1000,35135=>1000,35136=>1000,35137=>1000,35138=>1000,35139=>1000,35140=>1000, + 35141=>1000,35142=>1000,35143=>1000,35144=>1000,35145=>1000,35146=>1000,35147=>1000,35148=>1000,35149=>1000,35150=>1000,35151=>1000,35152=>1000,35153=>1000,35154=>1000,35155=>1000,35156=>1000, + 35157=>1000,35158=>1000,35159=>1000,35160=>1000,35161=>1000,35162=>1000,35163=>1000,35164=>1000,35165=>1000,35166=>1000,35167=>1000,35168=>1000,35169=>1000,35170=>1000,35171=>1000,35172=>1000, + 35173=>1000,35174=>1000,35175=>1000,35176=>1000,35177=>1000,35178=>1000,35179=>1000,35180=>1000,35181=>1000,35182=>1000,35183=>1000,35184=>1000,35185=>1000,35186=>1000,35187=>1000,35188=>1000, + 35189=>1000,35190=>1000,35191=>1000,35192=>1000,35193=>1000,35194=>1000,35195=>1000,35196=>1000,35197=>1000,35198=>1000,35199=>1000,35200=>1000,35201=>1000,35202=>1000,35203=>1000,35204=>1000, + 35205=>1000,35206=>1000,35207=>1000,35208=>1000,35209=>1000,35210=>1000,35211=>1000,35212=>1000,35213=>1000,35214=>1000,35215=>1000,35216=>1000,35217=>1000,35218=>1000,35219=>1000,35220=>1000, + 35221=>1000,35222=>1000,35223=>1000,35224=>1000,35225=>1000,35226=>1000,35227=>1000,35228=>1000,35229=>1000,35230=>1000,35231=>1000,35232=>1000,35233=>1000,35234=>1000,35235=>1000,35236=>1000, + 35237=>1000,35238=>1000,35239=>1000,35240=>1000,35241=>1000,35242=>1000,35243=>1000,35244=>1000,35245=>1000,35246=>1000,35247=>1000,35248=>1000,35249=>1000,35250=>1000,35251=>1000,35252=>1000, + 35253=>1000,35254=>1000,35255=>1000,35256=>1000,35257=>1000,35258=>1000,35259=>1000,35260=>1000,35261=>1000,35262=>1000,35263=>1000,35264=>1000,35265=>1000,35266=>1000,35267=>1000,35268=>1000, + 35269=>1000,35270=>1000,35271=>1000,35272=>1000,35273=>1000,35274=>1000,35275=>1000,35276=>1000,35277=>1000,35278=>1000,35279=>1000,35280=>1000,35281=>1000,35282=>1000,35283=>1000,35284=>1000, + 35285=>1000,35286=>1000,35287=>1000,35288=>1000,35289=>1000,35290=>1000,35291=>1000,35292=>1000,35293=>1000,35294=>1000,35295=>1000,35296=>1000,35297=>1000,35298=>1000,35299=>1000,35300=>1000, + 35301=>1000,35302=>1000,35303=>1000,35304=>1000,35305=>1000,35306=>1000,35307=>1000,35308=>1000,35309=>1000,35310=>1000,35311=>1000,35312=>1000,35313=>1000,35314=>1000,35315=>1000,35316=>1000, + 35317=>1000,35318=>1000,35319=>1000,35320=>1000,35321=>1000,35322=>1000,35323=>1000,35324=>1000,35325=>1000,35326=>1000,35327=>1000,35328=>1000,35329=>1000,35330=>1000,35331=>1000,35332=>1000, + 35333=>1000,35334=>1000,35335=>1000,35336=>1000,35337=>1000,35338=>1000,35339=>1000,35340=>1000,35341=>1000,35342=>1000,35343=>1000,35344=>1000,35345=>1000,35346=>1000,35347=>1000,35348=>1000, + 35349=>1000,35350=>1000,35351=>1000,35352=>1000,35353=>1000,35354=>1000,35355=>1000,35356=>1000,35357=>1000,35358=>1000,35359=>1000,35360=>1000,35361=>1000,35362=>1000,35363=>1000,35364=>1000, + 35365=>1000,35366=>1000,35367=>1000,35368=>1000,35369=>1000,35370=>1000,35371=>1000,35372=>1000,35373=>1000,35374=>1000,35375=>1000,35376=>1000,35377=>1000,35378=>1000,35379=>1000,35380=>1000, + 35381=>1000,35382=>1000,35383=>1000,35384=>1000,35385=>1000,35386=>1000,35387=>1000,35388=>1000,35389=>1000,35390=>1000,35391=>1000,35392=>1000,35393=>1000,35394=>1000,35395=>1000,35396=>1000, + 35397=>1000,35398=>1000,35399=>1000,35400=>1000,35401=>1000,35402=>1000,35403=>1000,35404=>1000,35405=>1000,35406=>1000,35407=>1000,35408=>1000,35409=>1000,35410=>1000,35411=>1000,35412=>1000, + 35413=>1000,35414=>1000,35415=>1000,35416=>1000,35417=>1000,35418=>1000,35419=>1000,35420=>1000,35421=>1000,35422=>1000,35423=>1000,35424=>1000,35425=>1000,35426=>1000,35427=>1000,35428=>1000, + 35429=>1000,35430=>1000,35431=>1000,35432=>1000,35433=>1000,35434=>1000,35435=>1000,35436=>1000,35437=>1000,35438=>1000,35439=>1000,35440=>1000,35441=>1000,35442=>1000,35443=>1000,35444=>1000, + 35445=>1000,35446=>1000,35447=>1000,35448=>1000,35449=>1000,35450=>1000,35451=>1000,35452=>1000,35453=>1000,35454=>1000,35455=>1000,35456=>1000,35457=>1000,35458=>1000,35459=>1000,35460=>1000, + 35461=>1000,35462=>1000,35463=>1000,35464=>1000,35465=>1000,35466=>1000,35467=>1000,35468=>1000,35469=>1000,35470=>1000,35471=>1000,35472=>1000,35473=>1000,35474=>1000,35475=>1000,35476=>1000, + 35477=>1000,35478=>1000,35479=>1000,35480=>1000,35481=>1000,35482=>1000,35483=>1000,35484=>1000,35485=>1000,35486=>1000,35487=>1000,35488=>1000,35489=>1000,35490=>1000,35491=>1000,35492=>1000, + 35493=>1000,35494=>1000,35495=>1000,35496=>1000,35497=>1000,35498=>1000,35499=>1000,35500=>1000,35501=>1000,35502=>1000,35503=>1000,35504=>1000,35505=>1000,35506=>1000,35507=>1000,35508=>1000, + 35509=>1000,35510=>1000,35511=>1000,35512=>1000,35513=>1000,35514=>1000,35515=>1000,35516=>1000,35517=>1000,35518=>1000,35519=>1000,35520=>1000,35521=>1000,35522=>1000,35523=>1000,35524=>1000, + 35525=>1000,35526=>1000,35527=>1000,35528=>1000,35529=>1000,35530=>1000,35531=>1000,35532=>1000,35533=>1000,35534=>1000,35535=>1000,35536=>1000,35537=>1000,35538=>1000,35539=>1000,35540=>1000, + 35541=>1000,35542=>1000,35543=>1000,35544=>1000,35545=>1000,35546=>1000,35547=>1000,35548=>1000,35549=>1000,35550=>1000,35551=>1000,35552=>1000,35553=>1000,35554=>1000,35555=>1000,35556=>1000, + 35557=>1000,35558=>1000,35559=>1000,35560=>1000,35561=>1000,35562=>1000,35563=>1000,35564=>1000,35565=>1000,35566=>1000,35567=>1000,35568=>1000,35569=>1000,35570=>1000,35571=>1000,35572=>1000, + 35573=>1000,35574=>1000,35575=>1000,35576=>1000,35577=>1000,35578=>1000,35579=>1000,35580=>1000,35581=>1000,35582=>1000,35583=>1000,35584=>1000,35585=>1000,35586=>1000,35587=>1000,35588=>1000, + 35589=>1000,35590=>1000,35591=>1000,35592=>1000,35593=>1000,35594=>1000,35595=>1000,35596=>1000,35597=>1000,35598=>1000,35599=>1000,35600=>1000,35601=>1000,35602=>1000,35603=>1000,35604=>1000, + 35605=>1000,35606=>1000,35607=>1000,35608=>1000,35609=>1000,35610=>1000,35611=>1000,35612=>1000,35613=>1000,35614=>1000,35615=>1000,35616=>1000,35617=>1000,35618=>1000,35619=>1000,35620=>1000, + 35621=>1000,35622=>1000,35623=>1000,35624=>1000,35625=>1000,35626=>1000,35627=>1000,35628=>1000,35629=>1000,35630=>1000,35631=>1000,35632=>1000,35633=>1000,35634=>1000,35635=>1000,35636=>1000, + 35637=>1000,35638=>1000,35639=>1000,35640=>1000,35641=>1000,35642=>1000,35643=>1000,35644=>1000,35645=>1000,35646=>1000,35647=>1000,35648=>1000,35649=>1000,35650=>1000,35651=>1000,35652=>1000, + 35653=>1000,35654=>1000,35655=>1000,35656=>1000,35657=>1000,35658=>1000,35659=>1000,35660=>1000,35661=>1000,35662=>1000,35663=>1000,35664=>1000,35665=>1000,35666=>1000,35667=>1000,35668=>1000, + 35669=>1000,35670=>1000,35671=>1000,35672=>1000,35673=>1000,35674=>1000,35675=>1000,35676=>1000,35677=>1000,35678=>1000,35679=>1000,35680=>1000,35681=>1000,35682=>1000,35683=>1000,35684=>1000, + 35685=>1000,35686=>1000,35687=>1000,35688=>1000,35689=>1000,35690=>1000,35691=>1000,35692=>1000,35693=>1000,35694=>1000,35695=>1000,35696=>1000,35697=>1000,35698=>1000,35699=>1000,35700=>1000, + 35701=>1000,35702=>1000,35703=>1000,35704=>1000,35705=>1000,35706=>1000,35707=>1000,35708=>1000,35709=>1000,35710=>1000,35711=>1000,35712=>1000,35713=>1000,35714=>1000,35715=>1000,35716=>1000, + 35717=>1000,35718=>1000,35719=>1000,35720=>1000,35721=>1000,35722=>1000,35723=>1000,35724=>1000,35725=>1000,35726=>1000,35727=>1000,35728=>1000,35729=>1000,35730=>1000,35731=>1000,35732=>1000, + 35733=>1000,35734=>1000,35735=>1000,35736=>1000,35737=>1000,35738=>1000,35739=>1000,35740=>1000,35741=>1000,35742=>1000,35743=>1000,35744=>1000,35745=>1000,35746=>1000,35747=>1000,35748=>1000, + 35749=>1000,35750=>1000,35751=>1000,35752=>1000,35753=>1000,35754=>1000,35755=>1000,35756=>1000,35757=>1000,35758=>1000,35759=>1000,35760=>1000,35761=>1000,35762=>1000,35763=>1000,35764=>1000, + 35765=>1000,35766=>1000,35767=>1000,35768=>1000,35769=>1000,35770=>1000,35771=>1000,35772=>1000,35773=>1000,35774=>1000,35775=>1000,35776=>1000,35777=>1000,35778=>1000,35779=>1000,35780=>1000, + 35781=>1000,35782=>1000,35783=>1000,35784=>1000,35785=>1000,35786=>1000,35787=>1000,35788=>1000,35789=>1000,35790=>1000,35791=>1000,35792=>1000,35793=>1000,35794=>1000,35795=>1000,35796=>1000, + 35797=>1000,35798=>1000,35799=>1000,35800=>1000,35801=>1000,35802=>1000,35803=>1000,35804=>1000,35805=>1000,35806=>1000,35807=>1000,35808=>1000,35809=>1000,35810=>1000,35811=>1000,35812=>1000, + 35813=>1000,35814=>1000,35815=>1000,35816=>1000,35817=>1000,35818=>1000,35819=>1000,35820=>1000,35821=>1000,35822=>1000,35823=>1000,35824=>1000,35825=>1000,35826=>1000,35827=>1000,35828=>1000, + 35829=>1000,35830=>1000,35831=>1000,35832=>1000,35833=>1000,35834=>1000,35835=>1000,35836=>1000,35837=>1000,35838=>1000,35839=>1000,35840=>1000,35841=>1000,35842=>1000,35843=>1000,35844=>1000, + 35845=>1000,35846=>1000,35847=>1000,35848=>1000,35849=>1000,35850=>1000,35851=>1000,35852=>1000,35853=>1000,35854=>1000,35855=>1000,35856=>1000,35857=>1000,35858=>1000,35859=>1000,35860=>1000, + 35861=>1000,35862=>1000,35863=>1000,35864=>1000,35865=>1000,35866=>1000,35867=>1000,35868=>1000,35869=>1000,35870=>1000,35871=>1000,35872=>1000,35873=>1000,35874=>1000,35875=>1000,35876=>1000, + 35877=>1000,35878=>1000,35879=>1000,35880=>1000,35881=>1000,35882=>1000,35883=>1000,35884=>1000,35885=>1000,35886=>1000,35887=>1000,35888=>1000,35889=>1000,35890=>1000,35891=>1000,35892=>1000, + 35893=>1000,35894=>1000,35895=>1000,35896=>1000,35897=>1000,35898=>1000,35899=>1000,35900=>1000,35901=>1000,35902=>1000,35903=>1000,35904=>1000,35905=>1000,35906=>1000,35907=>1000,35908=>1000, + 35909=>1000,35910=>1000,35911=>1000,35912=>1000,35913=>1000,35914=>1000,35915=>1000,35916=>1000,35917=>1000,35918=>1000,35919=>1000,35920=>1000,35921=>1000,35922=>1000,35923=>1000,35924=>1000, + 35925=>1000,35926=>1000,35927=>1000,35928=>1000,35929=>1000,35930=>1000,35931=>1000,35932=>1000,35933=>1000,35934=>1000,35935=>1000,35936=>1000,35937=>1000,35938=>1000,35939=>1000,35940=>1000, + 35941=>1000,35942=>1000,35943=>1000,35944=>1000,35945=>1000,35946=>1000,35947=>1000,35948=>1000,35949=>1000,35950=>1000,35951=>1000,35952=>1000,35953=>1000,35954=>1000,35955=>1000,35956=>1000, + 35957=>1000,35958=>1000,35959=>1000,35960=>1000,35961=>1000,35962=>1000,35963=>1000,35964=>1000,35965=>1000,35966=>1000,35967=>1000,35968=>1000,35969=>1000,35970=>1000,35971=>1000,35972=>1000, + 35973=>1000,35974=>1000,35975=>1000,35976=>1000,35977=>1000,35978=>1000,35979=>1000,35980=>1000,35981=>1000,35982=>1000,35983=>1000,35984=>1000,35985=>1000,35986=>1000,35987=>1000,35988=>1000, + 35989=>1000,35990=>1000,35991=>1000,35992=>1000,35993=>1000,35994=>1000,35995=>1000,35996=>1000,35997=>1000,35998=>1000,35999=>1000,36000=>1000,36001=>1000,36002=>1000,36003=>1000,36004=>1000, + 36005=>1000,36006=>1000,36007=>1000,36008=>1000,36009=>1000,36010=>1000,36011=>1000,36012=>1000,36013=>1000,36014=>1000,36015=>1000,36016=>1000,36017=>1000,36018=>1000,36019=>1000,36020=>1000, + 36021=>1000,36022=>1000,36023=>1000,36024=>1000,36025=>1000,36026=>1000,36027=>1000,36028=>1000,36029=>1000,36030=>1000,36031=>1000,36032=>1000,36033=>1000,36034=>1000,36035=>1000,36036=>1000, + 36037=>1000,36038=>1000,36039=>1000,36040=>1000,36041=>1000,36042=>1000,36043=>1000,36044=>1000,36045=>1000,36046=>1000,36047=>1000,36048=>1000,36049=>1000,36050=>1000,36051=>1000,36052=>1000, + 36053=>1000,36054=>1000,36055=>1000,36056=>1000,36057=>1000,36058=>1000,36059=>1000,36060=>1000,36061=>1000,36062=>1000,36063=>1000,36064=>1000,36065=>1000,36066=>1000,36067=>1000,36068=>1000, + 36069=>1000,36070=>1000,36071=>1000,36072=>1000,36073=>1000,36074=>1000,36075=>1000,36076=>1000,36077=>1000,36078=>1000,36079=>1000,36080=>1000,36081=>1000,36082=>1000,36083=>1000,36084=>1000, + 36085=>1000,36086=>1000,36087=>1000,36088=>1000,36089=>1000,36090=>1000,36091=>1000,36092=>1000,36093=>1000,36094=>1000,36095=>1000,36096=>1000,36097=>1000,36098=>1000,36099=>1000,36100=>1000, + 36101=>1000,36102=>1000,36103=>1000,36104=>1000,36105=>1000,36106=>1000,36107=>1000,36108=>1000,36109=>1000,36110=>1000,36111=>1000,36112=>1000,36113=>1000,36114=>1000,36115=>1000,36116=>1000, + 36117=>1000,36118=>1000,36119=>1000,36120=>1000,36121=>1000,36122=>1000,36123=>1000,36124=>1000,36125=>1000,36126=>1000,36127=>1000,36128=>1000,36129=>1000,36130=>1000,36131=>1000,36132=>1000, + 36133=>1000,36134=>1000,36135=>1000,36136=>1000,36137=>1000,36138=>1000,36139=>1000,36140=>1000,36141=>1000,36142=>1000,36143=>1000,36144=>1000,36145=>1000,36146=>1000,36147=>1000,36148=>1000, + 36149=>1000,36150=>1000,36151=>1000,36152=>1000,36153=>1000,36154=>1000,36155=>1000,36156=>1000,36157=>1000,36158=>1000,36159=>1000,36160=>1000,36161=>1000,36162=>1000,36163=>1000,36164=>1000, + 36165=>1000,36166=>1000,36167=>1000,36168=>1000,36169=>1000,36170=>1000,36171=>1000,36172=>1000,36173=>1000,36174=>1000,36175=>1000,36176=>1000,36177=>1000,36178=>1000,36179=>1000,36180=>1000, + 36181=>1000,36182=>1000,36183=>1000,36184=>1000,36185=>1000,36186=>1000,36187=>1000,36188=>1000,36189=>1000,36190=>1000,36191=>1000,36192=>1000,36193=>1000,36194=>1000,36195=>1000,36196=>1000, + 36197=>1000,36198=>1000,36199=>1000,36200=>1000,36201=>1000,36202=>1000,36203=>1000,36204=>1000,36205=>1000,36206=>1000,36207=>1000,36208=>1000,36209=>1000,36210=>1000,36211=>1000,36212=>1000, + 36213=>1000,36214=>1000,36215=>1000,36216=>1000,36217=>1000,36218=>1000,36219=>1000,36220=>1000,36221=>1000,36222=>1000,36223=>1000,36224=>1000,36225=>1000,36226=>1000,36227=>1000,36228=>1000, + 36229=>1000,36230=>1000,36231=>1000,36232=>1000,36233=>1000,36234=>1000,36235=>1000,36236=>1000,36237=>1000,36238=>1000,36239=>1000,36240=>1000,36241=>1000,36242=>1000,36243=>1000,36244=>1000, + 36245=>1000,36246=>1000,36247=>1000,36248=>1000,36249=>1000,36250=>1000,36251=>1000,36252=>1000,36253=>1000,36254=>1000,36255=>1000,36256=>1000,36257=>1000,36258=>1000,36259=>1000,36260=>1000, + 36261=>1000,36262=>1000,36263=>1000,36264=>1000,36265=>1000,36266=>1000,36267=>1000,36268=>1000,36269=>1000,36270=>1000,36271=>1000,36272=>1000,36273=>1000,36274=>1000,36275=>1000,36276=>1000, + 36277=>1000,36278=>1000,36279=>1000,36280=>1000,36281=>1000,36282=>1000,36283=>1000,36284=>1000,36285=>1000,36286=>1000,36287=>1000,36288=>1000,36289=>1000,36290=>1000,36291=>1000,36292=>1000, + 36293=>1000,36294=>1000,36295=>1000,36296=>1000,36297=>1000,36298=>1000,36299=>1000,36300=>1000,36301=>1000,36302=>1000,36303=>1000,36304=>1000,36305=>1000,36306=>1000,36307=>1000,36308=>1000, + 36309=>1000,36310=>1000,36311=>1000,36312=>1000,36313=>1000,36314=>1000,36315=>1000,36316=>1000,36317=>1000,36318=>1000,36319=>1000,36320=>1000,36321=>1000,36322=>1000,36323=>1000,36324=>1000, + 36325=>1000,36326=>1000,36327=>1000,36328=>1000,36329=>1000,36330=>1000,36331=>1000,36332=>1000,36333=>1000,36334=>1000,36335=>1000,36336=>1000,36337=>1000,36338=>1000,36339=>1000,36340=>1000, + 36341=>1000,36342=>1000,36343=>1000,36344=>1000,36345=>1000,36346=>1000,36347=>1000,36348=>1000,36349=>1000,36350=>1000,36351=>1000,36352=>1000,36353=>1000,36354=>1000,36355=>1000,36356=>1000, + 36357=>1000,36358=>1000,36359=>1000,36360=>1000,36361=>1000,36362=>1000,36363=>1000,36364=>1000,36365=>1000,36366=>1000,36367=>1000,36368=>1000,36369=>1000,36370=>1000,36371=>1000,36372=>1000, + 36373=>1000,36374=>1000,36375=>1000,36376=>1000,36377=>1000,36378=>1000,36379=>1000,36380=>1000,36381=>1000,36382=>1000,36383=>1000,36384=>1000,36385=>1000,36386=>1000,36387=>1000,36388=>1000, + 36389=>1000,36390=>1000,36391=>1000,36392=>1000,36393=>1000,36394=>1000,36395=>1000,36396=>1000,36397=>1000,36398=>1000,36399=>1000,36400=>1000,36401=>1000,36402=>1000,36403=>1000,36404=>1000, + 36405=>1000,36406=>1000,36407=>1000,36408=>1000,36409=>1000,36410=>1000,36411=>1000,36412=>1000,36413=>1000,36414=>1000,36415=>1000,36416=>1000,36417=>1000,36418=>1000,36419=>1000,36420=>1000, + 36421=>1000,36422=>1000,36423=>1000,36424=>1000,36425=>1000,36426=>1000,36427=>1000,36428=>1000,36429=>1000,36430=>1000,36431=>1000,36432=>1000,36433=>1000,36434=>1000,36435=>1000,36436=>1000, + 36437=>1000,36438=>1000,36439=>1000,36440=>1000,36441=>1000,36442=>1000,36443=>1000,36444=>1000,36445=>1000,36446=>1000,36447=>1000,36448=>1000,36449=>1000,36450=>1000,36451=>1000,36452=>1000, + 36453=>1000,36454=>1000,36455=>1000,36456=>1000,36457=>1000,36458=>1000,36459=>1000,36460=>1000,36461=>1000,36462=>1000,36463=>1000,36464=>1000,36465=>1000,36466=>1000,36467=>1000,36468=>1000, + 36469=>1000,36470=>1000,36471=>1000,36472=>1000,36473=>1000,36474=>1000,36475=>1000,36476=>1000,36477=>1000,36478=>1000,36479=>1000,36480=>1000,36481=>1000,36482=>1000,36483=>1000,36484=>1000, + 36485=>1000,36486=>1000,36487=>1000,36488=>1000,36489=>1000,36490=>1000,36491=>1000,36492=>1000,36493=>1000,36494=>1000,36495=>1000,36496=>1000,36497=>1000,36498=>1000,36499=>1000,36500=>1000, + 36501=>1000,36502=>1000,36503=>1000,36504=>1000,36505=>1000,36506=>1000,36507=>1000,36508=>1000,36509=>1000,36510=>1000,36511=>1000,36512=>1000,36513=>1000,36514=>1000,36515=>1000,36516=>1000, + 36517=>1000,36518=>1000,36519=>1000,36520=>1000,36521=>1000,36522=>1000,36523=>1000,36524=>1000,36525=>1000,36526=>1000,36527=>1000,36528=>1000,36529=>1000,36530=>1000,36531=>1000,36532=>1000, + 36533=>1000,36534=>1000,36535=>1000,36536=>1000,36537=>1000,36538=>1000,36539=>1000,36540=>1000,36541=>1000,36542=>1000,36543=>1000,36544=>1000,36545=>1000,36546=>1000,36547=>1000,36548=>1000, + 36549=>1000,36550=>1000,36551=>1000,36552=>1000,36553=>1000,36554=>1000,36555=>1000,36556=>1000,36557=>1000,36558=>1000,36559=>1000,36560=>1000,36561=>1000,36562=>1000,36563=>1000,36564=>1000, + 36565=>1000,36566=>1000,36567=>1000,36568=>1000,36569=>1000,36570=>1000,36571=>1000,36572=>1000,36573=>1000,36574=>1000,36575=>1000,36576=>1000,36577=>1000,36578=>1000,36579=>1000,36580=>1000, + 36581=>1000,36582=>1000,36583=>1000,36584=>1000,36585=>1000,36586=>1000,36587=>1000,36588=>1000,36589=>1000,36590=>1000,36591=>1000,36592=>1000,36593=>1000,36594=>1000,36595=>1000,36596=>1000, + 36597=>1000,36598=>1000,36599=>1000,36600=>1000,36601=>1000,36602=>1000,36603=>1000,36604=>1000,36605=>1000,36606=>1000,36607=>1000,36608=>1000,36609=>1000,36610=>1000,36611=>1000,36612=>1000, + 36613=>1000,36614=>1000,36615=>1000,36616=>1000,36617=>1000,36618=>1000,36619=>1000,36620=>1000,36621=>1000,36622=>1000,36623=>1000,36624=>1000,36625=>1000,36626=>1000,36627=>1000,36628=>1000, + 36629=>1000,36630=>1000,36631=>1000,36632=>1000,36633=>1000,36634=>1000,36635=>1000,36636=>1000,36637=>1000,36638=>1000,36639=>1000,36640=>1000,36641=>1000,36642=>1000,36643=>1000,36644=>1000, + 36645=>1000,36646=>1000,36647=>1000,36648=>1000,36649=>1000,36650=>1000,36651=>1000,36652=>1000,36653=>1000,36654=>1000,36655=>1000,36656=>1000,36657=>1000,36658=>1000,36659=>1000,36660=>1000, + 36661=>1000,36662=>1000,36663=>1000,36664=>1000,36665=>1000,36666=>1000,36667=>1000,36668=>1000,36669=>1000,36670=>1000,36671=>1000,36672=>1000,36673=>1000,36674=>1000,36675=>1000,36676=>1000, + 36677=>1000,36678=>1000,36679=>1000,36680=>1000,36681=>1000,36682=>1000,36683=>1000,36684=>1000,36685=>1000,36686=>1000,36687=>1000,36688=>1000,36689=>1000,36690=>1000,36691=>1000,36692=>1000, + 36693=>1000,36694=>1000,36695=>1000,36696=>1000,36697=>1000,36698=>1000,36699=>1000,36700=>1000,36701=>1000,36702=>1000,36703=>1000,36704=>1000,36705=>1000,36706=>1000,36707=>1000,36708=>1000, + 36709=>1000,36710=>1000,36711=>1000,36712=>1000,36713=>1000,36714=>1000,36715=>1000,36716=>1000,36717=>1000,36718=>1000,36719=>1000,36720=>1000,36721=>1000,36722=>1000,36723=>1000,36724=>1000, + 36725=>1000,36726=>1000,36727=>1000,36728=>1000,36729=>1000,36730=>1000,36731=>1000,36732=>1000,36733=>1000,36734=>1000,36735=>1000,36736=>1000,36737=>1000,36738=>1000,36739=>1000,36740=>1000, + 36741=>1000,36742=>1000,36743=>1000,36744=>1000,36745=>1000,36746=>1000,36747=>1000,36748=>1000,36749=>1000,36750=>1000,36751=>1000,36752=>1000,36753=>1000,36754=>1000,36755=>1000,36756=>1000, + 36757=>1000,36758=>1000,36759=>1000,36760=>1000,36761=>1000,36762=>1000,36763=>1000,36764=>1000,36765=>1000,36766=>1000,36767=>1000,36768=>1000,36769=>1000,36770=>1000,36771=>1000,36772=>1000, + 36773=>1000,36774=>1000,36775=>1000,36776=>1000,36777=>1000,36778=>1000,36779=>1000,36780=>1000,36781=>1000,36782=>1000,36783=>1000,36784=>1000,36785=>1000,36786=>1000,36787=>1000,36788=>1000, + 36789=>1000,36790=>1000,36791=>1000,36792=>1000,36793=>1000,36794=>1000,36795=>1000,36796=>1000,36797=>1000,36798=>1000,36799=>1000,36800=>1000,36801=>1000,36802=>1000,36803=>1000,36804=>1000, + 36805=>1000,36806=>1000,36807=>1000,36808=>1000,36809=>1000,36810=>1000,36811=>1000,36812=>1000,36813=>1000,36814=>1000,36815=>1000,36816=>1000,36817=>1000,36818=>1000,36819=>1000,36820=>1000, + 36821=>1000,36822=>1000,36823=>1000,36824=>1000,36825=>1000,36826=>1000,36827=>1000,36828=>1000,36829=>1000,36830=>1000,36831=>1000,36832=>1000,36833=>1000,36834=>1000,36835=>1000,36836=>1000, + 36837=>1000,36838=>1000,36839=>1000,36840=>1000,36841=>1000,36842=>1000,36843=>1000,36844=>1000,36845=>1000,36846=>1000,36847=>1000,36848=>1000,36849=>1000,36850=>1000,36851=>1000,36852=>1000, + 36853=>1000,36854=>1000,36855=>1000,36856=>1000,36857=>1000,36858=>1000,36859=>1000,36860=>1000,36861=>1000,36862=>1000,36863=>1000,36864=>1000,36865=>1000,36866=>1000,36867=>1000,36868=>1000, + 36869=>1000,36870=>1000,36871=>1000,36872=>1000,36873=>1000,36874=>1000,36875=>1000,36876=>1000,36877=>1000,36878=>1000,36879=>1000,36880=>1000,36881=>1000,36882=>1000,36883=>1000,36884=>1000, + 36885=>1000,36886=>1000,36887=>1000,36888=>1000,36889=>1000,36890=>1000,36891=>1000,36892=>1000,36893=>1000,36894=>1000,36895=>1000,36896=>1000,36897=>1000,36898=>1000,36899=>1000,36900=>1000, + 36901=>1000,36902=>1000,36903=>1000,36904=>1000,36905=>1000,36906=>1000,36907=>1000,36908=>1000,36909=>1000,36910=>1000,36911=>1000,36912=>1000,36913=>1000,36914=>1000,36915=>1000,36916=>1000, + 36917=>1000,36918=>1000,36919=>1000,36920=>1000,36921=>1000,36922=>1000,36923=>1000,36924=>1000,36925=>1000,36926=>1000,36927=>1000,36928=>1000,36929=>1000,36930=>1000,36931=>1000,36932=>1000, + 36933=>1000,36934=>1000,36935=>1000,36936=>1000,36937=>1000,36938=>1000,36939=>1000,36940=>1000,36941=>1000,36942=>1000,36943=>1000,36944=>1000,36945=>1000,36946=>1000,36947=>1000,36948=>1000, + 36949=>1000,36950=>1000,36951=>1000,36952=>1000,36953=>1000,36954=>1000,36955=>1000,36956=>1000,36957=>1000,36958=>1000,36959=>1000,36960=>1000,36961=>1000,36962=>1000,36963=>1000,36964=>1000, + 36965=>1000,36966=>1000,36967=>1000,36968=>1000,36969=>1000,36970=>1000,36971=>1000,36972=>1000,36973=>1000,36974=>1000,36975=>1000,36976=>1000,36977=>1000,36978=>1000,36979=>1000,36980=>1000, + 36981=>1000,36982=>1000,36983=>1000,36984=>1000,36985=>1000,36986=>1000,36987=>1000,36988=>1000,36989=>1000,36990=>1000,36991=>1000,36992=>1000,36993=>1000,36994=>1000,36995=>1000,36996=>1000, + 36997=>1000,36998=>1000,36999=>1000,37000=>1000,37001=>1000,37002=>1000,37003=>1000,37004=>1000,37005=>1000,37006=>1000,37007=>1000,37008=>1000,37009=>1000,37010=>1000,37011=>1000,37012=>1000, + 37013=>1000,37014=>1000,37015=>1000,37016=>1000,37017=>1000,37018=>1000,37019=>1000,37020=>1000,37021=>1000,37022=>1000,37023=>1000,37024=>1000,37025=>1000,37026=>1000,37027=>1000,37028=>1000, + 37029=>1000,37030=>1000,37031=>1000,37032=>1000,37033=>1000,37034=>1000,37035=>1000,37036=>1000,37037=>1000,37038=>1000,37039=>1000,37040=>1000,37041=>1000,37042=>1000,37043=>1000,37044=>1000, + 37045=>1000,37046=>1000,37047=>1000,37048=>1000,37049=>1000,37050=>1000,37051=>1000,37052=>1000,37053=>1000,37054=>1000,37055=>1000,37056=>1000,37057=>1000,37058=>1000,37059=>1000,37060=>1000, + 37061=>1000,37062=>1000,37063=>1000,37064=>1000,37065=>1000,37066=>1000,37067=>1000,37068=>1000,37069=>1000,37070=>1000,37071=>1000,37072=>1000,37073=>1000,37074=>1000,37075=>1000,37076=>1000, + 37077=>1000,37078=>1000,37079=>1000,37080=>1000,37081=>1000,37082=>1000,37083=>1000,37084=>1000,37085=>1000,37086=>1000,37087=>1000,37088=>1000,37089=>1000,37090=>1000,37091=>1000,37092=>1000, + 37093=>1000,37094=>1000,37095=>1000,37096=>1000,37097=>1000,37098=>1000,37099=>1000,37100=>1000,37101=>1000,37102=>1000,37103=>1000,37104=>1000,37105=>1000,37106=>1000,37107=>1000,37108=>1000, + 37109=>1000,37110=>1000,37111=>1000,37112=>1000,37113=>1000,37114=>1000,37115=>1000,37116=>1000,37117=>1000,37118=>1000,37119=>1000,37120=>1000,37121=>1000,37122=>1000,37123=>1000,37124=>1000, + 37125=>1000,37126=>1000,37127=>1000,37128=>1000,37129=>1000,37130=>1000,37131=>1000,37132=>1000,37133=>1000,37134=>1000,37135=>1000,37136=>1000,37137=>1000,37138=>1000,37139=>1000,37140=>1000, + 37141=>1000,37142=>1000,37143=>1000,37144=>1000,37145=>1000,37146=>1000,37147=>1000,37148=>1000,37149=>1000,37150=>1000,37151=>1000,37152=>1000,37153=>1000,37154=>1000,37155=>1000,37156=>1000, + 37157=>1000,37158=>1000,37159=>1000,37160=>1000,37161=>1000,37162=>1000,37163=>1000,37164=>1000,37165=>1000,37166=>1000,37167=>1000,37168=>1000,37169=>1000,37170=>1000,37171=>1000,37172=>1000, + 37173=>1000,37174=>1000,37175=>1000,37176=>1000,37177=>1000,37178=>1000,37179=>1000,37180=>1000,37181=>1000,37182=>1000,37183=>1000,37184=>1000,37185=>1000,37186=>1000,37187=>1000,37188=>1000, + 37189=>1000,37190=>1000,37191=>1000,37192=>1000,37193=>1000,37194=>1000,37195=>1000,37196=>1000,37197=>1000,37198=>1000,37199=>1000,37200=>1000,37201=>1000,37202=>1000,37203=>1000,37204=>1000, + 37205=>1000,37206=>1000,37207=>1000,37208=>1000,37209=>1000,37210=>1000,37211=>1000,37212=>1000,37213=>1000,37214=>1000,37215=>1000,37216=>1000,37217=>1000,37218=>1000,37219=>1000,37220=>1000, + 37221=>1000,37222=>1000,37223=>1000,37224=>1000,37225=>1000,37226=>1000,37227=>1000,37228=>1000,37229=>1000,37230=>1000,37231=>1000,37232=>1000,37233=>1000,37234=>1000,37235=>1000,37236=>1000, + 37237=>1000,37238=>1000,37239=>1000,37240=>1000,37241=>1000,37242=>1000,37243=>1000,37244=>1000,37245=>1000,37246=>1000,37247=>1000,37248=>1000,37249=>1000,37250=>1000,37251=>1000,37252=>1000, + 37253=>1000,37254=>1000,37255=>1000,37256=>1000,37257=>1000,37258=>1000,37259=>1000,37260=>1000,37261=>1000,37262=>1000,37263=>1000,37264=>1000,37265=>1000,37266=>1000,37267=>1000,37268=>1000, + 37269=>1000,37270=>1000,37271=>1000,37272=>1000,37273=>1000,37274=>1000,37275=>1000,37276=>1000,37277=>1000,37278=>1000,37279=>1000,37280=>1000,37281=>1000,37282=>1000,37283=>1000,37284=>1000, + 37285=>1000,37286=>1000,37287=>1000,37288=>1000,37289=>1000,37290=>1000,37291=>1000,37292=>1000,37293=>1000,37294=>1000,37295=>1000,37296=>1000,37297=>1000,37298=>1000,37299=>1000,37300=>1000, + 37301=>1000,37302=>1000,37303=>1000,37304=>1000,37305=>1000,37306=>1000,37307=>1000,37308=>1000,37309=>1000,37310=>1000,37311=>1000,37312=>1000,37313=>1000,37314=>1000,37315=>1000,37316=>1000, + 37317=>1000,37318=>1000,37319=>1000,37320=>1000,37321=>1000,37322=>1000,37323=>1000,37324=>1000,37325=>1000,37326=>1000,37327=>1000,37328=>1000,37329=>1000,37330=>1000,37331=>1000,37332=>1000, + 37333=>1000,37334=>1000,37335=>1000,37336=>1000,37337=>1000,37338=>1000,37339=>1000,37340=>1000,37341=>1000,37342=>1000,37343=>1000,37344=>1000,37345=>1000,37346=>1000,37347=>1000,37348=>1000, + 37349=>1000,37350=>1000,37351=>1000,37352=>1000,37353=>1000,37354=>1000,37355=>1000,37356=>1000,37357=>1000,37358=>1000,37359=>1000,37360=>1000,37361=>1000,37362=>1000,37363=>1000,37364=>1000, + 37365=>1000,37366=>1000,37367=>1000,37368=>1000,37369=>1000,37370=>1000,37371=>1000,37372=>1000,37373=>1000,37374=>1000,37375=>1000,37376=>1000,37377=>1000,37378=>1000,37379=>1000,37380=>1000, + 37381=>1000,37382=>1000,37383=>1000,37384=>1000,37385=>1000,37386=>1000,37387=>1000,37388=>1000,37389=>1000,37390=>1000,37391=>1000,37392=>1000,37393=>1000,37394=>1000,37395=>1000,37396=>1000, + 37397=>1000,37398=>1000,37399=>1000,37400=>1000,37401=>1000,37402=>1000,37403=>1000,37404=>1000,37405=>1000,37406=>1000,37407=>1000,37408=>1000,37409=>1000,37410=>1000,37411=>1000,37412=>1000, + 37413=>1000,37414=>1000,37415=>1000,37416=>1000,37417=>1000,37418=>1000,37419=>1000,37420=>1000,37421=>1000,37422=>1000,37423=>1000,37424=>1000,37425=>1000,37426=>1000,37427=>1000,37428=>1000, + 37429=>1000,37430=>1000,37431=>1000,37432=>1000,37433=>1000,37434=>1000,37435=>1000,37436=>1000,37437=>1000,37438=>1000,37439=>1000,37440=>1000,37441=>1000,37442=>1000,37443=>1000,37444=>1000, + 37445=>1000,37446=>1000,37447=>1000,37448=>1000,37449=>1000,37450=>1000,37451=>1000,37452=>1000,37453=>1000,37454=>1000,37455=>1000,37456=>1000,37457=>1000,37458=>1000,37459=>1000,37460=>1000, + 37461=>1000,37462=>1000,37463=>1000,37464=>1000,37465=>1000,37466=>1000,37467=>1000,37468=>1000,37469=>1000,37470=>1000,37471=>1000,37472=>1000,37473=>1000,37474=>1000,37475=>1000,37476=>1000, + 37477=>1000,37478=>1000,37479=>1000,37480=>1000,37481=>1000,37482=>1000,37483=>1000,37484=>1000,37485=>1000,37486=>1000,37487=>1000,37488=>1000,37489=>1000,37490=>1000,37491=>1000,37492=>1000, + 37493=>1000,37494=>1000,37495=>1000,37496=>1000,37497=>1000,37498=>1000,37499=>1000,37500=>1000,37501=>1000,37502=>1000,37503=>1000,37504=>1000,37505=>1000,37506=>1000,37507=>1000,37508=>1000, + 37509=>1000,37510=>1000,37511=>1000,37512=>1000,37513=>1000,37514=>1000,37515=>1000,37516=>1000,37517=>1000,37518=>1000,37519=>1000,37520=>1000,37521=>1000,37522=>1000,37523=>1000,37524=>1000, + 37525=>1000,37526=>1000,37527=>1000,37528=>1000,37529=>1000,37530=>1000,37531=>1000,37532=>1000,37533=>1000,37534=>1000,37535=>1000,37536=>1000,37537=>1000,37538=>1000,37539=>1000,37540=>1000, + 37541=>1000,37542=>1000,37543=>1000,37544=>1000,37545=>1000,37546=>1000,37547=>1000,37548=>1000,37549=>1000,37550=>1000,37551=>1000,37552=>1000,37553=>1000,37554=>1000,37555=>1000,37556=>1000, + 37557=>1000,37558=>1000,37559=>1000,37560=>1000,37561=>1000,37562=>1000,37563=>1000,37564=>1000,37565=>1000,37566=>1000,37567=>1000,37568=>1000,37569=>1000,37570=>1000,37571=>1000,37572=>1000, + 37573=>1000,37574=>1000,37575=>1000,37576=>1000,37577=>1000,37578=>1000,37579=>1000,37580=>1000,37581=>1000,37582=>1000,37583=>1000,37584=>1000,37585=>1000,37586=>1000,37587=>1000,37588=>1000, + 37589=>1000,37590=>1000,37591=>1000,37592=>1000,37593=>1000,37594=>1000,37595=>1000,37596=>1000,37597=>1000,37598=>1000,37599=>1000,37600=>1000,37601=>1000,37602=>1000,37603=>1000,37604=>1000, + 37605=>1000,37606=>1000,37607=>1000,37608=>1000,37609=>1000,37610=>1000,37611=>1000,37612=>1000,37613=>1000,37614=>1000,37615=>1000,37616=>1000,37617=>1000,37618=>1000,37619=>1000,37620=>1000, + 37621=>1000,37622=>1000,37623=>1000,37624=>1000,37625=>1000,37626=>1000,37627=>1000,37628=>1000,37629=>1000,37630=>1000,37631=>1000,37632=>1000,37633=>1000,37634=>1000,37635=>1000,37636=>1000, + 37637=>1000,37638=>1000,37639=>1000,37640=>1000,37641=>1000,37642=>1000,37643=>1000,37644=>1000,37645=>1000,37646=>1000,37647=>1000,37648=>1000,37649=>1000,37650=>1000,37651=>1000,37652=>1000, + 37653=>1000,37654=>1000,37655=>1000,37656=>1000,37657=>1000,37658=>1000,37659=>1000,37660=>1000,37661=>1000,37662=>1000,37663=>1000,37664=>1000,37665=>1000,37666=>1000,37667=>1000,37668=>1000, + 37669=>1000,37670=>1000,37671=>1000,37672=>1000,37673=>1000,37674=>1000,37675=>1000,37676=>1000,37677=>1000,37678=>1000,37679=>1000,37680=>1000,37681=>1000,37682=>1000,37683=>1000,37684=>1000, + 37685=>1000,37686=>1000,37687=>1000,37688=>1000,37689=>1000,37690=>1000,37691=>1000,37692=>1000,37693=>1000,37694=>1000,37695=>1000,37696=>1000,37697=>1000,37698=>1000,37699=>1000,37700=>1000, + 37701=>1000,37702=>1000,37703=>1000,37704=>1000,37705=>1000,37706=>1000,37707=>1000,37708=>1000,37709=>1000,37710=>1000,37711=>1000,37712=>1000,37713=>1000,37714=>1000,37715=>1000,37716=>1000, + 37717=>1000,37718=>1000,37719=>1000,37720=>1000,37721=>1000,37722=>1000,37723=>1000,37724=>1000,37725=>1000,37726=>1000,37727=>1000,37728=>1000,37729=>1000,37730=>1000,37731=>1000,37732=>1000, + 37733=>1000,37734=>1000,37735=>1000,37736=>1000,37737=>1000,37738=>1000,37739=>1000,37740=>1000,37741=>1000,37742=>1000,37743=>1000,37744=>1000,37745=>1000,37746=>1000,37747=>1000,37748=>1000, + 37749=>1000,37750=>1000,37751=>1000,37752=>1000,37753=>1000,37754=>1000,37755=>1000,37756=>1000,37757=>1000,37758=>1000,37759=>1000,37760=>1000,37761=>1000,37762=>1000,37763=>1000,37764=>1000, + 37765=>1000,37766=>1000,37767=>1000,37768=>1000,37769=>1000,37770=>1000,37771=>1000,37772=>1000,37773=>1000,37774=>1000,37775=>1000,37776=>1000,37777=>1000,37778=>1000,37779=>1000,37780=>1000, + 37781=>1000,37782=>1000,37783=>1000,37784=>1000,37785=>1000,37786=>1000,37787=>1000,37788=>1000,37789=>1000,37790=>1000,37791=>1000,37792=>1000,37793=>1000,37794=>1000,37795=>1000,37796=>1000, + 37797=>1000,37798=>1000,37799=>1000,37800=>1000,37801=>1000,37802=>1000,37803=>1000,37804=>1000,37805=>1000,37806=>1000,37807=>1000,37808=>1000,37809=>1000,37810=>1000,37811=>1000,37812=>1000, + 37813=>1000,37814=>1000,37815=>1000,37816=>1000,37817=>1000,37818=>1000,37819=>1000,37820=>1000,37821=>1000,37822=>1000,37823=>1000,37824=>1000,37825=>1000,37826=>1000,37827=>1000,37828=>1000, + 37829=>1000,37830=>1000,37831=>1000,37832=>1000,37833=>1000,37834=>1000,37835=>1000,37836=>1000,37837=>1000,37838=>1000,37839=>1000,37840=>1000,37841=>1000,37842=>1000,37843=>1000,37844=>1000, + 37845=>1000,37846=>1000,37847=>1000,37848=>1000,37849=>1000,37850=>1000,37851=>1000,37852=>1000,37853=>1000,37854=>1000,37855=>1000,37856=>1000,37857=>1000,37858=>1000,37859=>1000,37860=>1000, + 37861=>1000,37862=>1000,37863=>1000,37864=>1000,37865=>1000,37866=>1000,37867=>1000,37868=>1000,37869=>1000,37870=>1000,37871=>1000,37872=>1000,37873=>1000,37874=>1000,37875=>1000,37876=>1000, + 37877=>1000,37878=>1000,37879=>1000,37880=>1000,37881=>1000,37882=>1000,37883=>1000,37884=>1000,37885=>1000,37886=>1000,37887=>1000,37888=>1000,37889=>1000,37890=>1000,37891=>1000,37892=>1000, + 37893=>1000,37894=>1000,37895=>1000,37896=>1000,37897=>1000,37898=>1000,37899=>1000,37900=>1000,37901=>1000,37902=>1000,37903=>1000,37904=>1000,37905=>1000,37906=>1000,37907=>1000,37908=>1000, + 37909=>1000,37910=>1000,37911=>1000,37912=>1000,37913=>1000,37914=>1000,37915=>1000,37916=>1000,37917=>1000,37918=>1000,37919=>1000,37920=>1000,37921=>1000,37922=>1000,37923=>1000,37924=>1000, + 37925=>1000,37926=>1000,37927=>998,37928=>1000,37929=>1000,37930=>1000,37931=>1000,37932=>1000,37933=>1000,37934=>1000,37935=>1000,37936=>1000,37937=>1000,37938=>1000,37939=>1000,37940=>1000, + 37941=>1000,37942=>1000,37943=>1000,37944=>1000,37945=>1000,37946=>1000,37947=>1000,37948=>1000,37949=>1000,37950=>1000,37951=>1000,37952=>1000,37953=>1000,37954=>1000,37955=>1000,37956=>1000, + 37957=>1000,37958=>1000,37959=>1000,37960=>1000,37961=>1000,37962=>1000,37963=>1000,37964=>1000,37965=>1000,37966=>1000,37967=>1000,37968=>1000,37969=>1000,37970=>1000,37971=>1000,37972=>1000, + 37973=>1000,37974=>1000,37975=>1000,37976=>1000,37977=>1000,37978=>1000,37979=>1000,37980=>1000,37981=>1000,37982=>1000,37983=>1000,37984=>1000,37985=>1000,37986=>1000,37987=>1000,37988=>1000, + 37989=>1000,37990=>1000,37991=>1000,37992=>1000,37993=>1000,37994=>1000,37995=>1000,37996=>1000,37997=>1000,37998=>1000,37999=>1000,38000=>1000,38001=>1000,38002=>1000,38003=>1000,38004=>1000, + 38005=>1000,38006=>1000,38007=>1000,38008=>1000,38009=>1000,38010=>1000,38011=>1000,38012=>1000,38013=>1000,38014=>1000,38015=>1000,38016=>1000,38017=>1000,38018=>1000,38019=>1000,38020=>1000, + 38021=>1000,38022=>1000,38023=>1000,38024=>1000,38025=>1000,38026=>1000,38027=>1000,38028=>1000,38029=>1000,38030=>1000,38031=>1000,38032=>1000,38033=>1000,38034=>1000,38035=>1000,38036=>1000, + 38037=>1000,38038=>1000,38039=>1000,38040=>1000,38041=>1000,38042=>1000,38043=>1000,38044=>1000,38045=>1000,38046=>1000,38047=>1000,38048=>1000,38049=>1000,38050=>1000,38051=>1000,38052=>1000, + 38053=>1000,38054=>1000,38055=>1000,38056=>1000,38057=>1000,38058=>1000,38059=>1000,38060=>1000,38061=>1000,38062=>1000,38063=>1000,38064=>1000,38065=>1000,38066=>1000,38067=>1000,38068=>1000, + 38069=>1000,38070=>1000,38071=>1000,38072=>1000,38073=>1000,38074=>1000,38075=>1000,38076=>1000,38077=>1000,38078=>1000,38079=>1000,38080=>1000,38081=>1000,38082=>1000,38083=>1000,38084=>1000, + 38085=>1000,38086=>1000,38087=>1000,38088=>1000,38089=>1000,38090=>1000,38091=>1000,38092=>1000,38093=>1000,38094=>1000,38095=>1000,38096=>1000,38097=>1000,38098=>1000,38099=>1000,38100=>1000, + 38101=>1000,38102=>1000,38103=>1000,38104=>1000,38105=>1000,38106=>1000,38107=>1000,38108=>1000,38109=>1000,38110=>1000,38111=>1000,38112=>1000,38113=>1000,38114=>1000,38115=>1000,38116=>1000, + 38117=>1000,38118=>1000,38119=>1000,38120=>1000,38121=>1000,38122=>1000,38123=>1000,38124=>1000,38125=>1000,38126=>1000,38127=>1000,38128=>1000,38129=>1000,38130=>1000,38131=>1000,38132=>1000, + 38133=>1000,38134=>1000,38135=>1000,38136=>1000,38137=>1000,38138=>1000,38139=>1000,38140=>1000,38141=>1000,38142=>1000,38143=>1000,38144=>1000,38145=>1000,38146=>1000,38147=>1000,38148=>1000, + 38149=>1000,38150=>1000,38151=>1000,38152=>1000,38153=>1000,38154=>1000,38155=>1000,38156=>1000,38157=>1000,38158=>1000,38159=>1000,38160=>1000,38161=>1000,38162=>1000,38163=>1000,38164=>1000, + 38165=>1000,38166=>1000,38167=>1000,38168=>1000,38169=>1000,38170=>1000,38171=>1000,38172=>1000,38173=>1000,38174=>1000,38175=>1000,38176=>1000,38177=>1000,38178=>1000,38179=>1000,38180=>1000, + 38181=>1000,38182=>1000,38183=>1000,38184=>1000,38185=>1000,38186=>1000,38187=>1000,38188=>1000,38189=>1000,38190=>1000,38191=>1000,38192=>1000,38193=>1000,38194=>1000,38195=>1000,38196=>1000, + 38197=>1000,38198=>1000,38199=>1000,38200=>1000,38201=>1000,38202=>1000,38203=>1000,38204=>1000,38205=>1000,38206=>1000,38207=>1000,38208=>1000,38209=>1000,38210=>1000,38211=>1000,38212=>1000, + 38213=>1000,38214=>1000,38215=>1000,38216=>1000,38217=>1000,38218=>1000,38219=>1000,38220=>1000,38221=>1000,38222=>1000,38223=>1000,38224=>1000,38225=>1000,38226=>1000,38227=>1000,38228=>1000, + 38229=>1000,38230=>1000,38231=>1000,38232=>1000,38233=>1000,38234=>1000,38235=>1000,38236=>1000,38237=>1000,38238=>1000,38239=>1000,38240=>1000,38241=>1000,38242=>1000,38243=>1000,38244=>1000, + 38245=>1000,38246=>1000,38247=>1000,38248=>1000,38249=>1000,38250=>1000,38251=>1000,38252=>1000,38253=>1000,38254=>1000,38255=>1000,38256=>1000,38257=>1000,38258=>1000,38259=>1000,38260=>1000, + 38261=>1000,38262=>1000,38263=>1000,38264=>1000,38265=>1000,38266=>1000,38267=>1000,38268=>1000,38269=>1000,38270=>1000,38271=>1000,38272=>1000,38273=>1000,38274=>1000,38275=>1000,38276=>1000, + 38277=>1000,38278=>1000,38279=>1000,38280=>1000,38281=>1000,38282=>1000,38283=>1000,38284=>1000,38285=>1000,38286=>1000,38287=>1000,38288=>1000,38289=>1000,38290=>1000,38291=>1000,38292=>1000, + 38293=>1000,38294=>1000,38295=>1000,38296=>1000,38297=>1000,38298=>1000,38299=>1000,38300=>1000,38301=>1000,38302=>1000,38303=>1000,38304=>1000,38305=>1000,38306=>1000,38307=>1000,38308=>1000, + 38309=>1000,38310=>1000,38311=>1000,38312=>1000,38313=>1000,38314=>1000,38315=>1000,38316=>1000,38317=>1000,38318=>1000,38319=>1000,38320=>1000,38321=>1000,38322=>1000,38323=>1000,38324=>1000, + 38325=>1000,38326=>1000,38327=>1000,38328=>1000,38329=>1000,38330=>1000,38331=>1000,38332=>1000,38333=>1000,38334=>1000,38335=>1000,38336=>1000,38337=>1000,38338=>1000,38339=>1000,38340=>1000, + 38341=>1000,38342=>1000,38343=>1000,38344=>1000,38345=>1000,38346=>1000,38347=>1000,38348=>1000,38349=>1000,38350=>1000,38351=>1000,38352=>1000,38353=>1000,38354=>1000,38355=>1000,38356=>1000, + 38357=>1000,38358=>1000,38359=>1000,38360=>1000,38361=>1000,38362=>1000,38363=>1000,38364=>1000,38365=>1000,38366=>1000,38367=>1000,38368=>1000,38369=>1000,38370=>1000,38371=>1000,38372=>1000, + 38373=>1000,38374=>1000,38375=>1000,38376=>1000,38377=>1000,38378=>1000,38379=>1000,38380=>1000,38381=>1000,38382=>1000,38383=>1000,38384=>1000,38385=>1000,38386=>1000,38387=>1000,38388=>1000, + 38389=>1000,38390=>1000,38391=>1000,38392=>1000,38393=>1000,38394=>1000,38395=>1000,38396=>1000,38397=>1000,38398=>1000,38399=>1000,38400=>1000,38401=>1000,38402=>1000,38403=>1000,38404=>1000, + 38405=>1000,38406=>1000,38407=>1000,38408=>1000,38409=>1000,38410=>1000,38411=>1000,38412=>1000,38413=>1000,38414=>1000,38415=>1000,38416=>1000,38417=>1000,38418=>1000,38419=>1000,38420=>1000, + 38421=>1000,38422=>1000,38423=>1000,38424=>1000,38425=>1000,38426=>1000,38427=>1000,38428=>1000,38429=>1000,38430=>1000,38431=>1000,38432=>1000,38433=>1000,38434=>1000,38435=>1000,38436=>1000, + 38437=>1000,38438=>1000,38439=>1000,38440=>1000,38441=>1000,38442=>1000,38443=>1000,38444=>1000,38445=>1000,38446=>1000,38447=>1000,38448=>1000,38449=>1000,38450=>1000,38451=>1000,38452=>1000, + 38453=>1000,38454=>1000,38455=>1000,38456=>1000,38457=>1000,38458=>1000,38459=>1000,38460=>1000,38461=>1000,38462=>1000,38463=>1000,38464=>1000,38465=>1000,38466=>1000,38467=>1000,38468=>1000, + 38469=>1000,38470=>1000,38471=>1000,38472=>1000,38473=>1000,38474=>1000,38475=>1000,38476=>1000,38477=>1000,38478=>1000,38479=>1000,38480=>1000,38481=>1000,38482=>1000,38483=>1000,38484=>1000, + 38485=>1000,38486=>1000,38487=>1000,38488=>1000,38489=>1000,38490=>1000,38491=>1000,38492=>1000,38493=>1000,38494=>1000,38495=>1000,38496=>1000,38497=>1000,38498=>1000,38499=>1000,38500=>1000, + 38501=>1000,38502=>1000,38503=>1000,38504=>1000,38505=>1000,38506=>1000,38507=>1000,38508=>1000,38509=>1000,38510=>1000,38511=>1000,38512=>1000,38513=>1000,38514=>1000,38515=>1000,38516=>1000, + 38517=>1000,38518=>1000,38519=>1000,38520=>1000,38521=>1000,38522=>1000,38523=>1000,38524=>1000,38525=>1000,38526=>1000,38527=>1000,38528=>1000,38529=>1000,38530=>1000,38531=>1000,38532=>1000, + 38533=>1000,38534=>1000,38535=>1000,38536=>1000,38537=>1000,38538=>1000,38539=>1000,38540=>1000,38541=>1000,38542=>1000,38543=>1000,38544=>1000,38545=>1000,38546=>1000,38547=>1000,38548=>1000, + 38549=>1000,38550=>1000,38551=>1000,38552=>1000,38553=>1000,38554=>1000,38555=>1000,38556=>1000,38557=>1000,38558=>1000,38559=>1000,38560=>1000,38561=>1000,38562=>1000,38563=>1000,38564=>1000, + 38565=>1000,38566=>1000,38567=>1000,38568=>1000,38569=>1000,38570=>1000,38571=>1000,38572=>1000,38573=>1000,38574=>1000,38575=>1000,38576=>1000,38577=>1000,38578=>1000,38579=>1000,38580=>1000, + 38581=>1000,38582=>1000,38583=>1000,38584=>1000,38585=>1000,38586=>1000,38587=>1000,38588=>1000,38589=>1000,38590=>1000,38591=>1000,38592=>1000,38593=>1000,38594=>1000,38595=>1000,38596=>1000, + 38597=>1000,38598=>1000,38599=>1000,38600=>1000,38601=>1000,38602=>1000,38603=>1000,38604=>1000,38605=>1000,38606=>1000,38607=>1000,38608=>1000,38609=>1000,38610=>1000,38611=>1000,38612=>1000, + 38613=>1000,38614=>1000,38615=>1000,38616=>1000,38617=>1000,38618=>1000,38619=>1000,38620=>1000,38621=>1000,38622=>1000,38623=>1000,38624=>1000,38625=>1000,38626=>1000,38627=>1000,38628=>1000, + 38629=>1000,38630=>1000,38631=>1000,38632=>1000,38633=>1000,38634=>1000,38635=>1000,38636=>1000,38637=>1000,38638=>1000,38639=>1000,38640=>1000,38641=>1000,38642=>1000,38643=>1000,38644=>1000, + 38645=>1000,38646=>1000,38647=>1000,38648=>1000,38649=>1000,38650=>1000,38651=>1000,38652=>1000,38653=>1000,38654=>1000,38655=>1000,38656=>1000,38657=>1000,38658=>1000,38659=>1000,38660=>1000, + 38661=>1000,38662=>1000,38663=>1000,38664=>1000,38665=>1000,38666=>1000,38667=>1000,38668=>1000,38669=>1000,38670=>1000,38671=>1000,38672=>1000,38673=>1000,38674=>1000,38675=>1000,38676=>1000, + 38677=>1000,38678=>1000,38679=>1000,38680=>1000,38681=>1000,38682=>1000,38683=>1000,38684=>1000,38685=>1000,38686=>1000,38687=>1000,38688=>1000,38689=>1000,38690=>1000,38691=>1000,38692=>1000, + 38693=>1000,38694=>1000,38695=>1000,38696=>1000,38697=>1000,38698=>1000,38699=>1000,38700=>1000,38701=>1000,38702=>1000,38703=>1000,38704=>1000,38705=>1000,38706=>1000,38707=>1000,38708=>1000, + 38709=>1000,38710=>1000,38711=>1000,38712=>1000,38713=>1000,38714=>1000,38715=>1000,38716=>1000,38717=>1000,38718=>1000,38719=>1000,38720=>1000,38721=>1000,38722=>1000,38723=>1000,38724=>1000, + 38725=>1000,38726=>1000,38727=>1000,38728=>1000,38729=>1000,38730=>1000,38731=>1000,38732=>1000,38733=>1000,38734=>1000,38735=>1000,38736=>1000,38737=>1000,38738=>1000,38739=>1000,38740=>1000, + 38741=>1000,38742=>1000,38743=>1000,38744=>1000,38745=>1000,38746=>1000,38747=>1000,38748=>1000,38749=>1000,38750=>1000,38751=>1000,38752=>1000,38753=>1000,38754=>1000,38755=>1000,38756=>1000, + 38757=>1000,38758=>1000,38759=>1000,38760=>1000,38761=>1000,38762=>1000,38763=>1000,38764=>1000,38765=>1000,38766=>1000,38767=>1000,38768=>1000,38769=>1000,38770=>1000,38771=>1000,38772=>1000, + 38773=>1000,38774=>1000,38775=>1000,38776=>1000,38777=>1000,38778=>1000,38779=>1000,38780=>1000,38781=>1000,38782=>1000,38783=>1000,38784=>1000,38785=>1000,38786=>1000,38787=>1000,38788=>1000, + 38789=>1000,38790=>1000,38791=>1000,38792=>1000,38793=>1000,38794=>1000,38795=>1000,38796=>1000,38797=>1000,38798=>1000,38799=>1000,38800=>1000,38801=>1000,38802=>1000,38803=>1000,38804=>1000, + 38805=>1000,38806=>1000,38807=>1000,38808=>1000,38809=>1000,38810=>1000,38811=>1000,38812=>1000,38813=>1000,38814=>1000,38815=>1000,38816=>1000,38817=>1000,38818=>1000,38819=>1000,38820=>1000, + 38821=>1000,38822=>1000,38823=>1000,38824=>1000,38825=>1000,38826=>1000,38827=>1000,38828=>1000,38829=>1000,38830=>1000,38831=>1000,38832=>1000,38833=>1000,38834=>1000,38835=>1000,38836=>1000, + 38837=>1000,38838=>1000,38839=>1000,38840=>1000,38841=>1000,38842=>1000,38843=>1000,38844=>1000,38845=>1000,38846=>1000,38847=>1000,38848=>1000,38849=>1000,38850=>1000,38851=>1000,38852=>1000, + 38853=>1000,38854=>1000,38855=>1000,38856=>1000,38857=>1000,38858=>1000,38859=>1000,38860=>1000,38861=>1000,38862=>1000,38863=>1000,38864=>1000,38865=>1000,38866=>1000,38867=>1000,38868=>1000, + 38869=>1000,38870=>1000,38871=>1000,38872=>1000,38873=>1000,38874=>1000,38875=>1000,38876=>1000,38877=>1000,38878=>1000,38879=>1000,38880=>1000,38881=>1000,38882=>1000,38883=>1000,38884=>1000, + 38885=>1000,38886=>1000,38887=>1000,38888=>1000,38889=>1000,38890=>1000,38891=>1000,38892=>1000,38893=>1000,38894=>1000,38895=>1000,38896=>1000,38897=>1000,38898=>1000,38899=>1000,38900=>1000, + 38901=>1000,38902=>1000,38903=>1000,38904=>1000,38905=>1000,38906=>1000,38907=>1000,38908=>1000,38909=>1000,38910=>1000,38911=>1000,38912=>1000,38913=>1000,38914=>1000,38915=>1000,38916=>1000, + 38917=>1000,38918=>1000,38919=>1000,38920=>1000,38921=>1000,38922=>1000,38923=>1000,38924=>1000,38925=>1000,38926=>1000,38927=>1000,38928=>1000,38929=>1000,38930=>1000,38931=>1000,38932=>1000, + 38933=>1000,38934=>1000,38935=>1000,38936=>1000,38937=>1000,38938=>1000,38939=>1000,38940=>1000,38941=>1000,38942=>1000,38943=>1000,38944=>1000,38945=>1000,38946=>1000,38947=>1000,38948=>1000, + 38949=>1000,38950=>1000,38951=>1000,38952=>1000,38953=>1000,38954=>1000,38955=>1000,38956=>1000,38957=>1000,38958=>1000,38959=>1000,38960=>1000,38961=>1000,38962=>1000,38963=>1000,38964=>1000, + 38965=>1000,38966=>1000,38967=>1000,38968=>1000,38969=>1000,38970=>1000,38971=>1000,38972=>1000,38973=>1000,38974=>1000,38975=>1000,38976=>1000,38977=>1000,38978=>1000,38979=>1000,38980=>1000, + 38981=>1000,38982=>1000,38983=>1000,38984=>1000,38985=>1000,38986=>1000,38987=>1000,38988=>1000,38989=>1000,38990=>1000,38991=>1000,38992=>1000,38993=>1000,38994=>1000,38995=>1000,38996=>1000, + 38997=>1000,38998=>1000,38999=>1000,39000=>1000,39001=>1000,39002=>1000,39003=>1000,39004=>1000,39005=>1000,39006=>1000,39007=>1000,39008=>1000,39009=>1000,39010=>1000,39011=>1000,39012=>1000, + 39013=>1000,39014=>1000,39015=>1000,39016=>1000,39017=>1000,39018=>1000,39019=>1000,39020=>1000,39021=>1000,39022=>1000,39023=>1000,39024=>1000,39025=>1000,39026=>1000,39027=>1000,39028=>1000, + 39029=>1000,39030=>1000,39031=>1000,39032=>1000,39033=>1000,39034=>1000,39035=>1000,39036=>1000,39037=>1000,39038=>1000,39039=>1000,39040=>1000,39041=>1000,39042=>1000,39043=>1000,39044=>1000, + 39045=>1000,39046=>1000,39047=>1000,39048=>1000,39049=>1000,39050=>1000,39051=>1000,39052=>1000,39053=>1000,39054=>1000,39055=>1000,39056=>1000,39057=>1000,39058=>1000,39059=>1000,39060=>1000, + 39061=>1000,39062=>1000,39063=>1000,39064=>1000,39065=>1000,39066=>1000,39067=>1000,39068=>1000,39069=>1000,39070=>1000,39071=>1000,39072=>1000,39073=>1000,39074=>1000,39075=>1000,39076=>1000, + 39077=>1000,39078=>1000,39079=>1000,39080=>1000,39081=>1000,39082=>1000,39083=>1000,39084=>1000,39085=>1000,39086=>1000,39087=>1000,39088=>1000,39089=>1000,39090=>1000,39091=>1000,39092=>1000, + 39093=>1000,39094=>1000,39095=>1000,39096=>1000,39097=>1000,39098=>1000,39099=>1000,39100=>1000,39101=>1000,39102=>1000,39103=>1000,39104=>1000,39105=>1000,39106=>1000,39107=>1000,39108=>1000, + 39109=>1000,39110=>1000,39111=>1000,39112=>1000,39113=>1000,39114=>1000,39115=>1000,39116=>1000,39117=>1000,39118=>1000,39119=>1000,39120=>1000,39121=>1000,39122=>1000,39123=>1000,39124=>1000, + 39125=>1000,39126=>1000,39127=>1000,39128=>1000,39129=>1000,39130=>1000,39131=>1000,39132=>1000,39133=>1000,39134=>1000,39135=>1000,39136=>1000,39137=>1000,39138=>1000,39139=>1000,39140=>1000, + 39141=>1000,39142=>1000,39143=>1000,39144=>1000,39145=>1000,39146=>1000,39147=>1000,39148=>1000,39149=>1000,39150=>1000,39151=>1000,39152=>1000,39153=>1000,39154=>1000,39155=>1000,39156=>1000, + 39157=>1000,39158=>1000,39159=>1000,39160=>1000,39161=>1000,39162=>1000,39163=>1000,39164=>1000,39165=>1000,39166=>1000,39167=>1000,39168=>1000,39169=>1000,39170=>1000,39171=>1000,39172=>1000, + 39173=>1000,39174=>1000,39175=>1000,39176=>1000,39177=>1000,39178=>1000,39179=>1000,39180=>1000,39181=>1000,39182=>1000,39183=>1000,39184=>1000,39185=>1000,39186=>1000,39187=>1000,39188=>1000, + 39189=>1000,39190=>1000,39191=>1000,39192=>1000,39193=>1000,39194=>1000,39195=>1000,39196=>1000,39197=>1000,39198=>1000,39199=>1000,39200=>1000,39201=>1000,39202=>1000,39203=>1000,39204=>1000, + 39205=>1000,39206=>1000,39207=>1000,39208=>1000,39209=>1000,39210=>1000,39211=>1000,39212=>1000,39213=>1000,39214=>1000,39215=>1000,39216=>1000,39217=>1000,39218=>1000,39219=>1000,39220=>1000, + 39221=>1000,39222=>1000,39223=>1000,39224=>1000,39225=>1000,39226=>1000,39227=>1000,39228=>1000,39229=>1000,39230=>1000,39231=>1000,39232=>1000,39233=>1000,39234=>1000,39235=>1000,39236=>1000, + 39237=>1000,39238=>1000,39239=>1000,39240=>1000,39241=>1000,39242=>1000,39243=>1000,39244=>1000,39245=>1000,39246=>1000,39247=>1000,39248=>1000,39249=>1000,39250=>1000,39251=>1000,39252=>1000, + 39253=>1000,39254=>1000,39255=>1000,39256=>1000,39257=>1000,39258=>1000,39259=>1000,39260=>1000,39261=>1000,39262=>1000,39263=>1000,39264=>1000,39265=>1000,39266=>1000,39267=>1000,39268=>1000, + 39269=>1000,39270=>1000,39271=>1000,39272=>1000,39273=>1000,39274=>1000,39275=>1000,39276=>1000,39277=>1000,39278=>1000,39279=>1000,39280=>1000,39281=>1000,39282=>1000,39283=>1000,39284=>1000, + 39285=>1000,39286=>1000,39287=>1000,39288=>1000,39289=>1000,39290=>1000,39291=>1000,39292=>1000,39293=>1000,39294=>1000,39295=>1000,39296=>1000,39297=>1000,39298=>1000,39299=>1000,39300=>1000, + 39301=>1000,39302=>1000,39303=>1000,39304=>1000,39305=>1000,39306=>1000,39307=>1000,39308=>1000,39309=>1000,39310=>1000,39311=>1000,39312=>1000,39313=>1000,39314=>1000,39315=>1000,39316=>1000, + 39317=>1000,39318=>1000,39319=>1000,39320=>1000,39321=>1000,39322=>1000,39323=>1000,39324=>1000,39325=>1000,39326=>1000,39327=>1000,39328=>1000,39329=>1000,39330=>1000,39331=>1000,39332=>1000, + 39333=>1000,39334=>1000,39335=>1000,39336=>1000,39337=>1000,39338=>1000,39339=>1000,39340=>1000,39341=>1000,39342=>1000,39343=>1000,39344=>1000,39345=>1000,39346=>1000,39347=>1000,39348=>1000, + 39349=>1000,39350=>1000,39351=>1000,39352=>1000,39353=>1000,39354=>1000,39355=>1000,39356=>1000,39357=>1000,39358=>1000,39359=>1000,39360=>1000,39361=>1000,39362=>1000,39363=>1000,39364=>1000, + 39365=>1000,39366=>1000,39367=>1000,39368=>1000,39369=>1000,39370=>1000,39371=>1000,39372=>1000,39373=>1000,39374=>1000,39375=>1000,39376=>1000,39377=>1000,39378=>1000,39379=>1000,39380=>1000, + 39381=>1000,39382=>1000,39383=>1000,39384=>1000,39385=>1000,39386=>1000,39387=>1000,39388=>1000,39389=>1000,39390=>1000,39391=>1000,39392=>1000,39393=>1000,39394=>1000,39395=>1000,39396=>1000, + 39397=>1000,39398=>1000,39399=>1000,39400=>1000,39401=>1000,39402=>1000,39403=>1000,39404=>1000,39405=>1000,39406=>1000,39407=>1000,39408=>1000,39409=>1000,39410=>1000,39411=>1000,39412=>1000, + 39413=>1000,39414=>1000,39415=>1000,39416=>1000,39417=>1000,39418=>1000,39419=>1000,39420=>1000,39421=>1000,39422=>1000,39423=>1000,39424=>1000,39425=>1000,39426=>1000,39427=>1000,39428=>1000, + 39429=>1000,39430=>1000,39431=>1000,39432=>1000,39433=>1000,39434=>1000,39435=>1000,39436=>1000,39437=>1000,39438=>1000,39439=>1000,39440=>1000,39441=>1000,39442=>1000,39443=>1000,39444=>1000, + 39445=>1000,39446=>1000,39447=>1000,39448=>1000,39449=>1000,39450=>1000,39451=>1000,39452=>1000,39453=>1000,39454=>1000,39455=>1000,39456=>1000,39457=>1000,39458=>1000,39459=>1000,39460=>1000, + 39461=>1000,39462=>1000,39463=>1000,39464=>1000,39465=>1000,39466=>1000,39467=>1000,39468=>1000,39469=>1000,39470=>1000,39471=>1000,39472=>1000,39473=>1000,39474=>1000,39475=>1000,39476=>1000, + 39477=>1000,39478=>1000,39479=>1000,39480=>1000,39481=>1000,39482=>1000,39483=>1000,39484=>1000,39485=>1000,39486=>1000,39487=>1000,39488=>1000,39489=>1000,39490=>1000,39491=>1000,39492=>1000, + 39493=>1000,39494=>1000,39495=>1000,39496=>1000,39497=>1000,39498=>1000,39499=>1000,39500=>1000,39501=>1000,39502=>1000,39503=>1000,39504=>1000,39505=>1000,39506=>1000,39507=>1000,39508=>1000, + 39509=>1000,39510=>1000,39511=>1000,39512=>1000,39513=>1000,39514=>1000,39515=>1000,39516=>1000,39517=>1000,39518=>1000,39519=>1000,39520=>1000,39521=>1000,39522=>1000,39523=>1000,39524=>1000, + 39525=>1000,39526=>1000,39527=>1000,39528=>1000,39529=>1000,39530=>1000,39531=>1000,39532=>1000,39533=>1000,39534=>1000,39535=>1000,39536=>1000,39537=>1000,39538=>1000,39539=>1000,39540=>1000, + 39541=>1000,39542=>1000,39543=>1000,39544=>1000,39545=>1000,39546=>1000,39547=>1000,39548=>1000,39549=>1000,39550=>1000,39551=>1000,39552=>1000,39553=>1000,39554=>1000,39555=>1000,39556=>1000, + 39557=>1000,39558=>1000,39559=>1000,39560=>1000,39561=>1000,39562=>1000,39563=>1000,39564=>1000,39565=>1000,39566=>1000,39567=>1000,39568=>1000,39569=>1000,39570=>1000,39571=>1000,39572=>1000, + 39573=>1000,39574=>1000,39575=>1000,39576=>1000,39577=>1000,39578=>1000,39579=>1000,39580=>1000,39581=>1000,39582=>1000,39583=>1000,39584=>1000,39585=>1000,39586=>1000,39587=>1000,39588=>1000, + 39589=>1000,39590=>1000,39591=>1000,39592=>1000,39593=>1000,39594=>1000,39595=>1000,39596=>1000,39597=>1000,39598=>1000,39599=>1000,39600=>1000,39601=>1000,39602=>1000,39603=>1000,39604=>1000, + 39605=>1000,39606=>1000,39607=>1000,39608=>1000,39609=>1000,39610=>1000,39611=>1000,39612=>1000,39613=>1000,39614=>1000,39615=>1000,39616=>1000,39617=>1000,39618=>1000,39619=>1000,39620=>1000, + 39621=>1000,39622=>1000,39623=>1000,39624=>1000,39625=>1000,39626=>1000,39627=>1000,39628=>1000,39629=>1000,39630=>1000,39631=>1000,39632=>1000,39633=>1000,39634=>1000,39635=>1000,39636=>1000, + 39637=>1000,39638=>1000,39639=>1000,39640=>1000,39641=>1000,39642=>1000,39643=>1000,39644=>1000,39645=>1000,39646=>1000,39647=>1000,39648=>1000,39649=>1000,39650=>1000,39651=>1000,39652=>1000, + 39653=>1000,39654=>1000,39655=>1000,39656=>1000,39657=>1000,39658=>1000,39659=>1000,39660=>1000,39661=>1000,39662=>1000,39663=>1000,39664=>1000,39665=>1000,39666=>1000,39667=>1000,39668=>1000, + 39669=>1000,39670=>1000,39671=>1000,39672=>1000,39673=>1000,39674=>1000,39675=>1000,39676=>1000,39677=>1000,39678=>1000,39679=>1000,39680=>1000,39681=>1000,39682=>1000,39683=>1000,39684=>1000, + 39685=>1000,39686=>1000,39687=>1000,39688=>1000,39689=>1000,39690=>1000,39691=>1000,39692=>1000,39693=>1000,39694=>1000,39695=>1000,39696=>1000,39697=>1000,39698=>1000,39699=>1000,39700=>1000, + 39701=>1000,39702=>1000,39703=>1000,39704=>1000,39705=>1000,39706=>1000,39707=>1000,39708=>1000,39709=>1000,39710=>1000,39711=>1000,39712=>1000,39713=>1000,39714=>1000,39715=>1000,39716=>1000, + 39717=>1000,39718=>1000,39719=>1000,39720=>1000,39721=>1000,39722=>1000,39723=>1000,39724=>1000,39725=>1000,39726=>1000,39727=>1000,39728=>1000,39729=>1000,39730=>1000,39731=>1000,39732=>1000, + 39733=>1000,39734=>1000,39735=>1000,39736=>1000,39737=>1000,39738=>1000,39739=>1000,39740=>1000,39741=>1000,39742=>1000,39743=>1000,39744=>1000,39745=>1000,39746=>1000,39747=>1000,39748=>1000, + 39749=>1000,39750=>1000,39751=>1000,39752=>1000,39753=>1000,39754=>1000,39755=>1000,39756=>1000,39757=>1000,39758=>1000,39759=>1000,39760=>1000,39761=>1000,39762=>1000,39763=>1000,39764=>1000, + 39765=>1000,39766=>1000,39767=>1000,39768=>1000,39769=>1000,39770=>1000,39771=>1000,39772=>1000,39773=>1000,39774=>1000,39775=>1000,39776=>1000,39777=>1000,39778=>1000,39779=>1000,39780=>1000, + 39781=>1000,39782=>1000,39783=>1000,39784=>1000,39785=>1000,39786=>1000,39787=>1000,39788=>1000,39789=>1000,39790=>1000,39791=>1000,39792=>1000,39793=>1000,39794=>1000,39795=>1000,39796=>1000, + 39797=>1000,39798=>1000,39799=>1000,39800=>1000,39801=>1000,39802=>1000,39803=>1000,39804=>1000,39805=>1000,39806=>1000,39807=>1000,39808=>1000,39809=>1000,39810=>1000,39811=>1000,39812=>1000, + 39813=>1000,39814=>1000,39815=>1000,39816=>1000,39817=>1000,39818=>1000,39819=>1000,39820=>1000,39821=>1000,39822=>1000,39823=>1000,39824=>1000,39825=>1000,39826=>1000,39827=>1000,39828=>1000, + 39829=>1000,39830=>1000,39831=>1000,39832=>1000,39833=>1000,39834=>1000,39835=>1000,39836=>1000,39837=>1000,39838=>1000,39839=>1000,39840=>1000,39841=>1000,39842=>1000,39843=>1000,39844=>1000, + 39845=>1000,39846=>1000,39847=>1000,39848=>1000,39849=>1000,39850=>1000,39851=>1000,39852=>1000,39853=>1000,39854=>1000,39855=>1000,39856=>1000,39857=>1000,39858=>1000,39859=>1000,39860=>1000, + 39861=>1000,39862=>1000,39863=>1000,39864=>1000,39865=>1000,39866=>1000,39867=>1000,39868=>1000,39869=>1000,39870=>1000,39871=>1000,39872=>1000,39873=>1000,39874=>1000,39875=>1000,39876=>1000, + 39877=>1000,39878=>1000,39879=>1000,39880=>1000,39881=>1000,39882=>1000,39883=>1000,39884=>1000,39885=>1000,39886=>1000,39887=>1000,39888=>1000,39889=>1000,39890=>1000,39891=>1000,39892=>1000, + 39893=>1000,39894=>1000,39895=>1000,39896=>1000,39897=>1000,39898=>1000,39899=>1000,39900=>1000,39901=>1000,39902=>1000,39903=>1000,39904=>1000,39905=>1000,39906=>1000,39907=>1000,39908=>1000, + 39909=>1000,39910=>1000,39911=>1000,39912=>1000,39913=>1000,39914=>1000,39915=>1000,39916=>1000,39917=>1000,39918=>1000,39919=>1000,39920=>1000,39921=>1000,39922=>1000,39923=>1000,39924=>1000, + 39925=>1000,39926=>1000,39927=>1000,39928=>1000,39929=>1000,39930=>1000,39931=>1000,39932=>1000,39933=>1000,39934=>1000,39935=>1000,39936=>1000,39937=>1000,39938=>1000,39939=>1000,39940=>1000, + 39941=>1000,39942=>1000,39943=>1000,39944=>1000,39945=>1000,39946=>1000,39947=>1000,39948=>1000,39949=>1000,39950=>1000,39951=>1000,39952=>1000,39953=>1000,39954=>1000,39955=>1000,39956=>1000, + 39957=>1000,39958=>1000,39959=>1000,39960=>1000,39961=>1000,39962=>1000,39963=>1000,39964=>1000,39965=>1000,39966=>1000,39967=>1000,39968=>1000,39969=>1000,39970=>1000,39971=>1000,39972=>1000, + 39973=>1000,39974=>1000,39975=>1000,39976=>1000,39977=>1000,39978=>1000,39979=>1000,39980=>1000,39981=>1000,39982=>1000,39983=>1000,39984=>1000,39985=>1000,39986=>1000,39987=>1000,39988=>1000, + 39989=>1000,39990=>1000,39991=>1000,39992=>1000,39993=>1000,39994=>1000,39995=>1000,39996=>1000,39997=>1000,39998=>1000,39999=>1000,40000=>1000,40001=>1000,40002=>1000,40003=>1000,40004=>1000, + 40005=>1000,40006=>1000,40007=>1000,40008=>1000,40009=>1000,40010=>1000,40011=>1000,40012=>1000,40013=>1000,40014=>1000,40015=>1000,40016=>1000,40017=>1000,40018=>1000,40019=>1000,40020=>1000, + 40021=>1000,40022=>1000,40023=>1000,40024=>1000,40025=>1000,40026=>1000,40027=>1000,40028=>1000,40029=>1000,40030=>1000,40031=>1000,40032=>1000,40033=>1000,40034=>1000,40035=>1000,40036=>1000, + 40037=>1000,40038=>1000,40039=>1000,40040=>1000,40041=>1000,40042=>1000,40043=>1000,40044=>1000,40045=>1000,40046=>1000,40047=>1000,40048=>1000,40049=>1000,40050=>1000,40051=>1000,40052=>1000, + 40053=>1000,40054=>1000,40055=>1000,40056=>1000,40057=>1000,40058=>1000,40059=>1000,40060=>1000,40061=>1000,40062=>1000,40063=>1000,40064=>1000,40065=>1000,40066=>1000,40067=>1000,40068=>1000, + 40069=>1000,40070=>1000,40071=>1000,40072=>1000,40073=>1000,40074=>1000,40075=>1000,40076=>1000,40077=>1000,40078=>1000,40079=>1000,40080=>1000,40081=>1000,40082=>1000,40083=>1000,40084=>1000, + 40085=>1000,40086=>1000,40087=>1000,40088=>1000,40089=>1000,40090=>1000,40091=>1000,40092=>1000,40093=>1000,40094=>1000,40095=>1000,40096=>1000,40097=>1000,40098=>1000,40099=>1000,40100=>1000, + 40101=>1000,40102=>1000,40103=>1000,40104=>1000,40105=>1000,40106=>1000,40107=>1000,40108=>1000,40109=>1000,40110=>1000,40111=>1000,40112=>1000,40113=>1000,40114=>1000,40115=>1000,40116=>1000, + 40117=>1000,40118=>1000,40119=>1000,40120=>1000,40121=>1000,40122=>1000,40123=>1000,40124=>1000,40125=>1000,40126=>1000,40127=>1000,40128=>1000,40129=>1000,40130=>1000,40131=>1000,40132=>1000, + 40133=>1000,40134=>1000,40135=>1000,40136=>1000,40137=>1000,40138=>1000,40139=>1000,40140=>1000,40141=>1000,40142=>1000,40143=>1000,40144=>1000,40145=>1000,40146=>1000,40147=>1000,40148=>1000, + 40149=>1000,40150=>1000,40151=>1000,40152=>1000,40153=>1000,40154=>1000,40155=>1000,40156=>1000,40157=>1000,40158=>1000,40159=>1000,40160=>1000,40161=>1000,40162=>1000,40163=>1000,40164=>1000, + 40165=>1000,40166=>1000,40167=>1000,40168=>1000,40169=>1000,40170=>1000,40171=>1000,40172=>1000,40173=>1000,40174=>1000,40175=>1000,40176=>1000,40177=>1000,40178=>1000,40179=>1000,40180=>1000, + 40181=>1000,40182=>1000,40183=>1000,40184=>1000,40185=>1000,40186=>1000,40187=>1000,40188=>1000,40189=>1000,40190=>1000,40191=>1000,40192=>1000,40193=>1000,40194=>1000,40195=>1000,40196=>1000, + 40197=>1000,40198=>1000,40199=>1000,40200=>1000,40201=>1000,40202=>1000,40203=>1000,40204=>1000,40205=>1000,40206=>1000,40207=>1000,40208=>1000,40209=>1000,40210=>1000,40211=>1000,40212=>1000, + 40213=>1000,40214=>1000,40215=>1000,40216=>1000,40217=>1000,40218=>1000,40219=>1000,40220=>1000,40221=>1000,40222=>1000,40223=>1000,40224=>1000,40225=>1000,40226=>1000,40227=>1000,40228=>1000, + 40229=>1000,40230=>1000,40231=>1000,40232=>1000,40233=>1000,40234=>1000,40235=>1000,40236=>1000,40237=>1000,40238=>1000,40239=>1000,40240=>1000,40241=>1000,40242=>1000,40243=>1000,40244=>1000, + 40245=>1000,40246=>1000,40247=>1000,40248=>1000,40249=>1000,40250=>1000,40251=>1000,40252=>1000,40253=>1000,40254=>1000,40255=>1000,40256=>1000,40257=>1000,40258=>1000,40259=>1000,40260=>1000, + 40261=>1000,40262=>1000,40263=>1000,40264=>1000,40265=>1000,40266=>1000,40267=>1000,40268=>1000,40269=>1000,40270=>1000,40271=>1000,40272=>1000,40273=>1000,40274=>1000,40275=>1000,40276=>1000, + 40277=>1000,40278=>1000,40279=>1000,40280=>1000,40281=>1000,40282=>1000,40283=>1000,40284=>1000,40285=>1000,40286=>1000,40287=>1000,40288=>1000,40289=>1000,40290=>1000,40291=>1000,40292=>1000, + 40293=>1000,40294=>1000,40295=>1000,40296=>1000,40297=>1000,40298=>1000,40299=>1000,40300=>1000,40301=>1000,40302=>1000,40303=>1000,40304=>1000,40305=>1000,40306=>1000,40307=>1000,40308=>1000, + 40309=>1000,40310=>1000,40311=>1000,40312=>1000,40313=>1000,40314=>1000,40315=>1000,40316=>1000,40317=>1000,40318=>1000,40319=>1000,40320=>1000,40321=>1000,40322=>1000,40323=>1000,40324=>1000, + 40325=>1000,40326=>1000,40327=>1000,40328=>1000,40329=>1000,40330=>1000,40331=>1000,40332=>1000,40333=>1000,40334=>1000,40335=>1000,40336=>1000,40337=>1000,40338=>1000,40339=>1000,40340=>1000, + 40341=>1000,40342=>1000,40343=>1000,40344=>1000,40345=>1000,40346=>1000,40347=>1000,40348=>1000,40349=>1000,40350=>1000,40351=>1000,40352=>1000,40353=>1000,40354=>1000,40355=>1000,40356=>1000, + 40357=>1000,40358=>1000,40359=>1000,40360=>1000,40361=>1000,40362=>1000,40363=>1000,40364=>1000,40365=>1000,40366=>1000,40367=>1000,40368=>1000,40369=>1000,40370=>1000,40371=>1000,40372=>1000, + 40373=>1000,40374=>1000,40375=>1000,40376=>1000,40377=>1000,40378=>1000,40379=>1000,40380=>1000,40381=>1000,40382=>1000,40383=>1000,40384=>1000,40385=>1000,40386=>1000,40387=>1000,40388=>1000, + 40389=>1000,40390=>1000,40391=>1000,40392=>1000,40393=>1000,40394=>1000,40395=>1000,40396=>1000,40397=>1000,40398=>1000,40399=>1000,40400=>1000,40401=>1000,40402=>1000,40403=>1000,40404=>1000, + 40405=>1000,40406=>1000,40407=>1000,40408=>1000,40409=>1000,40410=>1000,40411=>1000,40412=>1000,40413=>1000,40414=>1000,40415=>1000,40416=>1000,40417=>1000,40418=>1000,40419=>1000,40420=>1000, + 40421=>1000,40422=>1000,40423=>1000,40424=>1000,40425=>1000,40426=>1000,40427=>1000,40428=>1000,40429=>1000,40430=>1000,40431=>1000,40432=>1000,40433=>1000,40434=>1000,40435=>1000,40436=>1000, + 40437=>1000,40438=>1000,40439=>1000,40440=>1000,40441=>1000,40442=>1000,40443=>1000,40444=>1000,40445=>1000,40446=>1000,40447=>1000,40448=>1000,40449=>1000,40450=>1000,40451=>1000,40452=>1000, + 40453=>1000,40454=>1000,40455=>1000,40456=>1000,40457=>1000,40458=>1000,40459=>1000,40460=>1000,40461=>1000,40462=>1000,40463=>1000,40464=>1000,40465=>1000,40466=>1000,40467=>1000,40468=>1000, + 40469=>1000,40470=>1000,40471=>1000,40472=>1000,40473=>1000,40474=>1000,40475=>1000,40476=>1000,40477=>1000,40478=>1000,40479=>1000,40480=>1000,40481=>1000,40482=>1000,40483=>1000,40484=>1000, + 40485=>1000,40486=>1000,40487=>1000,40488=>1000,40489=>1000,40490=>1000,40491=>1000,40492=>1000,40493=>1000,40494=>1000,40495=>1000,40496=>1000,40497=>1000,40498=>1000,40499=>1000,40500=>1000, + 40501=>1000,40502=>1000,40503=>1000,40504=>1000,40505=>1000,40506=>1000,40507=>1000,40508=>1000,40509=>1000,40510=>1000,40511=>1000,40512=>1000,40513=>1000,40514=>1000,40515=>1000,40516=>1000, + 40517=>1000,40518=>1000,40519=>1000,40520=>1000,40521=>1000,40522=>1000,40523=>1000,40524=>1000,40525=>1000,40526=>1000,40527=>1000,40528=>1000,40529=>1000,40530=>1000,40531=>1000,40532=>1000, + 40533=>1000,40534=>1000,40535=>1000,40536=>1000,40537=>1000,40538=>1000,40539=>1000,40540=>1000,40541=>1000,40542=>1000,40543=>1000,40544=>1000,40545=>1000,40546=>1000,40547=>1000,40548=>1000, + 40549=>1000,40550=>1000,40551=>1000,40552=>1000,40553=>1000,40554=>1000,40555=>1000,40556=>1000,40557=>1000,40558=>1000,40559=>1000,40560=>1000,40561=>1000,40562=>1000,40563=>1000,40564=>1000, + 40565=>1000,40566=>1000,40567=>1000,40568=>1000,40569=>1000,40570=>1000,40571=>1000,40572=>1000,40573=>1000,40574=>1000,40575=>1000,40576=>1000,40577=>1000,40578=>1000,40579=>1000,40580=>1000, + 40581=>1000,40582=>1000,40583=>1000,40584=>1000,40585=>1000,40586=>1000,40587=>1000,40588=>1000,40589=>1000,40590=>1000,40591=>1000,40592=>1000,40593=>1000,40594=>1000,40595=>1000,40596=>1000, + 40597=>1000,40598=>1000,40599=>1000,40600=>1000,40601=>1000,40602=>1000,40603=>1000,40604=>1000,40605=>1000,40606=>1000,40607=>1000,40608=>1000,40609=>1000,40610=>1000,40611=>1000,40612=>1000, + 40613=>1000,40614=>1000,40615=>1000,40616=>1000,40617=>1000,40618=>1000,40619=>1000,40620=>1000,40621=>1000,40622=>1000,40623=>1000,40624=>1000,40625=>1000,40626=>1000,40627=>1000,40628=>1000, + 40629=>1000,40630=>1000,40631=>1000,40632=>1000,40633=>1000,40634=>1000,40635=>1000,40636=>1000,40637=>1000,40638=>1000,40639=>1000,40640=>1000,40641=>1000,40642=>1000,40643=>1000,40644=>1000, + 40645=>1000,40646=>1000,40647=>1000,40648=>1000,40649=>1000,40650=>1000,40651=>1000,40652=>1000,40653=>1000,40654=>1000,40655=>1000,40656=>1000,40657=>1000,40658=>1000,40659=>1000,40660=>1000, + 40661=>1000,40662=>1000,40663=>1000,40664=>1000,40665=>1000,40666=>1000,40667=>1000,40668=>1000,40669=>1000,40670=>1000,40671=>1000,40672=>1000,40673=>1000,40674=>1000,40675=>1000,40676=>1000, + 40677=>1000,40678=>1000,40679=>1000,40680=>1000,40681=>1000,40682=>1000,40683=>1000,40684=>1000,40685=>1000,40686=>1000,40687=>1000,40688=>1000,40689=>1000,40690=>1000,40691=>1000,40692=>1000, + 40693=>1000,40694=>1000,40695=>1000,40696=>1000,40697=>1000,40698=>1000,40699=>1000,40700=>1000,40701=>1000,40702=>1000,40703=>1000,40704=>1000,40705=>1000,40706=>1000,40707=>1000,40708=>1000, + 40709=>1000,40710=>1000,40711=>1000,40712=>1000,40713=>1000,40714=>1000,40715=>1000,40716=>1000,40717=>1000,40718=>1000,40719=>1000,40720=>1000,40721=>1000,40722=>1000,40723=>1000,40724=>1000, + 40725=>1000,40726=>1000,40727=>1000,40728=>1000,40729=>1000,40730=>1000,40731=>1000,40732=>1000,40733=>1000,40734=>1000,40735=>1000,40736=>1000,40737=>1000,40738=>1000,40739=>1000,40740=>1000, + 40741=>1000,40742=>1000,40743=>1000,40744=>1000,40745=>1000,40746=>1000,40747=>1000,40748=>1000,40749=>1000,40750=>1000,40751=>1000,40752=>1000,40753=>1000,40754=>1000,40755=>1000,40756=>1000, + 40757=>1000,40758=>1000,40759=>1000,40760=>1000,40761=>1000,40762=>1000,40763=>1000,40764=>1000,40765=>1000,40766=>1000,40767=>1000,40768=>1000,40769=>1000,40770=>1000,40771=>1000,40772=>1000, + 40773=>1000,40774=>1000,40775=>1000,40776=>1000,40777=>1000,40778=>1000,40779=>1000,40780=>1000,40781=>1000,40782=>1000,40783=>1000,40784=>1000,40785=>1000,40786=>1000,40787=>1000,40788=>1000, + 40789=>1000,40790=>1000,40791=>1000,40792=>1000,40793=>1000,40794=>1000,40795=>1000,40796=>1000,40797=>1000,40798=>1000,40799=>1000,40800=>1000,40801=>1000,40802=>1000,40803=>1000,40804=>1000, + 40805=>1000,40806=>1000,40807=>1000,40808=>1000,40809=>1000,40810=>1000,40811=>1000,40812=>1000,40813=>1000,40814=>1000,40815=>1000,40816=>1000,40817=>1000,40818=>1000,40819=>1000,40820=>1000, + 40821=>1000,40822=>1000,40823=>1000,40824=>1000,40825=>1000,40826=>1000,40827=>1000,40828=>1000,40829=>1000,40830=>1000,40831=>1000,40832=>1000,40833=>1000,40834=>1000,40835=>1000,40836=>1000, + 40837=>1000,40838=>1000,40839=>1000,40840=>1000,40841=>1000,40842=>1000,40843=>1000,40844=>1000,40845=>1000,40846=>1000,40847=>1000,40848=>1000,40849=>1000,40850=>1000,40851=>1000,40852=>1000, + 40853=>1000,40854=>1000,40855=>1000,40856=>1000,40857=>1000,40858=>1000,40859=>1000,40860=>1000,40861=>1000,40862=>1000,40863=>1000,40864=>1000,40865=>1000,40866=>1000,40867=>1000,40868=>1000, + 40869=>1000); +$diff=''; +$originalsize=23275812; + +// CID Information +// Select your language +// unicode to cid conversion table is from +// ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/ +// cid2code.txt in ac16.tar.Z,ag15.tar.Z,ak12.tar.Z and aj16.tar.Z. + +//$enc='UniCNS-UTF16-H'; +//$cidinfo=array('Registry'=>'Adobe','Ordering'=>'CNS1','Supplement'=>0); +//include(dirname(__FILE__).'/uni2cid_ac15.php'); + +//$enc='UniGB-UTF16-H'; +//$cidinfo=array('Registry'=>'Adobe','Ordering'=>'GB1','Supplement'=>2); +//include(dirname(__FILE__).'/uni2cid_ag15.php'); + +//$enc='UniKS-UTF16-H'; +//$cidinfo=array('Registry'=>'Adobe','Ordering'=>'Korea1','Supplement'=>0); +//include(dirname(__FILE__).'/uni2cid_ak12.php'); + +$enc='UniJIS-UTF16-H'; +$cidinfo=array('Registry'=>'Adobe','Ordering'=>'Japan1','Supplement'=>5); +include(dirname(__FILE__).'/uni2cid_aj16.php'); +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/courier.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/courier.php new file mode 100644 index 0000000..1ce3afc --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/courier.php @@ -0,0 +1,33 @@ +<?php + // core font definition file for TCPDF (www.tcpdf.org) +$type='core'; +$dw=600; +$cw=array(0=>600,1=>600,2=>600,3=>600,4=>600,5=>600,6=>600,7=>600,8=>600,9=>600, +10=>600,11=>600,12=>600,13=>600,14=>600,15=>600,16=>600,17=>600,18=>600,19=>600, +20=>600,21=>600,22=>600,23=>600,24=>600,25=>600,26=>600,27=>600,28=>600,29=>600, +30=>600,31=>600,32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600, +40=>600,41=>600,42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600, +50=>600,51=>600,52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600, +60=>600,61=>600,62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600, +70=>600,71=>600,72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600, +80=>600,81=>600,82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600, +90=>600,91=>600,92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600, +100=>600,101=>600,102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600, +109=>600,110=>600,111=>600,112=>600,113=>600,114=>600,115=>600,116=>600,117=>600, +118=>600,119=>600,120=>600,121=>600,122=>600,123=>600,124=>600,125=>600,126=>600, +127=>600,128=>600,129=>600,130=>600,131=>600,132=>600,133=>600,134=>600,135=>600, +136=>600,137=>600,138=>600,139=>600,140=>600,141=>600,142=>600,143=>600,144=>600, +145=>600,146=>600,147=>600,148=>600,149=>600,150=>600,151=>600,152=>600,153=>600, +154=>600,155=>600,156=>600,157=>600,158=>600,159=>600,160=>600,161=>600,162=>600, +163=>600,164=>600,165=>600,166=>600,167=>600,168=>600,169=>600,170=>600,171=>600, +172=>600,173=>600,174=>600,175=>600,176=>600,177=>600,178=>600,179=>600,180=>600, +181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600,188=>600,189=>600, +190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600,198=>600, +199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600, +208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600, +217=>600,218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600, +226=>600,227=>600,228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600, +235=>600,236=>600,237=>600,238=>600,239=>600,240=>600,241=>600,242=>600,243=>600, +244=>600,245=>600,246=>600,247=>600,248=>600,249=>600,250=>600,251=>600,252=>600, +253=>600,254=>600,255=>600); +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/AUTHORS b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/AUTHORS new file mode 100644 index 0000000..94d37c2 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/AUTHORS @@ -0,0 +1,46 @@ +abysta at yandex.ru +Adrian Schroeter +Andrey Valentinovich Panov +Ben Laenen +Besarion Gugushvili +Bhikkhu Pesala +Clayborne Arevalo +Dafydd Harries +Danilo Segan +Davide Viti +David Jez +David Lawrence Ramsey +Denis Jacquerye +Dwayne Bailey +Eugeniy Meshcheryakov +Gee Fung Sit +Heikki Lindroos +James Cloos +James Crippen +John Karp +Keenan Pepper +Lars Naesbye Christensen +Mashrab Kuvatov +Max Berger +Mederic Boquien +Michael Everson +Misu Moldovan +Nguyen Thai Ngoc Duy +Nicolas Mailhot +Ognyan Kulev +Ondrej Koala Vacha +Peter Cernak +Remy Oudompheng +Roozbeh Pournader +Sahak Petrosyan +Sander Vesik +Stepan Roh +Stephen Hartke +Steve Tinney +Tavmjong Bah +Tim May +Valentin Stoykov +Vasek Stodulka +Wesley Transue + +$Id: AUTHORS 2344 2009-03-08 13:02:37Z moyogo $ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/BUGS b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/BUGS new file mode 100644 index 0000000..49b36de --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/BUGS @@ -0,0 +1,3 @@ +See http://dejavu.sourceforge.net/wiki/index.php/Bugs + +$Id: BUGS 80 2004-11-13 13:12:02Z src $ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/LICENSE b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/LICENSE new file mode 100644 index 0000000..254e2cc --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/LICENSE @@ -0,0 +1,99 @@ +Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. +Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) + +Bitstream Vera Fonts Copyright +------------------------------ + +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is +a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of the fonts accompanying this license ("Fonts") and associated +documentation files (the "Font Software"), to reproduce and distribute the +Font Software, including without limitation the rights to use, copy, merge, +publish, distribute, and/or sell copies of the Font Software, and to permit +persons to whom the Font Software is furnished to do so, subject to the +following conditions: + +The above copyright and trademark notices and this permission notice shall +be included in all copies of one or more of the Font Software typefaces. + +The Font Software may be modified, altered, or added to, and in particular +the designs of glyphs or characters in the Fonts may be modified and +additional glyphs or characters may be added to the Fonts, only if the fonts +are renamed to names not containing either the words "Bitstream" or the word +"Vera". + +This License becomes null and void to the extent applicable to Fonts or Font +Software that has been modified and is distributed under the "Bitstream +Vera" names. + +The Font Software may be sold as part of a larger software package but no +copy of one or more of the Font Software typefaces may be sold by itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, +TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME +FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING +ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF +THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE +FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome +Foundation, and Bitstream Inc., shall not be used in advertising or +otherwise to promote the sale, use or other dealings in this Font Software +without prior written authorization from the Gnome Foundation or Bitstream +Inc., respectively. For further information, contact: fonts at gnome dot +org. + +Arev Fonts Copyright +------------------------------ + +Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the fonts accompanying this license ("Fonts") and +associated documentation files (the "Font Software"), to reproduce +and distribute the modifications to the Bitstream Vera Font Software, +including without limitation the rights to use, copy, merge, publish, +distribute, and/or sell copies of the Font Software, and to permit +persons to whom the Font Software is furnished to do so, subject to +the following conditions: + +The above copyright and trademark notices and this permission notice +shall be included in all copies of one or more of the Font Software +typefaces. + +The Font Software may be modified, altered, or added to, and in +particular the designs of glyphs or characters in the Fonts may be +modified and additional glyphs or characters may be added to the +Fonts, only if the fonts are renamed to names not containing either +the words "Tavmjong Bah" or the word "Arev". + +This License becomes null and void to the extent applicable to Fonts +or Font Software that has been modified and is distributed under the +"Tavmjong Bah Arev" names. + +The Font Software may be sold as part of a larger software package but +no copy of one or more of the Font Software typefaces may be sold by +itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL +TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the name of Tavmjong Bah shall not +be used in advertising or otherwise to promote the sale, use or other +dealings in this Font Software without prior written authorization +from Tavmjong Bah. For further information, contact: tavmjong @ free +. fr. + +$Id: LICENSE 2133 2007-11-28 02:46:28Z lechimp $ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/NEWS b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/NEWS new file mode 100644 index 0000000..a05a30c --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/NEWS @@ -0,0 +1,1215 @@ +Changes from 2.29 to 2.30 + +* added U+0462-U+0463 to Mono (by Denis Jacquerye) +* corrected U+1E53 in Serif (by Gee Fung Sit) +* added U+1E4C-U+1E4D to Mono and Serif (by Gee Fung Sit) +* added U+1E78-U+1E79 to Mono (by Gee Fung Sit) +* fixed missing diacritics in Latin Extended Additional in Sans ExtraLight + (moved stacked diacritics out of PUA in the process) (by Gee Fung Sit) +* fixed anchors on U+1E78 in Serif (by Gee Fung Sit) +* added U+1DC4-U+1DC9 to Serif (by Denis Jacquerye) +* renamed above-mark to above-mark in Serif-Italic (by Denis Jacquerye) +* added U+1DC4-U+1DC9 to context class for dotless substitution (by Denis + Jacquerye) +* changed Doubleacute to Doublegrave in Sans ExtraLight (by Gee Fung Sit) +* removed redundant reference in U+01FB in Sans Oblique (by Gee Fung Sit) +* added U+A726-U+A727 to Mono (Denis Jacquerye) +* changed U+04BE and U+04BF according to recommedations of Sasha Ankwab in Sans + (by Andrey V. Panov) +* remove "Symbol Charset" from set of codepages in Sans (by Eugeniy + Meshcheryakov) + +Changes from 2.28 to 2.29 + +* modified U+10FB in Sans to be a mirror image of U+2056, since U+10FB is not + Georgian-specific (by Roozbeh Pournader) +* added U+2B1F, U+2B24, U+2B53, U+2B54 in Sans (by Roozbeh Pournader) +* fixed TUR opentype language tag to TRK in Serif (bug 19825) (by Ben Laenen) +* early implementation of Abkhaz letter U+0524-U+0525 in Sans + (by Michael Everson and abysta) +* flipped U+1D538 in Sans (by Gee Fung Sit) +* added U+26B3-U+26B8, U+1D7D8-U+1D7E1 in Sans (by Gee Fung Sit) +* corrected U+1D7A9 in Sans Bold Oblique (by Gee Fung Sit) +* Fixed U+0649 to be dual-joining in Sans Mono (by Roozbeh Pournader) +* Remove unnecessary 'isol' feature from Sans Mono (by Roozbeh Pournader) +* Remove 'cmap' mappings for U+066E, U+066F, U+067C, U+067D, U+0681, U+0682, + U+0685, U+0692, U+06A1, U+06B5, U+06BA, U+06C6, U+06CE, and U+06D5 + in Sans Mono (bug 20323) (by Roozbeh Pournader) +* add half brackets (U+2E22 - U+2E25, by Steve Tinney) + +Changes from 2.27 to 2.28 + +* added U+A789, U+A78A in Sans and Sans Mono (by Denis Jacquerye) +* modified U+02D6, U+02D7, U+02EE in Sans and Sans Mono (by Denis Jacquerye) +* added U+1E9E (German capital ß) to Sans and Serif (by Denis Jacquerye) +* adjusted width of U+01B7-U+01B9 in Serif Italic (by Denis Jacquerye) +* modified U+021C, U+021D in Sans (by Denis Jacquerye) +* added U+021C, U+021D in Mono (by Denis Jacquerye) +* added U+F428 (Georgian Nuskhuri "f") in private use area (by Besarion + Gugushvili) +* updated Georgian mkhedruli (U+10D0-U+10FA) with new version (by Besarion + Gugushvili) +* updated Georgian asomtavruli (U+10A0-U+10C5) with new version (by Besarion + Gugushvili) +* added Georgian nuskhuri (U+2D00-U+2D25) (by Besarion Gugushvili) +* added Georgian mtavruli in private use area (U+F400-U+F426) (by Besarion + Gugushvili) +* added mark anchors above to Cyrillic U+0430-U+0438, U+043A-U+044F, + U+0454-U+0455 in Mono (by Ben Laenen) +* modified/moved up U+0318-U+0319, U+031C-U+031F, U+0329-U+032A, U+032C-U+032D, + U+0339-U+033B, U+0348 and U+0353 in Sans to prevent cut-off (by Gee Fung Sit) +* added U+035A to Sans (by Gee Fung Sit) +* updated fontconfig files (by Nicolas Mailhot) +* added U+2032-2037 to Mono (by Denis Jacquerye) +* added Ogham to Sans ExtraLight (by Gee Fung Sit) +* added U+2C6F, U+2C79, U+2C7C-2C7D to Mono (by Gee Fung Sit) +* added U+210F to Serif and Sans ExtraLight (by Gee Fung Sit) +* changed U+210F to a more common glyph in Sans and Mono (by Gee Fung Sit) + +Changes from 2.26 to 2.27 + +* added some of Michael Everson's new Cyrillic glyphs to Sans (by Wesley + Transue) +* removed blank glyph at U+05EF from Sans Bold Oblique (by Gee Fung Sit) +* small adjustments to existing tone bars in Sans and Mono (by Gee Fung Sit) +* added U+0372-U+0373, U+0376-U+0377, U+03CF, U+A668-U+A66E, U+A708-U+A711, + U+A71B-U+A71F to Sans (by Gee Fung Sit) +* copied U+02E5-U+02E9 over from Sans to fix inconsistencies in Serif (by Gee + Fung Sit) +* added U+021C-U+021D, U+0370-U+0371, U+037B-U+037D, U+0470-U+0471, + U+0510-U+0515, U+051A-U+051D, U+1E9F, U+2C64, U+2C6E-U+2C6F, U+2C79, + U+2C7C-U+2C7D, U+A644-U+A647, U+A650-U+A651, U+A654-U+A657, U+A708-U+A716, + U+A71B-U+A71F to Serif (by Gee Fung Sit) +* added U+A708-U+A716, U+A71B-U+A71F to Mono (by Gee Fung Sit) +* added anchors to U+017F (ſ) and fixed U+1E9B (ẛ) in Serif (by Gee Fung Sit) +* made U+0325 smaller in Sans Bold and Serif to match Sans Book (by Gee Fung + Sit) +* fixes to U+02F3 (moved up), U+228F-U+2294 (more square-like) and + U+22CE-U+22CF (stroke width) in Sans (by Gee Fung Sit) +* replaced U+2202 ∂ (Sans and Mono) and U+221D ∝, U+221E ∞ (Sans) with glyphs + from Arev (with small changes) (by Gee Fung Sit) +* added U+22B0-U+22B1, U+22C7, U+22D0-U+22D5 from Arev to Sans to complete the + block (by Gee Fung Sit) +* added U+0514-U+0515 to Sans ExtraLight (by Gee Fung Sit) +* skewed U+A78C in all Oblique/Italic fonts (by Gee Fung Sit) +* moved U+2215 to U+2044 in Sans and Serif and replaced U+2215 with reference + to U+002F in all fonts (by Gee Fung Sit) +* added U+2C6E to Mono (by Denis Jacquerye) +* added U+A782 and U+A783 in Sans (by Wesley Transue) +* added U+0244, U+024C-024D, U+2C64 in Sans Mono (by Denis Jacquerye) +* modified U+01AE in Sans Mono (by Denis Jacquerye) +* added U+2C7A to all fonts (by Gee Fung Sit) +* italicized/small changes to U+2C76 in Serif (Bold) Italic (by Gee Fung Sit) +* improved outlines of U+2C68, U+2C6A, U+2C6C in Serif (Bold) Italic (by Gee + Fung Sit) +* rounded U+2C77 at the bottom in Serif (by Gee Fung Sit) +* added joining behavior for tone letters (U+02E5-U+02E9) in Sans (bug #15669) + (by Gee Fung Sit) +* fixed outline of y.alt in Sans Regular (by Denis Jacquerye) +* changed references of U+1D5A8, U+1D5C5, U+1D5DC, U+1D5F9, U+1D610, U+1D62D, + U+1D644 and U+1D661 to stylistic alternates to have a better distinction (by + Gee Fung Sit) +* hinted I.alt in Sans Regular (by Gee Fung Sit) +* added U+0487, completing Cyrillic block (by Gee Fung Sit) +* extended the bar of U+0463 to the right and moved the anchor (by Gee Fung + Sit) +* added anchors to glyphs in Cyrillic block (by Gee Fung Sit) +* added (preliminary) hints to tone letter forms (U+02E5.5, U+02E9.1, stem) in + Sans Book (by Gee Fung Sit) + +Changes from 2.25 to 2.26 + +- added glyphs for Cyrillic-B to Sans (by Wesley Transue) +- added U+0370-U+0371 to Sans (by Wesley Transue) +- added U+019C, U+01A2-U+01A3, U+01A6, U+01E4-U+01E5, U+024C-U+024D, U+0285, + U+0290, U+02A0, U+0370-U+0371, U+03F1, U+03FC to Sans ExtraLight (by Wesley + Transue) +- added U+20A0-U+20A5, U+20A7-U+20B3, U+2105, U+210D, U+210F, U+2115, U+2117, + U+2119-U+211A, U+211D, U+2124, U+212E, U+2200-U+2204 to Mono (by Heikki + Lindroos) +- added U+01BA and U+01BF to Mono (by Heikki Lindroos) +- merged OpenType "aalt" feature in Latin in Sans (by Denis Jacquerye) +- added alternative shape for y in Sans (by Denis Jacquerye) +- added saltillo (U+A78B-U+A78C) to all faces (by James Cloos) +- changed U+047C-U+047D to references instead of outlines in Sans (by Wesley + Transue) +- added Latin letter tresillo U+A72A-U+A72B to Sans (by Wesley Transue) +- added U+A734-U+A737 to Sans (by Wesley Transue) +- added U+2053 to Serif and fixed it bug:9425 in Sans (by Gee Fung Sit) +- removed problematic hints for U+0423 bug:10025 (by Gee Fung Sit) +- added U+27C5-U+27C6 bug:10255 to all faces (by Gee Fung Sit) +- fixed width of U+2016 in Sans Oblique (by Gee Fung Sit) +- added U+2016, U+2032-U+2038, U+2042, U+2045-U+2046, U+204B-U+204F, + U+2051-U+2052, U+2057 to Serif (by Gee Fung Sit) +- made U+2140 bigger to match other n-ary operators (by Gee Fung Sit) +- added U+0606-U+0607, U+0609-U+060A to Sans (by Gee Fung Sit) +- added U+221B-U+221C to Mono (by Gee Fung Sit) +- small adjustments to U+221B-U+221C in Sans and Serif (by Gee Fung Sit) +- update U+04B4-U+04B5 in Serif (by Andrey V. Panov) +- increased max-storage value from maxp table to 153 (by Andrey V. Panov) +- added U+0472-U+0473, U+0510-U+0511, U+051A-U+051D, U+0606-U+0607, + U+0609-U+060A, U+1E26-U+1E27, U+1E54-U+1E55, U+1E7C-U+1E7D, U+1E8C-U+1E8D, + U+1E90-U+1E91, U+1E97-U+1E99, U+1E9F, U+1EAC-U+1EAD, U+1EB6-U+1EB7, + U+1EC6-U+1EC7, U+1ED8-U+1EDD, U+1EE0-U+1EE3, U+1EE8-U+1EEB, U+1EEE-U+1EF1 to + Mono (by Gee Fung Sit) +- added locl rules for S/T cedilla for Romanian and Moldavian so they get + rendered as S/T with comma accent (see Redhat bug #455981) (by Ben Laenen) +- removed ligature rule from Armenian U+0587 bug:16113 (by Gee Fung Sit) + +Changes from 2.24 to 2.25 + +- moved/added U+2E18 (by Gee Fung Sit) +- added empty glyph for U+2064 in Sans and Serif (by Gee Fung Sit) +- added U+22CE-U+22CF to Sans (by Gee Fung Sit) +- Sans Oblique and Bold Oblique, Serif: reverted digits hinting instructions back to before revision 1590, which fixed mistaken debian bug #471024. This fixes Debian bug #411308. The original bug was in freetype not in the fonts (by Denis Jacquerye) +- added U+A726-U+A729, U+A730-U+A733, U+A738-U+A73F, U+A746-U+A74B, U+A74E-U+A74F, U+A780-U+A781, U+A7FB-U+A7FF to Sans (by Gee Fung Sit) +- added Macedonian italic glyph shape for U+0453 in Serif (by Ben Laenen) +- changed descenders in U+0446, U+0449, U+0497, U+04A3, U+04AD (by Andrey V. Panov) +- updated main SFD files to SplineFontDB 3.0 (Denis Jacquerye and Gee Fung Sit) +- moved U+0561 2 up since it wasn't aligned with the baseline well (by Ben Laenen) +- added U+2E2E to Sans (by Gee Fung Sit) +- replaced U+2699 with simpler version in Sans (by Gee Fung Sit) +- added a lot of hinting instructions to Latin Extended B, Greek and Coptic glyphs Sans Book (by Wesley Transue) +- differentiated U+2219 from U+22C5 and adjusted affected references in Sans and Mono (by Gee Fung Sit) +- made Hebrew narrower in Sans Bold and Sans Bold Oblique (by Denis Jacquerye) +- added Kurdish and Chuvash letters from Unicode 5.1 Cyrillic Extended block (by Wesley Transue) +- added U+1E9F, U+A644-U+A647, U+A64C-U+A64D, U+A650-U+A651, U+A654-U+A655, U+A712U+A716 to Sans (by Gee Fung Sit) +- added several glyphs to Sans ExtraLight (by Gee Fung Sit) +- added hinting instructions to U+046A-U+046B, U+0508-U+0509, U+050B, U+0512-U+0513 in Sans Book (by Wesley Transue) +- corrected width of U+027E in Sans Book (by Gee Fung Sit) +- added U+2C79, U+2C7B-U+2C7D to Sans (by Gee Fung Sit) +- added a bunch of glyphs+small corrections to Sans Light (by Gee Fung Sit) +- added U+0496, U+0497, U+04B0, U+04B1 (by Andrey V. Panov) +- updated U+0493, U+049B, U+04B3, U+04B7, U+04F7 (by Andrey V. Panov) +- further improvements in extended Cyrillic (by Andrey V. Panov) + +Changes from 2.23 to 2.24 + +- instructions for U+05C0 ׀, U+05C3 ׃, U+05F3 ׳, and U+05F4 ״ in DejaVu + Sans. (by Wesley Transue) +- instructions for U+2116 in Sans (by Andrey V. Panov) +- Unicode 5.1 update: moved U+F208 to U+2C6D, U+F25F to U+2C71, added + U+2C6E-U+2C6F, U+2C72-U+2C73, updated outline of U+2C71 in Sans. (by + Denis Jacquerye) +- updated and instructed U+0401 in Sans (by Andrey V. Panov) +- fixed the bug in Sans faces where U+02EC ˬ faced the wrong direction. + Also, added a few more glyph instructions. (by Wesley Transue) +- removed OS2Sub and OS2Strike that weren't intentional in Sans + ExtraLight. (by Denis Jacquerye) +- updated instructions for U+401, U+44F in Serif Book. (by Andrey V. + Panov) +- instructions for U+02C4 ˄, U+02C5 ˅, U+03D8 Ϙ, U+03D9 ϙ, U+0494 Ҕ, and + U+0495 ҕ in Sans Book. (by Wesley Transue) +- instructions for U+01A6 Ʀ, U+0238 ȸ, U+0239 ȹ, U+02EC ˬ, and U+05C6 ׆ + in Sans Book. (by Wesley Transue) +- DejaVuSans.sfd DejaVuSerif.sfd: updated instructions for U+447 and + U+451 using code generated with xgridfit (by Andrey V. Panov) +- instructions for a few glyphs in the Latin Extended-B Block, Greek + Block, Cyrillic Block, and N'Ko block. (by Wesley Transue) +- updated sfdnormalize.pl, and SFD files to new SFD format with empty + lines. (by Denis Jacquerye) + +Changes from 2.22 to 2.23 + +- fixed bug which made Condensed fonts appear instead of normal width ones +- added U+20DB, U+20DC, and U+20E1 to Sans (by Roozbeh Pournader) +- added hinting instructions to U+01A7, U+01AA-U+01AC, U+01AE-U+01AF, + U+01BC-U+01BD, U+01BF, U+01F7, U+0277, U+027F, U+0285-U+0286, U+0297, U+02AF, + U+02B4-U+02B5, U+02BD, U+030D, U+0311, U+0329, U+04A0-U+04A1 in Sans Book (by + Wesley Transue) +- modified hinting instructions of U+04A2 in Sans Book (by Wesley Transue) +- added hinting instructions to U+237D, U+2423 in Mono Book and Mono Bold (by + Wesley Transue) +- added mathematical alphanumeric symbols to all styles (by Max Berger) +- added Unicode 5.1 U+2E18 as U+2E18.u51 (not yet usable) to Sans (by Roozbeh + Pournader) +- dereferenced all glyphs with mixed references and outlines (by Denis + Jacquerye) +- removed non-zero width from U+0344 in Sans (by Denis Jacquerye) + +Changes from 2.21 to 2.22 + +- directory structure has changed, we now use the Makefile +- modified Armenian U+0565 in Sans (by Սահակ Պետրոսյան) +- added double struck letters and numbers U+2102, U+210D, U+2115, + U+2119-U+211A, U+211D, U+2124, U+213C-U+2140, U+2145-U+2149, U+1D538-U+1D539, + U+1D53B-U+1D53E, U+1D540-U+1D544, U+1D546, U+1D54A-U+1D550, U+1D552-U+1D56B, + U+1D7D8-U+1D7E1 to Serif (by Stephen Hartke) +- added letterlike symbols U+2103, U+2109, U+2127, U+214B, U+2141-U+2144 to + Serif (by Ben Laenen) +- fixed outline direction of U+2143 in Sans Bold/Bold Oblique (by Ben Laenen) +- added arrow set in Serif: arrows: U+2194-U+21FF; dingbats: U+27A1; + supplemental arrows A: U+27F0-U+27FF; supplemental arrows B: U+2900-U+2975, + U+297A; miscellaneous symbols and arrows: U+2B00-U+2B11 (by Ben Laenen) +- added U+0180, U+01DE, U+01E0-01E1, U+022A, U+022C, U+0230, U+1E08-U+1E09, + U+1E10-U+1E11, U+1EB0-U+1EB1 to Mono (by Denis Jacquerye) +- adjusted U+01D5, U+01D7, U+01D9, U+1DB in Mono (by Denis Jacquerye) +- added Ogham in Sans (by Wesley Transue) +- added Yijing Hexagram Symbols in Sans (by Wesley Transue) +- hinting instructions added to Cyrillic U+0460, U+04A6-U+04A7, U+04AC-U+04AD, + U+04C7-U+04C8, U+04F6-U+04F7, U+04FA-U+04FB, U+050C-U+050D in Sans Book (by + Wesley Transue) +- adjusted Cyrillic letters U+042A, U+044A, U+044C, U+0459-U+045B, U+0462, + U+048C-U+048D in Serif (by Andrey V. Panov) +- hinting instructions added to Lao U+0EB7 in Sans (by Wesley Transue) +- added Roman numerals and Claudian letter U+2160-U+2184 in Serif (by Ben + Laenen) +- added U+FFF9-U+FFFD to Sans, Serif and Mono (by Lars Næsbye Christensen) +- added mathematical symbols to Serif: U+2200, U+2203-U+2204, U+2213-U+2214, + U+2217-U+2218, U+2223-U+2226, U+2250-U+2255, U+2295-U+22AF, U+22C5 (by Ben + Laenen) +- modified bullet symbol U+2219 in Serif (by Ben Laenen) + +Changes from 2.20 to 2.21 + +- added U+FE20-U+FE23 (half diacritics) to Sans (by Denis Jacquerye) +- added anchor "half" to position right half of double marks, U+FE21 or U+FE23 + to Sans (by Denis Jacquerye) +- shifted U+0360 up to avoid collision with some outlines in Sans (by Denis + Jacquerye) +- added anchor above-mark anchor to U+035D, U+035E, U+0360, U+0361 in Sans (by + Denis Jacquerye) +- added instructions for ff, ffi, ffl ligatures in Serif Bold (by Eugeniy + Meshcheryakov) +- added instructions to some N'Ko glyphs (by Wesley Transue) +- added instructions to some Lao glyphs (by Wesley Transue) +- cleaning up 'liga' Standard Ligature in Latin, in Sans and Sans Mono (by + Denis Jacquerye) +- added U+046A, U+046B (big yus) in Serif (by Andrey V. Panov) +- added box drawing symbols to Sans and Serif (by Lars Næsbye Christensen) +- added Makefile to improve font and packages generating (by Nicolas Mailhot) + +Changes from 2.19 to 2.20 + +- removed TeX and TeXData tags from all sfd files (by Eugeniy Meshcheryakov) +- removed all 'frac' lookups (by Eugeniy Meshcheryakov) +- fixed duplicate glyph names (by Eugeniy Meshcheryakov) +- removed standard ligatures with U+00B7 in Mono (by Eugeniy Meshcheryakov) +- use reference to U+002D in U+00AD in Sans Oblique, and adjust instructions + (by Eugeniy Meshcheryakov) +- updated Cyrillic in Sans Extra Light (by Andrey V. Panov) +- added instructions to N'Ko U+07C1-U+07C6, U+07CA, U+07CE-U+07CF, U+07D1, + U+07D3-U+07D4, U+07D8, U+07DB and U+07EB in Sans (by Wesley Transue) +- added instructions to Lao U+0E8A, U+0E95, U+0E97, U+EA5, U+0EB4 and U+0EB5 + (by Wesley Transue) +- adjusted instructions for Hebrew glyphs (by Denis Jacquerye) +- added instructions for U+0265 in Sans Bold (by Denis Jacquerye) +- fix U+1D68 in Sans: it had the shape of delta, where it should be a rho (by + Ben Laenen) +- remove U+1D5C glyph in Sans Oblique (it was empty) (by Ben Laenen) +- fix instructions of U+01AD in Sans Bold (by Ben Laenen) +- fix instructions of U+042D in Serif (by Ben Laenen) +- remove buggy instructions of U+2328 in Serif (by Ben Laenen) +- corrected width of U+2C75-U+2C76 in Sans Bold and Serif Bold (by Gee Fung Sit) +- added U+2C75-U+2C77 to Mono (by Gee Fung Sit) + +Changes from 2.18 to 2.19 + +- fixed misplaced symbols (U+2325,2326) in Sans Oblique (by John Karp) +- added Mark to Base anchors: 'cedilla' for combining cedilla and + 'above-legacy' for stacking above precomposed glyphs (just a,e,i,o,u with + macron for now) in Sans (by Denis Jacquerye). +- added contextual substitution for Case and Dotless forms in all Sans variants + (by Denis Jacquerye). +- renamed 'ccmp' lookups for RTL and Basic (LGC, etc.) (by Denis Jacquerye) +- added anchor 'cedilla' for vowels in Sans. (by Denis Jacquerye) +- extended contextual dotless and case substitutions to handle both below and + above diacritics (by Denis Jacquerye) +- renamed Dotless and Case Form GSUB lookups in Sans with meaningful names (by + Denis Jacquerye) + +Changes from 2.17 to 2.18 + +- Re-encoded the source files for Full Unicode (by Ben Laenen) +- Re-enabled the "ff", "fl", "fi", "ffl", "ffi" ligatures by default in Serif + (by Ben Laenen) +- Disabled the "fi", "ffi" ligatures for languages with dotless i in Serif (by + Ben Laenen) +- added Tifinagh to Sans Book and Bold, U+2D30-U+2D65, U+2D6F, partially hinted + in Sans Book. (by Denis Jacquerye) +- added Tai Xuan Jing Symbols (U+1D300-1D356) to Sans (by Remy Oudompheng) +- added double-struck letters (U+1D538-U+1D56B minus reserved code points) to + Sans (by Gee Fung Sit) +- added U+22EE-U+22F1 to Sans (by Gee Fung Sit) +- added U+2C67-U+2C6C, U+2C75-U+2C77 to Serif (by Gee Fung Sit) +- italicized various glyphs in Latin Extended-B, IPA Extensions, Spacing + Modifier Letters, Phonetic Extension (Supplement) and Super- and Subscripts + in Serif Oblique fonts (by Gee Fung Sit) +- modified outlines, bearings of Hebrew U+05D6, U+05D8, U+05DB, U+05DE, U+05E0, + U+05E1, U+05E2, U+05EA in Sans Book and Oblique, adjusted hinting in Book + based on Yotam Benshalom's comments. (by Denis Jacquerye) +- added Braille Patterns (U+2800-U+28FF) to Serif fonts (by Gee Fung Sit) +- added N'Ko to Sans Book and Bold: U+07C0-U+07E7, U+07EB-U+07F5, U+07F8-U+07FA + (by Eugeniy Meshcheryakov) +- added U+0ED8 (Lao digit 8) to Sans (by Remy Oudompheng) +- added Lao diacritics U+0EB0-0EB9, U+0EBB-0EBC, U+0EC8-0ECD to Mono (by Remy + Oudompheng) +- renamed Serif [Bold] Oblique, make it Italic (by Eugeniy Meshcheryakov) +- added U+29FA-U+29FB to Sans and Sans Mono (by Gee Fung Sit) +- swapped glyphs for Eng U+014A from Sami Eng to African Eng, the latter being + more common (by Denis Jacquerye) +- swapped ae U+00E6 and ae.alt in Serif Italics fonts, thus fixing #8213 (by + Denis Jacquerye) +- minor improvements to Misc. Symbols in Sans (by Gee Fung Sit) +- minor improvements and additions to Sans ExtraLight (by Gee Fung Sit) +- improved instructions for various Cyrillic letters (by Eugeniy Meshcheryakov) +- fixed hinting of theta and chi in Sans Book (by Ben Laenen) +- added Georgian Mkhedruli to Sans, Serif and Mono, ASumtavruli to Sans and + Serif (by Besarion Gugushvili) + +Changes from 2.16 to 2.17 + +- Sans fonts: fix position for certain combinations of Arabic fatha, kasra, + shadda, damma, kasratan, dammatan, fathatan and hamza (by Ben Laenen) +- added 'ae.alt' to Serif Oblique fonts, with design matching shape of italic + 'a' instead of slanted 'a', see bug #8213 (by Denis Jacquerye) +- added super- and subscripts to Serif and Mono: U+1D2C-U+1D2E, U+1D30-U+1D3C, + U+1D3E-U+1D42, U+1D62-U+1D65, U+1D78, U+2071, U+207A-U+207E, U+208A-U+208E, + U+2090-U+2094 (by Gee Fung Sit) + +Changes from 2.15 to 2.16 + +- fixed hinting instructions for digits in DejaVu Sans Oblique, Bold Oblique, + and Serif Book to not change glyph width (by Eugeniy Meshcheryakov) +- added instructions for U+0404, U+0411, U+0413, U+0414, U+0417-U+041B, U+041F, + U+0423, U+0424, U+0426-U+0429, U+042C, U+042E, U+042F, U+0490 in Serif Bold + (by Eugeniy Meshcheryakov) +- added U+0220 and Eng.alt to Serif fonts (by Denis Jacquerye) +- added U+232C, U+2394, U+23E3 to Sans fonts (by John Karp) +- added U+230C-U+230F, U+231C-U+231F to Sans fonts, fixing bug:9547 + (by John Karp) +- adjusted dot below, dot above, dieresis above, dieresis below in Sans fonts + (by Denis Jacquerye) +- added U+2300, U+2301, U+2303, U+2304, U+2305, U+2307, U+2326, U+2327, U+232B, + arrow.base to Sans fonts (by John Karp) +- adjusted dot and dieresis below and above in Serif fonts (by Denis Jacquerye) +- added U+1E1C-U+1E1D to Serif fonts (by Denis Jacquerye) +- added U+22BE, U+22BF (by Wesley Transue) +- added U+2324; modified U+2325: more standard proportions, and matches U+2324 + and U+2387; added U+2387 : flipped U+2325 with standard arrowhead + (by John Karp) +- added Lao digits U+0ED0-0ED7, U+0ED9 (by Remy Oudompheng) +- added to Mono in Arabic block : U+060C, U+0615, U+061B, U+061F, + U+0621-U+063A, U+0640-0655, U+065A, U+0660-066F, U+0674, U+0679-0687, U+0691, + U+0692, U+0698, U+06A1, U+06A4, U+06A9, U+06AF, U+06B5, U+06BA, U+06BE, + U+06C6, U+06CC, U+06CE, U+06D5, U+06F0-06F9 (by Remy Oudompheng) +- added to Mono in Arabic Presentations Forms-A : U+FB52-FB81, U+FB8A-FB95, + U+FB9E, U+FB9F, U+FBAA-FBAD, U+FBE8, U+FBE9, U+FBFC-FBFF (by Remy Oudompheng) +- added to Mono in Arabic Presentations Forms-B : U+FE70-FE74, U+FE76-FEFC, + U+FEFF (by Remy Oudompheng) +- added U+05BA, U+05BE, U+05F3, U+05F4, U+FB1E, U+FB21-U+FB28, U+FB4F to Sans + (by Eugeniy Meshcheryakov) +- added U+2102 to Mono (by Eugeniy Meshcheryakov) +- added U+2983-U+2984 to Sans (by Gee Fung Sit) +- added U+2A2F to Sans, Serif and Mono (by Gee Fung Sit) +- added U+2373-2375, U+237A to Sans (by John Karp) +- converted kern pairs to kern classes with Tavmjong Bah's scripts + (by Denis Jacquerye) +- set ScriptLang of kerning classes to just latn because of Pango bug + (by Denis Jacquerye) +- added DNK to ScriptLang latn otherwise it is excluded, and SRB and MDK to + cyrl (by Denis Jacquerye) +- removed flag 0x80 in generate.pe, otherwise it generates kerning tables some + systems don't like; thus loosing Apple tables (by Denis Jacquerye) +- removed ligature for precomposed legacy characters of Sans Oblique fonts + (by Denis Jacquerye) +- added bearings to en dash U+2013, em dash U+2014 and figure dash U+2012 + by making dashes shorter, preserving character width (by Denis Jacquerye) +- reduced U+031C, U+0325 (ring below), U+0339 to be entirely visible; + added instructions in Sans Book; changed U+1e00-U+1e01 to use new ring below + (by Denis Jacquerye) +- adjusted circumflex below on U+1E12-U+1E13, U+1E18-U+1E19, U+1E3C-U+1E3D, + U+1E4A-U+1E4B, U+1E70-U+1E71, U+1E76-U+1E77 in Sans fonts (by Denis Jacquerye) +- Added U+0ED4, U+0ED5 to DejaVu Sans (by Remy Oudompheng) +- Lao-specific anchors (by Remy Oudompheng) +- added alternate I to match the small capital in Sans (by Gee Fung Sit) + +Changes from 2.14 to 2.15 + +- improved hinting in Sans Oblique to deal with some spacing and inconsistency + issues (by Ben Laenen) +- added anchors to Mono Book, and added GPOS rules for combining diacritics to + show up as zero width glyphs (by Ben Laenen) +- removed U+F21C (PUA), it was copy of U+2C64 from Latin Extended C (by Eugeniy + Meshcheryakov) +- added U+27E6-U+27E7 to Sans (by Gee Fung Sit) +- added U+1407, U+1409, U+140C-U+141B, U+141D-U+1425, U+1427-U+142E, + U+1435-U+1438, U+143A-U+1449, U+1452, U+1454, U+1457-U+1465, U+1467-U+146A, + U+1471, U+1474-U+1482, U+1484-U+1488, U+148F, U+1492, U+14A0, U+14A2, U+14A9, + U+14AC-U+14BA, U+14BC, U+14BD, U+14C6, U+14C9-U+14CF, U+14D1, U+14D2, U+14D9, + U+14DC-U+14E9, U+14EC, U+14F3, U+14F6-U+1504, U+1506, U+1507, U+1510-U+1525, + U+152C, U+152F-U+153D, U+1540, U+1541, U+154E, U+154F, U+1552, U+155B, U+155C, + U+1568, U+1569, U+1574-U+157B, U+157D, U+15A7-U+15AE, U+1646, U+1647 (by + Eugeniy Meshcheryakov) +- fixed several contours to not intersect, use horizontal or vertical tangents, + use integer coordinates, etc in Sans Book (by Denis Jacquerye) +- added U+0496-U+0497 in Serif (by Andrey V. Panov) + +Changes from 2.13 to 2.14 + +- added Philippine peso glyph U+20B1 (by Clayborne Arevalo) +- made U+2012 have the same width as digits, according to Unicode 5.0, + page 206 (by Roozbeh Pournader) +- made all of the "above" combining characters remove the dot of "i", + "j", etc (Soft_Dotted characters), according to Unicode 5.0, + page 228 (by Roozbeh Pournader) +- made U+012F, U+03F3, U+0456, U+0458, U+1E2D, and U+1ECB (all fonts + except Mono), U+0249, U+2148, and U+2149 (Sans and Sans Condensed), + U+0268 (Sans ExtraLight, Serif and Serif Condensed), and U+029D (Serif + and Serif Condensed) respect the Soft_Dotted property (by Roozbeh + Pournader) +- added U+223E, U+223F, U+2240, U+22C2, U+22C3 to Sans (by Remy Oudompheng) +- added U+203D to Serif (by Gee Fung Sit) +- added zero-width glyphs for U+2061-U+2063 to Sans and Serif (by Gee + Fung Sit) +- changed isolated forms of Arabic waw (U+0648, U+0624 and U+06C6) (bug #9432) + (by Ben Laenen) +- added Lao consonants U+0E81, U+0E82, U+0E84, U+0E87, U+0E88, U+0E8A, + U+0E8D, U+0E94-0E97, U+0E99-0E9F, U+0EA1-0EA3, U+0EA5, U+0EA7, U+0EAA, + U+0EAB, U+0EAD-0EAF to Sans Mono (by Remy Oudompheng) +- added U+0200-U+0217, U+0226-U+0229, U+02F3, U+1E00-U+1E07, + U+1E0A-U+1E0B, U+1E18-U+1E1F, U+1E22-U+1E23, U+1E28-U+1E2D, + U+1E3A-U+1E3B, U+1E40, U+1E48-U+1E49, U+1E56, U+1E58-U+1E59, + U+1E5E-U+1E5F, U+1E60, U+1E68-U+1E6B, U+1E6E-U+1E6F, U+1E72-U+1E77, + U+1E86-U+1E8B, U+1E92-U+1E96, U+1EA0-U+1EA1, U+1EF4-U+1EF5 to Mono + (by Ben Laenen) +- renamed uppercase variants of diacritics (macron, breve, double grave, + double acute, inverted breve, dot above) to "uni03XX.case" in Mono + (by Ben Laenen) +- moved uppercase variants of diacritics up in Mono so they properly + vertically align on capitals (by Ben Laenen) +- precomposed glyphs with macron, breve, double grave, double acute, + inverted breve, dot above, macron below, breve below, inverted breve + below, dot below, cedilla, caron below, circumflex below, diaeresis + below, tilde below now reference to combining diacritics instead of + space modifiers in Mono (by Ben Laenen) +- made ring below (U+0325), and half rings below (U+031C and U+0339) + smaller in Mono (by Ben Laenen) +- added U+205F to all fonts (by Roozbeh Pournader) +- added U+035E-U+035F to Sans (by Roozbeh Pournader) +- added empty glyphs for U+034F, U+202A-U+202E, U+2060, U+206A-206F, + U+FE00-U+FE0F to non-Mono fonts (by Roozbeh Pournader) +- added U+2101, U+2107-U+2108, U+210B, U+210C, U+2110, U+2112, U+211B, + U+211F, U+2123, U+2125, U+2128-U+2129, U+212C-U+212D, U+212F, + U+2130-U+2131, U+2133, U+2136-U+213A, U+2141-U+2144, U+2B00-U+2B11, + U+2B20-U+2B23 to Sans (by John Karp) +- reshaped omega (U+03C9) in Mono (by Ben Laenen) +- added U+2205, U+22C6, U+2300-U+2301, U+2303-U+2306, U+230C-U+230F, + U+2312-U+2315, U+231C-U+231F, U+2335, U+2337-U+233E, U+2341-U+2344, + U+2347-U+2348, U+234B-U+234D, U+2349-U+2350, U+2352-U+2354, + U+2357-U+2359, U+235A-U+235C, U+235E-U+2360, U+2363-U+2365, + U+2368-U+2369, U+236B-U+2370, U+2373-U+237A, U+2380-U+2383, + U+2388-U+238B, U+2395 in Mono (by Ben Laenen) + +Changes from 2.12 to 2.13 + +- adjusted U+0198B, U+01B3-U+01B4 in Sans, hinted U+01B4 in Sans Book + (by Denis Jacquerye) +- added U+27F0-U+27FF, U+2906-U+2907, U+290A-U+290B, U+2940-U+2941 to Sans + (by Denis Jacquerye) +- added U+01E6-U+01E9, U+01EE-U+01EF, U+01F4-U+01F5, U+01FC-U+01FF, + U+021E-U+021F, U+0245, U+02BD, U+02C9, U+1E9B, U+2045-U+2046, U+2213, U+22C5, + U+22EF to Sans Mono (by Roozbeh Pournader) +- added U+04FA-U+04FD to Sans (by Michael Everson) +- removed U+2329 and U+232A because of their CJK properties, added U+27E8 + and U+27E9 in their stead, fixing part of bug #9038 (by Roozbeh Pournader) +- corrected and improvised U+0466-U+0469, U+046E-U+0471, U+047C-U+047D, U+0482, + U+0484-U+0486, U+0492-U+0493, U+04B0-U+04B1, U+050C-U+050D, and U+204A + in Sans (by Michael Everson) +- added instructions for U+0402, U+0409, U+040A, U+040B, U+044D, U+040F, + U+0452, U+0459-U+045B, U+045F to Sans Book (by Eugeniy Meshcheryakov) +- made italic shape for U+431, U+432, U+437, U+43B, U+43C, U+43D, U+444, U+447, + U+44D, U+44F, U+459, U+45A in SerifOblique and SerifBoldOblique + (by Andrey V. Panov) +- modified U+024C to match glyph in Unicode chart, fixing bug #9039 + (by Denis Jacquerye) +- made some canonically equivalent characters share the same glyph: + U+02B9 = U+0374, U+0343 = U+0313, and U+0387 = U+00B7 also adjusting U+02BA + to look like double U+02B9, fixing parts of bug #9038 (by Roozbeh Pournader) +- changed shapes for U+0478 and U+0479 in Sans to those in the Unicode charts, + based on a recent decision by Unicode Technical Committee to only use + the digraph form (by Michael Everson) +- adjusted width of NBSP U+00A0 and NNBSP U+202F, fixing bug #8401 + (by Denis Jacquerye) +- fixed several contours to not intersect, use horizontal or vertical tangents, + use integer coordinates, etc (by Roozbeh Pournader and Denis Jacquerye) +- added U+1402, U+1430, U+144D, U+146C, U+148A, U+14A4, U+14C1, U+14D4, U+14EE, + U+1527, U+1545, U+157E, U+158E, U+15AF to Sans (by Eugeniy Meshcheryakov) +- enlarged width of U+459 and U+45A in Serif (by Andrey V. Panov) +- made traditional shape for U+452, U+45B (by Andrey V. Panov) +- added euro sign U+20AC to Sans ExtraLight, making fontconfig recognize + the font as supporting English (by Denis Jacquerye) + +Changes from 2.11 to 2.12 + +- added U+0180 to Serif (by Denis Jacquerye) +- improved and/or hinted Armenian letters U+0542, U+0546, U+0562, + U+0563, U+0564, U+0577, U+0582 in Sans (by Ben Laenen) +- added U+4FE-U+4FF, U+512-U+513, U+2114, U+214E, U+26B2 to Sans + (by Gee Fung Sit) +- adjusted U+0496-U+0497, U+049A-U+04A1 in Sans to match U+0416, + U+041A, U+0436 and U+043A (by Gee Fung Sit) +- Mathematical Operators in Sans: changed U+22C0-U+22C1 to match + other n-ary operators, adjusted U+2203-U+2204, changed U+2220 in + Sans to match the style of U+2221 (by Gee Fung Sit) +- added U+1401, U+1403-U+1406, U+140A, U+140B, U+1426, U+142F, + U+1431-U+1434, U+1438, U+1439, U+1449, U+144A, U+144C, + U+144E-U+1451, U+1455, U+1456, U+1466, U+146B, U+146D-U+1470, + U+1472, U+1473, U+1483, U+1489, U+148B-U+148E, U+1490, U+1491, + U+14A1, U+14A3, U+14A5-U+14A8, U+14AA, U+14AB, U+14BB, U+14C0, + U+14C2-U+14C5, U+14C7, U+14C8, U+14D0, U+14D3, U+14D5-U+14D8, + U+14DA, U+14DB, U+14EA, U+14ED, U+14EF-U+14F2, U+14F4, U+14F5, + U+1405, U+1526, U+1528-U+152B, U+152D, U+152E, U+153E, + U+1542-U+1544, U+1546-U+154D, U+1550, U+1553, U+1555-U+155A, + U+1567, U+156A, U+157C, U+157F-U+1585, U+158A-U+158D, + U+158F-U+1596, U+15A0-U+15A6, U+15DE, U+15E1, U+166E-U+1676 to + Sans (by Eugeniy Meshcheryakov) +- re-enabled Latin ligatures fi, ffi, fl, ffl and ff in Sans + (by Ben Laenen) +- made italic shape for U+436, U+44A, U+44B, U+44C, U+44E, U+45F, + U+463 in SerifOblique and SerifBoldOblique (by Andrey V. Panov) +- fixed sub- and superscript metrics in Condensed Sans (bug #8848) + (by Ben Laenen) +- added U+474, U+475 in Serif (by Andrey V. Panov) +- hinted Greek glyphs U+03B7, U+30B8, U+03B9, U+03C1, U+03C3, + U+03C6 in Mono Book (by Ben Laenen) + +Changes from 2.10 to 2.11 + +- added instructions for Hebrew glyphs (Sans Book, by Eugeniy + Meshcheryakov) +- changed U+01A6 (Latin Yr) after bug #8212, in Sans, Serif and + Sans Mono fonts (by Denis Jacquerye). +- removed instruction for U+2600-U+26A1 (by Mederic Boquien) +- added U+202F and set width of U+00A0 (nobreakingspace) to the + same as U+0020, space (by Denis Jacquerye). +- added and improved instructions for various Cyrillic letters + (by Eugeniy Meshcheryakov) +- Changed U+416, U+42F, U+427 (non-Bold), U+436, U+447 (non-Bold), + U+44F, U+437 (Bold), corrected U+40F, U+414, U+424, U+426, U+429, + U+434, U+438 (Bold), U+446, U+449, U+44D (non-Bold), U+45F in + Sans Mono (by Andrey V. Panov) +- made small corrections to Cyrillic, most appreciable to U+409, + U+413, U+41B, U+427 and U+433, U+434, U+43B, U+447, U+459 + (upright fonts) to Serif (by Andrey V. Panov) +- adjusted bearings of U+410, U+416, U+41A, U+42F, U+436, U+43A, + U+443, U+44F in Serif (by Andrey V. Panov) +- enlarged width of U+44A, U+44B, U+44C, U+463 in Serif + (by Andrey V. Panov) +- added ligature "iacute" as "afii10103" (U+456) "acutecomb" in + Serif (by Andrey V. Panov) +- made italic shape to U+446, U+448, U+449 in Serif (by Andrey V. + Panov) +- added "afii10831" (U+F6C7), "afii10832" (U+F6C8) in Serif (by + Andrey V. Panov) +- new minimum version of fontforge is 20061014 (by Ben Laenen) + +Changes from 2.9 to 2.10: + +- added U+0242, U+024A-U+024B, U+024E-U+024F, U+037C-U+037D, U+0E3F, + U+1D2C-U+1D2E, U+1D30-U+1D42, U+1D5D-U+1D6A, U+1D78, U+1DB8, + U+2090-U+2094, U+20D0-U+20D1, U+2C60-U+2C66, U+2C6B-U+2C6C, U+2C74 and + U+FB29 to Sans (by Gee Fung Sit) +- added Lao glyphs : U+0E81-0E82, U+E084, U+0E87-0E88, U+0E8A, U+0E8D, + U+0E94-0E97, U+0E99-0E9F, U+0EA1-0EA3, U+0EA5, U+0EA7, U+0EAA-0EAB, + U+0EAD-0EB9, U+0EBB-0EBD, U+0EC0-0EC4, U+0EC6, U+0EC8-0ECD, U+0EDC-0EDD + (by Remy Oudompheng) +- fixed U+0193 not showing in Windows (bug #7897) (by Ben Laenen) +- changes to U+222B-222D in Sans Mono (by Remy Oudompheng) +- ported the three remaining currency symbols from Arev (U+20B0, + U+20B2-U+20B3), and replaced one (U+20AF) in Sans (by Lars Naesbye + Christensen) +- corrected U+20A5 in Sans (by Gee Fung Sit) +- merged Double-Struck Letters from Arev: U+2102, U+210D, U+2115, + U+2119-U+211A, U+2124, U+213C-U+2140 (by Gee Fung Sit) +- added U+2308-U+230B and U+2329-U+232A to Sans Mono and Serif faces, + fixed incorrect direction of U+2329 in Sans faces, and improved + U+2308-U+230B in Sans faces per Ben Laenen's suggestions (by David + Lawrence Ramsey) +- added U+06D5 and final form of it (needed for Kurdish) (by Ben Laenen) +- added two special glyphs U+F000 and U+F001 in Sans Book that show the + current ppem size (horizontal and vertical) (by Ben Laenen) +- added U+2318 and U+2325 to Sans Mono faces, based on the Sans versions + (by David Lawrence Ramsey) +- added U+2B14-U+2B1A to all faces except Sans ExtraLight (by David + Lawrence Ramsey) +- respaced all Geometric Shapes characters in Serif faces to match those + in Sans faces again, respaced U+23CF in Sans, Sans ExtraLight, and + Serif faces to match U+25A0 (or Sans in Sans ExtraLight's case) again, + and respaced U+2B12-U+2B13 in Sans and Serif faces to match U+25A1 + again (by David Lawrence Ramsey) +- corrected width of Modifier Small Letters U+1D43-1D5B in Sans Oblique + and U+1D9B-U+1DBF in Sans Oblique and Sans Bold Oblique (by Gee Fung Sit) +- added a bunch of glyphs to Sans ExtraLight (see SVN for details) (by + Gee Fung Sit) +- adjusted Cyrillic descenders in Sans ExtraLight to sync with Sans (by + Gee Fung Sit) +- added U+0242, U+0245 to Serif (by Gee Fung Sit) +- replaced the SHPIX routines which gave them bad spacing at certain + sizes in FreeType for A, V, Z, v and z in Sans Bold (by Ben Laenen) + +Changes from 2.8 to 2.9: + +- DejaVuSansExtraLight.sfd: changed family name from "DejaVu Sans" to + "DejaVu Sans Light" (in case we add a Light weight variant), so legacy + apps that understand only 4 styles are happy. (by Denis Jacquerye) +- added Name ID 16, aka preferred family name, and Name ID 17, aka + preferred style name, so contemporary apps that understand more that 4 + styles can use big fonts families "DejaVu Sans" and "DejaVu Serif". For + those, Extralight and Condensed are just styles not different families. + (by Denis Jacquerye) +- added U+22B6-22BD, U+22C0-22C1, U+22D6-22D7 to Sans. (by Remy Oudompheng) +- added U+037B, U+2184, U+2C67-U+2C6A and U+2C75-U+2C77 to Sans (by Gee + Fung Sit) +- adjusted asteriskmath (U+2217) for consistency with other mathematical + operators in Sans (by Ben Laenen) +- hinted some Armenian capitals in Sans Book (by Ben Laenen) +- added U+0246 - U+0249 (by Ben Laenen) +- BUGFIX : swapped U+224E and U+224F, in Sans, Sans Condensed and Sans Mono + (by Remy Oudompheng) +- adjusted U+20B5 (by Mederic Boquien) +- swapped U+21DA and U+21DB which were in wrong order (by Heikki Lindroos) +- added U+222E-2233, U+239B-23AD, U+2A00-2A02, U+2A0F-2A1C to Sans (by Remy + Oudompheng) +- added U+239B-23AD to Mono (by Remy Oudompheng) +- added U+2024-2025 to Serif (by Mederic Boquien) +- added U+222C-222D, U+2A0C-2A0E to Serif (by Remy Oudompheng) +- added U+2190-21FF to Mono (by Heikki Lindroos) +- added Hebrew glyphs - U+05B0-U+05BD, U+05BF-U+05C3, U+05C6, U+05C7, + U+05D0-U+05EA, U+05F0-U+05F2, U+FB1F, U+FB20, U+FB2A-U+FB36, + U+FB38-U+FB3C, U+FB3E, U+FB40, U+FB41, U+FB43, U+FB44, U+FB46-U+FB4E (by + Gee Fung Sit and Eugeniy Meshcheryakov) +- adjustments for Cyrillic in Sans (by Andrey V. Panov) +- made italic shape for U+0434, U+0456, U+0457 in SerifOblique and Serif + Bold Oblique (by Andrey V. Panov) + +Changes from 2.7 to 2.8: + +- fixed instructions for U+0423, U+0427, U+0447, U+0448 in Serif, so they + look good at large sizes too (by Eugeniy Meshcheryakov) +- added U+FB00 and U+FB03 to U+FB06 to Serif typefaces (by Heikki Lindroos) +- added U+26B0-U+26B1, U+2701-U+2704, U+2706-U+2709, U+270C-U+2727, U+2729 + to U+274B, U+274D, U+274F to U+2752, U+2756, U+2758-U+275E, U+2761 to + U+2775 (by Heikki Lindroos) +- added and improved instructions for Cyrillic letters in Mono and Serif + (Book, by Eugeniy Meshcheryakov) +- rotated U+26B0 (was too small in mono) (by Gee Fung Sit) +- adjusted U+1EDA-U+1EDD, U+1EE8-U+1EEB, capitals using capital specific + accent and moved diacritics to match position on U+00F2 (ograve), etc. + (by Denis Jacquerye) +- added U+20D6, U+20D7 to Sans (by Gee Fung Sit) +- made Armenian ligatures discretionary since the Firefox ligature problem + still isn't fixed (by Ben Laenen) +- moved Armenian hyphen U+058A to a higher position (bug #7436) (by Ben + Laenen) +- hinted Greek glyphs in Sans Bold (by Ben Laenen) +- enabled Arabic lam-alif ligatures when diacritics are used (by Ben Laenen) + +Changes from 2.6 to 2.7: + +- added glyphs needed for Kurdish: U+0695, U+06B5, U+06C6, U+06CE and their + init/medi/fina forms in Sans (by Ben Laenen) +- added U+02CD, U+01F8 - U+01F9, U+1E3E - U+1E3F, U+1E30 - U+1E35, U+1EBC - + U+1EBD, U+1EF8 - U+1EF9 (includes glyphs needed for Yoruba, Maori, Guarani + and Twi) (by Ben Laenen) +- added U+22C8-22CC, U+29CE-29D5, U+2A7D-2AA0, U+2AAE-2ABA, U+2AF9-2AFA to + Sans (by Remy Oudompheng) +- adjusted diacritics on Vietnamese, Pinyin and other characters: + U+01A0-U+01A1, U+01AF-U+01B0, U+01D5-U+01DC, U+01DE-01E1, U+01FA-U+01FB + U+022A-U+022D, U+0230-U+0231, U+1E14-U+1E17, U+1E4C-U+1E53, U+1E78-U+1E7B, + U+1EA4-U+1EF1 in Sans (Book, Bold and Oblique) (by Denis Jacquerye) +- added basic arrows U+2190-U+2193 in Serif, which completes MES-1 compliance + for Serif (by Ben Laenen) +- added U+01E4, U+01E5, U+01FA, U+01FB, U+02BD, U+02C9 and U+02EE to Serif + (by Ben Laenen) +- fixed U+0209 in Serif Bold Oblique (by Ben Laenen) +- adjusted Box Drawing block characters U+2500-257F in Mono to fit character + cell, shifting them up by 416 (Denis Jacquerye) +- redid U+0194 in Sans (by Ben Laenen) +- added U+2217-2218, U+2295-22A1 to Mono (by Remy Oudompheng) +- added U+0462 to Serif (by Andrey V. Panov) +- added U+226C, U+228C-228E, U+2293-2294, U+22F2-22FF to Sans (by Remy + Oudompheng) +- adjusted U+2208-220D in Sans (by Remy Oudompheng) +- improved some Cyrillic glyphs in Mono (by Andrey V. Panov), rewritten + instructions for changed glyphs (by Eugeniy Meshcheryakov) +- added U+1E0E-1E0F, U+1E8E-1E8F to Mono fonts (by Denis Jacquerye). (bug + #7166) +- renamed 'Dotabove' to 'Dotaccent' in Mono Sans Oblique to match other fonts + (by Denis Jacquerye). +- added U+200B-U+200F in Sans faces and Serif faces, U+200B and U+200C were + in Sans already (by Lars Naesbye Christensen) +- added U+2601-U+262F, U+263D, U+263E, U+2648-U+265F, U+2668, U+2670-U+268B, + U+2690-U+269C, U+26A0, U+26A1, U+2794, U+2798-U+27AF, U+27B1-U+27BE to Mono + (by Heikki Lindroos) +- replaced the references with unshifted ones for both κ U+03BA and к U+043A + in Mono Book (by Denis Jacquerye) +- fixing glyph for U+04ED in Mono Book, consisted only of dieresis (by Andrey + V. Panov). + +Changes from 2.5 to 2.6: + +- redid U+2032 - U+2037, U+2057 based on Arev in Sans (by Gee Fung Sit) +- added U+0195, corrected U+039E, U+204B in Sans ExtraLight (by Gee Fung Sit) +- added instructions for some Cyrillic letters in Sans Bold (by Eugeniy + Meshcheryakov) +- added vulgar fractions U+2153-U+215F for Serif, made with references (by + Lars Naesbye Christensen) +- added U+228F-2292, U+2299-22AF, U+22B2-22B5, U+22CD, U+22D8-22ED to Sans + (by Remy Oudompheng) +- added U+2208-220D, U+2238-223D, U+2278-2281, U+228A-228B, U+228F-2292, + U+22CD, U+22DA-22E9 to Mono (by Remy Oudompheng) +- fixed misplaced dot in U+2250 in Mono (by Remy Oudompheng) +- added instructions for some Cyrillic letters in Mono Book and Bold(by + Eugeniy Meshcheryakov) +- minor changes to U+2241, U+2261-2263, U+22A4, U+22A5 in Sans (by Remy + Oudompheng) +- added hinting instructions to lowercase Armenian glyphs in Sans Book (by + Ben Laenen) +- changed U+2208, U+220B to match U+2209 and U+220C in Sans Bold (by Remy + Oudompheng) +- added Braille patterns U+2800-U+28FF to Sans (by Mederic Boquien) +- added instructions for some Cyrillic letters in Serif Book (by Eugeniy + Meshcheryakov) +- renamed BoldOblique fonts to Bold Oblique in TTF Name as originally in + Bitstream Vera fonts (by Denis Jacquerye) +- added hinting instructions to some Latin-B Extended and IPA characters in + Sans Book (by Denis Jacquerye and Ben Laenen) +- adjusted bearings, replaced diacritics, hinted hook and horn for + Vietnamese in Sans Book (by Denis Jacquerye) +- made FAX, TM, TEL, etc. discritionary ligatures in Sans and Serif fonts + (by Denis Jacquerye) +- removed ligatures of precomposed characters in Sans and Serif fonts (by + Denis Jacquerye) +- added U+F208, U+F20A, U+F215-F217, U+F21A-F21B, U+F25F in PUA (from SIL's + PUA, probably in Unicode 5.0): U+0243, U+0244, U+0245, U+024C, U+024D, + U+2C64, (U+2C6D), (U+2C71) +- modified some glyphs in Serif Oblique to make them more italic (by Denis + Jacquerye) + +Changes from 2.4 to 2.5: + +- fixed excessive kerning bug that occurs with Pango (by Denis Jacquerye) +- added U+20AF to Sans and Serif (by Lars Naesbye Christensen) +- regenerated Condensed faces (by Ben Laenen) +- added U+035C-U+035D to Sans, fixed U+0361 (by Denis Jacquerye) +- integrated 255 characters from Arev fonts: Latin Extended-B, Spacing + Modifiers, Combining Diacritical Marks, Cyrillic, Cyrillic supplement, + General Punctuation, Letterlike Symbols, Arrows, Mathematical Operators, + Miscellaneous Technical, Dingbats, Alphabetic Presentation Forms (by Denis + Jacquerye) +- added basic Cyrillic and basic Greek to Sans ExtraLight (by Denis Jacquerye) +- added U+0498, U+049A, U+04AA, U+04AB, U+04AF to Serif (by Eugeniy + Meshcheryakov) +- added U+0494, U+0495, U+0498, U+0499, U+04AA, U+04AB, U+04C3, U+04C4, + U+04C7, U+04C8 to Mono (by Eugeniy Meshcheryakov) +- adjusted weight of U+0256, U+0257, U+0260, U+0272, U+0273, U+0277, U+029B, + U+02A0 and modifed U+028B and U+027A in Mono (by Denis Jacquerye) +- added U+2000-200A to Mono (by Denis Jacquerye) +- added vulgar fractions U+2153 - U+215F to Mono (by Gee Fung Sit) +- adapted metrics of Arabic glyphs so they stay above cut-off height in Sans + (by Ben Laenen) +- fixed mkmk anchors for Arabic diacritics so they stack properly in Sans (by + Ben Laenen) +- fixed weight of lowercase upsilon in Sans Bold, make small adjustment to + lowercase omega in Sans (by Ben Laenen) +- added U+210E (by Mederic Boquien) +- unslanted U+2201, U+221B and U+221C in Sans Oblique (by Mederic Boquien) +- added several mathematical relation symbols to Sans and Mono (U+2241-224C, + U+2250-2255, U+2260-2269, U+226E-2277, U+2282-2287) modified U+223C to match + other tildes, and U+2282-2284 to have the same shape. (by Remy Oudompheng) +- made U+2234-U+2237 refer to U+2219 instead of U+00B7 in Sans (by Mederic + Boquien) +- added U+2238-223B, U+226A-226B, U+2278-2281, U+2288-228B to Sans (by Remy + Oudompheng) +- unslanted and changed reference of U+22C5 from U+00B7 to U+2219 in Sans (by + Mederic Boquien) +- added U+224D-225F, U+226D, U+22C6 to Sans and unslanted U+2219 in Sans + Oblique. (by Remy Oudompheng) +- added U+224D-225F, U+226D to Mono, shifted U+2266-2269 higher upwards and + unslanted U+2219 in Oblique. (by Remy Oudompheng) +- merged Coptic glyphs from Arev 0.2 (by Lars Naesbye Christensen) +- fixed and adjusted various Cyrillic glyphs in Serif (by Andrey V. Panov) +- made fi, fl... ligatures discretionary ligatures (by Ben Laenen) + +Changes from 2.3 to 2.4: + +- added U+04A2, U+04A3, U+04AC - U+04AF, U+04BA, U+04BB, U+04C0 - + U+04C2, U+04CB, U+04CD, U+04D8 - U+04DF, U+04E2 - U+04E5, U+04E8 - U+04F5, + U+04F6 - U+04F9 to Mono (by Eugeniy Meshcheryakov) +- added U+048C, U+048D, U+0494, U+0495, U+049E - U+04A7, U+04AC - + U+04AE, U+04B4- U+04B7, U+04BA, U+04BB, U+04C0 - U+04C4, U+04C7, U+04C8, + U+04CB, U+04CC, U+04D8 - U+04DF, U+04E2 - U+04E5, U+04EC - U+04F9 to Serif + (by Eugeniy Meshcheryakov) +- added U+2134 to Sans (by Gee Fung Sit) +- added U+2080 - U+2089 to all faces (by Gee Fung Sit) +- several minor corrections to Sans (by Gee Fung Sit) +- major corrections to Sans Condensed (by Gee Fung Sit) +- corrected Superscripts and Subscripts in Sans (by Gee Fung Sit) +- corrected anchors of U+0316-U+0319 (by Denis Jacquerye) +- Verajja integrated (by Stepan Roh) +- copied U+2328, U+2600, U+2639-U+263C, U+263F-U+2647, U+2660-U+2667, + and U+2669-U+266F from Sans to Serif, and copied scaled-down versions of + them to Sans Mono (by David Lawrence Ramsey) +- added U+20B4 to all faces (by Eugeniy Meshcheryakov) +- added more minor positional adjustments to U+2638 in all faces to + match the other miscellaneous symbols in Verajja, and rescale it in Sans + Mono so that it looks better (by David Lawrence Ramsey) +- added U+2242, U+2243 and U+22A4 (by Mederic Boquien) +- corrected U+2245 in Sans (by Mederic Boquien) +- added U+0221, U+0234-0236 (by Denis Jacquerye) +- added in Arabic block to Sans: U+060C, U+0615, U+061B, U+061F, U+0621 +- U+063A, U+0640 - U+0655, U+0660 - U+066F, U+0679 - U+0687, U+0698, U+06A1, + U+06A9, U+06AF, U+06BA, U+06BF, U+06CC, U+06F0 - U+06F9 (by Ben Laenen) +- added in Arabic Presentation Forms A to Sans: U+FB52 - U+FB81, U+FB8A +- U+FB95, U+FB9E - U+FB9F, U+FBE8 - U+FBE9, U+FBFC - U+FBFF (by Ben Laenen) +- added complete Arabic Presentation Forms B to Sans: U+FE70 - U+FE74, + U+FE76 - U+FEFC, U+FEFF (by Ben Laenen) +- added complete Greek Extended block to Mono (by Ben Laenen) +- modified Greek capitals with tonos in Mono (by Ben Laenen) +- added U+01C4-01CC, U+01D5, U+01DE, U+01E0-U+01E1, U+01E6-U+01E9, + U+01EE-U+01F5, U+01F8-U+0217, U+021E-U+021F, U+0226-U+022A, U+022C to Serif + (by Denis Jacquerye) +- adjusted U+043B and U+044F in Serif (by Denis Jacquerye) +- added U+2000-U+200A (by Denis Jacquerye) +- added U+1E00-U+1E0B, U+1E0E-U+1E11, U+1E14-U+1E1C, U+1E1E-U+1E23, + U+1E26-U+1E2D, U+1E30-U+1E35, U+1E3A-U+1E3B, U+1E3E-U+1E40, U+1E48-U+1E49, + U+1E50-U+1E56, U+1E58-U+1E59, U+1E5E-U+1E60, U+1E68-U+1E6B, U+1E6E-U+1E6F, + U+1E72-U+1E7D, U+1E86-U+1E9B, U+1EA0-U+1EA3, U+1EAC-U+1EB7, U+1EBA-U+1EBD, + U+1EC6-U+1ECF, U+1ED8-U+1ED9, U+1EE6-U+1EE7, U+1EF4-U+1EF9 to Serif (by + Denis Jacquerye) +- added U+048E, U+048F, U+049C-U+049F, U+04B8, U+04B9, U+04BC-U+04BF, + U+04C3, U+04C4 to Sans (by Eugeniy Meshcheryakov) +- added DejaVu Sans Extra Light (by Denis Jacquerye) +- Adjusted underline position for (hopefully) improved legibility in + Sans, Serif, Mono (Tim May) +- added auto-generated DejaVu LGC (by Stepan Roh) + +Changes from 2.2 to 2.3: + +- fixed bug U+042B and U+044B behave badly in Sans Bold or Oblique (by + Keenan Pepper) +- added and improved TrueType instructions and related settings (by + Keenan Pepper) +- added U+04D0-U+04D7, U+04E6, U+04E7 to Mono (by Eugeniy Meshcheryakov) +- added U+048A - U+048D, U+0498, U+0499, U+04AA, U+04AB, U+04B0, U+04B1, + U+04C0, U+04C9, U+04CA, U+04CE, U+04CD, U+04DA, U+04DB, U+04DE, U+04DF, + U+04E2 - U+04E5, U+04EC - U+04F8, U+04F9 to Sans (by Eugeniy Meshcheryakov) +- added U+04E0, U+04E1 to all faces (by Eugeniy Meshcheryakov) +- added Greek Extended to Sans and Serif: U+1F00-U+1F15, U+1F18-U+1F1D, + U+1F20-U+1F45, U+1F48-U+1F4D, U+1F50-U+1F57, U+1F59, U+1F5B, U+1F5D, + U+1F5F-U+1F7D, U+1F80-U+1FB4, U+1FB6-U+1FC4, U+1FC6-U+1FD3, U+1FD6-U+1FDB, + U+1FDD-U+1FEF, U+1FF2-U+1FF4, U+1FF6-U+1FFE (by Ben Laenen) +- added Greek variant letterforms, archaic letters and symbols to Mono: + U+03D0-U+03E1, U+03F0-U+03FF (by Ben Laenen) +- added Armenian block and Armenian ligatures to Sans (U+0531 - U+0556, + U+0559 - U+055F, U+0561 - U+0587, U+0589 - U+058A, U+FB13 - U+FB17) (by Ben + Laenen) +- redid some Greek characters in Sans and Mono to make them look better + and to correct some errors (by Ben Laenen) +- added U+27E0 to all faces (by David Lawrence Ramsey) +- added underscore (U+005F) consistency fixes: extended the Sans Mono + and Sans Mono Oblique underscores to touch both horizontal edges, and + reduced the height of the Sans Bold Oblique underscore to match the Sans + Bold underscore (by David Lawrence Ramsey) +- added underscore (U+005F) derivatives and consistency fixes for them: + made U+0332 a reference to underscore at Denis Jacquerye's suggestion; made + U+0333 two references to underscore; made U+033F two references to U+203E; + added U+2017 as two references to underscore, and made U+0333 a reference to + it; and added U+203E as a reference to underscore, and made U+0305 a + reference to it (by David Lawrence Ramsey) +- added U+201B, U+2220, U+2320-U+2321, U+23AE, U+23CF, all remaining + Geometric Shapes glyphs (U+25A0-U+25C9, U+25CB-U+25D7, U+25D9-U+25E5, + U+25E7-U+25FF), and U+2B12-U+2B13 to all faces (by David Lawrence Ramsey) +- added minor positional adjustments to U+2638 in all faces (by David + Lawrence Ramsey) +- added U+201F to Sans Mono and Serif faces (by David Lawrence Ramsey) +- added U+01B7, U+01F6, U+0464 - U+0465, U+2160 - U+2180, U+2183, + U+220A, U+220D, U+2329, U+232A, U+2422, U+27E8 - U+27EB, U+2680 - U+2685 to + Sans (by Gee Fung Sit ???) +- added U+2116 to Sans and Serif (by Gee Fung Sit) +- changed florin sign U+0192 in Sans (by Gee Fung Sit) +- added anchor points to some glyphs (by Denis Jacquerye) +- adjusted height of IPA superscripts U+02B0-02B8, U+02C0-02C1, + U+02E0-02E4, U+207F to match with height of U+00B2 (by Denis Jacquerye) +- added U+0184-U+0185, U+019C, U+019F, U+01A0-U+01A3, U+01A6, U+01AA, + U+01AF-U+01B0, U+01B2-U+01B4, U+01B7-U+01B8, U+01BC-U+01BC, U+0224-U+0225, + U+023A-U+0240, U+1D16-U+1D17, U+1D1D-U+1D1E, U+1D43-U+1D5B, U+1D7B, + U+1D85,U+1D9B-1DB7, U+1DB9-U+1DBF, U+20A6 to all fonts (by Denis Jacquerye) +- added added U+0182, U+018B, U+018E, U+01A0-U+01A1, U+01B1, U+01B9, + U+01C0-U+01C3, U+0238-U+0239, U+1D02, U+1D08-U+1D09, U+1D14, U+1D1F, U+1D77 + to Serif and Mono (by Denis Jacquerye) +- added U+0181, U+0183, U+0187-U+0188, U+018A-U+018F, U+0191, U+0193, + U+0195-U+019B, U+019D-U+019E, U+01A4-U+01A5, U+01AC-U+01AE, U+01B5-U+01B6, + U+01B9, U+01BB, U+01F6 to Serif (by Denis Jacquerye) +- added U+0181, U+0187-U+0188, U+018A, U+018D, U+018F, U+0191, U+0193, + U+0195-U+019F, U+01A4-01A5, U+01AC-01AD, U+01B5-U+01B6, U+1BB, U+01F6, + U+01D7-U+01DC, U+0238-U+0239, U+0241 to Mono (by Denis Jacquerye) +- added to Mono and Serif (by Denis Jacquerye) + +Changes from 2.1 to 2.2: + +- reworked the vertical orientation of the Blocks Elements characters + in all faces to remove their overly large descenders, in order to fix + problems with e.g. terminal emulators (by David Lawrence Ramsey) +- copied bullet in Sans faces to Serif faces for consistency (by David + Lawrence Ramsey) +- added U+2023, U+25D8, U+25E6, and U+29EB to all faces (by David + Lawrence Ramsey) +- added U+1EB8, U+1EB9, U+1ECA - U+1ECD, U+1EE4, U+1EE5 (by Tim May) +- added U+01DD, U+02BE, U+02BF, U+02D3 to all, changed U+02D2 in + non-Condensed and U+1EE5 in Serif (by Tim May) +- fixed U+01CE, replacing wrong circumflex by caron (by Denis Jacquerye) +- added anchor points to some glyphs (by Denis Jacquerye) +- added U+20B5 (by Denis Jacquerye) +- added U+0181 - U+0183, U+0187, U+0188, U+018A - U+018D, U+0191, + U+0193, U+0195 - U+019B, U+019D, U+019E, U+01A4, U+01A7 - U+01A9, U+01AB - + U+01AE, U+01B1, U+01B5, U+01B6, U+01BB, U+01C0 - U+01C3, U+01F1 - U+01F3, + U+0238, U+0239, U+1D02, U+1D08, U+1D09, U+1D14, U+1D1F, U+1D77, U+2103, + U+2126, U+2127, U+212A, U+212B, U+2132, U+214B, U+2210, U+2217, U+2218, + U+2A0C - U+2A0E, U+FB00, U+FB03 and U+FB04 to Sans (by Gee Fung Sit) +- added U+01A9, U+01C3 and U+2126 to Mono and Serif (by Gee Fung Sit) +- adjusted bearings of U+028B in Sans (by Gee Fung Sit) +- added U+018F, U+0494-U+0497, U+04A0-U+04A7, U+04AC-U+04AF, + U+04B4-U+04B7, U+04BA-U+04BB, U+04C1-U+04C2, U+04C5-U+04C8, U+04CB-U+04CC, + U+04D0-U+04D9, U+04DC-U+04DD, U+04E6-U+04EB to Sans (by Eugeniy + Meshcheryakov) +- replaced with references U+0391-U+0393, U+0395-U+0397, U+0399, U+039A, + U+039C, U+039D, U+039F-U+03A1, U+03A4, U+03A5, U+03A7, U+03BF, U+03DC, + U+0405, U+0406, U+0408, U+0410, U+0412, U+0415, U+0417, U+041A, + U+041C-U+041E, U+0420-U+0422, U+0425, U+0430, U+0435, U+043E, U+0440, + U+0441, U+0443, U+0445, U+0455-U+0458 in Serif and Mono (by Eugeniy + Meshcheryakov) +- added U+04D0-U+04D7, U+04E6-U+04EB to Serif (by Eugeniy Meshcheryakov) +- added U+212A and U+212B to the rest of the faces (by Lars Naesbye + Christensen) +- added U+2318 and U+2325 to Sans and Serif (by Lars Naesbye Christensen) +- added and improved TrueType instructions and related settings (by + Keenan Pepper) +- completed basic Greek alphabet: added U+0374-U+0375, U+037A, U+037E, + U+0384-U+038A, U+038C, U+038E-U+0390, U+03AC-U+03BF, U+03C1-U+03CE (by Ben + Laenen) +- added U+2070 and U+2074-U+2079 (by Mederic Boquien) + +Changes from 2.0 to 2.1: + +*** Be aware that names of some TTF files changed since version 2.0. *** + +- added U+0323, U+1E0C, U+1E0D, U+1E24, U+1E25, U+1E36 - U+1E39, U+1E42, + U+1E43, U+1E46, U+1E47, U+1E5A - U+1E5D, U+1E62, U+1E63, U+1E6C, U+1E6D, + U+1E7E, U+1E7F (by Tim May) +- fixed bug where GNOME applications used Mono Bold Oblique instead of + Mono Oblique (by Keenan Pepper) +- added and improved TrueType instructions and related settings (by + Keenan Pepper) +- added U+1E41, U+1E57, U+1E61 (by Sander Vesik) +- added U+0189, U+0309, U+0313, U+0314, U+031A, U+031B, U+0327, U+0328, + U+032B, U+0333, U+033C (by Denis Jacquerye) +- adjusted and fixed U+0186, U+0254, U+0291, U+0316 - U+0319, U+031C - + U+0320, U+0323 - U+0326, U+0329 - U+032A, U+032C - U+0332, U+0339 - U+033B, + U+033E, U+033F (by Denis Jacquerye) +- fixed U+1E12, U+1E3C, U+1E4A, U+1E70 to have normal below diacritics + (by Denis Jacquerye) +- fixed U+1E82, U+1E84 and U+1EF2 to have uppercase above diacritics (by + Denis Jacquerye) +- added anchor points to some glyphs (by Denis Jacquerye) +- dropped "-Roman" from font names - affects both internal TTF names and + names of generated files (by Stepan Roh) +- attempt to fix bug Vertical spacing too big for Mono by exchanging + LineGap and OS2TypoLinegap values (proofed by Stefan Rank) +- added Greek capitals U+0391 - U+03A1, U+03A3 - U+03A9, U+03AA, U+03AB + in Mono (by Ben Laenen) +- added the per ten thousand sign U+2031 (by Mederic Boquien) +- added U+2207, U+221D, U+221F, U+2227 - U+222A, and U+2261 (by David + Lawrence Ramsey) +- new logo (by Gee Fung Sit) +- added U+0180, U+018E, U+201F, U+2024, U+2025, U+203D, U+2200, U+2203, + U+2213, U+222C, U+222D, U+2263 to Sans (by Gee Fung Sit) + +Changes from 1.15 to 2.0: + +- "Italized" basic glyphs in all Serif Oblique and their Condensed faces + (by David Jez) +- added and improved TrueType instructions and related settings (by Keenan + Pepper) +- added anchor points to some glyphs (by Denis Jacquerye) +- many new spacing and combining accents (by Denis Jacquerye) +- smart substitutions for transforming i and j to dottless form and for + using uppercase diacritics (by Denis Jacquerye) +- fixed remaining erroneously slanted characters in Serif Oblique faces (by + David Lawrence Ramsey) +- copied bullet in Sans faces to Sans Oblique faces for consistency (by + David Lawrence Ramsey) +- added U+203C and U+2047-U+2049 (by David Lawrence Ramsey) +- added Greek glyphs to Serif (by Ben Laenen, Condensed merge by David Jez) +- fixed bug LTR glyphs behaving like RTL (by Ben Laenen) +- fixed wrong glyph directions (by David Jez) +- fixed repositioned accents in Condensed faces (by David Jez) + +Changes from 1.14 to 1.15: + +- added and improved TrueType instructions and related settings (by Keenan + Pepper) +- fixed U+2302, U+2319 (by David Lawrence Ramsey) +- fixed yet another monospace bug (by Stepan Roh) +- fixed potential "too big ascender/descender" bug (by Stepan Roh) +- fixed U+026E and U+028E (by Denis Jacquerye) +- added U+0186, U+0190, U+0300 - U+0304, U+0306 - U+0308, U+030A - U+030C, + U+0321, U+0322 (by Denis Jacquerye) +- added rest of Block Elements: U+2591 - U+2593 (by David Lawrence Ramsey) +- added U+2311, U+237D and U+2638 (by David Lawrence Ramsey) +- added U+01CD - U+01D4 (by Denis Jacquerye) +- fixed accents of U+00F2 - U+00F6 by replacing them with references in Mono + Bold (by David Jez) +- added U+0490, U+0491 (by Eugeniy Meshcheryakov) +- added hints to U+0404 and U+0454 in Sans (by Eugeniy Meshcheryakov) +- completed Greek glyphs from U+0370 to U+03CF in Serif (by Ben Laenen) +- fixed shape of U+0255 in Sans Bold and Sans Bold Oblique (by Denis + Jacquerye) + +Changes from 1.13 to 1.14: + +- fixed bug where Mono faces were not recognized as fixed pitch in Windows + by correcting Venda glyphs (by David Jez) +- added and improved TrueType instructions (by Keenan Pepper) +- added 6 Uzbekian glyphs (by Mashrab Kuvatov) +- added Greek glyphs to Sans and Serif, changed pi and omega to fit in (by + Ben Laenen) +- added IPA and related superscript glyphs (by Denis Jacquerye) +- fixed buggy Venda glyphs (by David Lawrence Ramsey and Stepan Roh) +- added U+2302, U+2310, U+2319 (by David Lawrence Ramsey) +- fixed slanted U+00AC in Serif Oblique faces (by David Lawrence Ramsey) +- added 29 glyphs from Block Elements (by David Lawrence Ramsey) + +Changes from 1.12 to 1.13: + +- removed all stems (PS hints) (requested by David Jez) +- added U+01D6, U+01DF, U+022B, U+022D and U+0231 (by Sander Vesik) +- added 10 Venda glyphs (by Dwayne Bailey) +- fixed bug when fonts had no name on Microsoft Windows (by Stepan Roh) +- updated 'missing' glyph U+FFFD (by David Jez) +- set TTF flag fsType to 'Installable Embedding' (= unrestricted usage) + (idea by C. Tiffany) + +Changes from 1.11 to 1.12: + +- added long s (by James Cloos) +- prettier comma accent in gcommaaccent (by David Jez) +- added Hbar, hbar, kgreenlandic, napostrophe, Eng, eng, Tbar, tbar, + afii57929 (by David Jez) +- changed Iogonek, iogonek, IJ, ij to look better (by David Jez) +- glyph uni0237 renamed to dotlessj (requested by David Jez) +- fixed accents for dcaron, lcaron, tcaron, Uogonek, uogonek in Serif (by + David Jez) +- added U+2500 - U+257F box drawing glyphs to Sans Mono (by David Jez) +- fixed accents in Wcircumflex, Ycircumflex and Zdotaccent (by David Jez) +- extra kerning for F (by Sander Vesik) +- added 'missing' glyph U+FFFD (by David Jez) + +Changes from 1.10 to 1.11: + +- kerning updates (by Sander Vesik) +- added Iogonek, iogonek, IJ, ij, Uogonek, uogonek (from SuSE standard fonts + by Adrian Schroeter, SuSE AG) +- added Gcommaaccent, gcommaaccent, Kcommaaccent, kcommaaccent, + Lcommaaccent, lcommaaccent, Ncommaaccent, ncommaaccent, Rcommaaccent, + rcommaaccent (by Stepan Roh) + +Changes from 1.9 to 1.10: + +- added U+022E, U+022F (by Sander Vesik) +- kerning updates for DejaVu Sans (by Sander Vesik) +- fixed too wide cyrillic glyphs in DejaVu Sans Mono (by Valentin Stoykov) +- fixed ligatures bug in Mono (by Stepan Roh) + +Changes from 1.8 to 1.9: + +- integrated Arev Cyrillics (by Danilo Segan) +- added U+01EA, U+01EB, U+01EC, U+01ED (by Sander Vesik) + +Changes from 1.7 to 1.8: + +- fixed accents in Serif Oblique and Serif Bold Oblique (by Stepan Roh) + +Changes from 1.6 to 1.7: + +- added automatically generated Condensed typefaces (by Stepan Roh) + +Changes from 1.5 to 1.6: + +- monospace bug fixed (by Stepan Roh) +- incorrect Bitstream foundry assigned by fontconfig and KDE Font Installer +fixed (by Stepan Roh) +- added automatically generated Oblique version of Serif typefaces (by +Stepan Roh) +- corrected cyrillic D and d (by Danilo Segan and David Jez) +- fixed accents position in Oblique version of Serif typefaces (by Danilo +Segan and Sander Vesik) +- fixed incorrect computation of OS2Win* fields (by Stepan Roh) +- added visiblespace U+2423 (by David Jez) +- fixed 'line height' bug by fixing ascender and descender values (by David +Jez and Stepan Roh) +- fixed part of 'worse than Vera' bug (by Peter Cernak) +- smaller comma accent U+0326 (by David Jez) + +Changes from 1.4 to 1.5: + +- added Cyrillics (96 characters) and Dcroat to the rest of typefaces (by +Danilo Segan) +- fixed bugs in some Cyrillic characters, some of them reported by Sander +Vesik (by Danilo Segan) +- added U+0100, U+0101, U+0112, U+0113, U+012A, U+012B, U+014C, U+014D, +U+016A, U+016B, U+01E2, U+01E3, U+0232 and U+0233 (by Sander Vesik) +- added Romanian characters (by Misu Moldovan) +- added U+0108, U+0109, U+010A, U+010B, U+0114, U+0115, U+0116, U+0117, +U+011C, U+011D, U+0120, U+0121, U+0124, U+0125, U+0128, U+0129, U+012C, +U+012D, U+0134, U+0135, U+014E, U+014F, U+0150, U+0151, U+015C, U+015D, +U+0168, U+0169, U+016C, U+016D, U+0170, U+0171 and U+0237 (by James +Crippen) +- added U+02BB, U+2010, U+2011, U+2012 and U+2015 (by Stepan Roh) + +Changes from 1.3 to 1.4: + +- added Polish characters (Aogonek, aogonek, Eogonek, eogonek, Nacute, +nacute, Sacute, sacute, Zacute, zacute, Zdotaccent, zdotaccent) (by Stepan +Roh) + +Changes from 1.2 to 1.3: + +- added Cyrillics (96 characters) and Dcroat to Sans typefaces (by Danilo +Segan from his BePa fonts) + +Changes from 1.1 to 1.2: + +- added Ldot, ldot, Wcircumflex, wcircumflex, Ycircumflex, ycircumflex, + Wgrave, wgrave, Wacute, wacute, Wdieresis, wdieresis, Ygrave and ygrave + (from The Olwen Font Family 0.2 by Dafydd Harries) + +Changes from 1.0 to 1.1: + +- added Lacute, lacute, Lcaron, lcaron, Racute and racute (by Peter Cernak) + +Changes from 0.9.4 to 1.0: + +- none, just changed version and updated README + +Changes from 0.9.3 to 0.9.4: + +- fixed TTF generation (kerning tables were missing) + +Changes from 0.9.2 to 0.9.3: + +- kerning of added characters +- proper caron shape for dcaron in Mono (by Ondrej Koala Vacha) +- minor visual changes + +Changes from 0.9.1 to 0.9.2: + +- internal bugged version + +Changes from 0.9 to 0.9.1: + +- proper caron shape for dcaron and tcaron +- minor visual changes + +$Id: NEWS 2359 2009-08-27 14:13:16Z ben_laenen $ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/README b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/README new file mode 100644 index 0000000..0bcc3aa --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/README @@ -0,0 +1,59 @@ +DejaVu fonts 2.30 (c)2004-2009 DejaVu fonts team +------------------------------------------------ + +The DejaVu fonts are a font family based on the Bitstream Vera Fonts +(http://gnome.org/fonts/). Its purpose is to provide a wider range of +characters (see status.txt for more information) while maintaining the +original look and feel. + +DejaVu fonts are based on Bitstream Vera fonts version 1.10. + +Available fonts (Sans = sans serif, Mono = monospaced): + +DejaVu Sans Mono +DejaVu Sans Mono Bold +DejaVu Sans Mono Bold Oblique +DejaVu Sans Mono Oblique +DejaVu Sans +DejaVu Sans Bold +DejaVu Sans Bold Oblique +DejaVu Sans Oblique +DejaVu Sans ExtraLight (experimental) +DejaVu Serif +DejaVu Serif Bold +DejaVu Serif Bold Italic (experimental) +DejaVu Serif Italic (experimental) +DejaVu Sans Condensed (experimental) +DejaVu Sans Condensed Bold (experimental) +DejaVu Sans Condensed Bold Oblique (experimental) +DejaVu Sans Condensed Oblique (experimental) +DejaVu Serif Condensed (experimental) +DejaVu Serif Condensed Bold (experimental) +DejaVu Serif Condensed Bold Italic (experimental) +DejaVu Serif Condensed Italic (experimental) + +All fonts are also available as derivative called DejaVu LGC with support +only for Latin, Greek and Cyrillic scripts. + +For license information see LICENSE. What's new is described in NEWS. Known +bugs are in BUGS. All authors are mentioned in AUTHORS. + +Fonts are published in source form as SFD files (Spline Font Database from +FontForge - http://fontforge.sf.net/) and in compiled form as TTF files +(TrueType fonts). + +For more information go to http://dejavu.sourceforge.net/. + +Characters from Arev fonts, Copyright (c) 2006 by Tavmjong Bah: +--------------------------- +U+01BA, U+01BF, U+01F7, U+021C-U+021D, U+0220, U+0222-U+0223, +U+02B9, U+02BA, U+02BD, U+02C2-U+02C5, U+02d4-U+02D5, +U+02D7, U+02EC-U+02EE, U+0346-U+034E, U+0360, U+0362, +U+03E2-03EF, U+0460-0463, U+0466-U+0486, U+0488-U+0489, U+04A8-U+04A9, +U+0500-U+050F, U+2055-205E, U+20B0, U+20B2-U+20B3, U+2102, U+210D, U+210F, +U+2111, U+2113, U+2115, U+2118-U+211A, U+211C-U+211D, U+2124, U+2135, +U+213C-U+2140, U+2295-U+2298, U+2308-U+230B, U+26A2-U+26B1, U+2701-U+2704, +U+2706-U+2709, U+270C-U+274B, U+2758-U+275A, U+2761-U+2775, U+2780-U+2794, +U+2798-U+27AF, U+27B1-U+27BE, U+FB05-U+FB06 + +$Id: README 2359 2009-08-27 14:13:16Z ben_laenen $ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/langcover.txt b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/langcover.txt new file mode 100644 index 0000000..8289ef4 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/langcover.txt @@ -0,0 +1,242 @@ +This is the language coverage file for DejaVu fonts +($Id$) + + Sans Serif Sans Mono +aa Afar 100% (62/62) 100% (62/62) 100% (62/62) +ab Abkhazia 100% (90/90) 93% (84/90) 84% (76/90) +af Afrikaans 100% (69/69) 100% (69/69) 100% (69/69) +ak Akan 100% (73/73) 100% (73/73) 100% (73/73) +am Amharic (0/264) (0/264) (0/264) +an Aragonese 100% (66/66) 100% (66/66) 100% (66/66) +ar Arabic 100% (125/125) (0/125) 100% (125/125) +as Assamese (0/64) (0/64) (0/64) +ast Asturian/Bable/Leonese/Asturleonese 100% (66/66) 100% (66/66) 100% (66/66) +av Avaric 100% (67/67) 100% (67/67) 100% (67/67) +ay Aymara 100% (60/60) 100% (60/60) 100% (60/60) +az-az Azerbaijani in Azerbaijan 100% (66/66) 100% (66/66) 100% (66/66) +az-ir Azerbaijani in Iran 100% (130/130) (0/130) 100% (130/130) +ba Bashkir 100% (82/82) 100% (82/82) 97% (80/82) +be Byelorussian 100% (68/68) 100% (68/68) 100% (68/68) +ber-dz Berber in Algeria 100% (70/70) 100% (70/70) 100% (70/70) +ber-ma Berber in Morocco 100% (32/32) (0/32) (0/32) +bg Bulgarian 100% (60/60) 100% (60/60) 100% (60/60) +bh Bihari (Devanagari script) (0/68) (0/68) (0/68) +bho Bhojpuri (Devanagari script) (0/68) (0/68) (0/68) +bi Bislama 100% (58/58) 100% (58/58) 100% (58/58) +bin Edo or Bini 100% (78/78) 100% (78/78) 100% (78/78) +bm Bambara 100% (60/60) 100% (60/60) 100% (60/60) +bn Bengali (0/63) (0/63) (0/63) +bo Tibetan (0/95) (0/95) (0/95) +br Breton 100% (64/64) 100% (64/64) 100% (64/64) +bs Bosnian 100% (62/62) 100% (62/62) 100% (62/62) +bua Buriat (Buryat) 100% (70/70) 100% (70/70) 100% (70/70) +byn Blin/Bilin (0/255) (0/255) (0/255) +ca Catalan 100% (74/74) 100% (74/74) 100% (74/74) +ce Chechen 100% (67/67) 100% (67/67) 100% (67/67) +ch Chamorro 100% (58/58) 100% (58/58) 100% (58/58) +chm Mari (Lower Cheremis / Upper Cheremis) 100% (76/76) 100% (76/76) 97% (74/76) +chr Cherokee (0/85) (0/85) (0/85) +co Corsican 100% (84/84) 100% (84/84) 100% (84/84) +crh Crimean Tatar/Crimean Turkish 100% (68/68) 100% (68/68) 100% (68/68) +cs Czech 100% (82/82) 100% (82/82) 100% (82/82) +csb Kashubian 100% (74/74) 100% (74/74) 100% (74/74) +cu Old Church Slavonic 100% (103/103) 86% (89/103) 78% (81/103) +cv Chuvash 100% (74/74) 100% (74/74) 100% (74/74) +cy Welsh 100% (78/78) 100% (78/78) 100% (78/78) +da Danish 100% (70/70) 100% (70/70) 100% (70/70) +de German 100% (59/59) 100% (59/59) 100% (59/59) +dv Divehi/Dhivehi/Maldivian (0/49) (0/49) (0/49) +dz Dzongkha (0/95) (0/95) (0/95) +ee Ewe 100% (99/99) 100% (99/99) 100% (99/99) +el Greek 100% (69/69) 100% (69/69) 100% (69/69) +en English 100% (72/72) 100% (72/72) 100% (72/72) +eo Esperanto 100% (64/64) 100% (64/64) 100% (64/64) +es Spanish 100% (66/66) 100% (66/66) 100% (66/66) +et Estonian 100% (64/64) 100% (64/64) 100% (64/64) +eu Basque 100% (56/56) 100% (56/56) 100% (56/56) +fa Persian 100% (129/129) (0/129) 100% (129/129) +fat Fanti 100% (73/73) 100% (73/73) 100% (73/73) +ff Fulah (Fula) 100% (62/62) 100% (62/62) 100% (62/62) +fi Finnish 100% (62/62) 100% (62/62) 100% (62/62) +fil Filipino 100% (84/84) 100% (84/84) 100% (84/84) +fj Fijian 100% (52/52) 100% (52/52) 100% (52/52) +fo Faroese 100% (68/68) 100% (68/68) 100% (68/68) +fr French 100% (84/84) 100% (84/84) 100% (84/84) +fur Friulian 100% (66/66) 100% (66/66) 100% (66/66) +fy Frisian 100% (75/75) 100% (75/75) 100% (75/75) +ga Irish 100% (80/80) 100% (80/80) 100% (80/80) +gd Scots Gaelic 100% (70/70) 100% (70/70) 100% (70/70) +gez Ethiopic (Geez) (0/218) (0/218) (0/218) +gl Galician 100% (66/66) 100% (66/66) 100% (66/66) +gn Guarani 100% (70/70) 100% (70/70) 100% (70/70) +gu Gujarati (0/68) (0/68) (0/68) +gv Manx Gaelic 100% (54/54) 100% (54/54) 100% (54/54) +ha Hausa 100% (60/60) 100% (60/60) 100% (60/60) +haw Hawaiian 100% (63/63) 100% (63/63) 100% (63/63) +he Hebrew 100% (27/27) (0/27) (0/27) +hi Hindi (Devanagari script) (0/68) (0/68) (0/68) +hne Chhattisgarhi (0/68) (0/68) (0/68) +ho Hiri Motu 100% (52/52) 100% (52/52) 100% (52/52) +hr Croatian 100% (62/62) 100% (62/62) 100% (62/62) +hsb Upper Sorbian 100% (72/72) 100% (72/72) 100% (72/72) +ht Haitian/Haitian Creole 100% (56/56) 100% (56/56) 100% (56/56) +hu Hungarian 100% (70/70) 100% (70/70) 100% (70/70) +hy Armenian 100% (77/77) (0/77) (0/77) +hz Herero 100% (57/57) 100% (57/57) 100% (57/57) +ia Interlingua 100% (52/52) 100% (52/52) 100% (52/52) +id Indonesian 100% (54/54) 100% (54/54) 100% (54/54) +ie Interlingue 100% (52/52) 100% (52/52) 100% (52/52) +ig Igbo 100% (58/58) 100% (58/58) 100% (58/58) +ii Sichuan Yi/Nuosu (0/1165) (0/1165) (0/1165) +ik Inupiaq (Inupiak, Eskimo) 100% (68/68) 100% (68/68) 100% (68/68) +io Ido 100% (52/52) 100% (52/52) 100% (52/52) +is Icelandic 100% (70/70) 100% (70/70) 100% (70/70) +it Italian 100% (72/72) 100% (72/72) 100% (72/72) +iu Inuktitut 100% (161/161) (0/161) (0/161) +ja Japanese (0/6537) (0/6537) (0/6537) +jv Javanese 100% (56/56) 100% (56/56) 100% (56/56) +ka Georgian 100% (33/33) 100% (33/33) 100% (33/33) +kaa Kara-Kalpak (Karakalpak) 100% (78/78) 100% (78/78) 100% (78/78) +kab Kabyle 100% (70/70) 100% (70/70) 100% (70/70) +ki Kikuyu 100% (56/56) 100% (56/56) 100% (56/56) +kj Kuanyama/Kwanyama 100% (52/52) 100% (52/52) 100% (52/52) +kk Kazakh 100% (77/77) 100% (77/77) 100% (77/77) +kl Greenlandic 100% (81/81) 100% (81/81) 100% (81/81) +km Central Khmer (0/63) (0/63) (0/63) +kn Kannada (0/70) (0/70) (0/70) +ko Korean (0/2443) (0/2443) (0/2443) +kok Kokani (Devanagari script) (0/68) (0/68) (0/68) +kr Kanuri 100% (56/56) 96% (54/56) 100% (56/56) +ks Kashmiri 94% (137/145) (0/145) 97% (141/145) +ku-am Kurdish in Armenia 100% (64/64) 100% (64/64) 100% (64/64) +ku-iq Kurdish in Iraq 100% (32/32) (0/32) 87% (28/32) +ku-ir Kurdish in Iran 100% (32/32) (0/32) 87% (28/32) +ku-tr Kurdish in Turkey 100% (62/62) 100% (62/62) 100% (62/62) +kum Kumyk 100% (66/66) 100% (66/66) 100% (66/66) +kv Komi (Komi-Permyak/Komi-Siryan) 100% (70/70) 100% (70/70) 100% (70/70) +kw Cornish 100% (64/64) 100% (64/64) 100% (64/64) +kwm Kwambi 100% (52/52) 100% (52/52) 100% (52/52) +ky Kirgiz 100% (70/70) 100% (70/70) 100% (70/70) +la Latin 100% (68/68) 100% (68/68) 100% (68/68) +lah Lahnda 94% (137/145) (0/145) 97% (141/145) +lb Luxembourgish (Letzeburgesch) 100% (75/75) 100% (75/75) 100% (75/75) +lez Lezghian (Lezgian) 100% (67/67) 100% (67/67) 100% (67/67) +lg Ganda 100% (54/54) 100% (54/54) 100% (54/54) +li Limburgan/Limburger/Limburgish 100% (62/62) 100% (62/62) 100% (62/62) +ln Lingala 100% (81/81) 100% (81/81) 100% (81/81) +lo Lao 100% (55/55) (0/55) 83% (46/55) +lt Lithuanian 100% (70/70) 100% (70/70) 100% (70/70) +lv Latvian 100% (78/78) 100% (78/78) 100% (78/78) +mai Maithili (Devanagari script) (0/68) (0/68) (0/68) +mg Malagasy 100% (56/56) 100% (56/56) 100% (56/56) +mh Marshallese 100% (62/62) 100% (62/62) 100% (62/62) +mi Maori 100% (64/64) 100% (64/64) 100% (64/64) +mk Macedonian 100% (42/42) 100% (42/42) 100% (42/42) +ml Malayalam (0/68) (0/68) (0/68) +mn-cn Mongolian in China (0/130) (0/130) (0/130) +mn-mn Mongolian in Mongolia 100% (70/70) 100% (70/70) 100% (70/70) +mo Moldavian 100% (128/128) 100% (128/128) 100% (128/128) +mr Marathi (Devanagari script) (0/68) (0/68) (0/68) +ms Malay 100% (52/52) 100% (52/52) 100% (52/52) +mt Maltese 100% (72/72) 100% (72/72) 100% (72/72) +my Burmese (Myanmar) (0/48) (0/48) (0/48) +na Nauru 100% (60/60) 100% (60/60) 100% (60/60) +nb Norwegian Bokmal 100% (70/70) 100% (70/70) 100% (70/70) +nds Low Saxon 100% (59/59) 100% (59/59) 100% (59/59) +ne Nepali (Devanagari script) (0/68) (0/68) (0/68) +ng Ndonga 100% (52/52) 100% (52/52) 100% (52/52) +nl Dutch 100% (82/82) 100% (82/82) 100% (82/82) +nn Norwegian Nynorsk 100% (76/76) 100% (76/76) 100% (76/76) +no Norwegian (Bokmal) 100% (70/70) 100% (70/70) 100% (70/70) +nr Ndebele, South 100% (52/52) 100% (52/52) 100% (52/52) +nso Northern Sotho 100% (58/58) 100% (58/58) 100% (58/58) +nv Navajo/Navaho 100% (72/72) 100% (72/72) 100% (72/72) +ny Chichewa 100% (54/54) 100% (54/54) 100% (54/54) +oc Occitan 100% (70/70) 100% (70/70) 100% (70/70) +om Oromo or Galla 100% (52/52) 100% (52/52) 100% (52/52) +or Oriya (0/68) (0/68) (0/68) +os Ossetic 100% (66/66) 100% (66/66) 100% (66/66) +ota Ottoman Turkish 97% (36/37) (0/37) 97% (36/37) +pa Panjabi/Punjabi (0/63) (0/63) (0/63) +pa-pk Panjabi/Punjabi in Pakistan 94% (137/145) (0/145) 97% (141/145) +pap-an Papiamento in Netherlands Antilles 100% (72/72) 100% (72/72) 100% (72/72) +pap-aw Papiamento in Aruba 100% (54/54) 100% (54/54) 100% (54/54) +pl Polish 100% (70/70) 100% (70/70) 100% (70/70) +ps-af Pashto in Afghanistan 83% (41/49) (0/49) 77% (38/49) +ps-pk Pashto in Pakistan 81% (40/49) (0/49) 75% (37/49) +pt Portuguese 100% (82/82) 100% (82/82) 100% (82/82) +qu Quechua 100% (55/55) 100% (55/55) 100% (55/55) +rm Rhaeto-Romance (Romansch) 100% (66/66) 100% (66/66) 100% (66/66) +rn Rundi 100% (52/52) 100% (52/52) 100% (52/52) +ro Romanian 100% (62/62) 100% (62/62) 100% (62/62) +ru Russian 100% (66/66) 100% (66/66) 100% (66/66) +rw Kinyarwanda 100% (52/52) 100% (52/52) 100% (52/52) +sa Sanskrit (Devanagari script) (0/68) (0/68) (0/68) +sah Yakut 100% (76/76) 100% (76/76) 97% (74/76) +sc Sardinian 100% (62/62) 100% (62/62) 100% (62/62) +sco Scots 100% (56/56) 100% (56/56) 100% (56/56) +sd Sindhi 81% (44/54) (0/54) 79% (43/54) +se North Sami 100% (66/66) 100% (66/66) 100% (66/66) +sel Selkup (Ostyak-Samoyed) 100% (66/66) 100% (66/66) 100% (66/66) +sg Sango 100% (72/72) 100% (72/72) 100% (72/72) +sh Serbo-Croatian 100% (156/156) 100% (156/156) 98% (154/156) +shs Secwepemctsin 100% (48/48) 100% (48/48) 100% (48/48) +si Sinhala/Sinhalese (0/73) (0/73) (0/73) +sid Sidamo (0/281) (0/281) (0/281) +sk Slovak 100% (86/86) 100% (86/86) 100% (86/86) +sl Slovenian 100% (62/62) 100% (62/62) 100% (62/62) +sm Samoan 100% (53/53) 100% (53/53) 100% (53/53) +sma South Sami 100% (60/60) 100% (60/60) 100% (60/60) +smj Lule Sami 100% (60/60) 100% (60/60) 100% (60/60) +smn Inari Sami 100% (68/68) 100% (68/68) 100% (68/68) +sms Skolt Sami 100% (80/80) 100% (80/80) 97% (78/80) +sn Shona 100% (52/52) 100% (52/52) 100% (52/52) +so Somali 100% (52/52) 100% (52/52) 100% (52/52) +sq Albanian 100% (56/56) 100% (56/56) 100% (56/56) +sr Serbian 100% (60/60) 100% (60/60) 100% (60/60) +ss Swati 100% (52/52) 100% (52/52) 100% (52/52) +st Sotho, Southern 100% (52/52) 100% (52/52) 100% (52/52) +su Sundanese 100% (54/54) 100% (54/54) 100% (54/54) +sv Swedish 100% (68/68) 100% (68/68) 100% (68/68) +sw Swahili 100% (52/52) 100% (52/52) 100% (52/52) +syr Syriac (0/45) (0/45) (0/45) +ta Tamil (0/48) (0/48) (0/48) +te Telugu (0/70) (0/70) (0/70) +tg Tajik 100% (78/78) 100% (78/78) 97% (76/78) +th Thai 1% (1/74) (0/74) (0/74) +ti-er Eritrean Tigrinya (0/255) (0/255) (0/255) +ti-et Ethiopian Tigrinya (0/281) (0/281) (0/281) +tig Tigre (0/221) (0/221) (0/221) +tk Turkmen 100% (68/68) 100% (68/68) 100% (68/68) +tl Tagalog 100% (84/84) 100% (84/84) 100% (84/84) +tn Tswana 100% (58/58) 100% (58/58) 100% (58/58) +to Tonga 100% (53/53) 100% (53/53) 100% (53/53) +tr Turkish 100% (70/70) 100% (70/70) 100% (70/70) +ts Tsonga 100% (52/52) 100% (52/52) 100% (52/52) +tt Tatar 100% (76/76) 100% (76/76) 100% (76/76) +tw Twi 100% (73/73) 100% (73/73) 100% (73/73) +ty Tahitian 100% (65/65) 100% (65/65) 100% (65/65) +tyv Tuvinian 100% (70/70) 100% (70/70) 100% (70/70) +ug Uighur 100% (125/125) (0/125) 100% (125/125) +uk Ukrainian 100% (72/72) 100% (72/72) 100% (72/72) +ur Urdu 94% (137/145) (0/145) 97% (141/145) +uz Uzbek 100% (52/52) 100% (52/52) 100% (52/52) +ve Venda 100% (62/62) 100% (62/62) 100% (62/62) +vi Vietnamese 100% (194/194) 77% (150/194) 76% (148/194) +vo Volapuk 100% (54/54) 100% (54/54) 100% (54/54) +vot Votic 100% (62/62) 100% (62/62) 100% (62/62) +wa Walloon 100% (70/70) 100% (70/70) 100% (70/70) +wal Wolaitta/Wolaytta (0/281) (0/281) (0/281) +wen Sorbian languages (lower and upper) 100% (76/76) 100% (76/76) 100% (76/76) +wo Wolof 100% (66/66) 100% (66/66) 100% (66/66) +xh Xhosa 100% (52/52) 100% (52/52) 100% (52/52) +yap Yapese 100% (58/58) 100% (58/58) 100% (58/58) +yi Yiddish 100% (27/27) (0/27) (0/27) +yo Yoruba 100% (119/119) 100% (119/119) 100% (119/119) +za Zhuang/Chuang 100% (52/52) 100% (52/52) 100% (52/52) +zh-cn Chinese (simplified) 0% (2/6765) 0% (2/6765) 0% (2/6765) +zh-hk Chinese Hong Kong Supplementary Character Set (0/2213) (0/2213) (0/2213) +zh-mo Chinese in Macau (0/2213) (0/2213) (0/2213) +zh-sg Chinese in Singapore 0% (2/6765) 0% (2/6765) 0% (2/6765) +zh-tw Chinese (traditional) (0/13063) (0/13063) (0/13063) +zu Zulu 100% (52/52) 100% (52/52) 100% (52/52) diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/status.txt b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/status.txt new file mode 100644 index 0000000..ecc3055 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/status.txt @@ -0,0 +1,6237 @@ +This is the status file for DejaVu fonts +($Id: status.txt 2362 2009-08-27 14:43:39Z ben_laenen $) + +original = present in original Bitstream Vera 1.10 +<version> = added in DejaVu fonts <version> + +U+0020 space original +U+0021 exclam original +U+0022 quotedbl original +U+0023 numbersign original +U+0024 dollar original +U+0025 percent original +U+0026 ampersand original +U+0027 quotesingle original +U+0028 parenleft original +U+0029 parenright original +U+002a asterisk original +U+002b plus original +U+002c comma original +U+002d hyphen original +U+002e period original +U+002f slash original +U+0030 zero original +U+0031 one original +U+0032 two original +U+0033 three original +U+0034 four original +U+0035 five original +U+0036 six original +U+0037 seven original +U+0038 eight original +U+0039 nine original +U+003a colon original +U+003b semicolon original +U+003c less original +U+003d equal original +U+003e greater original +U+003f question original +U+0040 at original +U+0041 A original +U+0042 B original +U+0043 C original +U+0044 D original +U+0045 E original +U+0046 F original +U+0047 G original +U+0048 H original +U+0049 I original +U+004a J original +U+004b K original +U+004c L original +U+004d M original +U+004e N original +U+004f O original +U+0050 P original +U+0051 Q original +U+0052 R original +U+0053 S original +U+0054 T original +U+0055 U original +U+0056 V original +U+0057 W original +U+0058 X original +U+0059 Y original +U+005a Z original +U+005b bracketleft original +U+005c backslash original +U+005d bracketright original +U+005e asciicircum original +U+005f underscore original +U+0060 grave original +U+0061 a original +U+0062 b original +U+0063 c original +U+0064 d original +U+0065 e original +U+0066 f original +U+0067 g original +U+0068 h original +U+0069 i original +U+006a j original +U+006b k original +U+006c l original +U+006d m original +U+006e n original +U+006f o original +U+0070 p original +U+0071 q original +U+0072 r original +U+0073 s original +U+0074 t original +U+0075 u original +U+0076 v original +U+0077 w original +U+0078 x original +U+0079 y original +U+007a z original +U+007b braceleft original +U+007c bar original +U+007d braceright original +U+007e asciitilde original +U+00a0 nonbreakingspace original +U+00a1 exclamdown original +U+00a2 cent original +U+00a3 sterling original +U+00a4 currency original +U+00a5 yen original +U+00a6 brokenbar original +U+00a7 section original +U+00a8 dieresis original +U+00a9 copyright original +U+00aa ordfeminine original +U+00ab guillemotleft original +U+00ac logicalnot original +U+00ad sfthyphen original +U+00ae registered original +U+00af macron original +U+00b0 degree original +U+00b1 plusminus original +U+00b2 twosuperior original +U+00b3 threesuperior original +U+00b4 acute original +U+00b5 mu original +U+00b6 paragraph original +U+00b7 periodcentered original +U+00b8 cedilla original +U+00b9 onesuperior original +U+00ba ordmasculine original +U+00bb guillemotright original +U+00bc onequarter original +U+00bd onehalf original +U+00be threequarters original +U+00bf questiondown original +U+00c0 Agrave original +U+00c1 Aacute original +U+00c2 Acircumflex original +U+00c3 Atilde original +U+00c4 Adieresis original +U+00c5 Aring original +U+00c6 AE original +U+00c7 Ccedilla original +U+00c8 Egrave original +U+00c9 Eacute original +U+00ca Ecircumflex original +U+00cb Edieresis original +U+00cc Igrave original +U+00cd Iacute original +U+00ce Icircumflex original +U+00cf Idieresis original +U+00d0 Eth original +U+00d1 Ntilde original +U+00d2 Ograve original +U+00d3 Oacute original +U+00d4 Ocircumflex original +U+00d5 Otilde original +U+00d6 Odieresis original +U+00d7 multiply original +U+00d8 Oslash original +U+00d9 Ugrave original +U+00da Uacute original +U+00db Ucircumflex original +U+00dc Udieresis original +U+00dd Yacute original +U+00de Thorn original +U+00df germandbls original +U+00e0 agrave original +U+00e1 aacute original +U+00e2 acircumflex original +U+00e3 atilde original +U+00e4 adieresis original +U+00e5 aring original +U+00e6 ae original +U+00e7 ccedilla original +U+00e8 egrave original +U+00e9 eacute original +U+00ea ecircumflex original +U+00eb edieresis original +U+00ec igrave original +U+00ed iacute original +U+00ee icircumflex original +U+00ef idieresis original +U+00f0 eth original +U+00f1 ntilde original +U+00f2 ograve original +U+00f3 oacute original +U+00f4 ocircumflex original +U+00f5 otilde original +U+00f6 odieresis original +U+00f7 divide original +U+00f8 oslash original +U+00f9 ugrave original +U+00fa uacute original +U+00fb ucircumflex original +U+00fc udieresis original +U+00fd yacute original +U+00fe thorn original +U+00ff ydieresis original +U+0100 Amacron 1.5 +U+0101 amacron 1.5 +U+0102 Abreve 1.5 +U+0103 abreve 1.5 +U+0104 Aogonek 1.4 +U+0105 aogonek 1.4 +U+0106 Cacute original +U+0107 cacute original +U+0108 Ccircumflex 1.5 +U+0109 ccircumflex 1.5 +U+010a Cdotaccent 1.5 +U+010b cdotaccent 1.5 +U+010c Ccaron original +U+010d ccaron original +U+010e Dcaron 1.0 +U+010f dcaron 1.0 +U+0110 Dcroat 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0111 dcroat original +U+0112 Emacron 1.5 +U+0113 emacron 1.5 +U+0114 Ebreve 1.5 +U+0115 ebreve 1.5 +U+0116 Edotaccent 1.5 +U+0117 edotaccent 1.5 +U+0118 Eogonek 1.4 +U+0119 eogonek 1.4 +U+011a Ecaron 1.0 +U+011b ecaron 1.0 +U+011c Gcircumflex 1.5 +U+011d gcircumflex 1.5 +U+011e Gbreve original +U+011f gbreve original +U+0120 Gdotaccent 1.5 +U+0121 gdotaccent 1.5 +U+0122 Gcommaaccent 1.11 +U+0123 gcommaaccent 1.11 +U+0124 Hcircumflex 1.5 +U+0125 hcircumflex 1.5 +U+0126 Hbar 1.12 +U+0127 hbar 1.12 +U+0128 Itilde 1.5 +U+0129 itilde 1.5 +U+012a Imacron 1.5 +U+012b imacron 1.5 +U+012c Ibreve 1.5 +U+012d ibreve 1.5 +U+012e Iogonek 1.11 +U+012f iogonek 1.11 +U+0130 Idotaccent original +U+0131 dotlessi original +U+0132 IJ 1.11 +U+0133 ij 1.11 +U+0134 Jcircumflex 1.5 +U+0135 jcircumflex 1.5 +U+0136 Kcommaaccent 1.11 +U+0137 kcommaaccent 1.11 +U+0138 kgreenlandic 1.12 +U+0139 Lacute 1.1 +U+013a lacute 1.1 +U+013b Lcommaaccent 1.11 +U+013c lcommaaccent 1.11 +U+013d Lcaron 1.1 +U+013e lcaron 1.1 +U+013f Ldot 1.2 +U+0140 ldot 1.2 +U+0141 Lslash original +U+0142 lslash original +U+0143 Nacute 1.4 +U+0144 nacute 1.4 +U+0145 Ncommaaccent 1.11 +U+0146 ncommaaccent 1.11 +U+0147 Ncaron 1.0 +U+0148 ncaron 1.0 +U+0149 napostrophe 1.12 +U+014a Eng 1.12 +U+014b eng 1.12 +U+014c Omacron 1.5 +U+014d omacron 1.5 +U+014e Obreve 1.5 +U+014f obreve 1.5 +U+0150 Ohungarumlaut 1.5 +U+0151 ohungarumlaut 1.5 +U+0152 OE original +U+0153 oe original +U+0154 Racute 1.1 +U+0155 racute 1.1 +U+0156 Rcommaaccent 1.11 +U+0157 rcommaaccent 1.11 +U+0158 Rcaron 1.0 +U+0159 rcaron 1.0 +U+015a Sacute 1.4 +U+015b sacute 1.4 +U+015c Scircumflex 1.5 +U+015d scircumflex 1.5 +U+015e Scedilla original +U+015f scedilla original +U+0160 Scaron original +U+0161 scaron original +U+0162 Tcommaaccent 1.5 +U+0163 tcommaaccent 1.5 +U+0164 Tcaron 1.0 +U+0165 tcaron 1.0 +U+0166 Tbar 1.12 +U+0167 tbar 1.12 +U+0168 Utilde 1.5 +U+0169 utilde 1.5 +U+016a Umacron 1.5 +U+016b umacron 1.5 +U+016c Ubreve 1.5 +U+016d ubreve 1.5 +U+016e Uring 1.0 +U+016f uring 1.0 +U+0170 Uhungarumlaut 1.5 +U+0171 uhungarumlaut 1.5 +U+0172 Uogonek 1.11 +U+0173 uogonek 1.11 +U+0174 Wcircumflex 1.2 +U+0175 wcircumflex 1.2 +U+0176 Ycircumflex 1.2 +U+0177 ycircumflex 1.2 +U+0178 Ydieresis original +U+0179 Zacute 1.4 +U+017a zacute 1.4 +U+017b Zdotaccent 1.4 +U+017c zdotaccent 1.4 +U+017d Zcaron original +U+017e zcaron original +U+017f longs 1.12 +U+0180 uni0180 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0181 uni0181 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0182 uni0182 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0183 uni0183 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0184 uni0184 2.3 +U+0185 uni0185 2.3 +U+0186 uni0186 1.15 +U+0187 uni0187 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0188 uni0188 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0189 uni0189 2.1 +U+018a uni018A 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+018b uni018B 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+018c uni018C 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+018d uni018D 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+018e uni018E 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+018f uni018F 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0190 uni0190 1.15 +U+0191 uni0191 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0192 florin original +U+0193 uni0193 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0194 uni0194 1.14 +U+0195 uni0195 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.6 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0196 uni0196 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0197 uni0197 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0198 uni0198 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0199 uni0199 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+019a uni019A 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+019b uni019B 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+019c uni019C 2.3 +U+019d uni019D 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+019e uni019E 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+019f uni019F 2.3 +U+01a0 Ohorn 2.3 +U+01a1 ohorn 2.3 +U+01a2 uni01A2 2.3 +U+01a3 uni01A3 2.3 +U+01a4 uni01A4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+01a5 uni01A5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+01a6 uni01A6 2.3 +U+01a7 uni01A7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+01a8 uni01A8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+01a9 uni01A9 2.2 +U+01aa uni01AA 2.3 +U+01ab uni01AB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+01ac uni01AC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+01ad uni01AD 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+01ae uni01AE 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+01af Uhorn 2.3 +U+01b0 uhorn 2.3 +U+01b1 uni01B1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+01b2 uni01B2 2.3 +U+01b3 uni01B3 2.3 +U+01b4 uni01B4 2.3 +U+01b5 uni01B5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+01b6 uni01B6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+01b7 uni01B7 2.3 +U+01b8 uni01B8 2.3 +U+01b9 uni01B9 2.3 +U+01ba uni01BA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+01bb uni01BB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01bc uni01BC 2.3 +U+01bd uni01BD 2.3 +U+01be uni01BE 2.3 +U+01bf uni01BF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+01c0 uni01C0 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+01c1 uni01C1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+01c2 uni01C2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+01c3 uni01C3 2.2 +U+01c4 uni01C4 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01c5 uni01C5 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01c6 uni01C6 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01c7 uni01C7 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01c8 uni01C8 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01c9 uni01C9 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01ca uni01CA 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01cb uni01CB 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01cc uni01CC 1.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01cd uni01CD 1.15 +U+01ce uni01CE 1.15 +U+01cf uni01CF 1.15 +U+01d0 uni01D0 1.15 +U+01d1 uni01D1 1.15 +U+01d2 uni01D2 1.15 +U+01d3 uni01D3 1.15 +U+01d4 uni01D4 1.15 +U+01d5 uni01D5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01d6 uni01D6 1.13 +U+01d7 uni01D7 2.3 +U+01d8 uni01D8 2.3 +U+01d9 uni01D9 2.3 +U+01da uni01DA 2.3 +U+01db uni01DB 2.3 +U+01dc uni01DC 2.3 +U+01dd uni01DD 2.2 +U+01de uni01DE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique) 2.23 (Serif Italic Condensed) +U+01df uni01DF 1.13 +U+01e0 uni01E0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01e1 uni01E1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01e2 uni01E2 1.5 +U+01e3 uni01E3 1.5 +U+01e4 uni01E4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+01e5 uni01E5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+01e6 Gcaron 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01e7 gcaron 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01e8 uni01E8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01e9 uni01E9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01ea uni01EA 1.9 +U+01eb uni01EB 1.9 +U+01ec uni01EC 1.9 +U+01ed uni01ED 1.9 +U+01ee uni01EE 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01ef uni01EF 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01f0 uni01F0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono) 2.22 (Sans Mono Bold) 2.23 (Serif Italic Condensed) +U+01f1 uni01F1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01f2 uni01F2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01f3 uni01F3 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01f4 uni01F4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01f5 uni01F5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01f6 uni01F6 2.3 +U+01f7 uni01F7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+01f8 uni01F8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01f9 uni01F9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01fa Aringacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01fb aringacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+01fc AEacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01fd aeacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01fe Oslashacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+01ff oslashacute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0200 uni0200 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0201 uni0201 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0202 uni0202 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0203 uni0203 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0204 uni0204 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0205 uni0205 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0206 uni0206 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0207 uni0207 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0208 uni0208 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0209 uni0209 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+020a uni020A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+020b uni020B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+020c uni020C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+020d uni020D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+020e uni020E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+020f uni020F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0210 uni0210 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0211 uni0211 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0212 uni0212 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0213 uni0213 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0214 uni0214 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0215 uni0215 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0216 uni0216 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0217 uni0217 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0218 Scommaaccent 1.5 +U+0219 scommaaccent 1.5 +U+021a uni021A 1.5 +U+021b uni021B 1.5 +U+021c uni021C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+021d uni021D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+021e uni021E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+021f uni021F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0220 uni0220 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.18 (Sans Mono, Sans Mono Bold) 2.23 (Serif Italic Condensed) +U+0221 uni0221 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+0222 uni0222 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0223 uni0223 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0224 uni0224 2.3 +U+0225 uni0225 2.3 +U+0226 uni0226 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0227 uni0227 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0228 uni0228 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0229 uni0229 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+022a uni022A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+022b uni022B 1.13 +U+022c uni022C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+022d uni022D 1.13 +U+022e uni022E 1.10 +U+022f uni022F 1.10 +U+0230 uni0230 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0231 uni0231 1.13 +U+0232 uni0232 1.5 +U+0233 uni0233 1.5 +U+0234 uni0234 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+0235 uni0235 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+0236 uni0236 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+0237 dotlessj 1.5 +U+0238 uni0238 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0239 uni0239 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+023a uni023A 2.3 +U+023b uni023B 2.3 +U+023c uni023C 2.3 +U+023d uni023D 2.3 +U+023e uni023E 2.3 +U+023f uni023F 2.3 +U+0240 uni0240 2.3 +U+0241 uni0241 2.3 +U+0242 uni0242 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+0243 uni0243 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0244 uni0244 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0245 uni0245 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0246 uni0246 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0247 uni0247 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0248 uni0248 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+0249 uni0249 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+024a uni024A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+024b uni024B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans ExtraLight) +U+024c uni024C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+024d uni024D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+024e uni024E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+024f uni024F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0250 uni0250 1.14 +U+0251 uni0251 1.14 +U+0252 uni0252 1.14 +U+0253 uni0253 1.14 +U+0254 uni0254 1.14 +U+0255 uni0255 1.14 +U+0256 uni0256 1.14 +U+0257 uni0257 1.14 +U+0258 uni0258 1.14 +U+0259 uni0259 1.14 +U+025a uni025A 1.14 +U+025b uni025B 1.14 +U+025c uni025C 1.14 +U+025d uni025D 1.14 +U+025e uni025E 1.14 +U+025f uni025F 1.14 +U+0260 uni0260 1.14 +U+0261 uni0261 1.14 +U+0262 uni0262 1.14 +U+0263 uni0263 1.14 +U+0264 uni0264 1.14 +U+0265 uni0265 1.14 +U+0266 uni0266 1.14 +U+0267 uni0267 1.14 +U+0268 uni0268 1.14 +U+0269 uni0269 1.14 +U+026a uni026A 1.14 +U+026b uni026B 1.14 +U+026c uni026C 1.14 +U+026d uni026D 1.14 +U+026e uni026E 1.14 +U+026f uni026F 1.14 +U+0270 uni0270 1.14 +U+0271 uni0271 1.14 +U+0272 uni0272 1.14 +U+0273 uni0273 1.14 +U+0274 uni0274 1.14 +U+0275 uni0275 1.14 +U+0276 uni0276 1.14 +U+0277 uni0277 1.14 +U+0278 uni0278 1.14 +U+0279 uni0279 1.14 +U+027a uni027A 1.14 +U+027b uni027B 1.14 +U+027c uni027C 1.14 +U+027d uni027D 1.14 +U+027e uni027E 1.14 +U+027f uni027F 1.14 +U+0280 uni0280 1.14 +U+0281 uni0281 1.14 +U+0282 uni0282 1.14 +U+0283 uni0283 1.14 +U+0284 uni0284 1.14 +U+0285 uni0285 1.14 +U+0286 uni0286 1.14 +U+0287 uni0287 1.14 +U+0288 uni0288 1.14 +U+0289 uni0289 1.14 +U+028a uni028A 1.14 +U+028b uni028B 1.14 +U+028c uni028C 1.14 +U+028d uni028D 1.14 +U+028e uni028E 1.14 +U+028f uni028F 1.14 +U+0290 uni0290 1.14 +U+0291 uni0291 1.14 +U+0292 uni0292 1.14 +U+0293 uni0293 1.14 +U+0294 uni0294 1.14 +U+0295 uni0295 1.14 +U+0296 uni0296 1.14 +U+0297 uni0297 1.14 +U+0298 uni0298 1.14 +U+0299 uni0299 1.14 +U+029a uni029A 1.14 +U+029b uni029B 1.14 +U+029c uni029C 1.14 +U+029d uni029D 1.14 +U+029e uni029E 1.14 +U+029f uni029F 1.14 +U+02a0 uni02A0 1.14 +U+02a1 uni02A1 1.14 +U+02a2 uni02A2 1.14 +U+02a3 uni02A3 1.14 +U+02a4 uni02A4 1.14 +U+02a5 uni02A5 1.14 +U+02a6 uni02A6 1.14 +U+02a7 uni02A7 1.14 +U+02a8 uni02A8 1.14 +U+02a9 uni02A9 1.14 +U+02aa uni02AA 1.14 +U+02ab uni02AB 1.14 +U+02ac uni02AC 1.14 +U+02ad uni02AD 1.14 +U+02ae uni02AE 1.14 +U+02af uni02AF 1.14 +U+02b0 uni02B0 1.14 +U+02b1 uni02B1 1.14 +U+02b2 uni02B2 1.14 +U+02b3 uni02B3 1.14 +U+02b4 uni02B4 1.14 +U+02b5 uni02B5 1.14 +U+02b6 uni02B6 1.14 +U+02b7 uni02B7 1.14 +U+02b8 uni02B8 1.14 +U+02b9 uni02B9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+02ba uni02BA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02bb uni02BB 1.5 +U+02bc uni02BC 1.12 +U+02bd uni02BD 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+02be uni02BE 2.2 +U+02bf uni02BF 2.2 +U+02c0 uni02C0 1.14 +U+02c1 uni02C1 1.14 +U+02c2 uni02C2 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02c3 uni02C3 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02c4 uni02C4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02c5 uni02C5 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02c6 circumflex original +U+02c7 caron original +U+02c8 uni02C8 2.0 +U+02c9 uni02C9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+02ca uni02CA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+02cb uni02CB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+02cc uni02CC 2.0 +U+02cd uni02CD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+02ce uni02CE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+02cf uni02CF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+02d0 uni02D0 1.14 +U+02d1 uni02D1 1.14 +U+02d2 uni02D2 2.0 +U+02d3 uni02D3 2.2 +U+02d4 uni02D4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02d5 uni02D5 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02d6 uni02D6 2.0 +U+02d7 uni02D7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+02d8 breve original +U+02d9 dotaccent original +U+02da ring original +U+02db ogonek original +U+02dc tilde original +U+02dd hungarumlaut original +U+02de uni02DE 2.0 +U+02df uni02DF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02e0 uni02E0 1.14 +U+02e1 uni02E1 1.14 +U+02e2 uni02E2 1.14 +U+02e3 uni02E3 1.14 +U+02e4 uni02E4 1.14 +U+02e5 uni02E5 2.0 +U+02e6 uni02E6 2.0 +U+02e7 uni02E7 2.0 +U+02e8 uni02E8 2.0 +U+02e9 uni02E9 2.0 +U+02ec uni02EC 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02ed uni02ED 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+02ee uni02EE 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+02f3 uni02F3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+02f7 uni02F7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0300 gravecomb 1.15 +U+0301 acutecomb 1.15 +U+0302 uni0302 1.15 +U+0303 tildecomb 1.15 +U+0304 uni0304 1.15 +U+0305 uni0305 2.0 +U+0306 uni0306 1.15 +U+0307 uni0307 1.15 +U+0308 uni0308 1.15 +U+0309 hookabovecomb 2.1 +U+030a uni030A 1.15 +U+030b uni030B 1.15 +U+030c uni030C 1.15 +U+030d uni030D 2.0 +U+030e uni030E 2.0 +U+030f uni030F 2.0 +U+0310 uni0310 2.0 +U+0311 uni0311 2.0 +U+0312 uni0312 1.11 +U+0313 uni0313 2.1 +U+0314 uni0314 2.1 +U+0315 uni0315 2.0 +U+0316 uni0316 2.0 +U+0317 uni0317 2.0 +U+0318 uni0318 2.0 +U+0319 uni0319 2.0 +U+031a uni031A 2.1 +U+031b uni031B 2.1 +U+031c uni031C 2.0 +U+031d uni031D 2.0 +U+031e uni031E 2.0 +U+031f uni031F 2.0 +U+0320 uni0320 2.0 +U+0321 uni0321 1.15 +U+0322 uni0322 1.15 +U+0323 dotbelowcomb 2.1 +U+0324 uni0324 2.0 +U+0325 uni0325 2.0 +U+0326 uni0326 1.5 +U+0327 uni0327 2.1 +U+0328 uni0328 2.1 +U+0329 uni0329 2.0 +U+032a uni032A 2.0 +U+032b uni032B 2.1 +U+032c uni032C 2.0 +U+032d uni032D 2.0 +U+032e uni032E 2.0 +U+032f uni032F 2.0 +U+0330 uni0330 2.0 +U+0331 uni0331 2.0 +U+0332 uni0332 2.0 +U+0333 uni0333 2.1 +U+0334 uni0334 2.3 +U+0335 uni0335 2.3 +U+0336 uni0336 2.3 +U+0337 uni0337 2.3 +U+0338 uni0338 2.3 +U+0339 uni0339 2.0 +U+033a uni033A 2.0 +U+033b uni033B 2.0 +U+033c uni033C 2.1 +U+033d uni033D 2.0 +U+033e uni033E 2.1 +U+033f uni033F 2.1 +U+0340 uni0340 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0341 uni0341 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0342 uni0342 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0343 uni0343 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+0344 uni0344 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0345 uni0345 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0346 uni0346 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0347 uni0347 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0348 uni0348 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0349 uni0349 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+034a uni034A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+034b uni034B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+034c uni034C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+034d uni034D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+034e uni034E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+034f uni034F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+0351 uni0351 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0352 uni0352 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique) 2.28 (Sans Condensed Oblique, Sans Oblique) +U+0353 uni0353 2.5 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0357 uni0357 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0358 uni0358 2.3 +U+035a uni035A 2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+035c uni035C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+035d uni035D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+035e uni035E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+035f uni035F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0360 uni0360 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0361 uni0361 2.0 +U+0362 uni0362 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0370 uni0370 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0371 uni0371 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0372 uni0372 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0373 uni0373 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0374 uni0374 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0375 uni0375 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0376 uni0376 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+0377 uni0377 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+037a uni037A 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+037b uni037B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+037c uni037C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+037d uni037D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+037e uni037E 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0384 tonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0385 dieresistonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0386 Alphatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0387 anoteleia 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0388 Epsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0389 Etatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+038a Iotatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+038c Omicrontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+038e Upsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+038f Omegatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0390 iotadieresistonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0391 Alpha 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0392 Beta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0393 Gamma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0394 uni0394 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0395 Epsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0396 Zeta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0397 Eta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0398 Theta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0399 Iota 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+039a Kappa 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+039b Lambda 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+039c Mu 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+039d Nu 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+039e Xi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+039f Omicron 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03a0 Pi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03a1 Rho 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03a3 Sigma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03a4 Tau 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03a5 Upsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03a6 Phi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03a7 Chi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03a8 Psi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03a9 Omega original +U+03aa Iotadieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03ab Upsilondieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.1 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03ac alphatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03ad epsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03ae etatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03af iotatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03b0 upsilondieresistonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03b1 alpha 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03b2 beta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03b3 gamma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03b4 delta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03b5 epsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03b6 zeta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03b7 eta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03b8 theta 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03b9 iota 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03ba kappa 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03bb lambda 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03bc uni03BC 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03bd nu 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03be xi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03bf omicron 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03c0 pi original +U+03c1 rho 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03c2 sigma1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03c3 sigma 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03c4 tau 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03c5 upsilon 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03c6 phi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03c7 chi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03c8 psi 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03c9 omega 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03ca iotadieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03cb upsilondieresis 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03cc omicrontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03cd upsilontonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03ce omegatonos 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 1.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.2 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03cf uni03CF 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+03d0 uni03D0 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03d1 theta1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03d2 Upsilon1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03d3 uni03D3 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03d4 uni03D4 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03d5 phi1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.18 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03d6 omega1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+03d7 uni03D7 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03d8 uni03D8 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+03d9 uni03D9 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+03da uni03DA 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03db uni03DB 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03dc uni03DC 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03dd uni03DD 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03de uni03DE 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03df uni03DF 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03e0 uni03E0 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03e1 uni03E1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03e2 uni03E2 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03e3 uni03E3 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03e4 uni03E4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03e5 uni03E5 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03e6 uni03E6 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03e7 uni03E7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03e8 uni03E8 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03e9 uni03E9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03ea uni03EA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03eb uni03EB 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03ec uni03EC 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03ed uni03ED 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03ee uni03EE 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03ef uni03EF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+03f0 uni03F0 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03f1 uni03F1 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+03f2 uni03F2 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03f3 uni03F3 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03f4 uni03F4 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03f5 uni03F5 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03f6 uni03F6 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03f7 uni03F7 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03f8 uni03F8 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03f9 uni03F9 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03fa uni03FA 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03fb uni03FB 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+03fc uni03FC 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+03fd uni03FD 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03fe uni03FE 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+03ff uni03FF 1.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.0 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0400 uni0400 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0401 uni0401 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0402 uni0402 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0403 uni0403 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0404 uni0404 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0405 uni0405 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0406 uni0406 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0407 uni0407 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0408 uni0408 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0409 uni0409 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+040a uni040A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+040b uni040B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+040c uni040C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+040d uni040D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+040e uni040E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+040f uni040F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0410 uni0410 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0411 uni0411 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0412 uni0412 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0413 uni0413 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0414 uni0414 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0415 uni0415 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0416 uni0416 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0417 uni0417 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0418 uni0418 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0419 uni0419 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+041a uni041A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+041b uni041B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+041c uni041C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+041d uni041D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+041e uni041E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+041f uni041F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0420 uni0420 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0421 uni0421 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0422 uni0422 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0423 uni0423 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0424 uni0424 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0425 uni0425 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0426 uni0426 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0427 uni0427 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0428 uni0428 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0429 uni0429 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+042a uni042A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+042b uni042B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+042c uni042C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+042d uni042D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+042e uni042E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+042f uni042F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0430 uni0430 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0431 uni0431 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0432 uni0432 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0433 uni0433 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0434 uni0434 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0435 uni0435 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0436 uni0436 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0437 uni0437 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0438 uni0438 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0439 uni0439 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+043a uni043A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+043b uni043B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+043c uni043C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+043d uni043D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+043e uni043E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+043f uni043F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0440 uni0440 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0441 uni0441 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0442 uni0442 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0443 uni0443 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0444 uni0444 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0445 uni0445 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0446 uni0446 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0447 uni0447 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0448 uni0448 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0449 uni0449 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+044a uni044A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+044b uni044B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+044c uni044C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+044d uni044D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+044e uni044E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+044f uni044F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0450 uni0450 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0451 uni0451 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0452 uni0452 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0453 uni0453 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0454 uni0454 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0455 uni0455 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0456 uni0456 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0457 uni0457 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0458 uni0458 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0459 uni0459 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+045a uni045A 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+045b uni045B 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+045c uni045C 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+045d uni045D 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+045e uni045E 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+045f uni045F 1.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 1.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold) 1.6 (Serif Bold Italic, Serif Italic) 1.7 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+0460 uni0460 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0461 uni0461 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+0462 uni0462 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0463 uni0463 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0464 uni0464 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+0465 uni0465 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+0466 uni0466 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0467 uni0467 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0468 uni0468 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0469 uni0469 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+046a uni046A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.21 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+046b uni046B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.21 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+046c uni046C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+046d uni046D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+046e uni046E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+046f uni046F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0470 uni0470 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0471 uni0471 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0472 uni0472 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0473 uni0473 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0474 uni0474 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+0475 uni0475 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.12 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+0476 uni0476 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0477 uni0477 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0478 uni0478 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0479 uni0479 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+047a uni047A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+047b uni047B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+047c uni047C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+047d uni047D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+047e uni047E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+047f uni047F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0480 uni0480 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0481 uni0481 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0482 uni0482 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0483 uni0483 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0484 uni0484 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0485 uni0485 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0486 uni0486 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0487 uni0487 2.9 (Sans, Sans Condensed) 2.27 (Sans Bold, Sans Bold Oblique, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0488 uni0488 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0489 uni0489 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+048a uni048A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+048b uni048B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+048c uni048C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+048d uni048D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+048e uni048E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+048f uni048F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0490 uni0490 1.15 +U+0491 uni0491 1.15 +U+0492 uni0492 1.14 +U+0493 uni0493 1.14 +U+0494 uni0494 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0495 uni0495 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+0496 uni0496 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0497 uni0497 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.15 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0498 uni0498 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+0499 uni0499 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+049a uni049A 1.14 +U+049b uni049B 1.14 +U+049c uni049C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+049d uni049D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+049e uni049E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+049f uni049F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04a0 uni04A0 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+04a1 uni04A1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+04a2 uni04A2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04a3 uni04A3 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04a4 uni04A4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04a5 uni04A5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04a6 uni04A6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04a7 uni04A7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04a8 uni04A8 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04a9 uni04A9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04aa uni04AA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04ab uni04AB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04ac uni04AC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04ad uni04AD 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04ae uni04AE 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04af uni04AF 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04b0 uni04B0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04b1 uni04B1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+04b2 uni04B2 1.14 +U+04b3 uni04B3 1.14 +U+04b4 uni04B4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04b5 uni04B5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04b6 uni04B6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04b7 uni04B7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04b8 uni04B8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04b9 uni04B9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04ba uni04BA 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04bb uni04BB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04bc uni04BC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04bd uni04BD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04be uni04BE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04bf uni04BF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04c0 uni04C0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04c1 uni04C1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04c2 uni04C2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04c3 uni04C3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+04c4 uni04C4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+04c5 uni04C5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04c6 uni04C6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04c7 uni04C7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+04c8 uni04C8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+04c9 uni04C9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04ca uni04CA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04cb uni04CB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04cc uni04CC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04cd uni04CD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04ce uni04CE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04cf uni04CF 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04d0 uni04D0 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04d1 uni04D1 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04d2 uni04D2 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04d3 uni04D3 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04d4 uni04D4 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04d5 uni04D5 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04d6 uni04D6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04d7 uni04D7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04d8 uni04D8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04d9 uni04D9 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04da uni04DA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04db uni04DB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04dc uni04DC 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04dd uni04DD 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04de uni04DE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04df uni04DF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04e0 uni04E0 2.3 +U+04e1 uni04E1 2.3 +U+04e2 uni04E2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04e3 uni04E3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04e4 uni04E4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04e5 uni04E5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04e6 uni04E6 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04e7 uni04E7 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04e8 uni04E8 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+04e9 uni04E9 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+04ea uni04EA 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+04eb uni04EB 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+04ec uni04EC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04ed uni04ED 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04ee uni04EE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04ef uni04EF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04f0 uni04F0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04f1 uni04F1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04f2 uni04F2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04f3 uni04F3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04f4 uni04F4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04f5 uni04F5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04f6 uni04F6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04f7 uni04F7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04f8 uni04F8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+04f9 uni04F9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+04fa uni04FA 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04fb uni04FB 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04fc uni04FC 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04fd uni04FD 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+04fe uni04FE 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+04ff uni04FF 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+0500 uni0500 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+0501 uni0501 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+0502 uni0502 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0503 uni0503 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0504 uni0504 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0505 uni0505 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0506 uni0506 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0507 uni0507 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0508 uni0508 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0509 uni0509 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+050a uni050A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+050b uni050B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+050c uni050C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+050d uni050D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+050e uni050E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+050f uni050F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0510 uni0510 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0511 uni0511 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0512 uni0512 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0513 uni0513 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0514 uni0514 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0515 uni0515 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0516 uni0516 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0517 uni0517 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0518 uni0518 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0519 uni0519 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+051a uni051A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+051b uni051B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+051c uni051C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+051d uni051D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+0520 uni0520 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0521 uni0521 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0522 uni0522 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0523 uni0523 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0524 uni0524 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0525 uni0525 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0531 uni0531 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0532 uni0532 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0533 uni0533 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0534 uni0534 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0535 uni0535 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0536 uni0536 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0537 uni0537 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0538 uni0538 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0539 uni0539 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+053a uni053A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+053b uni053B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+053c uni053C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+053d uni053D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+053e uni053E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+053f uni053F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0540 uni0540 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0541 uni0541 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0542 uni0542 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0543 uni0543 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0544 uni0544 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0545 uni0545 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0546 uni0546 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0547 uni0547 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0548 uni0548 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+0549 uni0549 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+054a uni054A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+054b uni054B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+054c uni054C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+054d uni054D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+054e uni054E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+054f uni054F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+0550 uni0550 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+0551 uni0551 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0552 uni0552 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0553 uni0553 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+0554 uni0554 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0555 uni0555 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+0556 uni0556 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0559 uni0559 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+055a uni055A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+055b uni055B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+055c uni055C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+055d uni055D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+055e uni055E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+055f uni055F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0561 uni0561 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+0562 uni0562 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+0563 uni0563 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+0564 uni0564 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+0565 uni0565 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+0566 uni0566 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+0567 uni0567 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0568 uni0568 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+0569 uni0569 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+056a uni056A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+056b uni056B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+056c uni056C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+056d uni056D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+056e uni056E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+056f uni056F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+0570 uni0570 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+0571 uni0571 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0572 uni0572 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+0573 uni0573 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0574 uni0574 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0575 uni0575 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+0576 uni0576 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0577 uni0577 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0578 uni0578 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+0579 uni0579 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+057a uni057A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+057b uni057B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+057c uni057C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+057d uni057D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+057e uni057E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+057f uni057F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+0580 uni0580 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+0581 uni0581 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+0582 uni0582 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+0583 uni0583 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+0584 uni0584 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0585 uni0585 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+0586 uni0586 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0587 uni0587 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+0589 uni0589 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) +U+058a uni058A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b0 uni05B0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b1 uni05B1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b2 uni05B2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b3 uni05B3 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b4 uni05B4 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b5 uni05B5 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b6 uni05B6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b7 uni05B7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b8 uni05B8 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05b9 uni05B9 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05ba uni05BA 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+05bb uni05BB 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05bc uni05BC 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05bd uni05BD 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05be uni05BE 2.9 (Sans Condensed Oblique, Sans Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique) +U+05bf uni05BF 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05c0 uni05C0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05c1 uni05C1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05c2 uni05C2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05c3 uni05C3 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05c6 uni05C6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05c7 uni05C7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d0 uni05D0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d1 uni05D1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d2 uni05D2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d3 uni05D3 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d4 uni05D4 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d5 uni05D5 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d6 uni05D6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d7 uni05D7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d8 uni05D8 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05d9 uni05D9 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05da uni05DA 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05db uni05DB 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05dc uni05DC 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05dd uni05DD 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05de uni05DE 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05df uni05DF 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e0 uni05E0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e1 uni05E1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e2 uni05E2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e3 uni05E3 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e4 uni05E4 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e5 uni05E5 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e6 uni05E6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e7 uni05E7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e8 uni05E8 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05e9 uni05E9 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05ea uni05EA 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05f0 uni05F0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05f1 uni05F1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05f2 uni05F2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+05f3 uni05F3 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+05f4 uni05F4 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0606 uni0606 2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0607 uni0607 2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+0609 uni0609 2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+060a uni060A 2.26 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold) +U+060c uni060C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0615 uni0615 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+061b uni061B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+061f uni061F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0621 uni0621 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0622 uni0622 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0623 uni0623 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0624 uni0624 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0625 uni0625 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0626 uni0626 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0627 uni0627 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0628 uni0628 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0629 uni0629 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+062a uni062A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+062b uni062B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+062c uni062C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+062d uni062D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+062e uni062E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+062f uni062F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0630 uni0630 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0631 uni0631 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0632 uni0632 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0633 uni0633 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0634 uni0634 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0635 uni0635 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0636 uni0636 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0637 uni0637 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0638 uni0638 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0639 uni0639 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+063a uni063A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0640 uni0640 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0641 uni0641 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0642 uni0642 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0643 uni0643 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0644 uni0644 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0645 uni0645 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0646 uni0646 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0647 uni0647 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0648 uni0648 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0649 uni0649 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+064a uni064A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+064b uni064B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+064c uni064C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+064d uni064D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+064e uni064E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+064f uni064F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0650 uni0650 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0651 uni0651 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0652 uni0652 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0653 uni0653 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0654 uni0654 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0655 uni0655 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+065a uni065A 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0660 uni0660 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0661 uni0661 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0662 uni0662 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0663 uni0663 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0664 uni0664 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0665 uni0665 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0666 uni0666 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0667 uni0667 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0668 uni0668 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0669 uni0669 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+066a uni066A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+066b uni066B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+066c uni066C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+066d uni066D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+066e uni066E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+066f uni066F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0674 uni0674 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans ExtraLight) 2.16 (Sans Mono, Sans Mono Bold) +U+0679 uni0679 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+067a uni067A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+067b uni067B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+067c uni067C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+067d uni067D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+067e uni067E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+067f uni067F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0680 uni0680 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0681 uni0681 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0682 uni0682 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0683 uni0683 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0684 uni0684 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0685 uni0685 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0686 uni0686 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0687 uni0687 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0691 uni0691 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0692 uni0692 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+0695 uni0695 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0698 uni0698 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06a1 uni06A1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06a4 uni06A4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06a6 uni06A6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06a9 uni06A9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06af uni06AF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06b5 uni06B5 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06ba uni06BA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06be uni06BE 2.16 (Sans Mono, Sans Mono Bold) +U+06bf uni06BF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+06c6 uni06C6 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06cc uni06CC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06ce uni06CE 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06d5 uni06D5 2.10 (Sans, Sans Bold) 2.11 (Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06f0 uni06F0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06f1 uni06F1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06f2 uni06F2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06f3 uni06F3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06f4 uni06F4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06f5 uni06F5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06f6 uni06F6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06f7 uni06F7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06f8 uni06F8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+06f9 uni06F9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+07c0 uni07C0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07c1 uni07C1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07c2 uni07C2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07c3 uni07C3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07c4 uni07C4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07c5 uni07C5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07c6 uni07C6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07c7 uni07C7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07c8 uni07C8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07c9 uni07C9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07ca uni07CA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07cb uni07CB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07cc uni07CC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07cd uni07CD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07ce uni07CE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07cf uni07CF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07d0 uni07D0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07d1 uni07D1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07d2 uni07D2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07d3 uni07D3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07d4 uni07D4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07d5 uni07D5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07d6 uni07D6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07d7 uni07D7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07d8 uni07D8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07d9 uni07D9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07da uni07DA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07db uni07DB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07dc uni07DC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07dd uni07DD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07de uni07DE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07df uni07DF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07e0 uni07E0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07e1 uni07E1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07e2 uni07E2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07e3 uni07E3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07e4 uni07E4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07e5 uni07E5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07e6 uni07E6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07e7 uni07E7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07eb uni07EB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07ec uni07EC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07ed uni07ED 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07ee uni07EE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07ef uni07EF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07f0 uni07F0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07f1 uni07F1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07f2 uni07F2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07f3 uni07F3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07f4 uni07F4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07f5 uni07F5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07f8 uni07F8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07f9 uni07F9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+07fa uni07FA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+0e3f uni0E3F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0e81 uni0E81 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e82 uni0E82 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e84 uni0E84 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e87 uni0E87 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e88 uni0E88 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e8a uni0E8A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e8d uni0E8D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e94 uni0E94 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e95 uni0E95 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e96 uni0E96 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e97 uni0E97 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e99 uni0E99 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e9a uni0E9A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e9b uni0E9B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e9c uni0E9C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e9d uni0E9D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e9e uni0E9E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0e9f uni0E9F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0ea1 uni0EA1 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0ea2 uni0EA2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0ea3 uni0EA3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0ea5 uni0EA5 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0ea7 uni0EA7 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0eaa uni0EAA 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0eab uni0EAB 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0ead uni0EAD 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0eae uni0EAE 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0eaf uni0EAF 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0eb0 uni0EB0 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0eb1 uni0EB1 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0eb2 uni0EB2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0eb3 uni0EB3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0eb4 uni0EB4 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0eb5 uni0EB5 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0eb6 uni0EB6 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0eb7 uni0EB7 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0eb8 uni0EB8 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0eb9 uni0EB9 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0ebb uni0EBB 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0ebc uni0EBC 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0ebd uni0EBD 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ec0 uni0EC0 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ec1 uni0EC1 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ec2 uni0EC2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ec3 uni0EC3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ec4 uni0EC4 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ec6 uni0EC6 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ec8 uni0EC8 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0ec9 uni0EC9 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0eca uni0ECA 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0ecb uni0ECB 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0ecc uni0ECC 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0ecd uni0ECD 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+0ed0 uni0ED0 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ed1 uni0ED1 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ed2 uni0ED2 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ed3 uni0ED3 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ed4 uni0ED4 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ed5 uni0ED5 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ed6 uni0ED6 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ed7 uni0ED7 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0ed8 uni0ED8 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+0ed9 uni0ED9 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0edc uni0EDC 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+0edd uni0EDD 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+10a0 uni10A0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10a1 uni10A1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10a2 uni10A2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10a3 uni10A3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10a4 uni10A4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10a5 uni10A5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10a6 uni10A6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10a7 uni10A7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10a8 uni10A8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10a9 uni10A9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10aa uni10AA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10ab uni10AB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10ac uni10AC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10ad uni10AD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10ae uni10AE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10af uni10AF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10b0 uni10B0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10b1 uni10B1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10b2 uni10B2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10b3 uni10B3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10b4 uni10B4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10b5 uni10B5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10b6 uni10B6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10b7 uni10B7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10b8 uni10B8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10b9 uni10B9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10ba uni10BA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10bb uni10BB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10bc uni10BC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10bd uni10BD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10be uni10BE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10bf uni10BF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10c0 uni10C0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10c1 uni10C1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10c2 uni10C2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10c3 uni10C3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10c4 uni10C4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10c5 uni10C5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10d0 uni10D0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10d1 uni10D1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10d2 uni10D2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10d3 uni10D3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10d4 uni10D4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10d5 uni10D5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10d6 uni10D6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10d7 uni10D7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10d8 uni10D8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10d9 uni10D9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10da uni10DA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10db uni10DB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10dc uni10DC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10dd uni10DD 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10de uni10DE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10df uni10DF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10e0 uni10E0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10e1 uni10E1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10e2 uni10E2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10e3 uni10E3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10e4 uni10E4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10e5 uni10E5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10e6 uni10E6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10e7 uni10E7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10e8 uni10E8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10e9 uni10E9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10ea uni10EA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10eb uni10EB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10ec uni10EC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10ed uni10ED 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10ee uni10EE 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10ef uni10EF 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10f0 uni10F0 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10f1 uni10F1 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10f2 uni10F2 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10f3 uni10F3 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10f4 uni10F4 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10f5 uni10F5 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10f6 uni10F6 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10f7 uni10F7 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10f8 uni10F8 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10f9 uni10F9 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10fa uni10FA 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10fb uni10FB 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+10fc uni10FC 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Mono, Sans Mono Bold, Serif, Serif Bold, Serif Condensed, Serif Condensed Bold) 2.20 (Sans Bold Oblique, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+1401 uni1401 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1402 uni1402 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1403 uni1403 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1404 uni1404 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1405 uni1405 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1406 uni1406 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1407 uni1407 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1409 uni1409 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+140a uni140A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+140b uni140B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+140c uni140C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+140d uni140D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+140e uni140E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+140f uni140F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1410 uni1410 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1411 uni1411 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1412 uni1412 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1413 uni1413 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1414 uni1414 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1415 uni1415 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1416 uni1416 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1417 uni1417 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1418 uni1418 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1419 uni1419 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+141a uni141A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+141b uni141B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+141d uni141D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+141e uni141E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+141f uni141F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1420 uni1420 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1421 uni1421 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1422 uni1422 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1423 uni1423 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1424 uni1424 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1425 uni1425 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1426 uni1426 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1427 uni1427 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1428 uni1428 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1429 uni1429 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+142a uni142A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+142b uni142B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+142c uni142C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+142d uni142D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+142e uni142E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+142f uni142F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1430 uni1430 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1431 uni1431 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1432 uni1432 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1433 uni1433 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1434 uni1434 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1435 uni1435 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1437 uni1437 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1438 uni1438 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1439 uni1439 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+143a uni143A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+143b uni143B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+143c uni143C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+143d uni143D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+143e uni143E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+143f uni143F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1440 uni1440 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1441 uni1441 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1442 uni1442 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1443 uni1443 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1444 uni1444 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1445 uni1445 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1446 uni1446 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1447 uni1447 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1448 uni1448 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1449 uni1449 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+144a uni144A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+144c uni144C 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+144d uni144D 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+144e uni144E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+144f uni144F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1450 uni1450 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1451 uni1451 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1452 uni1452 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1454 uni1454 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1455 uni1455 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1456 uni1456 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1457 uni1457 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1458 uni1458 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1459 uni1459 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+145a uni145A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+145b uni145B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+145c uni145C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+145d uni145D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+145e uni145E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+145f uni145F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1460 uni1460 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1461 uni1461 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1462 uni1462 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1463 uni1463 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1464 uni1464 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1465 uni1465 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1466 uni1466 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1467 uni1467 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1468 uni1468 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1469 uni1469 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+146a uni146A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+146b uni146B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+146c uni146C 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+146d uni146D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+146e uni146E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+146f uni146F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1470 uni1470 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1471 uni1471 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1472 uni1472 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1473 uni1473 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1474 uni1474 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1475 uni1475 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1476 uni1476 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1477 uni1477 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1478 uni1478 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1479 uni1479 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+147a uni147A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+147b uni147B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+147c uni147C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+147d uni147D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+147e uni147E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+147f uni147F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1480 uni1480 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1481 uni1481 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1482 uni1482 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1483 uni1483 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1484 uni1484 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1485 uni1485 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1486 uni1486 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1487 uni1487 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1488 uni1488 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1489 uni1489 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+148a uni148A 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+148b uni148B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+148c uni148C 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+148d uni148D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+148e uni148E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+148f uni148F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1490 uni1490 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1491 uni1491 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1492 uni1492 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1493 uni1493 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1494 uni1494 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1495 uni1495 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1496 uni1496 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1497 uni1497 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1498 uni1498 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1499 uni1499 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+149a uni149A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+149b uni149B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+149c uni149C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+149d uni149D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+149e uni149E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+149f uni149F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a0 uni14A0 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a1 uni14A1 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a2 uni14A2 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a3 uni14A3 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a4 uni14A4 2.13 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.15 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+14a5 uni14A5 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a6 uni14A6 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a7 uni14A7 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a8 uni14A8 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14a9 uni14A9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14aa uni14AA 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ab uni14AB 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ac uni14AC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ad uni14AD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ae uni14AE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14af uni14AF 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b0 uni14B0 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b1 uni14B1 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b2 uni14B2 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b3 uni14B3 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b4 uni14B4 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b5 uni14B5 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b6 uni14B6 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b7 uni14B7 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b8 uni14B8 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14b9 uni14B9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ba uni14BA 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14bb uni14BB 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14bc uni14BC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14bd uni14BD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c0 uni14C0 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c1 uni14C1 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c2 uni14C2 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c3 uni14C3 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c4 uni14C4 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c5 uni14C5 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c6 uni14C6 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c7 uni14C7 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c8 uni14C8 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14c9 uni14C9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ca uni14CA 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14cb uni14CB 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14cc uni14CC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14cd uni14CD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ce uni14CE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14cf uni14CF 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d0 uni14D0 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d1 uni14D1 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d2 uni14D2 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d3 uni14D3 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d4 uni14D4 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d5 uni14D5 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d6 uni14D6 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d7 uni14D7 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d8 uni14D8 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14d9 uni14D9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14da uni14DA 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14db uni14DB 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14dc uni14DC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14dd uni14DD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14de uni14DE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14df uni14DF 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e0 uni14E0 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e1 uni14E1 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e2 uni14E2 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e3 uni14E3 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e4 uni14E4 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e5 uni14E5 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e6 uni14E6 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e7 uni14E7 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e8 uni14E8 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14e9 uni14E9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ea uni14EA 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ec uni14EC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ed uni14ED 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ee uni14EE 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ef uni14EF 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f0 uni14F0 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f1 uni14F1 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f2 uni14F2 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f3 uni14F3 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f4 uni14F4 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f5 uni14F5 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f6 uni14F6 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f7 uni14F7 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f8 uni14F8 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14f9 uni14F9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14fa uni14FA 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14fb uni14FB 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14fc uni14FC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14fd uni14FD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14fe uni14FE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+14ff uni14FF 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1500 uni1500 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1501 uni1501 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1502 uni1502 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1503 uni1503 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1504 uni1504 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1505 uni1505 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1506 uni1506 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1507 uni1507 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1510 uni1510 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1511 uni1511 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1512 uni1512 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1513 uni1513 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1514 uni1514 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1515 uni1515 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1516 uni1516 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1517 uni1517 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1518 uni1518 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1519 uni1519 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+151a uni151A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+151b uni151B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+151c uni151C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+151d uni151D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+151e uni151E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+151f uni151F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1520 uni1520 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1521 uni1521 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1522 uni1522 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1523 uni1523 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1524 uni1524 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1525 uni1525 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1526 uni1526 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1527 uni1527 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1528 uni1528 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1529 uni1529 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+152a uni152A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+152b uni152B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+152c uni152C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+152d uni152D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+152e uni152E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+152f uni152F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1530 uni1530 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1531 uni1531 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1532 uni1532 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1533 uni1533 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1534 uni1534 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1535 uni1535 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1536 uni1536 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1537 uni1537 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1538 uni1538 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1539 uni1539 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+153a uni153A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+153b uni153B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+153c uni153C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+153d uni153D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+153e uni153E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1540 uni1540 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1541 uni1541 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1542 uni1542 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1543 uni1543 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1544 uni1544 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1545 uni1545 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1546 uni1546 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1547 uni1547 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1548 uni1548 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1549 uni1549 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+154a uni154A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+154b uni154B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+154c uni154C 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+154d uni154D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+154e uni154E 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+154f uni154F 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1550 uni1550 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1552 uni1552 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1553 uni1553 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1554 uni1554 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1555 uni1555 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1556 uni1556 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1557 uni1557 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1558 uni1558 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1559 uni1559 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+155a uni155A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+155b uni155B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+155c uni155C 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+155d uni155D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+155e uni155E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+155f uni155F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1560 uni1560 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1561 uni1561 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1562 uni1562 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1563 uni1563 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1564 uni1564 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1565 uni1565 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1566 uni1566 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1567 uni1567 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1568 uni1568 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1569 uni1569 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+156a uni156A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1574 uni1574 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1575 uni1575 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1576 uni1576 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1577 uni1577 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1578 uni1578 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1579 uni1579 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+157a uni157A 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+157b uni157B 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+157c uni157C 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+157d uni157D 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+157e uni157E 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+157f uni157F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1580 uni1580 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1581 uni1581 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1582 uni1582 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1583 uni1583 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1584 uni1584 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1585 uni1585 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+158a uni158A 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+158b uni158B 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+158c uni158C 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+158d uni158D 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+158e uni158E 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+158f uni158F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1590 uni1590 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1591 uni1591 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1592 uni1592 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1593 uni1593 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1594 uni1594 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1595 uni1595 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1596 uni1596 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a0 uni15A0 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a1 uni15A1 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a2 uni15A2 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a3 uni15A3 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a4 uni15A4 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a5 uni15A5 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a6 uni15A6 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a7 uni15A7 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a8 uni15A8 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15a9 uni15A9 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15aa uni15AA 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15ab uni15AB 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15ac uni15AC 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15ad uni15AD 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15ae uni15AE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15af uni15AF 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15de uni15DE 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+15e1 uni15E1 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1646 uni1646 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1647 uni1647 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+166e uni166E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+166f uni166F 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1670 uni1670 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1671 uni1671 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1672 uni1672 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1673 uni1673 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1674 uni1674 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1675 uni1675 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1676 uni1676 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1680 uni1680 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1681 uni1681 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1682 uni1682 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1683 uni1683 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1684 uni1684 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1685 uni1685 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1686 uni1686 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1687 uni1687 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1688 uni1688 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1689 uni1689 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+168a uni168A 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+168b uni168B 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+168c uni168C 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+168d uni168D 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+168e uni168E 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+168f uni168F 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1690 uni1690 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1691 uni1691 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1692 uni1692 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1693 uni1693 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1694 uni1694 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1695 uni1695 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1696 uni1696 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1697 uni1697 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1698 uni1698 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1699 uni1699 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+169a uni169A 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+169b uni169B 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+169c uni169C 2.22 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.28 (Sans ExtraLight) +U+1d00 uni1D00 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d01 uni1D01 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d02 uni1D02 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1d03 uni1D03 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d04 uni1D04 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d05 uni1D05 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d06 uni1D06 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d07 uni1D07 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d08 uni1D08 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+1d09 uni1D09 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1d0a uni1D0A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d0b uni1D0B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d0c uni1D0C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d0d uni1D0D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d0e uni1D0E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d0f uni1D0F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d10 uni1D10 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d11 uni1D11 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d12 uni1D12 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d13 uni1D13 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d14 uni1D14 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1d16 uni1D16 2.3 +U+1d17 uni1D17 2.3 +U+1d18 uni1D18 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d19 uni1D19 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+1d1a uni1D1A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+1d1b uni1D1B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d1c uni1D1C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d1d uni1D1D 2.3 +U+1d1e uni1D1E 2.3 +U+1d1f uni1D1F 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+1d20 uni1D20 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d21 uni1D21 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d22 uni1D22 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d23 uni1D23 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d26 uni1D26 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d27 uni1D27 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d28 uni1D28 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+1d29 uni1D29 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d2a uni1D2A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d2b uni1D2B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans ExtraLight) +U+1d2c uni1D2C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d2d uni1D2D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d2e uni1D2E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d30 uni1D30 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d31 uni1D31 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d32 uni1D32 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d33 uni1D33 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d34 uni1D34 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d35 uni1D35 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d36 uni1D36 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d37 uni1D37 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d38 uni1D38 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d39 uni1D39 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d3a uni1D3A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d3b uni1D3B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d3c uni1D3C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d3d uni1D3D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono Oblique) +U+1d3e uni1D3E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d3f uni1D3F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d40 uni1D40 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d41 uni1D41 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d42 uni1D42 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d43 uni1D43 2.3 +U+1d44 uni1D44 2.3 +U+1d45 uni1D45 2.3 +U+1d46 uni1D46 2.3 +U+1d47 uni1D47 2.3 +U+1d48 uni1D48 2.3 +U+1d49 uni1D49 2.3 +U+1d4a uni1D4A 2.3 +U+1d4b uni1D4B 2.3 +U+1d4c uni1D4C 2.3 +U+1d4d uni1D4D 2.3 +U+1d4e uni1D4E 2.3 +U+1d4f uni1D4F 2.3 +U+1d50 uni1D50 2.3 +U+1d51 uni1D51 2.3 +U+1d52 uni1D52 2.3 +U+1d53 uni1D53 2.3 +U+1d54 uni1D54 2.3 +U+1d55 uni1D55 2.3 +U+1d56 uni1D56 2.3 +U+1d57 uni1D57 2.3 +U+1d58 uni1D58 2.3 +U+1d59 uni1D59 2.3 +U+1d5a uni1D5A 2.3 +U+1d5b uni1D5B 2.3 +U+1d5d uni1D5D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d5e uni1D5E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d5f uni1D5F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d60 uni1D60 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d61 uni1D61 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d62 uni1D62 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d63 uni1D63 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d64 uni1D64 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d65 uni1D65 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d66 uni1D66 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d67 uni1D67 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d68 uni1D68 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d69 uni1D69 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d6a uni1D6A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1d77 uni1D77 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1d78 uni1D78 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1d7b uni1D7B 2.3 +U+1d85 uni1D85 2.3 +U+1d9b uni1D9B 2.3 +U+1d9c uni1D9C 2.3 +U+1d9d uni1D9D 2.3 +U+1d9e uni1D9E 2.3 +U+1d9f uni1D9F 2.3 +U+1da0 uni1DA0 2.3 +U+1da1 uni1DA1 2.3 +U+1da2 uni1DA2 2.3 +U+1da3 uni1DA3 2.3 +U+1da4 uni1DA4 2.3 +U+1da5 uni1DA5 2.3 +U+1da6 uni1DA6 2.3 +U+1da7 uni1DA7 2.3 +U+1da8 uni1DA8 2.3 +U+1da9 uni1DA9 2.3 +U+1daa uni1DAA 2.3 +U+1dab uni1DAB 2.3 +U+1dac uni1DAC 2.3 +U+1dad uni1DAD 2.3 +U+1dae uni1DAE 2.3 +U+1daf uni1DAF 2.3 +U+1db0 uni1DB0 2.3 +U+1db1 uni1DB1 2.3 +U+1db2 uni1DB2 2.3 +U+1db3 uni1DB3 2.3 +U+1db4 uni1DB4 2.3 +U+1db5 uni1DB5 2.3 +U+1db6 uni1DB6 2.3 +U+1db7 uni1DB7 2.3 +U+1db8 uni1DB8 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+1db9 uni1DB9 2.3 +U+1dba uni1DBA 2.3 +U+1dbb uni1DBB 2.3 +U+1dbc uni1DBC 2.3 +U+1dbd uni1DBD 2.3 +U+1dbe uni1DBE 2.3 +U+1dbf uni1DBF 2.3 +U+1dc4 uni1DC4 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1dc5 uni1DC5 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1dc6 uni1DC6 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1dc7 uni1DC7 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1dc8 uni1DC8 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1dc9 uni1DC9 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e00 uni1E00 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e01 uni1E01 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e02 uni1E02 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e03 uni1E03 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e04 uni1E04 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e05 uni1E05 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e06 uni1E06 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e07 uni1E07 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e08 uni1E08 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e09 uni1E09 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e0a uni1E0A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e0b uni1E0B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e0c uni1E0C 2.1 +U+1e0d uni1E0D 2.1 +U+1e0e uni1E0E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e0f uni1E0F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e10 uni1E10 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e11 uni1E11 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e12 uni1E12 1.13 +U+1e13 uni1E13 1.13 +U+1e14 uni1E14 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1e15 uni1E15 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1e16 uni1E16 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1e17 uni1E17 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1e18 uni1E18 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e19 uni1E19 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e1a uni1E1A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e1b uni1E1B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e1c uni1E1C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1e1d uni1E1D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+1e1e uni1E1E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e1f uni1E1F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e20 uni1E20 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e21 uni1E21 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e22 uni1E22 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e23 uni1E23 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e24 uni1E24 2.1 +U+1e25 uni1E25 2.1 +U+1e26 uni1E26 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e27 uni1E27 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e28 uni1E28 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e29 uni1E29 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e2a uni1E2A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e2b uni1E2B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e2c uni1E2C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e2d uni1E2D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e2e uni1E2E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1e2f uni1E2F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1e30 uni1E30 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e31 uni1E31 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e32 uni1E32 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e33 uni1E33 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e34 uni1E34 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e35 uni1E35 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e36 uni1E36 2.1 +U+1e37 uni1E37 2.1 +U+1e38 uni1E38 2.1 +U+1e39 uni1E39 2.1 +U+1e3a uni1E3A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e3b uni1E3B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e3c uni1E3C 1.13 +U+1e3d uni1E3D 1.13 +U+1e3e uni1E3E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e3f uni1E3F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e40 uni1E40 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e41 uni1E41 2.1 +U+1e42 uni1E42 2.1 +U+1e43 uni1E43 2.1 +U+1e44 uni1E44 1.13 +U+1e45 uni1E45 1.13 +U+1e46 uni1E46 2.1 +U+1e47 uni1E47 2.1 +U+1e48 uni1E48 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e49 uni1E49 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e4a uni1E4A 1.13 +U+1e4b uni1E4B 1.13 +U+1e4c uni1E4C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e4d uni1E4D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e4e uni1E4E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1e4f uni1E4F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1e50 uni1E50 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1e51 uni1E51 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1e52 uni1E52 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1e53 uni1E53 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1e54 uni1E54 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e55 uni1E55 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e56 uni1E56 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e57 uni1E57 2.1 +U+1e58 uni1E58 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e59 uni1E59 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e5a uni1E5A 2.1 +U+1e5b uni1E5B 2.1 +U+1e5c uni1E5C 2.1 +U+1e5d uni1E5D 2.1 +U+1e5e uni1E5E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e5f uni1E5F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e60 uni1E60 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e61 uni1E61 2.1 +U+1e62 uni1E62 2.1 +U+1e63 uni1E63 2.1 +U+1e64 uni1E64 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1e65 uni1E65 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+1e66 uni1E66 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1e67 uni1E67 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1e68 uni1E68 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e69 uni1E69 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e6a uni1E6A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e6b uni1E6B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e6c uni1E6C 2.1 +U+1e6d uni1E6D 2.1 +U+1e6e uni1E6E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e6f uni1E6F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e70 uni1E70 1.13 +U+1e71 uni1E71 1.13 +U+1e72 uni1E72 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e73 uni1E73 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e74 uni1E74 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e75 uni1E75 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e76 uni1E76 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e77 uni1E77 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e78 uni1E78 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e79 uni1E79 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e7a uni1E7A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1e7b uni1E7B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1e7c uni1E7C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e7d uni1E7D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e7e uni1E7E 2.1 +U+1e7f uni1E7F 2.1 +U+1e80 Wgrave 1.2 +U+1e81 wgrave 1.2 +U+1e82 Wacute 1.2 +U+1e83 wacute 1.2 +U+1e84 Wdieresis 1.2 +U+1e85 wdieresis 1.2 +U+1e86 uni1E86 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e87 uni1E87 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e88 uni1E88 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e89 uni1E89 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e8a uni1E8A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e8b uni1E8B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e8c uni1E8C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e8d uni1E8D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e8e uni1E8E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e8f uni1E8F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e90 uni1E90 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e91 uni1E91 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e92 uni1E92 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e93 uni1E93 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e94 uni1E94 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e95 uni1E95 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e96 uni1E96 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e97 uni1E97 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e98 uni1E98 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e99 uni1E99 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1e9a uni1E9A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1e9b uni1E9B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1e9e uni1E9E 2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1e9f uni1E9F 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+1ea0 uni1EA0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1ea1 uni1EA1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1ea2 uni1EA2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ea3 uni1EA3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ea4 uni1EA4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ea5 uni1EA5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ea6 uni1EA6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ea7 uni1EA7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ea8 uni1EA8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ea9 uni1EA9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1eaa uni1EAA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1eab uni1EAB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1eac uni1EAC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ead uni1EAD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1eae uni1EAE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1eaf uni1EAF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1eb0 uni1EB0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1eb1 uni1EB1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.22 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1eb2 uni1EB2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1eb3 uni1EB3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1eb4 uni1EB4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1eb5 uni1EB5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1eb6 uni1EB6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1eb7 uni1EB7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1eb8 uni1EB8 2.2 +U+1eb9 uni1EB9 2.2 +U+1eba uni1EBA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ebb uni1EBB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ebc uni1EBC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1ebd uni1EBD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1ebe uni1EBE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ebf uni1EBF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ec0 uni1EC0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ec1 uni1EC1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ec2 uni1EC2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ec3 uni1EC3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ec4 uni1EC4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ec5 uni1EC5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ec6 uni1EC6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ec7 uni1EC7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ec8 uni1EC8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ec9 uni1EC9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1eca uni1ECA 2.2 +U+1ecb uni1ECB 2.2 +U+1ecc uni1ECC 2.2 +U+1ecd uni1ECD 2.2 +U+1ece uni1ECE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ecf uni1ECF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ed0 uni1ED0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ed1 uni1ED1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ed2 uni1ED2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ed3 uni1ED3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ed4 uni1ED4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ed5 uni1ED5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ed6 uni1ED6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ed7 uni1ED7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ed8 uni1ED8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ed9 uni1ED9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1eda uni1EDA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1edb uni1EDB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1edc uni1EDC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1edd uni1EDD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ede uni1EDE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1edf uni1EDF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1ee0 uni1EE0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ee1 uni1EE1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ee2 uni1EE2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ee3 uni1EE3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ee4 uni1EE4 2.2 +U+1ee5 uni1EE5 2.2 +U+1ee6 uni1EE6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ee7 uni1EE7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ee8 uni1EE8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ee9 uni1EE9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1eea uni1EEA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1eeb uni1EEB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1eec uni1EEC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1eed uni1EED 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+1eee uni1EEE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1eef uni1EEF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ef0 uni1EF0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ef1 uni1EF1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+1ef2 Ygrave 1.2 +U+1ef3 ygrave 1.2 +U+1ef4 uni1EF4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1ef5 uni1EF5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1ef6 uni1EF6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ef7 uni1EF7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ef8 uni1EF8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1ef9 uni1EF9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1f00 uni1F00 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f01 uni1F01 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f02 uni1F02 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f03 uni1F03 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f04 uni1F04 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f05 uni1F05 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f06 uni1F06 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f07 uni1F07 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f08 uni1F08 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f09 uni1F09 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f0a uni1F0A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f0b uni1F0B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f0c uni1F0C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f0d uni1F0D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f0e uni1F0E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f0f uni1F0F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f10 uni1F10 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f11 uni1F11 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f12 uni1F12 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f13 uni1F13 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f14 uni1F14 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f15 uni1F15 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f18 uni1F18 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f19 uni1F19 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f1a uni1F1A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f1b uni1F1B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f1c uni1F1C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f1d uni1F1D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f20 uni1F20 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f21 uni1F21 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f22 uni1F22 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f23 uni1F23 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f24 uni1F24 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f25 uni1F25 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f26 uni1F26 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f27 uni1F27 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f28 uni1F28 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f29 uni1F29 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f2a uni1F2A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f2b uni1F2B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f2c uni1F2C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f2d uni1F2D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f2e uni1F2E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f2f uni1F2F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f30 uni1F30 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f31 uni1F31 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f32 uni1F32 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f33 uni1F33 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f34 uni1F34 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f35 uni1F35 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f36 uni1F36 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f37 uni1F37 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f38 uni1F38 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f39 uni1F39 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f3a uni1F3A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f3b uni1F3B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f3c uni1F3C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f3d uni1F3D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f3e uni1F3E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f3f uni1F3F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f40 uni1F40 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f41 uni1F41 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f42 uni1F42 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f43 uni1F43 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f44 uni1F44 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f45 uni1F45 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f48 uni1F48 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f49 uni1F49 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f4a uni1F4A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f4b uni1F4B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f4c uni1F4C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f4d uni1F4D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f50 uni1F50 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f51 uni1F51 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f52 uni1F52 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f53 uni1F53 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f54 uni1F54 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f55 uni1F55 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f56 uni1F56 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f57 uni1F57 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f59 uni1F59 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f5b uni1F5B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f5d uni1F5D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f5f uni1F5F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f60 uni1F60 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f61 uni1F61 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f62 uni1F62 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f63 uni1F63 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f64 uni1F64 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f65 uni1F65 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f66 uni1F66 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f67 uni1F67 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f68 uni1F68 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f69 uni1F69 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f6a uni1F6A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f6b uni1F6B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f6c uni1F6C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f6d uni1F6D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f6e uni1F6E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f6f uni1F6F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f70 uni1F70 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1f71 uni1F71 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1f72 uni1F72 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1f73 uni1F73 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1f74 uni1F74 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1f75 uni1F75 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1f76 uni1F76 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f77 uni1F77 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f78 uni1F78 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1f79 uni1F79 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1f7a uni1F7A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f7b uni1F7B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f7c uni1F7C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f7d uni1F7D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f80 uni1F80 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f81 uni1F81 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f82 uni1F82 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f83 uni1F83 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f84 uni1F84 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f85 uni1F85 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f86 uni1F86 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f87 uni1F87 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f88 uni1F88 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f89 uni1F89 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f8a uni1F8A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f8b uni1F8B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f8c uni1F8C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f8d uni1F8D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f8e uni1F8E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f8f uni1F8F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f90 uni1F90 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f91 uni1F91 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f92 uni1F92 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f93 uni1F93 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f94 uni1F94 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f95 uni1F95 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f96 uni1F96 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f97 uni1F97 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f98 uni1F98 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f99 uni1F99 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f9a uni1F9A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f9b uni1F9B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f9c uni1F9C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f9d uni1F9D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f9e uni1F9E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1f9f uni1F9F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fa0 uni1FA0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fa1 uni1FA1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fa2 uni1FA2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fa3 uni1FA3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fa4 uni1FA4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fa5 uni1FA5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fa6 uni1FA6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fa7 uni1FA7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fa8 uni1FA8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fa9 uni1FA9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1faa uni1FAA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fab uni1FAB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fac uni1FAC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fad uni1FAD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fae uni1FAE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1faf uni1FAF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fb0 uni1FB0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fb1 uni1FB1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fb2 uni1FB2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fb3 uni1FB3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fb4 uni1FB4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fb6 uni1FB6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fb7 uni1FB7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fb8 uni1FB8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fb9 uni1FB9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fba uni1FBA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fbb uni1FBB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fbc uni1FBC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fbd uni1FBD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fbe uni1FBE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fbf uni1FBF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fc0 uni1FC0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fc1 uni1FC1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fc2 uni1FC2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fc3 uni1FC3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fc4 uni1FC4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fc6 uni1FC6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fc7 uni1FC7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fc8 uni1FC8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fc9 uni1FC9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fca uni1FCA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fcb uni1FCB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fcc uni1FCC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fcd uni1FCD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fce uni1FCE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fcf uni1FCF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fd0 uni1FD0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fd1 uni1FD1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fd2 uni1FD2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fd3 uni1FD3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fd6 uni1FD6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fd7 uni1FD7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fd8 uni1FD8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fd9 uni1FD9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fda uni1FDA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fdb uni1FDB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fdd uni1FDD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fde uni1FDE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fdf uni1FDF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fe0 uni1FE0 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fe1 uni1FE1 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fe2 uni1FE2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fe3 uni1FE3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fe4 uni1FE4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fe5 uni1FE5 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fe6 uni1FE6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fe7 uni1FE7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fe8 uni1FE8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fe9 uni1FE9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fea uni1FEA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1feb uni1FEB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fec uni1FEC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1fed uni1FED 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fee uni1FEE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1fef uni1FEF 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1ff2 uni1FF2 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ff3 uni1FF3 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ff4 uni1FF4 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ff6 uni1FF6 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ff7 uni1FF7 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ff8 uni1FF8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1ff9 uni1FF9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1ffa uni1FFA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ffb uni1FFB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.10 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ffc uni1FFC 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+1ffd uni1FFD 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+1ffe uni1FFE 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.5 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+2000 uni2000 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2001 uni2001 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2002 uni2002 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2003 uni2003 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2004 uni2004 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2005 uni2005 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2006 uni2006 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2007 uni2007 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2008 uni2008 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2009 uni2009 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+200a uni200A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+200b uni200B 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+200c uni200C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+200d uni200D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+200e uni200E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+200f uni200F 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.8 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2010 uni2010 1.5 +U+2011 uni2011 1.5 +U+2012 figuredash 1.5 +U+2013 endash original +U+2014 emdash original +U+2015 uni2015 1.5 +U+2016 uni2016 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2017 underscoredbl 2.3 +U+2018 quoteleft original +U+2019 quoteright original +U+201a quotesinglbase original +U+201b quotereversed 2.3 +U+201c quotedblleft original +U+201d quotedblright original +U+201e quotedblbase original +U+201f uni201F 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.3 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+2020 dagger original +U+2021 daggerdbl original +U+2022 bullet original +U+2023 uni2023 2.2 +U+2024 onedotenleader 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2025 twodotenleader 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2026 ellipsis original +U+2027 uni2027 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+202a uni202A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+202b uni202B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+202c uni202C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+202d uni202D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+202e uni202E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+202f uni202F 2.11 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.23 (Serif Italic Condensed) +U+2030 perthousand original +U+2031 uni2031 2.1 +U+2032 minute 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2033 second 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2034 uni2034 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2035 uni2035 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2036 uni2036 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2037 uni2037 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2038 uni2038 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2039 guilsinglleft original +U+203a guilsinglright original +U+203b uni203B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+203c exclamdbl 2.0 +U+203d uni203D 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.11 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.14 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+203e uni203E 2.3 +U+203f uni203F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2040 uni2040 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2041 uni2041 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2042 uni2042 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2043 uni2043 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2044 fraction 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2045 uni2045 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2046 uni2046 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2047 uni2047 2.0 +U+2048 uni2048 2.0 +U+2049 uni2049 2.0 +U+204a uni204A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+204b uni204B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+204c uni204C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+204d uni204D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+204e uni204E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+204f uni204F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2050 uni2050 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2051 uni2051 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2052 uni2052 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2053 uni2053 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2054 uni2054 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2055 uni2055 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2056 uni2056 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2057 uni2057 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2058 uni2058 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2059 uni2059 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+205a uni205A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+205b uni205B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+205c uni205C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+205d uni205D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+205e uni205E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+205f uni205F 2.14 +U+2060 uni2060 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2061 uni2061 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2062 uni2062 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2063 uni2063 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2064 uni2064 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+206a uni206A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+206b uni206B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+206c uni206C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+206d uni206D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+206e uni206E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+206f uni206F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2070 uni2070 2.2 +U+2071 uni2071 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2074 uni2074 2.2 +U+2075 uni2075 2.2 +U+2076 uni2076 2.2 +U+2077 uni2077 2.2 +U+2078 uni2078 2.2 +U+2079 uni2079 2.2 +U+207a uni207A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+207b uni207B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+207c uni207C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+207d uni207D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+207e uni207E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+207f uni207F 1.14 +U+2080 uni2080 2.4 +U+2081 uni2081 2.4 +U+2082 uni2082 2.4 +U+2083 uni2083 2.4 +U+2084 uni2084 2.4 +U+2085 uni2085 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2086 uni2086 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2087 uni2087 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2088 uni2088 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2089 uni2089 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+208a uni208A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+208b uni208B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+208c uni208C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+208d uni208D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+208e uni208E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2090 uni2090 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2091 uni2091 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2092 uni2092 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2093 uni2093 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2094 uni2094 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.17 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.18 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+20a0 uni20A0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20a1 colonmonetary 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20a2 uni20A2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20a3 franc 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20a4 lira 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20a5 uni20A5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20a6 uni20A6 2.3 +U+20a7 peseta 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20a8 uni20A8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20a9 uni20A9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20aa uni20AA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20ab dong 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20ac Euro original +U+20ad uni20AD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20ae uni20AE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20af uni20AF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20b0 uni20B0 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20b1 uni20B1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+20b2 uni20B2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20b3 uni20B3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+20b4 uni20B4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+20b5 uni20B5 2.2 +U+20d0 uni20D0 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+20d1 uni20D1 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+20d6 uni20D6 2.8 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20d7 uni20D7 2.8 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20db uni20DB 2.23 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20dc uni20DC 2.23 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+20e1 uni20E1 2.23 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2100 uni2100 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2101 uni2101 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2102 uni2102 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.16 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Condensed) +U+2103 uni2103 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2104 uni2104 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2105 uni2105 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2106 uni2106 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2107 uni2107 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2108 uni2108 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2109 uni2109 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+210b uni210B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+210c uni210C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+210d uni210D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+210e uni210E 2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.23 (Serif Italic Condensed) 2.26 (Sans ExtraLight) +U+210f uni210F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.28 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2110 uni2110 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2111 Ifraktur 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2112 uni2112 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2113 uni2113 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2114 uni2114 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2115 uni2115 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2116 uni2116 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2117 uni2117 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2118 weierstrass 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2119 uni2119 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+211a uni211A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+211b uni211B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+211c Rfraktur 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+211d uni211D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+211e prescription 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+211f uni211F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2120 uni2120 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2121 uni2121 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2122 trademark original +U+2123 uni2123 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2124 uni2124 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2125 uni2125 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2126 uni2126 2.2 +U+2127 uni2127 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2128 uni2128 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2129 uni2129 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+212a uni212A 2.2 +U+212b uni212B 2.2 +U+212c uni212C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+212d uni212D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+212e estimated 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+212f uni212F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2130 uni2130 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2131 uni2131 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2132 uni2132 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) +U+2133 uni2133 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2134 uni2134 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2135 aleph 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2136 uni2136 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2137 uni2137 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2138 uni2138 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2139 uni2139 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+213a uni213A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+213b uni213B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+213c uni213C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) +U+213d uni213D 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) +U+213e uni213E 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) +U+213f uni213F 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) +U+2140 uni2140 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) +U+2141 uni2141 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2142 uni2142 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2143 uni2143 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2144 uni2144 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2145 uni2145 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) +U+2146 uni2146 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) +U+2147 uni2147 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) +U+2148 uni2148 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) +U+2149 uni2149 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.22 (Serif, Serif Condensed) +U+214b uni214B 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+214e uni214E 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2153 onethird 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2154 twothirds 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2155 uni2155 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2156 uni2156 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2157 uni2157 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2158 uni2158 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2159 uni2159 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+215a uni215A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+215b oneeighth 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+215c threeeighths 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+215d fiveeighths 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+215e seveneighths 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+215f uni215F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.6 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2160 uni2160 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2161 uni2161 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2162 uni2162 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2163 uni2163 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2164 uni2164 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2165 uni2165 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2166 uni2166 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2167 uni2167 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2168 uni2168 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2169 uni2169 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+216a uni216A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+216b uni216B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+216c uni216C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+216d uni216D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+216e uni216E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+216f uni216F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2170 uni2170 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2171 uni2171 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2172 uni2172 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2173 uni2173 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2174 uni2174 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2175 uni2175 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2176 uni2176 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2177 uni2177 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2178 uni2178 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2179 uni2179 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+217a uni217A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+217b uni217B 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+217c uni217C 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+217d uni217D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+217e uni217E 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+217f uni217F 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2180 uni2180 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2181 uni2181 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2182 uni2182 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2183 uni2183 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2184 uni2184 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2190 arrowleft 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2191 arrowup 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2192 arrowright 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2193 arrowdown 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2194 arrowboth 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2195 arrowupdn 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2196 uni2196 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2197 uni2197 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2198 uni2198 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2199 uni2199 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+219a uni219A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+219b uni219B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+219c uni219C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+219d uni219D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+219e uni219E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+219f uni219F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21a0 uni21A0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21a1 uni21A1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21a2 uni21A2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21a3 uni21A3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21a4 uni21A4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21a5 uni21A5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21a6 uni21A6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21a7 uni21A7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21a8 arrowupdnbse 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21a9 uni21A9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21aa uni21AA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ab uni21AB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ac uni21AC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ad uni21AD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ae uni21AE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21af uni21AF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21b0 uni21B0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21b1 uni21B1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21b2 uni21B2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21b3 uni21B3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21b4 uni21B4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21b5 carriagereturn 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21b6 uni21B6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21b7 uni21B7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21b8 uni21B8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21b9 uni21B9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ba uni21BA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21bb uni21BB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21bc uni21BC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21bd uni21BD 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21be uni21BE 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21bf uni21BF 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21c0 uni21C0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21c1 uni21C1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21c2 uni21C2 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21c3 uni21C3 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21c4 uni21C4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21c5 uni21C5 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21c6 uni21C6 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21c7 uni21C7 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21c8 uni21C8 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21c9 uni21C9 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ca uni21CA 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21cb uni21CB 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21cc uni21CC 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21cd uni21CD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ce uni21CE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21cf uni21CF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21d0 arrowdblleft 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21d1 arrowdblup 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21d2 arrowdblright 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21d3 arrowdbldown 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21d4 arrowdblboth 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21d5 uni21D5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21d6 uni21D6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21d7 uni21D7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21d8 uni21D8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21d9 uni21D9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21da uni21DA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21db uni21DB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21dc uni21DC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21dd uni21DD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21de uni21DE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21df uni21DF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21e0 uni21E0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21e1 uni21E1 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21e2 uni21E2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21e3 uni21E3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21e4 uni21E4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21e5 uni21E5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21e6 uni21E6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21e7 uni21E7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21e8 uni21E8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21e9 uni21E9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ea uni21EA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21eb uni21EB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ec uni21EC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ed uni21ED 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ee uni21EE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ef uni21EF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21f0 uni21F0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21f1 uni21F1 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21f2 uni21F2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21f3 uni21F3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21f4 uni21F4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21f5 uni21F5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21f6 uni21F6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21f7 uni21F7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21f8 uni21F8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21f9 uni21F9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21fa uni21FA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21fb uni21FB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21fc uni21FC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21fd uni21FD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21fe uni21FE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+21ff uni21FF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2200 universal 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2201 uni2201 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2202 partialdiff original +U+2203 existential 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans ExtraLight) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2204 uni2204 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2205 emptyset 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2206 Delta original +U+2207 gradient 2.1 +U+2208 element 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2209 notelement 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+220a uni220A 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+220b suchthat 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+220c uni220C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+220d uni220D 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+220e uni220E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+220f product original +U+2210 uni2210 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2211 summation original +U+2212 minus original +U+2213 uni2213 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2214 uni2214 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2215 uni2215 original +U+2216 uni2216 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2217 asteriskmath 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2218 uni2218 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2219 uni2219 original +U+221a radical original +U+221b uni221B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+221c uni221C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) 2.26 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+221d proportional 2.1 +U+221e infinity original +U+221f orthogonal 2.1 +U+2220 angle 2.3 +U+2221 uni2221 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2222 uni2222 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2223 uni2223 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2224 uni2224 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2225 uni2225 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2226 uni2226 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2227 logicaland 2.1 +U+2228 logicalor 2.1 +U+2229 intersection 2.1 +U+222a union 2.1 +U+222b integral original +U+222c uni222C 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+222d uni222D 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+222e uni222E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+222f uni222F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2230 uni2230 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2231 uni2231 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2232 uni2232 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2233 uni2233 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2234 therefore 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2235 uni2235 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2236 uni2236 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2237 uni2237 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2238 uni2238 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2239 uni2239 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+223a uni223A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+223b uni223B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+223c similar 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+223d uni223D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+223e uni223E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+223f uni223F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2240 uni2240 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2241 uni2241 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2242 uni2242 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2243 uni2243 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2244 uni2244 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2245 congruent 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2246 uni2246 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2247 uni2247 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2248 approxequal original +U+2249 uni2249 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+224a uni224A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+224b uni224B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+224c uni224C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+224d uni224D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+224e uni224E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+224f uni224F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2250 uni2250 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2251 uni2251 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2252 uni2252 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2253 uni2253 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2254 uni2254 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2255 uni2255 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2256 uni2256 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2257 uni2257 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2258 uni2258 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2259 uni2259 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+225a uni225A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+225b uni225B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+225c uni225C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+225d uni225D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+225e uni225E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+225f uni225F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2260 notequal original +U+2261 equivalence 2.1 +U+2262 uni2262 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2263 uni2263 2.1 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2264 lessequal original +U+2265 greaterequal original +U+2266 uni2266 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2267 uni2267 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2268 uni2268 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2269 uni2269 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+226a uni226A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+226b uni226B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+226c uni226C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+226d uni226D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+226e uni226E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+226f uni226F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2270 uni2270 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2271 uni2271 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2272 uni2272 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2273 uni2273 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2274 uni2274 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2275 uni2275 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2276 uni2276 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2277 uni2277 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2278 uni2278 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2279 uni2279 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+227a uni227A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+227b uni227B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+227c uni227C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+227d uni227D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+227e uni227E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+227f uni227F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2280 uni2280 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2281 uni2281 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2282 propersubset 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2283 propersuperset 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2284 notsubset 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2285 uni2285 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2286 reflexsubset 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2287 reflexsuperset 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2288 uni2288 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2289 uni2289 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+228a uni228A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+228b uni228B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.6 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+228c uni228C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+228d uni228D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+228e uni228E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+228f uni228F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2290 uni2290 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2291 uni2291 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2292 uni2292 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2293 uni2293 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2294 uni2294 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2295 circleplus 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2296 uni2296 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2297 circlemultiply 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2298 uni2298 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2299 uni2299 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+229a uni229A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+229b uni229B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+229c uni229C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+229d uni229D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+229e uni229E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+229f uni229F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22a0 uni22A0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22a1 uni22A1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22a2 uni22A2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22a3 uni22A3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22a4 uni22A4 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22a5 perpendicular 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22a6 uni22A6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22a7 uni22A7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22a8 uni22A8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22a9 uni22A9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22aa uni22AA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22ab uni22AB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22ac uni22AC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22ad uni22AD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22ae uni22AE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22af uni22AF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22b0 uni22B0 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b1 uni22B1 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b2 uni22B2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b3 uni22B3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b4 uni22B4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b5 uni22B5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b6 uni22B6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b7 uni22B7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b8 uni22B8 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22b9 uni22B9 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ba uni22BA 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22bb uni22BB 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22bc uni22BC 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22bd uni22BD 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22be uni22BE 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+22bf uni22BF 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+22c0 uni22C0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22c1 uni22C1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22c2 uni22C2 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22c3 uni22C3 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22c4 uni22C4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22c5 dotmath 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+22c6 uni22C6 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+22c7 uni22C7 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22c8 uni22C8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22c9 uni22C9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ca uni22CA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22cb uni22CB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22cc uni22CC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22cd uni22CD 2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+22ce uni22CE 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22cf uni22CF 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22d0 uni22D0 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22d1 uni22D1 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22d2 uni22D2 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22d3 uni22D3 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22d4 uni22D4 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22d5 uni22D5 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22d6 uni22D6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22d7 uni22D7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22d8 uni22D8 2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+22d9 uni22D9 2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+22da uni22DA 2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+22db uni22DB 2.6 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) 2.7 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+22dc uni22DC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22dd uni22DD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22de uni22DE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22df uni22DF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e0 uni22E0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e1 uni22E1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e2 uni22E2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e3 uni22E3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e4 uni22E4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e5 uni22E5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e6 uni22E6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e7 uni22E7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e8 uni22E8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22e9 uni22E9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+22ea uni22EA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22eb uni22EB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ec uni22EC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ed uni22ED 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ee uni22EE 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ef uni22EF 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f0 uni22F0 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f1 uni22F1 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f2 uni22F2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f3 uni22F3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f4 uni22F4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f5 uni22F5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f6 uni22F6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f7 uni22F7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f8 uni22F8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22f9 uni22F9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22fa uni22FA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22fb uni22FB 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22fc uni22FC 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22fd uni22FD 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22fe uni22FE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+22ff uni22FF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2300 uni2300 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2301 uni2301 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2302 house 1.14 +U+2303 uni2303 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2304 uni2304 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2305 uni2305 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2306 uni2306 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2307 uni2307 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2308 uni2308 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2309 uni2309 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+230a uni230A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+230b uni230B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+230c uni230C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+230d uni230D 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+230e uni230E 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+230f uni230F 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2310 revlogicalnot 1.14 +U+2311 uni2311 1.15 +U+2312 uni2312 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2313 uni2313 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2314 uni2314 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2315 uni2315 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2318 uni2318 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2319 uni2319 1.14 +U+231c uni231C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+231d uni231D 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+231e uni231E 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+231f uni231F 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2320 integraltp 2.3 +U+2321 integralbt 2.3 +U+2324 uni2324 2.16 (Sans, Sans Bold, Sans Bold Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique) 2.19 (Sans Condensed Oblique, Sans Oblique) +U+2325 uni2325 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2326 uni2326 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2327 uni2327 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2328 uni2328 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2329 angleleft 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) +U+232a angleright 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.10 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) +U+232b uni232B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+232c uni232C 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2335 uni2335 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2337 uni2337 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2338 uni2338 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2339 uni2339 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+233a uni233A 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+233b uni233B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+233c uni233C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+233d uni233D 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+233e uni233E 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2341 uni2341 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2342 uni2342 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2343 uni2343 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2344 uni2344 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2347 uni2347 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2348 uni2348 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2349 uni2349 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+234b uni234B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+234c uni234C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+234d uni234D 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2350 uni2350 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2352 uni2352 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2353 uni2353 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2354 uni2354 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2357 uni2357 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2358 uni2358 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2359 uni2359 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+235a uni235A 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+235b uni235B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+235c uni235C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+235e uni235E 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+235f uni235F 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2360 uni2360 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2363 uni2363 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2364 uni2364 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2365 uni2365 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2368 uni2368 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2369 uni2369 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+236b uni236B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+236c uni236C 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+236d uni236D 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+236e uni236E 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+236f uni236F 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2370 uni2370 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2373 uni2373 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2374 uni2374 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2375 uni2375 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2376 uni2376 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2377 uni2377 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2378 uni2378 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2379 uni2379 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+237a uni237A 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+237d uni237D 1.15 +U+2380 uni2380 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2381 uni2381 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2382 uni2382 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2383 uni2383 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2387 uni2387 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2388 uni2388 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2389 uni2389 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+238a uni238A 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+238b uni238B 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2394 uni2394 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2395 uni2395 2.14 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+239b uni239B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+239c uni239C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+239d uni239D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+239e uni239E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+239f uni239F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a0 uni23A0 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a1 uni23A1 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a2 uni23A2 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a3 uni23A3 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a4 uni23A4 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a5 uni23A5 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a6 uni23A6 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a7 uni23A7 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a8 uni23A8 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23a9 uni23A9 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23aa uni23AA 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23ab uni23AB 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23ac uni23AC 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23ad uni23AD 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23ae uni23AE 2.3 +U+23ce uni23CE 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+23cf uni23CF 2.3 +U+23e3 uni23E3 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+23e5 uni23E5 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2422 uni2422 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2423 uni2423 1.6 +U+2460 uni2460 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2461 uni2461 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2462 uni2462 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2463 uni2463 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2464 uni2464 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2465 uni2465 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2466 uni2466 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2467 uni2467 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2468 uni2468 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2469 uni2469 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2500 SF100000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2501 uni2501 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2502 SF110000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2503 uni2503 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2504 uni2504 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2505 uni2505 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2506 uni2506 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2507 uni2507 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2508 uni2508 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2509 uni2509 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+250a uni250A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+250b uni250B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+250c SF010000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+250d uni250D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+250e uni250E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+250f uni250F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2510 SF030000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2511 uni2511 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2512 uni2512 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2513 uni2513 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2514 SF020000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2515 uni2515 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2516 uni2516 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2517 uni2517 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2518 SF040000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2519 uni2519 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+251a uni251A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+251b uni251B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+251c SF080000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+251d uni251D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+251e uni251E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+251f uni251F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2520 uni2520 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2521 uni2521 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2522 uni2522 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2523 uni2523 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2524 SF090000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2525 uni2525 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2526 uni2526 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2527 uni2527 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2528 uni2528 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2529 uni2529 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+252a uni252A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+252b uni252B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+252c SF060000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+252d uni252D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+252e uni252E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+252f uni252F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2530 uni2530 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2531 uni2531 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2532 uni2532 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2533 uni2533 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2534 SF070000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2535 uni2535 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2536 uni2536 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2537 uni2537 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2538 uni2538 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2539 uni2539 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+253a uni253A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+253b uni253B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+253c SF050000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+253d uni253D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+253e uni253E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+253f uni253F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2540 uni2540 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2541 uni2541 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2542 uni2542 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2543 uni2543 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2544 uni2544 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2545 uni2545 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2546 uni2546 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2547 uni2547 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2548 uni2548 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2549 uni2549 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+254a uni254A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+254b uni254B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+254c uni254C 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+254d uni254D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+254e uni254E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+254f uni254F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2550 SF430000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2551 SF240000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2552 SF510000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2553 SF520000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2554 SF390000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2555 SF220000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2556 SF210000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2557 SF250000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2558 SF500000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2559 SF490000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+255a SF380000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+255b SF280000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+255c SF270000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+255d SF260000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+255e SF360000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+255f SF370000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2560 SF420000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2561 SF190000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2562 SF200000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2563 SF230000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2564 SF470000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2565 SF480000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2566 SF410000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2567 SF450000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2568 SF460000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2569 SF400000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+256a SF540000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+256b SF530000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+256c SF440000 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+256d uni256D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+256e uni256E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+256f uni256F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2570 uni2570 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2571 uni2571 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2572 uni2572 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2573 uni2573 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2574 uni2574 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2575 uni2575 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2576 uni2576 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2577 uni2577 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2578 uni2578 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2579 uni2579 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+257a uni257A 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+257b uni257B 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+257c uni257C 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+257d uni257D 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+257e uni257E 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+257f uni257F 1.12 (Sans Mono, Sans Mono Oblique) 2.21 (Sans, Sans Condensed, Sans Condensed Oblique, Sans Oblique, Serif, Serif Condensed, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2580 upblock 1.14 +U+2581 uni2581 1.14 +U+2582 uni2582 1.14 +U+2583 uni2583 1.14 +U+2584 dnblock 1.14 +U+2585 uni2585 1.14 +U+2586 uni2586 1.14 +U+2587 uni2587 1.14 +U+2588 block 1.14 +U+2589 uni2589 1.14 +U+258a uni258A 1.14 +U+258b uni258B 1.14 +U+258c lfblock 1.14 +U+258d uni258D 1.14 +U+258e uni258E 1.14 +U+258f uni258F 1.14 +U+2590 rtblock 1.14 +U+2591 ltshade 1.15 +U+2592 shade 1.15 +U+2593 dkshade 1.15 +U+2594 uni2594 1.14 +U+2595 uni2595 1.14 +U+2596 uni2596 1.14 +U+2597 uni2597 1.14 +U+2598 uni2598 1.14 +U+2599 uni2599 1.14 +U+259a uni259A 1.14 +U+259b uni259B 1.14 +U+259c uni259C 1.14 +U+259d uni259D 1.14 +U+259e uni259E 1.14 +U+259f uni259F 1.14 +U+25a0 filledbox 2.3 +U+25a1 H22073 2.3 +U+25a2 uni25A2 2.3 +U+25a3 uni25A3 2.3 +U+25a4 uni25A4 2.3 +U+25a5 uni25A5 2.3 +U+25a6 uni25A6 2.3 +U+25a7 uni25A7 2.3 +U+25a8 uni25A8 2.3 +U+25a9 uni25A9 2.3 +U+25aa H18543 2.3 +U+25ab H18551 2.3 +U+25ac filledrect 2.3 +U+25ad uni25AD 2.3 +U+25ae uni25AE 2.3 +U+25af uni25AF 2.3 +U+25b0 uni25B0 2.3 +U+25b1 uni25B1 2.3 +U+25b2 triagup 2.3 +U+25b3 uni25B3 2.3 +U+25b4 uni25B4 2.3 +U+25b5 uni25B5 2.3 +U+25b6 uni25B6 2.3 +U+25b7 uni25B7 2.3 +U+25b8 uni25B8 2.3 +U+25b9 uni25B9 2.3 +U+25ba triagrt 2.3 +U+25bb uni25BB 2.3 +U+25bc triagdn 2.3 +U+25bd uni25BD 2.3 +U+25be uni25BE 2.3 +U+25bf uni25BF 2.3 +U+25c0 uni25C0 2.3 +U+25c1 uni25C1 2.3 +U+25c2 uni25C2 2.3 +U+25c3 uni25C3 2.3 +U+25c4 triaglf 2.3 +U+25c5 uni25C5 2.3 +U+25c6 uni25C6 2.3 +U+25c7 uni25C7 2.3 +U+25c8 uni25C8 2.3 +U+25c9 uni25C9 2.3 +U+25ca lozenge original +U+25cb circle 2.3 +U+25cc uni25CC 2.3 +U+25cd uni25CD 2.3 +U+25ce uni25CE 2.3 +U+25cf H18533 2.3 +U+25d0 uni25D0 2.3 +U+25d1 uni25D1 2.3 +U+25d2 uni25D2 2.3 +U+25d3 uni25D3 2.3 +U+25d4 uni25D4 2.3 +U+25d5 uni25D5 2.3 +U+25d6 uni25D6 2.3 +U+25d7 uni25D7 2.3 +U+25d8 invbullet 2.2 +U+25d9 invcircle 2.3 +U+25da uni25DA 2.3 +U+25db uni25DB 2.3 +U+25dc uni25DC 2.3 +U+25dd uni25DD 2.3 +U+25de uni25DE 2.3 +U+25df uni25DF 2.3 +U+25e0 uni25E0 2.3 +U+25e1 uni25E1 2.3 +U+25e2 uni25E2 2.3 +U+25e3 uni25E3 2.3 +U+25e4 uni25E4 2.3 +U+25e5 uni25E5 2.3 +U+25e6 openbullet 2.2 +U+25e7 uni25E7 2.3 +U+25e8 uni25E8 2.3 +U+25e9 uni25E9 2.3 +U+25ea uni25EA 2.3 +U+25eb uni25EB 2.3 +U+25ec uni25EC 2.3 +U+25ed uni25ED 2.3 +U+25ee uni25EE 2.3 +U+25ef uni25EF 2.3 +U+25f0 uni25F0 2.3 +U+25f1 uni25F1 2.3 +U+25f2 uni25F2 2.3 +U+25f3 uni25F3 2.3 +U+25f4 uni25F4 2.3 +U+25f5 uni25F5 2.3 +U+25f6 uni25F6 2.3 +U+25f7 uni25F7 2.3 +U+25f8 uni25F8 2.3 +U+25f9 uni25F9 2.3 +U+25fa uni25FA 2.3 +U+25fb uni25FB 2.3 +U+25fc uni25FC 2.3 +U+25fd uni25FD 2.3 +U+25fe uni25FE 2.3 +U+25ff uni25FF 2.3 +U+2600 uni2600 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2601 uni2601 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2602 uni2602 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2603 uni2603 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2604 uni2604 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2605 uni2605 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2606 uni2606 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2607 uni2607 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2608 uni2608 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2609 uni2609 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+260a uni260A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+260b uni260B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+260c uni260C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+260d uni260D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+260e uni260E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+260f uni260F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2610 uni2610 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2611 uni2611 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2612 uni2612 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2613 uni2613 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2614 uni2614 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2615 uni2615 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2616 uni2616 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2617 uni2617 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2618 uni2618 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2619 uni2619 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+261a uni261A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+261b uni261B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+261c uni261C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+261d uni261D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+261e uni261E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+261f uni261F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2620 uni2620 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2621 uni2621 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2622 uni2622 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2623 uni2623 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2624 uni2624 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2625 uni2625 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2626 uni2626 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2627 uni2627 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2628 uni2628 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2629 uni2629 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+262a uni262A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+262b uni262B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+262c uni262C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+262d uni262D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+262e uni262E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+262f uni262F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2630 uni2630 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2631 uni2631 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2632 uni2632 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2633 uni2633 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2634 uni2634 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2635 uni2635 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2636 uni2636 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2637 uni2637 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2638 uni2638 1.15 +U+2639 uni2639 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+263a smileface 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+263b invsmileface 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+263c sun 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+263d uni263D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+263e uni263E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+263f uni263F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2640 female 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2641 uni2641 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2642 male 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2643 uni2643 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2644 uni2644 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2645 uni2645 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2646 uni2646 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2647 uni2647 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2648 uni2648 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2649 uni2649 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+264a uni264A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+264b uni264B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+264c uni264C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+264d uni264D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+264e uni264E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+264f uni264F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2650 uni2650 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2651 uni2651 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2652 uni2652 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2653 uni2653 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2654 uni2654 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2655 uni2655 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2656 uni2656 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2657 uni2657 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2658 uni2658 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2659 uni2659 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+265a uni265A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+265b uni265B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+265c uni265C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+265d uni265D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+265e uni265E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+265f uni265F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2660 spade 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2661 uni2661 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2662 uni2662 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2663 club 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2664 uni2664 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2665 heart 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2666 diamond 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2667 uni2667 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2668 uni2668 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2669 uni2669 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+266a musicalnote 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+266b musicalnotedbl 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+266c uni266C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+266d uni266D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+266e uni266E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+266f uni266F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2670 uni2670 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2671 uni2671 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2672 uni2672 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2673 uni2673 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2674 uni2674 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2675 uni2675 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2676 uni2676 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2677 uni2677 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2678 uni2678 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2679 uni2679 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+267a uni267A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+267b uni267B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+267c uni267C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+267d uni267D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+267e uni267E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+267f uni267F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2680 uni2680 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) +U+2681 uni2681 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) +U+2682 uni2682 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) +U+2683 uni2683 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) +U+2684 uni2684 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) +U+2685 uni2685 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.4 (Sans ExtraLight) 2.7 (Sans Mono, Sans Mono Bold) +U+2686 uni2686 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2687 uni2687 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2688 uni2688 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2689 uni2689 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+268a uni268A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+268b uni268B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+268c uni268C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+268d uni268D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+268e uni268E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+268f uni268F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+2690 uni2690 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2691 uni2691 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2692 uni2692 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2693 uni2693 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2694 uni2694 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2695 uni2695 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2696 uni2696 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2697 uni2697 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2698 uni2698 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2699 uni2699 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+269a uni269A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+269b uni269B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+269c uni269C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+26a0 uni26A0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+26a1 uni26A1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+26a2 uni26A2 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26a3 uni26A3 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26a4 uni26A4 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26a5 uni26A5 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26a6 uni26A6 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26a7 uni26A7 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26a8 uni26A8 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26a9 uni26A9 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26aa uni26AA 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26ab uni26AB 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26ac uni26AC 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26ad uni26AD 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26ae uni26AE 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26af uni26AF 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+26b0 uni26B0 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+26b1 uni26B1 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+26b2 uni26B2 2.12 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26b3 uni26B3 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26b4 uni26B4 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26b5 uni26B5 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26b6 uni26B6 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26b7 uni26B7 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+26b8 uni26B8 2.29 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2701 uni2701 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2702 uni2702 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2703 uni2703 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2704 uni2704 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2706 uni2706 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2707 uni2707 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2708 uni2708 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2709 uni2709 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+270c uni270C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+270d uni270D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+270e uni270E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+270f uni270F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2710 uni2710 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2711 uni2711 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2712 uni2712 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2713 uni2713 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2714 uni2714 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2715 uni2715 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2716 uni2716 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2717 uni2717 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2718 uni2718 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2719 uni2719 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+271a uni271A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+271b uni271B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+271c uni271C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+271d uni271D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+271e uni271E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+271f uni271F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2720 uni2720 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2721 uni2721 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2722 uni2722 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2723 uni2723 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2724 uni2724 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2725 uni2725 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2726 uni2726 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2727 uni2727 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2729 uni2729 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+272a uni272A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+272b uni272B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+272c uni272C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+272d uni272D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+272e uni272E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+272f uni272F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2730 uni2730 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2731 uni2731 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2732 uni2732 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2733 uni2733 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2734 uni2734 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2735 uni2735 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2736 uni2736 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2737 uni2737 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2738 uni2738 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2739 uni2739 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+273a uni273A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+273b uni273B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+273c uni273C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+273d uni273D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+273e uni273E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+273f uni273F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2740 uni2740 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2741 uni2741 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2742 uni2742 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2743 uni2743 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2744 uni2744 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2745 uni2745 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2746 uni2746 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2747 uni2747 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2748 uni2748 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2749 uni2749 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+274a uni274A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+274b uni274B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+274d uni274D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+274f uni274F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2750 uni2750 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2751 uni2751 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2752 uni2752 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2756 uni2756 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2758 uni2758 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2759 uni2759 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+275a uni275A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+275b uni275B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+275c uni275C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+275d uni275D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+275e uni275E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2761 uni2761 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2762 uni2762 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2763 uni2763 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2764 uni2764 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2765 uni2765 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2766 uni2766 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2767 uni2767 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2768 uni2768 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2769 uni2769 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+276a uni276A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+276b uni276B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+276c uni276C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+276d uni276D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+276e uni276E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+276f uni276F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2770 uni2770 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2771 uni2771 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2772 uni2772 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2773 uni2773 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2774 uni2774 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2775 uni2775 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Sans Mono, Sans Mono Bold) +U+2776 uni2776 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2777 uni2777 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2778 uni2778 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2779 uni2779 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+277a uni277A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+277b uni277B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+277c uni277C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+277d uni277D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+277e uni277E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+277f uni277F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2780 uni2780 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2781 uni2781 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2782 uni2782 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2783 uni2783 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2784 uni2784 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2785 uni2785 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2786 uni2786 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2787 uni2787 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2788 uni2788 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2789 uni2789 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+278a uni278A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+278b uni278B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+278c uni278C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+278d uni278D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+278e uni278E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+278f uni278F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2790 uni2790 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2791 uni2791 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2792 uni2792 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2793 uni2793 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2794 uni2794 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2798 uni2798 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+2799 uni2799 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+279a uni279A 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+279b uni279B 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+279c uni279C 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+279d uni279D 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+279e uni279E 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+279f uni279F 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27a0 uni27A0 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27a1 uni27A1 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27a2 uni27A2 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27a3 uni27A3 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27a4 uni27A4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27a5 uni27A5 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27a6 uni27A6 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27a7 uni27A7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27a8 uni27A8 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27a9 uni27A9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27aa uni27AA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27ab uni27AB 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27ac uni27AC 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27ad uni27AD 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27ae uni27AE 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27af uni27AF 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27b1 uni27B1 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27b2 uni27B2 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27b3 uni27B3 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27b4 uni27B4 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27b5 uni27B5 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27b6 uni27B6 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27b7 uni27B7 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27b8 uni27B8 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27b9 uni27B9 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27ba uni27BA 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27bb uni27BB 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27bc uni27BC 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27bd uni27BD 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27be uni27BE 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.7 (Sans Mono, Sans Mono Bold) +U+27bf uni27BF 2.7 (Sans Mono Bold) +U+27c5 uni27C5 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+27c6 uni27C6 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+27e0 uni27E0 2.3 +U+27e6 uni27E6 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27e7 uni27E7 2.15 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27e8 uni27E8 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27e9 uni27E9 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.13 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27ea uni27EA 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27eb uni27EB 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+27f0 uni27F0 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27f1 uni27F1 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27f2 uni27F2 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27f3 uni27F3 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27f4 uni27F4 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27f5 uni27F5 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27f6 uni27F6 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27f7 uni27F7 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27f8 uni27F8 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27f9 uni27F9 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27fa uni27FA 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27fb uni27FB 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27fc uni27FC 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27fd uni27FD 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27fe uni27FE 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+27ff uni27FF 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2800 uni2800 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2801 uni2801 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2802 uni2802 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2803 uni2803 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2804 uni2804 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2805 uni2805 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2806 uni2806 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2807 uni2807 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2808 uni2808 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2809 uni2809 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+280a uni280A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+280b uni280B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+280c uni280C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+280d uni280D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+280e uni280E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+280f uni280F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2810 uni2810 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2811 uni2811 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2812 uni2812 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2813 uni2813 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2814 uni2814 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2815 uni2815 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2816 uni2816 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2817 uni2817 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2818 uni2818 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2819 uni2819 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+281a uni281A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+281b uni281B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+281c uni281C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+281d uni281D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+281e uni281E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+281f uni281F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2820 uni2820 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2821 uni2821 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2822 uni2822 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2823 uni2823 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2824 uni2824 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2825 uni2825 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2826 uni2826 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2827 uni2827 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2828 uni2828 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2829 uni2829 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+282a uni282A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+282b uni282B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+282c uni282C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+282d uni282D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+282e uni282E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+282f uni282F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2830 uni2830 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2831 uni2831 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2832 uni2832 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2833 uni2833 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2834 uni2834 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2835 uni2835 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2836 uni2836 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2837 uni2837 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2838 uni2838 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2839 uni2839 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+283a uni283A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+283b uni283B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+283c uni283C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+283d uni283D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+283e uni283E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+283f uni283F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2840 uni2840 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2841 uni2841 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2842 uni2842 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2843 uni2843 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2844 uni2844 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2845 uni2845 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2846 uni2846 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2847 uni2847 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2848 uni2848 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2849 uni2849 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+284a uni284A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+284b uni284B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+284c uni284C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+284d uni284D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+284e uni284E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+284f uni284F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2850 uni2850 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2851 uni2851 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2852 uni2852 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2853 uni2853 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2854 uni2854 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2855 uni2855 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2856 uni2856 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2857 uni2857 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2858 uni2858 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2859 uni2859 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+285a uni285A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+285b uni285B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+285c uni285C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+285d uni285D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+285e uni285E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+285f uni285F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2860 uni2860 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2861 uni2861 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2862 uni2862 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2863 uni2863 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2864 uni2864 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2865 uni2865 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2866 uni2866 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2867 uni2867 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2868 uni2868 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2869 uni2869 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+286a uni286A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+286b uni286B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+286c uni286C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+286d uni286D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+286e uni286E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+286f uni286F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2870 uni2870 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2871 uni2871 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2872 uni2872 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2873 uni2873 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2874 uni2874 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2875 uni2875 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2876 uni2876 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2877 uni2877 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2878 uni2878 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2879 uni2879 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+287a uni287A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+287b uni287B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+287c uni287C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+287d uni287D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+287e uni287E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+287f uni287F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2880 uni2880 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2881 uni2881 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2882 uni2882 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2883 uni2883 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2884 uni2884 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2885 uni2885 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2886 uni2886 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2887 uni2887 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2888 uni2888 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2889 uni2889 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+288a uni288A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+288b uni288B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+288c uni288C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+288d uni288D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+288e uni288E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+288f uni288F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2890 uni2890 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2891 uni2891 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2892 uni2892 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2893 uni2893 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2894 uni2894 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2895 uni2895 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2896 uni2896 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2897 uni2897 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2898 uni2898 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2899 uni2899 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+289a uni289A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+289b uni289B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+289c uni289C 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+289d uni289D 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+289e uni289E 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+289f uni289F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28a0 uni28A0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28a1 uni28A1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28a2 uni28A2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28a3 uni28A3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28a4 uni28A4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28a5 uni28A5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28a6 uni28A6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28a7 uni28A7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28a8 uni28A8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28a9 uni28A9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28aa uni28AA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ab uni28AB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ac uni28AC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ad uni28AD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ae uni28AE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28af uni28AF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28b0 uni28B0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28b1 uni28B1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28b2 uni28B2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28b3 uni28B3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28b4 uni28B4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28b5 uni28B5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28b6 uni28B6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28b7 uni28B7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28b8 uni28B8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28b9 uni28B9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ba uni28BA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28bb uni28BB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28bc uni28BC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28bd uni28BD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28be uni28BE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28bf uni28BF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28c0 uni28C0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28c1 uni28C1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28c2 uni28C2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28c3 uni28C3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28c4 uni28C4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28c5 uni28C5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28c6 uni28C6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28c7 uni28C7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28c8 uni28C8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28c9 uni28C9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ca uni28CA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28cb uni28CB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28cc uni28CC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28cd uni28CD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ce uni28CE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28cf uni28CF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28d0 uni28D0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28d1 uni28D1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28d2 uni28D2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28d3 uni28D3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28d4 uni28D4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28d5 uni28D5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28d6 uni28D6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28d7 uni28D7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28d8 uni28D8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28d9 uni28D9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28da uni28DA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28db uni28DB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28dc uni28DC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28dd uni28DD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28de uni28DE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28df uni28DF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28e0 uni28E0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28e1 uni28E1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28e2 uni28E2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28e3 uni28E3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28e4 uni28E4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28e5 uni28E5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28e6 uni28E6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28e7 uni28E7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28e8 uni28E8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28e9 uni28E9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ea uni28EA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28eb uni28EB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ec uni28EC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ed uni28ED 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ee uni28EE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ef uni28EF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28f0 uni28F0 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28f1 uni28F1 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28f2 uni28F2 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28f3 uni28F3 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28f4 uni28F4 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28f5 uni28F5 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28f6 uni28F6 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28f7 uni28F7 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28f8 uni28F8 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28f9 uni28F9 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28fa uni28FA 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28fb uni28FB 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28fc uni28FC 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28fd uni28FD 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28fe uni28FE 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+28ff uni28FF 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2900 uni2900 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2901 uni2901 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2902 uni2902 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2903 uni2903 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2904 uni2904 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2905 uni2905 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2906 uni2906 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2907 uni2907 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2908 uni2908 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2909 uni2909 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+290a uni290A 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+290b uni290B 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+290c uni290C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+290d uni290D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+290e uni290E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+290f uni290F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2910 uni2910 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2911 uni2911 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2912 uni2912 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2913 uni2913 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2914 uni2914 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2915 uni2915 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2916 uni2916 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2917 uni2917 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2918 uni2918 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2919 uni2919 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+291a uni291A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+291b uni291B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+291c uni291C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+291d uni291D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+291e uni291E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+291f uni291F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2920 uni2920 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2921 uni2921 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2922 uni2922 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2923 uni2923 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2924 uni2924 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2925 uni2925 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2926 uni2926 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2927 uni2927 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2928 uni2928 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2929 uni2929 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+292a uni292A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+292b uni292B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+292c uni292C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+292d uni292D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+292e uni292E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+292f uni292F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2930 uni2930 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2931 uni2931 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2932 uni2932 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2933 uni2933 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2934 uni2934 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2935 uni2935 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2936 uni2936 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2937 uni2937 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2938 uni2938 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2939 uni2939 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+293a uni293A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+293b uni293B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+293c uni293C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+293d uni293D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+293e uni293E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+293f uni293F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2940 uni2940 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2941 uni2941 2.13 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2942 uni2942 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2943 uni2943 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2944 uni2944 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2945 uni2945 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2946 uni2946 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2947 uni2947 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2948 uni2948 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2949 uni2949 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+294a uni294A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+294b uni294B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+294c uni294C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+294d uni294D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+294e uni294E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+294f uni294F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2950 uni2950 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2951 uni2951 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2952 uni2952 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2953 uni2953 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2954 uni2954 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2955 uni2955 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2956 uni2956 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2957 uni2957 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2958 uni2958 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2959 uni2959 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+295a uni295A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+295b uni295B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+295c uni295C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+295d uni295D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+295e uni295E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+295f uni295F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2960 uni2960 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2961 uni2961 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2962 uni2962 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2963 uni2963 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2964 uni2964 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2965 uni2965 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2966 uni2966 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2967 uni2967 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2968 uni2968 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2969 uni2969 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+296a uni296A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+296b uni296B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+296c uni296C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+296d uni296D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+296e uni296E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+296f uni296F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2970 uni2970 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2971 uni2971 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2972 uni2972 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2973 uni2973 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2974 uni2974 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2975 uni2975 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2976 uni2976 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2977 uni2977 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2978 uni2978 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2979 uni2979 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+297a uni297A 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+297b uni297B 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+297c uni297C 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+297d uni297D 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+297e uni297E 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+297f uni297F 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2983 uni2983 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2984 uni2984 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+29ce uni29CE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29cf uni29CF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29d0 uni29D0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29d1 uni29D1 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29d2 uni29D2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29d3 uni29D3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29d4 uni29D4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29d5 uni29D5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+29eb uni29EB 2.2 +U+29fa uni29FA 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+29fb uni29FB 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+2a00 uni2A00 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a01 uni2A01 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a02 uni2A02 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a0c uni2A0C 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2a0d uni2A0D 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2a0e uni2A0E 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.9 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2a0f uni2A0F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a10 uni2A10 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a11 uni2A11 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a12 uni2A12 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a13 uni2A13 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a14 uni2A14 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a15 uni2A15 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a16 uni2A16 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a17 uni2A17 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a18 uni2A18 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a19 uni2A19 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a1a uni2A1A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a1b uni2A1B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a1c uni2A1C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a2f uni2A2F 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2a7d uni2A7D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a7e uni2A7E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a7f uni2A7F 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a80 uni2A80 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a81 uni2A81 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a82 uni2A82 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a83 uni2A83 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a84 uni2A84 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a85 uni2A85 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a86 uni2A86 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a87 uni2A87 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a88 uni2A88 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a89 uni2A89 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a8a uni2A8A 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a8b uni2A8B 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a8c uni2A8C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a8d uni2A8D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a8e uni2A8E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a8f uni2A8F 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a90 uni2A90 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a91 uni2A91 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a92 uni2A92 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a93 uni2A93 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a94 uni2A94 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a95 uni2A95 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a96 uni2A96 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a97 uni2A97 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a98 uni2A98 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a99 uni2A99 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a9a uni2A9A 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a9b uni2A9B 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a9c uni2A9C 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a9d uni2A9D 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a9e uni2A9E 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2a9f uni2A9F 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2aa0 uni2AA0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2aae uni2AAE 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2aaf uni2AAF 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab0 uni2AB0 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab1 uni2AB1 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab2 uni2AB2 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab3 uni2AB3 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab4 uni2AB4 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab5 uni2AB5 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab6 uni2AB6 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab7 uni2AB7 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab8 uni2AB8 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2ab9 uni2AB9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2aba uni2ABA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2af9 uni2AF9 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2afa uni2AFA 2.7 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b00 uni2B00 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b01 uni2B01 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b02 uni2B02 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b03 uni2B03 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b04 uni2B04 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b05 uni2B05 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b06 uni2B06 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b07 uni2B07 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b08 uni2B08 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b09 uni2B09 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b0a uni2B0A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b0b uni2B0B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b0c uni2B0C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b0d uni2B0D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b0e uni2B0E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b0f uni2B0F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b10 uni2B10 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b11 uni2B11 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2b12 uni2B12 2.3 +U+2b13 uni2B13 2.3 +U+2b14 uni2B14 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2b15 uni2B15 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2b16 uni2B16 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2b17 uni2B17 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2b18 uni2B18 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2b19 uni2B19 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2b1a uni2B1A 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Italic) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+2b1f uni2B1F 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+2b20 uni2B20 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b21 uni2B21 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b22 uni2B22 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b23 uni2B23 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2b24 uni2B24 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+2b53 uni2B53 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+2b54 uni2B54 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+2c60 uni2C60 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2c61 uni2C61 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2c62 uni2C62 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2c63 uni2C63 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2c64 uni2C64 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2c65 uni2C65 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2c66 uni2C66 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2c67 uni2C67 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2c68 uni2C68 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2c69 uni2C69 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2c6a uni2C6A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2c6b uni2C6B 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2c6c uni2C6C 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) 2.18 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+2c6d uni2C6D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c6e uni2C6E 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2c6f uni2C6F 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2c71 uni2C71 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c72 uni2C72 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c73 uni2C73 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c74 uni2C74 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+2c75 uni2C75 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2c76 uni2C76 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2c77 uni2C77 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.20 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.23 (Serif Italic Condensed) +U+2c79 uni2C79 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2c7a uni2C7A 2.27 +U+2c7b uni2C7B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+2c7c uni2C7C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2c7d uni2C7D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.28 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+2d00 uni2D00 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d01 uni2D01 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d02 uni2D02 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d03 uni2D03 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d04 uni2D04 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d05 uni2D05 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d06 uni2D06 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d07 uni2D07 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d08 uni2D08 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d09 uni2D09 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d0a uni2D0A 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d0b uni2D0B 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d0c uni2D0C 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d0d uni2D0D 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d0e uni2D0E 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d0f uni2D0F 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d10 uni2D10 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d11 uni2D11 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d12 uni2D12 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d13 uni2D13 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d14 uni2D14 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d15 uni2D15 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d16 uni2D16 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d17 uni2D17 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d18 uni2D18 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d19 uni2D19 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d1a uni2D1A 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d1b uni2D1B 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d1c uni2D1C 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d1d uni2D1D 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d1e uni2D1E 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d1f uni2D1F 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d20 uni2D20 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d21 uni2D21 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d22 uni2D22 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d23 uni2D23 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d24 uni2D24 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d25 uni2D25 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+2d30 uni2D30 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d31 uni2D31 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d32 uni2D32 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d33 uni2D33 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d34 uni2D34 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d35 uni2D35 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d36 uni2D36 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d37 uni2D37 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d38 uni2D38 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d39 uni2D39 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d3a uni2D3A 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d3b uni2D3B 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d3c uni2D3C 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d3d uni2D3D 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d3e uni2D3E 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d3f uni2D3F 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d40 uni2D40 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d41 uni2D41 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d42 uni2D42 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d43 uni2D43 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d44 uni2D44 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d45 uni2D45 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d46 uni2D46 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d47 uni2D47 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d48 uni2D48 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d49 uni2D49 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d4a uni2D4A 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d4b uni2D4B 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d4c uni2D4C 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d4d uni2D4D 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d4e uni2D4E 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d4f uni2D4F 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d50 uni2D50 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d51 uni2D51 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d52 uni2D52 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d53 uni2D53 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d54 uni2D54 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d55 uni2D55 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d56 uni2D56 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d57 uni2D57 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d58 uni2D58 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d59 uni2D59 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d5a uni2D5A 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d5b uni2D5B 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d5c uni2D5C 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d5d uni2D5D 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d5e uni2D5E 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d5f uni2D5F 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d60 uni2D60 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d61 uni2D61 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d62 uni2D62 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d63 uni2D63 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d64 uni2D64 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d65 uni2D65 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2d6f uni2D6F 2.18 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+2e18 uni2E18 2.26 +U+2e22 uni2E22 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold) +U+2e23 uni2E23 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold) +U+2e24 uni2E24 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold) +U+2e25 uni2E25 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) 2.30 (Sans Bold) +U+2e2e uni2E2E 2.26 +U+4dc0 uni4DC0 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc1 uni4DC1 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc2 uni4DC2 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc3 uni4DC3 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc4 uni4DC4 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc5 uni4DC5 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc6 uni4DC6 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc7 uni4DC7 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc8 uni4DC8 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dc9 uni4DC9 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dca uni4DCA 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dcb uni4DCB 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dcc uni4DCC 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dcd uni4DCD 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dce uni4DCE 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dcf uni4DCF 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd0 uni4DD0 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd1 uni4DD1 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd2 uni4DD2 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd3 uni4DD3 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd4 uni4DD4 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd5 uni4DD5 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd6 uni4DD6 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd7 uni4DD7 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd8 uni4DD8 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dd9 uni4DD9 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dda uni4DDA 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4ddb uni4DDB 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4ddc uni4DDC 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4ddd uni4DDD 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dde uni4DDE 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4ddf uni4DDF 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de0 uni4DE0 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de1 uni4DE1 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de2 uni4DE2 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de3 uni4DE3 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de4 uni4DE4 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de5 uni4DE5 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de6 uni4DE6 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de7 uni4DE7 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de8 uni4DE8 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4de9 uni4DE9 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dea uni4DEA 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4deb uni4DEB 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dec uni4DEC 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4ded uni4DED 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dee uni4DEE 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4def uni4DEF 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df0 uni4DF0 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df1 uni4DF1 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df2 uni4DF2 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df3 uni4DF3 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df4 uni4DF4 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df5 uni4DF5 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df6 uni4DF6 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df7 uni4DF7 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df8 uni4DF8 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4df9 uni4DF9 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dfa uni4DFA 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dfb uni4DFB 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dfc uni4DFC 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dfd uni4DFD 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dfe uni4DFE 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+4dff uni4DFF 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a644 uniA644 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+a645 uniA645 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+a646 uniA646 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+a647 uniA647 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+a64c uniA64C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a64d uniA64D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a650 uniA650 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+a651 uniA651 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+a654 uniA654 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+a655 uniA655 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+a656 uniA656 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+a657 uniA657 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+a662 uniA662 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a663 uniA663 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a664 uniA664 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a665 uniA665 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a666 uniA666 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a667 uniA667 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a668 uniA668 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a669 uniA669 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a66a uniA66A 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a66b uniA66B 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a66c uniA66C 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a66d uniA66D 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a66e uniA66E 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a68a uniA68A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a68b uniA68B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a68c uniA68C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a68d uniA68D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a694 uniA694 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a695 uniA695 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a708 uniA708 2.27 +U+a709 uniA709 2.27 +U+a70a uniA70A 2.27 +U+a70b uniA70B 2.27 +U+a70c uniA70C 2.27 +U+a70d uniA70D 2.27 +U+a70e uniA70E 2.27 +U+a70f uniA70F 2.27 +U+a710 uniA710 2.27 +U+a711 uniA711 2.27 +U+a712 uniA712 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+a713 uniA713 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+a714 uniA714 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+a715 uniA715 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+a716 uniA716 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.27 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+a71b uniA71B 2.27 +U+a71c uniA71C 2.27 +U+a71d uniA71D 2.27 +U+a71e uniA71E 2.27 +U+a71f uniA71F 2.27 +U+a726 uniA726 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+a727 uniA727 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) 2.30 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) +U+a728 uniA728 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a729 uniA729 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a72a uniA72A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a72b uniA72B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a730 uniA730 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a731 uniA731 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a732 uniA732 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a733 uniA733 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a734 uniA734 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a735 uniA735 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a736 uniA736 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a737 uniA737 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a738 uniA738 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a739 uniA739 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a73a uniA73A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a73b uniA73B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a73c uniA73C 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a73d uniA73D 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a73e uniA73E 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a73f uniA73F 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a746 uniA746 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a747 uniA747 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a748 uniA748 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a749 uniA749 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a74a uniA74A 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a74b uniA74B 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a74e uniA74E 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a74f uniA74F 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a780 uniA780 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a781 uniA781 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a782 uniA782 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a783 uniA783 2.27 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+a789 uniA789 2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+a78a uniA78A 2.28 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique) +U+a78b uniA78B 2.26 +U+a78c uniA78C 2.26 +U+a7fb uniA7FB 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a7fc uniA7FC 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a7fd uniA7FD 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a7fe uniA7FE 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+a7ff uniA7FF 2.26 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+e000 uniE000 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+e001 uniE001 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+e002 uniE002 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+e003 uniE003 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+e004 uniE004 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+e005 uniE005 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+e006 uniE006 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+e007 uniE007 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+e008 uniE008 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique) +U+e009 uniE009 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e00a uniE00A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e00b uniE00B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e00c uniE00C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e00d uniE00D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e00e uniE00E 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e00f uniE00F 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e010 uniE010 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e011 uniE011 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e012 uniE012 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e013 uniE013 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e014 uniE014 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) +U+e015 uniE015 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+e016 uniE016 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+e017 uniE017 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+e018 uniE018 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+e019 uniE019 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+e01a uniE01A 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+e01b uniE01B 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+e01c uniE01C 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+e01d uniE01D 2.4 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+f000 uniF000 2.10 (Sans) 2.11 (Sans Condensed) +U+f001 uniF001 2.10 (Sans) 2.11 (Sans Condensed) +U+f208 uniF208 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+f20a uniF20A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+f215 uniF215 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+f216 uniF216 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+f217 uniF217 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+f21a uniF21A 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+f21b uniF21B 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+f25f uniF25F 2.6 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+f400 uniF400 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f401 uniF401 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f402 uniF402 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f403 uniF403 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f404 uniF404 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f405 uniF405 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f406 uniF406 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f407 uniF407 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f408 uniF408 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f409 uniF409 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f40a uniF40A 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f40b uniF40B 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f40c uniF40C 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f40d uniF40D 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f40e uniF40E 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f40f uniF40F 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f410 uniF410 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f411 uniF411 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f412 uniF412 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f413 uniF413 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f414 uniF414 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f415 uniF415 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f416 uniF416 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f417 uniF417 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f418 uniF418 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f419 uniF419 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f41a uniF41A 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f41b uniF41B 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f41c uniF41C 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f41d uniF41D 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f41e uniF41E 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f41f uniF41F 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f420 uniF420 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f421 uniF421 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f422 uniF422 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f423 uniF423 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f424 uniF424 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f425 uniF425 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f426 uniF426 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f428 uniF428 2.28 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Italic, Serif Italic Condensed) +U+f5c5 uniF5C5 2.9 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+f6c4 uniF6C4 2.10 (Serif Bold Italic, Serif Italic) 2.11 (Serif Condensed Bold Italic, Serif Condensed Italic) 2.23 (Serif Italic Condensed) +U+f6c5 uniF6C5 2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.7 (Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique) 2.9 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold, Sans Condensed Oblique, Sans Oblique) 2.18 (Sans ExtraLight) 2.23 (Serif Italic Condensed) +U+f6c6 uniF6C6 2.5 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+f6c7 uniF6C7 2.11 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+f6c8 uniF6C8 2.11 (Serif Bold Italic, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+f6d1 cyrBreve 2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+f6d4 cyrbreve 2.5 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fb00 uniFB00 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fb01 fi original +U+fb02 fl original +U+fb03 uniFB03 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fb04 uniFB04 2.2 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.5 (Sans ExtraLight) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fb05 uniFB05 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fb06 uniFB06 2.5 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.8 (Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fb13 uniFB13 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb14 uniFB14 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb15 uniFB15 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb16 uniFB16 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb17 uniFB17 2.3 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb1d uniFB1D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb1e uniFB1E 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+fb1f uniFB1F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb20 uniFB20 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb21 uniFB21 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+fb22 uniFB22 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+fb23 uniFB23 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+fb24 uniFB24 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+fb25 uniFB25 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+fb26 uniFB26 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+fb27 uniFB27 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+fb28 uniFB28 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+fb29 uniFB29 2.10 (Sans, Sans Bold, Sans Bold Oblique, Sans ExtraLight, Sans Oblique) 2.11 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+fb2a uniFB2A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb2b uniFB2B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb2c uniFB2C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb2d uniFB2D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb2e uniFB2E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb2f uniFB2F 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb30 uniFB30 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb31 uniFB31 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb32 uniFB32 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb33 uniFB33 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb34 uniFB34 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb35 uniFB35 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb36 uniFB36 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb37 uniFB37 2.11 (Sans Condensed Oblique, Sans Oblique) +U+fb38 uniFB38 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb39 uniFB39 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb3a uniFB3A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb3b uniFB3B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb3c uniFB3C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb3e uniFB3E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb40 uniFB40 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb41 uniFB41 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb43 uniFB43 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb44 uniFB44 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb46 uniFB46 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb47 uniFB47 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb48 uniFB48 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb49 uniFB49 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb4a uniFB4A 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb4b uniFB4B 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb4c uniFB4C 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb4d uniFB4D 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb4e uniFB4E 2.9 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fb4f uniFB4F 2.16 (Sans, Sans Bold, Sans Bold Oblique, Sans Oblique) 2.17 (Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique) +U+fb52 uniFB52 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb53 uniFB53 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb54 uniFB54 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb55 uniFB55 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb56 uniFB56 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb57 uniFB57 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb58 uniFB58 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb59 uniFB59 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb5a uniFB5A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb5b uniFB5B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb5c uniFB5C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb5d uniFB5D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb5e uniFB5E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb5f uniFB5F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb60 uniFB60 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb61 uniFB61 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb62 uniFB62 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb63 uniFB63 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb64 uniFB64 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb65 uniFB65 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb66 uniFB66 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb67 uniFB67 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb68 uniFB68 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb69 uniFB69 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb6a uniFB6A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb6b uniFB6B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb6c uniFB6C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb6d uniFB6D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb6e uniFB6E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb6f uniFB6F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb70 uniFB70 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb71 uniFB71 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb72 uniFB72 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb73 uniFB73 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb74 uniFB74 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb75 uniFB75 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb76 uniFB76 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb77 uniFB77 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb78 uniFB78 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb79 uniFB79 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb7a uniFB7A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb7b uniFB7B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb7c uniFB7C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb7d uniFB7D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb7e uniFB7E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb7f uniFB7F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb80 uniFB80 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb81 uniFB81 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb8a uniFB8A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb8b uniFB8B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb8c uniFB8C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb8d uniFB8D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb8e uniFB8E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb8f uniFB8F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb90 uniFB90 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb91 uniFB91 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb92 uniFB92 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb93 uniFB93 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb94 uniFB94 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb95 uniFB95 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb9e uniFB9E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fb9f uniFB9F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fbaa uniFBAA 2.16 (Sans Mono, Sans Mono Bold) +U+fbab uniFBAB 2.16 (Sans Mono, Sans Mono Bold) +U+fbac uniFBAC 2.16 (Sans Mono, Sans Mono Bold) +U+fbad uniFBAD 2.16 (Sans Mono, Sans Mono Bold) +U+fbd9 uniFBD9 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fbda uniFBDA 2.7 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) +U+fbe8 uniFBE8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fbe9 uniFBE9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fbfc uniFBFC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fbfd uniFBFD 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fbfe uniFBFE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fbff uniFBFF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe00 uniFE00 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe01 uniFE01 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe02 uniFE02 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe03 uniFE03 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe04 uniFE04 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe05 uniFE05 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe06 uniFE06 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe07 uniFE07 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe08 uniFE08 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe09 uniFE09 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe0a uniFE0A 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe0b uniFE0B 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe0c uniFE0C 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe0d uniFE0D 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe0e uniFE0E 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe0f uniFE0F 2.14 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans ExtraLight, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fe20 uniFE20 2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fe21 uniFE21 2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fe22 uniFE22 2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fe23 uniFE23 2.21 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+fe70 uniFE70 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe71 uniFE71 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe72 uniFE72 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe73 uniFE73 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe74 uniFE74 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe76 uniFE76 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe77 uniFE77 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe78 uniFE78 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe79 uniFE79 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe7a uniFE7A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe7b uniFE7B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe7c uniFE7C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe7d uniFE7D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe7e uniFE7E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe7f uniFE7F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe80 uniFE80 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe81 uniFE81 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe82 uniFE82 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe83 uniFE83 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe84 uniFE84 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe85 uniFE85 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe86 uniFE86 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe87 uniFE87 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe88 uniFE88 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe89 uniFE89 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe8a uniFE8A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe8b uniFE8B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe8c uniFE8C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe8d uniFE8D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe8e uniFE8E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe8f uniFE8F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe90 uniFE90 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe91 uniFE91 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe92 uniFE92 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe93 uniFE93 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe94 uniFE94 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe95 uniFE95 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe96 uniFE96 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe97 uniFE97 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe98 uniFE98 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe99 uniFE99 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe9a uniFE9A 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe9b uniFE9B 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe9c uniFE9C 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe9d uniFE9D 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe9e uniFE9E 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fe9f uniFE9F 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fea0 uniFEA0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fea1 uniFEA1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fea2 uniFEA2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fea3 uniFEA3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fea4 uniFEA4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fea5 uniFEA5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fea6 uniFEA6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fea7 uniFEA7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fea8 uniFEA8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fea9 uniFEA9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feaa uniFEAA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feab uniFEAB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feac uniFEAC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fead uniFEAD 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feae uniFEAE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feaf uniFEAF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feb0 uniFEB0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feb1 uniFEB1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feb2 uniFEB2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feb3 uniFEB3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feb4 uniFEB4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feb5 uniFEB5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feb6 uniFEB6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feb7 uniFEB7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feb8 uniFEB8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feb9 uniFEB9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feba uniFEBA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+febb uniFEBB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+febc uniFEBC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+febd uniFEBD 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+febe uniFEBE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+febf uniFEBF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fec0 uniFEC0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fec1 uniFEC1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fec2 uniFEC2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fec3 uniFEC3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fec4 uniFEC4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fec5 uniFEC5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fec6 uniFEC6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fec7 uniFEC7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fec8 uniFEC8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fec9 uniFEC9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feca uniFECA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fecb uniFECB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fecc uniFECC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fecd uniFECD 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fece uniFECE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fecf uniFECF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fed0 uniFED0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fed1 uniFED1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fed2 uniFED2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fed3 uniFED3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fed4 uniFED4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fed5 uniFED5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fed6 uniFED6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fed7 uniFED7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fed8 uniFED8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fed9 uniFED9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feda uniFEDA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fedb uniFEDB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fedc uniFEDC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fedd uniFEDD 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fede uniFEDE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fedf uniFEDF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fee0 uniFEE0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fee1 uniFEE1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fee2 uniFEE2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fee3 uniFEE3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fee4 uniFEE4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fee5 uniFEE5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fee6 uniFEE6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fee7 uniFEE7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fee8 uniFEE8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fee9 uniFEE9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feea uniFEEA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feeb uniFEEB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feec uniFEEC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feed uniFEED 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feee uniFEEE 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feef uniFEEF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fef0 uniFEF0 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fef1 uniFEF1 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fef2 uniFEF2 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fef3 uniFEF3 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fef4 uniFEF4 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fef5 uniFEF5 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fef6 uniFEF6 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fef7 uniFEF7 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fef8 uniFEF8 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fef9 uniFEF9 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fefa uniFEFA 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fefb uniFEFB 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fefc uniFEFC 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+feff uniFEFF 2.4 (Sans, Sans Bold, Sans Condensed, Sans Condensed Bold) 2.16 (Sans Mono, Sans Mono Bold) +U+fff9 uniFFF9 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fffa uniFFFA 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fffb uniFFFB 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fffc uniFFFC 2.22 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Mono, Sans Mono Bold, Sans Mono Bold Oblique, Sans Mono Oblique, Sans Oblique, Serif, Serif Bold, Serif Bold Italic, Serif Condensed, Serif Condensed Bold, Serif Condensed Bold Italic, Serif Condensed Italic, Serif Italic) 2.23 (Serif Italic Condensed) +U+fffd uniFFFD 1.12 +U+1d300 u1D300 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d301 u1D301 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d302 u1D302 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d303 u1D303 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d304 u1D304 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d305 u1D305 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d306 u1D306 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d307 u1D307 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d308 u1D308 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d309 u1D309 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d30a u1D30A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d30b u1D30B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d30c u1D30C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d30d u1D30D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d30e u1D30E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d30f u1D30F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d310 u1D310 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d311 u1D311 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d312 u1D312 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d313 u1D313 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d314 u1D314 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d315 u1D315 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d316 u1D316 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d317 u1D317 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d318 u1D318 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d319 u1D319 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d31a u1D31A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d31b u1D31B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d31c u1D31C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d31d u1D31D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d31e u1D31E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d31f u1D31F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d320 u1D320 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d321 u1D321 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d322 u1D322 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d323 u1D323 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d324 u1D324 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d325 u1D325 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d326 u1D326 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d327 u1D327 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d328 u1D328 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d329 u1D329 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d32a u1D32A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d32b u1D32B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d32c u1D32C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d32d u1D32D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d32e u1D32E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d32f u1D32F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d330 u1D330 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d331 u1D331 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d332 u1D332 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d333 u1D333 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d334 u1D334 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d335 u1D335 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d336 u1D336 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d337 u1D337 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d338 u1D338 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d339 u1D339 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d33a u1D33A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d33b u1D33B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d33c u1D33C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d33d u1D33D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d33e u1D33E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d33f u1D33F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d340 u1D340 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d341 u1D341 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d342 u1D342 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d343 u1D343 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d344 u1D344 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d345 u1D345 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d346 u1D346 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d347 u1D347 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d348 u1D348 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d349 u1D349 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d34a u1D34A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d34b u1D34B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d34c u1D34C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d34d u1D34D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d34e u1D34E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d34f u1D34F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d350 u1D350 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d351 u1D351 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d352 u1D352 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d353 u1D353 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d354 u1D354 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d355 u1D355 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d356 u1D356 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) +U+1d400 u1D400 2.23 (Serif Bold, Serif Condensed Bold) +U+1d401 u1D401 2.23 (Serif Bold, Serif Condensed Bold) +U+1d402 u1D402 2.23 (Serif Bold, Serif Condensed Bold) +U+1d403 u1D403 2.23 (Serif Bold, Serif Condensed Bold) +U+1d404 u1D404 2.23 (Serif Bold, Serif Condensed Bold) +U+1d405 u1D405 2.23 (Serif Bold, Serif Condensed Bold) +U+1d406 u1D406 2.23 (Serif Bold, Serif Condensed Bold) +U+1d407 u1D407 2.23 (Serif Bold, Serif Condensed Bold) +U+1d408 u1D408 2.23 (Serif Bold, Serif Condensed Bold) +U+1d409 u1D409 2.23 (Serif Bold, Serif Condensed Bold) +U+1d40a u1D40A 2.23 (Serif Bold, Serif Condensed Bold) +U+1d40b u1D40B 2.23 (Serif Bold, Serif Condensed Bold) +U+1d40c u1D40C 2.23 (Serif Bold, Serif Condensed Bold) +U+1d40d u1D40D 2.23 (Serif Bold, Serif Condensed Bold) +U+1d40e u1D40E 2.23 (Serif Bold, Serif Condensed Bold) +U+1d40f u1D40F 2.23 (Serif Bold, Serif Condensed Bold) +U+1d410 u1D410 2.23 (Serif Bold, Serif Condensed Bold) +U+1d411 u1D411 2.23 (Serif Bold, Serif Condensed Bold) +U+1d412 u1D412 2.23 (Serif Bold, Serif Condensed Bold) +U+1d413 u1D413 2.23 (Serif Bold, Serif Condensed Bold) +U+1d414 u1D414 2.23 (Serif Bold, Serif Condensed Bold) +U+1d415 u1D415 2.23 (Serif Bold, Serif Condensed Bold) +U+1d416 u1D416 2.23 (Serif Bold, Serif Condensed Bold) +U+1d417 u1D417 2.23 (Serif Bold, Serif Condensed Bold) +U+1d418 u1D418 2.23 (Serif Bold, Serif Condensed Bold) +U+1d419 u1D419 2.23 (Serif Bold, Serif Condensed Bold) +U+1d41a u1D41A 2.23 (Serif Bold, Serif Condensed Bold) +U+1d41b u1D41B 2.23 (Serif Bold, Serif Condensed Bold) +U+1d41c u1D41C 2.23 (Serif Bold, Serif Condensed Bold) +U+1d41d u1D41D 2.23 (Serif Bold, Serif Condensed Bold) +U+1d41e u1D41E 2.23 (Serif Bold, Serif Condensed Bold) +U+1d41f u1D41F 2.23 (Serif Bold, Serif Condensed Bold) +U+1d420 u1D420 2.23 (Serif Bold, Serif Condensed Bold) +U+1d421 u1D421 2.23 (Serif Bold, Serif Condensed Bold) +U+1d422 u1D422 2.23 (Serif Bold, Serif Condensed Bold) +U+1d423 u1D423 2.23 (Serif Bold, Serif Condensed Bold) +U+1d424 u1D424 2.23 (Serif Bold, Serif Condensed Bold) +U+1d425 u1D425 2.23 (Serif Bold, Serif Condensed Bold) +U+1d426 u1D426 2.23 (Serif Bold, Serif Condensed Bold) +U+1d427 u1D427 2.23 (Serif Bold, Serif Condensed Bold) +U+1d428 u1D428 2.23 (Serif Bold, Serif Condensed Bold) +U+1d429 u1D429 2.23 (Serif Bold, Serif Condensed Bold) +U+1d42a u1D42A 2.23 (Serif Bold, Serif Condensed Bold) +U+1d42b u1D42B 2.23 (Serif Bold, Serif Condensed Bold) +U+1d42c u1D42C 2.23 (Serif Bold, Serif Condensed Bold) +U+1d42d u1D42D 2.23 (Serif Bold, Serif Condensed Bold) +U+1d42e u1D42E 2.23 (Serif Bold, Serif Condensed Bold) +U+1d42f u1D42F 2.23 (Serif Bold, Serif Condensed Bold) +U+1d430 u1D430 2.23 (Serif Bold, Serif Condensed Bold) +U+1d431 u1D431 2.23 (Serif Bold, Serif Condensed Bold) +U+1d432 u1D432 2.23 (Serif Bold, Serif Condensed Bold) +U+1d433 u1D433 2.23 (Serif Bold, Serif Condensed Bold) +U+1d434 u1D434 2.23 (Serif Italic, Serif Italic Condensed) +U+1d435 u1D435 2.23 (Serif Italic, Serif Italic Condensed) +U+1d436 u1D436 2.23 (Serif Italic, Serif Italic Condensed) +U+1d437 u1D437 2.23 (Serif Italic, Serif Italic Condensed) +U+1d438 u1D438 2.23 (Serif Italic, Serif Italic Condensed) +U+1d439 u1D439 2.23 (Serif Italic, Serif Italic Condensed) +U+1d43a u1D43A 2.23 (Serif Italic, Serif Italic Condensed) +U+1d43b u1D43B 2.23 (Serif Italic, Serif Italic Condensed) +U+1d43c u1D43C 2.23 (Serif Italic, Serif Italic Condensed) +U+1d43d u1D43D 2.23 (Serif Italic, Serif Italic Condensed) +U+1d43e u1D43E 2.23 (Serif Italic, Serif Italic Condensed) +U+1d43f u1D43F 2.23 (Serif Italic, Serif Italic Condensed) +U+1d440 u1D440 2.23 (Serif Italic, Serif Italic Condensed) +U+1d441 u1D441 2.23 (Serif Italic, Serif Italic Condensed) +U+1d442 u1D442 2.23 (Serif Italic, Serif Italic Condensed) +U+1d443 u1D443 2.23 (Serif Italic, Serif Italic Condensed) +U+1d444 u1D444 2.23 (Serif Italic, Serif Italic Condensed) +U+1d445 u1D445 2.23 (Serif Italic, Serif Italic Condensed) +U+1d446 u1D446 2.23 (Serif Italic, Serif Italic Condensed) +U+1d447 u1D447 2.23 (Serif Italic, Serif Italic Condensed) +U+1d448 u1D448 2.23 (Serif Italic, Serif Italic Condensed) +U+1d449 u1D449 2.23 (Serif Italic, Serif Italic Condensed) +U+1d44a u1D44A 2.23 (Serif Italic, Serif Italic Condensed) +U+1d44b u1D44B 2.23 (Serif Italic, Serif Italic Condensed) +U+1d44c u1D44C 2.23 (Serif Italic, Serif Italic Condensed) +U+1d44d u1D44D 2.23 (Serif Italic, Serif Italic Condensed) +U+1d44e u1D44E 2.23 (Serif Italic, Serif Italic Condensed) +U+1d44f u1D44F 2.23 (Serif Italic, Serif Italic Condensed) +U+1d450 u1D450 2.23 (Serif Italic, Serif Italic Condensed) +U+1d451 u1D451 2.23 (Serif Italic, Serif Italic Condensed) +U+1d452 u1D452 2.23 (Serif Italic, Serif Italic Condensed) +U+1d453 u1D453 2.23 (Serif Italic, Serif Italic Condensed) +U+1d454 u1D454 2.23 (Serif Italic, Serif Italic Condensed) +U+1d456 u1D456 2.23 (Serif Italic, Serif Italic Condensed) +U+1d457 u1D457 2.23 (Serif Italic, Serif Italic Condensed) +U+1d458 u1D458 2.23 (Serif Italic, Serif Italic Condensed) +U+1d459 u1D459 2.23 (Serif Italic, Serif Italic Condensed) +U+1d45a u1D45A 2.23 (Serif Italic, Serif Italic Condensed) +U+1d45b u1D45B 2.23 (Serif Italic, Serif Italic Condensed) +U+1d45c u1D45C 2.23 (Serif Italic, Serif Italic Condensed) +U+1d45d u1D45D 2.23 (Serif Italic, Serif Italic Condensed) +U+1d45e u1D45E 2.23 (Serif Italic, Serif Italic Condensed) +U+1d45f u1D45F 2.23 (Serif Italic, Serif Italic Condensed) +U+1d460 u1D460 2.23 (Serif Italic, Serif Italic Condensed) +U+1d461 u1D461 2.23 (Serif Italic, Serif Italic Condensed) +U+1d462 u1D462 2.23 (Serif Italic, Serif Italic Condensed) +U+1d463 u1D463 2.23 (Serif Italic, Serif Italic Condensed) +U+1d464 u1D464 2.23 (Serif Italic, Serif Italic Condensed) +U+1d465 u1D465 2.23 (Serif Italic, Serif Italic Condensed) +U+1d466 u1D466 2.23 (Serif Italic, Serif Italic Condensed) +U+1d467 u1D467 2.23 (Serif Italic, Serif Italic Condensed) +U+1d468 u1D468 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d469 u1D469 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d46a u1D46A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d46b u1D46B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d46c u1D46C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d46d u1D46D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d46e u1D46E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d46f u1D46F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d470 u1D470 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d471 u1D471 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d472 u1D472 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d473 u1D473 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d474 u1D474 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d475 u1D475 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d476 u1D476 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d477 u1D477 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d478 u1D478 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d479 u1D479 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d47a u1D47A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d47b u1D47B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d47c u1D47C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d47d u1D47D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d47e u1D47E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d47f u1D47F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d480 u1D480 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d481 u1D481 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d482 u1D482 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d483 u1D483 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d484 u1D484 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d485 u1D485 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d486 u1D486 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d487 u1D487 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d488 u1D488 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d489 u1D489 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d48a u1D48A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d48b u1D48B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d48c u1D48C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d48d u1D48D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d48e u1D48E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d48f u1D48F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d490 u1D490 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d491 u1D491 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d492 u1D492 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d493 u1D493 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d494 u1D494 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d495 u1D495 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d496 u1D496 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d497 u1D497 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d498 u1D498 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d499 u1D499 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d49a u1D49A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d49b u1D49B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d538 u1D538 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d539 u1D539 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d53b u1D53B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d53c u1D53C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d53d u1D53D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d53e u1D53E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d540 u1D540 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d541 u1D541 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d542 u1D542 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d543 u1D543 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d544 u1D544 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d546 u1D546 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d54a u1D54A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d54b u1D54B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d54c u1D54C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d54d u1D54D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d54e u1D54E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d54f u1D54F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d550 u1D550 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d552 u1D552 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d553 u1D553 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d554 u1D554 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d555 u1D555 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d556 u1D556 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d557 u1D557 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d558 u1D558 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d559 u1D559 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d55a u1D55A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d55b u1D55B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d55c u1D55C 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d55d u1D55D 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d55e u1D55E 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d55f u1D55F 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d560 u1D560 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d561 u1D561 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d562 u1D562 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d563 u1D563 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d564 u1D564 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d565 u1D565 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d566 u1D566 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d567 u1D567 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d568 u1D568 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d569 u1D569 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d56a u1D56A 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d56b u1D56B 2.18 (Sans, Sans Bold, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.22 (Serif, Serif Condensed) +U+1d5a0 u1D5A0 2.23 (Sans, Sans Condensed) +U+1d5a1 u1D5A1 2.23 (Sans, Sans Condensed) +U+1d5a2 u1D5A2 2.23 (Sans, Sans Condensed) +U+1d5a3 u1D5A3 2.23 (Sans, Sans Condensed) +U+1d5a4 u1D5A4 2.23 (Sans, Sans Condensed) +U+1d5a5 u1D5A5 2.23 (Sans, Sans Condensed) +U+1d5a6 u1D5A6 2.23 (Sans, Sans Condensed) +U+1d5a7 u1D5A7 2.23 (Sans, Sans Condensed) +U+1d5a8 u1D5A8 2.23 (Sans, Sans Condensed) +U+1d5a9 u1D5A9 2.23 (Sans, Sans Condensed) +U+1d5aa u1D5AA 2.23 (Sans, Sans Condensed) +U+1d5ab u1D5AB 2.23 (Sans, Sans Condensed) +U+1d5ac u1D5AC 2.23 (Sans, Sans Condensed) +U+1d5ad u1D5AD 2.23 (Sans, Sans Condensed) +U+1d5ae u1D5AE 2.23 (Sans, Sans Condensed) +U+1d5af u1D5AF 2.23 (Sans, Sans Condensed) +U+1d5b0 u1D5B0 2.23 (Sans, Sans Condensed) +U+1d5b1 u1D5B1 2.23 (Sans, Sans Condensed) +U+1d5b2 u1D5B2 2.23 (Sans, Sans Condensed) +U+1d5b3 u1D5B3 2.23 (Sans, Sans Condensed) +U+1d5b4 u1D5B4 2.23 (Sans, Sans Condensed) +U+1d5b5 u1D5B5 2.23 (Sans, Sans Condensed) +U+1d5b6 u1D5B6 2.23 (Sans, Sans Condensed) +U+1d5b7 u1D5B7 2.23 (Sans, Sans Condensed) +U+1d5b8 u1D5B8 2.23 (Sans, Sans Condensed) +U+1d5b9 u1D5B9 2.23 (Sans, Sans Condensed) +U+1d5ba u1D5BA 2.23 (Sans, Sans Condensed) +U+1d5bb u1D5BB 2.23 (Sans, Sans Condensed) +U+1d5bc u1D5BC 2.23 (Sans, Sans Condensed) +U+1d5bd u1D5BD 2.23 (Sans, Sans Condensed) +U+1d5be u1D5BE 2.23 (Sans, Sans Condensed) +U+1d5bf u1D5BF 2.23 (Sans, Sans Condensed) +U+1d5c0 u1D5C0 2.23 (Sans, Sans Condensed) +U+1d5c1 u1D5C1 2.23 (Sans, Sans Condensed) +U+1d5c2 u1D5C2 2.23 (Sans, Sans Condensed) +U+1d5c3 u1D5C3 2.23 (Sans, Sans Condensed) +U+1d5c4 u1D5C4 2.23 (Sans, Sans Condensed) +U+1d5c5 u1D5C5 2.23 (Sans, Sans Condensed) +U+1d5c6 u1D5C6 2.23 (Sans, Sans Condensed) +U+1d5c7 u1D5C7 2.23 (Sans, Sans Condensed) +U+1d5c8 u1D5C8 2.23 (Sans, Sans Condensed) +U+1d5c9 u1D5C9 2.23 (Sans, Sans Condensed) +U+1d5ca u1D5CA 2.23 (Sans, Sans Condensed) +U+1d5cb u1D5CB 2.23 (Sans, Sans Condensed) +U+1d5cc u1D5CC 2.23 (Sans, Sans Condensed) +U+1d5cd u1D5CD 2.23 (Sans, Sans Condensed) +U+1d5ce u1D5CE 2.23 (Sans, Sans Condensed) +U+1d5cf u1D5CF 2.23 (Sans, Sans Condensed) +U+1d5d0 u1D5D0 2.23 (Sans, Sans Condensed) +U+1d5d1 u1D5D1 2.23 (Sans, Sans Condensed) +U+1d5d2 u1D5D2 2.23 (Sans, Sans Condensed) +U+1d5d3 u1D5D3 2.23 (Sans, Sans Condensed) +U+1d5d4 u1D5D4 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5d5 u1D5D5 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5d6 u1D5D6 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5d7 u1D5D7 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5d8 u1D5D8 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5d9 u1D5D9 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5da u1D5DA 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5db u1D5DB 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5dc u1D5DC 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5dd u1D5DD 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5de u1D5DE 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5df u1D5DF 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5e0 u1D5E0 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5e1 u1D5E1 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5e2 u1D5E2 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5e3 u1D5E3 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5e4 u1D5E4 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5e5 u1D5E5 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5e6 u1D5E6 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5e7 u1D5E7 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5e8 u1D5E8 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5e9 u1D5E9 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5ea u1D5EA 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5eb u1D5EB 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5ec u1D5EC 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5ed u1D5ED 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5ee u1D5EE 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5ef u1D5EF 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5f0 u1D5F0 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5f1 u1D5F1 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5f2 u1D5F2 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5f3 u1D5F3 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5f4 u1D5F4 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5f5 u1D5F5 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5f6 u1D5F6 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5f7 u1D5F7 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5f8 u1D5F8 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5f9 u1D5F9 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5fa u1D5FA 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5fb u1D5FB 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5fc u1D5FC 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5fd u1D5FD 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5fe u1D5FE 2.23 (Sans Bold, Sans Condensed Bold) +U+1d5ff u1D5FF 2.23 (Sans Bold, Sans Condensed Bold) +U+1d600 u1D600 2.23 (Sans Bold, Sans Condensed Bold) +U+1d601 u1D601 2.23 (Sans Bold, Sans Condensed Bold) +U+1d602 u1D602 2.23 (Sans Bold, Sans Condensed Bold) +U+1d603 u1D603 2.23 (Sans Bold, Sans Condensed Bold) +U+1d604 u1D604 2.23 (Sans Bold, Sans Condensed Bold) +U+1d605 u1D605 2.23 (Sans Bold, Sans Condensed Bold) +U+1d606 u1D606 2.23 (Sans Bold, Sans Condensed Bold) +U+1d607 u1D607 2.23 (Sans Bold, Sans Condensed Bold) +U+1d608 u1D608 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d609 u1D609 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d60a u1D60A 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d60b u1D60B 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d60c u1D60C 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d60d u1D60D 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d60e u1D60E 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d60f u1D60F 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d610 u1D610 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d611 u1D611 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d612 u1D612 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d613 u1D613 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d614 u1D614 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d615 u1D615 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d616 u1D616 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d617 u1D617 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d618 u1D618 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d619 u1D619 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d61a u1D61A 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d61b u1D61B 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d61c u1D61C 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d61d u1D61D 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d61e u1D61E 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d61f u1D61F 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d620 u1D620 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d621 u1D621 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d622 u1D622 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d623 u1D623 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d624 u1D624 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d625 u1D625 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d626 u1D626 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d627 u1D627 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d628 u1D628 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d629 u1D629 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d62a u1D62A 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d62b u1D62B 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d62c u1D62C 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d62d u1D62D 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d62e u1D62E 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d62f u1D62F 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d630 u1D630 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d631 u1D631 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d632 u1D632 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d633 u1D633 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d634 u1D634 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d635 u1D635 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d636 u1D636 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d637 u1D637 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d638 u1D638 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d639 u1D639 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d63a u1D63A 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d63b u1D63B 2.23 (Sans Condensed Oblique, Sans Oblique) +U+1d63c u1D63C 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d63d u1D63D 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d63e u1D63E 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d63f u1D63F 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d640 u1D640 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d641 u1D641 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d642 u1D642 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d643 u1D643 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d644 u1D644 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d645 u1D645 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d646 u1D646 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d647 u1D647 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d648 u1D648 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d649 u1D649 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d64a u1D64A 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d64b u1D64B 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d64c u1D64C 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d64d u1D64D 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d64e u1D64E 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d64f u1D64F 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d650 u1D650 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d651 u1D651 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d652 u1D652 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d653 u1D653 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d654 u1D654 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d655 u1D655 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d656 u1D656 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d657 u1D657 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d658 u1D658 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d659 u1D659 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d65a u1D65A 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d65b u1D65B 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d65c u1D65C 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d65d u1D65D 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d65e u1D65E 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d65f u1D65F 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d660 u1D660 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d661 u1D661 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d662 u1D662 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d663 u1D663 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d664 u1D664 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d665 u1D665 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d666 u1D666 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d667 u1D667 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d668 u1D668 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d669 u1D669 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d66a u1D66A 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d66b u1D66B 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d66c u1D66C 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d66d u1D66D 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d66e u1D66E 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d66f u1D66F 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d670 u1D670 2.23 (Sans Mono) +U+1d671 u1D671 2.23 (Sans Mono) +U+1d672 u1D672 2.23 (Sans Mono) +U+1d673 u1D673 2.23 (Sans Mono) +U+1d674 u1D674 2.23 (Sans Mono) +U+1d675 u1D675 2.23 (Sans Mono) +U+1d676 u1D676 2.23 (Sans Mono) +U+1d677 u1D677 2.23 (Sans Mono) +U+1d678 u1D678 2.23 (Sans Mono) +U+1d679 u1D679 2.23 (Sans Mono) +U+1d67a u1D67A 2.23 (Sans Mono) +U+1d67b u1D67B 2.23 (Sans Mono) +U+1d67c u1D67C 2.23 (Sans Mono) +U+1d67d u1D67D 2.23 (Sans Mono) +U+1d67e u1D67E 2.23 (Sans Mono) +U+1d67f u1D67F 2.23 (Sans Mono) +U+1d680 u1D680 2.23 (Sans Mono) +U+1d681 u1D681 2.23 (Sans Mono) +U+1d682 u1D682 2.23 (Sans Mono) +U+1d683 u1D683 2.23 (Sans Mono) +U+1d684 u1D684 2.23 (Sans Mono) +U+1d685 u1D685 2.23 (Sans Mono) +U+1d686 u1D686 2.23 (Sans Mono) +U+1d687 u1D687 2.23 (Sans Mono) +U+1d688 u1D688 2.23 (Sans Mono) +U+1d689 u1D689 2.23 (Sans Mono) +U+1d68a u1D68A 2.23 (Sans Mono) +U+1d68b u1D68B 2.23 (Sans Mono) +U+1d68c u1D68C 2.23 (Sans Mono) +U+1d68d u1D68D 2.23 (Sans Mono) +U+1d68e u1D68E 2.23 (Sans Mono) +U+1d68f u1D68F 2.23 (Sans Mono) +U+1d690 u1D690 2.23 (Sans Mono) +U+1d691 u1D691 2.23 (Sans Mono) +U+1d692 u1D692 2.23 (Sans Mono) +U+1d693 u1D693 2.23 (Sans Mono) +U+1d694 u1D694 2.23 (Sans Mono) +U+1d695 u1D695 2.23 (Sans Mono) +U+1d696 u1D696 2.23 (Sans Mono) +U+1d697 u1D697 2.23 (Sans Mono) +U+1d698 u1D698 2.23 (Sans Mono) +U+1d699 u1D699 2.23 (Sans Mono) +U+1d69a u1D69A 2.23 (Sans Mono) +U+1d69b u1D69B 2.23 (Sans Mono) +U+1d69c u1D69C 2.23 (Sans Mono) +U+1d69d u1D69D 2.23 (Sans Mono) +U+1d69e u1D69E 2.23 (Sans Mono) +U+1d69f u1D69F 2.23 (Sans Mono) +U+1d6a0 u1D6A0 2.23 (Sans Mono) +U+1d6a1 u1D6A1 2.23 (Sans Mono) +U+1d6a2 u1D6A2 2.23 (Sans Mono) +U+1d6a3 u1D6A3 2.23 (Sans Mono) +U+1d6a4 u1D6A4 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6a5 u1D6A5 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6a8 u1D6A8 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6a9 u1D6A9 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6aa u1D6AA 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6ab u1D6AB 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6ac u1D6AC 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6ad u1D6AD 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6ae u1D6AE 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6af u1D6AF 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6b0 u1D6B0 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6b1 u1D6B1 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6b2 u1D6B2 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6b3 u1D6B3 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6b4 u1D6B4 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6b5 u1D6B5 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6b6 u1D6B6 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6b7 u1D6B7 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6b8 u1D6B8 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6b9 u1D6B9 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6ba u1D6BA 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6bb u1D6BB 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6bc u1D6BC 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6bd u1D6BD 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6be u1D6BE 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6bf u1D6BF 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6c0 u1D6C0 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6c1 u1D6C1 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6c2 u1D6C2 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6c3 u1D6C3 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6c4 u1D6C4 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6c5 u1D6C5 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6c6 u1D6C6 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6c7 u1D6C7 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6c8 u1D6C8 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6c9 u1D6C9 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6ca u1D6CA 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6cb u1D6CB 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6cc u1D6CC 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6cd u1D6CD 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6ce u1D6CE 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6cf u1D6CF 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6d0 u1D6D0 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6d1 u1D6D1 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6d2 u1D6D2 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6d3 u1D6D3 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6d4 u1D6D4 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6d5 u1D6D5 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6d6 u1D6D6 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6d7 u1D6D7 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6d8 u1D6D8 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6d9 u1D6D9 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6da u1D6DA 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6db u1D6DB 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6dc u1D6DC 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6dd u1D6DD 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6de u1D6DE 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6df u1D6DF 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6e0 u1D6E0 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6e1 u1D6E1 2.23 (Serif Bold, Serif Condensed Bold) +U+1d6e2 u1D6E2 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6e3 u1D6E3 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6e4 u1D6E4 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6e5 u1D6E5 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6e6 u1D6E6 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6e7 u1D6E7 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6e8 u1D6E8 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6e9 u1D6E9 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6ea u1D6EA 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6eb u1D6EB 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6ec u1D6EC 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6ed u1D6ED 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6ee u1D6EE 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6ef u1D6EF 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6f0 u1D6F0 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6f1 u1D6F1 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6f2 u1D6F2 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6f3 u1D6F3 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6f4 u1D6F4 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6f5 u1D6F5 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6f6 u1D6F6 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6f7 u1D6F7 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6f8 u1D6F8 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6f9 u1D6F9 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6fa u1D6FA 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6fb u1D6FB 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6fc u1D6FC 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6fd u1D6FD 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6fe u1D6FE 2.23 (Serif Italic, Serif Italic Condensed) +U+1d6ff u1D6FF 2.23 (Serif Italic, Serif Italic Condensed) +U+1d700 u1D700 2.23 (Serif Italic, Serif Italic Condensed) +U+1d701 u1D701 2.23 (Serif Italic, Serif Italic Condensed) +U+1d702 u1D702 2.23 (Serif Italic, Serif Italic Condensed) +U+1d703 u1D703 2.23 (Serif Italic, Serif Italic Condensed) +U+1d704 u1D704 2.23 (Serif Italic, Serif Italic Condensed) +U+1d705 u1D705 2.23 (Serif Italic, Serif Italic Condensed) +U+1d706 u1D706 2.23 (Serif Italic, Serif Italic Condensed) +U+1d707 u1D707 2.23 (Serif Italic, Serif Italic Condensed) +U+1d708 u1D708 2.23 (Serif Italic, Serif Italic Condensed) +U+1d709 u1D709 2.23 (Serif Italic, Serif Italic Condensed) +U+1d70a u1D70A 2.23 (Serif Italic, Serif Italic Condensed) +U+1d70b u1D70B 2.23 (Serif Italic, Serif Italic Condensed) +U+1d70c u1D70C 2.23 (Serif Italic, Serif Italic Condensed) +U+1d70d u1D70D 2.23 (Serif Italic, Serif Italic Condensed) +U+1d70e u1D70E 2.23 (Serif Italic, Serif Italic Condensed) +U+1d70f u1D70F 2.23 (Serif Italic, Serif Italic Condensed) +U+1d710 u1D710 2.23 (Serif Italic, Serif Italic Condensed) +U+1d711 u1D711 2.23 (Serif Italic, Serif Italic Condensed) +U+1d712 u1D712 2.23 (Serif Italic, Serif Italic Condensed) +U+1d713 u1D713 2.23 (Serif Italic, Serif Italic Condensed) +U+1d714 u1D714 2.23 (Serif Italic, Serif Italic Condensed) +U+1d715 u1D715 2.23 (Serif Italic, Serif Italic Condensed) +U+1d716 u1D716 2.23 (Serif Italic, Serif Italic Condensed) +U+1d717 u1D717 2.23 (Serif Italic, Serif Italic Condensed) +U+1d718 u1D718 2.23 (Serif Italic, Serif Italic Condensed) +U+1d719 u1D719 2.23 (Serif Italic, Serif Italic Condensed) +U+1d71a u1D71A 2.23 (Serif Italic, Serif Italic Condensed) +U+1d71b u1D71B 2.23 (Serif Italic, Serif Italic Condensed) +U+1d71c u1D71C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d71d u1D71D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d71e u1D71E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d71f u1D71F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d720 u1D720 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d721 u1D721 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d722 u1D722 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d723 u1D723 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d724 u1D724 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d725 u1D725 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d726 u1D726 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d727 u1D727 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d728 u1D728 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d729 u1D729 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d72a u1D72A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d72b u1D72B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d72c u1D72C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d72d u1D72D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d72e u1D72E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d72f u1D72F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d730 u1D730 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d731 u1D731 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d732 u1D732 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d733 u1D733 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d734 u1D734 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d735 u1D735 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d736 u1D736 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d737 u1D737 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d738 u1D738 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d739 u1D739 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d73a u1D73A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d73b u1D73B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d73c u1D73C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d73d u1D73D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d73e u1D73E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d73f u1D73F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d740 u1D740 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d741 u1D741 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d742 u1D742 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d743 u1D743 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d744 u1D744 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d745 u1D745 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d746 u1D746 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d747 u1D747 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d748 u1D748 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d749 u1D749 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d74a u1D74A 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d74b u1D74B 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d74c u1D74C 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d74d u1D74D 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d74e u1D74E 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d74f u1D74F 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d750 u1D750 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d751 u1D751 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d752 u1D752 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d753 u1D753 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d754 u1D754 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d755 u1D755 2.23 (Serif Bold Italic, Serif Condensed Bold Italic) +U+1d756 u1D756 2.23 (Sans Bold, Sans Condensed Bold) +U+1d757 u1D757 2.23 (Sans Bold, Sans Condensed Bold) +U+1d758 u1D758 2.23 (Sans Bold, Sans Condensed Bold) +U+1d759 u1D759 2.23 (Sans Bold, Sans Condensed Bold) +U+1d75a u1D75A 2.23 (Sans Bold, Sans Condensed Bold) +U+1d75b u1D75B 2.23 (Sans Bold, Sans Condensed Bold) +U+1d75c u1D75C 2.23 (Sans Bold, Sans Condensed Bold) +U+1d75d u1D75D 2.23 (Sans Bold, Sans Condensed Bold) +U+1d75e u1D75E 2.23 (Sans Bold, Sans Condensed Bold) +U+1d75f u1D75F 2.23 (Sans Bold, Sans Condensed Bold) +U+1d760 u1D760 2.23 (Sans Bold, Sans Condensed Bold) +U+1d761 u1D761 2.23 (Sans Bold, Sans Condensed Bold) +U+1d762 u1D762 2.23 (Sans Bold, Sans Condensed Bold) +U+1d763 u1D763 2.23 (Sans Bold, Sans Condensed Bold) +U+1d764 u1D764 2.23 (Sans Bold, Sans Condensed Bold) +U+1d765 u1D765 2.23 (Sans Bold, Sans Condensed Bold) +U+1d766 u1D766 2.23 (Sans Bold, Sans Condensed Bold) +U+1d767 u1D767 2.23 (Sans Bold, Sans Condensed Bold) +U+1d768 u1D768 2.23 (Sans Bold, Sans Condensed Bold) +U+1d769 u1D769 2.23 (Sans Bold, Sans Condensed Bold) +U+1d76a u1D76A 2.23 (Sans Bold, Sans Condensed Bold) +U+1d76b u1D76B 2.23 (Sans Bold, Sans Condensed Bold) +U+1d76c u1D76C 2.23 (Sans Bold, Sans Condensed Bold) +U+1d76d u1D76D 2.23 (Sans Bold, Sans Condensed Bold) +U+1d76e u1D76E 2.23 (Sans Bold, Sans Condensed Bold) +U+1d76f u1D76F 2.23 (Sans Bold, Sans Condensed Bold) +U+1d770 u1D770 2.23 (Sans Bold, Sans Condensed Bold) +U+1d771 u1D771 2.23 (Sans Bold, Sans Condensed Bold) +U+1d772 u1D772 2.23 (Sans Bold, Sans Condensed Bold) +U+1d773 u1D773 2.23 (Sans Bold, Sans Condensed Bold) +U+1d774 u1D774 2.23 (Sans Bold, Sans Condensed Bold) +U+1d775 u1D775 2.23 (Sans Bold, Sans Condensed Bold) +U+1d776 u1D776 2.23 (Sans Bold, Sans Condensed Bold) +U+1d777 u1D777 2.23 (Sans Bold, Sans Condensed Bold) +U+1d778 u1D778 2.23 (Sans Bold, Sans Condensed Bold) +U+1d779 u1D779 2.23 (Sans Bold, Sans Condensed Bold) +U+1d77a u1D77A 2.23 (Sans Bold, Sans Condensed Bold) +U+1d77b u1D77B 2.23 (Sans Bold, Sans Condensed Bold) +U+1d77c u1D77C 2.23 (Sans Bold, Sans Condensed Bold) +U+1d77d u1D77D 2.23 (Sans Bold, Sans Condensed Bold) +U+1d77e u1D77E 2.23 (Sans Bold, Sans Condensed Bold) +U+1d77f u1D77F 2.23 (Sans Bold, Sans Condensed Bold) +U+1d780 u1D780 2.23 (Sans Bold, Sans Condensed Bold) +U+1d781 u1D781 2.23 (Sans Bold, Sans Condensed Bold) +U+1d782 u1D782 2.23 (Sans Bold, Sans Condensed Bold) +U+1d783 u1D783 2.23 (Sans Bold, Sans Condensed Bold) +U+1d784 u1D784 2.23 (Sans Bold, Sans Condensed Bold) +U+1d785 u1D785 2.23 (Sans Bold, Sans Condensed Bold) +U+1d786 u1D786 2.23 (Sans Bold, Sans Condensed Bold) +U+1d787 u1D787 2.23 (Sans Bold, Sans Condensed Bold) +U+1d788 u1D788 2.23 (Sans Bold, Sans Condensed Bold) +U+1d789 u1D789 2.23 (Sans Bold, Sans Condensed Bold) +U+1d78a u1D78A 2.23 (Sans Bold, Sans Condensed Bold) +U+1d78b u1D78B 2.23 (Sans Bold, Sans Condensed Bold) +U+1d78c u1D78C 2.23 (Sans Bold, Sans Condensed Bold) +U+1d78d u1D78D 2.23 (Sans Bold, Sans Condensed Bold) +U+1d78e u1D78E 2.23 (Sans Bold, Sans Condensed Bold) +U+1d78f u1D78F 2.23 (Sans Bold, Sans Condensed Bold) +U+1d790 u1D790 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d791 u1D791 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d792 u1D792 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d793 u1D793 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d794 u1D794 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d795 u1D795 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d796 u1D796 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d797 u1D797 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d798 u1D798 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d799 u1D799 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d79a u1D79A 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d79b u1D79B 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d79c u1D79C 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d79d u1D79D 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d79e u1D79E 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d79f u1D79F 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a0 u1D7A0 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a1 u1D7A1 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a2 u1D7A2 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a3 u1D7A3 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a4 u1D7A4 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a5 u1D7A5 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a6 u1D7A6 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a7 u1D7A7 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a8 u1D7A8 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7a9 u1D7A9 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7aa u1D7AA 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7ab u1D7AB 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7ac u1D7AC 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7ad u1D7AD 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7ae u1D7AE 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7af u1D7AF 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b0 u1D7B0 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b1 u1D7B1 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b2 u1D7B2 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b3 u1D7B3 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b4 u1D7B4 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b5 u1D7B5 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b6 u1D7B6 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b7 u1D7B7 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b8 u1D7B8 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7b9 u1D7B9 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7ba u1D7BA 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7bb u1D7BB 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7bc u1D7BC 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7bd u1D7BD 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7be u1D7BE 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7bf u1D7BF 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c0 u1D7C0 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c1 u1D7C1 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c2 u1D7C2 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c3 u1D7C3 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c4 u1D7C4 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c5 u1D7C5 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c6 u1D7C6 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c7 u1D7C7 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c8 u1D7C8 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7c9 u1D7C9 2.23 (Sans Bold Oblique, Sans Condensed Bold Oblique) +U+1d7ca u1D7CA 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7cb u1D7CB 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7ce u1D7CE 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7cf u1D7CF 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7d0 u1D7D0 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7d1 u1D7D1 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7d2 u1D7D2 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7d3 u1D7D3 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7d4 u1D7D4 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7d5 u1D7D5 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7d6 u1D7D6 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7d7 u1D7D7 2.23 (Serif Bold, Serif Condensed Bold) +U+1d7d8 u1D7D8 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+1d7d9 u1D7D9 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+1d7da u1D7DA 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+1d7db u1D7DB 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+1d7dc u1D7DC 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+1d7dd u1D7DD 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+1d7de u1D7DE 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+1d7df u1D7DF 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+1d7e0 u1D7E0 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+1d7e1 u1D7E1 2.22 (Serif, Serif Condensed) 2.29 (Sans, Sans Bold Oblique, Sans Condensed, Sans Condensed Bold, Sans Condensed Bold Oblique, Sans Condensed Oblique, Sans Oblique) 2.30 (Sans Bold) +U+1d7e2 u1D7E2 2.23 (Sans, Sans Condensed) +U+1d7e3 u1D7E3 2.23 (Sans, Sans Condensed) +U+1d7e4 u1D7E4 2.23 (Sans, Sans Condensed) +U+1d7e5 u1D7E5 2.23 (Sans, Sans Condensed) +U+1d7e6 u1D7E6 2.23 (Sans, Sans Condensed) +U+1d7e7 u1D7E7 2.23 (Sans, Sans Condensed) +U+1d7e8 u1D7E8 2.23 (Sans, Sans Condensed) +U+1d7e9 u1D7E9 2.23 (Sans, Sans Condensed) +U+1d7ea u1D7EA 2.23 (Sans, Sans Condensed) +U+1d7eb u1D7EB 2.23 (Sans, Sans Condensed) +U+1d7ec u1D7EC 2.23 (Sans Bold, Sans Condensed Bold) +U+1d7ed u1D7ED 2.23 (Sans Bold, Sans Condensed Bold) +U+1d7ee u1D7EE 2.23 (Sans Bold, Sans Condensed Bold) +U+1d7ef u1D7EF 2.23 (Sans Bold, Sans Condensed Bold) +U+1d7f0 u1D7F0 2.23 (Sans Bold, Sans Condensed Bold) +U+1d7f1 u1D7F1 2.23 (Sans Bold, Sans Condensed Bold) +U+1d7f2 u1D7F2 2.23 (Sans Bold, Sans Condensed Bold) +U+1d7f3 u1D7F3 2.23 (Sans Bold, Sans Condensed Bold) +U+1d7f4 u1D7F4 2.23 (Sans Bold, Sans Condensed Bold) +U+1d7f5 u1D7F5 2.23 (Sans Bold, Sans Condensed Bold) +U+1d7f6 u1D7F6 2.23 (Sans Mono) +U+1d7f7 u1D7F7 2.23 (Sans Mono) +U+1d7f8 u1D7F8 2.23 (Sans Mono) +U+1d7f9 u1D7F9 2.23 (Sans Mono) +U+1d7fa u1D7FA 2.23 (Sans Mono) +U+1d7fb u1D7FB 2.23 (Sans Mono) +U+1d7fc u1D7FC 2.23 (Sans Mono) +U+1d7fd u1D7FD 2.23 (Sans Mono) +U+1d7fe u1D7FE 2.23 (Sans Mono) +U+1d7ff u1D7FF 2.23 (Sans Mono) diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/unicover.txt b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/unicover.txt new file mode 100644 index 0000000..bd467ab --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavu-fonts-ttf-2.30/unicover.txt @@ -0,0 +1,177 @@ +This is the Unicode coverage file for DejaVu fonts +($Id$) + +Control and similar characters are discounted from totals. + + Sans Serif Sans Mono +U+0000 Basic Latin 100% (95/95) 100% (95/95) 100% (95/95) +U+0080 Latin-1 Supplement 100% (96/96) 100% (96/96) 100% (96/96) +U+0100 Latin Extended-A 100% (128/128) 100% (128/128) 100% (128/128) +U+0180 Latin Extended-B 100% (208/208) 91% (191/208) 86% (179/208) +U+0250 IPA Extensions 100% (96/96) 100% (96/96) 100% (96/96) +U+02b0 Spacing Modifier Letters 78% (63/80) 56% (45/80) 60% (48/80) +U+0300 Combining Diacritical Marks 83% (93/112) 60% (68/112) 59% (67/112) +U+0370 Greek and Coptic 100% (134/134) 85% (115/134) 82% (110/134) +U+0400 Cyrillic 100% (256/256) 78% (200/256) 69% (178/256) +U+0500 Cyrillic Supplement 94% (34/36) 27% (10/36) 16% (6/36) +U+0530 Armenian 100% (86/86) (0/86) (0/86) +U+0590 Hebrew 62% (54/87) (0/87) (0/87) +U+0600 Arabic 46% (115/250) (0/250) 39% (99/250) +U+0700 Syriac (0/77) (0/77) (0/77) +U+0750 Arabic Supplement (0/48) (0/48) (0/48) +U+0780 Thaana (0/50) (0/50) (0/50) +U+07c0 NKo 91% (54/59) (0/59) (0/59) +U+0900 Devanagari (0/113) (0/113) (0/113) +U+0980 Bengali (0/91) (0/91) (0/91) +U+0a00 Gurmukhi (0/79) (0/79) (0/79) +U+0a80 Gujarati (0/83) (0/83) (0/83) +U+0b00 Oriya (0/84) (0/84) (0/84) +U+0b80 Tamil (0/72) (0/72) (0/72) +U+0c00 Telugu (0/93) (0/93) (0/93) +U+0c80 Kannada (0/86) (0/86) (0/86) +U+0d00 Malayalam (0/95) (0/95) (0/95) +U+0d80 Sinhala (0/80) (0/80) (0/80) +U+0e00 Thai 1% (1/87) (0/87) (0/87) +U+0e80 Lao 100% (65/65) (0/65) 70% (46/65) +U+0f00 Tibetan (0/201) (0/201) (0/201) +U+1000 Myanmar (0/156) (0/156) (0/156) +U+10a0 Georgian 100% (83/83) 100% (83/83) 54% (45/83) +U+1100 Hangul Jamo (0/240) (0/240) (0/240) +U+1200 Ethiopic (0/356) (0/356) (0/356) +U+1380 Ethiopic Supplement (0/26) (0/26) (0/26) +U+13a0 Cherokee (0/85) (0/85) (0/85) +U+1400 Unified Canadian Aboriginal Syllabics 64% (404/630) (0/630) (0/630) +U+1680 Ogham 100% (29/29) (0/29) (0/29) +U+16a0 Runic (0/81) (0/81) (0/81) +U+1700 Tagalog (0/20) (0/20) (0/20) +U+1720 Hanunoo (0/23) (0/23) (0/23) +U+1740 Buhid (0/20) (0/20) (0/20) +U+1760 Tagbanwa (0/18) (0/18) (0/18) +U+1780 Khmer (0/114) (0/114) (0/114) +U+1800 Mongolian (0/156) (0/156) (0/156) +U+1900 Limbu (0/66) (0/66) (0/66) +U+1950 Tai Le (0/35) (0/35) (0/35) +U+1980 New Tai Lue (0/80) (0/80) (0/80) +U+19e0 Khmer Symbols (0/32) (0/32) (0/32) +U+1a00 Buginese (0/30) (0/30) (0/30) +U+1b00 Balinese (0/121) (0/121) (0/121) +U+1b80 Sundanese (0/55) (0/55) (0/55) +U+1c00 Lepcha (0/74) (0/74) (0/74) +U+1c50 Ol Chiki (0/48) (0/48) (0/48) +U+1d00 Phonetic Extensions 82% (105/128) 48% (62/128) 48% (62/128) +U+1d80 Phonetic Extensions Supplement 59% (38/64) 57% (37/64) 57% (37/64) +U+1dc0 Combining Diacritical Marks Supplement 14% (6/41) 14% (6/41) (0/41) +U+1e00 Latin Extended Additional 96% (248/256) 76% (196/256) 71% (182/256) +U+1f00 Greek Extended 100% (233/233) 100% (233/233) 100% (233/233) +U+2000 General Punctuation 98% (105/107) 81% (87/107) 47% (51/107) +U+2070 Superscripts and Subscripts 100% (34/34) 100% (34/34) 100% (34/34) +U+20a0 Currency Symbols 100% (22/22) 27% (6/22) 100% (22/22) +U+20d0 Combining Diacritical Marks for Symbols 21% (7/33) (0/33) (0/33) +U+2100 Letterlike Symbols 93% (75/80) 40% (32/80) 21% (17/80) +U+2150 Number Forms 92% (50/54) 92% (50/54) 24% (13/54) +U+2190 Arrows 100% (112/112) 100% (112/112) 100% (112/112) +U+2200 Mathematical Operators 100% (256/256) 39% (100/256) 58% (151/256) +U+2300 Miscellaneous Technical 27% (64/232) 6% (16/232) 50% (117/232) +U+2400 Control Pictures 5% (2/39) 2% (1/39) 2% (1/39) +U+2440 Optical Character Recognition (0/11) (0/11) (0/11) +U+2460 Enclosed Alphanumerics 6% (10/160) (0/160) (0/160) +U+2500 Box Drawing 100% (128/128) 100% (128/128) 100% (128/128) +U+2580 Block Elements 100% (32/32) 100% (32/32) 100% (32/32) +U+25a0 Geometric Shapes 100% (96/96) 100% (96/96) 100% (96/96) +U+2600 Miscellaneous Symbols 95% (182/191) 15% (30/191) 78% (149/191) +U+2700 Dingbats 100% (174/174) 0% (1/174) 82% (144/174) +U+27c0 Miscellaneous Mathematical Symbols-A 20% (9/44) 11% (5/44) 11% (5/44) +U+27f0 Supplemental Arrows-A 100% (16/16) 100% (16/16) (0/16) +U+2800 Braille Patterns 100% (256/256) 100% (256/256) (0/256) +U+2900 Supplemental Arrows-B 4% (6/128) 100% (128/128) (0/128) +U+2980 Miscellaneous Mathematical Symbols-B 10% (13/128) 0% (1/128) 2% (3/128) +U+2a00 Supplemental Mathematical Operators 28% (72/256) 1% (4/256) 0% (1/256) +U+2b00 Miscellaneous Symbols and Arrows 42% (35/82) 32% (27/82) 10% (9/82) +U+2c00 Glagolitic (0/94) (0/94) (0/94) +U+2c60 Latin Extended-C 96% (28/29) 55% (16/29) 34% (10/29) +U+2c80 Coptic (0/114) (0/114) (0/114) +U+2d00 Georgian Supplement (0/38) 100% (38/38) (0/38) +U+2d30 Tifinagh 100% (55/55) (0/55) (0/55) +U+2d80 Ethiopic Extended (0/79) (0/79) (0/79) +U+2de0 Cyrillic Extended-A (0/32) (0/32) (0/32) +U+2e00 Supplemental Punctuation 12% (6/49) 12% (6/49) 12% (6/49) +U+2e80 CJK Radicals Supplement (0/115) (0/115) (0/115) +U+2f00 Kangxi Radicals (0/214) (0/214) (0/214) +U+2ff0 Ideographic Description Characters (0/12) (0/12) (0/12) +U+3000 CJK Symbols and Punctuation (0/64) (0/64) (0/64) +U+3040 Hiragana (0/93) (0/93) (0/93) +U+30a0 Katakana (0/96) (0/96) (0/96) +U+3100 Bopomofo (0/41) (0/41) (0/41) +U+3130 Hangul Compatibility Jamo (0/94) (0/94) (0/94) +U+3190 Kanbun (0/16) (0/16) (0/16) +U+31a0 Bopomofo Extended (0/24) (0/24) (0/24) +U+31c0 CJK Strokes (0/36) (0/36) (0/36) +U+31f0 Katakana Phonetic Extensions (0/16) (0/16) (0/16) +U+3200 Enclosed CJK Letters and Months (0/242) (0/242) (0/242) +U+3300 CJK Compatibility (0/256) (0/256) (0/256) +U+3400 CJK Unified Ideographs Extension A (0/0) (0/0) (0/0) +U+4dc0 Yijing Hexagram Symbols 100% (64/64) (0/64) (0/64) +U+4e00 CJK Unified Ideographs (0/0) (0/0) (0/0) +U+a000 Yi Syllables (0/1165) (0/1165) (0/1165) +U+a490 Yi Radicals (0/55) (0/55) (0/55) +U+a500 Vai (0/300) (0/300) (0/300) +U+a640 Cyrillic Extended-B 39% (31/78) 12% (10/78) (0/78) +U+a700 Modifier Tone Letters 62% (20/32) 62% (20/32) 62% (20/32) +U+a720 Latin Extended-D 37% (43/114) 1% (2/114) 5% (6/114) +U+a800 Syloti Nagri (0/44) (0/44) (0/44) +U+a840 Phags-pa (0/56) (0/56) (0/56) +U+a880 Saurashtra (0/81) (0/81) (0/81) +U+a900 Kayah Li (0/48) (0/48) (0/48) +U+a930 Rejang (0/37) (0/37) (0/37) +U+aa00 Cham (0/83) (0/83) (0/83) +U+ac00 Hangul Syllables (0/0) (0/0) (0/0) +U+d800 High Surrogates (0/0) (0/0) (0/0) +U+db80 High Private Use Surrogates (0/0) (0/0) (0/0) +U+dc00 Low Surrogates (0/0) (0/0) (0/0) +U+e000 Private Use Area (0/0) (0/0) (0/0) +U+f900 CJK Compatibility Ideographs (0/467) (0/467) (0/467) +U+fb00 Alphabetic Presentation Forms 100% (58/58) 12% (7/58) 3% (2/58) +U+fb50 Arabic Presentation Forms-A 11% (70/595) (0/595) 12% (72/595) +U+fe00 Variation Selectors 100% (16/16) 100% (16/16) (0/16) +U+fe10 Vertical Forms (0/10) (0/10) (0/10) +U+fe20 Combining Half Marks 57% (4/7) (0/7) (0/7) +U+fe30 CJK Compatibility Forms (0/32) (0/32) (0/32) +U+fe50 Small Form Variants (0/26) (0/26) (0/26) +U+fe70 Arabic Presentation Forms-B 100% (141/141) (0/141) 100% (141/141) +U+ff00 Halfwidth and Fullwidth Forms (0/225) (0/225) (0/225) +U+fff0 Specials 100% (5/5) 100% (5/5) 100% (5/5) +U+10000 Linear B Syllabary (0/88) (0/88) (0/88) +U+10080 Linear B Ideograms (0/123) (0/123) (0/123) +U+10100 Aegean Numbers (0/57) (0/57) (0/57) +U+10140 Ancient Greek Numbers (0/75) (0/75) (0/75) +U+10190 Ancient Symbols (0/12) (0/12) (0/12) +U+101d0 Phaistos Disc (0/46) (0/46) (0/46) +U+10280 Lycian (0/29) (0/29) (0/29) +U+102a0 Carian (0/49) (0/49) (0/49) +U+10300 Old Italic (0/35) (0/35) (0/35) +U+10330 Gothic (0/27) (0/27) (0/27) +U+10380 Ugaritic (0/31) (0/31) (0/31) +U+103a0 Old Persian (0/50) (0/50) (0/50) +U+10400 Deseret (0/80) (0/80) (0/80) +U+10450 Shavian (0/48) (0/48) (0/48) +U+10480 Osmanya (0/40) (0/40) (0/40) +U+10800 Cypriot Syllabary (0/55) (0/55) (0/55) +U+10900 Phoenician (0/27) (0/27) (0/27) +U+10920 Lydian (0/27) (0/27) (0/27) +U+10a00 Kharoshthi (0/65) (0/65) (0/65) +U+12000 Cuneiform (0/879) (0/879) (0/879) +U+12400 Cuneiform Numbers and Punctuation (0/103) (0/103) (0/103) +U+1d000 Byzantine Musical Symbols (0/246) (0/246) (0/246) +U+1d100 Musical Symbols (0/220) (0/220) (0/220) +U+1d200 Ancient Greek Musical Notation (0/70) (0/70) (0/70) +U+1d300 Tai Xuan Jing Symbols 100% (87/87) (0/87) (0/87) +U+1d360 Counting Rod Numerals (0/18) (0/18) (0/18) +U+1d400 Mathematical Alphanumeric Symbols 11% (117/996) 5% (55/996) 6% (62/996) +U+1f000 Mahjong Tiles (0/44) (0/44) (0/44) +U+1f030 Domino Tiles (0/100) (0/100) (0/100) +U+20000 CJK Unified Ideographs Extension B (0/0) (0/0) (0/0) +U+2f800 CJK Compatibility Ideographs Supplement (0/542) (0/542) (0/542) +U+e0000 Tags (0/98) (0/98) (0/98) +U+e0100 Variation Selectors Supplement (0/240) (0/240) (0/240) +U+f0000 Supplementary Private Use Area-A (0/0) (0/0) (0/0) +U+100000 Supplementary Private Use Area-B (0/0) (0/0) (0/0) diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusans.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusans.ctg.z new file mode 100644 index 0000000..3170ea6 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusans.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusans.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusans.php new file mode 100644 index 0000000..0a34caf --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusans.php @@ -0,0 +1,517 @@ +<?php +$type='TrueTypeUnicode'; +$name='DejaVuSans'; +$desc=array('Ascent'=>928,'Descent'=>-236,'CapHeight'=>30,'Flags'=>96,'FontBBox'=>'[-1021 -350 1681 1167]','ItalicAngle'=>20.8,'StemV'=>70,'MissingWidth'=>600); +$up=-63; +$ut=44; +$dw=600; +$cw=array( +0=>600,32=>318,33=>401,34=>460,35=>838,36=>636,37=>950,38=>780,39=>275,40=>390, +41=>390,42=>500,43=>838,44=>318,45=>361,46=>318,47=>337,48=>636,49=>636,50=>636, +51=>636,52=>636,53=>636,54=>636,55=>636,56=>636,57=>636,58=>337,59=>337,60=>838, +61=>838,62=>838,63=>531,64=>1000,65=>684,66=>686,67=>698,68=>770,69=>632,70=>575, +71=>775,72=>752,73=>295,74=>295,75=>656,76=>557,77=>863,78=>748,79=>787,80=>603, +81=>787,82=>695,83=>635,84=>611,85=>732,86=>684,87=>989,88=>685,89=>611,90=>685, +91=>390,92=>337,93=>390,94=>838,95=>500,96=>500,97=>613,98=>635,99=>550,100=>635, +101=>615,102=>352,103=>635,104=>634,105=>278,106=>278,107=>579,108=>278,109=>974,110=>634, +111=>612,112=>635,113=>635,114=>411,115=>521,116=>392,117=>634,118=>592,119=>818,120=>592, +121=>592,122=>525,123=>636,124=>337,125=>636,126=>838,8364=>636,8218=>318,402=>352,8222=>518, +8230=>1000,8224=>500,8225=>500,710=>500,8240=>1342,352=>635,8249=>400,338=>1070,381=>685,8216=>318, +8217=>318,8220=>518,8221=>518,8226=>590,8211=>500,8212=>1000,732=>500,8482=>1000,353=>521,8250=>400, +339=>1023,382=>525,376=>611,160=>318,161=>401,162=>636,163=>636,164=>636,165=>636,166=>337, +167=>500,168=>500,169=>1000,170=>471,171=>612,172=>838,173=>361,174=>1000,175=>500,176=>500, +177=>838,178=>401,179=>401,180=>500,181=>636,182=>636,183=>318,184=>500,185=>401,186=>471, +187=>612,188=>969,189=>969,190=>969,191=>531,192=>684,193=>684,194=>684,195=>684,196=>684, +197=>684,198=>974,199=>698,200=>632,201=>632,202=>632,203=>632,204=>295,205=>295,206=>295, +207=>295,208=>775,209=>748,210=>787,211=>787,212=>787,213=>787,214=>787,215=>838,216=>787, +217=>732,218=>732,219=>732,220=>732,221=>611,222=>605,223=>630,224=>613,225=>613,226=>613, +227=>613,228=>613,229=>613,230=>982,231=>550,232=>615,233=>615,234=>615,235=>615,236=>278, +237=>278,238=>278,239=>278,240=>612,241=>634,242=>612,243=>612,244=>612,245=>612,246=>612, +247=>838,248=>612,249=>634,250=>634,251=>634,252=>634,253=>592,254=>635,255=>592,256=>684, +257=>613,258=>684,259=>613,260=>684,261=>613,262=>698,263=>550,264=>698,265=>550,266=>698, +267=>550,268=>698,269=>550,270=>770,271=>635,272=>775,273=>635,274=>632,275=>615,276=>632, +277=>615,278=>632,279=>615,280=>632,281=>615,282=>632,283=>615,284=>775,285=>635,286=>775, +287=>635,288=>775,289=>635,290=>775,291=>635,292=>752,293=>634,294=>916,295=>695,296=>295, +297=>278,298=>295,299=>278,300=>295,301=>278,302=>295,303=>278,304=>295,305=>278,306=>590, +307=>556,308=>295,309=>278,310=>656,311=>579,312=>579,313=>557,314=>278,315=>557,316=>278, +317=>557,318=>375,319=>557,320=>342,321=>562,322=>284,323=>748,324=>634,325=>748,326=>634, +327=>748,328=>634,329=>813,330=>748,331=>634,332=>787,333=>612,334=>787,335=>612,336=>787, +337=>612,340=>695,341=>411,342=>695,343=>411,344=>695,345=>411,346=>635,347=>521,348=>635, +349=>521,350=>635,351=>521,354=>611,355=>392,356=>611,357=>392,358=>611,359=>392,360=>732, +361=>634,362=>732,363=>634,364=>732,365=>634,366=>732,367=>634,368=>732,369=>634,370=>732, +371=>634,372=>989,373=>818,374=>611,375=>592,377=>685,378=>525,379=>685,380=>525,383=>352, +384=>635,385=>735,386=>686,387=>635,388=>686,389=>635,390=>703,391=>698,392=>550,393=>775, +394=>819,395=>686,396=>635,397=>612,398=>632,399=>787,400=>614,401=>575,403=>775,404=>687, +405=>984,406=>354,407=>295,408=>746,409=>579,410=>278,411=>592,412=>974,413=>748,414=>634, +415=>787,416=>913,417=>612,418=>949,419=>759,420=>652,421=>635,422=>695,423=>635,424=>521, +425=>632,426=>336,427=>392,428=>611,429=>392,430=>611,431=>858,432=>634,433=>764,434=>721, +435=>744,436=>730,437=>685,438=>525,439=>666,440=>666,441=>578,442=>525,443=>636,444=>666, +445=>578,446=>510,447=>635,448=>295,449=>492,450=>459,451=>295,452=>1422,453=>1299,454=>1154, +455=>835,456=>787,457=>457,458=>931,459=>924,460=>797,461=>684,462=>613,463=>295,464=>278, +465=>787,466=>612,467=>732,468=>634,469=>732,470=>634,471=>732,472=>634,473=>732,474=>634, +475=>732,476=>634,477=>615,478=>684,479=>613,480=>684,481=>613,482=>974,483=>982,484=>775, +485=>635,486=>775,487=>635,488=>656,489=>579,490=>787,491=>612,492=>787,493=>612,494=>666, +495=>578,496=>278,497=>1422,498=>1299,499=>1154,500=>775,501=>635,502=>1113,503=>682,504=>748, +505=>634,506=>684,507=>613,508=>974,509=>982,510=>787,511=>612,512=>684,513=>613,514=>684, +515=>613,516=>632,517=>615,518=>632,519=>615,520=>295,521=>278,522=>295,523=>278,524=>787, +525=>612,526=>787,527=>612,528=>695,529=>411,530=>695,531=>411,532=>732,533=>634,534=>732, +535=>634,536=>635,537=>521,538=>611,539=>392,540=>627,541=>521,542=>752,543=>634,544=>735, +545=>838,546=>698,547=>610,548=>685,549=>525,550=>684,551=>613,552=>632,553=>615,554=>787, +555=>612,556=>787,557=>612,558=>787,559=>612,560=>787,561=>612,562=>611,563=>592,564=>475, +565=>843,566=>477,567=>278,568=>998,569=>998,570=>684,571=>698,572=>550,573=>557,574=>611, +575=>521,576=>525,577=>603,578=>479,579=>686,580=>732,581=>684,582=>632,583=>615,584=>295, +585=>278,586=>781,587=>635,588=>695,589=>411,590=>611,591=>592,592=>600,593=>635,594=>635, +595=>635,596=>549,597=>550,598=>635,599=>696,600=>615,601=>615,602=>819,603=>541,604=>532, +605=>775,606=>664,607=>278,608=>696,609=>635,610=>629,611=>596,612=>596,613=>634,614=>634, +615=>634,616=>278,617=>338,618=>372,619=>396,620=>487,621=>278,622=>706,623=>974,624=>974, +625=>974,626=>646,627=>642,628=>634,629=>612,630=>858,631=>728,632=>660,633=>414,634=>414, +635=>414,636=>411,637=>411,638=>530,639=>530,640=>604,641=>604,642=>521,643=>336,644=>336, +645=>461,646=>336,647=>392,648=>392,649=>634,650=>618,651=>598,652=>592,653=>818,654=>592, +655=>611,656=>525,657=>525,658=>578,659=>578,660=>510,661=>510,662=>510,663=>510,664=>787, +665=>580,666=>664,667=>708,668=>654,669=>292,670=>667,671=>507,672=>727,673=>510,674=>510, +675=>1014,676=>1058,677=>1013,678=>824,679=>610,680=>778,681=>848,682=>641,683=>654,684=>515, +685=>515,686=>661,687=>664,688=>404,689=>399,690=>175,691=>259,692=>295,693=>296,694=>379, +695=>515,696=>373,697=>278,698=>460,699=>318,700=>318,701=>318,702=>307,703=>307,704=>370, +705=>370,706=>500,707=>500,708=>500,709=>500,711=>500,712=>275,713=>500,714=>500,715=>500, +716=>275,717=>500,718=>500,719=>500,720=>337,721=>337,722=>307,723=>307,724=>500,725=>500, +726=>390,727=>317,728=>500,729=>500,730=>500,731=>500,733=>500,734=>315,735=>500,736=>426, +737=>166,738=>373,739=>444,740=>370,741=>493,742=>493,743=>493,744=>493,745=>493,748=>500, +749=>500,750=>518,755=>500,759=>500,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0, +774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0, +784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0, +794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0, +804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0, +814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0, +824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0, +834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0, +844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0, +860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>654,881=>568,882=>862, +883=>647,884=>278,885=>278,886=>748,887=>650,890=>500,891=>549,892=>550,893=>549,894=>337, +900=>500,901=>500,902=>692,903=>318,904=>746,905=>871,906=>408,908=>813,910=>825,911=>826, +912=>338,913=>684,914=>686,915=>557,916=>684,917=>632,918=>685,919=>752,920=>787,921=>295, +922=>656,923=>684,924=>863,925=>748,926=>632,927=>787,928=>752,929=>603,931=>632,932=>611, +933=>611,934=>787,935=>685,936=>787,937=>764,938=>295,939=>611,940=>659,941=>541,942=>634, +943=>338,944=>579,945=>659,946=>638,947=>592,948=>612,949=>541,950=>544,951=>634,952=>612, +953=>338,954=>589,955=>592,956=>636,957=>559,958=>558,959=>612,960=>602,961=>635,962=>587, +963=>634,964=>602,965=>579,966=>660,967=>578,968=>660,969=>837,970=>338,971=>579,972=>612, +973=>579,974=>837,975=>656,976=>614,977=>619,978=>699,979=>842,980=>699,981=>660,982=>837, +983=>664,984=>787,985=>612,986=>648,987=>587,988=>575,989=>458,990=>660,991=>660,992=>865, +993=>627,994=>934,995=>837,996=>758,997=>659,998=>792,999=>615,1000=>687,1001=>607,1002=>768, +1003=>625,1004=>699,1005=>612,1006=>611,1007=>536,1008=>664,1009=>635,1010=>550,1011=>278,1012=>787, +1013=>615,1014=>615,1015=>605,1016=>635,1017=>698,1018=>863,1019=>651,1020=>635,1021=>703,1022=>698, +1023=>703,1024=>632,1025=>632,1026=>786,1027=>610,1028=>698,1029=>635,1030=>295,1031=>295,1032=>295, +1033=>1094,1034=>1045,1035=>786,1036=>710,1037=>748,1038=>609,1039=>752,1040=>684,1041=>686,1042=>686, +1043=>610,1044=>781,1045=>632,1046=>1077,1047=>641,1048=>748,1049=>748,1050=>710,1051=>752,1052=>863, +1053=>752,1054=>787,1055=>752,1056=>603,1057=>698,1058=>611,1059=>609,1060=>861,1061=>685,1062=>776, +1063=>686,1064=>1069,1065=>1094,1066=>833,1067=>882,1068=>686,1069=>698,1070=>1080,1071=>695,1072=>613, +1073=>617,1074=>589,1075=>525,1076=>691,1077=>615,1078=>901,1079=>532,1080=>650,1081=>650,1082=>604, +1083=>639,1084=>754,1085=>654,1086=>612,1087=>654,1088=>635,1089=>550,1090=>583,1091=>592,1092=>855, +1093=>592,1094=>681,1095=>591,1096=>915,1097=>942,1098=>707,1099=>790,1100=>589,1101=>549,1102=>842, +1103=>602,1104=>615,1105=>615,1106=>625,1107=>525,1108=>549,1109=>521,1110=>278,1111=>278,1112=>278, +1113=>902,1114=>898,1115=>652,1116=>604,1117=>650,1118=>592,1119=>654,1120=>934,1121=>837,1122=>771, +1123=>672,1124=>942,1125=>749,1126=>879,1127=>783,1128=>1160,1129=>1001,1130=>787,1131=>612,1132=>1027, +1133=>824,1134=>636,1135=>541,1136=>856,1137=>876,1138=>787,1139=>612,1140=>781,1141=>665,1142=>781, +1143=>665,1144=>992,1145=>904,1146=>953,1147=>758,1148=>1180,1149=>1028,1150=>934,1151=>837,1152=>698, +1153=>550,1154=>502,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>418,1161=>418,1162=>772, +1163=>677,1164=>686,1165=>589,1166=>603,1167=>635,1168=>610,1169=>525,1170=>675,1171=>590,1172=>624, +1173=>530,1174=>1077,1175=>901,1176=>641,1177=>532,1178=>710,1179=>604,1180=>710,1181=>604,1182=>710, +1183=>604,1184=>856,1185=>832,1186=>752,1187=>661,1188=>1014,1189=>877,1190=>1081,1191=>916,1192=>878, +1193=>693,1194=>698,1195=>550,1196=>611,1197=>583,1198=>611,1199=>592,1200=>611,1201=>592,1202=>685, +1203=>592,1204=>934,1205=>807,1206=>686,1207=>591,1208=>686,1209=>591,1210=>686,1211=>634,1212=>941, +1213=>728,1214=>941,1215=>728,1216=>295,1217=>1077,1218=>901,1219=>656,1220=>604,1221=>776,1222=>670, +1223=>752,1224=>661,1225=>776,1226=>681,1227=>686,1228=>591,1229=>888,1230=>774,1231=>278,1232=>684, +1233=>613,1234=>684,1235=>613,1236=>974,1237=>982,1238=>632,1239=>615,1240=>787,1241=>615,1242=>787, +1243=>615,1244=>1077,1245=>901,1246=>641,1247=>532,1248=>666,1249=>578,1250=>748,1251=>650,1252=>748, +1253=>650,1254=>787,1255=>612,1256=>787,1257=>612,1258=>787,1259=>612,1260=>698,1261=>549,1262=>609, +1263=>592,1264=>609,1265=>592,1266=>609,1267=>592,1268=>686,1269=>591,1270=>610,1271=>525,1272=>882, +1273=>790,1274=>675,1275=>590,1276=>685,1277=>592,1278=>685,1279=>592,1280=>686,1281=>589,1282=>1006, +1283=>897,1284=>975,1285=>869,1286=>679,1287=>588,1288=>1072,1289=>957,1290=>1113,1291=>967,1292=>775, +1293=>660,1294=>773,1295=>711,1296=>614,1297=>541,1298=>752,1299=>639,1300=>1169,1301=>994,1302=>894, +1303=>864,1304=>1032,1305=>986,1306=>787,1307=>635,1308=>989,1309=>818,1312=>1081,1313=>905,1314=>1081, +1315=>912,1316=>793,1317=>683,1329=>867,1330=>732,1331=>882,1332=>882,1333=>732,1334=>644,1335=>682, +1336=>732,1337=>851,1338=>882,1339=>732,1340=>557,1341=>824,1342=>986,1343=>732,1344=>707,1345=>644, +1346=>882,1347=>777,1348=>882,1349=>732,1350=>840,1351=>732,1352=>732,1353=>732,1354=>791,1355=>644, +1356=>882,1357=>732,1358=>882,1359=>635,1360=>732,1361=>732,1362=>799,1363=>787,1364=>790,1365=>787, +1366=>635,1369=>307,1370=>318,1371=>500,1372=>500,1373=>392,1374=>526,1375=>500,1377=>974,1378=>634, +1379=>762,1380=>767,1381=>634,1382=>697,1383=>533,1384=>634,1385=>700,1386=>697,1387=>634,1388=>404, +1389=>894,1390=>641,1391=>634,1392=>634,1393=>635,1394=>702,1395=>634,1396=>659,1397=>278,1398=>760, +1399=>516,1400=>634,1401=>453,1402=>974,1403=>516,1404=>769,1405=>634,1406=>696,1407=>974,1408=>634, +1409=>635,1410=>501,1411=>974,1412=>648,1413=>612,1414=>629,1415=>763,1417=>337,1418=>433,1456=>0, +1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0, +1467=>0,1468=>0,1469=>0,1470=>361,1471=>0,1472=>295,1473=>0,1474=>0,1475=>295,1478=>441, +1479=>0,1488=>629,1489=>608,1490=>448,1491=>594,1492=>640,1493=>272,1494=>374,1495=>640,1496=>648, +1497=>272,1498=>592,1499=>556,1500=>599,1501=>640,1502=>659,1503=>272,1504=>441,1505=>700,1506=>563, +1507=>640,1508=>604,1509=>521,1510=>581,1511=>663,1512=>592,1513=>808,1514=>657,1520=>471,1521=>454, +1522=>471,1523=>416,1524=>645,1542=>637,1543=>637,1545=>757,1546=>977,1548=>323,1557=>0,1563=>318, +1567=>531,1569=>470,1570=>278,1571=>278,1572=>483,1573=>278,1574=>783,1575=>278,1576=>941,1577=>524, +1578=>941,1579=>941,1580=>646,1581=>646,1582=>646,1583=>445,1584=>445,1585=>483,1586=>483,1587=>1221, +1588=>1221,1589=>1209,1590=>1209,1591=>925,1592=>925,1593=>597,1594=>597,1600=>293,1601=>1037,1602=>776, +1603=>824,1604=>727,1605=>619,1606=>734,1607=>524,1608=>483,1609=>783,1610=>783,1611=>0,1612=>0, +1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1619=>0,1620=>0,1621=>0,1626=>500, +1632=>537,1633=>537,1634=>537,1635=>537,1636=>537,1637=>537,1638=>537,1639=>537,1640=>537,1641=>537, +1642=>537,1643=>325,1644=>318,1645=>545,1646=>941,1647=>776,1652=>292,1657=>941,1658=>941,1659=>941, +1660=>941,1661=>941,1662=>941,1663=>941,1664=>941,1665=>646,1666=>646,1667=>646,1668=>646,1669=>646, +1670=>646,1671=>646,1681=>483,1682=>483,1685=>610,1688=>483,1697=>1037,1700=>1037,1702=>1037,1705=>895, +1711=>895,1717=>727,1722=>734,1727=>646,1734=>483,1740=>783,1742=>783,1749=>524,1776=>537,1777=>537, +1778=>537,1779=>537,1780=>537,1781=>537,1782=>537,1783=>537,1784=>537,1785=>537,1984=>636,1985=>636, +1986=>636,1987=>636,1988=>636,1989=>636,1990=>636,1991=>636,1992=>636,1993=>636,1994=>278,1995=>571, +1996=>424,1997=>592,1998=>654,1999=>654,2000=>594,2001=>654,2002=>829,2003=>438,2004=>438,2005=>559, +2006=>612,2007=>350,2008=>959,2009=>473,2010=>783,2011=>654,2012=>625,2013=>734,2014=>530,2015=>724, +2016=>473,2017=>625,2018=>594,2019=>530,2020=>530,2021=>522,2022=>594,2023=>594,2027=>0,2028=>0, +2029=>0,2030=>0,2031=>0,2032=>0,2033=>0,2034=>0,2035=>0,2036=>313,2037=>313,2040=>560, +2041=>560,2042=>361,3647=>652,3713=>670,3714=>684,3716=>688,3719=>482,3720=>628,3722=>684,3725=>688, +3732=>669,3733=>642,3734=>645,3735=>655,3737=>659,3738=>625,3739=>625,3740=>745,3741=>767,3742=>687, +3743=>687,3745=>702,3746=>688,3747=>684,3749=>649,3751=>632,3754=>703,3755=>819,3757=>633,3758=>684, +3759=>788,3760=>632,3761=>0,3762=>539,3763=>539,3764=>0,3765=>0,3766=>0,3767=>0,3768=>0, +3769=>0,3771=>0,3772=>0,3773=>663,3776=>375,3777=>657,3778=>460,3779=>547,3780=>491,3782=>674, +3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>636,3793=>641,3794=>641,3795=>670, +3796=>625,3797=>625,3798=>703,3799=>670,3800=>674,3801=>677,3804=>1028,3805=>1028,4256=>840,4257=>690, +4258=>642,4259=>759,4260=>591,4261=>686,4262=>789,4263=>811,4264=>467,4265=>565,4266=>789,4267=>793, +4268=>584,4269=>837,4270=>750,4271=>688,4272=>811,4273=>584,4274=>584,4275=>837,4276=>837,4277=>646, +4278=>604,4279=>584,4280=>596,4281=>584,4282=>721,4283=>795,4284=>584,4285=>566,4286=>584,4287=>669, +4288=>799,4289=>542,4290=>664,4291=>542,4292=>565,4293=>674,4304=>508,4305=>508,4306=>533,4307=>785, +4308=>522,4309=>517,4310=>508,4311=>797,4312=>507,4313=>518,4314=>1058,4315=>522,4316=>523,4317=>783, +4318=>518,4319=>523,4320=>792,4321=>523,4322=>656,4323=>524,4324=>788,4325=>523,4326=>782,4327=>523, +4328=>522,4329=>522,4330=>566,4331=>523,4332=>523,4333=>489,4334=>522,4335=>498,4336=>517,4337=>560, +4338=>508,4339=>508,4340=>508,4341=>563,4342=>824,4343=>595,4344=>522,4345=>554,4346=>553,4347=>586, +4348=>304,5121=>684,5122=>684,5123=>684,5124=>684,5125=>769,5126=>769,5127=>769,5129=>769,5130=>769, +5131=>769,5132=>835,5133=>834,5134=>835,5135=>834,5136=>835,5137=>834,5138=>967,5139=>1007,5140=>967, +5141=>1007,5142=>769,5143=>967,5144=>1007,5145=>967,5146=>1007,5147=>769,5149=>256,5150=>543,5151=>423, +5152=>423,5153=>389,5154=>389,5155=>393,5156=>389,5157=>466,5158=>385,5159=>256,5160=>389,5161=>389, +5162=>389,5163=>1090,5164=>909,5165=>953,5166=>1117,5167=>684,5168=>684,5169=>684,5170=>684,5171=>729, +5172=>729,5173=>729,5175=>729,5176=>729,5177=>729,5178=>835,5179=>684,5180=>835,5181=>834,5182=>835, +5183=>834,5184=>967,5185=>1007,5186=>967,5187=>1007,5188=>967,5189=>1007,5190=>967,5191=>1007,5192=>729, +5193=>508,5194=>192,5196=>732,5197=>732,5198=>732,5199=>732,5200=>730,5201=>730,5202=>730,5204=>730, +5205=>730,5206=>730,5207=>921,5208=>889,5209=>921,5210=>889,5211=>921,5212=>889,5213=>928,5214=>900, +5215=>928,5216=>900,5217=>947,5218=>900,5219=>947,5220=>900,5221=>947,5222=>434,5223=>877,5224=>877, +5225=>866,5226=>890,5227=>628,5228=>628,5229=>628,5230=>628,5231=>628,5232=>628,5233=>628,5234=>628, +5235=>628,5236=>860,5237=>771,5238=>815,5239=>816,5240=>815,5241=>816,5242=>860,5243=>771,5244=>860, +5245=>771,5246=>815,5247=>816,5248=>815,5249=>816,5250=>815,5251=>407,5252=>407,5253=>750,5254=>775, +5255=>750,5256=>775,5257=>628,5258=>628,5259=>628,5260=>628,5261=>628,5262=>628,5263=>628,5264=>628, +5265=>628,5266=>860,5267=>771,5268=>815,5269=>816,5270=>815,5271=>816,5272=>860,5273=>771,5274=>860, +5275=>771,5276=>815,5277=>816,5278=>815,5279=>816,5280=>815,5281=>435,5282=>435,5283=>610,5284=>557, +5285=>557,5286=>557,5287=>610,5288=>610,5289=>610,5290=>557,5291=>557,5292=>749,5293=>769,5294=>746, +5295=>764,5296=>746,5297=>764,5298=>749,5299=>769,5300=>749,5301=>769,5302=>746,5303=>764,5304=>746, +5305=>764,5306=>746,5307=>386,5308=>508,5309=>386,5312=>852,5313=>852,5314=>852,5315=>852,5316=>852, +5317=>852,5318=>852,5319=>852,5320=>852,5321=>1069,5322=>1035,5323=>1059,5324=>852,5325=>1059,5326=>852, +5327=>852,5328=>600,5329=>453,5330=>600,5331=>852,5332=>852,5333=>852,5334=>852,5335=>852,5336=>852, +5337=>852,5338=>852,5339=>852,5340=>1069,5341=>1035,5342=>1059,5343=>1030,5344=>1059,5345=>1030,5346=>1069, +5347=>1035,5348=>1069,5349=>1035,5350=>1083,5351=>1030,5352=>1083,5353=>1030,5354=>600,5356=>729,5357=>603, +5358=>603,5359=>603,5360=>603,5361=>603,5362=>603,5363=>603,5364=>603,5365=>603,5366=>834,5367=>754, +5368=>792,5369=>771,5370=>792,5371=>771,5372=>834,5373=>754,5374=>834,5375=>754,5376=>792,5377=>771, +5378=>792,5379=>771,5380=>792,5381=>418,5382=>420,5383=>418,5392=>712,5393=>712,5394=>712,5395=>892, +5396=>892,5397=>892,5398=>892,5399=>910,5400=>872,5401=>910,5402=>872,5403=>910,5404=>872,5405=>1140, +5406=>1100,5407=>1140,5408=>1100,5409=>1140,5410=>1100,5411=>1140,5412=>1100,5413=>641,5414=>627,5415=>627, +5416=>627,5417=>627,5418=>627,5419=>627,5420=>627,5421=>627,5422=>627,5423=>844,5424=>781,5425=>816, +5426=>818,5427=>816,5428=>818,5429=>844,5430=>781,5431=>844,5432=>781,5433=>816,5434=>818,5435=>816, +5436=>818,5437=>816,5438=>418,5440=>389,5441=>484,5442=>916,5443=>916,5444=>916,5445=>916,5446=>916, +5447=>916,5448=>603,5449=>603,5450=>603,5451=>603,5452=>603,5453=>603,5454=>834,5455=>754,5456=>418, +5458=>729,5459=>684,5460=>684,5461=>684,5462=>684,5463=>726,5464=>726,5465=>726,5466=>726,5467=>924, +5468=>1007,5469=>508,5470=>732,5471=>732,5472=>732,5473=>732,5474=>732,5475=>732,5476=>730,5477=>730, +5478=>730,5479=>730,5480=>947,5481=>900,5482=>508,5492=>831,5493=>831,5494=>831,5495=>831,5496=>831, +5497=>831,5498=>831,5499=>563,5500=>752,5501=>484,5502=>1047,5503=>1047,5504=>1047,5505=>1047,5506=>1047, +5507=>1047,5508=>1047,5509=>825,5514=>831,5515=>831,5516=>831,5517=>831,5518=>1259,5519=>1259,5520=>1259, +5521=>1002,5522=>1002,5523=>1259,5524=>1259,5525=>700,5526=>1073,5536=>852,5537=>852,5538=>852,5539=>852, +5540=>852,5541=>852,5542=>600,5543=>643,5544=>643,5545=>643,5546=>643,5547=>643,5548=>643,5549=>643, +5550=>418,5551=>628,5598=>770,5601=>767,5702=>468,5703=>468,5742=>444,5743=>1047,5744=>1310,5745=>1632, +5746=>1632,5747=>1375,5748=>1375,5749=>1632,5750=>1632,5760=>477,5761=>493,5762=>712,5763=>931,5764=>1150, +5765=>1370,5766=>493,5767=>712,5768=>931,5769=>1150,5770=>1370,5771=>498,5772=>718,5773=>938,5774=>1159, +5775=>1379,5776=>493,5777=>712,5778=>930,5779=>1149,5780=>1370,5781=>498,5782=>752,5783=>789,5784=>1205, +5785=>1150,5786=>683,5787=>507,5788=>507,7424=>592,7425=>717,7426=>982,7427=>586,7428=>550,7429=>605, +7430=>605,7431=>491,7432=>541,7433=>278,7434=>395,7435=>579,7436=>583,7437=>754,7438=>650,7439=>612, +7440=>550,7441=>684,7442=>684,7443=>684,7444=>1023,7446=>612,7447=>612,7448=>524,7449=>602,7450=>602, +7451=>583,7452=>574,7453=>737,7454=>948,7455=>638,7456=>592,7457=>818,7458=>525,7459=>526,7462=>583, +7463=>592,7464=>564,7465=>524,7466=>590,7467=>639,7468=>431,7469=>613,7470=>432,7472=>485,7473=>398, +7474=>398,7475=>488,7476=>474,7477=>186,7478=>186,7479=>413,7480=>351,7481=>543,7482=>471,7483=>471, +7484=>496,7485=>439,7486=>380,7487=>438,7488=>385,7489=>461,7490=>623,7491=>392,7492=>392,7493=>405, +7494=>648,7495=>428,7496=>405,7497=>417,7498=>417,7499=>360,7500=>359,7501=>405,7502=>179,7503=>426, +7504=>623,7505=>409,7506=>414,7507=>370,7508=>414,7509=>414,7510=>428,7511=>295,7512=>405,7513=>470, +7514=>623,7515=>417,7517=>402,7518=>373,7519=>385,7520=>416,7521=>364,7522=>179,7523=>259,7524=>405, +7525=>417,7526=>402,7527=>373,7528=>412,7529=>416,7530=>364,7543=>635,7544=>474,7547=>372,7557=>278, +7579=>405,7580=>370,7581=>370,7582=>414,7583=>360,7584=>296,7585=>233,7586=>405,7587=>405,7588=>261, +7589=>250,7590=>261,7591=>261,7592=>234,7593=>250,7594=>235,7595=>376,7596=>623,7597=>623,7598=>411, +7599=>479,7600=>409,7601=>414,7602=>414,7603=>360,7604=>287,7605=>295,7606=>508,7607=>418,7608=>361, +7609=>406,7610=>417,7611=>366,7612=>437,7613=>366,7614=>392,7615=>414,7620=>0,7621=>0,7622=>0, +7623=>0,7624=>0,7625=>0,7680=>684,7681=>613,7682=>686,7683=>635,7684=>686,7685=>635,7686=>686, +7687=>635,7688=>698,7689=>550,7690=>770,7691=>635,7692=>770,7693=>635,7694=>770,7695=>635,7696=>770, +7697=>635,7698=>770,7699=>635,7700=>632,7701=>615,7702=>632,7703=>615,7704=>632,7705=>615,7706=>632, +7707=>615,7708=>632,7709=>615,7710=>575,7711=>352,7712=>775,7713=>635,7714=>752,7715=>634,7716=>752, +7717=>634,7718=>752,7719=>634,7720=>752,7721=>634,7722=>752,7723=>634,7724=>295,7725=>278,7726=>295, +7727=>278,7728=>656,7729=>579,7730=>656,7731=>579,7732=>656,7733=>579,7734=>557,7735=>288,7736=>557, +7737=>288,7738=>557,7739=>278,7740=>557,7741=>278,7742=>863,7743=>974,7744=>863,7745=>974,7746=>863, +7747=>974,7748=>748,7749=>634,7750=>748,7751=>634,7752=>748,7753=>634,7754=>748,7755=>634,7756=>787, +7757=>612,7758=>787,7759=>612,7760=>787,7761=>612,7762=>787,7763=>612,7764=>603,7765=>635,7766=>603, +7767=>635,7768=>695,7769=>411,7770=>695,7771=>411,7772=>695,7773=>411,7774=>695,7775=>411,7776=>635, +7777=>521,7778=>635,7779=>521,7780=>635,7781=>521,7782=>635,7783=>521,7784=>635,7785=>521,7786=>611, +7787=>392,7788=>611,7789=>392,7790=>611,7791=>392,7792=>611,7793=>392,7794=>732,7795=>634,7796=>732, +7797=>634,7798=>732,7799=>634,7800=>732,7801=>634,7802=>732,7803=>634,7804=>684,7805=>592,7806=>684, +7807=>592,7808=>989,7809=>818,7810=>989,7811=>818,7812=>989,7813=>818,7814=>989,7815=>818,7816=>989, +7817=>818,7818=>685,7819=>592,7820=>685,7821=>592,7822=>611,7823=>592,7824=>685,7825=>525,7826=>685, +7827=>525,7828=>685,7829=>525,7830=>634,7831=>392,7832=>818,7833=>592,7834=>613,7835=>352,7838=>769, +7839=>612,7840=>684,7841=>613,7842=>684,7843=>613,7844=>684,7845=>613,7846=>684,7847=>613,7848=>684, +7849=>613,7850=>684,7851=>613,7852=>684,7853=>613,7854=>684,7855=>613,7856=>684,7857=>613,7858=>684, +7859=>613,7860=>684,7861=>613,7862=>684,7863=>613,7864=>632,7865=>615,7866=>632,7867=>615,7868=>632, +7869=>615,7870=>632,7871=>615,7872=>632,7873=>615,7874=>632,7875=>615,7876=>632,7877=>615,7878=>632, +7879=>615,7880=>295,7881=>278,7882=>295,7883=>278,7884=>787,7885=>612,7886=>787,7887=>612,7888=>787, +7889=>612,7890=>787,7891=>612,7892=>787,7893=>612,7894=>787,7895=>612,7896=>787,7897=>612,7898=>913, +7899=>612,7900=>913,7901=>612,7902=>913,7903=>612,7904=>913,7905=>612,7906=>913,7907=>612,7908=>732, +7909=>634,7910=>732,7911=>634,7912=>858,7913=>634,7914=>858,7915=>634,7916=>858,7917=>634,7918=>858, +7919=>634,7920=>858,7921=>634,7922=>611,7923=>592,7924=>611,7925=>592,7926=>611,7927=>592,7928=>611, +7929=>592,7936=>659,7937=>659,7938=>659,7939=>659,7940=>659,7941=>659,7942=>659,7943=>659,7944=>684, +7945=>684,7946=>877,7947=>877,7948=>769,7949=>801,7950=>708,7951=>743,7952=>541,7953=>541,7954=>541, +7955=>541,7956=>541,7957=>541,7960=>711,7961=>711,7962=>966,7963=>975,7964=>898,7965=>928,7968=>634, +7969=>634,7970=>634,7971=>634,7972=>634,7973=>634,7974=>634,7975=>634,7976=>837,7977=>835,7978=>1086, +7979=>1089,7980=>1027,7981=>1051,7982=>934,7983=>947,7984=>338,7985=>338,7986=>338,7987=>338,7988=>338, +7989=>338,7990=>338,7991=>338,7992=>380,7993=>374,7994=>635,7995=>635,7996=>570,7997=>600,7998=>489, +7999=>493,8000=>612,8001=>612,8002=>612,8003=>612,8004=>612,8005=>612,8008=>804,8009=>848,8010=>1095, +8011=>1100,8012=>938,8013=>970,8016=>579,8017=>579,8018=>579,8019=>579,8020=>579,8021=>579,8022=>579, +8023=>579,8025=>784,8027=>998,8029=>1012,8031=>897,8032=>837,8033=>837,8034=>837,8035=>837,8036=>837, +8037=>837,8038=>837,8039=>837,8040=>802,8041=>843,8042=>1089,8043=>1095,8044=>946,8045=>972,8046=>921, +8047=>952,8048=>659,8049=>659,8050=>541,8051=>548,8052=>634,8053=>654,8054=>338,8055=>338,8056=>612, +8057=>612,8058=>579,8059=>579,8060=>837,8061=>837,8064=>659,8065=>659,8066=>659,8067=>659,8068=>659, +8069=>659,8070=>659,8071=>659,8072=>684,8073=>684,8074=>877,8075=>877,8076=>769,8077=>801,8078=>708, +8079=>743,8080=>634,8081=>634,8082=>634,8083=>634,8084=>634,8085=>634,8086=>634,8087=>634,8088=>837, +8089=>835,8090=>1086,8091=>1089,8092=>1027,8093=>1051,8094=>934,8095=>947,8096=>837,8097=>837,8098=>837, +8099=>837,8100=>837,8101=>837,8102=>837,8103=>837,8104=>802,8105=>843,8106=>1089,8107=>1095,8108=>946, +8109=>972,8110=>921,8111=>952,8112=>659,8113=>659,8114=>659,8115=>659,8116=>659,8118=>659,8119=>659, +8120=>684,8121=>684,8122=>716,8123=>692,8124=>684,8125=>500,8126=>500,8127=>500,8128=>500,8129=>500, +8130=>634,8131=>634,8132=>654,8134=>634,8135=>634,8136=>805,8137=>746,8138=>931,8139=>871,8140=>752, +8141=>500,8142=>500,8143=>500,8144=>338,8145=>338,8146=>338,8147=>338,8150=>338,8151=>338,8152=>295, +8153=>295,8154=>475,8155=>408,8157=>500,8158=>500,8159=>500,8160=>579,8161=>579,8162=>579,8163=>579, +8164=>635,8165=>635,8166=>579,8167=>579,8168=>611,8169=>611,8170=>845,8171=>825,8172=>685,8173=>500, +8174=>500,8175=>500,8178=>837,8179=>837,8180=>837,8182=>837,8183=>837,8184=>941,8185=>813,8186=>922, +8187=>826,8188=>764,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>330,8197=>250, +8198=>167,8199=>636,8200=>318,8201=>200,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0, +8208=>361,8209=>361,8210=>636,8213=>1000,8214=>500,8215=>500,8219=>318,8223=>518,8227=>590,8228=>334, +8229=>667,8231=>318,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>200,8241=>1735,8242=>227, +8243=>374,8244=>520,8245=>227,8246=>374,8247=>520,8248=>339,8251=>838,8252=>485,8253=>531,8254=>500, +8255=>804,8256=>804,8257=>250,8258=>1000,8259=>500,8260=>167,8261=>390,8262=>390,8263=>922,8264=>733, +8265=>733,8266=>497,8267=>636,8268=>500,8269=>500,8270=>500,8271=>337,8272=>804,8273=>500,8274=>450, +8275=>1000,8276=>804,8277=>838,8278=>586,8279=>663,8280=>838,8281=>838,8282=>318,8283=>797,8284=>838, +8285=>318,8286=>318,8287=>222,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0, +8300=>0,8301=>0,8302=>0,8303=>0,8304=>401,8305=>179,8308=>401,8309=>401,8310=>401,8311=>401, +8312=>401,8313=>401,8314=>528,8315=>528,8316=>528,8317=>246,8318=>246,8319=>398,8320=>401,8321=>401, +8322=>401,8323=>401,8324=>401,8325=>401,8326=>401,8327=>401,8328=>401,8329=>401,8330=>528,8331=>528, +8332=>528,8333=>246,8334=>246,8336=>392,8337=>417,8338=>414,8339=>444,8340=>417,8352=>877,8353=>636, +8354=>636,8355=>636,8356=>636,8357=>974,8358=>748,8359=>1272,8360=>1074,8361=>989,8362=>784,8363=>635, +8365=>636,8366=>636,8367=>1272,8368=>636,8369=>636,8370=>636,8371=>636,8372=>774,8373=>641,8400=>0, +8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>1019,8449=>1019,8450=>698,8451=>1123, +8452=>642,8453=>1019,8454=>1067,8455=>614,8456=>698,8457=>952,8459=>988,8460=>754,8461=>850,8462=>634, +8463=>634,8464=>470,8465=>697,8466=>720,8467=>413,8468=>818,8469=>801,8470=>1040,8471=>1000,8472=>697, +8473=>701,8474=>787,8475=>798,8476=>814,8477=>792,8478=>896,8479=>684,8480=>1020,8481=>1074,8483=>684, +8484=>745,8485=>578,8486=>764,8487=>764,8488=>616,8489=>338,8490=>656,8491=>684,8492=>786,8493=>703, +8494=>854,8495=>592,8496=>605,8497=>786,8498=>575,8499=>1069,8500=>462,8501=>745,8502=>674,8503=>466, +8504=>645,8505=>380,8506=>926,8507=>1194,8508=>702,8509=>728,8510=>654,8511=>849,8512=>811,8513=>775, +8514=>557,8515=>557,8516=>611,8517=>819,8518=>708,8519=>615,8520=>351,8521=>351,8523=>780,8526=>526, +8531=>969,8532=>969,8533=>969,8534=>969,8535=>969,8536=>969,8537=>969,8538=>969,8539=>969,8540=>969, +8541=>969,8542=>969,8543=>568,8544=>295,8545=>492,8546=>689,8547=>923,8548=>684,8549=>922,8550=>1120, +8551=>1317,8552=>917,8553=>685,8554=>933,8555=>1131,8556=>557,8557=>698,8558=>770,8559=>863,8560=>278, +8561=>458,8562=>637,8563=>812,8564=>592,8565=>811,8566=>991,8567=>1170,8568=>819,8569=>592,8570=>822, +8571=>1002,8572=>278,8573=>550,8574=>635,8575=>974,8576=>1245,8577=>770,8578=>1245,8579=>703,8580=>549, +8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838,8598=>838,8599=>838,8600=>838,8601=>838, +8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838,8608=>838,8609=>838,8610=>838,8611=>838, +8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838,8618=>838,8619=>838,8620=>838,8621=>838, +8622=>838,8623=>838,8624=>838,8625=>838,8626=>838,8627=>838,8628=>838,8629=>838,8630=>838,8631=>838, +8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838,8638=>838,8639=>838,8640=>838,8641=>838, +8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838,8648=>838,8649=>838,8650=>838,8651=>838, +8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838,8658=>838,8659=>838,8660=>838,8661=>838, +8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838,8668=>838,8669=>838,8670=>838,8671=>838, +8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838,8678=>838,8679=>838,8680=>838,8681=>838, +8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838,8688=>838,8689=>838,8690=>838,8691=>838, +8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838,8698=>838,8699=>838,8700=>838,8701=>838, +8702=>838,8703=>838,8704=>684,8705=>636,8706=>517,8707=>632,8708=>632,8709=>871,8710=>669,8711=>669, +8712=>871,8713=>871,8714=>718,8715=>871,8716=>871,8717=>718,8718=>636,8719=>757,8720=>757,8721=>674, +8722=>838,8723=>838,8724=>838,8725=>337,8726=>637,8727=>838,8728=>626,8729=>626,8730=>637,8731=>637, +8732=>637,8733=>714,8734=>833,8735=>838,8736=>896,8737=>896,8738=>838,8739=>500,8740=>500,8741=>500, +8742=>500,8743=>732,8744=>732,8745=>732,8746=>732,8747=>521,8748=>789,8749=>1057,8750=>521,8751=>789, +8752=>1057,8753=>521,8754=>521,8755=>521,8756=>636,8757=>636,8758=>260,8759=>636,8760=>838,8761=>838, +8762=>838,8763=>838,8764=>838,8765=>838,8766=>838,8767=>838,8768=>375,8769=>838,8770=>838,8771=>838, +8772=>838,8773=>838,8774=>838,8775=>838,8776=>838,8777=>838,8778=>838,8779=>838,8780=>838,8781=>838, +8782=>838,8783=>838,8784=>838,8785=>838,8786=>839,8787=>839,8788=>1000,8789=>1000,8790=>838,8791=>838, +8792=>838,8793=>838,8794=>838,8795=>838,8796=>838,8797=>838,8798=>838,8799=>838,8800=>838,8801=>838, +8802=>838,8803=>838,8804=>838,8805=>838,8806=>838,8807=>838,8808=>838,8809=>838,8810=>1047,8811=>1047, +8812=>464,8813=>838,8814=>838,8815=>838,8816=>838,8817=>838,8818=>838,8819=>838,8820=>838,8821=>838, +8822=>838,8823=>838,8824=>838,8825=>838,8826=>838,8827=>838,8828=>838,8829=>838,8830=>838,8831=>838, +8832=>838,8833=>838,8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838,8840=>838,8841=>838, +8842=>838,8843=>838,8844=>732,8845=>732,8846=>732,8847=>838,8848=>838,8849=>838,8850=>838,8851=>780, +8852=>780,8853=>838,8854=>838,8855=>838,8856=>838,8857=>838,8858=>838,8859=>838,8860=>838,8861=>838, +8862=>838,8863=>838,8864=>838,8865=>838,8866=>871,8867=>871,8868=>871,8869=>871,8870=>521,8871=>521, +8872=>871,8873=>871,8874=>871,8875=>871,8876=>871,8877=>871,8878=>871,8879=>871,8880=>838,8881=>838, +8882=>838,8883=>838,8884=>838,8885=>838,8886=>1000,8887=>1000,8888=>838,8889=>838,8890=>521,8891=>732, +8892=>732,8893=>732,8894=>838,8895=>838,8896=>820,8897=>820,8898=>820,8899=>820,8900=>494,8901=>318, +8902=>626,8903=>838,8904=>1000,8905=>1000,8906=>1000,8907=>1000,8908=>1000,8909=>838,8910=>732,8911=>732, +8912=>838,8913=>838,8914=>838,8915=>838,8916=>838,8917=>838,8918=>838,8919=>838,8920=>1422,8921=>1422, +8922=>838,8923=>838,8924=>838,8925=>838,8926=>838,8927=>838,8928=>838,8929=>838,8930=>838,8931=>838, +8932=>838,8933=>838,8934=>838,8935=>838,8936=>838,8937=>838,8938=>838,8939=>838,8940=>838,8941=>838, +8942=>1000,8943=>1000,8944=>1000,8945=>1000,8946=>1000,8947=>871,8948=>718,8949=>871,8950=>871,8951=>718, +8952=>871,8953=>871,8954=>1000,8955=>871,8956=>718,8957=>871,8958=>718,8959=>871,8960=>602,8961=>602, +8962=>635,8963=>838,8964=>838,8965=>838,8966=>838,8967=>488,8968=>390,8969=>390,8970=>390,8971=>390, +8972=>809,8973=>809,8974=>809,8975=>809,8976=>838,8977=>513,8984=>1000,8985=>838,8988=>469,8989=>469, +8990=>469,8991=>469,8992=>521,8993=>521,8996=>1152,8997=>1152,8998=>1414,8999=>1152,9000=>1443,9003=>1414, +9004=>873,9075=>338,9076=>635,9077=>837,9082=>659,9085=>757,9095=>1152,9108=>873,9115=>500,9116=>500, +9117=>500,9118=>500,9119=>500,9120=>500,9121=>500,9122=>500,9123=>500,9124=>500,9125=>500,9126=>500, +9127=>750,9128=>750,9129=>750,9130=>750,9131=>750,9132=>750,9133=>750,9134=>521,9166=>838,9167=>945, +9187=>873,9189=>769,9250=>635,9251=>635,9312=>896,9313=>896,9314=>896,9315=>896,9316=>896,9317=>896, +9318=>896,9319=>896,9320=>896,9321=>896,9472=>602,9473=>602,9474=>602,9475=>602,9476=>602,9477=>602, +9478=>602,9479=>602,9480=>602,9481=>602,9482=>602,9483=>602,9484=>602,9485=>602,9486=>602,9487=>602, +9488=>602,9489=>602,9490=>602,9491=>602,9492=>602,9493=>602,9494=>602,9495=>602,9496=>602,9497=>602, +9498=>602,9499=>602,9500=>602,9501=>602,9502=>602,9503=>602,9504=>602,9505=>602,9506=>602,9507=>602, +9508=>602,9509=>602,9510=>602,9511=>602,9512=>602,9513=>602,9514=>602,9515=>602,9516=>602,9517=>602, +9518=>602,9519=>602,9520=>602,9521=>602,9522=>602,9523=>602,9524=>602,9525=>602,9526=>602,9527=>602, +9528=>602,9529=>602,9530=>602,9531=>602,9532=>602,9533=>602,9534=>602,9535=>602,9536=>602,9537=>602, +9538=>602,9539=>602,9540=>602,9541=>602,9542=>602,9543=>602,9544=>602,9545=>602,9546=>602,9547=>602, +9548=>602,9549=>602,9550=>602,9551=>602,9552=>602,9553=>602,9554=>602,9555=>602,9556=>602,9557=>602, +9558=>602,9559=>602,9560=>602,9561=>602,9562=>602,9563=>602,9564=>602,9565=>602,9566=>602,9567=>602, +9568=>602,9569=>602,9570=>602,9571=>602,9572=>602,9573=>602,9574=>602,9575=>602,9576=>602,9577=>602, +9578=>602,9579=>602,9580=>602,9581=>602,9582=>602,9583=>602,9584=>602,9585=>602,9586=>602,9587=>602, +9588=>602,9589=>602,9590=>602,9591=>602,9592=>602,9593=>602,9594=>602,9595=>602,9596=>602,9597=>602, +9598=>602,9599=>602,9600=>769,9601=>769,9602=>769,9603=>769,9604=>769,9605=>769,9606=>769,9607=>769, +9608=>769,9609=>769,9610=>769,9611=>769,9612=>769,9613=>769,9614=>769,9615=>769,9616=>769,9617=>769, +9618=>769,9619=>769,9620=>769,9621=>769,9622=>769,9623=>769,9624=>769,9625=>769,9626=>769,9627=>769, +9628=>769,9629=>769,9630=>769,9631=>769,9632=>945,9633=>945,9634=>945,9635=>945,9636=>945,9637=>945, +9638=>945,9639=>945,9640=>945,9641=>945,9642=>678,9643=>678,9644=>945,9645=>945,9646=>550,9647=>550, +9648=>769,9649=>769,9650=>769,9651=>769,9652=>502,9653=>502,9654=>769,9655=>769,9656=>502,9657=>502, +9658=>769,9659=>769,9660=>769,9661=>769,9662=>502,9663=>502,9664=>769,9665=>769,9666=>502,9667=>502, +9668=>769,9669=>769,9670=>769,9671=>769,9672=>769,9673=>873,9674=>494,9675=>873,9676=>873,9677=>873, +9678=>873,9679=>873,9680=>873,9681=>873,9682=>873,9683=>873,9684=>873,9685=>873,9686=>527,9687=>527, +9688=>791,9689=>970,9690=>970,9691=>970,9692=>387,9693=>387,9694=>387,9695=>387,9696=>873,9697=>873, +9698=>769,9699=>769,9700=>769,9701=>769,9702=>590,9703=>945,9704=>945,9705=>945,9706=>945,9707=>945, +9708=>769,9709=>769,9710=>769,9711=>1119,9712=>945,9713=>945,9714=>945,9715=>945,9716=>873,9717=>873, +9718=>873,9719=>873,9720=>769,9721=>769,9722=>769,9723=>830,9724=>830,9725=>732,9726=>732,9727=>769, +9728=>896,9729=>1000,9730=>896,9731=>896,9732=>896,9733=>896,9734=>896,9735=>573,9736=>896,9737=>896, +9738=>888,9739=>888,9740=>671,9741=>1013,9742=>1246,9743=>1250,9744=>896,9745=>896,9746=>896,9747=>532, +9748=>896,9749=>896,9750=>896,9751=>896,9752=>896,9753=>896,9754=>896,9755=>896,9756=>896,9757=>609, +9758=>896,9759=>609,9760=>896,9761=>896,9762=>896,9763=>896,9764=>669,9765=>746,9766=>649,9767=>784, +9768=>545,9769=>896,9770=>896,9771=>896,9772=>710,9773=>896,9774=>896,9775=>896,9776=>896,9777=>896, +9778=>896,9779=>896,9780=>896,9781=>896,9782=>896,9783=>896,9784=>896,9785=>896,9786=>896,9787=>896, +9788=>896,9789=>896,9790=>896,9791=>614,9792=>731,9793=>731,9794=>896,9795=>896,9796=>896,9797=>896, +9798=>896,9799=>896,9800=>896,9801=>896,9802=>896,9803=>896,9804=>896,9805=>896,9806=>896,9807=>896, +9808=>896,9809=>896,9810=>896,9811=>896,9812=>896,9813=>896,9814=>896,9815=>896,9816=>896,9817=>896, +9818=>896,9819=>896,9820=>896,9821=>896,9822=>896,9823=>896,9824=>896,9825=>896,9826=>896,9827=>896, +9828=>896,9829=>896,9830=>896,9831=>896,9832=>896,9833=>472,9834=>638,9835=>896,9836=>896,9837=>472, +9838=>357,9839=>484,9840=>748,9841=>766,9842=>896,9843=>896,9844=>896,9845=>896,9846=>896,9847=>896, +9848=>896,9849=>896,9850=>896,9851=>896,9852=>896,9853=>896,9854=>896,9855=>896,9856=>869,9857=>869, +9858=>869,9859=>869,9860=>869,9861=>869,9862=>896,9863=>896,9864=>896,9865=>896,9866=>896,9867=>896, +9868=>896,9869=>896,9870=>896,9871=>896,9872=>896,9873=>896,9874=>896,9875=>896,9876=>896,9877=>541, +9878=>896,9879=>896,9880=>896,9881=>896,9882=>896,9883=>896,9884=>896,9888=>896,9889=>702,9890=>1003, +9891=>1085,9892=>1143,9893=>901,9894=>838,9895=>838,9896=>838,9897=>838,9898=>838,9899=>838,9900=>838, +9901=>838,9902=>838,9903=>838,9904=>844,9905=>838,9906=>731,9907=>732,9908=>732,9909=>732,9910=>850, +9911=>732,9912=>732,9985=>838,9986=>838,9987=>838,9988=>838,9990=>838,9991=>838,9992=>838,9993=>838, +9996=>838,9997=>838,9998=>838,9999=>838,10000=>838,10001=>838,10002=>838,10003=>838,10004=>838,10005=>838, +10006=>838,10007=>838,10008=>838,10009=>838,10010=>838,10011=>838,10012=>838,10013=>838,10014=>838,10015=>838, +10016=>838,10017=>838,10018=>838,10019=>838,10020=>838,10021=>838,10022=>838,10023=>838,10025=>838,10026=>838, +10027=>838,10028=>838,10029=>838,10030=>838,10031=>838,10032=>838,10033=>838,10034=>838,10035=>838,10036=>838, +10037=>838,10038=>838,10039=>838,10040=>838,10041=>838,10042=>838,10043=>838,10044=>838,10045=>838,10046=>838, +10047=>838,10048=>838,10049=>838,10050=>838,10051=>838,10052=>838,10053=>838,10054=>838,10055=>838,10056=>838, +10057=>838,10058=>838,10059=>838,10061=>896,10063=>896,10064=>896,10065=>896,10066=>896,10070=>896,10072=>838, +10073=>838,10074=>838,10075=>322,10076=>322,10077=>538,10078=>538,10081=>838,10082=>838,10083=>838,10084=>838, +10085=>838,10086=>838,10087=>838,10088=>838,10089=>838,10090=>838,10091=>838,10092=>838,10093=>838,10094=>838, +10095=>838,10096=>838,10097=>838,10098=>838,10099=>838,10100=>838,10101=>838,10102=>896,10103=>896,10104=>896, +10105=>896,10106=>896,10107=>896,10108=>896,10109=>896,10110=>896,10111=>896,10112=>838,10113=>838,10114=>838, +10115=>838,10116=>838,10117=>838,10118=>838,10119=>838,10120=>838,10121=>838,10122=>838,10123=>838,10124=>838, +10125=>838,10126=>838,10127=>838,10128=>838,10129=>838,10130=>838,10131=>838,10132=>838,10136=>838,10137=>838, +10138=>838,10139=>838,10140=>838,10141=>838,10142=>838,10143=>838,10144=>838,10145=>838,10146=>838,10147=>838, +10148=>838,10149=>838,10150=>838,10151=>838,10152=>838,10153=>838,10154=>838,10155=>838,10156=>838,10157=>838, +10158=>838,10159=>838,10161=>838,10162=>838,10163=>838,10164=>838,10165=>838,10166=>838,10167=>838,10168=>838, +10169=>838,10170=>838,10171=>838,10172=>838,10173=>838,10174=>838,10181=>390,10182=>390,10208=>494,10214=>495, +10215=>495,10216=>390,10217=>390,10218=>556,10219=>556,10224=>838,10225=>838,10226=>838,10227=>838,10228=>1157, +10229=>1434,10230=>1434,10231=>1434,10232=>1434,10233=>1434,10234=>1434,10235=>1434,10236=>1434,10237=>1434,10238=>1434, +10239=>1434,10240=>732,10241=>732,10242=>732,10243=>732,10244=>732,10245=>732,10246=>732,10247=>732,10248=>732, +10249=>732,10250=>732,10251=>732,10252=>732,10253=>732,10254=>732,10255=>732,10256=>732,10257=>732,10258=>732, +10259=>732,10260=>732,10261=>732,10262=>732,10263=>732,10264=>732,10265=>732,10266=>732,10267=>732,10268=>732, +10269=>732,10270=>732,10271=>732,10272=>732,10273=>732,10274=>732,10275=>732,10276=>732,10277=>732,10278=>732, +10279=>732,10280=>732,10281=>732,10282=>732,10283=>732,10284=>732,10285=>732,10286=>732,10287=>732,10288=>732, +10289=>732,10290=>732,10291=>732,10292=>732,10293=>732,10294=>732,10295=>732,10296=>732,10297=>732,10298=>732, +10299=>732,10300=>732,10301=>732,10302=>732,10303=>732,10304=>732,10305=>732,10306=>732,10307=>732,10308=>732, +10309=>732,10310=>732,10311=>732,10312=>732,10313=>732,10314=>732,10315=>732,10316=>732,10317=>732,10318=>732, +10319=>732,10320=>732,10321=>732,10322=>732,10323=>732,10324=>732,10325=>732,10326=>732,10327=>732,10328=>732, +10329=>732,10330=>732,10331=>732,10332=>732,10333=>732,10334=>732,10335=>732,10336=>732,10337=>732,10338=>732, +10339=>732,10340=>732,10341=>732,10342=>732,10343=>732,10344=>732,10345=>732,10346=>732,10347=>732,10348=>732, +10349=>732,10350=>732,10351=>732,10352=>732,10353=>732,10354=>732,10355=>732,10356=>732,10357=>732,10358=>732, +10359=>732,10360=>732,10361=>732,10362=>732,10363=>732,10364=>732,10365=>732,10366=>732,10367=>732,10368=>732, +10369=>732,10370=>732,10371=>732,10372=>732,10373=>732,10374=>732,10375=>732,10376=>732,10377=>732,10378=>732, +10379=>732,10380=>732,10381=>732,10382=>732,10383=>732,10384=>732,10385=>732,10386=>732,10387=>732,10388=>732, +10389=>732,10390=>732,10391=>732,10392=>732,10393=>732,10394=>732,10395=>732,10396=>732,10397=>732,10398=>732, +10399=>732,10400=>732,10401=>732,10402=>732,10403=>732,10404=>732,10405=>732,10406=>732,10407=>732,10408=>732, +10409=>732,10410=>732,10411=>732,10412=>732,10413=>732,10414=>732,10415=>732,10416=>732,10417=>732,10418=>732, +10419=>732,10420=>732,10421=>732,10422=>732,10423=>732,10424=>732,10425=>732,10426=>732,10427=>732,10428=>732, +10429=>732,10430=>732,10431=>732,10432=>732,10433=>732,10434=>732,10435=>732,10436=>732,10437=>732,10438=>732, +10439=>732,10440=>732,10441=>732,10442=>732,10443=>732,10444=>732,10445=>732,10446=>732,10447=>732,10448=>732, +10449=>732,10450=>732,10451=>732,10452=>732,10453=>732,10454=>732,10455=>732,10456=>732,10457=>732,10458=>732, +10459=>732,10460=>732,10461=>732,10462=>732,10463=>732,10464=>732,10465=>732,10466=>732,10467=>732,10468=>732, +10469=>732,10470=>732,10471=>732,10472=>732,10473=>732,10474=>732,10475=>732,10476=>732,10477=>732,10478=>732, +10479=>732,10480=>732,10481=>732,10482=>732,10483=>732,10484=>732,10485=>732,10486=>732,10487=>732,10488=>732, +10489=>732,10490=>732,10491=>732,10492=>732,10493=>732,10494=>732,10495=>732,10502=>838,10503=>838,10506=>838, +10507=>838,10560=>683,10561=>683,10627=>734,10628=>734,10702=>838,10703=>1000,10704=>1000,10705=>1000,10706=>1000, +10707=>1000,10708=>1000,10709=>1000,10731=>494,10746=>838,10747=>838,10752=>1000,10753=>1000,10754=>1000,10764=>1325, +10765=>521,10766=>521,10767=>521,10768=>521,10769=>521,10770=>521,10771=>521,10772=>521,10773=>521,10774=>521, +10775=>521,10776=>521,10777=>521,10778=>521,10779=>521,10780=>521,10799=>838,10877=>838,10878=>838,10879=>838, +10880=>838,10881=>838,10882=>838,10883=>838,10884=>838,10885=>838,10886=>838,10887=>838,10888=>838,10889=>838, +10890=>838,10891=>838,10892=>838,10893=>838,10894=>838,10895=>838,10896=>838,10897=>838,10898=>838,10899=>838, +10900=>838,10901=>838,10902=>838,10903=>838,10904=>838,10905=>838,10906=>838,10907=>838,10908=>838,10909=>838, +10910=>838,10911=>838,10912=>838,10926=>838,10927=>838,10928=>838,10929=>838,10930=>838,10931=>838,10932=>838, +10933=>838,10934=>838,10935=>838,10936=>838,10937=>838,10938=>838,11001=>838,11002=>838,11008=>838,11009=>838, +11010=>838,11011=>838,11012=>838,11013=>838,11014=>838,11015=>838,11016=>838,11017=>838,11018=>838,11019=>838, +11020=>838,11021=>838,11022=>836,11023=>836,11024=>836,11025=>836,11026=>945,11027=>945,11028=>945,11029=>945, +11030=>769,11031=>769,11032=>769,11033=>769,11034=>945,11039=>869,11040=>869,11041=>873,11042=>873,11043=>873, +11044=>1119,11091=>869,11092=>869,11360=>557,11361=>278,11362=>557,11363=>603,11364=>695,11365=>613,11366=>392, +11367=>752,11368=>634,11369=>656,11370=>579,11371=>685,11372=>525,11373=>781,11374=>863,11375=>684,11377=>734, +11378=>1128,11379=>961,11380=>592,11381=>654,11382=>568,11383=>660,11385=>414,11386=>612,11387=>491,11388=>175, +11389=>431,11568=>646,11569=>888,11570=>888,11571=>682,11572=>684,11573=>635,11574=>562,11575=>684,11576=>684, +11577=>632,11578=>632,11579=>683,11580=>875,11581=>685,11582=>491,11583=>685,11584=>888,11585=>888,11586=>300, +11587=>627,11588=>752,11589=>656,11590=>527,11591=>685,11592=>645,11593=>632,11594=>502,11595=>953,11596=>778, +11597=>748,11598=>621,11599=>295,11600=>778,11601=>295,11602=>752,11603=>633,11604=>888,11605=>888,11606=>752, +11607=>320,11608=>749,11609=>888,11610=>888,11611=>698,11612=>768,11613=>685,11614=>698,11615=>622,11616=>684, +11617=>752,11618=>632,11619=>788,11620=>567,11621=>788,11631=>515,11800=>531,11810=>390,11811=>390,11812=>390, +11813=>390,11822=>531,19904=>896,19905=>896,19906=>896,19907=>896,19908=>896,19909=>896,19910=>896,19911=>896, +19912=>896,19913=>896,19914=>896,19915=>896,19916=>896,19917=>896,19918=>896,19919=>896,19920=>896,19921=>896, +19922=>896,19923=>896,19924=>896,19925=>896,19926=>896,19927=>896,19928=>896,19929=>896,19930=>896,19931=>896, +19932=>896,19933=>896,19934=>896,19935=>896,19936=>896,19937=>896,19938=>896,19939=>896,19940=>896,19941=>896, +19942=>896,19943=>896,19944=>896,19945=>896,19946=>896,19947=>896,19948=>896,19949=>896,19950=>896,19951=>896, +19952=>896,19953=>896,19954=>896,19955=>896,19956=>896,19957=>896,19958=>896,19959=>896,19960=>896,19961=>896, +19962=>896,19963=>896,19964=>896,19965=>896,19966=>896,19967=>896,42564=>635,42565=>521,42566=>354,42567=>338, +42572=>1180,42573=>1028,42576=>1029,42577=>906,42580=>1080,42581=>842,42582=>977,42583=>843,42594=>1062,42595=>912, +42596=>1066,42597=>901,42598=>1178,42599=>1008,42600=>787,42601=>612,42602=>855,42603=>712,42604=>1358,42605=>1019, +42606=>879,42634=>782,42635=>685,42636=>611,42637=>583,42644=>686,42645=>634,42760=>493,42761=>493,42762=>493, +42763=>493,42764=>493,42765=>493,42766=>493,42767=>493,42768=>493,42769=>493,42770=>493,42771=>493,42772=>493, +42773=>493,42774=>493,42779=>369,42780=>369,42781=>252,42782=>252,42783=>252,42790=>752,42791=>634,42792=>878, +42793=>709,42794=>614,42795=>541,42800=>491,42801=>521,42802=>1250,42803=>985,42804=>1203,42805=>990,42806=>1142, +42807=>981,42808=>971,42809=>818,42810=>971,42811=>818,42812=>959,42813=>818,42814=>703,42815=>549,42822=>680, +42823=>392,42824=>582,42825=>427,42826=>807,42827=>704,42830=>1358,42831=>1019,42880=>557,42881=>278,42882=>735, +42883=>634,42889=>337,42890=>376,42891=>401,42892=>275,43003=>575,43004=>603,43005=>863,43006=>295,43007=>1199, +61440=>977,61441=>977,63173=>612,64256=>689,64257=>630,64258=>630,64259=>967,64260=>967,64261=>686,64262=>861, +64275=>1202,64276=>1202,64277=>1196,64278=>1186,64279=>1529,64285=>272,64286=>0,64287=>471,64288=>636,64289=>856, +64290=>774,64291=>906,64292=>771,64293=>843,64294=>855,64295=>807,64296=>875,64297=>838,64298=>808,64299=>808, +64300=>808,64301=>808,64302=>629,64303=>629,64304=>629,64305=>608,64306=>448,64307=>594,64308=>640,64309=>272, +64310=>374,64312=>648,64313=>336,64314=>592,64315=>556,64316=>599,64318=>659,64320=>441,64321=>700,64323=>640, +64324=>604,64326=>581,64327=>663,64328=>592,64329=>808,64330=>657,64331=>272,64332=>608,64333=>556,64334=>604, +64335=>629,64338=>941,64339=>982,64340=>278,64341=>302,64342=>941,64343=>982,64344=>278,64345=>302,64346=>941, +64347=>982,64348=>278,64349=>302,64350=>941,64351=>982,64352=>278,64353=>302,64354=>941,64355=>982,64356=>278, +64357=>302,64358=>941,64359=>982,64360=>278,64361=>302,64362=>1037,64363=>1035,64364=>478,64365=>506,64366=>1037, +64367=>1035,64368=>478,64369=>506,64370=>646,64371=>646,64372=>618,64373=>646,64374=>646,64375=>646,64376=>618, +64377=>646,64378=>646,64379=>646,64380=>618,64381=>646,64382=>646,64383=>646,64384=>618,64385=>646,64394=>483, +64395=>552,64396=>483,64397=>552,64398=>895,64399=>895,64400=>476,64401=>552,64402=>895,64403=>895,64404=>476, +64405=>552,64414=>734,64415=>761,64473=>483,64474=>517,64488=>278,64489=>302,64508=>783,64509=>833,64510=>278, +64511=>302,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0, +65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0, +65059=>0,65136=>293,65137=>293,65138=>293,65139=>262,65140=>293,65142=>293,65143=>293,65144=>293,65145=>293, +65146=>293,65147=>293,65148=>293,65149=>293,65150=>293,65151=>293,65152=>470,65153=>278,65154=>305,65155=>278, +65156=>305,65157=>483,65158=>517,65159=>278,65160=>305,65161=>783,65162=>833,65163=>278,65164=>302,65165=>278, +65166=>305,65167=>941,65168=>982,65169=>278,65170=>302,65171=>524,65172=>536,65173=>941,65174=>982,65175=>278, +65176=>302,65177=>941,65178=>982,65179=>278,65180=>302,65181=>646,65182=>646,65183=>618,65184=>646,65185=>646, +65186=>646,65187=>618,65188=>646,65189=>646,65190=>646,65191=>618,65192=>646,65193=>445,65194=>525,65195=>445, +65196=>525,65197=>483,65198=>552,65199=>483,65200=>552,65201=>1221,65202=>1275,65203=>838,65204=>892,65205=>1221, +65206=>1275,65207=>838,65208=>892,65209=>1209,65210=>1225,65211=>849,65212=>867,65213=>1209,65214=>1225,65215=>849, +65216=>867,65217=>925,65218=>949,65219=>796,65220=>820,65221=>925,65222=>949,65223=>796,65224=>820,65225=>597, +65226=>532,65227=>597,65228=>482,65229=>597,65230=>532,65231=>523,65232=>482,65233=>1037,65234=>1035,65235=>478, +65236=>506,65237=>776,65238=>834,65239=>478,65240=>506,65241=>824,65242=>843,65243=>476,65244=>552,65245=>727, +65246=>757,65247=>305,65248=>331,65249=>619,65250=>666,65251=>536,65252=>578,65253=>734,65254=>761,65255=>278, +65256=>302,65257=>524,65258=>536,65259=>527,65260=>461,65261=>483,65262=>517,65263=>783,65264=>833,65265=>783, +65266=>833,65267=>278,65268=>302,65269=>570,65270=>597,65271=>570,65272=>597,65273=>570,65274=>597,65275=>570, +65276=>597,65279=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1025); +$enc=''; +$diff=''; +$file='dejavusans.z'; +$ctg='dejavusans.ctg.z'; +$originalsize=622280; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusans.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusans.z new file mode 100644 index 0000000..e7a78d2 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusans.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansb.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansb.ctg.z new file mode 100644 index 0000000..514062c Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansb.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansb.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansb.php new file mode 100644 index 0000000..bcd70bf --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansb.php @@ -0,0 +1,504 @@ +<?php +$type='TrueTypeUnicode'; +$name='DejaVuSans-Bold'; +$desc=array('Ascent'=>928,'Descent'=>-236,'CapHeight'=>19,'Flags'=>32,'FontBBox'=>'[-1069 -385 1975 1174]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>600); +$up=-63; +$ut=44; +$dw=600; +$cw=array( +0=>600,32=>348,33=>456,34=>521,35=>838,36=>696,37=>1002,38=>872,39=>306,40=>457, +41=>457,42=>523,43=>838,44=>380,45=>415,46=>380,47=>365,48=>696,49=>696,50=>696, +51=>696,52=>696,53=>696,54=>696,55=>696,56=>696,57=>696,58=>400,59=>400,60=>838, +61=>838,62=>838,63=>580,64=>1000,65=>774,66=>762,67=>734,68=>830,69=>683,70=>683, +71=>821,72=>837,73=>372,74=>372,75=>775,76=>637,77=>995,78=>837,79=>850,80=>733, +81=>850,82=>770,83=>720,84=>682,85=>812,86=>774,87=>1103,88=>771,89=>724,90=>725, +91=>457,92=>365,93=>457,94=>838,95=>500,96=>500,97=>675,98=>716,99=>593,100=>716, +101=>678,102=>435,103=>716,104=>712,105=>343,106=>343,107=>665,108=>343,109=>1042,110=>712, +111=>687,112=>716,113=>716,114=>493,115=>595,116=>478,117=>712,118=>652,119=>924,120=>645, +121=>652,122=>582,123=>712,124=>365,125=>712,126=>838,8364=>696,8218=>380,402=>435,8222=>657, +8230=>1000,8224=>500,8225=>500,710=>500,8240=>1440,352=>720,8249=>412,338=>1167,381=>725,8216=>380, +8217=>380,8220=>657,8221=>657,8226=>639,8211=>500,8212=>1000,732=>500,8482=>1000,353=>595,8250=>412, +339=>1094,382=>582,376=>724,160=>348,161=>456,162=>696,163=>696,164=>636,165=>696,166=>365, +167=>500,168=>500,169=>1000,170=>564,171=>646,172=>838,173=>415,174=>1000,175=>500,176=>500, +177=>838,178=>438,179=>438,180=>500,181=>736,182=>636,183=>380,184=>500,185=>438,186=>564, +187=>646,188=>1035,189=>1035,190=>1035,191=>580,192=>774,193=>774,194=>774,195=>774,196=>774, +197=>774,198=>1085,199=>734,200=>683,201=>683,202=>683,203=>683,204=>372,205=>372,206=>372, +207=>372,208=>838,209=>837,210=>850,211=>850,212=>850,213=>850,214=>850,215=>838,216=>850, +217=>812,218=>812,219=>812,220=>812,221=>724,222=>738,223=>719,224=>675,225=>675,226=>675, +227=>675,228=>675,229=>675,230=>1048,231=>593,232=>678,233=>678,234=>678,235=>678,236=>343, +237=>343,238=>343,239=>343,240=>687,241=>712,242=>687,243=>687,244=>687,245=>687,246=>687, +247=>838,248=>687,249=>712,250=>712,251=>712,252=>712,253=>652,254=>716,255=>652,256=>774, +257=>675,258=>774,259=>675,260=>774,261=>675,262=>734,263=>593,264=>734,265=>593,266=>734, +267=>593,268=>734,269=>593,270=>830,271=>716,272=>838,273=>716,274=>683,275=>678,276=>683, +277=>678,278=>683,279=>678,280=>683,281=>678,282=>683,283=>678,284=>821,285=>716,286=>821, +287=>716,288=>821,289=>716,290=>821,291=>716,292=>837,293=>712,294=>974,295=>790,296=>372, +297=>343,298=>372,299=>343,300=>372,301=>343,302=>372,303=>343,304=>372,305=>343,306=>744, +307=>686,308=>372,309=>343,310=>775,311=>665,312=>665,313=>637,314=>343,315=>637,316=>343, +317=>637,318=>479,319=>637,320=>557,321=>642,322=>371,323=>837,324=>712,325=>837,326=>712, +327=>837,328=>712,329=>983,330=>837,331=>712,332=>850,333=>687,334=>850,335=>687,336=>850, +337=>687,340=>770,341=>493,342=>770,343=>493,344=>770,345=>493,346=>720,347=>595,348=>720, +349=>595,350=>720,351=>595,354=>682,355=>478,356=>682,357=>478,358=>682,359=>478,360=>812, +361=>712,362=>812,363=>712,364=>812,365=>712,366=>812,367=>712,368=>812,369=>712,370=>812, +371=>712,372=>1103,373=>924,374=>724,375=>652,377=>725,378=>582,379=>725,380=>582,383=>435, +384=>716,385=>811,386=>762,387=>716,388=>762,389=>716,390=>734,391=>734,392=>593,393=>838, +394=>879,395=>757,396=>716,397=>688,398=>683,399=>849,400=>696,401=>683,403=>821,404=>793, +405=>1045,406=>436,407=>389,408=>775,409=>665,410=>360,411=>592,412=>1042,413=>837,414=>712, +415=>850,416=>874,417=>687,418=>1083,419=>912,420=>782,421=>716,422=>770,423=>720,424=>595, +425=>683,426=>552,427=>478,428=>707,429=>478,430=>682,431=>835,432=>712,433=>850,434=>813, +435=>797,436=>778,437=>725,438=>582,439=>772,440=>772,441=>641,442=>582,443=>696,444=>772, +445=>641,446=>573,447=>716,448=>372,449=>659,450=>544,451=>372,452=>1555,453=>1412,454=>1298, +455=>1009,456=>980,457=>686,458=>1209,459=>1180,460=>1055,461=>774,462=>675,463=>372,464=>343, +465=>850,466=>687,467=>812,468=>712,469=>812,470=>712,471=>812,472=>712,473=>812,474=>712, +475=>812,476=>712,477=>678,478=>774,479=>675,480=>774,481=>675,482=>1085,483=>1048,484=>821, +485=>716,486=>821,487=>716,488=>775,489=>665,490=>850,491=>687,492=>850,493=>687,494=>772, +495=>582,496=>343,497=>1555,498=>1412,499=>1298,500=>821,501=>716,502=>1289,503=>787,504=>837, +505=>712,506=>774,507=>675,508=>1085,509=>1048,510=>850,511=>687,512=>774,513=>675,514=>774, +515=>675,516=>683,517=>678,518=>683,519=>678,520=>372,521=>343,522=>372,523=>343,524=>850, +525=>687,526=>850,527=>687,528=>770,529=>493,530=>770,531=>493,532=>812,533=>712,534=>812, +535=>712,536=>720,537=>595,538=>682,539=>478,540=>690,541=>607,542=>837,543=>712,544=>837, +545=>865,546=>809,547=>659,548=>725,549=>582,550=>774,551=>675,552=>683,553=>678,554=>850, +555=>687,556=>850,557=>687,558=>850,559=>687,560=>850,561=>687,562=>724,563=>652,564=>492, +565=>867,566=>512,567=>343,568=>1088,569=>1088,570=>774,571=>734,572=>593,573=>637,574=>682, +575=>595,576=>582,577=>782,578=>614,579=>762,580=>812,581=>774,582=>683,583=>678,584=>372, +585=>343,586=>860,587=>791,588=>770,589=>493,590=>724,591=>652,592=>675,593=>716,594=>716, +595=>716,596=>593,597=>593,598=>717,599=>792,600=>678,601=>678,602=>876,603=>557,604=>545, +605=>815,606=>731,607=>343,608=>792,609=>716,610=>627,611=>644,612=>635,613=>712,614=>712, +615=>712,616=>545,617=>440,618=>545,619=>559,620=>693,621=>343,622=>841,623=>1042,624=>1042, +625=>1042,626=>712,627=>793,628=>707,629=>687,630=>909,631=>681,632=>796,633=>538,634=>538, +635=>650,636=>493,637=>493,638=>596,639=>596,640=>642,641=>642,642=>595,643=>415,644=>435, +645=>605,646=>552,647=>478,648=>478,649=>920,650=>772,651=>670,652=>652,653=>924,654=>652, +655=>724,656=>694,657=>684,658=>641,659=>641,660=>573,661=>573,662=>573,663=>573,664=>850, +665=>633,666=>731,667=>685,668=>691,669=>343,670=>732,671=>539,672=>792,673=>573,674=>573, +675=>1156,676=>1214,677=>1155,678=>974,679=>769,680=>929,681=>1026,682=>792,683=>780,684=>591, +685=>415,686=>677,687=>789,688=>456,689=>456,690=>219,691=>315,692=>315,693=>315,694=>411, +695=>591,696=>417,697=>302,698=>521,699=>380,700=>380,701=>380,702=>366,703=>366,704=>326, +705=>326,706=>500,707=>500,708=>500,709=>500,711=>500,712=>306,713=>500,714=>500,715=>500, +716=>306,717=>500,718=>500,719=>500,720=>337,721=>337,722=>366,723=>366,724=>500,725=>500, +726=>416,727=>328,728=>500,729=>500,730=>500,731=>500,733=>500,734=>351,735=>500,736=>412, +737=>219,738=>381,739=>413,740=>326,741=>500,742=>500,743=>500,744=>500,745=>500,748=>500, +749=>500,750=>657,755=>500,759=>500,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0, +774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0, +784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0, +794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0, +804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0, +814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0, +824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0, +834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0, +844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0, +860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>698,881=>565,882=>1022, +883=>836,884=>302,885=>302,886=>837,887=>701,890=>500,891=>593,892=>550,893=>549,894=>400, +900=>441,901=>500,902=>797,903=>380,904=>846,905=>1009,906=>563,908=>891,910=>980,911=>894, +912=>390,913=>774,914=>762,915=>637,916=>774,917=>683,918=>725,919=>837,920=>850,921=>372, +922=>775,923=>774,924=>995,925=>837,926=>632,927=>850,928=>837,929=>733,931=>683,932=>682, +933=>724,934=>850,935=>771,936=>850,937=>850,938=>372,939=>724,940=>687,941=>557,942=>712, +943=>390,944=>675,945=>687,946=>716,947=>681,948=>687,949=>557,950=>591,951=>712,952=>687, +953=>390,954=>710,955=>633,956=>736,957=>681,958=>591,959=>687,960=>791,961=>716,962=>593, +963=>779,964=>638,965=>675,966=>782,967=>645,968=>794,969=>869,970=>390,971=>675,972=>687, +973=>675,974=>869,975=>775,976=>651,977=>661,978=>746,979=>981,980=>746,981=>796,982=>869, +983=>744,984=>850,985=>687,986=>734,987=>593,988=>683,989=>494,990=>702,991=>660,992=>919, +993=>627,994=>1093,995=>837,996=>832,997=>716,998=>928,999=>744,1000=>733,1001=>650,1002=>789, +1003=>671,1004=>752,1005=>716,1006=>682,1007=>590,1008=>744,1009=>716,1010=>593,1011=>343,1012=>850, +1013=>645,1014=>644,1015=>738,1016=>716,1017=>734,1018=>995,1019=>732,1020=>716,1021=>698,1022=>734, +1023=>698,1024=>683,1025=>683,1026=>878,1027=>637,1028=>734,1029=>720,1030=>372,1031=>372,1032=>372, +1033=>1154,1034=>1130,1035=>878,1036=>817,1037=>837,1038=>771,1039=>837,1040=>774,1041=>762,1042=>762, +1043=>637,1044=>891,1045=>683,1046=>1224,1047=>710,1048=>837,1049=>837,1050=>817,1051=>831,1052=>995, +1053=>837,1054=>850,1055=>837,1056=>733,1057=>734,1058=>682,1059=>771,1060=>992,1061=>771,1062=>928, +1063=>808,1064=>1235,1065=>1326,1066=>939,1067=>1036,1068=>762,1069=>734,1070=>1174,1071=>770,1072=>675, +1073=>698,1074=>633,1075=>522,1076=>808,1077=>678,1078=>995,1079=>581,1080=>701,1081=>701,1082=>679, +1083=>732,1084=>817,1085=>691,1086=>687,1087=>691,1088=>716,1089=>593,1090=>580,1091=>652,1092=>992, +1093=>645,1094=>741,1095=>687,1096=>1062,1097=>1105,1098=>751,1099=>904,1100=>632,1101=>593,1102=>972, +1103=>642,1104=>678,1105=>678,1106=>714,1107=>522,1108=>593,1109=>595,1110=>343,1111=>343,1112=>343, +1113=>991,1114=>956,1115=>734,1116=>679,1117=>701,1118=>652,1119=>691,1120=>1093,1121=>869,1122=>840, +1123=>736,1124=>1012,1125=>839,1126=>992,1127=>832,1128=>1358,1129=>1121,1130=>850,1131=>687,1132=>1236, +1133=>1007,1134=>696,1135=>557,1136=>1075,1137=>1061,1138=>850,1139=>687,1140=>850,1141=>695,1142=>850, +1143=>695,1144=>1148,1145=>1043,1146=>1074,1147=>863,1148=>1405,1149=>1173,1150=>1093,1151=>869,1152=>734, +1153=>593,1154=>652,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>418,1161=>418,1162=>957, +1163=>807,1164=>762,1165=>611,1166=>733,1167=>716,1168=>637,1169=>522,1170=>666,1171=>543,1172=>808, +1173=>669,1174=>1224,1175=>995,1176=>710,1177=>581,1178=>775,1179=>679,1180=>817,1181=>679,1182=>817, +1183=>679,1184=>1015,1185=>826,1186=>956,1187=>808,1188=>1103,1189=>874,1190=>1273,1191=>1017,1192=>952, +1193=>858,1194=>734,1195=>593,1196=>682,1197=>580,1198=>724,1199=>652,1200=>724,1201=>652,1202=>771, +1203=>645,1204=>1112,1205=>1000,1206=>808,1207=>687,1208=>808,1209=>687,1210=>808,1211=>712,1212=>1026, +1213=>810,1214=>1026,1215=>810,1216=>372,1217=>1224,1218=>995,1219=>775,1220=>630,1221=>951,1222=>805, +1223=>837,1224=>691,1225=>957,1226=>807,1227=>808,1228=>687,1229=>1115,1230=>933,1231=>343,1232=>774, +1233=>675,1234=>774,1235=>675,1236=>1085,1237=>1048,1238=>683,1239=>678,1240=>849,1241=>678,1242=>849, +1243=>678,1244=>1224,1245=>995,1246=>710,1247=>581,1248=>772,1249=>641,1250=>837,1251=>701,1252=>837, +1253=>701,1254=>850,1255=>687,1256=>850,1257=>687,1258=>850,1259=>687,1260=>734,1261=>593,1262=>771, +1263=>652,1264=>771,1265=>652,1266=>771,1267=>652,1268=>808,1269=>687,1270=>637,1271=>522,1272=>1036, +1273=>904,1274=>666,1275=>543,1276=>771,1277=>645,1278=>771,1279=>645,1280=>762,1281=>608,1282=>1159, +1283=>893,1284=>1119,1285=>920,1286=>828,1287=>693,1288=>1242,1289=>1017,1290=>1289,1291=>1013,1292=>839, +1293=>638,1294=>938,1295=>803,1296=>696,1297=>557,1298=>831,1299=>732,1300=>1286,1301=>1068,1302=>1065, +1303=>979,1304=>1082,1305=>1013,1306=>850,1307=>716,1308=>1103,1309=>924,1312=>1267,1313=>1059,1314=>1273, +1315=>1017,1316=>957,1317=>807,1329=>984,1330=>812,1331=>984,1332=>984,1333=>812,1334=>777,1335=>812, +1336=>812,1337=>975,1338=>984,1339=>812,1340=>710,1341=>1078,1342=>1136,1343=>812,1344=>710,1345=>757, +1346=>984,1347=>876,1348=>984,1349=>793,1350=>984,1351=>812,1352=>812,1353=>812,1354=>958,1355=>777, +1356=>984,1357=>812,1358=>984,1359=>720,1360=>812,1361=>793,1362=>895,1363=>850,1364=>936,1365=>850, +1366=>720,1369=>366,1370=>380,1371=>550,1372=>550,1373=>380,1374=>546,1375=>521,1377=>1042,1378=>712, +1379=>866,1380=>868,1381=>712,1382=>817,1383=>653,1384=>712,1385=>811,1386=>817,1387=>712,1388=>498, +1389=>1018,1390=>716,1391=>712,1392=>712,1393=>716,1394=>819,1395=>712,1396=>751,1397=>343,1398=>882, +1399=>559,1400=>712,1401=>559,1402=>1042,1403=>559,1404=>863,1405=>712,1406=>813,1407=>1042,1408=>712, +1409=>716,1410=>571,1411=>1042,1412=>778,1413=>687,1414=>720,1415=>862,1417=>400,1418=>487,1456=>0, +1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0, +1467=>0,1468=>0,1469=>0,1470=>415,1471=>0,1472=>372,1473=>0,1474=>0,1475=>372,1478=>497, +1479=>0,1488=>751,1489=>673,1490=>537,1491=>654,1492=>712,1493=>343,1494=>491,1495=>712,1496=>724, +1497=>343,1498=>649,1499=>650,1500=>679,1501=>712,1502=>775,1503=>343,1504=>497,1505=>773,1506=>678, +1507=>718,1508=>687,1509=>628,1510=>751,1511=>729,1512=>649,1513=>949,1514=>751,1520=>664,1521=>664, +1522=>663,1523=>444,1524=>710,1542=>667,1543=>667,1545=>884,1546=>1157,1548=>380,1557=>0,1563=>400, +1567=>580,1569=>511,1570=>343,1571=>343,1572=>622,1573=>343,1574=>917,1575=>343,1576=>1005,1577=>590, +1578=>1005,1579=>1005,1580=>721,1581=>721,1582=>721,1583=>513,1584=>513,1585=>576,1586=>576,1587=>1380, +1588=>1380,1589=>1345,1590=>1345,1591=>1039,1592=>1039,1593=>683,1594=>683,1600=>342,1601=>1162,1602=>894, +1603=>917,1604=>868,1605=>733,1606=>854,1607=>590,1608=>622,1609=>917,1610=>917,1611=>0,1612=>0, +1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1619=>0,1620=>0,1621=>0,1626=>500, +1632=>610,1633=>610,1634=>610,1635=>610,1636=>610,1637=>610,1638=>610,1639=>610,1640=>610,1641=>610, +1642=>610,1643=>374,1644=>380,1645=>545,1646=>1005,1647=>894,1652=>292,1657=>1005,1658=>1005,1659=>1005, +1660=>1005,1661=>1005,1662=>1005,1663=>1005,1664=>1005,1665=>721,1666=>721,1667=>721,1668=>721,1669=>721, +1670=>721,1671=>721,1681=>576,1682=>576,1685=>681,1688=>576,1697=>1162,1700=>1162,1702=>1162,1705=>1024, +1711=>1024,1717=>868,1722=>854,1727=>721,1734=>622,1740=>917,1742=>917,1749=>590,1776=>610,1777=>610, +1778=>610,1779=>610,1780=>610,1781=>610,1782=>610,1783=>610,1784=>610,1785=>610,1984=>696,1985=>696, +1986=>696,1987=>696,1988=>696,1989=>696,1990=>696,1991=>696,1992=>696,1993=>696,1994=>343,1995=>547, +1996=>543,1997=>652,1998=>691,1999=>691,2000=>594,2001=>691,2002=>904,2003=>551,2004=>551,2005=>627, +2006=>688,2007=>444,2008=>1022,2009=>506,2010=>826,2011=>691,2012=>652,2013=>912,2014=>627,2015=>707, +2016=>506,2017=>652,2018=>574,2019=>627,2020=>627,2021=>627,2022=>574,2023=>574,2027=>0,2028=>0, +2029=>0,2030=>0,2031=>0,2032=>0,2033=>0,2034=>0,2035=>0,2036=>380,2037=>380,2040=>691, +2041=>691,2042=>415,3647=>743,3713=>790,3714=>748,3716=>749,3719=>569,3720=>742,3722=>744,3725=>761, +3732=>706,3733=>704,3734=>747,3735=>819,3737=>730,3738=>727,3739=>727,3740=>922,3741=>827,3742=>866, +3743=>866,3745=>836,3746=>761,3747=>770,3749=>769,3751=>713,3754=>827,3755=>1031,3757=>724,3758=>784, +3759=>934,3760=>688,3761=>0,3762=>610,3763=>610,3764=>0,3765=>0,3766=>0,3767=>0,3768=>0, +3769=>0,3771=>0,3772=>0,3773=>670,3776=>516,3777=>860,3778=>516,3779=>650,3780=>632,3782=>759, +3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>771,3793=>771,3794=>693,3795=>836, +3796=>729,3797=>729,3798=>849,3799=>790,3800=>759,3801=>910,3804=>1363,3805=>1363,4256=>918,4257=>744, +4258=>739,4259=>837,4260=>649,4261=>773,4262=>857,4263=>889,4264=>530,4265=>633,4266=>857,4267=>900, +4268=>643,4269=>903,4270=>814,4271=>752,4272=>869,4273=>643,4274=>643,4275=>886,4276=>886,4277=>733, +4278=>653,4279=>643,4280=>646,4281=>643,4282=>790,4283=>902,4284=>633,4285=>619,4286=>643,4287=>778, +4288=>892,4289=>601,4290=>742,4291=>616,4292=>633,4293=>742,4304=>553,4305=>552,4306=>596,4307=>815, +4308=>562,4309=>563,4310=>553,4311=>827,4312=>553,4313=>543,4314=>1074,4315=>563,4316=>563,4317=>812, +4318=>552,4319=>591,4320=>822,4321=>563,4322=>690,4323=>583,4324=>813,4325=>562,4326=>813,4327=>563, +4328=>563,4329=>563,4330=>632,4331=>563,4332=>563,4333=>552,4334=>563,4335=>563,4336=>558,4337=>604, +4338=>552,4339=>552,4340=>553,4341=>605,4342=>852,4343=>635,4344=>563,4345=>596,4346=>542,4347=>684, +4348=>368,5121=>774,5122=>774,5123=>774,5124=>774,5125=>905,5126=>905,5127=>905,5129=>905,5130=>905, +5131=>905,5132=>1018,5133=>1009,5134=>1018,5135=>1009,5136=>1018,5137=>1009,5138=>1149,5139=>1140,5140=>1149, +5141=>1140,5142=>905,5143=>1149,5144=>1142,5145=>1149,5146=>1142,5147=>905,5149=>310,5150=>529,5151=>425, +5152=>425,5153=>395,5154=>395,5155=>395,5156=>395,5157=>564,5158=>470,5159=>310,5160=>395,5161=>395, +5162=>395,5163=>1213,5164=>986,5165=>1216,5166=>1297,5167=>774,5168=>774,5169=>774,5170=>774,5171=>886, +5172=>886,5173=>886,5175=>886,5176=>886,5177=>886,5178=>1018,5179=>1009,5180=>1018,5181=>1009,5182=>1018, +5183=>1009,5184=>1149,5185=>1140,5186=>1149,5187=>1140,5188=>1149,5189=>1142,5190=>1149,5191=>1142,5192=>886, +5193=>576,5194=>229,5196=>812,5197=>812,5198=>812,5199=>812,5200=>815,5201=>815,5202=>815,5204=>815, +5205=>815,5206=>815,5207=>1056,5208=>1048,5209=>1056,5210=>1048,5211=>1056,5212=>1048,5213=>1060,5214=>1054, +5215=>1060,5216=>1054,5217=>1060,5218=>1052,5219=>1060,5220=>1052,5221=>1060,5222=>483,5223=>1005,5224=>1005, +5225=>1023,5226=>1017,5227=>743,5228=>743,5229=>743,5230=>743,5231=>743,5232=>743,5233=>743,5234=>743, +5235=>743,5236=>1029,5237=>975,5238=>980,5239=>975,5240=>980,5241=>975,5242=>1029,5243=>975,5244=>1029, +5245=>975,5246=>980,5247=>975,5248=>980,5249=>975,5250=>980,5251=>501,5252=>501,5253=>938,5254=>938, +5255=>938,5256=>938,5257=>743,5258=>743,5259=>743,5260=>743,5261=>743,5262=>743,5263=>743,5264=>743, +5265=>743,5266=>1029,5267=>975,5268=>1029,5269=>975,5270=>1029,5271=>975,5272=>1029,5273=>975,5274=>1029, +5275=>975,5276=>1029,5277=>975,5278=>1029,5279=>975,5280=>1029,5281=>501,5282=>501,5283=>626,5284=>626, +5285=>626,5286=>626,5287=>626,5288=>626,5289=>626,5290=>626,5291=>626,5292=>881,5293=>854,5294=>863, +5295=>874,5296=>863,5297=>874,5298=>881,5299=>874,5300=>881,5301=>874,5302=>863,5303=>874,5304=>863, +5305=>874,5306=>863,5307=>436,5308=>548,5309=>436,5312=>988,5313=>988,5314=>988,5315=>988,5316=>931, +5317=>931,5318=>931,5319=>931,5320=>931,5321=>1238,5322=>1247,5323=>1200,5324=>1228,5325=>1200,5326=>1228, +5327=>931,5328=>660,5329=>497,5330=>660,5331=>988,5332=>988,5333=>988,5334=>988,5335=>931,5336=>931, +5337=>931,5338=>931,5339=>931,5340=>1231,5341=>1247,5342=>1283,5343=>1228,5344=>1283,5345=>1228,5346=>1228, +5347=>1214,5348=>1228,5349=>1214,5350=>1283,5351=>1228,5352=>1283,5353=>1228,5354=>660,5356=>886,5357=>730, +5358=>730,5359=>730,5360=>730,5361=>730,5362=>730,5363=>730,5364=>730,5365=>730,5366=>998,5367=>958, +5368=>967,5369=>989,5370=>967,5371=>989,5372=>998,5373=>958,5374=>998,5375=>958,5376=>967,5377=>989, +5378=>967,5379=>989,5380=>967,5381=>493,5382=>460,5383=>493,5392=>923,5393=>923,5394=>923,5395=>1136, +5396=>1136,5397=>1136,5398=>1136,5399=>1209,5400=>1202,5401=>1209,5402=>1202,5403=>1209,5404=>1202,5405=>1431, +5406=>1420,5407=>1431,5408=>1420,5409=>1431,5410=>1420,5411=>1431,5412=>1420,5413=>746,5414=>776,5415=>776, +5416=>776,5417=>776,5418=>776,5419=>776,5420=>776,5421=>776,5422=>776,5423=>1003,5424=>1003,5425=>1013, +5426=>996,5427=>1013,5428=>996,5429=>1003,5430=>1003,5431=>1003,5432=>1003,5433=>1013,5434=>996,5435=>1013, +5436=>996,5437=>1013,5438=>495,5440=>395,5441=>510,5442=>1033,5443=>1033,5444=>976,5445=>976,5446=>976, +5447=>976,5448=>733,5449=>733,5450=>733,5451=>733,5452=>733,5453=>733,5454=>1003,5455=>959,5456=>495, +5458=>886,5459=>774,5460=>774,5461=>774,5462=>774,5463=>928,5464=>928,5465=>928,5466=>928,5467=>1172, +5468=>1142,5469=>602,5470=>812,5471=>812,5472=>812,5473=>812,5474=>812,5475=>812,5476=>815,5477=>815, +5478=>815,5479=>815,5480=>1060,5481=>1052,5482=>548,5492=>977,5493=>977,5494=>977,5495=>977,5496=>977, +5497=>977,5498=>977,5499=>618,5500=>837,5501=>510,5502=>1238,5503=>1238,5504=>1238,5505=>1238,5506=>1238, +5507=>1238,5508=>1238,5509=>989,5514=>977,5515=>977,5516=>977,5517=>977,5518=>1591,5519=>1591,5520=>1591, +5521=>1295,5522=>1295,5523=>1591,5524=>1591,5525=>848,5526=>1273,5536=>988,5537=>988,5538=>931,5539=>931, +5540=>931,5541=>931,5542=>660,5543=>776,5544=>776,5545=>776,5546=>776,5547=>776,5548=>776,5549=>776, +5550=>495,5551=>743,5598=>830,5601=>830,5702=>496,5703=>496,5742=>413,5743=>1238,5744=>1591,5745=>2016, +5746=>2016,5747=>1720,5748=>1678,5749=>2016,5750=>2016,5760=>543,5761=>637,5762=>945,5763=>1254,5764=>1563, +5765=>1871,5766=>627,5767=>936,5768=>1254,5769=>1559,5770=>1871,5771=>569,5772=>877,5773=>1187,5774=>1497, +5775=>1807,5776=>637,5777=>945,5778=>1240,5779=>1555,5780=>1871,5781=>569,5782=>569,5783=>789,5784=>1234, +5785=>1559,5786=>740,5787=>638,5788=>638,7424=>652,7425=>833,7426=>1048,7427=>608,7428=>593,7429=>676, +7430=>676,7431=>559,7432=>557,7433=>343,7434=>494,7435=>665,7436=>539,7437=>817,7438=>701,7439=>687, +7440=>593,7441=>660,7442=>660,7443=>660,7444=>1094,7446=>687,7447=>687,7448=>556,7449=>642,7450=>642, +7451=>580,7452=>634,7453=>737,7454=>948,7455=>695,7456=>652,7457=>924,7458=>582,7459=>646,7462=>539, +7463=>652,7464=>691,7465=>556,7466=>781,7467=>732,7468=>487,7469=>683,7470=>480,7472=>523,7473=>430, +7474=>430,7475=>517,7476=>527,7477=>234,7478=>234,7479=>488,7480=>401,7481=>626,7482=>527,7483=>527, +7484=>535,7485=>509,7486=>461,7487=>485,7488=>430,7489=>511,7490=>695,7491=>458,7492=>458,7493=>479, +7494=>712,7495=>479,7496=>479,7497=>479,7498=>479,7499=>386,7500=>386,7501=>479,7502=>219,7503=>487, +7504=>664,7505=>456,7506=>488,7507=>414,7508=>488,7509=>488,7510=>479,7511=>388,7512=>456,7513=>462, +7514=>664,7515=>501,7517=>451,7518=>429,7519=>433,7520=>493,7521=>406,7522=>219,7523=>315,7524=>456, +7525=>501,7526=>451,7527=>429,7528=>451,7529=>493,7530=>406,7543=>716,7544=>527,7547=>545,7557=>514, +7579=>479,7580=>414,7581=>414,7582=>488,7583=>386,7584=>377,7585=>348,7586=>479,7587=>456,7588=>347, +7589=>281,7590=>347,7591=>347,7592=>431,7593=>326,7594=>330,7595=>370,7596=>664,7597=>664,7598=>562, +7599=>562,7600=>448,7601=>488,7602=>542,7603=>422,7604=>396,7605=>388,7606=>583,7607=>494,7608=>399, +7609=>451,7610=>501,7611=>417,7612=>523,7613=>470,7614=>455,7615=>425,7620=>0,7621=>0,7622=>0, +7623=>0,7624=>0,7625=>0,7680=>774,7681=>675,7682=>762,7683=>716,7684=>762,7685=>716,7686=>762, +7687=>716,7688=>734,7689=>593,7690=>830,7691=>716,7692=>830,7693=>716,7694=>830,7695=>716,7696=>830, +7697=>716,7698=>830,7699=>716,7700=>683,7701=>678,7702=>683,7703=>678,7704=>683,7705=>678,7706=>683, +7707=>678,7708=>683,7709=>678,7710=>683,7711=>435,7712=>821,7713=>716,7714=>837,7715=>712,7716=>837, +7717=>712,7718=>837,7719=>712,7720=>837,7721=>712,7722=>837,7723=>712,7724=>372,7725=>343,7726=>372, +7727=>343,7728=>775,7729=>665,7730=>775,7731=>665,7732=>775,7733=>665,7734=>637,7735=>343,7736=>637, +7737=>343,7738=>637,7739=>343,7740=>637,7741=>343,7742=>995,7743=>1042,7744=>995,7745=>1042,7746=>995, +7747=>1042,7748=>837,7749=>712,7750=>837,7751=>712,7752=>837,7753=>712,7754=>837,7755=>712,7756=>850, +7757=>687,7758=>850,7759=>687,7760=>850,7761=>687,7762=>850,7763=>687,7764=>733,7765=>716,7766=>733, +7767=>716,7768=>770,7769=>493,7770=>770,7771=>493,7772=>770,7773=>493,7774=>770,7775=>493,7776=>720, +7777=>595,7778=>720,7779=>595,7780=>720,7781=>595,7782=>720,7783=>595,7784=>720,7785=>595,7786=>682, +7787=>478,7788=>682,7789=>478,7790=>682,7791=>478,7792=>682,7793=>478,7794=>812,7795=>712,7796=>812, +7797=>712,7798=>812,7799=>712,7800=>812,7801=>712,7802=>812,7803=>712,7804=>774,7805=>652,7806=>774, +7807=>652,7808=>1103,7809=>924,7810=>1103,7811=>924,7812=>1103,7813=>924,7814=>1103,7815=>924,7816=>1103, +7817=>924,7818=>771,7819=>645,7820=>771,7821=>645,7822=>724,7823=>652,7824=>725,7825=>582,7826=>725, +7827=>582,7828=>725,7829=>582,7830=>712,7831=>478,7832=>924,7833=>652,7834=>675,7835=>435,7838=>896, +7839=>687,7840=>774,7841=>675,7842=>774,7843=>675,7844=>774,7845=>675,7846=>774,7847=>675,7848=>774, +7849=>675,7850=>774,7851=>675,7852=>774,7853=>675,7854=>774,7855=>675,7856=>774,7857=>675,7858=>774, +7859=>675,7860=>774,7861=>675,7862=>774,7863=>675,7864=>683,7865=>678,7866=>683,7867=>678,7868=>683, +7869=>678,7870=>683,7871=>678,7872=>683,7873=>678,7874=>683,7875=>678,7876=>683,7877=>678,7878=>683, +7879=>678,7880=>372,7881=>343,7882=>372,7883=>343,7884=>850,7885=>687,7886=>850,7887=>687,7888=>850, +7889=>687,7890=>850,7891=>687,7892=>850,7893=>687,7894=>850,7895=>687,7896=>850,7897=>687,7898=>874, +7899=>687,7900=>874,7901=>687,7902=>874,7903=>687,7904=>874,7905=>687,7906=>874,7907=>687,7908=>812, +7909=>712,7910=>812,7911=>712,7912=>835,7913=>712,7914=>835,7915=>712,7916=>835,7917=>712,7918=>835, +7919=>712,7920=>835,7921=>712,7922=>724,7923=>652,7924=>724,7925=>652,7926=>724,7927=>652,7928=>724, +7929=>652,7936=>687,7937=>687,7938=>687,7939=>687,7940=>687,7941=>687,7942=>687,7943=>687,7944=>774, +7945=>774,7946=>1041,7947=>1043,7948=>935,7949=>963,7950=>835,7951=>859,7952=>557,7953=>557,7954=>557, +7955=>557,7956=>557,7957=>557,7960=>792,7961=>794,7962=>1100,7963=>1096,7964=>1023,7965=>1052,7968=>712, +7969=>712,7970=>712,7971=>712,7972=>712,7973=>712,7974=>712,7975=>712,7976=>945,7977=>951,7978=>1250, +7979=>1250,7980=>1180,7981=>1206,7982=>1054,7983=>1063,7984=>390,7985=>390,7986=>390,7987=>390,7988=>390, +7989=>390,7990=>390,7991=>390,7992=>483,7993=>489,7994=>777,7995=>785,7996=>712,7997=>738,7998=>604, +7999=>604,8000=>687,8001=>687,8002=>687,8003=>687,8004=>687,8005=>687,8008=>892,8009=>933,8010=>1221, +8011=>1224,8012=>1053,8013=>1082,8016=>675,8017=>675,8018=>675,8019=>675,8020=>675,8021=>675,8022=>675, +8023=>675,8025=>930,8027=>1184,8029=>1199,8031=>1049,8032=>869,8033=>869,8034=>869,8035=>869,8036=>869, +8037=>869,8038=>869,8039=>869,8040=>909,8041=>958,8042=>1246,8043=>1251,8044=>1076,8045=>1105,8046=>1028, +8047=>1076,8048=>687,8049=>687,8050=>557,8051=>557,8052=>712,8053=>712,8054=>390,8055=>390,8056=>687, +8057=>687,8058=>675,8059=>675,8060=>869,8061=>869,8064=>687,8065=>687,8066=>687,8067=>687,8068=>687, +8069=>687,8070=>687,8071=>687,8072=>774,8073=>774,8074=>1041,8075=>1043,8076=>935,8077=>963,8078=>835, +8079=>859,8080=>712,8081=>712,8082=>712,8083=>712,8084=>712,8085=>712,8086=>712,8087=>712,8088=>945, +8089=>951,8090=>1250,8091=>1250,8092=>1180,8093=>1206,8094=>1054,8095=>1063,8096=>869,8097=>869,8098=>869, +8099=>869,8100=>869,8101=>869,8102=>869,8103=>869,8104=>909,8105=>958,8106=>1246,8107=>1251,8108=>1076, +8109=>1105,8110=>1028,8111=>1076,8112=>687,8113=>687,8114=>687,8115=>687,8116=>687,8118=>687,8119=>687, +8120=>774,8121=>774,8122=>876,8123=>797,8124=>774,8125=>500,8126=>500,8127=>500,8128=>500,8129=>500, +8130=>712,8131=>712,8132=>712,8134=>712,8135=>712,8136=>929,8137=>846,8138=>1080,8139=>1009,8140=>837, +8141=>500,8142=>500,8143=>500,8144=>390,8145=>390,8146=>390,8147=>390,8150=>390,8151=>390,8152=>372, +8153=>372,8154=>621,8155=>563,8157=>500,8158=>500,8159=>500,8160=>675,8161=>675,8162=>675,8163=>675, +8164=>716,8165=>716,8166=>675,8167=>675,8168=>724,8169=>724,8170=>1020,8171=>980,8172=>838,8173=>500, +8174=>500,8175=>500,8178=>869,8179=>869,8180=>869,8182=>869,8183=>869,8184=>1065,8185=>891,8186=>1084, +8187=>894,8188=>850,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>330,8197=>250, +8198=>167,8199=>696,8200=>380,8201=>200,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0, +8208=>415,8209=>415,8210=>696,8213=>1000,8214=>500,8215=>500,8219=>380,8223=>657,8227=>639,8228=>333, +8229=>667,8231=>348,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>200,8241=>1887,8242=>264, +8243=>447,8244=>630,8245=>264,8246=>447,8247=>630,8248=>733,8251=>972,8252=>627,8253=>580,8254=>500, +8255=>828,8256=>828,8257=>329,8258=>1023,8259=>500,8260=>167,8261=>457,8262=>457,8263=>1030,8264=>829, +8265=>829,8266=>513,8267=>636,8268=>500,8269=>500,8270=>523,8271=>400,8272=>828,8273=>523,8274=>556, +8275=>1000,8276=>828,8277=>838,8278=>684,8279=>813,8280=>838,8281=>838,8282=>380,8283=>872,8284=>838, +8285=>380,8286=>380,8287=>222,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0, +8300=>0,8301=>0,8302=>0,8303=>0,8304=>438,8305=>219,8308=>438,8309=>438,8310=>438,8311=>438, +8312=>438,8313=>438,8314=>528,8315=>528,8316=>528,8317=>288,8318=>288,8319=>456,8320=>438,8321=>438, +8322=>438,8323=>438,8324=>438,8325=>438,8326=>438,8327=>438,8328=>438,8329=>438,8330=>528,8331=>528, +8332=>528,8333=>288,8334=>288,8336=>458,8337=>479,8338=>488,8339=>413,8340=>479,8352=>929,8353=>696, +8354=>696,8355=>696,8356=>696,8357=>1042,8358=>837,8359=>1518,8360=>1205,8361=>1103,8362=>904,8363=>696, +8365=>696,8366=>682,8367=>1392,8368=>696,8369=>696,8370=>696,8371=>696,8372=>859,8373=>696,8400=>0, +8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>1120,8449=>1170,8450=>734,8451=>1211, +8452=>896,8453=>1091,8454=>1144,8455=>614,8456=>698,8457=>1086,8459=>1073,8460=>913,8461=>888,8462=>712, +8463=>712,8464=>597,8465=>697,8466=>856,8467=>472,8468=>974,8469=>837,8470=>1203,8471=>1000,8472=>697, +8473=>750,8474=>850,8475=>938,8476=>814,8477=>801,8478=>896,8479=>710,8480=>1020,8481=>1281,8483=>755, +8484=>754,8485=>578,8486=>850,8487=>850,8488=>763,8489=>338,8490=>775,8491=>774,8492=>928,8493=>818, +8494=>854,8495=>636,8496=>729,8497=>808,8498=>683,8499=>1184,8500=>465,8501=>794,8502=>731,8503=>494, +8504=>684,8505=>380,8506=>945,8507=>1348,8508=>790,8509=>737,8510=>654,8511=>863,8512=>840,8513=>775, +8514=>557,8515=>637,8516=>760,8517=>830,8518=>716,8519=>678,8520=>343,8521=>343,8523=>872,8526=>547, +8531=>1035,8532=>1035,8533=>1035,8534=>1035,8535=>1035,8536=>1035,8537=>1035,8538=>1035,8539=>1035,8540=>1035, +8541=>1035,8542=>1035,8543=>615,8544=>372,8545=>659,8546=>945,8547=>1099,8548=>774,8549=>1099,8550=>1386, +8551=>1672,8552=>1121,8553=>771,8554=>1120,8555=>1407,8556=>637,8557=>734,8558=>830,8559=>995,8560=>343, +8561=>607,8562=>872,8563=>984,8564=>652,8565=>962,8566=>1227,8567=>1491,8568=>969,8569=>645,8570=>969, +8571=>1233,8572=>343,8573=>593,8574=>716,8575=>1042,8576=>1289,8577=>830,8578=>1289,8579=>734,8580=>593, +8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838,8598=>838,8599=>838,8600=>838,8601=>838, +8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838,8608=>838,8609=>838,8610=>838,8611=>838, +8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838,8618=>838,8619=>838,8620=>838,8621=>838, +8622=>838,8623=>838,8624=>838,8625=>838,8626=>838,8627=>838,8628=>838,8629=>838,8630=>838,8631=>838, +8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838,8638=>838,8639=>838,8640=>838,8641=>838, +8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838,8648=>838,8649=>838,8650=>838,8651=>838, +8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838,8658=>838,8659=>838,8660=>838,8661=>838, +8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838,8668=>838,8669=>838,8670=>838,8671=>838, +8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838,8678=>838,8679=>838,8680=>838,8681=>838, +8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838,8688=>838,8689=>838,8690=>838,8691=>838, +8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838,8698=>838,8699=>838,8700=>838,8701=>838, +8702=>838,8703=>838,8704=>774,8705=>696,8706=>544,8707=>683,8708=>683,8709=>856,8710=>697,8711=>697, +8712=>896,8713=>896,8714=>750,8715=>896,8716=>896,8717=>750,8718=>636,8719=>787,8720=>787,8721=>718, +8722=>838,8723=>838,8724=>696,8725=>365,8726=>696,8727=>838,8728=>626,8729=>380,8730=>667,8731=>667, +8732=>667,8733=>712,8734=>833,8735=>838,8736=>896,8737=>896,8738=>838,8739=>500,8740=>500,8741=>500, +8742=>500,8743=>812,8744=>812,8745=>812,8746=>812,8747=>610,8748=>929,8749=>1295,8750=>563,8751=>977, +8752=>1313,8753=>563,8754=>563,8755=>563,8756=>696,8757=>696,8758=>294,8759=>696,8760=>838,8761=>838, +8762=>838,8763=>838,8764=>838,8765=>838,8766=>838,8767=>838,8768=>375,8769=>838,8770=>838,8771=>838, +8772=>838,8773=>838,8774=>838,8775=>838,8776=>838,8777=>838,8778=>838,8779=>838,8780=>838,8781=>838, +8782=>838,8783=>838,8784=>838,8785=>838,8786=>838,8787=>838,8788=>1063,8789=>1063,8790=>838,8791=>838, +8792=>838,8793=>838,8794=>838,8795=>838,8796=>838,8797=>838,8798=>838,8799=>838,8800=>838,8801=>838, +8802=>838,8803=>838,8804=>838,8805=>838,8806=>838,8807=>838,8808=>841,8809=>841,8810=>1047,8811=>1047, +8812=>500,8813=>838,8814=>838,8815=>838,8816=>838,8817=>838,8818=>838,8819=>838,8820=>838,8821=>838, +8822=>838,8823=>838,8824=>838,8825=>838,8826=>838,8827=>838,8828=>838,8829=>838,8830=>838,8831=>838, +8832=>838,8833=>838,8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838,8840=>838,8841=>838, +8842=>838,8843=>838,8844=>812,8845=>812,8846=>812,8847=>838,8848=>838,8849=>838,8850=>838,8851=>796, +8852=>796,8853=>838,8854=>838,8855=>838,8856=>838,8857=>838,8858=>838,8859=>838,8860=>838,8861=>838, +8862=>838,8863=>838,8864=>838,8865=>838,8866=>914,8867=>914,8868=>914,8869=>914,8870=>542,8871=>542, +8872=>914,8873=>914,8874=>914,8875=>914,8876=>914,8877=>914,8878=>914,8879=>914,8880=>838,8881=>838, +8882=>838,8883=>838,8884=>838,8885=>838,8886=>1000,8887=>1000,8888=>838,8889=>838,8890=>542,8891=>812, +8892=>812,8893=>812,8894=>838,8895=>838,8896=>843,8897=>843,8898=>843,8899=>843,8900=>494,8901=>380, +8902=>626,8903=>838,8904=>1000,8905=>1000,8906=>1000,8907=>1000,8908=>1000,8909=>838,8910=>812,8911=>812, +8912=>838,8913=>838,8914=>838,8915=>838,8916=>838,8917=>838,8918=>838,8919=>838,8920=>1422,8921=>1422, +8922=>838,8923=>838,8924=>838,8925=>838,8926=>838,8927=>838,8928=>838,8929=>838,8930=>838,8931=>838, +8932=>838,8933=>838,8934=>838,8935=>838,8936=>838,8937=>838,8938=>838,8939=>838,8940=>838,8941=>838, +8942=>1000,8943=>1000,8944=>1000,8945=>1000,8946=>1158,8947=>896,8948=>750,8949=>896,8950=>896,8951=>750, +8952=>896,8953=>896,8954=>1158,8955=>896,8956=>750,8957=>896,8958=>750,8959=>896,8960=>602,8961=>602, +8962=>716,8963=>838,8964=>838,8965=>838,8966=>838,8967=>488,8968=>457,8969=>457,8970=>457,8971=>457, +8972=>809,8973=>809,8974=>809,8975=>809,8976=>838,8977=>539,8984=>928,8985=>838,8988=>469,8989=>469, +8990=>469,8991=>469,8992=>610,8993=>610,8996=>1152,8997=>1152,8998=>1414,8999=>1152,9000=>1443,9003=>1414, +9004=>873,9075=>390,9076=>716,9077=>869,9082=>687,9085=>863,9095=>1152,9108=>873,9115=>500,9116=>500, +9117=>500,9118=>500,9119=>500,9120=>500,9121=>500,9122=>500,9123=>500,9124=>500,9125=>500,9126=>500, +9127=>750,9128=>750,9129=>750,9130=>750,9131=>750,9132=>750,9133=>750,9134=>610,9166=>838,9167=>945, +9187=>873,9189=>769,9250=>716,9251=>716,9312=>847,9313=>847,9314=>847,9315=>847,9316=>847,9317=>847, +9318=>847,9319=>847,9320=>847,9321=>847,9600=>769,9601=>769,9602=>769,9603=>769,9604=>769,9605=>769, +9606=>769,9607=>769,9608=>769,9609=>769,9610=>769,9611=>769,9612=>769,9613=>769,9614=>769,9615=>769, +9616=>769,9617=>769,9618=>769,9619=>769,9620=>769,9621=>769,9622=>769,9623=>769,9624=>769,9625=>769, +9626=>769,9627=>769,9628=>769,9629=>769,9630=>769,9631=>769,9632=>945,9633=>945,9634=>945,9635=>945, +9636=>945,9637=>945,9638=>945,9639=>945,9640=>945,9641=>945,9642=>678,9643=>678,9644=>945,9645=>945, +9646=>550,9647=>550,9648=>769,9649=>769,9650=>769,9651=>769,9652=>502,9653=>502,9654=>769,9655=>769, +9656=>502,9657=>502,9658=>769,9659=>769,9660=>769,9661=>769,9662=>502,9663=>502,9664=>769,9665=>769, +9666=>502,9667=>502,9668=>769,9669=>769,9670=>769,9671=>769,9672=>769,9673=>873,9674=>494,9675=>873, +9676=>873,9677=>873,9678=>873,9679=>873,9680=>873,9681=>873,9682=>873,9683=>873,9684=>873,9685=>873, +9686=>527,9687=>527,9688=>840,9689=>970,9690=>970,9691=>970,9692=>387,9693=>387,9694=>387,9695=>387, +9696=>769,9697=>769,9698=>769,9699=>769,9700=>769,9701=>769,9702=>639,9703=>945,9704=>945,9705=>945, +9706=>945,9707=>945,9708=>769,9709=>769,9710=>769,9711=>1119,9712=>945,9713=>945,9714=>945,9715=>945, +9716=>873,9717=>873,9718=>873,9719=>873,9720=>769,9721=>769,9722=>769,9723=>830,9724=>830,9725=>732, +9726=>732,9727=>769,9728=>896,9729=>1000,9730=>896,9731=>896,9732=>896,9733=>896,9734=>896,9735=>573, +9736=>896,9737=>896,9738=>888,9739=>888,9740=>671,9741=>1013,9742=>1246,9743=>1250,9744=>896,9745=>896, +9746=>896,9747=>532,9748=>896,9749=>896,9750=>896,9751=>896,9752=>896,9753=>896,9754=>896,9755=>896, +9756=>896,9757=>609,9758=>896,9759=>609,9760=>896,9761=>896,9762=>896,9763=>896,9764=>669,9765=>746, +9766=>649,9767=>784,9768=>545,9769=>896,9770=>896,9771=>896,9772=>710,9773=>896,9774=>896,9775=>896, +9776=>896,9777=>896,9778=>896,9779=>896,9780=>896,9781=>896,9782=>896,9783=>896,9784=>896,9785=>896, +9786=>896,9787=>896,9788=>896,9789=>896,9790=>896,9791=>614,9792=>731,9793=>731,9794=>896,9795=>896, +9796=>896,9797=>896,9798=>896,9799=>896,9800=>896,9801=>896,9802=>896,9803=>896,9804=>896,9805=>896, +9806=>896,9807=>896,9808=>896,9809=>896,9810=>896,9811=>896,9812=>896,9813=>896,9814=>896,9815=>896, +9816=>896,9817=>896,9818=>896,9819=>896,9820=>896,9821=>896,9822=>896,9823=>896,9824=>896,9825=>896, +9826=>896,9827=>896,9828=>896,9829=>896,9830=>896,9831=>896,9832=>896,9833=>472,9834=>638,9835=>896, +9836=>896,9837=>472,9838=>357,9839=>484,9840=>748,9841=>766,9842=>896,9843=>896,9844=>896,9845=>896, +9846=>896,9847=>896,9848=>896,9849=>896,9850=>896,9851=>896,9852=>896,9853=>896,9854=>896,9855=>896, +9856=>869,9857=>869,9858=>869,9859=>869,9860=>869,9861=>869,9862=>896,9863=>896,9864=>896,9865=>896, +9866=>896,9867=>896,9868=>896,9869=>896,9870=>896,9871=>896,9872=>896,9873=>896,9874=>896,9875=>896, +9876=>896,9877=>541,9878=>896,9879=>896,9880=>896,9881=>896,9882=>896,9883=>896,9884=>896,9888=>896, +9889=>702,9890=>1003,9891=>1085,9892=>1143,9893=>901,9894=>838,9895=>838,9896=>838,9897=>838,9898=>838, +9899=>838,9900=>838,9901=>838,9902=>838,9903=>838,9904=>844,9905=>838,9906=>731,9907=>732,9908=>732, +9909=>732,9910=>850,9911=>732,9912=>732,9985=>838,9986=>838,9987=>838,9988=>838,9990=>838,9991=>838, +9992=>838,9993=>838,9996=>838,9997=>838,9998=>838,9999=>838,10000=>838,10001=>838,10002=>838,10003=>838, +10004=>838,10005=>838,10006=>838,10007=>838,10008=>838,10009=>838,10010=>838,10011=>838,10012=>838,10013=>838, +10014=>838,10015=>838,10016=>838,10017=>838,10018=>838,10019=>838,10020=>838,10021=>838,10022=>838,10023=>838, +10025=>838,10026=>838,10027=>838,10028=>838,10029=>838,10030=>838,10031=>838,10032=>838,10033=>838,10034=>838, +10035=>838,10036=>838,10037=>838,10038=>838,10039=>838,10040=>838,10041=>838,10042=>838,10043=>838,10044=>838, +10045=>838,10046=>838,10047=>838,10048=>838,10049=>838,10050=>838,10051=>838,10052=>838,10053=>838,10054=>838, +10055=>838,10056=>838,10057=>838,10058=>838,10059=>838,10061=>896,10063=>896,10064=>896,10065=>896,10066=>896, +10070=>896,10072=>838,10073=>838,10074=>838,10075=>347,10076=>347,10077=>587,10078=>587,10081=>838,10082=>838, +10083=>838,10084=>838,10085=>838,10086=>838,10087=>838,10088=>838,10089=>838,10090=>838,10091=>838,10092=>838, +10093=>838,10094=>838,10095=>838,10096=>838,10097=>838,10098=>838,10099=>838,10100=>838,10101=>838,10102=>847, +10103=>847,10104=>847,10105=>847,10106=>847,10107=>847,10108=>847,10109=>847,10110=>847,10111=>847,10112=>838, +10113=>838,10114=>838,10115=>838,10116=>838,10117=>838,10118=>838,10119=>838,10120=>838,10121=>838,10122=>838, +10123=>838,10124=>838,10125=>838,10126=>838,10127=>838,10128=>838,10129=>838,10130=>838,10131=>838,10132=>838, +10136=>838,10137=>838,10138=>838,10139=>838,10140=>838,10141=>838,10142=>838,10143=>838,10144=>838,10145=>838, +10146=>838,10147=>838,10148=>838,10149=>838,10150=>838,10151=>838,10152=>838,10153=>838,10154=>838,10155=>838, +10156=>838,10157=>838,10158=>838,10159=>838,10161=>838,10162=>838,10163=>838,10164=>838,10165=>838,10166=>838, +10167=>838,10168=>838,10169=>838,10170=>838,10171=>838,10172=>838,10173=>838,10174=>838,10181=>457,10182=>457, +10208=>494,10214=>487,10215=>487,10216=>457,10217=>457,10218=>721,10219=>721,10224=>838,10225=>838,10226=>838, +10227=>838,10228=>1157,10229=>1434,10230=>1434,10231=>1434,10232=>1434,10233=>1434,10234=>1434,10235=>1434,10236=>1434, +10237=>1434,10238=>1434,10239=>1434,10240=>781,10241=>781,10242=>781,10243=>781,10244=>781,10245=>781,10246=>781, +10247=>781,10248=>781,10249=>781,10250=>781,10251=>781,10252=>781,10253=>781,10254=>781,10255=>781,10256=>781, +10257=>781,10258=>781,10259=>781,10260=>781,10261=>781,10262=>781,10263=>781,10264=>781,10265=>781,10266=>781, +10267=>781,10268=>781,10269=>781,10270=>781,10271=>781,10272=>781,10273=>781,10274=>781,10275=>781,10276=>781, +10277=>781,10278=>781,10279=>781,10280=>781,10281=>781,10282=>781,10283=>781,10284=>781,10285=>781,10286=>781, +10287=>781,10288=>781,10289=>781,10290=>781,10291=>781,10292=>781,10293=>781,10294=>781,10295=>781,10296=>781, +10297=>781,10298=>781,10299=>781,10300=>781,10301=>781,10302=>781,10303=>781,10304=>781,10305=>781,10306=>781, +10307=>781,10308=>781,10309=>781,10310=>781,10311=>781,10312=>781,10313=>781,10314=>781,10315=>781,10316=>781, +10317=>781,10318=>781,10319=>781,10320=>781,10321=>781,10322=>781,10323=>781,10324=>781,10325=>781,10326=>781, +10327=>781,10328=>781,10329=>781,10330=>781,10331=>781,10332=>781,10333=>781,10334=>781,10335=>781,10336=>781, +10337=>781,10338=>781,10339=>781,10340=>781,10341=>781,10342=>781,10343=>781,10344=>781,10345=>781,10346=>781, +10347=>781,10348=>781,10349=>781,10350=>781,10351=>781,10352=>781,10353=>781,10354=>781,10355=>781,10356=>781, +10357=>781,10358=>781,10359=>781,10360=>781,10361=>781,10362=>781,10363=>781,10364=>781,10365=>781,10366=>781, +10367=>781,10368=>781,10369=>781,10370=>781,10371=>781,10372=>781,10373=>781,10374=>781,10375=>781,10376=>781, +10377=>781,10378=>781,10379=>781,10380=>781,10381=>781,10382=>781,10383=>781,10384=>781,10385=>781,10386=>781, +10387=>781,10388=>781,10389=>781,10390=>781,10391=>781,10392=>781,10393=>781,10394=>781,10395=>781,10396=>781, +10397=>781,10398=>781,10399=>781,10400=>781,10401=>781,10402=>781,10403=>781,10404=>781,10405=>781,10406=>781, +10407=>781,10408=>781,10409=>781,10410=>781,10411=>781,10412=>781,10413=>781,10414=>781,10415=>781,10416=>781, +10417=>781,10418=>781,10419=>781,10420=>781,10421=>781,10422=>781,10423=>781,10424=>781,10425=>781,10426=>781, +10427=>781,10428=>781,10429=>781,10430=>781,10431=>781,10432=>781,10433=>781,10434=>781,10435=>781,10436=>781, +10437=>781,10438=>781,10439=>781,10440=>781,10441=>781,10442=>781,10443=>781,10444=>781,10445=>781,10446=>781, +10447=>781,10448=>781,10449=>781,10450=>781,10451=>781,10452=>781,10453=>781,10454=>781,10455=>781,10456=>781, +10457=>781,10458=>781,10459=>781,10460=>781,10461=>781,10462=>781,10463=>781,10464=>781,10465=>781,10466=>781, +10467=>781,10468=>781,10469=>781,10470=>781,10471=>781,10472=>781,10473=>781,10474=>781,10475=>781,10476=>781, +10477=>781,10478=>781,10479=>781,10480=>781,10481=>781,10482=>781,10483=>781,10484=>781,10485=>781,10486=>781, +10487=>781,10488=>781,10489=>781,10490=>781,10491=>781,10492=>781,10493=>781,10494=>781,10495=>781,10502=>838, +10503=>838,10506=>838,10507=>838,10560=>838,10561=>838,10627=>753,10628=>753,10702=>838,10703=>1046,10704=>1046, +10705=>1000,10706=>1000,10707=>1000,10708=>1000,10709=>1000,10731=>494,10746=>838,10747=>838,10752=>1000,10753=>1000, +10754=>1000,10764=>1661,10765=>563,10766=>563,10767=>563,10768=>563,10769=>563,10770=>563,10771=>563,10772=>563, +10773=>563,10774=>563,10775=>563,10776=>563,10777=>563,10778=>563,10779=>563,10780=>563,10799=>838,10877=>838, +10878=>838,10879=>838,10880=>838,10881=>838,10882=>838,10883=>838,10884=>838,10885=>838,10886=>838,10887=>838, +10888=>838,10889=>838,10890=>838,10891=>838,10892=>838,10893=>838,10894=>838,10895=>838,10896=>838,10897=>838, +10898=>838,10899=>838,10900=>838,10901=>838,10902=>838,10903=>838,10904=>838,10905=>838,10906=>838,10907=>838, +10908=>838,10909=>838,10910=>838,10911=>838,10912=>838,10926=>838,10927=>838,10928=>838,10929=>838,10930=>838, +10931=>838,10932=>838,10933=>838,10934=>838,10935=>838,10936=>838,10937=>838,10938=>838,11001=>838,11002=>838, +11008=>838,11009=>838,11010=>838,11011=>838,11012=>838,11013=>838,11014=>838,11015=>838,11016=>838,11017=>838, +11018=>838,11019=>838,11020=>838,11021=>838,11022=>838,11023=>838,11024=>838,11025=>838,11026=>945,11027=>945, +11028=>945,11029=>945,11030=>769,11031=>769,11032=>769,11033=>769,11034=>945,11039=>869,11040=>869,11041=>873, +11042=>873,11043=>873,11044=>1119,11091=>869,11092=>869,11360=>637,11361=>360,11362=>637,11363=>733,11364=>770, +11365=>675,11366=>478,11367=>956,11368=>712,11369=>775,11370=>665,11371=>725,11372=>582,11373=>860,11374=>995, +11375=>774,11377=>778,11378=>1221,11379=>1056,11380=>652,11381=>698,11382=>565,11383=>782,11385=>538,11386=>687, +11387=>559,11388=>219,11389=>487,11568=>691,11569=>941,11570=>941,11571=>725,11572=>725,11573=>725,11574=>676, +11575=>774,11576=>774,11577=>683,11578=>683,11579=>802,11580=>989,11581=>761,11582=>623,11583=>761,11584=>941, +11585=>941,11586=>373,11587=>740,11588=>837,11589=>914,11590=>672,11591=>737,11592=>680,11593=>683,11594=>602, +11595=>1039,11596=>778,11597=>837,11598=>683,11599=>372,11600=>778,11601=>373,11602=>725,11603=>691,11604=>941, +11605=>941,11606=>837,11607=>373,11608=>836,11609=>941,11610=>941,11611=>734,11612=>876,11613=>771,11614=>734, +11615=>683,11616=>774,11617=>837,11618=>683,11619=>850,11620=>697,11621=>850,11631=>716,11800=>580,11810=>457, +11811=>457,11812=>457,11813=>457,11822=>580,19904=>896,19905=>896,19906=>896,19907=>896,19908=>896,19909=>896, +19910=>896,19911=>896,19912=>896,19913=>896,19914=>896,19915=>896,19916=>896,19917=>896,19918=>896,19919=>896, +19920=>896,19921=>896,19922=>896,19923=>896,19924=>896,19925=>896,19926=>896,19927=>896,19928=>896,19929=>896, +19930=>896,19931=>896,19932=>896,19933=>896,19934=>896,19935=>896,19936=>896,19937=>896,19938=>896,19939=>896, +19940=>896,19941=>896,19942=>896,19943=>896,19944=>896,19945=>896,19946=>896,19947=>896,19948=>896,19949=>896, +19950=>896,19951=>896,19952=>896,19953=>896,19954=>896,19955=>896,19956=>896,19957=>896,19958=>896,19959=>896, +19960=>896,19961=>896,19962=>896,19963=>896,19964=>896,19965=>896,19966=>896,19967=>896,42564=>720,42565=>595, +42566=>436,42567=>440,42572=>1405,42573=>1173,42576=>1234,42577=>1027,42580=>1174,42581=>972,42582=>1093,42583=>958, +42594=>1085,42595=>924,42596=>1096,42597=>912,42598=>1260,42599=>997,42600=>850,42601=>687,42602=>1037,42603=>868, +42604=>1406,42605=>1106,42606=>961,42634=>963,42635=>787,42636=>682,42637=>580,42644=>808,42645=>712,42760=>500, +42761=>500,42762=>500,42763=>500,42764=>500,42765=>500,42766=>500,42767=>500,42768=>500,42769=>500,42770=>500, +42771=>500,42772=>500,42773=>500,42774=>500,42779=>400,42780=>400,42781=>287,42782=>287,42783=>287,42790=>837, +42791=>712,42792=>1031,42793=>857,42794=>696,42795=>557,42800=>559,42801=>595,42802=>1349,42803=>1052,42804=>1284, +42805=>1064,42806=>1216,42807=>1054,42808=>1079,42809=>922,42810=>1079,42811=>922,42812=>1035,42813=>922,42814=>698, +42815=>549,42822=>850,42823=>542,42824=>683,42825=>531,42826=>918,42827=>814,42830=>1406,42831=>1106,42880=>637, +42881=>343,42882=>837,42883=>712,42889=>400,42890=>386,42891=>456,42892=>306,43003=>683,43004=>733,43005=>995, +43006=>372,43007=>1325,63173=>687,64256=>810,64257=>741,64258=>741,64259=>1115,64260=>1116,64261=>808,64262=>1020, +64275=>1388,64276=>1384,64277=>1378,64278=>1384,64279=>1713,64285=>343,64286=>0,64287=>663,64288=>720,64289=>963, +64290=>890,64291=>988,64292=>963,64293=>938,64294=>988,64295=>988,64296=>976,64297=>838,64298=>949,64299=>949, +64300=>949,64301=>949,64302=>751,64303=>751,64304=>751,64305=>673,64306=>537,64307=>654,64308=>712,64309=>438, +64310=>491,64312=>724,64313=>438,64314=>649,64315=>650,64316=>679,64318=>775,64320=>497,64321=>773,64323=>718, +64324=>687,64326=>751,64327=>729,64328=>649,64329=>949,64330=>751,64331=>343,64332=>673,64333=>650,64334=>687, +64335=>751,64338=>1005,64339=>1059,64340=>375,64341=>408,64342=>1005,64343=>1059,64344=>375,64345=>408,64346=>1005, +64347=>1059,64348=>375,64349=>408,64350=>1005,64351=>1059,64352=>375,64353=>408,64354=>1005,64355=>1059,64356=>375, +64357=>408,64358=>1005,64359=>1059,64360=>375,64361=>408,64362=>1162,64363=>1191,64364=>655,64365=>720,64366=>1162, +64367=>1191,64368=>655,64369=>720,64370=>721,64371=>721,64372=>721,64373=>721,64374=>721,64375=>721,64376=>721, +64377=>721,64378=>721,64379=>721,64380=>721,64381=>721,64382=>721,64383=>721,64384=>721,64385=>721,64394=>576, +64395=>622,64396=>576,64397=>622,64398=>1024,64399=>1024,64400=>582,64401=>582,64402=>1024,64403=>1024,64404=>582, +64405=>582,64414=>854,64415=>900,64473=>622,64474=>627,64488=>375,64489=>408,64508=>917,64509=>1012,64510=>375, +64511=>408,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0, +65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0, +65059=>0,65136=>342,65137=>342,65138=>342,65139=>346,65140=>342,65142=>342,65143=>342,65144=>342,65145=>342, +65146=>342,65147=>342,65148=>342,65149=>342,65150=>342,65151=>342,65152=>511,65153=>343,65154=>375,65155=>343, +65156=>375,65157=>622,65158=>627,65159=>343,65160=>375,65161=>917,65162=>917,65163=>375,65164=>408,65165=>343, +65166=>375,65167=>1005,65168=>1059,65169=>375,65170=>408,65171=>590,65172=>606,65173=>1005,65174=>1059,65175=>375, +65176=>408,65177=>1005,65178=>1059,65179=>375,65180=>408,65181=>721,65182=>721,65183=>721,65184=>721,65185=>721, +65186=>721,65187=>721,65188=>721,65189=>721,65190=>721,65191=>721,65192=>721,65193=>513,65194=>578,65195=>513, +65196=>578,65197=>576,65198=>622,65199=>576,65200=>622,65201=>1380,65202=>1414,65203=>983,65204=>1018,65205=>1380, +65206=>1414,65207=>983,65208=>1018,65209=>1345,65210=>1364,65211=>966,65212=>985,65213=>1345,65214=>1364,65215=>966, +65216=>985,65217=>1039,65218=>1071,65219=>942,65220=>974,65221=>1039,65222=>1071,65223=>942,65224=>974,65225=>683, +65226=>683,65227=>683,65228=>564,65229=>683,65230=>683,65231=>683,65232=>564,65233=>1162,65234=>1191,65235=>655, +65236=>720,65237=>894,65238=>901,65239=>655,65240=>720,65241=>917,65242=>931,65243=>582,65244=>582,65245=>868, +65246=>893,65247=>375,65248=>408,65249=>733,65250=>784,65251=>619,65252=>670,65253=>854,65254=>900,65255=>375, +65256=>408,65257=>590,65258=>606,65259=>693,65260=>660,65261=>622,65262=>627,65263=>917,65264=>1012,65265=>917, +65266=>1012,65267=>375,65268=>408,65269=>745,65270=>759,65271=>745,65272=>759,65273=>745,65274=>759,65275=>745, +65276=>759,65279=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1113); +$enc=''; +$diff=''; +$file='dejavusansb.z'; +$ctg='dejavusansb.ctg.z'; +$originalsize=573136; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansb.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansb.z new file mode 100644 index 0000000..9d465a6 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansb.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansbi.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansbi.ctg.z new file mode 100644 index 0000000..9d1fcd6 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansbi.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansbi.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansbi.php new file mode 100644 index 0000000..dc63d90 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansbi.php @@ -0,0 +1,458 @@ +<?php +$type='TrueTypeUnicode'; +$name='DejaVuSans-BoldOblique'; +$desc=array('Ascent'=>928,'Descent'=>-236,'CapHeight'=>-51,'Flags'=>96,'FontBBox'=>'[-1067 -385 2005 1121]','ItalicAngle'=>-11,'StemV'=>120,'MissingWidth'=>600); +$up=-63; +$ut=44; +$dw=600; +$cw=array( +0=>600,32=>348,33=>456,34=>521,35=>696,36=>696,37=>1002,38=>872,39=>306,40=>457, +41=>457,42=>523,43=>838,44=>380,45=>415,46=>380,47=>365,48=>696,49=>696,50=>696, +51=>696,52=>696,53=>696,54=>696,55=>696,56=>696,57=>696,58=>400,59=>400,60=>838, +61=>838,62=>838,63=>580,64=>1000,65=>774,66=>762,67=>734,68=>830,69=>683,70=>683, +71=>821,72=>837,73=>372,74=>372,75=>775,76=>637,77=>995,78=>837,79=>850,80=>733, +81=>850,82=>770,83=>720,84=>682,85=>812,86=>774,87=>1103,88=>771,89=>724,90=>725, +91=>457,92=>365,93=>457,94=>838,95=>500,96=>500,97=>675,98=>716,99=>593,100=>716, +101=>678,102=>435,103=>716,104=>712,105=>343,106=>343,107=>665,108=>343,109=>1042,110=>712, +111=>687,112=>716,113=>716,114=>493,115=>595,116=>478,117=>712,118=>652,119=>924,120=>645, +121=>652,122=>582,123=>712,124=>365,125=>712,126=>838,8364=>696,8218=>380,402=>435,8222=>644, +8230=>1000,8224=>500,8225=>500,710=>500,8240=>1454,352=>720,8249=>412,338=>1167,381=>725,8216=>380, +8217=>380,8220=>644,8221=>644,8226=>639,8211=>500,8212=>1000,732=>500,8482=>1000,353=>595,8250=>412, +339=>1094,382=>582,376=>724,160=>348,161=>456,162=>696,163=>696,164=>636,165=>696,166=>365, +167=>500,168=>500,169=>1000,170=>564,171=>650,172=>838,173=>415,174=>1000,175=>500,176=>500, +177=>838,178=>438,179=>438,180=>500,181=>736,182=>636,183=>380,184=>500,185=>438,186=>564, +187=>650,188=>1035,189=>1035,190=>1035,191=>580,192=>774,193=>774,194=>774,195=>774,196=>774, +197=>774,198=>1085,199=>734,200=>683,201=>683,202=>683,203=>683,204=>372,205=>372,206=>372, +207=>372,208=>845,209=>837,210=>850,211=>850,212=>850,213=>850,214=>850,215=>838,216=>850, +217=>812,218=>812,219=>812,220=>812,221=>724,222=>742,223=>719,224=>675,225=>675,226=>675, +227=>675,228=>675,229=>675,230=>1048,231=>593,232=>678,233=>678,234=>678,235=>678,236=>343, +237=>343,238=>343,239=>343,240=>687,241=>712,242=>687,243=>687,244=>687,245=>687,246=>687, +247=>838,248=>687,249=>712,250=>712,251=>712,252=>712,253=>652,254=>716,255=>652,256=>774, +257=>675,258=>774,259=>675,260=>774,261=>675,262=>734,263=>593,264=>734,265=>593,266=>734, +267=>593,268=>734,269=>593,270=>830,271=>716,272=>845,273=>716,274=>683,275=>678,276=>683, +277=>678,278=>683,279=>678,280=>683,281=>678,282=>683,283=>678,284=>821,285=>716,286=>821, +287=>716,288=>821,289=>716,290=>821,291=>716,292=>837,293=>712,294=>974,295=>790,296=>372, +297=>343,298=>372,299=>343,300=>372,301=>343,302=>372,303=>343,304=>372,305=>343,306=>744, +307=>686,308=>372,309=>343,310=>775,311=>665,312=>665,313=>637,314=>343,315=>637,316=>343, +317=>637,318=>343,319=>637,320=>343,321=>660,322=>375,323=>837,324=>712,325=>837,326=>712, +327=>837,328=>712,329=>983,330=>837,331=>712,332=>850,333=>687,334=>850,335=>687,336=>850, +337=>687,340=>770,341=>493,342=>770,343=>493,344=>770,345=>493,346=>720,347=>595,348=>720, +349=>595,350=>720,351=>595,354=>682,355=>478,356=>682,357=>478,358=>682,359=>478,360=>812, +361=>712,362=>812,363=>712,364=>812,365=>712,366=>812,367=>712,368=>812,369=>712,370=>812, +371=>712,372=>1103,373=>924,374=>724,375=>652,377=>725,378=>582,379=>725,380=>582,383=>435, +384=>716,385=>811,386=>762,387=>716,388=>762,389=>716,390=>734,391=>734,392=>593,393=>845, +394=>879,395=>762,396=>716,397=>687,398=>683,399=>850,400=>696,401=>683,403=>821,404=>793, +405=>1045,406=>436,407=>389,408=>775,409=>665,410=>360,411=>592,412=>1042,413=>837,414=>712, +415=>850,416=>850,417=>687,418=>1114,419=>962,420=>782,421=>716,422=>770,423=>720,424=>595, +425=>683,426=>552,427=>478,428=>707,429=>478,430=>682,431=>812,432=>712,433=>769,434=>813, +435=>797,436=>778,437=>725,438=>582,439=>772,440=>772,441=>641,442=>582,443=>696,444=>772, +445=>641,446=>573,447=>716,448=>372,449=>659,450=>544,451=>372,452=>1548,453=>1450,454=>1307, +455=>977,456=>979,457=>670,458=>1193,459=>1213,460=>1063,461=>774,462=>675,463=>372,464=>343, +465=>850,466=>687,467=>812,468=>712,469=>812,470=>712,471=>812,472=>712,473=>812,474=>712, +475=>812,476=>712,477=>678,478=>774,479=>675,480=>774,481=>675,482=>1085,483=>1048,484=>821, +485=>716,486=>821,487=>716,488=>775,489=>665,490=>850,491=>687,492=>850,493=>687,494=>772, +495=>582,496=>343,497=>1548,498=>1450,499=>1307,500=>821,501=>716,502=>1289,503=>787,504=>837, +505=>712,506=>774,507=>675,508=>1085,509=>1048,510=>850,511=>687,512=>774,513=>675,514=>774, +515=>675,516=>683,517=>678,518=>683,519=>678,520=>372,521=>343,522=>372,523=>343,524=>850, +525=>687,526=>850,527=>687,528=>770,529=>493,530=>770,531=>493,532=>812,533=>712,534=>812, +535=>712,536=>720,537=>595,538=>682,539=>478,540=>690,541=>607,542=>837,543=>712,544=>837, +545=>865,546=>809,547=>659,548=>725,549=>582,550=>774,551=>675,552=>683,553=>678,554=>850, +555=>687,556=>850,557=>687,558=>850,559=>687,560=>850,561=>687,562=>724,563=>652,564=>492, +565=>867,566=>512,567=>343,568=>1088,569=>1088,570=>774,571=>734,572=>593,573=>637,574=>682, +575=>595,576=>582,577=>782,578=>614,579=>762,580=>812,581=>774,582=>683,583=>678,584=>372, +585=>343,586=>860,587=>791,588=>770,589=>493,590=>724,591=>652,592=>675,593=>716,594=>716, +595=>716,596=>593,597=>593,598=>791,599=>792,600=>678,601=>678,602=>876,603=>557,604=>545, +605=>774,606=>731,607=>343,608=>792,609=>716,610=>627,611=>735,612=>635,613=>712,614=>712, +615=>712,616=>545,617=>440,618=>545,619=>559,620=>693,621=>343,622=>841,623=>1042,624=>1042, +625=>1042,626=>712,627=>793,628=>642,629=>687,630=>909,631=>682,632=>796,633=>538,634=>538, +635=>650,636=>493,637=>493,638=>596,639=>596,640=>642,641=>642,642=>595,643=>415,644=>435, +645=>605,646=>552,647=>478,648=>478,649=>920,650=>769,651=>670,652=>652,653=>924,654=>652, +655=>724,656=>694,657=>684,658=>641,659=>641,660=>573,661=>573,662=>573,663=>573,664=>850, +665=>633,666=>731,667=>685,668=>691,669=>343,670=>732,671=>539,672=>792,673=>573,674=>573, +675=>1156,676=>1214,677=>1155,678=>974,679=>769,680=>929,681=>1026,682=>792,683=>780,684=>591, +685=>415,686=>677,687=>789,688=>456,689=>456,690=>219,691=>315,692=>315,693=>315,694=>411, +695=>591,696=>417,697=>302,698=>521,699=>380,700=>380,701=>380,702=>366,703=>366,704=>326, +705=>326,706=>500,707=>500,708=>500,709=>500,711=>500,712=>306,713=>500,714=>500,715=>500, +716=>306,717=>500,718=>500,719=>500,720=>337,721=>337,722=>366,723=>366,724=>500,725=>500, +726=>416,727=>328,728=>500,729=>500,730=>500,731=>500,733=>500,734=>351,735=>500,736=>412, +737=>219,738=>381,739=>413,740=>326,741=>500,742=>500,743=>500,744=>500,745=>500,748=>500, +749=>500,750=>644,755=>500,759=>500,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0, +774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0, +784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0, +794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0, +804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0, +814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0, +824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0, +834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0, +844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0, +860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>698,881=>565,882=>1022, +883=>836,884=>302,885=>302,886=>837,887=>701,890=>500,891=>593,892=>550,893=>549,894=>400, +900=>441,901=>500,902=>797,903=>380,904=>846,905=>1009,906=>563,908=>891,910=>980,911=>894, +912=>390,913=>774,914=>762,915=>637,916=>774,917=>683,918=>725,919=>837,920=>850,921=>372, +922=>775,923=>774,924=>995,925=>837,926=>632,927=>850,928=>837,929=>733,931=>683,932=>682, +933=>724,934=>850,935=>771,936=>850,937=>850,938=>372,939=>724,940=>687,941=>557,942=>712, +943=>390,944=>675,945=>687,946=>716,947=>681,948=>687,949=>557,950=>591,951=>712,952=>687, +953=>390,954=>710,955=>633,956=>736,957=>681,958=>591,959=>687,960=>791,961=>716,962=>593, +963=>779,964=>638,965=>675,966=>782,967=>645,968=>794,969=>869,970=>390,971=>675,972=>687, +973=>675,974=>869,975=>775,976=>651,977=>661,978=>746,979=>981,980=>746,981=>796,982=>869, +983=>744,984=>850,985=>687,986=>734,987=>593,988=>683,989=>494,990=>702,991=>660,992=>919, +993=>627,994=>1093,995=>837,996=>832,997=>716,998=>928,999=>744,1000=>733,1001=>650,1002=>789, +1003=>671,1004=>752,1005=>716,1006=>682,1007=>590,1008=>744,1009=>716,1010=>593,1011=>343,1012=>850, +1013=>645,1014=>645,1015=>742,1016=>716,1017=>734,1018=>995,1019=>732,1020=>716,1021=>734,1022=>734, +1023=>698,1024=>683,1025=>683,1026=>878,1027=>637,1028=>734,1029=>720,1030=>372,1031=>372,1032=>372, +1033=>1154,1034=>1130,1035=>878,1036=>817,1037=>837,1038=>771,1039=>837,1040=>774,1041=>762,1042=>762, +1043=>637,1044=>891,1045=>683,1046=>1224,1047=>710,1048=>837,1049=>837,1050=>817,1051=>831,1052=>995, +1053=>837,1054=>850,1055=>837,1056=>733,1057=>734,1058=>682,1059=>771,1060=>992,1061=>771,1062=>928, +1063=>808,1064=>1235,1065=>1326,1066=>939,1067=>1036,1068=>762,1069=>734,1070=>1174,1071=>770,1072=>675, +1073=>698,1074=>633,1075=>522,1076=>808,1077=>678,1078=>995,1079=>581,1080=>701,1081=>701,1082=>679, +1083=>732,1084=>817,1085=>691,1086=>687,1087=>691,1088=>716,1089=>593,1090=>580,1091=>652,1092=>992, +1093=>645,1094=>741,1095=>687,1096=>1062,1097=>1105,1098=>751,1099=>904,1100=>632,1101=>593,1102=>972, +1103=>642,1104=>678,1105=>678,1106=>714,1107=>522,1108=>593,1109=>595,1110=>343,1111=>343,1112=>343, +1113=>991,1114=>956,1115=>734,1116=>679,1117=>701,1118=>652,1119=>691,1120=>1093,1121=>869,1122=>840, +1123=>736,1124=>1012,1125=>839,1126=>992,1127=>832,1128=>1358,1129=>1121,1130=>850,1131=>687,1132=>1236, +1133=>1007,1134=>696,1135=>557,1136=>1075,1137=>1061,1138=>850,1139=>687,1140=>850,1141=>695,1142=>850, +1143=>695,1144=>1148,1145=>1043,1146=>1074,1147=>863,1148=>1405,1149=>1173,1150=>1093,1151=>869,1152=>734, +1153=>593,1154=>652,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>418,1161=>418,1162=>938, +1163=>806,1164=>762,1165=>611,1166=>736,1167=>718,1168=>637,1169=>522,1170=>666,1171=>543,1172=>789, +1173=>522,1174=>1224,1175=>995,1176=>710,1177=>581,1178=>775,1179=>679,1180=>817,1181=>679,1182=>817, +1183=>679,1184=>1015,1185=>826,1186=>837,1187=>691,1188=>1103,1189=>871,1190=>1254,1191=>979,1192=>946, +1193=>859,1194=>734,1195=>593,1196=>682,1197=>580,1198=>724,1199=>652,1200=>724,1201=>652,1202=>771, +1203=>645,1204=>1104,1205=>1001,1206=>808,1207=>687,1208=>808,1209=>687,1210=>808,1211=>712,1212=>1026, +1213=>810,1214=>1026,1215=>810,1216=>372,1217=>1224,1218=>995,1219=>778,1220=>629,1221=>933,1222=>804, +1223=>837,1224=>691,1225=>938,1226=>806,1227=>808,1228=>687,1229=>1096,1230=>932,1231=>343,1232=>774, +1233=>675,1234=>774,1235=>675,1236=>1085,1237=>1048,1238=>683,1239=>678,1240=>850,1241=>678,1242=>850, +1243=>678,1244=>1224,1245=>995,1246=>710,1247=>581,1248=>772,1249=>641,1250=>837,1251=>701,1252=>837, +1253=>701,1254=>850,1255=>687,1256=>850,1257=>687,1258=>850,1259=>687,1260=>734,1261=>593,1262=>771, +1263=>652,1264=>771,1265=>652,1266=>771,1267=>652,1268=>808,1269=>687,1270=>637,1271=>522,1272=>1036, +1273=>904,1274=>666,1275=>543,1276=>771,1277=>645,1278=>771,1279=>645,1280=>762,1281=>608,1282=>1159, +1283=>893,1284=>1119,1285=>920,1286=>828,1287=>693,1288=>1242,1289=>1017,1290=>1289,1291=>1013,1292=>839, +1293=>638,1294=>938,1295=>803,1296=>696,1297=>557,1298=>831,1299=>732,1300=>1286,1301=>1070,1302=>1065, +1303=>982,1304=>1082,1305=>960,1306=>850,1307=>716,1308=>1103,1309=>924,1312=>1248,1313=>1022,1314=>1254, +1315=>979,1316=>957,1317=>807,1329=>984,1330=>812,1331=>984,1332=>984,1333=>812,1334=>777,1335=>812, +1336=>812,1337=>975,1338=>984,1339=>812,1340=>710,1341=>1078,1342=>1136,1343=>812,1344=>710,1345=>757, +1346=>984,1347=>876,1348=>984,1349=>793,1350=>984,1351=>812,1352=>812,1353=>812,1354=>958,1355=>777, +1356=>984,1357=>812,1358=>984,1359=>720,1360=>812,1361=>793,1362=>895,1363=>850,1364=>936,1365=>850, +1366=>720,1369=>366,1370=>380,1371=>550,1372=>550,1373=>380,1374=>546,1375=>521,1377=>1042,1378=>712, +1379=>866,1380=>868,1381=>712,1382=>817,1383=>653,1384=>712,1385=>811,1386=>817,1387=>712,1388=>498, +1389=>1018,1390=>716,1391=>712,1392=>712,1393=>716,1394=>819,1395=>712,1396=>751,1397=>343,1398=>882, +1399=>559,1400=>712,1401=>559,1402=>1042,1403=>559,1404=>863,1405=>712,1406=>813,1407=>1042,1408=>712, +1409=>716,1410=>571,1411=>1042,1412=>778,1413=>687,1414=>720,1415=>862,1417=>400,1418=>487,1456=>0, +1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0, +1467=>0,1468=>0,1469=>0,1470=>415,1471=>0,1472=>372,1473=>0,1474=>0,1475=>372,1478=>497, +1479=>0,1488=>751,1489=>673,1490=>537,1491=>654,1492=>712,1493=>343,1494=>491,1495=>712,1496=>724, +1497=>343,1498=>649,1499=>650,1500=>679,1501=>712,1502=>775,1503=>343,1504=>497,1505=>773,1506=>678, +1507=>718,1508=>687,1509=>628,1510=>751,1511=>729,1512=>649,1513=>949,1514=>751,1520=>664,1521=>664, +1522=>663,1523=>444,1524=>710,3647=>743,3713=>815,3714=>748,3716=>749,3719=>569,3720=>742,3722=>744, +3725=>761,3732=>706,3733=>704,3734=>747,3735=>819,3737=>730,3738=>727,3739=>727,3740=>922,3741=>827, +3742=>866,3743=>866,3745=>836,3746=>761,3747=>770,3749=>769,3751=>713,3754=>827,3755=>1031,3757=>724, +3758=>784,3759=>934,3760=>688,3761=>0,3762=>610,3763=>610,3764=>0,3765=>0,3766=>0,3767=>0, +3768=>0,3769=>0,3771=>0,3772=>0,3773=>670,3776=>516,3777=>860,3778=>516,3779=>650,3780=>632, +3782=>759,3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>771,3793=>771,3794=>693, +3795=>836,3796=>729,3797=>729,3798=>849,3799=>790,3800=>759,3801=>910,3804=>1363,3805=>1363,4256=>918, +4257=>744,4258=>739,4259=>837,4260=>649,4261=>773,4262=>857,4263=>889,4264=>530,4265=>633,4266=>857, +4267=>900,4268=>643,4269=>903,4270=>814,4271=>752,4272=>869,4273=>643,4274=>643,4275=>886,4276=>886, +4277=>733,4278=>653,4279=>643,4280=>646,4281=>643,4282=>790,4283=>902,4284=>633,4285=>619,4286=>643, +4287=>778,4288=>892,4289=>601,4290=>742,4291=>616,4292=>633,4293=>742,4304=>553,4305=>552,4306=>596, +4307=>815,4308=>562,4309=>563,4310=>553,4311=>827,4312=>553,4313=>543,4314=>1074,4315=>563,4316=>563, +4317=>812,4318=>552,4319=>591,4320=>822,4321=>563,4322=>690,4323=>583,4324=>813,4325=>562,4326=>813, +4327=>563,4328=>563,4329=>563,4330=>632,4331=>563,4332=>563,4333=>552,4334=>563,4335=>563,4336=>558, +4337=>604,4338=>552,4339=>552,4340=>553,4341=>605,4342=>852,4343=>635,4344=>563,4345=>596,4346=>542, +4347=>684,4348=>368,5121=>774,5122=>774,5123=>774,5124=>774,5125=>905,5126=>905,5127=>905,5129=>905, +5130=>905,5131=>905,5132=>1018,5133=>1009,5134=>1018,5135=>1009,5136=>1018,5137=>1009,5138=>1149,5139=>1140, +5140=>1149,5141=>1140,5142=>905,5143=>1149,5144=>1142,5145=>1149,5146=>1142,5147=>905,5149=>310,5150=>529, +5151=>425,5152=>425,5153=>395,5154=>395,5155=>395,5156=>395,5157=>564,5158=>470,5159=>310,5160=>395, +5161=>395,5162=>395,5163=>1213,5164=>986,5165=>1216,5166=>1297,5167=>774,5168=>774,5169=>774,5170=>774, +5171=>886,5172=>886,5173=>886,5175=>886,5176=>886,5177=>886,5178=>1018,5179=>1009,5180=>1018,5181=>1009, +5182=>1018,5183=>1009,5184=>1149,5185=>1140,5186=>1149,5187=>1140,5188=>1149,5189=>1142,5190=>1149,5191=>1142, +5192=>886,5193=>576,5194=>229,5196=>812,5197=>812,5198=>812,5199=>812,5200=>815,5201=>815,5202=>815, +5204=>815,5205=>815,5206=>815,5207=>1056,5208=>1048,5209=>1056,5210=>1048,5211=>1056,5212=>1048,5213=>1060, +5214=>1054,5215=>1060,5216=>1054,5217=>1060,5218=>1052,5219=>1060,5220=>1052,5221=>1060,5222=>483,5223=>1005, +5224=>1005,5225=>1023,5226=>1017,5227=>743,5228=>743,5229=>743,5230=>743,5231=>743,5232=>743,5233=>743, +5234=>743,5235=>743,5236=>1029,5237=>975,5238=>980,5239=>975,5240=>980,5241=>975,5242=>1029,5243=>975, +5244=>1029,5245=>975,5246=>980,5247=>975,5248=>980,5249=>975,5250=>980,5251=>501,5252=>501,5253=>938, +5254=>938,5255=>938,5256=>938,5257=>743,5258=>743,5259=>743,5260=>743,5261=>743,5262=>743,5263=>743, +5264=>743,5265=>743,5266=>1029,5267=>975,5268=>1029,5269=>975,5270=>1029,5271=>975,5272=>1029,5273=>975, +5274=>1029,5275=>975,5276=>1029,5277=>975,5278=>1029,5279=>975,5280=>1029,5281=>501,5282=>501,5283=>626, +5284=>626,5285=>626,5286=>626,5287=>626,5288=>626,5289=>626,5290=>626,5291=>626,5292=>881,5293=>854, +5294=>863,5295=>874,5296=>863,5297=>874,5298=>881,5299=>874,5300=>881,5301=>874,5302=>863,5303=>874, +5304=>863,5305=>874,5306=>863,5307=>436,5308=>548,5309=>436,5312=>988,5313=>988,5314=>988,5315=>988, +5316=>931,5317=>931,5318=>931,5319=>931,5320=>931,5321=>1238,5322=>1247,5323=>1200,5324=>1228,5325=>1200, +5326=>1228,5327=>931,5328=>660,5329=>497,5330=>660,5331=>988,5332=>988,5333=>988,5334=>988,5335=>931, +5336=>931,5337=>931,5338=>931,5339=>931,5340=>1231,5341=>1247,5342=>1283,5343=>1228,5344=>1283,5345=>1228, +5346=>1228,5347=>1214,5348=>1228,5349=>1214,5350=>1283,5351=>1228,5352=>1283,5353=>1228,5354=>660,5356=>886, +5357=>730,5358=>730,5359=>730,5360=>730,5361=>730,5362=>730,5363=>730,5364=>730,5365=>730,5366=>998, +5367=>958,5368=>967,5369=>989,5370=>967,5371=>989,5372=>998,5373=>958,5374=>998,5375=>958,5376=>967, +5377=>989,5378=>967,5379=>989,5380=>967,5381=>493,5382=>460,5383=>493,5392=>923,5393=>923,5394=>923, +5395=>1136,5396=>1136,5397=>1136,5398=>1136,5399=>1209,5400=>1202,5401=>1209,5402=>1202,5403=>1209,5404=>1202, +5405=>1431,5406=>1420,5407=>1431,5408=>1420,5409=>1431,5410=>1420,5411=>1431,5412=>1420,5413=>746,5414=>776, +5415=>776,5416=>776,5417=>776,5418=>776,5419=>776,5420=>776,5421=>776,5422=>776,5423=>1003,5424=>1003, +5425=>1013,5426=>996,5427=>1013,5428=>996,5429=>1003,5430=>1003,5431=>1003,5432=>1003,5433=>1013,5434=>996, +5435=>1013,5436=>996,5437=>1013,5438=>495,5440=>395,5441=>510,5442=>1033,5443=>1033,5444=>976,5445=>976, +5446=>976,5447=>976,5448=>733,5449=>733,5450=>733,5451=>733,5452=>733,5453=>733,5454=>1003,5455=>959, +5456=>495,5458=>886,5459=>774,5460=>774,5461=>774,5462=>774,5463=>928,5464=>928,5465=>928,5466=>928, +5467=>1172,5468=>1142,5469=>602,5470=>812,5471=>812,5472=>812,5473=>812,5474=>812,5475=>812,5476=>815, +5477=>815,5478=>815,5479=>815,5480=>1060,5481=>1052,5482=>548,5492=>977,5493=>977,5494=>977,5495=>977, +5496=>977,5497=>977,5498=>977,5499=>618,5500=>837,5501=>510,5502=>1238,5503=>1238,5504=>1238,5505=>1238, +5506=>1238,5507=>1238,5508=>1238,5509=>989,5514=>977,5515=>977,5516=>977,5517=>977,5518=>1591,5519=>1591, +5520=>1591,5521=>1295,5522=>1295,5523=>1591,5524=>1591,5525=>848,5526=>1273,5536=>988,5537=>988,5538=>931, +5539=>931,5540=>931,5541=>931,5542=>660,5543=>776,5544=>776,5545=>776,5546=>776,5547=>776,5548=>776, +5549=>776,5550=>495,5551=>743,5598=>830,5601=>830,5702=>496,5703=>496,5742=>413,5743=>1238,5744=>1591, +5745=>2016,5746=>2016,5747=>1720,5748=>1678,5749=>2016,5750=>2016,7424=>652,7425=>833,7426=>1048,7427=>608, +7428=>593,7429=>676,7430=>676,7431=>559,7432=>557,7433=>343,7434=>494,7435=>665,7436=>539,7437=>817, +7438=>701,7439=>687,7440=>593,7441=>660,7442=>660,7443=>660,7444=>1094,7446=>687,7447=>687,7448=>556, +7449=>642,7450=>642,7451=>580,7452=>634,7453=>737,7454=>948,7455=>695,7456=>652,7457=>924,7458=>582, +7459=>646,7462=>539,7463=>652,7464=>691,7465=>556,7466=>781,7467=>732,7468=>487,7469=>683,7470=>480, +7472=>523,7473=>430,7474=>430,7475=>517,7476=>527,7477=>234,7478=>234,7479=>488,7480=>401,7481=>626, +7482=>527,7483=>527,7484=>535,7485=>509,7486=>461,7487=>485,7488=>430,7489=>511,7490=>695,7491=>458, +7492=>458,7493=>479,7494=>712,7495=>479,7496=>479,7497=>479,7498=>479,7499=>386,7500=>386,7501=>479, +7502=>219,7503=>487,7504=>664,7505=>456,7506=>488,7507=>414,7508=>488,7509=>488,7510=>479,7511=>388, +7512=>456,7513=>462,7514=>664,7515=>501,7517=>451,7518=>429,7519=>433,7520=>493,7521=>406,7522=>219, +7523=>315,7524=>456,7525=>501,7526=>451,7527=>429,7528=>451,7529=>493,7530=>406,7543=>716,7544=>527, +7547=>545,7557=>514,7579=>479,7580=>414,7581=>414,7582=>488,7583=>386,7584=>377,7585=>348,7586=>479, +7587=>456,7588=>347,7589=>281,7590=>347,7591=>347,7592=>431,7593=>326,7594=>330,7595=>370,7596=>664, +7597=>664,7598=>562,7599=>562,7600=>448,7601=>488,7602=>542,7603=>422,7604=>396,7605=>388,7606=>583, +7607=>494,7608=>399,7609=>451,7610=>501,7611=>417,7612=>523,7613=>470,7614=>455,7615=>425,7620=>0, +7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>774,7681=>675,7682=>762,7683=>716,7684=>762, +7685=>716,7686=>762,7687=>716,7688=>734,7689=>593,7690=>830,7691=>716,7692=>830,7693=>716,7694=>830, +7695=>716,7696=>830,7697=>716,7698=>830,7699=>716,7700=>683,7701=>678,7702=>683,7703=>678,7704=>683, +7705=>678,7706=>683,7707=>678,7708=>683,7709=>678,7710=>683,7711=>435,7712=>821,7713=>716,7714=>837, +7715=>712,7716=>837,7717=>712,7718=>837,7719=>712,7720=>837,7721=>712,7722=>837,7723=>712,7724=>372, +7725=>343,7726=>372,7727=>343,7728=>775,7729=>665,7730=>775,7731=>665,7732=>775,7733=>665,7734=>637, +7735=>343,7736=>637,7737=>343,7738=>637,7739=>343,7740=>637,7741=>343,7742=>995,7743=>1042,7744=>995, +7745=>1042,7746=>995,7747=>1042,7748=>837,7749=>712,7750=>837,7751=>712,7752=>837,7753=>712,7754=>837, +7755=>712,7756=>850,7757=>687,7758=>850,7759=>687,7760=>850,7761=>687,7762=>850,7763=>687,7764=>733, +7765=>716,7766=>733,7767=>716,7768=>770,7769=>493,7770=>770,7771=>493,7772=>770,7773=>493,7774=>770, +7775=>493,7776=>720,7777=>595,7778=>720,7779=>595,7780=>720,7781=>595,7782=>720,7783=>595,7784=>720, +7785=>595,7786=>682,7787=>478,7788=>682,7789=>478,7790=>682,7791=>478,7792=>682,7793=>478,7794=>812, +7795=>712,7796=>812,7797=>712,7798=>812,7799=>712,7800=>812,7801=>712,7802=>812,7803=>712,7804=>774, +7805=>652,7806=>774,7807=>652,7808=>1103,7809=>924,7810=>1103,7811=>924,7812=>1103,7813=>924,7814=>1103, +7815=>924,7816=>1103,7817=>924,7818=>771,7819=>645,7820=>771,7821=>645,7822=>724,7823=>652,7824=>725, +7825=>582,7826=>725,7827=>582,7828=>725,7829=>582,7830=>712,7831=>478,7832=>924,7833=>652,7834=>675, +7835=>435,7838=>896,7839=>687,7840=>774,7841=>675,7842=>774,7843=>675,7844=>774,7845=>675,7846=>774, +7847=>675,7848=>774,7849=>675,7850=>774,7851=>675,7852=>774,7853=>675,7854=>774,7855=>675,7856=>774, +7857=>675,7858=>774,7859=>675,7860=>774,7861=>675,7862=>774,7863=>675,7864=>683,7865=>678,7866=>683, +7867=>678,7868=>683,7869=>678,7870=>683,7871=>678,7872=>683,7873=>678,7874=>683,7875=>678,7876=>683, +7877=>678,7878=>683,7879=>678,7880=>372,7881=>343,7882=>372,7883=>343,7884=>850,7885=>687,7886=>850, +7887=>687,7888=>850,7889=>687,7890=>850,7891=>687,7892=>850,7893=>687,7894=>850,7895=>687,7896=>850, +7897=>687,7898=>850,7899=>687,7900=>850,7901=>687,7902=>850,7903=>687,7904=>850,7905=>687,7906=>850, +7907=>687,7908=>812,7909=>712,7910=>812,7911=>712,7912=>812,7913=>712,7914=>812,7915=>712,7916=>812, +7917=>712,7918=>812,7919=>712,7920=>812,7921=>712,7922=>724,7923=>652,7924=>724,7925=>652,7926=>724, +7927=>652,7928=>724,7929=>652,7936=>687,7937=>687,7938=>687,7939=>687,7940=>687,7941=>687,7942=>687, +7943=>687,7944=>774,7945=>774,7946=>1041,7947=>1043,7948=>935,7949=>963,7950=>835,7951=>859,7952=>557, +7953=>557,7954=>557,7955=>557,7956=>557,7957=>557,7960=>792,7961=>794,7962=>1100,7963=>1096,7964=>1023, +7965=>1052,7968=>712,7969=>712,7970=>712,7971=>712,7972=>712,7973=>712,7974=>712,7975=>712,7976=>945, +7977=>951,7978=>1250,7979=>1250,7980=>1180,7981=>1206,7982=>1054,7983=>1063,7984=>390,7985=>390,7986=>390, +7987=>390,7988=>390,7989=>390,7990=>390,7991=>390,7992=>483,7993=>489,7994=>777,7995=>785,7996=>712, +7997=>738,7998=>604,7999=>604,8000=>687,8001=>687,8002=>687,8003=>687,8004=>687,8005=>687,8008=>892, +8009=>933,8010=>1221,8011=>1224,8012=>1053,8013=>1082,8016=>675,8017=>675,8018=>675,8019=>675,8020=>675, +8021=>675,8022=>675,8023=>675,8025=>930,8027=>1184,8029=>1199,8031=>1049,8032=>869,8033=>869,8034=>869, +8035=>869,8036=>869,8037=>869,8038=>869,8039=>869,8040=>909,8041=>958,8042=>1246,8043=>1251,8044=>1076, +8045=>1105,8046=>1028,8047=>1076,8048=>687,8049=>687,8050=>557,8051=>557,8052=>712,8053=>712,8054=>390, +8055=>390,8056=>687,8057=>687,8058=>675,8059=>675,8060=>869,8061=>869,8064=>687,8065=>687,8066=>687, +8067=>687,8068=>687,8069=>687,8070=>687,8071=>687,8072=>774,8073=>774,8074=>1041,8075=>1043,8076=>935, +8077=>963,8078=>835,8079=>859,8080=>712,8081=>712,8082=>712,8083=>712,8084=>712,8085=>712,8086=>712, +8087=>712,8088=>945,8089=>951,8090=>1250,8091=>1250,8092=>1180,8093=>1206,8094=>1054,8095=>1063,8096=>869, +8097=>869,8098=>869,8099=>869,8100=>869,8101=>869,8102=>869,8103=>869,8104=>909,8105=>958,8106=>1246, +8107=>1251,8108=>1076,8109=>1105,8110=>1028,8111=>1076,8112=>687,8113=>687,8114=>687,8115=>687,8116=>687, +8118=>687,8119=>687,8120=>774,8121=>774,8122=>876,8123=>797,8124=>774,8125=>500,8126=>500,8127=>500, +8128=>500,8129=>500,8130=>712,8131=>712,8132=>712,8134=>712,8135=>712,8136=>929,8137=>846,8138=>1080, +8139=>1009,8140=>837,8141=>500,8142=>500,8143=>500,8144=>390,8145=>390,8146=>390,8147=>390,8150=>390, +8151=>390,8152=>372,8153=>372,8154=>621,8155=>563,8157=>500,8158=>500,8159=>500,8160=>675,8161=>675, +8162=>675,8163=>675,8164=>716,8165=>716,8166=>675,8167=>675,8168=>724,8169=>724,8170=>1020,8171=>980, +8172=>838,8173=>500,8174=>500,8175=>500,8178=>869,8179=>869,8180=>869,8182=>869,8183=>869,8184=>1065, +8185=>891,8186=>1084,8187=>894,8188=>850,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000, +8196=>330,8197=>250,8198=>167,8199=>696,8200=>380,8201=>200,8202=>100,8203=>0,8204=>0,8205=>0, +8206=>0,8207=>0,8208=>415,8209=>415,8210=>696,8213=>1000,8214=>500,8215=>500,8219=>380,8223=>657, +8227=>639,8228=>380,8229=>685,8231=>348,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>200, +8241=>1908,8242=>264,8243=>447,8244=>630,8245=>264,8246=>447,8247=>630,8248=>733,8251=>972,8252=>627, +8253=>580,8254=>500,8255=>828,8256=>828,8257=>329,8258=>1023,8259=>500,8260=>167,8261=>457,8262=>457, +8263=>1030,8264=>829,8265=>829,8266=>513,8267=>687,8268=>500,8269=>500,8270=>523,8271=>400,8272=>828, +8273=>523,8274=>556,8275=>838,8276=>828,8277=>838,8278=>684,8279=>813,8280=>838,8281=>838,8282=>380, +8283=>872,8284=>838,8285=>380,8286=>380,8287=>222,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0, +8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>438,8305=>219,8308=>438,8309=>438, +8310=>438,8311=>438,8312=>438,8313=>438,8314=>528,8315=>528,8316=>528,8317=>288,8318=>288,8319=>456, +8320=>438,8321=>438,8322=>438,8323=>438,8324=>438,8325=>438,8326=>438,8327=>438,8328=>438,8329=>438, +8330=>528,8331=>528,8332=>528,8333=>288,8334=>288,8336=>458,8337=>479,8338=>488,8339=>413,8340=>479, +8352=>929,8353=>696,8354=>696,8355=>696,8356=>696,8357=>1042,8358=>837,8359=>1488,8360=>1205,8361=>1103, +8362=>854,8363=>714,8365=>696,8366=>682,8367=>1392,8368=>696,8369=>696,8370=>696,8371=>696,8372=>859, +8373=>696,8400=>0,8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>1106,8449=>1106, +8450=>734,8451=>1211,8452=>896,8453=>1114,8454=>1148,8455=>696,8456=>698,8457=>952,8459=>1073,8460=>913, +8461=>888,8462=>712,8463=>712,8464=>597,8465=>697,8466=>856,8467=>472,8468=>974,8469=>837,8470=>1203, +8471=>1000,8472=>697,8473=>750,8474=>850,8475=>938,8476=>814,8477=>801,8478=>896,8479=>710,8480=>1020, +8481=>1239,8483=>834,8484=>754,8485=>622,8486=>850,8487=>769,8488=>763,8489=>303,8490=>775,8491=>774, +8492=>928,8493=>818,8494=>854,8495=>636,8496=>729,8497=>808,8498=>683,8499=>1184,8500=>465,8501=>794, +8502=>731,8503=>494,8504=>684,8505=>380,8506=>945,8507=>1370,8508=>790,8509=>737,8510=>654,8511=>863, +8512=>840,8513=>786,8514=>576,8515=>637,8516=>760,8517=>830,8518=>716,8519=>678,8520=>343,8521=>343, +8523=>872,8526=>547,8531=>1035,8532=>1035,8533=>1035,8534=>1035,8535=>1035,8536=>1035,8537=>1035,8538=>1035, +8539=>1035,8540=>1035,8541=>1035,8542=>1035,8543=>615,8544=>372,8545=>659,8546=>945,8547=>1099,8548=>774, +8549=>1099,8550=>1386,8551=>1672,8552=>1121,8553=>771,8554=>1120,8555=>1407,8556=>637,8557=>734,8558=>830, +8559=>995,8560=>343,8561=>607,8562=>872,8563=>984,8564=>652,8565=>962,8566=>1227,8567=>1491,8568=>969, +8569=>645,8570=>969,8571=>1233,8572=>343,8573=>593,8574=>716,8575=>1042,8576=>1289,8577=>830,8578=>1289, +8579=>734,8580=>593,8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838,8598=>838,8599=>838, +8600=>838,8601=>838,8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838,8608=>838,8609=>838, +8610=>838,8611=>838,8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838,8618=>838,8619=>838, +8620=>838,8621=>838,8622=>838,8623=>838,8624=>838,8625=>838,8626=>838,8627=>838,8628=>838,8629=>838, +8630=>838,8631=>838,8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838,8638=>838,8639=>838, +8640=>838,8641=>838,8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838,8648=>838,8649=>838, +8650=>838,8651=>838,8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838,8658=>838,8659=>838, +8660=>838,8661=>838,8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838,8668=>838,8669=>838, +8670=>838,8671=>838,8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838,8678=>838,8679=>838, +8680=>838,8681=>838,8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838,8688=>838,8689=>838, +8690=>838,8691=>838,8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838,8698=>838,8699=>838, +8700=>838,8701=>838,8702=>838,8703=>838,8704=>774,8705=>696,8706=>544,8707=>683,8708=>683,8709=>856, +8710=>697,8711=>697,8712=>896,8713=>896,8714=>750,8715=>896,8716=>896,8717=>750,8718=>636,8719=>787, +8720=>787,8721=>718,8722=>838,8723=>838,8724=>696,8725=>365,8726=>696,8727=>838,8728=>626,8729=>380, +8730=>667,8731=>667,8732=>667,8733=>712,8734=>833,8735=>838,8736=>896,8737=>896,8738=>838,8739=>500, +8740=>500,8741=>500,8742=>500,8743=>812,8744=>812,8745=>812,8746=>812,8747=>610,8748=>929,8749=>1295, +8750=>563,8751=>977,8752=>1313,8753=>563,8754=>563,8755=>563,8756=>696,8757=>696,8758=>294,8759=>696, +8760=>838,8761=>838,8762=>838,8763=>838,8764=>838,8765=>838,8766=>838,8767=>838,8768=>375,8769=>838, +8770=>838,8771=>838,8772=>838,8773=>838,8774=>838,8775=>838,8776=>838,8777=>838,8778=>838,8779=>838, +8780=>838,8781=>838,8782=>838,8783=>838,8784=>838,8785=>838,8786=>838,8787=>838,8788=>1063,8789=>1063, +8790=>838,8791=>838,8792=>838,8793=>838,8794=>838,8795=>838,8796=>838,8797=>838,8798=>838,8799=>838, +8800=>838,8801=>838,8802=>838,8803=>838,8804=>838,8805=>838,8806=>838,8807=>838,8808=>841,8809=>841, +8810=>1047,8811=>1047,8812=>500,8813=>838,8814=>838,8815=>838,8816=>838,8817=>838,8818=>838,8819=>838, +8820=>838,8821=>838,8822=>838,8823=>838,8824=>838,8825=>838,8826=>838,8827=>838,8828=>838,8829=>838, +8830=>838,8831=>838,8832=>838,8833=>838,8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838, +8840=>838,8841=>838,8842=>838,8843=>838,8844=>812,8845=>812,8846=>812,8847=>838,8848=>838,8849=>838, +8850=>838,8851=>796,8852=>796,8853=>838,8854=>838,8855=>838,8856=>838,8857=>838,8858=>838,8859=>838, +8860=>838,8861=>838,8862=>838,8863=>838,8864=>838,8865=>838,8866=>914,8867=>914,8868=>914,8869=>914, +8870=>542,8871=>542,8872=>914,8873=>914,8874=>914,8875=>914,8876=>914,8877=>914,8878=>914,8879=>914, +8880=>838,8881=>838,8882=>838,8883=>838,8884=>838,8885=>838,8886=>1000,8887=>1000,8888=>838,8889=>838, +8890=>542,8891=>812,8892=>812,8893=>812,8894=>838,8895=>838,8896=>843,8897=>843,8898=>843,8899=>843, +8900=>494,8901=>380,8902=>626,8903=>838,8904=>1000,8905=>1000,8906=>1000,8907=>1000,8908=>1000,8909=>838, +8910=>812,8911=>812,8912=>838,8913=>838,8914=>838,8915=>838,8916=>838,8917=>838,8918=>838,8919=>838, +8920=>1422,8921=>1422,8922=>838,8923=>838,8924=>838,8925=>838,8926=>838,8927=>838,8928=>838,8929=>838, +8930=>838,8931=>838,8932=>838,8933=>838,8934=>838,8935=>838,8936=>838,8937=>838,8938=>838,8939=>838, +8940=>838,8941=>838,8942=>1000,8943=>1000,8944=>1000,8945=>1000,8946=>1158,8947=>896,8948=>750,8949=>896, +8950=>896,8951=>750,8952=>896,8953=>896,8954=>1158,8955=>896,8956=>750,8957=>896,8958=>750,8959=>896, +8960=>602,8961=>602,8962=>716,8963=>838,8964=>838,8965=>838,8966=>838,8967=>488,8968=>457,8969=>457, +8970=>457,8971=>457,8972=>809,8973=>809,8974=>809,8975=>809,8976=>838,8977=>539,8984=>928,8985=>838, +8988=>469,8989=>469,8990=>469,8991=>469,8992=>610,8993=>610,8996=>1152,8997=>1152,8998=>1414,8999=>1152, +9000=>1443,9003=>1414,9004=>873,9075=>390,9076=>716,9077=>869,9082=>687,9085=>863,9095=>1152,9108=>873, +9115=>500,9116=>500,9117=>500,9118=>500,9119=>500,9120=>500,9121=>500,9122=>500,9123=>500,9124=>500, +9125=>500,9126=>500,9127=>750,9128=>750,9129=>750,9130=>750,9131=>750,9132=>750,9133=>750,9134=>610, +9166=>838,9167=>945,9187=>873,9189=>769,9250=>716,9251=>716,9312=>847,9313=>847,9314=>847,9315=>847, +9316=>847,9317=>847,9318=>847,9319=>847,9320=>847,9321=>847,9600=>769,9601=>769,9602=>769,9603=>769, +9604=>769,9605=>769,9606=>769,9607=>769,9608=>769,9609=>769,9610=>769,9611=>769,9612=>769,9613=>769, +9614=>769,9615=>769,9616=>769,9617=>769,9618=>769,9619=>769,9620=>769,9621=>769,9622=>769,9623=>769, +9624=>769,9625=>769,9626=>769,9627=>769,9628=>769,9629=>769,9630=>769,9631=>769,9632=>945,9633=>945, +9634=>945,9635=>945,9636=>945,9637=>945,9638=>945,9639=>945,9640=>945,9641=>945,9642=>678,9643=>678, +9644=>945,9645=>945,9646=>550,9647=>550,9648=>769,9649=>769,9650=>769,9651=>769,9652=>502,9653=>502, +9654=>769,9655=>769,9656=>502,9657=>502,9658=>769,9659=>769,9660=>769,9661=>769,9662=>502,9663=>502, +9664=>769,9665=>769,9666=>502,9667=>502,9668=>769,9669=>769,9670=>769,9671=>769,9672=>769,9673=>873, +9674=>494,9675=>873,9676=>873,9677=>873,9678=>873,9679=>873,9680=>873,9681=>873,9682=>873,9683=>873, +9684=>873,9685=>873,9686=>527,9687=>527,9688=>840,9689=>970,9690=>970,9691=>970,9692=>387,9693=>387, +9694=>387,9695=>387,9696=>769,9697=>769,9698=>769,9699=>769,9700=>769,9701=>769,9702=>639,9703=>945, +9704=>945,9705=>945,9706=>945,9707=>945,9708=>769,9709=>769,9710=>769,9711=>1119,9712=>945,9713=>945, +9714=>945,9715=>945,9716=>873,9717=>873,9718=>873,9719=>873,9720=>769,9721=>769,9722=>769,9723=>830, +9724=>830,9725=>732,9726=>732,9727=>769,9728=>896,9729=>1000,9730=>896,9731=>896,9732=>896,9733=>896, +9734=>896,9735=>573,9736=>896,9737=>896,9738=>888,9739=>888,9740=>671,9741=>1013,9742=>1246,9743=>1250, +9744=>896,9745=>896,9746=>896,9747=>532,9748=>896,9749=>896,9750=>896,9751=>896,9752=>896,9753=>896, +9754=>896,9755=>896,9756=>896,9757=>609,9758=>896,9759=>609,9760=>896,9761=>896,9762=>896,9763=>896, +9764=>669,9765=>746,9766=>649,9767=>784,9768=>545,9769=>896,9770=>896,9771=>896,9772=>710,9773=>896, +9774=>896,9775=>896,9776=>896,9777=>896,9778=>896,9779=>896,9780=>896,9781=>896,9782=>896,9783=>896, +9784=>896,9785=>896,9786=>896,9787=>896,9788=>896,9789=>896,9790=>896,9791=>614,9792=>731,9793=>731, +9794=>896,9795=>896,9796=>896,9797=>896,9798=>896,9799=>896,9800=>896,9801=>896,9802=>896,9803=>896, +9804=>896,9805=>896,9806=>896,9807=>896,9808=>896,9809=>896,9810=>896,9811=>896,9812=>896,9813=>896, +9814=>896,9815=>896,9816=>896,9817=>896,9818=>896,9819=>896,9820=>896,9821=>896,9822=>896,9823=>896, +9824=>896,9825=>896,9826=>896,9827=>896,9828=>896,9829=>896,9830=>896,9831=>896,9832=>896,9833=>472, +9834=>638,9835=>896,9836=>896,9837=>472,9838=>357,9839=>484,9840=>748,9841=>766,9842=>896,9843=>896, +9844=>896,9845=>896,9846=>896,9847=>896,9848=>896,9849=>896,9850=>896,9851=>896,9852=>896,9853=>896, +9854=>896,9855=>896,9856=>869,9857=>869,9858=>869,9859=>869,9860=>869,9861=>869,9862=>896,9863=>896, +9864=>896,9865=>896,9866=>896,9867=>896,9868=>896,9869=>896,9870=>896,9871=>896,9872=>896,9873=>896, +9874=>896,9875=>896,9876=>896,9877=>541,9878=>896,9879=>896,9880=>896,9881=>896,9882=>896,9883=>896, +9884=>896,9888=>896,9889=>702,9890=>1003,9891=>1085,9892=>1143,9893=>901,9894=>838,9895=>838,9896=>838, +9897=>838,9898=>838,9899=>838,9900=>838,9901=>838,9902=>838,9903=>838,9904=>844,9905=>838,9906=>731, +9907=>732,9908=>732,9909=>732,9910=>850,9911=>732,9912=>732,9985=>838,9986=>838,9987=>838,9988=>838, +9990=>838,9991=>838,9992=>838,9993=>838,9996=>838,9997=>838,9998=>838,9999=>838,10000=>838,10001=>838, +10002=>838,10003=>838,10004=>838,10005=>838,10006=>838,10007=>838,10008=>838,10009=>838,10010=>838,10011=>838, +10012=>838,10013=>838,10014=>838,10015=>838,10016=>838,10017=>838,10018=>838,10019=>838,10020=>838,10021=>838, +10022=>838,10023=>838,10025=>838,10026=>838,10027=>838,10028=>838,10029=>838,10030=>838,10031=>838,10032=>838, +10033=>838,10034=>838,10035=>838,10036=>838,10037=>838,10038=>838,10039=>838,10040=>838,10041=>838,10042=>838, +10043=>838,10044=>838,10045=>838,10046=>838,10047=>838,10048=>838,10049=>838,10050=>838,10051=>838,10052=>838, +10053=>838,10054=>838,10055=>838,10056=>838,10057=>838,10058=>838,10059=>838,10061=>896,10063=>896,10064=>896, +10065=>896,10066=>896,10070=>896,10072=>838,10073=>838,10074=>838,10075=>322,10076=>322,10077=>538,10078=>538, +10081=>838,10082=>838,10083=>838,10084=>838,10085=>838,10086=>838,10087=>838,10088=>838,10089=>838,10090=>838, +10091=>838,10092=>838,10093=>838,10094=>838,10095=>838,10096=>838,10097=>838,10098=>838,10099=>838,10100=>838, +10101=>838,10102=>847,10103=>847,10104=>847,10105=>847,10106=>847,10107=>847,10108=>847,10109=>847,10110=>847, +10111=>847,10112=>838,10113=>838,10114=>838,10115=>838,10116=>838,10117=>838,10118=>838,10119=>838,10120=>838, +10121=>838,10122=>838,10123=>838,10124=>838,10125=>838,10126=>838,10127=>838,10128=>838,10129=>838,10130=>838, +10131=>838,10132=>838,10136=>838,10137=>838,10138=>838,10139=>838,10140=>838,10141=>838,10142=>838,10143=>838, +10144=>838,10145=>838,10146=>838,10147=>838,10148=>838,10149=>838,10150=>838,10151=>838,10152=>838,10153=>838, +10154=>838,10155=>838,10156=>838,10157=>838,10158=>838,10159=>838,10161=>838,10162=>838,10163=>838,10164=>838, +10165=>838,10166=>838,10167=>838,10168=>838,10169=>838,10170=>838,10171=>838,10172=>838,10173=>838,10174=>838, +10181=>457,10182=>457,10208=>494,10214=>487,10215=>487,10216=>457,10217=>457,10218=>721,10219=>721,10224=>838, +10225=>838,10226=>838,10227=>838,10228=>1157,10229=>1434,10230=>1434,10231=>1434,10232=>1434,10233=>1434,10234=>1434, +10235=>1434,10236=>1434,10237=>1434,10238=>1434,10239=>1434,10240=>781,10241=>781,10242=>781,10243=>781,10244=>781, +10245=>781,10246=>781,10247=>781,10248=>781,10249=>781,10250=>781,10251=>781,10252=>781,10253=>781,10254=>781, +10255=>781,10256=>781,10257=>781,10258=>781,10259=>781,10260=>781,10261=>781,10262=>781,10263=>781,10264=>781, +10265=>781,10266=>781,10267=>781,10268=>781,10269=>781,10270=>781,10271=>781,10272=>781,10273=>781,10274=>781, +10275=>781,10276=>781,10277=>781,10278=>781,10279=>781,10280=>781,10281=>781,10282=>781,10283=>781,10284=>781, +10285=>781,10286=>781,10287=>781,10288=>781,10289=>781,10290=>781,10291=>781,10292=>781,10293=>781,10294=>781, +10295=>781,10296=>781,10297=>781,10298=>781,10299=>781,10300=>781,10301=>781,10302=>781,10303=>781,10304=>781, +10305=>781,10306=>781,10307=>781,10308=>781,10309=>781,10310=>781,10311=>781,10312=>781,10313=>781,10314=>781, +10315=>781,10316=>781,10317=>781,10318=>781,10319=>781,10320=>781,10321=>781,10322=>781,10323=>781,10324=>781, +10325=>781,10326=>781,10327=>781,10328=>781,10329=>781,10330=>781,10331=>781,10332=>781,10333=>781,10334=>781, +10335=>781,10336=>781,10337=>781,10338=>781,10339=>781,10340=>781,10341=>781,10342=>781,10343=>781,10344=>781, +10345=>781,10346=>781,10347=>781,10348=>781,10349=>781,10350=>781,10351=>781,10352=>781,10353=>781,10354=>781, +10355=>781,10356=>781,10357=>781,10358=>781,10359=>781,10360=>781,10361=>781,10362=>781,10363=>781,10364=>781, +10365=>781,10366=>781,10367=>781,10368=>781,10369=>781,10370=>781,10371=>781,10372=>781,10373=>781,10374=>781, +10375=>781,10376=>781,10377=>781,10378=>781,10379=>781,10380=>781,10381=>781,10382=>781,10383=>781,10384=>781, +10385=>781,10386=>781,10387=>781,10388=>781,10389=>781,10390=>781,10391=>781,10392=>781,10393=>781,10394=>781, +10395=>781,10396=>781,10397=>781,10398=>781,10399=>781,10400=>781,10401=>781,10402=>781,10403=>781,10404=>781, +10405=>781,10406=>781,10407=>781,10408=>781,10409=>781,10410=>781,10411=>781,10412=>781,10413=>781,10414=>781, +10415=>781,10416=>781,10417=>781,10418=>781,10419=>781,10420=>781,10421=>781,10422=>781,10423=>781,10424=>781, +10425=>781,10426=>781,10427=>781,10428=>781,10429=>781,10430=>781,10431=>781,10432=>781,10433=>781,10434=>781, +10435=>781,10436=>781,10437=>781,10438=>781,10439=>781,10440=>781,10441=>781,10442=>781,10443=>781,10444=>781, +10445=>781,10446=>781,10447=>781,10448=>781,10449=>781,10450=>781,10451=>781,10452=>781,10453=>781,10454=>781, +10455=>781,10456=>781,10457=>781,10458=>781,10459=>781,10460=>781,10461=>781,10462=>781,10463=>781,10464=>781, +10465=>781,10466=>781,10467=>781,10468=>781,10469=>781,10470=>781,10471=>781,10472=>781,10473=>781,10474=>781, +10475=>781,10476=>781,10477=>781,10478=>781,10479=>781,10480=>781,10481=>781,10482=>781,10483=>781,10484=>781, +10485=>781,10486=>781,10487=>781,10488=>781,10489=>781,10490=>781,10491=>781,10492=>781,10493=>781,10494=>781, +10495=>781,10502=>838,10503=>838,10506=>838,10507=>838,10560=>838,10561=>838,10627=>753,10628=>753,10702=>838, +10703=>1046,10704=>1046,10705=>1000,10706=>1000,10707=>1000,10708=>1000,10709=>1000,10731=>494,10746=>838,10747=>838, +10752=>1000,10753=>1000,10754=>1000,10764=>1661,10765=>563,10766=>563,10767=>563,10768=>563,10769=>563,10770=>563, +10771=>563,10772=>563,10773=>563,10774=>563,10775=>563,10776=>563,10777=>563,10778=>563,10779=>563,10780=>563, +10799=>838,10877=>838,10878=>838,10879=>838,10880=>838,10881=>838,10882=>838,10883=>838,10884=>838,10885=>838, +10886=>838,10887=>838,10888=>838,10889=>838,10890=>838,10891=>838,10892=>838,10893=>838,10894=>838,10895=>838, +10896=>838,10897=>838,10898=>838,10899=>838,10900=>838,10901=>838,10902=>838,10903=>838,10904=>838,10905=>838, +10906=>838,10907=>838,10908=>838,10909=>838,10910=>838,10911=>838,10912=>838,10926=>838,10927=>838,10928=>838, +10929=>838,10930=>838,10931=>838,10932=>838,10933=>838,10934=>838,10935=>838,10936=>838,10937=>838,10938=>838, +11001=>838,11002=>838,11008=>838,11009=>838,11010=>838,11011=>838,11012=>838,11013=>838,11014=>838,11015=>838, +11016=>838,11017=>838,11018=>838,11019=>838,11020=>838,11021=>838,11022=>838,11023=>838,11024=>838,11025=>838, +11026=>945,11027=>945,11028=>945,11029=>945,11030=>769,11031=>769,11032=>769,11033=>769,11034=>945,11039=>869, +11040=>869,11041=>873,11042=>873,11043=>873,11044=>1119,11091=>869,11092=>869,11360=>637,11361=>360,11362=>637, +11363=>733,11364=>770,11365=>675,11366=>478,11367=>956,11368=>712,11369=>775,11370=>665,11371=>725,11372=>582, +11373=>860,11374=>995,11375=>774,11377=>778,11378=>1221,11379=>1056,11380=>652,11381=>698,11382=>565,11383=>782, +11385=>538,11386=>687,11387=>559,11388=>219,11389=>487,11800=>586,11810=>457,11811=>457,11812=>457,11813=>457, +11822=>580,19904=>896,19905=>896,19906=>896,19907=>896,19908=>896,19909=>896,19910=>896,19911=>896,19912=>896, +19913=>896,19914=>896,19915=>896,19916=>896,19917=>896,19918=>896,19919=>896,19920=>896,19921=>896,19922=>896, +19923=>896,19924=>896,19925=>896,19926=>896,19927=>896,19928=>896,19929=>896,19930=>896,19931=>896,19932=>896, +19933=>896,19934=>896,19935=>896,19936=>896,19937=>896,19938=>896,19939=>896,19940=>896,19941=>896,19942=>896, +19943=>896,19944=>896,19945=>896,19946=>896,19947=>896,19948=>896,19949=>896,19950=>896,19951=>896,19952=>896, +19953=>896,19954=>896,19955=>896,19956=>896,19957=>896,19958=>896,19959=>896,19960=>896,19961=>896,19962=>896, +19963=>896,19964=>896,19965=>896,19966=>896,19967=>896,42564=>720,42565=>595,42566=>436,42567=>440,42572=>1405, +42573=>1173,42576=>1234,42577=>1027,42580=>1174,42581=>972,42582=>1100,42583=>969,42594=>1100,42595=>940,42596=>1096, +42597=>915,42598=>1260,42599=>997,42600=>850,42601=>687,42602=>1037,42603=>868,42604=>1406,42605=>1106,42606=>961, +42634=>944,42635=>749,42636=>682,42637=>580,42644=>808,42645=>712,42760=>500,42761=>500,42762=>500,42763=>500, +42764=>500,42765=>500,42766=>500,42767=>500,42768=>500,42769=>500,42770=>500,42771=>500,42772=>500,42773=>500, +42774=>500,42779=>400,42780=>400,42781=>287,42782=>287,42783=>287,42790=>837,42791=>712,42792=>1031,42793=>857, +42794=>696,42795=>557,42800=>559,42801=>595,42802=>1349,42803=>1052,42804=>1285,42805=>1065,42806=>1245,42807=>1052, +42808=>1079,42809=>922,42810=>1079,42811=>922,42812=>1035,42813=>922,42814=>698,42815=>549,42822=>850,42823=>542, +42824=>683,42825=>531,42826=>918,42827=>814,42830=>1406,42831=>1106,42880=>637,42881=>343,42882=>837,42883=>712, +42889=>400,42890=>396,42891=>456,42892=>306,43003=>683,43004=>733,43005=>995,43006=>372,43007=>1325,62917=>687, +64256=>833,64257=>787,64258=>787,64259=>1138,64260=>1139,64261=>808,64262=>1020,64275=>1388,64276=>1384,64277=>1378, +64278=>1384,64279=>1713,64285=>343,64286=>0,64287=>663,64288=>720,64289=>963,64290=>890,64291=>988,64292=>963, +64293=>938,64294=>988,64295=>988,64296=>976,64297=>838,64298=>949,64299=>949,64300=>949,64301=>949,64302=>751, +64303=>751,64304=>751,64305=>673,64306=>537,64307=>654,64308=>712,64309=>343,64310=>491,64312=>724,64313=>467, +64314=>649,64315=>650,64316=>679,64318=>775,64320=>497,64321=>773,64323=>718,64324=>687,64326=>751,64327=>729, +64328=>649,64329=>949,64330=>751,64331=>343,64332=>673,64333=>650,64334=>687,64335=>751,65024=>0,65025=>0, +65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0, +65036=>0,65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0,65059=>0,65529=>0,65530=>0, +65531=>0,65532=>0,65533=>1113); +$enc=''; +$diff=''; +$file='dejavusansbi.z'; +$ctg='dejavusansbi.ctg.z'; +$originalsize=524056; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansbi.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansbi.z new file mode 100644 index 0000000..03c4078 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansbi.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensed.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensed.ctg.z new file mode 100644 index 0000000..3170ea6 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensed.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensed.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensed.php new file mode 100644 index 0000000..6af979e --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensed.php @@ -0,0 +1,517 @@ +<?php +$type='TrueTypeUnicode'; +$name='DejaVuSansCondensed'; +$desc=array('Ascent'=>928,'Descent'=>-236,'CapHeight'=>26,'Flags'=>96,'FontBBox'=>'[-918 -350 1513 1167]','ItalicAngle'=>-18.9,'StemV'=>70,'MissingWidth'=>540); +$up=-63; +$ut=44; +$dw=540; +$cw=array( +0=>540,32=>286,33=>360,34=>414,35=>754,36=>572,37=>855,38=>702,39=>247,40=>351, +41=>351,42=>450,43=>754,44=>286,45=>325,46=>286,47=>303,48=>572,49=>572,50=>572, +51=>572,52=>572,53=>572,54=>572,55=>572,56=>572,57=>572,58=>303,59=>303,60=>754, +61=>754,62=>754,63=>478,64=>900,65=>615,66=>617,67=>628,68=>693,69=>568,70=>518, +71=>697,72=>677,73=>265,74=>265,75=>590,76=>501,77=>776,78=>673,79=>708,80=>542, +81=>708,82=>625,83=>571,84=>549,85=>659,86=>615,87=>890,88=>616,89=>549,90=>616, +91=>351,92=>303,93=>351,94=>754,95=>450,96=>450,97=>551,98=>571,99=>495,100=>571, +101=>554,102=>316,103=>571,104=>570,105=>250,106=>250,107=>521,108=>250,109=>876,110=>570, +111=>550,112=>571,113=>571,114=>370,115=>469,116=>353,117=>570,118=>532,119=>736,120=>532, +121=>532,122=>472,123=>572,124=>303,125=>572,126=>754,8364=>572,8218=>286,402=>316,8222=>466, +8230=>900,8224=>450,8225=>450,710=>450,8240=>1208,352=>571,8249=>360,338=>962,381=>616,8216=>286, +8217=>286,8220=>466,8221=>466,8226=>531,8211=>450,8212=>900,732=>450,8482=>900,353=>469,8250=>360, +339=>920,382=>472,376=>549,160=>286,161=>360,162=>572,163=>572,164=>572,165=>572,166=>303, +167=>450,168=>450,169=>900,170=>424,171=>550,172=>754,173=>325,174=>900,175=>450,176=>450, +177=>754,178=>360,179=>360,180=>450,181=>572,182=>572,183=>286,184=>450,185=>360,186=>424, +187=>550,188=>872,189=>872,190=>872,191=>478,192=>615,193=>615,194=>615,195=>615,196=>615, +197=>615,198=>876,199=>628,200=>568,201=>568,202=>568,203=>568,204=>265,205=>265,206=>265, +207=>265,208=>697,209=>673,210=>708,211=>708,212=>708,213=>708,214=>708,215=>754,216=>708, +217=>659,218=>659,219=>659,220=>659,221=>549,222=>544,223=>567,224=>551,225=>551,226=>551, +227=>551,228=>551,229=>551,230=>883,231=>495,232=>554,233=>554,234=>554,235=>554,236=>250, +237=>250,238=>250,239=>250,240=>550,241=>570,242=>550,243=>550,244=>550,245=>550,246=>550, +247=>754,248=>550,249=>570,250=>570,251=>570,252=>570,253=>532,254=>571,255=>532,256=>615, +257=>551,258=>615,259=>551,260=>615,261=>551,262=>628,263=>495,264=>628,265=>495,266=>628, +267=>495,268=>628,269=>495,270=>693,271=>571,272=>697,273=>571,274=>568,275=>554,276=>568, +277=>554,278=>568,279=>554,280=>568,281=>554,282=>568,283=>554,284=>697,285=>571,286=>697, +287=>571,288=>697,289=>571,290=>697,291=>571,292=>677,293=>570,294=>824,295=>625,296=>265, +297=>250,298=>265,299=>250,300=>265,301=>250,302=>265,303=>250,304=>265,305=>250,306=>531, +307=>500,308=>265,309=>250,310=>590,311=>521,312=>521,313=>501,314=>250,315=>501,316=>250, +317=>501,318=>337,319=>501,320=>308,321=>505,322=>255,323=>673,324=>570,325=>673,326=>570, +327=>673,328=>570,329=>732,330=>673,331=>570,332=>708,333=>550,334=>708,335=>550,336=>708, +337=>550,340=>625,341=>370,342=>625,343=>370,344=>625,345=>370,346=>571,347=>469,348=>571, +349=>469,350=>571,351=>469,354=>549,355=>353,356=>549,357=>353,358=>549,359=>353,360=>659, +361=>570,362=>659,363=>570,364=>659,365=>570,366=>659,367=>570,368=>659,369=>570,370=>659, +371=>570,372=>890,373=>736,374=>549,375=>532,377=>616,378=>472,379=>616,380=>472,383=>316, +384=>571,385=>661,386=>617,387=>571,388=>617,389=>571,390=>633,391=>628,392=>495,393=>697, +394=>737,395=>617,396=>571,397=>550,398=>568,399=>708,400=>553,401=>518,403=>697,404=>618, +405=>885,406=>318,407=>265,408=>671,409=>521,410=>250,411=>532,412=>876,413=>673,414=>570, +415=>708,416=>822,417=>550,418=>854,419=>683,420=>586,421=>571,422=>625,423=>571,424=>469, +425=>568,426=>302,427=>353,428=>549,429=>353,430=>549,431=>772,432=>570,433=>688,434=>648, +435=>669,436=>657,437=>616,438=>472,439=>599,440=>599,441=>520,442=>472,443=>572,444=>599, +445=>520,446=>459,447=>571,448=>265,449=>443,450=>413,451=>266,452=>1279,453=>1169,454=>1039, +455=>751,456=>708,457=>411,458=>838,459=>831,460=>717,461=>615,462=>551,463=>265,464=>250, +465=>708,466=>550,467=>659,468=>570,469=>659,470=>570,471=>659,472=>570,473=>659,474=>570, +475=>659,476=>570,477=>554,478=>615,479=>551,480=>615,481=>551,482=>876,483=>883,484=>697, +485=>571,486=>697,487=>571,488=>590,489=>521,490=>708,491=>550,492=>708,493=>550,494=>599, +495=>520,496=>250,497=>1279,498=>1169,499=>1039,500=>697,501=>571,502=>1001,503=>614,504=>673, +505=>570,506=>615,507=>551,508=>876,509=>883,510=>708,511=>550,512=>615,513=>551,514=>615, +515=>551,516=>568,517=>554,518=>568,519=>554,520=>265,521=>250,522=>265,523=>250,524=>708, +525=>550,526=>708,527=>550,528=>625,529=>370,530=>625,531=>370,532=>659,533=>570,534=>659, +535=>570,536=>571,537=>469,538=>549,539=>353,540=>564,541=>469,542=>677,543=>570,544=>662, +545=>754,546=>628,547=>549,548=>616,549=>472,550=>615,551=>551,552=>568,553=>554,554=>708, +555=>550,556=>708,557=>550,558=>708,559=>550,560=>708,561=>550,562=>549,563=>532,564=>427, +565=>758,566=>429,567=>250,568=>898,569=>898,570=>615,571=>628,572=>495,573=>501,574=>549, +575=>469,576=>472,577=>542,578=>431,579=>617,580=>659,581=>615,582=>568,583=>554,584=>265, +585=>250,586=>703,587=>571,588=>625,589=>370,590=>549,591=>532,592=>540,593=>571,594=>571, +595=>571,596=>494,597=>495,598=>571,599=>626,600=>554,601=>554,602=>737,603=>486,604=>479, +605=>698,606=>598,607=>250,608=>626,609=>571,610=>566,611=>536,612=>536,613=>570,614=>570, +615=>570,616=>250,617=>304,618=>334,619=>356,620=>438,621=>250,622=>635,623=>876,624=>876, +625=>876,626=>581,627=>578,628=>570,629=>550,630=>772,631=>655,632=>593,633=>373,634=>373, +635=>372,636=>370,637=>369,638=>477,639=>477,640=>543,641=>543,642=>469,643=>302,644=>302, +645=>415,646=>302,647=>353,648=>353,649=>570,650=>556,651=>538,652=>532,653=>736,654=>532, +655=>549,656=>472,657=>472,658=>520,659=>520,660=>459,661=>459,662=>459,663=>459,664=>708, +665=>521,666=>598,667=>637,668=>588,669=>263,670=>600,671=>456,672=>654,673=>459,674=>459, +675=>913,676=>952,677=>911,678=>742,679=>549,680=>700,681=>763,682=>576,683=>589,684=>463, +685=>463,686=>595,687=>597,688=>364,689=>359,690=>157,691=>233,692=>266,693=>266,694=>341, +695=>463,696=>335,697=>250,698=>414,699=>286,700=>286,701=>286,702=>276,703=>276,704=>333, +705=>333,706=>450,707=>450,708=>450,709=>450,711=>450,712=>247,713=>450,714=>450,715=>450, +716=>247,717=>450,718=>450,719=>450,720=>303,721=>303,722=>276,723=>276,724=>450,725=>450, +726=>351,727=>286,728=>450,729=>450,730=>450,731=>450,733=>450,734=>284,735=>450,736=>383, +737=>149,738=>335,739=>399,740=>333,741=>444,742=>444,743=>444,744=>444,745=>444,748=>450, +749=>450,750=>466,755=>450,759=>450,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0, +774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0, +784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0, +794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0, +804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0, +814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0, +824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0, +834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0, +844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0, +860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>589,881=>511,882=>775, +883=>583,884=>250,885=>250,886=>673,887=>584,890=>450,891=>494,892=>495,893=>494,894=>303, +900=>450,901=>450,902=>623,903=>286,904=>671,905=>784,906=>367,908=>731,910=>742,911=>743, +912=>304,913=>615,914=>617,915=>501,916=>615,917=>568,918=>616,919=>677,920=>708,921=>265, +922=>590,923=>615,924=>776,925=>673,926=>568,927=>708,928=>677,929=>542,931=>568,932=>549, +933=>549,934=>708,935=>616,936=>708,937=>688,938=>265,939=>549,940=>593,941=>486,942=>570, +943=>304,944=>521,945=>593,946=>574,947=>532,948=>550,949=>486,950=>489,951=>570,952=>550, +953=>304,954=>530,955=>532,956=>572,957=>502,958=>501,959=>550,960=>542,961=>571,962=>528, +963=>570,964=>542,965=>521,966=>593,967=>520,968=>593,969=>753,970=>304,971=>521,972=>550, +973=>521,974=>753,975=>590,976=>553,977=>557,978=>628,979=>758,980=>628,981=>593,982=>753, +983=>597,984=>708,985=>550,986=>583,987=>528,988=>518,989=>413,990=>593,991=>593,992=>778, +993=>564,994=>840,995=>753,996=>682,997=>593,998=>712,999=>553,1000=>618,1001=>546,1002=>690, +1003=>563,1004=>629,1005=>550,1006=>549,1007=>482,1008=>597,1009=>571,1010=>495,1011=>250,1012=>708, +1013=>554,1014=>554,1015=>544,1016=>571,1017=>628,1018=>776,1019=>585,1020=>571,1021=>633,1022=>628, +1023=>633,1024=>568,1025=>568,1026=>708,1027=>549,1028=>628,1029=>571,1030=>265,1031=>265,1032=>265, +1033=>984,1034=>940,1035=>708,1036=>639,1037=>673,1038=>548,1039=>677,1040=>615,1041=>617,1042=>617, +1043=>549,1044=>703,1045=>568,1046=>969,1047=>577,1048=>673,1049=>673,1050=>639,1051=>677,1052=>776, +1053=>677,1054=>708,1055=>677,1056=>542,1057=>628,1058=>549,1059=>548,1060=>774,1061=>616,1062=>699, +1063=>617,1064=>962,1065=>984,1066=>749,1067=>794,1068=>617,1069=>628,1070=>971,1071=>625,1072=>551, +1073=>555,1074=>530,1075=>473,1076=>622,1077=>554,1078=>811,1079=>479,1080=>584,1081=>584,1082=>543, +1083=>575,1084=>679,1085=>588,1086=>550,1087=>588,1088=>571,1089=>495,1090=>524,1091=>532,1092=>769, +1093=>532,1094=>612,1095=>532,1096=>823,1097=>848,1098=>636,1099=>710,1100=>530,1101=>494,1102=>757, +1103=>541,1104=>554,1105=>554,1106=>563,1107=>473,1108=>494,1109=>469,1110=>250,1111=>250,1112=>250, +1113=>812,1114=>809,1115=>586,1116=>543,1117=>584,1118=>532,1119=>588,1120=>840,1121=>753,1122=>693, +1123=>604,1124=>848,1125=>674,1126=>791,1127=>705,1128=>1043,1129=>901,1130=>708,1131=>550,1132=>924, +1133=>742,1134=>572,1135=>486,1136=>771,1137=>789,1138=>708,1139=>550,1140=>703,1141=>598,1142=>703, +1143=>598,1144=>893,1145=>813,1146=>857,1147=>682,1148=>1062,1149=>925,1150=>840,1151=>753,1152=>628, +1153=>495,1154=>452,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>376,1161=>376,1162=>695, +1163=>609,1164=>617,1165=>530,1166=>542,1167=>571,1168=>549,1169=>473,1170=>607,1171=>531,1172=>562, +1173=>477,1174=>969,1175=>811,1176=>577,1177=>479,1178=>639,1179=>543,1180=>639,1181=>543,1182=>639, +1183=>543,1184=>771,1185=>748,1186=>677,1187=>594,1188=>913,1189=>789,1190=>973,1191=>824,1192=>790, +1193=>624,1194=>628,1195=>495,1196=>549,1197=>524,1198=>549,1199=>532,1200=>549,1201=>532,1202=>616, +1203=>532,1204=>840,1205=>726,1206=>617,1207=>532,1208=>617,1209=>532,1210=>617,1211=>570,1212=>847, +1213=>655,1214=>847,1215=>655,1216=>265,1217=>969,1218=>811,1219=>590,1220=>543,1221=>698,1222=>603, +1223=>677,1224=>594,1225=>699,1226=>612,1227=>617,1228=>532,1229=>799,1230=>697,1231=>250,1232=>615, +1233=>551,1234=>615,1235=>551,1236=>876,1237=>883,1238=>568,1239=>554,1240=>708,1241=>554,1242=>708, +1243=>554,1244=>969,1245=>811,1246=>577,1247=>479,1248=>599,1249=>520,1250=>673,1251=>584,1252=>673, +1253=>584,1254=>708,1255=>550,1256=>708,1257=>550,1258=>708,1259=>550,1260=>628,1261=>494,1262=>548, +1263=>532,1264=>548,1265=>532,1266=>548,1267=>532,1268=>617,1269=>532,1270=>549,1271=>473,1272=>794, +1273=>710,1274=>607,1275=>531,1276=>616,1277=>532,1278=>616,1279=>532,1280=>617,1281=>530,1282=>905, +1283=>807,1284=>877,1285=>782,1286=>611,1287=>529,1288=>964,1289=>861,1290=>1001,1291=>870,1292=>697, +1293=>593,1294=>695,1295=>640,1296=>553,1297=>486,1298=>677,1299=>575,1300=>1052,1301=>894,1302=>804, +1303=>778,1304=>928,1305=>887,1306=>708,1307=>571,1308=>890,1309=>736,1312=>972,1313=>814,1314=>973, +1315=>821,1316=>713,1317=>614,1329=>780,1330=>659,1331=>794,1332=>794,1333=>659,1334=>579,1335=>613, +1336=>659,1337=>765,1338=>794,1339=>659,1340=>501,1341=>741,1342=>888,1343=>659,1344=>636,1345=>579, +1346=>794,1347=>699,1348=>794,1349=>659,1350=>756,1351=>659,1352=>659,1353=>659,1354=>711,1355=>579, +1356=>794,1357=>659,1358=>794,1359=>571,1360=>659,1361=>659,1362=>719,1363=>708,1364=>711,1365=>708, +1366=>571,1369=>276,1370=>286,1371=>450,1372=>450,1373=>352,1374=>474,1375=>450,1377=>876,1378=>570, +1379=>686,1380=>690,1381=>570,1382=>627,1383=>479,1384=>570,1385=>630,1386=>627,1387=>570,1388=>363, +1389=>804,1390=>576,1391=>570,1392=>570,1393=>571,1394=>631,1395=>570,1396=>593,1397=>250,1398=>684, +1399=>464,1400=>570,1401=>407,1402=>876,1403=>464,1404=>691,1405=>570,1406=>626,1407=>876,1408=>570, +1409=>571,1410=>451,1411=>876,1412=>583,1413=>550,1414=>566,1415=>686,1417=>303,1418=>390,1456=>0, +1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0, +1467=>0,1468=>0,1469=>0,1470=>325,1471=>0,1472=>265,1473=>0,1474=>0,1475=>265,1478=>397, +1479=>0,1488=>566,1489=>547,1490=>403,1491=>534,1492=>576,1493=>245,1494=>336,1495=>576,1496=>583, +1497=>245,1498=>532,1499=>500,1500=>539,1501=>576,1502=>593,1503=>245,1504=>397,1505=>629,1506=>506, +1507=>576,1508=>543,1509=>468,1510=>523,1511=>596,1512=>532,1513=>727,1514=>591,1520=>423,1521=>409, +1522=>423,1523=>374,1524=>580,1542=>573,1543=>573,1545=>681,1546=>879,1548=>290,1557=>0,1563=>286, +1567=>478,1569=>423,1570=>250,1571=>250,1572=>435,1573=>250,1574=>704,1575=>250,1576=>847,1577=>471, +1578=>847,1579=>847,1580=>581,1581=>581,1582=>581,1583=>400,1584=>400,1585=>435,1586=>435,1587=>1099, +1588=>1099,1589=>1088,1590=>1088,1591=>832,1592=>832,1593=>537,1594=>537,1600=>264,1601=>933,1602=>698, +1603=>742,1604=>654,1605=>557,1606=>661,1607=>471,1608=>435,1609=>704,1610=>704,1611=>0,1612=>0, +1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1619=>0,1620=>0,1621=>0,1626=>450, +1632=>483,1633=>483,1634=>483,1635=>483,1636=>483,1637=>483,1638=>483,1639=>483,1640=>483,1641=>483, +1642=>483,1643=>292,1644=>286,1645=>490,1646=>847,1647=>698,1652=>263,1657=>847,1658=>847,1659=>847, +1660=>847,1661=>847,1662=>847,1663=>847,1664=>847,1665=>581,1666=>581,1667=>581,1668=>581,1669=>581, +1670=>581,1671=>581,1681=>435,1682=>435,1685=>549,1688=>435,1697=>933,1700=>933,1702=>933,1705=>805, +1711=>805,1717=>654,1722=>661,1727=>581,1734=>435,1740=>704,1742=>704,1749=>471,1776=>483,1777=>483, +1778=>483,1779=>483,1780=>483,1781=>483,1782=>483,1783=>483,1784=>483,1785=>483,1984=>572,1985=>572, +1986=>572,1987=>572,1988=>572,1989=>572,1990=>572,1991=>572,1992=>572,1993=>572,1994=>250,1995=>514, +1996=>381,1997=>532,1998=>588,1999=>588,2000=>534,2001=>588,2002=>746,2003=>394,2004=>394,2005=>502, +2006=>550,2007=>315,2008=>863,2009=>425,2010=>705,2011=>588,2012=>563,2013=>660,2014=>477,2015=>651, +2016=>425,2017=>563,2018=>534,2019=>477,2020=>477,2021=>470,2022=>534,2023=>534,2027=>0,2028=>0, +2029=>0,2030=>0,2031=>0,2032=>0,2033=>0,2034=>0,2035=>0,2036=>282,2037=>282,2040=>504, +2041=>504,2042=>325,3647=>586,3713=>603,3714=>615,3716=>619,3719=>434,3720=>565,3722=>615,3725=>619, +3732=>602,3733=>577,3734=>580,3735=>589,3737=>593,3738=>563,3739=>563,3740=>670,3741=>690,3742=>618, +3743=>618,3745=>631,3746=>619,3747=>615,3749=>584,3751=>569,3754=>633,3755=>737,3757=>569,3758=>615, +3759=>708,3760=>569,3761=>0,3762=>485,3763=>485,3764=>0,3765=>0,3766=>0,3767=>0,3768=>0, +3769=>0,3771=>0,3772=>0,3773=>597,3776=>337,3777=>591,3778=>414,3779=>492,3780=>442,3782=>606, +3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>572,3793=>576,3794=>576,3795=>603, +3796=>563,3797=>563,3798=>633,3799=>603,3800=>606,3801=>609,3804=>925,3805=>925,4256=>756,4257=>621, +4258=>577,4259=>683,4260=>532,4261=>617,4262=>710,4263=>729,4264=>420,4265=>508,4266=>710,4267=>713, +4268=>526,4269=>753,4270=>675,4271=>620,4272=>729,4273=>526,4274=>526,4275=>753,4276=>753,4277=>581, +4278=>543,4279=>526,4280=>536,4281=>526,4282=>649,4283=>715,4284=>526,4285=>510,4286=>526,4287=>602, +4288=>719,4289=>488,4290=>598,4291=>488,4292=>508,4293=>606,4304=>457,4305=>457,4306=>479,4307=>706, +4308=>470,4309=>465,4310=>457,4311=>717,4312=>457,4313=>466,4314=>952,4315=>470,4316=>470,4317=>704, +4318=>466,4319=>470,4320=>713,4321=>470,4322=>590,4323=>471,4324=>709,4325=>470,4326=>704,4327=>470, +4328=>470,4329=>470,4330=>510,4331=>470,4332=>470,4333=>439,4334=>470,4335=>448,4336=>465,4337=>504, +4338=>457,4339=>457,4340=>457,4341=>507,4342=>741,4343=>536,4344=>470,4345=>498,4346=>498,4347=>527, +4348=>273,5121=>615,5122=>615,5123=>615,5124=>615,5125=>692,5126=>692,5127=>692,5129=>692,5130=>692, +5131=>692,5132=>751,5133=>751,5134=>751,5135=>751,5136=>751,5137=>751,5138=>870,5139=>906,5140=>870, +5141=>906,5142=>692,5143=>870,5144=>906,5145=>870,5146=>906,5147=>692,5149=>230,5150=>488,5151=>381, +5152=>381,5153=>350,5154=>350,5155=>354,5156=>350,5157=>419,5158=>347,5159=>230,5160=>350,5161=>350, +5162=>350,5163=>980,5164=>817,5165=>857,5166=>1005,5167=>615,5168=>615,5169=>615,5170=>615,5171=>656, +5172=>656,5173=>656,5175=>656,5176=>656,5177=>656,5178=>751,5179=>615,5180=>751,5181=>751,5182=>751, +5183=>751,5184=>870,5185=>906,5186=>870,5187=>906,5188=>870,5189=>906,5190=>870,5191=>906,5192=>656, +5193=>457,5194=>172,5196=>659,5197=>659,5198=>659,5199=>659,5200=>657,5201=>657,5202=>657,5204=>657, +5205=>657,5206=>657,5207=>829,5208=>800,5209=>829,5210=>800,5211=>829,5212=>800,5213=>835,5214=>810, +5215=>835,5216=>810,5217=>853,5218=>810,5219=>853,5220=>810,5221=>853,5222=>391,5223=>790,5224=>790, +5225=>779,5226=>801,5227=>565,5228=>565,5229=>565,5230=>565,5231=>565,5232=>565,5233=>565,5234=>565, +5235=>565,5236=>773,5237=>693,5238=>733,5239=>734,5240=>733,5241=>734,5242=>773,5243=>693,5244=>773, +5245=>693,5246=>733,5247=>734,5248=>733,5249=>734,5250=>733,5251=>366,5252=>366,5253=>675,5254=>697, +5255=>675,5256=>697,5257=>565,5258=>565,5259=>565,5260=>565,5261=>565,5262=>565,5263=>565,5264=>565, +5265=>565,5266=>773,5267=>693,5268=>733,5269=>734,5270=>733,5271=>734,5272=>773,5273=>693,5274=>773, +5275=>693,5276=>733,5277=>734,5278=>733,5279=>734,5280=>733,5281=>391,5282=>391,5283=>549,5284=>501, +5285=>501,5286=>501,5287=>549,5288=>549,5289=>549,5290=>501,5291=>501,5292=>674,5293=>691,5294=>671, +5295=>687,5296=>671,5297=>687,5298=>674,5299=>691,5300=>674,5301=>691,5302=>671,5303=>687,5304=>671, +5305=>687,5306=>671,5307=>347,5308=>457,5309=>347,5312=>766,5313=>766,5314=>766,5315=>766,5316=>766, +5317=>766,5318=>766,5319=>766,5320=>766,5321=>962,5322=>931,5323=>953,5324=>766,5325=>953,5326=>766, +5327=>766,5328=>540,5329=>407,5330=>540,5331=>766,5332=>766,5333=>766,5334=>766,5335=>766,5336=>766, +5337=>766,5338=>766,5339=>766,5340=>962,5341=>931,5342=>953,5343=>927,5344=>953,5345=>927,5346=>962, +5347=>931,5348=>962,5349=>931,5350=>975,5351=>927,5352=>975,5353=>927,5354=>540,5356=>656,5357=>542, +5358=>542,5359=>542,5360=>542,5361=>542,5362=>542,5363=>542,5364=>542,5365=>542,5366=>751,5367=>678, +5368=>712,5369=>694,5370=>712,5371=>694,5372=>751,5373=>678,5374=>751,5375=>678,5376=>712,5377=>694, +5378=>712,5379=>694,5380=>712,5381=>376,5382=>378,5383=>376,5392=>641,5393=>641,5394=>641,5395=>802, +5396=>802,5397=>802,5398=>802,5399=>818,5400=>785,5401=>818,5402=>785,5403=>818,5404=>785,5405=>1026, +5406=>989,5407=>1026,5408=>989,5409=>1026,5410=>989,5411=>1026,5412=>989,5413=>576,5414=>564,5415=>564, +5416=>564,5417=>564,5418=>564,5419=>564,5420=>564,5421=>564,5422=>564,5423=>760,5424=>703,5425=>734, +5426=>736,5427=>734,5428=>736,5429=>760,5430=>703,5431=>760,5432=>703,5433=>734,5434=>736,5435=>734, +5436=>736,5437=>734,5438=>376,5440=>350,5441=>436,5442=>824,5443=>824,5444=>824,5445=>824,5446=>824, +5447=>824,5448=>542,5449=>542,5450=>542,5451=>542,5452=>542,5453=>542,5454=>751,5455=>678,5456=>376, +5458=>656,5459=>615,5460=>615,5461=>615,5462=>615,5463=>653,5464=>653,5465=>653,5466=>653,5467=>831, +5468=>906,5469=>457,5470=>659,5471=>659,5472=>659,5473=>659,5474=>659,5475=>659,5476=>657,5477=>657, +5478=>657,5479=>657,5480=>853,5481=>810,5482=>457,5492=>747,5493=>747,5494=>747,5495=>747,5496=>747, +5497=>747,5498=>747,5499=>507,5500=>677,5501=>436,5502=>942,5503=>942,5504=>942,5505=>942,5506=>942, +5507=>942,5508=>942,5509=>743,5514=>747,5515=>747,5516=>747,5517=>747,5518=>1133,5519=>1133,5520=>1133, +5521=>901,5522=>901,5523=>1133,5524=>1133,5525=>629,5526=>965,5536=>766,5537=>766,5538=>766,5539=>766, +5540=>766,5541=>766,5542=>540,5543=>579,5544=>579,5545=>579,5546=>579,5547=>579,5548=>579,5549=>579, +5550=>376,5551=>565,5598=>693,5601=>690,5702=>421,5703=>421,5742=>399,5743=>942,5744=>1178,5745=>1469, +5746=>1469,5747=>1237,5748=>1237,5749=>1469,5750=>1469,5760=>429,5761=>443,5762=>641,5763=>838,5764=>1035, +5765=>1232,5766=>443,5767=>641,5768=>838,5769=>1035,5770=>1232,5771=>448,5772=>646,5773=>844,5774=>1042, +5775=>1241,5776=>443,5777=>641,5778=>836,5779=>1034,5780=>1232,5781=>448,5782=>677,5783=>709,5784=>1084, +5785=>1035,5786=>615,5787=>457,5788=>456,7424=>532,7425=>646,7426=>883,7427=>527,7428=>495,7429=>544, +7430=>544,7431=>441,7432=>486,7433=>250,7434=>355,7435=>521,7436=>524,7437=>679,7438=>584,7439=>550, +7440=>495,7441=>615,7442=>615,7443=>615,7444=>920,7446=>550,7447=>550,7448=>472,7449=>541,7450=>541, +7451=>524,7452=>517,7453=>663,7454=>853,7455=>574,7456=>532,7457=>736,7458=>472,7459=>473,7462=>524, +7463=>532,7464=>507,7465=>472,7466=>531,7467=>575,7468=>387,7469=>552,7470=>389,7472=>436,7473=>358, +7474=>358,7475=>439,7476=>426,7477=>167,7478=>167,7479=>372,7480=>315,7481=>489,7482=>424,7483=>424, +7484=>446,7485=>396,7486=>342,7487=>394,7488=>346,7489=>415,7490=>560,7491=>352,7492=>352,7493=>365, +7494=>583,7495=>385,7496=>365,7497=>375,7498=>375,7499=>324,7500=>323,7501=>365,7502=>161,7503=>383, +7504=>561,7505=>368,7506=>372,7507=>333,7508=>372,7509=>372,7510=>385,7511=>265,7512=>364,7513=>422, +7514=>561,7515=>375,7517=>361,7518=>335,7519=>347,7520=>374,7521=>327,7522=>161,7523=>233,7524=>364, +7525=>375,7526=>361,7527=>335,7528=>370,7529=>374,7530=>327,7543=>571,7544=>426,7547=>334,7557=>250, +7579=>365,7580=>333,7581=>333,7582=>372,7583=>324,7584=>267,7585=>209,7586=>365,7587=>364,7588=>235, +7589=>224,7590=>234,7591=>235,7592=>211,7593=>224,7594=>211,7595=>338,7596=>561,7597=>561,7598=>369, +7599=>431,7600=>368,7601=>372,7602=>372,7603=>324,7604=>258,7605=>265,7606=>457,7607=>376,7608=>325, +7609=>365,7610=>375,7611=>330,7612=>393,7613=>330,7614=>353,7615=>372,7620=>0,7621=>0,7622=>0, +7623=>0,7624=>0,7625=>0,7680=>615,7681=>551,7682=>617,7683=>571,7684=>617,7685=>571,7686=>617, +7687=>571,7688=>628,7689=>495,7690=>693,7691=>571,7692=>693,7693=>571,7694=>693,7695=>571,7696=>693, +7697=>571,7698=>693,7699=>571,7700=>568,7701=>554,7702=>568,7703=>554,7704=>568,7705=>554,7706=>568, +7707=>554,7708=>568,7709=>554,7710=>518,7711=>316,7712=>697,7713=>571,7714=>677,7715=>570,7716=>677, +7717=>570,7718=>677,7719=>570,7720=>677,7721=>570,7722=>677,7723=>570,7724=>265,7725=>250,7726=>265, +7727=>250,7728=>590,7729=>521,7730=>590,7731=>521,7732=>590,7733=>521,7734=>501,7735=>259,7736=>501, +7737=>259,7738=>501,7739=>250,7740=>501,7741=>250,7742=>776,7743=>876,7744=>776,7745=>876,7746=>776, +7747=>876,7748=>673,7749=>570,7750=>673,7751=>570,7752=>673,7753=>570,7754=>673,7755=>570,7756=>708, +7757=>550,7758=>708,7759=>550,7760=>708,7761=>550,7762=>708,7763=>550,7764=>542,7765=>571,7766=>542, +7767=>571,7768=>625,7769=>370,7770=>625,7771=>370,7772=>625,7773=>370,7774=>625,7775=>370,7776=>571, +7777=>469,7778=>571,7779=>469,7780=>571,7781=>469,7782=>571,7783=>469,7784=>571,7785=>469,7786=>549, +7787=>353,7788=>549,7789=>353,7790=>549,7791=>353,7792=>549,7793=>353,7794=>659,7795=>570,7796=>659, +7797=>570,7798=>659,7799=>570,7800=>659,7801=>570,7802=>659,7803=>570,7804=>615,7805=>532,7806=>615, +7807=>532,7808=>890,7809=>736,7810=>890,7811=>736,7812=>890,7813=>736,7814=>890,7815=>736,7816=>890, +7817=>736,7818=>616,7819=>532,7820=>616,7821=>532,7822=>549,7823=>532,7824=>616,7825=>472,7826=>616, +7827=>472,7828=>616,7829=>472,7830=>570,7831=>353,7832=>736,7833=>532,7834=>551,7835=>316,7838=>691, +7839=>550,7840=>615,7841=>551,7842=>615,7843=>551,7844=>615,7845=>551,7846=>615,7847=>551,7848=>615, +7849=>551,7850=>615,7851=>551,7852=>615,7853=>551,7854=>615,7855=>551,7856=>615,7857=>551,7858=>615, +7859=>551,7860=>615,7861=>551,7862=>615,7863=>551,7864=>568,7865=>554,7866=>568,7867=>554,7868=>568, +7869=>554,7870=>568,7871=>554,7872=>568,7873=>554,7874=>568,7875=>554,7876=>568,7877=>554,7878=>568, +7879=>554,7880=>265,7881=>250,7882=>265,7883=>250,7884=>708,7885=>550,7886=>708,7887=>550,7888=>708, +7889=>550,7890=>708,7891=>550,7892=>708,7893=>550,7894=>708,7895=>550,7896=>708,7897=>550,7898=>822, +7899=>550,7900=>822,7901=>550,7902=>822,7903=>550,7904=>822,7905=>550,7906=>822,7907=>550,7908=>659, +7909=>570,7910=>659,7911=>570,7912=>772,7913=>570,7914=>772,7915=>570,7916=>772,7917=>570,7918=>772, +7919=>570,7920=>772,7921=>570,7922=>549,7923=>532,7924=>549,7925=>532,7926=>549,7927=>532,7928=>549, +7929=>532,7936=>593,7937=>593,7938=>593,7939=>593,7940=>593,7941=>593,7942=>593,7943=>593,7944=>615, +7945=>615,7946=>790,7947=>790,7948=>692,7949=>721,7950=>637,7951=>668,7952=>486,7953=>486,7954=>486, +7955=>486,7956=>486,7957=>486,7960=>640,7961=>640,7962=>869,7963=>877,7964=>809,7965=>835,7968=>570, +7969=>570,7970=>570,7971=>570,7972=>570,7973=>570,7974=>570,7975=>570,7976=>753,7977=>751,7978=>977, +7979=>980,7980=>924,7981=>945,7982=>840,7983=>852,7984=>304,7985=>304,7986=>304,7987=>304,7988=>304, +7989=>304,7990=>304,7991=>304,7992=>342,7993=>336,7994=>571,7995=>571,7996=>513,7997=>540,7998=>440, +7999=>443,8000=>550,8001=>550,8002=>550,8003=>550,8004=>550,8005=>550,8008=>724,8009=>763,8010=>985, +8011=>989,8012=>844,8013=>873,8016=>521,8017=>521,8018=>521,8019=>521,8020=>521,8021=>521,8022=>521, +8023=>521,8025=>705,8027=>897,8029=>911,8031=>808,8032=>753,8033=>753,8034=>753,8035=>753,8036=>753, +8037=>753,8038=>753,8039=>753,8040=>722,8041=>759,8042=>980,8043=>985,8044=>851,8045=>875,8046=>829, +8047=>857,8048=>593,8049=>593,8050=>486,8051=>493,8052=>570,8053=>589,8054=>304,8055=>304,8056=>550, +8057=>550,8058=>521,8059=>521,8060=>753,8061=>753,8064=>593,8065=>593,8066=>593,8067=>593,8068=>593, +8069=>593,8070=>593,8071=>593,8072=>615,8073=>615,8074=>790,8075=>790,8076=>692,8077=>721,8078=>637, +8079=>668,8080=>570,8081=>570,8082=>570,8083=>570,8084=>570,8085=>570,8086=>570,8087=>570,8088=>753, +8089=>751,8090=>977,8091=>980,8092=>924,8093=>945,8094=>840,8095=>852,8096=>753,8097=>753,8098=>753, +8099=>753,8100=>753,8101=>753,8102=>753,8103=>753,8104=>722,8105=>759,8106=>980,8107=>985,8108=>851, +8109=>875,8110=>829,8111=>857,8112=>593,8113=>593,8114=>593,8115=>593,8116=>593,8118=>593,8119=>593, +8120=>615,8121=>615,8122=>645,8123=>623,8124=>615,8125=>450,8126=>450,8127=>450,8128=>450,8129=>450, +8130=>570,8131=>570,8132=>589,8134=>570,8135=>570,8136=>724,8137=>671,8138=>837,8139=>784,8140=>677, +8141=>450,8142=>450,8143=>450,8144=>304,8145=>304,8146=>304,8147=>304,8150=>304,8151=>304,8152=>265, +8153=>265,8154=>427,8155=>367,8157=>450,8158=>450,8159=>450,8160=>521,8161=>521,8162=>521,8163=>521, +8164=>571,8165=>571,8166=>521,8167=>521,8168=>549,8169=>549,8170=>760,8171=>742,8172=>616,8173=>450, +8174=>450,8175=>450,8178=>753,8179=>753,8180=>753,8182=>753,8183=>753,8184=>847,8185=>731,8186=>830, +8187=>743,8188=>688,8189=>450,8190=>450,8192=>450,8193=>900,8194=>450,8195=>900,8196=>296,8197=>225, +8198=>150,8199=>572,8200=>286,8201=>180,8202=>89,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0, +8208=>325,8209=>325,8210=>572,8213=>900,8214=>450,8215=>450,8219=>286,8223=>466,8227=>531,8228=>301, +8229=>601,8231=>286,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>180,8241=>1562,8242=>204, +8243=>336,8244=>468,8245=>204,8246=>336,8247=>468,8248=>305,8251=>754,8252=>437,8253=>478,8254=>450, +8255=>723,8256=>723,8257=>225,8258=>900,8259=>450,8260=>150,8261=>351,8262=>351,8263=>830,8264=>659, +8265=>659,8266=>447,8267=>572,8268=>450,8269=>450,8270=>450,8271=>303,8272=>723,8273=>450,8274=>404, +8275=>900,8276=>723,8277=>754,8278=>527,8279=>597,8280=>754,8281=>754,8282=>286,8283=>717,8284=>754, +8285=>286,8286=>286,8287=>200,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0, +8300=>0,8301=>0,8302=>0,8303=>0,8304=>360,8305=>161,8308=>360,8309=>360,8310=>360,8311=>360, +8312=>360,8313=>360,8314=>475,8315=>475,8316=>475,8317=>221,8318=>221,8319=>358,8320=>360,8321=>360, +8322=>360,8323=>360,8324=>360,8325=>360,8326=>360,8327=>360,8328=>360,8329=>360,8330=>475,8331=>475, +8332=>475,8333=>221,8334=>221,8336=>352,8337=>375,8338=>372,8339=>399,8340=>375,8352=>789,8353=>572, +8354=>572,8355=>572,8356=>572,8357=>876,8358=>673,8359=>1145,8360=>966,8361=>890,8362=>706,8363=>571, +8365=>572,8366=>572,8367=>1145,8368=>572,8369=>572,8370=>572,8371=>572,8372=>696,8373=>577,8400=>0, +8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>917,8449=>917,8450=>628,8451=>1011, +8452=>578,8453=>917,8454=>960,8455=>553,8456=>628,8457=>856,8459=>889,8460=>679,8461=>765,8462=>570, +8463=>570,8464=>422,8465=>627,8466=>648,8467=>372,8468=>736,8469=>721,8470=>936,8471=>900,8472=>627, +8473=>631,8474=>708,8475=>718,8476=>732,8477=>712,8478=>807,8479=>615,8480=>917,8481=>967,8483=>615, +8484=>670,8485=>520,8486=>688,8487=>688,8488=>554,8489=>304,8490=>590,8491=>615,8492=>708,8493=>633, +8494=>769,8495=>532,8496=>545,8497=>708,8498=>518,8499=>962,8500=>416,8501=>670,8502=>606,8503=>419, +8504=>580,8505=>342,8506=>833,8507=>1074,8508=>632,8509=>655,8510=>589,8511=>764,8512=>729,8513=>697, +8514=>501,8515=>501,8516=>549,8517=>737,8518=>637,8519=>554,8520=>316,8521=>316,8523=>702,8526=>474, +8531=>872,8532=>872,8533=>872,8534=>872,8535=>872,8536=>872,8537=>872,8538=>872,8539=>872,8540=>872, +8541=>872,8542=>872,8543=>511,8544=>265,8545=>443,8546=>620,8547=>831,8548=>615,8549=>830,8550=>1007, +8551=>1185,8552=>826,8553=>616,8554=>839,8555=>1018,8556=>501,8557=>628,8558=>693,8559=>776,8560=>250, +8561=>412,8562=>573,8563=>730,8564=>532,8565=>729,8566=>892,8567=>1053,8568=>737,8569=>532,8570=>740, +8571=>901,8572=>250,8573=>495,8574=>571,8575=>876,8576=>1121,8577=>693,8578=>1121,8579=>633,8580=>494, +8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754,8598=>754,8599=>754,8600=>754,8601=>754, +8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754,8608=>754,8609=>754,8610=>754,8611=>754, +8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754,8618=>754,8619=>754,8620=>754,8621=>754, +8622=>754,8623=>754,8624=>754,8625=>754,8626=>754,8627=>754,8628=>754,8629=>754,8630=>754,8631=>754, +8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754,8638=>754,8639=>754,8640=>754,8641=>754, +8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754,8648=>754,8649=>754,8650=>754,8651=>754, +8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754,8658=>754,8659=>754,8660=>754,8661=>754, +8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754,8668=>754,8669=>754,8670=>754,8671=>754, +8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754,8678=>754,8679=>754,8680=>754,8681=>754, +8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754,8688=>754,8689=>754,8690=>754,8691=>754, +8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754,8698=>754,8699=>754,8700=>754,8701=>754, +8702=>754,8703=>754,8704=>615,8705=>572,8706=>465,8707=>568,8708=>568,8709=>784,8710=>602,8711=>602, +8712=>784,8713=>784,8714=>646,8715=>784,8716=>784,8717=>646,8718=>572,8719=>681,8720=>681,8721=>606, +8722=>754,8723=>754,8724=>754,8725=>303,8726=>573,8727=>754,8728=>563,8729=>563,8730=>573,8731=>573, +8732=>573,8733=>643,8734=>750,8735=>754,8736=>807,8737=>807,8738=>754,8739=>450,8740=>450,8741=>450, +8742=>450,8743=>659,8744=>659,8745=>659,8746=>659,8747=>469,8748=>710,8749=>951,8750=>469,8751=>710, +8752=>951,8753=>469,8754=>469,8755=>469,8756=>572,8757=>572,8758=>234,8759=>572,8760=>754,8761=>754, +8762=>754,8763=>754,8764=>754,8765=>754,8766=>754,8767=>754,8768=>337,8769=>754,8770=>754,8771=>754, +8772=>754,8773=>754,8774=>754,8775=>754,8776=>754,8777=>754,8778=>754,8779=>754,8780=>754,8781=>754, +8782=>754,8783=>754,8784=>754,8785=>754,8786=>755,8787=>755,8788=>900,8789=>900,8790=>754,8791=>754, +8792=>754,8793=>754,8794=>754,8795=>754,8796=>754,8797=>754,8798=>754,8799=>754,8800=>754,8801=>754, +8802=>754,8803=>754,8804=>754,8805=>754,8806=>754,8807=>754,8808=>754,8809=>754,8810=>942,8811=>942, +8812=>417,8813=>754,8814=>754,8815=>754,8816=>754,8817=>754,8818=>754,8819=>754,8820=>754,8821=>754, +8822=>754,8823=>754,8824=>754,8825=>754,8826=>754,8827=>754,8828=>754,8829=>754,8830=>754,8831=>754, +8832=>754,8833=>754,8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754,8840=>754,8841=>754, +8842=>754,8843=>754,8844=>659,8845=>659,8846=>659,8847=>754,8848=>754,8849=>754,8850=>754,8851=>702, +8852=>702,8853=>754,8854=>754,8855=>754,8856=>754,8857=>754,8858=>754,8859=>754,8860=>754,8861=>754, +8862=>754,8863=>754,8864=>754,8865=>754,8866=>784,8867=>784,8868=>784,8869=>784,8870=>468,8871=>468, +8872=>784,8873=>784,8874=>784,8875=>784,8876=>784,8877=>784,8878=>784,8879=>784,8880=>754,8881=>754, +8882=>754,8883=>754,8884=>754,8885=>754,8886=>900,8887=>900,8888=>754,8889=>754,8890=>468,8891=>659, +8892=>659,8893=>659,8894=>754,8895=>754,8896=>738,8897=>738,8898=>738,8899=>738,8900=>444,8901=>286, +8902=>563,8903=>754,8904=>900,8905=>900,8906=>900,8907=>900,8908=>900,8909=>754,8910=>659,8911=>659, +8912=>754,8913=>754,8914=>754,8915=>754,8916=>754,8917=>754,8918=>754,8919=>754,8920=>1280,8921=>1280, +8922=>754,8923=>754,8924=>754,8925=>754,8926=>754,8927=>754,8928=>754,8929=>754,8930=>754,8931=>754, +8932=>754,8933=>754,8934=>754,8935=>754,8936=>754,8937=>754,8938=>754,8939=>754,8940=>754,8941=>754, +8942=>900,8943=>900,8944=>900,8945=>900,8946=>900,8947=>784,8948=>646,8949=>784,8950=>784,8951=>646, +8952=>784,8953=>784,8954=>900,8955=>784,8956=>646,8957=>784,8958=>646,8959=>784,8960=>542,8961=>542, +8962=>571,8963=>754,8964=>754,8965=>754,8966=>754,8967=>439,8968=>351,8969=>351,8970=>351,8971=>351, +8972=>728,8973=>728,8974=>728,8975=>728,8976=>754,8977=>461,8984=>900,8985=>754,8988=>422,8989=>422, +8990=>422,8991=>422,8992=>469,8993=>469,8996=>1037,8997=>1037,8998=>1272,8999=>1037,9000=>1299,9003=>1272, +9004=>786,9075=>304,9076=>571,9077=>753,9082=>593,9085=>681,9095=>1037,9108=>786,9115=>450,9116=>450, +9117=>450,9118=>450,9119=>450,9120=>450,9121=>450,9122=>450,9123=>450,9124=>450,9125=>450,9126=>450, +9127=>675,9128=>675,9129=>675,9130=>675,9131=>675,9132=>675,9133=>675,9134=>469,9166=>754,9167=>850, +9187=>786,9189=>692,9250=>571,9251=>571,9312=>807,9313=>807,9314=>807,9315=>807,9316=>807,9317=>807, +9318=>807,9319=>807,9320=>807,9321=>807,9472=>542,9473=>542,9474=>542,9475=>542,9476=>542,9477=>542, +9478=>542,9479=>542,9480=>542,9481=>542,9482=>542,9483=>542,9484=>542,9485=>542,9486=>542,9487=>542, +9488=>542,9489=>542,9490=>542,9491=>542,9492=>542,9493=>542,9494=>542,9495=>542,9496=>542,9497=>542, +9498=>542,9499=>542,9500=>542,9501=>542,9502=>542,9503=>542,9504=>542,9505=>542,9506=>542,9507=>542, +9508=>542,9509=>542,9510=>542,9511=>542,9512=>542,9513=>542,9514=>542,9515=>542,9516=>542,9517=>542, +9518=>542,9519=>542,9520=>542,9521=>542,9522=>542,9523=>542,9524=>542,9525=>542,9526=>542,9527=>542, +9528=>542,9529=>542,9530=>542,9531=>542,9532=>542,9533=>542,9534=>542,9535=>542,9536=>542,9537=>542, +9538=>542,9539=>542,9540=>542,9541=>542,9542=>542,9543=>542,9544=>542,9545=>542,9546=>542,9547=>542, +9548=>542,9549=>542,9550=>542,9551=>542,9552=>542,9553=>542,9554=>542,9555=>542,9556=>542,9557=>542, +9558=>542,9559=>542,9560=>542,9561=>542,9562=>542,9563=>542,9564=>542,9565=>542,9566=>542,9567=>542, +9568=>542,9569=>542,9570=>542,9571=>542,9572=>542,9573=>542,9574=>542,9575=>542,9576=>542,9577=>542, +9578=>542,9579=>542,9580=>542,9581=>542,9582=>542,9583=>542,9584=>542,9585=>542,9586=>542,9587=>542, +9588=>542,9589=>542,9590=>542,9591=>542,9592=>542,9593=>542,9594=>542,9595=>542,9596=>542,9597=>542, +9598=>542,9599=>542,9600=>692,9601=>692,9602=>692,9603=>692,9604=>692,9605=>692,9606=>692,9607=>692, +9608=>692,9609=>692,9610=>692,9611=>692,9612=>692,9613=>692,9614=>692,9615=>692,9616=>692,9617=>692, +9618=>692,9619=>692,9620=>692,9621=>692,9622=>692,9623=>692,9624=>692,9625=>692,9626=>692,9627=>692, +9628=>692,9629=>692,9630=>692,9631=>692,9632=>850,9633=>850,9634=>850,9635=>850,9636=>850,9637=>850, +9638=>850,9639=>850,9640=>850,9641=>850,9642=>610,9643=>610,9644=>850,9645=>850,9646=>495,9647=>495, +9648=>692,9649=>692,9650=>692,9651=>692,9652=>452,9653=>452,9654=>692,9655=>692,9656=>452,9657=>452, +9658=>692,9659=>692,9660=>692,9661=>692,9662=>452,9663=>452,9664=>692,9665=>692,9666=>452,9667=>452, +9668=>692,9669=>692,9670=>692,9671=>692,9672=>692,9673=>785,9674=>444,9675=>785,9676=>785,9677=>785, +9678=>785,9679=>785,9680=>785,9681=>785,9682=>785,9683=>785,9684=>785,9685=>785,9686=>474,9687=>474, +9688=>712,9689=>873,9690=>873,9691=>873,9692=>348,9693=>348,9694=>348,9695=>348,9696=>785,9697=>785, +9698=>692,9699=>692,9700=>692,9701=>692,9702=>531,9703=>850,9704=>850,9705=>850,9706=>850,9707=>850, +9708=>692,9709=>692,9710=>692,9711=>1007,9712=>850,9713=>850,9714=>850,9715=>850,9716=>785,9717=>785, +9718=>785,9719=>785,9720=>692,9721=>692,9722=>692,9723=>747,9724=>747,9725=>659,9726=>659,9727=>692, +9728=>807,9729=>900,9730=>807,9731=>807,9732=>807,9733=>807,9734=>807,9735=>515,9736=>806,9737=>807, +9738=>799,9739=>799,9740=>604,9741=>911,9742=>1121,9743=>1125,9744=>807,9745=>807,9746=>807,9747=>479, +9748=>807,9749=>807,9750=>807,9751=>807,9752=>807,9753=>807,9754=>807,9755=>807,9756=>807,9757=>548, +9758=>807,9759=>548,9760=>807,9761=>807,9762=>807,9763=>807,9764=>602,9765=>671,9766=>584,9767=>705, +9768=>490,9769=>807,9770=>807,9771=>807,9772=>639,9773=>807,9774=>807,9775=>807,9776=>807,9777=>807, +9778=>807,9779=>807,9780=>807,9781=>807,9782=>807,9783=>807,9784=>807,9785=>807,9786=>807,9787=>807, +9788=>807,9789=>807,9790=>807,9791=>552,9792=>658,9793=>658,9794=>807,9795=>807,9796=>807,9797=>807, +9798=>807,9799=>807,9800=>807,9801=>807,9802=>807,9803=>807,9804=>807,9805=>807,9806=>807,9807=>807, +9808=>807,9809=>807,9810=>807,9811=>807,9812=>807,9813=>807,9814=>807,9815=>807,9816=>807,9817=>807, +9818=>807,9819=>807,9820=>807,9821=>807,9822=>807,9823=>807,9824=>807,9825=>807,9826=>807,9827=>807, +9828=>807,9829=>807,9830=>807,9831=>807,9832=>807,9833=>424,9834=>574,9835=>807,9836=>807,9837=>424, +9838=>321,9839=>435,9840=>673,9841=>689,9842=>807,9843=>807,9844=>807,9845=>807,9846=>807,9847=>807, +9848=>807,9849=>807,9850=>807,9851=>807,9852=>807,9853=>807,9854=>807,9855=>807,9856=>782,9857=>782, +9858=>782,9859=>782,9860=>782,9861=>782,9862=>807,9863=>807,9864=>807,9865=>807,9866=>807,9867=>807, +9868=>807,9869=>807,9870=>807,9871=>807,9872=>807,9873=>807,9874=>807,9875=>807,9876=>807,9877=>487, +9878=>807,9879=>807,9880=>807,9881=>807,9882=>807,9883=>807,9884=>807,9888=>807,9889=>632,9890=>903, +9891=>977,9892=>1028,9893=>811,9894=>754,9895=>754,9896=>754,9897=>754,9898=>754,9899=>754,9900=>754, +9901=>754,9902=>754,9903=>754,9904=>759,9905=>754,9906=>658,9907=>659,9908=>659,9909=>659,9910=>765, +9911=>659,9912=>659,9985=>754,9986=>754,9987=>754,9988=>754,9990=>754,9991=>754,9992=>754,9993=>754, +9996=>754,9997=>754,9998=>754,9999=>754,10000=>754,10001=>754,10002=>754,10003=>754,10004=>754,10005=>754, +10006=>754,10007=>754,10008=>754,10009=>754,10010=>754,10011=>754,10012=>754,10013=>754,10014=>754,10015=>754, +10016=>754,10017=>754,10018=>754,10019=>754,10020=>754,10021=>754,10022=>754,10023=>754,10025=>754,10026=>754, +10027=>754,10028=>754,10029=>754,10030=>754,10031=>754,10032=>754,10033=>754,10034=>754,10035=>754,10036=>754, +10037=>754,10038=>754,10039=>754,10040=>754,10041=>754,10042=>754,10043=>754,10044=>754,10045=>754,10046=>754, +10047=>754,10048=>754,10049=>754,10050=>754,10051=>754,10052=>754,10053=>754,10054=>754,10055=>754,10056=>754, +10057=>754,10058=>754,10059=>754,10061=>807,10063=>807,10064=>807,10065=>807,10066=>807,10070=>807,10072=>754, +10073=>754,10074=>754,10075=>290,10076=>290,10077=>484,10078=>484,10081=>754,10082=>754,10083=>754,10084=>754, +10085=>754,10086=>754,10087=>754,10088=>754,10089=>754,10090=>754,10091=>754,10092=>754,10093=>754,10094=>754, +10095=>754,10096=>754,10097=>754,10098=>754,10099=>754,10100=>754,10101=>754,10102=>807,10103=>807,10104=>807, +10105=>807,10106=>807,10107=>807,10108=>807,10109=>807,10110=>807,10111=>807,10112=>754,10113=>754,10114=>754, +10115=>754,10116=>754,10117=>754,10118=>754,10119=>754,10120=>754,10121=>754,10122=>754,10123=>754,10124=>754, +10125=>754,10126=>754,10127=>754,10128=>754,10129=>754,10130=>754,10131=>754,10132=>754,10136=>754,10137=>754, +10138=>754,10139=>754,10140=>754,10141=>754,10142=>754,10143=>754,10144=>754,10145=>754,10146=>754,10147=>754, +10148=>754,10149=>754,10150=>754,10151=>754,10152=>754,10153=>754,10154=>754,10155=>754,10156=>754,10157=>754, +10158=>754,10159=>754,10161=>754,10162=>754,10163=>754,10164=>754,10165=>754,10166=>754,10167=>754,10168=>754, +10169=>754,10170=>754,10171=>754,10172=>754,10173=>754,10174=>754,10181=>351,10182=>351,10208=>444,10214=>445, +10215=>445,10216=>351,10217=>351,10218=>500,10219=>500,10224=>754,10225=>754,10226=>754,10227=>754,10228=>1042, +10229=>1290,10230=>1290,10231=>1290,10232=>1290,10233=>1290,10234=>1290,10235=>1290,10236=>1290,10237=>1290,10238=>1290, +10239=>1290,10240=>659,10241=>659,10242=>659,10243=>659,10244=>659,10245=>659,10246=>659,10247=>659,10248=>659, +10249=>659,10250=>659,10251=>659,10252=>659,10253=>659,10254=>659,10255=>659,10256=>659,10257=>659,10258=>659, +10259=>659,10260=>659,10261=>659,10262=>659,10263=>659,10264=>659,10265=>659,10266=>659,10267=>659,10268=>659, +10269=>659,10270=>659,10271=>659,10272=>659,10273=>659,10274=>659,10275=>659,10276=>659,10277=>659,10278=>659, +10279=>659,10280=>659,10281=>659,10282=>659,10283=>659,10284=>659,10285=>659,10286=>659,10287=>659,10288=>659, +10289=>659,10290=>659,10291=>659,10292=>659,10293=>659,10294=>659,10295=>659,10296=>659,10297=>659,10298=>659, +10299=>659,10300=>659,10301=>659,10302=>659,10303=>659,10304=>659,10305=>659,10306=>659,10307=>659,10308=>659, +10309=>659,10310=>659,10311=>659,10312=>659,10313=>659,10314=>659,10315=>659,10316=>659,10317=>659,10318=>659, +10319=>659,10320=>659,10321=>659,10322=>659,10323=>659,10324=>659,10325=>659,10326=>659,10327=>659,10328=>659, +10329=>659,10330=>659,10331=>659,10332=>659,10333=>659,10334=>659,10335=>659,10336=>659,10337=>659,10338=>659, +10339=>659,10340=>659,10341=>659,10342=>659,10343=>659,10344=>659,10345=>659,10346=>659,10347=>659,10348=>659, +10349=>659,10350=>659,10351=>659,10352=>659,10353=>659,10354=>659,10355=>659,10356=>659,10357=>659,10358=>659, +10359=>659,10360=>659,10361=>659,10362=>659,10363=>659,10364=>659,10365=>659,10366=>659,10367=>659,10368=>659, +10369=>659,10370=>659,10371=>659,10372=>659,10373=>659,10374=>659,10375=>659,10376=>659,10377=>659,10378=>659, +10379=>659,10380=>659,10381=>659,10382=>659,10383=>659,10384=>659,10385=>659,10386=>659,10387=>659,10388=>659, +10389=>659,10390=>659,10391=>659,10392=>659,10393=>659,10394=>659,10395=>659,10396=>659,10397=>659,10398=>659, +10399=>659,10400=>659,10401=>659,10402=>659,10403=>659,10404=>659,10405=>659,10406=>659,10407=>659,10408=>659, +10409=>659,10410=>659,10411=>659,10412=>659,10413=>659,10414=>659,10415=>659,10416=>659,10417=>659,10418=>659, +10419=>659,10420=>659,10421=>659,10422=>659,10423=>659,10424=>659,10425=>659,10426=>659,10427=>659,10428=>659, +10429=>659,10430=>659,10431=>659,10432=>659,10433=>659,10434=>659,10435=>659,10436=>659,10437=>659,10438=>659, +10439=>659,10440=>659,10441=>659,10442=>659,10443=>659,10444=>659,10445=>659,10446=>659,10447=>659,10448=>659, +10449=>659,10450=>659,10451=>659,10452=>659,10453=>659,10454=>659,10455=>659,10456=>659,10457=>659,10458=>659, +10459=>659,10460=>659,10461=>659,10462=>659,10463=>659,10464=>659,10465=>659,10466=>659,10467=>659,10468=>659, +10469=>659,10470=>659,10471=>659,10472=>659,10473=>659,10474=>659,10475=>659,10476=>659,10477=>659,10478=>659, +10479=>659,10480=>659,10481=>659,10482=>659,10483=>659,10484=>659,10485=>659,10486=>659,10487=>659,10488=>659, +10489=>659,10490=>659,10491=>659,10492=>659,10493=>659,10494=>659,10495=>659,10502=>754,10503=>754,10506=>754, +10507=>754,10560=>615,10561=>615,10627=>660,10628=>660,10702=>754,10703=>900,10704=>900,10705=>900,10706=>900, +10707=>900,10708=>900,10709=>900,10731=>444,10746=>754,10747=>754,10752=>900,10753=>900,10754=>900,10764=>1192, +10765=>469,10766=>469,10767=>469,10768=>469,10769=>469,10770=>469,10771=>469,10772=>469,10773=>469,10774=>469, +10775=>469,10776=>469,10777=>469,10778=>469,10779=>469,10780=>469,10799=>754,10877=>754,10878=>754,10879=>754, +10880=>754,10881=>754,10882=>754,10883=>754,10884=>754,10885=>754,10886=>754,10887=>754,10888=>754,10889=>754, +10890=>754,10891=>754,10892=>754,10893=>754,10894=>754,10895=>754,10896=>754,10897=>754,10898=>754,10899=>754, +10900=>754,10901=>754,10902=>754,10903=>754,10904=>754,10905=>754,10906=>754,10907=>754,10908=>754,10909=>754, +10910=>754,10911=>754,10912=>754,10926=>754,10927=>754,10928=>754,10929=>754,10930=>754,10931=>754,10932=>754, +10933=>754,10934=>754,10935=>754,10936=>754,10937=>754,10938=>754,11001=>754,11002=>754,11008=>754,11009=>754, +11010=>754,11011=>754,11012=>754,11013=>754,11014=>754,11015=>754,11016=>754,11017=>754,11018=>754,11019=>754, +11020=>754,11021=>754,11022=>752,11023=>752,11024=>752,11025=>752,11026=>850,11027=>850,11028=>850,11029=>850, +11030=>692,11031=>692,11032=>692,11033=>692,11034=>850,11039=>782,11040=>782,11041=>786,11042=>786,11043=>786, +11044=>1007,11091=>782,11092=>782,11360=>501,11361=>250,11362=>501,11363=>542,11364=>625,11365=>551,11366=>353, +11367=>677,11368=>570,11369=>590,11370=>521,11371=>616,11372=>472,11373=>703,11374=>776,11375=>615,11377=>661, +11378=>1015,11379=>865,11380=>532,11381=>589,11382=>511,11383=>593,11385=>373,11386=>550,11387=>441,11388=>157, +11389=>387,11568=>582,11569=>799,11570=>799,11571=>614,11572=>615,11573=>571,11574=>505,11575=>615,11576=>615, +11577=>568,11578=>568,11579=>614,11580=>787,11581=>616,11582=>441,11583=>616,11584=>799,11585=>799,11586=>270, +11587=>564,11588=>677,11589=>590,11590=>475,11591=>616,11592=>580,11593=>568,11594=>452,11595=>857,11596=>700, +11597=>673,11598=>558,11599=>265,11600=>700,11601=>265,11602=>677,11603=>569,11604=>799,11605=>799,11606=>677, +11607=>288,11608=>674,11609=>799,11610=>799,11611=>628,11612=>690,11613=>616,11614=>628,11615=>560,11616=>615, +11617=>677,11618=>568,11619=>709,11620=>510,11621=>709,11631=>463,11800=>478,11810=>351,11811=>351,11812=>351, +11813=>351,11822=>478,19904=>807,19905=>807,19906=>807,19907=>807,19908=>807,19909=>807,19910=>807,19911=>807, +19912=>807,19913=>807,19914=>807,19915=>807,19916=>807,19917=>807,19918=>807,19919=>807,19920=>807,19921=>807, +19922=>807,19923=>807,19924=>807,19925=>807,19926=>807,19927=>807,19928=>807,19929=>807,19930=>807,19931=>807, +19932=>807,19933=>807,19934=>807,19935=>807,19936=>807,19937=>807,19938=>807,19939=>807,19940=>807,19941=>807, +19942=>807,19943=>807,19944=>807,19945=>807,19946=>807,19947=>807,19948=>807,19949=>807,19950=>807,19951=>807, +19952=>807,19953=>807,19954=>807,19955=>807,19956=>807,19957=>807,19958=>807,19959=>807,19960=>807,19961=>807, +19962=>807,19963=>807,19964=>807,19965=>807,19966=>807,19967=>807,42564=>571,42565=>469,42566=>318,42567=>304, +42572=>1062,42573=>925,42576=>926,42577=>815,42580=>971,42581=>757,42582=>879,42583=>758,42594=>956,42595=>820, +42596=>959,42597=>811,42598=>1060,42599=>907,42600=>708,42601=>550,42602=>770,42603=>641,42604=>1222,42605=>917, +42606=>791,42634=>704,42635=>616,42636=>549,42637=>524,42644=>617,42645=>570,42760=>444,42761=>444,42762=>444, +42763=>444,42764=>444,42765=>444,42766=>444,42767=>444,42768=>444,42769=>444,42770=>444,42771=>444,42772=>444, +42773=>444,42774=>444,42779=>332,42780=>332,42781=>227,42782=>227,42783=>227,42790=>677,42791=>570,42792=>790, +42793=>638,42794=>553,42795=>486,42800=>441,42801=>469,42802=>1125,42803=>886,42804=>1083,42805=>891,42806=>1028, +42807=>883,42808=>874,42809=>736,42810=>874,42811=>736,42812=>863,42813=>736,42814=>633,42815=>494,42822=>612, +42823=>353,42824=>523,42825=>384,42826=>726,42827=>633,42830=>1222,42831=>917,42880=>501,42881=>250,42882=>662, +42883=>570,42889=>303,42890=>338,42891=>360,42892=>247,43003=>518,43004=>542,43005=>776,43006=>265,43007=>1079, +61440=>879,61441=>879,63173=>550,64256=>620,64257=>567,64258=>567,64259=>870,64260=>870,64261=>617,64262=>774, +64275=>1081,64276=>1081,64277=>1076,64278=>1067,64279=>1376,64285=>245,64286=>0,64287=>423,64288=>572,64289=>770, +64290=>696,64291=>815,64292=>694,64293=>759,64294=>769,64295=>726,64296=>788,64297=>754,64298=>727,64299=>727, +64300=>727,64301=>727,64302=>566,64303=>566,64304=>566,64305=>547,64306=>403,64307=>534,64308=>576,64309=>245, +64310=>336,64312=>583,64313=>302,64314=>532,64315=>500,64316=>539,64318=>593,64320=>397,64321=>629,64323=>576, +64324=>543,64326=>523,64327=>596,64328=>532,64329=>727,64330=>591,64331=>245,64332=>547,64333=>500,64334=>543, +64335=>566,64338=>847,64339=>883,64340=>250,64341=>271,64342=>847,64343=>883,64344=>250,64345=>271,64346=>847, +64347=>883,64348=>250,64349=>271,64350=>847,64351=>883,64352=>250,64353=>271,64354=>847,64355=>883,64356=>250, +64357=>271,64358=>847,64359=>883,64360=>250,64361=>271,64362=>933,64363=>932,64364=>430,64365=>455,64366=>933, +64367=>932,64368=>430,64369=>455,64370=>581,64371=>581,64372=>556,64373=>581,64374=>581,64375=>581,64376=>556, +64377=>581,64378=>581,64379=>581,64380=>556,64381=>581,64382=>581,64383=>581,64384=>556,64385=>581,64394=>435, +64395=>497,64396=>435,64397=>497,64398=>805,64399=>805,64400=>428,64401=>497,64402=>805,64403=>805,64404=>428, +64405=>497,64414=>661,64415=>685,64473=>435,64474=>465,64488=>250,64489=>271,64508=>704,64509=>750,64510=>250, +64511=>271,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0, +65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0, +65059=>0,65136=>264,65137=>264,65138=>264,65139=>235,65140=>264,65142=>264,65143=>264,65144=>264,65145=>264, +65146=>264,65147=>264,65148=>264,65149=>264,65150=>264,65151=>264,65152=>423,65153=>250,65154=>274,65155=>250, +65156=>274,65157=>435,65158=>465,65159=>250,65160=>274,65161=>704,65162=>750,65163=>250,65164=>271,65165=>250, +65166=>274,65167=>847,65168=>883,65169=>250,65170=>271,65171=>471,65172=>482,65173=>847,65174=>883,65175=>250, +65176=>271,65177=>847,65178=>883,65179=>250,65180=>271,65181=>581,65182=>581,65183=>556,65184=>581,65185=>581, +65186=>581,65187=>556,65188=>581,65189=>581,65190=>581,65191=>556,65192=>581,65193=>400,65194=>472,65195=>400, +65196=>472,65197=>435,65198=>497,65199=>435,65200=>497,65201=>1099,65202=>1147,65203=>754,65204=>803,65205=>1099, +65206=>1147,65207=>754,65208=>803,65209=>1088,65210=>1103,65211=>764,65212=>780,65213=>1088,65214=>1103,65215=>764, +65216=>780,65217=>832,65218=>854,65219=>716,65220=>738,65221=>832,65222=>854,65223=>716,65224=>738,65225=>537, +65226=>479,65227=>537,65228=>434,65229=>537,65230=>479,65231=>470,65232=>434,65233=>933,65234=>932,65235=>430, +65236=>455,65237=>698,65238=>750,65239=>430,65240=>455,65241=>742,65242=>758,65243=>428,65244=>497,65245=>654, +65246=>681,65247=>274,65248=>298,65249=>557,65250=>599,65251=>482,65252=>520,65253=>661,65254=>685,65255=>250, +65256=>271,65257=>471,65258=>482,65259=>475,65260=>415,65261=>435,65262=>465,65263=>704,65264=>750,65265=>704, +65266=>750,65267=>250,65268=>271,65269=>513,65270=>537,65271=>513,65272=>537,65273=>513,65274=>537,65275=>513, +65276=>537,65279=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>923); +$enc=''; +$diff=''; +$file='dejavusanscondensed.z'; +$ctg='dejavusanscondensed.ctg.z'; +$originalsize=544636; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensed.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensed.z new file mode 100644 index 0000000..8198081 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensed.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedb.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedb.ctg.z new file mode 100644 index 0000000..514062c Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedb.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedb.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedb.php new file mode 100644 index 0000000..2c16cab --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedb.php @@ -0,0 +1,504 @@ +<?php +$type='TrueTypeUnicode'; +$name='DejaVuSansCondensed-Bold'; +$desc=array('Ascent'=>928,'Descent'=>-236,'CapHeight'=>17,'Flags'=>32,'FontBBox'=>'[-962 -385 1777 1174]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>540); +$up=-63; +$ut=44; +$dw=540; +$cw=array( +0=>540,32=>313,33=>410,34=>469,35=>754,36=>626,37=>901,38=>785,39=>275,40=>411, +41=>411,42=>470,43=>754,44=>342,45=>374,46=>342,47=>329,48=>626,49=>626,50=>626, +51=>626,52=>626,53=>626,54=>626,55=>626,56=>626,57=>626,58=>360,59=>360,60=>754, +61=>754,62=>754,63=>522,64=>900,65=>696,66=>686,67=>660,68=>747,69=>615,70=>615, +71=>738,72=>753,73=>334,74=>334,75=>697,76=>573,77=>896,78=>753,79=>765,80=>659, +81=>765,82=>693,83=>648,84=>614,85=>730,86=>696,87=>993,88=>694,89=>651,90=>652, +91=>411,92=>329,93=>411,94=>754,95=>450,96=>450,97=>607,98=>644,99=>533,100=>644, +101=>610,102=>391,103=>644,104=>641,105=>308,106=>308,107=>598,108=>308,109=>938,110=>641, +111=>618,112=>644,113=>644,114=>444,115=>536,116=>430,117=>641,118=>586,119=>831,120=>580, +121=>586,122=>523,123=>641,124=>329,125=>641,126=>754,8364=>626,8218=>342,402=>391,8222=>591, +8230=>900,8224=>450,8225=>450,710=>450,8240=>1296,352=>648,8249=>371,338=>1050,381=>652,8216=>342, +8217=>342,8220=>591,8221=>591,8226=>575,8211=>450,8212=>900,732=>450,8482=>900,353=>536,8250=>371, +339=>984,382=>523,376=>651,160=>313,161=>410,162=>626,163=>626,164=>572,165=>626,166=>329, +167=>450,168=>450,169=>900,170=>507,171=>581,172=>754,173=>374,174=>900,175=>450,176=>450, +177=>754,178=>394,179=>394,180=>450,181=>662,182=>572,183=>342,184=>450,185=>394,186=>507, +187=>581,188=>932,189=>932,190=>932,191=>522,192=>696,193=>696,194=>696,195=>696,196=>696, +197=>696,198=>976,199=>660,200=>615,201=>615,202=>615,203=>615,204=>334,205=>334,206=>334, +207=>334,208=>754,209=>753,210=>765,211=>765,212=>765,213=>765,214=>765,215=>754,216=>765, +217=>730,218=>730,219=>730,220=>730,221=>651,222=>664,223=>647,224=>607,225=>607,226=>607, +227=>607,228=>607,229=>607,230=>943,231=>533,232=>610,233=>610,234=>610,235=>610,236=>308, +237=>308,238=>308,239=>308,240=>618,241=>641,242=>618,243=>618,244=>618,245=>618,246=>618, +247=>754,248=>618,249=>641,250=>641,251=>641,252=>641,253=>586,254=>644,255=>586,256=>696, +257=>607,258=>696,259=>607,260=>696,261=>607,262=>660,263=>533,264=>660,265=>533,266=>660, +267=>533,268=>660,269=>533,270=>747,271=>644,272=>754,273=>644,274=>615,275=>610,276=>615, +277=>610,278=>615,279=>610,280=>615,281=>610,282=>615,283=>610,284=>738,285=>644,286=>738, +287=>644,288=>738,289=>644,290=>738,291=>644,292=>753,293=>641,294=>876,295=>711,296=>334, +297=>308,298=>334,299=>308,300=>334,301=>308,302=>334,303=>308,304=>334,305=>308,306=>669, +307=>617,308=>334,309=>308,310=>697,311=>598,312=>598,313=>573,314=>308,315=>573,316=>308, +317=>573,318=>431,319=>573,320=>501,321=>578,322=>334,323=>753,324=>641,325=>753,326=>641, +327=>753,328=>641,329=>884,330=>753,331=>641,332=>765,333=>618,334=>765,335=>618,336=>765, +337=>618,340=>693,341=>444,342=>693,343=>444,344=>693,345=>444,346=>648,347=>536,348=>648, +349=>536,350=>648,351=>536,354=>614,355=>430,356=>614,357=>430,358=>614,359=>430,360=>730, +361=>641,362=>730,363=>641,364=>730,365=>641,366=>730,367=>641,368=>730,369=>641,370=>730, +371=>641,372=>993,373=>831,374=>651,375=>586,377=>652,378=>523,379=>652,380=>523,383=>391, +384=>644,385=>729,386=>686,387=>644,388=>686,389=>644,390=>660,391=>660,392=>533,393=>754, +394=>791,395=>681,396=>644,397=>619,398=>615,399=>764,400=>626,401=>615,403=>738,404=>713, +405=>940,406=>392,407=>350,408=>697,409=>598,410=>324,411=>532,412=>938,413=>753,414=>641, +415=>765,416=>786,417=>618,418=>974,419=>821,420=>703,421=>644,422=>693,423=>648,424=>536, +425=>615,426=>497,427=>430,428=>636,429=>430,430=>614,431=>751,432=>641,433=>765,434=>732, +435=>717,436=>700,437=>652,438=>523,439=>695,440=>695,441=>576,442=>523,443=>626,444=>695, +445=>576,446=>515,447=>644,448=>334,449=>593,450=>489,451=>334,452=>1399,453=>1271,454=>1168, +455=>908,456=>882,457=>617,458=>1088,459=>1062,460=>949,461=>696,462=>607,463=>334,464=>308, +465=>765,466=>618,467=>730,468=>641,469=>730,470=>641,471=>730,472=>641,473=>730,474=>641, +475=>730,476=>641,477=>610,478=>696,479=>607,480=>696,481=>607,482=>976,483=>943,484=>738, +485=>644,486=>738,487=>644,488=>697,489=>598,490=>765,491=>618,492=>765,493=>618,494=>695, +495=>523,496=>308,497=>1399,498=>1271,499=>1168,500=>738,501=>644,502=>1160,503=>708,504=>753, +505=>641,506=>696,507=>607,508=>976,509=>943,510=>765,511=>618,512=>696,513=>607,514=>696, +515=>607,516=>615,517=>610,518=>615,519=>610,520=>334,521=>308,522=>334,523=>308,524=>765, +525=>618,526=>765,527=>618,528=>693,529=>444,530=>693,531=>444,532=>730,533=>641,534=>730, +535=>641,536=>648,537=>536,538=>614,539=>430,540=>621,541=>546,542=>753,543=>641,544=>753, +545=>778,546=>728,547=>593,548=>652,549=>523,550=>696,551=>607,552=>615,553=>610,554=>765, +555=>618,556=>765,557=>618,558=>765,559=>618,560=>765,561=>618,562=>651,563=>586,564=>442, +565=>780,566=>460,567=>308,568=>979,569=>979,570=>696,571=>660,572=>533,573=>573,574=>614, +575=>536,576=>523,577=>703,578=>553,579=>686,580=>730,581=>696,582=>615,583=>610,584=>334, +585=>308,586=>774,587=>712,588=>693,589=>444,590=>651,591=>586,592=>607,593=>644,594=>644, +595=>644,596=>533,597=>533,598=>645,599=>712,600=>610,601=>610,602=>788,603=>501,604=>490, +605=>733,606=>658,607=>308,608=>712,609=>644,610=>564,611=>579,612=>571,613=>641,614=>641, +615=>641,616=>491,617=>396,618=>491,619=>502,620=>624,621=>308,622=>757,623=>938,624=>938, +625=>938,626=>641,627=>713,628=>636,629=>618,630=>817,631=>613,632=>716,633=>484,634=>484, +635=>584,636=>444,637=>444,638=>536,639=>536,640=>578,641=>578,642=>536,643=>374,644=>391, +645=>544,646=>497,647=>430,648=>430,649=>828,650=>695,651=>603,652=>586,653=>831,654=>586, +655=>651,656=>624,657=>615,658=>576,659=>576,660=>515,661=>515,662=>515,663=>515,664=>765, +665=>569,666=>658,667=>616,668=>622,669=>308,670=>659,671=>485,672=>712,673=>515,674=>515, +675=>1040,676=>1093,677=>1039,678=>876,679=>691,680=>836,681=>923,682=>712,683=>702,684=>532, +685=>374,686=>609,687=>710,688=>410,689=>410,690=>197,691=>284,692=>284,693=>284,694=>369, +695=>532,696=>375,697=>271,698=>469,699=>342,700=>342,701=>342,702=>330,703=>330,704=>293, +705=>293,706=>450,707=>450,708=>450,709=>450,711=>450,712=>275,713=>450,714=>450,715=>450, +716=>275,717=>450,718=>450,719=>450,720=>303,721=>303,722=>330,723=>330,724=>450,725=>450, +726=>374,727=>295,728=>450,729=>450,730=>450,731=>450,733=>450,734=>315,735=>450,736=>370, +737=>197,738=>343,739=>371,740=>293,741=>450,742=>450,743=>450,744=>450,745=>450,748=>450, +749=>450,750=>591,755=>450,759=>450,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0, +774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0, +784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0, +794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0, +804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0, +814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0, +824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0, +834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0, +844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0, +860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>628,881=>508,882=>919, +883=>752,884=>271,885=>271,886=>753,887=>630,890=>450,891=>533,892=>495,893=>494,894=>360, +900=>397,901=>450,902=>717,903=>342,904=>761,905=>908,906=>507,908=>801,910=>882,911=>804, +912=>351,913=>696,914=>686,915=>573,916=>696,917=>615,918=>652,919=>753,920=>765,921=>334, +922=>697,923=>696,924=>896,925=>753,926=>568,927=>765,928=>753,929=>659,931=>615,932=>614, +933=>651,934=>765,935=>694,936=>765,937=>765,938=>334,939=>651,940=>618,941=>501,942=>641, +943=>351,944=>607,945=>618,946=>644,947=>613,948=>618,949=>501,950=>532,951=>641,952=>618, +953=>351,954=>639,955=>569,956=>662,957=>613,958=>532,959=>618,960=>712,961=>644,962=>533, +963=>701,964=>574,965=>607,966=>704,967=>580,968=>714,969=>782,970=>351,971=>607,972=>618, +973=>607,974=>782,975=>697,976=>585,977=>594,978=>671,979=>883,980=>671,981=>716,982=>782, +983=>669,984=>765,985=>618,986=>660,987=>533,988=>615,989=>444,990=>632,991=>593,992=>827, +993=>564,994=>983,995=>753,996=>749,997=>644,998=>835,999=>669,1000=>660,1001=>585,1002=>709, +1003=>604,1004=>677,1005=>644,1006=>614,1007=>531,1008=>669,1009=>644,1010=>533,1011=>308,1012=>765, +1013=>580,1014=>580,1015=>664,1016=>644,1017=>660,1018=>896,1019=>659,1020=>644,1021=>628,1022=>660, +1023=>628,1024=>615,1025=>615,1026=>791,1027=>573,1028=>660,1029=>648,1030=>334,1031=>334,1032=>334, +1033=>1039,1034=>1017,1035=>791,1036=>735,1037=>753,1038=>694,1039=>753,1040=>696,1041=>686,1042=>686, +1043=>573,1044=>801,1045=>615,1046=>1102,1047=>639,1048=>753,1049=>753,1050=>735,1051=>747,1052=>896, +1053=>753,1054=>765,1055=>753,1056=>659,1057=>660,1058=>614,1059=>694,1060=>892,1061=>694,1062=>835, +1063=>727,1064=>1112,1065=>1193,1066=>845,1067=>932,1068=>686,1069=>660,1070=>1056,1071=>693,1072=>607, +1073=>628,1074=>569,1075=>470,1076=>727,1077=>610,1078=>896,1079=>523,1080=>630,1081=>630,1082=>611, +1083=>659,1084=>735,1085=>622,1086=>618,1087=>622,1088=>644,1089=>533,1090=>521,1091=>586,1092=>893, +1093=>580,1094=>667,1095=>618,1096=>956,1097=>995,1098=>676,1099=>813,1100=>569,1101=>533,1102=>875, +1103=>578,1104=>610,1105=>610,1106=>642,1107=>470,1108=>533,1109=>536,1110=>308,1111=>308,1112=>308, +1113=>892,1114=>860,1115=>661,1116=>611,1117=>630,1118=>586,1119=>622,1120=>983,1121=>782,1122=>756, +1123=>662,1124=>911,1125=>755,1126=>893,1127=>749,1128=>1222,1129=>1009,1130=>765,1131=>618,1132=>1112, +1133=>906,1134=>626,1135=>501,1136=>967,1137=>955,1138=>765,1139=>618,1140=>765,1141=>625,1142=>765, +1143=>625,1144=>1033,1145=>939,1146=>967,1147=>776,1148=>1265,1149=>1055,1150=>983,1151=>782,1152=>660, +1153=>533,1154=>587,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>376,1161=>376,1162=>861, +1163=>726,1164=>686,1165=>550,1166=>659,1167=>644,1168=>573,1169=>470,1170=>599,1171=>488,1172=>727, +1173=>602,1174=>1102,1175=>896,1176=>639,1177=>523,1178=>697,1179=>611,1180=>735,1181=>611,1182=>735, +1183=>611,1184=>914,1185=>743,1186=>860,1187=>727,1188=>992,1189=>787,1190=>1146,1191=>915,1192=>856, +1193=>772,1194=>660,1195=>533,1196=>614,1197=>521,1198=>651,1199=>586,1200=>651,1201=>586,1202=>694, +1203=>580,1204=>1001,1205=>900,1206=>727,1207=>618,1208=>727,1209=>618,1210=>727,1211=>641,1212=>923, +1213=>729,1214=>923,1215=>729,1216=>334,1217=>1102,1218=>896,1219=>697,1220=>567,1221=>855,1222=>725, +1223=>753,1224=>622,1225=>861,1226=>726,1227=>727,1228=>618,1229=>1003,1230=>839,1231=>308,1232=>696, +1233=>607,1234=>696,1235=>607,1236=>976,1237=>943,1238=>615,1239=>610,1240=>764,1241=>610,1242=>764, +1243=>610,1244=>1102,1245=>896,1246=>639,1247=>523,1248=>695,1249=>576,1250=>753,1251=>630,1252=>753, +1253=>630,1254=>765,1255=>618,1256=>765,1257=>618,1258=>765,1259=>618,1260=>660,1261=>533,1262=>694, +1263=>586,1264=>694,1265=>586,1266=>694,1267=>586,1268=>727,1269=>618,1270=>573,1271=>470,1272=>932, +1273=>813,1274=>599,1275=>488,1276=>694,1277=>580,1278=>694,1279=>580,1280=>686,1281=>547,1282=>1043, +1283=>804,1284=>1007,1285=>828,1286=>745,1287=>624,1288=>1117,1289=>915,1290=>1160,1291=>912,1292=>755, +1293=>574,1294=>844,1295=>722,1296=>626,1297=>501,1298=>747,1299=>659,1300=>1157,1301=>961,1302=>958, +1303=>881,1304=>973,1305=>912,1306=>765,1307=>644,1308=>993,1309=>831,1312=>1140,1313=>953,1314=>1146, +1315=>915,1316=>861,1317=>726,1329=>886,1330=>730,1331=>886,1332=>886,1333=>730,1334=>699,1335=>730, +1336=>730,1337=>877,1338=>886,1339=>730,1340=>639,1341=>970,1342=>1022,1343=>730,1344=>639,1345=>681, +1346=>886,1347=>789,1348=>886,1349=>714,1350=>886,1351=>730,1352=>730,1353=>730,1354=>862,1355=>699, +1356=>886,1357=>730,1358=>886,1359=>648,1360=>730,1361=>714,1362=>805,1363=>765,1364=>842,1365=>765, +1366=>648,1369=>330,1370=>342,1371=>495,1372=>495,1373=>342,1374=>491,1375=>468,1377=>938,1378=>641, +1379=>779,1380=>781,1381=>641,1382=>735,1383=>588,1384=>641,1385=>729,1386=>735,1387=>641,1388=>448, +1389=>916,1390=>644,1391=>641,1392=>641,1393=>644,1394=>737,1395=>641,1396=>676,1397=>308,1398=>794, +1399=>502,1400=>641,1401=>502,1402=>938,1403=>502,1404=>777,1405=>641,1406=>732,1407=>938,1408=>641, +1409=>644,1410=>514,1411=>938,1412=>700,1413=>618,1414=>648,1415=>776,1417=>360,1418=>438,1456=>0, +1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0, +1467=>0,1468=>0,1469=>0,1470=>374,1471=>0,1472=>334,1473=>0,1474=>0,1475=>334,1478=>447, +1479=>0,1488=>676,1489=>605,1490=>483,1491=>589,1492=>641,1493=>308,1494=>442,1495=>641,1496=>651, +1497=>308,1498=>584,1499=>584,1500=>611,1501=>641,1502=>698,1503=>308,1504=>447,1505=>696,1506=>610, +1507=>646,1508=>618,1509=>565,1510=>676,1511=>656,1512=>584,1513=>854,1514=>676,1520=>598,1521=>598, +1522=>597,1523=>399,1524=>639,1542=>600,1543=>600,1545=>795,1546=>1042,1548=>342,1557=>0,1563=>360, +1567=>522,1569=>460,1570=>308,1571=>308,1572=>559,1573=>308,1574=>825,1575=>308,1576=>904,1577=>531, +1578=>904,1579=>904,1580=>648,1581=>648,1582=>648,1583=>461,1584=>461,1585=>518,1586=>518,1587=>1242, +1588=>1242,1589=>1210,1590=>1210,1591=>935,1592=>935,1593=>615,1594=>615,1600=>308,1601=>1045,1602=>804, +1603=>825,1604=>781,1605=>659,1606=>768,1607=>531,1608=>559,1609=>825,1610=>825,1611=>0,1612=>0, +1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1619=>0,1620=>0,1621=>0,1626=>450, +1632=>549,1633=>549,1634=>549,1635=>549,1636=>549,1637=>549,1638=>549,1639=>549,1640=>549,1641=>549, +1642=>549,1643=>336,1644=>342,1645=>490,1646=>904,1647=>804,1652=>263,1657=>904,1658=>904,1659=>904, +1660=>904,1661=>904,1662=>904,1663=>904,1664=>904,1665=>648,1666=>648,1667=>648,1668=>648,1669=>648, +1670=>648,1671=>648,1681=>518,1682=>518,1685=>613,1688=>518,1697=>1045,1700=>1045,1702=>1045,1705=>921, +1711=>921,1717=>781,1722=>768,1727=>648,1734=>559,1740=>825,1742=>825,1749=>531,1776=>549,1777=>549, +1778=>549,1779=>549,1780=>549,1781=>549,1782=>549,1783=>549,1784=>549,1785=>549,1984=>626,1985=>626, +1986=>626,1987=>626,1988=>626,1989=>626,1990=>626,1991=>626,1992=>626,1993=>626,1994=>308,1995=>492, +1996=>489,1997=>586,1998=>622,1999=>622,2000=>534,2001=>622,2002=>813,2003=>496,2004=>496,2005=>564, +2006=>619,2007=>399,2008=>920,2009=>456,2010=>743,2011=>622,2012=>586,2013=>821,2014=>564,2015=>636, +2016=>456,2017=>586,2018=>517,2019=>564,2020=>564,2021=>564,2022=>517,2023=>517,2027=>0,2028=>0, +2029=>0,2030=>0,2031=>0,2032=>0,2033=>0,2034=>0,2035=>0,2036=>342,2037=>342,2040=>622, +2041=>622,2042=>374,3647=>668,3713=>710,3714=>673,3716=>674,3719=>512,3720=>668,3722=>669,3725=>685, +3732=>635,3733=>633,3734=>672,3735=>737,3737=>657,3738=>654,3739=>654,3740=>830,3741=>744,3742=>779, +3743=>779,3745=>752,3746=>685,3747=>692,3749=>691,3751=>642,3754=>744,3755=>928,3757=>651,3758=>705, +3759=>840,3760=>620,3761=>0,3762=>549,3763=>549,3764=>0,3765=>0,3766=>0,3767=>0,3768=>0, +3769=>0,3771=>0,3772=>0,3773=>603,3776=>464,3777=>774,3778=>464,3779=>584,3780=>569,3782=>683, +3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>694,3793=>694,3794=>624,3795=>752, +3796=>655,3797=>655,3798=>764,3799=>710,3800=>683,3801=>818,3804=>1227,3805=>1227,4256=>826,4257=>669, +4258=>665,4259=>753,4260=>584,4261=>696,4262=>771,4263=>800,4264=>477,4265=>570,4266=>771,4267=>810, +4268=>579,4269=>813,4270=>732,4271=>677,4272=>782,4273=>579,4274=>579,4275=>797,4276=>797,4277=>660, +4278=>587,4279=>579,4280=>582,4281=>579,4282=>710,4283=>812,4284=>570,4285=>557,4286=>579,4287=>700, +4288=>802,4289=>541,4290=>668,4291=>554,4292=>570,4293=>668,4304=>497,4305=>497,4306=>536,4307=>734, +4308=>505,4309=>506,4310=>497,4311=>744,4312=>497,4313=>488,4314=>967,4315=>506,4316=>507,4317=>730, +4318=>497,4319=>532,4320=>740,4321=>506,4322=>621,4323=>525,4324=>732,4325=>505,4326=>731,4327=>506, +4328=>506,4329=>507,4330=>568,4331=>506,4332=>506,4333=>497,4334=>506,4335=>506,4336=>501,4337=>543, +4338=>497,4339=>497,4340=>497,4341=>544,4342=>767,4343=>571,4344=>506,4345=>536,4346=>487,4347=>615, +4348=>331,5121=>696,5122=>696,5123=>696,5124=>696,5125=>814,5126=>814,5127=>814,5129=>814,5130=>814, +5131=>814,5132=>916,5133=>908,5134=>916,5135=>908,5136=>916,5137=>908,5138=>1034,5139=>1025,5140=>1034, +5141=>1025,5142=>814,5143=>1034,5144=>1028,5145=>1034,5146=>1028,5147=>814,5149=>278,5150=>476,5151=>382, +5152=>382,5153=>355,5154=>355,5155=>355,5156=>355,5157=>507,5158=>423,5159=>278,5160=>355,5161=>355, +5162=>355,5163=>1092,5164=>888,5165=>1094,5166=>1167,5167=>696,5168=>696,5169=>696,5170=>696,5171=>797, +5172=>797,5173=>797,5175=>797,5176=>797,5177=>797,5178=>916,5179=>908,5180=>916,5181=>908,5182=>916, +5183=>908,5184=>1034,5185=>1025,5186=>1034,5187=>1025,5188=>1034,5189=>1028,5190=>1034,5191=>1028,5192=>797, +5193=>518,5194=>206,5196=>730,5197=>730,5198=>730,5199=>730,5200=>734,5201=>734,5202=>734,5204=>734, +5205=>734,5206=>734,5207=>950,5208=>943,5209=>950,5210=>943,5211=>950,5212=>943,5213=>954,5214=>949, +5215=>954,5216=>949,5217=>954,5218=>946,5219=>954,5220=>946,5221=>954,5222=>435,5223=>904,5224=>904, +5225=>921,5226=>915,5227=>668,5228=>668,5229=>668,5230=>668,5231=>668,5232=>668,5233=>668,5234=>668, +5235=>668,5236=>926,5237=>877,5238=>882,5239=>877,5240=>882,5241=>877,5242=>926,5243=>877,5244=>926, +5245=>877,5246=>882,5247=>877,5248=>882,5249=>877,5250=>882,5251=>451,5252=>451,5253=>844,5254=>844, +5255=>844,5256=>844,5257=>668,5258=>668,5259=>668,5260=>668,5261=>668,5262=>668,5263=>668,5264=>668, +5265=>668,5266=>926,5267=>877,5268=>926,5269=>877,5270=>926,5271=>877,5272=>926,5273=>877,5274=>926, +5275=>877,5276=>926,5277=>877,5278=>926,5279=>877,5280=>926,5281=>451,5282=>451,5283=>563,5284=>563, +5285=>563,5286=>563,5287=>563,5288=>563,5289=>563,5290=>563,5291=>563,5292=>793,5293=>769,5294=>777, +5295=>786,5296=>777,5297=>786,5298=>793,5299=>786,5300=>793,5301=>786,5302=>777,5303=>786,5304=>777, +5305=>786,5306=>777,5307=>392,5308=>493,5309=>392,5312=>889,5313=>889,5314=>889,5315=>889,5316=>838, +5317=>838,5318=>838,5319=>838,5320=>838,5321=>1114,5322=>1122,5323=>1080,5324=>1105,5325=>1080,5326=>1105, +5327=>838,5328=>593,5329=>447,5330=>593,5331=>889,5332=>889,5333=>889,5334=>889,5335=>838,5336=>838, +5337=>838,5338=>838,5339=>838,5340=>1107,5341=>1122,5342=>1155,5343=>1105,5344=>1155,5345=>1105,5346=>1105, +5347=>1093,5348=>1105,5349=>1093,5350=>1155,5351=>1105,5352=>1155,5353=>1105,5354=>593,5356=>797,5357=>657, +5358=>657,5359=>657,5360=>657,5361=>657,5362=>657,5363=>657,5364=>657,5365=>657,5366=>897,5367=>862, +5368=>870,5369=>890,5370=>870,5371=>890,5372=>897,5373=>862,5374=>897,5375=>862,5376=>870,5377=>890, +5378=>870,5379=>890,5380=>870,5381=>443,5382=>414,5383=>443,5392=>831,5393=>831,5394=>831,5395=>1022, +5396=>1022,5397=>1022,5398=>1022,5399=>1088,5400=>1081,5401=>1088,5402=>1081,5403=>1088,5404=>1081,5405=>1288, +5406=>1278,5407=>1288,5408=>1278,5409=>1288,5410=>1278,5411=>1288,5412=>1278,5413=>671,5414=>698,5415=>698, +5416=>698,5417=>698,5418=>698,5419=>698,5420=>698,5421=>698,5422=>698,5423=>902,5424=>903,5425=>911, +5426=>896,5427=>911,5428=>896,5429=>902,5430=>903,5431=>902,5432=>903,5433=>911,5434=>896,5435=>911, +5436=>896,5437=>911,5438=>445,5440=>355,5441=>458,5442=>929,5443=>929,5444=>878,5445=>878,5446=>878, +5447=>878,5448=>659,5449=>659,5450=>659,5451=>659,5452=>659,5453=>659,5454=>902,5455=>863,5456=>445, +5458=>797,5459=>696,5460=>696,5461=>696,5462=>696,5463=>835,5464=>835,5465=>835,5466=>835,5467=>1055, +5468=>1028,5469=>542,5470=>730,5471=>730,5472=>730,5473=>730,5474=>730,5475=>730,5476=>734,5477=>734, +5478=>734,5479=>734,5480=>954,5481=>946,5482=>493,5492=>879,5493=>879,5494=>879,5495=>879,5496=>879, +5497=>879,5498=>879,5499=>556,5500=>753,5501=>458,5502=>1114,5503=>1114,5504=>1114,5505=>1114,5506=>1114, +5507=>1114,5508=>1114,5509=>890,5514=>879,5515=>879,5516=>879,5517=>879,5518=>1432,5519=>1432,5520=>1432, +5521=>1165,5522=>1165,5523=>1432,5524=>1432,5525=>763,5526=>1146,5536=>889,5537=>889,5538=>838,5539=>838, +5540=>838,5541=>838,5542=>593,5543=>698,5544=>698,5545=>698,5546=>698,5547=>698,5548=>698,5549=>698, +5550=>445,5551=>668,5598=>747,5601=>747,5702=>446,5703=>446,5742=>371,5743=>1114,5744=>1432,5745=>1814, +5746=>1814,5747=>1548,5748=>1510,5749=>1814,5750=>1814,5760=>489,5761=>573,5762=>851,5763=>1128,5764=>1406, +5765=>1684,5766=>564,5767=>842,5768=>1128,5769=>1403,5770=>1684,5771=>512,5772=>789,5773=>1068,5774=>1347, +5775=>1626,5776=>573,5777=>851,5778=>1116,5779=>1399,5780=>1684,5781=>512,5782=>512,5783=>709,5784=>1110, +5785=>1403,5786=>666,5787=>574,5788=>574,7424=>586,7425=>750,7426=>943,7427=>547,7428=>533,7429=>608, +7430=>608,7431=>502,7432=>501,7433=>308,7434=>444,7435=>598,7436=>485,7437=>735,7438=>630,7439=>618, +7440=>533,7441=>594,7442=>594,7443=>594,7444=>984,7446=>618,7447=>618,7448=>500,7449=>578,7450=>578, +7451=>521,7452=>571,7453=>663,7454=>853,7455=>625,7456=>586,7457=>831,7458=>523,7459=>581,7462=>485, +7463=>586,7464=>622,7465=>500,7466=>703,7467=>659,7468=>438,7469=>615,7470=>432,7472=>470,7473=>387, +7474=>387,7475=>465,7476=>474,7477=>211,7478=>211,7479=>439,7480=>361,7481=>563,7482=>474,7483=>474, +7484=>481,7485=>458,7486=>415,7487=>436,7488=>387,7489=>460,7490=>625,7491=>412,7492=>412,7493=>431, +7494=>641,7495=>431,7496=>431,7497=>431,7498=>431,7499=>347,7500=>347,7501=>431,7502=>197,7503=>438, +7504=>597,7505=>410,7506=>439,7507=>372,7508=>439,7509=>439,7510=>431,7511=>349,7512=>410,7513=>416, +7514=>597,7515=>451,7517=>405,7518=>386,7519=>389,7520=>443,7521=>365,7522=>197,7523=>284,7524=>410, +7525=>451,7526=>405,7527=>386,7528=>405,7529=>443,7530=>365,7543=>644,7544=>474,7547=>491,7557=>462, +7579=>431,7580=>372,7581=>372,7582=>439,7583=>347,7584=>339,7585=>313,7586=>431,7587=>410,7588=>312, +7589=>253,7590=>312,7591=>312,7592=>388,7593=>293,7594=>296,7595=>333,7596=>598,7597=>597,7598=>505, +7599=>505,7600=>403,7601=>439,7602=>488,7603=>379,7604=>356,7605=>349,7606=>524,7607=>444,7608=>359, +7609=>405,7610=>451,7611=>375,7612=>471,7613=>422,7614=>409,7615=>382,7620=>0,7621=>0,7622=>0, +7623=>0,7624=>0,7625=>0,7680=>696,7681=>607,7682=>686,7683=>644,7684=>686,7685=>644,7686=>686, +7687=>644,7688=>660,7689=>533,7690=>747,7691=>644,7692=>747,7693=>644,7694=>747,7695=>644,7696=>747, +7697=>644,7698=>747,7699=>644,7700=>615,7701=>610,7702=>615,7703=>610,7704=>615,7705=>610,7706=>615, +7707=>610,7708=>615,7709=>610,7710=>615,7711=>391,7712=>738,7713=>644,7714=>753,7715=>641,7716=>753, +7717=>641,7718=>753,7719=>641,7720=>753,7721=>641,7722=>753,7723=>641,7724=>334,7725=>308,7726=>334, +7727=>308,7728=>697,7729=>598,7730=>697,7731=>598,7732=>697,7733=>598,7734=>573,7735=>308,7736=>573, +7737=>308,7738=>573,7739=>308,7740=>573,7741=>308,7742=>896,7743=>938,7744=>896,7745=>938,7746=>896, +7747=>938,7748=>753,7749=>641,7750=>753,7751=>641,7752=>753,7753=>641,7754=>753,7755=>641,7756=>765, +7757=>618,7758=>765,7759=>618,7760=>765,7761=>618,7762=>765,7763=>618,7764=>659,7765=>644,7766=>659, +7767=>644,7768=>693,7769=>444,7770=>693,7771=>444,7772=>693,7773=>444,7774=>693,7775=>444,7776=>648, +7777=>536,7778=>648,7779=>536,7780=>648,7781=>536,7782=>648,7783=>536,7784=>648,7785=>536,7786=>614, +7787=>430,7788=>614,7789=>430,7790=>614,7791=>430,7792=>614,7793=>430,7794=>730,7795=>641,7796=>730, +7797=>641,7798=>730,7799=>641,7800=>730,7801=>641,7802=>730,7803=>641,7804=>696,7805=>586,7806=>696, +7807=>586,7808=>993,7809=>831,7810=>993,7811=>831,7812=>993,7813=>831,7814=>993,7815=>831,7816=>993, +7817=>831,7818=>694,7819=>580,7820=>694,7821=>580,7822=>651,7823=>586,7824=>652,7825=>523,7826=>652, +7827=>523,7828=>652,7829=>523,7830=>641,7831=>430,7832=>831,7833=>586,7834=>607,7835=>391,7838=>806, +7839=>618,7840=>696,7841=>607,7842=>696,7843=>607,7844=>696,7845=>607,7846=>696,7847=>607,7848=>696, +7849=>607,7850=>696,7851=>607,7852=>696,7853=>607,7854=>696,7855=>607,7856=>696,7857=>607,7858=>696, +7859=>607,7860=>696,7861=>607,7862=>696,7863=>607,7864=>615,7865=>610,7866=>615,7867=>610,7868=>615, +7869=>610,7870=>615,7871=>610,7872=>615,7873=>610,7874=>615,7875=>610,7876=>615,7877=>610,7878=>615, +7879=>610,7880=>334,7881=>308,7882=>334,7883=>308,7884=>765,7885=>618,7886=>765,7887=>618,7888=>765, +7889=>618,7890=>765,7891=>618,7892=>765,7893=>618,7894=>765,7895=>618,7896=>765,7897=>618,7898=>786, +7899=>618,7900=>786,7901=>618,7902=>786,7903=>618,7904=>786,7905=>618,7906=>786,7907=>618,7908=>730, +7909=>641,7910=>730,7911=>641,7912=>751,7913=>641,7914=>751,7915=>641,7916=>751,7917=>641,7918=>751, +7919=>641,7920=>751,7921=>641,7922=>651,7923=>586,7924=>651,7925=>586,7926=>651,7927=>586,7928=>651, +7929=>586,7936=>618,7937=>618,7938=>618,7939=>618,7940=>618,7941=>618,7942=>618,7943=>618,7944=>696, +7945=>696,7946=>937,7947=>939,7948=>841,7949=>866,7950=>751,7951=>773,7952=>501,7953=>501,7954=>501, +7955=>501,7956=>501,7957=>501,7960=>712,7961=>715,7962=>989,7963=>986,7964=>920,7965=>947,7968=>641, +7969=>641,7970=>641,7971=>641,7972=>641,7973=>641,7974=>641,7975=>641,7976=>851,7977=>856,7978=>1125, +7979=>1125,7980=>1062,7981=>1085,7982=>948,7983=>956,7984=>351,7985=>351,7986=>351,7987=>351,7988=>351, +7989=>351,7990=>351,7991=>351,7992=>435,7993=>440,7994=>699,7995=>707,7996=>641,7997=>664,7998=>544, +7999=>544,8000=>618,8001=>618,8002=>618,8003=>618,8004=>618,8005=>618,8008=>802,8009=>839,8010=>1099, +8011=>1101,8012=>947,8013=>974,8016=>607,8017=>607,8018=>607,8019=>607,8020=>607,8021=>607,8022=>607, +8023=>607,8025=>837,8027=>1065,8029=>1079,8031=>944,8032=>782,8033=>782,8034=>782,8035=>782,8036=>782, +8037=>782,8038=>782,8039=>782,8040=>817,8041=>862,8042=>1121,8043=>1126,8044=>968,8045=>994,8046=>925, +8047=>968,8048=>618,8049=>618,8050=>501,8051=>501,8052=>641,8053=>641,8054=>351,8055=>351,8056=>618, +8057=>618,8058=>607,8059=>607,8060=>782,8061=>782,8064=>618,8065=>618,8066=>618,8067=>618,8068=>618, +8069=>618,8070=>618,8071=>618,8072=>696,8073=>696,8074=>937,8075=>939,8076=>841,8077=>866,8078=>751, +8079=>773,8080=>641,8081=>641,8082=>641,8083=>641,8084=>641,8085=>641,8086=>641,8087=>641,8088=>851, +8089=>856,8090=>1125,8091=>1125,8092=>1062,8093=>1085,8094=>948,8095=>956,8096=>782,8097=>782,8098=>782, +8099=>782,8100=>782,8101=>782,8102=>782,8103=>782,8104=>817,8105=>862,8106=>1121,8107=>1126,8108=>968, +8109=>994,8110=>925,8111=>968,8112=>618,8113=>618,8114=>618,8115=>618,8116=>618,8118=>618,8119=>618, +8120=>696,8121=>696,8122=>789,8123=>717,8124=>696,8125=>450,8126=>450,8127=>450,8128=>450,8129=>450, +8130=>641,8131=>641,8132=>641,8134=>641,8135=>641,8136=>836,8137=>761,8138=>972,8139=>908,8140=>753, +8141=>450,8142=>450,8143=>450,8144=>351,8145=>351,8146=>351,8147=>351,8150=>351,8151=>351,8152=>334, +8153=>334,8154=>559,8155=>507,8157=>450,8158=>450,8159=>450,8160=>607,8161=>607,8162=>607,8163=>607, +8164=>644,8165=>644,8166=>607,8167=>607,8168=>651,8169=>651,8170=>918,8171=>882,8172=>754,8173=>450, +8174=>450,8175=>450,8178=>782,8179=>782,8180=>782,8182=>782,8183=>782,8184=>958,8185=>801,8186=>976, +8187=>804,8188=>765,8189=>450,8190=>450,8192=>450,8193=>900,8194=>450,8195=>900,8196=>296,8197=>225, +8198=>150,8199=>626,8200=>342,8201=>180,8202=>89,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0, +8208=>374,8209=>374,8210=>626,8213=>900,8214=>450,8215=>450,8219=>342,8223=>591,8227=>575,8228=>299, +8229=>600,8231=>313,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>180,8241=>1698,8242=>237, +8243=>402,8244=>567,8245=>237,8246=>402,8247=>567,8248=>659,8251=>875,8252=>564,8253=>522,8254=>450, +8255=>745,8256=>745,8257=>296,8258=>920,8259=>450,8260=>150,8261=>411,8262=>411,8263=>927,8264=>746, +8265=>746,8266=>461,8267=>572,8268=>450,8269=>450,8270=>470,8271=>360,8272=>745,8273=>470,8274=>500, +8275=>900,8276=>745,8277=>754,8278=>615,8279=>731,8280=>754,8281=>754,8282=>342,8283=>784,8284=>754, +8285=>342,8286=>342,8287=>200,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0, +8300=>0,8301=>0,8302=>0,8303=>0,8304=>394,8305=>197,8308=>394,8309=>394,8310=>394,8311=>394, +8312=>394,8313=>394,8314=>475,8315=>475,8316=>475,8317=>259,8318=>259,8319=>410,8320=>394,8321=>394, +8322=>394,8323=>394,8324=>394,8325=>394,8326=>394,8327=>394,8328=>394,8329=>394,8330=>475,8331=>475, +8332=>475,8333=>259,8334=>259,8336=>412,8337=>431,8338=>439,8339=>371,8340=>431,8352=>836,8353=>626, +8354=>626,8355=>626,8356=>626,8357=>938,8358=>753,8359=>1366,8360=>1084,8361=>993,8362=>813,8363=>626, +8365=>626,8366=>614,8367=>1252,8368=>626,8369=>626,8370=>626,8371=>626,8372=>773,8373=>626,8400=>0, +8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>1007,8449=>1053,8450=>660,8451=>1090, +8452=>806,8453=>982,8454=>1029,8455=>553,8456=>628,8457=>978,8459=>965,8460=>822,8461=>799,8462=>641, +8463=>641,8464=>537,8465=>627,8466=>771,8467=>424,8468=>876,8469=>753,8470=>1083,8471=>900,8472=>627, +8473=>675,8474=>765,8475=>844,8476=>732,8477=>721,8478=>807,8479=>639,8480=>917,8481=>1152,8483=>679, +8484=>679,8485=>520,8486=>765,8487=>765,8488=>686,8489=>304,8490=>697,8491=>696,8492=>835,8493=>736, +8494=>769,8495=>572,8496=>656,8497=>727,8498=>615,8499=>1065,8500=>418,8501=>714,8502=>658,8503=>444, +8504=>615,8505=>342,8506=>851,8507=>1213,8508=>710,8509=>663,8510=>589,8511=>776,8512=>756,8513=>697, +8514=>501,8515=>573,8516=>684,8517=>747,8518=>644,8519=>610,8520=>308,8521=>308,8523=>785,8526=>492, +8531=>932,8532=>932,8533=>932,8534=>932,8535=>932,8536=>932,8537=>932,8538=>932,8539=>932,8540=>932, +8541=>932,8542=>932,8543=>554,8544=>334,8545=>593,8546=>851,8547=>989,8548=>696,8549=>989,8550=>1247, +8551=>1505,8552=>1008,8553=>694,8554=>1008,8555=>1266,8556=>573,8557=>660,8558=>747,8559=>896,8560=>308, +8561=>546,8562=>785,8563=>885,8564=>586,8565=>866,8566=>1104,8567=>1342,8568=>872,8569=>580,8570=>872, +8571=>1110,8572=>308,8573=>533,8574=>644,8575=>938,8576=>1160,8577=>747,8578=>1160,8579=>660,8580=>533, +8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754,8598=>754,8599=>754,8600=>754,8601=>754, +8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754,8608=>754,8609=>754,8610=>754,8611=>754, +8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754,8618=>754,8619=>754,8620=>754,8621=>754, +8622=>754,8623=>754,8624=>754,8625=>754,8626=>754,8627=>754,8628=>754,8629=>754,8630=>754,8631=>754, +8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754,8638=>754,8639=>754,8640=>754,8641=>754, +8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754,8648=>754,8649=>754,8650=>754,8651=>754, +8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754,8658=>754,8659=>754,8660=>754,8661=>754, +8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754,8668=>754,8669=>754,8670=>754,8671=>754, +8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754,8678=>754,8679=>754,8680=>754,8681=>754, +8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754,8688=>754,8689=>754,8690=>754,8691=>754, +8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754,8698=>754,8699=>754,8700=>754,8701=>754, +8702=>754,8703=>754,8704=>696,8705=>626,8706=>489,8707=>615,8708=>615,8709=>771,8710=>627,8711=>627, +8712=>807,8713=>807,8714=>675,8715=>807,8716=>807,8717=>675,8718=>572,8719=>708,8720=>708,8721=>646, +8722=>754,8723=>754,8724=>626,8725=>329,8726=>626,8727=>754,8728=>563,8729=>342,8730=>600,8731=>600, +8732=>600,8733=>641,8734=>750,8735=>754,8736=>807,8737=>807,8738=>754,8739=>450,8740=>450,8741=>450, +8742=>450,8743=>730,8744=>730,8745=>730,8746=>730,8747=>549,8748=>835,8749=>1165,8750=>506,8751=>879, +8752=>1181,8753=>506,8754=>506,8755=>506,8756=>626,8757=>626,8758=>264,8759=>626,8760=>754,8761=>754, +8762=>754,8763=>754,8764=>754,8765=>754,8766=>754,8767=>754,8768=>337,8769=>754,8770=>754,8771=>754, +8772=>754,8773=>754,8774=>754,8775=>754,8776=>754,8777=>754,8778=>754,8779=>754,8780=>754,8781=>754, +8782=>754,8783=>754,8784=>754,8785=>754,8786=>754,8787=>754,8788=>956,8789=>956,8790=>754,8791=>754, +8792=>754,8793=>754,8794=>754,8795=>754,8796=>754,8797=>754,8798=>754,8799=>754,8800=>754,8801=>754, +8802=>754,8803=>754,8804=>754,8805=>754,8806=>754,8807=>754,8808=>756,8809=>756,8810=>942,8811=>942, +8812=>450,8813=>754,8814=>754,8815=>754,8816=>754,8817=>754,8818=>754,8819=>754,8820=>754,8821=>754, +8822=>754,8823=>754,8824=>754,8825=>754,8826=>754,8827=>754,8828=>754,8829=>754,8830=>754,8831=>754, +8832=>754,8833=>754,8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754,8840=>754,8841=>754, +8842=>754,8843=>754,8844=>730,8845=>730,8846=>730,8847=>754,8848=>754,8849=>754,8850=>754,8851=>716, +8852=>716,8853=>754,8854=>754,8855=>754,8856=>754,8857=>754,8858=>754,8859=>754,8860=>754,8861=>754, +8862=>754,8863=>754,8864=>754,8865=>754,8866=>822,8867=>822,8868=>822,8869=>822,8870=>488,8871=>488, +8872=>822,8873=>822,8874=>822,8875=>822,8876=>822,8877=>822,8878=>822,8879=>822,8880=>754,8881=>754, +8882=>754,8883=>754,8884=>754,8885=>754,8886=>900,8887=>900,8888=>754,8889=>754,8890=>488,8891=>730, +8892=>730,8893=>730,8894=>754,8895=>754,8896=>758,8897=>758,8898=>758,8899=>758,8900=>444,8901=>342, +8902=>563,8903=>754,8904=>900,8905=>900,8906=>900,8907=>900,8908=>900,8909=>754,8910=>730,8911=>730, +8912=>754,8913=>754,8914=>754,8915=>754,8916=>754,8917=>754,8918=>754,8919=>754,8920=>1280,8921=>1280, +8922=>754,8923=>754,8924=>754,8925=>754,8926=>754,8927=>754,8928=>754,8929=>754,8930=>754,8931=>754, +8932=>754,8933=>754,8934=>754,8935=>754,8936=>754,8937=>754,8938=>754,8939=>754,8940=>754,8941=>754, +8942=>900,8943=>900,8944=>900,8945=>900,8946=>1042,8947=>807,8948=>675,8949=>807,8950=>807,8951=>675, +8952=>807,8953=>807,8954=>1042,8955=>807,8956=>675,8957=>807,8958=>675,8959=>807,8960=>542,8961=>542, +8962=>644,8963=>754,8964=>754,8965=>754,8966=>754,8967=>439,8968=>411,8969=>411,8970=>411,8971=>411, +8972=>728,8973=>728,8974=>728,8975=>728,8976=>754,8977=>484,8984=>835,8985=>754,8988=>422,8989=>422, +8990=>422,8991=>422,8992=>549,8993=>549,8996=>1037,8997=>1037,8998=>1272,8999=>1037,9000=>1299,9003=>1272, +9004=>786,9075=>351,9076=>644,9077=>782,9082=>618,9085=>776,9095=>1037,9108=>786,9115=>450,9116=>450, +9117=>450,9118=>450,9119=>450,9120=>450,9121=>450,9122=>450,9123=>450,9124=>450,9125=>450,9126=>450, +9127=>675,9128=>675,9129=>675,9130=>675,9131=>675,9132=>675,9133=>675,9134=>549,9166=>754,9167=>850, +9187=>786,9189=>692,9250=>644,9251=>644,9312=>762,9313=>762,9314=>762,9315=>762,9316=>762,9317=>762, +9318=>762,9319=>762,9320=>762,9321=>762,9600=>692,9601=>692,9602=>692,9603=>692,9604=>692,9605=>692, +9606=>692,9607=>692,9608=>692,9609=>692,9610=>692,9611=>692,9612=>692,9613=>692,9614=>692,9615=>692, +9616=>692,9617=>692,9618=>692,9619=>692,9620=>692,9621=>692,9622=>692,9623=>692,9624=>692,9625=>692, +9626=>692,9627=>692,9628=>692,9629=>692,9630=>692,9631=>692,9632=>850,9633=>850,9634=>850,9635=>850, +9636=>850,9637=>850,9638=>850,9639=>850,9640=>850,9641=>850,9642=>610,9643=>610,9644=>850,9645=>850, +9646=>495,9647=>495,9648=>692,9649=>692,9650=>692,9651=>692,9652=>452,9653=>452,9654=>692,9655=>692, +9656=>452,9657=>452,9658=>692,9659=>692,9660=>692,9661=>692,9662=>452,9663=>452,9664=>692,9665=>692, +9666=>452,9667=>452,9668=>692,9669=>692,9670=>692,9671=>692,9672=>692,9673=>785,9674=>444,9675=>785, +9676=>785,9677=>785,9678=>785,9679=>785,9680=>785,9681=>785,9682=>785,9683=>785,9684=>785,9685=>785, +9686=>474,9687=>474,9688=>756,9689=>873,9690=>873,9691=>873,9692=>348,9693=>348,9694=>348,9695=>348, +9696=>692,9697=>692,9698=>692,9699=>692,9700=>692,9701=>692,9702=>575,9703=>850,9704=>850,9705=>850, +9706=>850,9707=>850,9708=>692,9709=>692,9710=>692,9711=>1007,9712=>850,9713=>850,9714=>850,9715=>850, +9716=>785,9717=>785,9718=>785,9719=>785,9720=>692,9721=>692,9722=>692,9723=>747,9724=>747,9725=>659, +9726=>659,9727=>692,9728=>807,9729=>900,9730=>807,9731=>807,9732=>807,9733=>807,9734=>807,9735=>515, +9736=>806,9737=>807,9738=>799,9739=>799,9740=>604,9741=>911,9742=>1121,9743=>1125,9744=>807,9745=>807, +9746=>807,9747=>479,9748=>807,9749=>807,9750=>807,9751=>807,9752=>807,9753=>807,9754=>807,9755=>807, +9756=>807,9757=>548,9758=>807,9759=>548,9760=>807,9761=>807,9762=>807,9763=>807,9764=>602,9765=>671, +9766=>584,9767=>705,9768=>490,9769=>807,9770=>807,9771=>807,9772=>639,9773=>807,9774=>807,9775=>807, +9776=>807,9777=>807,9778=>807,9779=>807,9780=>807,9781=>807,9782=>807,9783=>807,9784=>807,9785=>807, +9786=>807,9787=>807,9788=>807,9789=>807,9790=>807,9791=>552,9792=>658,9793=>658,9794=>807,9795=>807, +9796=>807,9797=>807,9798=>807,9799=>807,9800=>807,9801=>807,9802=>807,9803=>807,9804=>807,9805=>807, +9806=>807,9807=>807,9808=>807,9809=>807,9810=>807,9811=>807,9812=>807,9813=>807,9814=>807,9815=>807, +9816=>807,9817=>807,9818=>807,9819=>807,9820=>807,9821=>807,9822=>807,9823=>807,9824=>807,9825=>807, +9826=>807,9827=>807,9828=>807,9829=>807,9830=>807,9831=>807,9832=>807,9833=>424,9834=>574,9835=>807, +9836=>807,9837=>424,9838=>321,9839=>435,9840=>673,9841=>689,9842=>807,9843=>807,9844=>807,9845=>807, +9846=>807,9847=>807,9848=>807,9849=>807,9850=>807,9851=>807,9852=>807,9853=>807,9854=>807,9855=>807, +9856=>782,9857=>782,9858=>782,9859=>782,9860=>782,9861=>782,9862=>807,9863=>807,9864=>807,9865=>807, +9866=>807,9867=>807,9868=>807,9869=>807,9870=>807,9871=>807,9872=>807,9873=>807,9874=>807,9875=>807, +9876=>807,9877=>487,9878=>807,9879=>807,9880=>807,9881=>807,9882=>807,9883=>807,9884=>807,9888=>807, +9889=>632,9890=>903,9891=>977,9892=>1028,9893=>811,9894=>754,9895=>754,9896=>754,9897=>754,9898=>754, +9899=>754,9900=>754,9901=>754,9902=>754,9903=>754,9904=>759,9905=>754,9906=>658,9907=>659,9908=>659, +9909=>659,9910=>765,9911=>659,9912=>659,9985=>754,9986=>754,9987=>754,9988=>754,9990=>754,9991=>754, +9992=>754,9993=>754,9996=>754,9997=>754,9998=>754,9999=>754,10000=>754,10001=>754,10002=>754,10003=>754, +10004=>754,10005=>754,10006=>754,10007=>754,10008=>754,10009=>754,10010=>754,10011=>754,10012=>754,10013=>754, +10014=>754,10015=>754,10016=>754,10017=>754,10018=>754,10019=>754,10020=>754,10021=>754,10022=>754,10023=>754, +10025=>754,10026=>754,10027=>754,10028=>754,10029=>754,10030=>754,10031=>754,10032=>754,10033=>754,10034=>754, +10035=>754,10036=>754,10037=>754,10038=>754,10039=>754,10040=>754,10041=>754,10042=>754,10043=>754,10044=>754, +10045=>754,10046=>754,10047=>754,10048=>754,10049=>754,10050=>754,10051=>754,10052=>754,10053=>754,10054=>754, +10055=>754,10056=>754,10057=>754,10058=>754,10059=>754,10061=>807,10063=>807,10064=>807,10065=>807,10066=>807, +10070=>807,10072=>754,10073=>754,10074=>754,10075=>312,10076=>312,10077=>528,10078=>528,10081=>754,10082=>754, +10083=>754,10084=>754,10085=>754,10086=>754,10087=>754,10088=>754,10089=>754,10090=>754,10091=>754,10092=>754, +10093=>754,10094=>754,10095=>754,10096=>754,10097=>754,10098=>754,10099=>754,10100=>754,10101=>754,10102=>762, +10103=>762,10104=>762,10105=>762,10106=>762,10107=>762,10108=>762,10109=>762,10110=>762,10111=>762,10112=>754, +10113=>754,10114=>754,10115=>754,10116=>754,10117=>754,10118=>754,10119=>754,10120=>754,10121=>754,10122=>754, +10123=>754,10124=>754,10125=>754,10126=>754,10127=>754,10128=>754,10129=>754,10130=>754,10131=>754,10132=>754, +10136=>754,10137=>754,10138=>754,10139=>754,10140=>754,10141=>754,10142=>754,10143=>754,10144=>754,10145=>754, +10146=>754,10147=>754,10148=>754,10149=>754,10150=>754,10151=>754,10152=>754,10153=>754,10154=>754,10155=>754, +10156=>754,10157=>754,10158=>754,10159=>754,10161=>754,10162=>754,10163=>754,10164=>754,10165=>754,10166=>754, +10167=>754,10168=>754,10169=>754,10170=>754,10171=>754,10172=>754,10173=>754,10174=>754,10181=>411,10182=>411, +10208=>444,10214=>438,10215=>438,10216=>411,10217=>411,10218=>648,10219=>648,10224=>754,10225=>754,10226=>754, +10227=>754,10228=>1042,10229=>1290,10230=>1290,10231=>1290,10232=>1290,10233=>1290,10234=>1290,10235=>1290,10236=>1290, +10237=>1290,10238=>1290,10239=>1290,10240=>703,10241=>703,10242=>703,10243=>703,10244=>703,10245=>703,10246=>703, +10247=>703,10248=>703,10249=>703,10250=>703,10251=>703,10252=>703,10253=>703,10254=>703,10255=>703,10256=>703, +10257=>703,10258=>703,10259=>703,10260=>703,10261=>703,10262=>703,10263=>703,10264=>703,10265=>703,10266=>703, +10267=>703,10268=>703,10269=>703,10270=>703,10271=>703,10272=>703,10273=>703,10274=>703,10275=>703,10276=>703, +10277=>703,10278=>703,10279=>703,10280=>703,10281=>703,10282=>703,10283=>703,10284=>703,10285=>703,10286=>703, +10287=>703,10288=>703,10289=>703,10290=>703,10291=>703,10292=>703,10293=>703,10294=>703,10295=>703,10296=>703, +10297=>703,10298=>703,10299=>703,10300=>703,10301=>703,10302=>703,10303=>703,10304=>703,10305=>703,10306=>703, +10307=>703,10308=>703,10309=>703,10310=>703,10311=>703,10312=>703,10313=>703,10314=>703,10315=>703,10316=>703, +10317=>703,10318=>703,10319=>703,10320=>703,10321=>703,10322=>703,10323=>703,10324=>703,10325=>703,10326=>703, +10327=>703,10328=>703,10329=>703,10330=>703,10331=>703,10332=>703,10333=>703,10334=>703,10335=>703,10336=>703, +10337=>703,10338=>703,10339=>703,10340=>703,10341=>703,10342=>703,10343=>703,10344=>703,10345=>703,10346=>703, +10347=>703,10348=>703,10349=>703,10350=>703,10351=>703,10352=>703,10353=>703,10354=>703,10355=>703,10356=>703, +10357=>703,10358=>703,10359=>703,10360=>703,10361=>703,10362=>703,10363=>703,10364=>703,10365=>703,10366=>703, +10367=>703,10368=>703,10369=>703,10370=>703,10371=>703,10372=>703,10373=>703,10374=>703,10375=>703,10376=>703, +10377=>703,10378=>703,10379=>703,10380=>703,10381=>703,10382=>703,10383=>703,10384=>703,10385=>703,10386=>703, +10387=>703,10388=>703,10389=>703,10390=>703,10391=>703,10392=>703,10393=>703,10394=>703,10395=>703,10396=>703, +10397=>703,10398=>703,10399=>703,10400=>703,10401=>703,10402=>703,10403=>703,10404=>703,10405=>703,10406=>703, +10407=>703,10408=>703,10409=>703,10410=>703,10411=>703,10412=>703,10413=>703,10414=>703,10415=>703,10416=>703, +10417=>703,10418=>703,10419=>703,10420=>703,10421=>703,10422=>703,10423=>703,10424=>703,10425=>703,10426=>703, +10427=>703,10428=>703,10429=>703,10430=>703,10431=>703,10432=>703,10433=>703,10434=>703,10435=>703,10436=>703, +10437=>703,10438=>703,10439=>703,10440=>703,10441=>703,10442=>703,10443=>703,10444=>703,10445=>703,10446=>703, +10447=>703,10448=>703,10449=>703,10450=>703,10451=>703,10452=>703,10453=>703,10454=>703,10455=>703,10456=>703, +10457=>703,10458=>703,10459=>703,10460=>703,10461=>703,10462=>703,10463=>703,10464=>703,10465=>703,10466=>703, +10467=>703,10468=>703,10469=>703,10470=>703,10471=>703,10472=>703,10473=>703,10474=>703,10475=>703,10476=>703, +10477=>703,10478=>703,10479=>703,10480=>703,10481=>703,10482=>703,10483=>703,10484=>703,10485=>703,10486=>703, +10487=>703,10488=>703,10489=>703,10490=>703,10491=>703,10492=>703,10493=>703,10494=>703,10495=>703,10502=>754, +10503=>754,10506=>754,10507=>754,10560=>754,10561=>754,10627=>678,10628=>678,10702=>754,10703=>941,10704=>941, +10705=>900,10706=>900,10707=>900,10708=>900,10709=>900,10731=>444,10746=>754,10747=>754,10752=>900,10753=>900, +10754=>900,10764=>1495,10765=>506,10766=>506,10767=>506,10768=>506,10769=>506,10770=>506,10771=>506,10772=>506, +10773=>506,10774=>506,10775=>506,10776=>506,10777=>506,10778=>506,10779=>506,10780=>506,10799=>754,10877=>754, +10878=>754,10879=>754,10880=>754,10881=>754,10882=>754,10883=>754,10884=>754,10885=>754,10886=>754,10887=>754, +10888=>754,10889=>754,10890=>754,10891=>754,10892=>754,10893=>754,10894=>754,10895=>754,10896=>754,10897=>754, +10898=>754,10899=>754,10900=>754,10901=>754,10902=>754,10903=>754,10904=>754,10905=>754,10906=>754,10907=>754, +10908=>754,10909=>754,10910=>754,10911=>754,10912=>754,10926=>754,10927=>754,10928=>754,10929=>754,10930=>754, +10931=>754,10932=>754,10933=>754,10934=>754,10935=>754,10936=>754,10937=>754,10938=>754,11001=>754,11002=>754, +11008=>754,11009=>754,11010=>754,11011=>754,11012=>754,11013=>754,11014=>754,11015=>754,11016=>754,11017=>754, +11018=>754,11019=>754,11020=>754,11021=>754,11022=>754,11023=>754,11024=>754,11025=>754,11026=>850,11027=>850, +11028=>850,11029=>850,11030=>692,11031=>692,11032=>692,11033=>692,11034=>850,11039=>782,11040=>782,11041=>786, +11042=>786,11043=>786,11044=>1007,11091=>782,11092=>782,11360=>573,11361=>324,11362=>573,11363=>659,11364=>693, +11365=>607,11366=>430,11367=>860,11368=>641,11369=>697,11370=>598,11371=>652,11372=>523,11373=>774,11374=>896, +11375=>696,11377=>700,11378=>1099,11379=>950,11380=>586,11381=>628,11382=>508,11383=>704,11385=>484,11386=>618, +11387=>502,11388=>197,11389=>438,11568=>622,11569=>847,11570=>847,11571=>652,11572=>652,11573=>652,11574=>608, +11575=>696,11576=>696,11577=>615,11578=>615,11579=>721,11580=>890,11581=>685,11582=>561,11583=>685,11584=>847, +11585=>847,11586=>335,11587=>666,11588=>753,11589=>822,11590=>604,11591=>663,11592=>612,11593=>615,11594=>542, +11595=>935,11596=>700,11597=>753,11598=>615,11599=>334,11600=>700,11601=>335,11602=>652,11603=>622,11604=>847, +11605=>847,11606=>753,11607=>335,11608=>752,11609=>847,11610=>847,11611=>660,11612=>789,11613=>694,11614=>660, +11615=>615,11616=>696,11617=>753,11618=>615,11619=>765,11620=>627,11621=>765,11631=>644,11800=>522,11810=>411, +11811=>411,11812=>411,11813=>411,11822=>522,19904=>807,19905=>807,19906=>807,19907=>807,19908=>807,19909=>807, +19910=>807,19911=>807,19912=>807,19913=>807,19914=>807,19915=>807,19916=>807,19917=>807,19918=>807,19919=>807, +19920=>807,19921=>807,19922=>807,19923=>807,19924=>807,19925=>807,19926=>807,19927=>807,19928=>807,19929=>807, +19930=>807,19931=>807,19932=>807,19933=>807,19934=>807,19935=>807,19936=>807,19937=>807,19938=>807,19939=>807, +19940=>807,19941=>807,19942=>807,19943=>807,19944=>807,19945=>807,19946=>807,19947=>807,19948=>807,19949=>807, +19950=>807,19951=>807,19952=>807,19953=>807,19954=>807,19955=>807,19956=>807,19957=>807,19958=>807,19959=>807, +19960=>807,19961=>807,19962=>807,19963=>807,19964=>807,19965=>807,19966=>807,19967=>807,42564=>648,42565=>536, +42566=>392,42567=>396,42572=>1265,42573=>1055,42576=>1110,42577=>924,42580=>1056,42581=>875,42582=>983,42583=>862, +42594=>976,42595=>832,42596=>986,42597=>821,42598=>1134,42599=>897,42600=>765,42601=>618,42602=>933,42603=>781, +42604=>1266,42605=>995,42606=>865,42634=>867,42635=>708,42636=>614,42637=>521,42644=>727,42645=>641,42760=>450, +42761=>450,42762=>450,42763=>450,42764=>450,42765=>450,42766=>450,42767=>450,42768=>450,42769=>450,42770=>450, +42771=>450,42772=>450,42773=>450,42774=>450,42779=>360,42780=>360,42781=>258,42782=>258,42783=>258,42790=>753, +42791=>641,42792=>928,42793=>771,42794=>626,42795=>501,42800=>502,42801=>536,42802=>1214,42803=>946,42804=>1156, +42805=>958,42806=>1094,42807=>949,42808=>971,42809=>830,42810=>971,42811=>830,42812=>932,42813=>830,42814=>628, +42815=>494,42822=>765,42823=>488,42824=>614,42825=>478,42826=>826,42827=>732,42830=>1266,42831=>995,42880=>573, +42881=>308,42882=>753,42883=>641,42889=>360,42890=>347,42891=>410,42892=>275,43003=>615,43004=>659,43005=>896, +43006=>334,43007=>1192,63173=>618,64256=>729,64257=>667,64258=>667,64259=>1003,64260=>1004,64261=>727,64262=>917, +64275=>1249,64276=>1245,64277=>1240,64278=>1245,64279=>1542,64285=>308,64286=>0,64287=>597,64288=>647,64289=>867, +64290=>801,64291=>889,64292=>867,64293=>844,64294=>889,64295=>889,64296=>878,64297=>754,64298=>854,64299=>854, +64300=>854,64301=>854,64302=>676,64303=>676,64304=>676,64305=>605,64306=>483,64307=>589,64308=>641,64309=>394, +64310=>442,64312=>651,64313=>394,64314=>584,64315=>584,64316=>611,64318=>698,64320=>447,64321=>696,64323=>646, +64324=>618,64326=>676,64327=>656,64328=>584,64329=>854,64330=>676,64331=>308,64332=>605,64333=>584,64334=>618, +64335=>676,64338=>904,64339=>953,64340=>338,64341=>367,64342=>904,64343=>953,64344=>338,64345=>367,64346=>904, +64347=>953,64348=>338,64349=>367,64350=>904,64351=>953,64352=>338,64353=>367,64354=>904,64355=>953,64356=>338, +64357=>367,64358=>904,64359=>953,64360=>338,64361=>367,64362=>1045,64363=>1072,64364=>589,64365=>647,64366=>1045, +64367=>1072,64368=>589,64369=>647,64370=>648,64371=>648,64372=>648,64373=>648,64374=>648,64375=>648,64376=>648, +64377=>648,64378=>648,64379=>648,64380=>648,64381=>648,64382=>648,64383=>648,64384=>648,64385=>648,64394=>518, +64395=>560,64396=>518,64397=>560,64398=>921,64399=>921,64400=>523,64401=>523,64402=>921,64403=>921,64404=>523, +64405=>523,64414=>768,64415=>810,64473=>559,64474=>564,64488=>338,64489=>367,64508=>825,64509=>910,64510=>338, +64511=>367,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0, +65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0, +65059=>0,65136=>308,65137=>308,65138=>308,65139=>311,65140=>308,65142=>308,65143=>308,65144=>308,65145=>308, +65146=>308,65147=>308,65148=>308,65149=>308,65150=>308,65151=>308,65152=>460,65153=>308,65154=>338,65155=>308, +65156=>338,65157=>559,65158=>564,65159=>308,65160=>338,65161=>825,65162=>825,65163=>338,65164=>367,65165=>308, +65166=>338,65167=>904,65168=>953,65169=>338,65170=>367,65171=>531,65172=>545,65173=>904,65174=>953,65175=>338, +65176=>367,65177=>904,65178=>953,65179=>338,65180=>367,65181=>648,65182=>648,65183=>648,65184=>648,65185=>648, +65186=>648,65187=>648,65188=>648,65189=>648,65190=>648,65191=>648,65192=>648,65193=>461,65194=>520,65195=>461, +65196=>520,65197=>518,65198=>560,65199=>518,65200=>560,65201=>1242,65202=>1272,65203=>885,65204=>916,65205=>1242, +65206=>1272,65207=>885,65208=>916,65209=>1210,65210=>1228,65211=>870,65212=>887,65213=>1210,65214=>1228,65215=>870, +65216=>887,65217=>935,65218=>963,65219=>848,65220=>876,65221=>935,65222=>963,65223=>848,65224=>876,65225=>615, +65226=>615,65227=>615,65228=>508,65229=>615,65230=>615,65231=>615,65232=>508,65233=>1045,65234=>1072,65235=>589, +65236=>647,65237=>804,65238=>811,65239=>589,65240=>647,65241=>825,65242=>838,65243=>523,65244=>523,65245=>781, +65246=>803,65247=>338,65248=>367,65249=>659,65250=>706,65251=>557,65252=>603,65253=>768,65254=>810,65255=>338, +65256=>367,65257=>531,65258=>545,65259=>624,65260=>594,65261=>559,65262=>564,65263=>825,65264=>910,65265=>825, +65266=>910,65267=>338,65268=>367,65269=>670,65270=>683,65271=>670,65272=>683,65273=>670,65274=>683,65275=>670, +65276=>683,65279=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1002); +$enc=''; +$diff=''; +$file='dejavusanscondensedb.z'; +$ctg='dejavusanscondensedb.ctg.z'; +$originalsize=534464; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedb.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedb.z new file mode 100644 index 0000000..5d59661 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedb.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedbi.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedbi.ctg.z new file mode 100644 index 0000000..9d1fcd6 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedbi.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedbi.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedbi.php new file mode 100644 index 0000000..eb130ab --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedbi.php @@ -0,0 +1,458 @@ +<?php +$type='TrueTypeUnicode'; +$name='DejaVuSansCondensed-BoldOblique'; +$desc=array('Ascent'=>928,'Descent'=>-236,'CapHeight'=>-46,'Flags'=>96,'FontBBox'=>'[-960 -385 1804 1121]','ItalicAngle'=>-11,'StemV'=>120,'MissingWidth'=>540); +$up=-63; +$ut=44; +$dw=540; +$cw=array( +0=>540,32=>313,33=>410,34=>469,35=>626,36=>626,37=>901,38=>785,39=>275,40=>411, +41=>411,42=>470,43=>754,44=>342,45=>374,46=>342,47=>329,48=>626,49=>626,50=>626, +51=>626,52=>626,53=>626,54=>626,55=>626,56=>626,57=>626,58=>360,59=>360,60=>754, +61=>754,62=>754,63=>522,64=>900,65=>696,66=>686,67=>660,68=>747,69=>615,70=>615, +71=>738,72=>753,73=>334,74=>334,75=>697,76=>573,77=>896,78=>753,79=>765,80=>659, +81=>765,82=>693,83=>648,84=>614,85=>730,86=>696,87=>993,88=>694,89=>651,90=>652, +91=>411,92=>329,93=>411,94=>754,95=>450,96=>450,97=>607,98=>644,99=>533,100=>644, +101=>610,102=>391,103=>644,104=>641,105=>308,106=>308,107=>598,108=>308,109=>938,110=>641, +111=>618,112=>644,113=>644,114=>444,115=>536,116=>430,117=>641,118=>586,119=>831,120=>580, +121=>586,122=>523,123=>641,124=>329,125=>641,126=>754,8364=>626,8218=>342,402=>391,8222=>580, +8230=>900,8224=>450,8225=>450,710=>450,8240=>1309,352=>648,8249=>371,338=>1050,381=>652,8216=>342, +8217=>342,8220=>580,8221=>580,8226=>575,8211=>450,8212=>900,732=>450,8482=>900,353=>536,8250=>371, +339=>984,382=>523,376=>651,160=>313,161=>410,162=>626,163=>626,164=>572,165=>626,166=>329, +167=>450,168=>450,169=>900,170=>507,171=>584,172=>754,173=>374,174=>900,175=>450,176=>450, +177=>754,178=>394,179=>394,180=>450,181=>662,182=>572,183=>342,184=>450,185=>394,186=>507, +187=>584,188=>932,189=>932,190=>932,191=>522,192=>696,193=>696,194=>696,195=>696,196=>696, +197=>696,198=>976,199=>660,200=>615,201=>615,202=>615,203=>615,204=>334,205=>334,206=>334, +207=>334,208=>760,209=>753,210=>765,211=>765,212=>765,213=>765,214=>765,215=>754,216=>765, +217=>730,218=>730,219=>730,220=>730,221=>651,222=>668,223=>647,224=>607,225=>607,226=>607, +227=>607,228=>607,229=>607,230=>943,231=>533,232=>610,233=>610,234=>610,235=>610,236=>308, +237=>308,238=>308,239=>308,240=>618,241=>641,242=>618,243=>618,244=>618,245=>618,246=>618, +247=>754,248=>618,249=>641,250=>641,251=>641,252=>641,253=>586,254=>644,255=>586,256=>696, +257=>607,258=>696,259=>607,260=>696,261=>607,262=>660,263=>533,264=>660,265=>533,266=>660, +267=>533,268=>660,269=>533,270=>747,271=>644,272=>760,273=>644,274=>615,275=>610,276=>615, +277=>610,278=>615,279=>610,280=>615,281=>610,282=>615,283=>610,284=>738,285=>644,286=>738, +287=>644,288=>738,289=>644,290=>738,291=>644,292=>753,293=>641,294=>876,295=>711,296=>334, +297=>308,298=>334,299=>308,300=>334,301=>308,302=>334,303=>308,304=>334,305=>308,306=>669, +307=>617,308=>334,309=>308,310=>697,311=>598,312=>598,313=>573,314=>308,315=>573,316=>308, +317=>573,318=>308,319=>573,320=>308,321=>594,322=>337,323=>753,324=>641,325=>753,326=>641, +327=>753,328=>641,329=>884,330=>753,331=>641,332=>765,333=>618,334=>765,335=>618,336=>765, +337=>618,340=>693,341=>444,342=>693,343=>444,344=>693,345=>444,346=>648,347=>536,348=>648, +349=>536,350=>648,351=>536,354=>614,355=>430,356=>614,357=>430,358=>614,359=>430,360=>730, +361=>641,362=>730,363=>641,364=>730,365=>641,366=>730,367=>641,368=>730,369=>641,370=>730, +371=>641,372=>993,373=>831,374=>651,375=>586,377=>652,378=>523,379=>652,380=>523,383=>391, +384=>644,385=>729,386=>686,387=>644,388=>686,389=>644,390=>660,391=>660,392=>533,393=>760, +394=>791,395=>686,396=>644,397=>618,398=>615,399=>765,400=>626,401=>615,403=>738,404=>713, +405=>940,406=>392,407=>350,408=>697,409=>598,410=>324,411=>532,412=>938,413=>753,414=>641, +415=>765,416=>765,417=>618,418=>1002,419=>866,420=>703,421=>644,422=>693,423=>648,424=>536, +425=>615,426=>497,427=>430,428=>636,429=>430,430=>614,431=>730,432=>641,433=>692,434=>732, +435=>717,436=>700,437=>652,438=>523,439=>695,440=>695,441=>576,442=>523,443=>626,444=>695, +445=>576,446=>515,447=>644,448=>334,449=>593,450=>489,451=>334,452=>1393,453=>1305,454=>1176, +455=>879,456=>881,457=>603,458=>1074,459=>1091,460=>957,461=>696,462=>607,463=>334,464=>308, +465=>765,466=>618,467=>730,468=>641,469=>730,470=>641,471=>730,472=>641,473=>730,474=>641, +475=>730,476=>641,477=>610,478=>696,479=>607,480=>696,481=>607,482=>976,483=>943,484=>738, +485=>644,486=>738,487=>644,488=>697,489=>598,490=>765,491=>618,492=>765,493=>618,494=>695, +495=>523,496=>308,497=>1393,498=>1305,499=>1176,500=>738,501=>644,502=>1160,503=>708,504=>753, +505=>641,506=>696,507=>607,508=>976,509=>943,510=>765,511=>618,512=>696,513=>607,514=>696, +515=>607,516=>615,517=>610,518=>615,519=>610,520=>334,521=>308,522=>334,523=>308,524=>765, +525=>618,526=>765,527=>618,528=>693,529=>444,530=>693,531=>444,532=>730,533=>641,534=>730, +535=>641,536=>648,537=>536,538=>614,539=>430,540=>621,541=>546,542=>753,543=>641,544=>753, +545=>778,546=>728,547=>593,548=>652,549=>523,550=>696,551=>607,552=>615,553=>610,554=>765, +555=>618,556=>765,557=>618,558=>765,559=>618,560=>765,561=>618,562=>651,563=>586,564=>442, +565=>780,566=>460,567=>308,568=>979,569=>979,570=>696,571=>660,572=>533,573=>573,574=>614, +575=>536,576=>523,577=>703,578=>553,579=>686,580=>730,581=>696,582=>615,583=>610,584=>334, +585=>308,586=>774,587=>712,588=>693,589=>444,590=>651,591=>586,592=>607,593=>644,594=>644, +595=>644,596=>533,597=>533,598=>712,599=>712,600=>610,601=>610,602=>788,603=>501,604=>490, +605=>696,606=>658,607=>308,608=>712,609=>644,610=>564,611=>661,612=>571,613=>641,614=>641, +615=>641,616=>491,617=>396,618=>491,619=>502,620=>624,621=>308,622=>757,623=>938,624=>938, +625=>938,626=>641,627=>713,628=>578,629=>618,630=>817,631=>613,632=>716,633=>484,634=>484, +635=>584,636=>444,637=>444,638=>536,639=>536,640=>578,641=>578,642=>536,643=>374,644=>391, +645=>544,646=>497,647=>430,648=>430,649=>828,650=>692,651=>603,652=>586,653=>831,654=>586, +655=>651,656=>624,657=>615,658=>576,659=>576,660=>515,661=>515,662=>515,663=>515,664=>765, +665=>569,666=>658,667=>616,668=>622,669=>308,670=>659,671=>485,672=>712,673=>515,674=>515, +675=>1040,676=>1093,677=>1039,678=>876,679=>691,680=>836,681=>923,682=>712,683=>702,684=>532, +685=>374,686=>609,687=>710,688=>410,689=>410,690=>197,691=>284,692=>284,693=>284,694=>369, +695=>532,696=>375,697=>271,698=>469,699=>342,700=>342,701=>342,702=>330,703=>330,704=>293, +705=>293,706=>450,707=>450,708=>450,709=>450,711=>450,712=>275,713=>450,714=>450,715=>450, +716=>275,717=>450,718=>450,719=>450,720=>303,721=>303,722=>330,723=>330,724=>450,725=>450, +726=>374,727=>295,728=>450,729=>450,730=>450,731=>450,733=>450,734=>315,735=>450,736=>370, +737=>197,738=>343,739=>371,740=>293,741=>450,742=>450,743=>450,744=>450,745=>450,748=>450, +749=>450,750=>580,755=>450,759=>450,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0, +774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0, +784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0, +794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0, +804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0, +814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0, +824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0, +834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0, +844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0, +860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>628,881=>508,882=>919, +883=>752,884=>271,885=>271,886=>753,887=>630,890=>450,891=>533,892=>495,893=>494,894=>360, +900=>397,901=>450,902=>717,903=>342,904=>761,905=>908,906=>507,908=>801,910=>882,911=>804, +912=>351,913=>696,914=>686,915=>573,916=>696,917=>615,918=>652,919=>753,920=>765,921=>334, +922=>697,923=>696,924=>896,925=>753,926=>568,927=>765,928=>753,929=>659,931=>615,932=>614, +933=>651,934=>765,935=>694,936=>765,937=>765,938=>334,939=>651,940=>618,941=>501,942=>641, +943=>351,944=>607,945=>618,946=>644,947=>613,948=>618,949=>501,950=>532,951=>641,952=>618, +953=>351,954=>639,955=>569,956=>662,957=>613,958=>532,959=>618,960=>712,961=>644,962=>533, +963=>701,964=>574,965=>607,966=>704,967=>580,968=>714,969=>782,970=>351,971=>607,972=>618, +973=>607,974=>782,975=>697,976=>585,977=>594,978=>671,979=>883,980=>671,981=>716,982=>782, +983=>669,984=>765,985=>618,986=>660,987=>533,988=>615,989=>444,990=>632,991=>593,992=>827, +993=>564,994=>983,995=>753,996=>749,997=>644,998=>835,999=>669,1000=>660,1001=>585,1002=>709, +1003=>604,1004=>677,1005=>644,1006=>614,1007=>531,1008=>669,1009=>644,1010=>533,1011=>308,1012=>765, +1013=>580,1014=>580,1015=>668,1016=>644,1017=>660,1018=>896,1019=>659,1020=>644,1021=>660,1022=>660, +1023=>628,1024=>615,1025=>615,1026=>791,1027=>573,1028=>660,1029=>648,1030=>334,1031=>334,1032=>334, +1033=>1039,1034=>1017,1035=>791,1036=>735,1037=>753,1038=>694,1039=>753,1040=>696,1041=>686,1042=>686, +1043=>573,1044=>801,1045=>615,1046=>1102,1047=>639,1048=>753,1049=>753,1050=>735,1051=>747,1052=>896, +1053=>753,1054=>765,1055=>753,1056=>659,1057=>660,1058=>614,1059=>694,1060=>892,1061=>694,1062=>835, +1063=>727,1064=>1112,1065=>1193,1066=>845,1067=>932,1068=>686,1069=>660,1070=>1056,1071=>693,1072=>607, +1073=>628,1074=>569,1075=>470,1076=>727,1077=>610,1078=>896,1079=>523,1080=>630,1081=>630,1082=>611, +1083=>659,1084=>735,1085=>622,1086=>618,1087=>622,1088=>644,1089=>533,1090=>521,1091=>586,1092=>893, +1093=>580,1094=>667,1095=>618,1096=>956,1097=>995,1098=>676,1099=>813,1100=>569,1101=>533,1102=>875, +1103=>578,1104=>610,1105=>610,1106=>642,1107=>470,1108=>533,1109=>536,1110=>308,1111=>308,1112=>308, +1113=>892,1114=>860,1115=>661,1116=>611,1117=>630,1118=>586,1119=>622,1120=>983,1121=>782,1122=>756, +1123=>662,1124=>911,1125=>755,1126=>893,1127=>749,1128=>1222,1129=>1009,1130=>765,1131=>618,1132=>1112, +1133=>906,1134=>626,1135=>501,1136=>967,1137=>955,1138=>765,1139=>618,1140=>765,1141=>625,1142=>765, +1143=>625,1144=>1033,1145=>939,1146=>967,1147=>776,1148=>1265,1149=>1055,1150=>983,1151=>782,1152=>660, +1153=>533,1154=>587,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>376,1161=>376,1162=>844, +1163=>725,1164=>686,1165=>550,1166=>662,1167=>646,1168=>573,1169=>470,1170=>599,1171=>488,1172=>709, +1173=>470,1174=>1102,1175=>896,1176=>639,1177=>523,1178=>697,1179=>611,1180=>735,1181=>611,1182=>735, +1183=>611,1184=>914,1185=>743,1186=>753,1187=>622,1188=>992,1189=>783,1190=>1129,1191=>880,1192=>851, +1193=>773,1194=>660,1195=>533,1196=>614,1197=>521,1198=>651,1199=>586,1200=>651,1201=>586,1202=>694, +1203=>580,1204=>993,1205=>901,1206=>727,1207=>618,1208=>727,1209=>618,1210=>727,1211=>641,1212=>923, +1213=>729,1214=>923,1215=>729,1216=>334,1217=>1102,1218=>896,1219=>700,1220=>566,1221=>839,1222=>724, +1223=>753,1224=>622,1225=>844,1226=>725,1227=>727,1228=>618,1229=>986,1230=>838,1231=>308,1232=>696, +1233=>607,1234=>696,1235=>607,1236=>976,1237=>943,1238=>615,1239=>610,1240=>765,1241=>610,1242=>765, +1243=>610,1244=>1102,1245=>896,1246=>639,1247=>523,1248=>695,1249=>576,1250=>753,1251=>630,1252=>753, +1253=>630,1254=>765,1255=>618,1256=>765,1257=>618,1258=>765,1259=>618,1260=>660,1261=>533,1262=>694, +1263=>586,1264=>694,1265=>586,1266=>694,1267=>586,1268=>727,1269=>618,1270=>573,1271=>470,1272=>932, +1273=>813,1274=>599,1275=>488,1276=>694,1277=>580,1278=>694,1279=>580,1280=>686,1281=>547,1282=>1043, +1283=>804,1284=>1007,1285=>828,1286=>745,1287=>624,1288=>1117,1289=>915,1290=>1160,1291=>912,1292=>755, +1293=>574,1294=>844,1295=>722,1296=>626,1297=>501,1298=>747,1299=>659,1300=>1157,1301=>963,1302=>958, +1303=>883,1304=>973,1305=>864,1306=>765,1307=>644,1308=>993,1309=>831,1312=>1123,1313=>920,1314=>1128, +1315=>880,1316=>861,1317=>726,1329=>886,1330=>730,1331=>886,1332=>886,1333=>730,1334=>699,1335=>730, +1336=>730,1337=>877,1338=>886,1339=>730,1340=>639,1341=>970,1342=>1022,1343=>730,1344=>639,1345=>681, +1346=>886,1347=>789,1348=>886,1349=>714,1350=>886,1351=>730,1352=>730,1353=>730,1354=>862,1355=>699, +1356=>886,1357=>730,1358=>886,1359=>648,1360=>730,1361=>714,1362=>805,1363=>765,1364=>842,1365=>765, +1366=>648,1369=>330,1370=>342,1371=>495,1372=>495,1373=>342,1374=>491,1375=>468,1377=>938,1378=>641, +1379=>779,1380=>781,1381=>641,1382=>735,1383=>588,1384=>641,1385=>729,1386=>735,1387=>641,1388=>448, +1389=>916,1390=>644,1391=>641,1392=>641,1393=>644,1394=>737,1395=>641,1396=>676,1397=>308,1398=>794, +1399=>502,1400=>641,1401=>502,1402=>938,1403=>502,1404=>777,1405=>641,1406=>732,1407=>938,1408=>641, +1409=>644,1410=>514,1411=>938,1412=>700,1413=>618,1414=>648,1415=>776,1417=>360,1418=>438,1456=>0, +1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0, +1467=>0,1468=>0,1469=>0,1470=>374,1471=>0,1472=>334,1473=>0,1474=>0,1475=>334,1478=>447, +1479=>0,1488=>676,1489=>605,1490=>483,1491=>589,1492=>641,1493=>308,1494=>442,1495=>641,1496=>651, +1497=>308,1498=>584,1499=>584,1500=>611,1501=>641,1502=>698,1503=>308,1504=>447,1505=>696,1506=>610, +1507=>646,1508=>618,1509=>565,1510=>676,1511=>656,1512=>584,1513=>854,1514=>676,1520=>598,1521=>598, +1522=>597,1523=>399,1524=>639,3647=>668,3713=>734,3714=>673,3716=>674,3719=>512,3720=>668,3722=>669, +3725=>685,3732=>635,3733=>633,3734=>672,3735=>737,3737=>657,3738=>654,3739=>654,3740=>830,3741=>744, +3742=>779,3743=>779,3745=>752,3746=>685,3747=>692,3749=>691,3751=>642,3754=>744,3755=>928,3757=>651, +3758=>705,3759=>840,3760=>620,3761=>0,3762=>549,3763=>549,3764=>0,3765=>0,3766=>0,3767=>0, +3768=>0,3769=>0,3771=>0,3772=>0,3773=>603,3776=>464,3777=>774,3778=>464,3779=>584,3780=>569, +3782=>683,3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>694,3793=>694,3794=>624, +3795=>752,3796=>655,3797=>655,3798=>764,3799=>710,3800=>683,3801=>818,3804=>1227,3805=>1227,4256=>826, +4257=>669,4258=>665,4259=>753,4260=>584,4261=>696,4262=>771,4263=>800,4264=>477,4265=>570,4266=>771, +4267=>810,4268=>579,4269=>813,4270=>732,4271=>677,4272=>782,4273=>579,4274=>579,4275=>797,4276=>797, +4277=>660,4278=>587,4279=>579,4280=>582,4281=>579,4282=>710,4283=>812,4284=>570,4285=>557,4286=>579, +4287=>700,4288=>802,4289=>541,4290=>668,4291=>554,4292=>570,4293=>668,4304=>497,4305=>497,4306=>536, +4307=>734,4308=>505,4309=>506,4310=>497,4311=>744,4312=>497,4313=>488,4314=>967,4315=>506,4316=>507, +4317=>730,4318=>497,4319=>532,4320=>740,4321=>506,4322=>621,4323=>525,4324=>732,4325=>505,4326=>731, +4327=>506,4328=>506,4329=>507,4330=>568,4331=>506,4332=>506,4333=>497,4334=>506,4335=>506,4336=>501, +4337=>543,4338=>497,4339=>497,4340=>497,4341=>544,4342=>767,4343=>571,4344=>506,4345=>536,4346=>487, +4347=>615,4348=>331,5121=>696,5122=>696,5123=>696,5124=>696,5125=>814,5126=>814,5127=>814,5129=>814, +5130=>814,5131=>814,5132=>916,5133=>908,5134=>916,5135=>908,5136=>916,5137=>908,5138=>1034,5139=>1025, +5140=>1034,5141=>1025,5142=>814,5143=>1034,5144=>1028,5145=>1034,5146=>1028,5147=>814,5149=>278,5150=>476, +5151=>382,5152=>382,5153=>355,5154=>355,5155=>355,5156=>355,5157=>507,5158=>423,5159=>278,5160=>355, +5161=>355,5162=>355,5163=>1092,5164=>888,5165=>1094,5166=>1167,5167=>696,5168=>696,5169=>696,5170=>696, +5171=>797,5172=>797,5173=>797,5175=>797,5176=>797,5177=>797,5178=>916,5179=>908,5180=>916,5181=>908, +5182=>916,5183=>908,5184=>1034,5185=>1025,5186=>1034,5187=>1025,5188=>1034,5189=>1028,5190=>1034,5191=>1028, +5192=>797,5193=>518,5194=>206,5196=>730,5197=>730,5198=>730,5199=>730,5200=>734,5201=>734,5202=>734, +5204=>734,5205=>734,5206=>734,5207=>950,5208=>943,5209=>950,5210=>943,5211=>950,5212=>943,5213=>954, +5214=>949,5215=>954,5216=>949,5217=>954,5218=>946,5219=>954,5220=>946,5221=>954,5222=>435,5223=>904, +5224=>904,5225=>921,5226=>915,5227=>668,5228=>668,5229=>668,5230=>668,5231=>668,5232=>668,5233=>668, +5234=>668,5235=>668,5236=>926,5237=>877,5238=>882,5239=>877,5240=>882,5241=>877,5242=>926,5243=>877, +5244=>926,5245=>877,5246=>882,5247=>877,5248=>882,5249=>877,5250=>882,5251=>451,5252=>451,5253=>844, +5254=>844,5255=>844,5256=>844,5257=>668,5258=>668,5259=>668,5260=>668,5261=>668,5262=>668,5263=>668, +5264=>668,5265=>668,5266=>926,5267=>877,5268=>926,5269=>877,5270=>926,5271=>877,5272=>926,5273=>877, +5274=>926,5275=>877,5276=>926,5277=>877,5278=>926,5279=>877,5280=>926,5281=>451,5282=>451,5283=>563, +5284=>563,5285=>563,5286=>563,5287=>563,5288=>563,5289=>563,5290=>563,5291=>563,5292=>793,5293=>769, +5294=>777,5295=>786,5296=>777,5297=>786,5298=>793,5299=>786,5300=>793,5301=>786,5302=>777,5303=>786, +5304=>777,5305=>786,5306=>777,5307=>392,5308=>493,5309=>392,5312=>889,5313=>889,5314=>889,5315=>889, +5316=>838,5317=>838,5318=>838,5319=>838,5320=>838,5321=>1114,5322=>1122,5323=>1080,5324=>1105,5325=>1080, +5326=>1105,5327=>838,5328=>593,5329=>447,5330=>593,5331=>889,5332=>889,5333=>889,5334=>889,5335=>838, +5336=>838,5337=>838,5338=>838,5339=>838,5340=>1107,5341=>1122,5342=>1155,5343=>1105,5344=>1155,5345=>1105, +5346=>1105,5347=>1093,5348=>1105,5349=>1093,5350=>1155,5351=>1105,5352=>1155,5353=>1105,5354=>593,5356=>797, +5357=>657,5358=>657,5359=>657,5360=>657,5361=>657,5362=>657,5363=>657,5364=>657,5365=>657,5366=>897, +5367=>862,5368=>870,5369=>890,5370=>870,5371=>890,5372=>897,5373=>862,5374=>897,5375=>862,5376=>870, +5377=>890,5378=>870,5379=>890,5380=>870,5381=>443,5382=>414,5383=>443,5392=>831,5393=>831,5394=>831, +5395=>1022,5396=>1022,5397=>1022,5398=>1022,5399=>1088,5400=>1081,5401=>1088,5402=>1081,5403=>1088,5404=>1081, +5405=>1288,5406=>1278,5407=>1288,5408=>1278,5409=>1288,5410=>1278,5411=>1288,5412=>1278,5413=>671,5414=>698, +5415=>698,5416=>698,5417=>698,5418=>698,5419=>698,5420=>698,5421=>698,5422=>698,5423=>902,5424=>903, +5425=>911,5426=>896,5427=>911,5428=>896,5429=>902,5430=>903,5431=>902,5432=>903,5433=>911,5434=>896, +5435=>911,5436=>896,5437=>911,5438=>445,5440=>355,5441=>458,5442=>929,5443=>929,5444=>878,5445=>878, +5446=>878,5447=>878,5448=>659,5449=>659,5450=>659,5451=>659,5452=>659,5453=>659,5454=>902,5455=>863, +5456=>445,5458=>797,5459=>696,5460=>696,5461=>696,5462=>696,5463=>835,5464=>835,5465=>835,5466=>835, +5467=>1055,5468=>1028,5469=>542,5470=>730,5471=>730,5472=>730,5473=>730,5474=>730,5475=>730,5476=>734, +5477=>734,5478=>734,5479=>734,5480=>954,5481=>946,5482=>493,5492=>879,5493=>879,5494=>879,5495=>879, +5496=>879,5497=>879,5498=>879,5499=>556,5500=>753,5501=>458,5502=>1114,5503=>1114,5504=>1114,5505=>1114, +5506=>1114,5507=>1114,5508=>1114,5509=>890,5514=>879,5515=>879,5516=>879,5517=>879,5518=>1432,5519=>1432, +5520=>1432,5521=>1165,5522=>1165,5523=>1432,5524=>1432,5525=>763,5526=>1146,5536=>889,5537=>889,5538=>838, +5539=>838,5540=>838,5541=>838,5542=>593,5543=>698,5544=>698,5545=>698,5546=>698,5547=>698,5548=>698, +5549=>698,5550=>445,5551=>668,5598=>747,5601=>747,5702=>446,5703=>446,5742=>371,5743=>1114,5744=>1432, +5745=>1814,5746=>1814,5747=>1548,5748=>1510,5749=>1814,5750=>1814,7424=>586,7425=>750,7426=>943,7427=>547, +7428=>533,7429=>608,7430=>608,7431=>502,7432=>501,7433=>308,7434=>444,7435=>598,7436=>485,7437=>735, +7438=>630,7439=>618,7440=>533,7441=>594,7442=>594,7443=>594,7444=>984,7446=>618,7447=>618,7448=>500, +7449=>578,7450=>578,7451=>521,7452=>571,7453=>663,7454=>853,7455=>625,7456=>586,7457=>831,7458=>523, +7459=>581,7462=>485,7463=>586,7464=>622,7465=>500,7466=>703,7467=>659,7468=>438,7469=>615,7470=>432, +7472=>470,7473=>387,7474=>387,7475=>465,7476=>474,7477=>211,7478=>211,7479=>439,7480=>361,7481=>563, +7482=>474,7483=>474,7484=>481,7485=>458,7486=>415,7487=>436,7488=>387,7489=>460,7490=>625,7491=>412, +7492=>412,7493=>431,7494=>641,7495=>431,7496=>431,7497=>431,7498=>431,7499=>347,7500=>347,7501=>431, +7502=>197,7503=>438,7504=>597,7505=>410,7506=>439,7507=>372,7508=>439,7509=>439,7510=>431,7511=>349, +7512=>410,7513=>416,7514=>597,7515=>451,7517=>405,7518=>386,7519=>389,7520=>443,7521=>365,7522=>197, +7523=>284,7524=>410,7525=>451,7526=>405,7527=>386,7528=>405,7529=>443,7530=>365,7543=>644,7544=>474, +7547=>491,7557=>462,7579=>431,7580=>372,7581=>372,7582=>439,7583=>347,7584=>339,7585=>313,7586=>431, +7587=>410,7588=>312,7589=>253,7590=>312,7591=>312,7592=>388,7593=>293,7594=>296,7595=>333,7596=>598, +7597=>597,7598=>505,7599=>505,7600=>403,7601=>439,7602=>488,7603=>379,7604=>356,7605=>349,7606=>524, +7607=>444,7608=>359,7609=>405,7610=>451,7611=>375,7612=>471,7613=>422,7614=>409,7615=>382,7620=>0, +7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>696,7681=>607,7682=>686,7683=>644,7684=>686, +7685=>644,7686=>686,7687=>644,7688=>660,7689=>533,7690=>747,7691=>644,7692=>747,7693=>644,7694=>747, +7695=>644,7696=>747,7697=>644,7698=>747,7699=>644,7700=>615,7701=>610,7702=>615,7703=>610,7704=>615, +7705=>610,7706=>615,7707=>610,7708=>615,7709=>610,7710=>615,7711=>391,7712=>738,7713=>644,7714=>753, +7715=>641,7716=>753,7717=>641,7718=>753,7719=>641,7720=>753,7721=>641,7722=>753,7723=>641,7724=>334, +7725=>308,7726=>334,7727=>308,7728=>697,7729=>598,7730=>697,7731=>598,7732=>697,7733=>598,7734=>573, +7735=>308,7736=>573,7737=>308,7738=>573,7739=>308,7740=>573,7741=>308,7742=>896,7743=>938,7744=>896, +7745=>938,7746=>896,7747=>938,7748=>753,7749=>641,7750=>753,7751=>641,7752=>753,7753=>641,7754=>753, +7755=>641,7756=>765,7757=>618,7758=>765,7759=>618,7760=>765,7761=>618,7762=>765,7763=>618,7764=>659, +7765=>644,7766=>659,7767=>644,7768=>693,7769=>444,7770=>693,7771=>444,7772=>693,7773=>444,7774=>693, +7775=>444,7776=>648,7777=>536,7778=>648,7779=>536,7780=>648,7781=>536,7782=>648,7783=>536,7784=>648, +7785=>536,7786=>614,7787=>430,7788=>614,7789=>430,7790=>614,7791=>430,7792=>614,7793=>430,7794=>730, +7795=>641,7796=>730,7797=>641,7798=>730,7799=>641,7800=>730,7801=>641,7802=>730,7803=>641,7804=>696, +7805=>586,7806=>696,7807=>586,7808=>993,7809=>831,7810=>993,7811=>831,7812=>993,7813=>831,7814=>993, +7815=>831,7816=>993,7817=>831,7818=>694,7819=>580,7820=>694,7821=>580,7822=>651,7823=>586,7824=>652, +7825=>523,7826=>652,7827=>523,7828=>652,7829=>523,7830=>641,7831=>430,7832=>831,7833=>586,7834=>607, +7835=>391,7838=>806,7839=>618,7840=>696,7841=>607,7842=>696,7843=>607,7844=>696,7845=>607,7846=>696, +7847=>607,7848=>696,7849=>607,7850=>696,7851=>607,7852=>696,7853=>607,7854=>696,7855=>607,7856=>696, +7857=>607,7858=>696,7859=>607,7860=>696,7861=>607,7862=>696,7863=>607,7864=>615,7865=>610,7866=>615, +7867=>610,7868=>615,7869=>610,7870=>615,7871=>610,7872=>615,7873=>610,7874=>615,7875=>610,7876=>615, +7877=>610,7878=>615,7879=>610,7880=>334,7881=>308,7882=>334,7883=>308,7884=>765,7885=>618,7886=>765, +7887=>618,7888=>765,7889=>618,7890=>765,7891=>618,7892=>765,7893=>618,7894=>765,7895=>618,7896=>765, +7897=>618,7898=>765,7899=>618,7900=>765,7901=>618,7902=>765,7903=>618,7904=>765,7905=>618,7906=>765, +7907=>618,7908=>730,7909=>641,7910=>730,7911=>641,7912=>730,7913=>641,7914=>730,7915=>641,7916=>730, +7917=>641,7918=>730,7919=>641,7920=>730,7921=>641,7922=>651,7923=>586,7924=>651,7925=>586,7926=>651, +7927=>586,7928=>651,7929=>586,7936=>618,7937=>618,7938=>618,7939=>618,7940=>618,7941=>618,7942=>618, +7943=>618,7944=>696,7945=>696,7946=>937,7947=>939,7948=>841,7949=>866,7950=>751,7951=>773,7952=>501, +7953=>501,7954=>501,7955=>501,7956=>501,7957=>501,7960=>712,7961=>715,7962=>989,7963=>986,7964=>920, +7965=>947,7968=>641,7969=>641,7970=>641,7971=>641,7972=>641,7973=>641,7974=>641,7975=>641,7976=>851, +7977=>856,7978=>1125,7979=>1125,7980=>1062,7981=>1085,7982=>948,7983=>956,7984=>351,7985=>351,7986=>351, +7987=>351,7988=>351,7989=>351,7990=>351,7991=>351,7992=>435,7993=>440,7994=>699,7995=>707,7996=>641, +7997=>664,7998=>544,7999=>544,8000=>618,8001=>618,8002=>618,8003=>618,8004=>618,8005=>618,8008=>802, +8009=>839,8010=>1099,8011=>1101,8012=>947,8013=>974,8016=>607,8017=>607,8018=>607,8019=>607,8020=>607, +8021=>607,8022=>607,8023=>607,8025=>837,8027=>1065,8029=>1079,8031=>944,8032=>782,8033=>782,8034=>782, +8035=>782,8036=>782,8037=>782,8038=>782,8039=>782,8040=>817,8041=>862,8042=>1121,8043=>1126,8044=>968, +8045=>994,8046=>925,8047=>968,8048=>618,8049=>618,8050=>501,8051=>501,8052=>641,8053=>641,8054=>351, +8055=>351,8056=>618,8057=>618,8058=>607,8059=>607,8060=>782,8061=>782,8064=>618,8065=>618,8066=>618, +8067=>618,8068=>618,8069=>618,8070=>618,8071=>618,8072=>696,8073=>696,8074=>937,8075=>939,8076=>841, +8077=>866,8078=>751,8079=>773,8080=>641,8081=>641,8082=>641,8083=>641,8084=>641,8085=>641,8086=>641, +8087=>641,8088=>851,8089=>856,8090=>1125,8091=>1125,8092=>1062,8093=>1085,8094=>948,8095=>956,8096=>782, +8097=>782,8098=>782,8099=>782,8100=>782,8101=>782,8102=>782,8103=>782,8104=>817,8105=>862,8106=>1121, +8107=>1126,8108=>968,8109=>994,8110=>925,8111=>968,8112=>618,8113=>618,8114=>618,8115=>618,8116=>618, +8118=>618,8119=>618,8120=>696,8121=>696,8122=>789,8123=>717,8124=>696,8125=>450,8126=>450,8127=>450, +8128=>450,8129=>450,8130=>641,8131=>641,8132=>641,8134=>641,8135=>641,8136=>836,8137=>761,8138=>972, +8139=>908,8140=>753,8141=>450,8142=>450,8143=>450,8144=>351,8145=>351,8146=>351,8147=>351,8150=>351, +8151=>351,8152=>334,8153=>334,8154=>559,8155=>507,8157=>450,8158=>450,8159=>450,8160=>607,8161=>607, +8162=>607,8163=>607,8164=>644,8165=>644,8166=>607,8167=>607,8168=>651,8169=>651,8170=>918,8171=>882, +8172=>754,8173=>450,8174=>450,8175=>450,8178=>782,8179=>782,8180=>782,8182=>782,8183=>782,8184=>958, +8185=>801,8186=>976,8187=>804,8188=>765,8189=>450,8190=>450,8192=>450,8193=>900,8194=>450,8195=>900, +8196=>296,8197=>225,8198=>150,8199=>626,8200=>342,8201=>180,8202=>89,8203=>0,8204=>0,8205=>0, +8206=>0,8207=>0,8208=>374,8209=>374,8210=>626,8213=>900,8214=>450,8215=>450,8219=>342,8223=>591, +8227=>575,8228=>342,8229=>616,8231=>313,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>180, +8241=>1717,8242=>237,8243=>402,8244=>567,8245=>237,8246=>402,8247=>567,8248=>659,8251=>875,8252=>564, +8253=>522,8254=>450,8255=>745,8256=>745,8257=>296,8258=>920,8259=>450,8260=>150,8261=>411,8262=>411, +8263=>927,8264=>746,8265=>746,8266=>461,8267=>618,8268=>450,8269=>450,8270=>470,8271=>360,8272=>745, +8273=>470,8274=>500,8275=>754,8276=>745,8277=>754,8278=>615,8279=>731,8280=>754,8281=>754,8282=>342, +8283=>784,8284=>754,8285=>342,8286=>342,8287=>200,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0, +8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>394,8305=>197,8308=>394,8309=>394, +8310=>394,8311=>394,8312=>394,8313=>394,8314=>475,8315=>475,8316=>475,8317=>259,8318=>259,8319=>410, +8320=>394,8321=>394,8322=>394,8323=>394,8324=>394,8325=>394,8326=>394,8327=>394,8328=>394,8329=>394, +8330=>475,8331=>475,8332=>475,8333=>259,8334=>259,8336=>412,8337=>431,8338=>439,8339=>371,8340=>431, +8352=>836,8353=>626,8354=>626,8355=>626,8356=>626,8357=>938,8358=>753,8359=>1339,8360=>1084,8361=>993, +8362=>768,8363=>642,8365=>626,8366=>614,8367=>1252,8368=>626,8369=>626,8370=>626,8371=>626,8372=>773, +8373=>626,8400=>0,8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>995,8449=>995, +8450=>660,8451=>1090,8452=>807,8453=>1002,8454=>1033,8455=>626,8456=>628,8457=>856,8459=>965,8460=>822, +8461=>799,8462=>641,8463=>641,8464=>537,8465=>627,8466=>771,8467=>424,8468=>876,8469=>753,8470=>1083, +8471=>900,8472=>627,8473=>675,8474=>765,8475=>844,8476=>732,8477=>721,8478=>807,8479=>639,8480=>917, +8481=>1115,8483=>751,8484=>679,8485=>560,8486=>765,8487=>692,8488=>686,8489=>272,8490=>697,8491=>696, +8492=>835,8493=>736,8494=>769,8495=>572,8496=>656,8497=>727,8498=>615,8499=>1065,8500=>418,8501=>714, +8502=>658,8503=>444,8504=>615,8505=>342,8506=>851,8507=>1232,8508=>710,8509=>663,8510=>589,8511=>776, +8512=>756,8513=>707,8514=>518,8515=>573,8516=>684,8517=>747,8518=>644,8519=>610,8520=>308,8521=>308, +8523=>785,8526=>492,8531=>932,8532=>932,8533=>932,8534=>932,8535=>932,8536=>932,8537=>932,8538=>932, +8539=>932,8540=>932,8541=>932,8542=>932,8543=>554,8544=>334,8545=>593,8546=>851,8547=>989,8548=>696, +8549=>989,8550=>1247,8551=>1505,8552=>1008,8553=>694,8554=>1008,8555=>1266,8556=>573,8557=>660,8558=>747, +8559=>896,8560=>308,8561=>546,8562=>785,8563=>885,8564=>586,8565=>866,8566=>1104,8567=>1342,8568=>872, +8569=>580,8570=>872,8571=>1110,8572=>308,8573=>533,8574=>644,8575=>938,8576=>1160,8577=>747,8578=>1160, +8579=>660,8580=>533,8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754,8598=>754,8599=>754, +8600=>754,8601=>754,8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754,8608=>754,8609=>754, +8610=>754,8611=>754,8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754,8618=>754,8619=>754, +8620=>754,8621=>754,8622=>754,8623=>754,8624=>754,8625=>754,8626=>754,8627=>754,8628=>754,8629=>754, +8630=>754,8631=>754,8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754,8638=>754,8639=>754, +8640=>754,8641=>754,8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754,8648=>754,8649=>754, +8650=>754,8651=>754,8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754,8658=>754,8659=>754, +8660=>754,8661=>754,8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754,8668=>754,8669=>754, +8670=>754,8671=>754,8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754,8678=>754,8679=>754, +8680=>754,8681=>754,8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754,8688=>754,8689=>754, +8690=>754,8691=>754,8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754,8698=>754,8699=>754, +8700=>754,8701=>754,8702=>754,8703=>754,8704=>696,8705=>626,8706=>489,8707=>615,8708=>615,8709=>771, +8710=>627,8711=>627,8712=>807,8713=>807,8714=>675,8715=>807,8716=>807,8717=>675,8718=>572,8719=>708, +8720=>708,8721=>646,8722=>754,8723=>754,8724=>626,8725=>329,8726=>626,8727=>754,8728=>563,8729=>342, +8730=>600,8731=>600,8732=>600,8733=>641,8734=>750,8735=>754,8736=>807,8737=>807,8738=>754,8739=>450, +8740=>450,8741=>450,8742=>450,8743=>730,8744=>730,8745=>730,8746=>730,8747=>549,8748=>835,8749=>1165, +8750=>506,8751=>879,8752=>1181,8753=>506,8754=>506,8755=>506,8756=>626,8757=>626,8758=>264,8759=>626, +8760=>754,8761=>754,8762=>754,8763=>754,8764=>754,8765=>754,8766=>754,8767=>754,8768=>337,8769=>754, +8770=>754,8771=>754,8772=>754,8773=>754,8774=>754,8775=>754,8776=>754,8777=>754,8778=>754,8779=>754, +8780=>754,8781=>754,8782=>754,8783=>754,8784=>754,8785=>754,8786=>754,8787=>754,8788=>956,8789=>956, +8790=>754,8791=>754,8792=>754,8793=>754,8794=>754,8795=>754,8796=>754,8797=>754,8798=>754,8799=>754, +8800=>754,8801=>754,8802=>754,8803=>754,8804=>754,8805=>754,8806=>754,8807=>754,8808=>756,8809=>756, +8810=>942,8811=>942,8812=>450,8813=>754,8814=>754,8815=>754,8816=>754,8817=>754,8818=>754,8819=>754, +8820=>754,8821=>754,8822=>754,8823=>754,8824=>754,8825=>754,8826=>754,8827=>754,8828=>754,8829=>754, +8830=>754,8831=>754,8832=>754,8833=>754,8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754, +8840=>754,8841=>754,8842=>754,8843=>754,8844=>730,8845=>730,8846=>730,8847=>754,8848=>754,8849=>754, +8850=>754,8851=>716,8852=>716,8853=>754,8854=>754,8855=>754,8856=>754,8857=>754,8858=>754,8859=>754, +8860=>754,8861=>754,8862=>754,8863=>754,8864=>754,8865=>754,8866=>822,8867=>822,8868=>822,8869=>822, +8870=>488,8871=>488,8872=>822,8873=>822,8874=>822,8875=>822,8876=>822,8877=>822,8878=>822,8879=>822, +8880=>754,8881=>754,8882=>754,8883=>754,8884=>754,8885=>754,8886=>900,8887=>900,8888=>754,8889=>754, +8890=>488,8891=>730,8892=>730,8893=>730,8894=>754,8895=>754,8896=>758,8897=>758,8898=>758,8899=>758, +8900=>444,8901=>342,8902=>563,8903=>754,8904=>900,8905=>900,8906=>900,8907=>900,8908=>900,8909=>754, +8910=>730,8911=>730,8912=>754,8913=>754,8914=>754,8915=>754,8916=>754,8917=>754,8918=>754,8919=>754, +8920=>1280,8921=>1280,8922=>754,8923=>754,8924=>754,8925=>754,8926=>754,8927=>754,8928=>754,8929=>754, +8930=>754,8931=>754,8932=>754,8933=>754,8934=>754,8935=>754,8936=>754,8937=>754,8938=>754,8939=>754, +8940=>754,8941=>754,8942=>900,8943=>900,8944=>900,8945=>900,8946=>1042,8947=>807,8948=>675,8949=>807, +8950=>807,8951=>675,8952=>807,8953=>807,8954=>1042,8955=>807,8956=>675,8957=>807,8958=>675,8959=>807, +8960=>542,8961=>542,8962=>644,8963=>754,8964=>754,8965=>754,8966=>754,8967=>439,8968=>411,8969=>411, +8970=>411,8971=>411,8972=>728,8973=>728,8974=>728,8975=>728,8976=>754,8977=>484,8984=>835,8985=>754, +8988=>422,8989=>422,8990=>422,8991=>422,8992=>549,8993=>549,8996=>1037,8997=>1037,8998=>1272,8999=>1037, +9000=>1299,9003=>1272,9004=>786,9075=>351,9076=>644,9077=>782,9082=>618,9085=>776,9095=>1037,9108=>786, +9115=>450,9116=>450,9117=>450,9118=>450,9119=>450,9120=>450,9121=>450,9122=>450,9123=>450,9124=>450, +9125=>450,9126=>450,9127=>675,9128=>675,9129=>675,9130=>675,9131=>675,9132=>675,9133=>675,9134=>549, +9166=>754,9167=>850,9187=>786,9189=>692,9250=>644,9251=>644,9312=>762,9313=>762,9314=>762,9315=>762, +9316=>762,9317=>762,9318=>762,9319=>762,9320=>762,9321=>762,9600=>692,9601=>692,9602=>692,9603=>692, +9604=>692,9605=>692,9606=>692,9607=>692,9608=>692,9609=>692,9610=>692,9611=>692,9612=>692,9613=>692, +9614=>692,9615=>692,9616=>692,9617=>692,9618=>692,9619=>692,9620=>692,9621=>692,9622=>692,9623=>692, +9624=>692,9625=>692,9626=>692,9627=>692,9628=>692,9629=>692,9630=>692,9631=>692,9632=>850,9633=>850, +9634=>850,9635=>850,9636=>850,9637=>850,9638=>850,9639=>850,9640=>850,9641=>850,9642=>610,9643=>610, +9644=>850,9645=>850,9646=>495,9647=>495,9648=>692,9649=>692,9650=>692,9651=>692,9652=>452,9653=>452, +9654=>692,9655=>692,9656=>452,9657=>452,9658=>692,9659=>692,9660=>692,9661=>692,9662=>452,9663=>452, +9664=>692,9665=>692,9666=>452,9667=>452,9668=>692,9669=>692,9670=>692,9671=>692,9672=>692,9673=>785, +9674=>444,9675=>785,9676=>785,9677=>785,9678=>785,9679=>785,9680=>785,9681=>785,9682=>785,9683=>785, +9684=>785,9685=>785,9686=>474,9687=>474,9688=>756,9689=>873,9690=>873,9691=>873,9692=>348,9693=>348, +9694=>348,9695=>348,9696=>692,9697=>692,9698=>692,9699=>692,9700=>692,9701=>692,9702=>575,9703=>850, +9704=>850,9705=>850,9706=>850,9707=>850,9708=>692,9709=>692,9710=>692,9711=>1007,9712=>850,9713=>850, +9714=>850,9715=>850,9716=>785,9717=>785,9718=>785,9719=>785,9720=>692,9721=>692,9722=>692,9723=>747, +9724=>747,9725=>659,9726=>659,9727=>692,9728=>807,9729=>900,9730=>807,9731=>807,9732=>807,9733=>807, +9734=>807,9735=>515,9736=>806,9737=>807,9738=>799,9739=>799,9740=>604,9741=>911,9742=>1121,9743=>1125, +9744=>807,9745=>807,9746=>807,9747=>479,9748=>807,9749=>807,9750=>807,9751=>807,9752=>807,9753=>807, +9754=>807,9755=>807,9756=>807,9757=>548,9758=>807,9759=>548,9760=>807,9761=>807,9762=>807,9763=>807, +9764=>602,9765=>671,9766=>584,9767=>705,9768=>490,9769=>807,9770=>807,9771=>807,9772=>639,9773=>807, +9774=>807,9775=>807,9776=>807,9777=>807,9778=>807,9779=>807,9780=>807,9781=>807,9782=>807,9783=>807, +9784=>807,9785=>807,9786=>807,9787=>807,9788=>807,9789=>807,9790=>807,9791=>552,9792=>658,9793=>658, +9794=>807,9795=>807,9796=>807,9797=>807,9798=>807,9799=>807,9800=>807,9801=>807,9802=>807,9803=>807, +9804=>807,9805=>807,9806=>807,9807=>807,9808=>807,9809=>807,9810=>807,9811=>807,9812=>807,9813=>807, +9814=>807,9815=>807,9816=>807,9817=>807,9818=>807,9819=>807,9820=>807,9821=>807,9822=>807,9823=>807, +9824=>807,9825=>807,9826=>807,9827=>807,9828=>807,9829=>807,9830=>807,9831=>807,9832=>807,9833=>424, +9834=>574,9835=>807,9836=>807,9837=>424,9838=>321,9839=>435,9840=>673,9841=>689,9842=>807,9843=>807, +9844=>807,9845=>807,9846=>807,9847=>807,9848=>807,9849=>807,9850=>807,9851=>807,9852=>807,9853=>807, +9854=>807,9855=>807,9856=>782,9857=>782,9858=>782,9859=>782,9860=>782,9861=>782,9862=>807,9863=>807, +9864=>807,9865=>807,9866=>807,9867=>807,9868=>807,9869=>807,9870=>807,9871=>807,9872=>807,9873=>807, +9874=>807,9875=>807,9876=>807,9877=>487,9878=>807,9879=>807,9880=>807,9881=>807,9882=>807,9883=>807, +9884=>807,9888=>807,9889=>632,9890=>903,9891=>977,9892=>1028,9893=>811,9894=>754,9895=>754,9896=>754, +9897=>754,9898=>754,9899=>754,9900=>754,9901=>754,9902=>754,9903=>754,9904=>759,9905=>754,9906=>658, +9907=>659,9908=>659,9909=>659,9910=>765,9911=>659,9912=>659,9985=>754,9986=>754,9987=>754,9988=>754, +9990=>754,9991=>754,9992=>754,9993=>754,9996=>754,9997=>754,9998=>754,9999=>754,10000=>754,10001=>754, +10002=>754,10003=>754,10004=>754,10005=>754,10006=>754,10007=>754,10008=>754,10009=>754,10010=>754,10011=>754, +10012=>754,10013=>754,10014=>754,10015=>754,10016=>754,10017=>754,10018=>754,10019=>754,10020=>754,10021=>754, +10022=>754,10023=>754,10025=>754,10026=>754,10027=>754,10028=>754,10029=>754,10030=>754,10031=>754,10032=>754, +10033=>754,10034=>754,10035=>754,10036=>754,10037=>754,10038=>754,10039=>754,10040=>754,10041=>754,10042=>754, +10043=>754,10044=>754,10045=>754,10046=>754,10047=>754,10048=>754,10049=>754,10050=>754,10051=>754,10052=>754, +10053=>754,10054=>754,10055=>754,10056=>754,10057=>754,10058=>754,10059=>754,10061=>807,10063=>807,10064=>807, +10065=>807,10066=>807,10070=>807,10072=>754,10073=>754,10074=>754,10075=>290,10076=>290,10077=>484,10078=>484, +10081=>754,10082=>754,10083=>754,10084=>754,10085=>754,10086=>754,10087=>754,10088=>754,10089=>754,10090=>754, +10091=>754,10092=>754,10093=>754,10094=>754,10095=>754,10096=>754,10097=>754,10098=>754,10099=>754,10100=>754, +10101=>754,10102=>762,10103=>762,10104=>762,10105=>762,10106=>762,10107=>762,10108=>762,10109=>762,10110=>762, +10111=>762,10112=>754,10113=>754,10114=>754,10115=>754,10116=>754,10117=>754,10118=>754,10119=>754,10120=>754, +10121=>754,10122=>754,10123=>754,10124=>754,10125=>754,10126=>754,10127=>754,10128=>754,10129=>754,10130=>754, +10131=>754,10132=>754,10136=>754,10137=>754,10138=>754,10139=>754,10140=>754,10141=>754,10142=>754,10143=>754, +10144=>754,10145=>754,10146=>754,10147=>754,10148=>754,10149=>754,10150=>754,10151=>754,10152=>754,10153=>754, +10154=>754,10155=>754,10156=>754,10157=>754,10158=>754,10159=>754,10161=>754,10162=>754,10163=>754,10164=>754, +10165=>754,10166=>754,10167=>754,10168=>754,10169=>754,10170=>754,10171=>754,10172=>754,10173=>754,10174=>754, +10181=>411,10182=>411,10208=>444,10214=>438,10215=>438,10216=>411,10217=>411,10218=>648,10219=>648,10224=>754, +10225=>754,10226=>754,10227=>754,10228=>1042,10229=>1290,10230=>1290,10231=>1290,10232=>1290,10233=>1290,10234=>1290, +10235=>1290,10236=>1290,10237=>1290,10238=>1290,10239=>1290,10240=>703,10241=>703,10242=>703,10243=>703,10244=>703, +10245=>703,10246=>703,10247=>703,10248=>703,10249=>703,10250=>703,10251=>703,10252=>703,10253=>703,10254=>703, +10255=>703,10256=>703,10257=>703,10258=>703,10259=>703,10260=>703,10261=>703,10262=>703,10263=>703,10264=>703, +10265=>703,10266=>703,10267=>703,10268=>703,10269=>703,10270=>703,10271=>703,10272=>703,10273=>703,10274=>703, +10275=>703,10276=>703,10277=>703,10278=>703,10279=>703,10280=>703,10281=>703,10282=>703,10283=>703,10284=>703, +10285=>703,10286=>703,10287=>703,10288=>703,10289=>703,10290=>703,10291=>703,10292=>703,10293=>703,10294=>703, +10295=>703,10296=>703,10297=>703,10298=>703,10299=>703,10300=>703,10301=>703,10302=>703,10303=>703,10304=>703, +10305=>703,10306=>703,10307=>703,10308=>703,10309=>703,10310=>703,10311=>703,10312=>703,10313=>703,10314=>703, +10315=>703,10316=>703,10317=>703,10318=>703,10319=>703,10320=>703,10321=>703,10322=>703,10323=>703,10324=>703, +10325=>703,10326=>703,10327=>703,10328=>703,10329=>703,10330=>703,10331=>703,10332=>703,10333=>703,10334=>703, +10335=>703,10336=>703,10337=>703,10338=>703,10339=>703,10340=>703,10341=>703,10342=>703,10343=>703,10344=>703, +10345=>703,10346=>703,10347=>703,10348=>703,10349=>703,10350=>703,10351=>703,10352=>703,10353=>703,10354=>703, +10355=>703,10356=>703,10357=>703,10358=>703,10359=>703,10360=>703,10361=>703,10362=>703,10363=>703,10364=>703, +10365=>703,10366=>703,10367=>703,10368=>703,10369=>703,10370=>703,10371=>703,10372=>703,10373=>703,10374=>703, +10375=>703,10376=>703,10377=>703,10378=>703,10379=>703,10380=>703,10381=>703,10382=>703,10383=>703,10384=>703, +10385=>703,10386=>703,10387=>703,10388=>703,10389=>703,10390=>703,10391=>703,10392=>703,10393=>703,10394=>703, +10395=>703,10396=>703,10397=>703,10398=>703,10399=>703,10400=>703,10401=>703,10402=>703,10403=>703,10404=>703, +10405=>703,10406=>703,10407=>703,10408=>703,10409=>703,10410=>703,10411=>703,10412=>703,10413=>703,10414=>703, +10415=>703,10416=>703,10417=>703,10418=>703,10419=>703,10420=>703,10421=>703,10422=>703,10423=>703,10424=>703, +10425=>703,10426=>703,10427=>703,10428=>703,10429=>703,10430=>703,10431=>703,10432=>703,10433=>703,10434=>703, +10435=>703,10436=>703,10437=>703,10438=>703,10439=>703,10440=>703,10441=>703,10442=>703,10443=>703,10444=>703, +10445=>703,10446=>703,10447=>703,10448=>703,10449=>703,10450=>703,10451=>703,10452=>703,10453=>703,10454=>703, +10455=>703,10456=>703,10457=>703,10458=>703,10459=>703,10460=>703,10461=>703,10462=>703,10463=>703,10464=>703, +10465=>703,10466=>703,10467=>703,10468=>703,10469=>703,10470=>703,10471=>703,10472=>703,10473=>703,10474=>703, +10475=>703,10476=>703,10477=>703,10478=>703,10479=>703,10480=>703,10481=>703,10482=>703,10483=>703,10484=>703, +10485=>703,10486=>703,10487=>703,10488=>703,10489=>703,10490=>703,10491=>703,10492=>703,10493=>703,10494=>703, +10495=>703,10502=>754,10503=>754,10506=>754,10507=>754,10560=>754,10561=>754,10627=>678,10628=>678,10702=>754, +10703=>941,10704=>941,10705=>900,10706=>900,10707=>900,10708=>900,10709=>900,10731=>444,10746=>754,10747=>754, +10752=>900,10753=>900,10754=>900,10764=>1495,10765=>506,10766=>506,10767=>506,10768=>506,10769=>506,10770=>506, +10771=>506,10772=>506,10773=>506,10774=>506,10775=>506,10776=>506,10777=>506,10778=>506,10779=>506,10780=>506, +10799=>754,10877=>754,10878=>754,10879=>754,10880=>754,10881=>754,10882=>754,10883=>754,10884=>754,10885=>754, +10886=>754,10887=>754,10888=>754,10889=>754,10890=>754,10891=>754,10892=>754,10893=>754,10894=>754,10895=>754, +10896=>754,10897=>754,10898=>754,10899=>754,10900=>754,10901=>754,10902=>754,10903=>754,10904=>754,10905=>754, +10906=>754,10907=>754,10908=>754,10909=>754,10910=>754,10911=>754,10912=>754,10926=>754,10927=>754,10928=>754, +10929=>754,10930=>754,10931=>754,10932=>754,10933=>754,10934=>754,10935=>754,10936=>754,10937=>754,10938=>754, +11001=>754,11002=>754,11008=>754,11009=>754,11010=>754,11011=>754,11012=>754,11013=>754,11014=>754,11015=>754, +11016=>754,11017=>754,11018=>754,11019=>754,11020=>754,11021=>754,11022=>754,11023=>754,11024=>754,11025=>754, +11026=>850,11027=>850,11028=>850,11029=>850,11030=>692,11031=>692,11032=>692,11033=>692,11034=>850,11039=>782, +11040=>782,11041=>786,11042=>786,11043=>786,11044=>1007,11091=>782,11092=>782,11360=>573,11361=>324,11362=>573, +11363=>659,11364=>693,11365=>607,11366=>430,11367=>860,11368=>641,11369=>697,11370=>598,11371=>652,11372=>523, +11373=>774,11374=>896,11375=>696,11377=>700,11378=>1099,11379=>950,11380=>586,11381=>628,11382=>508,11383=>704, +11385=>484,11386=>618,11387=>502,11388=>197,11389=>438,11800=>527,11810=>411,11811=>411,11812=>411,11813=>411, +11822=>522,19904=>807,19905=>807,19906=>807,19907=>807,19908=>807,19909=>807,19910=>807,19911=>807,19912=>807, +19913=>807,19914=>807,19915=>807,19916=>807,19917=>807,19918=>807,19919=>807,19920=>807,19921=>807,19922=>807, +19923=>807,19924=>807,19925=>807,19926=>807,19927=>807,19928=>807,19929=>807,19930=>807,19931=>807,19932=>807, +19933=>807,19934=>807,19935=>807,19936=>807,19937=>807,19938=>807,19939=>807,19940=>807,19941=>807,19942=>807, +19943=>807,19944=>807,19945=>807,19946=>807,19947=>807,19948=>807,19949=>807,19950=>807,19951=>807,19952=>807, +19953=>807,19954=>807,19955=>807,19956=>807,19957=>807,19958=>807,19959=>807,19960=>807,19961=>807,19962=>807, +19963=>807,19964=>807,19965=>807,19966=>807,19967=>807,42564=>648,42565=>536,42566=>392,42567=>396,42572=>1265, +42573=>1055,42576=>1110,42577=>924,42580=>1056,42581=>875,42582=>990,42583=>872,42594=>990,42595=>846,42596=>986, +42597=>823,42598=>1134,42599=>896,42600=>765,42601=>618,42602=>933,42603=>781,42604=>1266,42605=>995,42606=>865, +42634=>849,42635=>673,42636=>614,42637=>521,42644=>727,42645=>641,42760=>450,42761=>450,42762=>450,42763=>450, +42764=>450,42765=>450,42766=>450,42767=>450,42768=>450,42769=>450,42770=>450,42771=>450,42772=>450,42773=>450, +42774=>450,42779=>360,42780=>360,42781=>258,42782=>258,42783=>258,42790=>753,42791=>641,42792=>928,42793=>771, +42794=>626,42795=>501,42800=>502,42801=>536,42802=>1214,42803=>946,42804=>1156,42805=>958,42806=>1120,42807=>947, +42808=>971,42809=>830,42810=>971,42811=>830,42812=>932,42813=>830,42814=>628,42815=>494,42822=>765,42823=>488, +42824=>614,42825=>478,42826=>826,42827=>732,42830=>1266,42831=>995,42880=>573,42881=>308,42882=>753,42883=>641, +42889=>360,42890=>356,42891=>410,42892=>275,43003=>615,43004=>659,43005=>896,43006=>334,43007=>1192,62917=>618, +64256=>749,64257=>708,64258=>708,64259=>1024,64260=>1024,64261=>727,64262=>917,64275=>1249,64276=>1245,64277=>1240, +64278=>1245,64279=>1542,64285=>308,64286=>0,64287=>597,64288=>647,64289=>867,64290=>801,64291=>889,64292=>867, +64293=>844,64294=>889,64295=>889,64296=>878,64297=>754,64298=>854,64299=>854,64300=>854,64301=>854,64302=>676, +64303=>676,64304=>676,64305=>605,64306=>483,64307=>589,64308=>641,64309=>308,64310=>442,64312=>651,64313=>420, +64314=>584,64315=>584,64316=>611,64318=>698,64320=>447,64321=>696,64323=>646,64324=>618,64326=>676,64327=>656, +64328=>584,64329=>854,64330=>676,64331=>308,64332=>605,64333=>584,64334=>618,64335=>676,65024=>0,65025=>0, +65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0, +65036=>0,65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0,65059=>0,65529=>0,65530=>0, +65531=>0,65532=>0,65533=>1002); +$enc=''; +$diff=''; +$file='dejavusanscondensedbi.z'; +$ctg='dejavusanscondensedbi.ctg.z'; +$originalsize=493196; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedbi.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedbi.z new file mode 100644 index 0000000..7d57070 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedbi.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedi.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedi.ctg.z new file mode 100644 index 0000000..ac628b3 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedi.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedi.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedi.php new file mode 100644 index 0000000..e8b79b1 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedi.php @@ -0,0 +1,471 @@ +<?php +$type='TrueTypeUnicode'; +$name='DejaVuSansCondensed-Oblique'; +$desc=array('Ascent'=>928,'Descent'=>-236,'CapHeight'=>-39,'Flags'=>96,'FontBBox'=>'[-914 -350 1493 1068]','ItalicAngle'=>-11,'StemV'=>70,'MissingWidth'=>540); +$up=-63; +$ut=44; +$dw=540; +$cw=array( +0=>540,32=>286,33=>360,34=>414,35=>754,36=>572,37=>855,38=>702,39=>247,40=>351, +41=>351,42=>450,43=>754,44=>286,45=>325,46=>286,47=>303,48=>572,49=>572,50=>572, +51=>572,52=>572,53=>572,54=>572,55=>572,56=>572,57=>572,58=>303,59=>303,60=>754, +61=>754,62=>754,63=>478,64=>900,65=>615,66=>617,67=>628,68=>693,69=>568,70=>518, +71=>697,72=>677,73=>265,74=>265,75=>590,76=>501,77=>776,78=>673,79=>708,80=>542, +81=>708,82=>625,83=>571,84=>549,85=>659,86=>615,87=>890,88=>616,89=>549,90=>616, +91=>351,92=>303,93=>351,94=>754,95=>450,96=>450,97=>551,98=>571,99=>495,100=>571, +101=>554,102=>316,103=>571,104=>570,105=>250,106=>250,107=>521,108=>250,109=>876,110=>570, +111=>550,112=>571,113=>571,114=>370,115=>469,116=>353,117=>570,118=>532,119=>736,120=>532, +121=>532,122=>472,123=>572,124=>303,125=>572,126=>754,8364=>572,8218=>286,402=>316,8222=>466, +8230=>900,8224=>450,8225=>450,710=>450,8240=>1215,352=>571,8249=>360,338=>962,381=>616,8216=>286, +8217=>286,8220=>466,8221=>466,8226=>531,8211=>450,8212=>900,732=>450,8482=>900,353=>469,8250=>360, +339=>925,382=>472,376=>549,160=>286,161=>360,162=>572,163=>572,164=>572,165=>572,166=>303, +167=>450,168=>450,169=>900,170=>424,171=>555,172=>754,173=>325,174=>900,175=>450,176=>450, +177=>754,178=>360,179=>360,180=>450,181=>572,182=>572,183=>286,184=>450,185=>360,186=>424, +187=>555,188=>872,189=>872,190=>872,191=>478,192=>615,193=>615,194=>615,195=>615,196=>615, +197=>615,198=>876,199=>628,200=>568,201=>568,202=>568,203=>568,204=>265,205=>265,206=>265, +207=>265,208=>697,209=>673,210=>708,211=>708,212=>708,213=>708,214=>708,215=>754,216=>708, +217=>659,218=>659,219=>659,220=>659,221=>549,222=>547,223=>567,224=>551,225=>551,226=>551, +227=>551,228=>551,229=>551,230=>896,231=>495,232=>554,233=>554,234=>554,235=>554,236=>250, +237=>250,238=>250,239=>250,240=>550,241=>570,242=>550,243=>550,244=>550,245=>550,246=>550, +247=>754,248=>550,249=>570,250=>570,251=>570,252=>570,253=>532,254=>571,255=>532,256=>615, +257=>551,258=>615,259=>551,260=>615,261=>551,262=>628,263=>495,264=>628,265=>495,266=>628, +267=>495,268=>628,269=>495,270=>693,271=>571,272=>697,273=>571,274=>568,275=>554,276=>568, +277=>554,278=>568,279=>554,280=>568,281=>554,282=>568,283=>554,284=>697,285=>571,286=>697, +287=>571,288=>697,289=>571,290=>697,291=>571,292=>677,293=>570,294=>824,295=>625,296=>265, +297=>250,298=>265,299=>250,300=>265,301=>250,302=>265,303=>250,304=>265,305=>250,306=>531, +307=>500,308=>265,309=>250,310=>590,311=>521,312=>521,313=>501,314=>250,315=>501,316=>250, +317=>501,318=>250,319=>501,320=>250,321=>505,322=>258,323=>673,324=>570,325=>673,326=>570, +327=>673,328=>570,329=>732,330=>673,331=>570,332=>708,333=>550,334=>708,335=>550,336=>708, +337=>550,340=>625,341=>370,342=>625,343=>370,344=>625,345=>370,346=>571,347=>469,348=>571, +349=>469,350=>571,351=>469,354=>549,355=>353,356=>549,357=>353,358=>549,359=>353,360=>659, +361=>570,362=>659,363=>570,364=>659,365=>570,366=>659,367=>570,368=>659,369=>570,370=>659, +371=>570,372=>890,373=>736,374=>549,375=>532,377=>616,378=>472,379=>616,380=>472,383=>316, +384=>571,385=>661,386=>617,387=>571,388=>617,389=>571,390=>633,391=>628,392=>495,393=>697, +394=>737,395=>617,396=>571,397=>550,398=>568,399=>708,400=>553,401=>518,403=>697,404=>618, +405=>885,406=>318,407=>265,408=>671,409=>521,410=>250,411=>532,412=>876,413=>673,414=>570, +415=>708,416=>822,417=>550,418=>844,419=>663,420=>586,421=>571,422=>625,423=>571,424=>469, +425=>568,426=>302,427=>353,428=>549,429=>353,430=>549,431=>754,432=>570,433=>688,434=>648, +435=>669,436=>657,437=>616,438=>472,439=>599,440=>599,441=>520,442=>472,443=>572,444=>599, +445=>520,446=>459,447=>571,448=>265,449=>443,450=>413,451=>266,452=>1310,453=>1165,454=>1043, +455=>767,456=>751,457=>500,458=>938,459=>923,460=>820,461=>615,462=>551,463=>265,464=>250, +465=>708,466=>550,467=>659,468=>570,469=>659,470=>570,471=>659,472=>570,473=>659,474=>570, +475=>659,476=>570,477=>554,478=>615,479=>551,480=>615,481=>551,482=>876,483=>896,484=>697, +485=>571,486=>697,487=>571,488=>590,489=>521,490=>708,491=>550,492=>708,493=>550,494=>599, +495=>472,496=>250,497=>1310,498=>1165,499=>1043,500=>697,501=>571,502=>1001,503=>614,504=>673, +505=>570,506=>615,507=>551,508=>876,509=>896,510=>708,511=>550,512=>615,513=>551,514=>615, +515=>551,516=>568,517=>554,518=>568,519=>554,520=>265,521=>250,522=>265,523=>250,524=>708, +525=>550,526=>708,527=>550,528=>625,529=>370,530=>625,531=>370,532=>659,533=>570,534=>659, +535=>570,536=>571,537=>469,538=>549,539=>353,540=>564,541=>469,542=>677,543=>570,544=>662, +545=>754,546=>628,547=>549,548=>616,549=>472,550=>615,551=>551,552=>568,553=>554,554=>708, +555=>550,556=>708,557=>550,558=>708,559=>550,560=>708,561=>550,562=>549,563=>532,564=>427, +565=>758,566=>429,567=>250,568=>898,569=>898,570=>615,571=>628,572=>495,573=>501,574=>549, +575=>469,576=>472,577=>542,578=>431,579=>617,580=>659,581=>615,582=>568,583=>554,584=>265, +585=>250,586=>703,587=>571,588=>625,589=>370,590=>549,591=>532,592=>551,593=>571,594=>571, +595=>571,596=>495,597=>495,598=>571,599=>654,600=>554,601=>554,602=>759,603=>490,604=>490, +605=>698,606=>598,607=>293,608=>626,609=>571,610=>566,611=>536,612=>536,613=>570,614=>570, +615=>570,616=>334,617=>348,618=>334,619=>356,620=>438,621=>250,622=>635,623=>876,624=>876, +625=>876,626=>581,627=>578,628=>570,629=>550,630=>772,631=>655,632=>593,633=>422,634=>422, +635=>422,636=>422,637=>422,638=>477,639=>477,640=>541,641=>541,642=>469,643=>302,644=>302, +645=>415,646=>302,647=>353,648=>353,649=>570,650=>556,651=>538,652=>532,653=>736,654=>532, +655=>549,656=>472,657=>472,658=>520,659=>520,660=>459,661=>459,662=>459,663=>459,664=>708, +665=>521,666=>598,667=>637,668=>588,669=>263,670=>600,671=>456,672=>654,673=>459,674=>459, +675=>913,676=>952,677=>911,678=>742,679=>549,680=>700,681=>763,682=>576,683=>589,684=>463, +685=>463,686=>513,687=>597,688=>359,689=>359,690=>157,691=>233,692=>266,693=>266,694=>341, +695=>463,696=>335,697=>250,698=>414,699=>286,700=>286,701=>286,702=>276,703=>276,704=>333, +705=>333,706=>450,707=>450,708=>450,709=>450,711=>450,712=>247,713=>450,714=>450,715=>450, +716=>247,717=>450,718=>450,719=>450,720=>303,721=>303,722=>276,723=>276,724=>450,725=>450, +726=>351,727=>286,728=>450,729=>450,730=>450,731=>450,733=>450,734=>284,735=>450,736=>383, +737=>149,738=>335,739=>399,740=>333,741=>444,742=>444,743=>444,744=>444,745=>444,748=>450, +749=>450,750=>466,755=>450,759=>450,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0, +774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0, +784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0, +794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0, +804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0, +814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0, +824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0, +834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0, +844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0, +860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>589,881=>511,882=>775, +883=>583,884=>250,885=>250,886=>673,887=>584,890=>450,891=>494,892=>495,893=>494,894=>303, +900=>450,901=>450,902=>615,903=>286,904=>690,905=>813,906=>391,908=>755,910=>773,911=>814, +912=>304,913=>615,914=>617,915=>501,916=>615,917=>568,918=>616,919=>677,920=>708,921=>265, +922=>590,923=>615,924=>776,925=>673,926=>568,927=>708,928=>677,929=>542,931=>568,932=>549, +933=>549,934=>708,935=>616,936=>708,937=>688,938=>265,939=>549,940=>593,941=>486,942=>570, +943=>304,944=>521,945=>593,946=>574,947=>532,948=>550,949=>486,950=>489,951=>570,952=>550, +953=>304,954=>530,955=>532,956=>572,957=>502,958=>501,959=>550,960=>542,961=>571,962=>528, +963=>570,964=>542,965=>521,966=>593,967=>532,968=>593,969=>753,970=>304,971=>521,972=>550, +973=>521,974=>753,975=>590,976=>553,977=>557,978=>628,979=>758,980=>628,981=>593,982=>753, +983=>597,984=>708,985=>550,986=>583,987=>528,988=>518,989=>413,990=>593,991=>593,992=>778, +993=>564,994=>840,995=>753,996=>682,997=>593,998=>712,999=>553,1000=>618,1001=>546,1002=>690, +1003=>563,1004=>629,1005=>550,1006=>549,1007=>482,1008=>597,1009=>571,1010=>495,1011=>250,1012=>708, +1013=>554,1014=>554,1015=>547,1016=>571,1017=>628,1018=>776,1019=>585,1020=>571,1021=>633,1022=>628, +1023=>633,1024=>568,1025=>568,1026=>708,1027=>501,1028=>628,1029=>571,1030=>265,1031=>265,1032=>265, +1033=>984,1034=>940,1035=>708,1036=>639,1037=>673,1038=>548,1039=>677,1040=>615,1041=>617,1042=>617, +1043=>501,1044=>703,1045=>568,1046=>969,1047=>577,1048=>673,1049=>673,1050=>639,1051=>677,1052=>776, +1053=>677,1054=>708,1055=>677,1056=>542,1057=>628,1058=>549,1059=>548,1060=>774,1061=>616,1062=>699, +1063=>617,1064=>962,1065=>984,1066=>749,1067=>736,1068=>617,1069=>628,1070=>971,1071=>625,1072=>551, +1073=>555,1074=>530,1075=>473,1076=>622,1077=>554,1078=>811,1079=>479,1080=>584,1081=>584,1082=>543, +1083=>575,1084=>679,1085=>588,1086=>550,1087=>588,1088=>571,1089=>495,1090=>524,1091=>532,1092=>769, +1093=>532,1094=>612,1095=>532,1096=>823,1097=>848,1098=>636,1099=>710,1100=>530,1101=>494,1102=>757, +1103=>541,1104=>554,1105=>554,1106=>563,1107=>473,1108=>494,1109=>469,1110=>250,1111=>250,1112=>250, +1113=>812,1114=>809,1115=>586,1116=>543,1117=>584,1118=>532,1119=>588,1120=>840,1121=>753,1122=>693, +1123=>604,1124=>848,1125=>674,1126=>791,1127=>705,1128=>1043,1129=>901,1130=>708,1131=>550,1132=>924, +1133=>742,1134=>572,1135=>486,1136=>771,1137=>789,1138=>708,1139=>550,1140=>703,1141=>598,1142=>703, +1143=>598,1144=>893,1145=>813,1146=>857,1147=>682,1148=>1062,1149=>925,1150=>840,1151=>753,1152=>628, +1153=>495,1154=>452,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>376,1161=>376,1162=>673, +1163=>591,1164=>617,1165=>530,1166=>542,1167=>571,1168=>549,1169=>473,1170=>607,1171=>500,1172=>501, +1173=>441,1174=>969,1175=>811,1176=>577,1177=>479,1178=>639,1179=>543,1180=>639,1181=>543,1182=>639, +1183=>543,1184=>771,1185=>748,1186=>677,1187=>594,1188=>913,1189=>789,1190=>1002,1191=>855,1192=>801, +1193=>636,1194=>628,1195=>495,1196=>549,1197=>476,1198=>549,1199=>532,1200=>549,1201=>532,1202=>616, +1203=>532,1204=>840,1205=>726,1206=>617,1207=>532,1208=>617,1209=>532,1210=>617,1211=>570,1212=>836, +1213=>658,1214=>836,1215=>658,1216=>265,1217=>969,1218=>811,1219=>589,1220=>543,1221=>677,1222=>575, +1223=>677,1224=>594,1225=>677,1226=>594,1227=>617,1228=>532,1229=>776,1230=>679,1231=>250,1232=>615, +1233=>551,1234=>615,1235=>551,1236=>876,1237=>896,1238=>568,1239=>554,1240=>708,1241=>554,1242=>708, +1243=>554,1244=>969,1245=>811,1246=>577,1247=>479,1248=>599,1249=>520,1250=>673,1251=>584,1252=>673, +1253=>584,1254=>708,1255=>550,1256=>708,1257=>550,1258=>708,1259=>550,1260=>628,1261=>494,1262=>548, +1263=>532,1264=>548,1265=>532,1266=>548,1267=>532,1268=>617,1269=>532,1270=>501,1271=>442,1272=>736, +1273=>710,1274=>607,1275=>500,1276=>616,1277=>532,1278=>616,1279=>532,1280=>617,1281=>530,1282=>905, +1283=>807,1284=>877,1285=>782,1286=>611,1287=>529,1288=>964,1289=>861,1290=>1001,1291=>870,1292=>697, +1293=>593,1294=>695,1295=>640,1296=>553,1297=>486,1298=>677,1299=>575,1300=>1076,1301=>896,1302=>810, +1303=>780,1304=>927,1305=>890,1306=>708,1307=>571,1308=>890,1309=>736,1312=>1002,1313=>848,1314=>1002, +1315=>854,1316=>713,1317=>614,1329=>780,1330=>659,1331=>794,1332=>794,1333=>659,1334=>579,1335=>613, +1336=>659,1337=>765,1338=>794,1339=>659,1340=>501,1341=>741,1342=>888,1343=>659,1344=>636,1345=>579, +1346=>794,1347=>699,1348=>794,1349=>659,1350=>756,1351=>659,1352=>659,1353=>659,1354=>711,1355=>579, +1356=>794,1357=>659,1358=>794,1359=>571,1360=>659,1361=>659,1362=>719,1363=>774,1364=>711,1365=>708, +1366=>571,1369=>276,1370=>286,1371=>450,1372=>450,1373=>352,1374=>474,1375=>450,1377=>876,1378=>570, +1379=>686,1380=>690,1381=>570,1382=>627,1383=>479,1384=>570,1385=>630,1386=>627,1387=>570,1388=>363, +1389=>804,1390=>576,1391=>570,1392=>570,1393=>571,1394=>631,1395=>570,1396=>593,1397=>250,1398=>684, +1399=>464,1400=>570,1401=>407,1402=>876,1403=>464,1404=>691,1405=>570,1406=>626,1407=>876,1408=>570, +1409=>571,1410=>451,1411=>876,1412=>583,1413=>550,1414=>566,1415=>686,1417=>303,1418=>390,1456=>0, +1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0, +1467=>0,1468=>0,1469=>0,1470=>325,1471=>0,1472=>265,1473=>0,1474=>0,1475=>265,1478=>410, +1479=>0,1488=>566,1489=>547,1490=>403,1491=>534,1492=>576,1493=>245,1494=>336,1495=>576,1496=>583, +1497=>245,1498=>532,1499=>500,1500=>539,1501=>576,1502=>593,1503=>245,1504=>397,1505=>629,1506=>506, +1507=>576,1508=>543,1509=>468,1510=>523,1511=>596,1512=>532,1513=>727,1514=>591,1520=>423,1521=>409, +1522=>423,1523=>374,1524=>580,3647=>586,3713=>603,3714=>615,3716=>619,3719=>434,3720=>565,3722=>615, +3725=>619,3732=>577,3733=>577,3734=>605,3735=>589,3737=>576,3738=>533,3739=>533,3740=>670,3741=>690, +3742=>618,3743=>618,3745=>631,3746=>619,3747=>615,3749=>584,3751=>569,3754=>633,3755=>737,3757=>569, +3758=>615,3759=>708,3760=>569,3761=>0,3762=>485,3763=>485,3764=>0,3765=>0,3766=>0,3767=>0, +3768=>0,3769=>0,3771=>0,3772=>0,3773=>597,3776=>324,3777=>611,3778=>414,3779=>492,3780=>442, +3782=>606,3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>572,3793=>576,3794=>576, +3795=>603,3796=>563,3797=>563,3798=>633,3799=>603,3800=>606,3801=>609,3804=>925,3805=>925,4256=>756, +4257=>621,4258=>577,4259=>683,4260=>532,4261=>617,4262=>710,4263=>729,4264=>420,4265=>508,4266=>710, +4267=>713,4268=>526,4269=>753,4270=>675,4271=>620,4272=>729,4273=>526,4274=>526,4275=>753,4276=>753, +4277=>581,4278=>543,4279=>526,4280=>536,4281=>526,4282=>649,4283=>715,4284=>526,4285=>510,4286=>526, +4287=>602,4288=>719,4289=>488,4290=>598,4291=>488,4292=>508,4293=>606,4304=>457,4305=>457,4306=>479, +4307=>706,4308=>470,4309=>465,4310=>457,4311=>717,4312=>457,4313=>466,4314=>952,4315=>470,4316=>470, +4317=>704,4318=>466,4319=>470,4320=>713,4321=>470,4322=>590,4323=>471,4324=>709,4325=>470,4326=>704, +4327=>470,4328=>470,4329=>470,4330=>510,4331=>470,4332=>470,4333=>439,4334=>470,4335=>448,4336=>465, +4337=>504,4338=>457,4339=>457,4340=>457,4341=>507,4342=>741,4343=>536,4344=>470,4345=>498,4346=>498, +4347=>527,4348=>273,5121=>615,5122=>615,5123=>615,5124=>615,5125=>692,5126=>692,5127=>692,5129=>692, +5130=>692,5131=>692,5132=>751,5133=>751,5134=>751,5135=>751,5136=>751,5137=>751,5138=>870,5139=>906, +5140=>870,5141=>906,5142=>692,5143=>870,5144=>906,5145=>870,5146=>906,5147=>692,5149=>230,5150=>488, +5151=>381,5152=>381,5153=>350,5154=>350,5155=>354,5156=>350,5157=>419,5158=>347,5159=>230,5160=>350, +5161=>350,5162=>350,5163=>980,5164=>817,5165=>857,5166=>1005,5167=>615,5168=>615,5169=>615,5170=>615, +5171=>656,5172=>656,5173=>656,5175=>656,5176=>656,5177=>656,5178=>751,5179=>615,5180=>751,5181=>751, +5182=>751,5183=>751,5184=>870,5185=>906,5186=>870,5187=>906,5188=>870,5189=>906,5190=>870,5191=>906, +5192=>656,5193=>457,5194=>172,5196=>659,5197=>659,5198=>659,5199=>659,5200=>657,5201=>657,5202=>657, +5204=>657,5205=>657,5206=>657,5207=>829,5208=>800,5209=>829,5210=>800,5211=>829,5212=>800,5213=>835, +5214=>810,5215=>835,5216=>810,5217=>853,5218=>810,5219=>853,5220=>810,5221=>853,5222=>391,5223=>790, +5224=>790,5225=>779,5226=>801,5227=>565,5228=>565,5229=>565,5230=>565,5231=>565,5232=>565,5233=>565, +5234=>565,5235=>565,5236=>773,5237=>693,5238=>733,5239=>734,5240=>733,5241=>734,5242=>773,5243=>693, +5244=>773,5245=>693,5246=>733,5247=>734,5248=>733,5249=>734,5250=>733,5251=>366,5252=>366,5253=>675, +5254=>697,5255=>675,5256=>697,5257=>565,5258=>565,5259=>565,5260=>565,5261=>565,5262=>565,5263=>565, +5264=>565,5265=>565,5266=>773,5267=>693,5268=>733,5269=>734,5270=>733,5271=>734,5272=>773,5273=>693, +5274=>773,5275=>693,5276=>733,5277=>734,5278=>733,5279=>734,5280=>733,5281=>391,5282=>391,5283=>549, +5284=>501,5285=>501,5286=>501,5287=>549,5288=>549,5289=>549,5290=>501,5291=>501,5292=>674,5293=>691, +5294=>671,5295=>687,5296=>671,5297=>687,5298=>674,5299=>691,5300=>674,5301=>691,5302=>671,5303=>687, +5304=>671,5305=>687,5306=>671,5307=>347,5308=>457,5309=>347,5312=>766,5313=>766,5314=>766,5315=>766, +5316=>766,5317=>766,5318=>766,5319=>766,5320=>766,5321=>962,5322=>931,5323=>953,5324=>766,5325=>953, +5326=>766,5327=>766,5328=>540,5329=>407,5330=>540,5331=>766,5332=>766,5333=>766,5334=>766,5335=>766, +5336=>766,5337=>766,5338=>766,5339=>766,5340=>962,5341=>931,5342=>953,5343=>927,5344=>953,5345=>927, +5346=>962,5347=>931,5348=>962,5349=>931,5350=>975,5351=>927,5352=>975,5353=>927,5354=>540,5356=>656, +5357=>542,5358=>542,5359=>542,5360=>542,5361=>542,5362=>542,5363=>542,5364=>542,5365=>542,5366=>751, +5367=>678,5368=>712,5369=>694,5370=>712,5371=>694,5372=>751,5373=>678,5374=>751,5375=>678,5376=>712, +5377=>694,5378=>712,5379=>694,5380=>712,5381=>376,5382=>378,5383=>376,5392=>641,5393=>641,5394=>641, +5395=>802,5396=>802,5397=>802,5398=>802,5399=>818,5400=>785,5401=>818,5402=>785,5403=>818,5404=>785, +5405=>1026,5406=>989,5407=>1026,5408=>989,5409=>1026,5410=>989,5411=>1026,5412=>989,5413=>576,5414=>564, +5415=>564,5416=>564,5417=>564,5418=>564,5419=>564,5420=>564,5421=>564,5422=>564,5423=>760,5424=>703, +5425=>734,5426=>736,5427=>734,5428=>736,5429=>760,5430=>703,5431=>760,5432=>703,5433=>734,5434=>736, +5435=>734,5436=>736,5437=>734,5438=>376,5440=>350,5441=>436,5442=>824,5443=>824,5444=>776,5445=>824, +5446=>776,5447=>776,5448=>542,5449=>542,5450=>542,5451=>542,5452=>542,5453=>542,5454=>751,5455=>678, +5456=>376,5458=>656,5459=>615,5460=>615,5461=>615,5462=>615,5463=>653,5464=>653,5465=>653,5466=>653, +5467=>831,5468=>906,5469=>457,5470=>659,5471=>659,5472=>659,5473=>659,5474=>659,5475=>659,5476=>657, +5477=>657,5478=>657,5479=>657,5480=>853,5481=>810,5482=>457,5492=>747,5493=>747,5494=>747,5495=>747, +5496=>747,5497=>747,5498=>747,5499=>507,5500=>677,5501=>436,5502=>942,5503=>942,5504=>942,5505=>942, +5506=>942,5507=>942,5508=>942,5509=>743,5514=>747,5515=>747,5516=>747,5517=>747,5518=>1133,5519=>1133, +5520=>1133,5521=>901,5522=>901,5523=>1133,5524=>1133,5525=>629,5526=>965,5536=>766,5537=>766,5538=>719, +5539=>719,5540=>719,5541=>719,5542=>540,5543=>579,5544=>579,5545=>579,5546=>579,5547=>579,5548=>579, +5549=>579,5550=>376,5551=>565,5598=>693,5601=>693,5702=>421,5703=>421,5742=>399,5743=>942,5744=>1178, +5745=>1469,5746=>1469,5747=>1237,5748=>1237,5749=>1469,5750=>1469,7424=>532,7425=>646,7426=>883,7427=>527, +7428=>495,7429=>544,7430=>544,7431=>441,7432=>486,7433=>250,7434=>355,7435=>521,7436=>524,7437=>679, +7438=>584,7439=>550,7440=>495,7441=>615,7442=>615,7443=>615,7444=>920,7446=>550,7447=>550,7448=>472, +7449=>541,7450=>541,7451=>524,7452=>517,7453=>663,7454=>853,7455=>574,7456=>532,7457=>736,7458=>472, +7459=>473,7462=>524,7463=>532,7464=>507,7465=>472,7466=>531,7467=>575,7468=>387,7469=>552,7470=>389, +7472=>436,7473=>358,7474=>358,7475=>439,7476=>426,7477=>167,7478=>167,7479=>372,7480=>315,7481=>489, +7482=>424,7483=>424,7484=>446,7485=>396,7486=>342,7487=>394,7488=>346,7489=>415,7490=>560,7491=>352, +7492=>352,7493=>365,7494=>583,7495=>385,7496=>365,7497=>375,7498=>375,7499=>324,7500=>323,7501=>365, +7502=>161,7503=>383,7504=>561,7505=>368,7506=>372,7507=>333,7508=>372,7509=>372,7510=>385,7511=>265, +7512=>364,7513=>422,7514=>561,7515=>375,7517=>361,7518=>335,7519=>347,7520=>374,7521=>327,7522=>161, +7523=>233,7524=>364,7525=>375,7526=>361,7527=>335,7528=>370,7529=>374,7530=>327,7543=>571,7544=>426, +7547=>334,7557=>250,7579=>365,7580=>333,7581=>333,7582=>372,7583=>324,7584=>267,7585=>209,7586=>365, +7587=>364,7588=>235,7589=>224,7590=>234,7591=>235,7592=>211,7593=>224,7594=>211,7595=>338,7596=>561, +7597=>561,7598=>369,7599=>431,7600=>368,7601=>372,7602=>372,7603=>324,7604=>258,7605=>265,7606=>457, +7607=>376,7608=>325,7609=>365,7610=>375,7611=>330,7612=>393,7613=>330,7614=>353,7615=>372,7620=>0, +7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>615,7681=>551,7682=>617,7683=>571,7684=>617, +7685=>571,7686=>617,7687=>571,7688=>628,7689=>495,7690=>693,7691=>571,7692=>693,7693=>571,7694=>693, +7695=>571,7696=>693,7697=>571,7698=>693,7699=>571,7700=>568,7701=>554,7702=>568,7703=>554,7704=>568, +7705=>554,7706=>568,7707=>554,7708=>568,7709=>554,7710=>518,7711=>316,7712=>697,7713=>571,7714=>677, +7715=>570,7716=>677,7717=>570,7718=>677,7719=>570,7720=>677,7721=>570,7722=>677,7723=>570,7724=>265, +7725=>250,7726=>265,7727=>250,7728=>590,7729=>521,7730=>590,7731=>521,7732=>590,7733=>521,7734=>501, +7735=>250,7736=>501,7737=>250,7738=>501,7739=>250,7740=>501,7741=>250,7742=>776,7743=>876,7744=>776, +7745=>876,7746=>776,7747=>876,7748=>673,7749=>570,7750=>673,7751=>570,7752=>673,7753=>570,7754=>673, +7755=>570,7756=>708,7757=>550,7758=>708,7759=>550,7760=>708,7761=>550,7762=>708,7763=>550,7764=>542, +7765=>571,7766=>542,7767=>571,7768=>625,7769=>370,7770=>625,7771=>370,7772=>625,7773=>370,7774=>625, +7775=>370,7776=>571,7777=>469,7778=>571,7779=>469,7780=>571,7781=>469,7782=>571,7783=>469,7784=>571, +7785=>469,7786=>549,7787=>353,7788=>549,7789=>353,7790=>549,7791=>353,7792=>549,7793=>353,7794=>659, +7795=>570,7796=>659,7797=>570,7798=>659,7799=>570,7800=>659,7801=>570,7802=>659,7803=>570,7804=>615, +7805=>532,7806=>615,7807=>532,7808=>890,7809=>736,7810=>890,7811=>736,7812=>890,7813=>736,7814=>890, +7815=>736,7816=>890,7817=>736,7818=>616,7819=>532,7820=>616,7821=>532,7822=>549,7823=>532,7824=>616, +7825=>472,7826=>616,7827=>472,7828=>616,7829=>472,7830=>570,7831=>353,7832=>736,7833=>532,7834=>551, +7835=>316,7838=>691,7839=>550,7840=>615,7841=>551,7842=>615,7843=>551,7844=>615,7845=>551,7846=>615, +7847=>551,7848=>615,7849=>551,7850=>615,7851=>551,7852=>615,7853=>551,7854=>615,7855=>551,7856=>615, +7857=>551,7858=>615,7859=>551,7860=>615,7861=>551,7862=>615,7863=>551,7864=>568,7865=>554,7866=>568, +7867=>554,7868=>568,7869=>554,7870=>568,7871=>554,7872=>568,7873=>554,7874=>568,7875=>554,7876=>568, +7877=>554,7878=>568,7879=>554,7880=>265,7881=>250,7882=>265,7883=>250,7884=>708,7885=>550,7886=>708, +7887=>550,7888=>708,7889=>550,7890=>708,7891=>550,7892=>708,7893=>550,7894=>708,7895=>550,7896=>708, +7897=>550,7898=>822,7899=>550,7900=>822,7901=>550,7902=>822,7903=>550,7904=>822,7905=>550,7906=>822, +7907=>550,7908=>659,7909=>570,7910=>659,7911=>570,7912=>754,7913=>570,7914=>754,7915=>570,7916=>754, +7917=>570,7918=>754,7919=>570,7920=>754,7921=>570,7922=>549,7923=>532,7924=>549,7925=>532,7926=>549, +7927=>532,7928=>549,7929=>532,7936=>593,7937=>593,7938=>593,7939=>593,7940=>593,7941=>593,7942=>593, +7943=>593,7944=>615,7945=>615,7946=>790,7947=>790,7948=>692,7949=>721,7950=>637,7951=>668,7952=>486, +7953=>486,7954=>486,7955=>486,7956=>486,7957=>486,7960=>640,7961=>640,7962=>869,7963=>877,7964=>809, +7965=>835,7968=>570,7969=>570,7970=>570,7971=>570,7972=>570,7973=>570,7974=>570,7975=>570,7976=>753, +7977=>751,7978=>977,7979=>980,7980=>924,7981=>945,7982=>840,7983=>852,7984=>304,7985=>304,7986=>304, +7987=>304,7988=>304,7989=>304,7990=>304,7991=>304,7992=>342,7993=>336,7994=>571,7995=>571,7996=>513, +7997=>540,7998=>440,7999=>443,8000=>550,8001=>550,8002=>550,8003=>550,8004=>550,8005=>550,8008=>724, +8009=>763,8010=>985,8011=>989,8012=>844,8013=>873,8016=>521,8017=>521,8018=>521,8019=>521,8020=>521, +8021=>521,8022=>521,8023=>521,8025=>705,8027=>897,8029=>911,8031=>808,8032=>753,8033=>753,8034=>753, +8035=>753,8036=>753,8037=>753,8038=>753,8039=>753,8040=>722,8041=>759,8042=>980,8043=>985,8044=>851, +8045=>875,8046=>829,8047=>857,8048=>593,8049=>593,8050=>486,8051=>493,8052=>570,8053=>589,8054=>304, +8055=>304,8056=>550,8057=>550,8058=>521,8059=>521,8060=>753,8061=>753,8064=>593,8065=>593,8066=>593, +8067=>593,8068=>593,8069=>593,8070=>593,8071=>593,8072=>615,8073=>615,8074=>790,8075=>790,8076=>692, +8077=>721,8078=>637,8079=>668,8080=>570,8081=>570,8082=>570,8083=>570,8084=>570,8085=>570,8086=>570, +8087=>570,8088=>753,8089=>751,8090=>977,8091=>980,8092=>924,8093=>945,8094=>840,8095=>852,8096=>753, +8097=>753,8098=>753,8099=>753,8100=>753,8101=>753,8102=>753,8103=>753,8104=>722,8105=>759,8106=>980, +8107=>985,8108=>851,8109=>875,8110=>829,8111=>857,8112=>593,8113=>593,8114=>593,8115=>593,8116=>593, +8118=>593,8119=>593,8120=>615,8121=>615,8122=>645,8123=>623,8124=>615,8125=>450,8126=>450,8127=>450, +8128=>450,8129=>450,8130=>570,8131=>570,8132=>589,8134=>570,8135=>570,8136=>724,8137=>671,8138=>837, +8139=>784,8140=>677,8141=>450,8142=>450,8143=>450,8144=>304,8145=>304,8146=>304,8147=>304,8150=>304, +8151=>304,8152=>265,8153=>265,8154=>427,8155=>367,8157=>450,8158=>450,8159=>450,8160=>521,8161=>521, +8162=>521,8163=>521,8164=>571,8165=>571,8166=>521,8167=>521,8168=>549,8169=>549,8170=>760,8171=>742, +8172=>616,8173=>450,8174=>450,8175=>450,8178=>753,8179=>753,8180=>753,8182=>753,8183=>753,8184=>847, +8185=>731,8186=>830,8187=>743,8188=>688,8189=>450,8190=>450,8192=>450,8193=>900,8194=>450,8195=>900, +8196=>296,8197=>225,8198=>150,8199=>572,8200=>286,8201=>180,8202=>89,8203=>0,8204=>0,8205=>0, +8206=>0,8207=>0,8208=>325,8209=>325,8210=>572,8213=>900,8214=>450,8215=>450,8219=>286,8223=>466, +8227=>531,8228=>299,8229=>600,8231=>286,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>180, +8241=>1521,8242=>204,8243=>336,8244=>468,8245=>204,8246=>336,8247=>468,8248=>305,8251=>754,8252=>437, +8253=>478,8254=>450,8255=>723,8256=>723,8257=>225,8258=>900,8259=>450,8260=>150,8261=>351,8262=>351, +8263=>830,8264=>659,8265=>659,8266=>447,8267=>572,8268=>450,8269=>450,8270=>450,8271=>303,8272=>723, +8273=>450,8274=>404,8275=>900,8276=>723,8277=>754,8278=>527,8279=>597,8280=>754,8281=>754,8282=>286, +8283=>717,8284=>754,8285=>286,8286=>286,8287=>200,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0, +8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>360,8305=>161,8308=>360,8309=>360, +8310=>360,8311=>360,8312=>360,8313=>360,8314=>475,8315=>475,8316=>475,8317=>221,8318=>221,8319=>359, +8320=>360,8321=>360,8322=>360,8323=>360,8324=>360,8325=>360,8326=>360,8327=>360,8328=>360,8329=>360, +8330=>475,8331=>475,8332=>475,8333=>221,8334=>221,8336=>352,8337=>375,8338=>372,8339=>399,8340=>375, +8352=>789,8353=>572,8354=>572,8355=>572,8356=>572,8357=>876,8358=>673,8359=>1143,8360=>966,8361=>890, +8362=>754,8363=>572,8365=>590,8366=>549,8367=>1145,8368=>572,8369=>572,8370=>572,8371=>572,8372=>696, +8373=>577,8400=>0,8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>873,8449=>873, +8450=>628,8451=>1011,8452=>807,8453=>872,8454=>929,8455=>553,8456=>628,8457=>856,8459=>889,8460=>679, +8461=>765,8462=>570,8463=>570,8464=>422,8465=>627,8466=>648,8467=>372,8468=>736,8469=>721,8470=>936, +8471=>900,8472=>627,8473=>631,8474=>708,8475=>718,8476=>732,8477=>712,8478=>807,8479=>615,8480=>917, +8481=>912,8483=>615,8484=>670,8485=>520,8486=>688,8487=>688,8488=>554,8489=>304,8490=>590,8491=>615, +8492=>708,8493=>633,8494=>769,8495=>532,8496=>545,8497=>708,8498=>518,8499=>962,8500=>416,8501=>670, +8502=>606,8503=>419,8504=>580,8505=>342,8506=>833,8507=>1041,8508=>632,8509=>655,8510=>589,8511=>764, +8512=>729,8513=>697,8514=>501,8515=>501,8516=>549,8517=>737,8518=>637,8519=>554,8520=>316,8521=>316, +8523=>702,8526=>474,8531=>872,8532=>872,8533=>872,8534=>872,8535=>872,8536=>872,8537=>872,8538=>872, +8539=>872,8540=>872,8541=>872,8542=>872,8543=>511,8544=>265,8545=>443,8546=>620,8547=>831,8548=>615, +8549=>830,8550=>1007,8551=>1185,8552=>826,8553=>616,8554=>839,8555=>1018,8556=>501,8557=>628,8558=>693, +8559=>776,8560=>250,8561=>412,8562=>573,8563=>730,8564=>532,8565=>729,8566=>892,8567=>1053,8568=>737, +8569=>532,8570=>740,8571=>901,8572=>250,8573=>495,8574=>571,8575=>876,8576=>1121,8577=>693,8578=>1121, +8579=>633,8580=>494,8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754,8598=>754,8599=>754, +8600=>754,8601=>754,8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754,8608=>754,8609=>754, +8610=>754,8611=>754,8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754,8618=>754,8619=>754, +8620=>754,8621=>754,8622=>754,8623=>754,8624=>754,8625=>754,8626=>754,8627=>754,8628=>754,8629=>754, +8630=>754,8631=>754,8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754,8638=>754,8639=>754, +8640=>754,8641=>754,8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754,8648=>754,8649=>754, +8650=>754,8651=>754,8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754,8658=>754,8659=>754, +8660=>754,8661=>754,8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754,8668=>754,8669=>754, +8670=>754,8671=>754,8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754,8678=>754,8679=>754, +8680=>754,8681=>754,8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754,8688=>754,8689=>754, +8690=>754,8691=>754,8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754,8698=>754,8699=>754, +8700=>754,8701=>754,8702=>754,8703=>754,8704=>615,8705=>572,8706=>465,8707=>568,8708=>568,8709=>784, +8710=>602,8711=>602,8712=>784,8713=>784,8714=>646,8715=>784,8716=>784,8717=>646,8718=>572,8719=>681, +8720=>681,8721=>606,8722=>754,8723=>754,8724=>754,8725=>303,8726=>573,8727=>754,8728=>563,8729=>563, +8730=>573,8731=>573,8732=>573,8733=>643,8734=>750,8735=>754,8736=>807,8737=>807,8738=>754,8739=>450, +8740=>450,8741=>450,8742=>450,8743=>659,8744=>659,8745=>659,8746=>659,8747=>469,8748=>710,8749=>951, +8750=>469,8751=>710,8752=>951,8753=>469,8754=>469,8755=>469,8756=>572,8757=>572,8758=>234,8759=>572, +8760=>754,8761=>754,8762=>754,8763=>754,8764=>754,8765=>754,8766=>754,8767=>754,8768=>337,8769=>754, +8770=>754,8771=>754,8772=>754,8773=>754,8774=>754,8775=>754,8776=>754,8777=>754,8778=>754,8779=>754, +8780=>754,8781=>754,8782=>754,8783=>754,8784=>754,8785=>754,8786=>754,8787=>754,8788=>900,8789=>900, +8790=>754,8791=>754,8792=>754,8793=>754,8794=>754,8795=>754,8796=>754,8797=>754,8798=>754,8799=>754, +8800=>754,8801=>754,8802=>754,8803=>754,8804=>754,8805=>754,8806=>754,8807=>754,8808=>754,8809=>754, +8810=>942,8811=>942,8812=>417,8813=>754,8814=>754,8815=>754,8816=>754,8817=>754,8818=>754,8819=>754, +8820=>754,8821=>754,8822=>754,8823=>754,8824=>754,8825=>754,8826=>754,8827=>754,8828=>754,8829=>754, +8830=>754,8831=>754,8832=>754,8833=>754,8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754, +8840=>754,8841=>754,8842=>754,8843=>754,8844=>659,8845=>659,8846=>659,8847=>754,8848=>754,8849=>754, +8850=>754,8851=>702,8852=>702,8853=>754,8854=>754,8855=>754,8856=>754,8857=>754,8858=>754,8859=>754, +8860=>754,8861=>754,8862=>754,8863=>754,8864=>754,8865=>754,8866=>784,8867=>784,8868=>784,8869=>784, +8870=>468,8871=>468,8872=>784,8873=>784,8874=>784,8875=>784,8876=>784,8877=>784,8878=>784,8879=>784, +8880=>754,8881=>754,8882=>754,8883=>754,8884=>754,8885=>754,8886=>900,8887=>900,8888=>754,8889=>754, +8890=>468,8891=>659,8892=>659,8893=>659,8894=>754,8895=>754,8896=>738,8897=>738,8898=>738,8899=>738, +8900=>444,8901=>286,8902=>563,8903=>754,8904=>900,8905=>900,8906=>900,8907=>900,8908=>900,8909=>754, +8910=>659,8911=>659,8912=>754,8913=>754,8914=>754,8915=>754,8916=>754,8917=>754,8918=>754,8919=>754, +8920=>1280,8921=>1280,8922=>754,8923=>754,8924=>754,8925=>754,8926=>754,8927=>754,8928=>754,8929=>754, +8930=>754,8931=>754,8932=>754,8933=>754,8934=>754,8935=>754,8936=>754,8937=>754,8938=>754,8939=>754, +8940=>754,8941=>754,8942=>900,8943=>900,8944=>900,8945=>900,8946=>900,8947=>784,8948=>646,8949=>784, +8950=>784,8951=>646,8952=>784,8953=>784,8954=>900,8955=>784,8956=>646,8957=>784,8958=>646,8959=>784, +8960=>542,8961=>542,8962=>571,8963=>754,8964=>754,8965=>754,8966=>754,8967=>439,8968=>351,8969=>351, +8970=>351,8971=>351,8972=>728,8973=>728,8974=>728,8975=>728,8976=>754,8977=>461,8984=>900,8985=>754, +8988=>422,8989=>422,8990=>422,8991=>422,8992=>469,8993=>469,8996=>1037,8997=>1037,8998=>1272,8999=>1037, +9000=>1299,9003=>1272,9004=>786,9075=>304,9076=>571,9077=>753,9082=>593,9085=>681,9095=>1037,9108=>786, +9115=>450,9116=>450,9117=>450,9118=>450,9119=>450,9120=>450,9121=>450,9122=>450,9123=>450,9124=>450, +9125=>450,9126=>450,9127=>675,9128=>675,9129=>675,9130=>675,9131=>675,9132=>675,9133=>675,9134=>469, +9166=>754,9167=>850,9187=>786,9189=>692,9250=>571,9251=>571,9312=>807,9313=>807,9314=>807,9315=>807, +9316=>807,9317=>807,9318=>807,9319=>807,9320=>807,9321=>807,9472=>542,9473=>542,9474=>542,9475=>542, +9476=>542,9477=>542,9478=>542,9479=>542,9480=>542,9481=>542,9482=>542,9483=>542,9484=>542,9485=>542, +9486=>542,9487=>542,9488=>542,9489=>542,9490=>542,9491=>542,9492=>542,9493=>542,9494=>542,9495=>542, +9496=>542,9497=>542,9498=>542,9499=>542,9500=>542,9501=>542,9502=>542,9503=>542,9504=>542,9505=>542, +9506=>542,9507=>542,9508=>542,9509=>542,9510=>542,9511=>542,9512=>542,9513=>542,9514=>542,9515=>542, +9516=>542,9517=>542,9518=>542,9519=>542,9520=>542,9521=>542,9522=>542,9523=>542,9524=>542,9525=>542, +9526=>542,9527=>542,9528=>542,9529=>542,9530=>542,9531=>542,9532=>542,9533=>542,9534=>542,9535=>542, +9536=>542,9537=>542,9538=>542,9539=>542,9540=>542,9541=>542,9542=>542,9543=>542,9544=>542,9545=>542, +9546=>542,9547=>542,9548=>542,9549=>542,9550=>542,9551=>542,9552=>542,9553=>542,9554=>542,9555=>542, +9556=>542,9557=>542,9558=>542,9559=>542,9560=>542,9561=>542,9562=>542,9563=>542,9564=>542,9565=>542, +9566=>542,9567=>542,9568=>542,9569=>542,9570=>542,9571=>542,9572=>542,9573=>542,9574=>542,9575=>542, +9576=>542,9577=>542,9578=>542,9579=>542,9580=>542,9581=>542,9582=>542,9583=>542,9584=>542,9585=>542, +9586=>542,9587=>542,9588=>542,9589=>542,9590=>542,9591=>542,9592=>542,9593=>542,9594=>542,9595=>542, +9596=>542,9597=>542,9598=>542,9599=>542,9600=>692,9601=>692,9602=>692,9603=>692,9604=>692,9605=>692, +9606=>692,9607=>692,9608=>692,9609=>692,9610=>692,9611=>692,9612=>692,9613=>692,9614=>692,9615=>692, +9616=>692,9617=>692,9618=>692,9619=>692,9620=>692,9621=>692,9622=>692,9623=>692,9624=>692,9625=>692, +9626=>692,9627=>692,9628=>692,9629=>692,9630=>692,9631=>692,9632=>850,9633=>850,9634=>850,9635=>850, +9636=>850,9637=>850,9638=>850,9639=>850,9640=>850,9641=>850,9642=>610,9643=>610,9644=>850,9645=>850, +9646=>495,9647=>495,9648=>692,9649=>692,9650=>692,9651=>692,9652=>452,9653=>452,9654=>692,9655=>692, +9656=>452,9657=>452,9658=>692,9659=>692,9660=>692,9661=>692,9662=>452,9663=>452,9664=>692,9665=>692, +9666=>452,9667=>452,9668=>692,9669=>692,9670=>692,9671=>692,9672=>692,9673=>785,9674=>444,9675=>785, +9676=>785,9677=>785,9678=>785,9679=>785,9680=>785,9681=>785,9682=>785,9683=>785,9684=>785,9685=>785, +9686=>474,9687=>474,9688=>712,9689=>873,9690=>873,9691=>873,9692=>348,9693=>348,9694=>348,9695=>348, +9696=>692,9697=>692,9698=>692,9699=>692,9700=>692,9701=>692,9702=>531,9703=>850,9704=>850,9705=>850, +9706=>850,9707=>850,9708=>692,9709=>692,9710=>692,9711=>1007,9712=>850,9713=>850,9714=>850,9715=>850, +9716=>785,9717=>785,9718=>785,9719=>785,9720=>692,9721=>692,9722=>692,9723=>747,9724=>747,9725=>659, +9726=>659,9727=>692,9728=>807,9729=>900,9730=>807,9731=>807,9732=>807,9733=>807,9734=>807,9735=>515, +9736=>806,9737=>807,9738=>799,9739=>799,9740=>604,9741=>911,9742=>1121,9743=>1125,9744=>807,9745=>807, +9746=>807,9747=>479,9748=>807,9749=>807,9750=>807,9751=>807,9752=>807,9753=>807,9754=>807,9755=>807, +9756=>807,9757=>548,9758=>807,9759=>548,9760=>807,9761=>807,9762=>807,9763=>807,9764=>602,9765=>671, +9766=>584,9767=>705,9768=>490,9769=>807,9770=>807,9771=>807,9772=>639,9773=>807,9774=>807,9775=>807, +9776=>800,9777=>800,9778=>800,9779=>800,9780=>800,9781=>800,9782=>800,9783=>800,9784=>807,9785=>807, +9786=>807,9787=>807,9788=>807,9789=>807,9790=>807,9791=>552,9792=>658,9793=>658,9794=>807,9795=>807, +9796=>807,9797=>807,9798=>807,9799=>807,9800=>807,9801=>807,9802=>807,9803=>807,9804=>807,9805=>807, +9806=>807,9807=>807,9808=>807,9809=>807,9810=>807,9811=>807,9812=>807,9813=>807,9814=>807,9815=>807, +9816=>807,9817=>807,9818=>807,9819=>807,9820=>807,9821=>807,9822=>807,9823=>807,9824=>807,9825=>807, +9826=>807,9827=>807,9828=>807,9829=>807,9830=>807,9831=>807,9832=>807,9833=>424,9834=>574,9835=>807, +9836=>807,9837=>424,9838=>321,9839=>435,9840=>673,9841=>689,9842=>807,9843=>807,9844=>807,9845=>807, +9846=>807,9847=>807,9848=>807,9849=>807,9850=>807,9851=>807,9852=>807,9853=>807,9854=>807,9855=>807, +9856=>782,9857=>782,9858=>782,9859=>782,9860=>782,9861=>782,9862=>800,9863=>800,9864=>800,9865=>800, +9866=>800,9867=>800,9868=>800,9869=>800,9870=>800,9871=>800,9872=>675,9873=>675,9874=>800,9875=>734, +9876=>644,9877=>483,9878=>766,9879=>800,9880=>615,9881=>800,9882=>637,9883=>800,9884=>800,9888=>800, +9889=>632,9890=>903,9891=>977,9892=>1028,9893=>811,9894=>754,9895=>754,9896=>754,9897=>754,9898=>754, +9899=>754,9900=>754,9901=>754,9902=>754,9903=>754,9904=>759,9905=>754,9906=>658,9907=>659,9908=>659, +9909=>659,9910=>765,9911=>659,9912=>659,9985=>754,9986=>754,9987=>754,9988=>754,9990=>754,9991=>754, +9992=>754,9993=>754,9996=>754,9997=>754,9998=>754,9999=>754,10000=>754,10001=>754,10002=>754,10003=>754, +10004=>754,10005=>754,10006=>754,10007=>754,10008=>754,10009=>754,10010=>754,10011=>754,10012=>754,10013=>754, +10014=>754,10015=>754,10016=>754,10017=>754,10018=>754,10019=>754,10020=>754,10021=>754,10022=>754,10023=>754, +10025=>754,10026=>754,10027=>754,10028=>754,10029=>754,10030=>754,10031=>754,10032=>754,10033=>754,10034=>754, +10035=>754,10036=>754,10037=>754,10038=>754,10039=>754,10040=>754,10041=>754,10042=>754,10043=>754,10044=>754, +10045=>754,10046=>754,10047=>754,10048=>754,10049=>754,10050=>754,10051=>754,10052=>754,10053=>754,10054=>754, +10055=>754,10056=>754,10057=>754,10058=>754,10059=>754,10061=>807,10063=>807,10064=>807,10065=>807,10066=>807, +10070=>807,10072=>754,10073=>754,10074=>754,10075=>290,10076=>290,10077=>484,10078=>484,10081=>754,10082=>754, +10083=>754,10084=>754,10085=>754,10086=>754,10087=>754,10088=>754,10089=>754,10090=>754,10091=>754,10092=>754, +10093=>754,10094=>754,10095=>754,10096=>754,10097=>754,10098=>754,10099=>754,10100=>754,10101=>754,10102=>807, +10103=>807,10104=>807,10105=>807,10106=>807,10107=>807,10108=>807,10109=>807,10110=>807,10111=>807,10112=>754, +10113=>754,10114=>754,10115=>754,10116=>754,10117=>754,10118=>754,10119=>754,10120=>754,10121=>754,10122=>754, +10123=>754,10124=>754,10125=>754,10126=>754,10127=>754,10128=>754,10129=>754,10130=>754,10131=>754,10132=>754, +10136=>754,10137=>754,10138=>754,10139=>754,10140=>754,10141=>754,10142=>754,10143=>754,10144=>754,10145=>754, +10146=>754,10147=>754,10148=>754,10149=>754,10150=>754,10151=>754,10152=>754,10153=>754,10154=>754,10155=>754, +10156=>754,10157=>754,10158=>754,10159=>754,10161=>754,10162=>754,10163=>754,10164=>754,10165=>754,10166=>754, +10167=>754,10168=>754,10169=>754,10170=>754,10171=>754,10172=>754,10173=>754,10174=>754,10181=>351,10182=>351, +10208=>444,10214=>445,10215=>445,10216=>351,10217=>351,10218=>500,10219=>500,10224=>754,10225=>754,10226=>754, +10227=>754,10228=>1042,10229=>1290,10230=>1290,10231=>1290,10232=>1290,10233=>1290,10234=>1290,10235=>1290,10236=>1290, +10237=>1290,10238=>1290,10239=>1290,10240=>659,10241=>659,10242=>659,10243=>659,10244=>659,10245=>659,10246=>659, +10247=>659,10248=>659,10249=>659,10250=>659,10251=>659,10252=>659,10253=>659,10254=>659,10255=>659,10256=>659, +10257=>659,10258=>659,10259=>659,10260=>659,10261=>659,10262=>659,10263=>659,10264=>659,10265=>659,10266=>659, +10267=>659,10268=>659,10269=>659,10270=>659,10271=>659,10272=>659,10273=>659,10274=>659,10275=>659,10276=>659, +10277=>659,10278=>659,10279=>659,10280=>659,10281=>659,10282=>659,10283=>659,10284=>659,10285=>659,10286=>659, +10287=>659,10288=>659,10289=>659,10290=>659,10291=>659,10292=>659,10293=>659,10294=>659,10295=>659,10296=>659, +10297=>659,10298=>659,10299=>659,10300=>659,10301=>659,10302=>659,10303=>659,10304=>659,10305=>659,10306=>659, +10307=>659,10308=>659,10309=>659,10310=>659,10311=>659,10312=>659,10313=>659,10314=>659,10315=>659,10316=>659, +10317=>659,10318=>659,10319=>659,10320=>659,10321=>659,10322=>659,10323=>659,10324=>659,10325=>659,10326=>659, +10327=>659,10328=>659,10329=>659,10330=>659,10331=>659,10332=>659,10333=>659,10334=>659,10335=>659,10336=>659, +10337=>659,10338=>659,10339=>659,10340=>659,10341=>659,10342=>659,10343=>659,10344=>659,10345=>659,10346=>659, +10347=>659,10348=>659,10349=>659,10350=>659,10351=>659,10352=>659,10353=>659,10354=>659,10355=>659,10356=>659, +10357=>659,10358=>659,10359=>659,10360=>659,10361=>659,10362=>659,10363=>659,10364=>659,10365=>659,10366=>659, +10367=>659,10368=>659,10369=>659,10370=>659,10371=>659,10372=>659,10373=>659,10374=>659,10375=>659,10376=>659, +10377=>659,10378=>659,10379=>659,10380=>659,10381=>659,10382=>659,10383=>659,10384=>659,10385=>659,10386=>659, +10387=>659,10388=>659,10389=>659,10390=>659,10391=>659,10392=>659,10393=>659,10394=>659,10395=>659,10396=>659, +10397=>659,10398=>659,10399=>659,10400=>659,10401=>659,10402=>659,10403=>659,10404=>659,10405=>659,10406=>659, +10407=>659,10408=>659,10409=>659,10410=>659,10411=>659,10412=>659,10413=>659,10414=>659,10415=>659,10416=>659, +10417=>659,10418=>659,10419=>659,10420=>659,10421=>659,10422=>659,10423=>659,10424=>659,10425=>659,10426=>659, +10427=>659,10428=>659,10429=>659,10430=>659,10431=>659,10432=>659,10433=>659,10434=>659,10435=>659,10436=>659, +10437=>659,10438=>659,10439=>659,10440=>659,10441=>659,10442=>659,10443=>659,10444=>659,10445=>659,10446=>659, +10447=>659,10448=>659,10449=>659,10450=>659,10451=>659,10452=>659,10453=>659,10454=>659,10455=>659,10456=>659, +10457=>659,10458=>659,10459=>659,10460=>659,10461=>659,10462=>659,10463=>659,10464=>659,10465=>659,10466=>659, +10467=>659,10468=>659,10469=>659,10470=>659,10471=>659,10472=>659,10473=>659,10474=>659,10475=>659,10476=>659, +10477=>659,10478=>659,10479=>659,10480=>659,10481=>659,10482=>659,10483=>659,10484=>659,10485=>659,10486=>659, +10487=>659,10488=>659,10489=>659,10490=>659,10491=>659,10492=>659,10493=>659,10494=>659,10495=>659,10502=>754, +10503=>754,10506=>754,10507=>754,10560=>615,10561=>615,10627=>660,10628=>660,10702=>754,10703=>900,10704=>900, +10705=>900,10706=>900,10707=>900,10708=>900,10709=>900,10731=>444,10746=>754,10747=>754,10752=>900,10753=>900, +10754=>900,10764=>1192,10765=>469,10766=>469,10767=>469,10768=>469,10769=>469,10770=>469,10771=>469,10772=>469, +10773=>469,10774=>469,10775=>469,10776=>469,10777=>469,10778=>469,10779=>469,10780=>469,10799=>754,10877=>754, +10878=>754,10879=>754,10880=>754,10881=>754,10882=>754,10883=>754,10884=>754,10885=>754,10886=>754,10887=>754, +10888=>754,10889=>754,10890=>754,10891=>754,10892=>754,10893=>754,10894=>754,10895=>754,10896=>754,10897=>754, +10898=>754,10899=>754,10900=>754,10901=>754,10902=>754,10903=>754,10904=>754,10905=>754,10906=>754,10907=>754, +10908=>754,10909=>754,10910=>754,10911=>754,10912=>754,10926=>754,10927=>754,10928=>754,10929=>754,10930=>754, +10931=>754,10932=>754,10933=>754,10934=>754,10935=>754,10936=>754,10937=>754,10938=>754,11001=>754,11002=>754, +11008=>754,11009=>754,11010=>754,11011=>754,11012=>754,11013=>754,11014=>754,11015=>754,11016=>754,11017=>754, +11018=>754,11019=>754,11020=>754,11021=>754,11022=>752,11023=>752,11024=>752,11025=>752,11026=>850,11027=>850, +11028=>850,11029=>850,11030=>692,11031=>692,11032=>692,11033=>692,11034=>850,11039=>782,11040=>782,11041=>786, +11042=>786,11043=>786,11044=>1007,11091=>782,11092=>782,11360=>501,11361=>250,11362=>501,11363=>542,11364=>625, +11365=>551,11366=>353,11367=>677,11368=>570,11369=>590,11370=>521,11371=>616,11372=>472,11373=>703,11374=>776, +11375=>615,11377=>661,11378=>1015,11379=>865,11380=>532,11381=>589,11382=>511,11383=>593,11385=>373,11386=>550, +11387=>441,11388=>157,11389=>387,11800=>478,11810=>351,11811=>351,11812=>351,11813=>351,11822=>478,19904=>807, +19905=>807,19906=>807,19907=>807,19908=>807,19909=>807,19910=>807,19911=>807,19912=>807,19913=>807,19914=>807, +19915=>807,19916=>807,19917=>807,19918=>807,19919=>807,19920=>807,19921=>807,19922=>807,19923=>807,19924=>807, +19925=>807,19926=>807,19927=>807,19928=>807,19929=>807,19930=>807,19931=>807,19932=>807,19933=>807,19934=>807, +19935=>807,19936=>807,19937=>807,19938=>807,19939=>807,19940=>807,19941=>807,19942=>807,19943=>807,19944=>807, +19945=>807,19946=>807,19947=>807,19948=>807,19949=>807,19950=>807,19951=>807,19952=>807,19953=>807,19954=>807, +19955=>807,19956=>807,19957=>807,19958=>807,19959=>807,19960=>807,19961=>807,19962=>807,19963=>807,19964=>807, +19965=>807,19966=>807,19967=>807,42564=>571,42565=>469,42566=>318,42567=>304,42572=>1062,42573=>925,42576=>926, +42577=>815,42580=>971,42581=>757,42582=>886,42583=>762,42594=>922,42595=>833,42596=>912,42597=>810,42598=>776, +42599=>907,42600=>708,42601=>550,42602=>770,42603=>641,42604=>1222,42605=>917,42606=>791,42634=>725,42635=>649, +42636=>549,42637=>524,42644=>617,42645=>570,42760=>444,42761=>444,42762=>444,42763=>444,42764=>444,42765=>444, +42766=>444,42767=>444,42768=>444,42769=>444,42770=>444,42771=>444,42772=>444,42773=>444,42774=>444,42779=>332, +42780=>332,42781=>227,42782=>227,42783=>227,42790=>677,42791=>570,42792=>790,42793=>638,42794=>553,42795=>486, +42800=>441,42801=>469,42802=>1125,42803=>886,42804=>1097,42805=>900,42806=>1039,42807=>896,42808=>874,42809=>736, +42810=>874,42811=>736,42812=>863,42813=>736,42814=>628,42815=>494,42822=>612,42823=>353,42824=>523,42825=>384, +42826=>726,42827=>633,42830=>1222,42831=>917,42880=>501,42881=>250,42882=>662,42883=>570,42889=>303,42890=>338, +42891=>360,42892=>247,43003=>518,43004=>542,43005=>776,43006=>265,43007=>1079,63173=>550,64256=>649,64257=>581, +64258=>581,64259=>899,64260=>899,64261=>617,64262=>774,64275=>1081,64276=>1081,64277=>1076,64278=>1067,64279=>1376, +64285=>245,64286=>0,64287=>423,64288=>572,64289=>770,64290=>696,64291=>815,64292=>694,64293=>759,64294=>769, +64295=>726,64296=>788,64297=>754,64298=>727,64299=>727,64300=>727,64301=>727,64302=>566,64303=>566,64304=>566, +64305=>547,64306=>403,64307=>534,64308=>576,64309=>245,64310=>336,64311=>900,64312=>583,64313=>302,64314=>532, +64315=>500,64316=>539,64318=>593,64320=>397,64321=>629,64323=>576,64324=>543,64326=>523,64327=>596,64328=>532, +64329=>727,64330=>591,64331=>245,64332=>547,64333=>500,64334=>543,64335=>566,65024=>0,65025=>0,65026=>0, +65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0, +65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0,65059=>0,65529=>0,65530=>0,65531=>0, +65532=>0,65533=>923); +$enc=''; +$diff=''; +$file='dejavusanscondensedi.z'; +$ctg='dejavusanscondensedi.ctg.z'; +$originalsize=488440; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedi.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedi.z new file mode 100644 index 0000000..cf9052b Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusanscondensedi.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansi.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansi.ctg.z new file mode 100644 index 0000000..ac628b3 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansi.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansi.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansi.php new file mode 100644 index 0000000..2ff3c59 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansi.php @@ -0,0 +1,471 @@ +<?php +$type='TrueTypeUnicode'; +$name='DejaVuSans-Oblique'; +$desc=array('Ascent'=>928,'Descent'=>-236,'CapHeight'=>-43,'Flags'=>96,'FontBBox'=>'[-1016 -350 1659 1068]','ItalicAngle'=>-11,'StemV'=>70,'MissingWidth'=>600); +$up=-63; +$ut=44; +$dw=600; +$cw=array( +0=>600,32=>318,33=>401,34=>460,35=>838,36=>636,37=>950,38=>780,39=>275,40=>390, +41=>390,42=>500,43=>838,44=>318,45=>361,46=>318,47=>337,48=>636,49=>636,50=>636, +51=>636,52=>636,53=>636,54=>636,55=>636,56=>636,57=>636,58=>337,59=>337,60=>838, +61=>838,62=>838,63=>531,64=>1000,65=>684,66=>686,67=>698,68=>770,69=>632,70=>575, +71=>775,72=>752,73=>295,74=>295,75=>656,76=>557,77=>863,78=>748,79=>787,80=>603, +81=>787,82=>695,83=>635,84=>611,85=>732,86=>684,87=>989,88=>685,89=>611,90=>685, +91=>390,92=>337,93=>390,94=>838,95=>500,96=>500,97=>613,98=>635,99=>550,100=>635, +101=>615,102=>352,103=>635,104=>634,105=>278,106=>278,107=>579,108=>278,109=>974,110=>634, +111=>612,112=>635,113=>635,114=>411,115=>521,116=>392,117=>634,118=>592,119=>818,120=>592, +121=>592,122=>525,123=>636,124=>337,125=>636,126=>838,8364=>636,8218=>318,402=>352,8222=>518, +8230=>1000,8224=>500,8225=>500,710=>500,8240=>1350,352=>635,8249=>400,338=>1070,381=>685,8216=>318, +8217=>318,8220=>518,8221=>518,8226=>590,8211=>500,8212=>1000,732=>500,8482=>1000,353=>521,8250=>400, +339=>1028,382=>525,376=>611,160=>318,161=>401,162=>636,163=>636,164=>636,165=>636,166=>337, +167=>500,168=>500,169=>1000,170=>471,171=>617,172=>838,173=>361,174=>1000,175=>500,176=>500, +177=>838,178=>401,179=>401,180=>500,181=>636,182=>636,183=>318,184=>500,185=>401,186=>471, +187=>617,188=>969,189=>969,190=>969,191=>531,192=>684,193=>684,194=>684,195=>684,196=>684, +197=>684,198=>974,199=>698,200=>632,201=>632,202=>632,203=>632,204=>295,205=>295,206=>295, +207=>295,208=>775,209=>748,210=>787,211=>787,212=>787,213=>787,214=>787,215=>838,216=>787, +217=>732,218=>732,219=>732,220=>732,221=>611,222=>608,223=>630,224=>613,225=>613,226=>613, +227=>613,228=>613,229=>613,230=>995,231=>550,232=>615,233=>615,234=>615,235=>615,236=>278, +237=>278,238=>278,239=>278,240=>612,241=>634,242=>612,243=>612,244=>612,245=>612,246=>612, +247=>838,248=>612,249=>634,250=>634,251=>634,252=>634,253=>592,254=>635,255=>592,256=>684, +257=>613,258=>684,259=>613,260=>684,261=>613,262=>698,263=>550,264=>698,265=>550,266=>698, +267=>550,268=>698,269=>550,270=>770,271=>635,272=>775,273=>635,274=>632,275=>615,276=>632, +277=>615,278=>632,279=>615,280=>632,281=>615,282=>632,283=>615,284=>775,285=>635,286=>775, +287=>635,288=>775,289=>635,290=>775,291=>635,292=>752,293=>634,294=>916,295=>695,296=>295, +297=>278,298=>295,299=>278,300=>295,301=>278,302=>295,303=>278,304=>295,305=>278,306=>590, +307=>556,308=>295,309=>278,310=>656,311=>579,312=>579,313=>557,314=>278,315=>557,316=>278, +317=>557,318=>278,319=>557,320=>278,321=>562,322=>287,323=>748,324=>634,325=>748,326=>634, +327=>748,328=>634,329=>813,330=>748,331=>634,332=>787,333=>612,334=>787,335=>612,336=>787, +337=>612,340=>695,341=>411,342=>695,343=>411,344=>695,345=>411,346=>635,347=>521,348=>635, +349=>521,350=>635,351=>521,354=>611,355=>392,356=>611,357=>392,358=>611,359=>392,360=>732, +361=>634,362=>732,363=>634,364=>732,365=>634,366=>732,367=>634,368=>732,369=>634,370=>732, +371=>634,372=>989,373=>818,374=>611,375=>592,377=>685,378=>525,379=>685,380=>525,383=>352, +384=>635,385=>735,386=>686,387=>635,388=>686,389=>635,390=>703,391=>698,392=>550,393=>775, +394=>819,395=>686,396=>635,397=>612,398=>632,399=>787,400=>614,401=>575,403=>775,404=>687, +405=>984,406=>354,407=>295,408=>746,409=>579,410=>278,411=>592,412=>974,413=>748,414=>634, +415=>787,416=>913,417=>612,418=>938,419=>737,420=>652,421=>635,422=>695,423=>635,424=>521, +425=>632,426=>336,427=>392,428=>611,429=>392,430=>611,431=>838,432=>634,433=>764,434=>721, +435=>744,436=>730,437=>685,438=>525,439=>666,440=>666,441=>578,442=>525,443=>636,444=>666, +445=>578,446=>510,447=>635,448=>295,449=>492,450=>459,451=>295,452=>1455,453=>1295,454=>1160, +455=>852,456=>835,457=>556,458=>1043,459=>1026,460=>912,461=>684,462=>613,463=>295,464=>278, +465=>787,466=>612,467=>732,468=>634,469=>732,470=>634,471=>732,472=>634,473=>732,474=>634, +475=>732,476=>634,477=>615,478=>684,479=>613,480=>684,481=>613,482=>974,483=>995,484=>775, +485=>635,486=>775,487=>635,488=>656,489=>579,490=>787,491=>612,492=>787,493=>612,494=>666, +495=>525,496=>278,497=>1455,498=>1295,499=>1160,500=>775,501=>635,502=>1113,503=>682,504=>748, +505=>634,506=>684,507=>613,508=>974,509=>995,510=>787,511=>612,512=>684,513=>613,514=>684, +515=>613,516=>632,517=>615,518=>632,519=>615,520=>295,521=>278,522=>295,523=>278,524=>787, +525=>612,526=>787,527=>612,528=>695,529=>411,530=>695,531=>411,532=>732,533=>634,534=>732, +535=>634,536=>635,537=>521,538=>611,539=>392,540=>627,541=>521,542=>752,543=>634,544=>735, +545=>838,546=>698,547=>610,548=>685,549=>525,550=>684,551=>613,552=>632,553=>615,554=>787, +555=>612,556=>787,557=>612,558=>787,559=>612,560=>787,561=>612,562=>611,563=>592,564=>475, +565=>843,566=>477,567=>278,568=>998,569=>998,570=>684,571=>698,572=>550,573=>557,574=>611, +575=>521,576=>525,577=>603,578=>479,579=>686,580=>732,581=>684,582=>632,583=>615,584=>295, +585=>278,586=>781,587=>635,588=>695,589=>411,590=>611,591=>592,592=>613,593=>635,594=>635, +595=>635,596=>550,597=>550,598=>635,599=>727,600=>615,601=>615,602=>844,603=>545,604=>545, +605=>775,606=>664,607=>326,608=>696,609=>635,610=>629,611=>596,612=>596,613=>634,614=>634, +615=>634,616=>372,617=>387,618=>372,619=>396,620=>487,621=>278,622=>706,623=>974,624=>974, +625=>974,626=>646,627=>642,628=>634,629=>612,630=>858,631=>728,632=>660,633=>469,634=>469, +635=>469,636=>469,637=>469,638=>530,639=>530,640=>602,641=>602,642=>521,643=>336,644=>336, +645=>461,646=>336,647=>392,648=>392,649=>634,650=>618,651=>598,652=>592,653=>818,654=>592, +655=>611,656=>525,657=>525,658=>578,659=>578,660=>510,661=>510,662=>510,663=>510,664=>787, +665=>580,666=>664,667=>708,668=>654,669=>292,670=>667,671=>507,672=>727,673=>510,674=>510, +675=>1014,676=>1058,677=>1013,678=>824,679=>610,680=>778,681=>848,682=>641,683=>654,684=>515, +685=>515,686=>570,687=>664,688=>399,689=>399,690=>175,691=>259,692=>295,693=>296,694=>379, +695=>515,696=>373,697=>278,698=>460,699=>318,700=>318,701=>318,702=>307,703=>307,704=>370, +705=>370,706=>500,707=>500,708=>500,709=>500,711=>500,712=>275,713=>500,714=>500,715=>500, +716=>275,717=>500,718=>500,719=>500,720=>337,721=>337,722=>307,723=>307,724=>500,725=>500, +726=>390,727=>317,728=>500,729=>500,730=>500,731=>500,733=>500,734=>315,735=>500,736=>426, +737=>166,738=>373,739=>444,740=>370,741=>493,742=>493,743=>493,744=>493,745=>493,748=>500, +749=>500,750=>518,755=>500,759=>500,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0, +774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0, +784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0, +794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0, +804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0, +814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0, +824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0, +834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0, +844=>0,845=>0,846=>0,847=>0,849=>0,850=>0,851=>0,855=>0,856=>0,858=>0, +860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,880=>654,881=>568,882=>862, +883=>647,884=>278,885=>278,886=>748,887=>650,890=>500,891=>549,892=>550,893=>549,894=>337, +900=>500,901=>500,902=>684,903=>318,904=>767,905=>903,906=>435,908=>839,910=>860,911=>905, +912=>338,913=>684,914=>686,915=>557,916=>684,917=>632,918=>685,919=>752,920=>787,921=>295, +922=>656,923=>684,924=>863,925=>748,926=>632,927=>787,928=>752,929=>603,931=>632,932=>611, +933=>611,934=>787,935=>685,936=>787,937=>764,938=>295,939=>611,940=>659,941=>541,942=>634, +943=>338,944=>579,945=>659,946=>638,947=>592,948=>612,949=>541,950=>544,951=>634,952=>612, +953=>338,954=>589,955=>592,956=>636,957=>559,958=>558,959=>612,960=>602,961=>635,962=>587, +963=>634,964=>602,965=>579,966=>660,967=>592,968=>660,969=>837,970=>338,971=>579,972=>612, +973=>579,974=>837,975=>656,976=>614,977=>619,978=>699,979=>842,980=>699,981=>660,982=>837, +983=>664,984=>787,985=>612,986=>648,987=>587,988=>575,989=>458,990=>660,991=>660,992=>865, +993=>627,994=>934,995=>837,996=>758,997=>659,998=>792,999=>615,1000=>687,1001=>607,1002=>768, +1003=>625,1004=>699,1005=>612,1006=>611,1007=>536,1008=>664,1009=>635,1010=>550,1011=>278,1012=>787, +1013=>615,1014=>615,1015=>608,1016=>635,1017=>698,1018=>863,1019=>651,1020=>635,1021=>703,1022=>698, +1023=>703,1024=>632,1025=>632,1026=>786,1027=>557,1028=>698,1029=>635,1030=>295,1031=>295,1032=>295, +1033=>1094,1034=>1045,1035=>786,1036=>710,1037=>748,1038=>609,1039=>752,1040=>684,1041=>686,1042=>686, +1043=>557,1044=>781,1045=>632,1046=>1077,1047=>641,1048=>748,1049=>748,1050=>710,1051=>752,1052=>863, +1053=>752,1054=>787,1055=>752,1056=>603,1057=>698,1058=>611,1059=>609,1060=>861,1061=>685,1062=>776, +1063=>686,1064=>1069,1065=>1094,1066=>833,1067=>818,1068=>686,1069=>698,1070=>1080,1071=>695,1072=>613, +1073=>617,1074=>589,1075=>525,1076=>691,1077=>615,1078=>901,1079=>532,1080=>650,1081=>650,1082=>604, +1083=>639,1084=>754,1085=>654,1086=>612,1087=>654,1088=>635,1089=>550,1090=>583,1091=>592,1092=>855, +1093=>592,1094=>681,1095=>591,1096=>915,1097=>942,1098=>707,1099=>790,1100=>589,1101=>549,1102=>842, +1103=>602,1104=>615,1105=>615,1106=>625,1107=>525,1108=>549,1109=>521,1110=>278,1111=>278,1112=>278, +1113=>902,1114=>898,1115=>652,1116=>604,1117=>650,1118=>592,1119=>654,1120=>934,1121=>837,1122=>771, +1123=>672,1124=>942,1125=>749,1126=>879,1127=>783,1128=>1160,1129=>1001,1130=>787,1131=>612,1132=>1027, +1133=>824,1134=>636,1135=>541,1136=>856,1137=>876,1138=>787,1139=>612,1140=>781,1141=>665,1142=>781, +1143=>665,1144=>992,1145=>904,1146=>953,1147=>758,1148=>1180,1149=>1028,1150=>934,1151=>837,1152=>698, +1153=>550,1154=>502,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>418,1161=>418,1162=>748, +1163=>657,1164=>686,1165=>589,1166=>603,1167=>635,1168=>610,1169=>525,1170=>675,1171=>556,1172=>557, +1173=>491,1174=>1077,1175=>901,1176=>641,1177=>532,1178=>710,1179=>604,1180=>710,1181=>604,1182=>710, +1183=>604,1184=>856,1185=>832,1186=>752,1187=>661,1188=>1014,1189=>877,1190=>1113,1191=>950,1192=>890, +1193=>707,1194=>698,1195=>550,1196=>611,1197=>529,1198=>611,1199=>592,1200=>611,1201=>592,1202=>685, +1203=>592,1204=>934,1205=>807,1206=>686,1207=>591,1208=>686,1209=>591,1210=>686,1211=>634,1212=>929, +1213=>731,1214=>929,1215=>731,1216=>295,1217=>1077,1218=>901,1219=>655,1220=>604,1221=>752,1222=>639, +1223=>752,1224=>661,1225=>752,1226=>661,1227=>686,1228=>591,1229=>863,1230=>754,1231=>278,1232=>684, +1233=>613,1234=>684,1235=>613,1236=>974,1237=>995,1238=>632,1239=>615,1240=>787,1241=>615,1242=>787, +1243=>615,1244=>1077,1245=>901,1246=>641,1247=>532,1248=>666,1249=>578,1250=>748,1251=>650,1252=>748, +1253=>650,1254=>787,1255=>612,1256=>787,1257=>612,1258=>787,1259=>612,1260=>698,1261=>549,1262=>609, +1263=>592,1264=>609,1265=>592,1266=>609,1267=>592,1268=>686,1269=>591,1270=>557,1271=>491,1272=>818, +1273=>790,1274=>675,1275=>556,1276=>685,1277=>592,1278=>685,1279=>592,1280=>686,1281=>589,1282=>1006, +1283=>897,1284=>975,1285=>869,1286=>679,1287=>588,1288=>1072,1289=>957,1290=>1113,1291=>967,1292=>775, +1293=>660,1294=>773,1295=>711,1296=>614,1297=>541,1298=>752,1299=>639,1300=>1195,1301=>997,1302=>900, +1303=>867,1304=>1031,1305=>989,1306=>787,1307=>635,1308=>989,1309=>818,1312=>1113,1313=>942,1314=>1113, +1315=>949,1316=>793,1317=>683,1329=>867,1330=>732,1331=>882,1332=>882,1333=>732,1334=>644,1335=>682, +1336=>732,1337=>851,1338=>882,1339=>732,1340=>557,1341=>824,1342=>986,1343=>732,1344=>707,1345=>644, +1346=>882,1347=>777,1348=>882,1349=>732,1350=>840,1351=>732,1352=>732,1353=>732,1354=>791,1355=>644, +1356=>882,1357=>732,1358=>882,1359=>635,1360=>732,1361=>732,1362=>799,1363=>861,1364=>790,1365=>787, +1366=>635,1369=>307,1370=>318,1371=>500,1372=>500,1373=>392,1374=>526,1375=>500,1377=>974,1378=>634, +1379=>762,1380=>767,1381=>634,1382=>697,1383=>533,1384=>634,1385=>700,1386=>697,1387=>634,1388=>404, +1389=>894,1390=>641,1391=>634,1392=>634,1393=>635,1394=>702,1395=>634,1396=>659,1397=>278,1398=>760, +1399=>516,1400=>634,1401=>453,1402=>974,1403=>516,1404=>769,1405=>634,1406=>696,1407=>974,1408=>634, +1409=>635,1410=>501,1411=>974,1412=>648,1413=>612,1414=>629,1415=>763,1417=>337,1418=>433,1456=>0, +1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0, +1467=>0,1468=>0,1469=>0,1470=>361,1471=>0,1472=>295,1473=>0,1474=>0,1475=>295,1478=>456, +1479=>0,1488=>629,1489=>608,1490=>448,1491=>594,1492=>640,1493=>272,1494=>374,1495=>640,1496=>648, +1497=>272,1498=>592,1499=>556,1500=>599,1501=>640,1502=>659,1503=>272,1504=>441,1505=>700,1506=>563, +1507=>640,1508=>604,1509=>521,1510=>581,1511=>663,1512=>592,1513=>808,1514=>657,1520=>471,1521=>454, +1522=>471,1523=>416,1524=>645,3647=>652,3713=>670,3714=>684,3716=>688,3719=>482,3720=>628,3722=>684, +3725=>688,3732=>642,3733=>642,3734=>672,3735=>655,3737=>641,3738=>592,3739=>592,3740=>745,3741=>767, +3742=>687,3743=>687,3745=>702,3746=>688,3747=>684,3749=>649,3751=>632,3754=>703,3755=>819,3757=>633, +3758=>684,3759=>788,3760=>632,3761=>0,3762=>539,3763=>539,3764=>0,3765=>0,3766=>0,3767=>0, +3768=>0,3769=>0,3771=>0,3772=>0,3773=>663,3776=>360,3777=>679,3778=>460,3779=>547,3780=>491, +3782=>674,3784=>0,3785=>0,3786=>0,3787=>0,3788=>0,3789=>0,3792=>636,3793=>641,3794=>641, +3795=>670,3796=>625,3797=>625,3798=>703,3799=>670,3800=>674,3801=>677,3804=>1028,3805=>1028,4256=>840, +4257=>690,4258=>642,4259=>759,4260=>591,4261=>686,4262=>789,4263=>811,4264=>467,4265=>565,4266=>789, +4267=>793,4268=>584,4269=>837,4270=>750,4271=>688,4272=>811,4273=>584,4274=>584,4275=>837,4276=>837, +4277=>646,4278=>604,4279=>584,4280=>596,4281=>584,4282=>721,4283=>795,4284=>584,4285=>566,4286=>584, +4287=>669,4288=>799,4289=>542,4290=>664,4291=>542,4292=>565,4293=>674,4304=>508,4305=>508,4306=>533, +4307=>785,4308=>522,4309=>517,4310=>508,4311=>797,4312=>507,4313=>518,4314=>1058,4315=>522,4316=>523, +4317=>783,4318=>518,4319=>523,4320=>792,4321=>523,4322=>656,4323=>524,4324=>788,4325=>523,4326=>782, +4327=>523,4328=>522,4329=>522,4330=>566,4331=>523,4332=>523,4333=>489,4334=>522,4335=>498,4336=>517, +4337=>560,4338=>508,4339=>508,4340=>508,4341=>563,4342=>824,4343=>595,4344=>522,4345=>554,4346=>553, +4347=>586,4348=>304,5121=>684,5122=>684,5123=>684,5124=>684,5125=>769,5126=>769,5127=>769,5129=>769, +5130=>769,5131=>769,5132=>835,5133=>834,5134=>835,5135=>834,5136=>835,5137=>834,5138=>967,5139=>1007, +5140=>967,5141=>1007,5142=>769,5143=>967,5144=>1007,5145=>967,5146=>1007,5147=>769,5149=>256,5150=>543, +5151=>423,5152=>423,5153=>389,5154=>389,5155=>393,5156=>389,5157=>466,5158=>385,5159=>256,5160=>389, +5161=>389,5162=>389,5163=>1090,5164=>909,5165=>953,5166=>1117,5167=>684,5168=>684,5169=>684,5170=>684, +5171=>729,5172=>729,5173=>729,5175=>729,5176=>729,5177=>729,5178=>835,5179=>684,5180=>835,5181=>834, +5182=>835,5183=>834,5184=>967,5185=>1007,5186=>967,5187=>1007,5188=>967,5189=>1007,5190=>967,5191=>1007, +5192=>729,5193=>508,5194=>192,5196=>732,5197=>732,5198=>732,5199=>732,5200=>730,5201=>730,5202=>730, +5204=>730,5205=>730,5206=>730,5207=>921,5208=>889,5209=>921,5210=>889,5211=>921,5212=>889,5213=>928, +5214=>900,5215=>928,5216=>900,5217=>947,5218=>900,5219=>947,5220=>900,5221=>947,5222=>434,5223=>877, +5224=>877,5225=>866,5226=>890,5227=>628,5228=>628,5229=>628,5230=>628,5231=>628,5232=>628,5233=>628, +5234=>628,5235=>628,5236=>860,5237=>771,5238=>815,5239=>816,5240=>815,5241=>816,5242=>860,5243=>771, +5244=>860,5245=>771,5246=>815,5247=>816,5248=>815,5249=>816,5250=>815,5251=>407,5252=>407,5253=>750, +5254=>775,5255=>750,5256=>775,5257=>628,5258=>628,5259=>628,5260=>628,5261=>628,5262=>628,5263=>628, +5264=>628,5265=>628,5266=>860,5267=>771,5268=>815,5269=>816,5270=>815,5271=>816,5272=>860,5273=>771, +5274=>860,5275=>771,5276=>815,5277=>816,5278=>815,5279=>816,5280=>815,5281=>435,5282=>435,5283=>610, +5284=>557,5285=>557,5286=>557,5287=>610,5288=>610,5289=>610,5290=>557,5291=>557,5292=>749,5293=>769, +5294=>746,5295=>764,5296=>746,5297=>764,5298=>749,5299=>769,5300=>749,5301=>769,5302=>746,5303=>764, +5304=>746,5305=>764,5306=>746,5307=>386,5308=>508,5309=>386,5312=>852,5313=>852,5314=>852,5315=>852, +5316=>852,5317=>852,5318=>852,5319=>852,5320=>852,5321=>1069,5322=>1035,5323=>1059,5324=>852,5325=>1059, +5326=>852,5327=>852,5328=>600,5329=>453,5330=>600,5331=>852,5332=>852,5333=>852,5334=>852,5335=>852, +5336=>852,5337=>852,5338=>852,5339=>852,5340=>1069,5341=>1035,5342=>1059,5343=>1030,5344=>1059,5345=>1030, +5346=>1069,5347=>1035,5348=>1069,5349=>1035,5350=>1083,5351=>1030,5352=>1083,5353=>1030,5354=>600,5356=>729, +5357=>603,5358=>603,5359=>603,5360=>603,5361=>603,5362=>603,5363=>603,5364=>603,5365=>603,5366=>834, +5367=>754,5368=>792,5369=>771,5370=>792,5371=>771,5372=>834,5373=>754,5374=>834,5375=>754,5376=>792, +5377=>771,5378=>792,5379=>771,5380=>792,5381=>418,5382=>420,5383=>418,5392=>712,5393=>712,5394=>712, +5395=>892,5396=>892,5397=>892,5398=>892,5399=>910,5400=>872,5401=>910,5402=>872,5403=>910,5404=>872, +5405=>1140,5406=>1100,5407=>1140,5408=>1100,5409=>1140,5410=>1100,5411=>1140,5412=>1100,5413=>641,5414=>627, +5415=>627,5416=>627,5417=>627,5418=>627,5419=>627,5420=>627,5421=>627,5422=>627,5423=>844,5424=>781, +5425=>816,5426=>818,5427=>816,5428=>818,5429=>844,5430=>781,5431=>844,5432=>781,5433=>816,5434=>818, +5435=>816,5436=>818,5437=>816,5438=>418,5440=>389,5441=>484,5442=>916,5443=>916,5444=>863,5445=>916, +5446=>863,5447=>863,5448=>603,5449=>603,5450=>603,5451=>603,5452=>603,5453=>603,5454=>834,5455=>754, +5456=>418,5458=>729,5459=>684,5460=>684,5461=>684,5462=>684,5463=>726,5464=>726,5465=>726,5466=>726, +5467=>924,5468=>1007,5469=>508,5470=>732,5471=>732,5472=>732,5473=>732,5474=>732,5475=>732,5476=>730, +5477=>730,5478=>730,5479=>730,5480=>947,5481=>900,5482=>508,5492=>831,5493=>831,5494=>831,5495=>831, +5496=>831,5497=>831,5498=>831,5499=>563,5500=>752,5501=>484,5502=>1047,5503=>1047,5504=>1047,5505=>1047, +5506=>1047,5507=>1047,5508=>1047,5509=>825,5514=>831,5515=>831,5516=>831,5517=>831,5518=>1259,5519=>1259, +5520=>1259,5521=>1002,5522=>1002,5523=>1259,5524=>1259,5525=>700,5526=>1073,5536=>852,5537=>852,5538=>799, +5539=>799,5540=>799,5541=>799,5542=>600,5543=>643,5544=>643,5545=>643,5546=>643,5547=>643,5548=>643, +5549=>643,5550=>418,5551=>628,5598=>770,5601=>770,5702=>468,5703=>468,5742=>444,5743=>1047,5744=>1310, +5745=>1632,5746=>1632,5747=>1375,5748=>1375,5749=>1632,5750=>1632,7424=>592,7425=>717,7426=>982,7427=>586, +7428=>550,7429=>605,7430=>605,7431=>491,7432=>541,7433=>278,7434=>395,7435=>579,7436=>583,7437=>754, +7438=>650,7439=>612,7440=>550,7441=>684,7442=>684,7443=>684,7444=>1023,7446=>612,7447=>612,7448=>524, +7449=>602,7450=>602,7451=>583,7452=>574,7453=>737,7454=>948,7455=>638,7456=>592,7457=>818,7458=>525, +7459=>526,7462=>583,7463=>592,7464=>564,7465=>524,7466=>590,7467=>639,7468=>431,7469=>613,7470=>432, +7472=>485,7473=>398,7474=>398,7475=>488,7476=>474,7477=>186,7478=>186,7479=>413,7480=>351,7481=>543, +7482=>471,7483=>471,7484=>496,7485=>439,7486=>380,7487=>438,7488=>385,7489=>461,7490=>623,7491=>392, +7492=>392,7493=>405,7494=>648,7495=>428,7496=>405,7497=>417,7498=>417,7499=>360,7500=>359,7501=>405, +7502=>179,7503=>426,7504=>623,7505=>409,7506=>414,7507=>370,7508=>414,7509=>414,7510=>428,7511=>295, +7512=>405,7513=>470,7514=>623,7515=>417,7517=>402,7518=>373,7519=>385,7520=>416,7521=>364,7522=>179, +7523=>259,7524=>405,7525=>417,7526=>402,7527=>373,7528=>412,7529=>416,7530=>364,7543=>635,7544=>474, +7547=>372,7557=>278,7579=>405,7580=>370,7581=>370,7582=>414,7583=>360,7584=>296,7585=>233,7586=>405, +7587=>405,7588=>261,7589=>250,7590=>261,7591=>261,7592=>234,7593=>250,7594=>235,7595=>376,7596=>623, +7597=>623,7598=>411,7599=>479,7600=>409,7601=>414,7602=>414,7603=>360,7604=>287,7605=>295,7606=>508, +7607=>418,7608=>361,7609=>406,7610=>417,7611=>366,7612=>437,7613=>366,7614=>392,7615=>414,7620=>0, +7621=>0,7622=>0,7623=>0,7624=>0,7625=>0,7680=>684,7681=>613,7682=>686,7683=>635,7684=>686, +7685=>635,7686=>686,7687=>635,7688=>698,7689=>550,7690=>770,7691=>635,7692=>770,7693=>635,7694=>770, +7695=>635,7696=>770,7697=>635,7698=>770,7699=>635,7700=>632,7701=>615,7702=>632,7703=>615,7704=>632, +7705=>615,7706=>632,7707=>615,7708=>632,7709=>615,7710=>575,7711=>352,7712=>775,7713=>635,7714=>752, +7715=>634,7716=>752,7717=>634,7718=>752,7719=>634,7720=>752,7721=>634,7722=>752,7723=>634,7724=>295, +7725=>278,7726=>295,7727=>278,7728=>656,7729=>579,7730=>656,7731=>579,7732=>656,7733=>579,7734=>557, +7735=>278,7736=>557,7737=>278,7738=>557,7739=>278,7740=>557,7741=>278,7742=>863,7743=>974,7744=>863, +7745=>974,7746=>863,7747=>974,7748=>748,7749=>634,7750=>748,7751=>634,7752=>748,7753=>634,7754=>748, +7755=>634,7756=>787,7757=>612,7758=>787,7759=>612,7760=>787,7761=>612,7762=>787,7763=>612,7764=>603, +7765=>635,7766=>603,7767=>635,7768=>695,7769=>411,7770=>695,7771=>411,7772=>695,7773=>411,7774=>695, +7775=>411,7776=>635,7777=>521,7778=>635,7779=>521,7780=>635,7781=>521,7782=>635,7783=>521,7784=>635, +7785=>521,7786=>611,7787=>392,7788=>611,7789=>392,7790=>611,7791=>392,7792=>611,7793=>392,7794=>732, +7795=>634,7796=>732,7797=>634,7798=>732,7799=>634,7800=>732,7801=>634,7802=>732,7803=>634,7804=>684, +7805=>592,7806=>684,7807=>592,7808=>989,7809=>818,7810=>989,7811=>818,7812=>989,7813=>818,7814=>989, +7815=>818,7816=>989,7817=>818,7818=>685,7819=>592,7820=>685,7821=>592,7822=>611,7823=>592,7824=>685, +7825=>525,7826=>685,7827=>525,7828=>685,7829=>525,7830=>634,7831=>392,7832=>818,7833=>592,7834=>613, +7835=>352,7838=>769,7839=>612,7840=>684,7841=>613,7842=>684,7843=>613,7844=>684,7845=>613,7846=>684, +7847=>613,7848=>684,7849=>613,7850=>684,7851=>613,7852=>684,7853=>613,7854=>684,7855=>613,7856=>684, +7857=>613,7858=>684,7859=>613,7860=>684,7861=>613,7862=>684,7863=>613,7864=>632,7865=>615,7866=>632, +7867=>615,7868=>632,7869=>615,7870=>632,7871=>615,7872=>632,7873=>615,7874=>632,7875=>615,7876=>632, +7877=>615,7878=>632,7879=>615,7880=>295,7881=>278,7882=>295,7883=>278,7884=>787,7885=>612,7886=>787, +7887=>612,7888=>787,7889=>612,7890=>787,7891=>612,7892=>787,7893=>612,7894=>787,7895=>612,7896=>787, +7897=>612,7898=>913,7899=>612,7900=>913,7901=>612,7902=>913,7903=>612,7904=>913,7905=>612,7906=>913, +7907=>612,7908=>732,7909=>634,7910=>732,7911=>634,7912=>838,7913=>634,7914=>838,7915=>634,7916=>838, +7917=>634,7918=>838,7919=>634,7920=>838,7921=>634,7922=>611,7923=>592,7924=>611,7925=>592,7926=>611, +7927=>592,7928=>611,7929=>592,7936=>659,7937=>659,7938=>659,7939=>659,7940=>659,7941=>659,7942=>659, +7943=>659,7944=>684,7945=>684,7946=>877,7947=>877,7948=>769,7949=>801,7950=>708,7951=>743,7952=>541, +7953=>541,7954=>541,7955=>541,7956=>541,7957=>541,7960=>711,7961=>711,7962=>966,7963=>975,7964=>898, +7965=>928,7968=>634,7969=>634,7970=>634,7971=>634,7972=>634,7973=>634,7974=>634,7975=>634,7976=>837, +7977=>835,7978=>1086,7979=>1089,7980=>1027,7981=>1051,7982=>934,7983=>947,7984=>338,7985=>338,7986=>338, +7987=>338,7988=>338,7989=>338,7990=>338,7991=>338,7992=>380,7993=>374,7994=>635,7995=>635,7996=>570, +7997=>600,7998=>489,7999=>493,8000=>612,8001=>612,8002=>612,8003=>612,8004=>612,8005=>612,8008=>804, +8009=>848,8010=>1095,8011=>1100,8012=>938,8013=>970,8016=>579,8017=>579,8018=>579,8019=>579,8020=>579, +8021=>579,8022=>579,8023=>579,8025=>784,8027=>998,8029=>1012,8031=>897,8032=>837,8033=>837,8034=>837, +8035=>837,8036=>837,8037=>837,8038=>837,8039=>837,8040=>802,8041=>843,8042=>1089,8043=>1095,8044=>946, +8045=>972,8046=>921,8047=>952,8048=>659,8049=>659,8050=>541,8051=>548,8052=>634,8053=>654,8054=>338, +8055=>338,8056=>612,8057=>612,8058=>579,8059=>579,8060=>837,8061=>837,8064=>659,8065=>659,8066=>659, +8067=>659,8068=>659,8069=>659,8070=>659,8071=>659,8072=>684,8073=>684,8074=>877,8075=>877,8076=>769, +8077=>801,8078=>708,8079=>743,8080=>634,8081=>634,8082=>634,8083=>634,8084=>634,8085=>634,8086=>634, +8087=>634,8088=>837,8089=>835,8090=>1086,8091=>1089,8092=>1027,8093=>1051,8094=>934,8095=>947,8096=>837, +8097=>837,8098=>837,8099=>837,8100=>837,8101=>837,8102=>837,8103=>837,8104=>802,8105=>843,8106=>1089, +8107=>1095,8108=>946,8109=>972,8110=>921,8111=>952,8112=>659,8113=>659,8114=>659,8115=>659,8116=>659, +8118=>659,8119=>659,8120=>684,8121=>684,8122=>716,8123=>692,8124=>684,8125=>500,8126=>500,8127=>500, +8128=>500,8129=>500,8130=>634,8131=>634,8132=>654,8134=>634,8135=>634,8136=>805,8137=>746,8138=>931, +8139=>871,8140=>752,8141=>500,8142=>500,8143=>500,8144=>338,8145=>338,8146=>338,8147=>338,8150=>338, +8151=>338,8152=>295,8153=>295,8154=>475,8155=>408,8157=>500,8158=>500,8159=>500,8160=>579,8161=>579, +8162=>579,8163=>579,8164=>635,8165=>635,8166=>579,8167=>579,8168=>611,8169=>611,8170=>845,8171=>825, +8172=>685,8173=>500,8174=>500,8175=>500,8178=>837,8179=>837,8180=>837,8182=>837,8183=>837,8184=>941, +8185=>813,8186=>922,8187=>826,8188=>764,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000, +8196=>330,8197=>250,8198=>167,8199=>636,8200=>318,8201=>200,8202=>100,8203=>0,8204=>0,8205=>0, +8206=>0,8207=>0,8208=>361,8209=>361,8210=>636,8213=>1000,8214=>500,8215=>500,8219=>318,8223=>518, +8227=>590,8228=>333,8229=>667,8231=>318,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>200, +8241=>1690,8242=>227,8243=>374,8244=>520,8245=>227,8246=>374,8247=>520,8248=>339,8251=>838,8252=>485, +8253=>531,8254=>500,8255=>804,8256=>804,8257=>250,8258=>1000,8259=>500,8260=>167,8261=>390,8262=>390, +8263=>922,8264=>733,8265=>733,8266=>497,8267=>636,8268=>500,8269=>500,8270=>500,8271=>337,8272=>804, +8273=>500,8274=>450,8275=>1000,8276=>804,8277=>838,8278=>586,8279=>663,8280=>838,8281=>838,8282=>318, +8283=>797,8284=>838,8285=>318,8286=>318,8287=>222,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0, +8298=>0,8299=>0,8300=>0,8301=>0,8302=>0,8303=>0,8304=>401,8305=>179,8308=>401,8309=>401, +8310=>401,8311=>401,8312=>401,8313=>401,8314=>528,8315=>528,8316=>528,8317=>246,8318=>246,8319=>399, +8320=>401,8321=>401,8322=>401,8323=>401,8324=>401,8325=>401,8326=>401,8327=>401,8328=>401,8329=>401, +8330=>528,8331=>528,8332=>528,8333=>246,8334=>246,8336=>392,8337=>417,8338=>414,8339=>444,8340=>417, +8352=>877,8353=>636,8354=>636,8355=>636,8356=>636,8357=>974,8358=>748,8359=>1271,8360=>1074,8361=>989, +8362=>838,8363=>636,8365=>656,8366=>611,8367=>1272,8368=>636,8369=>636,8370=>636,8371=>636,8372=>774, +8373=>641,8400=>0,8401=>0,8406=>0,8407=>0,8411=>0,8412=>0,8417=>0,8448=>970,8449=>970, +8450=>698,8451=>1123,8452=>896,8453=>969,8454=>1032,8455=>614,8456=>698,8457=>952,8459=>988,8460=>754, +8461=>850,8462=>634,8463=>634,8464=>470,8465=>697,8466=>720,8467=>413,8468=>818,8469=>801,8470=>1040, +8471=>1000,8472=>697,8473=>701,8474=>787,8475=>798,8476=>814,8477=>792,8478=>896,8479=>684,8480=>1020, +8481=>1014,8483=>684,8484=>745,8485=>578,8486=>764,8487=>764,8488=>616,8489=>338,8490=>656,8491=>684, +8492=>786,8493=>703,8494=>854,8495=>592,8496=>605,8497=>786,8498=>575,8499=>1069,8500=>462,8501=>745, +8502=>674,8503=>466,8504=>645,8505=>380,8506=>926,8507=>1157,8508=>702,8509=>728,8510=>654,8511=>849, +8512=>811,8513=>775,8514=>557,8515=>557,8516=>611,8517=>819,8518=>708,8519=>615,8520=>351,8521=>351, +8523=>780,8526=>526,8531=>969,8532=>969,8533=>969,8534=>969,8535=>969,8536=>969,8537=>969,8538=>969, +8539=>969,8540=>969,8541=>969,8542=>969,8543=>568,8544=>295,8545=>492,8546=>689,8547=>923,8548=>684, +8549=>922,8550=>1120,8551=>1317,8552=>917,8553=>685,8554=>933,8555=>1131,8556=>557,8557=>698,8558=>770, +8559=>863,8560=>278,8561=>458,8562=>637,8563=>812,8564=>592,8565=>811,8566=>991,8567=>1170,8568=>819, +8569=>592,8570=>822,8571=>1002,8572=>278,8573=>550,8574=>635,8575=>974,8576=>1245,8577=>770,8578=>1245, +8579=>703,8580=>549,8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838,8598=>838,8599=>838, +8600=>838,8601=>838,8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838,8608=>838,8609=>838, +8610=>838,8611=>838,8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838,8618=>838,8619=>838, +8620=>838,8621=>838,8622=>838,8623=>838,8624=>838,8625=>838,8626=>838,8627=>838,8628=>838,8629=>838, +8630=>838,8631=>838,8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838,8638=>838,8639=>838, +8640=>838,8641=>838,8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838,8648=>838,8649=>838, +8650=>838,8651=>838,8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838,8658=>838,8659=>838, +8660=>838,8661=>838,8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838,8668=>838,8669=>838, +8670=>838,8671=>838,8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838,8678=>838,8679=>838, +8680=>838,8681=>838,8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838,8688=>838,8689=>838, +8690=>838,8691=>838,8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838,8698=>838,8699=>838, +8700=>838,8701=>838,8702=>838,8703=>838,8704=>684,8705=>636,8706=>517,8707=>632,8708=>632,8709=>871, +8710=>669,8711=>669,8712=>871,8713=>871,8714=>718,8715=>871,8716=>871,8717=>718,8718=>636,8719=>757, +8720=>757,8721=>674,8722=>838,8723=>838,8724=>838,8725=>337,8726=>637,8727=>838,8728=>626,8729=>626, +8730=>637,8731=>637,8732=>637,8733=>714,8734=>833,8735=>838,8736=>896,8737=>896,8738=>838,8739=>500, +8740=>500,8741=>500,8742=>500,8743=>732,8744=>732,8745=>732,8746=>732,8747=>521,8748=>789,8749=>1057, +8750=>521,8751=>789,8752=>1057,8753=>521,8754=>521,8755=>521,8756=>636,8757=>636,8758=>260,8759=>636, +8760=>838,8761=>838,8762=>838,8763=>838,8764=>838,8765=>838,8766=>838,8767=>838,8768=>375,8769=>838, +8770=>838,8771=>838,8772=>838,8773=>838,8774=>838,8775=>838,8776=>838,8777=>838,8778=>838,8779=>838, +8780=>838,8781=>838,8782=>838,8783=>838,8784=>838,8785=>838,8786=>838,8787=>838,8788=>1000,8789=>1000, +8790=>838,8791=>838,8792=>838,8793=>838,8794=>838,8795=>838,8796=>838,8797=>838,8798=>838,8799=>838, +8800=>838,8801=>838,8802=>838,8803=>838,8804=>838,8805=>838,8806=>838,8807=>838,8808=>838,8809=>838, +8810=>1047,8811=>1047,8812=>464,8813=>838,8814=>838,8815=>838,8816=>838,8817=>838,8818=>838,8819=>838, +8820=>838,8821=>838,8822=>838,8823=>838,8824=>838,8825=>838,8826=>838,8827=>838,8828=>838,8829=>838, +8830=>838,8831=>838,8832=>838,8833=>838,8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838, +8840=>838,8841=>838,8842=>838,8843=>838,8844=>732,8845=>732,8846=>732,8847=>838,8848=>838,8849=>838, +8850=>838,8851=>780,8852=>780,8853=>838,8854=>838,8855=>838,8856=>838,8857=>838,8858=>838,8859=>838, +8860=>838,8861=>838,8862=>838,8863=>838,8864=>838,8865=>838,8866=>871,8867=>871,8868=>871,8869=>871, +8870=>521,8871=>521,8872=>871,8873=>871,8874=>871,8875=>871,8876=>871,8877=>871,8878=>871,8879=>871, +8880=>838,8881=>838,8882=>838,8883=>838,8884=>838,8885=>838,8886=>1000,8887=>1000,8888=>838,8889=>838, +8890=>521,8891=>732,8892=>732,8893=>732,8894=>838,8895=>838,8896=>820,8897=>820,8898=>820,8899=>820, +8900=>494,8901=>318,8902=>626,8903=>838,8904=>1000,8905=>1000,8906=>1000,8907=>1000,8908=>1000,8909=>838, +8910=>732,8911=>732,8912=>838,8913=>838,8914=>838,8915=>838,8916=>838,8917=>838,8918=>838,8919=>838, +8920=>1422,8921=>1422,8922=>838,8923=>838,8924=>838,8925=>838,8926=>838,8927=>838,8928=>838,8929=>838, +8930=>838,8931=>838,8932=>838,8933=>838,8934=>838,8935=>838,8936=>838,8937=>838,8938=>838,8939=>838, +8940=>838,8941=>838,8942=>1000,8943=>1000,8944=>1000,8945=>1000,8946=>1000,8947=>871,8948=>718,8949=>871, +8950=>871,8951=>718,8952=>871,8953=>871,8954=>1000,8955=>871,8956=>718,8957=>871,8958=>718,8959=>871, +8960=>602,8961=>602,8962=>635,8963=>838,8964=>838,8965=>838,8966=>838,8967=>488,8968=>390,8969=>390, +8970=>390,8971=>390,8972=>809,8973=>809,8974=>809,8975=>809,8976=>838,8977=>513,8984=>1000,8985=>838, +8988=>469,8989=>469,8990=>469,8991=>469,8992=>521,8993=>521,8996=>1152,8997=>1152,8998=>1414,8999=>1152, +9000=>1443,9003=>1414,9004=>873,9075=>338,9076=>635,9077=>837,9082=>659,9085=>757,9095=>1152,9108=>873, +9115=>500,9116=>500,9117=>500,9118=>500,9119=>500,9120=>500,9121=>500,9122=>500,9123=>500,9124=>500, +9125=>500,9126=>500,9127=>750,9128=>750,9129=>750,9130=>750,9131=>750,9132=>750,9133=>750,9134=>521, +9166=>838,9167=>945,9187=>873,9189=>769,9250=>635,9251=>635,9312=>896,9313=>896,9314=>896,9315=>896, +9316=>896,9317=>896,9318=>896,9319=>896,9320=>896,9321=>896,9472=>602,9473=>602,9474=>602,9475=>602, +9476=>602,9477=>602,9478=>602,9479=>602,9480=>602,9481=>602,9482=>602,9483=>602,9484=>602,9485=>602, +9486=>602,9487=>602,9488=>602,9489=>602,9490=>602,9491=>602,9492=>602,9493=>602,9494=>602,9495=>602, +9496=>602,9497=>602,9498=>602,9499=>602,9500=>602,9501=>602,9502=>602,9503=>602,9504=>602,9505=>602, +9506=>602,9507=>602,9508=>602,9509=>602,9510=>602,9511=>602,9512=>602,9513=>602,9514=>602,9515=>602, +9516=>602,9517=>602,9518=>602,9519=>602,9520=>602,9521=>602,9522=>602,9523=>602,9524=>602,9525=>602, +9526=>602,9527=>602,9528=>602,9529=>602,9530=>602,9531=>602,9532=>602,9533=>602,9534=>602,9535=>602, +9536=>602,9537=>602,9538=>602,9539=>602,9540=>602,9541=>602,9542=>602,9543=>602,9544=>602,9545=>602, +9546=>602,9547=>602,9548=>602,9549=>602,9550=>602,9551=>602,9552=>602,9553=>602,9554=>602,9555=>602, +9556=>602,9557=>602,9558=>602,9559=>602,9560=>602,9561=>602,9562=>602,9563=>602,9564=>602,9565=>602, +9566=>602,9567=>602,9568=>602,9569=>602,9570=>602,9571=>602,9572=>602,9573=>602,9574=>602,9575=>602, +9576=>602,9577=>602,9578=>602,9579=>602,9580=>602,9581=>602,9582=>602,9583=>602,9584=>602,9585=>602, +9586=>602,9587=>602,9588=>602,9589=>602,9590=>602,9591=>602,9592=>602,9593=>602,9594=>602,9595=>602, +9596=>602,9597=>602,9598=>602,9599=>602,9600=>769,9601=>769,9602=>769,9603=>769,9604=>769,9605=>769, +9606=>769,9607=>769,9608=>769,9609=>769,9610=>769,9611=>769,9612=>769,9613=>769,9614=>769,9615=>769, +9616=>769,9617=>769,9618=>769,9619=>769,9620=>769,9621=>769,9622=>769,9623=>769,9624=>769,9625=>769, +9626=>769,9627=>769,9628=>769,9629=>769,9630=>769,9631=>769,9632=>945,9633=>945,9634=>945,9635=>945, +9636=>945,9637=>945,9638=>945,9639=>945,9640=>945,9641=>945,9642=>678,9643=>678,9644=>945,9645=>945, +9646=>550,9647=>550,9648=>769,9649=>769,9650=>769,9651=>769,9652=>502,9653=>502,9654=>769,9655=>769, +9656=>502,9657=>502,9658=>769,9659=>769,9660=>769,9661=>769,9662=>502,9663=>502,9664=>769,9665=>769, +9666=>502,9667=>502,9668=>769,9669=>769,9670=>769,9671=>769,9672=>769,9673=>873,9674=>494,9675=>873, +9676=>873,9677=>873,9678=>873,9679=>873,9680=>873,9681=>873,9682=>873,9683=>873,9684=>873,9685=>873, +9686=>527,9687=>527,9688=>791,9689=>970,9690=>970,9691=>970,9692=>387,9693=>387,9694=>387,9695=>387, +9696=>769,9697=>769,9698=>769,9699=>769,9700=>769,9701=>769,9702=>590,9703=>945,9704=>945,9705=>945, +9706=>945,9707=>945,9708=>769,9709=>769,9710=>769,9711=>1119,9712=>945,9713=>945,9714=>945,9715=>945, +9716=>873,9717=>873,9718=>873,9719=>873,9720=>769,9721=>769,9722=>769,9723=>830,9724=>830,9725=>732, +9726=>732,9727=>769,9728=>896,9729=>1000,9730=>896,9731=>896,9732=>896,9733=>896,9734=>896,9735=>573, +9736=>896,9737=>896,9738=>888,9739=>888,9740=>671,9741=>1013,9742=>1246,9743=>1250,9744=>896,9745=>896, +9746=>896,9747=>532,9748=>896,9749=>896,9750=>896,9751=>896,9752=>896,9753=>896,9754=>896,9755=>896, +9756=>896,9757=>609,9758=>896,9759=>609,9760=>896,9761=>896,9762=>896,9763=>896,9764=>669,9765=>746, +9766=>649,9767=>784,9768=>545,9769=>896,9770=>896,9771=>896,9772=>710,9773=>896,9774=>896,9775=>896, +9776=>890,9777=>890,9778=>890,9779=>890,9780=>890,9781=>890,9782=>890,9783=>890,9784=>896,9785=>896, +9786=>896,9787=>896,9788=>896,9789=>896,9790=>896,9791=>614,9792=>731,9793=>731,9794=>896,9795=>896, +9796=>896,9797=>896,9798=>896,9799=>896,9800=>896,9801=>896,9802=>896,9803=>896,9804=>896,9805=>896, +9806=>896,9807=>896,9808=>896,9809=>896,9810=>896,9811=>896,9812=>896,9813=>896,9814=>896,9815=>896, +9816=>896,9817=>896,9818=>896,9819=>896,9820=>896,9821=>896,9822=>896,9823=>896,9824=>896,9825=>896, +9826=>896,9827=>896,9828=>896,9829=>896,9830=>896,9831=>896,9832=>896,9833=>472,9834=>638,9835=>896, +9836=>896,9837=>472,9838=>357,9839=>484,9840=>748,9841=>766,9842=>896,9843=>896,9844=>896,9845=>896, +9846=>896,9847=>896,9848=>896,9849=>896,9850=>896,9851=>896,9852=>896,9853=>896,9854=>896,9855=>896, +9856=>869,9857=>869,9858=>869,9859=>869,9860=>869,9861=>869,9862=>890,9863=>890,9864=>890,9865=>890, +9866=>890,9867=>890,9868=>890,9869=>890,9870=>890,9871=>890,9872=>750,9873=>750,9874=>890,9875=>816, +9876=>716,9877=>537,9878=>852,9879=>890,9880=>684,9881=>890,9882=>708,9883=>890,9884=>890,9888=>890, +9889=>702,9890=>1003,9891=>1085,9892=>1143,9893=>901,9894=>838,9895=>838,9896=>838,9897=>838,9898=>838, +9899=>838,9900=>838,9901=>838,9902=>838,9903=>838,9904=>844,9905=>838,9906=>731,9907=>732,9908=>732, +9909=>732,9910=>850,9911=>732,9912=>732,9985=>838,9986=>838,9987=>838,9988=>838,9990=>838,9991=>838, +9992=>838,9993=>838,9996=>838,9997=>838,9998=>838,9999=>838,10000=>838,10001=>838,10002=>838,10003=>838, +10004=>838,10005=>838,10006=>838,10007=>838,10008=>838,10009=>838,10010=>838,10011=>838,10012=>838,10013=>838, +10014=>838,10015=>838,10016=>838,10017=>838,10018=>838,10019=>838,10020=>838,10021=>838,10022=>838,10023=>838, +10025=>838,10026=>838,10027=>838,10028=>838,10029=>838,10030=>838,10031=>838,10032=>838,10033=>838,10034=>838, +10035=>838,10036=>838,10037=>838,10038=>838,10039=>838,10040=>838,10041=>838,10042=>838,10043=>838,10044=>838, +10045=>838,10046=>838,10047=>838,10048=>838,10049=>838,10050=>838,10051=>838,10052=>838,10053=>838,10054=>838, +10055=>838,10056=>838,10057=>838,10058=>838,10059=>838,10061=>896,10063=>896,10064=>896,10065=>896,10066=>896, +10070=>896,10072=>838,10073=>838,10074=>838,10075=>322,10076=>322,10077=>538,10078=>538,10081=>838,10082=>838, +10083=>838,10084=>838,10085=>838,10086=>838,10087=>838,10088=>838,10089=>838,10090=>838,10091=>838,10092=>838, +10093=>838,10094=>838,10095=>838,10096=>838,10097=>838,10098=>838,10099=>838,10100=>838,10101=>838,10102=>896, +10103=>896,10104=>896,10105=>896,10106=>896,10107=>896,10108=>896,10109=>896,10110=>896,10111=>896,10112=>838, +10113=>838,10114=>838,10115=>838,10116=>838,10117=>838,10118=>838,10119=>838,10120=>838,10121=>838,10122=>838, +10123=>838,10124=>838,10125=>838,10126=>838,10127=>838,10128=>838,10129=>838,10130=>838,10131=>838,10132=>838, +10136=>838,10137=>838,10138=>838,10139=>838,10140=>838,10141=>838,10142=>838,10143=>838,10144=>838,10145=>838, +10146=>838,10147=>838,10148=>838,10149=>838,10150=>838,10151=>838,10152=>838,10153=>838,10154=>838,10155=>838, +10156=>838,10157=>838,10158=>838,10159=>838,10161=>838,10162=>838,10163=>838,10164=>838,10165=>838,10166=>838, +10167=>838,10168=>838,10169=>838,10170=>838,10171=>838,10172=>838,10173=>838,10174=>838,10181=>390,10182=>390, +10208=>494,10214=>495,10215=>495,10216=>390,10217=>390,10218=>556,10219=>556,10224=>838,10225=>838,10226=>838, +10227=>838,10228=>1157,10229=>1434,10230=>1434,10231=>1434,10232=>1434,10233=>1434,10234=>1434,10235=>1434,10236=>1434, +10237=>1434,10238=>1434,10239=>1434,10240=>732,10241=>732,10242=>732,10243=>732,10244=>732,10245=>732,10246=>732, +10247=>732,10248=>732,10249=>732,10250=>732,10251=>732,10252=>732,10253=>732,10254=>732,10255=>732,10256=>732, +10257=>732,10258=>732,10259=>732,10260=>732,10261=>732,10262=>732,10263=>732,10264=>732,10265=>732,10266=>732, +10267=>732,10268=>732,10269=>732,10270=>732,10271=>732,10272=>732,10273=>732,10274=>732,10275=>732,10276=>732, +10277=>732,10278=>732,10279=>732,10280=>732,10281=>732,10282=>732,10283=>732,10284=>732,10285=>732,10286=>732, +10287=>732,10288=>732,10289=>732,10290=>732,10291=>732,10292=>732,10293=>732,10294=>732,10295=>732,10296=>732, +10297=>732,10298=>732,10299=>732,10300=>732,10301=>732,10302=>732,10303=>732,10304=>732,10305=>732,10306=>732, +10307=>732,10308=>732,10309=>732,10310=>732,10311=>732,10312=>732,10313=>732,10314=>732,10315=>732,10316=>732, +10317=>732,10318=>732,10319=>732,10320=>732,10321=>732,10322=>732,10323=>732,10324=>732,10325=>732,10326=>732, +10327=>732,10328=>732,10329=>732,10330=>732,10331=>732,10332=>732,10333=>732,10334=>732,10335=>732,10336=>732, +10337=>732,10338=>732,10339=>732,10340=>732,10341=>732,10342=>732,10343=>732,10344=>732,10345=>732,10346=>732, +10347=>732,10348=>732,10349=>732,10350=>732,10351=>732,10352=>732,10353=>732,10354=>732,10355=>732,10356=>732, +10357=>732,10358=>732,10359=>732,10360=>732,10361=>732,10362=>732,10363=>732,10364=>732,10365=>732,10366=>732, +10367=>732,10368=>732,10369=>732,10370=>732,10371=>732,10372=>732,10373=>732,10374=>732,10375=>732,10376=>732, +10377=>732,10378=>732,10379=>732,10380=>732,10381=>732,10382=>732,10383=>732,10384=>732,10385=>732,10386=>732, +10387=>732,10388=>732,10389=>732,10390=>732,10391=>732,10392=>732,10393=>732,10394=>732,10395=>732,10396=>732, +10397=>732,10398=>732,10399=>732,10400=>732,10401=>732,10402=>732,10403=>732,10404=>732,10405=>732,10406=>732, +10407=>732,10408=>732,10409=>732,10410=>732,10411=>732,10412=>732,10413=>732,10414=>732,10415=>732,10416=>732, +10417=>732,10418=>732,10419=>732,10420=>732,10421=>732,10422=>732,10423=>732,10424=>732,10425=>732,10426=>732, +10427=>732,10428=>732,10429=>732,10430=>732,10431=>732,10432=>732,10433=>732,10434=>732,10435=>732,10436=>732, +10437=>732,10438=>732,10439=>732,10440=>732,10441=>732,10442=>732,10443=>732,10444=>732,10445=>732,10446=>732, +10447=>732,10448=>732,10449=>732,10450=>732,10451=>732,10452=>732,10453=>732,10454=>732,10455=>732,10456=>732, +10457=>732,10458=>732,10459=>732,10460=>732,10461=>732,10462=>732,10463=>732,10464=>732,10465=>732,10466=>732, +10467=>732,10468=>732,10469=>732,10470=>732,10471=>732,10472=>732,10473=>732,10474=>732,10475=>732,10476=>732, +10477=>732,10478=>732,10479=>732,10480=>732,10481=>732,10482=>732,10483=>732,10484=>732,10485=>732,10486=>732, +10487=>732,10488=>732,10489=>732,10490=>732,10491=>732,10492=>732,10493=>732,10494=>732,10495=>732,10502=>838, +10503=>838,10506=>838,10507=>838,10560=>683,10561=>683,10627=>734,10628=>734,10702=>838,10703=>1000,10704=>1000, +10705=>1000,10706=>1000,10707=>1000,10708=>1000,10709=>1000,10731=>494,10746=>838,10747=>838,10752=>1000,10753=>1000, +10754=>1000,10764=>1325,10765=>521,10766=>521,10767=>521,10768=>521,10769=>521,10770=>521,10771=>521,10772=>521, +10773=>521,10774=>521,10775=>521,10776=>521,10777=>521,10778=>521,10779=>521,10780=>521,10799=>838,10877=>838, +10878=>838,10879=>838,10880=>838,10881=>838,10882=>838,10883=>838,10884=>838,10885=>838,10886=>838,10887=>838, +10888=>838,10889=>838,10890=>838,10891=>838,10892=>838,10893=>838,10894=>838,10895=>838,10896=>838,10897=>838, +10898=>838,10899=>838,10900=>838,10901=>838,10902=>838,10903=>838,10904=>838,10905=>838,10906=>838,10907=>838, +10908=>838,10909=>838,10910=>838,10911=>838,10912=>838,10926=>838,10927=>838,10928=>838,10929=>838,10930=>838, +10931=>838,10932=>838,10933=>838,10934=>838,10935=>838,10936=>838,10937=>838,10938=>838,11001=>838,11002=>838, +11008=>838,11009=>838,11010=>838,11011=>838,11012=>838,11013=>838,11014=>838,11015=>838,11016=>838,11017=>838, +11018=>838,11019=>838,11020=>838,11021=>838,11022=>836,11023=>836,11024=>836,11025=>836,11026=>945,11027=>945, +11028=>945,11029=>945,11030=>769,11031=>769,11032=>769,11033=>769,11034=>945,11039=>869,11040=>869,11041=>873, +11042=>873,11043=>873,11044=>1119,11091=>869,11092=>869,11360=>557,11361=>278,11362=>557,11363=>603,11364=>695, +11365=>613,11366=>392,11367=>752,11368=>634,11369=>656,11370=>579,11371=>685,11372=>525,11373=>781,11374=>863, +11375=>684,11377=>734,11378=>1128,11379=>961,11380=>592,11381=>654,11382=>568,11383=>660,11385=>414,11386=>612, +11387=>491,11388=>175,11389=>431,11800=>531,11810=>390,11811=>390,11812=>390,11813=>390,11822=>531,19904=>896, +19905=>896,19906=>896,19907=>896,19908=>896,19909=>896,19910=>896,19911=>896,19912=>896,19913=>896,19914=>896, +19915=>896,19916=>896,19917=>896,19918=>896,19919=>896,19920=>896,19921=>896,19922=>896,19923=>896,19924=>896, +19925=>896,19926=>896,19927=>896,19928=>896,19929=>896,19930=>896,19931=>896,19932=>896,19933=>896,19934=>896, +19935=>896,19936=>896,19937=>896,19938=>896,19939=>896,19940=>896,19941=>896,19942=>896,19943=>896,19944=>896, +19945=>896,19946=>896,19947=>896,19948=>896,19949=>896,19950=>896,19951=>896,19952=>896,19953=>896,19954=>896, +19955=>896,19956=>896,19957=>896,19958=>896,19959=>896,19960=>896,19961=>896,19962=>896,19963=>896,19964=>896, +19965=>896,19966=>896,19967=>896,42564=>635,42565=>521,42566=>354,42567=>338,42572=>1180,42573=>1028,42576=>1029, +42577=>906,42580=>1080,42581=>842,42582=>985,42583=>847,42594=>1024,42595=>925,42596=>1014,42597=>900,42598=>863, +42599=>1008,42600=>787,42601=>612,42602=>855,42603=>712,42604=>1358,42605=>1019,42606=>879,42634=>805,42635=>722, +42636=>611,42637=>583,42644=>686,42645=>634,42760=>493,42761=>493,42762=>493,42763=>493,42764=>493,42765=>493, +42766=>493,42767=>493,42768=>493,42769=>493,42770=>493,42771=>493,42772=>493,42773=>493,42774=>493,42779=>369, +42780=>369,42781=>252,42782=>252,42783=>252,42790=>752,42791=>634,42792=>878,42793=>709,42794=>614,42795=>541, +42800=>491,42801=>521,42802=>1250,42803=>985,42804=>1219,42805=>1000,42806=>1155,42807=>996,42808=>971,42809=>818, +42810=>971,42811=>818,42812=>959,42813=>818,42814=>698,42815=>549,42822=>680,42823=>392,42824=>582,42825=>427, +42826=>807,42827=>704,42830=>1358,42831=>1019,42880=>557,42881=>278,42882=>735,42883=>634,42889=>337,42890=>376, +42891=>401,42892=>275,43003=>575,43004=>603,43005=>863,43006=>295,43007=>1199,63173=>612,64256=>722,64257=>646, +64258=>646,64259=>1000,64260=>1000,64261=>686,64262=>861,64275=>1202,64276=>1202,64277=>1196,64278=>1186,64279=>1529, +64285=>272,64286=>0,64287=>471,64288=>636,64289=>856,64290=>774,64291=>906,64292=>771,64293=>843,64294=>855, +64295=>807,64296=>875,64297=>838,64298=>808,64299=>808,64300=>808,64301=>808,64302=>629,64303=>629,64304=>629, +64305=>608,64306=>448,64307=>594,64308=>640,64309=>272,64310=>374,64311=>1000,64312=>648,64313=>336,64314=>592, +64315=>556,64316=>599,64318=>659,64320=>441,64321=>700,64323=>640,64324=>604,64326=>581,64327=>663,64328=>592, +64329=>808,64330=>657,64331=>272,64332=>608,64333=>556,64334=>604,64335=>629,65024=>0,65025=>0,65026=>0, +65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0, +65037=>0,65038=>0,65039=>0,65056=>0,65057=>0,65058=>0,65059=>0,65529=>0,65530=>0,65531=>0, +65532=>0,65533=>1025); +$enc=''; +$diff=''; +$file='dejavusansi.z'; +$ctg='dejavusansi.ctg.z'; +$originalsize=523804; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansi.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansi.z new file mode 100644 index 0000000..bb3d034 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansi.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmono.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmono.ctg.z new file mode 100644 index 0000000..bc94032 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmono.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmono.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmono.php new file mode 100644 index 0000000..bc59f60 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmono.php @@ -0,0 +1,320 @@ +<?php +$type='TrueTypeUnicode'; +$name='DejaVuSansMono'; +$desc=array('Ascent'=>928,'Descent'=>-236,'CapHeight'=>9,'Flags'=>33,'FontBBox'=>'[-558 -375 718 1042]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>602); +$up=-63; +$ut=44; +$dw=602; +$cw=array( +0=>602,32=>602,33=>602,34=>602,35=>602,36=>602,37=>602,38=>602,39=>602,40=>602, +41=>602,42=>602,43=>602,44=>602,45=>602,46=>602,47=>602,48=>602,49=>602,50=>602, +51=>602,52=>602,53=>602,54=>602,55=>602,56=>602,57=>602,58=>602,59=>602,60=>602, +61=>602,62=>602,63=>602,64=>602,65=>602,66=>602,67=>602,68=>602,69=>602,70=>602, +71=>602,72=>602,73=>602,74=>602,75=>602,76=>602,77=>602,78=>602,79=>602,80=>602, +81=>602,82=>602,83=>602,84=>602,85=>602,86=>602,87=>602,88=>602,89=>602,90=>602, +91=>602,92=>602,93=>602,94=>602,95=>602,96=>602,97=>602,98=>602,99=>602,100=>602, +101=>602,102=>602,103=>602,104=>602,105=>602,106=>602,107=>602,108=>602,109=>602,110=>602, +111=>602,112=>602,113=>602,114=>602,115=>602,116=>602,117=>602,118=>602,119=>602,120=>602, +121=>602,122=>602,123=>602,124=>602,125=>602,126=>602,8364=>602,8218=>602,402=>602,8222=>602, +8230=>602,8224=>602,8225=>602,710=>602,8240=>602,352=>602,8249=>602,338=>602,381=>602,8216=>602, +8217=>602,8220=>602,8221=>602,8226=>602,8211=>602,8212=>602,732=>602,8482=>602,353=>602,8250=>602, +339=>602,382=>602,376=>602,160=>602,161=>602,162=>602,163=>602,164=>602,165=>602,166=>602, +167=>602,168=>602,169=>602,170=>602,171=>602,172=>602,173=>602,174=>602,175=>602,176=>602, +177=>602,178=>602,179=>602,180=>602,181=>602,182=>602,183=>602,184=>602,185=>602,186=>602, +187=>602,188=>602,189=>602,190=>602,191=>602,192=>602,193=>602,194=>602,195=>602,196=>602, +197=>602,198=>602,199=>602,200=>602,201=>602,202=>602,203=>602,204=>602,205=>602,206=>602, +207=>602,208=>602,209=>602,210=>602,211=>602,212=>602,213=>602,214=>602,215=>602,216=>602, +217=>602,218=>602,219=>602,220=>602,221=>602,222=>602,223=>602,224=>602,225=>602,226=>602, +227=>602,228=>602,229=>602,230=>602,231=>602,232=>602,233=>602,234=>602,235=>602,236=>602, +237=>602,238=>602,239=>602,240=>602,241=>602,242=>602,243=>602,244=>602,245=>602,246=>602, +247=>602,248=>602,249=>602,250=>602,251=>602,252=>602,253=>602,254=>602,255=>602,256=>602, +257=>602,258=>602,259=>602,260=>602,261=>602,262=>602,263=>602,264=>602,265=>602,266=>602, +267=>602,268=>602,269=>602,270=>602,271=>602,272=>602,273=>602,274=>602,275=>602,276=>602, +277=>602,278=>602,279=>602,280=>602,281=>602,282=>602,283=>602,284=>602,285=>602,286=>602, +287=>602,288=>602,289=>602,290=>602,291=>602,292=>602,293=>602,294=>602,295=>602,296=>602, +297=>602,298=>602,299=>602,300=>602,301=>602,302=>602,303=>602,304=>602,305=>602,306=>602, +307=>602,308=>602,309=>602,310=>602,311=>602,312=>602,313=>602,314=>602,315=>602,316=>602, +317=>602,318=>602,319=>602,320=>602,321=>602,322=>602,323=>602,324=>602,325=>602,326=>602, +327=>602,328=>602,329=>602,330=>602,331=>602,332=>602,333=>602,334=>602,335=>602,336=>602, +337=>602,340=>602,341=>602,342=>602,343=>602,344=>602,345=>602,346=>602,347=>602,348=>602, +349=>602,350=>602,351=>602,354=>602,355=>602,356=>602,357=>602,358=>602,359=>602,360=>602, +361=>602,362=>602,363=>602,364=>602,365=>602,366=>602,367=>602,368=>602,369=>602,370=>602, +371=>602,372=>602,373=>602,374=>602,375=>602,377=>602,378=>602,379=>602,380=>602,383=>602, +384=>602,385=>602,386=>602,387=>602,388=>602,389=>602,390=>602,391=>602,392=>602,393=>602, +394=>602,395=>602,396=>602,397=>602,398=>602,399=>602,400=>602,401=>602,403=>602,404=>602, +405=>602,406=>602,407=>602,408=>602,409=>602,410=>602,411=>602,412=>602,413=>602,414=>602, +415=>602,416=>602,417=>602,418=>602,419=>602,420=>602,421=>602,422=>602,423=>602,424=>602, +425=>602,426=>602,427=>602,428=>602,429=>602,430=>602,431=>602,432=>602,433=>602,434=>602, +435=>602,436=>602,437=>602,438=>602,439=>602,440=>602,441=>602,442=>602,443=>602,444=>602, +445=>602,446=>602,447=>602,448=>602,449=>602,450=>602,451=>602,461=>602,462=>602,463=>602, +464=>602,465=>602,466=>602,467=>602,468=>602,469=>602,470=>602,471=>602,472=>602,473=>602, +474=>602,475=>602,476=>602,477=>602,478=>602,479=>602,480=>602,481=>602,482=>602,483=>602, +486=>602,487=>602,488=>602,489=>602,490=>602,491=>602,492=>602,493=>602,494=>602,495=>602, +496=>602,500=>602,501=>602,502=>602,504=>602,505=>602,508=>602,509=>602,510=>602,511=>602, +512=>602,513=>602,514=>602,515=>602,516=>602,517=>602,518=>602,519=>602,520=>602,521=>602, +522=>602,523=>602,524=>602,525=>602,526=>602,527=>602,528=>602,529=>602,530=>602,531=>602, +532=>602,533=>602,534=>602,535=>602,536=>602,537=>602,538=>602,539=>602,540=>602,541=>602, +542=>602,543=>602,544=>602,545=>602,548=>602,549=>602,550=>602,551=>602,552=>602,553=>602, +554=>602,555=>602,556=>602,557=>602,558=>602,559=>602,560=>602,561=>602,562=>602,563=>602, +564=>602,565=>602,566=>602,567=>602,568=>602,569=>602,570=>602,571=>602,572=>602,573=>602, +574=>602,575=>602,576=>602,577=>602,580=>602,581=>602,588=>602,589=>602,592=>602,593=>602, +594=>602,595=>602,596=>602,597=>602,598=>602,599=>602,600=>602,601=>602,602=>602,603=>602, +604=>602,605=>602,606=>602,607=>602,608=>602,609=>602,610=>602,611=>602,612=>602,613=>602, +614=>602,615=>602,616=>602,617=>602,618=>602,619=>602,620=>602,621=>602,622=>602,623=>602, +624=>602,625=>602,626=>602,627=>602,628=>602,629=>602,630=>602,631=>602,632=>602,633=>602, +634=>602,635=>602,636=>602,637=>602,638=>602,639=>602,640=>602,641=>602,642=>602,643=>602, +644=>602,645=>602,646=>602,647=>602,648=>602,649=>602,650=>602,651=>602,652=>602,653=>602, +654=>602,655=>602,656=>602,657=>602,658=>602,659=>602,660=>602,661=>602,662=>602,663=>602, +664=>602,665=>602,666=>602,667=>602,668=>602,669=>602,670=>602,671=>602,672=>602,673=>602, +674=>602,675=>602,676=>602,677=>602,678=>602,679=>602,680=>602,681=>602,682=>602,683=>602, +684=>602,685=>602,686=>602,687=>602,688=>602,689=>602,690=>602,691=>602,692=>602,693=>602, +694=>602,695=>602,696=>602,697=>602,699=>602,700=>602,701=>602,702=>602,703=>602,704=>602, +705=>602,711=>602,712=>602,713=>602,716=>602,717=>602,720=>602,721=>602,722=>602,723=>602, +726=>602,727=>602,728=>602,729=>602,730=>602,731=>602,733=>602,734=>602,736=>602,737=>602, +738=>602,739=>602,740=>602,741=>602,742=>602,743=>602,744=>602,745=>602,750=>602,755=>602, +768=>602,769=>602,770=>602,771=>602,772=>602,773=>602,774=>602,775=>602,776=>602,777=>602, +778=>602,779=>602,780=>602,781=>602,782=>602,783=>602,784=>602,785=>602,786=>602,787=>602, +788=>602,789=>602,790=>602,791=>602,792=>602,793=>602,794=>602,795=>602,796=>602,797=>602, +798=>602,799=>602,800=>602,801=>602,802=>602,803=>602,804=>602,805=>602,806=>602,807=>602, +808=>602,809=>602,810=>602,811=>602,812=>602,813=>602,814=>602,815=>602,816=>602,817=>602, +818=>602,819=>602,820=>602,821=>602,822=>602,823=>602,824=>602,825=>602,826=>602,827=>602, +828=>602,829=>602,830=>602,831=>602,835=>602,856=>602,865=>602,884=>602,885=>602,890=>602, +894=>602,900=>602,901=>602,902=>602,903=>602,904=>602,905=>602,906=>602,908=>602,910=>602, +911=>602,912=>602,913=>602,914=>602,915=>602,916=>602,917=>602,918=>602,919=>602,920=>602, +921=>602,922=>602,923=>602,924=>602,925=>602,926=>602,927=>602,928=>602,929=>602,931=>602, +932=>602,933=>602,934=>602,935=>602,936=>602,937=>602,938=>602,939=>602,940=>602,941=>602, +942=>602,943=>602,944=>602,945=>602,946=>602,947=>602,948=>602,949=>602,950=>602,951=>602, +952=>602,953=>602,954=>602,955=>602,956=>602,957=>602,958=>602,959=>602,960=>602,961=>602, +962=>602,963=>602,964=>602,965=>602,966=>602,967=>602,968=>602,969=>602,970=>602,971=>602, +972=>602,973=>602,974=>602,976=>602,977=>602,978=>602,979=>602,980=>602,981=>602,982=>602, +983=>602,984=>602,985=>602,986=>602,987=>602,988=>602,989=>602,990=>602,991=>602,992=>602, +993=>602,1008=>602,1009=>602,1010=>602,1011=>602,1012=>602,1013=>602,1014=>602,1015=>602,1016=>602, +1017=>602,1018=>602,1019=>602,1020=>602,1021=>602,1022=>602,1023=>602,1024=>602,1025=>602,1026=>602, +1027=>602,1028=>602,1029=>602,1030=>602,1031=>602,1032=>602,1033=>602,1034=>602,1035=>602,1036=>602, +1037=>602,1038=>602,1039=>602,1040=>602,1041=>602,1042=>602,1043=>602,1044=>602,1045=>602,1046=>602, +1047=>602,1048=>602,1049=>602,1050=>602,1051=>602,1052=>602,1053=>602,1054=>602,1055=>602,1056=>602, +1057=>602,1058=>602,1059=>602,1060=>602,1061=>602,1062=>602,1063=>602,1064=>602,1065=>602,1066=>602, +1067=>602,1068=>602,1069=>602,1070=>602,1071=>602,1072=>602,1073=>602,1074=>602,1075=>602,1076=>602, +1077=>602,1078=>602,1079=>602,1080=>602,1081=>602,1082=>602,1083=>602,1084=>602,1085=>602,1086=>602, +1087=>602,1088=>602,1089=>602,1090=>602,1091=>602,1092=>602,1093=>602,1094=>602,1095=>602,1096=>602, +1097=>602,1098=>602,1099=>602,1100=>602,1101=>602,1102=>602,1103=>602,1104=>602,1105=>602,1106=>602, +1107=>602,1108=>602,1109=>602,1110=>602,1111=>602,1112=>602,1113=>602,1114=>602,1115=>602,1116=>602, +1117=>602,1118=>602,1119=>602,1122=>602,1123=>602,1138=>602,1139=>602,1168=>602,1169=>602,1170=>602, +1171=>602,1172=>602,1173=>602,1174=>602,1175=>602,1176=>602,1177=>602,1178=>602,1179=>602,1186=>602, +1187=>602,1194=>602,1195=>602,1196=>602,1197=>602,1198=>602,1199=>602,1200=>602,1201=>602,1202=>602, +1203=>602,1210=>602,1211=>602,1216=>602,1217=>602,1218=>602,1219=>602,1220=>602,1223=>602,1224=>602, +1227=>602,1228=>602,1231=>602,1232=>602,1233=>602,1234=>602,1235=>602,1236=>602,1237=>602,1238=>602, +1239=>602,1240=>602,1241=>602,1242=>602,1243=>602,1244=>602,1245=>602,1246=>602,1247=>602,1248=>602, +1249=>602,1250=>602,1251=>602,1252=>602,1253=>602,1254=>602,1255=>602,1256=>602,1257=>602,1258=>602, +1259=>602,1260=>602,1261=>602,1262=>602,1263=>602,1264=>602,1265=>602,1266=>602,1267=>602,1268=>602, +1269=>602,1270=>602,1271=>602,1272=>602,1273=>602,1296=>602,1297=>602,1306=>602,1307=>602,1308=>602, +1309=>602,1542=>602,1543=>602,1545=>602,1546=>602,1548=>602,1557=>602,1563=>602,1567=>602,1569=>602, +1570=>602,1571=>602,1572=>602,1573=>602,1574=>602,1575=>602,1576=>602,1577=>602,1578=>602,1579=>602, +1580=>602,1581=>602,1582=>602,1583=>602,1584=>602,1585=>602,1586=>602,1587=>602,1588=>602,1589=>602, +1590=>602,1591=>602,1592=>602,1593=>602,1594=>602,1600=>602,1601=>602,1602=>602,1603=>602,1604=>602, +1605=>602,1606=>602,1607=>602,1608=>602,1609=>602,1610=>602,1611=>602,1612=>602,1613=>602,1614=>602, +1615=>602,1616=>602,1617=>602,1618=>602,1619=>602,1620=>602,1621=>602,1626=>602,1632=>602,1633=>602, +1634=>602,1635=>602,1636=>602,1637=>602,1638=>602,1639=>602,1640=>602,1641=>602,1642=>602,1643=>602, +1644=>602,1645=>602,1652=>602,1657=>602,1658=>602,1659=>602,1662=>602,1663=>602,1664=>602,1667=>602, +1668=>602,1670=>602,1671=>602,1681=>602,1688=>602,1700=>602,1705=>602,1711=>602,1726=>602,1740=>602, +1776=>602,1777=>602,1778=>602,1779=>602,1780=>602,1781=>602,1782=>602,1783=>602,1784=>602,1785=>602, +3713=>602,3714=>602,3716=>602,3719=>602,3720=>602,3722=>602,3725=>602,3732=>602,3733=>602,3734=>602, +3735=>602,3737=>602,3738=>602,3739=>602,3740=>602,3741=>602,3742=>602,3743=>602,3745=>602,3746=>602, +3747=>602,3749=>602,3751=>602,3754=>602,3755=>602,3757=>602,3758=>602,3759=>602,3760=>602,3761=>602, +3762=>602,3763=>602,3764=>602,3765=>602,3766=>602,3767=>602,3768=>602,3769=>602,3771=>602,3772=>602, +3784=>602,3785=>602,3786=>602,3787=>602,3788=>602,3789=>602,4304=>602,4305=>602,4306=>602,4307=>602, +4308=>602,4309=>602,4310=>602,4311=>602,4312=>602,4313=>602,4314=>602,4315=>602,4316=>602,4317=>602, +4318=>602,4319=>602,4320=>602,4321=>602,4322=>602,4323=>602,4324=>602,4325=>602,4326=>602,4327=>602, +4328=>602,4329=>602,4330=>602,4331=>602,4332=>602,4333=>602,4334=>602,4335=>602,4336=>602,4337=>602, +4338=>602,4339=>602,4340=>602,4341=>602,4342=>602,4343=>602,4344=>602,4345=>602,4346=>602,4347=>602, +4348=>602,7426=>602,7432=>602,7433=>602,7444=>602,7446=>602,7447=>602,7453=>602,7454=>602,7455=>602, +7468=>602,7469=>602,7470=>602,7472=>602,7473=>602,7474=>602,7475=>602,7476=>602,7477=>602,7478=>602, +7479=>602,7480=>602,7481=>602,7482=>602,7483=>602,7484=>602,7486=>602,7487=>602,7488=>602,7489=>602, +7490=>602,7491=>602,7492=>602,7493=>602,7494=>602,7495=>602,7496=>602,7497=>602,7498=>602,7499=>602, +7500=>602,7501=>602,7502=>602,7503=>602,7504=>602,7505=>602,7506=>602,7507=>602,7508=>602,7509=>602, +7510=>602,7511=>602,7512=>602,7513=>602,7514=>602,7515=>602,7522=>602,7523=>602,7524=>602,7525=>602, +7543=>602,7544=>602,7547=>602,7557=>602,7579=>602,7580=>602,7581=>602,7582=>602,7583=>602,7584=>602, +7585=>602,7586=>602,7587=>602,7588=>602,7589=>602,7590=>602,7591=>602,7592=>602,7593=>602,7594=>602, +7595=>602,7596=>602,7597=>602,7598=>602,7599=>602,7600=>602,7601=>602,7602=>602,7603=>602,7604=>602, +7605=>602,7606=>602,7607=>602,7609=>602,7610=>602,7611=>602,7612=>602,7613=>602,7614=>602,7615=>602, +7680=>602,7681=>602,7682=>602,7683=>602,7684=>602,7685=>602,7686=>602,7687=>602,7688=>602,7689=>602, +7690=>602,7691=>602,7692=>602,7693=>602,7694=>602,7695=>602,7696=>602,7697=>602,7698=>602,7699=>602, +7704=>602,7705=>602,7706=>602,7707=>602,7708=>602,7709=>602,7710=>602,7711=>602,7712=>602,7713=>602, +7714=>602,7715=>602,7716=>602,7717=>602,7718=>602,7719=>602,7720=>602,7721=>602,7722=>602,7723=>602, +7724=>602,7725=>602,7728=>602,7729=>602,7730=>602,7731=>602,7732=>602,7733=>602,7734=>602,7735=>602, +7736=>602,7737=>602,7738=>602,7739=>602,7740=>602,7741=>602,7742=>602,7743=>602,7744=>602,7745=>602, +7746=>602,7747=>602,7748=>602,7749=>602,7750=>602,7751=>602,7752=>602,7753=>602,7754=>602,7755=>602, +7756=>602,7757=>602,7764=>602,7765=>602,7766=>602,7767=>602,7768=>602,7769=>602,7770=>602,7771=>602, +7772=>602,7773=>602,7774=>602,7775=>602,7776=>602,7777=>602,7778=>602,7779=>602,7784=>602,7785=>602, +7786=>602,7787=>602,7788=>602,7789=>602,7790=>602,7791=>602,7792=>602,7793=>602,7794=>602,7795=>602, +7796=>602,7797=>602,7798=>602,7799=>602,7800=>602,7801=>602,7804=>602,7805=>602,7806=>602,7807=>602, +7808=>602,7809=>602,7810=>602,7811=>602,7812=>602,7813=>602,7814=>602,7815=>602,7816=>602,7817=>602, +7818=>602,7819=>602,7820=>602,7821=>602,7822=>602,7823=>602,7824=>602,7825=>602,7826=>602,7827=>602, +7828=>602,7829=>602,7830=>602,7831=>602,7832=>602,7833=>602,7835=>602,7839=>602,7840=>602,7841=>602, +7852=>602,7853=>602,7856=>602,7857=>602,7862=>602,7863=>602,7864=>602,7865=>602,7868=>602,7869=>602, +7878=>602,7879=>602,7882=>602,7883=>602,7884=>602,7885=>602,7896=>602,7897=>602,7898=>602,7899=>602, +7900=>602,7901=>602,7904=>602,7905=>602,7906=>602,7907=>602,7908=>602,7909=>602,7912=>602,7913=>602, +7914=>602,7915=>602,7918=>602,7919=>602,7920=>602,7921=>602,7922=>602,7923=>602,7924=>602,7925=>602, +7928=>602,7929=>602,7936=>602,7937=>602,7938=>602,7939=>602,7940=>602,7941=>602,7942=>602,7943=>602, +7944=>602,7945=>602,7946=>602,7947=>602,7948=>602,7949=>602,7950=>602,7951=>602,7952=>602,7953=>602, +7954=>602,7955=>602,7956=>602,7957=>602,7960=>602,7961=>602,7962=>602,7963=>602,7964=>602,7965=>602, +7968=>602,7969=>602,7970=>602,7971=>602,7972=>602,7973=>602,7974=>602,7975=>602,7976=>602,7977=>602, +7978=>602,7979=>602,7980=>602,7981=>602,7982=>602,7983=>602,7984=>602,7985=>602,7986=>602,7987=>602, +7988=>602,7989=>602,7990=>602,7991=>602,7992=>602,7993=>602,7994=>602,7995=>602,7996=>602,7997=>602, +7998=>602,7999=>602,8000=>602,8001=>602,8002=>602,8003=>602,8004=>602,8005=>602,8008=>602,8009=>602, +8010=>602,8011=>602,8012=>602,8013=>602,8016=>602,8017=>602,8018=>602,8019=>602,8020=>602,8021=>602, +8022=>602,8023=>602,8025=>602,8027=>602,8029=>602,8031=>602,8032=>602,8033=>602,8034=>602,8035=>602, +8036=>602,8037=>602,8038=>602,8039=>602,8040=>602,8041=>602,8042=>602,8043=>602,8044=>602,8045=>602, +8046=>602,8047=>602,8048=>602,8049=>602,8050=>602,8051=>602,8052=>602,8053=>602,8054=>602,8055=>602, +8056=>602,8057=>602,8058=>602,8059=>602,8060=>602,8061=>602,8064=>602,8065=>602,8066=>602,8067=>602, +8068=>602,8069=>602,8070=>602,8071=>602,8072=>602,8073=>602,8074=>602,8075=>602,8076=>602,8077=>602, +8078=>602,8079=>602,8080=>602,8081=>602,8082=>602,8083=>602,8084=>602,8085=>602,8086=>602,8087=>602, +8088=>602,8089=>602,8090=>602,8091=>602,8092=>602,8093=>602,8094=>602,8095=>602,8096=>602,8097=>602, +8098=>602,8099=>602,8100=>602,8101=>602,8102=>602,8103=>602,8104=>602,8105=>602,8106=>602,8107=>602, +8108=>602,8109=>602,8110=>602,8111=>602,8112=>602,8113=>602,8114=>602,8115=>602,8116=>602,8118=>602, +8119=>602,8120=>602,8121=>602,8122=>602,8123=>602,8124=>602,8125=>602,8126=>602,8127=>602,8128=>602, +8129=>602,8130=>602,8131=>602,8132=>602,8134=>602,8135=>602,8136=>602,8137=>602,8138=>602,8139=>602, +8140=>602,8141=>602,8142=>602,8143=>602,8144=>602,8145=>602,8146=>602,8147=>602,8150=>602,8151=>602, +8152=>602,8153=>602,8154=>602,8155=>602,8157=>602,8158=>602,8159=>602,8160=>602,8161=>602,8162=>602, +8163=>602,8164=>602,8165=>602,8166=>602,8167=>602,8168=>602,8169=>602,8170=>602,8171=>602,8172=>602, +8173=>602,8174=>602,8175=>602,8178=>602,8179=>602,8180=>602,8182=>602,8183=>602,8184=>602,8185=>602, +8186=>602,8187=>602,8188=>602,8189=>602,8190=>602,8192=>602,8193=>602,8194=>602,8195=>602,8196=>602, +8197=>602,8198=>602,8199=>602,8200=>602,8201=>602,8202=>602,8208=>602,8209=>602,8210=>602,8213=>602, +8215=>602,8219=>602,8223=>602,8227=>602,8239=>602,8241=>602,8242=>602,8243=>602,8244=>602,8245=>602, +8246=>602,8247=>602,8252=>602,8253=>602,8254=>602,8261=>602,8262=>602,8263=>602,8264=>602,8265=>602, +8287=>602,8304=>602,8305=>602,8308=>602,8309=>602,8310=>602,8311=>602,8312=>602,8313=>602,8314=>602, +8315=>602,8316=>602,8317=>602,8318=>602,8319=>602,8320=>602,8321=>602,8322=>602,8323=>602,8324=>602, +8325=>602,8326=>602,8327=>602,8328=>602,8329=>602,8330=>602,8331=>602,8332=>602,8333=>602,8334=>602, +8336=>602,8337=>602,8338=>602,8339=>602,8340=>602,8352=>602,8353=>602,8354=>602,8355=>602,8356=>602, +8357=>602,8358=>602,8359=>602,8360=>602,8361=>602,8362=>602,8363=>602,8365=>602,8366=>602,8367=>602, +8368=>602,8369=>602,8370=>602,8371=>602,8372=>602,8373=>602,8450=>602,8453=>602,8461=>602,8462=>602, +8463=>602,8469=>602,8470=>602,8471=>602,8473=>602,8474=>602,8477=>602,8484=>602,8486=>602,8490=>602, +8491=>602,8494=>602,8531=>602,8532=>602,8533=>602,8534=>602,8535=>602,8536=>602,8537=>602,8538=>602, +8539=>602,8540=>602,8541=>602,8542=>602,8543=>602,8592=>602,8593=>602,8594=>602,8595=>602,8596=>602, +8597=>602,8598=>602,8599=>602,8600=>602,8601=>602,8602=>602,8603=>602,8604=>602,8605=>602,8606=>602, +8607=>602,8608=>602,8609=>602,8610=>602,8611=>602,8612=>602,8613=>602,8614=>602,8615=>602,8616=>602, +8617=>602,8618=>602,8619=>602,8620=>602,8621=>602,8622=>602,8623=>602,8624=>602,8625=>602,8626=>602, +8627=>602,8628=>602,8629=>602,8630=>602,8631=>602,8632=>602,8633=>602,8634=>602,8635=>602,8636=>602, +8637=>602,8638=>602,8639=>602,8640=>602,8641=>602,8642=>602,8643=>602,8644=>602,8645=>602,8646=>602, +8647=>602,8648=>602,8649=>602,8650=>602,8651=>602,8652=>602,8653=>602,8654=>602,8655=>602,8656=>602, +8657=>602,8658=>602,8659=>602,8660=>602,8661=>602,8662=>602,8663=>602,8664=>602,8665=>602,8666=>602, +8667=>602,8668=>602,8669=>602,8670=>602,8671=>602,8672=>602,8673=>602,8674=>602,8675=>602,8676=>602, +8677=>602,8678=>602,8679=>602,8680=>602,8681=>602,8682=>602,8683=>602,8684=>602,8685=>602,8686=>602, +8687=>602,8688=>602,8689=>602,8690=>602,8691=>602,8692=>602,8693=>602,8694=>602,8695=>602,8696=>602, +8697=>602,8698=>602,8699=>602,8700=>602,8701=>602,8702=>602,8703=>602,8704=>602,8705=>602,8706=>602, +8707=>602,8708=>602,8709=>602,8710=>602,8711=>602,8712=>602,8713=>602,8714=>602,8715=>602,8716=>602, +8717=>602,8719=>602,8721=>602,8722=>602,8723=>602,8725=>602,8727=>602,8728=>602,8729=>602,8730=>602, +8731=>602,8732=>602,8733=>602,8734=>602,8735=>602,8736=>602,8743=>602,8744=>602,8745=>602,8746=>602, +8747=>602,8748=>602,8749=>602,8760=>602,8761=>602,8762=>602,8763=>602,8764=>602,8765=>602,8769=>602, +8770=>602,8771=>602,8772=>602,8773=>602,8774=>602,8775=>602,8776=>602,8777=>602,8778=>602,8779=>602, +8780=>602,8781=>602,8782=>602,8783=>602,8784=>602,8785=>602,8786=>602,8787=>602,8788=>602,8789=>602, +8790=>602,8791=>602,8792=>602,8793=>602,8794=>602,8795=>602,8796=>602,8797=>602,8798=>602,8799=>602, +8800=>602,8801=>602,8802=>602,8803=>602,8804=>602,8805=>602,8806=>602,8807=>602,8808=>602,8809=>602, +8813=>602,8814=>602,8815=>602,8816=>602,8817=>602,8818=>602,8819=>602,8820=>602,8821=>602,8822=>602, +8823=>602,8824=>602,8825=>602,8826=>602,8827=>602,8828=>602,8829=>602,8830=>602,8831=>602,8832=>602, +8833=>602,8834=>602,8835=>602,8836=>602,8837=>602,8838=>602,8839=>602,8840=>602,8841=>602,8842=>602, +8843=>602,8847=>602,8848=>602,8849=>602,8850=>602,8853=>602,8854=>602,8855=>602,8856=>602,8857=>602, +8858=>602,8859=>602,8860=>602,8861=>602,8862=>602,8863=>602,8864=>602,8865=>602,8901=>602,8902=>602, +8909=>602,8922=>602,8923=>602,8924=>602,8925=>602,8926=>602,8927=>602,8928=>602,8929=>602,8930=>602, +8931=>602,8932=>602,8933=>602,8934=>602,8935=>602,8936=>602,8937=>602,8943=>602,8960=>602,8961=>602, +8962=>602,8963=>602,8964=>602,8965=>602,8966=>602,8968=>602,8969=>602,8970=>602,8971=>602,8972=>602, +8973=>602,8974=>602,8975=>602,8976=>602,8977=>602,8978=>602,8979=>602,8980=>602,8981=>602,8984=>602, +8985=>602,8988=>602,8989=>602,8990=>602,8991=>602,8992=>602,8993=>602,8997=>602,8998=>602,8999=>602, +9000=>602,9003=>602,9013=>602,9015=>602,9016=>602,9017=>602,9018=>602,9019=>602,9020=>602,9021=>602, +9022=>602,9025=>602,9026=>602,9027=>602,9028=>602,9031=>602,9032=>602,9033=>602,9035=>602,9036=>602, +9037=>602,9040=>602,9042=>602,9043=>602,9044=>602,9047=>602,9048=>602,9049=>602,9050=>602,9051=>602, +9052=>602,9054=>602,9055=>602,9056=>602,9059=>602,9060=>602,9061=>602,9064=>602,9065=>602,9067=>602, +9068=>602,9069=>602,9070=>602,9071=>602,9072=>602,9075=>602,9076=>602,9077=>602,9078=>602,9079=>602, +9080=>602,9081=>602,9082=>602,9085=>602,9088=>602,9089=>602,9090=>602,9091=>602,9096=>602,9097=>602, +9098=>602,9099=>602,9109=>602,9115=>602,9116=>602,9117=>602,9118=>602,9119=>602,9120=>602,9121=>602, +9122=>602,9123=>602,9124=>602,9125=>602,9126=>602,9127=>602,9128=>602,9129=>602,9130=>602,9131=>602, +9132=>602,9133=>602,9134=>602,9166=>602,9167=>602,9251=>602,9472=>602,9473=>602,9474=>602,9475=>602, +9476=>602,9477=>602,9478=>602,9479=>602,9480=>602,9481=>602,9482=>602,9483=>602,9484=>602,9485=>602, +9486=>602,9487=>602,9488=>602,9489=>602,9490=>602,9491=>602,9492=>602,9493=>602,9494=>602,9495=>602, +9496=>602,9497=>602,9498=>602,9499=>602,9500=>602,9501=>602,9502=>602,9503=>602,9504=>602,9505=>602, +9506=>602,9507=>602,9508=>602,9509=>602,9510=>602,9511=>602,9512=>602,9513=>602,9514=>602,9515=>602, +9516=>602,9517=>602,9518=>602,9519=>602,9520=>602,9521=>602,9522=>602,9523=>602,9524=>602,9525=>602, +9526=>602,9527=>602,9528=>602,9529=>602,9530=>602,9531=>602,9532=>602,9533=>602,9534=>602,9535=>602, +9536=>602,9537=>602,9538=>602,9539=>602,9540=>602,9541=>602,9542=>602,9543=>602,9544=>602,9545=>602, +9546=>602,9547=>602,9548=>602,9549=>602,9550=>602,9551=>602,9552=>602,9553=>602,9554=>602,9555=>602, +9556=>602,9557=>602,9558=>602,9559=>602,9560=>602,9561=>602,9562=>602,9563=>602,9564=>602,9565=>602, +9566=>602,9567=>602,9568=>602,9569=>602,9570=>602,9571=>602,9572=>602,9573=>602,9574=>602,9575=>602, +9576=>602,9577=>602,9578=>602,9579=>602,9580=>602,9581=>602,9582=>602,9583=>602,9584=>602,9585=>602, +9586=>602,9587=>602,9588=>602,9589=>602,9590=>602,9591=>602,9592=>602,9593=>602,9594=>602,9595=>602, +9596=>602,9597=>602,9598=>602,9599=>602,9600=>602,9601=>602,9602=>602,9603=>602,9604=>602,9605=>602, +9606=>602,9607=>602,9608=>602,9609=>602,9610=>602,9611=>602,9612=>602,9613=>602,9614=>602,9615=>602, +9616=>602,9617=>602,9618=>602,9619=>602,9620=>602,9621=>602,9622=>602,9623=>602,9624=>602,9625=>602, +9626=>602,9627=>602,9628=>602,9629=>602,9630=>602,9631=>602,9632=>602,9633=>602,9634=>602,9635=>602, +9636=>602,9637=>602,9638=>602,9639=>602,9640=>602,9641=>602,9642=>602,9643=>602,9644=>602,9645=>602, +9646=>602,9647=>602,9648=>602,9649=>602,9650=>602,9651=>602,9652=>602,9653=>602,9654=>602,9655=>602, +9656=>602,9657=>602,9658=>602,9659=>602,9660=>602,9661=>602,9662=>602,9663=>602,9664=>602,9665=>602, +9666=>602,9667=>602,9668=>602,9669=>602,9670=>602,9671=>602,9672=>602,9673=>602,9674=>602,9675=>602, +9676=>602,9677=>602,9678=>602,9679=>602,9680=>602,9681=>602,9682=>602,9683=>602,9684=>602,9685=>602, +9686=>602,9687=>602,9688=>602,9689=>602,9690=>602,9691=>602,9692=>602,9693=>602,9694=>602,9695=>602, +9696=>602,9697=>602,9698=>602,9699=>602,9700=>602,9701=>602,9702=>602,9703=>602,9704=>602,9705=>602, +9706=>602,9707=>602,9708=>602,9709=>602,9710=>602,9711=>602,9712=>602,9713=>602,9714=>602,9715=>602, +9716=>602,9717=>602,9718=>602,9719=>602,9720=>602,9721=>602,9722=>602,9723=>602,9724=>602,9725=>602, +9726=>602,9727=>602,9728=>602,9729=>602,9730=>602,9731=>602,9732=>602,9733=>602,9734=>602,9735=>602, +9736=>602,9737=>602,9738=>602,9739=>602,9740=>602,9741=>602,9742=>602,9743=>602,9744=>602,9745=>602, +9746=>602,9747=>602,9748=>602,9749=>602,9750=>602,9751=>602,9752=>602,9753=>602,9754=>602,9755=>602, +9756=>602,9757=>602,9758=>602,9759=>602,9760=>602,9761=>602,9762=>602,9763=>602,9764=>602,9765=>602, +9766=>602,9767=>602,9768=>602,9769=>602,9770=>602,9771=>602,9772=>602,9773=>602,9774=>602,9775=>602, +9784=>602,9785=>602,9786=>602,9787=>602,9788=>602,9789=>602,9790=>602,9791=>602,9792=>602,9793=>602, +9794=>602,9795=>602,9796=>602,9797=>602,9798=>602,9799=>602,9800=>602,9801=>602,9802=>602,9803=>602, +9804=>602,9805=>602,9806=>602,9807=>602,9808=>602,9809=>602,9810=>602,9811=>602,9812=>602,9813=>602, +9814=>602,9815=>602,9816=>602,9817=>602,9818=>602,9819=>602,9820=>602,9821=>602,9822=>602,9823=>602, +9824=>602,9825=>602,9826=>602,9827=>602,9828=>602,9829=>602,9830=>602,9831=>602,9832=>602,9833=>602, +9834=>602,9835=>602,9836=>602,9837=>602,9838=>602,9839=>602,9840=>602,9841=>602,9842=>602,9843=>602, +9844=>602,9845=>602,9846=>602,9847=>602,9848=>602,9849=>602,9850=>602,9851=>602,9852=>602,9853=>602, +9854=>602,9855=>602,9856=>602,9857=>602,9858=>602,9859=>602,9860=>602,9861=>602,9862=>602,9863=>602, +9864=>602,9865=>602,9866=>602,9867=>602,9872=>602,9873=>602,9874=>602,9875=>602,9876=>602,9877=>602, +9878=>602,9879=>602,9880=>602,9881=>602,9882=>602,9883=>602,9884=>602,9888=>602,9889=>602,9904=>602, +9905=>602,9985=>602,9986=>602,9987=>602,9988=>602,9990=>602,9991=>602,9992=>602,9993=>602,9996=>602, +9997=>602,9998=>602,9999=>602,10000=>602,10001=>602,10002=>602,10003=>602,10004=>602,10005=>602,10006=>602, +10007=>602,10008=>602,10009=>602,10010=>602,10011=>602,10012=>602,10013=>602,10014=>602,10015=>602,10016=>602, +10017=>602,10018=>602,10019=>602,10020=>602,10021=>602,10022=>602,10023=>602,10025=>602,10026=>602,10027=>602, +10028=>602,10029=>602,10030=>602,10031=>602,10032=>602,10033=>602,10034=>602,10035=>602,10036=>602,10037=>602, +10038=>602,10039=>602,10040=>602,10041=>602,10042=>602,10043=>602,10044=>602,10045=>602,10046=>602,10047=>602, +10048=>602,10049=>602,10050=>602,10051=>602,10052=>602,10053=>602,10054=>602,10055=>602,10056=>602,10057=>602, +10058=>602,10059=>602,10061=>602,10063=>602,10064=>602,10065=>602,10066=>602,10070=>602,10072=>602,10073=>602, +10074=>602,10075=>602,10076=>602,10077=>602,10078=>602,10081=>602,10082=>602,10083=>602,10084=>602,10085=>602, +10086=>602,10087=>602,10088=>602,10089=>602,10090=>602,10091=>602,10092=>602,10093=>602,10094=>602,10095=>602, +10096=>602,10097=>602,10098=>602,10099=>602,10100=>602,10101=>602,10132=>602,10136=>602,10137=>602,10138=>602, +10139=>602,10140=>602,10141=>602,10142=>602,10143=>602,10144=>602,10145=>602,10146=>602,10147=>602,10148=>602, +10149=>602,10150=>602,10151=>602,10152=>602,10153=>602,10154=>602,10155=>602,10156=>602,10157=>602,10158=>602, +10159=>602,10161=>602,10162=>602,10163=>602,10164=>602,10165=>602,10166=>602,10167=>602,10168=>602,10169=>602, +10170=>602,10171=>602,10172=>602,10173=>602,10174=>602,10181=>602,10182=>602,10208=>602,10216=>602,10217=>602, +10731=>602,10746=>602,10747=>602,10799=>602,11026=>602,11027=>602,11028=>602,11029=>602,11030=>602,11031=>602, +11032=>602,11033=>602,11034=>602,11364=>602,11374=>602,11375=>602,11381=>602,11382=>602,11383=>602,11385=>602, +11386=>602,11388=>602,11389=>602,11800=>602,11810=>602,11811=>602,11812=>602,11813=>602,11822=>602,42760=>602, +42761=>602,42762=>602,42763=>602,42764=>602,42765=>602,42766=>602,42767=>602,42768=>602,42769=>602,42770=>602, +42771=>602,42772=>602,42773=>602,42774=>602,42779=>602,42780=>602,42781=>602,42782=>602,42783=>602,42790=>602, +42791=>602,42889=>602,42890=>602,42891=>602,42892=>602,63173=>602,64257=>602,64258=>602,64338=>602,64339=>602, +64340=>602,64341=>602,64342=>602,64343=>602,64344=>602,64345=>602,64346=>602,64347=>602,64348=>602,64349=>602, +64350=>602,64351=>602,64352=>602,64353=>602,64354=>602,64355=>602,64356=>602,64357=>602,64358=>602,64359=>602, +64360=>602,64361=>602,64362=>602,64363=>602,64364=>602,64365=>602,64366=>602,64367=>602,64368=>602,64369=>602, +64370=>602,64371=>602,64372=>602,64373=>602,64374=>602,64375=>602,64376=>602,64377=>602,64378=>602,64379=>602, +64380=>602,64381=>602,64382=>602,64383=>602,64384=>602,64385=>602,64394=>602,64395=>602,64396=>602,64397=>602, +64398=>602,64399=>602,64400=>602,64401=>602,64402=>602,64403=>602,64404=>602,64405=>602,64414=>602,64415=>602, +64426=>602,64427=>602,64428=>602,64429=>602,64488=>602,64489=>602,64508=>602,64509=>602,64510=>602,64511=>602, +65136=>602,65137=>602,65138=>602,65139=>602,65140=>602,65142=>602,65143=>602,65144=>602,65145=>602,65146=>602, +65147=>602,65148=>602,65149=>602,65150=>602,65151=>602,65152=>602,65153=>602,65154=>602,65155=>602,65156=>602, +65157=>602,65158=>602,65159=>602,65160=>602,65161=>602,65162=>602,65163=>602,65164=>602,65165=>602,65166=>602, +65167=>602,65168=>602,65169=>602,65170=>602,65171=>602,65172=>602,65173=>602,65174=>602,65175=>602,65176=>602, +65177=>602,65178=>602,65179=>602,65180=>602,65181=>602,65182=>602,65183=>602,65184=>602,65185=>602,65186=>602, +65187=>602,65188=>602,65189=>602,65190=>602,65191=>602,65192=>602,65193=>602,65194=>602,65195=>602,65196=>602, +65197=>602,65198=>602,65199=>602,65200=>602,65201=>602,65202=>602,65203=>602,65204=>602,65205=>602,65206=>602, +65207=>602,65208=>602,65209=>602,65210=>602,65211=>602,65212=>602,65213=>602,65214=>602,65215=>602,65216=>602, +65217=>602,65218=>602,65219=>602,65220=>602,65221=>602,65222=>602,65223=>602,65224=>602,65225=>602,65226=>602, +65227=>602,65228=>602,65229=>602,65230=>602,65231=>602,65232=>602,65233=>602,65234=>602,65235=>602,65236=>602, +65237=>602,65238=>602,65239=>602,65240=>602,65241=>602,65242=>602,65243=>602,65244=>602,65245=>602,65246=>602, +65247=>602,65248=>602,65249=>602,65250=>602,65251=>602,65252=>602,65253=>602,65254=>602,65255=>602,65256=>602, +65257=>602,65258=>602,65259=>602,65260=>602,65261=>602,65262=>602,65263=>602,65264=>602,65265=>602,65266=>602, +65267=>602,65268=>602,65269=>602,65270=>602,65271=>602,65272=>602,65273=>602,65274=>602,65275=>602,65276=>602, +65279=>602,65529=>602,65530=>602,65531=>602,65532=>602,65533=>602); +$enc=''; +$diff=''; +$file='dejavusansmono.z'; +$ctg='dejavusansmono.ctg.z'; +$originalsize=321524; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmono.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmono.z new file mode 100644 index 0000000..3b9ede1 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmono.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonob.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonob.ctg.z new file mode 100644 index 0000000..0ce0dba Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonob.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonob.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonob.php new file mode 100644 index 0000000..11e5d55 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonob.php @@ -0,0 +1,307 @@ +<?php +$type='TrueTypeUnicode'; +$name='DejaVuSansMono-Bold'; +$desc=array('Ascent'=>928,'Descent'=>-236,'CapHeight'=>13,'Flags'=>33,'FontBBox'=>'[-446 -394 731 1052]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>602); +$up=-63; +$ut=44; +$dw=602; +$cw=array( +0=>602,32=>602,33=>602,34=>602,35=>602,36=>602,37=>602,38=>602,39=>602,40=>602, +41=>602,42=>602,43=>602,44=>602,45=>602,46=>602,47=>602,48=>602,49=>602,50=>602, +51=>602,52=>602,53=>602,54=>602,55=>602,56=>602,57=>602,58=>602,59=>602,60=>602, +61=>602,62=>602,63=>602,64=>602,65=>602,66=>602,67=>602,68=>602,69=>602,70=>602, +71=>602,72=>602,73=>602,74=>602,75=>602,76=>602,77=>602,78=>602,79=>602,80=>602, +81=>602,82=>602,83=>602,84=>602,85=>602,86=>602,87=>602,88=>602,89=>602,90=>602, +91=>602,92=>602,93=>602,94=>602,95=>602,96=>602,97=>602,98=>602,99=>602,100=>602, +101=>602,102=>602,103=>602,104=>602,105=>602,106=>602,107=>602,108=>602,109=>602,110=>602, +111=>602,112=>602,113=>602,114=>602,115=>602,116=>602,117=>602,118=>602,119=>602,120=>602, +121=>602,122=>602,123=>602,124=>602,125=>602,126=>602,8364=>602,8218=>602,402=>602,8222=>602, +8230=>602,8224=>602,8225=>602,710=>602,8240=>602,352=>602,8249=>602,338=>602,381=>602,8216=>602, +8217=>602,8220=>602,8221=>602,8226=>602,8211=>602,8212=>602,732=>602,8482=>602,353=>602,8250=>602, +339=>602,382=>602,376=>602,160=>602,161=>602,162=>602,163=>602,164=>602,165=>602,166=>602, +167=>602,168=>602,169=>602,170=>602,171=>602,172=>602,173=>602,174=>602,175=>602,176=>602, +177=>602,178=>602,179=>602,180=>602,181=>602,182=>602,183=>602,184=>602,185=>602,186=>602, +187=>602,188=>602,189=>602,190=>602,191=>602,192=>602,193=>602,194=>602,195=>602,196=>602, +197=>602,198=>602,199=>602,200=>602,201=>602,202=>602,203=>602,204=>602,205=>602,206=>602, +207=>602,208=>602,209=>602,210=>602,211=>602,212=>602,213=>602,214=>602,215=>602,216=>602, +217=>602,218=>602,219=>602,220=>602,221=>602,222=>602,223=>602,224=>602,225=>602,226=>602, +227=>602,228=>602,229=>602,230=>602,231=>602,232=>602,233=>602,234=>602,235=>602,236=>602, +237=>602,238=>602,239=>602,240=>602,241=>602,242=>602,243=>602,244=>602,245=>602,246=>602, +247=>602,248=>602,249=>602,250=>602,251=>602,252=>602,253=>602,254=>602,255=>602,256=>602, +257=>602,258=>602,259=>602,260=>602,261=>602,262=>602,263=>602,264=>602,265=>602,266=>602, +267=>602,268=>602,269=>602,270=>602,271=>602,272=>602,273=>602,274=>602,275=>602,276=>602, +277=>602,278=>602,279=>602,280=>602,281=>602,282=>602,283=>602,284=>602,285=>602,286=>602, +287=>602,288=>602,289=>602,290=>602,291=>602,292=>602,293=>602,294=>602,295=>602,296=>602, +297=>602,298=>602,299=>602,300=>602,301=>602,302=>602,303=>602,304=>602,305=>602,306=>602, +307=>602,308=>602,309=>602,310=>602,311=>602,312=>602,313=>602,314=>602,315=>602,316=>602, +317=>602,318=>602,319=>602,320=>602,321=>602,322=>602,323=>602,324=>602,325=>602,326=>602, +327=>602,328=>602,329=>602,330=>602,331=>602,332=>602,333=>602,334=>602,335=>602,336=>602, +337=>602,340=>602,341=>602,342=>602,343=>602,344=>602,345=>602,346=>602,347=>602,348=>602, +349=>602,350=>602,351=>602,354=>602,355=>602,356=>602,357=>602,358=>602,359=>602,360=>602, +361=>602,362=>602,363=>602,364=>602,365=>602,366=>602,367=>602,368=>602,369=>602,370=>602, +371=>602,372=>602,373=>602,374=>602,375=>602,377=>602,378=>602,379=>602,380=>602,383=>602, +384=>602,385=>602,386=>602,387=>602,388=>602,389=>602,390=>602,391=>602,392=>602,393=>602, +394=>602,395=>602,396=>602,397=>602,398=>602,399=>602,400=>602,401=>602,403=>602,404=>602, +405=>602,406=>602,407=>602,408=>602,409=>602,410=>602,411=>602,412=>602,413=>602,414=>602, +415=>602,416=>602,417=>602,418=>602,419=>602,420=>602,421=>602,422=>602,423=>602,424=>602, +425=>602,426=>602,427=>602,428=>602,429=>602,430=>602,431=>602,432=>602,433=>602,434=>602, +435=>602,436=>602,437=>602,438=>602,439=>602,440=>602,441=>602,442=>602,443=>602,444=>602, +445=>602,446=>602,447=>602,448=>602,449=>602,450=>602,451=>602,461=>602,462=>602,463=>602, +464=>602,465=>602,466=>602,467=>602,468=>602,469=>602,470=>602,471=>602,472=>602,473=>602, +474=>602,475=>602,476=>602,477=>602,478=>602,479=>602,480=>602,481=>602,482=>602,483=>602, +486=>602,487=>602,488=>602,489=>602,490=>602,491=>602,492=>602,493=>602,494=>602,495=>602, +496=>602,500=>602,501=>602,502=>602,504=>602,505=>602,508=>602,509=>602,510=>602,511=>602, +512=>602,513=>602,514=>602,515=>602,516=>602,517=>602,518=>602,519=>602,520=>602,521=>602, +522=>602,523=>602,524=>602,525=>602,526=>602,527=>602,528=>602,529=>602,530=>602,531=>602, +532=>602,533=>602,534=>602,535=>602,536=>602,537=>602,538=>602,539=>602,540=>602,541=>602, +542=>602,543=>602,544=>602,545=>602,548=>602,549=>602,550=>602,551=>602,552=>602,553=>602, +554=>602,555=>602,556=>602,557=>602,558=>602,559=>602,560=>602,561=>602,562=>602,563=>602, +564=>602,565=>602,566=>602,567=>602,568=>602,569=>602,570=>602,571=>602,572=>602,573=>602, +574=>602,575=>602,576=>602,577=>602,580=>602,581=>602,588=>602,589=>602,592=>602,593=>602, +594=>602,595=>602,596=>602,597=>602,598=>602,599=>602,600=>602,601=>602,602=>602,603=>602, +604=>602,605=>602,606=>602,607=>602,608=>602,609=>602,610=>602,611=>602,612=>602,613=>602, +614=>602,615=>602,616=>602,617=>602,618=>602,619=>602,620=>602,621=>602,622=>602,623=>602, +624=>602,625=>602,626=>602,627=>602,628=>602,629=>602,630=>602,631=>602,632=>602,633=>602, +634=>602,635=>602,636=>602,637=>602,638=>602,639=>602,640=>602,641=>602,642=>602,643=>602, +644=>602,645=>602,646=>602,647=>602,648=>602,649=>602,650=>602,651=>602,652=>602,653=>602, +654=>602,655=>602,656=>602,657=>602,658=>602,659=>602,660=>602,661=>602,662=>602,663=>602, +664=>602,665=>602,666=>602,667=>602,668=>602,669=>602,670=>602,671=>602,672=>602,673=>602, +674=>602,675=>602,676=>602,677=>602,678=>602,679=>602,680=>602,681=>602,682=>602,683=>602, +684=>602,685=>602,686=>602,687=>602,688=>602,689=>602,690=>602,691=>602,692=>602,693=>602, +694=>602,695=>602,696=>602,697=>602,699=>602,700=>602,701=>602,702=>602,703=>602,704=>602, +705=>602,711=>602,712=>602,713=>602,716=>602,717=>602,720=>602,721=>602,722=>602,723=>602, +726=>602,727=>602,728=>602,729=>602,730=>602,731=>602,733=>602,734=>602,736=>602,737=>602, +738=>602,739=>602,740=>602,741=>602,742=>602,743=>602,744=>602,745=>602,750=>602,755=>602, +768=>602,769=>602,770=>602,771=>602,772=>602,773=>602,774=>602,775=>602,776=>602,777=>602, +778=>602,779=>602,780=>602,781=>602,782=>602,783=>602,784=>602,785=>602,786=>602,787=>602, +788=>602,789=>602,790=>602,791=>602,792=>602,793=>602,794=>602,795=>602,796=>602,797=>602, +798=>602,799=>602,800=>602,801=>602,802=>602,803=>602,804=>602,805=>602,806=>602,807=>602, +808=>602,809=>602,810=>602,811=>602,812=>602,813=>602,814=>602,815=>602,816=>602,817=>602, +818=>602,819=>602,820=>602,821=>602,822=>602,823=>602,824=>602,825=>602,826=>602,827=>602, +828=>602,829=>602,830=>602,831=>602,835=>602,856=>602,865=>602,884=>602,885=>602,890=>602, +894=>602,900=>602,901=>602,902=>602,903=>602,904=>602,905=>602,906=>602,908=>602,910=>602, +911=>602,912=>602,913=>602,914=>602,915=>602,916=>602,917=>602,918=>602,919=>602,920=>602, +921=>602,922=>602,923=>602,924=>602,925=>602,926=>602,927=>602,928=>602,929=>602,931=>602, +932=>602,933=>602,934=>602,935=>602,936=>602,937=>602,938=>602,939=>602,940=>602,941=>602, +942=>602,943=>602,944=>602,945=>602,946=>602,947=>602,948=>602,949=>602,950=>602,951=>602, +952=>602,953=>602,954=>602,955=>602,956=>602,957=>602,958=>602,959=>602,960=>602,961=>602, +962=>602,963=>602,964=>602,965=>602,966=>602,967=>602,968=>602,969=>602,970=>602,971=>602, +972=>602,973=>602,974=>602,976=>602,977=>602,978=>602,979=>602,980=>602,981=>602,982=>602, +983=>602,984=>602,985=>602,986=>602,987=>602,988=>602,989=>602,990=>602,991=>602,992=>602, +993=>602,1008=>602,1009=>602,1010=>602,1011=>602,1012=>602,1013=>602,1014=>602,1015=>602,1016=>602, +1017=>602,1018=>602,1019=>602,1020=>602,1021=>602,1022=>602,1023=>602,1024=>602,1025=>602,1026=>602, +1027=>602,1028=>602,1029=>602,1030=>602,1031=>602,1032=>602,1033=>602,1034=>602,1035=>602,1036=>602, +1037=>602,1038=>602,1039=>602,1040=>602,1041=>602,1042=>602,1043=>602,1044=>602,1045=>602,1046=>602, +1047=>602,1048=>602,1049=>602,1050=>602,1051=>602,1052=>602,1053=>602,1054=>602,1055=>602,1056=>602, +1057=>602,1058=>602,1059=>602,1060=>602,1061=>602,1062=>602,1063=>602,1064=>602,1065=>602,1066=>602, +1067=>602,1068=>602,1069=>602,1070=>602,1071=>602,1072=>602,1073=>602,1074=>602,1075=>602,1076=>602, +1077=>602,1078=>602,1079=>602,1080=>602,1081=>602,1082=>602,1083=>602,1084=>602,1085=>602,1086=>602, +1087=>602,1088=>602,1089=>602,1090=>602,1091=>602,1092=>602,1093=>602,1094=>602,1095=>602,1096=>602, +1097=>602,1098=>602,1099=>602,1100=>602,1101=>602,1102=>602,1103=>602,1104=>602,1105=>602,1106=>602, +1107=>602,1108=>602,1109=>602,1110=>602,1111=>602,1112=>602,1113=>602,1114=>602,1115=>602,1116=>602, +1117=>602,1118=>602,1119=>602,1122=>602,1123=>602,1138=>602,1139=>602,1168=>602,1169=>602,1170=>602, +1171=>602,1172=>602,1173=>602,1174=>602,1175=>602,1176=>602,1177=>602,1178=>602,1179=>602,1186=>602, +1187=>602,1194=>602,1195=>602,1196=>602,1197=>602,1198=>602,1199=>602,1200=>602,1201=>602,1202=>602, +1203=>602,1210=>602,1211=>602,1216=>602,1217=>602,1218=>602,1219=>602,1220=>602,1223=>602,1224=>602, +1227=>602,1228=>602,1231=>602,1232=>602,1233=>602,1234=>602,1235=>602,1236=>602,1237=>602,1238=>602, +1239=>602,1240=>602,1241=>602,1242=>602,1243=>602,1244=>602,1245=>602,1246=>602,1247=>602,1248=>602, +1249=>602,1250=>602,1251=>602,1252=>602,1253=>602,1254=>602,1255=>602,1256=>602,1257=>602,1258=>602, +1259=>602,1260=>602,1261=>602,1262=>602,1263=>602,1264=>602,1265=>602,1266=>602,1267=>602,1268=>602, +1269=>602,1270=>602,1271=>602,1272=>602,1273=>602,1296=>602,1297=>602,1306=>602,1307=>602,1308=>602, +1309=>602,1542=>602,1543=>602,1545=>602,1546=>602,1548=>602,1557=>602,1563=>602,1567=>602,1569=>602, +1570=>602,1571=>602,1572=>602,1573=>602,1574=>602,1575=>602,1576=>602,1577=>602,1578=>602,1579=>602, +1580=>602,1581=>602,1582=>602,1583=>602,1584=>602,1585=>602,1586=>602,1587=>602,1588=>602,1589=>602, +1590=>602,1591=>602,1592=>602,1593=>602,1594=>602,1600=>602,1601=>602,1602=>602,1603=>602,1604=>602, +1605=>602,1606=>602,1607=>602,1608=>602,1609=>602,1610=>602,1611=>602,1612=>602,1613=>602,1614=>602, +1615=>602,1616=>602,1617=>602,1618=>602,1619=>602,1620=>602,1621=>602,1626=>602,1632=>602,1633=>602, +1634=>602,1635=>602,1636=>602,1637=>602,1638=>602,1639=>602,1640=>602,1641=>602,1642=>602,1643=>602, +1644=>602,1645=>602,1652=>602,1657=>602,1658=>602,1659=>602,1662=>602,1663=>602,1664=>602,1667=>602, +1668=>602,1670=>602,1671=>602,1681=>602,1688=>602,1700=>602,1705=>602,1711=>602,1726=>602,1740=>602, +1776=>602,1777=>602,1778=>602,1779=>602,1780=>602,1781=>602,1782=>602,1783=>602,1784=>602,1785=>602, +3713=>602,3714=>602,3716=>602,3719=>602,3720=>602,3722=>602,3725=>602,3732=>602,3733=>602,3734=>602, +3735=>602,3737=>602,3738=>602,3739=>602,3740=>602,3741=>602,3742=>602,3743=>602,3745=>602,3746=>602, +3747=>602,3749=>602,3751=>602,3754=>602,3755=>602,3757=>602,3758=>602,3759=>602,3760=>602,3761=>602, +3762=>602,3763=>602,3764=>602,3765=>602,3766=>602,3767=>602,3768=>602,3769=>602,3771=>602,3772=>602, +3784=>602,3785=>602,3786=>602,3787=>602,3788=>602,3789=>602,4304=>602,4305=>602,4306=>602,4307=>602, +4308=>602,4309=>602,4310=>602,4311=>602,4312=>602,4313=>602,4314=>602,4315=>602,4316=>602,4317=>602, +4318=>602,4319=>602,4320=>602,4321=>602,4322=>602,4323=>602,4324=>602,4325=>602,4326=>602,4327=>602, +4328=>602,4329=>602,4330=>602,4331=>602,4332=>602,4333=>602,4334=>602,4335=>602,4336=>602,4337=>602, +4338=>602,4339=>602,4340=>602,4341=>602,4342=>602,4343=>602,4344=>602,4345=>602,4346=>602,4347=>602, +4348=>602,7426=>602,7432=>602,7433=>602,7444=>602,7446=>602,7447=>602,7453=>602,7454=>602,7455=>602, +7468=>602,7469=>602,7470=>602,7472=>602,7473=>602,7474=>602,7475=>602,7476=>602,7477=>602,7478=>602, +7479=>602,7480=>602,7481=>602,7482=>602,7483=>602,7484=>602,7486=>602,7487=>602,7488=>602,7489=>602, +7490=>602,7491=>602,7492=>602,7493=>602,7494=>602,7495=>602,7496=>602,7497=>602,7498=>602,7499=>602, +7500=>602,7501=>602,7502=>602,7503=>602,7504=>602,7505=>602,7506=>602,7507=>602,7508=>602,7509=>602, +7510=>602,7511=>602,7512=>602,7513=>602,7514=>602,7515=>602,7522=>602,7523=>602,7524=>602,7525=>602, +7543=>602,7544=>602,7547=>602,7557=>602,7579=>602,7580=>602,7581=>602,7582=>602,7583=>602,7584=>602, +7585=>602,7586=>602,7587=>602,7588=>602,7589=>602,7590=>602,7591=>602,7592=>602,7593=>602,7594=>602, +7595=>602,7596=>602,7597=>602,7598=>602,7599=>602,7600=>602,7601=>602,7602=>602,7603=>602,7604=>602, +7605=>602,7606=>602,7607=>602,7609=>602,7610=>602,7611=>602,7612=>602,7613=>602,7614=>602,7615=>602, +7680=>602,7681=>602,7682=>602,7683=>602,7684=>602,7685=>602,7686=>602,7687=>602,7688=>602,7689=>602, +7690=>602,7691=>602,7692=>602,7693=>602,7694=>602,7695=>602,7696=>602,7697=>602,7698=>602,7699=>602, +7704=>602,7705=>602,7706=>602,7707=>602,7708=>602,7709=>602,7710=>602,7711=>602,7712=>602,7713=>602, +7714=>602,7715=>602,7716=>602,7717=>602,7718=>602,7719=>602,7720=>602,7721=>602,7722=>602,7723=>602, +7724=>602,7725=>602,7728=>602,7729=>602,7730=>602,7731=>602,7732=>602,7733=>602,7734=>602,7735=>602, +7736=>602,7737=>602,7738=>602,7739=>602,7740=>602,7741=>602,7742=>602,7743=>602,7744=>602,7745=>602, +7746=>602,7747=>602,7748=>602,7749=>602,7750=>602,7751=>602,7752=>602,7753=>602,7754=>602,7755=>602, +7756=>602,7757=>602,7764=>602,7765=>602,7766=>602,7767=>602,7768=>602,7769=>602,7770=>602,7771=>602, +7772=>602,7773=>602,7774=>602,7775=>602,7776=>602,7777=>602,7778=>602,7779=>602,7784=>602,7785=>602, +7786=>602,7787=>602,7788=>602,7789=>602,7790=>602,7791=>602,7792=>602,7793=>602,7794=>602,7795=>602, +7796=>602,7797=>602,7798=>602,7799=>602,7800=>602,7801=>602,7804=>602,7805=>602,7806=>602,7807=>602, +7808=>602,7809=>602,7810=>602,7811=>602,7812=>602,7813=>602,7814=>602,7815=>602,7816=>602,7817=>602, +7818=>602,7819=>602,7820=>602,7821=>602,7822=>602,7823=>602,7824=>602,7825=>602,7826=>602,7827=>602, +7828=>602,7829=>602,7830=>602,7831=>602,7832=>602,7833=>602,7835=>602,7839=>602,7840=>602,7841=>602, +7852=>602,7853=>602,7856=>602,7857=>602,7862=>602,7863=>602,7864=>602,7865=>602,7868=>602,7869=>602, +7878=>602,7879=>602,7882=>602,7883=>602,7884=>602,7885=>602,7896=>602,7897=>602,7898=>602,7899=>602, +7900=>602,7901=>602,7904=>602,7905=>602,7906=>602,7907=>602,7908=>602,7909=>602,7912=>602,7913=>602, +7914=>602,7915=>602,7918=>602,7919=>602,7920=>602,7921=>602,7922=>602,7923=>602,7924=>602,7925=>602, +7928=>602,7929=>602,7936=>602,7937=>602,7938=>602,7939=>602,7940=>602,7941=>602,7942=>602,7943=>602, +7944=>602,7945=>602,7946=>602,7947=>602,7948=>602,7949=>602,7950=>602,7951=>602,7952=>602,7953=>602, +7954=>602,7955=>602,7956=>602,7957=>602,7960=>602,7961=>602,7962=>602,7963=>602,7964=>602,7965=>602, +7968=>602,7969=>602,7970=>602,7971=>602,7972=>602,7973=>602,7974=>602,7975=>602,7976=>602,7977=>602, +7978=>602,7979=>602,7980=>602,7981=>602,7982=>602,7983=>602,7984=>602,7985=>602,7986=>602,7987=>602, +7988=>602,7989=>602,7990=>602,7991=>602,7992=>602,7993=>602,7994=>602,7995=>602,7996=>602,7997=>602, +7998=>602,7999=>602,8000=>602,8001=>602,8002=>602,8003=>602,8004=>602,8005=>602,8008=>602,8009=>602, +8010=>602,8011=>602,8012=>602,8013=>602,8016=>602,8017=>602,8018=>602,8019=>602,8020=>602,8021=>602, +8022=>602,8023=>602,8025=>602,8027=>602,8029=>602,8031=>602,8032=>602,8033=>602,8034=>602,8035=>602, +8036=>602,8037=>602,8038=>602,8039=>602,8040=>602,8041=>602,8042=>602,8043=>602,8044=>602,8045=>602, +8046=>602,8047=>602,8048=>602,8049=>602,8050=>602,8051=>602,8052=>602,8053=>602,8054=>602,8055=>602, +8056=>602,8057=>602,8058=>602,8059=>602,8060=>602,8061=>602,8064=>602,8065=>602,8066=>602,8067=>602, +8068=>602,8069=>602,8070=>602,8071=>602,8072=>602,8073=>602,8074=>602,8075=>602,8076=>602,8077=>602, +8078=>602,8079=>602,8080=>602,8081=>602,8082=>602,8083=>602,8084=>602,8085=>602,8086=>602,8087=>602, +8088=>602,8089=>602,8090=>602,8091=>602,8092=>602,8093=>602,8094=>602,8095=>602,8096=>602,8097=>602, +8098=>602,8099=>602,8100=>602,8101=>602,8102=>602,8103=>602,8104=>602,8105=>602,8106=>602,8107=>602, +8108=>602,8109=>602,8110=>602,8111=>602,8112=>602,8113=>602,8114=>602,8115=>602,8116=>602,8118=>602, +8119=>602,8120=>602,8121=>602,8122=>602,8123=>602,8124=>602,8125=>602,8126=>602,8127=>602,8128=>602, +8129=>602,8130=>602,8131=>602,8132=>602,8134=>602,8135=>602,8136=>602,8137=>602,8138=>602,8139=>602, +8140=>602,8141=>602,8142=>602,8143=>602,8144=>602,8145=>602,8146=>602,8147=>602,8150=>602,8151=>602, +8152=>602,8153=>602,8154=>602,8155=>602,8157=>602,8158=>602,8159=>602,8160=>602,8161=>602,8162=>602, +8163=>602,8164=>602,8165=>602,8166=>602,8167=>602,8168=>602,8169=>602,8170=>602,8171=>602,8172=>602, +8173=>602,8174=>602,8175=>602,8178=>602,8179=>602,8180=>602,8182=>602,8183=>602,8184=>602,8185=>602, +8186=>602,8187=>602,8188=>602,8189=>602,8190=>602,8192=>602,8193=>602,8194=>602,8195=>602,8196=>602, +8197=>602,8198=>602,8199=>602,8200=>602,8201=>602,8202=>602,8208=>602,8209=>602,8210=>602,8213=>602, +8215=>602,8219=>602,8223=>602,8227=>602,8239=>602,8241=>602,8242=>602,8243=>602,8244=>602,8245=>602, +8246=>602,8247=>602,8252=>602,8253=>602,8254=>602,8261=>602,8262=>602,8263=>602,8264=>602,8265=>602, +8287=>602,8304=>602,8305=>602,8308=>602,8309=>602,8310=>602,8311=>602,8312=>602,8313=>602,8314=>602, +8315=>602,8316=>602,8317=>602,8318=>602,8319=>602,8320=>602,8321=>602,8322=>602,8323=>602,8324=>602, +8325=>602,8326=>602,8327=>602,8328=>602,8329=>602,8330=>602,8331=>602,8332=>602,8333=>602,8334=>602, +8336=>602,8337=>602,8338=>602,8339=>602,8340=>602,8352=>602,8353=>602,8354=>602,8355=>602,8356=>602, +8357=>602,8358=>602,8359=>602,8360=>602,8361=>602,8362=>602,8363=>602,8365=>602,8366=>602,8367=>602, +8368=>602,8369=>602,8370=>602,8371=>602,8372=>602,8373=>602,8450=>602,8453=>602,8461=>602,8462=>602, +8463=>602,8469=>602,8470=>602,8471=>602,8473=>602,8474=>602,8477=>602,8484=>602,8486=>602,8490=>602, +8491=>602,8494=>602,8531=>602,8532=>602,8533=>602,8534=>602,8535=>602,8536=>602,8537=>602,8538=>602, +8539=>602,8540=>602,8541=>602,8542=>602,8543=>602,8592=>602,8593=>602,8594=>602,8595=>602,8596=>602, +8597=>602,8598=>602,8599=>602,8600=>602,8601=>602,8602=>602,8603=>602,8604=>602,8605=>602,8606=>602, +8607=>602,8608=>602,8609=>602,8610=>602,8611=>602,8612=>602,8613=>602,8614=>602,8615=>602,8616=>602, +8617=>602,8618=>602,8619=>602,8620=>602,8621=>602,8622=>602,8623=>602,8624=>602,8625=>602,8626=>602, +8627=>602,8628=>602,8629=>602,8630=>602,8631=>602,8632=>602,8633=>602,8634=>602,8635=>602,8636=>602, +8637=>602,8638=>602,8639=>602,8640=>602,8641=>602,8642=>602,8643=>602,8644=>602,8645=>602,8646=>602, +8647=>602,8648=>602,8649=>602,8650=>602,8651=>602,8652=>602,8653=>602,8654=>602,8655=>602,8656=>602, +8657=>602,8658=>602,8659=>602,8660=>602,8661=>602,8662=>602,8663=>602,8664=>602,8665=>602,8666=>602, +8667=>602,8668=>602,8669=>602,8670=>602,8671=>602,8672=>602,8673=>602,8674=>602,8675=>602,8676=>602, +8677=>602,8678=>602,8679=>602,8680=>602,8681=>602,8682=>602,8683=>602,8684=>602,8685=>602,8686=>602, +8687=>602,8688=>602,8689=>602,8690=>602,8691=>602,8692=>602,8693=>602,8694=>602,8695=>602,8696=>602, +8697=>602,8698=>602,8699=>602,8700=>602,8701=>602,8702=>602,8703=>602,8704=>602,8705=>602,8706=>602, +8707=>602,8708=>602,8709=>602,8710=>602,8711=>602,8712=>602,8713=>602,8714=>602,8715=>602,8716=>602, +8717=>602,8719=>602,8721=>602,8722=>602,8723=>602,8725=>602,8727=>602,8728=>602,8729=>602,8730=>602, +8731=>602,8732=>602,8733=>602,8734=>602,8735=>602,8736=>602,8743=>602,8744=>602,8745=>602,8746=>602, +8747=>602,8748=>602,8749=>602,8760=>602,8761=>602,8762=>602,8763=>602,8764=>602,8765=>602,8769=>602, +8770=>602,8771=>602,8772=>602,8773=>602,8774=>602,8775=>602,8776=>602,8777=>602,8778=>602,8779=>602, +8780=>602,8781=>602,8782=>602,8783=>602,8784=>602,8785=>602,8786=>602,8787=>602,8788=>602,8789=>602, +8790=>602,8791=>602,8792=>602,8793=>602,8794=>602,8795=>602,8796=>602,8797=>602,8798=>602,8799=>602, +8800=>602,8801=>602,8802=>602,8803=>602,8804=>602,8805=>602,8806=>602,8807=>602,8808=>602,8809=>602, +8813=>602,8814=>602,8815=>602,8816=>602,8817=>602,8818=>602,8819=>602,8820=>602,8821=>602,8822=>602, +8823=>602,8824=>602,8825=>602,8826=>602,8827=>602,8828=>602,8829=>602,8830=>602,8831=>602,8832=>602, +8833=>602,8834=>602,8835=>602,8836=>602,8837=>602,8838=>602,8839=>602,8840=>602,8841=>602,8842=>602, +8843=>602,8847=>602,8848=>602,8849=>602,8850=>602,8853=>602,8854=>602,8855=>602,8856=>602,8857=>602, +8858=>602,8859=>602,8860=>602,8861=>602,8862=>602,8863=>602,8864=>602,8865=>602,8901=>602,8902=>602, +8909=>602,8922=>602,8923=>602,8924=>602,8925=>602,8926=>602,8927=>602,8928=>602,8929=>602,8930=>602, +8931=>602,8932=>602,8933=>602,8934=>602,8935=>602,8936=>602,8937=>602,8943=>602,8960=>602,8961=>602, +8962=>602,8963=>602,8964=>602,8965=>602,8966=>602,8968=>602,8969=>602,8970=>602,8971=>602,8972=>602, +8973=>602,8974=>602,8975=>602,8976=>602,8977=>602,8978=>602,8979=>602,8980=>602,8981=>602,8984=>602, +8985=>602,8988=>602,8989=>602,8990=>602,8991=>602,8992=>602,8993=>602,8997=>602,8998=>602,8999=>602, +9000=>602,9003=>602,9013=>602,9015=>602,9016=>602,9017=>602,9018=>602,9019=>602,9020=>602,9021=>602, +9022=>602,9025=>602,9026=>602,9027=>602,9028=>602,9031=>602,9032=>602,9033=>602,9035=>602,9036=>602, +9037=>602,9040=>602,9042=>602,9043=>602,9044=>602,9047=>602,9048=>602,9049=>602,9050=>602,9051=>602, +9052=>602,9054=>602,9055=>602,9056=>602,9059=>602,9060=>602,9061=>602,9064=>602,9065=>602,9067=>602, +9068=>602,9069=>602,9070=>602,9071=>602,9072=>602,9075=>602,9076=>602,9077=>602,9078=>602,9079=>602, +9080=>602,9081=>602,9082=>602,9085=>602,9088=>602,9089=>602,9090=>602,9091=>602,9096=>602,9097=>602, +9098=>602,9099=>602,9109=>602,9115=>602,9116=>602,9117=>602,9118=>602,9119=>602,9120=>602,9121=>602, +9122=>602,9123=>602,9124=>602,9125=>602,9126=>602,9127=>602,9128=>602,9129=>602,9130=>602,9131=>602, +9132=>602,9133=>602,9134=>602,9166=>602,9167=>602,9251=>602,9600=>602,9601=>602,9602=>602,9603=>602, +9604=>602,9605=>602,9606=>602,9607=>602,9608=>602,9609=>602,9610=>602,9611=>602,9612=>602,9613=>602, +9614=>602,9615=>602,9616=>602,9617=>602,9618=>602,9619=>602,9620=>602,9621=>602,9622=>602,9623=>602, +9624=>602,9625=>602,9626=>602,9627=>602,9628=>602,9629=>602,9630=>602,9631=>602,9632=>602,9633=>602, +9634=>602,9635=>602,9636=>602,9637=>602,9638=>602,9639=>602,9640=>602,9641=>602,9642=>602,9643=>602, +9644=>602,9645=>602,9646=>602,9647=>602,9648=>602,9649=>602,9650=>602,9651=>602,9652=>602,9653=>602, +9654=>602,9655=>602,9656=>602,9657=>602,9658=>602,9659=>602,9660=>602,9661=>602,9662=>602,9663=>602, +9664=>602,9665=>602,9666=>602,9667=>602,9668=>602,9669=>602,9670=>602,9671=>602,9672=>602,9673=>602, +9674=>602,9675=>602,9676=>602,9677=>602,9678=>602,9679=>602,9680=>602,9681=>602,9682=>602,9683=>602, +9684=>602,9685=>602,9686=>602,9687=>602,9688=>602,9689=>602,9690=>602,9691=>602,9692=>602,9693=>602, +9694=>602,9695=>602,9696=>602,9697=>602,9698=>602,9699=>602,9700=>602,9701=>602,9702=>602,9703=>602, +9704=>602,9705=>602,9706=>602,9707=>602,9708=>602,9709=>602,9710=>602,9711=>602,9712=>602,9713=>602, +9714=>602,9715=>602,9716=>602,9717=>602,9718=>602,9719=>602,9720=>602,9721=>602,9722=>602,9723=>602, +9724=>602,9725=>602,9726=>602,9727=>602,9728=>602,9729=>602,9730=>602,9731=>602,9732=>602,9733=>602, +9734=>602,9735=>602,9736=>602,9737=>602,9738=>602,9739=>602,9740=>602,9741=>602,9742=>602,9743=>602, +9744=>602,9745=>602,9746=>602,9747=>602,9748=>602,9749=>602,9750=>602,9751=>602,9752=>602,9753=>602, +9754=>602,9755=>602,9756=>602,9757=>602,9758=>602,9759=>602,9760=>602,9761=>602,9762=>602,9763=>602, +9764=>602,9765=>602,9766=>602,9767=>602,9768=>602,9769=>602,9770=>602,9771=>602,9772=>602,9773=>602, +9774=>602,9775=>602,9784=>602,9785=>602,9786=>602,9787=>602,9788=>602,9789=>602,9790=>602,9791=>602, +9792=>602,9793=>602,9794=>602,9795=>602,9796=>602,9797=>602,9798=>602,9799=>602,9800=>602,9801=>602, +9802=>602,9803=>602,9804=>602,9805=>602,9806=>602,9807=>602,9808=>602,9809=>602,9810=>602,9811=>602, +9812=>602,9813=>602,9814=>602,9815=>602,9816=>602,9817=>602,9818=>602,9819=>602,9820=>602,9821=>602, +9822=>602,9823=>602,9824=>602,9825=>602,9826=>602,9827=>602,9828=>602,9829=>602,9830=>602,9831=>602, +9832=>602,9833=>602,9834=>602,9835=>602,9836=>602,9837=>602,9838=>602,9839=>602,9840=>602,9841=>602, +9842=>602,9843=>602,9844=>602,9845=>602,9846=>602,9847=>602,9848=>602,9849=>602,9850=>602,9851=>602, +9852=>602,9853=>602,9854=>602,9855=>602,9856=>602,9857=>602,9858=>602,9859=>602,9860=>602,9861=>602, +9862=>602,9863=>602,9864=>602,9865=>602,9866=>602,9867=>602,9872=>602,9873=>602,9874=>602,9875=>602, +9876=>602,9877=>602,9878=>602,9879=>602,9880=>602,9881=>602,9882=>602,9883=>602,9884=>602,9888=>602, +9889=>602,9904=>602,9905=>602,9985=>602,9986=>602,9987=>602,9988=>602,9990=>602,9991=>602,9992=>602, +9993=>602,9996=>602,9997=>602,9998=>602,9999=>602,10000=>602,10001=>602,10002=>602,10003=>602,10004=>602, +10005=>602,10006=>602,10007=>602,10008=>602,10009=>602,10010=>602,10011=>602,10012=>602,10013=>602,10014=>602, +10015=>602,10016=>602,10017=>602,10018=>602,10019=>602,10020=>602,10021=>602,10022=>602,10023=>602,10025=>602, +10026=>602,10027=>602,10028=>602,10029=>602,10030=>602,10031=>602,10032=>602,10033=>602,10034=>602,10035=>602, +10036=>602,10037=>602,10038=>602,10039=>602,10040=>602,10041=>602,10042=>602,10043=>602,10044=>602,10045=>602, +10046=>602,10047=>602,10048=>602,10049=>602,10050=>602,10051=>602,10052=>602,10053=>602,10054=>602,10055=>602, +10056=>602,10057=>602,10058=>602,10059=>602,10061=>602,10063=>602,10064=>602,10065=>602,10066=>602,10070=>602, +10072=>602,10073=>602,10074=>602,10075=>602,10076=>602,10077=>602,10078=>602,10081=>602,10082=>602,10083=>602, +10084=>602,10085=>602,10086=>602,10087=>602,10088=>602,10089=>602,10090=>602,10091=>602,10092=>602,10093=>602, +10094=>602,10095=>602,10096=>602,10097=>602,10098=>602,10099=>602,10100=>602,10101=>602,10132=>602,10136=>602, +10137=>602,10138=>602,10139=>602,10140=>602,10141=>602,10142=>602,10143=>602,10144=>602,10145=>602,10146=>602, +10147=>602,10148=>602,10149=>602,10150=>602,10151=>602,10152=>602,10153=>602,10154=>602,10155=>602,10156=>602, +10157=>602,10158=>602,10159=>602,10161=>602,10162=>602,10163=>602,10164=>602,10165=>602,10166=>602,10167=>602, +10168=>602,10169=>602,10170=>602,10171=>602,10172=>602,10173=>602,10174=>602,10175=>602,10181=>602,10182=>602, +10208=>602,10216=>602,10217=>602,10731=>602,10746=>602,10747=>602,10799=>602,11026=>602,11027=>602,11028=>602, +11029=>602,11030=>602,11031=>602,11032=>602,11033=>602,11034=>602,11364=>602,11374=>602,11375=>602,11381=>602, +11382=>602,11383=>602,11385=>602,11386=>602,11388=>602,11389=>602,11800=>602,11810=>602,11811=>602,11812=>602, +11813=>602,11822=>602,42760=>602,42761=>602,42762=>602,42763=>602,42764=>602,42765=>602,42766=>602,42767=>602, +42768=>602,42769=>602,42770=>602,42771=>602,42772=>602,42773=>602,42774=>602,42779=>602,42780=>602,42781=>602, +42782=>602,42783=>602,42790=>602,42791=>602,42889=>602,42890=>602,42891=>602,42892=>602,63173=>602,64257=>602, +64258=>602,64338=>602,64339=>602,64340=>602,64341=>602,64342=>602,64343=>602,64344=>602,64345=>602,64346=>602, +64347=>602,64348=>602,64349=>602,64350=>602,64351=>602,64352=>602,64353=>602,64354=>602,64355=>602,64356=>602, +64357=>602,64358=>602,64359=>602,64360=>602,64361=>602,64362=>602,64363=>602,64364=>602,64365=>602,64366=>602, +64367=>602,64368=>602,64369=>602,64370=>602,64371=>602,64372=>602,64373=>602,64374=>602,64375=>602,64376=>602, +64377=>602,64378=>602,64379=>602,64380=>602,64381=>602,64382=>602,64383=>602,64384=>602,64385=>602,64394=>602, +64395=>602,64396=>602,64397=>602,64398=>602,64399=>602,64400=>602,64401=>602,64402=>602,64403=>602,64404=>602, +64405=>602,64414=>602,64415=>602,64426=>602,64427=>602,64428=>602,64429=>602,64488=>602,64489=>602,64508=>602, +64509=>602,64510=>602,64511=>602,65136=>602,65137=>602,65138=>602,65139=>602,65140=>602,65142=>602,65143=>602, +65144=>602,65145=>602,65146=>602,65147=>602,65148=>602,65149=>602,65150=>602,65151=>602,65152=>602,65153=>602, +65154=>602,65155=>602,65156=>602,65157=>602,65158=>602,65159=>602,65160=>602,65161=>602,65162=>602,65163=>602, +65164=>602,65165=>602,65166=>602,65167=>602,65168=>602,65169=>602,65170=>602,65171=>602,65172=>602,65173=>602, +65174=>602,65175=>602,65176=>602,65177=>602,65178=>602,65179=>602,65180=>602,65181=>602,65182=>602,65183=>602, +65184=>602,65185=>602,65186=>602,65187=>602,65188=>602,65189=>602,65190=>602,65191=>602,65192=>602,65193=>602, +65194=>602,65195=>602,65196=>602,65197=>602,65198=>602,65199=>602,65200=>602,65201=>602,65202=>602,65203=>602, +65204=>602,65205=>602,65206=>602,65207=>602,65208=>602,65209=>602,65210=>602,65211=>602,65212=>602,65213=>602, +65214=>602,65215=>602,65216=>602,65217=>602,65218=>602,65219=>602,65220=>602,65221=>602,65222=>602,65223=>602, +65224=>602,65225=>602,65226=>602,65227=>602,65228=>602,65229=>602,65230=>602,65231=>602,65232=>602,65233=>602, +65234=>602,65235=>602,65236=>602,65237=>602,65238=>602,65239=>602,65240=>602,65241=>602,65242=>602,65243=>602, +65244=>602,65245=>602,65246=>602,65247=>602,65248=>602,65249=>602,65250=>602,65251=>602,65252=>602,65253=>602, +65254=>602,65255=>602,65256=>602,65257=>602,65258=>602,65259=>602,65260=>602,65261=>602,65262=>602,65263=>602, +65264=>602,65265=>602,65266=>602,65267=>602,65268=>602,65269=>602,65270=>602,65271=>602,65272=>602,65273=>602, +65274=>602,65275=>602,65276=>602,65279=>602,65529=>602,65530=>602,65531=>602,65532=>602,65533=>602); +$enc=''; +$diff=''; +$file='dejavusansmonob.z'; +$ctg='dejavusansmonob.ctg.z'; +$originalsize=301928; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonob.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonob.z new file mode 100644 index 0000000..e98cacb Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonob.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonobi.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonobi.ctg.z new file mode 100644 index 0000000..42e7503 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonobi.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonobi.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonobi.php new file mode 100644 index 0000000..dabdcda --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonobi.php @@ -0,0 +1,250 @@ +<?php +$type='TrueTypeUnicode'; +$name='DejaVuSansMono-BoldOblique'; +$desc=array('Ascent'=>928,'Descent'=>-236,'CapHeight'=>-70,'Flags'=>97,'FontBBox'=>'[-428 -394 808 1053]','ItalicAngle'=>-11,'StemV'=>120,'MissingWidth'=>602); +$up=-63; +$ut=44; +$dw=602; +$cw=array( +0=>602,32=>602,33=>602,34=>602,35=>602,36=>602,37=>602,38=>602,39=>602,40=>602, +41=>602,42=>602,43=>602,44=>602,45=>602,46=>602,47=>602,48=>602,49=>602,50=>602, +51=>602,52=>602,53=>602,54=>602,55=>602,56=>602,57=>602,58=>602,59=>602,60=>602, +61=>602,62=>602,63=>602,64=>602,65=>602,66=>602,67=>602,68=>602,69=>602,70=>602, +71=>602,72=>602,73=>602,74=>602,75=>602,76=>602,77=>602,78=>602,79=>602,80=>602, +81=>602,82=>602,83=>602,84=>602,85=>602,86=>602,87=>602,88=>602,89=>602,90=>602, +91=>602,92=>602,93=>602,94=>602,95=>602,96=>602,97=>602,98=>602,99=>602,100=>602, +101=>602,102=>602,103=>602,104=>602,105=>602,106=>602,107=>602,108=>602,109=>602,110=>602, +111=>602,112=>602,113=>602,114=>602,115=>602,116=>602,117=>602,118=>602,119=>602,120=>602, +121=>602,122=>602,123=>602,124=>602,125=>602,126=>602,8364=>602,8218=>602,402=>602,8222=>602, +8230=>602,8224=>602,8225=>602,710=>602,8240=>602,352=>602,8249=>602,338=>602,381=>602,8216=>602, +8217=>602,8220=>602,8221=>602,8226=>602,8211=>602,8212=>602,732=>602,8482=>602,353=>602,8250=>602, +339=>602,382=>602,376=>602,160=>602,161=>602,162=>602,163=>602,164=>602,165=>602,166=>602, +167=>602,168=>602,169=>602,170=>602,171=>602,172=>602,173=>602,174=>602,175=>602,176=>602, +177=>602,178=>602,179=>602,180=>602,181=>602,182=>602,183=>602,184=>602,185=>602,186=>602, +187=>602,188=>602,189=>602,190=>602,191=>602,192=>602,193=>602,194=>602,195=>602,196=>602, +197=>602,198=>602,199=>602,200=>602,201=>602,202=>602,203=>602,204=>602,205=>602,206=>602, +207=>602,208=>602,209=>602,210=>602,211=>602,212=>602,213=>602,214=>602,215=>602,216=>602, +217=>602,218=>602,219=>602,220=>602,221=>602,222=>602,223=>602,224=>602,225=>602,226=>602, +227=>602,228=>602,229=>602,230=>602,231=>602,232=>602,233=>602,234=>602,235=>602,236=>602, +237=>602,238=>602,239=>602,240=>602,241=>602,242=>602,243=>602,244=>602,245=>602,246=>602, +247=>602,248=>602,249=>602,250=>602,251=>602,252=>602,253=>602,254=>602,255=>602,256=>602, +257=>602,258=>602,259=>602,260=>602,261=>602,262=>602,263=>602,264=>602,265=>602,266=>602, +267=>602,268=>602,269=>602,270=>602,271=>602,272=>602,273=>602,274=>602,275=>602,276=>602, +277=>602,278=>602,279=>602,280=>602,281=>602,282=>602,283=>602,284=>602,285=>602,286=>602, +287=>602,288=>602,289=>602,290=>602,291=>602,292=>602,293=>602,294=>602,295=>602,296=>602, +297=>602,298=>602,299=>602,300=>602,301=>602,302=>602,303=>602,304=>602,305=>602,306=>602, +307=>602,308=>602,309=>602,310=>602,311=>602,312=>602,313=>602,314=>602,315=>602,316=>602, +317=>602,318=>602,319=>602,320=>602,321=>602,322=>602,323=>602,324=>602,325=>602,326=>602, +327=>602,328=>602,329=>602,330=>602,331=>602,332=>602,333=>602,334=>602,335=>602,336=>602, +337=>602,340=>602,341=>602,342=>602,343=>602,344=>602,345=>602,346=>602,347=>602,348=>602, +349=>602,350=>602,351=>602,354=>602,355=>602,356=>602,357=>602,358=>602,359=>602,360=>602, +361=>602,362=>602,363=>602,364=>602,365=>602,366=>602,367=>602,368=>602,369=>602,370=>602, +371=>602,372=>602,373=>602,374=>602,375=>602,377=>602,378=>602,379=>602,380=>602,383=>602, +384=>602,385=>602,386=>602,387=>602,388=>602,389=>602,390=>602,391=>602,392=>602,393=>602, +394=>602,395=>602,396=>602,397=>602,398=>602,399=>602,400=>602,401=>602,403=>602,404=>602, +405=>602,406=>602,407=>602,408=>602,409=>602,410=>602,411=>602,412=>602,413=>602,414=>602, +415=>602,416=>602,417=>602,418=>602,419=>602,420=>602,421=>602,422=>602,423=>602,424=>602, +425=>602,426=>602,427=>602,428=>602,429=>602,430=>602,431=>602,432=>602,433=>602,434=>602, +435=>602,436=>602,437=>602,438=>602,439=>602,440=>602,441=>602,442=>602,443=>602,444=>602, +445=>602,446=>602,447=>602,448=>602,449=>602,450=>602,451=>602,461=>602,462=>602,463=>602, +464=>602,465=>602,466=>602,467=>602,468=>602,469=>602,470=>602,471=>602,472=>602,473=>602, +474=>602,475=>602,476=>602,477=>602,478=>602,479=>602,480=>602,481=>602,482=>602,483=>602, +486=>602,487=>602,488=>602,489=>602,490=>602,491=>602,492=>602,493=>602,494=>602,495=>602, +500=>602,501=>602,502=>602,504=>602,505=>602,508=>602,509=>602,510=>602,511=>602,512=>602, +513=>602,514=>602,515=>602,516=>602,517=>602,518=>602,519=>602,520=>602,521=>602,522=>602, +523=>602,524=>602,525=>602,526=>602,527=>602,528=>602,529=>602,530=>602,531=>602,532=>602, +533=>602,534=>602,535=>602,536=>602,537=>602,538=>602,539=>602,540=>602,541=>602,542=>602, +543=>602,545=>602,548=>602,549=>602,550=>602,551=>602,552=>602,553=>602,554=>602,555=>602, +556=>602,557=>602,558=>602,559=>602,560=>602,561=>602,562=>602,563=>602,564=>602,565=>602, +566=>602,567=>602,568=>602,569=>602,570=>602,571=>602,572=>602,573=>602,574=>602,575=>602, +576=>602,577=>602,580=>602,581=>602,588=>602,589=>602,592=>602,593=>602,594=>602,595=>602, +596=>602,597=>602,598=>602,599=>602,600=>602,601=>602,602=>602,603=>602,604=>602,605=>602, +606=>602,607=>602,608=>602,609=>602,610=>602,611=>602,612=>602,613=>602,614=>602,615=>602, +616=>602,617=>602,618=>602,619=>602,620=>602,621=>602,622=>602,623=>602,624=>602,625=>602, +626=>602,627=>602,628=>602,629=>602,630=>602,631=>602,632=>602,633=>602,634=>602,635=>602, +636=>602,637=>602,638=>602,639=>602,640=>602,641=>602,642=>602,643=>602,644=>602,645=>602, +646=>602,647=>602,648=>602,649=>602,650=>602,651=>602,652=>602,653=>602,654=>602,655=>602, +656=>602,657=>602,658=>602,659=>602,660=>602,661=>602,662=>602,663=>602,664=>602,665=>602, +666=>602,667=>602,668=>602,669=>602,670=>602,671=>602,672=>602,673=>602,674=>602,675=>602, +676=>602,677=>602,678=>602,679=>602,680=>602,681=>602,682=>602,683=>602,684=>602,685=>602, +686=>602,687=>602,688=>602,689=>602,690=>602,691=>602,692=>602,693=>602,694=>602,695=>602, +696=>602,697=>602,699=>602,700=>602,701=>602,702=>602,703=>602,704=>602,705=>602,711=>602, +712=>602,713=>602,716=>602,717=>602,720=>602,721=>602,722=>602,723=>602,726=>602,727=>602, +728=>602,729=>602,730=>602,731=>602,733=>602,734=>602,736=>602,737=>602,738=>602,739=>602, +740=>602,741=>602,742=>602,743=>602,744=>602,745=>602,750=>602,755=>602,768=>602,769=>602, +770=>602,771=>602,772=>602,773=>602,774=>602,775=>602,776=>602,777=>602,778=>602,779=>602, +780=>602,781=>602,782=>602,783=>602,784=>602,785=>602,786=>602,787=>602,788=>602,789=>602, +790=>602,791=>602,792=>602,793=>602,794=>602,795=>602,796=>602,797=>602,798=>602,799=>602, +800=>602,801=>602,802=>602,803=>602,804=>602,805=>602,806=>602,807=>602,808=>602,809=>602, +810=>602,811=>602,812=>602,813=>602,814=>602,815=>602,816=>602,817=>602,818=>602,819=>602, +820=>602,821=>602,822=>602,823=>602,824=>602,825=>602,826=>602,827=>602,828=>602,829=>602, +830=>602,831=>602,835=>602,856=>602,865=>602,884=>602,885=>602,890=>602,894=>602,900=>602, +901=>602,902=>602,903=>602,904=>602,905=>602,906=>602,908=>602,910=>602,911=>602,912=>602, +913=>602,914=>602,915=>602,916=>602,917=>602,918=>602,919=>602,920=>602,921=>602,922=>602, +923=>602,924=>602,925=>602,926=>602,927=>602,928=>602,929=>602,931=>602,932=>602,933=>602, +934=>602,935=>602,936=>602,937=>602,938=>602,939=>602,940=>602,941=>602,942=>602,943=>602, +944=>602,945=>602,946=>602,947=>602,948=>602,949=>602,950=>602,951=>602,952=>602,953=>602, +954=>602,955=>602,956=>602,957=>602,958=>602,959=>602,960=>602,961=>602,962=>602,963=>602, +964=>602,965=>602,966=>602,967=>602,968=>602,969=>602,970=>602,971=>602,972=>602,973=>602, +974=>602,976=>602,977=>602,978=>602,979=>602,980=>602,981=>602,982=>602,983=>602,984=>602, +985=>602,986=>602,987=>602,988=>602,989=>602,990=>602,991=>602,992=>602,993=>602,1008=>602, +1009=>602,1010=>602,1011=>602,1012=>602,1013=>602,1014=>602,1015=>602,1016=>602,1017=>602,1018=>602, +1019=>602,1020=>602,1021=>602,1022=>602,1023=>602,1024=>602,1025=>602,1026=>602,1027=>602,1028=>602, +1029=>602,1030=>602,1031=>602,1032=>602,1033=>602,1034=>602,1035=>602,1036=>602,1037=>602,1038=>602, +1039=>602,1040=>602,1041=>602,1042=>602,1043=>602,1044=>602,1045=>602,1046=>602,1047=>602,1048=>602, +1049=>602,1050=>602,1051=>602,1052=>602,1053=>602,1054=>602,1055=>602,1056=>602,1057=>602,1058=>602, +1059=>602,1060=>602,1061=>602,1062=>602,1063=>602,1064=>602,1065=>602,1066=>602,1067=>602,1068=>602, +1069=>602,1070=>602,1071=>602,1072=>602,1073=>602,1074=>602,1075=>602,1076=>602,1077=>602,1078=>602, +1079=>602,1080=>602,1081=>602,1082=>602,1083=>602,1084=>602,1085=>602,1086=>602,1087=>602,1088=>602, +1089=>602,1090=>602,1091=>602,1092=>602,1093=>602,1094=>602,1095=>602,1096=>602,1097=>602,1098=>602, +1099=>602,1100=>602,1101=>602,1102=>602,1103=>602,1104=>602,1105=>602,1106=>602,1107=>602,1108=>602, +1109=>602,1110=>602,1111=>602,1112=>602,1113=>602,1114=>602,1115=>602,1116=>602,1117=>602,1118=>602, +1119=>602,1122=>602,1123=>602,1138=>602,1139=>602,1168=>602,1169=>602,1170=>602,1171=>602,1172=>602, +1173=>602,1174=>602,1175=>602,1176=>602,1177=>602,1178=>602,1179=>602,1186=>602,1187=>602,1194=>602, +1195=>602,1196=>602,1197=>602,1198=>602,1199=>602,1200=>602,1201=>602,1202=>602,1203=>602,1210=>602, +1211=>602,1216=>602,1217=>602,1218=>602,1219=>602,1220=>602,1223=>602,1224=>602,1227=>602,1228=>602, +1231=>602,1232=>602,1233=>602,1234=>602,1235=>602,1236=>602,1237=>602,1238=>602,1239=>602,1240=>602, +1241=>602,1242=>602,1243=>602,1244=>602,1245=>602,1246=>602,1247=>602,1248=>602,1249=>602,1250=>602, +1251=>602,1252=>602,1253=>602,1254=>602,1255=>602,1256=>602,1257=>602,1258=>602,1259=>602,1260=>602, +1261=>602,1262=>602,1263=>602,1264=>602,1265=>602,1266=>602,1267=>602,1268=>602,1269=>602,1270=>602, +1271=>602,1272=>602,1273=>602,1296=>602,1297=>602,1306=>602,1307=>602,1308=>602,1309=>602,3713=>602, +3714=>602,3716=>602,3719=>602,3720=>602,3722=>602,3725=>602,3732=>602,3733=>602,3734=>602,3735=>602, +3737=>602,3738=>602,3739=>602,3740=>602,3741=>602,3742=>602,3743=>602,3745=>602,3746=>602,3747=>602, +3749=>602,3751=>602,3754=>602,3755=>602,3757=>602,3758=>602,3759=>602,3760=>602,3761=>602,3762=>602, +3763=>602,3764=>602,3765=>602,3766=>602,3767=>602,3768=>602,3769=>602,3771=>602,3772=>602,3784=>602, +3785=>602,3786=>602,3787=>602,3788=>602,3789=>602,4304=>602,4305=>602,4306=>602,4307=>602,4308=>602, +4309=>602,4310=>602,4311=>602,4312=>602,4313=>602,4314=>602,4315=>602,4316=>602,4317=>602,4318=>602, +4319=>602,4320=>602,4321=>602,4322=>602,4323=>602,4324=>602,4325=>602,4326=>602,4327=>602,4328=>602, +4329=>602,4330=>602,4331=>602,4332=>602,4333=>602,4334=>602,4335=>602,4336=>602,4337=>602,4338=>602, +4339=>602,4340=>602,4341=>602,4342=>602,4343=>602,4344=>602,4345=>602,4346=>602,4347=>602,4348=>602, +7426=>602,7432=>602,7433=>602,7444=>602,7446=>602,7447=>602,7453=>602,7454=>602,7455=>602,7468=>602, +7469=>602,7470=>602,7472=>602,7473=>602,7474=>602,7475=>602,7476=>602,7477=>602,7478=>602,7479=>602, +7480=>602,7481=>602,7482=>602,7483=>602,7484=>602,7486=>602,7487=>602,7488=>602,7489=>602,7490=>602, +7491=>602,7492=>602,7493=>602,7494=>602,7495=>602,7496=>602,7497=>602,7498=>602,7499=>602,7500=>602, +7501=>602,7502=>602,7503=>602,7504=>602,7505=>602,7506=>602,7507=>602,7508=>602,7509=>602,7510=>602, +7511=>602,7512=>602,7513=>602,7514=>602,7515=>602,7522=>602,7523=>602,7524=>602,7525=>602,7543=>602, +7544=>602,7547=>602,7557=>602,7579=>602,7580=>602,7581=>602,7582=>602,7583=>602,7584=>602,7585=>602, +7586=>602,7587=>602,7588=>602,7589=>602,7590=>602,7591=>602,7592=>602,7593=>602,7594=>602,7595=>602, +7596=>602,7597=>602,7598=>602,7599=>602,7600=>602,7601=>602,7602=>602,7603=>602,7604=>602,7605=>602, +7606=>602,7607=>602,7609=>602,7610=>602,7611=>602,7612=>602,7613=>602,7614=>602,7615=>602,7680=>602, +7681=>602,7682=>602,7683=>602,7684=>602,7685=>602,7686=>602,7687=>602,7688=>602,7689=>602,7690=>602, +7691=>602,7692=>602,7693=>602,7694=>602,7695=>602,7696=>602,7697=>602,7698=>602,7699=>602,7704=>602, +7705=>602,7706=>602,7707=>602,7708=>602,7709=>602,7710=>602,7711=>602,7712=>602,7713=>602,7714=>602, +7715=>602,7716=>602,7717=>602,7718=>602,7719=>602,7720=>602,7721=>602,7722=>602,7723=>602,7724=>602, +7725=>602,7728=>602,7729=>602,7730=>602,7731=>602,7732=>602,7733=>602,7734=>602,7735=>602,7736=>602, +7737=>602,7738=>602,7739=>602,7740=>602,7741=>602,7742=>602,7743=>602,7744=>602,7745=>602,7746=>602, +7747=>602,7748=>602,7749=>602,7750=>602,7751=>602,7752=>602,7753=>602,7754=>602,7755=>602,7756=>602, +7757=>602,7764=>602,7765=>602,7766=>602,7767=>602,7768=>602,7769=>602,7770=>602,7771=>602,7772=>602, +7773=>602,7774=>602,7775=>602,7776=>602,7777=>602,7778=>602,7779=>602,7784=>602,7785=>602,7786=>602, +7787=>602,7788=>602,7789=>602,7790=>602,7791=>602,7792=>602,7793=>602,7794=>602,7795=>602,7796=>602, +7797=>602,7798=>602,7799=>602,7800=>602,7801=>602,7804=>602,7805=>602,7806=>602,7807=>602,7808=>602, +7809=>602,7810=>602,7811=>602,7812=>602,7813=>602,7814=>602,7815=>602,7816=>602,7817=>602,7818=>602, +7819=>602,7820=>602,7821=>602,7822=>602,7823=>602,7824=>602,7825=>602,7826=>602,7827=>602,7828=>602, +7829=>602,7830=>602,7831=>602,7832=>602,7833=>602,7835=>602,7839=>602,7840=>602,7841=>602,7852=>602, +7853=>602,7856=>602,7857=>602,7862=>602,7863=>602,7864=>602,7865=>602,7868=>602,7869=>602,7878=>602, +7879=>602,7882=>602,7883=>602,7884=>602,7885=>602,7896=>602,7897=>602,7898=>602,7899=>602,7900=>602, +7901=>602,7904=>602,7905=>602,7906=>602,7907=>602,7908=>602,7909=>602,7912=>602,7913=>602,7914=>602, +7915=>602,7918=>602,7919=>602,7920=>602,7921=>602,7922=>602,7923=>602,7924=>602,7925=>602,7928=>602, +7929=>602,7936=>602,7937=>602,7938=>602,7939=>602,7940=>602,7941=>602,7942=>602,7943=>602,7944=>602, +7945=>602,7946=>602,7947=>602,7948=>602,7949=>602,7950=>602,7951=>602,7952=>602,7953=>602,7954=>602, +7955=>602,7956=>602,7957=>602,7960=>602,7961=>602,7962=>602,7963=>602,7964=>602,7965=>602,7968=>602, +7969=>602,7970=>602,7971=>602,7972=>602,7973=>602,7974=>602,7975=>602,7976=>602,7977=>602,7978=>602, +7979=>602,7980=>602,7981=>602,7982=>602,7983=>602,7984=>602,7985=>602,7986=>602,7987=>602,7988=>602, +7989=>602,7990=>602,7991=>602,7992=>602,7993=>602,7994=>602,7995=>602,7996=>602,7997=>602,7998=>602, +7999=>602,8000=>602,8001=>602,8002=>602,8003=>602,8004=>602,8005=>602,8008=>602,8009=>602,8010=>602, +8011=>602,8012=>602,8013=>602,8016=>602,8017=>602,8018=>602,8019=>602,8020=>602,8021=>602,8022=>602, +8023=>602,8025=>602,8027=>602,8029=>602,8031=>602,8032=>602,8033=>602,8034=>602,8035=>602,8036=>602, +8037=>602,8038=>602,8039=>602,8040=>602,8041=>602,8042=>602,8043=>602,8044=>602,8045=>602,8046=>602, +8047=>602,8048=>602,8049=>602,8050=>602,8051=>602,8052=>602,8053=>602,8054=>602,8055=>602,8056=>602, +8057=>602,8058=>602,8059=>602,8060=>602,8061=>602,8064=>602,8065=>602,8066=>602,8067=>602,8068=>602, +8069=>602,8070=>602,8071=>602,8072=>602,8073=>602,8074=>602,8075=>602,8076=>602,8077=>602,8078=>602, +8079=>602,8080=>602,8081=>602,8082=>602,8083=>602,8084=>602,8085=>602,8086=>602,8087=>602,8088=>602, +8089=>602,8090=>602,8091=>602,8092=>602,8093=>602,8094=>602,8095=>602,8096=>602,8097=>602,8098=>602, +8099=>602,8100=>602,8101=>602,8102=>602,8103=>602,8104=>602,8105=>602,8106=>602,8107=>602,8108=>602, +8109=>602,8110=>602,8111=>602,8112=>602,8113=>602,8114=>602,8115=>602,8116=>602,8118=>602,8119=>602, +8120=>602,8121=>602,8122=>602,8123=>602,8124=>602,8125=>602,8126=>602,8127=>602,8128=>602,8129=>602, +8130=>602,8131=>602,8132=>602,8134=>602,8135=>602,8136=>602,8137=>602,8138=>602,8139=>602,8140=>602, +8141=>602,8142=>602,8143=>602,8144=>602,8145=>602,8146=>602,8147=>602,8150=>602,8151=>602,8152=>602, +8153=>602,8154=>602,8155=>602,8157=>602,8158=>602,8159=>602,8160=>602,8161=>602,8162=>602,8163=>602, +8164=>602,8165=>602,8166=>602,8167=>602,8168=>602,8169=>602,8170=>602,8171=>602,8172=>602,8173=>602, +8174=>602,8175=>602,8178=>602,8179=>602,8180=>602,8182=>602,8183=>602,8184=>602,8185=>602,8186=>602, +8187=>602,8188=>602,8189=>602,8190=>602,8192=>602,8193=>602,8194=>602,8195=>602,8196=>602,8197=>602, +8198=>602,8199=>602,8200=>602,8201=>602,8202=>602,8208=>602,8209=>602,8210=>602,8213=>602,8215=>602, +8219=>602,8223=>602,8227=>602,8239=>602,8241=>602,8242=>602,8243=>602,8244=>602,8245=>602,8246=>602, +8247=>602,8252=>602,8253=>602,8254=>602,8261=>602,8262=>602,8263=>602,8264=>602,8265=>602,8287=>602, +8304=>602,8305=>602,8308=>602,8309=>602,8310=>602,8311=>602,8312=>602,8313=>602,8314=>602,8315=>602, +8316=>602,8317=>602,8318=>602,8319=>602,8320=>602,8321=>602,8322=>602,8323=>602,8324=>602,8325=>602, +8326=>602,8327=>602,8328=>602,8329=>602,8330=>602,8331=>602,8332=>602,8333=>602,8334=>602,8336=>602, +8337=>602,8338=>602,8339=>602,8340=>602,8352=>602,8353=>602,8354=>602,8355=>602,8356=>602,8357=>602, +8358=>602,8359=>602,8360=>602,8361=>602,8362=>602,8363=>602,8365=>602,8366=>602,8367=>602,8368=>602, +8369=>602,8370=>602,8371=>602,8372=>602,8373=>602,8450=>602,8453=>602,8461=>602,8462=>602,8463=>602, +8469=>602,8470=>602,8471=>602,8473=>602,8474=>602,8477=>602,8484=>602,8486=>602,8490=>602,8491=>602, +8494=>602,8531=>602,8532=>602,8533=>602,8534=>602,8535=>602,8536=>602,8537=>602,8538=>602,8539=>602, +8540=>602,8541=>602,8542=>602,8543=>602,8592=>602,8593=>602,8594=>602,8595=>602,8596=>602,8597=>602, +8598=>602,8599=>602,8600=>602,8601=>602,8602=>602,8603=>602,8604=>602,8605=>602,8606=>602,8607=>602, +8608=>602,8609=>602,8610=>602,8611=>602,8612=>602,8613=>602,8614=>602,8615=>602,8616=>602,8617=>602, +8618=>602,8619=>602,8620=>602,8621=>602,8622=>602,8623=>602,8624=>602,8625=>602,8626=>602,8627=>602, +8628=>602,8629=>602,8630=>602,8631=>602,8632=>602,8633=>602,8634=>602,8635=>602,8636=>602,8637=>602, +8638=>602,8639=>602,8640=>602,8641=>602,8642=>602,8643=>602,8644=>602,8645=>602,8646=>602,8647=>602, +8648=>602,8649=>602,8650=>602,8651=>602,8652=>602,8653=>602,8654=>602,8655=>602,8656=>602,8657=>602, +8658=>602,8659=>602,8660=>602,8661=>602,8662=>602,8663=>602,8664=>602,8665=>602,8666=>602,8667=>602, +8668=>602,8669=>602,8670=>602,8671=>602,8672=>602,8673=>602,8674=>602,8675=>602,8676=>602,8677=>602, +8678=>602,8679=>602,8680=>602,8681=>602,8682=>602,8683=>602,8684=>602,8685=>602,8686=>602,8687=>602, +8688=>602,8689=>602,8690=>602,8691=>602,8692=>602,8693=>602,8694=>602,8695=>602,8696=>602,8697=>602, +8698=>602,8699=>602,8700=>602,8701=>602,8702=>602,8703=>602,8704=>602,8705=>602,8706=>602,8707=>602, +8708=>602,8709=>602,8710=>602,8711=>602,8712=>602,8713=>602,8714=>602,8715=>602,8716=>602,8717=>602, +8719=>602,8721=>602,8722=>602,8723=>602,8725=>602,8727=>602,8728=>602,8729=>602,8730=>602,8731=>602, +8732=>602,8733=>602,8734=>602,8735=>602,8736=>602,8743=>602,8744=>602,8745=>602,8746=>602,8747=>602, +8748=>602,8749=>602,8760=>602,8761=>602,8762=>602,8763=>602,8764=>602,8765=>602,8769=>602,8770=>602, +8771=>602,8772=>602,8773=>602,8774=>602,8775=>602,8776=>602,8777=>602,8778=>602,8779=>602,8780=>602, +8781=>602,8782=>602,8783=>602,8784=>602,8785=>602,8786=>602,8787=>602,8788=>602,8789=>602,8790=>602, +8791=>602,8792=>602,8793=>602,8794=>602,8795=>602,8796=>602,8797=>602,8798=>602,8799=>602,8800=>602, +8801=>602,8802=>602,8803=>602,8804=>602,8805=>602,8806=>602,8807=>602,8808=>602,8809=>602,8813=>602, +8814=>602,8815=>602,8816=>602,8817=>602,8818=>602,8819=>602,8820=>602,8821=>602,8822=>602,8823=>602, +8824=>602,8825=>602,8826=>602,8827=>602,8828=>602,8829=>602,8830=>602,8831=>602,8832=>602,8833=>602, +8834=>602,8835=>602,8836=>602,8837=>602,8838=>602,8839=>602,8840=>602,8841=>602,8842=>602,8843=>602, +8847=>602,8848=>602,8849=>602,8850=>602,8853=>602,8854=>602,8855=>602,8856=>602,8857=>602,8858=>602, +8859=>602,8860=>602,8861=>602,8862=>602,8863=>602,8864=>602,8865=>602,8901=>602,8902=>602,8909=>602, +8922=>602,8923=>602,8924=>602,8925=>602,8926=>602,8927=>602,8928=>602,8929=>602,8930=>602,8931=>602, +8932=>602,8933=>602,8934=>602,8935=>602,8936=>602,8937=>602,8943=>602,8960=>602,8961=>602,8962=>602, +8963=>602,8964=>602,8965=>602,8966=>602,8968=>602,8969=>602,8970=>602,8971=>602,8972=>602,8973=>602, +8974=>602,8975=>602,8976=>602,8977=>602,8978=>602,8979=>602,8980=>602,8981=>602,8984=>602,8985=>602, +8988=>602,8989=>602,8990=>602,8991=>602,8992=>602,8993=>602,8997=>602,8998=>602,8999=>602,9000=>602, +9003=>602,9013=>602,9015=>602,9016=>602,9017=>602,9018=>602,9019=>602,9020=>602,9021=>602,9022=>602, +9025=>602,9026=>602,9027=>602,9028=>602,9031=>602,9032=>602,9033=>602,9035=>602,9036=>602,9037=>602, +9040=>602,9042=>602,9043=>602,9044=>602,9047=>602,9048=>602,9049=>602,9050=>602,9051=>602,9052=>602, +9054=>602,9055=>602,9056=>602,9059=>602,9060=>602,9061=>602,9064=>602,9065=>602,9067=>602,9068=>602, +9069=>602,9070=>602,9071=>602,9072=>602,9075=>602,9076=>602,9077=>602,9078=>602,9079=>602,9080=>602, +9081=>602,9082=>602,9085=>602,9088=>602,9089=>602,9090=>602,9091=>602,9096=>602,9097=>602,9098=>602, +9099=>602,9109=>602,9115=>602,9116=>602,9117=>602,9118=>602,9119=>602,9120=>602,9121=>602,9122=>602, +9123=>602,9124=>602,9125=>602,9126=>602,9127=>602,9128=>602,9129=>602,9130=>602,9131=>602,9132=>602, +9133=>602,9134=>602,9166=>602,9167=>602,9251=>602,9600=>602,9601=>602,9602=>602,9603=>602,9604=>602, +9605=>602,9606=>602,9607=>602,9608=>602,9609=>602,9610=>602,9611=>602,9612=>602,9613=>602,9614=>602, +9615=>602,9616=>602,9617=>602,9618=>602,9619=>602,9620=>602,9621=>602,9622=>602,9623=>602,9624=>602, +9625=>602,9626=>602,9627=>602,9628=>602,9629=>602,9630=>602,9631=>602,9632=>602,9633=>602,9634=>602, +9635=>602,9636=>602,9637=>602,9638=>602,9639=>602,9640=>602,9641=>602,9642=>602,9643=>602,9644=>602, +9645=>602,9646=>602,9647=>602,9648=>602,9649=>602,9650=>602,9651=>602,9652=>602,9653=>602,9654=>602, +9655=>602,9656=>602,9657=>602,9658=>602,9659=>602,9660=>602,9661=>602,9662=>602,9663=>602,9664=>602, +9665=>602,9666=>602,9667=>602,9668=>602,9669=>602,9670=>602,9671=>602,9672=>602,9673=>602,9674=>602, +9675=>602,9676=>602,9677=>602,9678=>602,9679=>602,9680=>602,9681=>602,9682=>602,9683=>602,9684=>602, +9685=>602,9686=>602,9687=>602,9688=>602,9689=>602,9690=>602,9691=>602,9692=>602,9693=>602,9694=>602, +9695=>602,9696=>602,9697=>602,9698=>602,9699=>602,9700=>602,9701=>602,9702=>602,9703=>602,9704=>602, +9705=>602,9706=>602,9707=>602,9708=>602,9709=>602,9710=>602,9711=>602,9712=>602,9713=>602,9714=>602, +9715=>602,9716=>602,9717=>602,9718=>602,9719=>602,9720=>602,9721=>602,9722=>602,9723=>602,9724=>602, +9725=>602,9726=>602,9727=>602,9728=>602,9784=>602,9785=>602,9786=>602,9787=>602,9788=>602,9791=>602, +9792=>602,9793=>602,9794=>602,9795=>602,9796=>602,9797=>602,9798=>602,9799=>602,9824=>602,9825=>602, +9826=>602,9827=>602,9828=>602,9829=>602,9830=>602,9831=>602,9833=>602,9834=>602,9835=>602,9836=>602, +9837=>602,9838=>602,9839=>602,10181=>602,10182=>602,10208=>602,10216=>602,10217=>602,10731=>602,10746=>602, +10747=>602,10799=>602,11026=>602,11027=>602,11028=>602,11029=>602,11030=>602,11031=>602,11032=>602,11033=>602, +11034=>602,11364=>602,11374=>602,11375=>602,11381=>602,11382=>602,11383=>602,11385=>602,11386=>602,11388=>602, +11389=>602,11800=>602,11810=>602,11811=>602,11812=>602,11813=>602,11822=>602,42760=>602,42761=>602,42762=>602, +42763=>602,42764=>602,42765=>602,42766=>602,42767=>602,42768=>602,42769=>602,42770=>602,42771=>602,42772=>602, +42773=>602,42774=>602,42779=>602,42780=>602,42781=>602,42782=>602,42783=>602,42790=>602,42791=>602,42889=>602, +42890=>602,42891=>602,42892=>602,63173=>602,64257=>602,64258=>602,65529=>602,65530=>602,65531=>602,65532=>602, +65533=>602); +$enc=''; +$diff=''; +$file='dejavusansmonobi.z'; +$ctg='dejavusansmonobi.ctg.z'; +$originalsize=223408; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonobi.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonobi.z new file mode 100644 index 0000000..08c6170 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonobi.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonoi.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonoi.ctg.z new file mode 100644 index 0000000..7b8bc17 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonoi.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonoi.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonoi.php new file mode 100644 index 0000000..a544ef7 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonoi.php @@ -0,0 +1,262 @@ +<?php +$type='TrueTypeUnicode'; +$name='DejaVuSansMono-Oblique'; +$desc=array('Ascent'=>928,'Descent'=>-236,'CapHeight'=>-62,'Flags'=>97,'FontBBox'=>'[-406 -375 746 1028]','ItalicAngle'=>-11,'StemV'=>70,'MissingWidth'=>602); +$up=-63; +$ut=44; +$dw=602; +$cw=array( +0=>602,32=>602,33=>602,34=>602,35=>602,36=>602,37=>602,38=>602,39=>602,40=>602, +41=>602,42=>602,43=>602,44=>602,45=>602,46=>602,47=>602,48=>602,49=>602,50=>602, +51=>602,52=>602,53=>602,54=>602,55=>602,56=>602,57=>602,58=>602,59=>602,60=>602, +61=>602,62=>602,63=>602,64=>602,65=>602,66=>602,67=>602,68=>602,69=>602,70=>602, +71=>602,72=>602,73=>602,74=>602,75=>602,76=>602,77=>602,78=>602,79=>602,80=>602, +81=>602,82=>602,83=>602,84=>602,85=>602,86=>602,87=>602,88=>602,89=>602,90=>602, +91=>602,92=>602,93=>602,94=>602,95=>602,96=>602,97=>602,98=>602,99=>602,100=>602, +101=>602,102=>602,103=>602,104=>602,105=>602,106=>602,107=>602,108=>602,109=>602,110=>602, +111=>602,112=>602,113=>602,114=>602,115=>602,116=>602,117=>602,118=>602,119=>602,120=>602, +121=>602,122=>602,123=>602,124=>602,125=>602,126=>602,8364=>602,8218=>602,402=>602,8222=>602, +8230=>602,8224=>602,8225=>602,710=>602,8240=>602,352=>602,8249=>602,338=>602,381=>602,8216=>602, +8217=>602,8220=>602,8221=>602,8226=>602,8211=>602,8212=>602,732=>602,8482=>602,353=>602,8250=>602, +339=>602,382=>602,376=>602,160=>602,161=>602,162=>602,163=>602,164=>602,165=>602,166=>602, +167=>602,168=>602,169=>602,170=>602,171=>602,172=>602,173=>602,174=>602,175=>602,176=>602, +177=>602,178=>602,179=>602,180=>602,181=>602,182=>602,183=>602,184=>602,185=>602,186=>602, +187=>602,188=>602,189=>602,190=>602,191=>602,192=>602,193=>602,194=>602,195=>602,196=>602, +197=>602,198=>602,199=>602,200=>602,201=>602,202=>602,203=>602,204=>602,205=>602,206=>602, +207=>602,208=>602,209=>602,210=>602,211=>602,212=>602,213=>602,214=>602,215=>602,216=>602, +217=>602,218=>602,219=>602,220=>602,221=>602,222=>602,223=>602,224=>602,225=>602,226=>602, +227=>602,228=>602,229=>602,230=>602,231=>602,232=>602,233=>602,234=>602,235=>602,236=>602, +237=>602,238=>602,239=>602,240=>602,241=>602,242=>602,243=>602,244=>602,245=>602,246=>602, +247=>602,248=>602,249=>602,250=>602,251=>602,252=>602,253=>602,254=>602,255=>602,256=>602, +257=>602,258=>602,259=>602,260=>602,261=>602,262=>602,263=>602,264=>602,265=>602,266=>602, +267=>602,268=>602,269=>602,270=>602,271=>602,272=>602,273=>602,274=>602,275=>602,276=>602, +277=>602,278=>602,279=>602,280=>602,281=>602,282=>602,283=>602,284=>602,285=>602,286=>602, +287=>602,288=>602,289=>602,290=>602,291=>602,292=>602,293=>602,294=>602,295=>602,296=>602, +297=>602,298=>602,299=>602,300=>602,301=>602,302=>602,303=>602,304=>602,305=>602,306=>602, +307=>602,308=>602,309=>602,310=>602,311=>602,312=>602,313=>602,314=>602,315=>602,316=>602, +317=>602,318=>602,319=>602,320=>602,321=>602,322=>602,323=>602,324=>602,325=>602,326=>602, +327=>602,328=>602,329=>602,330=>602,331=>602,332=>602,333=>602,334=>602,335=>602,336=>602, +337=>602,340=>602,341=>602,342=>602,343=>602,344=>602,345=>602,346=>602,347=>602,348=>602, +349=>602,350=>602,351=>602,354=>602,355=>602,356=>602,357=>602,358=>602,359=>602,360=>602, +361=>602,362=>602,363=>602,364=>602,365=>602,366=>602,367=>602,368=>602,369=>602,370=>602, +371=>602,372=>602,373=>602,374=>602,375=>602,377=>602,378=>602,379=>602,380=>602,383=>602, +384=>602,385=>602,386=>602,387=>602,388=>602,389=>602,390=>602,391=>602,392=>602,393=>602, +394=>602,395=>602,396=>602,397=>602,398=>602,399=>602,400=>602,401=>602,403=>602,404=>602, +405=>602,406=>602,407=>602,408=>602,409=>602,410=>602,411=>602,412=>602,413=>602,414=>602, +415=>602,416=>602,417=>602,418=>602,419=>602,420=>602,421=>602,422=>602,423=>602,424=>602, +425=>602,426=>602,427=>602,428=>602,429=>602,430=>602,431=>602,432=>602,433=>602,434=>602, +435=>602,436=>602,437=>602,438=>602,439=>602,440=>602,441=>602,442=>602,443=>602,444=>602, +445=>602,446=>602,447=>602,448=>602,449=>602,450=>602,451=>602,461=>602,462=>602,463=>602, +464=>602,465=>602,466=>602,467=>602,468=>602,469=>602,470=>602,471=>602,472=>602,473=>602, +474=>602,475=>602,476=>602,477=>602,479=>602,480=>602,481=>602,482=>602,483=>602,486=>602, +487=>602,488=>602,489=>602,490=>602,491=>602,492=>602,493=>602,494=>602,495=>602,500=>602, +501=>602,502=>602,504=>602,505=>602,508=>602,509=>602,510=>602,511=>602,512=>602,513=>602, +514=>602,515=>602,516=>602,517=>602,518=>602,519=>602,520=>602,521=>602,522=>602,523=>602, +524=>602,525=>602,526=>602,527=>602,528=>602,529=>602,530=>602,531=>602,532=>602,533=>602, +534=>602,535=>602,536=>602,537=>602,538=>602,539=>602,540=>602,541=>602,542=>602,543=>602, +545=>602,548=>602,549=>602,550=>602,551=>602,552=>602,553=>602,554=>602,555=>602,556=>602, +557=>602,558=>602,559=>602,560=>602,561=>602,562=>602,563=>602,564=>602,565=>602,566=>602, +567=>602,568=>602,569=>602,570=>602,571=>602,572=>602,573=>602,574=>602,575=>602,576=>602, +577=>602,580=>602,581=>602,588=>602,589=>602,592=>602,593=>602,594=>602,595=>602,596=>602, +597=>602,598=>602,599=>602,600=>602,601=>602,602=>602,603=>602,604=>602,605=>602,606=>602, +607=>602,608=>602,609=>602,610=>602,611=>602,612=>602,613=>602,614=>602,615=>602,616=>602, +617=>602,618=>602,619=>602,620=>602,621=>602,622=>602,623=>602,624=>602,625=>602,626=>602, +627=>602,628=>602,629=>602,630=>602,631=>602,632=>602,633=>602,634=>602,635=>602,636=>602, +637=>602,638=>602,639=>602,640=>602,641=>602,642=>602,643=>602,644=>602,645=>602,646=>602, +647=>602,648=>602,649=>602,650=>602,651=>602,652=>602,653=>602,654=>602,655=>602,656=>602, +657=>602,658=>602,659=>602,660=>602,661=>602,662=>602,663=>602,664=>602,665=>602,666=>602, +667=>602,668=>602,669=>602,670=>602,671=>602,672=>602,673=>602,674=>602,675=>602,676=>602, +677=>602,678=>602,679=>602,680=>602,681=>602,682=>602,683=>602,684=>602,685=>602,686=>602, +687=>602,688=>602,689=>602,690=>602,691=>602,692=>602,693=>602,694=>602,695=>602,696=>602, +697=>602,699=>602,700=>602,701=>602,702=>602,703=>602,704=>602,705=>602,711=>602,712=>602, +713=>602,716=>602,717=>602,720=>602,721=>602,722=>602,723=>602,726=>602,727=>602,728=>602, +729=>602,730=>602,731=>602,733=>602,734=>602,736=>602,737=>602,738=>602,739=>602,740=>602, +741=>602,742=>602,743=>602,744=>602,745=>602,750=>602,755=>602,768=>602,769=>602,770=>602, +771=>602,772=>602,773=>602,774=>602,775=>602,776=>602,777=>602,778=>602,779=>602,780=>602, +781=>602,782=>602,783=>602,784=>602,785=>602,786=>602,787=>602,788=>602,789=>602,790=>602, +791=>602,792=>602,793=>602,794=>602,795=>602,796=>602,797=>602,798=>602,799=>602,800=>602, +801=>602,802=>602,803=>602,804=>602,805=>602,806=>602,807=>602,808=>602,809=>602,810=>602, +811=>602,812=>602,813=>602,814=>602,815=>602,816=>602,817=>602,818=>602,819=>602,820=>602, +821=>602,822=>602,823=>602,824=>602,825=>602,826=>602,827=>602,828=>602,829=>602,830=>602, +831=>602,835=>602,856=>602,865=>602,884=>602,885=>602,890=>602,894=>602,900=>602,901=>602, +902=>602,903=>602,904=>602,905=>602,906=>602,908=>602,910=>602,911=>602,912=>602,913=>602, +914=>602,915=>602,916=>602,917=>602,918=>602,919=>602,920=>602,921=>602,922=>602,923=>602, +924=>602,925=>602,926=>602,927=>602,928=>602,929=>602,931=>602,932=>602,933=>602,934=>602, +935=>602,936=>602,937=>602,938=>602,939=>602,940=>602,941=>602,942=>602,943=>602,944=>602, +945=>602,946=>602,947=>602,948=>602,949=>602,950=>602,951=>602,952=>602,953=>602,954=>602, +955=>602,956=>602,957=>602,958=>602,959=>602,960=>602,961=>602,962=>602,963=>602,964=>602, +965=>602,966=>602,967=>602,968=>602,969=>602,970=>602,971=>602,972=>602,973=>602,974=>602, +976=>602,977=>602,978=>602,979=>602,980=>602,981=>602,982=>602,983=>602,984=>602,985=>602, +986=>602,987=>602,988=>602,989=>602,990=>602,991=>602,992=>602,993=>602,1008=>602,1009=>602, +1010=>602,1011=>602,1012=>602,1013=>602,1014=>602,1015=>602,1016=>602,1017=>602,1018=>602,1019=>602, +1020=>602,1021=>602,1022=>602,1023=>602,1024=>602,1025=>602,1026=>602,1027=>602,1028=>602,1029=>602, +1030=>602,1031=>602,1032=>602,1033=>602,1034=>602,1035=>602,1036=>602,1037=>602,1038=>602,1039=>602, +1040=>602,1041=>602,1042=>602,1043=>602,1044=>602,1045=>602,1046=>602,1047=>602,1048=>602,1049=>602, +1050=>602,1051=>602,1052=>602,1053=>602,1054=>602,1055=>602,1056=>602,1057=>602,1058=>602,1059=>602, +1060=>602,1061=>602,1062=>602,1063=>602,1064=>602,1065=>602,1066=>602,1067=>602,1068=>602,1069=>602, +1070=>602,1071=>602,1072=>602,1073=>602,1074=>602,1075=>602,1076=>602,1077=>602,1078=>602,1079=>602, +1080=>602,1081=>602,1082=>602,1083=>602,1084=>602,1085=>602,1086=>602,1087=>602,1088=>602,1089=>602, +1090=>602,1091=>602,1092=>602,1093=>602,1094=>602,1095=>602,1096=>602,1097=>602,1098=>602,1099=>602, +1100=>602,1101=>602,1102=>602,1103=>602,1104=>602,1105=>602,1106=>602,1107=>602,1108=>602,1109=>602, +1110=>602,1111=>602,1112=>602,1113=>602,1114=>602,1115=>602,1116=>602,1117=>602,1118=>602,1119=>602, +1122=>602,1123=>602,1138=>602,1139=>602,1168=>602,1169=>602,1170=>602,1171=>602,1172=>602,1173=>602, +1174=>602,1175=>602,1176=>602,1177=>602,1178=>602,1179=>602,1186=>602,1187=>602,1194=>602,1195=>602, +1196=>602,1197=>602,1198=>602,1199=>602,1200=>602,1201=>602,1202=>602,1203=>602,1210=>602,1211=>602, +1216=>602,1217=>602,1218=>602,1219=>602,1220=>602,1223=>602,1224=>602,1227=>602,1228=>602,1231=>602, +1232=>602,1233=>602,1234=>602,1235=>602,1236=>602,1237=>602,1238=>602,1239=>602,1240=>602,1241=>602, +1242=>602,1243=>602,1244=>602,1245=>602,1246=>602,1247=>602,1248=>602,1249=>602,1250=>602,1251=>602, +1252=>602,1253=>602,1254=>602,1255=>602,1256=>602,1257=>602,1258=>602,1259=>602,1260=>602,1261=>602, +1262=>602,1263=>602,1264=>602,1265=>602,1266=>602,1267=>602,1268=>602,1269=>602,1270=>602,1271=>602, +1272=>602,1273=>602,1296=>602,1297=>602,1306=>602,1307=>602,1308=>602,1309=>602,3713=>602,3714=>602, +3716=>602,3719=>602,3720=>602,3722=>602,3725=>602,3732=>602,3733=>602,3734=>602,3735=>602,3737=>602, +3738=>602,3739=>602,3740=>602,3741=>602,3742=>602,3743=>602,3745=>602,3746=>602,3747=>602,3749=>602, +3751=>602,3754=>602,3755=>602,3757=>602,3758=>602,3759=>602,3760=>602,3761=>602,3762=>602,3763=>602, +3764=>602,3765=>602,3766=>602,3767=>602,3768=>602,3769=>602,3771=>602,3772=>602,3784=>602,3785=>602, +3786=>602,3787=>602,3788=>602,3789=>602,4304=>602,4305=>602,4306=>602,4307=>602,4308=>602,4309=>602, +4310=>602,4311=>602,4312=>602,4313=>602,4314=>602,4315=>602,4316=>602,4317=>602,4318=>602,4319=>602, +4320=>602,4321=>602,4322=>602,4323=>602,4324=>602,4325=>602,4326=>602,4327=>602,4328=>602,4329=>602, +4330=>602,4331=>602,4332=>602,4333=>602,4334=>602,4335=>602,4336=>602,4337=>602,4338=>602,4339=>602, +4340=>602,4341=>602,4342=>602,4343=>602,4344=>602,4345=>602,4346=>602,4347=>602,4348=>602,7426=>602, +7432=>602,7433=>602,7444=>602,7446=>602,7447=>602,7453=>602,7454=>602,7455=>602,7468=>602,7469=>602, +7470=>602,7472=>602,7473=>602,7474=>602,7475=>602,7476=>602,7477=>602,7478=>602,7479=>602,7480=>602, +7481=>602,7482=>602,7483=>602,7484=>602,7485=>602,7486=>602,7487=>602,7488=>602,7489=>602,7490=>602, +7491=>602,7492=>602,7493=>602,7494=>602,7495=>602,7496=>602,7497=>602,7498=>602,7499=>602,7500=>602, +7501=>602,7502=>602,7503=>602,7504=>602,7505=>602,7506=>602,7507=>602,7508=>602,7509=>602,7510=>602, +7511=>602,7512=>602,7513=>602,7514=>602,7515=>602,7522=>602,7523=>602,7524=>602,7525=>602,7543=>602, +7544=>602,7547=>602,7557=>602,7579=>602,7580=>602,7581=>602,7582=>602,7583=>602,7584=>602,7585=>602, +7586=>602,7587=>602,7588=>602,7589=>602,7590=>602,7591=>602,7592=>602,7593=>602,7594=>602,7595=>602, +7596=>602,7597=>602,7598=>602,7599=>602,7600=>602,7601=>602,7602=>602,7603=>602,7604=>602,7605=>602, +7606=>602,7607=>602,7609=>602,7610=>602,7611=>602,7612=>602,7613=>602,7614=>602,7615=>602,7680=>602, +7681=>602,7682=>602,7683=>602,7684=>602,7685=>602,7686=>602,7687=>602,7688=>602,7689=>602,7690=>602, +7691=>602,7692=>602,7693=>602,7694=>602,7695=>602,7696=>602,7697=>602,7698=>602,7699=>602,7704=>602, +7705=>602,7706=>602,7707=>602,7708=>602,7709=>602,7710=>602,7711=>602,7712=>602,7713=>602,7714=>602, +7715=>602,7716=>602,7717=>602,7718=>602,7719=>602,7720=>602,7721=>602,7722=>602,7723=>602,7724=>602, +7725=>602,7728=>602,7729=>602,7730=>602,7731=>602,7732=>602,7733=>602,7734=>602,7735=>602,7736=>602, +7737=>602,7738=>602,7739=>602,7740=>602,7741=>602,7742=>602,7743=>602,7744=>602,7745=>602,7746=>602, +7747=>602,7748=>602,7749=>602,7750=>602,7751=>602,7752=>602,7753=>602,7754=>602,7755=>602,7756=>602, +7757=>602,7764=>602,7765=>602,7766=>602,7767=>602,7768=>602,7769=>602,7770=>602,7771=>602,7772=>602, +7773=>602,7774=>602,7775=>602,7776=>602,7777=>602,7778=>602,7779=>602,7784=>602,7785=>602,7786=>602, +7787=>602,7788=>602,7789=>602,7790=>602,7791=>602,7792=>602,7793=>602,7794=>602,7795=>602,7796=>602, +7797=>602,7798=>602,7799=>602,7800=>602,7801=>602,7804=>602,7805=>602,7806=>602,7807=>602,7808=>602, +7809=>602,7810=>602,7811=>602,7812=>602,7813=>602,7814=>602,7815=>602,7816=>602,7817=>602,7818=>602, +7819=>602,7820=>602,7821=>602,7822=>602,7823=>602,7824=>602,7825=>602,7826=>602,7827=>602,7828=>602, +7829=>602,7830=>602,7831=>602,7832=>602,7833=>602,7835=>602,7839=>602,7840=>602,7841=>602,7852=>602, +7853=>602,7856=>602,7857=>602,7862=>602,7863=>602,7864=>602,7865=>602,7868=>602,7869=>602,7878=>602, +7879=>602,7882=>602,7883=>602,7884=>602,7885=>602,7896=>602,7897=>602,7898=>602,7899=>602,7900=>602, +7901=>602,7904=>602,7905=>602,7906=>602,7907=>602,7908=>602,7909=>602,7912=>602,7913=>602,7914=>602, +7915=>602,7918=>602,7919=>602,7920=>602,7921=>602,7922=>602,7923=>602,7924=>602,7925=>602,7928=>602, +7929=>602,7936=>602,7937=>602,7938=>602,7939=>602,7940=>602,7941=>602,7942=>602,7943=>602,7944=>602, +7945=>602,7946=>602,7947=>602,7948=>602,7949=>602,7950=>602,7951=>602,7952=>602,7953=>602,7954=>602, +7955=>602,7956=>602,7957=>602,7960=>602,7961=>602,7962=>602,7963=>602,7964=>602,7965=>602,7968=>602, +7969=>602,7970=>602,7971=>602,7972=>602,7973=>602,7974=>602,7975=>602,7976=>602,7977=>602,7978=>602, +7979=>602,7980=>602,7981=>602,7982=>602,7983=>602,7984=>602,7985=>602,7986=>602,7987=>602,7988=>602, +7989=>602,7990=>602,7991=>602,7992=>602,7993=>602,7994=>602,7995=>602,7996=>602,7997=>602,7998=>602, +7999=>602,8000=>602,8001=>602,8002=>602,8003=>602,8004=>602,8005=>602,8008=>602,8009=>602,8010=>602, +8011=>602,8012=>602,8013=>602,8016=>602,8017=>602,8018=>602,8019=>602,8020=>602,8021=>602,8022=>602, +8023=>602,8025=>602,8027=>602,8029=>602,8031=>602,8032=>602,8033=>602,8034=>602,8035=>602,8036=>602, +8037=>602,8038=>602,8039=>602,8040=>602,8041=>602,8042=>602,8043=>602,8044=>602,8045=>602,8046=>602, +8047=>602,8048=>602,8049=>602,8050=>602,8051=>602,8052=>602,8053=>602,8054=>602,8055=>602,8056=>602, +8057=>602,8058=>602,8059=>602,8060=>602,8061=>602,8064=>602,8065=>602,8066=>602,8067=>602,8068=>602, +8069=>602,8070=>602,8071=>602,8072=>602,8073=>602,8074=>602,8075=>602,8076=>602,8077=>602,8078=>602, +8079=>602,8080=>602,8081=>602,8082=>602,8083=>602,8084=>602,8085=>602,8086=>602,8087=>602,8088=>602, +8089=>602,8090=>602,8091=>602,8092=>602,8093=>602,8094=>602,8095=>602,8096=>602,8097=>602,8098=>602, +8099=>602,8100=>602,8101=>602,8102=>602,8103=>602,8104=>602,8105=>602,8106=>602,8107=>602,8108=>602, +8109=>602,8110=>602,8111=>602,8112=>602,8113=>602,8114=>602,8115=>602,8116=>602,8118=>602,8119=>602, +8120=>602,8121=>602,8122=>602,8123=>602,8124=>602,8125=>602,8126=>602,8127=>602,8128=>602,8129=>602, +8130=>602,8131=>602,8132=>602,8134=>602,8135=>602,8136=>602,8137=>602,8138=>602,8139=>602,8140=>602, +8141=>602,8142=>602,8143=>602,8144=>602,8145=>602,8146=>602,8147=>602,8150=>602,8151=>602,8152=>602, +8153=>602,8154=>602,8155=>602,8157=>602,8158=>602,8159=>602,8160=>602,8161=>602,8162=>602,8163=>602, +8164=>602,8165=>602,8166=>602,8167=>602,8168=>602,8169=>602,8170=>602,8171=>602,8172=>602,8173=>602, +8174=>602,8175=>602,8178=>602,8179=>602,8180=>602,8182=>602,8183=>602,8184=>602,8185=>602,8186=>602, +8187=>602,8188=>602,8189=>602,8190=>602,8192=>602,8193=>602,8194=>602,8195=>602,8196=>602,8197=>602, +8198=>602,8199=>602,8200=>602,8201=>602,8202=>602,8208=>602,8209=>602,8210=>602,8213=>602,8215=>602, +8219=>602,8223=>602,8227=>602,8239=>602,8241=>602,8242=>602,8243=>602,8244=>602,8245=>602,8246=>602, +8247=>602,8252=>602,8253=>602,8254=>602,8261=>602,8262=>602,8263=>602,8264=>602,8265=>602,8287=>602, +8304=>602,8305=>602,8308=>602,8309=>602,8310=>602,8311=>602,8312=>602,8313=>602,8314=>602,8315=>602, +8316=>602,8317=>602,8318=>602,8319=>602,8320=>602,8321=>602,8322=>602,8323=>602,8324=>602,8325=>602, +8326=>602,8327=>602,8328=>602,8329=>602,8330=>602,8331=>602,8332=>602,8333=>602,8334=>602,8336=>602, +8337=>602,8338=>602,8339=>602,8340=>602,8352=>602,8353=>602,8354=>602,8355=>602,8356=>602,8357=>602, +8358=>602,8359=>602,8360=>602,8361=>602,8362=>602,8363=>602,8365=>602,8366=>602,8367=>602,8368=>602, +8369=>602,8370=>602,8371=>602,8372=>602,8373=>602,8450=>602,8453=>602,8461=>602,8462=>602,8463=>602, +8469=>602,8470=>602,8471=>602,8473=>602,8474=>602,8477=>602,8484=>602,8486=>602,8490=>602,8491=>602, +8494=>602,8531=>602,8532=>602,8533=>602,8534=>602,8535=>602,8536=>602,8537=>602,8538=>602,8539=>602, +8540=>602,8541=>602,8542=>602,8543=>602,8592=>602,8593=>602,8594=>602,8595=>602,8596=>602,8597=>602, +8598=>602,8599=>602,8600=>602,8601=>602,8602=>602,8603=>602,8604=>602,8605=>602,8606=>602,8607=>602, +8608=>602,8609=>602,8610=>602,8611=>602,8612=>602,8613=>602,8614=>602,8615=>602,8616=>602,8617=>602, +8618=>602,8619=>602,8620=>602,8621=>602,8622=>602,8623=>602,8624=>602,8625=>602,8626=>602,8627=>602, +8628=>602,8629=>602,8630=>602,8631=>602,8632=>602,8633=>602,8634=>602,8635=>602,8636=>602,8637=>602, +8638=>602,8639=>602,8640=>602,8641=>602,8642=>602,8643=>602,8644=>602,8645=>602,8646=>602,8647=>602, +8648=>602,8649=>602,8650=>602,8651=>602,8652=>602,8653=>602,8654=>602,8655=>602,8656=>602,8657=>602, +8658=>602,8659=>602,8660=>602,8661=>602,8662=>602,8663=>602,8664=>602,8665=>602,8666=>602,8667=>602, +8668=>602,8669=>602,8670=>602,8671=>602,8672=>602,8673=>602,8674=>602,8675=>602,8676=>602,8677=>602, +8678=>602,8679=>602,8680=>602,8681=>602,8682=>602,8683=>602,8684=>602,8685=>602,8686=>602,8687=>602, +8688=>602,8689=>602,8690=>602,8691=>602,8692=>602,8693=>602,8694=>602,8695=>602,8696=>602,8697=>602, +8698=>602,8699=>602,8700=>602,8701=>602,8702=>602,8703=>602,8704=>602,8705=>602,8706=>602,8707=>602, +8708=>602,8709=>602,8710=>602,8711=>602,8712=>602,8713=>602,8714=>602,8715=>602,8716=>602,8717=>602, +8719=>602,8721=>602,8722=>602,8723=>602,8725=>602,8727=>602,8728=>602,8729=>602,8730=>602,8731=>602, +8732=>602,8733=>602,8734=>602,8735=>602,8736=>602,8743=>602,8744=>602,8745=>602,8746=>602,8747=>602, +8748=>602,8749=>602,8760=>602,8761=>602,8762=>602,8763=>602,8764=>602,8765=>602,8769=>602,8770=>602, +8771=>602,8772=>602,8773=>602,8774=>602,8775=>602,8776=>602,8777=>602,8778=>602,8779=>602,8780=>602, +8781=>602,8782=>602,8783=>602,8784=>602,8785=>602,8786=>602,8787=>602,8788=>602,8789=>602,8790=>602, +8791=>602,8792=>602,8793=>602,8794=>602,8795=>602,8796=>602,8797=>602,8798=>602,8799=>602,8800=>602, +8801=>602,8802=>602,8803=>602,8804=>602,8805=>602,8806=>602,8807=>602,8808=>602,8809=>602,8813=>602, +8814=>602,8815=>602,8816=>602,8817=>602,8818=>602,8819=>602,8820=>602,8821=>602,8822=>602,8823=>602, +8824=>602,8825=>602,8826=>602,8827=>602,8828=>602,8829=>602,8830=>602,8831=>602,8832=>602,8833=>602, +8834=>602,8835=>602,8836=>602,8837=>602,8838=>602,8839=>602,8840=>602,8841=>602,8842=>602,8843=>602, +8847=>602,8848=>602,8849=>602,8850=>602,8853=>602,8854=>602,8855=>602,8856=>602,8857=>602,8858=>602, +8859=>602,8860=>602,8861=>602,8862=>602,8863=>602,8864=>602,8865=>602,8901=>602,8902=>602,8909=>602, +8922=>602,8923=>602,8924=>602,8925=>602,8926=>602,8927=>602,8928=>602,8929=>602,8930=>602,8931=>602, +8932=>602,8933=>602,8934=>602,8935=>602,8936=>602,8937=>602,8943=>602,8960=>602,8961=>602,8962=>602, +8963=>602,8964=>602,8965=>602,8966=>602,8968=>602,8969=>602,8970=>602,8971=>602,8972=>602,8973=>602, +8974=>602,8975=>602,8976=>602,8977=>602,8978=>602,8979=>602,8980=>602,8981=>602,8984=>602,8985=>602, +8988=>602,8989=>602,8990=>602,8991=>602,8992=>602,8993=>602,8997=>602,8998=>602,8999=>602,9000=>602, +9003=>602,9013=>602,9015=>602,9016=>602,9017=>602,9018=>602,9019=>602,9020=>602,9021=>602,9022=>602, +9025=>602,9026=>602,9027=>602,9028=>602,9031=>602,9032=>602,9033=>602,9035=>602,9036=>602,9037=>602, +9040=>602,9042=>602,9043=>602,9044=>602,9047=>602,9048=>602,9049=>602,9050=>602,9051=>602,9052=>602, +9054=>602,9055=>602,9056=>602,9059=>602,9060=>602,9061=>602,9064=>602,9065=>602,9067=>602,9068=>602, +9069=>602,9070=>602,9071=>602,9072=>602,9075=>602,9076=>602,9077=>602,9078=>602,9079=>602,9080=>602, +9081=>602,9082=>602,9085=>602,9088=>602,9089=>602,9090=>602,9091=>602,9096=>602,9097=>602,9098=>602, +9099=>602,9109=>602,9115=>602,9116=>602,9117=>602,9118=>602,9119=>602,9120=>602,9121=>602,9122=>602, +9123=>602,9124=>602,9125=>602,9126=>602,9127=>602,9128=>602,9129=>602,9130=>602,9131=>602,9132=>602, +9133=>602,9134=>602,9166=>602,9167=>602,9251=>602,9472=>602,9473=>602,9474=>602,9475=>602,9476=>602, +9477=>602,9478=>602,9479=>602,9480=>602,9481=>602,9482=>602,9483=>602,9484=>602,9485=>602,9486=>602, +9487=>602,9488=>602,9489=>602,9490=>602,9491=>602,9492=>602,9493=>602,9494=>602,9495=>602,9496=>602, +9497=>602,9498=>602,9499=>602,9500=>602,9501=>602,9502=>602,9503=>602,9504=>602,9505=>602,9506=>602, +9507=>602,9508=>602,9509=>602,9510=>602,9511=>602,9512=>602,9513=>602,9514=>602,9515=>602,9516=>602, +9517=>602,9518=>602,9519=>602,9520=>602,9521=>602,9522=>602,9523=>602,9524=>602,9525=>602,9526=>602, +9527=>602,9528=>602,9529=>602,9530=>602,9531=>602,9532=>602,9533=>602,9534=>602,9535=>602,9536=>602, +9537=>602,9538=>602,9539=>602,9540=>602,9541=>602,9542=>602,9543=>602,9544=>602,9545=>602,9546=>602, +9547=>602,9548=>602,9549=>602,9550=>602,9551=>602,9552=>602,9553=>602,9554=>602,9555=>602,9556=>602, +9557=>602,9558=>602,9559=>602,9560=>602,9561=>602,9562=>602,9563=>602,9564=>602,9565=>602,9566=>602, +9567=>602,9568=>602,9569=>602,9570=>602,9571=>602,9572=>602,9573=>602,9574=>602,9575=>602,9576=>602, +9577=>602,9578=>602,9579=>602,9580=>602,9581=>602,9582=>602,9583=>602,9584=>602,9585=>602,9586=>602, +9587=>602,9588=>602,9589=>602,9590=>602,9591=>602,9592=>602,9593=>602,9594=>602,9595=>602,9596=>602, +9597=>602,9598=>602,9599=>602,9600=>602,9601=>602,9602=>602,9603=>602,9604=>602,9605=>602,9606=>602, +9607=>602,9608=>602,9609=>602,9610=>602,9611=>602,9612=>602,9613=>602,9614=>602,9615=>602,9616=>602, +9617=>602,9618=>602,9619=>602,9620=>602,9621=>602,9622=>602,9623=>602,9624=>602,9625=>602,9626=>602, +9627=>602,9628=>602,9629=>602,9630=>602,9631=>602,9632=>602,9633=>602,9634=>602,9635=>602,9636=>602, +9637=>602,9638=>602,9639=>602,9640=>602,9641=>602,9642=>602,9643=>602,9644=>602,9645=>602,9646=>602, +9647=>602,9648=>602,9649=>602,9650=>602,9651=>602,9652=>602,9653=>602,9654=>602,9655=>602,9656=>602, +9657=>602,9658=>602,9659=>602,9660=>602,9661=>602,9662=>602,9663=>602,9664=>602,9665=>602,9666=>602, +9667=>602,9668=>602,9669=>602,9670=>602,9671=>602,9672=>602,9673=>602,9674=>602,9675=>602,9676=>602, +9677=>602,9678=>602,9679=>602,9680=>602,9681=>602,9682=>602,9683=>602,9684=>602,9685=>602,9686=>602, +9687=>602,9688=>602,9689=>602,9690=>602,9691=>602,9692=>602,9693=>602,9694=>602,9695=>602,9696=>602, +9697=>602,9698=>602,9699=>602,9700=>602,9701=>602,9702=>602,9703=>602,9704=>602,9705=>602,9706=>602, +9707=>602,9708=>602,9709=>602,9710=>602,9711=>602,9712=>602,9713=>602,9714=>602,9715=>602,9716=>602, +9717=>602,9718=>602,9719=>602,9720=>602,9721=>602,9722=>602,9723=>602,9724=>602,9725=>602,9726=>602, +9727=>602,9728=>602,9784=>602,9785=>602,9786=>602,9787=>602,9788=>602,9791=>602,9792=>602,9793=>602, +9794=>602,9795=>602,9796=>602,9797=>602,9798=>602,9799=>602,9824=>602,9825=>602,9826=>602,9827=>602, +9828=>602,9829=>602,9830=>602,9831=>602,9833=>602,9834=>602,9835=>602,9836=>602,9837=>602,9838=>602, +9839=>602,10181=>602,10182=>602,10208=>602,10216=>602,10217=>602,10731=>602,10746=>602,10747=>602,10799=>602, +11026=>602,11027=>602,11028=>602,11029=>602,11030=>602,11031=>602,11032=>602,11033=>602,11034=>602,11364=>602, +11374=>602,11375=>602,11381=>602,11382=>602,11383=>602,11385=>602,11386=>602,11388=>602,11389=>602,11800=>602, +11810=>602,11811=>602,11812=>602,11813=>602,11822=>602,42760=>602,42761=>602,42762=>602,42763=>602,42764=>602, +42765=>602,42766=>602,42767=>602,42768=>602,42769=>602,42770=>602,42771=>602,42772=>602,42773=>602,42774=>602, +42779=>602,42780=>602,42781=>602,42782=>602,42783=>602,42790=>602,42791=>602,42889=>602,42890=>602,42891=>602, +42892=>602,63173=>602,64257=>602,64258=>602,65529=>602,65530=>602,65531=>602,65532=>602,65533=>602); +$enc=''; +$diff=''; +$file='dejavusansmonoi.z'; +$ctg='dejavusansmonoi.ctg.z'; +$originalsize=229284; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonoi.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonoi.z new file mode 100644 index 0000000..fab337c Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavusansmonoi.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserif.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserif.ctg.z new file mode 100644 index 0000000..6e01b83 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserif.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserif.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserif.php new file mode 100644 index 0000000..4e6280d --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserif.php @@ -0,0 +1,313 @@ +<?php +$type='TrueTypeUnicode'; +$name='DejaVuSerif'; +$desc=array('Ascent'=>928,'Descent'=>-236,'CapHeight'=>6,'Flags'=>32,'FontBBox'=>'[-770 -347 1679 1242]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>600); +$up=-63; +$ut=44; +$dw=600; +$cw=array( +0=>600,32=>318,33=>402,34=>460,35=>838,36=>636,37=>950,38=>890,39=>275,40=>390, +41=>390,42=>500,43=>838,44=>318,45=>338,46=>318,47=>337,48=>636,49=>636,50=>636, +51=>636,52=>636,53=>636,54=>636,55=>636,56=>636,57=>636,58=>337,59=>337,60=>838, +61=>838,62=>838,63=>536,64=>1000,65=>722,66=>735,67=>765,68=>802,69=>730,70=>694, +71=>799,72=>872,73=>395,74=>401,75=>747,76=>664,77=>1024,78=>875,79=>820,80=>673, +81=>820,82=>753,83=>685,84=>667,85=>843,86=>722,87=>1028,88=>712,89=>660,90=>695, +91=>390,92=>337,93=>390,94=>838,95=>500,96=>500,97=>596,98=>640,99=>560,100=>640, +101=>592,102=>370,103=>640,104=>644,105=>320,106=>310,107=>606,108=>320,109=>948,110=>644, +111=>602,112=>640,113=>640,114=>478,115=>513,116=>402,117=>644,118=>565,119=>856,120=>564, +121=>565,122=>527,123=>636,124=>337,125=>636,126=>838,8364=>636,8218=>318,402=>370,8222=>518, +8230=>1000,8224=>500,8225=>500,710=>500,8240=>1342,352=>685,8249=>400,338=>1137,381=>695,8216=>318, +8217=>318,8220=>511,8221=>511,8226=>590,8211=>500,8212=>1000,732=>500,8482=>1000,353=>513,8250=>400, +339=>989,382=>527,376=>660,160=>318,161=>402,162=>636,163=>636,164=>636,165=>636,166=>337, +167=>500,168=>500,169=>1000,170=>475,171=>612,172=>838,173=>338,174=>1000,175=>500,176=>500, +177=>838,178=>401,179=>401,180=>500,181=>650,182=>636,183=>318,184=>500,185=>401,186=>470, +187=>612,188=>969,189=>969,190=>969,191=>536,192=>722,193=>722,194=>722,195=>722,196=>722, +197=>722,198=>1001,199=>765,200=>730,201=>730,202=>730,203=>730,204=>395,205=>395,206=>395, +207=>395,208=>807,209=>875,210=>820,211=>820,212=>820,213=>820,214=>820,215=>838,216=>820, +217=>843,218=>843,219=>843,220=>843,221=>660,222=>676,223=>668,224=>596,225=>596,226=>596, +227=>596,228=>596,229=>596,230=>940,231=>560,232=>592,233=>592,234=>592,235=>592,236=>320, +237=>320,238=>320,239=>320,240=>602,241=>644,242=>602,243=>602,244=>602,245=>602,246=>602, +247=>838,248=>602,249=>644,250=>644,251=>644,252=>644,253=>565,254=>640,255=>565,256=>722, +257=>596,258=>722,259=>596,260=>722,261=>596,262=>765,263=>560,264=>765,265=>560,266=>765, +267=>560,268=>765,269=>560,270=>802,271=>640,272=>807,273=>640,274=>730,275=>592,276=>730, +277=>592,278=>730,279=>592,280=>730,281=>592,282=>730,283=>592,284=>799,285=>640,286=>799, +287=>640,288=>799,289=>640,290=>799,291=>640,292=>872,293=>644,294=>872,295=>644,296=>395, +297=>320,298=>395,299=>320,300=>395,301=>320,302=>395,303=>320,304=>395,305=>320,306=>801, +307=>533,308=>401,309=>310,310=>747,311=>606,312=>606,313=>664,314=>320,315=>664,316=>320, +317=>664,318=>320,319=>664,320=>320,321=>669,322=>324,323=>875,324=>644,325=>875,326=>644, +327=>875,328=>644,329=>866,330=>843,331=>644,332=>820,333=>602,334=>820,335=>602,336=>820, +337=>602,340=>753,341=>478,342=>753,343=>478,344=>753,345=>478,346=>685,347=>513,348=>685, +349=>513,350=>685,351=>513,354=>667,355=>402,356=>667,357=>402,358=>667,359=>402,360=>843, +361=>644,362=>843,363=>644,364=>843,365=>644,366=>843,367=>644,368=>843,369=>644,370=>843, +371=>644,372=>1028,373=>856,374=>660,375=>565,377=>695,378=>527,379=>695,380=>527,383=>370, +384=>640,385=>735,386=>735,387=>640,388=>735,389=>640,390=>765,391=>765,392=>560,393=>807, +394=>802,395=>735,396=>640,397=>602,398=>730,399=>820,400=>623,401=>694,403=>799,404=>712, +405=>932,406=>395,407=>395,408=>747,409=>606,410=>320,411=>634,412=>948,413=>875,414=>644, +415=>820,416=>820,417=>602,418=>1040,419=>807,420=>673,421=>640,422=>753,423=>685,424=>513, +425=>707,426=>324,427=>402,428=>667,429=>402,430=>667,431=>843,432=>644,433=>829,434=>760, +435=>738,436=>663,437=>695,438=>527,439=>564,440=>564,441=>564,443=>636,444=>687,445=>564, +446=>536,448=>295,449=>492,450=>459,451=>295,452=>1497,453=>1329,454=>1167,455=>1065,456=>974, +457=>630,458=>1276,459=>1185,460=>954,461=>722,462=>596,463=>395,464=>320,465=>820,466=>602, +467=>843,468=>644,469=>843,470=>644,471=>843,472=>644,473=>843,474=>644,475=>843,476=>644, +477=>592,478=>722,479=>596,480=>722,481=>596,482=>1001,483=>940,484=>848,485=>640,486=>799, +487=>640,488=>747,489=>606,490=>820,491=>602,492=>820,493=>602,494=>564,495=>564,496=>320, +497=>1497,498=>1329,499=>1167,500=>799,501=>640,502=>1154,504=>875,505=>644,506=>722,507=>596, +508=>1001,509=>940,510=>820,511=>602,512=>722,513=>596,514=>722,515=>596,516=>730,517=>592, +518=>730,519=>592,520=>395,521=>320,522=>395,523=>320,524=>820,525=>602,526=>820,527=>602, +528=>753,529=>478,530=>753,531=>478,532=>843,533=>644,534=>843,535=>644,536=>685,537=>513, +538=>667,539=>402,540=>627,541=>521,542=>872,543=>644,544=>843,545=>814,548=>695,549=>527, +550=>722,551=>596,552=>730,553=>592,554=>820,555=>602,556=>820,557=>602,558=>820,559=>602, +560=>820,561=>602,562=>660,563=>565,564=>500,565=>832,566=>494,567=>310,568=>960,569=>960, +570=>722,571=>765,572=>560,573=>664,574=>667,575=>513,576=>527,577=>583,578=>464,581=>722, +592=>596,593=>640,594=>640,595=>640,596=>560,597=>560,598=>647,599=>683,600=>592,601=>592, +602=>843,603=>518,604=>509,605=>773,606=>613,607=>315,608=>683,609=>640,610=>544,611=>712, +612=>564,613=>644,614=>644,615=>644,616=>320,617=>392,618=>320,619=>380,620=>454,621=>363, +622=>704,623=>948,624=>948,625=>948,626=>644,627=>694,628=>646,629=>602,630=>790,631=>647, +632=>602,633=>501,634=>501,635=>551,636=>478,637=>478,638=>453,639=>453,640=>594,641=>594, +642=>513,643=>271,644=>370,645=>487,646=>324,647=>402,648=>402,649=>644,650=>620,651=>608, +652=>565,653=>856,654=>565,655=>655,656=>597,657=>560,658=>564,659=>560,660=>536,661=>536, +662=>536,663=>513,664=>820,665=>563,666=>613,667=>654,668=>667,669=>366,670=>606,671=>646, +672=>683,673=>536,674=>536,675=>996,676=>1033,677=>998,678=>809,679=>598,680=>782,681=>894, +682=>646,683=>676,684=>598,685=>443,686=>781,687=>767,688=>433,689=>430,690=>264,691=>347, +692=>347,693=>430,694=>392,695=>585,696=>423,697=>278,699=>318,700=>318,701=>318,702=>307, +703=>307,704=>280,705=>281,711=>500,712=>275,713=>500,716=>275,720=>337,721=>337,722=>307, +723=>307,726=>329,728=>500,729=>500,730=>500,731=>500,733=>500,734=>417,736=>447,737=>243, +738=>337,739=>424,740=>281,741=>493,742=>493,743=>493,744=>493,745=>493,750=>484,768=>0, +769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0, +779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0, +789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0, +799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0, +809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0, +819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0, +829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>740,881=>531,884=>278, +885=>278,890=>500,891=>560,892=>560,893=>560,894=>337,900=>500,901=>500,902=>722,903=>318, +904=>900,905=>1039,906=>562,908=>835,910=>897,911=>853,912=>392,913=>722,914=>735,915=>694, +916=>722,917=>730,918=>695,919=>872,920=>820,921=>395,922=>747,923=>722,924=>1024,925=>875, +926=>704,927=>820,928=>872,929=>673,931=>707,932=>667,933=>660,934=>820,935=>712,936=>877, +937=>829,938=>395,939=>660,940=>675,941=>518,942=>599,943=>392,944=>608,945=>675,946=>578, +947=>598,948=>602,949=>518,950=>542,951=>599,952=>602,953=>392,954=>625,955=>634,956=>650, +957=>608,958=>551,959=>602,960=>657,961=>588,962=>560,963=>683,964=>553,965=>608,966=>700, +967=>606,968=>784,969=>815,970=>392,971=>608,972=>602,973=>608,974=>815,976=>583,977=>715, +978=>687,979=>874,980=>687,981=>682,982=>815,983=>624,984=>820,985=>602,986=>765,987=>560, +988=>694,989=>463,990=>590,991=>660,992=>782,993=>577,1008=>624,1009=>588,1010=>560,1011=>310, +1012=>820,1013=>560,1014=>560,1015=>676,1016=>640,1017=>765,1018=>1024,1019=>708,1020=>588,1021=>765, +1022=>765,1023=>765,1024=>730,1025=>730,1026=>799,1027=>662,1028=>765,1029=>685,1030=>395,1031=>395, +1032=>401,1033=>1084,1034=>1118,1035=>872,1036=>774,1037=>872,1038=>723,1039=>872,1040=>757,1041=>735, +1042=>735,1043=>662,1044=>813,1045=>730,1046=>1124,1047=>623,1048=>872,1049=>872,1050=>774,1051=>834, +1052=>1024,1053=>872,1054=>820,1055=>872,1056=>673,1057=>765,1058=>667,1059=>723,1060=>830,1061=>712, +1062=>872,1063=>773,1064=>1141,1065=>1141,1066=>794,1067=>984,1068=>674,1069=>765,1070=>1193,1071=>808, +1072=>596,1073=>602,1074=>563,1075=>524,1076=>616,1077=>592,1078=>920,1079=>545,1080=>667,1081=>667, +1082=>625,1083=>635,1084=>778,1085=>667,1086=>602,1087=>667,1088=>640,1089=>560,1090=>553,1091=>588, +1092=>783,1093=>564,1094=>643,1095=>661,1096=>930,1097=>930,1098=>636,1099=>796,1100=>544,1101=>560, +1102=>871,1103=>631,1104=>592,1105=>592,1106=>624,1107=>524,1108=>560,1109=>513,1110=>320,1111=>320, +1112=>310,1113=>843,1114=>860,1115=>644,1116=>625,1117=>667,1118=>588,1119=>656,1122=>762,1123=>603, +1124=>1129,1125=>834,1130=>1124,1131=>920,1136=>944,1137=>902,1138=>820,1139=>552,1140=>859,1141=>678, +1164=>707,1165=>544,1168=>672,1169=>529,1170=>662,1171=>523,1172=>728,1173=>614,1174=>1124,1175=>920, +1176=>636,1177=>537,1178=>774,1179=>606,1182=>774,1183=>625,1184=>891,1185=>717,1186=>872,1187=>641, +1188=>1139,1189=>852,1190=>1205,1191=>941,1194=>765,1195=>560,1196=>667,1197=>553,1198=>660,1199=>565, +1200=>660,1201=>565,1202=>712,1203=>564,1204=>952,1205=>732,1206=>749,1207=>690,1210=>749,1211=>644, +1216=>395,1217=>1124,1218=>920,1219=>747,1220=>606,1223=>872,1224=>667,1227=>749,1228=>667,1231=>320, +1232=>757,1233=>596,1234=>757,1235=>596,1236=>1001,1237=>940,1238=>730,1239=>592,1240=>820,1241=>592, +1242=>820,1243=>592,1244=>1124,1245=>920,1246=>623,1247=>545,1248=>564,1249=>564,1250=>872,1251=>667, +1252=>872,1253=>667,1254=>820,1255=>602,1256=>820,1257=>602,1258=>820,1259=>602,1260=>765,1261=>560, +1262=>723,1263=>588,1264=>723,1265=>588,1266=>723,1267=>588,1268=>773,1269=>661,1270=>662,1271=>524, +1272=>984,1273=>796,1296=>623,1297=>545,1298=>834,1299=>635,1300=>1198,1301=>919,1306=>820,1307=>640, +1308=>1028,1309=>856,4256=>723,4257=>850,4258=>828,4259=>859,4260=>733,4261=>981,4262=>916,4263=>1101, +4264=>566,4265=>750,4266=>962,4267=>941,4268=>743,4269=>1075,4270=>896,4271=>829,4272=>1040,4273=>733, +4274=>669,4275=>1015,4276=>937,4277=>1020,4278=>731,4279=>733,4280=>732,4281=>733,4282=>879,4283=>937, +4284=>714,4285=>755,4286=>733,4287=>958,4288=>1000,4289=>702,4290=>864,4291=>734,4292=>837,4293=>951, +4304=>541,4305=>571,4306=>589,4307=>833,4308=>561,4309=>557,4310=>618,4311=>861,4312=>560,4313=>546, +4314=>1066,4315=>586,4316=>586,4317=>825,4318=>570,4319=>581,4320=>824,4321=>607,4322=>748,4323=>698, +4324=>815,4325=>585,4326=>858,4327=>568,4328=>594,4329=>586,4330=>675,4331=>587,4332=>582,4333=>576, +4334=>612,4335=>683,4336=>572,4337=>603,4338=>571,4339=>572,4340=>570,4341=>649,4342=>886,4343=>626, +4344=>582,4345=>619,4346=>571,4347=>437,4348=>354,7426=>940,7432=>509,7433=>320,7444=>989,7446=>602, +7447=>602,7453=>737,7454=>948,7455=>948,7468=>455,7469=>630,7470=>463,7472=>505,7473=>459,7474=>459, +7475=>503,7476=>549,7477=>249,7478=>252,7479=>470,7480=>418,7481=>645,7482=>551,7483=>551,7484=>516, +7486=>424,7487=>474,7488=>420,7489=>531,7490=>647,7491=>386,7492=>386,7493=>400,7494=>618,7495=>400, +7496=>400,7497=>387,7498=>387,7499=>340,7500=>340,7501=>400,7502=>175,7503=>365,7504=>613,7505=>399, +7506=>385,7507=>346,7508=>385,7509=>385,7510=>400,7511=>247,7512=>399,7513=>464,7514=>613,7515=>373, +7522=>201,7523=>347,7524=>399,7525=>373,7543=>640,7544=>549,7547=>372,7557=>320,7579=>400,7580=>346, +7581=>346,7582=>385,7583=>340,7584=>222,7585=>229,7586=>400,7587=>399,7588=>234,7589=>244,7590=>234, +7591=>234,7592=>230,7593=>175,7594=>175,7595=>367,7596=>613,7597=>613,7598=>407,7599=>404,7600=>399, +7601=>385,7602=>385,7603=>328,7604=>211,7605=>247,7606=>399,7607=>389,7609=>376,7610=>373,7611=>331, +7612=>331,7613=>331,7614=>364,7615=>385,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0, +7680=>722,7681=>596,7682=>735,7683=>640,7684=>735,7685=>640,7686=>735,7687=>640,7688=>765,7689=>560, +7690=>802,7691=>640,7692=>802,7693=>640,7694=>802,7695=>640,7696=>802,7697=>640,7698=>802,7699=>640, +7700=>730,7701=>592,7702=>730,7703=>592,7704=>730,7705=>592,7706=>730,7707=>592,7708=>730,7709=>592, +7710=>694,7711=>370,7712=>799,7713=>640,7714=>872,7715=>644,7716=>872,7717=>644,7718=>872,7719=>644, +7720=>872,7721=>644,7722=>872,7723=>644,7724=>395,7725=>320,7728=>747,7729=>606,7730=>747,7731=>606, +7732=>747,7733=>606,7734=>664,7735=>320,7736=>664,7737=>320,7738=>664,7739=>320,7740=>664,7741=>320, +7742=>1024,7743=>948,7744=>1024,7745=>948,7746=>1024,7747=>948,7748=>875,7749=>644,7750=>875,7751=>644, +7752=>875,7753=>644,7754=>875,7755=>644,7756=>820,7757=>602,7760=>820,7761=>602,7762=>820,7763=>602, +7764=>673,7765=>640,7766=>673,7767=>640,7768=>753,7769=>478,7770=>753,7771=>478,7772=>753,7773=>478, +7774=>753,7775=>478,7776=>685,7777=>513,7778=>685,7779=>513,7784=>685,7785=>513,7786=>667,7787=>402, +7788=>667,7789=>402,7790=>667,7791=>402,7792=>667,7793=>402,7794=>843,7795=>644,7796=>843,7797=>644, +7798=>843,7799=>644,7800=>843,7801=>644,7802=>843,7803=>644,7804=>722,7805=>565,7806=>722,7807=>565, +7808=>1028,7809=>856,7810=>1028,7811=>856,7812=>1028,7813=>856,7814=>1028,7815=>856,7816=>1028,7817=>856, +7818=>712,7819=>564,7820=>712,7821=>564,7822=>660,7823=>565,7824=>695,7825=>527,7826=>695,7827=>527, +7828=>695,7829=>527,7830=>644,7831=>402,7832=>856,7833=>565,7834=>903,7835=>370,7838=>829,7839=>602, +7840=>722,7841=>596,7842=>722,7843=>596,7852=>722,7853=>596,7854=>722,7855=>596,7856=>722,7857=>596, +7858=>722,7859=>596,7860=>722,7861=>596,7862=>722,7863=>596,7864=>730,7865=>592,7866=>730,7867=>592, +7868=>730,7869=>592,7878=>730,7879=>592,7880=>395,7881=>320,7882=>395,7883=>320,7884=>820,7885=>602, +7886=>820,7887=>602,7896=>820,7897=>602,7908=>843,7909=>644,7910=>843,7911=>644,7922=>660,7923=>565, +7924=>660,7925=>565,7926=>660,7927=>565,7928=>660,7929=>565,7936=>675,7937=>675,7938=>675,7939=>675, +7940=>675,7941=>675,7942=>675,7943=>675,7944=>722,7945=>722,7946=>869,7947=>869,7948=>734,7949=>763, +7950=>722,7951=>722,7952=>537,7953=>537,7954=>537,7955=>537,7956=>537,7957=>537,7960=>853,7961=>841, +7962=>1067,7963=>1077,7964=>1008,7965=>1035,7968=>599,7969=>599,7970=>599,7971=>599,7972=>599,7973=>599, +7974=>599,7975=>599,7976=>998,7977=>992,7978=>1212,7979=>1224,7980=>1159,7981=>1183,7982=>1098,7983=>1095, +7984=>392,7985=>392,7986=>392,7987=>392,7988=>392,7989=>392,7990=>392,7991=>392,7992=>521,7993=>512, +7994=>735,7995=>738,7996=>679,7997=>706,7998=>624,7999=>615,8000=>602,8001=>602,8002=>602,8003=>602, +8004=>602,8005=>602,8008=>820,8009=>859,8010=>1120,8011=>1127,8012=>937,8013=>964,8016=>608,8017=>608, +8018=>608,8019=>608,8020=>608,8021=>608,8022=>608,8023=>608,8025=>851,8027=>1079,8029=>1044,8031=>953, +8032=>815,8033=>815,8034=>815,8035=>815,8036=>815,8037=>815,8038=>815,8039=>815,8040=>829,8041=>870, +8042=>1131,8043=>1137,8044=>946,8045=>976,8046=>938,8047=>970,8048=>675,8049=>675,8050=>537,8051=>537, +8052=>599,8053=>599,8054=>392,8055=>392,8056=>602,8057=>602,8058=>608,8059=>608,8060=>815,8061=>815, +8064=>675,8065=>675,8066=>675,8067=>675,8068=>675,8069=>675,8070=>675,8071=>675,8072=>722,8073=>722, +8074=>869,8075=>869,8076=>734,8077=>763,8078=>722,8079=>722,8080=>599,8081=>599,8082=>599,8083=>599, +8084=>599,8085=>599,8086=>599,8087=>599,8088=>998,8089=>992,8090=>1212,8091=>1224,8092=>1159,8093=>1183, +8094=>1098,8095=>1095,8096=>815,8097=>815,8098=>815,8099=>815,8100=>815,8101=>815,8102=>815,8103=>815, +8104=>829,8105=>870,8106=>1131,8107=>1137,8108=>946,8109=>976,8110=>938,8111=>970,8112=>675,8113=>675, +8114=>675,8115=>675,8116=>675,8118=>675,8119=>675,8120=>722,8121=>722,8122=>722,8123=>722,8124=>722, +8125=>500,8126=>500,8127=>500,8128=>500,8129=>500,8130=>599,8131=>599,8132=>599,8134=>599,8135=>599, +8136=>912,8137=>900,8138=>1063,8139=>1039,8140=>872,8141=>500,8142=>500,8143=>500,8144=>392,8145=>392, +8146=>392,8147=>392,8150=>392,8151=>392,8152=>395,8153=>395,8154=>588,8155=>562,8157=>500,8158=>500, +8159=>500,8160=>608,8161=>608,8162=>608,8163=>608,8164=>588,8165=>588,8166=>608,8167=>608,8168=>660, +8169=>660,8170=>921,8171=>897,8172=>790,8173=>500,8174=>500,8175=>500,8178=>815,8179=>815,8180=>815, +8182=>815,8183=>815,8184=>961,8185=>835,8186=>984,8187=>853,8188=>829,8189=>500,8190=>500,8192=>500, +8193=>1000,8194=>500,8195=>1000,8196=>330,8197=>250,8198=>167,8199=>636,8200=>318,8201=>200,8202=>100, +8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>338,8209=>338,8210=>636,8213=>1000,8214=>500, +8215=>500,8219=>318,8223=>511,8227=>590,8228=>334,8229=>667,8234=>0,8235=>0,8236=>0,8237=>0, +8238=>0,8239=>200,8241=>1734,8242=>227,8243=>374,8244=>520,8245=>227,8246=>374,8247=>520,8248=>339, +8252=>527,8253=>536,8254=>500,8258=>1000,8260=>167,8261=>390,8262=>390,8263=>976,8264=>753,8265=>753, +8267=>636,8268=>500,8269=>500,8270=>500,8271=>337,8273=>500,8274=>450,8275=>1000,8279=>663,8287=>222, +8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0, +8303=>0,8304=>401,8305=>201,8308=>401,8309=>401,8310=>401,8311=>401,8312=>401,8313=>401,8314=>528, +8315=>528,8316=>528,8317=>246,8318=>246,8319=>433,8320=>401,8321=>401,8322=>401,8323=>401,8324=>401, +8325=>401,8326=>401,8327=>401,8328=>401,8329=>401,8330=>528,8331=>528,8332=>528,8333=>246,8334=>246, +8336=>386,8337=>387,8338=>385,8339=>424,8340=>387,8358=>660,8367=>1057,8369=>706,8372=>780,8373=>636, +8450=>796,8451=>1119,8457=>1047,8461=>945,8462=>644,8463=>644,8469=>914,8470=>946,8473=>752,8474=>871, +8477=>831,8484=>730,8486=>829,8487=>829,8490=>747,8491=>722,8508=>732,8509=>660,8510=>710,8511=>944, +8512=>714,8513=>775,8514=>557,8515=>557,8516=>611,8517=>867,8518=>699,8519=>636,8520=>380,8521=>362, +8523=>890,8531=>969,8532=>969,8533=>969,8534=>969,8535=>969,8536=>969,8537=>969,8538=>969,8539=>969, +8540=>969,8541=>969,8542=>969,8543=>568,8544=>395,8545=>590,8546=>786,8547=>966,8548=>722,8549=>981, +8550=>1176,8551=>1372,8552=>932,8553=>712,8554=>932,8555=>1127,8556=>664,8557=>765,8558=>802,8559=>1024, +8560=>320,8561=>640,8562=>959,8563=>885,8564=>565,8565=>885,8566=>1205,8567=>1524,8568=>884,8569=>564, +8570=>884,8571=>1204,8572=>320,8573=>560,8574=>640,8575=>948,8576=>1206,8577=>802,8578=>1206,8579=>765, +8580=>560,8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838,8598=>838,8599=>838,8600=>838, +8601=>838,8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838,8608=>838,8609=>838,8610=>838, +8611=>838,8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838,8618=>838,8619=>838,8620=>838, +8621=>838,8622=>838,8623=>838,8624=>838,8625=>838,8626=>838,8627=>838,8628=>838,8629=>838,8630=>838, +8631=>838,8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838,8638=>838,8639=>838,8640=>838, +8641=>838,8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838,8648=>838,8649=>838,8650=>838, +8651=>838,8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838,8658=>838,8659=>838,8660=>838, +8661=>838,8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838,8668=>838,8669=>838,8670=>838, +8671=>838,8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838,8678=>838,8679=>838,8680=>838, +8681=>838,8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838,8688=>838,8689=>838,8690=>838, +8691=>838,8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838,8698=>838,8699=>838,8700=>838, +8701=>838,8702=>838,8703=>838,8704=>604,8706=>517,8707=>542,8708=>542,8710=>698,8711=>698,8712=>740, +8713=>740,8715=>740,8716=>740,8719=>796,8720=>796,8721=>714,8722=>838,8723=>838,8724=>838,8725=>337, +8727=>680,8728=>490,8729=>490,8730=>637,8731=>637,8732=>637,8733=>677,8734=>833,8735=>838,8736=>838, +8739=>291,8740=>479,8741=>462,8742=>634,8743=>732,8744=>732,8745=>838,8746=>838,8747=>521,8748=>852, +8749=>1182,8760=>838,8761=>838,8762=>838,8763=>838,8764=>838,8765=>838,8770=>838,8771=>838,8776=>838, +8784=>838,8785=>838,8786=>838,8787=>838,8788=>1033,8789=>1033,8800=>838,8801=>838,8804=>838,8805=>838, +8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838,8844=>838,8845=>838,8846=>838,8847=>846, +8848=>846,8849=>846,8850=>846,8851=>838,8852=>838,8853=>838,8854=>838,8855=>838,8856=>838,8857=>838, +8858=>838,8859=>838,8860=>838,8861=>838,8862=>838,8863=>838,8864=>838,8865=>838,8866=>860,8867=>860, +8868=>940,8869=>940,8870=>567,8871=>567,8872=>860,8873=>860,8874=>860,8875=>1031,8876=>860,8877=>860, +8878=>860,8879=>1031,8901=>342,8962=>764,8968=>390,8969=>390,8970=>390,8971=>390,8976=>838,8977=>513, +8984=>1000,8985=>838,8992=>521,8993=>521,8997=>1000,9000=>1443,9085=>919,9134=>521,9167=>945,9251=>764, +9472=>602,9473=>602,9474=>602,9475=>602,9476=>602,9477=>602,9478=>602,9479=>602,9480=>602,9481=>602, +9482=>602,9483=>602,9484=>602,9485=>602,9486=>602,9487=>602,9488=>602,9489=>602,9490=>602,9491=>602, +9492=>602,9493=>602,9494=>602,9495=>602,9496=>602,9497=>602,9498=>602,9499=>602,9500=>602,9501=>602, +9502=>602,9503=>602,9504=>602,9505=>602,9506=>602,9507=>602,9508=>602,9509=>602,9510=>602,9511=>602, +9512=>602,9513=>602,9514=>602,9515=>602,9516=>602,9517=>602,9518=>602,9519=>602,9520=>602,9521=>602, +9522=>602,9523=>602,9524=>602,9525=>602,9526=>602,9527=>602,9528=>602,9529=>602,9530=>602,9531=>602, +9532=>602,9533=>602,9534=>602,9535=>602,9536=>602,9537=>602,9538=>602,9539=>602,9540=>602,9541=>602, +9542=>602,9543=>602,9544=>602,9545=>602,9546=>602,9547=>602,9548=>602,9549=>602,9550=>602,9551=>602, +9552=>602,9553=>602,9554=>602,9555=>602,9556=>602,9557=>602,9558=>602,9559=>602,9560=>602,9561=>602, +9562=>602,9563=>602,9564=>602,9565=>602,9566=>602,9567=>602,9568=>602,9569=>602,9570=>602,9571=>602, +9572=>602,9573=>602,9574=>602,9575=>602,9576=>602,9577=>602,9578=>602,9579=>602,9580=>602,9581=>602, +9582=>602,9583=>602,9584=>602,9585=>602,9586=>602,9587=>602,9588=>602,9589=>602,9590=>602,9591=>602, +9592=>602,9593=>602,9594=>602,9595=>602,9596=>602,9597=>602,9598=>602,9599=>602,9600=>769,9601=>769, +9602=>769,9603=>769,9604=>769,9605=>769,9606=>769,9607=>769,9608=>769,9609=>769,9610=>769,9611=>769, +9612=>769,9613=>769,9614=>769,9615=>769,9616=>769,9617=>769,9618=>769,9619=>769,9620=>769,9621=>769, +9622=>769,9623=>769,9624=>769,9625=>769,9626=>769,9627=>769,9628=>769,9629=>769,9630=>769,9631=>769, +9632=>945,9633=>945,9634=>945,9635=>945,9636=>945,9637=>945,9638=>945,9639=>945,9640=>945,9641=>945, +9642=>678,9643=>678,9644=>945,9645=>945,9646=>550,9647=>550,9648=>769,9649=>769,9650=>769,9651=>769, +9652=>502,9653=>502,9654=>769,9655=>769,9656=>502,9657=>502,9658=>769,9659=>769,9660=>769,9661=>769, +9662=>502,9663=>502,9664=>769,9665=>769,9666=>502,9667=>502,9668=>769,9669=>769,9670=>769,9671=>769, +9672=>769,9673=>873,9674=>494,9675=>873,9676=>873,9677=>873,9678=>873,9679=>873,9680=>873,9681=>873, +9682=>873,9683=>873,9684=>873,9685=>873,9686=>527,9687=>527,9688=>791,9689=>970,9690=>970,9691=>970, +9692=>387,9693=>387,9694=>387,9695=>387,9696=>873,9697=>873,9698=>769,9699=>769,9700=>769,9701=>769, +9702=>590,9703=>945,9704=>945,9705=>945,9706=>945,9707=>945,9708=>769,9709=>769,9710=>769,9711=>1119, +9712=>945,9713=>945,9714=>945,9715=>945,9716=>873,9717=>873,9718=>873,9719=>873,9720=>769,9721=>769, +9722=>769,9723=>830,9724=>830,9725=>732,9726=>732,9727=>769,9728=>896,9784=>896,9785=>896,9786=>896, +9787=>896,9788=>896,9791=>614,9792=>731,9793=>731,9794=>896,9795=>896,9796=>896,9797=>896,9798=>896, +9799=>896,9824=>896,9825=>896,9826=>896,9827=>896,9828=>896,9829=>896,9830=>896,9831=>896,9833=>472, +9834=>638,9835=>896,9836=>896,9837=>472,9838=>357,9839=>484,10145=>838,10181=>390,10182=>390,10208=>494, +10216=>390,10217=>390,10224=>838,10225=>838,10226=>838,10227=>838,10228=>1033,10229=>1434,10230=>1434,10231=>1434, +10232=>1434,10233=>1434,10234=>1434,10235=>1434,10236=>1434,10237=>1434,10238=>1434,10239=>1434,10240=>732,10241=>732, +10242=>732,10243=>732,10244=>732,10245=>732,10246=>732,10247=>732,10248=>732,10249=>732,10250=>732,10251=>732, +10252=>732,10253=>732,10254=>732,10255=>732,10256=>732,10257=>732,10258=>732,10259=>732,10260=>732,10261=>732, +10262=>732,10263=>732,10264=>732,10265=>732,10266=>732,10267=>732,10268=>732,10269=>732,10270=>732,10271=>732, +10272=>732,10273=>732,10274=>732,10275=>732,10276=>732,10277=>732,10278=>732,10279=>732,10280=>732,10281=>732, +10282=>732,10283=>732,10284=>732,10285=>732,10286=>732,10287=>732,10288=>732,10289=>732,10290=>732,10291=>732, +10292=>732,10293=>732,10294=>732,10295=>732,10296=>732,10297=>732,10298=>732,10299=>732,10300=>732,10301=>732, +10302=>732,10303=>732,10304=>732,10305=>732,10306=>732,10307=>732,10308=>732,10309=>732,10310=>732,10311=>732, +10312=>732,10313=>732,10314=>732,10315=>732,10316=>732,10317=>732,10318=>732,10319=>732,10320=>732,10321=>732, +10322=>732,10323=>732,10324=>732,10325=>732,10326=>732,10327=>732,10328=>732,10329=>732,10330=>732,10331=>732, +10332=>732,10333=>732,10334=>732,10335=>732,10336=>732,10337=>732,10338=>732,10339=>732,10340=>732,10341=>732, +10342=>732,10343=>732,10344=>732,10345=>732,10346=>732,10347=>732,10348=>732,10349=>732,10350=>732,10351=>732, +10352=>732,10353=>732,10354=>732,10355=>732,10356=>732,10357=>732,10358=>732,10359=>732,10360=>732,10361=>732, +10362=>732,10363=>732,10364=>732,10365=>732,10366=>732,10367=>732,10368=>732,10369=>732,10370=>732,10371=>732, +10372=>732,10373=>732,10374=>732,10375=>732,10376=>732,10377=>732,10378=>732,10379=>732,10380=>732,10381=>732, +10382=>732,10383=>732,10384=>732,10385=>732,10386=>732,10387=>732,10388=>732,10389=>732,10390=>732,10391=>732, +10392=>732,10393=>732,10394=>732,10395=>732,10396=>732,10397=>732,10398=>732,10399=>732,10400=>732,10401=>732, +10402=>732,10403=>732,10404=>732,10405=>732,10406=>732,10407=>732,10408=>732,10409=>732,10410=>732,10411=>732, +10412=>732,10413=>732,10414=>732,10415=>732,10416=>732,10417=>732,10418=>732,10419=>732,10420=>732,10421=>732, +10422=>732,10423=>732,10424=>732,10425=>732,10426=>732,10427=>732,10428=>732,10429=>732,10430=>732,10431=>732, +10432=>732,10433=>732,10434=>732,10435=>732,10436=>732,10437=>732,10438=>732,10439=>732,10440=>732,10441=>732, +10442=>732,10443=>732,10444=>732,10445=>732,10446=>732,10447=>732,10448=>732,10449=>732,10450=>732,10451=>732, +10452=>732,10453=>732,10454=>732,10455=>732,10456=>732,10457=>732,10458=>732,10459=>732,10460=>732,10461=>732, +10462=>732,10463=>732,10464=>732,10465=>732,10466=>732,10467=>732,10468=>732,10469=>732,10470=>732,10471=>732, +10472=>732,10473=>732,10474=>732,10475=>732,10476=>732,10477=>732,10478=>732,10479=>732,10480=>732,10481=>732, +10482=>732,10483=>732,10484=>732,10485=>732,10486=>732,10487=>732,10488=>732,10489=>732,10490=>732,10491=>732, +10492=>732,10493=>732,10494=>732,10495=>732,10496=>838,10497=>838,10498=>838,10499=>838,10500=>838,10501=>838, +10502=>838,10503=>838,10504=>838,10505=>838,10506=>838,10507=>838,10508=>838,10509=>838,10510=>838,10511=>838, +10512=>838,10513=>838,10514=>838,10515=>838,10516=>838,10517=>838,10518=>838,10519=>838,10520=>838,10521=>838, +10522=>838,10523=>838,10524=>838,10525=>838,10526=>838,10527=>838,10528=>838,10529=>838,10530=>838,10531=>838, +10532=>838,10533=>838,10534=>838,10535=>838,10536=>838,10537=>838,10538=>838,10539=>838,10540=>838,10541=>838, +10542=>838,10543=>838,10544=>838,10545=>838,10546=>838,10547=>838,10548=>838,10549=>838,10550=>838,10551=>838, +10552=>838,10553=>838,10554=>838,10555=>838,10556=>838,10557=>838,10558=>838,10559=>838,10560=>838,10561=>838, +10562=>838,10563=>838,10564=>838,10565=>838,10566=>838,10567=>838,10568=>838,10569=>838,10570=>838,10571=>838, +10572=>838,10573=>838,10574=>838,10575=>838,10576=>838,10577=>838,10578=>838,10579=>838,10580=>838,10581=>838, +10582=>838,10583=>838,10584=>838,10585=>838,10586=>838,10587=>838,10588=>838,10589=>838,10590=>838,10591=>838, +10592=>838,10593=>838,10594=>838,10595=>838,10596=>838,10597=>838,10598=>838,10599=>838,10600=>838,10601=>838, +10602=>838,10603=>838,10604=>838,10605=>838,10606=>838,10607=>838,10608=>838,10609=>838,10610=>838,10611=>838, +10612=>838,10613=>838,10614=>838,10615=>981,10616=>838,10617=>838,10618=>984,10619=>838,10620=>838,10621=>838, +10622=>838,10623=>838,10731=>494,10764=>1513,10765=>521,10766=>521,10799=>838,11008=>838,11009=>838,11010=>838, +11011=>838,11012=>838,11013=>838,11014=>838,11015=>838,11016=>838,11017=>838,11018=>838,11019=>838,11020=>838, +11021=>838,11022=>838,11023=>838,11024=>838,11025=>838,11026=>945,11027=>945,11028=>945,11029=>945,11030=>769, +11031=>769,11032=>769,11033=>769,11034=>945,11364=>753,11367=>872,11368=>644,11369=>747,11370=>606,11371=>695, +11372=>527,11374=>1024,11375=>722,11381=>740,11382=>556,11383=>700,11385=>501,11386=>602,11388=>264,11389=>455, +11520=>773,11521=>635,11522=>633,11523=>658,11524=>631,11525=>962,11526=>756,11527=>960,11528=>617,11529=>646, +11530=>962,11531=>632,11532=>646,11533=>962,11534=>645,11535=>866,11536=>961,11537=>645,11538=>645,11539=>959, +11540=>945,11541=>863,11542=>644,11543=>646,11544=>645,11545=>649,11546=>688,11547=>634,11548=>982,11549=>681, +11550=>676,11551=>852,11552=>957,11553=>632,11554=>645,11555=>646,11556=>749,11557=>914,11800=>536,11810=>390, +11811=>390,11812=>390,11813=>390,11822=>536,42564=>685,42565=>513,42566=>395,42567=>392,42576=>1104,42577=>888, +42580=>1193,42581=>871,42582=>1140,42583=>899,42760=>493,42761=>493,42762=>493,42763=>493,42764=>493,42765=>493, +42766=>493,42767=>493,42768=>493,42769=>493,42770=>493,42771=>493,42772=>493,42773=>493,42774=>493,42779=>369, +42780=>369,42781=>253,42782=>253,42783=>253,42891=>402,42892=>275,62464=>654,62465=>665,62466=>714,62467=>947, +62468=>665,62469=>659,62470=>725,62471=>986,62472=>665,62473=>665,62474=>1257,62475=>683,62476=>682,62477=>953, +62478=>665,62479=>682,62480=>999,62481=>746,62482=>798,62483=>748,62484=>944,62485=>681,62486=>936,62487=>680, +62488=>688,62489=>682,62490=>729,62491=>682,62492=>688,62493=>666,62494=>729,62495=>884,62496=>665,62497=>706, +62498=>666,62499=>665,62500=>665,62501=>722,62502=>961,62504=>904,63173=>602,63185=>500,63188=>500,64256=>710, +64257=>667,64258=>667,64259=>1028,64260=>1030,64261=>771,64262=>933,65024=>0,65025=>0,65026=>0,65027=>0, +65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0, +65038=>0,65039=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1025); +$enc=''; +$diff=''; +$file='dejavuserif.z'; +$ctg='dejavuserif.ctg.z'; +$originalsize=328908; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserif.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserif.z new file mode 100644 index 0000000..00235fa Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserif.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifb.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifb.ctg.z new file mode 100644 index 0000000..c1a3ccb Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifb.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifb.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifb.php new file mode 100644 index 0000000..23ea742 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifb.php @@ -0,0 +1,299 @@ +<?php +$type='TrueTypeUnicode'; +$name='DejaVuSerif-Bold'; +$desc=array('Ascent'=>939,'Descent'=>-236,'CapHeight'=>5,'Flags'=>32,'FontBBox'=>'[-836 -389 1796 1235]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>600); +$up=-63; +$ut=44; +$dw=600; +$cw=array( +0=>600,32=>348,33=>439,34=>521,35=>838,36=>696,37=>950,38=>903,39=>306,40=>473, +41=>473,42=>523,43=>838,44=>348,45=>415,46=>348,47=>365,48=>696,49=>696,50=>696, +51=>696,52=>696,53=>696,54=>696,55=>696,56=>696,57=>696,58=>369,59=>369,60=>838, +61=>838,62=>838,63=>586,64=>1000,65=>776,66=>845,67=>796,68=>867,69=>762,70=>710, +71=>854,72=>945,73=>468,74=>473,75=>869,76=>703,77=>1107,78=>914,79=>871,80=>752, +81=>871,82=>831,83=>722,84=>744,85=>872,86=>776,87=>1123,88=>776,89=>714,90=>730, +91=>473,92=>365,93=>473,94=>838,95=>500,96=>500,97=>648,98=>699,99=>609,100=>699, +101=>636,102=>430,103=>699,104=>727,105=>380,106=>362,107=>693,108=>380,109=>1058,110=>727, +111=>667,112=>699,113=>699,114=>527,115=>563,116=>462,117=>727,118=>581,119=>861,120=>596, +121=>581,122=>568,123=>643,124=>364,125=>643,126=>838,8364=>696,8218=>348,402=>430,8222=>575, +8230=>1000,8224=>523,8225=>523,710=>500,8240=>1385,352=>722,8249=>400,338=>1180,381=>730,8216=>348, +8217=>348,8220=>575,8221=>575,8226=>639,8211=>500,8212=>1000,732=>500,8482=>1000,353=>563,8250=>400, +339=>1028,382=>568,376=>714,160=>348,161=>439,162=>696,163=>696,164=>636,165=>696,166=>364, +167=>523,168=>500,169=>1000,170=>487,171=>625,172=>838,173=>415,174=>1000,175=>500,176=>500, +177=>838,178=>438,179=>438,180=>500,181=>732,182=>636,183=>348,184=>500,185=>438,186=>500, +187=>625,188=>1043,189=>1043,190=>1043,191=>586,192=>776,193=>776,194=>776,195=>776,196=>776, +197=>776,198=>1034,199=>796,200=>762,201=>762,202=>762,203=>762,204=>468,205=>468,206=>468, +207=>468,208=>874,209=>914,210=>871,211=>871,212=>871,213=>871,214=>871,215=>838,216=>871, +217=>872,218=>872,219=>872,220=>872,221=>714,222=>757,223=>760,224=>648,225=>648,226=>648, +227=>648,228=>648,229=>648,230=>975,231=>609,232=>636,233=>636,234=>636,235=>636,236=>380, +237=>380,238=>380,239=>380,240=>667,241=>727,242=>667,243=>667,244=>667,245=>667,246=>667, +247=>838,248=>667,249=>727,250=>727,251=>727,252=>727,253=>581,254=>699,255=>581,256=>776, +257=>648,258=>776,259=>648,260=>776,261=>648,262=>796,263=>609,264=>796,265=>609,266=>796, +267=>609,268=>796,269=>609,270=>867,271=>699,272=>874,273=>699,274=>762,275=>636,276=>762, +277=>636,278=>762,279=>636,280=>762,281=>636,282=>762,283=>636,284=>854,285=>699,286=>854, +287=>699,288=>854,289=>699,290=>854,291=>699,292=>945,293=>727,294=>945,295=>727,296=>468, +297=>380,298=>468,299=>380,300=>468,301=>380,302=>468,303=>380,304=>468,305=>380,306=>942, +307=>751,308=>473,309=>362,310=>869,311=>693,312=>693,313=>703,314=>380,315=>703,316=>380, +317=>703,318=>380,319=>703,320=>380,321=>710,322=>385,323=>914,324=>727,325=>914,326=>727, +327=>914,328=>727,329=>1008,330=>872,331=>727,332=>871,333=>667,334=>871,335=>667,336=>871, +337=>667,340=>831,341=>527,342=>831,343=>527,344=>831,345=>527,346=>722,347=>563,348=>722, +349=>563,350=>722,351=>563,354=>744,355=>462,356=>744,357=>462,358=>744,359=>462,360=>872, +361=>727,362=>872,363=>727,364=>872,365=>727,366=>872,367=>727,368=>872,369=>727,370=>872, +371=>727,372=>1123,373=>861,374=>714,375=>581,377=>730,378=>568,379=>730,380=>568,383=>430, +384=>699,385=>845,386=>854,387=>699,388=>854,389=>699,390=>796,391=>796,392=>609,393=>874, +394=>867,395=>854,396=>699,397=>667,398=>762,399=>871,400=>721,401=>710,403=>854,404=>771, +405=>1043,406=>468,407=>468,408=>869,409=>693,410=>380,411=>701,412=>1058,413=>914,414=>727, +415=>871,416=>871,417=>667,418=>1200,419=>943,420=>752,421=>699,422=>831,423=>722,424=>563, +425=>707,426=>331,427=>462,428=>744,429=>462,430=>744,431=>872,432=>727,433=>890,434=>890, +435=>714,436=>708,437=>730,438=>568,439=>657,440=>657,441=>657,443=>696,444=>754,445=>568, +446=>536,448=>295,449=>492,450=>459,451=>295,452=>1597,453=>1435,454=>1267,455=>1176,456=>1065, +457=>742,458=>1387,459=>1276,460=>1089,461=>776,462=>648,463=>468,464=>380,465=>871,466=>667, +467=>872,468=>727,469=>872,470=>727,471=>872,472=>727,473=>872,474=>727,475=>872,476=>727, +477=>636,478=>776,479=>648,480=>776,481=>648,482=>1034,483=>975,484=>896,485=>699,486=>854, +487=>699,488=>869,489=>693,490=>871,491=>667,492=>871,493=>667,494=>657,495=>568,496=>380, +497=>1597,498=>1435,499=>1267,500=>854,501=>699,502=>1221,504=>914,505=>727,506=>776,507=>648, +508=>1034,509=>975,510=>871,511=>667,512=>776,513=>648,514=>776,515=>648,516=>762,517=>636, +518=>762,519=>636,520=>468,521=>380,522=>468,523=>380,524=>871,525=>667,526=>871,527=>667, +528=>831,529=>527,530=>831,531=>527,532=>872,533=>727,534=>872,535=>727,536=>722,537=>563, +538=>744,539=>462,540=>690,541=>607,542=>945,543=>727,544=>872,545=>791,548=>730,549=>568, +550=>776,551=>648,552=>762,553=>636,554=>871,555=>667,556=>871,557=>667,558=>871,559=>667, +560=>871,561=>667,562=>714,563=>581,564=>573,565=>922,566=>564,567=>362,568=>1031,569=>1031, +570=>776,571=>796,572=>609,573=>703,574=>744,575=>563,576=>568,577=>660,578=>547,581=>776, +592=>648,593=>699,594=>699,595=>699,596=>609,597=>609,598=>699,599=>730,600=>636,601=>636, +602=>907,603=>608,604=>562,605=>907,606=>720,607=>387,608=>699,609=>699,610=>626,611=>712, +612=>627,613=>727,614=>727,615=>727,616=>380,617=>380,618=>380,619=>409,620=>514,621=>380, +622=>795,623=>1058,624=>1058,625=>1058,626=>727,627=>727,628=>712,629=>667,630=>1061,631=>749, +632=>667,633=>571,634=>571,635=>571,636=>527,637=>527,638=>452,639=>487,640=>801,641=>801, +642=>563,643=>331,644=>430,645=>540,646=>331,647=>492,648=>462,649=>727,650=>679,651=>694, +652=>641,653=>907,654=>635,655=>727,656=>568,657=>568,658=>568,659=>568,660=>536,661=>536, +662=>536,663=>545,664=>871,665=>695,666=>720,667=>626,668=>732,669=>384,670=>740,671=>646, +672=>699,673=>536,674=>536,675=>1117,676=>1179,677=>1117,678=>911,679=>715,680=>909,681=>1039, +682=>790,683=>795,684=>662,685=>443,686=>613,687=>717,688=>521,689=>519,690=>313,691=>414, +692=>414,693=>480,694=>527,695=>662,696=>485,697=>302,699=>348,700=>348,701=>348,702=>366, +703=>366,704=>313,705=>313,711=>500,712=>282,713=>500,716=>282,720=>369,721=>369,722=>366, +723=>366,726=>392,728=>500,729=>500,730=>500,731=>500,733=>500,734=>417,736=>458,737=>292, +738=>395,739=>475,740=>313,741=>500,742=>500,743=>500,744=>500,745=>500,750=>553,768=>0, +769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0, +779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0, +789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0, +799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0, +809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0, +819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0, +829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>779,881=>576,884=>302, +885=>302,890=>500,891=>609,892=>609,893=>609,894=>369,900=>500,901=>500,902=>776,903=>348, +904=>947,905=>1118,906=>662,908=>887,910=>953,911=>911,912=>484,913=>776,914=>845,915=>710, +916=>776,917=>762,918=>730,919=>945,920=>871,921=>468,922=>869,923=>776,924=>1107,925=>914, +926=>704,927=>871,928=>944,929=>752,931=>707,932=>744,933=>714,934=>871,935=>776,936=>913, +937=>890,938=>468,939=>714,940=>770,941=>608,942=>727,943=>484,944=>694,945=>770,946=>664, +947=>660,948=>667,949=>608,950=>592,951=>727,952=>667,953=>484,954=>750,955=>701,956=>732, +957=>694,958=>592,959=>667,960=>732,961=>665,962=>609,963=>737,964=>673,965=>694,966=>905, +967=>658,968=>941,969=>952,970=>484,971=>694,972=>667,973=>694,974=>952,976=>667,977=>849, +978=>764,979=>969,980=>764,981=>941,982=>952,983=>655,984=>871,985=>667,986=>796,987=>609, +988=>710,989=>527,990=>590,991=>660,992=>796,993=>667,1008=>655,1009=>665,1010=>609,1011=>362, +1012=>871,1013=>609,1014=>609,1015=>757,1016=>699,1017=>796,1018=>1107,1019=>860,1020=>692,1021=>796, +1022=>796,1023=>796,1024=>762,1025=>762,1026=>901,1027=>690,1028=>795,1029=>722,1030=>468,1031=>468, +1032=>473,1033=>1202,1034=>1262,1035=>963,1036=>910,1037=>945,1038=>812,1039=>945,1040=>814,1041=>854, +1042=>845,1043=>690,1044=>889,1045=>762,1046=>1312,1047=>721,1048=>945,1049=>945,1050=>910,1051=>884, +1052=>1107,1053=>945,1054=>871,1055=>944,1056=>752,1057=>796,1058=>744,1059=>812,1060=>949,1061=>776, +1062=>966,1063=>913,1064=>1268,1065=>1293,1066=>957,1067=>1202,1068=>825,1069=>795,1070=>1287,1071=>882, +1072=>648,1073=>667,1074=>695,1075=>613,1076=>667,1077=>636,1078=>1010,1079=>638,1080=>742,1081=>742, +1082=>722,1083=>705,1084=>869,1085=>732,1086=>667,1087=>732,1088=>699,1089=>609,1090=>620,1091=>640, +1092=>902,1093=>596,1094=>739,1095=>732,1096=>1075,1097=>1082,1098=>767,1099=>1002,1100=>679,1101=>609, +1102=>1025,1103=>739,1104=>636,1105=>636,1106=>719,1107=>613,1108=>609,1109=>563,1110=>380,1111=>380, +1112=>362,1113=>988,1114=>1015,1115=>727,1116=>722,1117=>742,1118=>640,1119=>732,1122=>880,1123=>703, +1124=>1195,1125=>963,1130=>1312,1131=>1010,1136=>1096,1137=>1105,1138=>871,1139=>652,1140=>916,1141=>749, +1164=>846,1165=>673,1168=>700,1169=>618,1170=>690,1171=>613,1172=>868,1173=>716,1174=>1312,1175=>1010, +1176=>721,1177=>638,1178=>947,1179=>744,1182=>910,1183=>722,1184=>1041,1185=>827,1186=>966,1187=>739, +1188=>1167,1189=>956,1190=>1345,1191=>1059,1194=>796,1195=>609,1196=>744,1197=>620,1198=>714,1199=>581, +1200=>714,1201=>581,1202=>866,1203=>649,1204=>1022,1205=>807,1206=>928,1207=>739,1210=>910,1211=>727, +1216=>468,1217=>1312,1218=>1010,1219=>869,1220=>693,1223=>945,1224=>732,1227=>913,1228=>732,1231=>380, +1232=>814,1233=>648,1234=>814,1235=>648,1236=>1034,1237=>975,1238=>762,1239=>636,1240=>871,1241=>636, +1242=>871,1243=>636,1244=>1312,1245=>1010,1246=>721,1247=>638,1248=>657,1249=>568,1250=>945,1251=>742, +1252=>945,1253=>742,1254=>871,1255=>667,1256=>871,1257=>667,1258=>871,1259=>667,1260=>795,1261=>609, +1262=>812,1263=>640,1264=>812,1265=>640,1266=>812,1267=>640,1268=>913,1269=>732,1270=>690,1271=>613, +1272=>1202,1273=>1002,1296=>721,1297=>638,1298=>884,1299=>705,1300=>1248,1301=>945,1306=>820,1307=>640, +1308=>1028,1309=>856,4256=>755,4257=>936,4258=>866,4259=>874,4260=>781,4261=>1078,4262=>1014,4263=>1213, +4264=>643,4265=>818,4266=>1051,4267=>1051,4268=>796,4269=>1135,4270=>969,4271=>902,4272=>1109,4273=>792, +4274=>756,4275=>1076,4276=>976,4277=>1066,4278=>811,4279=>833,4280=>821,4281=>833,4282=>908,4283=>1077, +4284=>769,4285=>822,4286=>813,4287=>1111,4288=>1123,4289=>802,4290=>892,4291=>802,4292=>880,4293=>1063, +4304=>594,4305=>625,4306=>643,4307=>887,4308=>615,4309=>611,4310=>667,4311=>915,4312=>613,4313=>600, +4314=>1120,4315=>640,4316=>640,4317=>879,4318=>624,4319=>634,4320=>877,4321=>666,4322=>780,4323=>751, +4324=>869,4325=>639,4326=>912,4327=>622,4328=>647,4329=>640,4330=>729,4331=>641,4332=>630,4333=>629, +4334=>670,4335=>753,4336=>625,4337=>657,4338=>625,4339=>625,4340=>624,4341=>670,4342=>940,4343=>680, +4344=>636,4345=>672,4346=>625,4347=>588,4348=>354,7426=>940,7432=>509,7433=>320,7444=>989,7446=>667, +7447=>667,7453=>737,7454=>948,7455=>948,7468=>489,7469=>651,7470=>532,7472=>546,7473=>480,7474=>480, +7475=>538,7476=>595,7477=>294,7478=>298,7479=>547,7480=>443,7481=>697,7482=>576,7483=>576,7484=>548, +7486=>474,7487=>523,7488=>455,7489=>469,7490=>549,7491=>466,7492=>466,7493=>498,7494=>657,7495=>499, +7496=>498,7497=>444,7498=>444,7499=>412,7500=>412,7501=>498,7502=>300,7503=>523,7504=>729,7505=>473, +7506=>467,7507=>427,7508=>467,7509=>467,7510=>499,7511=>371,7512=>520,7513=>434,7514=>729,7515=>491, +7522=>239,7523=>414,7524=>520,7525=>491,7543=>640,7544=>595,7547=>380,7557=>380,7579=>498,7580=>427, +7581=>427,7582=>467,7583=>412,7584=>383,7585=>373,7586=>498,7587=>522,7588=>300,7589=>307,7590=>300, +7591=>300,7592=>370,7593=>368,7594=>321,7595=>430,7596=>682,7597=>729,7598=>588,7599=>587,7600=>472, +7601=>467,7602=>522,7603=>400,7604=>387,7605=>371,7606=>520,7607=>475,7609=>489,7610=>491,7611=>412, +7612=>527,7613=>412,7614=>452,7615=>467,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0, +7680=>776,7681=>648,7682=>845,7683=>699,7684=>845,7685=>699,7686=>845,7687=>699,7688=>796,7689=>609, +7690=>867,7691=>699,7692=>867,7693=>699,7694=>867,7695=>699,7696=>867,7697=>699,7698=>867,7699=>699, +7700=>762,7701=>636,7702=>762,7703=>636,7704=>762,7705=>636,7706=>762,7707=>636,7708=>762,7709=>636, +7710=>710,7711=>430,7712=>854,7713=>699,7714=>945,7715=>727,7716=>945,7717=>727,7718=>945,7719=>727, +7720=>945,7721=>727,7722=>945,7723=>727,7724=>468,7725=>380,7728=>869,7729=>693,7730=>869,7731=>693, +7732=>869,7733=>693,7734=>703,7735=>380,7736=>703,7737=>380,7738=>703,7739=>380,7740=>703,7741=>380, +7742=>1107,7743=>1058,7744=>1107,7745=>1058,7746=>1107,7747=>1058,7748=>914,7749=>727,7750=>914,7751=>727, +7752=>914,7753=>727,7754=>914,7755=>727,7756=>871,7757=>667,7760=>871,7761=>667,7762=>871,7763=>667, +7764=>752,7765=>699,7766=>752,7767=>699,7768=>831,7769=>527,7770=>831,7771=>527,7772=>831,7773=>527, +7774=>831,7775=>527,7776=>722,7777=>563,7778=>722,7779=>563,7784=>722,7785=>563,7786=>744,7787=>462, +7788=>744,7789=>462,7790=>744,7791=>462,7792=>744,7793=>462,7794=>872,7795=>727,7796=>872,7797=>727, +7798=>872,7799=>727,7800=>872,7801=>727,7802=>872,7803=>727,7804=>776,7805=>581,7806=>776,7807=>581, +7808=>1123,7809=>861,7810=>1123,7811=>861,7812=>1123,7813=>861,7814=>1123,7815=>861,7816=>1123,7817=>861, +7818=>776,7819=>596,7820=>776,7821=>596,7822=>714,7823=>581,7824=>730,7825=>568,7826=>730,7827=>568, +7828=>730,7829=>568,7830=>727,7831=>462,7832=>861,7833=>581,7834=>1014,7835=>430,7838=>947,7839=>667, +7840=>776,7841=>648,7842=>776,7843=>648,7852=>776,7853=>648,7854=>776,7855=>648,7856=>776,7857=>648, +7858=>776,7859=>648,7860=>776,7861=>648,7862=>776,7863=>648,7864=>762,7865=>636,7866=>762,7867=>636, +7868=>762,7869=>636,7878=>762,7879=>636,7880=>468,7881=>380,7882=>468,7883=>380,7884=>871,7885=>667, +7886=>871,7887=>667,7896=>871,7897=>667,7908=>872,7909=>727,7910=>872,7911=>727,7922=>714,7923=>581, +7924=>714,7925=>581,7926=>714,7927=>581,7928=>714,7929=>581,7936=>770,7937=>770,7938=>770,7939=>770, +7940=>770,7941=>770,7942=>770,7943=>770,7944=>776,7945=>776,7946=>978,7947=>978,7948=>832,7949=>849, +7950=>776,7951=>776,7952=>608,7953=>608,7954=>608,7955=>608,7956=>608,7957=>608,7960=>917,7961=>909, +7962=>1169,7963=>1169,7964=>1093,7965=>1120,7968=>727,7969=>727,7970=>727,7971=>727,7972=>727,7973=>727, +7974=>727,7975=>727,7976=>1100,7977=>1094,7978=>1358,7979=>1361,7980=>1279,7981=>1308,7982=>1197,7983=>1194, +7984=>484,7985=>484,7986=>484,7987=>484,7988=>484,7989=>484,7990=>484,7991=>484,7992=>629,7993=>617, +7994=>878,7995=>881,7996=>799,7997=>831,7998=>723,7999=>714,8000=>667,8001=>667,8002=>667,8003=>667, +8004=>667,8005=>667,8008=>900,8009=>935,8010=>1240,8011=>1237,8012=>1035,8013=>1066,8016=>694,8017=>694, +8018=>694,8019=>694,8020=>694,8021=>694,8022=>694,8023=>694,8025=>922,8027=>1186,8029=>1133,8031=>1019, +8032=>952,8033=>952,8034=>952,8035=>952,8036=>952,8037=>952,8038=>952,8039=>952,8040=>931,8041=>963, +8042=>1268,8043=>1274,8044=>1054,8045=>1088,8046=>1023,8047=>1060,8048=>770,8049=>770,8050=>608,8051=>608, +8052=>727,8053=>727,8054=>484,8055=>484,8056=>667,8057=>667,8058=>694,8059=>694,8060=>952,8061=>952, +8064=>770,8065=>770,8066=>770,8067=>770,8068=>770,8069=>770,8070=>770,8071=>770,8072=>776,8073=>776, +8074=>978,8075=>978,8076=>832,8077=>849,8078=>776,8079=>776,8080=>727,8081=>727,8082=>727,8083=>727, +8084=>727,8085=>727,8086=>727,8087=>727,8088=>1100,8089=>1094,8090=>1358,8091=>1361,8092=>1279,8093=>1308, +8094=>1197,8095=>1194,8096=>952,8097=>952,8098=>952,8099=>952,8100=>952,8101=>952,8102=>952,8103=>952, +8104=>931,8105=>963,8106=>1268,8107=>1274,8108=>1054,8109=>1088,8110=>1023,8111=>1060,8112=>770,8113=>770, +8114=>770,8115=>770,8116=>770,8118=>770,8119=>770,8120=>776,8121=>776,8122=>811,8123=>776,8124=>776, +8125=>500,8126=>500,8127=>500,8128=>500,8129=>500,8130=>727,8131=>727,8132=>727,8134=>727,8135=>727, +8136=>1000,8137=>947,8138=>1191,8139=>1118,8140=>945,8141=>500,8142=>500,8143=>500,8144=>484,8145=>484, +8146=>484,8147=>484,8150=>484,8151=>484,8152=>468,8153=>468,8154=>714,8155=>662,8157=>500,8158=>500, +8159=>500,8160=>694,8161=>694,8162=>694,8163=>694,8164=>665,8165=>665,8166=>694,8167=>694,8168=>714, +8169=>714,8170=>1019,8171=>953,8172=>910,8173=>500,8174=>500,8175=>500,8178=>952,8179=>952,8180=>952, +8182=>952,8183=>952,8184=>1069,8185=>887,8186=>1101,8187=>911,8188=>890,8189=>500,8190=>500,8192=>500, +8193=>1000,8194=>500,8195=>1000,8196=>330,8197=>250,8198=>167,8199=>696,8200=>348,8201=>200,8202=>100, +8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>415,8209=>415,8210=>696,8213=>1000,8214=>500, +8215=>500,8219=>348,8223=>575,8227=>639,8228=>348,8229=>674,8234=>0,8235=>0,8236=>0,8237=>0, +8238=>0,8239=>200,8241=>1820,8242=>264,8243=>447,8244=>630,8245=>264,8246=>447,8247=>630,8248=>733, +8252=>629,8253=>586,8254=>500,8258=>1023,8260=>167,8261=>473,8262=>473,8263=>1082,8264=>856,8265=>856, +8267=>636,8268=>500,8269=>500,8270=>523,8271=>369,8273=>523,8274=>556,8275=>1000,8279=>813,8287=>222, +8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0, +8303=>0,8304=>438,8305=>239,8308=>438,8309=>438,8310=>438,8311=>438,8312=>438,8313=>438,8314=>528, +8315=>528,8316=>528,8317=>298,8318=>298,8319=>519,8320=>438,8321=>438,8322=>438,8323=>438,8324=>438, +8325=>438,8326=>438,8327=>438,8328=>438,8329=>438,8330=>528,8331=>528,8332=>528,8333=>298,8334=>298, +8336=>466,8337=>444,8338=>467,8339=>475,8340=>444,8358=>696,8367=>1155,8369=>790,8372=>876,8373=>696, +8451=>1198,8457=>1112,8462=>727,8463=>727,8470=>1087,8486=>890,8487=>890,8490=>869,8491=>776,8513=>775, +8514=>557,8515=>637,8516=>760,8523=>903,8531=>1035,8532=>1035,8533=>1035,8534=>1035,8535=>1035,8536=>1035, +8537=>1035,8538=>1035,8539=>1035,8540=>1035,8541=>1035,8542=>1035,8543=>615,8544=>468,8545=>736,8546=>1005, +8547=>1093,8548=>776,8549=>1127,8550=>1396,8551=>1664,8552=>1069,8553=>776,8554=>1078,8555=>1347,8556=>703, +8557=>796,8558=>867,8559=>1107,8560=>380,8561=>760,8562=>1140,8563=>961,8564=>581,8565=>961,8566=>1341, +8567=>1721,8568=>976,8569=>596,8570=>976,8571=>1356,8572=>380,8573=>609,8574=>699,8575=>1058,8576=>1255, +8577=>867,8578=>1268,8579=>796,8580=>609,8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838, +8598=>838,8599=>838,8600=>838,8601=>838,8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838, +8608=>838,8609=>838,8610=>838,8611=>838,8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838, +8618=>838,8619=>838,8620=>838,8621=>838,8622=>838,8623=>850,8624=>838,8625=>838,8626=>838,8627=>838, +8628=>838,8629=>838,8630=>838,8631=>838,8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838, +8638=>838,8639=>838,8640=>838,8641=>838,8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838, +8648=>838,8649=>838,8650=>838,8651=>838,8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838, +8658=>838,8659=>838,8660=>838,8661=>838,8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838, +8668=>838,8669=>838,8670=>838,8671=>838,8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838, +8678=>838,8679=>838,8680=>838,8681=>838,8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838, +8688=>838,8689=>838,8690=>838,8691=>838,8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838, +8698=>838,8699=>838,8700=>838,8701=>838,8702=>838,8703=>838,8704=>641,8706=>534,8707=>620,8708=>620, +8710=>753,8711=>753,8712=>740,8713=>740,8715=>740,8716=>740,8719=>842,8720=>842,8721=>753,8722=>838, +8723=>838,8724=>838,8725=>365,8727=>691,8728=>519,8729=>519,8730=>657,8731=>657,8732=>657,8733=>672, +8734=>833,8735=>838,8736=>838,8739=>324,8740=>607,8741=>529,8742=>773,8743=>812,8744=>812,8745=>838, +8746=>838,8747=>579,8748=>1000,8749=>1391,8760=>838,8761=>838,8762=>838,8763=>838,8764=>838,8765=>838, +8770=>838,8771=>838,8776=>838,8784=>838,8785=>838,8786=>838,8787=>838,8788=>1082,8789=>1082,8800=>838, +8801=>838,8804=>838,8805=>838,8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838,8844=>838, +8845=>838,8846=>838,8847=>838,8848=>838,8849=>838,8850=>838,8851=>838,8852=>838,8853=>838,8854=>838, +8855=>838,8856=>838,8857=>838,8858=>838,8859=>838,8860=>838,8861=>838,8862=>838,8863=>838,8864=>838, +8865=>838,8866=>884,8867=>884,8868=>960,8869=>960,8870=>616,8871=>616,8872=>884,8873=>884,8874=>884, +8875=>1080,8876=>884,8877=>884,8878=>884,8879=>1080,8901=>398,8962=>834,8968=>473,8969=>473,8970=>473, +8971=>473,8976=>838,8977=>539,8984=>928,8985=>838,8992=>579,8993=>579,8997=>1000,9000=>1443,9085=>1008, +9134=>579,9167=>945,9251=>834,9600=>769,9601=>769,9602=>769,9603=>769,9604=>769,9605=>769,9606=>769, +9607=>769,9608=>769,9609=>769,9610=>769,9611=>769,9612=>769,9613=>769,9614=>769,9615=>769,9616=>769, +9617=>769,9618=>769,9619=>769,9620=>769,9621=>769,9622=>769,9623=>769,9624=>769,9625=>769,9626=>769, +9627=>769,9628=>769,9629=>769,9630=>769,9631=>769,9632=>945,9633=>945,9634=>945,9635=>945,9636=>945, +9637=>945,9638=>945,9639=>945,9640=>945,9641=>945,9642=>678,9643=>678,9644=>945,9645=>945,9646=>550, +9647=>550,9648=>769,9649=>769,9650=>769,9651=>769,9652=>502,9653=>502,9654=>769,9655=>769,9656=>502, +9657=>502,9658=>769,9659=>769,9660=>769,9661=>769,9662=>502,9663=>502,9664=>769,9665=>769,9666=>502, +9667=>502,9668=>769,9669=>769,9670=>769,9671=>769,9672=>769,9673=>873,9674=>494,9675=>873,9676=>873, +9677=>873,9678=>873,9679=>873,9680=>873,9681=>873,9682=>873,9683=>873,9684=>873,9685=>873,9686=>527, +9687=>527,9688=>791,9689=>970,9690=>970,9691=>970,9692=>387,9693=>387,9694=>387,9695=>387,9696=>873, +9697=>873,9698=>769,9699=>769,9700=>769,9701=>769,9702=>590,9703=>945,9704=>945,9705=>945,9706=>945, +9707=>945,9708=>769,9709=>769,9710=>769,9711=>1119,9712=>945,9713=>945,9714=>945,9715=>945,9716=>873, +9717=>873,9718=>873,9719=>873,9720=>769,9721=>769,9722=>769,9723=>830,9724=>830,9725=>732,9726=>732, +9727=>769,9728=>896,9784=>896,9785=>896,9786=>896,9787=>896,9788=>896,9791=>614,9792=>731,9793=>731, +9794=>896,9795=>896,9796=>896,9797=>896,9798=>896,9799=>896,9824=>896,9825=>896,9826=>896,9827=>896, +9828=>896,9829=>896,9830=>896,9831=>896,9833=>472,9834=>638,9835=>896,9836=>896,9837=>472,9838=>357, +9839=>484,10145=>838,10181=>457,10182=>457,10208=>494,10216=>457,10217=>457,10224=>838,10225=>838,10226=>838, +10227=>838,10228=>1033,10229=>1434,10230=>1434,10231=>1434,10232=>1434,10233=>1434,10234=>1434,10235=>1434,10236=>1434, +10237=>1434,10238=>1434,10239=>1434,10240=>781,10241=>781,10242=>781,10243=>781,10244=>781,10245=>781,10246=>781, +10247=>781,10248=>781,10249=>781,10250=>781,10251=>781,10252=>781,10253=>781,10254=>781,10255=>781,10256=>781, +10257=>781,10258=>781,10259=>781,10260=>781,10261=>781,10262=>781,10263=>781,10264=>781,10265=>781,10266=>781, +10267=>781,10268=>781,10269=>781,10270=>781,10271=>781,10272=>781,10273=>781,10274=>781,10275=>781,10276=>781, +10277=>781,10278=>781,10279=>781,10280=>781,10281=>781,10282=>781,10283=>781,10284=>781,10285=>781,10286=>781, +10287=>781,10288=>781,10289=>781,10290=>781,10291=>781,10292=>781,10293=>781,10294=>781,10295=>781,10296=>781, +10297=>781,10298=>781,10299=>781,10300=>781,10301=>781,10302=>781,10303=>781,10304=>781,10305=>781,10306=>781, +10307=>781,10308=>781,10309=>781,10310=>781,10311=>781,10312=>781,10313=>781,10314=>781,10315=>781,10316=>781, +10317=>781,10318=>781,10319=>781,10320=>781,10321=>781,10322=>781,10323=>781,10324=>781,10325=>781,10326=>781, +10327=>781,10328=>781,10329=>781,10330=>781,10331=>781,10332=>781,10333=>781,10334=>781,10335=>781,10336=>781, +10337=>781,10338=>781,10339=>781,10340=>781,10341=>781,10342=>781,10343=>781,10344=>781,10345=>781,10346=>781, +10347=>781,10348=>781,10349=>781,10350=>781,10351=>781,10352=>781,10353=>781,10354=>781,10355=>781,10356=>781, +10357=>781,10358=>781,10359=>781,10360=>781,10361=>781,10362=>781,10363=>781,10364=>781,10365=>781,10366=>781, +10367=>781,10368=>781,10369=>781,10370=>781,10371=>781,10372=>781,10373=>781,10374=>781,10375=>781,10376=>781, +10377=>781,10378=>781,10379=>781,10380=>781,10381=>781,10382=>781,10383=>781,10384=>781,10385=>781,10386=>781, +10387=>781,10388=>781,10389=>781,10390=>781,10391=>781,10392=>781,10393=>781,10394=>781,10395=>781,10396=>781, +10397=>781,10398=>781,10399=>781,10400=>781,10401=>781,10402=>781,10403=>781,10404=>781,10405=>781,10406=>781, +10407=>781,10408=>781,10409=>781,10410=>781,10411=>781,10412=>781,10413=>781,10414=>781,10415=>781,10416=>781, +10417=>781,10418=>781,10419=>781,10420=>781,10421=>781,10422=>781,10423=>781,10424=>781,10425=>781,10426=>781, +10427=>781,10428=>781,10429=>781,10430=>781,10431=>781,10432=>781,10433=>781,10434=>781,10435=>781,10436=>781, +10437=>781,10438=>781,10439=>781,10440=>781,10441=>781,10442=>781,10443=>781,10444=>781,10445=>781,10446=>781, +10447=>781,10448=>781,10449=>781,10450=>781,10451=>781,10452=>781,10453=>781,10454=>781,10455=>781,10456=>781, +10457=>781,10458=>781,10459=>781,10460=>781,10461=>781,10462=>781,10463=>781,10464=>781,10465=>781,10466=>781, +10467=>781,10468=>781,10469=>781,10470=>781,10471=>781,10472=>781,10473=>781,10474=>781,10475=>781,10476=>781, +10477=>781,10478=>781,10479=>781,10480=>781,10481=>781,10482=>781,10483=>781,10484=>781,10485=>781,10486=>781, +10487=>781,10488=>781,10489=>781,10490=>781,10491=>781,10492=>781,10493=>781,10494=>781,10495=>781,10496=>838, +10497=>838,10498=>838,10499=>838,10500=>838,10501=>838,10502=>838,10503=>838,10504=>838,10505=>838,10506=>838, +10507=>838,10508=>838,10509=>838,10510=>838,10511=>838,10512=>838,10513=>838,10514=>838,10515=>838,10516=>838, +10517=>838,10518=>838,10519=>838,10520=>838,10521=>838,10522=>838,10523=>838,10524=>838,10525=>838,10526=>838, +10527=>838,10528=>838,10529=>838,10530=>838,10531=>838,10532=>838,10533=>838,10534=>838,10535=>838,10536=>838, +10537=>838,10538=>838,10539=>838,10540=>838,10541=>838,10542=>838,10543=>838,10544=>838,10545=>838,10546=>838, +10547=>838,10548=>838,10549=>838,10550=>838,10551=>838,10552=>838,10553=>838,10554=>838,10555=>838,10556=>838, +10557=>838,10558=>838,10559=>838,10560=>838,10561=>838,10562=>838,10563=>838,10564=>838,10565=>838,10566=>838, +10567=>838,10568=>838,10569=>838,10570=>838,10571=>838,10572=>838,10573=>838,10574=>838,10575=>838,10576=>838, +10577=>838,10578=>838,10579=>838,10580=>838,10581=>838,10582=>838,10583=>838,10584=>838,10585=>838,10586=>838, +10587=>838,10588=>838,10589=>838,10590=>838,10591=>838,10592=>838,10593=>838,10594=>838,10595=>838,10596=>838, +10597=>838,10598=>838,10599=>838,10600=>838,10601=>838,10602=>838,10603=>838,10604=>838,10605=>838,10606=>838, +10607=>838,10608=>838,10609=>838,10610=>838,10611=>838,10612=>838,10613=>838,10614=>838,10615=>1032,10616=>838, +10617=>838,10618=>960,10619=>838,10620=>838,10621=>838,10622=>838,10623=>838,10731=>494,10764=>1782,10765=>610, +10766=>610,10799=>838,11008=>838,11009=>838,11010=>838,11011=>838,11012=>838,11013=>838,11014=>838,11015=>838, +11016=>838,11017=>838,11018=>838,11019=>838,11020=>838,11021=>838,11022=>838,11023=>838,11024=>838,11025=>838, +11026=>945,11027=>945,11028=>945,11029=>945,11030=>769,11031=>769,11032=>769,11033=>769,11034=>945,11364=>831, +11367=>945,11368=>727,11369=>869,11370=>693,11371=>730,11372=>568,11374=>1107,11375=>776,11381=>779,11382=>601, +11383=>905,11385=>571,11386=>667,11388=>313,11389=>489,11520=>773,11521=>635,11522=>804,11523=>658,11524=>788, +11525=>962,11526=>756,11527=>960,11528=>617,11529=>646,11530=>962,11531=>631,11532=>646,11533=>962,11534=>846, +11535=>866,11536=>961,11537=>645,11538=>645,11539=>959,11540=>945,11541=>863,11542=>644,11543=>646,11544=>645, +11545=>649,11546=>688,11547=>936,11548=>982,11549=>681,11550=>676,11551=>852,11552=>1113,11553=>632,11554=>645, +11555=>646,11556=>749,11557=>914,11800=>586,11810=>473,11811=>473,11812=>473,11813=>473,11822=>586,42564=>722, +42565=>563,42566=>468,42567=>380,42576=>1333,42577=>1092,42580=>1287,42581=>1025,42582=>1287,42583=>1039,42760=>500, +42761=>500,42762=>500,42763=>500,42764=>500,42765=>500,42766=>500,42767=>500,42768=>500,42769=>500,42770=>500, +42771=>500,42772=>500,42773=>500,42774=>500,42779=>384,42780=>384,42781=>276,42782=>276,42783=>276,42891=>439, +42892=>306,62464=>705,62465=>716,62466=>765,62467=>999,62468=>716,62469=>710,62470=>776,62471=>1038,62472=>716, +62473=>716,62474=>1309,62475=>734,62476=>733,62477=>1004,62478=>716,62479=>733,62480=>1050,62481=>797,62482=>850, +62483=>799,62484=>996,62485=>732,62486=>987,62487=>731,62488=>739,62489=>733,62490=>780,62491=>733,62492=>739, +62493=>717,62494=>780,62495=>936,62496=>716,62497=>826,62498=>717,62499=>716,62500=>716,62501=>773,62502=>1013, +62504=>904,63173=>667,63185=>500,63188=>500,64256=>821,64257=>727,64258=>727,64259=>1120,64260=>1117,64261=>871, +64262=>971,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0, +65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65529=>0,65530=>0,65531=>0, +65532=>0,65533=>1113); +$enc=''; +$diff=''; +$file='dejavuserifb.z'; +$ctg='dejavuserifb.ctg.z'; +$originalsize=306532; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifb.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifb.z new file mode 100644 index 0000000..f73e4f3 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifb.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifbi.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifbi.ctg.z new file mode 100644 index 0000000..d237ae7 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifbi.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifbi.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifbi.php new file mode 100644 index 0000000..b365b21 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifbi.php @@ -0,0 +1,299 @@ +<?php +$type='TrueTypeUnicode'; +$name='DejaVuSerif-BoldItalic'; +$desc=array('Ascent'=>939,'Descent'=>-236,'CapHeight'=>-53,'Flags'=>96,'FontBBox'=>'[-906 -389 1760 1235]','ItalicAngle'=>-11,'StemV'=>120,'MissingWidth'=>600); +$up=-63; +$ut=44; +$dw=600; +$cw=array( +0=>600,32=>348,33=>439,34=>521,35=>838,36=>696,37=>950,38=>903,39=>306,40=>473, +41=>473,42=>523,43=>838,44=>348,45=>415,46=>348,47=>365,48=>696,49=>696,50=>696, +51=>696,52=>696,53=>696,54=>696,55=>696,56=>696,57=>696,58=>369,59=>369,60=>838, +61=>838,62=>838,63=>586,64=>1000,65=>776,66=>845,67=>796,68=>867,69=>762,70=>710, +71=>854,72=>945,73=>468,74=>473,75=>869,76=>703,77=>1107,78=>914,79=>871,80=>752, +81=>871,82=>831,83=>722,84=>744,85=>872,86=>776,87=>1123,88=>776,89=>714,90=>730, +91=>473,92=>365,93=>473,94=>838,95=>500,96=>500,97=>648,98=>699,99=>609,100=>699, +101=>636,102=>430,103=>699,104=>727,105=>380,106=>362,107=>693,108=>380,109=>1058,110=>727, +111=>667,112=>699,113=>699,114=>527,115=>563,116=>462,117=>727,118=>581,119=>861,120=>596, +121=>581,122=>568,123=>643,124=>364,125=>643,126=>838,8364=>696,8218=>348,402=>430,8222=>575, +8230=>1000,8224=>523,8225=>523,710=>500,8240=>1385,352=>722,8249=>400,338=>1180,381=>730,8216=>348, +8217=>348,8220=>575,8221=>575,8226=>639,8211=>500,8212=>1000,732=>500,8482=>1000,353=>563,8250=>400, +339=>1028,382=>568,376=>714,160=>348,161=>439,162=>696,163=>696,164=>636,165=>696,166=>364, +167=>523,168=>500,169=>1000,170=>487,171=>625,172=>838,173=>415,174=>1000,175=>500,176=>500, +177=>838,178=>438,179=>438,180=>500,181=>732,182=>636,183=>348,184=>500,185=>438,186=>500, +187=>625,188=>1043,189=>1043,190=>1043,191=>586,192=>776,193=>776,194=>776,195=>776,196=>776, +197=>776,198=>1034,199=>796,200=>762,201=>762,202=>762,203=>762,204=>468,205=>468,206=>468, +207=>468,208=>874,209=>914,210=>871,211=>871,212=>871,213=>871,214=>871,215=>838,216=>871, +217=>872,218=>872,219=>872,220=>872,221=>714,222=>757,223=>760,224=>648,225=>648,226=>648, +227=>648,228=>648,229=>648,230=>932,231=>609,232=>636,233=>636,234=>636,235=>636,236=>380, +237=>380,238=>380,239=>380,240=>667,241=>727,242=>667,243=>667,244=>667,245=>667,246=>667, +247=>838,248=>667,249=>727,250=>727,251=>727,252=>727,253=>581,254=>699,255=>581,256=>776, +257=>648,258=>776,259=>648,260=>776,261=>648,262=>796,263=>609,264=>796,265=>609,266=>796, +267=>609,268=>796,269=>609,270=>867,271=>699,272=>874,273=>699,274=>762,275=>636,276=>762, +277=>636,278=>762,279=>636,280=>762,281=>636,282=>762,283=>636,284=>854,285=>699,286=>854, +287=>699,288=>854,289=>699,290=>854,291=>699,292=>945,293=>727,294=>945,295=>727,296=>468, +297=>380,298=>468,299=>380,300=>468,301=>380,302=>468,303=>380,304=>468,305=>380,306=>942, +307=>751,308=>473,309=>362,310=>869,311=>693,312=>693,313=>703,314=>380,315=>703,316=>380, +317=>703,318=>508,319=>703,320=>557,321=>710,322=>385,323=>914,324=>727,325=>914,326=>727, +327=>914,328=>727,329=>1008,330=>872,331=>727,332=>871,333=>667,334=>871,335=>667,336=>871, +337=>667,340=>831,341=>527,342=>831,343=>527,344=>831,345=>527,346=>722,347=>563,348=>722, +349=>563,350=>722,351=>563,354=>744,355=>462,356=>744,357=>462,358=>744,359=>462,360=>872, +361=>727,362=>872,363=>727,364=>872,365=>727,366=>872,367=>727,368=>872,369=>727,370=>872, +371=>727,372=>1123,373=>861,374=>714,375=>581,377=>730,378=>568,379=>730,380=>568,383=>430, +384=>699,385=>845,386=>854,387=>699,388=>854,389=>699,390=>796,391=>796,392=>609,393=>874, +394=>867,395=>854,396=>699,397=>667,398=>762,399=>871,400=>721,401=>710,403=>854,404=>771, +405=>1043,406=>468,407=>468,408=>869,409=>693,410=>380,411=>701,412=>1058,413=>914,414=>727, +415=>871,416=>871,417=>667,418=>1200,419=>943,420=>752,421=>699,422=>831,423=>722,424=>563, +425=>707,426=>331,427=>462,428=>744,429=>462,430=>744,431=>872,432=>727,433=>890,434=>890, +435=>714,436=>699,437=>730,438=>568,439=>657,440=>657,441=>657,443=>696,444=>754,445=>568, +446=>536,448=>295,449=>492,450=>459,451=>295,452=>1597,453=>1435,454=>1267,455=>1176,456=>1065, +457=>742,458=>1387,459=>1276,460=>1089,461=>776,462=>648,463=>468,464=>380,465=>871,466=>667, +467=>872,468=>727,469=>872,470=>727,471=>872,472=>727,473=>872,474=>727,475=>872,476=>727, +477=>636,478=>776,479=>648,480=>776,481=>648,482=>1034,483=>975,484=>896,485=>699,486=>854, +487=>699,488=>869,489=>693,490=>871,491=>667,492=>871,493=>667,494=>657,495=>568,496=>362, +497=>1597,498=>1435,499=>1267,500=>854,501=>699,502=>1221,504=>914,505=>727,506=>776,507=>648, +508=>1034,509=>932,510=>871,511=>667,512=>776,513=>648,514=>776,515=>648,516=>762,517=>636, +518=>762,519=>636,520=>468,521=>380,522=>468,523=>380,524=>871,525=>667,526=>871,527=>667, +528=>831,529=>527,530=>831,531=>527,532=>872,533=>727,534=>872,535=>727,536=>722,537=>563, +538=>744,539=>462,540=>690,541=>607,542=>945,543=>727,544=>872,545=>791,548=>730,549=>568, +550=>776,551=>648,552=>762,553=>636,554=>871,555=>667,556=>871,557=>667,558=>871,559=>667, +560=>871,561=>667,562=>714,563=>581,564=>573,565=>922,566=>564,567=>362,568=>1031,569=>1031, +570=>776,571=>796,572=>609,573=>703,574=>744,575=>563,576=>568,577=>660,578=>547,581=>776, +592=>648,593=>699,594=>699,595=>699,596=>609,597=>609,598=>699,599=>730,600=>636,601=>636, +602=>907,603=>608,604=>562,605=>907,606=>720,607=>387,608=>699,609=>699,610=>626,611=>712, +612=>627,613=>727,614=>727,615=>727,616=>380,617=>380,618=>380,619=>409,620=>514,621=>380, +622=>795,623=>1058,624=>1058,625=>1058,626=>727,627=>727,628=>712,629=>667,630=>1061,631=>749, +632=>667,633=>571,634=>571,635=>571,636=>527,637=>527,638=>452,639=>487,640=>801,641=>801, +642=>563,643=>331,644=>430,645=>540,646=>331,647=>492,648=>462,649=>727,650=>679,651=>694, +652=>581,653=>861,654=>635,655=>727,656=>568,657=>568,658=>568,659=>568,660=>536,661=>536, +662=>536,663=>545,664=>871,665=>695,666=>720,667=>626,668=>732,669=>384,670=>740,671=>646, +672=>699,673=>536,674=>536,675=>1117,676=>1179,677=>1117,678=>911,679=>715,680=>909,681=>1039, +682=>790,683=>795,684=>662,685=>443,686=>613,687=>717,688=>521,689=>519,690=>313,691=>414, +692=>414,693=>480,694=>527,695=>542,696=>366,697=>302,699=>348,700=>348,701=>348,702=>366, +703=>366,704=>313,705=>313,711=>500,712=>282,713=>500,716=>282,720=>369,721=>369,722=>366, +723=>366,726=>392,728=>500,729=>500,730=>500,731=>500,733=>500,734=>417,736=>448,737=>292, +738=>395,739=>375,740=>313,741=>500,742=>500,743=>500,744=>500,745=>500,750=>553,768=>0, +769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0, +779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0, +789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0, +799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0, +809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0, +819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0, +829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>779,881=>576,884=>302, +885=>302,890=>500,891=>609,892=>609,893=>609,894=>369,900=>500,901=>500,902=>776,903=>348, +904=>947,905=>1136,906=>662,908=>887,910=>953,911=>911,912=>484,913=>776,914=>845,915=>710, +916=>776,917=>762,918=>730,919=>945,920=>871,921=>468,922=>869,923=>776,924=>1107,925=>914, +926=>704,927=>871,928=>945,929=>752,931=>707,932=>744,933=>714,934=>871,935=>776,936=>913, +937=>890,938=>468,939=>714,940=>770,941=>608,942=>727,943=>484,944=>694,945=>770,946=>664, +947=>660,948=>667,949=>608,950=>592,951=>727,952=>667,953=>484,954=>750,955=>701,956=>732, +957=>694,958=>592,959=>667,960=>732,961=>665,962=>609,963=>737,964=>673,965=>694,966=>905, +967=>658,968=>941,969=>952,970=>484,971=>694,972=>667,973=>694,974=>952,976=>667,977=>849, +978=>764,979=>969,980=>764,981=>941,982=>952,983=>655,984=>871,985=>667,986=>796,987=>609, +988=>710,989=>527,990=>590,991=>660,992=>796,993=>667,1008=>655,1009=>665,1010=>609,1011=>362, +1012=>871,1013=>609,1014=>609,1015=>757,1016=>699,1017=>796,1018=>1107,1019=>860,1020=>692,1021=>796, +1022=>796,1023=>796,1024=>762,1025=>762,1026=>901,1027=>690,1028=>795,1029=>722,1030=>468,1031=>468, +1032=>473,1033=>1202,1034=>1262,1035=>963,1036=>910,1037=>945,1038=>812,1039=>945,1040=>814,1041=>854, +1042=>845,1043=>690,1044=>889,1045=>762,1046=>1312,1047=>721,1048=>945,1049=>945,1050=>910,1051=>884, +1052=>1107,1053=>945,1054=>871,1055=>945,1056=>752,1057=>796,1058=>744,1059=>812,1060=>949,1061=>776, +1062=>966,1063=>913,1064=>1268,1065=>1293,1066=>957,1067=>1202,1068=>825,1069=>795,1070=>1287,1071=>882, +1072=>648,1073=>722,1074=>657,1075=>563,1076=>695,1077=>636,1078=>1306,1079=>638,1080=>727,1081=>727, +1082=>677,1083=>732,1084=>951,1085=>729,1086=>667,1087=>727,1088=>699,1089=>609,1090=>1058,1091=>598, +1092=>902,1093=>596,1094=>803,1095=>715,1096=>1058,1097=>1134,1098=>727,1099=>1018,1100=>660,1101=>645, +1102=>1001,1103=>796,1104=>636,1105=>636,1106=>719,1107=>563,1108=>609,1109=>563,1110=>380,1111=>380, +1112=>362,1113=>1014,1114=>1011,1115=>727,1116=>677,1117=>727,1118=>598,1119=>727,1122=>880,1123=>1050, +1124=>1195,1125=>963,1130=>1312,1131=>1010,1136=>1096,1137=>1105,1138=>871,1139=>652,1140=>916,1141=>749, +1164=>846,1165=>673,1168=>700,1169=>618,1170=>690,1171=>563,1172=>854,1173=>705,1174=>1312,1175=>1306, +1176=>721,1177=>638,1178=>902,1179=>703,1182=>910,1183=>677,1184=>1041,1185=>760,1186=>952,1187=>805, +1188=>1167,1189=>955,1190=>1324,1191=>1013,1194=>796,1195=>609,1196=>744,1197=>1142,1198=>714,1199=>572, +1200=>713,1201=>572,1202=>789,1203=>596,1204=>1010,1205=>833,1206=>913,1207=>792,1210=>910,1211=>727, +1216=>468,1217=>1312,1218=>1306,1219=>869,1220=>693,1223=>945,1224=>732,1227=>984,1228=>732,1231=>380, +1232=>814,1233=>648,1234=>814,1235=>648,1236=>1034,1237=>975,1238=>762,1239=>636,1240=>871,1241=>636, +1242=>871,1243=>636,1244=>1312,1245=>1306,1246=>721,1247=>638,1248=>657,1249=>568,1250=>945,1251=>727, +1252=>945,1253=>727,1254=>871,1255=>667,1256=>871,1257=>667,1258=>871,1259=>667,1260=>795,1261=>645, +1262=>812,1263=>598,1264=>812,1265=>598,1266=>812,1267=>598,1268=>913,1269=>715,1270=>690,1271=>563, +1272=>1202,1273=>1018,1296=>721,1297=>638,1298=>884,1299=>732,1300=>1248,1301=>1005,1306=>820,1307=>640, +1308=>1028,1309=>856,4256=>765,4257=>945,4258=>876,4259=>884,4260=>791,4261=>1087,4262=>1024,4263=>1223, +4264=>653,4265=>828,4266=>1061,4267=>1061,4268=>806,4269=>1145,4270=>979,4271=>912,4272=>1119,4273=>802, +4274=>766,4275=>1085,4276=>986,4277=>1076,4278=>820,4279=>843,4280=>831,4281=>843,4282=>918,4283=>1086, +4284=>779,4285=>832,4286=>822,4287=>1121,4288=>1132,4289=>812,4290=>902,4291=>812,4292=>890,4293=>1073, +4304=>594,4305=>625,4306=>643,4307=>887,4308=>615,4309=>611,4310=>666,4311=>915,4312=>613,4313=>600, +4314=>1120,4315=>654,4316=>640,4317=>879,4318=>624,4319=>634,4320=>877,4321=>657,4322=>802,4323=>751, +4324=>869,4325=>639,4326=>912,4327=>622,4328=>647,4329=>640,4330=>729,4331=>641,4332=>639,4333=>629, +4334=>674,4335=>737,4336=>625,4337=>657,4338=>625,4339=>625,4340=>624,4341=>670,4342=>940,4343=>680, +4344=>636,4345=>672,4346=>625,4347=>446,4348=>363,7426=>940,7432=>509,7433=>320,7444=>989,7446=>667, +7447=>667,7453=>737,7454=>948,7455=>948,7468=>489,7469=>651,7470=>532,7472=>546,7473=>480,7474=>480, +7475=>538,7476=>595,7477=>294,7478=>298,7479=>547,7480=>443,7481=>697,7482=>576,7483=>576,7484=>548, +7486=>474,7487=>523,7488=>469,7489=>549,7490=>708,7491=>466,7492=>466,7493=>498,7494=>657,7495=>499, +7496=>498,7497=>444,7498=>444,7499=>412,7500=>412,7501=>498,7502=>300,7503=>523,7504=>729,7505=>473, +7506=>467,7507=>427,7508=>467,7509=>467,7510=>499,7511=>371,7512=>520,7513=>434,7514=>729,7515=>491, +7522=>239,7523=>414,7524=>520,7525=>491,7543=>640,7544=>595,7547=>380,7557=>380,7579=>498,7580=>427, +7581=>427,7582=>467,7583=>412,7584=>271,7585=>373,7586=>498,7587=>522,7588=>300,7589=>307,7590=>300, +7591=>300,7592=>370,7593=>368,7594=>321,7595=>430,7596=>682,7597=>729,7598=>588,7599=>587,7600=>472, +7601=>467,7602=>522,7603=>400,7604=>387,7605=>371,7606=>520,7607=>475,7609=>489,7610=>366,7611=>357, +7612=>527,7613=>412,7614=>452,7615=>467,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0, +7680=>776,7681=>648,7682=>845,7683=>699,7684=>845,7685=>699,7686=>845,7687=>699,7688=>796,7689=>609, +7690=>867,7691=>699,7692=>867,7693=>699,7694=>867,7695=>699,7696=>867,7697=>699,7698=>867,7699=>699, +7700=>762,7701=>636,7702=>762,7703=>636,7704=>762,7705=>636,7706=>762,7707=>636,7708=>762,7709=>636, +7710=>710,7711=>430,7712=>854,7713=>699,7714=>945,7715=>727,7716=>945,7717=>727,7718=>945,7719=>727, +7720=>945,7721=>727,7722=>945,7723=>727,7724=>468,7725=>380,7728=>869,7729=>693,7730=>869,7731=>693, +7732=>869,7733=>693,7734=>703,7735=>380,7736=>703,7737=>380,7738=>703,7739=>380,7740=>703,7741=>380, +7742=>1107,7743=>1058,7744=>1107,7745=>1058,7746=>1107,7747=>1058,7748=>914,7749=>727,7750=>914,7751=>727, +7752=>914,7753=>727,7754=>914,7755=>727,7756=>871,7757=>667,7760=>871,7761=>667,7762=>871,7763=>667, +7764=>752,7765=>699,7766=>752,7767=>699,7768=>831,7769=>527,7770=>831,7771=>527,7772=>831,7773=>527, +7774=>831,7775=>527,7776=>722,7777=>563,7778=>722,7779=>563,7784=>722,7785=>563,7786=>744,7787=>462, +7788=>744,7789=>462,7790=>744,7791=>462,7792=>744,7793=>462,7794=>872,7795=>727,7796=>872,7797=>727, +7798=>872,7799=>727,7800=>872,7801=>727,7802=>872,7803=>727,7804=>776,7805=>581,7806=>776,7807=>581, +7808=>1123,7809=>861,7810=>1123,7811=>861,7812=>1123,7813=>861,7814=>1123,7815=>861,7816=>1123,7817=>861, +7818=>776,7819=>596,7820=>776,7821=>596,7822=>714,7823=>581,7824=>730,7825=>568,7826=>730,7827=>568, +7828=>730,7829=>568,7830=>727,7831=>462,7832=>861,7833=>581,7834=>1014,7835=>430,7838=>947,7839=>667, +7840=>776,7841=>648,7842=>776,7843=>648,7852=>776,7853=>648,7854=>776,7855=>648,7856=>776,7857=>648, +7858=>776,7859=>648,7860=>776,7861=>648,7862=>776,7863=>648,7864=>762,7865=>636,7866=>762,7867=>636, +7868=>762,7869=>636,7878=>762,7879=>636,7880=>468,7881=>380,7882=>468,7883=>380,7884=>871,7885=>667, +7886=>871,7887=>667,7896=>871,7897=>667,7908=>872,7909=>727,7910=>872,7911=>727,7922=>714,7923=>581, +7924=>714,7925=>581,7926=>714,7927=>581,7928=>714,7929=>581,7936=>770,7937=>770,7938=>770,7939=>770, +7940=>770,7941=>770,7942=>770,7943=>770,7944=>776,7945=>776,7946=>978,7947=>978,7948=>832,7949=>849, +7950=>776,7951=>776,7952=>608,7953=>608,7954=>608,7955=>608,7956=>608,7957=>608,7960=>917,7961=>909, +7962=>1169,7963=>1169,7964=>1093,7965=>1120,7968=>727,7969=>727,7970=>727,7971=>727,7972=>727,7973=>727, +7974=>727,7975=>727,7976=>1100,7977=>1094,7978=>1358,7979=>1361,7980=>1279,7981=>1308,7982=>1197,7983=>1194, +7984=>484,7985=>484,7986=>484,7987=>484,7988=>484,7989=>484,7990=>484,7991=>484,7992=>629,7993=>617, +7994=>878,7995=>881,7996=>799,7997=>831,7998=>723,7999=>714,8000=>667,8001=>667,8002=>667,8003=>667, +8004=>667,8005=>667,8008=>900,8009=>935,8010=>1240,8011=>1237,8012=>1035,8013=>1066,8016=>694,8017=>694, +8018=>694,8019=>694,8020=>694,8021=>694,8022=>694,8023=>694,8025=>922,8027=>1186,8029=>1133,8031=>1019, +8032=>952,8033=>952,8034=>952,8035=>952,8036=>952,8037=>952,8038=>952,8039=>952,8040=>931,8041=>963, +8042=>1268,8043=>1274,8044=>1054,8045=>1088,8046=>1023,8047=>1060,8048=>770,8049=>770,8050=>608,8051=>608, +8052=>727,8053=>727,8054=>484,8055=>484,8056=>667,8057=>667,8058=>694,8059=>694,8060=>952,8061=>952, +8064=>770,8065=>770,8066=>770,8067=>770,8068=>770,8069=>770,8070=>770,8071=>770,8072=>776,8073=>776, +8074=>978,8075=>978,8076=>832,8077=>849,8078=>776,8079=>776,8080=>727,8081=>727,8082=>727,8083=>727, +8084=>727,8085=>727,8086=>727,8087=>727,8088=>1100,8089=>1094,8090=>1358,8091=>1361,8092=>1279,8093=>1308, +8094=>1197,8095=>1194,8096=>952,8097=>952,8098=>952,8099=>952,8100=>952,8101=>952,8102=>952,8103=>952, +8104=>931,8105=>963,8106=>1268,8107=>1274,8108=>1054,8109=>1088,8110=>1023,8111=>1060,8112=>770,8113=>770, +8114=>770,8115=>770,8116=>770,8118=>770,8119=>770,8120=>776,8121=>776,8122=>811,8123=>776,8124=>776, +8125=>500,8126=>500,8127=>500,8128=>500,8129=>500,8130=>727,8131=>727,8132=>727,8134=>727,8135=>727, +8136=>1000,8137=>947,8138=>1191,8139=>1118,8140=>945,8141=>500,8142=>500,8143=>500,8144=>484,8145=>484, +8146=>484,8147=>484,8150=>484,8151=>484,8152=>468,8153=>468,8154=>714,8155=>662,8157=>500,8158=>500, +8159=>500,8160=>694,8161=>694,8162=>694,8163=>694,8164=>665,8165=>665,8166=>694,8167=>694,8168=>714, +8169=>714,8170=>1019,8171=>953,8172=>910,8173=>500,8174=>500,8175=>500,8178=>952,8179=>952,8180=>952, +8182=>952,8183=>952,8184=>1069,8185=>887,8186=>1101,8187=>911,8188=>890,8189=>500,8190=>500,8192=>500, +8193=>1000,8194=>500,8195=>1000,8196=>330,8197=>250,8198=>167,8199=>696,8200=>348,8201=>200,8202=>100, +8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>415,8209=>415,8210=>696,8213=>1000,8214=>500, +8215=>500,8219=>348,8223=>575,8227=>639,8228=>348,8229=>674,8234=>0,8235=>0,8236=>0,8237=>0, +8238=>0,8239=>200,8241=>1813,8242=>264,8243=>447,8244=>630,8245=>264,8246=>447,8247=>630,8248=>733, +8252=>629,8253=>586,8254=>500,8258=>1023,8260=>167,8261=>473,8262=>473,8263=>1082,8264=>856,8265=>856, +8267=>636,8268=>500,8269=>500,8270=>523,8271=>369,8273=>523,8274=>556,8275=>1000,8279=>813,8287=>222, +8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0, +8303=>0,8304=>438,8305=>239,8308=>438,8309=>438,8310=>438,8311=>438,8312=>438,8313=>438,8314=>528, +8315=>528,8316=>528,8317=>298,8318=>298,8319=>458,8320=>438,8321=>438,8322=>438,8323=>438,8324=>438, +8325=>438,8326=>438,8327=>438,8328=>438,8329=>438,8330=>528,8331=>528,8332=>528,8333=>298,8334=>298, +8336=>466,8337=>444,8338=>467,8339=>375,8340=>444,8358=>696,8367=>1155,8369=>790,8372=>876,8373=>696, +8451=>1198,8457=>1112,8462=>727,8463=>727,8470=>1087,8486=>890,8487=>890,8490=>869,8491=>776,8513=>786, +8514=>576,8515=>637,8516=>760,8523=>903,8531=>1035,8532=>1035,8533=>1035,8534=>1035,8535=>1035,8536=>1035, +8537=>1035,8538=>1035,8539=>1035,8540=>1035,8541=>1035,8542=>1035,8543=>615,8544=>468,8545=>736,8546=>1005, +8547=>1093,8548=>776,8549=>1127,8550=>1396,8551=>1664,8552=>1069,8553=>776,8554=>1078,8555=>1347,8556=>703, +8557=>796,8558=>867,8559=>1107,8560=>380,8561=>760,8562=>1140,8563=>961,8564=>581,8565=>961,8566=>1341, +8567=>1721,8568=>976,8569=>596,8570=>976,8571=>1356,8572=>380,8573=>609,8574=>699,8575=>1058,8576=>1255, +8577=>867,8578=>1268,8579=>796,8580=>609,8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838, +8598=>838,8599=>838,8600=>838,8601=>838,8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838, +8608=>838,8609=>838,8610=>838,8611=>838,8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838, +8618=>838,8619=>838,8620=>838,8621=>838,8622=>838,8623=>850,8624=>838,8625=>838,8626=>838,8627=>838, +8628=>838,8629=>838,8630=>838,8631=>838,8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838, +8638=>838,8639=>838,8640=>838,8641=>838,8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838, +8648=>838,8649=>838,8650=>838,8651=>838,8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838, +8658=>838,8659=>838,8660=>838,8661=>838,8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838, +8668=>838,8669=>838,8670=>838,8671=>838,8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838, +8678=>838,8679=>838,8680=>838,8681=>838,8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838, +8688=>838,8689=>838,8690=>838,8691=>838,8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838, +8698=>838,8699=>838,8700=>838,8701=>838,8702=>838,8703=>838,8704=>641,8706=>534,8707=>620,8708=>620, +8710=>753,8711=>753,8712=>740,8713=>740,8715=>740,8716=>740,8719=>842,8720=>842,8721=>753,8722=>838, +8723=>838,8724=>838,8725=>365,8727=>691,8728=>519,8729=>519,8730=>657,8731=>657,8732=>657,8733=>672, +8734=>833,8735=>838,8736=>838,8739=>324,8740=>607,8741=>529,8742=>773,8743=>812,8744=>812,8745=>838, +8746=>838,8747=>579,8748=>1000,8749=>1391,8760=>838,8761=>838,8762=>838,8763=>838,8764=>838,8765=>838, +8770=>838,8771=>838,8776=>838,8784=>838,8785=>838,8786=>838,8787=>838,8788=>1082,8789=>1082,8800=>838, +8801=>838,8804=>838,8805=>838,8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838,8844=>838, +8845=>838,8846=>838,8847=>838,8848=>838,8849=>838,8850=>838,8851=>838,8852=>838,8853=>838,8854=>838, +8855=>838,8856=>838,8857=>838,8858=>838,8859=>838,8860=>838,8861=>838,8862=>838,8863=>838,8864=>838, +8865=>838,8866=>884,8867=>884,8868=>960,8869=>960,8870=>616,8871=>616,8872=>884,8873=>884,8874=>884, +8875=>1080,8876=>884,8877=>884,8878=>884,8879=>1080,8901=>398,8962=>834,8968=>473,8969=>473,8970=>473, +8971=>473,8976=>838,8977=>539,8984=>928,8985=>838,8992=>579,8993=>579,8997=>1000,9000=>1443,9085=>1008, +9134=>579,9167=>945,9251=>834,9600=>769,9601=>769,9602=>769,9603=>769,9604=>769,9605=>769,9606=>769, +9607=>769,9608=>769,9609=>769,9610=>769,9611=>769,9612=>769,9613=>769,9614=>769,9615=>769,9616=>769, +9617=>769,9618=>769,9619=>769,9620=>769,9621=>769,9622=>769,9623=>769,9624=>769,9625=>769,9626=>769, +9627=>769,9628=>769,9629=>769,9630=>769,9631=>769,9632=>945,9633=>945,9634=>945,9635=>945,9636=>945, +9637=>945,9638=>945,9639=>945,9640=>945,9641=>945,9642=>678,9643=>678,9644=>945,9645=>945,9646=>550, +9647=>550,9648=>769,9649=>769,9650=>769,9651=>769,9652=>502,9653=>502,9654=>769,9655=>769,9656=>502, +9657=>502,9658=>769,9659=>769,9660=>769,9661=>769,9662=>502,9663=>502,9664=>769,9665=>769,9666=>502, +9667=>502,9668=>769,9669=>769,9670=>769,9671=>769,9672=>769,9673=>873,9674=>494,9675=>873,9676=>873, +9677=>873,9678=>873,9679=>873,9680=>873,9681=>873,9682=>873,9683=>873,9684=>873,9685=>873,9686=>527, +9687=>527,9688=>791,9689=>970,9690=>970,9691=>970,9692=>387,9693=>387,9694=>387,9695=>387,9696=>873, +9697=>873,9698=>769,9699=>769,9700=>769,9701=>769,9702=>590,9703=>945,9704=>945,9705=>945,9706=>945, +9707=>945,9708=>769,9709=>769,9710=>769,9711=>1119,9712=>945,9713=>945,9714=>945,9715=>945,9716=>873, +9717=>873,9718=>873,9719=>873,9720=>769,9721=>769,9722=>769,9723=>830,9724=>830,9725=>732,9726=>732, +9727=>769,9728=>896,9784=>896,9785=>896,9786=>896,9787=>896,9788=>896,9791=>614,9792=>731,9793=>731, +9794=>896,9795=>896,9796=>896,9797=>896,9798=>896,9799=>896,9824=>896,9825=>896,9826=>896,9827=>896, +9828=>896,9829=>896,9830=>896,9831=>896,9833=>472,9834=>638,9835=>896,9836=>896,9837=>472,9838=>357, +9839=>484,10145=>838,10181=>457,10182=>457,10208=>494,10216=>457,10217=>457,10224=>838,10225=>838,10226=>838, +10227=>838,10228=>1033,10229=>1434,10230=>1434,10231=>1434,10232=>1434,10233=>1434,10234=>1434,10235=>1434,10236=>1434, +10237=>1434,10238=>1434,10239=>1434,10240=>781,10241=>781,10242=>781,10243=>781,10244=>781,10245=>781,10246=>781, +10247=>781,10248=>781,10249=>781,10250=>781,10251=>781,10252=>781,10253=>781,10254=>781,10255=>781,10256=>781, +10257=>781,10258=>781,10259=>781,10260=>781,10261=>781,10262=>781,10263=>781,10264=>781,10265=>781,10266=>781, +10267=>781,10268=>781,10269=>781,10270=>781,10271=>781,10272=>781,10273=>781,10274=>781,10275=>781,10276=>781, +10277=>781,10278=>781,10279=>781,10280=>781,10281=>781,10282=>781,10283=>781,10284=>781,10285=>781,10286=>781, +10287=>781,10288=>781,10289=>781,10290=>781,10291=>781,10292=>781,10293=>781,10294=>781,10295=>781,10296=>781, +10297=>781,10298=>781,10299=>781,10300=>781,10301=>781,10302=>781,10303=>781,10304=>781,10305=>781,10306=>781, +10307=>781,10308=>781,10309=>781,10310=>781,10311=>781,10312=>781,10313=>781,10314=>781,10315=>781,10316=>781, +10317=>781,10318=>781,10319=>781,10320=>781,10321=>781,10322=>781,10323=>781,10324=>781,10325=>781,10326=>781, +10327=>781,10328=>781,10329=>781,10330=>781,10331=>781,10332=>781,10333=>781,10334=>781,10335=>781,10336=>781, +10337=>781,10338=>781,10339=>781,10340=>781,10341=>781,10342=>781,10343=>781,10344=>781,10345=>781,10346=>781, +10347=>781,10348=>781,10349=>781,10350=>781,10351=>781,10352=>781,10353=>781,10354=>781,10355=>781,10356=>781, +10357=>781,10358=>781,10359=>781,10360=>781,10361=>781,10362=>781,10363=>781,10364=>781,10365=>781,10366=>781, +10367=>781,10368=>781,10369=>781,10370=>781,10371=>781,10372=>781,10373=>781,10374=>781,10375=>781,10376=>781, +10377=>781,10378=>781,10379=>781,10380=>781,10381=>781,10382=>781,10383=>781,10384=>781,10385=>781,10386=>781, +10387=>781,10388=>781,10389=>781,10390=>781,10391=>781,10392=>781,10393=>781,10394=>781,10395=>781,10396=>781, +10397=>781,10398=>781,10399=>781,10400=>781,10401=>781,10402=>781,10403=>781,10404=>781,10405=>781,10406=>781, +10407=>781,10408=>781,10409=>781,10410=>781,10411=>781,10412=>781,10413=>781,10414=>781,10415=>781,10416=>781, +10417=>781,10418=>781,10419=>781,10420=>781,10421=>781,10422=>781,10423=>781,10424=>781,10425=>781,10426=>781, +10427=>781,10428=>781,10429=>781,10430=>781,10431=>781,10432=>781,10433=>781,10434=>781,10435=>781,10436=>781, +10437=>781,10438=>781,10439=>781,10440=>781,10441=>781,10442=>781,10443=>781,10444=>781,10445=>781,10446=>781, +10447=>781,10448=>781,10449=>781,10450=>781,10451=>781,10452=>781,10453=>781,10454=>781,10455=>781,10456=>781, +10457=>781,10458=>781,10459=>781,10460=>781,10461=>781,10462=>781,10463=>781,10464=>781,10465=>781,10466=>781, +10467=>781,10468=>781,10469=>781,10470=>781,10471=>781,10472=>781,10473=>781,10474=>781,10475=>781,10476=>781, +10477=>781,10478=>781,10479=>781,10480=>781,10481=>781,10482=>781,10483=>781,10484=>781,10485=>781,10486=>781, +10487=>781,10488=>781,10489=>781,10490=>781,10491=>781,10492=>781,10493=>781,10494=>781,10495=>781,10496=>838, +10497=>838,10498=>838,10499=>838,10500=>838,10501=>838,10502=>838,10503=>838,10504=>838,10505=>838,10506=>838, +10507=>838,10508=>838,10509=>838,10510=>838,10511=>838,10512=>838,10513=>838,10514=>838,10515=>838,10516=>838, +10517=>838,10518=>838,10519=>838,10520=>838,10521=>838,10522=>838,10523=>838,10524=>838,10525=>838,10526=>838, +10527=>838,10528=>838,10529=>838,10530=>838,10531=>838,10532=>838,10533=>838,10534=>838,10535=>838,10536=>838, +10537=>838,10538=>838,10539=>838,10540=>838,10541=>838,10542=>838,10543=>838,10544=>838,10545=>838,10546=>838, +10547=>838,10548=>838,10549=>838,10550=>838,10551=>838,10552=>838,10553=>838,10554=>838,10555=>838,10556=>838, +10557=>838,10558=>838,10559=>838,10560=>838,10561=>838,10562=>838,10563=>838,10564=>838,10565=>838,10566=>838, +10567=>838,10568=>838,10569=>838,10570=>838,10571=>838,10572=>838,10573=>838,10574=>838,10575=>838,10576=>838, +10577=>838,10578=>838,10579=>838,10580=>838,10581=>838,10582=>838,10583=>838,10584=>838,10585=>838,10586=>838, +10587=>838,10588=>838,10589=>838,10590=>838,10591=>838,10592=>838,10593=>838,10594=>838,10595=>838,10596=>838, +10597=>838,10598=>838,10599=>838,10600=>838,10601=>838,10602=>838,10603=>838,10604=>838,10605=>838,10606=>838, +10607=>838,10608=>838,10609=>838,10610=>838,10611=>838,10612=>838,10613=>838,10614=>838,10615=>1032,10616=>838, +10617=>838,10618=>960,10619=>838,10620=>838,10621=>838,10622=>838,10623=>838,10731=>494,10764=>1782,10765=>610, +10766=>610,10799=>838,11008=>838,11009=>838,11010=>838,11011=>838,11012=>838,11013=>838,11014=>838,11015=>838, +11016=>838,11017=>838,11018=>838,11019=>838,11020=>838,11021=>838,11022=>838,11023=>838,11024=>838,11025=>838, +11026=>945,11027=>945,11028=>945,11029=>945,11030=>769,11031=>769,11032=>769,11033=>769,11034=>945,11364=>831, +11367=>945,11368=>727,11369=>869,11370=>693,11371=>730,11372=>568,11374=>1107,11375=>776,11381=>779,11382=>576, +11383=>905,11385=>571,11386=>667,11388=>313,11389=>489,11520=>773,11521=>635,11522=>804,11523=>658,11524=>788, +11525=>962,11526=>756,11527=>960,11528=>617,11529=>646,11530=>962,11531=>631,11532=>646,11533=>962,11534=>846, +11535=>866,11536=>961,11537=>645,11538=>645,11539=>959,11540=>945,11541=>863,11542=>644,11543=>646,11544=>645, +11545=>649,11546=>688,11547=>936,11548=>982,11549=>681,11550=>676,11551=>852,11552=>1113,11553=>632,11554=>645, +11555=>646,11556=>749,11557=>914,11800=>586,11810=>473,11811=>473,11812=>473,11813=>473,11822=>586,42564=>722, +42565=>563,42566=>468,42567=>380,42576=>1333,42577=>1085,42580=>1287,42581=>1025,42582=>1287,42583=>1029,42760=>500, +42761=>500,42762=>500,42763=>500,42764=>500,42765=>500,42766=>500,42767=>500,42768=>500,42769=>500,42770=>500, +42771=>500,42772=>500,42773=>500,42774=>500,42779=>384,42780=>384,42781=>276,42782=>276,42783=>276,42891=>439, +42892=>306,62464=>726,62465=>737,62466=>786,62467=>1019,62468=>737,62469=>731,62470=>796,62471=>1058,62472=>737, +62473=>737,62474=>1329,62475=>754,62476=>753,62477=>1024,62478=>737,62479=>753,62480=>1070,62481=>818,62482=>870, +62483=>819,62484=>1016,62485=>753,62486=>1008,62487=>752,62488=>760,62489=>753,62490=>800,62491=>753,62492=>760, +62493=>738,62494=>801,62495=>956,62496=>736,62497=>847,62498=>737,62499=>737,62500=>737,62501=>793,62502=>1033, +62504=>904,63172=>563,63173=>667,63174=>699,63175=>727,63176=>1058,63185=>500,63188=>500,64256=>827,64257=>727, +64258=>727,64259=>1108,64260=>1146,64261=>879,64262=>971,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0, +65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0, +65039=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1113); +$enc=''; +$diff=''; +$file='dejavuserifbi.z'; +$ctg='dejavuserifbi.ctg.z'; +$originalsize=294244; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifbi.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifbi.z new file mode 100644 index 0000000..ab7e8b2 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifbi.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensed.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensed.ctg.z new file mode 100644 index 0000000..6e01b83 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensed.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensed.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensed.php new file mode 100644 index 0000000..fb89925 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensed.php @@ -0,0 +1,313 @@ +<?php +$type='TrueTypeUnicode'; +$name='DejaVuSerifCondensed'; +$desc=array('Ascent'=>928,'Descent'=>-236,'CapHeight'=>5,'Flags'=>32,'FontBBox'=>'[-692 -347 1511 1242]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>540); +$up=-63; +$ut=44; +$dw=540; +$cw=array( +0=>540,32=>286,33=>361,34=>414,35=>754,36=>572,37=>855,38=>801,39=>247,40=>351, +41=>351,42=>450,43=>754,44=>286,45=>304,46=>286,47=>303,48=>572,49=>572,50=>572, +51=>572,52=>572,53=>572,54=>572,55=>572,56=>572,57=>572,58=>303,59=>303,60=>754, +61=>754,62=>754,63=>482,64=>900,65=>650,66=>661,67=>688,68=>721,69=>657,70=>624, +71=>719,72=>785,73=>355,74=>360,75=>672,76=>598,77=>921,78=>787,79=>738,80=>605, +81=>738,82=>677,83=>616,84=>600,85=>758,86=>650,87=>925,88=>641,89=>594,90=>625, +91=>351,92=>303,93=>351,94=>754,95=>450,96=>450,97=>536,98=>576,99=>504,100=>576, +101=>532,102=>333,103=>576,104=>580,105=>288,106=>279,107=>545,108=>288,109=>853,110=>580, +111=>542,112=>576,113=>576,114=>430,115=>461,116=>361,117=>580,118=>508,119=>770,120=>507, +121=>508,122=>474,123=>572,124=>303,125=>572,126=>754,8364=>572,8218=>286,402=>333,8222=>466, +8230=>900,8224=>450,8225=>450,710=>450,8240=>1208,352=>616,8249=>360,338=>1023,381=>625,8216=>286, +8217=>286,8220=>460,8221=>460,8226=>531,8211=>450,8212=>900,732=>450,8482=>900,353=>461,8250=>360, +339=>890,382=>474,376=>594,160=>286,161=>361,162=>572,163=>572,164=>572,165=>572,166=>303, +167=>450,168=>450,169=>900,170=>427,171=>550,172=>754,173=>304,174=>900,175=>450,176=>450, +177=>754,178=>360,179=>360,180=>450,181=>584,182=>572,183=>286,184=>450,185=>360,186=>423, +187=>550,188=>872,189=>872,190=>872,191=>482,192=>650,193=>650,194=>650,195=>650,196=>650, +197=>650,198=>901,199=>688,200=>657,201=>657,202=>657,203=>657,204=>355,205=>355,206=>355, +207=>355,208=>726,209=>787,210=>738,211=>738,212=>738,213=>738,214=>738,215=>754,216=>738, +217=>758,218=>758,219=>758,220=>758,221=>594,222=>608,223=>601,224=>536,225=>536,226=>536, +227=>536,228=>536,229=>536,230=>846,231=>504,232=>532,233=>532,234=>532,235=>532,236=>288, +237=>288,238=>288,239=>288,240=>542,241=>580,242=>542,243=>542,244=>542,245=>542,246=>542, +247=>754,248=>542,249=>580,250=>580,251=>580,252=>580,253=>508,254=>576,255=>508,256=>650, +257=>536,258=>650,259=>536,260=>650,261=>536,262=>688,263=>504,264=>688,265=>504,266=>688, +267=>504,268=>688,269=>504,270=>721,271=>576,272=>726,273=>576,274=>657,275=>532,276=>657, +277=>532,278=>657,279=>532,280=>657,281=>532,282=>657,283=>532,284=>719,285=>576,286=>719, +287=>576,288=>719,289=>576,290=>719,291=>576,292=>785,293=>580,294=>785,295=>580,296=>355, +297=>288,298=>355,299=>288,300=>355,301=>288,302=>355,303=>288,304=>355,305=>288,306=>721, +307=>479,308=>360,309=>279,310=>672,311=>545,312=>545,313=>598,314=>288,315=>598,316=>288, +317=>598,318=>288,319=>598,320=>288,321=>602,322=>292,323=>787,324=>580,325=>787,326=>580, +327=>787,328=>580,329=>779,330=>758,331=>580,332=>738,333=>542,334=>738,335=>542,336=>738, +337=>542,340=>677,341=>430,342=>677,343=>430,344=>677,345=>430,346=>616,347=>461,348=>616, +349=>461,350=>616,351=>461,354=>600,355=>361,356=>600,357=>361,358=>600,359=>361,360=>758, +361=>580,362=>758,363=>580,364=>758,365=>580,366=>758,367=>580,368=>758,369=>580,370=>758, +371=>580,372=>925,373=>770,374=>594,375=>508,377=>625,378=>474,379=>625,380=>474,383=>333, +384=>576,385=>661,386=>661,387=>576,388=>661,389=>576,390=>688,391=>688,392=>504,393=>726, +394=>721,395=>661,396=>576,397=>542,398=>657,399=>738,400=>561,401=>624,403=>719,404=>641, +405=>839,406=>355,407=>355,408=>672,409=>545,410=>288,411=>570,412=>853,413=>787,414=>580, +415=>738,416=>738,417=>542,418=>936,419=>726,420=>605,421=>576,422=>677,423=>616,424=>461, +425=>636,426=>292,427=>361,428=>600,429=>361,430=>600,431=>758,432=>580,433=>746,434=>684, +435=>664,436=>596,437=>625,438=>474,439=>508,440=>508,441=>508,443=>572,444=>618,445=>508, +446=>482,448=>265,449=>443,450=>413,451=>265,452=>1347,453=>1195,454=>1050,455=>958,456=>876, +457=>567,458=>1148,459=>1066,460=>858,461=>650,462=>536,463=>355,464=>288,465=>738,466=>542, +467=>758,468=>580,469=>758,470=>580,471=>758,472=>580,473=>758,474=>580,475=>758,476=>580, +477=>532,478=>650,479=>536,480=>650,481=>536,482=>901,483=>846,484=>763,485=>576,486=>719, +487=>576,488=>672,489=>545,490=>738,491=>542,492=>738,493=>542,494=>508,495=>508,496=>288, +497=>1347,498=>1195,499=>1050,500=>719,501=>576,502=>1038,504=>787,505=>580,506=>650,507=>536, +508=>901,509=>846,510=>738,511=>542,512=>650,513=>536,514=>650,515=>536,516=>657,517=>532, +518=>657,519=>532,520=>355,521=>288,522=>355,523=>288,524=>738,525=>542,526=>738,527=>542, +528=>677,529=>430,530=>677,531=>430,532=>758,533=>580,534=>758,535=>580,536=>616,537=>461, +538=>600,539=>361,540=>564,541=>469,542=>785,543=>580,544=>758,545=>732,548=>625,549=>474, +550=>650,551=>536,552=>657,553=>532,554=>738,555=>542,556=>738,557=>542,558=>738,559=>542, +560=>738,561=>542,562=>594,563=>508,564=>450,565=>748,566=>444,567=>279,568=>864,569=>864, +570=>650,571=>688,572=>504,573=>598,574=>600,575=>461,576=>474,577=>525,578=>417,581=>650, +592=>536,593=>576,594=>576,595=>576,596=>504,597=>504,598=>582,599=>614,600=>532,601=>532, +602=>759,603=>466,604=>458,605=>695,606=>552,607=>283,608=>615,609=>576,610=>489,611=>641, +612=>507,613=>580,614=>580,615=>580,616=>288,617=>353,618=>288,619=>342,620=>409,621=>326, +622=>633,623=>853,624=>853,625=>853,626=>579,627=>624,628=>581,629=>542,630=>711,631=>583, +632=>542,633=>451,634=>451,635=>496,636=>430,637=>430,638=>407,639=>407,640=>534,641=>534, +642=>461,643=>244,644=>333,645=>438,646=>292,647=>361,648=>361,649=>580,650=>558,651=>547, +652=>508,653=>770,654=>508,655=>589,656=>537,657=>504,658=>508,659=>504,660=>482,661=>482, +662=>482,663=>461,664=>738,665=>506,666=>552,667=>588,668=>600,669=>329,670=>545,671=>581, +672=>615,673=>482,674=>482,675=>896,676=>930,677=>898,678=>728,679=>538,680=>704,681=>804, +682=>582,683=>608,684=>538,685=>398,686=>703,687=>690,688=>389,689=>387,690=>237,691=>312, +692=>312,693=>387,694=>352,695=>527,696=>381,697=>250,699=>286,700=>286,701=>286,702=>276, +703=>276,704=>252,705=>252,711=>450,712=>247,713=>450,716=>247,720=>303,721=>303,722=>276, +723=>276,726=>295,728=>450,729=>450,730=>450,731=>450,733=>450,734=>375,736=>402,737=>218, +738=>303,739=>381,740=>252,741=>444,742=>444,743=>444,744=>444,745=>444,750=>435,768=>0, +769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0, +779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0, +789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0, +799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0, +809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0, +819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0, +829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>666,881=>478,884=>250, +885=>250,890=>450,891=>504,892=>504,893=>504,894=>303,900=>450,901=>450,902=>650,903=>286, +904=>810,905=>935,906=>505,908=>751,910=>808,911=>767,912=>353,913=>650,914=>661,915=>624, +916=>650,917=>657,918=>625,919=>785,920=>738,921=>355,922=>672,923=>650,924=>921,925=>787, +926=>633,927=>738,928=>785,929=>605,931=>636,932=>600,933=>594,934=>738,935=>641,936=>789, +937=>746,938=>355,939=>594,940=>607,941=>466,942=>539,943=>353,944=>547,945=>607,946=>520, +947=>538,948=>542,949=>466,950=>488,951=>539,952=>542,953=>353,954=>563,955=>570,956=>584, +957=>547,958=>496,959=>542,960=>591,961=>529,962=>504,963=>614,964=>498,965=>547,966=>630, +967=>545,968=>706,969=>734,970=>353,971=>547,972=>542,973=>547,974=>734,976=>524,977=>643, +978=>618,979=>787,980=>618,981=>613,982=>734,983=>561,984=>738,985=>542,986=>688,987=>504, +988=>624,989=>417,990=>531,991=>593,992=>704,993=>519,1008=>561,1009=>529,1010=>504,1011=>279, +1012=>738,1013=>504,1014=>504,1015=>608,1016=>576,1017=>688,1018=>921,1019=>637,1020=>529,1021=>688, +1022=>688,1023=>688,1024=>657,1025=>657,1026=>719,1027=>596,1028=>688,1029=>616,1030=>355,1031=>355, +1032=>360,1033=>976,1034=>1006,1035=>785,1036=>696,1037=>785,1038=>650,1039=>785,1040=>681,1041=>661, +1042=>661,1043=>596,1044=>731,1045=>657,1046=>1011,1047=>561,1048=>785,1049=>785,1050=>696,1051=>751, +1052=>921,1053=>785,1054=>738,1055=>785,1056=>605,1057=>688,1058=>600,1059=>650,1060=>747,1061=>641, +1062=>785,1063=>695,1064=>1027,1065=>1027,1066=>715,1067=>885,1068=>606,1069=>688,1070=>1074,1071=>727, +1072=>536,1073=>542,1074=>506,1075=>471,1076=>554,1077=>532,1078=>828,1079=>491,1080=>600,1081=>600, +1082=>563,1083=>571,1084=>700,1085=>600,1086=>542,1087=>600,1088=>576,1089=>504,1090=>498,1091=>529, +1092=>704,1093=>507,1094=>579,1095=>595,1096=>836,1097=>836,1098=>572,1099=>716,1100=>490,1101=>504, +1102=>783,1103=>567,1104=>532,1105=>532,1106=>561,1107=>471,1108=>504,1109=>461,1110=>288,1111=>288, +1112=>279,1113=>759,1114=>774,1115=>580,1116=>563,1117=>600,1118=>529,1119=>590,1122=>686,1123=>542, +1124=>1016,1125=>750,1130=>1011,1131=>828,1136=>849,1137=>812,1138=>738,1139=>497,1140=>773,1141=>610, +1164=>636,1165=>490,1168=>604,1169=>476,1170=>596,1171=>471,1172=>655,1173=>552,1174=>1011,1175=>828, +1176=>572,1177=>483,1178=>696,1179=>545,1182=>696,1183=>563,1184=>801,1185=>645,1186=>785,1187=>577, +1188=>1025,1189=>767,1190=>1084,1191=>847,1194=>688,1195=>504,1196=>600,1197=>498,1198=>594,1199=>508, +1200=>594,1201=>508,1202=>641,1203=>507,1204=>856,1205=>659,1206=>674,1207=>621,1210=>674,1211=>580, +1216=>355,1217=>1011,1218=>828,1219=>672,1220=>545,1223=>785,1224=>600,1227=>674,1228=>600,1231=>288, +1232=>681,1233=>536,1234=>681,1235=>536,1236=>901,1237=>846,1238=>657,1239=>532,1240=>738,1241=>532, +1242=>738,1243=>532,1244=>1011,1245=>828,1246=>561,1247=>491,1248=>508,1249=>508,1250=>785,1251=>600, +1252=>785,1253=>600,1254=>738,1255=>542,1256=>738,1257=>542,1258=>738,1259=>542,1260=>688,1261=>504, +1262=>650,1263=>529,1264=>650,1265=>529,1266=>650,1267=>529,1268=>695,1269=>595,1270=>596,1271=>471, +1272=>885,1273=>716,1296=>561,1297=>491,1298=>751,1299=>571,1300=>1078,1301=>827,1306=>738,1307=>576, +1308=>925,1309=>770,4256=>650,4257=>765,4258=>745,4259=>773,4260=>659,4261=>883,4262=>824,4263=>991, +4264=>510,4265=>675,4266=>866,4267=>847,4268=>668,4269=>967,4270=>807,4271=>746,4272=>936,4273=>660, +4274=>602,4275=>914,4276=>843,4277=>917,4278=>658,4279=>659,4280=>659,4281=>660,4282=>791,4283=>843, +4284=>642,4285=>679,4286=>660,4287=>862,4288=>900,4289=>632,4290=>777,4291=>660,4292=>753,4293=>855, +4304=>486,4305=>514,4306=>530,4307=>750,4308=>505,4309=>501,4310=>556,4311=>774,4312=>503,4313=>491, +4314=>959,4315=>527,4316=>527,4317=>743,4318=>513,4319=>522,4320=>741,4321=>546,4322=>673,4323=>628, +4324=>733,4325=>526,4326=>772,4327=>511,4328=>534,4329=>527,4330=>607,4331=>528,4332=>523,4333=>518, +4334=>550,4335=>615,4336=>514,4337=>542,4338=>514,4339=>514,4340=>513,4341=>584,4342=>797,4343=>563, +4344=>523,4345=>557,4346=>514,4347=>393,4348=>318,7426=>846,7432=>458,7433=>288,7444=>890,7446=>542, +7447=>542,7453=>663,7454=>853,7455=>853,7468=>409,7469=>567,7470=>417,7472=>454,7473=>413,7474=>413, +7475=>453,7476=>494,7477=>224,7478=>227,7479=>423,7480=>376,7481=>580,7482=>496,7483=>496,7484=>464, +7486=>381,7487=>426,7488=>378,7489=>478,7490=>583,7491=>347,7492=>347,7493=>360,7494=>556,7495=>360, +7496=>360,7497=>348,7498=>348,7499=>306,7500=>306,7501=>360,7502=>157,7503=>328,7504=>552,7505=>359, +7506=>347,7507=>312,7508=>347,7509=>347,7510=>360,7511=>222,7512=>359,7513=>417,7514=>552,7515=>335, +7522=>181,7523=>312,7524=>359,7525=>335,7543=>576,7544=>494,7547=>334,7557=>288,7579=>360,7580=>312, +7581=>312,7582=>347,7583=>306,7584=>199,7585=>206,7586=>360,7587=>359,7588=>210,7589=>219,7590=>210, +7591=>210,7592=>207,7593=>158,7594=>157,7595=>330,7596=>552,7597=>552,7598=>366,7599=>364,7600=>359, +7601=>347,7602=>347,7603=>295,7604=>190,7605=>222,7606=>359,7607=>350,7609=>338,7610=>335,7611=>297, +7612=>297,7613=>297,7614=>327,7615=>347,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0, +7680=>650,7681=>536,7682=>661,7683=>576,7684=>661,7685=>576,7686=>661,7687=>576,7688=>688,7689=>504, +7690=>721,7691=>576,7692=>721,7693=>576,7694=>721,7695=>576,7696=>721,7697=>576,7698=>721,7699=>576, +7700=>657,7701=>532,7702=>657,7703=>532,7704=>657,7705=>532,7706=>657,7707=>532,7708=>657,7709=>532, +7710=>624,7711=>333,7712=>719,7713=>576,7714=>785,7715=>580,7716=>785,7717=>580,7718=>785,7719=>580, +7720=>785,7721=>580,7722=>785,7723=>580,7724=>355,7725=>288,7728=>672,7729=>545,7730=>672,7731=>545, +7732=>672,7733=>545,7734=>598,7735=>288,7736=>598,7737=>288,7738=>598,7739=>288,7740=>598,7741=>288, +7742=>921,7743=>853,7744=>921,7745=>853,7746=>921,7747=>853,7748=>787,7749=>580,7750=>787,7751=>580, +7752=>787,7753=>580,7754=>787,7755=>580,7756=>738,7757=>542,7760=>738,7761=>542,7762=>738,7763=>542, +7764=>605,7765=>576,7766=>605,7767=>576,7768=>677,7769=>430,7770=>677,7771=>430,7772=>677,7773=>430, +7774=>677,7775=>430,7776=>616,7777=>461,7778=>616,7779=>461,7784=>616,7785=>461,7786=>600,7787=>361, +7788=>600,7789=>361,7790=>600,7791=>361,7792=>600,7793=>361,7794=>758,7795=>580,7796=>758,7797=>580, +7798=>758,7799=>580,7800=>758,7801=>580,7802=>758,7803=>580,7804=>650,7805=>508,7806=>650,7807=>508, +7808=>925,7809=>770,7810=>925,7811=>770,7812=>925,7813=>770,7814=>925,7815=>770,7816=>925,7817=>770, +7818=>641,7819=>507,7820=>641,7821=>507,7822=>594,7823=>508,7824=>625,7825=>474,7826=>625,7827=>474, +7828=>625,7829=>474,7830=>580,7831=>361,7832=>770,7833=>508,7834=>813,7835=>333,7838=>746,7839=>542, +7840=>650,7841=>536,7842=>650,7843=>536,7852=>650,7853=>536,7854=>650,7855=>536,7856=>650,7857=>536, +7858=>650,7859=>536,7860=>650,7861=>536,7862=>650,7863=>536,7864=>657,7865=>532,7866=>657,7867=>532, +7868=>657,7869=>532,7878=>657,7879=>532,7880=>355,7881=>288,7882=>355,7883=>288,7884=>738,7885=>542, +7886=>738,7887=>542,7896=>738,7897=>542,7908=>758,7909=>580,7910=>758,7911=>580,7922=>594,7923=>508, +7924=>594,7925=>508,7926=>594,7927=>508,7928=>594,7929=>508,7936=>607,7937=>607,7938=>607,7939=>607, +7940=>607,7941=>607,7942=>607,7943=>607,7944=>650,7945=>650,7946=>782,7947=>782,7948=>660,7949=>687, +7950=>650,7951=>650,7952=>483,7953=>483,7954=>483,7955=>483,7956=>483,7957=>483,7960=>768,7961=>757, +7962=>960,7963=>969,7964=>907,7965=>931,7968=>539,7969=>539,7970=>539,7971=>539,7972=>539,7973=>539, +7974=>539,7975=>539,7976=>898,7977=>893,7978=>1090,7979=>1101,7980=>1043,7981=>1064,7982=>988,7983=>985, +7984=>353,7985=>353,7986=>353,7987=>353,7988=>353,7989=>353,7990=>353,7991=>353,7992=>469,7993=>461, +7994=>661,7995=>664,7996=>611,7997=>635,7998=>561,7999=>553,8000=>542,8001=>542,8002=>542,8003=>542, +8004=>542,8005=>542,8008=>738,8009=>773,8010=>1008,8011=>1015,8012=>843,8013=>867,8016=>547,8017=>547, +8018=>547,8019=>547,8020=>547,8021=>547,8022=>547,8023=>547,8025=>765,8027=>971,8029=>939,8031=>857, +8032=>734,8033=>734,8034=>734,8035=>734,8036=>734,8037=>734,8038=>734,8039=>734,8040=>746,8041=>783, +8042=>1018,8043=>1023,8044=>852,8045=>878,8046=>844,8047=>873,8048=>607,8049=>607,8050=>483,8051=>483, +8052=>539,8053=>539,8054=>353,8055=>353,8056=>542,8057=>542,8058=>547,8059=>547,8060=>734,8061=>734, +8064=>607,8065=>607,8066=>607,8067=>607,8068=>607,8069=>607,8070=>607,8071=>607,8072=>650,8073=>650, +8074=>782,8075=>782,8076=>660,8077=>687,8078=>650,8079=>650,8080=>539,8081=>539,8082=>539,8083=>539, +8084=>539,8085=>539,8086=>539,8087=>539,8088=>898,8089=>893,8090=>1090,8091=>1101,8092=>1043,8093=>1064, +8094=>988,8095=>985,8096=>734,8097=>734,8098=>734,8099=>734,8100=>734,8101=>734,8102=>734,8103=>734, +8104=>746,8105=>783,8106=>1018,8107=>1023,8108=>852,8109=>878,8110=>844,8111=>873,8112=>607,8113=>607, +8114=>607,8115=>607,8116=>607,8118=>607,8119=>607,8120=>650,8121=>650,8122=>650,8123=>650,8124=>650, +8125=>450,8126=>450,8127=>450,8128=>450,8129=>450,8130=>539,8131=>539,8132=>539,8134=>539,8135=>539, +8136=>820,8137=>810,8138=>956,8139=>935,8140=>785,8141=>450,8142=>450,8143=>450,8144=>353,8145=>353, +8146=>353,8147=>353,8150=>353,8151=>353,8152=>355,8153=>355,8154=>529,8155=>505,8157=>450,8158=>450, +8159=>450,8160=>547,8161=>547,8162=>547,8163=>547,8164=>529,8165=>529,8166=>547,8167=>547,8168=>594, +8169=>594,8170=>829,8171=>808,8172=>711,8173=>450,8174=>450,8175=>450,8178=>734,8179=>734,8180=>734, +8182=>734,8183=>734,8184=>865,8185=>751,8186=>886,8187=>767,8188=>746,8189=>450,8190=>450,8192=>450, +8193=>900,8194=>450,8195=>900,8196=>296,8197=>225,8198=>150,8199=>572,8200=>286,8201=>180,8202=>89, +8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>304,8209=>304,8210=>572,8213=>900,8214=>450, +8215=>450,8219=>286,8223=>460,8227=>531,8228=>300,8229=>600,8234=>0,8235=>0,8236=>0,8237=>0, +8238=>0,8239=>180,8241=>1560,8242=>204,8243=>336,8244=>468,8245=>204,8246=>336,8247=>468,8248=>305, +8252=>475,8253=>482,8254=>450,8258=>900,8260=>150,8261=>351,8262=>351,8263=>878,8264=>678,8265=>678, +8267=>572,8268=>450,8269=>450,8270=>450,8271=>303,8273=>450,8274=>404,8275=>900,8279=>597,8287=>200, +8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0, +8303=>0,8304=>360,8305=>181,8308=>360,8309=>360,8310=>360,8311=>360,8312=>360,8313=>360,8314=>475, +8315=>475,8316=>475,8317=>221,8318=>221,8319=>389,8320=>360,8321=>360,8322=>360,8323=>360,8324=>360, +8325=>360,8326=>360,8327=>360,8328=>360,8329=>360,8330=>475,8331=>475,8332=>475,8333=>221,8334=>221, +8336=>347,8337=>348,8338=>347,8339=>381,8340=>348,8358=>594,8367=>951,8369=>635,8372=>702,8373=>572, +8450=>716,8451=>1006,8457=>942,8461=>850,8462=>580,8463=>580,8469=>822,8470=>852,8473=>677,8474=>784, +8477=>748,8484=>657,8486=>746,8487=>746,8490=>672,8491=>650,8508=>659,8509=>594,8510=>639,8511=>850, +8512=>642,8513=>697,8514=>501,8515=>501,8516=>549,8517=>780,8518=>629,8519=>572,8520=>342,8521=>325, +8523=>801,8531=>872,8532=>872,8533=>872,8534=>872,8535=>872,8536=>872,8537=>872,8538=>872,8539=>872, +8540=>872,8541=>872,8542=>872,8543=>511,8544=>355,8545=>531,8546=>707,8547=>870,8548=>650,8549=>883, +8550=>1059,8551=>1234,8552=>838,8553=>641,8554=>839,8555=>1015,8556=>598,8557=>688,8558=>721,8559=>921, +8560=>288,8561=>576,8562=>863,8563=>796,8564=>508,8565=>796,8566=>1084,8567=>1372,8568=>795,8569=>507, +8570=>795,8571=>1083,8572=>288,8573=>504,8574=>576,8575=>853,8576=>1085,8577=>721,8578=>1085,8579=>688, +8580=>504,8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754,8598=>754,8599=>754,8600=>754, +8601=>754,8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754,8608=>754,8609=>754,8610=>754, +8611=>754,8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754,8618=>754,8619=>754,8620=>754, +8621=>754,8622=>754,8623=>754,8624=>754,8625=>754,8626=>754,8627=>754,8628=>754,8629=>754,8630=>754, +8631=>754,8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754,8638=>754,8639=>754,8640=>754, +8641=>754,8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754,8648=>754,8649=>754,8650=>754, +8651=>754,8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754,8658=>754,8659=>754,8660=>754, +8661=>754,8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754,8668=>754,8669=>754,8670=>754, +8671=>754,8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754,8678=>754,8679=>754,8680=>754, +8681=>754,8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754,8688=>754,8689=>754,8690=>754, +8691=>754,8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754,8698=>754,8699=>754,8700=>754, +8701=>754,8702=>754,8703=>754,8704=>543,8706=>465,8707=>488,8708=>488,8710=>628,8711=>628,8712=>666, +8713=>666,8715=>666,8716=>666,8719=>716,8720=>716,8721=>642,8722=>754,8723=>754,8724=>754,8725=>303, +8727=>611,8728=>441,8729=>441,8730=>573,8731=>573,8732=>573,8733=>609,8734=>750,8735=>754,8736=>754, +8739=>262,8740=>431,8741=>416,8742=>570,8743=>659,8744=>659,8745=>754,8746=>754,8747=>469,8748=>766, +8749=>1063,8760=>754,8761=>754,8762=>754,8763=>754,8764=>754,8765=>754,8770=>754,8771=>754,8776=>754, +8784=>754,8785=>754,8786=>754,8787=>754,8788=>930,8789=>930,8800=>754,8801=>754,8804=>754,8805=>754, +8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754,8844=>754,8845=>754,8846=>754,8847=>761, +8848=>761,8849=>761,8850=>761,8851=>754,8852=>754,8853=>754,8854=>754,8855=>754,8856=>754,8857=>754, +8858=>754,8859=>754,8860=>754,8861=>754,8862=>754,8863=>754,8864=>754,8865=>754,8866=>773,8867=>773, +8868=>846,8869=>846,8870=>510,8871=>510,8872=>773,8873=>773,8874=>773,8875=>927,8876=>773,8877=>773, +8878=>773,8879=>927,8901=>308,8962=>687,8968=>351,8969=>351,8970=>351,8971=>351,8976=>754,8977=>461, +8984=>900,8985=>754,8992=>469,8993=>469,8997=>900,9000=>1299,9085=>827,9134=>469,9167=>850,9251=>687, +9472=>542,9473=>542,9474=>542,9475=>542,9476=>542,9477=>542,9478=>542,9479=>542,9480=>542,9481=>542, +9482=>542,9483=>542,9484=>542,9485=>542,9486=>542,9487=>542,9488=>542,9489=>542,9490=>542,9491=>542, +9492=>542,9493=>542,9494=>542,9495=>542,9496=>542,9497=>542,9498=>542,9499=>542,9500=>542,9501=>542, +9502=>542,9503=>542,9504=>542,9505=>542,9506=>542,9507=>542,9508=>542,9509=>542,9510=>542,9511=>542, +9512=>542,9513=>542,9514=>542,9515=>542,9516=>542,9517=>542,9518=>542,9519=>542,9520=>542,9521=>542, +9522=>542,9523=>542,9524=>542,9525=>542,9526=>542,9527=>542,9528=>542,9529=>542,9530=>542,9531=>542, +9532=>542,9533=>542,9534=>542,9535=>542,9536=>542,9537=>542,9538=>542,9539=>542,9540=>542,9541=>542, +9542=>542,9543=>542,9544=>542,9545=>542,9546=>542,9547=>542,9548=>542,9549=>542,9550=>542,9551=>542, +9552=>542,9553=>542,9554=>542,9555=>542,9556=>542,9557=>542,9558=>542,9559=>542,9560=>542,9561=>542, +9562=>542,9563=>542,9564=>542,9565=>542,9566=>542,9567=>542,9568=>542,9569=>542,9570=>542,9571=>542, +9572=>542,9573=>542,9574=>542,9575=>542,9576=>542,9577=>542,9578=>542,9579=>542,9580=>542,9581=>542, +9582=>542,9583=>542,9584=>542,9585=>542,9586=>542,9587=>542,9588=>542,9589=>542,9590=>542,9591=>542, +9592=>542,9593=>542,9594=>542,9595=>542,9596=>542,9597=>542,9598=>542,9599=>542,9600=>692,9601=>692, +9602=>692,9603=>692,9604=>692,9605=>692,9606=>692,9607=>692,9608=>692,9609=>692,9610=>692,9611=>692, +9612=>692,9613=>692,9614=>692,9615=>692,9616=>692,9617=>692,9618=>692,9619=>692,9620=>692,9621=>692, +9622=>692,9623=>692,9624=>692,9625=>692,9626=>692,9627=>692,9628=>692,9629=>692,9630=>692,9631=>692, +9632=>850,9633=>850,9634=>850,9635=>850,9636=>850,9637=>850,9638=>850,9639=>850,9640=>850,9641=>850, +9642=>610,9643=>610,9644=>850,9645=>850,9646=>495,9647=>495,9648=>692,9649=>692,9650=>692,9651=>692, +9652=>452,9653=>452,9654=>692,9655=>692,9656=>452,9657=>452,9658=>692,9659=>692,9660=>692,9661=>692, +9662=>452,9663=>452,9664=>692,9665=>692,9666=>452,9667=>452,9668=>692,9669=>692,9670=>692,9671=>692, +9672=>692,9673=>785,9674=>444,9675=>785,9676=>785,9677=>785,9678=>785,9679=>785,9680=>785,9681=>785, +9682=>785,9683=>785,9684=>785,9685=>785,9686=>474,9687=>474,9688=>712,9689=>873,9690=>873,9691=>873, +9692=>348,9693=>348,9694=>348,9695=>348,9696=>785,9697=>785,9698=>692,9699=>692,9700=>692,9701=>692, +9702=>531,9703=>850,9704=>850,9705=>850,9706=>850,9707=>850,9708=>692,9709=>692,9710=>692,9711=>1007, +9712=>850,9713=>850,9714=>850,9715=>850,9716=>785,9717=>785,9718=>785,9719=>785,9720=>692,9721=>692, +9722=>692,9723=>747,9724=>747,9725=>659,9726=>659,9727=>692,9728=>807,9784=>807,9785=>807,9786=>807, +9787=>807,9788=>807,9791=>552,9792=>658,9793=>658,9794=>807,9795=>807,9796=>807,9797=>807,9798=>807, +9799=>807,9824=>807,9825=>807,9826=>807,9827=>807,9828=>807,9829=>807,9830=>807,9831=>807,9833=>424, +9834=>574,9835=>807,9836=>807,9837=>424,9838=>321,9839=>435,10145=>754,10181=>351,10182=>351,10208=>444, +10216=>351,10217=>351,10224=>754,10225=>754,10226=>754,10227=>754,10228=>930,10229=>1290,10230=>1290,10231=>1290, +10232=>1290,10233=>1290,10234=>1290,10235=>1290,10236=>1290,10237=>1290,10238=>1290,10239=>1290,10240=>659,10241=>659, +10242=>659,10243=>659,10244=>659,10245=>659,10246=>659,10247=>659,10248=>659,10249=>659,10250=>659,10251=>659, +10252=>659,10253=>659,10254=>659,10255=>659,10256=>659,10257=>659,10258=>659,10259=>659,10260=>659,10261=>659, +10262=>659,10263=>659,10264=>659,10265=>659,10266=>659,10267=>659,10268=>659,10269=>659,10270=>659,10271=>659, +10272=>659,10273=>659,10274=>659,10275=>659,10276=>659,10277=>659,10278=>659,10279=>659,10280=>659,10281=>659, +10282=>659,10283=>659,10284=>659,10285=>659,10286=>659,10287=>659,10288=>659,10289=>659,10290=>659,10291=>659, +10292=>659,10293=>659,10294=>659,10295=>659,10296=>659,10297=>659,10298=>659,10299=>659,10300=>659,10301=>659, +10302=>659,10303=>659,10304=>659,10305=>659,10306=>659,10307=>659,10308=>659,10309=>659,10310=>659,10311=>659, +10312=>659,10313=>659,10314=>659,10315=>659,10316=>659,10317=>659,10318=>659,10319=>659,10320=>659,10321=>659, +10322=>659,10323=>659,10324=>659,10325=>659,10326=>659,10327=>659,10328=>659,10329=>659,10330=>659,10331=>659, +10332=>659,10333=>659,10334=>659,10335=>659,10336=>659,10337=>659,10338=>659,10339=>659,10340=>659,10341=>659, +10342=>659,10343=>659,10344=>659,10345=>659,10346=>659,10347=>659,10348=>659,10349=>659,10350=>659,10351=>659, +10352=>659,10353=>659,10354=>659,10355=>659,10356=>659,10357=>659,10358=>659,10359=>659,10360=>659,10361=>659, +10362=>659,10363=>659,10364=>659,10365=>659,10366=>659,10367=>659,10368=>659,10369=>659,10370=>659,10371=>659, +10372=>659,10373=>659,10374=>659,10375=>659,10376=>659,10377=>659,10378=>659,10379=>659,10380=>659,10381=>659, +10382=>659,10383=>659,10384=>659,10385=>659,10386=>659,10387=>659,10388=>659,10389=>659,10390=>659,10391=>659, +10392=>659,10393=>659,10394=>659,10395=>659,10396=>659,10397=>659,10398=>659,10399=>659,10400=>659,10401=>659, +10402=>659,10403=>659,10404=>659,10405=>659,10406=>659,10407=>659,10408=>659,10409=>659,10410=>659,10411=>659, +10412=>659,10413=>659,10414=>659,10415=>659,10416=>659,10417=>659,10418=>659,10419=>659,10420=>659,10421=>659, +10422=>659,10423=>659,10424=>659,10425=>659,10426=>659,10427=>659,10428=>659,10429=>659,10430=>659,10431=>659, +10432=>659,10433=>659,10434=>659,10435=>659,10436=>659,10437=>659,10438=>659,10439=>659,10440=>659,10441=>659, +10442=>659,10443=>659,10444=>659,10445=>659,10446=>659,10447=>659,10448=>659,10449=>659,10450=>659,10451=>659, +10452=>659,10453=>659,10454=>659,10455=>659,10456=>659,10457=>659,10458=>659,10459=>659,10460=>659,10461=>659, +10462=>659,10463=>659,10464=>659,10465=>659,10466=>659,10467=>659,10468=>659,10469=>659,10470=>659,10471=>659, +10472=>659,10473=>659,10474=>659,10475=>659,10476=>659,10477=>659,10478=>659,10479=>659,10480=>659,10481=>659, +10482=>659,10483=>659,10484=>659,10485=>659,10486=>659,10487=>659,10488=>659,10489=>659,10490=>659,10491=>659, +10492=>659,10493=>659,10494=>659,10495=>659,10496=>754,10497=>754,10498=>754,10499=>754,10500=>754,10501=>754, +10502=>754,10503=>754,10504=>754,10505=>754,10506=>754,10507=>754,10508=>754,10509=>754,10510=>754,10511=>754, +10512=>754,10513=>754,10514=>754,10515=>754,10516=>754,10517=>754,10518=>754,10519=>754,10520=>754,10521=>754, +10522=>754,10523=>754,10524=>754,10525=>754,10526=>754,10527=>754,10528=>754,10529=>754,10530=>754,10531=>754, +10532=>754,10533=>754,10534=>754,10535=>754,10536=>754,10537=>754,10538=>754,10539=>754,10540=>754,10541=>754, +10542=>754,10543=>754,10544=>754,10545=>754,10546=>754,10547=>754,10548=>754,10549=>754,10550=>754,10551=>754, +10552=>754,10553=>754,10554=>754,10555=>754,10556=>754,10557=>754,10558=>754,10559=>754,10560=>754,10561=>754, +10562=>754,10563=>754,10564=>754,10565=>754,10566=>754,10567=>754,10568=>754,10569=>754,10570=>754,10571=>754, +10572=>754,10573=>754,10574=>754,10575=>754,10576=>754,10577=>754,10578=>754,10579=>754,10580=>754,10581=>754, +10582=>754,10583=>754,10584=>754,10585=>754,10586=>754,10587=>754,10588=>754,10589=>754,10590=>754,10591=>754, +10592=>754,10593=>754,10594=>754,10595=>754,10596=>754,10597=>754,10598=>754,10599=>754,10600=>754,10601=>754, +10602=>754,10603=>754,10604=>754,10605=>754,10606=>754,10607=>754,10608=>754,10609=>754,10610=>754,10611=>754, +10612=>754,10613=>754,10614=>754,10615=>883,10616=>754,10617=>754,10618=>886,10619=>754,10620=>754,10621=>754, +10622=>754,10623=>754,10731=>444,10764=>1361,10765=>469,10766=>469,10799=>754,11008=>754,11009=>754,11010=>754, +11011=>754,11012=>754,11013=>754,11014=>754,11015=>754,11016=>754,11017=>754,11018=>754,11019=>754,11020=>754, +11021=>754,11022=>754,11023=>754,11024=>754,11025=>754,11026=>850,11027=>850,11028=>850,11029=>850,11030=>692, +11031=>692,11032=>692,11033=>692,11034=>850,11364=>677,11367=>785,11368=>580,11369=>672,11370=>545,11371=>625, +11372=>474,11374=>921,11375=>650,11381=>666,11382=>500,11383=>630,11385=>451,11386=>542,11388=>237,11389=>409, +11520=>695,11521=>571,11522=>569,11523=>592,11524=>568,11525=>866,11526=>680,11527=>864,11528=>555,11529=>581, +11530=>866,11531=>568,11532=>581,11533=>866,11534=>580,11535=>779,11536=>865,11537=>580,11538=>580,11539=>863, +11540=>851,11541=>777,11542=>580,11543=>581,11544=>580,11545=>584,11546=>619,11547=>571,11548=>883,11549=>613, +11550=>608,11551=>766,11552=>861,11553=>569,11554=>580,11555=>582,11556=>674,11557=>822,11800=>482,11810=>351, +11811=>351,11812=>351,11813=>351,11822=>482,42564=>616,42565=>461,42566=>355,42567=>353,42576=>994,42577=>799, +42580=>1074,42581=>783,42582=>1025,42583=>809,42760=>444,42761=>444,42762=>444,42763=>444,42764=>444,42765=>444, +42766=>444,42767=>444,42768=>444,42769=>444,42770=>444,42771=>444,42772=>444,42773=>444,42774=>444,42779=>332, +42780=>332,42781=>228,42782=>228,42783=>228,42891=>361,42892=>247,62464=>588,62465=>598,62466=>642,62467=>853, +62468=>598,62469=>593,62470=>652,62471=>888,62472=>598,62473=>598,62474=>1131,62475=>614,62476=>613,62477=>857, +62478=>598,62479=>613,62480=>898,62481=>671,62482=>718,62483=>672,62484=>850,62485=>613,62486=>842,62487=>612, +62488=>619,62489=>613,62490=>655,62491=>613,62492=>619,62493=>599,62494=>656,62495=>795,62496=>598,62497=>635, +62498=>599,62499=>598,62500=>598,62501=>649,62502=>865,62504=>813,63173=>542,63185=>450,63188=>450,64256=>639, +64257=>600,64258=>600,64259=>925,64260=>927,64261=>694,64262=>839,65024=>0,65025=>0,65026=>0,65027=>0, +65028=>0,65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0, +65038=>0,65039=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>923); +$enc=''; +$diff=''; +$file='dejavuserifcondensed.z'; +$ctg='dejavuserifcondensed.ctg.z'; +$originalsize=295840; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensed.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensed.z new file mode 100644 index 0000000..8af7772 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensed.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedb.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedb.ctg.z new file mode 100644 index 0000000..c1a3ccb Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedb.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedb.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedb.php new file mode 100644 index 0000000..46d376b --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedb.php @@ -0,0 +1,299 @@ +<?php +$type='TrueTypeUnicode'; +$name='DejaVuSerifCondensed-Bold'; +$desc=array('Ascent'=>939,'Descent'=>-236,'CapHeight'=>4,'Flags'=>32,'FontBBox'=>'[-752 -389 1616 1235]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>540); +$up=-63; +$ut=44; +$dw=540; +$cw=array( +0=>540,32=>313,33=>395,34=>469,35=>754,36=>626,37=>855,38=>813,39=>275,40=>426, +41=>426,42=>470,43=>754,44=>313,45=>374,46=>313,47=>329,48=>626,49=>626,50=>626, +51=>626,52=>626,53=>626,54=>626,55=>626,56=>626,57=>626,58=>332,59=>332,60=>754, +61=>754,62=>754,63=>527,64=>900,65=>698,66=>760,67=>716,68=>780,69=>686,70=>639, +71=>769,72=>850,73=>421,74=>426,75=>782,76=>633,77=>996,78=>822,79=>784,80=>677, +81=>784,82=>748,83=>650,84=>669,85=>785,86=>698,87=>1011,88=>698,89=>642,90=>657, +91=>426,92=>329,93=>426,94=>754,95=>450,96=>450,97=>583,98=>629,99=>548,100=>629, +101=>572,102=>387,103=>629,104=>654,105=>342,106=>325,107=>624,108=>342,109=>952,110=>654, +111=>600,112=>629,113=>629,114=>474,115=>506,116=>416,117=>654,118=>523,119=>774,120=>536, +121=>523,122=>511,123=>579,124=>327,125=>579,126=>754,8364=>626,8218=>313,402=>387,8222=>518, +8230=>900,8224=>470,8225=>470,710=>450,8240=>1246,352=>650,8249=>360,338=>1062,381=>657,8216=>313, +8217=>313,8220=>518,8221=>518,8226=>575,8211=>450,8212=>900,732=>450,8482=>900,353=>506,8250=>360, +339=>925,382=>511,376=>642,160=>313,161=>395,162=>626,163=>626,164=>572,165=>626,166=>327, +167=>470,168=>450,169=>900,170=>438,171=>563,172=>754,173=>374,174=>900,175=>450,176=>450, +177=>754,178=>394,179=>394,180=>450,181=>659,182=>572,183=>313,184=>450,185=>394,186=>450, +187=>563,188=>938,189=>938,190=>938,191=>527,192=>698,193=>698,194=>698,195=>698,196=>698, +197=>698,198=>931,199=>716,200=>686,201=>686,202=>686,203=>686,204=>421,205=>421,206=>421, +207=>421,208=>787,209=>822,210=>784,211=>784,212=>784,213=>784,214=>784,215=>754,216=>784, +217=>785,218=>785,219=>785,220=>785,221=>642,222=>681,223=>684,224=>583,225=>583,226=>583, +227=>583,228=>583,229=>583,230=>877,231=>548,232=>572,233=>572,234=>572,235=>572,236=>342, +237=>342,238=>342,239=>342,240=>600,241=>654,242=>600,243=>600,244=>600,245=>600,246=>600, +247=>754,248=>600,249=>654,250=>654,251=>654,252=>654,253=>523,254=>629,255=>523,256=>698, +257=>583,258=>698,259=>583,260=>698,261=>583,262=>716,263=>548,264=>716,265=>548,266=>716, +267=>548,268=>716,269=>548,270=>780,271=>629,272=>787,273=>629,274=>686,275=>572,276=>686, +277=>572,278=>686,279=>572,280=>686,281=>572,282=>686,283=>572,284=>769,285=>629,286=>769, +287=>629,288=>769,289=>629,290=>769,291=>629,292=>850,293=>654,294=>850,295=>654,296=>421, +297=>342,298=>421,299=>342,300=>421,301=>342,302=>421,303=>342,304=>421,305=>342,306=>848, +307=>676,308=>426,309=>325,310=>782,311=>624,312=>624,313=>633,314=>342,315=>633,316=>342, +317=>633,318=>342,319=>633,320=>342,321=>639,322=>346,323=>822,324=>654,325=>822,326=>654, +327=>822,328=>654,329=>907,330=>785,331=>654,332=>784,333=>600,334=>784,335=>600,336=>784, +337=>600,340=>748,341=>474,342=>748,343=>474,344=>748,345=>474,346=>650,347=>506,348=>650, +349=>506,350=>650,351=>506,354=>669,355=>416,356=>669,357=>416,358=>669,359=>416,360=>785, +361=>654,362=>785,363=>654,364=>785,365=>654,366=>785,367=>654,368=>785,369=>654,370=>785, +371=>654,372=>1011,373=>774,374=>642,375=>523,377=>657,378=>511,379=>657,380=>511,383=>387, +384=>629,385=>760,386=>769,387=>629,388=>769,389=>629,390=>716,391=>716,392=>548,393=>787, +394=>780,395=>769,396=>629,397=>600,398=>686,399=>784,400=>649,401=>639,403=>769,404=>693, +405=>938,406=>421,407=>421,408=>782,409=>624,410=>342,411=>631,412=>952,413=>822,414=>654, +415=>784,416=>784,417=>600,418=>1080,419=>849,420=>677,421=>629,422=>748,423=>650,424=>506, +425=>636,426=>298,427=>416,428=>669,429=>416,430=>669,431=>785,432=>654,433=>801,434=>801, +435=>642,436=>637,437=>657,438=>511,439=>591,440=>591,441=>591,443=>626,444=>678,445=>511, +446=>482,448=>265,449=>443,450=>413,451=>265,452=>1437,453=>1292,454=>1140,455=>1059,456=>958, +457=>667,458=>1248,459=>1148,460=>980,461=>698,462=>583,463=>421,464=>342,465=>784,466=>600, +467=>785,468=>654,469=>785,470=>654,471=>785,472=>654,473=>785,474=>654,475=>785,476=>654, +477=>572,478=>698,479=>583,480=>698,481=>583,482=>931,483=>877,484=>806,485=>629,486=>769, +487=>629,488=>782,489=>624,490=>784,491=>600,492=>784,493=>600,494=>591,495=>511,496=>342, +497=>1437,498=>1292,499=>1140,500=>769,501=>629,502=>1099,504=>822,505=>654,506=>698,507=>583, +508=>931,509=>877,510=>784,511=>600,512=>698,513=>583,514=>698,515=>583,516=>686,517=>572, +518=>686,519=>572,520=>421,521=>342,522=>421,523=>342,524=>784,525=>600,526=>784,527=>600, +528=>748,529=>474,530=>748,531=>474,532=>785,533=>654,534=>785,535=>654,536=>650,537=>506, +538=>669,539=>416,540=>621,541=>546,542=>850,543=>654,544=>785,545=>711,548=>657,549=>511, +550=>698,551=>583,552=>686,553=>572,554=>784,555=>600,556=>784,557=>600,558=>784,559=>600, +560=>784,561=>600,562=>642,563=>523,564=>516,565=>830,566=>508,567=>325,568=>928,569=>928, +570=>698,571=>716,572=>548,573=>633,574=>669,575=>506,576=>511,577=>594,578=>492,581=>698, +592=>583,593=>629,594=>629,595=>629,596=>548,597=>548,598=>629,599=>657,600=>572,601=>572, +602=>816,603=>547,604=>505,605=>816,606=>647,607=>348,608=>629,609=>629,610=>563,611=>641, +612=>564,613=>654,614=>654,615=>654,616=>342,617=>342,618=>342,619=>368,620=>462,621=>342, +622=>716,623=>952,624=>952,625=>952,626=>654,627=>654,628=>641,629=>600,630=>955,631=>674, +632=>600,633=>514,634=>514,635=>514,636=>474,637=>474,638=>406,639=>438,640=>721,641=>721, +642=>506,643=>298,644=>387,645=>486,646=>298,647=>443,648=>416,649=>654,650=>611,651=>624, +652=>577,653=>816,654=>571,655=>654,656=>511,657=>511,658=>511,659=>511,660=>482,661=>482, +662=>482,663=>490,664=>784,665=>625,666=>647,667=>563,668=>659,669=>345,670=>666,671=>581, +672=>629,673=>482,674=>482,675=>1005,676=>1061,677=>1005,678=>819,679=>643,680=>817,681=>935, +682=>711,683=>716,684=>596,685=>398,686=>552,687=>646,688=>469,689=>466,690=>282,691=>372, +692=>372,693=>432,694=>474,695=>595,696=>436,697=>271,699=>313,700=>313,701=>313,702=>330, +703=>330,704=>282,705=>282,711=>450,712=>254,713=>450,716=>254,720=>332,721=>332,722=>330, +723=>330,726=>353,728=>450,729=>450,730=>450,731=>450,733=>450,734=>375,736=>412,737=>263, +738=>355,739=>427,740=>282,741=>450,742=>450,743=>450,744=>450,745=>450,750=>498,768=>0, +769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0, +779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0, +789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0, +799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0, +809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0, +819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0, +829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>701,881=>519,884=>271, +885=>271,890=>450,891=>548,892=>548,893=>548,894=>332,900=>450,901=>450,902=>698,903=>313, +904=>852,905=>1006,906=>595,908=>798,910=>857,911=>820,912=>435,913=>698,914=>760,915=>639, +916=>698,917=>686,918=>657,919=>850,920=>784,921=>421,922=>782,923=>698,924=>996,925=>822, +926=>633,927=>784,928=>850,929=>677,931=>636,932=>669,933=>642,934=>784,935=>698,936=>822, +937=>801,938=>421,939=>642,940=>692,941=>547,942=>654,943=>435,944=>624,945=>692,946=>598, +947=>594,948=>600,949=>547,950=>533,951=>654,952=>600,953=>435,954=>674,955=>631,956=>659, +957=>624,958=>533,959=>600,960=>659,961=>598,962=>548,963=>664,964=>605,965=>624,966=>814, +967=>592,968=>847,969=>857,970=>435,971=>624,972=>600,973=>624,974=>857,976=>600,977=>764, +978=>687,979=>872,980=>687,981=>847,982=>857,983=>589,984=>784,985=>600,986=>716,987=>548, +988=>639,989=>475,990=>531,991=>593,992=>716,993=>600,1008=>589,1009=>598,1010=>548,1011=>325, +1012=>784,1013=>548,1014=>548,1015=>681,1016=>629,1017=>716,1018=>996,1019=>774,1020=>623,1021=>716, +1022=>716,1023=>716,1024=>686,1025=>686,1026=>811,1027=>621,1028=>716,1029=>650,1030=>421,1031=>421, +1032=>426,1033=>1081,1034=>1135,1035=>866,1036=>818,1037=>850,1038=>730,1039=>850,1040=>733,1041=>769, +1042=>760,1043=>621,1044=>800,1045=>686,1046=>1181,1047=>649,1048=>850,1049=>850,1050=>818,1051=>795, +1052=>996,1053=>850,1054=>784,1055=>850,1056=>677,1057=>716,1058=>669,1059=>730,1060=>854,1061=>698, +1062=>870,1063=>822,1064=>1141,1065=>1164,1066=>861,1067=>1081,1068=>743,1069=>716,1070=>1158,1071=>793, +1072=>583,1073=>600,1074=>625,1075=>551,1076=>600,1077=>572,1078=>909,1079=>574,1080=>667,1081=>667, +1082=>650,1083=>634,1084=>782,1085=>659,1086=>600,1087=>659,1088=>629,1089=>548,1090=>558,1091=>576, +1092=>812,1093=>536,1094=>665,1095=>659,1096=>967,1097=>974,1098=>690,1099=>902,1100=>611,1101=>548, +1102=>923,1103=>665,1104=>572,1105=>572,1106=>646,1107=>551,1108=>548,1109=>506,1110=>342,1111=>342, +1112=>325,1113=>889,1114=>913,1115=>654,1116=>650,1117=>667,1118=>576,1119=>659,1122=>792,1123=>633, +1124=>1076,1125=>867,1130=>1181,1131=>909,1136=>986,1137=>995,1138=>784,1139=>587,1140=>824,1141=>673, +1164=>761,1165=>606,1168=>630,1169=>556,1170=>621,1171=>551,1172=>781,1173=>645,1174=>1181,1175=>909, +1176=>649,1177=>574,1178=>852,1179=>669,1182=>818,1183=>650,1184=>937,1185=>744,1186=>870,1187=>665, +1188=>1050,1189=>860,1190=>1210,1191=>953,1194=>716,1195=>548,1196=>669,1197=>558,1198=>642,1199=>523, +1200=>642,1201=>523,1202=>779,1203=>584,1204=>919,1205=>726,1206=>835,1207=>665,1210=>819,1211=>654, +1216=>421,1217=>1181,1218=>909,1219=>782,1220=>624,1223=>850,1224=>659,1227=>822,1228=>659,1231=>342, +1232=>733,1233=>583,1234=>733,1235=>583,1236=>931,1237=>877,1238=>686,1239=>572,1240=>784,1241=>572, +1242=>784,1243=>572,1244=>1181,1245=>909,1246=>649,1247=>574,1248=>591,1249=>511,1250=>850,1251=>667, +1252=>850,1253=>667,1254=>784,1255=>600,1256=>784,1257=>600,1258=>784,1259=>600,1260=>716,1261=>548, +1262=>730,1263=>576,1264=>730,1265=>576,1266=>730,1267=>576,1268=>822,1269=>659,1270=>621,1271=>551, +1272=>1081,1273=>902,1296=>649,1297=>574,1298=>795,1299=>634,1300=>1123,1301=>851,1306=>738,1307=>576, +1308=>925,1309=>770,4256=>680,4257=>842,4258=>779,4259=>787,4260=>703,4261=>970,4262=>913,4263=>1091, +4264=>579,4265=>736,4266=>946,4267=>945,4268=>716,4269=>1021,4270=>872,4271=>812,4272=>998,4273=>712, +4274=>680,4275=>968,4276=>878,4277=>959,4278=>729,4279=>750,4280=>739,4281=>750,4282=>817,4283=>969, +4284=>692,4285=>739,4286=>731,4287=>1000,4288=>1010,4289=>721,4290=>803,4291=>722,4292=>792,4293=>957, +4304=>535,4305=>563,4306=>579,4307=>798,4308=>553,4309=>549,4310=>600,4311=>823,4312=>552,4313=>540, +4314=>1008,4315=>576,4316=>576,4317=>791,4318=>561,4319=>571,4320=>790,4321=>599,4322=>702,4323=>676, +4324=>782,4325=>575,4326=>820,4327=>559,4328=>583,4329=>576,4330=>656,4331=>577,4332=>567,4333=>566, +4334=>603,4335=>678,4336=>563,4337=>591,4338=>563,4339=>563,4340=>562,4341=>603,4342=>846,4343=>612, +4344=>572,4345=>605,4346=>562,4347=>529,4348=>318,7426=>846,7432=>458,7433=>288,7444=>890,7446=>600, +7447=>600,7453=>663,7454=>853,7455=>853,7468=>439,7469=>586,7470=>479,7472=>491,7473=>432,7474=>432, +7475=>483,7476=>536,7477=>265,7478=>268,7479=>492,7480=>398,7481=>627,7482=>518,7483=>518,7484=>493, +7486=>426,7487=>471,7488=>409,7489=>422,7490=>494,7491=>419,7492=>419,7493=>448,7494=>591,7495=>448, +7496=>448,7497=>400,7498=>400,7499=>370,7500=>370,7501=>448,7502=>270,7503=>471,7504=>655,7505=>426, +7506=>420,7507=>384,7508=>420,7509=>420,7510=>448,7511=>333,7512=>468,7513=>390,7514=>655,7515=>442, +7522=>215,7523=>372,7524=>468,7525=>442,7543=>576,7544=>536,7547=>342,7557=>342,7579=>448,7580=>384, +7581=>384,7582=>420,7583=>370,7584=>345,7585=>335,7586=>448,7587=>470,7588=>270,7589=>276,7590=>270, +7591=>270,7592=>333,7593=>331,7594=>289,7595=>387,7596=>613,7597=>655,7598=>529,7599=>528,7600=>425, +7601=>420,7602=>470,7603=>360,7604=>348,7605=>333,7606=>468,7607=>427,7609=>439,7610=>442,7611=>371, +7612=>474,7613=>371,7614=>407,7615=>420,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0, +7680=>698,7681=>583,7682=>760,7683=>629,7684=>760,7685=>629,7686=>760,7687=>629,7688=>716,7689=>548, +7690=>780,7691=>629,7692=>780,7693=>629,7694=>780,7695=>629,7696=>780,7697=>629,7698=>780,7699=>629, +7700=>686,7701=>572,7702=>686,7703=>572,7704=>686,7705=>572,7706=>686,7707=>572,7708=>686,7709=>572, +7710=>639,7711=>387,7712=>769,7713=>629,7714=>850,7715=>654,7716=>850,7717=>654,7718=>850,7719=>654, +7720=>850,7721=>654,7722=>850,7723=>654,7724=>421,7725=>342,7728=>782,7729=>624,7730=>782,7731=>624, +7732=>782,7733=>624,7734=>633,7735=>342,7736=>633,7737=>342,7738=>633,7739=>342,7740=>633,7741=>342, +7742=>996,7743=>952,7744=>996,7745=>952,7746=>996,7747=>952,7748=>822,7749=>654,7750=>822,7751=>654, +7752=>822,7753=>654,7754=>822,7755=>654,7756=>784,7757=>600,7760=>784,7761=>600,7762=>784,7763=>600, +7764=>677,7765=>629,7766=>677,7767=>629,7768=>748,7769=>474,7770=>748,7771=>474,7772=>748,7773=>474, +7774=>748,7775=>474,7776=>650,7777=>506,7778=>650,7779=>506,7784=>650,7785=>506,7786=>669,7787=>416, +7788=>669,7789=>416,7790=>669,7791=>416,7792=>669,7793=>416,7794=>785,7795=>654,7796=>785,7797=>654, +7798=>785,7799=>654,7800=>785,7801=>654,7802=>785,7803=>654,7804=>698,7805=>523,7806=>698,7807=>523, +7808=>1011,7809=>774,7810=>1011,7811=>774,7812=>1011,7813=>774,7814=>1011,7815=>774,7816=>1011,7817=>774, +7818=>698,7819=>536,7820=>698,7821=>536,7822=>642,7823=>523,7824=>657,7825=>511,7826=>657,7827=>511, +7828=>657,7829=>511,7830=>654,7831=>416,7832=>774,7833=>523,7834=>913,7835=>387,7838=>852,7839=>600, +7840=>698,7841=>583,7842=>698,7843=>583,7852=>698,7853=>583,7854=>698,7855=>583,7856=>698,7857=>583, +7858=>698,7859=>583,7860=>698,7861=>583,7862=>698,7863=>583,7864=>686,7865=>572,7866=>686,7867=>572, +7868=>686,7869=>572,7878=>686,7879=>572,7880=>421,7881=>342,7882=>421,7883=>342,7884=>784,7885=>600, +7886=>784,7887=>600,7896=>784,7897=>600,7908=>785,7909=>654,7910=>785,7911=>654,7922=>642,7923=>523, +7924=>642,7925=>523,7926=>642,7927=>523,7928=>642,7929=>523,7936=>692,7937=>692,7938=>692,7939=>692, +7940=>692,7941=>692,7942=>692,7943=>692,7944=>698,7945=>698,7946=>880,7947=>880,7948=>748,7949=>764, +7950=>698,7951=>698,7952=>547,7953=>547,7954=>547,7955=>547,7956=>547,7957=>547,7960=>826,7961=>817, +7962=>1052,7963=>1052,7964=>984,7965=>1007,7968=>654,7969=>654,7970=>654,7971=>654,7972=>654,7973=>654, +7974=>654,7975=>654,7976=>990,7977=>984,7978=>1222,7979=>1225,7980=>1151,7981=>1177,7982=>1077,7983=>1074, +7984=>435,7985=>435,7986=>435,7987=>435,7988=>435,7989=>435,7990=>435,7991=>435,7992=>566,7993=>555, +7994=>790,7995=>792,7996=>719,7997=>748,7998=>650,7999=>642,8000=>600,8001=>600,8002=>600,8003=>600, +8004=>600,8005=>600,8008=>810,8009=>841,8010=>1116,8011=>1113,8012=>931,8013=>959,8016=>624,8017=>624, +8018=>624,8019=>624,8020=>624,8021=>624,8022=>624,8023=>624,8025=>830,8027=>1067,8029=>1020,8031=>917, +8032=>857,8033=>857,8034=>857,8035=>857,8036=>857,8037=>857,8038=>857,8039=>857,8040=>838,8041=>867, +8042=>1141,8043=>1146,8044=>949,8045=>979,8046=>920,8047=>954,8048=>692,8049=>692,8050=>547,8051=>547, +8052=>654,8053=>654,8054=>435,8055=>435,8056=>600,8057=>600,8058=>624,8059=>624,8060=>857,8061=>857, +8064=>692,8065=>692,8066=>692,8067=>692,8068=>692,8069=>692,8070=>692,8071=>692,8072=>698,8073=>698, +8074=>880,8075=>880,8076=>748,8077=>764,8078=>698,8079=>698,8080=>654,8081=>654,8082=>654,8083=>654, +8084=>654,8085=>654,8086=>654,8087=>654,8088=>990,8089=>984,8090=>1222,8091=>1225,8092=>1151,8093=>1177, +8094=>1077,8095=>1074,8096=>857,8097=>857,8098=>857,8099=>857,8100=>857,8101=>857,8102=>857,8103=>857, +8104=>838,8105=>867,8106=>1141,8107=>1146,8108=>949,8109=>979,8110=>920,8111=>954,8112=>692,8113=>692, +8114=>692,8115=>692,8116=>692,8118=>692,8119=>692,8120=>698,8121=>698,8122=>729,8123=>698,8124=>698, +8125=>450,8126=>450,8127=>450,8128=>450,8129=>450,8130=>654,8131=>654,8132=>654,8134=>654,8135=>654, +8136=>899,8137=>852,8138=>1072,8139=>1006,8140=>850,8141=>450,8142=>450,8143=>450,8144=>435,8145=>435, +8146=>435,8147=>435,8150=>435,8151=>435,8152=>421,8153=>421,8154=>642,8155=>595,8157=>450,8158=>450, +8159=>450,8160=>624,8161=>624,8162=>624,8163=>624,8164=>598,8165=>598,8166=>624,8167=>624,8168=>642, +8169=>642,8170=>917,8171=>857,8172=>819,8173=>450,8174=>450,8175=>450,8178=>857,8179=>857,8180=>857, +8182=>857,8183=>857,8184=>962,8185=>798,8186=>991,8187=>820,8188=>801,8189=>450,8190=>450,8192=>450, +8193=>900,8194=>450,8195=>900,8196=>296,8197=>225,8198=>150,8199=>626,8200=>313,8201=>180,8202=>89, +8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>374,8209=>374,8210=>626,8213=>900,8214=>450, +8215=>450,8219=>313,8223=>518,8227=>575,8228=>313,8229=>606,8234=>0,8235=>0,8236=>0,8237=>0, +8238=>0,8239=>180,8241=>1638,8242=>237,8243=>402,8244=>567,8245=>237,8246=>402,8247=>567,8248=>659, +8252=>566,8253=>527,8254=>450,8258=>920,8260=>150,8261=>426,8262=>426,8263=>974,8264=>770,8265=>770, +8267=>572,8268=>450,8269=>450,8270=>470,8271=>332,8273=>470,8274=>500,8275=>900,8279=>731,8287=>200, +8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0, +8303=>0,8304=>394,8305=>215,8308=>394,8309=>394,8310=>394,8311=>394,8312=>394,8313=>394,8314=>475, +8315=>475,8316=>475,8317=>268,8318=>268,8319=>467,8320=>394,8321=>394,8322=>394,8323=>394,8324=>394, +8325=>394,8326=>394,8327=>394,8328=>394,8329=>394,8330=>475,8331=>475,8332=>475,8333=>268,8334=>268, +8336=>419,8337=>400,8338=>420,8339=>427,8340=>400,8358=>626,8367=>1039,8369=>710,8372=>788,8373=>626, +8451=>1078,8457=>1001,8462=>654,8463=>654,8470=>978,8486=>801,8487=>801,8490=>782,8491=>698,8513=>697, +8514=>501,8515=>573,8516=>684,8523=>813,8531=>932,8532=>932,8533=>932,8534=>932,8535=>932,8536=>932, +8537=>932,8538=>932,8539=>932,8540=>932,8541=>932,8542=>932,8543=>554,8544=>421,8545=>663,8546=>904, +8547=>984,8548=>698,8549=>1014,8550=>1256,8551=>1498,8552=>962,8553=>698,8554=>970,8555=>1212,8556=>633, +8557=>716,8558=>780,8559=>996,8560=>342,8561=>684,8562=>1025,8563=>865,8564=>523,8565=>865,8566=>1207, +8567=>1548,8568=>878,8569=>536,8570=>878,8571=>1220,8572=>342,8573=>548,8574=>629,8575=>952,8576=>1129, +8577=>780,8578=>1141,8579=>716,8580=>548,8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754, +8598=>754,8599=>754,8600=>754,8601=>754,8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754, +8608=>754,8609=>754,8610=>754,8611=>754,8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754, +8618=>754,8619=>754,8620=>754,8621=>754,8622=>754,8623=>765,8624=>754,8625=>754,8626=>754,8627=>754, +8628=>754,8629=>754,8630=>754,8631=>754,8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754, +8638=>754,8639=>754,8640=>754,8641=>754,8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754, +8648=>754,8649=>754,8650=>754,8651=>754,8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754, +8658=>754,8659=>754,8660=>754,8661=>754,8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754, +8668=>754,8669=>754,8670=>754,8671=>754,8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754, +8678=>754,8679=>754,8680=>754,8681=>754,8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754, +8688=>754,8689=>754,8690=>754,8691=>754,8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754, +8698=>754,8699=>754,8700=>754,8701=>754,8702=>754,8703=>754,8704=>577,8706=>480,8707=>558,8708=>558, +8710=>677,8711=>677,8712=>666,8713=>666,8715=>666,8716=>666,8719=>757,8720=>757,8721=>677,8722=>754, +8723=>754,8724=>754,8725=>329,8727=>622,8728=>466,8729=>466,8730=>591,8731=>591,8732=>591,8733=>604, +8734=>750,8735=>754,8736=>754,8739=>292,8740=>546,8741=>476,8742=>696,8743=>730,8744=>730,8745=>754, +8746=>754,8747=>521,8748=>900,8749=>1252,8760=>754,8761=>754,8762=>754,8763=>754,8764=>754,8765=>754, +8770=>754,8771=>754,8776=>754,8784=>754,8785=>754,8786=>754,8787=>754,8788=>974,8789=>974,8800=>754, +8801=>754,8804=>754,8805=>754,8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754,8844=>754, +8845=>754,8846=>754,8847=>754,8848=>754,8849=>754,8850=>754,8851=>754,8852=>754,8853=>754,8854=>754, +8855=>754,8856=>754,8857=>754,8858=>754,8859=>754,8860=>754,8861=>754,8862=>754,8863=>754,8864=>754, +8865=>754,8866=>795,8867=>795,8868=>864,8869=>864,8870=>554,8871=>554,8872=>795,8873=>795,8874=>795, +8875=>971,8876=>795,8877=>795,8878=>795,8879=>971,8901=>358,8962=>751,8968=>426,8969=>426,8970=>426, +8971=>426,8976=>754,8977=>484,8984=>835,8985=>754,8992=>521,8993=>521,8997=>900,9000=>1299,9085=>907, +9134=>521,9167=>850,9251=>751,9600=>692,9601=>692,9602=>692,9603=>692,9604=>692,9605=>692,9606=>692, +9607=>692,9608=>692,9609=>692,9610=>692,9611=>692,9612=>692,9613=>692,9614=>692,9615=>692,9616=>692, +9617=>692,9618=>692,9619=>692,9620=>692,9621=>692,9622=>692,9623=>692,9624=>692,9625=>692,9626=>692, +9627=>692,9628=>692,9629=>692,9630=>692,9631=>692,9632=>850,9633=>850,9634=>850,9635=>850,9636=>850, +9637=>850,9638=>850,9639=>850,9640=>850,9641=>850,9642=>610,9643=>610,9644=>850,9645=>850,9646=>495, +9647=>495,9648=>692,9649=>692,9650=>692,9651=>692,9652=>452,9653=>452,9654=>692,9655=>692,9656=>452, +9657=>452,9658=>692,9659=>692,9660=>692,9661=>692,9662=>452,9663=>452,9664=>692,9665=>692,9666=>452, +9667=>452,9668=>692,9669=>692,9670=>692,9671=>692,9672=>692,9673=>785,9674=>444,9675=>785,9676=>785, +9677=>785,9678=>785,9679=>785,9680=>785,9681=>785,9682=>785,9683=>785,9684=>785,9685=>785,9686=>474, +9687=>474,9688=>712,9689=>873,9690=>873,9691=>873,9692=>348,9693=>348,9694=>348,9695=>348,9696=>785, +9697=>785,9698=>692,9699=>692,9700=>692,9701=>692,9702=>531,9703=>850,9704=>850,9705=>850,9706=>850, +9707=>850,9708=>692,9709=>692,9710=>692,9711=>1007,9712=>850,9713=>850,9714=>850,9715=>850,9716=>785, +9717=>785,9718=>785,9719=>785,9720=>692,9721=>692,9722=>692,9723=>747,9724=>747,9725=>659,9726=>659, +9727=>692,9728=>807,9784=>807,9785=>807,9786=>807,9787=>807,9788=>807,9791=>552,9792=>658,9793=>658, +9794=>807,9795=>807,9796=>807,9797=>807,9798=>807,9799=>807,9824=>807,9825=>807,9826=>807,9827=>807, +9828=>807,9829=>807,9830=>807,9831=>807,9833=>424,9834=>574,9835=>807,9836=>807,9837=>424,9838=>321, +9839=>435,10145=>754,10181=>411,10182=>411,10208=>444,10216=>411,10217=>411,10224=>754,10225=>754,10226=>754, +10227=>754,10228=>930,10229=>1290,10230=>1290,10231=>1290,10232=>1290,10233=>1290,10234=>1290,10235=>1290,10236=>1290, +10237=>1290,10238=>1290,10239=>1290,10240=>703,10241=>703,10242=>703,10243=>703,10244=>703,10245=>703,10246=>703, +10247=>703,10248=>703,10249=>703,10250=>703,10251=>703,10252=>703,10253=>703,10254=>703,10255=>703,10256=>703, +10257=>703,10258=>703,10259=>703,10260=>703,10261=>703,10262=>703,10263=>703,10264=>703,10265=>703,10266=>703, +10267=>703,10268=>703,10269=>703,10270=>703,10271=>703,10272=>703,10273=>703,10274=>703,10275=>703,10276=>703, +10277=>703,10278=>703,10279=>703,10280=>703,10281=>703,10282=>703,10283=>703,10284=>703,10285=>703,10286=>703, +10287=>703,10288=>703,10289=>703,10290=>703,10291=>703,10292=>703,10293=>703,10294=>703,10295=>703,10296=>703, +10297=>703,10298=>703,10299=>703,10300=>703,10301=>703,10302=>703,10303=>703,10304=>703,10305=>703,10306=>703, +10307=>703,10308=>703,10309=>703,10310=>703,10311=>703,10312=>703,10313=>703,10314=>703,10315=>703,10316=>703, +10317=>703,10318=>703,10319=>703,10320=>703,10321=>703,10322=>703,10323=>703,10324=>703,10325=>703,10326=>703, +10327=>703,10328=>703,10329=>703,10330=>703,10331=>703,10332=>703,10333=>703,10334=>703,10335=>703,10336=>703, +10337=>703,10338=>703,10339=>703,10340=>703,10341=>703,10342=>703,10343=>703,10344=>703,10345=>703,10346=>703, +10347=>703,10348=>703,10349=>703,10350=>703,10351=>703,10352=>703,10353=>703,10354=>703,10355=>703,10356=>703, +10357=>703,10358=>703,10359=>703,10360=>703,10361=>703,10362=>703,10363=>703,10364=>703,10365=>703,10366=>703, +10367=>703,10368=>703,10369=>703,10370=>703,10371=>703,10372=>703,10373=>703,10374=>703,10375=>703,10376=>703, +10377=>703,10378=>703,10379=>703,10380=>703,10381=>703,10382=>703,10383=>703,10384=>703,10385=>703,10386=>703, +10387=>703,10388=>703,10389=>703,10390=>703,10391=>703,10392=>703,10393=>703,10394=>703,10395=>703,10396=>703, +10397=>703,10398=>703,10399=>703,10400=>703,10401=>703,10402=>703,10403=>703,10404=>703,10405=>703,10406=>703, +10407=>703,10408=>703,10409=>703,10410=>703,10411=>703,10412=>703,10413=>703,10414=>703,10415=>703,10416=>703, +10417=>703,10418=>703,10419=>703,10420=>703,10421=>703,10422=>703,10423=>703,10424=>703,10425=>703,10426=>703, +10427=>703,10428=>703,10429=>703,10430=>703,10431=>703,10432=>703,10433=>703,10434=>703,10435=>703,10436=>703, +10437=>703,10438=>703,10439=>703,10440=>703,10441=>703,10442=>703,10443=>703,10444=>703,10445=>703,10446=>703, +10447=>703,10448=>703,10449=>703,10450=>703,10451=>703,10452=>703,10453=>703,10454=>703,10455=>703,10456=>703, +10457=>703,10458=>703,10459=>703,10460=>703,10461=>703,10462=>703,10463=>703,10464=>703,10465=>703,10466=>703, +10467=>703,10468=>703,10469=>703,10470=>703,10471=>703,10472=>703,10473=>703,10474=>703,10475=>703,10476=>703, +10477=>703,10478=>703,10479=>703,10480=>703,10481=>703,10482=>703,10483=>703,10484=>703,10485=>703,10486=>703, +10487=>703,10488=>703,10489=>703,10490=>703,10491=>703,10492=>703,10493=>703,10494=>703,10495=>703,10496=>754, +10497=>754,10498=>754,10499=>754,10500=>754,10501=>754,10502=>754,10503=>754,10504=>754,10505=>754,10506=>754, +10507=>754,10508=>754,10509=>754,10510=>754,10511=>754,10512=>754,10513=>754,10514=>754,10515=>754,10516=>754, +10517=>754,10518=>754,10519=>754,10520=>754,10521=>754,10522=>754,10523=>754,10524=>754,10525=>754,10526=>754, +10527=>754,10528=>754,10529=>754,10530=>754,10531=>754,10532=>754,10533=>754,10534=>754,10535=>754,10536=>754, +10537=>754,10538=>754,10539=>754,10540=>754,10541=>754,10542=>754,10543=>754,10544=>754,10545=>754,10546=>754, +10547=>754,10548=>754,10549=>754,10550=>754,10551=>754,10552=>754,10553=>754,10554=>754,10555=>754,10556=>754, +10557=>754,10558=>754,10559=>754,10560=>754,10561=>754,10562=>754,10563=>754,10564=>754,10565=>754,10566=>754, +10567=>754,10568=>754,10569=>754,10570=>754,10571=>754,10572=>754,10573=>754,10574=>754,10575=>754,10576=>754, +10577=>754,10578=>754,10579=>754,10580=>754,10581=>754,10582=>754,10583=>754,10584=>754,10585=>754,10586=>754, +10587=>754,10588=>754,10589=>754,10590=>754,10591=>754,10592=>754,10593=>754,10594=>754,10595=>754,10596=>754, +10597=>754,10598=>754,10599=>754,10600=>754,10601=>754,10602=>754,10603=>754,10604=>754,10605=>754,10606=>754, +10607=>754,10608=>754,10609=>754,10610=>754,10611=>754,10612=>754,10613=>754,10614=>754,10615=>929,10616=>754, +10617=>754,10618=>864,10619=>754,10620=>754,10621=>754,10622=>754,10623=>754,10731=>444,10764=>1604,10765=>549, +10766=>549,10799=>754,11008=>754,11009=>754,11010=>754,11011=>754,11012=>754,11013=>754,11014=>754,11015=>754, +11016=>754,11017=>754,11018=>754,11019=>754,11020=>754,11021=>754,11022=>754,11023=>754,11024=>754,11025=>754, +11026=>850,11027=>850,11028=>850,11029=>850,11030=>692,11031=>692,11032=>692,11033=>692,11034=>850,11364=>748, +11367=>850,11368=>654,11369=>782,11370=>624,11371=>657,11372=>511,11374=>996,11375=>698,11381=>701,11382=>541, +11383=>814,11385=>514,11386=>600,11388=>282,11389=>439,11520=>695,11521=>571,11522=>723,11523=>592,11524=>708, +11525=>866,11526=>680,11527=>864,11528=>555,11529=>581,11530=>866,11531=>567,11532=>581,11533=>866,11534=>761, +11535=>779,11536=>865,11537=>580,11538=>580,11539=>863,11540=>851,11541=>777,11542=>580,11543=>581,11544=>580, +11545=>584,11546=>619,11547=>842,11548=>883,11549=>613,11550=>608,11551=>766,11552=>1002,11553=>569,11554=>580, +11555=>582,11556=>674,11557=>822,11800=>527,11810=>426,11811=>426,11812=>426,11813=>426,11822=>527,42564=>650, +42565=>506,42566=>421,42567=>342,42576=>1200,42577=>982,42580=>1158,42581=>923,42582=>1158,42583=>935,42760=>450, +42761=>450,42762=>450,42763=>450,42764=>450,42765=>450,42766=>450,42767=>450,42768=>450,42769=>450,42770=>450, +42771=>450,42772=>450,42773=>450,42774=>450,42779=>346,42780=>346,42781=>249,42782=>249,42783=>249,42891=>395, +42892=>275,62464=>634,62465=>645,62466=>688,62467=>898,62468=>645,62469=>639,62470=>698,62471=>934,62472=>645, +62473=>645,62474=>1178,62475=>660,62476=>659,62477=>903,62478=>645,62479=>659,62480=>945,62481=>717,62482=>765, +62483=>719,62484=>896,62485=>659,62486=>888,62487=>658,62488=>665,62489=>659,62490=>702,62491=>659,62492=>665, +62493=>646,62494=>702,62495=>842,62496=>644,62497=>743,62498=>645,62499=>645,62500=>645,62501=>695,62502=>911, +62504=>813,63173=>600,63185=>450,63188=>450,64256=>738,64257=>654,64258=>654,64259=>1007,64260=>1005,64261=>784, +64262=>874,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0,65031=>0,65032=>0, +65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65529=>0,65530=>0,65531=>0, +65532=>0,65533=>1002); +$enc=''; +$diff=''; +$file='dejavuserifcondensedb.z'; +$ctg='dejavuserifcondensedb.ctg.z'; +$originalsize=282092; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedb.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedb.z new file mode 100644 index 0000000..b84198d Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedb.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedbi.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedbi.ctg.z new file mode 100644 index 0000000..d237ae7 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedbi.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedbi.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedbi.php new file mode 100644 index 0000000..5de4f23 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedbi.php @@ -0,0 +1,299 @@ +<?php +$type='TrueTypeUnicode'; +$name='DejaVuSerifCondensed-BoldItalic'; +$desc=array('Ascent'=>939,'Descent'=>-236,'CapHeight'=>-48,'Flags'=>96,'FontBBox'=>'[-815 -389 1584 1235]','ItalicAngle'=>-11,'StemV'=>120,'MissingWidth'=>540); +$up=-63; +$ut=44; +$dw=540; +$cw=array( +0=>540,32=>313,33=>395,34=>469,35=>754,36=>626,37=>855,38=>813,39=>275,40=>426, +41=>426,42=>470,43=>754,44=>313,45=>374,46=>313,47=>329,48=>626,49=>626,50=>626, +51=>626,52=>626,53=>626,54=>626,55=>626,56=>626,57=>626,58=>332,59=>332,60=>754, +61=>754,62=>754,63=>527,64=>900,65=>698,66=>760,67=>716,68=>780,69=>686,70=>639, +71=>769,72=>850,73=>421,74=>426,75=>782,76=>633,77=>996,78=>822,79=>784,80=>677, +81=>784,82=>748,83=>650,84=>669,85=>785,86=>698,87=>1011,88=>698,89=>642,90=>657, +91=>426,92=>329,93=>426,94=>754,95=>450,96=>450,97=>583,98=>629,99=>548,100=>629, +101=>572,102=>387,103=>629,104=>654,105=>342,106=>325,107=>624,108=>342,109=>952,110=>654, +111=>600,112=>629,113=>629,114=>474,115=>506,116=>416,117=>654,118=>523,119=>774,120=>536, +121=>523,122=>511,123=>579,124=>327,125=>579,126=>754,8364=>626,8218=>313,402=>387,8222=>518, +8230=>900,8224=>470,8225=>470,710=>450,8240=>1246,352=>650,8249=>360,338=>1062,381=>657,8216=>313, +8217=>313,8220=>518,8221=>518,8226=>575,8211=>450,8212=>900,732=>450,8482=>900,353=>506,8250=>360, +339=>925,382=>511,376=>642,160=>313,161=>395,162=>626,163=>626,164=>572,165=>626,166=>327, +167=>470,168=>450,169=>900,170=>438,171=>563,172=>754,173=>374,174=>900,175=>450,176=>450, +177=>754,178=>394,179=>394,180=>450,181=>659,182=>572,183=>313,184=>450,185=>394,186=>450, +187=>563,188=>938,189=>938,190=>938,191=>527,192=>698,193=>698,194=>698,195=>698,196=>698, +197=>698,198=>931,199=>716,200=>686,201=>686,202=>686,203=>686,204=>421,205=>421,206=>421, +207=>421,208=>787,209=>822,210=>784,211=>784,212=>784,213=>784,214=>784,215=>754,216=>784, +217=>785,218=>785,219=>785,220=>785,221=>642,222=>681,223=>684,224=>583,225=>583,226=>583, +227=>583,228=>583,229=>583,230=>838,231=>548,232=>572,233=>572,234=>572,235=>572,236=>342, +237=>342,238=>342,239=>342,240=>600,241=>654,242=>600,243=>600,244=>600,245=>600,246=>600, +247=>754,248=>600,249=>654,250=>654,251=>654,252=>654,253=>523,254=>629,255=>523,256=>698, +257=>583,258=>698,259=>583,260=>698,261=>583,262=>716,263=>548,264=>716,265=>548,266=>716, +267=>548,268=>716,269=>548,270=>780,271=>629,272=>787,273=>629,274=>686,275=>572,276=>686, +277=>572,278=>686,279=>572,280=>686,281=>572,282=>686,283=>572,284=>769,285=>629,286=>769, +287=>629,288=>769,289=>629,290=>769,291=>629,292=>850,293=>654,294=>850,295=>654,296=>421, +297=>342,298=>421,299=>342,300=>421,301=>342,302=>421,303=>342,304=>421,305=>342,306=>848, +307=>676,308=>426,309=>325,310=>782,311=>624,312=>624,313=>633,314=>342,315=>633,316=>342, +317=>633,318=>457,319=>633,320=>501,321=>639,322=>346,323=>822,324=>654,325=>822,326=>654, +327=>822,328=>654,329=>907,330=>785,331=>654,332=>784,333=>600,334=>784,335=>600,336=>784, +337=>600,340=>748,341=>474,342=>748,343=>474,344=>748,345=>474,346=>650,347=>506,348=>650, +349=>506,350=>650,351=>506,354=>669,355=>416,356=>669,357=>416,358=>669,359=>416,360=>785, +361=>654,362=>785,363=>654,364=>785,365=>654,366=>785,367=>654,368=>785,369=>654,370=>785, +371=>654,372=>1011,373=>774,374=>642,375=>523,377=>657,378=>511,379=>657,380=>511,383=>387, +384=>629,385=>760,386=>769,387=>629,388=>769,389=>629,390=>716,391=>716,392=>548,393=>787, +394=>780,395=>769,396=>629,397=>600,398=>686,399=>784,400=>649,401=>639,403=>769,404=>693, +405=>938,406=>421,407=>421,408=>782,409=>624,410=>342,411=>631,412=>952,413=>822,414=>654, +415=>784,416=>784,417=>600,418=>1080,419=>849,420=>677,421=>629,422=>748,423=>650,424=>506, +425=>636,426=>298,427=>416,428=>669,429=>416,430=>669,431=>785,432=>654,433=>801,434=>801, +435=>642,436=>628,437=>657,438=>511,439=>591,440=>591,441=>591,443=>626,444=>678,445=>511, +446=>482,448=>265,449=>443,450=>413,451=>265,452=>1437,453=>1292,454=>1140,455=>1059,456=>958, +457=>667,458=>1248,459=>1148,460=>980,461=>698,462=>583,463=>421,464=>342,465=>784,466=>600, +467=>785,468=>654,469=>785,470=>654,471=>785,472=>654,473=>785,474=>654,475=>785,476=>654, +477=>572,478=>698,479=>583,480=>698,481=>583,482=>931,483=>877,484=>806,485=>629,486=>769, +487=>629,488=>782,489=>624,490=>784,491=>600,492=>784,493=>600,494=>591,495=>511,496=>325, +497=>1437,498=>1292,499=>1140,500=>769,501=>629,502=>1099,504=>822,505=>654,506=>698,507=>583, +508=>931,509=>838,510=>784,511=>600,512=>698,513=>583,514=>698,515=>583,516=>686,517=>572, +518=>686,519=>572,520=>421,521=>342,522=>421,523=>342,524=>784,525=>600,526=>784,527=>600, +528=>748,529=>474,530=>748,531=>474,532=>785,533=>654,534=>785,535=>654,536=>650,537=>506, +538=>669,539=>416,540=>621,541=>546,542=>850,543=>654,544=>785,545=>711,548=>657,549=>511, +550=>698,551=>583,552=>686,553=>572,554=>784,555=>600,556=>784,557=>600,558=>784,559=>600, +560=>784,561=>600,562=>642,563=>523,564=>516,565=>830,566=>508,567=>325,568=>928,569=>928, +570=>698,571=>716,572=>548,573=>633,574=>669,575=>506,576=>511,577=>594,578=>492,581=>698, +592=>583,593=>629,594=>629,595=>629,596=>548,597=>548,598=>629,599=>657,600=>572,601=>572, +602=>816,603=>547,604=>505,605=>816,606=>647,607=>348,608=>629,609=>629,610=>563,611=>641, +612=>564,613=>654,614=>654,615=>654,616=>342,617=>342,618=>342,619=>368,620=>462,621=>342, +622=>716,623=>952,624=>952,625=>952,626=>654,627=>654,628=>641,629=>600,630=>955,631=>674, +632=>600,633=>514,634=>514,635=>514,636=>474,637=>474,638=>406,639=>438,640=>721,641=>721, +642=>506,643=>298,644=>387,645=>486,646=>298,647=>443,648=>416,649=>654,650=>611,651=>624, +652=>523,653=>774,654=>571,655=>654,656=>511,657=>511,658=>511,659=>511,660=>482,661=>482, +662=>482,663=>490,664=>784,665=>625,666=>647,667=>563,668=>659,669=>345,670=>666,671=>581, +672=>629,673=>482,674=>482,675=>1005,676=>1061,677=>1005,678=>819,679=>643,680=>817,681=>935, +682=>711,683=>716,684=>596,685=>398,686=>552,687=>646,688=>469,689=>466,690=>282,691=>372, +692=>372,693=>432,694=>474,695=>488,696=>329,697=>271,699=>313,700=>313,701=>313,702=>330, +703=>330,704=>282,705=>282,711=>450,712=>254,713=>450,716=>254,720=>332,721=>332,722=>330, +723=>330,726=>353,728=>450,729=>450,730=>450,731=>450,733=>450,734=>375,736=>403,737=>263, +738=>355,739=>338,740=>282,741=>450,742=>450,743=>450,744=>450,745=>450,750=>498,768=>0, +769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0, +779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0, +789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0, +799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0, +809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0, +819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0, +829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>701,881=>519,884=>271, +885=>271,890=>450,891=>548,892=>548,893=>548,894=>332,900=>450,901=>450,902=>698,903=>313, +904=>852,905=>1022,906=>595,908=>798,910=>857,911=>820,912=>435,913=>698,914=>760,915=>639, +916=>698,917=>686,918=>657,919=>850,920=>784,921=>421,922=>782,923=>698,924=>996,925=>822, +926=>633,927=>784,928=>850,929=>677,931=>636,932=>669,933=>642,934=>784,935=>698,936=>822, +937=>801,938=>421,939=>642,940=>692,941=>547,942=>654,943=>435,944=>624,945=>692,946=>598, +947=>594,948=>600,949=>547,950=>533,951=>654,952=>600,953=>435,954=>674,955=>631,956=>659, +957=>624,958=>533,959=>600,960=>659,961=>598,962=>548,963=>664,964=>605,965=>624,966=>814, +967=>592,968=>847,969=>857,970=>435,971=>624,972=>600,973=>624,974=>857,976=>600,977=>764, +978=>687,979=>872,980=>687,981=>847,982=>857,983=>589,984=>784,985=>600,986=>716,987=>548, +988=>639,989=>475,990=>531,991=>593,992=>716,993=>600,1008=>589,1009=>598,1010=>548,1011=>325, +1012=>784,1013=>548,1014=>548,1015=>681,1016=>629,1017=>716,1018=>996,1019=>774,1020=>623,1021=>716, +1022=>716,1023=>716,1024=>686,1025=>686,1026=>811,1027=>621,1028=>716,1029=>650,1030=>421,1031=>421, +1032=>426,1033=>1081,1034=>1135,1035=>866,1036=>818,1037=>850,1038=>730,1039=>850,1040=>733,1041=>769, +1042=>760,1043=>621,1044=>800,1045=>686,1046=>1181,1047=>649,1048=>850,1049=>850,1050=>818,1051=>795, +1052=>996,1053=>850,1054=>784,1055=>850,1056=>677,1057=>716,1058=>669,1059=>730,1060=>854,1061=>698, +1062=>870,1063=>822,1064=>1141,1065=>1164,1066=>861,1067=>1081,1068=>743,1069=>716,1070=>1158,1071=>793, +1072=>583,1073=>650,1074=>591,1075=>506,1076=>625,1077=>572,1078=>1175,1079=>574,1080=>654,1081=>654, +1082=>609,1083=>659,1084=>855,1085=>656,1086=>600,1087=>654,1088=>629,1089=>548,1090=>952,1091=>538, +1092=>812,1093=>536,1094=>723,1095=>643,1096=>952,1097=>1021,1098=>654,1099=>916,1100=>593,1101=>580, +1102=>901,1103=>716,1104=>572,1105=>572,1106=>646,1107=>506,1108=>548,1109=>506,1110=>342,1111=>342, +1112=>325,1113=>913,1114=>910,1115=>654,1116=>609,1117=>654,1118=>538,1119=>654,1122=>792,1123=>945, +1124=>1076,1125=>867,1130=>1181,1131=>909,1136=>986,1137=>995,1138=>784,1139=>587,1140=>824,1141=>673, +1164=>761,1165=>606,1168=>630,1169=>556,1170=>621,1171=>506,1172=>768,1173=>634,1174=>1181,1175=>1175, +1176=>649,1177=>574,1178=>812,1179=>633,1182=>818,1183=>609,1184=>937,1185=>684,1186=>856,1187=>725, +1188=>1050,1189=>859,1190=>1191,1191=>911,1194=>716,1195=>548,1196=>669,1197=>1028,1198=>642,1199=>515, +1200=>642,1201=>515,1202=>709,1203=>536,1204=>909,1205=>749,1206=>822,1207=>712,1210=>819,1211=>654, +1216=>421,1217=>1181,1218=>1175,1219=>782,1220=>624,1223=>850,1224=>659,1227=>885,1228=>659,1231=>342, +1232=>733,1233=>583,1234=>733,1235=>583,1236=>931,1237=>877,1238=>686,1239=>572,1240=>784,1241=>572, +1242=>784,1243=>572,1244=>1181,1245=>1175,1246=>649,1247=>574,1248=>591,1249=>511,1250=>850,1251=>654, +1252=>850,1253=>654,1254=>784,1255=>600,1256=>784,1257=>600,1258=>784,1259=>600,1260=>716,1261=>580, +1262=>730,1263=>538,1264=>730,1265=>538,1266=>730,1267=>538,1268=>822,1269=>643,1270=>621,1271=>506, +1272=>1081,1273=>916,1296=>649,1297=>574,1298=>795,1299=>659,1300=>1123,1301=>904,1306=>738,1307=>576, +1308=>925,1309=>770,4256=>688,4257=>851,4258=>788,4259=>795,4260=>712,4261=>979,4262=>921,4263=>1100, +4264=>587,4265=>745,4266=>955,4267=>954,4268=>725,4269=>1030,4270=>880,4271=>820,4272=>1007,4273=>721, +4274=>689,4275=>977,4276=>887,4277=>968,4278=>738,4279=>758,4280=>748,4281=>759,4282=>826,4283=>978, +4284=>701,4285=>748,4286=>740,4287=>1008,4288=>1019,4289=>730,4290=>812,4291=>730,4292=>801,4293=>965, +4304=>535,4305=>563,4306=>579,4307=>798,4308=>553,4309=>549,4310=>599,4311=>823,4312=>552,4313=>540, +4314=>1008,4315=>589,4316=>576,4317=>791,4318=>561,4319=>571,4320=>790,4321=>591,4322=>721,4323=>676, +4324=>782,4325=>575,4326=>820,4327=>559,4328=>583,4329=>576,4330=>656,4331=>577,4332=>575,4333=>566, +4334=>606,4335=>663,4336=>563,4337=>591,4338=>563,4339=>563,4340=>562,4341=>603,4342=>846,4343=>612, +4344=>572,4345=>605,4346=>562,4347=>401,4348=>327,7426=>846,7432=>458,7433=>288,7444=>890,7446=>600, +7447=>600,7453=>663,7454=>853,7455=>853,7468=>439,7469=>586,7470=>479,7472=>491,7473=>432,7474=>432, +7475=>483,7476=>536,7477=>265,7478=>268,7479=>492,7480=>398,7481=>627,7482=>518,7483=>518,7484=>493, +7486=>426,7487=>471,7488=>422,7489=>494,7490=>637,7491=>419,7492=>419,7493=>448,7494=>591,7495=>448, +7496=>448,7497=>400,7498=>400,7499=>370,7500=>370,7501=>448,7502=>270,7503=>471,7504=>655,7505=>426, +7506=>420,7507=>384,7508=>420,7509=>420,7510=>448,7511=>333,7512=>468,7513=>390,7514=>655,7515=>442, +7522=>215,7523=>372,7524=>468,7525=>442,7543=>576,7544=>536,7547=>342,7557=>342,7579=>448,7580=>384, +7581=>384,7582=>420,7583=>370,7584=>244,7585=>335,7586=>448,7587=>470,7588=>270,7589=>276,7590=>270, +7591=>270,7592=>333,7593=>331,7594=>289,7595=>387,7596=>613,7597=>655,7598=>529,7599=>528,7600=>425, +7601=>420,7602=>470,7603=>360,7604=>348,7605=>333,7606=>468,7607=>427,7609=>439,7610=>329,7611=>321, +7612=>474,7613=>371,7614=>407,7615=>420,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0, +7680=>698,7681=>583,7682=>760,7683=>629,7684=>760,7685=>629,7686=>760,7687=>629,7688=>716,7689=>548, +7690=>780,7691=>629,7692=>780,7693=>629,7694=>780,7695=>629,7696=>780,7697=>629,7698=>780,7699=>629, +7700=>686,7701=>572,7702=>686,7703=>572,7704=>686,7705=>572,7706=>686,7707=>572,7708=>686,7709=>572, +7710=>639,7711=>387,7712=>769,7713=>629,7714=>850,7715=>654,7716=>850,7717=>654,7718=>850,7719=>654, +7720=>850,7721=>654,7722=>850,7723=>654,7724=>421,7725=>342,7728=>782,7729=>624,7730=>782,7731=>624, +7732=>782,7733=>624,7734=>633,7735=>342,7736=>633,7737=>342,7738=>633,7739=>342,7740=>633,7741=>342, +7742=>996,7743=>952,7744=>996,7745=>952,7746=>996,7747=>952,7748=>822,7749=>654,7750=>822,7751=>654, +7752=>822,7753=>654,7754=>822,7755=>654,7756=>784,7757=>600,7760=>784,7761=>600,7762=>784,7763=>600, +7764=>677,7765=>629,7766=>677,7767=>629,7768=>748,7769=>474,7770=>748,7771=>474,7772=>748,7773=>474, +7774=>748,7775=>474,7776=>650,7777=>506,7778=>650,7779=>506,7784=>650,7785=>506,7786=>669,7787=>416, +7788=>669,7789=>416,7790=>669,7791=>416,7792=>669,7793=>416,7794=>785,7795=>654,7796=>785,7797=>654, +7798=>785,7799=>654,7800=>785,7801=>654,7802=>785,7803=>654,7804=>698,7805=>523,7806=>698,7807=>523, +7808=>1011,7809=>774,7810=>1011,7811=>774,7812=>1011,7813=>774,7814=>1011,7815=>774,7816=>1011,7817=>774, +7818=>698,7819=>536,7820=>698,7821=>536,7822=>642,7823=>523,7824=>657,7825=>511,7826=>657,7827=>511, +7828=>657,7829=>511,7830=>654,7831=>416,7832=>774,7833=>523,7834=>913,7835=>387,7838=>852,7839=>600, +7840=>698,7841=>583,7842=>698,7843=>583,7852=>698,7853=>583,7854=>698,7855=>583,7856=>698,7857=>583, +7858=>698,7859=>583,7860=>698,7861=>583,7862=>698,7863=>583,7864=>686,7865=>572,7866=>686,7867=>572, +7868=>686,7869=>572,7878=>686,7879=>572,7880=>421,7881=>342,7882=>421,7883=>342,7884=>784,7885=>600, +7886=>784,7887=>600,7896=>784,7897=>600,7908=>785,7909=>654,7910=>785,7911=>654,7922=>642,7923=>523, +7924=>642,7925=>523,7926=>642,7927=>523,7928=>642,7929=>523,7936=>692,7937=>692,7938=>692,7939=>692, +7940=>692,7941=>692,7942=>692,7943=>692,7944=>698,7945=>698,7946=>880,7947=>880,7948=>748,7949=>764, +7950=>698,7951=>698,7952=>547,7953=>547,7954=>547,7955=>547,7956=>547,7957=>547,7960=>826,7961=>817, +7962=>1052,7963=>1052,7964=>984,7965=>1007,7968=>654,7969=>654,7970=>654,7971=>654,7972=>654,7973=>654, +7974=>654,7975=>654,7976=>990,7977=>984,7978=>1222,7979=>1225,7980=>1151,7981=>1177,7982=>1077,7983=>1074, +7984=>435,7985=>435,7986=>435,7987=>435,7988=>435,7989=>435,7990=>435,7991=>435,7992=>566,7993=>555, +7994=>790,7995=>792,7996=>719,7997=>748,7998=>650,7999=>642,8000=>600,8001=>600,8002=>600,8003=>600, +8004=>600,8005=>600,8008=>810,8009=>841,8010=>1116,8011=>1113,8012=>931,8013=>959,8016=>624,8017=>624, +8018=>624,8019=>624,8020=>624,8021=>624,8022=>624,8023=>624,8025=>830,8027=>1067,8029=>1020,8031=>917, +8032=>857,8033=>857,8034=>857,8035=>857,8036=>857,8037=>857,8038=>857,8039=>857,8040=>838,8041=>867, +8042=>1141,8043=>1146,8044=>949,8045=>979,8046=>920,8047=>954,8048=>692,8049=>692,8050=>547,8051=>547, +8052=>654,8053=>654,8054=>435,8055=>435,8056=>600,8057=>600,8058=>624,8059=>624,8060=>857,8061=>857, +8064=>692,8065=>692,8066=>692,8067=>692,8068=>692,8069=>692,8070=>692,8071=>692,8072=>698,8073=>698, +8074=>880,8075=>880,8076=>748,8077=>764,8078=>698,8079=>698,8080=>654,8081=>654,8082=>654,8083=>654, +8084=>654,8085=>654,8086=>654,8087=>654,8088=>990,8089=>984,8090=>1222,8091=>1225,8092=>1151,8093=>1177, +8094=>1077,8095=>1074,8096=>857,8097=>857,8098=>857,8099=>857,8100=>857,8101=>857,8102=>857,8103=>857, +8104=>838,8105=>867,8106=>1141,8107=>1146,8108=>949,8109=>979,8110=>920,8111=>954,8112=>692,8113=>692, +8114=>692,8115=>692,8116=>692,8118=>692,8119=>692,8120=>698,8121=>698,8122=>729,8123=>698,8124=>698, +8125=>450,8126=>450,8127=>450,8128=>450,8129=>450,8130=>654,8131=>654,8132=>654,8134=>654,8135=>654, +8136=>899,8137=>852,8138=>1072,8139=>1006,8140=>850,8141=>450,8142=>450,8143=>450,8144=>435,8145=>435, +8146=>435,8147=>435,8150=>435,8151=>435,8152=>421,8153=>421,8154=>642,8155=>595,8157=>450,8158=>450, +8159=>450,8160=>624,8161=>624,8162=>624,8163=>624,8164=>598,8165=>598,8166=>624,8167=>624,8168=>642, +8169=>642,8170=>917,8171=>857,8172=>819,8173=>450,8174=>450,8175=>450,8178=>857,8179=>857,8180=>857, +8182=>857,8183=>857,8184=>962,8185=>798,8186=>991,8187=>820,8188=>801,8189=>450,8190=>450,8192=>450, +8193=>900,8194=>450,8195=>900,8196=>296,8197=>225,8198=>150,8199=>626,8200=>313,8201=>180,8202=>89, +8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>374,8209=>374,8210=>626,8213=>900,8214=>450, +8215=>450,8219=>313,8223=>518,8227=>575,8228=>313,8229=>606,8234=>0,8235=>0,8236=>0,8237=>0, +8238=>0,8239=>180,8241=>1631,8242=>237,8243=>402,8244=>567,8245=>237,8246=>402,8247=>567,8248=>659, +8252=>566,8253=>527,8254=>450,8258=>920,8260=>150,8261=>426,8262=>426,8263=>974,8264=>770,8265=>770, +8267=>572,8268=>450,8269=>450,8270=>470,8271=>332,8273=>470,8274=>500,8275=>900,8279=>731,8287=>200, +8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0, +8303=>0,8304=>394,8305=>215,8308=>394,8309=>394,8310=>394,8311=>394,8312=>394,8313=>394,8314=>475, +8315=>475,8316=>475,8317=>268,8318=>268,8319=>412,8320=>394,8321=>394,8322=>394,8323=>394,8324=>394, +8325=>394,8326=>394,8327=>394,8328=>394,8329=>394,8330=>475,8331=>475,8332=>475,8333=>268,8334=>268, +8336=>419,8337=>400,8338=>420,8339=>338,8340=>400,8358=>626,8367=>1039,8369=>710,8372=>788,8373=>626, +8451=>1078,8457=>1001,8462=>654,8463=>654,8470=>978,8486=>801,8487=>801,8490=>782,8491=>698,8513=>707, +8514=>518,8515=>573,8516=>684,8523=>813,8531=>932,8532=>932,8533=>932,8534=>932,8535=>932,8536=>932, +8537=>932,8538=>932,8539=>932,8540=>932,8541=>932,8542=>932,8543=>554,8544=>421,8545=>663,8546=>904, +8547=>984,8548=>698,8549=>1014,8550=>1256,8551=>1498,8552=>962,8553=>698,8554=>970,8555=>1212,8556=>633, +8557=>716,8558=>780,8559=>996,8560=>342,8561=>684,8562=>1025,8563=>865,8564=>523,8565=>865,8566=>1207, +8567=>1548,8568=>878,8569=>536,8570=>878,8571=>1220,8572=>342,8573=>548,8574=>629,8575=>952,8576=>1129, +8577=>780,8578=>1141,8579=>716,8580=>548,8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754, +8598=>754,8599=>754,8600=>754,8601=>754,8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754, +8608=>754,8609=>754,8610=>754,8611=>754,8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754, +8618=>754,8619=>754,8620=>754,8621=>754,8622=>754,8623=>765,8624=>754,8625=>754,8626=>754,8627=>754, +8628=>754,8629=>754,8630=>754,8631=>754,8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754, +8638=>754,8639=>754,8640=>754,8641=>754,8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754, +8648=>754,8649=>754,8650=>754,8651=>754,8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754, +8658=>754,8659=>754,8660=>754,8661=>754,8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754, +8668=>754,8669=>754,8670=>754,8671=>754,8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754, +8678=>754,8679=>754,8680=>754,8681=>754,8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754, +8688=>754,8689=>754,8690=>754,8691=>754,8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754, +8698=>754,8699=>754,8700=>754,8701=>754,8702=>754,8703=>754,8704=>577,8706=>480,8707=>558,8708=>558, +8710=>677,8711=>677,8712=>666,8713=>666,8715=>666,8716=>666,8719=>757,8720=>757,8721=>677,8722=>754, +8723=>754,8724=>754,8725=>329,8727=>622,8728=>466,8729=>466,8730=>591,8731=>591,8732=>591,8733=>604, +8734=>750,8735=>754,8736=>754,8739=>292,8740=>546,8741=>476,8742=>696,8743=>730,8744=>730,8745=>754, +8746=>754,8747=>521,8748=>900,8749=>1252,8760=>754,8761=>754,8762=>754,8763=>754,8764=>754,8765=>754, +8770=>754,8771=>754,8776=>754,8784=>754,8785=>754,8786=>754,8787=>754,8788=>974,8789=>974,8800=>754, +8801=>754,8804=>754,8805=>754,8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754,8844=>754, +8845=>754,8846=>754,8847=>754,8848=>754,8849=>754,8850=>754,8851=>754,8852=>754,8853=>754,8854=>754, +8855=>754,8856=>754,8857=>754,8858=>754,8859=>754,8860=>754,8861=>754,8862=>754,8863=>754,8864=>754, +8865=>754,8866=>795,8867=>795,8868=>864,8869=>864,8870=>554,8871=>554,8872=>795,8873=>795,8874=>795, +8875=>971,8876=>795,8877=>795,8878=>795,8879=>971,8901=>358,8962=>751,8968=>426,8969=>426,8970=>426, +8971=>426,8976=>754,8977=>484,8984=>835,8985=>754,8992=>521,8993=>521,8997=>900,9000=>1299,9085=>907, +9134=>521,9167=>850,9251=>751,9600=>692,9601=>692,9602=>692,9603=>692,9604=>692,9605=>692,9606=>692, +9607=>692,9608=>692,9609=>692,9610=>692,9611=>692,9612=>692,9613=>692,9614=>692,9615=>692,9616=>692, +9617=>692,9618=>692,9619=>692,9620=>692,9621=>692,9622=>692,9623=>692,9624=>692,9625=>692,9626=>692, +9627=>692,9628=>692,9629=>692,9630=>692,9631=>692,9632=>850,9633=>850,9634=>850,9635=>850,9636=>850, +9637=>850,9638=>850,9639=>850,9640=>850,9641=>850,9642=>610,9643=>610,9644=>850,9645=>850,9646=>495, +9647=>495,9648=>692,9649=>692,9650=>692,9651=>692,9652=>452,9653=>452,9654=>692,9655=>692,9656=>452, +9657=>452,9658=>692,9659=>692,9660=>692,9661=>692,9662=>452,9663=>452,9664=>692,9665=>692,9666=>452, +9667=>452,9668=>692,9669=>692,9670=>692,9671=>692,9672=>692,9673=>785,9674=>444,9675=>785,9676=>785, +9677=>785,9678=>785,9679=>785,9680=>785,9681=>785,9682=>785,9683=>785,9684=>785,9685=>785,9686=>474, +9687=>474,9688=>712,9689=>873,9690=>873,9691=>873,9692=>348,9693=>348,9694=>348,9695=>348,9696=>785, +9697=>785,9698=>692,9699=>692,9700=>692,9701=>692,9702=>531,9703=>850,9704=>850,9705=>850,9706=>850, +9707=>850,9708=>692,9709=>692,9710=>692,9711=>1007,9712=>850,9713=>850,9714=>850,9715=>850,9716=>785, +9717=>785,9718=>785,9719=>785,9720=>692,9721=>692,9722=>692,9723=>747,9724=>747,9725=>659,9726=>659, +9727=>692,9728=>807,9784=>807,9785=>807,9786=>807,9787=>807,9788=>807,9791=>552,9792=>658,9793=>658, +9794=>807,9795=>807,9796=>807,9797=>807,9798=>807,9799=>807,9824=>807,9825=>807,9826=>807,9827=>807, +9828=>807,9829=>807,9830=>807,9831=>807,9833=>424,9834=>574,9835=>807,9836=>807,9837=>424,9838=>321, +9839=>435,10145=>754,10181=>411,10182=>411,10208=>444,10216=>411,10217=>411,10224=>754,10225=>754,10226=>754, +10227=>754,10228=>930,10229=>1290,10230=>1290,10231=>1290,10232=>1290,10233=>1290,10234=>1290,10235=>1290,10236=>1290, +10237=>1290,10238=>1290,10239=>1290,10240=>703,10241=>703,10242=>703,10243=>703,10244=>703,10245=>703,10246=>703, +10247=>703,10248=>703,10249=>703,10250=>703,10251=>703,10252=>703,10253=>703,10254=>703,10255=>703,10256=>703, +10257=>703,10258=>703,10259=>703,10260=>703,10261=>703,10262=>703,10263=>703,10264=>703,10265=>703,10266=>703, +10267=>703,10268=>703,10269=>703,10270=>703,10271=>703,10272=>703,10273=>703,10274=>703,10275=>703,10276=>703, +10277=>703,10278=>703,10279=>703,10280=>703,10281=>703,10282=>703,10283=>703,10284=>703,10285=>703,10286=>703, +10287=>703,10288=>703,10289=>703,10290=>703,10291=>703,10292=>703,10293=>703,10294=>703,10295=>703,10296=>703, +10297=>703,10298=>703,10299=>703,10300=>703,10301=>703,10302=>703,10303=>703,10304=>703,10305=>703,10306=>703, +10307=>703,10308=>703,10309=>703,10310=>703,10311=>703,10312=>703,10313=>703,10314=>703,10315=>703,10316=>703, +10317=>703,10318=>703,10319=>703,10320=>703,10321=>703,10322=>703,10323=>703,10324=>703,10325=>703,10326=>703, +10327=>703,10328=>703,10329=>703,10330=>703,10331=>703,10332=>703,10333=>703,10334=>703,10335=>703,10336=>703, +10337=>703,10338=>703,10339=>703,10340=>703,10341=>703,10342=>703,10343=>703,10344=>703,10345=>703,10346=>703, +10347=>703,10348=>703,10349=>703,10350=>703,10351=>703,10352=>703,10353=>703,10354=>703,10355=>703,10356=>703, +10357=>703,10358=>703,10359=>703,10360=>703,10361=>703,10362=>703,10363=>703,10364=>703,10365=>703,10366=>703, +10367=>703,10368=>703,10369=>703,10370=>703,10371=>703,10372=>703,10373=>703,10374=>703,10375=>703,10376=>703, +10377=>703,10378=>703,10379=>703,10380=>703,10381=>703,10382=>703,10383=>703,10384=>703,10385=>703,10386=>703, +10387=>703,10388=>703,10389=>703,10390=>703,10391=>703,10392=>703,10393=>703,10394=>703,10395=>703,10396=>703, +10397=>703,10398=>703,10399=>703,10400=>703,10401=>703,10402=>703,10403=>703,10404=>703,10405=>703,10406=>703, +10407=>703,10408=>703,10409=>703,10410=>703,10411=>703,10412=>703,10413=>703,10414=>703,10415=>703,10416=>703, +10417=>703,10418=>703,10419=>703,10420=>703,10421=>703,10422=>703,10423=>703,10424=>703,10425=>703,10426=>703, +10427=>703,10428=>703,10429=>703,10430=>703,10431=>703,10432=>703,10433=>703,10434=>703,10435=>703,10436=>703, +10437=>703,10438=>703,10439=>703,10440=>703,10441=>703,10442=>703,10443=>703,10444=>703,10445=>703,10446=>703, +10447=>703,10448=>703,10449=>703,10450=>703,10451=>703,10452=>703,10453=>703,10454=>703,10455=>703,10456=>703, +10457=>703,10458=>703,10459=>703,10460=>703,10461=>703,10462=>703,10463=>703,10464=>703,10465=>703,10466=>703, +10467=>703,10468=>703,10469=>703,10470=>703,10471=>703,10472=>703,10473=>703,10474=>703,10475=>703,10476=>703, +10477=>703,10478=>703,10479=>703,10480=>703,10481=>703,10482=>703,10483=>703,10484=>703,10485=>703,10486=>703, +10487=>703,10488=>703,10489=>703,10490=>703,10491=>703,10492=>703,10493=>703,10494=>703,10495=>703,10496=>754, +10497=>754,10498=>754,10499=>754,10500=>754,10501=>754,10502=>754,10503=>754,10504=>754,10505=>754,10506=>754, +10507=>754,10508=>754,10509=>754,10510=>754,10511=>754,10512=>754,10513=>754,10514=>754,10515=>754,10516=>754, +10517=>754,10518=>754,10519=>754,10520=>754,10521=>754,10522=>754,10523=>754,10524=>754,10525=>754,10526=>754, +10527=>754,10528=>754,10529=>754,10530=>754,10531=>754,10532=>754,10533=>754,10534=>754,10535=>754,10536=>754, +10537=>754,10538=>754,10539=>754,10540=>754,10541=>754,10542=>754,10543=>754,10544=>754,10545=>754,10546=>754, +10547=>754,10548=>754,10549=>754,10550=>754,10551=>754,10552=>754,10553=>754,10554=>754,10555=>754,10556=>754, +10557=>754,10558=>754,10559=>754,10560=>754,10561=>754,10562=>754,10563=>754,10564=>754,10565=>754,10566=>754, +10567=>754,10568=>754,10569=>754,10570=>754,10571=>754,10572=>754,10573=>754,10574=>754,10575=>754,10576=>754, +10577=>754,10578=>754,10579=>754,10580=>754,10581=>754,10582=>754,10583=>754,10584=>754,10585=>754,10586=>754, +10587=>754,10588=>754,10589=>754,10590=>754,10591=>754,10592=>754,10593=>754,10594=>754,10595=>754,10596=>754, +10597=>754,10598=>754,10599=>754,10600=>754,10601=>754,10602=>754,10603=>754,10604=>754,10605=>754,10606=>754, +10607=>754,10608=>754,10609=>754,10610=>754,10611=>754,10612=>754,10613=>754,10614=>754,10615=>929,10616=>754, +10617=>754,10618=>864,10619=>754,10620=>754,10621=>754,10622=>754,10623=>754,10731=>444,10764=>1604,10765=>549, +10766=>549,10799=>754,11008=>754,11009=>754,11010=>754,11011=>754,11012=>754,11013=>754,11014=>754,11015=>754, +11016=>754,11017=>754,11018=>754,11019=>754,11020=>754,11021=>754,11022=>754,11023=>754,11024=>754,11025=>754, +11026=>850,11027=>850,11028=>850,11029=>850,11030=>692,11031=>692,11032=>692,11033=>692,11034=>850,11364=>748, +11367=>850,11368=>654,11369=>782,11370=>624,11371=>657,11372=>511,11374=>996,11375=>698,11381=>701,11382=>519, +11383=>814,11385=>514,11386=>600,11388=>282,11389=>439,11520=>695,11521=>571,11522=>723,11523=>592,11524=>708, +11525=>866,11526=>680,11527=>864,11528=>555,11529=>581,11530=>866,11531=>567,11532=>581,11533=>866,11534=>761, +11535=>779,11536=>865,11537=>580,11538=>580,11539=>863,11540=>851,11541=>777,11542=>580,11543=>581,11544=>580, +11545=>584,11546=>619,11547=>842,11548=>883,11549=>613,11550=>608,11551=>766,11552=>1002,11553=>569,11554=>580, +11555=>582,11556=>674,11557=>822,11800=>527,11810=>426,11811=>426,11812=>426,11813=>426,11822=>527,42564=>650, +42565=>506,42566=>421,42567=>342,42576=>1200,42577=>976,42580=>1158,42581=>923,42582=>1158,42583=>926,42760=>450, +42761=>450,42762=>450,42763=>450,42764=>450,42765=>450,42766=>450,42767=>450,42768=>450,42769=>450,42770=>450, +42771=>450,42772=>450,42773=>450,42774=>450,42779=>346,42780=>346,42781=>249,42782=>249,42783=>249,42891=>395, +42892=>275,62464=>653,62465=>663,62466=>707,62467=>917,62468=>663,62469=>658,62470=>716,62471=>952,62472=>663, +62473=>663,62474=>1196,62475=>679,62476=>678,62477=>922,62478=>663,62479=>678,62480=>963,62481=>736,62482=>783, +62483=>737,62484=>914,62485=>677,62486=>907,62487=>677,62488=>684,62489=>678,62490=>720,62491=>678,62492=>684, +62493=>664,62494=>721,62495=>860,62496=>663,62497=>762,62498=>664,62499=>663,62500=>663,62501=>714,62502=>930, +62504=>813,63172=>506,63173=>600,63174=>629,63175=>654,63176=>952,63185=>450,63188=>450,64256=>744,64257=>654, +64258=>654,64259=>998,64260=>1031,64261=>791,64262=>874,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0, +65029=>0,65030=>0,65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0, +65039=>0,65529=>0,65530=>0,65531=>0,65532=>0,65533=>1002); +$enc=''; +$diff=''; +$file='dejavuserifcondensedbi.z'; +$ctg='dejavuserifcondensedbi.ctg.z'; +$originalsize=293472; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedbi.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedbi.z new file mode 100644 index 0000000..9b6be85 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedbi.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedi.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedi.ctg.z new file mode 100644 index 0000000..aa732f8 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedi.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedi.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedi.php new file mode 100644 index 0000000..e4db2ae --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedi.php @@ -0,0 +1,312 @@ +<?php +$type='TrueTypeUnicode'; +$name='DejaVuSerifCondensed-Italic'; +$desc=array('Ascent'=>928,'Descent'=>-236,'CapHeight'=>-59,'Flags'=>96,'FontBBox'=>'[-755 -347 1485 1227]','ItalicAngle'=>-11,'StemV'=>70,'MissingWidth'=>540); +$up=-63; +$ut=44; +$dw=540; +$cw=array( +0=>540,32=>286,33=>361,34=>414,35=>754,36=>572,37=>855,38=>801,39=>247,40=>351, +41=>351,42=>450,43=>754,44=>286,45=>304,46=>286,47=>303,48=>572,49=>572,50=>572, +51=>572,52=>572,53=>572,54=>572,55=>572,56=>572,57=>572,58=>303,59=>303,60=>754, +61=>754,62=>754,63=>482,64=>900,65=>650,66=>661,67=>688,68=>721,69=>657,70=>624, +71=>719,72=>785,73=>355,74=>360,75=>672,76=>598,77=>921,78=>787,79=>738,80=>605, +81=>738,82=>677,83=>616,84=>600,85=>758,86=>650,87=>925,88=>641,89=>594,90=>625, +91=>351,92=>303,93=>351,94=>754,95=>450,96=>450,97=>536,98=>576,99=>504,100=>576, +101=>532,102=>333,103=>576,104=>580,105=>288,106=>279,107=>545,108=>288,109=>853,110=>580, +111=>542,112=>576,113=>576,114=>430,115=>461,116=>361,117=>580,118=>508,119=>770,120=>507, +121=>508,122=>474,123=>572,124=>303,125=>572,126=>754,8364=>572,8218=>286,402=>333,8222=>466, +8230=>900,8224=>450,8225=>450,710=>450,8240=>1208,352=>616,8249=>360,338=>1023,381=>625,8216=>286, +8217=>286,8220=>460,8221=>460,8226=>531,8211=>450,8212=>900,732=>450,8482=>900,353=>461,8250=>360, +339=>890,382=>474,376=>594,160=>286,161=>361,162=>572,163=>572,164=>572,165=>572,166=>303, +167=>450,168=>450,169=>900,170=>427,171=>550,172=>754,173=>304,174=>900,175=>450,176=>450, +177=>754,178=>360,179=>360,180=>450,181=>584,182=>572,183=>286,184=>450,185=>360,186=>423, +187=>550,188=>872,189=>872,190=>872,191=>482,192=>650,193=>650,194=>650,195=>650,196=>650, +197=>650,198=>901,199=>688,200=>657,201=>657,202=>657,203=>657,204=>355,205=>355,206=>355, +207=>355,208=>726,209=>787,210=>738,211=>738,212=>738,213=>738,214=>738,215=>754,216=>738, +217=>758,218=>758,219=>758,220=>758,221=>594,222=>608,223=>601,224=>536,225=>536,226=>536, +227=>536,228=>536,229=>536,230=>846,231=>504,232=>532,233=>532,234=>532,235=>532,236=>288, +237=>288,238=>288,239=>288,240=>542,241=>580,242=>542,243=>542,244=>542,245=>542,246=>542, +247=>754,248=>542,249=>580,250=>580,251=>580,252=>580,253=>508,254=>576,255=>508,256=>650, +257=>536,258=>650,259=>536,260=>650,261=>536,262=>688,263=>504,264=>688,265=>504,266=>688, +267=>504,268=>688,269=>504,270=>721,271=>576,272=>726,273=>576,274=>657,275=>532,276=>657, +277=>532,278=>657,279=>532,280=>657,281=>532,282=>657,283=>532,284=>719,285=>576,286=>719, +287=>576,288=>719,289=>576,290=>719,291=>576,292=>785,293=>580,294=>785,295=>580,296=>355, +297=>288,298=>355,299=>288,300=>355,301=>288,302=>355,303=>288,304=>355,305=>288,306=>721, +307=>479,308=>360,309=>279,310=>672,311=>545,312=>545,313=>598,314=>288,315=>598,316=>288, +317=>598,318=>360,319=>604,320=>418,321=>602,322=>292,323=>787,324=>580,325=>787,326=>580, +327=>787,328=>580,329=>779,330=>758,331=>580,332=>738,333=>542,334=>738,335=>542,336=>738, +337=>542,340=>677,341=>430,342=>677,343=>430,344=>677,345=>430,346=>616,347=>461,348=>616, +349=>461,350=>616,351=>461,354=>600,355=>361,356=>600,357=>361,358=>600,359=>361,360=>758, +361=>580,362=>758,363=>580,364=>758,365=>580,366=>758,367=>580,368=>758,369=>580,370=>758, +371=>580,372=>925,373=>770,374=>594,375=>508,377=>625,378=>474,379=>625,380=>474,383=>333, +384=>576,385=>661,386=>661,387=>576,388=>661,389=>576,390=>688,391=>688,392=>504,393=>726, +394=>721,395=>661,396=>576,397=>542,398=>657,399=>738,400=>561,401=>624,403=>719,404=>641, +405=>839,406=>355,407=>355,408=>672,409=>545,410=>288,411=>570,412=>853,413=>787,414=>580, +415=>738,416=>738,417=>542,418=>936,419=>726,420=>605,421=>576,422=>677,423=>616,424=>461, +425=>636,426=>292,427=>361,428=>600,429=>361,430=>600,431=>758,432=>580,433=>746,434=>684, +435=>664,436=>670,437=>625,438=>474,439=>508,440=>508,441=>508,443=>572,444=>618,445=>508, +446=>482,448=>265,449=>443,450=>413,451=>265,452=>1347,453=>1195,454=>1050,455=>958,456=>876, +457=>567,458=>1148,459=>1066,460=>858,461=>650,462=>536,463=>355,464=>288,465=>738,466=>542, +467=>758,468=>580,469=>758,470=>580,471=>758,472=>580,473=>758,474=>580,475=>758,476=>580, +477=>532,478=>650,479=>536,480=>650,481=>536,482=>901,483=>846,484=>763,485=>576,486=>719, +487=>576,488=>672,489=>545,490=>738,491=>542,492=>738,493=>542,494=>508,495=>508,496=>288, +497=>1347,498=>1195,499=>1050,500=>719,501=>576,502=>1038,504=>787,505=>580,506=>650,507=>536, +508=>901,509=>846,510=>738,511=>542,512=>650,513=>536,514=>650,515=>536,516=>657,517=>532, +518=>657,519=>532,520=>355,521=>288,522=>355,523=>288,524=>738,525=>542,526=>738,527=>542, +528=>677,529=>430,530=>677,531=>430,532=>758,533=>580,534=>758,535=>580,536=>616,537=>461, +538=>600,539=>361,540=>564,541=>469,542=>785,543=>580,544=>758,545=>732,548=>625,549=>474, +550=>650,551=>536,552=>657,553=>532,554=>738,555=>542,556=>738,557=>542,558=>738,559=>542, +560=>738,561=>542,562=>594,563=>508,564=>450,565=>748,566=>444,567=>279,568=>864,569=>864, +570=>650,571=>688,572=>504,573=>598,574=>600,575=>461,576=>474,577=>525,578=>417,581=>650, +592=>536,593=>576,594=>607,595=>576,596=>504,597=>504,598=>582,599=>614,600=>532,601=>532, +602=>759,603=>483,604=>458,605=>695,606=>552,607=>283,608=>615,609=>576,610=>489,611=>641, +612=>507,613=>580,614=>580,615=>580,616=>288,617=>353,618=>288,619=>342,620=>409,621=>326, +622=>633,623=>853,624=>853,625=>853,626=>579,627=>624,628=>581,629=>542,630=>711,631=>583, +632=>542,633=>451,634=>451,635=>496,636=>430,637=>430,638=>407,639=>407,640=>534,641=>534, +642=>461,643=>244,644=>333,645=>438,646=>292,647=>361,648=>361,649=>580,650=>558,651=>547, +652=>508,653=>770,654=>508,655=>589,656=>537,657=>504,658=>508,659=>504,660=>482,661=>482, +662=>482,663=>461,664=>738,665=>506,666=>552,667=>588,668=>600,669=>329,670=>545,671=>581, +672=>615,673=>482,674=>482,675=>896,676=>930,677=>898,678=>728,679=>538,680=>704,681=>804, +682=>582,683=>608,684=>538,685=>398,686=>703,687=>690,688=>389,689=>387,690=>237,691=>312, +692=>312,693=>387,694=>352,695=>485,696=>320,697=>250,699=>286,700=>286,701=>286,702=>276, +703=>276,704=>252,705=>252,711=>450,712=>254,713=>450,716=>254,720=>303,721=>303,722=>276, +723=>276,726=>353,728=>450,729=>450,730=>450,731=>450,733=>450,734=>375,736=>403,737=>218, +738=>303,739=>319,740=>252,741=>444,742=>444,743=>444,744=>444,745=>444,750=>435,768=>0, +769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0, +779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0, +789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0, +799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0, +809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0, +819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0, +829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>666,881=>478,884=>250, +885=>250,890=>450,891=>504,892=>504,893=>504,894=>303,900=>450,901=>450,902=>650,903=>286, +904=>810,905=>935,906=>505,908=>751,910=>808,911=>767,912=>353,913=>650,914=>661,915=>624, +916=>650,917=>657,918=>625,919=>785,920=>738,921=>355,922=>672,923=>650,924=>921,925=>787, +926=>633,927=>738,928=>785,929=>605,931=>636,932=>600,933=>594,934=>738,935=>641,936=>789, +937=>746,938=>355,939=>594,940=>607,941=>483,942=>539,943=>353,944=>547,945=>607,946=>520, +947=>538,948=>542,949=>483,950=>488,951=>539,952=>542,953=>353,954=>590,955=>570,956=>584, +957=>547,958=>496,959=>542,960=>591,961=>529,962=>504,963=>614,964=>498,965=>547,966=>630, +967=>545,968=>706,969=>734,970=>353,971=>547,972=>542,973=>547,974=>734,976=>524,977=>643, +978=>618,979=>787,980=>618,981=>613,982=>734,983=>561,984=>738,985=>542,986=>688,987=>504, +988=>624,989=>417,990=>531,991=>593,992=>704,993=>519,1008=>561,1009=>529,1010=>504,1011=>279, +1012=>738,1013=>504,1014=>504,1015=>608,1016=>576,1017=>688,1018=>921,1019=>637,1020=>529,1021=>688, +1022=>688,1023=>688,1024=>657,1025=>657,1026=>719,1027=>596,1028=>688,1029=>616,1030=>355,1031=>355, +1032=>360,1033=>976,1034=>1006,1035=>785,1036=>696,1037=>785,1038=>650,1039=>785,1040=>681,1041=>661, +1042=>661,1043=>596,1044=>731,1045=>657,1046=>1011,1047=>561,1048=>785,1049=>785,1050=>696,1051=>751, +1052=>921,1053=>785,1054=>738,1055=>785,1056=>605,1057=>688,1058=>600,1059=>650,1060=>747,1061=>641, +1062=>785,1063=>695,1064=>1027,1065=>1027,1066=>715,1067=>885,1068=>606,1069=>688,1070=>1074,1071=>727, +1072=>536,1073=>549,1074=>523,1075=>455,1076=>570,1077=>532,1078=>1023,1079=>491,1080=>580,1081=>580, +1082=>537,1083=>573,1084=>746,1085=>593,1086=>542,1087=>580,1088=>576,1089=>504,1090=>853,1091=>522, +1092=>704,1093=>507,1094=>628,1095=>560,1096=>853,1097=>901,1098=>600,1099=>733,1100=>490,1101=>504, +1102=>792,1103=>596,1104=>532,1105=>532,1106=>561,1107=>455,1108=>504,1109=>461,1110=>288,1111=>288, +1112=>279,1113=>773,1114=>790,1115=>580,1116=>537,1117=>580,1118=>522,1119=>580,1122=>686,1123=>794, +1124=>1016,1125=>750,1130=>1011,1131=>828,1136=>849,1137=>812,1138=>738,1139=>497,1140=>773,1141=>610, +1164=>636,1165=>490,1168=>604,1169=>476,1170=>596,1171=>455,1172=>657,1173=>552,1174=>1011,1175=>1023, +1176=>561,1177=>491,1178=>696,1179=>544,1182=>696,1183=>537,1184=>803,1185=>602,1186=>785,1187=>641, +1188=>1025,1189=>771,1190=>1085,1191=>848,1194=>688,1195=>504,1196=>600,1197=>911,1198=>594,1199=>514, +1200=>594,1201=>514,1202=>641,1203=>566,1204=>842,1205=>659,1206=>674,1207=>609,1210=>674,1211=>580, +1216=>355,1217=>1011,1218=>1023,1219=>672,1220=>545,1223=>785,1224=>600,1227=>674,1228=>600,1231=>288, +1232=>681,1233=>536,1234=>681,1235=>536,1236=>901,1237=>846,1238=>657,1239=>532,1240=>738,1241=>532, +1242=>738,1243=>532,1244=>1011,1245=>1023,1246=>561,1247=>491,1248=>508,1249=>508,1250=>785,1251=>580, +1252=>785,1253=>580,1254=>738,1255=>542,1256=>738,1257=>542,1258=>738,1259=>542,1260=>688,1261=>504, +1262=>650,1263=>522,1264=>650,1265=>522,1266=>650,1267=>522,1268=>695,1269=>560,1270=>596,1271=>455, +1272=>885,1273=>733,1296=>561,1297=>491,1298=>751,1299=>573,1300=>1079,1301=>845,1306=>738,1307=>576, +1308=>925,1309=>770,4256=>659,4257=>773,4258=>753,4259=>782,4260=>668,4261=>892,4262=>833,4263=>1000, +4264=>519,4265=>684,4266=>875,4267=>856,4268=>677,4269=>976,4270=>815,4271=>754,4272=>944,4273=>668, +4274=>611,4275=>922,4276=>852,4277=>926,4278=>667,4279=>668,4280=>668,4281=>668,4282=>800,4283=>852, +4284=>651,4285=>688,4286=>668,4287=>871,4288=>909,4289=>641,4290=>786,4291=>669,4292=>762,4293=>864, +4304=>495,4305=>523,4306=>539,4307=>759,4308=>514,4309=>510,4310=>558,4311=>783,4312=>512,4313=>500, +4314=>968,4315=>536,4316=>536,4317=>751,4318=>521,4319=>531,4320=>750,4321=>546,4322=>682,4323=>631, +4324=>742,4325=>535,4326=>781,4327=>520,4328=>543,4329=>536,4330=>616,4331=>537,4332=>501,4333=>527, +4334=>562,4335=>624,4336=>523,4337=>551,4338=>523,4339=>523,4340=>522,4341=>593,4342=>806,4343=>572, +4344=>532,4345=>565,4346=>522,4347=>410,4348=>335,7426=>846,7432=>458,7433=>288,7444=>890,7446=>542, +7447=>542,7453=>663,7454=>853,7455=>853,7468=>409,7469=>567,7470=>417,7472=>454,7473=>413,7474=>413, +7475=>453,7476=>494,7477=>224,7478=>227,7479=>423,7480=>376,7481=>580,7482=>496,7483=>496,7484=>464, +7486=>381,7487=>426,7488=>378,7489=>478,7490=>583,7491=>347,7492=>347,7493=>360,7494=>556,7495=>360, +7496=>360,7497=>348,7498=>348,7499=>385,7500=>306,7501=>360,7502=>157,7503=>328,7504=>552,7505=>359, +7506=>347,7507=>312,7508=>347,7509=>347,7510=>360,7511=>222,7512=>359,7513=>417,7514=>552,7515=>335, +7522=>181,7523=>312,7524=>359,7525=>335,7543=>576,7544=>494,7547=>334,7557=>288,7579=>439,7580=>317, +7581=>317,7582=>426,7583=>385,7584=>209,7585=>285,7586=>439,7587=>359,7588=>181,7589=>181,7590=>181, +7591=>181,7592=>286,7593=>237,7594=>236,7595=>409,7596=>552,7597=>552,7598=>445,7599=>443,7600=>438, +7601=>347,7602=>426,7603=>374,7604=>269,7605=>301,7606=>359,7607=>429,7609=>417,7610=>320,7611=>298, +7612=>376,7613=>376,7614=>406,7615=>426,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0, +7680=>650,7681=>536,7682=>661,7683=>576,7684=>661,7685=>576,7686=>661,7687=>576,7688=>688,7689=>504, +7690=>721,7691=>576,7692=>721,7693=>576,7694=>721,7695=>576,7696=>721,7697=>576,7698=>721,7699=>576, +7700=>657,7701=>532,7702=>657,7703=>532,7704=>657,7705=>532,7706=>657,7707=>532,7708=>657,7709=>532, +7710=>624,7711=>333,7712=>719,7713=>576,7714=>785,7715=>580,7716=>785,7717=>580,7718=>785,7719=>580, +7720=>785,7721=>580,7722=>785,7723=>580,7724=>355,7725=>288,7728=>672,7729=>545,7730=>672,7731=>545, +7732=>672,7733=>545,7734=>598,7735=>288,7736=>598,7737=>288,7738=>598,7739=>288,7740=>598,7741=>288, +7742=>921,7743=>853,7744=>921,7745=>853,7746=>921,7747=>857,7748=>787,7749=>580,7750=>787,7751=>580, +7752=>787,7753=>580,7754=>787,7755=>580,7756=>738,7757=>542,7760=>738,7761=>542,7762=>738,7763=>542, +7764=>605,7765=>576,7766=>605,7767=>576,7768=>677,7769=>430,7770=>677,7771=>430,7772=>677,7773=>430, +7774=>677,7775=>430,7776=>616,7777=>461,7778=>616,7779=>461,7784=>616,7785=>461,7786=>600,7787=>361, +7788=>600,7789=>361,7790=>600,7791=>361,7792=>600,7793=>361,7794=>758,7795=>580,7796=>758,7797=>580, +7798=>758,7799=>580,7800=>758,7801=>580,7802=>758,7803=>580,7804=>650,7805=>508,7806=>650,7807=>508, +7808=>925,7809=>770,7810=>925,7811=>770,7812=>925,7813=>770,7814=>925,7815=>770,7816=>925,7817=>770, +7818=>641,7819=>507,7820=>641,7821=>507,7822=>594,7823=>508,7824=>625,7825=>474,7826=>625,7827=>474, +7828=>625,7829=>474,7830=>580,7831=>361,7832=>770,7833=>508,7834=>813,7835=>333,7838=>746,7839=>542, +7840=>650,7841=>536,7842=>650,7843=>536,7852=>650,7853=>536,7854=>650,7855=>536,7856=>650,7857=>536, +7858=>650,7859=>536,7860=>650,7861=>536,7862=>650,7863=>536,7864=>657,7865=>532,7866=>657,7867=>532, +7868=>657,7869=>532,7878=>657,7879=>532,7880=>355,7881=>288,7882=>355,7883=>288,7884=>738,7885=>542, +7886=>738,7887=>542,7896=>738,7897=>542,7908=>758,7909=>580,7910=>758,7911=>580,7922=>594,7923=>508, +7924=>594,7925=>508,7926=>594,7927=>508,7928=>594,7929=>508,7936=>607,7937=>607,7938=>607,7939=>607, +7940=>607,7941=>607,7942=>607,7943=>607,7944=>650,7945=>650,7946=>782,7947=>782,7948=>660,7949=>687, +7950=>650,7951=>650,7952=>483,7953=>483,7954=>483,7955=>483,7956=>483,7957=>483,7960=>768,7961=>757, +7962=>960,7963=>969,7964=>907,7965=>931,7968=>539,7969=>539,7970=>539,7971=>539,7972=>539,7973=>539, +7974=>539,7975=>539,7976=>898,7977=>893,7978=>1090,7979=>1101,7980=>1043,7981=>1064,7982=>988,7983=>985, +7984=>353,7985=>353,7986=>353,7987=>353,7988=>353,7989=>353,7990=>353,7991=>353,7992=>469,7993=>461, +7994=>661,7995=>664,7996=>611,7997=>635,7998=>561,7999=>553,8000=>542,8001=>542,8002=>542,8003=>542, +8004=>542,8005=>542,8008=>738,8009=>773,8010=>1008,8011=>1015,8012=>843,8013=>867,8016=>547,8017=>547, +8018=>547,8019=>547,8020=>547,8021=>547,8022=>547,8023=>547,8025=>765,8027=>971,8029=>939,8031=>857, +8032=>734,8033=>734,8034=>734,8035=>734,8036=>734,8037=>734,8038=>734,8039=>734,8040=>746,8041=>783, +8042=>1018,8043=>1023,8044=>852,8045=>878,8046=>844,8047=>873,8048=>607,8049=>607,8050=>483,8051=>483, +8052=>539,8053=>539,8054=>353,8055=>353,8056=>542,8057=>542,8058=>547,8059=>547,8060=>734,8061=>734, +8064=>607,8065=>607,8066=>607,8067=>607,8068=>607,8069=>607,8070=>607,8071=>607,8072=>650,8073=>650, +8074=>782,8075=>782,8076=>660,8077=>687,8078=>650,8079=>650,8080=>539,8081=>539,8082=>539,8083=>539, +8084=>539,8085=>539,8086=>539,8087=>539,8088=>898,8089=>893,8090=>1090,8091=>1101,8092=>1043,8093=>1064, +8094=>988,8095=>985,8096=>734,8097=>734,8098=>734,8099=>734,8100=>734,8101=>734,8102=>734,8103=>734, +8104=>746,8105=>783,8106=>1018,8107=>1023,8108=>852,8109=>878,8110=>844,8111=>873,8112=>607,8113=>607, +8114=>607,8115=>607,8116=>607,8118=>607,8119=>607,8120=>650,8121=>650,8122=>650,8123=>650,8124=>650, +8125=>450,8126=>450,8127=>450,8128=>450,8129=>450,8130=>539,8131=>539,8132=>539,8134=>539,8135=>539, +8136=>820,8137=>810,8138=>956,8139=>935,8140=>785,8141=>450,8142=>450,8143=>450,8144=>353,8145=>353, +8146=>353,8147=>353,8150=>353,8151=>353,8152=>355,8153=>355,8154=>529,8155=>505,8157=>450,8158=>450, +8159=>450,8160=>547,8161=>547,8162=>547,8163=>547,8164=>529,8165=>529,8166=>547,8167=>547,8168=>594, +8169=>594,8170=>829,8171=>808,8172=>711,8173=>450,8174=>450,8175=>450,8178=>734,8179=>734,8180=>734, +8182=>734,8183=>734,8184=>865,8185=>751,8186=>886,8187=>767,8188=>746,8189=>450,8190=>450,8192=>450, +8193=>900,8194=>450,8195=>900,8196=>296,8197=>225,8198=>150,8199=>572,8200=>286,8201=>180,8202=>89, +8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>304,8209=>304,8210=>572,8213=>900,8214=>450, +8215=>450,8219=>286,8223=>460,8227=>531,8228=>301,8229=>600,8234=>0,8235=>0,8236=>0,8237=>0, +8238=>0,8239=>180,8241=>1560,8242=>204,8243=>336,8244=>468,8245=>204,8246=>336,8247=>468,8248=>305, +8252=>475,8253=>482,8254=>450,8258=>900,8260=>150,8261=>351,8262=>351,8263=>878,8264=>678,8265=>678, +8267=>572,8268=>450,8269=>450,8270=>450,8271=>303,8273=>450,8274=>404,8275=>900,8279=>597,8287=>200, +8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0, +8303=>0,8304=>360,8305=>181,8308=>360,8309=>360,8310=>360,8311=>360,8312=>360,8313=>360,8314=>475, +8315=>475,8316=>475,8317=>221,8318=>221,8319=>365,8320=>360,8321=>360,8322=>360,8323=>360,8324=>360, +8325=>360,8326=>360,8327=>360,8328=>360,8329=>360,8330=>475,8331=>475,8332=>475,8333=>221,8334=>221, +8336=>347,8337=>348,8338=>347,8339=>319,8340=>348,8358=>594,8367=>951,8369=>635,8372=>702,8373=>572, +8451=>1006,8457=>942,8462=>580,8463=>580,8470=>852,8486=>746,8487=>746,8490=>672,8491=>650,8513=>697, +8514=>501,8515=>501,8516=>549,8523=>801,8531=>872,8532=>872,8533=>872,8534=>872,8535=>872,8536=>872, +8537=>872,8538=>872,8539=>872,8540=>872,8541=>872,8542=>872,8543=>511,8544=>355,8545=>531,8546=>707, +8547=>870,8548=>650,8549=>883,8550=>1059,8551=>1234,8552=>838,8553=>641,8554=>839,8555=>1015,8556=>598, +8557=>688,8558=>721,8559=>921,8560=>288,8561=>576,8562=>863,8563=>796,8564=>508,8565=>796,8566=>1084, +8567=>1372,8568=>795,8569=>507,8570=>795,8571=>1083,8572=>288,8573=>504,8574=>576,8575=>853,8576=>1085, +8577=>721,8578=>1085,8579=>688,8580=>504,8592=>754,8593=>754,8594=>754,8595=>754,8596=>754,8597=>754, +8598=>754,8599=>754,8600=>754,8601=>754,8602=>754,8603=>754,8604=>754,8605=>754,8606=>754,8607=>754, +8608=>754,8609=>754,8610=>754,8611=>754,8612=>754,8613=>754,8614=>754,8615=>754,8616=>754,8617=>754, +8618=>754,8619=>754,8620=>754,8621=>754,8622=>754,8623=>754,8624=>754,8625=>754,8626=>754,8627=>754, +8628=>754,8629=>754,8630=>754,8631=>754,8632=>754,8633=>754,8634=>754,8635=>754,8636=>754,8637=>754, +8638=>754,8639=>754,8640=>754,8641=>754,8642=>754,8643=>754,8644=>754,8645=>754,8646=>754,8647=>754, +8648=>754,8649=>754,8650=>754,8651=>754,8652=>754,8653=>754,8654=>754,8655=>754,8656=>754,8657=>754, +8658=>754,8659=>754,8660=>754,8661=>754,8662=>754,8663=>754,8664=>754,8665=>754,8666=>754,8667=>754, +8668=>754,8669=>754,8670=>754,8671=>754,8672=>754,8673=>754,8674=>754,8675=>754,8676=>754,8677=>754, +8678=>754,8679=>754,8680=>754,8681=>754,8682=>754,8683=>754,8684=>754,8685=>754,8686=>754,8687=>754, +8688=>754,8689=>754,8690=>754,8691=>754,8692=>754,8693=>754,8694=>754,8695=>754,8696=>754,8697=>754, +8698=>754,8699=>754,8700=>754,8701=>754,8702=>754,8703=>754,8704=>543,8706=>465,8707=>488,8708=>488, +8710=>628,8711=>628,8712=>666,8713=>666,8715=>666,8716=>666,8719=>716,8720=>716,8721=>642,8722=>754, +8723=>754,8724=>754,8725=>303,8727=>611,8728=>441,8729=>441,8730=>573,8731=>573,8732=>573,8733=>609, +8734=>750,8735=>754,8736=>754,8739=>262,8740=>431,8741=>416,8742=>570,8743=>659,8744=>659,8745=>754, +8746=>754,8747=>469,8748=>766,8749=>1063,8760=>754,8761=>754,8762=>754,8763=>754,8764=>754,8765=>754, +8770=>754,8771=>754,8776=>754,8784=>754,8785=>754,8786=>754,8787=>754,8788=>930,8789=>930,8800=>754, +8801=>754,8804=>754,8805=>754,8834=>754,8835=>754,8836=>754,8837=>754,8838=>754,8839=>754,8844=>754, +8845=>754,8846=>754,8847=>761,8848=>761,8849=>761,8850=>761,8851=>754,8852=>754,8853=>754,8854=>754, +8855=>754,8856=>754,8857=>754,8858=>754,8859=>754,8860=>754,8861=>754,8862=>754,8863=>754,8864=>754, +8865=>754,8866=>773,8867=>773,8868=>846,8869=>846,8870=>510,8871=>510,8872=>773,8873=>773,8874=>773, +8875=>927,8876=>773,8877=>773,8878=>773,8879=>927,8901=>308,8962=>687,8968=>351,8969=>351,8970=>351, +8971=>351,8976=>754,8977=>461,8984=>900,8985=>754,8992=>469,8993=>469,8997=>900,9000=>1299,9085=>827, +9134=>469,9167=>850,9251=>687,9472=>542,9473=>542,9474=>542,9475=>542,9476=>542,9477=>542,9478=>542, +9479=>542,9480=>542,9481=>542,9482=>542,9483=>542,9484=>542,9485=>542,9486=>542,9487=>542,9488=>542, +9489=>542,9490=>542,9491=>542,9492=>542,9493=>542,9494=>542,9495=>542,9496=>542,9497=>542,9498=>542, +9499=>542,9500=>542,9501=>542,9502=>542,9503=>542,9504=>542,9505=>542,9506=>542,9507=>542,9508=>542, +9509=>542,9510=>542,9511=>542,9512=>542,9513=>542,9514=>542,9515=>542,9516=>542,9517=>542,9518=>542, +9519=>542,9520=>542,9521=>542,9522=>542,9523=>542,9524=>542,9525=>542,9526=>542,9527=>542,9528=>542, +9529=>542,9530=>542,9531=>542,9532=>542,9533=>542,9534=>542,9535=>542,9536=>542,9537=>542,9538=>542, +9539=>542,9540=>542,9541=>542,9542=>542,9543=>542,9544=>542,9545=>542,9546=>542,9547=>542,9548=>542, +9549=>542,9550=>542,9551=>542,9552=>542,9553=>542,9554=>542,9555=>542,9556=>542,9557=>542,9558=>542, +9559=>542,9560=>542,9561=>542,9562=>542,9563=>542,9564=>542,9565=>542,9566=>542,9567=>542,9568=>542, +9569=>542,9570=>542,9571=>542,9572=>542,9573=>542,9574=>542,9575=>542,9576=>542,9577=>542,9578=>542, +9579=>542,9580=>542,9581=>542,9582=>542,9583=>542,9584=>542,9585=>542,9586=>542,9587=>542,9588=>542, +9589=>542,9590=>542,9591=>542,9592=>542,9593=>542,9594=>542,9595=>542,9596=>542,9597=>542,9598=>542, +9599=>542,9600=>692,9601=>692,9602=>692,9603=>692,9604=>692,9605=>692,9606=>692,9607=>692,9608=>692, +9609=>692,9610=>692,9611=>692,9612=>692,9613=>692,9614=>692,9615=>692,9616=>692,9617=>692,9618=>692, +9619=>692,9620=>692,9621=>692,9622=>692,9623=>692,9624=>692,9625=>692,9626=>692,9627=>692,9628=>692, +9629=>692,9630=>692,9631=>692,9632=>850,9633=>850,9634=>850,9635=>850,9636=>850,9637=>850,9638=>850, +9639=>850,9640=>850,9641=>850,9642=>610,9643=>610,9644=>850,9645=>850,9646=>495,9647=>495,9648=>692, +9649=>692,9650=>692,9651=>692,9652=>452,9653=>452,9654=>692,9655=>692,9656=>452,9657=>452,9658=>692, +9659=>692,9660=>692,9661=>692,9662=>452,9663=>452,9664=>692,9665=>692,9666=>452,9667=>452,9668=>692, +9669=>692,9670=>692,9671=>692,9672=>692,9673=>785,9674=>444,9675=>785,9676=>785,9677=>785,9678=>785, +9679=>785,9680=>785,9681=>785,9682=>785,9683=>785,9684=>785,9685=>785,9686=>474,9687=>474,9688=>712, +9689=>873,9690=>873,9691=>873,9692=>348,9693=>348,9694=>348,9695=>348,9696=>785,9697=>785,9698=>692, +9699=>692,9700=>692,9701=>692,9702=>531,9703=>850,9704=>850,9705=>850,9706=>850,9707=>850,9708=>692, +9709=>692,9710=>692,9711=>1007,9712=>850,9713=>850,9714=>850,9715=>850,9716=>785,9717=>785,9718=>785, +9719=>785,9720=>692,9721=>692,9722=>692,9723=>747,9724=>747,9725=>659,9726=>659,9727=>692,9728=>807, +9784=>807,9785=>807,9786=>807,9787=>807,9788=>807,9791=>552,9792=>658,9793=>658,9794=>807,9795=>807, +9796=>807,9797=>807,9798=>807,9799=>807,9824=>807,9825=>807,9826=>807,9827=>807,9828=>807,9829=>807, +9830=>807,9831=>807,9833=>424,9834=>574,9835=>807,9836=>807,9837=>424,9838=>321,9839=>435,10145=>754, +10181=>351,10182=>351,10208=>444,10216=>351,10217=>351,10224=>754,10225=>754,10226=>754,10227=>754,10228=>930, +10229=>1290,10230=>1290,10231=>1290,10232=>1290,10233=>1290,10234=>1290,10235=>1290,10236=>1290,10237=>1290,10238=>1290, +10239=>1290,10240=>659,10241=>659,10242=>659,10243=>659,10244=>659,10245=>659,10246=>659,10247=>659,10248=>659, +10249=>659,10250=>659,10251=>659,10252=>659,10253=>659,10254=>659,10255=>659,10256=>659,10257=>659,10258=>659, +10259=>659,10260=>659,10261=>659,10262=>659,10263=>659,10264=>659,10265=>659,10266=>659,10267=>659,10268=>659, +10269=>659,10270=>659,10271=>659,10272=>659,10273=>659,10274=>659,10275=>659,10276=>659,10277=>659,10278=>659, +10279=>659,10280=>659,10281=>659,10282=>659,10283=>659,10284=>659,10285=>659,10286=>659,10287=>659,10288=>659, +10289=>659,10290=>659,10291=>659,10292=>659,10293=>659,10294=>659,10295=>659,10296=>659,10297=>659,10298=>659, +10299=>659,10300=>659,10301=>659,10302=>659,10303=>659,10304=>659,10305=>659,10306=>659,10307=>659,10308=>659, +10309=>659,10310=>659,10311=>659,10312=>659,10313=>659,10314=>659,10315=>659,10316=>659,10317=>659,10318=>659, +10319=>659,10320=>659,10321=>659,10322=>659,10323=>659,10324=>659,10325=>659,10326=>659,10327=>659,10328=>659, +10329=>659,10330=>659,10331=>659,10332=>659,10333=>659,10334=>659,10335=>659,10336=>659,10337=>659,10338=>659, +10339=>659,10340=>659,10341=>659,10342=>659,10343=>659,10344=>659,10345=>659,10346=>659,10347=>659,10348=>659, +10349=>659,10350=>659,10351=>659,10352=>659,10353=>659,10354=>659,10355=>659,10356=>659,10357=>659,10358=>659, +10359=>659,10360=>659,10361=>659,10362=>659,10363=>659,10364=>659,10365=>659,10366=>659,10367=>659,10368=>659, +10369=>659,10370=>659,10371=>659,10372=>659,10373=>659,10374=>659,10375=>659,10376=>659,10377=>659,10378=>659, +10379=>659,10380=>659,10381=>659,10382=>659,10383=>659,10384=>659,10385=>659,10386=>659,10387=>659,10388=>659, +10389=>659,10390=>659,10391=>659,10392=>659,10393=>659,10394=>659,10395=>659,10396=>659,10397=>659,10398=>659, +10399=>659,10400=>659,10401=>659,10402=>659,10403=>659,10404=>659,10405=>659,10406=>659,10407=>659,10408=>659, +10409=>659,10410=>659,10411=>659,10412=>659,10413=>659,10414=>659,10415=>659,10416=>659,10417=>659,10418=>659, +10419=>659,10420=>659,10421=>659,10422=>659,10423=>659,10424=>659,10425=>659,10426=>659,10427=>659,10428=>659, +10429=>659,10430=>659,10431=>659,10432=>659,10433=>659,10434=>659,10435=>659,10436=>659,10437=>659,10438=>659, +10439=>659,10440=>659,10441=>659,10442=>659,10443=>659,10444=>659,10445=>659,10446=>659,10447=>659,10448=>659, +10449=>659,10450=>659,10451=>659,10452=>659,10453=>659,10454=>659,10455=>659,10456=>659,10457=>659,10458=>659, +10459=>659,10460=>659,10461=>659,10462=>659,10463=>659,10464=>659,10465=>659,10466=>659,10467=>659,10468=>659, +10469=>659,10470=>659,10471=>659,10472=>659,10473=>659,10474=>659,10475=>659,10476=>659,10477=>659,10478=>659, +10479=>659,10480=>659,10481=>659,10482=>659,10483=>659,10484=>659,10485=>659,10486=>659,10487=>659,10488=>659, +10489=>659,10490=>659,10491=>659,10492=>659,10493=>659,10494=>659,10495=>659,10496=>754,10497=>754,10498=>754, +10499=>754,10500=>754,10501=>754,10502=>754,10503=>754,10504=>754,10505=>754,10506=>754,10507=>754,10508=>754, +10509=>754,10510=>754,10511=>754,10512=>754,10513=>754,10514=>754,10515=>754,10516=>754,10517=>754,10518=>754, +10519=>754,10520=>754,10521=>754,10522=>754,10523=>754,10524=>754,10525=>754,10526=>754,10527=>754,10528=>754, +10529=>754,10530=>754,10531=>754,10532=>754,10533=>754,10534=>754,10535=>754,10536=>754,10537=>754,10538=>754, +10539=>754,10540=>754,10541=>754,10542=>754,10543=>754,10544=>754,10545=>754,10546=>754,10547=>754,10548=>754, +10549=>754,10550=>754,10551=>754,10552=>754,10553=>754,10554=>754,10555=>754,10556=>754,10557=>754,10558=>754, +10559=>754,10560=>754,10561=>754,10562=>754,10563=>754,10564=>754,10565=>754,10566=>754,10567=>754,10568=>754, +10569=>754,10570=>754,10571=>754,10572=>754,10573=>754,10574=>754,10575=>754,10576=>754,10577=>754,10578=>754, +10579=>754,10580=>754,10581=>754,10582=>754,10583=>754,10584=>754,10585=>754,10586=>754,10587=>754,10588=>754, +10589=>754,10590=>754,10591=>754,10592=>754,10593=>754,10594=>754,10595=>754,10596=>754,10597=>754,10598=>754, +10599=>754,10600=>754,10601=>754,10602=>754,10603=>754,10604=>754,10605=>754,10606=>754,10607=>754,10608=>754, +10609=>754,10610=>754,10611=>754,10612=>754,10613=>754,10614=>754,10615=>883,10616=>754,10617=>754,10618=>886, +10619=>754,10620=>754,10621=>754,10622=>754,10623=>754,10731=>444,10764=>1361,10765=>469,10766=>469,10799=>754, +11008=>754,11009=>754,11010=>754,11011=>754,11012=>754,11013=>754,11014=>754,11015=>754,11016=>754,11017=>754, +11018=>754,11019=>754,11020=>754,11021=>754,11022=>754,11023=>754,11024=>754,11025=>754,11026=>850,11027=>850, +11028=>850,11029=>850,11030=>692,11031=>692,11032=>692,11033=>692,11034=>850,11364=>677,11367=>785,11368=>580, +11369=>672,11370=>545,11371=>625,11372=>474,11374=>921,11375=>650,11381=>666,11382=>478,11383=>630,11385=>451, +11386=>542,11388=>237,11389=>409,11520=>695,11521=>571,11522=>569,11523=>592,11524=>568,11525=>866,11526=>680, +11527=>864,11528=>555,11529=>581,11530=>866,11531=>568,11532=>581,11533=>866,11534=>580,11535=>779,11536=>865, +11537=>580,11538=>580,11539=>863,11540=>851,11541=>777,11542=>580,11543=>581,11544=>580,11545=>584,11546=>619, +11547=>571,11548=>883,11549=>613,11550=>608,11551=>766,11552=>861,11553=>569,11554=>580,11555=>582,11556=>674, +11557=>822,11800=>482,11810=>351,11811=>351,11812=>351,11813=>351,11822=>482,42564=>616,42565=>461,42566=>355, +42567=>353,42576=>994,42577=>845,42580=>1074,42581=>783,42582=>1025,42583=>787,42760=>444,42761=>444,42762=>444, +42763=>444,42764=>444,42765=>444,42766=>444,42767=>444,42768=>444,42769=>444,42770=>444,42771=>444,42772=>444, +42773=>444,42774=>444,42779=>332,42780=>332,42781=>228,42782=>228,42783=>228,42891=>361,42892=>247,62464=>598, +62465=>607,62466=>651,62467=>861,62468=>607,62469=>602,62470=>661,62471=>896,62472=>607,62473=>607,62474=>1141, +62475=>624,62476=>623,62477=>866,62478=>607,62479=>623,62480=>908,62481=>681,62482=>728,62483=>682,62484=>859, +62485=>622,62486=>852,62487=>621,62488=>628,62489=>623,62490=>665,62491=>623,62492=>628,62493=>608,62494=>665, +62495=>805,62496=>607,62497=>707,62498=>608,62499=>607,62500=>607,62501=>659,62502=>875,62504=>813,63172=>455, +63173=>542,63174=>576,63175=>580,63176=>853,63185=>450,63188=>450,64256=>637,64257=>600,64258=>600,64259=>847, +64260=>887,64261=>669,64262=>824,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0, +65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65529=>0, +65530=>0,65531=>0,65532=>0,65533=>923); +$enc=''; +$diff=''; +$file='dejavuserifcondensedi.z'; +$ctg='dejavuserifcondensedi.ctg.z'; +$originalsize=301244; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedi.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedi.z new file mode 100644 index 0000000..eec24c6 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifcondensedi.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifi.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifi.ctg.z new file mode 100644 index 0000000..aa732f8 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifi.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifi.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifi.php new file mode 100644 index 0000000..cbe9e1d --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifi.php @@ -0,0 +1,312 @@ +<?php +$type='TrueTypeUnicode'; +$name='DejaVuSerif-Italic'; +$desc=array('Ascent'=>928,'Descent'=>-236,'CapHeight'=>-65,'Flags'=>96,'FontBBox'=>'[-839 -347 1650 1227]','ItalicAngle'=>-11,'StemV'=>70,'MissingWidth'=>600); +$up=-63; +$ut=44; +$dw=600; +$cw=array( +0=>600,32=>318,33=>402,34=>460,35=>838,36=>636,37=>950,38=>890,39=>275,40=>390, +41=>390,42=>500,43=>838,44=>318,45=>338,46=>318,47=>337,48=>636,49=>636,50=>636, +51=>636,52=>636,53=>636,54=>636,55=>636,56=>636,57=>636,58=>337,59=>337,60=>838, +61=>838,62=>838,63=>536,64=>1000,65=>722,66=>735,67=>765,68=>802,69=>730,70=>694, +71=>799,72=>872,73=>395,74=>401,75=>747,76=>664,77=>1024,78=>875,79=>820,80=>673, +81=>820,82=>753,83=>685,84=>667,85=>843,86=>722,87=>1028,88=>712,89=>660,90=>695, +91=>390,92=>337,93=>390,94=>838,95=>500,96=>500,97=>596,98=>640,99=>560,100=>640, +101=>592,102=>370,103=>640,104=>644,105=>320,106=>310,107=>606,108=>320,109=>948,110=>644, +111=>602,112=>640,113=>640,114=>478,115=>513,116=>402,117=>644,118=>565,119=>856,120=>564, +121=>565,122=>527,123=>636,124=>337,125=>636,126=>838,8364=>636,8218=>318,402=>370,8222=>518, +8230=>1000,8224=>500,8225=>500,710=>500,8240=>1342,352=>685,8249=>400,338=>1137,381=>695,8216=>318, +8217=>318,8220=>511,8221=>511,8226=>590,8211=>500,8212=>1000,732=>500,8482=>1000,353=>513,8250=>400, +339=>989,382=>527,376=>660,160=>318,161=>402,162=>636,163=>636,164=>636,165=>636,166=>337, +167=>500,168=>500,169=>1000,170=>475,171=>612,172=>838,173=>338,174=>1000,175=>500,176=>500, +177=>838,178=>401,179=>401,180=>500,181=>650,182=>636,183=>318,184=>500,185=>401,186=>470, +187=>612,188=>969,189=>969,190=>969,191=>536,192=>722,193=>722,194=>722,195=>722,196=>722, +197=>722,198=>1001,199=>765,200=>730,201=>730,202=>730,203=>730,204=>395,205=>395,206=>395, +207=>395,208=>807,209=>875,210=>820,211=>820,212=>820,213=>820,214=>820,215=>838,216=>820, +217=>843,218=>843,219=>843,220=>843,221=>660,222=>676,223=>668,224=>596,225=>596,226=>596, +227=>596,228=>596,229=>596,230=>940,231=>560,232=>592,233=>592,234=>592,235=>592,236=>320, +237=>320,238=>320,239=>320,240=>602,241=>644,242=>602,243=>602,244=>602,245=>602,246=>602, +247=>838,248=>602,249=>644,250=>644,251=>644,252=>644,253=>565,254=>640,255=>565,256=>722, +257=>596,258=>722,259=>596,260=>722,261=>596,262=>765,263=>560,264=>765,265=>560,266=>765, +267=>560,268=>765,269=>560,270=>802,271=>640,272=>807,273=>640,274=>730,275=>592,276=>730, +277=>592,278=>730,279=>592,280=>730,281=>592,282=>730,283=>592,284=>799,285=>640,286=>799, +287=>640,288=>799,289=>640,290=>799,291=>640,292=>872,293=>644,294=>872,295=>644,296=>395, +297=>320,298=>395,299=>320,300=>395,301=>320,302=>395,303=>320,304=>395,305=>320,306=>801, +307=>533,308=>401,309=>310,310=>747,311=>606,312=>606,313=>664,314=>320,315=>664,316=>320, +317=>664,318=>400,319=>671,320=>465,321=>669,322=>324,323=>875,324=>644,325=>875,326=>644, +327=>875,328=>644,329=>866,330=>843,331=>644,332=>820,333=>602,334=>820,335=>602,336=>820, +337=>602,340=>753,341=>478,342=>753,343=>478,344=>753,345=>478,346=>685,347=>513,348=>685, +349=>513,350=>685,351=>513,354=>667,355=>402,356=>667,357=>402,358=>667,359=>402,360=>843, +361=>644,362=>843,363=>644,364=>843,365=>644,366=>843,367=>644,368=>843,369=>644,370=>843, +371=>644,372=>1028,373=>856,374=>660,375=>565,377=>695,378=>527,379=>695,380=>527,383=>370, +384=>640,385=>735,386=>735,387=>640,388=>735,389=>640,390=>765,391=>765,392=>560,393=>807, +394=>802,395=>735,396=>640,397=>602,398=>730,399=>820,400=>623,401=>694,403=>799,404=>712, +405=>932,406=>395,407=>395,408=>747,409=>606,410=>320,411=>634,412=>948,413=>875,414=>644, +415=>820,416=>820,417=>602,418=>1040,419=>807,420=>673,421=>640,422=>753,423=>685,424=>513, +425=>707,426=>324,427=>402,428=>667,429=>402,430=>667,431=>843,432=>644,433=>829,434=>760, +435=>738,436=>745,437=>695,438=>527,439=>564,440=>564,441=>564,443=>636,444=>687,445=>564, +446=>536,448=>295,449=>492,450=>459,451=>295,452=>1497,453=>1329,454=>1167,455=>1065,456=>974, +457=>630,458=>1276,459=>1185,460=>954,461=>722,462=>596,463=>395,464=>320,465=>820,466=>602, +467=>843,468=>644,469=>843,470=>644,471=>843,472=>644,473=>843,474=>644,475=>843,476=>644, +477=>592,478=>722,479=>596,480=>722,481=>596,482=>1001,483=>940,484=>848,485=>640,486=>799, +487=>640,488=>747,489=>606,490=>820,491=>602,492=>820,493=>602,494=>564,495=>564,496=>320, +497=>1497,498=>1329,499=>1167,500=>799,501=>640,502=>1154,504=>875,505=>644,506=>722,507=>596, +508=>1001,509=>940,510=>820,511=>602,512=>722,513=>596,514=>722,515=>596,516=>730,517=>592, +518=>730,519=>592,520=>395,521=>320,522=>395,523=>320,524=>820,525=>602,526=>820,527=>602, +528=>753,529=>478,530=>753,531=>478,532=>843,533=>644,534=>843,535=>644,536=>685,537=>513, +538=>667,539=>402,540=>627,541=>521,542=>872,543=>644,544=>843,545=>814,548=>695,549=>527, +550=>722,551=>596,552=>730,553=>592,554=>820,555=>602,556=>820,557=>602,558=>820,559=>602, +560=>820,561=>602,562=>660,563=>565,564=>500,565=>832,566=>494,567=>310,568=>960,569=>960, +570=>722,571=>765,572=>560,573=>664,574=>667,575=>513,576=>527,577=>583,578=>464,581=>722, +592=>596,593=>640,594=>675,595=>640,596=>560,597=>560,598=>647,599=>683,600=>592,601=>592, +602=>843,603=>537,604=>509,605=>773,606=>613,607=>315,608=>683,609=>640,610=>544,611=>712, +612=>564,613=>644,614=>644,615=>644,616=>320,617=>392,618=>320,619=>380,620=>454,621=>363, +622=>704,623=>948,624=>948,625=>948,626=>644,627=>694,628=>646,629=>602,630=>790,631=>647, +632=>602,633=>501,634=>501,635=>551,636=>478,637=>478,638=>453,639=>453,640=>594,641=>594, +642=>513,643=>271,644=>370,645=>487,646=>324,647=>402,648=>402,649=>644,650=>620,651=>608, +652=>565,653=>856,654=>565,655=>655,656=>597,657=>560,658=>564,659=>560,660=>536,661=>536, +662=>536,663=>513,664=>820,665=>563,666=>613,667=>654,668=>667,669=>366,670=>606,671=>646, +672=>683,673=>536,674=>536,675=>996,676=>1033,677=>998,678=>809,679=>598,680=>782,681=>894, +682=>646,683=>676,684=>598,685=>443,686=>781,687=>767,688=>433,689=>430,690=>264,691=>347, +692=>347,693=>430,694=>392,695=>539,696=>355,697=>278,699=>318,700=>318,701=>318,702=>307, +703=>307,704=>280,705=>281,711=>500,712=>282,713=>500,716=>282,720=>337,721=>337,722=>307, +723=>307,726=>392,728=>500,729=>500,730=>500,731=>500,733=>500,734=>417,736=>448,737=>243, +738=>337,739=>355,740=>281,741=>493,742=>493,743=>493,744=>493,745=>493,750=>484,768=>0, +769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0, +779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0, +789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0, +799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0, +809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0, +819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0, +829=>0,830=>0,831=>0,835=>0,847=>0,856=>0,865=>0,880=>740,881=>531,884=>278, +885=>278,890=>500,891=>560,892=>560,893=>560,894=>337,900=>500,901=>500,902=>722,903=>318, +904=>900,905=>1039,906=>562,908=>835,910=>897,911=>853,912=>392,913=>722,914=>735,915=>694, +916=>722,917=>730,918=>695,919=>872,920=>820,921=>395,922=>747,923=>722,924=>1024,925=>875, +926=>704,927=>820,928=>872,929=>673,931=>707,932=>667,933=>660,934=>820,935=>712,936=>877, +937=>829,938=>395,939=>660,940=>675,941=>537,942=>599,943=>392,944=>608,945=>675,946=>578, +947=>598,948=>602,949=>537,950=>542,951=>599,952=>602,953=>392,954=>656,955=>634,956=>650, +957=>608,958=>551,959=>602,960=>657,961=>588,962=>560,963=>683,964=>553,965=>608,966=>700, +967=>606,968=>784,969=>815,970=>392,971=>608,972=>602,973=>608,974=>815,976=>583,977=>715, +978=>687,979=>874,980=>687,981=>682,982=>815,983=>624,984=>820,985=>602,986=>765,987=>560, +988=>694,989=>463,990=>590,991=>660,992=>782,993=>577,1008=>624,1009=>588,1010=>560,1011=>310, +1012=>820,1013=>560,1014=>560,1015=>676,1016=>640,1017=>765,1018=>1024,1019=>708,1020=>588,1021=>765, +1022=>765,1023=>765,1024=>730,1025=>730,1026=>799,1027=>662,1028=>765,1029=>685,1030=>395,1031=>395, +1032=>401,1033=>1084,1034=>1118,1035=>872,1036=>774,1037=>872,1038=>723,1039=>872,1040=>757,1041=>735, +1042=>735,1043=>662,1044=>813,1045=>730,1046=>1124,1047=>623,1048=>872,1049=>872,1050=>774,1051=>834, +1052=>1024,1053=>872,1054=>820,1055=>872,1056=>673,1057=>765,1058=>667,1059=>723,1060=>830,1061=>712, +1062=>872,1063=>773,1064=>1141,1065=>1141,1066=>794,1067=>984,1068=>674,1069=>765,1070=>1193,1071=>808, +1072=>596,1073=>610,1074=>582,1075=>505,1076=>634,1077=>592,1078=>1137,1079=>545,1080=>644,1081=>644, +1082=>597,1083=>637,1084=>829,1085=>659,1086=>602,1087=>644,1088=>640,1089=>560,1090=>948,1091=>580, +1092=>783,1093=>564,1094=>698,1095=>622,1096=>947,1097=>1001,1098=>667,1099=>814,1100=>544,1101=>560, +1102=>880,1103=>662,1104=>592,1105=>592,1106=>624,1107=>505,1108=>560,1109=>513,1110=>320,1111=>320, +1112=>310,1113=>859,1114=>878,1115=>644,1116=>597,1117=>644,1118=>580,1119=>644,1122=>762,1123=>882, +1124=>1129,1125=>834,1130=>1124,1131=>920,1136=>944,1137=>902,1138=>820,1139=>552,1140=>859,1141=>678, +1164=>707,1165=>544,1168=>672,1169=>529,1170=>662,1171=>505,1172=>730,1173=>614,1174=>1124,1175=>1137, +1176=>623,1177=>545,1178=>774,1179=>604,1182=>774,1183=>597,1184=>892,1185=>669,1186=>872,1187=>712, +1188=>1139,1189=>857,1190=>1206,1191=>943,1194=>765,1195=>560,1196=>667,1197=>1013,1198=>660,1199=>571, +1200=>660,1201=>571,1202=>712,1203=>629,1204=>936,1205=>732,1206=>749,1207=>677,1210=>749,1211=>644, +1216=>395,1217=>1124,1218=>1137,1219=>747,1220=>606,1223=>872,1224=>667,1227=>749,1228=>667,1231=>320, +1232=>757,1233=>596,1234=>757,1235=>596,1236=>1001,1237=>940,1238=>730,1239=>592,1240=>820,1241=>592, +1242=>820,1243=>592,1244=>1124,1245=>1137,1246=>623,1247=>545,1248=>564,1249=>564,1250=>872,1251=>644, +1252=>872,1253=>644,1254=>820,1255=>602,1256=>820,1257=>602,1258=>820,1259=>602,1260=>765,1261=>560, +1262=>723,1263=>580,1264=>723,1265=>580,1266=>723,1267=>580,1268=>773,1269=>622,1270=>662,1271=>505, +1272=>984,1273=>814,1296=>623,1297=>545,1298=>834,1299=>637,1300=>1199,1301=>939,1306=>820,1307=>640, +1308=>1028,1309=>856,4256=>732,4257=>860,4258=>837,4259=>869,4260=>743,4261=>991,4262=>925,4263=>1111, +4264=>576,4265=>760,4266=>972,4267=>951,4268=>753,4269=>1084,4270=>906,4271=>838,4272=>1049,4273=>743, +4274=>679,4275=>1025,4276=>946,4277=>1029,4278=>741,4279=>743,4280=>742,4281=>743,4282=>889,4283=>946, +4284=>724,4285=>765,4286=>743,4287=>968,4288=>1010,4289=>712,4290=>874,4291=>744,4292=>847,4293=>960, +4304=>550,4305=>581,4306=>599,4307=>843,4308=>571,4309=>567,4310=>620,4311=>871,4312=>569,4313=>556, +4314=>1076,4315=>596,4316=>596,4317=>835,4318=>580,4319=>590,4320=>833,4321=>607,4322=>758,4323=>701, +4324=>825,4325=>595,4326=>868,4327=>578,4328=>604,4329=>596,4330=>685,4331=>597,4332=>557,4333=>585, +4334=>625,4335=>693,4336=>582,4337=>613,4338=>581,4339=>582,4340=>580,4341=>659,4342=>896,4343=>636, +4344=>592,4345=>628,4346=>581,4347=>456,4348=>373,7426=>940,7432=>509,7433=>320,7444=>989,7446=>602, +7447=>602,7453=>737,7454=>948,7455=>948,7468=>455,7469=>630,7470=>463,7472=>505,7473=>459,7474=>459, +7475=>503,7476=>549,7477=>249,7478=>252,7479=>470,7480=>418,7481=>645,7482=>551,7483=>551,7484=>516, +7486=>424,7487=>474,7488=>420,7489=>531,7490=>647,7491=>386,7492=>386,7493=>400,7494=>618,7495=>400, +7496=>400,7497=>387,7498=>387,7499=>428,7500=>340,7501=>400,7502=>175,7503=>365,7504=>613,7505=>399, +7506=>385,7507=>346,7508=>385,7509=>385,7510=>400,7511=>247,7512=>399,7513=>464,7514=>613,7515=>373, +7522=>201,7523=>347,7524=>399,7525=>373,7543=>640,7544=>549,7547=>372,7557=>320,7579=>488,7580=>353, +7581=>353,7582=>473,7583=>428,7584=>233,7585=>316,7586=>488,7587=>399,7588=>201,7589=>201,7590=>201, +7591=>201,7592=>318,7593=>263,7594=>263,7595=>455,7596=>613,7597=>613,7598=>495,7599=>492,7600=>487, +7601=>385,7602=>473,7603=>416,7604=>299,7605=>334,7606=>399,7607=>477,7609=>464,7610=>355,7611=>332, +7612=>418,7613=>418,7614=>452,7615=>473,7620=>0,7621=>0,7622=>0,7623=>0,7624=>0,7625=>0, +7680=>722,7681=>596,7682=>735,7683=>640,7684=>735,7685=>640,7686=>735,7687=>640,7688=>765,7689=>560, +7690=>802,7691=>640,7692=>802,7693=>640,7694=>802,7695=>640,7696=>802,7697=>640,7698=>802,7699=>640, +7700=>730,7701=>592,7702=>730,7703=>592,7704=>730,7705=>592,7706=>730,7707=>592,7708=>730,7709=>592, +7710=>694,7711=>370,7712=>799,7713=>640,7714=>872,7715=>644,7716=>872,7717=>644,7718=>872,7719=>644, +7720=>872,7721=>644,7722=>872,7723=>644,7724=>395,7725=>320,7728=>747,7729=>606,7730=>747,7731=>606, +7732=>747,7733=>606,7734=>664,7735=>320,7736=>664,7737=>320,7738=>664,7739=>320,7740=>664,7741=>320, +7742=>1024,7743=>948,7744=>1024,7745=>948,7746=>1024,7747=>953,7748=>875,7749=>644,7750=>875,7751=>644, +7752=>875,7753=>644,7754=>875,7755=>644,7756=>820,7757=>602,7760=>820,7761=>602,7762=>820,7763=>602, +7764=>673,7765=>640,7766=>673,7767=>640,7768=>753,7769=>478,7770=>753,7771=>478,7772=>753,7773=>478, +7774=>753,7775=>478,7776=>685,7777=>513,7778=>685,7779=>513,7784=>685,7785=>513,7786=>667,7787=>402, +7788=>667,7789=>402,7790=>667,7791=>402,7792=>667,7793=>402,7794=>843,7795=>644,7796=>843,7797=>644, +7798=>843,7799=>644,7800=>843,7801=>644,7802=>843,7803=>644,7804=>722,7805=>565,7806=>722,7807=>565, +7808=>1028,7809=>856,7810=>1028,7811=>856,7812=>1028,7813=>856,7814=>1028,7815=>856,7816=>1028,7817=>856, +7818=>712,7819=>564,7820=>712,7821=>564,7822=>660,7823=>565,7824=>695,7825=>527,7826=>695,7827=>527, +7828=>695,7829=>527,7830=>644,7831=>402,7832=>856,7833=>565,7834=>903,7835=>370,7838=>829,7839=>602, +7840=>722,7841=>596,7842=>722,7843=>596,7852=>722,7853=>596,7854=>722,7855=>596,7856=>722,7857=>596, +7858=>722,7859=>596,7860=>722,7861=>596,7862=>722,7863=>596,7864=>730,7865=>592,7866=>730,7867=>592, +7868=>730,7869=>592,7878=>730,7879=>592,7880=>395,7881=>320,7882=>395,7883=>320,7884=>820,7885=>602, +7886=>820,7887=>602,7896=>820,7897=>602,7908=>843,7909=>644,7910=>843,7911=>644,7922=>660,7923=>565, +7924=>660,7925=>565,7926=>660,7927=>565,7928=>660,7929=>565,7936=>675,7937=>675,7938=>675,7939=>675, +7940=>675,7941=>675,7942=>675,7943=>675,7944=>722,7945=>722,7946=>869,7947=>869,7948=>734,7949=>763, +7950=>722,7951=>722,7952=>537,7953=>537,7954=>537,7955=>537,7956=>537,7957=>537,7960=>853,7961=>841, +7962=>1067,7963=>1077,7964=>1008,7965=>1035,7968=>599,7969=>599,7970=>599,7971=>599,7972=>599,7973=>599, +7974=>599,7975=>599,7976=>998,7977=>992,7978=>1212,7979=>1224,7980=>1159,7981=>1183,7982=>1098,7983=>1095, +7984=>392,7985=>392,7986=>392,7987=>392,7988=>392,7989=>392,7990=>392,7991=>392,7992=>521,7993=>512, +7994=>735,7995=>738,7996=>679,7997=>706,7998=>624,7999=>615,8000=>602,8001=>602,8002=>602,8003=>602, +8004=>602,8005=>602,8008=>820,8009=>859,8010=>1120,8011=>1127,8012=>937,8013=>964,8016=>608,8017=>608, +8018=>608,8019=>608,8020=>608,8021=>608,8022=>608,8023=>608,8025=>851,8027=>1079,8029=>1044,8031=>953, +8032=>815,8033=>815,8034=>815,8035=>815,8036=>815,8037=>815,8038=>815,8039=>815,8040=>829,8041=>870, +8042=>1131,8043=>1137,8044=>946,8045=>976,8046=>938,8047=>970,8048=>675,8049=>675,8050=>537,8051=>537, +8052=>599,8053=>599,8054=>392,8055=>392,8056=>602,8057=>602,8058=>608,8059=>608,8060=>815,8061=>815, +8064=>675,8065=>675,8066=>675,8067=>675,8068=>675,8069=>675,8070=>675,8071=>675,8072=>722,8073=>722, +8074=>869,8075=>869,8076=>734,8077=>763,8078=>722,8079=>722,8080=>599,8081=>599,8082=>599,8083=>599, +8084=>599,8085=>599,8086=>599,8087=>599,8088=>998,8089=>992,8090=>1212,8091=>1224,8092=>1159,8093=>1183, +8094=>1098,8095=>1095,8096=>815,8097=>815,8098=>815,8099=>815,8100=>815,8101=>815,8102=>815,8103=>815, +8104=>829,8105=>870,8106=>1131,8107=>1137,8108=>946,8109=>976,8110=>938,8111=>970,8112=>675,8113=>675, +8114=>675,8115=>675,8116=>675,8118=>675,8119=>675,8120=>722,8121=>722,8122=>722,8123=>722,8124=>722, +8125=>500,8126=>500,8127=>500,8128=>500,8129=>500,8130=>599,8131=>599,8132=>599,8134=>599,8135=>599, +8136=>912,8137=>900,8138=>1063,8139=>1039,8140=>872,8141=>500,8142=>500,8143=>500,8144=>392,8145=>392, +8146=>392,8147=>392,8150=>392,8151=>392,8152=>395,8153=>395,8154=>588,8155=>562,8157=>500,8158=>500, +8159=>500,8160=>608,8161=>608,8162=>608,8163=>608,8164=>588,8165=>588,8166=>608,8167=>608,8168=>660, +8169=>660,8170=>921,8171=>897,8172=>790,8173=>500,8174=>500,8175=>500,8178=>815,8179=>815,8180=>815, +8182=>815,8183=>815,8184=>961,8185=>835,8186=>984,8187=>853,8188=>829,8189=>500,8190=>500,8192=>500, +8193=>1000,8194=>500,8195=>1000,8196=>330,8197=>250,8198=>167,8199=>636,8200=>318,8201=>200,8202=>100, +8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>338,8209=>338,8210=>636,8213=>1000,8214=>500, +8215=>500,8219=>318,8223=>511,8227=>590,8228=>334,8229=>667,8234=>0,8235=>0,8236=>0,8237=>0, +8238=>0,8239=>200,8241=>1734,8242=>227,8243=>374,8244=>520,8245=>227,8246=>374,8247=>520,8248=>339, +8252=>527,8253=>536,8254=>500,8258=>1000,8260=>167,8261=>390,8262=>390,8263=>976,8264=>753,8265=>753, +8267=>636,8268=>500,8269=>500,8270=>500,8271=>337,8273=>500,8274=>450,8275=>1000,8279=>663,8287=>222, +8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8298=>0,8299=>0,8300=>0,8301=>0,8302=>0, +8303=>0,8304=>401,8305=>201,8308=>401,8309=>401,8310=>401,8311=>401,8312=>401,8313=>401,8314=>528, +8315=>528,8316=>528,8317=>246,8318=>246,8319=>405,8320=>401,8321=>401,8322=>401,8323=>401,8324=>401, +8325=>401,8326=>401,8327=>401,8328=>401,8329=>401,8330=>528,8331=>528,8332=>528,8333=>246,8334=>246, +8336=>386,8337=>387,8338=>385,8339=>355,8340=>387,8358=>660,8367=>1057,8369=>706,8372=>780,8373=>636, +8451=>1119,8457=>1047,8462=>644,8463=>644,8470=>946,8486=>829,8487=>829,8490=>747,8491=>722,8513=>775, +8514=>557,8515=>557,8516=>611,8523=>890,8531=>969,8532=>969,8533=>969,8534=>969,8535=>969,8536=>969, +8537=>969,8538=>969,8539=>969,8540=>969,8541=>969,8542=>969,8543=>568,8544=>395,8545=>590,8546=>786, +8547=>966,8548=>722,8549=>981,8550=>1176,8551=>1372,8552=>932,8553=>712,8554=>932,8555=>1127,8556=>664, +8557=>765,8558=>802,8559=>1024,8560=>320,8561=>640,8562=>959,8563=>885,8564=>565,8565=>885,8566=>1205, +8567=>1524,8568=>884,8569=>564,8570=>884,8571=>1204,8572=>320,8573=>560,8574=>640,8575=>948,8576=>1206, +8577=>802,8578=>1206,8579=>765,8580=>560,8592=>838,8593=>838,8594=>838,8595=>838,8596=>838,8597=>838, +8598=>838,8599=>838,8600=>838,8601=>838,8602=>838,8603=>838,8604=>838,8605=>838,8606=>838,8607=>838, +8608=>838,8609=>838,8610=>838,8611=>838,8612=>838,8613=>838,8614=>838,8615=>838,8616=>838,8617=>838, +8618=>838,8619=>838,8620=>838,8621=>838,8622=>838,8623=>838,8624=>838,8625=>838,8626=>838,8627=>838, +8628=>838,8629=>838,8630=>838,8631=>838,8632=>838,8633=>838,8634=>838,8635=>838,8636=>838,8637=>838, +8638=>838,8639=>838,8640=>838,8641=>838,8642=>838,8643=>838,8644=>838,8645=>838,8646=>838,8647=>838, +8648=>838,8649=>838,8650=>838,8651=>838,8652=>838,8653=>838,8654=>838,8655=>838,8656=>838,8657=>838, +8658=>838,8659=>838,8660=>838,8661=>838,8662=>838,8663=>838,8664=>838,8665=>838,8666=>838,8667=>838, +8668=>838,8669=>838,8670=>838,8671=>838,8672=>838,8673=>838,8674=>838,8675=>838,8676=>838,8677=>838, +8678=>838,8679=>838,8680=>838,8681=>838,8682=>838,8683=>838,8684=>838,8685=>838,8686=>838,8687=>838, +8688=>838,8689=>838,8690=>838,8691=>838,8692=>838,8693=>838,8694=>838,8695=>838,8696=>838,8697=>838, +8698=>838,8699=>838,8700=>838,8701=>838,8702=>838,8703=>838,8704=>604,8706=>517,8707=>542,8708=>542, +8710=>698,8711=>698,8712=>740,8713=>740,8715=>740,8716=>740,8719=>796,8720=>796,8721=>714,8722=>838, +8723=>838,8724=>838,8725=>337,8727=>680,8728=>490,8729=>490,8730=>637,8731=>637,8732=>637,8733=>677, +8734=>833,8735=>838,8736=>838,8739=>291,8740=>479,8741=>462,8742=>634,8743=>732,8744=>732,8745=>838, +8746=>838,8747=>521,8748=>852,8749=>1182,8760=>838,8761=>838,8762=>838,8763=>838,8764=>838,8765=>838, +8770=>838,8771=>838,8776=>838,8784=>838,8785=>838,8786=>838,8787=>838,8788=>1033,8789=>1033,8800=>838, +8801=>838,8804=>838,8805=>838,8834=>838,8835=>838,8836=>838,8837=>838,8838=>838,8839=>838,8844=>838, +8845=>838,8846=>838,8847=>846,8848=>846,8849=>846,8850=>846,8851=>838,8852=>838,8853=>838,8854=>838, +8855=>838,8856=>838,8857=>838,8858=>838,8859=>838,8860=>838,8861=>838,8862=>838,8863=>838,8864=>838, +8865=>838,8866=>860,8867=>860,8868=>940,8869=>940,8870=>567,8871=>567,8872=>860,8873=>860,8874=>860, +8875=>1031,8876=>860,8877=>860,8878=>860,8879=>1031,8901=>342,8962=>764,8968=>390,8969=>390,8970=>390, +8971=>390,8976=>838,8977=>513,8984=>1000,8985=>838,8992=>521,8993=>521,8997=>1000,9000=>1443,9085=>919, +9134=>521,9167=>945,9251=>764,9472=>602,9473=>602,9474=>602,9475=>602,9476=>602,9477=>602,9478=>602, +9479=>602,9480=>602,9481=>602,9482=>602,9483=>602,9484=>602,9485=>602,9486=>602,9487=>602,9488=>602, +9489=>602,9490=>602,9491=>602,9492=>602,9493=>602,9494=>602,9495=>602,9496=>602,9497=>602,9498=>602, +9499=>602,9500=>602,9501=>602,9502=>602,9503=>602,9504=>602,9505=>602,9506=>602,9507=>602,9508=>602, +9509=>602,9510=>602,9511=>602,9512=>602,9513=>602,9514=>602,9515=>602,9516=>602,9517=>602,9518=>602, +9519=>602,9520=>602,9521=>602,9522=>602,9523=>602,9524=>602,9525=>602,9526=>602,9527=>602,9528=>602, +9529=>602,9530=>602,9531=>602,9532=>602,9533=>602,9534=>602,9535=>602,9536=>602,9537=>602,9538=>602, +9539=>602,9540=>602,9541=>602,9542=>602,9543=>602,9544=>602,9545=>602,9546=>602,9547=>602,9548=>602, +9549=>602,9550=>602,9551=>602,9552=>602,9553=>602,9554=>602,9555=>602,9556=>602,9557=>602,9558=>602, +9559=>602,9560=>602,9561=>602,9562=>602,9563=>602,9564=>602,9565=>602,9566=>602,9567=>602,9568=>602, +9569=>602,9570=>602,9571=>602,9572=>602,9573=>602,9574=>602,9575=>602,9576=>602,9577=>602,9578=>602, +9579=>602,9580=>602,9581=>602,9582=>602,9583=>602,9584=>602,9585=>602,9586=>602,9587=>602,9588=>602, +9589=>602,9590=>602,9591=>602,9592=>602,9593=>602,9594=>602,9595=>602,9596=>602,9597=>602,9598=>602, +9599=>602,9600=>769,9601=>769,9602=>769,9603=>769,9604=>769,9605=>769,9606=>769,9607=>769,9608=>769, +9609=>769,9610=>769,9611=>769,9612=>769,9613=>769,9614=>769,9615=>769,9616=>769,9617=>769,9618=>769, +9619=>769,9620=>769,9621=>769,9622=>769,9623=>769,9624=>769,9625=>769,9626=>769,9627=>769,9628=>769, +9629=>769,9630=>769,9631=>769,9632=>945,9633=>945,9634=>945,9635=>945,9636=>945,9637=>945,9638=>945, +9639=>945,9640=>945,9641=>945,9642=>678,9643=>678,9644=>945,9645=>945,9646=>550,9647=>550,9648=>769, +9649=>769,9650=>769,9651=>769,9652=>502,9653=>502,9654=>769,9655=>769,9656=>502,9657=>502,9658=>769, +9659=>769,9660=>769,9661=>769,9662=>502,9663=>502,9664=>769,9665=>769,9666=>502,9667=>502,9668=>769, +9669=>769,9670=>769,9671=>769,9672=>769,9673=>873,9674=>494,9675=>873,9676=>873,9677=>873,9678=>873, +9679=>873,9680=>873,9681=>873,9682=>873,9683=>873,9684=>873,9685=>873,9686=>527,9687=>527,9688=>791, +9689=>970,9690=>970,9691=>970,9692=>387,9693=>387,9694=>387,9695=>387,9696=>873,9697=>873,9698=>769, +9699=>769,9700=>769,9701=>769,9702=>590,9703=>945,9704=>945,9705=>945,9706=>945,9707=>945,9708=>769, +9709=>769,9710=>769,9711=>1119,9712=>945,9713=>945,9714=>945,9715=>945,9716=>873,9717=>873,9718=>873, +9719=>873,9720=>769,9721=>769,9722=>769,9723=>830,9724=>830,9725=>732,9726=>732,9727=>769,9728=>896, +9784=>896,9785=>896,9786=>896,9787=>896,9788=>896,9791=>614,9792=>731,9793=>731,9794=>896,9795=>896, +9796=>896,9797=>896,9798=>896,9799=>896,9824=>896,9825=>896,9826=>896,9827=>896,9828=>896,9829=>896, +9830=>896,9831=>896,9833=>472,9834=>638,9835=>896,9836=>896,9837=>472,9838=>357,9839=>484,10145=>838, +10181=>390,10182=>390,10208=>494,10216=>390,10217=>390,10224=>838,10225=>838,10226=>838,10227=>838,10228=>1033, +10229=>1434,10230=>1434,10231=>1434,10232=>1434,10233=>1434,10234=>1434,10235=>1434,10236=>1434,10237=>1434,10238=>1434, +10239=>1434,10240=>732,10241=>732,10242=>732,10243=>732,10244=>732,10245=>732,10246=>732,10247=>732,10248=>732, +10249=>732,10250=>732,10251=>732,10252=>732,10253=>732,10254=>732,10255=>732,10256=>732,10257=>732,10258=>732, +10259=>732,10260=>732,10261=>732,10262=>732,10263=>732,10264=>732,10265=>732,10266=>732,10267=>732,10268=>732, +10269=>732,10270=>732,10271=>732,10272=>732,10273=>732,10274=>732,10275=>732,10276=>732,10277=>732,10278=>732, +10279=>732,10280=>732,10281=>732,10282=>732,10283=>732,10284=>732,10285=>732,10286=>732,10287=>732,10288=>732, +10289=>732,10290=>732,10291=>732,10292=>732,10293=>732,10294=>732,10295=>732,10296=>732,10297=>732,10298=>732, +10299=>732,10300=>732,10301=>732,10302=>732,10303=>732,10304=>732,10305=>732,10306=>732,10307=>732,10308=>732, +10309=>732,10310=>732,10311=>732,10312=>732,10313=>732,10314=>732,10315=>732,10316=>732,10317=>732,10318=>732, +10319=>732,10320=>732,10321=>732,10322=>732,10323=>732,10324=>732,10325=>732,10326=>732,10327=>732,10328=>732, +10329=>732,10330=>732,10331=>732,10332=>732,10333=>732,10334=>732,10335=>732,10336=>732,10337=>732,10338=>732, +10339=>732,10340=>732,10341=>732,10342=>732,10343=>732,10344=>732,10345=>732,10346=>732,10347=>732,10348=>732, +10349=>732,10350=>732,10351=>732,10352=>732,10353=>732,10354=>732,10355=>732,10356=>732,10357=>732,10358=>732, +10359=>732,10360=>732,10361=>732,10362=>732,10363=>732,10364=>732,10365=>732,10366=>732,10367=>732,10368=>732, +10369=>732,10370=>732,10371=>732,10372=>732,10373=>732,10374=>732,10375=>732,10376=>732,10377=>732,10378=>732, +10379=>732,10380=>732,10381=>732,10382=>732,10383=>732,10384=>732,10385=>732,10386=>732,10387=>732,10388=>732, +10389=>732,10390=>732,10391=>732,10392=>732,10393=>732,10394=>732,10395=>732,10396=>732,10397=>732,10398=>732, +10399=>732,10400=>732,10401=>732,10402=>732,10403=>732,10404=>732,10405=>732,10406=>732,10407=>732,10408=>732, +10409=>732,10410=>732,10411=>732,10412=>732,10413=>732,10414=>732,10415=>732,10416=>732,10417=>732,10418=>732, +10419=>732,10420=>732,10421=>732,10422=>732,10423=>732,10424=>732,10425=>732,10426=>732,10427=>732,10428=>732, +10429=>732,10430=>732,10431=>732,10432=>732,10433=>732,10434=>732,10435=>732,10436=>732,10437=>732,10438=>732, +10439=>732,10440=>732,10441=>732,10442=>732,10443=>732,10444=>732,10445=>732,10446=>732,10447=>732,10448=>732, +10449=>732,10450=>732,10451=>732,10452=>732,10453=>732,10454=>732,10455=>732,10456=>732,10457=>732,10458=>732, +10459=>732,10460=>732,10461=>732,10462=>732,10463=>732,10464=>732,10465=>732,10466=>732,10467=>732,10468=>732, +10469=>732,10470=>732,10471=>732,10472=>732,10473=>732,10474=>732,10475=>732,10476=>732,10477=>732,10478=>732, +10479=>732,10480=>732,10481=>732,10482=>732,10483=>732,10484=>732,10485=>732,10486=>732,10487=>732,10488=>732, +10489=>732,10490=>732,10491=>732,10492=>732,10493=>732,10494=>732,10495=>732,10496=>838,10497=>838,10498=>838, +10499=>838,10500=>838,10501=>838,10502=>838,10503=>838,10504=>838,10505=>838,10506=>838,10507=>838,10508=>838, +10509=>838,10510=>838,10511=>838,10512=>838,10513=>838,10514=>838,10515=>838,10516=>838,10517=>838,10518=>838, +10519=>838,10520=>838,10521=>838,10522=>838,10523=>838,10524=>838,10525=>838,10526=>838,10527=>838,10528=>838, +10529=>838,10530=>838,10531=>838,10532=>838,10533=>838,10534=>838,10535=>838,10536=>838,10537=>838,10538=>838, +10539=>838,10540=>838,10541=>838,10542=>838,10543=>838,10544=>838,10545=>838,10546=>838,10547=>838,10548=>838, +10549=>838,10550=>838,10551=>838,10552=>838,10553=>838,10554=>838,10555=>838,10556=>838,10557=>838,10558=>838, +10559=>838,10560=>838,10561=>838,10562=>838,10563=>838,10564=>838,10565=>838,10566=>838,10567=>838,10568=>838, +10569=>838,10570=>838,10571=>838,10572=>838,10573=>838,10574=>838,10575=>838,10576=>838,10577=>838,10578=>838, +10579=>838,10580=>838,10581=>838,10582=>838,10583=>838,10584=>838,10585=>838,10586=>838,10587=>838,10588=>838, +10589=>838,10590=>838,10591=>838,10592=>838,10593=>838,10594=>838,10595=>838,10596=>838,10597=>838,10598=>838, +10599=>838,10600=>838,10601=>838,10602=>838,10603=>838,10604=>838,10605=>838,10606=>838,10607=>838,10608=>838, +10609=>838,10610=>838,10611=>838,10612=>838,10613=>838,10614=>838,10615=>981,10616=>838,10617=>838,10618=>984, +10619=>838,10620=>838,10621=>838,10622=>838,10623=>838,10731=>494,10764=>1513,10765=>521,10766=>521,10799=>838, +11008=>838,11009=>838,11010=>838,11011=>838,11012=>838,11013=>838,11014=>838,11015=>838,11016=>838,11017=>838, +11018=>838,11019=>838,11020=>838,11021=>838,11022=>838,11023=>838,11024=>838,11025=>838,11026=>945,11027=>945, +11028=>945,11029=>945,11030=>769,11031=>769,11032=>769,11033=>769,11034=>945,11364=>753,11367=>872,11368=>644, +11369=>747,11370=>606,11371=>695,11372=>527,11374=>1024,11375=>722,11381=>740,11382=>531,11383=>700,11385=>501, +11386=>602,11388=>264,11389=>455,11520=>773,11521=>635,11522=>633,11523=>658,11524=>631,11525=>962,11526=>756, +11527=>960,11528=>617,11529=>646,11530=>962,11531=>632,11532=>646,11533=>962,11534=>645,11535=>866,11536=>961, +11537=>645,11538=>645,11539=>959,11540=>945,11541=>863,11542=>644,11543=>646,11544=>645,11545=>649,11546=>688, +11547=>634,11548=>982,11549=>681,11550=>676,11551=>852,11552=>957,11553=>632,11554=>645,11555=>646,11556=>749, +11557=>914,11800=>536,11810=>390,11811=>390,11812=>390,11813=>390,11822=>536,42564=>685,42565=>513,42566=>395, +42567=>392,42576=>1104,42577=>939,42580=>1193,42581=>871,42582=>1140,42583=>875,42760=>493,42761=>493,42762=>493, +42763=>493,42764=>493,42765=>493,42766=>493,42767=>493,42768=>493,42769=>493,42770=>493,42771=>493,42772=>493, +42773=>493,42774=>493,42779=>369,42780=>369,42781=>253,42782=>253,42783=>253,42891=>402,42892=>275,62464=>664, +62465=>675,62466=>724,62467=>958,62468=>675,62469=>669,62470=>735,62471=>997,62472=>675,62473=>675,62474=>1268, +62475=>693,62476=>692,62477=>963,62478=>675,62479=>692,62480=>1009,62481=>756,62482=>809,62483=>758,62484=>955, +62485=>691,62486=>946,62487=>690,62488=>698,62489=>692,62490=>739,62491=>692,62492=>698,62493=>676,62494=>739, +62495=>895,62496=>675,62497=>785,62498=>676,62499=>675,62500=>675,62501=>732,62502=>972,62504=>904,63172=>505, +63173=>602,63174=>640,63175=>644,63176=>947,63185=>500,63188=>500,64256=>708,64257=>667,64258=>667,64259=>941, +64260=>986,64261=>744,64262=>916,65024=>0,65025=>0,65026=>0,65027=>0,65028=>0,65029=>0,65030=>0, +65031=>0,65032=>0,65033=>0,65034=>0,65035=>0,65036=>0,65037=>0,65038=>0,65039=>0,65529=>0, +65530=>0,65531=>0,65532=>0,65533=>1025); +$enc=''; +$diff=''; +$file='dejavuserifi.z'; +$ctg='dejavuserifi.ctg.z'; +$originalsize=301828; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifi.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifi.z new file mode 100644 index 0000000..3b751b0 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/dejavuserifi.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freefont-20090104/AUTHORS b/assets/html2pdf/_tcpdf_5.0.002/fonts/freefont-20090104/AUTHORS new file mode 100644 index 0000000..4148c93 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/freefont-20090104/AUTHORS @@ -0,0 +1,208 @@ +-*- mode:text; coding:utf-8; -*- + GNU FreeFont Authors + ==================== + +The FreeFont collection is being maintained by + Steve White <stevan.white AT googlemail.com> +The folowing list cites the other contributors that contributed to +particular ISO 10646 blocks. + +* URW++ Design & Development GmbH <http://www.urwpp.de/> + + Basic Latin (U+0041-U+007A) + Latin-1 Supplement (U+00C0-U+00FF) (most) + Latin Extended-A (U+0100-U+017F) + Spacing Modifier Letters (U+02B0-U+02FF) + Mathematical Operators (U+2200-U+22FF) (parts) + Block Elements (U+2580-U+259F) + Dingbats (U+2700-U+27BF) + +* Yannis Haralambous <yannis.haralambous AT enst-bretagne.fr> and John + Plaice <plaice AT omega.cse.unsw.edu.au> + + Latin Extended-B (U+0180-U+024F) + IPA Extensions (U+0250-U+02AF) + Greek (U+0370-U+03FF) + Armenian (U+0530-U+058F) + Hebrew (U+0590-U+05FF) + Arabic (U+0600-U+06FF) + Currency Symbols (U+20A0-U+20CF) + Arabic Presentation Forms-A (U+FB50-U+FDFF) + Arabic Presentation Forms-B (U+FE70-U+FEFF) + +* Young U. Ryu <ryoung AT utdallas.edu> + + Arrows (U+2190-U+21FF) + Mathematical Symbols (U+2200-U+22FF) + Mathematical Alphanumeric Symbols (U+1D400-U+1D7FF) + +* Valek Filippov <frob AT df.ru> + + Cyrillic (U+0400-U+04FF) + +* Wadalab Kanji Comittee + + Hiragana (U+3040-U+309F) + Katakana (U+30A0-U+30FF) + +* Angelo Haritsis <ah AT computer.org> + + Greek (U+0370-U+03FF) + +* Yannis Haralambous and Virach Sornlertlamvanich + + Thai (U+0E00-U+0E7F) + +* Shaheed R. Haque <srhaque AT iee.org> + + Bengali (U+0980-U+09FF) + +* Sam Stepanyan <sam AT arminco.com> + + Armenian (U+0530-U+058F) + +* Mohamed Ishan <ishan AT mitf.f2s.com> + + Thaana (U+0780-U+07BF) + +* Sushant Kumar Dash <sushant AT writeme.com> + + Oriya (U+0B00-U+0B7F) + +* Harsh Kumar <harshkumar AT vsnl.com> + + Devanagari (U+0900-U+097F) + Bengali (U+0980-U+09FF) + Gurmukhi (U+0A00-U+0A7F) + Gujarati (U+0A80-U+0AFF) + +* Prasad A. Chodavarapu <chprasad AT hotmail.com> + + Telugu (U+0C00-U+0C7F) + +* Frans Velthuis <velthuis AT rc.rug.nl> and Anshuman Pandey + <apandey AT u.washington.edu> + + Devanagari (U+0900-U+097F) + +* Hardip Singh Pannu <HSPannu AT aol.com> + + Gurmukhi (U+0A00-U+0A7F) + +* Jeroen Hellingman <jehe AT kabelfoon.nl> + + Oriya (U+0B00-U+0B7F) + Malayalam (U+0D00-U+0D7F) + +* Thomas Ridgeway <email needed> + + Tamil (U+0B80-U+0BFF) + +* Berhanu Beyene <1beyene AT informatik.uni-hamburg.de>, + Prof. Dr. Manfred Kudlek <kudlek AT informatik.uni-hamburg.de>, Olaf + Kummer <kummer AT informatik.uni-hamburg.de>, and Jochen Metzinger <?> + + Ethiopic (U+1200-U+137F) + +* Maxim Iorsh <iorsh AT users.sourceforge.net> + + Hebrew (U+0590-U+05FF) + +* Vyacheslav Dikonov <sdiconov AT mail.ru> + + Syriac (U+0700-U+074A) + Braille (U+2800-U+28FF) + +* Panayotis Katsaloulis <panayotis AT panayotis.com> + + Greek Extended (U+1F00-U+1FFF) + +* M.S. Sridhar <mssridhar AT vsnl.com> + + Devanagari (U+0900-U+097F) + Bengali (U+0980-U+09FF) + Gurmukhi (U+0A00-U+0A7F) + Gujarati (U+0A80-U+0AFF) + Oriya (U+0B00-U+0B7F) + Tamil (U+0B80-U+0BFF) + Telugu (U+0C00-U+0C7F) + Kannada (U+0C80-U+0CFF) + Malayalam (U+0D00-U+0D7F) + +* DMS Electronics, The Sri Lanka Tipitaka Project, and Noah Levitt + <nlevitt AT columbia.edu> + + Sinhala (U+0D80-U+0DFF) + +* Dan Shurovich Chirkov <dansh AT chirkov.com> + + Cyrillic (U+0400-U+04FF) + +* Abbas Izad <abbasizad AT hotmail.com> + + Arabic (U+0600-U+06FF) + Arabic Presentation Forms-A (U+FB50-U+FDFF) + Arabic Presentation Forms-B (U+FE70-U+FEFF) + +* Denis Jacquerye <moyogo AT gmail.com> + + Latin Extended-B (U+0180-U+024F) + IPA Extensions (U+0250-U+02AF) + +* K.H. Hussain <hussain AT kfri.org> and R. Chitrajan + + Malayalam (U+0D00-U+0D7F) + +* Solaiman Karim <solaiman AT ekushey.org> and Omi Azad <omi AT ekushey.org> + + Bengali (U+0980-U+09FF) + +* Sonali Sonania <sonalisonania AT gmail.com> and Monika Shah + <monikapatira AT gmail.com> + + Devanagari (U+0900-U+097F) + Gujarati (U+0A80-U+0AFF) + +* Pravin Satpute <pravin_ind21 AT hotmail.com>, Bageshri Salvi + <sbagrshri AT yahoo.co.in>, Rahul Bhalerao <rahul_pb_india AT + yahoo.com> and Sandeep Shedmake <surgs2k47 AT yahoo.co.in> + + Devanagari (U+0900-U+097F) + Gujarati (U+0A80-U+0AFF) + Oriya (U+0B00-U+0B7F) + Malayalam (U+0D00-U+0D7F) + Tamil (U+0B80-U+0BFF) + +* Kulbir Singh Thind + + Gurmukhi (U+0A00-U+0A7F) + +* Gia Shervashidze <giasher AT telenet.ge> + + Georgian (U+10A0-U+10FF) + +* Daniel Johnson + + Cherokee (U+13A0-U+13FF) + +* George Douros + + Gothic (U+10330-U+1034F) + Phoenecian (U+10900-U+1091F) + Byzantine Musical Symbols (U+1D000-U+1D0FF) + Western Musical Symbols (U+1D100-U+1D1DF) + Mathematical Alphanumeric Symbols (U+1D400-U+1D7FF) + Mah Jong Tiles (U+1F000-U+1F02B) + Dominoes (U+1F030-U+1F093) + +* Steve White <stevan_white AT gmail.com> + Coptic (U+2C80-U+2CFF) + +* Primož Peterlin <primoz.peterlin AT biofiz.mf.uni-lj.si> + maintained FreeFont for several years, and is thanked for all his work. + +Please see the CREDITS file for details on who contributed particular +subsets of the glyphs in font files. + +-------------------------------------------------------------------------- +$Id: AUTHORS,v 1.18 2009/01/04 15:57:54 Stevan_White Exp $ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freefont-20090104/COPYING b/assets/html2pdf/_tcpdf_5.0.002/fonts/freefont-20090104/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/freefont-20090104/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + <program> Copyright (C) <year> <name of author> + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +<http://www.gnu.org/licenses/>. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +<http://www.gnu.org/philosophy/why-not-lgpl.html>. diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freefont-20090104/CREDITS b/assets/html2pdf/_tcpdf_5.0.002/fonts/freefont-20090104/CREDITS new file mode 100644 index 0000000..0f47440 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/freefont-20090104/CREDITS @@ -0,0 +1,528 @@ +-*- mode:text; coding:utf-8; -*- + GNU FreeFont Credits + ==================== + +This file lists contributors and contributions to the GNU FreeFont project. + + +* URW++ Design & Development GmbH <http://www.urwpp.de/> + +URW++ donated a set of 35 core PostScript Type 1 fonts to the +Ghostscript project <http://www.cs.wisc.edu/~ghost/>, to be available +under the terms of GNU General Public License (GPL). + + Basic Latin (U+0041-U+007A) + Latin-1 Supplement (U+00C0-U+00FF) + Latin Extended-A (U+0100-U+017F) + Spacing Modifier Letters (U+02B0-U+02FF) + Mathematical Operators (U+2200-U+22FF) + Block Elements (U+2580-U+259F) + Dingbats (U+2700-U+27BF) + + +* Yannis Haralambous <yannis.haralambous AT enst-bretagne.fr> and John + Plaice <plaice AT omega.cse.unsw.edu.au> + +Yannis Haralambous and John Plaice are the authors of Omega typesetting +system, <http://omega.enstb.org/>. Omega is an extension of TeX. +Its first release, aims primarily at improving TeX's multilingual abilities. +In Omega all characters and pointers into data-structures are 16-bit wide, +instead of 8-bit, thereby eliminating many of the trivial limitations of TeX. +Omega also allows multiple input and output character sets, and uses +programmable filters to translate from one encoding to another, to perform +contextual analysis, etc. Internally, Omega uses the universal 16-bit Unicode +standard character set, based on ISO-10646. These improvements not only make +it a lot easier for TeX users to cope with multiple or complex languages, +like Arabic, Indic, Khmer, Chinese, Japanese or Korean, in one document, but +will also form the basis for future developments in other areas, such as +native color support and hypertext features. ... Fonts for UT1 (omlgc family) +and UT2 (omah family) are under development: these fonts are in PostScript +format and visually close to Times and Helvetica font families. +Omega fonts are available subject to GPL + + Latin Extended-B (U+0180-U+024F) + IPA Extensions (U+0250-U+02AF) + Greek (U+0370-U+03FF) + Armenian (U+0530-U+058F) + Hebrew (U+0590-U+05FF) + Arabic (U+0600-U+06FF) + Currency Symbols (U+20A0-U+20CF) + Arabic Presentation Forms-A (U+FB50-U+FDFF) + Arabic Presentation Forms-B (U+FE70-U+FEFF) + +Current info: <http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=omega> + +* Valek Filippov <frob AT df.ru> + +Valek Filippov added Cyrillic glyphs and composite Latin Extended A to +the whole set of the abovementioned URW set of 35 PostScript core fonts, +<ftp://ftp.gnome.ru/fonts/urw/>. The fonts are available under GPL. + + Latin Extended-A (U+0100-U+017F) + Cyrillic (U+0400-U+04FF) + + +* Wadalab Kanji Comittee + +Between April 1990 and March 1992, Wadalab Kanji Comittee put together +a series of scalable font files with Japanese scripts, in four forms: +Sai Micho, Chu Mincho, Cho Kaku and Saimaru. The font files are +written in custom file format, while tools for conversion into +Metafont and PostScript Type 1 are also supplied. The Wadalab Kanji +Comittee has later been dismissed, and the resulting files can be now +found on the FTP server of the Depertment of Mathematical Engineering +and Information Physics, Faculty of Engineering, University of Tokyo +<ftp://ftp.ipl.t.u-tokyo.ac.jp/Font/>. + + Hiragana (U+3040-U+309F) + Katakana (U+30A0-U+30FF) + + +* Young U. Ryu <ryoung AT utdallas.edu> + +Young Ryu is the author of Txfonts, a set of mathematical symbols +designed to accompany text typeset in Times or its variants. In the +documentation, Young adresses the design of mathematical symbols: "The +Adobe Times fonts are thicker than the CM fonts. Designing math fonts +for Times based on the rule thickness of Times = , , + , / , < , +etc. would result in too thick math symbols, in my opinion. In the TX +fonts, these glyphs are thinner than those of original Times +fonts. That is, the rule thickness of these glyphs is around 85% of +that of the Times fonts, but still thicker than that of the CM fonts." +TX fonts are are distributed under the GNU public license (GPL). +<http://www.ctan.org/tex-archive/fonts/txfonts/>. + + Arrows (U+2190-U+21FF) + Mathematical Symbols (U+2200-U+22FF) + + +* Angelo Haritsis <ah AT computer.org> + +Angelo Haritsis has compiled a set of Greek Type 1 fonts, available on +<ftp://ftp.hellug.gr/pub/unix/linux/GREEK/fonts/greekXfonts-Type1-1.1.tgz>. +The glyphs from this source has been used to compose Greek glyphs in +FreeSans and FreeMono. + +Angelo's licence says: "You can enjoy free use of these fonts for +educational or commercial purposes. All derived works should include +this paragraph. If you want to change something please let me have +your changes (via email) so that they can go into the next +version. You can also send comments etc to the above address." + + Greek (U+0370-U+03FF) + + +* Yannis Haralambous and Virach Sornlertlamvanich + +In 1999, Yannis Haralambous and Virach Sornlertlamvanich made a set of +glyphs covering the Thai national standard Nf3, in both upright and +slanted shape. The collection of glyphs have been made part of GNU +intlfonts 1.2 package and is available under the GPL at +<ftp://ftp.gnu.org/pub/gnu/intlfonts/>. + + Thai (U+0E00-U+0E7F) + + +* Shaheed R. Haque <srhaque AT iee.org> + +Shaheed Haque has developed a basic set of basic Bengali glyphs +(without ligatures), using ISO10646 encoding. They are available under +the XFree86 license at <http://www.btinternet.com/~shaheedhaque/>. + +Copyright (C) 2001 S.R.Haque <srhaque AT iee.org>. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL S.R.HAQUE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of S.R.Haque shall not be +used in advertising or otherwise to promote the sale, use or other +dealings in this Software without prior written authorization from +S.R.Haque. + + Bengali (U+0980-U+09FF) + + +* Sam Stepanyan <sam AT arminco.com> + +Sam Stepanyan created a set of Armenian sans serif glyphs visually +compatible with Helvetica or Arial. Available on +<http://www.editum.com.ar/mashtots/html/fonts/ara.tar.gz>. On +2002-01-24, Sam writes: "Arial Armenian font is free for +non-commercial use, so it is OK to use under GPL license." + + Armenian (U+0530-U+058F) + + +* Mohamed Ishan <ishan AT mitf.f2s.com> + +Mohamed Ishan has started a Thaana Unicode Project +<http://thaana.sourceforge.net/> and among other things created a +couple of Thaana fonts, available under FDL or BDF license. + + Thaana (U+0780-U+07BF) + + +* Sushant Kumar Dash <sushant AT writeme.com> (*) + +Sushant Dash has created a font in his mother tongue, Oriya. As he +states on his web page <http://members.tripod.com/~sushantdash/>: +"Please feel free to foreword this mail to your Oriya friends. No +copyright law is applied for this font. It is totally free!!! Feel +free to modify this using any font editing tools. This is designed for +people like me, who are away from Orissa and want to write letters +home using Computers, but suffer due to unavailability of Oriya +fonts.(Or the cost of the available packages are too much)." + + Oriya (U+0B00-U+0B7F) + + +* Harsh Kumar <harshkumar AT vsnl.com> + +Harsh Kumar has started BharatBhasha <http://www.bharatbhasha.net/> - +an effort to provide "FREE software, Tutorial, Source Codes +etc. available for working in Hindi, Marathi, Gujarati, Gurmukhi and +Bangla. You can type text, write Web pages or develop Indian Languages +Applications on Windows and on Linux. We also offer FREE help to +users, enthusiasts and software developers for their work in Indian +languages." + + Devanagari (U+0900-U+097F) + Bengali (U+0980-U+09FF) + Gurmukhi (U+0A00-U+0A7F) + Gujarati (U+0A80-U+0AFF) + + +* Prasad A. Chodavarapu <chprasad AT hotmail.com> + +Prasad A. Chodavarapu created Tikkana, a Telugu font available in Type +1 and TrueType format on <http://chaitanya.bhaavana.net/fonts/>. +Tikkana exceeds the Unicode Telugu range with some composite glyphs. +Available under the GNU General Public License. + + Telugu (U+0C00-U+0C7F) + + +* Frans Velthuis <velthuis AT rc.rug.nl> and Anshuman Pandey + <apandey AT u.washington.edu> + +In 1991, Frans Velthuis from the Groningen University, The +Netherlands, released a Devanagari font as Metafont source, available +under the terms of GNU GPL. Later, Anshuman Pandey from the Washington +University, Seattle, USA, took over the maintenance of font. Fonts can +be found on CTAN, <ftp://ftp.dante.de/tex-archive/language/devanagari/>. I +converted the font to Type 1 format using Péter Szabó's TeXtrace +program <http://www.inf.bme.hu/~pts/textrace/> and removed some +redundant control points with PfaEdit. + + Devanagari (U+0900-U+097F) + + +* Hardip Singh Pannu <HSPannu AT aol.com> + +In 1991, Hardip Singh Pannu has created a free Gurmukhi TrueType font, +available as regular, bold, oblique and bold oblique form. Its license +says "Please remember that these fonts are copyrighted (by me) and are +for non-profit use only." + + Gurmukhi (U+0A00-U+0A7F) + + +* Jeroen Hellingman <jehe AT kabelfoon.nl> + +Jeroen Hellingman created a set of Malayalam metafonts in 1994, and a +set of Oriya metafonts in 1996. Malayalam fonts were created as +uniform stroke only, while Oriya metafonts exist in both uniform and +modulated stroke. From private communication: "It is my intention to +release the fonts under GPL, but not all copies around have this +notice on them." Metafonts can be found on CTAN, +<ftp://ftp.dante.de/tex-archive/language/oriya/> and +<ftp://ftp.dante.de/tex-archive/language/malayalam/>. + + Oriya (U+0B00-U+0B7F) + Malayalam (U+0D00-U+0D7F) + + +* Thomas Ridgeway <> (*) + +Thomas Ridgeway, then at the Humanities And Arts Computing Center, +Washington University, Seattle, USA, (now defunct), created a Tamil +metafont in 1990. Anshuman Pandey from the same university took over +the maintenance of font. Fonts can be found at CTAN, +<ftp://ftp.dante.de/tex-archive/language/tamil/wntamil/>. + + Tamil (U+0B80-U+0BFF) + + +* Berhanu Beyene <1beyene AT informatik.uni-hamburg.de>, + Prof. Dr. Manfred Kudlek <kudlek AT informatik.uni-hamburg.de>, Olaf + Kummer <kummer AT informatik.uni-hamburg.de>, and Jochen Metzinger <?> + +Beyene, Kudlek, Kummer and Metzinger from the Theoretical Foundations +of Computer Science, University of Hamburg, prepared a set of Ethiopic +metafonts, found on +<ftp://ftp.dante.de/tex-archive/language/ethiopia/ethiop/>. They also +maintain home page on the Ethiopic font project, +<http://www.informatik.uni-hamburg.de/TGI/mitarbeiter/wimis/kummer/ethiop_eng.html>, +and can be reached at <ethiop AT informatik.uni-hamburg.de>. The current +version of fonts is 0.7 (1998), and they are released under GNU GPL. I +converted the fonts to Type 1 format using Péter Szabó's TeXtrace-A +program <http://www.inf.bme.hu/~pts/textrace/> and removed some +redundant control points with PfaEdit. + + Ethiopic (U+1200-U+137F) + + +* Maxim Iorsh <iorsh AT users.sourceforge.net> + +In 2002, Maxim Iorsh started the Culmus project, aiming at providing +Hebrew-speaking Linux and Unix community with a basic collection of +Hebrew fonts for X Windows. The fonts are visually compatible with +URW++ Century Schoolbook L, URW++ Nimbus Sans L and URW++ Nimbus Mono +L families, respectively, and are released under GNU GPL license. See +also <http://culmus.sourceforge.net/>. + + Hebrew (U+0590-U+05FF) + + +* Panayotis Katsaloulis <panayotis AT panayotis.com> + +Panayotis Katsaloulis helped fixing Greek accents in the Greek +Extended area. + + Greek Extended (U+1F00-U+1FFF) + + +* Vyacheslav Dikonov <sdiconov AT mail.ru> + +Vyacheslav Dikonov made a Braille unicode font that could be merged +with the UCS fonts to fill the 2800-28FF range completely. (uniform +scaling is possible to adapt it to any cell size). He also contributed +a free syriac font, whose glyphs (about half of them) are borrowed +from the "Carlo Ator" font freely downloadable from +<http://www.aacf.asso.fr/>. Vyacheslav also filled in a few missing +spots in the U+2000-U+27FF area, e.g. the box drawing section, sets of +subscript and superscript digits and capital Roman numbers. + + Syriac (U+0700-U+074A) + Box Drawing (U+2500-U+257F) + Braille (U+2800-U+28FF) + + +* M.S. Sridhar <mssridhar AT vsnl.com> + +M/S Cyberscape Multimedia Limited, Mumbai, developers of Akruti +Software for Indian Languages (http://www.akruti.com/), have released +a set of TTF fonts for nine Indian scripts (Devanagari, Gujarati, +Telugu, Tamil, Malayalam, Kannada, Bengali, Oriya, and Gurumukhi) +under the GNU General Public License (GPL). You can download the fonts +from the Free Software Foundation of India WWW site +(http://www.gnu.org.in/akruti-fonts/) or from the Akruti website. + +For any further information or assistance regarding these fonts, +please contact mssridhar AT vsnl.com. + + Devanagari (U+0900-U+097F) + Bengali (U+0980-U+09FF) + Gurmukhi (U+0A00-U+0A7F) + Gujarati (U+0A80-U+0AFF) + Oriya (U+0B00-U+0B7F) + Tamil (U+0B80-U+0BFF) + Telugu (U+0C00-U+0C7F) + Kannada (U+0C80-U+0CFF) + Malayalam (U+0D00-U+0D7F) + + +* DMS Electronics, The Sri Lanka Tipitaka Project, and Noah Levitt + <nlevitt AT columbia.edu> + +Noah Levitt found out that the Sinhalese fonts available on the site +<http://www.metta.lk/fonts/> are released under GNU GPL, or, +precisely, "Public Domain under GNU Licence Produced by DMS +Electronics for The Sri Lanka Tipitaka Project" (taken from the font +comment), and took the effort of recoding the font to Unicode. + + Sinhala (U+0D80-U+0DFF) + + +* Daniel Shurovich Chirkov <dansh AT chirkov.com> + +Dan Chirkov updated the FreeSerif font with the missing Cyrillic +glyphs needed for conformance to Unicode 3.2. The effort is part of +the Slavjanskij package for Mac OS X, +<http://www.versiontracker.com/dyn/moreinfo/macosx/18680>. + + Cyrillic (U+0400-U+04FF) + + +* Denis Jacquerye <moyogo AT gmail.com> + +Denis Jacquerye added new glyphs and corrected existing ones in the +Latin Extended-B and IPA Extensions ranges. + + Latin Extended-B (U+0180-U+024F) + IPA Extensions (U+0250-U+02AF) + + +* K.H. Hussain <hussain AT kfri.org> and R. Chitrajan + +`Rachana' in Malayalam means `to write', `to create'. Rachana Akshara Vedi, +a team of socially committed information technology professionals and +philologists, has applied developments in computer technology and desktop +publishing to resurrect the Malayalam language from the disorder, +fragmentation and degeneration it had suffered since the attempt to adapt +the Malayalam script for using with a regular mechanical typewriter, which +took place in 1967-69. K.H. Hussein at the Kerala Forest Research Institute +has released "Rachana Normal" fonts with approximately 900 glyphs required +to typeset traditional Malayalam. R. Chitrajan apparently encoded the +glyphs in the OpenType table. + +In 2008, the Malayalam ranges in FreeSerif were updated under the advise +and supervision of Hiran Venugopalan of Swathanthra Malayalam Computing, +to reflect the revised edition Rachana_04. + + Malayalam (U+0D00-U+0D7F) + + +* Solaiman Karim <solaiman AT ekushey.org> + + Bengali (U+0980-U+09FF) + +Solaiman Karim has developed several OpenType Bangla fonts and +released them under GNU GPL on <http://www.ekushey.org>. + + +* Sonali Sonania <sonalisonania AT gmail.com> and Monika Shah + <monikapatira AT gmail.com> + + Devanagari (U+0900-U+097F) + Gujarati (U+0A80-U+0AFF) + +Glyphs were drawn by Cyberscape Multimedia Ltd., #101,Mahalakshmi +Mansion 21st Main 22nd "A" Cross Banashankari 2nd stage Banglore +560070, India. Converted to OTF by IndicTrans Team, Powai, Mumbai, +lead by Prof. Jitendra Shah. Maintained by Monika Shah and Sonali +Sonania of janabhaaratii Team, C-DAC, Mumbai. This font is released +under GPL by Dr. Alka Irani and Prof Jitendra Shah, janabhaaratii +Team, C-DAC, Mumabi. janabhaaratii is localisation project at C-DAC +Mumbai (formerly National Centre for Software Technology); funded by +TDIL, Govt. of India. Contact:monika_shah AT lycos.com, +sonalisonania AT yahoo.com, jitendras AT vsnl.com, alka AT ncst.ernet.in. +website: www.janabhaaratii.org.in. + + +* Pravin Satpute <pravin_ind21 AT hotmail.com>, Bageshri Salvi + <sbagrshri AT yahoo.co.in>, Rahul Bhalerao <rahul_pb_india AT + yahoo.com> and Sandeep Shedmake <surgs2k47 AT yahoo.co.in> + + Devanagari (U+0900-U+097F) + Gujarati (U+0A80-U+0AFF) + Oriya (U+0B00-U+0B7F) + Malayalam (U+0D00-U+0D7F) + Tamil (U+0B80-U+0BFF) + +In December 2005 the team at www.gnowledge.org released a set of two +Unicode pan-Indic fonts: "Samyak" and "Samyak Sans". "Samyak" font +belongs to serif style and is an original work of the team; "Samyak +Sans" font belongs to sans serif style and is actually a compilation +of already released Indic fonts (Gargi, Padma, Mukti, Utkal, Akruti +and ThendralUni). Both fonts are based on Unicode standard. You can +download the font files (released under GNU/GPL License) from +http://www.gnowledge.org/Gnoware/localization/font.htm + + +* Kulbir Singh Thind + + Gurmukhi (U+0A00-U+0A7F) + +Dr. Kulbir Singh Thind designed a set of Gurmukhi Unicode fonts, +AnmolUni and AnmolUni-Bold, which are available under the terms of GNU +Generel Public Licens from the Punjabu Computing Resource Center, +http://guca.sourceforge.net/typography/fonts/anmoluni/. + + +* Gia Shervashidze <giasher AT telenet.ge> + + Georgian (U+10A0-U+10FF) + +Starting in mid-1990s, Gia Shervashidze designed many +Unicode-compliant Georgian fonts: Times New Roman Georgian, Arial +Georgian, Courier New Georgian. His work on Georgian localization can +be reached at http://www.gia.ge/. + + +* Primož Peterlin <primoz.peterlin AT biofiz.mf.uni-lj.si> + +Primož Peterlin filled in missing glyphs here and there (e.g. Latin +Extended-B and IPA Extensions ranges in the FreeMono familiy), and +created the following UCS blocks: + + Latin Extended-B (U+0180-U+024F) + IPA Extensions (U+0250-U+02AF) + Arrows (U+2190-U+21FF) + Box Drawing (U+2500-U+257F) + Block Elements (U+2580-U+259F) + Geometrical Shapes (U+25A0-U+25FF) + +* Mark Williamson + +Made the MPH 2 Damase font, from which + Hanunóo (U+1720-U+173F) + Buginese (U+1A00-U+1A1F) + Tai Le (U+1950-U+197F) + Ugaritic (U+10380-U+1039F) + Old Persian (U+103A0-U+103DF) + +* Jacob Poon + +Submitted a very thorough survey of glyph problems and other suggestions. + +* Alexey Kryukov + +Made the TemporaLCGUni fonts, based on the URW++ fonts, from which at one +point FreeSerif Cyrillic, and some of the Greek, was drawn. He also provided +valuable direction about Cyrillic and Greek typesetting. + +* George Douros + +The creator of several fonts focusing on ancient scripts and symbols. +Many of the glyphs are created by making outlines from scanned images +of ancient sources. + + Aegean: Phoenecian + Analecta: Gothic (U+10330-U+1034F) + Musical: Byzantine & Western + Unicode: many Miscellaneous Symbols, Miscellaneous Technical, + supplemental Symbols, and Mathematical Alphanumeric symbols, + Mah Jong, and the outline of the Domino. + +* Daniel Johnson + +Created by hand a Cherokee range specially for FreeFont to be "in line with +the classic Cherokee typefaces used in 19th century printing", but also to +fit well with ranges previously in FreeFont. + Cherokee (U+13A0-U+13FF) + +Notes: + +*: The glyph collection looks license-compatible, but its author has + not yet replied and agreed on their work being used in part of + this glyph collection. + +-------------------------------------------------------------------------- +$Id: CREDITS,v 1.23 2009/01/04 15:57:54 Stevan_White Exp $ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freefont-20090104/ChangeLog b/assets/html2pdf/_tcpdf_5.0.002/fonts/freefont-20090104/ChangeLog new file mode 100644 index 0000000..d5345d0 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/freefont-20090104/ChangeLog @@ -0,0 +1,4525 @@ +$Id: ChangeLog,v 1.254 2009/01/04 16:12:59 Stevan_White Exp $ +2009-01-04 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added 2009 to copyright dates + + * AUTHORS, CREDITS: + + Removed Glagolitic range author + + * FreeSans.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added some TrueType names + +2009-01-01 Stevan_White + * FreeSerif.sfd: + + Removde Glagolitic range, since have not (yet) received OK from author. + + Added some TrueType Names + +2008-12-31 Stevan_White + * COPYING: + + Updated license to GPL v3 + +2008-12-30 Stevan_White + * FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Oblique versions of Daniel Johnson's Cherokee. + + * FreeSerifBold.sfd: + + Cherokee Bold range from Daniel Johnson. + +2008-12-27 Stevan_White + * isMonoMono.py: + + 900 EM -> 800 + + * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd: + + Made glyphs to lie between -200 and 800 EM + + * isMonoMono.py: + + check that glyphs lie in vertical bounding boxes + + * FreeMono.sfd, FreeSerif.sfd: + + Extensible bracket characters didn't exactly line up. Fixed. + Mono: a couple of glyphs had gotten out of their bounding boxes again. + +2008-12-26 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Final pre-release cleanup + + * FreeSerif.sfd: + + Buginese vowel u was misnamed + + * FreeMono.sfd: + + Yatcyrillic somehow was a mark character ... fixed + + * FreeSans.sfd, FreeSansOblique.sfd: + + Had to un-link references in + Sans: uni02B2, uni02B5 + SansOblique: uni0363 + because validation of the TTF file said the glyph + "is drawn in wrong direction" + I would have preferred to have understand this... + + * Makefile: + + Added quick test for FontForge version. + + * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd: + + Removed kerning tables (?? what were they doing here anyway??) + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Kerning tables for Thai. + Handles one common case: short letter followed by a tall one with + an overhang to the left. + +2008-12-25 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: + + More putzing with kerning tables + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Copied kerning classes + Serif -> SerifBold + SerifItalic -> SerifBoldItalic + Sans -> SansOblique SansBold SansBoldOblique + Some associated naming of characters, etc + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Additions and correction in Spacing Modifier letters and IPA Extensions + +2008-12-23 Stevan_White + * FreeSerif.sfd: + + Applied patch to Cherokee range + +2008-12-20 Stevan_White + * FreeSerif.sfd, FreeSerifItalic.sfd: + + Fixed kern classes that end in space (crashes FontForge) + + * FreeSerifItalic.sfd, FreeSerif.sfd: + + kerning + +2008-12-19 Stevan_White + * FreeSerifItalic.sfd: + + kerning + + * FreeSerif.sfd: + + kerning + Some adjustments to Glagolitc spacing, mark positioning + +2008-12-18 Stevan_White + * FreeSerif.sfd, FreeSerifItalic.sfd: + + kerning + +2008-12-17 Stevan_White + * FreeSerif.sfd, FreeSerifItalic.sfd: + + kerning + +2008-12-11 Stevan_White + * FreeSans.sfd, FreeSerif.sfd: + + kerning + +2008-12-10 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd: + + kerning + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd: + + kerning + +2008-12-09 Stevan_White + * FreeSerif.sfd, FreeSerifItalic.sfd: + + kerning + +2008-12-08 Stevan_White + * FreeSansOblique.sfd: + + Slanted small final sigma. Remedies + bug #24993: U+03C2 "Greek small letter final sigma" not slanted in + Free Sans Oblique + https://savannah.gnu.org/bugs/index.php?24993 + +2008-12-07 Stevan_White + * FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + kerning, etc + +2008-12-06 Stevan_White + * FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifItalic.sfd: + + kerning + Tweek in Sans having to do with addition of Latin Extended + +2008-12-05 Stevan_White + * FreeSansBold.sfd, FreeSansBoldOblique.sfd: + + Tweeks to Latin Extended Additional + + * FreeSansBoldOblique.sfd: + + Added Latin Extended Additional range + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Extra space at end of kern class names has bad effect on FornForge + script that try to run through kern classes. Some FontForge call + corrupts memory. + Got rid of extra space. + +2008-12-02 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Replaced U+0387 GREEK ANO TELEIA with top dot of colon. + See bug #24987: U+0387 GREEK ANO TELEIA too low + https://savannah.gnu.org/bugs/index.php?24987 + + * FreeSerif.sfd: + + more kerning in Cyrillic (broke into two tables of classes) + +2008-12-01 Stevan_White + * FreeSerif.sfd: + + tweeks to kernin + + * FreeSerifBoldItalic.sfd: + + kerning + +2008-11-30 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Kerning for Latin and Cyrillic fairly complete in Serif faces. + Complete in sense that it looks pretty good under Pango for + English French German Spanish Polish Czech Latvian + But have not done Vietnamese (will require many more entries). + I adjust roman and italic, then copy tables by hand to bold and + bolditalic. + Misgiving: bolditalic is much too crammed + Overall, I may have over-kerned. (A difficult temptation to master.) + + * FreeSerif.sfd, FreeSerifItalic.sfd: + + kerning + + * FreeSans.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: + + kerning + In Serif, modified widths of some extended latin glyphs + +2008-11-29 Stevan_White + * FreeSerif.sfd: + + Broke Latin kerning subtable into four, hoping it will be easier to + understand and maintain. + + * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSerif.sfd, + FreeSerifItalic.sfd, FreeSerifBold.sfd, FreeSansOblique.sfd, + FreeSans.sfd: + + kerninig + +2008-11-28 Stevan_White + * FreeSans.sfd, FreeSerif.sfd: + + more kerning; + made guillemot narrower + + * FreeSansOblique.sfd, FreeSerif.sfd: + + previous commit was incomplete + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Adjusted width of single quotes (and apostrophe) to be "punctuation width" + More fiddling with kerning. + +2008-11-27 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifItalic.sfd: + + much fiddling with kerning + +2008-11-26 Stevan_White + * FreeSerifBold.sfd: + + Basic kerning, named main Cyrillic letters + + * FreeSerifItalic.sfd: + + Basic Cyrillic kerning + + * FreeSerif.sfd: + + Tweeks to Cyrillic kerning + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifItalic.sfd, Makefile: + + Much fiddling with kerning, tables, and generating fonts whose kerning + tables work with OpenOffice. + +2008-11-24 Stevan_White + * FreeSerif.sfd: + + regularized padding in Miscellaneous symbols. + At least within related ranges tried to make similar. + Made to validate + +2008-11-23 Stevan_White + * FreeSerif.sfd: + + Filled out Miscellaneous Symbols. Used George Douros' Unicode font. + Completed Miscellaneous Symbols, with some drawings from George Douros' + Unicode Symbols, and some of mine. + + * FreeMono.sfd, FreeMonoOblique.sfd: + + Replaced Greek Exteded psili and dasia with scaled versions of the + "bent quote" mark. I think it's distinctive enough, but not so silly. + + Remedies bug #22997: Mono: Greek Extended psili is ugly + https://savannah.gnu.org/bugs/?22997 + + * FreeSerif.sfd: + + Made some recycling symbols + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Finished with Hebrew Pointed letters in all faces. + +2008-11-22 Stevan_White + * FreeSans.sfd: + + Fiddled with Hebrew Pointed letters + + * FreeSerifItalic.sfd: + + Marks for Vietnamese + + * FreeSerif.sfd, FreeSerifItalic.sfd: + + Letter pe had strange thick middle ear that looked awful. lamed had ben + bumped at some point. Fixed. Adjusted some of the points. + +2008-11-21 Stevan_White + * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + repairs to Pointed Hebrew + + * FreeSerif.sfd: + + Numeral line positioning marks for Gothic + + * FreeSerifItalic.sfd: + + Added Combining Marks for Symbols (some question about obliqueness of + some symbols) + Cleaned up some empty glyphs in Pointed Hebrew. + +2008-11-20 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Provided Hebrew pointed letters, with lookups, for all Serif faces. + +2008-11-19 Stevan_White + * FreeSerifBoldItalic.sfd: + + renamed Hebrew lookups + + * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Completed Hebrew in Bold faces. + + * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: + + More tweeks to Hebrew points + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: + + Adjustments corrections and additions to Hebrew points + +2008-11-18 Stevan_White + * FreeSansBold.sfd: + + Cleaned out a lot of ridiculous kernings + +2008-11-17 Stevan_White + * FreeSansBoldOblique.sfd: + + fiddled with Armenian ligatures + + * FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Added Armenian (with ligatures) to BoldOblique + Fiddled with character spacing + +2008-11-16 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added U+01f9 and paragraph end marker to Georgian + Fiddled with Armenian ligatures + +2008-11-15 Stevan_White + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Another pass at letter spacing in Cyrillic. + Also went through ancient letters. + + Added Georgian paragraph separator 10FB + Added Georgian turned gan 10F9 (because it was easy) + + Re-worked letter spacing through modern Cyrillic range. + + * FreeSans.sfd, FreeSansBold.sfd, FreeSerif.sfd: + + Letter spacing + +2008-11-14 Stevan_White + * FreeSerif.sfd: + + Added several characters to Cyrillic Extended-B + + * FreeSansBold.sfd, FreeSansBoldOblique.sfd: + + Made Cyrillic hooked e U+04BC-F to look less goofy. + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Based on assertion on Pechatnyj Dvor's web site, Cyrillic Fita + U+0472-3 and "Barred O" U+04E8-9 are different styles the same letter, + and the fact that the tilde in the O never looked good in Sans, I + made them all barred O's. + + * FreeSerif.sfd: + + Added Cyrillic Yn, yn (U+a65e-f) + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Synced up Cyrillic and Combining Diacritics ranges, + Couple of tweeks in Gujarati to make TT validate + + * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Changes to older Cyrillic letters, in response to further information. + Made omegas, omegas with titlo, and OT to all be of the same size and + shape in Serif. + Un-linked Cyrillic Psi and psi from Greek, made squarer versions. + + Some more Cyrillic diacritical marks in Sans. Re-worked U+04bc-f . + Experimenting with mark positioning for Cyrillic + +2008-11-12 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Strove to make Euro look more like the EC logo design, while making + glyph fit better with the design of its face. Bug #3576: Euro design + https://savannah.gnu.org/bugs/?23576 + + * FreeSans.sfd, FreeSerif.sfd: + + Adjustments mostly to GPOS tables having to do with Vietnamese marks. + The WAZU Vietnamese test page looks pretty good in Sans now. + Still not thrilled with below-dot when it appears with a mark over + e.g. U+0102. Pango positions one or the other but not both. + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Extensive modification of GPOS lookup tables for mark positioning. + I think they're now all functional (except styled Mono faces have none). + Also added lots of marks to faces that didn't have them, and also + fiddled with Combining Diacritical Marks. + +2008-11-10 Stevan_White + * FreeSerif.sfd: + + Made one combining mark really combining + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Made a few combining characters to be zero-width in Mono, + Added them to other styles. + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Figured out why below marks in Thai weren't working in the lowest + letters. I think Pango and other font renderers ignore 'blwm'. + However, 'mark' works. + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Tweeks to Thai marks + +2008-11-09 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Several bugfixes in Thai, mostly having to do with mark placement and + ligatures. Implemented ru-saraaa and lu-saraaa with ligatures. + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + added and named dottedcircle (used by Pango to render + combining mark base) + + * FreeSerif.sfd: + + Tweeks to Coptic, after viewing more papyrus samples and web pages. + + * FreeSerif.sfd: + + Weight of Coptic small letters made to match that of Latin and Greek ones. + +2008-11-08 Stevan_White + * FreeSerif.sfd: + + Made Coptic to comply better with + http://www.wazu.jp/gallery/Test_Coptic.html + Made a flourish at foot of letters with long diagonal. + + More tweeks to Coptic; put in a mark lookup table. + + Note: for small letters I made scaled references to captials. + Results in those letters looking quite light next to the capitals and + next to small Latin letters. Also, there are a few variant forms for + capitals (Unicode samples don't show this). It would be good to + re-work + + Added Coptic alphabet in u+2C80-2CB1 and u+03E2-u+03EF, drawn/built by + me, based on Unicode samples, TeX font copte, and scans at WikiPedia. + +2008-11-07 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Further tweeks to dieresis in Greek and Cyrillic + + * FreeSerif.sfd: + + replaced Greek I dieresis with references, tweeked height of dieresis. + +2008-11-04 Stevan_White + * FreeSerif.sfd: + + Added a few Cyrillic Extended-B letters seen in web pages while looking + for Glagolitic text. + + * FreeMono.sfd, FreeMonoOblique.sfd: + + Added a few old Cyrillic characters. + + * FreeSerif.sfd: + + Several corrections and tweeks to Glagolitic. + Still missing six slots from Unicode, but don't see them in the TeX + fonts. + On the other hand, several on-line Glagolitic pages (bibles etc) don't + seem to use these. Maybe it's OK as-is. + +2008-11-03 Stevan_White + * FreeSerif.sfd: + + Added lowercase range to Glagolitic, as a facile scaling of the + uppercase. + + Added letter to Glagolitic, scaled range. + +2008-11-02 Stevan_White + * FreeSerif.sfd: + + Replaced fraktur bold from Mathematical Alphanumeric Symbols with that + from TX Fonts by Young Ryu. + One concern: letter k is damaged (in both medium and bold). I just + hacked something up. + + Added Glagolitic "round type" font (Croation capitols only) from the + collection of Croatian fonts for LaTeX by Darko Zubrinić + ftp://ftp.dante.de/tex-archive/languages/croatian/ + http://www.tug.org/TUGboat/Articles/tb17-1/tb50zubr.pdf + + Several letters are missing besides the small letters. + + * FreeSerifBoldItalic.sfd: + + A couple of Thai references got obliqued twice. + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + By popular demand, removed 'ears' from Greek Upsilon and Psi. + Copied resulting glyphs to Serif Mathematical Alphanumeric Symbols. + + * FreeSerif.sfd: + + Some pointwise cleanup of main Tamil range + + Tried some things with lookups. Didn't make much headway. + +2008-11-01 Stevan_White + * FreeMono.sfd: + + somehow made a letter with wrong width + + * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added similar lookups and ligatures to Thai ranges. + + * FreeSerif.sfd: + + Lookups now work no worse than those for other Thai fonts, at least + in Pango. Still perplexed by behaviour of "Required" lookups. + + For Thai, made ligatures and lookups for yoying and thothan combined + with a lower vowel. These work well. + Attempted looksups for saraaa with ru and lu, and for saraam. + Not working. + + Cleaned up a few of the Bengali ligatures + + * FreeSerifBold.sfd: + + Tweek Thai + +2008-10-31 Stevan_White + * FreeSerif.sfd: + + Fixed ligatures and mark positioning for Hanunóo. + Problem with ligatures: Gnome pango doesn't do 'rlig', only 'liga' + + * FreeSerifItalic.sfd: + + Changed lookup table scripts for Devanagari and Bengali. + Find Problems -> ATT found several problems showing lookups acting on + glyphs that weren't listed in the script ranges, including dev2, bng2 + (why not deva and beng, I don't know). + + danda and doubledanda of Devanagari I understand are to be shared among + Indic scripts. So included bng2 and dev2 in the 'aalt' table for those. + + The 'init' and 'half' tables for Bengali made active for bng2. + + The 'locl' table for Bengali didn't do anything I could see: It mapped + the Devanagari danda to itself, and the doubledanda to itself. Deleted. + + Cleaned up some kern tables. + adjustments of under 5 EM are invisible. Some others I just didn't like. + Some were putting a letter beneath another, with is wrong. + + * FreeSerifBoldItalic.sfd: + + Added Thai + + * FreeSerifBold.sfd, FreeSerifItalic.sfd: + + Changes to mark positioning lookups, esp. in Italic. + Widened numerals in Bold + +2008-10-27 Stevan_White + * FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Tweeks regarding Armenian and lookups + + * FreeSansBold.sfd: + + Added Armenian ligatures FB13-FB17 with lookups + Also made a historical ligature ('hlig') table for u+0587. + + Toward bug #15183: missing characters from Armenian range + https://savannah.gnu.org/bugs/index.php?15183 + + * FreeSansOblique.sfd: + + Added Armenian ligatures, lookups. Cleaned up contours. + + * FreeSans.sfd: + + Added 5 Armenian ligatures to U+FB13 – FB17, and made corresponding + 'liga' lookup. Found there one ligature u+0587 that according to + http://en.wikipedia.org/wiki/Armenian_alphabet + + "in new orthography the և character is not a typographical ligature anymore, and must never be treated as such. It is a distinct letter and has its place in the new alphabetic sequence." + So moved this out of the 'liga' lookup and into a new 'hlig' lookup. + +2008-10-26 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifItalic.sfd: + + Lots of improvements to Thai. + Completely revised letter spacing in Italic, and fiddled with combining + marks in all. + Still aren't working quite right, especially in Italic. + Still need to work over digits (in Bold they aren't even bold yet) + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifItalic.sfd: + + Bold Thai : added (painstakingly) constructed glyphs, lookups + roman Thai: tweeks + Italic Thai: tweeks (Note this still has multiple problems) + +2008-10-25 Stevan_White + * FreeSerif.sfd: + + WAZU says + http://www.wazu.jp/gallery/Fonts_Hanunoo.html + + MPH 2B Damase doesn't support the consonant-vowel ligatures necessary + to render Buhid writing. + + OK, so I made 'mark' lookups for combining marks and a bunch of + ligatures in an 'rlig' lookup. The latter still not working: + don't know why. + + Made page to match the example of the combining forms at + http://www.omniglot.com/writing/hanunoo.htm + +2008-10-24 Stevan_White + * FreeSerif.sfd: + + Removed some marks from Mathematical Alphanumeric Symbols + + * FreeSerif.sfd: + + Tweeked combining marks for Vietnamese. Made to satisfy + WAZU JAPAN Comprehensive Unicode Test Page for Vietnamese + http://www.wazu.jp/gallery/Test_Vietnamese.html + Could still use some tweeking... + + * FreeSerif.sfd: + + Added marks for composition of Vietnamese + + * FreeMono.sfd, FreeSerif.sfd: + + Put "below" combining mark on lots of vowels and derivatives, + for Vietnamese. + Named a bunch of composit Latin, expecting to make substitutions. + +2008-10-23 Stevan_White + * FreeSerif.sfd: + + Thai spacing alterations based on advice of a native speaker. + +2008-10-22 Stevan_White + * FreeSerif.sfd: + + re-named Thai lookups according to order + +2008-10-21 Stevan_White + * FreeSans.sfd: + + Cleanup of glyphs in Gujarati, Devanagari. + + Note: Serious problem with Sans GPOS abvm in Devanagari + "'abvm' Above Base Mark in Devanagari subtable" "gujr-0" + But all the characters that list gujr-0 are in Gujarati. + Not sure how this got broken or how to fix it. + + * FreeSerif.sfd: + + Fiddled with Thai mark positioning: passes my tests now OK. + Made a few more references in Math Symbols; more regularization of + stroke. + + * FreeSerif.sfd: + + Added mark class for Vietnamese "horn" + Several references made in General Punctuation, Arrows + + * FreeMono.sfd: + + added some Combining Diacritical Marks + +2008-10-20 Stevan_White + * FreeSerif.sfd: + + Made some references from serifed Latin capitals to Greek counterparts. + + * FreeSerif.sfd: + + Made a few repeated glyphs into references in Musical Symbols + +2008-10-19 Stevan_White + * FreeSerif.sfd: + + Moved several glypns from Mathematical Alphanumeric Symbols to + Letterlike Symbols. + Couple tweeks in Mathematical Symbols. + + * FreeMono.sfd, FreeSerif.sfd: + + Fiddling with Mathematical Symbols. + In Serif, trying to make stroke width more consistent. + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd: + + Added some Greek symbols in Mono and Sans to make a little more regular + and correspond better with TeX. + Tweek of serif. + + * FreeSansBold.sfd: + + a few more improvements. + + One problem with the Mathematical Alphanumeric area is, one must + remember to change it any time another face is altered... + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSerifBold.sfd: + + Several improvements and additions to Sans faces (mostly in Greek) from + experience of pasting into FreeSerif Mathematical Alphanumeric Symbols. + + * FreeSerif.sfd: + + Replaced most of Mathematical Alphanumeric Symbols + roman italic bold (latin and greek) + gothic italic bold (latin and greek) + typewriter + and numerals + with glyphs from FreeFont. These were scaled to uniform height. + + Remains: Blackboard Bold, Fraktur, Calligraphic, Script + + * FreeSerif.sfd: + + Tidied lookup table names for Malayalam + + * FreeSerif.sfd: + + Applied Malayalam patch from Hiran Venugopalan + + * FreeMono.sfd: + + Added/corrected many Mathematical Symbols + + * FreeSansOblique.sfd: + + more IPA + +2008-10-18 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Made lots more IPA and Phonetic Extensions + Note: fontforge is reporting an error in a few glyphs made by scaling + another, that the glyphs are drawn in the wrong direction--only in + TrueType though. Suspect a FontForge bug. + + Added several Combining Diacritical Marks + +2008-10-17 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Made several Spacing Modifier Letters, Combining Diacritical Marks, + and IPA and Phonetic Extensions + +2008-10-16 Stevan_White + * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added some Superscripts and Subscripts + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Finished off Superscripts and subscripts + + Completed General Punctuation for Mono faces + + Added some General Punctuation + +2008-10-15 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + more Letterlike Symbols, Currency Symbols + + * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Made some Combining Diacritical Marks for Symbols, Letterlike Symbols + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Added some General Punctuation + +2008-10-14 Stevan_White + * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Added double slanted hyphen, made General Punctuaton Supplement like + Serif's + + * FreeSansBoldOblique.sfd: + + Filled out Greek Extended + + * FreeMono.sfd, FreeSerifItalic.sfd: + + fixes to last 2 commits + + * FreeSerifItalic.sfd: + + Last character to General Punctuation + + * FreeMono.sfd: + + Built some Enclosed Alphanumerics (1-10) + + * FreeSerif.sfd: + + Copied in Daniel Johnson's changes to Cherokee. + +2008-10-12 Stevan_White + * FreeSerif.sfd: + + Included Daniel Johnson's Cherokee glyphs. + +2008-10-05 Stevan_White + * FreeMono.sfd: + + Further corrections to diaresis in Cyrillic -- legibility in small sizes + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoOblique.sfd, FreeSerif.sfd: + + Regularized placement of diaresis in Cyrillic + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added same set of glyphs to Cyrillic Supplement + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Added some of the easier letters from Cyrillic Supplement + +2008-10-04 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeSerifItalic.sfd: + + Finished high Cyrillic range for MonoBold and MonoBoldOblique. + (Remaining: historic ranges, Cyrillic extensions) + Tweeked others. + + * FreeMonoBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Serif*Italic: Added last Abkhazian letters to Cyrillic + MonoBold: tweek + +2008-10-03 Stevan_White + * FreeMono.sfd, FreeMonoOblique.sfd, FreeSerif.sfd, FreeSerifBoldItalic.sfd: + + Mono: Some additions to historic letters + + * FreeSerif.sfd: + + Added some punctuation and combining numeric marks from + Cyrillic Extended B + + * FreeMono.sfd, FreeMonoBold.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Various technical tweeks, mostly concerning recent additions. + Also did a bit more "Points too close" and "irrelevant control points". + Cyrillic millions redesign meant could not maintain use of refrences + for it. + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + More high Cyrillic + Included old Cyrillic millions combining mark in Sans, changed design + in Serif + +2008-10-02 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + More high Cyrillic + + * FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifBoldItalic.sfd: + + More high Cyrillic glyphs + + * FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + More glyphs in high Cyrillic. Remains only some whose form I'm unsure + of in italic. + + * FreeSerifBoldItalic.sfd: + + More glyphs in higher Cyrillic range + + * FreeSerifItalic.sfd: + + Same process of tightening el, em, ge (but a P.S. to previous commit: + also did ya, ze for SerifBold.) + + * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + BoldItalic: Tightened up spacing on left of el, em, ge (could go + farther, but it is partly a problem with glyph design... + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + More additions to Cyrillic. Finished SerifBold except for Nivkh + additions. + Used references on number combining forms. + +2008-09-30 Stevan_White + * FreeSerif.sfd: + + Added four (obsolete) Chuvash letters to Cyrillic Supplement + - completing it. + +2008-09-29 Stevan_White + * FreeSerif.sfd: + + Greek adjustments + Adjusted spacing of kappa slightly + Got rid of ears on Psi, following similar request for Upsilon. + +2008-09-28 Stevan_White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Adding and fiddling with Spacing Modifiers and Combining Diacriticals + + * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Revisions of several Combining Diacritical marks + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + A few Combining Diacriticals and Spacing Modifiers + + MonoBoldOblique: Primarily filling out Spacing Modifier Letters + others: little fixes found along the way + +2008-09-27 Stevan_White + * FreeSerif.sfd: + + Replaced Malayalam range with that from Rachana_04 found on + Swathanthra Malayalam Computing project page + http://savannah.nongnu.org/projects/smc/ + Besides scaling and converting to cubic, performed much clean-up of + glyphs, added an r2 character, and re-named a bunch of characters. + +2008-09-22 Stevan_White + * FreeSerif.sfd: + + Filled in as much of Phonetic Extensions as I could without artistic + abilities. + Note 1D48-9 are not references due to apparent FontForge bug, that says + scaled references go in wrong direction. + + * FreeSerif.sfd: + + Cleaup of some Bengali glyphs. + Note many of the ligatures remain very very messy. + + * Makefile: + + added more validations + made to work with GenerateOpenType + + * FreeSerif.sfd: + + Built two more easy Phonetic Extensions + + * FreeSerif.sfd: + + Built some Phonetic Extensions letters, those with middle tilde + +2008-09-21 Stevan_White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Added lots of Spacing Modifier Letters and Combining Diacritical Marks. + + * FreeMono.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSerif.sfd: + + Wrote script to check if glyph encodings were in stated ranges, fixed + most discrepancies. + + There were a bunch of incompletely deleted characters in several faces. + + Sans: found several other problems in the process + # Tamil + Four slots labelled 0BDA-D have glyphs, not in Unicode. also 0BE1 + I think they are misplaced; added 0010 to each of them + + # Devanagari + Slot labelled U+093B is not in Unicode--can't find glyph: deleted + likewise 094F (may have been meant to be 0954) + 0955, 0973-0976 + + 0954 should be a combining mark, but it appears on the wrong side of 0. + 0971 was just wrong--made into simple dot. + 0972 is also wrong--made my own Candra A. + + # Gujarati + Slots labelled 0AE4-5 are not in Unicode; seem not to belong at all. + Deleted. 2800 is a dup of 2790. Deleted + + Serif: phillipine_double u1736 was misplaced + + A bunch of the Math Alphanumeric symbols are empty in the standard, + because they're represented elsewhere. These should be deleted + First need to make style consistent with existing symbols. + + * FreeSerif.sfd: + + Applied patch from Daniel J + Remedies bug + FreeSerif: Missing glyphs with palatal hook + https://savannah.gnu.org/bugs/index.php?24298 + Adding several letters to Phoenetic Extensions range U+1D80-BF + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Made four characters U+200C-F to be zero-width + Remedy to bug #23593: Mono 0-width chars: zero-width or space? + https://savannah.gnu.org/bugs/index.php?23593 + + * FreeSerif.sfd: + + Made Mahjong tiles to take up less space using references + Cleaned up several validation problems + +2008-09-19 Stevan_White + * FreeSerif.sfd: + + Added several Hebrew Alphabetic Presentation Forms (some easy ones), to + make its coverage the same as Serif Bold. + + * FreeSerifBold.sfd: + + Re-encoded. + Deleted several glyphs in Hebrew Alphabetic Presentation Forms that + didn't correspond valid Unicode + + * FreeMonoBold.sfd, FreeSans.sfd, FreeSerifItalic.sfd: + + Ran script to find mis-numbered glyphs. Several were simply typos, + some offset by one. + + * FreeSansOblique.sfd: + + Numerous cases of glyphs in Private Use area incorrectly assigned + Unicode numbers and names. Gave all -1 for Unicode and named like + "slot.XXXX". + + * FreeSerif.sfd: + + Adapted Mahjong Tiles from George Douros' Unicode Symbols font. + + * FreeSerif.sfd: + + Added Domino Tiles. Domino outline is copied from George Douros' + Unicode Symbols, but the rest I preferred to do with references. + +2008-09-18 Stevan_White + * FreeSerif.sfd: + + Adapted Mathematical Alphanumeric Symbols from George Douros' Unicode + Symbols font. + + * FreeMonoBoldOblique.sfd: + + This one got away from me--I don't know what I did. + Looks like some small contour edits. + + * FreeSansBoldOblique.sfd: + + Fixed one mis-numberd character in Latin Extended-B + + * FreeSerifBold.sfd, FreeSerifItalic.sfd: + + Fixed several mis-numbered characters. + + * FreeSansBold.sfd: + + SansBold: one Georgian letter with no name, one Zapf Dingbat was + unnumbered + ATT test shows a bunch of problems with Gurmukhi and 'blwf' table + indeed shows those letters at 0x10000+ + Sans names them like uni0A30_uni0A4D.blwf: they are in range + ECC6 to ED06 + + I meant to move this range into Private Use in last release, and + missed it. So now it is moved, into same range as Sans. + + Both Sans and SansBold in nukt table for Gurmukhi have duplicate + entries for uni0A15 uni0A3C. Deleted dups. + + * FreeMonoOblique.sfd: + + fixed a number of Unassigned Code Points in Greek Extended + + * FreeSansOblique.sfd: + + mis-numbered Combining Diacritics + + * FreeSansOblique.sfd: + + Several chars in Latin Extended hadn't been named. + One spurious letter in Letterlike Symbols + +2008-09-16 Stevan_White + * FreeMono.sfd, FreeSans.sfd, FreeSerif.sfd: + + Lots of additions: unless otherwise noted, they are from George Duros' + fonts Analecta, Music, and Unicode (haven't got final confirmation of + the eligibility of these glyphs, so this is just for testing.) + + Added some combining marks, fiddled a bit. In both Serif & Mono, tried + to get a key symbol characters to fit inside the key combining mark + + Serif + Got rid of ears on Upsilon + Added: + # Gothic + # Western & Byzantine Musical Symbols + + # Misc Symbols, Misc Technical Symbols (drew many myself) + # Supplemental Symbols and Arrows + + Mono + Added: + # lotsa Misc Technical Symbols + # OCR Symbols + # drew many Supplemental Symbols and Arrows, Misc Technical + + Sans + Added # Phoenecian + Made a few Letterlike Symbols; Made Re and Im to be sans-serif. + +2008-09-11 Stevan_White + * FreeSerif.sfd: + + Removed pointless entries from Latin kern table + + Tidied points in Sinhala + +2008-09-07 Stevan_White + * FreeSerif.sfd: + + Tidied up Tamil ligatures EEA8-EEAB to fix TT build warning + "MonotonicFindAlong: Never found our spline." + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, Makefile: + + + Added APL characters to FreeMono (why?...) + + Fixed several last-minute problems, including + + Serif: Tweeked GPOS mark table for Cyrillic + Sans: Added a GPOS table for Cyrillic (but several diacritics missing) + + Serif, Mono: tweeked some bugs in extensible brackets & integrals + + Serif: Vietnamese o circumflex: accent was a bit high. fixed. + + MonoBoldOblique OTF build + uni213b intersects self + + Generation of TT fonts complains about several things to stderr, + including: + + SerifBold: "There exists a 'fpgm' code that seems incompatible with FontForge's. Instructions generated will be of lower quality. If legacy hinting is to be scrapped, it is suggested to clear the `fpgm` and repeat autoinstructing. It will be then possible to append user's code to FontForge's 'fpgm', but due to possible future updates, it is extremely advised to use high numbers for user's functions." + Probably has been there since I first copied the TT instructions in. + Just repeated the copying process carefully, and the warning went away. + + Serif: "FindMatchingHVEdge fell into an impossible position" + fixed a bunch of point too close + + REMAINING PROBLEM in Serif TT build + "MonotonicFindAlong: Never found our spline." + fixed several bad TT matrices-- there are several more + fixed many "control points too close" no luck + +2008-09-03 Stevan_White + * FreeSans.sfd, FreeSansOblique.sfd: + + Added/corrected some Misc. Symbols by copying from Serif. + Note this is only a stopgap solution. Want real sans-serif symbols. + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added minimal Miscellaneous Symbols: card suites and some musical notes. + Note not happy with shapes...some I just drew. Sans isn't really sans. + + Fixed one APL symbol in Mono so it verified in OTF version + +2008-08-31 Stevan_White + * FreeMono.sfd: + + Built set of APL symbols. + +2008-08-30 Stevan_White + * FreeSans.sfd: + + Un-linked references in uni02B2 and uni02B5, because when validating the + TrueType version, FontForge gave an error "is drawn in wrong direction". + I suspect a bug in FontForge. Other similar glyphs make no errors. + + Fixed missing extrema in TrueType. + These were the last cases being reported by validate in all the faces. + + * FreeSerifItalic.sfd: + + fixed last missing extrema in TrueType + + * Makefile: + + restructured validation to look in a directory + + * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd: + + Fixed missing extrema in TrueType versions + +2008-08-15 Stevan_White + * FreeSans.sfd: + + Same problem with uni0A83 as with bn_llikaar. Just made zero-width. + +2008-08-14 Stevan_White + * FreeSans.sfd, FreeSansOblique.sfd: + + Glyph bn_llikaar, U+09E3 BENGALI VOWEL SIGN VOCALIC LL, + has right bound positioned far into the negative. Causes a warning in + FontForge when opening OTF version. + Comparing with other fonts supporting Bengali, found no others that + do this. + Serif makes glyph width 0 (which sounds right according to Unicode) + and puts glyph wholly to left of 0. But, I haven't found this letter + in text anywhere. I wonder if it is really used in writing. + + * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: + + Further TrueType validation fixes. + Sans still has two glyps in wrong direction. + + * FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Fixed more TrueType problems...all missing extrema in TTF validation + +2008-08-13 Stevan_White + * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + fixed all the TrueType validation problems of type "intersects itself" + and all but two of the "wrong directions", as well as a lot of + "missing extrema". But there remain hundreds of missing extrema in the + TrueType version. + Also, bn_llikaar in Sans and Oblique still has a problem in OTF version. + + * FreeMono.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd: + + Made .ttf files to validate. Other faces have many more problems still. + +2008-08-12 Stevan_White + * FreeMonoOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: + + Continuing to make OTF versions validate. + + * FreeMonoOblique.sfd: + lots of missing points at extrema + * FreeSerif.sfd: + 12 wrong directions, 1 missing extrema + * FreeSerifItalic.sfd: + many missing points at extrema, 1 self-intersecting + + What was wrong: in several oblique cases, an already-italic glyph was + made more italic, thereby fouling up extrema (although why it passed + validation in the SFD I don't know). Some glyphs were + overly-complicated with many near points. Cleaned up, rounded to int. + + Remaining problem: OTF FreeSansOblique FreeSans. one Bengali glyph in + each whose advance width and htmx don't match. + + Moral of story: validate the OTF and TTF versions too before a release. + + * FreeSansOblique.sfd: + + Reverse a mistake from last commit: somehow this file was converted to + quadratic, or something. + +2008-08-11 Stevan_White + * FreeMonoBoldOblique.sfd, FreeSans.sfd, FreeSansOblique.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Found that SFD files that validated produced OpenType files that don't. + These represent the easy fixes. Some were result of conversion to + quadratic; some shouldn't have validated in the SFD... + + * MonoBoldOblique: uni0250 missing pts at extrema [reference glyph rotated...] + * Sans: uni0AC4 wrong direction [simplified, rounded to int] + * SansOblique: uni01EA wrong direction [rounded to int] + * SerifBold: uni023f wrong direction [round to int] + * SerifBoldItalic: uni0245 missing pts at extrema [ungrouped ref, added extrema] + +2008-08-06 Stevan_White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoOblique.sfd: + + Re-set font metrics, which were somehow making uneven vertical spacing. + +2008-06-22 Steve White + * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Made to validate + + * ranges.py: + + Brought more into line with OpenType + Added some ranges + Fixed bug with ranges outside of font + + * CREDITS: + + 3 new ranges + + * FreeSerif.sfd, FreeSerifItalic.sfd: + + Cyrillic: tweeked accents for consistency, and for readability in small + sizes. + + * FreeSerif.sfd: + + Thanna range: tweeking + + Thaana range: Scaled up by about 15%, raised by 100EM, tightened + some of the diacritics to get inside 900 to -300 EM limits. + + * FreeSans.sfd: + + Added Old Persian and Ugaritic from MPH2BDamase font. + +2008-06-21 Steve White + * FreeSerif.sfd: + + Added Tai Le range adapted from MPH2BDamase font. + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Added some ancient Greek numerals from Tempora to high Unicode area, + (partly just to show it can now be done.) + + * FreeSerifItalic.sfd: + + Couple of tweeks putting glyphs above -300EM. + + * FreeSerif.sfd, FreeSerifItalic.sfd: + + Surgery to Thai letter 'tho than', u+0e10, to push it above -300 EM. + This makes Thai range completely between 900 and -300 EM. + + * FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: + + Many auxilary characters (esp. for Malayalam, Bengla, and Tamil) + representing ligatures and alternative forms without their own Unicode, + were moved from + ranges above 0xFFFF (which ought to have been slots for other defined + Unicode ranges) into the Private Use area. + + In Serif, I segregated the scripts, in Sans it was hard to see where one + began and another ended, so I moved them en masse. + + Note several problems with wrongly-named characters: + I already re-named glyph570 and glyph582. + But there are others with names starting with A... + + * FreeSansBold.sfd, FreeSansOblique.sfd: + + Fixed (I hope the last) problem with scripts in lookups + Find Problems -> ATT (all selected) finds multiple issues, + + * FreeSansBold.sfd: + In addition to script 'guru', added 'gur2' to the scripts for these + lookups + 'nukt' Nukta forms in Gurmukhi + 'blwf' Below Base Forms in Gurmukhi + 'pstf' Post Base Forms in Gurmukhi + 'blws' Below Base Substitutions in Gurmukhi + 'abvs' Above Base Substitutions in Gurmukhi + 'psts' Post Base Substitutions in Gurmukhi + + * FreeSansOblique.sfd: + In addition to script 'beng', added 'bng2' to the scripts for the lookup + 'half' Half Forms in Bengali + + Moreover, the lookup + 'aalt' Access All Alternates in Latin + contains only Bengali letters. + Re-named as Bengali, made to work on beng, bng2 scripts + +2008-06-20 Steve White + * FreeSerif.sfd: + + Scaled Sinhala range. + Remedies bug #23656: Sinhala letters over-sized + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Mostly messing with Greek Extended accents again. + re-positioned ypogegrammani on advice of Alexey Kryukov + Put prosgegrammani beneath main letters in Mono, to make narrower glyphs + Implemented more distinction between tonos and acute. + +2008-06-19 Steve White + * FreeMonoBoldOblique.sfd: + + Completed fit of Mono to 800 to -200 EM. + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoOblique.sfd: + + Set Metrics to recommended values + + * FreeMonoOblique.sfd: + + Now Mono Oblique, as well as roman and Bold, are within 800 to -200 EM. + Just BoldOblique to go. + + * FreeMono.sfd, FreeMonoBold.sfd: + + More toward fitting to 800 to -200 EM. + Basically, reduced Georgian by 92%. + Also made an over-all offset, so Georgian is somehow centered (Bold...I + guess I already did this in roman). + Want to also do an emboldening to make stroke like rest of font, but + current FontForge has a nasty crash that loses data on this function. + + * FreeMono.sfd: + + In effort to make fit in 800 to -200 EM, + Scaled Georgian by 92%, centered on 600 wide box. + Next: Embolden a bit. + +2008-06-18 Steve White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Toward making all glyphs lie between -200 and 800 EM. + Numerous small changes, especially raising descenders of some Hebrew + letters. + Georgian remains a problem + +2008-06-13 Steve White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Moved prosgegrammeni up to baseline, + (and then moved all references down to baseline) + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added Control Picture "blank" to all faces. + Switched U+0222-3 from TemporaLGCUni + +2008-06-11 Steve White + * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + More fiddling with Greek Extended accents + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Tweeks to accents etc in Greek Extended and Cyrillic + +2008-06-10 Steve White + * FreeSerifBold.sfd, FreeSerifItalic.sfd: + + Fixed a few big horizontal spacing problems + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Implemented TemporaLCGUni glyphs in Cyrillic ranges. + Added a breve_cyrillic for the moustache breve mark. + +2008-06-08 Steve White + * FreeSerif.sfd: + + Replaced most of Cyrillic range with TemporaLGCUni. + Remodelled many of the derived Cyrillic characters after these. + Fiddled globally with spacing of small letters. + Unclear on diacritics 485-6, unhappy with breve. + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Started implementing TemporaLCGUni in Greek ranges. + + Replaced 3DC-3E1 from Tempora, because I thought they looked nicer and + more like the other existing FreeFont glyphs. + Replaced 3DA-B from Tempora, because they look more like Unicode + samples, and nicer. + Added 03f3-4, 03F7-F. + Prefer my own lunate epsilon. + Replaced Phi and Omega from Tempora. + These plainly fit the other FreeFont glyphs better than the origninals. + (How did this happen?) + + In bold, replaced U+03D7 + + Copied lbbar u+2114 + + Small italic greek--replaced most except phi, psi, omega + + Based on new information, broke the identification of oxia with Latin + acute. + +2008-06-07 Steve White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Efforts to control heights of characters + +2008-06-06 Steve White + * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Made to validate + +2008-06-05 Steve White + * FreeSans.sfd: + + Fixed undefined character in kerning classes + +2008-06-04 Steve White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + tweeks and additions to General Punctuation + +2008-06-03 Steve White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSansOblique.sfd: + + Completed/tweeked Number Forms + + * FreeMono.sfd, FreeSerif.sfd: + + Added some Miscellaneous Technical symbols + +2008-06-02 Steve White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Tweeks...mostly Letterlike + +2008-06-01 Steve White + * FreeMono.sfd, FreeSerif.sfd: + + Added Box Drawing characters to Serif. + Tweeked a glyph in Mono + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Added several glyphs to Letterlike Characters + +2008-05-31 Steve White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Validation pass + + SansOblique and SansBoldOblique had validation problem with BlueValues + Private Dictionary + Elements in BlueValues/OtherBlues array are disordered + Elements in BlueValues/OtherBlues array are too close + (Change BlueFuzz) + StemSnapV does not contain StdVW value. + So I ordered the array, and based on other slanted fonts, + removed StemSnapV. + + Note however, I still think the two top Blues lines are too close + But I don't even know what the second-to-top line is meant to do. + + * FreeSerif.sfd: + + Added to Block Elements, Geometric Shapes + Made to validate + +2008-05-29 Steve White + * FreeMono.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Looking at special symbols. + Drew several Miscellaneous Symbols in Mono and Serif + > Completed/corrected planetary symbols, added Dice, + some other easy ones + > Completed Dingbats in Serif (using URW Dingbats) + Added some Block Elements to Serif + +2008-05-26 Steve White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + More changes stemming from J. Poon's report. + +2008-05-25 Steve White + * FreeSerif.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Height surgery on SerifBoldItalic. + More fiddling with accents in others. + + * FreeSerifItalic.sfd: + + More height surgery. Only a few left in Benglai and Thai + + * FreeSerifBold.sfd: + + Re-applied surgery to make glyphs between 900 and -300EM + + *** Regression + Inadvertently un-linked all references in SerifBold in r1.83. + This reverses that error (but also un-does the surgery mentioned there) + + * FreeSerifBold.sfd, FreeSerifItalic.sfd: + + Applied surgery to make Latin letters go under 900EM. + One exception yet... + +2008-05-24 Steve White + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Serif: much fiddling with accents in Latin ranges. + Re-thought some glyphs (there are still a few messy ones, especially + in bold) + Checked horizontal spacing...fixed a number of problems. + +2008-05-23 Steve White + * FreeSansBold.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Made Latin Extended-B coverage consistent across Serif; cleaned up some + glyphs + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Filled more of General Punctuation in Sans and Serif + Made all agree on coverage of Latin Extended Additional + +2008-05-22 Steve White + * FreeSans.sfd, FreeSansBold.sfd, FreeSansOblique.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Added Latin Extended Additional to SansOblique. + Made Latin Extended Additional coverage consistent across Sans, B, I + Made Latin Extended-B coverage same in SerifBold. + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeSansBold.sfd: + + Mono* made Latin-B coverage consistent across faces + + * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Made set of Latin Extended-B consistent across Sans faces + + * FreeSans.sfd, FreeSansBold.sfd: + + More filling in General Punctuation + + * FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Another bunch of J. Poon's reports + also, filling in some Combining Diacriticals, Spacing Modifiers, and + General Punctuation in bold faces + +2008-05-21 Steve White + * FreeMono.sfd, FreeMonoBold.sfd, FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Mucking about with mark tables in Thai (Serif) + Other faces: Making changes from J. Poon's report + +2008-05-20 Steve White + * CREDITS: + + Mark Williamson + Jacob Poon + + * Makefile: + + added tests target + +2008-05-18 Steve White + * ranges.py: + + Put table explanation back in + + Improved behaviour for high Unicode + + * FreeSans.sfd: + + Revision of kerning + + * FreeSerif.sfd: + + Made Latin kerning a little more reasonable: + reduced many excessive kerns (some had letters apparently + overlapping, which shouldn't happen) + made kerns increment by 5EM for ease of reading + got rid of kerns too small to be seen + + * FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSerifBold.sfd: + + Made to verify + +2008-05-13 Steve White + * FreeSerif.sfd: + + Made to validate + + * FreeSerif.sfd: + + Gurmukhi: filled range in Serif, taking glyphs from the original + Punjabi font by Hardip Singh Pannu + http://members.aol.com/hspannu/punjabi.html (file pb_win95.exe) + +2008-05-12 Steve White + * FreeSans.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Hebrew, basic. Some faces missing punctuation marks, added. + + * FreeMono.sfd, FreeSans.sfd: + + Armenian: Sans tried to make verticals and horizontals of more uniform + width both, finddled with punctuation + + * FreeMonoOblique.sfd: + + made to validate + + * FreeMonoBold.sfd: + + made to validate + + * FreeSans.sfd, FreeSansBold.sfd: + + Armenian in Sans: regularized letter spacing + + * FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd: + + Armenian: fill out ranges and clean up + SansBold especially had a lot of incorrect references. + Now all the ranges with Armenian at least share the same set of + characters. + + * FreeMono.sfd: + + Fixed glyph with wrong width. + +2008-05-11 Steve White + * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerifItalic.sfd: + + 1) made to validate + 2) Mono: copied in Spacing Modifier Letters (glyphs not yet named) + 3) SerifItalic: Filled in General Punctuation + + * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Made to validate, and pass all other FontForge tests. + Expedient: rounded everything to int + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Made to have the same Greek Symbols, + Made to validate + + * FreeSans.sfd, FreeSansBold.sfd: + + Made Greek Symbols as full as rest of Sans. Changed a name in Sans. + + * FreeMonoOblique.sfd: + + Made Greek as full as other faces + Made to validate + + * FreeSansBold.sfd: + + Deleted seven orphaned Arabic characters; looks like somebody started, + didn't get very far, putting Arabic in bold. + + Deleted orphaned Arabic glyph from Arabic Presentation forms-B + + * FreeSerifBold.sfd: + + Deleted the single Arabic character: it was clearly there by mistake. + + * FreeSansOblique.sfd: + + Made Greek Symbols as full as rest of Sans + + Tweeks to Armenian + + Comment from previous commit of FreeSans was meant for FreeSansOblique. + In FreeSans, only tweeked a few letters during putting more characters + in this face. + + Filled in Spacing Modifier Letters, increased General Punctuation. + + * FreeSans.sfd: + + Filled in Spacing Modifier Letters, increased General Punctuation + + * FreeMono.sfd: + + Made Armenian as full as other roman faces. + + Completed Spacing Modifier Letters + Added a couple of Greek Punctuation + + added more Spacing Modifier Letters + +2008-05-10 Steve White + * FreeSerif.sfd, FreeSerifItalic.sfd: + + Did same process of scaling and sizing for Thai in Sans as in Serif. + Added mark tables to Sans. Improvement, but there are questions... + + * FreeSans.sfd: + + Tidied some Gurmukhi glyphs, validated. + + Deleted ranges for Oriya, Kannada, on account of + 1) they only contained a subset of the consonant glyphs of the scripts, + few if any vowels, and had no ligature lookups as required + 2) Kannada was based on the Akurti fonts, which have copyright issues. + + See + bug #23225: Oriya range only partial + bug #23224: Kannada range only partial + + * FreeMonoBoldOblique.sfd: + + Made metrics like rest of Mono + +2008-05-09 Steve White + * ranges.py: + + More info on range intervals + + * FreeSerif.sfd: + + Deleted Telugu range. + It didn't represent a complete writing system for the language. + + See notes at https://savannah.gnu.org/bugs/index.php?23202 + Serif: Telugu range missing many characters; many wrong + + Got a copy of the original Tikkana font, + Copied in remaining consonants and vowels that I could find there. + I think one vowel 0C55 is missing according to unicode). + Strangely, the Telugu digits are alo missing. + In Tikkana, the default "checkmark" structural mark is missing from many + consonants, according to Unicode, but is a separate glyph. I put + the checkmark on. + This, and scaled up by 150% and cleaned up intersecting glyphs and + many unnecessary points. + +2008-05-08 Steve White + * FreeSerif.sfd: + + Filled out Telugu consonants. + Vowels still need to be done + +2008-05-07 Steve White + * FreeSerif.sfd: + + Operated on Latin glyphs with stacked accents to make them fit under + 900EM. + Scaled Telugu bu 150%. + +2008-05-06 Steve White + * FreeMono.sfd, FreeMonoBold.sfd, FreeSansBold.sfd, FreeSerif.sfd: + + Corrected further fontforge "find problems" + Added some math characters to FreeSerif + +2008-05-05 Steve White + * FreeSansBold.sfd: + + Made to validate, and fixed bad TT transformations + +2008-05-04 Steve White + * FreeMono.sfd, FreeSerif.sfd: + + Mainly TeX additions trying to satisfy Markus Kuhn's TeX-as-Unicode page + + * FreeMono.sfd: + + Adjusted heights of extensible brackets + + Fixed problems with extensible brackets, thanks to Markus Kuhn's page + http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt + + * ranges.py: + + fiddled with ranges, doc + + made some ranges more correct? + + fixed some bugs in ranges + better error reporting + + Got rid of Unicode 1.1 references + + made to use OpenType table + + * FreeMono.sfd, FreeSans.sfd, FreeSerif.sfd: + + made to validate + +2008-05-03 Steve White + * FreeMono.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Removed digits from Private Use Area. + See bug 23050. + + * FreeMono.sfd, FreeSans.sfd: + + Completed General Punctuation + + * FreeSans.sfd: + + Completed IPA Extensions + + * FreeMono.sfd, FreeSans.sfd, FreeSerif.sfd: + + More work on Superscripts and Subscripts, Spacing Modifiers. + Sans is now complete in both. + Added Pfennig to Sans and Mono. + + * ranges.py: + + Restructure text output + Rearrangement and cosmetic ...except I had broken it. now fixed + Seems to be in a useful form at this point. + More docs, date + + * FreeSerif.sfd: + + Added a hand-drawn old German Pfennig to Currency Symbols + + * FreeMono.sfd, FreeSans.sfd, FreeSerif.sfd, FreeSerifItalic.sfd: + + Further additions to General Punctuation, Super and Sub Scripts, + Spacing Modifiers, etc. + +2008-05-02 Steve White + * FreeSans.sfd: + + additions to Spacing Modifiers, IPA + + * FreeSerifItalic.sfd: + + Shortening stacked accents to maintain readability when clipped + +2008-05-01 Steve White + * FreeSans.sfd: + + Additions to Spacing Modifiers and changes to Combining Diacritics + + * FreeSerif.sfd: + + Made sure all the half rings in Combining Diacriticals and Spacing + Modifiers were really half rings (J. Poon had complained about this) + + Filled out General Punctuation + Some work on Spacing Modifiers + + Filled out Mathematical Operators + still needs lots of work + Made to validate + + Filled out Latin Extended B + Added some letters with curls to Latin Extended B + More fiddling with Latin Extended B accents + +2008-04-30 Steve White + * FreeSerif.sfd: + + Added Hanunóo script, with characters based on those in + font MPH2BDamase, on request from the maintainer of that font, + http://packages.debian.org/sid/ttf-mph-2b-damase + + Glyphs are simple vector strokes. Could be a little more uniform. + + Added Buginese script "Lontara", with characters based on those in + font MPH2BDamase, on request from the maintainer of that font, + http://packages.debian.org/sid/ttf-mph-2b-damase + + Note the glyphs are pretty rough, clearly a digitization of handwriting. + I just cleaned them up, and corrected discrepancies with Unicode, + and compared with some pictorial samples of the script I could find. + +2008-04-29 Steve White + * ranges.py: + + Improved look a lot--still unhappy with some ranges + OS/2 seems sometimes bang-on, sometimes unrelated to anything (including + fontforge's OS/2 listing) + + * FreeSerif.sfd: + + Much fiddling with Tamil range. + First scaled to 78% (avoiding the references) + This gets it in the ballpark height-wise. [A bit taller than the Latin + letters, but the stroke is narrower, but then the glyphs are busier.] + Then had to re-align combined references, the trickiest being the + halants. + Checked with other fonts with Tamil text. + +2008-04-28 Steve White + * FreeSans.sfd, FreeSerif.sfd: + + Cleanup of control points in Arabic and Thaana + + * FreeSerif.sfd: + + Cleanup of missing extrema in Arabic and Thaana + + Many changes to Thai, trying to make the script fit between some lines, + so accents won't get clipped, etc. + Also, stroke weight was heavier than that of Latin. + + Scaled whole thing by 93%. + Shrank the tallest letters 0E42-4 to get them under 900EM. + Shaved off top of maiek. + Fiddled with positioning of all accents. + Made positioning tables for accents. + Note: unclear these are working correctly + + Fixed a bug having to do with character replacements for characters + named 'ng' and 'nj'; these names had been taken on by other characters. + + Made to validate + + Unicode positions of two Cyrillic Extended characters were switched. + Fiddled with a couple of Cyrillic combining diacritics + +2008-04-27 Steve White + * FreeSans.sfd: + + bugfix: a left harpoon mysteriously appeared to the left of letter p! + +2008-04-26 Steve White + * FreeMono.sfd: + + Made to validate + + * FreeSans.sfd: + + Made to validate + + Toward J. Poons report + Made 032B more like proper double-arches (and distinct fro 033C seagull) + Made 032b more like a seagull + + * FreeSans.sfd, FreeSansBold.sfd: + + Sans: fiddling with widths and terminators of math symbols, + toward J. Poon's report + R & B: removed u+2741 because it didn't match the Unicode description + + * FreeMono.sfd: + + Extensible parenthesis symbols weight/terminators + Toward bug # 23064: https://savannah.gnu.org/bugs/index.php?23064 + Rounded a bunch of terminators + +2008-04-22 Steve White + * FreeSerif.sfd: + + Small alignment problem in Greek Extended + + One more tweek to spacing in Cyrillic Extended + + Corrected spacing in Cyrillic Supplement + + Added Cyrillic Supplement letters for + Enets, Khanty, Chukchi, Itelmen, Mordvin, Kurdish, Aleut + + Added Cyrillic letters for Nivkh (completing Cyrillic range) + More tightening of accents in Latin Extended. + + * FreeSans.sfd: + + Fiddled with math--consequences of changing the "similar" operator + + More tightening of accents + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Adjustments to h and k with caron and cedilla in Latin A and B + + * FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd: + + FreeSerifBold: deleted 3 dotted Hebrew letters in Private/Corporate use + (E801-3). They weren't ligatures or in any other lookup, and they + weren't present in FreeSerif. + + * FreeSansBold: + Unlinked and deleted F6C3, which called itself commaaccent. + Made some new spacing and non-spacing accents to make up for it. + + * FreeSansBoldOblique: + Made references of many Latin Extended. + Also corrected several wrong ones. + + * Freeserif: + Re-named commaaccent + +2008-04-21 Steve White + * FreeMono.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSerif.sfd, FreeSerifBold.sfd: + + Deleted Hiragana and Katakana ranges, as discussed on bugs list. + Cleaned up some encoding issues, unnamed glyphs + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Roman: added 'sine' -- not beautiful, but I liked drawing it + All: Made special lookup for Dutch ligatures 'IJ' and 'ij' + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Roman: ffi etc Latin ligatures from 'liga' to 'dlig' (these weren't + really ligatures anyway, and only looked very bad when used. + Retain for condensed type. + Others: deleted Latin 'liga' table altogether + BoldOblique : added j to ij ligature + + Toward J. Poon's Report: + Except for issues of terminators not always vertical or horizontal, + and a few things that were too hard or I was unsure of. + +2008-04-20 Steve White + * FreeSerif.sfd: + + Futzing with accents in Latin Extended Additional and Latin Extended-B + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Added primemod character, referenced by Greek number sign + + * FreeMono.sfd, FreeMonoOblique.sfd: + + Following J. Poon's report, disconnected NJ (01CA) + +2008-04-19 Steve White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + First pass throught J. Poon's bug list. + See bug reports for details. + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Made underscore slanted in Oblique faces, made all to be width of + space character. + Towards J. Poon's report. + Disturbed that xterm and some other apps put small space between + characters when none was called for. + + * FreeMono.sfd, FreeMonoBold.sfd, FreeSans.sfd, FreeSansOblique.sfd: + + Corrections on Currency Symbols + + * FreeMono.sfd, FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + More corrections, additions to Currency Symbols + + * FreeSans.sfd, FreeSerif.sfd: + + Filled out and corrected Currency Symbols + +2008-04-18 Steve White + * FreeSans.sfd, FreeSerif.sfd: + + Adjustments to Combining Marks for Symbols + Additions to range in Sans, and re-structured its marks table so that + "middle" can apply to any range + + * FreeSerif.sfd, FreeSerifItalic.sfd: + + Made reference between combining koronis and lenis of Greek Extended. + In Serif, re-worked combining marks lookup tables, added anchors in + Latin, moved so without marks they work in kedit (but now I'm doubting + kedit does a reasonable thing...what is a better application for + testing this?) + +2008-04-16 Steve White + * FreeSerifItalic.sfd: + + Adjusting of spacing and accents in Greek + + * FreeMono.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansOblique.sfd, FreeSerif.sfd: + + Much futzing with Greek letter spacing and accents. + Added lenis to FreeMono. + + * FreeMono.sfd, FreeSerif.sfd: + + Adjusted spacing of dots of Greek dieresistonons in Serif + Whipped up something for Greek kappascript in Mono (could use revision) + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Raised dots on double-dotted Cyrillic i, to match that of i and j. + +2008-04-14 Steve White + * FreeMono.sfd: + + Corrected 27e6-7 "white bracket" + Note it is probably a FontForge bug these symbols aren't showing up. + FontForge thinks they are in Supplemental Arrows, but they should be + in Supplemental Math-A + + Named some Greek characters + + * FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd: + + Spacing of some Cyrillic characters + +2008-04-13 Steve White + * FreeSerif.sfd: + + Some fiddling with accents + 'yogh' was too wide + + * FreeSansBold.sfd, FreeSansOblique.sfd: + + Character spacing was chaos--tried to improve. BoldOblique also needs + it. + + * FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd: + + Completed the fix of bug #12798, Greek glyphs with accents to side + Much mucking with accents here, and fixed a few things that were just + wrong. + +2008-04-12 Steve White + * FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Made Mono curly quotes "bent" + + * FreeMono.sfd: + + More fiddling with Greek accents + Made quotes "bent" + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Adjustments on Greek diaresistonos etc. + Adjustments in Serif on combining marks for symbols + + * FreeSerif.sfd: + + More additions to Combining marks for Symbols + + Additions to Combining marks for Symbols -- now mostly full. + Lots of adjustments to middle anchor point in Latin to make big circle + (nearly) encircle preceding latter + +2008-04-11 Steve White + * FreeMono.sfd: + + Bugfix: + Had indroduce a glyph of width other than 600, making kterminal not + recognize it as a monospace font. + +2008-04-10 Steve White + * FreeSans.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + More messing with accents. + Further to bug #12798, Greek glyphs with accents to side + Much messing with glyphs in Greek Extended range + +2008-04-09 Steve White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSerif.sfd: + + Revisited Latin-1 and Latin-A accents. + Glyph B7 was called "periodcentered", but Unicode callse it Mid Dot, + and the description doesn't refer to the period. I made it like the + dot accent. throughout, and referred L-dot to it. + + Also double-checked "commaaccent" characters (some in Unicode called + cedilla, but the Unicode example shows a comma...mystery) + + Also the funny IPA upside-down f often had two bars, incorrectly. + + To do: go through rest of Serif, and Sans + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Completed re-structuring of stacked Latin accents in Mono. + Also: lots of associated adjustments of Greek Extended accents. + (Trying to at least center extremely wide characters on their box) + Repaired some victems of "find overlaps" sweeps + Worked on glyphs with apostrope/comma parts + Corrected a few wrong glyphs. + + Trying out a "bent quotes" solution to making primes distinct from + quotes. + +2008-04-08 Steve White + * FreeMonoOblique.sfd: + + Toward reducing overall height + Did similar process as for Mono, fixing a few errors along the way. + Also the Greek Extended range was very messed up vertical and + horizontally. + Horizonal spacing of the heavily accented Greek is a real problem in + Mono... + To do: + revisit "commaaccent" characters in all faces: do some have + edillas? + some Hebrew glyphs are a little low + Georgian generally is way out of bounds + +2008-04-07 Steve White + * INSTALL: + + Various updates and corrections, tweeked formatting + + * FreeMonoBold.sfd: + + Tweeking of accents + +2008-04-06 Steve White + * FreeMono.sfd, FreeMonoBold.sfd: + + Re-worked accents in FreeMonoBold.sfd to make Latin ranges lie between + 800 and -200 EM, as with FreeMono. + + * FreeMono.sfd: + + Latin Extended ranges: Implemented new policy of shortening the letters + of the characters with the highest-stacked accents. + + At this point all the Latin glyphs lie betweeen 800 and -200 EM. + + Also checked for readability of all the Latin extended letters in xterm. + (Issue: it chops letters outside their bounding boxes; many accents had + been a bit outside. Made sure that if they were chopped, they were at + least still recognizable.) + +2008-04-05 Steve White + * FreeMono.sfd: + + Following exchange about Mono on freefont-bugs with Joe Wells, who + > doesn't like the curly quote marks + > wants combining diacritics to work + > wants tight line spacing + + Trying to reduce font height: + > exclamdown was below -200 + > Throughout Extended Greek, ypogegrammeni were too low. Shortened + glyph, and raised all references. + > Lots of messing with Latin Extended ranges to make glyphs mostly + fit into 800 height. Mostly succeeded. A couple will get chopped. + > Messed with "commaaccent" glyphs, which were very low + > Cyrillic 04B1 had a tail that was incorrectly low + > Much mucking with Georgian range. Moved up by 95 (read that Georgian + is written as though centered between two horizontal lines, rather than + as sitting on a baseline) There are still a few very high glyphs. + + FontForge U+0122 called Gcommaaccent, glyph looks like that, but + Unicode says it's Gcedilla. Made the ones called cedilla by Unicode + to be cedillas + + Note bug in Unicode: standard for 0122, 0123, 0136, 0137, 013B, 013C, + 0145, 0146, 0156, 0157 all talk about cedilla, say to make it with + cedilla, but example shows comma. + + By the way: + > Got rid of commaaccent and dotlessj in Corporate Use + > Replaced shadedark, with little squares now not overlapping. + > Corrected IPA symbol 'ts' 02A6, added 02a8, 02a9, 02aa, 02ab, 02ac, + 02ad, 02ae, 02af + + (so many changes...the CVS server was down...) + + * FreeSerif.sfd: + + Re-named arabic and hebrew characters + Big adjustment to comma-accents. Mostly effects Greek Extended. + Made such accents to be like comma, rather than like Russian apostrophe + (and de-referenced that symbol) + +2008-04-04 Steve White + * FreeMono.sfd, FreeSerif.sfd: + + Raised dot on superscript i (2071) -- more distinct at small sizes + + * FreeMono.sfd: + + added two IPA symbols + +2008-04-02 Steve White + * FreeSerif.sfd: + + fixed a few more control points too close + + Fixed names of languages in ligature table for latn "w/i". + This fixes a crash when FontForge opened the ttf table + + Motivated by bug crashing FontForge when opening ttf file, + started cleanup of useless control points. Not finished. + Got partway through Sinhala + +2008-03-31 Steve White + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoOblique.sfd, FreeSans.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Fixed various "Find Problems", including glyphs with mixed-up names, + and bad TT matrices. (lots more bad TT matrices remain) + + * FreeSerif.sfd: + + Re-named a bunch of Cyrillic letters + + * FreeSerif.sfd: + + Put above mark on Cyrillic i and double-dot i for Slavonic number forms + +2008-03-30 Steve White + * FreeSans.sfd: + + Tightened spacing on glyphs of last commit + + * FreeSans.sfd, FreeSerif.sfd: + + Concerning bug #16120, Include upper case Wynn and upper case Yogh + Adapted Herman Miller's Thyromanes letters 01F7 021C 021D for Serif + Drew my own versions for Sans. + + * FreeSerif.sfd: + + Added 04F6,7 + + * FreeSerif.sfd, FreeSerifItalic.sfd: + + Made more Cyrillic diacritics really combine. + Made a mark lookup just for Cyrillic diacritics, + Marked most of the unadorned Cyrillic alphabet. + + Still not clear on correct shapes for some of the marks. + + * FreeMono.sfd, FreeMonoOblique.sfd: + + Tweeks to accents + +2008-03-29 Steve White + * FreeSans.sfd, FreeSerifItalic.sfd: + + Small adjustments in Cyrillic + + * FreeSerif.sfd: + + Corrected small palochka + Made Cyrillic combining hundred-thousands and millions really combine + Named some combining diacriticals + + * FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd: + + Mostly adjusted horizontal spacing of mono oblique faces + + * FreeMono.sfd, FreeMonoBold.sfd, FreeMonoBoldOblique.sfd, FreeMonoOblique.sfd, FreeSansBold.sfd, FreeSansBoldOblique.sfd, FreeSansOblique.sfd, FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + More cleanup of Cyrillic ranges + + Completely re-did horizontal spacing of SerifItalic and SerifBoldItalic. + See bug #17912, poor kerning in Cyrillic oblique... + https://savannah.gnu.org/bugs/index.php?17912 + It looked like chaos to me. + Only so much can be done: the font is flawed. + But I think the changes make text readable in these faces. + + There were dozens of incorrect glyphs in higher-numbered characters. + I deleted all those I found. No glyph is better than a wrong glyph. + + Futzt with accents, shooting for consistency and readability. + + A maintenance thing: making correct references (acyrillic vs a, + although they may be the same glyph) I made a lot of headway, but + it isn't finished. + + Likewise, a large fraction of these are compound characters, which can + be made with references, resulting in easier maintenance, reduced + likelihood of errors, and smaller files. I replaced many. + + * FreeSerif.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Cyrillic italic + Added italic, bolditalic + 0493, 04a7, 04AD + because their form clearly varies in italic. But was just guessing... + + * FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Cyrillic italic + + Added italic, bolditalic + 0493, 04AD + because their form clearly varies in italic. + But was just guessing as to exact form. + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Overhaul of Cyrillic + + Italic, BoldItalic + added small yat for bug #22588 (note Times New Roman doesn't use + alternate form in Italic) + + All forms of Serif have big problems in Cyrillic. + + The ugliest is in roman. The letters, even of the Russian alphabet, are + of inconsistent height (awfully, small 0438 (ii) 0446 (tse)) + and they vary from the height of Latin + and they vary from the height of italic and bold. + They are a mish-mash of letters from several fonts, of similar (but not + quite identical) weight, and similar, (but not quite identical) size. + + I think the best solution would be to identify the face that best + matches Latin, and fill the range with that. I think this is possible + because the rarer letters seem to be better: the common letters are the + ones that are wrong. + + For now, I just increased the sized of 0438 and 0446, and 048a, 048b, + also 0459 (lje) 045A (nje) 0464 (dje) + + Other issues + +2008-03-27 Steve White + * FreeSerifBoldItalic.sfd: + + Moving all Greek capitals with accent so they don't cover previous + letter. Remedies bug #12798 + + * FreeSerif.sfd, FreeSerifBold.sfd, FreeSerifBoldItalic.sfd, FreeSerifItalic.sfd: + + Various tweeks to accented Latin letters. + Connected O-ogonek correctly + + * FreeSerifItalic.sfd: + + Accents of numerous accented Latin letters got shifted in a previous + commit. This fixes it. + + * FreeSerif.sfd: + + Adjusted combining tack left and right (0318-0319) to be above -300 EM. + + * FreeSans.sfd, FreeSerif.sfd: + + Added some "middle" marks for positioning of diacritics + + * FreeSans.sfd: + + Copied 4 enclosing combining diacriticals from Serif 20DD - 20E0 + + * FreeSerif.sfd: + + Adjusted and added some enclosing diacritics 20DD - 20E0 + In response to Debian bug #472566 + ttf-freefont: U+20DD COMBINING ENCOLSING CIRCLE doesn't combine + http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=472566 + +2008-03-26 Steve White + * FreeSerif.sfd: + + Lowered a few over-high Latin accents + + * FreeSansBold: + + Devangari--only digits 1 and 2, and nothing else. Deleted + + * FreeMonoBold, FreeMonoOblique, + FreeSerifBold, FreeSeriftalic, FreeSerifBoldItalic, + FreeSansOblique, FreeSansBold, FreeSansBoldOblique: + + Got rid of dotlessj, comma in Corporate Use + Single Substitution lookup, ccmp table + Made proper dotlessj, re-linked j-circumflex + + Note: + FreeSansBold has a commaaccent in Corporate Use, used by several other + characers. Haven't done anything about this. + +2008-03-25 Steve White + * FreeSerif.sfd: + + Added/corrected glyphs for yeh hamza in Arabic, + Added init and medi lookups for yeh hamza. + +2008-03-24 Steve White + * FreeSerif.sfd: + + Added isolated and final forms for + 0629 teh marbuta + 0624 waw hamza + 0626 yeh hamza + 0649 alef maksura + A previous commit had added lookups that referred to these, + + More fiddling with super/subscripts + + * Makefile, Makefile, GenerateTrueType: + + Scripts and Make targets to generate OpenType fonts and zip file + + * maintenance.txt: + + Added gnupload and info about tagging + +2008-03-23 Steve White + * FreeSerif.sfd: + + Last of Find Problems -> ATT + 'mark' Latin lookup: afii10026 is in 'cyrl', also afii10074 + Upper and lower Cyrillic i. Just removed mark from both letters. + + 'half' Bengali lookup Khanda_Ta is in 'bng2'. Added bng2 to lookup + Added TtTable etc + + Clean-up of Points too Close through to end of font. + This episode completes the paths/points clean-up of Serif. + But note: many ranges, esp. Ethiopic, Japanese, and Indic, have way + too many points, resulting in lumpiness. + + At this point, FontForge can convert splines to quadratic, auto-hint, + and auto-instrument without segfault. + + * Makefile, sfd/Makefile, tools/GenerateTrueType: + + Alterations to build process: added a Makefile, and made to work + on my system. Now auto-hints before generating TrueType. + +2008-03-22 Steve White + * sfd/FreeSans.sfd: + Lots of additions of math characters. Should complete for + LaTeX 2e, except for extensible brackets. + +2008-03-21 Steve White + * *.sfd: + + Regularized stacking of accents in Latin Extended Additional + Changed name of 00B5 from 'mu' to 'micro', + 2206 from 'Delta' to 'Delta.math', + 0308 from 'diaerisis' to 'diaerisiscomb' + + * FreeMono.sfd: + + additions to IPA + + * FreeMonoBoldOblique.sfd: + + Moved dotlessj from Corporate Use, + Deleted commaaccent there + Fixed mis-named glyphs tcommaaccent, Tcommaaccent + Changed name of 030A from 'dieresis' to 'ringcomb' + + * FreeSans.sfd: + + Added some arrows, and a couple of blackboard bold characters + + Several characters in U+F600 Corporate Use range + dotlessj, onefitted, commaaccent + + dotlessj referred to by: jcircumflex, uni01F0: + renamed it to uFFFF, re-linked others by hand + + commaaccent + http://diacritics.typo.cz/index.php?id=9 + should be u+0326 but wasn't linked to anything + + * FreeSansBold.sfd: + + U+0617 etc: read glyphs "4GWglm". It should be Arabic. Deleted + + * FreeSansBold.sfd, FreeSansOblique.sfd, FreeSansBoldOblique.sfd: + + Removed bogus glyphs for 200C 200D, ZWJ and ZWNJ + + * FreeSerif.sfd: + + Split lookup for ligatures in latin into two classes; + ff, ffl, fl which are appropriate for all languages, + and fi, ffi, which are not appropriate in Turkish (due to distinction + between short and long i) + Needs to be done for other faces. + + Filled set of extensible brackets in Miscellaneous Technical + + Think IPA is now complete. + +2008-03-18 Steve White + * FreeSans.sfd: + + clean-up of all path issues and points too close + +2008-03-18 Steve White + * FreeSans.sfd: + + Something was causing crashing effects in Windows. Cleanup of + problems eventually made it go away. Now works well. + + Cleaned up many "points too close" + + Cleaned up all ATT problems, of which there were many and various. + + # Incorrectly labelled zero-width joiner used in a ligature + + # Incorrect substitution of dotlessi and dotlessj with i and j was + somehow connected with FontForge crash. Attemts to remove the + substitution would damage a 'ccmp' table; subsequent changes would + result in FontForge crashing on save, and truncating the sfd file. + Surgically removed with vi. + + # A couple of Indic lookups had incorrect script DFLT; one had 'latn'. + + # Don't understand why there are scripts named + dev2 bng2 grj2 gur2 when there are already deva beng gurj guru + But anyway, lots of 'vatu' 'pres' 'haln' and 'liga' lookups contained + characters in the '2' scripts but were lablled only for the 'non-2' + ones. Added the '2' scripts to all these lookups. Suspect a mistake. + + Note: several of these problems are repeated in other Sans faces. + +2008-03-16 Steve White + * FreeMono.sfd: + + Cleanup of many path problems "points too close" + + Strove to make accents Latin Extended range legible at small sizes + + Named some unnamed characters; removed a duplicate + + At this point, all fonts are passing FontForge Validate. + +2008-03-15 Steve White + * FreeSerif.sfd: + + CJK punctuation: made some of the very high glyphs smaller (under 900EM) + The brackets in Sans were very ugly, and not even Sans-serif. + Serif: added extensible square brackets, diddled with integral + corrected direction of some added glyphs + + Several bugs having to do with missing glyphs in Tamil range. + Also a buggy ligature in Devangari. + + Shortened names of many lookup tables + + Futzt with some combining diacriticals + + Added extensible square brackets. + + * FreeSans.sfd: + + Changed names of a bunch of glyphs with invalid + TrueType names, in range 0x1025f+ (not real Unicode). + Took pains to retain information contained in the names. + Wonder if these glyphs have ever been of any use. + + CJK Punctuation: brackets were hand-drawn and very ugly. Improved. + + * *.sfd: + + Set OS/2 Metrics back to absolute 900/300. Offsets are not + interpreted uniformly. + + Cleanup of many path problems up to extrema and self-intersecting + + Ordered PS Blue values. + +2008-03-14 Steve White + * FreeSerif.sfd: + + Got rid of mixed references and contours + Cleanup of many path problems "points too close" + + Started clean-up to satisfy FontForge Validate + + Changed names of three glyphs in the + Tamil ligatures range...all clearly bugs. + + * FreeSans.sfd: + + Added slanted-hyphen + + * *.sfd: + + Unified OS/2 Metrics + Added Grid Fit + +2008-03-13 Steve White + * FreeSans.sfd: + + Rearranged PS BluesValues so they were in increasing order, + Made all 20 in width. + +2008-03-12 Steve White + * FreeSans.sfd, FreeMono.sfd: + + Added TrueType hinting tables. + Fixed glyphs that didn't convert well to quadratics + Got rid of mixed contours and refs + + * FreeSerifBold.sfd: + + Cleanup of path problems + +2008-03-11 Steve White + * FreeMonoOblique.sfd: + + Cleanup of path problems + +2008-03-09 Steve White + * FreeSerif.sfd: + + Corrected L-dot + Further cleanup of path/ref problems + + Found several ligatures that referred to a missing glyph "ZWJ". + Took this to mean the "zero width joiner" u+200D + + * *.sfd: + + Changed OS/2 metrics to be absolute 900/300 + + * FreeSerifItalic.sfd: + + Added Greek lunate epsilon + + * FreeMono.sfd: + + Many additions in math range + Reduced size of binary union, intersection, vee, wedge + Corrected empty set + Corrected logical 'assert' relations, etc. 22a2-22af + Efforts to make Math glyphs legible at small point sizes + + * FreeSans.sfd: + + Added Greek lunate epsilon and rho symbol + Unstacked more stacked diacriticals + + Further cleanup of path/reference problems + +2008-03-08 Steve White + * FreeSans.sfd, FreeSerif.sfd: + + Added some "n-ary" Math operators + + * FreeSerif.sfd: + + Further clean-up of path problems...up to Ethiopic + > Started adding and correcting Math operators for LaTeX 2e + > Corrected n-ary union, intersection, and spikes to be larger + than the binary operators + > Made (many of) the operators based on + - = to use those + symbols directly (by reference or copying). + > Added lunate epsilon + > Corrected empty set + > Tightened up spacing of some other technical characters + > Worked on some more math operators involving = + > triangle + > Several arrows + > Supplemental Arrows-A + + * FreeSans.sfd: + + Clean-up of font paths + Open self-intersecting outermost-clockwise missing-extrema + also flipped references (unlinked) + + Added Greek lunate epsilon and rho symbol + +2008-03-06 Steve White + * sfd/FreeSerif.sfd: Shortened and thickened the combining hook mark, + U+0309, to make more like Unicode samples. + Also see (bug #22499) un-stacked incorrectly stacked accents + +2008-03-05 Steve White + * sfd/FreeSerif.sfd: vertical lines: combining diacritical marks + corrected 0300 030D 0329 0348 (were rendered as straight apostrophes) + Spacing Modifier letters added 02C8 02CC + 02B9 02Ba prime and double-prime + Fixed positioning U+1EC8, 9, I with hook above + +2008-03-03 Steve White + * sfd/FreeSerif.sfd: TT strings updates. + updated Copyright to 2008 + Added Vendor URL as the Savannah freefont site + * sfd/FreeMono.sfd: A standard pangram as the Sample Text for Russian + It reads: In the thickets of the South once there was a citrus + ...--yes, but a fake specimen! + * sfd/*.sfd: Set the OS/2 Sup/Sub settings, which by default looked + like random trash. + +2008-03-02 Steve White + * sfd/FreeSerif.sfd: began cleanup of problems given by FontForge + "Find Problems" feature. (bug #22454) + +2008-03-01 Steve White + * sfd/FreeSerif.sfd: made Arabic work for text display (bug #22329) + Added required contextual replacement tables, + Made a few missing characters, + * sfd/*.sfd: Removde all back layers from glyphs that had them. + +2008-02-27 Steve White + * sfd/FreeSans.sfd: filled in Combining Diacriticals + * sfd/FreeSerif.sfd: shifted whole Arabic range down by 200EM. + +2008-02-26 Steve White + * sfd/FreeSerif.sfd: enabled DPOS table. + +2008-02-24 Steve White + * sfd/*.sfd: Much fiddling with the "combining diacriticals" + range 0300-036F. Made to align with medium-size lowercase + preceding character if not using DPOS table. + +2008-02-23 Steve White + * sfd/FreeSerif.sfd, FreeSans.sfd, FreeMono.sfd: (bug #21784) Filled + in set of HTML 4 Character Entities. + + * sfd/FreeSerif.sfd, FreeSans.sfd, FreeMono.sfd: (bug #18413) + undertie too low -- went on to tidy other similar characters in + Combining Diacriticals range. + +2008-02-21 Steve White + * sfd/*.sfd: Moved capital Greek letters with tonos so tonos doesn't + cover preceding letter (bug #12798) + + * sfd/FreeSerif.sfd, FreeSans.sfd: (bug #13370) made extended + integrals to line up. + +2008-02-20 Steve White + * sfd/*.sfd: started removing glyphs with back layers (printing bug) + * sfd/*.sfd: adjusted vulgar fractions (bug #17756) + * sfd/*.sfd: adjusted numerical superscripts (bug #20278) + +2008-02-18 Steve White + * sfd/FreeSerif.sfd: Offset Hiragana and Katakana ranges (bug #22326) + * sfd/FreeSerif.sfd: U+30FB, KATAKANA MIDDLE DOT to be full width + (bug #18326) + + * sfd/FreeSerif.sfd: Re-promoted + ff ffi ffl fi fl + as standard ligatures in Latin. + +2008-02-17 Steve White + * sfd/*.sfd: committed to FontForge Spline Font Database (SFD) 2 + format. + +2008-02-10 Steve White + * sfd/*.sfd: brought into line with Debian ttf-freefont + Deleted a couple of patches, and applied those applied to Debian. + +2006-09-20 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * INSTALL: added installation procedure for MacOS X, courtesy + Philipp Kempgen. + +2006-05-04 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd: deleted Russian sample text, which did not + conform to UTF-7. + +2006-04-15 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd: corrected U+10D3. + + * sfd/FreeSans.sfd: ligature U+FB06 (LATIN SMALL LIGATURE S T) + changed from mandatory ("liga") to discretionary ("dlig") (bug + #16253). + + * sfd/FreeMono.sfd: deleted incomplete glyph U+FB06 (LATIN SMALL + LIGATURE S T); deleted U+FB00, U+FB01, U+FB02, U+FB05 as + ligatures (bug #16253). + + * sfd/FreeMonoOblique.sfd, sfd/FreeMonoBoldOblique.sfd: added + U+FB00; deleted U+FB01, U+FB02 as ligatures (bug #16253). + + * sfd/FreeMonoBold.sfd: deleted U+FB00, U+FB01, U+FB02 as + ligatures (bug #16253). + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd: added Georgian letters, donated by + Gia Shervashidze + +2006-02-22 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd: ligature U+FB4F + changed from mandatory ("liga") to discretionary ("dlig"). This is + respons to Bug#349657: [bug #15792] Freefont Alef and Lamed + combine + +2006-02-21 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerifBold.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBoldOblique.sfd, + sfd/FreeSansBold.sfd: ligature U+FB4F changed from mandatory + ("liga") to discretionary ("dlig"). This is respons to Bug#349657: + [bug #15792] Freefont Alef and Lamed combine + + * sfd/FreeSerif.sfd: corrected bug#275759: [bug #15790] FreeSerif + glyphs for U+2198/U+2199 were reversed. + +2006-02-15 Denis Jacquerye <moyogo@gmail.com> + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeMonoBold.sfd: removed ij + and IJ ligatures. + +2006-02-10 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd: added small Georgian letters (mkhedruli), + donated by Gia Shervashidze + + * AUTHORS: Added Gia Shervashidze + + * CREDITS: Added Gia Shervashidze + +2006-01-26 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * notes/maintenance.txt: Added information on the Makefile now + used; username for FTP login is anonymous. + + * sfd/FreeSansBold.sfd: added U+0569, U+0571, U+0579, U+057B, + U+0586. Armenian small letters completed. + + * sfd/FreeSerif.sfd: added U+0297, U+02AD-02AF. IPA Extensions + section is now complete. Copied a dozen of glyphs from Omega IPA + to Phonetic Extension section. + +2006-01-25 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd: added U+01A, U+01A3, U+01A6, U+01B2, U+01BA, + U+01BB, U+01BE, U+01BF. + + * sfd/FreeSans.sfd: aligned small Armenian letters to x-height in + response to bug #15480. Armenian in Free Sans needs a major + cleanup. + +2006-01-24 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd: changed U+0452, U+045B. Cleanup: U+0460, + U+0461, U+04Bc, U+04BD, U+0508. + + * sfd/FreeSansOblique.sfd: replaced accented chars in Latin-1 and + Latin Extended-B sections with references, where possible. + + * sfd/FreeSerif.sfd: changed U+0285. + +2006-01-23 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd: added U+0195, U+01AA, U+0297, U+03D7, + U+03F0. Several flipped references replaced by outlines. + + * sfd/FreeSansOblique.sfd: Latin Extended-B section more or less + brought in sync with FreeSans. + + * sfd/FreeMonoBoldOblique.sfd: added glyphs from FreeMonoBold in + the Latin Extended-B and IPA Extensions sections. + + * sfd/FreeSerifBold.sfd: Added U+0224, U+0225. Changed U+01B7, + U+01B8, U+04E0, U+0452, U+045B. Replaced accented characters in + the Cyrillic region with references. + +2006-01-21 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd: added U+0255, U+0264, U+0277, U+0286, + U+029D. Changed U+0261. Deleted spurious glyphs in the control + code area. + +2006-01-19 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd: replaced Hardip Pannu Singh's Gurmukhi with + AnmolUni by Kulbir Singh Thind. + +2006-01-17 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSansBold.sfd: Added U+018D, U+0194, U+01B5, U+01B6, + U+01BE, U+0262, U+02A2. + + * sfd/FreeSansBold.sfd: Changed U+0261 in order to distinguish it + from U+0067. Changed U+0251, U+0252. + + * sfd/FreeSerifBold.sfd: Small changes in the Cyrillic + section. Added U+0183, U+018C. + + * sfd/FreeSans.sfd: Added U+2045, U+2046. + + * sfd/FreeSansBold.sfd: Filled in the Gurkmukhi part with the + AnmolUni-Bold by Kulbir Singh Thind. Also some minor corrections + in the Cyrillic part. + + * CREDITS: Added Kulbir Singh Thind. + + * AUTHORS: Added Kulbir Singh Thind. + +2006-01-14 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd: Thomas Ridgeway's Tamil characters replaced + by the ones released by the Samyak font project. + + * CREDITS: Added Pravin Satpute, Bageshri Salvi, Rahul Bhalerao + and Sandeep Shedmake + + * AUTHORS: Added Pravin Satpute, Bageshri Salvi, Rahul Bhalerao + and Sandeep Shedmake + +2006-01-08 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSansBold.sfd, sfd/FreeMonoBoldOblique.sfd: minor changes. + +2006-01-05 Denis Jacquerye <moyogo@gmail.com> + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd: added cedi sign U+20B5, Ghanaian + currency + +2005-12-29 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd: minor cleanup in the Gujarati part. + +2005-12-22 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd: Devanagari and Gujarati parts cleared; once + again merged with Gargi 1.9 and Padmaa 0.6, this time correctly so + that the anchor points survived the merger. + +2005-12-16 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd: added U+0577. + +2005-12-15 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd: added U+0559, U+055F, U+2024. + + * sfd/FreeSansBold.sfd: added U+056E, U+0573. + +2005-12-14 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd: Merged with Gargi 1.9 and Padmaa 0.6, + courtesy Monika Shah and Sonali Sonania from C-DAC, Mumbai. + + * CREDITS: Added Monika Shah and Sonali Sonania. + + * AUTHORS: Added Monika Shah and Sonali Sonania. + +2005-12-13 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd - Removed Sinhala glyphs. + + * sfd/FreeSerif.sfd - Added Sinhala glyphs, formerly in FreeSans. + +2005-12-09 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd: added U+20AF, U+211E. Changed U+20AC (EURO + SIGN). + + * tools/freefont-ttf.spec: Added specification file for building + RPM package, courtesy Rok Papez. + + * sfd/FreeSerifBold.sfd: added more glyphs from Txfonts to the + Arrows and Mathematical Symbols ranges. + + * sfd/FreeSerifBoldItalic.sfd: added U+03F5 from Txfonts. + +2005-12-08 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd: added U+0567, U+056A, U+056C, U+0582. + + * sfd/FreeSerifBold.sfd: copied Box Drawing range from FreeSans. + + * sfd/FreeSerifBold.sfd: added glyphs from Txfonts to the Arrows + and Mathematical Symbols ranges. + + * sfd/FreeSerif.sfd: added U+2259-225A, U+22BA, U+2308-230B, + U+2322-2323. Cyrillic composite characters replaced with + references. + +2005-12-07 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerifBold.sfd: added U+025A, U+025D, U+026B, U+029B, + U+02AE, U+02AF, U+02DE. + + * sfd/FreeSerifBold.sfd: updated Hebrew part with Drugulin font + from the Culmus project. + + * sfd/FreeSerif.sfd: added U+207A-207C, U+208A-208C, U+2215-2216. + + * sfd/FreeSans.sfd: added U+2320 TOP HALF INTEGRAL, U+23AE + INTEGRAL EXTENSION, U+2321 BOTTOM HALF INTEGRAL (bug #13370). + +2005-12-07 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerifBold.sfd: added U+0294-0296, U+02A1-02A2. Started + adding "below" anchors. Performed hinting on characters that were + not hinted "en masse". + +2005-12-06 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd: fixed some more metrics problems in the + Extended Greek area; performed hinting on characters that were not + hinted "en masse". + + * Makefile: clean also signature files. + + * sfd/FreeMonoBoldOblique.sfd, sfd/FreeMonoBold.sfd: cosmetic + changes; cleaning background of referenced composed characters. + +2005-12-05 Panayotis Katsaloulis <panayotis@panayotis.com> + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd: Some changes to the greek glyphs, + mostly having to do with "tonos" (accent) + +2005-12-05 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd: minor cosmetic changes. + + * sfd/FreeSans.sfd: adjusted widths of characters in the Extended + Greek range; accents are not any more considerably overhanging on + the left side. Added U+1EDA-1EE3, U+1EE8-1EF1. + + * sfd/FreeSans.sfd: continued working on Extended Greek range; + metrics still not finished. + +2005-12-03 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd: fixed combined Greek accents (bug + #12800). Width of characters still need to be adjusted as in + FreeSerif. + + * sfd/FreeSerif.sfd: fixed positions of Greek accents (bug #12798). + + * CREDITS: Added Panayotis Katsaloulis. + + * AUTHORS: Added Panayotis Katsaloulis. + + * Makefile: minor changes; now creating also a tarfile with sfds. + +2005-12-01 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerifItalic.sfd: added U+0183, U+018C, U+01C0, U+01C1, + U+01C3, U+01E0, U+01E1, U+01F8, U+01F9. + + * Makefile: created a Makefile to assist building. + + * README: an update. + + * COPYING: added GNU General Public License, version 2. + + * tools/GenerateTrueType: wrote a FontForge script for conversion + to TrueType. + + * sfd/FreeSerif.sfd: merged with SolaimanLipi Bangla OpenType font + from www.ekushey.org, courtesy Solaiman Karim. + + * sfd/FreeSerifItalic.sfd: merged with SolaimanLipi Bangla + OpenType font from www.ekushey.org, slanted by 15.5 degrees. + + * sfd/FreeSans.sfd: merged with Rupali Bangla OpenType font from + www.ekushey.org + + * sfd/FreeSansOblique.sfd: merged with Rupali Bangla OpenType font from + www.ekushey.org, slanted by 12 degrees. + + * CREDITS: added Solaiman Karim + + * AUTHORS: added Solaiman Karim + +2005-11-30 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd: merged with the Rachana Normal. + + * AUTHORS: added K.H. Hussain and R. Chitrajan + + * CREDITS: added K.H. Hussain and R. Chitrajan + +2005-11-23 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd - cleaned some background images. + + * sfd/FreeSans.sfd - added U+01A0-01A1, U+01AF-01B0, U+026E, + U+028F, U+0291, U+02A3-02A5, U+031B. Modified U+0198. + +2005-11-22 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd - added U+2504-250B. + + * sfd/FreeSans.sfd - added U+2591-25A1, U+25A3-25A5, U+25AA, U+25AC. + + * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd - added U+0263. + +2005-11-21 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd - corrected positions of some Greek diacritics + on page 0x1F. + + * sfd/FreeMonoOblique.sfd - working on bringing it in sync with + FreeMono.sfd. + + * sfd/FreeSerifBoldItalic.sfd - applied the sequence suggested by + Werner Lemberg for reducing redundant points. Added a couple of + glyphs in the IPA Extensions region. + + * sfd/FreeSansBold.sfd - added U+0574, U+0576. Removed overlaps. + +2005-11-20 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd - added U+02AA-02AC, U+02B0-02B2. + +2005-11-19 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd - added U+01B7-01B9, U+0196, U+019A, U+01C3, + U+0224-0225, U+025E, U+029A, U+2422. Changed U+0184-0185, U+0192, + U+01B4, U+0282, U+0284. + +2005-11-18 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd - added U+02EE, U+207F. + + * sfd/FreeSans.sfd - started Box Drawing area. + +2005-11-17 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerifBold.sfd - added glyphs from the Omega project to + Latin Extended-B, IPA Extensions and Greek ranges. + + * sfd/FreeSerifBoldItalic.sfd - added glyphs from the Omega + project to Latin Extended-B, IPA Extensions and Greek ranges. + + * sfd/FreeSerifItalic.sfd - added glyphs from the Omega + project to Latin Extended-B, IPA Extensions and Greek ranges. + + * sfd/FreeSerifItalic.sfd - added U+018B, U+025C, U+0265, U+026F, + U+0279, U+0287, U+028C-028E, U+029E. + + * sfd/FreeSerifBoldItalic.sfd - added U+1EDA-1EE3, U+1EE8-1EF1, + U+2190-219B, U+219E-21A8, U+21B9-21BA, U+21C4-21CA, U+21E4-21E5, + U+2669-266F. MES-1 compliant. + + * sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSansOblique.sfd, + sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd - added U+FFFD. + + * sfd/FreeSerif.sfd - removed overlaps in Latin Extended-B and IPA + Extensions ranges. + +2005-11-16 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerifItalic.sfd - applied the sequence suggested by + Werner Lemberg for reducing redundant points. + + * sfd/papers/eurotex2003/freefont.tex, + sfd/papers/eurotex2003/freefont.bib - Revised version, sent back + by Karl Berry on 20050110, that should match the one published in + TUGboat. + + * sfd/FreeSerifItalic.sfd - started added accent anchors. Added a + handful of Greek letters from Omega font collection. + + * sfd/FreeSerif.sfd - added a handful of letters in the Latin + Extended-B and IPA Extension ranges from the Omega font collection. + +2005-11-16 Denis Jacquerye <moyogo@gmail.com> + + * sfd/FreeSerif.sfd - moved U+0263 to U+0264; added U+0263 + + * sfd/FreeSerifItalic.sfd - fixe U+01EE; added U+01B7-U+01B9 + +2005-11-16 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd - Made small Greek letters the same height as + Latin and Cyrillic ones and replaced them with references, where + applicable. + + * sfd/FreeSerif.sfd - replaced Greek letters with references, + where applicable. Added U+03D7, U+03F0-03F2. + + * sfd/FreeSerif.sfd - added U+0255, U+025A, U+025D, U+025F, + U+0262-0263, U+026B-026C, U+0274, U+0276-0277, U+028F, U+0291, + U+029D. + + * sfd/FreeMonoOblique.sfd - applied the sequence suggested by + Werner Lemberg for reducing redundant points. Added U+F6BE. + + * sfd/FreeSansOblique.sfd - applied the sequence suggested by + Werner Lemberg for reducing redundant points. + + * sfd/FreeSans.sfd - changed U+01A5. + +2005-11-16 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd - applied the sequence suggested by Werner + Lemberg for reducing redundant points. Replaced accented glyphs in + the Latin-1 and Latin Extended-A areas with references. Made + capital Greek letters the same height as Latin and Cyrillic ones + and replaced them with references, where applicable. + +2005-11-15 Denis Jacquerye <moyog@gmail.com> + + * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSansOblique.sfd - fixed + U+026A, it was a dotlessi and therefore like U+0069 when + accented. + +2005-11-15 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMonoBold.sfd - corrected Greek tonos (slanted instead of + a vertical line). + + * sfd/FreeMonoBoldOblique.sfd - applied the sequence suggested by + Werner Lemberg for reducing redundant points. Replaced accented + glyphs in the Latin-1 and Latin Extended-A areas with references. + +2005-11-14 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd - Added 2005 in copyright info. + + * sfd/FreeSansBoldOblique.sfd - applied the sequence suggested by + Werner Lemberg for reducing redundant points. Replaced accented + glyphs in the Latin-1 area with references. + + * sfd/FreeSansBoldOblique.sfd - added U+0180, U+0184, U+0185, + U+0195, U+01A0-01A2, U+01AF-01B0, U+025E, U+026E, U+0292, + U+0294-0296, U+029A, U+02A1, U+2126-2127, U+2190-219B, + U+219E-21A8, U+21C4-21CA, U+2669-266F. MES-1 compliant. + + * sfd/FreeMono.sfd - Replaced accented glyphs in the Greek and + Cyrillic areas with references. + + * sfd/FreeMonoBold.sfd - applied the sequence suggested by Werner + Lemberg for reducing redundant points. Replaced accented glyphs in + the Latin-1 and Latin Extended-A areas with references. + +2005-11-14 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd - applied the sequence suggested by Werner + Lemberg for reducing redundant points. + + * sfd/FreeSansBold.sfd - added U+219A, U+219B, U+2669-266F. + + * sfd/FreeSerifBold.sfd - added U+2669-266F. + +2005-11-12 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSansBold.sfd - added U+0180, U+0181, U+0183, U+0187, + U+0188, U+018A, U+018C, U+018D, U+0193, U+019C, U+01A0, U+01A1, + U+01AC, U+01AF, U+01B0, U+025C, U+0260, U+026E, U+0277, U+0281, + U+0284. + +2005-11-11 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSansBold.sfd - added U+195, U+1A6, U+025E, U+026E, + U+029A, U+0313, U+0314, U+0342, U+0344, U+0345. Started adding + accent anchors. + + * sfd/FreeMono.sfd - applied the sequence for reducing redundant + points, suggested by Werner Lemberg. + + * sfd/FreeMono.sfd - corrected Greek letters (using tonos instead + of a vertical line). Added U+026E, U+F6BE. Accented characters in + Latin 1, Latin Extended A and partly Latin Extended B replaced by + references. + + * sfd/FreeSerifBold.sfd - applied the sequence for reducing + redundant points, suggested by Werner Lemberg. Added U+01A5, + U+02A0, U+2190-219B, U+219E-21A8, U+21B8, U+21B9, U+21C4-21CA, + U+21E4, U+21E5. + +2005-11-10 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSansOblique - changed U+0192, U+01A5; added U+01C0-01C3. + + * sfd/FreeSansBold.sfd - replaced glyphs with references in the + Cyrillic area. Removed U+04A8, U+04A9. Added U+04C5, U+04C6, + U+04C9, U+04CA, U+04CD, U+04CE, U+0535, U+053F, U+0546, U+0565, + U+0584, U+0587, U+0589. + +2005-11-10 Denis Jacquerye <moyogo@gmail.com> + + * sfd/FreeSans.sfd - added U+028A-U+028B + + * sfd/FreeSansOblique - added U+028A-U+028B, U+0276, + U+0292, U+0294-U+0296, U+0298-U+0299 and U+029B; fixed some + other glyphs + +2005-11-10 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd - added U+01A6. Simplified outlines in the + ASCII range. + + * sfd/FreeSansBold.sfd - added U+00A0, U+00AD, U+0531, U+2126, + U+2190-2199, U+219E-21A8, U+21C4-21CA. + + * sfd/FreeSansBold.sfd - applied the sequence for reducing + redundant points, suggested by Werner Lemberg. Added automatically + constructed accented characters in page 0x1E. + +2005-11-09 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd - added U+0183, U+018C. + + * sfd/FreeSans.sfd - added U+1EA2, U+1EA3, U+1EA8, U+1EA9, U+1EB2, + U+1EB3, U+1EBA, U+1EBB, U+1EC2, U+1EC3, U+1EC8, U+1EC9, U+1ECE, + U+1ECF, U+1ED4, U+1ED5, U+1EE6, U+1EE7, U+1EF6, U+1EF7, U+220A, + U+220B, U+220D, U+2272, U+2273, U+2282, U+2283. + + * sfd/FreeSerifItalic.sfd - changed U+03D5. + + * sfd/FreeSerifBoldItalic.sfd - changed U+03C6; added U+2070, + U+2075-2079, U+207F, U+2080, U+2085-2089, U+2155-217F. + + * sfd/FreeSerif.sfd - added U+0184, U+0185, U+018D, U+0195, + U+0197, U+019A, U+019B, U+01A0, U+01A1, U+01AC, U+01B5, U+01B6, + U+01C0, U+01C1, U+01C3, U+01F6, U+0294-0296, U+1E9A, U+1EDA-1EE3, + U+1EE8-1EF1. + +2005-11-07 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSansBold.sfd - added U+0562, U+056D. U+0575. + + * sfd/FreeMono.sfd - added U+0589. + +2005-11-06 Primoz Peterlin <peterlin@localhost.localdomain> + + * sfd/FreeSans.sfd - added U+0278, U+03D5, U+2248. Corrected + U+2071, U+222E, U+2242, U+2243 in response to bug reports + http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=276118 + http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=276120 + + * sfd/FreeMono.sfd - added U+2227, U+2228, U+2262. Corrected + U+2299-229D in response to bug report + http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=276121 + + * sfd/FreeMonoBold.sfd - added U+2010, U+2012 in response to bug + report http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=289032 + Swapped U+03C6 (Greek small letter phi) and U+03D5 (Greek phi + symbol) in order to conform to Unicode standard. Simplified glyph + shapes in ASCII range. Started adding "above" and "below" anchors. + +2005-11-05 Primoz Peterlin <peterlin@localhost.localdomain> + + * sfd/FreeSerif.sfd - accented letters in Latin Extended-A + replaced by references wherever possible. + + * sfd/FreeSerif.sfd - added U+0180, U+0181, U+0187, U+0188, + U+018A, U+0193, U+019C, U+01A4, U+01A5, U+01A7, U+01A8, U+01AF, + U+01B0, U+026E, U+0270, U+0278, U+0280, U+0281, U+028B, U+0299, + U+029C, U+029F. + +2005-11-03 Primoz Peterlin <peterlin@localhost.localdomain> + + * sfd/FreeSansBold.sfd - added U+0180, U+0184, U+0185, U+0192, + U+019B, U+01A0-01A2, U+01AF, U+01B0, U+01EE, U+01EF, U+0292, + U+0294-0296, U+02A1, U+0532, U+054C, U+057C, U+222B. Changed + U+014B, U+01A5, U+01B4, U+03BB. + + * sfd/FreeSans.sfd - added U+04C5, U+04C6, U+04C9, U+04CA, U+04D, + U+04CE. + + * sfd/FreeSansBold.sfd - cleaner Arabic outlines. Added U+01E4, + U+01E5. + +2005-11-02 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSansBold.sfd - started Armenian; added U+0538, U+0542, + U+0544, U+0548, U+054D, U+054F, U+0550, U+0553, U+0555, U+0561, + U+0563, U+0564, U+0566, U+0568 U+056B, U+056F, U+0570, U+0572, + U+0578, U+057A, U+057D-057F, U+0580, U+0581, U+0583, U+0585. + + * sfd/FreeMono.sfd - swapped U+03C6 (Greek small letter phi) and + U+03D5 (Greek phi symbol) in order to conform to Unicode standard. + Added U+04C5, U+04C6, U+04C9, U+04CA, U+04D, U+04CE. + +2005-11-01 Primoz Peterlin <peterlin@localhost.localdomain> + + * sfd/FreeSansBold.sfd - modified U+019C. + + * sfd/FreeSansBoldOblique.sfd - added U+00A0, U+00AD, U+019C, + U+01B7, U+01B8, U+0275, U+0278, U+0298, U+2012, U+2015, + U+2070-207F, U+2080-208E, U+2153-217F, U+2213, U+2215. + +2005-10-31 Primoz Peterlin <peterlin@localhost.localdomain> + + * sfd/FreeSerif.sfd - added U+0199, U+01AB, U+0265, U+0282, + U+0288, U+028C-028E, U+0290, U+029E, U+02A0. + +2005-10-28 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerifBold.sfd - added U+019E, U+01AB, U+01AD, U+01B1, + U+0256, U+025F, U+0265, U+0269, U+026F, U+0270, U+0279-027F, + U+0282, U+0287, U+0288, U+028C-028E, U+0290. + + * sfd/FreeSerifBold.sfd - added U+2070, U+2075-2079, U+2080, + U+2085-2089, U+2153-215E, U+2113-2115, U+2119. + + * sfd/FreeSerifBold.sfd - added U+0199, U+019B, U+01B8, U+01B9, + U+01BE, U+01C0, U+0262, U+0274, U+0278, U+0280, U+028F, U+0298, + U+0299, U+029C, U+029E, U+029F, U+2012, U+2015, U+2016, U+2129, + U+2217. + +2005-10-27 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd - added U+018D, U+0194, U+019B, U+019C, U+01B5, + U+01B6, U+0295, U+0296, U+029B, U+02A2, U+0472, U+0473, U+2114, + U+2119. + + * sfd/FreeSerifItalic.sfd - minor cleanup in the superscript range + (U+2070-2079). + + * sfd/FreeSansBold.sfd - added subscripts and superscripts + (U+2070-208F), completed fractions (U+2152-215F) and Roman + numerals (U+2160-217F). + + * sfd/FreeSerifBold.sfd - added U+018B, U+018E, U+018F, U+0191, + U+019D, U+01A7, U+01A8, U+01AE, U+0253, U+0266, U+0267, U+026A, + U+0271-0273, U+0283, U+0285. + +2005-10-26 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd - added "above" anchors to selected Cyrillic + characters. Added U+0294, U+02A1. + + * sfd/FreeMono.sfd - added U+2011, U+2012, U+203B, U+204A, U+2071, + U+2129, U+2232, U+2233. Changed and/or corrected U+2106, U+211E, + U+2126, U+2127, U+2153-215F, U+2202. + + * sfd/FreeMono.sfd - a try to imitate Denis' work on adding + anchors by adding "above" anchor to a couple of basic Latin + characters. + + * sfd/FreeSansBold.sfd - added U+0278, U+0298. Cleaned up outlines + of most Greek letters. + + * sfd/FreeSansBold.sfd - Added U+2010-2012, U+2015, U+2032, + U+203C, U+2047-2049. + + * sfd/FreeSans.sfd - Added U+01C0-01C2, U+0276, U+0292, + U+0298. Changed U+0251, U+0294, U+02A1. + +2005-10-25 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerifItalic.sfd - added U+00A0, U+00AD, U+2010-2012, + U+2015, U+2126, U+2127, U+2153-215E, U+2160-217F, U+2190-2193, + U+2669-266F. FreeSerifItalic is now MES-1 compliant. + + * sfd/FreeSerif.sfd - added U+0191, U+019D, U+01AE, U+027E, + U+027F, U+0283, U+0285. + + * sfd/FreeSerif.sfd - added U+019E, U+01AD, U+01B8, U+01B9, + U+0253, U+0256, U+0257, U+025C, U+0260, U+0266, U+0267, U+0269, + U+026D, U+0271-0273, U+0279-027D. + + * sfd/FreeSerifBoldItalic.sfd - added U+00A0, U+00AD, U+2010-2012, + U+2015, U+2032-2034, U+203C, U+2047-204A, U+2074, U+2081-2084, + U+2126, U+2153, U+2154, U+215F, U+2215. Corrected positions of + diacritics on U+0200-0217. + + * sfd/FreeSansOblique.sfd, sfd/FreeSans.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeMonoBoldOblique.sfd, + sfd/FreeMonoBold.sfd, sfd/FreeSerifItalic.sfd, + sfd/FreeSerifBold.sfd sfd/FreeSerifBoldItalic.sfd - brought in + sync with Valek Filipov's urw-fonts-1.0.7pre41. + + * sfd/FreeSansOblique.sfd - added U+00A0, U+2011-2012, U+2015, + U+2070, U+2071, U+2074-2079, U+2080-2089, U+2126, U+2153-215F, + U+2190-2195, U+2215, U+266A. FreeSansOblique is now MES-1 + compliant. + +2005-10-24 Denis Jacquerye <moyogo@altern.org> + + * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBoldOblique.sfd - added + ccmp for i and j to be substituted with dotless i or j when + followed by above diacritic + +2005-10-24 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd - added U+2011, U+2012, U+2015. FreeSans is now + MES-1 conformant. + +2005-10-23 Denis Jacquerye <moyogo@gmail.com> + + * sfd/FreeSans.sfd - added above, below, abovemk and belowmk + anchors for diacritics placement to many Basic Latin characters, + some Latin Extented A and B, and some IPA characters; fixed a + couple of precomposed characters to have diacritics at the same + height as similar characters. + +2005-10-21 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd - added U+02B9, U+02BA, U+02CD, U+2017, + U+2036, U+2037, U+203C, U+203E, U+2047-204A. + +2005-10-20 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerifBold.sfd - added U+0182, U+0189, U+0192, U+019F, + U+01A9, U+01B7, U+01C4-01CC, U+01E0-1E2, U+01F0-01F3, U+F6BE. + Corrected position of diacritics on U+0200-0217. + + * sfd/FreeSerif.sfd - added U+00A0, U+00AD, U+0182, U+0189, + U+018B, U+018E, U+018F, U+0192, U+019F, U+01A9, U+01B1, U+01B7, + U+01DD, U+2010-2013, U+2015. FreeSerif is now MES-1 conformant. + +2005-10-19 Denis Jacquerye <moyogo@gmail.com> + + * sfd/FreeSerif.sfd - added U+0268, U+026A, U+0289, U+0292; and + anchor "above" to more base glyphs. + + * sfd/FreeSerifBold.sfd, sfd/FreeSerifItalic.sfd, + sfd/FreeSerifBoldItalic.sfd - added U+0250-0252, U+0258-0259, + U+0261, U+0268, U+026A, U+0279, U+0289 + + * sfd/FreeSerifBold.sfd - added anchor "above" to marks + U+0300-0314, and to base glyphs (vowels). + +2005-10-18 Denis Jacquerye <moyogo@gmail.com> + + * sfd/FreeSerif.sfd - added anchor "above" to marks U+0300-0314, + and bases vowel of the U+0041-007A range, U+00E6, U+0186, U+0190, + U+0254 and U+025B; fixed Latin-1 Supplement block accented glyphs + to use references. + +2005-10-17 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSansBold.sfd - added U+01B7, U+01B8, U+0275. + +2005-10-16 Denis Jacquerye <moyogo@gmail.com> + * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd - added some Latin + Extended-B African letters: U+0181, U+018A, U+0197-0198, U+01A4, + U+01AC, U+01B1, U+01B3-01B4; + + * sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd - added Latin + Extended-B U+0187, 018E-018F, U+0191, U+0193, U+0197-0199, + U+019D-019F, U+01AB-01AE; correcting width of non-space + Combining Diacrtical Marks; added more glyphs to IPA Extensions + to match non Bold + + * sfd/FreeSansBoldOblique.sfd - added many accented glyphs to + Latin Extended-B + +2005-10-15 Denis Jacquerye <moyogo@gmail.com> + * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd - added IPA Extensions + U+0262,U+0274,U+0280-0281, U+0299, U+029F, and Spacing Modifier + Letters U+02C9-02CB; fixed U+0287,029E height to baseline; added + stroke to U+0268 + + * sfd/FreeSansOblique.sfd - fixed skew on U+027F + + * sfd/FreeSansBold.sfd, sfd/FreeSansBoldOblique.sfd - added to Latin + Extended-B U+01A7-01A8, IPA Extensions U+0251-0253, U+0256-0257, + U+0261, U+0265-026A, U+026F-0273, U+0289, U+028C-028E + + * sfd/FreeSansBoldOblique.sfd - added to Latin extended-B U+0189, + U+01A8, U+01B1, U+0283, U+02C9 and Spacing Modifiers U+02C9-02CB + +2005-10-14 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSansBold.sfd - Added a couple of composite glyphs, + mostly in the IPA and Latin Extended B ranges. + +2005-10-13 Denis Jacquerye <moyogo@gmail.com> + + * FreeSans.sfd - removed overlap and simplified U+0187, 0191, + 0193, 01A5, 01AE, 0260, 0271, 0272, 0273, 027B; fixed diacritics + placement on U+0200-0217; fixed glyph for U+0283 to correct esh + without stroke; added U+025F and fixed U+025F from it; fixed + height of glyph at U+0285; arranged U+027E,027F to make more + distinguishable from U+0072. + + * FreeSansOblique.sfd - added the corrected or new glyphs from + FreeSans; diacritics on U+200-0217 will need height readjustements. + + * FreeSansBold.sfd, FreeSansBoldOblique.sfd - added U+0186, 0190, + 0250, 0254, 0258, 0259, 025B, 025C + +2005-10-13 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd - Minor changes: U+22A2, U+22A3, U+22A6, U+23AE. + Added U+0250, U+0251, U+0258, U+0259, U+0275. + + * sfd/FreeSerifItalic.sfd - Added glyphs U+222B-U+222F, U+2320, + U+2321. Fixed diacritics on U+0200-U+0217. + +2005-10-12 Denis Jacquerye <moyogo@gmail.com> + + * sfd/FreeSerif.sfd - Corrected diacritics position on + U+01D5-01D9,01DB,01EA-01ED,0200-0217 and U+022A. + + * sfd/FreeSerif.sfd, sfd/FreeSerifBold.sfd, sfd/FreeSerifItalic.sfd, + sfd/FreeSerifBoldItalic.sfd - added U+0186,0190,0254 and U+025B. + +2005-10-11 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd - Fixed bug #13399 (glyphs for U+0360 and + U+0361 were swapped). + + * sfd/FreeSerif.sfd - Attempt to correct bug #13370: INTEGRAL + EXTENSION does not align with TOP/BOTTOM HALF INTEGRAL; added + glyph U+23AE. + +2005-05-16 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd - Corrected shapes for Cross of Lorraine and + Cross of Jerusalem. + +2005-04-07 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSansBold.sfd - Added some combining accents, just to + test the a version of FontForge. + +2003-12-05 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd - Some composite Latin characters rebuilt, as + they had accents 600 points to the left due to changes on October + 2. Some other minor changes in the mathematics area. + +2003-10-08 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMonoOblique.sfd, sfd/FreeSerifBoldItalic.sfd, + FreeSerifItalic.sfd - applied Josef Segur's corrections from + Oct. 5. + +2003-10-02 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd - Abbas Izad's contributed Arabic/Farsi + characters added. + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd - Combining characters (U+0300 - + U+036F) moved left, so that they have negative horizontal values + and zero advance width. + +2003-09-15 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerifBold.sfd, sfd/FreeSerifItalic.sfd - Started working + on super- and subscripts. + +2003-09-12 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd, sfd/FreeSerif.sfd - Added some missing + Hiragana and Katakana characters. + + * sfd/FreeSansBold.sfd - Cleared background characters in Latin + Extended-A. Added some automatically constructed characters in + Latin Extended-B. Started with superscripts and subscripts. + + * sfd/FreeSans.sfd - Subscript numerals (U+2080-U+2089) completed. + +2003-05-19 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd - Thai characters po pla and bo baimai + swapped; Thai character fongman corrected; all courtesy Theppitak + Karoonboonyanan. + +2003-05-17 Panayotis Katsaloulis <panayotis@panayotis.com> + + * sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, + sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - Full support + of all ancient greek glyphs + +2003-05-15 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * tools/KerningNumerals.pl - A Perl script for moving kerning + information from ASCII numerals (U+0030...) to characters in the + Adobe corporate use area (U+F6xx). + + * sfd/FreeSansBold.sfd, sfd/FreeSansOblique.sfd, + sfd/FreeSansBoldOblique.sfd - Created kerned numerals in the Adobe + corporate use area (U+F6xx) and moved kerning information from + ASCII numerals to the kerned numerals. + +2003-05-14 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd - First approximation of super- and subscript + numerals and vulgar fractions. + + * sfd/FreeSerif.sfd - Super- and subscript numerals complete, + vulgar fractions completed and redone as references rather than + outlines. + +2003-05-12 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd - Clean-up of the Cyrillic letters added on + March 27; super- and subscripts, vulgar fractions. + +2003-05-09 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMonoBold.sfd - Added a couple of characters to + the Latin Extended-B area and the IPA extensions area. + +2003-05-08 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerifBoldItalic.sfd - Added a couple of characters to + the Latin Extended-B area. + + * sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, + sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - ASCII + numerals now monospaced; kerned numerals moved to Adobe corporate + use area + (U+F6xx). + +2003-05-07 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd - Roman numerals now more complete. + + * sfd/FreeSansOblique.sfd, sfd/FreeSansBoldOblique.sfd - Accented + characters added in the Latin Extended-B area. + + * sfd/FreeSans.sfd - Greek accents added in the Greek Extended + area, characters added in the Latin Extended-B area, Roman + numerals added. + + * sfd/FreeMonoOblique.sfd - Kerning pairs removed (what were they + doing in a monospaced font, anyway?). + + * sfd/FreeMonoBoldOblique.sfd - Additions in Latin Extended-B and + Basic Greek. + + * sfd/FreeMono.sfd, sfd/FreeMonoBold.sfd, sfd/FreeMonoOblique.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansBold.sfd, sfd/FreeSansOblique.sfd, + sfd/FreeSansBoldOblique.sfd - Major cleanup (fixed widths, open + paths, path directions (clockwise/counter-clockwise), points + rounded to integer values; outlines simplified etc.) + +2003-05-06 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * tools/OS2UnicodeRange - A simple script to display OS/2 Unicode + range table in TrueType fonts. + + * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd - ASCII numerals now + monospaced; kerned numerals moved to Adobe corporate use area + (U+F6xx). FreeSans is done, FreeSansBold half-way. + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd - Added 2003 in copyright info. + +2003-03-27 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd - Cyrillic and Cyrillic Supplement blocks + brought to conformance with Unicode 3.2, courtesy Daniel Shurovich + Chirkov. + +2003-03-19 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd - somewhat wider + germandbls (U+00DF), due to complaints by Walter Schmidt. + +2003-03-18 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd - Added Sinhala glyphs from the Tipitaka + project <http://www.metta.lk>, recoded to Unicode by Noah Levitt. + +2003-02-19 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd - Minor changes on mathematical operators. + +2003-02-18 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd - minor cleanup of glyph backgrounds; changed + integral signs (U+222B - U+2230) + +2003-02-05 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd - added a couple of glyphs in the IPA and + African Latin ranges. + +2003-01-30 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd - Corrected Maltese Hbar (U+0126) + and/or hbar (U+0127). + +2003-01-28 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerifItalic.sfd - Corrected Maltese hbar (U+0127). + +2002-12-18 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * tools/ConvertFont - PfaEdit script for converting SFD files to + TrueType fonts. + + * sfd/FreeSans.sfd - Added Tamil and Kannada glyphs from the + Akruti Indic fonts. + +2002-12-17 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd - Added Devanagari and Gujarati glyphs from the + Akruti Indic fonts. + + * www/index.html - Added information on Rogier van Dalen's tools. + + * AUTHORS - Added M.S. Sridhar. + + * CREDITS - Correct spelling of Culmus project. Added M.S. Sridhar. + +2002-12-06 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd - Added Braille glyphs, courtesy Vyacheslav + Dikonov. + + * sfd/FreeSans.sfd - Added Unicode Syriac glyphs, courtesy + Vyacheslav Dikonov. + +2002-10-11 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * www/index.html - Added information on the availability of the + Debian GNU/Linux package. + + * sfd/FreeSerif.sfd, sfd/FreeSans.sfd - added some kern pairs + beyond Latin-1 area. + + * sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, + sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - re-introduced + all the emtpy glyph slots (changes from Sep 23 made PfaEdit + crash). + +2002-09-23 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd, sfd/FreeSerifItalic.sfd, + sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd - imported + kerning information from the URW++ AFM files + +2002-09-11 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoOblique.sfd - updated Hebrew parts to comply with + Culmus v0.6. + + * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansOblique.sfd - Added Danilo Segan's Serbian Cyrillic + glyphs; updated Hebrew parts to comply with Culmus v0.6. + +2002-09-09 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansOblique.sfd - Updated Cyrillic part to match + Filippov's 1.0.7pre14 + + * sfd/FreeSansOblique.sfd - added Sam Stepanyan's Armenian glyphs + from FreeSans (skewed for 12 degrees). + +2002-09-06 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd, sfd/FreeSansOblique.sfd, + sfd/FreeSansBold.sfd, sfd/FreeSansOblique.sfd - Added Maxim + Iorsh's Hebrew characters. + +2002-08-29 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, + sfd/FreeMonoBold.sfd, sfd/FreeMonoOblique.sfd - Added Maxim + Iorsh's Hebrew characters. + + * AUTHORS, CREDITS - Added Maxim Iorsh as author. + +2002-08-28 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * www/index.html - Added information of Microsoft's withdrawal of + freely available Unicode TrueType fonts + + * www/resources.html - Added link to Maxim Iorsh's Culmus project. + +2002-07-26 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd - Added a couple of characters (Arrows area). + +2002-06-11 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd - Applied Michalis Kabrianis's patch concerning + perispomeni in Greek politoniko. + +2002-05-23 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd - Applied Michalis Kabrianis's patch concerning + psili in Greek politoniko. Also added two working variants of + chars in the IPA range. + +2002-05-15 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd, sfd/FreeSansBold.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifBold.sfd - Deleted explicit ".notdef" character with + no contours. + +2002-05-14 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd - The new version of PfaEdit saves + correctly formed Panose and LineGap lines. + + * sfd/FreeSansBoldOblique.sfd - Filled-in the missing TTFWidth and + TTFWeight values. + +2002-05-09 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd - Added diacritics to the Spacing Modifier + Letters and Combining Diacritical Marks areas. Added composed + glyphs to the Latin Extended-B area. + +2002-05-07 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd - Updated Panose information with data + provided by Josef W. Segur. Updated TTF headers with English and + Slovenian text. + +2002-04-30 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMonoBold.sfd - Working on Greek small letters. Several + minor changes (lower carons etc.) + +2002-04-29 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * FreeMonoBoldOblique.sfd - Started adding Greek. + + * sfd/FreeMonoBold.sfd - Added glyphs in the Geometrical Shapes + and Miscellaneous Symbols area. Harmonizing Greek with Latin. Done + with capitals. + + * sfd/FreeMono.sfd - Deleted the explicit .notdef character. Added + one glyph to the Geometrical Shapes area, which is now completed; + added three glyphs to the Miscellaneous Symbols area. Harmonizing + Greek with Latin. Done with the capitals. + +2002-04-26 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd - Adjusted accent positions on several glyphs + in the Latin Extended-A area. + +2002-04-25 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMonoBold.sfd - Box Drawing area completed. Added a + couple of glyphs in the Geometrical Shapes area. + + * sfd/FreeMono.sfd - Small corrections in the Box Drawing area. + +2002-04-24 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd - Box Drawing area completed. + +2002-04-23 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * tools/WGL4.lst - corrected. + + * sfd/FreeMono.sfd, sfd/FreeMonoBold.sfd - Working on Box Drawing + area. + +2002-04-22 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd, sfd/FreeMonoBold.sfd - Working on Latin + Extended-B and Greek. + +2002-04-19 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd - Somewhat cleaner chess figures. + + * tools/MES-2.txt, tools/MES-2.lst - Corrected list (it is not + 203C-203E, it is 203C and 203E). + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd, sfd/FreeSans.sfd, + sfd/FreeSansOblique.sfd, sfd/FreeSansBold.sfd, + sfd/FreeSansBoldOblique.sfd, sfd/FreeSerif.sfd, + sfd/FreeSerifItalic.sfd, sfd/FreeSerifBold.sfd, + sfd/FreeSerifBoldItalic.sfd - Changed "Family Name" from Free to + FreeSerif, FreeSans and FreeMono, as appropriate. Changed Font + Modifiers from MonoBold etc. to Bold, Italic, Oblique, BoldOblique + and BoldItalic. + +2002-04-18 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd, sfd/FreeMonoBold.sfd, + sfd/FreeMonoBoldOblique.sfd - Corrected metrics; now all character + widths are set to 600. + +2002-04-17 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd - Corrected glyphs in the Box Drawing area and + Block Elements area, which should extend through the ascender *and + descender* height. + + * sfd/FreeMonoBold.sfd - Continued working on harmonizing Greek + letters with Latin and Cyrillic. + + * sfd/FreeMonoBold.sfd - Added some box drawing characters. + +2002-04-16 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * www/design-notes.html - Updated notes on stroke width for + symbols in Free Mono Bold. + + * sfd/FreeMono.sfd - Added a handful of characters in the + Miscellaneous Symbols area. + + * sfd/FreeMonoBoldOblique.sfd - Added subscripts, superscripts and + vulgar fractions. + + * sfd/FreeMonoBold.sfd - Started harmonizing Greek letters with + Latin and Cyrillic. + + * sfd/FreeMonoBold.sfd - Added subscripts, superscripts and vulgar + fractions. + +2002-04-15 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * www/design-notes.html - Updated notes on super-/subscripts in + Free Mono Bold. Separate subsections for Free Mono regular and + Free Mono Bold. + +2002-04-12 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd - Added Ethiopian glyphs, converted from the + Metafont sources from TGI, Universität Hamburg (authors Berhanu + Beyene, Prof. Dr. Manfred Kudlek, Olaf Kummer, and Jochen + Metzinger) using Szabo's TeXtrace and retouched using + PfaEdit. Ethiopian metafonts are released under GNU GPL, + <http://www.informatik.uni-hamburg.de/TGI/mitarbeiter/wimis/kummer/ethiop_eng.html>. + + * sfd/FreeMonoBold.sfd - Added 40 characters, mostly in the Latin + Extended-B and IPA Extensions areas. + +2002-04-11 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd - Added a handful of characters in the Latin + Extended-B, IPA Extensions, Currency Symbols and Miscellaneous + Symbols areas. + +2002-04-09 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd - Correcting accent positioning in the Extended + Greek area; adding a couple of characters here and there. Still 20 + characters short of MES-2 conformance. + +2002-04-08 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd - Added some characters in the Arrows area; + more or less completed Extended Greek area (accents still need to + be fine-tuned). + +2002-04-05 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd - Modern non-Russian Cyrilic mostly completed. + + * sfd/FreeMonoOblique.sfd - Synchronized with FreeMono. + + * sfd/FreeSerif.sfd - Added Thomas Ridgeway's Tamil characters + (converted from Metafont and edited somehwat). + +2002-04-04 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMonoOblique.sfd - Armenian letters added. + + * sfd/FreeMonoBold.sfd - Serbian Cyrillic letters dje, tshe, lje + and nje corrected. + + * sfd/FreeMono.sfd - Serbian Cyrillic letters dje and tshe + corrected. Some other non-Russian Cyrillic letters modified and + "welded together". + +2002-04-03 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd - Added more or less complete Armenian + area. The glyphs are a tidied-up version based on the Armenian + Courier on the <http://www.cilicia.com/armo8.html>. Now we have + 1673 characters. + +2002-03-28 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd - Added some mathematical symbols. + +2002-03-26 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSans.sfd - took H.S. Pannu's Gurmukhi from FreeSerif. It + actually fits to FreeSans much better. It seems I'll have to look + for another Gurmukhi font with modulated stroke for FreeSerif. + + * sfd/FreeSerifItalic.sfd - replaced existing Hebrew glyphs by + those from FreeSerif (slanted for 15.5 degrees). + + * sfd/FreeSerif.sfd - Added dotted Hebrew letters. Changed barred H. + + * sfd/FreeMono.sfd - Completed vulgar fractions; minor changes in + Greek; added some mathematical operators. + + * sfd/FreeMonoBold.sfd - added 12 characters to Latin Extended-B + and IPA Extensions areas (total 984). + +2002-03-25 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMonoBold.sfd - started adding Latin Extended-B and IPA + Extensions. + + * sfd/FreeMono.sfd - Minor cosmetic changes; cleaning up Greek + (removing redundant control points), added some non-European + Cyrillic glyphs as a test. + +2002-03-22 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd - Some minor modifications; letters in Latin + Extended-B area "welded" together. + +2002-03-20 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * www/index.html - finally linked the resources and design notes + pages. + + * www/design-notes.html - added scaling information for super- and + subscript numerals in FreeMono. + +2002-03-19 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd - the Latin Extended-B and IPA Extension area + characters moved from FreeMono and skewed for 12 degrees. + +2002-03-18 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd - added a dozen or two of new characters, in + particular in the Latin Extended-B and IPA Extension area. + +2002-03-15 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd - added a dozen of two of new characters, in + particular in the IPA Extension area. + + * www/design-notes.html - Corrected data for x-height in FreeMono; + information on constructing small caps. + +2002-03-14 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeMono.sfd - added three smiley characters to the + Miscallaneous Symbols area. + +2002-03-10 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd - Anshuman Pandey has only converted Gurmukhi + from TrueType to Metafont; the original author of Gurkmukhi font + is Hardip Singh Pannu <http://members.aol.com/hspannu/punjabi.html>. + Got the permission from him to include the Gurmukhi glyph set. + +2002-03-08 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd - Added some more glyphs in the Mathematical + Symbols area to a total number of 3374. + +2002-03-06 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd - Added a basic Gurmukhi set. + + * www/design-notes.html - started a page on design notes + + * sfd/FreeMono.sfd - realized that glyphs in the Box Drawing area + and Block Elements area should extend through the ascender *and + descender* height, and corrected it. + + * sfd/FreeMono.sfd, sfd/FreeMonoOblique.sfd - added some musical + glyphs, linking "no-break space" to space, "soft hyphen" to + hyphen-minus etc. + +2002-03-05 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * tools/WGL4.lst - Added Windows Glyph List 4.0 + + * tools/LigatureList.pl - Wrote a Perl script, which lists the + GSUB list (ligature list) of a OpenType font. + + * sfd/FreeSerifBold.sfd, sfd/FreeSerifBoldItalic.sfd, + sfd/FreeSerifItalic.sfd - auxilliary Hebrew glyphs added. They are + too light compared with Latin and will be substituted with better + ones. + +2002-03-04 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd - Added some more glyphs to the Mathematical + Operators area (page 0x22). + + * sfd/FreeSerif.sfd - Incomplete and fragmentary support for + Devanagari, originating from Harsh Kumar's Shusha fonts was + replaced by Frans Velthuis' Devanagari metafont, now maintained by + Anshuman Pandey <apandey@u.washington.edu> and available under + GPL. Until I figure out how to provide glyph substitution table in + OpenType, only the Unicode part is there. + +2002-02-28 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * ChangeLog file created + + * sfd/FreeSerif.sfd - Added some Telugu glyphs to page 0x0C, + courtesy Prasad A. Chodavarapu <http://chaitanya.bhaavana.net/fonts/> + + * sfd/FreeSerif.sfd - Added some glyphs to the Miscellaneous + Symbols page (0x26). + +2002-02-26 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * mailing lists freefont-announce and freefont-bugs created + +2002-02-25 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/FreeSerif.sfd - Added a couple of glyphs in Mathematics + Operators area. + + * sfd/FreeMono.sfd + - Added some more glyphs, in particular in the Mathematical + Operators section. + - Changed FamilyName to Free, FontName to FreeMono, and Full name + to "Free Monospaced". + +2002-02-20 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * sfd/ directory added containing FreeSerif, FreeSans and FreeMono + families. + + * tools/ directory added containing lists with characters required + for MES (Multilinguag European Subset) compliance. + + * tools/mes-list-expand.pl created - a Perl script for expanding MES + ranges into simple one-char-per-line format + + * tools/CheckConformance.pl created - a Perl script for checking + conformance of a font file with a given coded character set + + * homepage <http://www.freesoftware.fsf.org/freefont/> created + +2002-02-19 Primoz Peterlin <primoz.peterlin@biofiz.mf.uni-lj.si> + + * freefont (Free UCS Scalable Fonts) project approved on + savannah.gnu.org: <http://savannah.gnu.org/projects/freefont/> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freefont-20090104/INSTALL b/assets/html2pdf/_tcpdf_5.0.002/fonts/freefont-20090104/INSTALL new file mode 100644 index 0000000..fbbbe80 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/freefont-20090104/INSTALL @@ -0,0 +1,86 @@ + Installing GNU FreeFont + ======================= + +GNU FreeFont can be used in any modern operating system. + +This document explains how to install FreeFont on some common systems. + +UNIX/GNU/Linux/BSD Systems +-------------------------- + +FreeFont works with any system using the free font rasterizer FreeType +<http://www.freetype.org/>. + +* Debian GNU/Linux + +Users of Debian GNU/Linux system will probably want to use the Debian package, +available from the Debian site, + + <http://packages.debian.org/unstable/x11/ttf-freefont.html>, + +or any of its mirrors. + +Install them by issuing the command + apt-get install ttf-freefont + + +* KDE local installation + +Users of KDE can install .ttf files on a per-user basis using the KDE +Control Center module "kcmfontinst", which may appear in the menu as + + Settings -> System Administration -> Font Installer + +This is especially helpful for developers and testers. + + +* Generic X-windows + + 1) Fetch the freefont-ttf.tar.gz package with Free UCS outline fonts + in the TrueType format. + + 2) Unpack TrueType fonts into a suitable directory, + e.g. /usr/local/share/fonts/default/TrueType/ + + 3) If you have chosen any other directory, make sure the directory you + used to install the fonts is listed in the path searched by the X + Font Server by editing the config file in /etc/X11/. + + In some systems, you list the directory in the item "catalogue=" + in the file /etc/X11/fs/config. + + 4) Run ttmkfdir in the directory where you unpacked the fonts. + + +Windows 95/98/NT/2000/XP; Vista +------------------------------- + +Note that in at least Vista, XP and 2000, the OpenType versions perform much +better than, and are recommended over, the TrueType ones. + +* Vista: + 1) From the Start menu, open Control Panels + 2) Drag-n-drop font files onto Fonts control panel + You may get a dialog saying + "Windows needs your permission to continue" + a) Click Continue + +* 95/98/NT: + The font installation is similar to Vista. + + In order to use OpenType, users of Windows 95, 98 and NT 4.0 can + install Adobe's 'Type Manager Light'. It is available for download + without cost from Adobe's web site. + + Otherwise, use the TrueType versions. + +Mac OS X +-------- + +Installing on Mac OS X consists of moving the .ttf files to either + /Library/Fonts/ or ~/Library/Fonts/ +depending on whether they should be available to all users on your system +or just to yourself. + +-------------------------------------------------------------------------- +$Id: INSTALL,v 1.7 2008/12/26 12:33:31 Stevan_White Exp $ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freefont-20090104/README b/assets/html2pdf/_tcpdf_5.0.002/fonts/freefont-20090104/README new file mode 100644 index 0000000..60e67f2 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/freefont-20090104/README @@ -0,0 +1,108 @@ +-*-text-*- + GNU FreeFont + +The GNU FreeFont project aims to provide a useful set of free scalable +(i.e., OpenType) fonts covering as much as possible of the ISO 10646/Unicode +UCS (Universal Character Set). + +Statement of Purpose +-------------------- + +The practical reason for putting glyphs together in a single font face is +to conveniently mix symbols and characters from different writing systems, +without having to switch fonts. + +Coverage +-------- + +FreeFont covers the following character sets + +* ISO 8859 parts 1-15 +* CEN MES-3 European Unicode Subset + http://www.evertype.com/standards/iso10646/pdf/cwa13873.pdf +* IBM/Microsoft code pages 437, 850, 852, 1250, 1252 and more +* Microsoft/Adobe Windows Glyph List 4 (WGL4) + http://www.microsoft.com/typography/otspec/WGL4.htm +* KOI8-R and KOI8-RU +* DEC VT100 graphics symbols +* International Phonetic Alphabet +* Arabic, Hebrew, Armenian, Georgian, Ethiopian and Thai alphabets, + including Arabic presentation forms A/B +* mathematical symbols, including the whole TeX repertoire of symbols +* APL symbols + etc. + +Editing +------- + +The free outline font editor, George Williams's FontForge +<http://fontforge.sourceforge.net/> is used for editing the fonts. + +Design Issues +------------- + +Which font shapes should be made? Historical style terms like Renaissance +or Baroque letterforms cannot be applied beyond Latin/Cyrillic/Greek +scripts to any greater extent than Kufi or Nashki can be applied beyond +Arabic script; "italic" is really only meaningful for Latin letters. + +However, most modern writing systems have typographic formulations for +contrasting uniform and modulated character stroke widths, and have some +history with "oblique", faces. Since the advent of the typewriter, most +have developed a typographic style with uniform-width characters. + +Accordingly, the FreeFont family has one monospaced - FreeMono - and two +proportional faces (one with uniform stroke - FreeSans - and one with +modulated stroke - FreeSerif). + +To make text from different writing systems look good side-by-side, each +FreeFont face is meant to contain characters of similar style and weight. + +Licensing +--------- + +Free UCS scalable fonts is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License as published +by the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +The fonts are distributed in the hope that they will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +As a special exception, if you create a document which uses this font, and +embed this font or unaltered portions of this font into the document, this +font does not by itself cause the resulting document to be covered by the +GNU General Public License. This exception does not however invalidate any +other reasons why the document might be covered by the GNU General Public +License. If you modify this font, you may extend this exception to your +version of the font, but you are not obligated to do so. If you do not +wish to do so, delete this exception statement from your version. + + +Files and their suffixes +------------------------ + +The files with .sfd (Spline Font Database) are in FontForge's native format. +Please use these if you plan to modify the font files. + +TrueType fonts for immediate consumption are the files with the .ttf +(TrueType Font) suffix. These are ready to use in Xwindows based +systems using FreeType, on Mac OS, and on older Windows systems. + +OpenType fonts (with suffix .otf) are for use in Windows Vista. +Note that although they can be installed on Linux, but many applications +in Linux still don't support them. + + +-------------------------------------------------------------------------- +Primoz Peterlin, <primoz.peterlin@biofiz.mf.uni-lj.si> +Steve White <stevan.white@googlemail.com> + +Free UCS scalable fonts: http://savannah.gnu.org/projects/freefont/ +$Id: README,v 1.6 2008/12/25 12:51:41 Stevan_White Exp $ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freemono.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemono.ctg.z new file mode 100644 index 0000000..93b7b3c Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemono.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freemono.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemono.php new file mode 100644 index 0000000..123b3bf --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemono.php @@ -0,0 +1,348 @@ +<?php +$type='TrueTypeUnicode'; +$name='FreeMono'; +$desc=array('Ascent'=>800,'Descent'=>-200,'CapHeight'=>40,'Flags'=>32,'FontBBox'=>'[-793 -200 699 800]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>600); +$up=-125; +$ut=50; +$dw=600; +$cw=array( +32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600,40=>600,41=>600, +42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600,50=>600,51=>600, +52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600,60=>600,61=>600, +62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600,70=>600,71=>600, +72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600,80=>600,81=>600, +82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600,90=>600,91=>600, +92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600,100=>600,101=>600, +102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600,109=>600,110=>600,111=>600, +112=>600,113=>600,114=>600,115=>600,116=>600,117=>600,118=>600,119=>600,120=>600,121=>600, +122=>600,123=>600,124=>600,125=>600,126=>600,8364=>600,8218=>600,402=>600,8222=>600,8230=>600, +8224=>600,8225=>600,710=>600,8240=>600,352=>600,8249=>600,338=>600,381=>600,8216=>600,8217=>600, +8220=>600,8221=>600,8226=>600,8211=>600,8212=>600,732=>600,8482=>600,353=>600,8250=>600,339=>600, +382=>600,376=>600,160=>600,161=>600,162=>600,163=>600,164=>600,165=>600,166=>600,167=>600, +168=>600,169=>600,170=>600,171=>600,172=>600,173=>600,174=>600,175=>600,176=>600,177=>600, +178=>600,179=>600,180=>600,181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600, +188=>600,189=>600,190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600, +198=>600,199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600, +208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600,217=>600, +218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600,226=>600,227=>600, +228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600,235=>600,236=>600,237=>600, +238=>600,239=>600,240=>600,241=>600,242=>600,243=>600,244=>600,245=>600,246=>600,247=>600, +248=>600,249=>600,250=>600,251=>600,252=>600,253=>600,254=>600,255=>600,256=>600,257=>600, +258=>600,259=>600,260=>600,261=>600,262=>600,263=>600,264=>600,265=>600,266=>600,267=>600, +268=>600,269=>600,270=>600,271=>600,272=>600,273=>600,274=>600,275=>600,276=>600,277=>600, +278=>600,279=>600,280=>600,281=>600,282=>600,283=>600,284=>600,285=>600,286=>600,287=>600, +288=>600,289=>600,290=>600,291=>600,292=>600,293=>600,294=>600,295=>600,296=>600,297=>600, +298=>600,299=>600,300=>600,301=>600,302=>600,303=>600,304=>600,305=>600,306=>600,307=>600, +308=>600,309=>600,310=>600,311=>600,312=>600,313=>600,314=>600,315=>600,316=>600,317=>600, +318=>600,319=>600,320=>600,321=>600,322=>600,323=>600,324=>600,325=>600,326=>600,327=>600, +328=>600,329=>600,330=>600,331=>600,332=>600,333=>600,334=>600,335=>600,336=>600,337=>600, +340=>600,341=>600,342=>600,343=>600,344=>600,345=>600,346=>600,347=>600,348=>600,349=>600, +350=>600,351=>600,354=>600,355=>600,356=>600,357=>600,358=>600,359=>600,360=>600,361=>600, +362=>600,363=>600,364=>600,365=>600,366=>600,367=>600,368=>600,369=>600,370=>600,371=>600, +372=>600,373=>600,374=>600,375=>600,377=>600,378=>600,379=>600,380=>600,383=>600,384=>600, +385=>600,386=>600,387=>600,388=>600,389=>600,390=>600,391=>600,392=>600,393=>600,394=>600, +395=>600,396=>600,397=>600,398=>600,399=>600,400=>600,401=>600,403=>600,404=>600,405=>600, +406=>600,407=>600,408=>600,409=>600,410=>600,411=>600,412=>600,413=>600,414=>600,415=>600, +416=>600,417=>600,418=>600,419=>600,420=>600,421=>600,422=>600,423=>600,424=>600,425=>600, +426=>600,427=>600,428=>600,429=>600,430=>600,431=>600,432=>600,433=>600,434=>600,435=>600, +436=>600,437=>600,438=>600,439=>600,440=>600,441=>600,442=>600,443=>600,444=>600,445=>600, +446=>600,447=>600,448=>600,449=>600,450=>600,451=>600,452=>600,453=>600,454=>600,455=>600, +456=>600,457=>600,458=>600,459=>600,460=>600,461=>600,462=>600,463=>600,464=>600,465=>600, +466=>600,467=>600,468=>600,469=>600,470=>600,471=>600,472=>600,473=>600,474=>600,475=>600, +476=>600,477=>600,478=>600,479=>600,480=>600,481=>600,482=>600,483=>600,484=>600,485=>600, +486=>600,487=>600,488=>600,489=>600,490=>600,491=>600,492=>600,493=>600,494=>600,495=>600, +496=>600,497=>600,498=>600,499=>600,500=>600,501=>600,502=>600,503=>600,504=>600,505=>600, +506=>600,507=>600,508=>600,509=>600,510=>600,511=>600,512=>600,513=>600,514=>600,515=>600, +516=>600,517=>600,518=>600,519=>600,520=>600,521=>600,522=>600,523=>600,524=>600,525=>600, +526=>600,527=>600,528=>600,529=>600,530=>600,531=>600,532=>600,533=>600,534=>600,535=>600, +536=>600,537=>600,538=>600,539=>600,540=>600,541=>600,542=>600,543=>600,548=>600,549=>600, +550=>600,551=>600,552=>600,553=>600,554=>600,555=>600,556=>600,557=>600,558=>600,559=>600, +560=>600,561=>600,562=>600,563=>600,567=>600,592=>600,593=>600,594=>600,595=>600,596=>600, +597=>600,598=>600,599=>600,600=>600,601=>600,602=>600,603=>600,604=>600,605=>600,606=>600, +607=>600,608=>600,609=>600,610=>600,611=>600,612=>600,613=>600,614=>600,615=>600,616=>600, +617=>600,618=>600,619=>600,620=>600,621=>600,622=>600,623=>600,624=>600,625=>600,626=>600, +627=>600,628=>600,629=>600,630=>600,631=>600,632=>600,633=>600,634=>600,635=>600,636=>600, +637=>600,638=>600,639=>600,640=>600,641=>600,642=>600,643=>600,644=>600,645=>600,646=>600, +647=>600,648=>600,649=>600,650=>600,651=>600,652=>600,653=>600,654=>600,655=>600,656=>600, +657=>600,658=>600,659=>600,660=>600,661=>600,662=>600,663=>600,664=>600,665=>600,666=>600, +667=>600,668=>600,669=>600,670=>600,671=>600,672=>600,673=>600,674=>600,675=>600,676=>600, +677=>600,678=>600,679=>600,680=>600,681=>600,682=>600,683=>600,684=>600,685=>600,686=>600, +687=>600,688=>600,689=>600,690=>600,691=>600,692=>600,693=>600,694=>600,695=>600,696=>600, +697=>600,698=>600,699=>600,700=>600,701=>600,702=>600,703=>600,704=>600,705=>600,706=>600, +707=>600,708=>600,709=>600,711=>600,712=>600,713=>600,714=>600,715=>600,716=>600,717=>600, +718=>600,719=>600,720=>600,721=>600,722=>600,723=>600,724=>600,725=>600,726=>600,727=>600, +728=>600,729=>600,730=>600,731=>600,733=>600,734=>600,735=>600,736=>600,737=>600,738=>600, +739=>600,740=>600,741=>600,742=>600,743=>600,744=>600,745=>600,746=>600,747=>600,748=>600, +749=>600,750=>600,751=>600,752=>600,753=>600,754=>600,755=>600,756=>600,757=>600,758=>600, +759=>600,760=>600,761=>600,762=>600,763=>600,764=>600,765=>600,766=>600,767=>600,768=>0, +769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0, +779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0, +789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0, +799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0, +809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0, +819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0, +829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0, +839=>0,840=>0,841=>0,843=>0,844=>0,845=>0,848=>0,849=>0,850=>0,851=>0, +852=>0,853=>0,854=>0,855=>0,856=>0,857=>0,858=>0,884=>600,885=>600,890=>600, +894=>600,900=>600,901=>600,902=>600,903=>600,904=>600,905=>600,906=>600,908=>600,910=>600, +911=>600,912=>600,913=>600,914=>600,915=>600,916=>600,917=>600,918=>600,919=>600,920=>600, +921=>600,922=>600,923=>600,924=>600,925=>600,926=>600,927=>600,928=>600,929=>600,931=>600, +932=>600,933=>600,934=>600,935=>600,936=>600,937=>600,938=>600,939=>600,940=>600,941=>600, +942=>600,943=>600,944=>600,945=>600,946=>600,947=>600,948=>600,949=>600,950=>600,951=>600, +952=>600,953=>600,954=>600,955=>600,956=>600,957=>600,958=>600,959=>600,960=>600,961=>600, +962=>600,963=>600,964=>600,965=>600,966=>600,967=>600,968=>600,969=>600,970=>600,971=>600, +972=>600,973=>600,974=>600,976=>600,977=>600,978=>600,979=>600,980=>600,981=>600,982=>600, +986=>600,987=>600,988=>600,1008=>600,1009=>600,1012=>600,1013=>600,1024=>600,1025=>600,1026=>600, +1027=>600,1028=>600,1029=>600,1030=>600,1031=>600,1032=>600,1033=>600,1034=>600,1035=>600,1036=>600, +1037=>600,1038=>600,1039=>600,1040=>600,1041=>600,1042=>600,1043=>600,1044=>600,1045=>600,1046=>600, +1047=>600,1048=>600,1049=>600,1050=>600,1051=>600,1052=>600,1053=>600,1054=>600,1055=>600,1056=>600, +1057=>600,1058=>600,1059=>600,1060=>600,1061=>600,1062=>600,1063=>600,1064=>600,1065=>600,1066=>600, +1067=>600,1068=>600,1069=>600,1070=>600,1071=>600,1072=>600,1073=>600,1074=>600,1075=>600,1076=>600, +1077=>600,1078=>600,1079=>600,1080=>600,1081=>600,1082=>600,1083=>600,1084=>600,1085=>600,1086=>600, +1087=>600,1088=>600,1089=>600,1090=>600,1091=>600,1092=>600,1093=>600,1094=>600,1095=>600,1096=>600, +1097=>600,1098=>600,1099=>600,1100=>600,1101=>600,1102=>600,1103=>600,1104=>600,1105=>600,1106=>600, +1107=>600,1108=>600,1109=>600,1110=>600,1111=>600,1112=>600,1113=>600,1114=>600,1115=>600,1116=>600, +1117=>600,1118=>600,1119=>600,1120=>600,1121=>600,1122=>600,1123=>600,1124=>600,1126=>600,1127=>600, +1128=>600,1130=>600,1131=>600,1132=>600,1133=>600,1136=>600,1137=>600,1138=>600,1140=>600,1141=>600, +1142=>600,1143=>600,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1162=>600,1163=>600,1164=>600, +1165=>600,1166=>600,1167=>600,1168=>600,1169=>600,1170=>600,1171=>600,1172=>600,1173=>600,1174=>600, +1175=>600,1176=>600,1177=>600,1178=>600,1179=>600,1180=>600,1181=>600,1182=>600,1183=>600,1184=>600, +1185=>600,1186=>600,1187=>600,1188=>600,1189=>600,1190=>600,1191=>600,1192=>600,1193=>600,1194=>600, +1195=>600,1196=>600,1197=>600,1198=>600,1199=>600,1200=>600,1201=>600,1202=>600,1203=>600,1204=>600, +1205=>600,1206=>600,1207=>600,1208=>600,1209=>600,1210=>600,1211=>600,1212=>600,1213=>600,1214=>600, +1215=>600,1216=>600,1217=>600,1218=>600,1219=>600,1220=>600,1221=>600,1222=>600,1223=>600,1224=>600, +1225=>600,1226=>600,1227=>600,1228=>600,1229=>600,1230=>600,1231=>600,1232=>600,1233=>600,1234=>600, +1235=>600,1236=>600,1237=>600,1238=>600,1239=>600,1240=>600,1241=>600,1242=>600,1243=>600,1244=>600, +1245=>600,1246=>600,1247=>600,1248=>600,1249=>600,1250=>600,1251=>600,1252=>600,1253=>600,1254=>600, +1255=>600,1256=>600,1257=>600,1258=>600,1259=>600,1260=>600,1261=>600,1262=>600,1263=>600,1264=>600, +1265=>600,1266=>600,1267=>600,1268=>600,1269=>600,1270=>600,1271=>600,1272=>600,1273=>600,1296=>600, +1297=>600,1298=>600,1299=>600,1306=>600,1307=>600,1308=>600,1309=>600,1310=>600,1311=>600,1329=>600, +1330=>600,1331=>600,1332=>600,1333=>600,1334=>600,1335=>600,1336=>600,1337=>600,1338=>600,1339=>600, +1340=>600,1341=>600,1342=>600,1343=>600,1344=>600,1345=>600,1346=>600,1347=>600,1348=>600,1349=>600, +1350=>600,1351=>600,1352=>600,1353=>600,1354=>600,1355=>600,1356=>600,1357=>600,1358=>600,1359=>600, +1360=>600,1361=>600,1362=>600,1363=>600,1364=>600,1365=>600,1366=>600,1369=>600,1370=>600,1371=>600, +1372=>600,1373=>600,1374=>600,1375=>600,1377=>600,1378=>600,1379=>600,1380=>600,1381=>600,1382=>600, +1383=>600,1384=>600,1385=>600,1386=>600,1387=>600,1388=>600,1389=>600,1390=>600,1391=>600,1392=>600, +1393=>600,1394=>600,1395=>600,1396=>600,1397=>600,1398=>600,1399=>600,1400=>600,1401=>600,1402=>600, +1403=>600,1404=>600,1405=>600,1406=>600,1407=>600,1408=>600,1409=>600,1410=>600,1411=>600,1412=>600, +1413=>600,1414=>600,1415=>600,1417=>600,1418=>600,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0, +1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1467=>0,1468=>0,1469=>0,1470=>600,1471=>0, +1472=>600,1473=>0,1474=>0,1475=>600,1476=>0,1488=>600,1489=>600,1490=>600,1491=>600,1492=>600, +1493=>600,1494=>600,1495=>600,1496=>600,1497=>600,1498=>600,1499=>600,1500=>600,1501=>600,1502=>600, +1503=>600,1504=>600,1505=>600,1506=>600,1507=>600,1508=>600,1509=>600,1510=>600,1511=>600,1512=>600, +1513=>600,1514=>600,1520=>600,1521=>600,1522=>600,1523=>600,1524=>600,4304=>600,4305=>600,4306=>600, +4307=>600,4308=>600,4309=>600,4310=>600,4311=>600,4312=>600,4313=>600,4314=>600,4315=>600,4316=>600, +4317=>600,4318=>600,4319=>600,4320=>600,4321=>600,4322=>600,4323=>600,4324=>600,4325=>600,4326=>600, +4327=>600,4328=>600,4329=>600,4330=>600,4331=>600,4332=>600,4333=>600,4334=>600,4335=>600,4336=>600, +4337=>600,4338=>600,4339=>600,4340=>600,4341=>600,4345=>600,4347=>600,5792=>600,5793=>600,5794=>600, +5795=>600,5796=>600,5797=>600,5798=>600,5799=>600,5800=>600,5801=>600,5802=>600,5803=>600,5804=>600, +5805=>600,5806=>600,5807=>600,5808=>600,5809=>600,5810=>600,5811=>600,5812=>600,5813=>600,5814=>600, +5815=>600,5816=>600,5817=>600,5818=>600,5819=>600,5820=>600,5821=>600,5822=>600,5823=>600,5824=>600, +5825=>600,5826=>600,5827=>600,5828=>600,5829=>600,5830=>600,5831=>600,5832=>600,5833=>600,5834=>600, +5835=>600,5836=>600,5837=>600,5838=>600,5839=>600,5840=>600,5841=>600,5842=>600,5843=>600,5844=>600, +5845=>600,5846=>600,5847=>600,5848=>600,5849=>600,5850=>600,5851=>600,5852=>600,5853=>600,5854=>600, +5855=>600,5856=>600,5857=>600,5858=>600,5859=>600,5860=>600,5861=>600,5862=>600,5863=>600,5864=>600, +5865=>600,5866=>600,5867=>600,5868=>600,5869=>600,5870=>600,5871=>600,5872=>600,7680=>600,7681=>600, +7682=>600,7683=>600,7684=>600,7685=>600,7686=>600,7687=>600,7688=>600,7689=>600,7690=>600,7691=>600, +7692=>600,7693=>600,7694=>600,7695=>600,7696=>600,7697=>600,7698=>600,7699=>600,7700=>600,7701=>600, +7702=>600,7703=>600,7704=>600,7705=>600,7706=>600,7707=>600,7708=>600,7709=>600,7710=>600,7711=>600, +7712=>600,7713=>600,7714=>600,7715=>600,7716=>600,7717=>600,7718=>600,7719=>600,7720=>600,7721=>600, +7722=>600,7723=>600,7724=>600,7725=>600,7726=>600,7727=>600,7728=>600,7729=>600,7730=>600,7731=>600, +7732=>600,7733=>600,7734=>600,7735=>600,7736=>600,7737=>600,7738=>600,7739=>600,7740=>600,7741=>600, +7742=>600,7743=>600,7744=>600,7745=>600,7746=>600,7747=>600,7748=>600,7749=>600,7750=>600,7751=>600, +7752=>600,7753=>600,7754=>600,7755=>600,7756=>600,7757=>600,7758=>600,7759=>600,7760=>600,7761=>600, +7762=>600,7763=>600,7764=>600,7765=>600,7766=>600,7767=>600,7768=>600,7769=>600,7770=>600,7771=>600, +7772=>600,7773=>600,7774=>600,7775=>600,7776=>600,7777=>600,7778=>600,7779=>600,7780=>600,7781=>600, +7782=>600,7783=>600,7784=>600,7785=>600,7786=>600,7787=>600,7788=>600,7789=>600,7790=>600,7791=>600, +7792=>600,7793=>600,7794=>600,7795=>600,7796=>600,7797=>600,7798=>600,7799=>600,7800=>600,7801=>600, +7802=>600,7803=>600,7804=>600,7805=>600,7806=>600,7807=>600,7808=>600,7809=>600,7810=>600,7811=>600, +7812=>600,7813=>600,7814=>600,7815=>600,7816=>600,7817=>600,7818=>600,7819=>600,7820=>600,7821=>600, +7822=>600,7823=>600,7824=>600,7825=>600,7826=>600,7827=>600,7828=>600,7829=>600,7830=>600,7831=>600, +7832=>600,7833=>600,7834=>600,7835=>600,7840=>600,7841=>600,7842=>600,7843=>600,7844=>600,7845=>600, +7846=>600,7847=>600,7848=>600,7849=>600,7850=>600,7851=>600,7852=>600,7853=>600,7854=>600,7855=>600, +7856=>600,7857=>600,7858=>600,7859=>600,7860=>600,7861=>600,7862=>600,7863=>600,7864=>600,7865=>600, +7866=>600,7867=>600,7868=>600,7869=>600,7870=>600,7871=>600,7872=>600,7873=>600,7874=>600,7875=>600, +7876=>600,7877=>600,7878=>600,7879=>600,7880=>600,7881=>600,7882=>600,7883=>600,7884=>600,7885=>600, +7886=>600,7887=>600,7888=>600,7889=>600,7890=>600,7891=>600,7892=>600,7893=>600,7894=>600,7895=>600, +7896=>600,7897=>600,7898=>600,7899=>600,7900=>600,7901=>600,7902=>600,7903=>600,7904=>600,7905=>600, +7906=>600,7907=>600,7908=>600,7909=>600,7910=>600,7911=>600,7912=>600,7913=>600,7914=>600,7915=>600, +7916=>600,7917=>600,7918=>600,7919=>600,7920=>600,7921=>600,7922=>600,7923=>600,7924=>600,7925=>600, +7926=>600,7927=>600,7928=>600,7929=>600,7936=>600,7937=>600,7938=>600,7939=>600,7940=>600,7941=>600, +7942=>600,7943=>600,7944=>600,7945=>600,7946=>600,7947=>600,7948=>600,7949=>600,7950=>600,7951=>600, +7952=>600,7953=>600,7954=>600,7955=>600,7956=>600,7957=>600,7960=>600,7961=>600,7962=>600,7963=>600, +7964=>600,7965=>600,7968=>600,7969=>600,7970=>600,7971=>600,7972=>600,7973=>600,7974=>600,7975=>600, +7976=>600,7977=>600,7978=>600,7979=>600,7980=>600,7981=>600,7982=>600,7983=>600,7984=>600,7985=>600, +7986=>600,7987=>600,7988=>600,7989=>600,7990=>600,7991=>600,7992=>600,7993=>600,7994=>600,7995=>600, +7996=>600,7997=>600,7998=>600,7999=>600,8000=>600,8001=>600,8002=>600,8003=>600,8004=>600,8005=>600, +8008=>600,8009=>600,8010=>600,8011=>600,8012=>600,8013=>600,8016=>600,8017=>600,8018=>600,8019=>600, +8020=>600,8021=>600,8022=>600,8023=>600,8025=>600,8027=>600,8029=>600,8031=>600,8032=>600,8033=>600, +8034=>600,8035=>600,8036=>600,8037=>600,8038=>600,8039=>600,8040=>600,8041=>600,8042=>600,8043=>600, +8044=>600,8045=>600,8046=>600,8047=>600,8048=>600,8049=>600,8050=>600,8051=>600,8052=>600,8053=>600, +8054=>600,8055=>600,8056=>600,8057=>600,8058=>600,8059=>600,8060=>600,8061=>600,8064=>600,8065=>600, +8066=>600,8067=>600,8068=>600,8069=>600,8070=>600,8071=>600,8072=>600,8073=>600,8074=>600,8075=>600, +8076=>600,8077=>600,8078=>600,8079=>600,8080=>600,8081=>600,8082=>600,8083=>600,8084=>600,8085=>600, +8086=>600,8087=>600,8088=>600,8089=>600,8090=>600,8091=>600,8092=>600,8093=>600,8094=>600,8095=>600, +8096=>600,8097=>600,8098=>600,8099=>600,8100=>600,8101=>600,8102=>600,8103=>600,8104=>600,8105=>600, +8106=>600,8107=>600,8108=>600,8109=>600,8110=>600,8111=>600,8112=>600,8113=>600,8114=>600,8115=>600, +8116=>600,8118=>600,8119=>600,8120=>600,8121=>600,8122=>600,8123=>600,8124=>600,8125=>600,8126=>600, +8127=>600,8128=>600,8129=>600,8130=>600,8131=>600,8132=>600,8134=>600,8135=>600,8136=>600,8137=>600, +8138=>600,8139=>600,8140=>600,8141=>600,8142=>600,8143=>600,8144=>600,8145=>600,8146=>600,8147=>600, +8150=>600,8151=>600,8152=>600,8153=>600,8154=>600,8155=>600,8157=>600,8158=>600,8159=>600,8160=>600, +8161=>600,8162=>600,8163=>600,8164=>600,8165=>600,8166=>600,8167=>600,8168=>600,8169=>600,8170=>600, +8171=>600,8172=>600,8173=>600,8174=>600,8175=>600,8178=>600,8179=>600,8180=>600,8182=>600,8183=>600, +8184=>600,8185=>600,8186=>600,8187=>600,8188=>600,8189=>600,8190=>600,8192=>600,8193=>600,8194=>600, +8195=>600,8196=>600,8197=>600,8198=>600,8199=>600,8200=>600,8201=>600,8202=>600,8203=>600,8204=>0, +8205=>0,8206=>0,8207=>0,8208=>600,8209=>600,8210=>600,8213=>600,8214=>600,8215=>600,8219=>600, +8223=>600,8227=>600,8228=>600,8229=>600,8231=>600,8232=>600,8233=>600,8234=>600,8235=>600,8236=>600, +8237=>600,8238=>600,8239=>600,8241=>600,8242=>600,8243=>600,8244=>600,8245=>600,8246=>600,8247=>600, +8248=>600,8251=>600,8252=>600,8253=>600,8254=>600,8255=>600,8256=>600,8257=>600,8258=>600,8259=>600, +8260=>600,8261=>600,8262=>600,8263=>600,8264=>600,8265=>600,8266=>600,8267=>600,8268=>600,8269=>600, +8270=>600,8271=>600,8272=>600,8273=>600,8274=>600,8275=>600,8276=>600,8277=>600,8278=>600,8279=>600, +8280=>600,8281=>600,8282=>600,8283=>600,8284=>600,8285=>600,8286=>600,8287=>600,8288=>600,8289=>600, +8290=>600,8291=>600,8292=>600,8298=>600,8299=>600,8300=>600,8301=>600,8302=>600,8303=>600,8304=>600, +8305=>600,8308=>600,8309=>600,8310=>600,8311=>600,8312=>600,8313=>600,8314=>600,8315=>600,8316=>600, +8317=>600,8318=>600,8319=>600,8320=>600,8321=>600,8322=>600,8323=>600,8324=>600,8325=>600,8326=>600, +8327=>600,8328=>600,8329=>600,8330=>600,8331=>600,8332=>600,8333=>600,8334=>600,8336=>600,8337=>600, +8338=>600,8339=>600,8340=>600,8353=>600,8354=>600,8355=>600,8356=>600,8357=>600,8358=>600,8359=>600, +8360=>600,8361=>600,8362=>600,8363=>600,8365=>600,8366=>600,8368=>600,8369=>600,8370=>600,8371=>600, +8372=>600,8373=>600,8400=>0,8401=>0,8402=>0,8406=>0,8407=>0,8411=>0,8412=>0,8413=>0, +8414=>0,8415=>0,8416=>0,8417=>0,8418=>0,8419=>0,8428=>0,8429=>0,8430=>0,8431=>0, +8448=>600,8449=>600,8450=>600,8451=>600,8453=>600,8454=>600,8455=>600,8457=>600,8461=>600,8463=>600, +8464=>600,8465=>600,8466=>600,8467=>600,8468=>600,8469=>600,8470=>600,8471=>600,8472=>600,8473=>600, +8474=>600,8476=>600,8477=>600,8478=>600,8481=>600,8484=>600,8486=>600,8487=>600,8489=>600,8490=>600, +8491=>600,8498=>600,8501=>600,8502=>600,8503=>600,8504=>600,8505=>600,8506=>600,8507=>600,8523=>600, +8526=>600,8531=>600,8532=>600,8533=>600,8534=>600,8535=>600,8536=>600,8537=>600,8538=>600,8539=>600, +8540=>600,8541=>600,8542=>600,8543=>600,8544=>600,8545=>600,8546=>600,8547=>600,8548=>600,8549=>600, +8550=>600,8551=>600,8552=>600,8553=>600,8554=>600,8555=>600,8556=>600,8557=>600,8558=>600,8559=>600, +8560=>600,8561=>600,8562=>600,8563=>600,8564=>600,8565=>600,8566=>600,8567=>600,8568=>600,8569=>600, +8570=>600,8571=>600,8572=>600,8573=>600,8574=>600,8575=>600,8592=>600,8593=>600,8594=>600,8595=>600, +8596=>600,8597=>600,8598=>600,8599=>600,8600=>600,8601=>600,8602=>600,8603=>600,8604=>600,8605=>600, +8606=>600,8607=>600,8608=>600,8609=>600,8610=>600,8611=>600,8612=>600,8613=>600,8614=>600,8615=>600, +8616=>600,8617=>600,8618=>600,8619=>600,8620=>600,8621=>600,8622=>600,8623=>600,8624=>600,8625=>600, +8626=>600,8627=>600,8628=>600,8629=>600,8630=>600,8631=>600,8632=>600,8633=>600,8634=>600,8635=>600, +8636=>600,8637=>600,8638=>600,8639=>600,8640=>600,8641=>600,8642=>600,8643=>600,8644=>600,8645=>600, +8646=>600,8647=>600,8648=>600,8649=>600,8650=>600,8651=>600,8652=>600,8653=>600,8654=>600,8655=>600, +8656=>600,8657=>600,8658=>600,8659=>600,8660=>600,8661=>600,8669=>600,8678=>600,8679=>600,8680=>600, +8681=>600,8691=>600,8704=>600,8705=>600,8706=>600,8707=>600,8708=>600,8709=>600,8710=>600,8711=>600, +8712=>600,8713=>600,8714=>600,8715=>600,8716=>600,8717=>600,8718=>600,8719=>600,8720=>600,8721=>600, +8722=>600,8723=>600,8724=>600,8725=>600,8726=>600,8727=>600,8728=>600,8729=>600,8730=>600,8731=>600, +8732=>600,8733=>600,8734=>600,8735=>600,8736=>600,8737=>600,8738=>600,8739=>600,8740=>600,8741=>600, +8742=>600,8743=>600,8744=>600,8745=>600,8746=>600,8747=>600,8748=>600,8749=>600,8750=>600,8751=>600, +8752=>600,8754=>600,8755=>600,8756=>600,8757=>600,8758=>600,8759=>600,8760=>600,8761=>600,8762=>600, +8763=>600,8764=>600,8765=>600,8768=>600,8769=>600,8770=>600,8771=>600,8772=>600,8773=>600,8774=>600, +8775=>600,8776=>600,8777=>600,8778=>600,8779=>600,8780=>600,8781=>600,8784=>600,8785=>600,8786=>600, +8787=>600,8788=>600,8789=>600,8790=>600,8791=>600,8792=>600,8793=>600,8794=>600,8795=>600,8796=>600, +8797=>600,8798=>600,8799=>600,8800=>600,8801=>600,8802=>600,8803=>600,8804=>600,8805=>600,8806=>600, +8807=>600,8808=>600,8809=>600,8810=>600,8811=>600,8812=>600,8813=>600,8814=>600,8815=>600,8816=>600, +8817=>600,8818=>600,8819=>600,8820=>600,8821=>600,8822=>600,8823=>600,8824=>600,8825=>600,8826=>600, +8827=>600,8828=>600,8829=>600,8830=>600,8831=>600,8832=>600,8833=>600,8834=>600,8835=>600,8836=>600, +8837=>600,8838=>600,8839=>600,8840=>600,8841=>600,8842=>600,8843=>600,8844=>600,8845=>600,8846=>600, +8847=>600,8848=>600,8849=>600,8850=>600,8851=>600,8852=>600,8853=>600,8854=>600,8855=>600,8856=>600, +8857=>600,8858=>600,8859=>600,8860=>600,8861=>600,8862=>600,8863=>600,8866=>600,8867=>600,8868=>600, +8869=>600,8870=>600,8871=>600,8872=>600,8873=>600,8874=>600,8875=>600,8876=>600,8877=>600,8878=>600, +8879=>600,8882=>600,8883=>600,8884=>600,8885=>600,8891=>600,8892=>600,8893=>600,8894=>600,8896=>600, +8897=>600,8898=>600,8899=>600,8900=>600,8901=>600,8902=>600,8903=>600,8904=>600,8909=>600,8910=>600, +8911=>600,8912=>600,8913=>600,8914=>600,8915=>600,8924=>600,8925=>600,8926=>600,8927=>600,8928=>600, +8929=>600,8930=>600,8931=>600,8938=>600,8939=>600,8940=>600,8941=>600,8942=>600,8943=>600,8944=>600, +8945=>600,8960=>600,8962=>600,8963=>600,8964=>600,8965=>600,8966=>600,8968=>600,8969=>600,8970=>600, +8971=>600,8972=>600,8973=>600,8974=>600,8975=>600,8976=>600,8978=>600,8980=>600,8981=>600,8984=>600, +8985=>600,8988=>600,8989=>600,8990=>600,8991=>600,8992=>600,8993=>600,8994=>600,8995=>600,8996=>600, +8997=>600,8998=>600,8999=>600,9001=>600,9002=>600,9003=>600,9004=>600,9014=>600,9015=>600,9016=>600, +9017=>600,9018=>600,9019=>600,9020=>600,9021=>600,9022=>600,9023=>600,9024=>600,9025=>600,9026=>600, +9027=>600,9028=>600,9029=>600,9030=>600,9031=>600,9032=>600,9033=>600,9034=>600,9035=>600,9036=>600, +9037=>600,9038=>600,9039=>600,9040=>600,9041=>600,9042=>600,9043=>600,9044=>600,9045=>600,9046=>600, +9047=>600,9048=>600,9049=>600,9050=>600,9051=>600,9052=>600,9053=>600,9054=>600,9055=>600,9056=>600, +9057=>600,9058=>600,9059=>600,9060=>600,9061=>600,9062=>600,9063=>600,9064=>600,9065=>600,9066=>600, +9067=>600,9068=>600,9069=>600,9070=>600,9071=>600,9072=>600,9073=>600,9074=>600,9075=>600,9076=>600, +9077=>600,9078=>600,9079=>600,9080=>600,9081=>600,9082=>600,9084=>600,9085=>600,9086=>600,9087=>600, +9088=>600,9089=>600,9090=>600,9091=>600,9092=>600,9093=>600,9094=>600,9095=>600,9096=>600,9097=>600, +9098=>600,9099=>600,9100=>600,9101=>600,9102=>600,9103=>600,9104=>600,9105=>600,9106=>600,9107=>600, +9108=>600,9109=>600,9110=>600,9111=>600,9112=>600,9113=>600,9114=>600,9115=>600,9116=>600,9117=>600, +9118=>600,9119=>600,9120=>600,9121=>600,9122=>600,9123=>600,9124=>600,9125=>600,9126=>600,9127=>600, +9128=>600,9129=>600,9130=>600,9131=>600,9132=>600,9133=>600,9134=>600,9135=>600,9136=>600,9137=>600, +9138=>600,9139=>600,9140=>600,9141=>600,9142=>600,9143=>600,9146=>600,9147=>600,9148=>600,9149=>600, +9150=>600,9151=>600,9152=>600,9153=>600,9154=>600,9155=>600,9156=>600,9157=>600,9158=>600,9159=>600, +9160=>600,9161=>600,9162=>600,9163=>600,9164=>600,9165=>600,9166=>600,9167=>600,9178=>600,9179=>600, +9182=>600,9183=>600,9186=>600,9187=>600,9188=>600,9189=>600,9190=>600,9251=>600,9280=>600,9281=>600, +9282=>600,9283=>600,9284=>600,9285=>600,9286=>600,9287=>600,9288=>600,9289=>600,9290=>600,9312=>600, +9313=>600,9314=>600,9315=>600,9316=>600,9317=>600,9318=>600,9319=>600,9320=>600,9321=>600,9472=>600, +9473=>600,9474=>600,9475=>600,9476=>600,9477=>600,9478=>600,9479=>600,9480=>600,9481=>600,9482=>600, +9483=>600,9484=>600,9485=>600,9486=>600,9487=>600,9488=>600,9489=>600,9490=>600,9491=>600,9492=>600, +9493=>600,9494=>600,9495=>600,9496=>600,9497=>600,9498=>600,9499=>600,9500=>600,9501=>600,9502=>600, +9503=>600,9504=>600,9505=>600,9506=>600,9507=>600,9508=>600,9509=>600,9510=>600,9511=>600,9512=>600, +9513=>600,9514=>600,9515=>600,9516=>600,9517=>600,9518=>600,9519=>600,9520=>600,9521=>600,9522=>600, +9523=>600,9524=>600,9525=>600,9526=>600,9527=>600,9528=>600,9529=>600,9530=>600,9531=>600,9532=>600, +9533=>600,9534=>600,9535=>600,9536=>600,9537=>600,9538=>600,9539=>600,9540=>600,9541=>600,9542=>600, +9543=>600,9544=>600,9545=>600,9546=>600,9547=>600,9548=>600,9549=>600,9550=>600,9551=>600,9552=>600, +9553=>600,9554=>600,9555=>600,9556=>600,9557=>600,9558=>600,9559=>600,9560=>600,9561=>600,9562=>600, +9563=>600,9564=>600,9565=>600,9566=>600,9567=>600,9568=>600,9569=>600,9570=>600,9571=>600,9572=>600, +9573=>600,9574=>600,9575=>600,9576=>600,9577=>600,9578=>600,9579=>600,9580=>600,9581=>600,9582=>600, +9583=>600,9584=>600,9585=>600,9586=>600,9587=>600,9588=>600,9589=>600,9590=>600,9591=>600,9592=>600, +9593=>600,9594=>600,9595=>600,9596=>600,9597=>600,9598=>600,9599=>600,9600=>600,9601=>600,9602=>600, +9603=>600,9604=>600,9605=>600,9606=>600,9607=>600,9608=>600,9609=>600,9610=>600,9611=>600,9612=>600, +9613=>600,9614=>600,9615=>600,9616=>600,9617=>600,9618=>600,9619=>600,9620=>600,9621=>600,9622=>600, +9623=>600,9624=>600,9625=>600,9626=>600,9627=>600,9628=>600,9629=>600,9630=>600,9631=>600,9632=>600, +9633=>600,9634=>600,9635=>600,9636=>600,9637=>600,9638=>600,9639=>600,9640=>600,9641=>600,9642=>600, +9643=>600,9644=>600,9645=>600,9646=>600,9647=>600,9648=>600,9649=>600,9650=>600,9651=>600,9652=>600, +9653=>600,9654=>600,9655=>600,9656=>600,9657=>600,9658=>600,9659=>600,9660=>600,9661=>600,9662=>600, +9663=>600,9664=>600,9665=>600,9666=>600,9667=>600,9668=>600,9669=>600,9670=>600,9671=>600,9672=>600, +9673=>600,9674=>600,9675=>600,9676=>600,9677=>600,9678=>600,9679=>600,9680=>600,9681=>600,9682=>600, +9683=>600,9684=>600,9685=>600,9686=>600,9687=>600,9688=>600,9689=>600,9690=>600,9691=>600,9692=>600, +9693=>600,9694=>600,9695=>600,9696=>600,9697=>600,9698=>600,9699=>600,9700=>600,9701=>600,9702=>600, +9703=>600,9704=>600,9705=>600,9706=>600,9707=>600,9708=>600,9709=>600,9710=>600,9711=>600,9712=>600, +9713=>600,9714=>600,9715=>600,9716=>600,9717=>600,9718=>600,9719=>600,9720=>600,9721=>600,9722=>600, +9723=>600,9724=>600,9725=>600,9726=>600,9727=>600,9728=>600,9729=>600,9730=>600,9731=>600,9733=>600, +9734=>600,9735=>600,9736=>600,9737=>600,9744=>600,9745=>600,9746=>600,9754=>600,9755=>600,9756=>600, +9757=>600,9758=>600,9759=>600,9766=>600,9768=>600,9769=>600,9774=>600,9775=>600,9776=>600,9777=>600, +9778=>600,9779=>600,9780=>600,9781=>600,9782=>600,9783=>600,9785=>600,9786=>600,9787=>600,9788=>600, +9789=>600,9790=>600,9791=>600,9792=>600,9793=>600,9794=>600,9795=>600,9796=>600,9797=>600,9798=>600, +9799=>600,9800=>600,9801=>600,9802=>600,9803=>600,9804=>600,9805=>600,9806=>600,9807=>600,9808=>600, +9809=>600,9810=>600,9811=>600,9824=>600,9825=>600,9826=>600,9827=>600,9828=>600,9829=>600,9830=>600, +9831=>600,9833=>600,9834=>600,9835=>600,9836=>600,9837=>600,9838=>600,9839=>600,9856=>600,9857=>600, +9858=>600,9859=>600,9860=>600,9861=>600,10176=>600,10177=>600,10178=>600,10179=>600,10180=>600,10181=>600, +10182=>600,10183=>600,10184=>600,10185=>600,10186=>600,10188=>600,10192=>600,10193=>600,10194=>600,10195=>600, +10196=>600,10197=>600,10198=>600,10199=>600,10212=>600,10213=>600,10214=>600,10215=>600,10216=>600,10217=>600, +10218=>600,10219=>600,10226=>600,10227=>600,10229=>600,10230=>600,10231=>600,10232=>600,10233=>600,10234=>600, +10235=>600,10236=>600,10240=>600,10241=>600,10242=>600,10243=>600,10244=>600,10245=>600,10246=>600,10247=>600, +10248=>600,10249=>600,10250=>600,10251=>600,10252=>600,10253=>600,10254=>600,10255=>600,10256=>600,10257=>600, +10258=>600,10259=>600,10260=>600,10261=>600,10262=>600,10263=>600,10264=>600,10265=>600,10266=>600,10267=>600, +10268=>600,10269=>600,10270=>600,10271=>600,10272=>600,10273=>600,10274=>600,10275=>600,10276=>600,10277=>600, +10278=>600,10279=>600,10280=>600,10281=>600,10282=>600,10283=>600,10284=>600,10285=>600,10286=>600,10287=>600, +10288=>600,10289=>600,10290=>600,10291=>600,10292=>600,10293=>600,10294=>600,10295=>600,10296=>600,10297=>600, +10298=>600,10299=>600,10300=>600,10301=>600,10302=>600,10303=>600,10304=>600,10305=>600,10306=>600,10307=>600, +10308=>600,10309=>600,10310=>600,10311=>600,10312=>600,10313=>600,10314=>600,10315=>600,10316=>600,10317=>600, +10318=>600,10319=>600,10320=>600,10321=>600,10322=>600,10323=>600,10324=>600,10325=>600,10326=>600,10327=>600, +10328=>600,10329=>600,10330=>600,10331=>600,10332=>600,10333=>600,10334=>600,10335=>600,10336=>600,10337=>600, +10338=>600,10339=>600,10340=>600,10341=>600,10342=>600,10343=>600,10344=>600,10345=>600,10346=>600,10347=>600, +10348=>600,10349=>600,10350=>600,10351=>600,10352=>600,10353=>600,10354=>600,10355=>600,10356=>600,10357=>600, +10358=>600,10359=>600,10360=>600,10361=>600,10362=>600,10363=>600,10364=>600,10365=>600,10366=>600,10367=>600, +10368=>600,10369=>600,10370=>600,10371=>600,10372=>600,10373=>600,10374=>600,10375=>600,10376=>600,10377=>600, +10378=>600,10379=>600,10380=>600,10381=>600,10382=>600,10383=>600,10384=>600,10385=>600,10386=>600,10387=>600, +10388=>600,10389=>600,10390=>600,10391=>600,10392=>600,10393=>600,10394=>600,10395=>600,10396=>600,10397=>600, +10398=>600,10399=>600,10400=>600,10401=>600,10402=>600,10403=>600,10404=>600,10405=>600,10406=>600,10407=>600, +10408=>600,10409=>600,10410=>600,10411=>600,10412=>600,10413=>600,10414=>600,10415=>600,10416=>600,10417=>600, +10418=>600,10419=>600,10420=>600,10421=>600,10422=>600,10423=>600,10424=>600,10425=>600,10426=>600,10427=>600, +10428=>600,10429=>600,10430=>600,10431=>600,10432=>600,10433=>600,10434=>600,10435=>600,10436=>600,10437=>600, +10438=>600,10439=>600,10440=>600,10441=>600,10442=>600,10443=>600,10444=>600,10445=>600,10446=>600,10447=>600, +10448=>600,10449=>600,10450=>600,10451=>600,10452=>600,10453=>600,10454=>600,10455=>600,10456=>600,10457=>600, +10458=>600,10459=>600,10460=>600,10461=>600,10462=>600,10463=>600,10464=>600,10465=>600,10466=>600,10467=>600, +10468=>600,10469=>600,10470=>600,10471=>600,10472=>600,10473=>600,10474=>600,10475=>600,10476=>600,10477=>600, +10478=>600,10479=>600,10480=>600,10481=>600,10482=>600,10483=>600,10484=>600,10485=>600,10486=>600,10487=>600, +10488=>600,10489=>600,10490=>600,10491=>600,10492=>600,10493=>600,10494=>600,10495=>600,10752=>600,10753=>600, +10754=>600,10755=>600,10756=>600,10757=>600,10758=>600,10781=>600,10815=>600,11008=>600,11009=>600,11010=>600, +11011=>600,11012=>600,11013=>600,11014=>600,11015=>600,11016=>600,11017=>600,11018=>600,11019=>600,11020=>600, +11021=>600,11026=>600,11027=>600,11028=>600,11029=>600,11030=>600,11031=>600,11032=>600,11033=>600,11035=>600, +11036=>600,11037=>600,11038=>600,11039=>600,11040=>600,11041=>600,11042=>600,11043=>600,11044=>600,11045=>600, +11046=>600,11047=>600,11048=>600,11049=>600,11050=>600,11051=>600,11091=>600,11092=>600,64256=>600,64257=>600, +64258=>600,64259=>600,64260=>600,64261=>600,64285=>600,64286=>600,64287=>600,64288=>600,64289=>600,64290=>600, +64291=>600,64292=>600,64293=>600,64294=>600,64295=>600,64296=>600,64297=>600,64298=>600,64299=>600,64300=>600, +64301=>600,64302=>600,64303=>600,64304=>600,64305=>600,64306=>600,64307=>600,64308=>600,64309=>600,64310=>600, +64312=>600,64313=>600,64314=>600,64315=>600,64316=>600,64318=>600,64320=>600,64321=>600,64323=>600,64324=>600, +64326=>600,64327=>600,64328=>600,64329=>600,64330=>600,64331=>600,64332=>600,64333=>600,64334=>600,64335=>600, +65533=>600); +$enc=''; +$diff=''; +$file='freemono.z'; +$ctg='freemono.ctg.z'; +$originalsize=314348; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freemono.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemono.z new file mode 100644 index 0000000..0353139 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemono.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonob.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonob.ctg.z new file mode 100644 index 0000000..40443bb Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonob.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonob.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonob.php new file mode 100644 index 0000000..3d4cfe4 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonob.php @@ -0,0 +1,204 @@ +<?php +$type='TrueTypeUnicode'; +$name='FreeMonoBold'; +$desc=array('Ascent'=>800,'Descent'=>-200,'CapHeight'=>10,'Flags'=>32,'FontBBox'=>'[-604 -200 754 800]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>600); +$up=-125; +$ut=50; +$dw=600; +$cw=array( +32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600,40=>600,41=>600, +42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600,50=>600,51=>600, +52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600,60=>600,61=>600, +62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600,70=>600,71=>600, +72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600,80=>600,81=>600, +82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600,90=>600,91=>600, +92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600,100=>600,101=>600, +102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600,109=>600,110=>600,111=>600, +112=>600,113=>600,114=>600,115=>600,116=>600,117=>600,118=>600,119=>600,120=>600,121=>600, +122=>600,123=>600,124=>600,125=>600,126=>600,8364=>600,8218=>600,402=>600,8222=>600,8230=>600, +8224=>600,8225=>600,710=>600,8240=>600,352=>600,8249=>600,338=>600,381=>600,8216=>600,8217=>600, +8220=>600,8221=>600,8226=>600,8211=>600,8212=>600,732=>600,8482=>600,353=>600,8250=>600,339=>600, +382=>600,376=>600,160=>600,161=>600,162=>600,163=>600,164=>600,165=>600,166=>600,167=>600, +168=>600,169=>600,170=>600,171=>600,172=>600,173=>600,174=>600,175=>600,176=>600,177=>600, +178=>600,179=>600,180=>600,181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600, +188=>600,189=>600,190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600, +198=>600,199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600, +208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600,217=>600, +218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600,226=>600,227=>600, +228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600,235=>600,236=>600,237=>600, +238=>600,239=>600,240=>600,241=>600,242=>600,243=>600,244=>600,245=>600,246=>600,247=>600, +248=>600,249=>600,250=>600,251=>600,252=>600,253=>600,254=>600,255=>600,256=>600,257=>600, +258=>600,259=>600,260=>600,261=>600,262=>600,263=>600,264=>600,265=>600,266=>600,267=>600, +268=>600,269=>600,270=>600,271=>600,272=>600,273=>600,274=>600,275=>600,276=>600,277=>600, +278=>600,279=>600,280=>600,281=>600,282=>600,283=>600,284=>600,285=>600,286=>600,287=>600, +288=>600,289=>600,290=>600,291=>600,292=>600,293=>600,294=>600,295=>600,296=>600,297=>600, +298=>600,299=>600,300=>600,301=>600,302=>600,303=>600,304=>600,305=>600,306=>600,307=>600, +308=>600,309=>600,310=>600,311=>600,312=>600,313=>600,314=>600,315=>600,316=>600,317=>600, +318=>600,319=>600,320=>600,321=>600,322=>600,323=>600,324=>600,325=>600,326=>600,327=>600, +328=>600,329=>600,330=>600,331=>600,332=>600,333=>600,334=>600,335=>600,336=>600,337=>600, +340=>600,341=>600,342=>600,343=>600,344=>600,345=>600,346=>600,347=>600,348=>600,349=>600, +350=>600,351=>600,354=>600,355=>600,356=>600,357=>600,358=>600,359=>600,360=>600,361=>600, +362=>600,363=>600,364=>600,365=>600,366=>600,367=>600,368=>600,369=>600,370=>600,371=>600, +372=>600,373=>600,374=>600,375=>600,377=>600,378=>600,379=>600,380=>600,383=>600,384=>600, +385=>600,386=>600,387=>600,388=>600,389=>600,390=>600,391=>600,392=>600,393=>600,394=>600, +395=>600,396=>600,397=>600,398=>600,399=>600,400=>600,401=>600,403=>600,404=>600,405=>600, +406=>600,407=>600,408=>600,409=>600,410=>600,411=>600,412=>600,413=>600,414=>600,415=>600, +416=>600,417=>600,418=>600,419=>600,420=>600,421=>600,422=>600,423=>600,424=>600,425=>600, +426=>600,427=>600,428=>600,429=>600,430=>600,431=>600,432=>600,433=>600,434=>600,435=>600, +436=>600,437=>600,438=>600,439=>600,440=>600,441=>600,442=>600,443=>600,444=>600,445=>600, +446=>600,447=>600,448=>600,449=>600,450=>600,451=>600,452=>600,453=>600,454=>600,455=>600, +456=>600,457=>600,458=>600,459=>600,460=>600,461=>600,462=>600,463=>600,464=>600,465=>600, +466=>600,467=>600,468=>600,469=>600,470=>600,471=>600,472=>600,473=>600,474=>600,475=>600, +476=>600,477=>600,478=>600,479=>600,480=>600,481=>600,482=>600,483=>600,484=>600,485=>600, +486=>600,487=>600,488=>600,489=>600,490=>600,491=>600,492=>600,493=>600,494=>600,495=>600, +496=>600,497=>600,498=>600,499=>600,500=>600,501=>600,502=>600,503=>600,504=>600,505=>600, +506=>600,507=>600,508=>600,509=>600,510=>600,511=>600,512=>600,513=>600,514=>600,515=>600, +516=>600,517=>600,518=>600,519=>600,520=>600,521=>600,522=>600,523=>600,524=>600,525=>600, +526=>600,527=>600,528=>600,529=>600,530=>600,531=>600,532=>600,533=>600,534=>600,535=>600, +536=>600,537=>600,538=>600,539=>600,540=>600,541=>600,542=>600,543=>600,548=>600,549=>600, +550=>600,551=>600,552=>600,553=>600,554=>600,555=>600,556=>600,557=>600,558=>600,559=>600, +560=>600,561=>600,562=>600,563=>600,567=>600,592=>600,593=>600,594=>600,595=>600,596=>600, +598=>600,599=>600,600=>600,601=>600,603=>600,604=>600,607=>600,608=>600,609=>600,613=>600, +614=>600,615=>600,616=>600,617=>600,618=>600,619=>600,621=>600,623=>600,624=>600,625=>600, +626=>600,627=>600,628=>600,629=>600,633=>600,634=>600,635=>600,636=>600,637=>600,638=>600, +639=>600,640=>600,641=>600,642=>600,643=>600,644=>600,645=>600,647=>600,648=>600,649=>600, +652=>600,653=>600,654=>600,656=>600,657=>600,658=>600,659=>600,660=>600,661=>600,662=>600, +663=>600,664=>600,665=>600,666=>600,667=>600,668=>600,669=>600,670=>600,671=>600,672=>600, +673=>600,674=>600,688=>600,689=>600,690=>600,691=>600,692=>600,693=>600,694=>600,695=>600, +696=>600,697=>600,698=>600,699=>600,700=>600,701=>600,702=>600,703=>600,704=>600,705=>600, +706=>600,707=>600,708=>600,709=>600,711=>600,712=>600,713=>600,714=>600,715=>600,716=>600, +717=>600,718=>600,719=>600,720=>600,721=>600,722=>600,723=>600,724=>600,725=>600,726=>600, +727=>600,728=>600,729=>600,730=>600,731=>600,733=>600,734=>600,735=>600,736=>600,737=>600, +738=>600,739=>600,740=>600,741=>600,742=>600,743=>600,744=>600,745=>600,746=>600,747=>600, +748=>600,749=>600,750=>600,751=>600,752=>600,753=>600,754=>600,755=>600,756=>600,757=>600, +758=>600,759=>600,760=>600,761=>600,762=>600,763=>600,764=>600,765=>600,766=>600,767=>600, +768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0, +778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0, +788=>0,789=>0,790=>0,791=>0,795=>0,796=>0,800=>0,801=>0,802=>0,803=>0, +804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,812=>0,813=>0,814=>0, +815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,826=>0, +827=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,838=>0,839=>0,840=>0, +844=>0,849=>0,850=>0,851=>0,852=>0,853=>0,854=>0,855=>0,884=>600,885=>600, +890=>600,894=>600,900=>600,901=>600,902=>600,903=>600,904=>600,905=>600,906=>600,908=>600, +910=>600,911=>600,912=>600,913=>600,914=>600,915=>600,916=>600,917=>600,918=>600,919=>600, +920=>600,921=>600,922=>600,923=>600,924=>600,925=>600,926=>600,927=>600,928=>600,929=>600, +931=>600,932=>600,933=>600,934=>600,935=>600,936=>600,937=>600,938=>600,939=>600,940=>600, +941=>600,942=>600,943=>600,944=>600,945=>600,946=>600,947=>600,948=>600,949=>600,950=>600, +951=>600,952=>600,953=>600,954=>600,955=>600,956=>600,957=>600,958=>600,959=>600,960=>600, +961=>600,962=>600,963=>600,964=>600,965=>600,966=>600,967=>600,968=>600,969=>600,970=>600, +971=>600,972=>600,973=>600,974=>600,976=>600,977=>600,978=>600,979=>600,980=>600,981=>600, +982=>600,986=>600,987=>600,988=>600,1008=>600,1009=>600,1012=>600,1013=>600,1024=>600,1025=>600, +1026=>600,1027=>600,1028=>600,1029=>600,1030=>600,1031=>600,1032=>600,1033=>600,1034=>600,1035=>600, +1036=>600,1037=>600,1038=>600,1039=>600,1040=>600,1041=>600,1042=>600,1043=>600,1044=>600,1045=>600, +1046=>600,1047=>600,1048=>600,1049=>600,1050=>600,1051=>600,1052=>600,1053=>600,1054=>600,1055=>600, +1056=>600,1057=>600,1058=>600,1059=>600,1060=>600,1061=>600,1062=>600,1063=>600,1064=>600,1065=>600, +1066=>600,1067=>600,1068=>600,1069=>600,1070=>600,1071=>600,1072=>600,1073=>600,1074=>600,1075=>600, +1076=>600,1077=>600,1078=>600,1079=>600,1080=>600,1081=>600,1082=>600,1083=>600,1084=>600,1085=>600, +1086=>600,1087=>600,1088=>600,1089=>600,1090=>600,1091=>600,1092=>600,1093=>600,1094=>600,1095=>600, +1096=>600,1097=>600,1098=>600,1099=>600,1100=>600,1101=>600,1102=>600,1103=>600,1104=>600,1105=>600, +1106=>600,1107=>600,1108=>600,1109=>600,1110=>600,1111=>600,1112=>600,1113=>600,1114=>600,1115=>600, +1116=>600,1117=>600,1118=>600,1119=>600,1136=>600,1137=>600,1138=>600,1156=>0,1157=>0,1158=>0, +1162=>600,1163=>600,1164=>600,1165=>600,1166=>600,1167=>600,1168=>600,1169=>600,1170=>600,1171=>600, +1172=>600,1173=>600,1174=>600,1175=>600,1176=>600,1177=>600,1178=>600,1179=>600,1180=>600,1181=>600, +1182=>600,1183=>600,1184=>600,1185=>600,1186=>600,1187=>600,1188=>600,1189=>600,1190=>600,1191=>600, +1192=>600,1193=>600,1194=>600,1195=>600,1196=>600,1197=>600,1198=>600,1199=>600,1200=>600,1201=>600, +1202=>600,1203=>600,1204=>600,1205=>600,1206=>600,1207=>600,1208=>600,1209=>600,1210=>600,1211=>600, +1212=>600,1213=>600,1214=>600,1215=>600,1216=>600,1217=>600,1218=>600,1219=>600,1220=>600,1221=>600, +1222=>600,1223=>600,1224=>600,1225=>600,1226=>600,1227=>600,1228=>600,1229=>600,1230=>600,1231=>600, +1232=>600,1233=>600,1234=>600,1235=>600,1236=>600,1237=>600,1238=>600,1239=>600,1240=>600,1241=>600, +1242=>600,1243=>600,1244=>600,1245=>600,1246=>600,1247=>600,1248=>600,1249=>600,1250=>600,1251=>600, +1252=>600,1253=>600,1254=>600,1255=>600,1256=>600,1257=>600,1258=>600,1259=>600,1260=>600,1261=>600, +1262=>600,1263=>600,1264=>600,1265=>600,1266=>600,1267=>600,1268=>600,1269=>600,1270=>600,1271=>600, +1272=>600,1273=>600,1296=>600,1297=>600,1298=>600,1299=>600,1306=>600,1307=>600,1308=>600,1309=>600, +1310=>600,1311=>600,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0, +1464=>0,1465=>0,1467=>0,1468=>0,1469=>0,1470=>600,1471=>0,1472=>600,1473=>0,1474=>0, +1475=>600,1476=>0,1488=>600,1489=>600,1490=>600,1491=>600,1492=>600,1493=>600,1494=>600,1495=>600, +1496=>600,1497=>600,1498=>600,1499=>600,1500=>600,1501=>600,1502=>600,1503=>600,1504=>600,1505=>600, +1506=>600,1507=>600,1508=>600,1509=>600,1510=>600,1511=>600,1512=>600,1513=>600,1514=>600,1520=>600, +1521=>600,1522=>600,1523=>600,1524=>600,4304=>600,4305=>600,4306=>600,4307=>600,4308=>600,4309=>600, +4310=>600,4311=>600,4312=>600,4313=>600,4314=>600,4315=>600,4316=>600,4317=>600,4318=>600,4319=>600, +4320=>600,4321=>600,4322=>600,4323=>600,4324=>600,4325=>600,4326=>600,4327=>600,4328=>600,4329=>600, +4330=>600,4331=>600,4332=>600,4333=>600,4334=>600,4335=>600,4336=>600,4337=>600,4338=>600,4339=>600, +4340=>600,4341=>600,4345=>600,4347=>600,7680=>600,7681=>600,7682=>600,7683=>600,7684=>600,7685=>600, +7686=>600,7687=>600,7688=>600,7689=>600,7690=>600,7691=>600,7692=>600,7693=>600,7694=>600,7695=>600, +7696=>600,7697=>600,7698=>600,7699=>600,7700=>600,7701=>600,7702=>600,7703=>600,7704=>600,7705=>600, +7706=>600,7707=>600,7708=>600,7709=>600,7710=>600,7711=>600,7712=>600,7713=>600,7714=>600,7715=>600, +7716=>600,7717=>600,7718=>600,7719=>600,7720=>600,7721=>600,7722=>600,7723=>600,7724=>600,7725=>600, +7726=>600,7727=>600,7728=>600,7729=>600,7730=>600,7731=>600,7732=>600,7733=>600,7734=>600,7735=>600, +7736=>600,7737=>600,7738=>600,7739=>600,7740=>600,7741=>600,7742=>600,7743=>600,7744=>600,7745=>600, +7746=>600,7747=>600,7748=>600,7749=>600,7750=>600,7751=>600,7752=>600,7753=>600,7754=>600,7755=>600, +7756=>600,7757=>600,7758=>600,7759=>600,7760=>600,7761=>600,7762=>600,7763=>600,7764=>600,7765=>600, +7766=>600,7767=>600,7768=>600,7769=>600,7770=>600,7771=>600,7772=>600,7773=>600,7774=>600,7775=>600, +7776=>600,7777=>600,7778=>600,7779=>600,7780=>600,7781=>600,7782=>600,7783=>600,7784=>600,7785=>600, +7786=>600,7787=>600,7788=>600,7789=>600,7790=>600,7791=>600,7792=>600,7793=>600,7794=>600,7795=>600, +7796=>600,7797=>600,7798=>600,7799=>600,7800=>600,7801=>600,7802=>600,7803=>600,7804=>600,7805=>600, +7806=>600,7807=>600,7808=>600,7809=>600,7810=>600,7811=>600,7812=>600,7813=>600,7814=>600,7815=>600, +7816=>600,7817=>600,7818=>600,7819=>600,7820=>600,7821=>600,7822=>600,7823=>600,7824=>600,7825=>600, +7826=>600,7827=>600,7828=>600,7829=>600,7830=>600,7831=>600,7832=>600,7833=>600,7834=>600,7835=>600, +7840=>600,7841=>600,7842=>600,7843=>600,7844=>600,7845=>600,7846=>600,7847=>600,7848=>600,7849=>600, +7850=>600,7851=>600,7852=>600,7853=>600,7854=>600,7855=>600,7856=>600,7857=>600,7858=>600,7859=>600, +7860=>600,7861=>600,7862=>600,7863=>600,7864=>600,7865=>600,7866=>600,7867=>600,7868=>600,7869=>600, +7870=>600,7871=>600,7872=>600,7873=>600,7874=>600,7875=>600,7876=>600,7877=>600,7878=>600,7879=>600, +7880=>600,7881=>600,7882=>600,7883=>600,7884=>600,7885=>600,7886=>600,7887=>600,7888=>600,7889=>600, +7890=>600,7891=>600,7892=>600,7893=>600,7894=>600,7895=>600,7896=>600,7897=>600,7898=>600,7899=>600, +7900=>600,7901=>600,7902=>600,7903=>600,7904=>600,7905=>600,7906=>600,7907=>600,7908=>600,7909=>600, +7910=>600,7911=>600,7912=>600,7913=>600,7914=>600,7915=>600,7916=>600,7917=>600,7918=>600,7919=>600, +7920=>600,7921=>600,7922=>600,7923=>600,7924=>600,7925=>600,7926=>600,7927=>600,7928=>600,7929=>600, +8192=>600,8193=>600,8194=>600,8195=>600,8196=>600,8197=>600,8198=>600,8199=>600,8200=>600,8201=>600, +8202=>600,8203=>600,8204=>0,8205=>0,8206=>0,8207=>0,8208=>600,8209=>600,8210=>600,8213=>600, +8214=>600,8215=>600,8219=>600,8223=>600,8227=>600,8228=>600,8229=>600,8231=>600,8232=>600,8233=>600, +8234=>600,8235=>600,8236=>600,8237=>600,8238=>600,8239=>600,8241=>600,8242=>600,8243=>600,8244=>600, +8245=>600,8246=>600,8247=>600,8248=>600,8251=>600,8252=>600,8253=>600,8254=>600,8255=>600,8256=>600, +8257=>600,8258=>600,8259=>600,8260=>600,8261=>600,8262=>600,8263=>600,8264=>600,8265=>600,8266=>600, +8267=>600,8268=>600,8269=>600,8270=>600,8271=>600,8272=>600,8273=>600,8274=>600,8275=>600,8276=>600, +8277=>600,8278=>600,8279=>600,8280=>600,8281=>600,8282=>600,8283=>600,8284=>600,8285=>600,8286=>600, +8287=>600,8288=>600,8289=>600,8290=>600,8291=>600,8292=>600,8298=>600,8299=>600,8300=>600,8301=>600, +8302=>600,8303=>600,8304=>600,8305=>600,8308=>600,8309=>600,8310=>600,8311=>600,8312=>600,8313=>600, +8314=>600,8315=>600,8316=>600,8317=>600,8318=>600,8319=>600,8320=>600,8321=>600,8322=>600,8323=>600, +8324=>600,8325=>600,8326=>600,8327=>600,8328=>600,8329=>600,8330=>600,8331=>600,8332=>600,8333=>600, +8334=>600,8336=>600,8337=>600,8338=>600,8339=>600,8340=>600,8355=>600,8356=>600,8362=>600,8373=>600, +8448=>600,8449=>600,8451=>600,8453=>600,8454=>600,8457=>600,8465=>600,8466=>600,8470=>600,8472=>600, +8476=>600,8481=>600,8486=>600,8487=>600,8489=>600,8490=>600,8491=>600,8498=>600,8501=>600,8502=>600, +8503=>600,8504=>600,8506=>600,8507=>600,8523=>600,8531=>600,8532=>600,8533=>600,8534=>600,8535=>600, +8536=>600,8537=>600,8538=>600,8539=>600,8540=>600,8541=>600,8542=>600,8543=>600,8544=>600,8545=>600, +8546=>600,8547=>600,8548=>600,8549=>600,8550=>600,8553=>600,8556=>600,8557=>600,8558=>600,8559=>600, +8560=>600,8564=>600,8569=>600,8572=>600,8573=>600,8574=>600,8575=>600,8592=>600,8593=>600,8594=>600, +8595=>600,8704=>600,8706=>600,8707=>600,8709=>600,8710=>600,8711=>600,8712=>600,8713=>600,8715=>600, +8716=>600,8721=>600,8722=>600,8723=>600,8725=>600,8730=>600,8733=>600,8734=>600,8735=>600,8756=>600, +8800=>600,8801=>600,8804=>600,8805=>600,8834=>600,8835=>600,8836=>600,8837=>600,8838=>600,8839=>600, +8869=>600,8976=>600,9001=>600,9002=>600,9251=>600,9472=>600,9473=>600,9474=>600,9475=>600,9476=>600, +9477=>600,9478=>600,9479=>600,9480=>600,9481=>600,9482=>600,9483=>600,9484=>600,9485=>600,9486=>600, +9487=>600,9488=>600,9489=>600,9490=>600,9491=>600,9492=>600,9493=>600,9494=>600,9495=>600,9496=>600, +9497=>600,9498=>600,9499=>600,9500=>600,9501=>600,9502=>600,9503=>600,9504=>600,9505=>600,9506=>600, +9507=>600,9508=>600,9509=>600,9510=>600,9511=>600,9512=>600,9513=>600,9514=>600,9515=>600,9516=>600, +9517=>600,9518=>600,9519=>600,9520=>600,9521=>600,9522=>600,9523=>600,9524=>600,9525=>600,9526=>600, +9527=>600,9528=>600,9529=>600,9530=>600,9531=>600,9532=>600,9533=>600,9534=>600,9535=>600,9536=>600, +9537=>600,9538=>600,9539=>600,9540=>600,9541=>600,9542=>600,9543=>600,9544=>600,9545=>600,9546=>600, +9547=>600,9548=>600,9549=>600,9550=>600,9551=>600,9552=>600,9553=>600,9554=>600,9555=>600,9556=>600, +9557=>600,9558=>600,9559=>600,9560=>600,9561=>600,9562=>600,9563=>600,9564=>600,9565=>600,9566=>600, +9567=>600,9568=>600,9569=>600,9570=>600,9571=>600,9572=>600,9573=>600,9574=>600,9575=>600,9576=>600, +9577=>600,9578=>600,9579=>600,9580=>600,9581=>600,9582=>600,9583=>600,9584=>600,9585=>600,9586=>600, +9587=>600,9588=>600,9589=>600,9590=>600,9591=>600,9592=>600,9593=>600,9594=>600,9595=>600,9596=>600, +9597=>600,9598=>600,9599=>600,9600=>600,9601=>600,9602=>600,9603=>600,9604=>600,9605=>600,9606=>600, +9607=>600,9608=>600,9609=>600,9610=>600,9611=>600,9612=>600,9613=>600,9614=>600,9615=>600,9616=>600, +9617=>600,9618=>600,9619=>600,9620=>600,9621=>600,9632=>600,9633=>600,9635=>600,9636=>600,9637=>600, +9638=>600,9639=>600,9640=>600,9641=>600,9642=>600,9643=>600,9644=>600,9645=>600,9646=>600,9647=>600, +9648=>600,9649=>600,9650=>600,9651=>600,9652=>600,9653=>600,9654=>600,9655=>600,9656=>600,9657=>600, +9658=>600,9660=>600,9661=>600,9662=>600,9663=>600,9664=>600,9665=>600,9666=>600,9667=>600,9668=>600, +9669=>600,9670=>600,9671=>600,9673=>600,9674=>600,9675=>600,9677=>600,9679=>600,9680=>600,9681=>600, +9682=>600,9683=>600,9684=>600,9685=>600,9686=>600,9687=>600,9688=>600,9689=>600,9698=>600,9699=>600, +9700=>600,9701=>600,9702=>600,9703=>600,9704=>600,9705=>600,9706=>600,9707=>600,9708=>600,9709=>600, +9710=>600,9712=>600,9713=>600,9714=>600,9715=>600,9716=>600,9717=>600,9718=>600,9719=>600,9735=>600, +9736=>600,9737=>600,9776=>600,9777=>600,9778=>600,9779=>600,9780=>600,9781=>600,9782=>600,9783=>600, +9785=>600,9786=>600,9787=>600,9824=>600,9825=>600,9826=>600,9827=>600,9828=>600,9829=>600,9830=>600, +9831=>600,9833=>600,9834=>600,9835=>600,9836=>600,9837=>600,9838=>600,9839=>600,64256=>600,64257=>600, +64258=>600,64285=>600,64287=>600,64288=>600,64298=>600,64299=>600,64300=>600,64301=>600,64302=>600,64303=>600, +64304=>600,64305=>600,64306=>600,64307=>600,64308=>600,64309=>600,64310=>600,64312=>600,64313=>600,64314=>600, +64315=>600,64316=>600,64318=>600,64320=>600,64321=>600,64323=>600,64324=>600,64326=>600,64327=>600,64328=>600, +64329=>600,64330=>600,64331=>600,64332=>600,64333=>600,64334=>600,64335=>600,65533=>600); +$enc=''; +$diff=''; +$file='freemonob.z'; +$ctg='freemonob.ctg.z'; +$originalsize=164212; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonob.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonob.z new file mode 100644 index 0000000..84b1dec Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonob.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonobi.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonobi.ctg.z new file mode 100644 index 0000000..efaebb0 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonobi.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonobi.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonobi.php new file mode 100644 index 0000000..05e95d4 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonobi.php @@ -0,0 +1,153 @@ +<?php +$type='TrueTypeUnicode'; +$name='FreeMonoBoldOblique'; +$desc=array('Ascent'=>800,'Descent'=>-200,'CapHeight'=>19,'Flags'=>96,'FontBBox'=>'[-644 -200 833 800]','ItalicAngle'=>-12,'StemV'=>120,'MissingWidth'=>600); +$up=-125; +$ut=50; +$dw=600; +$cw=array( +32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600,40=>600,41=>600, +42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600,50=>600,51=>600, +52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600,60=>600,61=>600, +62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600,70=>600,71=>600, +72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600,80=>600,81=>600, +82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600,90=>600,91=>600, +92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600,100=>600,101=>600, +102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600,109=>600,110=>600,111=>600, +112=>600,113=>600,114=>600,115=>600,116=>600,117=>600,118=>600,119=>600,120=>600,121=>600, +122=>600,123=>600,124=>600,125=>600,126=>600,8364=>600,8218=>600,402=>600,8222=>600,8230=>600, +8224=>600,8225=>600,710=>600,8240=>600,352=>600,8249=>600,338=>600,381=>600,8216=>600,8217=>600, +8220=>600,8221=>600,8226=>600,8211=>600,8212=>600,732=>600,8482=>600,353=>600,8250=>600,339=>600, +382=>600,376=>600,160=>600,161=>600,162=>600,163=>600,164=>600,165=>600,166=>600,167=>600, +168=>600,169=>600,170=>600,171=>600,172=>600,173=>600,174=>600,175=>600,176=>600,177=>600, +178=>600,179=>600,180=>600,181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600, +188=>600,189=>600,190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600, +198=>600,199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600, +208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600,217=>600, +218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600,226=>600,227=>600, +228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600,235=>600,236=>600,237=>600, +238=>600,239=>600,240=>600,241=>600,242=>600,243=>600,244=>600,245=>600,246=>600,247=>600, +248=>600,249=>600,250=>600,251=>600,252=>600,253=>600,254=>600,255=>600,256=>600,257=>600, +258=>600,259=>600,260=>600,261=>600,262=>600,263=>600,264=>600,265=>600,266=>600,267=>600, +268=>600,269=>600,270=>600,271=>600,272=>600,273=>600,274=>600,275=>600,276=>600,277=>600, +278=>600,279=>600,280=>600,281=>600,282=>600,283=>600,284=>600,285=>600,286=>600,287=>600, +288=>600,289=>600,290=>600,291=>600,292=>600,293=>600,294=>600,295=>600,296=>600,297=>600, +298=>600,299=>600,300=>600,301=>600,302=>600,303=>600,304=>600,305=>600,306=>600,307=>600, +308=>600,309=>600,310=>600,311=>600,312=>600,313=>600,314=>600,315=>600,316=>600,317=>600, +318=>600,319=>600,320=>600,321=>600,322=>600,323=>600,324=>600,325=>600,326=>600,327=>600, +328=>600,329=>600,330=>600,331=>600,332=>600,333=>600,334=>600,335=>600,336=>600,337=>600, +340=>600,341=>600,342=>600,343=>600,344=>600,345=>600,346=>600,347=>600,348=>600,349=>600, +350=>600,351=>600,354=>600,355=>600,356=>600,357=>600,358=>600,359=>600,360=>600,361=>600, +362=>600,363=>600,364=>600,365=>600,366=>600,367=>600,368=>600,369=>600,370=>600,371=>600, +372=>600,373=>600,374=>600,375=>600,377=>600,378=>600,379=>600,380=>600,383=>600,384=>600, +385=>600,386=>600,387=>600,388=>600,389=>600,390=>600,391=>600,392=>600,393=>600,394=>600, +395=>600,396=>600,397=>600,398=>600,399=>600,400=>600,401=>600,403=>600,404=>600,405=>600, +406=>600,407=>600,408=>600,409=>600,410=>600,411=>600,412=>600,413=>600,414=>600,415=>600, +416=>600,417=>600,418=>600,419=>600,420=>600,421=>600,422=>600,423=>600,424=>600,425=>600, +426=>600,427=>600,428=>600,429=>600,430=>600,431=>600,432=>600,433=>600,434=>600,435=>600, +436=>600,437=>600,438=>600,439=>600,440=>600,441=>600,442=>600,443=>600,444=>600,445=>600, +446=>600,447=>600,448=>600,449=>600,450=>600,451=>600,452=>600,453=>600,454=>600,455=>600, +456=>600,457=>600,458=>600,459=>600,460=>600,461=>600,462=>600,463=>600,464=>600,465=>600, +466=>600,467=>600,468=>600,469=>600,470=>600,471=>600,472=>600,473=>600,474=>600,475=>600, +476=>600,477=>600,478=>600,479=>600,480=>600,481=>600,482=>600,483=>600,484=>600,485=>600, +486=>600,487=>600,488=>600,489=>600,490=>600,491=>600,492=>600,493=>600,494=>600,495=>600, +496=>600,497=>600,498=>600,499=>600,500=>600,501=>600,502=>600,503=>600,504=>600,505=>600, +506=>600,507=>600,508=>600,509=>600,510=>600,511=>600,512=>600,513=>600,514=>600,515=>600, +516=>600,517=>600,518=>600,519=>600,520=>600,521=>600,522=>600,523=>600,524=>600,525=>600, +526=>600,527=>600,528=>600,529=>600,530=>600,531=>600,532=>600,533=>600,534=>600,535=>600, +536=>600,537=>600,538=>600,539=>600,540=>600,541=>600,542=>600,543=>600,548=>600,549=>600, +550=>600,551=>600,552=>600,553=>600,554=>600,555=>600,556=>600,557=>600,558=>600,559=>600, +560=>600,561=>600,562=>600,563=>600,567=>600,592=>600,593=>600,594=>600,595=>600,596=>600, +598=>600,599=>600,600=>600,601=>600,603=>600,604=>600,607=>600,608=>600,609=>600,613=>600, +614=>600,615=>600,616=>600,617=>600,618=>600,619=>600,621=>600,623=>600,624=>600,625=>600, +626=>600,627=>600,628=>600,629=>600,633=>600,634=>600,635=>600,636=>600,637=>600,638=>600, +639=>600,640=>600,641=>600,642=>600,643=>600,644=>600,645=>600,647=>600,648=>600,649=>600, +652=>600,653=>600,654=>600,656=>600,657=>600,658=>600,659=>600,660=>600,661=>600,662=>600, +663=>600,664=>600,665=>600,666=>600,667=>600,668=>600,669=>600,670=>600,671=>600,672=>600, +673=>600,674=>600,697=>600,698=>600,699=>600,700=>600,701=>600,702=>600,703=>600,704=>600, +705=>600,706=>600,707=>600,708=>600,709=>600,711=>600,712=>600,713=>600,714=>600,715=>600, +716=>600,717=>600,718=>600,719=>600,720=>600,721=>600,722=>600,723=>600,724=>600,725=>600, +726=>600,727=>600,728=>600,729=>600,730=>600,731=>600,733=>600,734=>600,735=>600,741=>600, +742=>600,743=>600,744=>600,745=>600,746=>600,747=>600,748=>600,749=>600,750=>600,751=>600, +752=>600,753=>600,754=>600,755=>600,756=>600,757=>600,758=>600,759=>600,760=>600,761=>600, +762=>600,763=>600,764=>600,765=>600,766=>600,767=>600,768=>0,769=>0,770=>0,771=>0, +772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0, +782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0, +795=>0,796=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0, +808=>0,809=>0,810=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0, +819=>0,820=>0,821=>0,822=>0,825=>0,826=>0,827=>0,831=>0,832=>0,833=>0, +834=>0,835=>0,836=>0,838=>0,839=>0,840=>0,844=>0,849=>0,850=>0,851=>0, +852=>0,853=>0,854=>0,855=>0,884=>600,885=>600,890=>600,894=>600,900=>600,901=>600, +902=>600,903=>600,904=>600,905=>600,906=>600,908=>600,910=>600,911=>600,912=>600,913=>600, +914=>600,915=>600,916=>600,917=>600,918=>600,919=>600,920=>600,921=>600,922=>600,923=>600, +924=>600,925=>600,926=>600,927=>600,928=>600,929=>600,931=>600,932=>600,933=>600,934=>600, +935=>600,936=>600,937=>600,938=>600,939=>600,940=>600,941=>600,942=>600,943=>600,944=>600, +945=>600,946=>600,947=>600,948=>600,949=>600,950=>600,951=>600,952=>600,953=>600,954=>600, +955=>600,956=>600,957=>600,958=>600,959=>600,960=>600,961=>600,962=>600,963=>600,964=>600, +965=>600,966=>600,967=>600,968=>600,969=>600,970=>600,971=>600,972=>600,973=>600,974=>600, +976=>600,977=>600,978=>600,979=>600,980=>600,981=>600,982=>600,986=>600,987=>600,988=>600, +1008=>600,1009=>600,1012=>600,1013=>600,1024=>600,1025=>600,1026=>600,1027=>600,1028=>600,1029=>600, +1030=>600,1031=>600,1032=>600,1033=>600,1034=>600,1035=>600,1036=>600,1037=>600,1038=>600,1039=>600, +1040=>600,1041=>600,1042=>600,1043=>600,1044=>600,1045=>600,1046=>600,1047=>600,1048=>600,1049=>600, +1050=>600,1051=>600,1052=>600,1053=>600,1054=>600,1055=>600,1056=>600,1057=>600,1058=>600,1059=>600, +1060=>600,1061=>600,1062=>600,1063=>600,1064=>600,1065=>600,1066=>600,1067=>600,1068=>600,1069=>600, +1070=>600,1071=>600,1072=>600,1073=>600,1074=>600,1075=>600,1076=>600,1077=>600,1078=>600,1079=>600, +1080=>600,1081=>600,1082=>600,1083=>600,1084=>600,1085=>600,1086=>600,1087=>600,1088=>600,1089=>600, +1090=>600,1091=>600,1092=>600,1093=>600,1094=>600,1095=>600,1096=>600,1097=>600,1098=>600,1099=>600, +1100=>600,1101=>600,1102=>600,1103=>600,1104=>600,1105=>600,1106=>600,1107=>600,1108=>600,1109=>600, +1110=>600,1111=>600,1112=>600,1113=>600,1114=>600,1115=>600,1116=>600,1117=>600,1118=>600,1119=>600, +1136=>600,1137=>600,1138=>600,1156=>0,1157=>0,1158=>0,1162=>600,1163=>600,1164=>600,1165=>600, +1166=>600,1167=>600,1168=>600,1169=>600,1170=>600,1171=>600,1172=>600,1173=>600,1174=>600,1175=>600, +1176=>600,1177=>600,1178=>600,1179=>600,1180=>600,1181=>600,1182=>600,1183=>600,1184=>600,1185=>600, +1186=>600,1187=>600,1188=>600,1189=>600,1190=>600,1191=>600,1192=>600,1193=>600,1194=>600,1195=>600, +1196=>600,1197=>600,1198=>600,1199=>600,1200=>600,1201=>600,1202=>600,1203=>600,1204=>600,1205=>600, +1206=>600,1207=>600,1208=>600,1209=>600,1210=>600,1211=>600,1212=>600,1213=>600,1214=>600,1215=>600, +1216=>600,1217=>600,1218=>600,1219=>600,1220=>600,1221=>600,1222=>600,1223=>600,1224=>600,1225=>600, +1226=>600,1227=>600,1228=>600,1229=>600,1230=>600,1231=>600,1232=>600,1233=>600,1234=>600,1235=>600, +1236=>600,1237=>600,1238=>600,1239=>600,1240=>600,1241=>600,1242=>600,1243=>600,1244=>600,1245=>600, +1246=>600,1247=>600,1248=>600,1249=>600,1250=>600,1251=>600,1252=>600,1253=>600,1254=>600,1255=>600, +1256=>600,1257=>600,1258=>600,1259=>600,1260=>600,1261=>600,1262=>600,1263=>600,1264=>600,1265=>600, +1266=>600,1267=>600,1268=>600,1269=>600,1270=>600,1271=>600,1272=>600,1273=>600,1296=>600,1297=>600, +1298=>600,1299=>600,1306=>600,1307=>600,1308=>600,1309=>600,1310=>600,1311=>600,1456=>0,1457=>0, +1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1467=>0,1468=>0, +1469=>0,1470=>0,1471=>0,1472=>600,1473=>0,1474=>0,1475=>600,1476=>0,1488=>600,1489=>600, +1490=>600,1491=>600,1492=>600,1493=>600,1494=>600,1495=>600,1496=>600,1497=>600,1498=>600,1499=>600, +1500=>600,1501=>600,1502=>600,1503=>600,1504=>600,1505=>600,1506=>600,1507=>600,1508=>600,1509=>600, +1510=>600,1511=>600,1512=>600,1513=>600,1514=>600,1520=>600,1521=>600,1522=>600,1523=>600,1524=>600, +4304=>600,4305=>600,4306=>600,4307=>600,4308=>600,4309=>600,4310=>600,4311=>600,4312=>600,4313=>600, +4314=>600,4315=>600,4316=>600,4317=>600,4318=>600,4319=>600,4320=>600,4321=>600,4322=>600,4323=>600, +4324=>600,4325=>600,4326=>600,4327=>600,4328=>600,4329=>600,4330=>600,4331=>600,4332=>600,4333=>600, +4334=>600,4335=>600,4336=>600,4337=>600,4338=>600,4339=>600,4340=>600,4341=>600,4345=>600,4347=>600, +8192=>600,8193=>600,8194=>600,8195=>600,8196=>600,8197=>600,8198=>600,8199=>600,8200=>600,8201=>600, +8202=>600,8203=>600,8204=>0,8205=>0,8206=>0,8207=>0,8208=>600,8209=>600,8210=>600,8213=>600, +8214=>600,8215=>600,8219=>600,8223=>600,8227=>600,8228=>600,8229=>600,8231=>600,8232=>600,8233=>600, +8234=>600,8235=>600,8236=>600,8237=>600,8238=>600,8239=>600,8241=>600,8242=>600,8243=>600,8244=>600, +8245=>600,8246=>600,8247=>600,8248=>600,8251=>600,8252=>600,8253=>600,8254=>600,8255=>600,8256=>600, +8257=>600,8258=>600,8259=>600,8260=>600,8261=>600,8262=>600,8263=>600,8264=>600,8265=>600,8266=>600, +8267=>600,8268=>600,8269=>600,8270=>600,8271=>600,8272=>600,8273=>600,8274=>600,8275=>600,8276=>600, +8277=>600,8278=>600,8279=>600,8280=>600,8281=>600,8282=>600,8283=>600,8284=>600,8285=>600,8286=>600, +8287=>600,8288=>600,8289=>600,8290=>600,8291=>600,8292=>600,8298=>600,8299=>600,8300=>600,8301=>600, +8302=>600,8303=>600,8304=>600,8305=>600,8308=>600,8309=>600,8310=>600,8311=>600,8312=>600,8313=>600, +8314=>600,8315=>600,8316=>600,8317=>600,8318=>600,8319=>600,8320=>600,8321=>600,8322=>600,8323=>600, +8324=>600,8325=>600,8326=>600,8327=>600,8328=>600,8329=>600,8330=>600,8331=>600,8332=>600,8333=>600, +8334=>600,8336=>600,8337=>600,8338=>600,8339=>600,8340=>600,8362=>600,8373=>600,8448=>600,8449=>600, +8451=>600,8453=>600,8454=>600,8457=>600,8465=>600,8466=>600,8470=>600,8472=>600,8476=>600,8481=>600, +8486=>600,8487=>600,8489=>600,8490=>600,8491=>600,8498=>600,8501=>600,8502=>600,8503=>600,8504=>600, +8506=>600,8507=>600,8523=>600,8531=>600,8532=>600,8533=>600,8534=>600,8535=>600,8536=>600,8537=>600, +8538=>600,8539=>600,8540=>600,8541=>600,8542=>600,8543=>600,8544=>600,8545=>600,8546=>600,8547=>600, +8548=>600,8549=>600,8550=>600,8553=>600,8556=>600,8557=>600,8558=>600,8559=>600,8560=>600,8564=>600, +8569=>600,8572=>600,8573=>600,8574=>600,8575=>600,8592=>600,8593=>600,8594=>600,8595=>600,8704=>600, +8706=>600,8707=>600,8710=>600,8711=>600,8712=>600,8713=>600,8715=>600,8716=>600,8721=>600,8722=>600, +8723=>600,8725=>600,8730=>600,8733=>600,8734=>600,8756=>600,8800=>600,8801=>600,8804=>600,8805=>600, +9251=>600,9674=>600,9824=>600,9825=>600,9826=>600,9827=>600,9828=>600,9829=>600,9830=>600,9831=>600, +9833=>600,9834=>600,9835=>600,9836=>600,9837=>600,9838=>600,9839=>600,64256=>600,64257=>600,64258=>600, +64285=>600,64287=>600,64288=>600,64298=>600,64299=>600,64300=>600,64301=>600,64302=>600,64303=>600,64304=>600, +64305=>600,64306=>600,64307=>600,64308=>600,64309=>600,64310=>600,64312=>600,64313=>600,64314=>600,64315=>600, +64316=>600,64318=>600,64320=>600,64321=>600,64323=>600,64324=>600,64326=>600,64327=>600,64328=>600,64329=>600, +64330=>600,64331=>600,64332=>600,64333=>600,64334=>600,64335=>600,65533=>600); +$enc=''; +$diff=''; +$file='freemonobi.z'; +$ctg='freemonobi.ctg.z'; +$originalsize=145080; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonobi.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonobi.z new file mode 100644 index 0000000..b31acfb Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonobi.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonoi.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonoi.ctg.z new file mode 100644 index 0000000..36e92ec Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonoi.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonoi.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonoi.php new file mode 100644 index 0000000..11cc061 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonoi.php @@ -0,0 +1,221 @@ +<?php +$type='TrueTypeUnicode'; +$name='FreeMonoOblique'; +$desc=array('Ascent'=>800,'Descent'=>-200,'CapHeight'=>44,'Flags'=>96,'FontBBox'=>'[-644 -200 816 800]','ItalicAngle'=>-12,'StemV'=>70,'MissingWidth'=>600); +$up=-125; +$ut=50; +$dw=600; +$cw=array( +32=>600,33=>600,34=>600,35=>600,36=>600,37=>600,38=>600,39=>600,40=>600,41=>600, +42=>600,43=>600,44=>600,45=>600,46=>600,47=>600,48=>600,49=>600,50=>600,51=>600, +52=>600,53=>600,54=>600,55=>600,56=>600,57=>600,58=>600,59=>600,60=>600,61=>600, +62=>600,63=>600,64=>600,65=>600,66=>600,67=>600,68=>600,69=>600,70=>600,71=>600, +72=>600,73=>600,74=>600,75=>600,76=>600,77=>600,78=>600,79=>600,80=>600,81=>600, +82=>600,83=>600,84=>600,85=>600,86=>600,87=>600,88=>600,89=>600,90=>600,91=>600, +92=>600,93=>600,94=>600,95=>600,96=>600,97=>600,98=>600,99=>600,100=>600,101=>600, +102=>600,103=>600,104=>600,105=>600,106=>600,107=>600,108=>600,109=>600,110=>600,111=>600, +112=>600,113=>600,114=>600,115=>600,116=>600,117=>600,118=>600,119=>600,120=>600,121=>600, +122=>600,123=>600,124=>600,125=>600,126=>600,8364=>600,8218=>600,402=>600,8222=>600,8230=>600, +8224=>600,8225=>600,710=>600,8240=>600,352=>600,8249=>600,338=>600,381=>600,8216=>600,8217=>600, +8220=>600,8221=>600,8226=>600,8211=>600,8212=>600,732=>600,8482=>600,353=>600,8250=>600,339=>600, +382=>600,376=>600,160=>600,161=>600,162=>600,163=>600,164=>600,165=>600,166=>600,167=>600, +168=>600,169=>600,170=>600,171=>600,172=>600,173=>600,174=>600,175=>600,176=>600,177=>600, +178=>600,179=>600,180=>600,181=>600,182=>600,183=>600,184=>600,185=>600,186=>600,187=>600, +188=>600,189=>600,190=>600,191=>600,192=>600,193=>600,194=>600,195=>600,196=>600,197=>600, +198=>600,199=>600,200=>600,201=>600,202=>600,203=>600,204=>600,205=>600,206=>600,207=>600, +208=>600,209=>600,210=>600,211=>600,212=>600,213=>600,214=>600,215=>600,216=>600,217=>600, +218=>600,219=>600,220=>600,221=>600,222=>600,223=>600,224=>600,225=>600,226=>600,227=>600, +228=>600,229=>600,230=>600,231=>600,232=>600,233=>600,234=>600,235=>600,236=>600,237=>600, +238=>600,239=>600,240=>600,241=>600,242=>600,243=>600,244=>600,245=>600,246=>600,247=>600, +248=>600,249=>600,250=>600,251=>600,252=>600,253=>600,254=>600,255=>600,256=>600,257=>600, +258=>600,259=>600,260=>600,261=>600,262=>600,263=>600,264=>600,265=>600,266=>600,267=>600, +268=>600,269=>600,270=>600,271=>600,272=>600,273=>600,274=>600,275=>600,276=>600,277=>600, +278=>600,279=>600,280=>600,281=>600,282=>600,283=>600,284=>600,285=>600,286=>600,287=>600, +288=>600,289=>600,290=>600,291=>600,292=>600,293=>600,294=>600,295=>600,296=>600,297=>600, +298=>600,299=>600,300=>600,301=>600,302=>600,303=>600,304=>600,305=>600,306=>600,307=>600, +308=>600,309=>600,310=>600,311=>600,312=>600,313=>600,314=>600,315=>600,316=>600,317=>600, +318=>600,319=>600,320=>600,321=>600,322=>600,323=>600,324=>600,325=>600,326=>600,327=>600, +328=>600,329=>600,330=>600,331=>600,332=>600,333=>600,334=>600,335=>600,336=>600,337=>600, +340=>600,341=>600,342=>600,343=>600,344=>600,345=>600,346=>600,347=>600,348=>600,349=>600, +350=>600,351=>600,354=>600,355=>600,356=>600,357=>600,358=>600,359=>600,360=>600,361=>600, +362=>600,363=>600,364=>600,365=>600,366=>600,367=>600,368=>600,369=>600,370=>600,371=>600, +372=>600,373=>600,374=>600,375=>600,377=>600,378=>600,379=>600,380=>600,383=>600,384=>600, +385=>600,386=>600,387=>600,388=>600,389=>600,390=>600,391=>600,392=>600,393=>600,394=>600, +395=>600,396=>600,397=>600,398=>600,399=>600,400=>600,401=>600,403=>600,404=>600,405=>600, +406=>600,407=>600,408=>600,409=>600,410=>600,411=>600,412=>600,413=>600,414=>600,415=>600, +416=>600,417=>600,418=>600,419=>600,420=>600,421=>600,422=>600,423=>600,424=>600,425=>600, +426=>600,427=>600,428=>600,429=>600,430=>600,431=>600,432=>600,433=>600,434=>600,435=>600, +436=>600,437=>600,438=>600,439=>600,440=>600,441=>600,442=>600,443=>600,444=>600,445=>600, +446=>600,447=>600,448=>600,449=>600,450=>600,451=>600,452=>600,453=>600,454=>600,455=>600, +456=>600,457=>600,458=>600,459=>600,460=>600,461=>600,462=>600,463=>600,464=>600,465=>600, +466=>600,467=>600,468=>600,469=>600,470=>600,471=>600,472=>600,473=>600,474=>600,475=>600, +476=>600,477=>600,478=>600,479=>600,480=>600,481=>600,482=>600,483=>600,484=>600,485=>600, +486=>600,487=>600,488=>600,489=>600,490=>600,491=>600,492=>600,493=>600,494=>600,495=>600, +496=>600,497=>600,498=>600,499=>600,500=>600,501=>600,502=>600,503=>600,504=>600,505=>600, +506=>600,507=>600,508=>600,509=>600,510=>600,511=>600,512=>600,513=>600,514=>600,515=>600, +516=>600,517=>600,518=>600,519=>600,520=>600,521=>600,522=>600,523=>600,524=>600,525=>600, +526=>600,527=>600,528=>600,529=>600,530=>600,531=>600,532=>600,533=>600,534=>600,535=>600, +536=>600,537=>600,538=>600,539=>600,540=>600,541=>600,542=>600,543=>600,548=>600,549=>600, +550=>600,551=>600,552=>600,553=>600,554=>600,555=>600,556=>600,557=>600,558=>600,559=>600, +560=>600,561=>600,562=>600,563=>600,567=>600,592=>600,593=>600,594=>600,595=>600,596=>600, +597=>600,598=>600,599=>600,600=>600,601=>600,602=>600,603=>600,604=>600,607=>600,608=>600, +609=>600,610=>600,611=>600,612=>600,613=>600,614=>600,615=>600,616=>600,617=>600,618=>600, +619=>600,620=>600,621=>600,622=>600,623=>600,624=>600,625=>600,626=>600,627=>600,628=>600, +629=>600,630=>600,632=>600,633=>600,634=>600,635=>600,636=>600,637=>600,638=>600,639=>600, +640=>600,641=>600,642=>600,643=>600,644=>600,645=>600,646=>600,647=>600,648=>600,649=>600, +651=>600,652=>600,653=>600,654=>600,655=>600,656=>600,657=>600,658=>600,660=>600,661=>600, +662=>600,663=>600,664=>600,665=>600,667=>600,668=>600,669=>600,670=>600,671=>600,672=>600, +673=>600,674=>600,679=>600,688=>600,689=>600,690=>600,691=>600,692=>600,693=>600,694=>600, +695=>600,696=>600,697=>600,698=>600,699=>600,700=>600,701=>600,702=>600,703=>600,704=>600, +705=>600,706=>600,707=>600,708=>600,709=>600,711=>600,712=>600,713=>600,714=>600,715=>600, +716=>600,717=>600,718=>600,719=>600,720=>600,721=>600,722=>600,723=>600,724=>600,725=>600, +726=>600,727=>600,728=>600,729=>600,730=>600,731=>600,733=>600,734=>600,735=>600,736=>600, +737=>600,738=>600,739=>600,740=>600,741=>600,742=>600,743=>600,744=>600,745=>600,746=>600, +747=>600,748=>600,749=>600,750=>600,751=>600,752=>600,753=>600,754=>600,755=>600,756=>600, +757=>600,758=>600,759=>600,760=>600,761=>600,762=>600,763=>600,764=>600,765=>600,766=>600, +767=>600,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0, +777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0, +787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,795=>0,796=>0,800=>0, +803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,812=>0,813=>0, +814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0, +824=>0,825=>0,826=>0,827=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0, +838=>0,839=>0,840=>0,844=>0,849=>0,850=>0,851=>0,852=>0,853=>0,854=>0, +855=>0,884=>600,885=>600,890=>600,894=>600,900=>600,901=>600,902=>600,903=>600,904=>600, +905=>600,906=>600,908=>600,910=>600,911=>600,912=>600,913=>600,914=>600,915=>600,916=>600, +917=>600,918=>600,919=>600,920=>600,921=>600,922=>600,923=>600,924=>600,925=>600,926=>600, +927=>600,928=>600,929=>600,931=>600,932=>600,933=>600,934=>600,935=>600,936=>600,937=>600, +938=>600,939=>600,940=>600,941=>600,942=>600,943=>600,944=>600,945=>600,946=>600,947=>600, +948=>600,949=>600,950=>600,951=>600,952=>600,953=>600,954=>600,955=>600,956=>600,957=>600, +958=>600,959=>600,960=>600,961=>600,962=>600,963=>600,964=>600,965=>600,966=>600,967=>600, +968=>600,969=>600,970=>600,971=>600,972=>600,973=>600,974=>600,976=>600,977=>600,978=>600, +979=>600,980=>600,981=>600,982=>600,986=>600,987=>600,988=>600,1008=>600,1009=>600,1012=>600, +1013=>600,1024=>600,1025=>600,1026=>600,1027=>600,1028=>600,1029=>600,1030=>600,1031=>600,1032=>600, +1033=>600,1034=>600,1035=>600,1036=>600,1037=>600,1038=>600,1039=>600,1040=>600,1041=>600,1042=>600, +1043=>600,1044=>600,1045=>600,1046=>600,1047=>600,1048=>600,1049=>600,1050=>600,1051=>600,1052=>600, +1053=>600,1054=>600,1055=>600,1056=>600,1057=>600,1058=>600,1059=>600,1060=>600,1061=>600,1062=>600, +1063=>600,1064=>600,1065=>600,1066=>600,1067=>600,1068=>600,1069=>600,1070=>600,1071=>600,1072=>600, +1073=>600,1074=>600,1075=>600,1076=>600,1077=>600,1078=>600,1079=>600,1080=>600,1081=>600,1082=>600, +1083=>600,1084=>600,1085=>600,1086=>600,1087=>600,1088=>600,1089=>600,1090=>600,1091=>600,1092=>600, +1093=>600,1094=>600,1095=>600,1096=>600,1097=>600,1098=>600,1099=>600,1100=>600,1101=>600,1102=>600, +1103=>600,1104=>600,1105=>600,1106=>600,1107=>600,1108=>600,1109=>600,1110=>600,1111=>600,1112=>600, +1113=>600,1114=>600,1115=>600,1116=>600,1117=>600,1118=>600,1119=>600,1120=>600,1121=>600,1122=>600, +1123=>600,1124=>600,1126=>600,1127=>600,1128=>600,1130=>600,1131=>600,1132=>600,1133=>600,1136=>600, +1137=>600,1138=>600,1140=>600,1141=>600,1142=>600,1143=>600,1155=>0,1156=>0,1157=>0,1158=>0, +1159=>0,1162=>600,1163=>600,1164=>600,1165=>600,1166=>600,1167=>600,1168=>600,1169=>600,1170=>600, +1171=>600,1172=>600,1173=>600,1174=>600,1175=>600,1176=>600,1177=>600,1178=>600,1179=>600,1180=>600, +1181=>600,1182=>600,1183=>600,1184=>600,1185=>600,1186=>600,1187=>600,1188=>600,1189=>600,1190=>600, +1191=>600,1192=>600,1193=>600,1194=>600,1195=>600,1196=>600,1197=>600,1198=>600,1199=>600,1200=>600, +1201=>600,1202=>600,1203=>600,1204=>600,1205=>600,1206=>600,1207=>600,1208=>600,1209=>600,1210=>600, +1211=>600,1212=>600,1213=>600,1214=>600,1215=>600,1216=>600,1217=>600,1218=>600,1219=>600,1220=>600, +1221=>600,1222=>600,1223=>600,1224=>600,1225=>600,1226=>600,1227=>600,1228=>600,1229=>600,1230=>600, +1231=>600,1232=>600,1233=>600,1234=>600,1235=>600,1236=>600,1237=>600,1238=>600,1239=>600,1240=>600, +1241=>600,1242=>600,1243=>600,1244=>600,1245=>600,1246=>600,1247=>600,1248=>600,1249=>600,1250=>600, +1251=>600,1252=>600,1253=>600,1254=>600,1255=>600,1256=>600,1257=>600,1258=>600,1259=>600,1260=>600, +1261=>600,1262=>600,1263=>600,1264=>600,1265=>600,1266=>600,1267=>600,1268=>600,1269=>600,1270=>600, +1271=>600,1272=>600,1273=>600,1296=>600,1297=>600,1298=>600,1299=>600,1306=>600,1307=>600,1308=>600, +1309=>600,1310=>600,1311=>600,1329=>600,1330=>600,1331=>600,1332=>600,1333=>600,1334=>600,1335=>600, +1336=>600,1337=>600,1338=>600,1339=>600,1340=>600,1341=>600,1342=>600,1343=>600,1344=>600,1345=>600, +1346=>600,1347=>600,1348=>600,1349=>600,1350=>600,1351=>600,1352=>600,1353=>600,1354=>600,1355=>600, +1356=>600,1357=>600,1358=>600,1359=>600,1360=>600,1361=>600,1362=>600,1363=>600,1364=>600,1365=>600, +1366=>600,1369=>600,1370=>600,1371=>600,1372=>600,1373=>600,1374=>600,1375=>600,1377=>600,1378=>600, +1379=>600,1380=>600,1381=>600,1382=>600,1383=>600,1384=>600,1385=>600,1386=>600,1387=>600,1388=>600, +1389=>600,1390=>600,1391=>600,1392=>600,1393=>600,1394=>600,1395=>600,1396=>600,1397=>600,1398=>600, +1399=>600,1400=>600,1401=>600,1402=>600,1403=>600,1404=>600,1405=>600,1406=>600,1407=>600,1408=>600, +1409=>600,1410=>600,1411=>600,1412=>600,1413=>600,1414=>600,1415=>600,1417=>600,1418=>600,1456=>0, +1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1467=>0, +1468=>0,1469=>0,1470=>600,1471=>0,1472=>600,1473=>0,1474=>0,1475=>600,1476=>0,1488=>600, +1489=>600,1490=>600,1491=>600,1492=>600,1493=>600,1494=>600,1495=>600,1496=>600,1497=>600,1498=>600, +1499=>600,1500=>600,1501=>600,1502=>600,1503=>600,1504=>600,1505=>600,1506=>600,1507=>600,1508=>600, +1509=>600,1510=>600,1511=>600,1512=>600,1513=>600,1514=>600,1520=>600,1521=>600,1522=>600,1523=>600, +1524=>600,4304=>600,4305=>600,4306=>600,4307=>600,4308=>600,4309=>600,4310=>600,4311=>600,4312=>600, +4313=>600,4314=>600,4315=>600,4316=>600,4317=>600,4318=>600,4319=>600,4320=>600,4321=>600,4322=>600, +4323=>600,4324=>600,4325=>600,4326=>600,4327=>600,4328=>600,4329=>600,4330=>600,4331=>600,4332=>600, +4333=>600,4334=>600,4335=>600,4336=>600,4337=>600,4338=>600,4339=>600,4340=>600,4341=>600,4345=>600, +4347=>600,7680=>600,7681=>600,7682=>600,7683=>600,7684=>600,7685=>600,7686=>600,7687=>600,7688=>600, +7689=>600,7690=>600,7691=>600,7692=>600,7693=>600,7694=>600,7695=>600,7696=>600,7697=>600,7698=>600, +7699=>600,7700=>600,7701=>600,7702=>600,7703=>600,7704=>600,7705=>600,7706=>600,7707=>600,7708=>600, +7709=>600,7710=>600,7711=>600,7712=>600,7713=>600,7714=>600,7715=>600,7716=>600,7717=>600,7718=>600, +7719=>600,7720=>600,7721=>600,7722=>600,7723=>600,7724=>600,7725=>600,7726=>600,7727=>600,7728=>600, +7729=>600,7730=>600,7731=>600,7732=>600,7733=>600,7734=>600,7735=>600,7736=>600,7737=>600,7738=>600, +7739=>600,7740=>600,7741=>600,7742=>600,7743=>600,7744=>600,7745=>600,7746=>600,7747=>600,7748=>600, +7749=>600,7750=>600,7751=>600,7752=>600,7753=>600,7754=>600,7755=>600,7756=>600,7757=>600,7758=>600, +7759=>600,7760=>600,7761=>600,7762=>600,7763=>600,7764=>600,7765=>600,7766=>600,7767=>600,7768=>600, +7769=>600,7770=>600,7771=>600,7772=>600,7773=>600,7774=>600,7775=>600,7776=>600,7777=>600,7778=>600, +7779=>600,7780=>600,7781=>600,7782=>600,7783=>600,7784=>600,7785=>600,7786=>600,7787=>600,7788=>600, +7789=>600,7790=>600,7791=>600,7792=>600,7793=>600,7794=>600,7795=>600,7796=>600,7797=>600,7798=>600, +7799=>600,7800=>600,7801=>600,7802=>600,7803=>600,7804=>600,7805=>600,7806=>600,7807=>600,7808=>600, +7809=>600,7810=>600,7811=>600,7812=>600,7813=>600,7814=>600,7815=>600,7816=>600,7817=>600,7818=>600, +7819=>600,7820=>600,7821=>600,7822=>600,7823=>600,7824=>600,7825=>600,7826=>600,7827=>600,7828=>600, +7829=>600,7830=>600,7831=>600,7832=>600,7833=>600,7834=>600,7835=>600,7840=>600,7841=>600,7842=>600, +7843=>600,7844=>600,7845=>600,7846=>600,7847=>600,7848=>600,7849=>600,7850=>600,7851=>600,7852=>600, +7853=>600,7854=>600,7855=>600,7856=>600,7857=>600,7858=>600,7859=>600,7860=>600,7861=>600,7862=>600, +7863=>600,7864=>600,7865=>600,7866=>600,7867=>600,7868=>600,7869=>600,7870=>600,7871=>600,7872=>600, +7873=>600,7874=>600,7875=>600,7876=>600,7877=>600,7878=>600,7879=>600,7880=>600,7881=>600,7882=>600, +7883=>600,7884=>600,7885=>600,7886=>600,7887=>600,7888=>600,7889=>600,7890=>600,7891=>600,7892=>600, +7893=>600,7894=>600,7895=>600,7896=>600,7897=>600,7898=>600,7899=>600,7900=>600,7901=>600,7902=>600, +7903=>600,7904=>600,7905=>600,7906=>600,7907=>600,7908=>600,7909=>600,7910=>600,7911=>600,7912=>600, +7913=>600,7914=>600,7915=>600,7916=>600,7917=>600,7918=>600,7919=>600,7920=>600,7921=>600,7922=>600, +7923=>600,7924=>600,7925=>600,7926=>600,7927=>600,7928=>600,7929=>600,7936=>600,7937=>600,7938=>600, +7939=>600,7940=>600,7941=>600,7942=>600,7943=>600,7944=>600,7945=>600,7946=>600,7947=>600,7948=>600, +7949=>600,7950=>600,7951=>600,7952=>600,7953=>600,7954=>600,7955=>600,7956=>600,7957=>600,7960=>600, +7961=>600,7962=>600,7963=>600,7964=>600,7965=>600,7968=>600,7969=>600,7970=>600,7971=>600,7972=>600, +7973=>600,7974=>600,7975=>600,7976=>600,7977=>600,7978=>600,7979=>600,7980=>600,7981=>600,7982=>600, +7983=>600,7984=>600,7985=>600,7986=>600,7987=>600,7988=>600,7989=>600,7990=>600,7991=>600,7992=>600, +7993=>600,7994=>600,7995=>600,7996=>600,7997=>600,7998=>600,7999=>600,8000=>600,8001=>600,8002=>600, +8003=>600,8004=>600,8005=>600,8008=>600,8009=>600,8010=>600,8011=>600,8012=>600,8013=>600,8016=>600, +8017=>600,8018=>600,8019=>600,8020=>600,8021=>600,8022=>600,8023=>600,8025=>600,8027=>600,8029=>600, +8031=>600,8032=>600,8033=>600,8034=>600,8035=>600,8036=>600,8037=>600,8038=>600,8039=>600,8040=>600, +8041=>600,8042=>600,8043=>600,8044=>600,8045=>600,8046=>600,8047=>600,8048=>600,8049=>600,8050=>600, +8051=>600,8052=>600,8053=>600,8054=>600,8055=>600,8056=>600,8057=>600,8058=>600,8059=>600,8060=>600, +8061=>600,8064=>600,8065=>600,8066=>600,8067=>600,8068=>600,8069=>600,8070=>600,8071=>600,8072=>600, +8073=>600,8074=>600,8075=>600,8076=>600,8077=>600,8078=>600,8079=>600,8080=>600,8081=>600,8082=>600, +8083=>600,8084=>600,8085=>600,8086=>600,8087=>600,8088=>600,8089=>600,8090=>600,8091=>600,8092=>600, +8093=>600,8094=>600,8095=>600,8096=>600,8097=>600,8098=>600,8099=>600,8100=>600,8101=>600,8102=>600, +8103=>600,8104=>600,8105=>600,8106=>600,8107=>600,8108=>600,8109=>600,8110=>600,8111=>600,8112=>600, +8113=>600,8114=>600,8115=>600,8116=>600,8118=>600,8119=>600,8120=>600,8121=>600,8122=>600,8123=>600, +8124=>600,8125=>600,8126=>600,8127=>600,8128=>600,8129=>600,8130=>600,8131=>600,8132=>600,8134=>600, +8135=>600,8136=>600,8137=>600,8138=>600,8139=>600,8140=>600,8141=>600,8142=>600,8143=>600,8144=>600, +8145=>600,8146=>600,8147=>600,8150=>600,8151=>600,8152=>600,8153=>600,8154=>600,8155=>600,8157=>600, +8158=>600,8159=>600,8160=>600,8161=>600,8162=>600,8163=>600,8164=>600,8165=>600,8166=>600,8167=>600, +8168=>600,8169=>600,8170=>600,8171=>600,8172=>600,8173=>600,8174=>600,8175=>600,8178=>600,8179=>600, +8180=>600,8182=>600,8183=>600,8184=>600,8185=>600,8186=>600,8187=>600,8188=>600,8189=>600,8190=>600, +8192=>600,8193=>600,8194=>600,8195=>600,8196=>600,8197=>600,8198=>600,8199=>600,8200=>600,8201=>600, +8202=>600,8203=>600,8204=>0,8205=>0,8206=>0,8207=>0,8208=>600,8209=>600,8210=>600,8213=>600, +8214=>600,8215=>600,8219=>600,8223=>600,8227=>600,8228=>600,8229=>600,8231=>600,8232=>600,8233=>600, +8234=>600,8235=>600,8236=>600,8237=>600,8238=>600,8239=>600,8241=>600,8242=>600,8243=>600,8244=>600, +8245=>600,8246=>600,8247=>600,8248=>600,8251=>600,8252=>600,8253=>600,8254=>600,8255=>600,8256=>600, +8257=>600,8258=>600,8259=>600,8260=>600,8261=>600,8262=>600,8263=>600,8264=>600,8265=>600,8266=>600, +8267=>600,8268=>600,8269=>600,8270=>600,8271=>600,8272=>600,8273=>600,8274=>600,8275=>600,8276=>600, +8277=>600,8278=>600,8279=>600,8280=>600,8281=>600,8282=>600,8283=>600,8284=>600,8285=>600,8286=>600, +8287=>600,8288=>600,8289=>600,8290=>600,8291=>600,8292=>600,8298=>600,8299=>600,8300=>600,8301=>600, +8302=>600,8303=>600,8304=>600,8305=>600,8308=>600,8309=>600,8310=>600,8311=>600,8312=>600,8313=>600, +8314=>600,8315=>600,8316=>600,8317=>600,8318=>600,8319=>600,8320=>600,8321=>600,8322=>600,8323=>600, +8324=>600,8325=>600,8326=>600,8327=>600,8328=>600,8329=>600,8330=>600,8331=>600,8332=>600,8333=>600, +8334=>600,8336=>600,8337=>600,8338=>600,8339=>600,8340=>600,8355=>600,8356=>600,8359=>600,8362=>600, +8373=>600,8448=>600,8449=>600,8450=>600,8451=>600,8453=>600,8454=>600,8455=>600,8457=>600,8461=>600, +8464=>600,8465=>600,8466=>600,8467=>600,8468=>600,8469=>600,8470=>600,8471=>600,8472=>600,8473=>600, +8474=>600,8476=>600,8477=>600,8478=>600,8481=>600,8484=>600,8486=>600,8487=>600,8489=>600,8490=>600, +8491=>600,8498=>600,8501=>600,8502=>600,8503=>600,8504=>600,8506=>600,8507=>600,8523=>600,8525=>600, +8526=>600,8531=>600,8532=>600,8533=>600,8534=>600,8535=>600,8536=>600,8537=>600,8538=>600,8539=>600, +8540=>600,8541=>600,8542=>600,8543=>600,8544=>600,8545=>600,8546=>600,8547=>600,8548=>600,8549=>600, +8550=>600,8551=>600,8552=>600,8553=>600,8554=>600,8555=>600,8556=>600,8557=>600,8558=>600,8559=>600, +8560=>600,8561=>600,8562=>600,8563=>600,8564=>600,8565=>600,8566=>600,8567=>600,8568=>600,8569=>600, +8570=>600,8571=>600,8572=>600,8573=>600,8574=>600,8575=>600,8592=>600,8593=>600,8594=>600,8595=>600, +8596=>600,8597=>600,8598=>600,8599=>600,8600=>600,8601=>600,8616=>600,8704=>600,8706=>600,8707=>600, +8709=>600,8710=>600,8711=>600,8712=>600,8713=>600,8715=>600,8716=>600,8721=>600,8722=>600,8723=>600, +8725=>600,8729=>600,8730=>600,8733=>600,8734=>600,8745=>600,8746=>600,8747=>600,8756=>600,8764=>600, +8769=>600,8770=>600,8773=>600,8776=>600,8800=>600,8801=>600,8804=>600,8805=>600,8834=>600,8835=>600, +8836=>600,8837=>600,8838=>600,8839=>600,9001=>600,9002=>600,9251=>600,9674=>600,9824=>600,9825=>600, +9826=>600,9827=>600,9828=>600,9829=>600,9830=>600,9831=>600,9833=>600,9834=>600,9835=>600,9836=>600, +9837=>600,9838=>600,9839=>600,64256=>600,64257=>600,64258=>600,64285=>600,64286=>600,64287=>600,64288=>600, +64289=>600,64290=>600,64291=>600,64292=>600,64293=>600,64294=>600,64295=>600,64296=>600,64297=>600,64298=>600, +64299=>600,64300=>600,64301=>600,64302=>600,64303=>600,64304=>600,64305=>600,64306=>600,64307=>600,64308=>600, +64309=>600,64310=>600,64312=>600,64313=>600,64314=>600,64315=>600,64316=>600,64318=>600,64320=>600,64321=>600, +64323=>600,64324=>600,64326=>600,64327=>600,64328=>600,64329=>600,64330=>600,64331=>600,64332=>600,64333=>600, +64334=>600,64335=>600,65533=>600); +$enc=''; +$diff=''; +$file='freemonoi.z'; +$ctg='freemonoi.ctg.z'; +$originalsize=196732; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonoi.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonoi.z new file mode 100644 index 0000000..93bf7d3 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freemonoi.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freesans.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesans.ctg.z new file mode 100644 index 0000000..b3bf68c Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesans.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freesans.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesans.php new file mode 100644 index 0000000..d10a321 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesans.php @@ -0,0 +1,311 @@ +<?php +$type='TrueTypeUnicode'; +$name='FreeSans'; +$desc=array('Ascent'=>1000,'Descent'=>-300,'CapHeight'=>22,'Flags'=>32,'FontBBox'=>'[-958 -550 1632 1050]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>600); +$up=-176; +$ut=50; +$dw=600; +$cw=array( +32=>278,33=>278,34=>355,35=>556,36=>556,37=>889,38=>667,39=>191,40=>333,41=>333, +42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556, +52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>278,59=>278,60=>584,61=>584, +62=>584,63=>556,64=>1015,65=>667,66=>667,67=>722,68=>722,69=>667,70=>611,71=>778, +72=>722,73=>278,74=>500,75=>667,76=>556,77=>833,78=>722,79=>778,80=>667,81=>778, +82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>278, +92=>278,93=>277,94=>469,95=>556,96=>333,97=>556,98=>556,99=>500,100=>556,101=>556, +102=>278,103=>556,104=>556,105=>222,106=>222,107=>500,108=>222,109=>833,110=>556,111=>556, +112=>556,113=>556,114=>333,115=>500,116=>278,117=>556,118=>500,119=>722,120=>500,121=>500, +122=>500,123=>334,124=>260,125=>334,126=>584,8364=>655,8218=>222,402=>278,8222=>333,8230=>1000, +8224=>556,8225=>556,710=>333,8240=>1000,352=>667,8249=>250,338=>1000,381=>611,8216=>222,8217=>221, +8220=>333,8221=>333,8226=>350,8211=>556,8212=>1000,732=>333,8482=>1000,353=>500,8250=>250,339=>944, +382=>500,376=>667,160=>278,161=>278,162=>556,163=>556,164=>556,165=>556,166=>260,167=>556, +168=>333,169=>737,170=>370,171=>448,172=>584,173=>333,174=>737,175=>333,176=>606,177=>584, +178=>350,179=>350,180=>333,181=>556,182=>537,183=>278,184=>333,185=>350,186=>365,187=>448, +188=>869,189=>869,190=>869,191=>556,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667, +198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278, +208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722, +218=>722,219=>722,220=>722,221=>667,222=>666,223=>611,224=>556,225=>556,226=>556,227=>556, +228=>556,229=>556,230=>889,231=>500,232=>556,233=>556,234=>556,235=>556,236=>278,237=>278, +238=>278,239=>278,240=>556,241=>556,242=>556,243=>556,244=>556,245=>556,246=>556,247=>584, +248=>611,249=>556,250=>556,251=>556,252=>556,253=>500,254=>555,255=>500,256=>667,257=>556, +258=>667,259=>556,260=>667,261=>556,262=>722,263=>500,264=>722,265=>500,266=>722,267=>500, +268=>722,269=>500,270=>722,271=>722,272=>722,273=>556,274=>667,275=>556,276=>667,277=>556, +278=>667,279=>556,280=>667,281=>556,282=>667,283=>556,284=>778,285=>556,286=>778,287=>556, +288=>778,289=>556,290=>778,291=>556,292=>722,293=>556,294=>722,295=>556,296=>278,297=>278, +298=>278,299=>278,300=>278,301=>278,302=>278,303=>222,304=>278,305=>278,306=>700,307=>374, +308=>500,309=>222,310=>667,311=>500,312=>500,313=>556,314=>222,315=>556,316=>222,317=>556, +318=>387,319=>556,320=>500,321=>556,322=>222,323=>722,324=>556,325=>722,326=>556,327=>722, +328=>556,329=>722,330=>722,331=>556,332=>778,333=>556,334=>778,335=>556,336=>778,337=>556, +340=>722,341=>333,342=>722,343=>333,344=>722,345=>333,346=>667,347=>500,348=>667,349=>500, +350=>667,351=>500,354=>611,355=>278,356=>611,357=>443,358=>611,359=>278,360=>722,361=>556, +362=>722,363=>556,364=>722,365=>556,366=>722,367=>556,368=>722,369=>556,370=>722,371=>556, +372=>944,373=>722,374=>667,375=>500,377=>611,378=>500,379=>611,380=>500,383=>278,384=>556, +385=>854,386=>668,387=>556,388=>667,389=>556,390=>722,391=>722,392=>500,393=>722,394=>899, +395=>667,396=>556,397=>564,398=>667,399=>722,400=>667,401=>611,403=>778,404=>667,405=>889, +406=>278,407=>333,408=>667,409=>500,410=>333,411=>560,412=>833,413=>722,414=>556,415=>778, +416=>788,417=>565,418=>944,419=>722,420=>842,421=>556,422=>666,423=>667,424=>500,425=>611, +426=>333,427=>278,428=>611,429=>278,430=>611,431=>776,432=>624,433=>778,434=>722,435=>722, +436=>556,437=>611,438=>500,439=>611,440=>611,441=>500,442=>500,443=>556,446=>556,447=>556, +448=>260,449=>370,450=>584,451=>278,452=>1311,453=>1208,454=>1056,455=>1056,456=>778,457=>444, +458=>1158,459=>944,460=>778,461=>667,462=>556,463=>278,464=>278,465=>778,466=>556,467=>722, +468=>556,469=>722,470=>556,471=>722,472=>556,473=>722,474=>556,475=>722,476=>556,477=>556, +478=>667,479=>556,480=>667,481=>556,482=>1000,483=>889,484=>778,485=>556,486=>778,487=>556, +488=>667,489=>500,490=>778,491=>556,492=>778,493=>556,494=>611,495=>500,496=>222,497=>1333, +498=>1222,499=>1056,500=>778,501=>556,503=>630,504=>722,505=>556,506=>667,507=>556,508=>1000, +509=>889,510=>778,511=>611,512=>667,513=>556,514=>667,515=>556,516=>667,517=>556,518=>667, +519=>556,520=>278,521=>278,522=>278,523=>278,524=>778,525=>556,526=>778,527=>556,528=>722, +529=>333,530=>722,531=>333,532=>722,533=>556,534=>722,535=>556,536=>667,537=>500,538=>611, +539=>278,540=>521,541=>393,542=>722,543=>556,548=>611,549=>500,550=>667,551=>556,552=>667, +553=>556,554=>778,555=>556,556=>778,557=>556,558=>778,559=>556,560=>778,561=>556,562=>667, +563=>500,567=>222,592=>556,593=>556,594=>556,595=>556,596=>500,597=>500,598=>556,599=>556, +600=>556,601=>556,602=>804,603=>500,604=>499,605=>742,606=>500,607=>222,608=>556,609=>556, +610=>546,611=>500,612=>556,613=>556,614=>556,615=>556,616=>222,617=>222,618=>278,619=>473, +620=>427,621=>222,622=>611,623=>833,624=>833,625=>833,626=>556,627=>556,628=>567,629=>556, +630=>778,631=>722,632=>741,633=>333,634=>333,635=>333,636=>333,637=>333,638=>384,639=>369, +640=>546,641=>546,642=>500,643=>278,644=>278,645=>278,646=>444,647=>278,648=>278,649=>556, +650=>626,651=>539,652=>500,653=>722,654=>500,655=>556,656=>500,657=>500,658=>500,659=>552, +660=>556,661=>556,662=>556,663=>722,664=>778,665=>506,666=>500,667=>546,668=>558,669=>444, +670=>500,671=>430,672=>556,673=>556,674=>556,675=>944,676=>944,677=>944,678=>689,679=>506, +680=>764,681=>766,682=>660,683=>577,684=>530,685=>486,686=>565,687=>621,688=>333,689=>333, +690=>167,691=>236,692=>236,693=>276,694=>359,695=>500,696=>330,697=>278,698=>454,699=>278, +700=>278,701=>278,702=>333,703=>333,704=>333,705=>333,706=>333,707=>333,708=>333,709=>333, +711=>333,712=>333,713=>333,714=>333,715=>333,716=>272,717=>333,718=>333,719=>333,720=>333, +721=>333,722=>333,723=>333,724=>333,725=>333,726=>333,727=>333,728=>333,729=>333,730=>333, +731=>333,733=>333,734=>333,735=>510,736=>333,737=>186,738=>333,739=>333,740=>334,741=>526, +742=>526,743=>526,744=>526,745=>526,746=>519,747=>519,748=>333,749=>333,750=>333,751=>333, +752=>333,753=>333,754=>333,755=>327,756=>261,757=>437,758=>437,759=>333,760=>278,761=>200, +762=>200,763=>200,764=>200,765=>333,766=>333,767=>333,768=>0,769=>0,770=>0,771=>0, +772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0, +782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0, +792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0, +802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0, +812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0, +822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0, +832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0, +842=>0,843=>0,844=>0,845=>0,846=>0,847=>0,848=>0,849=>0,850=>0,851=>0, +852=>0,853=>0,854=>0,855=>0,856=>0,857=>0,858=>0,859=>0,860=>0,861=>0, +862=>0,863=>0,864=>0,865=>0,866=>0,867=>0,868=>0,869=>0,870=>0,871=>0, +872=>0,873=>0,874=>0,875=>0,876=>0,877=>0,878=>0,879=>0,884=>278,885=>199, +890=>332,894=>278,900=>333,901=>333,902=>667,903=>275,904=>786,905=>828,906=>369,908=>833, +910=>845,911=>778,912=>286,913=>667,914=>667,915=>582,916=>778,917=>667,918=>628,919=>722, +920=>778,921=>278,922=>667,923=>667,924=>833,925=>722,926=>630,927=>778,928=>722,929=>667, +931=>628,932=>611,933=>667,934=>717,935=>667,936=>745,937=>778,938=>278,939=>667,940=>608, +941=>528,942=>548,943=>307,944=>538,945=>596,946=>542,947=>531,948=>564,949=>512,950=>455, +951=>548,952=>525,953=>286,954=>510,955=>551,956=>540,957=>500,958=>470,959=>546,960=>619, +961=>569,962=>547,963=>620,964=>492,965=>538,966=>741,967=>571,968=>662,969=>740,970=>286, +971=>538,972=>546,973=>538,974=>740,977=>580,978=>742,979=>845,980=>620,981=>741,982=>740, +983=>556,1008=>556,1009=>566,1012=>778,1013=>328,1024=>667,1025=>657,1026=>766,1027=>582,1028=>722, +1029=>667,1030=>278,1031=>278,1032=>500,1033=>1080,1034=>1014,1035=>766,1036=>628,1037=>730,1038=>613, +1039=>722,1040=>666,1041=>668,1042=>668,1043=>582,1044=>812,1045=>657,1046=>905,1047=>667,1048=>730, +1049=>730,1050=>632,1051=>674,1052=>846,1053=>721,1054=>796,1055=>721,1056=>654,1057=>722,1058=>611, +1059=>613,1060=>861,1061=>657,1062=>742,1063=>626,1064=>830,1065=>851,1066=>841,1067=>874,1068=>670, +1069=>717,1070=>1001,1071=>686,1072=>552,1073=>550,1074=>506,1075=>404,1076=>602,1077=>547,1078=>755, +1079=>499,1080=>567,1081=>567,1082=>489,1083=>517,1084=>618,1085=>558,1086=>550,1087=>557,1088=>577, +1089=>520,1090=>444,1091=>468,1092=>865,1093=>466,1094=>578,1095=>498,1096=>692,1097=>712,1098=>664, +1099=>690,1100=>521,1101=>520,1102=>759,1103=>543,1104=>549,1105=>549,1106=>577,1107=>404,1108=>519, +1109=>502,1110=>224,1111=>278,1112=>223,1113=>813,1114=>853,1115=>577,1116=>489,1117=>567,1118=>468, +1119=>558,1120=>942,1121=>693,1136=>762,1137=>662,1138=>800,1139=>550,1148=>942,1149=>693,1150=>942, +1151=>693,1154=>468,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>0,1161=>0,1162=>763, +1163=>583,1164=>689,1165=>526,1166=>652,1167=>572,1168=>601,1169=>397,1170=>589,1171=>392,1172=>591, +1173=>475,1174=>927,1175=>830,1176=>661,1177=>493,1178=>658,1179=>510,1180=>675,1181=>519,1182=>684, +1183=>514,1184=>839,1185=>653,1186=>740,1187=>570,1188=>987,1189=>714,1190=>1058,1191=>808,1192=>722, +1193=>510,1194=>722,1195=>516,1196=>611,1197=>402,1198=>668,1199=>578,1200=>668,1201=>588,1202=>664, +1203=>488,1204=>936,1205=>679,1206=>638,1207=>521,1208=>630,1209=>498,1210=>630,1211=>498,1212=>927, +1213=>699,1214=>919,1215=>703,1216=>254,1217=>905,1218=>755,1219=>668,1220=>512,1221=>696,1222=>524, +1223=>721,1224=>558,1225=>744,1226=>571,1227=>630,1228=>498,1229=>869,1230=>631,1231=>254,1232=>666, +1233=>552,1234=>666,1235=>552,1236=>1000,1237=>879,1238=>657,1239=>547,1240=>722,1241=>543,1242=>722, +1243=>543,1244=>905,1245=>755,1246=>667,1247=>499,1248=>611,1249=>540,1250=>730,1251=>567,1252=>730, +1253=>567,1254=>796,1255=>550,1256=>800,1257=>550,1258=>800,1259=>550,1260=>717,1261=>520,1262=>613, +1263=>468,1264=>613,1265=>468,1266=>613,1267=>468,1268=>626,1269=>498,1270=>582,1271=>395,1272=>874, +1273=>690,1296=>667,1297=>491,1298=>665,1299=>509,1306=>778,1307=>575,1308=>934,1309=>712,1310=>627, +1311=>489,1329=>720,1330=>696,1331=>750,1332=>725,1333=>699,1334=>751,1335=>446,1336=>703,1337=>790, +1338=>656,1339=>697,1340=>390,1341=>852,1342=>791,1343=>698,1344=>585,1345=>656,1346=>651,1347=>658, +1348=>759,1349=>595,1350=>772,1351=>603,1352=>703,1353=>648,1354=>698,1355=>744,1356=>738,1357=>703, +1358=>739,1359=>660,1360=>693,1361=>623,1362=>385,1363=>788,1364=>632,1365=>775,1366=>714,1369=>333, +1370=>222,1371=>200,1372=>333,1373=>333,1374=>333,1375=>333,1377=>833,1378=>551,1379=>572,1380=>569, +1381=>546,1382=>581,1383=>353,1384=>551,1385=>568,1386=>569,1387=>552,1388=>276,1389=>795,1390=>535, +1391=>553,1392=>537,1393=>512,1394=>568,1395=>552,1396=>531,1397=>249,1398=>527,1399=>405,1400=>551, +1401=>390,1402=>833,1403=>509,1404=>523,1405=>545,1406=>584,1407=>879,1408=>552,1409=>552,1410=>301, +1411=>884,1412=>578,1413=>556,1414=>668,1415=>544,1417=>278,1418=>333,1456=>0,1457=>0,1458=>0, +1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1467=>0,1468=>0,1469=>0, +1470=>488,1471=>0,1472=>212,1473=>0,1474=>0,1475=>278,1476=>0,1488=>640,1489=>591,1490=>466, +1491=>598,1492=>622,1493=>212,1494=>351,1495=>623,1496=>608,1497=>200,1498=>526,1499=>550,1500=>600, +1501=>623,1502=>621,1503=>212,1504=>378,1505=>607,1506=>587,1507=>575,1508=>568,1509=>540,1510=>590, +1511=>606,1512=>547,1513=>776,1514=>687,1520=>424,1521=>412,1522=>400,1523=>184,1524=>344,1792=>600, +1793=>201,1794=>201,1795=>201,1796=>201,1797=>500,1798=>500,1799=>500,1800=>370,1801=>370,1802=>574, +1803=>574,1804=>645,1805=>574,1807=>0,1808=>452,1809=>452,1810=>574,1811=>645,1812=>645,1813=>509, +1814=>509,1815=>682,1816=>585,1817=>404,1818=>627,1819=>718,1820=>718,1821=>484,1822=>682,1823=>600, +1824=>660,1825=>682,1826=>538,1827=>718,1828=>718,1829=>718,1830=>574,1831=>574,1832=>638,1833=>585, +1834=>509,1835=>682,1836=>682,1840=>0,1841=>0,1842=>0,1843=>0,1844=>0,1845=>0,1846=>0, +1847=>0,1848=>0,1849=>0,1850=>0,1851=>0,1852=>0,1853=>0,1854=>0,1855=>0,1856=>0, +1857=>0,1858=>0,1859=>0,1860=>0,1861=>0,1862=>0,1863=>0,1864=>0,1865=>0,1866=>0, +2305=>6,2306=>0,2307=>305,2308=>717,2309=>717,2310=>829,2311=>463,2312=>463,2313=>581,2314=>803, +2315=>920,2316=>639,2317=>430,2318=>430,2319=>430,2320=>430,2321=>856,2322=>828,2323=>837,2324=>856, +2325=>749,2326=>779,2327=>522,2328=>587,2329=>650,2330=>619,2331=>641,2332=>703,2333=>691,2334=>677, +2335=>568,2336=>529,2337=>611,2338=>536,2339=>607,2340=>564,2341=>659,2342=>500,2343=>591,2344=>521, +2345=>568,2346=>477,2347=>728,2348=>490,2349=>577,2350=>517,2351=>554,2352=>433,2353=>433,2354=>656, +2355=>660,2356=>660,2357=>490,2358=>645,2359=>477,2360=>666,2361=>484,2364=>6,2365=>442,2366=>211, +2367=>211,2368=>211,2369=>6,2370=>3,2371=>6,2372=>0,2373=>6,2374=>84,2375=>6,2376=>6, +2377=>224,2378=>234,2379=>211,2380=>211,2381=>6,2384=>839,2385=>15,2386=>0,2387=>9,2388=>9, +2392=>750,2393=>779,2394=>522,2395=>703,2396=>613,2397=>536,2398=>728,2399=>554,2400=>899,2401=>625, +2402=>625,2403=>625,2404=>674,2405=>674,2406=>575,2407=>575,2408=>575,2409=>575,2410=>575,2411=>575, +2412=>575,2413=>575,2414=>575,2415=>575,2416=>365,2417=>387,2418=>717,2433=>0,2434=>300,2435=>264, +2437=>594,2438=>790,2439=>469,2440=>513,2441=>520,2442=>549,2443=>594,2444=>481,2447=>580,2448=>627, +2451=>540,2452=>613,2453=>570,2454=>467,2455=>471,2456=>428,2457=>483,2458=>408,2459=>509,2460=>591, +2461=>563,2462=>771,2463=>381,2464=>404,2465=>522,2466=>408,2467=>450,2468=>543,2469=>477,2470=>418, +2471=>433,2472=>445,2474=>499,2475=>584,2476=>377,2477=>555,2478=>448,2479=>423,2480=>390,2482=>498, +2486=>498,2487=>425,2488=>495,2489=>440,2492=>22,2493=>440,2494=>193,2495=>189,2496=>180,2497=>0, +2498=>0,2499=>0,2500=>0,2503=>252,2504=>243,2507=>889,2508=>865,2509=>0,2510=>356,2519=>219, +2524=>523,2525=>408,2527=>428,2528=>594,2529=>481,2530=>0,2531=>0,2534=>500,2535=>437,2536=>479, +2537=>530,2538=>497,2539=>500,2540=>482,2541=>503,2542=>517,2543=>481,2544=>377,2545=>377,2546=>429, +2547=>383,2548=>429,2549=>478,2550=>545,2551=>158,2552=>365,2553=>280,2554=>357,2561=>0,2562=>0, +2563=>351,2565=>860,2566=>1088,2567=>869,2568=>928,2569=>723,2570=>723,2575=>665,2576=>857,2579=>716, +2580=>858,2581=>682,2582=>634,2583=>696,2584=>744,2585=>649,2586=>674,2587=>656,2588=>653,2589=>629, +2590=>639,2591=>641,2592=>657,2593=>650,2594=>653,2595=>651,2596=>640,2597=>634,2598=>662,2599=>630, +2600=>625,2602=>645,2603=>653,2604=>624,2605=>613,2606=>658,2607=>734,2608=>620,2610=>676,2611=>719, +2613=>626,2614=>666,2616=>666,2617=>614,2620=>0,2622=>286,2623=>322,2624=>301,2625=>0,2626=>0, +2631=>0,2632=>0,2635=>0,2636=>0,2637=>0,2649=>636,2650=>762,2651=>652,2652=>653,2654=>656, +2662=>672,2663=>543,2664=>622,2665=>622,2666=>576,2667=>589,2668=>509,2669=>645,2670=>661,2671=>655, +2672=>0,2673=>0,2674=>666,2675=>726,2676=>1217,2689=>22,2690=>23,2691=>0,2693=>775,2694=>979, +2695=>588,2696=>563,2697=>525,2698=>724,2699=>942,2701=>775,2703=>775,2704=>775,2705=>979,2707=>979, +2708=>979,2709=>610,2710=>706,2711=>623,2712=>610,2713=>601,2714=>614,2715=>642,2716=>684,2717=>634, +2718=>644,2719=>509,2720=>541,2721=>539,2722=>524,2723=>657,2724=>547,2725=>616,2726=>494,2727=>601, +2728=>627,2730=>524,2731=>620,2732=>691,2733=>687,2734=>468,2735=>590,2736=>509,2738=>571,2739=>687, +2741=>526,2742=>620,2743=>575,2744=>620,2745=>549,2748=>53,2749=>415,2750=>241,2751=>186,2752=>217, +2753=>32,2754=>21,2755=>38,2756=>27,2757=>45,2759=>41,2760=>46,2761=>207,2763=>190,2764=>182, +2765=>16,2768=>962,2784=>949,2790=>479,2791=>502,2792=>484,2793=>471,2794=>501,2795=>527,2796=>462, +2797=>524,2798=>454,2799=>495,2801=>752,2946=>479,2947=>893,2949=>1018,2950=>1170,2951=>916,2952=>676, +2953=>836,2954=>1225,2958=>744,2959=>744,2960=>848,2962=>813,2963=>813,2964=>813,2965=>688,2969=>744, +2970=>676,2972=>848,2974=>984,2975=>777,2979=>1338,2980=>664,2984=>561,2985=>1029,2986=>607,2990=>697, +2991=>697,2992=>434,2993=>617,2994=>869,2995=>859,2996=>697,2997=>869,2999=>1145,3000=>1064,3001=>1316, +3006=>424,3007=>125,3008=>596,3009=>539,3014=>596,3015=>650,3016=>973,3018=>1286,3019=>1286,3020=>1706, +3021=>333,3031=>859,3050=>778,3051=>881,3052=>876,3053=>648,3057=>744,4256=>587,4257=>620,4258=>642, +4259=>815,4260=>600,4261=>595,4262=>799,4263=>893,4264=>622,4265=>597,4266=>939,4267=>602,4268=>603, +4269=>790,4270=>587,4271=>623,4272=>799,4273=>601,4274=>792,4275=>724,4276=>847,4277=>599,4278=>812, +4279=>603,4280=>653,4281=>590,4282=>754,4283=>596,4284=>653,4285=>651,4286=>596,4287=>888,4288=>593, +4304=>436,4305=>491,4306=>528,4307=>692,4308=>447,4309=>447,4310=>628,4311=>734,4312=>449,4313=>445, +4314=>843,4315=>449,4316=>449,4317=>682,4318=>449,4319=>480,4320=>682,4321=>468,4322=>710,4323=>623, +4324=>697,4325=>447,4326=>702,4327=>447,4328=>470,4329=>440,4330=>632,4331=>449,4332=>470,4333=>536, +4334=>449,4335=>656,4336=>474,4337=>630,4338=>394,4339=>419,4340=>422,4341=>436,4345=>528,4347=>515, +7680=>667,7681=>556,7682=>667,7683=>556,7684=>667,7685=>556,7686=>667,7687=>556,7688=>722,7689=>500, +7690=>722,7691=>556,7692=>722,7693=>556,7694=>722,7695=>556,7696=>722,7697=>556,7698=>722,7699=>556, +7700=>667,7701=>556,7702=>667,7703=>556,7704=>667,7705=>556,7706=>667,7707=>556,7708=>667,7709=>556, +7710=>611,7711=>278,7712=>778,7713=>556,7714=>722,7715=>556,7716=>722,7717=>556,7718=>722,7719=>556, +7720=>722,7721=>556,7722=>722,7723=>556,7724=>278,7725=>222,7726=>278,7727=>278,7728=>667,7729=>500, +7730=>667,7731=>500,7732=>667,7733=>500,7734=>556,7735=>222,7736=>556,7737=>222,7738=>556,7739=>222, +7740=>556,7741=>222,7742=>833,7743=>833,7744=>833,7745=>833,7746=>833,7747=>833,7748=>722,7749=>556, +7750=>722,7751=>556,7752=>722,7753=>556,7754=>722,7755=>556,7756=>778,7757=>556,7758=>778,7759=>556, +7760=>778,7761=>556,7762=>778,7763=>556,7764=>667,7765=>556,7766=>667,7767=>556,7768=>722,7769=>333, +7770=>722,7771=>333,7772=>722,7773=>333,7774=>722,7775=>333,7776=>667,7777=>500,7778=>667,7779=>500, +7780=>667,7781=>500,7782=>667,7783=>500,7784=>667,7785=>500,7786=>611,7787=>278,7788=>611,7789=>278, +7790=>611,7791=>278,7792=>611,7793=>278,7794=>722,7795=>556,7796=>722,7797=>556,7798=>722,7799=>556, +7800=>722,7801=>556,7802=>722,7803=>556,7804=>667,7805=>500,7806=>667,7807=>500,7808=>944,7809=>722, +7810=>944,7811=>722,7812=>944,7813=>722,7814=>944,7815=>722,7816=>944,7817=>722,7818=>667,7819=>500, +7820=>667,7821=>500,7822=>667,7823=>500,7824=>611,7825=>500,7826=>611,7827=>500,7828=>611,7829=>500, +7830=>556,7831=>278,7832=>722,7833=>500,7834=>555,7835=>278,7840=>667,7841=>556,7842=>667,7843=>556, +7844=>667,7845=>556,7846=>667,7847=>556,7848=>667,7849=>556,7850=>667,7851=>556,7852=>667,7853=>556, +7854=>667,7855=>556,7856=>667,7857=>556,7858=>667,7859=>556,7860=>667,7861=>556,7862=>667,7863=>556, +7864=>667,7865=>556,7866=>667,7867=>556,7868=>667,7869=>556,7870=>667,7871=>556,7872=>667,7873=>556, +7874=>667,7875=>556,7876=>667,7877=>556,7878=>667,7879=>556,7880=>278,7881=>278,7882=>278,7883=>222, +7884=>778,7885=>556,7886=>778,7887=>556,7888=>778,7889=>556,7890=>778,7891=>556,7892=>778,7893=>556, +7894=>778,7895=>556,7896=>778,7897=>556,7898=>788,7899=>565,7900=>788,7901=>565,7902=>788,7903=>565, +7904=>788,7905=>565,7906=>788,7907=>565,7908=>722,7909=>556,7910=>722,7911=>556,7912=>776,7913=>624, +7914=>776,7915=>624,7916=>776,7917=>624,7918=>776,7919=>624,7920=>776,7921=>624,7922=>667,7923=>500, +7924=>667,7925=>500,7926=>667,7927=>500,7928=>667,7929=>500,7936=>596,7937=>596,7938=>596,7939=>596, +7940=>596,7941=>596,7942=>596,7943=>596,7944=>667,7945=>667,7946=>742,7947=>756,7948=>692,7949=>699, +7950=>673,7951=>667,7952=>512,7953=>512,7954=>512,7955=>512,7956=>512,7957=>512,7960=>730,7961=>714, +7962=>900,7963=>882,7964=>867,7965=>879,7968=>548,7969=>548,7970=>548,7971=>548,7972=>548,7973=>548, +7974=>548,7975=>548,7976=>772,7977=>778,7978=>945,7979=>947,7980=>943,7981=>946,7982=>853,7983=>853, +7984=>286,7985=>286,7986=>286,7987=>286,7988=>286,7989=>286,7990=>286,7991=>286,7992=>322,7993=>321, +7994=>482,7995=>485,7996=>477,7997=>484,7998=>394,7999=>390,8000=>546,8001=>546,8002=>546,8003=>546, +8004=>546,8005=>546,8008=>775,8009=>784,8010=>990,8011=>987,8012=>887,8013=>897,8016=>538,8017=>538, +8018=>538,8019=>538,8020=>538,8021=>538,8022=>538,8023=>538,8025=>747,8027=>915,8029=>971,8031=>863, +8032=>740,8033=>740,8034=>740,8035=>740,8036=>740,8037=>740,8038=>740,8039=>740,8040=>769,8041=>774, +8042=>972,8043=>970,8044=>879,8045=>918,8046=>901,8047=>901,8048=>596,8049=>596,8050=>512,8051=>512, +8052=>548,8053=>548,8054=>286,8055=>286,8056=>546,8057=>546,8058=>538,8059=>538,8060=>740,8061=>740, +8064=>596,8065=>596,8066=>596,8067=>596,8068=>596,8069=>596,8070=>596,8071=>596,8072=>830,8073=>828, +8074=>916,8075=>916,8076=>853,8077=>860,8078=>835,8079=>827,8080=>548,8081=>548,8082=>548,8083=>548, +8084=>548,8085=>548,8086=>548,8087=>548,8088=>928,8089=>931,8090=>1104,8091=>1109,8092=>1099,8093=>1102, +8094=>1009,8095=>1012,8096=>740,8097=>740,8098=>740,8099=>740,8100=>740,8101=>740,8102=>740,8103=>740, +8104=>934,8105=>934,8106=>1130,8107=>1128,8108=>1045,8109=>1077,8110=>1062,8111=>1065,8112=>596,8113=>596, +8114=>596,8115=>596,8116=>596,8118=>596,8119=>596,8120=>667,8121=>667,8122=>667,8123=>667,8124=>832, +8125=>333,8126=>200,8127=>333,8128=>333,8129=>333,8130=>548,8131=>548,8132=>548,8134=>548,8135=>548, +8136=>833,8137=>776,8138=>944,8139=>896,8140=>875,8141=>400,8142=>400,8143=>333,8144=>286,8145=>286, +8146=>286,8147=>286,8150=>286,8151=>286,8152=>278,8153=>278,8154=>385,8155=>376,8157=>400,8158=>400, +8159=>333,8160=>538,8161=>538,8162=>538,8163=>538,8164=>569,8165=>569,8166=>538,8167=>514,8168=>667, +8169=>667,8170=>817,8171=>827,8172=>741,8173=>393,8174=>393,8175=>333,8178=>740,8179=>740,8180=>740, +8182=>740,8183=>740,8184=>833,8185=>833,8186=>848,8187=>814,8188=>939,8189=>333,8190=>333,8192=>500, +8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>556,8200=>278,8201=>200,8202=>100, +8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>333,8209=>333,8210=>556,8213=>1000,8214=>312, +8215=>566,8219=>221,8223=>333,8227=>350,8228=>278,8229=>666,8231=>278,8232=>0,8233=>0,8234=>0, +8235=>0,8236=>0,8237=>0,8238=>0,8239=>500,8241=>1360,8242=>278,8243=>469,8244=>680,8245=>278, +8246=>469,8247=>680,8248=>376,8251=>622,8252=>556,8253=>556,8254=>556,8255=>658,8256=>658,8257=>438, +8258=>840,8259=>400,8260=>167,8261=>334,8262=>334,8263=>1112,8264=>834,8265=>834,8266=>556,8267=>537, +8268=>537,8269=>537,8270=>389,8271=>278,8272=>658,8273=>389,8274=>634,8275=>500,8276=>658,8277=>787, +8278=>515,8279=>855,8280=>722,8281=>725,8282=>224,8283=>722,8284=>604,8285=>224,8286=>224,8287=>0, +8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8304=>350,8305=>350,8308=>350,8309=>350,8310=>350, +8311=>350,8312=>350,8313=>350,8314=>350,8315=>350,8316=>350,8317=>350,8318=>350,8319=>350,8320=>350, +8321=>350,8322=>350,8323=>350,8324=>350,8325=>350,8326=>350,8327=>350,8328=>350,8329=>350,8330=>350, +8331=>350,8332=>350,8333=>350,8334=>350,8336=>350,8337=>349,8338=>350,8339=>350,8340=>350,8353=>615, +8354=>601,8355=>611,8356=>556,8357=>833,8358=>682,8359=>1317,8360=>1202,8361=>879,8362=>869,8363=>538, +8365=>667,8366=>611,8368=>570,8369=>684,8370=>717,8371=>667,8372=>667,8373=>640,8400=>0,8401=>0, +8402=>0,8403=>0,8406=>0,8407=>0,8411=>0,8412=>0,8413=>0,8414=>0,8415=>0,8416=>0, +8417=>0,8421=>0,8422=>0,8423=>0,8424=>0,8425=>0,8426=>0,8427=>0,8428=>0,8429=>0, +8430=>0,8431=>0,8432=>0,8448=>970,8449=>979,8451=>1017,8452=>556,8453=>876,8454=>922,8455=>667, +8457=>919,8459=>969,8460=>615,8462=>556,8463=>572,8464=>809,8465=>606,8466=>874,8467=>417,8468=>747, +8470=>934,8471=>737,8472=>600,8475=>850,8476=>699,8480=>1000,8481=>1230,8486=>778,8487=>778,8488=>512, +8489=>286,8490=>667,8491=>667,8492=>908,8493=>623,8494=>556,8495=>444,8496=>562,8497=>895,8498=>588, +8499=>1080,8501=>640,8502=>592,8503=>466,8504=>598,8505=>278,8506=>871,8507=>1230,8513=>778,8514=>556, +8515=>556,8516=>667,8522=>516,8523=>655,8525=>936,8526=>482,8531=>869,8532=>869,8533=>869,8534=>869, +8535=>869,8536=>869,8537=>869,8538=>869,8539=>869,8540=>869,8541=>869,8542=>869,8543=>869,8544=>278, +8545=>556,8546=>834,8547=>945,8548=>667,8549=>945,8550=>1223,8551=>1501,8552=>945,8553=>667,8554=>945, +8555=>1223,8556=>556,8557=>722,8558=>722,8559=>833,8560=>222,8561=>444,8562=>666,8563=>722,8564=>500, +8565=>722,8566=>944,8567=>1166,8568=>722,8569=>500,8570=>722,8571=>944,8572=>222,8573=>500,8574=>556, +8575=>833,8592=>987,8593=>603,8594=>987,8595=>603,8596=>1042,8597=>1042,8598=>800,8599=>800,8600=>800, +8601=>800,8614=>987,8617=>987,8618=>987,8629=>658,8636=>987,8637=>987,8638=>380,8639=>393,8640=>987, +8641=>987,8642=>380,8643=>379,8652=>987,8656=>987,8657=>603,8658=>987,8659=>603,8660=>1042,8661=>603, +8669=>1092,8704=>667,8706=>556,8707=>667,8709=>823,8710=>711,8711=>711,8712=>584,8713=>584,8714=>584, +8715=>584,8716=>584,8717=>713,8719=>823,8720=>823,8721=>804,8722=>584,8723=>584,8724=>584,8725=>510, +8726=>392,8727=>584,8729=>584,8730=>542,8733=>713,8734=>713,8736=>768,8739=>200,8740=>288,8741=>312, +8742=>340,8743=>603,8744=>603,8745=>768,8746=>768,8747=>556,8748=>796,8749=>956,8750=>556,8756=>863, +8764=>584,8765=>584,8766=>573,8768=>244,8769=>584,8770=>584,8771=>584,8772=>584,8773=>584,8774=>584, +8775=>584,8776=>584,8777=>584,8781=>554,8784=>584,8800=>584,8801=>584,8802=>584,8804=>584,8805=>584, +8810=>955,8811=>955,8813=>554,8814=>584,8815=>584,8816=>584,8817=>584,8818=>584,8819=>584,8826=>584, +8827=>584,8828=>584,8829=>584,8832=>584,8833=>584,8834=>584,8835=>584,8836=>584,8837=>584,8838=>584, +8839=>584,8840=>584,8841=>584,8844=>768,8847=>636,8848=>636,8849=>636,8850=>636,8851=>636,8852=>636, +8853=>768,8854=>768,8855=>768,8856=>768,8857=>768,8866=>658,8867=>658,8868=>658,8869=>658,8870=>600, +8871=>608,8882=>636,8883=>636,8884=>636,8885=>636,8896=>744,8897=>744,8898=>764,8899=>764,8901=>278, +8902=>471,8904=>710,8928=>584,8929=>584,8930=>636,8931=>636,8960=>823,8968=>456,8969=>455,8970=>455, +8971=>456,8992=>556,8993=>556,8994=>658,8995=>658,9001=>329,9002=>329,9115=>384,9116=>384,9117=>384, +9118=>384,9119=>384,9120=>384,9121=>388,9122=>388,9123=>388,9124=>388,9125=>388,9126=>388,9134=>556, +9250=>556,9251=>500,9312=>788,9313=>788,9314=>788,9315=>788,9316=>788,9317=>788,9318=>788,9319=>788, +9320=>788,9321=>788,9472=>1000,9473=>1000,9474=>1000,9475=>1000,9476=>1000,9477=>1000,9478=>1000,9479=>1000, +9480=>1000,9481=>1000,9482=>1000,9483=>1000,9484=>1000,9485=>1000,9486=>1000,9487=>1000,9488=>1000,9489=>1000, +9490=>1000,9491=>1000,9492=>1000,9493=>1000,9494=>1000,9495=>1000,9496=>1000,9497=>1000,9498=>1000,9499=>1000, +9500=>1000,9501=>1000,9502=>1000,9503=>1000,9504=>1000,9505=>1000,9506=>1000,9507=>1000,9508=>1000,9509=>1000, +9510=>1000,9511=>1000,9512=>1000,9513=>1000,9514=>1000,9515=>1000,9516=>1000,9517=>1000,9518=>1000,9519=>1000, +9520=>1000,9521=>1000,9522=>1000,9523=>1000,9524=>1000,9525=>1000,9526=>1000,9527=>1000,9528=>1000,9529=>1000, +9530=>1000,9531=>1000,9532=>1000,9533=>1000,9534=>1000,9535=>1000,9536=>1000,9537=>1000,9538=>1000,9539=>1000, +9540=>1000,9541=>1000,9542=>1000,9543=>1000,9544=>1000,9545=>1000,9546=>1000,9547=>1000,9552=>1000,9553=>1000, +9554=>1000,9555=>1000,9556=>1000,9557=>1000,9558=>1000,9559=>1000,9560=>1000,9561=>1000,9562=>1000,9563=>1000, +9564=>1000,9565=>1000,9566=>1000,9567=>1000,9568=>1000,9569=>1000,9570=>1000,9571=>1000,9572=>1000,9573=>1000, +9574=>1000,9575=>1000,9576=>1000,9577=>1000,9578=>1000,9579=>1000,9580=>1000,9600=>1000,9601=>1000,9602=>1000, +9603=>1000,9604=>1000,9605=>1000,9606=>1000,9607=>1000,9608=>1000,9609=>1000,9610=>1000,9611=>1000,9612=>1000, +9613=>1000,9614=>1000,9615=>1000,9616=>1000,9617=>1000,9618=>1000,9619=>1000,9620=>1000,9621=>1000,9622=>1000, +9623=>1000,9624=>1000,9625=>1000,9626=>1000,9627=>1000,9628=>1000,9629=>1000,9630=>1000,9631=>1000,9632=>1000, +9633=>1000,9635=>1000,9636=>1000,9637=>1000,9642=>1000,9644=>1000,9651=>892,9661=>892,9671=>788,9674=>489, +9675=>791,9711=>882,9772=>929,9824=>626,9825=>694,9826=>595,9827=>776,9828=>626,9829=>694,9830=>595, +9831=>776,9833=>333,9834=>555,9835=>722,9836=>722,9837=>415,9838=>377,9839=>402,10048=>1161,10752=>791, +10753=>791,10754=>791,10755=>764,10756=>764,10761=>584,11799=>333,64256=>495,64257=>460,64258=>465,64259=>652, +64260=>645,64261=>520,64275=>1004,64276=>1044,64277=>1042,64278=>1037,64279=>1256,64285=>200,64286=>305,64287=>400, +64288=>587,64289=>890,64290=>848,64291=>872,64292=>800,64293=>850,64294=>873,64295=>797,64296=>937,64297=>584, +64298=>776,64299=>776,64300=>776,64301=>776,64302=>640,64303=>640,64304=>640,64305=>591,64306=>466,64307=>598, +64308=>622,64309=>262,64310=>351,64312=>608,64313=>270,64314=>526,64315=>550,64316=>600,64318=>621,64320=>378, +64321=>607,64323=>575,64324=>568,64326=>590,64327=>606,64328=>547,64329=>776,64330=>687,64331=>212,64332=>591, +64333=>550,64334=>568,64335=>640,65533=>788); +$enc=''; +$diff=''; +$file='freesans.z'; +$ctg='freesans.ctg.z'; +$originalsize=568896; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freesans.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesans.z new file mode 100644 index 0000000..2bcdd56 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesans.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansb.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansb.ctg.z new file mode 100644 index 0000000..8c0510d Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansb.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansb.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansb.php new file mode 100644 index 0000000..ea53a17 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansb.php @@ -0,0 +1,236 @@ +<?php +$type='TrueTypeUnicode'; +$name='FreeSansBold'; +$desc=array('Ascent'=>1000,'Descent'=>-300,'CapHeight'=>22,'Flags'=>32,'FontBBox'=>'[-967 -1175 1556 1639]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>600); +$up=-189; +$ut=69; +$dw=600; +$cw=array( +32=>278,33=>333,34=>474,35=>556,36=>556,37=>889,38=>722,39=>238,40=>333,41=>333, +42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556, +52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>333,59=>333,60=>584,61=>584, +62=>584,63=>611,64=>975,65=>722,66=>722,67=>722,68=>722,69=>667,70=>611,71=>778, +72=>722,73=>278,74=>556,75=>722,76=>611,77=>833,78=>722,79=>778,80=>667,81=>778, +82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>333, +92=>278,93=>333,94=>584,95=>556,96=>333,97=>556,98=>611,99=>556,100=>611,101=>556, +102=>333,103=>611,104=>611,105=>278,106=>278,107=>556,108=>278,109=>889,110=>611,111=>611, +112=>611,113=>611,114=>389,115=>556,116=>333,117=>611,118=>556,119=>778,120=>556,121=>556, +122=>500,123=>389,124=>280,125=>389,126=>584,8364=>640,8218=>278,402=>333,8222=>500,8230=>1000, +8224=>556,8225=>556,710=>333,8240=>1000,352=>667,8249=>333,338=>1000,381=>611,8216=>278,8217=>278, +8220=>500,8221=>500,8226=>350,8211=>556,8212=>1000,732=>333,8482=>1000,353=>556,8250=>333,339=>944, +382=>500,376=>667,160=>278,161=>333,162=>556,163=>556,164=>556,165=>556,166=>280,167=>556, +168=>333,169=>737,170=>370,171=>556,172=>584,173=>333,174=>737,175=>333,176=>606,177=>584, +178=>351,179=>351,180=>333,181=>611,182=>556,183=>278,184=>333,185=>300,186=>365,187=>556, +188=>869,189=>869,190=>869,191=>611,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722, +198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278, +208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722, +218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556,226=>556,227=>556, +228=>556,229=>556,230=>889,231=>556,232=>556,233=>556,234=>556,235=>556,236=>278,237=>278, +238=>278,239=>278,240=>611,241=>611,242=>611,243=>611,244=>611,245=>611,246=>611,247=>584, +248=>611,249=>611,250=>611,251=>611,252=>611,253=>556,254=>611,255=>556,256=>722,257=>556, +258=>722,259=>556,260=>722,261=>556,262=>722,263=>556,264=>722,265=>556,266=>722,267=>556, +268=>722,269=>556,270=>722,271=>723,272=>722,273=>611,274=>667,275=>556,276=>667,277=>556, +278=>667,279=>556,280=>667,281=>556,282=>667,283=>556,284=>778,285=>611,286=>778,287=>611, +288=>778,289=>611,290=>778,291=>611,292=>722,293=>611,294=>722,295=>611,296=>278,297=>278, +298=>278,299=>278,300=>278,301=>278,302=>278,303=>278,304=>278,305=>278,306=>808,307=>492, +308=>556,309=>278,310=>722,311=>556,312=>559,313=>611,314=>278,315=>611,316=>278,317=>611, +318=>362,319=>611,320=>556,321=>611,322=>278,323=>722,324=>611,325=>722,326=>611,327=>722, +328=>611,329=>611,330=>722,331=>611,332=>778,333=>611,334=>778,335=>611,336=>778,337=>611, +340=>722,341=>389,342=>722,343=>389,344=>722,345=>389,346=>667,347=>556,348=>667,349=>556, +350=>667,351=>556,354=>611,355=>333,356=>611,357=>414,358=>611,359=>333,360=>722,361=>611, +362=>722,363=>611,364=>722,365=>611,366=>722,367=>611,368=>722,369=>611,370=>722,371=>611, +372=>944,373=>778,374=>667,375=>556,377=>611,378=>500,379=>611,380=>500,383=>333,384=>611, +385=>963,386=>704,387=>611,388=>687,389=>611,390=>722,391=>752,392=>562,393=>722,394=>968, +395=>722,396=>611,397=>609,398=>667,399=>778,400=>672,401=>611,403=>778,404=>667,405=>889, +406=>278,407=>395,408=>778,409=>556,410=>333,411=>620,412=>944,413=>722,414=>611,415=>778, +416=>791,417=>653,418=>1111,419=>722,420=>914,421=>611,422=>647,423=>667,424=>556,425=>673, +426=>441,427=>333,428=>742,429=>333,430=>611,431=>769,432=>656,433=>766,434=>722,435=>667, +436=>620,437=>611,438=>500,439=>556,440=>556,441=>645,442=>569,443=>579,446=>611,447=>608, +448=>260,449=>370,450=>584,451=>278,452=>1333,453=>1222,454=>1111,455=>1167,456=>889,457=>556, +458=>1278,459=>1000,460=>889,461=>722,462=>556,463=>278,464=>278,465=>778,466=>611,467=>722, +468=>611,469=>722,470=>611,471=>722,472=>611,473=>722,474=>611,475=>722,476=>611,477=>556, +478=>722,479=>556,480=>722,481=>556,482=>1000,483=>889,484=>778,485=>611,486=>778,487=>611, +488=>722,489=>556,490=>778,491=>611,492=>778,493=>611,494=>556,495=>556,496=>278,497=>1333, +498=>1222,499=>1111,500=>778,501=>611,503=>630,504=>722,505=>611,506=>722,507=>556,508=>1000, +509=>889,510=>778,511=>611,512=>722,513=>556,514=>722,515=>556,516=>667,517=>556,518=>667, +519=>556,520=>278,521=>278,522=>278,523=>278,524=>778,525=>611,526=>778,527=>611,528=>722, +529=>389,530=>722,531=>389,532=>722,533=>611,534=>722,535=>611,536=>667,537=>556,538=>611, +539=>333,540=>569,541=>486,542=>722,543=>611,548=>645,549=>500,550=>722,551=>556,552=>667, +553=>556,554=>778,555=>611,556=>778,557=>611,558=>778,559=>611,560=>778,561=>611,562=>667, +563=>556,567=>278,592=>556,593=>667,594=>667,595=>611,596=>556,597=>600,598=>611,599=>611, +600=>556,601=>556,602=>834,603=>541,604=>557,605=>820,606=>570,607=>278,608=>611,609=>611, +610=>556,611=>556,612=>656,613=>619,614=>611,615=>611,616=>278,617=>344,618=>278,619=>473, +620=>527,621=>298,622=>778,623=>889,624=>889,625=>889,626=>611,627=>611,628=>615,629=>606, +630=>878,631=>822,632=>778,633=>389,634=>389,635=>389,636=>389,637=>389,638=>455,639=>455, +640=>620,641=>620,642=>556,643=>333,644=>278,645=>333,646=>544,647=>328,648=>333,649=>623, +650=>726,651=>639,652=>556,653=>778,654=>556,655=>556,656=>500,657=>571,658=>556,659=>642, +660=>611,661=>611,662=>611,664=>611,665=>554,666=>570,667=>616,668=>603,669=>552,670=>556, +671=>454,672=>611,673=>611,674=>611,684=>522,688=>377,689=>377,690=>202,691=>272,692=>272, +693=>299,694=>395,695=>534,696=>364,697=>278,698=>454,699=>278,700=>278,701=>278,702=>333, +703=>333,704=>333,705=>333,706=>333,707=>333,708=>333,709=>333,711=>333,712=>333,713=>333, +714=>333,715=>333,716=>272,717=>333,718=>333,719=>333,720=>333,721=>333,722=>333,723=>333, +724=>333,725=>333,726=>333,727=>333,728=>333,729=>333,730=>333,731=>333,733=>333,734=>333, +735=>510,736=>372,737=>210,738=>363,739=>373,740=>334,741=>526,742=>526,743=>526,744=>526, +745=>526,746=>519,747=>519,748=>333,749=>333,750=>333,751=>333,752=>333,753=>333,754=>333, +755=>333,756=>333,757=>437,758=>437,759=>400,760=>333,761=>200,762=>200,763=>200,764=>200, +765=>333,766=>333,767=>333,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0, +775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0, +785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0, +795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0, +805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0, +815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0, +825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0, +835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0, +845=>0,846=>0,847=>0,848=>0,849=>0,850=>0,851=>0,852=>0,853=>0,854=>0, +855=>0,856=>0,857=>0,858=>0,859=>0,860=>0,861=>0,862=>0,863=>0,864=>0, +865=>0,866=>0,867=>0,868=>0,869=>0,870=>0,871=>0,872=>0,873=>0,874=>0, +875=>0,876=>0,877=>0,878=>0,879=>0,884=>379,885=>379,890=>333,894=>333,900=>363, +901=>333,902=>761,903=>333,904=>864,905=>903,906=>454,908=>796,910=>991,911=>867,912=>315, +913=>696,914=>640,915=>585,916=>726,917=>589,918=>581,919=>654,920=>783,921=>215,922=>648, +923=>710,924=>829,925=>683,926=>645,927=>738,928=>726,929=>645,931=>673,932=>674,933=>771, +934=>773,935=>780,936=>778,937=>766,938=>263,939=>771,940=>660,941=>541,942=>560,943=>356, +944=>568,945=>632,946=>560,947=>591,948=>609,949=>541,950=>488,951=>608,952=>562,953=>315, +954=>533,955=>603,956=>582,957=>586,958=>513,959=>611,960=>658,961=>595,962=>590,963=>657, +964=>557,965=>568,966=>768,967=>632,968=>708,969=>778,970=>315,971=>568,972=>599,973=>568, +974=>778,977=>580,978=>742,979=>857,980=>620,981=>706,982=>740,983=>556,1008=>556,1009=>566, +1012=>778,1013=>328,1024=>670,1025=>670,1026=>800,1027=>611,1028=>714,1029=>667,1030=>314,1031=>300, +1032=>576,1033=>1100,1034=>1114,1035=>806,1036=>740,1037=>757,1038=>711,1039=>754,1040=>707,1041=>704, +1042=>704,1043=>611,1044=>900,1045=>670,1046=>1076,1047=>667,1048=>757,1049=>757,1050=>740,1051=>729, +1052=>874,1053=>753,1054=>774,1055=>753,1056=>675,1057=>711,1058=>611,1059=>711,1060=>904,1061=>666, +1062=>816,1063=>698,1064=>1057,1065=>1157,1066=>837,1067=>980,1068=>675,1069=>711,1070=>1093,1071=>708, +1072=>552,1073=>593,1074=>554,1075=>423,1076=>685,1077=>573,1078=>782,1079=>557,1080=>615,1081=>615, +1082=>559,1083=>568,1084=>666,1085=>603,1086=>606,1087=>603,1088=>612,1089=>556,1090=>440,1091=>549, +1092=>964,1093=>539,1094=>652,1095=>554,1096=>886,1097=>968,1098=>699,1099=>778,1100=>568,1101=>556, +1102=>848,1103=>586,1104=>573,1105=>573,1106=>606,1107=>423,1108=>556,1109=>555,1110=>260,1111=>278, +1112=>270,1113=>898,1114=>898,1115=>626,1116=>559,1117=>615,1118=>549,1119=>604,1136=>832,1137=>748, +1138=>774,1139=>606,1154=>449,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>0,1161=>0, +1162=>832,1163=>675,1164=>678,1165=>611,1166=>675,1167=>612,1168=>636,1169=>440,1170=>622,1171=>449, +1172=>647,1173=>574,1174=>1096,1175=>803,1176=>683,1177=>555,1178=>759,1179=>573,1180=>730,1181=>554, +1182=>737,1183=>555,1184=>892,1185=>680,1186=>825,1187=>653,1188=>999,1189=>763,1190=>1105,1191=>925, +1192=>714,1193=>558,1194=>722,1195=>558,1196=>614,1197=>438,1198=>643,1199=>573,1200=>643,1201=>603, +1202=>670,1203=>548,1204=>952,1205=>738,1206=>781,1207=>615,1208=>698,1209=>588,1210=>687,1211=>588, +1212=>993,1213=>761,1214=>965,1215=>759,1216=>314,1217=>1076,1218=>809,1219=>700,1220=>543,1221=>793, +1222=>634,1223=>753,1224=>603,1225=>819,1226=>663,1227=>706,1228=>588,1229=>935,1230=>720,1231=>314, +1232=>707,1233=>564,1234=>707,1235=>566,1236=>1004,1237=>898,1238=>670,1239=>573,1240=>722,1241=>573, +1242=>722,1243=>573,1244=>1076,1245=>782,1246=>667,1247=>557,1248=>556,1249=>552,1250=>757,1251=>615, +1252=>757,1253=>615,1254=>778,1255=>611,1256=>774,1257=>606,1258=>774,1259=>606,1260=>711,1261=>556, +1262=>700,1263=>544,1264=>701,1265=>539,1266=>700,1267=>537,1268=>698,1269=>554,1270=>611,1271=>432, +1272=>980,1273=>778,1296=>672,1297=>546,1298=>729,1299=>577,1306=>778,1307=>612,1308=>944,1309=>776, +1310=>730,1311=>554,1329=>730,1330=>713,1331=>765,1332=>752,1333=>708,1334=>801,1335=>496,1336=>713, +1337=>855,1338=>686,1339=>727,1340=>420,1341=>897,1342=>841,1343=>708,1344=>660,1345=>666,1346=>747, +1347=>698,1348=>757,1349=>630,1350=>747,1351=>651,1352=>743,1353=>657,1354=>728,1355=>799,1356=>752, +1357=>743,1358=>768,1359=>691,1360=>713,1361=>640,1362=>425,1363=>818,1364=>672,1365=>805,1366=>754, +1369=>333,1370=>222,1371=>250,1372=>333,1373=>333,1374=>352,1375=>362,1377=>873,1378=>613,1379=>634, +1380=>636,1381=>593,1382=>639,1383=>417,1384=>613,1385=>658,1386=>711,1387=>609,1388=>318,1389=>836, +1390=>670,1391=>613,1392=>607,1393=>611,1394=>626,1395=>619,1396=>618,1397=>324,1398=>613,1399=>540, +1400=>591,1401=>392,1402=>873,1403=>577,1404=>603,1405=>600,1406=>626,1407=>951,1408=>613,1409=>612, +1410=>348,1411=>951,1412=>616,1413=>606,1414=>763,1415=>626,1417=>333,1418=>398,1456=>0,1457=>0, +1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1467=>0,1468=>0, +1469=>0,1470=>516,1471=>0,1472=>297,1473=>0,1474=>0,1475=>333,1476=>0,1488=>714,1489=>651, +1490=>557,1491=>638,1492=>682,1493=>297,1494=>443,1495=>682,1496=>670,1497=>284,1498=>590,1499=>595, +1500=>667,1501=>683,1502=>704,1503=>297,1504=>429,1505=>670,1506=>653,1507=>661,1508=>660,1509=>616, +1510=>671,1511=>672,1512=>600,1513=>840,1514=>756,1520=>554,1521=>550,1522=>542,1523=>238,1524=>474, +2561=>0,2562=>122,2563=>313,2565=>897,2566=>1157,2567=>930,2568=>966,2569=>762,2570=>762,2575=>729, +2576=>904,2579=>773,2580=>903,2581=>726,2582=>672,2583=>741,2584=>790,2585=>702,2586=>723,2587=>693, +2588=>688,2589=>673,2590=>683,2591=>686,2592=>711,2593=>680,2594=>693,2595=>729,2596=>691,2597=>694, +2598=>699,2599=>666,2600=>669,2602=>683,2603=>690,2604=>660,2605=>659,2606=>692,2607=>772,2608=>673, +2610=>731,2611=>814,2613=>663,2614=>704,2616=>702,2617=>650,2620=>0,2622=>307,2623=>304,2624=>306, +2625=>7,2626=>7,2631=>7,2632=>8,2635=>6,2636=>5,2637=>8,2649=>684,2650=>813,2651=>715, +2652=>695,2654=>709,2662=>697,2663=>630,2664=>696,2665=>690,2666=>646,2667=>636,2668=>571,2669=>682, +2670=>718,2671=>730,2672=>9,2673=>162,2674=>722,2675=>760,2676=>1110,4256=>616,4257=>645,4258=>664, +4259=>839,4260=>627,4261=>630,4262=>827,4263=>928,4264=>639,4265=>630,4266=>951,4267=>606,4268=>608, +4269=>835,4270=>630,4271=>610,4272=>804,4273=>615,4274=>823,4275=>747,4276=>870,4277=>627,4278=>840, +4279=>627,4280=>665,4281=>610,4282=>799,4283=>598,4284=>665,4285=>664,4286=>608,4287=>886,4288=>629, +4304=>463,4305=>516,4306=>564,4307=>706,4308=>459,4309=>476,4310=>623,4311=>711,4312=>494,4313=>476, +4314=>894,4315=>500,4316=>500,4317=>712,4318=>493,4319=>503,4320=>712,4321=>503,4322=>710,4323=>670, +4324=>707,4325=>459,4326=>691,4327=>465,4328=>492,4329=>480,4330=>656,4331=>500,4332=>492,4333=>524, +4334=>500,4335=>688,4336=>510,4337=>739,4338=>450,4339=>479,4340=>502,4341=>501,4345=>564,4347=>515, +7680=>722,7681=>556,7682=>722,7683=>611,7684=>722,7685=>611,7686=>722,7687=>611,7688=>722,7689=>556, +7690=>722,7691=>611,7692=>722,7693=>611,7694=>722,7695=>611,7696=>722,7697=>611,7698=>722,7699=>611, +7700=>667,7701=>556,7702=>667,7703=>556,7704=>667,7705=>556,7706=>667,7707=>556,7708=>667,7709=>556, +7710=>611,7711=>333,7712=>778,7713=>611,7714=>722,7715=>611,7716=>722,7717=>611,7718=>722,7719=>611, +7720=>722,7721=>611,7722=>722,7723=>611,7724=>278,7725=>278,7726=>278,7727=>278,7728=>722,7729=>556, +7730=>722,7731=>556,7732=>722,7733=>556,7734=>611,7735=>278,7736=>611,7737=>278,7738=>611,7739=>278, +7740=>611,7741=>278,7742=>833,7743=>889,7744=>833,7745=>889,7746=>833,7747=>889,7748=>722,7749=>611, +7750=>722,7751=>611,7752=>722,7753=>611,7754=>722,7755=>611,7756=>778,7757=>611,7758=>778,7759=>611, +7760=>778,7761=>611,7762=>778,7763=>611,7764=>667,7765=>611,7766=>667,7767=>611,7768=>722,7769=>389, +7770=>722,7771=>389,7772=>722,7773=>389,7774=>722,7775=>389,7776=>667,7777=>556,7778=>667,7779=>556, +7780=>667,7781=>556,7782=>667,7783=>556,7784=>667,7785=>556,7786=>611,7787=>333,7788=>611,7789=>333, +7790=>611,7791=>333,7792=>611,7793=>333,7794=>722,7795=>611,7796=>722,7797=>611,7798=>722,7799=>611, +7800=>722,7801=>611,7802=>722,7803=>611,7804=>667,7805=>556,7806=>667,7807=>556,7808=>944,7809=>778, +7810=>944,7811=>778,7812=>944,7813=>778,7814=>944,7815=>778,7816=>944,7817=>778,7818=>667,7819=>556, +7820=>667,7821=>556,7822=>667,7823=>556,7824=>611,7825=>500,7826=>611,7827=>500,7828=>611,7829=>500, +7830=>611,7831=>333,7832=>778,7833=>556,7834=>555,7835=>333,7840=>722,7841=>556,7842=>722,7843=>556, +7844=>722,7845=>556,7846=>722,7847=>556,7848=>667,7849=>556,7850=>722,7851=>556,7852=>722,7853=>556, +7854=>722,7855=>556,7856=>722,7857=>556,7858=>722,7859=>556,7860=>722,7861=>556,7862=>722,7863=>556, +7864=>667,7865=>556,7866=>667,7867=>556,7868=>667,7869=>556,7870=>667,7871=>556,7872=>667,7873=>556, +7874=>667,7875=>556,7876=>667,7877=>556,7878=>667,7879=>556,7880=>278,7881=>278,7882=>278,7883=>278, +7884=>778,7885=>611,7886=>778,7887=>611,7888=>778,7889=>611,7890=>778,7891=>611,7892=>778,7893=>611, +7894=>778,7895=>611,7896=>778,7897=>611,7898=>791,7899=>653,7900=>791,7901=>653,7902=>791,7903=>653, +7904=>791,7905=>653,7906=>791,7907=>653,7908=>722,7909=>611,7910=>722,7911=>611,7912=>769,7913=>656, +7914=>769,7915=>656,7916=>769,7917=>656,7918=>769,7919=>656,7920=>769,7921=>656,7922=>667,7923=>556, +7924=>667,7925=>556,7926=>667,7927=>556,7928=>667,7929=>556,7936=>632,7937=>632,7938=>632,7939=>632, +7940=>632,7941=>632,7942=>632,7943=>632,7944=>696,7945=>696,7946=>865,7947=>849,7948=>796,7949=>807, +7950=>730,7951=>750,7952=>541,7953=>541,7954=>541,7955=>541,7956=>541,7957=>541,7960=>758,7961=>760, +7962=>957,7963=>943,7964=>939,7965=>945,7968=>608,7969=>608,7970=>608,7971=>608,7972=>608,7973=>608, +7974=>608,7975=>608,7976=>823,7977=>831,7978=>1026,7979=>1017,7980=>1002,7981=>1024,7982=>908,7983=>909, +7984=>315,7985=>315,7986=>373,7987=>375,7988=>378,7989=>374,7990=>370,7991=>384,7992=>378,7993=>383, +7994=>596,7995=>579,7996=>572,7997=>576,7998=>474,7999=>459,8000=>610,8001=>610,8002=>610,8003=>610, +8004=>610,8005=>610,8008=>800,8009=>871,8010=>1084,8011=>1079,8012=>975,8013=>973,8016=>568,8017=>568, +8018=>568,8019=>568,8020=>568,8021=>568,8022=>568,8023=>568,8025=>906,8027=>1080,8029=>1115,8031=>977, +8032=>778,8033=>778,8034=>778,8035=>778,8036=>778,8037=>778,8038=>778,8039=>778,8040=>837,8041=>860, +8042=>1062,8043=>1072,8044=>962,8045=>985,8046=>922,8047=>959,8048=>632,8049=>632,8050=>541,8051=>541, +8052=>608,8053=>608,8054=>315,8055=>315,8056=>610,8057=>610,8058=>568,8059=>568,8060=>778,8061=>778, +8064=>632,8065=>632,8066=>632,8067=>632,8068=>632,8069=>632,8070=>632,8071=>632,8072=>909,8073=>906, +8074=>1061,8075=>1035,8076=>984,8077=>994,8078=>910,8079=>916,8080=>608,8081=>608,8082=>608,8083=>608, +8084=>608,8085=>608,8086=>608,8087=>608,8088=>1006,8089=>1015,8090=>1204,8091=>1207,8092=>1188,8093=>1209, +8094=>1096,8095=>1105,8096=>778,8097=>778,8098=>778,8099=>778,8100=>778,8101=>778,8102=>778,8103=>778, +8104=>1026,8105=>1048,8106=>1251,8107=>1260,8108=>1150,8109=>1177,8110=>1106,8111=>1142,8112=>632,8113=>632, +8114=>632,8115=>632,8116=>660,8118=>632,8119=>632,8120=>696,8121=>696,8122=>696,8123=>696,8124=>907, +8125=>278,8126=>346,8127=>278,8128=>278,8129=>333,8130=>608,8131=>608,8132=>560,8134=>608,8135=>608, +8136=>776,8137=>793,8138=>847,8139=>854,8140=>848,8141=>492,8142=>489,8143=>394,8144=>335,8145=>354, +8146=>367,8147=>368,8150=>353,8151=>366,8152=>240,8153=>259,8154=>418,8155=>416,8157=>481,8158=>589, +8159=>333,8160=>568,8161=>568,8162=>568,8163=>568,8164=>595,8165=>595,8166=>568,8167=>568,8168=>771, +8169=>771,8170=>951,8171=>982,8172=>806,8173=>333,8174=>333,8175=>333,8178=>778,8179=>778,8180=>778, +8182=>778,8183=>778,8184=>909,8185=>809,8186=>897,8187=>825,8188=>978,8189=>333,8190=>278,8192=>500, +8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>556,8200=>278,8201=>200,8202=>100, +8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>333,8209=>333,8210=>556,8213=>1000,8214=>437, +8215=>556,8219=>278,8223=>500,8227=>350,8228=>278,8229=>666,8231=>278,8232=>0,8233=>0,8234=>0, +8235=>0,8236=>0,8237=>0,8238=>0,8239=>500,8241=>1367,8242=>238,8243=>426,8244=>614,8245=>238, +8246=>379,8247=>571,8248=>450,8251=>622,8252=>666,8253=>614,8254=>556,8255=>658,8256=>658,8257=>438, +8258=>840,8259=>400,8260=>167,8261=>334,8262=>334,8263=>1222,8264=>944,8265=>944,8266=>556,8267=>537, +8268=>537,8269=>537,8270=>389,8271=>333,8272=>658,8273=>389,8274=>634,8275=>568,8276=>658,8277=>793, +8278=>515,8279=>855,8280=>722,8281=>725,8282=>224,8283=>722,8284=>604,8285=>224,8286=>224,8287=>0, +8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8304=>351,8305=>351,8308=>351,8309=>351,8310=>351, +8311=>351,8312=>351,8313=>351,8314=>351,8315=>351,8316=>351,8317=>351,8318=>351,8319=>351,8320=>351, +8321=>301,8322=>351,8323=>351,8324=>351,8325=>351,8326=>351,8327=>351,8328=>351,8329=>351,8330=>350, +8331=>350,8332=>350,8333=>350,8334=>350,8355=>611,8356=>591,8357=>889,8358=>727,8360=>1265,8362=>1049, +8363=>580,8368=>605,8373=>591,8400=>0,8401=>0,8402=>0,8403=>0,8406=>0,8407=>0,8411=>0, +8412=>0,8413=>0,8414=>0,8415=>0,8416=>0,8417=>0,8421=>0,8422=>0,8423=>0,8424=>0, +8425=>0,8426=>0,8427=>0,8428=>0,8429=>0,8430=>0,8431=>0,8432=>0,8448=>985,8449=>1007, +8451=>1034,8453=>981,8454=>1042,8455=>667,8457=>919,8465=>606,8468=>881,8470=>979,8471=>784,8476=>699, +8480=>1000,8481=>1230,8486=>766,8487=>778,8489=>315,8490=>741,8491=>729,8494=>556,8498=>588,8501=>714, +8502=>651,8503=>557,8504=>638,8506=>871,8507=>1230,8513=>778,8514=>611,8515=>611,8516=>667,8523=>669, +8525=>1072,8526=>482,8531=>869,8532=>869,8533=>869,8534=>869,8535=>869,8536=>869,8537=>869,8538=>869, +8539=>869,8540=>869,8541=>869,8542=>869,8543=>869,8544=>278,8545=>556,8546=>834,8547=>945,8548=>667, +8549=>945,8550=>1223,8551=>1501,8552=>945,8553=>667,8554=>945,8555=>1223,8556=>611,8557=>722,8558=>722, +8559=>833,8560=>278,8561=>556,8562=>834,8563=>834,8564=>556,8565=>834,8566=>1112,8567=>1390,8568=>834, +8569=>556,8570=>834,8571=>1112,8572=>278,8573=>556,8574=>611,8575=>889,8592=>964,8593=>964,8594=>964, +8595=>964,8596=>964,8597=>964,8598=>964,8599=>964,8600=>964,8601=>964,8602=>964,8603=>964,8606=>964, +8607=>964,8608=>964,8609=>964,8610=>964,8611=>964,8612=>964,8613=>964,8614=>964,8615=>964,8616=>964, +8644=>964,8645=>964,8646=>964,8647=>964,8648=>964,8649=>964,8650=>964,8704=>722,8706=>556,8707=>667, +8710=>729,8711=>729,8721=>856,8722=>584,8725=>869,8730=>594,8747=>608,8800=>548,8804=>584,8805=>584, +9251=>500,9674=>541,9772=>923,9824=>626,9825=>694,9826=>595,9827=>776,9828=>626,9829=>694,9830=>595, +9831=>776,9833=>333,9834=>556,9835=>778,9836=>778,9837=>556,9838=>556,9839=>556,10048=>1453,11799=>333, +64256=>607,64257=>576,64258=>603,64259=>849,64260=>849,64275=>1243,64276=>1226,64277=>1233,64278=>1238,64279=>1448, +64285=>284,64286=>305,64287=>542,64288=>653,64289=>964,64290=>888,64291=>932,64292=>845,64293=>917,64294=>933, +64295=>850,64296=>1006,64297=>584,64298=>840,64299=>840,64300=>840,64301=>840,64302=>714,64303=>714,64304=>714, +64305=>651,64306=>557,64307=>638,64308=>682,64309=>348,64310=>443,64312=>670,64313=>354,64314=>590,64315=>595, +64316=>667,64318=>704,64320=>429,64321=>670,64323=>661,64324=>660,64326=>671,64327=>672,64328=>600,64329=>840, +64330=>756,64331=>212,64332=>591,64333=>550,64334=>568,64335=>714,65533=>788); +$enc=''; +$diff=''; +$file='freesansb.z'; +$ctg='freesansb.ctg.z'; +$originalsize=283180; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansb.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansb.z new file mode 100644 index 0000000..800fed2 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansb.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansbi.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansbi.ctg.z new file mode 100644 index 0000000..9e8a3c7 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansbi.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansbi.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansbi.php new file mode 100644 index 0000000..783eb3c --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansbi.php @@ -0,0 +1,225 @@ +<?php +$type='TrueTypeUnicode'; +$name='FreeSansBoldOblique'; +$desc=array('Ascent'=>1000,'Descent'=>-300,'CapHeight'=>22,'Flags'=>96,'FontBBox'=>'[-769 -1175 1591 1639]','ItalicAngle'=>-12,'StemV'=>120,'MissingWidth'=>600); +$up=-145; +$ut=69; +$dw=600; +$cw=array( +32=>278,33=>333,34=>474,35=>556,36=>556,37=>889,38=>722,39=>238,40=>333,41=>333, +42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556, +52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>333,59=>333,60=>584,61=>584, +62=>584,63=>611,64=>975,65=>722,66=>722,67=>722,68=>722,69=>667,70=>611,71=>778, +72=>722,73=>278,74=>556,75=>722,76=>611,77=>833,78=>722,79=>778,80=>667,81=>778, +82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>333, +92=>278,93=>333,94=>584,95=>556,96=>333,97=>556,98=>611,99=>556,100=>611,101=>556, +102=>333,103=>611,104=>611,105=>278,106=>278,107=>556,108=>278,109=>889,110=>611,111=>611, +112=>611,113=>611,114=>389,115=>556,116=>333,117=>611,118=>556,119=>778,120=>556,121=>556, +122=>500,123=>389,124=>280,125=>389,126=>584,8364=>640,8218=>278,402=>556,8222=>500,8230=>1000, +8224=>556,8225=>556,710=>333,8240=>1000,352=>667,8249=>333,338=>1000,381=>611,8216=>278,8217=>278, +8220=>500,8221=>500,8226=>350,8211=>556,8212=>1000,732=>333,8482=>1000,353=>556,8250=>333,339=>944, +382=>500,376=>667,160=>278,161=>333,162=>556,163=>556,164=>556,165=>556,166=>280,167=>556, +168=>333,169=>737,170=>370,171=>556,172=>584,173=>333,174=>737,175=>333,176=>606,177=>584, +178=>350,179=>350,180=>333,181=>667,182=>556,183=>278,184=>333,185=>248,186=>365,187=>556, +188=>869,189=>869,190=>869,191=>611,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722, +198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278, +208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722, +218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556,226=>556,227=>556, +228=>556,229=>556,230=>889,231=>556,232=>556,233=>556,234=>556,235=>556,236=>278,237=>278, +238=>278,239=>278,240=>611,241=>611,242=>611,243=>611,244=>611,245=>611,246=>611,247=>584, +248=>611,249=>611,250=>611,251=>611,252=>611,253=>556,254=>611,255=>556,256=>722,257=>556, +258=>722,259=>556,260=>722,261=>556,262=>722,263=>556,264=>722,265=>556,266=>722,267=>556, +268=>722,269=>556,270=>722,271=>722,272=>722,273=>611,274=>667,275=>556,276=>667,277=>556, +278=>667,279=>556,280=>667,281=>556,282=>667,283=>556,284=>778,285=>611,286=>778,287=>611, +288=>778,289=>611,290=>778,291=>611,292=>722,293=>611,294=>722,295=>611,296=>278,297=>278, +298=>278,299=>278,300=>278,301=>278,302=>278,303=>268,304=>278,305=>278,306=>796,307=>487, +308=>556,309=>278,310=>722,311=>556,312=>529,313=>611,314=>278,315=>611,316=>278,317=>611, +318=>384,319=>611,320=>556,321=>611,322=>278,323=>722,324=>611,325=>722,326=>611,327=>722, +328=>611,329=>611,330=>722,331=>611,332=>778,333=>611,334=>778,335=>611,336=>778,337=>611, +340=>722,341=>389,342=>722,343=>389,344=>722,345=>389,346=>667,347=>556,348=>667,349=>556, +350=>667,351=>556,354=>611,355=>333,356=>611,357=>404,358=>611,359=>404,360=>722,361=>611, +362=>722,363=>611,364=>722,365=>611,366=>722,367=>611,368=>722,369=>611,370=>722,371=>611, +372=>944,373=>778,374=>667,375=>556,377=>611,378=>500,379=>611,380=>500,383=>333,384=>611, +385=>963,386=>722,387=>611,388=>687,389=>611,390=>722,391=>752,392=>562,393=>722,394=>968, +395=>722,396=>611,397=>609,398=>667,399=>778,400=>672,401=>611,403=>778,404=>667,405=>889, +406=>278,407=>395,408=>778,409=>556,410=>333,411=>620,412=>889,413=>722,414=>611,415=>778, +416=>778,417=>611,418=>1111,419=>722,420=>914,421=>611,422=>647,423=>667,424=>556,425=>688, +426=>441,427=>333,428=>742,429=>333,430=>611,431=>722,432=>611,433=>780,434=>722,435=>667, +436=>706,437=>611,438=>500,439=>556,440=>556,441=>645,442=>569,443=>579,446=>611,447=>608, +448=>260,449=>370,450=>584,451=>278,452=>1333,453=>1222,454=>1111,455=>1167,456=>889,457=>556, +458=>1278,459=>1000,460=>889,461=>722,462=>556,463=>278,464=>278,465=>778,466=>611,467=>722, +468=>611,469=>722,470=>611,471=>722,472=>611,473=>722,474=>611,475=>722,476=>611,477=>556, +478=>722,479=>556,480=>722,481=>556,482=>1000,483=>889,484=>811,485=>641,486=>778,487=>611, +488=>722,489=>556,490=>778,491=>611,492=>778,493=>611,494=>556,495=>556,496=>278,497=>1333, +498=>1222,499=>1111,500=>778,501=>611,503=>630,504=>722,505=>611,506=>722,507=>556,508=>1000, +509=>889,510=>778,511=>611,512=>722,513=>556,514=>722,515=>556,516=>667,517=>556,518=>667, +519=>556,520=>278,521=>278,522=>278,523=>278,524=>778,525=>611,526=>778,527=>611,528=>722, +529=>389,530=>722,531=>389,532=>722,533=>611,534=>722,535=>611,536=>667,537=>556,538=>611, +539=>333,540=>569,541=>486,542=>722,543=>611,548=>645,549=>500,550=>722,551=>556,552=>667, +553=>556,554=>778,555=>611,556=>778,557=>611,558=>778,559=>611,560=>778,561=>611,562=>667, +563=>556,567=>278,592=>556,593=>611,594=>611,595=>611,596=>556,597=>600,598=>611,599=>611, +600=>556,601=>556,602=>834,603=>570,604=>546,605=>820,606=>570,607=>278,608=>611,609=>611, +610=>556,611=>556,612=>656,613=>619,614=>611,615=>611,616=>278,617=>344,618=>278,619=>473, +620=>527,621=>298,622=>778,623=>889,624=>889,625=>889,626=>611,627=>611,628=>615,629=>590, +630=>878,631=>822,632=>778,633=>389,634=>389,635=>389,636=>389,637=>389,638=>455,639=>455, +640=>620,641=>586,642=>556,643=>333,644=>278,645=>333,646=>544,647=>328,648=>333,649=>623, +650=>726,651=>639,652=>556,653=>778,654=>556,655=>556,656=>500,657=>571,658=>556,659=>642, +660=>611,661=>611,662=>611,664=>611,665=>572,666=>570,667=>616,668=>603,669=>552,670=>556, +671=>454,672=>611,673=>611,674=>611,684=>520,688=>500,689=>500,690=>167,691=>333,692=>333, +693=>333,694=>348,695=>500,696=>345,697=>278,698=>454,699=>278,700=>333,701=>278,702=>333, +703=>333,704=>333,705=>333,706=>333,707=>333,708=>333,709=>333,711=>333,712=>333,713=>333, +714=>333,715=>333,716=>272,717=>333,718=>333,719=>333,720=>333,721=>333,722=>333,723=>333, +724=>333,725=>333,726=>333,727=>333,728=>333,729=>333,730=>333,731=>333,733=>333,734=>333, +735=>510,736=>333,737=>333,738=>333,739=>357,740=>334,741=>526,742=>526,743=>526,744=>526, +745=>526,746=>519,747=>519,748=>333,749=>333,750=>333,751=>333,752=>333,753=>333,754=>333, +755=>333,756=>333,757=>437,758=>437,759=>400,760=>333,761=>200,762=>200,763=>200,764=>200, +765=>332,766=>333,767=>333,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0, +775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0, +785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0, +795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0, +805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0, +815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0, +825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0, +835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0, +845=>0,846=>0,847=>0,848=>0,849=>0,850=>0,851=>0,852=>0,853=>0,854=>0, +855=>0,856=>0,857=>0,858=>0,859=>0,860=>0,861=>0,862=>0,863=>0,864=>0, +865=>0,866=>0,867=>0,868=>0,869=>0,870=>0,871=>0,872=>0,873=>0,874=>0, +875=>0,876=>0,877=>0,878=>0,879=>0,884=>208,885=>247,890=>364,894=>333,900=>239, +901=>446,902=>688,903=>333,904=>903,905=>962,906=>448,908=>904,910=>991,911=>932,912=>346, +913=>764,914=>688,915=>642,916=>744,917=>710,918=>688,919=>743,920=>810,921=>296,922=>744, +923=>744,924=>860,925=>714,926=>690,927=>822,928=>781,929=>698,931=>688,932=>688,933=>744, +934=>777,935=>783,936=>805,937=>780,938=>296,939=>744,940=>640,941=>530,942=>597,943=>339, +944=>575,945=>656,946=>576,947=>591,948=>620,949=>570,950=>522,951=>586,952=>586,953=>346, +954=>576,955=>620,956=>667,957=>564,958=>530,959=>610,960=>721,961=>626,962=>595,963=>676, +964=>592,965=>575,966=>801,967=>632,968=>722,969=>800,970=>346,971=>575,972=>609,973=>604, +974=>769,977=>580,978=>742,979=>857,980=>620,981=>778,982=>740,983=>601,1008=>556,1009=>566, +1012=>778,1013=>328,1024=>667,1025=>667,1026=>790,1027=>617,1028=>731,1029=>667,1030=>278,1031=>278, +1032=>556,1033=>1110,1034=>1088,1035=>790,1036=>722,1037=>757,1038=>698,1039=>722,1040=>722,1041=>722, +1042=>722,1043=>617,1044=>876,1045=>667,1046=>1100,1047=>670,1048=>757,1049=>757,1050=>722,1051=>715, +1052=>874,1053=>753,1054=>778,1055=>753,1056=>680,1057=>722,1058=>611,1059=>698,1060=>909,1061=>657, +1062=>845,1063=>688,1064=>1132,1065=>1217,1066=>835,1067=>980,1068=>678,1069=>735,1070=>1142,1071=>708, +1072=>553,1073=>591,1074=>574,1075=>429,1076=>745,1077=>572,1078=>792,1079=>554,1080=>603,1081=>603, +1082=>559,1083=>583,1084=>664,1085=>603,1086=>588,1087=>603,1088=>605,1089=>549,1090=>440,1091=>541, +1092=>948,1093=>539,1094=>690,1095=>564,1096=>901,1097=>987,1098=>692,1099=>806,1100=>572,1101=>546, +1102=>893,1103=>586,1104=>572,1105=>572,1106=>616,1107=>429,1108=>549,1109=>562,1110=>281,1111=>281, +1112=>282,1113=>888,1114=>897,1115=>606,1116=>559,1117=>603,1118=>541,1119=>603,1136=>830,1137=>761, +1138=>778,1139=>590,1154=>456,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>0,1161=>0, +1162=>791,1163=>662,1164=>639,1165=>581,1166=>670,1167=>649,1168=>623,1169=>450,1170=>623,1171=>472, +1172=>674,1173=>528,1174=>1091,1175=>803,1176=>659,1177=>548,1178=>739,1179=>569,1180=>742,1181=>560, +1182=>737,1183=>559,1184=>900,1185=>679,1186=>808,1187=>673,1188=>1004,1189=>761,1190=>1114,1191=>876, +1192=>721,1193=>548,1194=>724,1195=>554,1196=>611,1197=>454,1198=>667,1199=>584,1200=>652,1201=>632, +1202=>667,1203=>550,1204=>951,1205=>748,1206=>759,1207=>630,1208=>669,1209=>580,1210=>672,1211=>576, +1212=>977,1213=>752,1214=>957,1215=>752,1216=>318,1217=>1087,1218=>792,1219=>726,1220=>530,1221=>782, +1222=>674,1223=>749,1224=>603,1225=>823,1226=>682,1227=>675,1228=>573,1229=>941,1230=>754,1231=>310, +1232=>704,1233=>553,1234=>711,1235=>553,1236=>1000,1237=>889,1238=>667,1239=>569,1240=>738,1241=>561, +1242=>738,1243=>561,1244=>1086,1245=>792,1246=>670,1247=>554,1248=>558,1249=>546,1250=>753,1251=>603, +1252=>753,1253=>603,1254=>778,1255=>588,1256=>778,1257=>590,1258=>778,1259=>590,1260=>735,1261=>546, +1262=>698,1263=>541,1264=>698,1265=>541,1266=>698,1267=>541,1268=>686,1269=>564,1270=>617,1271=>475, +1272=>976,1273=>806,1296=>672,1297=>546,1298=>729,1299=>577,1306=>778,1307=>611,1308=>944,1309=>776, +1310=>750,1311=>573,1329=>730,1330=>713,1331=>765,1332=>752,1333=>708,1334=>801,1335=>496,1336=>713, +1337=>855,1338=>686,1339=>727,1340=>420,1341=>897,1342=>841,1343=>708,1344=>660,1345=>666,1346=>747, +1347=>698,1348=>757,1349=>630,1350=>747,1351=>651,1352=>743,1353=>657,1354=>728,1355=>799,1356=>752, +1357=>743,1358=>768,1359=>691,1360=>713,1361=>640,1362=>425,1363=>818,1364=>672,1365=>805,1366=>754, +1369=>333,1370=>222,1371=>250,1372=>333,1373=>333,1374=>352,1375=>362,1377=>873,1378=>613,1379=>634, +1380=>636,1381=>593,1382=>639,1383=>417,1384=>613,1385=>658,1386=>711,1387=>609,1388=>318,1389=>836, +1390=>670,1391=>613,1392=>607,1393=>611,1394=>626,1395=>619,1396=>618,1397=>324,1398=>613,1399=>540, +1400=>591,1401=>392,1402=>873,1403=>577,1404=>603,1405=>600,1406=>626,1407=>951,1408=>613,1409=>612, +1410=>348,1411=>951,1412=>616,1413=>606,1414=>763,1415=>626,1417=>333,1418=>398,1456=>0,1457=>0, +1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1467=>0,1468=>0, +1469=>0,1470=>516,1471=>0,1472=>297,1473=>0,1474=>0,1475=>333,1476=>0,1488=>714,1489=>651, +1490=>557,1491=>638,1492=>682,1493=>297,1494=>443,1495=>682,1496=>670,1497=>284,1498=>590,1499=>595, +1500=>667,1501=>683,1502=>704,1503=>297,1504=>429,1505=>670,1506=>653,1507=>661,1508=>660,1509=>616, +1510=>671,1511=>672,1512=>600,1513=>840,1514=>756,1520=>554,1521=>550,1522=>542,1523=>238,1524=>474, +4256=>616,4257=>645,4258=>664,4259=>839,4260=>627,4261=>630,4262=>827,4263=>928,4264=>639,4265=>630, +4266=>951,4267=>606,4268=>608,4269=>835,4270=>630,4271=>610,4272=>804,4273=>615,4274=>823,4275=>747, +4276=>870,4277=>627,4278=>840,4279=>627,4280=>665,4281=>610,4282=>799,4283=>598,4284=>665,4285=>664, +4286=>608,4287=>886,4288=>629,4304=>463,4305=>516,4306=>564,4307=>706,4308=>459,4309=>476,4310=>623, +4311=>711,4312=>494,4313=>476,4314=>894,4315=>500,4316=>500,4317=>712,4318=>493,4319=>503,4320=>712, +4321=>503,4322=>710,4323=>670,4324=>707,4325=>459,4326=>691,4327=>465,4328=>492,4329=>480,4330=>656, +4331=>500,4332=>492,4333=>524,4334=>500,4335=>688,4336=>510,4337=>739,4338=>450,4339=>479,4340=>502, +4341=>501,4345=>564,4347=>515,7680=>722,7681=>556,7682=>722,7683=>611,7684=>722,7685=>611,7686=>722, +7687=>611,7688=>722,7689=>556,7690=>722,7691=>611,7692=>722,7693=>611,7694=>722,7695=>611,7696=>722, +7697=>611,7698=>722,7699=>611,7700=>667,7701=>556,7702=>667,7703=>556,7704=>667,7705=>556,7706=>667, +7707=>556,7708=>667,7709=>556,7710=>611,7711=>333,7712=>778,7713=>611,7714=>722,7715=>611,7716=>722, +7717=>611,7718=>722,7719=>611,7720=>722,7721=>611,7722=>722,7723=>611,7724=>278,7725=>278,7726=>278, +7727=>278,7728=>722,7729=>556,7730=>722,7731=>556,7732=>722,7733=>556,7734=>611,7735=>278,7736=>611, +7737=>278,7738=>611,7739=>278,7740=>611,7741=>278,7742=>833,7743=>889,7744=>833,7745=>889,7746=>833, +7747=>889,7748=>722,7749=>611,7750=>722,7751=>611,7752=>722,7753=>611,7754=>722,7755=>611,7756=>778, +7757=>611,7758=>778,7759=>611,7760=>778,7761=>611,7762=>778,7763=>611,7764=>667,7765=>611,7766=>667, +7767=>611,7768=>722,7769=>389,7770=>722,7771=>389,7772=>722,7773=>389,7774=>722,7775=>389,7776=>667, +7777=>556,7778=>667,7779=>556,7780=>667,7781=>556,7782=>667,7783=>556,7784=>667,7785=>556,7786=>611, +7787=>333,7788=>611,7789=>333,7790=>611,7791=>333,7792=>611,7793=>333,7794=>722,7795=>611,7796=>722, +7797=>611,7798=>722,7799=>611,7800=>722,7801=>611,7802=>722,7803=>611,7804=>667,7805=>556,7806=>667, +7807=>556,7808=>944,7809=>778,7810=>944,7811=>778,7812=>944,7813=>778,7814=>944,7815=>778,7816=>944, +7817=>778,7818=>667,7819=>556,7820=>667,7821=>556,7822=>667,7823=>556,7824=>611,7825=>500,7826=>611, +7827=>500,7828=>611,7829=>500,7830=>611,7831=>333,7832=>778,7833=>556,7834=>555,7835=>333,7840=>722, +7841=>556,7842=>722,7843=>556,7844=>722,7845=>556,7846=>722,7847=>556,7848=>722,7849=>556,7850=>722, +7851=>556,7852=>722,7853=>556,7854=>722,7855=>556,7856=>722,7857=>556,7858=>722,7859=>556,7860=>722, +7861=>556,7862=>722,7863=>556,7864=>667,7865=>556,7866=>667,7867=>556,7868=>667,7869=>556,7870=>667, +7871=>556,7872=>667,7873=>556,7874=>667,7875=>556,7876=>667,7877=>556,7878=>667,7879=>556,7880=>278, +7881=>278,7882=>278,7883=>278,7884=>778,7885=>611,7886=>778,7887=>611,7888=>778,7889=>611,7890=>778, +7891=>611,7892=>778,7893=>611,7894=>778,7895=>611,7896=>778,7897=>611,7898=>778,7899=>611,7900=>778, +7901=>611,7902=>778,7903=>611,7904=>778,7905=>611,7906=>778,7907=>611,7908=>722,7909=>611,7910=>722, +7911=>611,7912=>722,7913=>611,7914=>722,7915=>611,7916=>722,7917=>611,7918=>722,7919=>611,7920=>722, +7921=>611,7922=>667,7923=>556,7924=>667,7925=>556,7926=>667,7927=>556,7928=>667,7929=>556,7936=>656, +7937=>656,7938=>656,7939=>656,7940=>656,7941=>656,7942=>656,7943=>656,7944=>764,7945=>764,7946=>916, +7947=>940,7948=>908,7949=>891,7950=>844,7951=>869,7952=>570,7953=>570,7954=>570,7955=>570,7956=>570, +7957=>570,7960=>842,7961=>836,7962=>1025,7963=>1051,7964=>1035,7965=>1049,7968=>586,7969=>586,7970=>586, +7971=>586,7972=>586,7973=>586,7974=>586,7975=>586,7976=>891,7977=>886,7978=>1081,7979=>1108,7980=>1085, +7981=>1096,7982=>1009,7983=>1023,7984=>346,7985=>346,7986=>346,7987=>346,7988=>346,7989=>346,7990=>346, +7991=>346,7992=>467,7993=>476,7994=>631,7995=>661,7996=>631,7997=>633,7998=>568,7999=>571,8000=>610, +8001=>610,8002=>610,8003=>610,8004=>610,8005=>610,8008=>945,8009=>905,8010=>1118,8011=>1121,8012=>1064, +8013=>1062,8016=>575,8017=>575,8018=>575,8019=>575,8020=>575,8021=>575,8022=>575,8023=>575,8025=>964, +8027=>1148,8029=>1162,8031=>1081,8032=>800,8033=>800,8034=>800,8035=>800,8036=>800,8037=>800,8038=>800, +8039=>800,8040=>904,8041=>875,8042=>1092,8043=>1087,8044=>1003,8045=>1002,8046=>1001,8047=>1025,8048=>656, +8049=>656,8050=>570,8051=>570,8052=>586,8053=>586,8054=>346,8055=>346,8056=>610,8057=>610,8058=>575, +8059=>575,8060=>800,8061=>800,8064=>656,8065=>656,8066=>656,8067=>656,8068=>656,8069=>656,8070=>656, +8071=>656,8072=>854,8073=>855,8074=>1006,8075=>1030,8076=>996,8077=>977,8078=>938,8079=>959,8080=>586, +8081=>586,8082=>586,8083=>586,8084=>586,8085=>586,8086=>586,8087=>586,8088=>960,8089=>960,8090=>1155, +8091=>1186,8092=>1161,8093=>1171,8094=>1087,8095=>1102,8096=>800,8097=>800,8098=>800,8099=>800,8100=>800, +8101=>800,8102=>800,8103=>800,8104=>1005,8105=>980,8106=>1201,8107=>1192,8108=>1109,8109=>1108,8110=>1106, +8111=>1130,8112=>656,8113=>656,8114=>656,8115=>656,8116=>640,8118=>656,8119=>656,8120=>764,8121=>764, +8122=>764,8123=>764,8124=>854,8125=>278,8126=>201,8127=>147,8128=>278,8129=>333,8130=>586,8131=>586, +8132=>597,8134=>586,8135=>586,8136=>911,8137=>925,8138=>941,8139=>948,8140=>826,8141=>402,8142=>403, +8143=>147,8144=>346,8145=>346,8146=>346,8147=>346,8150=>346,8151=>346,8152=>296,8153=>296,8154=>511, +8155=>521,8157=>434,8158=>433,8159=>333,8160=>575,8161=>575,8162=>575,8163=>575,8164=>626,8165=>626, +8166=>575,8167=>575,8168=>744,8169=>744,8170=>901,8171=>975,8172=>837,8173=>353,8174=>351,8175=>303, +8178=>800,8179=>800,8180=>800,8182=>800,8183=>800,8184=>979,8185=>918,8186=>936,8187=>877,8188=>895, +8189=>333,8190=>159,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>556, +8200=>278,8201=>200,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>333,8209=>333, +8210=>556,8213=>1000,8214=>437,8215=>556,8219=>278,8223=>503,8227=>350,8228=>278,8229=>666,8231=>278, +8232=>0,8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>500,8241=>1372,8242=>238, +8243=>426,8244=>614,8245=>238,8246=>379,8247=>571,8248=>450,8251=>622,8252=>666,8253=>617,8254=>556, +8255=>658,8256=>658,8257=>438,8258=>840,8259=>400,8260=>167,8261=>334,8262=>334,8263=>1222,8264=>944, +8265=>944,8266=>556,8267=>556,8268=>537,8269=>537,8270=>389,8271=>333,8272=>658,8273=>389,8274=>634, +8275=>568,8276=>658,8277=>793,8278=>515,8279=>855,8280=>722,8281=>725,8282=>224,8283=>722,8284=>604, +8285=>224,8286=>224,8287=>0,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8304=>351,8305=>351, +8308=>351,8309=>351,8310=>351,8311=>351,8312=>351,8313=>351,8314=>351,8315=>351,8316=>351,8317=>351, +8318=>351,8319=>351,8320=>351,8321=>251,8322=>351,8323=>351,8324=>351,8325=>351,8326=>351,8327=>351, +8328=>351,8329=>351,8330=>350,8331=>350,8332=>350,8333=>350,8334=>350,8355=>611,8356=>576,8357=>833, +8358=>724,8360=>1286,8362=>1049,8363=>571,8368=>594,8373=>591,8448=>985,8449=>1007,8451=>1020,8453=>981, +8454=>1042,8455=>667,8457=>930,8465=>606,8468=>883,8470=>1006,8471=>784,8476=>699,8480=>1000,8481=>1230, +8486=>780,8487=>780,8489=>286,8490=>722,8491=>722,8494=>556,8498=>626,8501=>714,8502=>651,8503=>557, +8504=>638,8506=>906,8507=>1155,8513=>778,8514=>611,8515=>611,8516=>667,8523=>710,8525=>1072,8526=>500, +8531=>869,8532=>869,8533=>869,8534=>869,8535=>869,8536=>869,8537=>869,8538=>869,8539=>869,8540=>869, +8541=>869,8542=>869,8543=>869,8544=>278,8545=>556,8546=>834,8547=>945,8548=>667,8549=>945,8550=>1223, +8551=>1501,8552=>945,8553=>667,8554=>945,8555=>1223,8556=>611,8557=>722,8558=>722,8559=>833,8560=>278, +8561=>556,8562=>834,8563=>834,8564=>556,8565=>834,8566=>1112,8567=>1390,8568=>834,8569=>556,8570=>834, +8571=>1112,8572=>278,8573=>556,8574=>611,8575=>889,8592=>964,8593=>964,8594=>964,8595=>964,8596=>964, +8597=>964,8598=>964,8599=>964,8600=>964,8601=>964,8602=>964,8603=>964,8606=>964,8607=>964,8608=>964, +8609=>964,8610=>964,8611=>964,8612=>964,8613=>964,8614=>964,8615=>964,8616=>964,8644=>964,8645=>964, +8646=>964,8647=>964,8648=>964,8649=>964,8650=>964,8706=>608,8710=>729,8721=>856,8722=>584,8723=>584, +8725=>1107,8730=>597,8800=>584,8804=>584,8805=>584,9251=>500,9674=>489,9824=>626,9825=>694,9826=>595, +9827=>776,9828=>626,9829=>694,9830=>595,9831=>776,9833=>333,9834=>556,9835=>778,9836=>778,9837=>556, +9838=>556,9839=>556,11799=>333,64256=>607,64257=>576,64258=>603,64259=>849,64260=>849,64275=>1243,64276=>1226, +64277=>1233,64278=>1238,64279=>1448,64285=>284,64286=>305,64287=>542,64288=>653,64289=>964,64290=>888,64291=>932, +64292=>845,64293=>917,64294=>933,64295=>850,64296=>1006,64297=>584,64298=>840,64299=>840,64300=>840,64301=>840, +64302=>714,64303=>714,64304=>714,64305=>651,64306=>557,64307=>638,64308=>682,64309=>348,64310=>443,64312=>670, +64313=>354,64314=>590,64315=>595,64316=>667,64318=>704,64320=>429,64321=>670,64323=>661,64324=>660,64326=>671, +64327=>672,64328=>600,64329=>840,64330=>756,64331=>212,64332=>591,64333=>550,64334=>568,64335=>714,65533=>788); +$enc=''; +$diff=''; +$file='freesansbi.z'; +$ctg='freesansbi.ctg.z'; +$originalsize=269952; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansbi.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansbi.z new file mode 100644 index 0000000..62a3322 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansbi.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansi.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansi.ctg.z new file mode 100644 index 0000000..fe5d471 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansi.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansi.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansi.php new file mode 100644 index 0000000..5b9c354 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansi.php @@ -0,0 +1,239 @@ +<?php +$type='TrueTypeUnicode'; +$name='FreeSansOblique'; +$desc=array('Ascent'=>1000,'Descent'=>-300,'CapHeight'=>22,'Flags'=>96,'FontBBox'=>'[-898 -431 1572 1072]','ItalicAngle'=>-12,'StemV'=>70,'MissingWidth'=>600); +$up=-176; +$ut=50; +$dw=600; +$cw=array( +32=>278,33=>278,34=>355,35=>556,36=>556,37=>889,38=>667,39=>191,40=>333,41=>333, +42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556,50=>556,51=>556, +52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>278,59=>278,60=>584,61=>584, +62=>584,63=>556,64=>1015,65=>667,66=>667,67=>722,68=>722,69=>667,70=>611,71=>778, +72=>722,73=>278,74=>500,75=>667,76=>556,77=>833,78=>722,79=>778,80=>667,81=>778, +82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667,90=>611,91=>278, +92=>278,93=>278,94=>469,95=>556,96=>333,97=>556,98=>556,99=>500,100=>556,101=>556, +102=>278,103=>556,104=>556,105=>222,106=>222,107=>500,108=>222,109=>833,110=>556,111=>556, +112=>556,113=>556,114=>333,115=>500,116=>278,117=>556,118=>500,119=>722,120=>500,121=>500, +122=>500,123=>334,124=>260,125=>334,126=>584,8364=>655,8218=>222,402=>278,8222=>333,8230=>1000, +8224=>556,8225=>556,710=>333,8240=>1000,352=>667,8249=>250,338=>1000,381=>611,8216=>222,8217=>222, +8220=>333,8221=>333,8226=>350,8211=>556,8212=>1000,732=>333,8482=>1000,353=>500,8250=>250,339=>944, +382=>500,376=>667,160=>278,161=>333,162=>556,163=>556,164=>556,165=>556,166=>260,167=>556, +168=>333,169=>737,170=>370,171=>444,172=>584,173=>333,174=>737,175=>333,176=>606,177=>584, +178=>352,179=>352,180=>333,181=>556,182=>537,183=>278,184=>333,185=>250,186=>365,187=>444, +188=>947,189=>947,190=>947,191=>611,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667, +198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278, +208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778,217=>722, +218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556,226=>556,227=>556, +228=>556,229=>556,230=>889,231=>500,232=>556,233=>556,234=>556,235=>556,236=>278,237=>278, +238=>278,239=>278,240=>556,241=>556,242=>556,243=>556,244=>556,245=>556,246=>556,247=>584, +248=>611,249=>556,250=>556,251=>556,252=>556,253=>500,254=>556,255=>500,256=>667,257=>556, +258=>667,259=>556,260=>667,261=>556,262=>722,263=>500,264=>722,265=>500,266=>722,267=>500, +268=>722,269=>500,270=>722,271=>722,272=>722,273=>556,274=>667,275=>556,276=>667,277=>556, +278=>667,279=>556,280=>667,281=>556,282=>667,283=>556,284=>778,285=>556,286=>778,287=>556, +288=>778,289=>556,290=>778,291=>527,292=>722,293=>556,294=>722,295=>556,296=>278,297=>278, +298=>278,299=>278,300=>278,301=>278,302=>278,303=>222,304=>278,305=>278,306=>742,307=>362, +308=>500,309=>222,310=>667,311=>500,312=>510,313=>556,314=>222,315=>556,316=>222,317=>556, +318=>387,319=>556,320=>409,321=>556,322=>222,323=>722,324=>556,325=>722,326=>556,327=>722, +328=>556,329=>722,330=>722,331=>556,332=>778,333=>556,334=>778,335=>556,336=>778,337=>556, +340=>722,341=>333,342=>722,343=>333,344=>722,345=>333,346=>667,347=>500,348=>667,349=>500, +350=>667,351=>500,354=>611,355=>278,356=>611,357=>443,358=>611,359=>278,360=>722,361=>556, +362=>722,363=>556,364=>722,365=>556,366=>722,367=>556,368=>722,369=>556,370=>722,371=>556, +372=>944,373=>722,374=>667,375=>500,377=>611,378=>500,379=>611,380=>500,383=>278,384=>556, +385=>854,386=>667,387=>556,388=>667,389=>556,390=>722,391=>722,392=>500,393=>722,394=>899, +395=>667,396=>556,397=>566,398=>667,399=>778,400=>667,401=>611,403=>778,404=>667,405=>889, +406=>278,407=>333,408=>741,409=>500,410=>333,411=>560,412=>833,413=>722,414=>556,415=>778, +416=>778,417=>556,418=>944,419=>722,420=>842,421=>556,422=>666,423=>667,424=>500,425=>611, +426=>333,427=>278,428=>611,429=>278,430=>611,431=>722,432=>556,433=>768,434=>722,435=>788, +436=>616,437=>611,438=>500,439=>611,440=>611,441=>500,442=>500,443=>556,446=>556,447=>556, +448=>260,449=>520,450=>584,451=>278,452=>1311,453=>1208,454=>1056,455=>1056,456=>778,457=>444, +458=>1158,459=>944,460=>778,461=>667,462=>556,463=>278,464=>278,465=>778,466=>556,467=>722, +468=>556,469=>722,470=>556,471=>722,472=>556,473=>722,474=>556,475=>722,476=>556,477=>556, +478=>667,479=>556,480=>667,481=>556,482=>1000,483=>889,484=>778,485=>556,486=>778,487=>556, +488=>667,489=>500,490=>778,491=>556,492=>778,493=>556,494=>611,495=>500,496=>222,497=>1333, +498=>1222,499=>1056,500=>778,501=>556,503=>630,504=>722,505=>556,506=>667,507=>556,508=>1000, +509=>889,510=>778,511=>611,512=>667,513=>556,514=>667,515=>556,516=>667,517=>556,518=>667, +519=>556,520=>278,521=>278,522=>278,523=>278,524=>778,525=>556,526=>778,527=>556,528=>722, +529=>333,530=>722,531=>333,532=>722,533=>556,534=>722,535=>556,536=>667,537=>500,538=>611, +539=>278,540=>521,541=>393,542=>722,543=>556,548=>611,549=>500,550=>667,551=>556,552=>667, +553=>556,554=>778,555=>556,556=>778,557=>556,558=>778,559=>556,560=>778,561=>556,562=>667, +563=>500,567=>222,592=>556,593=>556,594=>659,595=>556,596=>500,597=>500,598=>556,599=>556, +600=>556,601=>556,602=>804,603=>500,604=>500,605=>742,606=>500,607=>222,608=>556,609=>556, +610=>546,611=>621,612=>556,613=>556,614=>556,615=>556,616=>222,617=>222,618=>278,619=>473, +620=>427,621=>222,622=>611,623=>833,624=>833,625=>833,626=>556,627=>556,628=>560,629=>556, +630=>778,631=>722,632=>728,633=>333,634=>333,635=>393,636=>333,637=>333,638=>384,639=>369, +640=>546,641=>546,642=>500,643=>278,644=>278,645=>278,646=>444,647=>278,648=>278,649=>556, +650=>626,651=>539,652=>500,653=>722,654=>500,655=>556,656=>500,657=>500,658=>500,659=>552, +660=>556,661=>556,662=>556,663=>1000,664=>556,665=>521,666=>500,667=>546,668=>500,669=>444, +670=>500,671=>430,672=>556,673=>556,674=>556,675=>944,676=>944,677=>944,678=>689,679=>506, +680=>764,681=>766,682=>660,683=>577,684=>476,685=>486,686=>565,687=>621,688=>500,689=>500, +690=>167,691=>333,692=>333,693=>393,694=>500,695=>500,696=>330,697=>278,698=>454,699=>278, +700=>278,701=>278,702=>333,703=>333,704=>333,705=>333,706=>333,707=>333,708=>333,709=>333, +711=>333,712=>333,713=>333,714=>333,715=>333,716=>333,717=>333,718=>333,719=>333,720=>333, +721=>333,722=>333,723=>333,724=>333,725=>333,726=>333,727=>333,728=>333,729=>333,730=>333, +731=>333,733=>333,734=>333,735=>510,736=>333,737=>333,738=>333,739=>333,740=>334,741=>526, +742=>526,743=>526,744=>526,745=>526,746=>519,747=>519,748=>333,749=>333,750=>333,751=>333, +752=>383,753=>294,754=>294,755=>327,756=>261,757=>437,758=>437,759=>333,760=>278,761=>200, +762=>200,763=>200,764=>200,765=>333,766=>333,767=>333,768=>0,769=>0,770=>0,771=>0, +772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0, +782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0, +792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0, +802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0, +812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0, +822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0, +832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0, +842=>0,843=>0,844=>0,845=>0,846=>0,847=>0,848=>0,849=>0,850=>0,851=>0, +852=>0,853=>0,854=>0,855=>0,856=>0,857=>0,858=>0,859=>0,860=>0,861=>0, +862=>0,863=>0,864=>0,865=>0,866=>0,867=>0,868=>0,869=>0,870=>0,871=>0, +872=>0,873=>0,874=>0,875=>0,876=>0,877=>0,878=>0,879=>0,884=>199,885=>199, +890=>332,894=>278,900=>291,901=>624,902=>659,903=>278,904=>870,905=>870,906=>315,908=>876, +910=>903,911=>882,912=>333,913=>765,914=>643,915=>589,916=>760,917=>659,918=>682,919=>707, +920=>769,921=>256,922=>689,923=>765,924=>825,925=>687,926=>649,927=>766,928=>730,929=>649, +931=>678,932=>655,933=>733,934=>753,935=>783,936=>773,937=>768,938=>285,939=>733,940=>593, +941=>523,942=>595,943=>271,944=>549,945=>596,946=>534,947=>531,948=>566,949=>523,950=>470, +951=>557,952=>547,953=>293,954=>516,955=>579,956=>571,957=>518,958=>499,959=>561,960=>636, +961=>551,962=>564,963=>627,964=>505,965=>549,966=>715,967=>579,968=>662,969=>746,970=>335, +971=>549,972=>535,973=>503,974=>725,977=>580,978=>742,979=>809,980=>620,981=>728,982=>740, +983=>556,1008=>556,1009=>566,1012=>778,1013=>328,1024=>657,1025=>657,1026=>781,1027=>590,1028=>709, +1029=>655,1030=>254,1031=>254,1032=>532,1033=>1002,1034=>1166,1035=>772,1036=>674,1037=>730,1038=>605, +1039=>721,1040=>667,1041=>665,1042=>665,1043=>590,1044=>807,1045=>657,1046=>914,1047=>653,1048=>730, +1049=>730,1050=>674,1051=>656,1052=>846,1053=>721,1054=>778,1055=>720,1056=>649,1057=>709,1058=>606, +1059=>605,1060=>875,1061=>660,1062=>754,1063=>612,1064=>830,1065=>872,1066=>839,1067=>885,1068=>668, +1069=>708,1070=>1099,1071=>676,1072=>556,1073=>545,1074=>521,1075=>375,1076=>572,1077=>538,1078=>815, +1079=>488,1080=>557,1081=>557,1082=>519,1083=>508,1084=>618,1085=>558,1086=>533,1087=>557,1088=>569, +1089=>511,1090=>392,1091=>469,1092=>922,1093=>475,1094=>588,1095=>482,1096=>693,1097=>722,1098=>644, +1099=>731,1100=>521,1101=>509,1102=>790,1103=>550,1104=>538,1105=>538,1106=>566,1107=>375,1108=>506, +1109=>488,1110=>224,1111=>272,1112=>226,1113=>793,1114=>849,1115=>576,1116=>519,1117=>557,1118=>469, +1119=>557,1120=>942,1121=>693,1136=>749,1137=>666,1138=>785,1139=>528,1154=>456,1155=>0,1156=>0, +1157=>0,1158=>0,1159=>0,1160=>0,1161=>0,1162=>751,1163=>588,1164=>685,1165=>554,1166=>656, +1167=>606,1168=>598,1169=>396,1170=>611,1171=>409,1172=>592,1173=>448,1174=>921,1175=>826,1176=>657, +1177=>493,1178=>680,1179=>529,1180=>678,1181=>524,1182=>695,1183=>528,1184=>846,1185=>650,1186=>741, +1187=>578,1188=>992,1189=>700,1190=>1047,1191=>778,1192=>687,1193=>507,1194=>709,1195=>509,1196=>611, +1197=>393,1198=>664,1199=>580,1200=>668,1201=>617,1202=>664,1203=>489,1204=>905,1205=>662,1206=>631, +1207=>498,1208=>597,1209=>472,1210=>597,1211=>471,1212=>927,1213=>716,1214=>927,1215=>716,1216=>254, +1217=>915,1218=>815,1219=>665,1220=>510,1221=>678,1222=>533,1223=>721,1224=>558,1225=>751,1226=>589, +1227=>599,1228=>472,1229=>876,1230=>649,1231=>254,1232=>667,1233=>552,1234=>667,1235=>552,1236=>1000, +1237=>889,1238=>657,1239=>538,1240=>722,1241=>511,1242=>722,1243=>511,1244=>914,1245=>815,1246=>653, +1247=>488,1248=>611,1249=>546,1250=>730,1251=>557,1252=>730,1253=>557,1254=>774,1255=>529,1256=>785, +1257=>528,1258=>785,1259=>528,1260=>708,1261=>509,1262=>605,1263=>469,1264=>605,1265=>469,1266=>605, +1267=>469,1268=>612,1269=>482,1270=>601,1271=>430,1272=>885,1273=>731,1296=>667,1297=>500,1298=>673, +1299=>557,1306=>778,1307=>556,1308=>944,1309=>722,1310=>667,1311=>510,1329=>722,1330=>705,1331=>774, +1332=>754,1333=>722,1334=>751,1335=>485,1336=>722,1337=>782,1338=>655,1339=>699,1340=>417,1341=>853, +1342=>791,1343=>711,1344=>588,1345=>663,1346=>665,1347=>665,1348=>756,1349=>623,1350=>773,1351=>603, +1352=>722,1353=>648,1354=>722,1355=>751,1356=>750,1357=>722,1358=>748,1359=>667,1360=>699,1361=>623, +1362=>417,1363=>785,1364=>638,1365=>778,1366=>716,1369=>333,1370=>222,1371=>133,1372=>325,1373=>333, +1374=>333,1375=>333,1377=>833,1378=>556,1379=>572,1380=>581,1381=>546,1382=>588,1383=>448,1384=>556, +1385=>568,1386=>582,1387=>552,1388=>301,1389=>799,1390=>556,1391=>554,1392=>533,1393=>548,1394=>552, +1395=>552,1396=>544,1397=>222,1398=>544,1399=>456,1400=>556,1401=>390,1402=>833,1403=>509,1404=>547, +1405=>533,1406=>610,1407=>887,1408=>556,1409=>545,1410=>301,1411=>853,1412=>632,1413=>579,1414=>690, +1415=>545,1417=>278,1418=>367,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0, +1463=>0,1464=>0,1465=>0,1467=>0,1468=>0,1469=>0,1470=>488,1471=>0,1472=>212,1473=>0, +1474=>0,1475=>278,1476=>0,1488=>640,1489=>591,1490=>466,1491=>598,1492=>622,1493=>212,1494=>351, +1495=>623,1496=>608,1497=>200,1498=>526,1499=>550,1500=>600,1501=>623,1502=>621,1503=>212,1504=>378, +1505=>607,1506=>587,1507=>575,1508=>568,1509=>540,1510=>590,1511=>606,1512=>547,1513=>776,1514=>687, +1520=>424,1521=>412,1522=>400,1523=>184,1524=>344,2433=>0,2434=>300,2435=>264,2437=>594,2438=>790, +2439=>469,2440=>513,2441=>520,2442=>549,2443=>594,2444=>481,2447=>580,2448=>627,2451=>540,2452=>613, +2453=>570,2454=>467,2455=>471,2456=>428,2457=>483,2458=>408,2459=>509,2460=>591,2461=>563,2462=>771, +2463=>381,2464=>404,2465=>522,2466=>408,2467=>450,2468=>543,2469=>477,2470=>418,2471=>433,2472=>445, +2474=>499,2475=>584,2476=>377,2477=>555,2478=>448,2479=>423,2480=>390,2482=>498,2486=>498,2487=>425, +2488=>495,2489=>440,2492=>22,2493=>440,2494=>193,2495=>189,2496=>180,2497=>0,2498=>0,2499=>0, +2500=>0,2503=>252,2504=>243,2507=>889,2508=>865,2509=>0,2510=>356,2519=>219,2524=>523,2525=>408, +2527=>428,2528=>594,2529=>481,2530=>0,2531=>0,2534=>500,2535=>437,2536=>479,2537=>530,2538=>497, +2539=>500,2540=>482,2541=>503,2542=>517,2543=>481,2544=>377,2545=>377,2546=>429,2547=>383,2548=>429, +2549=>478,2550=>545,2551=>158,2552=>365,2553=>280,2554=>357,4256=>587,4257=>620,4258=>642,4259=>815, +4260=>600,4261=>595,4262=>799,4263=>893,4264=>622,4265=>597,4266=>939,4267=>602,4268=>603,4269=>790, +4270=>587,4271=>623,4272=>799,4273=>601,4274=>792,4275=>724,4276=>847,4277=>599,4278=>812,4279=>603, +4280=>653,4281=>590,4282=>754,4283=>596,4284=>653,4285=>651,4286=>596,4287=>888,4288=>593,4304=>436, +4305=>491,4306=>528,4307=>692,4308=>447,4309=>447,4310=>628,4311=>734,4312=>449,4313=>445,4314=>843, +4315=>449,4316=>449,4317=>682,4318=>449,4319=>480,4320=>682,4321=>468,4322=>710,4323=>623,4324=>697, +4325=>447,4326=>702,4327=>447,4328=>470,4329=>440,4330=>632,4331=>449,4332=>470,4333=>536,4334=>449, +4335=>656,4336=>474,4337=>630,4338=>394,4339=>419,4340=>422,4341=>436,4345=>528,4347=>515,7680=>667, +7681=>556,7682=>667,7683=>556,7684=>667,7685=>556,7686=>667,7687=>556,7688=>722,7689=>500,7690=>722, +7691=>556,7692=>722,7693=>556,7694=>722,7695=>556,7696=>722,7697=>556,7698=>722,7699=>556,7700=>667, +7701=>556,7702=>667,7703=>556,7704=>667,7705=>556,7706=>667,7707=>556,7708=>667,7709=>556,7710=>611, +7711=>278,7712=>778,7713=>556,7714=>722,7715=>556,7716=>722,7717=>556,7718=>722,7719=>556,7720=>722, +7721=>556,7722=>722,7723=>556,7724=>278,7725=>222,7726=>278,7727=>278,7728=>667,7729=>500,7730=>667, +7731=>500,7732=>667,7733=>500,7734=>556,7735=>222,7736=>556,7737=>222,7738=>556,7739=>222,7740=>556, +7741=>222,7742=>833,7743=>833,7744=>833,7745=>833,7746=>833,7747=>833,7748=>722,7749=>556,7750=>722, +7751=>556,7752=>722,7753=>556,7754=>722,7755=>556,7756=>778,7757=>556,7758=>778,7759=>556,7760=>778, +7761=>556,7762=>778,7763=>556,7764=>667,7765=>556,7766=>667,7767=>556,7768=>722,7769=>333,7770=>722, +7771=>333,7772=>722,7773=>333,7774=>722,7775=>333,7776=>667,7777=>500,7778=>667,7779=>500,7780=>667, +7781=>500,7782=>667,7783=>500,7784=>667,7785=>500,7786=>611,7787=>278,7788=>611,7789=>278,7790=>611, +7791=>278,7792=>611,7793=>278,7794=>722,7795=>556,7796=>722,7797=>556,7798=>722,7799=>556,7800=>722, +7801=>556,7802=>722,7803=>556,7804=>667,7805=>500,7806=>667,7807=>500,7808=>944,7809=>722,7810=>944, +7811=>722,7812=>944,7813=>722,7814=>944,7815=>722,7816=>944,7817=>722,7818=>667,7819=>500,7820=>667, +7821=>500,7822=>667,7823=>500,7824=>611,7825=>500,7826=>611,7827=>500,7828=>611,7829=>500,7830=>556, +7831=>278,7832=>722,7833=>500,7834=>555,7835=>278,7840=>667,7841=>556,7842=>667,7843=>556,7844=>667, +7845=>556,7846=>667,7847=>556,7848=>667,7849=>556,7850=>667,7851=>556,7852=>667,7853=>556,7854=>667, +7855=>556,7856=>667,7857=>556,7858=>667,7859=>556,7860=>667,7861=>556,7862=>667,7863=>556,7864=>667, +7865=>556,7866=>667,7867=>556,7868=>667,7869=>556,7870=>667,7871=>556,7872=>667,7873=>556,7874=>667, +7875=>556,7876=>667,7877=>556,7878=>667,7879=>556,7880=>278,7881=>278,7882=>278,7883=>222,7884=>778, +7885=>556,7886=>778,7887=>556,7888=>778,7889=>556,7890=>778,7891=>556,7892=>778,7893=>556,7894=>778, +7895=>556,7896=>778,7897=>556,7898=>778,7899=>556,7900=>778,7901=>556,7902=>778,7903=>556,7904=>778, +7905=>556,7906=>778,7907=>556,7908=>722,7909=>556,7910=>722,7911=>556,7912=>722,7913=>556,7914=>722, +7915=>556,7916=>722,7917=>556,7918=>722,7919=>556,7920=>722,7921=>556,7922=>667,7923=>500,7924=>667, +7925=>500,7926=>667,7927=>500,7928=>667,7929=>500,7936=>596,7937=>596,7938=>596,7939=>596,7940=>596, +7941=>596,7942=>596,7943=>596,7944=>718,7945=>718,7946=>796,7947=>780,7948=>746,7949=>744,7950=>718, +7951=>718,7952=>523,7953=>523,7954=>523,7955=>523,7956=>523,7957=>523,7960=>759,7961=>751,7962=>962, +7963=>957,7964=>958,7965=>947,7968=>557,7969=>557,7970=>557,7971=>557,7972=>557,7973=>557,7974=>557, +7975=>557,7976=>807,7977=>796,7978=>1013,7979=>1002,7980=>1009,7981=>1000,7982=>882,7983=>919,7984=>293, +7985=>293,7986=>361,7987=>382,7988=>347,7989=>329,7990=>352,7991=>347,7992=>353,7993=>348,7994=>555, +7995=>557,7996=>557,7997=>545,7998=>435,7999=>448,8000=>561,8001=>561,8002=>561,8003=>561,8004=>561, +8005=>561,8008=>792,8009=>801,8010=>1031,8011=>1029,8012=>931,8013=>931,8016=>549,8017=>549,8018=>549, +8019=>549,8020=>549,8021=>549,8022=>549,8023=>549,8025=>838,8027=>1004,8029=>1036,8031=>936,8032=>746, +8033=>746,8034=>746,8035=>746,8036=>746,8037=>746,8038=>746,8039=>746,8040=>768,8041=>794,8042=>1003, +8043=>1002,8044=>922,8045=>918,8046=>871,8047=>893,8048=>596,8049=>596,8050=>523,8051=>523,8052=>557, +8053=>557,8054=>293,8055=>293,8056=>561,8057=>561,8058=>549,8059=>549,8060=>746,8061=>746,8064=>596, +8065=>596,8066=>596,8067=>596,8068=>596,8069=>596,8070=>596,8071=>596,8072=>859,8073=>861,8074=>948, +8075=>928,8076=>886,8077=>895,8078=>865,8079=>864,8080=>557,8081=>557,8082=>557,8083=>557,8084=>557, +8085=>557,8086=>557,8087=>557,8088=>890,8089=>894,8090=>1092,8091=>1084,8092=>1095,8093=>1080,8094=>953, +8095=>986,8096=>746,8097=>746,8098=>746,8099=>746,8100=>746,8101=>746,8102=>746,8103=>746,8104=>892, +8105=>907,8106=>1113,8107=>1095,8108=>1034,8109=>1030,8110=>983,8111=>1002,8112=>596,8113=>596,8114=>596, +8115=>596,8116=>593,8118=>596,8119=>596,8120=>765,8121=>765,8122=>765,8123=>765,8124=>861,8125=>147, +8126=>201,8127=>147,8128=>278,8129=>333,8130=>557,8131=>557,8132=>595,8134=>557,8135=>557,8136=>835, +8137=>849,8138=>895,8139=>861,8140=>786,8141=>602,8142=>601,8143=>333,8144=>335,8145=>322,8146=>357, +8147=>336,8150=>340,8151=>320,8152=>300,8153=>298,8154=>439,8155=>408,8157=>434,8158=>433,8159=>333, +8160=>549,8161=>549,8162=>549,8163=>549,8164=>551,8165=>551,8166=>549,8167=>549,8168=>733,8169=>733, +8170=>794,8171=>832,8172=>739,8173=>333,8174=>624,8175=>303,8178=>746,8179=>746,8180=>725,8182=>746, +8183=>746,8184=>889,8185=>828,8186=>836,8187=>811,8188=>867,8189=>333,8190=>159,8192=>500,8193=>1000, +8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>556,8200=>278,8201=>200,8202=>100,8203=>0, +8204=>0,8205=>0,8206=>0,8207=>0,8208=>333,8209=>333,8210=>556,8213=>1000,8214=>312,8215=>567, +8219=>221,8223=>333,8227=>350,8228=>278,8229=>666,8231=>278,8232=>0,8233=>0,8234=>0,8235=>0, +8236=>0,8237=>0,8238=>0,8239=>500,8241=>1360,8242=>278,8243=>469,8244=>680,8245=>278,8246=>469, +8247=>680,8248=>376,8251=>622,8252=>556,8253=>556,8254=>556,8255=>658,8256=>658,8257=>438,8258=>840, +8259=>400,8260=>167,8261=>334,8262=>334,8263=>1112,8264=>834,8265=>834,8266=>556,8267=>537,8268=>537, +8269=>537,8270=>389,8271=>278,8272=>658,8273=>389,8274=>634,8275=>500,8276=>658,8277=>1000,8278=>515, +8279=>855,8280=>722,8281=>725,8282=>224,8283=>722,8284=>604,8285=>224,8286=>224,8287=>0,8288=>0, +8289=>0,8290=>0,8291=>0,8292=>0,8304=>351,8305=>350,8308=>351,8309=>351,8310=>351,8311=>351, +8312=>351,8313=>351,8314=>350,8315=>350,8316=>350,8317=>350,8318=>350,8319=>350,8320=>351,8321=>251, +8322=>351,8323=>351,8324=>351,8325=>353,8326=>351,8327=>351,8328=>351,8329=>351,8330=>350,8331=>350, +8332=>350,8333=>350,8334=>350,8353=>615,8354=>601,8355=>611,8356=>556,8357=>833,8358=>682,8359=>1205, +8360=>1222,8361=>879,8362=>869,8363=>538,8365=>667,8366=>611,8368=>570,8369=>684,8370=>717,8371=>667, +8372=>667,8373=>640,8400=>0,8401=>0,8402=>0,8403=>0,8406=>0,8407=>0,8411=>0,8412=>0, +8413=>0,8414=>0,8415=>0,8416=>0,8417=>0,8421=>0,8422=>0,8423=>0,8424=>0,8425=>0, +8426=>0,8427=>0,8428=>0,8429=>0,8430=>0,8431=>0,8432=>0,8448=>970,8449=>979,8451=>1019, +8452=>556,8453=>876,8454=>922,8455=>667,8457=>867,8459=>969,8460=>615,8462=>556,8463=>572,8464=>809, +8465=>606,8466=>874,8468=>747,8470=>934,8471=>737,8472=>600,8475=>850,8476=>699,8480=>1000,8481=>1220, +8486=>768,8487=>744,8488=>512,8489=>286,8490=>722,8491=>722,8492=>908,8493=>623,8494=>556,8496=>562, +8498=>556,8499=>1080,8501=>520,8502=>591,8503=>456,8504=>598,8506=>843,8507=>1220,8513=>778,8514=>556, +8515=>556,8516=>667,8522=>516,8523=>640,8525=>936,8526=>477,8531=>869,8532=>869,8533=>869,8534=>869, +8535=>869,8536=>869,8537=>869,8538=>869,8539=>869,8540=>869,8541=>869,8542=>869,8543=>869,8544=>278, +8545=>556,8546=>834,8547=>945,8548=>667,8549=>945,8550=>1223,8551=>1501,8552=>945,8553=>667,8554=>945, +8555=>1223,8556=>556,8557=>722,8558=>722,8559=>833,8560=>222,8561=>444,8562=>666,8563=>722,8564=>500, +8565=>722,8566=>944,8567=>1166,8568=>722,8569=>500,8570=>722,8571=>944,8572=>222,8573=>500,8574=>556, +8575=>833,8592=>987,8593=>603,8594=>987,8595=>603,8596=>1042,8597=>1042,8706=>556,8710=>712,8721=>804, +8722=>584,8725=>947,8730=>542,8739=>200,8741=>312,8800=>584,8804=>584,8805=>584,9251=>500,9674=>489, +9824=>626,9825=>694,9826=>595,9827=>776,9828=>626,9829=>694,9830=>595,9831=>776,9833=>333,9834=>556, +9835=>722,9836=>722,9837=>415,9838=>377,9839=>402,11799=>333,64256=>494,64257=>471,64258=>474,64259=>659, +64260=>654,64261=>530,64275=>1027,64276=>1056,64277=>1058,64278=>1073,64279=>1301,64285=>200,64286=>305,64287=>400, +64288=>587,64289=>890,64290=>848,64291=>872,64292=>800,64293=>850,64294=>873,64295=>797,64296=>937,64297=>584, +64298=>776,64299=>776,64300=>776,64301=>776,64302=>640,64303=>640,64304=>640,64305=>591,64306=>466,64307=>598, +64308=>622,64309=>262,64310=>351,64312=>608,64313=>270,64314=>526,64315=>550,64316=>600,64318=>621,64320=>378, +64321=>607,64323=>575,64324=>568,64326=>590,64327=>606,64328=>547,64329=>776,64330=>687,64331=>212,64332=>591, +64333=>550,64334=>568,64335=>640,65533=>788); +$enc=''; +$diff=''; +$file='freesansi.z'; +$ctg='freesansi.ctg.z'; +$originalsize=410728; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansi.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansi.z new file mode 100644 index 0000000..d675eb2 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freesansi.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserif.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserif.ctg.z new file mode 100644 index 0000000..06f25fc Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserif.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserif.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserif.php new file mode 100644 index 0000000..aedc388 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserif.php @@ -0,0 +1,504 @@ +<?php +$type='TrueTypeUnicode'; +$name='FreeSerif'; +$desc=array('Ascent'=>900,'Descent'=>-300,'CapHeight'=>10,'Flags'=>96,'FontBBox'=>'[-879 -1201 1767 2606]','ItalicAngle'=>-33.2,'StemV'=>70,'MissingWidth'=>600); +$up=-125; +$ut=50; +$dw=600; +$cw=array( +32=>250,33=>333,34=>408,35=>500,36=>500,37=>833,38=>778,39=>180,40=>333,41=>333, +42=>500,43=>564,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500,50=>500,51=>500, +52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>278,59=>278,60=>564,61=>564, +62=>564,63=>444,64=>921,65=>722,66=>667,67=>667,68=>722,69=>611,70=>556,71=>722, +72=>722,73=>333,74=>389,75=>722,76=>611,77=>889,78=>722,79=>722,80=>556,81=>722, +82=>667,83=>556,84=>611,85=>722,86=>722,87=>944,88=>722,89=>722,90=>611,91=>333, +92=>278,93=>333,94=>469,95=>500,96=>333,97=>444,98=>500,99=>444,100=>500,101=>444, +102=>333,103=>500,104=>500,105=>278,106=>278,107=>500,108=>278,109=>778,110=>500,111=>500, +112=>500,113=>500,114=>333,115=>389,116=>278,117=>500,118=>500,119=>722,120=>500,121=>500, +122=>444,123=>480,124=>200,125=>480,126=>541,8364=>741,8218=>250,402=>333,8222=>444,8230=>1000, +8224=>500,8225=>500,710=>333,8240=>1000,352=>556,8249=>250,338=>889,381=>611,8216=>250,8217=>250, +8220=>444,8221=>444,8226=>350,8211=>500,8212=>1000,732=>333,8482=>980,353=>389,8250=>250,339=>722, +382=>444,376=>722,160=>250,161=>333,162=>500,163=>500,164=>500,165=>500,166=>200,167=>500, +168=>333,169=>760,170=>276,171=>444,172=>564,173=>333,174=>760,175=>333,176=>400,177=>564, +178=>320,179=>320,180=>333,181=>500,182=>453,183=>250,184=>333,185=>320,186=>310,187=>441, +188=>750,189=>750,190=>750,191=>444,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722, +198=>889,199=>667,200=>611,201=>611,202=>611,203=>611,204=>333,205=>333,206=>333,207=>333, +208=>722,209=>722,210=>722,211=>722,212=>722,213=>722,214=>722,215=>564,216=>722,217=>722, +218=>722,219=>722,220=>722,221=>722,222=>576,223=>500,224=>444,225=>444,226=>444,227=>444, +228=>444,229=>444,230=>667,231=>444,232=>444,233=>444,234=>444,235=>444,236=>278,237=>278, +238=>278,239=>278,240=>501,241=>500,242=>500,243=>500,244=>500,245=>500,246=>500,247=>564, +248=>500,249=>500,250=>500,251=>500,252=>500,253=>500,254=>496,255=>500,256=>722,257=>444, +258=>722,259=>444,260=>722,261=>444,262=>667,263=>444,264=>667,265=>444,266=>667,267=>444, +268=>667,269=>444,270=>722,271=>600,272=>722,273=>500,274=>611,275=>444,276=>611,277=>444, +278=>611,279=>444,280=>611,281=>444,282=>611,283=>444,284=>722,285=>500,286=>722,287=>500, +288=>722,289=>500,290=>722,291=>500,292=>722,293=>500,294=>722,295=>548,296=>333,297=>278, +298=>333,299=>278,300=>333,301=>278,302=>333,303=>278,304=>333,305=>278,306=>703,307=>529, +308=>389,309=>278,310=>722,311=>500,312=>500,313=>611,314=>278,315=>611,316=>278,317=>611, +318=>348,319=>611,320=>444,321=>611,322=>278,323=>722,324=>500,325=>722,326=>500,327=>722, +328=>500,329=>556,330=>722,331=>500,332=>722,333=>500,334=>722,335=>500,336=>722,337=>500, +340=>667,341=>333,342=>667,343=>333,344=>667,345=>333,346=>556,347=>389,348=>556,349=>389, +350=>556,351=>389,354=>611,355=>278,356=>611,357=>278,358=>611,359=>278,360=>722,361=>500, +362=>722,363=>500,364=>722,365=>500,366=>722,367=>500,368=>722,369=>500,370=>722,371=>500, +372=>944,373=>722,374=>722,375=>500,377=>611,378=>444,379=>611,380=>444,383=>333,384=>500, +385=>667,386=>576,387=>500,388=>646,389=>500,390=>667,391=>667,392=>444,393=>722,394=>722, +395=>646,396=>500,397=>534,398=>611,399=>722,400=>518,401=>556,403=>722,404=>665,405=>729, +406=>333,407=>333,408=>810,409=>500,410=>278,411=>480,412=>944,413=>722,414=>500,415=>726, +416=>722,417=>516,418=>1043,419=>778,420=>556,421=>500,422=>667,423=>556,424=>389,425=>627, +426=>592,427=>278,428=>611,429=>278,430=>611,431=>800,432=>518,433=>743,434=>722,435=>822, +436=>667,437=>611,438=>444,439=>530,440=>556,441=>389,442=>394,443=>500,444=>615,445=>439, +446=>421,447=>500,448=>200,449=>400,450=>600,451=>333,452=>1333,453=>1166,454=>944,455=>1000, +456=>889,457=>556,458=>1111,459=>1000,460=>778,461=>722,462=>444,463=>333,464=>278,465=>722, +466=>500,467=>722,468=>500,469=>722,470=>500,471=>722,472=>500,473=>722,474=>500,475=>722, +476=>500,477=>444,478=>722,479=>444,480=>722,481=>444,482=>889,483=>667,484=>722,485=>500, +486=>722,487=>500,488=>722,489=>500,490=>722,491=>500,492=>722,493=>500,494=>530,495=>389, +496=>278,497=>1333,498=>1166,499=>944,500=>722,501=>500,502=>944,503=>522,504=>722,505=>500, +506=>722,507=>444,508=>889,509=>667,510=>722,511=>500,512=>722,513=>444,514=>722,515=>444, +516=>611,517=>444,518=>611,519=>444,520=>333,521=>278,522=>333,523=>278,524=>722,525=>500, +526=>722,527=>500,528=>667,529=>333,530=>667,531=>333,532=>500,533=>500,534=>722,535=>500, +536=>556,537=>389,538=>611,539=>278,540=>424,541=>455,542=>722,543=>500,544=>715,545=>588, +546=>565,547=>468,548=>611,549=>444,550=>722,551=>444,552=>611,553=>444,554=>722,555=>500, +556=>722,557=>500,558=>722,559=>500,560=>722,561=>500,562=>722,563=>500,564=>407,565=>597, +566=>379,567=>278,568=>771,569=>760,570=>722,571=>667,572=>444,573=>611,574=>611,575=>389, +576=>444,577=>444,578=>444,579=>667,580=>722,581=>722,582=>611,583=>444,584=>389,585=>278, +586=>796,587=>590,588=>667,589=>333,590=>722,591=>500,592=>444,593=>500,594=>507,595=>500, +596=>444,597=>444,598=>500,599=>500,600=>444,601=>444,602=>722,603=>426,604=>426,605=>674, +606=>454,607=>278,608=>500,609=>500,610=>484,611=>500,612=>582,613=>500,614=>500,615=>500, +616=>278,617=>278,618=>278,619=>278,620=>278,621=>278,622=>556,623=>778,624=>778,625=>778, +626=>500,627=>500,628=>500,629=>491,630=>668,631=>693,632=>640,633=>333,634=>333,635=>333, +636=>333,637=>333,638=>333,639=>333,640=>446,641=>446,642=>389,643=>333,644=>500,645=>333, +646=>500,647=>278,648=>278,649=>500,650=>517,651=>514,652=>500,653=>722,654=>500,655=>510, +656=>524,657=>444,658=>389,659=>456,660=>444,661=>444,662=>444,663=>444,664=>722,665=>468, +666=>454,667=>665,668=>524,669=>347,670=>500,671=>443,672=>500,673=>444,674=>444,675=>798, +676=>795,677=>805,678=>554,679=>561,680=>678,681=>722,682=>554,683=>554,684=>500,685=>500, +686=>611,687=>611,688=>300,689=>300,690=>278,691=>278,692=>278,693=>309,694=>306,695=>432, +696=>310,697=>250,698=>408,699=>333,700=>333,701=>333,702=>333,703=>333,704=>258,705=>258, +706=>374,707=>374,708=>383,709=>383,711=>333,712=>250,713=>333,714=>333,715=>333,716=>250, +717=>333,718=>333,719=>333,720=>278,721=>278,722=>333,723=>333,724=>333,725=>333,726=>333, +727=>333,728=>333,729=>333,730=>333,731=>333,733=>382,734=>336,735=>352,736=>311,737=>200, +738=>243,739=>328,740=>300,741=>460,742=>460,743=>460,744=>460,745=>460,746=>477,747=>475, +748=>339,749=>333,750=>444,751=>383,752=>383,753=>294,754=>294,755=>327,756=>261,757=>437, +758=>437,759=>333,760=>278,761=>175,762=>175,763=>175,764=>175,765=>337,766=>337,767=>326, +768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0, +778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0, +788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0, +798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0, +808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0, +818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0, +828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0, +838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0,845=>0,846=>0,847=>0, +848=>0,849=>0,850=>0,851=>0,852=>0,853=>0,854=>0,855=>0,856=>0,857=>0, +858=>0,859=>0,860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,867=>0, +868=>0,869=>0,870=>0,871=>0,872=>0,873=>0,874=>0,875=>0,876=>0,877=>0, +878=>0,879=>0,884=>199,885=>199,890=>332,894=>278,900=>267,901=>333,902=>722,903=>250, +904=>800,905=>902,906=>507,908=>818,910=>861,911=>871,912=>286,913=>722,914=>667,915=>586, +916=>660,917=>611,918=>611,919=>722,920=>726,921=>333,922=>722,923=>722,924=>889,925=>722, +926=>628,927=>722,928=>722,929=>556,931=>627,932=>611,933=>696,934=>742,935=>722,936=>808, +937=>743,938=>333,939=>718,940=>583,941=>426,942=>536,943=>286,944=>514,945=>583,946=>527, +947=>480,948=>534,949=>426,950=>466,951=>536,952=>534,953=>286,954=>544,955=>476,956=>536, +957=>480,958=>514,959=>500,960=>587,961=>528,962=>452,963=>537,964=>420,965=>514,966=>643, +967=>480,968=>693,969=>693,970=>286,971=>514,972=>500,973=>514,974=>693,976=>534,977=>587, +978=>620,979=>809,980=>620,981=>640,982=>684,983=>534,984=>556,985=>500,986=>594,987=>426, +988=>556,989=>445,990=>656,991=>400,992=>722,993=>570,994=>960,995=>673,996=>581,997=>429, +998=>560,999=>407,1000=>450,1001=>321,1002=>842,1003=>593,1004=>564,1005=>413,1006=>618,1007=>438, +1008=>534,1009=>534,1010=>485,1011=>278,1012=>726,1013=>361,1014=>361,1015=>576,1016=>542,1017=>667, +1018=>889,1019=>709,1020=>534,1021=>667,1022=>1000,1023=>1000,1024=>615,1025=>613,1026=>748,1027=>570, +1028=>659,1029=>487,1030=>329,1031=>329,1032=>381,1033=>943,1034=>985,1035=>827,1036=>669,1037=>723, +1038=>709,1039=>723,1040=>711,1041=>576,1042=>626,1043=>570,1044=>639,1045=>613,1046=>937,1047=>580, +1048=>723,1049=>723,1050=>669,1051=>684,1052=>891,1053=>723,1054=>722,1055=>723,1056=>576,1057=>659, +1058=>608,1059=>709,1060=>750,1061=>714,1062=>728,1063=>682,1064=>984,1065=>988,1066=>725,1067=>863, +1068=>576,1069=>659,1070=>966,1071=>648,1072=>434,1073=>495,1074=>468,1075=>386,1076=>488,1077=>436, +1078=>662,1079=>404,1080=>524,1081=>524,1082=>498,1083=>490,1084=>632,1085=>524,1086=>491,1087=>524, +1088=>500,1089=>422,1090=>422,1091=>471,1092=>694,1093=>482,1094=>522,1095=>506,1096=>756,1097=>754, +1098=>503,1099=>626,1100=>431,1101=>430,1102=>664,1103=>492,1104=>434,1105=>434,1106=>479,1107=>386, +1108=>430,1109=>347,1110=>269,1111=>278,1112=>278,1113=>677,1114=>711,1115=>514,1116=>498,1117=>524, +1118=>471,1119=>524,1120=>978,1121=>664,1122=>718,1123=>506,1124=>939,1125=>647,1126=>912,1127=>643, +1128=>1248,1129=>894,1130=>948,1131=>662,1132=>1299,1133=>911,1134=>516,1135=>391,1136=>870,1137=>694, +1138=>726,1139=>491,1140=>780,1141=>550,1142=>780,1143=>550,1144=>1207,1145=>946,1146=>877,1147=>611, +1148=>978,1149=>664,1150=>978,1151=>664,1152=>594,1153=>428,1154=>232,1155=>0,1156=>0,1157=>0, +1158=>0,1159=>0,1160=>0,1161=>0,1162=>715,1163=>522,1164=>562,1165=>430,1166=>556,1167=>511, +1168=>564,1169=>398,1170=>586,1171=>402,1172=>573,1173=>463,1174=>1001,1175=>688,1176=>580,1177=>414, +1178=>698,1179=>517,1180=>734,1181=>537,1182=>671,1183=>498,1184=>842,1185=>573,1186=>732,1187=>524, +1188=>926,1189=>652,1190=>1014,1191=>721,1192=>671,1193=>531,1194=>667,1195=>437,1196=>611,1197=>454, +1198=>722,1199=>563,1200=>722,1201=>562,1202=>783,1203=>517,1204=>967,1205=>693,1206=>691,1207=>510, +1208=>718,1209=>538,1210=>674,1211=>508,1212=>866,1213=>566,1214=>866,1215=>566,1216=>333,1217=>937, +1218=>662,1219=>626,1220=>446,1221=>702,1222=>489,1223=>722,1224=>497,1225=>823,1226=>545,1227=>674, +1228=>504,1229=>889,1230=>630,1231=>333,1232=>711,1233=>434,1234=>711,1235=>434,1236=>889,1237=>644, +1238=>613,1239=>449,1240=>722,1241=>449,1242=>722,1243=>449,1244=>937,1245=>662,1246=>580,1247=>404, +1248=>530,1249=>366,1250=>723,1251=>524,1252=>723,1253=>524,1254=>722,1255=>491,1256=>722,1257=>491, +1258=>722,1259=>491,1260=>659,1261=>430,1262=>709,1263=>471,1264=>709,1265=>471,1266=>709,1267=>471, +1268=>682,1269=>506,1270=>564,1271=>388,1272=>863,1273=>626,1274=>556,1275=>388,1276=>720,1277=>445, +1278=>722,1279=>495,1280=>556,1281=>504,1282=>900,1283=>634,1284=>553,1285=>471,1286=>803,1287=>518, +1288=>964,1289=>637,1290=>968,1291=>682,1292=>722,1293=>433,1294=>710,1295=>504,1296=>532,1297=>409, +1298=>702,1299=>489,1300=>960,1301=>644,1302=>823,1303=>702,1304=>961,1305=>766,1306=>722,1307=>504, +1308=>944,1309=>693,1310=>690,1311=>502,1312=>994,1313=>695,1314=>1011,1315=>727,1425=>0,1426=>0, +1427=>0,1428=>0,1429=>0,1430=>0,1431=>418,1432=>0,1433=>0,1434=>0,1435=>0,1436=>0, +1437=>0,1438=>0,1439=>0,1440=>0,1441=>0,1442=>0,1443=>0,1444=>0,1445=>0,1446=>0, +1447=>0,1448=>0,1449=>0,1450=>0,1451=>0,1452=>0,1453=>0,1454=>0,1455=>0,1456=>0, +1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0, +1467=>0,1468=>0,1469=>0,1470=>440,1471=>0,1472=>126,1473=>0,1474=>0,1475=>418,1476=>0, +1477=>0,1478=>350,1479=>0,1488=>537,1489=>537,1490=>350,1491=>537,1492=>537,1493=>350,1494=>350, +1495=>537,1496=>537,1497=>350,1498=>537,1499=>537,1500=>537,1501=>537,1502=>537,1503=>350,1504=>350, +1505=>537,1506=>537,1507=>537,1508=>537,1509=>537,1510=>537,1511=>537,1512=>537,1513=>537,1514=>537, +1520=>537,1521=>537,1522=>537,1523=>396,1524=>396,1548=>226,1563=>250,1567=>473,1569=>350,1570=>321, +1571=>249,1572=>399,1573=>249,1574=>776,1575=>249,1576=>950,1577=>424,1578=>925,1579=>924,1580=>738, +1581=>748,1582=>701,1583=>397,1584=>399,1585=>328,1586=>331,1587=>951,1588=>949,1589=>949,1590=>949, +1591=>557,1592=>550,1593=>625,1594=>602,1601=>801,1602=>696,1603=>757,1604=>655,1605=>549,1606=>651, +1607=>424,1608=>399,1609=>776,1610=>776,1611=>0,1613=>0,1614=>0,1615=>0,1616=>0,1617=>0, +1618=>0,1619=>0,1620=>0,1621=>0,1632=>297,1633=>254,1634=>427,1635=>497,1636=>440,1637=>465, +1638=>466,1639=>421,1640=>459,1641=>424,1643=>212,1652=>300,1662=>926,1670=>750,1688=>338,1711=>874, +1740=>776,1748=>176,1920=>450,1921=>501,1922=>582,1923=>544,1924=>482,1925=>433,1926=>448,1927=>462, +1928=>474,1929=>471,1930=>469,1931=>537,1932=>499,1933=>514,1934=>471,1935=>572,1936=>880,1937=>440, +1938=>476,1939=>594,1940=>469,1941=>448,1942=>441,1943=>519,1944=>573,1945=>459,1946=>447,1947=>496, +1948=>541,1949=>887,1950=>883,1951=>964,1952=>558,1953=>505,1954=>471,1955=>554,1956=>459,1957=>486, +1958=>36,1959=>36,1960=>43,1961=>45,1962=>43,1963=>45,1964=>45,1965=>45,1966=>45,1967=>45, +1968=>0,2305=>415,2306=>398,2307=>398,2309=>862,2310=>1042,2311=>553,2312=>553,2313=>597,2314=>848, +2315=>967,2316=>828,2317=>654,2319=>654,2321=>1042,2323=>1042,2324=>1042,2325=>743,2326=>798,2327=>694, +2328=>694,2329=>730,2330=>734,2331=>888,2332=>814,2333=>834,2334=>734,2335=>629,2336=>629,2337=>653, +2338=>609,2339=>694,2340=>654,2341=>694,2342=>588,2343=>694,2344=>654,2345=>654,2346=>615,2347=>788, +2348=>621,2349=>694,2350=>694,2351=>694,2352=>575,2353=>575,2354=>787,2355=>848,2356=>848,2357=>621, +2359=>615,2360=>734,2361=>609,2364=>398,2365=>569,2366=>341,2367=>341,2368=>341,2369=>0,2370=>0, +2371=>0,2372=>0,2373=>415,2375=>615,2376=>615,2377=>341,2379=>341,2380=>341,2381=>0,2384=>1047, +2392=>743,2393=>798,2394=>694,2395=>814,2396=>653,2397=>609,2398=>788,2400=>967,2401=>828,2402=>0, +2403=>0,2404=>398,2405=>478,2406=>455,2407=>420,2408=>569,2409=>509,2410=>702,2411=>629,2412=>569, +2413=>702,2414=>609,2415=>609,2416=>626,2433=>0,2434=>300,2435=>312,2437=>594,2438=>776,2439=>469, +2440=>513,2441=>535,2442=>561,2443=>604,2444=>481,2447=>580,2448=>604,2451=>540,2452=>620,2453=>570, +2454=>485,2455=>484,2456=>471,2457=>457,2458=>408,2459=>452,2460=>591,2461=>551,2462=>771,2463=>414, +2464=>404,2465=>522,2466=>415,2467=>450,2468=>551,2469=>477,2470=>478,2471=>449,2472=>448,2474=>535, +2475=>611,2476=>443,2477=>534,2478=>492,2479=>474,2480=>442,2482=>542,2486=>507,2487=>467,2488=>523, +2489=>419,2492=>0,2493=>419,2494=>202,2495=>189,2496=>202,2497=>0,2498=>0,2499=>0,2500=>0, +2503=>294,2504=>289,2507=>774,2508=>825,2509=>0,2510=>356,2519=>219,2524=>523,2525=>420,2527=>469, +2528=>604,2529=>481,2530=>0,2531=>0,2534=>500,2535=>437,2536=>479,2537=>507,2538=>497,2539=>500, +2540=>482,2541=>503,2542=>517,2543=>481,2544=>443,2545=>443,2546=>429,2547=>383,2548=>432,2549=>478, +2550=>539,2551=>158,2552=>365,2553=>280,2554=>357,2561=>0,2562=>0,2563=>385,2565=>728,2566=>884, +2567=>656,2568=>656,2569=>580,2570=>580,2575=>482,2576=>728,2579=>580,2580=>728,2581=>534,2582=>518, +2583=>602,2584=>674,2585=>530,2586=>502,2587=>576,2588=>476,2589=>558,2590=>501,2591=>510,2592=>540, +2593=>508,2594=>512,2595=>558,2596=>468,2597=>518,2598=>488,2599=>518,2600=>522,2602=>518,2603=>490, +2604=>546,2605=>500,2606=>530,2607=>654,2608=>522,2610=>710,2611=>710,2613=>498,2614=>530,2616=>530, +2617=>501,2620=>286,2622=>156,2623=>174,2624=>174,2625=>0,2626=>0,2631=>0,2632=>0,2635=>0, +2636=>0,2637=>0,2641=>0,2649=>534,2650=>618,2651=>492,2652=>484,2654=>506,2662=>616,2663=>480, +2664=>560,2665=>480,2666=>468,2667=>492,2668=>514,2669=>538,2670=>572,2671=>560,2672=>0,2673=>0, +2674=>498,2675=>596,2676=>900,2677=>0,2946=>345,2947=>616,2949=>910,2950=>1072,2951=>848,2952=>591, +2953=>492,2954=>1123,2958=>602,2959=>602,2960=>691,2962=>753,2963=>753,2964=>1597,2965=>677,2969=>697, +2970=>607,2972=>691,2974=>871,2975=>589,2979=>1230,2980=>688,2984=>560,2985=>911,2986=>477,2990=>625, +2991=>672,2992=>452,2993=>553,2994=>651,2995=>804,2996=>645,2997=>740,2999=>865,3000=>870,3001=>1067, +3006=>452,3007=>176,3008=>293,3009=>404,3010=>601,3014=>690,3015=>503,3016=>839,3018=>1188,3019=>982, +3020=>1519,3021=>234,3031=>804,3330=>417,3331=>221,3333=>1055,3334=>1195,3335=>792,3336=>1467,3337=>569, +3338=>1243,3339=>676,3340=>897,3342=>1008,3343=>1004,3344=>1538,3346=>585,3347=>981,3348=>1254,3349=>775, +3350=>798,3351=>691,3352=>1095,3353=>809,3354=>726,3355=>963,3356=>703,3357=>1244,3358=>1103,3359=>462, +3360=>531,3361=>983,3362=>1027,3363=>1102,3364=>779,3365=>731,3366=>485,3367=>737,3368=>747,3370=>779, +3371=>961,3372=>1023,3373=>500,3374=>510,3375=>792,3376=>527,3377=>511,3378=>713,3379=>553,3380=>516, +3381=>715,3382=>785,3383=>920,3384=>977,3385=>977,3389=>375,3390=>403,3391=>283,3392=>323,3393=>275, +3394=>258,3395=>378,3396=>378,3398=>542,3399=>478,3400=>1069,3402=>1127,3403=>1038,3404=>676,3405=>89, +3415=>676,3424=>676,3425=>1006,3430=>559,3431=>659,3432=>674,3433=>933,3434=>671,3435=>699,3436=>703, +3437=>688,3438=>677,3439=>684,3440=>375,3458=>355,3459=>241,3461=>501,3465=>591,3466=>613,3467=>630, +3473=>636,3476=>653,3481=>760,3482=>739,3483=>653,3484=>757,3486=>562,3488=>636,3489=>673,3490=>673, +3492=>984,3493=>984,3495=>636,3496=>653,3497=>653,3498=>653,3499=>1066,3501=>739,3502=>636,3503=>501, +3504=>653,3505=>739,3507=>501,3508=>673,3509=>636,3510=>653,3511=>739,3512=>636,3513=>653,3514=>673, +3515=>613,3517=>630,3520=>636,3521=>739,3522=>673,3523=>673,3524=>739,3525=>630,3526=>739,3530=>0, +3535=>328,3536=>288,3537=>319,3538=>0,3539=>0,3540=>0,3542=>0,3544=>380,3545=>495,3551=>492, +3585=>532,3586=>472,3587=>534,3588=>532,3589=>544,3590=>583,3591=>417,3592=>488,3593=>604,3594=>472, +3595=>534,3596=>716,3597=>717,3598=>568,3599=>568,3600=>457,3601=>637,3602=>731,3603=>790,3604=>531, +3605=>542,3606=>522,3607=>577,3608=>468,3609=>603,3610=>554,3611=>554,3612=>556,3613=>556,3614=>604, +3615=>604,3616=>568,3617=>542,3618=>496,3619=>442,3620=>530,3621=>512,3622=>568,3623=>478,3624=>543, +3625=>614,3626=>525,3627=>578,3628=>659,3629=>514,3630=>514,3631=>450,3632=>402,3633=>0,3634=>378, +3635=>415,3636=>0,3637=>0,3638=>0,3639=>0,3640=>0,3641=>0,3642=>0,3647=>620,3648=>286, +3649=>521,3650=>447,3651=>426,3652=>424,3653=>333,3654=>453,3655=>0,3656=>0,3657=>0,3658=>0, +3659=>0,3660=>0,3661=>0,3662=>0,3663=>657,3664=>528,3665=>528,3666=>571,3667=>594,3668=>631, +3669=>632,3670=>478,3671=>713,3672=>597,3673=>565,3674=>615,3675=>1381,4256=>453,4257=>448,4258=>546, +4259=>619,4260=>478,4261=>481,4262=>459,4263=>707,4264=>467,4265=>471,4266=>842,4267=>464,4268=>443, +4269=>707,4270=>460,4271=>465,4272=>686,4273=>440,4274=>550,4275=>561,4276=>580,4277=>467,4278=>630, +4279=>466,4280=>517,4281=>456,4282=>502,4283=>464,4284=>534,4285=>440,4286=>443,4287=>522,4288=>460, +4289=>463,4290=>536,4291=>455,4292=>468,4293=>449,4304=>454,4305=>452,4306=>544,4307=>629,4308=>451, +4309=>452,4310=>452,4311=>702,4312=>451,4313=>452,4314=>820,4315=>451,4316=>453,4317=>695,4318=>449, +4319=>448,4320=>694,4321=>501,4322=>544,4323=>517,4324=>560,4325=>450,4326=>627,4327=>452,4328=>491, +4329=>452,4330=>485,4331=>452,4332=>485,4333=>443,4334=>500,4335=>582,4336=>455,4337=>451,4338=>480, +4339=>414,4340=>453,4341=>418,4345=>528,4347=>410,4608=>583,4609=>770,4610=>560,4611=>525,4612=>525, +4613=>583,4614=>758,4616=>598,4617=>787,4618=>817,4619=>583,4620=>758,4621=>612,4622=>875,4623=>817, +4624=>817,4625=>1050,4626=>1050,4627=>817,4628=>1050,4629=>817,4630=>787,4631=>1021,4632=>933,4633=>1137, +4634=>1067,4635=>980,4636=>1065,4637=>962,4638=>962,4639=>1097,4640=>831,4641=>1021,4642=>851,4643=>735, +4644=>875,4645=>968,4646=>817,4647=>881,4648=>583,4649=>642,4650=>583,4651=>758,4652=>700,4653=>583, +4654=>700,4655=>758,4656=>583,4657=>787,4658=>787,4659=>583,4660=>729,4661=>583,4662=>583,4663=>817, +4664=>642,4665=>817,4666=>846,4667=>642,4668=>758,4669=>744,4670=>642,4671=>817,4672=>700,4673=>700, +4674=>700,4675=>758,4676=>700,4677=>700,4678=>729,4680=>846,4682=>1079,4683=>700,4684=>700,4685=>1021, +4688=>700,4689=>700,4690=>700,4691=>758,4692=>700,4693=>758,4694=>729,4696=>846,4698=>1079,4699=>700, +4700=>700,4701=>1021,4704=>525,4705=>758,4706=>758,4707=>525,4708=>700,4709=>773,4710=>525,4711=>787, +4712=>525,4713=>758,4714=>758,4715=>525,4716=>700,4717=>773,4718=>525,4719=>525,4720=>729,4721=>729, +4722=>729,4723=>802,4724=>729,4725=>729,4726=>758,4727=>729,4728=>758,4729=>758,4730=>758,4731=>817, +4732=>758,4733=>817,4734=>758,4735=>758,4736=>612,4737=>817,4738=>817,4739=>612,4740=>787,4741=>583, +4742=>875,4744=>962,4746=>992,4747=>700,4748=>758,4749=>904,4752=>408,4753=>583,4754=>525,4755=>554, +4756=>481,4757=>554,4758=>642,4759=>671,4760=>700,4761=>758,4762=>729,4763=>700,4764=>671,4765=>700, +4766=>758,4767=>700,4768=>583,4769=>735,4770=>822,4771=>583,4772=>793,4773=>583,4774=>583,4775=>694, +4776=>554,4777=>729,4778=>773,4779=>554,4780=>700,4781=>554,4782=>554,4784=>992,4786=>1021,4787=>671, +4788=>787,4789=>904,4792=>729,4793=>904,4794=>948,4795=>729,4796=>875,4797=>729,4798=>729,4800=>1137, +4802=>1167,4803=>758,4804=>875,4805=>1108,4808=>758,4809=>875,4810=>700,4811=>700,4812=>700,4813=>992, +4814=>758,4816=>554,4817=>787,4818=>758,4819=>583,4820=>758,4821=>496,4822=>612,4824=>525,4825=>700, +4826=>700,4827=>525,4828=>685,4829=>729,4830=>510,4831=>729,4832=>962,4833=>962,4834=>962,4835=>962, +4836=>962,4837=>1021,4838=>962,4839=>962,4840=>467,4841=>525,4842=>671,4843=>612,4844=>612,4845=>671, +4846=>671,4848=>612,4849=>875,4850=>817,4851=>642,4852=>729,4853=>729,4854=>758,4855=>817,4856=>700, +4857=>758,4858=>715,4859=>700,4860=>700,4861=>787,4862=>758,4863=>700,4864=>700,4865=>758,4866=>715, +4867=>700,4868=>700,4869=>787,4870=>758,4871=>700,4872=>467,4873=>671,4874=>671,4875=>612,4876=>612, +4877=>583,4878=>525,4880=>846,4882=>904,4883=>554,4884=>700,4885=>817,4888=>525,4889=>729,4890=>729, +4891=>612,4892=>671,4893=>583,4894=>525,4896=>817,4897=>1021,4898=>1021,4899=>817,4900=>992,4901=>758, +4902=>817,4903=>1021,4904=>1079,4905=>1137,4906=>1137,4907=>1050,4908=>1312,4909=>1050,4910=>1050,4911=>1123, +4912=>647,4913=>793,4914=>822,4915=>647,4916=>793,4917=>764,4918=>583,4919=>647,4920=>583,4921=>793, +4922=>822,4923=>583,4924=>793,4925=>764,4926=>583,4927=>793,4928=>540,4929=>758,4930=>583,4931=>467, +4932=>583,4933=>481,4934=>612,4936=>758,4937=>700,4938=>758,4939=>700,4940=>831,4941=>671,4942=>758, +4943=>700,4944=>758,4945=>758,4946=>758,4947=>817,4948=>758,4949=>758,4950=>817,4951=>758,4952=>642, +4953=>980,4954=>758,4961=>233,4962=>583,4963=>408,4964=>408,4965=>525,4966=>525,4967=>233,4968=>700, +4969=>671,4970=>612,4971=>642,4972=>642,4973=>642,4974=>583,4975=>700,4976=>758,4977=>642,4978=>583, +4979=>700,4980=>729,4981=>720,4982=>583,4983=>758,4984=>700,4985=>904,4986=>612,4987=>583,4988=>875, +5024=>711,5025=>678,5026=>604,5027=>667,5028=>796,5029=>301,5030=>516,5031=>544,5032=>457,5033=>716, +5034=>703,5035=>383,5036=>628,5037=>709,5038=>455,5039=>601,5040=>472,5041=>574,5042=>730,5043=>939, +5044=>498,5045=>528,5046=>667,5047=>891,5048=>505,5049=>792,5050=>957,5051=>725,5052=>595,5053=>733, +5054=>698,5055=>638,5056=>720,5057=>732,5058=>624,5059=>638,5060=>565,5061=>903,5062=>655,5063=>681, +5064=>675,5065=>949,5066=>683,5067=>547,5068=>693,5069=>732,5070=>529,5071=>569,5072=>536,5073=>677, +5074=>631,5075=>382,5076=>973,5077=>543,5078=>607,5079=>652,5080=>652,5081=>693,5082=>514,5083=>803, +5084=>658,5085=>597,5086=>627,5087=>659,5088=>679,5089=>706,5090=>563,5091=>618,5092=>767,5093=>776, +5094=>731,5095=>492,5096=>808,5097=>823,5098=>796,5099=>689,5100=>716,5101=>518,5102=>521,5103=>719, +5104=>563,5105=>776,5106=>634,5107=>822,5108=>621,5920=>502,5921=>502,5922=>500,5923=>498,5924=>500, +5925=>502,5926=>502,5927=>502,5928=>500,5929=>503,5930=>502,5931=>502,5932=>500,5933=>500,5934=>500, +5935=>796,5936=>500,5937=>502,5938=>0,5939=>0,5940=>0,5941=>230,5942=>397,6480=>537,6481=>537, +6482=>531,6483=>678,6484=>682,6485=>628,6486=>732,6487=>721,6488=>598,6489=>583,6490=>702,6491=>554, +6492=>683,6493=>554,6494=>710,6495=>695,6496=>523,6497=>678,6498=>589,6499=>272,6500=>506,6501=>515, +6502=>515,6503=>210,6504=>210,6505=>515,6506=>515,6507=>515,6508=>229,6509=>705,6512=>649,6513=>538, +6514=>568,6515=>520,6516=>544,6656=>820,6657=>958,6658=>758,6659=>859,6660=>958,6661=>727,6662=>904, +6663=>940,6664=>850,6665=>905,6666=>838,6667=>961,6668=>1000,6669=>880,6670=>1189,6671=>1246,6672=>1177, +6673=>757,6674=>1246,6675=>1192,6676=>709,6677=>1192,6678=>1075,6679=>0,6680=>0,6681=>534,6682=>690, +6683=>0,6686=>697,6687=>500,7424=>484,7425=>595,7426=>667,7427=>446,7428=>446,7429=>483,7430=>483, +7431=>409,7432=>426,7433=>278,7434=>260,7435=>483,7436=>409,7437=>595,7438=>483,7439=>483,7440=>426, +7441=>500,7442=>489,7443=>668,7444=>722,7445=>378,7448=>372,7449=>446,7450=>446,7451=>409,7452=>483, +7453=>488,7454=>660,7455=>500,7456=>483,7457=>632,7458=>409,7459=>355,7462=>392,7463=>483,7464=>483, +7465=>372,7466=>541,7467=>470,7468=>484,7469=>595,7470=>446,7471=>446,7472=>483,7473=>409,7474=>409, +7475=>483,7476=>483,7477=>223,7478=>260,7479=>483,7480=>409,7481=>595,7482=>483,7483=>483,7484=>483, +7485=>378,7486=>372,7487=>446,7488=>409,7489=>483,7490=>632,7491=>297,7492=>297,7493=>335,7494=>446, +7495=>335,7496=>335,7497=>297,7498=>297,7499=>285,7500=>285,7501=>335,7502=>186,7503=>335,7504=>521, +7505=>335,7506=>335,7507=>297,7510=>335,7511=>186,7512=>335,7513=>326,7514=>521,7515=>335,7517=>353, +7518=>321,7519=>357,7520=>430,7521=>321,7522=>186,7523=>223,7524=>335,7525=>335,7526=>353,7527=>321, +7528=>353,7529=>430,7530=>321,7531=>754,7532=>500,7533=>500,7534=>333,7535=>778,7536=>500,7537=>500, +7538=>333,7539=>333,7540=>389,7541=>278,7542=>444,7543=>500,7544=>483,7546=>774,7547=>217,7548=>278, +7549=>500,7550=>483,7551=>514,7552=>500,7553=>500,7554=>333,7555=>676,7556=>525,7557=>278,7558=>802, +7559=>507,7560=>500,7561=>333,7562=>389,7563=>384,7564=>500,7565=>500,7566=>444,7680=>722,7681=>444, +7682=>667,7683=>500,7684=>667,7685=>500,7686=>667,7687=>500,7688=>667,7689=>444,7690=>722,7691=>500, +7692=>722,7693=>500,7694=>722,7695=>500,7696=>720,7697=>500,7698=>722,7699=>500,7700=>611,7701=>444, +7702=>611,7703=>444,7704=>611,7705=>444,7706=>611,7707=>444,7708=>611,7709=>444,7710=>556,7711=>333, +7712=>722,7713=>500,7714=>722,7715=>500,7716=>722,7717=>500,7718=>722,7719=>500,7720=>722,7721=>500, +7722=>722,7723=>500,7724=>333,7725=>278,7726=>333,7727=>278,7728=>722,7729=>500,7730=>722,7731=>500, +7732=>722,7733=>500,7734=>611,7735=>278,7736=>611,7737=>278,7738=>611,7739=>278,7740=>611,7741=>278, +7742=>889,7743=>778,7744=>889,7745=>778,7746=>889,7747=>778,7748=>722,7749=>500,7750=>722,7751=>500, +7752=>722,7753=>500,7754=>722,7755=>500,7756=>722,7757=>500,7758=>722,7759=>500,7760=>722,7761=>500, +7762=>722,7763=>500,7764=>556,7765=>500,7766=>556,7767=>500,7768=>667,7769=>333,7770=>667,7771=>333, +7772=>667,7773=>333,7774=>667,7775=>333,7776=>556,7777=>389,7778=>556,7779=>389,7780=>556,7781=>389, +7782=>556,7783=>389,7784=>556,7785=>389,7786=>611,7787=>278,7788=>611,7789=>278,7790=>611,7791=>278, +7792=>611,7793=>278,7794=>722,7795=>500,7796=>722,7797=>500,7798=>722,7799=>500,7800=>722,7801=>500, +7802=>722,7803=>500,7804=>722,7805=>500,7806=>722,7807=>500,7808=>944,7809=>722,7810=>944,7811=>722, +7812=>944,7813=>722,7814=>944,7815=>722,7816=>944,7817=>722,7818=>722,7819=>500,7820=>722,7821=>500, +7822=>722,7823=>500,7824=>611,7825=>444,7826=>611,7827=>444,7828=>611,7829=>444,7830=>500,7831=>278, +7832=>722,7833=>500,7834=>444,7835=>333,7840=>722,7841=>444,7842=>807,7843=>529,7844=>722,7845=>444, +7846=>722,7847=>444,7848=>722,7849=>454,7850=>722,7851=>444,7852=>722,7853=>444,7854=>722,7855=>444, +7856=>722,7857=>444,7858=>722,7859=>454,7860=>722,7861=>444,7862=>722,7863=>444,7864=>611,7865=>444, +7866=>611,7867=>444,7868=>611,7869=>444,7870=>611,7871=>444,7872=>611,7873=>444,7874=>613,7875=>444, +7876=>611,7877=>444,7878=>611,7879=>444,7880=>333,7881=>278,7882=>333,7883=>278,7884=>722,7885=>500, +7886=>722,7887=>500,7888=>722,7889=>500,7890=>722,7891=>500,7892=>722,7893=>500,7894=>722,7895=>500, +7896=>722,7897=>500,7898=>722,7899=>516,7900=>722,7901=>516,7902=>720,7903=>516,7904=>722,7905=>516, +7906=>722,7907=>516,7908=>722,7909=>500,7910=>717,7911=>500,7912=>800,7913=>518,7914=>800,7915=>518, +7916=>800,7917=>518,7918=>800,7919=>518,7920=>800,7921=>518,7922=>722,7923=>500,7924=>722,7925=>500, +7926=>722,7927=>501,7928=>722,7929=>500,7936=>583,7937=>583,7938=>583,7939=>583,7940=>583,7941=>583, +7942=>583,7943=>583,7944=>722,7945=>722,7946=>813,7947=>817,7948=>763,7949=>765,7950=>720,7951=>722, +7952=>426,7953=>426,7954=>426,7955=>426,7956=>426,7957=>426,7960=>770,7961=>770,7962=>902,7963=>919, +7964=>940,7965=>936,7968=>536,7969=>536,7970=>536,7971=>536,7972=>536,7973=>536,7974=>536,7975=>536, +7976=>847,7977=>859,7978=>986,7979=>1010,7980=>1026,7981=>1029,7982=>918,7983=>921,7984=>286,7985=>286, +7986=>302,7987=>320,7988=>300,7989=>306,7990=>312,7991=>303,7992=>475,7993=>507,7994=>617,7995=>654, +7996=>655,7997=>660,7998=>551,7999=>566,8000=>500,8001=>500,8002=>500,8003=>500,8004=>500,8005=>500, +8008=>816,8009=>825,8010=>969,8011=>995,8012=>938,8013=>955,8016=>514,8017=>514,8018=>514,8019=>514, +8020=>514,8021=>514,8022=>514,8023=>514,8025=>818,8027=>988,8029=>989,8031=>893,8032=>693,8033=>693, +8034=>693,8035=>693,8036=>693,8037=>693,8038=>693,8039=>693,8040=>836,8041=>843,8042=>1006,8043=>1024, +8044=>974,8045=>986,8046=>905,8047=>896,8048=>583,8049=>583,8050=>426,8051=>426,8052=>536,8053=>536, +8054=>286,8055=>286,8056=>500,8057=>500,8058=>514,8059=>514,8060=>693,8061=>693,8064=>583,8065=>583, +8066=>583,8067=>583,8068=>583,8069=>583,8070=>583,8071=>583,8072=>888,8073=>889,8074=>984,8075=>991, +8076=>943,8077=>948,8078=>884,8079=>886,8080=>536,8081=>536,8082=>536,8083=>536,8084=>536,8085=>536, +8086=>536,8087=>536,8088=>1017,8089=>1026,8090=>1153,8091=>1179,8092=>1195,8093=>1199,8094=>1088,8095=>1088, +8096=>693,8097=>693,8098=>693,8099=>693,8100=>693,8101=>693,8102=>693,8103=>693,8104=>1034,8105=>1040, +8106=>1210,8107=>1229,8108=>1176,8109=>1186,8110=>1098,8111=>1090,8112=>583,8113=>583,8114=>583,8115=>583, +8116=>583,8118=>583,8119=>583,8120=>722,8121=>722,8122=>722,8123=>722,8124=>889,8125=>250,8126=>332, +8127=>500,8128=>500,8129=>534,8130=>536,8131=>536,8132=>536,8134=>536,8135=>536,8136=>761,8137=>800, +8138=>829,8139=>893,8140=>883,8141=>500,8142=>500,8143=>500,8144=>286,8145=>286,8146=>286,8147=>286, +8150=>286,8151=>286,8152=>333,8153=>333,8154=>447,8155=>537,8157=>500,8158=>500,8159=>500,8160=>514, +8161=>514,8162=>514,8163=>514,8164=>528,8165=>528,8166=>514,8167=>514,8168=>696,8169=>696,8170=>816, +8171=>828,8172=>721,8173=>333,8174=>333,8175=>500,8178=>693,8179=>693,8180=>693,8182=>693,8183=>693, +8184=>832,8185=>899,8186=>847,8187=>852,8188=>928,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500, +8195=>1000,8196=>333,8197=>250,8198=>167,8199=>500,8200=>250,8201=>200,8202=>100,8203=>0,8204=>0, +8205=>0,8206=>0,8207=>0,8208=>333,8209=>333,8210=>500,8213=>1000,8214=>293,8215=>478,8219=>250, +8223=>444,8227=>350,8228=>620,8229=>620,8231=>250,8232=>0,8233=>0,8234=>0,8235=>0,8236=>0, +8237=>0,8238=>0,8239=>250,8241=>1363,8242=>247,8243=>411,8244=>611,8245=>220,8246=>440,8247=>660, +8248=>469,8251=>629,8252=>666,8253=>444,8254=>500,8255=>953,8256=>953,8257=>314,8258=>931,8259=>333, +8260=>167,8261=>383,8262=>383,8263=>888,8264=>777,8265=>777,8266=>500,8267=>453,8268=>453,8269=>450, +8270=>500,8271=>278,8272=>882,8273=>500,8274=>497,8275=>500,8276=>953,8277=>512,8278=>410,8279=>855, +8280=>620,8281=>620,8282=>179,8283=>621,8284=>564,8285=>179,8286=>179,8287=>111,8288=>0,8289=>0, +8290=>0,8291=>0,8292=>0,8304=>320,8305=>300,8308=>320,8309=>320,8310=>320,8311=>320,8312=>320, +8313=>320,8314=>300,8315=>300,8316=>300,8317=>216,8318=>216,8319=>300,8320=>320,8321=>320,8322=>320, +8323=>320,8324=>320,8325=>320,8326=>320,8327=>320,8328=>320,8329=>320,8330=>300,8331=>300,8332=>300, +8333=>216,8334=>216,8336=>320,8337=>320,8338=>320,8339=>320,8340=>320,8352=>698,8353=>667,8354=>667, +8355=>556,8356=>500,8357=>778,8358=>722,8359=>940,8360=>1026,8361=>813,8362=>869,8363=>512,8365=>722, +8366=>611,8367=>1340,8368=>489,8369=>601,8370=>619,8371=>722,8372=>556,8373=>611,8400=>0,8401=>0, +8402=>0,8403=>0,8404=>0,8405=>0,8406=>0,8407=>0,8408=>0,8409=>0,8410=>0,8411=>0, +8412=>0,8413=>0,8414=>0,8415=>0,8416=>0,8417=>0,8418=>0,8419=>0,8420=>0,8421=>0, +8422=>0,8423=>0,8424=>0,8425=>0,8426=>0,8427=>0,8428=>0,8429=>0,8430=>0,8431=>0, +8432=>0,8448=>751,8449=>723,8450=>674,8451=>954,8452=>556,8453=>781,8454=>806,8455=>518,8456=>667, +8457=>822,8458=>490,8459=>824,8460=>663,8461=>818,8462=>500,8463=>500,8464=>578,8465=>613,8466=>715, +8467=>417,8468=>778,8469=>751,8470=>880,8471=>760,8472=>832,8473=>589,8474=>729,8475=>892,8476=>711, +8477=>755,8478=>667,8479=>667,8480=>879,8481=>1156,8483=>722,8484=>659,8485=>389,8486=>743,8487=>757, +8488=>663,8489=>286,8490=>722,8491=>722,8492=>846,8493=>613,8494=>533,8495=>363,8496=>587,8497=>690, +8498=>556,8499=>1021,8500=>387,8501=>537,8502=>537,8503=>350,8504=>537,8505=>417,8506=>906,8507=>1155, +8513=>663,8514=>485,8515=>485,8516=>637,8522=>516,8523=>778,8525=>899,8526=>500,8531=>750,8532=>750, +8533=>750,8534=>750,8535=>750,8536=>750,8537=>750,8538=>750,8539=>750,8540=>750,8541=>750,8542=>750, +8543=>750,8544=>333,8545=>630,8546=>927,8547=>1019,8548=>722,8549=>1019,8550=>1316,8551=>1629,8552=>1019, +8553=>722,8554=>1019,8555=>1316,8556=>611,8557=>667,8558=>722,8559=>889,8560=>278,8561=>556,8562=>834, +8563=>778,8564=>500,8565=>778,8566=>1056,8567=>1334,8568=>778,8569=>500,8570=>778,8571=>1056,8572=>278, +8573=>444,8574=>500,8575=>778,8592=>964,8593=>472,8594=>964,8595=>500,8596=>964,8597=>499,8598=>964, +8599=>964,8600=>964,8601=>964,8602=>964,8603=>964,8604=>1009,8605=>1009,8606=>964,8607=>500,8608=>964, +8609=>499,8610=>1093,8611=>1093,8612=>1093,8613=>500,8614=>1093,8615=>500,8616=>500,8617=>964,8618=>964, +8619=>964,8620=>964,8621=>1151,8622=>964,8624=>482,8625=>482,8626=>482,8627=>482,8628=>658,8629=>658, +8630=>1069,8631=>1069,8634=>939,8635=>939,8636=>964,8637=>964,8638=>499,8639=>499,8640=>964,8641=>964, +8642=>499,8643=>499,8644=>964,8645=>840,8646=>964,8647=>964,8648=>840,8649=>964,8650=>840,8651=>964, +8652=>964,8653=>964,8654=>964,8655=>964,8656=>964,8657=>550,8658=>964,8659=>550,8660=>964,8661=>550, +8662=>1047,8663=>1047,8664=>1047,8665=>1047,8666=>964,8667=>964,8668=>1092,8669=>1092,8672=>964,8674=>964, +8704=>587,8705=>716,8706=>494,8707=>587,8708=>587,8709=>746,8710=>612,8711=>612,8712=>536,8713=>536, +8714=>439,8715=>536,8716=>536,8717=>439,8718=>506,8719=>823,8720=>823,8721=>713,8722=>564,8723=>564, +8724=>564,8725=>636,8726=>636,8727=>471,8728=>497,8729=>497,8730=>549,8731=>549,8732=>549,8733=>636, +8734=>853,8735=>509,8736=>575,8737=>559,8738=>509,8739=>200,8740=>250,8741=>320,8742=>320,8743=>564, +8744=>564,8745=>654,8746=>654,8747=>416,8748=>750,8749=>1083,8750=>722,8751=>750,8752=>1083,8753=>697, +8754=>722,8755=>722,8756=>565,8757=>568,8758=>250,8759=>629,8760=>564,8761=>758,8762=>564,8763=>636, +8764=>636,8765=>636,8766=>503,8767=>614,8768=>636,8769=>636,8770=>636,8771=>636,8772=>636,8773=>636, +8774=>636,8775=>636,8776=>636,8777=>636,8778=>636,8779=>636,8780=>636,8781=>636,8782=>636,8783=>636, +8784=>564,8785=>564,8786=>564,8787=>564,8788=>735,8789=>755,8790=>564,8791=>564,8792=>564,8793=>564, +8794=>564,8795=>564,8796=>600,8797=>564,8798=>564,8799=>564,8800=>564,8801=>636,8802=>636,8803=>636, +8804=>636,8805=>636,8806=>636,8807=>636,8808=>636,8809=>636,8810=>900,8811=>899,8812=>410,8813=>636, +8814=>636,8815=>636,8816=>636,8817=>636,8818=>636,8819=>636,8820=>636,8821=>636,8822=>636,8823=>636, +8824=>636,8825=>636,8826=>636,8827=>636,8828=>636,8829=>636,8830=>636,8831=>636,8832=>636,8833=>636, +8834=>636,8835=>636,8836=>636,8837=>636,8838=>636,8839=>636,8840=>636,8841=>636,8842=>636,8843=>636, +8844=>654,8845=>654,8846=>654,8847=>636,8848=>636,8849=>636,8850=>636,8851=>636,8852=>636,8853=>636, +8854=>636,8855=>636,8856=>636,8857=>636,8858=>636,8859=>636,8860=>636,8861=>636,8862=>636,8863=>636, +8864=>636,8865=>636,8866=>600,8867=>600,8868=>712,8869=>712,8870=>466,8871=>466,8872=>595,8873=>588, +8874=>710,8875=>706,8876=>595,8877=>596,8878=>588,8879=>706,8880=>636,8881=>636,8882=>636,8883=>636, +8884=>636,8885=>636,8886=>1296,8887=>1296,8888=>966,8889=>564,8890=>626,8891=>564,8892=>564,8893=>566, +8894=>570,8895=>582,8896=>744,8897=>744,8898=>764,8899=>764,8900=>512,8901=>250,8902=>471,8903=>629, +8904=>636,8905=>636,8906=>636,8907=>816,8908=>816,8909=>636,8910=>636,8911=>636,8912=>636,8913=>636, +8914=>654,8915=>654,8916=>654,8917=>636,8918=>564,8919=>564,8920=>1215,8921=>1215,8922=>636,8923=>636, +8924=>636,8925=>636,8926=>636,8927=>636,8928=>636,8929=>636,8930=>636,8931=>636,8932=>636,8933=>636, +8934=>636,8935=>636,8936=>636,8937=>636,8938=>636,8939=>636,8940=>636,8941=>636,8942=>250,8943=>1000, +8944=>1000,8945=>1000,8946=>601,8947=>536,8948=>464,8949=>536,8950=>536,8951=>464,8952=>536,8953=>536, +8954=>601,8955=>536,8956=>464,8957=>536,8958=>464,8959=>600,8960=>780,8961=>442,8962=>794,8968=>474, +8969=>474,8970=>474,8971=>474,8976=>564,8977=>503,8978=>791,8979=>791,8980=>593,8981=>560,8982=>563, +8983=>563,8984=>800,8985=>564,8986=>805,8988=>474,8989=>474,8990=>474,8991=>474,8992=>686,8993=>686, +8994=>658,8995=>658,8996=>800,9000=>800,9001=>329,9002=>329,9031=>777,9032=>777,9040=>777,9047=>777, +9054=>777,9088=>800,9089=>800,9090=>800,9091=>800,9094=>800,9095=>800,9096=>800,9097=>800,9098=>800, +9100=>800,9103=>788,9104=>788,9105=>788,9106=>788,9108=>800,9109=>800,9110=>800,9111=>800,9112=>800, +9113=>800,9114=>800,9115=>384,9116=>384,9117=>384,9118=>384,9119=>384,9120=>384,9121=>388,9122=>388, +9123=>388,9124=>388,9125=>388,9126=>388,9127=>494,9128=>494,9129=>494,9130=>494,9131=>494,9132=>494, +9133=>494,9134=>686,9138=>1287,9139=>1287,9140=>860,9141=>861,9166=>800,9167=>800,9180=>896,9181=>896, +9182=>903,9183=>904,9184=>910,9185=>910,9186=>761,9187=>910,9189=>942,9190=>817,9251=>500,9312=>788, +9313=>788,9314=>788,9315=>788,9316=>788,9317=>788,9318=>788,9319=>788,9320=>788,9321=>788,9472=>889, +9473=>889,9474=>889,9475=>889,9484=>889,9485=>889,9486=>889,9487=>889,9488=>889,9489=>889,9490=>889, +9491=>889,9492=>889,9493=>889,9494=>889,9495=>889,9496=>889,9497=>889,9498=>889,9499=>889,9500=>889, +9501=>889,9502=>889,9503=>889,9504=>889,9505=>889,9506=>889,9507=>889,9508=>889,9509=>889,9510=>889, +9511=>889,9512=>889,9513=>889,9514=>889,9515=>889,9516=>889,9517=>889,9518=>889,9519=>889,9520=>889, +9521=>889,9522=>889,9523=>889,9524=>889,9525=>889,9526=>889,9527=>889,9528=>889,9529=>889,9530=>889, +9531=>889,9532=>889,9533=>889,9534=>889,9535=>889,9536=>889,9537=>889,9538=>889,9539=>889,9540=>889, +9541=>889,9542=>889,9543=>889,9544=>889,9545=>889,9546=>889,9547=>889,9552=>889,9553=>889,9554=>889, +9555=>889,9556=>889,9557=>889,9558=>889,9559=>889,9560=>889,9561=>889,9562=>889,9563=>889,9564=>889, +9565=>889,9566=>889,9567=>889,9568=>889,9569=>889,9570=>889,9571=>889,9572=>889,9573=>889,9574=>889, +9575=>889,9576=>889,9577=>889,9578=>889,9579=>889,9580=>889,9581=>889,9582=>889,9583=>889,9584=>889, +9585=>889,9586=>889,9587=>889,9588=>889,9589=>889,9590=>889,9591=>889,9592=>889,9593=>889,9594=>889, +9595=>889,9596=>600,9597=>889,9598=>600,9599=>889,9600=>761,9601=>761,9602=>761,9603=>761,9604=>761, +9605=>761,9606=>761,9607=>761,9608=>761,9609=>761,9610=>761,9611=>761,9612=>761,9613=>761,9614=>761, +9615=>761,9616=>761,9617=>1000,9619=>1000,9620=>761,9621=>761,9622=>761,9623=>761,9624=>761,9625=>761, +9626=>761,9627=>761,9628=>761,9629=>761,9630=>761,9631=>761,9632=>761,9633=>761,9634=>761,9635=>761, +9636=>761,9637=>761,9638=>761,9639=>761,9640=>761,9641=>761,9642=>532,9643=>532,9644=>761,9645=>761, +9646=>761,9647=>761,9648=>761,9649=>761,9650=>892,9651=>892,9652=>446,9653=>446,9654=>892,9655=>892, +9656=>446,9657=>446,9658=>892,9659=>892,9660=>892,9661=>892,9662=>446,9663=>446,9664=>892,9665=>892, +9666=>446,9667=>446,9668=>892,9669=>892,9670=>788,9671=>788,9672=>788,9673=>791,9674=>494,9675=>791, +9676=>791,9677=>785,9678=>791,9679=>791,9680=>791,9681=>791,9682=>791,9683=>791,9684=>791,9685=>791, +9686=>791,9687=>791,9688=>761,9689=>761,9690=>761,9691=>761,9692=>791,9693=>791,9694=>791,9695=>791, +9696=>791,9697=>791,9698=>761,9699=>761,9700=>761,9701=>761,9702=>791,9703=>761,9704=>761,9705=>761, +9706=>761,9707=>761,9708=>892,9709=>892,9710=>892,9711=>851,9712=>761,9713=>761,9714=>761,9715=>761, +9716=>791,9717=>791,9718=>791,9719=>791,9720=>761,9721=>761,9722=>761,9723=>761,9724=>761,9725=>570, +9726=>570,9727=>761,9728=>800,9729=>800,9730=>748,9731=>800,9732=>800,9733=>811,9734=>816,9735=>468, +9736=>677,9737=>724,9738=>944,9739=>944,9740=>686,9741=>944,9742=>715,9743=>715,9744=>757,9745=>755, +9746=>755,9747=>756,9748=>800,9749=>837,9750=>719,9751=>719,9752=>782,9753=>822,9754=>954,9755=>954, +9756=>933,9757=>489,9758=>933,9759=>489,9760=>517,9761=>660,9762=>724,9763=>732,9764=>886,9765=>577, +9766=>489,9767=>563,9768=>490,9769=>770,9770=>725,9771=>860,9772=>668,9773=>753,9774=>724,9775=>730, +9776=>600,9777=>600,9778=>600,9779=>600,9780=>600,9781=>600,9782=>600,9783=>600,9784=>730,9785=>724, +9786=>724,9787=>724,9788=>799,9789=>659,9790=>659,9791=>495,9792=>495,9793=>495,9794=>686,9795=>661, +9796=>544,9797=>608,9798=>605,9799=>545,9800=>804,9801=>583,9802=>796,9803=>1006,9804=>825,9805=>1189, +9806=>1144,9807=>1189,9808=>683,9809=>808,9810=>1146,9811=>797,9812=>758,9813=>757,9814=>758,9815=>758, +9816=>758,9817=>758,9818=>758,9819=>758,9820=>758,9821=>758,9822=>758,9823=>758,9824=>770,9825=>770, +9826=>770,9827=>770,9828=>770,9829=>770,9830=>770,9831=>770,9832=>895,9833=>333,9834=>555,9835=>722, +9836=>722,9837=>415,9838=>377,9839=>402,9840=>642,9841=>655,9842=>869,9843=>905,9844=>905,9845=>905, +9846=>905,9847=>905,9848=>905,9849=>905,9850=>905,9851=>1016,9852=>1064,9853=>1064,9854=>954,9855=>606, +9856=>522,9857=>522,9858=>522,9859=>522,9860=>522,9861=>522,9862=>845,9863=>844,9864=>844,9865=>844, +9866=>748,9867=>748,9868=>748,9869=>748,9870=>748,9871=>748,9872=>726,9873=>726,9874=>963,9875=>770, +9876=>1038,9877=>388,9878=>997,9879=>787,9880=>508,9881=>809,9882=>1014,9883=>859,9884=>818,9885=>972, +9888=>1000,9889=>546,9890=>784,9891=>786,9892=>738,9893=>542,9894=>601,9895=>700,9896=>511,9897=>861, +9898=>611,9899=>611,9900=>544,9901=>782,9902=>1025,9903=>1141,9904=>1000,9905=>513,9906=>510,9907=>642, +9908=>722,9909=>719,9910=>777,9911=>495,9912=>602,9913=>836,9914=>666,9915=>666,9916=>691,9920=>689, +9921=>689,9922=>689,9923=>689,9985=>974,9986=>961,9987=>974,9988=>980,9990=>789,9991=>790,9992=>791, +9993=>690,9996=>549,9997=>855,9998=>911,9999=>933,10000=>911,10001=>945,10002=>974,10003=>755,10004=>846, +10005=>762,10006=>761,10007=>571,10008=>677,10009=>763,10010=>760,10011=>759,10012=>754,10013=>494,10014=>552, +10015=>537,10016=>577,10017=>692,10018=>786,10019=>788,10020=>788,10021=>790,10022=>793,10023=>794,10025=>823, +10026=>789,10027=>841,10028=>823,10029=>833,10030=>816,10031=>831,10032=>923,10033=>744,10034=>723,10035=>749, +10036=>790,10037=>792,10038=>695,10039=>776,10040=>768,10041=>792,10042=>759,10043=>707,10044=>708,10045=>682, +10046=>701,10047=>826,10048=>815,10049=>789,10050=>789,10051=>707,10052=>687,10053=>696,10054=>689,10055=>786, +10056=>787,10057=>713,10058=>791,10059=>785,10061=>873,10063=>762,10064=>762,10065=>759,10066=>759,10070=>784, +10072=>138,10073=>277,10074=>415,10075=>392,10076=>392,10077=>668,10078=>668,10081=>732,10082=>544,10083=>544, +10084=>910,10085=>667,10086=>760,10087=>760,10088=>390,10089=>390,10090=>317,10091=>317,10092=>276,10093=>276, +10094=>509,10095=>509,10096=>410,10097=>410,10098=>234,10099=>234,10100=>334,10101=>334,10102=>788,10103=>788, +10104=>788,10105=>788,10106=>788,10107=>788,10108=>788,10109=>788,10110=>788,10111=>788,10112=>788,10113=>788, +10114=>788,10115=>788,10116=>788,10117=>788,10118=>788,10119=>788,10120=>788,10121=>788,10122=>788,10123=>788, +10124=>788,10125=>788,10126=>788,10127=>788,10128=>788,10129=>788,10130=>788,10131=>788,10132=>894,10136=>748, +10137=>924,10138=>748,10139=>918,10140=>927,10141=>928,10142=>928,10143=>834,10144=>873,10145=>828,10146=>924, +10147=>924,10148=>917,10149=>930,10150=>931,10151=>463,10152=>883,10153=>836,10154=>836,10155=>867,10156=>867, +10157=>696,10158=>696,10159=>874,10161=>874,10162=>760,10163=>946,10164=>771,10165=>865,10166=>771,10167=>888, +10168=>967,10169=>888,10170=>831,10171=>873,10172=>927,10173=>970,10174=>918,10214=>545,10215=>545,10216=>329, +10217=>329,10218=>496,10219=>496,10229=>1000,10230=>1000,10231=>1000,10232=>1000,10233=>1000,10234=>1000,10235=>1000, +10236=>1000,10752=>860,10753=>860,10754=>860,10755=>766,10756=>766,10757=>756,10758=>756,10761=>745,10781=>702, +10815=>722,11008=>1000,11009=>1000,11010=>1000,11011=>1000,11012=>1222,11013=>1000,11014=>1000,11015=>1000,11016=>1000, +11017=>1000,11018=>1000,11019=>1000,11020=>1244,11021=>1000,11026=>770,11027=>770,11028=>770,11029=>770,11030=>770, +11031=>770,11032=>770,11033=>770,11034=>770,11035=>1000,11036=>1000,11037=>283,11038=>283,11039=>846,11040=>846, +11041=>799,11042=>799,11043=>807,11044=>1000,11045=>461,11046=>461,11047=>461,11048=>461,11049=>360,11050=>360, +11051=>283,11052=>854,11053=>854,11054=>628,11055=>628,11088=>589,11089=>443,11090=>443,11091=>802,11092=>803, +11392=>677,11393=>463,11394=>532,11395=>381,11396=>615,11397=>438,11398=>969,11399=>660,11400=>647,11401=>440, +11402=>593,11403=>402,11404=>573,11405=>407,11406=>698,11407=>512,11408=>726,11409=>493,11410=>267,11411=>201, +11412=>610,11413=>433,11414=>654,11415=>468,11416=>735,11417=>536,11418=>698,11419=>511,11420=>555,11421=>378, +11422=>722,11423=>489,11424=>724,11425=>528,11426=>517,11427=>388,11428=>647,11429=>438,11430=>615,11431=>436, +11432=>651,11433=>462,11434=>762,11435=>538,11436=>654,11437=>461,11438=>635,11439=>461,11440=>964,11441=>677, +11456=>689,11457=>464,11493=>499,11494=>496,11495=>986,11496=>466,11497=>444,11498=>934,11517=>256,11518=>617, +11519=>287,11799=>333,42560=>611,42561=>444,42562=>611,42563=>444,42564=>556,42565=>389,42566=>368,42567=>286, +42572=>1145,42573=>775,42576=>1016,42577=>736,42578=>915,42579=>684,42580=>966,42581=>664,42582=>1042,42583=>648, +42584=>722,42585=>491,42588=>1042,42589=>648,42590=>780,42591=>550,42594=>911,42595=>633,42596=>957,42597=>635, +42598=>1139,42599=>777,42607=>0,42608=>0,42609=>0,42610=>0,42611=>519,42620=>0,42622=>510,64256=>589, +64257=>534,64258=>530,64259=>805,64260=>799,64262=>677,64285=>350,64286=>0,64287=>537,64288=>537,64297=>564, +64298=>537,64299=>537,64300=>537,64301=>537,64302=>537,64303=>537,64304=>537,64305=>537,64306=>350,64307=>537, +64308=>537,64309=>350,64310=>350,64312=>537,64313=>350,64314=>537,64315=>537,64316=>537,64318=>537,64320=>350, +64321=>537,64323=>537,64324=>537,64326=>537,64327=>537,64328=>537,64329=>537,64330=>537,64331=>350,64332=>537, +64333=>537,64334=>537,64335=>537,64342=>926,64343=>926,64344=>308,64345=>308,64378=>750,64379=>750,64380=>580, +64381=>580,64394=>338,64395=>338,64402=>874,64403=>874,64404=>329,64405=>329,64508=>776,64509=>700,64510=>304, +64511=>304,65010=>640,65020=>837,65136=>300,65140=>300,65142=>300,65144=>300,65146=>300,65148=>300,65152=>724, +65153=>321,65154=>275,65155=>249,65156=>275,65157=>399,65158=>399,65159=>249,65160=>275,65161=>776,65162=>776, +65163=>301,65164=>264,65165=>249,65166=>275,65167=>950,65168=>950,65169=>293,65170=>293,65171=>424,65172=>622, +65173=>925,65174=>925,65175=>308,65176=>308,65177=>924,65178=>924,65179=>298,65180=>298,65181=>738,65182=>738, +65183=>574,65184=>574,65185=>748,65186=>750,65187=>600,65188=>600,65189=>701,65190=>775,65191=>596,65192=>596, +65193=>397,65194=>397,65195=>399,65196=>399,65197=>328,65198=>328,65199=>331,65200=>331,65201=>951,65202=>951, +65203=>600,65204=>600,65205=>949,65206=>949,65207=>649,65208=>649,65209=>949,65210=>949,65211=>823,65212=>823, +65213=>949,65214=>949,65215=>805,65216=>805,65217=>557,65218=>557,65219=>460,65220=>460,65221=>550,65222=>550, +65223=>455,65224=>550,65225=>625,65226=>575,65227=>674,65228=>550,65229=>602,65230=>577,65231=>578,65232=>577, +65233=>801,65234=>801,65235=>300,65236=>300,65237=>696,65238=>696,65239=>650,65240=>650,65241=>757,65242=>757, +65243=>318,65244=>318,65245=>655,65246=>655,65247=>206,65248=>206,65249=>549,65250=>549,65251=>403,65252=>403, +65253=>651,65254=>651,65255=>323,65256=>323,65257=>424,65258=>622,65259=>525,65260=>476,65261=>399,65262=>399, +65263=>776,65264=>776,65265=>776,65266=>776,65267=>296,65268=>264,65269=>676,65270=>724,65271=>676,65272=>724, +65273=>676,65274=>724,65275=>676,65276=>724,65279=>0,65533=>788); +$enc=''; +$diff=''; +$file='freeserif.z'; +$ctg='freeserif.ctg.z'; +$originalsize=1483772; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserif.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserif.z new file mode 100644 index 0000000..67f6097 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserif.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifb.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifb.ctg.z new file mode 100644 index 0000000..77bfed1 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifb.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifb.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifb.php new file mode 100644 index 0000000..f3b98c5 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifb.php @@ -0,0 +1,282 @@ +<?php +$type='TrueTypeUnicode'; +$name='FreeSerifBold'; +$desc=array('Ascent'=>900,'Descent'=>-300,'CapHeight'=>16,'Flags'=>32,'FontBBox'=>'[-796 -306 1860 932]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>600); +$up=-125; +$ut=50; +$dw=600; +$cw=array( +32=>250,33=>333,34=>555,35=>500,36=>500,37=>1000,38=>833,39=>278,40=>333,41=>333, +42=>507,43=>676,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500,50=>500,51=>500, +52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>333,59=>333,60=>676,61=>676, +62=>676,63=>500,64=>930,65=>722,66=>667,67=>722,68=>724,69=>667,70=>611,71=>778, +72=>774,73=>386,74=>500,75=>764,76=>664,77=>943,78=>722,79=>778,80=>611,81=>778, +82=>712,83=>556,84=>667,85=>722,86=>722,87=>1000,88=>722,89=>722,90=>667,91=>333, +92=>278,93=>333,94=>581,95=>500,96=>333,97=>500,98=>556,99=>444,100=>556,101=>444, +102=>333,103=>500,104=>556,105=>278,106=>333,107=>556,108=>278,109=>833,110=>556,111=>500, +112=>556,113=>556,114=>444,115=>389,116=>333,117=>556,118=>500,119=>722,120=>500,121=>500, +122=>444,123=>394,124=>220,125=>394,126=>520,8364=>761,8218=>250,402=>333,8222=>500,8230=>1000, +8224=>500,8225=>500,710=>333,8240=>1000,352=>556,8249=>333,338=>1000,381=>667,8216=>250,8217=>250, +8220=>500,8221=>500,8226=>524,8211=>500,8212=>1000,732=>333,8482=>1000,353=>389,8250=>333,339=>722, +382=>444,376=>722,160=>250,161=>333,162=>500,163=>500,164=>500,165=>500,166=>220,167=>500, +168=>333,169=>747,170=>300,171=>500,172=>680,173=>333,174=>747,175=>333,176=>400,177=>676, +178=>300,179=>300,180=>333,181=>556,182=>540,183=>250,184=>333,185=>270,186=>330,187=>500, +188=>750,189=>750,190=>750,191=>500,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722, +198=>1000,199=>722,200=>667,201=>667,202=>667,203=>667,204=>389,205=>389,206=>389,207=>389, +208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>676,216=>778,217=>722, +218=>722,219=>722,220=>722,221=>722,222=>632,223=>556,224=>500,225=>500,226=>500,227=>500, +228=>500,229=>500,230=>722,231=>444,232=>444,233=>444,234=>444,235=>444,236=>278,237=>278, +238=>278,239=>278,240=>500,241=>556,242=>500,243=>500,244=>500,245=>500,246=>500,247=>676, +248=>500,249=>556,250=>556,251=>556,252=>556,253=>500,254=>556,255=>500,256=>722,257=>500, +258=>722,259=>500,260=>722,261=>500,262=>722,263=>444,264=>722,265=>444,266=>722,267=>444, +268=>722,269=>444,270=>722,271=>616,272=>722,273=>556,274=>667,275=>444,276=>667,277=>444, +278=>667,279=>444,280=>667,281=>444,282=>667,283=>444,284=>778,285=>500,286=>778,287=>500, +288=>778,289=>500,290=>778,291=>500,292=>778,293=>556,294=>778,295=>556,296=>389,297=>278, +298=>389,299=>278,300=>389,301=>278,302=>389,303=>278,304=>389,305=>278,306=>882,307=>486, +308=>500,309=>338,310=>778,311=>556,312=>534,313=>667,314=>278,315=>667,316=>278,317=>667, +318=>398,319=>667,320=>528,321=>667,322=>278,323=>722,324=>556,325=>722,326=>556,327=>722, +328=>556,329=>556,330=>722,331=>556,332=>778,333=>500,334=>778,335=>500,336=>778,337=>500, +340=>722,341=>444,342=>722,343=>444,344=>722,345=>444,346=>556,347=>389,348=>556,349=>389, +350=>556,351=>389,354=>667,355=>333,356=>667,357=>449,358=>667,359=>333,360=>722,361=>556, +362=>722,363=>556,364=>722,365=>556,366=>722,367=>556,368=>722,369=>556,370=>722,371=>556, +372=>1000,373=>722,374=>722,375=>500,377=>667,378=>444,379=>667,380=>444,383=>333,384=>556, +385=>805,386=>648,387=>556,388=>667,389=>556,390=>722,391=>915,392=>605,393=>722,394=>862, +395=>667,396=>556,397=>550,398=>667,399=>778,400=>631,401=>611,403=>903,404=>776,405=>807, +406=>327,407=>389,408=>887,409=>556,410=>278,411=>495,412=>1000,413=>864,414=>556,415=>778, +416=>778,417=>550,418=>1192,419=>795,420=>749,421=>556,422=>748,423=>556,424=>389,425=>650, +426=>465,427=>333,428=>667,429=>333,430=>667,431=>839,432=>629,433=>811,434=>685,435=>853, +436=>705,437=>667,438=>444,439=>593,440=>654,441=>508,442=>500,443=>500,444=>654,445=>520, +446=>444,447=>611,448=>220,449=>418,450=>570,451=>333,452=>1391,453=>1168,454=>1000,455=>1164, +456=>997,457=>611,458=>1222,459=>1055,460=>889,461=>722,462=>500,463=>386,464=>278,465=>778, +466=>500,467=>722,468=>556,469=>722,470=>556,471=>722,472=>556,473=>722,474=>556,475=>722, +476=>556,477=>444,478=>722,479=>500,480=>722,481=>500,482=>1000,483=>722,484=>778,485=>500, +486=>778,487=>500,488=>764,489=>556,490=>778,491=>500,492=>778,493=>500,494=>593,495=>502, +496=>338,497=>1391,498=>1168,499=>1000,500=>778,501=>500,502=>995,503=>603,504=>722,505=>556, +506=>722,507=>500,508=>1000,509=>722,510=>778,511=>500,512=>722,513=>500,514=>722,515=>500, +516=>667,517=>444,518=>667,519=>444,520=>386,521=>278,522=>386,523=>278,524=>778,525=>500, +526=>778,527=>500,528=>712,529=>444,530=>712,531=>444,532=>722,533=>556,534=>722,535=>556, +536=>556,537=>389,538=>667,539=>333,540=>464,541=>455,542=>774,543=>556,544=>731,545=>649, +546=>568,547=>494,548=>667,549=>444,550=>722,551=>500,552=>667,553=>444,554=>778,555=>500, +556=>778,557=>500,558=>778,559=>500,560=>778,561=>500,562=>722,563=>500,564=>437,565=>636, +566=>415,567=>338,568=>776,569=>760,570=>722,571=>722,572=>444,573=>664,574=>667,575=>389, +576=>451,577=>505,578=>479,579=>686,580=>750,581=>722,582=>667,583=>478,584=>500,585=>333, +586=>808,587=>608,588=>712,589=>444,590=>757,591=>500,592=>500,593=>523,594=>523,595=>556, +596=>444,598=>556,599=>556,600=>444,601=>444,602=>611,603=>440,604=>440,605=>611,607=>333, +608=>500,609=>500,610=>556,613=>556,614=>556,615=>556,616=>278,617=>333,618=>278,619=>278, +621=>278,622=>667,623=>833,624=>833,625=>833,626=>556,627=>556,628=>556,629=>500,631=>715, +632=>667,633=>444,634=>444,635=>444,636=>444,637=>444,638=>394,639=>394,640=>556,641=>556, +642=>389,643=>333,644=>333,645=>433,647=>333,648=>333,649=>500,650=>557,651=>529,652=>500, +653=>722,654=>500,655=>500,656=>444,658=>502,660=>500,661=>500,662=>500,664=>778,665=>510, +667=>722,668=>556,670=>556,671=>444,672=>556,673=>500,674=>500,686=>611,687=>722,697=>250, +698=>408,699=>250,700=>250,701=>250,702=>300,703=>300,706=>333,707=>333,708=>333,709=>333, +711=>333,712=>333,713=>333,714=>333,715=>333,716=>300,717=>333,718=>333,719=>333,720=>278, +721=>278,722=>300,723=>300,724=>333,725=>333,726=>333,727=>333,728=>333,729=>333,730=>333, +731=>333,733=>400,734=>333,735=>352,741=>526,742=>526,743=>526,744=>526,745=>526,746=>519, +747=>519,748=>333,749=>333,750=>480,751=>333,752=>333,753=>333,754=>333,755=>327,756=>261, +757=>437,758=>437,759=>400,760=>278,761=>175,762=>175,763=>175,764=>175,765=>333,766=>337, +767=>432,768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0, +777=>0,778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0, +787=>0,788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0, +797=>0,798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0, +807=>0,808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0, +817=>0,818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0, +827=>0,828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0, +837=>0,838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0,845=>0,846=>0, +847=>0,848=>0,849=>0,850=>0,851=>0,852=>0,853=>0,854=>0,855=>0,856=>0, +857=>0,858=>0,860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,884=>199,885=>199, +890=>0,894=>333,900=>330,901=>415,902=>722,903=>250,904=>811,905=>938,906=>556,908=>840, +910=>886,911=>879,912=>330,913=>722,914=>667,915=>611,916=>759,917=>667,918=>667,919=>774, +920=>778,921=>386,922=>777,923=>722,924=>943,925=>722,926=>650,927=>778,928=>812,929=>611, +931=>650,932=>667,933=>738,934=>868,935=>722,936=>924,937=>811,938=>386,939=>738,940=>605, +941=>440,942=>605,943=>330,944=>550,945=>605,946=>550,947=>550,948=>550,949=>440,950=>495, +951=>605,952=>550,953=>330,954=>608,955=>495,956=>605,957=>495,958=>495,959=>550,960=>605, +961=>550,962=>440,963=>550,964=>440,965=>550,966=>660,967=>495,968=>715,969=>715,970=>330, +971=>550,972=>550,973=>550,974=>715,976=>550,977=>605,978=>722,979=>871,980=>722,981=>660, +982=>715,983=>550,984=>611,985=>550,986=>650,987=>514,988=>611,989=>513,990=>715,991=>439, +992=>722,993=>605,1008=>550,1009=>550,1010=>477,1011=>333,1012=>778,1013=>424,1014=>424,1015=>632, +1016=>575,1017=>722,1018=>943,1019=>809,1020=>550,1021=>722,1022=>722,1023=>722,1024=>667,1025=>667, +1026=>848,1027=>611,1028=>722,1029=>556,1030=>386,1031=>386,1032=>500,1033=>1042,1034=>1032,1035=>912, +1036=>770,1037=>774,1038=>738,1039=>778,1040=>722,1041=>648,1042=>667,1043=>599,1044=>708,1045=>667, +1046=>1106,1047=>652,1048=>774,1049=>774,1050=>770,1051=>788,1052=>943,1053=>774,1054=>778,1055=>812, +1056=>611,1057=>722,1058=>667,1059=>738,1060=>868,1061=>722,1062=>774,1063=>754,1064=>1115,1065=>1115, +1066=>782,1067=>970,1068=>630,1069=>722,1070=>1114,1071=>729,1072=>500,1073=>500,1074=>510,1075=>430, +1076=>545,1077=>438,1078=>781,1079=>445,1080=>556,1081=>556,1082=>556,1083=>542,1084=>668,1085=>558, +1086=>500,1087=>558,1088=>549,1089=>444,1090=>494,1091=>486,1092=>809,1093=>500,1094=>560,1095=>556, +1096=>818,1097=>820,1098=>612,1099=>756,1100=>512,1101=>496,1102=>770,1103=>546,1104=>438,1105=>444, +1106=>549,1107=>430,1108=>488,1109=>386,1110=>272,1111=>278,1112=>333,1113=>784,1114=>786,1115=>552, +1116=>556,1117=>556,1118=>484,1119=>556,1120=>1018,1121=>699,1122=>781,1123=>612,1124=>1033,1125=>778, +1126=>993,1127=>692,1128=>1371,1129=>975,1130=>1106,1131=>781,1132=>1474,1133=>1066,1134=>650,1135=>424, +1136=>970,1137=>769,1138=>770,1139=>590,1140=>808,1141=>578,1142=>808,1143=>650,1144=>1284,1145=>973, +1146=>928,1147=>672,1148=>1018,1149=>693,1150=>1018,1151=>699,1152=>650,1153=>444,1154=>258,1155=>0, +1156=>0,1157=>0,1158=>0,1159=>0,1160=>0,1161=>0,1162=>774,1163=>558,1164=>630,1165=>512, +1166=>611,1167=>556,1168=>614,1169=>458,1170=>614,1171=>443,1172=>631,1173=>562,1174=>1155,1175=>828, +1176=>652,1177=>452,1178=>819,1179=>600,1180=>816,1181=>590,1182=>920,1183=>664,1184=>967,1185=>633, +1186=>774,1187=>562,1188=>984,1189=>698,1190=>1069,1191=>841,1192=>722,1193=>524,1194=>722,1195=>444, +1196=>667,1197=>494,1198=>722,1199=>606,1200=>722,1201=>606,1202=>722,1203=>560,1204=>1046,1205=>778, +1206=>754,1207=>560,1208=>810,1209=>590,1210=>754,1211=>556,1212=>945,1213=>606,1214=>945,1215=>606, +1216=>386,1217=>1106,1218=>781,1219=>770,1220=>534,1221=>788,1222=>550,1223=>774,1224=>556,1225=>774, +1226=>558,1227=>778,1228=>556,1229=>943,1230=>677,1231=>386,1232=>722,1233=>500,1234=>722,1235=>500, +1236=>1000,1237=>722,1238=>667,1239=>444,1240=>778,1241=>444,1242=>778,1243=>444,1244=>1106,1245=>781, +1246=>652,1247=>445,1248=>654,1249=>389,1250=>774,1251=>556,1252=>774,1253=>556,1254=>778,1255=>500, +1256=>778,1257=>500,1258=>778,1259=>500,1260=>722,1261=>496,1262=>738,1263=>500,1264=>738,1265=>500, +1266=>738,1267=>500,1268=>754,1269=>556,1270=>599,1271=>443,1272=>970,1273=>756,1296=>652,1297=>452, +1298=>788,1299=>550,1306=>778,1307=>556,1308=>1000,1309=>722,1310=>770,1311=>558,1425=>0,1426=>0, +1427=>0,1428=>0,1429=>0,1430=>0,1431=>0,1432=>0,1433=>0,1434=>0,1435=>0,1436=>0, +1437=>0,1438=>0,1439=>0,1440=>0,1441=>0,1442=>0,1443=>0,1444=>0,1445=>0,1446=>0, +1447=>0,1448=>0,1449=>0,1450=>0,1451=>0,1452=>0,1453=>0,1454=>0,1455=>0,1456=>0, +1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0,1463=>0,1464=>0,1465=>0,1466=>0, +1467=>0,1468=>0,1469=>0,1470=>433,1471=>0,1472=>155,1473=>0,1474=>0,1475=>400,1476=>0, +1477=>0,1478=>347,1479=>0,1488=>593,1489=>498,1490=>339,1491=>523,1492=>561,1493=>266,1494=>291, +1495=>559,1496=>576,1497=>266,1498=>496,1499=>501,1500=>510,1501=>542,1502=>581,1503=>273,1504=>347, +1505=>512,1506=>552,1507=>493,1508=>491,1509=>537,1510=>561,1511=>544,1512=>502,1513=>716,1514=>571, +1520=>532,1521=>532,1522=>532,1523=>396,1524=>432,3585=>590,3586=>578,3587=>661,3588=>592,3589=>592, +3590=>699,3591=>447,3592=>534,3593=>692,3594=>578,3595=>659,3596=>899,3597=>804,3598=>633,3599=>637, +3600=>484,3601=>730,3602=>876,3603=>915,3604=>592,3605=>592,3606=>578,3607=>670,3608=>542,3609=>671, +3610=>621,3611=>618,3612=>621,3613=>617,3614=>708,3615=>708,3616=>637,3617=>589,3618=>552,3619=>484, +3620=>590,3621=>569,3622=>637,3623=>526,3624=>599,3625=>802,3626=>579,3627=>668,3628=>778,3629=>560, +3630=>514,3631=>510,3632=>412,3633=>0,3634=>423,3635=>452,3636=>0,3637=>0,3638=>0,3639=>0, +3640=>0,3641=>0,3642=>0,3647=>665,3648=>357,3649=>624,3650=>529,3651=>486,3652=>475,3653=>423, +3654=>500,3655=>0,3656=>0,3657=>0,3658=>0,3659=>0,3660=>0,3661=>0,3662=>0,3663=>657, +3664=>548,3665=>548,3666=>592,3667=>614,3668=>631,3669=>643,3670=>508,3671=>744,3672=>622,3673=>585, +3674=>721,3675=>1381,4256=>475,4257=>469,4258=>573,4259=>650,4260=>502,4261=>506,4262=>481,4263=>746, +4264=>491,4265=>495,4266=>888,4267=>488,4268=>464,4269=>745,4270=>483,4271=>489,4272=>721,4273=>464, +4274=>578,4275=>590,4276=>611,4277=>491,4278=>663,4279=>489,4280=>544,4281=>479,4282=>527,4283=>488, +4284=>560,4285=>461,4286=>467,4287=>546,4288=>483,4289=>487,4290=>562,4291=>477,4292=>491,4293=>471, +4304=>522,4305=>518,4306=>621,4307=>716,4308=>517,4309=>519,4310=>518,4311=>796,4312=>518,4313=>518, +4314=>934,4315=>517,4316=>519,4317=>787,4318=>515,4319=>514,4320=>788,4321=>573,4322=>620,4323=>593, +4324=>639,4325=>516,4326=>714,4327=>518,4328=>572,4329=>518,4330=>555,4331=>518,4332=>562,4333=>509, +4334=>572,4335=>677,4336=>523,4337=>517,4338=>595,4339=>480,4340=>519,4341=>484,4345=>621,4347=>450, +5024=>718,5025=>768,5026=>633,5027=>878,5028=>1001,5029=>371,5030=>576,5031=>754,5032=>531,5033=>774, +5034=>692,5035=>499,5036=>668,5037=>829,5038=>575,5039=>681,5040=>485,5041=>607,5042=>885,5043=>974, +5044=>588,5045=>583,5046=>726,5047=>947,5048=>558,5049=>832,5050=>1096,5051=>780,5052=>595,5053=>869, +5054=>752,5055=>710,5056=>761,5057=>802,5058=>760,5059=>656,5060=>655,5061=>982,5062=>684,5063=>801, +5064=>805,5065=>1042,5066=>755,5067=>612,5068=>707,5069=>889,5070=>584,5071=>623,5072=>536,5073=>763, +5074=>763,5075=>498,5076=>1052,5077=>600,5078=>730,5079=>714,5080=>714,5081=>697,5082=>543,5083=>943, +5084=>718,5085=>630,5086=>660,5087=>692,5088=>841,5089=>861,5090=>617,5091=>733,5092=>898,5093=>896, +5094=>781,5095=>612,5096=>830,5097=>948,5098=>886,5099=>757,5100=>796,5101=>578,5102=>601,5103=>797, +5104=>623,5105=>886,5106=>730,5107=>827,5108=>648,7680=>722,7681=>500,7682=>667,7683=>556,7684=>667, +7685=>556,7686=>667,7687=>556,7688=>722,7689=>444,7690=>724,7691=>556,7692=>724,7693=>556,7694=>724, +7695=>556,7696=>724,7697=>556,7698=>724,7699=>556,7700=>667,7701=>444,7702=>667,7703=>444,7704=>667, +7705=>444,7706=>667,7707=>444,7708=>667,7709=>444,7710=>611,7711=>333,7712=>778,7713=>500,7714=>774, +7715=>556,7716=>774,7717=>556,7718=>774,7719=>556,7720=>774,7721=>556,7722=>774,7723=>556,7724=>386, +7725=>278,7726=>389,7727=>278,7728=>764,7729=>556,7730=>764,7731=>556,7732=>764,7733=>556,7734=>664, +7735=>278,7736=>664,7737=>278,7738=>664,7739=>278,7740=>664,7741=>278,7742=>943,7743=>833,7744=>943, +7745=>833,7746=>943,7747=>833,7748=>722,7749=>556,7750=>722,7751=>556,7752=>722,7753=>556,7754=>722, +7755=>556,7756=>778,7757=>500,7758=>778,7759=>500,7760=>778,7761=>500,7762=>778,7763=>500,7764=>611, +7765=>556,7766=>611,7767=>556,7768=>712,7769=>444,7770=>712,7771=>444,7772=>712,7773=>444,7774=>712, +7775=>444,7776=>556,7777=>389,7778=>556,7779=>389,7780=>556,7781=>389,7782=>556,7783=>389,7784=>556, +7785=>389,7786=>667,7787=>333,7788=>667,7789=>333,7790=>667,7791=>333,7792=>667,7793=>333,7794=>722, +7795=>556,7796=>722,7797=>556,7798=>722,7799=>556,7800=>722,7801=>556,7802=>722,7803=>556,7804=>722, +7805=>500,7806=>722,7807=>500,7808=>1000,7809=>722,7810=>1000,7811=>722,7812=>1000,7813=>722,7814=>1000, +7815=>722,7816=>1000,7817=>722,7818=>722,7819=>500,7820=>722,7821=>500,7822=>722,7823=>500,7824=>667, +7825=>444,7826=>667,7827=>444,7828=>667,7829=>444,7830=>556,7831=>333,7832=>722,7833=>500,7834=>507, +7835=>333,7840=>722,7841=>500,7842=>722,7843=>500,7844=>722,7845=>500,7846=>722,7847=>500,7848=>722, +7849=>500,7850=>722,7851=>500,7852=>722,7853=>500,7854=>722,7855=>500,7856=>722,7857=>500,7858=>825, +7859=>603,7860=>722,7861=>500,7862=>722,7863=>500,7864=>667,7865=>444,7866=>667,7867=>444,7868=>667, +7869=>444,7870=>667,7871=>444,7872=>667,7873=>444,7874=>667,7875=>444,7876=>667,7877=>444,7878=>667, +7879=>444,7880=>386,7881=>278,7882=>386,7883=>278,7884=>778,7885=>500,7886=>778,7887=>500,7888=>778, +7889=>500,7890=>778,7891=>500,7892=>778,7893=>500,7894=>778,7895=>500,7896=>778,7897=>500,7898=>774, +7899=>550,7900=>774,7901=>550,7902=>774,7903=>549,7904=>778,7905=>550,7906=>778,7907=>550,7908=>722, +7909=>556,7910=>722,7911=>556,7912=>838,7913=>672,7914=>838,7915=>672,7916=>825,7917=>659,7918=>839, +7919=>629,7920=>839,7921=>629,7922=>722,7923=>500,7924=>722,7925=>500,7926=>722,7927=>500,7928=>722, +7929=>500,7936=>605,7937=>605,7938=>605,7939=>605,7940=>605,7941=>605,7942=>605,7943=>605,7944=>722, +7945=>722,7946=>830,7947=>833,7948=>761,7949=>798,7950=>721,7951=>722,7952=>440,7953=>440,7954=>440, +7955=>440,7956=>440,7957=>440,7960=>817,7961=>826,7962=>944,7963=>970,7964=>964,7965=>1009,7968=>605, +7969=>605,7970=>605,7971=>605,7972=>605,7973=>605,7974=>605,7975=>605,7976=>926,7977=>921,7978=>1038, +7979=>1064,7980=>1092,7981=>1102,7982=>1005,7983=>991,7984=>330,7985=>330,7986=>330,7987=>330,7988=>330, +7989=>330,7990=>330,7991=>330,7992=>534,7993=>541,7994=>653,7995=>659,7996=>705,7997=>714,7998=>612, +7999=>614,8000=>550,8001=>550,8002=>550,8003=>550,8004=>550,8005=>550,8008=>885,8009=>886,8010=>1038, +8011=>1052,8012=>997,8013=>1021,8016=>550,8017=>550,8018=>550,8019=>550,8020=>550,8021=>550,8022=>550, +8023=>550,8025=>870,8027=>1014,8029=>1043,8031=>944,8032=>715,8033=>715,8034=>715,8035=>715,8036=>715, +8037=>715,8038=>715,8039=>715,8040=>905,8041=>913,8042=>1066,8043=>1085,8044=>1034,8045=>1044,8046=>980, +8047=>961,8048=>605,8049=>605,8050=>440,8051=>440,8052=>605,8053=>605,8054=>330,8055=>330,8056=>550, +8057=>550,8058=>550,8059=>550,8060=>715,8061=>715,8064=>605,8065=>605,8066=>605,8067=>605,8068=>605, +8069=>605,8070=>605,8071=>605,8072=>886,8073=>887,8074=>985,8075=>993,8076=>937,8077=>956,8078=>874, +8079=>878,8080=>605,8081=>605,8082=>605,8083=>605,8084=>605,8085=>605,8086=>605,8087=>605,8088=>1096, +8089=>1092,8090=>1223,8091=>1250,8092=>1270,8093=>1283,8094=>1174,8095=>1162,8096=>715,8097=>715,8098=>715, +8099=>715,8100=>715,8101=>715,8102=>715,8103=>715,8104=>1057,8105=>1073,8106=>1228,8107=>1251,8108=>1202, +8109=>1210,8110=>1151,8111=>1131,8112=>605,8113=>605,8114=>605,8115=>605,8116=>605,8118=>605,8119=>605, +8120=>722,8121=>722,8122=>722,8123=>722,8124=>883,8125=>500,8126=>0,8127=>500,8128=>500,8129=>550, +8130=>605,8131=>605,8132=>605,8134=>605,8135=>605,8136=>790,8137=>830,8138=>909,8139=>931,8140=>950, +8141=>500,8142=>500,8143=>500,8144=>330,8145=>330,8146=>330,8147=>330,8150=>330,8151=>330,8152=>386, +8153=>386,8154=>506,8155=>550,8157=>500,8158=>500,8159=>500,8160=>550,8161=>550,8162=>550,8163=>550, +8164=>550,8165=>550,8166=>550,8167=>550,8168=>738,8169=>738,8170=>858,8171=>880,8172=>764,8173=>550, +8174=>550,8175=>500,8178=>715,8179=>715,8180=>715,8182=>715,8183=>715,8184=>884,8185=>857,8186=>927, +8187=>892,8188=>988,8189=>500,8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250, +8198=>167,8199=>500,8200=>250,8201=>200,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0, +8208=>333,8209=>333,8210=>500,8213=>1000,8214=>333,8215=>478,8219=>250,8223=>500,8227=>560,8228=>250, +8229=>500,8231=>250,8232=>0,8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>250, +8241=>1588,8242=>270,8243=>492,8244=>714,8245=>270,8246=>484,8247=>693,8248=>469,8251=>727,8252=>666, +8253=>695,8254=>500,8255=>953,8256=>953,8257=>338,8258=>931,8259=>333,8260=>167,8261=>332,8262=>332, +8263=>1000,8264=>833,8265=>833,8266=>500,8267=>540,8268=>528,8269=>523,8270=>500,8271=>333,8272=>953, +8273=>500,8274=>497,8275=>576,8276=>953,8277=>785,8278=>450,8279=>881,8280=>620,8281=>620,8282=>179, +8283=>621,8284=>569,8285=>179,8286=>179,8287=>111,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0, +8304=>300,8305=>278,8308=>300,8309=>300,8310=>300,8311=>300,8312=>300,8313=>300,8314=>300,8315=>300, +8316=>300,8317=>216,8318=>216,8319=>318,8320=>300,8321=>274,8322=>300,8323=>300,8324=>300,8325=>300, +8326=>300,8327=>300,8328=>300,8329=>300,8330=>300,8331=>300,8332=>300,8333=>216,8334=>216,8352=>710, +8353=>722,8354=>783,8355=>611,8356=>500,8357=>833,8358=>722,8359=>960,8360=>1101,8361=>1000,8362=>889, +8363=>532,8365=>742,8366=>631,8369=>609,8370=>639,8371=>660,8372=>556,8373=>500,8448=>752,8449=>746, +8451=>1009,8457=>923,8458=>500,8459=>1035,8462=>556,8463=>556,8464=>792,8465=>737,8466=>800,8467=>427, +8468=>835,8470=>879,8471=>1048,8472=>666,8475=>747,8476=>955,8478=>722,8479=>722,8480=>891,8481=>1156, +8483=>722,8486=>811,8487=>811,8489=>333,8490=>764,8491=>722,8492=>806,8494=>551,8497=>723,8498=>611, +8499=>1203,8501=>593,8502=>498,8503=>339,8504=>523,8506=>906,8507=>1156,8523=>778,8525=>866,8526=>500, +8531=>750,8532=>750,8533=>750,8534=>750,8535=>750,8536=>750,8537=>750,8538=>750,8539=>750,8540=>750, +8541=>750,8542=>750,8543=>750,8544=>386,8545=>772,8546=>1158,8547=>1108,8548=>722,8549=>1108,8550=>1494, +8551=>1880,8552=>1108,8553=>722,8554=>1108,8555=>1494,8556=>664,8557=>722,8558=>724,8559=>943,8560=>278, +8561=>556,8562=>834,8563=>778,8564=>500,8565=>778,8566=>1056,8567=>1334,8568=>778,8569=>500,8570=>778, +8571=>1056,8572=>278,8573=>444,8574=>556,8575=>833,8592=>964,8593=>523,8594=>964,8595=>523,8596=>964, +8597=>964,8598=>964,8599=>964,8600=>964,8601=>964,8602=>964,8603=>964,8604=>1152,8605=>1152,8606=>964, +8607=>964,8608=>964,8609=>964,8610=>1078,8611=>1078,8612=>964,8613=>964,8614=>964,8615=>964,8616=>964, +8617=>964,8618=>964,8619=>964,8620=>964,8621=>1168,8622=>964,8624=>622,8625=>622,8630=>1069,8631=>1069, +8632=>964,8633=>964,8634=>980,8635=>980,8636=>964,8637=>964,8638=>557,8639=>556,8640=>964,8641=>964, +8642=>557,8643=>556,8644=>964,8645=>964,8646=>964,8647=>964,8648=>964,8649=>964,8650=>964,8651=>964, +8652=>964,8653=>964,8654=>964,8655=>964,8656=>964,8657=>630,8658=>964,8659=>630,8660=>964,8661=>630, +8662=>1063,8663=>1063,8664=>1063,8665=>1063,8666=>964,8667=>964,8668=>1100,8669=>1100,8672=>964,8674=>964, +8676=>964,8677=>964,8704=>627,8705=>716,8706=>558,8707=>627,8708=>627,8709=>500,8710=>612,8711=>719, +8713=>576,8714=>576,8716=>576,8717=>576,8720=>733,8721=>713,8722=>676,8723=>676,8724=>676,8725=>750, +8727=>570,8729=>570,8730=>549,8733=>676,8734=>752,8736=>555,8737=>555,8738=>555,8739=>240,8740=>531, +8741=>478,8742=>705,8743=>694,8744=>694,8745=>694,8746=>694,8747=>323,8756=>629,8757=>629,8761=>947, +8764=>676,8765=>676,8766=>763,8768=>305,8769=>676,8770=>676,8771=>676,8773=>676,8776=>676,8777=>676, +8778=>676,8781=>676,8782=>676,8783=>676,8784=>676,8785=>676,8786=>676,8787=>676,8788=>947,8789=>947, +8790=>676,8791=>676,8796=>676,8800=>570,8801=>676,8802=>676,8804=>570,8805=>570,8806=>676,8807=>676, +8808=>676,8809=>676,8810=>1047,8811=>1047,8812=>450,8813=>676,8814=>676,8815=>676,8816=>676,8817=>676, +8818=>676,8819=>676,8820=>676,8821=>676,8822=>676,8823=>676,8824=>676,8825=>676,8826=>676,8827=>676, +8828=>676,8829=>676,8830=>676,8831=>676,8832=>676,8833=>676,8834=>676,8835=>676,8836=>676,8837=>676, +8838=>676,8839=>676,8840=>676,8841=>676,8842=>676,8843=>676,8846=>694,8847=>676,8848=>676,8849=>676, +8850=>676,8851=>694,8852=>694,8853=>738,8854=>738,8855=>738,8856=>738,8857=>738,8858=>738,8859=>738, +8861=>738,8862=>678,8863=>678,8864=>678,8865=>678,8866=>487,8867=>487,8868=>752,8869=>752,8871=>487, +8873=>659,8874=>831,8876=>487,8877=>487,8878=>659,8879=>659,8882=>676,8883=>676,8884=>676,8885=>676, +8886=>1380,8887=>1380,8888=>1027,8890=>626,8891=>694,8892=>694,8893=>694,8900=>512,8903=>676,8904=>759, +8905=>632,8906=>632,8907=>1000,8908=>1000,8909=>676,8910=>694,8911=>694,8912=>676,8913=>676,8914=>694, +8915=>694,8916=>694,8918=>676,8919=>676,8920=>1441,8921=>1441,8922=>676,8923=>676,8924=>676,8925=>676, +8926=>676,8927=>676,8928=>676,8929=>676,8930=>676,8931=>676,8934=>676,8935=>676,8936=>676,8937=>676, +8938=>676,8939=>676,8940=>676,8941=>676,8960=>737,8968=>411,8969=>411,8970=>411,8971=>411,8976=>680, +8994=>951,8995=>951,9001=>398,9002=>398,9251=>500,9472=>1000,9473=>1000,9474=>1000,9475=>1000,9476=>1000, +9477=>1000,9478=>1000,9479=>1000,9480=>1000,9481=>1000,9482=>1000,9483=>1000,9484=>1000,9485=>1000,9486=>1000, +9487=>1000,9488=>1000,9489=>1000,9490=>1000,9491=>1000,9492=>1000,9493=>1000,9494=>1000,9495=>1000,9496=>1000, +9497=>1000,9498=>1000,9499=>1000,9500=>1000,9501=>1000,9502=>1000,9503=>1000,9504=>1000,9505=>1000,9506=>1000, +9507=>1000,9508=>1000,9509=>1000,9510=>1000,9511=>1000,9512=>1000,9513=>1000,9514=>1000,9515=>1000,9516=>1000, +9517=>1000,9518=>1000,9519=>1000,9520=>1000,9521=>1000,9522=>1000,9523=>1000,9524=>1000,9525=>1000,9526=>1000, +9527=>1000,9528=>1000,9529=>1000,9530=>1000,9531=>1000,9532=>1000,9533=>1000,9534=>1000,9535=>1000,9536=>1000, +9537=>1000,9538=>1000,9539=>1000,9540=>1000,9541=>1000,9542=>1000,9543=>1000,9544=>1000,9545=>1000,9546=>1000, +9547=>1000,9552=>1000,9553=>1000,9554=>1000,9555=>1000,9556=>1000,9557=>1000,9558=>1000,9559=>1000,9560=>1000, +9561=>1000,9562=>1000,9563=>1000,9564=>1000,9565=>1000,9566=>1000,9567=>1000,9568=>1000,9569=>1000,9570=>1000, +9571=>1000,9572=>1000,9573=>1000,9574=>1000,9575=>1000,9576=>1000,9577=>1000,9578=>1000,9579=>1000,9580=>1000, +9600=>1000,9601=>1000,9602=>1000,9603=>1000,9604=>1000,9605=>1000,9606=>1000,9607=>1000,9608=>1000,9609=>1000, +9610=>1000,9611=>1000,9612=>1000,9613=>1000,9614=>1000,9615=>1000,9616=>1000,9617=>1000,9618=>1000,9620=>1000, +9621=>1000,9622=>1000,9623=>1000,9624=>1000,9625=>1000,9626=>1000,9627=>1000,9628=>1000,9629=>1000,9630=>1000, +9631=>1000,9632=>678,9633=>678,9642=>309,9650=>681,9651=>681,9654=>681,9655=>681,9660=>681,9661=>681, +9664=>681,9665=>681,9670=>580,9671=>580,9674=>494,9675=>738,9676=>732,9679=>738,9702=>524,9711=>851, +9733=>1003,9734=>1003,9824=>618,9825=>645,9826=>587,9827=>582,9828=>582,9829=>645,9830=>587,9831=>618, +9833=>333,9834=>556,9835=>778,9836=>778,9837=>556,9838=>556,9839=>556,10214=>561,10215=>561,11799=>333, +64256=>613,64257=>559,64258=>559,64259=>846,64260=>836,64262=>723,64285=>266,64286=>0,64287=>532,64288=>552, +64297=>570,64298=>716,64299=>716,64300=>716,64301=>716,64302=>593,64303=>593,64304=>593,64305=>498,64306=>339, +64307=>523,64308=>561,64309=>266,64310=>291,64312=>576,64313=>266,64314=>496,64315=>501,64316=>510,64318=>581, +64320=>347,64321=>512,64323=>493,64324=>491,64326=>561,64327=>544,64328=>502,64329=>716,64330=>571,64331=>266, +64332=>498,64333=>501,64334=>491,64335=>593,65533=>788); +$enc=''; +$diff=''; +$file='freeserifb.z'; +$ctg='freeserifb.ctg.z'; +$originalsize=467208; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifb.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifb.z new file mode 100644 index 0000000..95e3136 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifb.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifbi.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifbi.ctg.z new file mode 100644 index 0000000..86d46ef Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifbi.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifbi.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifbi.php new file mode 100644 index 0000000..79a1735 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifbi.php @@ -0,0 +1,238 @@ +<?php +$type='TrueTypeUnicode'; +$name='FreeSerifBoldItalic'; +$desc=array('Ascent'=>900,'Descent'=>-300,'CapHeight'=>-24,'Flags'=>96,'FontBBox'=>'[-787 -1120 1867 1571]','ItalicAngle'=>-16.3,'StemV'=>120,'MissingWidth'=>600); +$up=-125; +$ut=50; +$dw=600; +$cw=array( +32=>250,33=>389,34=>555,35=>500,36=>500,37=>833,38=>778,39=>278,40=>333,41=>333, +42=>500,43=>570,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500,50=>500,51=>500, +52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>333,59=>333,60=>570,61=>570, +62=>570,63=>500,64=>832,65=>667,66=>667,67=>667,68=>744,69=>670,70=>656,71=>722, +72=>778,73=>393,74=>500,75=>664,76=>609,77=>896,78=>722,79=>722,80=>614,81=>722, +82=>672,83=>556,84=>611,85=>722,86=>667,87=>889,88=>667,89=>611,90=>611,91=>333, +92=>278,93=>333,94=>570,95=>500,96=>333,97=>500,98=>500,99=>444,100=>500,101=>444, +102=>333,103=>500,104=>556,105=>278,106=>278,107=>500,108=>278,109=>778,110=>556,111=>500, +112=>500,113=>500,114=>389,115=>389,116=>278,117=>556,118=>444,119=>667,120=>500,121=>444, +122=>389,123=>348,124=>220,125=>348,126=>570,8364=>761,8218=>250,402=>333,8222=>500,8230=>1000, +8224=>500,8225=>500,710=>333,8240=>1000,352=>556,8249=>333,338=>944,381=>611,8216=>250,8217=>250, +8220=>500,8221=>500,8226=>350,8211=>500,8212=>1000,732=>333,8482=>1000,353=>389,8250=>333,339=>722, +382=>389,376=>611,160=>250,161=>389,162=>500,163=>500,164=>500,165=>500,166=>220,167=>500, +168=>333,169=>747,170=>266,171=>500,172=>606,173=>333,174=>747,175=>333,176=>400,177=>570, +178=>300,179=>300,180=>333,181=>576,182=>500,183=>250,184=>333,185=>272,186=>300,187=>500, +188=>750,189=>750,190=>750,191=>500,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667, +198=>944,199=>667,200=>667,201=>667,202=>667,203=>667,204=>389,205=>389,206=>389,207=>389, +208=>722,209=>722,210=>722,211=>722,212=>722,213=>722,214=>722,215=>570,216=>722,217=>722, +218=>722,219=>722,220=>722,221=>611,222=>609,223=>500,224=>500,225=>500,226=>500,227=>500, +228=>500,229=>500,230=>722,231=>444,232=>444,233=>444,234=>444,235=>444,236=>278,237=>278, +238=>278,239=>278,240=>500,241=>556,242=>500,243=>500,244=>500,245=>500,246=>500,247=>570, +248=>500,249=>556,250=>556,251=>556,252=>556,253=>444,254=>500,255=>444,256=>667,257=>500, +258=>667,259=>500,260=>667,261=>500,262=>667,263=>444,264=>667,265=>444,266=>667,267=>444, +268=>667,269=>444,270=>722,271=>616,272=>722,273=>500,274=>667,275=>444,276=>667,277=>444, +278=>667,279=>444,280=>667,281=>444,282=>667,283=>444,284=>722,285=>500,286=>722,287=>500, +288=>722,289=>500,290=>722,291=>500,292=>778,293=>556,294=>778,295=>556,296=>389,297=>278, +298=>389,299=>278,300=>389,301=>278,302=>389,303=>278,304=>389,305=>278,306=>826,307=>547, +308=>500,309=>278,310=>667,311=>500,312=>534,313=>611,314=>278,315=>611,316=>278,317=>638, +318=>424,319=>611,320=>424,321=>611,322=>278,323=>722,324=>556,325=>722,326=>556,327=>722, +328=>556,329=>556,330=>722,331=>547,332=>722,333=>500,334=>722,335=>500,336=>722,337=>500, +340=>667,341=>389,342=>667,343=>389,344=>667,345=>389,346=>556,347=>389,348=>556,349=>389, +350=>556,351=>389,354=>611,355=>278,356=>611,357=>308,358=>611,359=>278,360=>722,361=>556, +362=>722,363=>556,364=>722,365=>556,366=>722,367=>556,368=>722,369=>556,370=>722,371=>556, +372=>889,373=>667,374=>611,375=>444,377=>611,378=>389,379=>611,380=>389,383=>333,384=>500, +385=>850,386=>667,387=>575,388=>630,389=>500,390=>722,391=>929,392=>654,393=>722,394=>864, +395=>684,396=>500,397=>546,398=>670,399=>722,400=>631,401=>769,403=>929,404=>716,405=>745, +406=>278,407=>389,408=>829,409=>500,410=>278,411=>495,412=>853,413=>919,414=>556,415=>722, +416=>908,417=>640,418=>1014,419=>778,420=>757,421=>500,422=>611,423=>556,424=>389,425=>730, +426=>455,427=>349,428=>611,429=>298,430=>611,431=>902,432=>714,433=>811,434=>678,435=>611, +436=>581,437=>611,438=>389,439=>619,440=>614,441=>461,442=>445,443=>500,444=>614,445=>500, +446=>389,447=>504,448=>220,449=>418,450=>570,451=>333,452=>1355,453=>1133,454=>889,455=>1109, +456=>887,457=>556,458=>1222,459=>1000,460=>834,461=>667,462=>500,463=>393,464=>278,465=>722, +466=>500,467=>722,468=>556,469=>722,470=>556,471=>722,472=>556,473=>722,474=>556,475=>722, +476=>556,477=>444,478=>667,479=>500,480=>667,481=>500,482=>944,483=>722,484=>722,485=>500, +486=>722,487=>500,488=>664,489=>500,490=>722,491=>500,492=>722,493=>500,494=>619,495=>513, +496=>278,497=>1355,498=>1133,499=>889,500=>722,501=>500,502=>944,503=>660,504=>722,505=>556, +506=>667,507=>500,508=>944,509=>722,510=>722,511=>500,512=>667,513=>500,514=>667,515=>500, +516=>670,517=>444,518=>670,519=>444,520=>393,521=>278,522=>393,523=>278,524=>722,525=>500, +526=>722,527=>500,528=>672,529=>389,530=>672,531=>389,532=>722,533=>556,534=>722,535=>556, +536=>556,537=>389,538=>611,539=>278,540=>424,541=>455,542=>778,543=>556,544=>731,545=>618, +546=>568,547=>500,548=>667,549=>444,550=>667,551=>500,552=>670,553=>444,554=>722,555=>500, +556=>722,557=>500,558=>722,559=>500,560=>722,561=>500,562=>611,563=>444,564=>422,565=>621, +566=>413,567=>278,568=>800,569=>784,570=>644,571=>667,572=>444,573=>664,574=>611,575=>389, +576=>451,577=>444,578=>444,579=>667,580=>722,581=>722,582=>670,583=>444,584=>500,585=>278, +586=>808,587=>608,588=>672,589=>389,590=>611,591=>444,592=>500,593=>590,594=>590,595=>500, +596=>444,599=>668,600=>444,601=>444,603=>430,608=>569,609=>500,613=>556,616=>278,617=>320, +618=>278,623=>778,629=>500,633=>389,643=>333,648=>278,649=>500,650=>557,651=>492,652=>444, +653=>667,654=>444,658=>513,670=>500,697=>250,698=>408,699=>250,700=>250,701=>250,702=>300, +703=>300,706=>333,707=>333,708=>333,709=>333,711=>333,712=>333,713=>333,714=>333,715=>333, +716=>300,717=>333,718=>333,719=>333,720=>278,721=>278,722=>300,723=>300,724=>333,725=>333, +726=>333,727=>333,728=>333,729=>333,730=>333,731=>333,733=>333,734=>333,735=>352,741=>526, +742=>526,743=>526,744=>526,745=>526,746=>519,747=>519,748=>333,749=>333,750=>480,751=>333, +752=>333,753=>333,754=>333,755=>327,756=>261,757=>437,758=>437,759=>400,760=>278,761=>175, +762=>175,763=>175,764=>175,765=>0,766=>337,767=>432,768=>0,769=>0,770=>0,771=>0, +772=>0,773=>0,774=>0,775=>0,776=>0,777=>0,778=>0,779=>0,780=>0,781=>0, +782=>0,783=>0,784=>0,785=>0,786=>0,787=>0,788=>0,789=>0,790=>0,791=>0, +792=>0,793=>0,794=>0,795=>0,796=>0,797=>0,798=>0,799=>0,800=>0,801=>0, +802=>0,803=>0,804=>0,805=>0,806=>0,807=>0,808=>0,809=>0,810=>0,811=>0, +812=>0,813=>0,814=>0,815=>0,816=>0,817=>0,818=>0,819=>0,820=>0,821=>0, +822=>0,823=>0,824=>0,825=>0,826=>0,827=>0,828=>0,829=>0,830=>0,831=>0, +832=>0,833=>0,834=>0,835=>0,836=>0,837=>0,838=>0,839=>0,840=>0,841=>0, +842=>0,843=>0,844=>0,845=>0,846=>0,847=>0,848=>0,849=>0,850=>0,851=>0, +852=>0,853=>0,854=>0,855=>0,856=>0,857=>0,858=>0,860=>0,861=>0,862=>0, +863=>0,864=>0,865=>0,884=>199,885=>199,890=>0,894=>333,900=>330,901=>333,902=>667, +903=>250,904=>819,905=>955,906=>539,908=>835,910=>961,911=>889,912=>320,913=>667,914=>667, +915=>637,916=>740,917=>667,918=>611,919=>778,920=>722,921=>389,922=>677,923=>667,924=>889, +925=>722,926=>650,927=>722,928=>778,929=>611,931=>730,932=>621,933=>722,934=>748,935=>667, +936=>858,937=>741,938=>389,939=>722,940=>590,941=>430,942=>548,943=>320,944=>536,945=>590, +946=>536,947=>548,948=>550,949=>430,950=>482,951=>548,952=>525,953=>320,954=>564,955=>510, +956=>589,957=>522,958=>482,959=>536,960=>629,961=>536,962=>470,963=>536,964=>464,965=>536, +966=>643,967=>482,968=>715,969=>715,970=>320,971=>536,972=>536,973=>536,974=>715,976=>508, +977=>589,978=>722,979=>931,980=>722,981=>660,982=>715,983=>536,984=>611,985=>536,986=>620, +987=>524,988=>667,989=>535,990=>708,991=>428,992=>671,993=>633,1008=>550,1009=>550,1010=>477, +1011=>278,1012=>722,1013=>411,1014=>411,1015=>609,1016=>500,1017=>667,1018=>896,1019=>769,1020=>536, +1021=>667,1022=>667,1023=>667,1024=>670,1025=>670,1026=>762,1027=>637,1028=>667,1029=>556,1030=>393, +1031=>393,1032=>500,1033=>1085,1034=>1049,1035=>747,1036=>736,1037=>778,1038=>746,1039=>778,1040=>667, +1041=>667,1042=>667,1043=>637,1044=>778,1045=>670,1046=>1044,1047=>650,1048=>778,1049=>778,1050=>736, +1051=>814,1052=>896,1053=>778,1054=>722,1055=>778,1056=>614,1057=>667,1058=>611,1059=>746,1060=>748, +1061=>667,1062=>778,1063=>742,1064=>1136,1065=>1135,1066=>779,1067=>984,1068=>664,1069=>732,1070=>1069, +1071=>779,1072=>500,1073=>508,1074=>486,1075=>414,1076=>486,1077=>444,1078=>982,1079=>476,1080=>556, +1081=>556,1082=>564,1083=>585,1084=>757,1085=>552,1086=>500,1087=>556,1088=>500,1089=>444,1090=>778, +1091=>532,1092=>764,1093=>500,1094=>556,1095=>556,1096=>806,1097=>806,1098=>644,1099=>744,1100=>470, +1101=>488,1102=>757,1103=>586,1104=>444,1105=>444,1106=>524,1107=>414,1108=>488,1109=>389,1110=>278, +1111=>278,1112=>278,1113=>772,1114=>745,1115=>556,1116=>564,1117=>556,1118=>532,1119=>556,1120=>990, +1121=>690,1122=>804,1123=>751,1124=>1017,1125=>752,1126=>900,1127=>728,1128=>1236,1129=>927,1130=>1044, +1131=>826,1132=>1401,1133=>1016,1134=>620,1135=>476,1136=>858,1137=>769,1138=>722,1139=>544,1140=>796, +1141=>584,1142=>796,1143=>584,1144=>1268,1145=>1023,1146=>895,1147=>612,1148=>990,1149=>690,1150=>990, +1151=>635,1152=>620,1153=>444,1154=>372,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>0, +1161=>0,1162=>778,1163=>556,1164=>664,1165=>470,1166=>614,1167=>473,1168=>624,1169=>448,1170=>624, +1171=>448,1172=>733,1173=>485,1174=>1080,1175=>982,1176=>650,1177=>476,1178=>772,1179=>564,1180=>772, +1181=>590,1182=>738,1183=>499,1184=>862,1185=>718,1186=>778,1187=>552,1188=>976,1189=>682,1190=>1085, +1191=>787,1192=>667,1193=>480,1194=>667,1195=>444,1196=>534,1197=>778,1198=>611,1199=>640,1200=>611, +1201=>640,1202=>694,1203=>500,1204=>1004,1205=>518,1206=>742,1207=>556,1208=>742,1209=>556,1210=>716, +1211=>556,1212=>844,1213=>530,1214=>844,1215=>530,1216=>393,1217=>1044,1218=>982,1219=>736,1220=>534, +1221=>814,1222=>585,1223=>778,1224=>552,1225=>778,1226=>552,1227=>742,1228=>556,1229=>896,1230=>757, +1231=>393,1232=>667,1233=>500,1234=>667,1235=>500,1236=>891,1237=>646,1238=>670,1239=>444,1240=>659, +1241=>372,1242=>619,1243=>372,1244=>1044,1245=>994,1246=>650,1247=>476,1248=>604,1249=>459,1250=>778, +1251=>539,1252=>778,1253=>539,1254=>722,1255=>500,1256=>722,1257=>500,1258=>722,1259=>500,1260=>732, +1261=>488,1262=>746,1263=>532,1264=>746,1265=>532,1266=>746,1267=>532,1268=>742,1269=>556,1270=>637, +1271=>448,1272=>984,1273=>744,1296=>652,1297=>452,1298=>814,1299=>585,1306=>722,1307=>500,1308=>889, +1309=>656,1310=>736,1311=>564,1425=>0,1426=>0,1427=>0,1428=>0,1429=>0,1430=>0,1431=>0, +1432=>0,1433=>0,1434=>0,1435=>0,1436=>0,1437=>0,1438=>0,1439=>0,1440=>0,1441=>0, +1442=>0,1443=>0,1444=>0,1445=>0,1446=>0,1447=>0,1448=>0,1449=>0,1450=>0,1451=>0, +1452=>0,1453=>0,1454=>0,1455=>0,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0, +1462=>0,1463=>0,1464=>0,1465=>0,1466=>0,1467=>0,1468=>0,1469=>0,1470=>433,1471=>0, +1472=>155,1473=>0,1474=>0,1475=>400,1476=>0,1477=>0,1478=>347,1479=>0,1488=>593,1489=>498, +1490=>339,1491=>523,1492=>561,1493=>266,1494=>291,1495=>559,1496=>576,1497=>266,1498=>496,1499=>501, +1500=>510,1501=>542,1502=>581,1503=>273,1504=>347,1505=>512,1506=>552,1507=>493,1508=>491,1509=>537, +1510=>561,1511=>544,1512=>502,1513=>716,1514=>571,1520=>532,1521=>532,1522=>532,1523=>396,1524=>432, +3585=>590,3586=>578,3587=>661,3588=>592,3589=>592,3590=>699,3591=>447,3592=>534,3593=>692,3594=>578, +3595=>659,3596=>899,3597=>804,3598=>633,3599=>637,3600=>484,3601=>730,3602=>876,3603=>915,3604=>592, +3605=>592,3606=>578,3607=>670,3608=>542,3609=>671,3610=>621,3611=>618,3612=>621,3613=>617,3614=>708, +3615=>708,3616=>637,3617=>589,3618=>552,3619=>484,3620=>590,3621=>569,3622=>637,3623=>526,3624=>599, +3625=>802,3626=>579,3627=>668,3628=>778,3629=>560,3630=>514,3631=>510,3632=>442,3633=>0,3634=>423, +3635=>452,3636=>0,3637=>0,3638=>0,3639=>0,3640=>0,3641=>0,3642=>0,3647=>665,3648=>357, +3649=>624,3650=>529,3651=>486,3652=>475,3653=>423,3654=>500,3655=>0,3656=>0,3657=>0,3658=>0, +3659=>0,3660=>0,3661=>0,3662=>0,3663=>657,3664=>548,3665=>548,3666=>592,3667=>614,3668=>631, +3669=>643,3670=>508,3671=>744,3672=>622,3673=>585,3674=>721,3675=>1381,4256=>475,4257=>469,4258=>573, +4259=>650,4260=>502,4261=>506,4262=>481,4263=>746,4264=>491,4265=>495,4266=>888,4267=>488,4268=>464, +4269=>745,4270=>483,4271=>489,4272=>721,4273=>464,4274=>578,4275=>590,4276=>611,4277=>491,4278=>663, +4279=>489,4280=>544,4281=>479,4282=>527,4283=>488,4284=>560,4285=>461,4286=>467,4287=>546,4288=>483, +4289=>487,4290=>562,4291=>477,4292=>491,4293=>471,4304=>522,4305=>518,4306=>621,4307=>716,4308=>517, +4309=>519,4310=>518,4311=>796,4312=>518,4313=>518,4314=>934,4315=>517,4316=>519,4317=>787,4318=>515, +4319=>514,4320=>788,4321=>573,4322=>620,4323=>593,4324=>639,4325=>516,4326=>714,4327=>518,4328=>572, +4329=>518,4330=>555,4331=>518,4332=>562,4333=>509,4334=>572,4335=>677,4336=>523,4337=>517,4338=>595, +4339=>480,4340=>519,4341=>484,4345=>621,4347=>410,5024=>718,5025=>768,5026=>633,5027=>878,5028=>1001, +5029=>371,5030=>576,5031=>754,5032=>531,5033=>774,5034=>692,5035=>499,5036=>668,5037=>829,5038=>575, +5039=>681,5040=>485,5041=>607,5042=>885,5043=>974,5044=>588,5045=>583,5046=>726,5047=>947,5048=>558, +5049=>832,5050=>1096,5051=>780,5052=>595,5053=>869,5054=>752,5055=>710,5056=>761,5057=>802,5058=>760, +5059=>656,5060=>655,5061=>982,5062=>684,5063=>801,5064=>805,5065=>1042,5066=>755,5067=>612,5068=>707, +5069=>889,5070=>584,5071=>623,5072=>536,5073=>763,5074=>763,5075=>498,5076=>1052,5077=>600,5078=>730, +5079=>714,5080=>714,5081=>697,5082=>543,5083=>943,5084=>718,5085=>630,5086=>660,5087=>692,5088=>841, +5089=>861,5090=>617,5091=>733,5092=>898,5093=>896,5094=>781,5095=>612,5096=>830,5097=>948,5098=>886, +5099=>757,5100=>796,5101=>578,5102=>601,5103=>797,5104=>623,5105=>886,5106=>730,5107=>827,5108=>648, +7680=>667,7681=>500,7682=>667,7683=>500,7684=>667,7685=>500,7686=>667,7687=>500,7688=>667,7689=>444, +7690=>744,7691=>500,7692=>744,7693=>500,7694=>744,7695=>500,7696=>744,7697=>500,7698=>744,7699=>500, +7700=>667,7701=>444,7702=>667,7703=>444,7704=>670,7705=>444,7706=>670,7707=>444,7708=>670,7709=>444, +7710=>656,7711=>333,7712=>722,7713=>500,7714=>778,7715=>556,7716=>778,7717=>556,7718=>778,7719=>556, +7720=>778,7721=>556,7722=>778,7723=>556,7724=>393,7725=>278,7726=>389,7727=>278,7728=>664,7729=>500, +7730=>664,7731=>500,7732=>664,7733=>500,7734=>609,7735=>278,7736=>609,7737=>278,7738=>609,7739=>278, +7740=>609,7741=>278,7742=>896,7743=>778,7744=>896,7745=>778,7746=>896,7747=>778,7748=>722,7749=>556, +7750=>722,7751=>556,7752=>722,7753=>556,7754=>722,7755=>556,7756=>722,7757=>500,7758=>722,7759=>500, +7760=>722,7761=>500,7762=>722,7763=>500,7764=>614,7765=>500,7766=>614,7767=>500,7768=>672,7769=>389, +7770=>672,7771=>389,7772=>672,7773=>389,7774=>672,7775=>389,7776=>556,7777=>389,7778=>556,7779=>389, +7780=>556,7781=>389,7782=>556,7783=>389,7784=>556,7785=>389,7786=>611,7787=>278,7788=>611,7789=>278, +7790=>611,7791=>278,7792=>611,7793=>278,7794=>722,7795=>556,7796=>722,7797=>556,7798=>722,7799=>556, +7800=>722,7801=>556,7802=>722,7803=>556,7804=>667,7805=>444,7806=>667,7807=>444,7808=>889,7809=>667, +7810=>889,7811=>667,7812=>889,7813=>667,7814=>889,7815=>667,7816=>889,7817=>667,7818=>667,7819=>500, +7820=>667,7821=>500,7822=>611,7823=>444,7824=>611,7825=>389,7826=>611,7827=>389,7828=>611,7829=>389, +7830=>556,7831=>278,7832=>667,7833=>444,7834=>507,7835=>333,7840=>667,7841=>500,7842=>667,7843=>500, +7844=>667,7845=>500,7846=>667,7847=>500,7848=>667,7849=>500,7850=>667,7851=>500,7852=>667,7853=>500, +7854=>667,7855=>500,7856=>667,7857=>500,7858=>667,7859=>500,7860=>667,7861=>500,7862=>667,7863=>500, +7864=>670,7865=>444,7866=>670,7867=>444,7868=>670,7869=>444,7870=>667,7871=>444,7872=>667,7873=>444, +7874=>667,7875=>444,7876=>667,7877=>444,7878=>670,7879=>444,7880=>393,7881=>278,7882=>393,7883=>278, +7884=>722,7885=>500,7886=>722,7887=>500,7888=>722,7889=>500,7890=>722,7891=>500,7892=>722,7893=>500, +7894=>722,7895=>500,7896=>722,7897=>500,7898=>908,7899=>640,7900=>908,7901=>640,7902=>908,7903=>640, +7904=>908,7905=>640,7906=>908,7907=>640,7908=>722,7909=>556,7910=>722,7911=>556,7912=>902,7913=>714, +7914=>902,7915=>714,7916=>902,7917=>714,7918=>902,7919=>714,7920=>902,7921=>714,7922=>611,7923=>444, +7924=>611,7925=>444,7926=>611,7927=>444,7928=>611,7929=>444,7936=>590,7937=>590,7938=>590,7939=>590, +7940=>590,7941=>590,7942=>590,7943=>590,7944=>724,7945=>753,7946=>891,7947=>912,7948=>822,7949=>853, +7950=>796,7951=>787,7952=>430,7953=>430,7954=>430,7955=>430,7956=>430,7957=>430,7960=>864,7961=>905, +7962=>1034,7963=>1038,7964=>1031,7965=>1045,7968=>548,7969=>548,7970=>548,7971=>548,7972=>548,7973=>548, +7974=>548,7975=>548,7976=>976,7977=>1009,7978=>1132,7979=>1141,7980=>1138,7981=>1154,7982=>1079,7983=>1071, +7984=>320,7985=>320,7986=>320,7987=>320,7988=>320,7989=>320,7990=>320,7991=>320,7992=>593,7993=>620, +7994=>746,7995=>762,7996=>742,7997=>773,7998=>691,7999=>683,8000=>536,8001=>536,8002=>536,8003=>536, +8004=>536,8005=>536,8008=>899,8009=>928,8010=>1086,8011=>1118,8012=>1020,8013=>1028,8016=>536,8017=>536, +8018=>536,8019=>536,8020=>536,8021=>536,8022=>536,8023=>536,8025=>959,8027=>1085,8029=>1108,8031=>1027, +8032=>715,8033=>715,8034=>715,8035=>715,8036=>715,8037=>715,8038=>715,8039=>715,8040=>946,8041=>960, +8042=>1133,8043=>1148,8044=>1059,8045=>1081,8046=>1020,8047=>1016,8048=>590,8049=>590,8050=>430,8051=>430, +8052=>548,8053=>548,8054=>320,8055=>320,8056=>536,8057=>536,8058=>536,8059=>536,8060=>715,8061=>715, +8064=>590,8065=>590,8066=>590,8067=>590,8068=>590,8069=>590,8070=>590,8071=>590,8072=>842,8073=>877, +8074=>1011,8075=>1031,8076=>947,8077=>975,8078=>907,8079=>893,8080=>548,8081=>548,8082=>548,8083=>548, +8084=>548,8085=>548,8086=>548,8087=>548,8088=>1030,8089=>1066,8090=>1188,8091=>1199,8092=>1196,8093=>1211, +8094=>1134,8095=>1129,8096=>715,8097=>715,8098=>715,8099=>715,8100=>715,8101=>715,8102=>715,8103=>715, +8104=>1060,8105=>1076,8106=>1264,8107=>1287,8108=>1179,8109=>1204,8110=>1137,8111=>1135,8112=>590,8113=>590, +8114=>590,8115=>590,8116=>590,8118=>590,8119=>590,8120=>667,8121=>667,8122=>752,8123=>728,8124=>775, +8125=>250,8126=>0,8127=>500,8128=>500,8129=>550,8130=>548,8131=>548,8132=>548,8134=>548,8135=>548, +8136=>884,8137=>859,8138=>982,8139=>968,8140=>839,8141=>500,8142=>500,8143=>500,8144=>320,8145=>320, +8146=>320,8147=>320,8150=>320,8151=>320,8152=>389,8153=>389,8154=>599,8155=>592,8157=>500,8158=>500, +8159=>500,8160=>536,8161=>536,8162=>536,8163=>536,8164=>536,8165=>536,8166=>536,8167=>536,8168=>722, +8169=>722,8170=>1007,8171=>932,8172=>842,8173=>550,8174=>550,8175=>500,8178=>715,8179=>715,8180=>715, +8182=>715,8183=>715,8184=>971,8185=>853,8186=>1004,8187=>875,8188=>862,8189=>500,8190=>500,8192=>500, +8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>500,8200=>250,8201=>200,8202=>100, +8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>333,8209=>333,8210=>500,8213=>1000,8214=>333, +8215=>478,8219=>250,8223=>500,8227=>560,8228=>250,8229=>478,8231=>0,8232=>0,8233=>0,8234=>0, +8235=>0,8236=>0,8237=>0,8238=>250,8239=>0,8241=>1618,8242=>278,8243=>556,8244=>834,8245=>270, +8246=>468,8247=>630,8248=>469,8251=>727,8252=>778,8253=>733,8254=>500,8255=>953,8256=>953,8257=>338, +8258=>931,8259=>333,8260=>167,8261=>332,8262=>332,8263=>1000,8264=>889,8265=>889,8266=>500,8267=>453, +8268=>479,8269=>492,8270=>500,8271=>333,8272=>953,8273=>500,8274=>521,8275=>576,8276=>953,8277=>785, +8278=>410,8279=>881,8280=>620,8281=>620,8282=>179,8283=>621,8284=>569,8285=>179,8286=>179,8287=>111, +8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8304=>300,8305=>219,8308=>300,8309=>300,8310=>300, +8311=>300,8312=>300,8313=>300,8314=>300,8315=>300,8316=>300,8317=>216,8318=>216,8319=>300,8320=>300, +8321=>274,8322=>300,8323=>300,8324=>300,8325=>300,8326=>300,8327=>300,8328=>300,8329=>300,8330=>300, +8331=>300,8332=>300,8333=>216,8334=>216,8352=>667,8353=>667,8354=>667,8355=>667,8356=>500,8357=>742, +8358=>722,8359=>1008,8360=>953,8361=>889,8362=>889,8363=>532,8365=>742,8366=>631,8369=>609,8370=>639, +8371=>742,8372=>576,8373=>500,8448=>664,8449=>665,8451=>925,8453=>693,8454=>787,8455=>631,8457=>867, +8462=>556,8463=>556,8468=>778,8470=>806,8471=>747,8480=>879,8481=>1050,8483=>667,8486=>741,8487=>741, +8489=>320,8490=>664,8491=>667,8494=>551,8495=>444,8498=>667,8500=>500,8501=>537,8502=>537,8503=>350, +8504=>537,8506=>942,8507=>1050,8523=>698,8525=>856,8526=>462,8531=>750,8532=>750,8533=>750,8534=>750, +8535=>750,8536=>750,8537=>750,8538=>750,8539=>750,8540=>750,8541=>750,8542=>750,8543=>750,8544=>393, +8545=>786,8546=>1179,8547=>1060,8548=>667,8549=>1060,8550=>1453,8551=>1846,8552=>1060,8553=>667,8554=>1060, +8555=>1453,8556=>609,8557=>667,8558=>744,8559=>896,8560=>278,8561=>556,8562=>834,8563=>722,8564=>444, +8565=>722,8566=>1000,8567=>1278,8568=>778,8569=>500,8570=>778,8571=>1056,8572=>278,8573=>444,8574=>500, +8575=>778,8592=>964,8593=>964,8594=>964,8595=>964,8596=>964,8597=>964,8598=>964,8599=>964,8600=>964, +8601=>964,8602=>964,8603=>964,8606=>964,8607=>964,8608=>964,8609=>964,8610=>964,8611=>964,8612=>964, +8613=>964,8614=>964,8615=>964,8616=>964,8633=>964,8634=>964,8644=>964,8645=>964,8646=>964,8647=>964, +8648=>964,8649=>964,8650=>964,8676=>964,8677=>964,8706=>494,8710=>612,8721=>713,8722=>606,8725=>750, +8730=>549,8734=>752,8800=>570,8804=>570,8805=>570,9251=>500,9674=>494,9676=>732,9824=>618,9825=>645, +9826=>587,9827=>582,9828=>582,9829=>645,9830=>587,9831=>618,9833=>333,9834=>556,9835=>778,9836=>778, +9837=>556,9838=>556,9839=>556,11799=>333,64256=>583,64257=>558,64258=>551,64259=>822,64260=>818,64262=>662, +64285=>266,64286=>0,64287=>532,64288=>552,64297=>570,64298=>716,64299=>716,64300=>716,64301=>716,64302=>593, +64303=>593,64304=>593,64305=>498,64306=>339,64307=>523,64308=>561,64309=>266,64310=>291,64312=>576,64313=>266, +64314=>496,64315=>501,64316=>510,64318=>581,64320=>347,64321=>512,64323=>493,64324=>491,64326=>561,64327=>544, +64328=>502,64329=>716,64330=>571,64331=>266,64332=>498,64333=>501,64334=>491,64335=>593,65533=>788); +$enc=''; +$diff=''; +$file='freeserifbi.z'; +$ctg='freeserifbi.ctg.z'; +$originalsize=452752; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifbi.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifbi.z new file mode 100644 index 0000000..63125cf Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifbi.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifi.ctg.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifi.ctg.z new file mode 100644 index 0000000..1a99cb5 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifi.ctg.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifi.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifi.php new file mode 100644 index 0000000..df824e2 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifi.php @@ -0,0 +1,259 @@ +<?php +$type='TrueTypeUnicode'; +$name='FreeSerifItalic'; +$desc=array('Ascent'=>900,'Descent'=>-300,'CapHeight'=>-29,'Flags'=>96,'FontBBox'=>'[-879 -434 1673 900]','ItalicAngle'=>-16.5,'StemV'=>70,'MissingWidth'=>600); +$up=-125; +$ut=50; +$dw=600; +$cw=array( +32=>250,33=>333,34=>420,35=>500,36=>500,37=>833,38=>778,39=>214,40=>333,41=>333, +42=>500,43=>675,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500,50=>500,51=>500, +52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>333,59=>333,60=>675,61=>675, +62=>675,63=>500,64=>920,65=>611,66=>611,67=>667,68=>722,69=>604,70=>611,71=>722, +72=>722,73=>339,74=>444,75=>652,76=>556,77=>828,78=>657,79=>722,80=>603,81=>722, +82=>616,83=>500,84=>556,85=>722,86=>611,87=>833,88=>611,89=>556,90=>556,91=>389, +92=>278,93=>389,94=>422,95=>500,96=>333,97=>500,98=>500,99=>444,100=>500,101=>444, +102=>278,103=>500,104=>500,105=>278,106=>278,107=>444,108=>278,109=>722,110=>500,111=>500, +112=>500,113=>500,114=>389,115=>389,116=>278,117=>500,118=>444,119=>667,120=>444,121=>444, +122=>389,123=>400,124=>275,125=>400,126=>541,8364=>741,8218=>250,402=>278,8222=>444,8230=>889, +8224=>500,8225=>500,710=>333,8240=>1000,352=>500,8249=>250,338=>944,381=>556,8216=>250,8217=>250, +8220=>444,8221=>444,8226=>350,8211=>500,8212=>1000,732=>333,8482=>980,353=>389,8250=>250,339=>667, +382=>389,376=>556,160=>250,161=>389,162=>500,163=>500,164=>500,165=>500,166=>275,167=>500, +168=>333,169=>760,170=>276,171=>444,172=>675,173=>333,174=>760,175=>333,176=>400,177=>675, +178=>300,179=>300,180=>333,181=>500,182=>523,183=>250,184=>333,185=>250,186=>310,187=>444, +188=>750,189=>750,190=>750,191=>500,192=>611,193=>611,194=>611,195=>611,196=>611,197=>611, +198=>889,199=>667,200=>611,201=>611,202=>611,203=>611,204=>333,205=>333,206=>333,207=>333, +208=>722,209=>667,210=>722,211=>722,212=>722,213=>722,214=>722,215=>675,216=>722,217=>722, +218=>722,219=>722,220=>722,221=>556,222=>611,223=>500,224=>500,225=>500,226=>500,227=>500, +228=>500,229=>500,230=>667,231=>444,232=>444,233=>444,234=>444,235=>444,236=>278,237=>278, +238=>278,239=>278,240=>500,241=>500,242=>500,243=>500,244=>500,245=>500,246=>500,247=>675, +248=>500,249=>500,250=>500,251=>500,252=>500,253=>444,254=>500,255=>444,256=>611,257=>500, +258=>611,259=>500,260=>611,261=>500,262=>667,263=>444,264=>667,265=>444,266=>667,267=>444, +268=>667,269=>444,270=>722,271=>500,272=>722,273=>500,274=>611,275=>444,276=>611,277=>444, +278=>611,279=>444,280=>611,281=>444,282=>611,283=>444,284=>722,285=>500,286=>722,287=>500, +288=>722,289=>500,290=>722,291=>500,292=>722,293=>500,294=>722,295=>500,296=>333,297=>278, +298=>333,299=>278,300=>333,301=>278,302=>333,303=>278,304=>333,305=>278,306=>707,307=>553, +308=>444,309=>278,310=>667,311=>444,312=>444,313=>556,314=>278,315=>556,316=>278,317=>556, +318=>278,319=>556,320=>278,321=>556,322=>278,323=>667,324=>500,325=>667,326=>500,327=>667, +328=>500,329=>500,330=>667,331=>500,332=>722,333=>500,334=>722,335=>500,336=>722,337=>500, +340=>611,341=>389,342=>611,343=>389,344=>611,345=>389,346=>500,347=>389,348=>500,349=>389, +350=>500,351=>389,354=>556,355=>278,356=>556,357=>278,358=>556,359=>278,360=>722,361=>500, +362=>722,363=>500,364=>722,365=>500,366=>722,367=>500,368=>722,369=>500,370=>722,371=>500, +372=>833,373=>667,374=>556,375=>444,377=>556,378=>389,379=>556,380=>389,383=>278,384=>500, +385=>781,386=>610,387=>551,388=>611,389=>549,390=>667,391=>866,392=>703,393=>722,394=>892, +395=>682,396=>500,397=>520,398=>611,399=>722,400=>518,401=>611,403=>863,404=>611,405=>728, +406=>278,407=>333,408=>792,409=>444,410=>278,411=>480,412=>900,413=>779,414=>500,415=>722, +416=>932,417=>608,418=>908,419=>722,420=>772,421=>500,422=>611,423=>500,424=>389,425=>657, +426=>461,427=>313,428=>556,429=>335,430=>556,431=>948,432=>721,433=>747,434=>755,435=>636, +436=>549,437=>556,438=>389,439=>525,440=>556,441=>424,442=>416,443=>500,444=>615,445=>439, +446=>389,447=>500,448=>275,449=>500,450=>600,451=>333,452=>1278,453=>1111,454=>889,455=>1000, +456=>834,457=>556,458=>1101,459=>935,460=>778,461=>611,462=>500,463=>339,464=>278,465=>722, +466=>500,467=>722,468=>500,469=>722,470=>500,471=>722,472=>500,473=>722,474=>500,475=>722, +476=>500,477=>444,478=>611,479=>500,480=>611,481=>500,482=>889,483=>667,484=>722,485=>500, +486=>722,487=>500,488=>652,489=>444,490=>730,491=>500,492=>730,493=>500,494=>525,495=>446, +496=>278,497=>1278,498=>1111,499=>889,500=>817,501=>595,502=>944,503=>607,504=>657,505=>500, +506=>611,507=>500,508=>889,509=>667,510=>722,511=>500,512=>611,513=>500,514=>611,515=>500, +516=>604,517=>444,518=>604,519=>444,520=>339,521=>278,522=>339,523=>278,524=>722,525=>500, +526=>722,527=>500,528=>616,529=>389,530=>616,531=>389,532=>722,533=>500,534=>722,535=>500, +536=>500,537=>389,538=>556,539=>278,540=>424,541=>455,542=>722,543=>500,544=>781,545=>588, +546=>568,547=>468,548=>611,549=>444,550=>611,551=>500,552=>604,553=>444,554=>722,555=>500, +556=>722,557=>500,558=>722,559=>500,560=>722,561=>500,562=>556,563=>444,564=>405,565=>597, +566=>377,567=>278,568=>775,569=>767,570=>722,571=>667,572=>444,573=>611,574=>611,575=>389, +576=>444,577=>444,578=>444,579=>667,580=>750,581=>697,582=>611,583=>444,584=>389,585=>278, +586=>796,587=>590,588=>667,589=>333,590=>722,591=>500,592=>500,593=>564,594=>564,595=>500, +596=>444,597=>444,598=>500,599=>697,600=>444,601=>444,602=>722,603=>416,604=>426,605=>674, +606=>454,607=>278,608=>640,609=>500,610=>484,611=>500,612=>582,613=>500,614=>500,615=>500, +616=>278,617=>278,618=>278,619=>278,620=>278,621=>278,622=>556,623=>722,624=>722,625=>716, +626=>500,627=>500,628=>500,629=>500,630=>668,631=>693,632=>640,633=>389,634=>389,635=>333, +636=>389,637=>333,638=>333,639=>333,640=>487,641=>487,642=>389,643=>278,644=>500,645=>333, +646=>500,647=>278,648=>278,649=>500,650=>517,651=>500,652=>444,653=>667,654=>444,655=>510, +656=>524,657=>444,658=>446,659=>456,660=>444,661=>444,662=>444,663=>444,664=>722,665=>442, +666=>454,667=>665,668=>585,669=>347,670=>444,671=>443,672=>500,673=>444,674=>444,675=>798, +676=>795,677=>805,678=>554,679=>561,680=>678,681=>614,682=>554,683=>554,684=>500,685=>500, +686=>611,687=>611,688=>300,689=>300,690=>278,691=>278,692=>278,693=>309,694=>306,695=>432, +696=>310,697=>250,698=>408,699=>333,700=>500,701=>500,702=>333,703=>333,704=>258,705=>258, +706=>374,707=>374,708=>383,709=>383,711=>333,712=>250,713=>333,714=>333,715=>333,716=>250, +717=>333,718=>333,719=>333,720=>278,721=>278,722=>333,723=>333,724=>333,725=>333,726=>333, +727=>333,728=>333,729=>333,730=>333,731=>333,733=>333,734=>336,735=>352,736=>311,737=>200, +738=>243,739=>328,740=>300,741=>460,742=>460,743=>460,744=>460,745=>460,746=>477,747=>475, +748=>339,749=>330,750=>444,751=>383,752=>383,753=>294,754=>294,755=>327,756=>261,757=>437, +758=>437,759=>333,760=>278,761=>175,762=>175,763=>175,764=>175,765=>337,766=>337,767=>326, +768=>0,769=>0,770=>0,771=>0,772=>0,773=>0,774=>0,775=>0,776=>0,777=>0, +778=>0,779=>0,780=>0,781=>0,782=>0,783=>0,784=>0,785=>0,786=>0,787=>0, +788=>0,789=>0,790=>0,791=>0,792=>0,793=>0,794=>0,795=>0,796=>0,797=>0, +798=>0,799=>0,800=>0,801=>0,802=>0,803=>0,804=>0,805=>0,806=>0,807=>0, +808=>0,809=>0,810=>0,811=>0,812=>0,813=>0,814=>0,815=>0,816=>0,817=>0, +818=>0,819=>0,820=>0,821=>0,822=>0,823=>0,824=>0,825=>0,826=>0,827=>0, +828=>0,829=>0,830=>0,831=>0,832=>0,833=>0,834=>0,835=>0,836=>0,837=>0, +838=>0,839=>0,840=>0,841=>0,842=>0,843=>0,844=>0,845=>0,846=>0,847=>0, +848=>0,849=>0,850=>0,851=>0,852=>0,853=>0,854=>0,855=>0,856=>0,857=>0, +858=>0,859=>0,860=>0,861=>0,862=>0,863=>0,864=>0,865=>0,866=>0,867=>0, +868=>0,869=>0,870=>0,871=>0,872=>0,873=>0,874=>0,875=>0,876=>0,877=>0, +878=>0,879=>0,884=>199,885=>199,890=>332,894=>333,900=>257,901=>333,902=>661,903=>250, +904=>841,905=>950,906=>559,908=>815,910=>877,911=>899,912=>270,913=>661,914=>581,915=>611, +916=>660,917=>611,918=>606,919=>742,920=>672,921=>333,922=>667,923=>641,924=>833,925=>657, +926=>678,927=>682,928=>749,929=>611,931=>657,932=>596,933=>676,934=>722,935=>611,936=>812, +937=>743,938=>333,939=>696,940=>564,941=>416,942=>506,943=>270,944=>504,945=>564,946=>509, +947=>496,948=>520,949=>416,950=>398,951=>506,952=>533,953=>270,954=>491,955=>488,956=>501, +957=>486,958=>430,959=>510,960=>608,961=>506,962=>423,963=>524,964=>425,965=>504,966=>618, +967=>459,968=>693,969=>693,970=>270,971=>504,972=>510,973=>504,974=>693,976=>534,977=>587, +978=>620,979=>820,980=>620,981=>640,982=>684,983=>504,984=>555,985=>534,986=>548,987=>496, +988=>610,989=>470,990=>633,991=>410,992=>687,993=>544,1008=>534,1009=>534,1010=>485,1011=>278, +1012=>722,1013=>280,1014=>280,1015=>610,1016=>500,1017=>704,1018=>832,1019=>703,1020=>533,1021=>704, +1022=>704,1023=>704,1024=>604,1025=>604,1026=>668,1027=>611,1028=>666,1029=>500,1030=>339,1031=>339, +1032=>444,1033=>972,1034=>977,1035=>703,1036=>664,1037=>720,1038=>728,1039=>728,1040=>611,1041=>610, +1042=>611,1043=>611,1044=>682,1045=>604,1046=>976,1047=>592,1048=>720,1049=>720,1050=>664,1051=>719, +1052=>828,1053=>722,1054=>722,1055=>749,1056=>603,1057=>667,1058=>556,1059=>728,1060=>722,1061=>611, +1062=>728,1063=>666,1064=>997,1065=>1005,1066=>710,1067=>891,1068=>594,1069=>632,1070=>1024,1071=>696, +1072=>500,1073=>500,1074=>442,1075=>344,1076=>503,1077=>440,1078=>932,1079=>402,1080=>500,1081=>500, +1082=>491,1083=>487,1084=>624,1085=>500,1086=>500,1087=>500,1088=>500,1089=>441,1090=>722,1091=>500, +1092=>741,1093=>444,1094=>500,1095=>500,1096=>750,1097=>750,1098=>545,1099=>683,1100=>433,1101=>432, +1102=>700,1103=>503,1104=>440,1105=>440,1106=>500,1107=>344,1108=>442,1109=>389,1110=>278,1111=>278, +1112=>278,1113=>686,1114=>696,1115=>500,1116=>491,1117=>500,1118=>500,1119=>500,1120=>964,1121=>684, +1122=>708,1123=>690,1124=>975,1125=>646,1126=>800,1127=>628,1128=>1096,1129=>795,1130=>952,1131=>730, +1132=>1260,1133=>892,1134=>574,1135=>400,1136=>812,1137=>694,1138=>721,1139=>500,1140=>745,1141=>533, +1142=>745,1143=>533,1144=>1193,1145=>967,1146=>868,1147=>602,1148=>964,1149=>684,1150=>964,1151=>684, +1152=>548,1153=>443,1154=>320,1155=>0,1156=>0,1157=>0,1158=>0,1159=>0,1160=>0,1161=>0, +1162=>720,1163=>500,1164=>602,1165=>433,1166=>611,1167=>500,1168=>552,1169=>424,1170=>593,1171=>424, +1172=>611,1173=>432,1174=>992,1175=>932,1176=>592,1177=>396,1178=>681,1179=>491,1180=>700,1181=>532, +1182=>664,1183=>491,1184=>776,1185=>690,1186=>729,1187=>500,1188=>908,1189=>660,1190=>1034,1191=>694, +1192=>667,1193=>531,1194=>666,1195=>443,1196=>556,1197=>775,1198=>556,1199=>574,1200=>555,1201=>574, +1202=>660,1203=>443,1204=>798,1205=>581,1206=>674,1207=>500,1208=>690,1209=>516,1210=>640,1211=>500, +1212=>785,1213=>558,1214=>787,1215=>559,1216=>339,1217=>976,1218=>932,1219=>664,1220=>491,1221=>719, +1222=>487,1223=>722,1224=>500,1225=>722,1226=>500,1227=>666,1228=>500,1229=>828,1230=>624,1231=>339, +1232=>611,1233=>500,1234=>611,1235=>500,1236=>889,1237=>667,1238=>604,1239=>444,1240=>722,1241=>444, +1242=>722,1243=>444,1244=>976,1245=>932,1246=>592,1247=>402,1248=>525,1249=>446,1250=>720,1251=>500, +1252=>720,1253=>500,1254=>722,1255=>500,1256=>722,1257=>500,1258=>722,1259=>500,1260=>632,1261=>432, +1262=>728,1263=>500,1264=>728,1265=>500,1266=>728,1267=>500,1268=>666,1269=>500,1270=>611,1271=>424, +1272=>891,1273=>683,1296=>532,1297=>409,1298=>719,1299=>487,1306=>722,1307=>500,1308=>833,1309=>656, +1310=>664,1311=>491,1425=>0,1426=>0,1427=>0,1428=>0,1429=>0,1430=>0,1431=>418,1432=>0, +1433=>0,1434=>0,1435=>0,1436=>0,1437=>0,1438=>0,1439=>0,1440=>0,1441=>0,1442=>0, +1443=>0,1444=>0,1445=>0,1446=>0,1447=>0,1448=>0,1449=>0,1450=>0,1451=>0,1452=>0, +1453=>0,1454=>0,1455=>0,1456=>0,1457=>0,1458=>0,1459=>0,1460=>0,1461=>0,1462=>0, +1463=>0,1464=>0,1465=>0,1466=>0,1467=>0,1468=>0,1469=>0,1470=>440,1471=>0,1472=>126, +1473=>0,1474=>0,1475=>418,1476=>0,1477=>0,1478=>350,1479=>0,1488=>537,1489=>537,1490=>350, +1491=>537,1492=>537,1493=>350,1494=>350,1495=>537,1496=>537,1497=>350,1498=>537,1499=>537,1500=>537, +1501=>537,1502=>537,1503=>350,1504=>350,1505=>537,1506=>537,1507=>537,1508=>537,1509=>537,1510=>537, +1511=>537,1512=>537,1513=>537,1514=>537,1520=>537,1521=>537,1522=>537,1523=>396,1524=>396,2404=>318, +2405=>446,2433=>0,2434=>300,2435=>312,2437=>594,2438=>776,2439=>469,2440=>513,2441=>535,2442=>561, +2443=>604,2444=>481,2447=>580,2448=>604,2451=>540,2452=>620,2453=>570,2454=>485,2455=>484,2456=>471, +2457=>457,2458=>408,2459=>452,2460=>591,2461=>551,2462=>771,2463=>414,2464=>404,2465=>522,2466=>415, +2467=>450,2468=>551,2469=>477,2470=>478,2471=>449,2472=>448,2474=>535,2475=>611,2476=>443,2477=>534, +2478=>492,2479=>474,2480=>442,2482=>542,2486=>507,2487=>467,2488=>523,2489=>419,2492=>0,2493=>419, +2494=>202,2495=>189,2496=>202,2497=>0,2498=>0,2499=>0,2500=>0,2503=>294,2504=>289,2507=>774, +2508=>825,2509=>0,2510=>356,2519=>219,2524=>523,2525=>420,2527=>469,2528=>604,2529=>481,2530=>0, +2531=>0,2534=>500,2535=>437,2536=>479,2537=>507,2538=>497,2539=>500,2540=>482,2541=>503,2542=>517, +2543=>481,2544=>443,2545=>443,2546=>429,2547=>383,2548=>432,2549=>478,2550=>539,2551=>158,2552=>365, +2553=>280,2554=>357,3585=>512,3586=>453,3587=>512,3588=>519,3589=>529,3590=>561,3591=>411,3592=>437, +3593=>552,3594=>452,3595=>509,3596=>707,3597=>707,3598=>574,3599=>570,3600=>406,3601=>607,3602=>686, +3603=>749,3604=>494,3605=>497,3606=>509,3607=>552,3608=>461,3609=>565,3610=>527,3611=>523,3612=>556, +3613=>551,3614=>570,3615=>570,3616=>571,3617=>531,3618=>493,3619=>433,3620=>513,3621=>491,3622=>571, +3623=>439,3624=>510,3625=>594,3626=>484,3627=>554,3628=>616,3629=>493,3630=>496,3631=>417,3632=>392, +3633=>0,3634=>366,3635=>366,3636=>0,3637=>0,3638=>0,3639=>0,3640=>0,3641=>0,3642=>0, +3647=>662,3648=>297,3649=>544,3650=>298,3651=>329,3652=>328,3653=>326,3654=>488,3655=>0,3656=>0, +3657=>0,3658=>0,3659=>0,3660=>0,3661=>0,3662=>0,3663=>725,3664=>624,3665=>624,3666=>624, +3667=>624,3668=>624,3669=>624,3670=>624,3671=>624,3672=>624,3673=>624,3674=>645,3675=>872,4256=>453, +4257=>448,4258=>546,4259=>619,4260=>478,4261=>481,4262=>459,4263=>707,4264=>467,4265=>471,4266=>842, +4267=>464,4268=>443,4269=>707,4270=>460,4271=>465,4272=>686,4273=>440,4274=>550,4275=>561,4276=>580, +4277=>467,4278=>630,4279=>466,4280=>517,4281=>456,4282=>502,4283=>464,4284=>534,4285=>440,4286=>443, +4287=>522,4288=>460,4289=>463,4290=>536,4291=>455,4292=>468,4293=>449,4304=>454,4305=>452,4306=>544, +4307=>629,4308=>451,4309=>452,4310=>452,4311=>702,4312=>451,4313=>452,4314=>820,4315=>451,4316=>453, +4317=>695,4318=>449,4319=>448,4320=>694,4321=>501,4322=>544,4323=>517,4324=>560,4325=>450,4326=>627, +4327=>452,4328=>491,4329=>452,4330=>485,4331=>452,4332=>485,4333=>443,4334=>500,4335=>582,4336=>455, +4337=>451,4338=>480,4339=>414,4340=>453,4341=>418,4345=>544,4347=>410,5024=>711,5025=>678,5026=>604, +5027=>667,5028=>796,5029=>301,5030=>516,5031=>544,5032=>457,5033=>716,5034=>703,5035=>383,5036=>628, +5037=>709,5038=>455,5039=>601,5040=>472,5041=>574,5042=>730,5043=>939,5044=>498,5045=>528,5046=>667, +5047=>891,5048=>505,5049=>792,5050=>957,5051=>725,5052=>595,5053=>733,5054=>698,5055=>638,5056=>720, +5057=>732,5058=>624,5059=>638,5060=>565,5061=>903,5062=>655,5063=>681,5064=>675,5065=>949,5066=>683, +5067=>547,5068=>693,5069=>732,5070=>529,5071=>569,5072=>536,5073=>677,5074=>631,5075=>382,5076=>973, +5077=>543,5078=>607,5079=>652,5080=>652,5081=>693,5082=>514,5083=>803,5084=>658,5085=>597,5086=>627, +5087=>659,5088=>679,5089=>706,5090=>563,5091=>618,5092=>767,5093=>776,5094=>731,5095=>492,5096=>808, +5097=>823,5098=>796,5099=>689,5100=>716,5101=>518,5102=>521,5103=>719,5104=>563,5105=>776,5106=>634, +5107=>822,5108=>621,7680=>611,7681=>500,7682=>611,7683=>500,7684=>611,7685=>500,7686=>611,7687=>500, +7688=>667,7689=>444,7690=>722,7691=>500,7692=>722,7693=>500,7694=>722,7695=>500,7696=>722,7697=>500, +7698=>722,7699=>500,7700=>611,7701=>444,7702=>611,7703=>444,7704=>604,7705=>444,7706=>604,7707=>444, +7708=>604,7709=>444,7710=>611,7711=>278,7712=>722,7713=>500,7714=>722,7715=>500,7716=>722,7717=>500, +7718=>722,7719=>500,7720=>722,7721=>500,7722=>722,7723=>500,7724=>339,7725=>278,7726=>333,7727=>278, +7728=>652,7729=>444,7730=>652,7731=>444,7732=>652,7733=>444,7734=>556,7735=>278,7736=>556,7737=>278, +7738=>556,7739=>278,7740=>556,7741=>278,7742=>828,7743=>722,7744=>828,7745=>722,7746=>828,7747=>722, +7748=>657,7749=>500,7750=>657,7751=>500,7752=>657,7753=>500,7754=>657,7755=>500,7756=>722,7757=>500, +7758=>722,7759=>500,7760=>722,7761=>500,7762=>722,7763=>500,7764=>603,7765=>500,7766=>603,7767=>500, +7768=>616,7769=>389,7770=>616,7771=>389,7772=>616,7773=>389,7774=>616,7775=>389,7776=>500,7777=>389, +7778=>500,7779=>389,7780=>500,7781=>389,7782=>500,7783=>389,7784=>500,7785=>389,7786=>556,7787=>278, +7788=>556,7789=>278,7790=>556,7791=>278,7792=>556,7793=>278,7794=>722,7795=>500,7796=>722,7797=>500, +7798=>722,7799=>500,7800=>722,7801=>500,7802=>722,7803=>500,7804=>611,7805=>444,7806=>611,7807=>444, +7808=>833,7809=>667,7810=>833,7811=>667,7812=>833,7813=>667,7814=>833,7815=>667,7816=>833,7817=>667, +7818=>611,7819=>444,7820=>611,7821=>444,7822=>556,7823=>444,7824=>556,7825=>389,7826=>556,7827=>389, +7828=>556,7829=>389,7830=>500,7831=>278,7832=>667,7833=>444,7834=>444,7835=>278,7840=>611,7841=>500, +7842=>611,7843=>500,7844=>611,7845=>500,7846=>611,7847=>500,7848=>611,7849=>500,7850=>611,7851=>500, +7852=>611,7853=>500,7854=>611,7855=>500,7856=>611,7857=>500,7858=>611,7859=>500,7860=>611,7861=>500, +7862=>611,7863=>500,7864=>604,7865=>444,7866=>604,7867=>444,7868=>604,7869=>444,7870=>611,7871=>444, +7872=>611,7873=>444,7874=>611,7875=>444,7876=>611,7877=>444,7878=>604,7879=>444,7880=>339,7881=>278, +7882=>339,7883=>278,7884=>722,7885=>500,7886=>722,7887=>500,7888=>722,7889=>500,7890=>722,7891=>500, +7892=>722,7893=>500,7894=>722,7895=>500,7896=>722,7897=>500,7898=>932,7899=>608,7900=>932,7901=>608, +7902=>807,7903=>585,7904=>932,7905=>608,7906=>932,7907=>608,7908=>722,7909=>500,7910=>722,7911=>500, +7912=>948,7913=>721,7914=>948,7915=>721,7916=>807,7917=>585,7918=>948,7919=>721,7920=>948,7921=>721, +7922=>556,7923=>444,7924=>556,7925=>444,7926=>556,7927=>444,7928=>556,7929=>444,7936=>564,7937=>564, +7938=>564,7939=>564,7940=>564,7941=>564,7942=>564,7943=>564,7944=>661,7945=>661,7946=>794,7947=>811, +7948=>792,7949=>803,7950=>661,7951=>648,7952=>416,7953=>416,7954=>416,7955=>416,7956=>416,7957=>416, +7960=>740,7961=>795,7962=>923,7963=>940,7964=>996,7965=>986,7968=>506,7969=>506,7970=>506,7971=>506, +7972=>506,7973=>506,7974=>506,7975=>506,7976=>879,7977=>901,7978=>1036,7979=>1035,7980=>1099,7981=>1100, +7982=>954,7983=>959,7984=>270,7985=>270,7986=>267,7987=>267,7988=>267,7989=>267,7990=>267,7991=>267, +7992=>490,7993=>529,7994=>655,7995=>654,7996=>705,7997=>713,7998=>570,7999=>573,8000=>558,8001=>510, +8002=>510,8003=>510,8004=>510,8005=>510,8008=>797,8009=>867,8010=>1026,8011=>1022,8012=>993,8013=>1017, +8016=>504,8017=>504,8018=>504,8019=>504,8020=>504,8021=>504,8022=>504,8023=>504,8025=>916,8027=>1062, +8029=>1100,8031=>933,8032=>693,8033=>693,8034=>693,8035=>693,8036=>693,8037=>693,8038=>693,8039=>693, +8040=>852,8041=>909,8042=>1072,8043=>1072,8044=>1032,8045=>1047,8046=>930,8047=>946,8048=>564,8049=>564, +8050=>416,8051=>416,8052=>506,8053=>506,8054=>270,8055=>270,8056=>510,8057=>510,8058=>504,8059=>504, +8060=>693,8061=>693,8064=>564,8065=>564,8066=>564,8067=>564,8068=>564,8069=>564,8070=>564,8071=>564, +8072=>821,8073=>854,8074=>998,8075=>1011,8076=>992,8077=>1001,8078=>866,8079=>858,8080=>506,8081=>506, +8082=>506,8083=>506,8084=>506,8085=>506,8086=>506,8087=>506,8088=>999,8089=>1044,8090=>1179,8091=>1165, +8092=>1227,8093=>1229,8094=>1080,8095=>1085,8096=>693,8097=>693,8098=>693,8099=>693,8100=>693,8101=>693, +8102=>693,8103=>693,8104=>1037,8105=>1113,8106=>1264,8107=>1264,8108=>1219,8109=>1241,8110=>1120,8111=>1132, +8112=>564,8113=>564,8114=>564,8115=>564,8116=>564,8118=>564,8119=>564,8120=>661,8121=>661,8122=>661, +8123=>661,8124=>831,8125=>192,8126=>332,8127=>500,8128=>500,8129=>534,8130=>506,8131=>506,8132=>506, +8134=>506,8135=>506,8136=>611,8137=>816,8138=>889,8139=>908,8140=>881,8141=>500,8142=>500,8143=>500, +8144=>270,8145=>270,8146=>270,8147=>270,8150=>270,8151=>270,8152=>333,8153=>333,8154=>497,8155=>521, +8157=>500,8158=>500,8159=>500,8160=>504,8161=>504,8162=>504,8163=>504,8164=>506,8165=>506,8166=>504, +8167=>504,8168=>676,8169=>676,8170=>905,8171=>901,8172=>783,8173=>333,8174=>333,8175=>500,8178=>693, +8179=>693,8180=>693,8182=>693,8183=>693,8184=>907,8185=>833,8186=>963,8187=>875,8188=>952,8189=>500, +8190=>500,8192=>500,8193=>1000,8194=>500,8195=>1000,8196=>333,8197=>250,8198=>167,8199=>500,8200=>250, +8201=>200,8202=>100,8203=>0,8204=>0,8205=>0,8206=>0,8207=>0,8208=>333,8209=>333,8210=>500, +8213=>1000,8214=>293,8215=>465,8219=>250,8223=>444,8227=>350,8228=>250,8229=>500,8231=>250,8232=>0, +8233=>0,8234=>0,8235=>0,8236=>0,8237=>0,8238=>0,8239=>250,8241=>1601,8242=>247,8243=>411, +8244=>611,8245=>220,8246=>440,8247=>660,8248=>469,8251=>629,8252=>666,8253=>500,8254=>500,8255=>953, +8256=>1000,8257=>314,8258=>931,8259=>333,8260=>167,8261=>480,8262=>480,8263=>1000,8264=>833,8265=>833, +8266=>500,8267=>453,8268=>453,8269=>450,8270=>500,8271=>278,8272=>882,8273=>500,8274=>497,8275=>500, +8276=>953,8277=>512,8278=>410,8279=>855,8280=>620,8281=>620,8282=>179,8283=>621,8284=>564,8285=>179, +8286=>179,8287=>111,8288=>0,8289=>0,8290=>0,8291=>0,8292=>0,8304=>300,8305=>235,8308=>300, +8309=>300,8310=>300,8311=>300,8312=>300,8313=>300,8314=>300,8315=>300,8316=>300,8317=>216,8318=>216, +8319=>318,8320=>300,8321=>250,8322=>300,8323=>300,8324=>300,8325=>300,8326=>300,8327=>300,8328=>300, +8329=>300,8330=>300,8331=>300,8332=>300,8333=>216,8334=>216,8352=>698,8353=>667,8354=>667,8355=>611, +8356=>500,8357=>722,8358=>667,8359=>988,8360=>953,8361=>833,8362=>869,8363=>512,8365=>722,8366=>611, +8369=>589,8370=>619,8371=>722,8372=>556,8373=>611,8400=>0,8401=>0,8402=>0,8403=>0,8404=>0, +8405=>0,8406=>0,8407=>0,8408=>0,8409=>0,8410=>0,8411=>0,8412=>0,8413=>0,8414=>0, +8415=>0,8416=>0,8417=>0,8418=>0,8419=>0,8420=>0,8421=>0,8422=>0,8423=>0,8424=>0, +8425=>0,8426=>0,8427=>0,8428=>0,8429=>0,8430=>0,8431=>0,8432=>0,8448=>664,8449=>665, +8451=>954,8453=>693,8454=>787,8457=>822,8462=>500,8463=>500,8468=>777,8470=>823,8471=>760,8478=>616, +8479=>610,8480=>879,8481=>1156,8483=>611,8486=>743,8487=>743,8489=>286,8490=>722,8491=>722,8494=>533, +8498=>556,8501=>537,8502=>537,8503=>350,8504=>537,8506=>906,8507=>1155,8523=>778,8525=>856,8526=>500, +8531=>750,8532=>750,8533=>750,8534=>750,8535=>750,8536=>750,8537=>750,8538=>750,8539=>750,8540=>750, +8541=>750,8542=>750,8543=>750,8544=>339,8545=>678,8546=>1017,8547=>950,8548=>611,8549=>950,8550=>1289, +8551=>1628,8552=>950,8553=>611,8554=>950,8555=>1289,8556=>556,8557=>667,8558=>722,8559=>828,8560=>278, +8561=>556,8562=>834,8563=>722,8564=>444,8565=>722,8566=>1000,8567=>1278,8568=>722,8569=>444,8570=>722, +8571=>1000,8572=>278,8573=>444,8574=>500,8575=>722,8592=>964,8593=>499,8594=>964,8595=>499,8706=>494, +8710=>612,8721=>713,8722=>675,8723=>675,8725=>750,8730=>549,8734=>677,8747=>416,8748=>750,8749=>1083, +8750=>722,8751=>750,8800=>564,8804=>675,8805=>675,8992=>686,8993=>686,9251=>500,9674=>494,9676=>791, +9824=>626,9825=>694,9826=>595,9827=>776,9828=>626,9829=>694,9830=>595,9831=>776,9833=>333,9834=>555, +9835=>722,9836=>722,9837=>415,9838=>377,9839=>402,11799=>333,64256=>526,64257=>500,64258=>500,64259=>747, +64260=>748,64262=>665,64285=>350,64286=>0,64287=>537,64288=>537,64297=>564,64298=>537,64299=>537,64300=>537, +64301=>537,64302=>537,64303=>537,64304=>537,64305=>537,64306=>350,64307=>537,64308=>537,64309=>350,64310=>350, +64312=>537,64313=>350,64314=>537,64315=>537,64316=>537,64318=>537,64320=>350,64321=>537,64323=>537,64324=>537, +64326=>537,64327=>537,64328=>537,64329=>537,64330=>537,64331=>350,64332=>537,64333=>537,64334=>537,64335=>537, +65533=>788); +$enc=''; +$diff=''; +$file='freeserifi.z'; +$ctg='freeserifi.ctg.z'; +$originalsize=629968; +?> \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifi.z b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifi.z new file mode 100644 index 0000000..c191bde Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/freeserifi.z differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/helvetica.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/helvetica.php new file mode 100644 index 0000000..09ddd5d --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/helvetica.php @@ -0,0 +1,33 @@ +<?php + // core font definition file for TCPDF (www.tcpdf.org) +$type='core'; +$dw=556; +$cw=array(0=>278,1=>278,2=>278,3=>278,4=>278,5=>278,6=>278,7=>278,8=>278,9=>278, +10=>278,11=>278,12=>278,13=>278,14=>278,15=>278,16=>278,17=>278,18=>278,19=>278, +20=>278,21=>278,22=>278,23=>278,24=>278,25=>278,26=>278,27=>278,28=>278,29=>278, +30=>278,31=>278,32=>278,33=>278,34=>355,35=>556,36=>556,37=>889,38=>667,39=>191, +40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556, +50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>278,59=>278, +60=>584,61=>584,62=>584,63=>556,64=>1015,65=>667,66=>667,67=>722,68=>722,69=>667, +70=>611,71=>778,72=>722,73=>278,74=>500,75=>667,76=>556,77=>833,78=>722,79=>778, +80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667, +90=>611,91=>278,92=>278,93=>278,94=>469,95=>556,96=>333,97=>556,98=>556,99=>500, +100=>556,101=>556,102=>278,103=>556,104=>556,105=>222,106=>222,107=>500,108=>222, +109=>833,110=>556,111=>556,112=>556,113=>556,114=>333,115=>500,116=>278,117=>556, +118=>500,119=>722,120=>500,121=>500,122=>500,123=>334,124=>260,125=>334,126=>584, +127=>350,128=>556,129=>350,130=>222,131=>556,132=>333,133=>1000,134=>556,135=>556, +136=>333,137=>1000,138=>667,139=>333,140=>1000,141=>350,142=>611,143=>350,144=>350, +145=>222,146=>222,147=>333,148=>333,149=>350,150=>556,151=>1000,152=>333,153=>1000, +154=>500,155=>333,156=>944,157=>350,158=>500,159=>667,160=>278,161=>333,162=>556, +163=>556,164=>556,165=>556,166=>260,167=>556,168=>333,169=>737,170=>370,171=>556, +172=>584,173=>333,174=>737,175=>333,176=>400,177=>584,178=>333,179=>333,180=>333, +181=>556,182=>537,183=>278,184=>333,185=>333,186=>365,187=>556,188=>834,189=>834, +190=>834,191=>611,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667,198=>1000, +199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278, +208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778, +217=>722,218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556, +226=>556,227=>556,228=>556,229=>556,230=>889,231=>500,232=>556,233=>556,234=>556, +235=>556,236=>278,237=>278,238=>278,239=>278,240=>556,241=>556,242=>556,243=>556, +244=>556,245=>556,246=>556,247=>584,248=>611,249=>556,250=>556,251=>556,252=>556, +253=>500,254=>556,255=>500); +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/helveticab.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/helveticab.php new file mode 100644 index 0000000..0a8565a --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/helveticab.php @@ -0,0 +1,33 @@ +<?php + // core font definition file for TCPDF (www.tcpdf.org) +$type='core'; +$dw=556; +$cw=array(0=>278,1=>278,2=>278,3=>278,4=>278,5=>278,6=>278,7=>278,8=>278,9=>278, +10=>278,11=>278,12=>278,13=>278,14=>278,15=>278,16=>278,17=>278,18=>278,19=>278, +20=>278,21=>278,22=>278,23=>278,24=>278,25=>278,26=>278,27=>278,28=>278,29=>278, +30=>278,31=>278,32=>278,33=>333,34=>474,35=>556,36=>556,37=>889,38=>722,39=>238, +40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556, +50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>333,59=>333, +60=>584,61=>584,62=>584,63=>611,64=>975,65=>722,66=>722,67=>722,68=>722,69=>667, +70=>611,71=>778,72=>722,73=>278,74=>556,75=>722,76=>611,77=>833,78=>722,79=>778, +80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667, +90=>611,91=>333,92=>278,93=>333,94=>584,95=>556,96=>333,97=>556,98=>611,99=>556, +100=>611,101=>556,102=>333,103=>611,104=>611,105=>278,106=>278,107=>556,108=>278, +109=>889,110=>611,111=>611,112=>611,113=>611,114=>389,115=>556,116=>333,117=>611, +118=>556,119=>778,120=>556,121=>556,122=>500,123=>389,124=>280,125=>389,126=>584, +127=>350,128=>556,129=>350,130=>278,131=>556,132=>500,133=>1000,134=>556,135=>556, +136=>333,137=>1000,138=>667,139=>333,140=>1000,141=>350,142=>611,143=>350,144=>350, +145=>278,146=>278,147=>500,148=>500,149=>350,150=>556,151=>1000,152=>333,153=>1000, +154=>556,155=>333,156=>944,157=>350,158=>500,159=>667,160=>278,161=>333,162=>556, +163=>556,164=>556,165=>556,166=>280,167=>556,168=>333,169=>737,170=>370,171=>556, +172=>584,173=>333,174=>737,175=>333,176=>400,177=>584,178=>333,179=>333,180=>333, +181=>611,182=>556,183=>278,184=>333,185=>333,186=>365,187=>556,188=>834,189=>834, +190=>834,191=>611,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722,198=>1000, +199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278, +208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778, +217=>722,218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556, +226=>556,227=>556,228=>556,229=>556,230=>889,231=>556,232=>556,233=>556,234=>556, +235=>556,236=>278,237=>278,238=>278,239=>278,240=>611,241=>611,242=>611,243=>611, +244=>611,245=>611,246=>611,247=>584,248=>611,249=>611,250=>611,251=>611,252=>611, +253=>556,254=>611,255=>556); +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/helveticabi.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/helveticabi.php new file mode 100644 index 0000000..0a8565a --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/helveticabi.php @@ -0,0 +1,33 @@ +<?php + // core font definition file for TCPDF (www.tcpdf.org) +$type='core'; +$dw=556; +$cw=array(0=>278,1=>278,2=>278,3=>278,4=>278,5=>278,6=>278,7=>278,8=>278,9=>278, +10=>278,11=>278,12=>278,13=>278,14=>278,15=>278,16=>278,17=>278,18=>278,19=>278, +20=>278,21=>278,22=>278,23=>278,24=>278,25=>278,26=>278,27=>278,28=>278,29=>278, +30=>278,31=>278,32=>278,33=>333,34=>474,35=>556,36=>556,37=>889,38=>722,39=>238, +40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556, +50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>333,59=>333, +60=>584,61=>584,62=>584,63=>611,64=>975,65=>722,66=>722,67=>722,68=>722,69=>667, +70=>611,71=>778,72=>722,73=>278,74=>556,75=>722,76=>611,77=>833,78=>722,79=>778, +80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667, +90=>611,91=>333,92=>278,93=>333,94=>584,95=>556,96=>333,97=>556,98=>611,99=>556, +100=>611,101=>556,102=>333,103=>611,104=>611,105=>278,106=>278,107=>556,108=>278, +109=>889,110=>611,111=>611,112=>611,113=>611,114=>389,115=>556,116=>333,117=>611, +118=>556,119=>778,120=>556,121=>556,122=>500,123=>389,124=>280,125=>389,126=>584, +127=>350,128=>556,129=>350,130=>278,131=>556,132=>500,133=>1000,134=>556,135=>556, +136=>333,137=>1000,138=>667,139=>333,140=>1000,141=>350,142=>611,143=>350,144=>350, +145=>278,146=>278,147=>500,148=>500,149=>350,150=>556,151=>1000,152=>333,153=>1000, +154=>556,155=>333,156=>944,157=>350,158=>500,159=>667,160=>278,161=>333,162=>556, +163=>556,164=>556,165=>556,166=>280,167=>556,168=>333,169=>737,170=>370,171=>556, +172=>584,173=>333,174=>737,175=>333,176=>400,177=>584,178=>333,179=>333,180=>333, +181=>611,182=>556,183=>278,184=>333,185=>333,186=>365,187=>556,188=>834,189=>834, +190=>834,191=>611,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722,198=>1000, +199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278, +208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778, +217=>722,218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556, +226=>556,227=>556,228=>556,229=>556,230=>889,231=>556,232=>556,233=>556,234=>556, +235=>556,236=>278,237=>278,238=>278,239=>278,240=>611,241=>611,242=>611,243=>611, +244=>611,245=>611,246=>611,247=>584,248=>611,249=>611,250=>611,251=>611,252=>611, +253=>556,254=>611,255=>556); +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/helveticai.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/helveticai.php new file mode 100644 index 0000000..09ddd5d --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/helveticai.php @@ -0,0 +1,33 @@ +<?php + // core font definition file for TCPDF (www.tcpdf.org) +$type='core'; +$dw=556; +$cw=array(0=>278,1=>278,2=>278,3=>278,4=>278,5=>278,6=>278,7=>278,8=>278,9=>278, +10=>278,11=>278,12=>278,13=>278,14=>278,15=>278,16=>278,17=>278,18=>278,19=>278, +20=>278,21=>278,22=>278,23=>278,24=>278,25=>278,26=>278,27=>278,28=>278,29=>278, +30=>278,31=>278,32=>278,33=>278,34=>355,35=>556,36=>556,37=>889,38=>667,39=>191, +40=>333,41=>333,42=>389,43=>584,44=>278,45=>333,46=>278,47=>278,48=>556,49=>556, +50=>556,51=>556,52=>556,53=>556,54=>556,55=>556,56=>556,57=>556,58=>278,59=>278, +60=>584,61=>584,62=>584,63=>556,64=>1015,65=>667,66=>667,67=>722,68=>722,69=>667, +70=>611,71=>778,72=>722,73=>278,74=>500,75=>667,76=>556,77=>833,78=>722,79=>778, +80=>667,81=>778,82=>722,83=>667,84=>611,85=>722,86=>667,87=>944,88=>667,89=>667, +90=>611,91=>278,92=>278,93=>278,94=>469,95=>556,96=>333,97=>556,98=>556,99=>500, +100=>556,101=>556,102=>278,103=>556,104=>556,105=>222,106=>222,107=>500,108=>222, +109=>833,110=>556,111=>556,112=>556,113=>556,114=>333,115=>500,116=>278,117=>556, +118=>500,119=>722,120=>500,121=>500,122=>500,123=>334,124=>260,125=>334,126=>584, +127=>350,128=>556,129=>350,130=>222,131=>556,132=>333,133=>1000,134=>556,135=>556, +136=>333,137=>1000,138=>667,139=>333,140=>1000,141=>350,142=>611,143=>350,144=>350, +145=>222,146=>222,147=>333,148=>333,149=>350,150=>556,151=>1000,152=>333,153=>1000, +154=>500,155=>333,156=>944,157=>350,158=>500,159=>667,160=>278,161=>333,162=>556, +163=>556,164=>556,165=>556,166=>260,167=>556,168=>333,169=>737,170=>370,171=>556, +172=>584,173=>333,174=>737,175=>333,176=>400,177=>584,178=>333,179=>333,180=>333, +181=>556,182=>537,183=>278,184=>333,185=>333,186=>365,187=>556,188=>834,189=>834, +190=>834,191=>611,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667,198=>1000, +199=>722,200=>667,201=>667,202=>667,203=>667,204=>278,205=>278,206=>278,207=>278, +208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>584,216=>778, +217=>722,218=>722,219=>722,220=>722,221=>667,222=>667,223=>611,224=>556,225=>556, +226=>556,227=>556,228=>556,229=>556,230=>889,231=>500,232=>556,233=>556,234=>556, +235=>556,236=>278,237=>278,238=>278,239=>278,240=>556,241=>556,242=>556,243=>556, +244=>556,245=>556,246=>556,247=>584,248=>611,249=>556,250=>556,251=>556,252=>556, +253=>500,254=>556,255=>500); +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/hysmyeongjostdmedium.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/hysmyeongjostdmedium.php new file mode 100644 index 0000000..2787113 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/hysmyeongjostdmedium.php @@ -0,0 +1,48 @@ +<?php +$type='cidfont0'; +$name='HYSMyeongJoStd-Medium-Acro'; // AdobeMyungjoStd-Medium-Acro in acrobat 6 +$displayname = 'MyungJo Medium (Korean)'; +$desc = array( + 'Ascent' => 880, + 'Descent' => -120, + 'CapHeight' => 720, + 'Flags' => 6, + 'FontBBox' => '[-28 -148 1001 880]', + 'ItalicAngle' => 0, + 'StemV' => 60, + 'Style' => '<< /Panose <000000000600000000000000> >>', +); +$cidinfo = array( + 'Registry' => 'Adobe', + 'Ordering' => 'Korea1', + 'Supplement' => '1', +); +$enc = 'UniKS-UCS2-H'; + +// underline position, needs checking: +$up = -130; +$ut = 40; + +$dw = 1000; +$cw = array( + 32 => 333, 33 => 416, 34 => 416, 35 => 833, 36 => 625, 37 => 916, 38 => 833, 39 => 250, 40 => 500, 41 => 500, + 42 => 500, 43 => 833, 44 => 291, 45 => 450, 46 => 291, 47 => 375, 48 => 625, 49 => 625, 50 => 625, 51 => 625, + 52 => 625, 53 => 625, 54 => 625, 55 => 625, 56 => 625, 57 => 625, 58 => 333, 59 => 333, 60 => 833, 61 => 833, + 62 => 916, 63 => 500, 64 => 1000, 65 => 791, 66 => 708, 67 => 708, 68 => 750, 69 => 708, 70 => 666, 71 => 750, + 72 => 791, 73 => 375, 74 => 500, 75 => 791, 76 => 666, 77 => 916, 78 => 791, 79 => 750, 80 => 666, 81 => 750, + 82 => 708, 83 => 666, 84 => 791, 85 => 791, 86 => 750, 87 => 1000, 88 => 708, 89 => 708, 90 => 666, 91 => 500, + 92 => 375, 93 => 500, 94 => 500, 95 => 500, 96 => 333, 97 => 541, 98 => 583, 99 => 541, 100 => 583, 101 => 583, + 102 => 375, 103 => 583, 104 => 583, 105 => 291, 106 => 333, 107 => 583, 108 => 291, 109 => 875, 110 => 583, 111 => 583, + 112 => 583, 113 => 583, 114 => 458, 115 => 541, 116 => 375, 117 => 583, 118 => 583, 119 => 833, 120 => 625, 121 => 625, + 122 => 500, 123 => 583, 124 => 583, 125 => 583, 126 => 750, +); +$_cr = array( + //array(97, 97, 500), + array(8094, 8190, 500) +); +foreach($_cr as $_r) { + for($i = $_r[0]; $i <= $_r[1]; $i++) { + $cw[$i+31] = $_r[2]; + } +} +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/kozgopromedium.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/kozgopromedium.php new file mode 100644 index 0000000..59f21c0 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/kozgopromedium.php @@ -0,0 +1,65 @@ +<?php +$type = 'cidfont0'; +$name = 'KozGoPro-Medium-Acro'; +$displayname = 'Kozuka Gothic Pro (Japanese Sans-Serif)'; +$desc = array( + 'Ascent' => 880, + 'Descent' => -120, + 'CapHeight' => 763, + 'Flags' => 4, + 'FontBBox' => '[-149 -374 1254 1008]', + 'ItalicAngle' => 0, + 'StemV' => 99, + 'Style' => '<< /Panose <0000020b0700000000000000> >>', + 'XHeight' => 549, +); +$cidinfo = array( + 'Registry' => 'Adobe', + 'Ordering' => 'Japan1', + 'Supplement' => '4', +); +$enc = 'UniJIS-UCS2-H'; + +// underline position, needs checking: +$up = -75; +$ut = 50; + +$dw = 1000; +$cw = array( + 32 => 224, 33 => 266, 34 => 392, 35 => 551, 36 => 562, 37 => 883, 38 => 677, 39 => 213, 40 => 322, 41 => 322, + 42 => 470, 43 => 677, 44 => 247, 45 => 343, 46 => 245, 47 => 370, 48 => 562, 49 => 562, 50 => 562, 51 => 562, + 52 => 562, 53 => 562, 54 => 562, 55 => 562, 56 => 562, 57 => 562, 58 => 245, 59 => 247, 60 => 677, 61 => 677, + 62 => 677, 63 => 447, 64 => 808, 65 => 661, 66 => 602, 67 => 610, 68 => 708, 69 => 535, 70 => 528, 71 => 689, + 72 => 703, 73 => 275, 74 => 404, 75 => 602, 76 => 514, 77 => 871, 78 => 708, 79 => 727, 80 => 585, 81 => 727, + 82 => 595, 83 => 539, 84 => 541, 85 => 696, 86 => 619, 87 => 922, 88 => 612, 89 => 591, 90 => 584, 91 => 322, + 92 => 562, 93 => 322, 94 => 677, 95 => 568, 96 => 340, 97 => 532, 98 => 612, 99 => 475, 100 => 608, 101 => 543, + 102 => 332, 103 => 603, 104 => 601, 105 => 265, 106 => 276, 107 => 524, 108 => 264, 109 => 901, 110 => 601, 111 => 590, + 112 => 612, 113 => 607, 114 => 367, 115 => 433, 116 => 369, 117 => 597, 118 => 527, 119 => 800, 120 => 511, 121 => 518, + 122 => 468, 123 => 321, 124 => 273, 125 => 321, 126 => 341, 127 => 241, 128 => 362, 129 => 241, 130 => 273, 131 => 677, + 132 => 266, 133 => 562, 134 => 562, 135 => 456, 136 => 562, 137 => 571, 138 => 562, 139 => 416, 140 => 472, 141 => 283, + 142 => 283, 143 => 587, 144 => 588, 145 => 568, 146 => 545, 147 => 545, 148 => 247, 149 => 561, 150 => 330, 151 => 239, + 152 => 418, 153 => 416, 154 => 472, 155 => 1136, 156 => 1288, 157 => 447, 158 => 340, 159 => 340, 160 => 340, 161 => 340, + 162 => 340, 163 => 340, 164 => 455, 165 => 340, 166 => 340, 167 => 340, 168 => 340, 169 => 1136, 170 => 857, 171 => 384, + 172 => 519, 173 => 727, 174 => 952, 175 => 398, 176 => 834, 177 => 264, 178 => 275, 179 => 590, 180 => 918, 181 => 605, + 182 => 677, 183 => 769, 184 => 677, 185 => 473, 186 => 361, 187 => 677, 188 => 347, 189 => 340, 190 => 599, 191 => 284, + 192 => 845, 193 => 845, 194 => 845, 195 => 661, 196 => 661, 197 => 661, 198 => 661, 199 => 661, 200 => 661, 201 => 610, + 202 => 535, 203 => 535, 204 => 535, 205 => 535, 206 => 275, 207 => 275, 208 => 275, 209 => 275, 210 => 715, 211 => 708, + 212 => 727, 213 => 727, 214 => 727, 215 => 727, 216 => 727, 217 => 677, 218 => 696, 219 => 696, 220 => 696, 221 => 696, + 222 => 591, 223 => 584, 224 => 532, 225 => 532, 226 => 532, 227 => 532, 228 => 532, 229 => 532, 230 => 475, 231 => 543, + 232 => 543, 233 => 543, 234 => 543, 235 => 264, 236 => 264, 237 => 264, 238 => 264, 239 => 584, 240 => 601, 241 => 590, + 242 => 590, 243 => 590, 244 => 590, 245 => 590, 246 => 677, 247 => 597, 248 => 597, 249 => 597, 250 => 597, 251 => 518, + 252 => 612, 253 => 518, 254 => 539, 255 => 591, 256 => 584, 257 => 446, 258 => 433, 259 => 683, 260 => 468, 261 => 562, +); +$_cr = array( + array(231, 632, 500), // half-width + array(8718, 8718, 500), + array(9738, 9757, 250), // quarter-width + array(9758, 9778, 333), // third-width + array(12063, 12087, 500) +); +foreach($_cr as $_r) { + for($i = $_r[0]; $i <= $_r[1]; $i++) { + $cw[$i+31] = $_r[2]; + } +} +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/kozminproregular.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/kozminproregular.php new file mode 100644 index 0000000..25970a7 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/kozminproregular.php @@ -0,0 +1,63 @@ +<?php +$type = 'cidfont0'; +$name = 'KozMinPro-Regular-Acro'; +$displayname = 'Kozuka Mincho Pro (Japanese Serif)'; +$desc = array( + 'Ascent' => 880, + 'Descent' => -120, + 'CapHeight' => 740, + 'Flags' => 6, + 'FontBBox' => '[-195 -272 1110 1075]', + 'ItalicAngle' => 0, + 'StemV' => 86, + 'XHeight' => 502, +); +$cidinfo = array( + 'Registry' => 'Adobe', + 'Ordering' => 'Japan1', + 'Supplement' => '4', +); +$enc = 'UniJIS-UCS2-H'; + +$up = -75; +$ut = 50; + +$dw = 1000; +$cw = array( + 32 => 278, 33 => 299, 34 => 353, 35 => 614, 36 => 614, 37 => 721, 38 => 735, 39 => 216, 40 => 323, 41 => 323, + 42 => 449, 43 => 529, 44 => 219, 45 => 306, 46 => 219, 47 => 453, 48 => 614, 49 => 614, 50 => 614, 51 => 614, + 52 => 614, 53 => 614, 54 => 614, 55 => 614, 56 => 614, 57 => 614, 58 => 219, 59 => 219, 60 => 529, 61 => 529, + 62 => 529, 63 => 486, 64 => 744, 65 => 646, 66 => 604, 67 => 617, 68 => 681, 69 => 567, 70 => 537, 71 => 647, + 72 => 738, 73 => 320, 74 => 433, 75 => 637, 76 => 566, 77 => 904, 78 => 710, 79 => 716, 80 => 605, 81 => 716, + 82 => 623, 83 => 517, 84 => 601, 85 => 690, 86 => 668, 87 => 990, 88 => 681, 89 => 634, 90 => 578, 91 => 316, + 92 => 614, 93 => 316, 94 => 529, 95 => 500, 96 => 387, 97 => 509, 98 => 566, 99 => 478, 100 => 565, 101 => 503, + 102 => 337, 103 => 549, 104 => 580, 105 => 275, 106 => 266, 107 => 544, 108 => 276, 109 => 854, 110 => 579, 111 => 550, + 112 => 578, 113 => 566, 114 => 410, 115 => 444, 116 => 340, 117 => 575, 118 => 512, 119 => 760, 120 => 503, 121 => 529, + 122 => 453, 123 => 326, 124 => 380, 125 => 326, 126 => 387, 127 => 216, 128 => 453, 129 => 216, 130 => 380, 131 => 529, + 132 => 299, 133 => 614, 134 => 614, 135 => 265, 136 => 614, 137 => 475, 138 => 614, 139 => 353, 140 => 451, 141 => 291, + 142 => 291, 143 => 588, 144 => 589, 145 => 500, 146 => 476, 147 => 476, 148 => 219, 149 => 494, 150 => 452, 151 => 216, + 152 => 353, 153 => 353, 154 => 451, 156 => 1075, 157 => 486, 158 => 387, 159 => 387, 160 => 387, 161 => 387, + 162 => 387, 163 => 387, 164 => 387, 165 => 387, 166 => 387, 167 => 387, 168 => 387, 170 => 880, 171 => 448, + 172 => 566, 173 => 716, 174 => 903, 175 => 460, 176 => 805, 177 => 275, 178 => 276, 179 => 550, 180 => 886, 181 => 582, + 182 => 529, 183 => 738, 184 => 529, 185 => 738, 186 => 357, 187 => 529, 188 => 406, 189 => 406, 190 => 575, 191 => 406, + 192 => 934, 193 => 934, 194 => 934, 195 => 646, 196 => 646, 197 => 646, 198 => 646, 199 => 646, 200 => 646, 201 => 617, + 202 => 567, 203 => 567, 204 => 567, 205 => 567, 206 => 320, 207 => 320, 208 => 320, 209 => 320, 210 => 681, 211 => 710, + 212 => 716, 213 => 716, 214 => 716, 215 => 716, 216 => 716, 217 => 529, 218 => 690, 219 => 690, 220 => 690, 221 => 690, + 222 => 634, 223 => 605, 224 => 509, 225 => 509, 226 => 509, 227 => 509, 228 => 509, 229 => 509, 230 => 478, 231 => 503, + 232 => 503, 233 => 503, 234 => 503, 235 => 275, 236 => 275, 237 => 275, 238 => 275, 239 => 550, 240 => 579, 241 => 550, + 242 => 550, 243 => 550, 244 => 550, 245 => 550, 246 => 529, 247 => 575, 248 => 575, 249 => 575, 250 => 575, 251 => 529, + 252 => 578, 253 => 529, 254 => 517, 255 => 634, 256 => 578, 257 => 445, 258 => 444, 259 => 842, 260 => 453, 261 => 614, +); +$_cr = array( + array(231, 632, 500), // half-width + array(8718, 8718, 500), + array(9738, 9757, 250), // quarter-width + array(9758, 9778, 333), // third-width + array(12063, 12087, 500), +); +foreach($_cr as $_r) { + for($i = $_r[0]; $i <= $_r[1]; $i++) { + $cw[$i+31] = $_r[2]; + } +} +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/msungstdlight.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/msungstdlight.php new file mode 100644 index 0000000..cf97488 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/msungstdlight.php @@ -0,0 +1,38 @@ +<?php +$type = 'cidfont0'; +$name = 'MSungStd-Light-Acro'; +$displayname = 'MSung Light (Trad. Chinese)'; +$desc = array( + 'Ascent' => 880, + 'Descent' => -120, + 'CapHeight' => 880, + 'Flags' => 6, + 'FontBBox' => '[-160 -249 1015 1071]', + 'ItalicAngle' => 0, + 'StemV' => 93, +); +$cidinfo = array( + 'Registry' => 'Adobe', + 'Ordering' => 'CNS1', + 'Supplement' => '3', +); +$enc = 'UniCNS-UCS2-H'; + +$up = -130; +$ut = 40; + +$dw = 1000; +$cw = array( + 32 => 250, 33 => 250, 34 => 408, 35 => 668, 36 => 490, 37 => 875, 38 => 698, 39 => 250, 40 => 240, 41 => 240, + 42 => 417, 43 => 667, 44 => 250, 45 => 313, 46 => 250, 47 => 520, 48 => 500, 49 => 500, 50 => 500, 51 => 500, + 52 => 500, 53 => 500, 54 => 500, 55 => 500, 56 => 500, 57 => 500, 58 => 250, 59 => 250, 60 => 667, 61 => 667, + 62 => 667, 63 => 396, 64 => 921, 65 => 677, 66 => 615, 67 => 719, 68 => 760, 69 => 625, 70 => 552, 71 => 771, + 72 => 802, 73 => 354, 74 => 354, 75 => 781, 76 => 604, 77 => 927, 78 => 750, 79 => 823, 80 => 563, 81 => 823, + 82 => 729, 83 => 542, 84 => 698, 85 => 771, 86 => 729, 87 => 948, 88 => 771, 89 => 677, 90 => 635, 91 => 344, + 92 => 520, 93 => 344, 94 => 469, 95 => 500, 96 => 250, 97 => 469, 98 => 521, 99 => 427, 100 => 521, 101 => 438, + 102 => 271, 103 => 469, 104 => 531, 105 => 250, 106 => 250, 107 => 458, 108 => 240, 109 => 802, 110 => 531, 111 => 500, + 112 => 521, 113 => 521, 114 => 365, 115 => 333, 116 => 292, 117 => 521, 118 => 458, 119 => 677, 120 => 479, 121 => 458, + 122 => 427, 123 => 480, 124 => 496, 125 => 480, 126 => 667, + 17601 => 500, +); +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/stsongstdlight.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/stsongstdlight.php new file mode 100644 index 0000000..19fdeb6 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/stsongstdlight.php @@ -0,0 +1,39 @@ +<?php +$type = 'cidfont0'; +$name = 'STSongStd-Light-Acro'; +$displayname = 'STSong Light (Simp. Chinese)'; +$desc = array( + 'Ascent' => 752, + 'Descent' => -271, + 'CapHeight' => 737, + 'Flags' => 6, + 'FontBBox' => '[-25 -254 1000 880]', + 'ItalicAngle' => 0, + 'StemV' => 58, + 'Style' => '<< /Panose <000000000400000000000000> >>', +); +$cidinfo = array( + 'Registry' => 'Adobe', + 'Ordering' => 'GB1', + 'Supplement' => '2', +); +$enc = 'UniGB-UCS2-H'; + +// underline position, needs checking: +$up = -130; +$ut = 40; + +$dw = 1000; +$cw = array( + 32 => 207, 33 => 270, 34 => 342, 35 => 467, 36 => 462, 37 => 797, 38 => 710, 39 => 239, 40 => 374, 41 => 374, + 42 => 423, 43 => 605, 44 => 238, 45 => 375, 46 => 238, 47 => 334, 48 => 462, 49 => 462, 50 => 462, 51 => 462, + 52 => 462, 53 => 462, 54 => 462, 55 => 462, 56 => 462, 57 => 462, 58 => 238, 59 => 238, 60 => 605, 61 => 605, + 62 => 605, 63 => 344, 64 => 748, 65 => 684, 66 => 560, 67 => 695, 68 => 739, 69 => 563, 70 => 511, 71 => 729, + 72 => 793, 73 => 318, 74 => 312, 75 => 666, 76 => 526, 77 => 896, 78 => 758, 79 => 772, 80 => 544, 81 => 772, + 82 => 628, 83 => 465, 84 => 607, 85 => 753, 86 => 711, 87 => 972, 88 => 647, 89 => 620, 90 => 607, 91 => 374, + 92 => 333, 93 => 374, 94 => 606, 95 => 500, 96 => 239, 97 => 417, 98 => 503, 99 => 427, 100 => 529, 101 => 415, + 102 => 264, 103 => 444, 104 => 518, 105 => 241, 106 => 230, 107 => 495, 108 => 228, 109 => 793, 110 => 527, 111 => 524, + 112 => 524, 113 => 504, 114 => 338, 115 => 336, 116 => 277, 117 => 517, 118 => 450, 119 => 652, 120 => 466, 121 => 452, + 122 => 407, 123 => 370, 124 => 258, 125 => 370, 126 => 605, +); +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/symbol.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/symbol.php new file mode 100644 index 0000000..ad4e818 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/symbol.php @@ -0,0 +1,32 @@ +<?php + // core font definition file for TCPDF (www.tcpdf.org) +$type='core'; +$dw=500; +$cw=array(0=>250,1=>250,2=>250,3=>250,4=>250,5=>250,6=>250,7=>250,8=>250,9=>250, +10=>250,11=>250,12=>250,13=>250,14=>250,15=>250,16=>250,17=>250,18=>250,19=>250, +20=>250,21=>250,22=>250,23=>250,24=>250,25=>250,26=>250,27=>250,28=>250,29=>250, +30=>250,31=>250,32=>250,33=>333,34=>713,35=>500,36=>549,37=>833,38=>778,39=>439, +40=>333,41=>333,42=>500,43=>549,44=>250,45=>549,46=>250,47=>278,48=>500,49=>500, +50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>278,59=>278, +60=>549,61=>549,62=>549,63=>444,64=>549,65=>722,66=>667,67=>722,68=>612,69=>611, +70=>763,71=>603,72=>722,73=>333,74=>631,75=>722,76=>686,77=>889,78=>722,79=>722, +80=>768,81=>741,82=>556,83=>592,84=>611,85=>690,86=>439,87=>768,88=>645,89=>795, +90=>611,91=>333,92=>863,93=>333,94=>658,95=>500,96=>500,97=>631,98=>549,99=>549, +100=>494,101=>439,102=>521,103=>411,104=>603,105=>329,106=>603,107=>549,108=>549, +109=>576,110=>521,111=>549,112=>549,113=>521,114=>549,115=>603,116=>439,117=>576, +118=>713,119=>686,120=>493,121=>686,122=>494,123=>480,124=>200,125=>480,126=>549, +127=>0,128=>0,129=>0,130=>0,131=>0,132=>0,133=>0,134=>0,135=>0,136=>0,137=>0, +138=>0,139=>0,140=>0,141=>0,142=>0,143=>0,144=>0,145=>0,146=>0,147=>0,148=>0, +149=>0,150=>0,151=>0,152=>0,153=>0,154=>0,155=>0,156=>0,157=>0,158=>0,159=>0, +160=>750,161=>620,162=>247,163=>549,164=>167,165=>713,166=>500,167=>753,168=>753, +169=>753,170=>753,171=>1042,172=>987,173=>603,174=>987,175=>603,176=>400,177=>549, +178=>411,179=>549,180=>549,181=>713,182=>494,183=>460,184=>549,185=>549,186=>549, +187=>549,188=>1000,189=>603,190=>1000,191=>658,192=>823,193=>686,194=>795,195=>987, +196=>768,197=>768,198=>823,199=>768,200=>768,201=>713,202=>713,203=>713,204=>713, +205=>713,206=>713,207=>713,208=>768,209=>713,210=>790,211=>790,212=>890,213=>823, +214=>549,215=>250,216=>713,217=>603,218=>603,219=>1042,220=>987,221=>603,222=>987, +223=>603,224=>494,225=>329,226=>790,227=>790,228=>786,229=>713,230=>384,231=>384, +232=>384,233=>384,234=>384,235=>384,236=>494,237=>494,238=>494,239=>494,240=>0, +241=>329,242=>274,243=>686,244=>686,245=>686,246=>384,247=>384,248=>384,249=>384, +250=>384,251=>384,252=>494,253=>494,254=>494,255=>0); +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/times.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/times.php new file mode 100644 index 0000000..8cae5a7 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/times.php @@ -0,0 +1,33 @@ +<?php + // core font definition file for TCPDF (www.tcpdf.org) +$type='core'; +$dw=500; +$cw=array(0=>250,1=>250,2=>250,3=>250,4=>250,5=>250,6=>250,7=>250,8=>250,9=>250, +10=>250,11=>250,12=>250,13=>250,14=>250,15=>250,16=>250,17=>250,18=>250,19=>250, +20=>250,21=>250,22=>250,23=>250,24=>250,25=>250,26=>250,27=>250,28=>250,29=>250, +30=>250,31=>250,32=>250,33=>333,34=>408,35=>500,36=>500,37=>833,38=>778,39=>180, +40=>333,41=>333,42=>500,43=>564,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500, +50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>278,59=>278, +60=>564,61=>564,62=>564,63=>444,64=>921,65=>722,66=>667,67=>667,68=>722,69=>611, +70=>556,71=>722,72=>722,73=>333,74=>389,75=>722,76=>611,77=>889,78=>722,79=>722, +80=>556,81=>722,82=>667,83=>556,84=>611,85=>722,86=>722,87=>944,88=>722,89=>722, +90=>611,91=>333,92=>278,93=>333,94=>469,95=>500,96=>333,97=>444,98=>500,99=>444, +100=>500,101=>444,102=>333,103=>500,104=>500,105=>278,106=>278,107=>500,108=>278, +109=>778,110=>500,111=>500,112=>500,113=>500,114=>333,115=>389,116=>278,117=>500, +118=>500,119=>722,120=>500,121=>500,122=>444,123=>480,124=>200,125=>480,126=>541, +127=>350,128=>500,129=>350,130=>333,131=>500,132=>444,133=>1000,134=>500,135=>500, +136=>333,137=>1000,138=>556,139=>333,140=>889,141=>350,142=>611,143=>350,144=>350, +145=>333,146=>333,147=>444,148=>444,149=>350,150=>500,151=>1000,152=>333,153=>980, +154=>389,155=>333,156=>722,157=>350,158=>444,159=>722,160=>250,161=>333,162=>500, +163=>500,164=>500,165=>500,166=>200,167=>500,168=>333,169=>760,170=>276,171=>500, +172=>564,173=>333,174=>760,175=>333,176=>400,177=>564,178=>300,179=>300,180=>333, +181=>500,182=>453,183=>250,184=>333,185=>300,186=>310,187=>500,188=>750,189=>750, +190=>750,191=>444,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722,198=>889, +199=>667,200=>611,201=>611,202=>611,203=>611,204=>333,205=>333,206=>333,207=>333, +208=>722,209=>722,210=>722,211=>722,212=>722,213=>722,214=>722,215=>564,216=>722, +217=>722,218=>722,219=>722,220=>722,221=>722,222=>556,223=>500,224=>444,225=>444, +226=>444,227=>444,228=>444,229=>444,230=>667,231=>444,232=>444,233=>444,234=>444, +235=>444,236=>278,237=>278,238=>278,239=>278,240=>500,241=>500,242=>500,243=>500, +244=>500,245=>500,246=>500,247=>564,248=>500,249=>500,250=>500,251=>500,252=>500, +253=>500,254=>500,255=>500); +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/timesb.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/timesb.php new file mode 100644 index 0000000..68766ca --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/timesb.php @@ -0,0 +1,33 @@ +<?php + // core font definition file for TCPDF (www.tcpdf.org) +$type='core'; +$dw=500; +$cw=array(0=>250,1=>250,2=>250,3=>250,4=>250,5=>250,6=>250,7=>250,8=>250,9=>250, +10=>250,11=>250,12=>250,13=>250,14=>250,15=>250,16=>250,17=>250,18=>250,19=>250, +20=>250,21=>250,22=>250,23=>250,24=>250,25=>250,26=>250,27=>250,28=>250,29=>250, +30=>250,31=>250,32=>250,33=>333,34=>555,35=>500,36=>500,37=>1000,38=>833,39=>278, +40=>333,41=>333,42=>500,43=>570,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500, +50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>333,59=>333, +60=>570,61=>570,62=>570,63=>500,64=>930,65=>722,66=>667,67=>722,68=>722,69=>667, +70=>611,71=>778,72=>778,73=>389,74=>500,75=>778,76=>667,77=>944,78=>722,79=>778, +80=>611,81=>778,82=>722,83=>556,84=>667,85=>722,86=>722,87=>1000,88=>722,89=>722, +90=>667,91=>333,92=>278,93=>333,94=>581,95=>500,96=>333,97=>500,98=>556,99=>444, +100=>556,101=>444,102=>333,103=>500,104=>556,105=>278,106=>333,107=>556,108=>278, +109=>833,110=>556,111=>500,112=>556,113=>556,114=>444,115=>389,116=>333,117=>556, +118=>500,119=>722,120=>500,121=>500,122=>444,123=>394,124=>220,125=>394,126=>520, +127=>350,128=>500,129=>350,130=>333,131=>500,132=>500,133=>1000,134=>500,135=>500, +136=>333,137=>1000,138=>556,139=>333,140=>1000,141=>350,142=>667,143=>350,144=>350, +145=>333,146=>333,147=>500,148=>500,149=>350,150=>500,151=>1000,152=>333,153=>1000, +154=>389,155=>333,156=>722,157=>350,158=>444,159=>722,160=>250,161=>333,162=>500, +163=>500,164=>500,165=>500,166=>220,167=>500,168=>333,169=>747,170=>300,171=>500, +172=>570,173=>333,174=>747,175=>333,176=>400,177=>570,178=>300,179=>300,180=>333, +181=>556,182=>540,183=>250,184=>333,185=>300,186=>330,187=>500,188=>750,189=>750, +190=>750,191=>500,192=>722,193=>722,194=>722,195=>722,196=>722,197=>722,198=>1000, +199=>722,200=>667,201=>667,202=>667,203=>667,204=>389,205=>389,206=>389,207=>389, +208=>722,209=>722,210=>778,211=>778,212=>778,213=>778,214=>778,215=>570,216=>778, +217=>722,218=>722,219=>722,220=>722,221=>722,222=>611,223=>556,224=>500,225=>500, +226=>500,227=>500,228=>500,229=>500,230=>722,231=>444,232=>444,233=>444,234=>444, +235=>444,236=>278,237=>278,238=>278,239=>278,240=>500,241=>556,242=>500,243=>500, +244=>500,245=>500,246=>500,247=>570,248=>500,249=>556,250=>556,251=>556,252=>556, +253=>500,254=>556,255=>500); +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/timesbi.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/timesbi.php new file mode 100644 index 0000000..e2190e0 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/timesbi.php @@ -0,0 +1,33 @@ +<?php + // core font definition file for TCPDF (www.tcpdf.org) +$type='core'; +$dw=500; +$cw=array(0=>250,1=>250,2=>250,3=>250,4=>250,5=>250,6=>250,7=>250,8=>250,9=>250, +10=>250,11=>250,12=>250,13=>250,14=>250,15=>250,16=>250,17=>250,18=>250,19=>250, +20=>250,21=>250,22=>250,23=>250,24=>250,25=>250,26=>250,27=>250,28=>250,29=>250, +30=>250,31=>250,32=>250,33=>389,34=>555,35=>500,36=>500,37=>833,38=>778,39=>278, +40=>333,41=>333,42=>500,43=>570,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500, +50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>333,59=>333, +60=>570,61=>570,62=>570,63=>500,64=>832,65=>667,66=>667,67=>667,68=>722,69=>667, +70=>667,71=>722,72=>778,73=>389,74=>500,75=>667,76=>611,77=>889,78=>722,79=>722, +80=>611,81=>722,82=>667,83=>556,84=>611,85=>722,86=>667,87=>889,88=>667,89=>611, +90=>611,91=>333,92=>278,93=>333,94=>570,95=>500,96=>333,97=>500,98=>500,99=>444, +100=>500,101=>444,102=>333,103=>500,104=>556,105=>278,106=>278,107=>500,108=>278, +109=>778,110=>556,111=>500,112=>500,113=>500,114=>389,115=>389,116=>278,117=>556, +118=>444,119=>667,120=>500,121=>444,122=>389,123=>348,124=>220,125=>348,126=>570, +127=>350,128=>500,129=>350,130=>333,131=>500,132=>500,133=>1000,134=>500,135=>500, +136=>333,137=>1000,138=>556,139=>333,140=>944,141=>350,142=>611,143=>350,144=>350, +145=>333,146=>333,147=>500,148=>500,149=>350,150=>500,151=>1000,152=>333,153=>1000, +154=>389,155=>333,156=>722,157=>350,158=>389,159=>611,160=>250,161=>389,162=>500, +163=>500,164=>500,165=>500,166=>220,167=>500,168=>333,169=>747,170=>266,171=>500, +172=>606,173=>333,174=>747,175=>333,176=>400,177=>570,178=>300,179=>300,180=>333, +181=>576,182=>500,183=>250,184=>333,185=>300,186=>300,187=>500,188=>750,189=>750, +190=>750,191=>500,192=>667,193=>667,194=>667,195=>667,196=>667,197=>667,198=>944, +199=>667,200=>667,201=>667,202=>667,203=>667,204=>389,205=>389,206=>389,207=>389, +208=>722,209=>722,210=>722,211=>722,212=>722,213=>722,214=>722,215=>570,216=>722, +217=>722,218=>722,219=>722,220=>722,221=>611,222=>611,223=>500,224=>500,225=>500, +226=>500,227=>500,228=>500,229=>500,230=>722,231=>444,232=>444,233=>444,234=>444, +235=>444,236=>278,237=>278,238=>278,239=>278,240=>500,241=>556,242=>500,243=>500, +244=>500,245=>500,246=>500,247=>570,248=>500,249=>556,250=>556,251=>556,252=>556, +253=>444,254=>500,255=>444); +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/timesi.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/timesi.php new file mode 100644 index 0000000..19a5973 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/timesi.php @@ -0,0 +1,33 @@ +<?php + // core font definition file for TCPDF (www.tcpdf.org) +$type='core'; +$dw=500; +$cw=array(0=>250,1=>250,2=>250,3=>250,4=>250,5=>250,6=>250,7=>250,8=>250,9=>250, +10=>250,11=>250,12=>250,13=>250,14=>250,15=>250,16=>250,17=>250,18=>250,19=>250, +20=>250,21=>250,22=>250,23=>250,24=>250,25=>250,26=>250,27=>250,28=>250,29=>250, +30=>250,31=>250,32=>250,33=>333,34=>420,35=>500,36=>500,37=>833,38=>778,39=>214, +40=>333,41=>333,42=>500,43=>675,44=>250,45=>333,46=>250,47=>278,48=>500,49=>500, +50=>500,51=>500,52=>500,53=>500,54=>500,55=>500,56=>500,57=>500,58=>333,59=>333, +60=>675,61=>675,62=>675,63=>500,64=>920,65=>611,66=>611,67=>667,68=>722,69=>611, +70=>611,71=>722,72=>722,73=>333,74=>444,75=>667,76=>556,77=>833,78=>667,79=>722, +80=>611,81=>722,82=>611,83=>500,84=>556,85=>722,86=>611,87=>833,88=>611,89=>556, +90=>556,91=>389,92=>278,93=>389,94=>422,95=>500,96=>333,97=>500,98=>500,99=>444, +100=>500,101=>444,102=>278,103=>500,104=>500,105=>278,106=>278,107=>444,108=>278, +109=>722,110=>500,111=>500,112=>500,113=>500,114=>389,115=>389,116=>278,117=>500, +118=>444,119=>667,120=>444,121=>444,122=>389,123=>400,124=>275,125=>400,126=>541, +127=>350,128=>500,129=>350,130=>333,131=>500,132=>556,133=>889,134=>500,135=>500, +136=>333,137=>1000,138=>500,139=>333,140=>944,141=>350,142=>556,143=>350,144=>350, +145=>333,146=>333,147=>556,148=>556,149=>350,150=>500,151=>889,152=>333,153=>980, +154=>389,155=>333,156=>667,157=>350,158=>389,159=>556,160=>250,161=>389,162=>500, +163=>500,164=>500,165=>500,166=>275,167=>500,168=>333,169=>760,170=>276,171=>500, +172=>675,173=>333,174=>760,175=>333,176=>400,177=>675,178=>300,179=>300,180=>333, +181=>500,182=>523,183=>250,184=>333,185=>300,186=>310,187=>500,188=>750,189=>750, +190=>750,191=>500,192=>611,193=>611,194=>611,195=>611,196=>611,197=>611,198=>889, +199=>667,200=>611,201=>611,202=>611,203=>611,204=>333,205=>333,206=>333,207=>333, +208=>722,209=>667,210=>722,211=>722,212=>722,213=>722,214=>722,215=>675,216=>722, +217=>722,218=>722,219=>722,220=>722,221=>556,222=>611,223=>500,224=>500,225=>500, +226=>500,227=>500,228=>500,229=>500,230=>667,231=>444,232=>444,233=>444,234=>444, +235=>444,236=>278,237=>278,238=>278,239=>278,240=>500,241=>500,242=>500,243=>500, +244=>500,245=>500,246=>500,247=>675,248=>500,249=>500,250=>500,251=>500,252=>500, +253=>444,254=>500,255=>444); +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/uni2cid_ac15.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/uni2cid_ac15.php new file mode 100644 index 0000000..4078b6e --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/uni2cid_ac15.php @@ -0,0 +1,23613 @@ +<?php +// unicode to cid conversion table is from +// ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/ +// cid2code.txt in ag15.tar.Z +$cidinfo['uni2cid'] = array( +32=>1, +33=>2, +34=>3, +35=>4, +36=>5, +37=>6, +38=>7, +39=>8, +40=>9, +41=>10, +42=>11, +43=>12, +44=>13, +45=>14, +46=>15, +47=>16, +48=>17, +49=>18, +50=>19, +51=>20, +52=>21, +53=>22, +54=>23, +55=>24, +56=>25, +57=>26, +58=>27, +59=>28, +60=>29, +61=>30, +62=>31, +63=>32, +64=>33, +65=>34, +66=>35, +67=>36, +68=>37, +69=>38, +70=>39, +71=>40, +72=>41, +73=>42, +74=>43, +75=>44, +76=>45, +77=>46, +78=>47, +79=>48, +80=>49, +81=>50, +82=>51, +83=>52, +84=>53, +85=>54, +86=>55, +87=>56, +88=>57, +89=>58, +90=>59, +91=>60, +92=>61, +93=>62, +94=>63, +95=>64, +96=>65, +97=>66, +98=>67, +99=>68, +100=>69, +101=>70, +102=>71, +103=>72, +104=>73, +105=>74, +106=>75, +107=>76, +108=>77, +109=>78, +110=>79, +111=>80, +112=>81, +113=>82, +114=>83, +115=>84, +116=>85, +117=>86, +118=>87, +119=>88, +120=>89, +121=>90, +122=>91, +123=>92, +124=>93, +125=>94, +126=>95, +12288=>99, +65292=>100, +12289=>101, +12290=>102, +65294=>103, +8226=>104, +8231=>104, +65307=>105, +65306=>106, +65311=>107, +65281=>108, +65072=>109, +8230=>110, +8943=>110, +8229=>111, +65104=>112, +65380=>113, +65105=>113, +65106=>114, +183=>115, +65108=>116, +65109=>117, +65110=>118, +65111=>119, +65372=>120, +8211=>121, +65073=>122, +8212=>123, +65288=>128, +65289=>129, +65077=>130, +65078=>131, +65371=>132, +65373=>133, +65079=>134, +65080=>135, +12308=>136, +12309=>137, +65081=>138, +65082=>139, +12304=>140, +12305=>141, +65083=>142, +65084=>143, +12298=>144, +12299=>145, +65085=>146, +65086=>147, +12296=>148, +12297=>149, +65087=>150, +65088=>151, +12300=>152, +12301=>153, +65089=>154, +65090=>155, +12302=>156, +12303=>157, +65091=>158, +65092=>159, +65113=>160, +65114=>161, +65115=>162, +65116=>163, +65117=>164, +65118=>165, +8216=>166, +8217=>167, +8220=>168, +8221=>169, +12317=>170, +12318=>171, +8245=>172, +8242=>173, +65283=>174, +65286=>175, +65290=>176, +8251=>177, +167=>178, +12291=>179, +9675=>180, +9679=>181, +9651=>182, +9650=>183, +9678=>184, +9734=>185, +9733=>186, +9671=>187, +9670=>188, +9633=>189, +9632=>190, +9661=>191, +9660=>192, +12963=>193, +8453=>194, +175=>195, +772=>195, +8254=>195, +65507=>196, +65343=>197, +717=>198, +65097=>199, +65098=>200, +65101=>201, +65102=>202, +65099=>203, +65100=>204, +65119=>205, +65120=>206, +65121=>207, +65291=>208, +65293=>209, +215=>210, +247=>211, +177=>212, +8730=>213, +65308=>214, +65310=>215, +65309=>216, +8806=>217, +8807=>218, +8800=>219, +8734=>220, +8786=>221, +8801=>222, +65122=>223, +65123=>224, +65124=>225, +65125=>226, +65126=>227, +8764=>228, +65374=>228, +8745=>229, +8746=>230, +8869=>231, +8736=>232, +8735=>233, +8895=>234, +13266=>235, +13265=>236, +8747=>237, +8750=>238, +8757=>239, +8756=>240, +9792=>241, +9794=>242, +8853=>243, +9793=>243, +8857=>244, +9737=>244, +8593=>245, +8595=>246, +8594=>247, +8592=>248, +8598=>249, +8599=>250, +8601=>251, +8600=>252, +8741=>253, +8739=>254, +8725=>257, +65295=>257, +65128=>258, +65340=>258, +65284=>259, +165=>260, +65509=>260, +12306=>261, +162=>262, +65504=>262, +163=>263, +65505=>263, +65285=>264, +65312=>265, +8451=>266, +8457=>267, +65129=>268, +65130=>269, +65131=>270, +13269=>271, +13212=>272, +13213=>273, +13214=>274, +13262=>275, +13217=>276, +13198=>277, +13199=>278, +13252=>279, +176=>280, +20825=>281, +58834=>281, +20827=>282, +58835=>282, +20830=>283, +58837=>283, +20829=>284, +58836=>284, +20833=>285, +20835=>286, +21991=>287, +29929=>288, +58044=>288, +31950=>289, +58191=>289, +9601=>290, +9602=>291, +9603=>292, +9604=>293, +9605=>294, +9606=>295, +9607=>296, +9608=>297, +9615=>298, +9614=>299, +9613=>300, +9612=>301, +9611=>302, +9610=>303, +9609=>304, +9532=>305, +9524=>306, +9516=>307, +9508=>308, +9500=>309, +9620=>310, +9472=>311, +9474=>312, +9621=>313, +9484=>314, +9488=>315, +9492=>316, +9496=>317, +9581=>318, +9582=>319, +9584=>320, +9583=>321, +9552=>322, +9566=>323, +9578=>324, +9569=>325, +9698=>326, +9699=>327, +9701=>328, +9700=>329, +9585=>330, +9586=>331, +9587=>332, +65296=>333, +65297=>334, +65298=>335, +65299=>336, +65300=>337, +65301=>338, +65302=>339, +65303=>340, +65304=>341, +65305=>342, +8544=>343, +8545=>344, +8546=>345, +8547=>346, +8548=>347, +8549=>348, +8550=>349, +8551=>350, +8552=>351, +8553=>352, +12321=>353, +12322=>354, +12323=>355, +12324=>356, +12325=>357, +12326=>358, +12327=>359, +12328=>360, +12329=>361, +12344=>362, +21316=>363, +57443=>363, +12345=>363, +12346=>364, +65313=>365, +65314=>366, +65315=>367, +65316=>368, +65317=>369, +65318=>370, +65319=>371, +65320=>372, +65321=>373, +65322=>374, +65323=>375, +65324=>376, +65325=>377, +65326=>378, +65327=>379, +65328=>380, +65329=>381, +65330=>382, +65331=>383, +65332=>384, +65333=>385, +65334=>386, +65335=>387, +65336=>388, +65337=>389, +65338=>390, +65345=>391, +65346=>392, +65347=>393, +65348=>394, +65349=>395, +65350=>396, +65351=>397, +65352=>398, +65353=>399, +65354=>400, +65355=>401, +65356=>402, +65357=>403, +65358=>404, +65359=>405, +65360=>406, +65361=>407, +65362=>408, +65363=>409, +65364=>410, +65365=>411, +65366=>412, +65367=>413, +65368=>414, +65369=>415, +65370=>416, +913=>417, +914=>418, +915=>419, +916=>420, +917=>421, +918=>422, +919=>423, +920=>424, +921=>425, +922=>426, +923=>427, +924=>428, +925=>429, +926=>430, +927=>431, +928=>432, +929=>433, +931=>434, +932=>435, +933=>436, +934=>437, +935=>438, +936=>439, +937=>440, +945=>441, +946=>442, +947=>443, +948=>444, +949=>445, +950=>446, +951=>447, +952=>448, +953=>449, +954=>450, +955=>451, +956=>452, +957=>453, +958=>454, +959=>455, +960=>456, +961=>457, +963=>458, +964=>459, +965=>460, +966=>461, +967=>462, +968=>463, +969=>464, +12549=>465, +12550=>466, +12551=>467, +12552=>468, +12553=>469, +12554=>470, +12555=>471, +12556=>472, +12557=>473, +12558=>474, +12559=>475, +12560=>476, +12561=>477, +12562=>478, +12563=>479, +12564=>480, +12565=>481, +12566=>482, +12567=>483, +12568=>484, +12569=>485, +12570=>486, +12571=>487, +12572=>488, +12573=>489, +12574=>490, +12575=>491, +12576=>492, +12577=>493, +12578=>494, +12579=>495, +12580=>496, +12581=>497, +12582=>498, +12583=>499, +12584=>500, +12585=>501, +729=>502, +714=>503, +711=>504, +780=>504, +715=>505, +9312=>506, +63153=>506, +9313=>507, +63154=>507, +9314=>508, +63155=>508, +9315=>509, +63156=>509, +9316=>510, +63157=>510, +9317=>511, +63158=>511, +9318=>512, +63159=>512, +9319=>513, +63160=>513, +9320=>514, +63161=>514, +9321=>515, +63162=>515, +9332=>516, +63163=>516, +9333=>517, +63164=>517, +9334=>518, +63165=>518, +9335=>519, +63166=>519, +9336=>520, +63167=>520, +9337=>521, +63168=>521, +9338=>522, +63169=>522, +9339=>523, +63170=>523, +9340=>524, +63171=>524, +9341=>525, +63172=>525, +8560=>526, +63173=>526, +8561=>527, +63174=>527, +8562=>528, +63175=>528, +8563=>529, +63176=>529, +8564=>530, +63177=>530, +8565=>531, +63178=>531, +8566=>532, +63179=>532, +8567=>533, +63180=>533, +8568=>534, +63181=>534, +8569=>535, +63182=>535, +20008=>536, +12033=>536, +20022=>537, +12034=>537, +63183=>537, +20031=>538, +12035=>538, +63184=>538, +12037=>539, +20101=>539, +63185=>539, +12039=>540, +20128=>540, +63186=>540, +20866=>541, +12044=>541, +63187=>541, +20886=>542, +12045=>542, +63188=>542, +20907=>543, +12046=>543, +63189=>543, +12051=>544, +21241=>544, +63190=>544, +12054=>545, +21304=>545, +63191=>545, +12057=>546, +21353=>546, +63192=>546, +12059=>547, +21430=>547, +63193=>547, +12065=>548, +12066=>548, +22786=>548, +22794=>548, +63194=>548, +12071=>549, +23424=>549, +63195=>549, +12078=>550, +24027=>550, +63196=>550, +24186=>551, +12083=>551, +63197=>551, +24191=>552, +12084=>552, +63198=>552, +24308=>553, +12085=>553, +24400=>554, +12089=>554, +63200=>554, +24417=>555, +12090=>555, +63201=>555, +12097=>556, +25908=>556, +63202=>556, +12102=>557, +26080=>557, +30098=>558, +63204=>558, +12135=>558, +30326=>559, +12136=>559, +12193=>560, +36789=>560, +63206=>560, +12202=>561, +38582=>561, +9216=>562, +9217=>563, +9218=>564, +9219=>565, +9220=>566, +9221=>567, +9222=>568, +9223=>569, +9224=>570, +9225=>571, +9226=>572, +9227=>573, +9228=>574, +9229=>575, +9230=>576, +9231=>577, +9232=>578, +9233=>579, +9234=>580, +9235=>581, +9236=>582, +9237=>583, +9238=>584, +9239=>585, +9240=>586, +9241=>587, +9242=>588, +9243=>589, +9244=>590, +9245=>591, +9246=>592, +9247=>593, +9249=>594, +12032=>595, +19968=>595, +12036=>596, +20057=>596, +19969=>597, +19971=>598, +20035=>599, +20061=>600, +20102=>601, +12038=>602, +20108=>602, +20154=>603, +12040=>603, +20799=>604, +12041=>604, +20837=>605, +12042=>605, +20843=>606, +12043=>606, +12047=>607, +20960=>607, +12049=>608, +20992=>608, +20993=>609, +12050=>610, +21147=>610, +12052=>611, +21269=>611, +21313=>612, +12055=>612, +21340=>613, +12056=>613, +12060=>614, +21448=>614, +19977=>615, +19979=>616, +19976=>617, +19978=>618, +20011=>619, +20024=>620, +20961=>621, +20037=>622, +20040=>623, +20063=>624, +20062=>625, +20110=>626, +20129=>627, +20800=>628, +64012=>628, +20995=>629, +21242=>630, +21315=>631, +21449=>632, +12061=>633, +21475=>633, +22303=>634, +12063=>634, +22763=>635, +12064=>635, +22805=>636, +12067=>636, +22823=>637, +12068=>637, +22899=>638, +12069=>638, +12070=>639, +23376=>639, +23377=>640, +23379=>641, +23544=>642, +12072=>642, +23567=>643, +12073=>643, +23586=>644, +12074=>644, +23608=>645, +12075=>645, +12077=>646, +23665=>646, +24029=>647, +24037=>648, +12079=>648, +12080=>649, +24049=>649, +24050=>650, +24051=>651, +24062=>652, +12081=>652, +24178=>653, +12082=>653, +24318=>654, +12086=>654, +24331=>655, +12087=>655, +24339=>656, +12088=>656, +25165=>657, +19985=>658, +19984=>659, +19981=>660, +20013=>661, +20016=>662, +20025=>663, +20043=>664, +23609=>665, +20104=>666, +20113=>667, +20117=>668, +20114=>669, +20116=>670, +20130=>671, +20161=>672, +20160=>673, +20163=>674, +20166=>675, +20167=>676, +20173=>677, +20170=>678, +20171=>679, +20164=>680, +20803=>681, +20801=>682, +20839=>683, +20845=>684, +20846=>685, +20844=>686, +20887=>687, +20982=>688, +20998=>689, +20999=>690, +21000=>691, +21243=>692, +21246=>693, +21247=>694, +21270=>695, +21305=>696, +21320=>697, +21319=>698, +21317=>699, +21342=>700, +21380=>701, +21451=>702, +21450=>703, +21453=>704, +22764=>705, +22825=>706, +22827=>707, +22826=>708, +22829=>709, +23380=>710, +23569=>711, +23588=>712, +23610=>713, +23663=>714, +24052=>715, +24187=>716, +24319=>717, +24340=>718, +24341=>719, +24515=>720, +12092=>720, +25096=>721, +12093=>721, +25142=>722, +12094=>722, +25163=>723, +12095=>723, +25166=>724, +12096=>725, +25903=>725, +25991=>726, +12098=>726, +26007=>727, +12099=>727, +26020=>728, +12100=>728, +26041=>729, +12101=>729, +26085=>730, +12103=>730, +26352=>731, +12104=>731, +26376=>732, +12105=>732, +26408=>733, +12106=>733, +27424=>734, +12107=>734, +27490=>735, +12108=>735, +27513=>736, +12109=>736, +27595=>737, +12111=>737, +27604=>738, +12112=>738, +27611=>739, +12113=>739, +27663=>740, +12114=>740, +27700=>741, +12116=>741, +28779=>742, +12117=>742, +29226=>743, +12118=>743, +29238=>744, +12119=>744, +29243=>745, +12120=>745, +29255=>746, +12122=>746, +29273=>747, +12123=>747, +29275=>748, +12124=>748, +29356=>749, +12125=>749, +29579=>750, +19993=>751, +19990=>752, +19989=>753, +19988=>754, +19992=>755, +20027=>756, +20045=>757, +20047=>758, +20046=>759, +20197=>760, +20184=>761, +20180=>762, +20181=>763, +20182=>764, +20183=>765, +20195=>766, +20196=>767, +20185=>768, +20190=>769, +20805=>770, +20804=>771, +20873=>772, +20874=>773, +20908=>774, +20985=>775, +20986=>776, +20984=>777, +21002=>778, +21152=>779, +21151=>780, +57435=>781, +21253=>781, +21254=>782, +21271=>783, +21277=>784, +20191=>785, +21322=>786, +21321=>787, +21345=>788, +21344=>789, +21359=>790, +21358=>791, +21435=>792, +21487=>793, +21476=>794, +21491=>795, +21484=>796, +21486=>797, +21481=>798, +21480=>799, +21500=>800, +21496=>801, +21493=>802, +21483=>803, +21478=>804, +21482=>805, +21490=>806, +21489=>807, +21488=>808, +21477=>809, +21485=>810, +21499=>811, +22235=>812, +22234=>813, +22806=>814, +22830=>815, +22833=>816, +22900=>817, +22902=>818, +23381=>819, +23427=>820, +23612=>821, +24040=>822, +24039=>823, +24038=>824, +24066=>825, +24067=>826, +24179=>827, +24188=>828, +24321=>829, +24344=>830, +24343=>831, +24517=>832, +25098=>833, +25171=>834, +25172=>835, +25170=>836, +25169=>837, +26021=>838, +26086=>839, +26414=>840, +26412=>841, +26410=>842, +26411=>843, +26413=>844, +27491=>845, +27597=>846, +27665=>847, +27664=>848, +27704=>849, +27713=>850, +27712=>851, +27710=>852, +29359=>853, +29572=>854, +12126=>854, +29577=>855, +12127=>855, +29916=>856, +12128=>856, +29926=>857, +12129=>857, +29976=>858, +12130=>858, +29983=>859, +12131=>859, +12132=>860, +29992=>860, +29993=>861, +12133=>862, +30000=>862, +30001=>863, +30002=>864, +30003=>865, +12134=>866, +30091=>866, +30333=>867, +12137=>867, +30382=>868, +12138=>868, +30399=>869, +12139=>869, +30446=>870, +12140=>870, +30683=>871, +12141=>871, +30690=>872, +12142=>872, +30707=>873, +12143=>873, +31034=>874, +12144=>874, +31166=>875, +12146=>875, +31348=>876, +12147=>876, +31435=>877, +12148=>877, +19998=>878, +19999=>879, +20050=>880, +20051=>881, +20073=>882, +20121=>883, +20132=>884, +20134=>885, +20133=>886, +20223=>887, +20233=>888, +20249=>889, +20234=>890, +20245=>891, +20237=>892, +20240=>893, +20241=>894, +20239=>895, +20210=>896, +20214=>897, +20219=>898, +20208=>899, +20211=>900, +20221=>901, +20225=>902, +20235=>903, +20809=>904, +20807=>905, +20806=>906, +20808=>907, +20840=>908, +20849=>909, +20877=>910, +20912=>911, +21015=>912, +21009=>913, +21010=>914, +21006=>915, +21014=>916, +21155=>917, +21256=>918, +21281=>919, +21280=>920, +21360=>921, +21361=>922, +21513=>923, +21519=>924, +21516=>925, +21514=>926, +21520=>927, +21505=>928, +21515=>929, +21508=>930, +21521=>931, +21517=>932, +21512=>933, +21507=>934, +21518=>935, +21510=>936, +21522=>937, +22240=>938, +22238=>939, +22237=>940, +22323=>941, +22320=>942, +22312=>943, +22317=>944, +22316=>945, +22319=>946, +22313=>947, +22809=>948, +22810=>949, +22839=>950, +22840=>951, +22916=>952, +22904=>953, +22915=>954, +22909=>955, +22905=>956, +22914=>957, +22913=>958, +23383=>959, +23384=>960, +23431=>961, +23432=>962, +23429=>963, +23433=>964, +23546=>965, +23574=>966, +23673=>967, +24030=>968, +24070=>969, +24182=>970, +24180=>971, +24335=>972, +24347=>973, +24537=>974, +24534=>975, +25102=>976, +25100=>977, +25101=>978, +25104=>979, +25187=>980, +25179=>981, +25176=>982, +25910=>983, +26089=>984, +26088=>985, +26092=>986, +26093=>987, +26354=>988, +26355=>989, +26377=>990, +26429=>991, +26420=>992, +26417=>993, +26421=>994, +27425=>995, +27492=>996, +27515=>997, +27670=>998, +27741=>999, +27735=>1000, +27737=>1001, +27743=>1002, +27744=>1003, +27728=>1004, +27733=>1005, +27745=>1006, +27739=>1007, +27725=>1008, +27726=>1009, +28784=>1010, +29279=>1011, +29277=>1012, +30334=>1013, +31481=>1014, +12149=>1014, +31859=>1015, +12150=>1015, +31992=>1016, +12151=>1016, +32566=>1017, +12152=>1017, +32650=>1018, +12154=>1018, +32701=>1019, +12155=>1019, +32769=>1020, +12156=>1020, +32771=>1021, +32780=>1022, +12157=>1022, +32786=>1023, +12158=>1023, +32819=>1024, +12159=>1024, +32895=>1025, +12160=>1025, +32905=>1026, +12161=>1026, +32907=>1027, +32908=>1028, +33251=>1029, +12162=>1029, +33258=>1030, +12163=>1030, +33267=>1031, +12164=>1031, +33276=>1032, +12165=>1032, +33292=>1033, +12166=>1033, +33307=>1034, +12167=>1034, +33311=>1035, +12168=>1035, +33390=>1036, +12169=>1036, +33394=>1037, +12170=>1037, +33406=>1038, +34411=>1039, +12173=>1039, +34880=>1040, +12174=>1040, +34892=>1041, +12175=>1041, +34915=>1042, +12176=>1042, +35199=>1043, +38433=>1044, +20018=>1045, +20136=>1046, +20301=>1047, +20303=>1048, +20295=>1049, +20311=>1050, +20318=>1051, +20276=>1052, +20315=>1053, +20309=>1054, +20272=>1055, +20304=>1056, +20305=>1057, +20285=>1058, +20282=>1059, +20280=>1060, +20291=>1061, +20308=>1062, +20284=>1063, +20294=>1064, +20323=>1065, +20316=>1066, +20320=>1067, +20271=>1068, +20302=>1069, +20278=>1070, +20313=>1071, +20317=>1072, +20296=>1073, +20314=>1074, +20812=>1075, +20811=>1076, +20813=>1077, +20853=>1078, +20918=>1079, +20919=>1080, +21029=>1081, +21028=>1082, +21033=>1083, +21034=>1084, +21032=>1085, +21163=>1086, +21161=>1087, +21162=>1088, +21164=>1089, +21283=>1090, +21363=>1091, +21365=>1092, +21533=>1093, +21549=>1094, +21534=>1095, +21566=>1096, +21542=>1097, +21582=>1098, +21543=>1099, +21574=>1100, +21571=>1101, +21555=>1102, +21576=>1103, +21570=>1104, +21531=>1105, +21545=>1106, +21578=>1107, +21561=>1108, +21563=>1109, +21560=>1110, +21550=>1111, +21557=>1112, +21558=>1113, +21536=>1114, +21564=>1115, +21568=>1116, +21553=>1117, +21547=>1118, +21535=>1119, +21548=>1120, +22250=>1121, +22256=>1122, +22244=>1123, +22251=>1124, +22346=>1125, +22353=>1126, +22336=>1127, +22349=>1128, +22343=>1129, +22350=>1130, +22334=>1131, +22352=>1132, +22351=>1133, +22331=>1134, +22767=>1135, +22846=>1136, +22941=>1137, +22930=>1138, +22952=>1139, +22942=>1140, +22947=>1141, +22937=>1142, +22934=>1143, +22925=>1144, +22948=>1145, +22931=>1146, +22922=>1147, +22949=>1148, +23389=>1149, +23388=>1150, +23386=>1151, +23387=>1152, +23436=>1153, +23435=>1154, +23439=>1155, +23596=>1156, +23616=>1157, +23617=>1158, +23615=>1159, +23614=>1160, +23696=>1161, +23697=>1162, +23700=>1163, +23692=>1164, +24043=>1165, +24076=>1166, +24207=>1167, +24199=>1168, +24202=>1169, +24311=>1170, +24324=>1171, +24351=>1172, +24420=>1173, +24418=>1174, +24439=>1175, +24441=>1176, +24536=>1177, +24524=>1178, +24535=>1179, +24525=>1180, +24561=>1181, +24555=>1182, +24568=>1183, +24554=>1184, +25106=>1185, +25105=>1186, +25220=>1187, +25239=>1188, +25238=>1189, +25216=>1190, +25206=>1191, +25225=>1192, +25197=>1193, +25226=>1194, +25212=>1195, +25214=>1196, +25209=>1197, +25203=>1198, +25234=>1199, +25199=>1200, +25240=>1201, +25198=>1202, +25237=>1203, +25235=>1204, +25233=>1205, +25222=>1206, +25913=>1207, +25915=>1208, +25912=>1209, +26097=>1210, +26356=>1211, +26463=>1212, +26446=>1213, +26447=>1214, +26448=>1215, +26449=>1216, +26460=>1217, +26454=>1218, +26462=>1219, +57801=>1219, +26441=>1220, +26438=>1221, +26464=>1222, +26451=>1223, +26455=>1224, +27493=>1225, +27599=>1226, +27714=>1227, +27742=>1228, +27801=>1229, +27777=>1230, +27784=>1231, +27785=>1232, +27781=>1233, +27803=>1234, +27754=>1235, +27770=>1236, +27792=>1237, +27760=>1238, +27788=>1239, +27752=>1240, +27798=>1241, +27794=>1242, +27773=>1243, +27779=>1244, +27762=>1245, +27774=>1246, +27764=>1247, +27782=>1248, +27766=>1249, +27789=>1250, +27796=>1251, +27800=>1252, +27778=>1253, +28790=>1254, +28796=>1255, +28797=>1256, +28792=>1257, +29282=>1258, +29281=>1259, +29280=>1260, +29380=>1261, +29378=>1262, +29590=>1263, +29996=>1264, +29995=>1265, +30007=>1266, +30008=>1267, +30338=>1268, +30447=>1269, +30691=>1270, +31169=>1271, +31168=>1272, +31167=>1273, +31350=>1274, +31995=>1275, +32597=>1276, +32918=>1277, +32915=>1278, +32925=>1279, +32920=>1280, +32923=>1281, +32922=>1282, +32946=>1283, +33391=>1284, +33426=>1285, +33419=>1286, +33421=>1287, +35211=>1288, +12178=>1288, +35282=>1289, +12179=>1289, +35328=>1290, +12180=>1290, +35895=>1291, +12181=>1291, +35910=>1292, +12182=>1292, +35925=>1293, +12183=>1293, +35997=>1294, +12185=>1294, +36196=>1295, +12186=>1295, +36208=>1296, +12187=>1296, +36275=>1297, +12188=>1297, +36523=>1298, +12189=>1298, +36554=>1299, +12190=>1299, +36763=>1300, +12191=>1300, +36784=>1301, +12192=>1301, +36802=>1302, +36806=>1303, +36805=>1304, +36804=>1305, +24033=>1306, +12194=>1307, +37009=>1307, +37026=>1308, +37034=>1309, +37030=>1310, +37027=>1311, +37193=>1312, +12195=>1312, +37318=>1313, +12196=>1313, +37324=>1314, +12197=>1314, +38450=>1315, +38446=>1316, +38449=>1317, +38442=>1318, +38444=>1319, +20006=>1320, +20054=>1321, +20083=>1322, +20107=>1323, +20123=>1324, +20126=>1325, +20139=>1326, +20140=>1327, +20335=>1328, +20381=>1329, +20365=>1330, +20339=>1331, +20351=>1332, +20332=>1333, +20379=>1334, +20363=>1335, +20358=>1336, +20355=>1337, +20336=>1338, +20341=>1339, +20360=>1340, +20329=>1341, +20347=>1342, +20374=>1343, +20350=>1344, +20367=>1345, +20369=>1346, +20346=>1347, +20820=>1348, +20818=>1349, +20821=>1350, +20841=>1351, +20855=>1352, +20854=>1353, +20856=>1354, +20925=>1355, +20989=>1356, +21051=>1357, +21048=>1358, +21047=>1359, +21050=>1360, +21040=>1361, +21038=>1362, +21046=>1363, +21057=>1364, +21182=>1365, +21179=>1366, +21330=>1367, +21332=>1368, +21331=>1369, +21329=>1370, +21350=>1371, +21367=>1372, +21368=>1373, +21369=>1374, +21462=>1375, +21460=>1376, +21463=>1377, +21619=>1378, +21621=>1379, +21654=>1380, +21624=>1381, +21653=>1382, +21632=>1383, +21627=>1384, +21623=>1385, +21636=>1386, +21650=>1387, +21638=>1388, +21628=>1389, +21648=>1390, +21617=>1391, +21622=>1392, +21644=>1393, +21658=>1394, +21602=>1395, +21608=>1396, +21643=>1397, +21629=>1398, +21646=>1399, +22266=>1400, +22403=>1401, +22391=>1402, +22378=>1403, +22377=>1404, +22369=>1405, +22374=>1406, +22372=>1407, +22396=>1408, +22812=>1409, +22857=>1410, +22855=>1411, +22856=>1412, +22852=>1413, +22868=>1414, +22974=>1415, +22971=>1416, +22996=>1417, +22969=>1418, +22958=>1419, +22993=>1420, +22982=>1421, +22992=>1422, +22989=>1423, +22987=>1424, +22995=>1425, +22986=>1426, +22959=>1427, +22963=>1428, +22994=>1429, +22981=>1430, +23391=>1431, +23396=>1432, +23395=>1433, +23447=>1434, +23450=>1435, +23448=>1436, +23452=>1437, +23449=>1438, +23451=>1439, +23578=>1440, +23624=>1441, +23621=>1442, +23622=>1443, +23735=>1444, +23713=>1445, +23736=>1446, +23721=>1447, +23723=>1448, +23729=>1449, +23731=>1450, +24088=>1451, +24090=>1452, +24086=>1453, +24085=>1454, +24091=>1455, +24081=>1456, +24184=>1457, +24218=>1458, +24215=>1459, +24220=>1460, +24213=>1461, +24214=>1462, +24310=>1463, +24358=>1464, +24359=>1465, +24361=>1466, +24448=>1467, +24449=>1468, +24447=>1469, +24444=>1470, +24541=>1471, +24544=>1472, +24573=>1473, +24565=>1474, +24575=>1475, +24591=>1476, +24596=>1477, +24623=>1478, +24629=>1479, +24598=>1480, +24618=>1481, +24597=>1482, +24609=>1483, +24615=>1484, +24617=>1485, +24619=>1486, +24603=>1487, +25110=>1488, +25109=>1489, +25151=>1490, +25150=>1491, +25152=>1492, +25215=>1493, +25289=>1494, +25292=>1495, +25284=>1496, +25279=>1497, +25282=>1498, +25273=>1499, +25298=>1500, +25307=>1501, +25259=>1502, +25299=>1503, +25300=>1504, +25291=>1505, +25288=>1506, +25256=>1507, +25277=>1508, +25276=>1509, +25296=>1510, +60582=>1510, +25305=>1511, +25287=>1512, +25293=>1513, +25269=>1514, +25306=>1515, +25265=>1516, +25304=>1517, +25302=>1518, +25303=>1519, +25286=>1520, +25260=>1521, +25294=>1522, +61010=>1522, +25918=>1523, +26023=>1524, +26044=>1525, +26106=>1526, +26132=>1527, +26131=>1528, +26124=>1529, +26118=>1530, +26114=>1531, +26126=>1532, +26112=>1533, +26127=>1534, +26133=>1535, +26122=>1536, +26119=>1537, +26381=>1538, +26379=>1539, +26477=>1540, +26507=>1541, +26517=>1542, +26481=>1543, +26524=>1544, +26483=>1545, +26487=>1546, +26503=>1547, +26525=>1548, +26519=>1549, +26479=>1550, +26480=>1551, +26495=>1552, +26505=>1553, +26494=>1554, +26512=>1555, +26485=>1556, +26522=>1557, +26515=>1558, +26492=>1559, +26474=>1560, +26482=>1561, +27427=>1562, +27494=>1563, +27495=>1564, +27519=>1565, +27667=>1566, +27675=>1567, +27875=>1568, +27880=>1569, +27891=>1570, +27825=>1571, +27852=>1572, +27877=>1573, +27827=>1574, +27837=>1575, +27838=>1576, +27836=>1577, +27874=>1578, +27819=>1579, +27861=>1580, +27859=>1581, +27832=>1582, +27844=>1583, +27833=>1584, +27841=>1585, +27822=>1586, +27863=>1587, +27845=>1588, +27889=>1589, +27839=>1590, +27835=>1591, +27873=>1592, +27867=>1593, +27850=>1594, +27820=>1595, +27887=>1596, +27868=>1597, +27862=>1598, +27872=>1599, +28821=>1600, +28814=>1601, +28818=>1602, +28810=>1603, +28825=>1604, +29228=>1605, +29229=>1606, +29240=>1607, +29256=>1608, +29287=>1609, +29289=>1610, +29376=>1611, +29390=>1612, +29401=>1613, +29399=>1614, +29392=>1615, +29609=>1616, +29608=>1617, +29599=>1618, +29611=>1619, +29605=>1620, +30013=>1621, +30109=>1622, +30105=>1623, +30106=>1624, +30340=>1625, +30402=>1626, +30450=>1627, +30452=>1628, +30693=>1629, +30717=>1630, +31038=>1631, +31040=>1632, +31041=>1633, +31177=>1634, +31176=>1635, +31354=>1636, +31353=>1637, +31482=>1638, +31998=>1639, +32596=>1640, +32652=>1641, +32651=>1642, +32773=>1643, +58236=>1643, +32954=>1644, +32933=>1645, +32930=>1646, +32945=>1647, +32929=>1648, +32939=>1649, +32937=>1650, +32948=>1651, +32938=>1652, +32943=>1653, +33253=>1654, +33278=>1655, +33293=>1656, +33459=>1657, +33437=>1658, +33433=>1659, +33453=>1660, +33469=>1661, +33439=>1662, +33465=>1663, +33457=>1664, +33452=>1665, +33445=>1666, +33455=>1667, +33464=>1668, +33443=>1669, +33456=>1670, +33470=>1671, +33463=>1672, +34382=>1673, +34417=>1674, +21021=>1675, +34920=>1676, +36555=>1677, +36814=>1678, +36820=>1679, +36817=>1680, +37045=>1681, +37048=>1682, +37041=>1683, +37046=>1684, +37319=>1685, +37329=>1686, +12198=>1686, +38263=>1687, +12199=>1687, +38272=>1688, +12200=>1688, +38428=>1689, +12201=>1689, +38464=>1690, +38463=>1691, +38459=>1692, +38468=>1693, +38466=>1694, +38585=>1695, +12203=>1695, +38632=>1696, +12204=>1696, +38738=>1697, +12206=>1698, +38750=>1698, +20127=>1699, +20141=>1700, +20142=>1701, +20449=>1702, +20405=>1703, +20399=>1704, +20415=>1705, +20448=>1706, +20433=>1707, +20431=>1708, +20445=>1709, +20419=>1710, +20406=>1711, +20440=>1712, +20447=>1713, +20426=>1714, +20439=>1715, +20398=>1716, +20432=>1717, +20420=>1718, +20418=>1719, +20442=>1720, +20430=>1721, +20446=>1722, +20407=>1723, +20823=>1724, +20882=>1725, +20881=>1726, +20896=>1727, +21070=>1728, +21059=>1729, +21066=>1730, +21069=>1731, +21068=>1732, +21067=>1733, +21063=>1734, +21191=>1735, +21193=>1736, +21187=>1737, +21185=>1738, +21261=>1739, +21335=>1740, +21371=>1741, +21402=>1742, +21467=>1743, +21676=>1744, +21696=>1745, +21672=>1746, +21710=>1747, +21705=>1748, +21688=>1749, +21670=>1750, +21683=>1751, +21703=>1752, +21698=>1753, +21693=>1754, +21674=>1755, +21697=>1756, +21700=>1757, +21704=>1758, +21679=>1759, +21675=>1760, +21681=>1761, +21691=>1762, +21673=>1763, +21671=>1764, +21695=>1765, +22271=>1766, +22402=>1767, +22411=>1768, +22432=>1769, +22435=>1770, +22434=>1771, +22478=>1772, +22446=>1773, +22419=>1774, +22869=>1775, +22865=>1776, +22863=>1777, +22862=>1778, +22864=>1779, +23004=>1780, +23000=>1781, +23039=>1782, +23011=>1783, +23016=>1784, +23043=>1785, +23013=>1786, +23018=>1787, +23002=>1788, +23014=>1789, +23041=>1790, +23035=>1791, +23401=>1792, +23459=>1793, +23462=>1794, +23460=>1795, +23458=>1796, +23461=>1797, +23553=>1798, +23630=>1799, +23631=>1800, +23629=>1801, +23627=>1802, +23769=>1803, +23762=>1804, +24055=>1805, +24093=>1806, +24101=>1807, +24095=>1808, +24189=>1809, +24224=>1810, +24230=>1811, +24314=>1812, +24328=>1813, +24365=>1814, +24421=>1815, +24456=>1816, +24453=>1817, +24458=>1818, +24459=>1819, +24455=>1820, +24460=>1821, +24457=>1822, +24594=>1823, +24605=>1824, +24608=>1825, +24613=>1826, +24590=>1827, +24616=>1828, +24653=>1829, +24688=>1830, +24680=>1831, +24674=>1832, +60712=>1832, +24646=>1833, +24643=>1834, +24684=>1835, +24683=>1836, +24682=>1837, +24676=>1838, +25153=>1839, +25308=>1840, +25366=>1841, +25353=>1842, +25340=>1843, +25325=>1844, +25345=>1845, +25326=>1846, +25341=>1847, +25351=>1848, +25329=>1849, +25335=>1850, +25327=>1851, +25324=>1852, +25342=>1853, +25332=>1854, +25361=>1855, +25346=>1856, +25919=>1857, +25925=>1858, +26027=>1859, +26045=>1860, +26082=>1861, +26149=>1862, +26157=>1863, +26144=>1864, +26151=>1865, +26159=>1866, +26143=>1867, +26152=>1868, +26161=>1869, +26148=>1870, +26359=>1871, +26623=>1872, +26579=>1873, +26609=>1874, +26580=>1875, +26576=>1876, +26604=>1877, +26550=>1878, +26543=>1879, +26613=>1880, +26601=>1881, +26607=>1882, +26564=>1883, +26577=>1884, +26548=>1885, +26586=>1886, +26597=>1887, +26552=>1888, +26575=>1889, +26590=>1890, +26611=>1891, +26544=>1892, +26585=>1893, +26594=>1894, +26589=>1895, +26578=>1896, +27498=>1897, +27523=>1898, +27526=>1899, +27573=>1900, +27602=>1901, +27607=>1902, +27679=>1903, +27849=>1904, +27915=>1905, +27954=>1906, +27946=>1907, +27969=>1908, +27941=>1909, +27916=>1910, +27953=>1911, +27934=>1912, +27927=>1913, +27963=>1914, +27965=>1915, +27966=>1916, +27958=>1917, +27931=>1918, +27893=>1919, +27961=>1920, +27943=>1921, +27960=>1922, +27945=>1923, +27950=>1924, +27957=>1925, +27918=>1926, +27947=>1927, +28843=>1928, +28858=>1929, +28851=>1930, +28844=>1931, +28847=>1932, +28845=>1933, +28856=>1934, +28846=>1935, +28836=>1936, +29232=>1937, +29298=>1938, +29295=>1939, +29300=>1940, +29417=>1941, +29408=>1942, +29409=>1943, +29623=>1944, +29642=>1945, +29627=>1946, +29618=>1947, +29645=>1948, +29632=>1949, +29619=>1950, +29978=>1951, +29997=>1952, +30031=>1953, +30028=>1954, +30030=>1955, +30027=>1956, +30123=>1957, +30116=>1958, +30117=>1959, +30114=>1960, +30115=>1961, +30328=>1962, +30342=>1963, +30343=>1964, +30344=>1965, +30408=>1966, +30406=>1967, +30403=>1968, +30405=>1969, +30465=>1970, +30457=>1971, +30456=>1972, +30473=>1973, +30475=>1974, +30462=>1975, +30460=>1976, +30471=>1977, +30684=>1978, +30722=>1979, +30740=>1980, +30732=>1981, +30733=>1982, +31046=>1983, +31049=>1984, +31048=>1985, +31047=>1986, +31161=>1987, +31162=>1988, +31185=>1989, +31186=>1990, +31179=>1991, +31359=>1992, +31361=>1993, +31487=>1994, +31485=>1995, +31869=>1996, +32002=>1997, +32005=>1998, +32000=>1999, +32009=>2000, +32007=>2001, +32004=>2002, +32006=>2003, +32568=>2004, +32654=>2005, +32703=>2006, +32784=>2007, +32781=>2008, +32785=>2009, +32822=>2010, +32982=>2011, +32997=>2012, +32986=>2013, +32963=>2014, +32964=>2015, +32972=>2016, +32993=>2017, +32987=>2018, +32974=>2019, +32990=>2020, +32996=>2021, +32989=>2022, +33268=>2023, +33314=>2024, +33511=>2025, +33539=>2026, +33541=>2027, +33507=>2028, +33499=>2029, +33510=>2030, +33540=>2031, +33509=>2032, +33538=>2033, +33545=>2034, +33490=>2035, +33495=>2036, +33521=>2037, +33537=>2038, +33500=>2039, +33492=>2040, +33489=>2041, +33502=>2042, +33491=>2043, +33503=>2044, +33519=>2045, +33542=>2046, +34384=>2047, +34425=>2048, +34427=>2049, +34426=>2050, +34893=>2051, +34923=>2052, +35201=>2053, +35284=>2054, +35336=>2055, +35330=>2056, +35331=>2057, +35998=>2058, +36000=>2059, +36212=>2060, +36211=>2061, +36276=>2062, +36557=>2063, +36556=>2064, +36848=>2065, +36838=>2066, +36834=>2067, +36842=>2068, +36837=>2069, +36845=>2070, +36843=>2071, +36836=>2072, +36840=>2073, +37066=>2074, +37070=>2075, +37057=>2076, +37059=>2077, +37195=>2078, +37194=>2079, +37325=>2080, +38274=>2081, +38480=>2082, +38475=>2083, +38476=>2084, +38477=>2085, +38754=>2086, +12207=>2086, +38761=>2087, +12208=>2087, +38859=>2088, +12209=>2088, +38893=>2089, +12210=>2089, +38899=>2090, +12211=>2090, +38913=>2091, +12212=>2091, +39080=>2092, +12213=>2092, +39131=>2093, +12214=>2093, +39135=>2094, +12215=>2094, +39318=>2095, +12216=>2095, +39321=>2096, +12217=>2096, +20056=>2097, +20147=>2098, +20492=>2099, +20493=>2100, +20515=>2101, +20463=>2102, +20518=>2103, +20517=>2104, +20472=>2105, +20521=>2106, +57375=>2106, +20502=>2107, +20486=>2108, +20540=>2109, +20511=>2110, +20506=>2111, +20498=>2112, +20497=>2113, +20474=>2114, +20480=>2115, +20500=>2116, +20520=>2117, +20465=>2118, +20513=>2119, +20491=>2120, +20505=>2121, +20504=>2122, +20467=>2123, +20462=>2124, +20525=>2125, +20522=>2126, +20478=>2127, +20523=>2128, +20489=>2129, +20860=>2130, +20900=>2131, +20901=>2132, +20898=>2133, +20941=>2134, +20940=>2135, +20934=>2136, +20939=>2137, +21078=>2138, +21084=>2139, +21076=>2140, +21083=>2141, +21085=>2142, +21290=>2143, +21375=>2144, +57459=>2144, +21407=>2145, +21405=>2146, +21471=>2147, +21736=>2148, +21776=>2149, +21761=>2150, +21815=>2151, +21756=>2152, +21733=>2153, +21746=>2154, +21766=>2155, +21754=>2156, +21780=>2157, +21737=>2158, +21741=>2159, +21729=>2160, +21769=>2161, +21742=>2162, +21738=>2163, +21734=>2164, +21799=>2165, +21767=>2166, +21757=>2167, +21775=>2168, +22275=>2169, +22276=>2170, +22466=>2171, +22484=>2172, +22475=>2173, +22467=>2174, +22537=>2175, +22799=>2176, +22871=>2177, +22872=>2178, +22874=>2179, +23057=>2180, +23064=>2181, +23068=>2182, +23071=>2183, +23067=>2184, +23059=>2185, +23020=>2186, +23072=>2187, +23075=>2188, +23081=>2189, +23077=>2190, +23052=>2191, +23049=>2192, +23403=>2193, +23640=>2194, +23472=>2195, +23475=>2196, +23478=>2197, +23476=>2198, +23470=>2199, +23477=>2200, +23481=>2201, +23480=>2202, +23556=>2203, +23633=>2204, +23637=>2205, +23632=>2206, +23789=>2207, +23805=>2208, +23803=>2209, +23786=>2210, +23784=>2211, +23792=>2212, +23798=>2213, +23809=>2214, +23796=>2215, +24046=>2216, +24109=>2217, +24107=>2218, +24235=>2219, +24237=>2220, +24231=>2221, +24369=>2222, +24466=>2223, +24465=>2224, +24464=>2225, +24665=>2226, +24675=>2227, +24677=>2228, +24656=>2229, +24661=>2230, +24685=>2231, +24681=>2232, +24687=>2233, +24708=>2234, +24735=>2235, +24730=>2236, +24717=>2237, +24724=>2238, +24716=>2239, +24709=>2240, +24726=>2241, +25159=>2242, +25331=>2243, +25352=>2244, +25343=>2245, +25422=>2246, +25406=>2247, +25391=>2248, +25429=>2249, +25410=>2250, +25414=>2251, +25423=>2252, +25417=>2253, +25402=>2254, +25424=>2255, +25405=>2256, +25386=>2257, +25387=>2258, +25384=>2259, +25421=>2260, +25420=>2261, +25928=>2262, +25929=>2263, +26009=>2264, +26049=>2265, +26053=>2266, +26178=>2267, +26185=>2268, +26191=>2269, +26179=>2270, +26194=>2271, +26188=>2272, +26181=>2273, +26177=>2274, +26360=>2275, +26388=>2276, +26389=>2277, +26391=>2278, +26657=>2279, +26680=>2280, +26696=>2281, +26694=>2282, +26707=>2283, +26681=>2284, +26690=>2285, +26708=>2286, +26665=>2287, +26803=>2288, +26647=>2289, +26700=>2290, +26705=>2291, +26685=>2292, +26612=>2293, +26704=>2294, +26688=>2295, +26684=>2296, +26691=>2297, +26666=>2298, +26693=>2299, +26643=>2300, +26648=>2301, +26689=>2302, +27530=>2303, +27529=>2304, +27575=>2305, +27683=>2306, +27687=>2307, +27688=>2308, +27686=>2309, +27684=>2310, +27888=>2311, +28010=>2312, +28053=>2313, +28040=>2314, +28039=>2315, +28006=>2316, +28024=>2317, +28023=>2318, +27993=>2319, +28051=>2320, +28012=>2321, +28041=>2322, +28014=>2323, +27994=>2324, +28020=>2325, +28009=>2326, +28044=>2327, +28042=>2328, +28025=>2329, +28037=>2330, +28005=>2331, +28052=>2332, +28874=>2333, +28888=>2334, +28900=>2335, +28889=>2336, +28872=>2337, +28879=>2338, +29241=>2339, +29305=>2340, +29436=>2341, +29433=>2342, +29437=>2343, +29432=>2344, +29431=>2345, +29574=>2346, +29677=>2347, +29705=>2348, +29678=>2349, +29664=>2350, +29674=>2351, +29662=>2352, +30036=>2353, +30045=>2354, +30044=>2355, +30042=>2356, +30041=>2357, +30142=>2358, +30149=>2359, +30151=>2360, +30130=>2361, +30131=>2362, +30141=>2363, +30140=>2364, +30137=>2365, +30146=>2366, +30136=>2367, +30347=>2368, +30384=>2369, +30410=>2370, +30413=>2371, +30414=>2372, +30505=>2373, +30495=>2374, +30496=>2375, +30504=>2376, +30697=>2377, +30768=>2378, +30759=>2379, +30776=>2380, +30749=>2381, +30772=>2382, +30775=>2383, +30757=>2384, +30765=>2385, +30752=>2386, +30751=>2387, +30770=>2388, +31061=>2389, +31056=>2390, +31072=>2391, +31071=>2392, +31062=>2393, +31070=>2394, +31069=>2395, +31063=>2396, +31066=>2397, +31204=>2398, +31203=>2399, +60418=>2399, +31207=>2400, +31199=>2401, +31206=>2402, +31209=>2403, +31192=>2404, +31364=>2405, +31368=>2406, +31449=>2407, +31494=>2408, +31505=>2409, +31881=>2410, +32033=>2411, +32023=>2412, +32011=>2413, +32010=>2414, +32032=>2415, +32034=>2416, +32020=>2417, +32016=>2418, +32021=>2419, +32026=>2420, +32028=>2421, +32013=>2422, +32025=>2423, +32027=>2424, +32570=>2425, +32607=>2426, +32660=>2427, +32709=>2428, +32705=>2429, +32774=>2430, +32772=>2431, +32792=>2432, +32789=>2433, +32793=>2434, +32791=>2435, +32829=>2436, +32831=>2437, +33009=>2438, +33026=>2439, +33008=>2440, +33029=>2441, +33005=>2442, +33012=>2443, +33030=>2444, +33016=>2445, +33011=>2446, +33032=>2447, +33021=>2448, +33034=>2449, +33020=>2450, +33007=>2451, +33261=>2452, +33260=>2453, +33280=>2454, +33296=>2455, +33322=>2456, +33323=>2457, +33320=>2458, +33324=>2459, +33467=>2460, +33579=>2461, +33618=>2462, +33620=>2463, +33610=>2464, +33592=>2465, +33616=>2466, +33609=>2467, +33589=>2468, +33588=>2469, +33615=>2470, +33586=>2471, +33593=>2472, +33590=>2473, +33559=>2474, +33600=>2475, +33585=>2476, +33576=>2477, +33603=>2478, +34388=>2479, +34442=>2480, +34474=>2481, +34451=>2482, +34468=>2483, +34473=>2484, +34444=>2485, +34467=>2486, +34460=>2487, +34928=>2488, +34935=>2489, +34945=>2490, +34946=>2491, +34941=>2492, +34937=>2493, +35352=>2494, +35344=>2495, +35342=>2496, +35340=>2497, +35349=>2498, +35338=>2499, +35351=>2500, +35347=>2501, +35350=>2502, +35343=>2503, +35345=>2504, +35912=>2505, +35962=>2506, +35961=>2507, +36001=>2508, +36002=>2509, +36215=>2510, +58442=>2510, +36524=>2511, +36562=>2512, +36564=>2513, +36559=>2514, +36785=>2515, +36865=>2516, +36870=>2517, +36855=>2518, +36864=>2519, +36858=>2520, +36852=>2521, +36867=>2522, +36861=>2523, +36869=>2524, +36856=>2525, +37013=>2526, +37089=>2527, +37085=>2528, +37090=>2529, +37202=>2530, +37197=>2531, +37196=>2532, +37336=>2533, +37341=>2534, +37335=>2535, +37340=>2536, +37337=>2537, +38275=>2538, +38498=>2539, +38499=>2540, +38497=>2541, +38491=>2542, +38493=>2543, +38500=>2544, +38488=>2545, +38494=>2546, +38587=>2547, +39138=>2548, +39340=>2549, +12218=>2549, +39592=>2550, +12219=>2550, +39640=>2551, +12220=>2551, +12222=>2552, +39717=>2552, +39730=>2553, +12224=>2553, +39740=>2554, +12225=>2554, +20094=>2555, +20602=>2556, +20605=>2557, +57382=>2557, +20572=>2558, +20551=>2559, +20547=>2560, +20556=>2561, +20570=>2562, +20553=>2563, +20581=>2564, +20598=>2565, +20558=>2566, +20565=>2567, +20597=>2568, +20596=>2569, +20599=>2570, +20559=>2571, +20495=>2572, +20591=>2573, +20589=>2574, +20828=>2575, +20885=>2576, +20976=>2577, +21098=>2578, +21103=>2579, +21202=>2580, +21209=>2581, +21208=>2582, +21205=>2583, +21264=>2584, +21263=>2585, +21273=>2586, +21311=>2587, +21312=>2588, +21310=>2589, +21443=>2590, +26364=>2591, +21830=>2592, +21866=>2593, +21862=>2594, +21828=>2595, +21854=>2596, +21857=>2597, +21827=>2598, +21834=>2599, +21809=>2600, +21846=>2601, +21839=>2602, +21845=>2603, +21807=>2604, +21860=>2605, +21816=>2606, +21806=>2607, +21852=>2608, +21804=>2609, +21859=>2610, +21811=>2611, +21825=>2612, +21847=>2613, +22280=>2614, +22283=>2615, +22281=>2616, +22495=>2617, +22533=>2618, +22538=>2619, +22534=>2620, +22496=>2621, +22500=>2622, +22522=>2623, +22530=>2624, +22581=>2625, +22519=>2626, +22521=>2627, +22816=>2628, +22882=>2629, +23094=>2630, +23105=>2631, +23113=>2632, +23142=>2633, +23146=>2634, +23104=>2635, +23100=>2636, +23138=>2637, +23130=>2638, +23110=>2639, +23114=>2640, +23408=>2641, +23495=>2642, +23493=>2643, +23492=>2644, +23490=>2645, +23487=>2646, +23494=>2647, +23561=>2648, +23560=>2649, +23559=>2650, +23648=>2651, +23644=>2652, +23645=>2653, +23815=>2654, +23814=>2655, +23822=>2656, +23835=>2657, +23830=>2658, +23842=>2659, +23825=>2660, +23849=>2661, +23828=>2662, +23833=>2663, +23844=>2664, +23847=>2665, +23831=>2666, +24034=>2667, +24120=>2668, +24118=>2669, +24115=>2670, +24119=>2671, +24247=>2672, +24248=>2673, +24246=>2674, +24245=>2675, +24254=>2676, +24373=>2677, +24375=>2678, +24407=>2679, +24428=>2680, +24425=>2681, +24427=>2682, +24471=>2683, +24473=>2684, +24478=>2685, +24472=>2686, +24481=>2687, +24480=>2688, +24476=>2689, +24703=>2690, +24739=>2691, +24713=>2692, +24736=>2693, +24744=>2694, +24779=>2695, +24756=>2696, +24806=>2697, +24765=>2698, +24773=>2699, +24763=>2700, +24757=>2701, +24796=>2702, +24764=>2703, +24792=>2704, +24789=>2705, +24774=>2706, +24799=>2707, +24760=>2708, +24794=>2709, +24775=>2710, +25114=>2711, +25115=>2712, +25160=>2713, +25504=>2714, +25511=>2715, +25458=>2716, +25494=>2717, +25506=>2718, +25509=>2719, +25463=>2720, +25447=>2721, +25496=>2722, +25514=>2723, +25457=>2724, +25513=>2725, +25481=>2726, +25475=>2727, +25499=>2728, +25451=>2729, +25512=>2730, +25476=>2731, +25480=>2732, +25497=>2733, +25505=>2734, +25516=>2735, +25490=>2736, +25487=>2737, +25472=>2738, +25467=>2739, +25449=>2740, +25448=>2741, +25466=>2742, +25949=>2743, +25942=>2744, +25937=>2745, +25945=>2746, +25943=>2747, +21855=>2748, +25935=>2749, +25944=>2750, +25941=>2751, +25940=>2752, +26012=>2753, +26011=>2754, +26028=>2755, +26063=>2756, +26059=>2757, +26060=>2758, +26062=>2759, +26205=>2760, +26202=>2761, +26212=>2762, +26216=>2763, +26214=>2764, +26206=>2765, +26361=>2766, +21207=>2767, +26395=>2768, +26753=>2769, +26799=>2770, +26786=>2771, +26771=>2772, +26805=>2773, +26751=>2774, +26742=>2775, +26801=>2776, +26791=>2777, +26775=>2778, +26800=>2779, +26755=>2780, +26820=>2781, +26797=>2782, +26758=>2783, +26757=>2784, +26772=>2785, +26781=>2786, +26792=>2787, +26783=>2788, +26785=>2789, +26754=>2790, +27442=>2791, +27578=>2792, +27627=>2793, +27628=>2794, +27691=>2795, +28046=>2796, +28092=>2797, +28147=>2798, +28121=>2799, +28082=>2800, +28129=>2801, +28108=>2802, +28132=>2803, +28155=>2804, +28154=>2805, +28165=>2806, +28103=>2807, +28107=>2808, +28079=>2809, +28113=>2810, +28078=>2811, +28126=>2812, +28153=>2813, +28088=>2814, +28151=>2815, +28149=>2816, +28101=>2817, +28114=>2818, +28186=>2819, +28085=>2820, +28122=>2821, +28139=>2822, +28120=>2823, +28138=>2824, +28145=>2825, +28142=>2826, +28136=>2827, +28102=>2828, +28100=>2829, +28074=>2830, +28140=>2831, +28095=>2832, +28134=>2833, +28921=>2834, +28937=>2835, +28938=>2836, +28925=>2837, +28911=>2838, +29245=>2839, +29309=>2840, +29313=>2841, +29468=>2842, +29467=>2843, +29462=>2844, +29459=>2845, +29465=>2846, +29575=>2847, +29701=>2848, +29706=>2849, +29699=>2850, +29702=>2851, +29694=>2852, +29709=>2853, +29920=>2854, +29942=>2855, +29943=>2856, +29980=>2857, +29986=>2858, +30053=>2859, +30054=>2860, +30050=>2861, +30064=>2862, +30095=>2863, +30164=>2864, +30165=>2865, +30133=>2866, +30154=>2867, +30157=>2868, +30350=>2869, +30420=>2870, +30418=>2871, +30427=>2872, +30519=>2873, +30526=>2874, +30524=>2875, +30518=>2876, +30520=>2877, +30522=>2878, +30827=>2879, +30787=>2880, +30798=>2881, +31077=>2882, +31080=>2883, +31085=>2884, +31227=>2885, +31378=>2886, +31381=>2887, +31520=>2888, +31528=>2889, +31515=>2890, +31532=>2891, +31526=>2892, +31513=>2893, +31518=>2894, +31534=>2895, +31890=>2896, +31895=>2897, +31893=>2898, +32070=>2899, +32067=>2900, +32113=>2901, +32046=>2902, +32057=>2903, +32060=>2904, +32064=>2905, +32048=>2906, +32051=>2907, +32068=>2908, +32047=>2909, +32066=>2910, +32050=>2911, +32049=>2912, +32573=>2913, +32670=>2914, +32666=>2915, +32716=>2916, +32718=>2917, +32722=>2918, +32796=>2919, +32842=>2920, +32838=>2921, +33071=>2922, +33046=>2923, +33059=>2924, +33067=>2925, +33065=>2926, +33072=>2927, +33060=>2928, +33282=>2929, +33333=>2930, +33335=>2931, +33334=>2932, +33337=>2933, +33678=>2934, +33694=>2935, +33688=>2936, +33656=>2937, +33698=>2938, +33686=>2939, +33725=>2940, +33707=>2941, +33682=>2942, +33674=>2943, +33683=>2944, +33673=>2945, +33696=>2946, +33655=>2947, +33659=>2948, +33660=>2949, +33670=>2950, +33703=>2951, +34389=>2952, +24426=>2953, +34503=>2954, +34496=>2955, +34486=>2956, +34500=>2957, +34485=>2958, +34502=>2959, +34507=>2960, +34481=>2961, +34479=>2962, +34505=>2963, +34899=>2964, +34974=>2965, +34952=>2966, +34987=>2967, +34962=>2968, +34966=>2969, +34957=>2970, +34955=>2971, +35219=>2972, +35215=>2973, +35370=>2974, +35357=>2975, +35363=>2976, +35365=>2977, +35377=>2978, +35373=>2979, +35359=>2980, +35355=>2981, +35362=>2982, +35913=>2983, +35930=>2984, +36009=>2985, +36012=>2986, +36011=>2987, +36008=>2988, +36010=>2989, +36007=>2990, +36199=>2991, +36198=>2992, +36286=>2993, +36282=>2994, +36571=>2995, +36575=>2996, +36889=>2997, +36877=>2998, +36890=>2999, +36887=>3000, +36899=>3001, +36895=>3002, +36893=>3003, +36880=>3004, +36885=>3005, +36894=>3006, +36896=>3007, +36879=>3008, +36898=>3009, +36886=>3010, +36891=>3011, +36884=>3012, +37096=>3013, +37101=>3014, +37117=>3015, +58488=>3015, +37207=>3016, +37326=>3017, +37365=>3018, +37350=>3019, +37347=>3020, +37351=>3021, +37357=>3022, +37353=>3023, +38281=>3024, +38506=>3025, +38517=>3026, +38515=>3027, +38520=>3028, +38512=>3029, +38516=>3030, +38518=>3031, +38519=>3032, +38508=>3033, +38592=>3034, +38634=>3035, +38633=>3036, +31456=>3037, +31455=>3038, +38914=>3039, +38915=>3040, +39770=>3041, +12226=>3041, +40165=>3042, +12227=>3042, +40565=>3043, +12228=>3043, +40575=>3044, +12229=>3044, +40613=>3045, +12230=>3045, +40635=>3046, +12231=>3046, +20642=>3047, +20621=>3048, +20613=>3049, +20633=>3050, +20625=>3051, +20608=>3052, +20630=>3053, +20632=>3054, +20634=>3055, +26368=>3056, +20977=>3057, +21106=>3058, +21108=>3059, +21109=>3060, +21097=>3061, +21214=>3062, +21213=>3063, +21211=>3064, +21338=>3065, +21413=>3066, +21883=>3067, +21888=>3068, +21927=>3069, +21884=>3070, +21898=>3071, +21917=>3072, +21912=>3073, +21890=>3074, +21916=>3075, +21930=>3076, +21908=>3077, +21895=>3078, +21899=>3079, +21891=>3080, +21939=>3081, +21934=>3082, +21919=>3083, +21822=>3084, +21938=>3085, +21914=>3086, +21947=>3087, +21932=>3088, +21937=>3089, +21886=>3090, +21897=>3091, +21931=>3092, +21913=>3093, +22285=>3094, +22575=>3095, +22570=>3096, +22580=>3097, +22564=>3098, +22576=>3099, +22577=>3100, +22561=>3101, +22557=>3102, +22560=>3103, +22777=>3104, +22778=>3105, +22880=>3106, +23159=>3107, +57587=>3107, +23194=>3108, +23167=>3109, +23186=>3110, +23195=>3111, +23207=>3112, +23411=>3113, +23409=>3114, +23506=>3115, +23500=>3116, +23507=>3117, +23504=>3118, +23562=>3119, +23563=>3120, +23601=>3121, +23884=>3122, +23888=>3123, +23860=>3124, +23879=>3125, +24061=>3126, +24133=>3127, +24125=>3128, +24128=>3129, +24131=>3130, +24190=>3131, +24266=>3132, +24257=>3133, +24258=>3134, +24260=>3135, +24380=>3136, +24429=>3137, +24489=>3138, +24490=>3139, +24488=>3140, +24785=>3141, +24801=>3142, +24754=>3143, +24758=>3144, +24800=>3145, +24860=>3146, +24867=>3147, +24826=>3148, +24853=>3149, +24816=>3150, +24827=>3151, +24820=>3152, +24936=>3153, +24817=>3154, +24846=>3155, +24822=>3156, +24841=>3157, +24832=>3158, +24850=>3159, +25119=>3160, +25161=>3161, +25507=>3162, +25484=>3163, +25551=>3164, +25536=>3165, +25577=>3166, +25545=>3167, +25542=>3168, +25549=>3169, +25554=>3170, +25571=>3171, +25552=>3172, +25569=>3173, +25558=>3174, +25581=>3175, +25582=>3176, +25462=>3177, +25588=>3178, +25578=>3179, +25563=>3180, +25682=>3181, +25562=>3182, +25593=>3183, +25950=>3184, +25958=>3185, +25954=>3186, +25955=>3187, +26001=>3188, +26000=>3189, +26031=>3190, +26222=>3191, +26224=>3192, +26228=>3193, +57786=>3193, +26230=>3194, +26223=>3195, +26257=>3196, +26234=>3197, +26238=>3198, +26231=>3199, +26366=>3200, +26367=>3201, +26399=>3202, +26397=>3203, +26874=>3204, +26837=>3205, +26848=>3206, +26840=>3207, +26839=>3208, +26885=>3209, +26847=>3210, +26869=>3211, +26862=>3212, +26855=>3213, +26873=>3214, +26834=>3215, +26866=>3216, +26851=>3217, +26827=>3218, +26829=>3219, +26893=>3220, +26898=>3221, +26894=>3222, +26825=>3223, +26842=>3224, +26990=>3225, +26875=>3226, +27454=>3227, +27450=>3228, +27453=>3229, +27544=>3230, +27542=>3231, +27580=>3232, +27631=>3233, +27694=>3234, +27695=>3235, +27692=>3236, +28207=>3237, +57904=>3237, +28216=>3238, +28244=>3239, +28193=>3240, +28210=>3241, +28263=>3242, +28234=>3243, +28192=>3244, +28197=>3245, +28195=>3246, +28187=>3247, +28251=>3248, +28248=>3249, +28196=>3250, +28246=>3251, +28270=>3252, +28205=>3253, +28198=>3254, +28271=>3255, +28212=>3256, +28237=>3257, +28218=>3258, +28204=>3259, +28227=>3260, +28189=>3261, +57901=>3261, +28222=>3262, +28363=>3263, +28297=>3264, +28185=>3265, +28238=>3266, +28259=>3267, +28228=>3268, +28274=>3269, +28265=>3270, +28255=>3271, +28953=>3272, +28954=>3273, +28966=>3274, +28976=>3275, +28961=>3276, +28982=>3277, +29038=>3278, +57958=>3278, +28956=>3279, +29260=>3280, +29316=>3281, +29312=>3282, +29494=>3283, +29477=>3284, +29492=>3285, +29481=>3286, +29754=>3287, +29738=>3288, +29747=>3289, +29730=>3290, +29733=>3291, +29749=>3292, +29750=>3293, +29748=>3294, +29743=>3295, +29723=>3296, +29734=>3297, +29736=>3298, +29989=>3299, +29990=>3300, +30059=>3301, +30058=>3302, +30178=>3303, +30171=>3304, +30179=>3305, +30169=>3306, +30168=>3307, +30174=>3308, +30176=>3309, +30331=>3310, +30332=>3311, +30358=>3312, +30355=>3313, +30388=>3314, +30428=>3315, +30543=>3316, +30701=>3317, +30813=>3318, +30828=>3319, +30831=>3320, +31245=>3321, +31240=>3322, +31243=>3323, +31237=>3324, +31232=>3325, +31384=>3326, +31383=>3327, +31382=>3328, +31461=>3329, +31459=>3330, +31561=>3331, +31574=>3332, +31558=>3333, +31568=>3334, +31570=>3335, +31572=>3336, +31565=>3337, +31563=>3338, +31567=>3339, +31569=>3340, +60510=>3340, +31903=>3341, +31909=>3342, +32094=>3343, +32080=>3344, +32104=>3345, +32085=>3346, +32043=>3347, +32110=>3348, +32114=>3349, +32097=>3350, +32102=>3351, +32098=>3352, +32112=>3353, +32115=>3354, +21892=>3355, +32724=>3356, +32725=>3357, +32779=>3358, +32850=>3359, +32901=>3360, +33109=>3361, +33108=>3362, +33099=>3363, +33105=>3364, +33102=>3365, +33081=>3366, +33094=>3367, +33086=>3368, +33100=>3369, +33107=>3370, +33140=>3371, +33298=>3372, +33308=>3373, +33769=>3374, +33795=>3375, +33784=>3376, +33805=>3377, +33760=>3378, +33733=>3379, +33803=>3380, +33729=>3381, +58309=>3381, +33775=>3382, +33777=>3383, +33780=>3384, +33879=>3385, +33802=>3386, +33776=>3387, +33804=>3388, +33740=>3389, +33789=>3390, +33778=>3391, +33738=>3392, +33848=>3393, +33806=>3394, +33796=>3395, +33756=>3396, +33799=>3397, +33748=>3398, +33759=>3399, +34395=>3400, +34527=>3401, +34521=>3402, +34541=>3403, +34516=>3404, +34523=>3405, +34532=>3406, +34512=>3407, +34526=>3408, +34903=>3409, +35009=>3410, +35010=>3411, +34993=>3412, +35203=>3413, +35222=>3414, +35387=>3415, +35424=>3416, +35413=>3417, +35422=>3418, +35388=>3419, +35393=>3420, +35412=>3421, +35419=>3422, +35408=>3423, +35398=>3424, +35380=>3425, +35386=>3426, +35382=>3427, +35414=>3428, +35937=>3429, +35970=>3430, +36015=>3431, +36028=>3432, +36019=>3433, +36029=>3434, +36033=>3435, +36027=>3436, +36032=>3437, +36020=>3438, +36023=>3439, +36022=>3440, +36031=>3441, +36024=>3442, +36234=>3443, +36229=>3444, +36225=>3445, +36302=>3446, +36317=>3447, +36299=>3448, +36314=>3449, +36305=>3450, +36300=>3451, +36315=>3452, +36294=>3453, +36603=>3454, +36600=>3455, +36604=>3456, +36764=>3457, +36910=>3458, +36917=>3459, +36913=>3460, +36920=>3461, +36914=>3462, +36918=>3463, +37122=>3464, +37109=>3465, +37129=>3466, +37118=>3467, +37219=>3468, +37221=>3469, +37327=>3470, +37396=>3471, +37397=>3472, +37411=>3473, +37385=>3474, +37406=>3475, +37389=>3476, +37392=>3477, +37383=>3478, +37393=>3479, +38292=>3480, +38287=>3481, +38283=>3482, +38289=>3483, +38291=>3484, +38290=>3485, +38286=>3486, +38538=>3487, +38542=>3488, +38539=>3489, +38525=>3490, +38533=>3491, +38534=>3492, +38541=>3493, +38514=>3494, +38532=>3495, +38593=>3496, +38597=>3497, +38596=>3498, +38598=>3499, +38599=>3500, +38639=>3501, +38642=>3502, +38860=>3503, +38917=>3504, +38918=>3505, +38920=>3506, +39143=>3507, +39146=>3508, +39151=>3509, +39145=>3510, +39154=>3511, +39149=>3512, +39342=>3513, +39341=>3514, +40643=>3515, +12232=>3515, +40653=>3516, +12233=>3516, +40657=>3517, +12234=>3517, +20098=>3518, +20653=>3519, +20661=>3520, +20658=>3521, +20659=>3522, +20677=>3523, +20670=>3524, +20652=>3525, +20663=>3526, +20667=>3527, +20655=>3528, +20679=>3529, +21119=>3530, +21111=>3531, +21117=>3532, +21215=>3533, +21222=>3534, +21220=>3535, +21218=>3536, +21219=>3537, +21295=>3538, +21983=>3539, +21992=>3540, +21971=>3541, +21990=>3542, +21966=>3543, +21980=>3544, +21959=>3545, +21969=>3546, +21987=>3547, +21988=>3548, +21999=>3549, +21978=>3550, +21985=>3551, +21957=>3552, +21958=>3553, +21989=>3554, +21961=>3555, +22290=>3556, +22291=>3557, +22622=>3558, +22609=>3559, +22616=>3560, +22615=>3561, +22618=>3562, +22612=>3563, +22635=>3564, +22604=>3565, +22637=>3566, +22602=>3567, +22626=>3568, +22610=>3569, +22603=>3570, +22887=>3571, +23233=>3572, +23241=>3573, +23244=>3574, +23230=>3575, +23229=>3576, +23228=>3577, +23219=>3578, +23234=>3579, +23218=>3580, +23913=>3581, +23919=>3582, +24140=>3583, +24185=>3584, +24265=>3585, +24264=>3586, +24338=>3587, +24409=>3588, +24492=>3589, +24494=>3590, +24858=>3591, +24847=>3592, +24904=>3593, +24863=>3594, +24819=>3595, +24859=>3596, +24825=>3597, +24833=>3598, +24840=>3599, +24910=>3600, +24908=>3601, +24900=>3602, +24909=>3603, +24894=>3604, +24884=>3605, +24871=>3606, +24845=>3607, +24838=>3608, +24887=>3609, +25121=>3610, +25122=>3611, +25619=>3612, +25662=>3613, +25630=>3614, +25642=>3615, +25645=>3616, +25661=>3617, +25644=>3618, +25615=>3619, +25628=>3620, +25620=>3621, +25613=>3622, +25654=>3623, +25622=>3624, +25623=>3625, +25606=>3626, +25964=>3627, +26015=>3628, +26032=>3629, +26263=>3630, +26249=>3631, +26247=>3632, +26248=>3633, +26262=>3634, +26244=>3635, +26264=>3636, +26253=>3637, +26371=>3638, +27028=>3639, +26989=>3640, +26970=>3641, +26999=>3642, +26976=>3643, +26964=>3644, +26997=>3645, +26928=>3646, +27010=>3647, +26954=>3648, +26984=>3649, +26987=>3650, +26974=>3651, +26963=>3652, +27001=>3653, +27014=>3654, +26973=>3655, +26979=>3656, +26971=>3657, +27463=>3658, +27506=>3659, +27584=>3660, +27583=>3661, +27603=>3662, +27645=>3663, +28322=>3664, +28335=>3665, +28371=>3666, +28342=>3667, +28354=>3668, +28304=>3669, +28317=>3670, +28359=>3671, +28357=>3672, +28325=>3673, +28312=>3674, +28348=>3675, +28346=>3676, +28331=>3677, +28369=>3678, +28310=>3679, +28316=>3680, +28356=>3681, +28372=>3682, +28330=>3683, +28327=>3684, +28340=>3685, +29006=>3686, +29017=>3687, +29033=>3688, +29028=>3689, +29001=>3690, +29031=>3691, +29020=>3692, +29036=>3693, +29030=>3694, +29004=>3695, +29029=>3696, +29022=>3697, +28998=>3698, +29032=>3699, +29014=>3700, +29242=>3701, +29266=>3702, +29495=>3703, +29509=>3704, +29503=>3705, +29502=>3706, +29807=>3707, +29786=>3708, +29781=>3709, +29791=>3710, +29790=>3711, +29761=>3712, +29759=>3713, +29785=>3714, +29787=>3715, +58019=>3716, +29788=>3716, +30070=>3717, +30072=>3718, +30208=>3719, +30192=>3720, +30209=>3721, +30194=>3722, +30193=>3723, +30202=>3724, +30207=>3725, +30196=>3726, +30195=>3727, +30430=>3728, +30431=>3729, +30555=>3730, +30571=>3731, +30566=>3732, +30558=>3733, +30563=>3734, +30585=>3735, +30570=>3736, +30572=>3737, +30556=>3738, +30565=>3739, +30568=>3740, +30562=>3741, +30702=>3742, +30862=>3743, +30896=>3744, +30871=>3745, +30872=>3746, +30860=>3747, +30857=>3748, +30844=>3749, +30865=>3750, +30867=>3751, +30847=>3752, +31098=>3753, +31103=>3754, +31105=>3755, +33836=>3756, +31165=>3757, +31260=>3758, +31258=>3759, +31264=>3760, +31252=>3761, +31263=>3762, +31262=>3763, +31391=>3764, +31392=>3765, +31607=>3766, +31680=>3767, +31584=>3768, +31598=>3769, +31591=>3770, +31921=>3771, +31923=>3772, +31925=>3773, +32147=>3774, +32121=>3775, +32145=>3776, +32129=>3777, +32143=>3778, +32091=>3779, +32622=>3780, +32617=>3781, +32618=>3782, +32626=>3783, +32681=>3784, +32680=>3785, +32676=>3786, +32854=>3787, +32856=>3788, +32902=>3789, +32900=>3790, +33137=>3791, +33136=>3792, +33144=>3793, +33125=>3794, +33134=>3795, +33139=>3796, +33131=>3797, +33145=>3798, +33146=>3799, +33126=>3800, +33285=>3801, +33351=>3802, +33922=>3803, +33911=>3804, +33853=>3805, +33841=>3806, +33909=>3807, +33894=>3808, +33899=>3809, +33865=>3810, +33900=>3811, +33883=>3812, +33852=>3813, +33845=>3814, +33889=>3815, +33891=>3816, +33897=>3817, +33901=>3818, +33862=>3819, +34398=>3820, +34396=>3821, +34399=>3822, +34553=>3823, +34579=>3824, +34568=>3825, +34567=>3826, +34560=>3827, +34558=>3828, +34555=>3829, +34562=>3830, +34563=>3831, +34566=>3832, +34570=>3833, +34905=>3834, +35039=>3835, +35028=>3836, +35033=>3837, +35036=>3838, +35032=>3839, +35037=>3840, +35041=>3841, +35018=>3842, +35029=>3843, +35026=>3844, +35228=>3845, +35299=>3846, +35435=>3847, +35442=>3848, +35443=>3849, +35430=>3850, +35433=>3851, +35440=>3852, +35463=>3853, +35452=>3854, +35427=>3855, +35488=>3856, +35441=>3857, +35461=>3858, +35437=>3859, +35426=>3860, +35438=>3861, +35436=>3862, +35449=>3863, +35451=>3864, +35390=>3865, +35432=>3866, +35938=>3867, +35978=>3868, +35977=>3869, +36042=>3870, +36039=>3871, +36040=>3872, +36036=>3873, +36018=>3874, +36035=>3875, +36034=>3876, +36037=>3877, +36321=>3878, +36319=>3879, +36328=>3880, +36335=>3881, +36339=>3882, +36346=>3883, +36330=>3884, +36324=>3885, +36326=>3886, +36530=>3887, +36611=>3888, +36617=>3889, +36606=>3890, +36618=>3891, +36767=>3892, +36786=>3893, +36939=>3894, +36938=>3895, +36947=>3896, +36930=>3897, +36948=>3898, +36924=>3899, +36949=>3900, +36944=>3901, +36935=>3902, +36943=>3903, +36942=>3904, +36941=>3905, +36945=>3906, +36926=>3907, +36929=>3908, +37138=>3909, +37143=>3910, +37228=>3911, +37226=>3912, +37225=>3913, +37321=>3914, +37431=>3915, +37463=>3916, +37432=>3917, +37437=>3918, +37440=>3919, +37438=>3920, +37467=>3921, +37451=>3922, +37476=>3923, +37457=>3924, +37428=>3925, +37449=>3926, +37453=>3927, +37445=>3928, +37433=>3929, +37439=>3930, +37466=>3931, +38296=>3932, +38552=>3933, +38548=>3934, +38549=>3935, +38605=>3936, +38603=>3937, +38601=>3938, +38602=>3939, +38647=>3940, +38651=>3941, +38649=>3942, +38646=>3943, +38742=>3944, +38772=>3945, +38774=>3946, +38928=>3947, +38929=>3948, +38931=>3949, +38922=>3950, +38930=>3951, +38924=>3952, +39164=>3953, +39156=>3954, +39165=>3955, +39166=>3956, +39347=>3957, +39345=>3958, +39348=>3959, +39649=>3960, +40169=>3961, +40578=>3962, +40718=>3963, +12237=>3963, +40723=>3964, +12238=>3964, +40736=>3965, +12239=>3965, +20711=>3966, +20718=>3967, +20709=>3968, +20694=>3969, +20717=>3970, +60903=>3970, +20698=>3971, +20693=>3972, +20687=>3973, +20689=>3974, +20721=>3975, +20686=>3976, +20713=>3977, +20834=>3978, +20979=>3979, +21123=>3980, +21122=>3981, +21297=>3982, +21421=>3983, +22014=>3984, +22016=>3985, +22043=>3986, +22039=>3987, +22013=>3988, +22036=>3989, +22022=>3990, +22025=>3991, +22029=>3992, +22030=>3993, +22007=>3994, +22038=>3995, +22047=>3996, +22024=>3997, +22032=>3998, +22006=>3999, +22296=>4000, +22294=>4001, +22645=>4002, +22654=>4003, +22659=>4004, +22675=>4005, +22666=>4006, +22649=>4007, +22661=>4008, +22653=>4009, +22781=>4010, +22821=>4011, +22818=>4012, +22820=>4013, +22890=>4014, +22889=>4015, +23265=>4016, +23270=>4017, +23273=>4018, +23255=>4019, +23254=>4020, +23256=>4021, +23267=>4022, +23413=>4023, +23518=>4024, +23527=>4025, +23521=>4026, +23525=>4027, +23526=>4028, +23528=>4029, +23522=>4030, +23524=>4031, +23519=>4032, +23565=>4033, +23650=>4034, +23940=>4035, +23943=>4036, +24155=>4037, +24163=>4038, +24149=>4039, +24151=>4040, +24148=>4041, +24275=>4042, +24278=>4043, +24330=>4044, +24390=>4045, +24432=>4046, +24505=>4047, +24903=>4048, +24895=>4049, +24907=>4050, +24951=>4051, +24930=>4052, +24931=>4053, +24927=>4054, +24922=>4055, +24920=>4056, +24949=>4057, +25130=>4058, +25735=>4059, +25688=>4060, +25684=>4061, +25764=>4062, +25720=>4063, +25695=>4064, +25722=>4065, +25681=>4066, +25703=>4067, +25652=>4068, +25709=>4069, +25723=>4070, +25970=>4071, +26017=>4072, +26071=>4073, +26070=>4074, +26274=>4075, +26280=>4076, +26269=>4077, +27036=>4078, +27048=>4079, +27029=>4080, +27073=>4081, +27054=>4082, +27091=>4083, +27083=>4084, +27035=>4085, +27063=>4086, +27067=>4087, +27051=>4088, +27060=>4089, +27088=>4090, +27085=>4091, +27053=>4092, +27084=>4093, +27046=>4094, +27075=>4095, +27043=>4096, +27465=>4097, +27468=>4098, +27699=>4099, +28467=>4100, +28436=>4101, +28414=>4102, +28435=>4103, +28404=>4104, +28457=>4105, +28478=>4106, +28448=>4107, +28460=>4108, +28431=>4109, +28418=>4110, +28450=>4111, +28415=>4112, +28399=>4113, +28422=>4114, +28465=>4115, +28472=>4116, +28466=>4117, +28451=>4118, +28437=>4119, +28459=>4120, +28463=>4121, +28552=>4122, +28458=>4123, +28396=>4124, +28417=>4125, +28402=>4126, +28364=>4127, +28407=>4128, +29076=>4129, +29081=>4130, +29053=>4131, +29066=>4132, +29060=>4133, +29074=>4134, +29246=>4135, +29330=>4136, +29334=>4137, +29508=>4138, +29520=>4139, +29796=>4140, +29795=>4141, +29802=>4142, +29808=>4143, +29805=>4144, +29956=>4145, +30097=>4146, +30247=>4147, +30221=>4148, +30219=>4149, +30217=>4150, +30227=>4151, +30433=>4152, +30435=>4153, +30596=>4154, +30589=>4155, +30591=>4156, +30561=>4157, +30913=>4158, +30879=>4159, +30887=>4160, +30899=>4161, +30889=>4162, +30883=>4163, +31118=>4164, +31119=>4165, +31117=>4166, +31278=>4167, +31281=>4168, +31402=>4169, +31401=>4170, +31469=>4171, +31471=>4172, +31649=>4173, +31637=>4174, +31627=>4175, +31605=>4176, +31639=>4177, +31645=>4178, +31636=>4179, +31631=>4180, +31672=>4181, +58170=>4181, +31623=>4182, +31620=>4183, +31929=>4184, +31933=>4185, +31934=>4186, +32187=>4187, +32176=>4188, +32156=>4189, +32189=>4190, +32190=>4191, +32160=>4192, +32202=>4193, +32180=>4194, +32178=>4195, +32177=>4196, +32186=>4197, +32162=>4198, +32191=>4199, +32181=>4200, +32184=>4201, +32173=>4202, +32210=>4203, +58202=>4203, +32199=>4204, +32172=>4205, +32624=>4206, +32736=>4207, +32737=>4208, +32735=>4209, +32862=>4210, +32858=>4211, +32903=>4212, +33104=>4213, +33152=>4214, +33167=>4215, +33160=>4216, +33162=>4217, +33151=>4218, +33154=>4219, +33255=>4220, +33274=>4221, +33287=>4222, +33300=>4223, +33310=>4224, +33355=>4225, +33993=>4226, +33983=>4227, +33990=>4228, +33988=>4229, +33945=>4230, +33950=>4231, +33970=>4232, +33948=>4233, +33995=>4234, +33976=>4235, +33984=>4236, +34003=>4237, +33936=>4238, +33980=>4239, +34001=>4240, +33994=>4241, +34623=>4242, +34588=>4243, +34619=>4244, +34594=>4245, +34597=>4246, +34612=>4247, +34584=>4248, +34645=>4249, +34615=>4250, +34601=>4251, +35059=>4252, +35074=>4253, +35060=>4254, +35065=>4255, +35064=>4256, +35069=>4257, +35048=>4258, +35098=>4259, +35055=>4260, +35494=>4261, +35468=>4262, +35486=>4263, +35491=>4264, +35469=>4265, +35489=>4266, +35475=>4267, +35492=>4268, +35498=>4269, +35493=>4270, +35496=>4271, +35480=>4272, +35473=>4273, +35482=>4274, +35495=>4275, +35946=>4276, +35981=>4277, +35980=>4278, +36051=>4279, +36049=>4280, +36050=>4281, +36203=>4282, +36249=>4283, +36245=>4284, +36348=>4285, +36628=>4286, +36626=>4287, +36629=>4288, +36627=>4289, +36771=>4290, +36960=>4291, +36952=>4292, +36956=>4293, +36963=>4294, +36953=>4295, +36958=>4296, +36962=>4297, +36957=>4298, +36955=>4299, +37145=>4300, +37144=>4301, +37150=>4302, +37237=>4303, +37240=>4304, +37239=>4305, +37236=>4306, +37496=>4307, +37548=>4308, +37504=>4309, +37509=>4310, +37528=>4311, +37526=>4312, +37499=>4313, +37523=>4314, +37532=>4315, +37544=>4316, +37500=>4317, +37521=>4318, +38305=>4319, +38312=>4320, +38313=>4321, +38307=>4322, +38309=>4323, +38308=>4324, +38553=>4325, +38556=>4326, +38555=>4327, +38604=>4328, +38610=>4329, +38656=>4330, +38780=>4331, +38789=>4332, +38902=>4333, +38935=>4334, +38936=>4335, +39087=>4336, +39089=>4337, +39171=>4338, +39173=>4339, +39180=>4340, +39177=>4341, +39361=>4342, +39599=>4343, +39600=>4344, +39654=>4345, +39745=>4346, +39746=>4347, +40180=>4348, +40182=>4349, +40179=>4350, +40636=>4351, +40763=>4352, +12240=>4352, +40778=>4353, +12241=>4353, +20740=>4354, +20736=>4355, +20731=>4356, +20725=>4357, +20729=>4358, +20738=>4359, +20744=>4360, +20745=>4361, +20741=>4362, +20956=>4363, +21127=>4364, +21128=>4365, +21129=>4366, +21133=>4367, +21130=>4368, +21232=>4369, +21426=>4370, +22062=>4371, +22075=>4372, +22073=>4373, +22066=>4374, +22079=>4375, +22068=>4376, +22057=>4377, +22099=>4378, +22094=>4379, +22103=>4380, +22132=>4381, +22070=>4382, +22063=>4383, +22064=>4384, +22656=>4385, +22687=>4386, +22686=>4387, +22707=>4388, +22684=>4389, +22702=>4390, +22697=>4391, +22694=>4392, +22893=>4393, +23305=>4394, +23291=>4395, +23307=>4396, +23285=>4397, +23308=>4398, +23304=>4399, +23534=>4400, +23532=>4401, +23529=>4402, +23531=>4403, +23652=>4404, +23653=>4405, +23965=>4406, +23956=>4407, +24162=>4408, +24159=>4409, +24161=>4410, +24290=>4411, +24282=>4412, +24287=>4413, +24285=>4414, +24291=>4415, +24288=>4416, +24392=>4417, +24433=>4418, +24503=>4419, +24501=>4420, +24950=>4421, +24935=>4422, +24942=>4423, +24925=>4424, +24917=>4425, +24962=>4426, +24956=>4427, +24944=>4428, +24939=>4429, +24958=>4430, +24999=>4431, +24976=>4432, +25003=>4433, +24974=>4434, +25004=>4435, +24986=>4436, +24996=>4437, +24980=>4438, +25006=>4439, +25134=>4440, +25705=>4441, +25711=>4442, +25721=>4443, +25758=>4444, +25778=>4445, +25736=>4446, +25744=>4447, +57745=>4447, +25776=>4448, +25765=>4449, +25747=>4450, +25749=>4451, +25769=>4452, +25746=>4453, +25774=>4454, +25773=>4455, +25771=>4456, +25754=>4457, +25772=>4458, +25753=>4459, +25762=>4460, +25779=>4461, +25973=>4462, +25975=>4463, +25976=>4464, +26286=>4465, +26283=>4466, +26292=>4467, +26289=>4468, +27171=>4469, +27167=>4470, +27112=>4471, +27137=>4472, +27166=>4473, +27161=>4474, +27133=>4475, +27169=>4476, +27155=>4477, +27146=>4478, +27123=>4479, +27138=>4480, +27141=>4481, +27117=>4482, +27153=>4483, +27472=>4484, +27470=>4485, +27556=>4486, +27589=>4487, +27590=>4488, +28479=>4489, +28540=>4490, +28548=>4491, +28497=>4492, +28518=>4493, +28500=>4494, +28550=>4495, +28525=>4496, +28507=>4497, +28536=>4498, +28526=>4499, +28558=>4500, +28538=>4501, +28528=>4502, +28516=>4503, +28567=>4504, +28504=>4505, +28373=>4506, +28527=>4507, +28512=>4508, +28511=>4509, +29087=>4510, +29100=>4511, +29105=>4512, +29096=>4513, +29270=>4514, +29339=>4515, +29518=>4516, +29527=>4517, +29801=>4518, +29835=>4519, +29827=>4520, +29822=>4521, +29824=>4522, +30079=>4523, +30240=>4524, +30249=>4525, +30239=>4526, +30244=>4527, +30246=>4528, +30241=>4529, +30242=>4530, +30362=>4531, +30394=>4532, +30436=>4533, +30606=>4534, +30599=>4535, +30604=>4536, +30609=>4537, +30603=>4538, +30923=>4539, +30917=>4540, +30906=>4541, +30922=>4542, +30910=>4543, +30933=>4544, +30908=>4545, +30928=>4546, +31295=>4547, +31292=>4548, +31296=>4549, +31293=>4550, +31287=>4551, +31291=>4552, +31407=>4553, +31406=>4554, +31661=>4555, +31665=>4556, +31684=>4557, +31668=>4558, +31686=>4559, +31687=>4560, +31681=>4561, +31648=>4562, +31692=>4563, +31946=>4564, +32224=>4565, +32244=>4566, +32239=>4567, +32251=>4568, +32216=>4569, +32236=>4570, +32221=>4571, +32232=>4572, +32227=>4573, +32218=>4574, +32222=>4575, +32233=>4576, +32158=>4577, +32217=>4578, +32242=>4579, +32249=>4580, +32629=>4581, +32631=>4582, +32687=>4583, +32745=>4584, +32806=>4585, +33179=>4586, +33180=>4587, +33181=>4588, +33184=>4589, +33178=>4590, +33176=>4591, +34071=>4592, +34109=>4593, +34074=>4594, +34030=>4595, +34092=>4596, +34093=>4597, +34067=>4598, +34065=>4599, +34083=>4600, +34081=>4601, +34068=>4602, +34028=>4603, +34085=>4604, +34047=>4605, +34054=>4606, +34690=>4607, +34676=>4608, +34678=>4609, +34656=>4610, +34662=>4611, +34680=>4612, +34664=>4613, +34649=>4614, +34647=>4615, +34636=>4616, +34643=>4617, +34907=>4618, +34909=>4619, +35088=>4620, +35079=>4621, +35090=>4622, +35091=>4623, +35093=>4624, +35082=>4625, +35516=>4626, +35538=>4627, +35527=>4628, +35524=>4629, +35477=>4630, +35531=>4631, +35576=>4632, +35506=>4633, +35529=>4634, +35522=>4635, +35519=>4636, +35504=>4637, +35542=>4638, +35533=>4639, +35510=>4640, +35513=>4641, +35547=>4642, +35916=>4643, +35918=>4644, +35948=>4645, +36064=>4646, +36062=>4647, +36070=>4648, +36068=>4649, +36076=>4650, +36077=>4651, +36066=>4652, +36067=>4653, +36060=>4654, +36074=>4655, +36065=>4656, +36205=>4657, +36255=>4658, +36259=>4659, +36395=>4660, +36368=>4661, +36381=>4662, +36386=>4663, +36367=>4664, +36393=>4665, +36383=>4666, +36385=>4667, +36382=>4668, +36538=>4669, +36637=>4670, +36635=>4671, +36639=>4672, +36649=>4673, +36646=>4674, +36650=>4675, +36636=>4676, +36638=>4677, +36645=>4678, +36969=>4679, +36974=>4680, +36968=>4681, +36973=>4682, +36983=>4683, +37168=>4684, +37165=>4685, +37159=>4686, +37169=>4687, +37255=>4688, +37257=>4689, +37259=>4690, +37251=>4691, +37573=>4692, +37563=>4693, +37559=>4694, +37610=>4695, +37604=>4696, +37569=>4697, +37555=>4698, +37564=>4699, +37586=>4700, +37575=>4701, +37616=>4702, +37554=>4703, +38317=>4704, +38321=>4705, +38660=>4706, +38662=>4707, +38663=>4708, +38665=>4709, +38752=>4710, +38797=>4711, +38795=>4712, +38799=>4713, +38945=>4714, +38955=>4715, +38940=>4716, +39091=>4717, +39178=>4718, +39187=>4719, +39186=>4720, +39192=>4721, +39389=>4722, +39376=>4723, +39391=>4724, +39387=>4725, +39377=>4726, +39381=>4727, +39378=>4728, +39385=>4729, +39607=>4730, +39662=>4731, +39663=>4732, +39719=>4733, +39749=>4734, +39748=>4735, +39799=>4736, +39791=>4737, +40198=>4738, +40201=>4739, +40195=>4740, +40617=>4741, +40638=>4742, +40654=>4743, +22696=>4744, +12242=>4745, +40786=>4745, +20754=>4746, +20760=>4747, +20756=>4748, +20752=>4749, +20757=>4750, +20864=>4751, +20906=>4752, +20957=>4753, +21137=>4754, +21139=>4755, +21235=>4756, +22105=>4757, +22123=>4758, +22137=>4759, +22121=>4760, +22116=>4761, +22136=>4762, +22122=>4763, +22120=>4764, +22117=>4765, +22129=>4766, +22127=>4767, +22124=>4768, +22114=>4769, +22134=>4770, +22721=>4771, +22718=>4772, +22727=>4773, +22725=>4774, +22894=>4775, +23325=>4776, +23348=>4777, +23416=>4778, +23536=>4779, +23566=>4780, +24394=>4781, +25010=>4782, +24977=>4783, +25001=>4784, +24970=>4785, +25037=>4786, +25014=>4787, +25022=>4788, +25034=>4789, +25032=>4790, +25136=>4791, +25797=>4792, +25793=>4793, +25803=>4794, +25787=>4795, +25788=>4796, +25818=>4797, +25796=>4798, +25799=>4799, +25794=>4800, +25805=>4801, +25791=>4802, +25810=>4803, +25812=>4804, +25790=>4805, +25972=>4806, +26310=>4807, +26313=>4808, +26297=>4809, +26308=>4810, +26311=>4811, +26296=>4812, +27197=>4813, +27192=>4814, +27194=>4815, +27225=>4816, +27243=>4817, +27224=>4818, +27193=>4819, +27204=>4820, +27234=>4821, +27233=>4822, +27211=>4823, +27207=>4824, +27189=>4825, +27231=>4826, +27208=>4827, +27481=>4828, +27511=>4829, +27653=>4830, +28610=>4831, +28593=>4832, +28577=>4833, +28611=>4834, +28580=>4835, +28609=>4836, +28583=>4837, +28595=>4838, +28608=>4839, +28601=>4840, +28598=>4841, +60318=>4841, +28582=>4842, +28576=>4843, +28596=>4844, +29118=>4845, +29129=>4846, +29136=>4847, +29138=>4848, +29128=>4849, +29141=>4850, +29113=>4851, +29134=>4852, +29145=>4853, +29148=>4854, +29123=>4855, +29124=>4856, +29544=>4857, +29852=>4858, +29859=>4859, +29848=>4860, +29855=>4861, +29854=>4862, +29922=>4863, +29964=>4864, +29965=>4865, +30260=>4866, +30264=>4867, +30266=>4868, +30439=>4869, +30437=>4870, +30624=>4871, +30622=>4872, +30623=>4873, +30629=>4874, +30952=>4875, +30938=>4876, +30956=>4877, +30951=>4878, +31142=>4879, +31309=>4880, +31310=>4881, +31302=>4882, +31308=>4883, +31307=>4884, +31418=>4885, +31705=>4886, +31761=>4887, +31689=>4888, +31716=>4889, +31707=>4890, +31713=>4891, +31721=>4892, +31718=>4893, +31957=>4894, +31958=>4895, +32266=>4896, +32273=>4897, +32264=>4898, +32283=>4899, +32291=>4900, +32286=>4901, +32285=>4902, +58211=>4902, +32265=>4903, +32272=>4904, +32633=>4905, +32690=>4906, +32752=>4907, +32753=>4908, +32750=>4909, +32808=>4910, +58239=>4910, +33203=>4911, +33193=>4912, +33192=>4913, +33275=>4914, +33288=>4915, +33368=>4916, +33369=>4917, +34122=>4918, +34137=>4919, +34120=>4920, +34152=>4921, +34153=>4922, +34115=>4923, +34121=>4924, +34157=>4925, +34154=>4926, +34142=>4927, +34691=>4928, +34719=>4929, +34718=>4930, +34722=>4931, +34701=>4932, +34913=>4933, +35114=>4934, +35122=>4935, +35109=>4936, +35115=>4937, +35105=>4938, +35242=>4939, +35238=>4940, +58391=>4940, +35558=>4941, +35578=>4942, +35563=>4943, +35569=>4944, +35584=>4945, +35548=>4946, +35559=>4947, +35566=>4948, +35582=>4949, +35585=>4950, +35586=>4951, +35575=>4952, +35565=>4953, +35571=>4954, +35574=>4955, +35580=>4956, +35947=>4957, +35949=>4958, +35987=>4959, +36084=>4960, +36420=>4961, +36401=>4962, +36404=>4963, +36418=>4964, +36409=>4965, +36405=>4966, +36667=>4967, +36655=>4968, +36664=>4969, +36659=>4970, +36776=>4971, +36774=>4972, +36981=>4973, +36980=>4974, +36984=>4975, +36978=>4976, +36988=>4977, +36986=>4978, +37172=>4979, +37266=>4980, +37664=>4981, +37686=>4982, +37624=>4983, +37683=>4984, +37679=>4985, +37666=>4986, +37628=>4987, +37675=>4988, +37636=>4989, +37658=>4990, +37648=>4991, +37670=>4992, +37665=>4993, +37653=>4994, +37678=>4995, +37657=>4996, +38331=>4997, +38567=>4998, +38568=>4999, +38570=>5000, +38613=>5001, +38670=>5002, +38673=>5003, +38678=>5004, +38669=>5005, +38675=>5006, +38671=>5007, +38747=>5008, +58565=>5009, +38748=>5009, +38758=>5010, +38808=>5011, +38960=>5012, +38968=>5013, +38971=>5014, +38967=>5015, +38957=>5016, +38969=>5017, +38948=>5018, +39184=>5019, +39208=>5020, +39198=>5021, +39195=>5022, +39201=>5023, +39194=>5024, +39405=>5025, +39394=>5026, +39409=>5027, +39608=>5028, +39612=>5029, +39675=>5030, +39661=>5031, +39720=>5032, +39825=>5033, +40213=>5034, +40227=>5035, +40230=>5036, +40232=>5037, +40210=>5038, +40219=>5039, +40664=>5040, +40660=>5041, +40845=>5042, +12243=>5042, +40860=>5043, +12244=>5043, +20778=>5044, +20767=>5045, +20769=>5046, +20786=>5047, +21237=>5048, +22158=>5049, +22144=>5050, +22160=>5051, +22149=>5052, +22151=>5053, +22159=>5054, +22741=>5055, +22739=>5056, +22737=>5057, +22734=>5058, +23344=>5059, +23338=>5060, +23332=>5061, +23418=>5062, +23607=>5063, +23656=>5064, +23996=>5065, +23994=>5066, +23997=>5067, +23992=>5068, +24171=>5069, +24396=>5070, +24509=>5071, +25033=>5072, +25026=>5073, +25031=>5074, +25062=>5075, +25035=>5076, +25138=>5077, +25140=>5078, +25806=>5079, +25802=>5080, +25816=>5081, +25824=>5082, +25840=>5083, +25830=>5084, +25836=>5085, +25841=>5086, +25826=>5087, +25837=>5088, +25986=>5089, +25987=>5090, +26329=>5091, +26326=>5092, +27264=>5093, +27284=>5094, +27268=>5095, +27298=>5096, +27292=>5097, +27355=>5098, +27299=>5099, +27262=>5100, +27287=>5101, +27280=>5102, +27296=>5103, +27484=>5104, +27566=>5105, +27610=>5106, +27656=>5107, +28632=>5108, +28657=>5109, +28639=>5110, +28640=>5111, +28635=>5112, +28644=>5113, +28651=>5114, +28655=>5115, +28544=>5116, +28652=>5117, +28641=>5118, +28649=>5119, +28629=>5120, +28654=>5121, +28656=>5122, +29159=>5123, +29151=>5124, +60361=>5124, +29166=>5125, +29158=>5126, +29157=>5127, +29165=>5128, +29164=>5129, +29172=>5130, +29152=>5131, +29237=>5132, +29254=>5133, +29552=>5134, +29554=>5135, +29865=>5136, +29872=>5137, +29862=>5138, +29864=>5139, +30278=>5140, +30274=>5141, +30284=>5142, +30442=>5143, +30643=>5144, +30634=>5145, +30640=>5146, +30636=>5147, +30631=>5148, +30637=>5149, +30703=>5150, +30967=>5151, +30970=>5152, +30964=>5153, +30959=>5154, +30977=>5155, +31143=>5156, +31146=>5157, +31319=>5158, +31423=>5159, +31751=>5160, +31757=>5161, +31742=>5162, +31735=>5163, +31756=>5164, +31712=>5165, +31968=>5166, +31964=>5167, +31966=>5168, +31970=>5169, +31967=>5170, +31961=>5171, +31965=>5172, +32302=>5173, +32318=>5174, +32326=>5175, +32311=>5176, +32306=>5177, +32323=>5178, +32299=>5179, +32317=>5180, +32305=>5181, +32325=>5182, +32321=>5183, +32308=>5184, +32313=>5185, +32328=>5186, +32309=>5187, +32319=>5188, +32303=>5189, +32580=>5190, +32755=>5191, +32764=>5192, +32881=>5193, +32882=>5194, +32880=>5195, +32879=>5196, +32883=>5197, +33222=>5198, +33219=>5199, +33210=>5200, +33218=>5201, +33216=>5202, +33215=>5203, +33213=>5204, +33225=>5205, +33214=>5206, +33256=>5207, +33289=>5208, +33393=>5209, +34218=>5210, +34180=>5211, +34174=>5212, +34204=>5213, +34193=>5214, +34196=>5215, +34223=>5216, +34203=>5217, +34183=>5218, +34216=>5219, +34186=>5220, +34214=>5221, +34407=>5222, +34752=>5223, +34769=>5224, +34739=>5225, +34770=>5226, +34758=>5227, +34731=>5228, +34747=>5229, +34746=>5230, +34760=>5231, +34763=>5232, +35131=>5233, +35126=>5234, +35140=>5235, +35128=>5236, +35133=>5237, +35244=>5238, +35598=>5239, +35607=>5240, +35609=>5241, +35611=>5242, +35594=>5243, +35616=>5244, +35613=>5245, +35588=>5246, +35600=>5247, +35905=>5248, +35903=>5249, +35955=>5250, +36090=>5251, +36093=>5252, +36092=>5253, +36088=>5254, +36091=>5255, +36264=>5256, +36425=>5257, +36427=>5258, +36424=>5259, +36426=>5260, +36676=>5261, +36670=>5262, +36674=>5263, +36677=>5264, +36671=>5265, +36991=>5266, +36989=>5267, +36996=>5268, +36993=>5269, +36994=>5270, +36992=>5271, +37177=>5272, +37283=>5273, +37278=>5274, +37276=>5275, +37709=>5276, +37762=>5277, +37672=>5278, +37749=>5279, +37706=>5280, +37733=>5281, +37707=>5282, +37656=>5283, +37758=>5284, +37740=>5285, +37723=>5286, +37744=>5287, +37722=>5288, +37716=>5289, +38346=>5290, +38347=>5291, +38348=>5292, +38344=>5293, +38342=>5294, +38577=>5295, +38584=>5296, +38614=>5297, +38684=>5298, +38686=>5299, +38816=>5300, +38867=>5301, +38982=>5302, +39094=>5303, +39221=>5304, +39425=>5305, +39423=>5306, +39854=>5307, +39851=>5308, +39850=>5309, +39853=>5310, +40251=>5311, +40255=>5312, +40587=>5313, +40655=>5314, +40670=>5315, +40668=>5316, +40669=>5317, +40667=>5318, +40766=>5319, +40779=>5320, +21474=>5321, +22165=>5322, +22190=>5323, +22745=>5324, +22744=>5325, +23352=>5326, +24413=>5327, +25059=>5328, +25139=>5329, +25844=>5330, +25842=>5331, +25854=>5332, +25862=>5333, +25850=>5334, +25851=>5335, +25847=>5336, +26039=>5337, +26332=>5338, +26406=>5339, +27315=>5340, +27308=>5341, +27331=>5342, +27323=>5343, +27320=>5344, +27330=>5345, +27310=>5346, +27311=>5347, +27487=>5348, +27512=>5349, +27567=>5350, +28681=>5351, +28683=>5352, +28670=>5353, +28678=>5354, +28666=>5355, +28689=>5356, +28687=>5357, +29179=>5358, +29180=>5359, +29182=>5360, +29176=>5361, +29559=>5362, +29557=>5363, +29863=>5364, +29887=>5365, +29973=>5366, +30294=>5367, +30296=>5368, +30290=>5369, +30653=>5370, +30655=>5371, +30651=>5372, +30652=>5373, +30990=>5374, +31150=>5375, +31329=>5376, +31330=>5377, +31328=>5378, +31428=>5379, +31429=>5380, +31787=>5381, +31783=>5382, +31786=>5383, +31774=>5384, +31779=>5385, +31777=>5386, +31975=>5387, +32340=>5388, +32341=>5389, +32350=>5390, +32346=>5391, +32353=>5392, +32338=>5393, +32345=>5394, +32584=>5395, +32761=>5396, +32763=>5397, +32887=>5398, +32886=>5399, +33229=>5400, +33231=>5401, +33290=>5402, +34255=>5403, +34217=>5404, +34253=>5405, +34256=>5406, +34249=>5407, +34224=>5408, +34234=>5409, +34233=>5410, +34799=>5411, +34796=>5412, +34802=>5413, +34784=>5414, +35206=>5415, +35250=>5416, +35316=>5417, +35624=>5418, +35641=>5419, +35628=>5420, +35627=>5421, +35920=>5422, +36101=>5423, +36441=>5424, +36451=>5425, +36454=>5426, +36452=>5427, +36447=>5428, +36437=>5429, +36544=>5430, +36681=>5431, +36685=>5432, +36999=>5433, +36995=>5434, +37000=>5435, +37291=>5436, +37292=>5437, +37328=>5438, +37780=>5439, +37770=>5440, +37782=>5441, +37794=>5442, +37811=>5443, +37806=>5444, +37804=>5445, +37808=>5446, +37784=>5447, +37786=>5448, +37783=>5449, +38356=>5450, +38358=>5451, +38352=>5452, +38357=>5453, +38626=>5454, +38620=>5455, +38617=>5456, +38619=>5457, +38622=>5458, +38692=>5459, +38819=>5460, +38822=>5461, +38829=>5462, +38905=>5463, +38989=>5464, +38991=>5465, +38988=>5466, +38990=>5467, +38995=>5468, +39098=>5469, +39230=>5470, +39231=>5471, +39229=>5472, +39214=>5473, +39333=>5474, +39438=>5475, +39617=>5476, +39683=>5477, +39686=>5478, +39759=>5479, +39758=>5480, +39757=>5481, +39882=>5482, +39881=>5483, +39933=>5484, +39880=>5485, +39872=>5486, +40273=>5487, +40285=>5488, +40288=>5489, +40672=>5490, +40725=>5491, +40748=>5492, +20787=>5493, +22181=>5494, +22184=>5495, +22750=>5496, +22751=>5497, +22754=>5498, +23541=>5499, +40848=>5500, +24300=>5501, +25074=>5502, +25079=>5503, +25078=>5504, +25077=>5505, +25856=>5506, +25871=>5507, +26336=>5508, +26333=>5509, +27365=>5510, +27357=>5511, +27354=>5512, +27347=>5513, +28699=>5514, +28703=>5515, +28712=>5516, +28698=>5517, +28701=>5518, +28693=>5519, +28696=>5520, +29190=>5521, +29197=>5522, +29272=>5523, +29346=>5524, +29560=>5525, +29562=>5526, +29885=>5527, +29898=>5528, +29923=>5529, +30087=>5530, +30086=>5531, +30303=>5532, +30305=>5533, +30663=>5534, +31001=>5535, +31153=>5536, +31339=>5537, +31337=>5538, +31806=>5539, +31807=>5540, +31800=>5541, +31805=>5542, +31799=>5543, +31808=>5544, +32363=>5545, +32365=>5546, +32377=>5547, +32361=>5548, +32362=>5549, +32371=>5550, +32645=>5551, +32694=>5552, +32697=>5553, +32696=>5554, +33240=>5555, +34281=>5556, +34269=>5557, +34282=>5558, +34261=>5559, +34276=>5560, +34277=>5561, +34295=>5562, +34811=>5563, +34821=>5564, +34829=>5565, +34809=>5566, +34814=>5567, +35168=>5568, +35167=>5569, +35158=>5570, +35166=>5571, +35649=>5572, +35676=>5573, +35672=>5574, +35657=>5575, +35674=>5576, +35662=>5577, +35663=>5578, +35654=>5579, +35673=>5580, +36104=>5581, +36106=>5582, +36476=>5583, +36466=>5584, +36487=>5585, +36470=>5586, +36460=>5587, +36474=>5588, +36468=>5589, +36692=>5590, +36686=>5591, +36781=>5592, +37002=>5593, +37003=>5594, +37297=>5595, +37294=>5596, +37857=>5597, +37841=>5598, +37855=>5599, +37827=>5600, +37832=>5601, +37852=>5602, +37853=>5603, +37846=>5604, +37858=>5605, +37837=>5606, +37848=>5607, +37860=>5608, +37847=>5609, +37864=>5610, +38364=>5611, +38580=>5612, +38627=>5613, +38698=>5614, +38695=>5615, +38753=>5616, +38876=>5617, +38907=>5618, +39006=>5619, +39000=>5620, +39003=>5621, +39100=>5622, +39237=>5623, +39241=>5624, +39446=>5625, +39449=>5626, +39693=>5627, +39912=>5628, +39911=>5629, +39894=>5630, +39899=>5631, +40329=>5632, +40289=>5633, +40306=>5634, +40298=>5635, +40300=>5636, +40594=>5637, +40599=>5638, +40595=>5639, +40628=>5640, +21240=>5641, +22199=>5642, +22198=>5643, +22196=>5644, +22204=>5645, +22756=>5646, +23360=>5647, +23363=>5648, +23421=>5649, +23542=>5650, +24009=>5651, +25080=>5652, +25082=>5653, +25880=>5654, +25876=>5655, +25881=>5656, +26342=>5657, +26407=>5658, +27372=>5659, +28734=>5660, +28720=>5661, +28722=>5662, +29200=>5663, +29563=>5664, +29903=>5665, +30306=>5666, +30309=>5667, +31014=>5668, +31018=>5669, +31020=>5670, +31019=>5671, +31431=>5672, +31478=>5673, +31820=>5674, +31811=>5675, +31821=>5676, +31983=>5677, +31984=>5678, +36782=>5679, +32381=>5680, +32380=>5681, +32386=>5682, +32588=>5683, +32768=>5684, +33242=>5685, +33382=>5686, +34299=>5687, +34297=>5688, +34321=>5689, +34298=>5690, +34310=>5691, +34315=>5692, +34311=>5693, +34314=>5694, +34836=>5695, +34837=>5696, +35172=>5697, +35258=>5698, +35320=>5699, +35696=>5700, +35692=>5701, +35686=>5702, +35695=>5703, +35679=>5704, +35691=>5705, +36111=>5706, +36109=>5707, +36489=>5708, +36481=>5709, +36485=>5710, +36482=>5711, +37300=>5712, +37323=>5713, +37912=>5714, +37891=>5715, +37885=>5716, +38369=>5717, +38704=>5718, +39108=>5719, +39250=>5720, +39249=>5721, +39336=>5722, +39467=>5723, +39472=>5724, +39479=>5725, +39477=>5726, +39955=>5727, +39949=>5728, +40569=>5729, +40629=>5730, +40680=>5731, +40751=>5732, +40799=>5733, +40803=>5734, +40801=>5735, +20791=>5736, +20792=>5737, +22209=>5738, +22208=>5739, +22210=>5740, +22804=>5741, +23660=>5742, +24013=>5743, +25084=>5744, +25086=>5745, +25885=>5746, +25884=>5747, +26005=>5748, +26345=>5749, +27387=>5750, +27396=>5751, +27386=>5752, +27570=>5753, +28748=>5754, +29211=>5755, +29351=>5756, +29910=>5757, +29908=>5758, +30313=>5759, +30675=>5760, +31824=>5761, +32399=>5762, +32396=>5763, +32700=>5764, +34327=>5765, +34349=>5766, +34330=>5767, +34851=>5768, +34850=>5769, +34849=>5770, +34847=>5771, +35178=>5772, +35180=>5773, +35261=>5774, +35700=>5775, +35703=>5776, +35709=>5777, +36115=>5778, +36490=>5779, +36493=>5780, +36491=>5781, +36703=>5782, +36783=>5783, +37306=>5784, +37934=>5785, +37939=>5786, +37941=>5787, +37946=>5788, +37944=>5789, +37938=>5790, +37931=>5791, +38370=>5792, +38712=>5793, +38713=>5794, +38706=>5795, +38911=>5796, +58586=>5796, +39015=>5797, +39013=>5798, +39255=>5799, +39493=>5800, +39491=>5801, +39488=>5802, +39486=>5803, +39631=>5804, +39764=>5805, +39761=>5806, +39981=>5807, +39973=>5808, +40367=>5809, +40372=>5810, +40386=>5811, +40376=>5812, +40605=>5813, +40687=>5814, +40729=>5815, +40796=>5816, +40806=>5817, +40807=>5818, +20796=>5819, +20795=>5820, +22216=>5821, +22218=>5822, +22217=>5823, +23423=>5824, +24020=>5825, +24018=>5826, +24398=>5827, +25087=>5828, +25892=>5829, +27402=>5830, +27489=>5831, +28753=>5832, +28760=>5833, +29568=>5834, +29924=>5835, +30090=>5836, +30318=>5837, +30316=>5838, +31155=>5839, +31840=>5840, +31839=>5841, +32894=>5842, +32893=>5843, +33247=>5844, +35186=>5845, +35183=>5846, +35324=>5847, +35712=>5848, +36118=>5849, +36119=>5850, +36497=>5851, +36499=>5852, +36705=>5853, +37192=>5854, +37956=>5855, +37969=>5856, +37970=>5857, +38717=>5858, +38718=>5859, +38851=>5860, +38849=>5861, +39019=>5862, +39253=>5863, +39509=>5864, +39501=>5865, +39634=>5866, +39706=>5867, +40009=>5868, +39985=>5869, +39998=>5870, +39995=>5871, +40403=>5872, +40407=>5873, +40756=>5874, +40812=>5875, +40810=>5876, +40852=>5877, +22220=>5878, +24022=>5879, +25088=>5880, +25891=>5881, +25899=>5882, +25898=>5883, +26348=>5884, +27408=>5885, +29914=>5886, +31434=>5887, +31844=>5888, +31843=>5889, +31845=>5890, +32403=>5891, +32406=>5892, +32404=>5893, +33250=>5894, +34360=>5895, +34367=>5896, +34865=>5897, +35722=>5898, +37008=>5899, +37007=>5900, +37987=>5901, +37984=>5902, +37988=>5903, +38760=>5904, +39023=>5905, +39260=>5906, +39514=>5907, +39515=>5908, +39511=>5909, +39635=>5910, +39636=>5911, +39633=>5912, +40020=>5913, +40023=>5914, +40022=>5915, +40421=>5916, +40607=>5917, +40692=>5918, +22225=>5919, +22761=>5920, +25900=>5921, +28766=>5922, +30321=>5923, +30322=>5924, +30679=>5925, +60226=>5925, +32592=>5926, +32648=>5927, +34870=>5928, +34873=>5929, +34914=>5930, +35731=>5931, +35730=>5932, +35734=>5933, +33399=>5934, +36123=>5935, +37312=>5936, +37994=>5937, +38722=>5938, +38728=>5939, +38724=>5940, +38854=>5941, +39024=>5942, +39519=>5943, +39714=>5944, +39768=>5945, +40031=>5946, +40441=>5947, +40442=>5948, +40572=>5949, +40573=>5950, +40711=>5951, +40823=>5952, +40818=>5953, +24307=>5954, +27414=>5955, +28771=>5956, +31852=>5957, +31854=>5958, +34875=>5959, +35264=>5960, +36513=>5961, +37313=>5962, +38002=>5963, +38000=>5964, +39025=>5965, +39262=>5966, +39638=>5967, +39715=>5968, +40652=>5969, +28772=>5970, +30682=>5971, +35738=>5972, +38007=>5973, +38857=>5974, +39522=>5975, +39525=>5976, +32412=>5977, +35740=>5978, +36522=>5979, +37317=>5980, +38013=>5981, +38014=>5982, +38012=>5983, +40055=>5984, +40056=>5985, +40695=>5986, +35924=>5987, +38015=>5988, +40474=>5989, +29224=>5990, +39530=>5991, +39729=>5992, +40475=>5993, +40478=>5994, +31858=>5995, +20034=>5996, +20060=>5997, +12048=>5998, +20981=>5998, +12053=>5999, +21274=>5999, +12058=>6000, +21378=>6000, +19975=>6001, +19980=>6002, +20039=>6003, +20109=>6004, +12062=>6005, +22231=>6005, +12076=>6006, +23662=>6006, +12091=>6007, +24435=>6007, +19983=>6008, +20871=>6009, +19982=>6010, +20014=>6011, +20115=>6012, +20162=>6013, +20169=>6014, +20168=>6015, +20888=>6016, +21244=>6017, +21356=>6018, +21433=>6019, +22304=>6020, +22787=>6021, +22828=>6022, +23568=>6023, +60417=>6023, +24063=>6024, +26081=>6025, +12110=>6026, +27571=>6026, +27596=>6027, +12115=>6028, +27668=>6028, +12121=>6029, +29247=>6029, +20017=>6030, +20028=>6031, +20200=>6032, +20188=>6033, +20201=>6034, +20193=>6035, +20189=>6036, +20186=>6037, +21004=>6038, +21001=>6039, +21276=>6040, +21324=>6041, +22306=>6042, +22307=>6043, +22807=>6044, +22831=>6045, +23425=>6046, +23428=>6047, +23570=>6048, +23611=>6049, +23668=>6050, +23667=>6051, +24068=>6052, +24192=>6053, +24194=>6054, +24521=>6055, +25097=>6056, +25168=>6057, +27669=>6058, +27702=>6059, +27715=>6060, +27711=>6061, +27707=>6062, +29358=>6063, +29360=>6064, +29578=>6065, +12145=>6066, +31160=>6066, +32906=>6067, +38430=>6068, +20238=>6069, +20248=>6070, +20268=>6071, +20213=>6072, +20244=>6073, +20209=>6074, +20224=>6075, +20215=>6076, +20232=>6077, +20253=>6078, +20226=>6079, +20229=>6080, +20258=>6081, +20243=>6082, +20228=>6083, +20212=>6084, +20242=>6085, +20913=>6086, +21011=>6087, +21008=>6088, +21158=>6089, +21282=>6090, +21279=>6091, +21325=>6092, +21386=>6093, +21511=>6094, +22241=>6095, +22239=>6096, +22318=>6097, +22314=>6098, +22324=>6099, +22844=>6100, +22912=>6101, +22908=>6102, +22917=>6103, +22907=>6104, +22910=>6105, +22903=>6106, +22911=>6107, +23382=>6108, +23573=>6109, +23589=>6110, +23676=>6111, +23674=>6112, +23675=>6113, +23678=>6114, +24031=>6115, +24181=>6116, +57646=>6116, +24196=>6117, +24322=>6118, +24346=>6119, +24436=>6120, +24533=>6121, +24532=>6122, +24527=>6123, +25180=>6124, +25182=>6125, +25188=>6126, +25185=>6127, +25190=>6128, +25186=>6129, +25177=>6130, +25184=>6131, +25178=>6132, +25189=>6133, +25911=>6134, +26095=>6135, +26094=>6136, +26430=>6137, +26425=>6138, +26424=>6139, +26427=>6140, +26426=>6141, +26431=>6142, +26428=>6143, +26419=>6144, +27672=>6145, +27718=>6146, +27730=>6147, +27740=>6148, +27727=>6149, +27722=>6150, +60796=>6150, +27732=>6151, +27723=>6152, +27724=>6153, +28785=>6154, +29278=>6155, +29364=>6156, +29365=>6157, +29582=>6158, +29994=>6159, +30335=>6160, +31349=>6161, +12153=>6162, +32593=>6162, +12171=>6163, +33400=>6163, +33404=>6164, +33408=>6165, +33405=>6166, +33407=>6167, +12172=>6168, +34381=>6168, +12177=>6169, +35198=>6169, +37017=>6170, +59347=>6171, +37015=>6171, +37016=>6172, +37019=>6173, +37012=>6174, +38434=>6175, +38436=>6176, +38432=>6177, +38435=>6178, +20310=>6179, +20283=>6180, +20322=>6181, +20297=>6182, +20307=>6183, +20324=>6184, +20286=>6185, +20327=>6186, +20306=>6187, +20319=>6188, +20289=>6189, +20312=>6190, +20269=>6191, +20275=>6192, +20287=>6193, +20321=>6194, +20879=>6195, +20921=>6196, +21020=>6197, +21022=>6198, +21025=>6199, +21165=>6200, +21166=>6201, +21257=>6202, +21347=>6203, +21362=>6204, +21390=>6205, +21391=>6206, +21552=>6207, +21559=>6208, +21546=>6209, +21588=>6210, +21573=>6211, +21529=>6212, +21532=>6213, +21541=>6214, +21528=>6215, +21565=>6216, +21583=>6217, +21569=>6218, +21544=>6219, +21540=>6220, +21575=>6221, +22254=>6222, +22247=>6223, +22245=>6224, +22337=>6225, +22341=>6226, +22348=>6227, +22345=>6228, +22347=>6229, +22354=>6230, +22790=>6231, +22848=>6232, +22950=>6233, +22936=>6234, +22944=>6235, +22935=>6236, +22926=>6237, +22946=>6238, +22928=>6239, +22927=>6240, +22951=>6241, +22945=>6242, +23438=>6243, +23442=>6244, +23592=>6245, +23594=>6246, +23693=>6247, +23695=>6248, +23688=>6249, +23691=>6250, +23689=>6251, +23698=>6252, +23690=>6253, +23686=>6254, +23699=>6255, +23701=>6256, +24032=>6257, +24074=>6258, +24078=>6259, +24203=>6260, +24201=>6261, +24204=>6262, +24200=>6263, +24205=>6264, +24325=>6265, +24349=>6266, +24440=>6267, +24438=>6268, +24530=>6269, +24529=>6270, +24528=>6271, +24557=>6272, +24552=>6273, +24558=>6274, +24563=>6275, +24545=>6276, +24548=>6277, +24547=>6278, +24570=>6279, +24559=>6280, +24567=>6281, +24571=>6282, +24576=>6283, +24564=>6284, +25146=>6285, +25219=>6286, +25228=>6287, +25230=>6288, +25231=>6289, +25236=>6290, +25223=>6291, +25201=>6292, +25211=>6293, +25210=>6294, +25200=>6295, +25217=>6296, +25224=>6297, +25207=>6298, +25213=>6299, +25202=>6300, +25204=>6301, +26096=>6302, +26100=>6303, +26099=>6304, +26098=>6305, +26101=>6306, +26437=>6307, +26439=>6308, +26457=>6309, +26453=>6310, +26444=>6311, +26440=>6312, +26461=>6313, +26445=>6314, +26458=>6315, +26443=>6316, +27600=>6317, +27673=>6318, +27674=>6319, +27768=>6320, +27751=>6321, +27755=>6322, +27780=>6323, +27787=>6324, +27791=>6325, +27761=>6326, +27759=>6327, +27753=>6328, +27802=>6329, +27757=>6330, +27783=>6331, +27797=>6332, +27804=>6333, +57900=>6333, +27750=>6334, +27763=>6335, +27749=>6336, +27771=>6337, +27790=>6338, +28788=>6339, +28794=>6340, +29283=>6341, +29375=>6342, +29373=>6343, +29379=>6344, +29382=>6345, +29377=>6346, +29370=>6347, +29381=>6348, +29589=>6349, +29591=>6350, +29587=>6351, +29588=>6352, +29586=>6353, +30010=>6354, +30009=>6355, +30100=>6356, +30101=>6357, +30337=>6358, +31037=>6359, +32820=>6360, +32917=>6361, +32921=>6362, +32912=>6363, +32914=>6364, +32924=>6365, +33424=>6366, +33423=>6367, +33413=>6368, +33422=>6369, +33425=>6370, +33427=>6371, +33418=>6372, +33411=>6373, +33412=>6374, +12184=>6375, +35960=>6375, +36809=>6376, +36799=>6377, +37023=>6378, +37025=>6379, +37029=>6380, +37022=>6381, +37031=>6382, +37024=>6383, +38448=>6384, +38440=>6385, +38447=>6386, +38445=>6387, +20019=>6388, +20376=>6389, +20348=>6390, +20357=>6391, +20349=>6392, +20352=>6393, +20359=>6394, +20342=>6395, +20340=>6396, +20361=>6397, +20356=>6398, +20343=>6399, +20300=>6400, +20375=>6401, +20330=>6402, +20378=>6403, +20345=>6404, +20353=>6405, +20344=>6406, +20368=>6407, +20380=>6408, +20372=>6409, +20382=>6410, +20370=>6411, +20354=>6412, +20373=>6413, +20331=>6414, +20334=>6415, +20894=>6416, +20924=>6417, +20926=>6418, +21045=>6419, +21042=>6420, +21043=>6421, +21062=>6422, +21041=>6423, +21180=>6424, +21258=>6425, +21259=>6426, +21308=>6427, +21394=>6428, +21396=>6429, +21639=>6430, +21631=>6431, +21633=>6432, +21649=>6433, +21634=>6434, +21640=>6435, +21611=>6436, +21626=>6437, +21630=>6438, +21605=>6439, +21612=>6440, +21620=>6441, +21606=>6442, +21645=>6443, +21615=>6444, +21601=>6445, +21600=>6446, +21656=>6447, +21603=>6448, +21607=>6449, +21604=>6450, +22263=>6451, +22265=>6452, +22383=>6453, +22386=>6454, +22381=>6455, +22379=>6456, +22385=>6457, +22384=>6458, +22390=>6459, +22400=>6460, +22389=>6461, +22395=>6462, +22387=>6463, +22388=>6464, +22370=>6465, +22376=>6466, +22397=>6467, +22796=>6468, +22853=>6469, +22965=>6470, +22970=>6471, +22991=>6472, +22990=>6473, +22962=>6474, +22988=>6475, +22977=>6476, +22966=>6477, +22972=>6478, +22979=>6479, +22998=>6480, +22961=>6481, +22973=>6482, +22976=>6483, +22984=>6484, +22964=>6485, +22983=>6486, +23394=>6487, +23397=>6488, +23443=>6489, +23445=>6490, +23620=>6491, +23623=>6492, +23726=>6493, +23716=>6494, +23712=>6495, +23733=>6496, +23727=>6497, +23720=>6498, +23724=>6499, +23711=>6500, +23715=>6501, +23725=>6502, +23714=>6503, +23722=>6504, +23719=>6505, +23709=>6506, +23717=>6507, +23734=>6508, +23728=>6509, +23718=>6510, +24087=>6511, +24084=>6512, +24089=>6513, +24360=>6514, +24354=>6515, +24355=>6516, +24356=>6517, +24404=>6518, +24450=>6519, +24446=>6520, +24445=>6521, +24542=>6522, +24549=>6523, +24621=>6524, +24614=>6525, +24601=>6526, +24626=>6527, +24587=>6528, +24628=>6529, +24586=>6530, +24599=>6531, +24627=>6532, +24602=>6533, +24606=>6534, +24620=>6535, +24610=>6536, +24589=>6537, +24592=>6538, +24622=>6539, +24595=>6540, +24593=>6541, +24588=>6542, +24585=>6543, +24604=>6544, +25108=>6545, +25149=>6546, +25261=>6547, +25268=>6548, +25297=>6549, +25278=>6550, +25258=>6551, +25270=>6552, +25290=>6553, +25262=>6554, +25267=>6555, +25263=>6556, +25275=>6557, +25257=>6558, +25264=>6559, +25272=>6560, +25917=>6561, +26024=>6562, +26043=>6563, +26121=>6564, +26108=>6565, +26116=>6566, +26130=>6567, +26120=>6568, +26107=>6569, +26115=>6570, +26123=>6571, +26125=>6572, +26117=>6573, +26109=>6574, +26129=>6575, +26128=>6576, +26358=>6577, +26378=>6578, +26501=>6579, +26476=>6580, +26510=>6581, +26514=>6582, +26486=>6583, +26491=>6584, +26520=>6585, +26502=>6586, +26500=>6587, +26484=>6588, +26509=>6589, +26508=>6590, +26490=>6591, +26527=>6592, +26513=>6593, +26521=>6594, +26499=>6595, +26493=>6596, +26497=>6597, +26488=>6598, +26489=>6599, +26516=>6600, +27429=>6601, +27520=>6602, +27518=>6603, +27614=>6604, +27677=>6605, +27795=>6606, +27884=>6607, +27883=>6608, +27886=>6609, +27865=>6610, +27830=>6611, +27860=>6612, +27821=>6613, +27879=>6614, +27831=>6615, +27856=>6616, +27842=>6617, +27834=>6618, +27843=>6619, +27846=>6620, +27885=>6621, +27890=>6622, +27858=>6623, +27869=>6624, +27828=>6625, +27786=>6626, +27805=>6627, +27776=>6628, +27870=>6629, +27840=>6630, +27952=>6631, +27853=>6632, +27847=>6633, +27824=>6634, +27897=>6635, +27855=>6636, +27881=>6637, +27857=>6638, +28820=>6639, +28824=>6640, +28805=>6641, +28819=>6642, +28806=>6643, +28804=>6644, +28817=>6645, +28822=>6646, +28802=>6647, +28826=>6648, +28803=>6649, +29290=>6650, +29398=>6651, +29387=>6652, +29400=>6653, +29385=>6654, +29404=>6655, +29394=>6656, +29396=>6657, +29402=>6658, +29388=>6659, +29393=>6660, +29604=>6661, +29601=>6662, +29613=>6663, +29606=>6664, +29602=>6665, +29600=>6666, +29612=>6667, +29597=>6668, +29917=>6669, +29928=>6670, +30015=>6671, +30016=>6672, +30014=>6673, +30092=>6674, +30104=>6675, +30383=>6676, +30451=>6677, +30449=>6678, +30448=>6679, +30453=>6680, +30712=>6681, +30716=>6682, +30713=>6683, +30715=>6684, +30714=>6685, +30711=>6686, +31042=>6687, +31039=>6688, +31173=>6689, +31352=>6690, +31355=>6691, +31483=>6692, +31861=>6693, +31997=>6694, +32821=>6695, +32911=>6696, +32942=>6697, +32931=>6698, +32952=>6699, +32949=>6700, +32941=>6701, +33312=>6702, +33440=>6703, +33472=>6704, +33451=>6705, +33434=>6706, +33432=>6707, +33435=>6708, +33461=>6709, +33447=>6710, +33454=>6711, +33468=>6712, +33438=>6713, +33466=>6714, +33460=>6715, +33448=>6716, +33441=>6717, +33449=>6718, +33474=>6719, +33444=>6720, +33475=>6721, +33462=>6722, +33442=>6723, +34416=>6724, +34415=>6725, +34413=>6726, +34414=>6727, +35926=>6728, +36818=>6729, +36811=>6730, +36819=>6731, +36813=>6732, +36822=>6733, +36821=>6734, +36823=>6735, +37042=>6736, +37044=>6737, +37039=>6738, +37043=>6739, +37040=>6740, +38457=>6741, +38461=>6742, +38460=>6743, +38458=>6744, +38467=>6745, +20429=>6746, +20421=>6747, +20435=>6748, +20402=>6749, +20425=>6750, +20427=>6751, +20417=>6752, +20436=>6753, +20444=>6754, +20441=>6755, +20411=>6756, +60346=>6756, +20403=>6757, +20443=>6758, +20423=>6759, +20438=>6760, +20410=>6761, +20416=>6762, +20409=>6763, +20460=>6764, +21060=>6765, +21065=>6766, +21184=>6767, +21186=>6768, +21309=>6769, +21372=>6770, +21399=>6771, +21398=>6772, +21401=>6773, +21400=>6774, +21690=>6775, +21665=>6776, +21677=>6777, +21669=>6778, +21711=>6779, +21699=>6780, +33549=>6781, +21687=>6782, +21678=>6783, +21718=>6784, +21686=>6785, +21701=>6786, +21702=>6787, +21664=>6788, +21616=>6789, +21692=>6790, +21666=>6791, +21694=>6792, +21618=>6793, +21726=>6794, +21680=>6795, +22453=>6796, +22430=>6797, +22431=>6798, +22436=>6799, +22412=>6800, +22423=>6801, +22429=>6802, +22427=>6803, +22420=>6804, +22424=>6805, +22415=>6806, +22425=>6807, +22437=>6808, +22426=>6809, +22421=>6810, +22772=>6811, +22797=>6812, +22867=>6813, +23009=>6814, +23006=>6815, +23022=>6816, +23040=>6817, +23025=>6818, +23005=>6819, +23034=>6820, +23037=>6821, +23036=>6822, +23030=>6823, +23012=>6824, +23026=>6825, +23031=>6826, +23003=>6827, +23017=>6828, +23027=>6829, +23029=>6830, +23008=>6831, +23038=>6832, +23028=>6833, +23021=>6834, +23464=>6835, +23628=>6836, +23760=>6837, +23768=>6838, +23756=>6839, +23767=>6840, +23755=>6841, +23771=>6842, +23774=>6843, +23770=>6844, +23753=>6845, +23751=>6846, +23754=>6847, +23766=>6848, +23763=>6849, +23764=>6850, +23759=>6851, +23752=>6852, +23750=>6853, +23758=>6854, +23775=>6855, +23800=>6856, +24057=>6857, +24097=>6858, +24098=>6859, +24099=>6860, +24096=>6861, +24100=>6862, +24240=>6863, +24228=>6864, +24226=>6865, +24219=>6866, +24227=>6867, +24229=>6868, +24327=>6869, +24366=>6870, +24406=>6871, +24454=>6872, +24631=>6873, +24633=>6874, +24660=>6875, +24690=>6876, +24670=>6877, +24645=>6878, +24659=>6879, +24647=>6880, +24649=>6881, +24667=>6882, +24652=>6883, +24640=>6884, +24642=>6885, +24671=>6886, +24612=>6887, +24644=>6888, +24664=>6889, +24678=>6890, +24686=>6891, +25154=>6892, +25155=>6893, +25295=>6894, +25357=>6895, +25355=>6896, +25333=>6897, +25358=>6898, +25347=>6899, +25323=>6900, +25337=>6901, +25359=>6902, +25356=>6903, +25336=>6904, +25334=>6905, +25344=>6906, +25363=>6907, +25364=>6908, +25338=>6909, +25365=>6910, +25339=>6911, +25328=>6912, +25921=>6913, +25923=>6914, +26026=>6915, +26047=>6916, +26166=>6917, +26145=>6918, +26162=>6919, +26165=>6920, +26140=>6921, +26150=>6922, +26146=>6923, +26163=>6924, +26155=>6925, +26170=>6926, +26141=>6927, +26164=>6928, +26169=>6929, +26158=>6930, +26383=>6931, +26384=>6932, +26561=>6933, +26610=>6934, +26568=>6935, +26554=>6936, +26588=>6937, +26555=>6938, +26616=>6939, +26584=>6940, +26560=>6941, +26551=>6942, +26565=>6943, +26603=>6944, +26596=>6945, +26591=>6946, +26549=>6947, +26573=>6948, +26547=>6949, +26615=>6950, +26614=>6951, +26606=>6952, +26595=>6953, +26562=>6954, +26553=>6955, +26574=>6956, +26599=>6957, +26608=>6958, +26546=>6959, +26620=>6960, +26566=>6961, +26605=>6962, +26572=>6963, +26542=>6964, +26598=>6965, +26587=>6966, +26618=>6967, +26569=>6968, +26570=>6969, +26563=>6970, +26602=>6971, +26571=>6972, +27432=>6973, +27522=>6974, +27524=>6975, +27574=>6976, +27606=>6977, +27608=>6978, +27616=>6979, +27680=>6980, +27681=>6981, +27944=>6982, +27956=>6983, +27949=>6984, +27935=>6985, +27964=>6986, +27967=>6987, +27922=>6988, +27914=>6989, +27866=>6990, +27955=>6991, +27908=>6992, +27929=>6993, +27962=>6994, +27930=>6995, +27921=>6996, +27904=>6997, +27933=>6998, +27970=>6999, +27905=>7000, +27928=>7001, +27959=>7002, +27907=>7003, +27919=>7004, +27968=>7005, +27911=>7006, +27936=>7007, +27948=>7008, +27912=>7009, +27938=>7010, +27913=>7011, +27920=>7012, +28855=>7013, +28831=>7014, +28862=>7015, +28849=>7016, +28848=>7017, +28833=>7018, +28852=>7019, +28853=>7020, +28841=>7021, +29249=>7022, +29257=>7023, +29258=>7024, +29292=>7025, +29296=>7026, +29299=>7027, +29294=>7028, +29386=>7029, +29412=>7030, +29416=>7031, +29419=>7032, +29407=>7033, +29418=>7034, +29414=>7035, +29411=>7036, +29573=>7037, +29644=>7038, +29634=>7039, +29640=>7040, +29637=>7041, +29625=>7042, +29622=>7043, +29621=>7044, +29620=>7045, +29675=>7046, +29631=>7047, +29639=>7048, +29630=>7049, +29635=>7050, +29638=>7051, +29624=>7052, +29643=>7053, +29932=>7054, +29934=>7055, +29998=>7056, +30023=>7057, +30024=>7058, +30119=>7059, +30122=>7060, +30329=>7061, +30404=>7062, +30472=>7063, +30467=>7064, +30468=>7065, +30469=>7066, +30474=>7067, +30455=>7068, +30459=>7069, +30458=>7070, +30695=>7071, +30696=>7072, +30726=>7073, +30737=>7074, +30738=>7075, +30725=>7076, +30736=>7077, +30735=>7078, +30734=>7079, +30729=>7080, +58095=>7080, +30723=>7081, +30739=>7082, +31050=>7083, +31052=>7084, +31051=>7085, +31045=>7086, +31044=>7087, +31189=>7088, +31181=>7089, +31183=>7090, +31190=>7091, +31182=>7092, +31360=>7093, +31358=>7094, +31441=>7095, +31488=>7096, +31489=>7097, +31866=>7098, +31864=>7099, +31865=>7100, +31871=>7101, +31872=>7102, +31873=>7103, +32003=>7104, +32008=>7105, +32001=>7106, +32600=>7107, +32657=>7108, +32653=>7109, +32702=>7110, +32775=>7111, +32782=>7112, +32783=>7113, +32788=>7114, +32823=>7115, +32984=>7116, +32967=>7117, +32992=>7118, +32977=>7119, +32968=>7120, +32962=>7121, +32976=>7122, +32965=>7123, +32995=>7124, +32985=>7125, +32988=>7126, +32970=>7127, +32981=>7128, +32969=>7129, +32975=>7130, +32983=>7131, +32998=>7132, +32973=>7133, +33279=>7134, +33313=>7135, +33428=>7136, +33497=>7137, +33534=>7138, +33529=>7139, +33543=>7140, +33512=>7141, +33536=>7142, +33493=>7143, +33594=>7144, +33515=>7145, +33494=>7146, +33524=>7147, +33516=>7148, +33505=>7149, +33522=>7150, +33525=>7151, +33548=>7152, +33531=>7153, +33526=>7154, +33520=>7155, +33514=>7156, +33508=>7157, +33504=>7158, +33530=>7159, +33523=>7160, +33517=>7161, +34423=>7162, +34420=>7163, +34428=>7164, +34419=>7165, +34881=>7166, +34894=>7167, +34919=>7168, +34922=>7169, +34921=>7170, +35283=>7171, +35332=>7172, +35335=>7173, +36210=>7174, +36835=>7175, +36833=>7176, +36846=>7177, +36832=>7178, +37105=>7179, +37053=>7180, +37055=>7181, +37077=>7182, +37061=>7183, +37054=>7184, +37063=>7185, +37067=>7186, +37064=>7187, +37332=>7188, +60294=>7188, +37331=>7189, +38484=>7190, +38479=>7191, +38481=>7192, +38483=>7193, +38474=>7194, +38478=>7195, +20510=>7196, +20485=>7197, +20487=>7198, +20499=>7199, +20514=>7200, +20528=>7201, +20507=>7202, +20469=>7203, +20468=>7204, +20531=>7205, +20535=>7206, +20524=>7207, +20470=>7208, +20471=>7209, +20503=>7210, +20508=>7211, +20512=>7212, +20519=>7213, +20533=>7214, +20527=>7215, +20529=>7216, +20494=>7217, +20826=>7218, +20884=>7219, +20883=>7220, +20938=>7221, +20932=>7222, +20933=>7223, +20936=>7224, +20942=>7225, +21089=>7226, +21082=>7227, +21074=>7228, +21086=>7229, +21087=>7230, +21077=>7231, +21090=>7232, +21197=>7233, +21262=>7234, +21406=>7235, +21798=>7236, +21730=>7237, +21783=>7238, +21778=>7239, +21735=>7240, +21747=>7241, +21732=>7242, +21786=>7243, +21759=>7244, +21764=>7245, +21768=>7246, +21739=>7247, +21777=>7248, +21765=>7249, +21745=>7250, +21770=>7251, +21755=>7252, +21751=>7253, +21752=>7254, +21728=>7255, +21774=>7256, +21763=>7257, +21771=>7258, +22273=>7259, +22274=>7260, +22476=>7261, +22578=>7262, +22485=>7263, +22482=>7264, +22458=>7265, +22470=>7266, +22461=>7267, +22460=>7268, +22456=>7269, +22454=>7270, +22463=>7271, +22471=>7272, +22480=>7273, +22457=>7274, +22465=>7275, +22798=>7276, +22858=>7277, +23065=>7278, +23062=>7279, +23085=>7280, +23086=>7281, +23061=>7282, +23055=>7283, +23063=>7284, +23050=>7285, +23070=>7286, +23091=>7287, +23404=>7288, +23463=>7289, +23469=>7290, +23468=>7291, +23555=>7292, +23638=>7293, +23636=>7294, +23788=>7295, +23807=>7296, +23790=>7297, +23793=>7298, +23799=>7299, +23808=>7300, +23801=>7301, +24105=>7302, +24104=>7303, +24232=>7304, +24238=>7305, +24234=>7306, +24236=>7307, +24371=>7308, +24368=>7309, +24423=>7310, +24669=>7311, +24666=>7312, +24679=>7313, +24641=>7314, +24738=>7315, +24712=>7316, +24704=>7317, +24722=>7318, +24705=>7319, +24733=>7320, +24707=>7321, +24725=>7322, +24731=>7323, +24727=>7324, +24711=>7325, +24732=>7326, +24718=>7327, +25113=>7328, +25158=>7329, +25330=>7330, +25360=>7331, +25430=>7332, +25388=>7333, +25412=>7334, +25413=>7335, +25398=>7336, +25411=>7337, +25572=>7338, +25401=>7339, +25419=>7340, +25418=>7341, +25404=>7342, +25385=>7343, +25409=>7344, +25396=>7345, +25432=>7346, +25428=>7347, +25433=>7348, +25389=>7349, +25415=>7350, +25395=>7351, +25434=>7352, +25425=>7353, +25400=>7354, +25431=>7355, +25408=>7356, +25416=>7357, +25930=>7358, +25926=>7359, +26054=>7360, +26051=>7361, +26052=>7362, +26050=>7363, +26186=>7364, +26207=>7365, +26183=>7366, +26193=>7367, +26386=>7368, +26387=>7369, +26655=>7370, +26650=>7371, +26697=>7372, +26674=>7373, +26675=>7374, +26683=>7375, +26699=>7376, +26703=>7377, +26646=>7378, +26673=>7379, +26652=>7380, +26677=>7381, +26667=>7382, +26669=>7383, +26671=>7384, +26702=>7385, +26692=>7386, +26676=>7387, +26653=>7388, +26642=>7389, +26644=>7390, +26662=>7391, +26664=>7392, +26670=>7393, +26701=>7394, +26682=>7395, +26661=>7396, +26656=>7397, +27436=>7398, +27439=>7399, +27437=>7400, +27441=>7401, +27444=>7402, +27501=>7403, +32898=>7404, +27528=>7405, +27622=>7406, +27620=>7407, +27624=>7408, +27619=>7409, +27618=>7410, +27623=>7411, +27685=>7412, +28026=>7413, +28003=>7414, +28004=>7415, +28022=>7416, +27917=>7417, +28001=>7418, +28050=>7419, +27992=>7420, +28002=>7421, +28013=>7422, +28015=>7423, +28049=>7424, +28045=>7425, +28143=>7426, +28031=>7427, +28038=>7428, +27998=>7429, +28007=>7430, +59078=>7430, +28000=>7431, +28055=>7432, +28016=>7433, +28028=>7434, +27999=>7435, +28034=>7436, +28056=>7437, +27951=>7438, +28008=>7439, +28043=>7440, +28030=>7441, +28032=>7442, +28036=>7443, +27926=>7444, +28035=>7445, +28027=>7446, +28029=>7447, +28021=>7448, +28048=>7449, +28892=>7450, +28883=>7451, +28881=>7452, +28893=>7453, +28875=>7454, +32569=>7455, +28898=>7456, +28887=>7457, +28882=>7458, +28894=>7459, +28896=>7460, +28884=>7461, +28877=>7462, +28869=>7463, +28870=>7464, +28871=>7465, +28890=>7466, +28878=>7467, +28897=>7468, +29250=>7469, +29304=>7470, +29303=>7471, +29302=>7472, +29440=>7473, +29434=>7474, +29428=>7475, +29438=>7476, +29430=>7477, +29427=>7478, +29435=>7479, +29441=>7480, +29651=>7481, +29657=>7482, +29669=>7483, +29654=>7484, +29628=>7485, +29671=>7486, +29667=>7487, +29673=>7488, +29660=>7489, +29650=>7490, +29659=>7491, +29652=>7492, +29661=>7493, +29658=>7494, +29655=>7495, +29656=>7496, +29672=>7497, +29918=>7498, +29919=>7499, +29940=>7500, +29941=>7501, +29985=>7502, +30043=>7503, +30047=>7504, +30128=>7505, +30145=>7506, +30139=>7507, +30148=>7508, +30144=>7509, +30143=>7510, +30134=>7511, +30138=>7512, +30346=>7513, +30409=>7514, +30493=>7515, +30491=>7516, +30480=>7517, +30483=>7518, +30482=>7519, +30499=>7520, +30481=>7521, +30485=>7522, +30489=>7523, +30490=>7524, +30498=>7525, +30503=>7526, +30755=>7527, +30764=>7528, +30754=>7529, +30773=>7530, +30767=>7531, +30760=>7532, +30766=>7533, +30763=>7534, +30753=>7535, +30761=>7536, +30771=>7537, +30762=>7538, +30769=>7539, +31060=>7540, +31067=>7541, +31055=>7542, +31068=>7543, +31059=>7544, +31058=>7545, +31057=>7546, +31211=>7547, +31212=>7548, +31200=>7549, +31214=>7550, +31213=>7551, +31210=>7552, +31196=>7553, +31198=>7554, +31197=>7555, +31366=>7556, +31369=>7557, +31365=>7558, +31371=>7559, +31372=>7560, +31370=>7561, +31367=>7562, +31448=>7563, +31504=>7564, +31492=>7565, +31507=>7566, +31493=>7567, +31503=>7568, +31496=>7569, +31498=>7570, +31502=>7571, +31497=>7572, +31506=>7573, +31876=>7574, +31889=>7575, +31882=>7576, +31884=>7577, +31880=>7578, +31885=>7579, +31877=>7580, +32030=>7581, +32029=>7582, +32017=>7583, +32014=>7584, +32024=>7585, +32022=>7586, +32019=>7587, +32031=>7588, +32018=>7589, +32015=>7590, +32012=>7591, +32604=>7592, +32609=>7593, +32606=>7594, +32608=>7595, +32605=>7596, +32603=>7597, +32662=>7598, +32658=>7599, +32707=>7600, +32706=>7601, +32704=>7602, +32790=>7603, +32830=>7604, +32825=>7605, +33018=>7606, +33010=>7607, +33017=>7608, +33013=>7609, +33025=>7610, +33019=>7611, +33024=>7612, +33281=>7613, +33327=>7614, +33317=>7615, +33587=>7616, +33581=>7617, +33604=>7618, +33561=>7619, +33617=>7620, +33573=>7621, +33622=>7622, +33599=>7623, +33601=>7624, +33574=>7625, +33564=>7626, +33570=>7627, +33602=>7628, +33614=>7629, +33563=>7630, +33578=>7631, +33544=>7632, +33596=>7633, +33613=>7634, +33558=>7635, +33572=>7636, +33568=>7637, +33591=>7638, +33583=>7639, +33577=>7640, +33607=>7641, +33605=>7642, +33612=>7643, +33619=>7644, +33566=>7645, +33580=>7646, +33611=>7647, +33575=>7648, +33608=>7649, +34387=>7650, +34386=>7651, +34466=>7652, +34472=>7653, +34454=>7654, +34445=>7655, +34449=>7656, +34462=>7657, +34439=>7658, +34455=>7659, +34438=>7660, +34443=>7661, +34458=>7662, +34437=>7663, +34469=>7664, +34457=>7665, +34465=>7666, +34471=>7667, +34453=>7668, +34456=>7669, +34446=>7670, +34461=>7671, +34448=>7672, +34452=>7673, +34883=>7674, +34884=>7675, +34925=>7676, +34933=>7677, +34934=>7678, +34930=>7679, +34944=>7680, +34929=>7681, +34943=>7682, +34927=>7683, +34947=>7684, +34942=>7685, +34932=>7686, +34940=>7687, +35346=>7688, +35911=>7689, +35927=>7690, +35963=>7691, +36004=>7692, +36003=>7693, +36214=>7694, +36216=>7695, +36277=>7696, +36279=>7697, +36278=>7698, +36561=>7699, +36563=>7700, +36862=>7701, +36853=>7702, +36866=>7703, +36863=>7704, +36859=>7705, +36868=>7706, +36860=>7707, +36854=>7708, +37078=>7709, +37088=>7710, +37081=>7711, +37082=>7712, +37091=>7713, +37087=>7714, +37093=>7715, +37080=>7716, +37083=>7717, +37079=>7718, +37084=>7719, +37092=>7720, +37200=>7721, +37198=>7722, +37199=>7723, +37333=>7724, +37346=>7725, +37338=>7726, +38492=>7727, +38495=>7728, +38588=>7729, +39139=>7730, +12221=>7731, +39647=>7731, +12223=>7732, +39727=>7732, +20095=>7733, +20592=>7734, +20586=>7735, +20577=>7736, +20574=>7737, +20576=>7738, +20563=>7739, +20555=>7740, +20573=>7741, +20594=>7742, +20552=>7743, +20557=>7744, +20545=>7745, +20571=>7746, +20554=>7747, +20578=>7748, +20501=>7749, +20549=>7750, +20575=>7751, +20585=>7752, +20587=>7753, +20579=>7754, +20580=>7755, +20550=>7756, +20544=>7757, +20590=>7758, +20595=>7759, +20567=>7760, +20561=>7761, +20944=>7762, +21099=>7763, +21101=>7764, +21100=>7765, +21102=>7766, +21206=>7767, +21203=>7768, +21293=>7769, +21404=>7770, +21877=>7771, +21878=>7772, +21820=>7773, +21837=>7774, +21840=>7775, +21812=>7776, +21802=>7777, +21841=>7778, +21858=>7779, +21814=>7780, +21813=>7781, +21808=>7782, +21842=>7783, +21829=>7784, +21772=>7785, +21810=>7786, +21861=>7787, +21838=>7788, +21817=>7789, +21832=>7790, +21805=>7791, +21819=>7792, +21824=>7793, +21835=>7794, +22282=>7795, +22279=>7796, +22523=>7797, +22548=>7798, +22498=>7799, +22518=>7800, +22492=>7801, +22516=>7802, +22528=>7803, +22509=>7804, +22525=>7805, +22536=>7806, +22520=>7807, +22539=>7808, +22515=>7809, +22479=>7810, +22535=>7811, +22510=>7812, +22499=>7813, +22514=>7814, +22501=>7815, +22508=>7816, +22497=>7817, +22542=>7818, +22524=>7819, +22544=>7820, +22503=>7821, +22529=>7822, +22540=>7823, +22513=>7824, +22505=>7825, +22512=>7826, +22541=>7827, +22532=>7828, +22876=>7829, +23136=>7830, +23128=>7831, +23125=>7832, +23143=>7833, +60437=>7833, +23134=>7834, +23096=>7835, +23093=>7836, +23149=>7837, +23120=>7838, +23135=>7839, +23141=>7840, +23148=>7841, +23123=>7842, +23140=>7843, +23127=>7844, +23107=>7845, +23133=>7846, +23122=>7847, +23108=>7848, +23131=>7849, +23112=>7850, +23182=>7851, +23102=>7852, +23117=>7853, +23097=>7854, +23116=>7855, +23152=>7856, +23145=>7857, +23111=>7858, +23121=>7859, +23126=>7860, +23106=>7861, +23132=>7862, +23410=>7863, +23406=>7864, +23489=>7865, +23488=>7866, +23641=>7867, +23838=>7868, +23819=>7869, +23837=>7870, +23834=>7871, +23840=>7872, +23820=>7873, +23848=>7874, +23821=>7875, +23846=>7876, +23845=>7877, +23823=>7878, +23856=>7879, +23826=>7880, +23843=>7881, +23839=>7882, +23854=>7883, +24126=>7884, +24116=>7885, +24241=>7886, +24244=>7887, +24249=>7888, +24242=>7889, +24243=>7890, +24374=>7891, +24376=>7892, +24475=>7893, +24470=>7894, +24479=>7895, +24714=>7896, +24720=>7897, +24710=>7898, +24766=>7899, +24752=>7900, +24762=>7901, +24787=>7902, +24788=>7903, +24783=>7904, +24804=>7905, +24793=>7906, +24797=>7907, +24776=>7908, +24753=>7909, +24795=>7910, +24759=>7911, +24778=>7912, +24767=>7913, +24771=>7914, +24781=>7915, +24768=>7916, +25394=>7917, +25445=>7918, +25482=>7919, +25474=>7920, +25469=>7921, +25533=>7922, +25502=>7923, +25517=>7924, +25501=>7925, +25495=>7926, +25515=>7927, +25486=>7928, +25455=>7929, +25479=>7930, +25488=>7931, +25454=>7932, +25519=>7933, +25461=>7934, +25500=>7935, +25453=>7936, +25518=>7937, +25468=>7938, +25508=>7939, +25403=>7940, +25503=>7941, +25464=>7942, +25477=>7943, +25473=>7944, +25489=>7945, +25485=>7946, +25456=>7947, +25939=>7948, +26061=>7949, +26213=>7950, +26209=>7951, +26203=>7952, +26201=>7953, +26204=>7954, +26210=>7955, +26392=>7956, +26745=>7957, +26759=>7958, +26768=>7959, +26780=>7960, +26733=>7961, +26734=>7962, +26798=>7963, +26795=>7964, +26966=>7965, +26735=>7966, +26787=>7967, +26796=>7968, +26793=>7969, +26741=>7970, +26740=>7971, +26802=>7972, +26767=>7973, +26743=>7974, +26770=>7975, +26748=>7976, +26731=>7977, +26738=>7978, +26794=>7979, +26752=>7980, +26737=>7981, +26750=>7982, +26779=>7983, +26774=>7984, +26763=>7985, +26784=>7986, +26761=>7987, +26788=>7988, +26744=>7989, +26747=>7990, +26769=>7991, +26764=>7992, +26762=>7993, +26749=>7994, +27446=>7995, +27443=>7996, +27447=>7997, +27448=>7998, +27537=>7999, +27535=>8000, +27533=>8001, +27534=>8002, +27532=>8003, +27690=>8004, +28096=>8005, +28075=>8006, +28084=>8007, +28083=>8008, +28276=>8009, +28076=>8010, +28137=>8011, +28130=>8012, +28087=>8013, +28150=>8014, +28116=>8015, +28160=>8016, +28104=>8017, +28128=>8018, +28127=>8019, +28118=>8020, +28094=>8021, +28133=>8022, +28124=>8023, +28125=>8024, +28123=>8025, +28148=>8026, +28106=>8027, +28093=>8028, +28141=>8029, +28144=>8030, +28090=>8031, +28117=>8032, +28098=>8033, +28111=>8034, +28105=>8035, +28112=>8036, +28146=>8037, +28115=>8038, +28157=>8039, +28119=>8040, +28109=>8041, +28131=>8042, +28091=>8043, +28922=>8044, +28941=>8045, +28919=>8046, +28951=>8047, +28916=>8048, +28940=>8049, +28912=>8050, +28932=>8051, +28915=>8052, +28944=>8053, +28924=>8054, +28927=>8055, +28934=>8056, +28947=>8057, +28928=>8058, +28920=>8059, +28918=>8060, +28939=>8061, +28930=>8062, +28942=>8063, +29310=>8064, +29307=>8065, +29308=>8066, +29311=>8067, +29469=>8068, +29463=>8069, +29447=>8070, +29457=>8071, +29464=>8072, +29450=>8073, +29448=>8074, +29439=>8075, +29455=>8076, +29470=>8077, +29576=>8078, +29686=>8079, +29688=>8080, +29685=>8081, +29700=>8082, +29697=>8083, +29693=>8084, +29703=>8085, +29696=>8086, +29690=>8087, +29692=>8088, +29695=>8089, +29708=>8090, +29707=>8091, +29684=>8092, +29704=>8093, +30052=>8094, +30051=>8095, +30158=>8096, +30162=>8097, +30159=>8098, +30155=>8099, +30156=>8100, +30161=>8101, +30160=>8102, +30351=>8103, +30345=>8104, +30419=>8105, +30521=>8106, +30511=>8107, +30509=>8108, +30513=>8109, +30514=>8110, +30516=>8111, +30515=>8112, +30525=>8113, +30501=>8114, +30523=>8115, +30517=>8116, +30792=>8117, +30802=>8118, +30793=>8119, +30797=>8120, +30794=>8121, +30796=>8122, +30758=>8123, +30789=>8124, +30800=>8125, +31076=>8126, +31079=>8127, +31081=>8128, +31082=>8129, +31075=>8130, +31083=>8131, +31073=>8132, +31163=>8133, +31226=>8134, +31224=>8135, +31222=>8136, +31223=>8137, +31375=>8138, +31380=>8139, +31376=>8140, +31541=>8141, +31547=>8142, +31540=>8143, +31525=>8144, +31536=>8145, +31522=>8146, +31524=>8147, +31539=>8148, +31512=>8149, +31530=>8150, +31517=>8151, +31537=>8152, +31531=>8153, +31533=>8154, +31535=>8155, +31538=>8156, +31544=>8157, +31514=>8158, +31523=>8159, +31892=>8160, +31896=>8161, +31894=>8162, +31907=>8163, +32053=>8164, +32061=>8165, +32056=>8166, +32054=>8167, +32058=>8168, +32069=>8169, +32044=>8170, +32041=>8171, +32065=>8172, +32071=>8173, +32062=>8174, +32063=>8175, +32074=>8176, +32059=>8177, +32040=>8178, +32611=>8179, +32661=>8180, +32668=>8181, +32669=>8182, +32667=>8183, +32714=>8184, +32715=>8185, +32717=>8186, +32720=>8187, +32721=>8188, +32711=>8189, +32719=>8190, +32713=>8191, +32799=>8192, +32798=>8193, +32795=>8194, +32839=>8195, +32835=>8196, +32840=>8197, +33048=>8198, +33061=>8199, +33049=>8200, +33051=>8201, +33069=>8202, +33055=>8203, +33068=>8204, +33054=>8205, +33057=>8206, +33045=>8207, +33063=>8208, +33053=>8209, +33058=>8210, +33297=>8211, +33336=>8212, +33331=>8213, +33338=>8214, +33332=>8215, +33330=>8216, +33396=>8217, +33680=>8218, +33699=>8219, +33704=>8220, +33677=>8221, +33658=>8222, +33651=>8223, +33700=>8224, +33652=>8225, +33679=>8226, +33665=>8227, +33685=>8228, +33689=>8229, +33653=>8230, +33684=>8231, +33705=>8232, +33661=>8233, +33667=>8234, +33676=>8235, +33693=>8236, +33691=>8237, +33706=>8238, +33675=>8239, +33662=>8240, +33701=>8241, +33711=>8242, +33672=>8243, +33687=>8244, +33712=>8245, +33663=>8246, +33702=>8247, +33671=>8248, +33710=>8249, +33654=>8250, +34393=>8251, +34390=>8252, +34495=>8253, +34487=>8254, +34498=>8255, +34497=>8256, +34501=>8257, +34490=>8258, +34480=>8259, +34504=>8260, +34489=>8261, +34483=>8262, +34488=>8263, +34508=>8264, +34484=>8265, +34491=>8266, +34492=>8267, +34499=>8268, +34493=>8269, +34494=>8270, +34898=>8271, +34953=>8272, +34965=>8273, +34984=>8274, +34978=>8275, +34986=>8276, +34970=>8277, +34961=>8278, +34977=>8279, +34975=>8280, +34968=>8281, +34983=>8282, +34969=>8283, +34971=>8284, +34967=>8285, +34980=>8286, +34988=>8287, +34956=>8288, +34963=>8289, +34958=>8290, +35202=>8291, +35286=>8292, +35289=>8293, +35285=>8294, +35376=>8295, +35367=>8296, +35372=>8297, +35358=>8298, +35897=>8299, +35899=>8300, +35932=>8301, +35933=>8302, +35965=>8303, +36005=>8304, +36221=>8305, +36219=>8306, +36217=>8307, +36284=>8308, +36290=>8309, +36281=>8310, +36287=>8311, +36289=>8312, +36568=>8313, +36574=>8314, +36573=>8315, +36572=>8316, +36567=>8317, +36576=>8318, +36577=>8319, +36900=>8320, +36875=>8321, +36881=>8322, +36892=>8323, +36876=>8324, +36897=>8325, +37103=>8326, +37098=>8327, +37104=>8328, +37108=>8329, +37106=>8330, +37107=>8331, +37076=>8332, +37099=>8333, +37100=>8334, +37097=>8335, +37206=>8336, +37208=>8337, +37210=>8338, +37203=>8339, +37205=>8340, +37356=>8341, +37364=>8342, +37361=>8343, +37363=>8344, +37368=>8345, +37348=>8346, +37369=>8347, +37354=>8348, +37355=>8349, +37367=>8350, +37352=>8351, +37358=>8352, +38266=>8353, +38278=>8354, +38280=>8355, +38524=>8356, +38509=>8357, +38507=>8358, +38513=>8359, +38511=>8360, +38591=>8361, +38762=>8362, +38916=>8363, +39141=>8364, +39319=>8365, +20635=>8366, +20629=>8367, +20628=>8368, +20638=>8369, +20619=>8370, +20643=>8371, +20611=>8372, +20620=>8373, +20622=>8374, +20637=>8375, +20584=>8376, +20636=>8377, +20626=>8378, +20610=>8379, +20615=>8380, +20831=>8381, +20948=>8382, +21266=>8383, +21265=>8384, +21412=>8385, +21415=>8386, +21905=>8387, +21928=>8388, +21925=>8389, +21933=>8390, +21879=>8391, +22085=>8392, +21922=>8393, +21907=>8394, +21896=>8395, +21903=>8396, +21941=>8397, +21889=>8398, +21923=>8399, +21906=>8400, +21924=>8401, +21885=>8402, +21900=>8403, +21926=>8404, +21887=>8405, +21909=>8406, +21921=>8407, +21902=>8408, +22284=>8409, +22569=>8410, +22583=>8411, +22553=>8412, +22558=>8413, +22567=>8414, +22563=>8415, +22568=>8416, +22517=>8417, +22600=>8418, +22565=>8419, +22556=>8420, +22555=>8421, +22579=>8422, +22591=>8423, +22582=>8424, +22574=>8425, +22585=>8426, +22584=>8427, +22573=>8428, +22572=>8429, +22587=>8430, +22881=>8431, +23215=>8432, +23188=>8433, +23199=>8434, +23162=>8435, +23202=>8436, +23198=>8437, +23160=>8438, +23206=>8439, +23164=>8440, +23205=>8441, +23212=>8442, +23189=>8443, +23214=>8444, +23095=>8445, +23172=>8446, +23178=>8447, +23191=>8448, +23171=>8449, +23179=>8450, +23209=>8451, +23163=>8452, +23165=>8453, +23180=>8454, +23196=>8455, +23183=>8456, +23187=>8457, +23197=>8458, +23530=>8459, +23501=>8460, +23499=>8461, +23508=>8462, +23505=>8463, +23498=>8464, +23502=>8465, +23564=>8466, +23600=>8467, +23863=>8468, +23875=>8469, +23915=>8470, +23873=>8471, +23883=>8472, +23871=>8473, +23861=>8474, +23889=>8475, +23886=>8476, +23893=>8477, +23859=>8478, +23866=>8479, +23890=>8480, +23869=>8481, +23857=>8482, +23897=>8483, +23874=>8484, +23865=>8485, +23881=>8486, +23864=>8487, +23868=>8488, +23858=>8489, +23862=>8490, +23872=>8491, +23877=>8492, +24132=>8493, +24129=>8494, +24408=>8495, +57673=>8495, +24486=>8496, +24485=>8497, +24491=>8498, +24777=>8499, +24761=>8500, +24780=>8501, +24802=>8502, +24782=>8503, +24772=>8504, +24852=>8505, +24818=>8506, +24842=>8507, +24854=>8508, +24837=>8509, +24821=>8510, +24851=>8511, +24824=>8512, +24828=>8513, +24830=>8514, +24769=>8515, +24835=>8516, +24856=>8517, +24861=>8518, +24848=>8519, +24831=>8520, +24836=>8521, +24843=>8522, +25162=>8523, +25492=>8524, +25521=>8525, +25520=>8526, +25550=>8527, +25573=>8528, +25576=>8529, +25583=>8530, +25539=>8531, +25757=>8532, +25587=>8533, +25546=>8534, +25568=>8535, +25590=>8536, +25557=>8537, +25586=>8538, +25589=>8539, +25697=>8540, +25567=>8541, +25534=>8542, +25565=>8543, +25564=>8544, +25540=>8545, +25560=>8546, +25555=>8547, +25538=>8548, +25543=>8549, +25548=>8550, +25547=>8551, +25544=>8552, +25584=>8553, +25559=>8554, +25561=>8555, +25906=>8556, +25959=>8557, +25962=>8558, +25956=>8559, +25948=>8560, +25960=>8561, +25957=>8562, +25996=>8563, +26013=>8564, +26014=>8565, +26030=>8566, +26064=>8567, +26066=>8568, +26236=>8569, +26220=>8570, +26235=>8571, +26240=>8572, +26225=>8573, +26233=>8574, +26218=>8575, +26226=>8576, +26369=>8577, +26892=>8578, +26835=>8579, +26884=>8580, +26844=>8581, +26922=>8582, +26860=>8583, +26858=>8584, +26865=>8585, +26895=>8586, +26838=>8587, +26871=>8588, +26859=>8589, +26852=>8590, +26870=>8591, +26899=>8592, +26896=>8593, +26867=>8594, +26849=>8595, +26887=>8596, +26828=>8597, +26888=>8598, +26992=>8599, +26804=>8600, +26897=>8601, +26863=>8602, +26822=>8603, +26900=>8604, +26872=>8605, +26832=>8606, +26877=>8607, +26876=>8608, +26856=>8609, +26891=>8610, +26890=>8611, +26903=>8612, +26830=>8613, +26824=>8614, +26845=>8615, +26846=>8616, +26854=>8617, +26868=>8618, +26833=>8619, +26886=>8620, +26836=>8621, +26857=>8622, +26901=>8623, +26917=>8624, +26823=>8625, +27449=>8626, +27451=>8627, +27455=>8628, +27452=>8629, +27540=>8630, +27543=>8631, +27545=>8632, +27541=>8633, +27581=>8634, +27632=>8635, +27634=>8636, +27635=>8637, +27696=>8638, +28156=>8639, +28230=>8640, +28231=>8641, +28191=>8642, +28233=>8643, +28296=>8644, +28220=>8645, +28221=>8646, +28229=>8647, +28258=>8648, +28203=>8649, +28223=>8650, +28225=>8651, +28253=>8652, +28275=>8653, +28188=>8654, +28211=>8655, +28235=>8656, +28224=>8657, +28241=>8658, +28219=>8659, +28163=>8660, +28206=>8661, +28254=>8662, +28264=>8663, +28252=>8664, +28257=>8665, +28209=>8666, +28200=>8667, +28256=>8668, +28273=>8669, +28267=>8670, +28217=>8671, +28194=>8672, +28208=>8673, +28243=>8674, +28261=>8675, +28199=>8676, +28280=>8677, +28260=>8678, +28279=>8679, +28245=>8680, +28281=>8681, +28242=>8682, +28262=>8683, +28213=>8684, +28214=>8685, +28250=>8686, +28960=>8687, +28958=>8688, +28975=>8689, +28923=>8690, +28974=>8691, +28977=>8692, +28963=>8693, +28965=>8694, +28962=>8695, +28978=>8696, +28959=>8697, +28968=>8698, +28986=>8699, +28955=>8700, +29259=>8701, +29274=>8702, +29320=>8703, +29321=>8704, +29318=>8705, +29317=>8706, +29323=>8707, +29458=>8708, +29451=>8709, +29488=>8710, +29474=>8711, +29489=>8712, +29491=>8713, +29479=>8714, +29490=>8715, +29485=>8716, +29478=>8717, +29475=>8718, +29493=>8719, +29452=>8720, +29742=>8721, +29740=>8722, +29744=>8723, +29739=>8724, +29718=>8725, +29722=>8726, +29729=>8727, +29741=>8728, +29745=>8729, +29732=>8730, +29731=>8731, +29725=>8732, +29737=>8733, +29728=>8734, +29746=>8735, +29947=>8736, +29999=>8737, +30063=>8738, +30060=>8739, +30183=>8740, +30170=>8741, +30177=>8742, +30182=>8743, +30173=>8744, +30175=>8745, +30180=>8746, +30167=>8747, +30357=>8748, +30354=>8749, +30426=>8750, +30534=>8751, +30535=>8752, +30532=>8753, +30541=>8754, +30533=>8755, +30538=>8756, +30542=>8757, +30539=>8758, +30540=>8759, +30686=>8760, +30700=>8761, +30816=>8762, +30820=>8763, +30821=>8764, +30812=>8765, +30829=>8766, +30833=>8767, +30826=>8768, +30830=>8769, +30832=>8770, +30825=>8771, +30824=>8772, +30814=>8773, +30818=>8774, +31092=>8775, +31091=>8776, +31090=>8777, +31088=>8778, +31234=>8779, +31242=>8780, +31235=>8781, +31244=>8782, +31236=>8783, +31385=>8784, +31462=>8785, +31460=>8786, +31562=>8787, +31559=>8788, +31556=>8789, +31560=>8790, +31564=>8791, +31566=>8792, +31552=>8793, +31576=>8794, +31557=>8795, +31906=>8796, +31902=>8797, +31912=>8798, +31905=>8799, +32088=>8800, +32111=>8801, +32099=>8802, +32083=>8803, +32086=>8804, +32103=>8805, +32106=>8806, +32079=>8807, +32109=>8808, +32092=>8809, +32107=>8810, +32082=>8811, +32084=>8812, +32105=>8813, +32081=>8814, +32095=>8815, +32078=>8816, +32574=>8817, +32575=>8818, +32613=>8819, +32614=>8820, +32674=>8821, +32672=>8822, +32673=>8823, +32727=>8824, +32849=>8825, +32847=>8826, +32848=>8827, +33022=>8828, +32980=>8829, +33091=>8830, +33098=>8831, +33106=>8832, +33103=>8833, +33095=>8834, +33085=>8835, +33101=>8836, +33082=>8837, +33254=>8838, +33262=>8839, +33271=>8840, +33272=>8841, +33273=>8842, +33284=>8843, +33340=>8844, +33341=>8845, +33343=>8846, +33397=>8847, +33595=>8848, +33743=>8849, +60382=>8849, +33785=>8850, +33827=>8851, +33728=>8852, +33768=>8853, +33810=>8854, +33767=>8855, +33764=>8856, +33788=>8857, +33782=>8858, +33808=>8859, +33734=>8860, +33736=>8861, +33771=>8862, +33763=>8863, +33727=>8864, +33793=>8865, +33757=>8866, +33765=>8867, +33752=>8868, +33791=>8869, +33761=>8870, +33739=>8871, +33742=>8872, +33750=>8873, +33781=>8874, +33737=>8875, +33801=>8876, +33807=>8877, +58332=>8877, +33758=>8878, +33809=>8879, +33798=>8880, +33730=>8881, +33779=>8882, +33749=>8883, +33786=>8884, +33735=>8885, +33745=>8886, +33770=>8887, +33811=>8888, +33690=>8889, +33731=>8890, +33772=>8891, +33774=>8892, +33732=>8893, +33787=>8894, +33751=>8895, +33762=>8896, +33819=>8897, +33755=>8898, +33790=>8899, +34520=>8900, +34530=>8901, +34534=>8902, +34515=>8903, +34531=>8904, +34522=>8905, +34538=>8906, +34525=>8907, +34539=>8908, +34524=>8909, +34540=>8910, +34537=>8911, +34519=>8912, +34536=>8913, +34513=>8914, +34888=>8915, +34902=>8916, +34901=>8917, +35002=>8918, +35031=>8919, +35001=>8920, +35000=>8921, +35008=>8922, +35006=>8923, +34998=>8924, +35004=>8925, +34999=>8926, +35005=>8927, +34994=>8928, +35073=>8929, +35017=>8930, +35221=>8931, +35224=>8932, +35223=>8933, +35293=>8934, +35290=>8935, +35291=>8936, +35406=>8937, +35405=>8938, +35385=>8939, +35417=>8940, +35392=>8941, +35415=>8942, +35416=>8943, +35396=>8944, +35397=>8945, +35410=>8946, +35400=>8947, +35409=>8948, +35402=>8949, +35404=>8950, +35407=>8951, +35935=>8952, +35969=>8953, +35968=>8954, +36026=>8955, +36030=>8956, +36016=>8957, +36025=>8958, +36021=>8959, +36228=>8960, +36224=>8961, +36233=>8962, +36312=>8963, +36307=>8964, +36301=>8965, +36295=>8966, +36310=>8967, +36316=>8968, +36303=>8969, +36309=>8970, +36313=>8971, +36296=>8972, +36311=>8973, +36293=>8974, +36591=>8975, +36599=>8976, +36602=>8977, +36601=>8978, +36582=>8979, +36590=>8980, +36581=>8981, +36597=>8982, +36583=>8983, +36584=>8984, +36598=>8985, +36587=>8986, +36593=>8987, +36588=>8988, +36596=>8989, +36585=>8990, +36909=>8991, +36916=>8992, +36911=>8993, +37126=>8994, +37164=>8995, +37124=>8996, +60367=>8996, +37119=>8997, +37116=>8998, +37128=>8999, +37113=>9000, +37115=>9001, +37121=>9002, +37120=>9003, +37127=>9004, +37125=>9005, +37123=>9006, +37217=>9007, +37220=>9008, +37215=>9009, +37218=>9010, +37216=>9011, +37377=>9012, +37386=>9013, +37413=>9014, +37379=>9015, +37402=>9016, +37414=>9017, +37391=>9018, +37388=>9019, +37376=>9020, +37394=>9021, +37375=>9022, +37373=>9023, +37382=>9024, +37380=>9025, +37415=>9026, +37378=>9027, +37404=>9028, +37412=>9029, +37401=>9030, +37399=>9031, +37381=>9032, +37398=>9033, +38267=>9034, +38285=>9035, +38284=>9036, +38288=>9037, +38535=>9038, +38526=>9039, +38536=>9040, +38537=>9041, +38531=>9042, +38528=>9043, +38594=>9044, +38600=>9045, +38595=>9046, +38641=>9047, +38640=>9048, +38764=>9049, +38768=>9050, +38766=>9051, +38919=>9052, +39081=>9053, +39147=>9054, +40166=>9055, +12235=>9056, +40697=>9056, +20099=>9057, +20100=>9058, +20150=>9059, +20669=>9060, +20671=>9061, +20678=>9062, +20654=>9063, +20676=>9064, +20682=>9065, +20660=>9066, +20680=>9067, +20674=>9068, +20656=>9069, +20673=>9070, +20666=>9071, +20657=>9072, +20683=>9073, +20681=>9074, +20662=>9075, +20664=>9076, +20951=>9077, +21114=>9078, +21112=>9079, +21115=>9080, +21116=>9081, +21955=>9082, +21979=>9083, +21964=>9084, +21968=>9085, +21963=>9086, +21962=>9087, +21981=>9088, +21952=>9089, +64013=>9089, +21972=>9090, +21956=>9091, +21993=>9092, +21951=>9093, +21970=>9094, +21901=>9095, +21967=>9096, +21973=>9097, +21986=>9098, +21974=>9099, +21960=>9100, +22002=>9101, +21965=>9102, +21977=>9103, +21954=>9104, +22292=>9105, +22611=>9106, +22632=>9107, +22628=>9108, +22607=>9109, +22605=>9110, +22601=>9111, +22639=>9112, +22613=>9113, +22606=>9114, +22621=>9115, +22617=>9116, +22629=>9117, +22619=>9118, +22589=>9119, +22627=>9120, +22641=>9121, +22780=>9122, +23239=>9123, +23236=>9124, +23243=>9125, +23226=>9126, +23224=>9127, +23217=>9128, +23221=>9129, +23216=>9130, +23231=>9131, +23240=>9132, +23227=>9133, +23238=>9134, +23223=>9135, +23232=>9136, +23242=>9137, +23220=>9138, +23222=>9139, +23245=>9140, +23225=>9141, +23184=>9142, +23510=>9143, +23512=>9144, +23513=>9145, +23583=>9146, +23603=>9147, +23921=>9148, +23907=>9149, +23882=>9150, +23909=>9151, +23922=>9152, +23916=>9153, +23902=>9154, +23912=>9155, +23911=>9156, +23906=>9157, +24048=>9158, +24143=>9159, +24142=>9160, +24138=>9161, +24141=>9162, +24139=>9163, +24261=>9164, +24268=>9165, +24262=>9166, +24267=>9167, +24263=>9168, +24384=>9169, +24495=>9170, +24493=>9171, +24823=>9172, +24905=>9173, +24906=>9174, +24875=>9175, +24901=>9176, +24886=>9177, +24882=>9178, +24878=>9179, +24902=>9180, +24879=>9181, +24911=>9182, +24873=>9183, +24896=>9184, +25120=>9185, +37224=>9186, +25123=>9187, +25125=>9188, +25124=>9189, +25541=>9190, +25585=>9191, +25579=>9192, +25616=>9193, +25618=>9194, +25609=>9195, +25632=>9196, +25636=>9197, +25651=>9198, +25667=>9199, +25631=>9200, +25621=>9201, +25624=>9202, +25657=>9203, +25655=>9204, +25634=>9205, +25635=>9206, +25612=>9207, +25638=>9208, +25648=>9209, +25640=>9210, +25665=>9211, +25653=>9212, +25647=>9213, +25610=>9214, +25626=>9215, +25664=>9216, +25637=>9217, +25639=>9218, +25611=>9219, +25575=>9220, +25627=>9221, +25646=>9222, +25633=>9223, +25614=>9224, +25967=>9225, +26002=>9226, +26067=>9227, +26246=>9228, +26252=>9229, +26261=>9230, +26256=>9231, +26251=>9232, +26250=>9233, +26265=>9234, +26260=>9235, +26232=>9236, +26400=>9237, +26982=>9238, +26975=>9239, +26936=>9240, +26958=>9241, +26978=>9242, +26993=>9243, +26943=>9244, +26949=>9245, +26986=>9246, +26937=>9247, +26946=>9248, +26967=>9249, +26969=>9250, +27002=>9251, +26952=>9252, +26953=>9253, +26933=>9254, +26988=>9255, +26931=>9256, +26941=>9257, +26981=>9258, +26864=>9259, +27000=>9260, +26932=>9261, +26985=>9262, +26944=>9263, +26991=>9264, +26948=>9265, +26998=>9266, +26968=>9267, +26945=>9268, +26996=>9269, +26956=>9270, +26939=>9271, +26955=>9272, +26935=>9273, +26972=>9274, +26959=>9275, +26961=>9276, +26930=>9277, +26962=>9278, +26927=>9279, +27003=>9280, +26940=>9281, +27462=>9282, +27461=>9283, +27459=>9284, +27458=>9285, +27464=>9286, +27457=>9287, +27547=>9288, +27643=>9289, +27644=>9290, +27641=>9291, +27639=>9292, +27640=>9293, +28315=>9294, +28374=>9295, +28360=>9296, +28303=>9297, +28352=>9298, +28319=>9299, +28307=>9300, +28308=>9301, +28320=>9302, +28337=>9303, +28345=>9304, +28358=>9305, +28370=>9306, +28349=>9307, +28353=>9308, +28318=>9309, +28361=>9310, +28343=>9311, +28336=>9312, +28365=>9313, +28326=>9314, +28367=>9315, +28338=>9316, +28350=>9317, +28355=>9318, +28380=>9319, +28376=>9320, +28313=>9321, +28306=>9322, +28302=>9323, +28301=>9324, +28324=>9325, +28321=>9326, +28351=>9327, +28339=>9328, +28368=>9329, +28362=>9330, +28311=>9331, +28334=>9332, +28323=>9333, +28999=>9334, +29012=>9335, +29010=>9336, +29027=>9337, +29024=>9338, +28993=>9339, +29021=>9340, +29026=>9341, +61080=>9341, +29042=>9342, +29048=>9343, +29034=>9344, +29025=>9345, +28994=>9346, +29016=>9347, +28995=>9348, +29003=>9349, +29040=>9350, +29023=>9351, +29008=>9352, +29011=>9353, +28996=>9354, +29005=>9355, +29018=>9356, +29263=>9357, +29325=>9358, +29324=>9359, +29329=>9360, +29328=>9361, +29326=>9362, +29500=>9363, +29506=>9364, +29499=>9365, +29498=>9366, +29504=>9367, +29514=>9368, +29513=>9369, +29764=>9370, +29770=>9371, +29771=>9372, +29778=>9373, +29777=>9374, +29783=>9375, +29760=>9376, +29775=>9377, +29776=>9378, +29774=>9379, +29762=>9380, +29766=>9381, +29773=>9382, +29780=>9383, +29921=>9384, +29951=>9385, +29950=>9386, +29949=>9387, +29981=>9388, +30073=>9389, +30071=>9390, +27011=>9391, +30191=>9392, +30223=>9393, +30211=>9394, +30199=>9395, +30206=>9396, +30204=>9397, +30201=>9398, +60782=>9398, +30200=>9399, +30224=>9400, +30203=>9401, +30198=>9402, +30189=>9403, +30197=>9404, +30205=>9405, +30361=>9406, +30389=>9407, +30429=>9408, +30549=>9409, +30559=>9410, +30560=>9411, +30546=>9412, +30550=>9413, +30554=>9414, +30569=>9415, +30567=>9416, +30548=>9417, +30553=>9418, +30573=>9419, +30688=>9420, +30855=>9421, +30874=>9422, +30868=>9423, +30863=>9424, +30852=>9425, +30869=>9426, +30853=>9427, +30854=>9428, +30881=>9429, +30851=>9430, +30841=>9431, +30873=>9432, +30848=>9433, +30870=>9434, +30843=>9435, +31100=>9436, +31106=>9437, +31101=>9438, +31097=>9439, +31249=>9440, +31256=>9441, +31257=>9442, +31250=>9443, +31255=>9444, +31253=>9445, +31266=>9446, +31251=>9447, +31259=>9448, +31248=>9449, +31395=>9450, +31394=>9451, +31390=>9452, +31467=>9453, +31590=>9454, +31588=>9455, +31597=>9456, +31604=>9457, +31593=>9458, +31602=>9459, +31589=>9460, +31603=>9461, +31601=>9462, +31600=>9463, +31585=>9464, +31608=>9465, +31606=>9466, +31587=>9467, +31922=>9468, +31924=>9469, +31919=>9470, +32136=>9471, +32134=>9472, +32128=>9473, +32141=>9474, +32127=>9475, +32133=>9476, +32122=>9477, +32142=>9478, +32123=>9479, +32131=>9480, +32124=>9481, +32140=>9482, +32148=>9483, +32132=>9484, +32125=>9485, +32146=>9486, +32621=>9487, +32619=>9488, +32615=>9489, +32616=>9490, +32620=>9491, +32678=>9492, +32677=>9493, +32679=>9494, +32731=>9495, +32732=>9496, +32801=>9497, +33124=>9498, +33120=>9499, +33143=>9500, +33116=>9501, +33129=>9502, +33115=>9503, +33122=>9504, +33138=>9505, +26401=>9506, +33118=>9507, +33142=>9508, +33127=>9509, +33135=>9510, +33092=>9511, +33121=>9512, +33309=>9513, +33353=>9514, +33348=>9515, +33344=>9516, +33346=>9517, +33349=>9518, +34033=>9519, +33855=>9520, +33878=>9521, +33910=>9522, +33913=>9523, +33935=>9524, +33933=>9525, +33893=>9526, +33873=>9527, +33856=>9528, +33926=>9529, +33895=>9530, +33840=>9531, +33869=>9532, +33917=>9533, +33882=>9534, +33881=>9535, +33908=>9536, +33907=>9537, +33885=>9538, +34055=>9539, +33886=>9540, +33847=>9541, +33850=>9542, +33844=>9543, +33914=>9544, +33859=>9545, +33912=>9546, +33842=>9547, +33861=>9548, +33833=>9549, +33753=>9550, +33867=>9551, +33839=>9552, +33858=>9553, +33837=>9554, +33887=>9555, +33904=>9556, +33849=>9557, +33870=>9558, +33868=>9559, +33874=>9560, +33903=>9561, +33989=>9562, +33934=>9563, +33851=>9564, +33863=>9565, +33846=>9566, +33843=>9567, +33896=>9568, +33918=>9569, +33860=>9570, +33835=>9571, +33888=>9572, +33876=>9573, +33902=>9574, +33872=>9575, +34571=>9576, +34564=>9577, +34551=>9578, +34572=>9579, +34554=>9580, +34518=>9581, +34549=>9582, +34637=>9583, +34552=>9584, +34574=>9585, +34569=>9586, +34561=>9587, +34550=>9588, +34573=>9589, +34565=>9590, +35030=>9591, +35019=>9592, +35021=>9593, +35022=>9594, +35038=>9595, +35035=>9596, +35034=>9597, +35020=>9598, +35024=>9599, +35205=>9600, +35227=>9601, +35295=>9602, +35301=>9603, +35300=>9604, +35297=>9605, +35296=>9606, +35298=>9607, +35292=>9608, +35302=>9609, +35446=>9610, +35462=>9611, +35455=>9612, +35425=>9613, +35391=>9614, +35447=>9615, +35458=>9616, +35460=>9617, +35445=>9618, +35459=>9619, +35457=>9620, +35444=>9621, +35450=>9622, +35900=>9623, +35915=>9624, +35914=>9625, +35941=>9626, +35940=>9627, +35942=>9628, +35974=>9629, +35972=>9630, +35973=>9631, +36044=>9632, +36200=>9633, +36201=>9634, +36241=>9635, +36236=>9636, +36238=>9637, +36239=>9638, +36237=>9639, +36243=>9640, +36244=>9641, +36240=>9642, +36242=>9643, +36336=>9644, +36320=>9645, +36332=>9646, +36337=>9647, +36334=>9648, +36304=>9649, +36329=>9650, +36323=>9651, +36322=>9652, +36327=>9653, +36338=>9654, +36331=>9655, +36340=>9656, +36614=>9657, +36607=>9658, +36609=>9659, +36608=>9660, +36613=>9661, +36615=>9662, +36616=>9663, +36610=>9664, +36619=>9665, +60507=>9665, +36946=>9666, +36927=>9667, +36932=>9668, +36937=>9669, +36925=>9670, +37136=>9671, +37133=>9672, +37135=>9673, +37137=>9674, +37142=>9675, +37140=>9676, +37131=>9677, +37134=>9678, +37230=>9679, +37231=>9680, +37448=>9681, +37458=>9682, +37424=>9683, +37434=>9684, +37478=>9685, +37427=>9686, +37477=>9687, +37470=>9688, +37507=>9689, +37422=>9690, +37450=>9691, +37446=>9692, +37485=>9693, +37484=>9694, +37455=>9695, +37472=>9696, +37479=>9697, +37487=>9698, +37430=>9699, +37473=>9700, +37488=>9701, +37425=>9702, +37460=>9703, +37475=>9704, +37456=>9705, +37490=>9706, +37454=>9707, +37459=>9708, +37452=>9709, +37462=>9710, +37426=>9711, +38303=>9712, +38300=>9713, +38302=>9714, +38299=>9715, +38546=>9716, +38547=>9717, +38545=>9718, +38551=>9719, +38606=>9720, +38650=>9721, +38653=>9722, +38648=>9723, +38645=>9724, +38771=>9725, +38775=>9726, +38776=>9727, +38770=>9728, +38927=>9729, +38925=>9730, +38926=>9731, +39084=>9732, +39158=>9733, +39161=>9734, +39343=>9735, +39346=>9736, +39344=>9737, +39349=>9738, +39597=>9739, +39595=>9740, +39771=>9741, +40170=>9742, +40173=>9743, +40167=>9744, +40576=>9745, +12236=>9746, +40701=>9746, +20710=>9747, +20692=>9748, +20695=>9749, +20712=>9750, +20723=>9751, +20699=>9752, +20714=>9753, +20701=>9754, +20708=>9755, +20691=>9756, +20716=>9757, +20720=>9758, +20719=>9759, +20707=>9760, +20704=>9761, +20952=>9762, +21120=>9763, +21121=>9764, +21225=>9765, +21227=>9766, +21296=>9767, +21420=>9768, +22055=>9769, +22037=>9770, +22028=>9771, +22034=>9772, +22012=>9773, +22031=>9774, +22044=>9775, +22017=>9776, +22035=>9777, +22018=>9778, +22010=>9779, +22045=>9780, +22020=>9781, +22015=>9782, +22009=>9783, +22665=>9784, +22652=>9785, +22672=>9786, +22680=>9787, +22662=>9788, +22657=>9789, +22655=>9790, +22644=>9791, +22667=>9792, +22650=>9793, +22663=>9794, +22673=>9795, +22670=>9796, +22646=>9797, +22658=>9798, +22664=>9799, +22651=>9800, +22676=>9801, +22671=>9802, +22782=>9803, +22891=>9804, +23260=>9805, +23278=>9806, +23269=>9807, +23253=>9808, +23274=>9809, +23258=>9810, +23277=>9811, +23275=>9812, +23283=>9813, +23266=>9814, +23264=>9815, +23259=>9816, +23276=>9817, +23262=>9818, +23261=>9819, +23257=>9820, +23272=>9821, +23263=>9822, +23415=>9823, +23520=>9824, +23523=>9825, +23651=>9826, +23938=>9827, +23936=>9828, +23933=>9829, +23942=>9830, +23930=>9831, +23937=>9832, +23927=>9833, +23946=>9834, +23945=>9835, +23944=>9836, +23934=>9837, +23932=>9838, +23949=>9839, +23929=>9840, +23935=>9841, +24152=>9842, +24153=>9843, +24147=>9844, +24280=>9845, +24273=>9846, +24279=>9847, +24270=>9848, +24284=>9849, +24277=>9850, +24281=>9851, +24274=>9852, +24276=>9853, +24388=>9854, +24387=>9855, +24431=>9856, +24502=>9857, +24876=>9858, +24872=>9859, +24897=>9860, +24926=>9861, +24945=>9862, +24947=>9863, +24914=>9864, +24915=>9865, +24946=>9866, +24940=>9867, +24960=>9868, +24948=>9869, +24916=>9870, +24954=>9871, +24923=>9872, +24933=>9873, +24891=>9874, +24938=>9875, +24929=>9876, +24918=>9877, +25129=>9878, +25127=>9879, +25131=>9880, +25643=>9881, +25677=>9882, +25691=>9883, +25693=>9884, +25716=>9885, +25718=>9886, +25714=>9887, +25715=>9888, +25725=>9889, +25717=>9890, +25702=>9891, +25766=>9892, +25678=>9893, +25730=>9894, +25694=>9895, +25692=>9896, +25675=>9897, +25683=>9898, +25696=>9899, +25680=>9900, +25727=>9901, +25663=>9902, +25708=>9903, +25707=>9904, +25689=>9905, +25701=>9906, +25719=>9907, +25971=>9908, +26016=>9909, +26273=>9910, +26272=>9911, +26271=>9912, +26373=>9913, +26372=>9914, +26402=>9915, +27057=>9916, +27062=>9917, +27081=>9918, +27040=>9919, +27086=>9920, +27030=>9921, +27056=>9922, +27052=>9923, +27068=>9924, +27025=>9925, +27033=>9926, +27022=>9927, +27047=>9928, +27021=>9929, +27049=>9930, +27070=>9931, +27055=>9932, +27071=>9933, +27076=>9934, +27069=>9935, +27044=>9936, +27092=>9937, +27065=>9938, +27082=>9939, +27034=>9940, +27087=>9941, +27059=>9942, +27027=>9943, +27050=>9944, +27041=>9945, +27038=>9946, +27097=>9947, +27031=>9948, +27024=>9949, +27074=>9950, +27061=>9951, +27045=>9952, +27078=>9953, +27466=>9954, +27469=>9955, +27467=>9956, +27550=>9957, +27551=>9958, +27552=>9959, +27587=>9960, +27588=>9961, +27646=>9962, +28366=>9963, +28405=>9964, +28401=>9965, +28419=>9966, +28453=>9967, +28408=>9968, +28471=>9969, +28411=>9970, +28462=>9971, +28425=>9972, +28494=>9973, +28441=>9974, +28442=>9975, +28455=>9976, +28440=>9977, +28475=>9978, +28434=>9979, +28397=>9980, +28426=>9981, +28470=>9982, +28531=>9983, +28409=>9984, +28398=>9985, +28461=>9986, +28480=>9987, +28464=>9988, +28476=>9989, +28469=>9990, +28395=>9991, +28423=>9992, +28430=>9993, +28483=>9994, +28421=>9995, +28413=>9996, +28406=>9997, +28473=>9998, +28444=>9999, +28412=>10000, +28474=>10001, +28447=>10002, +28429=>10003, +28446=>10004, +28424=>10005, +28449=>10006, +29063=>10007, +29072=>10008, +29065=>10009, +29056=>10010, +29061=>10011, +29058=>10012, +29071=>10013, +29051=>10014, +29062=>10015, +29057=>10016, +29079=>10017, +29252=>10018, +29267=>10019, +29335=>10020, +29333=>10021, +29331=>10022, +29507=>10023, +29517=>10024, +29521=>10025, +29516=>10026, +29794=>10027, +29811=>10028, +29809=>10029, +29813=>10030, +29810=>10031, +29799=>10032, +29806=>10033, +29952=>10034, +29954=>10035, +29955=>10036, +30077=>10037, +30096=>10038, +30230=>10039, +30216=>10040, +30220=>10041, +30229=>10042, +30225=>10043, +30218=>10044, +30228=>10045, +30392=>10046, +30593=>10047, +30588=>10048, +30597=>10049, +30594=>10050, +30574=>10051, +30592=>10052, +30575=>10053, +30590=>10054, +30595=>10055, +30898=>10056, +30890=>10057, +30900=>10058, +30893=>10059, +30888=>10060, +30846=>10061, +30891=>10062, +30878=>10063, +30885=>10064, +30880=>10065, +30892=>10066, +30882=>10067, +30884=>10068, +31128=>10069, +31114=>10070, +31115=>10071, +31126=>10072, +31125=>10073, +31124=>10074, +31123=>10075, +31127=>10076, +31112=>10077, +31122=>10078, +31120=>10079, +31275=>10080, +31306=>10081, +31280=>10082, +31279=>10083, +31272=>10084, +31270=>10085, +31400=>10086, +31403=>10087, +31404=>10088, +31470=>10089, +31624=>10090, +31644=>10091, +31626=>10092, +31633=>10093, +31632=>10094, +31638=>10095, +31629=>10096, +31628=>10097, +31643=>10098, +31630=>10099, +31621=>10100, +31640=>10101, +21124=>10102, +31641=>10103, +31652=>10104, +31618=>10105, +31931=>10106, +31935=>10107, +31932=>10108, +31930=>10109, +32167=>10110, +32183=>10111, +32194=>10112, +32163=>10113, +32170=>10114, +32193=>10115, +32192=>10116, +32197=>10117, +32157=>10118, +32206=>10119, +32196=>10120, +32198=>10121, +32203=>10122, +32204=>10123, +32175=>10124, +32185=>10125, +32150=>10126, +32188=>10127, +32159=>10128, +32166=>10129, +32174=>10130, +32169=>10131, +32161=>10132, +32201=>10133, +32627=>10134, +32738=>10135, +32739=>10136, +32741=>10137, +32734=>10138, +32804=>10139, +32861=>10140, +32860=>10141, +33161=>10142, +33158=>10143, +33155=>10144, +33159=>10145, +33165=>10146, +33164=>10147, +33163=>10148, +33301=>10149, +33943=>10150, +33956=>10151, +33953=>10152, +33951=>10153, +33978=>10154, +33998=>10155, +33986=>10156, +33964=>10157, +33966=>10158, +33963=>10159, +33977=>10160, +33972=>10161, +33985=>10162, +33997=>10163, +33962=>10164, +33946=>10165, +33969=>10166, +34000=>10167, +33949=>10168, +33959=>10169, +33979=>10170, +33954=>10171, +33940=>10172, +33991=>10173, +33996=>10174, +33947=>10175, +33961=>10176, +33967=>10177, +33960=>10178, +58327=>10178, +34006=>10179, +33944=>10180, +33974=>10181, +33999=>10182, +33952=>10183, +34007=>10184, +34004=>10185, +34002=>10186, +34011=>10187, +33968=>10188, +33937=>10189, +34401=>10190, +34611=>10191, +34595=>10192, +34600=>10193, +34667=>10194, +34624=>10195, +34606=>10196, +34590=>10197, +34593=>10198, +34585=>10199, +34587=>10200, +34627=>10201, +34604=>10202, +34625=>10203, +34622=>10204, +34630=>10205, +34592=>10206, +34610=>10207, +34602=>10208, +34605=>10209, +34620=>10210, +34578=>10211, +34618=>10212, +34609=>10213, +34613=>10214, +34626=>10215, +34598=>10216, +34599=>10217, +34616=>10218, +34596=>10219, +34586=>10220, +34608=>10221, +34577=>10222, +35063=>10223, +35047=>10224, +35057=>10225, +35058=>10226, +35066=>10227, +35070=>10228, +35054=>10229, +35068=>10230, +35062=>10231, +35067=>10232, +35056=>10233, +35052=>10234, +35051=>10235, +35229=>10236, +35233=>10237, +35231=>10238, +35230=>10239, +35305=>10240, +35307=>10241, +35304=>10242, +35499=>10243, +35481=>10244, +35467=>10245, +35474=>10246, +35471=>10247, +35478=>10248, +35901=>10249, +35944=>10250, +35945=>10251, +36053=>10252, +36047=>10253, +36055=>10254, +36246=>10255, +36361=>10256, +36354=>10257, +36351=>10258, +36365=>10259, +36349=>10260, +36362=>10261, +36355=>10262, +36359=>10263, +36358=>10264, +36357=>10265, +36350=>10266, +36352=>10267, +36356=>10268, +36624=>10269, +36625=>10270, +36622=>10271, +36621=>10272, +37155=>10273, +37148=>10274, +37152=>10275, +37154=>10276, +37151=>10277, +37149=>10278, +37146=>10279, +37156=>10280, +37153=>10281, +37147=>10282, +37242=>10283, +37234=>10284, +37241=>10285, +37235=>10286, +37541=>10287, +37540=>10288, +37494=>10289, +37531=>10290, +37498=>10291, +37536=>10292, +37524=>10293, +37546=>10294, +37517=>10295, +37542=>10296, +37530=>10297, +37547=>10298, +37497=>10299, +37527=>10300, +37503=>10301, +37539=>10302, +37614=>10303, +37518=>10304, +37506=>10305, +37525=>10306, +37538=>10307, +37501=>10308, +37512=>10309, +37537=>10310, +37514=>10311, +37510=>10312, +37516=>10313, +37529=>10314, +37543=>10315, +37502=>10316, +37511=>10317, +37545=>10318, +37533=>10319, +37515=>10320, +37421=>10321, +38558=>10322, +38561=>10323, +38655=>10324, +38744=>10325, +38781=>10326, +38778=>10327, +38782=>10328, +38787=>10329, +38784=>10330, +38786=>10331, +38779=>10332, +38788=>10333, +38785=>10334, +38783=>10335, +38862=>10336, +38861=>10337, +38934=>10338, +39085=>10339, +39086=>10340, +39170=>10341, +39168=>10342, +39175=>10343, +39325=>10344, +39324=>10345, +39363=>10346, +39353=>10347, +39355=>10348, +39354=>10349, +39362=>10350, +39357=>10351, +39367=>10352, +39601=>10353, +39651=>10354, +39655=>10355, +39742=>10356, +39743=>10357, +39776=>10358, +39777=>10359, +39775=>10360, +40177=>10361, +40178=>10362, +40181=>10363, +40615=>10364, +20735=>10365, +20739=>10366, +20784=>10367, +20728=>10368, +20742=>10369, +20743=>10370, +20726=>10371, +20734=>10372, +20747=>10373, +20748=>10374, +20733=>10375, +20746=>10376, +21131=>10377, +21132=>10378, +21233=>10379, +21231=>10380, +22088=>10381, +22082=>10382, +22092=>10383, +22069=>10384, +22081=>10385, +22090=>10386, +22089=>10387, +22086=>10388, +22104=>10389, +22106=>10390, +22080=>10391, +22067=>10392, +22077=>10393, +22060=>10394, +22078=>10395, +22072=>10396, +22058=>10397, +22074=>10398, +22298=>10399, +22699=>10400, +22685=>10401, +22705=>10402, +22688=>10403, +22691=>10404, +22703=>10405, +22700=>10406, +22693=>10407, +22689=>10408, +22783=>10409, +23295=>10410, +23284=>10411, +23293=>10412, +23287=>10413, +23286=>10414, +23299=>10415, +23288=>10416, +23298=>10417, +23289=>10418, +23297=>10419, +23303=>10420, +23301=>10421, +23311=>10422, +23655=>10423, +23961=>10424, +23959=>10425, +23967=>10426, +23954=>10427, +23970=>10428, +23955=>10429, +23957=>10430, +23968=>10431, +23964=>10432, +23969=>10433, +23962=>10434, +23966=>10435, +24169=>10436, +24157=>10437, +24160=>10438, +24156=>10439, +32243=>10440, +24283=>10441, +24286=>10442, +24289=>10443, +24393=>10444, +24498=>10445, +24971=>10446, +24963=>10447, +24953=>10448, +25009=>10449, +25008=>10450, +24994=>10451, +24969=>10452, +24987=>10453, +24979=>10454, +25007=>10455, +25005=>10456, +24991=>10457, +24978=>10458, +25002=>10459, +24993=>10460, +24973=>10461, +24934=>10462, +25011=>10463, +25133=>10464, +25710=>10465, +25712=>10466, +25750=>10467, +25760=>10468, +25733=>10469, +25751=>10470, +25756=>10471, +25743=>10472, +25739=>10473, +25738=>10474, +25740=>10475, +25763=>10476, +25759=>10477, +25704=>10478, +25777=>10479, +25752=>10480, +25974=>10481, +25978=>10482, +25977=>10483, +25979=>10484, +26034=>10485, +26035=>10486, +26293=>10487, +26288=>10488, +26281=>10489, +26290=>10490, +26295=>10491, +26282=>10492, +26287=>10493, +27136=>10494, +27142=>10495, +27159=>10496, +27109=>10497, +27128=>10498, +27157=>10499, +27121=>10500, +27108=>10501, +27168=>10502, +27135=>10503, +27116=>10504, +27106=>10505, +27163=>10506, +27165=>10507, +27134=>10508, +27175=>10509, +27122=>10510, +27118=>10511, +27156=>10512, +27127=>10513, +27111=>10514, +27200=>10515, +27144=>10516, +27110=>10517, +27131=>10518, +27149=>10519, +27132=>10520, +27115=>10521, +27145=>10522, +27140=>10523, +27160=>10524, +27173=>10525, +27151=>10526, +27126=>10527, +27174=>10528, +27143=>10529, +27124=>10530, +27158=>10531, +27473=>10532, +27557=>10533, +27555=>10534, +27554=>10535, +27558=>10536, +27649=>10537, +27648=>10538, +27647=>10539, +27650=>10540, +28481=>10541, +28454=>10542, +28542=>10543, +28551=>10544, +28614=>10545, +28562=>10546, +28557=>10547, +28553=>10548, +28556=>10549, +28514=>10550, +28495=>10551, +28549=>10552, +28506=>10553, +28566=>10554, +28534=>10555, +28524=>10556, +28546=>10557, +28501=>10558, +28530=>10559, +28498=>10560, +28496=>10561, +28503=>10562, +28564=>10563, +28563=>10564, +28509=>10565, +28416=>10566, +28513=>10567, +28523=>10568, +28541=>10569, +28519=>10570, +28560=>10571, +28499=>10572, +28555=>10573, +28521=>10574, +28543=>10575, +28565=>10576, +28515=>10577, +28535=>10578, +28522=>10579, +28539=>10580, +29106=>10581, +29103=>10582, +29083=>10583, +29104=>10584, +29088=>10585, +29082=>10586, +29097=>10587, +29109=>10588, +29085=>10589, +29093=>10590, +29086=>10591, +29092=>10592, +29089=>10593, +29098=>10594, +29084=>10595, +29095=>10596, +29107=>10597, +29336=>10598, +29338=>10599, +29528=>10600, +29522=>10601, +29534=>10602, +29535=>10603, +29536=>10604, +29533=>10605, +29531=>10606, +29537=>10607, +29530=>10608, +29529=>10609, +29538=>10610, +29831=>10611, +29833=>10612, +29834=>10613, +29830=>10614, +29825=>10615, +29821=>10616, +29829=>10617, +29832=>10618, +29820=>10619, +29817=>10620, +58868=>10620, +29960=>10621, +29959=>10622, +30078=>10623, +30245=>10624, +30238=>10625, +30233=>10626, +30237=>10627, +30236=>10628, +30243=>10629, +30234=>10630, +30248=>10631, +30235=>10632, +30364=>10633, +30365=>10634, +30366=>10635, +30363=>10636, +30605=>10637, +30607=>10638, +30601=>10639, +30600=>10640, +30925=>10641, +30907=>10642, +30927=>10643, +30924=>10644, +30929=>10645, +30926=>10646, +30932=>10647, +30920=>10648, +30915=>10649, +30916=>10650, +30921=>10651, +31130=>10652, +31137=>10653, +31136=>10654, +31132=>10655, +31138=>10656, +31131=>10657, +59175=>10657, +27510=>10658, +31289=>10659, +31410=>10660, +31412=>10661, +31411=>10662, +31671=>10663, +31691=>10664, +31678=>10665, +31660=>10666, +31694=>10667, +31663=>10668, +31673=>10669, +31690=>10670, +31669=>10671, +31941=>10672, +31944=>10673, +31948=>10674, +31947=>10675, +32247=>10676, +32219=>10677, +32234=>10678, +32231=>10679, +32215=>10680, +32225=>10681, +32259=>10682, +32250=>10683, +32230=>10684, +32246=>10685, +32241=>10686, +32240=>10687, +32238=>10688, +32223=>10689, +32630=>10690, +32684=>10691, +32688=>10692, +32685=>10693, +32749=>10694, +32747=>10695, +32746=>10696, +32748=>10697, +32742=>10698, +32744=>10699, +32868=>10700, +32871=>10701, +33187=>10702, +33183=>10703, +33182=>10704, +33173=>10705, +33186=>10706, +33177=>10707, +33175=>10708, +33302=>10709, +33359=>10710, +33363=>10711, +33362=>10712, +33360=>10713, +33358=>10714, +33361=>10715, +34084=>10716, +34107=>10717, +34063=>10718, +34048=>10719, +34089=>10720, +34062=>10721, +34057=>10722, +34061=>10723, +34079=>10724, +34058=>10725, +34087=>10726, +34076=>10727, +34043=>10728, +34091=>10729, +34042=>10730, +34056=>10731, +34060=>10732, +34036=>10733, +34090=>10734, +34034=>10735, +34069=>10736, +34039=>10737, +34027=>10738, +34035=>10739, +34044=>10740, +34066=>10741, +34026=>10742, +34025=>10743, +34070=>10744, +34046=>10745, +34088=>10746, +34077=>10747, +34094=>10748, +34050=>10749, +34045=>10750, +34078=>10751, +34038=>10752, +34097=>10753, +34086=>10754, +34023=>10755, +34024=>10756, +34032=>10757, +34031=>10758, +34041=>10759, +34072=>10760, +34080=>10761, +34096=>10762, +34059=>10763, +34073=>10764, +34095=>10765, +34402=>10766, +34646=>10767, +34659=>10768, +34660=>10769, +34679=>10770, +34785=>10771, +34675=>10772, +34648=>10773, +34644=>10774, +34651=>10775, +34642=>10776, +34657=>10777, +34650=>10778, +34641=>10779, +34654=>10780, +34669=>10781, +34666=>10782, +34640=>10783, +34638=>10784, +34655=>10785, +34653=>10786, +34671=>10787, +34668=>10788, +34682=>10789, +34670=>10790, +34652=>10791, +34661=>10792, +34639=>10793, +34683=>10794, +34677=>10795, +34658=>10796, +34663=>10797, +34665=>10798, +34906=>10799, +35077=>10800, +35084=>10801, +35092=>10802, +35083=>10803, +35095=>10804, +35096=>10805, +35097=>10806, +35078=>10807, +35094=>10808, +35089=>10809, +35086=>10810, +35081=>10811, +35234=>10812, +35236=>10813, +35235=>10814, +35309=>10815, +35312=>10816, +35308=>10817, +35535=>10818, +35526=>10819, +35512=>10820, +35539=>10821, +35537=>10822, +35540=>10823, +35541=>10824, +35515=>10825, +35543=>10826, +35518=>10827, +35520=>10828, +35525=>10829, +35544=>10830, +35523=>10831, +35514=>10832, +35517=>10833, +35545=>10834, +35902=>10835, +35917=>10836, +35983=>10837, +36069=>10838, +36063=>10839, +36057=>10840, +36072=>10841, +36058=>10842, +36061=>10843, +36071=>10844, +36256=>10845, +36252=>10846, +36257=>10847, +36251=>10848, +36384=>10849, +36387=>10850, +36389=>10851, +36388=>10852, +36398=>10853, +36373=>10854, +36379=>10855, +36374=>10856, +36369=>10857, +36377=>10858, +36390=>10859, +36391=>10860, +36372=>10861, +36370=>10862, +36376=>10863, +36371=>10864, +36380=>10865, +36375=>10866, +36378=>10867, +36652=>10868, +36644=>10869, +36632=>10870, +36634=>10871, +36640=>10872, +36643=>10873, +36630=>10874, +36631=>10875, +36979=>10876, +36976=>10877, +36975=>10878, +36967=>10879, +36971=>10880, +37167=>10881, +37163=>10882, +37161=>10883, +37162=>10884, +37170=>10885, +37158=>10886, +37166=>10887, +37253=>10888, +37254=>10889, +37258=>10890, +37249=>10891, +37250=>10892, +37252=>10893, +37248=>10894, +37584=>10895, +37571=>10896, +37572=>10897, +37568=>10898, +37593=>10899, +37558=>10900, +37583=>10901, +37617=>10902, +37599=>10903, +37592=>10904, +37609=>10905, +37591=>10906, +37597=>10907, +37580=>10908, +37615=>10909, +37570=>10910, +37608=>10911, +37578=>10912, +37576=>10913, +37582=>10914, +37606=>10915, +37581=>10916, +37589=>10917, +37577=>10918, +37600=>10919, +37598=>10920, +37607=>10921, +37585=>10922, +37587=>10923, +37557=>10924, +37601=>10925, +37669=>10926, +37574=>10927, +37556=>10928, +38268=>10929, +38316=>10930, +38315=>10931, +38318=>10932, +38320=>10933, +38564=>10934, +38562=>10935, +38611=>10936, +38661=>10937, +38664=>10938, +38658=>10939, +38746=>10940, +38794=>10941, +38798=>10942, +38792=>10943, +38864=>10944, +38863=>10945, +38942=>10946, +38941=>10947, +38950=>10948, +38953=>10949, +38952=>10950, +38944=>10951, +38939=>10952, +38951=>10953, +39090=>10954, +39176=>10955, +39162=>10956, +39185=>10957, +39188=>10958, +39190=>10959, +39191=>10960, +39189=>10961, +39388=>10962, +39373=>10963, +39375=>10964, +39379=>10965, +39380=>10966, +39374=>10967, +39369=>10968, +39382=>10969, +60270=>10969, +39384=>10970, +39371=>10971, +39383=>10972, +39372=>10973, +39603=>10974, +39660=>10975, +39659=>10976, +39667=>10977, +39666=>10978, +39665=>10979, +39750=>10980, +39747=>10981, +39783=>10982, +39796=>10983, +39793=>10984, +39782=>10985, +39798=>10986, +39797=>10987, +39792=>10988, +39784=>10989, +39780=>10990, +39788=>10991, +40188=>10992, +40186=>10993, +40189=>10994, +40191=>10995, +40183=>10996, +40199=>10997, +40192=>10998, +40185=>10999, +40187=>11000, +40200=>11001, +40197=>11002, +40196=>11003, +40579=>11004, +40659=>11005, +40719=>11006, +40720=>11007, +20764=>11008, +20755=>11009, +20759=>11010, +20762=>11011, +20753=>11012, +20958=>11013, +21300=>11014, +21473=>11015, +22128=>11016, +22112=>11017, +22126=>11018, +22131=>11019, +22118=>11020, +22115=>11021, +22125=>11022, +22130=>11023, +22110=>11024, +22135=>11025, +22300=>11026, +22299=>11027, +22728=>11028, +22717=>11029, +22729=>11030, +22719=>11031, +22714=>11032, +22722=>11033, +22716=>11034, +22726=>11035, +23319=>11036, +23321=>11037, +23323=>11038, +23329=>11039, +23316=>11040, +23315=>11041, +23312=>11042, +23318=>11043, +23336=>11044, +59539=>11044, +23322=>11045, +23328=>11046, +23326=>11047, +23535=>11048, +23980=>11049, +23985=>11050, +23977=>11051, +23975=>11052, +23989=>11053, +23984=>11054, +23982=>11055, +23978=>11056, +23976=>11057, +23986=>11058, +23981=>11059, +23983=>11060, +23988=>11061, +24167=>11062, +24168=>11063, +24166=>11064, +24175=>11065, +24297=>11066, +24295=>11067, +24294=>11068, +24296=>11069, +24293=>11070, +24395=>11071, +24508=>11072, +24507=>11073, +24989=>11074, +25000=>11075, +24982=>11076, +25029=>11077, +25012=>11078, +25030=>11079, +25025=>11080, +25036=>11081, +25018=>11082, +25023=>11083, +25016=>11084, +24972=>11085, +25815=>11086, +25814=>11087, +25808=>11088, +25807=>11089, +25801=>11090, +25789=>11091, +25737=>11092, +25795=>11093, +25819=>11094, +25843=>11095, +25817=>11096, +25907=>11097, +25983=>11098, +25980=>11099, +26018=>11100, +26312=>11101, +26302=>11102, +26304=>11103, +26314=>11104, +26315=>11105, +26319=>11106, +26301=>11107, +26299=>11108, +26298=>11109, +26316=>11110, +26403=>11111, +27188=>11112, +27238=>11113, +27209=>11114, +27239=>11115, +27186=>11116, +27240=>11117, +27198=>11118, +27229=>11119, +27245=>11120, +27254=>11121, +27227=>11122, +27217=>11123, +27176=>11124, +27226=>11125, +27195=>11126, +27199=>11127, +27201=>11128, +27242=>11129, +27236=>11130, +27216=>11131, +27215=>11132, +27220=>11133, +27247=>11134, +27241=>11135, +27232=>11136, +27196=>11137, +27230=>11138, +27222=>11139, +27221=>11140, +27213=>11141, +27214=>11142, +27206=>11143, +27477=>11144, +27476=>11145, +27478=>11146, +27559=>11147, +27562=>11148, +27563=>11149, +27592=>11150, +27591=>11151, +27652=>11152, +27651=>11153, +27654=>11154, +28589=>11155, +28619=>11156, +28579=>11157, +28615=>11158, +28604=>11159, +28622=>11160, +28616=>11161, +28510=>11162, +28612=>11163, +28605=>11164, +28574=>11165, +28618=>11166, +28584=>11167, +28676=>11168, +28581=>11169, +28590=>11170, +28602=>11171, +28588=>11172, +28586=>11173, +28623=>11174, +28607=>11175, +28600=>11176, +28578=>11177, +28617=>11178, +28587=>11179, +28621=>11180, +28591=>11181, +28594=>11182, +28592=>11183, +29125=>11184, +29122=>11185, +29119=>11186, +29112=>11187, +29142=>11188, +29120=>11189, +29121=>11190, +29131=>11191, +29140=>11192, +29130=>11193, +29127=>11194, +29135=>11195, +29117=>11196, +29144=>11197, +29116=>11198, +29126=>11199, +29146=>11200, +29147=>11201, +29341=>11202, +29342=>11203, +29545=>11204, +29542=>11205, +29543=>11206, +29548=>11207, +29541=>11208, +29547=>11209, +29546=>11210, +29823=>11211, +29850=>11212, +29856=>11213, +29844=>11214, +29842=>11215, +29845=>11216, +29857=>11217, +29963=>11218, +30080=>11219, +30255=>11220, +30253=>11221, +30257=>11222, +30269=>11223, +30259=>11224, +30268=>11225, +30261=>11226, +30258=>11227, +30256=>11228, +30395=>11229, +30438=>11230, +30618=>11231, +30621=>11232, +30625=>11233, +30620=>11234, +30619=>11235, +30626=>11236, +30627=>11237, +30613=>11238, +30617=>11239, +30615=>11240, +30941=>11241, +30953=>11242, +30949=>11243, +30954=>11244, +30942=>11245, +30947=>11246, +30939=>11247, +30945=>11248, +30946=>11249, +30957=>11250, +30943=>11251, +30944=>11252, +31140=>11253, +31300=>11254, +31304=>11255, +31303=>11256, +31414=>11257, +31416=>11258, +31413=>11259, +31409=>11260, +31415=>11261, +31710=>11262, +31715=>11263, +31719=>11264, +31709=>11265, +31701=>11266, +31717=>11267, +31706=>11268, +31720=>11269, +31737=>11270, +31700=>11271, +31722=>11272, +31714=>11273, +31708=>11274, +31723=>11275, +31704=>11276, +31711=>11277, +31954=>11278, +31956=>11279, +31959=>11280, +31952=>11281, +31953=>11282, +32274=>11283, +32289=>11284, +32279=>11285, +32268=>11286, +32287=>11287, +32288=>11288, +32275=>11289, +32270=>11290, +32284=>11291, +32277=>11292, +32282=>11293, +32290=>11294, +32267=>11295, +32271=>11296, +32278=>11297, +32269=>11298, +32276=>11299, +32293=>11300, +32292=>11301, +32579=>11302, +32635=>11303, +32636=>11304, +32634=>11305, +32689=>11306, +32751=>11307, +32810=>11308, +32809=>11309, +32876=>11310, +33201=>11311, +33190=>11312, +33198=>11313, +33209=>11314, +33205=>11315, +33195=>11316, +33200=>11317, +33196=>11318, +33204=>11319, +33202=>11320, +33207=>11321, +33191=>11322, +33266=>11323, +33365=>11324, +33366=>11325, +33367=>11326, +34134=>11327, +34117=>11328, +34155=>11329, +34125=>11330, +34131=>11331, +34145=>11332, +34136=>11333, +34112=>11334, +34118=>11335, +34148=>11336, +34113=>11337, +34146=>11338, +34116=>11339, +34129=>11340, +34119=>11341, +34147=>11342, +34110=>11343, +34139=>11344, +34161=>11345, +34126=>11346, +34158=>11347, +34165=>11348, +34133=>11349, +34151=>11350, +34144=>11351, +34188=>11352, +34150=>11353, +34141=>11354, +34132=>11355, +34149=>11356, +34156=>11357, +34403=>11358, +34405=>11359, +34404=>11360, +34724=>11361, +34715=>11362, +34703=>11363, +34711=>11364, +34707=>11365, +34706=>11366, +34696=>11367, +34689=>11368, +34710=>11369, +34712=>11370, +34681=>11371, +34695=>11372, +34723=>11373, +34693=>11374, +34704=>11375, +34705=>11376, +34717=>11377, +34692=>11378, +34708=>11379, +34716=>11380, +34714=>11381, +34697=>11382, +35102=>11383, +35110=>11384, +35120=>11385, +35117=>11386, +35118=>11387, +35111=>11388, +35121=>11389, +35106=>11390, +35113=>11391, +35107=>11392, +35119=>11393, +35116=>11394, +35103=>11395, +35313=>11396, +35552=>11397, +35554=>11398, +35570=>11399, +35572=>11400, +35573=>11401, +35549=>11402, +35604=>11403, +35556=>11404, +35551=>11405, +35568=>11406, +35528=>11407, +35550=>11408, +35553=>11409, +35560=>11410, +35583=>11411, +35567=>11412, +35579=>11413, +35985=>11414, +35986=>11415, +35984=>11416, +36085=>11417, +36078=>11418, +36081=>11419, +36080=>11420, +36083=>11421, +36204=>11422, +36206=>11423, +36261=>11424, +36263=>11425, +36403=>11426, +36414=>11427, +36408=>11428, +36416=>11429, +36421=>11430, +36406=>11431, +36412=>11432, +36413=>11433, +36417=>11434, +36400=>11435, +36415=>11436, +36541=>11437, +36662=>11438, +60329=>11438, +36654=>11439, +36661=>11440, +36658=>11441, +36665=>11442, +36663=>11443, +36660=>11444, +36982=>11445, +36985=>11446, +36987=>11447, +36998=>11448, +37114=>11449, +37171=>11450, +37173=>11451, +37174=>11452, +37267=>11453, +37264=>11454, +37265=>11455, +37261=>11456, +37263=>11457, +37671=>11458, +37662=>11459, +37640=>11460, +37663=>11461, +37638=>11462, +37647=>11463, +37754=>11464, +37688=>11465, +37692=>11466, +37659=>11467, +37667=>11468, +37650=>11469, +37633=>11470, +37702=>11471, +37677=>11472, +37646=>11473, +37645=>11474, +37579=>11475, +37661=>11476, +37626=>11477, +37651=>11478, +37625=>11479, +37623=>11480, +37684=>11481, +37634=>11482, +37668=>11483, +37631=>11484, +37673=>11485, +37689=>11486, +37685=>11487, +37674=>11488, +37652=>11489, +37644=>11490, +37643=>11491, +37630=>11492, +37641=>11493, +37632=>11494, +37627=>11495, +37654=>11496, +38332=>11497, +38349=>11498, +38334=>11499, +38329=>11500, +38330=>11501, +38326=>11502, +38335=>11503, +38325=>11504, +38333=>11505, +38569=>11506, +38612=>11507, +38667=>11508, +38674=>11509, +38672=>11510, +38809=>11511, +38807=>11512, +38804=>11513, +38896=>11514, +38904=>11515, +38965=>11516, +38959=>11517, +38962=>11518, +39204=>11519, +39199=>11520, +39207=>11521, +39209=>11522, +39326=>11523, +39406=>11524, +39404=>11525, +39397=>11526, +39396=>11527, +39408=>11528, +39395=>11529, +39402=>11530, +39401=>11531, +39399=>11532, +39609=>11533, +39615=>11534, +39604=>11535, +39611=>11536, +39670=>11537, +39674=>11538, +39673=>11539, +39671=>11540, +39731=>11541, +39808=>11542, +39813=>11543, +39815=>11544, +39804=>11545, +39806=>11546, +39803=>11547, +39810=>11548, +39827=>11549, +39826=>11550, +39824=>11551, +39802=>11552, +39829=>11553, +39805=>11554, +39816=>11555, +40229=>11556, +40215=>11557, +40224=>11558, +40222=>11559, +40212=>11560, +40233=>11561, +40221=>11562, +40216=>11563, +40226=>11564, +40208=>11565, +40217=>11566, +40223=>11567, +40584=>11568, +40582=>11569, +40583=>11570, +40622=>11571, +40621=>11572, +40661=>11573, +40662=>11574, +40698=>11575, +40722=>11576, +40765=>11577, +20774=>11578, +20773=>11579, +20770=>11580, +20772=>11581, +20768=>11582, +20777=>11583, +21236=>11584, +22163=>11585, +22156=>11586, +22157=>11587, +22150=>11588, +22148=>11589, +22147=>11590, +22142=>11591, +22146=>11592, +22143=>11593, +22145=>11594, +22742=>11595, +22740=>11596, +22735=>11597, +22738=>11598, +23341=>11599, +23333=>11600, +23346=>11601, +23331=>11602, +23340=>11603, +23335=>11604, +23334=>11605, +23343=>11606, +23342=>11607, +23419=>11608, +23537=>11609, +23538=>11610, +23991=>11611, +24172=>11612, +24170=>11613, +24510=>11614, +25027=>11615, +25013=>11616, +25020=>11617, +25063=>11618, +25056=>11619, +25061=>11620, +25060=>11621, +25064=>11622, +25054=>11623, +25839=>11624, +25833=>11625, +25827=>11626, +25835=>11627, +25828=>11628, +25832=>11629, +25985=>11630, +25984=>11631, +26038=>11632, +26074=>11633, +26322=>11634, +27277=>11635, +27286=>11636, +27265=>11637, +27301=>11638, +27273=>11639, +27295=>11640, +27291=>11641, +27297=>11642, +27294=>11643, +27271=>11644, +27283=>11645, +27278=>11646, +27285=>11647, +27267=>11648, +27304=>11649, +27300=>11650, +27281=>11651, +27263=>11652, +27302=>11653, +27290=>11654, +27269=>11655, +27276=>11656, +27282=>11657, +27483=>11658, +27565=>11659, +27657=>11660, +28620=>11661, +28585=>11662, +28660=>11663, +28628=>11664, +28643=>11665, +28636=>11666, +28653=>11667, +28647=>11668, +28646=>11669, +28638=>11670, +28658=>11671, +28637=>11672, +28642=>11673, +28648=>11674, +29153=>11675, +29169=>11676, +29160=>11677, +29170=>11678, +29156=>11679, +29168=>11680, +29154=>11681, +29555=>11682, +29550=>11683, +29551=>11684, +29847=>11685, +29874=>11686, +29867=>11687, +29840=>11688, +29866=>11689, +29869=>11690, +29873=>11691, +29861=>11692, +29871=>11693, +29968=>11694, +29969=>11695, +29970=>11696, +29967=>11697, +30084=>11698, +30275=>11699, +30280=>11700, +30281=>11701, +30279=>11702, +30372=>11703, +30441=>11704, +30645=>11705, +30635=>11706, +30642=>11707, +30647=>11708, +30646=>11709, +30644=>11710, +30641=>11711, +30632=>11712, +30704=>11713, +30963=>11714, +30973=>11715, +30978=>11716, +30971=>11717, +30972=>11718, +30975=>11719, +30962=>11720, +30981=>11721, +30969=>11722, +30974=>11723, +30980=>11724, +31147=>11725, +31144=>11726, +31324=>11727, +31323=>11728, +31318=>11729, +31320=>11730, +31316=>11731, +31322=>11732, +31422=>11733, +31424=>11734, +31425=>11735, +31749=>11736, +31759=>11737, +31730=>11738, +31744=>11739, +31743=>11740, +31739=>11741, +31758=>11742, +31732=>11743, +31755=>11744, +31731=>11745, +31746=>11746, +31753=>11747, +31747=>11748, +31745=>11749, +31736=>11750, +31741=>11751, +31750=>11752, +58176=>11752, +31728=>11753, +31729=>11754, +31760=>11755, +31754=>11756, +31976=>11757, +32301=>11758, +32316=>11759, +32322=>11760, +32307=>11761, +38984=>11762, +32312=>11763, +32298=>11764, +32329=>11765, +32320=>11766, +32327=>11767, +32297=>11768, +32332=>11769, +32304=>11770, +32315=>11771, +32310=>11772, +32324=>11773, +32314=>11774, +32581=>11775, +32639=>11776, +32638=>11777, +32637=>11778, +32756=>11779, +32754=>11780, +32812=>11781, +33211=>11782, +33220=>11783, +33228=>11784, +33226=>11785, +33221=>11786, +33223=>11787, +33212=>11788, +33257=>11789, +33371=>11790, +33370=>11791, +33372=>11792, +34179=>11793, +34176=>11794, +34191=>11795, +34215=>11796, +34197=>11797, +34208=>11798, +34187=>11799, +34211=>11800, +34171=>11801, +34212=>11802, +34202=>11803, +34206=>11804, +34167=>11805, +34172=>11806, +34185=>11807, +34209=>11808, +34170=>11809, +34168=>11810, +34135=>11811, +34190=>11812, +34198=>11813, +34182=>11814, +34189=>11815, +34201=>11816, +34205=>11817, +34177=>11818, +34210=>11819, +34178=>11820, +34184=>11821, +34181=>11822, +34169=>11823, +34166=>11824, +34200=>11825, +34192=>11826, +34207=>11827, +34408=>11828, +34750=>11829, +34730=>11830, +34733=>11831, +34757=>11832, +34736=>11833, +34732=>11834, +34745=>11835, +34741=>11836, +34748=>11837, +34734=>11838, +34761=>11839, +34755=>11840, +34754=>11841, +34764=>11842, +34743=>11843, +34735=>11844, +34756=>11845, +34762=>11846, +34740=>11847, +34742=>11848, +34751=>11849, +34744=>11850, +34749=>11851, +34782=>11852, +34738=>11853, +35125=>11854, +35123=>11855, +35132=>11856, +35134=>11857, +35137=>11858, +35154=>11859, +35127=>11860, +35138=>11861, +35245=>11862, +35247=>11863, +35246=>11864, +35314=>11865, +35315=>11866, +35614=>11867, +35608=>11868, +35606=>11869, +35601=>11870, +35589=>11871, +35595=>11872, +35618=>11873, +35599=>11874, +35602=>11875, +35605=>11876, +35591=>11877, +35597=>11878, +35592=>11879, +35590=>11880, +35612=>11881, +35603=>11882, +35610=>11883, +35919=>11884, +35952=>11885, +35954=>11886, +35953=>11887, +35951=>11888, +35989=>11889, +35988=>11890, +36089=>11891, +36207=>11892, +36430=>11893, +36429=>11894, +36435=>11895, +36432=>11896, +36428=>11897, +36423=>11898, +36675=>11899, +36672=>11900, +36997=>11901, +36990=>11902, +37176=>11903, +37274=>11904, +37282=>11905, +37275=>11906, +37273=>11907, +37279=>11908, +37281=>11909, +37277=>11910, +37280=>11911, +37793=>11912, +37763=>11913, +37807=>11914, +37732=>11915, +37718=>11916, +37703=>11917, +37756=>11918, +37720=>11919, +37724=>11920, +37750=>11921, +37705=>11922, +37712=>11923, +37713=>11924, +37728=>11925, +37741=>11926, +37775=>11927, +37708=>11928, +37738=>11929, +37753=>11930, +37719=>11931, +37717=>11932, +37714=>11933, +37711=>11934, +37745=>11935, +37751=>11936, +37755=>11937, +37729=>11938, +37726=>11939, +37731=>11940, +37735=>11941, +37710=>11942, +37721=>11943, +38343=>11944, +38336=>11945, +38345=>11946, +38339=>11947, +38341=>11948, +38327=>11949, +38574=>11950, +38576=>11951, +38572=>11952, +38688=>11953, +38687=>11954, +38680=>11955, +38685=>11956, +38681=>11957, +38810=>11958, +38817=>11959, +38812=>11960, +38814=>11961, +38813=>11962, +38869=>11963, +38868=>11964, +38897=>11965, +38977=>11966, +38980=>11967, +38986=>11968, +38985=>11969, +38981=>11970, +38979=>11971, +39205=>11972, +39211=>11973, +39212=>11974, +39210=>11975, +39219=>11976, +39218=>11977, +39215=>11978, +39213=>11979, +39217=>11980, +39216=>11981, +39320=>11982, +39331=>11983, +39329=>11984, +39426=>11985, +39418=>11986, +39412=>11987, +39415=>11988, +39417=>11989, +39416=>11990, +39414=>11991, +39419=>11992, +39421=>11993, +39422=>11994, +39420=>11995, +39427=>11996, +39614=>11997, +39678=>11998, +39677=>11999, +39681=>12000, +39676=>12001, +39752=>12002, +39834=>12003, +39848=>12004, +39838=>12005, +39835=>12006, +39846=>12007, +39841=>12008, +39845=>12009, +39844=>12010, +39814=>12011, +39842=>12012, +39840=>12013, +39855=>12014, +40243=>12015, +40257=>12016, +40295=>12017, +40246=>12018, +40238=>12019, +40239=>12020, +40241=>12021, +40248=>12022, +40240=>12023, +40261=>12024, +40258=>12025, +40259=>12026, +40254=>12027, +40247=>12028, +40256=>12029, +40253=>12030, +32757=>12031, +40237=>12032, +40586=>12033, +40585=>12034, +40589=>12035, +40624=>12036, +40648=>12037, +40666=>12038, +40699=>12039, +40703=>12040, +40740=>12041, +40739=>12042, +40738=>12043, +40788=>12044, +12245=>12045, +40864=>12045, +20785=>12046, +20781=>12047, +20782=>12048, +22168=>12049, +22172=>12050, +22167=>12051, +22170=>12052, +22173=>12053, +22169=>12054, +22896=>12055, +23356=>12056, +23657=>12057, +23658=>12058, +24000=>12059, +24173=>12060, +24174=>12061, +25048=>12062, +25055=>12063, +25069=>12064, +25070=>12065, +25073=>12066, +25066=>12067, +25072=>12068, +25067=>12069, +25046=>12070, +25065=>12071, +25855=>12072, +25860=>12073, +25853=>12074, +25848=>12075, +25857=>12076, +25859=>12077, +25852=>12078, +26004=>12079, +26075=>12080, +26330=>12081, +26331=>12082, +26328=>12083, +27333=>12084, +27321=>12085, +27325=>12086, +27361=>12087, +27334=>12088, +27322=>12089, +27318=>12090, +27319=>12091, +27335=>12092, +27316=>12093, +27309=>12094, +27486=>12095, +27593=>12096, +27659=>12097, +28679=>12098, +28684=>12099, +28685=>12100, +28673=>12101, +28677=>12102, +28692=>12103, +28686=>12104, +28671=>12105, +28672=>12106, +28667=>12107, +28710=>12108, +28668=>12109, +28663=>12110, +28682=>12111, +29185=>12112, +60224=>12112, +29183=>12113, +29177=>12114, +29187=>12115, +29181=>12116, +29558=>12117, +29880=>12118, +29888=>12119, +29877=>12120, +29889=>12121, +29886=>12122, +29878=>12123, +29883=>12124, +29890=>12125, +29972=>12126, +29971=>12127, +30300=>12128, +30308=>12129, +30297=>12130, +30288=>12131, +30291=>12132, +30295=>12133, +30298=>12134, +30374=>12135, +30397=>12136, +30444=>12137, +30658=>12138, +30650=>12139, +30988=>12140, +30995=>12141, +30996=>12142, +30985=>12143, +30992=>12144, +30994=>12145, +30993=>12146, +31149=>12147, +31148=>12148, +31327=>12149, +31772=>12150, +31785=>12151, +31769=>12152, +31776=>12153, +31775=>12154, +31789=>12155, +31773=>12156, +31782=>12157, +31784=>12158, +31778=>12159, +31781=>12160, +31792=>12161, +32348=>12162, +32336=>12163, +32342=>12164, +32355=>12165, +32344=>12166, +32354=>12167, +32351=>12168, +32337=>12169, +32352=>12170, +32343=>12171, +32339=>12172, +32693=>12173, +32691=>12174, +32759=>12175, +32760=>12176, +32885=>12177, +33233=>12178, +33234=>12179, +33232=>12180, +33375=>12181, +33374=>12182, +34228=>12183, +34246=>12184, +34240=>12185, +34243=>12186, +34242=>12187, +34227=>12188, +34229=>12189, +34237=>12190, +34247=>12191, +34244=>12192, +34239=>12193, +34251=>12194, +34254=>12195, +34248=>12196, +34245=>12197, +34225=>12198, +34230=>12199, +34258=>12200, +34340=>12201, +34232=>12202, +34231=>12203, +34238=>12204, +34409=>12205, +34791=>12206, +34790=>12207, +34786=>12208, +34779=>12209, +34795=>12210, +34794=>12211, +34789=>12212, +34783=>12213, +34803=>12214, +34788=>12215, +34772=>12216, +34780=>12217, +34771=>12218, +34797=>12219, +34776=>12220, +34787=>12221, +34775=>12222, +34777=>12223, +34817=>12224, +34804=>12225, +34792=>12226, +34781=>12227, +35155=>12228, +35147=>12229, +35151=>12230, +35148=>12231, +35142=>12232, +35152=>12233, +35153=>12234, +35145=>12235, +35626=>12236, +35623=>12237, +35619=>12238, +35635=>12239, +35632=>12240, +35637=>12241, +35655=>12242, +35631=>12243, +35644=>12244, +35646=>12245, +35633=>12246, +35621=>12247, +35639=>12248, +35622=>12249, +35638=>12250, +35630=>12251, +35620=>12252, +35643=>12253, +35645=>12254, +35642=>12255, +35906=>12256, +35957=>12257, +35993=>12258, +35992=>12259, +35991=>12260, +36094=>12261, +36100=>12262, +36098=>12263, +36096=>12264, +36444=>12265, +36450=>12266, +36448=>12267, +36439=>12268, +36438=>12269, +36446=>12270, +36453=>12271, +36455=>12272, +36443=>12273, +36442=>12274, +36449=>12275, +36445=>12276, +36457=>12277, +36436=>12278, +36678=>12279, +36679=>12280, +36680=>12281, +36683=>12282, +37160=>12283, +37178=>12284, +37179=>12285, +37182=>12286, +37288=>12287, +37285=>12288, +37287=>12289, +37295=>12290, +37290=>12291, +37813=>12292, +37772=>12293, +37778=>12294, +37815=>12295, +37787=>12296, +37789=>12297, +37769=>12298, +37799=>12299, +37774=>12300, +37802=>12301, +37790=>12302, +37798=>12303, +37781=>12304, +37768=>12305, +37785=>12306, +37791=>12307, +37760=>12308, +37773=>12309, +37809=>12310, +37777=>12311, +37810=>12312, +37796=>12313, +37800=>12314, +37812=>12315, +37795=>12316, +38354=>12317, +38355=>12318, +38353=>12319, +38579=>12320, +38615=>12321, +38618=>12322, +24002=>12323, +38623=>12324, +38616=>12325, +38621=>12326, +38691=>12327, +38690=>12328, +38693=>12329, +38828=>12330, +38830=>12331, +38824=>12332, +38827=>12333, +38820=>12334, +38826=>12335, +38818=>12336, +38821=>12337, +38871=>12338, +38873=>12339, +38870=>12340, +38872=>12341, +38906=>12342, +38992=>12343, +38993=>12344, +38994=>12345, +39096=>12346, +39233=>12347, +39228=>12348, +39226=>12349, +39439=>12350, +39435=>12351, +39433=>12352, +39437=>12353, +39428=>12354, +39441=>12355, +39434=>12356, +39429=>12357, +39431=>12358, +39430=>12359, +39616=>12360, +39644=>12361, +39688=>12362, +39684=>12363, +39685=>12364, +39721=>12365, +39733=>12366, +39754=>12367, +39756=>12368, +39755=>12369, +39879=>12370, +39878=>12371, +39875=>12372, +39871=>12373, +39873=>12374, +39861=>12375, +39864=>12376, +39891=>12377, +39862=>12378, +39876=>12379, +39865=>12380, +39869=>12381, +40284=>12382, +40275=>12383, +40271=>12384, +40266=>12385, +40283=>12386, +40267=>12387, +40281=>12388, +40278=>12389, +40268=>12390, +40279=>12391, +40274=>12392, +40276=>12393, +40287=>12394, +40280=>12395, +40282=>12396, +40590=>12397, +40588=>12398, +40671=>12399, +40705=>12400, +40704=>12401, +40726=>12402, +58693=>12402, +40741=>12403, +40747=>12404, +40746=>12405, +40745=>12406, +40744=>12407, +40780=>12408, +40789=>12409, +20788=>12410, +20789=>12411, +21142=>12412, +21239=>12413, +21428=>12414, +22187=>12415, +22189=>12416, +22182=>12417, +22183=>12418, +22186=>12419, +22188=>12420, +22746=>12421, +22749=>12422, +22747=>12423, +22802=>12424, +23357=>12425, +23358=>12426, +23359=>12427, +24003=>12428, +24176=>12429, +24511=>12430, +25083=>12431, +25863=>12432, +25872=>12433, +25869=>12434, +25865=>12435, +25868=>12436, +25870=>12437, +25988=>12438, +26078=>12439, +26077=>12440, +26334=>12441, +27367=>12442, +27360=>12443, +27340=>12444, +27345=>12445, +27353=>12446, +27339=>12447, +27359=>12448, +27356=>12449, +27344=>12450, +27371=>12451, +27343=>12452, +27341=>12453, +27358=>12454, +27488=>12455, +27568=>12456, +27660=>12457, +28697=>12458, +28711=>12459, +28704=>12460, +28694=>12461, +28715=>12462, +28705=>12463, +28706=>12464, +28707=>12465, +28713=>12466, +28695=>12467, +28708=>12468, +28700=>12469, +29196=>12470, +29194=>12471, +29191=>12472, +29186=>12473, +29189=>12474, +29349=>12475, +29350=>12476, +29348=>12477, +29347=>12478, +29345=>12479, +29899=>12480, +29893=>12481, +29879=>12482, +29891=>12483, +29974=>12484, +30304=>12485, +30665=>12486, +30666=>12487, +30660=>12488, +30705=>12489, +31005=>12490, +31003=>12491, +31009=>12492, +31004=>12493, +30999=>12494, +31006=>12495, +31152=>12496, +31335=>12497, +31336=>12498, +31795=>12499, +31804=>12500, +31801=>12501, +31788=>12502, +31803=>12503, +31980=>12504, +31978=>12505, +32374=>12506, +32373=>12507, +32376=>12508, +32368=>12509, +32375=>12510, +32367=>12511, +32378=>12512, +32370=>12513, +32372=>12514, +32360=>12515, +32587=>12516, +32586=>12517, +32643=>12518, +32646=>12519, +32695=>12520, +32765=>12521, +32766=>12522, +32888=>12523, +33239=>12524, +33237=>12525, +33291=>12526, +33380=>12527, +33377=>12528, +33379=>12529, +34283=>12530, +34289=>12531, +34285=>12532, +34265=>12533, +34273=>12534, +34280=>12535, +34266=>12536, +34263=>12537, +34284=>12538, +34290=>12539, +34296=>12540, +34264=>12541, +34271=>12542, +34275=>12543, +34268=>12544, +34257=>12545, +34288=>12546, +34278=>12547, +34287=>12548, +34270=>12549, +34274=>12550, +34816=>12551, +34810=>12552, +34819=>12553, +34806=>12554, +34807=>12555, +34825=>12556, +34828=>12557, +34827=>12558, +34822=>12559, +34812=>12560, +34824=>12561, +34815=>12562, +34826=>12563, +34818=>12564, +35170=>12565, +35162=>12566, +35163=>12567, +35159=>12568, +35169=>12569, +35164=>12570, +35160=>12571, +35165=>12572, +35161=>12573, +35208=>12574, +35255=>12575, +35254=>12576, +35318=>12577, +35664=>12578, +35656=>12579, +35658=>12580, +35648=>12581, +35667=>12582, +35670=>12583, +35668=>12584, +35659=>12585, +35669=>12586, +35665=>12587, +35650=>12588, +35666=>12589, +35671=>12590, +35907=>12591, +35959=>12592, +35958=>12593, +35994=>12594, +36102=>12595, +36103=>12596, +36105=>12597, +36268=>12598, +36266=>12599, +36269=>12600, +36267=>12601, +36461=>12602, +36472=>12603, +36467=>12604, +36458=>12605, +36463=>12606, +36475=>12607, +36546=>12608, +36690=>12609, +36689=>12610, +36687=>12611, +36688=>12612, +36691=>12613, +36788=>12614, +37184=>12615, +37183=>12616, +37296=>12617, +37293=>12618, +37854=>12619, +37831=>12620, +37839=>12621, +37826=>12622, +37850=>12623, +37840=>12624, +37881=>12625, +37868=>12626, +37836=>12627, +37849=>12628, +37801=>12629, +37862=>12630, +37834=>12631, +37844=>12632, +37870=>12633, +37859=>12634, +37845=>12635, +37828=>12636, +37838=>12637, +37824=>12638, +37842=>12639, +37797=>12640, +37863=>12641, +38269=>12642, +38362=>12643, +38363=>12644, +38625=>12645, +38697=>12646, +38699=>12647, +38700=>12648, +38696=>12649, +38694=>12650, +38835=>12651, +38839=>12652, +38838=>12653, +38877=>12654, +38878=>12655, +38879=>12656, +39004=>12657, +39001=>12658, +39005=>12659, +38999=>12660, +39103=>12661, +39101=>12662, +39099=>12663, +39102=>12664, +39240=>12665, +39239=>12666, +39235=>12667, +39334=>12668, +39335=>12669, +39450=>12670, +39445=>12671, +39461=>12672, +39453=>12673, +39460=>12674, +39451=>12675, +39458=>12676, +39456=>12677, +39463=>12678, +39459=>12679, +39454=>12680, +39452=>12681, +39444=>12682, +39618=>12683, +39691=>12684, +39690=>12685, +39694=>12686, +39692=>12687, +39735=>12688, +39914=>12689, +39915=>12690, +39904=>12691, +39902=>12692, +39908=>12693, +39910=>12694, +39906=>12695, +39920=>12696, +39892=>12697, +39895=>12698, +39916=>12699, +39900=>12700, +39897=>12701, +39909=>12702, +39893=>12703, +39905=>12704, +39898=>12705, +40311=>12706, +40321=>12707, +40330=>12708, +40324=>12709, +40328=>12710, +40305=>12711, +40320=>12712, +40312=>12713, +40326=>12714, +40331=>12715, +40332=>12716, +40317=>12717, +40299=>12718, +40308=>12719, +40309=>12720, +40304=>12721, +40297=>12722, +40325=>12723, +40307=>12724, +40315=>12725, +40322=>12726, +40303=>12727, +40313=>12728, +40319=>12729, +40327=>12730, +40296=>12731, +40596=>12732, +40593=>12733, +40640=>12734, +40700=>12735, +40749=>12736, +40768=>12737, +40769=>12738, +40781=>12739, +40790=>12740, +40791=>12741, +40792=>12742, +21303=>12743, +22194=>12744, +22197=>12745, +22195=>12746, +22755=>12747, +23365=>12748, +24006=>12749, +24007=>12750, +24302=>12751, +24303=>12752, +24512=>12753, +24513=>12754, +25081=>12755, +25879=>12756, +25878=>12757, +25877=>12758, +25875=>12759, +26079=>12760, +26344=>12761, +26339=>12762, +26340=>12763, +27379=>12764, +27376=>12765, +27370=>12766, +27368=>12767, +27385=>12768, +27377=>12769, +27374=>12770, +27375=>12771, +28732=>12772, +28725=>12773, +28719=>12774, +28727=>12775, +28724=>12776, +28721=>12777, +28738=>12778, +28728=>12779, +28735=>12780, +28730=>12781, +28729=>12782, +28714=>12783, +28736=>12784, +28731=>12785, +28723=>12786, +28737=>12787, +29203=>12788, +29204=>12789, +29352=>12790, +29565=>12791, +29564=>12792, +29882=>12793, +30379=>12794, +30378=>12795, +30398=>12796, +30445=>12797, +30668=>12798, +30670=>12799, +30671=>12800, +30669=>12801, +30706=>12802, +31013=>12803, +31011=>12804, +31015=>12805, +31016=>12806, +31012=>12807, +31017=>12808, +31154=>12809, +31342=>12810, +31340=>12811, +31341=>12812, +31479=>12813, +31817=>12814, +31816=>12815, +31818=>12816, +31815=>12817, +31813=>12818, +31982=>12819, +32379=>12820, +32382=>12821, +32385=>12822, +32384=>12823, +32698=>12824, +32767=>12825, +32889=>12826, +33243=>12827, +33241=>12828, +33384=>12829, +33385=>12830, +34338=>12831, +34303=>12832, +34305=>12833, +34302=>12834, +34331=>12835, +34304=>12836, +34294=>12837, +34308=>12838, +34313=>12839, +34309=>12840, +34316=>12841, +34301=>12842, +34841=>12843, +34832=>12844, +34833=>12845, +34839=>12846, +34835=>12847, +34838=>12848, +35171=>12849, +35174=>12850, +35257=>12851, +35319=>12852, +35680=>12853, +35690=>12854, +35677=>12855, +35688=>12856, +35683=>12857, +35685=>12858, +35687=>12859, +35693=>12860, +36270=>12861, +36486=>12862, +36488=>12863, +36484=>12864, +36697=>12865, +36694=>12866, +36695=>12867, +36693=>12868, +36696=>12869, +36698=>12870, +37005=>12871, +37187=>12872, +37185=>12873, +37303=>12874, +37301=>12875, +37298=>12876, +37299=>12877, +37899=>12878, +37907=>12879, +37883=>12880, +37920=>12881, +37903=>12882, +37908=>12883, +37886=>12884, +37909=>12885, +37904=>12886, +37928=>12887, +37913=>12888, +37901=>12889, +37877=>12890, +37888=>12891, +37879=>12892, +37895=>12893, +37902=>12894, +37910=>12895, +37906=>12896, +37882=>12897, +37897=>12898, +37880=>12899, +37948=>12900, +37898=>12901, +37887=>12902, +37884=>12903, +37900=>12904, +37878=>12905, +37905=>12906, +37894=>12907, +38366=>12908, +38368=>12909, +38367=>12910, +38702=>12911, +38703=>12912, +38841=>12913, +38843=>12914, +38909=>12915, +38910=>12916, +39008=>12917, +39010=>12918, +39011=>12919, +39007=>12920, +39105=>12921, +39106=>12922, +39248=>12923, +39246=>12924, +39257=>12925, +39244=>12926, +39243=>12927, +39251=>12928, +39474=>12929, +39476=>12930, +39473=>12931, +39468=>12932, +39466=>12933, +39478=>12934, +39465=>12935, +39470=>12936, +39480=>12937, +39469=>12938, +39623=>12939, +39626=>12940, +39622=>12941, +39696=>12942, +39698=>12943, +39697=>12944, +39947=>12945, +39944=>12946, +39927=>12947, +39941=>12948, +39954=>12949, +39928=>12950, +40000=>12951, +39943=>12952, +39950=>12953, +39942=>12954, +39959=>12955, +39956=>12956, +39945=>12957, +40351=>12958, +40345=>12959, +40356=>12960, +40349=>12961, +40338=>12962, +40344=>12963, +40336=>12964, +40347=>12965, +40352=>12966, +40340=>12967, +40348=>12968, +40362=>12969, +40343=>12970, +40353=>12971, +40346=>12972, +40354=>12973, +40360=>12974, +40350=>12975, +40355=>12976, +40383=>12977, +40361=>12978, +40342=>12979, +40358=>12980, +40359=>12981, +40601=>12982, +40603=>12983, +40602=>12984, +40677=>12985, +40676=>12986, +40679=>12987, +40678=>12988, +40752=>12989, +40750=>12990, +40795=>12991, +40800=>12992, +40798=>12993, +40797=>12994, +40793=>12995, +40849=>12996, +20794=>12997, +20793=>12998, +21144=>12999, +21143=>13000, +22211=>13001, +22205=>13002, +22206=>13003, +23368=>13004, +23367=>13005, +24011=>13006, +24015=>13007, +24305=>13008, +25085=>13009, +25883=>13010, +27394=>13011, +27388=>13012, +27395=>13013, +27384=>13014, +27392=>13015, +28739=>13016, +28740=>13017, +28746=>13018, +28744=>13019, +28745=>13020, +28741=>13021, +28742=>13022, +29213=>13023, +29210=>13024, +29209=>13025, +29566=>13026, +29975=>13027, +30314=>13028, +30672=>13029, +31021=>13030, +31025=>13031, +31023=>13032, +31828=>13033, +31827=>13034, +31986=>13035, +32394=>13036, +60229=>13037, +32391=>13037, +32392=>13038, +32395=>13039, +32390=>13040, +32397=>13041, +32589=>13042, +32699=>13043, +32816=>13044, +33245=>13045, +34328=>13046, +34346=>13047, +34342=>13048, +34335=>13049, +34339=>13050, +34332=>13051, +34329=>13052, +34343=>13053, +34350=>13054, +34337=>13055, +34336=>13056, +34345=>13057, +34334=>13058, +34341=>13059, +34857=>13060, +34845=>13061, +34843=>13062, +34848=>13063, +34852=>13064, +34844=>13065, +34859=>13066, +34890=>13067, +35181=>13068, +35177=>13069, +35182=>13070, +35179=>13071, +35322=>13072, +35705=>13073, +35704=>13074, +35653=>13075, +35706=>13076, +35707=>13077, +36112=>13078, +36116=>13079, +36271=>13080, +36494=>13081, +36492=>13082, +36702=>13083, +36699=>13084, +36701=>13085, +37190=>13086, +37188=>13087, +37189=>13088, +37305=>13089, +37951=>13090, +37947=>13091, +37942=>13092, +37929=>13093, +37949=>13094, +37936=>13095, +37945=>13096, +37930=>13097, +37943=>13098, +37932=>13099, +37952=>13100, +37937=>13101, +38373=>13102, +38372=>13103, +38371=>13104, +38709=>13105, +38714=>13106, +38847=>13107, +38881=>13108, +39012=>13109, +39113=>13110, +39110=>13111, +39104=>13112, +39256=>13113, +39254=>13114, +39481=>13115, +39485=>13116, +39494=>13117, +39492=>13118, +39490=>13119, +39489=>13120, +39482=>13121, +39487=>13122, +39629=>13123, +39701=>13124, +39703=>13125, +39704=>13126, +39702=>13127, +39738=>13128, +39762=>13129, +39979=>13130, +39965=>13131, +39964=>13132, +39980=>13133, +39971=>13134, +39976=>13135, +39977=>13136, +39972=>13137, +39969=>13138, +40375=>13139, +40374=>13140, +40380=>13141, +40385=>13142, +40391=>13143, +40394=>13144, +40399=>13145, +40382=>13146, +40389=>13147, +40387=>13148, +40379=>13149, +40373=>13150, +40398=>13151, +40377=>13152, +40378=>13153, +40364=>13154, +40392=>13155, +40369=>13156, +40365=>13157, +40396=>13158, +40371=>13159, +40397=>13160, +40370=>13161, +40570=>13162, +40604=>13163, +40683=>13164, +40686=>13165, +40685=>13166, +40731=>13167, +40728=>13168, +40730=>13169, +40753=>13170, +40782=>13171, +40805=>13172, +40804=>13173, +40850=>13174, +20153=>13175, +22214=>13176, +22213=>13177, +22219=>13178, +22897=>13179, +23371=>13180, +23372=>13181, +24021=>13182, +24017=>13183, +24306=>13184, +25889=>13185, +25888=>13186, +25894=>13187, +25890=>13188, +27403=>13189, +27400=>13190, +27401=>13191, +27661=>13192, +28757=>13193, +28758=>13194, +28759=>13195, +28754=>13196, +29214=>13197, +29215=>13198, +29353=>13199, +29567=>13200, +29912=>13201, +29909=>13202, +29913=>13203, +29911=>13204, +30317=>13205, +30381=>13206, +31029=>13207, +31156=>13208, +31344=>13209, +31345=>13210, +31831=>13211, +31836=>13212, +31833=>13213, +31835=>13214, +31834=>13215, +31988=>13216, +31985=>13217, +32401=>13218, +32591=>13219, +32647=>13220, +33246=>13221, +33387=>13222, +34356=>13223, +34357=>13224, +34355=>13225, +34348=>13226, +34354=>13227, +34358=>13228, +34860=>13229, +34856=>13230, +34854=>13231, +34858=>13232, +34853=>13233, +35185=>13234, +35263=>13235, +35262=>13236, +35323=>13237, +35710=>13238, +35716=>13239, +35714=>13240, +35718=>13241, +35717=>13242, +35711=>13243, +36117=>13244, +36501=>13245, +36500=>13246, +36506=>13247, +36498=>13248, +36496=>13249, +36502=>13250, +36503=>13251, +36704=>13252, +36706=>13253, +37191=>13254, +37964=>13255, +37968=>13256, +37962=>13257, +37963=>13258, +37967=>13259, +37959=>13260, +37957=>13261, +37960=>13262, +37961=>13263, +37958=>13264, +38719=>13265, +38883=>13266, +39018=>13267, +39017=>13268, +39115=>13269, +39252=>13270, +39259=>13271, +39502=>13272, +39507=>13273, +39508=>13274, +39500=>13275, +39503=>13276, +39496=>13277, +39498=>13278, +39497=>13279, +39506=>13280, +39504=>13281, +39632=>13282, +39705=>13283, +39723=>13284, +39739=>13285, +39766=>13286, +39765=>13287, +40006=>13288, +40008=>13289, +39999=>13290, +40004=>13291, +39993=>13292, +39987=>13293, +40001=>13294, +39996=>13295, +39991=>13296, +39988=>13297, +39986=>13298, +39997=>13299, +39990=>13300, +40411=>13301, +40402=>13302, +40414=>13303, +40410=>13304, +40395=>13305, +40400=>13306, +40412=>13307, +40401=>13308, +40415=>13309, +40425=>13310, +40409=>13311, +40408=>13312, +40406=>13313, +40437=>13314, +40405=>13315, +40413=>13316, +40630=>13317, +40688=>13318, +40757=>13319, +40755=>13320, +40754=>13321, +40770=>13322, +40811=>13323, +40853=>13324, +40866=>13325, +20797=>13326, +21145=>13327, +22760=>13328, +22759=>13329, +22898=>13330, +23373=>13331, +24024=>13332, +34863=>13333, +24399=>13334, +25089=>13335, +25091=>13336, +25092=>13337, +25897=>13338, +25893=>13339, +26006=>13340, +26347=>13341, +27409=>13342, +27410=>13343, +27407=>13344, +27594=>13345, +28763=>13346, +28762=>13347, +29218=>13348, +29570=>13349, +29569=>13350, +29571=>13351, +30320=>13352, +30676=>13353, +31847=>13354, +31846=>13355, +32405=>13356, +33388=>13357, +34362=>13358, +34368=>13359, +34361=>13360, +34364=>13361, +34353=>13362, +34363=>13363, +34366=>13364, +34864=>13365, +34866=>13366, +34862=>13367, +34867=>13368, +35190=>13369, +35188=>13370, +35187=>13371, +35326=>13372, +35724=>13373, +35726=>13374, +35723=>13375, +35720=>13376, +35909=>13377, +36121=>13378, +36504=>13379, +36708=>13380, +36707=>13381, +37308=>13382, +37986=>13383, +37973=>13384, +37981=>13385, +37975=>13386, +37982=>13387, +38852=>13388, +38853=>13389, +38912=>13390, +39510=>13391, +39513=>13392, +39710=>13393, +39711=>13394, +39712=>13395, +40018=>13396, +40024=>13397, +40016=>13398, +40010=>13399, +40013=>13400, +40011=>13401, +40021=>13402, +40025=>13403, +40012=>13404, +40014=>13405, +40443=>13406, +40439=>13407, +40431=>13408, +40419=>13409, +40427=>13410, +40440=>13411, +40420=>13412, +40438=>13413, +40417=>13414, +40430=>13415, +40422=>13416, +40434=>13417, +40432=>13418, +60370=>13418, +40418=>13419, +40428=>13420, +40436=>13421, +40435=>13422, +40424=>13423, +40429=>13424, +40642=>13425, +40656=>13426, +40690=>13427, +40691=>13428, +40710=>13429, +40732=>13430, +40760=>13431, +40759=>13432, +40758=>13433, +40771=>13434, +40783=>13435, +40817=>13436, +40816=>13437, +40814=>13438, +40815=>13439, +22227=>13440, +22221=>13441, +23374=>13442, +23661=>13443, +25901=>13444, +26349=>13445, +26350=>13446, +27411=>13447, +28767=>13448, +28769=>13449, +28765=>13450, +28768=>13451, +29219=>13452, +29915=>13453, +29925=>13454, +30677=>13455, +31032=>13456, +31159=>13457, +31158=>13458, +31850=>13459, +32407=>13460, +32649=>13461, +33389=>13462, +34371=>13463, +34872=>13464, +34871=>13465, +34869=>13466, +34891=>13467, +35732=>13468, +35733=>13469, +36510=>13470, +36511=>13471, +36512=>13472, +36509=>13473, +37310=>13474, +37309=>13475, +37314=>13476, +37995=>13477, +37992=>13478, +37993=>13479, +38629=>13480, +38726=>13481, +38723=>13482, +38727=>13483, +38855=>13484, +38885=>13485, +39518=>13486, +39637=>13487, +39769=>13488, +40035=>13489, +40039=>13490, +40038=>13491, +40034=>13492, +40030=>13493, +40032=>13494, +40450=>13495, +40446=>13496, +40455=>13497, +40451=>13498, +40454=>13499, +40453=>13500, +40448=>13501, +40449=>13502, +40457=>13503, +40447=>13504, +40445=>13505, +40452=>13506, +40608=>13507, +40734=>13508, +40774=>13509, +40820=>13510, +40821=>13511, +40822=>13512, +22228=>13513, +25902=>13514, +26040=>13515, +27416=>13516, +27417=>13517, +27415=>13518, +27418=>13519, +28770=>13520, +29222=>13521, +29354=>13522, +30680=>13523, +30681=>13524, +31033=>13525, +31849=>13526, +31851=>13527, +31990=>13528, +32410=>13529, +32408=>13530, +32411=>13531, +32409=>13532, +33248=>13533, +33249=>13534, +34374=>13535, +34375=>13536, +34376=>13537, +35193=>13538, +35194=>13539, +35196=>13540, +35195=>13541, +35327=>13542, +35736=>13543, +35737=>13544, +36517=>13545, +36516=>13546, +36515=>13547, +37998=>13548, +37997=>13549, +37999=>13550, +38001=>13551, +38003=>13552, +38729=>13553, +39026=>13554, +39263=>13555, +40040=>13556, +40046=>13557, +40045=>13558, +40459=>13559, +40461=>13560, +40464=>13561, +40463=>13562, +40466=>13563, +40465=>13564, +40609=>13565, +40693=>13566, +40713=>13567, +40775=>13568, +40824=>13569, +40827=>13570, +40826=>13571, +40825=>13572, +22302=>13573, +28774=>13574, +31855=>13575, +34876=>13576, +36274=>13577, +36518=>13578, +37315=>13579, +38004=>13580, +38008=>13581, +38006=>13582, +38005=>13583, +39520=>13584, +39726=>13585, +60830=>13585, +40052=>13586, +40051=>13587, +40049=>13588, +40053=>13589, +40468=>13590, +40467=>13591, +40694=>13592, +40714=>13593, +40868=>13594, +28776=>13595, +28773=>13596, +31991=>13597, +34410=>13598, +34878=>13599, +34877=>13600, +34879=>13601, +35742=>13602, +35996=>13603, +36521=>13604, +36553=>13605, +38731=>13606, +39027=>13607, +39028=>13608, +39116=>13609, +39265=>13610, +39339=>13611, +39524=>13612, +39526=>13613, +39527=>13614, +39716=>13615, +40469=>13616, +40471=>13617, +40776=>13618, +25095=>13619, +27422=>13620, +29223=>13621, +34380=>13622, +36520=>13623, +38018=>13624, +38016=>13625, +38017=>13626, +39529=>13627, +39528=>13628, +40473=>13629, +34379=>13630, +35743=>13631, +38019=>13632, +40057=>13633, +40631=>13634, +30325=>13635, +39531=>13636, +40058=>13637, +40477=>13638, +28777=>13639, +28778=>13640, +29225=>13641, +40612=>13642, +40830=>13643, +40777=>13644, +40856=>13645, +65049=>13646, +65075=>13743, +9588=>13744, +65076=>13745, +65103=>13746, +168=>13747, +776=>13747, +63208=>13747, +710=>13748, +65342=>13748, +63209=>13748, +12541=>13749, +63210=>13749, +12542=>13750, +63211=>13750, +12445=>13751, +63212=>13751, +12446=>13752, +63213=>13752, +12293=>13754, +63216=>13754, +12294=>13755, +63217=>13755, +12295=>13756, +63218=>13756, +12540=>13757, +63219=>13757, +65339=>13758, +63220=>13758, +65341=>13759, +63221=>13759, +10045=>13760, +63222=>13760, +12353=>13761, +63223=>13761, +12354=>13762, +63224=>13762, +12355=>13763, +63225=>13763, +12356=>13764, +63226=>13764, +12357=>13765, +63227=>13765, +12358=>13766, +63228=>13766, +12359=>13767, +63229=>13767, +12360=>13768, +63230=>13768, +12361=>13769, +63231=>13769, +12362=>13770, +63232=>13770, +12363=>13771, +63233=>13771, +12364=>13772, +63234=>13772, +12365=>13773, +63235=>13773, +12366=>13774, +63236=>13774, +12367=>13775, +63237=>13775, +12368=>13776, +63238=>13776, +12369=>13777, +63239=>13777, +12370=>13778, +63240=>13778, +12371=>13779, +63241=>13779, +12372=>13780, +63242=>13780, +12373=>13781, +63243=>13781, +12374=>13782, +63244=>13782, +12375=>13783, +63245=>13783, +12376=>13784, +63246=>13784, +12377=>13785, +63247=>13785, +12378=>13786, +63248=>13786, +12379=>13787, +63249=>13787, +12380=>13788, +63250=>13788, +12381=>13789, +63251=>13789, +12382=>13790, +63252=>13790, +12383=>13791, +63253=>13791, +12384=>13792, +63254=>13792, +12385=>13793, +63255=>13793, +12386=>13794, +63256=>13794, +12387=>13795, +63257=>13795, +12388=>13796, +63258=>13796, +12389=>13797, +63259=>13797, +12390=>13798, +63260=>13798, +12391=>13799, +63261=>13799, +12392=>13800, +63262=>13800, +12393=>13801, +63263=>13801, +12394=>13802, +63264=>13802, +12395=>13803, +63265=>13803, +12396=>13804, +63266=>13804, +12397=>13805, +63267=>13805, +12398=>13806, +63268=>13806, +12399=>13807, +63269=>13807, +12400=>13808, +63270=>13808, +12401=>13809, +63271=>13809, +12402=>13810, +63272=>13810, +12403=>13811, +63273=>13811, +12404=>13812, +63274=>13812, +12405=>13813, +63275=>13813, +12406=>13814, +63276=>13814, +12407=>13815, +63277=>13815, +12408=>13816, +63278=>13816, +12409=>13817, +63279=>13817, +12410=>13818, +63280=>13818, +12411=>13819, +63281=>13819, +12412=>13820, +63282=>13820, +12413=>13821, +63283=>13821, +12414=>13822, +63284=>13822, +12415=>13823, +63285=>13823, +12416=>13824, +63286=>13824, +12417=>13825, +63287=>13825, +12418=>13826, +63288=>13826, +12419=>13827, +63289=>13827, +12420=>13828, +63290=>13828, +12421=>13829, +63291=>13829, +12422=>13830, +63292=>13830, +12423=>13831, +63293=>13831, +12424=>13832, +63294=>13832, +12425=>13833, +63295=>13833, +12426=>13834, +63296=>13834, +12427=>13835, +63297=>13835, +12428=>13836, +63298=>13836, +12429=>13837, +63299=>13837, +12430=>13838, +63300=>13838, +12431=>13839, +63301=>13839, +12432=>13840, +63302=>13840, +12433=>13841, +63303=>13841, +12434=>13842, +63304=>13842, +12435=>13843, +63305=>13843, +12449=>13844, +63306=>13844, +12450=>13845, +63307=>13845, +12451=>13846, +63308=>13846, +12452=>13847, +63309=>13847, +12453=>13848, +63310=>13848, +12454=>13849, +63311=>13849, +12455=>13850, +63312=>13850, +12456=>13851, +63313=>13851, +12457=>13852, +63314=>13852, +12458=>13853, +63315=>13853, +12459=>13854, +63316=>13854, +12460=>13855, +63317=>13855, +12461=>13856, +63318=>13856, +12462=>13857, +63319=>13857, +12463=>13858, +63320=>13858, +12464=>13859, +63321=>13859, +12465=>13860, +63322=>13860, +12466=>13861, +63323=>13861, +12467=>13862, +63324=>13862, +12468=>13863, +63325=>13863, +12469=>13864, +63326=>13864, +12470=>13865, +63327=>13865, +12471=>13866, +63328=>13866, +12472=>13867, +63329=>13867, +12473=>13868, +63330=>13868, +12474=>13869, +63331=>13869, +12475=>13870, +63332=>13870, +12476=>13871, +63333=>13871, +12477=>13872, +63334=>13872, +12478=>13873, +63335=>13873, +12479=>13874, +63336=>13874, +12480=>13875, +63337=>13875, +12481=>13876, +63338=>13876, +12482=>13877, +63339=>13877, +12483=>13878, +63340=>13878, +12484=>13879, +63341=>13879, +12485=>13880, +63342=>13880, +12486=>13881, +63343=>13881, +12487=>13882, +63344=>13882, +12488=>13883, +63345=>13883, +12489=>13884, +63346=>13884, +12490=>13885, +63347=>13885, +12491=>13886, +63348=>13886, +12492=>13887, +63349=>13887, +12493=>13888, +63350=>13888, +12494=>13889, +63351=>13889, +12495=>13890, +63352=>13890, +12496=>13891, +63353=>13891, +12497=>13892, +63354=>13892, +12498=>13893, +63355=>13893, +12499=>13894, +63356=>13894, +12500=>13895, +63357=>13895, +12501=>13896, +63358=>13896, +12502=>13897, +63359=>13897, +12503=>13898, +63360=>13898, +12504=>13899, +63361=>13899, +12505=>13900, +63362=>13900, +12506=>13901, +63363=>13901, +12507=>13902, +63364=>13902, +12508=>13903, +63365=>13903, +12509=>13904, +63366=>13904, +12510=>13905, +63367=>13905, +12511=>13906, +63368=>13906, +12512=>13907, +63369=>13907, +12513=>13908, +63370=>13908, +12514=>13909, +63371=>13909, +12515=>13910, +63372=>13910, +12516=>13911, +63373=>13911, +12517=>13912, +63374=>13912, +12518=>13913, +63375=>13913, +12519=>13914, +63376=>13914, +12520=>13915, +63377=>13915, +12521=>13916, +63378=>13916, +12522=>13917, +63379=>13917, +12523=>13918, +63380=>13918, +12524=>13919, +63381=>13919, +12525=>13920, +63382=>13920, +12526=>13921, +63383=>13921, +12527=>13922, +63384=>13922, +12528=>13923, +63385=>13923, +12529=>13924, +63386=>13924, +12530=>13925, +63387=>13925, +12531=>13926, +63388=>13926, +12532=>13927, +63389=>13927, +12533=>13928, +63390=>13928, +12534=>13929, +63391=>13929, +1040=>13930, +63392=>13930, +1041=>13931, +63393=>13931, +1042=>13932, +63394=>13932, +1043=>13933, +63395=>13933, +1044=>13934, +63396=>13934, +1045=>13935, +63397=>13935, +1025=>13936, +63398=>13936, +1046=>13937, +63399=>13937, +1047=>13938, +63400=>13938, +1048=>13939, +63401=>13939, +1049=>13940, +63402=>13940, +1050=>13941, +63403=>13941, +1051=>13942, +63404=>13942, +1052=>13943, +63405=>13943, +1053=>13944, +63406=>13944, +1054=>13945, +63407=>13945, +1055=>13946, +63408=>13946, +1056=>13947, +63409=>13947, +1057=>13948, +63410=>13948, +1058=>13949, +63411=>13949, +1059=>13950, +63412=>13950, +1060=>13951, +63413=>13951, +1061=>13952, +63414=>13952, +1062=>13953, +63415=>13953, +1063=>13954, +63416=>13954, +1064=>13955, +63417=>13955, +1065=>13956, +63418=>13956, +1066=>13957, +63419=>13957, +1067=>13958, +63420=>13958, +1068=>13959, +63421=>13959, +1069=>13960, +63422=>13960, +1070=>13961, +63423=>13961, +1071=>13962, +63424=>13962, +1072=>13963, +63425=>13963, +1073=>13964, +63426=>13964, +1074=>13965, +63427=>13965, +1075=>13966, +63428=>13966, +1076=>13967, +63429=>13967, +1077=>13968, +63430=>13968, +1105=>13969, +63431=>13969, +1078=>13970, +63432=>13970, +1079=>13971, +63433=>13971, +1080=>13972, +63434=>13972, +1081=>13973, +63435=>13973, +1082=>13974, +63436=>13974, +1083=>13975, +63437=>13975, +1084=>13976, +63438=>13976, +1085=>13977, +63439=>13977, +1086=>13978, +63440=>13978, +1087=>13979, +63441=>13979, +1088=>13980, +63442=>13980, +1089=>13981, +63443=>13981, +1090=>13982, +63444=>13982, +1091=>13983, +63445=>13983, +1092=>13984, +63446=>13984, +1093=>13985, +63447=>13985, +1094=>13986, +63448=>13986, +1095=>13987, +63449=>13987, +1096=>13988, +63450=>13988, +1097=>13989, +63451=>13989, +1098=>13990, +63452=>13990, +1099=>13991, +63453=>13991, +1100=>13992, +63454=>13992, +1101=>13993, +63455=>13993, +1102=>13994, +63456=>13994, +1103=>13995, +63457=>13995, +8679=>13996, +63458=>13996, +8632=>13997, +63459=>13997, +8633=>13998, +63460=>13998, +12751=>13999, +20033=>13999, +63461=>13999, +131276=>14000, +63462=>14000, +20058=>14001, +63463=>14001, +131210=>14002, +63464=>14002, +20994=>14003, +63465=>14003, +17553=>14004, +63466=>14004, +40880=>14005, +63467=>14005, +20872=>14006, +63468=>14006, +13853=>14007, +40881=>14007, +63469=>14007, +161287=>14008, +63470=>14008, +172=>14049, +65506=>14049, +63511=>14049, +65508=>14050, +63512=>14050, +65287=>14051, +63513=>14051, +65282=>14052, +63514=>14052, +12849=>14053, +63515=>14053, +8470=>14054, +63516=>14054, +8481=>14055, +63517=>14055, +30849=>14056, +37561=>14057, +58501=>14057, +35023=>14058, +22715=>14059, +24658=>14060, +31911=>14061, +23290=>14062, +9556=>14063, +9574=>14064, +9559=>14065, +9568=>14066, +9580=>14067, +9571=>14068, +9562=>14069, +9577=>14070, +9565=>14071, +9554=>14072, +9572=>14073, +9557=>14074, +9560=>14078, +9575=>14079, +9563=>14080, +9555=>14081, +9573=>14082, +9558=>14083, +9567=>14084, +9579=>14085, +9570=>14086, +9561=>14087, +9576=>14088, +9564=>14089, +9553=>14090, +9619=>14096, +65517=>14096, +65040=>14099, +65041=>14100, +65042=>14101, +65044=>14103, +65043=>14104, +65046=>14105, +65045=>14106, +147159=>14123, +58129=>14123, +22462=>14124, +58130=>14124, +159443=>14125, +58131=>14125, +28990=>14126, +58132=>14126, +153568=>14127, +58133=>14127, +27042=>14128, +58135=>14128, +166889=>14129, +58136=>14129, +23412=>14130, +58137=>14130, +31305=>14131, +58138=>14131, +153825=>14132, +58139=>14132, +169177=>14133, +58140=>14133, +31333=>14134, +58141=>14134, +31357=>14135, +58142=>14135, +154028=>14136, +58143=>14136, +31419=>14137, +58144=>14137, +31408=>14138, +58145=>14138, +31426=>14139, +58146=>14139, +31427=>14140, +58147=>14140, +29137=>14141, +58148=>14141, +156813=>14142, +58149=>14142, +16842=>14143, +58150=>14143, +31450=>14144, +58151=>14144, +31453=>14145, +58152=>14145, +31466=>14146, +58153=>14146, +16879=>14147, +58154=>14147, +21682=>14148, +58155=>14148, +154625=>14149, +58156=>14149, +31499=>14150, +58157=>14150, +31573=>14151, +58158=>14151, +31529=>14152, +58159=>14152, +152334=>14153, +58160=>14153, +154878=>14154, +58161=>14154, +31650=>14155, +58162=>14155, +31599=>14156, +58163=>14156, +33692=>14157, +58164=>14157, +154548=>14158, +58165=>14158, +158847=>14159, +58166=>14159, +31696=>14160, +58167=>14160, +33825=>14161, +58168=>14161, +31634=>14162, +58169=>14162, +58171=>14164, +154912=>14164, +33938=>14166, +58174=>14166, +31738=>14167, +58175=>14167, +31797=>14169, +58177=>14169, +154817=>14170, +58178=>14170, +31812=>14171, +58179=>14171, +31875=>14172, +58180=>14172, +149634=>14173, +58181=>14173, +31910=>14174, +58182=>14174, +148856=>14175, +58184=>14175, +31945=>14176, +58185=>14176, +31943=>14177, +58186=>14177, +31974=>14178, +58187=>14178, +31987=>14180, +58189=>14180, +31989=>14181, +58190=>14181, +32359=>14182, +58192=>14182, +17693=>14183, +58193=>14183, +159300=>14184, +58194=>14184, +32093=>14185, +58195=>14185, +159446=>14186, +58196=>14186, +32137=>14187, +58198=>14187, +32171=>14188, +58199=>14188, +28981=>14189, +58200=>14189, +32179=>14190, +58201=>14190, +32214=>14191, +147543=>14192, +58203=>14192, +155689=>14193, +58204=>14193, +32228=>14194, +58205=>14194, +15635=>14195, +58206=>14195, +32245=>14196, +58207=>14196, +137209=>14197, +58208=>14197, +32229=>14198, +58209=>14198, +164717=>14199, +58210=>14199, +155937=>14201, +58212=>14201, +155994=>14202, +58213=>14202, +32366=>14203, +58214=>14203, +17195=>14205, +58216=>14205, +37996=>14206, +58217=>14206, +32295=>14207, +58218=>14207, +32576=>14208, +58219=>14208, +32577=>14209, +58220=>14209, +32583=>14210, +58221=>14210, +31030=>14211, +58222=>14211, +156368=>14212, +58223=>14212, +39393=>14213, +58224=>14213, +32663=>14214, +58225=>14214, +156497=>14215, +58226=>14215, +32675=>14216, +58227=>14216, +136801=>14217, +58228=>14217, +131176=>14218, +58229=>14218, +17756=>14219, +58230=>14219, +145254=>14220, +58231=>14220, +164666=>14221, +58233=>14221, +32762=>14222, +58234=>14222, +156809=>14223, +58235=>14223, +64091=>14224, +32776=>14225, +58237=>14225, +32797=>14226, +58238=>14226, +32815=>14228, +58240=>14228, +172167=>14229, +58241=>14229, +158915=>14230, +58242=>14230, +32827=>14231, +58243=>14231, +32828=>14232, +58244=>14232, +32865=>14233, +58245=>14233, +141076=>14234, +58246=>14234, +18825=>14235, +58247=>14235, +157222=>14236, +58248=>14236, +146915=>14237, +58249=>14237, +157416=>14238, +58250=>14238, +26405=>14239, +58251=>14239, +32935=>14240, +58252=>14240, +166472=>14241, +58253=>14241, +33031=>14242, +58254=>14242, +33050=>14243, +58255=>14243, +22704=>14244, +58256=>14244, +141046=>14245, +58257=>14245, +27775=>14246, +58258=>14246, +156824=>14247, +58259=>14247, +25831=>14248, +58261=>14248, +136330=>14249, +58262=>14249, +33304=>14250, +58263=>14250, +137310=>14251, +58264=>14251, +27219=>14252, +58265=>14252, +150117=>14253, +58266=>14253, +150165=>14254, +58267=>14254, +17530=>14255, +58268=>14255, +33321=>14256, +58269=>14256, +158290=>14257, +58271=>14257, +146814=>14258, +58272=>14258, +20473=>14259, +58273=>14259, +136445=>14260, +58274=>14260, +34018=>14261, +58275=>14261, +33634=>14262, +58276=>14262, +194959=>14263, +149927=>14264, +58278=>14264, +144688=>14265, +58279=>14265, +137075=>14266, +58280=>14266, +146936=>14267, +58281=>14267, +33450=>14268, +58282=>14268, +26907=>14269, +58283=>14269, +194964=>14270, +58284=>14270, +16859=>14271, +58285=>14271, +34123=>14272, +58286=>14272, +33488=>14273, +58287=>14273, +33562=>14274, +58288=>14274, +134678=>14275, +58289=>14275, +137140=>14276, +58290=>14276, +14017=>14277, +58291=>14277, +143741=>14278, +58292=>14278, +144730=>14279, +58293=>14279, +33403=>14280, +58294=>14280, +33506=>14281, +58295=>14281, +33560=>14282, +58296=>14282, +147083=>14283, +58297=>14283, +159139=>14284, +58298=>14284, +158469=>14285, +58299=>14285, +158615=>14286, +58300=>14286, +144846=>14287, +58301=>14287, +15807=>14288, +58302=>14288, +33565=>14289, +58303=>14289, +21996=>14290, +58304=>14290, +33669=>14291, +58305=>14291, +17675=>14292, +58306=>14292, +159141=>14293, +58307=>14293, +33708=>14294, +58308=>14294, +33747=>14296, +58310=>14296, +159444=>14297, +58312=>14297, +27223=>14298, +58313=>14298, +34138=>14299, +58314=>14299, +13462=>14300, +58315=>14300, +159298=>14301, +58316=>14301, +33880=>14302, +58318=>14302, +154596=>14303, +58319=>14303, +33905=>14304, +58320=>14304, +15827=>14305, +58321=>14305, +17636=>14306, +58322=>14306, +27303=>14307, +58323=>14307, +33866=>14308, +58324=>14308, +31064=>14309, +58326=>14309, +158614=>14311, +58328=>14311, +159351=>14312, +58329=>14312, +159299=>14313, +58330=>14313, +34014=>14314, +58331=>14314, +33681=>14316, +58333=>14316, +17568=>14317, +58334=>14317, +33939=>14318, +58335=>14318, +34020=>14319, +58336=>14319, +154769=>14320, +58337=>14320, +16960=>14321, +58338=>14321, +154816=>14322, +58339=>14322, +17731=>14323, +58340=>14323, +34100=>14324, +58341=>14324, +23282=>14325, +58342=>14325, +17699=>14326, +17703=>14327, +58344=>14327, +34163=>14328, +58345=>14328, +17686=>14329, +58346=>14329, +26559=>14330, +58347=>14330, +34326=>14331, +58348=>14331, +165413=>14332, +58349=>14332, +165435=>14333, +58350=>14333, +34241=>14334, +58351=>14334, +159880=>14335, +58352=>14335, +34306=>14336, +58353=>14336, +136578=>14337, +58354=>14337, +159949=>14338, +58355=>14338, +194994=>14339, +58356=>14339, +17770=>14340, +58357=>14340, +34344=>14341, +58358=>14341, +13896=>14342, +58359=>14342, +137378=>14343, +58360=>14343, +21495=>14344, +58361=>14344, +160666=>14345, +58362=>14345, +34430=>14346, +58363=>14346, +172280=>14348, +58365=>14348, +34798=>14349, +58366=>14349, +142375=>14350, +58367=>14350, +34737=>14351, +58368=>14351, +34778=>14352, +58369=>14352, +34831=>14353, +60990=>14353, +58370=>14353, +22113=>14354, +58371=>14354, +34412=>14355, +58372=>14355, +26710=>14356, +58373=>14356, +17935=>14357, +58374=>14357, +34885=>14358, +58375=>14358, +34886=>14359, +58376=>14359, +161248=>14360, +58377=>14360, +146873=>14361, +58378=>14361, +161252=>14362, +58379=>14362, +34910=>14363, +58380=>14363, +34972=>14364, +58381=>14364, +18011=>14365, +58382=>14365, +34996=>14366, +58383=>14366, +34997=>14367, +58384=>14367, +35013=>14368, +58386=>14368, +161551=>14369, +58388=>14369, +35207=>14370, +58389=>14370, +35239=>14374, +58393=>14374, +35260=>14375, +58394=>14375, +166437=>14376, +58395=>14376, +35303=>14377, +58396=>14377, +162084=>14378, +58397=>14378, +162493=>14379, +58398=>14379, +35484=>14380, +58399=>14380, +30611=>14381, +58400=>14381, +37374=>14382, +58401=>14382, +35472=>14383, +58402=>14383, +162393=>14384, +58403=>14384, +31465=>14385, +58404=>14385, +162618=>14386, +58405=>14386, +18195=>14387, +58407=>14387, +162616=>14388, +58408=>14388, +29052=>14389, +58409=>14389, +35596=>14390, +58410=>14390, +35615=>14391, +58411=>14391, +152624=>14392, +58412=>14392, +152933=>14393, +58413=>14393, +35647=>14394, +58414=>14394, +35661=>14396, +58416=>14396, +35497=>14397, +58417=>14397, +150138=>14398, +58418=>14398, +35728=>14399, +58419=>14399, +35739=>14400, +58420=>14400, +35503=>14401, +58421=>14401, +136927=>14402, +58422=>14402, +17941=>14403, +58423=>14403, +34895=>14404, +58424=>14404, +35995=>14405, +58425=>14405, +163156=>14406, +58426=>14406, +163215=>14407, +58427=>14407, +195028=>14408, +58428=>14408, +14117=>14409, +58429=>14409, +163155=>14410, +58430=>14410, +36054=>14411, +58431=>14411, +163224=>14412, +58432=>14412, +163261=>14413, +58433=>14413, +36114=>14414, +58434=>14414, +36099=>14415, +58435=>14415, +137488=>14416, +58436=>14416, +36059=>14417, +58437=>14417, +28764=>14418, +58438=>14418, +36113=>14419, +58439=>14419, +16080=>14420, +58441=>14420, +195031=>14421, +36265=>14422, +58443=>14422, +163842=>14423, +58444=>14423, +135188=>14424, +58445=>14424, +149898=>14425, +58446=>14425, +15228=>14426, +58447=>14426, +164284=>14427, +58448=>14427, +160012=>14428, +58449=>14428, +31463=>14429, +58450=>14429, +36525=>14430, +58451=>14430, +36534=>14431, +58452=>14431, +36547=>14432, +58453=>14432, +37588=>14433, +58454=>14433, +36633=>14434, +58455=>14434, +36653=>14435, +58456=>14435, +164709=>14436, +58457=>14436, +164882=>14437, +58458=>14437, +36773=>14438, +58459=>14438, +37635=>14439, +58460=>14439, +172703=>14440, +58461=>14440, +133712=>14441, +58462=>14441, +36787=>14442, +58463=>14442, +166366=>14444, +58465=>14444, +165181=>14445, +58466=>14445, +146875=>14446, +58467=>14446, +24312=>14447, +58468=>14447, +143970=>14448, +58469=>14448, +36857=>14449, +58470=>14449, +140069=>14451, +58474=>14451, +14720=>14452, +58475=>14452, +159447=>14453, +58476=>14453, +36919=>14454, +58477=>14454, +165180=>14455, +58478=>14455, +162494=>14456, +58479=>14456, +36961=>14457, +58480=>14457, +165228=>14458, +58481=>14458, +165387=>14459, +58482=>14459, +37032=>14460, +58483=>14460, +165651=>14461, +58484=>14461, +37060=>14462, +58485=>14462, +165606=>14463, +58486=>14463, +37038=>14464, +58487=>14464, +64038=>14465, +37223=>14466, +58489=>14466, +37289=>14467, +58491=>14467, +37316=>14468, +58492=>14468, +31916=>14469, +58493=>14469, +166195=>14470, +58494=>14470, +138889=>14471, +58495=>14471, +37390=>14472, +58496=>14472, +27807=>14473, +58497=>14473, +37441=>14474, +58498=>14474, +37474=>14475, +58499=>14475, +153017=>14476, +58500=>14476, +166598=>14477, +58502=>14477, +146587=>14478, +58503=>14478, +166668=>14479, +58504=>14479, +153051=>14480, +58505=>14480, +134449=>14481, +58506=>14481, +37676=>14482, +58507=>14482, +37739=>14483, +58508=>14483, +166625=>14484, +58509=>14484, +166891=>14485, +58510=>14485, +23235=>14486, +58512=>14486, +166626=>14487, +58513=>14487, +166629=>14488, +58514=>14488, +18789=>14489, +58515=>14489, +37444=>14490, +58516=>14490, +166892=>14491, +58517=>14491, +166969=>14492, +58518=>14492, +166911=>14493, +58519=>14493, +37747=>14494, +58520=>14494, +37979=>14495, +58521=>14495, +36540=>14496, +58522=>14496, +38277=>14497, +58523=>14497, +38310=>14498, +58524=>14498, +37926=>14499, +58525=>14499, +38304=>14500, +58526=>14500, +28662=>14501, +58527=>14501, +17081=>14502, +58528=>14502, +165592=>14503, +58530=>14503, +135804=>14504, +58531=>14504, +146990=>14505, +58532=>14505, +18911=>14506, +58533=>14506, +27676=>14507, +58534=>14507, +38523=>14508, +58535=>14508, +38550=>14509, +58536=>14509, +16748=>14510, +58537=>14510, +38563=>14511, +58538=>14511, +159445=>14512, +58539=>14512, +25050=>14513, +58540=>14513, +58541=>14514, +30965=>14515, +58542=>14515, +166624=>14516, +58543=>14516, +38589=>14517, +58544=>14517, +21452=>14518, +58545=>14518, +18849=>14519, +58546=>14519, +158904=>14520, +58547=>14520, +131700=>14521, +58548=>14521, +156688=>14522, +58549=>14522, +168111=>14523, +58550=>14523, +168165=>14524, +58551=>14524, +150225=>14525, +58552=>14525, +137493=>14526, +58553=>14526, +144138=>14527, +58554=>14527, +38705=>14528, +58555=>14528, +34370=>14529, +58556=>14529, +38710=>14530, +58557=>14530, +18959=>14531, +58558=>14531, +17725=>14532, +58559=>14532, +17797=>14533, +58560=>14533, +150249=>14534, +58561=>14534, +28789=>14535, +58562=>14535, +23361=>14536, +58563=>14536, +38683=>14537, +58564=>14537, +168405=>14539, +58566=>14539, +38743=>14540, +58567=>14540, +23370=>14541, +58568=>14541, +168427=>14542, +58569=>14542, +38751=>14543, +58570=>14543, +37925=>14544, +58571=>14544, +20688=>14545, +58572=>14545, +143543=>14546, +58573=>14546, +143548=>14547, +58574=>14547, +38793=>14548, +58575=>14548, +38815=>14549, +58576=>14549, +38833=>14550, +58577=>14550, +38846=>14551, +58578=>14551, +38848=>14552, +58579=>14552, +38866=>14553, +58580=>14553, +38880=>14554, +58581=>14554, +152684=>14555, +58582=>14555, +38894=>14556, +58583=>14556, +29724=>14557, +58584=>14557, +169011=>14558, +58585=>14558, +38901=>14560, +58587=>14560, +168989=>14561, +58588=>14561, +162170=>14562, +58589=>14562, +19153=>14563, +58590=>14563, +38964=>14564, +58591=>14564, +38963=>14565, +58592=>14565, +38987=>14566, +58593=>14566, +39014=>14567, +58594=>14567, +15118=>14568, +58595=>14568, +160117=>14569, +58596=>14569, +15697=>14570, +58597=>14570, +132656=>14571, +58598=>14571, +147804=>14572, +58599=>14572, +153350=>14573, +58600=>14573, +39114=>14574, +58601=>14574, +39095=>14575, +58602=>14575, +39112=>14576, +58603=>14576, +39111=>14577, +58604=>14577, +19199=>14578, +58605=>14578, +159015=>14579, +58606=>14579, +136915=>14580, +58607=>14580, +21936=>14581, +58608=>14581, +39137=>14582, +58609=>14582, +39142=>14583, +58610=>14583, +39148=>14584, +58611=>14584, +37752=>14585, +58612=>14585, +39225=>14586, +58613=>14586, +150057=>14587, +58614=>14587, +19314=>14588, +58615=>14588, +170071=>14589, +58616=>14589, +170245=>14590, +58617=>14590, +39413=>14591, +58618=>14591, +39436=>14592, +58619=>14592, +39483=>14593, +58620=>14593, +39440=>14594, +58621=>14594, +39512=>14595, +58622=>14595, +153381=>14596, +58623=>14596, +14020=>14597, +58624=>14597, +168113=>14598, +58625=>14598, +170965=>14599, +58626=>14599, +39648=>14600, +58627=>14600, +39650=>14601, +58628=>14601, +170757=>14602, +58629=>14602, +39668=>14603, +58630=>14603, +19470=>14604, +58631=>14604, +39700=>14605, +58632=>14605, +39725=>14606, +58633=>14606, +165376=>14607, +58634=>14607, +20532=>14608, +58635=>14608, +39732=>14609, +58636=>14609, +14531=>14610, +58638=>14610, +143485=>14611, +58639=>14611, +39760=>14612, +58640=>14612, +39744=>14613, +58641=>14613, +171326=>14614, +58642=>14614, +23109=>14615, +58643=>14615, +137315=>14616, +58644=>14616, +39822=>14617, +58645=>14617, +39938=>14618, +58647=>14618, +39935=>14619, +58648=>14619, +39948=>14620, +58649=>14620, +171624=>14621, +58650=>14621, +40404=>14622, +58651=>14622, +171959=>14623, +58652=>14623, +172434=>14624, +58653=>14624, +172459=>14625, +58654=>14625, +172257=>14626, +58655=>14626, +172323=>14627, +58656=>14627, +172511=>14628, +58657=>14628, +40318=>14629, +58658=>14629, +40323=>14630, +58659=>14630, +172340=>14631, +58660=>14631, +40462=>14632, +58661=>14632, +40388=>14633, +58663=>14633, +172435=>14634, +58665=>14634, +172576=>14635, +58666=>14635, +137531=>14636, +58667=>14636, +172595=>14637, +58668=>14637, +40249=>14638, +58669=>14638, +172217=>14639, +58670=>14639, +172724=>14640, +58671=>14640, +40592=>14641, +58672=>14641, +40597=>14642, +58673=>14642, +40606=>14643, +58674=>14643, +40610=>14644, +58675=>14644, +19764=>14645, +58676=>14645, +40618=>14646, +58677=>14646, +40623=>14647, +58678=>14647, +148324=>14648, +58679=>14648, +40641=>14649, +58680=>14649, +15200=>14650, +58681=>14650, +14821=>14651, +58682=>14651, +15645=>14652, +58683=>14652, +20274=>14653, +58684=>14653, +14270=>14654, +58685=>14654, +166955=>14655, +58686=>14655, +40706=>14656, +58687=>14656, +40712=>14657, +58688=>14657, +19350=>14658, +58689=>14658, +37924=>14659, +58690=>14659, +159138=>14660, +58691=>14660, +40727=>14661, +60836=>14661, +58692=>14661, +195099=>14662, +40761=>14663, +58694=>14663, +22175=>14664, +58695=>14664, +22154=>14665, +58696=>14665, +40773=>14666, +58697=>14666, +39352=>14667, +58698=>14667, +168075=>14668, +58699=>14668, +38898=>14669, +58700=>14669, +33919=>14670, +58701=>14670, +40809=>14672, +58703=>14672, +31452=>14673, +58704=>14673, +40846=>14674, +58705=>14674, +29206=>14675, +58706=>14675, +19390=>14676, +58707=>14676, +149877=>14677, +58708=>14677, +149947=>14678, +58709=>14678, +29047=>14679, +58710=>14679, +150008=>14680, +58711=>14680, +148296=>14681, +58712=>14681, +150097=>14682, +58713=>14682, +29598=>14683, +58714=>14683, +166874=>14684, +58715=>14684, +137466=>14685, +58716=>14685, +31135=>14686, +58717=>14686, +166270=>14687, +58718=>14687, +167478=>14688, +58719=>14688, +37737=>14689, +58720=>14689, +37875=>14690, +58721=>14690, +166468=>14691, +58722=>14691, +37612=>14692, +58723=>14692, +37761=>14693, +58724=>14693, +37835=>14694, +58725=>14694, +166252=>14695, +58726=>14695, +148665=>14696, +58727=>14696, +29207=>14697, +58728=>14697, +16107=>14698, +58729=>14698, +30578=>14699, +58730=>14699, +31299=>14700, +58731=>14700, +28880=>14701, +58732=>14701, +148595=>14702, +58733=>14702, +148472=>14703, +58734=>14703, +29054=>14704, +58735=>14704, +137199=>14705, +58736=>14705, +28835=>14706, +58737=>14706, +137406=>14707, +58738=>14707, +144793=>14708, +58739=>14708, +16071=>14709, +58740=>14709, +137349=>14710, +58741=>14710, +152623=>14711, +58742=>14711, +137208=>14712, +58743=>14712, +14114=>14713, +58744=>14713, +136955=>14714, +58745=>14714, +137273=>14715, +58746=>14715, +14049=>14716, +58747=>14716, +137076=>14717, +58748=>14717, +137425=>14718, +58749=>14718, +155467=>14719, +58750=>14719, +14115=>14720, +58751=>14720, +136896=>14721, +58752=>14721, +22363=>14722, +58753=>14722, +150053=>14723, +58754=>14723, +136190=>14724, +58755=>14724, +135848=>14725, +58756=>14725, +136134=>14726, +58757=>14726, +136374=>14727, +58758=>14727, +34051=>14728, +58761=>14728, +58759=>14728, +145062=>14729, +58760=>14729, +33877=>14731, +58762=>14731, +149908=>14732, +58763=>14732, +160101=>14733, +58764=>14733, +146993=>14734, +58765=>14734, +152924=>14735, +58766=>14735, +147195=>14736, +58767=>14736, +159826=>14737, +58768=>14737, +17652=>14738, +58769=>14738, +145134=>14739, +58770=>14739, +170397=>14740, +58771=>14740, +159526=>14741, +58772=>14741, +26617=>14742, +58773=>14742, +14131=>14743, +58774=>14743, +15381=>14744, +58775=>14744, +15847=>14745, +58776=>14745, +22636=>14746, +58777=>14746, +137506=>14747, +58778=>14747, +26640=>14748, +58779=>14748, +16471=>14749, +58780=>14749, +145215=>14750, +58781=>14750, +147681=>14751, +58782=>14751, +147595=>14752, +58783=>14752, +147727=>14753, +58784=>14753, +158753=>14754, +58785=>14754, +21707=>14755, +58786=>14755, +22174=>14756, +58787=>14756, +157361=>14757, +58788=>14757, +22162=>14758, +58789=>14758, +135135=>14759, +58790=>14759, +134056=>14760, +58791=>14760, +134669=>14761, +58792=>14761, +166675=>14763, +58794=>14763, +37788=>14764, +58795=>14764, +20216=>14765, +58796=>14765, +20779=>14766, +58797=>14766, +14361=>14767, +58798=>14767, +148534=>14768, +58799=>14768, +20156=>14769, +58800=>14769, +132197=>14770, +58801=>14770, +20299=>14772, +58803=>14772, +20362=>14773, +58804=>14773, +153169=>14774, +58805=>14774, +23144=>14775, +58806=>14775, +131499=>14776, +58807=>14776, +132043=>14777, +58808=>14777, +14745=>14778, +58809=>14778, +131850=>14779, +58810=>14779, +132116=>14780, +58811=>14780, +13365=>14781, +58812=>14781, +20265=>14782, +58813=>14782, +131776=>14783, +58814=>14783, +167603=>14784, +58815=>14784, +131701=>14785, +58816=>14785, +35546=>14786, +58817=>14786, +131596=>14787, +58818=>14787, +20120=>14788, +58819=>14788, +20685=>14789, +58820=>14789, +20749=>14790, +58821=>14790, +20386=>14791, +58822=>14791, +20227=>14792, +58823=>14792, +150030=>14793, +58824=>14793, +147082=>14794, +58825=>14794, +20290=>14795, +58826=>14795, +20526=>14796, +58827=>14796, +20588=>14797, +58828=>14797, +20609=>14798, +58829=>14798, +20428=>14799, +58830=>14799, +20453=>14800, +58831=>14800, +20568=>14801, +58832=>14801, +20732=>14802, +58833=>14802, +28278=>14803, +58838=>14803, +144789=>14804, +58839=>14804, +147001=>14805, +58840=>14805, +147135=>14806, +58841=>14806, +28018=>14807, +58842=>14807, +137348=>14808, +58843=>14808, +147081=>14809, +58844=>14809, +20904=>14810, +58845=>14810, +20931=>14811, +58846=>14811, +132576=>14812, +58847=>14812, +17629=>14813, +58848=>14813, +132259=>14814, +58849=>14814, +132242=>14815, +58850=>14815, +132241=>14816, +58851=>14816, +36218=>14817, +58852=>14817, +166556=>14818, +58853=>14818, +132878=>14819, +58854=>14819, +21081=>14820, +58855=>14820, +21156=>14821, +58856=>14821, +133235=>14822, +58857=>14822, +21217=>14823, +58858=>14823, +18042=>14825, +58860=>14825, +29068=>14826, +58861=>14826, +148364=>14827, +58862=>14827, +134176=>14828, +58863=>14828, +149932=>14829, +58864=>14829, +135396=>14830, +58865=>14830, +27089=>14831, +58866=>14831, +134685=>14832, +58867=>14832, +16094=>14834, +58869=>14834, +29849=>14835, +58870=>14835, +29716=>14836, +58871=>14836, +29782=>14837, +58872=>14837, +29592=>14838, +58873=>14838, +19342=>14839, +58874=>14839, +150204=>14840, +58875=>14840, +147597=>14841, +58876=>14841, +21456=>14842, +58877=>14842, +13700=>14843, +58878=>14843, +29199=>14844, +58879=>14844, +147657=>14845, +58880=>14845, +21940=>14846, +58881=>14846, +131909=>14847, +58882=>14847, +21709=>14848, +58883=>14848, +134086=>14849, +58884=>14849, +22301=>14850, +58885=>14850, +37469=>14851, +58886=>14851, +38644=>14852, +58887=>14852, +22493=>14853, +58889=>14853, +22413=>14854, +58890=>14854, +22399=>14855, +58891=>14855, +13886=>14856, +58892=>14856, +22731=>14857, +58893=>14857, +23193=>14858, +58894=>14858, +166470=>14859, +58895=>14859, +136954=>14860, +58896=>14860, +137071=>14861, +58897=>14861, +136976=>14862, +58898=>14862, +23084=>14863, +58899=>14863, +22968=>14864, +58900=>14864, +23166=>14865, +58902=>14865, +23247=>14866, +58903=>14866, +23058=>14867, +58904=>14867, +153926=>14868, +58905=>14868, +137715=>14869, +58906=>14869, +137313=>14870, +58907=>14870, +148117=>14871, +58908=>14871, +14069=>14872, +58909=>14872, +27909=>14873, +58910=>14873, +29763=>14874, +58911=>14874, +23073=>14875, +58912=>14875, +155267=>14876, +58913=>14876, +23169=>14877, +58914=>14877, +166871=>14878, +58915=>14878, +132115=>14879, +58916=>14879, +37856=>14880, +58917=>14880, +29836=>14881, +58918=>14881, +135939=>14882, +58919=>14882, +28933=>14883, +58920=>14883, +18802=>14884, +58921=>14884, +37896=>14885, +58922=>14885, +166395=>14886, +58923=>14886, +37821=>14887, +58924=>14887, +14240=>14888, +58925=>14888, +23582=>14889, +58926=>14889, +23710=>14890, +58927=>14890, +24158=>14891, +58928=>14891, +24136=>14892, +58929=>14892, +137622=>14893, +58930=>14893, +137596=>14894, +58931=>14894, +146158=>14895, +58932=>14895, +24269=>14896, +58933=>14896, +23375=>14897, +58934=>14897, +58935=>14898, +137475=>14898, +58936=>14899, +137476=>14899, +14081=>14900, +58937=>14900, +137376=>14901, +58938=>14901, +14045=>14902, +58939=>14902, +136958=>14903, +58940=>14903, +14035=>14904, +58941=>14904, +33066=>14905, +58942=>14905, +166471=>14906, +58943=>14906, +138682=>14907, +58944=>14907, +144498=>14908, +58945=>14908, +166312=>14909, +58946=>14909, +24332=>14910, +60916=>14910, +58947=>14910, +24334=>14911, +58948=>14911, +137511=>14912, +58949=>14912, +137131=>14913, +58950=>14913, +23147=>14914, +58951=>14914, +137019=>14915, +58952=>14915, +23364=>14916, +58953=>14916, +161277=>14917, +58955=>14917, +34912=>14918, +58956=>14918, +24702=>14919, +58957=>14919, +141408=>14920, +58958=>14920, +140843=>14921, +58959=>14921, +24539=>14922, +58960=>14922, +16056=>14923, +58961=>14923, +140719=>14924, +58962=>14924, +140734=>14925, +58963=>14925, +168072=>14926, +58964=>14926, +159603=>14927, +58965=>14927, +25024=>14928, +58966=>14928, +131134=>14929, +58967=>14929, +131142=>14930, +58968=>14930, +140827=>14931, +58969=>14931, +24985=>14932, +58970=>14932, +24984=>14933, +58971=>14933, +24693=>14934, +58972=>14934, +142491=>14935, +58973=>14935, +142599=>14936, +58974=>14936, +149204=>14937, +58975=>14937, +168269=>14938, +58976=>14938, +25713=>14939, +58977=>14939, +149093=>14940, +58978=>14940, +142186=>14941, +58979=>14941, +14889=>14942, +58980=>14942, +142114=>14943, +58981=>14943, +144464=>14944, +58982=>14944, +170218=>14945, +58983=>14945, +142968=>14946, +58984=>14946, +25399=>14947, +58985=>14947, +25782=>14948, +58987=>14948, +25393=>14949, +58988=>14949, +25553=>14950, +58989=>14950, +149987=>14951, +58990=>14951, +142695=>14952, +58991=>14952, +25252=>14953, +58992=>14953, +142497=>14954, +58993=>14954, +25659=>14955, +58994=>14955, +25963=>14956, +58995=>14956, +26994=>14957, +58996=>14957, +15348=>14958, +58997=>14958, +143502=>14959, +58998=>14959, +144045=>14960, +58999=>14960, +149897=>14961, +59000=>14961, +144043=>14962, +59001=>14962, +21773=>14963, +59002=>14963, +144096=>14964, +59003=>14964, +137433=>14965, +59004=>14965, +169023=>14966, +59005=>14966, +26318=>14967, +59006=>14967, +144009=>14968, +59007=>14968, +143795=>14969, +59008=>14969, +15072=>14970, +59009=>14970, +152964=>14971, +59011=>14971, +166690=>14972, +59012=>14972, +152975=>14973, +59013=>14973, +136956=>14974, +59014=>14974, +152923=>14975, +59015=>14975, +152613=>14976, +59016=>14976, +30958=>14977, +59017=>14977, +143619=>14978, +59018=>14978, +137258=>14979, +59019=>14979, +143924=>14980, +59020=>14980, +13412=>14981, +59021=>14981, +143887=>14982, +59022=>14982, +143746=>14983, +59023=>14983, +148169=>14984, +59024=>14984, +26254=>14985, +59025=>14985, +159012=>14986, +59026=>14986, +26219=>14987, +59027=>14987, +19347=>14988, +59028=>14988, +26160=>14989, +59029=>14989, +161904=>14990, +59030=>14990, +138731=>14991, +59031=>14991, +26211=>14992, +59032=>14992, +144082=>14993, +59033=>14993, +144097=>14994, +59034=>14994, +26142=>14995, +59035=>14995, +153714=>14996, +59036=>14996, +14545=>14997, +59037=>14997, +145466=>14998, +59038=>14998, +145340=>14999, +59039=>14999, +15257=>15000, +59040=>15000, +145314=>15001, +59041=>15001, +144382=>15002, +59042=>15002, +29904=>15003, +59043=>15003, +15254=>15004, +59044=>15004, +149034=>15005, +59046=>15005, +26806=>15006, +59047=>15006, +15300=>15008, +59049=>15008, +27326=>15009, +59050=>15009, +145365=>15010, +59052=>15010, +148615=>15011, +59053=>15011, +27187=>15012, +59054=>15012, +27218=>15013, +59055=>15013, +27337=>15014, +59056=>15014, +27397=>15015, +59057=>15015, +137490=>15016, +59058=>15016, +25873=>15017, +59059=>15017, +26776=>15018, +59060=>15018, +27212=>15019, +59061=>15019, +15319=>15020, +59062=>15020, +27258=>15021, +59063=>15021, +27479=>15022, +59064=>15022, +147392=>15023, +59065=>15023, +146586=>15024, +59066=>15024, +37792=>15025, +59067=>15025, +37618=>15026, +59068=>15026, +166890=>15027, +59069=>15027, +166603=>15028, +59070=>15028, +37513=>15029, +59071=>15029, +163870=>15030, +59072=>15030, +166364=>15031, +59073=>15031, +37991=>15032, +59074=>15032, +28069=>15033, +59075=>15033, +28427=>15034, +59076=>15034, +147327=>15036, +59079=>15036, +15759=>15037, +59080=>15037, +28164=>15038, +59081=>15038, +147516=>15039, +59082=>15039, +23101=>15040, +59083=>15040, +28170=>15041, +59084=>15041, +22599=>15042, +59085=>15042, +27940=>15043, +59086=>15043, +30786=>15044, +59087=>15044, +28987=>15045, +59088=>15045, +148250=>15046, +59089=>15046, +148086=>15047, +59090=>15047, +28913=>15048, +59091=>15048, +29264=>15049, +61085=>15049, +59092=>15049, +29319=>15050, +59093=>15050, +29332=>15051, +59094=>15051, +149391=>15052, +59095=>15052, +149285=>15053, +59096=>15053, +20857=>15054, +59097=>15054, +150180=>15055, +59098=>15055, +132587=>15056, +59099=>15056, +29818=>15057, +59100=>15057, +147192=>15058, +59101=>15058, +144991=>15059, +59102=>15059, +150090=>15060, +59103=>15060, +149783=>15061, +59104=>15061, +155617=>15062, +59105=>15062, +16134=>15063, +59106=>15063, +16049=>15064, +59107=>15064, +150239=>15065, +59108=>15065, +166947=>15066, +59109=>15066, +147253=>15067, +59110=>15067, +24743=>15068, +59111=>15068, +16115=>15069, +59112=>15069, +29900=>15070, +59113=>15070, +29756=>15071, +59114=>15071, +37767=>15072, +59115=>15072, +29751=>15073, +59116=>15073, +17567=>15074, +59117=>15074, +159210=>15075, +59118=>15075, +17745=>15076, +59119=>15076, +30083=>15077, +59120=>15077, +16227=>15078, +59121=>15078, +150745=>15079, +59122=>15079, +150790=>15080, +59123=>15080, +16216=>15081, +59124=>15081, +30037=>15082, +59125=>15082, +30323=>15083, +59126=>15083, +173510=>15084, +59127=>15084, +29800=>15086, +61070=>15086, +59129=>15086, +166604=>15087, +59130=>15087, +149931=>15088, +59131=>15088, +149902=>15089, +59132=>15089, +15099=>15090, +59133=>15090, +15821=>15091, +59134=>15091, +150094=>15092, +59135=>15092, +16127=>15093, +59136=>15093, +149957=>15094, +59137=>15094, +149747=>15095, +59138=>15095, +37370=>15096, +59139=>15096, +22322=>15097, +59140=>15097, +37698=>15098, +59141=>15098, +166627=>15099, +59142=>15099, +137316=>15100, +59143=>15100, +20703=>15101, +59144=>15101, +152097=>15102, +59145=>15102, +152039=>15103, +59146=>15103, +30584=>15104, +59147=>15104, +143922=>15105, +59148=>15105, +30478=>15106, +59149=>15106, +30479=>15107, +59150=>15107, +30587=>15108, +59151=>15108, +149143=>15109, +59152=>15109, +145281=>15110, +59153=>15110, +14942=>15111, +59154=>15111, +149744=>15112, +59155=>15112, +29752=>15113, +59156=>15113, +29851=>15114, +59157=>15114, +16063=>15115, +59158=>15115, +150202=>15116, +59159=>15116, +150215=>15117, +59160=>15117, +16584=>15118, +59161=>15118, +150166=>15119, +59162=>15119, +156078=>15120, +59163=>15120, +37639=>15121, +59164=>15121, +152961=>15122, +59165=>15122, +30750=>15123, +59166=>15123, +30861=>15124, +59167=>15124, +30856=>15125, +59168=>15125, +30930=>15126, +59169=>15126, +29648=>15127, +59170=>15127, +31065=>15128, +59171=>15128, +161601=>15129, +59172=>15129, +153315=>15130, +59173=>15130, +16654=>15131, +59174=>15131, +31141=>15134, +59177=>15134, +27181=>15135, +59178=>15135, +147194=>15136, +59179=>15136, +31290=>15137, +59180=>15137, +31220=>15138, +59181=>15138, +16750=>15139, +59182=>15139, +136934=>15140, +59183=>15140, +16690=>15141, +59184=>15141, +37429=>15142, +59185=>15142, +31217=>15143, +59186=>15143, +134476=>15144, +59187=>15144, +149900=>15145, +59188=>15145, +131737=>15146, +59189=>15146, +146874=>15147, +59190=>15147, +137070=>15148, +59191=>15148, +13719=>15149, +59192=>15149, +21867=>15150, +59193=>15150, +13680=>15151, +59194=>15151, +13994=>15152, +59195=>15152, +131540=>15153, +59196=>15153, +134157=>15154, +59197=>15154, +31458=>15155, +59198=>15155, +23129=>15156, +59199=>15156, +141045=>15157, +59200=>15157, +154287=>15158, +59201=>15158, +154268=>15159, +59202=>15159, +23053=>15160, +59203=>15160, +131675=>15161, +59204=>15161, +30960=>15162, +59205=>15162, +23082=>15163, +59206=>15163, +154566=>15164, +59207=>15164, +31486=>15165, +59208=>15165, +16889=>15166, +59209=>15166, +31837=>15167, +59210=>15167, +31853=>15168, +59211=>15168, +16913=>15169, +59212=>15169, +154547=>15170, +59213=>15170, +155324=>15171, +59214=>15171, +155302=>15172, +59215=>15172, +31949=>15173, +59216=>15173, +150009=>15174, +59217=>15174, +137136=>15175, +59218=>15175, +31886=>15176, +59219=>15176, +31868=>15177, +59220=>15177, +31918=>15178, +59221=>15178, +27314=>15179, +59222=>15179, +32220=>15180, +59223=>15180, +32263=>15181, +59224=>15181, +32211=>15182, +59225=>15182, +32590=>15183, +59226=>15183, +156257=>15184, +59227=>15184, +155996=>15185, +59228=>15185, +162632=>15186, +59229=>15186, +32151=>15187, +59230=>15187, +155266=>15188, +59231=>15188, +17002=>15189, +59232=>15189, +158581=>15190, +59233=>15190, +133398=>15191, +59234=>15191, +26582=>15192, +59235=>15192, +131150=>15193, +59236=>15193, +144847=>15194, +59237=>15194, +22468=>15195, +59238=>15195, +156690=>15196, +59239=>15196, +156664=>15197, +59240=>15197, +32733=>15198, +59242=>15198, +31527=>15199, +59243=>15199, +133164=>15200, +59244=>15200, +154345=>15201, +59245=>15201, +154947=>15202, +59246=>15202, +31500=>15203, +59247=>15203, +155150=>15204, +59248=>15204, +39398=>15205, +59249=>15205, +34373=>15206, +59250=>15206, +39523=>15207, +59251=>15207, +27164=>15208, +59252=>15208, +144447=>15209, +59253=>15209, +150007=>15210, +59255=>15210, +157101=>15211, +59256=>15211, +39455=>15212, +59257=>15212, +157088=>15213, +59258=>15213, +33941=>15214, +160039=>15215, +59260=>15215, +158929=>15216, +59261=>15216, +17642=>15217, +59262=>15217, +33079=>15218, +59263=>15218, +17410=>15219, +59264=>15219, +32966=>15220, +59265=>15220, +33033=>15221, +59266=>15221, +33090=>15222, +59267=>15222, +157620=>15223, +59268=>15223, +39107=>15224, +59269=>15224, +158274=>15225, +59270=>15225, +33378=>15226, +59271=>15226, +33381=>15227, +59272=>15227, +158289=>15228, +59273=>15228, +33875=>15229, +59274=>15229, +159143=>15230, +59275=>15230, +34320=>15231, +59276=>15231, +160283=>15232, +59277=>15232, +23174=>15233, +59278=>15233, +16767=>15234, +59279=>15234, +137280=>15235, +59280=>15235, +23339=>15236, +59281=>15236, +137377=>15237, +59282=>15237, +23268=>15238, +59283=>15238, +137432=>15239, +59284=>15239, +34464=>15240, +59285=>15240, +195004=>15241, +59286=>15241, +146831=>15242, +59287=>15242, +34861=>15243, +59288=>15243, +160802=>15244, +59289=>15244, +23042=>15245, +59290=>15245, +34926=>15246, +59291=>15246, +20293=>15247, +59292=>15247, +34951=>15248, +59293=>15248, +35007=>15249, +59294=>15249, +35046=>15250, +59295=>15250, +35173=>15251, +59296=>15251, +35149=>15252, +59297=>15252, +153219=>15253, +59298=>15253, +35156=>15254, +59299=>15254, +161669=>15255, +59300=>15255, +161668=>15256, +59301=>15256, +166901=>15257, +59302=>15257, +166873=>15258, +59303=>15258, +166812=>15259, +59304=>15259, +166393=>15260, +59305=>15260, +16045=>15261, +59306=>15261, +33955=>15262, +59307=>15262, +18165=>15263, +59308=>15263, +18127=>15264, +59309=>15264, +14322=>15265, +59310=>15265, +35389=>15266, +59311=>15266, +35356=>15267, +59312=>15267, +169032=>15268, +59313=>15268, +24397=>15269, +59314=>15269, +37419=>15270, +59315=>15270, +148100=>15271, +59316=>15271, +26068=>15272, +59317=>15272, +28969=>15273, +59318=>15273, +28868=>15274, +59319=>15274, +137285=>15275, +59320=>15275, +40301=>15276, +59321=>15276, +35999=>15277, +59322=>15277, +36073=>15278, +59323=>15278, +163292=>15279, +59324=>15279, +22938=>15280, +59325=>15280, +30659=>15281, +59326=>15281, +23024=>15282, +59327=>15282, +14036=>15283, +59329=>15283, +36394=>15284, +59330=>15284, +36519=>15285, +59331=>15285, +150537=>15286, +59332=>15286, +36656=>15287, +59333=>15287, +36682=>15288, +59334=>15288, +17140=>15289, +59335=>15289, +27736=>15290, +59336=>15290, +28603=>15291, +59337=>15291, +140065=>15292, +59338=>15292, +18587=>15293, +59339=>15293, +28537=>15294, +59340=>15294, +28299=>15295, +59341=>15295, +137178=>15296, +59342=>15296, +39913=>15297, +59343=>15297, +14005=>15298, +59344=>15298, +149807=>15299, +59345=>15299, +37051=>15300, +59346=>15300, +18612=>15301, +21873=>15302, +59348=>15302, +18694=>15303, +59349=>15303, +37307=>15304, +59350=>15304, +37892=>15305, +59351=>15305, +166475=>15306, +59352=>15306, +16482=>15307, +59353=>15307, +166652=>15308, +59354=>15308, +37927=>15309, +59355=>15309, +166941=>15310, +59356=>15310, +166971=>15311, +59357=>15311, +34021=>15312, +59358=>15312, +35371=>15313, +59359=>15313, +38297=>15314, +59360=>15314, +38311=>15315, +59361=>15315, +38295=>15316, +59362=>15316, +38294=>15317, +59363=>15317, +167220=>15318, +59364=>15318, +29765=>15319, +59365=>15319, +16066=>15320, +59366=>15320, +149759=>15321, +59367=>15321, +150082=>15322, +59368=>15322, +148458=>15323, +59369=>15323, +16103=>15324, +59370=>15324, +143909=>15325, +59371=>15325, +38543=>15326, +59372=>15326, +167655=>15327, +59373=>15327, +167526=>15328, +59374=>15328, +167525=>15329, +59375=>15329, +16076=>15330, +59376=>15330, +149997=>15331, +59377=>15331, +150136=>15332, +59378=>15332, +147438=>15333, +59379=>15333, +29714=>15334, +59380=>15334, +29803=>15335, +59381=>15335, +16124=>15336, +59382=>15336, +38721=>15337, +59383=>15337, +168112=>15338, +59384=>15338, +26695=>15339, +59385=>15339, +18973=>15340, +59386=>15340, +168083=>15341, +59387=>15341, +153567=>15342, +59388=>15342, +37736=>15344, +59390=>15344, +166281=>15345, +59391=>15345, +166950=>15346, +59392=>15346, +166703=>15347, +59393=>15347, +156606=>15348, +59394=>15348, +37562=>15349, +59395=>15349, +23313=>15350, +59396=>15350, +35689=>15351, +59397=>15351, +18748=>15352, +59398=>15352, +29689=>15353, +59399=>15353, +147995=>15354, +59400=>15354, +38811=>15355, +59401=>15355, +39224=>15357, +59403=>15357, +134950=>15358, +59404=>15358, +24001=>15359, +59405=>15359, +166853=>15360, +59406=>15360, +150194=>15361, +59407=>15361, +38943=>15362, +59408=>15362, +169178=>15363, +59409=>15363, +37622=>15364, +59410=>15364, +169431=>15365, +59411=>15365, +37349=>15366, +59412=>15366, +17600=>15367, +59413=>15367, +166736=>15368, +59414=>15368, +150119=>15369, +59415=>15369, +166756=>15370, +59416=>15370, +39132=>15371, +59417=>15371, +166469=>15372, +59418=>15372, +16128=>15373, +59419=>15373, +37418=>15374, +59420=>15374, +18725=>15375, +59421=>15375, +33812=>15376, +59422=>15376, +39227=>15377, +59423=>15377, +39245=>15378, +59424=>15378, +162566=>15379, +59425=>15379, +15869=>15380, +59426=>15380, +19311=>15382, +59428=>15382, +39338=>15383, +59429=>15383, +39516=>15384, +59430=>15384, +166757=>15385, +59431=>15385, +153800=>15386, +59432=>15386, +27279=>15387, +59433=>15387, +39457=>15388, +59434=>15388, +23294=>15389, +59435=>15389, +39471=>15390, +59436=>15390, +170225=>15391, +59437=>15391, +19344=>15392, +59438=>15392, +170312=>15393, +59439=>15393, +39356=>15394, +59440=>15394, +19389=>15395, +59441=>15395, +19351=>15396, +59442=>15396, +37757=>15397, +59443=>15397, +22642=>15398, +59444=>15398, +135938=>15399, +59445=>15399, +22562=>15400, +59446=>15400, +149944=>15401, +59447=>15401, +136424=>15402, +59448=>15402, +30788=>15403, +59449=>15403, +141087=>15404, +59450=>15404, +146872=>15405, +59451=>15405, +26821=>15406, +59452=>15406, +15741=>15407, +59453=>15407, +37976=>15408, +59454=>15408, +14631=>15409, +59455=>15409, +24912=>15410, +59456=>15410, +141185=>15411, +59457=>15411, +141675=>15412, +59458=>15412, +24839=>15413, +59459=>15413, +40015=>15414, +59460=>15414, +40019=>15415, +59461=>15415, +40059=>15416, +59462=>15416, +39989=>15417, +59463=>15417, +39952=>15418, +59464=>15418, +39807=>15419, +59465=>15419, +39887=>15420, +59466=>15420, +171565=>15421, +59467=>15421, +39839=>15422, +59468=>15422, +172533=>15423, +59469=>15423, +172286=>15424, +59470=>15424, +40225=>15425, +59471=>15425, +19630=>15426, +59472=>15426, +147716=>15427, +59473=>15427, +40472=>15428, +59474=>15428, +19632=>15429, +59475=>15429, +40204=>15430, +59476=>15430, +172468=>15431, +59477=>15431, +172269=>15432, +59478=>15432, +172275=>15433, +59479=>15433, +170287=>15434, +59480=>15434, +40357=>15435, +59481=>15435, +33981=>15436, +59482=>15436, +159250=>15437, +59483=>15437, +159711=>15438, +59484=>15438, +158594=>15439, +59485=>15439, +34300=>15440, +59486=>15440, +17715=>15441, +59487=>15441, +159140=>15442, +59488=>15442, +159364=>15443, +59489=>15443, +159216=>15444, +59490=>15444, +33824=>15445, +59491=>15445, +34286=>15446, +59492=>15446, +159232=>15447, +59493=>15447, +145367=>15448, +59494=>15448, +155748=>15449, +59495=>15449, +31202=>15450, +59496=>15450, +144796=>15451, +59497=>15451, +144960=>15452, +59498=>15452, +149982=>15453, +59500=>15453, +15714=>15454, +59501=>15454, +37851=>15455, +59502=>15455, +37566=>15456, +59503=>15456, +37704=>15457, +59504=>15457, +131775=>15458, +59505=>15458, +30905=>15459, +59506=>15459, +37495=>15460, +59507=>15460, +37965=>15461, +59508=>15461, +20452=>15462, +59509=>15462, +13376=>15463, +59510=>15463, +36964=>15464, +59511=>15464, +152925=>15465, +59512=>15465, +30781=>15466, +59513=>15466, +30804=>15467, +59514=>15467, +30902=>15468, +59515=>15468, +30795=>15469, +59516=>15469, +137047=>15470, +59517=>15470, +143817=>15471, +59518=>15471, +149825=>15472, +59519=>15472, +13978=>15473, +59520=>15473, +20338=>15474, +59521=>15474, +28634=>15475, +59522=>15475, +28633=>15476, +59523=>15476, +28702=>15478, +59524=>15478, +59525=>15478, +21524=>15479, +59526=>15479, +147893=>15480, +59527=>15480, +22459=>15481, +59528=>15481, +22771=>15482, +59529=>15482, +22410=>15483, +59530=>15483, +40214=>15484, +59531=>15484, +22487=>15485, +59532=>15485, +28980=>15486, +59533=>15486, +13487=>15487, +59534=>15487, +147884=>15488, +59535=>15488, +29163=>15489, +59536=>15489, +158784=>15490, +59537=>15490, +151447=>15491, +59538=>15491, +137141=>15493, +59540=>15493, +166473=>15494, +59541=>15494, +24844=>15495, +59542=>15495, +23246=>15496, +59543=>15496, +23051=>15497, +59544=>15497, +17084=>15498, +59545=>15498, +148616=>15499, +59546=>15499, +14124=>15500, +59547=>15500, +19323=>15501, +59548=>15501, +166396=>15502, +59549=>15502, +37819=>15503, +59550=>15503, +37816=>15504, +59551=>15504, +137430=>15505, +59552=>15505, +134941=>15506, +59553=>15506, +33906=>15507, +59554=>15507, +158912=>15508, +59555=>15508, +136211=>15509, +59556=>15509, +148218=>15510, +59557=>15510, +142374=>15511, +59558=>15511, +148417=>15512, +59559=>15512, +22932=>15513, +59560=>15513, +146871=>15514, +59561=>15514, +157505=>15515, +59562=>15515, +32168=>15516, +59563=>15516, +155995=>15517, +59564=>15517, +155812=>15518, +59565=>15518, +149945=>15519, +59566=>15519, +149899=>15520, +59567=>15520, +166394=>15521, +59568=>15521, +37605=>15522, +59569=>15522, +29666=>15523, +59570=>15523, +16105=>15524, +59571=>15524, +29876=>15525, +59572=>15525, +166755=>15526, +59573=>15526, +137375=>15527, +59574=>15527, +16097=>15528, +59575=>15528, +150195=>15529, +59576=>15529, +27352=>15530, +59577=>15530, +29683=>15531, +59578=>15531, +29691=>15532, +59579=>15532, +16086=>15533, +59580=>15533, +150078=>15534, +59581=>15534, +150164=>15535, +59582=>15535, +137177=>15536, +59583=>15536, +150118=>15537, +59584=>15537, +132007=>15538, +59585=>15538, +136228=>15539, +59586=>15539, +149989=>15540, +59587=>15540, +29768=>15541, +59588=>15541, +149782=>15542, +59589=>15542, +28837=>15543, +59590=>15543, +149878=>15544, +59591=>15544, +37508=>15545, +59592=>15545, +29670=>15546, +59593=>15546, +37727=>15547, +59594=>15547, +132350=>15548, +59595=>15548, +37681=>15549, +59596=>15549, +166606=>15550, +59597=>15550, +166422=>15551, +59598=>15551, +37766=>15552, +59599=>15552, +166887=>15553, +59600=>15553, +153045=>15554, +59601=>15554, +18741=>15555, +59602=>15555, +166530=>15556, +59603=>15556, +29035=>15557, +59604=>15557, +149827=>15558, +59605=>15558, +134399=>15559, +59606=>15559, +22180=>15560, +59607=>15560, +132634=>15561, +59608=>15561, +134123=>15562, +59609=>15562, +134328=>15563, +59610=>15563, +21762=>15564, +59611=>15564, +31172=>15565, +59612=>15565, +137210=>15566, +59613=>15566, +32254=>15567, +59614=>15567, +136898=>15568, +59615=>15568, +150096=>15569, +59616=>15569, +137298=>15570, +59617=>15570, +17710=>15571, +59618=>15571, +37889=>15572, +59619=>15572, +14090=>15573, +59620=>15573, +166592=>15574, +59621=>15574, +149933=>15575, +59622=>15575, +22960=>15576, +59623=>15576, +137407=>15577, +59624=>15577, +137347=>15578, +59625=>15578, +160900=>15579, +59626=>15579, +23201=>15580, +59627=>15580, +14050=>15581, +59628=>15581, +146779=>15582, +59629=>15582, +14000=>15583, +59630=>15583, +37471=>15584, +59631=>15584, +23161=>15585, +59632=>15585, +166529=>15586, +59633=>15586, +137314=>15587, +59634=>15587, +37748=>15588, +59635=>15588, +15565=>15589, +59636=>15589, +133812=>15590, +59637=>15590, +19094=>15591, +59638=>15591, +14730=>15592, +59639=>15592, +20724=>15593, +59640=>15593, +15721=>15594, +59641=>15594, +15692=>15595, +59642=>15595, +136092=>15596, +59643=>15596, +29045=>15597, +59644=>15597, +17147=>15598, +59645=>15598, +164376=>15599, +59646=>15599, +28175=>15600, +59647=>15600, +168164=>15601, +59648=>15601, +17643=>15602, +59649=>15602, +27991=>15603, +59650=>15603, +163407=>15604, +59651=>15604, +28775=>15605, +59652=>15605, +27823=>15606, +59653=>15606, +15574=>15607, +59654=>15607, +147437=>15608, +59655=>15608, +146989=>15609, +59656=>15609, +28162=>15610, +59657=>15610, +28428=>15611, +59658=>15611, +15727=>15612, +59659=>15612, +132085=>15613, +59660=>15613, +30033=>15614, +59661=>15614, +14012=>15615, +59662=>15615, +13512=>15616, +59663=>15616, +18048=>15617, +59664=>15617, +16090=>15618, +59665=>15618, +18545=>15619, +59666=>15619, +22980=>15620, +59667=>15620, +37486=>15621, +59668=>15621, +18750=>15622, +59669=>15622, +36673=>15623, +59670=>15623, +166940=>15624, +59671=>15624, +158656=>15625, +59672=>15625, +22546=>15626, +59673=>15626, +22472=>15627, +59674=>15627, +14038=>15628, +59675=>15628, +136274=>15629, +59676=>15629, +28926=>15630, +59677=>15630, +148322=>15631, +59678=>15631, +150129=>15632, +59679=>15632, +143331=>15633, +59680=>15633, +135856=>15634, +59681=>15634, +140221=>15635, +59682=>15635, +26809=>15636, +59683=>15636, +26983=>15637, +59684=>15637, +136088=>15638, +59685=>15638, +144613=>15639, +59686=>15639, +162804=>15640, +59687=>15640, +145119=>15641, +59688=>15641, +166531=>15642, +59689=>15642, +145366=>15643, +59690=>15643, +144378=>15644, +59691=>15644, +150687=>15645, +59692=>15645, +27162=>15646, +59693=>15646, +145069=>15647, +59694=>15647, +158903=>15648, +59695=>15648, +33854=>15649, +59696=>15649, +17631=>15650, +59697=>15650, +17614=>15651, +59698=>15651, +159014=>15652, +59699=>15652, +159057=>15653, +59700=>15653, +158850=>15654, +59701=>15654, +159710=>15655, +59702=>15655, +33597=>15658, +59705=>15658, +137018=>15659, +59706=>15659, +33773=>15660, +59707=>15660, +158848=>15661, +59708=>15661, +159827=>15662, +59709=>15662, +137179=>15663, +59710=>15663, +22921=>15664, +59711=>15664, +23170=>15665, +59712=>15665, +137139=>15666, +59713=>15666, +23137=>15667, +59714=>15667, +23153=>15668, +59715=>15668, +137477=>15669, +59716=>15669, +147964=>15670, +59717=>15670, +14125=>15671, +59718=>15671, +23023=>15672, +59719=>15672, +137020=>15673, +59720=>15673, +14023=>15674, +59721=>15674, +29070=>15675, +59722=>15675, +37776=>15676, +59723=>15676, +26266=>15677, +59724=>15677, +148133=>15678, +59725=>15678, +23150=>15679, +59726=>15679, +23083=>15680, +59727=>15680, +148115=>15681, +59728=>15681, +27179=>15682, +59729=>15682, +147193=>15683, +59730=>15683, +161590=>15684, +59731=>15684, +148571=>15685, +59732=>15685, +148170=>15686, +59733=>15686, +28957=>15687, +59734=>15687, +148057=>15688, +59735=>15688, +166369=>15689, +59736=>15689, +20400=>15690, +59737=>15690, +159016=>15691, +59738=>15691, +23746=>15692, +59739=>15692, +148686=>15693, +59740=>15693, +163405=>15694, +59741=>15694, +148413=>15695, +59742=>15695, +27148=>15696, +59743=>15696, +148054=>15697, +59744=>15697, +135940=>15698, +59745=>15698, +28979=>15700, +59747=>15700, +148457=>15701, +59748=>15701, +15781=>15702, +59749=>15702, +27871=>15703, +59750=>15703, +194597=>15704, +59751=>15704, +23019=>15705, +59754=>15705, +24412=>15706, +59757=>15706, +59764=>15707, +144128=>15707, +31955=>15708, +59776=>15708, +59783=>15709, +162548=>15709, +59786=>15710, +153334=>15710, +162584=>15711, +59790=>15711, +36972=>15712, +59791=>15712, +33270=>15713, +59795=>15713, +30476=>15714, +59797=>15714, +27810=>15715, +59799=>15715, +22269=>15716, +59800=>15716, +22633=>15717, +59828=>15717, +26465=>15718, +59832=>15718, +23646=>15719, +59838=>15719, +22770=>15720, +59841=>15720, +28857=>15721, +59843=>15721, +26627=>15722, +59853=>15722, +59859=>15723, +36795=>15723, +59861=>15724, +36796=>15724, +20001=>15725, +59871=>15725, +31545=>15726, +59898=>15726, +15820=>15727, +59902=>15727, +29482=>15728, +57990=>15728, +59909=>15728, +30048=>15729, +59912=>15729, +22586=>15730, +59920=>15730, +33446=>15731, +59932=>15731, +27018=>15732, +59940=>15732, +24803=>15733, +59944=>15733, +20206=>15734, +59984=>15734, +39364=>15735, +60002=>15735, +40639=>15736, +60023=>15736, +21249=>15737, +60025=>15737, +26528=>15738, +60038=>15738, +24808=>15739, +60046=>15739, +20916=>15740, +60053=>15740, +31363=>15741, +60064=>15741, +39994=>15742, +60075=>15742, +31432=>15743, +60093=>15743, +26906=>15744, +60098=>15744, +22956=>15745, +60100=>15745, +22592=>15746, +60102=>15746, +21610=>15747, +60114=>15747, +24807=>15748, +60123=>15748, +22138=>15749, +60125=>15749, +26965=>15750, +60132=>15750, +39983=>15751, +60133=>15751, +34725=>15752, +60134=>15752, +23584=>15753, +60141=>15753, +24075=>15754, +60143=>15754, +26398=>15755, +60147=>15755, +33965=>15756, +60157=>15756, +35713=>15757, +60161=>15757, +20088=>15758, +60166=>15758, +25283=>15759, +60176=>15759, +26709=>15760, +60180=>15760, +33533=>15762, +60190=>15762, +35237=>15763, +60194=>15763, +36768=>15764, +60196=>15764, +38840=>15765, +60198=>15765, +38983=>15766, +60200=>15766, +39613=>15767, +60201=>15767, +24497=>15768, +60218=>15768, +26184=>15769, +60219=>15769, +26303=>15770, +60220=>15770, +162425=>15771, +60221=>15771, +60225=>15773, +149946=>15773, +60230=>15776, +131910=>15776, +26382=>15777, +60232=>15777, +26904=>15778, +60233=>15778, +161367=>15779, +60235=>15779, +155618=>15780, +60236=>15780, +161278=>15781, +60239=>15781, +139418=>15782, +60240=>15782, +18640=>15783, +60241=>15783, +19128=>15784, +60242=>15784, +60244=>15785, +166554=>15785, +60247=>15786, +147515=>15786, +150085=>15787, +60250=>15787, +132554=>15788, +60251=>15788, +20946=>15789, +60252=>15789, +132625=>15790, +60253=>15790, +22943=>15791, +60254=>15791, +138920=>15792, +60255=>15792, +15294=>15793, +60256=>15793, +146687=>15794, +60257=>15794, +14747=>15795, +60262=>15795, +165352=>15796, +60264=>15796, +170441=>15797, +60265=>15797, +14178=>15798, +60266=>15798, +139715=>15799, +60267=>15799, +35678=>15800, +60268=>15800, +166734=>15801, +60269=>15801, +29193=>15803, +60274=>15803, +60276=>15804, +134264=>15804, +132985=>15805, +60280=>15805, +36570=>15806, +60281=>15806, +21135=>15807, +60283=>15807, +29041=>15808, +60285=>15808, +147274=>15809, +60288=>15809, +150183=>15810, +60289=>15810, +21948=>15811, +60290=>15811, +60293=>15812, +158546=>15812, +13427=>15813, +60295=>15813, +60297=>15814, +161330=>15814, +18200=>15815, +60299=>15815, +60303=>15816, +149823=>15816, +20582=>15817, +60305=>15817, +13563=>15818, +60306=>15818, +144332=>15819, +60307=>15819, +18300=>15821, +60310=>15821, +166216=>15822, +60311=>15822, +60315=>15823, +138640=>15823, +162834=>15825, +60320=>15825, +36950=>15826, +60321=>15826, +151450=>15827, +60323=>15827, +35682=>15828, +60324=>15828, +23899=>15829, +60327=>15829, +158711=>15830, +60328=>15830, +137500=>15832, +60331=>15832, +35562=>15833, +60332=>15833, +150006=>15834, +60333=>15834, +60335=>15835, +147439=>15835, +19392=>15836, +60337=>15836, +141083=>15837, +60340=>15837, +37989=>15838, +60341=>15838, +153569=>15839, +60342=>15839, +24981=>15840, +60343=>15840, +23079=>15841, +60344=>15841, +194765=>15842, +60345=>15842, +194566=>15843, +60348=>15844, +148769=>15844, +20074=>15845, +60350=>15845, +149812=>15846, +60351=>15846, +38486=>15847, +60352=>15847, +28047=>15848, +60353=>15848, +158909=>15849, +60354=>15849, +35191=>15850, +60356=>15850, +60359=>15851, +156689=>15851, +31554=>15853, +60363=>15853, +168128=>15854, +60364=>15854, +133649=>15855, +60365=>15855, +31301=>15857, +60369=>15857, +39462=>15858, +60372=>15858, +13919=>15859, +60374=>15859, +156777=>15860, +60375=>15860, +131105=>15861, +60376=>15861, +31107=>15862, +60377=>15862, +23852=>15863, +60380=>15863, +144665=>15864, +60381=>15864, +18128=>15866, +60384=>15866, +30011=>15867, +60386=>15867, +34917=>15868, +60387=>15868, +22710=>15869, +60389=>15869, +14108=>15870, +60390=>15870, +140685=>15871, +60391=>15871, +15444=>15872, +60394=>15872, +37505=>15873, +60397=>15873, +139642=>15874, +60398=>15874, +37680=>15875, +60400=>15875, +149968=>15876, +60402=>15876, +27705=>15877, +60403=>15877, +134904=>15878, +60406=>15878, +34855=>15879, +60407=>15879, +35061=>15880, +60408=>15880, +141606=>15881, +60409=>15881, +164979=>15882, +60410=>15882, +137137=>15883, +60411=>15883, +28344=>15884, +60412=>15884, +150058=>15885, +60413=>15885, +137248=>15886, +60414=>15886, +14756=>15887, +60415=>15887, +17727=>15890, +60419=>15890, +26294=>15891, +60420=>15891, +171181=>15892, +60421=>15892, +170148=>15893, +60422=>15893, +35139=>15894, +60423=>15894, +16607=>15895, +60427=>15895, +136714=>15896, +60428=>15896, +14753=>15897, +60429=>15897, +145199=>15898, +60430=>15898, +164072=>15899, +60431=>15899, +136133=>15900, +60432=>15900, +29101=>15901, +60433=>15901, +33638=>15902, +60434=>15902, +60436=>15903, +168360=>15903, +19639=>15905, +60438=>15905, +159919=>15906, +60439=>15906, +166315=>15907, +60440=>15907, +147834=>15908, +60445=>15908, +31555=>15909, +60446=>15909, +31102=>15910, +60447=>15910, +28597=>15911, +60449=>15911, +172767=>15912, +60450=>15912, +27139=>15913, +60451=>15913, +164632=>15914, +60452=>15914, +21410=>15915, +60453=>15915, +159239=>15916, +60454=>15916, +37823=>15917, +60455=>15917, +26678=>15918, +60456=>15918, +38749=>15919, +59389=>15919, +60457=>15919, +164207=>15920, +60458=>15920, +158133=>15921, +60460=>15921, +136173=>15922, +60461=>15922, +143919=>15923, +60462=>15923, +23941=>15924, +60464=>15924, +166960=>15925, +60465=>15925, +22293=>15926, +60467=>15926, +38947=>15927, +60468=>15927, +166217=>15928, +60469=>15928, +23979=>15929, +60470=>15929, +149896=>15930, +60471=>15930, +26046=>15931, +60472=>15931, +27093=>15932, +60473=>15932, +21458=>15933, +60474=>15933, +150181=>15934, +60475=>15934, +147329=>15935, +60476=>15935, +15377=>15936, +60477=>15936, +26422=>15937, +60478=>15937, +60482=>15938, +139169=>15938, +13770=>15939, +60490=>15939, +18682=>15940, +60493=>15940, +30728=>15942, +60496=>15942, +37461=>15943, +60497=>15943, +17394=>15944, +60499=>15944, +17375=>15945, +60501=>15945, +23032=>15946, +60505=>15946, +22155=>15948, +60518=>15948, +60520=>15949, +169449=>15949, +36882=>15950, +60541=>15950, +21953=>15951, +60546=>15951, +17673=>15952, +60551=>15952, +32383=>15953, +60552=>15953, +28502=>15954, +60553=>15954, +27313=>15955, +60554=>15955, +13540=>15956, +60556=>15956, +161949=>15957, +60558=>15957, +14138=>15958, +60559=>15958, +60562=>15960, +163876=>15960, +60565=>15961, +162366=>15961, +15851=>15962, +60567=>15962, +60569=>15963, +146615=>15963, +156248=>15964, +60574=>15964, +22207=>15965, +60575=>15965, +36366=>15966, +60577=>15966, +23405=>15967, +60578=>15967, +25566=>15968, +60581=>15968, +25904=>15970, +60585=>15970, +22061=>15971, +60586=>15971, +21530=>15972, +60588=>15972, +171416=>15973, +60591=>15973, +19581=>15974, +60592=>15974, +22050=>15975, +60593=>15975, +22046=>15976, +60594=>15976, +32585=>15977, +60595=>15977, +22901=>15978, +60597=>15978, +146752=>15979, +60598=>15979, +34672=>15980, +60599=>15980, +33047=>15981, +60604=>15981, +40286=>15982, +60605=>15982, +36120=>15983, +60606=>15983, +30267=>15984, +60607=>15984, +40005=>15985, +60608=>15985, +30286=>15986, +60609=>15986, +30649=>15987, +60610=>15987, +37701=>15988, +60611=>15988, +21554=>15989, +60612=>15989, +33096=>15990, +60613=>15990, +33527=>15991, +60614=>15991, +22053=>15992, +60615=>15992, +33074=>15993, +60616=>15993, +33816=>15994, +60617=>15994, +32957=>15995, +60618=>15995, +21994=>15996, +60619=>15996, +31074=>15997, +60620=>15997, +22083=>15998, +60621=>15998, +21526=>15999, +60622=>15999, +134813=>16000, +60623=>16000, +13774=>16001, +60624=>16001, +22021=>16002, +57509=>16002, +60625=>16002, +22001=>16003, +60626=>16003, +26353=>16004, +60627=>16004, +164578=>16005, +60628=>16005, +13869=>16006, +60629=>16006, +30004=>16007, +60630=>16007, +22000=>16008, +60631=>16008, +21946=>16009, +60632=>16009, +21655=>16010, +60633=>16010, +21874=>16011, +60634=>16011, +134209=>16012, +60635=>16012, +134294=>16013, +60636=>16013, +24272=>16014, +57652=>16014, +60637=>16014, +134774=>16015, +60639=>16015, +142434=>16016, +60640=>16016, +134818=>16017, +60641=>16017, +40619=>16018, +60642=>16018, +32090=>16019, +60643=>16019, +135285=>16021, +60645=>16021, +25245=>16022, +60646=>16022, +38765=>16023, +60647=>16023, +21652=>16024, +60648=>16024, +36045=>16025, +60649=>16025, +29174=>16026, +60650=>16026, +37238=>16027, +60651=>16027, +25596=>16028, +60652=>16028, +25529=>16029, +60653=>16029, +25598=>16030, +60654=>16030, +21865=>16031, +60655=>16031, +142147=>16032, +60656=>16032, +40050=>16033, +60657=>16033, +143027=>16034, +60658=>16034, +20890=>16035, +60659=>16035, +13535=>16036, +60660=>16036, +134567=>16037, +60661=>16037, +20903=>16038, +60662=>16038, +21581=>16039, +60663=>16039, +21790=>16040, +60664=>16040, +21779=>16041, +60665=>16041, +30310=>16042, +60666=>16042, +36397=>16043, +60667=>16043, +157834=>16044, +60668=>16044, +30129=>16045, +60669=>16045, +32950=>16046, +60670=>16046, +34820=>16047, +60671=>16047, +35015=>16049, +60673=>16049, +33206=>16050, +60674=>16050, +33820=>16051, +60675=>16051, +17644=>16052, +60677=>16052, +29444=>16053, +60678=>16053, +33547=>16054, +60681=>16054, +22139=>16055, +60683=>16055, +37232=>16056, +60690=>16056, +37384=>16057, +60692=>16057, +134905=>16058, +60696=>16058, +29286=>16059, +60697=>16059, +18254=>16060, +60699=>16060, +60701=>16061, +163833=>16061, +16634=>16062, +60703=>16062, +40029=>16063, +60704=>16063, +25887=>16064, +60705=>16064, +18675=>16065, +60707=>16065, +149472=>16066, +60708=>16066, +171388=>16067, +60709=>16067, +60713=>16069, +161187=>16069, +60715=>16070, +155720=>16071, +60716=>16071, +29091=>16072, +60718=>16072, +32398=>16073, +60719=>16073, +40272=>16074, +60720=>16074, +13687=>16075, +60723=>16075, +27826=>16076, +60725=>16076, +21351=>16077, +60726=>16077, +14812=>16078, +60728=>16078, +60731=>16079, +149016=>16079, +33325=>16080, +60734=>16080, +21579=>16081, +60735=>16081, +60739=>16082, +14930=>16083, +60740=>16083, +29556=>16084, +60742=>16084, +171692=>16085, +60743=>16085, +19721=>16086, +60744=>16086, +39917=>16087, +60745=>16087, +19547=>16089, +60748=>16089, +171998=>16090, +60751=>16090, +33884=>16091, +60752=>16091, +60754=>16092, +160434=>16092, +25390=>16093, +60757=>16093, +32037=>16094, +60758=>16094, +14890=>16095, +60761=>16095, +36872=>16096, +60762=>16096, +21196=>16097, +60763=>16097, +15988=>16098, +60764=>16098, +13946=>16099, +60765=>16099, +17897=>16100, +60766=>16100, +132238=>16101, +60767=>16101, +30272=>16102, +60768=>16102, +23280=>16103, +60769=>16103, +134838=>16104, +60770=>16104, +30842=>16105, +60771=>16105, +18358=>16106, +163630=>16106, +60772=>16106, +22695=>16107, +60773=>16107, +16575=>16108, +60774=>16108, +22140=>16109, +60775=>16109, +39819=>16110, +60776=>16110, +23924=>16111, +60777=>16111, +30292=>16112, +60778=>16112, +173108=>16113, +60779=>16113, +40581=>16114, +60780=>16114, +19681=>16115, +60781=>16115, +14331=>16117, +60783=>16117, +24857=>16118, +60784=>16118, +148466=>16119, +60786=>16119, +60787=>16120, +22109=>16121, +60788=>16121, +171526=>16122, +60792=>16122, +21044=>16123, +60793=>16123, +13741=>16124, +60795=>16124, +40316=>16126, +60797=>16126, +31830=>16127, +60798=>16127, +39737=>16128, +60799=>16128, +22494=>16129, +60800=>16129, +23635=>16130, +60802=>16130, +25811=>16131, +60803=>16131, +169168=>16132, +60804=>16132, +156469=>16133, +60805=>16133, +34477=>16134, +60807=>16134, +134440=>16135, +60808=>16135, +134513=>16136, +60811=>16136, +60812=>16137, +20990=>16138, +60813=>16138, +139023=>16139, +60814=>16139, +23950=>16140, +60815=>16140, +38659=>16141, +60816=>16141, +138705=>16142, +60817=>16142, +40577=>16143, +60818=>16143, +36940=>16144, +60819=>16144, +31519=>16145, +60820=>16145, +39682=>16146, +60821=>16146, +23761=>16147, +60822=>16147, +31651=>16148, +60823=>16148, +25192=>16149, +60824=>16149, +25397=>16150, +60825=>16150, +39679=>16151, +60826=>16151, +31695=>16152, +60827=>16152, +39722=>16153, +60828=>16153, +31870=>16154, +60829=>16154, +31810=>16156, +60831=>16156, +31878=>16157, +60832=>16157, +39957=>16158, +60833=>16158, +31740=>16159, +60834=>16159, +39689=>16160, +60835=>16160, +39982=>16162, +40794=>16163, +60839=>16163, +21875=>16164, +60840=>16164, +23491=>16165, +60841=>16165, +20477=>16166, +60842=>16166, +40600=>16167, +60843=>16167, +20466=>16168, +60844=>16168, +21088=>16169, +60845=>16169, +21201=>16170, +60847=>16170, +22375=>16171, +60848=>16171, +20566=>16172, +60849=>16172, +22967=>16173, +60850=>16173, +24082=>16174, +60851=>16174, +38856=>16175, +60852=>16175, +40363=>16176, +60853=>16176, +36700=>16177, +60854=>16177, +21609=>16178, +60855=>16178, +38836=>16179, +60856=>16179, +39232=>16180, +60857=>16180, +38842=>16181, +60858=>16181, +21292=>16182, +60859=>16182, +24880=>16183, +60860=>16183, +26924=>16184, +60861=>16184, +21466=>16185, +60862=>16185, +39946=>16186, +60863=>16186, +40194=>16187, +60864=>16187, +19515=>16188, +60865=>16188, +38465=>16189, +60866=>16189, +27008=>16190, +60867=>16190, +20646=>16191, +60868=>16191, +30022=>16192, +60869=>16192, +137069=>16193, +60870=>16193, +39386=>16194, +60871=>16194, +21107=>16195, +60872=>16195, +60873=>16196, +37209=>16197, +60874=>16197, +38529=>16198, +60875=>16198, +37212=>16199, +60876=>16199, +60877=>16200, +37201=>16201, +60878=>16201, +167575=>16202, +60879=>16202, +25471=>16203, +60880=>16203, +27338=>16204, +60882=>16204, +22033=>16205, +60883=>16205, +37262=>16206, +60884=>16206, +30074=>16207, +60885=>16207, +25221=>16208, +60886=>16208, +29519=>16209, +60888=>16209, +31856=>16210, +60889=>16210, +154657=>16211, +60890=>16211, +60892=>16212, +30422=>16213, +60894=>16213, +39837=>16214, +60895=>16214, +20010=>16215, +60896=>16215, +134356=>16216, +60897=>16216, +33726=>16217, +60898=>16217, +34882=>16218, +60899=>16218, +60900=>16219, +23626=>16220, +60901=>16220, +27072=>16221, +60902=>16221, +21023=>16224, +60905=>16224, +24053=>16225, +60906=>16225, +20174=>16226, +60907=>16226, +27697=>16227, +60908=>16227, +131570=>16228, +60909=>16228, +20281=>16229, +60910=>16229, +21660=>16230, +60911=>16230, +21146=>16232, +60913=>16232, +36226=>16233, +60914=>16233, +13822=>16234, +60915=>16234, +13811=>16236, +60917=>16236, +60918=>16237, +27474=>16238, +60919=>16238, +37244=>16239, +60920=>16239, +40869=>16240, +60921=>16240, +39831=>16241, +60922=>16241, +38958=>16242, +60923=>16242, +39092=>16243, +60924=>16243, +39610=>16244, +60925=>16244, +40616=>16245, +60926=>16245, +40580=>16246, +60927=>16246, +31508=>16247, +60929=>16247, +60930=>16248, +27642=>16249, +60931=>16249, +34840=>16250, +60932=>16250, +32632=>16251, +60933=>16251, +60934=>16252, +22048=>16253, +60935=>16253, +173642=>16254, +60936=>16254, +36471=>16255, +60937=>16255, +40787=>16256, +60938=>16256, +60939=>16257, +36308=>16258, +60940=>16258, +36431=>16259, +60941=>16259, +40476=>16260, +60942=>16260, +36353=>16261, +60943=>16261, +25218=>16262, +60944=>16262, +164733=>16263, +60945=>16263, +36392=>16264, +60946=>16264, +36469=>16265, +60947=>16265, +31443=>16266, +60948=>16266, +31294=>16267, +60950=>16267, +30936=>16268, +60951=>16268, +27882=>16269, +60952=>16269, +35431=>16270, +60953=>16270, +30215=>16271, +60954=>16271, +40742=>16272, +60956=>16272, +27854=>16273, +60957=>16273, +34774=>16274, +60958=>16274, +30147=>16275, +60959=>16275, +172722=>16276, +60960=>16276, +30803=>16277, +60961=>16277, +36108=>16278, +60963=>16278, +29410=>16279, +60964=>16279, +29553=>16280, +60965=>16280, +35629=>16281, +60966=>16281, +29442=>16282, +60967=>16282, +29937=>16283, +60968=>16283, +36075=>16284, +60969=>16284, +150203=>16285, +60970=>16285, +34351=>16286, +60971=>16286, +24506=>16287, +60972=>16287, +34976=>16288, +60973=>16288, +17591=>16289, +60974=>16289, +60975=>16290, +159237=>16291, +60977=>16291, +60978=>16292, +35454=>16293, +60979=>16293, +140571=>16294, +60980=>16294, +60981=>16295, +24829=>16296, +60982=>16296, +30311=>16297, +60983=>16297, +39639=>16298, +60984=>16298, +40260=>16299, +60985=>16299, +37742=>16300, +58859=>16300, +60986=>16300, +39823=>16301, +60987=>16301, +34805=>16302, +60988=>16302, +60989=>16303, +36087=>16305, +60991=>16305, +29484=>16306, +60992=>16306, +38689=>16307, +60993=>16307, +39856=>16308, +60994=>16308, +13782=>16309, +60995=>16309, +29362=>16310, +60996=>16310, +19463=>16311, +60997=>16311, +31825=>16312, +60998=>16312, +39242=>16313, +60999=>16313, +24921=>16314, +61001=>16314, +19460=>16315, +61002=>16315, +40598=>16316, +61003=>16316, +24957=>16317, +61004=>16317, +61005=>16318, +22367=>16319, +61006=>16319, +24943=>16320, +61007=>16320, +25254=>16321, +61008=>16321, +25145=>16322, +61009=>16322, +14940=>16324, +61011=>16324, +25058=>16325, +61012=>16325, +21418=>16326, +61013=>16326, +25444=>16327, +61015=>16327, +26626=>16328, +61016=>16328, +13778=>16329, +61017=>16329, +23895=>16330, +61018=>16330, +36826=>16331, +61020=>16331, +167481=>16332, +61021=>16332, +61022=>16333, +20697=>16334, +61023=>16334, +30982=>16335, +61025=>16335, +21298=>16336, +61026=>16336, +38456=>16337, +61027=>16337, +134971=>16338, +61028=>16338, +16485=>16339, +61029=>16339, +61030=>16340, +30718=>16341, +61031=>16341, +61032=>16342, +31938=>16343, +61033=>16343, +155418=>16344, +61034=>16344, +31962=>16345, +61035=>16345, +31277=>16346, +61036=>16346, +32870=>16347, +61037=>16347, +32867=>16348, +61038=>16348, +32077=>16349, +61039=>16349, +29957=>16350, +61040=>16350, +29938=>16351, +61041=>16351, +35220=>16352, +61042=>16352, +33306=>16353, +61043=>16353, +26380=>16354, +61044=>16354, +32866=>16355, +61045=>16355, +160902=>16356, +61046=>16356, +32859=>16357, +61047=>16357, +29936=>16358, +61048=>16358, +33027=>16359, +61049=>16359, +30500=>16360, +61050=>16360, +35209=>16361, +61051=>16361, +157644=>16362, +61052=>16362, +30035=>16363, +61053=>16363, +34729=>16364, +61055=>16364, +34766=>16365, +61056=>16365, +33224=>16366, +61057=>16366, +34700=>16367, +61058=>16367, +35401=>16368, +61059=>16368, +36013=>16369, +61060=>16369, +35651=>16370, +61061=>16370, +30507=>16371, +61062=>16371, +29944=>16372, +61063=>16372, +34010=>16373, +61064=>16373, +27058=>16374, +61066=>16374, +36262=>16375, +61067=>16375, +61068=>16376, +35241=>16377, +58392=>16377, +61069=>16377, +28089=>16379, +61071=>16379, +34753=>16380, +61072=>16380, +147473=>16381, +61073=>16381, +29927=>16382, +61074=>16382, +15835=>16383, +61075=>16383, +29046=>16384, +61076=>16384, +24740=>16385, +57702=>16385, +61077=>16385, +24988=>16386, +61078=>16386, +15569=>16387, +61079=>16387, +24695=>16389, +61081=>16389, +61082=>16390, +32625=>16391, +61083=>16391, +194850=>16392, +24809=>16393, +61086=>16393, +19326=>16394, +61087=>16394, +132423=>16395, +57344=>16395, +37595=>16396, +57345=>16396, +132575=>16397, +57346=>16397, +147397=>16398, +57347=>16398, +34124=>16399, +57348=>16399, +17077=>16400, +57349=>16400, +29679=>16401, +57350=>16401, +20917=>16402, +57351=>16402, +13897=>16403, +57352=>16403, +149826=>16404, +57353=>16404, +166372=>16405, +57354=>16405, +37700=>16406, +57355=>16406, +137691=>16407, +57356=>16407, +33518=>16408, +57357=>16408, +146632=>16409, +57358=>16409, +30780=>16410, +57359=>16410, +26436=>16411, +57360=>16411, +25311=>16412, +57361=>16412, +149811=>16413, +57362=>16413, +166314=>16414, +57363=>16414, +131744=>16415, +57364=>16415, +158643=>16416, +57365=>16416, +135941=>16417, +57366=>16417, +20395=>16418, +57367=>16418, +140525=>16419, +57368=>16419, +20488=>16420, +57369=>16420, +159017=>16421, +57370=>16421, +162436=>16422, +57371=>16422, +144896=>16423, +57372=>16423, +150193=>16424, +57373=>16424, +140563=>16425, +57374=>16425, +131966=>16427, +57376=>16427, +24484=>16428, +57377=>16428, +131968=>16429, +57378=>16429, +131911=>16430, +57379=>16430, +28379=>16431, +57380=>16431, +132127=>16432, +57381=>16432, +20702=>16433, +20737=>16434, +57383=>16434, +13434=>16435, +57384=>16435, +20750=>16436, +57385=>16436, +39020=>16437, +57386=>16437, +14147=>16438, +57387=>16438, +33814=>16439, +57388=>16439, +149924=>16440, +57389=>16440, +132231=>16441, +57390=>16441, +20832=>16442, +57391=>16442, +144308=>16443, +57392=>16443, +20842=>16444, +57393=>16444, +134143=>16445, +57394=>16445, +139516=>16446, +57395=>16446, +131813=>16447, +57396=>16447, +140592=>16448, +57397=>16448, +132494=>16449, +57398=>16449, +143923=>16450, +57399=>16450, +137603=>16451, +57400=>16451, +23426=>16452, +57401=>16452, +34685=>16453, +57402=>16453, +132531=>16454, +57403=>16454, +146585=>16455, +57404=>16455, +20914=>16456, +57405=>16456, +20920=>16457, +57406=>16457, +40244=>16458, +57407=>16458, +20937=>16459, +57408=>16459, +20943=>16460, +57409=>16460, +20945=>16461, +57410=>16461, +15580=>16462, +57411=>16462, +20947=>16463, +57412=>16463, +150182=>16464, +57413=>16464, +20915=>16465, +57414=>16465, +20973=>16468, +57417=>16468, +33741=>16469, +57418=>16469, +26942=>16470, +57419=>16470, +145197=>16471, +57420=>16471, +24443=>16472, +57421=>16472, +21003=>16473, +57422=>16473, +21030=>16474, +57423=>16474, +21052=>16475, +57424=>16475, +21173=>16476, +57425=>16476, +21079=>16477, +57426=>16477, +21140=>16478, +57427=>16478, +21177=>16479, +57428=>16479, +21189=>16480, +57429=>16480, +31765=>16481, +57430=>16481, +34114=>16482, +57431=>16482, +21216=>16483, +57432=>16483, +34317=>16484, +57433=>16484, +158483=>16485, +57434=>16485, +194601=>16486, +166622=>16487, +57436=>16487, +21833=>16488, +57437=>16488, +28377=>16489, +57438=>16489, +147328=>16490, +57439=>16490, +133460=>16491, +57440=>16491, +147436=>16492, +57441=>16492, +21299=>16493, +57442=>16493, +134114=>16495, +57444=>16495, +27851=>16496, +57445=>16496, +136998=>16497, +57446=>16497, +26651=>16498, +57447=>16498, +29653=>16499, +57448=>16499, +24650=>16500, +57449=>16500, +16042=>16501, +57450=>16501, +14540=>16502, +57451=>16502, +136936=>16503, +57452=>16503, +29149=>16504, +57453=>16504, +17570=>16505, +57454=>16505, +21357=>16506, +57455=>16506, +21364=>16507, +57456=>16507, +165547=>16508, +57457=>16508, +21374=>16509, +57458=>16509, +194610=>16510, +136598=>16511, +57460=>16511, +136723=>16512, +57461=>16512, +30694=>16513, +57462=>16513, +21395=>16514, +57463=>16514, +166555=>16515, +57464=>16515, +21408=>16516, +57465=>16516, +21419=>16517, +57466=>16517, +21422=>16518, +57467=>16518, +29607=>16519, +57468=>16519, +153458=>16520, +57469=>16520, +16217=>16521, +57470=>16521, +29596=>16522, +57471=>16522, +21441=>16523, +57472=>16523, +21445=>16524, +57473=>16524, +27721=>16525, +57474=>16525, +20041=>16526, +57475=>16526, +22526=>16527, +57476=>16527, +21465=>16528, +57477=>16528, +15019=>16529, +57478=>16529, +134031=>16530, +57479=>16530, +21472=>16531, +57480=>16531, +147435=>16532, +57481=>16532, +142755=>16533, +57482=>16533, +21494=>16534, +57483=>16534, +134263=>16535, +57484=>16535, +21523=>16536, +57485=>16536, +28793=>16537, +57486=>16537, +21803=>16538, +57487=>16538, +26199=>16539, +57488=>16539, +27995=>16540, +57489=>16540, +21613=>16541, +57490=>16541, +158547=>16542, +57491=>16542, +134516=>16543, +57492=>16543, +21853=>16544, +57493=>16544, +21647=>16545, +57494=>16545, +21668=>16546, +57495=>16546, +18342=>16547, +57496=>16547, +136973=>16548, +57497=>16548, +134877=>16549, +57498=>16549, +15796=>16550, +57499=>16550, +134477=>16551, +57500=>16551, +166332=>16552, +57501=>16552, +140952=>16553, +57502=>16553, +21831=>16554, +57503=>16554, +19693=>16555, +57504=>16555, +21551=>16556, +57505=>16556, +29719=>16557, +57506=>16557, +21894=>16558, +57507=>16558, +21929=>16559, +57508=>16559, +137431=>16561, +57510=>16561, +147514=>16562, +57511=>16562, +17746=>16563, +57512=>16563, +148533=>16564, +57513=>16564, +26291=>16565, +57514=>16565, +135348=>16566, +57515=>16566, +22071=>16567, +57516=>16567, +26317=>16568, +57517=>16568, +144010=>16569, +57518=>16569, +26276=>16570, +57519=>16570, +22093=>16572, +57521=>16572, +22095=>16573, +57522=>16573, +30961=>16574, +57523=>16574, +22257=>16575, +57524=>16575, +38791=>16576, +57525=>16576, +21502=>16577, +57526=>16577, +22272=>16578, +57527=>16578, +22255=>16579, +57528=>16579, +22253=>16580, +57529=>16580, +166758=>16581, +57530=>16581, +13859=>16582, +57531=>16582, +135759=>16583, +57532=>16583, +22342=>16584, +57533=>16584, +147877=>16585, +57534=>16585, +27758=>16586, +57535=>16586, +28811=>16587, +57536=>16587, +22338=>16588, +57537=>16588, +14001=>16589, +57538=>16589, +158846=>16590, +57539=>16590, +22502=>16591, +57540=>16591, +136214=>16592, +57541=>16592, +22531=>16593, +57542=>16593, +136276=>16594, +57543=>16594, +148323=>16595, +57544=>16595, +22566=>16596, +57545=>16596, +150517=>16597, +57546=>16597, +22559=>16598, +22698=>16599, +57548=>16599, +13665=>16600, +57549=>16600, +22752=>16601, +57550=>16601, +22748=>16602, +57551=>16602, +135740=>16603, +57552=>16603, +22779=>16604, +57553=>16604, +23551=>16605, +57554=>16605, +22339=>16606, +57555=>16606, +172368=>16607, +57556=>16607, +148088=>16608, +57557=>16608, +37843=>16609, +57558=>16609, +13729=>16610, +57559=>16610, +22815=>16611, +57560=>16611, +26790=>16612, +57561=>16612, +14019=>16613, +57562=>16613, +28249=>16614, +57563=>16614, +136766=>16615, +57564=>16615, +23076=>16616, +57565=>16616, +136850=>16618, +57567=>16618, +34053=>16619, +57568=>16619, +22985=>16620, +57569=>16620, +134478=>16621, +57570=>16621, +158849=>16622, +57571=>16622, +159018=>16623, +57572=>16623, +137180=>16624, +57573=>16624, +23001=>16625, +57574=>16625, +137211=>16626, +57575=>16626, +137138=>16627, +57576=>16627, +159142=>16628, +57577=>16628, +28017=>16629, +57578=>16629, +137256=>16630, +57579=>16630, +136917=>16631, +57580=>16631, +23033=>16632, +57581=>16632, +159301=>16633, +57582=>16633, +23211=>16634, +57583=>16634, +23139=>16635, +57584=>16635, +14054=>16636, +57585=>16636, +149929=>16637, +57586=>16637, +14088=>16639, +57588=>16639, +23190=>16640, +57589=>16640, +29797=>16641, +57590=>16641, +23251=>16642, +57591=>16642, +159649=>16643, +57592=>16643, +140628=>16644, +57593=>16644, +137489=>16645, +57595=>16645, +14130=>16646, +57596=>16646, +136888=>16647, +57597=>16647, +24195=>16648, +57598=>16648, +21200=>16649, +57599=>16649, +23414=>16650, +57600=>16650, +25992=>16651, +57601=>16651, +23420=>16652, +57602=>16652, +162318=>16653, +57603=>16653, +16388=>16654, +57604=>16654, +18525=>16655, +57605=>16655, +131588=>16656, +57606=>16656, +23509=>16657, +57607=>16657, +137780=>16658, +57609=>16658, +154060=>16659, +57610=>16659, +132517=>16660, +57611=>16660, +23539=>16661, +57612=>16661, +23453=>16662, +57613=>16662, +19728=>16663, +57614=>16663, +23557=>16664, +57615=>16664, +138052=>16665, +57616=>16665, +23571=>16666, +57617=>16666, +29646=>16667, +57618=>16667, +23572=>16668, +57619=>16668, +138405=>16669, +57620=>16669, +158504=>16670, +57621=>16670, +23625=>16671, +57622=>16671, +18653=>16672, +57623=>16672, +23685=>16673, +57624=>16673, +23785=>16674, +57625=>16674, +23791=>16675, +57626=>16675, +23947=>16676, +57627=>16676, +138745=>16677, +57628=>16677, +138807=>16678, +57629=>16678, +23824=>16679, +57630=>16679, +23832=>16680, +57631=>16680, +23878=>16681, +57632=>16681, +138916=>16682, +57633=>16682, +23738=>16683, +57634=>16683, +24023=>16684, +57635=>16684, +33532=>16685, +57636=>16685, +14381=>16686, +57637=>16686, +149761=>16687, +57638=>16687, +139337=>16688, +57639=>16688, +139635=>16689, +57640=>16689, +33415=>16690, +57641=>16690, +14390=>16691, +57642=>16691, +15298=>16692, +57643=>16692, +24110=>16693, +57644=>16693, +27274=>16694, +57645=>16694, +57647=>16696, +148668=>16697, +57648=>16697, +134355=>16698, +57649=>16698, +21414=>16699, +57650=>16699, +20151=>16700, +57651=>16700, +21416=>16702, +57653=>16702, +137073=>16703, +57654=>16703, +24073=>16704, +57655=>16704, +57656=>16705, +164994=>16706, +57657=>16706, +24313=>16707, +57658=>16707, +24315=>16708, +57659=>16708, +14496=>16709, +57660=>16709, +24316=>16710, +57661=>16710, +26686=>16711, +57662=>16711, +37915=>16712, +57663=>16712, +24333=>16713, +57664=>16713, +131521=>16714, +57665=>16714, +194708=>16715, +57666=>16715, +15070=>16716, +57667=>16716, +135994=>16717, +57669=>16717, +24378=>16718, +57670=>16718, +157832=>16719, +57671=>16719, +140240=>16720, +57672=>16720, +140401=>16721, +57674=>16721, +24419=>16722, +57675=>16722, +159342=>16723, +57677=>16723, +24434=>16724, +57678=>16724, +37696=>16725, +57679=>16725, +166454=>16726, +57680=>16726, +24487=>16727, +57681=>16727, +23990=>16728, +57682=>16728, +15711=>16729, +57683=>16729, +152144=>16730, +57684=>16730, +139114=>16731, +57685=>16731, +159992=>16732, +57686=>16732, +140904=>16733, +57687=>16733, +37334=>16734, +57688=>16734, +131742=>16735, +57689=>16735, +166441=>16736, +57690=>16736, +24625=>16737, +57691=>16737, +26245=>16738, +57692=>16738, +14691=>16739, +57694=>16739, +15815=>16740, +57695=>16740, +13881=>16741, +57696=>16741, +22416=>16742, +57697=>16742, +141236=>16743, +57698=>16743, +31089=>16744, +57699=>16744, +15936=>16745, +57700=>16745, +24734=>16746, +57701=>16746, +24810=>16748, +149890=>16749, +57704=>16749, +149903=>16750, +57705=>16750, +162387=>16751, +57706=>16751, +29860=>16752, +57707=>16752, +20705=>16753, +57708=>16753, +23200=>16754, +57709=>16754, +24932=>16755, +57710=>16755, +24898=>16756, +57712=>16756, +194726=>16757, +57713=>16757, +159442=>16758, +57714=>16758, +24961=>16759, +57715=>16759, +20980=>16760, +57716=>16760, +132694=>16761, +57717=>16761, +24967=>16762, +57718=>16762, +23466=>16763, +57719=>16763, +147383=>16764, +57720=>16764, +141407=>16765, +57721=>16765, +25043=>16766, +57722=>16766, +166813=>16767, +57723=>16767, +170333=>16768, +57724=>16768, +25040=>16769, +57725=>16769, +14642=>16770, +57726=>16770, +141696=>16771, +57727=>16771, +141505=>16772, +57728=>16772, +24611=>16773, +57729=>16773, +24924=>16774, +57730=>16774, +25886=>16775, +57731=>16775, +25483=>16776, +57732=>16776, +131352=>16777, +57733=>16777, +25285=>16778, +57734=>16778, +137072=>16779, +57735=>16779, +25301=>16780, +57736=>16780, +142861=>16781, +57737=>16781, +25452=>16782, +57738=>16782, +149983=>16783, +57739=>16783, +14871=>16784, +57740=>16784, +25656=>16785, +57741=>16785, +25592=>16786, +57742=>16786, +136078=>16787, +57743=>16787, +137212=>16788, +57744=>16788, +28554=>16789, +57746=>16789, +142902=>16790, +57747=>16790, +153373=>16792, +57750=>16792, +25825=>16793, +57751=>16793, +25829=>16794, +57752=>16794, +38011=>16795, +57753=>16795, +14950=>16796, +57754=>16796, +25658=>16797, +57755=>16797, +14935=>16798, +57756=>16798, +25933=>16799, +57757=>16799, +28438=>16800, +57758=>16800, +150056=>16801, +57759=>16801, +150051=>16802, +57760=>16802, +25989=>16803, +57761=>16803, +25965=>16804, +57762=>16804, +25951=>16805, +57763=>16805, +26037=>16807, +57765=>16807, +149824=>16808, +57766=>16808, +19255=>16809, +57767=>16809, +26065=>16810, +57768=>16810, +16600=>16811, +57769=>16811, +137257=>16812, +57770=>16812, +57771=>16813, +26083=>16814, +57772=>16814, +24543=>16815, +57773=>16815, +144384=>16816, +57774=>16816, +26136=>16817, +57775=>16817, +57776=>16818, +143863=>16818, +57777=>16819, +143864=>16819, +26180=>16820, +57778=>16820, +57779=>16821, +143780=>16821, +57780=>16822, +143781=>16822, +26187=>16823, +57781=>16823, +134773=>16824, +57782=>16824, +26215=>16825, +57783=>16825, +152038=>16826, +57784=>16826, +26227=>16827, +57785=>16827, +64018=>16828, +143921=>16829, +57788=>16829, +165364=>16830, +57789=>16830, +143816=>16831, +57790=>16831, +152339=>16832, +57791=>16832, +30661=>16833, +57792=>16833, +141559=>16834, +57793=>16834, +39332=>16835, +57794=>16835, +26370=>16836, +57795=>16836, +148380=>16837, +57796=>16837, +150049=>16838, +57797=>16838, +27130=>16839, +57799=>16839, +145346=>16840, +57800=>16840, +194779=>16841, +26471=>16842, +57802=>16842, +26466=>16843, +57803=>16843, +147917=>16844, +57804=>16844, +168173=>16845, +57805=>16845, +26583=>16846, +57806=>16846, +17641=>16847, +57807=>16847, +26658=>16848, +57808=>16848, +28240=>16849, +57809=>16849, +37436=>16850, +57810=>16850, +26625=>16851, +57811=>16851, +144358=>16852, +57812=>16852, +159136=>16853, +57813=>16853, +26717=>16854, +57814=>16854, +144495=>16855, +57815=>16855, +27105=>16856, +57816=>16856, +27147=>16857, +57817=>16857, +166623=>16858, +57818=>16858, +26995=>16859, +57819=>16859, +26819=>16860, +57820=>16860, +144845=>16861, +57821=>16861, +26881=>16862, +57822=>16862, +26880=>16863, +57823=>16863, +14849=>16864, +57825=>16864, +144956=>16865, +57826=>16865, +15232=>16866, +57827=>16866, +26540=>16867, +57828=>16867, +26977=>16868, +57829=>16868, +166474=>16869, +57830=>16869, +17148=>16870, +57831=>16870, +26934=>16871, +57832=>16871, +27032=>16872, +57833=>16872, +15265=>16873, +57834=>16873, +132041=>16874, +57835=>16874, +33635=>16875, +57836=>16875, +20624=>16876, +57837=>16876, +27129=>16877, +57838=>16877, +144985=>16878, +57839=>16878, +139562=>16879, +57840=>16879, +27205=>16880, +57841=>16880, +145155=>16881, +57842=>16881, +27293=>16882, +57843=>16882, +15347=>16883, +57844=>16883, +26545=>16884, +57845=>16884, +27336=>16885, +57846=>16885, +168348=>16886, +57847=>16886, +15373=>16887, +57848=>16887, +27421=>16888, +57849=>16888, +133411=>16889, +57850=>16889, +24798=>16890, +60308=>16890, +57851=>16890, +27445=>16891, +57852=>16891, +27508=>16892, +57853=>16892, +141261=>16893, +57854=>16893, +28341=>16894, +57855=>16894, +57856=>16895, +146139=>16895, +137560=>16897, +57858=>16897, +14144=>16898, +57859=>16898, +21537=>16899, +57860=>16899, +146266=>16900, +57861=>16900, +27617=>16901, +57862=>16901, +147196=>16902, +57863=>16902, +27612=>16903, +57864=>16903, +27703=>16904, +57865=>16904, +140427=>16905, +57866=>16905, +149745=>16906, +57867=>16906, +158545=>16907, +57868=>16907, +27738=>16908, +57869=>16908, +33318=>16909, +57870=>16909, +27769=>16910, +57871=>16910, +146876=>16911, +57872=>16911, +17605=>16912, +57873=>16912, +146877=>16913, +57874=>16913, +147876=>16914, +57875=>16914, +149772=>16915, +57876=>16915, +149760=>16916, +57877=>16916, +146633=>16917, +57878=>16917, +14053=>16918, +57879=>16918, +15595=>16919, +57880=>16919, +134450=>16920, +57881=>16920, +39811=>16921, +57882=>16921, +143865=>16922, +57883=>16922, +140433=>16923, +57884=>16923, +32655=>16924, +57885=>16924, +26679=>16925, +57886=>16925, +159013=>16926, +57887=>16926, +159137=>16927, +57888=>16927, +159211=>16928, +57889=>16928, +28054=>16929, +57890=>16929, +27996=>16930, +57891=>16930, +28284=>16931, +57892=>16931, +28420=>16932, +57893=>16932, +149887=>16933, +57894=>16933, +147589=>16934, +57895=>16934, +159346=>16935, +57896=>16935, +34099=>16936, +57897=>16936, +159604=>16937, +57898=>16937, +20935=>16938, +57899=>16938, +33838=>16941, +57902=>16941, +166689=>16942, +57903=>16942, +194824=>16943, +146991=>16944, +57905=>16944, +29779=>16945, +57906=>16945, +147330=>16946, +57907=>16946, +31180=>16947, +57908=>16947, +28239=>16948, +57909=>16948, +23185=>16949, +57910=>16949, +143435=>16950, +57911=>16950, +28664=>16951, +57912=>16951, +14093=>16952, +57913=>16952, +28573=>16953, +57914=>16953, +146992=>16954, +57915=>16954, +28410=>16955, +57916=>16955, +136343=>16956, +57917=>16956, +147517=>16957, +57918=>16957, +17749=>16958, +57919=>16958, +37872=>16959, +57920=>16959, +28484=>16960, +57921=>16960, +28508=>16961, +57922=>16961, +15694=>16962, +57923=>16962, +28532=>16963, +57924=>16963, +168304=>16964, +57925=>16964, +15675=>16965, +57926=>16965, +28575=>16966, +57927=>16966, +147780=>16967, +57928=>16967, +28627=>16968, +57929=>16968, +147601=>16969, +57930=>16969, +147797=>16970, +57931=>16970, +147513=>16971, +57932=>16971, +147440=>16972, +57933=>16972, +147380=>16973, +57934=>16973, +147775=>16974, +57935=>16974, +20959=>16975, +57936=>16975, +57937=>16976, +147798=>16976, +57938=>16977, +147799=>16977, +147776=>16978, +57939=>16978, +156125=>16979, +57940=>16979, +28747=>16980, +57941=>16980, +28798=>16981, +57942=>16981, +28839=>16982, +57943=>16982, +28876=>16984, +57945=>16984, +28885=>16985, +57946=>16985, +28886=>16986, +57947=>16986, +28895=>16987, +57948=>16987, +16644=>16988, +57949=>16988, +15848=>16989, +57950=>16989, +29108=>16990, +57951=>16990, +29078=>16991, +57952=>16991, +148087=>16992, +57953=>16992, +28971=>16993, +57954=>16993, +28997=>16994, +57955=>16994, +23176=>16995, +57956=>16995, +29002=>16996, +57957=>16996, +64072=>16997, +148325=>16998, +57960=>16998, +29007=>16999, +57961=>16999, +37730=>17000, +57962=>17000, +148161=>17001, +57963=>17001, +28972=>17002, +57964=>17002, +148570=>17003, +57965=>17003, +150055=>17004, +57966=>17004, +150050=>17005, +57967=>17005, +29114=>17006, +57968=>17006, +166888=>17007, +57969=>17007, +28861=>17008, +57970=>17008, +29198=>17009, +57971=>17009, +37954=>17010, +57972=>17010, +29205=>17011, +57973=>17011, +22801=>17012, +57974=>17012, +37955=>17013, +57975=>17013, +29220=>17014, +57976=>17014, +37697=>17015, +57977=>17015, +153093=>17016, +57978=>17016, +29230=>17017, +57979=>17017, +29248=>17018, +57980=>17018, +149876=>17019, +57981=>17019, +26813=>17020, +57982=>17020, +29269=>17021, +57983=>17021, +29271=>17022, +57984=>17022, +15957=>17023, +57985=>17023, +143428=>17024, +57986=>17024, +26637=>17025, +57987=>17025, +28477=>17026, +57988=>17026, +29314=>17027, +57989=>17027, +29483=>17029, +57991=>17029, +149539=>17030, +57992=>17030, +165931=>17031, +57993=>17031, +18669=>17032, +57994=>17032, +165892=>17033, +57995=>17033, +29480=>17034, +57996=>17034, +29486=>17035, +57997=>17035, +29647=>17036, +57998=>17036, +29610=>17037, +57999=>17037, +134202=>17038, +58000=>17038, +158254=>17039, +58001=>17039, +29641=>17040, +58002=>17040, +29769=>17041, +58003=>17041, +147938=>17042, +58004=>17042, +136935=>17043, +58005=>17043, +150052=>17044, +58006=>17044, +26147=>17045, +58007=>17045, +14021=>17046, +58008=>17046, +149943=>17047, +58009=>17047, +149901=>17048, +58010=>17048, +150011=>17049, +58011=>17049, +29687=>17050, +58012=>17050, +29717=>17051, +58013=>17051, +26883=>17052, +58014=>17052, +150054=>17053, +58015=>17053, +29753=>17054, +58016=>17054, +16087=>17055, +58018=>17055, +194863=>17056, +141485=>17057, +58020=>17057, +29792=>17058, +58021=>17058, +167602=>17059, +58022=>17059, +29767=>17060, +58023=>17060, +29668=>17061, +58024=>17061, +29814=>17062, +58025=>17062, +33721=>17063, +58026=>17063, +29804=>17064, +58027=>17064, +29812=>17065, +58029=>17065, +37873=>17066, +58030=>17066, +27180=>17067, +58031=>17067, +29826=>17068, +58032=>17068, +18771=>17069, +58033=>17069, +150156=>17070, +58034=>17070, +147807=>17071, +58035=>17071, +150137=>17072, +58036=>17072, +166799=>17073, +58037=>17073, +23366=>17074, +58038=>17074, +166915=>17075, +58039=>17075, +137374=>17076, +58040=>17076, +29896=>17077, +58041=>17077, +137608=>17078, +58042=>17078, +29966=>17079, +58043=>17079, +29982=>17080, +58045=>17080, +167641=>17081, +58046=>17081, +137803=>17082, +58047=>17082, +23511=>17083, +58048=>17083, +167596=>17084, +58049=>17084, +37765=>17085, +58050=>17085, +30029=>17086, +58051=>17086, +30026=>17087, +58052=>17087, +30055=>17088, +58053=>17088, +30062=>17089, +58054=>17089, +151426=>17090, +58055=>17090, +16132=>17091, +58056=>17091, +150803=>17092, +58057=>17092, +30094=>17093, +58058=>17093, +29789=>17094, +58059=>17094, +30110=>17095, +58060=>17095, +30132=>17096, +58061=>17096, +30210=>17097, +58062=>17097, +30252=>17098, +58063=>17098, +30289=>17099, +58064=>17099, +30287=>17100, +58065=>17100, +30319=>17101, +58066=>17101, +58067=>17102, +156661=>17103, +58068=>17103, +30352=>17104, +58069=>17104, +33263=>17105, +58070=>17105, +14328=>17106, +58071=>17106, +157969=>17107, +58072=>17107, +157966=>17108, +58073=>17108, +30369=>17109, +58074=>17109, +30373=>17110, +58075=>17110, +30391=>17111, +58076=>17111, +30412=>17112, +58077=>17112, +159647=>17113, +58078=>17113, +33890=>17114, +58079=>17114, +151709=>17115, +58080=>17115, +151933=>17116, +58081=>17116, +138780=>17117, +58082=>17117, +30494=>17118, +58083=>17118, +30502=>17119, +58084=>17119, +30528=>17120, +58085=>17120, +25775=>17121, +58086=>17121, +152096=>17122, +58087=>17122, +30552=>17123, +58088=>17123, +144044=>17124, +58089=>17124, +30639=>17125, +58090=>17125, +166244=>17126, +58091=>17126, +166248=>17127, +58092=>17127, +136897=>17128, +58093=>17128, +30708=>17129, +58094=>17129, +26826=>17131, +58098=>17131, +30895=>17132, +58099=>17132, +30919=>17133, +58100=>17133, +30931=>17134, +58101=>17134, +38565=>17135, +58102=>17135, +31022=>17136, +58103=>17136, +153056=>17137, +58104=>17137, +30935=>17138, +58105=>17138, +31028=>17139, +58106=>17139, +30897=>17140, +58107=>17140, +161292=>17141, +58108=>17141, +36792=>17142, +58109=>17142, +34948=>17143, +58110=>17143, +140828=>17144, +58113=>17144, +31110=>17145, +58114=>17145, +35072=>17146, +58115=>17146, +26882=>17147, +58116=>17147, +31104=>17148, +58117=>17148, +153687=>17149, +58118=>17149, +31133=>17150, +58119=>17150, +162617=>17151, +58120=>17151, +31036=>17152, +58121=>17152, +31145=>17153, +58122=>17153, +28202=>17154, +58123=>17154, +160038=>17155, +58124=>17155, +16040=>17156, +58125=>17156, +31174=>17157, +58126=>17157, +168205=>17158, +58127=>17158, +31188=>17159, +58128=>17159, +21797=>17161, +62526=>17161, +134210=>17163, +62528=>17163, +134421=>17164, +62529=>17164, +151851=>17165, +62530=>17165, +21904=>17166, +62531=>17166, +142534=>17167, +62532=>17167, +14828=>17168, +62533=>17168, +131905=>17169, +62534=>17169, +36422=>17170, +62535=>17170, +150968=>17171, +62536=>17171, +169189=>17172, +62537=>17172, +164030=>17174, +62539=>17174, +30586=>17175, +62540=>17175, +142392=>17176, +62541=>17176, +14900=>17177, +62542=>17177, +18389=>17178, +62543=>17178, +164189=>17179, +62544=>17179, +158194=>17180, +62545=>17180, +151018=>17181, +62546=>17181, +25821=>17182, +62547=>17182, +134524=>17183, +62548=>17183, +135092=>17184, +62549=>17184, +134357=>17185, +62550=>17185, +25741=>17187, +62552=>17187, +36478=>17188, +62553=>17188, +134806=>17189, +62554=>17189, +135012=>17191, +62556=>17191, +142505=>17192, +62557=>17192, +164438=>17193, +62558=>17193, +148691=>17194, +62559=>17194, +134470=>17196, +62561=>17196, +170573=>17197, +62562=>17197, +164073=>17198, +62563=>17198, +18420=>17199, +62564=>17199, +151207=>17200, +62565=>17200, +142530=>17201, +62566=>17201, +39602=>17202, +62567=>17202, +14951=>17203, +62568=>17203, +169460=>17204, +62569=>17204, +16365=>17205, +62570=>17205, +13574=>17206, +62571=>17206, +152263=>17207, +62572=>17207, +169940=>17208, +62573=>17208, +142660=>17210, +62575=>17210, +40302=>17211, +62576=>17211, +38933=>17212, +62577=>17212, +17369=>17214, +62579=>17214, +25780=>17216, +62581=>17216, +21731=>17217, +62582=>17217, +62584=>17219, +142282=>17219, +14843=>17221, +62586=>17221, +157402=>17223, +62588=>17223, +157462=>17224, +62589=>17224, +162208=>17225, +62590=>17225, +25834=>17226, +62591=>17226, +151634=>17227, +62592=>17227, +134211=>17228, +62593=>17228, +36456=>17229, +62594=>17229, +166732=>17231, +62596=>17231, +132913=>17232, +62597=>17232, +18443=>17234, +62599=>17234, +131497=>17235, +62600=>17235, +16378=>17236, +62601=>17236, +22643=>17237, +62602=>17237, +142733=>17238, +62603=>17238, +148936=>17240, +62605=>17240, +132348=>17241, +62606=>17241, +155799=>17242, +62607=>17242, +134988=>17243, +62608=>17243, +21881=>17245, +62610=>17245, +17338=>17247, +62612=>17247, +19124=>17249, +62614=>17249, +141926=>17250, +62615=>17250, +135325=>17251, +62616=>17251, +33194=>17252, +62617=>17252, +39157=>17253, +62618=>17253, +134556=>17254, +62619=>17254, +25465=>17255, +62620=>17255, +14846=>17256, +62621=>17256, +141173=>17257, +62622=>17257, +36288=>17258, +62623=>17258, +22177=>17259, +62624=>17259, +25724=>17260, +62625=>17260, +15939=>17261, +62626=>17261, +173569=>17263, +62628=>17263, +134665=>17264, +62629=>17264, +142031=>17265, +62630=>17265, +135368=>17268, +62633=>17268, +145858=>17269, +62634=>17269, +14738=>17270, +62635=>17270, +14854=>17271, +62636=>17271, +164507=>17272, +62637=>17272, +13688=>17273, +62638=>17273, +155209=>17274, +62639=>17274, +139463=>17275, +62640=>17275, +142514=>17278, +62643=>17278, +169760=>17279, +62644=>17279, +13500=>17280, +62645=>17280, +27709=>17281, +62646=>17281, +151099=>17282, +62647=>17282, +161140=>17285, +62650=>17285, +142987=>17286, +62651=>17286, +139784=>17287, +62652=>17287, +173659=>17288, +62653=>17288, +167117=>17289, +62654=>17289, +134778=>17290, +62655=>17290, +134196=>17291, +62656=>17291, +161337=>17292, +62683=>17292, +142286=>17293, +62684=>17293, +62687=>17294, +142417=>17294, +14872=>17295, +62689=>17295, +62691=>17296, +135367=>17296, +62693=>17297, +173618=>17297, +167122=>17298, +62695=>17298, +167321=>17299, +62696=>17299, +167114=>17300, +62697=>17300, +38314=>17301, +62698=>17301, +62706=>17303, +161630=>17303, +28992=>17304, +62708=>17304, +20822=>17306, +62385=>17306, +20222=>17307, +20616=>17308, +62487=>17308, +13459=>17310, +62489=>17310, +20870=>17311, +62491=>17311, +24130=>17312, +63037=>17312, +20997=>17313, +62495=>17313, +21031=>17314, +62436=>17314, +21113=>17315, +62497=>17315, +194600=>17316, +13651=>17317, +62504=>17317, +21442=>17318, +62505=>17318, +21343=>17319, +62715=>17319, +21823=>17321, +62520=>17321, +21976=>17323, +59986=>17323, +13789=>17324, +62722=>17324, +22049=>17325, +63067=>17325, +22100=>17327, +60044=>17327, +60148=>17328, +135291=>17328, +60153=>17330, +135379=>17330, +61095=>17332, +135934=>17332, +14265=>17335, +60104=>17335, +23745=>17336, +61099=>17336, +23829=>17337, +63066=>17337, +23894=>17338, +63030=>17338, +14392=>17339, +63036=>17339, +20097=>17340, +62477=>17340, +24253=>17341, +63038=>17341, +14612=>17342, +63042=>17342, +25017=>17343, +63050=>17343, +25232=>17344, +63054=>17344, +25368=>17345, +63056=>17345, +25690=>17346, +63063=>17346, +25745=>17347, +62381=>17347, +33133=>17348, +62709=>17348, +33156=>17349, +59922=>17349, +33171=>17350, +59924=>17350, +26624=>17351, +63080=>17351, +15292=>17352, +63093=>17352, +29327=>17353, +60517=>17353, +29389=>17354, +59781=>17354, +149487=>17355, +29497=>17356, +59785=>17356, +30018=>17357, +59811=>17357, +30172=>17358, +59817=>17358, +16320=>17359, +59818=>17359, +60278=>17360, +151205=>17360, +16343=>17361, +59820=>17361, +30336=>17363, +30348=>17364, +59824=>17364, +151388=>17364, +16552=>17365, +59845=>17365, +30777=>17366, +59846=>17366, +16643=>17367, +59855=>17367, +31377=>17368, +59863=>17368, +31771=>17369, +59876=>17369, +31981=>17370, +59884=>17370, +32659=>17371, +62658=>17371, +32686=>17372, +59892=>17372, +33535=>17374, +59936=>17374, +22623=>17375, +59981=>17375, +34482=>17376, +59960=>17376, +17836=>17377, +34699=>17378, +59963=>17378, +35143=>17379, +59969=>17379, +35369=>17381, +59972=>17381, +36465=>17383, +59988=>17383, +60484=>17384, +164233=>17384, +36528=>17385, +59990=>17385, +37214=>17387, +62443=>17387, +37260=>17388, +62441=>17388, +39182=>17389, +60051=>17389, +39196=>17390, +60054=>17390, +39809=>17393, +60066=>17393, +40384=>17394, +60080=>17394, +40339=>17395, +60078=>17395, +40620=>17396, +60085=>17396, +19857=>17397, +60540=>17397, +37818=>17399, +40571=>17400, +60084=>17400, +28809=>17401, +63148=>17401, +29512=>17402, +59788=>17402, +31129=>17404, +59858=>17404, +36791=>17405, +59997=>17405, +39234=>17407, +60056=>17407, +8364=>17601, +12443=>17606, +63518=>17606, +12444=>17607, +63519=>17607, +11904=>17608, +63520=>17608, +12736=>17609, +62211=>17609, +12737=>17610, +62212=>17610, +12738=>17611, +62213=>17611, +12739=>17612, +62214=>17612, +12740=>17613, +62215=>17613, +131340=>17614, +62216=>17614, +12741=>17615, +62217=>17615, +131281=>17616, +62218=>17616, +131277=>17617, +62219=>17617, +12742=>17618, +62220=>17618, +12743=>17619, +62221=>17619, +131275=>17620, +62222=>17620, +139240=>17621, +62223=>17621, +12744=>17622, +62224=>17622, +131274=>17623, +62225=>17623, +12745=>17624, +62226=>17624, +12746=>17625, +62227=>17625, +12747=>17626, +62228=>17626, +12748=>17627, +62229=>17627, +131342=>17628, +62230=>17628, +12749=>17629, +62231=>17629, +12750=>17630, +62232=>17630, +62776=>17631, +62777=>17632, +138177=>17633, +62778=>17633, +194680=>17634, +62779=>17634, +12205=>17635, +38737=>17635, +62780=>17635, +131206=>17636, +62781=>17636, +20059=>17637, +62782=>17637, +20155=>17638, +62783=>17638, +13630=>17639, +62784=>17639, +23587=>17640, +62785=>17640, +24401=>17641, +62786=>17641, +24516=>17642, +62787=>17642, +14586=>17643, +62788=>17643, +25164=>17644, +62789=>17644, +25909=>17645, +62790=>17645, +27514=>17646, +62791=>17646, +27701=>17647, +62792=>17647, +27706=>17648, +62793=>17648, +28780=>17649, +62794=>17649, +29227=>17650, +62795=>17650, +20012=>17651, +62796=>17651, +29357=>17652, +62797=>17652, +149737=>17653, +62798=>17653, +32594=>17654, +62799=>17654, +31035=>17655, +62800=>17655, +31993=>17656, +62801=>17656, +32595=>17657, +62802=>17657, +156266=>17658, +62803=>17658, +13505=>17659, +62804=>17659, +156491=>17660, +62806=>17660, +32770=>17661, +62807=>17661, +32896=>17662, +62808=>17662, +157202=>17663, +62809=>17663, +158033=>17664, +62810=>17664, +21341=>17665, +62811=>17665, +34916=>17666, +62812=>17666, +35265=>17667, +62813=>17667, +161970=>17668, +62814=>17668, +35744=>17669, +62815=>17669, +36125=>17670, +62816=>17670, +38021=>17671, +62817=>17671, +38264=>17672, +62818=>17672, +38271=>17673, +62819=>17673, +38376=>17674, +62820=>17674, +167439=>17675, +62821=>17675, +38886=>17676, +62822=>17676, +39029=>17677, +62823=>17677, +39118=>17678, +62824=>17678, +39134=>17679, +62825=>17679, +39267=>17680, +62826=>17680, +170000=>17681, +62827=>17681, +40060=>17682, +62828=>17682, +40479=>17683, +62829=>17683, +40644=>17684, +62830=>17684, +27503=>17685, +62831=>17685, +63751=>17686, +62832=>17686, +20023=>17687, +62833=>17687, +131207=>17688, +62834=>17688, +38429=>17689, +62835=>17689, +25143=>17690, +62836=>17690, +38050=>17691, +62837=>17691, +11908=>17692, +63521=>17692, +11910=>17693, +63522=>17693, +11911=>17694, +63523=>17694, +11912=>17695, +63524=>17695, +11914=>17696, +63525=>17696, +11916=>17697, +63526=>17697, +11917=>17698, +63527=>17698, +11925=>17699, +63528=>17699, +11932=>17700, +63529=>17700, +11941=>17701, +63531=>17701, +11943=>17702, +63532=>17702, +11946=>17703, +63533=>17703, +11948=>17704, +63534=>17704, +11950=>17705, +63535=>17705, +11958=>17706, +63536=>17706, +11964=>17707, +63537=>17707, +11966=>17708, +63538=>17708, +11978=>17709, +63540=>17709, +11980=>17710, +63541=>17710, +11981=>17711, +63542=>17711, +11983=>17712, +63543=>17712, +11990=>17713, +63544=>17713, +11991=>17714, +63545=>17714, +11998=>17715, +63546=>17715, +172969=>17716, +62368=>17716, +135493=>17717, +62369=>17717, +25866=>17718, +62371=>17718, +20029=>17719, +62374=>17719, +28381=>17720, +62375=>17720, +40270=>17721, +62376=>17721, +37343=>17722, +62377=>17722, +62380=>17723, +161589=>17723, +20250=>17724, +62382=>17724, +20264=>17725, +62383=>17725, +20392=>17726, +62384=>17726, +20852=>17727, +62386=>17727, +20892=>17728, +62387=>17728, +20964=>17729, +62388=>17729, +21153=>17730, +62389=>17730, +21160=>17731, +62390=>17731, +21307=>17732, +62391=>17732, +21326=>17733, +62392=>17733, +21457=>17734, +62393=>17734, +21464=>17735, +62394=>17735, +22242=>17736, +62395=>17736, +22768=>17737, +62396=>17737, +22788=>17738, +62397=>17738, +22791=>17739, +62398=>17739, +22834=>17740, +62399=>17740, +22836=>17741, +62400=>17741, +23398=>17742, +62401=>17742, +23454=>17743, +62402=>17743, +23455=>17744, +62403=>17744, +23706=>17745, +62404=>17745, +24198=>17746, +62405=>17746, +24635=>17747, +62406=>17747, +25993=>17748, +62407=>17748, +26622=>17749, +62408=>17749, +26628=>17750, +62409=>17750, +26725=>17751, +62410=>17751, +27982=>17752, +62411=>17752, +28860=>17753, +62412=>17753, +30005=>17754, +62413=>17754, +32420=>17755, +62414=>17755, +32428=>17756, +62415=>17756, +32442=>17757, +62416=>17757, +32455=>17758, +62417=>17758, +32463=>17759, +62418=>17759, +32479=>17760, +62419=>17760, +32518=>17761, +62420=>17761, +32567=>17762, +62421=>17762, +33402=>17763, +62422=>17763, +33487=>17764, +62423=>17764, +33647=>17765, +62424=>17765, +35270=>17766, +62425=>17766, +35774=>17767, +62426=>17767, +35810=>17768, +62427=>17768, +36710=>17769, +62428=>17769, +36711=>17770, +62429=>17770, +36718=>17771, +62430=>17771, +29713=>17772, +62431=>17772, +31996=>17773, +62432=>17773, +32205=>17774, +62433=>17774, +26950=>17775, +62434=>17775, +31433=>17776, +62435=>17776, +30904=>17777, +62442=>17777, +32956=>17778, +62444=>17778, +36107=>17779, +62446=>17779, +33014=>17780, +62447=>17780, +133607=>17781, +62448=>17781, +32927=>17782, +62451=>17782, +40647=>17783, +62452=>17783, +19661=>17784, +62453=>17784, +40393=>17785, +62454=>17785, +40460=>17786, +62455=>17786, +19518=>17787, +62456=>17787, +171510=>17788, +62457=>17788, +159758=>17789, +62458=>17789, +40458=>17790, +62459=>17790, +172339=>17791, +62460=>17791, +13761=>17792, +62461=>17792, +28314=>17793, +62463=>17793, +33342=>17794, +62464=>17794, +29977=>17795, +62465=>17795, +18705=>17796, +62467=>17796, +39532=>17797, +62468=>17797, +39567=>17798, +62469=>17798, +40857=>17799, +62470=>17799, +31111=>17800, +62471=>17800, +164972=>17801, +62472=>17801, +138698=>17802, +62473=>17802, +132560=>17803, +62474=>17803, +142054=>17804, +62475=>17804, +20004=>17805, +62476=>17805, +20096=>17806, +62478=>17806, +20103=>17807, +62479=>17807, +20159=>17808, +62480=>17808, +20203=>17809, +62481=>17809, +20279=>17810, +62482=>17810, +13388=>17811, +62483=>17811, +20413=>17812, +62484=>17812, +15944=>17813, +62485=>17813, +20483=>17814, +62486=>17814, +13437=>17815, +62488=>17815, +13477=>17816, +62490=>17816, +22789=>17817, +62492=>17817, +20955=>17818, +62493=>17818, +20988=>17819, +62494=>17819, +20105=>17820, +62496=>17820, +21136=>17821, +62498=>17821, +21287=>17822, +62499=>17822, +13767=>17823, +62500=>17823, +21417=>17824, +62501=>17824, +13649=>17825, +62502=>17825, +21424=>17826, +62503=>17826, +21539=>17827, +62506=>17827, +13677=>17828, +62507=>17828, +13682=>17829, +62508=>17829, +13953=>17830, +62509=>17830, +21651=>17831, +62510=>17831, +21667=>17832, +62511=>17832, +21684=>17833, +62512=>17833, +21689=>17834, +62513=>17834, +21712=>17835, +62514=>17835, +21743=>17836, +62515=>17836, +21784=>17837, +62516=>17837, +21795=>17838, +62517=>17838, +21800=>17839, +62518=>17839, +13720=>17840, +62519=>17840, +13733=>17841, +62521=>17841, +13759=>17842, +62522=>17842, +21975=>17843, +62523=>17843, +13765=>17844, +62524=>17844, +163204=>17845, +62525=>17845, +16467=>17846, +62538=>17846, +62551=>17847, +135412=>17847, +62555=>17848, +134155=>17848, +62574=>17849, +161992=>17849, +62580=>17850, +155813=>17850, +62583=>17851, +142668=>17851, +62585=>17852, +135287=>17852, +62587=>17853, +135279=>17853, +62595=>17854, +139681=>17854, +62609=>17855, +134550=>17855, +16571=>17856, +62611=>17856, +62631=>17857, +142537=>17857, +22098=>17858, +62641=>17858, +134961=>17859, +62642=>17859, +62657=>17860, +157724=>17860, +135375=>17861, +62659=>17861, +141315=>17862, +62660=>17862, +141625=>17863, +62661=>17863, +13819=>17864, +62662=>17864, +152035=>17865, +62663=>17865, +134796=>17866, +62664=>17866, +135053=>17867, +62665=>17867, +134826=>17868, +62666=>17868, +16275=>17869, +62667=>17869, +134960=>17870, +62668=>17870, +134471=>17871, +62669=>17871, +135503=>17872, +62670=>17872, +134732=>17873, +62671=>17873, +134827=>17874, +62673=>17874, +134057=>17875, +62674=>17875, +134472=>17876, +62675=>17876, +135360=>17877, +62676=>17877, +135485=>17878, +62677=>17878, +16377=>17879, +62678=>17879, +140950=>17880, +62679=>17880, +25650=>17881, +62680=>17881, +135085=>17882, +62681=>17882, +144372=>17883, +62682=>17883, +62685=>17884, +134526=>17884, +62686=>17885, +134527=>17885, +62688=>17886, +142421=>17886, +62690=>17887, +134808=>17887, +62692=>17888, +134958=>17888, +62694=>17889, +158544=>17889, +21708=>17890, +62699=>17890, +33476=>17891, +62700=>17891, +21945=>17892, +62701=>17892, +171715=>17893, +62703=>17893, +39974=>17894, +62704=>17894, +39606=>17895, +62705=>17895, +62707=>17896, +142830=>17896, +33004=>17897, +62710=>17897, +23580=>17898, +62711=>17898, +157042=>17899, +62712=>17899, +33076=>17900, +62713=>17900, +14231=>17901, +62714=>17901, +164029=>17902, +62716=>17902, +37302=>17903, +62717=>17903, +134906=>17904, +62718=>17904, +134671=>17905, +62719=>17905, +134775=>17906, +62720=>17906, +134907=>17907, +62721=>17907, +151019=>17908, +62723=>17908, +13833=>17909, +62724=>17909, +134358=>17910, +62725=>17910, +22191=>17911, +62726=>17911, +141237=>17912, +62727=>17912, +135369=>17913, +62728=>17913, +134672=>17914, +62729=>17914, +134776=>17915, +62730=>17915, +135288=>17916, +62731=>17916, +135496=>17917, +62732=>17917, +164359=>17918, +62733=>17918, +136277=>17919, +62734=>17919, +134777=>17920, +62735=>17920, +151120=>17921, +62736=>17921, +142756=>17922, +62737=>17922, +23124=>17923, +62738=>17923, +62739=>17924, +135197=>17924, +62740=>17925, +135198=>17925, +62741=>17926, +135413=>17926, +62742=>17927, +135414=>17927, +22428=>17928, +62743=>17928, +134673=>17929, +62744=>17929, +161428=>17930, +62745=>17930, +164557=>17931, +62746=>17931, +135093=>17932, +62747=>17932, +134779=>17933, +62748=>17933, +151934=>17934, +62749=>17934, +14083=>17935, +62750=>17935, +135094=>17936, +62751=>17936, +135552=>17937, +62752=>17937, +152280=>17938, +62753=>17938, +172733=>17939, +62754=>17939, +149978=>17940, +62755=>17940, +137274=>17941, +62756=>17941, +147831=>17942, +62757=>17942, +164476=>17943, +62758=>17943, +22681=>17944, +62759=>17944, +21096=>17945, +62760=>17945, +13850=>17946, +62761=>17946, +153405=>17947, +62762=>17947, +31666=>17948, +62763=>17948, +23400=>17949, +62764=>17949, +18432=>17950, +62765=>17950, +19244=>17951, +62766=>17951, +40743=>17952, +62767=>17952, +18919=>17953, +62768=>17953, +39967=>17954, +62769=>17954, +39821=>17955, +62770=>17955, +154484=>17956, +62771=>17956, +143677=>17957, +62772=>17957, +22011=>17958, +62773=>17958, +13810=>17959, +62774=>17959, +22153=>17960, +62775=>17960, +23870=>17961, +63028=>17961, +23880=>17962, +63029=>17962, +15868=>17963, +63031=>17963, +14351=>17964, +63032=>17964, +23972=>17965, +63033=>17965, +23993=>17966, +63034=>17966, +14368=>17967, +63035=>17967, +24357=>17968, +63039=>17968, +24451=>17969, +63040=>17969, +14600=>17970, +63041=>17970, +14655=>17971, +63043=>17971, +14669=>17972, +63044=>17972, +24791=>17973, +63045=>17973, +24893=>17974, +63046=>17974, +23781=>17975, +63047=>17975, +14729=>17976, +63048=>17976, +25015=>17977, +63049=>17977, +25039=>17978, +63051=>17978, +14776=>17979, +63052=>17979, +25132=>17980, +63053=>17980, +25317=>17981, +63055=>17981, +14840=>17982, +63057=>17982, +22193=>17983, +63058=>17983, +14851=>17984, +63059=>17984, +25570=>17985, +63060=>17985, +25595=>17986, +63061=>17986, +25607=>17987, +63062=>17987, +14923=>17988, +63064=>17988, +25792=>17989, +63065=>17989, +40863=>17990, +63068=>17990, +14999=>17991, +63069=>17991, +25990=>17992, +63070=>17992, +15037=>17993, +63071=>17993, +26111=>17994, +63072=>17994, +26195=>17995, +63073=>17995, +15090=>17996, +63074=>17996, +26258=>17997, +63075=>17997, +15138=>17998, +63076=>17998, +26390=>17999, +63077=>17999, +15170=>18000, +63078=>18000, +26532=>18001, +63079=>18001, +15192=>18002, +63081=>18002, +26698=>18003, +63082=>18003, +26756=>18004, +63083=>18004, +15218=>18005, +63084=>18005, +15217=>18006, +63085=>18006, +15227=>18007, +63086=>18007, +26889=>18008, +63087=>18008, +26947=>18009, +63088=>18009, +29276=>18010, +63089=>18010, +26980=>18011, +63090=>18011, +27039=>18012, +63091=>18012, +27013=>18013, +63092=>18013, +27094=>18014, +63094=>18014, +15325=>18015, +63095=>18015, +27237=>18016, +63096=>18016, +27252=>18017, +63097=>18017, +27249=>18018, +63098=>18018, +27266=>18019, +63099=>18019, +15340=>18020, +63100=>18020, +27289=>18021, +63101=>18021, +15346=>18022, +63102=>18022, +27307=>18023, +63103=>18023, +27317=>18024, +63104=>18024, +27348=>18025, +63105=>18025, +27382=>18026, +63106=>18026, +27521=>18027, +63107=>18027, +27585=>18028, +63108=>18028, +27626=>18029, +63109=>18029, +27765=>18030, +63110=>18030, +27818=>18031, +63111=>18031, +15563=>18032, +63112=>18032, +27906=>18033, +63113=>18033, +27910=>18034, +63114=>18034, +27942=>18035, +63115=>18035, +28033=>18036, +63116=>18036, +15599=>18037, +63117=>18037, +28068=>18038, +63118=>18038, +28081=>18039, +63119=>18039, +28181=>18040, +63120=>18040, +28184=>18041, +63121=>18041, +28201=>18042, +63122=>18042, +28294=>18043, +63123=>18043, +166336=>18044, +63124=>18044, +28347=>18045, +63125=>18045, +28386=>18046, +63126=>18046, +28378=>18047, +63127=>18047, +40831=>18048, +63128=>18048, +28392=>18049, +63129=>18049, +28393=>18050, +63130=>18050, +28452=>18051, +63131=>18051, +28468=>18052, +63132=>18052, +15686=>18053, +63133=>18053, +147265=>18054, +63134=>18054, +28545=>18055, +63135=>18055, +28606=>18056, +63136=>18056, +15722=>18057, +63137=>18057, +15733=>18058, +63138=>18058, +29111=>18059, +63139=>18059, +23705=>18060, +63140=>18060, +15754=>18061, +63141=>18061, +28716=>18062, +63142=>18062, +15761=>18063, +63143=>18063, +28752=>18064, +63144=>18064, +28756=>18065, +63145=>18065, +28783=>18066, +63146=>18066, +28799=>18067, +63147=>18067, +131877=>18068, +63149=>18068, +17345=>18069, +63150=>18069, +13809=>18070, +63151=>18070, +134872=>18071, +63152=>18071, +13902=>18072, +58134=>18072, +15789=>18073, +58172=>18073, +154725=>18074, +58173=>18074, +26237=>18075, +58183=>18075, +31860=>18076, +58188=>18076, +29837=>18077, +58197=>18077, +32402=>18078, +58215=>18078, +17667=>18079, +58232=>18079, +58260=>18080, +151480=>18080, +58270=>18081, +133901=>18081, +58277=>18082, +158474=>18082, +13438=>18083, +58311=>18083, +58317=>18084, +143087=>18084, +58325=>18085, +146613=>18085, +58343=>18086, +159385=>18086, +34673=>18087, +58364=>18087, +25537=>18088, +58385=>18088, +30583=>18089, +58387=>18089, +35210=>18090, +58390=>18090, +58406=>18091, +147343=>18091, +35660=>18092, +58415=>18092, +58440=>18093, +150729=>18093, +18730=>18094, +58464=>18094, +172052=>18095, +58471=>18095, +165564=>18096, +58472=>18096, +165121=>18097, +58473=>18097, +15088=>18098, +58490=>18098, +28815=>18099, +58511=>18099, +58529=>18100, +140922=>18100, +58637=>18101, +158120=>18101, +58646=>18102, +148043=>18102, +26760=>18103, +58662=>18103, +58664=>18104, +139611=>18104, +40802=>18105, +58702=>18105, +37830=>18106, +58793=>18106, +58802=>18107, +131967=>18107, +37734=>18108, +58888=>18108, +37519=>18109, +58901=>18109, +34324=>18110, +58954=>18110, +58986=>18111, +173147=>18111, +16784=>18112, +59010=>18112, +26511=>18113, +59045=>18113, +26654=>18114, +59048=>18114, +14435=>18115, +59051=>18115, +59077=>18116, +149996=>18116, +15129=>18117, +59128=>18117, +33942=>18118, +59176=>18118, +59241=>18119, +149858=>18119, +14818=>18120, +59254=>18120, +33920=>18121, +59259=>18121, +17262=>18122, +59328=>18122, +38769=>18123, +59402=>18123, +39323=>18124, +59427=>18124, +18733=>18125, +59499=>18125, +28439=>18126, +59703=>18126, +160009=>18127, +59704=>18127, +28838=>18128, +59746=>18128, +150095=>18129, +59752=>18129, +32357=>18130, +59753=>18130, +23855=>18131, +59755=>18131, +15859=>18132, +59756=>18132, +150109=>18133, +59758=>18133, +137183=>18134, +59759=>18134, +32164=>18135, +59760=>18135, +33830=>18136, +59761=>18136, +21637=>18137, +59762=>18137, +146170=>18138, +59763=>18138, +131604=>18139, +59765=>18139, +22398=>18140, +59766=>18140, +133333=>18141, +59767=>18141, +132633=>18142, +59768=>18142, +16357=>18143, +59769=>18143, +139166=>18144, +59770=>18144, +172726=>18145, +59771=>18145, +28675=>18146, +59772=>18146, +168283=>18147, +59773=>18147, +23920=>18148, +59774=>18148, +29583=>18149, +59775=>18149, +166489=>18150, +59777=>18150, +168992=>18151, +59778=>18151, +20424=>18152, +59779=>18152, +32743=>18153, +59780=>18153, +29456=>18154, +59782=>18154, +29496=>18155, +59784=>18155, +29505=>18156, +59787=>18156, +16041=>18157, +59789=>18157, +29173=>18158, +59792=>18158, +149746=>18159, +59793=>18159, +29665=>18160, +59794=>18160, +16074=>18161, +59796=>18161, +16081=>18162, +59798=>18162, +29721=>18163, +59801=>18163, +29726=>18164, +59802=>18164, +29727=>18165, +59803=>18165, +16098=>18166, +59804=>18166, +16112=>18167, +59805=>18167, +16116=>18168, +59806=>18168, +16122=>18169, +59807=>18169, +29907=>18170, +59808=>18170, +16142=>18171, +59809=>18171, +16211=>18172, +59810=>18172, +30061=>18173, +59812=>18173, +30066=>18174, +59813=>18174, +30093=>18175, +59814=>18175, +16252=>18176, +59815=>18176, +30152=>18177, +59816=>18177, +30285=>18178, +59819=>18178, +30324=>18179, +59821=>18179, +16348=>18180, +59822=>18180, +30330=>18181, +59823=>18181, +29064=>18182, +59825=>18182, +22051=>18183, +59826=>18183, +35200=>18184, +59827=>18184, +16413=>18185, +59829=>18185, +30531=>18186, +59830=>18186, +16441=>18187, +59831=>18187, +16453=>18188, +59833=>18188, +13787=>18189, +59834=>18189, +30616=>18190, +59835=>18190, +16490=>18191, +59836=>18191, +16495=>18192, +59837=>18192, +30654=>18193, +59839=>18193, +30667=>18194, +59840=>18194, +30744=>18195, +59842=>18195, +30748=>18196, +59844=>18196, +30791=>18197, +59847=>18197, +30801=>18198, +59848=>18198, +30822=>18199, +59849=>18199, +33864=>18200, +59850=>18200, +152885=>18201, +59851=>18201, +31027=>18202, +59852=>18202, +31026=>18203, +59854=>18203, +16649=>18204, +59856=>18204, +31121=>18205, +59857=>18205, +31238=>18206, +59860=>18206, +16743=>18207, +59862=>18207, +16818=>18208, +59864=>18208, +31420=>18209, +59865=>18209, +33401=>18210, +59866=>18210, +16836=>18211, +59867=>18211, +31439=>18212, +59868=>18212, +31451=>18213, +59869=>18213, +16847=>18214, +59870=>18214, +31586=>18215, +59872=>18215, +31596=>18216, +59873=>18216, +31611=>18217, +59874=>18217, +31762=>18218, +59875=>18218, +16992=>18219, +59877=>18219, +17018=>18220, +59878=>18220, +31867=>18221, +59879=>18221, +31900=>18222, +59880=>18222, +17036=>18223, +59881=>18223, +31928=>18224, +59882=>18224, +17044=>18225, +59883=>18225, +36755=>18226, +59885=>18226, +28864=>18227, +59886=>18227, +134351=>18228, +59887=>18228, +32207=>18229, +59888=>18229, +32212=>18230, +59889=>18230, +32208=>18231, +59890=>18231, +32253=>18232, +59891=>18232, +32692=>18233, +59893=>18233, +29343=>18234, +59894=>18234, +17303=>18235, +59895=>18235, +32800=>18236, +59896=>18236, +32805=>18237, +59897=>18237, +32814=>18238, +59899=>18238, +32817=>18239, +59900=>18239, +32852=>18240, +59901=>18240, +22452=>18241, +59903=>18241, +28832=>18242, +59904=>18242, +32951=>18243, +59905=>18243, +33001=>18244, +59906=>18244, +17389=>18245, +59907=>18245, +33036=>18246, +59908=>18246, +33038=>18247, +59910=>18247, +33042=>18248, +59911=>18248, +33044=>18249, +59913=>18249, +17409=>18250, +59914=>18250, +15161=>18251, +59915=>18251, +33110=>18252, +59916=>18252, +33113=>18253, +59917=>18253, +33114=>18254, +59918=>18254, +17427=>18255, +59919=>18255, +33148=>18256, +59921=>18256, +17445=>18257, +59923=>18257, +17453=>18258, +59925=>18258, +33189=>18259, +59926=>18259, +22511=>18260, +59927=>18260, +33217=>18261, +59928=>18261, +33252=>18262, +59929=>18262, +33364=>18263, +59930=>18263, +17551=>18264, +59931=>18264, +33398=>18265, +59933=>18265, +33482=>18266, +59934=>18266, +33496=>18267, +59935=>18267, +17584=>18268, +59937=>18268, +33623=>18269, +59938=>18269, +38505=>18270, +59939=>18270, +33797=>18271, +59941=>18271, +28917=>18272, +59942=>18272, +33892=>18273, +59943=>18273, +33928=>18274, +59945=>18274, +17668=>18275, +59946=>18275, +33982=>18276, +59947=>18276, +34017=>18277, +59948=>18277, +34040=>18278, +59949=>18278, +34064=>18279, +59950=>18279, +34104=>18280, +59951=>18280, +34130=>18281, +59952=>18281, +17723=>18282, +59953=>18282, +34159=>18283, +59954=>18283, +34160=>18284, +59955=>18284, +34272=>18285, +59956=>18285, +17783=>18286, +59957=>18286, +34418=>18287, +59958=>18287, +34450=>18288, +59959=>18288, +34543=>18289, +59961=>18289, +38469=>18290, +59962=>18290, +17926=>18291, +59964=>18291, +17943=>18292, +59965=>18292, +34990=>18293, +59966=>18293, +35071=>18294, +59967=>18294, +35108=>18295, +59968=>18295, +35217=>18296, +59970=>18296, +162151=>18297, +59971=>18297, +35384=>18298, +59973=>18298, +35476=>18299, +59974=>18299, +35508=>18300, +59975=>18300, +35921=>18301, +59976=>18301, +36052=>18302, +59977=>18302, +36082=>18303, +59978=>18303, +36124=>18304, +59979=>18304, +18328=>18305, +59980=>18305, +36291=>18306, +59982=>18306, +18413=>18307, +59983=>18307, +36410=>18308, +59985=>18308, +22356=>18309, +59987=>18309, +22005=>18310, +59989=>18310, +18487=>18311, +59991=>18311, +36558=>18312, +59992=>18312, +36578=>18313, +59993=>18313, +36580=>18314, +59994=>18314, +36589=>18315, +59995=>18315, +36594=>18316, +59996=>18316, +36801=>18317, +59998=>18317, +36810=>18318, +59999=>18318, +36812=>18319, +60000=>18319, +36915=>18320, +60001=>18320, +18605=>18321, +60003=>18321, +39136=>18322, +60004=>18322, +37395=>18323, +60005=>18323, +18718=>18324, +60006=>18324, +37416=>18325, +60007=>18325, +37464=>18326, +60008=>18326, +37483=>18327, +60009=>18327, +37553=>18328, +60010=>18328, +37550=>18329, +60011=>18329, +37567=>18330, +60012=>18330, +37603=>18331, +60013=>18331, +37611=>18332, +60014=>18332, +37619=>18333, +60015=>18333, +37620=>18334, +60016=>18334, +37629=>18335, +60017=>18335, +37699=>18336, +60018=>18336, +37764=>18337, +60019=>18337, +37805=>18338, +60020=>18338, +18757=>18339, +60021=>18339, +18769=>18340, +60022=>18340, +37911=>18341, +60024=>18341, +37917=>18342, +60026=>18342, +37933=>18343, +60027=>18343, +37950=>18344, +60028=>18344, +18794=>18345, +60029=>18345, +37972=>18346, +60030=>18346, +38009=>18347, +60031=>18347, +38189=>18348, +60032=>18348, +38306=>18349, +60033=>18349, +18855=>18350, +60034=>18350, +38388=>18351, +60035=>18351, +38451=>18352, +60036=>18352, +18917=>18353, +60037=>18353, +18980=>18354, +60039=>18354, +38720=>18355, +60040=>18355, +18997=>18356, +60041=>18356, +38834=>18357, +60042=>18357, +38850=>18358, +60043=>18358, +19172=>18359, +60045=>18359, +39097=>18360, +60047=>18360, +19225=>18361, +60048=>18361, +39153=>18362, +60049=>18362, +22596=>18363, +60050=>18363, +39193=>18364, +60052=>18364, +39223=>18365, +60055=>18365, +39261=>18366, +60057=>18366, +39266=>18367, +60058=>18367, +19312=>18368, +60059=>18368, +39365=>18369, +60060=>18369, +19357=>18370, +60061=>18370, +39484=>18371, +60062=>18371, +39695=>18372, +60063=>18372, +39785=>18373, +60065=>18373, +39901=>18374, +60067=>18374, +39921=>18375, +60068=>18375, +39924=>18376, +60069=>18376, +19565=>18377, +60070=>18377, +39968=>18378, +60071=>18378, +14191=>18379, +60072=>18379, +138178=>18380, +60073=>18380, +40265=>18381, +60074=>18381, +40702=>18382, +60076=>18382, +22096=>18383, +60077=>18383, +40381=>18384, +60079=>18384, +40444=>18385, +60081=>18385, +38134=>18386, +60082=>18386, +36790=>18387, +60083=>18387, +40625=>18388, +60086=>18388, +40637=>18389, +60087=>18389, +40646=>18390, +60088=>18390, +38108=>18391, +60089=>18391, +40674=>18392, +60090=>18392, +40689=>18393, +60091=>18393, +40696=>18394, +60092=>18394, +40772=>18395, +60094=>18395, +131220=>18396, +60095=>18396, +131767=>18397, +60096=>18397, +132000=>18398, +60097=>18398, +38083=>18399, +60099=>18399, +60101=>18400, +132311=>18400, +38081=>18401, +60103=>18401, +132565=>18402, +60105=>18402, +132629=>18403, +60106=>18403, +132726=>18404, +60107=>18404, +136890=>18405, +60108=>18405, +22359=>18406, +60109=>18406, +29043=>18407, +60110=>18407, +133826=>18408, +60111=>18408, +133837=>18409, +60112=>18409, +134079=>18410, +60113=>18410, +194619=>18411, +60115=>18411, +134091=>18412, +60116=>18412, +21662=>18413, +60117=>18413, +134139=>18414, +60118=>18414, +134203=>18415, +60119=>18415, +134227=>18416, +60120=>18416, +134245=>18417, +60121=>18417, +134268=>18418, +60122=>18418, +60124=>18419, +134285=>18419, +134325=>18420, +60126=>18420, +134365=>18421, +60127=>18421, +134381=>18422, +60128=>18422, +134511=>18423, +60129=>18423, +134578=>18424, +60130=>18424, +134600=>18425, +60131=>18425, +134660=>18426, +60135=>18426, +134670=>18427, +60136=>18427, +134871=>18428, +60137=>18428, +135056=>18429, +60138=>18429, +134957=>18430, +60139=>18430, +134771=>18431, +60140=>18431, +60142=>18432, +135100=>18432, +135260=>18433, +60144=>18433, +135247=>18434, +60145=>18434, +135286=>18435, +60146=>18435, +135304=>18436, +60149=>18436, +135318=>18437, +60150=>18437, +13895=>18438, +60151=>18438, +135359=>18439, +60152=>18439, +135471=>18440, +60154=>18440, +135483=>18441, +60155=>18441, +21348=>18442, +60156=>18442, +135907=>18443, +60158=>18443, +136053=>18444, +60159=>18444, +60160=>18445, +135990=>18445, +136567=>18446, +60162=>18446, +136729=>18447, +60163=>18447, +137155=>18448, +60164=>18448, +137159=>18449, +60165=>18449, +28859=>18450, +60167=>18450, +137261=>18451, +60168=>18451, +137578=>18452, +60169=>18452, +137773=>18453, +60170=>18453, +137797=>18454, +60171=>18454, +138282=>18455, +60172=>18455, +138352=>18456, +60173=>18456, +138412=>18457, +60174=>18457, +138952=>18458, +60175=>18458, +138965=>18459, +60177=>18459, +139029=>18460, +60178=>18460, +29080=>18461, +60179=>18461, +139333=>18462, +60181=>18462, +27113=>18463, +60182=>18463, +14024=>18464, +60183=>18464, +139900=>18465, +60184=>18465, +140247=>18466, +60185=>18466, +140282=>18467, +60186=>18467, +141098=>18468, +60187=>18468, +141425=>18469, +60188=>18469, +141647=>18470, +60189=>18470, +141671=>18471, +60191=>18471, +141715=>18472, +60192=>18472, +142037=>18473, +60193=>18473, +60195=>18474, +142056=>18474, +60197=>18475, +142094=>18475, +60199=>18476, +142143=>18476, +60202=>18477, +142412=>18477, +142472=>18478, +60204=>18478, +142519=>18479, +60205=>18479, +154600=>18480, +60206=>18480, +142600=>18481, +60207=>18481, +142610=>18482, +60208=>18482, +142775=>18483, +60209=>18483, +142741=>18484, +60210=>18484, +142914=>18485, +60211=>18485, +143220=>18486, +60212=>18486, +143308=>18487, +60213=>18487, +143411=>18488, +60214=>18488, +143462=>18489, +60215=>18489, +144159=>18490, +60216=>18490, +144350=>18491, +60217=>18491, +144743=>18492, +60222=>18492, +144883=>18493, +60223=>18493, +144922=>18494, +60227=>18494, +145174=>18495, +60228=>18495, +22709=>18496, +60231=>18496, +60234=>18497, +146087=>18497, +146961=>18498, +60237=>18498, +147129=>18499, +60238=>18499, +60243=>18500, +147737=>18500, +148206=>18501, +60245=>18501, +148237=>18502, +60246=>18502, +148276=>18503, +60248=>18503, +148374=>18504, +60249=>18504, +148484=>18505, +60258=>18505, +148694=>18506, +60259=>18506, +22408=>18507, +60260=>18507, +149108=>18508, +60261=>18508, +60263=>18509, +149295=>18509, +149522=>18510, +60271=>18510, +149755=>18511, +60272=>18511, +150037=>18512, +60273=>18512, +60275=>18513, +150208=>18513, +22885=>18514, +60277=>18514, +60279=>18515, +151430=>18515, +60282=>18516, +151596=>18516, +22335=>18517, +60284=>18517, +152217=>18518, +60286=>18518, +152601=>18519, +60287=>18519, +152646=>18520, +60291=>18520, +152686=>18521, +60292=>18521, +60296=>18522, +152895=>18522, +60298=>18523, +152926=>18523, +152930=>18524, +60300=>18524, +152934=>18525, +60301=>18525, +153543=>18526, +60302=>18526, +60304=>18527, +153693=>18527, +60309=>18528, +153859=>18528, +154286=>18529, +60312=>18529, +154505=>18530, +60313=>18530, +154630=>18531, +60314=>18531, +22433=>18532, +60316=>18532, +29009=>18533, +60317=>18533, +60319=>18534, +155906=>18534, +60322=>18535, +156082=>18535, +156674=>18536, +60325=>18536, +156746=>18537, +60326=>18537, +60330=>18538, +156804=>18538, +60334=>18539, +156808=>18539, +60336=>18540, +156946=>18540, +157119=>18541, +60338=>18541, +157365=>18542, +60339=>18542, +22201=>18543, +60347=>18543, +60349=>18544, +157436=>18544, +13848=>18545, +60355=>18545, +157593=>18546, +60357=>18546, +157806=>18547, +60358=>18547, +60360=>18548, +157790=>18548, +60362=>18549, +157895=>18549, +60366=>18550, +157990=>18550, +60368=>18551, +158009=>18551, +60371=>18552, +158202=>18552, +60373=>18553, +158253=>18553, +158260=>18554, +60378=>18554, +158555=>18555, +60379=>18555, +60383=>18556, +158621=>18556, +60385=>18557, +158884=>18557, +60388=>18558, +159150=>18558, +159819=>18559, +60392=>18559, +160205=>18560, +60393=>18560, +160384=>18561, +60395=>18561, +160389=>18562, +60396=>18562, +60399=>18563, +160395=>18563, +60401=>18564, +160486=>18564, +38047=>18565, +60404=>18565, +160848=>18566, +60405=>18566, +14009=>18567, +60416=>18567, +161740=>18568, +60424=>18568, +161880=>18569, +60425=>18569, +22230=>18570, +60426=>18570, +60435=>18571, +162269=>18571, +162301=>18572, +60441=>18572, +162314=>18573, +60442=>18573, +162571=>18574, +60443=>18574, +163174=>18575, +60444=>18575, +60448=>18576, +163849=>18576, +60459=>18577, +163875=>18577, +60463=>18578, +163912=>18578, +60466=>18579, +163971=>18579, +163984=>18580, +60479=>18580, +164084=>18581, +60480=>18581, +164142=>18582, +60481=>18582, +60483=>18583, +164175=>18583, +164271=>18584, +60485=>18584, +164378=>18585, +60486=>18585, +164614=>18586, +60487=>18586, +164655=>18587, +60488=>18587, +164746=>18588, +60489=>18588, +164968=>18589, +60491=>18589, +165546=>18590, +60492=>18590, +25574=>18591, +60494=>18591, +166230=>18592, +60495=>18592, +60498=>18593, +166328=>18593, +60500=>18594, +166375=>18594, +60502=>18595, +166376=>18595, +166726=>18596, +60503=>18596, +166868=>18597, +60504=>18597, +60506=>18598, +166921=>18598, +167877=>18599, +60508=>18599, +168172=>18600, +60509=>18600, +168208=>18601, +60511=>18601, +168252=>18602, +60512=>18602, +15863=>18603, +60513=>18603, +168286=>18604, +60514=>18604, +150218=>18605, +60515=>18605, +36816=>18606, +60516=>18606, +60519=>18607, +169191=>18607, +169392=>18608, +60521=>18608, +169400=>18609, +60522=>18609, +169778=>18610, +60523=>18610, +170193=>18611, +60524=>18611, +170313=>18612, +60525=>18612, +170346=>18613, +60526=>18613, +170435=>18614, +60527=>18614, +170536=>18615, +60528=>18615, +170766=>18616, +60529=>18616, +171354=>18617, +60530=>18617, +171419=>18618, +60531=>18618, +32415=>18619, +60532=>18619, +171768=>18620, +60533=>18620, +171811=>18621, +60534=>18621, +19620=>18622, +60535=>18622, +38215=>18623, +60536=>18623, +172691=>18624, +60537=>18624, +29090=>18625, +60538=>18625, +172799=>18626, +60539=>18626, +173515=>18627, +60542=>18627, +19868=>18628, +60543=>18628, +134300=>18629, +60544=>18629, +36798=>18630, +60545=>18630, +36794=>18631, +60547=>18631, +140464=>18632, +60548=>18632, +36793=>18633, +60549=>18633, +150163=>18634, +60550=>18634, +20202=>18635, +60555=>18635, +60557=>18636, +166700=>18636, +36480=>18637, +60560=>18637, +137205=>18638, +60561=>18638, +166764=>18639, +60563=>18639, +166809=>18640, +60564=>18640, +60566=>18641, +157359=>18641, +60568=>18642, +161365=>18642, +153141=>18643, +60570=>18643, +153942=>18644, +60571=>18644, +20122=>18645, +60572=>18645, +155265=>18646, +60573=>18646, +60576=>18647, +134765=>18647, +147080=>18648, +60579=>18648, +150686=>18649, +60580=>18649, +137206=>18650, +60583=>18650, +137339=>18651, +60584=>18651, +60587=>18652, +154698=>18652, +152337=>18653, +60589=>18653, +15814=>18654, +60590=>18654, +60596=>18655, +155352=>18655, +19996=>18656, +60600=>18656, +135146=>18657, +60601=>18657, +134473=>18658, +60602=>18658, +145082=>18659, +60603=>18659, +60638=>18660, +151880=>18660, +21982=>18661, +60644=>18661, +34694=>18662, +60672=>18662, +60676=>18663, +135361=>18663, +149254=>18664, +60679=>18664, +23440=>18665, +60680=>18665, +60682=>18666, +157843=>18666, +141044=>18667, +60684=>18667, +163119=>18668, +60685=>18668, +147875=>18669, +60686=>18669, +163187=>18670, +60687=>18670, +159440=>18671, +60688=>18671, +160438=>18672, +60689=>18672, +60691=>18673, +135641=>18673, +146684=>18674, +60693=>18674, +173737=>18675, +60694=>18675, +134828=>18676, +60695=>18676, +60698=>18677, +138402=>18677, +60700=>18678, +151490=>18678, +60702=>18679, +135147=>18679, +60706=>18680, +142752=>18680, +135148=>18681, +60710=>18681, +134666=>18682, +60711=>18682, +60714=>18683, +135149=>18683, +60717=>18684, +135559=>18684, +19994=>18685, +60721=>18685, +19972=>18686, +60722=>18686, +23309=>18687, +60724=>18687, +13996=>18688, +60727=>18688, +21373=>18689, +60729=>18689, +13989=>18690, +60730=>18690, +22682=>18691, +60732=>18691, +150382=>18692, +60733=>18692, +22442=>18693, +60736=>18693, +154261=>18694, +60737=>18694, +133497=>18695, +60738=>18695, +60741=>18696, +140389=>18696, +146686=>18697, +60746=>18697, +171824=>18698, +60747=>18698, +151465=>18699, +60749=>18699, +169374=>18700, +60750=>18700, +60753=>18701, +146870=>18701, +157619=>18702, +60755=>18702, +145184=>18703, +60756=>18703, +147191=>18704, +60759=>18704, +146988=>18705, +60760=>18705, +60785=>18706, +143578=>18706, +135849=>18707, +60789=>18707, +22439=>18708, +60790=>18708, +149859=>18709, +60791=>18709, +60794=>18710, +159918=>18710, +60801=>18711, +137068=>18711, +60806=>18712, +160100=>18712, +159010=>18713, +60809=>18713, +150242=>18714, +60810=>18714, +39963=>18715, +60837=>18715, +149822=>18716, +60838=>18716, +15878=>18717, +60846=>18717, +60881=>18718, +159011=>18718, +60887=>18719, +132092=>18719, +60891=>18720, +146685=>18720, +60893=>18721, +149785=>18721, +22394=>18722, +60904=>18722, +21722=>18723, +60912=>18723, +29050=>18724, +60928=>18724, +60949=>18725, +150135=>18725, +60955=>18726, +166490=>18726, +60962=>18727, +194624=>18727, +60976=>18728, +137275=>18728, +61000=>18729, +155993=>18729, +61014=>18730, +144373=>18730, +61019=>18731, +166850=>18731, +61024=>18732, +138566=>18732, +61054=>18733, +159441=>18733, +13877=>18734, +61065=>18734, +61084=>18735, +166701=>18735, +21024=>18736, +61088=>18736, +15384=>18737, +61089=>18737, +146631=>18738, +61090=>18738, +155351=>18739, +61091=>18739, +161366=>18740, +61092=>18740, +152881=>18741, +61093=>18741, +137540=>18742, +61094=>18742, +170243=>18743, +61096=>18743, +159196=>18744, +61097=>18744, +159917=>18745, +61098=>18745, +156077=>18746, +61100=>18746, +166415=>18747, +61101=>18747, +145015=>18748, +61102=>18748, +131310=>18749, +61103=>18749, +157766=>18750, +61104=>18750, +151310=>18751, +61105=>18751, +17762=>18752, +61106=>18752, +23327=>18753, +61107=>18753, +156492=>18754, +61108=>18754, +40784=>18755, +61109=>18755, +40614=>18756, +61110=>18756, +156267=>18757, +61111=>18757, +20962=>18758, +57415=>18758, +21314=>18759, +57416=>18759, +26285=>18760, +57520=>18760, +22620=>18761, +57547=>18761, +21843=>18762, +57566=>18762, +15749=>18763, +57594=>18763, +24928=>18764, +57608=>18764, +18606=>18765, +57668=>18765, +38845=>18766, +57676=>18766, +57693=>18767, +137335=>18767, +24755=>18768, +57703=>18768, +33828=>18769, +57711=>18769, +38932=>18770, +57748=>18770, +147596=>18771, +57749=>18771, +57764=>18772, +143486=>18772, +57787=>18773, +138813=>18773, +15147=>18774, +57798=>18774, +15666=>18775, +57824=>18775, +57857=>18776, +132021=>18776, +28801=>18777, +57944=>18777, +23708=>18778, +57959=>18778, +58017=>18779, +132547=>18779, +14128=>18780, +58028=>18780, +136054=>18781, +58096=>18781, +150034=>18782, +58097=>18782, +58111=>18783, +166699=>18783, +58112=>18784, +155779=>18784, +256=>18785, +62233=>18785, +193=>18786, +62234=>18786, +461=>18787, +62235=>18787, +192=>18788, +62236=>18788, +274=>18789, +62237=>18789, +201=>18790, +62238=>18790, +282=>18791, +62239=>18791, +200=>18792, +62240=>18792, +332=>18793, +62241=>18793, +211=>18794, +62242=>18794, +465=>18795, +62243=>18795, +210=>18796, +62244=>18796, +62245=>18797, +7870=>18798, +62246=>18798, +62247=>18799, +7872=>18800, +62248=>18800, +202=>18801, +62249=>18801, +257=>18802, +62250=>18802, +225=>18803, +62251=>18803, +462=>18804, +62252=>18804, +224=>18805, +62253=>18805, +593=>18806, +62254=>18806, +275=>18807, +62255=>18807, +233=>18808, +62256=>18808, +283=>18809, +62257=>18809, +232=>18810, +62258=>18810, +299=>18811, +62259=>18811, +237=>18812, +62260=>18812, +464=>18813, +62261=>18813, +236=>18814, +62262=>18814, +333=>18815, +62263=>18815, +243=>18816, +62264=>18816, +466=>18817, +62265=>18817, +242=>18818, +62266=>18818, +363=>18819, +62267=>18819, +250=>18820, +62268=>18820, +468=>18821, +62269=>18821, +249=>18822, +62270=>18822, +470=>18823, +62271=>18823, +472=>18824, +62272=>18824, +474=>18825, +62273=>18825, +476=>18826, +62274=>18826, +252=>18827, +62275=>18827, +62276=>18828, +7871=>18829, +62277=>18829, +62278=>18830, +7873=>18831, +62279=>18831, +234=>18832, +62280=>18832, +609=>18833, +62281=>18833, +643=>18834, +63551=>18834, +592=>18835, +63552=>18835, +603=>18836, +63553=>18836, +596=>18837, +63554=>18837, +629=>18838, +63555=>18838, +339=>18839, +63556=>18839, +248=>18840, +63557=>18840, +331=>18841, +63558=>18841, +650=>18842, +63559=>18842, +618=>18843, +63560=>18843, +9178=>18844, +62282=>18844, +9179=>18845, +62283=>18845, +11933=>18846, +63530=>18846, +11974=>18847, +63539=>18847, +12003=>18848, +63547=>18848, +20539=>18849, +28158=>18850, +171123=>18851, +62841=>18851, +40870=>18852, +62842=>18852, +15817=>18853, +62843=>18853, +34959=>18854, +62845=>18855, +147790=>18855, +28791=>18856, +23797=>18857, +19232=>18858, +62848=>18858, +152013=>18859, +62849=>18859, +13657=>18860, +62850=>18860, +154928=>18861, +62851=>18861, +24866=>18862, +62853=>18863, +166450=>18863, +36775=>18864, +37366=>18865, +29073=>18866, +26393=>18867, +29626=>18868, +144001=>18869, +62859=>18869, +172295=>18870, +62860=>18870, +15499=>18871, +62861=>18871, +137600=>18872, +62862=>18872, +19216=>18873, +62863=>18873, +30948=>18874, +29698=>18875, +20910=>18876, +165647=>18877, +62867=>18877, +16393=>18878, +62868=>18878, +27235=>18879, +172730=>18880, +62870=>18880, +16931=>18881, +62871=>18881, +34319=>18882, +31274=>18883, +170311=>18884, +62875=>18884, +166634=>18885, +62876=>18885, +38741=>18886, +28749=>18887, +21284=>18888, +62880=>18889, +139390=>18889, +37876=>18890, +30425=>18891, +166371=>18892, +62883=>18892, +40871=>18893, +62884=>18893, +30685=>18894, +20131=>18895, +20464=>18896, +20668=>18897, +20015=>18898, +20247=>18899, +40872=>18900, +62891=>18900, +21556=>18901, +32139=>18902, +22674=>18903, +22736=>18904, +62896=>18905, +138678=>18905, +24210=>18906, +24217=>18907, +24514=>18908, +62900=>18909, +141074=>18909, +25995=>18910, +62902=>18911, +144377=>18911, +26905=>18912, +27203=>18913, +62905=>18914, +146531=>18914, +27903=>18915, +29184=>18916, +62909=>18917, +148741=>18917, +29580=>18918, +16091=>18919, +62911=>18919, +150035=>18920, +62912=>18920, +23317=>18921, +29881=>18922, +35715=>18923, +154788=>18924, +62916=>18924, +153237=>18925, +62917=>18925, +31379=>18926, +31724=>18927, +31939=>18928, +32364=>18929, +33528=>18930, +34199=>18931, +40873=>18932, +62924=>18932, +34960=>18933, +40874=>18934, +62926=>18934, +36537=>18935, +40875=>18936, +62928=>18936, +36815=>18937, +34143=>18938, +39392=>18939, +37409=>18940, +40876=>18941, +62933=>18941, +167353=>18942, +62934=>18942, +136255=>18943, +62935=>18943, +16497=>18944, +62936=>18944, +17058=>18945, +62937=>18945, +23066=>18946, +39016=>18947, +26475=>18948, +17014=>18949, +62944=>18949, +22333=>18950, +34262=>18951, +62948=>18952, +149883=>18952, +33471=>18953, +160013=>18954, +62950=>18954, +19585=>18955, +62951=>18955, +159092=>18956, +62952=>18956, +23931=>18957, +158485=>18958, +62954=>18958, +159678=>18959, +62955=>18959, +40877=>18960, +62956=>18960, +40878=>18961, +62957=>18961, +23446=>18962, +40879=>18963, +62959=>18963, +32347=>18964, +17392=>18965, +19506=>18966, +17923=>18967, +17830=>18968, +17784=>18969, +160359=>18970, +19831=>18971, +17843=>18972, +162993=>18973, +19682=>18974, +163013=>18975, +15253=>18976, +18230=>18977, +18244=>18978, +19527=>18979, +19520=>18980, +148159=>18981, +144919=>18982, +160594=>18983, +159371=>18984, +159954=>18985, +19543=>18986, +172881=>18987, +18255=>18988, +17882=>18989, +19589=>18990, +162924=>18991, +19719=>18992, +19108=>18993, +18081=>18994, +158499=>18995, +29221=>18996, +154196=>18997, +137827=>18998, +146950=>18999, +147297=>19000, +26189=>19001, +22267=>19002, +32149=>19003, +22813=>19004, +166841=>19005, +15860=>19006, +38708=>19007, +162799=>19008, +23515=>19009, +138590=>19010, +23204=>19011, +13861=>19012, +171696=>19013, +23249=>19014, +23479=>19015, +23804=>19016, +26478=>19017, +34195=>19018, +170309=>19019, +29793=>19020, +29853=>19021, +133743=>19022, +26343=>19023, +28247=>19024, +31178=>19025, +15752=>19026, +17603=>19027, +143958=>19028, +141206=>19029, +17306=>19030, +17718=>19031, +23765=>19032, +146202=>19033, +35577=>19034, +23672=>19035, +15634=>19036, +144721=>19037, +23928=>19038, +40882=>19039, +29015=>19040, +17752=>19041, +147692=>19042, +138787=>19043, +19575=>19044, +14712=>19045, +13386=>19046, +131492=>19047, +158785=>19048, +35532=>19049, +20404=>19050, +131641=>19051, +22975=>19052, +33132=>19053, +38998=>19054, +170234=>19055, +24379=>19056, +134047=>19057, +139713=>19058, +166253=>19059, +16642=>19060, +18107=>19061, +168057=>19062, +16135=>19063, +40883=>19064, +172469=>19065, +16632=>19066, +14294=>19067, +18167=>19068, +158790=>19069, +16764=>19070, +165554=>19071, +160767=>19072, +17773=>19073, +14548=>19074, +152730=>19075, +17761=>19076, +17691=>19077, +19849=>19078, +19579=>19079, +19830=>19080, +17898=>19081, +16328=>19082, +150287=>19083, +13921=>19084, +17630=>19085, +17597=>19086, +16877=>19087, +); +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/uni2cid_ag15.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/uni2cid_ag15.php new file mode 100644 index 0000000..c19acb5 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/uni2cid_ag15.php @@ -0,0 +1,30222 @@ +<?php +// unicode to cid conversion table is from +// ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/ +// cid2code.txt in ag15.tar.Z +$cidinfo['uni2cid'] = array( +32=>1, +33=>2, +34=>3, +35=>4, +36=>5, +37=>6, +38=>7, +39=>8, +40=>9, +41=>10, +42=>11, +43=>12, +44=>13, +45=>14, +46=>15, +47=>16, +48=>17, +49=>18, +50=>19, +51=>20, +52=>21, +53=>22, +54=>23, +55=>24, +56=>25, +57=>26, +58=>27, +59=>28, +60=>29, +61=>30, +62=>31, +63=>32, +64=>33, +65=>34, +66=>35, +67=>36, +68=>37, +69=>38, +70=>39, +71=>40, +72=>41, +73=>42, +74=>43, +75=>44, +76=>45, +77=>46, +78=>47, +79=>48, +80=>49, +81=>50, +82=>51, +83=>52, +84=>53, +85=>54, +86=>55, +87=>56, +88=>57, +89=>58, +90=>59, +91=>60, +92=>61, +93=>62, +94=>63, +95=>64, +96=>65, +97=>66, +98=>67, +99=>68, +100=>69, +101=>70, +102=>71, +103=>72, +104=>73, +105=>74, +106=>75, +107=>76, +108=>77, +109=>78, +110=>79, +111=>80, +112=>81, +113=>82, +114=>83, +115=>84, +116=>85, +117=>86, +118=>87, +119=>88, +120=>89, +121=>90, +122=>91, +123=>92, +124=>93, +125=>94, +126=>95, +12288=>96, +12289=>97, +12290=>98, +183=>99, +12539=>99, +713=>100, +711=>101, +168=>102, +12291=>103, +12293=>104, +8212=>105, +65374=>106, +8214=>107, +8230=>108, +8943=>108, +8216=>109, +8217=>110, +8220=>111, +8221=>112, +12308=>113, +12309=>114, +12296=>115, +12297=>116, +12298=>117, +12299=>118, +12300=>119, +12301=>120, +12302=>121, +12303=>122, +12310=>123, +12311=>124, +12304=>125, +12305=>126, +177=>127, +215=>128, +247=>129, +8758=>130, +8743=>131, +8744=>132, +8721=>133, +8719=>134, +8746=>135, +8745=>136, +8712=>137, +8759=>138, +8730=>139, +8869=>140, +8741=>141, +8736=>142, +8978=>143, +8857=>144, +8747=>145, +8750=>146, +8801=>147, +8780=>148, +8776=>149, +8765=>150, +8733=>151, +8800=>152, +8814=>153, +8815=>154, +8804=>155, +8805=>156, +8734=>157, +8757=>158, +8756=>159, +9794=>160, +9792=>161, +176=>162, +8242=>163, +8243=>164, +8451=>165, +65284=>166, +164=>167, +65504=>168, +65505=>169, +8240=>170, +167=>171, +8470=>172, +9734=>173, +9733=>174, +9675=>175, +9679=>176, +9678=>177, +9671=>178, +9670=>179, +9633=>180, +9632=>181, +9651=>182, +9650=>183, +8251=>184, +8594=>185, +8592=>186, +8593=>187, +8595=>188, +12307=>189, +9352=>190, +9353=>191, +9354=>192, +9355=>193, +9356=>194, +9357=>195, +9358=>196, +9359=>197, +9360=>198, +9361=>199, +9362=>200, +9363=>201, +9364=>202, +9365=>203, +9366=>204, +9367=>205, +9368=>206, +9369=>207, +9370=>208, +9371=>209, +9332=>210, +9333=>211, +9334=>212, +9335=>213, +9336=>214, +9337=>215, +9338=>216, +9339=>217, +9340=>218, +9341=>219, +9342=>220, +9343=>221, +9344=>222, +9345=>223, +9346=>224, +9347=>225, +9348=>226, +9349=>227, +9350=>228, +9351=>229, +9312=>230, +9313=>231, +9314=>232, +9315=>233, +9316=>234, +9317=>235, +9318=>236, +9319=>237, +9320=>238, +9321=>239, +12832=>240, +12833=>241, +12834=>242, +12835=>243, +12836=>244, +12837=>245, +12838=>246, +12839=>247, +12840=>248, +12841=>249, +8544=>250, +8545=>251, +8546=>252, +8547=>253, +8548=>254, +8549=>255, +8550=>256, +8551=>257, +8552=>258, +8553=>259, +8554=>260, +8555=>261, +65281=>262, +65282=>263, +65283=>264, +65509=>265, +65285=>266, +65286=>267, +65287=>268, +65288=>269, +65289=>270, +65290=>271, +65291=>272, +65292=>273, +65293=>274, +65294=>275, +65295=>276, +65296=>277, +65297=>278, +65298=>279, +65299=>280, +65300=>281, +65301=>282, +65302=>283, +65303=>284, +65304=>285, +65305=>286, +65306=>287, +65307=>288, +65308=>289, +65309=>290, +65310=>291, +65311=>292, +65312=>293, +65313=>294, +65314=>295, +65315=>296, +65316=>297, +65317=>298, +65318=>299, +65319=>300, +65320=>301, +65321=>302, +65322=>303, +65323=>304, +65324=>305, +65325=>306, +65326=>307, +65327=>308, +65328=>309, +65329=>310, +65330=>311, +65331=>312, +65332=>313, +65333=>314, +65334=>315, +65335=>316, +65336=>317, +65337=>318, +65338=>319, +65339=>320, +65340=>321, +65341=>322, +65342=>323, +65343=>324, +65344=>325, +65345=>326, +65346=>327, +65347=>328, +65348=>329, +65349=>330, +65350=>331, +65351=>332, +65352=>333, +65353=>334, +65354=>335, +65355=>336, +65356=>337, +65357=>338, +65358=>339, +65359=>340, +65360=>341, +65361=>342, +65362=>343, +65363=>344, +65364=>345, +65365=>346, +65366=>347, +65367=>348, +65368=>349, +65369=>350, +65370=>351, +65371=>352, +65372=>353, +65373=>354, +65507=>355, +12353=>356, +12354=>357, +12355=>358, +12356=>359, +12357=>360, +12358=>361, +12359=>362, +12360=>363, +12361=>364, +12362=>365, +12363=>366, +12364=>367, +12365=>368, +12366=>369, +12367=>370, +12368=>371, +12369=>372, +12370=>373, +12371=>374, +12372=>375, +12373=>376, +12374=>377, +12375=>378, +12376=>379, +12377=>380, +12378=>381, +12379=>382, +12380=>383, +12381=>384, +12382=>385, +12383=>386, +12384=>387, +12385=>388, +12386=>389, +12387=>390, +12388=>391, +12389=>392, +12390=>393, +12391=>394, +12392=>395, +12393=>396, +12394=>397, +12395=>398, +12396=>399, +12397=>400, +12398=>401, +12399=>402, +12400=>403, +12401=>404, +12402=>405, +12403=>406, +12404=>407, +12405=>408, +12406=>409, +12407=>410, +12408=>411, +12409=>412, +12410=>413, +12411=>414, +12412=>415, +12413=>416, +12414=>417, +12415=>418, +12416=>419, +12417=>420, +12418=>421, +12419=>422, +12420=>423, +12421=>424, +12422=>425, +12423=>426, +12424=>427, +12425=>428, +12426=>429, +12427=>430, +12428=>431, +12429=>432, +12430=>433, +12431=>434, +12432=>435, +12433=>436, +12434=>437, +12435=>438, +12449=>439, +12450=>440, +12451=>441, +12452=>442, +12453=>443, +12454=>444, +12455=>445, +12456=>446, +12457=>447, +12458=>448, +12459=>449, +12460=>450, +12461=>451, +12462=>452, +12463=>453, +12464=>454, +12465=>455, +12466=>456, +12467=>457, +12468=>458, +12469=>459, +12470=>460, +12471=>461, +12472=>462, +12473=>463, +12474=>464, +12475=>465, +12476=>466, +12477=>467, +12478=>468, +12479=>469, +12480=>470, +12481=>471, +12482=>472, +12483=>473, +12484=>474, +12485=>475, +12486=>476, +12487=>477, +12488=>478, +12489=>479, +12490=>480, +12491=>481, +12492=>482, +12493=>483, +12494=>484, +12495=>485, +12496=>486, +12497=>487, +12498=>488, +12499=>489, +12500=>490, +12501=>491, +12502=>492, +12503=>493, +12504=>494, +12505=>495, +12506=>496, +12507=>497, +12508=>498, +12509=>499, +12510=>500, +12511=>501, +12512=>502, +12513=>503, +12514=>504, +12515=>505, +12516=>506, +12517=>507, +12518=>508, +12519=>509, +12520=>510, +12521=>511, +12522=>512, +12523=>513, +12524=>514, +12525=>515, +12526=>516, +12527=>517, +12528=>518, +12529=>519, +12530=>520, +12531=>521, +12532=>522, +12533=>523, +12534=>524, +913=>525, +914=>526, +915=>527, +916=>528, +917=>529, +918=>530, +919=>531, +920=>532, +921=>533, +922=>534, +923=>535, +924=>536, +925=>537, +926=>538, +927=>539, +928=>540, +929=>541, +931=>542, +932=>543, +933=>544, +934=>545, +935=>546, +936=>547, +937=>548, +945=>549, +946=>550, +947=>551, +948=>552, +949=>553, +950=>554, +951=>555, +952=>556, +953=>557, +954=>558, +955=>559, +956=>560, +957=>561, +958=>562, +959=>563, +960=>564, +961=>565, +963=>566, +964=>567, +965=>568, +966=>569, +967=>570, +968=>571, +969=>572, +65040=>573, +59277=>573, +65042=>574, +59278=>574, +65041=>575, +59279=>575, +59280=>576, +65043=>576, +59281=>577, +65044=>577, +59282=>578, +65045=>578, +59283=>579, +65046=>579, +65077=>580, +65078=>581, +65081=>582, +65082=>583, +65087=>584, +65088=>585, +65085=>586, +65086=>587, +65089=>588, +65090=>589, +65091=>590, +65092=>591, +59284=>592, +65047=>592, +59285=>593, +65048=>593, +65083=>594, +65084=>595, +65079=>596, +65080=>597, +65073=>598, +8285=>599, +59286=>599, +65049=>599, +65075=>600, +65076=>601, +1040=>602, +1041=>603, +1042=>604, +1043=>605, +1044=>606, +1045=>607, +1025=>608, +1046=>609, +1047=>610, +1048=>611, +1049=>612, +1050=>613, +1051=>614, +1052=>615, +1053=>616, +1054=>617, +1055=>618, +1056=>619, +1057=>620, +1058=>621, +1059=>622, +1060=>623, +1061=>624, +1062=>625, +1063=>626, +1064=>627, +1065=>628, +1066=>629, +1067=>630, +1068=>631, +1069=>632, +1070=>633, +1071=>634, +1072=>635, +1073=>636, +1074=>637, +1075=>638, +1076=>639, +1077=>640, +1105=>641, +1078=>642, +1079=>643, +1080=>644, +1081=>645, +1082=>646, +1083=>647, +1084=>648, +1085=>649, +1086=>650, +1087=>651, +1088=>652, +1089=>653, +1090=>654, +1091=>655, +1092=>656, +1093=>657, +1094=>658, +1095=>659, +1096=>660, +1097=>661, +1098=>662, +1099=>663, +1100=>664, +1101=>665, +1102=>666, +1103=>667, +257=>668, +225=>669, +462=>670, +224=>671, +275=>672, +233=>673, +283=>674, +232=>675, +299=>676, +237=>677, +464=>678, +236=>679, +333=>680, +243=>681, +466=>682, +242=>683, +363=>684, +250=>685, +468=>686, +249=>687, +470=>688, +472=>689, +474=>690, +476=>691, +252=>692, +234=>693, +593=>694, +7743=>695, +59335=>695, +324=>696, +328=>697, +505=>698, +59336=>698, +609=>699, +12549=>700, +12550=>701, +12551=>702, +12552=>703, +12553=>704, +12554=>705, +12555=>706, +12556=>707, +12557=>708, +12558=>709, +12559=>710, +12560=>711, +12561=>712, +12562=>713, +12563=>714, +12564=>715, +12565=>716, +12566=>717, +12567=>718, +12568=>719, +12569=>720, +12570=>721, +12571=>722, +12572=>723, +12573=>724, +12574=>725, +12575=>726, +12576=>727, +12577=>728, +12578=>729, +12579=>730, +12580=>731, +12581=>732, +12582=>733, +12583=>734, +12584=>735, +12585=>736, +9472=>738, +9473=>739, +9474=>740, +9475=>741, +9476=>742, +9477=>743, +9478=>744, +9479=>745, +9480=>746, +9481=>747, +9482=>748, +9483=>749, +9484=>750, +9485=>751, +9486=>752, +9487=>753, +9488=>754, +9489=>755, +9490=>756, +9491=>757, +9492=>758, +9493=>759, +9494=>760, +9495=>761, +9496=>762, +9497=>763, +9498=>764, +9499=>765, +9500=>766, +9501=>767, +9502=>768, +9503=>769, +9504=>770, +9505=>771, +9506=>772, +9507=>773, +9508=>774, +9509=>775, +9510=>776, +9511=>777, +9512=>778, +9513=>779, +9514=>780, +9515=>781, +9516=>782, +9517=>783, +9518=>784, +9519=>785, +9520=>786, +9521=>787, +9522=>788, +9523=>789, +9524=>790, +9525=>791, +9526=>792, +9527=>793, +9528=>794, +9529=>795, +9530=>796, +9531=>797, +9532=>798, +9533=>799, +9534=>800, +9535=>801, +9536=>802, +9537=>803, +9538=>804, +9539=>805, +9540=>806, +9541=>807, +9542=>808, +9543=>809, +9544=>810, +9545=>811, +9546=>812, +9547=>813, +21834=>940, +38463=>941, +22467=>942, +25384=>943, +21710=>944, +21769=>945, +21696=>946, +30353=>947, +30284=>948, +34108=>949, +30702=>950, +33406=>951, +30861=>952, +29233=>953, +38552=>954, +38797=>955, +27688=>956, +23433=>957, +20474=>958, +25353=>959, +26263=>960, +23736=>961, +33018=>962, +26696=>963, +32942=>964, +26114=>965, +30414=>966, +20985=>967, +25942=>968, +29100=>969, +32753=>970, +34948=>971, +20658=>972, +22885=>973, +25034=>974, +28595=>975, +33453=>976, +25420=>977, +25170=>978, +21485=>979, +21543=>980, +31494=>981, +12043=>982, +20843=>982, +30116=>983, +24052=>984, +25300=>985, +36299=>986, +38774=>987, +25226=>988, +32793=>989, +22365=>990, +38712=>991, +32610=>992, +29240=>993, +12137=>994, +30333=>994, +26575=>995, +30334=>996, +25670=>997, +20336=>998, +36133=>999, +25308=>1000, +31255=>1001, +26001=>1002, +29677=>1003, +25644=>1004, +25203=>1005, +33324=>1006, +39041=>1007, +26495=>1008, +29256=>1009, +25198=>1010, +25292=>1011, +20276=>1012, +29923=>1013, +21322=>1014, +21150=>1015, +32458=>1016, +37030=>1017, +24110=>1018, +26758=>1019, +27036=>1020, +33152=>1021, +32465=>1022, +26834=>1023, +30917=>1024, +34444=>1025, +38225=>1026, +20621=>1027, +35876=>1028, +33502=>1029, +32990=>1030, +21253=>1031, +35090=>1032, +21093=>1033, +34180=>1034, +38649=>1035, +20445=>1036, +22561=>1037, +39281=>1038, +23453=>1039, +25265=>1040, +25253=>1041, +26292=>1042, +35961=>1043, +40077=>1044, +29190=>1045, +26479=>1046, +30865=>1047, +24754=>1048, +21329=>1049, +21271=>1050, +36744=>1051, +32972=>1052, +36125=>1053, +38049=>1054, +20493=>1055, +29384=>1056, +22791=>1057, +24811=>1058, +28953=>1059, +34987=>1060, +22868=>1061, +33519=>1062, +26412=>1063, +31528=>1064, +23849=>1065, +32503=>1066, +29997=>1067, +27893=>1068, +36454=>1069, +36856=>1070, +36924=>1071, +12240=>1072, +40763=>1072, +12112=>1073, +27604=>1073, +37145=>1074, +31508=>1075, +24444=>1076, +30887=>1077, +34006=>1078, +34109=>1079, +27605=>1080, +27609=>1081, +27606=>1082, +24065=>1083, +24199=>1084, +30201=>1085, +38381=>1086, +25949=>1087, +24330=>1088, +24517=>1089, +36767=>1090, +22721=>1091, +33218=>1092, +36991=>1093, +38491=>1094, +38829=>1095, +36793=>1096, +32534=>1097, +36140=>1098, +25153=>1099, +20415=>1100, +21464=>1101, +21342=>1102, +36776=>1103, +36777=>1104, +36779=>1105, +36941=>1106, +26631=>1107, +24426=>1108, +33176=>1109, +34920=>1110, +40150=>1111, +24971=>1112, +21035=>1113, +30250=>1114, +24428=>1115, +25996=>1116, +28626=>1117, +28392=>1118, +23486=>1119, +25672=>1120, +20853=>1121, +20912=>1122, +26564=>1123, +19993=>1124, +31177=>1125, +39292=>1126, +28851=>1127, +30149=>1128, +24182=>1129, +29627=>1130, +33760=>1131, +25773=>1132, +25320=>1133, +38069=>1134, +27874=>1135, +21338=>1136, +21187=>1137, +25615=>1138, +38082=>1139, +31636=>1140, +20271=>1141, +24091=>1142, +33334=>1143, +33046=>1144, +33162=>1145, +28196=>1146, +27850=>1147, +39539=>1148, +25429=>1149, +12056=>1150, +21340=>1150, +21754=>1151, +34917=>1152, +22496=>1153, +19981=>1154, +24067=>1155, +27493=>1156, +31807=>1157, +37096=>1158, +24598=>1159, +25830=>1160, +29468=>1161, +35009=>1162, +26448=>1163, +25165=>1164, +36130=>1165, +30572=>1166, +36393=>1167, +37319=>1168, +24425=>1169, +33756=>1170, +34081=>1171, +39184=>1172, +21442=>1173, +34453=>1174, +27531=>1175, +24813=>1176, +24808=>1177, +28799=>1178, +33485=>1179, +33329=>1180, +20179=>1181, +27815=>1182, +34255=>1183, +25805=>1184, +31961=>1185, +27133=>1186, +26361=>1187, +33609=>1188, +21397=>1189, +31574=>1190, +20391=>1191, +20876=>1192, +27979=>1193, +23618=>1194, +36461=>1195, +25554=>1196, +21449=>1197, +33580=>1198, +33590=>1199, +26597=>1200, +30900=>1201, +25661=>1202, +23519=>1203, +23700=>1204, +24046=>1205, +35815=>1206, +25286=>1207, +26612=>1208, +35962=>1209, +25600=>1210, +25530=>1211, +34633=>1212, +39307=>1213, +35863=>1214, +32544=>1215, +38130=>1216, +20135=>1217, +38416=>1218, +39076=>1219, +26124=>1220, +29462=>1221, +22330=>1222, +23581=>1223, +24120=>1224, +38271=>1225, +20607=>1226, +32928=>1227, +12058=>1228, +21378=>1228, +25950=>1229, +30021=>1230, +21809=>1231, +20513=>1232, +36229=>1233, +25220=>1234, +38046=>1235, +26397=>1236, +22066=>1237, +28526=>1238, +24034=>1239, +21557=>1240, +28818=>1241, +36710=>1242, +25199=>1243, +25764=>1244, +25507=>1245, +24443=>1246, +28552=>1247, +37108=>1248, +12162=>1249, +33251=>1249, +12192=>1250, +36784=>1250, +23576=>1251, +26216=>1252, +24561=>1253, +27785=>1254, +38472=>1255, +36225=>1256, +34924=>1257, +25745=>1258, +31216=>1259, +22478=>1260, +27225=>1261, +25104=>1262, +21576=>1263, +20056=>1264, +31243=>1265, +24809=>1266, +28548=>1267, +35802=>1268, +25215=>1269, +36894=>1270, +39563=>1271, +31204=>1272, +21507=>1273, +30196=>1274, +25345=>1275, +21273=>1276, +27744=>1277, +36831=>1278, +24347=>1279, +39536=>1280, +32827=>1281, +40831=>1282, +20360=>1283, +23610=>1284, +12186=>1285, +36196=>1285, +32709=>1286, +26021=>1287, +28861=>1288, +20805=>1289, +20914=>1290, +12173=>1291, +34411=>1291, +23815=>1292, +23456=>1293, +25277=>1294, +37228=>1295, +30068=>1296, +36364=>1297, +31264=>1298, +24833=>1299, +31609=>1300, +20167=>1301, +32504=>1302, +30597=>1303, +19985=>1304, +33261=>1305, +21021=>1306, +20986=>1307, +27249=>1308, +21416=>1309, +36487=>1310, +38148=>1311, +38607=>1312, +28353=>1313, +38500=>1314, +26970=>1315, +30784=>1316, +20648=>1317, +30679=>1318, +25616=>1319, +35302=>1320, +22788=>1321, +25571=>1322, +24029=>1323, +31359=>1324, +26941=>1325, +20256=>1326, +33337=>1327, +21912=>1328, +20018=>1329, +30126=>1330, +31383=>1331, +24162=>1332, +24202=>1333, +38383=>1334, +21019=>1335, +21561=>1336, +28810=>1337, +25462=>1338, +38180=>1339, +22402=>1340, +26149=>1341, +26943=>1342, +37255=>1343, +21767=>1344, +28147=>1345, +32431=>1346, +34850=>1347, +25139=>1348, +32496=>1349, +30133=>1350, +33576=>1351, +30913=>1352, +38604=>1353, +36766=>1354, +24904=>1355, +29943=>1356, +35789=>1357, +27492=>1358, +21050=>1359, +36176=>1360, +27425=>1361, +32874=>1362, +33905=>1363, +22257=>1364, +21254=>1365, +20174=>1366, +19995=>1367, +20945=>1368, +31895=>1369, +37259=>1370, +31751=>1371, +20419=>1372, +36479=>1373, +31713=>1374, +31388=>1375, +25703=>1376, +23828=>1377, +20652=>1378, +33030=>1379, +30209=>1380, +31929=>1381, +28140=>1382, +32736=>1383, +26449=>1384, +23384=>1385, +12072=>1386, +23544=>1386, +30923=>1387, +25774=>1388, +25619=>1389, +25514=>1390, +25387=>1391, +38169=>1392, +25645=>1393, +36798=>1394, +31572=>1395, +30249=>1396, +25171=>1397, +12068=>1398, +22823=>1398, +21574=>1399, +12109=>1400, +27513=>1400, +20643=>1401, +25140=>1402, +24102=>1403, +27526=>1404, +20195=>1405, +36151=>1406, +34955=>1407, +24453=>1408, +36910=>1409, +24608=>1410, +32829=>1411, +25285=>1412, +20025=>1413, +21333=>1414, +37112=>1415, +25528=>1416, +32966=>1417, +26086=>1418, +27694=>1419, +20294=>1420, +24814=>1421, +28129=>1422, +35806=>1423, +24377=>1424, +34507=>1425, +24403=>1426, +25377=>1427, +20826=>1428, +33633=>1429, +26723=>1430, +12049=>1431, +20992=>1431, +25443=>1432, +36424=>1433, +20498=>1434, +23707=>1435, +31095=>1436, +23548=>1437, +21040=>1438, +31291=>1439, +24764=>1440, +36947=>1441, +30423=>1442, +24503=>1443, +24471=>1444, +30340=>1445, +36460=>1446, +28783=>1447, +30331=>1448, +31561=>1449, +30634=>1450, +20979=>1451, +37011=>1452, +22564=>1453, +20302=>1454, +28404=>1455, +36842=>1456, +25932=>1457, +31515=>1458, +29380=>1459, +28068=>1460, +32735=>1461, +23265=>1462, +25269=>1463, +24213=>1464, +22320=>1465, +33922=>1466, +31532=>1467, +24093=>1468, +24351=>1469, +36882=>1470, +32532=>1471, +39072=>1472, +25474=>1473, +28359=>1474, +30872=>1475, +28857=>1476, +20856=>1477, +38747=>1478, +22443=>1479, +30005=>1480, +20291=>1481, +30008=>1482, +24215=>1483, +24806=>1484, +22880=>1485, +28096=>1486, +27583=>1487, +30857=>1488, +21500=>1489, +38613=>1490, +20939=>1491, +20993=>1492, +25481=>1493, +21514=>1494, +38035=>1495, +35843=>1496, +36300=>1497, +29241=>1498, +30879=>1499, +34678=>1500, +36845=>1501, +35853=>1502, +21472=>1503, +19969=>1504, +30447=>1505, +21486=>1506, +38025=>1507, +39030=>1508, +12237=>1509, +40718=>1509, +38189=>1510, +23450=>1511, +35746=>1512, +20002=>1513, +19996=>1514, +20908=>1515, +33891=>1516, +25026=>1517, +21160=>1518, +26635=>1519, +20375=>1520, +24683=>1521, +20923=>1522, +27934=>1523, +20828=>1524, +25238=>1525, +12099=>1526, +26007=>1526, +38497=>1527, +12182=>1528, +35910=>1528, +36887=>1529, +30168=>1530, +37117=>1531, +30563=>1532, +27602=>1533, +29322=>1534, +29420=>1535, +35835=>1536, +22581=>1537, +30585=>1538, +36172=>1539, +26460=>1540, +38208=>1541, +32922=>1542, +24230=>1543, +28193=>1544, +22930=>1545, +31471=>1546, +30701=>1547, +38203=>1548, +27573=>1549, +26029=>1550, +32526=>1551, +22534=>1552, +20817=>1553, +38431=>1554, +23545=>1555, +22697=>1556, +21544=>1557, +36466=>1558, +25958=>1559, +39039=>1560, +22244=>1561, +38045=>1562, +30462=>1563, +36929=>1564, +25479=>1565, +21702=>1566, +22810=>1567, +22842=>1568, +22427=>1569, +36530=>1570, +26421=>1571, +36346=>1572, +33333=>1573, +21057=>1574, +24816=>1575, +22549=>1576, +34558=>1577, +23784=>1578, +40517=>1579, +20420=>1580, +39069=>1581, +35769=>1582, +23077=>1583, +24694=>1584, +21380=>1585, +25212=>1586, +36943=>1587, +37122=>1588, +39295=>1589, +24681=>1590, +12157=>1591, +32780=>1591, +12041=>1592, +20799=>1592, +12159=>1593, +32819=>1593, +23572=>1594, +39285=>1595, +27953=>1596, +12038=>1597, +20108=>1597, +36144=>1598, +21457=>1599, +32602=>1600, +31567=>1601, +20240=>1602, +20047=>1603, +38400=>1604, +27861=>1605, +29648=>1606, +34281=>1607, +24070=>1608, +30058=>1609, +32763=>1610, +27146=>1611, +30718=>1612, +38034=>1613, +32321=>1614, +20961=>1615, +28902=>1616, +21453=>1617, +36820=>1618, +33539=>1619, +36137=>1620, +29359=>1621, +39277=>1622, +27867=>1623, +22346=>1624, +33459=>1625, +12101=>1626, +26041=>1626, +32938=>1627, +25151=>1628, +38450=>1629, +22952=>1630, +20223=>1631, +35775=>1632, +32442=>1633, +25918=>1634, +33778=>1635, +12206=>1636, +38750=>1636, +21857=>1637, +39134=>1638, +32933=>1639, +21290=>1640, +35837=>1641, +21536=>1642, +32954=>1643, +24223=>1644, +27832=>1645, +36153=>1646, +33452=>1647, +37210=>1648, +21545=>1649, +27675=>1650, +20998=>1651, +32439=>1652, +22367=>1653, +28954=>1654, +27774=>1655, +31881=>1656, +22859=>1657, +20221=>1658, +24575=>1659, +24868=>1660, +31914=>1661, +20016=>1662, +23553=>1663, +26539=>1664, +34562=>1665, +23792=>1666, +38155=>1667, +39118=>1668, +30127=>1669, +28925=>1670, +36898=>1671, +20911=>1672, +32541=>1673, +35773=>1674, +22857=>1675, +20964=>1676, +20315=>1677, +21542=>1678, +22827=>1679, +25975=>1680, +32932=>1681, +23413=>1682, +25206=>1683, +25282=>1684, +36752=>1685, +24133=>1686, +27679=>1687, +31526=>1688, +20239=>1689, +20440=>1690, +26381=>1691, +28014=>1692, +28074=>1693, +31119=>1694, +34993=>1695, +24343=>1696, +29995=>1697, +25242=>1698, +36741=>1699, +20463=>1700, +37340=>1701, +26023=>1702, +33071=>1703, +33105=>1704, +24220=>1705, +33104=>1706, +36212=>1707, +21103=>1708, +35206=>1709, +36171=>1710, +22797=>1711, +20613=>1712, +20184=>1713, +12201=>1714, +38428=>1714, +12119=>1715, +29238=>1715, +33145=>1716, +36127=>1717, +23500=>1718, +35747=>1719, +38468=>1720, +22919=>1721, +32538=>1722, +21648=>1723, +22134=>1724, +22030=>1725, +35813=>1726, +25913=>1727, +27010=>1728, +38041=>1729, +30422=>1730, +28297=>1731, +12082=>1732, +24178=>1732, +12130=>1733, +29976=>1733, +26438=>1734, +26577=>1735, +31487=>1736, +32925=>1737, +36214=>1738, +24863=>1739, +31174=>1740, +25954=>1741, +36195=>1742, +20872=>1743, +21018=>1744, +38050=>1745, +32568=>1746, +32923=>1747, +32434=>1748, +23703=>1749, +28207=>1750, +26464=>1751, +31705=>1752, +30347=>1753, +12220=>1754, +39640=>1754, +33167=>1755, +32660=>1756, +31957=>1757, +25630=>1758, +38224=>1759, +31295=>1760, +21578=>1761, +21733=>1762, +27468=>1763, +25601=>1764, +12093=>1765, +25096=>1765, +40509=>1766, +33011=>1767, +30105=>1768, +21106=>1769, +12208=>1770, +38761=>1770, +33883=>1771, +26684=>1772, +34532=>1773, +38401=>1774, +38548=>1775, +38124=>1776, +20010=>1777, +21508=>1778, +32473=>1779, +26681=>1780, +36319=>1781, +32789=>1782, +26356=>1783, +24218=>1784, +32697=>1785, +22466=>1786, +32831=>1787, +26775=>1788, +12079=>1789, +24037=>1789, +25915=>1790, +21151=>1791, +24685=>1792, +40858=>1793, +20379=>1794, +36524=>1795, +20844=>1796, +23467=>1797, +12088=>1798, +24339=>1798, +24041=>1799, +27742=>1800, +25329=>1801, +36129=>1802, +20849=>1803, +38057=>1804, +21246=>1805, +27807=>1806, +33503=>1807, +29399=>1808, +22434=>1809, +26500=>1810, +36141=>1811, +22815=>1812, +36764=>1813, +33735=>1814, +21653=>1815, +31629=>1816, +20272=>1817, +27837=>1818, +23396=>1819, +22993=>1820, +12238=>1821, +40723=>1821, +21476=>1822, +34506=>1823, +12219=>1824, +39592=>1824, +12181=>1825, +35895=>1825, +32929=>1826, +25925=>1827, +39038=>1828, +22266=>1829, +38599=>1830, +21038=>1831, +12128=>1832, +29916=>1832, +21072=>1833, +23521=>1834, +25346=>1835, +35074=>1836, +20054=>1837, +25296=>1838, +24618=>1839, +26874=>1840, +20851=>1841, +23448=>1842, +20896=>1843, +35266=>1844, +31649=>1845, +39302=>1846, +32592=>1847, +24815=>1848, +28748=>1849, +36143=>1850, +20809=>1851, +12084=>1852, +24191=>1852, +36891=>1853, +29808=>1854, +35268=>1855, +22317=>1856, +30789=>1857, +24402=>1858, +40863=>1859, +38394=>1860, +36712=>1861, +12225=>1862, +39740=>1862, +35809=>1863, +30328=>1864, +26690=>1865, +26588=>1866, +36330=>1867, +36149=>1868, +21053=>1869, +36746=>1870, +28378=>1871, +26829=>1872, +38149=>1873, +37101=>1874, +22269=>1875, +26524=>1876, +35065=>1877, +36807=>1878, +21704=>1879, +39608=>1880, +23401=>1881, +28023=>1882, +27686=>1883, +20133=>1884, +23475=>1885, +39559=>1886, +37219=>1887, +25000=>1888, +37039=>1889, +38889=>1890, +21547=>1891, +28085=>1892, +23506=>1893, +20989=>1894, +21898=>1895, +32597=>1896, +32752=>1897, +25788=>1898, +25421=>1899, +26097=>1900, +25022=>1901, +24717=>1902, +28938=>1903, +27735=>1904, +27721=>1905, +22831=>1906, +26477=>1907, +33322=>1908, +22741=>1909, +22158=>1910, +35946=>1911, +27627=>1912, +37085=>1913, +22909=>1914, +32791=>1915, +21495=>1916, +28009=>1917, +21621=>1918, +21917=>1919, +33655=>1920, +33743=>1921, +26680=>1922, +12146=>1923, +31166=>1923, +21644=>1924, +20309=>1925, +21512=>1926, +30418=>1927, +35977=>1928, +38402=>1929, +27827=>1930, +28088=>1931, +36203=>1932, +35088=>1933, +40548=>1934, +36154=>1935, +22079=>1936, +12234=>1937, +40657=>1937, +30165=>1938, +24456=>1939, +29408=>1940, +24680=>1941, +21756=>1942, +20136=>1943, +27178=>1944, +34913=>1945, +24658=>1946, +36720=>1947, +21700=>1948, +28888=>1949, +34425=>1950, +40511=>1951, +27946=>1952, +23439=>1953, +24344=>1954, +32418=>1955, +21897=>1956, +20399=>1957, +29492=>1958, +21564=>1959, +21402=>1960, +20505=>1961, +21518=>1962, +21628=>1963, +20046=>1964, +24573=>1965, +29786=>1966, +22774=>1967, +33899=>1968, +32993=>1969, +34676=>1970, +29392=>1971, +31946=>1972, +28246=>1973, +24359=>1974, +34382=>1975, +21804=>1976, +25252=>1977, +20114=>1978, +27818=>1979, +25143=>1980, +33457=>1981, +21719=>1982, +21326=>1983, +29502=>1984, +28369=>1985, +30011=>1986, +21010=>1987, +21270=>1988, +35805=>1989, +27088=>1990, +24458=>1991, +24576=>1992, +28142=>1993, +22351=>1994, +27426=>1995, +29615=>1996, +26707=>1997, +36824=>1998, +32531=>1999, +25442=>2000, +24739=>2001, +21796=>2002, +30186=>2003, +35938=>2004, +28949=>2005, +28067=>2006, +23462=>2007, +24187=>2008, +33618=>2009, +24908=>2010, +40644=>2011, +30970=>2012, +34647=>2013, +31783=>2014, +30343=>2015, +20976=>2016, +24822=>2017, +29004=>2018, +26179=>2019, +24140=>2020, +24653=>2021, +35854=>2022, +28784=>2023, +25381=>2024, +36745=>2025, +24509=>2026, +24674=>2027, +34516=>2028, +22238=>2029, +27585=>2030, +24724=>2031, +24935=>2032, +21321=>2033, +24800=>2034, +26214=>2035, +36159=>2036, +31229=>2037, +20250=>2038, +28905=>2039, +27719=>2040, +35763=>2041, +35826=>2042, +32472=>2043, +33636=>2044, +26127=>2045, +23130=>2046, +39746=>2047, +27985=>2048, +28151=>2049, +35905=>2050, +27963=>2051, +20249=>2052, +12117=>2053, +28779=>2053, +33719=>2054, +25110=>2055, +24785=>2056, +38669=>2057, +36135=>2058, +31096=>2059, +20987=>2060, +22334=>2061, +22522=>2062, +26426=>2063, +30072=>2064, +31293=>2065, +31215=>2066, +31637=>2067, +32908=>2068, +39269=>2069, +36857=>2070, +28608=>2071, +35749=>2072, +40481=>2073, +23020=>2074, +32489=>2075, +32521=>2076, +21513=>2077, +26497=>2078, +26840=>2079, +36753=>2080, +31821=>2081, +38598=>2082, +21450=>2083, +24613=>2084, +30142=>2085, +27762=>2086, +21363=>2087, +23241=>2088, +32423=>2089, +25380=>2090, +12047=>2091, +20960=>2091, +33034=>2092, +12080=>2093, +24049=>2093, +34015=>2094, +25216=>2095, +20864=>2096, +23395=>2097, +20238=>2098, +31085=>2099, +21058=>2100, +24760=>2101, +27982=>2102, +23492=>2103, +23490=>2104, +35745=>2105, +35760=>2106, +26082=>2107, +24524=>2108, +38469=>2109, +22931=>2110, +32487=>2111, +32426=>2112, +22025=>2113, +26551=>2114, +22841=>2115, +20339=>2116, +23478=>2117, +21152=>2118, +33626=>2119, +39050=>2120, +36158=>2121, +30002=>2122, +38078=>2123, +20551=>2124, +31292=>2125, +20215=>2126, +26550=>2127, +39550=>2128, +23233=>2129, +27516=>2130, +30417=>2131, +22362=>2132, +23574=>2133, +31546=>2134, +38388=>2135, +29006=>2136, +20860=>2137, +32937=>2138, +33392=>2139, +22904=>2140, +32516=>2141, +33575=>2142, +26816=>2143, +26604=>2144, +30897=>2145, +30839=>2146, +25315=>2147, +25441=>2148, +31616=>2149, +20461=>2150, +21098=>2151, +20943=>2152, +33616=>2153, +27099=>2154, +37492=>2155, +36341=>2156, +36145=>2157, +35265=>2158, +38190=>2159, +31661=>2160, +20214=>2161, +20581=>2162, +33328=>2163, +21073=>2164, +39279=>2165, +28176=>2166, +28293=>2167, +28071=>2168, +24314=>2169, +20725=>2170, +23004=>2171, +23558=>2172, +27974=>2173, +27743=>2174, +30086=>2175, +33931=>2176, +26728=>2177, +22870=>2178, +35762=>2179, +21280=>2180, +37233=>2181, +38477=>2182, +34121=>2183, +26898=>2184, +30977=>2185, +28966=>2186, +33014=>2187, +20132=>2188, +37066=>2189, +27975=>2190, +39556=>2191, +23047=>2192, +22204=>2193, +25605=>2194, +38128=>2195, +30699=>2196, +20389=>2197, +33050=>2198, +29409=>2199, +12179=>2200, +35282=>2200, +39290=>2201, +32564=>2202, +32478=>2203, +21119=>2204, +25945=>2205, +37237=>2206, +36735=>2207, +36739=>2208, +21483=>2209, +31382=>2210, +25581=>2211, +25509=>2212, +30342=>2213, +31224=>2214, +34903=>2215, +38454=>2216, +25130=>2217, +21163=>2218, +33410=>2219, +26708=>2220, +26480=>2221, +25463=>2222, +30571=>2223, +31469=>2224, +27905=>2225, +32467=>2226, +35299=>2227, +22992=>2228, +25106=>2229, +34249=>2230, +33445=>2231, +30028=>2232, +20511=>2233, +20171=>2234, +30117=>2235, +35819=>2236, +23626=>2237, +12081=>2238, +24062=>2238, +31563=>2239, +12100=>2240, +26020=>2240, +12198=>2241, +37329=>2241, +20170=>2242, +27941=>2243, +35167=>2244, +32039=>2245, +38182=>2246, +20165=>2247, +35880=>2248, +36827=>2249, +38771=>2250, +26187=>2251, +31105=>2252, +36817=>2253, +28908=>2254, +28024=>2255, +23613=>2256, +21170=>2257, +33606=>2258, +20834=>2259, +33550=>2260, +30555=>2261, +26230=>2262, +40120=>2263, +20140=>2264, +24778=>2265, +31934=>2266, +31923=>2267, +32463=>2268, +20117=>2269, +35686=>2270, +26223=>2271, +39048=>2272, +38745=>2273, +22659=>2274, +25964=>2275, +38236=>2276, +24452=>2277, +30153=>2278, +38742=>2279, +31455=>2280, +31454=>2281, +20928=>2282, +28847=>2283, +31384=>2284, +25578=>2285, +31350=>2286, +32416=>2287, +29590=>2288, +12210=>2289, +38893=>2289, +20037=>2290, +28792=>2291, +20061=>2292, +37202=>2293, +21417=>2294, +25937=>2295, +26087=>2296, +12165=>2297, +33276=>2297, +33285=>2298, +21646=>2299, +23601=>2300, +30106=>2301, +38816=>2302, +25304=>2303, +29401=>2304, +30141=>2305, +23621=>2306, +39545=>2307, +33738=>2308, +23616=>2309, +21632=>2310, +30697=>2311, +20030=>2312, +27822=>2313, +32858=>2314, +25298=>2315, +25454=>2316, +24040=>2317, +20855=>2318, +36317=>2319, +36382=>2320, +38191=>2321, +20465=>2322, +21477=>2323, +24807=>2324, +28844=>2325, +21095=>2326, +25424=>2327, +40515=>2328, +23071=>2329, +20518=>2330, +30519=>2331, +21367=>2332, +32482=>2333, +25733=>2334, +25899=>2335, +25225=>2336, +25496=>2337, +20500=>2338, +29237=>2339, +35273=>2340, +20915=>2341, +35776=>2342, +32477=>2343, +22343=>2344, +33740=>2345, +38055=>2346, +20891=>2347, +21531=>2348, +23803=>2349, +20426=>2350, +31459=>2351, +27994=>2352, +37089=>2353, +39567=>2354, +21888=>2355, +21654=>2356, +21345=>2357, +21679=>2358, +24320=>2359, +25577=>2360, +26999=>2361, +20975=>2362, +24936=>2363, +21002=>2364, +22570=>2365, +21208=>2366, +22350=>2367, +30733=>2368, +30475=>2369, +24247=>2370, +24951=>2371, +31968=>2372, +25179=>2373, +25239=>2374, +20130=>2375, +28821=>2376, +32771=>2377, +25335=>2378, +28900=>2379, +38752=>2380, +22391=>2381, +33499=>2382, +26607=>2383, +26869=>2384, +30933=>2385, +39063=>2386, +31185=>2387, +22771=>2388, +21683=>2389, +21487=>2390, +28212=>2391, +20811=>2392, +21051=>2393, +23458=>2394, +35838=>2395, +32943=>2396, +21827=>2397, +22438=>2398, +24691=>2399, +22353=>2400, +21549=>2401, +31354=>2402, +24656=>2403, +23380=>2404, +25511=>2405, +25248=>2406, +12061=>2407, +21475=>2407, +25187=>2408, +23495=>2409, +26543=>2410, +21741=>2411, +31391=>2412, +33510=>2413, +37239=>2414, +24211=>2415, +35044=>2416, +22840=>2417, +22446=>2418, +25358=>2419, +36328=>2420, +33007=>2421, +22359=>2422, +31607=>2423, +20393=>2424, +24555=>2425, +23485=>2426, +27454=>2427, +21281=>2428, +31568=>2429, +29378=>2430, +26694=>2431, +30719=>2432, +30518=>2433, +26103=>2434, +20917=>2435, +20111=>2436, +30420=>2437, +23743=>2438, +31397=>2439, +33909=>2440, +22862=>2441, +39745=>2442, +20608=>2443, +39304=>2444, +24871=>2445, +28291=>2446, +22372=>2447, +26118=>2448, +25414=>2449, +22256=>2450, +25324=>2451, +25193=>2452, +24275=>2453, +38420=>2454, +22403=>2455, +25289=>2456, +21895=>2457, +34593=>2458, +33098=>2459, +36771=>2460, +21862=>2461, +33713=>2462, +26469=>2463, +36182=>2464, +34013=>2465, +23146=>2466, +26639=>2467, +25318=>2468, +31726=>2469, +38417=>2470, +20848=>2471, +28572=>2472, +35888=>2473, +25597=>2474, +35272=>2475, +25042=>2476, +32518=>2477, +28866=>2478, +28389=>2479, +29701=>2480, +27028=>2481, +29436=>2482, +24266=>2483, +37070=>2484, +26391=>2485, +28010=>2486, +25438=>2487, +21171=>2488, +29282=>2489, +12156=>2490, +32769=>2490, +20332=>2491, +23013=>2492, +37226=>2493, +28889=>2494, +28061=>2495, +21202=>2496, +20048=>2497, +38647=>2498, +38253=>2499, +34174=>2500, +30922=>2501, +32047=>2502, +20769=>2503, +22418=>2504, +25794=>2505, +32907=>2506, +31867=>2507, +27882=>2508, +26865=>2509, +26974=>2510, +20919=>2511, +21400=>2512, +26792=>2513, +29313=>2514, +40654=>2515, +31729=>2516, +29432=>2517, +31163=>2518, +28435=>2519, +29702=>2520, +26446=>2521, +12197=>2522, +37324=>2522, +40100=>2523, +31036=>2524, +33673=>2525, +33620=>2526, +21519=>2527, +26647=>2528, +20029=>2529, +21385=>2530, +21169=>2531, +30782=>2532, +21382=>2533, +21033=>2534, +20616=>2535, +20363=>2536, +20432=>2537, +30178=>2538, +12148=>2539, +31435=>2539, +31890=>2540, +27813=>2541, +12202=>2542, +38582=>2542, +12050=>2543, +21147=>2543, +29827=>2544, +21737=>2545, +20457=>2546, +32852=>2547, +33714=>2548, +36830=>2549, +38256=>2550, +24265=>2551, +24604=>2552, +28063=>2553, +24088=>2554, +25947=>2555, +33080=>2556, +38142=>2557, +24651=>2558, +28860=>2559, +32451=>2560, +31918=>2561, +20937=>2562, +63865=>2562, +26753=>2563, +31921=>2564, +33391=>2565, +20004=>2566, +36742=>2567, +37327=>2568, +26238=>2569, +20142=>2570, +35845=>2571, +25769=>2572, +32842=>2573, +20698=>2574, +30103=>2575, +29134=>2576, +23525=>2577, +36797=>2578, +28518=>2579, +20102=>2580, +25730=>2581, +38243=>2582, +24278=>2583, +26009=>2584, +21015=>2585, +35010=>2586, +28872=>2587, +21155=>2588, +29454=>2589, +29747=>2590, +26519=>2591, +30967=>2592, +38678=>2593, +20020=>2594, +37051=>2595, +40158=>2596, +28107=>2597, +20955=>2598, +36161=>2599, +21533=>2600, +25294=>2601, +29618=>2602, +33777=>2603, +38646=>2604, +40836=>2605, +38083=>2606, +20278=>2607, +32666=>2608, +20940=>2609, +28789=>2610, +38517=>2611, +23725=>2612, +39046=>2613, +21478=>2614, +20196=>2615, +28316=>2616, +29705=>2617, +27060=>2618, +30827=>2619, +39311=>2620, +30041=>2621, +21016=>2622, +30244=>2623, +27969=>2624, +26611=>2625, +20845=>2626, +40857=>2627, +32843=>2628, +21657=>2629, +31548=>2630, +31423=>2631, +38534=>2632, +22404=>2633, +25314=>2634, +38471=>2635, +27004=>2636, +23044=>2637, +25602=>2638, +31699=>2639, +28431=>2640, +38475=>2641, +33446=>2642, +21346=>2643, +39045=>2644, +24208=>2645, +28809=>2646, +25523=>2647, +21348=>2648, +34383=>2649, +40065=>2650, +40595=>2651, +30860=>2652, +38706=>2653, +36335=>2654, +36162=>2655, +12229=>2656, +40575=>2656, +28510=>2657, +31108=>2658, +24405=>2659, +38470=>2660, +25134=>2661, +39540=>2662, +21525=>2663, +38109=>2664, +20387=>2665, +26053=>2666, +23653=>2667, +23649=>2668, +32533=>2669, +34385=>2670, +27695=>2671, +24459=>2672, +29575=>2673, +28388=>2674, +32511=>2675, +23782=>2676, +25371=>2677, +23402=>2678, +28390=>2679, +21365=>2680, +20081=>2681, +25504=>2682, +30053=>2683, +25249=>2684, +36718=>2685, +20262=>2686, +20177=>2687, +27814=>2688, +32438=>2689, +35770=>2690, +33821=>2691, +34746=>2692, +32599=>2693, +36923=>2694, +38179=>2695, +31657=>2696, +39585=>2697, +35064=>2698, +33853=>2699, +27931=>2700, +39558=>2701, +32476=>2702, +22920=>2703, +12231=>2704, +40635=>2704, +29595=>2705, +30721=>2706, +34434=>2707, +39532=>2708, +39554=>2709, +22043=>2710, +21527=>2711, +22475=>2712, +20080=>2713, +40614=>2714, +21334=>2715, +36808=>2716, +33033=>2717, +30610=>2718, +39314=>2719, +34542=>2720, +28385=>2721, +34067=>2722, +26364=>2723, +24930=>2724, +28459=>2725, +35881=>2726, +33426=>2727, +33579=>2728, +30450=>2729, +27667=>2730, +24537=>2731, +33725=>2732, +29483=>2733, +33541=>2734, +38170=>2735, +12113=>2736, +27611=>2736, +12141=>2737, +30683=>2737, +38086=>2738, +21359=>2739, +33538=>2740, +20882=>2741, +24125=>2742, +35980=>2743, +36152=>2744, +20040=>2745, +29611=>2746, +26522=>2747, +26757=>2748, +37238=>2749, +38665=>2750, +29028=>2751, +27809=>2752, +30473=>2753, +23186=>2754, +38209=>2755, +27599=>2756, +32654=>2757, +26151=>2758, +23504=>2759, +22969=>2760, +23194=>2761, +38376=>2762, +38391=>2763, +20204=>2764, +33804=>2765, +33945=>2766, +27308=>2767, +30431=>2768, +38192=>2769, +29467=>2770, +26790=>2771, +23391=>2772, +30511=>2773, +37274=>2774, +38753=>2775, +31964=>2776, +36855=>2777, +35868=>2778, +24357=>2779, +12150=>2780, +31859=>2780, +31192=>2781, +35269=>2782, +27852=>2783, +34588=>2784, +23494=>2785, +24130=>2786, +26825=>2787, +30496=>2788, +32501=>2789, +20885=>2790, +20813=>2791, +21193=>2792, +23081=>2793, +32517=>2794, +12207=>2795, +38754=>2795, +33495=>2796, +25551=>2797, +30596=>2798, +34256=>2799, +31186=>2800, +28218=>2801, +24217=>2802, +22937=>2803, +34065=>2804, +28781=>2805, +27665=>2806, +25279=>2807, +12139=>2808, +30399=>2808, +25935=>2809, +24751=>2810, +38397=>2811, +26126=>2812, +34719=>2813, +40483=>2814, +38125=>2815, +21517=>2816, +21629=>2817, +35884=>2818, +25720=>2819, +25721=>2820, +34321=>2821, +27169=>2822, +33180=>2823, +30952=>2824, +25705=>2825, +39764=>2826, +25273=>2827, +26411=>2828, +33707=>2829, +22696=>2830, +40664=>2831, +27819=>2832, +28448=>2833, +23518=>2834, +38476=>2835, +35851=>2836, +29279=>2837, +26576=>2838, +25287=>2839, +29281=>2840, +20137=>2841, +22982=>2842, +27597=>2843, +22675=>2844, +26286=>2845, +24149=>2846, +21215=>2847, +24917=>2848, +12106=>2849, +26408=>2849, +12140=>2850, +30446=>2850, +30566=>2851, +29287=>2852, +31302=>2853, +25343=>2854, +21738=>2855, +21584=>2856, +38048=>2857, +37027=>2858, +23068=>2859, +32435=>2860, +27670=>2861, +20035=>2862, +22902=>2863, +32784=>2864, +22856=>2865, +21335=>2866, +30007=>2867, +38590=>2868, +22218=>2869, +25376=>2870, +33041=>2871, +24700=>2872, +38393=>2873, +28118=>2874, +21602=>2875, +39297=>2876, +20869=>2877, +23273=>2878, +33021=>2879, +22958=>2880, +38675=>2881, +20522=>2882, +27877=>2883, +23612=>2884, +25311=>2885, +20320=>2886, +21311=>2887, +33147=>2888, +36870=>2889, +28346=>2890, +34091=>2891, +25288=>2892, +24180=>2893, +30910=>2894, +25781=>2895, +25467=>2896, +24565=>2897, +23064=>2898, +37247=>2899, +40479=>2900, +23615=>2901, +25423=>2902, +32834=>2903, +23421=>2904, +21870=>2905, +38218=>2906, +38221=>2907, +28037=>2908, +24744=>2909, +26592=>2910, +29406=>2911, +20957=>2912, +23425=>2913, +25319=>2914, +27870=>2915, +12124=>2916, +29275=>2916, +25197=>2917, +38062=>2918, +32445=>2919, +33043=>2920, +27987=>2921, +20892=>2922, +24324=>2923, +22900=>2924, +21162=>2925, +24594=>2926, +12069=>2927, +22899=>2927, +26262=>2928, +34384=>2929, +30111=>2930, +25386=>2931, +25062=>2932, +31983=>2933, +35834=>2934, +21734=>2935, +27431=>2936, +40485=>2937, +27572=>2938, +34261=>2939, +21589=>2940, +20598=>2941, +27812=>2942, +21866=>2943, +36276=>2944, +29228=>2945, +24085=>2946, +24597=>2947, +29750=>2948, +25293=>2949, +25490=>2950, +29260=>2951, +24472=>2952, +28227=>2953, +27966=>2954, +25856=>2955, +28504=>2956, +30424=>2957, +30928=>2958, +30460=>2959, +30036=>2960, +21028=>2961, +21467=>2962, +20051=>2963, +24222=>2964, +26049=>2965, +32810=>2966, +32982=>2967, +25243=>2968, +21638=>2969, +21032=>2970, +28846=>2971, +34957=>2972, +36305=>2973, +27873=>2974, +21624=>2975, +32986=>2976, +22521=>2977, +35060=>2978, +36180=>2979, +38506=>2980, +37197=>2981, +20329=>2982, +27803=>2983, +21943=>2984, +30406=>2985, +30768=>2986, +25256=>2987, +28921=>2988, +28558=>2989, +24429=>2990, +34028=>2991, +26842=>2992, +30844=>2993, +31735=>2994, +33192=>2995, +26379=>2996, +40527=>2997, +25447=>2998, +30896=>2999, +22383=>3000, +30738=>3001, +38713=>3002, +25209=>3003, +25259=>3004, +21128=>3005, +29749=>3006, +27607=>3007, +21860=>3008, +33086=>3009, +30130=>3010, +12138=>3011, +30382=>3011, +21305=>3012, +30174=>3013, +20731=>3014, +23617=>3015, +35692=>3016, +31687=>3017, +20559=>3018, +12122=>3019, +29255=>3019, +39575=>3020, +39128=>3021, +28418=>3022, +29922=>3023, +31080=>3024, +25735=>3025, +30629=>3026, +25340=>3027, +39057=>3028, +36139=>3029, +21697=>3030, +32856=>3031, +20050=>3032, +22378=>3033, +33529=>3034, +33805=>3035, +24179=>3036, +20973=>3037, +29942=>3038, +35780=>3039, +23631=>3040, +22369=>3041, +27900=>3042, +39047=>3043, +23110=>3044, +30772=>3045, +39748=>3046, +36843=>3047, +31893=>3048, +21078=>3049, +25169=>3050, +38138=>3051, +20166=>3052, +33670=>3053, +33889=>3054, +33769=>3055, +33970=>3056, +22484=>3057, +26420=>3058, +22275=>3059, +26222=>3060, +28006=>3061, +35889=>3062, +26333=>3063, +28689=>3064, +26399=>3065, +27450=>3066, +26646=>3067, +25114=>3068, +22971=>3069, +19971=>3070, +20932=>3071, +28422=>3072, +26578=>3073, +27791=>3074, +20854=>3075, +26827=>3076, +22855=>3077, +27495=>3078, +30054=>3079, +23822=>3080, +33040=>3081, +40784=>3082, +26071=>3083, +31048=>3084, +31041=>3085, +39569=>3086, +36215=>3087, +23682=>3088, +20062=>3089, +20225=>3090, +21551=>3091, +22865=>3092, +30732=>3093, +22120=>3094, +12115=>3095, +27668=>3095, +36804=>3096, +24323=>3097, +27773=>3098, +27875=>3099, +35755=>3100, +25488=>3101, +24688=>3102, +27965=>3103, +29301=>3104, +25190=>3105, +38030=>3106, +38085=>3107, +21315=>3108, +36801=>3109, +31614=>3110, +20191=>3111, +35878=>3112, +20094=>3113, +40660=>3114, +38065=>3115, +38067=>3116, +21069=>3117, +28508=>3118, +36963=>3119, +27973=>3120, +35892=>3121, +22545=>3122, +23884=>3123, +12107=>3124, +27424=>3124, +27465=>3125, +26538=>3126, +21595=>3127, +33108=>3128, +32652=>3129, +22681=>3130, +34103=>3131, +24378=>3132, +25250=>3133, +27207=>3134, +38201=>3135, +25970=>3136, +24708=>3137, +26725=>3138, +30631=>3139, +20052=>3140, +20392=>3141, +24039=>3142, +38808=>3143, +25772=>3144, +32728=>3145, +23789=>3146, +20431=>3147, +31373=>3148, +20999=>3149, +33540=>3150, +19988=>3151, +24623=>3152, +31363=>3153, +38054=>3154, +20405=>3155, +20146=>3156, +31206=>3157, +29748=>3158, +21220=>3159, +33465=>3160, +25810=>3161, +31165=>3162, +23517=>3163, +27777=>3164, +38738=>3165, +36731=>3166, +27682=>3167, +20542=>3168, +21375=>3169, +28165=>3170, +25806=>3171, +26228=>3172, +27696=>3173, +24773=>3174, +39031=>3175, +35831=>3176, +24198=>3177, +29756=>3178, +31351=>3179, +31179=>3180, +19992=>3181, +37041=>3182, +29699=>3183, +27714=>3184, +22234=>3185, +37195=>3186, +27845=>3187, +36235=>3188, +21306=>3189, +34502=>3190, +26354=>3191, +36527=>3192, +23624=>3193, +39537=>3194, +28192=>3195, +21462=>3196, +23094=>3197, +40843=>3198, +36259=>3199, +21435=>3200, +22280=>3201, +39079=>3202, +26435=>3203, +37275=>3204, +27849=>3205, +20840=>3206, +30154=>3207, +25331=>3208, +12125=>3209, +29356=>3209, +21048=>3210, +21149=>3211, +32570=>3212, +28820=>3213, +30264=>3214, +21364=>3215, +40522=>3216, +27063=>3217, +30830=>3218, +38592=>3219, +35033=>3220, +32676=>3221, +28982=>3222, +29123=>3223, +20873=>3224, +26579=>3225, +29924=>3226, +22756=>3227, +25880=>3228, +22199=>3229, +35753=>3230, +39286=>3231, +25200=>3232, +32469=>3233, +24825=>3234, +28909=>3235, +22764=>3236, +20161=>3237, +12040=>3238, +20154=>3238, +24525=>3239, +38887=>3240, +20219=>3241, +35748=>3242, +20995=>3243, +22922=>3244, +32427=>3245, +25172=>3246, +20173=>3247, +12103=>3248, +26085=>3248, +25102=>3249, +33592=>3250, +33993=>3251, +33635=>3252, +34701=>3253, +29076=>3254, +28342=>3255, +23481=>3256, +32466=>3257, +20887=>3258, +25545=>3259, +26580=>3260, +12161=>3261, +32905=>3261, +33593=>3262, +34837=>3263, +20754=>3264, +23418=>3265, +22914=>3266, +36785=>3267, +20083=>3268, +27741=>3269, +12042=>3270, +20837=>3270, +35109=>3271, +36719=>3272, +38446=>3273, +34122=>3274, +29790=>3275, +38160=>3276, +38384=>3277, +28070=>3278, +33509=>3279, +24369=>3280, +25746=>3281, +27922=>3282, +33832=>3283, +33134=>3284, +40131=>3285, +22622=>3286, +36187=>3287, +19977=>3288, +21441=>3289, +20254=>3290, +25955=>3291, +26705=>3292, +21971=>3293, +20007=>3294, +25620=>3295, +39578=>3296, +25195=>3297, +23234=>3298, +29791=>3299, +12170=>3300, +33394=>3300, +28073=>3301, +26862=>3302, +20711=>3303, +33678=>3304, +30722=>3305, +26432=>3306, +21049=>3307, +27801=>3308, +32433=>3309, +20667=>3310, +21861=>3311, +29022=>3312, +31579=>3313, +26194=>3314, +29642=>3315, +33515=>3316, +26441=>3317, +12077=>3318, +23665=>3318, +21024=>3319, +29053=>3320, +34923=>3321, +38378=>3322, +38485=>3323, +25797=>3324, +36193=>3325, +33203=>3326, +21892=>3327, +27733=>3328, +25159=>3329, +32558=>3330, +22674=>3331, +20260=>3332, +21830=>3333, +36175=>3334, +26188=>3335, +19978=>3336, +23578=>3337, +35059=>3338, +26786=>3339, +25422=>3340, +31245=>3341, +28903=>3342, +33421=>3343, +21242=>3344, +38902=>3345, +23569=>3346, +21736=>3347, +37045=>3348, +32461=>3349, +22882=>3350, +36170=>3351, +34503=>3352, +12166=>3353, +33292=>3353, +33293=>3354, +36198=>3355, +25668=>3356, +23556=>3357, +24913=>3358, +28041=>3359, +31038=>3360, +35774=>3361, +30775=>3362, +30003=>3363, +21627=>3364, +20280=>3365, +12189=>3366, +36523=>3366, +28145=>3367, +23072=>3368, +32453=>3369, +31070=>3370, +27784=>3371, +23457=>3372, +23158=>3373, +29978=>3374, +32958=>3375, +24910=>3376, +28183=>3377, +22768=>3378, +12131=>3379, +29983=>3379, +29989=>3380, +29298=>3381, +21319=>3382, +32499=>3383, +30465=>3384, +30427=>3385, +21097=>3386, +32988=>3387, +22307=>3388, +24072=>3389, +22833=>3390, +29422=>3391, +26045=>3392, +28287=>3393, +35799=>3394, +12075=>3395, +23608=>3395, +34417=>3396, +12055=>3397, +21313=>3397, +12143=>3398, +30707=>3398, +25342=>3399, +26102=>3400, +20160=>3401, +12215=>3402, +39135=>3402, +34432=>3403, +23454=>3404, +35782=>3405, +21490=>3406, +12142=>3407, +30690=>3407, +20351=>3408, +23630=>3409, +39542=>3410, +22987=>3411, +24335=>3412, +12144=>3413, +31034=>3413, +12064=>3414, +22763=>3414, +19990=>3415, +26623=>3416, +20107=>3417, +25325=>3418, +35475=>3419, +36893=>3420, +21183=>3421, +26159=>3422, +21980=>3423, +22124=>3424, +36866=>3425, +20181=>3426, +20365=>3427, +37322=>3428, +39280=>3429, +12114=>3430, +27663=>3430, +24066=>3431, +24643=>3432, +23460=>3433, +35270=>3434, +35797=>3435, +25910=>3436, +12095=>3437, +25163=>3437, +12216=>3438, +39318=>3438, +23432=>3439, +23551=>3440, +25480=>3441, +21806=>3442, +21463=>3443, +30246=>3444, +20861=>3445, +34092=>3446, +26530=>3447, +26803=>3448, +27530=>3449, +25234=>3450, +36755=>3451, +21460=>3452, +33298=>3453, +28113=>3454, +30095=>3455, +20070=>3456, +36174=>3457, +23408=>3458, +29087=>3459, +34223=>3460, +26257=>3461, +26329=>3462, +32626=>3463, +34560=>3464, +12233=>3465, +40653=>3465, +12239=>3466, +40736=>3466, +23646=>3467, +26415=>3468, +36848=>3469, +26641=>3470, +26463=>3471, +25101=>3472, +31446=>3473, +22661=>3474, +24246=>3475, +25968=>3476, +28465=>3477, +24661=>3478, +21047=>3479, +32781=>3480, +25684=>3481, +34928=>3482, +29993=>3483, +24069=>3484, +26643=>3485, +25332=>3486, +38684=>3487, +21452=>3488, +29245=>3489, +35841=>3490, +12116=>3491, +27700=>3491, +30561=>3492, +31246=>3493, +21550=>3494, +30636=>3495, +39034=>3496, +33308=>3497, +35828=>3498, +30805=>3499, +26388=>3500, +28865=>3501, +26031=>3502, +25749=>3503, +22070=>3504, +24605=>3505, +31169=>3506, +21496=>3507, +19997=>3508, +27515=>3509, +32902=>3510, +23546=>3511, +21987=>3512, +22235=>3513, +20282=>3514, +20284=>3515, +39282=>3516, +24051=>3517, +26494=>3518, +32824=>3519, +24578=>3520, +39042=>3521, +36865=>3522, +23435=>3523, +35772=>3524, +35829=>3525, +25628=>3526, +33368=>3527, +25822=>3528, +22013=>3529, +33487=>3530, +37221=>3531, +20439=>3532, +32032=>3533, +36895=>3534, +31903=>3535, +20723=>3536, +22609=>3537, +28335=>3538, +23487=>3539, +35785=>3540, +32899=>3541, +37240=>3542, +33948=>3543, +31639=>3544, +34429=>3545, +38539=>3546, +38543=>3547, +32485=>3548, +39635=>3549, +30862=>3550, +23681=>3551, +31319=>3552, +36930=>3553, +38567=>3554, +31071=>3555, +23385=>3556, +25439=>3557, +31499=>3558, +34001=>3559, +26797=>3560, +21766=>3561, +32553=>3562, +29712=>3563, +32034=>3564, +38145=>3565, +25152=>3566, +22604=>3567, +20182=>3568, +23427=>3569, +22905=>3570, +22612=>3571, +29549=>3572, +25374=>3573, +36427=>3574, +36367=>3575, +32974=>3576, +33492=>3577, +25260=>3578, +21488=>3579, +27888=>3580, +37214=>3581, +22826=>3582, +24577=>3583, +27760=>3584, +22349=>3585, +25674=>3586, +36138=>3587, +30251=>3588, +28393=>3589, +22363=>3590, +27264=>3591, +30192=>3592, +28525=>3593, +35885=>3594, +35848=>3595, +22374=>3596, +27631=>3597, +34962=>3598, +30899=>3599, +25506=>3600, +21497=>3601, +28845=>3602, +27748=>3603, +22616=>3604, +25642=>3605, +22530=>3606, +26848=>3607, +33179=>3608, +21776=>3609, +31958=>3610, +20504=>3611, +36538=>3612, +28108=>3613, +36255=>3614, +28907=>3615, +25487=>3616, +28059=>3617, +28372=>3618, +32486=>3619, +33796=>3620, +26691=>3621, +36867=>3622, +28120=>3623, +38518=>3624, +35752=>3625, +22871=>3626, +29305=>3627, +34276=>3628, +33150=>3629, +30140=>3630, +35466=>3631, +26799=>3632, +21076=>3633, +36386=>3634, +38161=>3635, +25552=>3636, +39064=>3637, +36420=>3638, +21884=>3639, +20307=>3640, +26367=>3641, +22159=>3642, +24789=>3643, +28053=>3644, +21059=>3645, +23625=>3646, +22825=>3647, +28155=>3648, +22635=>3649, +12133=>3650, +30000=>3650, +29980=>3651, +24684=>3652, +33300=>3653, +33094=>3654, +25361=>3655, +26465=>3656, +36834=>3657, +30522=>3658, +36339=>3659, +36148=>3660, +38081=>3661, +24086=>3662, +21381=>3663, +21548=>3664, +28867=>3665, +27712=>3666, +24311=>3667, +20572=>3668, +20141=>3669, +24237=>3670, +25402=>3671, +33351=>3672, +36890=>3673, +26704=>3674, +37230=>3675, +30643=>3676, +21516=>3677, +38108=>3678, +24420=>3679, +31461=>3680, +26742=>3681, +25413=>3682, +31570=>3683, +32479=>3684, +30171=>3685, +20599=>3686, +25237=>3687, +22836=>3688, +36879=>3689, +20984=>3690, +31171=>3691, +31361=>3692, +22270=>3693, +24466=>3694, +36884=>3695, +28034=>3696, +23648=>3697, +12063=>3698, +22303=>3698, +21520=>3699, +20820=>3700, +28237=>3701, +22242=>3702, +25512=>3703, +39059=>3704, +33151=>3705, +34581=>3706, +35114=>3707, +36864=>3708, +21534=>3709, +23663=>3710, +33216=>3711, +25302=>3712, +25176=>3713, +33073=>3714, +40501=>3715, +38464=>3716, +39534=>3717, +39548=>3718, +26925=>3719, +22949=>3720, +25299=>3721, +21822=>3722, +25366=>3723, +21703=>3724, +34521=>3725, +27964=>3726, +23043=>3727, +12129=>3728, +29926=>3728, +34972=>3729, +27498=>3730, +22806=>3731, +35916=>3732, +24367=>3733, +28286=>3734, +29609=>3735, +39037=>3736, +20024=>3737, +28919=>3738, +23436=>3739, +30871=>3740, +25405=>3741, +26202=>3742, +30358=>3743, +24779=>3744, +23451=>3745, +23113=>3746, +19975=>3747, +33109=>3748, +27754=>3749, +29579=>3750, +20129=>3751, +26505=>3752, +12153=>3753, +32593=>3753, +24448=>3754, +26106=>3755, +26395=>3756, +24536=>3757, +22916=>3758, +23041=>3759, +24013=>3760, +24494=>3761, +21361=>3762, +38886=>3763, +36829=>3764, +26693=>3765, +22260=>3766, +21807=>3767, +24799=>3768, +20026=>3769, +28493=>3770, +32500=>3771, +33479=>3772, +33806=>3773, +22996=>3774, +20255=>3775, +20266=>3776, +23614=>3777, +32428=>3778, +26410=>3779, +34074=>3780, +21619=>3781, +30031=>3782, +32963=>3783, +21890=>3784, +39759=>3785, +20301=>3786, +28205=>3787, +35859=>3788, +23561=>3789, +24944=>3790, +21355=>3791, +30239=>3792, +28201=>3793, +34442=>3794, +12098=>3795, +25991=>3795, +38395=>3796, +32441=>3797, +21563=>3798, +31283=>3799, +32010=>3800, +38382=>3801, +21985=>3802, +32705=>3803, +29934=>3804, +25373=>3805, +34583=>3806, +28065=>3807, +31389=>3808, +25105=>3809, +26017=>3810, +21351=>3811, +25569=>3812, +27779=>3813, +24043=>3814, +21596=>3815, +38056=>3816, +20044=>3817, +27745=>3818, +35820=>3819, +23627=>3820, +12102=>3821, +26080=>3821, +33436=>3822, +26791=>3823, +21566=>3824, +21556=>3825, +12111=>3826, +27595=>3826, +27494=>3827, +20116=>3828, +25410=>3829, +21320=>3830, +33310=>3831, +20237=>3832, +20398=>3833, +22366=>3834, +25098=>3835, +38654=>3836, +26212=>3837, +29289=>3838, +21247=>3839, +21153=>3840, +24735=>3841, +35823=>3842, +26132=>3843, +29081=>3844, +26512=>3845, +35199=>3846, +30802=>3847, +30717=>3848, +26224=>3849, +22075=>3850, +21560=>3851, +38177=>3852, +29306=>3853, +31232=>3854, +24687=>3855, +24076=>3856, +24713=>3857, +33181=>3858, +12067=>3859, +22805=>3859, +24796=>3860, +29060=>3861, +28911=>3862, +28330=>3863, +27728=>3864, +29312=>3865, +27268=>3866, +34989=>3867, +24109=>3868, +20064=>3869, +23219=>3870, +21916=>3871, +38115=>3872, +27927=>3873, +31995=>3874, +38553=>3875, +25103=>3876, +32454=>3877, +30606=>3878, +34430=>3879, +21283=>3880, +38686=>3881, +36758=>3882, +26247=>3883, +23777=>3884, +20384=>3885, +29421=>3886, +19979=>3887, +21414=>3888, +22799=>3889, +21523=>3890, +25472=>3891, +38184=>3892, +20808=>3893, +20185=>3894, +40092=>3895, +32420=>3896, +21688=>3897, +36132=>3898, +34900=>3899, +33335=>3900, +38386=>3901, +28046=>3902, +24358=>3903, +23244=>3904, +26174=>3905, +38505=>3906, +29616=>3907, +29486=>3908, +21439=>3909, +33146=>3910, +39301=>3911, +32673=>3912, +23466=>3913, +38519=>3914, +38480=>3915, +32447=>3916, +30456=>3917, +21410=>3918, +38262=>3919, +12217=>3920, +39321=>3920, +31665=>3921, +35140=>3922, +28248=>3923, +20065=>3924, +32724=>3925, +31077=>3926, +35814=>3927, +24819=>3928, +21709=>3929, +20139=>3930, +39033=>3931, +24055=>3932, +27233=>3933, +20687=>3934, +21521=>3935, +35937=>3936, +33831=>3937, +30813=>3938, +38660=>3939, +21066=>3940, +21742=>3941, +22179=>3942, +38144=>3943, +28040=>3944, +23477=>3945, +28102=>3946, +26195=>3947, +12073=>3948, +23567=>3948, +23389=>3949, +26657=>3950, +32918=>3951, +21880=>3952, +31505=>3953, +25928=>3954, +26964=>3955, +20123=>3956, +27463=>3957, +34638=>3958, +38795=>3959, +21327=>3960, +25375=>3961, +25658=>3962, +37034=>3963, +26012=>3964, +32961=>3965, +35856=>3966, +20889=>3967, +26800=>3968, +21368=>3969, +34809=>3970, +25032=>3971, +27844=>3972, +27899=>3973, +35874=>3974, +23633=>3975, +34218=>3976, +33455=>3977, +38156=>3978, +27427=>3979, +12191=>3980, +36763=>3980, +26032=>3981, +24571=>3982, +12092=>3983, +24515=>3983, +20449=>3984, +34885=>3985, +26143=>3986, +33125=>3987, +29481=>3988, +24826=>3989, +20852=>3990, +21009=>3991, +22411=>3992, +24418=>3993, +37026=>3994, +12175=>3995, +34892=>3995, +37266=>3996, +24184=>3997, +26447=>3998, +24615=>3999, +22995=>4000, +20804=>4001, +20982=>4002, +33016=>4003, +21256=>4004, +27769=>4005, +38596=>4006, +29066=>4007, +20241=>4008, +20462=>4009, +32670=>4010, +26429=>4011, +21957=>4012, +38152=>4013, +31168=>4014, +34966=>4015, +32483=>4016, +22687=>4017, +25100=>4018, +38656=>4019, +34394=>4020, +22040=>4021, +39035=>4022, +24464=>4023, +35768=>4024, +33988=>4025, +37207=>4026, +21465=>4027, +26093=>4028, +24207=>4029, +30044=>4030, +24676=>4031, +32110=>4032, +23167=>4033, +32490=>4034, +32493=>4035, +36713=>4036, +21927=>4037, +23459=>4038, +24748=>4039, +26059=>4040, +12126=>4041, +29572=>4041, +36873=>4042, +30307=>4043, +30505=>4044, +32474=>4045, +38772=>4046, +34203=>4047, +23398=>4048, +12147=>4049, +31348=>4049, +38634=>4050, +12174=>4051, +34880=>4051, +21195=>4052, +29071=>4053, +24490=>4054, +26092=>4055, +35810=>4056, +23547=>4057, +39535=>4058, +24033=>4059, +27529=>4060, +27739=>4061, +35757=>4062, +35759=>4063, +36874=>4064, +36805=>4065, +21387=>4066, +25276=>4067, +40486=>4068, +40493=>4069, +21568=>4070, +20011=>4071, +33469=>4072, +12123=>4073, +29273=>4073, +34460=>4074, +23830=>4075, +34905=>4076, +28079=>4077, +38597=>4078, +21713=>4079, +20122=>4080, +35766=>4081, +28937=>4082, +21693=>4083, +38409=>4084, +28895=>4085, +28153=>4086, +30416=>4087, +20005=>4088, +30740=>4089, +34578=>4090, +23721=>4091, +24310=>4092, +12180=>4093, +35328=>4093, +39068=>4094, +38414=>4095, +28814=>4096, +27839=>4097, +22852=>4098, +25513=>4099, +30524=>4100, +34893=>4101, +28436=>4102, +33395=>4103, +22576=>4104, +29141=>4105, +21388=>4106, +30746=>4107, +38593=>4108, +21761=>4109, +24422=>4110, +28976=>4111, +23476=>4112, +35866=>4113, +39564=>4114, +27523=>4115, +22830=>4116, +40495=>4117, +31207=>4118, +26472=>4119, +25196=>4120, +20335=>4121, +30113=>4122, +12154=>4123, +32650=>4123, +27915=>4124, +38451=>4125, +27687=>4126, +20208=>4127, +30162=>4128, +20859=>4129, +26679=>4130, +28478=>4131, +36992=>4132, +33136=>4133, +22934=>4134, +29814=>4135, +25671=>4136, +23591=>4137, +36965=>4138, +31377=>4139, +35875=>4140, +23002=>4141, +21676=>4142, +33280=>4143, +33647=>4144, +35201=>4145, +32768=>4146, +26928=>4147, +22094=>4148, +32822=>4149, +29239=>4150, +37326=>4151, +20918=>4152, +20063=>4153, +39029=>4154, +25494=>4155, +19994=>4156, +21494=>4157, +26355=>4158, +33099=>4159, +22812=>4160, +28082=>4161, +12032=>4162, +19968=>4162, +22777=>4163, +21307=>4164, +25558=>4165, +38129=>4166, +20381=>4167, +20234=>4168, +12176=>4169, +34915=>4169, +39056=>4170, +22839=>4171, +36951=>4172, +31227=>4173, +20202=>4174, +33008=>4175, +30097=>4176, +27778=>4177, +23452=>4178, +23016=>4179, +24413=>4180, +26885=>4181, +34433=>4182, +20506=>4183, +24050=>4184, +12036=>4185, +20057=>4185, +30691=>4186, +20197=>4187, +33402=>4188, +25233=>4189, +26131=>4190, +12194=>4191, +37009=>4191, +23673=>4192, +20159=>4193, +24441=>4194, +33222=>4195, +36920=>4196, +32900=>4197, +30123=>4198, +20134=>4199, +35028=>4200, +24847=>4201, +27589=>4202, +24518=>4203, +20041=>4204, +30410=>4205, +28322=>4206, +35811=>4207, +35758=>4208, +35850=>4209, +35793=>4210, +24322=>4211, +32764=>4212, +32716=>4213, +32462=>4214, +33589=>4215, +33643=>4216, +22240=>4217, +27575=>4218, +12211=>4219, +38899=>4219, +38452=>4220, +23035=>4221, +21535=>4222, +38134=>4223, +28139=>4224, +23493=>4225, +39278=>4226, +23609=>4227, +24341=>4228, +38544=>4229, +21360=>4230, +33521=>4231, +27185=>4232, +23156=>4233, +40560=>4234, +24212=>4235, +32552=>4236, +33721=>4237, +33828=>4238, +33829=>4239, +33639=>4240, +34631=>4241, +36814=>4242, +36194=>4243, +30408=>4244, +24433=>4245, +39062=>4246, +30828=>4247, +26144=>4248, +21727=>4249, +25317=>4250, +20323=>4251, +33219=>4252, +30152=>4253, +24248=>4254, +38605=>4255, +36362=>4256, +34553=>4257, +21647=>4258, +27891=>4259, +28044=>4260, +27704=>4261, +24703=>4262, +21191=>4263, +12132=>4264, +29992=>4264, +24189=>4265, +20248=>4266, +24736=>4267, +24551=>4268, +23588=>4269, +30001=>4270, +37038=>4271, +38080=>4272, +29369=>4273, +27833=>4274, +28216=>4275, +12195=>4276, +37193=>4276, +26377=>4277, +21451=>4278, +21491=>4279, +20305=>4280, +37321=>4281, +35825=>4282, +12060=>4283, +21448=>4283, +24188=>4284, +36802=>4285, +28132=>4286, +20110=>4287, +30402=>4288, +27014=>4289, +34398=>4290, +24858=>4291, +33286=>4292, +20313=>4293, +20446=>4294, +36926=>4295, +40060=>4296, +24841=>4297, +28189=>4298, +28180=>4299, +38533=>4300, +20104=>4301, +23089=>4302, +12204=>4303, +38632=>4303, +19982=>4304, +23679=>4305, +31161=>4306, +23431=>4307, +35821=>4308, +12155=>4309, +32701=>4309, +12127=>4310, +29577=>4310, +22495=>4311, +33419=>4312, +37057=>4313, +21505=>4314, +36935=>4315, +21947=>4316, +23786=>4317, +24481=>4318, +24840=>4319, +27442=>4320, +29425=>4321, +32946=>4322, +35465=>4323, +28020=>4324, +23507=>4325, +35029=>4326, +39044=>4327, +35947=>4328, +39533=>4329, +40499=>4330, +28170=>4331, +20900=>4332, +20803=>4333, +22435=>4334, +34945=>4335, +21407=>4336, +25588=>4337, +36757=>4338, +22253=>4339, +21592=>4340, +22278=>4341, +29503=>4342, +28304=>4343, +32536=>4344, +36828=>4345, +33489=>4346, +24895=>4347, +24616=>4348, +38498=>4349, +12104=>4350, +26352=>4350, +32422=>4351, +36234=>4352, +36291=>4353, +38053=>4354, +23731=>4355, +31908=>4356, +12105=>4357, +26376=>4357, +24742=>4358, +38405=>4359, +32792=>4360, +20113=>4361, +37095=>4362, +21248=>4363, +38504=>4364, +20801=>4365, +36816=>4366, +34164=>4367, +37213=>4368, +26197=>4369, +38901=>4370, +23381=>4371, +21277=>4372, +30776=>4373, +26434=>4374, +26685=>4375, +21705=>4376, +28798=>4377, +23472=>4378, +36733=>4379, +20877=>4380, +22312=>4381, +21681=>4382, +25874=>4383, +26242=>4384, +36190=>4385, +36163=>4386, +33039=>4387, +33900=>4388, +36973=>4389, +31967=>4390, +20991=>4391, +34299=>4392, +26531=>4393, +26089=>4394, +28577=>4395, +34468=>4396, +36481=>4397, +22122=>4398, +36896=>4399, +30338=>4400, +28790=>4401, +29157=>4402, +36131=>4403, +25321=>4404, +21017=>4405, +27901=>4406, +36156=>4407, +24590=>4408, +22686=>4409, +24974=>4410, +26366=>4411, +36192=>4412, +25166=>4413, +21939=>4414, +28195=>4415, +26413=>4416, +36711=>4417, +38113=>4418, +38392=>4419, +30504=>4420, +26629=>4421, +27048=>4422, +21643=>4423, +20045=>4424, +28856=>4425, +35784=>4426, +25688=>4427, +25995=>4428, +23429=>4429, +31364=>4430, +20538=>4431, +23528=>4432, +30651=>4433, +27617=>4434, +35449=>4435, +31896=>4436, +27838=>4437, +30415=>4438, +26025=>4439, +36759=>4440, +23853=>4441, +23637=>4442, +34360=>4443, +26632=>4444, +21344=>4445, +25112=>4446, +31449=>4447, +28251=>4448, +32509=>4449, +27167=>4450, +31456=>4451, +24432=>4452, +28467=>4453, +24352=>4454, +25484=>4455, +28072=>4456, +26454=>4457, +19976=>4458, +24080=>4459, +36134=>4460, +20183=>4461, +32960=>4462, +30260=>4463, +38556=>4464, +25307=>4465, +26157=>4466, +25214=>4467, +27836=>4468, +36213=>4469, +29031=>4470, +32617=>4471, +20806=>4472, +32903=>4473, +21484=>4474, +36974=>4475, +25240=>4476, +21746=>4477, +34544=>4478, +36761=>4479, +32773=>4480, +38167=>4481, +34071=>4482, +36825=>4483, +27993=>4484, +29645=>4485, +26015=>4486, +30495=>4487, +29956=>4488, +30759=>4489, +33275=>4490, +36126=>4491, +38024=>4492, +20390=>4493, +26517=>4494, +30137=>4495, +35786=>4496, +38663=>4497, +25391=>4498, +38215=>4499, +38453=>4500, +33976=>4501, +25379=>4502, +30529=>4503, +24449=>4504, +29424=>4505, +20105=>4506, +24596=>4507, +25972=>4508, +25327=>4509, +27491=>4510, +25919=>4511, +24103=>4512, +30151=>4513, +37073=>4514, +35777=>4515, +33437=>4516, +26525=>4517, +12096=>4518, +25903=>4518, +21553=>4519, +34584=>4520, +30693=>4521, +32930=>4522, +33026=>4523, +27713=>4524, +20043=>4525, +32455=>4526, +32844=>4527, +30452=>4528, +26893=>4529, +27542=>4530, +25191=>4531, +20540=>4532, +20356=>4533, +22336=>4534, +25351=>4535, +12108=>4536, +27490=>4536, +36286=>4537, +21482=>4538, +26088=>4539, +32440=>4540, +24535=>4541, +25370=>4542, +25527=>4543, +12164=>4544, +33267=>4544, +33268=>4545, +32622=>4546, +24092=>4547, +23769=>4548, +21046=>4549, +26234=>4550, +31209=>4551, +31258=>4552, +36136=>4553, +28825=>4554, +30164=>4555, +28382=>4556, +27835=>4557, +31378=>4558, +20013=>4559, +30405=>4560, +24544=>4561, +38047=>4562, +34935=>4563, +32456=>4564, +31181=>4565, +32959=>4566, +37325=>4567, +20210=>4568, +20247=>4569, +12168=>4570, +33311=>4570, +21608=>4571, +24030=>4572, +27954=>4573, +35788=>4574, +31909=>4575, +36724=>4576, +32920=>4577, +24090=>4578, +21650=>4579, +30385=>4580, +23449=>4581, +26172=>4582, +39588=>4583, +29664=>4584, +26666=>4585, +34523=>4586, +26417=>4587, +29482=>4588, +35832=>4589, +35803=>4590, +36880=>4591, +12149=>4592, +31481=>4592, +28891=>4593, +29038=>4594, +25284=>4595, +30633=>4596, +22065=>4597, +20027=>4598, +33879=>4599, +26609=>4600, +21161=>4601, +34496=>4602, +36142=>4603, +38136=>4604, +31569=>4605, +20303=>4606, +27880=>4607, +31069=>4608, +39547=>4609, +25235=>4610, +12118=>4611, +29226=>4611, +25341=>4612, +19987=>4613, +30742=>4614, +36716=>4615, +25776=>4616, +36186=>4617, +31686=>4618, +26729=>4619, +24196=>4620, +35013=>4621, +22918=>4622, +25758=>4623, +22766=>4624, +29366=>4625, +26894=>4626, +38181=>4627, +36861=>4628, +36184=>4629, +22368=>4630, +32512=>4631, +35846=>4632, +20934=>4633, +25417=>4634, +25305=>4635, +21331=>4636, +26700=>4637, +29730=>4638, +33537=>4639, +37196=>4640, +21828=>4641, +30528=>4642, +28796=>4643, +27978=>4644, +20857=>4645, +21672=>4646, +36164=>4647, +23039=>4648, +28363=>4649, +28100=>4650, +23388=>4651, +32043=>4652, +20180=>4653, +31869=>4654, +28371=>4655, +12070=>4656, +23376=>4656, +12163=>4657, +33258=>4657, +28173=>4658, +23383=>4659, +39683=>4660, +26837=>4661, +36394=>4662, +23447=>4663, +32508=>4664, +24635=>4665, +32437=>4666, +37049=>4667, +12187=>4668, +36208=>4668, +22863=>4669, +25549=>4670, +31199=>4671, +12188=>4672, +36275=>4672, +21330=>4673, +26063=>4674, +31062=>4675, +35781=>4676, +38459=>4677, +32452=>4678, +38075=>4679, +32386=>4680, +22068=>4681, +37257=>4682, +26368=>4683, +32618=>4684, +23562=>4685, +36981=>4686, +26152=>4687, +24038=>4688, +20304=>4689, +26590=>4690, +20570=>4691, +20316=>4692, +22352=>4693, +24231=>4694, +20109=>4695, +19980=>4696, +20800=>4697, +64012=>4697, +19984=>4698, +24319=>4699, +21317=>4700, +19989=>4701, +20120=>4702, +19998=>4703, +12224=>4704, +39730=>4704, +23404=>4705, +22121=>4706, +12033=>4707, +20008=>4707, +31162=>4708, +12035=>4709, +20031=>4709, +12052=>4710, +21269=>4710, +20039=>4711, +22829=>4712, +12120=>4713, +29243=>4713, +21358=>4714, +27664=>4715, +22239=>4716, +32996=>4717, +39319=>4718, +27603=>4719, +30590=>4720, +40727=>4721, +12034=>4722, +20022=>4722, +20127=>4723, +40720=>4724, +20060=>4725, +20073=>4726, +20115=>4727, +33416=>4728, +23387=>4729, +21868=>4730, +22031=>4731, +20164=>4732, +21389=>4733, +21405=>4734, +21411=>4735, +21413=>4736, +21422=>4737, +38757=>4738, +36189=>4739, +12053=>4740, +21274=>4740, +21493=>4741, +21286=>4742, +21294=>4743, +21310=>4744, +36188=>4745, +21350=>4746, +21347=>4747, +20994=>4748, +21000=>4749, +21006=>4750, +21037=>4751, +21043=>4752, +21055=>4753, +21056=>4754, +21068=>4755, +21086=>4756, +21089=>4757, +21084=>4758, +33967=>4759, +21117=>4760, +21122=>4761, +21121=>4762, +21136=>4763, +21139=>4764, +12044=>4765, +20866=>4765, +32596=>4766, +20155=>4767, +20163=>4768, +20169=>4769, +20162=>4770, +20200=>4771, +20193=>4772, +20203=>4773, +20190=>4774, +20251=>4775, +20211=>4776, +20258=>4777, +20324=>4778, +20213=>4779, +20261=>4780, +20263=>4781, +20233=>4782, +20267=>4783, +20318=>4784, +20327=>4785, +25912=>4786, +20314=>4787, +20317=>4788, +20319=>4789, +20311=>4790, +20274=>4791, +20285=>4792, +20342=>4793, +20340=>4794, +20369=>4795, +20361=>4796, +20355=>4797, +20367=>4798, +20350=>4799, +20347=>4800, +20394=>4801, +20348=>4802, +20396=>4803, +20372=>4804, +20454=>4805, +20456=>4806, +20458=>4807, +20421=>4808, +20442=>4809, +20451=>4810, +20444=>4811, +20433=>4812, +20447=>4813, +20472=>4814, +20521=>4815, +20556=>4816, +20467=>4817, +20524=>4818, +20495=>4819, +20526=>4820, +20525=>4821, +20478=>4822, +20508=>4823, +20492=>4824, +20517=>4825, +20520=>4826, +20606=>4827, +20547=>4828, +20565=>4829, +20552=>4830, +20558=>4831, +20588=>4832, +20603=>4833, +20645=>4834, +20647=>4835, +20649=>4836, +20666=>4837, +20694=>4838, +20742=>4839, +20717=>4840, +20716=>4841, +20710=>4842, +20718=>4843, +20743=>4844, +20747=>4845, +20189=>4846, +27709=>4847, +20312=>4848, +20325=>4849, +20430=>4850, +12245=>4851, +40864=>4851, +27718=>4852, +31860=>4853, +20846=>4854, +24061=>4855, +40649=>4856, +39320=>4857, +20865=>4858, +22804=>4859, +12051=>4860, +21241=>4860, +21261=>4861, +35335=>4862, +21264=>4863, +20971=>4864, +22809=>4865, +20821=>4866, +12039=>4867, +20128=>4867, +20822=>4868, +20147=>4869, +34926=>4870, +34980=>4871, +20149=>4872, +33044=>4873, +35026=>4874, +31104=>4875, +23348=>4876, +34819=>4877, +32696=>4878, +12046=>4879, +20907=>4879, +20913=>4880, +20925=>4881, +20924=>4882, +20935=>4883, +12045=>4884, +20886=>4884, +20898=>4885, +20901=>4886, +35744=>4887, +35750=>4888, +35751=>4889, +35754=>4890, +35764=>4891, +35765=>4892, +35767=>4893, +35778=>4894, +35779=>4895, +35787=>4896, +35791=>4897, +35790=>4898, +35794=>4899, +35795=>4900, +35796=>4901, +35798=>4902, +35800=>4903, +35801=>4904, +35804=>4905, +35807=>4906, +35808=>4907, +35812=>4908, +35816=>4909, +35817=>4910, +35822=>4911, +35824=>4912, +35827=>4913, +35830=>4914, +35833=>4915, +35836=>4916, +35839=>4917, +35840=>4918, +35842=>4919, +35844=>4920, +35847=>4921, +35852=>4922, +35855=>4923, +35857=>4924, +35858=>4925, +35860=>4926, +35861=>4927, +35862=>4928, +35865=>4929, +35867=>4930, +35864=>4931, +35869=>4932, +35871=>4933, +35872=>4934, +35873=>4935, +35877=>4936, +35879=>4937, +35882=>4938, +35883=>4939, +35886=>4940, +35887=>4941, +35890=>4942, +35891=>4943, +35893=>4944, +35894=>4945, +12057=>4946, +21353=>4946, +21370=>4947, +38429=>4948, +38434=>4949, +38433=>4950, +38449=>4951, +38442=>4952, +38461=>4953, +38460=>4954, +38466=>4955, +38473=>4956, +38484=>4957, +38495=>4958, +38503=>4959, +38508=>4960, +38514=>4961, +38516=>4962, +38536=>4963, +38541=>4964, +38551=>4965, +38576=>4966, +37015=>4967, +37019=>4968, +37021=>4969, +37017=>4970, +37036=>4971, +37025=>4972, +37044=>4973, +37043=>4974, +37046=>4975, +37050=>4976, +37048=>4977, +37040=>4978, +37071=>4979, +37061=>4980, +37054=>4981, +37072=>4982, +37060=>4983, +37063=>4984, +37075=>4985, +37094=>4986, +37090=>4987, +37084=>4988, +37079=>4989, +37083=>4990, +37099=>4991, +37103=>4992, +37118=>4993, +37124=>4994, +37154=>4995, +37150=>4996, +37155=>4997, +37169=>4998, +37167=>4999, +37177=>5000, +37187=>5001, +37190=>5002, +21005=>5003, +22850=>5004, +21154=>5005, +21164=>5006, +21165=>5007, +21182=>5008, +21759=>5009, +21200=>5010, +21206=>5011, +21232=>5012, +21471=>5013, +29166=>5014, +30669=>5015, +12085=>5016, +24308=>5016, +12048=>5017, +20981=>5017, +20988=>5018, +12223=>5019, +39727=>5019, +12059=>5020, +21430=>5020, +24321=>5021, +30042=>5022, +24047=>5023, +22348=>5024, +22441=>5025, +22433=>5026, +22654=>5027, +22716=>5028, +22725=>5029, +22737=>5030, +22313=>5031, +22316=>5032, +22314=>5033, +22323=>5034, +22329=>5035, +22318=>5036, +22319=>5037, +22364=>5038, +22331=>5039, +22338=>5040, +22377=>5041, +22405=>5042, +22379=>5043, +22406=>5044, +22396=>5045, +22395=>5046, +22376=>5047, +22381=>5048, +22390=>5049, +22387=>5050, +22445=>5051, +22436=>5052, +22412=>5053, +22450=>5054, +22479=>5055, +22439=>5056, +22452=>5057, +22419=>5058, +22432=>5059, +22485=>5060, +22488=>5061, +22490=>5062, +22489=>5063, +22482=>5064, +22456=>5065, +22516=>5066, +22511=>5067, +22520=>5068, +22500=>5069, +22493=>5070, +22539=>5071, +22541=>5072, +22525=>5073, +22509=>5074, +22528=>5075, +22558=>5076, +22553=>5077, +22596=>5078, +22560=>5079, +22629=>5080, +22636=>5081, +22657=>5082, +22665=>5083, +22682=>5084, +22656=>5085, +39336=>5086, +40729=>5087, +25087=>5088, +33401=>5089, +33405=>5090, +33407=>5091, +33423=>5092, +33418=>5093, +33448=>5094, +33412=>5095, +33422=>5096, +33425=>5097, +33431=>5098, +33433=>5099, +33451=>5100, +33464=>5101, +33470=>5102, +33456=>5103, +33480=>5104, +33482=>5105, +33507=>5106, +33432=>5107, +33463=>5108, +33454=>5109, +33483=>5110, +33484=>5111, +33473=>5112, +33449=>5113, +33460=>5114, +33441=>5115, +33450=>5116, +33439=>5117, +33476=>5118, +33486=>5119, +33444=>5120, +33505=>5121, +33545=>5122, +33527=>5123, +33508=>5124, +33551=>5125, +33543=>5126, +33500=>5127, +33524=>5128, +33490=>5129, +33496=>5130, +33548=>5131, +33531=>5132, +33491=>5133, +33553=>5134, +33562=>5135, +33542=>5136, +33556=>5137, +33557=>5138, +33504=>5139, +33493=>5140, +33564=>5141, +33617=>5142, +33627=>5143, +33628=>5144, +33544=>5145, +33682=>5146, +33596=>5147, +33588=>5148, +33585=>5149, +33691=>5150, +33630=>5151, +33583=>5152, +33615=>5153, +33607=>5154, +33603=>5155, +33631=>5156, +33600=>5157, +33559=>5158, +33632=>5159, +33581=>5160, +33594=>5161, +33587=>5162, +33638=>5163, +33637=>5164, +33640=>5165, +33563=>5166, +33641=>5167, +33644=>5168, +33642=>5169, +33645=>5170, +33646=>5171, +33712=>5172, +33656=>5173, +33715=>5174, +33716=>5175, +33696=>5176, +33706=>5177, +33683=>5178, +33692=>5179, +33669=>5180, +33660=>5181, +33718=>5182, +33705=>5183, +33661=>5184, +33720=>5185, +33659=>5186, +33688=>5187, +33694=>5188, +33704=>5189, +33722=>5190, +33724=>5191, +33729=>5192, +33793=>5193, +33765=>5194, +33752=>5195, +22535=>5196, +33816=>5197, +33803=>5198, +33757=>5199, +33789=>5200, +33750=>5201, +33820=>5202, +33848=>5203, +33809=>5204, +33798=>5205, +33748=>5206, +33759=>5207, +33807=>5208, +33795=>5209, +33784=>5210, +33785=>5211, +33770=>5212, +33733=>5213, +33728=>5214, +33830=>5215, +33776=>5216, +33761=>5217, +33884=>5218, +33873=>5219, +33882=>5220, +33881=>5221, +33907=>5222, +33927=>5223, +33928=>5224, +33914=>5225, +33929=>5226, +33912=>5227, +33852=>5228, +33862=>5229, +33897=>5230, +33910=>5231, +33932=>5232, +33934=>5233, +33841=>5234, +33901=>5235, +33985=>5236, +33997=>5237, +34000=>5238, +34022=>5239, +33981=>5240, +34003=>5241, +33994=>5242, +33983=>5243, +33978=>5244, +34016=>5245, +33953=>5246, +33977=>5247, +33972=>5248, +33943=>5249, +34021=>5250, +34019=>5251, +34060=>5252, +29965=>5253, +34104=>5254, +34032=>5255, +34105=>5256, +34079=>5257, +34106=>5258, +34134=>5259, +34107=>5260, +34047=>5261, +34044=>5262, +34137=>5263, +34120=>5264, +34152=>5265, +34148=>5266, +34142=>5267, +34170=>5268, +30626=>5269, +34115=>5270, +34162=>5271, +34171=>5272, +34212=>5273, +34216=>5274, +34183=>5275, +34191=>5276, +34169=>5277, +34222=>5278, +34204=>5279, +34181=>5280, +34233=>5281, +34231=>5282, +34224=>5283, +34259=>5284, +34241=>5285, +34268=>5286, +34303=>5287, +34343=>5288, +34309=>5289, +34345=>5290, +34326=>5291, +34364=>5292, +12086=>5293, +24318=>5293, +24328=>5294, +22844=>5295, +22849=>5296, +32823=>5297, +22869=>5298, +22874=>5299, +22872=>5300, +21263=>5301, +12074=>5302, +23586=>5302, +23589=>5303, +23596=>5304, +23604=>5305, +25164=>5306, +25194=>5307, +25247=>5308, +25275=>5309, +25290=>5310, +25306=>5311, +25303=>5312, +25326=>5313, +25378=>5314, +25334=>5315, +25401=>5316, +25419=>5317, +25411=>5318, +25517=>5319, +25590=>5320, +25457=>5321, +25466=>5322, +25486=>5323, +25524=>5324, +25453=>5325, +25516=>5326, +25482=>5327, +25449=>5328, +25518=>5329, +25532=>5330, +25586=>5331, +25592=>5332, +25568=>5333, +25599=>5334, +25540=>5335, +25566=>5336, +25550=>5337, +25682=>5338, +25542=>5339, +25534=>5340, +25669=>5341, +25665=>5342, +25611=>5343, +25627=>5344, +25632=>5345, +25612=>5346, +25638=>5347, +25633=>5348, +25694=>5349, +25732=>5350, +25709=>5351, +25750=>5352, +25722=>5353, +25783=>5354, +25784=>5355, +25753=>5356, +25786=>5357, +25792=>5358, +25808=>5359, +25815=>5360, +25828=>5361, +25826=>5362, +25865=>5363, +25893=>5364, +25902=>5365, +12087=>5366, +24331=>5366, +24530=>5367, +29977=>5368, +24337=>5369, +21343=>5370, +21489=>5371, +21501=>5372, +21481=>5373, +21480=>5374, +21499=>5375, +21522=>5376, +21526=>5377, +21510=>5378, +21579=>5379, +21586=>5380, +21587=>5381, +21588=>5382, +21590=>5383, +21571=>5384, +21537=>5385, +21591=>5386, +21593=>5387, +21539=>5388, +21554=>5389, +21634=>5390, +21652=>5391, +21623=>5392, +21617=>5393, +21604=>5394, +21658=>5395, +21659=>5396, +21636=>5397, +21622=>5398, +21606=>5399, +21661=>5400, +21712=>5401, +21677=>5402, +21698=>5403, +21684=>5404, +21714=>5405, +21671=>5406, +21670=>5407, +21715=>5408, +21716=>5409, +21618=>5410, +21667=>5411, +21717=>5412, +21691=>5413, +21695=>5414, +21708=>5415, +21721=>5416, +21722=>5417, +21724=>5418, +21673=>5419, +21674=>5420, +21668=>5421, +21725=>5422, +21711=>5423, +21726=>5424, +21787=>5425, +21735=>5426, +21792=>5427, +21757=>5428, +21780=>5429, +21747=>5430, +21794=>5431, +21795=>5432, +21775=>5433, +21777=>5434, +21799=>5435, +21802=>5436, +21863=>5437, +21903=>5438, +21941=>5439, +21833=>5440, +21869=>5441, +21825=>5442, +21845=>5443, +21823=>5444, +21840=>5445, +21820=>5446, +21815=>5447, +21846=>5448, +21877=>5449, +21878=>5450, +21879=>5451, +21811=>5452, +21808=>5453, +21852=>5454, +21899=>5455, +21970=>5456, +21891=>5457, +21937=>5458, +21945=>5459, +21896=>5460, +21889=>5461, +21919=>5462, +21886=>5463, +21974=>5464, +21905=>5465, +21883=>5466, +21983=>5467, +21949=>5468, +21950=>5469, +21908=>5470, +21913=>5471, +21994=>5472, +22007=>5473, +21961=>5474, +22047=>5475, +21969=>5476, +21995=>5477, +21996=>5478, +21972=>5479, +21990=>5480, +21981=>5481, +21956=>5482, +21999=>5483, +21989=>5484, +22002=>5485, +22003=>5486, +21964=>5487, +21965=>5488, +21992=>5489, +22005=>5490, +21988=>5491, +36756=>5492, +22046=>5493, +22024=>5494, +22028=>5495, +22017=>5496, +22052=>5497, +22051=>5498, +22014=>5499, +22016=>5500, +22055=>5501, +22061=>5502, +22104=>5503, +22073=>5504, +22103=>5505, +22060=>5506, +22093=>5507, +22114=>5508, +22105=>5509, +22108=>5510, +22092=>5511, +22100=>5512, +22150=>5513, +22116=>5514, +22129=>5515, +22123=>5516, +22139=>5517, +22140=>5518, +22149=>5519, +22163=>5520, +22191=>5521, +22228=>5522, +12062=>5523, +22231=>5523, +22237=>5524, +22241=>5525, +22261=>5526, +22251=>5527, +22265=>5528, +22271=>5529, +22276=>5530, +22282=>5531, +22281=>5532, +22300=>5533, +24079=>5534, +24089=>5535, +24084=>5536, +24081=>5537, +24113=>5538, +24123=>5539, +24124=>5540, +24119=>5541, +24132=>5542, +24148=>5543, +24155=>5544, +24158=>5545, +24161=>5546, +23692=>5547, +23674=>5548, +23693=>5549, +23696=>5550, +23702=>5551, +23688=>5552, +23704=>5553, +23705=>5554, +23697=>5555, +23706=>5556, +23708=>5557, +23733=>5558, +23714=>5559, +23741=>5560, +23724=>5561, +23723=>5562, +23729=>5563, +23715=>5564, +23745=>5565, +23735=>5566, +23748=>5567, +23762=>5568, +23780=>5569, +23755=>5570, +23781=>5571, +23810=>5572, +23811=>5573, +23847=>5574, +23846=>5575, +23854=>5576, +23844=>5577, +23838=>5578, +23814=>5579, +23835=>5580, +23896=>5581, +23870=>5582, +23860=>5583, +23869=>5584, +23916=>5585, +23899=>5586, +23919=>5587, +23901=>5588, +23915=>5589, +23883=>5590, +23882=>5591, +23913=>5592, +23924=>5593, +23938=>5594, +23961=>5595, +23965=>5596, +35955=>5597, +23991=>5598, +24005=>5599, +12091=>5600, +24435=>5600, +24439=>5601, +24450=>5602, +24455=>5603, +24457=>5604, +24460=>5605, +24469=>5606, +24473=>5607, +24476=>5608, +24488=>5609, +24493=>5610, +24501=>5611, +24508=>5612, +34914=>5613, +12090=>5614, +24417=>5614, +29357=>5615, +29360=>5616, +29364=>5617, +29367=>5618, +29368=>5619, +29379=>5620, +29377=>5621, +29390=>5622, +29389=>5623, +29394=>5624, +29416=>5625, +29423=>5626, +29417=>5627, +29426=>5628, +29428=>5629, +29431=>5630, +29441=>5631, +29427=>5632, +29443=>5633, +29434=>5634, +29435=>5635, +29463=>5636, +29459=>5637, +29473=>5638, +29450=>5639, +29470=>5640, +29469=>5641, +29461=>5642, +29474=>5643, +29497=>5644, +29477=>5645, +29484=>5646, +29496=>5647, +29489=>5648, +29520=>5649, +29517=>5650, +29527=>5651, +29536=>5652, +29548=>5653, +29551=>5654, +29566=>5655, +12167=>5656, +33307=>5656, +22821=>5657, +39143=>5658, +22820=>5659, +12065=>5660, +22786=>5660, +39267=>5661, +39271=>5662, +39272=>5663, +39273=>5664, +39274=>5665, +39275=>5666, +39276=>5667, +39284=>5668, +39287=>5669, +39293=>5670, +39296=>5671, +39300=>5672, +39303=>5673, +39306=>5674, +39309=>5675, +39312=>5676, +39313=>5677, +39315=>5678, +39316=>5679, +39317=>5680, +24192=>5681, +24209=>5682, +24203=>5683, +24214=>5684, +24229=>5685, +24224=>5686, +24249=>5687, +24245=>5688, +24254=>5689, +24243=>5690, +36179=>5691, +24274=>5692, +24273=>5693, +24283=>5694, +24296=>5695, +24298=>5696, +33210=>5697, +24516=>5698, +24521=>5699, +24534=>5700, +24527=>5701, +24579=>5702, +24558=>5703, +24580=>5704, +24545=>5705, +24548=>5706, +24574=>5707, +24581=>5708, +24582=>5709, +24554=>5710, +24557=>5711, +24568=>5712, +24601=>5713, +24629=>5714, +24614=>5715, +24603=>5716, +24591=>5717, +24589=>5718, +24617=>5719, +24619=>5720, +24586=>5721, +24639=>5722, +24609=>5723, +24696=>5724, +24697=>5725, +24699=>5726, +24698=>5727, +24642=>5728, +24682=>5729, +24701=>5730, +24726=>5731, +24730=>5732, +24749=>5733, +24733=>5734, +24707=>5735, +24722=>5736, +24716=>5737, +24731=>5738, +24812=>5739, +24763=>5740, +24753=>5741, +24797=>5742, +24792=>5743, +24774=>5744, +24794=>5745, +24756=>5746, +24864=>5747, +24870=>5748, +24853=>5749, +24867=>5750, +24820=>5751, +24832=>5752, +24846=>5753, +24875=>5754, +24906=>5755, +24949=>5756, +25004=>5757, +24980=>5758, +24999=>5759, +25015=>5760, +25044=>5761, +25077=>5762, +24541=>5763, +38579=>5764, +38377=>5765, +38379=>5766, +38385=>5767, +38387=>5768, +38389=>5769, +38390=>5770, +38396=>5771, +38398=>5772, +38403=>5773, +38404=>5774, +38406=>5775, +38408=>5776, +38410=>5777, +38411=>5778, +38412=>5779, +38413=>5780, +38415=>5781, +38418=>5782, +38421=>5783, +38422=>5784, +38423=>5785, +38425=>5786, +38426=>5787, +20012=>5788, +12121=>5789, +29247=>5789, +25109=>5790, +27701=>5791, +27732=>5792, +27740=>5793, +27722=>5794, +27811=>5795, +27781=>5796, +27792=>5797, +27796=>5798, +27788=>5799, +27752=>5800, +27753=>5801, +27764=>5802, +27766=>5803, +27782=>5804, +27817=>5805, +27856=>5806, +27860=>5807, +27821=>5808, +27895=>5809, +27896=>5810, +27889=>5811, +27863=>5812, +27826=>5813, +27872=>5814, +27862=>5815, +27898=>5816, +27883=>5817, +27886=>5818, +27825=>5819, +27859=>5820, +27887=>5821, +27902=>5822, +27961=>5823, +27943=>5824, +27916=>5825, +27971=>5826, +27976=>5827, +27911=>5828, +27908=>5829, +27929=>5830, +27918=>5831, +27947=>5832, +27981=>5833, +27950=>5834, +27957=>5835, +27930=>5836, +27983=>5837, +27986=>5838, +27988=>5839, +27955=>5840, +28049=>5841, +28015=>5842, +28062=>5843, +28064=>5844, +27998=>5845, +28051=>5846, +28052=>5847, +27996=>5848, +28000=>5849, +28028=>5850, +28003=>5851, +28186=>5852, +28103=>5853, +28101=>5854, +28126=>5855, +28174=>5856, +28095=>5857, +28128=>5858, +28177=>5859, +28134=>5860, +28125=>5861, +28121=>5862, +28182=>5863, +28075=>5864, +28172=>5865, +28078=>5866, +28203=>5867, +28270=>5868, +28238=>5869, +28267=>5870, +28338=>5871, +28255=>5872, +28294=>5873, +28243=>5874, +28244=>5875, +28210=>5876, +28197=>5877, +28228=>5878, +28383=>5879, +28337=>5880, +28312=>5881, +28384=>5882, +28461=>5883, +28386=>5884, +28325=>5885, +28327=>5886, +28349=>5887, +28347=>5888, +28343=>5889, +28375=>5890, +28340=>5891, +28367=>5892, +28303=>5893, +28354=>5894, +28319=>5895, +28514=>5896, +28486=>5897, +28487=>5898, +28452=>5899, +28437=>5900, +28409=>5901, +28463=>5902, +28470=>5903, +28491=>5904, +28532=>5905, +28458=>5906, +28425=>5907, +28457=>5908, +28553=>5909, +28557=>5910, +28556=>5911, +28536=>5912, +28530=>5913, +28540=>5914, +28538=>5915, +28625=>5916, +28617=>5917, +28583=>5918, +28601=>5919, +28598=>5920, +28610=>5921, +28641=>5922, +28654=>5923, +28638=>5924, +28640=>5925, +28655=>5926, +28698=>5927, +28707=>5928, +28699=>5929, +28729=>5930, +28725=>5931, +28751=>5932, +28766=>5933, +12071=>5934, +23424=>5934, +23428=>5935, +23445=>5936, +23443=>5937, +23461=>5938, +23480=>5939, +29999=>5940, +39582=>5941, +25652=>5942, +23524=>5943, +23534=>5944, +35120=>5945, +23536=>5946, +36423=>5947, +35591=>5948, +36790=>5949, +36819=>5950, +36821=>5951, +36837=>5952, +36846=>5953, +36836=>5954, +36841=>5955, +36838=>5956, +36851=>5957, +36840=>5958, +36869=>5959, +36868=>5960, +36875=>5961, +36902=>5962, +36881=>5963, +36877=>5964, +36886=>5965, +36897=>5966, +36917=>5967, +36918=>5968, +36909=>5969, +36911=>5970, +36932=>5971, +36945=>5972, +36946=>5973, +36944=>5974, +36968=>5975, +36952=>5976, +36962=>5977, +36955=>5978, +26297=>5979, +36980=>5980, +36989=>5981, +36994=>5982, +37000=>5983, +36995=>5984, +37003=>5985, +12089=>5986, +24400=>5986, +24407=>5987, +24406=>5988, +24408=>5989, +23611=>5990, +21675=>5991, +23632=>5992, +23641=>5993, +23409=>5994, +23651=>5995, +23654=>5996, +32700=>5997, +24362=>5998, +24361=>5999, +24365=>6000, +33396=>6001, +24380=>6002, +39739=>6003, +12076=>6004, +23662=>6004, +22913=>6005, +22915=>6006, +22925=>6007, +22953=>6008, +22954=>6009, +22947=>6010, +22935=>6011, +22986=>6012, +22955=>6013, +22942=>6014, +22948=>6015, +22994=>6016, +22962=>6017, +22959=>6018, +22999=>6019, +22974=>6020, +23045=>6021, +23046=>6022, +23005=>6023, +23048=>6024, +23011=>6025, +23000=>6026, +23033=>6027, +23052=>6028, +23049=>6029, +23090=>6030, +23092=>6031, +23057=>6032, +23075=>6033, +23059=>6034, +23104=>6035, +23143=>6036, +23114=>6037, +23125=>6038, +23100=>6039, +23138=>6040, +23157=>6041, +33004=>6042, +23210=>6043, +23195=>6044, +23159=>6045, +23162=>6046, +23230=>6047, +23275=>6048, +23218=>6049, +23250=>6050, +23252=>6051, +23224=>6052, +23264=>6053, +23267=>6054, +23281=>6055, +23254=>6056, +23270=>6057, +23256=>6058, +23260=>6059, +23305=>6060, +23319=>6061, +23318=>6062, +23346=>6063, +23351=>6064, +23360=>6065, +23573=>6066, +23580=>6067, +23386=>6068, +23397=>6069, +23411=>6070, +23377=>6071, +23379=>6072, +23394=>6073, +39541=>6074, +39543=>6075, +39544=>6076, +39546=>6077, +39551=>6078, +39549=>6079, +39552=>6080, +39553=>6081, +39557=>6082, +39560=>6083, +39562=>6084, +39568=>6085, +39570=>6086, +39571=>6087, +39574=>6088, +39576=>6089, +39579=>6090, +39580=>6091, +39581=>6092, +39583=>6093, +39584=>6094, +39586=>6095, +39587=>6096, +39589=>6097, +39591=>6098, +32415=>6099, +32417=>6100, +32419=>6101, +32421=>6102, +32424=>6103, +32425=>6104, +32429=>6105, +32432=>6106, +32446=>6107, +32448=>6108, +32449=>6109, +32450=>6110, +32457=>6111, +32459=>6112, +32460=>6113, +32464=>6114, +32468=>6115, +32471=>6116, +32475=>6117, +32480=>6118, +32481=>6119, +32488=>6120, +32491=>6121, +32494=>6122, +32495=>6123, +32497=>6124, +32498=>6125, +32525=>6126, +32502=>6127, +32506=>6128, +32507=>6129, +32510=>6130, +32513=>6131, +32514=>6132, +32515=>6133, +32519=>6134, +32520=>6135, +32523=>6136, +32524=>6137, +32527=>6138, +32529=>6139, +32530=>6140, +32535=>6141, +32537=>6142, +32540=>6143, +32539=>6144, +32543=>6145, +32545=>6146, +32546=>6147, +32547=>6148, +32548=>6149, +32549=>6150, +32550=>6151, +32551=>6152, +32554=>6153, +32555=>6154, +32556=>6155, +32557=>6156, +32559=>6157, +32560=>6158, +32561=>6159, +32562=>6160, +32563=>6161, +32565=>6162, +12083=>6163, +24186=>6163, +30079=>6164, +12078=>6165, +24027=>6165, +30014=>6166, +37013=>6167, +29582=>6168, +29585=>6169, +29614=>6170, +29602=>6171, +29599=>6172, +29647=>6173, +29634=>6174, +29649=>6175, +29623=>6176, +29619=>6177, +29632=>6178, +29641=>6179, +29640=>6180, +29669=>6181, +29657=>6182, +39036=>6183, +29706=>6184, +29673=>6185, +29671=>6186, +29662=>6187, +29626=>6188, +29682=>6189, +29711=>6190, +29738=>6191, +29787=>6192, +29734=>6193, +29733=>6194, +29736=>6195, +29744=>6196, +29742=>6197, +29740=>6198, +29723=>6199, +29722=>6200, +29761=>6201, +29788=>6202, +29783=>6203, +29781=>6204, +29785=>6205, +29815=>6206, +29805=>6207, +29822=>6208, +29852=>6209, +29838=>6210, +29824=>6211, +29825=>6212, +29831=>6213, +29835=>6214, +29854=>6215, +29864=>6216, +29865=>6217, +29840=>6218, +29863=>6219, +29906=>6220, +29882=>6221, +38890=>6222, +38891=>6223, +38892=>6224, +26444=>6225, +26451=>6226, +26462=>6227, +26440=>6228, +26473=>6229, +26533=>6230, +26503=>6231, +26474=>6232, +26483=>6233, +26520=>6234, +26535=>6235, +26485=>6236, +26536=>6237, +26526=>6238, +26541=>6239, +26507=>6240, +26487=>6241, +26492=>6242, +26608=>6243, +26633=>6244, +26584=>6245, +26634=>6246, +26601=>6247, +26544=>6248, +26636=>6249, +26585=>6250, +26549=>6251, +26586=>6252, +26547=>6253, +26589=>6254, +26624=>6255, +26563=>6256, +26552=>6257, +26594=>6258, +26638=>6259, +26561=>6260, +26621=>6261, +26674=>6262, +26675=>6263, +26720=>6264, +26721=>6265, +26702=>6266, +26722=>6267, +26692=>6268, +26724=>6269, +26755=>6270, +26653=>6271, +26709=>6272, +26726=>6273, +26689=>6274, +26727=>6275, +26688=>6276, +26686=>6277, +26698=>6278, +26697=>6279, +26665=>6280, +26805=>6281, +26767=>6282, +26740=>6283, +26743=>6284, +26771=>6285, +26731=>6286, +26818=>6287, +26990=>6288, +26876=>6289, +26911=>6290, +26912=>6291, +26873=>6292, +26916=>6293, +26864=>6294, +26891=>6295, +26881=>6296, +26967=>6297, +26851=>6298, +26896=>6299, +26993=>6300, +26937=>6301, +26976=>6302, +26946=>6303, +26973=>6304, +27012=>6305, +26987=>6306, +27008=>6307, +27032=>6308, +27000=>6309, +26932=>6310, +27084=>6311, +27015=>6312, +27016=>6313, +27086=>6314, +27017=>6315, +26982=>6316, +26979=>6317, +27001=>6318, +27035=>6319, +27047=>6320, +27067=>6321, +27051=>6322, +27053=>6323, +27092=>6324, +27057=>6325, +27073=>6326, +27082=>6327, +27103=>6328, +27029=>6329, +27104=>6330, +27021=>6331, +27135=>6332, +27183=>6333, +27117=>6334, +27159=>6335, +27160=>6336, +27237=>6337, +27122=>6338, +27204=>6339, +27198=>6340, +27296=>6341, +27216=>6342, +27227=>6343, +27189=>6344, +27278=>6345, +27257=>6346, +27197=>6347, +27176=>6348, +27224=>6349, +27260=>6350, +27281=>6351, +27280=>6352, +27305=>6353, +27287=>6354, +27307=>6355, +29495=>6356, +29522=>6357, +27521=>6358, +27522=>6359, +27527=>6360, +27524=>6361, +27538=>6362, +27539=>6363, +27533=>6364, +27546=>6365, +27547=>6366, +27553=>6367, +27562=>6368, +36715=>6369, +36717=>6370, +36721=>6371, +36722=>6372, +36723=>6373, +36725=>6374, +36726=>6375, +36728=>6376, +36727=>6377, +36729=>6378, +36730=>6379, +36732=>6380, +36734=>6381, +36737=>6382, +36738=>6383, +36740=>6384, +36743=>6385, +36747=>6386, +36749=>6387, +36750=>6388, +36751=>6389, +36760=>6390, +36762=>6391, +36558=>6392, +25099=>6393, +25111=>6394, +25115=>6395, +25119=>6396, +25122=>6397, +25121=>6398, +25125=>6399, +25124=>6400, +25132=>6401, +33255=>6402, +29935=>6403, +29940=>6404, +29951=>6405, +29967=>6406, +29969=>6407, +29971=>6408, +12097=>6409, +25908=>6409, +26094=>6410, +26095=>6411, +26096=>6412, +26122=>6413, +26137=>6414, +26482=>6415, +26115=>6416, +26133=>6417, +26112=>6418, +28805=>6419, +26359=>6420, +26141=>6421, +26164=>6422, +26161=>6423, +26166=>6424, +26165=>6425, +32774=>6426, +26207=>6427, +26196=>6428, +26177=>6429, +26191=>6430, +26198=>6431, +26209=>6432, +26199=>6433, +26231=>6434, +26244=>6435, +26252=>6436, +26279=>6437, +26269=>6438, +26302=>6439, +26331=>6440, +26332=>6441, +26342=>6442, +26345=>6443, +36146=>6444, +36147=>6445, +36150=>6446, +36155=>6447, +36157=>6448, +36160=>6449, +36165=>6450, +36166=>6451, +36168=>6452, +36169=>6453, +36167=>6454, +36173=>6455, +36181=>6456, +36185=>6457, +35271=>6458, +35274=>6459, +35275=>6460, +35276=>6461, +35278=>6462, +35279=>6463, +35280=>6464, +35281=>6465, +29294=>6466, +29343=>6467, +29277=>6468, +29286=>6469, +29295=>6470, +29310=>6471, +29311=>6472, +29316=>6473, +29323=>6474, +29325=>6475, +29327=>6476, +29330=>6477, +25352=>6478, +25394=>6479, +25520=>6480, +25663=>6481, +25816=>6482, +32772=>6483, +27626=>6484, +27635=>6485, +27645=>6486, +27637=>6487, +27641=>6488, +27653=>6489, +27655=>6490, +27654=>6491, +27661=>6492, +27669=>6493, +27672=>6494, +27673=>6495, +27674=>6496, +27681=>6497, +27689=>6498, +27684=>6499, +27690=>6500, +27698=>6501, +25909=>6502, +25941=>6503, +25963=>6504, +29261=>6505, +29266=>6506, +29270=>6507, +29232=>6508, +34402=>6509, +21014=>6510, +32927=>6511, +32924=>6512, +32915=>6513, +32956=>6514, +26378=>6515, +32957=>6516, +32945=>6517, +32939=>6518, +32941=>6519, +32948=>6520, +32951=>6521, +32999=>6522, +33000=>6523, +33001=>6524, +33002=>6525, +32987=>6526, +32962=>6527, +32964=>6528, +32985=>6529, +32973=>6530, +32983=>6531, +26384=>6532, +32989=>6533, +33003=>6534, +33009=>6535, +33012=>6536, +33005=>6537, +33037=>6538, +33038=>6539, +33010=>6540, +33020=>6541, +26389=>6542, +33042=>6543, +35930=>6544, +33078=>6545, +33054=>6546, +33068=>6547, +33048=>6548, +33074=>6549, +33096=>6550, +33100=>6551, +33107=>6552, +33140=>6553, +33113=>6554, +33114=>6555, +33137=>6556, +33120=>6557, +33129=>6558, +33148=>6559, +33149=>6560, +33133=>6561, +33127=>6562, +22605=>6563, +23221=>6564, +33160=>6565, +33154=>6566, +33169=>6567, +28373=>6568, +33187=>6569, +33194=>6570, +33228=>6571, +26406=>6572, +33226=>6573, +33211=>6574, +33217=>6575, +33190=>6576, +27428=>6577, +27447=>6578, +27449=>6579, +27459=>6580, +27462=>6581, +27481=>6582, +39121=>6583, +39122=>6584, +39123=>6585, +39125=>6586, +39129=>6587, +39130=>6588, +12110=>6589, +27571=>6589, +24384=>6590, +27586=>6591, +35315=>6592, +26000=>6593, +40785=>6594, +26003=>6595, +26044=>6596, +26054=>6597, +26052=>6598, +26051=>6599, +26060=>6600, +26062=>6601, +26066=>6602, +26070=>6603, +28800=>6604, +28828=>6605, +28822=>6606, +28829=>6607, +28859=>6608, +28864=>6609, +28855=>6610, +28843=>6611, +28849=>6612, +28904=>6613, +28874=>6614, +28944=>6615, +28947=>6616, +28950=>6617, +28975=>6618, +28977=>6619, +29043=>6620, +29020=>6621, +29032=>6622, +28997=>6623, +29042=>6624, +29002=>6625, +29048=>6626, +29050=>6627, +29080=>6628, +29107=>6629, +29109=>6630, +29096=>6631, +29088=>6632, +29152=>6633, +29140=>6634, +29159=>6635, +29177=>6636, +29213=>6637, +29224=>6638, +28780=>6639, +28952=>6640, +29030=>6641, +29113=>6642, +25150=>6643, +25149=>6644, +25155=>6645, +25160=>6646, +25161=>6647, +31035=>6648, +31040=>6649, +31046=>6650, +31049=>6651, +31067=>6652, +31068=>6653, +31059=>6654, +31066=>6655, +31074=>6656, +31063=>6657, +31072=>6658, +31087=>6659, +31079=>6660, +31098=>6661, +31109=>6662, +31114=>6663, +31130=>6664, +31143=>6665, +31155=>6666, +24529=>6667, +24528=>6668, +24636=>6669, +24669=>6670, +24666=>6671, +24679=>6672, +24641=>6673, +24665=>6674, +24675=>6675, +24747=>6676, +24838=>6677, +24845=>6678, +24925=>6679, +25001=>6680, +24989=>6681, +25035=>6682, +25041=>6683, +25094=>6684, +32896=>6685, +12160=>6686, +32895=>6686, +27795=>6687, +27894=>6688, +28156=>6689, +30710=>6690, +30712=>6691, +30720=>6692, +30729=>6693, +30743=>6694, +30744=>6695, +30737=>6696, +26027=>6697, +30765=>6698, +30748=>6699, +30749=>6700, +30777=>6701, +30778=>6702, +30779=>6703, +30751=>6704, +30780=>6705, +30757=>6706, +30764=>6707, +30755=>6708, +30761=>6709, +30798=>6710, +30829=>6711, +30806=>6712, +30807=>6713, +30758=>6714, +30800=>6715, +30791=>6716, +30796=>6717, +30826=>6718, +30875=>6719, +30867=>6720, +30874=>6721, +30855=>6722, +30876=>6723, +30881=>6724, +30883=>6725, +30898=>6726, +30905=>6727, +30885=>6728, +30932=>6729, +30937=>6730, +30921=>6731, +30956=>6732, +30962=>6733, +30981=>6734, +30964=>6735, +30995=>6736, +31012=>6737, +31006=>6738, +31028=>6739, +40859=>6740, +12235=>6741, +40697=>6741, +40699=>6742, +40700=>6743, +30449=>6744, +30468=>6745, +30477=>6746, +30457=>6747, +30471=>6748, +30472=>6749, +30490=>6750, +30498=>6751, +30489=>6752, +30509=>6753, +30502=>6754, +30517=>6755, +30520=>6756, +30544=>6757, +30545=>6758, +30535=>6759, +30531=>6760, +30554=>6761, +30568=>6762, +30562=>6763, +30565=>6764, +30591=>6765, +30605=>6766, +30589=>6767, +30592=>6768, +30604=>6769, +30609=>6770, +30623=>6771, +30624=>6772, +30640=>6773, +30645=>6774, +30653=>6775, +30010=>6776, +30016=>6777, +30030=>6778, +30027=>6779, +30024=>6780, +30043=>6781, +30066=>6782, +30073=>6783, +30083=>6784, +32600=>6785, +32609=>6786, +32607=>6787, +35400=>6788, +32616=>6789, +32628=>6790, +32625=>6791, +32633=>6792, +32641=>6793, +32638=>6794, +30413=>6795, +30437=>6796, +34866=>6797, +38021=>6798, +38022=>6799, +38023=>6800, +38027=>6801, +38026=>6802, +38028=>6803, +38029=>6804, +38031=>6805, +38032=>6806, +38036=>6807, +38039=>6808, +38037=>6809, +38042=>6810, +38043=>6811, +38044=>6812, +38051=>6813, +38052=>6814, +38059=>6815, +38058=>6816, +38061=>6817, +38060=>6818, +38063=>6819, +38064=>6820, +38066=>6821, +38068=>6822, +38070=>6823, +38071=>6824, +38072=>6825, +38073=>6826, +38074=>6827, +38076=>6828, +38077=>6829, +38079=>6830, +38084=>6831, +38088=>6832, +38089=>6833, +38090=>6834, +38091=>6835, +38092=>6836, +38093=>6837, +38094=>6838, +38096=>6839, +38097=>6840, +38098=>6841, +38101=>6842, +38102=>6843, +38103=>6844, +38105=>6845, +38104=>6846, +38107=>6847, +38110=>6848, +38111=>6849, +38112=>6850, +38114=>6851, +38116=>6852, +38117=>6853, +38119=>6854, +38120=>6855, +38122=>6856, +38121=>6857, +38123=>6858, +38126=>6859, +38127=>6860, +38131=>6861, +38132=>6862, +38133=>6863, +38135=>6864, +38137=>6865, +38140=>6866, +38141=>6867, +38143=>6868, +38147=>6869, +38146=>6870, +38150=>6871, +38151=>6872, +38153=>6873, +38154=>6874, +38157=>6875, +38158=>6876, +38159=>6877, +38162=>6878, +38163=>6879, +38164=>6880, +38165=>6881, +38166=>6882, +38168=>6883, +38171=>6884, +38173=>6885, +38174=>6886, +38175=>6887, +38178=>6888, +38186=>6889, +38187=>6890, +38185=>6891, +38188=>6892, +38193=>6893, +38194=>6894, +38196=>6895, +38198=>6896, +38199=>6897, +38200=>6898, +38204=>6899, +38206=>6900, +38207=>6901, +38210=>6902, +38197=>6903, +38212=>6904, +38213=>6905, +38214=>6906, +38217=>6907, +38220=>6908, +38222=>6909, +38223=>6910, +38226=>6911, +38227=>6912, +38228=>6913, +38230=>6914, +38231=>6915, +38232=>6916, +38233=>6917, +38235=>6918, +38238=>6919, +38239=>6920, +38237=>6921, +38241=>6922, +38242=>6923, +38244=>6924, +38245=>6925, +38246=>6926, +38247=>6927, +38248=>6928, +38249=>6929, +38250=>6930, +38251=>6931, +38252=>6932, +38255=>6933, +38257=>6934, +38258=>6935, +38259=>6936, +38202=>6937, +30695=>6938, +30700=>6939, +38601=>6940, +31189=>6941, +31213=>6942, +31203=>6943, +31211=>6944, +31238=>6945, +23879=>6946, +31235=>6947, +31234=>6948, +31262=>6949, +31252=>6950, +31289=>6951, +31287=>6952, +31313=>6953, +40655=>6954, +39333=>6955, +31344=>6956, +30344=>6957, +30350=>6958, +30355=>6959, +30361=>6960, +30372=>6961, +29918=>6962, +29920=>6963, +29996=>6964, +40480=>6965, +40482=>6966, +40488=>6967, +40489=>6968, +40490=>6969, +40491=>6970, +40492=>6971, +40498=>6972, +40497=>6973, +40502=>6974, +40504=>6975, +40503=>6976, +40505=>6977, +40506=>6978, +40510=>6979, +40513=>6980, +40514=>6981, +40516=>6982, +40518=>6983, +40519=>6984, +40520=>6985, +40521=>6986, +40523=>6987, +40524=>6988, +40526=>6989, +40529=>6990, +40533=>6991, +40535=>6992, +40538=>6993, +40539=>6994, +40540=>6995, +40542=>6996, +40547=>6997, +40550=>6998, +40551=>6999, +40552=>7000, +40553=>7001, +40554=>7002, +40555=>7003, +40556=>7004, +40561=>7005, +40557=>7006, +40563=>7007, +12135=>7008, +30098=>7008, +30100=>7009, +30102=>7010, +30112=>7011, +30109=>7012, +30124=>7013, +30115=>7014, +30131=>7015, +30132=>7016, +30136=>7017, +30148=>7018, +30129=>7019, +30128=>7020, +30147=>7021, +30146=>7022, +30166=>7023, +30157=>7024, +30179=>7025, +30184=>7026, +30182=>7027, +30180=>7028, +30187=>7029, +30183=>7030, +30211=>7031, +30193=>7032, +30204=>7033, +30207=>7034, +30224=>7035, +30208=>7036, +30213=>7037, +30220=>7038, +30231=>7039, +30218=>7040, +30245=>7041, +30232=>7042, +30229=>7043, +30233=>7044, +30235=>7045, +30268=>7046, +30242=>7047, +30240=>7048, +30272=>7049, +30253=>7050, +30256=>7051, +30271=>7052, +30261=>7053, +30275=>7054, +30270=>7055, +30259=>7056, +30285=>7057, +30302=>7058, +30292=>7059, +30300=>7060, +30294=>7061, +30315=>7062, +30319=>7063, +32714=>7064, +31462=>7065, +31352=>7066, +31353=>7067, +31360=>7068, +31366=>7069, +31368=>7070, +31381=>7071, +31398=>7072, +31392=>7073, +31404=>7074, +31400=>7075, +31405=>7076, +31411=>7077, +34916=>7078, +34921=>7079, +34930=>7080, +34941=>7081, +34943=>7082, +34946=>7083, +34978=>7084, +35014=>7085, +34999=>7086, +35004=>7087, +35017=>7088, +35042=>7089, +35022=>7090, +35043=>7091, +35045=>7092, +35057=>7093, +35098=>7094, +35068=>7095, +35048=>7096, +35070=>7097, +35056=>7098, +35105=>7099, +35097=>7100, +35091=>7101, +35099=>7102, +35082=>7103, +35124=>7104, +35115=>7105, +35126=>7106, +35137=>7107, +35174=>7108, +35195=>7109, +12134=>7110, +30091=>7110, +32997=>7111, +30386=>7112, +30388=>7113, +30684=>7114, +12158=>7115, +32786=>7115, +32788=>7116, +32790=>7117, +32796=>7118, +32800=>7119, +32802=>7120, +32805=>7121, +32806=>7122, +32807=>7123, +32809=>7124, +32808=>7125, +32817=>7126, +32779=>7127, +32821=>7128, +32835=>7129, +32838=>7130, +32845=>7131, +32850=>7132, +32873=>7133, +32881=>7134, +35203=>7135, +39032=>7136, +39040=>7137, +39043=>7138, +39049=>7139, +39052=>7140, +39053=>7141, +39055=>7142, +39060=>7143, +39066=>7144, +39067=>7145, +39070=>7146, +39071=>7147, +39073=>7148, +39074=>7149, +39077=>7150, +39078=>7151, +12172=>7152, +34381=>7152, +34388=>7153, +34412=>7154, +34414=>7155, +34431=>7156, +34426=>7157, +34428=>7158, +34427=>7159, +34472=>7160, +34445=>7161, +34443=>7162, +34476=>7163, +34461=>7164, +34471=>7165, +34467=>7166, +34474=>7167, +34451=>7168, +34473=>7169, +34486=>7170, +34500=>7171, +34485=>7172, +34510=>7173, +34480=>7174, +34490=>7175, +34481=>7176, +34479=>7177, +34505=>7178, +34511=>7179, +34484=>7180, +34537=>7181, +34545=>7182, +34546=>7183, +34541=>7184, +34547=>7185, +34512=>7186, +34579=>7187, +34526=>7188, +34548=>7189, +34527=>7190, +34520=>7191, +34513=>7192, +34563=>7193, +34567=>7194, +34552=>7195, +34568=>7196, +34570=>7197, +34573=>7198, +34569=>7199, +34595=>7200, +34619=>7201, +34590=>7202, +34597=>7203, +34606=>7204, +34586=>7205, +34622=>7206, +34632=>7207, +34612=>7208, +34609=>7209, +34601=>7210, +34615=>7211, +34623=>7212, +34690=>7213, +34594=>7214, +34685=>7215, +34686=>7216, +34683=>7217, +34656=>7218, +34672=>7219, +34636=>7220, +34670=>7221, +34699=>7222, +34643=>7223, +34659=>7224, +34684=>7225, +34660=>7226, +34649=>7227, +34661=>7228, +34707=>7229, +34735=>7230, +34728=>7231, +34770=>7232, +34758=>7233, +34696=>7234, +34693=>7235, +34733=>7236, +34711=>7237, +34691=>7238, +34731=>7239, +34789=>7240, +34732=>7241, +34741=>7242, +34739=>7243, +34763=>7244, +34771=>7245, +34749=>7246, +34769=>7247, +34752=>7248, +34762=>7249, +34779=>7250, +34794=>7251, +34784=>7252, +34798=>7253, +34838=>7254, +34835=>7255, +34814=>7256, +34826=>7257, +34843=>7258, +34849=>7259, +34873=>7260, +34876=>7261, +12152=>7262, +32566=>7262, +32578=>7263, +32580=>7264, +32581=>7265, +33296=>7266, +31482=>7267, +31485=>7268, +31496=>7269, +31491=>7270, +31492=>7271, +31509=>7272, +31498=>7273, +31531=>7274, +31503=>7275, +31559=>7276, +31544=>7277, +31530=>7278, +31513=>7279, +31534=>7280, +31537=>7281, +31520=>7282, +31525=>7283, +31524=>7284, +31539=>7285, +31550=>7286, +31518=>7287, +31576=>7288, +31578=>7289, +31557=>7290, +31605=>7291, +31564=>7292, +31581=>7293, +31584=>7294, +31598=>7295, +31611=>7296, +31586=>7297, +31602=>7298, +31601=>7299, +31632=>7300, +31654=>7301, +31655=>7302, +31672=>7303, +31660=>7304, +31645=>7305, +31656=>7306, +31621=>7307, +31658=>7308, +31644=>7309, +31650=>7310, +31659=>7311, +31668=>7312, +31697=>7313, +31681=>7314, +31692=>7315, +31709=>7316, +31706=>7317, +31717=>7318, +31718=>7319, +31722=>7320, +31756=>7321, +31742=>7322, +31740=>7323, +31759=>7324, +31766=>7325, +31755=>7326, +31775=>7327, +31786=>7328, +31782=>7329, +31800=>7330, +31809=>7331, +31808=>7332, +33278=>7333, +33281=>7334, +33282=>7335, +33284=>7336, +33260=>7337, +34884=>7338, +33313=>7339, +33314=>7340, +33315=>7341, +33325=>7342, +33327=>7343, +33320=>7344, +33323=>7345, +33336=>7346, +33339=>7347, +33331=>7348, +33332=>7349, +33342=>7350, +33348=>7351, +33353=>7352, +33355=>7353, +33359=>7354, +33370=>7355, +33375=>7356, +33384=>7357, +34942=>7358, +34949=>7359, +34952=>7360, +35032=>7361, +35039=>7362, +35166=>7363, +32669=>7364, +32671=>7365, +32679=>7366, +32687=>7367, +32688=>7368, +32690=>7369, +31868=>7370, +25929=>7371, +31889=>7372, +31901=>7373, +31900=>7374, +31902=>7375, +31906=>7376, +31922=>7377, +31932=>7378, +31933=>7379, +31937=>7380, +31943=>7381, +31948=>7382, +31949=>7383, +31944=>7384, +31941=>7385, +31959=>7386, +31976=>7387, +12169=>7388, +33390=>7388, +26280=>7389, +32703=>7390, +32718=>7391, +32725=>7392, +32741=>7393, +32737=>7394, +32742=>7395, +32745=>7396, +32750=>7397, +32755=>7398, +12151=>7399, +31992=>7399, +32119=>7400, +32166=>7401, +32174=>7402, +32327=>7403, +32411=>7404, +40632=>7405, +40628=>7406, +36211=>7407, +36228=>7408, +36244=>7409, +36241=>7410, +36273=>7411, +36199=>7412, +36205=>7413, +35911=>7414, +35913=>7415, +37194=>7416, +37200=>7417, +37198=>7418, +37199=>7419, +37220=>7420, +37218=>7421, +37217=>7422, +37232=>7423, +37225=>7424, +37231=>7425, +37245=>7426, +37246=>7427, +37234=>7428, +37236=>7429, +37241=>7430, +37260=>7431, +37253=>7432, +37264=>7433, +37261=>7434, +37265=>7435, +37282=>7436, +37283=>7437, +37290=>7438, +37293=>7439, +37294=>7440, +37295=>7441, +37301=>7442, +37300=>7443, +37306=>7444, +12183=>7445, +35925=>7445, +40574=>7446, +36280=>7447, +36331=>7448, +36357=>7449, +36441=>7450, +36457=>7451, +36277=>7452, +36287=>7453, +36284=>7454, +36282=>7455, +36292=>7456, +36310=>7457, +36311=>7458, +36314=>7459, +36318=>7460, +36302=>7461, +36303=>7462, +36315=>7463, +36294=>7464, +36332=>7465, +36343=>7466, +36344=>7467, +36323=>7468, +36345=>7469, +36347=>7470, +36324=>7471, +36361=>7472, +36349=>7473, +36372=>7474, +36381=>7475, +36383=>7476, +36396=>7477, +36398=>7478, +36387=>7479, +36399=>7480, +36410=>7481, +36416=>7482, +36409=>7483, +36405=>7484, +36413=>7485, +36401=>7486, +36425=>7487, +36417=>7488, +36418=>7489, +36433=>7490, +36434=>7491, +36426=>7492, +36464=>7493, +36470=>7494, +36476=>7495, +36463=>7496, +36468=>7497, +36485=>7498, +36495=>7499, +36500=>7500, +36496=>7501, +36508=>7502, +36510=>7503, +12184=>7504, +35960=>7504, +35970=>7505, +35978=>7506, +35973=>7507, +35992=>7508, +35988=>7509, +26011=>7510, +35286=>7511, +35294=>7512, +35290=>7513, +35292=>7514, +35301=>7515, +35307=>7516, +35311=>7517, +35390=>7518, +35622=>7519, +38739=>7520, +38633=>7521, +38643=>7522, +38639=>7523, +38662=>7524, +38657=>7525, +38664=>7526, +38671=>7527, +38670=>7528, +38698=>7529, +38701=>7530, +38704=>7531, +38718=>7532, +40832=>7533, +40835=>7534, +40837=>7535, +40838=>7536, +40839=>7537, +40840=>7538, +40841=>7539, +40842=>7540, +40844=>7541, +40702=>7542, +40715=>7543, +40717=>7544, +12203=>7545, +38585=>7545, +38588=>7546, +38589=>7547, +38606=>7548, +38610=>7549, +30655=>7550, +38624=>7551, +37518=>7552, +37550=>7553, +37576=>7554, +37694=>7555, +37738=>7556, +37834=>7557, +37775=>7558, +37950=>7559, +37995=>7560, +40063=>7561, +40066=>7562, +40069=>7563, +40070=>7564, +40071=>7565, +40072=>7566, +31267=>7567, +40075=>7568, +40078=>7569, +40080=>7570, +40081=>7571, +40082=>7572, +40084=>7573, +40085=>7574, +40090=>7575, +40091=>7576, +40094=>7577, +40095=>7578, +40096=>7579, +40097=>7580, +40098=>7581, +40099=>7582, +40101=>7583, +40102=>7584, +40103=>7585, +40104=>7586, +40105=>7587, +40107=>7588, +40109=>7589, +40110=>7590, +40112=>7591, +40113=>7592, +40114=>7593, +40115=>7594, +40116=>7595, +40117=>7596, +40118=>7597, +40119=>7598, +40122=>7599, +40123=>7600, +40124=>7601, +40125=>7602, +40132=>7603, +40133=>7604, +40134=>7605, +40135=>7606, +40138=>7607, +40139=>7608, +40140=>7609, +40141=>7610, +40142=>7611, +40143=>7612, +40144=>7613, +40147=>7614, +40148=>7615, +40149=>7616, +40151=>7617, +40152=>7618, +40153=>7619, +40156=>7620, +40157=>7621, +40159=>7622, +40162=>7623, +38780=>7624, +38789=>7625, +38801=>7626, +38802=>7627, +38804=>7628, +38831=>7629, +38827=>7630, +38819=>7631, +38834=>7632, +38836=>7633, +39601=>7634, +39600=>7635, +39607=>7636, +40536=>7637, +39606=>7638, +39610=>7639, +39612=>7640, +39617=>7641, +39616=>7642, +39621=>7643, +39618=>7644, +39627=>7645, +39628=>7646, +39633=>7647, +39749=>7648, +39747=>7649, +39751=>7650, +39753=>7651, +39752=>7652, +39757=>7653, +39761=>7654, +39144=>7655, +39181=>7656, +39214=>7657, +39253=>7658, +39252=>7659, +12221=>7660, +39647=>7660, +39649=>7661, +39654=>7662, +39663=>7663, +39659=>7664, +39675=>7665, +39661=>7666, +39673=>7667, +39688=>7668, +39695=>7669, +39699=>7670, +39711=>7671, +39715=>7672, +40637=>7673, +40638=>7674, +32315=>7675, +40578=>7676, +40583=>7677, +40584=>7678, +40587=>7679, +40594=>7680, +37846=>7681, +40605=>7682, +40607=>7683, +40667=>7684, +40668=>7685, +40669=>7686, +40672=>7687, +40671=>7688, +40674=>7689, +40681=>7690, +40679=>7691, +40677=>7692, +40682=>7693, +40687=>7694, +40738=>7695, +40748=>7696, +40751=>7697, +40761=>7698, +40759=>7699, +40765=>7700, +40766=>7701, +40772=>7702, +12295=>7703, + + + + + + + +30362=>7717, +34297=>7718, +31001=>7719, +24859=>7720, +39599=>7721, +35158=>7722, +22761=>7723, +32631=>7724, +25850=>7725, +25943=>7726, +38930=>7727, +36774=>7728, +32070=>7729, +24171=>7730, +32129=>7731, +37770=>7732, +35607=>7733, +39165=>7734, +23542=>7735, +22577=>7736, +39825=>7737, +36649=>7738, +12185=>7739, +35997=>7739, +37575=>7740, +29437=>7741, +20633=>7742, +24970=>7743, +32179=>7744, +31558=>7745, +30050=>7746, +25987=>7747, +24163=>7748, +38281=>7749, +37002=>7750, +32232=>7751, +36022=>7752, +35722=>7753, +36783=>7754, +36782=>7755, +27161=>7756, +40009=>7757, +30303=>7758, +28693=>7759, +28657=>7760, +36051=>7761, +25839=>7762, +39173=>7763, +25765=>7764, +37474=>7765, +37457=>7766, +39361=>7767, +35036=>7768, +36001=>7769, +21443=>7770, +34870=>7771, +27544=>7772, +24922=>7773, +24920=>7774, +29158=>7775, +33980=>7776, +33369=>7777, +20489=>7778, +28356=>7779, +21408=>7780, +20596=>7781, +28204=>7782, +23652=>7783, +35435=>7784, +25881=>7785, +25723=>7786, +34796=>7787, +39262=>7788, +35730=>7789, +32399=>7790, +37855=>7791, +29987=>7792, +38369=>7793, +39019=>7794, +22580=>7795, +22039=>7796, +12199=>7797, +38263=>7797, +20767=>7798, +33144=>7799, +24288=>7800, +26274=>7801, +37396=>7802, +12190=>7803, +36554=>7803, +24505=>7804, +22645=>7805, +38515=>7806, +35183=>7807, +31281=>7808, +25074=>7809, +35488=>7810, +39425=>7811, +36978=>7812, +39347=>7813, +12242=>7814, +40786=>7814, +29118=>7815, +34909=>7816, +34802=>7817, +23541=>7818, +30087=>7819, +36490=>7820, +31820=>7821, +32162=>7822, +37276=>7823, +37604=>7824, +38619=>7825, +30990=>7826, +20786=>7827, +35320=>7828, +34389=>7829, +20659=>7830, +30241=>7831, +38358=>7832, +21109=>7833, +37656=>7834, +32020=>7835, +32189=>7836, +36781=>7837, +35422=>7838, +36060=>7839, +32880=>7840, +24478=>7841, +21474=>7842, +36517=>7843, +31428=>7844, +37679=>7845, +36948=>7846, +24118=>7847, +36024=>7848, +25812=>7849, +21934=>7850, +37170=>7851, +25763=>7852, +33213=>7853, +24986=>7854, +35477=>7855, +24392=>7856, +30070=>7857, +25803=>7858, +40680=>7859, +34153=>7860, +27284=>7861, +25623=>7862, +23798=>7863, +31153=>7864, +23566=>7865, +29128=>7866, +37159=>7867, +25973=>7868, +28364=>7869, +36958=>7870, +32224=>7871, +39003=>7872, +40670=>7873, +22666=>7874, +38651=>7875, +28593=>7876, +37347=>7877, +35519=>7878, +35548=>7879, +37336=>7880, +38914=>7881, +37664=>7882, +35330=>7883, +26481=>7884, +21205=>7885, +26847=>7886, +20941=>7887, +12222=>7888, +39717=>7888, +29346=>7889, +29544=>7890, +35712=>7891, +36077=>7892, +37709=>7893, +37723=>7894, +26039=>7895, +32222=>7896, +38538=>7897, +23565=>7898, +22136=>7899, +38931=>7900, +37389=>7901, +22890=>7902, +22702=>7903, +40285=>7904, +38989=>7905, +35355=>7906, +24801=>7907, +39187=>7908, +20818=>7909, +29246=>7910, +39180=>7911, +36019=>7912, +30332=>7913, +32624=>7914, +38309=>7915, +31020=>7916, +37353=>7917, +29033=>7918, +31684=>7919, +36009=>7920, +39151=>7921, +35370=>7922, +32033=>7923, +12214=>7924, +39131=>7924, +35513=>7925, +24290=>7926, +36027=>7927, +32027=>7928, +22707=>7929, +22894=>7930, +24996=>7931, +31966=>7932, +35920=>7933, +26963=>7934, +37586=>7935, +12213=>7936, +39080=>7936, +30219=>7937, +39342=>7938, +32299=>7939, +35575=>7940, +40179=>7941, +33178=>7942, +36667=>7943, +25771=>7944, +36628=>7945, +36070=>7946, +24489=>7947, +36000=>7948, +35331=>7949, +23142=>7950, +32283=>7951, +35442=>7952, +37411=>7953, +33995=>7954, +24185=>7955, +36245=>7956, +36123=>7957, +23713=>7958, +21083=>7959, +37628=>7960, +32177=>7961, +23831=>7962, +37804=>7963, +25841=>7964, +40255=>7965, +38307=>7966, +37499=>7967, +20491=>7968, +32102=>7969, +40852=>7970, +38799=>7971, +36002=>7972, +37390=>7973, +28317=>7974, +27083=>7975, +36092=>7976, +34865=>7977, +39015=>7978, +21102=>7979, +38364=>7980, +35264=>7981, +39208=>7982, +24931=>7983, +36011=>7984, +24291=>7985, +35215=>7986, +27512=>7987, +12244=>7988, +40860=>7988, +38312=>7989, +36556=>7990, +35437=>7991, +27331=>7992, +36020=>7993, +21130=>7994, +36645=>7995, +37707=>7996, +22283=>7997, +36942=>7998, +39405=>7999, +38867=>8000, +28450=>8001, +34399=>8002, +38305=>8003, +40372=>8004, +36032=>8005, +36703=>8006, +40251=>8007, +32005=>8008, +22778=>8009, +35703=>8010, +28396=>8011, +22057=>8012, +33775=>8013, +30059=>8014, +21123=>8015, +35441=>8016, +25079=>8017, +22750=>8018, +27489=>8019, +29872=>8020, +36996=>8021, +32233=>8022, +35594=>8023, +25582=>8024, +36637=>8025, +36036=>8026, +31330=>8027, +26371=>8028, +29172=>8029, +21295=>8030, +35569=>8031, +35496=>8032, +32362=>8033, +33911=>8034, +28222=>8035, +29554=>8036, +36008=>8037, +31117=>8038, +25802=>8039, +27231=>8040, +31309=>8041, +39249=>8042, +35663=>8043, +40388=>8044, +32318=>8045, +32221=>8046, +26997=>8047, +36655=>8048, +32026=>8049, +25824=>8050, +24190=>8051, +34186=>8052, +21137=>8053, +28639=>8054, +35336=>8055, +35352=>8056, +38555=>8057, +32380=>8058, +32000=>8059, +22846=>8060, +33698=>8061, +38960=>8062, +36040=>8063, +37440=>8064, +20729=>8065, +39381=>8066, +27570=>8067, +30435=>8068, +22533=>8069, +31627=>8070, +38291=>8071, +33393=>8072, +32216=>8073, +32365=>8074, +27298=>8075, +40572=>8076, +25536=>8077, +25791=>8078, +31777=>8079, +20745=>8080, +34214=>8081, +27323=>8082, +37970=>8083, +36368=>8084, +36068=>8085, +12178=>8086, +35211=>8086, +37749=>8087, +33382=>8088, +21133=>8089, +39198=>8090, +28472=>8091, +28666=>8092, +28567=>8093, +23559=>8094, +28479=>8095, +34083=>8096, +27123=>8097, +22892=>8098, +35611=>8099, +37292=>8100, +33184=>8101, +28550=>8102, +39509=>8103, +23308=>8104, +25898=>8105, +37496=>8106, +30703=>8107, +20709=>8108, +39171=>8109, +32371=>8110, +32094=>8111, +36686=>8112, +36611=>8113, +38542=>8114, +31680=>8115, +28500=>8116, +32080=>8117, +35489=>8118, +32202=>8119, +37670=>8120, +20677=>8121, +35641=>8122, +36914=>8123, +29180=>8124, +30433=>8125, +21185=>8126, +33686=>8127, +39912=>8128, +39514=>8129, +32147=>8130, +38968=>8131, +37857=>8132, +24465=>8133, +30169=>8134, +31478=>8135, +31998=>8136, +33290=>8137, +39378=>8138, +33289=>8139, +25818=>8140, +37624=>8141, +25084=>8142, +21127=>8143, +40273=>8144, +32121=>8145, +35258=>8146, +35363=>8147, +32118=>8148, +37406=>8149, +36557=>8150, +39423=>8151, +38283=>8152, +20977=>8153, +38982=>8154, +27579=>8155, +35506=>8156, +22718=>8157, +25031=>8158, +25715=>8159, +24235=>8160, +35122=>8161, +35463=>8162, +22602=>8163, +20744=>8164, +23532=>8165, +31014=>8166, +26336=>8167, +34407=>8168, +24011=>8169, +31418=>8170, +39243=>8171, +28528=>8172, +25844=>8173, +38346=>8174, +34847=>8175, +33240=>8176, +33802=>8177, +20358=>8178, +36084=>8179, +34253=>8180, +27396=>8181, +25876=>8182, +31811=>8183, +38348=>8184, +34349=>8185, +28734=>8186, +35733=>8187, +25900=>8188, +35261=>8189, +25078=>8190, +32412=>8191, +29211=>8192, +28651=>8193, +25736=>8194, +21214=>8195, +28551=>8196, +27138=>8197, +37939=>8198, +22744=>8199, +39006=>8200, +31852=>8201, +38626=>8202, +28757=>8203, +35023=>8204, +63975=>8204, +39881=>8205, +31150=>8206, +40599=>8207, +21426=>8208, +21237=>8209, +31019=>8210, +27511=>8211, +28701=>8212, +38584=>8213, +20486=>8214, +32879=>8215, +34030=>8216, +36899=>8217, +37934=>8218, +24976=>8219, +28451=>8220, +31806=>8221, +25986=>8222, +33225=>8223, +37832=>8224, +25088=>8225, +29001=>8226, +32244=>8227, +31975=>8228, +20841=>8229, +36635=>8230, +35538=>8231, +30274=>8232, +36988=>8233, +37904=>8234, +29557=>8235, +33256=>8236, +37168=>8237, +40023=>8238, +36035=>8239, +40801=>8240, +37428=>8241, +38728=>8242, +23994=>8243, +38936=>8244, +39230=>8245, +21129=>8246, +12243=>8247, +40845=>8247, +32894=>8248, +22184=>8249, +31840=>8250, +22751=>8251, +25871=>8252, +38580=>8253, +27155=>8254, +23105=>8255, +25695=>8256, +31757=>8257, +34310=>8258, +30439=>8259, +39025=>8260, +24300=>8261, +29200=>8262, +25796=>8263, +28407=>8264, +34396=>8265, +39791=>8266, +36034=>8267, +37682=>8268, +38520=>8269, +39522=>8270, +37569=>8271, +23650=>8272, +32311=>8273, +24942=>8274, +28670=>8275, +32209=>8276, +24018=>8277, +25891=>8278, +23423=>8279, +28772=>8280, +20098=>8281, +25476=>8282, +36650=>8283, +20523=>8284, +20374=>8285, +28138=>8286, +32184=>8287, +35542=>8288, +34367=>8289, +32645=>8290, +37007=>8291, +38012=>8292, +31854=>8293, +39486=>8294, +39409=>8295, +32097=>8296, +23229=>8297, +29802=>8298, +30908=>8299, +34718=>8300, +12218=>8301, +39340=>8301, +39393=>8302, +21966=>8303, +36023=>8304, +12230=>8305, +40613=>8305, +36067=>8306, +36993=>8307, +30622=>8308, +39237=>8309, +34875=>8310, +28415=>8311, +35646=>8312, +37672=>8313, +37466=>8314, +36031=>8315, +37762=>8316, +12200=>8317, +38272=>8317, +24758=>8318, +20497=>8319, +37683=>8320, +22818=>8321, +35598=>8322, +24396=>8323, +35219=>8324, +32191=>8325, +32236=>8326, +24287=>8327, +28357=>8328, +25003=>8329, +38313=>8330, +40180=>8331, +37528=>8332, +35628=>8333, +35584=>8334, +30045=>8335, +37385=>8336, +32013=>8337, +38627=>8338, +25747=>8339, +33126=>8340, +24817=>8341, +39719=>8342, +39186=>8343, +25836=>8344, +33193=>8345, +25862=>8346, +37312=>8347, +12227=>8348, +40165=>8348, +32886=>8349, +22169=>8350, +38007=>8351, +37811=>8352, +27320=>8353, +29552=>8354, +23527=>8355, +25840=>8356, +28632=>8357, +37397=>8358, +32016=>8359, +33215=>8360, +28611=>8361, +36786=>8362, +30247=>8363, +35582=>8364, +27472=>8365, +40407=>8366, +27590=>8367, +22036=>8368, +28442=>8369, +30436=>8370, +40848=>8371, +36064=>8372, +22132=>8373, +40300=>8374, +39449=>8375, +39108=>8376, +38971=>8377, +36007=>8378, +34315=>8379, +24977=>8380, +35413=>8381, +28497=>8382, +38935=>8383, +25778=>8384, +37610=>8385, +20693=>8386, +27192=>8387, +35676=>8388, +33229=>8389, +12241=>8390, +40778=>8390, +39438=>8391, +35912=>8392, +21843=>8393, +27683=>8394, +35350=>8395, +29309=>8396, +37370=>8397, +37467=>8398, +36983=>8399, +31805=>8400, +35609=>8401, +37666=>8402, +37463=>8403, +28154=>8404, +35700=>8405, +22649=>8406, +27085=>8407, +21958=>8408, +22715=>8409, +34196=>8410, +25654=>8411, +37740=>8412, +27211=>8413, +21932=>8414, +20689=>8415, +32761=>8416, +31429=>8417, +31434=>8418, +27453=>8419, +35242=>8420, +23522=>8421, +36629=>8422, +27691=>8423, +20670=>8424, +38915=>8425, +35531=>8426, +24950=>8427, +29898=>8428, +31406=>8429, +36264=>8430, +21312=>8431, +36544=>8432, +39493=>8433, +40818=>8434, +39028=>8435, +27402=>8436, +21240=>8437, +40306=>8438, +30906=>8439, +35731=>8440, +39250=>8441, +25854=>8442, +32350=>8443, +29105=>8444, +38860=>8445, +35469=>8446, +32009=>8447, +27054=>8448, +32104=>8449, +36575=>8450, +37613=>8451, +38287=>8452, +28516=>8453, +28753=>8454, +34217=>8455, +39955=>8456, +36093=>8457, +20632=>8458, +21930=>8459, +39479=>8460, +25475=>8461, +28544=>8462, +27578=>8463, +32023=>8464, +31721=>8465, +26348=>8466, +38275=>8467, +38493=>8468, +36109=>8469, +32341=>8470, +20663=>8471, +36062=>8472, +29138=>8473, +32057=>8474, +36050=>8475, +25448=>8476, +25885=>8477, +25086=>8478, +35373=>8479, +32051=>8480, +23529=>8481, +23352=>8482, +33102=>8483, +28402=>8484, +32882=>8485, +32361=>8486, +21213=>8487, +32854=>8488, +24107=>8489, +29509=>8490, +28629=>8491, +35433=>8492, +26178=>8493, +34645=>8494, +23526=>8495, +35672=>8496, +39387=>8497, +21218=>8498, +36969=>8499, +37323=>8500, +39166=>8501, +35222=>8502, +35430=>8503, +22781=>8504, +29560=>8505, +27166=>8506, +36664=>8507, +26360=>8508, +36118=>8509, +23660=>8510, +34899=>8511, +27193=>8512, +31466=>8513, +25976=>8514, +24101=>8515, +38617=>8516, +35504=>8517, +38918=>8518, +35500=>8519, +30889=>8520, +29197=>8521, +32114=>8522, +39164=>8523, +39686=>8524, +32883=>8525, +24939=>8526, +38924=>8527, +35359=>8528, +35494=>8529, +25851=>8530, +34311=>8531, +35380=>8532, +32901=>8533, +38614=>8534, +38568=>8535, +32143=>8536, +27506=>8537, +23403=>8538, +25613=>8539, +32302=>8540, +29795=>8541, +37782=>8542, +29562=>8543, +25787=>8544, +33274=>8545, +24907=>8546, +25892=>8547, +36010=>8548, +30321=>8549, +28760=>8550, +22727=>8551, +35674=>8552, +35527=>8553, +22022=>8554, +28271=>8555, +29145=>8556, +28644=>8557, +32295=>8558, +35342=>8559, +39472=>8560, +35588=>8561, +37563=>8562, +38988=>8563, +39636=>8564, +26781=>8565, +36028=>8566, +37941=>8567, +24307=>8568, +32893=>8569, +28916=>8570, +37509=>8571, +32113=>8572, +38957=>8573, +22294=>8574, +22615=>8575, +22296=>8576, +38973=>8577, +40213=>8578, +39345=>8579, +39389=>8580, +27234=>8581, +31402=>8582, +35178=>8583, +24398=>8584, +28771=>8585, +38929=>8586, +33836=>8587, +32178=>8588, +12209=>8589, +38859=>8589, +36949=>8590, +22285=>8591, +29234=>8592, +28656=>8593, +32173=>8594, +33894=>8595, +20553=>8596, +20702=>8597, +32239=>8598, +35586=>8599, +34907=>8600, +32862=>8601, +32011=>8602, +31337=>8603, +21839=>8604, +25790=>8605, +34680=>8606, +28198=>8607, +31401=>8608, +21978=>8609, +37794=>8610, +28879=>8611, +35491=>8612, +28961=>8613, +34154=>8614, +22626=>8615, +38695=>8616, +21209=>8617, +35492=>8618, +37675=>8619, +29351=>8620, +35186=>8621, +32722=>8622, +37521=>8623, +25138=>8624, +32048=>8625, +34662=>8626, +36676=>8627, +23805=>8628, +20448=>8629, +29433=>8630, +22151=>8631, +37697=>8632, +39854=>8633, +32406=>8634, +36066=>8635, +37532=>8636, +38289=>8637, +39023=>8638, +38570=>8639, +29694=>8640, +29563=>8641, +32291=>8642, +39201=>8643, +25010=>8644, +32171=>8645, +38002=>8646, +37129=>8647, +35443=>8648, +38911=>8649, +38917=>8650, +34157=>8651, +22210=>8652, +37559=>8653, +26313=>8654, +22063=>8655, +21332=>8656, +25406=>8657, +33029=>8658, +35559=>8659, +23531=>8660, +28681=>8661, +35613=>8662, +37573=>8663, +37313=>8664, +33288=>8665, +37561=>8666, +32137=>8667, +38920=>8668, +35377=>8669, +32210=>8670, +32396=>8671, +36562=>8672, +25080=>8673, +36984=>8674, +30316=>8675, +32098=>8676, +23416=>8677, +21211=>8678, +35426=>8679, +23563=>8680, +39348=>8681, +35347=>8682, +35338=>8683, +36956=>8684, +22739=>8685, +40201=>8686, +40232=>8687, +21854=>8688, +20126=>8689, +35357=>8690, +38329=>8691, +40573=>8692, +22196=>8693, +38996=>8694, +38331=>8695, +33399=>8696, +21421=>8697, +30831=>8698, +35578=>8699, +39511=>8700, +40230=>8701, +26954=>8702, +25562=>8703, +30221=>8704, +38525=>8705, +30306=>8706, +39178=>8707, +27171=>8708, +22575=>8709, +35617=>8710, +34277=>8711, +29242=>8712, +12212=>8713, +38913=>8713, +26989=>8714, +33865=>8715, +37291=>8716, +37541=>8717, +38948=>8718, +36986=>8719, +20736=>8720, +34811=>8721, +34269=>8722, +20740=>8723, +25014=>8724, +32681=>8725, +35427=>8726, +35696=>8727, +35516=>8728, +35695=>8729, +32377=>8730, +34093=>8731, +38512=>8732, +37504=>8733, +39154=>8734, +38577=>8735, +27387=>8736, +23344=>8737, +40441=>8738, +25033=>8739, +32403=>8740, +29801=>8741, +34722=>8742, +29151=>8743, +29074=>8744, +34821=>8745, +36111=>8746, +31310=>8747, +21938=>8748, +25793=>8749, +20653=>8750, +30320=>8751, +36404=>8752, +20778=>8753, +24962=>8754, +37109=>8755, +37438=>8756, +29494=>8757, +35480=>8758, +36671=>8759, +39192=>8760, +12226=>8761, +39770=>8761, +28417=>8762, +33287=>8763, +23996=>8764, +35486=>8765, +39729=>8766, +29508=>8767, +35709=>8768, +38928=>8769, +39341=>8770, +40219=>8771, +28149=>8772, +36677=>8773, +22290=>8774, +21729=>8775, +22291=>8776, +32227=>8777, +36960=>8778, +39000=>8779, +32004=>8780, +36493=>8781, +38000=>8782, +38322=>8783, +38642=>8784, +37142=>8785, +38549=>8786, +36939=>8787, +34292=>8788, +37270=>8789, +26248=>8790, +38620=>8791, +36617=>8792, +25890=>8793, +26283=>8794, +36106=>8795, +36124=>8796, +33247=>8797, +38015=>8798, +26839=>8799, +31432=>8800, +36012=>8801, +25799=>8802, +21063=>8803, +28580=>8804, +36042=>8805, +36104=>8806, +36555=>8807, +37720=>8808, +38296=>8809, +35408=>8810, +40779=>8811, +20661=>8812, +27656=>8813, +30430=>8814, +26028=>8815, +36670=>8816, +23940=>8817, +26855=>8818, +25136=>8819, +32187=>8820, +24373=>8821, +28466=>8822, +24115=>8823, +36076=>8824, +33081=>8825, +36249=>8826, +34756=>8827, +36685=>8828, +37754=>8829, +36889=>8830, +35998=>8831, +37341=>8832, +20597=>8833, +35386=>8834, +37806=>8835, +38499=>8836, +24128=>8837, +30309=>8838, +37165=>8839, +35657=>8840, +32340=>8841, +32887=>8842, +22519=>8843, +34937=>8844, +32025=>8845, +25711=>8846, +25842=>8847, +24159=>8848, +36074=>8849, +28399=>8850, +37912=>8851, +32066=>8852, +31278=>8853, +33131=>8854, +34886=>8855, +35589=>8856, +36600=>8857, +30394=>8858, +26205=>8859, +39519=>8860, +35576=>8861, +35461=>8862, +29165=>8863, +30682=>8864, +22225=>8865, +36015=>8866, +37956=>8867, +31689=>8868, +39376=>8869, +23560=>8870, +30938=>8871, +36681=>8872, +36090=>8873, +27137=>8874, +33674=>8875, +35037=>8876, +22941=>8877, +22767=>8878, +29376=>8879, +37648=>8880, +36101=>8881, +22684=>8882, +32180=>8883, +35524=>8884, +28310=>8885, +28609=>8886, +36039=>8887, +28460=>8888, +32156=>8889, +32317=>8890, +32305=>8891, +37138=>8892, +35419=>8893, +32068=>8894, +38013=>8895, +21959=>8896, +21401=>8897, +21428=>8898, +38760=>8899, +36107=>8900, +21293=>8901, +21297=>8902, +36094=>8903, +21060=>8904, +21132=>8905, +21108=>8906, +20660=>8907, +20480=>8908, +20630=>8909, +20757=>8910, +20738=>8911, +20756=>8912, +20796=>8913, +20791=>8914, +20712=>8915, +20674=>8916, +20795=>8917, +20752=>8918, +20794=>8919, +20681=>8920, +31988=>8921, +40652=>8922, +22213=>8923, +40172=>8924, +35131=>8925, +33248=>8926, +35329=>8927, +35344=>8928, +35340=>8929, +35349=>8930, +35635=>8931, +35406=>8932, +35365=>8933, +35393=>8934, +35382=>8935, +35398=>8936, +35412=>8937, +35416=>8938, +35410=>8939, +35462=>8940, +35460=>8941, +35455=>8942, +35440=>8943, +35452=>8944, +35445=>8945, +35436=>8946, +35438=>8947, +35533=>8948, +35554=>8949, +35425=>8950, +35482=>8951, +35493=>8952, +35473=>8953, +35474=>8954, +35535=>8955, +35537=>8956, +35529=>8957, +35547=>8958, +35543=>8959, +35522=>8960, +35510=>8961, +35574=>8962, +35563=>8963, +35604=>8964, +35585=>8965, +35556=>8966, +35565=>8967, +35580=>8968, +35571=>8969, +35558=>8970, +35566=>8971, +35550=>8972, +35624=>8973, +35740=>8974, +35606=>8975, +35610=>8976, +35600=>8977, +35627=>8978, +35629=>8979, +35670=>8980, +35673=>8981, +35662=>8982, +35742=>8983, +35691=>8984, +35734=>8985, +38488=>8986, +37178=>8987, +37140=>8988, +37172=>8989, +37087=>8990, +37174=>8991, +37126=>8992, +37192=>8993, +33467=>8994, +21233=>8995, +24048=>8996, +22538=>8997, +22745=>8998, +22754=>8999, +22752=>9000, +22746=>9001, +22497=>9002, +22607=>9003, +22550=>9004, +22610=>9005, +22557=>9006, +22628=>9007, +34188=>9008, +34131=>9009, +34294=>9010, +33703=>9011, +33799=>9012, +34031=>9013, +33511=>9014, +34338=>9015, +34086=>9016, +22603=>9017, +29026=>9018, +34136=>9019, +34045=>9020, +34126=>9021, +34184=>9022, +34234=>9023, +29334=>9024, +28366=>9025, +34113=>9026, +34254=>9027, +34130=>9028, +33984=>9029, +33874=>9030, +33892=>9031, +33940=>9032, +33845=>9033, +34207=>9034, +34133=>9035, +40367=>9036, +33939=>9037, +32264=>9038, +34118=>9039, +34146=>9040, +34078=>9041, +39488=>9042, +34362=>9043, +37795=>9044, +34167=>9045, +34334=>9046, +34298=>9047, +34308=>9048, +34282=>9049, +34330=>9050, +22889=>9051, +23607=>9052, +25451=>9053, +25718=>9054, +25759=>9055, +25681=>9056, +25692=>9057, +25779=>9058, +25860=>9059, +25878=>9060, +25847=>9061, +25852=>9062, +25883=>9063, +22064=>9064, +22072=>9065, +22216=>9066, +22182=>9067, +21764=>9068, +21692=>9069, +22144=>9070, +22109=>9071, +22112=>9072, +22069=>9073, +22006=>9074, +22118=>9075, +22130=>9076, +22156=>9077, +22117=>9078, +22044=>9079, +22062=>9080, +21993=>9081, +22038=>9082, +22208=>9083, +22029=>9084, +22195=>9085, +22209=>9086, +22127=>9087, +36705=>9088, +22198=>9089, +22165=>9090, +22279=>9091, +24131=>9092, +24172=>9093, +24152=>9094, +24151=>9095, +23943=>9096, +23796=>9097, +23888=>9098, +23852=>9099, +23975=>9100, +23968=>9101, +23959=>9102, +23821=>9103, +23992=>9104, +23937=>9105, +24020=>9106, +24480=>9107, +29559=>9108, +29505=>9109, +29546=>9110, +29499=>9111, +29547=>9112, +29568=>9113, +29564=>9114, +39136=>9115, +39219=>9116, +39145=>9117, +39228=>9118, +39146=>9119, +39147=>9120, +39149=>9121, +39156=>9122, +39177=>9123, +39185=>9124, +39195=>9125, +39223=>9126, +39231=>9127, +39235=>9128, +39240=>9129, +39241=>9130, +39242=>9131, +39244=>9132, +39266=>9133, +24289=>9134, +36065=>9135, +25082=>9136, +25006=>9137, +24938=>9138, +24894=>9139, +24757=>9140, +24884=>9141, +25036=>9142, +24927=>9143, +25064=>9144, +24827=>9145, +24887=>9146, +24818=>9147, +24947=>9148, +24860=>9149, +24978=>9150, +38274=>9151, +38278=>9152, +38344=>9153, +38286=>9154, +38292=>9155, +38284=>9156, +38373=>9157, +38317=>9158, +38315=>9159, +39726=>9160, +38316=>9161, +38334=>9162, +38326=>9163, +39721=>9164, +38335=>9165, +38333=>9166, +38332=>9167, +38339=>9168, +38347=>9169, +38356=>9170, +38352=>9171, +38357=>9172, +38366=>9173, +28739=>9174, +28505=>9175, +28711=>9176, +28696=>9177, +28668=>9178, +28039=>9179, +28025=>9180, +28254=>9181, +28590=>9182, +28687=>9183, +28408=>9184, +28527=>9185, +28150=>9186, +28543=>9187, +28678=>9188, +28576=>9189, +28683=>9190, +28775=>9191, +28740=>9192, +28677=>9193, +28535=>9194, +28704=>9195, +28703=>9196, +28722=>9197, +28712=>9198, +28765=>9199, +39467=>9200, +36999=>9201, +36885=>9202, +37008=>9203, +23656=>9204, +24371=>9205, +23285=>9206, +23255=>9207, +23296=>9208, +23149=>9209, +23304=>9210, +23372=>9211, +23207=>9212, +23291=>9213, +23307=>9214, +23329=>9215, +23338=>9216, +23321=>9217, +39380=>9218, +39391=>9219, +39385=>9220, +39478=>9221, +39515=>9222, +39377=>9223, +39384=>9224, +39501=>9225, +39498=>9226, +39394=>9227, +39530=>9228, +39439=>9229, +39437=>9230, +39429=>9231, +39490=>9232, +39469=>9233, +39446=>9234, +39489=>9235, +39470=>9236, +39480=>9237, +39491=>9238, +39492=>9239, +39503=>9240, +39525=>9241, +39524=>9242, +31993=>9243, +32006=>9244, +32002=>9245, +32007=>9246, +32008=>9247, +32394=>9248, +32028=>9249, +32021=>9250, +32019=>9251, +32058=>9252, +32050=>9253, +32049=>9254, +32272=>9255, +32060=>9256, +32064=>9257, +32063=>9258, +32093=>9259, +32078=>9260, +32115=>9261, +32134=>9262, +32131=>9263, +32136=>9264, +32190=>9265, +32186=>9266, +32203=>9267, +32212=>9268, +32196=>9269, +32158=>9270, +32172=>9271, +32185=>9272, +32163=>9273, +32176=>9274, +32199=>9275, +32217=>9276, +32215=>9277, +32249=>9278, +32242=>9279, +32354=>9280, +32230=>9281, +32246=>9282, +32241=>9283, +32267=>9284, +32225=>9285, +32265=>9286, +32285=>9287, +32287=>9288, +32286=>9289, +32301=>9290, +32266=>9291, +32273=>9292, +32381=>9293, +32313=>9294, +32309=>9295, +32306=>9296, +32326=>9297, +32325=>9298, +32392=>9299, +32346=>9300, +32338=>9301, +32366=>9302, +32382=>9303, +32368=>9304, +32367=>9305, +32408=>9306, +29859=>9307, +29771=>9308, +29903=>9309, +38922=>9310, +29885=>9311, +29759=>9312, +29833=>9313, +29862=>9314, +29908=>9315, +29914=>9316, +38873=>9317, +38878=>9318, +38876=>9319, +27050=>9320, +27370=>9321, +26776=>9322, +26838=>9323, +27141=>9324, +26783=>9325, +27355=>9326, +27379=>9327, +27368=>9328, +27359=>9329, +27273=>9330, +26895=>9331, +27208=>9332, +26984=>9333, +27071=>9334, +27194=>9335, +27292=>9336, +27410=>9337, +27422=>9338, +27357=>9339, +27111=>9340, +27407=>9341, +27414=>9342, +27372=>9343, +27354=>9344, +27384=>9345, +27315=>9346, +27367=>9347, +27299=>9348, +27347=>9349, +27358=>9350, +27556=>9351, +27550=>9352, +27566=>9353, +27563=>9354, +27567=>9355, +36564=>9356, +36571=>9357, +36594=>9358, +36603=>9359, +36708=>9360, +36601=>9361, +36604=>9362, +36587=>9363, +36580=>9364, +36706=>9365, +36602=>9366, +36606=>9367, +36618=>9368, +36615=>9369, +36613=>9370, +36626=>9371, +36646=>9372, +36638=>9373, +36639=>9374, +36636=>9375, +36659=>9376, +36678=>9377, +36692=>9378, +25108=>9379, +25127=>9380, +29964=>9381, +26311=>9382, +26308=>9383, +26249=>9384, +26326=>9385, +36033=>9386, +36016=>9387, +36026=>9388, +36029=>9389, +36100=>9390, +36018=>9391, +36037=>9392, +36112=>9393, +36049=>9394, +36058=>9395, +36053=>9396, +36075=>9397, +36071=>9398, +36091=>9399, +35224=>9400, +35244=>9401, +35233=>9402, +35263=>9403, +35238=>9404, +35247=>9405, +35250=>9406, +35255=>9407, +27647=>9408, +27660=>9409, +27692=>9410, +29272=>9411, +26407=>9412, +33110=>9413, +33242=>9414, +33051=>9415, +33214=>9416, +33121=>9417, +33231=>9418, +27487=>9419, +39086=>9420, +39087=>9421, +39094=>9422, +39100=>9423, +39110=>9424, +39112=>9425, +36674=>9426, +40783=>9427, +26005=>9428, +29036=>9429, +29010=>9430, +29079=>9431, +29121=>9432, +29148=>9433, +29182=>9434, +31152=>9435, +31118=>9436, +31146=>9437, +25055=>9438, +24932=>9439, +25059=>9440, +25095=>9441, +28585=>9442, +30959=>9443, +30893=>9444, +30824=>9445, +30904=>9446, +31018=>9447, +31025=>9448, +30820=>9449, +30973=>9450, +30951=>9451, +30947=>9452, +40853=>9453, +30616=>9454, +30558=>9455, +30652=>9456, +32646=>9457, +32648=>9458, +37330=>9459, +37331=>9460, +37332=>9461, +37337=>9462, +37335=>9463, +37333=>9464, +37367=>9465, +37351=>9466, +37348=>9467, +37702=>9468, +37365=>9469, +37369=>9470, +37384=>9471, +37414=>9472, +37445=>9473, +37393=>9474, +37392=>9475, +37377=>9476, +37415=>9477, +37380=>9478, +37413=>9479, +37376=>9480, +37434=>9481, +37478=>9482, +37431=>9483, +37427=>9484, +37461=>9485, +37437=>9486, +37432=>9487, +37470=>9488, +37484=>9489, +37485=>9490, +37439=>9491, +37984=>9492, +37424=>9493, +37449=>9494, +37448=>9495, +37453=>9496, +37422=>9497, +37433=>9498, +37944=>9499, +37548=>9500, +37536=>9501, +37498=>9502, +37546=>9503, +37614=>9504, +37583=>9505, +37891=>9506, +37603=>9507, +37946=>9508, +37553=>9509, +37542=>9510, +37799=>9511, +37526=>9512, +37580=>9513, +37545=>9514, +37877=>9515, +37523=>9516, +37503=>9517, +37801=>9518, +37530=>9519, +37658=>9520, +37547=>9521, +37507=>9522, +37899=>9523, +37544=>9524, +37539=>9525, +37906=>9526, +37688=>9527, +37617=>9528, +37847=>9529, +37605=>9530, +37616=>9531, +37615=>9532, +37608=>9533, +37564=>9534, +37597=>9535, +37622=>9536, +37926=>9537, +37927=>9538, +37571=>9539, +37599=>9540, +37606=>9541, +37650=>9542, +37638=>9543, +37737=>9544, +37659=>9545, +37696=>9546, +37633=>9547, +37653=>9548, +37678=>9549, +37699=>9550, +37639=>9551, +37640=>9552, +37663=>9553, +37657=>9554, +37733=>9555, +37703=>9556, +37750=>9557, +37716=>9558, +37732=>9559, +37802=>9560, +37744=>9561, +37764=>9562, +37860=>9563, +37848=>9564, +37928=>9565, +37767=>9566, +37836=>9567, +37784=>9568, +37816=>9569, +37823=>9570, +37798=>9571, +37808=>9572, +37813=>9573, +37964=>9574, +37858=>9575, +37852=>9576, +37853=>9577, +37837=>9578, +37854=>9579, +37827=>9580, +37831=>9581, +37841=>9582, +37908=>9583, +37917=>9584, +37879=>9585, +37989=>9586, +37907=>9587, +37997=>9588, +37920=>9589, +38009=>9590, +37881=>9591, +37913=>9592, +37962=>9593, +37938=>9594, +37951=>9595, +37972=>9596, +37987=>9597, +37758=>9598, +31329=>9599, +40169=>9600, +40182=>9601, +40199=>9602, +40198=>9603, +40227=>9604, +40327=>9605, +40469=>9606, +40221=>9607, +40223=>9608, +40421=>9609, +40239=>9610, +40409=>9611, +40240=>9612, +40258=>9613, +40478=>9614, +40275=>9615, +40477=>9616, +40288=>9617, +40274=>9618, +40435=>9619, +40284=>9620, +40289=>9621, +40339=>9622, +40298=>9623, +40303=>9624, +40329=>9625, +40344=>9626, +40346=>9627, +40384=>9628, +40357=>9629, +40361=>9630, +40386=>9631, +40380=>9632, +40474=>9633, +40403=>9634, +40410=>9635, +40431=>9636, +40422=>9637, +40434=>9638, +40440=>9639, +40460=>9640, +40442=>9641, +40475=>9642, +30308=>9643, +30296=>9644, +30311=>9645, +30210=>9646, +30278=>9647, +30279=>9648, +30281=>9649, +30238=>9650, +30267=>9651, +30317=>9652, +30318=>9653, +30313=>9654, +30322=>9655, +31431=>9656, +31414=>9657, +35168=>9658, +35123=>9659, +35165=>9660, +35143=>9661, +35128=>9662, +35172=>9663, +30392=>9664, +32814=>9665, +32812=>9666, +32889=>9667, +32885=>9668, +38919=>9669, +38926=>9670, +38927=>9671, +38945=>9672, +38940=>9673, +28481=>9674, +38950=>9675, +38967=>9676, +38990=>9677, +38995=>9678, +39027=>9679, +39010=>9680, +39001=>9681, +39013=>9682, +39020=>9683, +39024=>9684, +34787=>9685, +34822=>9686, +34566=>9687, +34851=>9688, +34806=>9689, +34554=>9690, +34799=>9691, +34692=>9692, +34832=>9693, +34760=>9694, +34833=>9695, +34747=>9696, +34766=>9697, +32588=>9698, +31716=>9699, +31591=>9700, +31849=>9701, +31731=>9702, +31744=>9703, +31691=>9704, +31836=>9705, +31774=>9706, +31787=>9707, +31779=>9708, +31850=>9709, +31839=>9710, +33380=>9711, +33387=>9712, +35018=>9713, +32677=>9714, +31986=>9715, +31990=>9716, +31965=>9717, +32310=>9718, +40617=>9719, +36274=>9720, +37317=>9721, +37315=>9722, +40570=>9723, +36489=>9724, +36428=>9725, +36498=>9726, +36474=>9727, +36437=>9728, +36506=>9729, +36491=>9730, +36499=>9731, +36497=>9732, +36513=>9733, +36451=>9734, +36522=>9735, +36518=>9736, +35316=>9737, +35318=>9738, +38746=>9739, +38722=>9740, +38717=>9741, +38724=>9742, +40788=>9743, +40799=>9744, +40793=>9745, +40800=>9746, +40796=>9747, +40806=>9748, +40812=>9749, +40810=>9750, +40823=>9751, +12236=>9752, +40701=>9752, +40703=>9753, +40713=>9754, +35726=>9755, +38014=>9756, +37864=>9757, +39799=>9758, +39796=>9759, +39809=>9760, +39811=>9761, +39822=>9762, +40056=>9763, +31308=>9764, +39826=>9765, +40031=>9766, +39824=>9767, +39853=>9768, +39834=>9769, +39850=>9770, +39838=>9771, +40045=>9772, +39851=>9773, +39837=>9774, +40024=>9775, +39873=>9776, +40058=>9777, +39985=>9778, +39993=>9779, +39971=>9780, +39991=>9781, +39872=>9782, +39882=>9783, +39879=>9784, +39933=>9785, +39894=>9786, +39914=>9787, +39915=>9788, +39905=>9789, +39908=>9790, +39911=>9791, +39901=>9792, +39906=>9793, +39920=>9794, +39899=>9795, +39924=>9796, +39892=>9797, +40029=>9798, +39944=>9799, +39952=>9800, +39949=>9801, +39954=>9802, +39945=>9803, +39935=>9804, +39968=>9805, +39986=>9806, +39981=>9807, +39976=>9808, +39973=>9809, +39977=>9810, +39987=>9811, +39998=>9812, +40008=>9813, +39995=>9814, +39989=>9815, +40005=>9816, +40022=>9817, +40020=>9818, +40018=>9819, +40039=>9820, +38851=>9821, +38845=>9822, +38857=>9823, +40379=>9824, +39631=>9825, +39638=>9826, +39637=>9827, +39768=>9828, +39758=>9829, +39255=>9830, +39260=>9831, +39714=>9832, +40695=>9833, +40690=>9834, +35180=>9835, +38342=>9836, +37686=>9837, +24390=>9838, +34068=>9839, +32404=>9840, +40803=>9841, +22137=>9842, +40725=>9843, +22081=>9844, +39662=>9845, +35079=>9846, +31296=>9847, +39091=>9848, +38308=>9849, +39693=>9850, +36852=>9851, +24409=>9852, +31339=>9853, +39138=>9854, +20642=>9855, +34193=>9856, +20760=>9857, +25458=>9858, +21067=>9859, +30543=>9860, +32397=>9861, +26310=>9862, +30637=>9863, +12228=>9864, +40565=>9864, +22217=>9865, +40692=>9866, +28635=>9867, +25054=>9868, +30663=>9869, +28720=>9870, +40629=>9871, +34890=>9872, +38370=>9873, +38854=>9874, +31844=>9875, +32308=>9876, +38822=>9877, +40623=>9878, +22220=>9879, +39089=>9880, +27311=>9881, +32590=>9882, +31984=>9883, +20418=>9884, +32363=>9885, +40569=>9886, +22190=>9887, +39706=>9888, +33903=>9889, +31142=>9890, +31858=>9891, +39634=>9892, +38587=>9893, +32251=>9894, +35069=>9895, +30787=>9896, +8560=>9897, +8561=>9898, +8562=>9899, +8563=>9900, +8564=>9901, +8565=>9902, +8566=>9903, +8567=>9904, +8568=>9905, +8569=>9906, +714=>9907, +715=>9908, +729=>9909, +8211=>9910, +8213=>9911, +8229=>9912, +8245=>9913, +8453=>9914, +8457=>9915, +8598=>9916, +8599=>9917, +8600=>9918, +8601=>9919, +8725=>9920, +8735=>9921, +8739=>9922, +8786=>9923, +8806=>9924, +8807=>9925, +8895=>9926, +9552=>9927, +9553=>9928, +9554=>9929, +9555=>9930, +9556=>9931, +9557=>9932, +9558=>9933, +9559=>9934, +9560=>9935, +9561=>9936, +9562=>9937, +9563=>9938, +9564=>9939, +9565=>9940, +9566=>9941, +9567=>9942, +9568=>9943, +9569=>9944, +9570=>9945, +9571=>9946, +9572=>9947, +9573=>9948, +9574=>9949, +9575=>9950, +9576=>9951, +9577=>9952, +9578=>9953, +9579=>9954, +9580=>9955, +9581=>9956, +9582=>9957, +9583=>9958, +9584=>9959, +9585=>9960, +9586=>9961, +9587=>9962, +9601=>9963, +9602=>9964, +9603=>9965, +9604=>9966, +9605=>9967, +9606=>9968, +9607=>9969, +9608=>9970, +9609=>9971, +9610=>9972, +9611=>9973, +9612=>9974, +9613=>9975, +9614=>9976, +9615=>9977, +9619=>9978, +9620=>9979, +9621=>9980, +9660=>9981, +9661=>9982, +9698=>9983, +9699=>9984, +9700=>9985, +9701=>9986, +9737=>9987, +8853=>9988, +12306=>9989, +12317=>9990, +12318=>9991, +12321=>9992, +12322=>9993, +12323=>9994, +12324=>9995, +12325=>9996, +12326=>9997, +12327=>9998, +12328=>9999, +12329=>10000, +12963=>10001, +13198=>10002, +13199=>10003, +13212=>10004, +13213=>10005, +13214=>10006, +13217=>10007, +13252=>10008, +13262=>10009, +13265=>10010, +13266=>10011, +13269=>10012, +65072=>10013, +65506=>10014, +65508=>10015, +8481=>10016, +12849=>10017, +8208=>10018, +12540=>10019, +12443=>10020, +12444=>10021, +12541=>10022, +12542=>10023, +12294=>10024, +12445=>10025, +12446=>10026, +65097=>10027, +65098=>10028, +65099=>10029, +65100=>10030, +65101=>10031, +65102=>10032, +65103=>10033, +65104=>10034, +65105=>10035, +65106=>10036, +65108=>10037, +65109=>10038, +65110=>10039, +65111=>10040, +65113=>10041, +65114=>10042, +65115=>10043, +65116=>10044, +65117=>10045, +65118=>10046, +65119=>10047, +65120=>10048, +65121=>10049, +65122=>10050, +65123=>10051, +65124=>10052, +65125=>10053, +65126=>10054, +65128=>10055, +65129=>10056, +65130=>10057, +65131=>10058, +12350=>10059, +59367=>10059, +12272=>10060, +59368=>10060, +12273=>10061, +59369=>10061, +12274=>10062, +59370=>10062, +12275=>10063, +59371=>10063, +12276=>10064, +59372=>10064, +12277=>10065, +59373=>10065, +12278=>10066, +59374=>10066, +12279=>10067, +59375=>10067, +12280=>10068, +59376=>10068, +12281=>10069, +59377=>10069, +12282=>10070, +59378=>10070, +12283=>10071, +59379=>10071, +19970=>10072, +19972=>10073, +19973=>10074, +19974=>10075, +19983=>10076, +19986=>10077, +19991=>10078, +19999=>10079, +20000=>10080, +20001=>10081, +20003=>10082, +20006=>10083, +20009=>10084, +20014=>10085, +20015=>10086, +20017=>10087, +20019=>10088, +20021=>10089, +20023=>10090, +20028=>10091, +20032=>10092, +20033=>10093, +20034=>10094, +20036=>10095, +20038=>10096, +20042=>10097, +20049=>10098, +20053=>10099, +20055=>10100, +20058=>10101, +20059=>10102, +20066=>10103, +20067=>10104, +20068=>10105, +20069=>10106, +20071=>10107, +20072=>10108, +20074=>10109, +20075=>10110, +20076=>10111, +20077=>10112, +20078=>10113, +20079=>10114, +20082=>10115, +20084=>10116, +20085=>10117, +20086=>10118, +20087=>10119, +20088=>10120, +20089=>10121, +20090=>10122, +20091=>10123, +20092=>10124, +20093=>10125, +20095=>10126, +20096=>10127, +20097=>10128, +20099=>10129, +20100=>10130, +12037=>10131, +20101=>10131, +20103=>10132, +20106=>10133, +20112=>10134, +20118=>10135, +20119=>10136, +20121=>10137, +20124=>10138, +20125=>10139, +20131=>10140, +20138=>10141, +20143=>10142, +20144=>10143, +20145=>10144, +20148=>10145, +20150=>10146, +20151=>10147, +20152=>10148, +20153=>10149, +20156=>10150, +20157=>10151, +20158=>10152, +20168=>10153, +20172=>10154, +20175=>10155, +20176=>10156, +20178=>10157, +20186=>10158, +20187=>10159, +20188=>10160, +20192=>10161, +20194=>10162, +20198=>10163, +20199=>10164, +20201=>10165, +20205=>10166, +20206=>10167, +20207=>10168, +20209=>10169, +20212=>10170, +20216=>10171, +20217=>10172, +20218=>10173, +20220=>10174, +20222=>10175, +20224=>10176, +20226=>10177, +20227=>10178, +20228=>10179, +20229=>10180, +20230=>10181, +20231=>10182, +20232=>10183, +20235=>10184, +20236=>10185, +20242=>10186, +20243=>10187, +20244=>10188, +20245=>10189, +20246=>10190, +20252=>10191, +20253=>10192, +20257=>10193, +20259=>10194, +20264=>10195, +20265=>10196, +20268=>10197, +20269=>10198, +20270=>10199, +20273=>10200, +20275=>10201, +20277=>10202, +20279=>10203, +20281=>10204, +20283=>10205, +20286=>10206, +20287=>10207, +20288=>10208, +20289=>10209, +20290=>10210, +20292=>10211, +20293=>10212, +20295=>10213, +20296=>10214, +20297=>10215, +20298=>10216, +20299=>10217, +20300=>10218, +20306=>10219, +20308=>10220, +20310=>10221, +20321=>10222, +20322=>10223, +20326=>10224, +20328=>10225, +20330=>10226, +20331=>10227, +20333=>10228, +20334=>10229, +20337=>10230, +20338=>10231, +20341=>10232, +20343=>10233, +20344=>10234, +20345=>10235, +20346=>10236, +20349=>10237, +20352=>10238, +20353=>10239, +20354=>10240, +20357=>10241, +20359=>10242, +20362=>10243, +20364=>10244, +20366=>10245, +20368=>10246, +20370=>10247, +20371=>10248, +20373=>10249, +20376=>10250, +20377=>10251, +20378=>10252, +20380=>10253, +20382=>10254, +20383=>10255, +20385=>10256, +20386=>10257, +20388=>10258, +20395=>10259, +20397=>10260, +20400=>10261, +20401=>10262, +20402=>10263, +20403=>10264, +20404=>10265, +20406=>10266, +20407=>10267, +20408=>10268, +20409=>10269, +20410=>10270, +20411=>10271, +20412=>10272, +20413=>10273, +20414=>10274, +20416=>10275, +20417=>10276, +20422=>10277, +20423=>10278, +20424=>10279, +20425=>10280, +20427=>10281, +20428=>10282, +20429=>10283, +20434=>10284, +20435=>10285, +20436=>10286, +20437=>10287, +20438=>10288, +20441=>10289, +20443=>10290, +20450=>10291, +20452=>10292, +20453=>10293, +20455=>10294, +20459=>10295, +20460=>10296, +20464=>10297, +20466=>10298, +20468=>10299, +20469=>10300, +20470=>10301, +20471=>10302, +20473=>10303, +20475=>10304, +20476=>10305, +20477=>10306, +20479=>10307, +20481=>10308, +20482=>10309, +20483=>10310, +20484=>10311, +20485=>10312, +20487=>10313, +20488=>10314, +20490=>10315, +20494=>10316, +20496=>10317, +20499=>10318, +20501=>10319, +20502=>10320, +20503=>10321, +20507=>10322, +20509=>10323, +20510=>10324, +20512=>10325, +20514=>10326, +20515=>10327, +20516=>10328, +20519=>10329, +20527=>10330, +20528=>10331, +20529=>10332, +20530=>10333, +20531=>10334, +20532=>10335, +20533=>10336, +20534=>10337, +20535=>10338, +20536=>10339, +20537=>10340, +20539=>10341, +20541=>10342, +20543=>10343, +20544=>10344, +20545=>10345, +20546=>10346, +20548=>10347, +20549=>10348, +20550=>10349, +20554=>10350, +20555=>10351, +20557=>10352, +20560=>10353, +20561=>10354, +20562=>10355, +20563=>10356, +20564=>10357, +20566=>10358, +20567=>10359, +20568=>10360, +20569=>10361, +20571=>10362, +20573=>10363, +20574=>10364, +20575=>10365, +20576=>10366, +20577=>10367, +20578=>10368, +20579=>10369, +20580=>10370, +20582=>10371, +20583=>10372, +20584=>10373, +20585=>10374, +20586=>10375, +20587=>10376, +20589=>10377, +20590=>10378, +20591=>10379, +20592=>10380, +20593=>10381, +20594=>10382, +20595=>10383, +20600=>10384, +20601=>10385, +20602=>10386, +20604=>10387, +20605=>10388, +20609=>10389, +20610=>10390, +20611=>10391, +20612=>10392, +20614=>10393, +20615=>10394, +20617=>10395, +20618=>10396, +20619=>10397, +20620=>10398, +20622=>10399, +20623=>10400, +20624=>10401, +20625=>10402, +20626=>10403, +20627=>10404, +20628=>10405, +20629=>10406, +20631=>10407, +20634=>10408, +20635=>10409, +20636=>10410, +20637=>10411, +20638=>10412, +20639=>10413, +20640=>10414, +20641=>10415, +20644=>10416, +20646=>10417, +20650=>10418, +20651=>10419, +20654=>10420, +20655=>10421, +20656=>10422, +20657=>10423, +20662=>10424, +20664=>10425, +20665=>10426, +20668=>10427, +20669=>10428, +20671=>10429, +20672=>10430, +20673=>10431, +20675=>10432, +20676=>10433, +20678=>10434, +20679=>10435, +20680=>10436, +20682=>10437, +20683=>10438, +20684=>10439, +20685=>10440, +20686=>10441, +20688=>10442, +20690=>10443, +20691=>10444, +20692=>10445, +20695=>10446, +20696=>10447, +20697=>10448, +20699=>10449, +20700=>10450, +20701=>10451, +20703=>10452, +20704=>10453, +20705=>10454, +20706=>10455, +20707=>10456, +20708=>10457, +20713=>10458, +20714=>10459, +20715=>10460, +20719=>10461, +20720=>10462, +20721=>10463, +20722=>10464, +20724=>10465, +20726=>10466, +20727=>10467, +20728=>10468, +20730=>10469, +20732=>10470, +20733=>10471, +20734=>10472, +20735=>10473, +20737=>10474, +20739=>10475, +20741=>10476, +20746=>10477, +20748=>10478, +20749=>10479, +20750=>10480, +20751=>10481, +20753=>10482, +20755=>10483, +20758=>10484, +20759=>10485, +20761=>10486, +20762=>10487, +20763=>10488, +20764=>10489, +20765=>10490, +20766=>10491, +20768=>10492, +20770=>10493, +20771=>10494, +20772=>10495, +20773=>10496, +20774=>10497, +20775=>10498, +20776=>10499, +20777=>10500, +20779=>10501, +20780=>10502, +20781=>10503, +20782=>10504, +20783=>10505, +20784=>10506, +20785=>10507, +20787=>10508, +20788=>10509, +20789=>10510, +20790=>10511, +20792=>10512, +20793=>10513, +20797=>10514, +20798=>10515, +20802=>10516, +20807=>10517, +20810=>10518, +20812=>10519, +20814=>10520, +20815=>10521, +20816=>10522, +20819=>10523, +20823=>10524, +20824=>10525, +20825=>10526, +20827=>10527, +20829=>10528, +20830=>10529, +20831=>10530, +20832=>10531, +20833=>10532, +20835=>10533, +20836=>10534, +20838=>10535, +20839=>10536, +20842=>10537, +20847=>10538, +20850=>10539, +20858=>10540, +20862=>10541, +20863=>10542, +20867=>10543, +20868=>10544, +20870=>10545, +20871=>10546, +20874=>10547, +20875=>10548, +20878=>10549, +20879=>10550, +20880=>10551, +20881=>10552, +20883=>10553, +20884=>10554, +20888=>10555, +20890=>10556, +20893=>10557, +20894=>10558, +20895=>10559, +20897=>10560, +20899=>10561, +20902=>10562, +20903=>10563, +20904=>10564, +20905=>10565, +20906=>10566, +20909=>10567, +20910=>10568, +20916=>10569, +20920=>10570, +20921=>10571, +20922=>10572, +20926=>10573, +20927=>10574, +20929=>10575, +20930=>10576, +20931=>10577, +20933=>10578, +20936=>10579, +20938=>10580, +20942=>10581, +20944=>10582, +20946=>10583, +20947=>10584, +20948=>10585, +20949=>10586, +20950=>10587, +20951=>10588, +20952=>10589, +20953=>10590, +20954=>10591, +20956=>10592, +20958=>10593, +20959=>10594, +20962=>10595, +20963=>10596, +20965=>10597, +20966=>10598, +20967=>10599, +20968=>10600, +20969=>10601, +20970=>10602, +20972=>10603, +20974=>10604, +20978=>10605, +20980=>10606, +20983=>10607, +20990=>10608, +20996=>10609, +20997=>10610, +21001=>10611, +21003=>10612, +21004=>10613, +21007=>10614, +21008=>10615, +21011=>10616, +21012=>10617, +21013=>10618, +21020=>10619, +21022=>10620, +21023=>10621, +21025=>10622, +21026=>10623, +21027=>10624, +21029=>10625, +21030=>10626, +21031=>10627, +21034=>10628, +21036=>10629, +21039=>10630, +21041=>10631, +21042=>10632, +21044=>10633, +21045=>10634, +21052=>10635, +21054=>10636, +21061=>10637, +21062=>10638, +21064=>10639, +21065=>10640, +21070=>10641, +21071=>10642, +21074=>10643, +21075=>10644, +21077=>10645, +21079=>10646, +21080=>10647, +21081=>10648, +21082=>10649, +21085=>10650, +21087=>10651, +21088=>10652, +21090=>10653, +21091=>10654, +21092=>10655, +21094=>10656, +21096=>10657, +21099=>10658, +21100=>10659, +21101=>10660, +21104=>10661, +21105=>10662, +21107=>10663, +21110=>10664, +21111=>10665, +21112=>10666, +21113=>10667, +21114=>10668, +21115=>10669, +21116=>10670, +21118=>10671, +21120=>10672, +21124=>10673, +21125=>10674, +21126=>10675, +21131=>10676, +21134=>10677, +21135=>10678, +21138=>10679, +21140=>10680, +21141=>10681, +21142=>10682, +21143=>10683, +21144=>10684, +21145=>10685, +21146=>10686, +21148=>10687, +21156=>10688, +21157=>10689, +21158=>10690, +21159=>10691, +21166=>10692, +21167=>10693, +21168=>10694, +21172=>10695, +21173=>10696, +21174=>10697, +21175=>10698, +21176=>10699, +21177=>10700, +21178=>10701, +21179=>10702, +21180=>10703, +21181=>10704, +21184=>10705, +21186=>10706, +21188=>10707, +21189=>10708, +21190=>10709, +21192=>10710, +21194=>10711, +21196=>10712, +21197=>10713, +21198=>10714, +21199=>10715, +21201=>10716, +21203=>10717, +21204=>10718, +21207=>10719, +21210=>10720, +21212=>10721, +21216=>10722, +21217=>10723, +21219=>10724, +21221=>10725, +21222=>10726, +21223=>10727, +21224=>10728, +21225=>10729, +21226=>10730, +21227=>10731, +21228=>10732, +21229=>10733, +21230=>10734, +21231=>10735, +21234=>10736, +21235=>10737, +21236=>10738, +21238=>10739, +21239=>10740, +21243=>10741, +21244=>10742, +21245=>10743, +21249=>10744, +21250=>10745, +21251=>10746, +21252=>10747, +21255=>10748, +21257=>10749, +21258=>10750, +21259=>10751, +21260=>10752, +21262=>10753, +21265=>10754, +21266=>10755, +21267=>10756, +21268=>10757, +21272=>10758, +21275=>10759, +21276=>10760, +21278=>10761, +21279=>10762, +21282=>10763, +21284=>10764, +21285=>10765, +21287=>10766, +21288=>10767, +21289=>10768, +21291=>10769, +21292=>10770, +21296=>10771, +21298=>10772, +21299=>10773, +21300=>10774, +21301=>10775, +21302=>10776, +21303=>10777, +12054=>10778, +21304=>10778, +21308=>10779, +21309=>10780, +21314=>10781, +21316=>10782, +21318=>10783, +21323=>10784, +21324=>10785, +21325=>10786, +21328=>10787, +21336=>10788, +21337=>10789, +21339=>10790, +21341=>10791, +21349=>10792, +21352=>10793, +21354=>10794, +21356=>10795, +21357=>10796, +21362=>10797, +21366=>10798, +21369=>10799, +21371=>10800, +21372=>10801, +21373=>10802, +21374=>10803, +21376=>10804, +21377=>10805, +21379=>10806, +21383=>10807, +21384=>10808, +21386=>10809, +21390=>10810, +21391=>10811, +21392=>10812, +21393=>10813, +21394=>10814, +21395=>10815, +21396=>10816, +21398=>10817, +21399=>10818, +21403=>10819, +21404=>10820, +21406=>10821, +21409=>10822, +21412=>10823, +21415=>10824, +21418=>10825, +21419=>10826, +21420=>10827, +21423=>10828, +21424=>10829, +21425=>10830, +21427=>10831, +21429=>10832, +21431=>10833, +21432=>10834, +21433=>10835, +21434=>10836, +21436=>10837, +21437=>10838, +21438=>10839, +21440=>10840, +21444=>10841, +21445=>10842, +21446=>10843, +21447=>10844, +21454=>10845, +21455=>10846, +21456=>10847, +21458=>10848, +21459=>10849, +21461=>10850, +21466=>10851, +21468=>10852, +21469=>10853, +21470=>10854, +21473=>10855, +21479=>10856, +21492=>10857, +21498=>10858, +21502=>10859, +21503=>10860, +21504=>10861, +21506=>10862, +21509=>10863, +21511=>10864, +21515=>10865, +21524=>10866, +21528=>10867, +21529=>10868, +21530=>10869, +21532=>10870, +21538=>10871, +21540=>10872, +21541=>10873, +21546=>10874, +21552=>10875, +21555=>10876, +21558=>10877, +21559=>10878, +21562=>10879, +21565=>10880, +21567=>10881, +21569=>10882, +21570=>10883, +21572=>10884, +21573=>10885, +21575=>10886, +21577=>10887, +21580=>10888, +21581=>10889, +21582=>10890, +21583=>10891, +21585=>10892, +21594=>10893, +21597=>10894, +21598=>10895, +21599=>10896, +21600=>10897, +21601=>10898, +21603=>10899, +21605=>10900, +21607=>10901, +21609=>10902, +21610=>10903, +21611=>10904, +21612=>10905, +21613=>10906, +21614=>10907, +21615=>10908, +21616=>10909, +21620=>10910, +21625=>10911, +21626=>10912, +21630=>10913, +21631=>10914, +21633=>10915, +21635=>10916, +21637=>10917, +21639=>10918, +21640=>10919, +21641=>10920, +21642=>10921, +21645=>10922, +21649=>10923, +21651=>10924, +21655=>10925, +21656=>10926, +21660=>10927, +21662=>10928, +21663=>10929, +21664=>10930, +21665=>10931, +21666=>10932, +21669=>10933, +21678=>10934, +21680=>10935, +21682=>10936, +21685=>10937, +21686=>10938, +21687=>10939, +21689=>10940, +21690=>10941, +21694=>10942, +21699=>10943, +21701=>10944, +21706=>10945, +21707=>10946, +21718=>10947, +21720=>10948, +21723=>10949, +21728=>10950, +21730=>10951, +21731=>10952, +21732=>10953, +21739=>10954, +21740=>10955, +21743=>10956, +21744=>10957, +21745=>10958, +21748=>10959, +21749=>10960, +21750=>10961, +21751=>10962, +21752=>10963, +21753=>10964, +21755=>10965, +21758=>10966, +21760=>10967, +21762=>10968, +21763=>10969, +21765=>10970, +21768=>10971, +21770=>10972, +21771=>10973, +21772=>10974, +21773=>10975, +21774=>10976, +21778=>10977, +21779=>10978, +21781=>10979, +21782=>10980, +21783=>10981, +21784=>10982, +21785=>10983, +21786=>10984, +21788=>10985, +21789=>10986, +21790=>10987, +21791=>10988, +21793=>10989, +21797=>10990, +21798=>10991, +21800=>10992, +21801=>10993, +21803=>10994, +21805=>10995, +21810=>10996, +21812=>10997, +21813=>10998, +21814=>10999, +21816=>11000, +21817=>11001, +21818=>11002, +21819=>11003, +21821=>11004, +21824=>11005, +21826=>11006, +21829=>11007, +21831=>11008, +21832=>11009, +21835=>11010, +21836=>11011, +21837=>11012, +21838=>11013, +21841=>11014, +21842=>11015, +21844=>11016, +21847=>11017, +21848=>11018, +21849=>11019, +21850=>11020, +21851=>11021, +21853=>11022, +21855=>11023, +21856=>11024, +21858=>11025, +21859=>11026, +21864=>11027, +21865=>11028, +21867=>11029, +21871=>11030, +21872=>11031, +21873=>11032, +21874=>11033, +21875=>11034, +21876=>11035, +21881=>11036, +21882=>11037, +21885=>11038, +21887=>11039, +21893=>11040, +21894=>11041, +21900=>11042, +21901=>11043, +21902=>11044, +21904=>11045, +21906=>11046, +21907=>11047, +21909=>11048, +21910=>11049, +21911=>11050, +21914=>11051, +21915=>11052, +21918=>11053, +21920=>11054, +21921=>11055, +21922=>11056, +21923=>11057, +21924=>11058, +21925=>11059, +21926=>11060, +21928=>11061, +21929=>11062, +21931=>11063, +21933=>11064, +21935=>11065, +21936=>11066, +21940=>11067, +21942=>11068, +21944=>11069, +21946=>11070, +21948=>11071, +21951=>11072, +21952=>11073, +21953=>11074, +21954=>11075, +21955=>11076, +21960=>11077, +21962=>11078, +21963=>11079, +21967=>11080, +21968=>11081, +21973=>11082, +21975=>11083, +21976=>11084, +21977=>11085, +21979=>11086, +21982=>11087, +21984=>11088, +21986=>11089, +21991=>11090, +21997=>11091, +21998=>11092, +22000=>11093, +22001=>11094, +22004=>11095, +22008=>11096, +22009=>11097, +22010=>11098, +22011=>11099, +22012=>11100, +22015=>11101, +22018=>11102, +22019=>11103, +22020=>11104, +22021=>11105, +22023=>11106, +22026=>11107, +22027=>11108, +22032=>11109, +22033=>11110, +22034=>11111, +22035=>11112, +22037=>11113, +22041=>11114, +22042=>11115, +22045=>11116, +22048=>11117, +22049=>11118, +22050=>11119, +22053=>11120, +22054=>11121, +22056=>11122, +22058=>11123, +22059=>11124, +22067=>11125, +22071=>11126, +22074=>11127, +22076=>11128, +22077=>11129, +22078=>11130, +22080=>11131, +22082=>11132, +22083=>11133, +22084=>11134, +22085=>11135, +22086=>11136, +22087=>11137, +22088=>11138, +22089=>11139, +22090=>11140, +22091=>11141, +22095=>11142, +22096=>11143, +22097=>11144, +22098=>11145, +22099=>11146, +22101=>11147, +22102=>11148, +22106=>11149, +22107=>11150, +22110=>11151, +22111=>11152, +22113=>11153, +22115=>11154, +22119=>11155, +22125=>11156, +22126=>11157, +22128=>11158, +22131=>11159, +22133=>11160, +22135=>11161, +22138=>11162, +22141=>11163, +22142=>11164, +22143=>11165, +22145=>11166, +22146=>11167, +22147=>11168, +22148=>11169, +22152=>11170, +22153=>11171, +22154=>11172, +22155=>11173, +22157=>11174, +22160=>11175, +22161=>11176, +22162=>11177, +22164=>11178, +22166=>11179, +22167=>11180, +22168=>11181, +22170=>11182, +22171=>11183, +22172=>11184, +22173=>11185, +22174=>11186, +22175=>11187, +22176=>11188, +22177=>11189, +22178=>11190, +22180=>11191, +22181=>11192, +22183=>11193, +22185=>11194, +22186=>11195, +22187=>11196, +22188=>11197, +22189=>11198, +22192=>11199, +22193=>11200, +22194=>11201, +22197=>11202, +22200=>11203, +22201=>11204, +22202=>11205, +22203=>11206, +22205=>11207, +22206=>11208, +22207=>11209, +22211=>11210, +22212=>11211, +22214=>11212, +22215=>11213, +22219=>11214, +22221=>11215, +22222=>11216, +22223=>11217, +22224=>11218, +22226=>11219, +22227=>11220, +22229=>11221, +22230=>11222, +22232=>11223, +22233=>11224, +22236=>11225, +22243=>11226, +22245=>11227, +22246=>11228, +22247=>11229, +22248=>11230, +22249=>11231, +22250=>11232, +22252=>11233, +22254=>11234, +22255=>11235, +22258=>11236, +22259=>11237, +22262=>11238, +22263=>11239, +22264=>11240, +22267=>11241, +22268=>11242, +22272=>11243, +22273=>11244, +22274=>11245, +22277=>11246, +22284=>11247, +22286=>11248, +22287=>11249, +22288=>11250, +22289=>11251, +22292=>11252, +22293=>11253, +22295=>11254, +22297=>11255, +22298=>11256, +22299=>11257, +22301=>11258, +22302=>11259, +22304=>11260, +22305=>11261, +22306=>11262, +22308=>11263, +22309=>11264, +22310=>11265, +22311=>11266, +22315=>11267, +22321=>11268, +22322=>11269, +22324=>11270, +22325=>11271, +22326=>11272, +22327=>11273, +22328=>11274, +22332=>11275, +22333=>11276, +22335=>11277, +22337=>11278, +22339=>11279, +22340=>11280, +22341=>11281, +22342=>11282, +22344=>11283, +22345=>11284, +22347=>11285, +22354=>11286, +22355=>11287, +22356=>11288, +22357=>11289, +22358=>11290, +22360=>11291, +22361=>11292, +22370=>11293, +22371=>11294, +22373=>11295, +22375=>11296, +22380=>11297, +22382=>11298, +22384=>11299, +22385=>11300, +22386=>11301, +22388=>11302, +22389=>11303, +22392=>11304, +22393=>11305, +22394=>11306, +22397=>11307, +22398=>11308, +22399=>11309, +22400=>11310, +22401=>11311, +22407=>11312, +22408=>11313, +22409=>11314, +22410=>11315, +22413=>11316, +22414=>11317, +22415=>11318, +22416=>11319, +22417=>11320, +22420=>11321, +22421=>11322, +22422=>11323, +22423=>11324, +22424=>11325, +22425=>11326, +22426=>11327, +22428=>11328, +22429=>11329, +22430=>11330, +22431=>11331, +22437=>11332, +22440=>11333, +22442=>11334, +22444=>11335, +22447=>11336, +22448=>11337, +22449=>11338, +22451=>11339, +22453=>11340, +22454=>11341, +22455=>11342, +22457=>11343, +22458=>11344, +22459=>11345, +22460=>11346, +22461=>11347, +22462=>11348, +22463=>11349, +22464=>11350, +22465=>11351, +22468=>11352, +22469=>11353, +22470=>11354, +22471=>11355, +22472=>11356, +22473=>11357, +22474=>11358, +22476=>11359, +22477=>11360, +22480=>11361, +22481=>11362, +22483=>11363, +22486=>11364, +22487=>11365, +22491=>11366, +22492=>11367, +22494=>11368, +22498=>11369, +22499=>11370, +22501=>11371, +22502=>11372, +22503=>11373, +22504=>11374, +22505=>11375, +22506=>11376, +22507=>11377, +22508=>11378, +22510=>11379, +22512=>11380, +22513=>11381, +22514=>11382, +22515=>11383, +22517=>11384, +22518=>11385, +22523=>11386, +22524=>11387, +22526=>11388, +22527=>11389, +22529=>11390, +22531=>11391, +22532=>11392, +22536=>11393, +22537=>11394, +22540=>11395, +22542=>11396, +22543=>11397, +22544=>11398, +22546=>11399, +22547=>11400, +22548=>11401, +22551=>11402, +22552=>11403, +22554=>11404, +22555=>11405, +22556=>11406, +22559=>11407, +22562=>11408, +22563=>11409, +22565=>11410, +22566=>11411, +22567=>11412, +22568=>11413, +22569=>11414, +22571=>11415, +22572=>11416, +22573=>11417, +22574=>11418, +22578=>11419, +22579=>11420, +22582=>11421, +22583=>11422, +22584=>11423, +22585=>11424, +22586=>11425, +22587=>11426, +22588=>11427, +22589=>11428, +22590=>11429, +22591=>11430, +22592=>11431, +22593=>11432, +22594=>11433, +22595=>11434, +22597=>11435, +22598=>11436, +22599=>11437, +22600=>11438, +22601=>11439, +22606=>11440, +22608=>11441, +22611=>11442, +22613=>11443, +22614=>11444, +22617=>11445, +22618=>11446, +22619=>11447, +22620=>11448, +22621=>11449, +22623=>11450, +22624=>11451, +22625=>11452, +22627=>11453, +22630=>11454, +22631=>11455, +22632=>11456, +22633=>11457, +22634=>11458, +22637=>11459, +22638=>11460, +22639=>11461, +22640=>11462, +22641=>11463, +22642=>11464, +22643=>11465, +22644=>11466, +22646=>11467, +22647=>11468, +22648=>11469, +22650=>11470, +22651=>11471, +22652=>11472, +22653=>11473, +22655=>11474, +22658=>11475, +22660=>11476, +22662=>11477, +22663=>11478, +22664=>11479, +22667=>11480, +22668=>11481, +22669=>11482, +22670=>11483, +22671=>11484, +22672=>11485, +22673=>11486, +22676=>11487, +22677=>11488, +22678=>11489, +22679=>11490, +22680=>11491, +22683=>11492, +22685=>11493, +22688=>11494, +22689=>11495, +22690=>11496, +22691=>11497, +22692=>11498, +22693=>11499, +22694=>11500, +22695=>11501, +22698=>11502, +22699=>11503, +22700=>11504, +22701=>11505, +22703=>11506, +22704=>11507, +22705=>11508, +22706=>11509, +22708=>11510, +22709=>11511, +22710=>11512, +22711=>11513, +22712=>11514, +22713=>11515, +22714=>11516, +22717=>11517, +22719=>11518, +22720=>11519, +22722=>11520, +22723=>11521, +22724=>11522, +22726=>11523, +22728=>11524, +22729=>11525, +22730=>11526, +22731=>11527, +22732=>11528, +22733=>11529, +22734=>11530, +22735=>11531, +22736=>11532, +22738=>11533, +22740=>11534, +22742=>11535, +22743=>11536, +22747=>11537, +22748=>11538, +22749=>11539, +22753=>11540, +22755=>11541, +22757=>11542, +22758=>11543, +22759=>11544, +22760=>11545, +22762=>11546, +22765=>11547, +22769=>11548, +22770=>11549, +22772=>11550, +22773=>11551, +22775=>11552, +22776=>11553, +22779=>11554, +22780=>11555, +22782=>11556, +22783=>11557, +22784=>11558, +22785=>11559, +22787=>11560, +22789=>11561, +22790=>11562, +22792=>11563, +22793=>11564, +12066=>11565, +22794=>11565, +22795=>11566, +22796=>11567, +22798=>11568, +22800=>11569, +22801=>11570, +22802=>11571, +22803=>11572, +22807=>11573, +22808=>11574, +22811=>11575, +22813=>11576, +22814=>11577, +22816=>11578, +22817=>11579, +22819=>11580, +22822=>11581, +22824=>11582, +22828=>11583, +22832=>11584, +22834=>11585, +22835=>11586, +22837=>11587, +22838=>11588, +22843=>11589, +22845=>11590, +22847=>11591, +22848=>11592, +22851=>11593, +22853=>11594, +22854=>11595, +22858=>11596, +22860=>11597, +22861=>11598, +22864=>11599, +22866=>11600, +22867=>11601, +22873=>11602, +22875=>11603, +22876=>11604, +22877=>11605, +22878=>11606, +22879=>11607, +22881=>11608, +22883=>11609, +22884=>11610, +22886=>11611, +22887=>11612, +22888=>11613, +22891=>11614, +22893=>11615, +22895=>11616, +22896=>11617, +22897=>11618, +22898=>11619, +22901=>11620, +22903=>11621, +22906=>11622, +22907=>11623, +22908=>11624, +22910=>11625, +22911=>11626, +22912=>11627, +22917=>11628, +22921=>11629, +22923=>11630, +22924=>11631, +22926=>11632, +22927=>11633, +22928=>11634, +22929=>11635, +22932=>11636, +22933=>11637, +22936=>11638, +22938=>11639, +22939=>11640, +22940=>11641, +22943=>11642, +22944=>11643, +22945=>11644, +22946=>11645, +22950=>11646, +22951=>11647, +22956=>11648, +22957=>11649, +22960=>11650, +22961=>11651, +22963=>11652, +22964=>11653, +22965=>11654, +22966=>11655, +22967=>11656, +22968=>11657, +22970=>11658, +22972=>11659, +22973=>11660, +22975=>11661, +22976=>11662, +22977=>11663, +22978=>11664, +22979=>11665, +22980=>11666, +22981=>11667, +22983=>11668, +22984=>11669, +22985=>11670, +22988=>11671, +22989=>11672, +22990=>11673, +22991=>11674, +22997=>11675, +22998=>11676, +23001=>11677, +23003=>11678, +23006=>11679, +23007=>11680, +23008=>11681, +23009=>11682, +23010=>11683, +23012=>11684, +23014=>11685, +23015=>11686, +23017=>11687, +23018=>11688, +23019=>11689, +23021=>11690, +23022=>11691, +23023=>11692, +23024=>11693, +23025=>11694, +23026=>11695, +23027=>11696, +23028=>11697, +23029=>11698, +23030=>11699, +23031=>11700, +23032=>11701, +23034=>11702, +23036=>11703, +23037=>11704, +23038=>11705, +23040=>11706, +23042=>11707, +23050=>11708, +23051=>11709, +23053=>11710, +23054=>11711, +23055=>11712, +23056=>11713, +23058=>11714, +23060=>11715, +23061=>11716, +23062=>11717, +23063=>11718, +23065=>11719, +23066=>11720, +23067=>11721, +23069=>11722, +23070=>11723, +23073=>11724, +23074=>11725, +23076=>11726, +23078=>11727, +23079=>11728, +23080=>11729, +23082=>11730, +23083=>11731, +23084=>11732, +23085=>11733, +23086=>11734, +23087=>11735, +23088=>11736, +23091=>11737, +23093=>11738, +23095=>11739, +23096=>11740, +23097=>11741, +23098=>11742, +23099=>11743, +23101=>11744, +23102=>11745, +23103=>11746, +23106=>11747, +23107=>11748, +23108=>11749, +23109=>11750, +23111=>11751, +23112=>11752, +23115=>11753, +23116=>11754, +23117=>11755, +23118=>11756, +23119=>11757, +23120=>11758, +23121=>11759, +23122=>11760, +23123=>11761, +23124=>11762, +23126=>11763, +23127=>11764, +23128=>11765, +23129=>11766, +23131=>11767, +23132=>11768, +23133=>11769, +23134=>11770, +23135=>11771, +23136=>11772, +23137=>11773, +23139=>11774, +23140=>11775, +23141=>11776, +23144=>11777, +23145=>11778, +23147=>11779, +23148=>11780, +23150=>11781, +23151=>11782, +23152=>11783, +23153=>11784, +23154=>11785, +23155=>11786, +23160=>11787, +23161=>11788, +23163=>11789, +23164=>11790, +23165=>11791, +23166=>11792, +23168=>11793, +23169=>11794, +23170=>11795, +23171=>11796, +23172=>11797, +23173=>11798, +23174=>11799, +23175=>11800, +23176=>11801, +23177=>11802, +23178=>11803, +23179=>11804, +23180=>11805, +23181=>11806, +23182=>11807, +23183=>11808, +23184=>11809, +23185=>11810, +23187=>11811, +23188=>11812, +23189=>11813, +23190=>11814, +23191=>11815, +23192=>11816, +23193=>11817, +23196=>11818, +23197=>11819, +23198=>11820, +23199=>11821, +23200=>11822, +23201=>11823, +23202=>11824, +23203=>11825, +23204=>11826, +23205=>11827, +23206=>11828, +23208=>11829, +23209=>11830, +23211=>11831, +23212=>11832, +23213=>11833, +23214=>11834, +23215=>11835, +23216=>11836, +23217=>11837, +23220=>11838, +23222=>11839, +23223=>11840, +23225=>11841, +23226=>11842, +23227=>11843, +23228=>11844, +23231=>11845, +23232=>11846, +23235=>11847, +23236=>11848, +23237=>11849, +23238=>11850, +23239=>11851, +23240=>11852, +23242=>11853, +23243=>11854, +23245=>11855, +23246=>11856, +23247=>11857, +23248=>11858, +23249=>11859, +23251=>11860, +23253=>11861, +23257=>11862, +23258=>11863, +23259=>11864, +23261=>11865, +23262=>11866, +23263=>11867, +23266=>11868, +23268=>11869, +23269=>11870, +23271=>11871, +23272=>11872, +23274=>11873, +23276=>11874, +23277=>11875, +23278=>11876, +23279=>11877, +23280=>11878, +23282=>11879, +23283=>11880, +23284=>11881, +23286=>11882, +23287=>11883, +23288=>11884, +23289=>11885, +23290=>11886, +23292=>11887, +23293=>11888, +23294=>11889, +23295=>11890, +23297=>11891, +23298=>11892, +23299=>11893, +23300=>11894, +23301=>11895, +23302=>11896, +23303=>11897, +23306=>11898, +23309=>11899, +23310=>11900, +23311=>11901, +23312=>11902, +23313=>11903, +23314=>11904, +23315=>11905, +23316=>11906, +23317=>11907, +23320=>11908, +23322=>11909, +23323=>11910, +23324=>11911, +23325=>11912, +23326=>11913, +23327=>11914, +23328=>11915, +23330=>11916, +23331=>11917, +23332=>11918, +23333=>11919, +23334=>11920, +23335=>11921, +23336=>11922, +23337=>11923, +23339=>11924, +23340=>11925, +23341=>11926, +23342=>11927, +23343=>11928, +23345=>11929, +23347=>11930, +23349=>11931, +23350=>11932, +23353=>11933, +23354=>11934, +23355=>11935, +23356=>11936, +23357=>11937, +23358=>11938, +23359=>11939, +23361=>11940, +23362=>11941, +23363=>11942, +23364=>11943, +23365=>11944, +23366=>11945, +23367=>11946, +23368=>11947, +23369=>11948, +23370=>11949, +23371=>11950, +23373=>11951, +23374=>11952, +23375=>11953, +23378=>11954, +23382=>11955, +23390=>11956, +23392=>11957, +23393=>11958, +23399=>11959, +23400=>11960, +23405=>11961, +23406=>11962, +23407=>11963, +23410=>11964, +23412=>11965, +23414=>11966, +23415=>11967, +23417=>11968, +23419=>11969, +23420=>11970, +23422=>11971, +23426=>11972, +23430=>11973, +23434=>11974, +23437=>11975, +23438=>11976, +23440=>11977, +23441=>11978, +23442=>11979, +23444=>11980, +23446=>11981, +23455=>11982, +23463=>11983, +23464=>11984, +23465=>11985, +23468=>11986, +23469=>11987, +23470=>11988, +23471=>11989, +23473=>11990, +23474=>11991, +23479=>11992, +23482=>11993, +23483=>11994, +23484=>11995, +23488=>11996, +23489=>11997, +23491=>11998, +23496=>11999, +23497=>12000, +23498=>12001, +23499=>12002, +23501=>12003, +23502=>12004, +23503=>12005, +23505=>12006, +23508=>12007, +23509=>12008, +23510=>12009, +23511=>12010, +23512=>12011, +23513=>12012, +23514=>12013, +23515=>12014, +23516=>12015, +23520=>12016, +23523=>12017, +23530=>12018, +23533=>12019, +23535=>12020, +23537=>12021, +23538=>12022, +23539=>12023, +23540=>12024, +23543=>12025, +23549=>12026, +23550=>12027, +23552=>12028, +23554=>12029, +23555=>12030, +23557=>12031, +23564=>12032, +23568=>12033, +23570=>12034, +23571=>12035, +23575=>12036, +23577=>12037, +23579=>12038, +23582=>12039, +23583=>12040, +23584=>12041, +23585=>12042, +23587=>12043, +23590=>12044, +23592=>12045, +23593=>12046, +23594=>12047, +23595=>12048, +23597=>12049, +23598=>12050, +23599=>12051, +23600=>12052, +23602=>12053, +23603=>12054, +23605=>12055, +23606=>12056, +23619=>12057, +23620=>12058, +23622=>12059, +23623=>12060, +23628=>12061, +23629=>12062, +23634=>12063, +23635=>12064, +23636=>12065, +23638=>12066, +23639=>12067, +23640=>12068, +23642=>12069, +23643=>12070, +23644=>12071, +23645=>12072, +23647=>12073, +23655=>12074, +23657=>12075, +23658=>12076, +23659=>12077, +23661=>12078, +23664=>12079, +23666=>12080, +23667=>12081, +23668=>12082, +23669=>12083, +23670=>12084, +23671=>12085, +23672=>12086, +23675=>12087, +23676=>12088, +23677=>12089, +23678=>12090, +23680=>12091, +23683=>12092, +23684=>12093, +23685=>12094, +23686=>12095, +23687=>12096, +23689=>12097, +23690=>12098, +23691=>12099, +23694=>12100, +23695=>12101, +23698=>12102, +23699=>12103, +23701=>12104, +23709=>12105, +23710=>12106, +23711=>12107, +23712=>12108, +23716=>12109, +23717=>12110, +23718=>12111, +23719=>12112, +23720=>12113, +23722=>12114, +23726=>12115, +23727=>12116, +23728=>12117, +23730=>12118, +23732=>12119, +23734=>12120, +23737=>12121, +23738=>12122, +23739=>12123, +23740=>12124, +23742=>12125, +23744=>12126, +23746=>12127, +23747=>12128, +23749=>12129, +23750=>12130, +23751=>12131, +23752=>12132, +23753=>12133, +23754=>12134, +23756=>12135, +23757=>12136, +23758=>12137, +23759=>12138, +23760=>12139, +23761=>12140, +23763=>12141, +23764=>12142, +23765=>12143, +23766=>12144, +23767=>12145, +23768=>12146, +23770=>12147, +23771=>12148, +23772=>12149, +23773=>12150, +23774=>12151, +23775=>12152, +23776=>12153, +23778=>12154, +23779=>12155, +23783=>12156, +23785=>12157, +23787=>12158, +23788=>12159, +23790=>12160, +23791=>12161, +23793=>12162, +23794=>12163, +23795=>12164, +23797=>12165, +23799=>12166, +23800=>12167, +23801=>12168, +23802=>12169, +23804=>12170, +23806=>12171, +23807=>12172, +23808=>12173, +23809=>12174, +23812=>12175, +23813=>12176, +23816=>12177, +23817=>12178, +23818=>12179, +23819=>12180, +23820=>12181, +23823=>12182, +23824=>12183, +23825=>12184, +23826=>12185, +23827=>12186, +23829=>12187, +23832=>12188, +23833=>12189, +23834=>12190, +23836=>12191, +23837=>12192, +23839=>12193, +23840=>12194, +23841=>12195, +23842=>12196, +23843=>12197, +23845=>12198, +23848=>12199, +23850=>12200, +23851=>12201, +23855=>12202, +23856=>12203, +23857=>12204, +23858=>12205, +23859=>12206, +23861=>12207, +23862=>12208, +23863=>12209, +23864=>12210, +23865=>12211, +23866=>12212, +23867=>12213, +23868=>12214, +23871=>12215, +23872=>12216, +23873=>12217, +23874=>12218, +23875=>12219, +23876=>12220, +23877=>12221, +23878=>12222, +23880=>12223, +23881=>12224, +23885=>12225, +23886=>12226, +23887=>12227, +23889=>12228, +23890=>12229, +23891=>12230, +23892=>12231, +23893=>12232, +23894=>12233, +23895=>12234, +23897=>12235, +23898=>12236, +23900=>12237, +23902=>12238, +23903=>12239, +23904=>12240, +23905=>12241, +23906=>12242, +23907=>12243, +23908=>12244, +23909=>12245, +23910=>12246, +23911=>12247, +23912=>12248, +23914=>12249, +23917=>12250, +23918=>12251, +23920=>12252, +23921=>12253, +23922=>12254, +23923=>12255, +23925=>12256, +23926=>12257, +23927=>12258, +23928=>12259, +23929=>12260, +23930=>12261, +23931=>12262, +23932=>12263, +23933=>12264, +23934=>12265, +23935=>12266, +23936=>12267, +23939=>12268, +23941=>12269, +23942=>12270, +23944=>12271, +23945=>12272, +23946=>12273, +23947=>12274, +23948=>12275, +23949=>12276, +23950=>12277, +23951=>12278, +23952=>12279, +23953=>12280, +23954=>12281, +23955=>12282, +23956=>12283, +23957=>12284, +23958=>12285, +23960=>12286, +23962=>12287, +23963=>12288, +23964=>12289, +23966=>12290, +23967=>12291, +23969=>12292, +23970=>12293, +23971=>12294, +23972=>12295, +23973=>12296, +23974=>12297, +23976=>12298, +23977=>12299, +23978=>12300, +23979=>12301, +23980=>12302, +23981=>12303, +23982=>12304, +23983=>12305, +23984=>12306, +23985=>12307, +23986=>12308, +23987=>12309, +23988=>12310, +23989=>12311, +23990=>12312, +23993=>12313, +23995=>12314, +23997=>12315, +23998=>12316, +23999=>12317, +24000=>12318, +24001=>12319, +24002=>12320, +24003=>12321, +24004=>12322, +24006=>12323, +24007=>12324, +24008=>12325, +24009=>12326, +24010=>12327, +24012=>12328, +24014=>12329, +24015=>12330, +24016=>12331, +24017=>12332, +24019=>12333, +24021=>12334, +24022=>12335, +24023=>12336, +24024=>12337, +24025=>12338, +24026=>12339, +24028=>12340, +24031=>12341, +24032=>12342, +24035=>12343, +24036=>12344, +24042=>12345, +24044=>12346, +24045=>12347, +24053=>12348, +24054=>12349, +24056=>12350, +24057=>12351, +24058=>12352, +24059=>12353, +24060=>12354, +24063=>12355, +24064=>12356, +24068=>12357, +24071=>12358, +24073=>12359, +24074=>12360, +24075=>12361, +24077=>12362, +24078=>12363, +24082=>12364, +24083=>12365, +24087=>12366, +24094=>12367, +24095=>12368, +24096=>12369, +24097=>12370, +24098=>12371, +24099=>12372, +24100=>12373, +24104=>12374, +24105=>12375, +24106=>12376, +24108=>12377, +24111=>12378, +24112=>12379, +24114=>12380, +24116=>12381, +24117=>12382, +24121=>12383, +24122=>12384, +24126=>12385, +24127=>12386, +24129=>12387, +24134=>12388, +24135=>12389, +24136=>12390, +24137=>12391, +24138=>12392, +24139=>12393, +24141=>12394, +24142=>12395, +24143=>12396, +24144=>12397, +24145=>12398, +24146=>12399, +24147=>12400, +24150=>12401, +24153=>12402, +24154=>12403, +24156=>12404, +24157=>12405, +24160=>12406, +24164=>12407, +24165=>12408, +24166=>12409, +24167=>12410, +24168=>12411, +24169=>12412, +24170=>12413, +24173=>12414, +24174=>12415, +24175=>12416, +24176=>12417, +24177=>12418, +24181=>12419, +24183=>12420, +24193=>12421, +24194=>12422, +24195=>12423, +24197=>12424, +24200=>12425, +24201=>12426, +24204=>12427, +24205=>12428, +24206=>12429, +24210=>12430, +24216=>12431, +24219=>12432, +24221=>12433, +24225=>12434, +24226=>12435, +24227=>12436, +24228=>12437, +24232=>12438, +24233=>12439, +24234=>12440, +24236=>12441, +24238=>12442, +24239=>12443, +24240=>12444, +24241=>12445, +24242=>12446, +24244=>12447, +24250=>12448, +24251=>12449, +24252=>12450, +24253=>12451, +24255=>12452, +24256=>12453, +24257=>12454, +24258=>12455, +24259=>12456, +24260=>12457, +24261=>12458, +24262=>12459, +24263=>12460, +24264=>12461, +24267=>12462, +24268=>12463, +24269=>12464, +24270=>12465, +24271=>12466, +24272=>12467, +24276=>12468, +24277=>12469, +24279=>12470, +24280=>12471, +24281=>12472, +24282=>12473, +24284=>12474, +24285=>12475, +24286=>12476, +24292=>12477, +24293=>12478, +24294=>12479, +24295=>12480, +24297=>12481, +24299=>12482, +24301=>12483, +24302=>12484, +24303=>12485, +24304=>12486, +24305=>12487, +24306=>12488, +24309=>12489, +24312=>12490, +24313=>12491, +24315=>12492, +24316=>12493, +24317=>12494, +24325=>12495, +24326=>12496, +24327=>12497, +24329=>12498, +24332=>12499, +24333=>12500, +24334=>12501, +24336=>12502, +24338=>12503, +24340=>12504, +24342=>12505, +24345=>12506, +24346=>12507, +24348=>12508, +24349=>12509, +24350=>12510, +24353=>12511, +24354=>12512, +24355=>12513, +24356=>12514, +24360=>12515, +24363=>12516, +24364=>12517, +24366=>12518, +24368=>12519, +24370=>12520, +24372=>12521, +24374=>12522, +24375=>12523, +24376=>12524, +24379=>12525, +24381=>12526, +24382=>12527, +24383=>12528, +24385=>12529, +24386=>12530, +24387=>12531, +24388=>12532, +24389=>12533, +24391=>12534, +24393=>12535, +24394=>12536, +24395=>12537, +24397=>12538, +24399=>12539, +24401=>12540, +24404=>12541, +24410=>12542, +24411=>12543, +24412=>12544, +24414=>12545, +24415=>12546, +24416=>12547, +24419=>12548, +24421=>12549, +24423=>12550, +24424=>12551, +24427=>12552, +24430=>12553, +24431=>12554, +24434=>12555, +24436=>12556, +24437=>12557, +24438=>12558, +24440=>12559, +24442=>12560, +24445=>12561, +24446=>12562, +24447=>12563, +24451=>12564, +24454=>12565, +24461=>12566, +24462=>12567, +24463=>12568, +24467=>12569, +24468=>12570, +24470=>12571, +24474=>12572, +24475=>12573, +24477=>12574, +24479=>12575, +24482=>12576, +24483=>12577, +24484=>12578, +24485=>12579, +24486=>12580, +24487=>12581, +24491=>12582, +24492=>12583, +24495=>12584, +24496=>12585, +24497=>12586, +24498=>12587, +24499=>12588, +24500=>12589, +24502=>12590, +24504=>12591, +24506=>12592, +24507=>12593, +24510=>12594, +24511=>12595, +24512=>12596, +24513=>12597, +24514=>12598, +24519=>12599, +24520=>12600, +24522=>12601, +24523=>12602, +24526=>12603, +24531=>12604, +24532=>12605, +24533=>12606, +24538=>12607, +24539=>12608, +24540=>12609, +24542=>12610, +24543=>12611, +24546=>12612, +24547=>12613, +24549=>12614, +24550=>12615, +24552=>12616, +24553=>12617, +24556=>12618, +24559=>12619, +24560=>12620, +24562=>12621, +24563=>12622, +24564=>12623, +24566=>12624, +24567=>12625, +24569=>12626, +24570=>12627, +24572=>12628, +24583=>12629, +24584=>12630, +24585=>12631, +24587=>12632, +24588=>12633, +24592=>12634, +24593=>12635, +24595=>12636, +24599=>12637, +24600=>12638, +24602=>12639, +24606=>12640, +24607=>12641, +24610=>12642, +24611=>12643, +24612=>12644, +24620=>12645, +24621=>12646, +24622=>12647, +24624=>12648, +24625=>12649, +24626=>12650, +24627=>12651, +24628=>12652, +24630=>12653, +24631=>12654, +24632=>12655, +24633=>12656, +24634=>12657, +24637=>12658, +24638=>12659, +24640=>12660, +24644=>12661, +24645=>12662, +24646=>12663, +24647=>12664, +24648=>12665, +24649=>12666, +24650=>12667, +24652=>12668, +24654=>12669, +24655=>12670, +24657=>12671, +24659=>12672, +24660=>12673, +24662=>12674, +24663=>12675, +24664=>12676, +24667=>12677, +24668=>12678, +24670=>12679, +24671=>12680, +24672=>12681, +24673=>12682, +24677=>12683, +24678=>12684, +24686=>12685, +24689=>12686, +24690=>12687, +24692=>12688, +24693=>12689, +24695=>12690, +24702=>12691, +24704=>12692, +24705=>12693, +24706=>12694, +24709=>12695, +24710=>12696, +24711=>12697, +24712=>12698, +24714=>12699, +24715=>12700, +24718=>12701, +24719=>12702, +24720=>12703, +24721=>12704, +24723=>12705, +24725=>12706, +24727=>12707, +24728=>12708, +24729=>12709, +24732=>12710, +24734=>12711, +24737=>12712, +24738=>12713, +24740=>12714, +24741=>12715, +24743=>12716, +24745=>12717, +24746=>12718, +24750=>12719, +24752=>12720, +24755=>12721, +24759=>12722, +24761=>12723, +24762=>12724, +24765=>12725, +24766=>12726, +24767=>12727, +24768=>12728, +24769=>12729, +24770=>12730, +24771=>12731, +24772=>12732, +24775=>12733, +24776=>12734, +24777=>12735, +24780=>12736, +24781=>12737, +24782=>12738, +24783=>12739, +24784=>12740, +24786=>12741, +24787=>12742, +24788=>12743, +24790=>12744, +24791=>12745, +24793=>12746, +24795=>12747, +24798=>12748, +24802=>12749, +24803=>12750, +24804=>12751, +24805=>12752, +24810=>12753, +24821=>12754, +24823=>12755, +24824=>12756, +24828=>12757, +24829=>12758, +24830=>12759, +24831=>12760, +24834=>12761, +24835=>12762, +24836=>12763, +24837=>12764, +24839=>12765, +24842=>12766, +24843=>12767, +24844=>12768, +24848=>12769, +24849=>12770, +24850=>12771, +24851=>12772, +24852=>12773, +24854=>12774, +24855=>12775, +24856=>12776, +24857=>12777, +24861=>12778, +24862=>12779, +24865=>12780, +24866=>12781, +24869=>12782, +24872=>12783, +24873=>12784, +24874=>12785, +24876=>12786, +24877=>12787, +24878=>12788, +24879=>12789, +24880=>12790, +24881=>12791, +24882=>12792, +24883=>12793, +24885=>12794, +24886=>12795, +24888=>12796, +24889=>12797, +24890=>12798, +24891=>12799, +24892=>12800, +24893=>12801, +24896=>12802, +24897=>12803, +24898=>12804, +24899=>12805, +24900=>12806, +24901=>12807, +24902=>12808, +24903=>12809, +24905=>12810, +24909=>12811, +24911=>12812, +24912=>12813, +24914=>12814, +24915=>12815, +24916=>12816, +24918=>12817, +24919=>12818, +24921=>12819, +24923=>12820, +24924=>12821, +24926=>12822, +24928=>12823, +24929=>12824, +24933=>12825, +24934=>12826, +24937=>12827, +24940=>12828, +24941=>12829, +24943=>12830, +24945=>12831, +24946=>12832, +24948=>12833, +24952=>12834, +24953=>12835, +24954=>12836, +24955=>12837, +24956=>12838, +24957=>12839, +24958=>12840, +24959=>12841, +24960=>12842, +24961=>12843, +24963=>12844, +24964=>12845, +24965=>12846, +24966=>12847, +24967=>12848, +24968=>12849, +24969=>12850, +24972=>12851, +24973=>12852, +24975=>12853, +24979=>12854, +24981=>12855, +24982=>12856, +24983=>12857, +24984=>12858, +24985=>12859, +24987=>12860, +24988=>12861, +24990=>12862, +24991=>12863, +24992=>12864, +24993=>12865, +24994=>12866, +24995=>12867, +24997=>12868, +24998=>12869, +25002=>12870, +25005=>12871, +25007=>12872, +25008=>12873, +25009=>12874, +25011=>12875, +25012=>12876, +25013=>12877, +25016=>12878, +25017=>12879, +25018=>12880, +25019=>12881, +25020=>12882, +25021=>12883, +25023=>12884, +25024=>12885, +25025=>12886, +25027=>12887, +25028=>12888, +25029=>12889, +25030=>12890, +25037=>12891, +25038=>12892, +25039=>12893, +25040=>12894, +25043=>12895, +25045=>12896, +25046=>12897, +25047=>12898, +25048=>12899, +25049=>12900, +25050=>12901, +25051=>12902, +25052=>12903, +25053=>12904, +25056=>12905, +25057=>12906, +25058=>12907, +25060=>12908, +25061=>12909, +25063=>12910, +25065=>12911, +25066=>12912, +25067=>12913, +25068=>12914, +25069=>12915, +25070=>12916, +25071=>12917, +25072=>12918, +25073=>12919, +25075=>12920, +25076=>12921, +25081=>12922, +25083=>12923, +25085=>12924, +25089=>12925, +25090=>12926, +25091=>12927, +25092=>12928, +25093=>12929, +25097=>12930, +25107=>12931, +25113=>12932, +25116=>12933, +25117=>12934, +25118=>12935, +25120=>12936, +25123=>12937, +25126=>12938, +25128=>12939, +25129=>12940, +25131=>12941, +25133=>12942, +25135=>12943, +25137=>12944, +25141=>12945, +12094=>12946, +25142=>12946, +25144=>12947, +25145=>12948, +25146=>12949, +25147=>12950, +25148=>12951, +25154=>12952, +25156=>12953, +25157=>12954, +25158=>12955, +25162=>12956, +25167=>12957, +25168=>12958, +25173=>12959, +25174=>12960, +25175=>12961, +25177=>12962, +25178=>12963, +25180=>12964, +25181=>12965, +25182=>12966, +25183=>12967, +25184=>12968, +25185=>12969, +25186=>12970, +25188=>12971, +25189=>12972, +25192=>12973, +25201=>12974, +25202=>12975, +25204=>12976, +25205=>12977, +25207=>12978, +25208=>12979, +25210=>12980, +25211=>12981, +25213=>12982, +25217=>12983, +25218=>12984, +25219=>12985, +25221=>12986, +25222=>12987, +25223=>12988, +25224=>12989, +25227=>12990, +25228=>12991, +25229=>12992, +25230=>12993, +25231=>12994, +25232=>12995, +25236=>12996, +25241=>12997, +25244=>12998, +25245=>12999, +25246=>13000, +25251=>13001, +25254=>13002, +25255=>13003, +25257=>13004, +25258=>13005, +25261=>13006, +25262=>13007, +25263=>13008, +25264=>13009, +25266=>13010, +25267=>13011, +25268=>13012, +25270=>13013, +25271=>13014, +25272=>13015, +25274=>13016, +25278=>13017, +25280=>13018, +25281=>13019, +25283=>13020, +25291=>13021, +25295=>13022, +25297=>13023, +25301=>13024, +25309=>13025, +25310=>13026, +25312=>13027, +25313=>13028, +25316=>13029, +25322=>13030, +25323=>13031, +25328=>13032, +25330=>13033, +25333=>13034, +25336=>13035, +25337=>13036, +25338=>13037, +25339=>13038, +25344=>13039, +25347=>13040, +25348=>13041, +25349=>13042, +25350=>13043, +25354=>13044, +25355=>13045, +25356=>13046, +25357=>13047, +25359=>13048, +25360=>13049, +25362=>13050, +25363=>13051, +25364=>13052, +25365=>13053, +25367=>13054, +25368=>13055, +25369=>13056, +25372=>13057, +25382=>13058, +25383=>13059, +25385=>13060, +25388=>13061, +25389=>13062, +25390=>13063, +25392=>13064, +25393=>13065, +25395=>13066, +25396=>13067, +25397=>13068, +25398=>13069, +25399=>13070, +25400=>13071, +25403=>13072, +25404=>13073, +25407=>13074, +25408=>13075, +25409=>13076, +25412=>13077, +25415=>13078, +25416=>13079, +25418=>13080, +25425=>13081, +25426=>13082, +25427=>13083, +25428=>13084, +25430=>13085, +25431=>13086, +25432=>13087, +25433=>13088, +25434=>13089, +25435=>13090, +25436=>13091, +25437=>13092, +25440=>13093, +25444=>13094, +25445=>13095, +25446=>13096, +25450=>13097, +25452=>13098, +25455=>13099, +25456=>13100, +25459=>13101, +25460=>13102, +25461=>13103, +25464=>13104, +25465=>13105, +25468=>13106, +25469=>13107, +25470=>13108, +25471=>13109, +25473=>13110, +25477=>13111, +25478=>13112, +25483=>13113, +25485=>13114, +25489=>13115, +25491=>13116, +25492=>13117, +25493=>13118, +25495=>13119, +25497=>13120, +25498=>13121, +25499=>13122, +25500=>13123, +25501=>13124, +25502=>13125, +25503=>13126, +25505=>13127, +25508=>13128, +25510=>13129, +25515=>13130, +25519=>13131, +25521=>13132, +25522=>13133, +25525=>13134, +25526=>13135, +25529=>13136, +25531=>13137, +25533=>13138, +25535=>13139, +25537=>13140, +25538=>13141, +25539=>13142, +25541=>13143, +25543=>13144, +25544=>13145, +25546=>13146, +25547=>13147, +25548=>13148, +25553=>13149, +25555=>13150, +25556=>13151, +25557=>13152, +25559=>13153, +25560=>13154, +25561=>13155, +25563=>13156, +25564=>13157, +25565=>13158, +25567=>13159, +25570=>13160, +25572=>13161, +25573=>13162, +25574=>13163, +25575=>13164, +25576=>13165, +25579=>13166, +25580=>13167, +25583=>13168, +25584=>13169, +25585=>13170, +25587=>13171, +25589=>13172, +25591=>13173, +25593=>13174, +25594=>13175, +25595=>13176, +25596=>13177, +25598=>13178, +25603=>13179, +25604=>13180, +25606=>13181, +25607=>13182, +25608=>13183, +25609=>13184, +25610=>13185, +25614=>13186, +25617=>13187, +25618=>13188, +25621=>13189, +25622=>13190, +25624=>13191, +25625=>13192, +25626=>13193, +25629=>13194, +25631=>13195, +25634=>13196, +25635=>13197, +25636=>13198, +25637=>13199, +25639=>13200, +25640=>13201, +25641=>13202, +25643=>13203, +25646=>13204, +25647=>13205, +25648=>13206, +25649=>13207, +25650=>13208, +25651=>13209, +25653=>13210, +25655=>13211, +25656=>13212, +25657=>13213, +25659=>13214, +25660=>13215, +25662=>13216, +25664=>13217, +25666=>13218, +25667=>13219, +25673=>13220, +25675=>13221, +25676=>13222, +25677=>13223, +25678=>13224, +25679=>13225, +25680=>13226, +25683=>13227, +25685=>13228, +25686=>13229, +25687=>13230, +25689=>13231, +25690=>13232, +25691=>13233, +25693=>13234, +25696=>13235, +25697=>13236, +25698=>13237, +25699=>13238, +25700=>13239, +25701=>13240, +25702=>13241, +25704=>13242, +25706=>13243, +25707=>13244, +25708=>13245, +25710=>13246, +25712=>13247, +25713=>13248, +25714=>13249, +25716=>13250, +25717=>13251, +25719=>13252, +25724=>13253, +25725=>13254, +25726=>13255, +25727=>13256, +25728=>13257, +25729=>13258, +25731=>13259, +25734=>13260, +25737=>13261, +25738=>13262, +25739=>13263, +25740=>13264, +25741=>13265, +25742=>13266, +25743=>13267, +25744=>13268, +25748=>13269, +25751=>13270, +25752=>13271, +25754=>13272, +25755=>13273, +25756=>13274, +25757=>13275, +25760=>13276, +25761=>13277, +25762=>13278, +25766=>13279, +25767=>13280, +25768=>13281, +25770=>13282, +25775=>13283, +25777=>13284, +25780=>13285, +25782=>13286, +25785=>13287, +25789=>13288, +25795=>13289, +25798=>13290, +25800=>13291, +25801=>13292, +25804=>13293, +25807=>13294, +25809=>13295, +25811=>13296, +25813=>13297, +25814=>13298, +25817=>13299, +25819=>13300, +25820=>13301, +25821=>13302, +25823=>13303, +25825=>13304, +25827=>13305, +25829=>13306, +25831=>13307, +25832=>13308, +25833=>13309, +25834=>13310, +25835=>13311, +25837=>13312, +25838=>13313, +25843=>13314, +25845=>13315, +25846=>13316, +25848=>13317, +25849=>13318, +25853=>13319, +25855=>13320, +25857=>13321, +25858=>13322, +25859=>13323, +25861=>13324, +25863=>13325, +25864=>13326, +25866=>13327, +25867=>13328, +25868=>13329, +25869=>13330, +25870=>13331, +25872=>13332, +25873=>13333, +25875=>13334, +25877=>13335, +25879=>13336, +25882=>13337, +25884=>13338, +25886=>13339, +25887=>13340, +25888=>13341, +25889=>13342, +25894=>13343, +25895=>13344, +25896=>13345, +25897=>13346, +25901=>13347, +25904=>13348, +25905=>13349, +25906=>13350, +25907=>13351, +25911=>13352, +25914=>13353, +25916=>13354, +25917=>13355, +25920=>13356, +25921=>13357, +25922=>13358, +25923=>13359, +25924=>13360, +25926=>13361, +25927=>13362, +25930=>13363, +25931=>13364, +25933=>13365, +25934=>13366, +25936=>13367, +25938=>13368, +25939=>13369, +25940=>13370, +25944=>13371, +25946=>13372, +25948=>13373, +25951=>13374, +25952=>13375, +25953=>13376, +25956=>13377, +25957=>13378, +25959=>13379, +25960=>13380, +25961=>13381, +25962=>13382, +25965=>13383, +25966=>13384, +25967=>13385, +25969=>13386, +25971=>13387, +25974=>13388, +25977=>13389, +25978=>13390, +25979=>13391, +25980=>13392, +25981=>13393, +25982=>13394, +25983=>13395, +25984=>13396, +25985=>13397, +25988=>13398, +25989=>13399, +25990=>13400, +25992=>13401, +25993=>13402, +25994=>13403, +25997=>13404, +25998=>13405, +25999=>13406, +26002=>13407, +26004=>13408, +26006=>13409, +26008=>13410, +26010=>13411, +26013=>13412, +26014=>13413, +26016=>13414, +26018=>13415, +26019=>13416, +26022=>13417, +26024=>13418, +26026=>13419, +26030=>13420, +26033=>13421, +26034=>13422, +26035=>13423, +26036=>13424, +26037=>13425, +26038=>13426, +26040=>13427, +26042=>13428, +26043=>13429, +26046=>13430, +26047=>13431, +26048=>13432, +26050=>13433, +26055=>13434, +26056=>13435, +26057=>13436, +26058=>13437, +26061=>13438, +26064=>13439, +26065=>13440, +26067=>13441, +26068=>13442, +26069=>13443, +26072=>13444, +26073=>13445, +26074=>13446, +26075=>13447, +26076=>13448, +26077=>13449, +26078=>13450, +26079=>13451, +26081=>13452, +26083=>13453, +26084=>13454, +26090=>13455, +26091=>13456, +26098=>13457, +26099=>13458, +26100=>13459, +26101=>13460, +26104=>13461, +26105=>13462, +26107=>13463, +26108=>13464, +26109=>13465, +26110=>13466, +26111=>13467, +26113=>13468, +26116=>13469, +26117=>13470, +26119=>13471, +26120=>13472, +26121=>13473, +26123=>13474, +26125=>13475, +26128=>13476, +26129=>13477, +26130=>13478, +26134=>13479, +26135=>13480, +26136=>13481, +26138=>13482, +26139=>13483, +26140=>13484, +26142=>13485, +26145=>13486, +26146=>13487, +26147=>13488, +26148=>13489, +26150=>13490, +26153=>13491, +26154=>13492, +26155=>13493, +26156=>13494, +26158=>13495, +26160=>13496, +26162=>13497, +26163=>13498, +26167=>13499, +26168=>13500, +26169=>13501, +26170=>13502, +26171=>13503, +26173=>13504, +26175=>13505, +26176=>13506, +26180=>13507, +26181=>13508, +26182=>13509, +26183=>13510, +26184=>13511, +26185=>13512, +26186=>13513, +26189=>13514, +26190=>13515, +26192=>13516, +26193=>13517, +26200=>13518, +26201=>13519, +26203=>13520, +26204=>13521, +26206=>13522, +26208=>13523, +26210=>13524, +26211=>13525, +26213=>13526, +26215=>13527, +26217=>13528, +26218=>13529, +26219=>13530, +26220=>13531, +26221=>13532, +26225=>13533, +26226=>13534, +26227=>13535, +26229=>13536, +26232=>13537, +26233=>13538, +26235=>13539, +26236=>13540, +26237=>13541, +26239=>13542, +26240=>13543, +26241=>13544, +26243=>13545, +26245=>13546, +26246=>13547, +26250=>13548, +26251=>13549, +26253=>13550, +26254=>13551, +26255=>13552, +26256=>13553, +26258=>13554, +26259=>13555, +26260=>13556, +26261=>13557, +26264=>13558, +26265=>13559, +26266=>13560, +26267=>13561, +26268=>13562, +26270=>13563, +26271=>13564, +26272=>13565, +26273=>13566, +26275=>13567, +26276=>13568, +26277=>13569, +26278=>13570, +26281=>13571, +26282=>13572, +26284=>13573, +26285=>13574, +26287=>13575, +26288=>13576, +26289=>13577, +26290=>13578, +26291=>13579, +26293=>13580, +26294=>13581, +26295=>13582, +26296=>13583, +26298=>13584, +26299=>13585, +26300=>13586, +26301=>13587, +26303=>13588, +26304=>13589, +26305=>13590, +26306=>13591, +26307=>13592, +26309=>13593, +26312=>13594, +26314=>13595, +26315=>13596, +26316=>13597, +26317=>13598, +26318=>13599, +26319=>13600, +26320=>13601, +26321=>13602, +26322=>13603, +26323=>13604, +26324=>13605, +26325=>13606, +26327=>13607, +26328=>13608, +26330=>13609, +26334=>13610, +26335=>13611, +26337=>13612, +26338=>13613, +26339=>13614, +26340=>13615, +26341=>13616, +26343=>13617, +26344=>13618, +26346=>13619, +26347=>13620, +26349=>13621, +26350=>13622, +26351=>13623, +26353=>13624, +26357=>13625, +26358=>13626, +26362=>13627, +26363=>13628, +26365=>13629, +26369=>13630, +26370=>13631, +26372=>13632, +26373=>13633, +26374=>13634, +26375=>13635, +26380=>13636, +26382=>13637, +26383=>13638, +26385=>13639, +26386=>13640, +26387=>13641, +26390=>13642, +26392=>13643, +26393=>13644, +26394=>13645, +26396=>13646, +26398=>13647, +26400=>13648, +26401=>13649, +26402=>13650, +26403=>13651, +26404=>13652, +26405=>13653, +26409=>13654, +26414=>13655, +26416=>13656, +26418=>13657, +26419=>13658, +26422=>13659, +26423=>13660, +26424=>13661, +26425=>13662, +26427=>13663, +26428=>13664, +26430=>13665, +26431=>13666, +26433=>13667, +26436=>13668, +26437=>13669, +26439=>13670, +26442=>13671, +26443=>13672, +26445=>13673, +26450=>13674, +26452=>13675, +26453=>13676, +26455=>13677, +26456=>13678, +26457=>13679, +26458=>13680, +26459=>13681, +26461=>13682, +26466=>13683, +26467=>13684, +26468=>13685, +26470=>13686, +26471=>13687, +26475=>13688, +26476=>13689, +26478=>13690, +26484=>13691, +26486=>13692, +26488=>13693, +26489=>13694, +26490=>13695, +26491=>13696, +26493=>13697, +26496=>13698, +26498=>13699, +26499=>13700, +26501=>13701, +26502=>13702, +26504=>13703, +26506=>13704, +26508=>13705, +26509=>13706, +26510=>13707, +26511=>13708, +26513=>13709, +26514=>13710, +26515=>13711, +26516=>13712, +26518=>13713, +26521=>13714, +26523=>13715, +26527=>13716, +26528=>13717, +26529=>13718, +26532=>13719, +26534=>13720, +26537=>13721, +26540=>13722, +26542=>13723, +26545=>13724, +26546=>13725, +26548=>13726, +26553=>13727, +26554=>13728, +26555=>13729, +26556=>13730, +26557=>13731, +26558=>13732, +26559=>13733, +26560=>13734, +26562=>13735, +26565=>13736, +26566=>13737, +26567=>13738, +26568=>13739, +26569=>13740, +26570=>13741, +26571=>13742, +26572=>13743, +26573=>13744, +26574=>13745, +26581=>13746, +26582=>13747, +26583=>13748, +26587=>13749, +26591=>13750, +26593=>13751, +26595=>13752, +26596=>13753, +26598=>13754, +26599=>13755, +26600=>13756, +26602=>13757, +26603=>13758, +26605=>13759, +26606=>13760, +26610=>13761, +26613=>13762, +26614=>13763, +26615=>13764, +26616=>13765, +26617=>13766, +26618=>13767, +26619=>13768, +26620=>13769, +26622=>13770, +26625=>13771, +26626=>13772, +26627=>13773, +26628=>13774, +26630=>13775, +26637=>13776, +26640=>13777, +26642=>13778, +26644=>13779, +26645=>13780, +26648=>13781, +26649=>13782, +26650=>13783, +26651=>13784, +26652=>13785, +26654=>13786, +26655=>13787, +26656=>13788, +26658=>13789, +26659=>13790, +26660=>13791, +26661=>13792, +26662=>13793, +26663=>13794, +26664=>13795, +26667=>13796, +26668=>13797, +26669=>13798, +26670=>13799, +26671=>13800, +26672=>13801, +26673=>13802, +26676=>13803, +26677=>13804, +26678=>13805, +26682=>13806, +26683=>13807, +26687=>13808, +26695=>13809, +26699=>13810, +26701=>13811, +26703=>13812, +26706=>13813, +26710=>13814, +26711=>13815, +26712=>13816, +26713=>13817, +26714=>13818, +26715=>13819, +26716=>13820, +26717=>13821, +26718=>13822, +26719=>13823, +26730=>13824, +26732=>13825, +26733=>13826, +26734=>13827, +26735=>13828, +26736=>13829, +26737=>13830, +26738=>13831, +26739=>13832, +26741=>13833, +26744=>13834, +26745=>13835, +26746=>13836, +26747=>13837, +26748=>13838, +26749=>13839, +26750=>13840, +26751=>13841, +26752=>13842, +26754=>13843, +26756=>13844, +26759=>13845, +26760=>13846, +26761=>13847, +26762=>13848, +26763=>13849, +26764=>13850, +26765=>13851, +26766=>13852, +26768=>13853, +26769=>13854, +26770=>13855, +26772=>13856, +26773=>13857, +26774=>13858, +26777=>13859, +26778=>13860, +26779=>13861, +26780=>13862, +26782=>13863, +26784=>13864, +26785=>13865, +26787=>13866, +26788=>13867, +26789=>13868, +26793=>13869, +26794=>13870, +26795=>13871, +26796=>13872, +26798=>13873, +26801=>13874, +26802=>13875, +26804=>13876, +26806=>13877, +26807=>13878, +26808=>13879, +26809=>13880, +26810=>13881, +26811=>13882, +26812=>13883, +26813=>13884, +26814=>13885, +26815=>13886, +26817=>13887, +26819=>13888, +26820=>13889, +26821=>13890, +26822=>13891, +26823=>13892, +26824=>13893, +26826=>13894, +26828=>13895, +26830=>13896, +26831=>13897, +26832=>13898, +26833=>13899, +26835=>13900, +26836=>13901, +26841=>13902, +26843=>13903, +26844=>13904, +26845=>13905, +26846=>13906, +26849=>13907, +26850=>13908, +26852=>13909, +26853=>13910, +26854=>13911, +26856=>13912, +26857=>13913, +26858=>13914, +26859=>13915, +26860=>13916, +26861=>13917, +26863=>13918, +26866=>13919, +26867=>13920, +26868=>13921, +26870=>13922, +26871=>13923, +26872=>13924, +26875=>13925, +26877=>13926, +26878=>13927, +26879=>13928, +26880=>13929, +26882=>13930, +26883=>13931, +26884=>13932, +26886=>13933, +26887=>13934, +26888=>13935, +26889=>13936, +26890=>13937, +26892=>13938, +26897=>13939, +26899=>13940, +26900=>13941, +26901=>13942, +26902=>13943, +26903=>13944, +26904=>13945, +26905=>13946, +26906=>13947, +26907=>13948, +26908=>13949, +26909=>13950, +26910=>13951, +26913=>13952, +26914=>13953, +26915=>13954, +26917=>13955, +26918=>13956, +26919=>13957, +26920=>13958, +26921=>13959, +26922=>13960, +26923=>13961, +26924=>13962, +26926=>13963, +26927=>13964, +26929=>13965, +26930=>13966, +26931=>13967, +26933=>13968, +26934=>13969, +26935=>13970, +26936=>13971, +26938=>13972, +26939=>13973, +26940=>13974, +26942=>13975, +26944=>13976, +26945=>13977, +26947=>13978, +26948=>13979, +26949=>13980, +26950=>13981, +26951=>13982, +26952=>13983, +26953=>13984, +26955=>13985, +26956=>13986, +26957=>13987, +26958=>13988, +26959=>13989, +26960=>13990, +26961=>13991, +26962=>13992, +26965=>13993, +26966=>13994, +26968=>13995, +26969=>13996, +26971=>13997, +26972=>13998, +26975=>13999, +26977=>14000, +26978=>14001, +26980=>14002, +26981=>14003, +26983=>14004, +26985=>14005, +26986=>14006, +26988=>14007, +26991=>14008, +26992=>14009, +26994=>14010, +26995=>14011, +26996=>14012, +26998=>14013, +27002=>14014, +27003=>14015, +27005=>14016, +27006=>14017, +27007=>14018, +27009=>14019, +27011=>14020, +27013=>14021, +27018=>14022, +27019=>14023, +27020=>14024, +27022=>14025, +27023=>14026, +27024=>14027, +27025=>14028, +27026=>14029, +27027=>14030, +27030=>14031, +27031=>14032, +27033=>14033, +27034=>14034, +27037=>14035, +27038=>14036, +27039=>14037, +27040=>14038, +27041=>14039, +27042=>14040, +27043=>14041, +27044=>14042, +27045=>14043, +27046=>14044, +27049=>14045, +27052=>14046, +27055=>14047, +27056=>14048, +27058=>14049, +27059=>14050, +27061=>14051, +27062=>14052, +27064=>14053, +27065=>14054, +27066=>14055, +27068=>14056, +27069=>14057, +27070=>14058, +27072=>14059, +27074=>14060, +27075=>14061, +27076=>14062, +27077=>14063, +27078=>14064, +27079=>14065, +27080=>14066, +27081=>14067, +27087=>14068, +27089=>14069, +27090=>14070, +27091=>14071, +27093=>14072, +27094=>14073, +27095=>14074, +27096=>14075, +27097=>14076, +27098=>14077, +27100=>14078, +27101=>14079, +27102=>14080, +27105=>14081, +27106=>14082, +27107=>14083, +27108=>14084, +27109=>14085, +27110=>14086, +27112=>14087, +27113=>14088, +27114=>14089, +27115=>14090, +27116=>14091, +27118=>14092, +27119=>14093, +27120=>14094, +27121=>14095, +27124=>14096, +27125=>14097, +27126=>14098, +27127=>14099, +27128=>14100, +27129=>14101, +27130=>14102, +27131=>14103, +27132=>14104, +27134=>14105, +27136=>14106, +27139=>14107, +27140=>14108, +27142=>14109, +27143=>14110, +27144=>14111, +27145=>14112, +27147=>14113, +27148=>14114, +27149=>14115, +27150=>14116, +27151=>14117, +27152=>14118, +27153=>14119, +27154=>14120, +27156=>14121, +27157=>14122, +27158=>14123, +27162=>14124, +27163=>14125, +27164=>14126, +27165=>14127, +27168=>14128, +27170=>14129, +27172=>14130, +27173=>14131, +27174=>14132, +27175=>14133, +27177=>14134, +27179=>14135, +27180=>14136, +27181=>14137, +27182=>14138, +27184=>14139, +27186=>14140, +27187=>14141, +27188=>14142, +27190=>14143, +27191=>14144, +27195=>14145, +27196=>14146, +27199=>14147, +27200=>14148, +27201=>14149, +27202=>14150, +27203=>14151, +27205=>14152, +27206=>14153, +27209=>14154, +27210=>14155, +27212=>14156, +27213=>14157, +27214=>14158, +27215=>14159, +27217=>14160, +27218=>14161, +27219=>14162, +27220=>14163, +27221=>14164, +27222=>14165, +27223=>14166, +27226=>14167, +27228=>14168, +27229=>14169, +27230=>14170, +27232=>14171, +27235=>14172, +27236=>14173, +27238=>14174, +27239=>14175, +27240=>14176, +27241=>14177, +27242=>14178, +27243=>14179, +27244=>14180, +27245=>14181, +27246=>14182, +27247=>14183, +27248=>14184, +27250=>14185, +27251=>14186, +27252=>14187, +27253=>14188, +27254=>14189, +27255=>14190, +27256=>14191, +27258=>14192, +27259=>14193, +27261=>14194, +27262=>14195, +27263=>14196, +27265=>14197, +27266=>14198, +27267=>14199, +27269=>14200, +27270=>14201, +27271=>14202, +27272=>14203, +27274=>14204, +27275=>14205, +27276=>14206, +27277=>14207, +27279=>14208, +27282=>14209, +27283=>14210, +27285=>14211, +27286=>14212, +27288=>14213, +27289=>14214, +27290=>14215, +27291=>14216, +27293=>14217, +27294=>14218, +27295=>14219, +27297=>14220, +27300=>14221, +27301=>14222, +27302=>14223, +27303=>14224, +27304=>14225, +27306=>14226, +27309=>14227, +27310=>14228, +27312=>14229, +27313=>14230, +27314=>14231, +27316=>14232, +27317=>14233, +27318=>14234, +27319=>14235, +27321=>14236, +27322=>14237, +27324=>14238, +27325=>14239, +27326=>14240, +27327=>14241, +27328=>14242, +27329=>14243, +27330=>14244, +27332=>14245, +27333=>14246, +27334=>14247, +27335=>14248, +27336=>14249, +27337=>14250, +27338=>14251, +27339=>14252, +27340=>14253, +27341=>14254, +27342=>14255, +27343=>14256, +27344=>14257, +27345=>14258, +27346=>14259, +27348=>14260, +27349=>14261, +27350=>14262, +27351=>14263, +27352=>14264, +27353=>14265, +27356=>14266, +27360=>14267, +27361=>14268, +27362=>14269, +27363=>14270, +27364=>14271, +27365=>14272, +27366=>14273, +27369=>14274, +27371=>14275, +27373=>14276, +27374=>14277, +27375=>14278, +27376=>14279, +27377=>14280, +27378=>14281, +27380=>14282, +27381=>14283, +27382=>14284, +27383=>14285, +27385=>14286, +27386=>14287, +27388=>14288, +27389=>14289, +27390=>14290, +27391=>14291, +27392=>14292, +27393=>14293, +27394=>14294, +27395=>14295, +27397=>14296, +27398=>14297, +27399=>14298, +27400=>14299, +27401=>14300, +27403=>14301, +27404=>14302, +27405=>14303, +27406=>14304, +27408=>14305, +27409=>14306, +27411=>14307, +27412=>14308, +27413=>14309, +27415=>14310, +27416=>14311, +27417=>14312, +27418=>14313, +27419=>14314, +27420=>14315, +27421=>14316, +27423=>14317, +27429=>14318, +27430=>14319, +27432=>14320, +27433=>14321, +27434=>14322, +27435=>14323, +27436=>14324, +27437=>14325, +27438=>14326, +27439=>14327, +27440=>14328, +27441=>14329, +27443=>14330, +27444=>14331, +27445=>14332, +27446=>14333, +27448=>14334, +27451=>14335, +27452=>14336, +27455=>14337, +27456=>14338, +27457=>14339, +27458=>14340, +27460=>14341, +27461=>14342, +27464=>14343, +27466=>14344, +27467=>14345, +27469=>14346, +27470=>14347, +27471=>14348, +27473=>14349, +27474=>14350, +27475=>14351, +27476=>14352, +27477=>14353, +27478=>14354, +27479=>14355, +27480=>14356, +27482=>14357, +27483=>14358, +27484=>14359, +27485=>14360, +27486=>14361, +27488=>14362, +27496=>14363, +27497=>14364, +27499=>14365, +27500=>14366, +27501=>14367, +27502=>14368, +27503=>14369, +27504=>14370, +27505=>14371, +27507=>14372, +27508=>14373, +27509=>14374, +27510=>14375, +27514=>14376, +27517=>14377, +27518=>14378, +27519=>14379, +27520=>14380, +27525=>14381, +27528=>14382, +27532=>14383, +27534=>14384, +27535=>14385, +27536=>14386, +27537=>14387, +27540=>14388, +27541=>14389, +27543=>14390, +27545=>14391, +27548=>14392, +27549=>14393, +27551=>14394, +27552=>14395, +27554=>14396, +27555=>14397, +27557=>14398, +27558=>14399, +27559=>14400, +27560=>14401, +27561=>14402, +27564=>14403, +27565=>14404, +27568=>14405, +27569=>14406, +27574=>14407, +27576=>14408, +27577=>14409, +27580=>14410, +27581=>14411, +27582=>14412, +27584=>14413, +27587=>14414, +27588=>14415, +27591=>14416, +27592=>14417, +27593=>14418, +27594=>14419, +27596=>14420, +27598=>14421, +27600=>14422, +27601=>14423, +27608=>14424, +27610=>14425, +27612=>14426, +27613=>14427, +27614=>14428, +27615=>14429, +27616=>14430, +27618=>14431, +27619=>14432, +27620=>14433, +27621=>14434, +27622=>14435, +27623=>14436, +27624=>14437, +27625=>14438, +27628=>14439, +27629=>14440, +27630=>14441, +27632=>14442, +27633=>14443, +27634=>14444, +27636=>14445, +27638=>14446, +27639=>14447, +27640=>14448, +27642=>14449, +27643=>14450, +27644=>14451, +27646=>14452, +27648=>14453, +27649=>14454, +27650=>14455, +27651=>14456, +27652=>14457, +27657=>14458, +27658=>14459, +27659=>14460, +27662=>14461, +27666=>14462, +27671=>14463, +27676=>14464, +27677=>14465, +27678=>14466, +27680=>14467, +27685=>14468, +27693=>14469, +27697=>14470, +27699=>14471, +27702=>14472, +27703=>14473, +27705=>14474, +27706=>14475, +27707=>14476, +27708=>14477, +27710=>14478, +27711=>14479, +27715=>14480, +27716=>14481, +27717=>14482, +27720=>14483, +27723=>14484, +27724=>14485, +27725=>14486, +27726=>14487, +27727=>14488, +27729=>14489, +27730=>14490, +27731=>14491, +27734=>14492, +27736=>14493, +27737=>14494, +27738=>14495, +27746=>14496, +27747=>14497, +27749=>14498, +27750=>14499, +27751=>14500, +27755=>14501, +27756=>14502, +27757=>14503, +27758=>14504, +27759=>14505, +27761=>14506, +27763=>14507, +27765=>14508, +27767=>14509, +27768=>14510, +27770=>14511, +27771=>14512, +27772=>14513, +27775=>14514, +27776=>14515, +27780=>14516, +27783=>14517, +27786=>14518, +27787=>14519, +27789=>14520, +27790=>14521, +27793=>14522, +27794=>14523, +27797=>14524, +27798=>14525, +27799=>14526, +27800=>14527, +27802=>14528, +27804=>14529, +27805=>14530, +27806=>14531, +27808=>14532, +27810=>14533, +27816=>14534, +27820=>14535, +27823=>14536, +27824=>14537, +27828=>14538, +27829=>14539, +27830=>14540, +27831=>14541, +27834=>14542, +27840=>14543, +27841=>14544, +27842=>14545, +27843=>14546, +27846=>14547, +27847=>14548, +27848=>14549, +27851=>14550, +27853=>14551, +27854=>14552, +27855=>14553, +27857=>14554, +27858=>14555, +27864=>14556, +27865=>14557, +27866=>14558, +27868=>14559, +27869=>14560, +27871=>14561, +27876=>14562, +27878=>14563, +27879=>14564, +27881=>14565, +27884=>14566, +27885=>14567, +27890=>14568, +27892=>14569, +27897=>14570, +27903=>14571, +27904=>14572, +27906=>14573, +27907=>14574, +27909=>14575, +27910=>14576, +27912=>14577, +27913=>14578, +27914=>14579, +27917=>14580, +27919=>14581, +27920=>14582, +27921=>14583, +27923=>14584, +27924=>14585, +27925=>14586, +27926=>14587, +27928=>14588, +27932=>14589, +27933=>14590, +27935=>14591, +27936=>14592, +27937=>14593, +27938=>14594, +27939=>14595, +27940=>14596, +27942=>14597, +27944=>14598, +27945=>14599, +27948=>14600, +27949=>14601, +27951=>14602, +27952=>14603, +27956=>14604, +27958=>14605, +27959=>14606, +27960=>14607, +27962=>14608, +27967=>14609, +27968=>14610, +27970=>14611, +27972=>14612, +27977=>14613, +27980=>14614, +27984=>14615, +27989=>14616, +27990=>14617, +27991=>14618, +27992=>14619, +27995=>14620, +27997=>14621, +27999=>14622, +28001=>14623, +28002=>14624, +28004=>14625, +28005=>14626, +28007=>14627, +28008=>14628, +28011=>14629, +28012=>14630, +28013=>14631, +28016=>14632, +28017=>14633, +28018=>14634, +28019=>14635, +28021=>14636, +28022=>14637, +28026=>14638, +28027=>14639, +28029=>14640, +28030=>14641, +28031=>14642, +28032=>14643, +28033=>14644, +28035=>14645, +28036=>14646, +28038=>14647, +28042=>14648, +28043=>14649, +28045=>14650, +28047=>14651, +28048=>14652, +28050=>14653, +28054=>14654, +28055=>14655, +28056=>14656, +28057=>14657, +28058=>14658, +28060=>14659, +28066=>14660, +28069=>14661, +28076=>14662, +28077=>14663, +28080=>14664, +28081=>14665, +28083=>14666, +28084=>14667, +28086=>14668, +28087=>14669, +28089=>14670, +28090=>14671, +28091=>14672, +28092=>14673, +28093=>14674, +28094=>14675, +28097=>14676, +28098=>14677, +28099=>14678, +28104=>14679, +28105=>14680, +28106=>14681, +28109=>14682, +28110=>14683, +28111=>14684, +28112=>14685, +28114=>14686, +28115=>14687, +28116=>14688, +28117=>14689, +28119=>14690, +28122=>14691, +28123=>14692, +28124=>14693, +28127=>14694, +28130=>14695, +28131=>14696, +28133=>14697, +28135=>14698, +28136=>14699, +28137=>14700, +28141=>14701, +28143=>14702, +28144=>14703, +28146=>14704, +28148=>14705, +28152=>14706, +28157=>14707, +28158=>14708, +28159=>14709, +28160=>14710, +28161=>14711, +28162=>14712, +28163=>14713, +28164=>14714, +28166=>14715, +28167=>14716, +28168=>14717, +28169=>14718, +28171=>14719, +28175=>14720, +28178=>14721, +28179=>14722, +28181=>14723, +28184=>14724, +28185=>14725, +28187=>14726, +28188=>14727, +28190=>14728, +28191=>14729, +28194=>14730, +28199=>14731, +28200=>14732, +28202=>14733, +28206=>14734, +28208=>14735, +28209=>14736, +28211=>14737, +28213=>14738, +28214=>14739, +28215=>14740, +28217=>14741, +28219=>14742, +28220=>14743, +28221=>14744, +28223=>14745, +28224=>14746, +28225=>14747, +28226=>14748, +28229=>14749, +28230=>14750, +28231=>14751, +28232=>14752, +28233=>14753, +28234=>14754, +28235=>14755, +28236=>14756, +28239=>14757, +28240=>14758, +28241=>14759, +28242=>14760, +28245=>14761, +28247=>14762, +28249=>14763, +28250=>14764, +28252=>14765, +28253=>14766, +28256=>14767, +28257=>14768, +28258=>14769, +28259=>14770, +28260=>14771, +28261=>14772, +28262=>14773, +28263=>14774, +28264=>14775, +28265=>14776, +28266=>14777, +28268=>14778, +28269=>14779, +28272=>14780, +28273=>14781, +28274=>14782, +28275=>14783, +28276=>14784, +28277=>14785, +28278=>14786, +28279=>14787, +28280=>14788, +28281=>14789, +28282=>14790, +28283=>14791, +28284=>14792, +28285=>14793, +28288=>14794, +28289=>14795, +28290=>14796, +28292=>14797, +28295=>14798, +28296=>14799, +28298=>14800, +28299=>14801, +28300=>14802, +28301=>14803, +28302=>14804, +28305=>14805, +28306=>14806, +28307=>14807, +28308=>14808, +28309=>14809, +28311=>14810, +28313=>14811, +28314=>14812, +28315=>14813, +28318=>14814, +28320=>14815, +28321=>14816, +28323=>14817, +28324=>14818, +28326=>14819, +28328=>14820, +28329=>14821, +28331=>14822, +28332=>14823, +28333=>14824, +28334=>14825, +28336=>14826, +28339=>14827, +28341=>14828, +28344=>14829, +28345=>14830, +28348=>14831, +28350=>14832, +28351=>14833, +28352=>14834, +28355=>14835, +28358=>14836, +28360=>14837, +28361=>14838, +28362=>14839, +28365=>14840, +28368=>14841, +28370=>14842, +28374=>14843, +28376=>14844, +28377=>14845, +28379=>14846, +28380=>14847, +28381=>14848, +28387=>14849, +28391=>14850, +28394=>14851, +28395=>14852, +28397=>14853, +28398=>14854, +28400=>14855, +28401=>14856, +28403=>14857, +28405=>14858, +28406=>14859, +28410=>14860, +28411=>14861, +28412=>14862, +28413=>14863, +28414=>14864, +28416=>14865, +28419=>14866, +28420=>14867, +28421=>14868, +28423=>14869, +28424=>14870, +28426=>14871, +28427=>14872, +28428=>14873, +28429=>14874, +28430=>14875, +28432=>14876, +28433=>14877, +28434=>14878, +28438=>14879, +28439=>14880, +28440=>14881, +28441=>14882, +28443=>14883, +28444=>14884, +28445=>14885, +28446=>14886, +28447=>14887, +28449=>14888, +28453=>14889, +28454=>14890, +28455=>14891, +28456=>14892, +28462=>14893, +28464=>14894, +28468=>14895, +28469=>14896, +28471=>14897, +28473=>14898, +28474=>14899, +28475=>14900, +28476=>14901, +28477=>14902, +28480=>14903, +28482=>14904, +28483=>14905, +28484=>14906, +28485=>14907, +28488=>14908, +28489=>14909, +28490=>14910, +28492=>14911, +28494=>14912, +28495=>14913, +28496=>14914, +28498=>14915, +28499=>14916, +28501=>14917, +28502=>14918, +28503=>14919, +28506=>14920, +28507=>14921, +28509=>14922, +28511=>14923, +28512=>14924, +28513=>14925, +28515=>14926, +28517=>14927, +28519=>14928, +28520=>14929, +28521=>14930, +28522=>14931, +28523=>14932, +28524=>14933, +28529=>14934, +28531=>14935, +28533=>14936, +28534=>14937, +28537=>14938, +28539=>14939, +28541=>14940, +28542=>14941, +28545=>14942, +28546=>14943, +28547=>14944, +28549=>14945, +28554=>14946, +28555=>14947, +28559=>14948, +28560=>14949, +28561=>14950, +28562=>14951, +28563=>14952, +28564=>14953, +28565=>14954, +28566=>14955, +28568=>14956, +28569=>14957, +28570=>14958, +28571=>14959, +28573=>14960, +28574=>14961, +28575=>14962, +28578=>14963, +28579=>14964, +28581=>14965, +28582=>14966, +28584=>14967, +28586=>14968, +28587=>14969, +28588=>14970, +28589=>14971, +28591=>14972, +28592=>14973, +28594=>14974, +28596=>14975, +28597=>14976, +28599=>14977, +28600=>14978, +28602=>14979, +28603=>14980, +28604=>14981, +28605=>14982, +28606=>14983, +28607=>14984, +28612=>14985, +28613=>14986, +28614=>14987, +28615=>14988, +28616=>14989, +28618=>14990, +28619=>14991, +28620=>14992, +28621=>14993, +28622=>14994, +28623=>14995, +28624=>14996, +28627=>14997, +28628=>14998, +28630=>14999, +28631=>15000, +28633=>15001, +28634=>15002, +28636=>15003, +28637=>15004, +28642=>15005, +28643=>15006, +28645=>15007, +28646=>15008, +28647=>15009, +28648=>15010, +28649=>15011, +28650=>15012, +28652=>15013, +28653=>15014, +28658=>15015, +28659=>15016, +28660=>15017, +28661=>15018, +28662=>15019, +28663=>15020, +28664=>15021, +28665=>15022, +28667=>15023, +28669=>15024, +28671=>15025, +28672=>15026, +28673=>15027, +28674=>15028, +28675=>15029, +28676=>15030, +28679=>15031, +28680=>15032, +28682=>15033, +28684=>15034, +28685=>15035, +28686=>15036, +28688=>15037, +28690=>15038, +28691=>15039, +28692=>15040, +28694=>15041, +28695=>15042, +28697=>15043, +28700=>15044, +28702=>15045, +28705=>15046, +28706=>15047, +28708=>15048, +28709=>15049, +28710=>15050, +28713=>15051, +28714=>15052, +28715=>15053, +28716=>15054, +28717=>15055, +28718=>15056, +28719=>15057, +28721=>15058, +28723=>15059, +28724=>15060, +28726=>15061, +28727=>15062, +28728=>15063, +28730=>15064, +28731=>15065, +28732=>15066, +28733=>15067, +28735=>15068, +28736=>15069, +28737=>15070, +28738=>15071, +28741=>15072, +28742=>15073, +28743=>15074, +28744=>15075, +28745=>15076, +28746=>15077, +28747=>15078, +28749=>15079, +28750=>15080, +28752=>15081, +28754=>15082, +28755=>15083, +28756=>15084, +28758=>15085, +28759=>15086, +28761=>15087, +28762=>15088, +28763=>15089, +28764=>15090, +28767=>15091, +28768=>15092, +28769=>15093, +28770=>15094, +28773=>15095, +28774=>15096, +28776=>15097, +28777=>15098, +28778=>15099, +28782=>15100, +28785=>15101, +28786=>15102, +28787=>15103, +28788=>15104, +28791=>15105, +28793=>15106, +28794=>15107, +28795=>15108, +28797=>15109, +28801=>15110, +28802=>15111, +28803=>15112, +28804=>15113, +28806=>15114, +28807=>15115, +28808=>15116, +28811=>15117, +28812=>15118, +28813=>15119, +28815=>15120, +28816=>15121, +28817=>15122, +28819=>15123, +28823=>15124, +28824=>15125, +28826=>15126, +28827=>15127, +28830=>15128, +28831=>15129, +28832=>15130, +28833=>15131, +28834=>15132, +28835=>15133, +28836=>15134, +28837=>15135, +28838=>15136, +28839=>15137, +28840=>15138, +28841=>15139, +28842=>15140, +28848=>15141, +28850=>15142, +28852=>15143, +28853=>15144, +28854=>15145, +28858=>15146, +28862=>15147, +28863=>15148, +28868=>15149, +28869=>15150, +28870=>15151, +28871=>15152, +28873=>15153, +28875=>15154, +28876=>15155, +28877=>15156, +28878=>15157, +28880=>15158, +28881=>15159, +28882=>15160, +28883=>15161, +28884=>15162, +28885=>15163, +28886=>15164, +28887=>15165, +28890=>15166, +28892=>15167, +28893=>15168, +28894=>15169, +28896=>15170, +28897=>15171, +28898=>15172, +28899=>15173, +28901=>15174, +28906=>15175, +28910=>15176, +28912=>15177, +28913=>15178, +28914=>15179, +28915=>15180, +28917=>15181, +28918=>15182, +28920=>15183, +28922=>15184, +28923=>15185, +28924=>15186, +28926=>15187, +28927=>15188, +28928=>15189, +28929=>15190, +28930=>15191, +28931=>15192, +28932=>15193, +28933=>15194, +28934=>15195, +28935=>15196, +28936=>15197, +28939=>15198, +28940=>15199, +28941=>15200, +28942=>15201, +28943=>15202, +28945=>15203, +28946=>15204, +28948=>15205, +28951=>15206, +28955=>15207, +28956=>15208, +28957=>15209, +28958=>15210, +28959=>15211, +28960=>15212, +28962=>15213, +28963=>15214, +28964=>15215, +28965=>15216, +28967=>15217, +28968=>15218, +28969=>15219, +28970=>15220, +28971=>15221, +28972=>15222, +28973=>15223, +28974=>15224, +28978=>15225, +28979=>15226, +28980=>15227, +28981=>15228, +28983=>15229, +28984=>15230, +28985=>15231, +28986=>15232, +28987=>15233, +28988=>15234, +28989=>15235, +28990=>15236, +28991=>15237, +28992=>15238, +28993=>15239, +28994=>15240, +28995=>15241, +28996=>15242, +28998=>15243, +28999=>15244, +29000=>15245, +29003=>15246, +29005=>15247, +29007=>15248, +29008=>15249, +29009=>15250, +29011=>15251, +29012=>15252, +29013=>15253, +29014=>15254, +29015=>15255, +29016=>15256, +29017=>15257, +29018=>15258, +29019=>15259, +29021=>15260, +29023=>15261, +29024=>15262, +29025=>15263, +29027=>15264, +29029=>15265, +29034=>15266, +29035=>15267, +29037=>15268, +29039=>15269, +29040=>15270, +29041=>15271, +29044=>15272, +29045=>15273, +29046=>15274, +29047=>15275, +29049=>15276, +29051=>15277, +29052=>15278, +29054=>15279, +29055=>15280, +29056=>15281, +29057=>15282, +29058=>15283, +29059=>15284, +29061=>15285, +29062=>15286, +29063=>15287, +29064=>15288, +29065=>15289, +29067=>15290, +29068=>15291, +29069=>15292, +29070=>15293, +29072=>15294, +29073=>15295, +29075=>15296, +29077=>15297, +29078=>15298, +29082=>15299, +29083=>15300, +29084=>15301, +29085=>15302, +29086=>15303, +29089=>15304, +29090=>15305, +29091=>15306, +29092=>15307, +29093=>15308, +29094=>15309, +29095=>15310, +29097=>15311, +29098=>15312, +29099=>15313, +29101=>15314, +29102=>15315, +29103=>15316, +29104=>15317, +29106=>15318, +29108=>15319, +29110=>15320, +29111=>15321, +29112=>15322, +29114=>15323, +29115=>15324, +29116=>15325, +29117=>15326, +29119=>15327, +29120=>15328, +29122=>15329, +29124=>15330, +29125=>15331, +29126=>15332, +29127=>15333, +29129=>15334, +29130=>15335, +29131=>15336, +29132=>15337, +29133=>15338, +29135=>15339, +29136=>15340, +29137=>15341, +29139=>15342, +29142=>15343, +29143=>15344, +29144=>15345, +29146=>15346, +29147=>15347, +29149=>15348, +29150=>15349, +29153=>15350, +29154=>15351, +29155=>15352, +29156=>15353, +29160=>15354, +29161=>15355, +29162=>15356, +29163=>15357, +29164=>15358, +29167=>15359, +29168=>15360, +29169=>15361, +29170=>15362, +29171=>15363, +29173=>15364, +29174=>15365, +29175=>15366, +29176=>15367, +29178=>15368, +29179=>15369, +29181=>15370, +29183=>15371, +29184=>15372, +29185=>15373, +29186=>15374, +29187=>15375, +29188=>15376, +29189=>15377, +29191=>15378, +29192=>15379, +29193=>15380, +29194=>15381, +29195=>15382, +29196=>15383, +29198=>15384, +29199=>15385, +29201=>15386, +29202=>15387, +29203=>15388, +29204=>15389, +29205=>15390, +29206=>15391, +29207=>15392, +29208=>15393, +29209=>15394, +29210=>15395, +29212=>15396, +29214=>15397, +29215=>15398, +29216=>15399, +29217=>15400, +29218=>15401, +29219=>15402, +29220=>15403, +29221=>15404, +29222=>15405, +29223=>15406, +29225=>15407, +29227=>15408, +29229=>15409, +29230=>15410, +29231=>15411, +29235=>15412, +29236=>15413, +29244=>15414, +29248=>15415, +29249=>15416, +29250=>15417, +29251=>15418, +29252=>15419, +29253=>15420, +29254=>15421, +29257=>15422, +29258=>15423, +29259=>15424, +29262=>15425, +29263=>15426, +29264=>15427, +29265=>15428, +29267=>15429, +29268=>15430, +29269=>15431, +29271=>15432, +29274=>15433, +29276=>15434, +29278=>15435, +29280=>15436, +29283=>15437, +29284=>15438, +29285=>15439, +29288=>15440, +29290=>15441, +29291=>15442, +29292=>15443, +29293=>15444, +29296=>15445, +29297=>15446, +29299=>15447, +29300=>15448, +29302=>15449, +29303=>15450, +29304=>15451, +29307=>15452, +29308=>15453, +29314=>15454, +29315=>15455, +29317=>15456, +29318=>15457, +29319=>15458, +29320=>15459, +29321=>15460, +29324=>15461, +29326=>15462, +29328=>15463, +29329=>15464, +29331=>15465, +29332=>15466, +29333=>15467, +29335=>15468, +29336=>15469, +29337=>15470, +29338=>15471, +29339=>15472, +29340=>15473, +29341=>15474, +29342=>15475, +29344=>15476, +29345=>15477, +29347=>15478, +29348=>15479, +29349=>15480, +29350=>15481, +29352=>15482, +29353=>15483, +29354=>15484, +29355=>15485, +29358=>15486, +29361=>15487, +29362=>15488, +29363=>15489, +29365=>15490, +29370=>15491, +29371=>15492, +29372=>15493, +29373=>15494, +29374=>15495, +29375=>15496, +29381=>15497, +29382=>15498, +29383=>15499, +29385=>15500, +29386=>15501, +29387=>15502, +29388=>15503, +29391=>15504, +29393=>15505, +29395=>15506, +29396=>15507, +29397=>15508, +29398=>15509, +29400=>15510, +29402=>15511, +29403=>15512, +29404=>15513, +29405=>15514, +29407=>15515, +29410=>15516, +29411=>15517, +29412=>15518, +29413=>15519, +29414=>15520, +29415=>15521, +29418=>15522, +29419=>15523, +29429=>15524, +29430=>15525, +29438=>15526, +29439=>15527, +29440=>15528, +29442=>15529, +29444=>15530, +29445=>15531, +29446=>15532, +29447=>15533, +29448=>15534, +29449=>15535, +29451=>15536, +29452=>15537, +29453=>15538, +29455=>15539, +29456=>15540, +29457=>15541, +29458=>15542, +29460=>15543, +29464=>15544, +29465=>15545, +29466=>15546, +29471=>15547, +29472=>15548, +29475=>15549, +29476=>15550, +29478=>15551, +29479=>15552, +29480=>15553, +29485=>15554, +29487=>15555, +29488=>15556, +29490=>15557, +29491=>15558, +29493=>15559, +29498=>15560, +29500=>15561, +29501=>15562, +29504=>15563, +29506=>15564, +29507=>15565, +29510=>15566, +29511=>15567, +29512=>15568, +29513=>15569, +29514=>15570, +29515=>15571, +29516=>15572, +29518=>15573, +29519=>15574, +29521=>15575, +29523=>15576, +29524=>15577, +29525=>15578, +29526=>15579, +29528=>15580, +29529=>15581, +29530=>15582, +29531=>15583, +29532=>15584, +29533=>15585, +29534=>15586, +29535=>15587, +29537=>15588, +29538=>15589, +29539=>15590, +29540=>15591, +29541=>15592, +29542=>15593, +29543=>15594, +29545=>15595, +29550=>15596, +29553=>15597, +29555=>15598, +29556=>15599, +29558=>15600, +29561=>15601, +29565=>15602, +29567=>15603, +29569=>15604, +29570=>15605, +29571=>15606, +29573=>15607, +29574=>15608, +29576=>15609, +29578=>15610, +29580=>15611, +29581=>15612, +29583=>15613, +29584=>15614, +29586=>15615, +29587=>15616, +29588=>15617, +29589=>15618, +29591=>15619, +29592=>15620, +29593=>15621, +29594=>15622, +29596=>15623, +29597=>15624, +29598=>15625, +29600=>15626, +29601=>15627, +29603=>15628, +29604=>15629, +29605=>15630, +29606=>15631, +29607=>15632, +29608=>15633, +29610=>15634, +29612=>15635, +29613=>15636, +29617=>15637, +29620=>15638, +29621=>15639, +29622=>15640, +29624=>15641, +29625=>15642, +29628=>15643, +29629=>15644, +29630=>15645, +29631=>15646, +29633=>15647, +29635=>15648, +29636=>15649, +29637=>15650, +29638=>15651, +29639=>15652, +29643=>15653, +29644=>15654, +29646=>15655, +29650=>15656, +29651=>15657, +29652=>15658, +29653=>15659, +29654=>15660, +29655=>15661, +29656=>15662, +29658=>15663, +29659=>15664, +29660=>15665, +29661=>15666, +29663=>15667, +29665=>15668, +29666=>15669, +29667=>15670, +29668=>15671, +29670=>15672, +29672=>15673, +29674=>15674, +29675=>15675, +29676=>15676, +29678=>15677, +29679=>15678, +29680=>15679, +29681=>15680, +29683=>15681, +29684=>15682, +29685=>15683, +29686=>15684, +29687=>15685, +29688=>15686, +29689=>15687, +29690=>15688, +29691=>15689, +29692=>15690, +29693=>15691, +29695=>15692, +29696=>15693, +29697=>15694, +29698=>15695, +29700=>15696, +29703=>15697, +29704=>15698, +29707=>15699, +29708=>15700, +29709=>15701, +29710=>15702, +29713=>15703, +29714=>15704, +29715=>15705, +29716=>15706, +29717=>15707, +29718=>15708, +29719=>15709, +29720=>15710, +29721=>15711, +29724=>15712, +29725=>15713, +29726=>15714, +29727=>15715, +29728=>15716, +29729=>15717, +29731=>15718, +29732=>15719, +29735=>15720, +29737=>15721, +29739=>15722, +29741=>15723, +29743=>15724, +29745=>15725, +29746=>15726, +29751=>15727, +29752=>15728, +29753=>15729, +29754=>15730, +29755=>15731, +29757=>15732, +29758=>15733, +29760=>15734, +29762=>15735, +29763=>15736, +29764=>15737, +29765=>15738, +29766=>15739, +29767=>15740, +29768=>15741, +29769=>15742, +29770=>15743, +29772=>15744, +29773=>15745, +29774=>15746, +29775=>15747, +29776=>15748, +29777=>15749, +29778=>15750, +29779=>15751, +29780=>15752, +29782=>15753, +29784=>15754, +29789=>15755, +29792=>15756, +29793=>15757, +29794=>15758, +29796=>15759, +29797=>15760, +29798=>15761, +29799=>15762, +29800=>15763, +29803=>15764, +29804=>15765, +29806=>15766, +29807=>15767, +29809=>15768, +29810=>15769, +29811=>15770, +29812=>15771, +29813=>15772, +29816=>15773, +29817=>15774, +29818=>15775, +29819=>15776, +29820=>15777, +29821=>15778, +29823=>15779, +29826=>15780, +29828=>15781, +29829=>15782, +29830=>15783, +29832=>15784, +29834=>15785, +29836=>15786, +29837=>15787, +29839=>15788, +29841=>15789, +29842=>15790, +29843=>15791, +29844=>15792, +29845=>15793, +29846=>15794, +29847=>15795, +29848=>15796, +29849=>15797, +29850=>15798, +29851=>15799, +29853=>15800, +29855=>15801, +29856=>15802, +29857=>15803, +29858=>15804, +29860=>15805, +29861=>15806, +29866=>15807, +29867=>15808, +29868=>15809, +29869=>15810, +29870=>15811, +29871=>15812, +29873=>15813, +29874=>15814, +29875=>15815, +29876=>15816, +29877=>15817, +29878=>15818, +29879=>15819, +29880=>15820, +29881=>15821, +29883=>15822, +29884=>15823, +29886=>15824, +29887=>15825, +29888=>15826, +29889=>15827, +29890=>15828, +29891=>15829, +29892=>15830, +29893=>15831, +29894=>15832, +29895=>15833, +29896=>15834, +29897=>15835, +29899=>15836, +29900=>15837, +29901=>15838, +29902=>15839, +29904=>15840, +29905=>15841, +29907=>15842, +29909=>15843, +29910=>15844, +29911=>15845, +29912=>15846, +29913=>15847, +29915=>15848, +29917=>15849, +29919=>15850, +29921=>15851, +29925=>15852, +29927=>15853, +29928=>15854, +29929=>15855, +29930=>15856, +29931=>15857, +29932=>15858, +29933=>15859, +29936=>15860, +29937=>15861, +29938=>15862, +29939=>15863, +29941=>15864, +29944=>15865, +29945=>15866, +29946=>15867, +29947=>15868, +29948=>15869, +29949=>15870, +29950=>15871, +29952=>15872, +29953=>15873, +29954=>15874, +29955=>15875, +29957=>15876, +29958=>15877, +29959=>15878, +29960=>15879, +29961=>15880, +29962=>15881, +29963=>15882, +29966=>15883, +29968=>15884, +29970=>15885, +29972=>15886, +29973=>15887, +29974=>15888, +29975=>15889, +29979=>15890, +29981=>15891, +29982=>15892, +29984=>15893, +29985=>15894, +29986=>15895, +29988=>15896, +29990=>15897, +29991=>15898, +29994=>15899, +29998=>15900, +30004=>15901, +30006=>15902, +30009=>15903, +30012=>15904, +30013=>15905, +30015=>15906, +30017=>15907, +30018=>15908, +30019=>15909, +30020=>15910, +30022=>15911, +30023=>15912, +30025=>15913, +30026=>15914, +30029=>15915, +30032=>15916, +30033=>15917, +30034=>15918, +30035=>15919, +30037=>15920, +30038=>15921, +30039=>15922, +30040=>15923, +30046=>15924, +30047=>15925, +30048=>15926, +30049=>15927, +30051=>15928, +30052=>15929, +30055=>15930, +30056=>15931, +30057=>15932, +30060=>15933, +30061=>15934, +30062=>15935, +30063=>15936, +30064=>15937, +30065=>15938, +30067=>15939, +30069=>15940, +30071=>15941, +30074=>15942, +30075=>15943, +30076=>15944, +30077=>15945, +30078=>15946, +30080=>15947, +30081=>15948, +30082=>15949, +30084=>15950, +30085=>15951, +30088=>15952, +30089=>15953, +30090=>15954, +30092=>15955, +30093=>15956, +30094=>15957, +30096=>15958, +30099=>15959, +30101=>15960, +30104=>15961, +30107=>15962, +30108=>15963, +30110=>15964, +30114=>15965, +30118=>15966, +30119=>15967, +30120=>15968, +30121=>15969, +30122=>15970, +30125=>15971, +30134=>15972, +30135=>15973, +30138=>15974, +30139=>15975, +30143=>15976, +30144=>15977, +30145=>15978, +30150=>15979, +30155=>15980, +30156=>15981, +30158=>15982, +30159=>15983, +30160=>15984, +30161=>15985, +30163=>15986, +30167=>15987, +30170=>15988, +30172=>15989, +30173=>15990, +30175=>15991, +30176=>15992, +30177=>15993, +30181=>15994, +30185=>15995, +30188=>15996, +30189=>15997, +30190=>15998, +30191=>15999, +30194=>16000, +30195=>16001, +30197=>16002, +30198=>16003, +30199=>16004, +30200=>16005, +30202=>16006, +30203=>16007, +30205=>16008, +30206=>16009, +30212=>16010, +30214=>16011, +30215=>16012, +30216=>16013, +30217=>16014, +30222=>16015, +30223=>16016, +30225=>16017, +30226=>16018, +30227=>16019, +30228=>16020, +30230=>16021, +30234=>16022, +30236=>16023, +30237=>16024, +30243=>16025, +30248=>16026, +30252=>16027, +30254=>16028, +30255=>16029, +30257=>16030, +30258=>16031, +30262=>16032, +30263=>16033, +30265=>16034, +30266=>16035, +30269=>16036, +30273=>16037, +30276=>16038, +30277=>16039, +30280=>16040, +30282=>16041, +30283=>16042, +30286=>16043, +30287=>16044, +30288=>16045, +30289=>16046, +30290=>16047, +30291=>16048, +30293=>16049, +30295=>16050, +30297=>16051, +30298=>16052, +30299=>16053, +30301=>16054, +30304=>16055, +30305=>16056, +30310=>16057, +30312=>16058, +30314=>16059, +30323=>16060, +30324=>16061, +30325=>16062, +12136=>16063, +30326=>16063, +30327=>16064, +30329=>16065, +30330=>16066, +30335=>16067, +30336=>16068, +30337=>16069, +30339=>16070, +30341=>16071, +30345=>16072, +30346=>16073, +30348=>16074, +30349=>16075, +30351=>16076, +30352=>16077, +30354=>16078, +30356=>16079, +30357=>16080, +30359=>16081, +30360=>16082, +30363=>16083, +30364=>16084, +30365=>16085, +30366=>16086, +30367=>16087, +30368=>16088, +30369=>16089, +30370=>16090, +30371=>16091, +30373=>16092, +30374=>16093, +30375=>16094, +30376=>16095, +30377=>16096, +30378=>16097, +30379=>16098, +30380=>16099, +30381=>16100, +30383=>16101, +30384=>16102, +30387=>16103, +30389=>16104, +30390=>16105, +30391=>16106, +30393=>16107, +30395=>16108, +30396=>16109, +30397=>16110, +30398=>16111, +30400=>16112, +30401=>16113, +30403=>16114, +30404=>16115, +30407=>16116, +30409=>16117, +30411=>16118, +30412=>16119, +30419=>16120, +30421=>16121, +30425=>16122, +30426=>16123, +30428=>16124, +30429=>16125, +30432=>16126, +30434=>16127, +30438=>16128, +30440=>16129, +30441=>16130, +30442=>16131, +30443=>16132, +30444=>16133, +30445=>16134, +30448=>16135, +30451=>16136, +30453=>16137, +30454=>16138, +30455=>16139, +30458=>16140, +30459=>16141, +30461=>16142, +30463=>16143, +30464=>16144, +30466=>16145, +30467=>16146, +30469=>16147, +30470=>16148, +30474=>16149, +30476=>16150, +30478=>16151, +30479=>16152, +30480=>16153, +30481=>16154, +30482=>16155, +30483=>16156, +30484=>16157, +30485=>16158, +30486=>16159, +30487=>16160, +30488=>16161, +30491=>16162, +30492=>16163, +30493=>16164, +30494=>16165, +30497=>16166, +30499=>16167, +30500=>16168, +30501=>16169, +30503=>16170, +30506=>16171, +30507=>16172, +30508=>16173, +30510=>16174, +30512=>16175, +30513=>16176, +30514=>16177, +30515=>16178, +30516=>16179, +30521=>16180, +30523=>16181, +30525=>16182, +30526=>16183, +30527=>16184, +30530=>16185, +30532=>16186, +30533=>16187, +30534=>16188, +30536=>16189, +30537=>16190, +30538=>16191, +30539=>16192, +30540=>16193, +30541=>16194, +30542=>16195, +30546=>16196, +30547=>16197, +30548=>16198, +30549=>16199, +30550=>16200, +30551=>16201, +30552=>16202, +30553=>16203, +30556=>16204, +30557=>16205, +30559=>16206, +30560=>16207, +30564=>16208, +30567=>16209, +30569=>16210, +30570=>16211, +30573=>16212, +30574=>16213, +30575=>16214, +30576=>16215, +30577=>16216, +30578=>16217, +30579=>16218, +30580=>16219, +30581=>16220, +30582=>16221, +30583=>16222, +30584=>16223, +30586=>16224, +30587=>16225, +30588=>16226, +30593=>16227, +30594=>16228, +30595=>16229, +30598=>16230, +30599=>16231, +30600=>16232, +30601=>16233, +30602=>16234, +30603=>16235, +30607=>16236, +30608=>16237, +30611=>16238, +30612=>16239, +30613=>16240, +30614=>16241, +30615=>16242, +30617=>16243, +30618=>16244, +30619=>16245, +30620=>16246, +30621=>16247, +30625=>16248, +30627=>16249, +30628=>16250, +30630=>16251, +30632=>16252, +30635=>16253, +30638=>16254, +30639=>16255, +30641=>16256, +30642=>16257, +30644=>16258, +30646=>16259, +30647=>16260, +30648=>16261, +30649=>16262, +30650=>16263, +30654=>16264, +30656=>16265, +30657=>16266, +30658=>16267, +30659=>16268, +30660=>16269, +30661=>16270, +30662=>16271, +30664=>16272, +30665=>16273, +30666=>16274, +30667=>16275, +30668=>16276, +30670=>16277, +30671=>16278, +30672=>16279, +30673=>16280, +30674=>16281, +30675=>16282, +30676=>16283, +30677=>16284, +30678=>16285, +30680=>16286, +30681=>16287, +30685=>16288, +30686=>16289, +30687=>16290, +30688=>16291, +30689=>16292, +30692=>16293, +30694=>16294, +30696=>16295, +30698=>16296, +30704=>16297, +30705=>16298, +30706=>16299, +30708=>16300, +30709=>16301, +30711=>16302, +30713=>16303, +30714=>16304, +30715=>16305, +30716=>16306, +30723=>16307, +30724=>16308, +30725=>16309, +30726=>16310, +30727=>16311, +30728=>16312, +30730=>16313, +30731=>16314, +30734=>16315, +30735=>16316, +30736=>16317, +30739=>16318, +30741=>16319, +30745=>16320, +30747=>16321, +30750=>16322, +30752=>16323, +30753=>16324, +30754=>16325, +30756=>16326, +30760=>16327, +30762=>16328, +30763=>16329, +30766=>16330, +30767=>16331, +30769=>16332, +30770=>16333, +30771=>16334, +30773=>16335, +30774=>16336, +30781=>16337, +30783=>16338, +30785=>16339, +30786=>16340, +30788=>16341, +30790=>16342, +30792=>16343, +30793=>16344, +30794=>16345, +30795=>16346, +30797=>16347, +30799=>16348, +30801=>16349, +30803=>16350, +30804=>16351, +30808=>16352, +30809=>16353, +30810=>16354, +30811=>16355, +30812=>16356, +30814=>16357, +30815=>16358, +30816=>16359, +30817=>16360, +30818=>16361, +30819=>16362, +30821=>16363, +30822=>16364, +30823=>16365, +30825=>16366, +30832=>16367, +30833=>16368, +30834=>16369, +30835=>16370, +30836=>16371, +30837=>16372, +30838=>16373, +30840=>16374, +30841=>16375, +30842=>16376, +30843=>16377, +30845=>16378, +30846=>16379, +30847=>16380, +30848=>16381, +30849=>16382, +30850=>16383, +30851=>16384, +30852=>16385, +30853=>16386, +30854=>16387, +30856=>16388, +30858=>16389, +30859=>16390, +30863=>16391, +30864=>16392, +30866=>16393, +30868=>16394, +30869=>16395, +30870=>16396, +30873=>16397, +30877=>16398, +30878=>16399, +30880=>16400, +30882=>16401, +30884=>16402, +30886=>16403, +30888=>16404, +30890=>16405, +30891=>16406, +30892=>16407, +30894=>16408, +30895=>16409, +30901=>16410, +30902=>16411, +30903=>16412, +30907=>16413, +30909=>16414, +30911=>16415, +30912=>16416, +30914=>16417, +30915=>16418, +30916=>16419, +30918=>16420, +30919=>16421, +30920=>16422, +30924=>16423, +30925=>16424, +30926=>16425, +30927=>16426, +30929=>16427, +30930=>16428, +30931=>16429, +30934=>16430, +30935=>16431, +30936=>16432, +30939=>16433, +30940=>16434, +30941=>16435, +30942=>16436, +30943=>16437, +30944=>16438, +30945=>16439, +30946=>16440, +30948=>16441, +30949=>16442, +30950=>16443, +30953=>16444, +30954=>16445, +30955=>16446, +30957=>16447, +30958=>16448, +30960=>16449, +30961=>16450, +30963=>16451, +30965=>16452, +30966=>16453, +30968=>16454, +30969=>16455, +30971=>16456, +30972=>16457, +30974=>16458, +30975=>16459, +30976=>16460, +30978=>16461, +30979=>16462, +30980=>16463, +30982=>16464, +30983=>16465, +30984=>16466, +30985=>16467, +30986=>16468, +30987=>16469, +30988=>16470, +30989=>16471, +30991=>16472, +30992=>16473, +30993=>16474, +30994=>16475, +30996=>16476, +30997=>16477, +30998=>16478, +30999=>16479, +31000=>16480, +31002=>16481, +31003=>16482, +31004=>16483, +31005=>16484, +31007=>16485, +31008=>16486, +31009=>16487, +31010=>16488, +31011=>16489, +31013=>16490, +31015=>16491, +31016=>16492, +31017=>16493, +31021=>16494, +31022=>16495, +31023=>16496, +31024=>16497, +31026=>16498, +31027=>16499, +31029=>16500, +31030=>16501, +31031=>16502, +31032=>16503, +31033=>16504, +31037=>16505, +31039=>16506, +31042=>16507, +31043=>16508, +31044=>16509, +31045=>16510, +31047=>16511, +31050=>16512, +31051=>16513, +31052=>16514, +31053=>16515, +31054=>16516, +31055=>16517, +31056=>16518, +31057=>16519, +31058=>16520, +31060=>16521, +31061=>16522, +31064=>16523, +31065=>16524, +31073=>16525, +31075=>16526, +31076=>16527, +31078=>16528, +31081=>16529, +31082=>16530, +31083=>16531, +31084=>16532, +31086=>16533, +31088=>16534, +31089=>16535, +31090=>16536, +31091=>16537, +31092=>16538, +31093=>16539, +31094=>16540, +31097=>16541, +31099=>16542, +31100=>16543, +31101=>16544, +31102=>16545, +31103=>16546, +31106=>16547, +31107=>16548, +31110=>16549, +31111=>16550, +31112=>16551, +31113=>16552, +31115=>16553, +31116=>16554, +31120=>16555, +31121=>16556, +31122=>16557, +31123=>16558, +31124=>16559, +31125=>16560, +31126=>16561, +31127=>16562, +31128=>16563, +31129=>16564, +31131=>16565, +31132=>16566, +31133=>16567, +31134=>16568, +31135=>16569, +31136=>16570, +31137=>16571, +31138=>16572, +31139=>16573, +31140=>16574, +31141=>16575, +31144=>16576, +31145=>16577, +31147=>16578, +31148=>16579, +31149=>16580, +31151=>16581, +31154=>16582, +31156=>16583, +31157=>16584, +31158=>16585, +31159=>16586, +12145=>16587, +31160=>16587, +31164=>16588, +31167=>16589, +31170=>16590, +31172=>16591, +31173=>16592, +31175=>16593, +31176=>16594, +31178=>16595, +63893=>16595, +31180=>16596, +31182=>16597, +31183=>16598, +31184=>16599, +31187=>16600, +31188=>16601, +31190=>16602, +31191=>16603, +31193=>16604, +31194=>16605, +31195=>16606, +31196=>16607, +31197=>16608, +31198=>16609, +31200=>16610, +31201=>16611, +31202=>16612, +31205=>16613, +31208=>16614, +31210=>16615, +31212=>16616, +31214=>16617, +31217=>16618, +31218=>16619, +31219=>16620, +31220=>16621, +31221=>16622, +31222=>16623, +31223=>16624, +31225=>16625, +31226=>16626, +31228=>16627, +31230=>16628, +31231=>16629, +31233=>16630, +31236=>16631, +31237=>16632, +31239=>16633, +31240=>16634, +31241=>16635, +31242=>16636, +31244=>16637, +31247=>16638, +31248=>16639, +31249=>16640, +31250=>16641, +31251=>16642, +31253=>16643, +31254=>16644, +31256=>16645, +31257=>16646, +31259=>16647, +31260=>16648, +31261=>16649, +31263=>16650, +31265=>16651, +31266=>16652, +31268=>16653, +31269=>16654, +31270=>16655, +31271=>16656, +31272=>16657, +31273=>16658, +31274=>16659, +31275=>16660, +31276=>16661, +31277=>16662, +31279=>16663, +31280=>16664, +31282=>16665, +31284=>16666, +31285=>16667, +31286=>16668, +31288=>16669, +31290=>16670, +31294=>16671, +31297=>16672, +31298=>16673, +31299=>16674, +31300=>16675, +31301=>16676, +31303=>16677, +31304=>16678, +31305=>16679, +31306=>16680, +31307=>16681, +31311=>16682, +31312=>16683, +31314=>16684, +31315=>16685, +31316=>16686, +31317=>16687, +31318=>16688, +31320=>16689, +31321=>16690, +31322=>16691, +31323=>16692, +31324=>16693, +31325=>16694, +31326=>16695, +31327=>16696, +31328=>16697, +31331=>16698, +31332=>16699, +31333=>16700, +31334=>16701, +31335=>16702, +31336=>16703, +31338=>16704, +31340=>16705, +31341=>16706, +31342=>16707, +31343=>16708, +31345=>16709, +31346=>16710, +31347=>16711, +31349=>16712, +31355=>16713, +31356=>16714, +31357=>16715, +31358=>16716, +31362=>16717, +31365=>16718, +31367=>16719, +31369=>16720, +31370=>16721, +31371=>16722, +31372=>16723, +31374=>16724, +31375=>16725, +31376=>16726, +31379=>16727, +31380=>16728, +31385=>16729, +31386=>16730, +31387=>16731, +31390=>16732, +31393=>16733, +31394=>16734, +31395=>16735, +31396=>16736, +31399=>16737, +31403=>16738, +31407=>16739, +31408=>16740, +31409=>16741, +31410=>16742, +31412=>16743, +31413=>16744, +31415=>16745, +31416=>16746, +31417=>16747, +31419=>16748, +31420=>16749, +31421=>16750, +31422=>16751, +31424=>16752, +31425=>16753, +31426=>16754, +31427=>16755, +31430=>16756, +31433=>16757, +31436=>16758, +31437=>16759, +31438=>16760, +31439=>16761, +31440=>16762, +31441=>16763, +31442=>16764, +31443=>16765, +31444=>16766, +31445=>16767, +31447=>16768, +31448=>16769, +31450=>16770, +31451=>16771, +31452=>16772, +31453=>16773, +31457=>16774, +31458=>16775, +31460=>16776, +31463=>16777, +31464=>16778, +31465=>16779, +31467=>16780, +31468=>16781, +31470=>16782, +31472=>16783, +31473=>16784, +31474=>16785, +31475=>16786, +31476=>16787, +31477=>16788, +31479=>16789, +31480=>16790, +31483=>16791, +31484=>16792, +31486=>16793, +31488=>16794, +31489=>16795, +31490=>16796, +31493=>16797, +31495=>16798, +31497=>16799, +31500=>16800, +31501=>16801, +31502=>16802, +31504=>16803, +31506=>16804, +31507=>16805, +31510=>16806, +31511=>16807, +31512=>16808, +31514=>16809, +31516=>16810, +31517=>16811, +31519=>16812, +31521=>16813, +31522=>16814, +31523=>16815, +31527=>16816, +31529=>16817, +31533=>16818, +31535=>16819, +31536=>16820, +31538=>16821, +31540=>16822, +31541=>16823, +31542=>16824, +31543=>16825, +31545=>16826, +31547=>16827, +31549=>16828, +31551=>16829, +31552=>16830, +31553=>16831, +31554=>16832, +31555=>16833, +31556=>16834, +31560=>16835, +31562=>16836, +31565=>16837, +31566=>16838, +31571=>16839, +31573=>16840, +31575=>16841, +31577=>16842, +31580=>16843, +31582=>16844, +31583=>16845, +31585=>16846, +31587=>16847, +31588=>16848, +31589=>16849, +31590=>16850, +31592=>16851, +31593=>16852, +31594=>16853, +31595=>16854, +31596=>16855, +31597=>16856, +31599=>16857, +31600=>16858, +31603=>16859, +31604=>16860, +31606=>16861, +31608=>16862, +31610=>16863, +31612=>16864, +31613=>16865, +31615=>16866, +31617=>16867, +31618=>16868, +31619=>16869, +31620=>16870, +31622=>16871, +31623=>16872, +31624=>16873, +31625=>16874, +31626=>16875, +31628=>16876, +31630=>16877, +31631=>16878, +31633=>16879, +31634=>16880, +31635=>16881, +31638=>16882, +31640=>16883, +31641=>16884, +31642=>16885, +31643=>16886, +31646=>16887, +31647=>16888, +31648=>16889, +31651=>16890, +31652=>16891, +31653=>16892, +31662=>16893, +31663=>16894, +31664=>16895, +31666=>16896, +31667=>16897, +31669=>16898, +31670=>16899, +31671=>16900, +31673=>16901, +31674=>16902, +31675=>16903, +31676=>16904, +31677=>16905, +31678=>16906, +31679=>16907, +31682=>16908, +31683=>16909, +31685=>16910, +31688=>16911, +31690=>16912, +31693=>16913, +31694=>16914, +31695=>16915, +31696=>16916, +31698=>16917, +31700=>16918, +31701=>16919, +31702=>16920, +31703=>16921, +31704=>16922, +31707=>16923, +31708=>16924, +31710=>16925, +31711=>16926, +31712=>16927, +31714=>16928, +31715=>16929, +31719=>16930, +31720=>16931, +31723=>16932, +31724=>16933, +31725=>16934, +31727=>16935, +31728=>16936, +31730=>16937, +31732=>16938, +31733=>16939, +31734=>16940, +31736=>16941, +31737=>16942, +31738=>16943, +31739=>16944, +31741=>16945, +31743=>16946, +31745=>16947, +31746=>16948, +31747=>16949, +31748=>16950, +31749=>16951, +31750=>16952, +31752=>16953, +31753=>16954, +31754=>16955, +31758=>16956, +31760=>16957, +31761=>16958, +31762=>16959, +31763=>16960, +31764=>16961, +31765=>16962, +31767=>16963, +31768=>16964, +31769=>16965, +31770=>16966, +31771=>16967, +31772=>16968, +31773=>16969, +31776=>16970, +31778=>16971, +31780=>16972, +31781=>16973, +31784=>16974, +31785=>16975, +31788=>16976, +31789=>16977, +31790=>16978, +31791=>16979, +31792=>16980, +31793=>16981, +31794=>16982, +31795=>16983, +31796=>16984, +31797=>16985, +31798=>16986, +31799=>16987, +31801=>16988, +31802=>16989, +31803=>16990, +31804=>16991, +31810=>16992, +31812=>16993, +31813=>16994, +31814=>16995, +31815=>16996, +31816=>16997, +31817=>16998, +31818=>16999, +31819=>17000, +31822=>17001, +31823=>17002, +31824=>17003, +31825=>17004, +31826=>17005, +31827=>17006, +31828=>17007, +31829=>17008, +31830=>17009, +31831=>17010, +31832=>17011, +31833=>17012, +31834=>17013, +31835=>17014, +31837=>17015, +31838=>17016, +31841=>17017, +31842=>17018, +31843=>17019, +31845=>17020, +31846=>17021, +31847=>17022, +31848=>17023, +31851=>17024, +31853=>17025, +31855=>17026, +31856=>17027, +31857=>17028, +31861=>17029, +31862=>17030, +31863=>17031, +31864=>17032, +31865=>17033, +31866=>17034, +31870=>17035, +31871=>17036, +31872=>17037, +31873=>17038, +31874=>17039, +31875=>17040, +31876=>17041, +31877=>17042, +31878=>17043, +31879=>17044, +31880=>17045, +31882=>17046, +31883=>17047, +31884=>17048, +31885=>17049, +31886=>17050, +31887=>17051, +31888=>17052, +31891=>17053, +31892=>17054, +31894=>17055, +31897=>17056, +31898=>17057, +31899=>17058, +31904=>17059, +31905=>17060, +31907=>17061, +31910=>17062, +31911=>17063, +31912=>17064, +31913=>17065, +31915=>17066, +31916=>17067, +31917=>17068, +31919=>17069, +31920=>17070, +31924=>17071, +31925=>17072, +31926=>17073, +31927=>17074, +31928=>17075, +31930=>17076, +31931=>17077, +31935=>17078, +31936=>17079, +31938=>17080, +31939=>17081, +31940=>17082, +31942=>17083, +31945=>17084, +31947=>17085, +31950=>17086, +31951=>17087, +31952=>17088, +31953=>17089, +31954=>17090, +31955=>17091, +31956=>17092, +31960=>17093, +31962=>17094, +31963=>17095, +31969=>17096, +31970=>17097, +31971=>17098, +31972=>17099, +31973=>17100, +31974=>17101, +31977=>17102, +31978=>17103, +31979=>17104, +31980=>17105, +31981=>17106, +31982=>17107, +31985=>17108, +31987=>17109, +31989=>17110, +31991=>17111, +31994=>17112, +31996=>17113, +31997=>17114, +31999=>17115, +32001=>17116, +32003=>17117, +32012=>17118, +32014=>17119, +32015=>17120, +32017=>17121, +32018=>17122, +32022=>17123, +32024=>17124, +32029=>17125, +32030=>17126, +32031=>17127, +32035=>17128, +32036=>17129, +32037=>17130, +32038=>17131, +32040=>17132, +32041=>17133, +32042=>17134, +32044=>17135, +32045=>17136, +32046=>17137, +32052=>17138, +32053=>17139, +32054=>17140, +32055=>17141, +32056=>17142, +32059=>17143, +32061=>17144, +32062=>17145, +32065=>17146, +32067=>17147, +32069=>17148, +32071=>17149, +32072=>17150, +32073=>17151, +32074=>17152, +32075=>17153, +32076=>17154, +32077=>17155, +32079=>17156, +32081=>17157, +32082=>17158, +32083=>17159, +32084=>17160, +32085=>17161, +32086=>17162, +32087=>17163, +32088=>17164, +32089=>17165, +32090=>17166, +32091=>17167, +32092=>17168, +32095=>17169, +32096=>17170, +32099=>17171, +32100=>17172, +32101=>17173, +32103=>17174, +32105=>17175, +32106=>17176, +32107=>17177, +32108=>17178, +32109=>17179, +32111=>17180, +32112=>17181, +32116=>17182, +32117=>17183, +32120=>17184, +32122=>17185, +32123=>17186, +32124=>17187, +32125=>17188, +32126=>17189, +32127=>17190, +32128=>17191, +32130=>17192, +32132=>17193, +32133=>17194, +32135=>17195, +32138=>17196, +32139=>17197, +32140=>17198, +32141=>17199, +32142=>17200, +32144=>17201, +32145=>17202, +32146=>17203, +32148=>17204, +32149=>17205, +32150=>17206, +32151=>17207, +32152=>17208, +32153=>17209, +32154=>17210, +32155=>17211, +32157=>17212, +32159=>17213, +32160=>17214, +32161=>17215, +32164=>17216, +32165=>17217, +32167=>17218, +32168=>17219, +32169=>17220, +32170=>17221, +32175=>17222, +32181=>17223, +32182=>17224, +32183=>17225, +32188=>17226, +32192=>17227, +32193=>17228, +32194=>17229, +32195=>17230, +32197=>17231, +32198=>17232, +32200=>17233, +32201=>17234, +32204=>17235, +32205=>17236, +32206=>17237, +32207=>17238, +32208=>17239, +32211=>17240, +32213=>17241, +32214=>17242, +32218=>17243, +32219=>17244, +32220=>17245, +32223=>17246, +32226=>17247, +32228=>17248, +32229=>17249, +32231=>17250, +32234=>17251, +32235=>17252, +32237=>17253, +32238=>17254, +32240=>17255, +32243=>17256, +32245=>17257, +32247=>17258, +32248=>17259, +32250=>17260, +32252=>17261, +32253=>17262, +32254=>17263, +32255=>17264, +32256=>17265, +32257=>17266, +32258=>17267, +32259=>17268, +32260=>17269, +32261=>17270, +32262=>17271, +32263=>17272, +32268=>17273, +32269=>17274, +32270=>17275, +32271=>17276, +32274=>17277, +32275=>17278, +32276=>17279, +32277=>17280, +32278=>17281, +32279=>17282, +32280=>17283, +32281=>17284, +32282=>17285, +32284=>17286, +32288=>17287, +32289=>17288, +32290=>17289, +32292=>17290, +32293=>17291, +32294=>17292, +32296=>17293, +32297=>17294, +32298=>17295, +32300=>17296, +32303=>17297, +32304=>17298, +32307=>17299, +32312=>17300, +32314=>17301, +32316=>17302, +32319=>17303, +32320=>17304, +32322=>17305, +32323=>17306, +32324=>17307, +32328=>17308, +32329=>17309, +32330=>17310, +32331=>17311, +32332=>17312, +32333=>17313, +32334=>17314, +32335=>17315, +32336=>17316, +32337=>17317, +32339=>17318, +32342=>17319, +32343=>17320, +32344=>17321, +32345=>17322, +32347=>17323, +32348=>17324, +32349=>17325, +32351=>17326, +32352=>17327, +32353=>17328, +32355=>17329, +32356=>17330, +32357=>17331, +32358=>17332, +32359=>17333, +32360=>17334, +32364=>17335, +32369=>17336, +32370=>17337, +32372=>17338, +32373=>17339, +32374=>17340, +32375=>17341, +32376=>17342, +32378=>17343, +32379=>17344, +32383=>17345, +32384=>17346, +32385=>17347, +32387=>17348, +32388=>17349, +32389=>17350, +32390=>17351, +32391=>17352, +32393=>17353, +32395=>17354, +32398=>17355, +32400=>17356, +32401=>17357, +32402=>17358, +32405=>17359, +32407=>17360, +32409=>17361, +32410=>17362, +32413=>17363, +32414=>17364, +32430=>17365, +32436=>17366, +32443=>17367, +32444=>17368, +32470=>17369, +32484=>17370, +32492=>17371, +32505=>17372, +32522=>17373, +32528=>17374, +32542=>17375, +32567=>17376, +32569=>17377, +32571=>17378, +32572=>17379, +32573=>17380, +32574=>17381, +32575=>17382, +32576=>17383, +32577=>17384, +32579=>17385, +32582=>17386, +32583=>17387, +32584=>17388, +32585=>17389, +32586=>17390, +32587=>17391, +32589=>17392, +32591=>17393, +32594=>17394, +32595=>17395, +32598=>17396, +32601=>17397, +32603=>17398, +32604=>17399, +32605=>17400, +32606=>17401, +32608=>17402, +32611=>17403, +32612=>17404, +32613=>17405, +32614=>17406, +32615=>17407, +32619=>17408, +32620=>17409, +32621=>17410, +32623=>17411, +32627=>17412, +32629=>17413, +32630=>17414, +32632=>17415, +32634=>17416, +32635=>17417, +32636=>17418, +32637=>17419, +32639=>17420, +32640=>17421, +32642=>17422, +32643=>17423, +32644=>17424, +32647=>17425, +32649=>17426, +32651=>17427, +32653=>17428, +32655=>17429, +32656=>17430, +32657=>17431, +32658=>17432, +32659=>17433, +32661=>17434, +32662=>17435, +32663=>17436, +32664=>17437, +32665=>17438, +32667=>17439, +32668=>17440, +32672=>17441, +32674=>17442, +32675=>17443, +32678=>17444, +32680=>17445, +32682=>17446, +32683=>17447, +32684=>17448, +32685=>17449, +32686=>17450, +32689=>17451, +32691=>17452, +32692=>17453, +32693=>17454, +32694=>17455, +32695=>17456, +32698=>17457, +32699=>17458, +32702=>17459, +32704=>17460, +32706=>17461, +32707=>17462, +32708=>17463, +32710=>17464, +32711=>17465, +32712=>17466, +32713=>17467, +32715=>17468, +32717=>17469, +32719=>17470, +32720=>17471, +32721=>17472, +32723=>17473, +32726=>17474, +32727=>17475, +32729=>17476, +32730=>17477, +32731=>17478, +32732=>17479, +32733=>17480, +32734=>17481, +32738=>17482, +32739=>17483, +32740=>17484, +32743=>17485, +32744=>17486, +32746=>17487, +32747=>17488, +32748=>17489, +32749=>17490, +32751=>17491, +32754=>17492, +32756=>17493, +32757=>17494, +32758=>17495, +32759=>17496, +32760=>17497, +32762=>17498, +32765=>17499, +32766=>17500, +32767=>17501, +32770=>17502, +32775=>17503, +32776=>17504, +32777=>17505, +32778=>17506, +32782=>17507, +32783=>17508, +32785=>17509, +32787=>17510, +32794=>17511, +32795=>17512, +32797=>17513, +32798=>17514, +32799=>17515, +32801=>17516, +32803=>17517, +32804=>17518, +32811=>17519, +32813=>17520, +32815=>17521, +32816=>17522, +32818=>17523, +32820=>17524, +32825=>17525, +32826=>17526, +32828=>17527, +32830=>17528, +32832=>17529, +32833=>17530, +32836=>17531, +32837=>17532, +32839=>17533, +32840=>17534, +32841=>17535, +32846=>17536, +32847=>17537, +32848=>17538, +32849=>17539, +32851=>17540, +32853=>17541, +32855=>17542, +32857=>17543, +32859=>17544, +32860=>17545, +32861=>17546, +32863=>17547, +32864=>17548, +32865=>17549, +32866=>17550, +32867=>17551, +32868=>17552, +32869=>17553, +32870=>17554, +32871=>17555, +32872=>17556, +32875=>17557, +32876=>17558, +32877=>17559, +32878=>17560, +32884=>17561, +32888=>17562, +32890=>17563, +32891=>17564, +32892=>17565, +32897=>17566, +32898=>17567, +32904=>17568, +32906=>17569, +32909=>17570, +32910=>17571, +32911=>17572, +32912=>17573, +32913=>17574, +32914=>17575, +32916=>17576, +32917=>17577, +32919=>17578, +32921=>17579, +32926=>17580, +32931=>17581, +32934=>17582, +32935=>17583, +32936=>17584, +32940=>17585, +32944=>17586, +32947=>17587, +32949=>17588, +32950=>17589, +32952=>17590, +32953=>17591, +32955=>17592, +32965=>17593, +32967=>17594, +32968=>17595, +32969=>17596, +32970=>17597, +32971=>17598, +32975=>17599, +32976=>17600, +32977=>17601, +32978=>17602, +32979=>17603, +32980=>17604, +32981=>17605, +32984=>17606, +32991=>17607, +32992=>17608, +32994=>17609, +32995=>17610, +32998=>17611, +33006=>17612, +33013=>17613, +33015=>17614, +33017=>17615, +33019=>17616, +33022=>17617, +33023=>17618, +33024=>17619, +33025=>17620, +33027=>17621, +33028=>17622, +33031=>17623, +33032=>17624, +33035=>17625, +33036=>17626, +33045=>17627, +33047=>17628, +33049=>17629, +33052=>17630, +33053=>17631, +33055=>17632, +33056=>17633, +33057=>17634, +33058=>17635, +33059=>17636, +33060=>17637, +33061=>17638, +33062=>17639, +33063=>17640, +33064=>17641, +33065=>17642, +33066=>17643, +33067=>17644, +33069=>17645, +33070=>17646, +33072=>17647, +33075=>17648, +33076=>17649, +33077=>17650, +33079=>17651, +33082=>17652, +33083=>17653, +33084=>17654, +33085=>17655, +33087=>17656, +33088=>17657, +33089=>17658, +33090=>17659, +33091=>17660, +33092=>17661, +33093=>17662, +33095=>17663, +33097=>17664, +33101=>17665, +33103=>17666, +33106=>17667, +33111=>17668, +33112=>17669, +33115=>17670, +33116=>17671, +33117=>17672, +33118=>17673, +33119=>17674, +33122=>17675, +33123=>17676, +33124=>17677, +33128=>17678, +33130=>17679, +33132=>17680, +33135=>17681, +33138=>17682, +33139=>17683, +33141=>17684, +33142=>17685, +33143=>17686, +33153=>17687, +33155=>17688, +33156=>17689, +33157=>17690, +33158=>17691, +33159=>17692, +33161=>17693, +33163=>17694, +33164=>17695, +33165=>17696, +33166=>17697, +33168=>17698, +33170=>17699, +33171=>17700, +33172=>17701, +33173=>17702, +33174=>17703, +33175=>17704, +33177=>17705, +33182=>17706, +33183=>17707, +33185=>17708, +33186=>17709, +33188=>17710, +33189=>17711, +33191=>17712, +33195=>17713, +33196=>17714, +33197=>17715, +33198=>17716, +33199=>17717, +33200=>17718, +33201=>17719, +33202=>17720, +33204=>17721, +33205=>17722, +33206=>17723, +33207=>17724, +33208=>17725, +33209=>17726, +33212=>17727, +33220=>17728, +33221=>17729, +33223=>17730, +33224=>17731, +33227=>17732, +33230=>17733, +33232=>17734, +33233=>17735, +33234=>17736, +33235=>17737, +33236=>17738, +33237=>17739, +33238=>17740, +33239=>17741, +33241=>17742, +33243=>17743, +33244=>17744, +33245=>17745, +33246=>17746, +33249=>17747, +33250=>17748, +33252=>17749, +33253=>17750, +33254=>17751, +33257=>17752, +33259=>17753, +33262=>17754, +33263=>17755, +33264=>17756, +33265=>17757, +33266=>17758, +33269=>17759, +33270=>17760, +33271=>17761, +33272=>17762, +33273=>17763, +33277=>17764, +33279=>17765, +33283=>17766, +33291=>17767, +33294=>17768, +33295=>17769, +33297=>17770, +33299=>17771, +33301=>17772, +33302=>17773, +33303=>17774, +33304=>17775, +33305=>17776, +33306=>17777, +33309=>17778, +33312=>17779, +33316=>17780, +33317=>17781, +33318=>17782, +33319=>17783, +33321=>17784, +33326=>17785, +33330=>17786, +33338=>17787, +33340=>17788, +33341=>17789, +33343=>17790, +33344=>17791, +33345=>17792, +33346=>17793, +33347=>17794, +33349=>17795, +33350=>17796, +33352=>17797, +33354=>17798, +33356=>17799, +33357=>17800, +33358=>17801, +33360=>17802, +33361=>17803, +33362=>17804, +33363=>17805, +33364=>17806, +33365=>17807, +33366=>17808, +33367=>17809, +33371=>17810, +33372=>17811, +33373=>17812, +33374=>17813, +33376=>17814, +33377=>17815, +33378=>17816, +33379=>17817, +33381=>17818, +33383=>17819, +33385=>17820, +33386=>17821, +33388=>17822, +33389=>17823, +33397=>17824, +33398=>17825, +12171=>17826, +33400=>17826, +33403=>17827, +33404=>17828, +33408=>17829, +33409=>17830, +33411=>17831, +33413=>17832, +33414=>17833, +33415=>17834, +33417=>17835, +33420=>17836, +33424=>17837, +33427=>17838, +33428=>17839, +33429=>17840, +33430=>17841, +33434=>17842, +33435=>17843, +33438=>17844, +33440=>17845, +33442=>17846, +33443=>17847, +33447=>17848, +33458=>17849, +33461=>17850, +33462=>17851, +33466=>17852, +33468=>17853, +33471=>17854, +33472=>17855, +33474=>17856, +33475=>17857, +33477=>17858, +33478=>17859, +33481=>17860, +33488=>17861, +33494=>17862, +33497=>17863, +33498=>17864, +33501=>17865, +33506=>17866, +33512=>17867, +33513=>17868, +33514=>17869, +33516=>17870, +33517=>17871, +33518=>17872, +33520=>17873, +33522=>17874, +33523=>17875, +33525=>17876, +33526=>17877, +33528=>17878, +33530=>17879, +33532=>17880, +33533=>17881, +33534=>17882, +33535=>17883, +33536=>17884, +33546=>17885, +33547=>17886, +33549=>17887, +33552=>17888, +33554=>17889, +33555=>17890, +33558=>17891, +33560=>17892, +33561=>17893, +33565=>17894, +33566=>17895, +33567=>17896, +33568=>17897, +33569=>17898, +33570=>17899, +33571=>17900, +33572=>17901, +33573=>17902, +33574=>17903, +33577=>17904, +33578=>17905, +33582=>17906, +33584=>17907, +33586=>17908, +33591=>17909, +33595=>17910, +33597=>17911, +33598=>17912, +33599=>17913, +33601=>17914, +33602=>17915, +33604=>17916, +33605=>17917, +33608=>17918, +33610=>17919, +33611=>17920, +33612=>17921, +33613=>17922, +33614=>17923, +33619=>17924, +33621=>17925, +33622=>17926, +33623=>17927, +33624=>17928, +33625=>17929, +33629=>17930, +33634=>17931, +33648=>17932, +33649=>17933, +33650=>17934, +33651=>17935, +33652=>17936, +33653=>17937, +33654=>17938, +33657=>17939, +33658=>17940, +33662=>17941, +33663=>17942, +33664=>17943, +33665=>17944, +33666=>17945, +33667=>17946, +33668=>17947, +33671=>17948, +33672=>17949, +33675=>17950, +33676=>17951, +33677=>17952, +33679=>17953, +33680=>17954, +33681=>17955, +33684=>17956, +33685=>17957, +33687=>17958, +33689=>17959, +33690=>17960, +33693=>17961, +33695=>17962, +33697=>17963, +33699=>17964, +33700=>17965, +33701=>17966, +33702=>17967, +33708=>17968, +33709=>17969, +33710=>17970, +33711=>17971, +33717=>17972, +33723=>17973, +33726=>17974, +33727=>17975, +33730=>17976, +33731=>17977, +33732=>17978, +33734=>17979, +33736=>17980, +33737=>17981, +33739=>17982, +33741=>17983, +33742=>17984, +33744=>17985, +33745=>17986, +33746=>17987, +33747=>17988, +33749=>17989, +33751=>17990, +33753=>17991, +33754=>17992, +33755=>17993, +33758=>17994, +33762=>17995, +33763=>17996, +33764=>17997, +33766=>17998, +33767=>17999, +33768=>18000, +33771=>18001, +33772=>18002, +33773=>18003, +33774=>18004, +33779=>18005, +33780=>18006, +33781=>18007, +33782=>18008, +33783=>18009, +33786=>18010, +33787=>18011, +33788=>18012, +33790=>18013, +33791=>18014, +33792=>18015, +33794=>18016, +33797=>18017, +33800=>18018, +33801=>18019, +33808=>18020, +33810=>18021, +33811=>18022, +33812=>18023, +33813=>18024, +33814=>18025, +33815=>18026, +33817=>18027, +33818=>18028, +33819=>18029, +33822=>18030, +33823=>18031, +33824=>18032, +33825=>18033, +33826=>18034, +33827=>18035, +33833=>18036, +33834=>18037, +33835=>18038, +33837=>18039, +33838=>18040, +33839=>18041, +33840=>18042, +33842=>18043, +33843=>18044, +33844=>18045, +33846=>18046, +33847=>18047, +33849=>18048, +33850=>18049, +33851=>18050, +33854=>18051, +33855=>18052, +33856=>18053, +33857=>18054, +33858=>18055, +33859=>18056, +33860=>18057, +33861=>18058, +33863=>18059, +33864=>18060, +33866=>18061, +33867=>18062, +33868=>18063, +33869=>18064, +33870=>18065, +33871=>18066, +33872=>18067, +33875=>18068, +33876=>18069, +33877=>18070, +33878=>18071, +33880=>18072, +33885=>18073, +33886=>18074, +33887=>18075, +33888=>18076, +33890=>18077, +33893=>18078, +33895=>18079, +33896=>18080, +33898=>18081, +33902=>18082, +33904=>18083, +33906=>18084, +33908=>18085, +33913=>18086, +33915=>18087, +33916=>18088, +33917=>18089, +33918=>18090, +33919=>18091, +33920=>18092, +33921=>18093, +33923=>18094, +33924=>18095, +33925=>18096, +33926=>18097, +33930=>18098, +33933=>18099, +33935=>18100, +33936=>18101, +33937=>18102, +33938=>18103, +33941=>18104, +33942=>18105, +33944=>18106, +33946=>18107, +33947=>18108, +33949=>18109, +33950=>18110, +33951=>18111, +33952=>18112, +33954=>18113, +33955=>18114, +33956=>18115, +33957=>18116, +33958=>18117, +33959=>18118, +33960=>18119, +33961=>18120, +33962=>18121, +33963=>18122, +33964=>18123, +33965=>18124, +33966=>18125, +33968=>18126, +33969=>18127, +33971=>18128, +33973=>18129, +33974=>18130, +33975=>18131, +33979=>18132, +33982=>18133, +33986=>18134, +33987=>18135, +33989=>18136, +33990=>18137, +33991=>18138, +33992=>18139, +33996=>18140, +33998=>18141, +33999=>18142, +34002=>18143, +34004=>18144, +34005=>18145, +34007=>18146, +34008=>18147, +34009=>18148, +34010=>18149, +34011=>18150, +34012=>18151, +34014=>18152, +34017=>18153, +34018=>18154, +34020=>18155, +34023=>18156, +34024=>18157, +34025=>18158, +34026=>18159, +34027=>18160, +34029=>18161, +34033=>18162, +34034=>18163, +34035=>18164, +34036=>18165, +34037=>18166, +34038=>18167, +34039=>18168, +34040=>18169, +34041=>18170, +34042=>18171, +34043=>18172, +34046=>18173, +34048=>18174, +34049=>18175, +34050=>18176, +34051=>18177, +34052=>18178, +34053=>18179, +34054=>18180, +34055=>18181, +34056=>18182, +34057=>18183, +34058=>18184, +34059=>18185, +34061=>18186, +34062=>18187, +34063=>18188, +34064=>18189, +34066=>18190, +34069=>18191, +34070=>18192, +34072=>18193, +34073=>18194, +34075=>18195, +34076=>18196, +34077=>18197, +34080=>18198, +34082=>18199, +34084=>18200, +34085=>18201, +34087=>18202, +34088=>18203, +34089=>18204, +34090=>18205, +34094=>18206, +34095=>18207, +34096=>18208, +34097=>18209, +34098=>18210, +34099=>18211, +34100=>18212, +34101=>18213, +34102=>18214, +34110=>18215, +34111=>18216, +34112=>18217, +34114=>18218, +34116=>18219, +34117=>18220, +34119=>18221, +34123=>18222, +34124=>18223, +34125=>18224, +34127=>18225, +34128=>18226, +34129=>18227, +34132=>18228, +34135=>18229, +34138=>18230, +34139=>18231, +34140=>18232, +34141=>18233, +34143=>18234, +34144=>18235, +34145=>18236, +34147=>18237, +34149=>18238, +34150=>18239, +34151=>18240, +34155=>18241, +34156=>18242, +34158=>18243, +34159=>18244, +34160=>18245, +34161=>18246, +34163=>18247, +34165=>18248, +34166=>18249, +34168=>18250, +34172=>18251, +34173=>18252, +34175=>18253, +34176=>18254, +34177=>18255, +34178=>18256, +34179=>18257, +34182=>18258, +34185=>18259, +34187=>18260, +34189=>18261, +34190=>18262, +34192=>18263, +34194=>18264, +34195=>18265, +34197=>18266, +34198=>18267, +34199=>18268, +34200=>18269, +34201=>18270, +34202=>18271, +34205=>18272, +34206=>18273, +34208=>18274, +34209=>18275, +34210=>18276, +34211=>18277, +34213=>18278, +34215=>18279, +34219=>18280, +34220=>18281, +34221=>18282, +34225=>18283, +34226=>18284, +34227=>18285, +34228=>18286, +34229=>18287, +34230=>18288, +34232=>18289, +34235=>18290, +34236=>18291, +34237=>18292, +34238=>18293, +34239=>18294, +34240=>18295, +34242=>18296, +34243=>18297, +34244=>18298, +34245=>18299, +34246=>18300, +34247=>18301, +34248=>18302, +34250=>18303, +34251=>18304, +34252=>18305, +34257=>18306, +34258=>18307, +34260=>18308, +34262=>18309, +34263=>18310, +34264=>18311, +34265=>18312, +34266=>18313, +34267=>18314, +34270=>18315, +34271=>18316, +34272=>18317, +34273=>18318, +34274=>18319, +34275=>18320, +34278=>18321, +34279=>18322, +34280=>18323, +34283=>18324, +34284=>18325, +34285=>18326, +34286=>18327, +34287=>18328, +34288=>18329, +34289=>18330, +34290=>18331, +34291=>18332, +34293=>18333, +34295=>18334, +34296=>18335, +34300=>18336, +34301=>18337, +34302=>18338, +34304=>18339, +34305=>18340, +34306=>18341, +34307=>18342, +34312=>18343, +34313=>18344, +34314=>18345, +34316=>18346, +34317=>18347, +34318=>18348, +34319=>18349, +34320=>18350, +34322=>18351, +34323=>18352, +34324=>18353, +34325=>18354, +34327=>18355, +34328=>18356, +34329=>18357, +34331=>18358, +34332=>18359, +34333=>18360, +34335=>18361, +34336=>18362, +34337=>18363, +34339=>18364, +34340=>18365, +34341=>18366, +34342=>18367, +34344=>18368, +34346=>18369, +34347=>18370, +34348=>18371, +34350=>18372, +34351=>18373, +34352=>18374, +34353=>18375, +34354=>18376, +34355=>18377, +34356=>18378, +34357=>18379, +34358=>18380, +34359=>18381, +34361=>18382, +34363=>18383, +34365=>18384, +34366=>18385, +34368=>18386, +34369=>18387, +34370=>18388, +34371=>18389, +34372=>18390, +34373=>18391, +34374=>18392, +34375=>18393, +34376=>18394, +34377=>18395, +34378=>18396, +34379=>18397, +34380=>18398, +34386=>18399, +34387=>18400, +34390=>18401, +34391=>18402, +34392=>18403, +34393=>18404, +34395=>18405, +34397=>18406, +34400=>18407, +34401=>18408, +34403=>18409, +34404=>18410, +34405=>18411, +34406=>18412, +34408=>18413, +34409=>18414, +34410=>18415, +34413=>18416, +34415=>18417, +34416=>18418, +34418=>18419, +34419=>18420, +34420=>18421, +34421=>18422, +34422=>18423, +34423=>18424, +34424=>18425, +34435=>18426, +34436=>18427, +34437=>18428, +34438=>18429, +34439=>18430, +34440=>18431, +34441=>18432, +34446=>18433, +34447=>18434, +34448=>18435, +34449=>18436, +34450=>18437, +34452=>18438, +34454=>18439, +34455=>18440, +34456=>18441, +34457=>18442, +34458=>18443, +34459=>18444, +34462=>18445, +34463=>18446, +34464=>18447, +34465=>18448, +34466=>18449, +34469=>18450, +34470=>18451, +34475=>18452, +34477=>18453, +34478=>18454, +34482=>18455, +34483=>18456, +34487=>18457, +34488=>18458, +34489=>18459, +34491=>18460, +34492=>18461, +34493=>18462, +34494=>18463, +34495=>18464, +34497=>18465, +34498=>18466, +34499=>18467, +34501=>18468, +34504=>18469, +34508=>18470, +34509=>18471, +34514=>18472, +34515=>18473, +34517=>18474, +34518=>18475, +34519=>18476, +34522=>18477, +34524=>18478, +34525=>18479, +34528=>18480, +34529=>18481, +34530=>18482, +34531=>18483, +34533=>18484, +34534=>18485, +34535=>18486, +34536=>18487, +34538=>18488, +34539=>18489, +34540=>18490, +34543=>18491, +34549=>18492, +34550=>18493, +34551=>18494, +34555=>18495, +34556=>18496, +34557=>18497, +34559=>18498, +34561=>18499, +34564=>18500, +34565=>18501, +34571=>18502, +34572=>18503, +34574=>18504, +34575=>18505, +34576=>18506, +34577=>18507, +34580=>18508, +34582=>18509, +34585=>18510, +34587=>18511, +34589=>18512, +34591=>18513, +34592=>18514, +34596=>18515, +34598=>18516, +34599=>18517, +34600=>18518, +34602=>18519, +34603=>18520, +34604=>18521, +34605=>18522, +34607=>18523, +34608=>18524, +34610=>18525, +34611=>18526, +34613=>18527, +34614=>18528, +34616=>18529, +34617=>18530, +34618=>18531, +34620=>18532, +34621=>18533, +34624=>18534, +34625=>18535, +34626=>18536, +34627=>18537, +34628=>18538, +34629=>18539, +34630=>18540, +34634=>18541, +34635=>18542, +34637=>18543, +34639=>18544, +34640=>18545, +34641=>18546, +34642=>18547, +34644=>18548, +34646=>18549, +34648=>18550, +34650=>18551, +34651=>18552, +34652=>18553, +34653=>18554, +34654=>18555, +34655=>18556, +34657=>18557, +34658=>18558, +34663=>18559, +34664=>18560, +34665=>18561, +34666=>18562, +34667=>18563, +34668=>18564, +34669=>18565, +34671=>18566, +34673=>18567, +34674=>18568, +34675=>18569, +34677=>18570, +34679=>18571, +34681=>18572, +34682=>18573, +34687=>18574, +34688=>18575, +34689=>18576, +34694=>18577, +34695=>18578, +34697=>18579, +34698=>18580, +34700=>18581, +34702=>18582, +34703=>18583, +34704=>18584, +34705=>18585, +34706=>18586, +34708=>18587, +34709=>18588, +34710=>18589, +34712=>18590, +34713=>18591, +34714=>18592, +34715=>18593, +34716=>18594, +34717=>18595, +34720=>18596, +34721=>18597, +34723=>18598, +34724=>18599, +34725=>18600, +34726=>18601, +34727=>18602, +34729=>18603, +34730=>18604, +34734=>18605, +34736=>18606, +34737=>18607, +34738=>18608, +34740=>18609, +34742=>18610, +34743=>18611, +34744=>18612, +34745=>18613, +34748=>18614, +34750=>18615, +34751=>18616, +34753=>18617, +34754=>18618, +34755=>18619, +34757=>18620, +34759=>18621, +34761=>18622, +34764=>18623, +34765=>18624, +34767=>18625, +34768=>18626, +34772=>18627, +34773=>18628, +34774=>18629, +34775=>18630, +34776=>18631, +34777=>18632, +34778=>18633, +34780=>18634, +34781=>18635, +34782=>18636, +34783=>18637, +34785=>18638, +34786=>18639, +34788=>18640, +34790=>18641, +34791=>18642, +34792=>18643, +34793=>18644, +34795=>18645, +34797=>18646, +34800=>18647, +34801=>18648, +34803=>18649, +34804=>18650, +34805=>18651, +34807=>18652, +34808=>18653, +34810=>18654, +34812=>18655, +34813=>18656, +34815=>18657, +34816=>18658, +34817=>18659, +34818=>18660, +34820=>18661, +34823=>18662, +34824=>18663, +34825=>18664, +34827=>18665, +34828=>18666, +34829=>18667, +34830=>18668, +34831=>18669, +34834=>18670, +34836=>18671, +34839=>18672, +34840=>18673, +34841=>18674, +34842=>18675, +34844=>18676, +34845=>18677, +34846=>18678, +34848=>18679, +34852=>18680, +34853=>18681, +34854=>18682, +34855=>18683, +34856=>18684, +34857=>18685, +34858=>18686, +34859=>18687, +34860=>18688, +34861=>18689, +34862=>18690, +34863=>18691, +34864=>18692, +34867=>18693, +34868=>18694, +34869=>18695, +34871=>18696, +34872=>18697, +34874=>18698, +34877=>18699, +34878=>18700, +34879=>18701, +34881=>18702, +34882=>18703, +34883=>18704, +34887=>18705, +34888=>18706, +34889=>18707, +34891=>18708, +34894=>18709, +34895=>18710, +34896=>18711, +34897=>18712, +34898=>18713, +34901=>18714, +34902=>18715, +34904=>18716, +34906=>18717, +34908=>18718, +34910=>18719, +34911=>18720, +34912=>18721, +34918=>18722, +34919=>18723, +34922=>18724, +34925=>18725, +34927=>18726, +34929=>18727, +34931=>18728, +34932=>18729, +34933=>18730, +34934=>18731, +34936=>18732, +34938=>18733, +34939=>18734, +34940=>18735, +34944=>18736, +34947=>18737, +34950=>18738, +34951=>18739, +34953=>18740, +34954=>18741, +34956=>18742, +34958=>18743, +34959=>18744, +34960=>18745, +34961=>18746, +34963=>18747, +34964=>18748, +34965=>18749, +34967=>18750, +34968=>18751, +34969=>18752, +34970=>18753, +34971=>18754, +34973=>18755, +34974=>18756, +34975=>18757, +34976=>18758, +34977=>18759, +34979=>18760, +34981=>18761, +34982=>18762, +34983=>18763, +34984=>18764, +34985=>18765, +34986=>18766, +34988=>18767, +34990=>18768, +34991=>18769, +34992=>18770, +34994=>18771, +34995=>18772, +34996=>18773, +34997=>18774, +34998=>18775, +35000=>18776, +35001=>18777, +35002=>18778, +35003=>18779, +35005=>18780, +35006=>18781, +35007=>18782, +35008=>18783, +35011=>18784, +35012=>18785, +35015=>18786, +35016=>18787, +35019=>18788, +35020=>18789, +35021=>18790, +35024=>18791, +35025=>18792, +35027=>18793, +35030=>18794, +35031=>18795, +35034=>18796, +35035=>18797, +35038=>18798, +35040=>18799, +35041=>18800, +35046=>18801, +35047=>18802, +35049=>18803, +35050=>18804, +35051=>18805, +35052=>18806, +35053=>18807, +35054=>18808, +35055=>18809, +35058=>18810, +35061=>18811, +35062=>18812, +35063=>18813, +35066=>18814, +35067=>18815, +35071=>18816, +35072=>18817, +35073=>18818, +35075=>18819, +35076=>18820, +35077=>18821, +35078=>18822, +35080=>18823, +35081=>18824, +35083=>18825, +35084=>18826, +35085=>18827, +35086=>18828, +35087=>18829, +35089=>18830, +35092=>18831, +35093=>18832, +35094=>18833, +35095=>18834, +35096=>18835, +35100=>18836, +35101=>18837, +35102=>18838, +35103=>18839, +35104=>18840, +35106=>18841, +35107=>18842, +35108=>18843, +35110=>18844, +35111=>18845, +35112=>18846, +35113=>18847, +35116=>18848, +35117=>18849, +35118=>18850, +35119=>18851, +35121=>18852, +35125=>18853, +35127=>18854, +35129=>18855, +35130=>18856, +35132=>18857, +35133=>18858, +35134=>18859, +35135=>18860, +35136=>18861, +35138=>18862, +35139=>18863, +35141=>18864, +35142=>18865, +35144=>18866, +35145=>18867, +35146=>18868, +35147=>18869, +35148=>18870, +35149=>18871, +35150=>18872, +35151=>18873, +35152=>18874, +35153=>18875, +35154=>18876, +35155=>18877, +35156=>18878, +35157=>18879, +35159=>18880, +35160=>18881, +35161=>18882, +35162=>18883, +35163=>18884, +35164=>18885, +35169=>18886, +35170=>18887, +35171=>18888, +35173=>18889, +35175=>18890, +35176=>18891, +35177=>18892, +35179=>18893, +35181=>18894, +35182=>18895, +35184=>18896, +35185=>18897, +35187=>18898, +35188=>18899, +35189=>18900, +35190=>18901, +35191=>18902, +35192=>18903, +35193=>18904, +35194=>18905, +35196=>18906, +35197=>18907, +12177=>18908, +35198=>18908, +35200=>18909, +35202=>18910, +35204=>18911, +35205=>18912, +35207=>18913, +35208=>18914, +35209=>18915, +35210=>18916, +35212=>18917, +35213=>18918, +35214=>18919, +35216=>18920, +35217=>18921, +35218=>18922, +35220=>18923, +35221=>18924, +35223=>18925, +35225=>18926, +35226=>18927, +35227=>18928, +35228=>18929, +35229=>18930, +35230=>18931, +35231=>18932, +35232=>18933, +35234=>18934, +35235=>18935, +35236=>18936, +35237=>18937, +35239=>18938, +35240=>18939, +35241=>18940, +35243=>18941, +35245=>18942, +35246=>18943, +35248=>18944, +35249=>18945, +35251=>18946, +35252=>18947, +35253=>18948, +35254=>18949, +35256=>18950, +35257=>18951, +35259=>18952, +35260=>18953, +35262=>18954, +35267=>18955, +35277=>18956, +35283=>18957, +35284=>18958, +35285=>18959, +35287=>18960, +35288=>18961, +35289=>18962, +35291=>18963, +35293=>18964, +35295=>18965, +35296=>18966, +35297=>18967, +35298=>18968, +35300=>18969, +35303=>18970, +35304=>18971, +35305=>18972, +35306=>18973, +35308=>18974, +35309=>18975, +35310=>18976, +35312=>18977, +35313=>18978, +35314=>18979, +35317=>18980, +35319=>18981, +35321=>18982, +35322=>18983, +35323=>18984, +35324=>18985, +35325=>18986, +35326=>18987, +35327=>18988, +35332=>18989, +35333=>18990, +35334=>18991, +35337=>18992, +35339=>18993, +35341=>18994, +35343=>18995, +35345=>18996, +35346=>18997, +35348=>18998, +35351=>18999, +35353=>19000, +35354=>19001, +35356=>19002, +35358=>19003, +35360=>19004, +35361=>19005, +35362=>19006, +35364=>19007, +35366=>19008, +35367=>19009, +35368=>19010, +35369=>19011, +35371=>19012, +35372=>19013, +35374=>19014, +35375=>19015, +35376=>19016, +35378=>19017, +35379=>19018, +35381=>19019, +35383=>19020, +35384=>19021, +35385=>19022, +35387=>19023, +35388=>19024, +35389=>19025, +35391=>19026, +35392=>19027, +35394=>19028, +35395=>19029, +35396=>19030, +35397=>19031, +35399=>19032, +35401=>19033, +35402=>19034, +35403=>19035, +35404=>19036, +35405=>19037, +35407=>19038, +35409=>19039, +35411=>19040, +35414=>19041, +35415=>19042, +35417=>19043, +35418=>19044, +35420=>19045, +35421=>19046, +35423=>19047, +35424=>19048, +35428=>19049, +35429=>19050, +35431=>19051, +35432=>19052, +35434=>19053, +35439=>19054, +35444=>19055, +35446=>19056, +35447=>19057, +35448=>19058, +35450=>19059, +35451=>19060, +35453=>19061, +35454=>19062, +35456=>19063, +35457=>19064, +35458=>19065, +35459=>19066, +35464=>19067, +35467=>19068, +35468=>19069, +35470=>19070, +35471=>19071, +35472=>19072, +35476=>19073, +35478=>19074, +35479=>19075, +35481=>19076, +35483=>19077, +35484=>19078, +35485=>19079, +35487=>19080, +35490=>19081, +35495=>19082, +35497=>19083, +35498=>19084, +35499=>19085, +35501=>19086, +35502=>19087, +35503=>19088, +35505=>19089, +35507=>19090, +35508=>19091, +35509=>19092, +35511=>19093, +35512=>19094, +35514=>19095, +35515=>19096, +35517=>19097, +35518=>19098, +35520=>19099, +35521=>19100, +35523=>19101, +35525=>19102, +35526=>19103, +35528=>19104, +35530=>19105, +35532=>19106, +35534=>19107, +35536=>19108, +35539=>19109, +35540=>19110, +35541=>19111, +35544=>19112, +35545=>19113, +35546=>19114, +35549=>19115, +35551=>19116, +35552=>19117, +35553=>19118, +35555=>19119, +35557=>19120, +35560=>19121, +35561=>19122, +35562=>19123, +35564=>19124, +35567=>19125, +35568=>19126, +35570=>19127, +35572=>19128, +35573=>19129, +35577=>19130, +35579=>19131, +35581=>19132, +35583=>19133, +35587=>19134, +35590=>19135, +35592=>19136, +35593=>19137, +35595=>19138, +35596=>19139, +35597=>19140, +35599=>19141, +35601=>19142, +35602=>19143, +35603=>19144, +35605=>19145, +35608=>19146, +35612=>19147, +35614=>19148, +35615=>19149, +35616=>19150, +35618=>19151, +35619=>19152, +35620=>19153, +35621=>19154, +35623=>19155, +35625=>19156, +35626=>19157, +35630=>19158, +35631=>19159, +35632=>19160, +35633=>19161, +35634=>19162, +35636=>19163, +35637=>19164, +35638=>19165, +35639=>19166, +35640=>19167, +35642=>19168, +35643=>19169, +35644=>19170, +35645=>19171, +35647=>19172, +35648=>19173, +35649=>19174, +35650=>19175, +35651=>19176, +35652=>19177, +35653=>19178, +35654=>19179, +35655=>19180, +35656=>19181, +35658=>19182, +35659=>19183, +35660=>19184, +35661=>19185, +35664=>19186, +35665=>19187, +35666=>19188, +35667=>19189, +35668=>19190, +35669=>19191, +35671=>19192, +35675=>19193, +35677=>19194, +35678=>19195, +35679=>19196, +35680=>19197, +35681=>19198, +35682=>19199, +35683=>19200, +35684=>19201, +35685=>19202, +35687=>19203, +35688=>19204, +35689=>19205, +35690=>19206, +35693=>19207, +35694=>19208, +35697=>19209, +35698=>19210, +35699=>19211, +35701=>19212, +35702=>19213, +35704=>19214, +35705=>19215, +35706=>19216, +35707=>19217, +35708=>19218, +35710=>19219, +35711=>19220, +35713=>19221, +35714=>19222, +35715=>19223, +35716=>19224, +35717=>19225, +35718=>19226, +35719=>19227, +35720=>19228, +35721=>19229, +35723=>19230, +35724=>19231, +35725=>19232, +35727=>19233, +35728=>19234, +35729=>19235, +35732=>19236, +35735=>19237, +35736=>19238, +35737=>19239, +35738=>19240, +35739=>19241, +35741=>19242, +35743=>19243, +35756=>19244, +35761=>19245, +35771=>19246, +35783=>19247, +35792=>19248, +35818=>19249, +35849=>19250, +35870=>19251, +35896=>19252, +35897=>19253, +35898=>19254, +35899=>19255, +35900=>19256, +35901=>19257, +35902=>19258, +35903=>19259, +35904=>19260, +35906=>19261, +35907=>19262, +35908=>19263, +35909=>19264, +35914=>19265, +35915=>19266, +35917=>19267, +35918=>19268, +35919=>19269, +35921=>19270, +35922=>19271, +35923=>19272, +35924=>19273, +35926=>19274, +35927=>19275, +35928=>19276, +35929=>19277, +35931=>19278, +35932=>19279, +35933=>19280, +35934=>19281, +35935=>19282, +35936=>19283, +35939=>19284, +35940=>19285, +35941=>19286, +35942=>19287, +35943=>19288, +35944=>19289, +35945=>19290, +35948=>19291, +35949=>19292, +35950=>19293, +35951=>19294, +35952=>19295, +35953=>19296, +35954=>19297, +35956=>19298, +35957=>19299, +35958=>19300, +35959=>19301, +35963=>19302, +35964=>19303, +35965=>19304, +35966=>19305, +35967=>19306, +35968=>19307, +35969=>19308, +35971=>19309, +35972=>19310, +35974=>19311, +35975=>19312, +35976=>19313, +35979=>19314, +35981=>19315, +35982=>19316, +35983=>19317, +35984=>19318, +35985=>19319, +35986=>19320, +35987=>19321, +35989=>19322, +35990=>19323, +35991=>19324, +35993=>19325, +35994=>19326, +35995=>19327, +35996=>19328, +35999=>19329, +36003=>19330, +36004=>19331, +36005=>19332, +36006=>19333, +36013=>19334, +36014=>19335, +36017=>19336, +36021=>19337, +36025=>19338, +36030=>19339, +36038=>19340, +36041=>19341, +36043=>19342, +36044=>19343, +36045=>19344, +36046=>19345, +36047=>19346, +36048=>19347, +36052=>19348, +36054=>19349, +36055=>19350, +36056=>19351, +36057=>19352, +36059=>19353, +36061=>19354, +36063=>19355, +36069=>19356, +36072=>19357, +36073=>19358, +36078=>19359, +36079=>19360, +36080=>19361, +36081=>19362, +36082=>19363, +36083=>19364, +36085=>19365, +36086=>19366, +36087=>19367, +36088=>19368, +36089=>19369, +36095=>19370, +36096=>19371, +36097=>19372, +36098=>19373, +36099=>19374, +36102=>19375, +36103=>19376, +36105=>19377, +36108=>19378, +36110=>19379, +36113=>19380, +36114=>19381, +36115=>19382, +36116=>19383, +36117=>19384, +36119=>19385, +36120=>19386, +36121=>19387, +36122=>19388, +36128=>19389, +36177=>19390, +36178=>19391, +36183=>19392, +36191=>19393, +36197=>19394, +36200=>19395, +36201=>19396, +36202=>19397, +36204=>19398, +36206=>19399, +36207=>19400, +36209=>19401, +36210=>19402, +36216=>19403, +36217=>19404, +36218=>19405, +36219=>19406, +36220=>19407, +36221=>19408, +36222=>19409, +36223=>19410, +36224=>19411, +36226=>19412, +36227=>19413, +36230=>19414, +36231=>19415, +36232=>19416, +36233=>19417, +36236=>19418, +36237=>19419, +36238=>19420, +36239=>19421, +36240=>19422, +36242=>19423, +36243=>19424, +36246=>19425, +36247=>19426, +36248=>19427, +36250=>19428, +36251=>19429, +36252=>19430, +36253=>19431, +36254=>19432, +36256=>19433, +36257=>19434, +36258=>19435, +36260=>19436, +36261=>19437, +36262=>19438, +36263=>19439, +36265=>19440, +36266=>19441, +36267=>19442, +36268=>19443, +36269=>19444, +36270=>19445, +36271=>19446, +36272=>19447, +36278=>19448, +36279=>19449, +36281=>19450, +36283=>19451, +36285=>19452, +36288=>19453, +36289=>19454, +36290=>19455, +36293=>19456, +36295=>19457, +36296=>19458, +36297=>19459, +36298=>19460, +36301=>19461, +36304=>19462, +36306=>19463, +36307=>19464, +36308=>19465, +36309=>19466, +36312=>19467, +36313=>19468, +36316=>19469, +36320=>19470, +36321=>19471, +36322=>19472, +36325=>19473, +36326=>19474, +36327=>19475, +36329=>19476, +36333=>19477, +36334=>19478, +36336=>19479, +36337=>19480, +36338=>19481, +36340=>19482, +36342=>19483, +36348=>19484, +36350=>19485, +36351=>19486, +36352=>19487, +36353=>19488, +36354=>19489, +36355=>19490, +36356=>19491, +36358=>19492, +36359=>19493, +36360=>19494, +36363=>19495, +36365=>19496, +36366=>19497, +36369=>19498, +36370=>19499, +36371=>19500, +36373=>19501, +36374=>19502, +36375=>19503, +36376=>19504, +36377=>19505, +36378=>19506, +36379=>19507, +36380=>19508, +36384=>19509, +36385=>19510, +36388=>19511, +36389=>19512, +36390=>19513, +36391=>19514, +36392=>19515, +36395=>19516, +36397=>19517, +36400=>19518, +36402=>19519, +36403=>19520, +36406=>19521, +36407=>19522, +36408=>19523, +36411=>19524, +36412=>19525, +36414=>19526, +36415=>19527, +36419=>19528, +36421=>19529, +36422=>19530, +36429=>19531, +36430=>19532, +36431=>19533, +36432=>19534, +36435=>19535, +36436=>19536, +36438=>19537, +36439=>19538, +36440=>19539, +36442=>19540, +36443=>19541, +36444=>19542, +36445=>19543, +36446=>19544, +36447=>19545, +36448=>19546, +36449=>19547, +36450=>19548, +36452=>19549, +36453=>19550, +36455=>19551, +36456=>19552, +36458=>19553, +36459=>19554, +36462=>19555, +36465=>19556, +36467=>19557, +36469=>19558, +36471=>19559, +36472=>19560, +36473=>19561, +36475=>19562, +36477=>19563, +36478=>19564, +36480=>19565, +36482=>19566, +36483=>19567, +36484=>19568, +36486=>19569, +36488=>19570, +36492=>19571, +36494=>19572, +36501=>19573, +36502=>19574, +36503=>19575, +36504=>19576, +36505=>19577, +36507=>19578, +36509=>19579, +36511=>19580, +36512=>19581, +36514=>19582, +36515=>19583, +36516=>19584, +36519=>19585, +36520=>19586, +36521=>19587, +36525=>19588, +36526=>19589, +36528=>19590, +36529=>19591, +36531=>19592, +36532=>19593, +36533=>19594, +36534=>19595, +36535=>19596, +36536=>19597, +36537=>19598, +36539=>19599, +36540=>19600, +36541=>19601, +36542=>19602, +36543=>19603, +36545=>19604, +36546=>19605, +36547=>19606, +36548=>19607, +36549=>19608, +36550=>19609, +36551=>19610, +36552=>19611, +36553=>19612, +36559=>19613, +36560=>19614, +36561=>19615, +36563=>19616, +36565=>19617, +36566=>19618, +36567=>19619, +36568=>19620, +36569=>19621, +36570=>19622, +36572=>19623, +36573=>19624, +36574=>19625, +36576=>19626, +36577=>19627, +36578=>19628, +36579=>19629, +36581=>19630, +36582=>19631, +36583=>19632, +36584=>19633, +36585=>19634, +36586=>19635, +36588=>19636, +36589=>19637, +36590=>19638, +36591=>19639, +36592=>19640, +36593=>19641, +36595=>19642, +36596=>19643, +36597=>19644, +36598=>19645, +36599=>19646, +36605=>19647, +36607=>19648, +36608=>19649, +36609=>19650, +36610=>19651, +36612=>19652, +36614=>19653, +36616=>19654, +36619=>19655, +36620=>19656, +36621=>19657, +36622=>19658, +36623=>19659, +36624=>19660, +36625=>19661, +36627=>19662, +36630=>19663, +36631=>19664, +36632=>19665, +36633=>19666, +36634=>19667, +36640=>19668, +36641=>19669, +36642=>19670, +36643=>19671, +36644=>19672, +36647=>19673, +36648=>19674, +36651=>19675, +36652=>19676, +36653=>19677, +36654=>19678, +36656=>19679, +36657=>19680, +36658=>19681, +36660=>19682, +36661=>19683, +36662=>19684, +36663=>19685, +36665=>19686, +36666=>19687, +36668=>19688, +36669=>19689, +36672=>19690, +36673=>19691, +36675=>19692, +36679=>19693, +36680=>19694, +36682=>19695, +36683=>19696, +36684=>19697, +36687=>19698, +36688=>19699, +36689=>19700, +36690=>19701, +36691=>19702, +36693=>19703, +36694=>19704, +36695=>19705, +36696=>19706, +36697=>19707, +36698=>19708, +36699=>19709, +36700=>19710, +36701=>19711, +36702=>19712, +36704=>19713, +36707=>19714, +36709=>19715, +36714=>19716, +36736=>19717, +36748=>19718, +36754=>19719, +36765=>19720, +36768=>19721, +36769=>19722, +36770=>19723, +36772=>19724, +36773=>19725, +36775=>19726, +36778=>19727, +36780=>19728, +36787=>19729, +36788=>19730, +12193=>19731, +36789=>19731, +36791=>19732, +36792=>19733, +36794=>19734, +36795=>19735, +36796=>19736, +36799=>19737, +36800=>19738, +36803=>19739, +36806=>19740, +36809=>19741, +36810=>19742, +36811=>19743, +36812=>19744, +36813=>19745, +36815=>19746, +36818=>19747, +36822=>19748, +36823=>19749, +36826=>19750, +36832=>19751, +36833=>19752, +36835=>19753, +36839=>19754, +36844=>19755, +36847=>19756, +36849=>19757, +36850=>19758, +36853=>19759, +36854=>19760, +36858=>19761, +36859=>19762, +36860=>19763, +36862=>19764, +36863=>19765, +36871=>19766, +36872=>19767, +36876=>19768, +36878=>19769, +36883=>19770, +36888=>19771, +36892=>19772, +36900=>19773, +36901=>19774, +36903=>19775, +36904=>19776, +36905=>19777, +36906=>19778, +36907=>19779, +36908=>19780, +36912=>19781, +36913=>19782, +36915=>19783, +36916=>19784, +36919=>19785, +36921=>19786, +36922=>19787, +36925=>19788, +36927=>19789, +36928=>19790, +36931=>19791, +36933=>19792, +36934=>19793, +36936=>19794, +36937=>19795, +36938=>19796, +36940=>19797, +36950=>19798, +36953=>19799, +36954=>19800, +36957=>19801, +36959=>19802, +36961=>19803, +36964=>19804, +36966=>19805, +36967=>19806, +36970=>19807, +36971=>19808, +36972=>19809, +36975=>19810, +36976=>19811, +36977=>19812, +36979=>19813, +36982=>19814, +36985=>19815, +36987=>19816, +36990=>19817, +36997=>19818, +36998=>19819, +37001=>19820, +37004=>19821, +37005=>19822, +37006=>19823, +37010=>19824, +37012=>19825, +37014=>19826, +37016=>19827, +37018=>19828, +37020=>19829, +37022=>19830, +37023=>19831, +37024=>19832, +37028=>19833, +37029=>19834, +37031=>19835, +37032=>19836, +37033=>19837, +37035=>19838, +37037=>19839, +37042=>19840, +37047=>19841, +37052=>19842, +37053=>19843, +37055=>19844, +37056=>19845, +37058=>19846, +37059=>19847, +37062=>19848, +37064=>19849, +37065=>19850, +37067=>19851, +37068=>19852, +37069=>19853, +37074=>19854, +37076=>19855, +37077=>19856, +37078=>19857, +37080=>19858, +37081=>19859, +37082=>19860, +37086=>19861, +37088=>19862, +37091=>19863, +37092=>19864, +37093=>19865, +37097=>19866, +37098=>19867, +37100=>19868, +37102=>19869, +37104=>19870, +37105=>19871, +37106=>19872, +37107=>19873, +37110=>19874, +37111=>19875, +37113=>19876, +37114=>19877, +37115=>19878, +37116=>19879, +37119=>19880, +37120=>19881, +37121=>19882, +37123=>19883, +37125=>19884, +37127=>19885, +37128=>19886, +37130=>19887, +37131=>19888, +37132=>19889, +37133=>19890, +37134=>19891, +37135=>19892, +37136=>19893, +37137=>19894, +37139=>19895, +37141=>19896, +37143=>19897, +37144=>19898, +37146=>19899, +37147=>19900, +37148=>19901, +37149=>19902, +37151=>19903, +37152=>19904, +37153=>19905, +37156=>19906, +37157=>19907, +37158=>19908, +37160=>19909, +37161=>19910, +37162=>19911, +37163=>19912, +37164=>19913, +37166=>19914, +37171=>19915, +37173=>19916, +37175=>19917, +37176=>19918, +37179=>19919, +37180=>19920, +37181=>19921, +37182=>19922, +37183=>19923, +37184=>19924, +37185=>19925, +37186=>19926, +37188=>19927, +37189=>19928, +37191=>19929, +37201=>19930, +37203=>19931, +37204=>19932, +37205=>19933, +37206=>19934, +37208=>19935, +37209=>19936, +37211=>19937, +37212=>19938, +37215=>19939, +37216=>19940, +37222=>19941, +37223=>19942, +37224=>19943, +37227=>19944, +37229=>19945, +37235=>19946, +37242=>19947, +37243=>19948, +37244=>19949, +37248=>19950, +37249=>19951, +37250=>19952, +37251=>19953, +37252=>19954, +37254=>19955, +37256=>19956, +37258=>19957, +37262=>19958, +37263=>19959, +37267=>19960, +37268=>19961, +37269=>19962, +37271=>19963, +37272=>19964, +37273=>19965, +37277=>19966, +37278=>19967, +37279=>19968, +37280=>19969, +37281=>19970, +37284=>19971, +37285=>19972, +37286=>19973, +37287=>19974, +37288=>19975, +37289=>19976, +37296=>19977, +37297=>19978, +37298=>19979, +37299=>19980, +37302=>19981, +37303=>19982, +37304=>19983, +37305=>19984, +37307=>19985, +37308=>19986, +37309=>19987, +37310=>19988, +37311=>19989, +37314=>19990, +37316=>19991, +12196=>19992, +37318=>19992, +37320=>19993, +37328=>19994, +37334=>19995, +37338=>19996, +37339=>19997, +37342=>19998, +37343=>19999, +37344=>20000, +37345=>20001, +37346=>20002, +37349=>20003, +37350=>20004, +37352=>20005, +37354=>20006, +37355=>20007, +37356=>20008, +37357=>20009, +37358=>20010, +37359=>20011, +37360=>20012, +37361=>20013, +37362=>20014, +37363=>20015, +37364=>20016, +37366=>20017, +37368=>20018, +37371=>20019, +37372=>20020, +37373=>20021, +37374=>20022, +37375=>20023, +37378=>20024, +37379=>20025, +37381=>20026, +37382=>20027, +37383=>20028, +37386=>20029, +37387=>20030, +37388=>20031, +37391=>20032, +37394=>20033, +37395=>20034, +37398=>20035, +37399=>20036, +37400=>20037, +37401=>20038, +37402=>20039, +37403=>20040, +37404=>20041, +37405=>20042, +37407=>20043, +37408=>20044, +37409=>20045, +37410=>20046, +37412=>20047, +37416=>20048, +37417=>20049, +37418=>20050, +37419=>20051, +37420=>20052, +37421=>20053, +37423=>20054, +37425=>20055, +37426=>20056, +37429=>20057, +37430=>20058, +37435=>20059, +37436=>20060, +37441=>20061, +37442=>20062, +37443=>20063, +37444=>20064, +37446=>20065, +37447=>20066, +37450=>20067, +37451=>20068, +37452=>20069, +37454=>20070, +37455=>20071, +37456=>20072, +37458=>20073, +37459=>20074, +37460=>20075, +37462=>20076, +37464=>20077, +37465=>20078, +37468=>20079, +37469=>20080, +37471=>20081, +37472=>20082, +37473=>20083, +37475=>20084, +37476=>20085, +37477=>20086, +37479=>20087, +37480=>20088, +37481=>20089, +37482=>20090, +37483=>20091, +37486=>20092, +37487=>20093, +37488=>20094, +37489=>20095, +37490=>20096, +37491=>20097, +37493=>20098, +37494=>20099, +37495=>20100, +37497=>20101, +37500=>20102, +37501=>20103, +37502=>20104, +37505=>20105, +37506=>20106, +37508=>20107, +37510=>20108, +37511=>20109, +37512=>20110, +37513=>20111, +37514=>20112, +37515=>20113, +37516=>20114, +37517=>20115, +37519=>20116, +37520=>20117, +37522=>20118, +37524=>20119, +37525=>20120, +37527=>20121, +37529=>20122, +37531=>20123, +37533=>20124, +37534=>20125, +37535=>20126, +37537=>20127, +37538=>20128, +37540=>20129, +37543=>20130, +37549=>20131, +37551=>20132, +37552=>20133, +37554=>20134, +37555=>20135, +37556=>20136, +37557=>20137, +37558=>20138, +37560=>20139, +37562=>20140, +37565=>20141, +37566=>20142, +37567=>20143, +37568=>20144, +37570=>20145, +37572=>20146, +37574=>20147, +37577=>20148, +37578=>20149, +37579=>20150, +37581=>20151, +37582=>20152, +37584=>20153, +37585=>20154, +37587=>20155, +37588=>20156, +37589=>20157, +37590=>20158, +37591=>20159, +37592=>20160, +37593=>20161, +37594=>20162, +37595=>20163, +37596=>20164, +37598=>20165, +37600=>20166, +37601=>20167, +37602=>20168, +37607=>20169, +37609=>20170, +37611=>20171, +37612=>20172, +37618=>20173, +37619=>20174, +37620=>20175, +37621=>20176, +37623=>20177, +37625=>20178, +37626=>20179, +37627=>20180, +37629=>20181, +37630=>20182, +37631=>20183, +37632=>20184, +37634=>20185, +37635=>20186, +37636=>20187, +37637=>20188, +37641=>20189, +37642=>20190, +37643=>20191, +37644=>20192, +37645=>20193, +37646=>20194, +37647=>20195, +37649=>20196, +37651=>20197, +37652=>20198, +37654=>20199, +37655=>20200, +37660=>20201, +37661=>20202, +37662=>20203, +37665=>20204, +37667=>20205, +37668=>20206, +37669=>20207, +37671=>20208, +37673=>20209, +37674=>20210, +37676=>20211, +37677=>20212, +37680=>20213, +37681=>20214, +37684=>20215, +37685=>20216, +37687=>20217, +37689=>20218, +37690=>20219, +37691=>20220, +37692=>20221, +37693=>20222, +37695=>20223, +37698=>20224, +37700=>20225, +37701=>20226, +37704=>20227, +37705=>20228, +37706=>20229, +37708=>20230, +37710=>20231, +37711=>20232, +37712=>20233, +37713=>20234, +37714=>20235, +37715=>20236, +37717=>20237, +37718=>20238, +37719=>20239, +37721=>20240, +37722=>20241, +37724=>20242, +37725=>20243, +37726=>20244, +37727=>20245, +37728=>20246, +37729=>20247, +37730=>20248, +37731=>20249, +37734=>20250, +37735=>20251, +37736=>20252, +37739=>20253, +37741=>20254, +37742=>20255, +37743=>20256, +37745=>20257, +37746=>20258, +37747=>20259, +37748=>20260, +37751=>20261, +37752=>20262, +37753=>20263, +37755=>20264, +37756=>20265, +37757=>20266, +37759=>20267, +37760=>20268, +37761=>20269, +37763=>20270, +37765=>20271, +37766=>20272, +37768=>20273, +37769=>20274, +37771=>20275, +37772=>20276, +37773=>20277, +37774=>20278, +37776=>20279, +37777=>20280, +37778=>20281, +37779=>20282, +37780=>20283, +37781=>20284, +37783=>20285, +37785=>20286, +37786=>20287, +37787=>20288, +37788=>20289, +37789=>20290, +37790=>20291, +37791=>20292, +37792=>20293, +37793=>20294, +37796=>20295, +37797=>20296, +37800=>20297, +37803=>20298, +37805=>20299, +37807=>20300, +37809=>20301, +37810=>20302, +37812=>20303, +37814=>20304, +37815=>20305, +37817=>20306, +37818=>20307, +37819=>20308, +37820=>20309, +37821=>20310, +37822=>20311, +37824=>20312, +37825=>20313, +37826=>20314, +37828=>20315, +37829=>20316, +37830=>20317, +37833=>20318, +37835=>20319, +37838=>20320, +37839=>20321, +37840=>20322, +37842=>20323, +37843=>20324, +37844=>20325, +37845=>20326, +37849=>20327, +37850=>20328, +37851=>20329, +37856=>20330, +37859=>20331, +37861=>20332, +37862=>20333, +37863=>20334, +37865=>20335, +37866=>20336, +37867=>20337, +37868=>20338, +37869=>20339, +37870=>20340, +37871=>20341, +37872=>20342, +37873=>20343, +37874=>20344, +37875=>20345, +37876=>20346, +37878=>20347, +37880=>20348, +37882=>20349, +37883=>20350, +37884=>20351, +37885=>20352, +37886=>20353, +37887=>20354, +37888=>20355, +37889=>20356, +37890=>20357, +37892=>20358, +37893=>20359, +37894=>20360, +37895=>20361, +37896=>20362, +37897=>20363, +37898=>20364, +37900=>20365, +37901=>20366, +37902=>20367, +37903=>20368, +37905=>20369, +37909=>20370, +37910=>20371, +37911=>20372, +37914=>20373, +37915=>20374, +37916=>20375, +37918=>20376, +37919=>20377, +37921=>20378, +37922=>20379, +37923=>20380, +37924=>20381, +37925=>20382, +37929=>20383, +37930=>20384, +37931=>20385, +37932=>20386, +37933=>20387, +37935=>20388, +37936=>20389, +37937=>20390, +37940=>20391, +37942=>20392, +37943=>20393, +37945=>20394, +37947=>20395, +37948=>20396, +37949=>20397, +37952=>20398, +37953=>20399, +37954=>20400, +37955=>20401, +37957=>20402, +37958=>20403, +37959=>20404, +37960=>20405, +37961=>20406, +37963=>20407, +37965=>20408, +37966=>20409, +37967=>20410, +37968=>20411, +37969=>20412, +37971=>20413, +37973=>20414, +37974=>20415, +37975=>20416, +37976=>20417, +37977=>20418, +37978=>20419, +37979=>20420, +37980=>20421, +37981=>20422, +37982=>20423, +37983=>20424, +37985=>20425, +37986=>20426, +37988=>20427, +37990=>20428, +37991=>20429, +37992=>20430, +37993=>20431, +37994=>20432, +37996=>20433, +37998=>20434, +37999=>20435, +38001=>20436, +38003=>20437, +38004=>20438, +38005=>20439, +38006=>20440, +38008=>20441, +38010=>20442, +38011=>20443, +38016=>20444, +38017=>20445, +38018=>20446, +38019=>20447, +38020=>20448, +38033=>20449, +38038=>20450, +38040=>20451, +38087=>20452, +38095=>20453, +38099=>20454, +38100=>20455, +38106=>20456, +38118=>20457, +38139=>20458, +38172=>20459, +38176=>20460, +38183=>20461, +38195=>20462, +38205=>20463, +38211=>20464, +38216=>20465, +38219=>20466, +38229=>20467, +38234=>20468, +38240=>20469, +38254=>20470, +38260=>20471, +38261=>20472, +38264=>20473, +38265=>20474, +38266=>20475, +38267=>20476, +38268=>20477, +38269=>20478, +38270=>20479, +38273=>20480, +38276=>20481, +38277=>20482, +38279=>20483, +38280=>20484, +38282=>20485, +38285=>20486, +38288=>20487, +38290=>20488, +38293=>20489, +38294=>20490, +38295=>20491, +38297=>20492, +38298=>20493, +38299=>20494, +38300=>20495, +38301=>20496, +38302=>20497, +38303=>20498, +38304=>20499, +38306=>20500, +38310=>20501, +38311=>20502, +38314=>20503, +38318=>20504, +38319=>20505, +38320=>20506, +38321=>20507, +38323=>20508, +38324=>20509, +38325=>20510, +38327=>20511, +38328=>20512, +38330=>20513, +38336=>20514, +38337=>20515, +38338=>20516, +38340=>20517, +38341=>20518, +38343=>20519, +38345=>20520, +38349=>20521, +38350=>20522, +38351=>20523, +38353=>20524, +38354=>20525, +38355=>20526, +38359=>20527, +38360=>20528, +38361=>20529, +38362=>20530, +38363=>20531, +38365=>20532, +38367=>20533, +38368=>20534, +38371=>20535, +38372=>20536, +38374=>20537, +38375=>20538, +38380=>20539, +38399=>20540, +38407=>20541, +38419=>20542, +38424=>20543, +38427=>20544, +38430=>20545, +38432=>20546, +38435=>20547, +38436=>20548, +38437=>20549, +38438=>20550, +38439=>20551, +38440=>20552, +38441=>20553, +38443=>20554, +38444=>20555, +38445=>20556, +38447=>20557, +38448=>20558, +38455=>20559, +38456=>20560, +38457=>20561, +38458=>20562, +38462=>20563, +38465=>20564, +38467=>20565, +38474=>20566, +38478=>20567, +38479=>20568, +38481=>20569, +38482=>20570, +38483=>20571, +38486=>20572, +38487=>20573, +38489=>20574, +38490=>20575, +38492=>20576, +38494=>20577, +38496=>20578, +38501=>20579, +38502=>20580, +38507=>20581, +38509=>20582, +38510=>20583, +38511=>20584, +38513=>20585, +38521=>20586, +38522=>20587, +38523=>20588, +38524=>20589, +38526=>20590, +38527=>20591, +38528=>20592, +38529=>20593, +38530=>20594, +38531=>20595, +38532=>20596, +38535=>20597, +38537=>20598, +38540=>20599, +38545=>20600, +38546=>20601, +38547=>20602, +38550=>20603, +38554=>20604, +38557=>20605, +38558=>20606, +38559=>20607, +38560=>20608, +38561=>20609, +38562=>20610, +63985=>20611, +38563=>20611, +38564=>20612, +38565=>20613, +38566=>20614, +38569=>20615, +38571=>20616, +38572=>20617, +38573=>20618, +38574=>20619, +38575=>20620, +38578=>20621, +38581=>20622, +38583=>20623, +38586=>20624, +38591=>20625, +38594=>20626, +38595=>20627, +38600=>20628, +38602=>20629, +38603=>20630, +38608=>20631, +38609=>20632, +38611=>20633, +38612=>20634, +38615=>20635, +38616=>20636, +38618=>20637, +38621=>20638, +38622=>20639, +38623=>20640, +38625=>20641, +38628=>20642, +38629=>20643, +38630=>20644, +38631=>20645, +38635=>20646, +38636=>20647, +38637=>20648, +38638=>20649, +38640=>20650, +38641=>20651, +38644=>20652, +38645=>20653, +38648=>20654, +38650=>20655, +38652=>20656, +38653=>20657, +38655=>20658, +38658=>20659, +38659=>20660, +38661=>20661, +38666=>20662, +38667=>20663, +38668=>20664, +38672=>20665, +38673=>20666, +38674=>20667, +38676=>20668, +38677=>20669, +38679=>20670, +38680=>20671, +38681=>20672, +38682=>20673, +38683=>20674, +38685=>20675, +38687=>20676, +38688=>20677, +38689=>20678, +38690=>20679, +38691=>20680, +38692=>20681, +38693=>20682, +38694=>20683, +38696=>20684, +38697=>20685, +38699=>20686, +38700=>20687, +38702=>20688, +38703=>20689, +38705=>20690, +38707=>20691, +38708=>20692, +38709=>20693, +38710=>20694, +38711=>20695, +38714=>20696, +38715=>20697, +38716=>20698, +38719=>20699, +38720=>20700, +38721=>20701, +38723=>20702, +38725=>20703, +38726=>20704, +38727=>20705, +38729=>20706, +38730=>20707, +38731=>20708, +38732=>20709, +38733=>20710, +38734=>20711, +38735=>20712, +38736=>20713, +12205=>20714, +38737=>20714, +38740=>20715, +38741=>20716, +38743=>20717, +38744=>20718, +38748=>20719, +38749=>20720, +38751=>20721, +38755=>20722, +38756=>20723, +38758=>20724, +38759=>20725, +38762=>20726, +38763=>20727, +38764=>20728, +38765=>20729, +38766=>20730, +38767=>20731, +38768=>20732, +38769=>20733, +38770=>20734, +38773=>20735, +38775=>20736, +38776=>20737, +38777=>20738, +38778=>20739, +38779=>20740, +38781=>20741, +38782=>20742, +38783=>20743, +38784=>20744, +38785=>20745, +38786=>20746, +38787=>20747, +38788=>20748, +38790=>20749, +38791=>20750, +38792=>20751, +38793=>20752, +38794=>20753, +38796=>20754, +38798=>20755, +38800=>20756, +38803=>20757, +38805=>20758, +38806=>20759, +38807=>20760, +38809=>20761, +38810=>20762, +38811=>20763, +38812=>20764, +38813=>20765, +38814=>20766, +38815=>20767, +38817=>20768, +38818=>20769, +38820=>20770, +38821=>20771, +38823=>20772, +38824=>20773, +38825=>20774, +38826=>20775, +38828=>20776, +38830=>20777, +38832=>20778, +38833=>20779, +38835=>20780, +38837=>20781, +38838=>20782, +38839=>20783, +38840=>20784, +38841=>20785, +38842=>20786, +38843=>20787, +38844=>20788, +38846=>20789, +38847=>20790, +38848=>20791, +38849=>20792, +38850=>20793, +38852=>20794, +38853=>20795, +38855=>20796, +38856=>20797, +38858=>20798, +38861=>20799, +38862=>20800, +38863=>20801, +38864=>20802, +38865=>20803, +38866=>20804, +38868=>20805, +38869=>20806, +38870=>20807, +38871=>20808, +38872=>20809, +38874=>20810, +38875=>20811, +38877=>20812, +38879=>20813, +38880=>20814, +38881=>20815, +38882=>20816, +38883=>20817, +38884=>20818, +38885=>20819, +38888=>20820, +38894=>20821, +38895=>20822, +38896=>20823, +38897=>20824, +38898=>20825, +38900=>20826, +38903=>20827, +38904=>20828, +38905=>20829, +38906=>20830, +38907=>20831, +38908=>20832, +38909=>20833, +38910=>20834, +38912=>20835, +38916=>20836, +38921=>20837, +38923=>20838, +38925=>20839, +38932=>20840, +38933=>20841, +38934=>20842, +38937=>20843, +38938=>20844, +38939=>20845, +38941=>20846, +38942=>20847, +38943=>20848, +38944=>20849, +38946=>20850, +38947=>20851, +38949=>20852, +38951=>20853, +38952=>20854, +38953=>20855, +38954=>20856, +38955=>20857, +38956=>20858, +38958=>20859, +38959=>20860, +38961=>20861, +38962=>20862, +38963=>20863, +38964=>20864, +38965=>20865, +38966=>20866, +38969=>20867, +38970=>20868, +38972=>20869, +38974=>20870, +38975=>20871, +38976=>20872, +38977=>20873, +38978=>20874, +38979=>20875, +38980=>20876, +38981=>20877, +38983=>20878, +38984=>20879, +38985=>20880, +38986=>20881, +38987=>20882, +38991=>20883, +38992=>20884, +38993=>20885, +38994=>20886, +38997=>20887, +38998=>20888, +38999=>20889, +39002=>20890, +39004=>20891, +39005=>20892, +39007=>20893, +39008=>20894, +39009=>20895, +39011=>20896, +39012=>20897, +39014=>20898, +39016=>20899, +39017=>20900, +39018=>20901, +39021=>20902, +39022=>20903, +39026=>20904, +39051=>20905, +39054=>20906, +39058=>20907, +39061=>20908, +39065=>20909, +39075=>20910, +39081=>20911, +39082=>20912, +39083=>20913, +39084=>20914, +39085=>20915, +39088=>20916, +39090=>20917, +39092=>20918, +39093=>20919, +39095=>20920, +39096=>20921, +39097=>20922, +39098=>20923, +39099=>20924, +39101=>20925, +39102=>20926, +39103=>20927, +39104=>20928, +39105=>20929, +39106=>20930, +39107=>20931, +39109=>20932, +39111=>20933, +39113=>20934, +39114=>20935, +39115=>20936, +39116=>20937, +39117=>20938, +39119=>20939, +39120=>20940, +39124=>20941, +39126=>20942, +39127=>20943, +39132=>20944, +39133=>20945, +39137=>20946, +39139=>20947, +39140=>20948, +39141=>20949, +39142=>20950, +39148=>20951, +39150=>20952, +39152=>20953, +39153=>20954, +39155=>20955, +39157=>20956, +39158=>20957, +39159=>20958, +39160=>20959, +39161=>20960, +39162=>20961, +39163=>20962, +39167=>20963, +39168=>20964, +39169=>20965, +39170=>20966, +39172=>20967, +39174=>20968, +39175=>20969, +39176=>20970, +39179=>20971, +39182=>20972, +39183=>20973, +39188=>20974, +39189=>20975, +39190=>20976, +39191=>20977, +39193=>20978, +39194=>20979, +39196=>20980, +39197=>20981, +39199=>20982, +39200=>20983, +39202=>20984, +39203=>20985, +39204=>20986, +39205=>20987, +39206=>20988, +39207=>20989, +39209=>20990, +39210=>20991, +39211=>20992, +39212=>20993, +39213=>20994, +39215=>20995, +39216=>20996, +39217=>20997, +39218=>20998, +39220=>20999, +39221=>21000, +39222=>21001, +39224=>21002, +39225=>21003, +39226=>21004, +39227=>21005, +39229=>21006, +39232=>21007, +39233=>21008, +39234=>21009, +39236=>21010, +39238=>21011, +39239=>21012, +39245=>21013, +39246=>21014, +39247=>21015, +39248=>21016, +39251=>21017, +39254=>21018, +39256=>21019, +39257=>21020, +39258=>21021, +39259=>21022, +39261=>21023, +39263=>21024, +39264=>21025, +39265=>21026, +39268=>21027, +39270=>21028, +39283=>21029, +39288=>21030, +39289=>21031, +39291=>21032, +39294=>21033, +39298=>21034, +39299=>21035, +39305=>21036, +39308=>21037, +39310=>21038, +39322=>21039, +39323=>21040, +39324=>21041, +39325=>21042, +39326=>21043, +39327=>21044, +39328=>21045, +39329=>21046, +39330=>21047, +39331=>21048, +39332=>21049, +39334=>21050, +39335=>21051, +39337=>21052, +39338=>21053, +39339=>21054, +39343=>21055, +39344=>21056, +39346=>21057, +39349=>21058, +39350=>21059, +39351=>21060, +39352=>21061, +39353=>21062, +39354=>21063, +39355=>21064, +39356=>21065, +39357=>21066, +39358=>21067, +39359=>21068, +39360=>21069, +39362=>21070, +39363=>21071, +39364=>21072, +39365=>21073, +39366=>21074, +39367=>21075, +39368=>21076, +39369=>21077, +39370=>21078, +39371=>21079, +39372=>21080, +39373=>21081, +39374=>21082, +39375=>21083, +39379=>21084, +39382=>21085, +39383=>21086, +39386=>21087, +39388=>21088, +39390=>21089, +39392=>21090, +39395=>21091, +39396=>21092, +39397=>21093, +39398=>21094, +39399=>21095, +39400=>21096, +39401=>21097, +39402=>21098, +39403=>21099, +39404=>21100, +39406=>21101, +39407=>21102, +39408=>21103, +39410=>21104, +39411=>21105, +39412=>21106, +39413=>21107, +39414=>21108, +39415=>21109, +39416=>21110, +39417=>21111, +39418=>21112, +39419=>21113, +39420=>21114, +39421=>21115, +39422=>21116, +39424=>21117, +39426=>21118, +39427=>21119, +39428=>21120, +39430=>21121, +39431=>21122, +39432=>21123, +39433=>21124, +39434=>21125, +39435=>21126, +39436=>21127, +39440=>21128, +39441=>21129, +39442=>21130, +39443=>21131, +39444=>21132, +39445=>21133, +39447=>21134, +39448=>21135, +39450=>21136, +39451=>21137, +39452=>21138, +39453=>21139, +39454=>21140, +39455=>21141, +39456=>21142, +39457=>21143, +39458=>21144, +39459=>21145, +39460=>21146, +39461=>21147, +39462=>21148, +39463=>21149, +39464=>21150, +39465=>21151, +39466=>21152, +39468=>21153, +39471=>21154, +39473=>21155, +39474=>21156, +39475=>21157, +39476=>21158, +39477=>21159, +39481=>21160, +39482=>21161, +39483=>21162, +39484=>21163, +39485=>21164, +39487=>21165, +39494=>21166, +39495=>21167, +39496=>21168, +39497=>21169, +39499=>21170, +39500=>21171, +39502=>21172, +39504=>21173, +39505=>21174, +39506=>21175, +39507=>21176, +39508=>21177, +39510=>21178, +39512=>21179, +39513=>21180, +39516=>21181, +39517=>21182, +39518=>21183, +39520=>21184, +39521=>21185, +39523=>21186, +39526=>21187, +39527=>21188, +39528=>21189, +39529=>21190, +39531=>21191, +39538=>21192, +39555=>21193, +39561=>21194, +39565=>21195, +39566=>21196, +39572=>21197, +39573=>21198, +39577=>21199, +39590=>21200, +39593=>21201, +39594=>21202, +39595=>21203, +39596=>21204, +39597=>21205, +39598=>21206, +39602=>21207, +39603=>21208, +39604=>21209, +39605=>21210, +39609=>21211, +39611=>21212, +39613=>21213, +39614=>21214, +39615=>21215, +39619=>21216, +39620=>21217, +39622=>21218, +39623=>21219, +39624=>21220, +39625=>21221, +39626=>21222, +39629=>21223, +39630=>21224, +39632=>21225, +39639=>21226, +39641=>21227, +39642=>21228, +39643=>21229, +39644=>21230, +39645=>21231, +39646=>21232, +39648=>21233, +39650=>21234, +39651=>21235, +39652=>21236, +39653=>21237, +39655=>21238, +39656=>21239, +39657=>21240, +39658=>21241, +39660=>21242, +39664=>21243, +39665=>21244, +39666=>21245, +39667=>21246, +39668=>21247, +39669=>21248, +39670=>21249, +39671=>21250, +39672=>21251, +39674=>21252, +39676=>21253, +39677=>21254, +39678=>21255, +39679=>21256, +39680=>21257, +39681=>21258, +39682=>21259, +39684=>21260, +39685=>21261, +39687=>21262, +39689=>21263, +39690=>21264, +39691=>21265, +39692=>21266, +39694=>21267, +39696=>21268, +39697=>21269, +39698=>21270, +39700=>21271, +39701=>21272, +39702=>21273, +39703=>21274, +39704=>21275, +39705=>21276, +39707=>21277, +39708=>21278, +39709=>21279, +39710=>21280, +39712=>21281, +39713=>21282, +39716=>21283, +39718=>21284, +39720=>21285, +39722=>21286, +39723=>21287, +39724=>21288, +39725=>21289, +39728=>21290, +39731=>21291, +39732=>21292, +39733=>21293, +39734=>21294, +39735=>21295, +39736=>21296, +39737=>21297, +39738=>21298, +39741=>21299, +39742=>21300, +39743=>21301, +39744=>21302, +39750=>21303, +39754=>21304, +39755=>21305, +39756=>21306, +39760=>21307, +39762=>21308, +39763=>21309, +39765=>21310, +39766=>21311, +39767=>21312, +39769=>21313, +39771=>21314, +39772=>21315, +39773=>21316, +39774=>21317, +39775=>21318, +39776=>21319, +39777=>21320, +39778=>21321, +39779=>21322, +39780=>21323, +39781=>21324, +39782=>21325, +39783=>21326, +39784=>21327, +39785=>21328, +39786=>21329, +39787=>21330, +39788=>21331, +39789=>21332, +39790=>21333, +39792=>21334, +39793=>21335, +39794=>21336, +39795=>21337, +39797=>21338, +39798=>21339, +39800=>21340, +39801=>21341, +39802=>21342, +39803=>21343, +39804=>21344, +39805=>21345, +39806=>21346, +39807=>21347, +39808=>21348, +39810=>21349, +39812=>21350, +39813=>21351, +39814=>21352, +39815=>21353, +39816=>21354, +39817=>21355, +39818=>21356, +39819=>21357, +39820=>21358, +39821=>21359, +39823=>21360, +39827=>21361, +39828=>21362, +39829=>21363, +39830=>21364, +39831=>21365, +39832=>21366, +39833=>21367, +39835=>21368, +39836=>21369, +39839=>21370, +39840=>21371, +39841=>21372, +39842=>21373, +39843=>21374, +39844=>21375, +39845=>21376, +39846=>21377, +39847=>21378, +39848=>21379, +39849=>21380, +39852=>21381, +39855=>21382, +39856=>21383, +39857=>21384, +39858=>21385, +39859=>21386, +39860=>21387, +39861=>21388, +39862=>21389, +39863=>21390, +39864=>21391, +39865=>21392, +39866=>21393, +39867=>21394, +39868=>21395, +39869=>21396, +39870=>21397, +39871=>21398, +39874=>21399, +39875=>21400, +39876=>21401, +39877=>21402, +39878=>21403, +39880=>21404, +39883=>21405, +39884=>21406, +39885=>21407, +39886=>21408, +39887=>21409, +39888=>21410, +39889=>21411, +39890=>21412, +39891=>21413, +39893=>21414, +39895=>21415, +39896=>21416, +39897=>21417, +39898=>21418, +39900=>21419, +39902=>21420, +39903=>21421, +39904=>21422, +39907=>21423, +39909=>21424, +39910=>21425, +39913=>21426, +39916=>21427, +39917=>21428, +39918=>21429, +39919=>21430, +39921=>21431, +39922=>21432, +39923=>21433, +39925=>21434, +39926=>21435, +39927=>21436, +39928=>21437, +39929=>21438, +39930=>21439, +39931=>21440, +39932=>21441, +39934=>21442, +39936=>21443, +39937=>21444, +39938=>21445, +39939=>21446, +39940=>21447, +39941=>21448, +39942=>21449, +39943=>21450, +39946=>21451, +39947=>21452, +39948=>21453, +39950=>21454, +39951=>21455, +39953=>21456, +39956=>21457, +39957=>21458, +39958=>21459, +39959=>21460, +39960=>21461, +39961=>21462, +39962=>21463, +39963=>21464, +39964=>21465, +39965=>21466, +39966=>21467, +39967=>21468, +39969=>21469, +39970=>21470, +39972=>21471, +39974=>21472, +39975=>21473, +39978=>21474, +39979=>21475, +39980=>21476, +39982=>21477, +39983=>21478, +39984=>21479, +39988=>21480, +39990=>21481, +39992=>21482, +39994=>21483, +39996=>21484, +39997=>21485, +39999=>21486, +40000=>21487, +40001=>21488, +40002=>21489, +40003=>21490, +40004=>21491, +40006=>21492, +40007=>21493, +40010=>21494, +40011=>21495, +40012=>21496, +40013=>21497, +40014=>21498, +40015=>21499, +40016=>21500, +40017=>21501, +40019=>21502, +40021=>21503, +40025=>21504, +40026=>21505, +40027=>21506, +40028=>21507, +40030=>21508, +40032=>21509, +40033=>21510, +40034=>21511, +40035=>21512, +40036=>21513, +40037=>21514, +40038=>21515, +40040=>21516, +40041=>21517, +40042=>21518, +40043=>21519, +40044=>21520, +40046=>21521, +40047=>21522, +40048=>21523, +40049=>21524, +40050=>21525, +40051=>21526, +40052=>21527, +40053=>21528, +40054=>21529, +40055=>21530, +40057=>21531, +40059=>21532, +40061=>21533, +40062=>21534, +40064=>21535, +40067=>21536, +40068=>21537, +40073=>21538, +40074=>21539, +40076=>21540, +40079=>21541, +40083=>21542, +40086=>21543, +40087=>21544, +40088=>21545, +40089=>21546, +40093=>21547, +40106=>21548, +40108=>21549, +40111=>21550, +40121=>21551, +40126=>21552, +40127=>21553, +40128=>21554, +40129=>21555, +40130=>21556, +40136=>21557, +40137=>21558, +40145=>21559, +40146=>21560, +40154=>21561, +40155=>21562, +40160=>21563, +40161=>21564, +40163=>21565, +40164=>21566, +40166=>21567, +40167=>21568, +40168=>21569, +40170=>21570, +40171=>21571, +40173=>21572, +40174=>21573, +40175=>21574, +40176=>21575, +40177=>21576, +40178=>21577, +40181=>21578, +40183=>21579, +40184=>21580, +40185=>21581, +40186=>21582, +40187=>21583, +40188=>21584, +40189=>21585, +40190=>21586, +40191=>21587, +40192=>21588, +40193=>21589, +40194=>21590, +40195=>21591, +40196=>21592, +40197=>21593, +40200=>21594, +40202=>21595, +40203=>21596, +40204=>21597, +40205=>21598, +40206=>21599, +40207=>21600, +40208=>21601, +40209=>21602, +40210=>21603, +40211=>21604, +40212=>21605, +40214=>21606, +40215=>21607, +40216=>21608, +40217=>21609, +40218=>21610, +40220=>21611, +40222=>21612, +40224=>21613, +40225=>21614, +40226=>21615, +40228=>21616, +40229=>21617, +40231=>21618, +40233=>21619, +40234=>21620, +40235=>21621, +40236=>21622, +40237=>21623, +40238=>21624, +40241=>21625, +40242=>21626, +40243=>21627, +40244=>21628, +40245=>21629, +40246=>21630, +40247=>21631, +40248=>21632, +40249=>21633, +40250=>21634, +40252=>21635, +40253=>21636, +40254=>21637, +40256=>21638, +40257=>21639, +40259=>21640, +40260=>21641, +40261=>21642, +40262=>21643, +40263=>21644, +40264=>21645, +40265=>21646, +40266=>21647, +40267=>21648, +40268=>21649, +40269=>21650, +40270=>21651, +40271=>21652, +40272=>21653, +40276=>21654, +40277=>21655, +40278=>21656, +40279=>21657, +40280=>21658, +40281=>21659, +40282=>21660, +40283=>21661, +40286=>21662, +40287=>21663, +40290=>21664, +40291=>21665, +40292=>21666, +40293=>21667, +40294=>21668, +40295=>21669, +40296=>21670, +40297=>21671, +40299=>21672, +40301=>21673, +40302=>21674, +40304=>21675, +40305=>21676, +40307=>21677, +40308=>21678, +40309=>21679, +40310=>21680, +40311=>21681, +40312=>21682, +40313=>21683, +40314=>21684, +40315=>21685, +40316=>21686, +40317=>21687, +40318=>21688, +40319=>21689, +40320=>21690, +40321=>21691, +40322=>21692, +40323=>21693, +40324=>21694, +40325=>21695, +40326=>21696, +40328=>21697, +40330=>21698, +40331=>21699, +40332=>21700, +40333=>21701, +40334=>21702, +40335=>21703, +40336=>21704, +40337=>21705, +40338=>21706, +40340=>21707, +40341=>21708, +40342=>21709, +40343=>21710, +40345=>21711, +40347=>21712, +40348=>21713, +40349=>21714, +40350=>21715, +40351=>21716, +40352=>21717, +40353=>21718, +40354=>21719, +40355=>21720, +40356=>21721, +40358=>21722, +40359=>21723, +40360=>21724, +40362=>21725, +40363=>21726, +40364=>21727, +40365=>21728, +40366=>21729, +40368=>21730, +40369=>21731, +40370=>21732, +40371=>21733, +40373=>21734, +40374=>21735, +40375=>21736, +40376=>21737, +40377=>21738, +40378=>21739, +40381=>21740, +40382=>21741, +40383=>21742, +40385=>21743, +40387=>21744, +40389=>21745, +40390=>21746, +40391=>21747, +40392=>21748, +40393=>21749, +40394=>21750, +40395=>21751, +40396=>21752, +40397=>21753, +40398=>21754, +40399=>21755, +40400=>21756, +40401=>21757, +40402=>21758, +40404=>21759, +40405=>21760, +40406=>21761, +40408=>21762, +40411=>21763, +40412=>21764, +40413=>21765, +40414=>21766, +40415=>21767, +40416=>21768, +40417=>21769, +40418=>21770, +40419=>21771, +40420=>21772, +40423=>21773, +40424=>21774, +40425=>21775, +40426=>21776, +40427=>21777, +40428=>21778, +40429=>21779, +40430=>21780, +40432=>21781, +40433=>21782, +40436=>21783, +40437=>21784, +40438=>21785, +40439=>21786, +40443=>21787, +40444=>21788, +40445=>21789, +40446=>21790, +40447=>21791, +40448=>21792, +40449=>21793, +40450=>21794, +40451=>21795, +40452=>21796, +40453=>21797, +40454=>21798, +40455=>21799, +40456=>21800, +40457=>21801, +40458=>21802, +40459=>21803, +40461=>21804, +40462=>21805, +40463=>21806, +40464=>21807, +40465=>21808, +40466=>21809, +40467=>21810, +40468=>21811, +40470=>21812, +40471=>21813, +40472=>21814, +40473=>21815, +40476=>21816, +40484=>21817, +40487=>21818, +40494=>21819, +40496=>21820, +40500=>21821, +40507=>21822, +40508=>21823, +40512=>21824, +40525=>21825, +40528=>21826, +40530=>21827, +40531=>21828, +40532=>21829, +40534=>21830, +40537=>21831, +40541=>21832, +40543=>21833, +40544=>21834, +40545=>21835, +40546=>21836, +40549=>21837, +40558=>21838, +40559=>21839, +40562=>21840, +40564=>21841, +40566=>21842, +40567=>21843, +40568=>21844, +40571=>21845, +40576=>21846, +40577=>21847, +40579=>21848, +40580=>21849, +40581=>21850, +40582=>21851, +40585=>21852, +40586=>21853, +40588=>21854, +40589=>21855, +40590=>21856, +40591=>21857, +40592=>21858, +40593=>21859, +40596=>21860, +40597=>21861, +40598=>21862, +40600=>21863, +40601=>21864, +40602=>21865, +40603=>21866, +40604=>21867, +40606=>21868, +40608=>21869, +40609=>21870, +40610=>21871, +40611=>21872, +40612=>21873, +40615=>21874, +40616=>21875, +40618=>21876, +40619=>21877, +40620=>21878, +40621=>21879, +40622=>21880, +40624=>21881, +40625=>21882, +40626=>21883, +40627=>21884, +40630=>21885, +40631=>21886, +40633=>21887, +40634=>21888, +40636=>21889, +40639=>21890, +40640=>21891, +40641=>21892, +40642=>21893, +12232=>21894, +40643=>21894, +40645=>21895, +40646=>21896, +40647=>21897, +40648=>21898, +40650=>21899, +40651=>21900, +40656=>21901, +40658=>21902, +40659=>21903, +40661=>21904, +40662=>21905, +40663=>21906, +40665=>21907, +40666=>21908, +40673=>21909, +40675=>21910, +40676=>21911, +40678=>21912, +40683=>21913, +40684=>21914, +40685=>21915, +40686=>21916, +40688=>21917, +40689=>21918, +40691=>21919, +40693=>21920, +40694=>21921, +40696=>21922, +40698=>21923, +40704=>21924, +40705=>21925, +40706=>21926, +40707=>21927, +40708=>21928, +40709=>21929, +40710=>21930, +40711=>21931, +40712=>21932, +40714=>21933, +40716=>21934, +40719=>21935, +40721=>21936, +40722=>21937, +40724=>21938, +40726=>21939, +40728=>21940, +40730=>21941, +40731=>21942, +40732=>21943, +40733=>21944, +40734=>21945, +40735=>21946, +40737=>21947, +40739=>21948, +40740=>21949, +40741=>21950, +40742=>21951, +40743=>21952, +40744=>21953, +40745=>21954, +40746=>21955, +40747=>21956, +40749=>21957, +40750=>21958, +40752=>21959, +40753=>21960, +40754=>21961, +40755=>21962, +40756=>21963, +40757=>21964, +40758=>21965, +40760=>21966, +40762=>21967, +40764=>21968, +40767=>21969, +40768=>21970, +40769=>21971, +40770=>21972, +40771=>21973, +40773=>21974, +40774=>21975, +40775=>21976, +40776=>21977, +40777=>21978, +40780=>21979, +40781=>21980, +40782=>21981, +40787=>21982, +40789=>21983, +40790=>21984, +40791=>21985, +40792=>21986, +40794=>21987, +40795=>21988, +40797=>21989, +40798=>21990, +40802=>21991, +40804=>21992, +40805=>21993, +40807=>21994, +40808=>21995, +40809=>21996, +40811=>21997, +40813=>21998, +40814=>21999, +40815=>22000, +40816=>22001, +40817=>22002, +40819=>22003, +40820=>22004, +40821=>22005, +40822=>22006, +40824=>22007, +40825=>22008, +40826=>22009, +40827=>22010, +40828=>22011, +40829=>22012, +40830=>22013, +40833=>22014, +40834=>22015, +40846=>22016, +40847=>22017, +40849=>22018, +40850=>22019, +40851=>22020, +40854=>22021, +40855=>22022, +40856=>22023, +40861=>22024, +40862=>22025, +40865=>22026, +40866=>22027, +40867=>22028, +40868=>22029, +40869=>22030, +63788=>22031, +64013=>22032, +64014=>22033, +64015=>22034, +64017=>22035, +64019=>22036, +64020=>22037, +64024=>22038, +64031=>22039, +64032=>22040, +64033=>22041, +64035=>22042, +64036=>22043, +64039=>22044, +64040=>22045, +64041=>22046, +11905=>22047, +59413=>22047, +131207=>22048, +59414=>22048, +131209=>22049, +59415=>22049, +131276=>22050, +59416=>22050, +11908=>22051, +59417=>22051, +13427=>22052, +59418=>22052, +13383=>22053, +59419=>22053, +11912=>22054, +59420=>22054, +11915=>22055, +59421=>22055, +40884=>22056, +59422=>22056, +13726=>22057, +59423=>22057, +13850=>22058, +59424=>22058, +13838=>22059, +59425=>22059, +11916=>22060, +59426=>22060, +11927=>22061, +59427=>22061, +14702=>22062, +59428=>22062, +14616=>22063, +59429=>22063, +40885=>22064, +59430=>22064, +14799=>22065, +59431=>22065, +14815=>22066, +59432=>22066, +14963=>22067, +59433=>22067, +14800=>22068, +59434=>22068, +40886=>22069, +59435=>22069, +40887=>22070, +59436=>22070, +15182=>22071, +59437=>22071, +15470=>22072, +59438=>22072, +15584=>22073, +59439=>22073, +11943=>22074, +59440=>22074, +136663=>22075, +59441=>22075, +40888=>22076, +59442=>22076, +11946=>22077, +59443=>22077, +16470=>22078, +59444=>22078, +16735=>22079, +59445=>22079, +11950=>22080, +59446=>22080, +17207=>22081, +59447=>22081, +11955=>22082, +59448=>22082, +11958=>22083, +59449=>22083, +11959=>22084, +59450=>22084, +141711=>22085, +59451=>22085, +17329=>22086, +59452=>22086, +17324=>22087, +59453=>22087, +11963=>22088, +59454=>22088, +17373=>22089, +59455=>22089, +17622=>22090, +59456=>22090, +18017=>22091, +59457=>22091, +17996=>22092, +59458=>22092, +40889=>22093, +132361=>22093, +59459=>22093, +18211=>22094, +59460=>22094, +18217=>22095, +59461=>22095, +18300=>22096, +59462=>22096, +18317=>22097, +59463=>22097, +11978=>22098, +59464=>22098, +18759=>22099, +59465=>22099, +18810=>22100, +59466=>22100, +18813=>22101, +59467=>22101, +18818=>22102, +59468=>22102, +18819=>22103, +59469=>22103, +18821=>22104, +59470=>22104, +18822=>22105, +59471=>22105, +18847=>22106, +59472=>22106, +18843=>22107, +59473=>22107, +18871=>22108, +59474=>22108, +18870=>22109, +59475=>22109, +40890=>22110, +133533=>22110, +59476=>22110, +147966=>22111, +59477=>22111, +19619=>22112, +59478=>22112, +19615=>22113, +59479=>22113, +19616=>22114, +59480=>22114, +19617=>22115, +59481=>22115, +19575=>22116, +59482=>22116, +19618=>22117, +59483=>22117, +19731=>22118, +59484=>22118, +19732=>22119, +59485=>22119, +19733=>22120, +59486=>22120, +19734=>22121, +59487=>22121, +19735=>22122, +59488=>22122, +19736=>22123, +59489=>22123, +19737=>22124, +59490=>22124, +19886=>22125, +59491=>22125, +40891=>22126, +59492=>22126, +8364=>22353, +59244=>22353, +165=>22354, +12351=>22357, +12436=>22375, +12535=>22390, +12537=>22391, +12536=>22392, +12538=>22393, +12339=>22395, +12340=>22396, +12341=>22397, +12344=>22398, +12345=>22399, +12346=>22400, +12586=>22401, +12587=>22402, +12588=>22403, +12704=>22404, +12705=>22405, +12706=>22406, +12707=>22407, +12708=>22408, +12709=>22409, +12710=>22410, +12711=>22411, +12712=>22412, +12713=>22413, +12714=>22414, +12715=>22415, +12716=>22416, +12717=>22417, +12718=>22418, +12719=>22419, +12720=>22420, +12721=>22421, +12722=>22422, +12723=>22423, +12724=>22424, +12725=>22425, +12726=>22426, +12727=>22427, +11904=>22428, +11906=>22429, +11907=>22430, +11909=>22431, +11910=>22432, +11911=>22433, +11913=>22434, +11914=>22435, +11917=>22436, +11918=>22437, +11919=>22438, +11920=>22439, +11921=>22440, +11922=>22441, +11923=>22442, +11924=>22443, +11925=>22444, +11926=>22445, +11928=>22446, +11929=>22447, +11931=>22448, +11932=>22449, +11933=>22450, +11934=>22451, +11935=>22452, +11936=>22453, +11937=>22454, +11938=>22455, +11939=>22456, +11940=>22457, +11941=>22458, +11942=>22459, +11944=>22460, +11945=>22461, +11947=>22462, +11948=>22463, +11949=>22464, +11951=>22465, +11952=>22466, +11953=>22467, +11954=>22468, +11956=>22469, +11957=>22470, +11960=>22471, +11961=>22472, +11962=>22473, +11964=>22474, +11965=>22475, +11966=>22476, +11967=>22477, +11968=>22478, +11969=>22479, +11970=>22480, +11971=>22481, +11972=>22482, +11973=>22483, +11974=>22484, +11975=>22485, +11976=>22486, +11977=>22487, +11979=>22488, +11980=>22489, +11981=>22490, +11982=>22491, +11983=>22492, +11984=>22493, +11985=>22494, +11986=>22495, +11987=>22496, +11988=>22497, +11989=>22498, +11990=>22499, +11991=>22500, +11992=>22501, +11993=>22502, +11994=>22503, +11995=>22504, +11996=>22505, +11997=>22506, +11998=>22507, +11999=>22508, +12000=>22509, +12001=>22510, +12002=>22511, +12003=>22512, +12004=>22513, +12005=>22514, +12006=>22515, +12007=>22516, +12008=>22517, +12009=>22518, +12010=>22519, +12011=>22520, +12012=>22521, +12013=>22522, +12014=>22523, +12015=>22524, +12016=>22525, +12017=>22526, +12018=>22527, +12019=>22528, +13312=>22529, +13313=>22530, +13314=>22531, +13315=>22532, +13316=>22533, +13317=>22534, +13318=>22535, +13319=>22536, +13320=>22537, +13321=>22538, +13322=>22539, +13323=>22540, +13324=>22541, +13325=>22542, +13326=>22543, +13327=>22544, +13328=>22545, +13329=>22546, +13330=>22547, +13331=>22548, +13332=>22549, +13333=>22550, +13334=>22551, +13335=>22552, +13336=>22553, +13337=>22554, +13338=>22555, +13339=>22556, +13340=>22557, +13341=>22558, +13342=>22559, +13343=>22560, +13344=>22561, +13345=>22562, +13346=>22563, +13347=>22564, +13348=>22565, +13349=>22566, +13350=>22567, +13351=>22568, +13352=>22569, +13353=>22570, +13354=>22571, +13355=>22572, +13356=>22573, +13357=>22574, +13358=>22575, +13359=>22576, +13360=>22577, +13361=>22578, +13362=>22579, +13363=>22580, +13364=>22581, +13365=>22582, +13366=>22583, +13367=>22584, +13368=>22585, +13369=>22586, +13370=>22587, +13371=>22588, +13372=>22589, +13373=>22590, +13374=>22591, +13375=>22592, +13376=>22593, +13377=>22594, +13378=>22595, +13379=>22596, +13380=>22597, +13381=>22598, +13382=>22599, +13384=>22600, +13385=>22601, +13386=>22602, +13387=>22603, +13388=>22604, +13389=>22605, +13390=>22606, +13391=>22607, +13392=>22608, +13393=>22609, +13394=>22610, +13395=>22611, +13396=>22612, +13397=>22613, +13398=>22614, +13399=>22615, +13400=>22616, +13401=>22617, +13402=>22618, +13403=>22619, +13404=>22620, +13405=>22621, +13406=>22622, +13407=>22623, +13408=>22624, +13409=>22625, +13410=>22626, +13411=>22627, +13412=>22628, +13413=>22629, +13414=>22630, +13415=>22631, +13416=>22632, +13417=>22633, +13418=>22634, +13419=>22635, +13420=>22636, +13421=>22637, +13422=>22638, +13423=>22639, +13424=>22640, +13425=>22641, +13426=>22642, +13428=>22643, +13429=>22644, +13430=>22645, +13431=>22646, +13432=>22647, +13433=>22648, +13434=>22649, +13435=>22650, +13436=>22651, +13437=>22652, +13438=>22653, +13439=>22654, +13440=>22655, +13441=>22656, +13442=>22657, +13443=>22658, +13444=>22659, +13445=>22660, +13446=>22661, +13447=>22662, +13448=>22663, +13449=>22664, +13450=>22665, +13451=>22666, +13452=>22667, +13453=>22668, +13454=>22669, +13455=>22670, +13456=>22671, +13457=>22672, +13458=>22673, +13459=>22674, +13460=>22675, +13461=>22676, +13462=>22677, +13463=>22678, +13464=>22679, +13465=>22680, +13466=>22681, +13467=>22682, +13468=>22683, +13469=>22684, +13470=>22685, +13471=>22686, +13472=>22687, +13473=>22688, +13474=>22689, +13475=>22690, +13476=>22691, +13477=>22692, +13478=>22693, +13479=>22694, +13480=>22695, +13481=>22696, +13482=>22697, +13483=>22698, +13484=>22699, +13485=>22700, +13486=>22701, +13487=>22702, +13488=>22703, +13489=>22704, +13490=>22705, +13491=>22706, +13492=>22707, +13493=>22708, +13494=>22709, +13495=>22710, +13496=>22711, +13497=>22712, +13498=>22713, +13499=>22714, +13500=>22715, +13501=>22716, +13502=>22717, +13503=>22718, +13504=>22719, +13505=>22720, +13506=>22721, +13507=>22722, +13508=>22723, +13509=>22724, +13510=>22725, +13511=>22726, +13512=>22727, +13513=>22728, +13514=>22729, +13515=>22730, +13516=>22731, +13517=>22732, +13518=>22733, +13519=>22734, +13520=>22735, +13521=>22736, +13522=>22737, +13523=>22738, +13524=>22739, +13525=>22740, +13526=>22741, +13527=>22742, +13528=>22743, +13529=>22744, +13530=>22745, +13531=>22746, +13532=>22747, +13533=>22748, +13534=>22749, +13535=>22750, +13536=>22751, +13537=>22752, +13538=>22753, +13539=>22754, +13540=>22755, +13541=>22756, +13542=>22757, +13543=>22758, +13544=>22759, +13545=>22760, +13546=>22761, +13547=>22762, +13548=>22763, +13549=>22764, +13550=>22765, +13551=>22766, +13552=>22767, +13553=>22768, +13554=>22769, +13555=>22770, +13556=>22771, +13557=>22772, +13558=>22773, +13559=>22774, +13560=>22775, +13561=>22776, +13562=>22777, +13563=>22778, +13564=>22779, +13565=>22780, +13566=>22781, +13567=>22782, +13568=>22783, +13569=>22784, +13570=>22785, +13571=>22786, +13572=>22787, +13573=>22788, +13574=>22789, +13575=>22790, +13576=>22791, +13577=>22792, +13578=>22793, +13579=>22794, +13580=>22795, +13581=>22796, +13582=>22797, +13583=>22798, +13584=>22799, +13585=>22800, +13586=>22801, +13587=>22802, +13588=>22803, +13589=>22804, +13590=>22805, +13591=>22806, +13592=>22807, +13593=>22808, +13594=>22809, +13595=>22810, +13596=>22811, +13597=>22812, +13598=>22813, +13599=>22814, +13600=>22815, +13601=>22816, +13602=>22817, +13603=>22818, +13604=>22819, +13605=>22820, +13606=>22821, +13607=>22822, +13608=>22823, +13609=>22824, +13610=>22825, +13611=>22826, +13612=>22827, +13613=>22828, +13614=>22829, +13615=>22830, +13616=>22831, +13617=>22832, +13618=>22833, +13619=>22834, +13620=>22835, +13621=>22836, +13622=>22837, +13623=>22838, +13624=>22839, +13625=>22840, +13626=>22841, +13627=>22842, +13628=>22843, +13629=>22844, +13630=>22845, +13631=>22846, +13632=>22847, +13633=>22848, +13634=>22849, +13635=>22850, +13636=>22851, +13637=>22852, +13638=>22853, +13639=>22854, +13640=>22855, +13641=>22856, +13642=>22857, +13643=>22858, +13644=>22859, +13645=>22860, +13646=>22861, +13647=>22862, +13648=>22863, +13649=>22864, +13650=>22865, +13651=>22866, +13652=>22867, +13653=>22868, +13654=>22869, +13655=>22870, +13656=>22871, +13657=>22872, +13658=>22873, +13659=>22874, +13660=>22875, +13661=>22876, +13662=>22877, +13663=>22878, +13664=>22879, +13665=>22880, +13666=>22881, +13667=>22882, +13668=>22883, +13669=>22884, +13670=>22885, +13671=>22886, +13672=>22887, +13673=>22888, +13674=>22889, +13675=>22890, +13676=>22891, +13677=>22892, +13678=>22893, +13679=>22894, +13680=>22895, +13681=>22896, +13682=>22897, +13683=>22898, +13684=>22899, +13685=>22900, +13686=>22901, +13687=>22902, +13688=>22903, +13689=>22904, +13690=>22905, +13691=>22906, +13692=>22907, +13693=>22908, +13694=>22909, +13695=>22910, +13696=>22911, +13697=>22912, +13698=>22913, +13699=>22914, +13700=>22915, +13701=>22916, +13702=>22917, +13703=>22918, +13704=>22919, +13705=>22920, +13706=>22921, +13707=>22922, +13708=>22923, +13709=>22924, +13710=>22925, +13711=>22926, +13712=>22927, +13713=>22928, +13714=>22929, +13715=>22930, +13716=>22931, +13717=>22932, +13718=>22933, +13719=>22934, +13720=>22935, +13721=>22936, +13722=>22937, +13723=>22938, +13724=>22939, +13725=>22940, +13727=>22941, +13728=>22942, +13729=>22943, +13730=>22944, +13731=>22945, +13732=>22946, +13733=>22947, +13734=>22948, +13735=>22949, +13736=>22950, +13737=>22951, +13738=>22952, +13739=>22953, +13740=>22954, +13741=>22955, +13742=>22956, +13743=>22957, +13744=>22958, +13745=>22959, +13746=>22960, +13747=>22961, +13748=>22962, +13749=>22963, +13750=>22964, +13751=>22965, +13752=>22966, +13753=>22967, +13754=>22968, +13755=>22969, +13756=>22970, +13757=>22971, +13758=>22972, +13759=>22973, +13760=>22974, +13761=>22975, +13762=>22976, +13763=>22977, +13764=>22978, +13765=>22979, +13766=>22980, +13767=>22981, +13768=>22982, +13769=>22983, +13770=>22984, +13771=>22985, +13772=>22986, +13773=>22987, +13774=>22988, +13775=>22989, +13776=>22990, +13777=>22991, +13778=>22992, +13779=>22993, +13780=>22994, +13781=>22995, +13782=>22996, +13783=>22997, +13784=>22998, +13785=>22999, +13786=>23000, +13787=>23001, +13788=>23002, +13789=>23003, +13790=>23004, +13791=>23005, +13792=>23006, +13793=>23007, +13794=>23008, +13795=>23009, +13796=>23010, +13797=>23011, +13798=>23012, +13799=>23013, +13800=>23014, +13801=>23015, +13802=>23016, +13803=>23017, +13804=>23018, +13805=>23019, +13806=>23020, +13807=>23021, +13808=>23022, +13809=>23023, +13810=>23024, +13811=>23025, +13812=>23026, +13813=>23027, +13814=>23028, +13815=>23029, +13816=>23030, +13817=>23031, +13818=>23032, +13819=>23033, +13820=>23034, +13821=>23035, +13822=>23036, +13823=>23037, +13824=>23038, +13825=>23039, +13826=>23040, +13827=>23041, +13828=>23042, +13829=>23043, +13830=>23044, +13831=>23045, +13832=>23046, +13833=>23047, +13834=>23048, +13835=>23049, +13836=>23050, +13837=>23051, +13839=>23052, +13840=>23053, +13841=>23054, +13842=>23055, +13843=>23056, +13844=>23057, +13845=>23058, +13846=>23059, +13847=>23060, +13848=>23061, +13849=>23062, +13851=>23063, +13852=>23064, +13853=>23065, +13854=>23066, +13855=>23067, +13856=>23068, +13857=>23069, +13858=>23070, +13859=>23071, +13860=>23072, +13861=>23073, +13862=>23074, +13863=>23075, +13864=>23076, +13865=>23077, +13866=>23078, +13867=>23079, +13868=>23080, +13869=>23081, +13870=>23082, +13871=>23083, +13872=>23084, +13873=>23085, +13874=>23086, +13875=>23087, +13876=>23088, +13877=>23089, +13878=>23090, +13879=>23091, +13880=>23092, +13881=>23093, +13882=>23094, +13883=>23095, +13884=>23096, +13885=>23097, +13886=>23098, +13887=>23099, +13888=>23100, +13889=>23101, +13890=>23102, +13891=>23103, +13892=>23104, +13893=>23105, +13894=>23106, +13895=>23107, +13896=>23108, +13897=>23109, +13898=>23110, +13899=>23111, +13900=>23112, +13901=>23113, +13902=>23114, +13903=>23115, +13904=>23116, +13905=>23117, +13906=>23118, +13907=>23119, +13908=>23120, +13909=>23121, +13910=>23122, +13911=>23123, +13912=>23124, +13913=>23125, +13914=>23126, +13915=>23127, +13916=>23128, +13917=>23129, +13918=>23130, +13919=>23131, +13920=>23132, +13921=>23133, +13922=>23134, +13923=>23135, +13924=>23136, +13925=>23137, +13926=>23138, +13927=>23139, +13928=>23140, +13929=>23141, +13930=>23142, +13931=>23143, +13932=>23144, +13933=>23145, +13934=>23146, +13935=>23147, +13936=>23148, +13937=>23149, +13938=>23150, +13939=>23151, +13940=>23152, +13941=>23153, +13942=>23154, +13943=>23155, +13944=>23156, +13945=>23157, +13946=>23158, +13947=>23159, +13948=>23160, +13949=>23161, +13950=>23162, +13951=>23163, +13952=>23164, +13953=>23165, +13954=>23166, +13955=>23167, +13956=>23168, +13957=>23169, +13958=>23170, +13959=>23171, +13960=>23172, +13961=>23173, +13962=>23174, +13963=>23175, +13964=>23176, +13965=>23177, +13966=>23178, +13967=>23179, +13968=>23180, +13969=>23181, +13970=>23182, +13971=>23183, +13972=>23184, +13973=>23185, +13974=>23186, +13975=>23187, +13976=>23188, +13977=>23189, +13978=>23190, +13979=>23191, +13980=>23192, +13981=>23193, +13982=>23194, +13983=>23195, +13984=>23196, +13985=>23197, +13986=>23198, +13987=>23199, +13988=>23200, +13989=>23201, +13990=>23202, +13991=>23203, +13992=>23204, +13993=>23205, +13994=>23206, +13995=>23207, +13996=>23208, +13997=>23209, +13998=>23210, +13999=>23211, +14000=>23212, +14001=>23213, +14002=>23214, +14003=>23215, +14004=>23216, +14005=>23217, +14006=>23218, +14007=>23219, +14008=>23220, +14009=>23221, +14010=>23222, +14011=>23223, +14012=>23224, +14013=>23225, +14014=>23226, +14015=>23227, +14016=>23228, +14017=>23229, +14018=>23230, +14019=>23231, +14020=>23232, +14021=>23233, +14022=>23234, +14023=>23235, +14024=>23236, +14025=>23237, +14026=>23238, +14027=>23239, +14028=>23240, +14029=>23241, +14030=>23242, +14031=>23243, +14032=>23244, +14033=>23245, +14034=>23246, +14035=>23247, +14036=>23248, +14037=>23249, +14038=>23250, +14039=>23251, +14040=>23252, +14041=>23253, +14042=>23254, +14043=>23255, +14044=>23256, +14045=>23257, +14046=>23258, +14047=>23259, +14048=>23260, +14049=>23261, +14050=>23262, +14051=>23263, +14052=>23264, +14053=>23265, +14054=>23266, +14055=>23267, +14056=>23268, +14057=>23269, +14058=>23270, +14059=>23271, +14060=>23272, +14061=>23273, +14062=>23274, +14063=>23275, +14064=>23276, +14065=>23277, +14066=>23278, +14067=>23279, +14068=>23280, +14069=>23281, +14070=>23282, +14071=>23283, +14072=>23284, +14073=>23285, +14074=>23286, +14075=>23287, +14076=>23288, +14077=>23289, +14078=>23290, +14079=>23291, +14080=>23292, +14081=>23293, +14082=>23294, +14083=>23295, +14084=>23296, +14085=>23297, +14086=>23298, +14087=>23299, +14088=>23300, +14089=>23301, +14090=>23302, +14091=>23303, +14092=>23304, +14093=>23305, +14094=>23306, +14095=>23307, +14096=>23308, +14097=>23309, +14098=>23310, +14099=>23311, +14100=>23312, +14101=>23313, +14102=>23314, +14103=>23315, +14104=>23316, +14105=>23317, +14106=>23318, +14107=>23319, +14108=>23320, +14109=>23321, +14110=>23322, +14111=>23323, +14112=>23324, +14113=>23325, +14114=>23326, +14115=>23327, +14116=>23328, +14117=>23329, +14118=>23330, +14119=>23331, +14120=>23332, +14121=>23333, +14122=>23334, +14123=>23335, +14124=>23336, +14125=>23337, +14126=>23338, +14127=>23339, +14128=>23340, +14129=>23341, +14130=>23342, +14131=>23343, +14132=>23344, +14133=>23345, +14134=>23346, +14135=>23347, +14136=>23348, +14137=>23349, +14138=>23350, +14139=>23351, +14140=>23352, +14141=>23353, +14142=>23354, +14143=>23355, +14144=>23356, +14145=>23357, +14146=>23358, +14147=>23359, +14148=>23360, +14149=>23361, +14150=>23362, +14151=>23363, +14152=>23364, +14153=>23365, +14154=>23366, +14155=>23367, +14156=>23368, +14157=>23369, +14158=>23370, +14159=>23371, +14160=>23372, +14161=>23373, +14162=>23374, +14163=>23375, +14164=>23376, +14165=>23377, +14166=>23378, +14167=>23379, +14168=>23380, +14169=>23381, +14170=>23382, +14171=>23383, +14172=>23384, +14173=>23385, +14174=>23386, +14175=>23387, +14176=>23388, +14177=>23389, +14178=>23390, +14179=>23391, +14180=>23392, +14181=>23393, +14182=>23394, +14183=>23395, +14184=>23396, +14185=>23397, +14186=>23398, +14187=>23399, +14188=>23400, +14189=>23401, +14190=>23402, +14191=>23403, +14192=>23404, +14193=>23405, +14194=>23406, +14195=>23407, +14196=>23408, +14197=>23409, +14198=>23410, +14199=>23411, +14200=>23412, +14201=>23413, +14202=>23414, +14203=>23415, +14204=>23416, +14205=>23417, +14206=>23418, +14207=>23419, +14208=>23420, +14209=>23421, +14210=>23422, +14211=>23423, +14212=>23424, +14213=>23425, +14214=>23426, +14215=>23427, +14216=>23428, +14217=>23429, +14218=>23430, +14219=>23431, +14220=>23432, +14221=>23433, +14222=>23434, +14223=>23435, +14224=>23436, +14225=>23437, +14226=>23438, +14227=>23439, +14228=>23440, +14229=>23441, +14230=>23442, +14231=>23443, +14232=>23444, +14233=>23445, +14234=>23446, +14235=>23447, +14236=>23448, +14237=>23449, +14238=>23450, +14239=>23451, +14240=>23452, +14241=>23453, +14242=>23454, +14243=>23455, +14244=>23456, +14245=>23457, +14246=>23458, +14247=>23459, +14248=>23460, +14249=>23461, +14250=>23462, +14251=>23463, +14252=>23464, +14253=>23465, +14254=>23466, +14255=>23467, +14256=>23468, +14257=>23469, +14258=>23470, +14259=>23471, +14260=>23472, +14261=>23473, +14262=>23474, +14263=>23475, +14264=>23476, +14265=>23477, +14266=>23478, +14267=>23479, +14268=>23480, +14269=>23481, +14270=>23482, +14271=>23483, +14272=>23484, +14273=>23485, +14274=>23486, +14275=>23487, +14276=>23488, +14277=>23489, +14278=>23490, +14279=>23491, +14280=>23492, +14281=>23493, +14282=>23494, +14283=>23495, +14284=>23496, +14285=>23497, +14286=>23498, +14287=>23499, +14288=>23500, +14289=>23501, +14290=>23502, +14291=>23503, +14292=>23504, +14293=>23505, +14294=>23506, +14295=>23507, +14296=>23508, +14297=>23509, +14298=>23510, +14299=>23511, +14300=>23512, +14301=>23513, +14302=>23514, +14303=>23515, +14304=>23516, +14305=>23517, +14306=>23518, +14307=>23519, +14308=>23520, +14309=>23521, +14310=>23522, +14311=>23523, +14312=>23524, +14313=>23525, +14314=>23526, +14315=>23527, +14316=>23528, +14317=>23529, +14318=>23530, +14319=>23531, +14320=>23532, +14321=>23533, +14322=>23534, +14323=>23535, +14324=>23536, +14325=>23537, +14326=>23538, +14327=>23539, +14328=>23540, +14329=>23541, +14330=>23542, +14331=>23543, +14332=>23544, +14333=>23545, +14334=>23546, +14335=>23547, +14336=>23548, +14337=>23549, +14338=>23550, +14339=>23551, +14340=>23552, +14341=>23553, +14342=>23554, +14343=>23555, +14344=>23556, +14345=>23557, +14346=>23558, +14347=>23559, +14348=>23560, +14349=>23561, +14350=>23562, +14351=>23563, +14352=>23564, +14353=>23565, +14354=>23566, +14355=>23567, +14356=>23568, +14357=>23569, +14358=>23570, +14359=>23571, +14360=>23572, +14361=>23573, +14362=>23574, +14363=>23575, +14364=>23576, +14365=>23577, +14366=>23578, +14367=>23579, +14368=>23580, +14369=>23581, +14370=>23582, +14371=>23583, +14372=>23584, +14373=>23585, +14374=>23586, +14375=>23587, +14376=>23588, +14377=>23589, +14378=>23590, +14379=>23591, +14380=>23592, +14381=>23593, +14382=>23594, +14383=>23595, +14384=>23596, +14385=>23597, +14386=>23598, +14387=>23599, +14388=>23600, +14389=>23601, +14390=>23602, +14391=>23603, +14392=>23604, +14393=>23605, +14394=>23606, +14395=>23607, +14396=>23608, +14397=>23609, +14398=>23610, +14399=>23611, +14400=>23612, +14401=>23613, +14402=>23614, +14403=>23615, +14404=>23616, +14405=>23617, +14406=>23618, +14407=>23619, +14408=>23620, +14409=>23621, +14410=>23622, +14411=>23623, +14412=>23624, +14413=>23625, +14414=>23626, +14415=>23627, +14416=>23628, +14417=>23629, +14418=>23630, +14419=>23631, +14420=>23632, +14421=>23633, +14422=>23634, +14423=>23635, +14424=>23636, +14425=>23637, +14426=>23638, +14427=>23639, +14428=>23640, +14429=>23641, +14430=>23642, +14431=>23643, +14432=>23644, +14433=>23645, +14434=>23646, +14435=>23647, +14436=>23648, +14437=>23649, +14438=>23650, +14439=>23651, +14440=>23652, +14441=>23653, +14442=>23654, +14443=>23655, +14444=>23656, +14445=>23657, +14446=>23658, +14447=>23659, +14448=>23660, +14449=>23661, +14450=>23662, +14451=>23663, +14452=>23664, +14453=>23665, +14454=>23666, +14455=>23667, +14456=>23668, +14457=>23669, +14458=>23670, +14459=>23671, +14460=>23672, +14461=>23673, +14462=>23674, +14463=>23675, +14464=>23676, +14465=>23677, +14466=>23678, +14467=>23679, +14468=>23680, +14469=>23681, +14470=>23682, +14471=>23683, +14472=>23684, +14473=>23685, +14474=>23686, +14475=>23687, +14476=>23688, +14477=>23689, +14478=>23690, +14479=>23691, +14480=>23692, +14481=>23693, +14482=>23694, +14483=>23695, +14484=>23696, +14485=>23697, +14486=>23698, +14487=>23699, +14488=>23700, +14489=>23701, +14490=>23702, +14491=>23703, +14492=>23704, +14493=>23705, +14494=>23706, +14495=>23707, +14496=>23708, +14497=>23709, +14498=>23710, +14499=>23711, +14500=>23712, +14501=>23713, +14502=>23714, +14503=>23715, +14504=>23716, +14505=>23717, +14506=>23718, +14507=>23719, +14508=>23720, +14509=>23721, +14510=>23722, +14511=>23723, +14512=>23724, +14513=>23725, +14514=>23726, +14515=>23727, +14516=>23728, +14517=>23729, +14518=>23730, +14519=>23731, +14520=>23732, +14521=>23733, +14522=>23734, +14523=>23735, +14524=>23736, +14525=>23737, +14526=>23738, +14527=>23739, +14528=>23740, +14529=>23741, +14530=>23742, +14531=>23743, +14532=>23744, +14533=>23745, +14534=>23746, +14535=>23747, +14536=>23748, +14537=>23749, +14538=>23750, +14539=>23751, +14540=>23752, +14541=>23753, +14542=>23754, +14543=>23755, +14544=>23756, +14545=>23757, +14546=>23758, +14547=>23759, +14548=>23760, +14549=>23761, +14550=>23762, +14551=>23763, +14552=>23764, +14553=>23765, +14554=>23766, +14555=>23767, +14556=>23768, +14557=>23769, +14558=>23770, +14559=>23771, +14560=>23772, +14561=>23773, +14562=>23774, +14563=>23775, +14564=>23776, +14565=>23777, +14566=>23778, +14567=>23779, +14568=>23780, +14569=>23781, +14570=>23782, +14571=>23783, +14572=>23784, +14573=>23785, +14574=>23786, +14575=>23787, +14576=>23788, +14577=>23789, +14578=>23790, +14579=>23791, +14580=>23792, +14581=>23793, +14582=>23794, +14583=>23795, +14584=>23796, +14585=>23797, +14586=>23798, +14587=>23799, +14588=>23800, +14589=>23801, +14590=>23802, +14591=>23803, +14592=>23804, +14593=>23805, +14594=>23806, +14595=>23807, +14596=>23808, +14597=>23809, +14598=>23810, +14599=>23811, +14600=>23812, +14601=>23813, +14602=>23814, +14603=>23815, +14604=>23816, +14605=>23817, +14606=>23818, +14607=>23819, +14608=>23820, +14609=>23821, +14610=>23822, +14611=>23823, +14612=>23824, +14613=>23825, +14614=>23826, +14615=>23827, +14617=>23828, +14618=>23829, +14619=>23830, +14620=>23831, +14621=>23832, +14622=>23833, +14623=>23834, +14624=>23835, +14625=>23836, +14626=>23837, +14627=>23838, +14628=>23839, +14629=>23840, +14630=>23841, +14631=>23842, +14632=>23843, +14633=>23844, +14634=>23845, +14635=>23846, +14636=>23847, +14637=>23848, +14638=>23849, +14639=>23850, +14640=>23851, +14641=>23852, +14642=>23853, +14643=>23854, +14644=>23855, +14645=>23856, +14646=>23857, +14647=>23858, +14648=>23859, +14649=>23860, +14650=>23861, +14651=>23862, +14652=>23863, +14653=>23864, +14654=>23865, +14655=>23866, +14656=>23867, +14657=>23868, +14658=>23869, +14659=>23870, +14660=>23871, +14661=>23872, +14662=>23873, +14663=>23874, +14664=>23875, +14665=>23876, +14666=>23877, +14667=>23878, +14668=>23879, +14669=>23880, +14670=>23881, +14671=>23882, +14672=>23883, +14673=>23884, +14674=>23885, +14675=>23886, +14676=>23887, +14677=>23888, +14678=>23889, +14679=>23890, +14680=>23891, +14681=>23892, +14682=>23893, +14683=>23894, +14684=>23895, +14685=>23896, +14686=>23897, +14687=>23898, +14688=>23899, +14689=>23900, +14690=>23901, +14691=>23902, +14692=>23903, +14693=>23904, +14694=>23905, +14695=>23906, +14696=>23907, +14697=>23908, +14698=>23909, +14699=>23910, +14700=>23911, +14701=>23912, +14703=>23913, +14704=>23914, +14705=>23915, +14706=>23916, +14707=>23917, +14708=>23918, +14709=>23919, +14710=>23920, +14711=>23921, +14712=>23922, +14713=>23923, +14714=>23924, +14715=>23925, +14716=>23926, +14717=>23927, +14718=>23928, +14719=>23929, +14720=>23930, +14721=>23931, +14722=>23932, +14723=>23933, +14724=>23934, +14725=>23935, +14726=>23936, +14727=>23937, +14728=>23938, +14729=>23939, +14730=>23940, +14731=>23941, +14732=>23942, +14733=>23943, +14734=>23944, +14735=>23945, +14736=>23946, +14737=>23947, +14738=>23948, +14739=>23949, +14740=>23950, +14741=>23951, +14742=>23952, +14743=>23953, +14744=>23954, +14745=>23955, +14746=>23956, +14747=>23957, +14748=>23958, +14749=>23959, +14750=>23960, +14751=>23961, +14752=>23962, +14753=>23963, +14754=>23964, +14755=>23965, +14756=>23966, +14757=>23967, +14758=>23968, +14759=>23969, +14760=>23970, +14761=>23971, +14762=>23972, +14763=>23973, +14764=>23974, +14765=>23975, +14766=>23976, +14767=>23977, +14768=>23978, +14769=>23979, +14770=>23980, +14771=>23981, +14772=>23982, +14773=>23983, +14774=>23984, +14775=>23985, +14776=>23986, +14777=>23987, +14778=>23988, +14779=>23989, +14780=>23990, +14781=>23991, +14782=>23992, +14783=>23993, +14784=>23994, +14785=>23995, +14786=>23996, +14787=>23997, +14788=>23998, +14789=>23999, +14790=>24000, +14791=>24001, +14792=>24002, +14793=>24003, +14794=>24004, +14795=>24005, +14796=>24006, +14797=>24007, +14798=>24008, +14801=>24009, +14802=>24010, +14803=>24011, +14804=>24012, +14805=>24013, +14806=>24014, +14807=>24015, +14808=>24016, +14809=>24017, +14810=>24018, +14811=>24019, +14812=>24020, +14813=>24021, +14814=>24022, +14816=>24023, +14817=>24024, +14818=>24025, +14819=>24026, +14820=>24027, +14821=>24028, +14822=>24029, +14823=>24030, +14824=>24031, +14825=>24032, +14826=>24033, +14827=>24034, +14828=>24035, +14829=>24036, +14830=>24037, +14831=>24038, +14832=>24039, +14833=>24040, +14834=>24041, +14835=>24042, +14836=>24043, +14837=>24044, +14838=>24045, +14839=>24046, +14840=>24047, +14841=>24048, +14842=>24049, +14843=>24050, +14844=>24051, +14845=>24052, +14846=>24053, +14847=>24054, +14848=>24055, +14849=>24056, +14850=>24057, +14851=>24058, +14852=>24059, +14853=>24060, +14854=>24061, +14855=>24062, +14856=>24063, +14857=>24064, +14858=>24065, +14859=>24066, +14860=>24067, +14861=>24068, +14862=>24069, +14863=>24070, +14864=>24071, +14865=>24072, +14866=>24073, +14867=>24074, +14868=>24075, +14869=>24076, +14870=>24077, +14871=>24078, +14872=>24079, +14873=>24080, +14874=>24081, +14875=>24082, +14876=>24083, +14877=>24084, +14878=>24085, +14879=>24086, +14880=>24087, +14881=>24088, +14882=>24089, +14883=>24090, +14884=>24091, +14885=>24092, +14886=>24093, +14887=>24094, +14888=>24095, +14889=>24096, +14890=>24097, +14891=>24098, +14892=>24099, +14893=>24100, +14894=>24101, +14895=>24102, +14896=>24103, +14897=>24104, +14898=>24105, +14899=>24106, +14900=>24107, +14901=>24108, +14902=>24109, +14903=>24110, +14904=>24111, +14905=>24112, +14906=>24113, +14907=>24114, +14908=>24115, +14909=>24116, +14910=>24117, +14911=>24118, +14912=>24119, +14913=>24120, +14914=>24121, +14915=>24122, +14916=>24123, +14917=>24124, +14918=>24125, +14919=>24126, +14920=>24127, +14921=>24128, +14922=>24129, +14923=>24130, +14924=>24131, +14925=>24132, +14926=>24133, +14927=>24134, +14928=>24135, +14929=>24136, +14930=>24137, +14931=>24138, +14932=>24139, +14933=>24140, +14934=>24141, +14935=>24142, +14936=>24143, +14937=>24144, +14938=>24145, +14939=>24146, +14940=>24147, +14941=>24148, +14942=>24149, +14943=>24150, +14944=>24151, +14945=>24152, +14946=>24153, +14947=>24154, +14948=>24155, +14949=>24156, +14950=>24157, +14951=>24158, +14952=>24159, +14953=>24160, +14954=>24161, +14955=>24162, +14956=>24163, +14957=>24164, +14958=>24165, +14959=>24166, +14960=>24167, +14961=>24168, +14962=>24169, +14964=>24170, +14965=>24171, +14966=>24172, +14967=>24173, +14968=>24174, +14969=>24175, +14970=>24176, +14971=>24177, +14972=>24178, +14973=>24179, +14974=>24180, +14975=>24181, +14976=>24182, +14977=>24183, +14978=>24184, +14979=>24185, +14980=>24186, +14981=>24187, +14982=>24188, +14983=>24189, +14984=>24190, +14985=>24191, +14986=>24192, +14987=>24193, +14988=>24194, +14989=>24195, +14990=>24196, +14991=>24197, +14992=>24198, +14993=>24199, +14994=>24200, +14995=>24201, +14996=>24202, +14997=>24203, +14998=>24204, +14999=>24205, +15000=>24206, +15001=>24207, +15002=>24208, +15003=>24209, +15004=>24210, +15005=>24211, +15006=>24212, +15007=>24213, +15008=>24214, +15009=>24215, +15010=>24216, +15011=>24217, +15012=>24218, +15013=>24219, +15014=>24220, +15015=>24221, +15016=>24222, +15017=>24223, +15018=>24224, +15019=>24225, +15020=>24226, +15021=>24227, +15022=>24228, +15023=>24229, +15024=>24230, +15025=>24231, +15026=>24232, +15027=>24233, +15028=>24234, +15029=>24235, +15030=>24236, +15031=>24237, +15032=>24238, +15033=>24239, +15034=>24240, +15035=>24241, +15036=>24242, +15037=>24243, +15038=>24244, +15039=>24245, +15040=>24246, +15041=>24247, +15042=>24248, +15043=>24249, +15044=>24250, +15045=>24251, +15046=>24252, +15047=>24253, +15048=>24254, +15049=>24255, +15050=>24256, +15051=>24257, +15052=>24258, +15053=>24259, +15054=>24260, +15055=>24261, +15056=>24262, +15057=>24263, +15058=>24264, +15059=>24265, +15060=>24266, +15061=>24267, +15062=>24268, +15063=>24269, +15064=>24270, +15065=>24271, +15066=>24272, +15067=>24273, +15068=>24274, +15069=>24275, +15070=>24276, +15071=>24277, +15072=>24278, +15073=>24279, +15074=>24280, +15075=>24281, +15076=>24282, +15077=>24283, +15078=>24284, +15079=>24285, +15080=>24286, +15081=>24287, +15082=>24288, +15083=>24289, +15084=>24290, +15085=>24291, +15086=>24292, +15087=>24293, +15088=>24294, +15089=>24295, +15090=>24296, +15091=>24297, +15092=>24298, +15093=>24299, +15094=>24300, +15095=>24301, +15096=>24302, +15097=>24303, +15098=>24304, +15099=>24305, +15100=>24306, +15101=>24307, +15102=>24308, +15103=>24309, +15104=>24310, +15105=>24311, +15106=>24312, +15107=>24313, +15108=>24314, +15109=>24315, +15110=>24316, +15111=>24317, +15112=>24318, +15113=>24319, +15114=>24320, +15115=>24321, +15116=>24322, +15117=>24323, +15118=>24324, +15119=>24325, +15120=>24326, +15121=>24327, +15122=>24328, +15123=>24329, +15124=>24330, +15125=>24331, +15126=>24332, +15127=>24333, +15128=>24334, +15129=>24335, +15130=>24336, +15131=>24337, +15132=>24338, +15133=>24339, +15134=>24340, +15135=>24341, +15136=>24342, +15137=>24343, +15138=>24344, +15139=>24345, +15140=>24346, +15141=>24347, +15142=>24348, +15143=>24349, +15144=>24350, +15145=>24351, +15146=>24352, +15147=>24353, +15148=>24354, +15149=>24355, +15150=>24356, +15151=>24357, +15152=>24358, +15153=>24359, +15154=>24360, +15155=>24361, +15156=>24362, +15157=>24363, +15158=>24364, +15159=>24365, +15160=>24366, +15161=>24367, +15162=>24368, +15163=>24369, +15164=>24370, +15165=>24371, +15166=>24372, +15167=>24373, +15168=>24374, +15169=>24375, +15170=>24376, +15171=>24377, +15172=>24378, +15173=>24379, +15174=>24380, +15175=>24381, +15176=>24382, +15177=>24383, +15178=>24384, +15179=>24385, +15180=>24386, +15181=>24387, +15183=>24388, +15184=>24389, +15185=>24390, +15186=>24391, +15187=>24392, +15188=>24393, +15189=>24394, +15190=>24395, +15191=>24396, +15192=>24397, +15193=>24398, +15194=>24399, +15195=>24400, +15196=>24401, +15197=>24402, +15198=>24403, +15199=>24404, +15200=>24405, +15201=>24406, +15202=>24407, +15203=>24408, +15204=>24409, +15205=>24410, +15206=>24411, +15207=>24412, +15208=>24413, +15209=>24414, +15210=>24415, +15211=>24416, +15212=>24417, +15213=>24418, +15214=>24419, +15215=>24420, +15216=>24421, +15217=>24422, +15218=>24423, +15219=>24424, +15220=>24425, +15221=>24426, +15222=>24427, +15223=>24428, +15224=>24429, +15225=>24430, +15226=>24431, +15227=>24432, +15228=>24433, +15229=>24434, +15230=>24435, +15231=>24436, +15232=>24437, +15233=>24438, +15234=>24439, +15235=>24440, +15236=>24441, +15237=>24442, +15238=>24443, +15239=>24444, +15240=>24445, +15241=>24446, +15242=>24447, +15243=>24448, +15244=>24449, +15245=>24450, +15246=>24451, +15247=>24452, +15248=>24453, +15249=>24454, +15250=>24455, +15251=>24456, +15252=>24457, +15253=>24458, +15254=>24459, +15255=>24460, +15256=>24461, +15257=>24462, +15258=>24463, +15259=>24464, +15260=>24465, +15261=>24466, +15262=>24467, +15263=>24468, +15264=>24469, +15265=>24470, +15266=>24471, +15267=>24472, +15268=>24473, +15269=>24474, +15270=>24475, +15271=>24476, +15272=>24477, +15273=>24478, +15274=>24479, +15275=>24480, +15276=>24481, +15277=>24482, +15278=>24483, +15279=>24484, +15280=>24485, +15281=>24486, +15282=>24487, +15283=>24488, +15284=>24489, +15285=>24490, +15286=>24491, +15287=>24492, +15288=>24493, +15289=>24494, +15290=>24495, +15291=>24496, +15292=>24497, +15293=>24498, +15294=>24499, +15295=>24500, +15296=>24501, +15297=>24502, +15298=>24503, +15299=>24504, +15300=>24505, +15301=>24506, +15302=>24507, +15303=>24508, +15304=>24509, +15305=>24510, +15306=>24511, +15307=>24512, +15308=>24513, +15309=>24514, +15310=>24515, +15311=>24516, +15312=>24517, +15313=>24518, +15314=>24519, +15315=>24520, +15316=>24521, +15317=>24522, +15318=>24523, +15319=>24524, +15320=>24525, +15321=>24526, +15322=>24527, +15323=>24528, +15324=>24529, +15325=>24530, +15326=>24531, +15327=>24532, +15328=>24533, +15329=>24534, +15330=>24535, +15331=>24536, +15332=>24537, +15333=>24538, +15334=>24539, +15335=>24540, +15336=>24541, +15337=>24542, +15338=>24543, +15339=>24544, +15340=>24545, +15341=>24546, +15342=>24547, +15343=>24548, +15344=>24549, +15345=>24550, +15346=>24551, +15347=>24552, +15348=>24553, +15349=>24554, +15350=>24555, +15351=>24556, +15352=>24557, +15353=>24558, +15354=>24559, +15355=>24560, +15356=>24561, +15357=>24562, +15358=>24563, +15359=>24564, +15360=>24565, +15361=>24566, +15362=>24567, +15363=>24568, +15364=>24569, +15365=>24570, +15366=>24571, +15367=>24572, +15368=>24573, +15369=>24574, +15370=>24575, +15371=>24576, +15372=>24577, +15373=>24578, +15374=>24579, +15375=>24580, +15376=>24581, +15377=>24582, +15378=>24583, +15379=>24584, +15380=>24585, +15381=>24586, +15382=>24587, +15383=>24588, +15384=>24589, +15385=>24590, +15386=>24591, +15387=>24592, +15388=>24593, +15389=>24594, +15390=>24595, +15391=>24596, +15392=>24597, +15393=>24598, +15394=>24599, +15395=>24600, +15396=>24601, +15397=>24602, +15398=>24603, +15399=>24604, +15400=>24605, +15401=>24606, +15402=>24607, +15403=>24608, +15404=>24609, +15405=>24610, +15406=>24611, +15407=>24612, +15408=>24613, +15409=>24614, +15410=>24615, +15411=>24616, +15412=>24617, +15413=>24618, +15414=>24619, +15415=>24620, +15416=>24621, +15417=>24622, +15418=>24623, +15419=>24624, +15420=>24625, +15421=>24626, +15422=>24627, +15423=>24628, +15424=>24629, +15425=>24630, +15426=>24631, +15427=>24632, +15428=>24633, +15429=>24634, +15430=>24635, +15431=>24636, +15432=>24637, +15433=>24638, +15434=>24639, +15435=>24640, +15436=>24641, +15437=>24642, +15438=>24643, +15439=>24644, +15440=>24645, +15441=>24646, +15442=>24647, +15443=>24648, +15444=>24649, +15445=>24650, +15446=>24651, +15447=>24652, +15448=>24653, +15449=>24654, +15450=>24655, +15451=>24656, +15452=>24657, +15453=>24658, +15454=>24659, +15455=>24660, +15456=>24661, +15457=>24662, +15458=>24663, +15459=>24664, +15460=>24665, +15461=>24666, +15462=>24667, +15463=>24668, +15464=>24669, +15465=>24670, +15466=>24671, +15467=>24672, +15468=>24673, +15469=>24674, +15471=>24675, +15472=>24676, +15473=>24677, +15474=>24678, +15475=>24679, +15476=>24680, +15477=>24681, +15478=>24682, +15479=>24683, +15480=>24684, +15481=>24685, +15482=>24686, +15483=>24687, +15484=>24688, +15485=>24689, +15486=>24690, +15487=>24691, +15488=>24692, +15489=>24693, +15490=>24694, +15491=>24695, +15492=>24696, +15493=>24697, +15494=>24698, +15495=>24699, +15496=>24700, +15497=>24701, +15498=>24702, +15499=>24703, +15500=>24704, +15501=>24705, +15502=>24706, +15503=>24707, +15504=>24708, +15505=>24709, +15506=>24710, +15507=>24711, +15508=>24712, +15509=>24713, +15510=>24714, +15511=>24715, +15512=>24716, +15513=>24717, +15514=>24718, +15515=>24719, +15516=>24720, +15517=>24721, +15518=>24722, +15519=>24723, +15520=>24724, +15521=>24725, +15522=>24726, +15523=>24727, +15524=>24728, +15525=>24729, +15526=>24730, +15527=>24731, +15528=>24732, +15529=>24733, +15530=>24734, +15531=>24735, +15532=>24736, +15533=>24737, +15534=>24738, +15535=>24739, +15536=>24740, +15537=>24741, +15538=>24742, +15539=>24743, +15540=>24744, +15541=>24745, +15542=>24746, +15543=>24747, +15544=>24748, +15545=>24749, +15546=>24750, +15547=>24751, +15548=>24752, +15549=>24753, +15550=>24754, +15551=>24755, +15552=>24756, +15553=>24757, +15554=>24758, +15555=>24759, +15556=>24760, +15557=>24761, +15558=>24762, +15559=>24763, +15560=>24764, +15561=>24765, +15562=>24766, +15563=>24767, +15564=>24768, +15565=>24769, +15566=>24770, +15567=>24771, +15568=>24772, +15569=>24773, +15570=>24774, +15571=>24775, +15572=>24776, +15573=>24777, +15574=>24778, +15575=>24779, +15576=>24780, +15577=>24781, +15578=>24782, +15579=>24783, +15580=>24784, +15581=>24785, +15582=>24786, +15583=>24787, +15585=>24788, +15586=>24789, +15587=>24790, +15588=>24791, +15589=>24792, +15590=>24793, +15591=>24794, +15592=>24795, +15593=>24796, +15594=>24797, +15595=>24798, +15596=>24799, +15597=>24800, +15598=>24801, +15599=>24802, +15600=>24803, +15601=>24804, +15602=>24805, +15603=>24806, +15604=>24807, +15605=>24808, +15606=>24809, +15607=>24810, +15608=>24811, +15609=>24812, +15610=>24813, +15611=>24814, +15612=>24815, +15613=>24816, +15614=>24817, +15615=>24818, +15616=>24819, +15617=>24820, +15618=>24821, +15619=>24822, +15620=>24823, +15621=>24824, +15622=>24825, +15623=>24826, +15624=>24827, +15625=>24828, +15626=>24829, +15627=>24830, +15628=>24831, +15629=>24832, +15630=>24833, +15631=>24834, +15632=>24835, +15633=>24836, +15634=>24837, +15635=>24838, +15636=>24839, +15637=>24840, +15638=>24841, +15639=>24842, +15640=>24843, +15641=>24844, +15642=>24845, +15643=>24846, +15644=>24847, +15645=>24848, +15646=>24849, +15647=>24850, +15648=>24851, +15649=>24852, +15650=>24853, +15651=>24854, +15652=>24855, +15653=>24856, +15654=>24857, +15655=>24858, +15656=>24859, +15657=>24860, +15658=>24861, +15659=>24862, +15660=>24863, +15661=>24864, +15662=>24865, +15663=>24866, +15664=>24867, +15665=>24868, +15666=>24869, +15667=>24870, +15668=>24871, +15669=>24872, +15670=>24873, +15671=>24874, +15672=>24875, +15673=>24876, +15674=>24877, +15675=>24878, +15676=>24879, +15677=>24880, +15678=>24881, +15679=>24882, +15680=>24883, +15681=>24884, +15682=>24885, +15683=>24886, +15684=>24887, +15685=>24888, +15686=>24889, +15687=>24890, +15688=>24891, +15689=>24892, +15690=>24893, +15691=>24894, +15692=>24895, +15693=>24896, +15694=>24897, +15695=>24898, +15696=>24899, +15697=>24900, +15698=>24901, +15699=>24902, +15700=>24903, +15701=>24904, +15702=>24905, +15703=>24906, +15704=>24907, +15705=>24908, +15706=>24909, +15707=>24910, +15708=>24911, +15709=>24912, +15710=>24913, +15711=>24914, +15712=>24915, +15713=>24916, +15714=>24917, +15715=>24918, +15716=>24919, +15717=>24920, +15718=>24921, +15719=>24922, +15720=>24923, +15721=>24924, +15722=>24925, +15723=>24926, +15724=>24927, +15725=>24928, +15726=>24929, +15727=>24930, +15728=>24931, +15729=>24932, +15730=>24933, +15731=>24934, +15732=>24935, +15733=>24936, +15734=>24937, +15735=>24938, +15736=>24939, +15737=>24940, +15738=>24941, +15739=>24942, +15740=>24943, +15741=>24944, +15742=>24945, +15743=>24946, +15744=>24947, +15745=>24948, +15746=>24949, +15747=>24950, +15748=>24951, +15749=>24952, +15750=>24953, +15751=>24954, +15752=>24955, +15753=>24956, +15754=>24957, +15755=>24958, +15756=>24959, +15757=>24960, +15758=>24961, +15759=>24962, +15760=>24963, +15761=>24964, +15762=>24965, +15763=>24966, +15764=>24967, +15765=>24968, +15766=>24969, +15767=>24970, +15768=>24971, +15769=>24972, +15770=>24973, +15771=>24974, +15772=>24975, +15773=>24976, +15774=>24977, +15775=>24978, +15776=>24979, +15777=>24980, +15778=>24981, +15779=>24982, +15780=>24983, +15781=>24984, +15782=>24985, +15783=>24986, +15784=>24987, +15785=>24988, +15786=>24989, +15787=>24990, +15788=>24991, +15789=>24992, +15790=>24993, +15791=>24994, +15792=>24995, +15793=>24996, +15794=>24997, +15795=>24998, +15796=>24999, +15797=>25000, +15798=>25001, +15799=>25002, +15800=>25003, +15801=>25004, +15802=>25005, +15803=>25006, +15804=>25007, +15805=>25008, +15806=>25009, +15807=>25010, +15808=>25011, +15809=>25012, +15810=>25013, +15811=>25014, +15812=>25015, +15813=>25016, +15814=>25017, +15815=>25018, +15816=>25019, +15817=>25020, +15818=>25021, +15819=>25022, +15820=>25023, +15821=>25024, +15822=>25025, +15823=>25026, +15824=>25027, +15825=>25028, +15826=>25029, +15827=>25030, +15828=>25031, +15829=>25032, +15830=>25033, +15831=>25034, +15832=>25035, +15833=>25036, +15834=>25037, +15835=>25038, +15836=>25039, +15837=>25040, +15838=>25041, +15839=>25042, +15840=>25043, +15841=>25044, +15842=>25045, +15843=>25046, +15844=>25047, +15845=>25048, +15846=>25049, +15847=>25050, +15848=>25051, +15849=>25052, +15850=>25053, +15851=>25054, +15852=>25055, +15853=>25056, +15854=>25057, +15855=>25058, +15856=>25059, +15857=>25060, +15858=>25061, +15859=>25062, +15860=>25063, +15861=>25064, +15862=>25065, +15863=>25066, +15864=>25067, +15865=>25068, +15866=>25069, +15867=>25070, +15868=>25071, +15869=>25072, +15870=>25073, +15871=>25074, +15872=>25075, +15873=>25076, +15874=>25077, +15875=>25078, +15876=>25079, +15877=>25080, +15878=>25081, +15879=>25082, +15880=>25083, +15881=>25084, +15882=>25085, +15883=>25086, +15884=>25087, +15885=>25088, +15886=>25089, +15887=>25090, +15888=>25091, +15889=>25092, +15890=>25093, +15891=>25094, +15892=>25095, +15893=>25096, +15894=>25097, +15895=>25098, +15896=>25099, +15897=>25100, +15898=>25101, +15899=>25102, +15900=>25103, +15901=>25104, +15902=>25105, +15903=>25106, +15904=>25107, +15905=>25108, +15906=>25109, +15907=>25110, +15908=>25111, +15909=>25112, +15910=>25113, +15911=>25114, +15912=>25115, +15913=>25116, +15914=>25117, +15915=>25118, +15916=>25119, +15917=>25120, +15918=>25121, +15919=>25122, +15920=>25123, +15921=>25124, +15922=>25125, +15923=>25126, +15924=>25127, +15925=>25128, +15926=>25129, +15927=>25130, +15928=>25131, +15929=>25132, +15930=>25133, +15931=>25134, +15932=>25135, +15933=>25136, +15934=>25137, +15935=>25138, +15936=>25139, +15937=>25140, +15938=>25141, +15939=>25142, +15940=>25143, +15941=>25144, +15942=>25145, +15943=>25146, +15944=>25147, +15945=>25148, +15946=>25149, +15947=>25150, +15948=>25151, +15949=>25152, +15950=>25153, +15951=>25154, +15952=>25155, +15953=>25156, +15954=>25157, +15955=>25158, +15956=>25159, +15957=>25160, +15958=>25161, +15959=>25162, +15960=>25163, +15961=>25164, +15962=>25165, +15963=>25166, +15964=>25167, +15965=>25168, +15966=>25169, +15967=>25170, +15968=>25171, +15969=>25172, +15970=>25173, +15971=>25174, +15972=>25175, +15973=>25176, +15974=>25177, +15975=>25178, +15976=>25179, +15977=>25180, +15978=>25181, +15979=>25182, +15980=>25183, +15981=>25184, +15982=>25185, +15983=>25186, +15984=>25187, +15985=>25188, +15986=>25189, +15987=>25190, +15988=>25191, +15989=>25192, +15990=>25193, +15991=>25194, +15992=>25195, +15993=>25196, +15994=>25197, +15995=>25198, +15996=>25199, +15997=>25200, +15998=>25201, +15999=>25202, +16000=>25203, +16001=>25204, +16002=>25205, +16003=>25206, +16004=>25207, +16005=>25208, +16006=>25209, +16007=>25210, +16008=>25211, +16009=>25212, +16010=>25213, +16011=>25214, +16012=>25215, +16013=>25216, +16014=>25217, +16015=>25218, +16016=>25219, +16017=>25220, +16018=>25221, +16019=>25222, +16020=>25223, +16021=>25224, +16022=>25225, +16023=>25226, +16024=>25227, +16025=>25228, +16026=>25229, +16027=>25230, +16028=>25231, +16029=>25232, +16030=>25233, +16031=>25234, +16032=>25235, +16033=>25236, +16034=>25237, +16035=>25238, +16036=>25239, +16037=>25240, +16038=>25241, +16039=>25242, +16040=>25243, +16041=>25244, +16042=>25245, +16043=>25246, +16044=>25247, +16045=>25248, +16046=>25249, +16047=>25250, +16048=>25251, +16049=>25252, +16050=>25253, +16051=>25254, +16052=>25255, +16053=>25256, +16054=>25257, +16055=>25258, +16056=>25259, +16057=>25260, +16058=>25261, +16059=>25262, +16060=>25263, +16061=>25264, +16062=>25265, +16063=>25266, +16064=>25267, +16065=>25268, +16066=>25269, +16067=>25270, +16068=>25271, +16069=>25272, +16070=>25273, +16071=>25274, +16072=>25275, +16073=>25276, +16074=>25277, +16075=>25278, +16076=>25279, +16077=>25280, +16078=>25281, +16079=>25282, +16080=>25283, +16081=>25284, +16082=>25285, +16083=>25286, +16084=>25287, +16085=>25288, +16086=>25289, +16087=>25290, +16088=>25291, +16089=>25292, +16090=>25293, +16091=>25294, +16092=>25295, +16093=>25296, +16094=>25297, +16095=>25298, +16096=>25299, +16097=>25300, +16098=>25301, +16099=>25302, +16100=>25303, +16101=>25304, +16102=>25305, +16103=>25306, +16104=>25307, +16105=>25308, +16106=>25309, +16107=>25310, +16108=>25311, +16109=>25312, +16110=>25313, +16111=>25314, +16112=>25315, +16113=>25316, +16114=>25317, +16115=>25318, +16116=>25319, +16117=>25320, +16118=>25321, +16119=>25322, +16120=>25323, +16121=>25324, +16122=>25325, +16123=>25326, +16124=>25327, +16125=>25328, +16126=>25329, +16127=>25330, +16128=>25331, +16129=>25332, +16130=>25333, +16131=>25334, +16132=>25335, +16133=>25336, +16134=>25337, +16135=>25338, +16136=>25339, +16137=>25340, +16138=>25341, +16139=>25342, +16140=>25343, +16141=>25344, +16142=>25345, +16143=>25346, +16144=>25347, +16145=>25348, +16146=>25349, +16147=>25350, +16148=>25351, +16149=>25352, +16150=>25353, +16151=>25354, +16152=>25355, +16153=>25356, +16154=>25357, +16155=>25358, +16156=>25359, +16157=>25360, +16158=>25361, +16159=>25362, +16160=>25363, +16161=>25364, +16162=>25365, +16163=>25366, +16164=>25367, +16165=>25368, +16166=>25369, +16167=>25370, +16168=>25371, +16169=>25372, +16170=>25373, +16171=>25374, +16172=>25375, +16173=>25376, +16174=>25377, +16175=>25378, +16176=>25379, +16177=>25380, +16178=>25381, +16179=>25382, +16180=>25383, +16181=>25384, +16182=>25385, +16183=>25386, +16184=>25387, +16185=>25388, +16186=>25389, +16187=>25390, +16188=>25391, +16189=>25392, +16190=>25393, +16191=>25394, +16192=>25395, +16193=>25396, +16194=>25397, +16195=>25398, +16196=>25399, +16197=>25400, +16198=>25401, +16199=>25402, +16200=>25403, +16201=>25404, +16202=>25405, +16203=>25406, +16204=>25407, +16205=>25408, +16206=>25409, +16207=>25410, +16208=>25411, +16209=>25412, +16210=>25413, +16211=>25414, +16212=>25415, +16213=>25416, +16214=>25417, +16215=>25418, +16216=>25419, +16217=>25420, +16218=>25421, +16219=>25422, +16220=>25423, +16221=>25424, +16222=>25425, +16223=>25426, +16224=>25427, +16225=>25428, +16226=>25429, +16227=>25430, +16228=>25431, +16229=>25432, +16230=>25433, +16231=>25434, +16232=>25435, +16233=>25436, +16234=>25437, +16235=>25438, +16236=>25439, +16237=>25440, +16238=>25441, +16239=>25442, +16240=>25443, +16241=>25444, +16242=>25445, +16243=>25446, +16244=>25447, +16245=>25448, +16246=>25449, +16247=>25450, +16248=>25451, +16249=>25452, +16250=>25453, +16251=>25454, +16252=>25455, +16253=>25456, +16254=>25457, +16255=>25458, +16256=>25459, +16257=>25460, +16258=>25461, +16259=>25462, +16260=>25463, +16261=>25464, +16262=>25465, +16263=>25466, +16264=>25467, +16265=>25468, +16266=>25469, +16267=>25470, +16268=>25471, +16269=>25472, +16270=>25473, +16271=>25474, +16272=>25475, +16273=>25476, +16274=>25477, +16275=>25478, +16276=>25479, +16277=>25480, +16278=>25481, +16279=>25482, +16280=>25483, +16281=>25484, +16282=>25485, +16283=>25486, +16284=>25487, +16285=>25488, +16286=>25489, +16287=>25490, +16288=>25491, +16289=>25492, +16290=>25493, +16291=>25494, +16292=>25495, +16293=>25496, +16294=>25497, +16295=>25498, +16296=>25499, +16297=>25500, +16298=>25501, +16299=>25502, +16300=>25503, +16301=>25504, +16302=>25505, +16303=>25506, +16304=>25507, +16305=>25508, +16306=>25509, +16307=>25510, +16308=>25511, +16309=>25512, +16310=>25513, +16311=>25514, +16312=>25515, +16313=>25516, +16314=>25517, +16315=>25518, +16316=>25519, +16317=>25520, +16318=>25521, +16319=>25522, +16320=>25523, +16321=>25524, +16322=>25525, +16323=>25526, +16324=>25527, +16325=>25528, +16326=>25529, +16327=>25530, +16328=>25531, +16329=>25532, +16330=>25533, +16331=>25534, +16332=>25535, +16333=>25536, +16334=>25537, +16335=>25538, +16336=>25539, +16337=>25540, +16338=>25541, +16339=>25542, +16340=>25543, +16341=>25544, +16342=>25545, +16343=>25546, +16344=>25547, +16345=>25548, +16346=>25549, +16347=>25550, +16348=>25551, +16349=>25552, +16350=>25553, +16351=>25554, +16352=>25555, +16353=>25556, +16354=>25557, +16355=>25558, +16356=>25559, +16357=>25560, +16358=>25561, +16359=>25562, +16360=>25563, +16361=>25564, +16362=>25565, +16363=>25566, +16364=>25567, +16365=>25568, +16366=>25569, +16367=>25570, +16368=>25571, +16369=>25572, +16370=>25573, +16371=>25574, +16372=>25575, +16373=>25576, +16374=>25577, +16375=>25578, +16376=>25579, +16377=>25580, +16378=>25581, +16379=>25582, +16380=>25583, +16381=>25584, +16382=>25585, +16383=>25586, +16384=>25587, +16385=>25588, +16386=>25589, +16387=>25590, +16388=>25591, +16389=>25592, +16390=>25593, +16391=>25594, +16392=>25595, +16393=>25596, +16394=>25597, +16395=>25598, +16396=>25599, +16397=>25600, +16398=>25601, +16399=>25602, +16400=>25603, +16401=>25604, +16402=>25605, +16403=>25606, +16404=>25607, +16405=>25608, +16406=>25609, +16407=>25610, +16408=>25611, +16409=>25612, +16410=>25613, +16411=>25614, +16412=>25615, +16413=>25616, +16414=>25617, +16415=>25618, +16416=>25619, +16417=>25620, +16418=>25621, +16419=>25622, +16420=>25623, +16421=>25624, +16422=>25625, +16423=>25626, +16424=>25627, +16425=>25628, +16426=>25629, +16427=>25630, +16428=>25631, +16429=>25632, +16430=>25633, +16431=>25634, +16432=>25635, +16433=>25636, +16434=>25637, +16435=>25638, +16436=>25639, +16437=>25640, +16438=>25641, +16439=>25642, +16440=>25643, +16441=>25644, +16442=>25645, +16443=>25646, +16444=>25647, +16445=>25648, +16446=>25649, +16447=>25650, +16448=>25651, +16449=>25652, +16450=>25653, +16451=>25654, +16452=>25655, +16453=>25656, +16454=>25657, +16455=>25658, +16456=>25659, +16457=>25660, +16458=>25661, +16459=>25662, +16460=>25663, +16461=>25664, +16462=>25665, +16463=>25666, +16464=>25667, +16465=>25668, +16466=>25669, +16467=>25670, +16468=>25671, +16469=>25672, +16471=>25673, +16472=>25674, +16473=>25675, +16474=>25676, +16475=>25677, +16476=>25678, +16477=>25679, +16478=>25680, +16479=>25681, +16480=>25682, +16481=>25683, +16482=>25684, +16483=>25685, +16484=>25686, +16485=>25687, +16486=>25688, +16487=>25689, +16488=>25690, +16489=>25691, +16490=>25692, +16491=>25693, +16492=>25694, +16493=>25695, +16494=>25696, +16495=>25697, +16496=>25698, +16497=>25699, +16498=>25700, +16499=>25701, +16500=>25702, +16501=>25703, +16502=>25704, +16503=>25705, +16504=>25706, +16505=>25707, +16506=>25708, +16507=>25709, +16508=>25710, +16509=>25711, +16510=>25712, +16511=>25713, +16512=>25714, +16513=>25715, +16514=>25716, +16515=>25717, +16516=>25718, +16517=>25719, +16518=>25720, +16519=>25721, +16520=>25722, +16521=>25723, +16522=>25724, +16523=>25725, +16524=>25726, +16525=>25727, +16526=>25728, +16527=>25729, +16528=>25730, +16529=>25731, +16530=>25732, +16531=>25733, +16532=>25734, +16533=>25735, +16534=>25736, +16535=>25737, +16536=>25738, +16537=>25739, +16538=>25740, +16539=>25741, +16540=>25742, +16541=>25743, +16542=>25744, +16543=>25745, +16544=>25746, +16545=>25747, +16546=>25748, +16547=>25749, +16548=>25750, +16549=>25751, +16550=>25752, +16551=>25753, +16552=>25754, +16553=>25755, +16554=>25756, +16555=>25757, +16556=>25758, +16557=>25759, +16558=>25760, +16559=>25761, +16560=>25762, +16561=>25763, +16562=>25764, +16563=>25765, +16564=>25766, +16565=>25767, +16566=>25768, +16567=>25769, +16568=>25770, +16569=>25771, +16570=>25772, +16571=>25773, +16572=>25774, +16573=>25775, +16574=>25776, +16575=>25777, +16576=>25778, +16577=>25779, +16578=>25780, +16579=>25781, +16580=>25782, +16581=>25783, +16582=>25784, +16583=>25785, +16584=>25786, +16585=>25787, +16586=>25788, +16587=>25789, +16588=>25790, +16589=>25791, +16590=>25792, +16591=>25793, +16592=>25794, +16593=>25795, +16594=>25796, +16595=>25797, +16596=>25798, +16597=>25799, +16598=>25800, +16599=>25801, +16600=>25802, +16601=>25803, +16602=>25804, +16603=>25805, +16604=>25806, +16605=>25807, +16606=>25808, +16607=>25809, +16608=>25810, +16609=>25811, +16610=>25812, +16611=>25813, +16612=>25814, +16613=>25815, +16614=>25816, +16615=>25817, +16616=>25818, +16617=>25819, +16618=>25820, +16619=>25821, +16620=>25822, +16621=>25823, +16622=>25824, +16623=>25825, +16624=>25826, +16625=>25827, +16626=>25828, +16627=>25829, +16628=>25830, +16629=>25831, +16630=>25832, +16631=>25833, +16632=>25834, +16633=>25835, +16634=>25836, +16635=>25837, +16636=>25838, +16637=>25839, +16638=>25840, +16639=>25841, +16640=>25842, +16641=>25843, +16642=>25844, +16643=>25845, +16644=>25846, +16645=>25847, +16646=>25848, +16647=>25849, +16648=>25850, +16649=>25851, +16650=>25852, +16651=>25853, +16652=>25854, +16653=>25855, +16654=>25856, +16655=>25857, +16656=>25858, +16657=>25859, +16658=>25860, +16659=>25861, +16660=>25862, +16661=>25863, +16662=>25864, +16663=>25865, +16664=>25866, +16665=>25867, +16666=>25868, +16667=>25869, +16668=>25870, +16669=>25871, +16670=>25872, +16671=>25873, +16672=>25874, +16673=>25875, +16674=>25876, +16675=>25877, +16676=>25878, +16677=>25879, +16678=>25880, +16679=>25881, +16680=>25882, +16681=>25883, +16682=>25884, +16683=>25885, +16684=>25886, +16685=>25887, +16686=>25888, +16687=>25889, +16688=>25890, +16689=>25891, +16690=>25892, +16691=>25893, +16692=>25894, +16693=>25895, +16694=>25896, +16695=>25897, +16696=>25898, +16697=>25899, +16698=>25900, +16699=>25901, +16700=>25902, +16701=>25903, +16702=>25904, +16703=>25905, +16704=>25906, +16705=>25907, +16706=>25908, +16707=>25909, +16708=>25910, +16709=>25911, +16710=>25912, +16711=>25913, +16712=>25914, +16713=>25915, +16714=>25916, +16715=>25917, +16716=>25918, +16717=>25919, +16718=>25920, +16719=>25921, +16720=>25922, +16721=>25923, +16722=>25924, +16723=>25925, +16724=>25926, +16725=>25927, +16726=>25928, +16727=>25929, +16728=>25930, +16729=>25931, +16730=>25932, +16731=>25933, +16732=>25934, +16733=>25935, +16734=>25936, +16736=>25937, +16737=>25938, +16738=>25939, +16739=>25940, +16740=>25941, +16741=>25942, +16742=>25943, +16743=>25944, +16744=>25945, +16745=>25946, +16746=>25947, +16747=>25948, +16748=>25949, +16749=>25950, +16750=>25951, +16751=>25952, +16752=>25953, +16753=>25954, +16754=>25955, +16755=>25956, +16756=>25957, +16757=>25958, +16758=>25959, +16759=>25960, +16760=>25961, +16761=>25962, +16762=>25963, +16763=>25964, +16764=>25965, +16765=>25966, +16766=>25967, +16767=>25968, +16768=>25969, +16769=>25970, +16770=>25971, +16771=>25972, +16772=>25973, +16773=>25974, +16774=>25975, +16775=>25976, +16776=>25977, +16777=>25978, +16778=>25979, +16779=>25980, +16780=>25981, +16781=>25982, +16782=>25983, +16783=>25984, +16784=>25985, +16785=>25986, +16786=>25987, +16787=>25988, +16788=>25989, +16789=>25990, +16790=>25991, +16791=>25992, +16792=>25993, +16793=>25994, +16794=>25995, +16795=>25996, +16796=>25997, +16797=>25998, +16798=>25999, +16799=>26000, +16800=>26001, +16801=>26002, +16802=>26003, +16803=>26004, +16804=>26005, +16805=>26006, +16806=>26007, +16807=>26008, +16808=>26009, +16809=>26010, +16810=>26011, +16811=>26012, +16812=>26013, +16813=>26014, +16814=>26015, +16815=>26016, +16816=>26017, +16817=>26018, +16818=>26019, +16819=>26020, +16820=>26021, +16821=>26022, +16822=>26023, +16823=>26024, +16824=>26025, +16825=>26026, +16826=>26027, +16827=>26028, +16828=>26029, +16829=>26030, +16830=>26031, +16831=>26032, +16832=>26033, +16833=>26034, +16834=>26035, +16835=>26036, +16836=>26037, +16837=>26038, +16838=>26039, +16839=>26040, +16840=>26041, +16841=>26042, +16842=>26043, +16843=>26044, +16844=>26045, +16845=>26046, +16846=>26047, +16847=>26048, +16848=>26049, +16849=>26050, +16850=>26051, +16851=>26052, +16852=>26053, +16853=>26054, +16854=>26055, +16855=>26056, +16856=>26057, +16857=>26058, +16858=>26059, +16859=>26060, +16860=>26061, +16861=>26062, +16862=>26063, +16863=>26064, +16864=>26065, +16865=>26066, +16866=>26067, +16867=>26068, +16868=>26069, +16869=>26070, +16870=>26071, +16871=>26072, +16872=>26073, +16873=>26074, +16874=>26075, +16875=>26076, +16876=>26077, +16877=>26078, +16878=>26079, +16879=>26080, +16880=>26081, +16881=>26082, +16882=>26083, +16883=>26084, +16884=>26085, +16885=>26086, +16886=>26087, +16887=>26088, +16888=>26089, +16889=>26090, +16890=>26091, +16891=>26092, +16892=>26093, +16893=>26094, +16894=>26095, +16895=>26096, +16896=>26097, +16897=>26098, +16898=>26099, +16899=>26100, +16900=>26101, +16901=>26102, +16902=>26103, +16903=>26104, +16904=>26105, +16905=>26106, +16906=>26107, +16907=>26108, +16908=>26109, +16909=>26110, +16910=>26111, +16911=>26112, +16912=>26113, +16913=>26114, +16914=>26115, +16915=>26116, +16916=>26117, +16917=>26118, +16918=>26119, +16919=>26120, +16920=>26121, +16921=>26122, +16922=>26123, +16923=>26124, +16924=>26125, +16925=>26126, +16926=>26127, +16927=>26128, +16928=>26129, +16929=>26130, +16930=>26131, +16931=>26132, +16932=>26133, +16933=>26134, +16934=>26135, +16935=>26136, +16936=>26137, +16937=>26138, +16938=>26139, +16939=>26140, +16940=>26141, +16941=>26142, +16942=>26143, +16943=>26144, +16944=>26145, +16945=>26146, +16946=>26147, +16947=>26148, +16948=>26149, +16949=>26150, +16950=>26151, +16951=>26152, +16952=>26153, +16953=>26154, +16954=>26155, +16955=>26156, +16956=>26157, +16957=>26158, +16958=>26159, +16959=>26160, +16960=>26161, +16961=>26162, +16962=>26163, +16963=>26164, +16964=>26165, +16965=>26166, +16966=>26167, +16967=>26168, +16968=>26169, +16969=>26170, +16970=>26171, +16971=>26172, +16972=>26173, +16973=>26174, +16974=>26175, +16975=>26176, +16976=>26177, +16977=>26178, +16978=>26179, +16979=>26180, +16980=>26181, +16981=>26182, +16982=>26183, +16983=>26184, +16984=>26185, +16985=>26186, +16986=>26187, +16987=>26188, +16988=>26189, +16989=>26190, +16990=>26191, +16991=>26192, +16992=>26193, +16993=>26194, +16994=>26195, +16995=>26196, +16996=>26197, +16997=>26198, +16998=>26199, +16999=>26200, +17000=>26201, +17001=>26202, +17002=>26203, +17003=>26204, +17004=>26205, +17005=>26206, +17006=>26207, +17007=>26208, +17008=>26209, +17009=>26210, +17010=>26211, +17011=>26212, +17012=>26213, +17013=>26214, +17014=>26215, +17015=>26216, +17016=>26217, +17017=>26218, +17018=>26219, +17019=>26220, +17020=>26221, +17021=>26222, +17022=>26223, +17023=>26224, +17024=>26225, +17025=>26226, +17026=>26227, +17027=>26228, +17028=>26229, +17029=>26230, +17030=>26231, +17031=>26232, +17032=>26233, +17033=>26234, +17034=>26235, +17035=>26236, +17036=>26237, +17037=>26238, +17038=>26239, +17039=>26240, +17040=>26241, +17041=>26242, +17042=>26243, +17043=>26244, +17044=>26245, +17045=>26246, +17046=>26247, +17047=>26248, +17048=>26249, +17049=>26250, +17050=>26251, +17051=>26252, +17052=>26253, +17053=>26254, +17054=>26255, +17055=>26256, +17056=>26257, +17057=>26258, +17058=>26259, +17059=>26260, +17060=>26261, +17061=>26262, +17062=>26263, +17063=>26264, +17064=>26265, +17065=>26266, +17066=>26267, +17067=>26268, +17068=>26269, +17069=>26270, +17070=>26271, +17071=>26272, +17072=>26273, +17073=>26274, +17074=>26275, +17075=>26276, +17076=>26277, +17077=>26278, +17078=>26279, +17079=>26280, +17080=>26281, +17081=>26282, +17082=>26283, +17083=>26284, +17084=>26285, +17085=>26286, +17086=>26287, +17087=>26288, +17088=>26289, +17089=>26290, +17090=>26291, +17091=>26292, +17092=>26293, +17093=>26294, +17094=>26295, +17095=>26296, +17096=>26297, +17097=>26298, +17098=>26299, +17099=>26300, +17100=>26301, +17101=>26302, +17102=>26303, +17103=>26304, +17104=>26305, +17105=>26306, +17106=>26307, +17107=>26308, +17108=>26309, +17109=>26310, +17110=>26311, +17111=>26312, +17112=>26313, +17113=>26314, +17114=>26315, +17115=>26316, +17116=>26317, +17117=>26318, +17118=>26319, +17119=>26320, +17120=>26321, +17121=>26322, +17122=>26323, +17123=>26324, +17124=>26325, +17125=>26326, +17126=>26327, +17127=>26328, +17128=>26329, +17129=>26330, +17130=>26331, +17131=>26332, +17132=>26333, +17133=>26334, +17134=>26335, +17135=>26336, +17136=>26337, +17137=>26338, +17138=>26339, +17139=>26340, +17140=>26341, +17141=>26342, +17142=>26343, +17143=>26344, +17144=>26345, +17145=>26346, +17146=>26347, +17147=>26348, +17148=>26349, +17149=>26350, +17150=>26351, +17151=>26352, +17152=>26353, +17153=>26354, +17154=>26355, +17155=>26356, +17156=>26357, +17157=>26358, +17158=>26359, +17159=>26360, +17160=>26361, +17161=>26362, +17162=>26363, +17163=>26364, +17164=>26365, +17165=>26366, +17166=>26367, +17167=>26368, +17168=>26369, +17169=>26370, +17170=>26371, +17171=>26372, +17172=>26373, +17173=>26374, +17174=>26375, +17175=>26376, +17176=>26377, +17177=>26378, +17178=>26379, +17179=>26380, +17180=>26381, +17181=>26382, +17182=>26383, +17183=>26384, +17184=>26385, +17185=>26386, +17186=>26387, +17187=>26388, +17188=>26389, +17189=>26390, +17190=>26391, +17191=>26392, +17192=>26393, +17193=>26394, +17194=>26395, +17195=>26396, +17196=>26397, +17197=>26398, +17198=>26399, +17199=>26400, +17200=>26401, +17201=>26402, +17202=>26403, +17203=>26404, +17204=>26405, +17205=>26406, +17206=>26407, +17208=>26408, +17209=>26409, +17210=>26410, +17211=>26411, +17212=>26412, +17213=>26413, +17214=>26414, +17215=>26415, +17216=>26416, +17217=>26417, +17218=>26418, +17219=>26419, +17220=>26420, +17221=>26421, +17222=>26422, +17223=>26423, +17224=>26424, +17225=>26425, +17226=>26426, +17227=>26427, +17228=>26428, +17229=>26429, +17230=>26430, +17231=>26431, +17232=>26432, +17233=>26433, +17234=>26434, +17235=>26435, +17236=>26436, +17237=>26437, +17238=>26438, +17239=>26439, +17240=>26440, +17241=>26441, +17242=>26442, +17243=>26443, +17244=>26444, +17245=>26445, +17246=>26446, +17247=>26447, +17248=>26448, +17249=>26449, +17250=>26450, +17251=>26451, +17252=>26452, +17253=>26453, +17254=>26454, +17255=>26455, +17256=>26456, +17257=>26457, +17258=>26458, +17259=>26459, +17260=>26460, +17261=>26461, +17262=>26462, +17263=>26463, +17264=>26464, +17265=>26465, +17266=>26466, +17267=>26467, +17268=>26468, +17269=>26469, +17270=>26470, +17271=>26471, +17272=>26472, +17273=>26473, +17274=>26474, +17275=>26475, +17276=>26476, +17277=>26477, +17278=>26478, +17279=>26479, +17280=>26480, +17281=>26481, +17282=>26482, +17283=>26483, +17284=>26484, +17285=>26485, +17286=>26486, +17287=>26487, +17288=>26488, +17289=>26489, +17290=>26490, +17291=>26491, +17292=>26492, +17293=>26493, +17294=>26494, +17295=>26495, +17296=>26496, +17297=>26497, +17298=>26498, +17299=>26499, +17300=>26500, +17301=>26501, +17302=>26502, +17303=>26503, +17304=>26504, +17305=>26505, +17306=>26506, +17307=>26507, +17308=>26508, +17309=>26509, +17310=>26510, +17311=>26511, +17312=>26512, +17313=>26513, +17314=>26514, +17315=>26515, +17316=>26516, +17317=>26517, +17318=>26518, +17319=>26519, +17320=>26520, +17321=>26521, +17322=>26522, +17323=>26523, +17325=>26524, +17326=>26525, +17327=>26526, +17328=>26527, +17330=>26528, +17331=>26529, +17332=>26530, +17333=>26531, +17334=>26532, +17335=>26533, +17336=>26534, +17337=>26535, +17338=>26536, +17339=>26537, +17340=>26538, +17341=>26539, +17342=>26540, +17343=>26541, +17344=>26542, +17345=>26543, +17346=>26544, +17347=>26545, +17348=>26546, +17349=>26547, +17350=>26548, +17351=>26549, +17352=>26550, +17353=>26551, +17354=>26552, +17355=>26553, +17356=>26554, +17357=>26555, +17358=>26556, +17359=>26557, +17360=>26558, +17361=>26559, +17362=>26560, +17363=>26561, +17364=>26562, +17365=>26563, +17366=>26564, +17367=>26565, +17368=>26566, +17369=>26567, +17370=>26568, +17371=>26569, +17372=>26570, +17374=>26571, +17375=>26572, +17376=>26573, +17377=>26574, +17378=>26575, +17379=>26576, +17380=>26577, +17381=>26578, +17382=>26579, +17383=>26580, +17384=>26581, +17385=>26582, +17386=>26583, +17387=>26584, +17388=>26585, +17389=>26586, +17390=>26587, +17391=>26588, +17392=>26589, +17393=>26590, +17394=>26591, +17395=>26592, +17396=>26593, +17397=>26594, +17398=>26595, +17399=>26596, +17400=>26597, +17401=>26598, +17402=>26599, +17403=>26600, +17404=>26601, +17405=>26602, +17406=>26603, +17407=>26604, +17408=>26605, +17409=>26606, +17410=>26607, +17411=>26608, +17412=>26609, +17413=>26610, +17414=>26611, +17415=>26612, +17416=>26613, +17417=>26614, +17418=>26615, +17419=>26616, +17420=>26617, +17421=>26618, +17422=>26619, +17423=>26620, +17424=>26621, +17425=>26622, +17426=>26623, +17427=>26624, +17428=>26625, +17429=>26626, +17430=>26627, +17431=>26628, +17432=>26629, +17433=>26630, +17434=>26631, +17435=>26632, +17436=>26633, +17437=>26634, +17438=>26635, +17439=>26636, +17440=>26637, +17441=>26638, +17442=>26639, +17443=>26640, +17444=>26641, +17445=>26642, +17446=>26643, +17447=>26644, +17448=>26645, +17449=>26646, +17450=>26647, +17451=>26648, +17452=>26649, +17453=>26650, +17454=>26651, +17455=>26652, +17456=>26653, +17457=>26654, +17458=>26655, +17459=>26656, +17460=>26657, +17461=>26658, +17462=>26659, +17463=>26660, +17464=>26661, +17465=>26662, +17466=>26663, +17467=>26664, +17468=>26665, +17469=>26666, +17470=>26667, +17471=>26668, +17472=>26669, +17473=>26670, +17474=>26671, +17475=>26672, +17476=>26673, +17477=>26674, +17478=>26675, +17479=>26676, +17480=>26677, +17481=>26678, +17482=>26679, +17483=>26680, +17484=>26681, +17485=>26682, +17486=>26683, +17487=>26684, +17488=>26685, +17489=>26686, +17490=>26687, +17491=>26688, +17492=>26689, +17493=>26690, +17494=>26691, +17495=>26692, +17496=>26693, +17497=>26694, +17498=>26695, +17499=>26696, +17500=>26697, +17501=>26698, +17502=>26699, +17503=>26700, +17504=>26701, +17505=>26702, +17506=>26703, +17507=>26704, +17508=>26705, +17509=>26706, +17510=>26707, +17511=>26708, +17512=>26709, +17513=>26710, +17514=>26711, +17515=>26712, +17516=>26713, +17517=>26714, +17518=>26715, +17519=>26716, +17520=>26717, +17521=>26718, +17522=>26719, +17523=>26720, +17524=>26721, +17525=>26722, +17526=>26723, +17527=>26724, +17528=>26725, +17529=>26726, +17530=>26727, +17531=>26728, +17532=>26729, +17533=>26730, +17534=>26731, +17535=>26732, +17536=>26733, +17537=>26734, +17538=>26735, +17539=>26736, +17540=>26737, +17541=>26738, +17542=>26739, +17543=>26740, +17544=>26741, +17545=>26742, +17546=>26743, +17547=>26744, +17548=>26745, +17549=>26746, +17550=>26747, +17551=>26748, +17552=>26749, +17553=>26750, +17554=>26751, +17555=>26752, +17556=>26753, +17557=>26754, +17558=>26755, +17559=>26756, +17560=>26757, +17561=>26758, +17562=>26759, +17563=>26760, +17564=>26761, +17565=>26762, +17566=>26763, +17567=>26764, +17568=>26765, +17569=>26766, +17570=>26767, +17571=>26768, +17572=>26769, +17573=>26770, +17574=>26771, +17575=>26772, +17576=>26773, +17577=>26774, +17578=>26775, +17579=>26776, +17580=>26777, +17581=>26778, +17582=>26779, +17583=>26780, +17584=>26781, +17585=>26782, +17586=>26783, +17587=>26784, +17588=>26785, +17589=>26786, +17590=>26787, +17591=>26788, +17592=>26789, +17593=>26790, +17594=>26791, +17595=>26792, +17596=>26793, +17597=>26794, +17598=>26795, +17599=>26796, +17600=>26797, +17601=>26798, +17602=>26799, +17603=>26800, +17604=>26801, +17605=>26802, +17606=>26803, +17607=>26804, +17608=>26805, +17609=>26806, +17610=>26807, +17611=>26808, +17612=>26809, +17613=>26810, +17614=>26811, +17615=>26812, +17616=>26813, +17617=>26814, +17618=>26815, +17619=>26816, +17620=>26817, +17621=>26818, +17623=>26819, +17624=>26820, +17625=>26821, +17626=>26822, +17627=>26823, +17628=>26824, +17629=>26825, +17630=>26826, +17631=>26827, +17632=>26828, +17633=>26829, +17634=>26830, +17635=>26831, +17636=>26832, +17637=>26833, +17638=>26834, +17639=>26835, +17640=>26836, +17641=>26837, +17642=>26838, +17643=>26839, +17644=>26840, +17645=>26841, +17646=>26842, +17647=>26843, +17648=>26844, +17649=>26845, +17650=>26846, +17651=>26847, +17652=>26848, +17653=>26849, +17654=>26850, +17655=>26851, +17656=>26852, +17657=>26853, +17658=>26854, +17659=>26855, +17660=>26856, +17661=>26857, +17662=>26858, +17663=>26859, +17664=>26860, +17665=>26861, +17666=>26862, +17667=>26863, +17668=>26864, +17669=>26865, +17670=>26866, +17671=>26867, +17672=>26868, +17673=>26869, +17674=>26870, +17675=>26871, +17676=>26872, +17677=>26873, +17678=>26874, +17679=>26875, +17680=>26876, +17681=>26877, +17682=>26878, +17683=>26879, +17684=>26880, +17685=>26881, +17686=>26882, +17687=>26883, +17688=>26884, +17689=>26885, +17690=>26886, +17691=>26887, +17692=>26888, +17693=>26889, +17694=>26890, +17695=>26891, +17696=>26892, +17697=>26893, +17698=>26894, +17699=>26895, +17700=>26896, +17701=>26897, +17702=>26898, +17703=>26899, +17704=>26900, +17705=>26901, +17706=>26902, +17707=>26903, +17708=>26904, +17709=>26905, +17710=>26906, +17711=>26907, +17712=>26908, +17713=>26909, +17714=>26910, +17715=>26911, +17716=>26912, +17717=>26913, +17718=>26914, +17719=>26915, +17720=>26916, +17721=>26917, +17722=>26918, +17723=>26919, +17724=>26920, +17725=>26921, +17726=>26922, +17727=>26923, +17728=>26924, +17729=>26925, +17730=>26926, +17731=>26927, +17732=>26928, +17733=>26929, +17734=>26930, +17735=>26931, +17736=>26932, +17737=>26933, +17738=>26934, +17739=>26935, +17740=>26936, +17741=>26937, +17742=>26938, +17743=>26939, +17744=>26940, +17745=>26941, +17746=>26942, +17747=>26943, +17748=>26944, +17749=>26945, +17750=>26946, +17751=>26947, +17752=>26948, +17753=>26949, +17754=>26950, +17755=>26951, +17756=>26952, +17757=>26953, +17758=>26954, +17759=>26955, +17760=>26956, +17761=>26957, +17762=>26958, +17763=>26959, +17764=>26960, +17765=>26961, +17766=>26962, +17767=>26963, +17768=>26964, +17769=>26965, +17770=>26966, +17771=>26967, +17772=>26968, +17773=>26969, +17774=>26970, +17775=>26971, +17776=>26972, +17777=>26973, +17778=>26974, +17779=>26975, +17780=>26976, +17781=>26977, +17782=>26978, +17783=>26979, +17784=>26980, +17785=>26981, +17786=>26982, +17787=>26983, +17788=>26984, +17789=>26985, +17790=>26986, +17791=>26987, +17792=>26988, +17793=>26989, +17794=>26990, +17795=>26991, +17796=>26992, +17797=>26993, +17798=>26994, +17799=>26995, +17800=>26996, +17801=>26997, +17802=>26998, +17803=>26999, +17804=>27000, +17805=>27001, +17806=>27002, +17807=>27003, +17808=>27004, +17809=>27005, +17810=>27006, +17811=>27007, +17812=>27008, +17813=>27009, +17814=>27010, +17815=>27011, +17816=>27012, +17817=>27013, +17818=>27014, +17819=>27015, +17820=>27016, +17821=>27017, +17822=>27018, +17823=>27019, +17824=>27020, +17825=>27021, +17826=>27022, +17827=>27023, +17828=>27024, +17829=>27025, +17830=>27026, +17831=>27027, +17832=>27028, +17833=>27029, +17834=>27030, +17835=>27031, +17836=>27032, +17837=>27033, +17838=>27034, +17839=>27035, +17840=>27036, +17841=>27037, +17842=>27038, +17843=>27039, +17844=>27040, +17845=>27041, +17846=>27042, +17847=>27043, +17848=>27044, +17849=>27045, +17850=>27046, +17851=>27047, +17852=>27048, +17853=>27049, +17854=>27050, +17855=>27051, +17856=>27052, +17857=>27053, +17858=>27054, +17859=>27055, +17860=>27056, +17861=>27057, +17862=>27058, +17863=>27059, +17864=>27060, +17865=>27061, +17866=>27062, +17867=>27063, +17868=>27064, +17869=>27065, +17870=>27066, +17871=>27067, +17872=>27068, +17873=>27069, +17874=>27070, +17875=>27071, +17876=>27072, +17877=>27073, +17878=>27074, +17879=>27075, +17880=>27076, +17881=>27077, +17882=>27078, +17883=>27079, +17884=>27080, +17885=>27081, +17886=>27082, +17887=>27083, +17888=>27084, +17889=>27085, +17890=>27086, +17891=>27087, +17892=>27088, +17893=>27089, +17894=>27090, +17895=>27091, +17896=>27092, +17897=>27093, +17898=>27094, +17899=>27095, +17900=>27096, +17901=>27097, +17902=>27098, +17903=>27099, +17904=>27100, +17905=>27101, +17906=>27102, +17907=>27103, +17908=>27104, +17909=>27105, +17910=>27106, +17911=>27107, +17912=>27108, +17913=>27109, +17914=>27110, +17915=>27111, +17916=>27112, +17917=>27113, +17918=>27114, +17919=>27115, +17920=>27116, +17921=>27117, +17922=>27118, +17923=>27119, +17924=>27120, +17925=>27121, +17926=>27122, +17927=>27123, +17928=>27124, +17929=>27125, +17930=>27126, +17931=>27127, +17932=>27128, +17933=>27129, +17934=>27130, +17935=>27131, +17936=>27132, +17937=>27133, +17938=>27134, +17939=>27135, +17940=>27136, +17941=>27137, +17942=>27138, +17943=>27139, +17944=>27140, +17945=>27141, +17946=>27142, +17947=>27143, +17948=>27144, +17949=>27145, +17950=>27146, +17951=>27147, +17952=>27148, +17953=>27149, +17954=>27150, +17955=>27151, +17956=>27152, +17957=>27153, +17958=>27154, +17959=>27155, +17960=>27156, +17961=>27157, +17962=>27158, +17963=>27159, +17964=>27160, +17965=>27161, +17966=>27162, +17967=>27163, +17968=>27164, +17969=>27165, +17970=>27166, +17971=>27167, +17972=>27168, +17973=>27169, +17974=>27170, +17975=>27171, +17976=>27172, +17977=>27173, +17978=>27174, +17979=>27175, +17980=>27176, +17981=>27177, +17982=>27178, +17983=>27179, +17984=>27180, +17985=>27181, +17986=>27182, +17987=>27183, +17988=>27184, +17989=>27185, +17990=>27186, +17991=>27187, +17992=>27188, +17993=>27189, +17994=>27190, +17995=>27191, +17997=>27192, +17998=>27193, +17999=>27194, +18000=>27195, +18001=>27196, +18002=>27197, +18003=>27198, +18004=>27199, +18005=>27200, +18006=>27201, +18007=>27202, +18008=>27203, +18009=>27204, +18010=>27205, +18011=>27206, +18012=>27207, +18013=>27208, +18014=>27209, +18015=>27210, +18016=>27211, +18018=>27212, +18019=>27213, +18020=>27214, +18021=>27215, +18022=>27216, +18023=>27217, +18024=>27218, +18025=>27219, +18026=>27220, +18027=>27221, +18028=>27222, +18029=>27223, +18030=>27224, +18031=>27225, +18032=>27226, +18033=>27227, +18034=>27228, +18035=>27229, +18036=>27230, +18037=>27231, +18038=>27232, +18039=>27233, +18040=>27234, +18041=>27235, +18042=>27236, +18043=>27237, +18044=>27238, +18045=>27239, +18046=>27240, +18047=>27241, +18048=>27242, +18049=>27243, +18050=>27244, +18051=>27245, +18052=>27246, +18053=>27247, +18054=>27248, +18055=>27249, +18056=>27250, +18057=>27251, +18058=>27252, +18059=>27253, +18060=>27254, +18061=>27255, +18062=>27256, +18063=>27257, +18064=>27258, +18065=>27259, +18066=>27260, +18067=>27261, +18068=>27262, +18069=>27263, +18070=>27264, +18071=>27265, +18072=>27266, +18073=>27267, +18074=>27268, +18075=>27269, +18076=>27270, +18077=>27271, +18078=>27272, +18079=>27273, +18080=>27274, +18081=>27275, +18082=>27276, +18083=>27277, +18084=>27278, +18085=>27279, +18086=>27280, +18087=>27281, +18088=>27282, +18089=>27283, +18090=>27284, +18091=>27285, +18092=>27286, +18093=>27287, +18094=>27288, +18095=>27289, +18096=>27290, +18097=>27291, +18098=>27292, +18099=>27293, +18100=>27294, +18101=>27295, +18102=>27296, +18103=>27297, +18104=>27298, +18105=>27299, +18106=>27300, +18107=>27301, +18108=>27302, +18109=>27303, +18110=>27304, +18111=>27305, +18112=>27306, +18113=>27307, +18114=>27308, +18115=>27309, +18116=>27310, +18117=>27311, +18118=>27312, +18119=>27313, +18120=>27314, +18121=>27315, +18122=>27316, +18123=>27317, +18124=>27318, +18125=>27319, +18126=>27320, +18127=>27321, +18128=>27322, +18129=>27323, +18130=>27324, +18131=>27325, +18132=>27326, +18133=>27327, +18134=>27328, +18135=>27329, +18136=>27330, +18137=>27331, +18138=>27332, +18139=>27333, +18140=>27334, +18141=>27335, +18142=>27336, +18143=>27337, +18144=>27338, +18145=>27339, +18146=>27340, +18147=>27341, +18148=>27342, +18149=>27343, +18150=>27344, +18151=>27345, +18152=>27346, +18153=>27347, +18154=>27348, +18155=>27349, +18156=>27350, +18157=>27351, +18158=>27352, +18159=>27353, +18160=>27354, +18161=>27355, +18162=>27356, +18163=>27357, +18164=>27358, +18165=>27359, +18166=>27360, +18167=>27361, +18168=>27362, +18169=>27363, +18170=>27364, +18171=>27365, +18172=>27366, +18173=>27367, +18174=>27368, +18175=>27369, +18176=>27370, +18177=>27371, +18178=>27372, +18179=>27373, +18180=>27374, +18181=>27375, +18182=>27376, +18183=>27377, +18184=>27378, +18185=>27379, +18186=>27380, +18187=>27381, +18188=>27382, +18189=>27383, +18190=>27384, +18191=>27385, +18192=>27386, +18193=>27387, +18194=>27388, +18195=>27389, +18196=>27390, +18197=>27391, +18198=>27392, +18199=>27393, +18200=>27394, +18201=>27395, +18202=>27396, +18203=>27397, +18204=>27398, +18205=>27399, +18206=>27400, +18207=>27401, +18208=>27402, +18209=>27403, +18210=>27404, +18212=>27405, +18213=>27406, +18214=>27407, +18215=>27408, +18216=>27409, +18218=>27410, +18219=>27411, +18220=>27412, +18221=>27413, +18222=>27414, +18223=>27415, +18224=>27416, +18225=>27417, +18226=>27418, +18227=>27419, +18228=>27420, +18229=>27421, +18230=>27422, +18231=>27423, +18232=>27424, +18233=>27425, +18234=>27426, +18235=>27427, +18236=>27428, +18237=>27429, +18238=>27430, +18239=>27431, +18240=>27432, +18241=>27433, +18242=>27434, +18243=>27435, +18244=>27436, +18245=>27437, +18246=>27438, +18247=>27439, +18248=>27440, +18249=>27441, +18250=>27442, +18251=>27443, +18252=>27444, +18253=>27445, +18254=>27446, +18255=>27447, +18256=>27448, +18257=>27449, +18258=>27450, +18259=>27451, +18260=>27452, +18261=>27453, +18262=>27454, +18263=>27455, +18264=>27456, +18265=>27457, +18266=>27458, +18267=>27459, +18268=>27460, +18269=>27461, +18270=>27462, +18271=>27463, +18272=>27464, +18273=>27465, +18274=>27466, +18275=>27467, +18276=>27468, +18277=>27469, +18278=>27470, +18279=>27471, +18280=>27472, +18281=>27473, +18282=>27474, +18283=>27475, +18284=>27476, +18285=>27477, +18286=>27478, +18287=>27479, +18288=>27480, +18289=>27481, +18290=>27482, +18291=>27483, +18292=>27484, +18293=>27485, +18294=>27486, +18295=>27487, +18296=>27488, +18297=>27489, +18298=>27490, +18299=>27491, +18301=>27492, +18302=>27493, +18303=>27494, +18304=>27495, +18305=>27496, +18306=>27497, +18307=>27498, +18308=>27499, +18309=>27500, +18310=>27501, +18311=>27502, +18312=>27503, +18313=>27504, +18314=>27505, +18315=>27506, +18316=>27507, +18318=>27508, +18319=>27509, +18320=>27510, +18321=>27511, +18322=>27512, +18323=>27513, +18324=>27514, +18325=>27515, +18326=>27516, +18327=>27517, +18328=>27518, +18329=>27519, +18330=>27520, +18331=>27521, +18332=>27522, +18333=>27523, +18334=>27524, +18335=>27525, +18336=>27526, +18337=>27527, +18338=>27528, +18339=>27529, +18340=>27530, +18341=>27531, +18342=>27532, +18343=>27533, +18344=>27534, +18345=>27535, +18346=>27536, +18347=>27537, +18348=>27538, +18349=>27539, +18350=>27540, +18351=>27541, +18352=>27542, +18353=>27543, +18354=>27544, +18355=>27545, +18356=>27546, +18357=>27547, +18358=>27548, +18359=>27549, +18360=>27550, +18361=>27551, +18362=>27552, +18363=>27553, +18364=>27554, +18365=>27555, +18366=>27556, +18367=>27557, +18368=>27558, +18369=>27559, +18370=>27560, +18371=>27561, +18372=>27562, +18373=>27563, +18374=>27564, +18375=>27565, +18376=>27566, +18377=>27567, +18378=>27568, +18379=>27569, +18380=>27570, +18381=>27571, +18382=>27572, +18383=>27573, +18384=>27574, +18385=>27575, +18386=>27576, +18387=>27577, +18388=>27578, +18389=>27579, +18390=>27580, +18391=>27581, +18392=>27582, +18393=>27583, +18394=>27584, +18395=>27585, +18396=>27586, +18397=>27587, +18398=>27588, +18399=>27589, +18400=>27590, +18401=>27591, +18402=>27592, +18403=>27593, +18404=>27594, +18405=>27595, +18406=>27596, +18407=>27597, +18408=>27598, +18409=>27599, +18410=>27600, +18411=>27601, +18412=>27602, +18413=>27603, +18414=>27604, +18415=>27605, +18416=>27606, +18417=>27607, +18418=>27608, +18419=>27609, +18420=>27610, +18421=>27611, +18422=>27612, +18423=>27613, +18424=>27614, +18425=>27615, +18426=>27616, +18427=>27617, +18428=>27618, +18429=>27619, +18430=>27620, +18431=>27621, +18432=>27622, +18433=>27623, +18434=>27624, +18435=>27625, +18436=>27626, +18437=>27627, +18438=>27628, +18439=>27629, +18440=>27630, +18441=>27631, +18442=>27632, +18443=>27633, +18444=>27634, +18445=>27635, +18446=>27636, +18447=>27637, +18448=>27638, +18449=>27639, +18450=>27640, +18451=>27641, +18452=>27642, +18453=>27643, +18454=>27644, +18455=>27645, +18456=>27646, +18457=>27647, +18458=>27648, +18459=>27649, +18460=>27650, +18461=>27651, +18462=>27652, +18463=>27653, +18464=>27654, +18465=>27655, +18466=>27656, +18467=>27657, +18468=>27658, +18469=>27659, +18470=>27660, +18471=>27661, +18472=>27662, +18473=>27663, +18474=>27664, +18475=>27665, +18476=>27666, +18477=>27667, +18478=>27668, +18479=>27669, +18480=>27670, +18481=>27671, +18482=>27672, +18483=>27673, +18484=>27674, +18485=>27675, +18486=>27676, +18487=>27677, +18488=>27678, +18489=>27679, +18490=>27680, +18491=>27681, +18492=>27682, +18493=>27683, +18494=>27684, +18495=>27685, +18496=>27686, +18497=>27687, +18498=>27688, +18499=>27689, +18500=>27690, +18501=>27691, +18502=>27692, +18503=>27693, +18504=>27694, +18505=>27695, +18506=>27696, +18507=>27697, +18508=>27698, +18509=>27699, +18510=>27700, +18511=>27701, +18512=>27702, +18513=>27703, +18514=>27704, +18515=>27705, +18516=>27706, +18517=>27707, +18518=>27708, +18519=>27709, +18520=>27710, +18521=>27711, +18522=>27712, +18523=>27713, +18524=>27714, +18525=>27715, +18526=>27716, +18527=>27717, +18528=>27718, +18529=>27719, +18530=>27720, +18531=>27721, +18532=>27722, +18533=>27723, +18534=>27724, +18535=>27725, +18536=>27726, +18537=>27727, +18538=>27728, +18539=>27729, +18540=>27730, +18541=>27731, +18542=>27732, +18543=>27733, +18544=>27734, +18545=>27735, +18546=>27736, +18547=>27737, +18548=>27738, +18549=>27739, +18550=>27740, +18551=>27741, +18552=>27742, +18553=>27743, +18554=>27744, +18555=>27745, +18556=>27746, +18557=>27747, +18558=>27748, +18559=>27749, +18560=>27750, +18561=>27751, +18562=>27752, +18563=>27753, +18564=>27754, +18565=>27755, +18566=>27756, +18567=>27757, +18568=>27758, +18569=>27759, +18570=>27760, +18571=>27761, +18572=>27762, +18573=>27763, +18574=>27764, +18575=>27765, +18576=>27766, +18577=>27767, +18578=>27768, +18579=>27769, +18580=>27770, +18581=>27771, +18582=>27772, +18583=>27773, +18584=>27774, +18585=>27775, +18586=>27776, +18587=>27777, +18588=>27778, +18589=>27779, +18590=>27780, +18591=>27781, +18592=>27782, +18593=>27783, +18594=>27784, +18595=>27785, +18596=>27786, +18597=>27787, +18598=>27788, +18599=>27789, +18600=>27790, +18601=>27791, +18602=>27792, +18603=>27793, +18604=>27794, +18605=>27795, +18606=>27796, +18607=>27797, +18608=>27798, +18609=>27799, +18610=>27800, +18611=>27801, +18612=>27802, +18613=>27803, +18614=>27804, +18615=>27805, +18616=>27806, +18617=>27807, +18618=>27808, +18619=>27809, +18620=>27810, +18621=>27811, +18622=>27812, +18623=>27813, +18624=>27814, +18625=>27815, +18626=>27816, +18627=>27817, +18628=>27818, +18629=>27819, +18630=>27820, +18631=>27821, +18632=>27822, +18633=>27823, +18634=>27824, +18635=>27825, +18636=>27826, +18637=>27827, +18638=>27828, +18639=>27829, +18640=>27830, +18641=>27831, +18642=>27832, +18643=>27833, +18644=>27834, +18645=>27835, +18646=>27836, +18647=>27837, +18648=>27838, +18649=>27839, +18650=>27840, +18651=>27841, +18652=>27842, +18653=>27843, +18654=>27844, +18655=>27845, +18656=>27846, +18657=>27847, +18658=>27848, +18659=>27849, +18660=>27850, +18661=>27851, +18662=>27852, +18663=>27853, +18664=>27854, +18665=>27855, +18666=>27856, +18667=>27857, +18668=>27858, +18669=>27859, +18670=>27860, +18671=>27861, +18672=>27862, +18673=>27863, +18674=>27864, +18675=>27865, +18676=>27866, +18677=>27867, +18678=>27868, +18679=>27869, +18680=>27870, +18681=>27871, +18682=>27872, +18683=>27873, +18684=>27874, +18685=>27875, +18686=>27876, +18687=>27877, +18688=>27878, +18689=>27879, +18690=>27880, +18691=>27881, +18692=>27882, +18693=>27883, +18694=>27884, +18695=>27885, +18696=>27886, +18697=>27887, +18698=>27888, +18699=>27889, +18700=>27890, +18701=>27891, +18702=>27892, +18703=>27893, +18704=>27894, +18705=>27895, +18706=>27896, +18707=>27897, +18708=>27898, +18709=>27899, +18710=>27900, +18711=>27901, +18712=>27902, +18713=>27903, +18714=>27904, +18715=>27905, +18716=>27906, +18717=>27907, +18718=>27908, +18719=>27909, +18720=>27910, +18721=>27911, +18722=>27912, +18723=>27913, +18724=>27914, +18725=>27915, +18726=>27916, +18727=>27917, +18728=>27918, +18729=>27919, +18730=>27920, +18731=>27921, +18732=>27922, +18733=>27923, +18734=>27924, +18735=>27925, +18736=>27926, +18737=>27927, +18738=>27928, +18739=>27929, +18740=>27930, +18741=>27931, +18742=>27932, +18743=>27933, +18744=>27934, +18745=>27935, +18746=>27936, +18747=>27937, +18748=>27938, +18749=>27939, +18750=>27940, +18751=>27941, +18752=>27942, +18753=>27943, +18754=>27944, +18755=>27945, +18756=>27946, +18757=>27947, +18758=>27948, +18760=>27949, +18761=>27950, +18762=>27951, +18763=>27952, +18764=>27953, +18765=>27954, +18766=>27955, +18767=>27956, +18768=>27957, +18769=>27958, +18770=>27959, +18771=>27960, +18772=>27961, +18773=>27962, +18774=>27963, +18775=>27964, +18776=>27965, +18777=>27966, +18778=>27967, +18779=>27968, +18780=>27969, +18781=>27970, +18782=>27971, +18783=>27972, +18784=>27973, +18785=>27974, +18786=>27975, +18787=>27976, +18788=>27977, +18789=>27978, +18790=>27979, +18791=>27980, +18792=>27981, +18793=>27982, +18794=>27983, +18795=>27984, +18796=>27985, +18797=>27986, +18798=>27987, +18799=>27988, +18800=>27989, +18801=>27990, +18802=>27991, +18803=>27992, +18804=>27993, +18805=>27994, +18806=>27995, +18807=>27996, +18808=>27997, +18809=>27998, +18811=>27999, +18812=>28000, +18814=>28001, +18815=>28002, +18816=>28003, +18817=>28004, +18820=>28005, +18823=>28006, +18824=>28007, +18825=>28008, +18826=>28009, +18827=>28010, +18828=>28011, +18829=>28012, +18830=>28013, +18831=>28014, +18832=>28015, +18833=>28016, +18834=>28017, +18835=>28018, +18836=>28019, +18837=>28020, +18838=>28021, +18839=>28022, +18840=>28023, +18841=>28024, +18842=>28025, +18844=>28026, +18845=>28027, +18846=>28028, +18848=>28029, +18849=>28030, +18850=>28031, +18851=>28032, +18852=>28033, +18853=>28034, +18854=>28035, +18855=>28036, +18856=>28037, +18857=>28038, +18858=>28039, +18859=>28040, +18860=>28041, +18861=>28042, +18862=>28043, +18863=>28044, +18864=>28045, +18865=>28046, +18866=>28047, +18867=>28048, +18868=>28049, +18869=>28050, +18872=>28051, +18873=>28052, +18874=>28053, +18875=>28054, +18876=>28055, +18877=>28056, +18878=>28057, +18879=>28058, +18880=>28059, +18881=>28060, +18882=>28061, +18883=>28062, +18884=>28063, +18885=>28064, +18886=>28065, +18887=>28066, +18888=>28067, +18889=>28068, +18890=>28069, +18891=>28070, +18892=>28071, +18893=>28072, +18894=>28073, +18895=>28074, +18896=>28075, +18897=>28076, +18898=>28077, +18899=>28078, +18900=>28079, +18901=>28080, +18902=>28081, +18903=>28082, +18904=>28083, +18905=>28084, +18906=>28085, +18907=>28086, +18908=>28087, +18909=>28088, +18910=>28089, +18911=>28090, +18912=>28091, +18913=>28092, +18914=>28093, +18915=>28094, +18916=>28095, +18917=>28096, +18918=>28097, +18919=>28098, +18920=>28099, +18921=>28100, +18922=>28101, +18923=>28102, +18924=>28103, +18925=>28104, +18926=>28105, +18927=>28106, +18928=>28107, +18929=>28108, +18930=>28109, +18931=>28110, +18932=>28111, +18933=>28112, +18934=>28113, +18935=>28114, +18936=>28115, +18937=>28116, +18938=>28117, +18939=>28118, +18940=>28119, +18941=>28120, +18942=>28121, +18943=>28122, +18944=>28123, +18945=>28124, +18946=>28125, +18947=>28126, +18948=>28127, +18949=>28128, +18950=>28129, +18951=>28130, +18952=>28131, +18953=>28132, +18954=>28133, +18955=>28134, +18956=>28135, +18957=>28136, +18958=>28137, +18959=>28138, +18960=>28139, +18961=>28140, +18962=>28141, +18963=>28142, +18964=>28143, +18965=>28144, +18966=>28145, +18967=>28146, +18968=>28147, +18969=>28148, +18970=>28149, +18971=>28150, +18972=>28151, +18973=>28152, +18974=>28153, +18975=>28154, +18976=>28155, +18977=>28156, +18978=>28157, +18979=>28158, +18980=>28159, +18981=>28160, +18982=>28161, +18983=>28162, +18984=>28163, +18985=>28164, +18986=>28165, +18987=>28166, +18988=>28167, +18989=>28168, +18990=>28169, +18991=>28170, +18992=>28171, +18993=>28172, +18994=>28173, +18995=>28174, +18996=>28175, +18997=>28176, +18998=>28177, +18999=>28178, +19000=>28179, +19001=>28180, +19002=>28181, +19003=>28182, +19004=>28183, +19005=>28184, +19006=>28185, +19007=>28186, +19008=>28187, +19009=>28188, +19010=>28189, +19011=>28190, +19012=>28191, +19013=>28192, +19014=>28193, +19015=>28194, +19016=>28195, +19017=>28196, +19018=>28197, +19019=>28198, +19020=>28199, +19021=>28200, +19022=>28201, +19023=>28202, +19024=>28203, +19025=>28204, +19026=>28205, +19027=>28206, +19028=>28207, +19029=>28208, +19030=>28209, +19031=>28210, +19032=>28211, +19033=>28212, +19034=>28213, +19035=>28214, +19036=>28215, +19037=>28216, +19038=>28217, +19039=>28218, +19040=>28219, +19041=>28220, +19042=>28221, +19043=>28222, +19044=>28223, +19045=>28224, +19046=>28225, +19047=>28226, +19048=>28227, +19049=>28228, +19050=>28229, +19051=>28230, +19052=>28231, +19053=>28232, +19054=>28233, +19055=>28234, +19056=>28235, +19057=>28236, +19058=>28237, +19059=>28238, +19060=>28239, +19061=>28240, +19062=>28241, +19063=>28242, +19064=>28243, +19065=>28244, +19066=>28245, +19067=>28246, +19068=>28247, +19069=>28248, +19070=>28249, +19071=>28250, +19072=>28251, +19073=>28252, +19074=>28253, +19075=>28254, +19076=>28255, +19077=>28256, +19078=>28257, +19079=>28258, +19080=>28259, +19081=>28260, +19082=>28261, +19083=>28262, +19084=>28263, +19085=>28264, +19086=>28265, +19087=>28266, +19088=>28267, +19089=>28268, +19090=>28269, +19091=>28270, +19092=>28271, +19093=>28272, +19094=>28273, +19095=>28274, +19096=>28275, +19097=>28276, +19098=>28277, +19099=>28278, +19100=>28279, +19101=>28280, +19102=>28281, +19103=>28282, +19104=>28283, +19105=>28284, +19106=>28285, +19107=>28286, +19108=>28287, +19109=>28288, +19110=>28289, +19111=>28290, +19112=>28291, +19113=>28292, +19114=>28293, +19115=>28294, +19116=>28295, +19117=>28296, +19118=>28297, +19119=>28298, +19120=>28299, +19121=>28300, +19122=>28301, +19123=>28302, +19124=>28303, +19125=>28304, +19126=>28305, +19127=>28306, +19128=>28307, +19129=>28308, +19130=>28309, +19131=>28310, +19132=>28311, +19133=>28312, +19134=>28313, +19135=>28314, +19136=>28315, +19137=>28316, +19138=>28317, +19139=>28318, +19140=>28319, +19141=>28320, +19142=>28321, +19143=>28322, +19144=>28323, +19145=>28324, +19146=>28325, +19147=>28326, +19148=>28327, +19149=>28328, +19150=>28329, +19151=>28330, +19152=>28331, +19153=>28332, +19154=>28333, +19155=>28334, +19156=>28335, +19157=>28336, +19158=>28337, +19159=>28338, +19160=>28339, +19161=>28340, +19162=>28341, +19163=>28342, +19164=>28343, +19165=>28344, +19166=>28345, +19167=>28346, +19168=>28347, +19169=>28348, +19170=>28349, +19171=>28350, +19172=>28351, +19173=>28352, +19174=>28353, +19175=>28354, +19176=>28355, +19177=>28356, +19178=>28357, +19179=>28358, +19180=>28359, +19181=>28360, +19182=>28361, +19183=>28362, +19184=>28363, +19185=>28364, +19186=>28365, +19187=>28366, +19188=>28367, +19189=>28368, +19190=>28369, +19191=>28370, +19192=>28371, +19193=>28372, +19194=>28373, +19195=>28374, +19196=>28375, +19197=>28376, +19198=>28377, +19199=>28378, +19200=>28379, +19201=>28380, +19202=>28381, +19203=>28382, +19204=>28383, +19205=>28384, +19206=>28385, +19207=>28386, +19208=>28387, +19209=>28388, +19210=>28389, +19211=>28390, +19212=>28391, +19213=>28392, +19214=>28393, +19215=>28394, +19216=>28395, +19217=>28396, +19218=>28397, +19219=>28398, +19220=>28399, +19221=>28400, +19222=>28401, +19223=>28402, +19224=>28403, +19225=>28404, +19226=>28405, +19227=>28406, +19228=>28407, +19229=>28408, +19230=>28409, +19231=>28410, +19232=>28411, +19233=>28412, +19234=>28413, +19235=>28414, +19236=>28415, +19237=>28416, +19238=>28417, +19239=>28418, +19240=>28419, +19241=>28420, +19242=>28421, +19243=>28422, +19244=>28423, +19245=>28424, +19246=>28425, +19247=>28426, +19248=>28427, +19249=>28428, +19250=>28429, +19251=>28430, +19252=>28431, +19253=>28432, +19254=>28433, +19255=>28434, +19256=>28435, +19257=>28436, +19258=>28437, +19259=>28438, +19260=>28439, +19261=>28440, +19262=>28441, +19263=>28442, +19264=>28443, +19265=>28444, +19266=>28445, +19267=>28446, +19268=>28447, +19269=>28448, +19270=>28449, +19271=>28450, +19272=>28451, +19273=>28452, +19274=>28453, +19275=>28454, +19276=>28455, +19277=>28456, +19278=>28457, +19279=>28458, +19280=>28459, +19281=>28460, +19282=>28461, +19283=>28462, +19284=>28463, +19285=>28464, +19286=>28465, +19287=>28466, +19288=>28467, +19289=>28468, +19290=>28469, +19291=>28470, +19292=>28471, +19293=>28472, +19294=>28473, +19295=>28474, +19296=>28475, +19297=>28476, +19298=>28477, +19299=>28478, +19300=>28479, +19301=>28480, +19302=>28481, +19303=>28482, +19304=>28483, +19305=>28484, +19306=>28485, +19307=>28486, +19308=>28487, +19309=>28488, +19310=>28489, +19311=>28490, +19312=>28491, +19313=>28492, +19314=>28493, +19315=>28494, +19316=>28495, +19317=>28496, +19318=>28497, +19319=>28498, +19320=>28499, +19321=>28500, +19322=>28501, +19323=>28502, +19324=>28503, +19325=>28504, +19326=>28505, +19327=>28506, +19328=>28507, +19329=>28508, +19330=>28509, +19331=>28510, +19332=>28511, +19333=>28512, +19334=>28513, +19335=>28514, +19336=>28515, +19337=>28516, +19338=>28517, +19339=>28518, +19340=>28519, +19341=>28520, +19342=>28521, +19343=>28522, +19344=>28523, +19345=>28524, +19346=>28525, +19347=>28526, +19348=>28527, +19349=>28528, +19350=>28529, +19351=>28530, +19352=>28531, +19353=>28532, +19354=>28533, +19355=>28534, +19356=>28535, +19357=>28536, +19358=>28537, +19359=>28538, +19360=>28539, +19361=>28540, +19362=>28541, +19363=>28542, +19364=>28543, +19365=>28544, +19366=>28545, +19367=>28546, +19368=>28547, +19369=>28548, +19370=>28549, +19371=>28550, +19372=>28551, +19373=>28552, +19374=>28553, +19375=>28554, +19376=>28555, +19377=>28556, +19378=>28557, +19379=>28558, +19380=>28559, +19381=>28560, +19382=>28561, +19383=>28562, +19384=>28563, +19385=>28564, +19386=>28565, +19387=>28566, +19388=>28567, +19389=>28568, +19390=>28569, +19391=>28570, +19392=>28571, +19393=>28572, +19394=>28573, +19395=>28574, +19396=>28575, +19397=>28576, +19398=>28577, +19399=>28578, +19400=>28579, +19401=>28580, +19402=>28581, +19403=>28582, +19404=>28583, +19405=>28584, +19406=>28585, +19407=>28586, +19408=>28587, +19409=>28588, +19410=>28589, +19411=>28590, +19412=>28591, +19413=>28592, +19414=>28593, +19415=>28594, +19416=>28595, +19417=>28596, +19418=>28597, +19419=>28598, +19420=>28599, +19421=>28600, +19422=>28601, +19423=>28602, +19424=>28603, +19425=>28604, +19426=>28605, +19427=>28606, +19428=>28607, +19429=>28608, +19430=>28609, +19431=>28610, +19432=>28611, +19433=>28612, +19434=>28613, +19435=>28614, +19436=>28615, +19437=>28616, +19438=>28617, +19439=>28618, +19440=>28619, +19441=>28620, +19442=>28621, +19443=>28622, +19444=>28623, +19445=>28624, +19446=>28625, +19447=>28626, +19448=>28627, +19449=>28628, +19450=>28629, +19451=>28630, +19452=>28631, +19453=>28632, +19454=>28633, +19455=>28634, +19456=>28635, +19457=>28636, +19458=>28637, +19459=>28638, +19460=>28639, +19461=>28640, +19462=>28641, +19463=>28642, +19464=>28643, +19465=>28644, +19466=>28645, +19467=>28646, +19468=>28647, +19469=>28648, +19470=>28649, +19471=>28650, +19472=>28651, +19473=>28652, +19474=>28653, +19475=>28654, +19476=>28655, +19477=>28656, +19478=>28657, +19479=>28658, +19480=>28659, +19481=>28660, +19482=>28661, +19483=>28662, +19484=>28663, +19485=>28664, +19486=>28665, +19487=>28666, +19488=>28667, +19489=>28668, +19490=>28669, +19491=>28670, +19492=>28671, +19493=>28672, +19494=>28673, +19495=>28674, +19496=>28675, +19497=>28676, +19498=>28677, +19499=>28678, +19500=>28679, +19501=>28680, +19502=>28681, +19503=>28682, +19504=>28683, +19505=>28684, +19506=>28685, +19507=>28686, +19508=>28687, +19509=>28688, +19510=>28689, +19511=>28690, +19512=>28691, +19513=>28692, +19514=>28693, +19515=>28694, +19516=>28695, +19517=>28696, +19518=>28697, +19519=>28698, +19520=>28699, +19521=>28700, +19522=>28701, +19523=>28702, +19524=>28703, +19525=>28704, +19526=>28705, +19527=>28706, +19528=>28707, +19529=>28708, +19530=>28709, +19531=>28710, +19532=>28711, +19533=>28712, +19534=>28713, +19535=>28714, +19536=>28715, +19537=>28716, +19538=>28717, +19539=>28718, +19540=>28719, +19541=>28720, +19542=>28721, +19543=>28722, +19544=>28723, +19545=>28724, +19546=>28725, +19547=>28726, +19548=>28727, +19549=>28728, +19550=>28729, +19551=>28730, +19552=>28731, +19553=>28732, +19554=>28733, +19555=>28734, +19556=>28735, +19557=>28736, +19558=>28737, +19559=>28738, +19560=>28739, +19561=>28740, +19562=>28741, +19563=>28742, +19564=>28743, +19565=>28744, +19566=>28745, +19567=>28746, +19568=>28747, +19569=>28748, +19570=>28749, +19571=>28750, +19572=>28751, +19573=>28752, +19574=>28753, +19576=>28754, +19577=>28755, +19578=>28756, +19579=>28757, +19580=>28758, +19581=>28759, +19582=>28760, +19583=>28761, +19584=>28762, +19585=>28763, +19586=>28764, +19587=>28765, +19588=>28766, +19589=>28767, +19590=>28768, +19591=>28769, +19592=>28770, +19593=>28771, +19594=>28772, +19595=>28773, +19596=>28774, +19597=>28775, +19598=>28776, +19599=>28777, +19600=>28778, +19601=>28779, +19602=>28780, +19603=>28781, +19604=>28782, +19605=>28783, +19606=>28784, +19607=>28785, +19608=>28786, +19609=>28787, +19610=>28788, +19611=>28789, +19612=>28790, +19613=>28791, +19614=>28792, +19620=>28793, +19621=>28794, +19622=>28795, +19623=>28796, +19624=>28797, +19625=>28798, +19626=>28799, +19627=>28800, +19628=>28801, +19629=>28802, +19630=>28803, +19631=>28804, +19632=>28805, +19633=>28806, +19634=>28807, +19635=>28808, +19636=>28809, +19637=>28810, +19638=>28811, +19639=>28812, +19640=>28813, +19641=>28814, +19642=>28815, +19643=>28816, +19644=>28817, +19645=>28818, +19646=>28819, +19647=>28820, +19648=>28821, +19649=>28822, +19650=>28823, +19651=>28824, +19652=>28825, +19653=>28826, +19654=>28827, +19655=>28828, +19656=>28829, +19657=>28830, +19658=>28831, +19659=>28832, +19660=>28833, +19661=>28834, +19662=>28835, +19663=>28836, +19664=>28837, +19665=>28838, +19666=>28839, +19667=>28840, +19668=>28841, +19669=>28842, +19670=>28843, +19671=>28844, +19672=>28845, +19673=>28846, +19674=>28847, +19675=>28848, +19676=>28849, +19677=>28850, +19678=>28851, +19679=>28852, +19680=>28853, +19681=>28854, +19682=>28855, +19683=>28856, +19684=>28857, +19685=>28858, +19686=>28859, +19687=>28860, +19688=>28861, +19689=>28862, +19690=>28863, +19691=>28864, +19692=>28865, +19693=>28866, +19694=>28867, +19695=>28868, +19696=>28869, +19697=>28870, +19698=>28871, +19699=>28872, +19700=>28873, +19701=>28874, +19702=>28875, +19703=>28876, +19704=>28877, +19705=>28878, +19706=>28879, +19707=>28880, +19708=>28881, +19709=>28882, +19710=>28883, +19711=>28884, +19712=>28885, +19713=>28886, +19714=>28887, +19715=>28888, +19716=>28889, +19717=>28890, +19718=>28891, +19719=>28892, +19720=>28893, +19721=>28894, +19722=>28895, +19723=>28896, +19724=>28897, +19725=>28898, +19726=>28899, +19727=>28900, +19728=>28901, +19729=>28902, +19730=>28903, +19738=>28904, +19739=>28905, +19740=>28906, +19741=>28907, +19742=>28908, +19743=>28909, +19744=>28910, +19745=>28911, +19746=>28912, +19747=>28913, +19748=>28914, +19749=>28915, +19750=>28916, +19751=>28917, +19752=>28918, +19753=>28919, +19754=>28920, +19755=>28921, +19756=>28922, +19757=>28923, +19758=>28924, +19759=>28925, +19760=>28926, +19761=>28927, +19762=>28928, +19763=>28929, +19764=>28930, +19765=>28931, +19766=>28932, +19767=>28933, +19768=>28934, +19769=>28935, +19770=>28936, +19771=>28937, +19772=>28938, +19773=>28939, +19774=>28940, +19775=>28941, +19776=>28942, +19777=>28943, +19778=>28944, +19779=>28945, +19780=>28946, +19781=>28947, +19782=>28948, +19783=>28949, +19784=>28950, +19785=>28951, +19786=>28952, +19787=>28953, +19788=>28954, +19789=>28955, +19790=>28956, +19791=>28957, +19792=>28958, +19793=>28959, +19794=>28960, +19795=>28961, +19796=>28962, +19797=>28963, +19798=>28964, +19799=>28965, +19800=>28966, +19801=>28967, +19802=>28968, +19803=>28969, +19804=>28970, +19805=>28971, +19806=>28972, +19807=>28973, +19808=>28974, +19809=>28975, +19810=>28976, +19811=>28977, +19812=>28978, +19813=>28979, +19814=>28980, +19815=>28981, +19816=>28982, +19817=>28983, +19818=>28984, +19819=>28985, +19820=>28986, +19821=>28987, +19822=>28988, +19823=>28989, +19824=>28990, +19825=>28991, +19826=>28992, +19827=>28993, +19828=>28994, +19829=>28995, +19830=>28996, +19831=>28997, +19832=>28998, +19833=>28999, +19834=>29000, +19835=>29001, +19836=>29002, +19837=>29003, +19838=>29004, +19839=>29005, +19840=>29006, +19841=>29007, +19842=>29008, +19843=>29009, +19844=>29010, +19845=>29011, +19846=>29012, +19847=>29013, +19848=>29014, +19849=>29015, +19850=>29016, +19851=>29017, +19852=>29018, +19853=>29019, +19854=>29020, +19855=>29021, +19856=>29022, +19857=>29023, +19858=>29024, +19859=>29025, +19860=>29026, +19861=>29027, +19862=>29028, +19863=>29029, +19864=>29030, +19865=>29031, +19866=>29032, +19867=>29033, +19868=>29034, +19869=>29035, +19870=>29036, +19871=>29037, +19872=>29038, +19873=>29039, +19874=>29040, +19875=>29041, +19876=>29042, +19877=>29043, +19878=>29044, +19879=>29045, +19880=>29046, +19881=>29047, +19882=>29048, +19883=>29049, +19884=>29050, +19885=>29051, +19887=>29052, +19888=>29053, +19889=>29054, +19890=>29055, +19891=>29056, +19892=>29057, +19893=>29058, +40960=>29064, +40961=>29065, +40962=>29066, +40963=>29067, +40964=>29068, +40965=>29069, +40966=>29070, +40967=>29071, +40968=>29072, +40969=>29073, +40970=>29074, +40971=>29075, +40972=>29076, +40973=>29077, +40974=>29078, +40975=>29079, +40976=>29080, +40977=>29081, +40978=>29082, +40979=>29083, +40980=>29084, +40981=>29085, +40982=>29086, +40983=>29087, +40984=>29088, +40985=>29089, +40986=>29090, +40987=>29091, +40988=>29092, +40989=>29093, +40990=>29094, +40991=>29095, +40992=>29096, +40993=>29097, +40994=>29098, +40995=>29099, +40996=>29100, +40997=>29101, +40998=>29102, +40999=>29103, +41000=>29104, +41001=>29105, +41002=>29106, +41003=>29107, +41004=>29108, +41005=>29109, +41006=>29110, +41007=>29111, +41008=>29112, +41009=>29113, +41010=>29114, +41011=>29115, +41012=>29116, +41013=>29117, +41014=>29118, +41015=>29119, +41016=>29120, +41017=>29121, +41018=>29122, +41019=>29123, +41020=>29124, +41021=>29125, +41022=>29126, +41023=>29127, +41024=>29128, +41025=>29129, +41026=>29130, +41027=>29131, +41028=>29132, +41029=>29133, +41030=>29134, +41031=>29135, +41032=>29136, +41033=>29137, +41034=>29138, +41035=>29139, +41036=>29140, +41037=>29141, +41038=>29142, +41039=>29143, +41040=>29144, +41041=>29145, +41042=>29146, +41043=>29147, +41044=>29148, +41045=>29149, +41046=>29150, +41047=>29151, +41048=>29152, +41049=>29153, +41050=>29154, +41051=>29155, +41052=>29156, +41053=>29157, +41054=>29158, +41055=>29159, +41056=>29160, +41057=>29161, +41058=>29162, +41059=>29163, +41060=>29164, +41061=>29165, +41062=>29166, +41063=>29167, +41064=>29168, +41065=>29169, +41066=>29170, +41067=>29171, +41068=>29172, +41069=>29173, +41070=>29174, +41071=>29175, +41072=>29176, +41073=>29177, +41074=>29178, +41075=>29179, +41076=>29180, +41077=>29181, +41078=>29182, +41079=>29183, +41080=>29184, +41081=>29185, +41082=>29186, +41083=>29187, +41084=>29188, +41085=>29189, +41086=>29190, +41087=>29191, +41088=>29192, +41089=>29193, +41090=>29194, +41091=>29195, +41092=>29196, +41093=>29197, +41094=>29198, +41095=>29199, +41096=>29200, +41097=>29201, +41098=>29202, +41099=>29203, +41100=>29204, +41101=>29205, +41102=>29206, +41103=>29207, +41104=>29208, +41105=>29209, +41106=>29210, +41107=>29211, +41108=>29212, +41109=>29213, +41110=>29214, +41111=>29215, +41112=>29216, +41113=>29217, +41114=>29218, +41115=>29219, +41116=>29220, +41117=>29221, +41118=>29222, +41119=>29223, +41120=>29224, +41121=>29225, +41122=>29226, +41123=>29227, +41124=>29228, +41125=>29229, +41126=>29230, +41127=>29231, +41128=>29232, +41129=>29233, +41130=>29234, +41131=>29235, +41132=>29236, +41133=>29237, +41134=>29238, +41135=>29239, +41136=>29240, +41137=>29241, +41138=>29242, +41139=>29243, +41140=>29244, +41141=>29245, +41142=>29246, +41143=>29247, +41144=>29248, +41145=>29249, +41146=>29250, +41147=>29251, +41148=>29252, +41149=>29253, +41150=>29254, +41151=>29255, +41152=>29256, +41153=>29257, +41154=>29258, +41155=>29259, +41156=>29260, +41157=>29261, +41158=>29262, +41159=>29263, +41160=>29264, +41161=>29265, +41162=>29266, +41163=>29267, +41164=>29268, +41165=>29269, +41166=>29270, +41167=>29271, +41168=>29272, +41169=>29273, +41170=>29274, +41171=>29275, +41172=>29276, +41173=>29277, +41174=>29278, +41175=>29279, +41176=>29280, +41177=>29281, +41178=>29282, +41179=>29283, +41180=>29284, +41181=>29285, +41182=>29286, +41183=>29287, +41184=>29288, +41185=>29289, +41186=>29290, +41187=>29291, +41188=>29292, +41189=>29293, +41190=>29294, +41191=>29295, +41192=>29296, +41193=>29297, +41194=>29298, +41195=>29299, +41196=>29300, +41197=>29301, +41198=>29302, +41199=>29303, +41200=>29304, +41201=>29305, +41202=>29306, +41203=>29307, +41204=>29308, +41205=>29309, +41206=>29310, +41207=>29311, +41208=>29312, +41209=>29313, +41210=>29314, +41211=>29315, +41212=>29316, +41213=>29317, +41214=>29318, +41215=>29319, +41216=>29320, +41217=>29321, +41218=>29322, +41219=>29323, +41220=>29324, +41221=>29325, +41222=>29326, +41223=>29327, +41224=>29328, +41225=>29329, +41226=>29330, +41227=>29331, +41228=>29332, +41229=>29333, +41230=>29334, +41231=>29335, +41232=>29336, +41233=>29337, +41234=>29338, +41235=>29339, +41236=>29340, +41237=>29341, +41238=>29342, +41239=>29343, +41240=>29344, +41241=>29345, +41242=>29346, +41243=>29347, +41244=>29348, +41245=>29349, +41246=>29350, +41247=>29351, +41248=>29352, +41249=>29353, +41250=>29354, +41251=>29355, +41252=>29356, +41253=>29357, +41254=>29358, +41255=>29359, +41256=>29360, +41257=>29361, +41258=>29362, +41259=>29363, +41260=>29364, +41261=>29365, +41262=>29366, +41263=>29367, +41264=>29368, +41265=>29369, +41266=>29370, +41267=>29371, +41268=>29372, +41269=>29373, +41270=>29374, +41271=>29375, +41272=>29376, +41273=>29377, +41274=>29378, +41275=>29379, +41276=>29380, +41277=>29381, +41278=>29382, +41279=>29383, +41280=>29384, +41281=>29385, +41282=>29386, +41283=>29387, +41284=>29388, +41285=>29389, +41286=>29390, +41287=>29391, +41288=>29392, +41289=>29393, +41290=>29394, +41291=>29395, +41292=>29396, +41293=>29397, +41294=>29398, +41295=>29399, +41296=>29400, +41297=>29401, +41298=>29402, +41299=>29403, +41300=>29404, +41301=>29405, +41302=>29406, +41303=>29407, +41304=>29408, +41305=>29409, +41306=>29410, +41307=>29411, +41308=>29412, +41309=>29413, +41310=>29414, +41311=>29415, +41312=>29416, +41313=>29417, +41314=>29418, +41315=>29419, +41316=>29420, +41317=>29421, +41318=>29422, +41319=>29423, +41320=>29424, +41321=>29425, +41322=>29426, +41323=>29427, +41324=>29428, +41325=>29429, +41326=>29430, +41327=>29431, +41328=>29432, +41329=>29433, +41330=>29434, +41331=>29435, +41332=>29436, +41333=>29437, +41334=>29438, +41335=>29439, +41336=>29440, +41337=>29441, +41338=>29442, +41339=>29443, +41340=>29444, +41341=>29445, +41342=>29446, +41343=>29447, +41344=>29448, +41345=>29449, +41346=>29450, +41347=>29451, +41348=>29452, +41349=>29453, +41350=>29454, +41351=>29455, +41352=>29456, +41353=>29457, +41354=>29458, +41355=>29459, +41356=>29460, +41357=>29461, +41358=>29462, +41359=>29463, +41360=>29464, +41361=>29465, +41362=>29466, +41363=>29467, +41364=>29468, +41365=>29469, +41366=>29470, +41367=>29471, +41368=>29472, +41369=>29473, +41370=>29474, +41371=>29475, +41372=>29476, +41373=>29477, +41374=>29478, +41375=>29479, +41376=>29480, +41377=>29481, +41378=>29482, +41379=>29483, +41380=>29484, +41381=>29485, +41382=>29486, +41383=>29487, +41384=>29488, +41385=>29489, +41386=>29490, +41387=>29491, +41388=>29492, +41389=>29493, +41390=>29494, +41391=>29495, +41392=>29496, +41393=>29497, +41394=>29498, +41395=>29499, +41396=>29500, +41397=>29501, +41398=>29502, +41399=>29503, +41400=>29504, +41401=>29505, +41402=>29506, +41403=>29507, +41404=>29508, +41405=>29509, +41406=>29510, +41407=>29511, +41408=>29512, +41409=>29513, +41410=>29514, +41411=>29515, +41412=>29516, +41413=>29517, +41414=>29518, +41415=>29519, +41416=>29520, +41417=>29521, +41418=>29522, +41419=>29523, +41420=>29524, +41421=>29525, +41422=>29526, +41423=>29527, +41424=>29528, +41425=>29529, +41426=>29530, +41427=>29531, +41428=>29532, +41429=>29533, +41430=>29534, +41431=>29535, +41432=>29536, +41433=>29537, +41434=>29538, +41435=>29539, +41436=>29540, +41437=>29541, +41438=>29542, +41439=>29543, +41440=>29544, +41441=>29545, +41442=>29546, +41443=>29547, +41444=>29548, +41445=>29549, +41446=>29550, +41447=>29551, +41448=>29552, +41449=>29553, +41450=>29554, +41451=>29555, +41452=>29556, +41453=>29557, +41454=>29558, +41455=>29559, +41456=>29560, +41457=>29561, +41458=>29562, +41459=>29563, +41460=>29564, +41461=>29565, +41462=>29566, +41463=>29567, +41464=>29568, +41465=>29569, +41466=>29570, +41467=>29571, +41468=>29572, +41469=>29573, +41470=>29574, +41471=>29575, +41472=>29576, +41473=>29577, +41474=>29578, +41475=>29579, +41476=>29580, +41477=>29581, +41478=>29582, +41479=>29583, +41480=>29584, +41481=>29585, +41482=>29586, +41483=>29587, +41484=>29588, +41485=>29589, +41486=>29590, +41487=>29591, +41488=>29592, +41489=>29593, +41490=>29594, +41491=>29595, +41492=>29596, +41493=>29597, +41494=>29598, +41495=>29599, +41496=>29600, +41497=>29601, +41498=>29602, +41499=>29603, +41500=>29604, +41501=>29605, +41502=>29606, +41503=>29607, +41504=>29608, +41505=>29609, +41506=>29610, +41507=>29611, +41508=>29612, +41509=>29613, +41510=>29614, +41511=>29615, +41512=>29616, +41513=>29617, +41514=>29618, +41515=>29619, +41516=>29620, +41517=>29621, +41518=>29622, +41519=>29623, +41520=>29624, +41521=>29625, +41522=>29626, +41523=>29627, +41524=>29628, +41525=>29629, +41526=>29630, +41527=>29631, +41528=>29632, +41529=>29633, +41530=>29634, +41531=>29635, +41532=>29636, +41533=>29637, +41534=>29638, +41535=>29639, +41536=>29640, +41537=>29641, +41538=>29642, +41539=>29643, +41540=>29644, +41541=>29645, +41542=>29646, +41543=>29647, +41544=>29648, +41545=>29649, +41546=>29650, +41547=>29651, +41548=>29652, +41549=>29653, +41550=>29654, +41551=>29655, +41552=>29656, +41553=>29657, +41554=>29658, +41555=>29659, +41556=>29660, +41557=>29661, +41558=>29662, +41559=>29663, +41560=>29664, +41561=>29665, +41562=>29666, +41563=>29667, +41564=>29668, +41565=>29669, +41566=>29670, +41567=>29671, +41568=>29672, +41569=>29673, +41570=>29674, +41571=>29675, +41572=>29676, +41573=>29677, +41574=>29678, +41575=>29679, +41576=>29680, +41577=>29681, +41578=>29682, +41579=>29683, +41580=>29684, +41581=>29685, +41582=>29686, +41583=>29687, +41584=>29688, +41585=>29689, +41586=>29690, +41587=>29691, +41588=>29692, +41589=>29693, +41590=>29694, +41591=>29695, +41592=>29696, +41593=>29697, +41594=>29698, +41595=>29699, +41596=>29700, +41597=>29701, +41598=>29702, +41599=>29703, +41600=>29704, +41601=>29705, +41602=>29706, +41603=>29707, +41604=>29708, +41605=>29709, +41606=>29710, +41607=>29711, +41608=>29712, +41609=>29713, +41610=>29714, +41611=>29715, +41612=>29716, +41613=>29717, +41614=>29718, +41615=>29719, +41616=>29720, +41617=>29721, +41618=>29722, +41619=>29723, +41620=>29724, +41621=>29725, +41622=>29726, +41623=>29727, +41624=>29728, +41625=>29729, +41626=>29730, +41627=>29731, +41628=>29732, +41629=>29733, +41630=>29734, +41631=>29735, +41632=>29736, +41633=>29737, +41634=>29738, +41635=>29739, +41636=>29740, +41637=>29741, +41638=>29742, +41639=>29743, +41640=>29744, +41641=>29745, +41642=>29746, +41643=>29747, +41644=>29748, +41645=>29749, +41646=>29750, +41647=>29751, +41648=>29752, +41649=>29753, +41650=>29754, +41651=>29755, +41652=>29756, +41653=>29757, +41654=>29758, +41655=>29759, +41656=>29760, +41657=>29761, +41658=>29762, +41659=>29763, +41660=>29764, +41661=>29765, +41662=>29766, +41663=>29767, +41664=>29768, +41665=>29769, +41666=>29770, +41667=>29771, +41668=>29772, +41669=>29773, +41670=>29774, +41671=>29775, +41672=>29776, +41673=>29777, +41674=>29778, +41675=>29779, +41676=>29780, +41677=>29781, +41678=>29782, +41679=>29783, +41680=>29784, +41681=>29785, +41682=>29786, +41683=>29787, +41684=>29788, +41685=>29789, +41686=>29790, +41687=>29791, +41688=>29792, +41689=>29793, +41690=>29794, +41691=>29795, +41692=>29796, +41693=>29797, +41694=>29798, +41695=>29799, +41696=>29800, +41697=>29801, +41698=>29802, +41699=>29803, +41700=>29804, +41701=>29805, +41702=>29806, +41703=>29807, +41704=>29808, +41705=>29809, +41706=>29810, +41707=>29811, +41708=>29812, +41709=>29813, +41710=>29814, +41711=>29815, +41712=>29816, +41713=>29817, +41714=>29818, +41715=>29819, +41716=>29820, +41717=>29821, +41718=>29822, +41719=>29823, +41720=>29824, +41721=>29825, +41722=>29826, +41723=>29827, +41724=>29828, +41725=>29829, +41726=>29830, +41727=>29831, +41728=>29832, +41729=>29833, +41730=>29834, +41731=>29835, +41732=>29836, +41733=>29837, +41734=>29838, +41735=>29839, +41736=>29840, +41737=>29841, +41738=>29842, +41739=>29843, +41740=>29844, +41741=>29845, +41742=>29846, +41743=>29847, +41744=>29848, +41745=>29849, +41746=>29850, +41747=>29851, +41748=>29852, +41749=>29853, +41750=>29854, +41751=>29855, +41752=>29856, +41753=>29857, +41754=>29858, +41755=>29859, +41756=>29860, +41757=>29861, +41758=>29862, +41759=>29863, +41760=>29864, +41761=>29865, +41762=>29866, +41763=>29867, +41764=>29868, +41765=>29869, +41766=>29870, +41767=>29871, +41768=>29872, +41769=>29873, +41770=>29874, +41771=>29875, +41772=>29876, +41773=>29877, +41774=>29878, +41775=>29879, +41776=>29880, +41777=>29881, +41778=>29882, +41779=>29883, +41780=>29884, +41781=>29885, +41782=>29886, +41783=>29887, +41784=>29888, +41785=>29889, +41786=>29890, +41787=>29891, +41788=>29892, +41789=>29893, +41790=>29894, +41791=>29895, +41792=>29896, +41793=>29897, +41794=>29898, +41795=>29899, +41796=>29900, +41797=>29901, +41798=>29902, +41799=>29903, +41800=>29904, +41801=>29905, +41802=>29906, +41803=>29907, +41804=>29908, +41805=>29909, +41806=>29910, +41807=>29911, +41808=>29912, +41809=>29913, +41810=>29914, +41811=>29915, +41812=>29916, +41813=>29917, +41814=>29918, +41815=>29919, +41816=>29920, +41817=>29921, +41818=>29922, +41819=>29923, +41820=>29924, +41821=>29925, +41822=>29926, +41823=>29927, +41824=>29928, +41825=>29929, +41826=>29930, +41827=>29931, +41828=>29932, +41829=>29933, +41830=>29934, +41831=>29935, +41832=>29936, +41833=>29937, +41834=>29938, +41835=>29939, +41836=>29940, +41837=>29941, +41838=>29942, +41839=>29943, +41840=>29944, +41841=>29945, +41842=>29946, +41843=>29947, +41844=>29948, +41845=>29949, +41846=>29950, +41847=>29951, +41848=>29952, +41849=>29953, +41850=>29954, +41851=>29955, +41852=>29956, +41853=>29957, +41854=>29958, +41855=>29959, +41856=>29960, +41857=>29961, +41858=>29962, +41859=>29963, +41860=>29964, +41861=>29965, +41862=>29966, +41863=>29967, +41864=>29968, +41865=>29969, +41866=>29970, +41867=>29971, +41868=>29972, +41869=>29973, +41870=>29974, +41871=>29975, +41872=>29976, +41873=>29977, +41874=>29978, +41875=>29979, +41876=>29980, +41877=>29981, +41878=>29982, +41879=>29983, +41880=>29984, +41881=>29985, +41882=>29986, +41883=>29987, +41884=>29988, +41885=>29989, +41886=>29990, +41887=>29991, +41888=>29992, +41889=>29993, +41890=>29994, +41891=>29995, +41892=>29996, +41893=>29997, +41894=>29998, +41895=>29999, +41896=>30000, +41897=>30001, +41898=>30002, +41899=>30003, +41900=>30004, +41901=>30005, +41902=>30006, +41903=>30007, +41904=>30008, +41905=>30009, +41906=>30010, +41907=>30011, +41908=>30012, +41909=>30013, +41910=>30014, +41911=>30015, +41912=>30016, +41913=>30017, +41914=>30018, +41915=>30019, +41916=>30020, +41917=>30021, +41918=>30022, +41919=>30023, +41920=>30024, +41921=>30025, +41922=>30026, +41923=>30027, +41924=>30028, +41925=>30029, +41926=>30030, +41927=>30031, +41928=>30032, +41929=>30033, +41930=>30034, +41931=>30035, +41932=>30036, +41933=>30037, +41934=>30038, +41935=>30039, +41936=>30040, +41937=>30041, +41938=>30042, +41939=>30043, +41940=>30044, +41941=>30045, +41942=>30046, +41943=>30047, +41944=>30048, +41945=>30049, +41946=>30050, +41947=>30051, +41948=>30052, +41949=>30053, +41950=>30054, +41951=>30055, +41952=>30056, +41953=>30057, +41954=>30058, +41955=>30059, +41956=>30060, +41957=>30061, +41958=>30062, +41959=>30063, +41960=>30064, +41961=>30065, +41962=>30066, +41963=>30067, +41964=>30068, +41965=>30069, +41966=>30070, +41967=>30071, +41968=>30072, +41969=>30073, +41970=>30074, +41971=>30075, +41972=>30076, +41973=>30077, +41974=>30078, +41975=>30079, +41976=>30080, +41977=>30081, +41978=>30082, +41979=>30083, +41980=>30084, +41981=>30085, +41982=>30086, +41983=>30087, +41984=>30088, +41985=>30089, +41986=>30090, +41987=>30091, +41988=>30092, +41989=>30093, +41990=>30094, +41991=>30095, +41992=>30096, +41993=>30097, +41994=>30098, +41995=>30099, +41996=>30100, +41997=>30101, +41998=>30102, +41999=>30103, +42000=>30104, +42001=>30105, +42002=>30106, +42003=>30107, +42004=>30108, +42005=>30109, +42006=>30110, +42007=>30111, +42008=>30112, +42009=>30113, +42010=>30114, +42011=>30115, +42012=>30116, +42013=>30117, +42014=>30118, +42015=>30119, +42016=>30120, +42017=>30121, +42018=>30122, +42019=>30123, +42020=>30124, +42021=>30125, +42022=>30126, +42023=>30127, +42024=>30128, +42025=>30129, +42026=>30130, +42027=>30131, +42028=>30132, +42029=>30133, +42030=>30134, +42031=>30135, +42032=>30136, +42033=>30137, +42034=>30138, +42035=>30139, +42036=>30140, +42037=>30141, +42038=>30142, +42039=>30143, +42040=>30144, +42041=>30145, +42042=>30146, +42043=>30147, +42044=>30148, +42045=>30149, +42046=>30150, +42047=>30151, +42048=>30152, +42049=>30153, +42050=>30154, +42051=>30155, +42052=>30156, +42053=>30157, +42054=>30158, +42055=>30159, +42056=>30160, +42057=>30161, +42058=>30162, +42059=>30163, +42060=>30164, +42061=>30165, +42062=>30166, +42063=>30167, +42064=>30168, +42065=>30169, +42066=>30170, +42067=>30171, +42068=>30172, +42069=>30173, +42070=>30174, +42071=>30175, +42072=>30176, +42073=>30177, +42074=>30178, +42075=>30179, +42076=>30180, +42077=>30181, +42078=>30182, +42079=>30183, +42080=>30184, +42081=>30185, +42082=>30186, +42083=>30187, +42084=>30188, +42085=>30189, +42086=>30190, +42087=>30191, +42088=>30192, +42089=>30193, +42090=>30194, +42091=>30195, +42092=>30196, +42093=>30197, +42094=>30198, +42095=>30199, +42096=>30200, +42097=>30201, +42098=>30202, +42099=>30203, +42100=>30204, +42101=>30205, +42102=>30206, +42103=>30207, +42104=>30208, +42105=>30209, +42106=>30210, +42107=>30211, +42108=>30212, +42109=>30213, +42110=>30214, +42111=>30215, +42112=>30216, +42113=>30217, +42114=>30218, +42115=>30219, +42116=>30220, +42117=>30221, +42118=>30222, +42119=>30223, +42120=>30224, +42121=>30225, +42122=>30226, +42123=>30227, +42124=>30228, +42128=>30229, +42129=>30230, +42130=>30231, +42131=>30232, +42132=>30233, +42133=>30234, +42134=>30235, +42135=>30236, +42136=>30237, +42137=>30238, +42138=>30239, +42139=>30240, +42140=>30241, +42141=>30242, +42142=>30243, +42143=>30244, +42144=>30245, +42145=>30246, +42146=>30247, +42147=>30248, +42148=>30249, +42149=>30250, +42150=>30251, +42151=>30252, +42152=>30253, +42153=>30254, +42154=>30255, +42155=>30256, +42156=>30257, +42157=>30258, +42158=>30259, +42159=>30260, +42160=>30261, +42161=>30262, +42162=>30263, +42163=>30264, +42164=>30265, +42165=>30266, +42166=>30267, +42167=>30268, +42168=>30269, +42169=>30270, +42170=>30271, +42171=>30272, +42172=>30273, +42173=>30274, +42174=>30275, +42175=>30276, +42176=>30277, +42177=>30278, +42178=>30279, +42179=>30280, +42180=>30281, +42181=>30282, +42182=>30283, +); +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/uni2cid_aj16.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/uni2cid_aj16.php new file mode 100644 index 0000000..8396e5e --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/uni2cid_aj16.php @@ -0,0 +1,15705 @@ +<?php +// unicode to cid conversion table is from +// ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/ +// cid2code.txt in aj16.tar.Z +$cidinfo['uni2cid'] = array( +160=>1, +32=>1, +33=>2, +34=>3, +35=>4, +36=>5, +37=>6, +38=>7, +39=>8, +40=>9, +41=>10, +42=>11, +43=>12, +44=>13, +8209=>14, +45=>14, +46=>15, +47=>16, +48=>17, +49=>18, +50=>19, +51=>20, +52=>21, +53=>22, +54=>23, +55=>24, +56=>25, +57=>26, +58=>27, +59=>28, +60=>29, +61=>30, +62=>31, +63=>32, +64=>33, +65=>34, +66=>35, +67=>36, +68=>37, +69=>38, +70=>39, +71=>40, +72=>41, +73=>42, +74=>43, +75=>44, +76=>45, +77=>46, +78=>47, +79=>48, +80=>49, +81=>50, +82=>51, +83=>52, +84=>53, +85=>54, +86=>55, +87=>56, +88=>57, +89=>58, +90=>59, +91=>60, +165=>61, +93=>62, +94=>63, +818=>64, +95=>64, +768=>65, +96=>65, +97=>66, +98=>67, +99=>68, +100=>69, +101=>70, +102=>71, +103=>72, +104=>73, +105=>74, +106=>75, +107=>76, +108=>77, +109=>78, +110=>79, +111=>80, +112=>81, +113=>82, +114=>83, +115=>84, +116=>85, +117=>86, +118=>87, +119=>88, +120=>89, +121=>90, +122=>91, +123=>92, +166=>93, +125=>94, +732=>95, +771=>95, +700=>96, +8217=>96, +92=>97, +699=>98, +8216=>98, +124=>99, +126=>100, +8764=>100, +161=>101, +162=>102, +163=>103, +8260=>104, +402=>105, +164=>107, +8220=>108, +171=>109, +8249=>110, +8250=>111, +64257=>112, +64258=>113, +8210=>114, +8211=>114, +183=>117, +8729=>117, +8226=>119, +8218=>120, +8222=>121, +8221=>122, +187=>123, +191=>126, +769=>127, +710=>128, +770=>128, +175=>129, +772=>129, +774=>130, +775=>131, +776=>132, +730=>133, +778=>133, +184=>134, +807=>134, +779=>135, +808=>136, +780=>137, +822=>138, +8212=>138, +198=>139, +170=>140, +321=>141, +216=>142, +338=>143, +186=>144, +230=>145, +305=>146, +322=>147, +248=>148, +339=>149, +223=>150, +173=>151, +169=>152, +172=>153, +174=>154, +178=>157, +179=>158, +181=>159, +185=>160, +188=>161, +189=>162, +190=>163, +192=>164, +193=>165, +194=>166, +195=>167, +196=>168, +197=>169, +199=>170, +200=>171, +201=>172, +202=>173, +203=>174, +204=>175, +205=>176, +206=>177, +207=>178, +208=>179, +209=>180, +210=>181, +211=>182, +212=>183, +213=>184, +214=>185, +217=>187, +218=>188, +219=>189, +220=>190, +221=>191, +222=>192, +224=>193, +225=>194, +226=>195, +227=>196, +228=>197, +229=>198, +231=>199, +232=>200, +233=>201, +234=>202, +235=>203, +236=>204, +237=>205, +238=>206, +239=>207, +240=>208, +241=>209, +242=>210, +243=>211, +244=>212, +245=>213, +246=>214, +249=>216, +250=>217, +251=>218, +252=>219, +253=>220, +254=>221, +255=>222, +352=>223, +376=>224, +381=>225, +773=>226, +8254=>226, +353=>227, +8482=>228, +382=>229, +8194=>231, +65512=>323, +65377=>327, +65378=>328, +65379=>329, +65380=>330, +65381=>331, +65382=>332, +65383=>333, +65384=>334, +65385=>335, +65386=>336, +65387=>337, +65388=>338, +65389=>339, +65390=>340, +65391=>341, +65392=>342, +65393=>343, +65394=>344, +65395=>345, +65396=>346, +65397=>347, +65398=>348, +65399=>349, +65400=>350, +65401=>351, +65402=>352, +65403=>353, +65404=>354, +65405=>355, +65406=>356, +65407=>357, +65408=>358, +65409=>359, +65410=>360, +65411=>361, +65412=>362, +65413=>363, +65414=>364, +65415=>365, +65416=>366, +65417=>367, +65418=>368, +65419=>369, +65420=>370, +65421=>371, +65422=>372, +65423=>373, +65424=>374, +65425=>375, +65426=>376, +65427=>377, +65428=>378, +65429=>379, +65430=>380, +65431=>381, +65432=>382, +65433=>383, +65434=>384, +65435=>385, +65436=>386, +65437=>387, +65438=>388, +65439=>389, +8195=>633, +12288=>633, +12289=>634, +12290=>635, +65292=>636, +65294=>637, +12539=>638, +65306=>639, +65307=>640, +65311=>641, +65281=>642, +12443=>643, +12444=>644, +180=>645, +65344=>646, +168=>647, +65342=>648, +65507=>649, +65343=>650, +12541=>651, +12542=>652, +12445=>653, +12446=>654, +12291=>655, +20189=>656, +12293=>657, +12294=>658, +12295=>659, +12540=>660, +8213=>661, +8208=>662, +65295=>663, +65340=>664, +12316=>665, +65374=>665, +8214=>666, +65372=>667, +8230=>668, +8229=>669, +65288=>674, +65289=>675, +12308=>676, +12309=>677, +65339=>678, +65341=>679, +65371=>680, +65373=>681, +12296=>682, +12297=>683, +12298=>684, +12299=>685, +12300=>686, +12301=>687, +12302=>688, +12303=>689, +12304=>690, +12305=>691, +65291=>692, +8722=>693, +65293=>693, +177=>694, +215=>695, +247=>696, +65309=>697, +8800=>698, +65308=>699, +65310=>700, +8806=>701, +8807=>702, +8734=>703, +8756=>704, +9794=>705, +9792=>706, +176=>707, +8242=>708, +8243=>709, +8451=>710, +65509=>711, +65284=>712, +65504=>713, +65505=>714, +65285=>715, +65283=>716, +65286=>717, +65290=>718, +65312=>719, +167=>720, +9734=>721, +9733=>722, +9675=>723, +9679=>724, +9678=>725, +9671=>726, +9670=>727, +9633=>728, +9632=>729, +9651=>730, +9650=>731, +9661=>732, +9660=>733, +8251=>734, +12306=>735, +8594=>736, +8592=>737, +8593=>738, +8595=>739, +12307=>740, +8712=>741, +8715=>742, +8838=>743, +8839=>744, +8834=>745, +8835=>746, +8746=>747, +8745=>748, +8743=>749, +8744=>750, +65506=>751, +8658=>752, +8660=>753, +8704=>754, +8707=>755, +8736=>756, +8869=>757, +8978=>758, +8706=>759, +8711=>760, +8801=>761, +8786=>762, +8810=>763, +8811=>764, +8730=>765, +8765=>766, +8733=>767, +8757=>768, +8747=>769, +8748=>770, +8491=>771, +8240=>772, +9839=>773, +9837=>774, +9834=>775, +8224=>776, +8225=>777, +182=>778, +9711=>779, +65296=>780, +65297=>781, +65298=>782, +65299=>783, +65300=>784, +65301=>785, +65302=>786, +65303=>787, +65304=>788, +65305=>789, +65313=>790, +65314=>791, +65315=>792, +65316=>793, +65317=>794, +65318=>795, +65319=>796, +65320=>797, +65321=>798, +65322=>799, +65323=>800, +65324=>801, +65325=>802, +65326=>803, +65327=>804, +65328=>805, +65329=>806, +65330=>807, +65331=>808, +65332=>809, +65333=>810, +65334=>811, +65335=>812, +65336=>813, +65337=>814, +65338=>815, +65345=>816, +65346=>817, +65347=>818, +65348=>819, +65349=>820, +65350=>821, +65351=>822, +65352=>823, +65353=>824, +65354=>825, +65355=>826, +65356=>827, +65357=>828, +65358=>829, +65359=>830, +65360=>831, +65361=>832, +65362=>833, +65363=>834, +65364=>835, +65365=>836, +65366=>837, +65367=>838, +65368=>839, +65369=>840, +65370=>841, +12353=>842, +12354=>843, +12355=>844, +12356=>845, +12357=>846, +12358=>847, +12359=>848, +12360=>849, +12361=>850, +12362=>851, +12363=>852, +12364=>853, +12365=>854, +12366=>855, +12367=>856, +12368=>857, +12369=>858, +12370=>859, +12371=>860, +12372=>861, +12373=>862, +12374=>863, +12375=>864, +12376=>865, +12377=>866, +12378=>867, +12379=>868, +12380=>869, +12381=>870, +12382=>871, +12383=>872, +12384=>873, +12385=>874, +12386=>875, +12387=>876, +12388=>877, +12389=>878, +12390=>879, +12391=>880, +12392=>881, +12393=>882, +12394=>883, +12395=>884, +12396=>885, +12397=>886, +12398=>887, +12399=>888, +12400=>889, +12401=>890, +12402=>891, +12403=>892, +12404=>893, +12405=>894, +12406=>895, +12407=>896, +12408=>897, +12409=>898, +12410=>899, +12411=>900, +12412=>901, +12413=>902, +12414=>903, +12415=>904, +12416=>905, +12417=>906, +12418=>907, +12419=>908, +12420=>909, +12421=>910, +12422=>911, +12423=>912, +12424=>913, +12425=>914, +12426=>915, +12427=>916, +12428=>917, +12429=>918, +12430=>919, +12431=>920, +12432=>921, +12433=>922, +12434=>923, +12435=>924, +12449=>925, +12450=>926, +12451=>927, +12452=>928, +12453=>929, +12454=>930, +12455=>931, +12456=>932, +12457=>933, +12458=>934, +12459=>935, +12460=>936, +12461=>937, +12462=>938, +12463=>939, +12464=>940, +12465=>941, +12466=>942, +12467=>943, +12468=>944, +12469=>945, +12470=>946, +12471=>947, +12472=>948, +12473=>949, +12474=>950, +12475=>951, +12476=>952, +12477=>953, +12478=>954, +12479=>955, +12480=>956, +12481=>957, +12482=>958, +12483=>959, +12484=>960, +12485=>961, +12486=>962, +12487=>963, +12488=>964, +12489=>965, +12490=>966, +12491=>967, +12492=>968, +12493=>969, +12494=>970, +12495=>971, +12496=>972, +12497=>973, +12498=>974, +12499=>975, +12500=>976, +12501=>977, +12502=>978, +12503=>979, +12504=>980, +12505=>981, +12506=>982, +12507=>983, +12508=>984, +12509=>985, +12510=>986, +12511=>987, +12512=>988, +12513=>989, +12514=>990, +12515=>991, +12516=>992, +12517=>993, +12518=>994, +12519=>995, +12520=>996, +12521=>997, +12522=>998, +12523=>999, +12524=>1000, +12525=>1001, +12526=>1002, +12527=>1003, +12528=>1004, +12529=>1005, +12530=>1006, +12531=>1007, +12532=>1008, +12533=>1009, +12534=>1010, +913=>1011, +914=>1012, +915=>1013, +916=>1014, +917=>1015, +918=>1016, +919=>1017, +920=>1018, +921=>1019, +922=>1020, +923=>1021, +924=>1022, +925=>1023, +926=>1024, +927=>1025, +928=>1026, +929=>1027, +931=>1028, +932=>1029, +933=>1030, +934=>1031, +935=>1032, +936=>1033, +937=>1034, +945=>1035, +946=>1036, +947=>1037, +948=>1038, +949=>1039, +950=>1040, +951=>1041, +952=>1042, +953=>1043, +954=>1044, +955=>1045, +956=>1046, +957=>1047, +958=>1048, +959=>1049, +960=>1050, +961=>1051, +963=>1052, +964=>1053, +965=>1054, +966=>1055, +967=>1056, +968=>1057, +969=>1058, +1040=>1059, +1041=>1060, +1042=>1061, +1043=>1062, +1044=>1063, +1045=>1064, +1025=>1065, +1046=>1066, +1047=>1067, +1048=>1068, +1049=>1069, +1050=>1070, +1051=>1071, +1052=>1072, +1053=>1073, +1054=>1074, +1055=>1075, +1056=>1076, +1057=>1077, +1058=>1078, +1059=>1079, +1060=>1080, +1061=>1081, +1062=>1082, +1063=>1083, +1064=>1084, +1065=>1085, +1066=>1086, +1067=>1087, +1068=>1088, +1069=>1089, +1070=>1090, +1071=>1091, +1072=>1092, +1073=>1093, +1074=>1094, +1075=>1095, +1076=>1096, +1077=>1097, +1105=>1098, +1078=>1099, +1079=>1100, +1080=>1101, +1081=>1102, +1082=>1103, +1083=>1104, +1084=>1105, +1085=>1106, +1086=>1107, +1087=>1108, +1088=>1109, +1089=>1110, +1090=>1111, +1091=>1112, +1092=>1113, +1093=>1114, +1094=>1115, +1095=>1116, +1096=>1117, +1097=>1118, +1098=>1119, +1099=>1120, +1100=>1121, +1101=>1122, +1102=>1123, +1103=>1124, +20124=>1125, +21782=>1126, +23043=>1127, +38463=>1128, +21696=>1129, +24859=>1130, +25384=>1131, +23030=>1132, +36898=>1133, +33909=>1134, +33564=>1135, +31312=>1136, +24746=>1137, +25569=>1138, +28197=>1139, +26093=>1140, +33894=>1141, +33446=>1142, +39925=>1143, +26771=>1144, +22311=>1145, +26017=>1146, +25201=>1147, +23451=>1148, +22992=>1149, +34427=>1150, +39156=>1151, +32098=>1152, +32190=>1153, +39822=>1154, +25110=>1155, +31903=>1156, +34999=>1157, +23433=>1158, +24245=>1159, +25353=>1160, +26263=>1161, +26696=>1162, +38343=>1163, +38797=>1164, +26447=>1165, +20197=>1166, +20234=>1167, +20301=>1168, +20381=>1169, +20553=>1170, +22258=>1171, +22839=>1172, +22996=>1173, +23041=>1174, +23561=>1175, +24799=>1176, +24847=>1177, +24944=>1178, +26131=>1179, +26885=>1180, +28858=>1181, +30031=>1182, +30064=>1183, +31227=>1184, +32173=>1185, +32239=>1186, +32963=>1187, +33806=>1188, +12176=>1189, +34915=>1189, +35586=>1190, +36949=>1191, +36986=>1192, +21307=>1193, +20117=>1194, +20133=>1195, +22495=>1196, +32946=>1197, +37057=>1198, +30959=>1199, +12032=>1200, +19968=>1200, +22769=>1201, +28322=>1202, +36920=>1203, +31282=>1204, +33576=>1205, +33419=>1206, +39983=>1207, +20801=>1208, +21360=>1209, +21693=>1210, +21729=>1211, +22240=>1212, +23035=>1213, +24341=>1214, +39154=>1215, +28139=>1216, +32996=>1217, +34093=>1218, +38498=>1219, +38512=>1220, +38560=>1221, +38907=>1222, +21515=>1223, +21491=>1224, +23431=>1225, +28879=>1226, +12155=>1227, +32701=>1227, +36802=>1228, +12204=>1229, +38632=>1229, +21359=>1230, +40284=>1231, +31418=>1232, +19985=>1233, +30867=>1234, +12165=>1235, +33276=>1235, +28198=>1236, +22040=>1237, +21764=>1238, +27421=>1239, +34074=>1240, +39995=>1241, +23013=>1242, +21417=>1243, +28006=>1244, +12128=>1245, +29916=>1245, +38287=>1246, +22082=>1247, +20113=>1248, +36939=>1249, +38642=>1250, +33615=>1251, +39180=>1252, +21473=>1253, +21942=>1254, +23344=>1255, +24433=>1256, +26144=>1257, +26355=>1258, +26628=>1259, +27704=>1260, +27891=>1261, +27945=>1262, +29787=>1263, +30408=>1264, +31310=>1265, +38964=>1266, +33521=>1267, +34907=>1268, +35424=>1269, +37613=>1270, +28082=>1271, +30123=>1272, +30410=>1273, +39365=>1274, +24742=>1275, +35585=>1276, +36234=>1277, +38322=>1278, +27022=>1279, +21421=>1280, +20870=>1281, +22290=>1282, +22576=>1283, +22852=>1284, +23476=>1285, +24310=>1286, +24616=>1287, +25513=>1288, +25588=>1289, +27839=>1290, +28436=>1291, +28814=>1292, +28948=>1293, +29017=>1294, +29141=>1295, +29503=>1296, +32257=>1297, +33398=>1298, +33489=>1299, +34199=>1300, +36960=>1301, +37467=>1302, +40219=>1303, +22633=>1304, +26044=>1305, +27738=>1306, +29989=>1307, +20985=>1308, +22830=>1309, +22885=>1310, +24448=>1311, +24540=>1312, +25276=>1313, +26106=>1314, +27178=>1315, +27431=>1316, +27572=>1317, +29579=>1318, +32705=>1319, +35158=>1320, +40236=>1321, +40206=>1322, +12009=>1323, +40644=>1323, +23713=>1324, +27798=>1325, +33659=>1326, +20740=>1327, +23627=>1328, +25014=>1329, +33222=>1330, +26742=>1331, +29281=>1332, +12036=>1333, +20057=>1333, +20474=>1334, +21368=>1335, +24681=>1336, +28201=>1337, +31311=>1338, +12211=>1339, +38899=>1339, +19979=>1340, +21270=>1341, +20206=>1342, +20309=>1343, +20285=>1344, +20385=>1345, +20339=>1346, +21152=>1347, +21487=>1348, +22025=>1349, +22799=>1350, +23233=>1351, +23478=>1352, +23521=>1353, +31185=>1354, +26247=>1355, +26524=>1356, +26550=>1357, +27468=>1358, +27827=>1359, +12117=>1360, +28779=>1360, +29634=>1361, +31117=>1362, +12146=>1363, +31166=>1363, +31292=>1364, +31623=>1365, +33457=>1366, +33499=>1367, +33540=>1368, +33655=>1369, +33775=>1370, +33747=>1371, +34662=>1372, +35506=>1373, +22057=>1374, +36008=>1375, +36838=>1376, +36942=>1377, +38686=>1378, +34442=>1379, +20420=>1380, +23784=>1381, +25105=>1382, +12123=>1383, +29273=>1383, +30011=>1384, +33253=>1385, +33469=>1386, +34558=>1387, +36032=>1388, +38597=>1389, +39187=>1390, +39381=>1391, +20171=>1392, +20250=>1393, +35299=>1394, +22238=>1395, +22602=>1396, +22730=>1397, +24315=>1398, +24555=>1399, +24618=>1400, +24724=>1401, +24674=>1402, +25040=>1403, +25106=>1404, +25296=>1405, +25913=>1406, +39745=>1407, +26214=>1408, +26800=>1409, +28023=>1410, +28784=>1411, +30028=>1412, +30342=>1413, +32117=>1414, +33445=>1415, +34809=>1416, +38283=>1417, +38542=>1418, +12185=>1419, +35997=>1419, +20977=>1420, +21182=>1421, +22806=>1422, +21683=>1423, +23475=>1424, +23830=>1425, +24936=>1426, +27010=>1427, +28079=>1428, +30861=>1429, +33995=>1430, +34903=>1431, +35442=>1432, +37799=>1433, +39608=>1434, +28012=>1435, +39336=>1436, +34521=>1437, +22435=>1438, +26623=>1439, +34510=>1440, +37390=>1441, +21123=>1442, +22151=>1443, +21508=>1444, +24275=>1445, +25313=>1446, +25785=>1447, +26684=>1448, +26680=>1449, +27579=>1450, +29554=>1451, +30906=>1452, +31339=>1453, +35226=>1454, +12179=>1455, +35282=>1455, +36203=>1456, +36611=>1457, +37101=>1458, +38307=>1459, +38548=>1460, +12208=>1461, +38761=>1461, +23398=>1462, +23731=>1463, +27005=>1464, +38989=>1465, +38990=>1466, +25499=>1467, +31520=>1468, +27179=>1469, +27263=>1470, +26806=>1471, +39949=>1472, +28511=>1473, +21106=>1474, +21917=>1475, +24688=>1476, +25324=>1477, +27963=>1478, +28167=>1479, +28369=>1480, +33883=>1481, +35088=>1482, +36676=>1483, +19988=>1484, +39993=>1485, +21494=>1486, +26907=>1487, +27194=>1488, +38788=>1489, +26666=>1490, +20828=>1491, +31427=>1492, +33970=>1493, +37340=>1494, +37772=>1495, +22107=>1496, +40232=>1497, +26658=>1498, +33541=>1499, +33841=>1500, +31909=>1501, +21000=>1502, +33477=>1503, +12129=>1504, +29926=>1504, +20094=>1505, +20355=>1506, +20896=>1507, +23506=>1508, +21002=>1509, +21208=>1510, +21223=>1511, +24059=>1512, +21914=>1513, +22570=>1514, +23014=>1515, +23436=>1516, +23448=>1517, +23515=>1518, +12082=>1519, +24178=>1519, +24185=>1520, +24739=>1521, +24863=>1522, +24931=>1523, +25022=>1524, +25563=>1525, +25954=>1526, +26577=>1527, +26707=>1528, +26874=>1529, +27454=>1530, +27475=>1531, +27735=>1532, +28450=>1533, +28567=>1534, +28485=>1535, +29872=>1536, +12130=>1537, +29976=>1537, +30435=>1538, +30475=>1539, +31487=>1540, +31649=>1541, +31777=>1542, +32233=>1543, +12152=>1544, +32566=>1544, +32752=>1545, +32925=>1546, +33382=>1547, +33694=>1548, +35251=>1549, +35532=>1550, +36011=>1551, +36996=>1552, +37969=>1553, +38291=>1554, +38289=>1555, +38306=>1556, +38501=>1557, +38867=>1558, +39208=>1559, +33304=>1560, +20024=>1561, +21547=>1562, +23736=>1563, +24012=>1564, +29609=>1565, +30284=>1566, +30524=>1567, +23721=>1568, +32747=>1569, +36107=>1570, +38593=>1571, +38929=>1572, +38996=>1573, +39000=>1574, +20225=>1575, +20238=>1576, +21361=>1577, +21916=>1578, +22120=>1579, +22522=>1580, +22855=>1581, +23305=>1582, +23492=>1583, +23696=>1584, +24076=>1585, +24190=>1586, +24524=>1587, +25582=>1588, +26426=>1589, +26071=>1590, +26082=>1591, +26399=>1592, +26827=>1593, +26820=>1594, +27231=>1595, +24112=>1596, +27589=>1597, +27671=>1598, +27773=>1599, +30079=>1600, +31048=>1601, +23395=>1602, +31232=>1603, +32000=>1604, +24509=>1605, +35215=>1606, +35352=>1607, +36020=>1608, +36215=>1609, +36556=>1610, +36637=>1611, +39138=>1612, +39438=>1613, +12004=>1614, +12225=>1614, +39740=>1614, +12018=>1615, +20096=>1615, +20605=>1616, +20736=>1617, +22931=>1618, +23452=>1619, +25135=>1620, +25216=>1621, +25836=>1622, +27450=>1623, +29344=>1624, +30097=>1625, +31047=>1626, +32681=>1627, +34811=>1628, +35516=>1629, +35696=>1630, +25516=>1631, +33738=>1632, +38816=>1633, +21513=>1634, +21507=>1635, +21931=>1636, +26708=>1637, +27224=>1638, +35440=>1639, +30759=>1640, +26485=>1641, +12233=>1642, +40653=>1642, +21364=>1643, +23458=>1644, +33050=>1645, +34384=>1646, +36870=>1647, +19992=>1648, +20037=>1649, +20167=>1650, +20241=>1651, +21450=>1652, +21560=>1653, +23470=>1654, +12088=>1655, +24339=>1655, +24613=>1656, +25937=>1657, +26429=>1658, +27714=>1659, +27762=>1660, +27875=>1661, +28792=>1662, +29699=>1663, +31350=>1664, +31406=>1665, +31496=>1666, +32026=>1667, +31998=>1668, +32102=>1669, +26087=>1670, +12124=>1671, +29275=>1671, +21435=>1672, +23621=>1673, +24040=>1674, +25298=>1675, +25312=>1676, +25369=>1677, +28192=>1678, +34394=>1679, +35377=>1680, +36317=>1681, +37624=>1682, +28417=>1683, +31142=>1684, +12226=>1685, +39770=>1685, +20136=>1686, +20139=>1687, +20140=>1688, +20379=>1689, +20384=>1690, +20689=>1691, +20807=>1692, +31478=>1693, +20849=>1694, +20982=>1695, +21332=>1696, +21281=>1697, +21375=>1698, +21483=>1699, +21932=>1700, +22659=>1701, +23777=>1702, +24375=>1703, +24394=>1704, +24623=>1705, +24656=>1706, +24685=>1707, +25375=>1708, +25945=>1709, +27211=>1710, +27841=>1711, +29378=>1712, +29421=>1713, +30703=>1714, +33016=>1715, +33029=>1716, +33288=>1717, +34126=>1718, +37111=>1719, +37857=>1720, +38911=>1721, +39255=>1722, +39514=>1723, +20208=>1724, +20957=>1725, +23597=>1726, +26241=>1727, +26989=>1728, +23616=>1729, +26354=>1730, +26997=>1731, +12127=>1732, +29577=>1732, +26704=>1733, +31873=>1734, +20677=>1735, +21220=>1736, +22343=>1737, +12081=>1738, +24062=>1738, +37670=>1739, +12100=>1740, +26020=>1740, +27427=>1741, +27453=>1742, +29748=>1743, +31105=>1744, +31165=>1745, +31563=>1746, +32202=>1747, +33465=>1748, +33740=>1749, +34943=>1750, +35167=>1751, +35641=>1752, +36817=>1753, +12198=>1754, +37329=>1754, +21535=>1755, +37504=>1756, +20061=>1757, +20534=>1758, +21477=>1759, +21306=>1760, +29399=>1761, +29590=>1762, +30697=>1763, +33510=>1764, +36527=>1765, +39366=>1766, +39368=>1767, +39378=>1768, +20855=>1769, +24858=>1770, +34398=>1771, +21936=>1772, +31354=>1773, +20598=>1774, +23507=>1775, +36935=>1776, +38533=>1777, +20018=>1778, +27355=>1779, +37351=>1780, +23633=>1781, +23624=>1782, +25496=>1783, +31391=>1784, +27795=>1785, +38772=>1786, +36705=>1787, +31402=>1788, +29066=>1789, +38536=>1790, +31874=>1791, +26647=>1792, +32368=>1793, +26705=>1794, +37740=>1795, +21234=>1796, +21531=>1797, +34219=>1798, +35347=>1799, +32676=>1800, +36557=>1801, +37089=>1802, +21350=>1803, +34952=>1804, +31041=>1805, +20418=>1806, +20670=>1807, +21009=>1808, +20804=>1809, +21843=>1810, +22317=>1811, +29674=>1812, +22411=>1813, +22865=>1814, +24418=>1815, +24452=>1816, +24693=>1817, +24950=>1818, +24935=>1819, +25001=>1820, +25522=>1821, +25658=>1822, +25964=>1823, +26223=>1824, +26690=>1825, +28179=>1826, +30054=>1827, +31293=>1828, +31995=>1829, +32076=>1830, +32153=>1831, +32331=>1832, +32619=>1833, +33550=>1834, +33610=>1835, +34509=>1836, +35336=>1837, +35427=>1838, +35686=>1839, +36605=>1840, +38938=>1841, +40335=>1842, +33464=>1843, +36814=>1844, +39912=>1845, +21127=>1846, +25119=>1847, +25731=>1848, +28608=>1849, +38553=>1850, +26689=>1851, +20625=>1852, +12107=>1853, +27424=>1853, +27770=>1854, +28500=>1855, +12147=>1856, +31348=>1856, +32080=>1857, +12174=>1858, +34880=>1858, +35363=>1859, +12105=>1860, +26376=>1860, +20214=>1861, +20537=>1862, +20518=>1863, +20581=>1864, +20860=>1865, +21048=>1866, +21091=>1867, +21927=>1868, +22287=>1869, +22533=>1870, +23244=>1871, +24314=>1872, +25010=>1873, +25080=>1874, +25331=>1875, +25458=>1876, +26908=>1877, +27177=>1878, +29309=>1879, +12125=>1880, +29356=>1880, +29486=>1881, +30740=>1882, +30831=>1883, +32121=>1884, +30476=>1885, +32937=>1886, +12178=>1887, +35211=>1887, +35609=>1888, +36066=>1889, +36562=>1890, +36963=>1891, +37749=>1892, +38522=>1893, +38997=>1894, +39443=>1895, +40568=>1896, +20803=>1897, +21407=>1898, +21427=>1899, +24187=>1900, +24358=>1901, +28187=>1902, +28304=>1903, +12126=>1904, +29572=>1904, +29694=>1905, +32067=>1906, +33335=>1907, +12180=>1908, +35328=>1908, +35578=>1909, +38480=>1910, +20046=>1911, +20491=>1912, +21476=>1913, +21628=>1914, +22266=>1915, +22993=>1916, +23396=>1917, +12080=>1918, +24049=>1918, +24235=>1919, +24359=>1920, +12094=>1921, +25144=>1921, +25925=>1922, +26543=>1923, +28246=>1924, +29392=>1925, +31946=>1926, +34996=>1927, +32929=>1928, +32993=>1929, +33776=>1930, +11969=>1931, +34382=>1931, +35463=>1932, +36328=>1933, +37431=>1934, +38599=>1935, +39015=>1936, +12238=>1937, +40723=>1937, +20116=>1938, +20114=>1939, +20237=>1940, +21320=>1941, +21577=>1942, +21566=>1943, +23087=>1944, +24460=>1945, +24481=>1946, +24735=>1947, +26791=>1948, +27278=>1949, +29786=>1950, +30849=>1951, +35486=>1952, +35492=>1953, +35703=>1954, +37264=>1955, +20062=>1956, +39881=>1957, +20132=>1958, +20348=>1959, +20399=>1960, +20505=>1961, +20502=>1962, +20809=>1963, +20844=>1964, +21151=>1965, +21177=>1966, +21246=>1967, +21402=>1968, +12061=>1969, +21475=>1969, +21521=>1970, +21518=>1971, +21897=>1972, +22353=>1973, +22434=>1974, +22909=>1975, +23380=>1976, +23389=>1977, +23439=>1978, +12079=>1979, +24037=>1979, +24039=>1980, +24055=>1981, +24184=>1982, +24195=>1983, +24218=>1984, +24247=>1985, +24344=>1986, +24658=>1987, +24908=>1988, +25239=>1989, +25304=>1990, +25511=>1991, +25915=>1992, +26114=>1993, +26179=>1994, +26356=>1995, +26477=>1996, +26657=>1997, +26775=>1998, +27083=>1999, +27743=>2000, +27946=>2001, +28009=>2002, +28207=>2003, +28317=>2004, +30002=>2005, +30343=>2006, +30828=>2007, +31295=>2008, +31968=>2009, +32005=>2010, +32024=>2011, +32094=>2012, +32177=>2013, +32789=>2014, +32771=>2015, +32943=>2016, +32945=>2017, +33108=>2018, +33167=>2019, +33322=>2020, +33618=>2021, +12175=>2022, +34892=>2022, +34913=>2023, +35611=>2024, +36002=>2025, +36092=>2026, +37066=>2027, +37237=>2028, +37489=>2029, +30783=>2030, +37628=>2031, +38308=>2032, +38477=>2033, +38917=>2034, +12217=>2035, +39321=>2035, +12220=>2036, +39640=>2036, +40251=>2037, +21083=>2038, +21163=>2039, +21495=>2040, +21512=>2041, +22741=>2042, +25335=>2043, +28640=>2044, +35946=>2045, +36703=>2046, +40633=>2047, +20811=>2048, +21051=>2049, +21578=>2050, +22269=>2051, +31296=>2052, +37239=>2053, +40288=>2054, +12234=>2055, +40658=>2055, +29508=>2056, +28425=>2057, +33136=>2058, +29969=>2059, +24573=>2060, +24794=>2061, +12219=>2062, +39592=>2062, +29403=>2063, +36796=>2064, +27492=>2065, +38915=>2066, +20170=>2067, +22256=>2068, +22372=>2069, +22718=>2070, +23130=>2071, +24680=>2072, +25031=>2073, +26127=>2074, +26118=>2075, +26681=>2076, +26801=>2077, +28151=>2078, +30165=>2079, +32058=>2080, +12169=>2081, +33390=>2081, +39746=>2082, +20123=>2083, +20304=>2084, +21449=>2085, +21766=>2086, +23919=>2087, +24038=>2088, +24046=>2089, +26619=>2090, +27801=>2091, +29811=>2092, +30722=>2093, +35408=>2094, +37782=>2095, +35039=>2096, +22352=>2097, +24231=>2098, +25387=>2099, +20661=>2100, +20652=>2101, +20877=>2102, +26368=>2103, +21705=>2104, +22622=>2105, +22971=>2106, +23472=>2107, +24425=>2108, +25165=>2109, +25505=>2110, +26685=>2111, +27507=>2112, +28168=>2113, +28797=>2114, +37319=>2115, +29312=>2116, +30741=>2117, +30758=>2118, +31085=>2119, +25998=>2120, +32048=>2121, +33756=>2122, +35009=>2123, +36617=>2124, +38555=>2125, +21092=>2126, +22312=>2127, +26448=>2128, +32618=>2129, +36001=>2130, +20916=>2131, +22338=>2132, +38442=>2133, +22586=>2134, +27018=>2135, +32948=>2136, +21682=>2137, +23822=>2138, +22524=>2139, +30869=>2140, +40442=>2141, +20316=>2142, +21066=>2143, +21643=>2144, +25662=>2145, +26152=>2146, +26388=>2147, +26613=>2148, +31364=>2149, +31574=>2150, +32034=>2151, +37679=>2152, +26716=>2153, +39853=>2154, +31545=>2155, +21273=>2156, +20874=>2157, +21047=>2158, +23519=>2159, +25334=>2160, +25774=>2161, +25830=>2162, +26413=>2163, +27578=>2164, +34217=>2165, +38609=>2166, +30352=>2167, +39894=>2168, +25420=>2169, +37638=>2170, +39851=>2171, +12139=>2172, +30399=>2172, +26194=>2173, +19977=>2174, +20632=>2175, +21442=>2176, +12077=>2177, +23665=>2177, +24808=>2178, +25746=>2179, +25955=>2180, +26719=>2181, +29158=>2182, +29642=>2183, +29987=>2184, +31639=>2185, +32386=>2186, +34453=>2187, +35715=>2188, +36059=>2189, +37240=>2190, +39184=>2191, +26028=>2192, +26283=>2193, +27531=>2194, +20181=>2195, +20180=>2196, +20282=>2197, +20351=>2198, +21050=>2199, +21496=>2200, +21490=>2201, +21987=>2202, +22235=>2203, +12064=>2204, +22763=>2204, +22987=>2205, +22985=>2206, +23039=>2207, +12070=>2208, +23376=>2208, +23629=>2209, +24066=>2210, +24107=>2211, +24535=>2212, +24605=>2213, +25351=>2214, +12096=>2215, +25903=>2215, +23388=>2216, +26031=>2217, +26045=>2218, +26088=>2219, +26525=>2220, +12108=>2221, +27490=>2221, +27515=>2222, +12114=>2223, +27663=>2223, +29509=>2224, +31049=>2225, +31169=>2226, +12151=>2227, +31992=>2227, +32025=>2228, +32043=>2229, +32930=>2230, +33026=>2231, +12164=>2232, +33267=>2232, +35222=>2233, +35422=>2234, +35433=>2235, +35430=>2236, +35468=>2237, +35566=>2238, +36039=>2239, +36060=>2240, +38604=>2241, +39164=>2242, +12013=>2243, +27503=>2243, +20107=>2244, +20284=>2245, +20365=>2246, +20816=>2247, +23383=>2248, +23546=>2249, +24904=>2250, +25345=>2251, +26178=>2252, +27425=>2253, +28363=>2254, +27835=>2255, +29246=>2256, +29885=>2257, +30164=>2258, +30913=>2259, +12144=>2260, +31034=>2260, +12157=>2261, +32780=>2261, +12159=>2262, +32819=>2262, +12163=>2263, +33258=>2263, +33940=>2264, +36766=>2265, +27728=>2266, +12229=>2267, +40575=>2267, +24335=>2268, +35672=>2269, +40235=>2270, +31482=>2271, +36600=>2272, +23437=>2273, +38635=>2274, +19971=>2275, +21489=>2276, +22519=>2277, +22833=>2278, +23241=>2279, +23460=>2280, +24713=>2281, +28287=>2282, +28422=>2283, +30142=>2284, +36074=>2285, +23455=>2286, +34048=>2287, +31712=>2288, +20594=>2289, +26612=>2290, +33437=>2291, +23649=>2292, +34122=>2293, +32286=>2294, +33294=>2295, +20889=>2296, +23556=>2297, +25448=>2298, +36198=>2299, +26012=>2300, +29038=>2301, +31038=>2302, +32023=>2303, +32773=>2304, +35613=>2305, +12190=>2306, +36554=>2306, +36974=>2307, +34503=>2308, +37034=>2309, +20511=>2310, +21242=>2311, +23610=>2312, +26451=>2313, +28796=>2314, +29237=>2315, +37196=>2316, +37320=>2317, +37675=>2318, +33509=>2319, +23490=>2320, +24369=>2321, +24825=>2322, +20027=>2323, +21462=>2324, +23432=>2325, +12095=>2326, +25163=>2326, +26417=>2327, +27530=>2328, +29417=>2329, +29664=>2330, +31278=>2331, +33131=>2332, +36259=>2333, +37202=>2334, +12216=>2335, +39318=>2335, +20754=>2336, +21463=>2337, +21610=>2338, +23551=>2339, +25480=>2340, +27193=>2341, +32172=>2342, +38656=>2343, +22234=>2344, +21454=>2345, +21608=>2346, +23447=>2347, +23601=>2348, +24030=>2349, +20462=>2350, +24833=>2351, +25342=>2352, +27954=>2353, +31168=>2354, +31179=>2355, +32066=>2356, +32333=>2357, +32722=>2358, +33261=>2359, +12168=>2360, +33311=>2360, +33936=>2361, +34886=>2362, +35186=>2363, +35728=>2364, +36468=>2365, +36655=>2366, +36913=>2367, +37195=>2368, +37228=>2369, +38598=>2370, +37276=>2371, +20160=>2372, +20303=>2373, +20805=>2374, +12055=>2375, +21313=>2375, +24467=>2376, +25102=>2377, +26580=>2378, +27713=>2379, +28171=>2380, +29539=>2381, +32294=>2382, +37325=>2383, +37507=>2384, +21460=>2385, +22809=>2386, +23487=>2387, +28113=>2388, +31069=>2389, +32302=>2390, +31899=>2391, +22654=>2392, +29087=>2393, +20986=>2394, +34899=>2395, +36848=>2396, +20426=>2397, +23803=>2398, +26149=>2399, +30636=>2400, +31459=>2401, +33308=>2402, +39423=>2403, +20934=>2404, +24490=>2405, +26092=>2406, +26991=>2407, +27529=>2408, +28147=>2409, +28310=>2410, +28516=>2411, +30462=>2412, +32020=>2413, +24033=>2414, +36981=>2415, +37255=>2416, +38918=>2417, +20966=>2418, +21021=>2419, +25152=>2420, +26257=>2421, +26329=>2422, +28186=>2423, +24246=>2424, +32210=>2425, +32626=>2426, +26360=>2427, +34223=>2428, +34295=>2429, +35576=>2430, +21161=>2431, +21465=>2432, +12069=>2433, +22899=>2433, +24207=>2434, +24464=>2435, +24661=>2436, +37604=>2437, +38500=>2438, +20663=>2439, +20767=>2440, +21213=>2441, +21280=>2442, +21319=>2443, +21484=>2444, +21736=>2445, +21830=>2446, +21809=>2447, +22039=>2448, +22888=>2449, +22974=>2450, +23100=>2451, +23477=>2452, +23558=>2453, +12073=>2454, +23567=>2454, +23569=>2455, +23578=>2456, +24196=>2457, +24202=>2458, +24288=>2459, +24432=>2460, +25215=>2461, +25220=>2462, +25307=>2463, +25484=>2464, +25463=>2465, +26119=>2466, +26124=>2467, +26157=>2468, +26230=>2469, +26494=>2470, +26786=>2471, +27167=>2472, +27189=>2473, +27836=>2474, +28040=>2475, +28169=>2476, +28248=>2477, +28988=>2478, +28966=>2479, +29031=>2480, +30151=>2481, +30465=>2482, +30813=>2483, +30977=>2484, +31077=>2485, +31216=>2486, +31456=>2487, +31505=>2488, +31911=>2489, +32057=>2490, +32918=>2491, +33750=>2492, +33931=>2493, +34121=>2494, +34909=>2495, +35059=>2496, +35359=>2497, +35388=>2498, +35412=>2499, +35443=>2500, +35937=>2501, +36062=>2502, +37284=>2503, +37478=>2504, +37758=>2505, +37912=>2506, +38556=>2507, +38808=>2508, +19978=>2509, +19976=>2510, +19998=>2511, +20055=>2512, +20887=>2513, +21104=>2514, +22478=>2515, +22580=>2516, +22732=>2517, +23330=>2518, +24120=>2519, +24773=>2520, +25854=>2521, +26465=>2522, +26454=>2523, +27972=>2524, +29366=>2525, +30067=>2526, +31331=>2527, +33976=>2528, +35698=>2529, +37304=>2530, +37664=>2531, +22065=>2532, +22516=>2533, +39166=>2534, +25325=>2535, +26893=>2536, +27542=>2537, +29165=>2538, +32340=>2539, +32887=>2540, +12170=>2541, +33394=>2541, +35302=>2542, +12215=>2543, +39135=>2543, +34645=>2544, +36785=>2545, +23611=>2546, +20280=>2547, +20449=>2548, +20405=>2549, +21767=>2550, +23072=>2551, +23517=>2552, +23529=>2553, +12092=>2554, +24515=>2554, +24910=>2555, +25391=>2556, +26032=>2557, +26187=>2558, +26862=>2559, +27035=>2560, +28024=>2561, +28145=>2562, +30003=>2563, +30137=>2564, +30495=>2565, +31070=>2566, +31206=>2567, +32051=>2568, +12162=>2569, +33251=>2569, +33455=>2570, +34218=>2571, +35242=>2572, +35386=>2573, +12189=>2574, +36523=>2574, +12191=>2575, +36763=>2575, +36914=>2576, +37341=>2577, +38663=>2578, +12040=>2579, +20154=>2579, +20161=>2580, +20995=>2581, +22645=>2582, +22764=>2583, +23563=>2584, +29978=>2585, +23613=>2586, +33102=>2587, +35338=>2588, +36805=>2589, +38499=>2590, +38765=>2591, +31525=>2592, +35535=>2593, +38920=>2594, +37218=>2595, +22259=>2596, +21416=>2597, +36887=>2598, +21561=>2599, +22402=>2600, +24101=>2601, +25512=>2602, +12116=>2603, +27700=>2603, +28810=>2604, +30561=>2605, +31883=>2606, +32736=>2607, +34928=>2608, +36930=>2609, +37204=>2610, +37648=>2611, +37656=>2612, +38543=>2613, +29790=>2614, +39620=>2615, +23815=>2616, +23913=>2617, +25968=>2618, +26530=>2619, +36264=>2620, +38619=>2621, +25454=>2622, +26441=>2623, +26905=>2624, +33733=>2625, +38935=>2626, +38592=>2627, +35070=>2628, +28548=>2629, +25722=>2630, +12072=>2631, +23544=>2631, +19990=>2632, +28716=>2633, +30045=>2634, +26159=>2635, +20932=>2636, +21046=>2637, +21218=>2638, +22995=>2639, +24449=>2640, +24615=>2641, +25104=>2642, +25919=>2643, +25972=>2644, +26143=>2645, +26228=>2646, +26866=>2647, +26646=>2648, +27491=>2649, +28165=>2650, +29298=>2651, +12131=>2652, +29983=>2652, +30427=>2653, +31934=>2654, +32854=>2655, +22768=>2656, +35069=>2657, +11972=>2658, +35199=>2658, +35488=>2659, +35475=>2660, +35531=>2661, +36893=>2662, +37266=>2663, +11992=>2664, +38738=>2664, +38745=>2665, +12011=>2666, +25993=>2666, +31246=>2667, +33030=>2668, +38587=>2669, +24109=>2670, +24796=>2671, +25114=>2672, +26021=>2673, +26132=>2674, +26512=>2675, +12143=>2676, +30707=>2676, +31309=>2677, +31821=>2678, +32318=>2679, +33034=>2680, +36012=>2681, +12186=>2682, +36196=>2682, +36321=>2683, +36447=>2684, +30889=>2685, +20999=>2686, +25305=>2687, +25509=>2688, +25666=>2689, +25240=>2690, +35373=>2691, +31363=>2692, +31680=>2693, +35500=>2694, +38634=>2695, +32118=>2696, +12166=>2697, +33292=>2697, +34633=>2698, +20185=>2699, +20808=>2700, +21315=>2701, +21344=>2702, +23459=>2703, +23554=>2704, +23574=>2705, +24029=>2706, +25126=>2707, +25159=>2708, +25776=>2709, +26643=>2710, +26676=>2711, +27849=>2712, +27973=>2713, +27927=>2714, +26579=>2715, +28508=>2716, +29006=>2717, +29053=>2718, +26059=>2719, +31359=>2720, +31661=>2721, +32218=>2722, +32330=>2723, +32680=>2724, +33146=>2725, +12167=>2726, +33307=>2726, +33337=>2727, +34214=>2728, +35438=>2729, +36046=>2730, +36341=>2731, +36984=>2732, +36983=>2733, +37549=>2734, +37521=>2735, +38275=>2736, +39854=>2737, +21069=>2738, +21892=>2739, +28472=>2740, +28982=>2741, +20840=>2742, +31109=>2743, +32341=>2744, +33203=>2745, +31950=>2746, +22092=>2747, +22609=>2748, +23720=>2749, +25514=>2750, +26366=>2751, +26365=>2752, +26970=>2753, +29401=>2754, +30095=>2755, +30094=>2756, +30990=>2757, +31062=>2758, +31199=>2759, +31895=>2760, +32032=>2761, +32068=>2762, +34311=>2763, +35380=>2764, +38459=>2765, +36961=>2766, +12239=>2767, +40736=>2767, +20711=>2768, +21109=>2769, +21452=>2770, +21474=>2771, +20489=>2772, +21930=>2773, +22766=>2774, +22863=>2775, +29245=>2776, +23435=>2777, +23652=>2778, +21277=>2779, +24803=>2780, +24819=>2781, +25436=>2782, +25475=>2783, +25407=>2784, +25531=>2785, +25805=>2786, +26089=>2787, +26361=>2788, +24035=>2789, +27085=>2790, +27133=>2791, +28437=>2792, +29157=>2793, +20105=>2794, +30185=>2795, +30456=>2796, +31379=>2797, +31967=>2798, +32207=>2799, +32156=>2800, +32865=>2801, +33609=>2802, +33624=>2803, +33900=>2804, +33980=>2805, +34299=>2806, +35013=>2807, +12187=>2808, +36208=>2808, +36865=>2809, +36973=>2810, +37783=>2811, +38684=>2812, +39442=>2813, +20687=>2814, +22679=>2815, +24974=>2816, +33235=>2817, +34101=>2818, +36104=>2819, +36896=>2820, +20419=>2821, +20596=>2822, +21063=>2823, +21363=>2824, +24687=>2825, +25417=>2826, +26463=>2827, +28204=>2828, +12188=>2829, +36275=>2829, +36895=>2830, +20439=>2831, +23646=>2832, +36042=>2833, +26063=>2834, +32154=>2835, +21330=>2836, +34966=>2837, +20854=>2838, +25539=>2839, +23384=>2840, +23403=>2841, +23562=>2842, +25613=>2843, +26449=>2844, +36956=>2845, +20182=>2846, +22810=>2847, +22826=>2848, +27760=>2849, +35409=>2850, +21822=>2851, +22549=>2852, +22949=>2853, +24816=>2854, +25171=>2855, +26561=>2856, +33333=>2857, +26965=>2858, +38464=>2859, +39364=>2860, +39464=>2861, +20307=>2862, +22534=>2863, +23550=>2864, +32784=>2865, +23729=>2866, +24111=>2867, +24453=>2868, +24608=>2869, +24907=>2870, +25140=>2871, +26367=>2872, +27888=>2873, +28382=>2874, +32974=>2875, +33151=>2876, +33492=>2877, +34955=>2878, +36024=>2879, +36864=>2880, +36910=>2881, +38538=>2882, +40667=>2883, +39899=>2884, +20195=>2885, +21488=>2886, +12068=>2887, +22823=>2887, +31532=>2888, +37261=>2889, +38988=>2890, +40441=>2891, +28381=>2892, +28711=>2893, +21331=>2894, +21828=>2895, +23429=>2896, +25176=>2897, +25246=>2898, +25299=>2899, +27810=>2900, +28655=>2901, +29730=>2902, +35351=>2903, +37944=>2904, +28609=>2905, +35582=>2906, +33592=>2907, +20967=>2908, +34552=>2909, +21482=>2910, +21481=>2911, +20294=>2912, +36948=>2913, +12192=>2914, +36784=>2914, +22890=>2915, +33073=>2916, +24061=>2917, +31466=>2918, +36799=>2919, +26842=>2920, +12181=>2921, +35895=>2921, +29432=>2922, +40008=>2923, +27197=>2924, +35504=>2925, +20025=>2926, +21336=>2927, +22022=>2928, +22374=>2929, +25285=>2930, +25506=>2931, +26086=>2932, +27470=>2933, +28129=>2934, +28251=>2935, +28845=>2936, +30701=>2937, +31471=>2938, +31658=>2939, +32187=>2940, +32829=>2941, +32966=>2942, +34507=>2943, +35477=>2944, +37723=>2945, +22243=>2946, +22727=>2947, +24382=>2948, +26029=>2949, +26262=>2950, +27264=>2951, +27573=>2952, +30007=>2953, +35527=>2954, +20516=>2955, +30693=>2956, +22320=>2957, +24347=>2958, +24677=>2959, +26234=>2960, +27744=>2961, +30196=>2962, +31258=>2963, +32622=>2964, +33268=>2965, +34584=>2966, +36933=>2967, +39347=>2968, +31689=>2969, +30044=>2970, +12149=>2971, +31481=>2971, +31569=>2972, +33988=>2973, +36880=>2974, +31209=>2975, +31378=>2976, +33590=>2977, +23265=>2978, +30528=>2979, +20013=>2980, +20210=>2981, +23449=>2982, +24544=>2983, +25277=>2984, +26172=>2985, +26609=>2986, +27880=>2987, +12173=>2988, +34411=>2988, +34935=>2989, +35387=>2990, +37198=>2991, +37619=>2992, +39376=>2993, +27159=>2994, +28710=>2995, +29482=>2996, +33511=>2997, +33879=>2998, +36015=>2999, +19969=>3000, +20806=>3001, +20939=>3002, +21899=>3003, +23541=>3004, +24086=>3005, +24115=>3006, +24193=>3007, +24340=>3008, +24373=>3009, +24427=>3010, +24500=>3011, +25074=>3012, +25361=>3013, +26274=>3014, +26397=>3015, +28526=>3016, +29266=>3017, +30010=>3018, +30522=>3019, +32884=>3020, +33081=>3021, +33144=>3022, +34678=>3023, +35519=>3024, +35548=>3025, +36229=>3026, +36339=>3027, +37530=>3028, +11985=>3029, +12199=>3029, +38263=>3029, +38914=>3030, +12227=>3031, +40165=>3031, +21189=>3032, +25431=>3033, +30452=>3034, +26389=>3035, +27784=>3036, +29645=>3037, +36035=>3038, +37806=>3039, +38515=>3040, +27941=>3041, +22684=>3042, +26894=>3043, +27084=>3044, +36861=>3045, +37786=>3046, +30171=>3047, +36890=>3048, +22618=>3049, +26626=>3050, +25524=>3051, +27131=>3052, +20291=>3053, +28460=>3054, +26584=>3055, +36795=>3056, +34086=>3057, +32180=>3058, +37716=>3059, +26943=>3060, +28528=>3061, +22378=>3062, +22775=>3063, +23340=>3064, +32044=>3065, +12118=>3066, +29226=>3066, +21514=>3067, +37347=>3068, +40372=>3069, +20141=>3070, +20302=>3071, +20572=>3072, +20597=>3073, +21059=>3074, +35998=>3075, +21576=>3076, +22564=>3077, +23450=>3078, +24093=>3079, +24213=>3080, +24237=>3081, +24311=>3082, +24351=>3083, +24716=>3084, +25269=>3085, +25402=>3086, +25552=>3087, +26799=>3088, +27712=>3089, +30855=>3090, +31118=>3091, +31243=>3092, +32224=>3093, +33351=>3094, +35330=>3095, +35558=>3096, +36420=>3097, +36883=>3098, +37048=>3099, +37165=>3100, +37336=>3101, +12237=>3102, +40718=>3102, +27877=>3103, +25688=>3104, +25826=>3105, +25973=>3106, +28404=>3107, +30340=>3108, +31515=>3109, +36969=>3110, +37841=>3111, +28346=>3112, +21746=>3113, +24505=>3114, +25764=>3115, +36685=>3116, +36845=>3117, +37444=>3118, +20856=>3119, +22635=>3120, +22825=>3121, +23637=>3122, +24215=>3123, +28155=>3124, +32399=>3125, +29980=>3126, +36028=>3127, +36578=>3128, +39003=>3129, +28857=>3130, +20253=>3131, +27583=>3132, +28593=>3133, +12133=>3134, +30000=>3134, +38651=>3135, +20814=>3136, +21520=>3137, +22581=>3138, +22615=>3139, +22956=>3140, +23648=>3141, +24466=>3142, +12099=>3143, +26007=>3143, +26460=>3144, +28193=>3145, +30331=>3146, +33759=>3147, +36077=>3148, +36884=>3149, +37117=>3150, +37709=>3151, +30757=>3152, +30778=>3153, +21162=>3154, +24230=>3155, +12063=>3156, +22303=>3156, +22900=>3157, +24594=>3158, +20498=>3159, +20826=>3160, +20908=>3161, +20941=>3162, +12049=>3163, +20992=>3163, +21776=>3164, +22612=>3165, +22616=>3166, +22871=>3167, +23445=>3168, +23798=>3169, +23947=>3170, +24764=>3171, +25237=>3172, +25645=>3173, +26481=>3174, +26691=>3175, +26812=>3176, +26847=>3177, +30423=>3178, +28120=>3179, +28271=>3180, +28059=>3181, +28783=>3182, +29128=>3183, +24403=>3184, +30168=>3185, +31095=>3186, +31561=>3187, +31572=>3188, +31570=>3189, +31958=>3190, +32113=>3191, +21040=>3192, +33891=>3193, +34153=>3194, +34276=>3195, +35342=>3196, +35588=>3197, +12182=>3198, +35910=>3198, +36367=>3199, +36867=>3200, +36879=>3201, +37913=>3202, +38518=>3203, +38957=>3204, +39472=>3205, +38360=>3206, +20685=>3207, +21205=>3208, +21516=>3209, +22530=>3210, +23566=>3211, +24999=>3212, +25758=>3213, +27934=>3214, +30643=>3215, +31461=>3216, +33012=>3217, +33796=>3218, +36947=>3219, +37509=>3220, +23776=>3221, +40199=>3222, +21311=>3223, +24471=>3224, +24499=>3225, +28060=>3226, +29305=>3227, +30563=>3228, +31167=>3229, +31716=>3230, +27602=>3231, +29420=>3232, +35501=>3233, +26627=>3234, +27233=>3235, +20984=>3236, +31361=>3237, +26932=>3238, +23626=>3239, +40182=>3240, +33515=>3241, +23493=>3242, +12195=>3243, +37193=>3243, +28702=>3244, +22136=>3245, +23663=>3246, +24775=>3247, +25958=>3248, +27788=>3249, +35930=>3250, +36929=>3251, +38931=>3252, +21585=>3253, +26311=>3254, +37389=>3255, +22856=>3256, +37027=>3257, +20869=>3258, +20045=>3259, +20970=>3260, +34201=>3261, +35598=>3262, +28760=>3263, +25466=>3264, +37707=>3265, +26978=>3266, +39348=>3267, +32260=>3268, +30071=>3269, +21335=>3270, +26976=>3271, +36575=>3272, +38627=>3273, +27741=>3274, +12038=>3275, +20108=>3275, +23612=>3276, +24336=>3277, +36841=>3278, +21250=>3279, +36049=>3280, +12161=>3281, +32905=>3281, +34425=>3282, +24319=>3283, +12103=>3284, +26085=>3284, +20083=>3285, +12042=>3286, +20837=>3286, +22914=>3287, +23615=>3288, +38894=>3289, +20219=>3290, +22922=>3291, +24525=>3292, +35469=>3293, +28641=>3294, +31152=>3295, +31074=>3296, +23527=>3297, +33905=>3298, +29483=>3299, +29105=>3300, +24180=>3301, +24565=>3302, +25467=>3303, +25754=>3304, +29123=>3305, +31896=>3306, +20035=>3307, +24316=>3308, +20043=>3309, +22492=>3310, +22178=>3311, +24745=>3312, +28611=>3313, +32013=>3314, +33021=>3315, +33075=>3316, +33215=>3317, +36786=>3318, +35223=>3319, +34468=>3320, +24052=>3321, +25226=>3322, +25773=>3323, +35207=>3324, +26487=>3325, +27874=>3326, +27966=>3327, +29750=>3328, +30772=>3329, +23110=>3330, +32629=>3331, +33453=>3332, +12218=>3333, +39340=>3333, +20467=>3334, +24259=>3335, +25309=>3336, +25490=>3337, +25943=>3338, +26479=>3339, +30403=>3340, +29260=>3341, +32972=>3342, +32954=>3343, +36649=>3344, +37197=>3345, +20493=>3346, +22521=>3347, +23186=>3348, +26757=>3349, +26995=>3350, +29028=>3351, +29437=>3352, +36023=>3353, +22770=>3354, +36064=>3355, +38506=>3356, +36889=>3357, +34687=>3358, +31204=>3359, +30695=>3360, +33833=>3361, +20271=>3362, +21093=>3363, +21338=>3364, +25293=>3365, +26575=>3366, +27850=>3367, +12137=>3368, +30333=>3368, +31636=>3369, +31893=>3370, +33334=>3371, +34180=>3372, +36843=>3373, +26333=>3374, +28448=>3375, +29190=>3376, +32283=>3377, +33707=>3378, +39361=>3379, +12008=>3380, +40614=>3380, +20989=>3381, +31665=>3382, +30834=>3383, +31672=>3384, +32903=>3385, +31560=>3386, +27368=>3387, +24161=>3388, +32908=>3389, +30033=>3390, +30048=>3391, +12043=>3392, +20843=>3392, +37474=>3393, +28300=>3394, +30330=>3395, +37271=>3396, +39658=>3397, +20240=>3398, +32624=>3399, +25244=>3400, +31567=>3401, +38309=>3402, +40169=>3403, +22138=>3404, +22617=>3405, +34532=>3406, +38588=>3407, +20276=>3408, +21028=>3409, +21322=>3410, +21453=>3411, +21467=>3412, +24070=>3413, +25644=>3414, +26001=>3415, +26495=>3416, +27710=>3417, +27726=>3418, +29256=>3419, +29359=>3420, +29677=>3421, +30036=>3422, +32321=>3423, +33324=>3424, +34281=>3425, +36009=>3426, +31684=>3427, +12196=>3428, +37318=>3428, +29033=>3429, +38930=>3430, +39151=>3431, +25405=>3432, +26217=>3433, +30058=>3434, +30436=>3435, +30928=>3436, +34115=>3437, +34542=>3438, +21290=>3439, +21329=>3440, +21542=>3441, +22915=>3442, +24199=>3443, +24444=>3444, +24754=>3445, +25161=>3446, +25209=>3447, +25259=>3448, +26000=>3449, +12112=>3450, +27604=>3450, +27852=>3451, +30130=>3452, +12138=>3453, +30382=>3453, +30865=>3454, +31192=>3455, +32203=>3456, +32631=>3457, +32933=>3458, +34987=>3459, +35513=>3460, +36027=>3461, +36991=>3462, +12206=>3463, +38750=>3463, +12214=>3464, +39131=>3464, +27147=>3465, +31800=>3466, +20633=>3467, +23614=>3468, +24494=>3469, +26503=>3470, +27608=>3471, +29749=>3472, +30473=>3473, +32654=>3474, +12240=>3475, +40763=>3475, +26570=>3476, +31255=>3477, +21305=>3478, +12134=>3479, +30091=>3479, +39661=>3480, +24422=>3481, +33181=>3482, +33777=>3483, +32920=>3484, +24380=>3485, +24517=>3486, +30050=>3487, +31558=>3488, +36924=>3489, +26727=>3490, +23019=>3491, +23195=>3492, +32016=>3493, +30334=>3494, +35628=>3495, +20469=>3496, +24426=>3497, +27161=>3498, +27703=>3499, +28418=>3500, +29922=>3501, +31080=>3502, +34920=>3503, +35413=>3504, +35961=>3505, +24287=>3506, +25551=>3507, +30149=>3508, +31186=>3509, +33495=>3510, +37672=>3511, +37618=>3512, +33948=>3513, +34541=>3514, +39981=>3515, +21697=>3516, +24428=>3517, +25996=>3518, +27996=>3519, +28693=>3520, +36007=>3521, +36051=>3522, +38971=>3523, +25935=>3524, +29942=>3525, +19981=>3526, +20184=>3527, +22496=>3528, +22827=>3529, +23142=>3530, +23500=>3531, +20904=>3532, +24067=>3533, +24220=>3534, +24598=>3535, +25206=>3536, +25975=>3537, +26023=>3538, +26222=>3539, +28014=>3540, +12119=>3541, +29238=>3541, +31526=>3542, +33104=>3543, +33178=>3544, +33433=>3545, +35676=>3546, +36000=>3547, +36070=>3548, +36212=>3549, +12201=>3550, +38428=>3550, +38468=>3551, +20398=>3552, +25771=>3553, +27494=>3554, +33310=>3555, +33889=>3556, +34154=>3557, +37096=>3558, +23553=>3559, +26963=>3560, +12213=>3561, +39080=>3561, +33914=>3562, +34135=>3563, +20239=>3564, +21103=>3565, +24489=>3566, +24133=>3567, +26381=>3568, +31119=>3569, +33145=>3570, +35079=>3571, +35206=>3572, +28149=>3573, +24343=>3574, +25173=>3575, +27832=>3576, +20175=>3577, +29289=>3578, +39826=>3579, +20998=>3580, +21563=>3581, +22132=>3582, +22707=>3583, +24996=>3584, +25198=>3585, +28954=>3586, +22894=>3587, +31881=>3588, +31966=>3589, +32027=>3590, +38640=>3591, +12098=>3592, +25991=>3592, +32862=>3593, +19993=>3594, +20341=>3595, +20853=>3596, +22592=>3597, +24163=>3598, +24179=>3599, +24330=>3600, +26564=>3601, +20006=>3602, +34109=>3603, +38281=>3604, +38491=>3605, +12150=>3606, +31859=>3606, +12212=>3607, +38913=>3607, +20731=>3608, +22721=>3609, +30294=>3610, +30887=>3611, +21029=>3612, +30629=>3613, +34065=>3614, +31622=>3615, +20559=>3616, +22793=>3617, +12122=>3618, +29255=>3618, +31687=>3619, +32232=>3620, +36794=>3621, +36820=>3622, +36941=>3623, +20415=>3624, +21193=>3625, +23081=>3626, +24321=>3627, +38829=>3628, +20445=>3629, +33303=>3630, +37610=>3631, +22275=>3632, +25429=>3633, +27497=>3634, +29995=>3635, +35036=>3636, +36628=>3637, +31298=>3638, +21215=>3639, +22675=>3640, +24917=>3641, +25098=>3642, +26286=>3643, +11935=>3644, +27597=>3644, +31807=>3645, +33769=>3646, +20515=>3647, +20472=>3648, +21253=>3649, +21574=>3650, +22577=>3651, +22857=>3652, +23453=>3653, +23792=>3654, +23791=>3655, +23849=>3656, +24214=>3657, +25265=>3658, +25447=>3659, +25918=>3660, +12101=>3661, +26041=>3661, +26379=>3662, +27861=>3663, +27873=>3664, +28921=>3665, +30770=>3666, +32299=>3667, +32990=>3668, +33459=>3669, +33804=>3670, +34028=>3671, +34562=>3672, +35090=>3673, +35370=>3674, +35914=>3675, +37030=>3676, +37586=>3677, +39165=>3678, +40179=>3679, +40300=>3680, +20047=>3681, +20129=>3682, +20621=>3683, +21078=>3684, +22346=>3685, +22952=>3686, +24125=>3687, +24536=>3688, +24537=>3689, +25151=>3690, +26292=>3691, +26395=>3692, +26576=>3693, +26834=>3694, +20882=>3695, +32033=>3696, +32938=>3697, +33192=>3698, +35584=>3699, +35980=>3700, +36031=>3701, +37502=>3702, +38450=>3703, +21536=>3704, +38956=>3705, +21271=>3706, +20693=>3707, +12056=>3708, +21340=>3708, +22696=>3709, +25778=>3710, +26420=>3711, +29287=>3712, +30566=>3713, +31302=>3714, +37350=>3715, +21187=>3716, +27809=>3717, +27526=>3718, +22528=>3719, +24140=>3720, +22868=>3721, +26412=>3722, +32763=>3723, +20961=>3724, +30406=>3725, +25705=>3726, +30952=>3727, +39764=>3728, +12231=>3729, +40635=>3729, +22475=>3730, +22969=>3731, +26151=>3732, +26522=>3733, +27598=>3734, +21737=>3735, +27097=>3736, +24149=>3737, +33180=>3738, +26517=>3739, +39850=>3740, +26622=>3741, +40018=>3742, +26717=>3743, +20134=>3744, +20451=>3745, +12060=>3746, +21448=>3746, +25273=>3747, +26411=>3748, +27819=>3749, +36804=>3750, +20397=>3751, +32365=>3752, +40639=>3753, +19975=>3754, +24930=>3755, +28288=>3756, +28459=>3757, +34067=>3758, +21619=>3759, +26410=>3760, +39749=>3761, +11922=>3762, +24051=>3762, +31637=>3763, +23724=>3764, +23494=>3765, +34588=>3766, +28234=>3767, +34001=>3768, +31252=>3769, +33032=>3770, +22937=>3771, +31885=>3772, +11936=>3773, +27665=>3773, +30496=>3774, +21209=>3775, +22818=>3776, +28961=>3777, +29279=>3778, +12141=>3779, +30683=>3779, +38695=>3780, +40289=>3781, +26891=>3782, +23167=>3783, +23064=>3784, +20901=>3785, +21517=>3786, +21629=>3787, +26126=>3788, +30431=>3789, +36855=>3790, +37528=>3791, +40180=>3792, +23018=>3793, +29277=>3794, +28357=>3795, +20813=>3796, +26825=>3797, +32191=>3798, +32236=>3799, +12207=>3800, +38754=>3800, +40634=>3801, +25720=>3802, +27169=>3803, +33538=>3804, +22916=>3805, +23391=>3806, +12113=>3807, +27611=>3807, +29467=>3808, +30450=>3809, +32178=>3810, +32791=>3811, +33945=>3812, +20786=>3813, +12106=>3814, +26408=>3814, +40665=>3815, +12140=>3816, +30446=>3816, +26466=>3817, +21247=>3818, +39173=>3819, +23588=>3820, +25147=>3821, +31870=>3822, +36016=>3823, +21839=>3824, +24758=>3825, +32011=>3826, +12200=>3827, +38272=>3827, +21249=>3828, +20063=>3829, +20918=>3830, +22812=>3831, +29242=>3832, +32822=>3833, +37326=>3834, +24357=>3835, +12142=>3836, +30690=>3836, +21380=>3837, +24441=>3838, +32004=>3839, +34220=>3840, +35379=>3841, +36493=>3842, +38742=>3843, +26611=>3844, +34222=>3845, +37971=>3846, +24841=>3847, +24840=>3848, +27833=>3849, +30290=>3850, +35565=>3851, +36664=>3852, +21807=>3853, +20305=>3854, +20778=>3855, +21191=>3856, +21451=>3857, +23461=>3858, +24189=>3859, +24736=>3860, +24962=>3861, +25558=>3862, +26377=>3863, +26586=>3864, +28263=>3865, +28044=>3866, +29494=>3867, +29495=>3868, +30001=>3869, +31056=>3870, +35029=>3871, +35480=>3872, +36938=>3873, +12194=>3874, +37009=>3874, +37109=>3875, +38596=>3876, +34701=>3877, +12067=>3878, +22805=>3878, +20104=>3879, +20313=>3880, +19982=>3881, +35465=>3882, +36671=>3883, +38928=>3884, +20653=>3885, +24188=>3886, +22934=>3887, +23481=>3888, +24248=>3889, +25562=>3890, +25594=>3891, +25793=>3892, +26332=>3893, +26954=>3894, +27096=>3895, +27915=>3896, +28342=>3897, +29076=>3898, +12132=>3899, +29992=>3899, +31407=>3900, +12154=>3901, +32650=>3901, +32768=>3902, +33865=>3903, +33993=>3904, +35201=>3905, +35617=>3906, +36362=>3907, +36965=>3908, +38525=>3909, +39178=>3910, +24958=>3911, +25233=>3912, +27442=>3913, +27779=>3914, +28020=>3915, +32716=>3916, +32764=>3917, +28096=>3918, +32645=>3919, +34746=>3920, +35064=>3921, +26469=>3922, +33713=>3923, +38972=>3924, +38647=>3925, +27931=>3926, +32097=>3927, +33853=>3928, +37226=>3929, +20081=>3930, +21365=>3931, +23888=>3932, +27396=>3933, +28651=>3934, +34253=>3935, +34349=>3936, +35239=>3937, +21033=>3938, +21519=>3939, +23653=>3940, +26446=>3941, +26792=>3942, +29702=>3943, +29827=>3944, +30178=>3945, +35023=>3946, +35041=>3947, +12197=>3948, +37324=>3948, +38626=>3949, +38520=>3950, +24459=>3951, +29575=>3952, +12148=>3953, +31435=>3953, +33870=>3954, +25504=>3955, +30053=>3956, +21129=>3957, +27969=>3958, +28316=>3959, +29705=>3960, +30041=>3961, +30827=>3962, +31890=>3963, +38534=>3964, +12015=>3965, +31452=>3965, +12243=>3966, +40845=>3966, +20406=>3967, +24942=>3968, +26053=>3969, +34396=>3970, +20102=>3971, +20142=>3972, +20698=>3973, +20001=>3974, +20940=>3975, +23534=>3976, +26009=>3977, +26753=>3978, +28092=>3979, +29471=>3980, +30274=>3981, +30637=>3982, +31260=>3983, +31975=>3984, +33391=>3985, +35538=>3986, +36988=>3987, +37327=>3988, +38517=>3989, +38936=>3990, +12050=>3991, +21147=>3991, +32209=>3992, +20523=>3993, +21400=>3994, +26519=>3995, +28107=>3996, +29136=>3997, +29747=>3998, +33256=>3999, +36650=>4000, +38563=>4001, +40023=>4002, +40607=>4003, +29792=>4004, +22593=>4005, +28057=>4006, +32047=>4007, +39006=>4008, +20196=>4009, +20278=>4010, +20363=>4011, +20919=>4012, +21169=>4013, +23994=>4014, +24604=>4015, +29618=>4016, +31036=>4017, +33491=>4018, +37428=>4019, +38583=>4020, +38646=>4021, +38666=>4022, +40599=>4023, +40802=>4024, +26278=>4025, +27508=>4026, +21015=>4027, +21155=>4028, +28872=>4029, +35010=>4030, +24265=>4031, +24651=>4032, +24976=>4033, +28451=>4034, +29001=>4035, +31806=>4036, +32244=>4037, +32879=>4038, +34030=>4039, +36899=>4040, +37676=>4041, +21570=>4042, +39791=>4043, +27347=>4044, +28809=>4045, +36034=>4046, +36335=>4047, +38706=>4048, +21172=>4049, +23105=>4050, +24266=>4051, +24324=>4052, +26391=>4053, +27004=>4054, +27028=>4055, +28010=>4056, +28431=>4057, +29282=>4058, +29436=>4059, +31725=>4060, +12156=>4061, +32769=>4061, +32894=>4062, +34635=>4063, +37070=>4064, +20845=>4065, +40595=>4066, +31108=>4067, +32907=>4068, +37682=>4069, +35542=>4070, +20525=>4071, +21644=>4072, +35441=>4073, +27498=>4074, +36036=>4075, +33031=>4076, +24785=>4077, +26528=>4078, +40434=>4079, +20121=>4080, +20120=>4081, +39952=>4082, +35435=>4083, +34241=>4084, +34152=>4085, +26880=>4086, +28286=>4087, +30871=>4088, +33109=>4089, +24332=>4090, +19984=>4091, +19989=>4092, +20010=>4093, +20017=>4094, +12034=>4095, +20022=>4095, +20028=>4096, +12035=>4097, +20031=>4097, +20034=>4098, +20054=>4099, +20056=>4100, +20098=>4101, +12037=>4102, +20101=>4102, +35947=>4103, +20106=>4104, +33298=>4105, +24333=>4106, +20110=>4107, +20126=>4108, +20127=>4109, +12039=>4110, +20128=>4110, +20130=>4111, +20144=>4112, +20147=>4113, +20150=>4114, +20174=>4115, +20173=>4116, +20164=>4117, +20166=>4118, +20162=>4119, +20183=>4120, +20190=>4121, +20205=>4122, +20191=>4123, +20215=>4124, +20233=>4125, +20314=>4126, +20272=>4127, +20315=>4128, +20317=>4129, +20311=>4130, +20295=>4131, +20342=>4132, +20360=>4133, +20367=>4134, +20376=>4135, +20347=>4136, +20329=>4137, +20336=>4138, +20369=>4139, +20335=>4140, +20358=>4141, +20374=>4142, +20760=>4143, +20436=>4144, +20447=>4145, +20430=>4146, +20440=>4147, +20443=>4148, +20433=>4149, +20442=>4150, +20432=>4151, +20452=>4152, +20453=>4153, +20506=>4154, +20520=>4155, +20500=>4156, +20522=>4157, +20517=>4158, +20485=>4159, +20252=>4160, +20470=>4161, +20513=>4162, +20521=>4163, +20524=>4164, +20478=>4165, +20463=>4166, +20497=>4167, +20486=>4168, +20547=>4169, +20551=>4170, +26371=>4171, +20565=>4172, +20560=>4173, +20552=>4174, +20570=>4175, +20566=>4176, +20588=>4177, +20600=>4178, +20608=>4179, +20634=>4180, +20613=>4181, +20660=>4182, +20658=>4183, +20681=>4184, +20682=>4185, +20659=>4186, +20674=>4187, +20694=>4188, +20702=>4189, +20709=>4190, +20717=>4191, +20707=>4192, +20718=>4193, +20729=>4194, +20725=>4195, +20745=>4196, +20737=>4197, +20738=>4198, +20758=>4199, +20757=>4200, +20756=>4201, +20762=>4202, +20769=>4203, +20794=>4204, +20791=>4205, +20796=>4206, +20795=>4207, +12041=>4208, +20799=>4208, +11918=>4209, +20800=>4209, +20818=>4210, +20812=>4211, +20820=>4212, +20834=>4213, +31480=>4214, +20841=>4215, +20842=>4216, +20846=>4217, +20864=>4218, +12044=>4219, +20866=>4219, +22232=>4220, +20876=>4221, +20873=>4222, +20879=>4223, +20881=>4224, +20883=>4225, +20885=>4226, +12045=>4227, +20886=>4227, +20900=>4228, +20902=>4229, +20898=>4230, +20905=>4231, +20906=>4232, +12046=>4233, +20907=>4233, +20915=>4234, +20913=>4235, +20914=>4236, +20912=>4237, +20917=>4238, +20925=>4239, +20933=>4240, +20937=>4241, +20955=>4242, +12047=>4243, +20960=>4243, +34389=>4244, +20969=>4245, +20973=>4246, +20976=>4247, +12048=>4248, +20981=>4248, +20990=>4249, +20996=>4250, +21003=>4251, +21012=>4252, +21006=>4253, +21031=>4254, +21034=>4255, +21038=>4256, +21043=>4257, +21049=>4258, +21071=>4259, +21060=>4260, +21067=>4261, +21068=>4262, +21086=>4263, +21076=>4264, +21098=>4265, +21108=>4266, +21097=>4267, +21107=>4268, +21119=>4269, +21117=>4270, +21133=>4271, +21140=>4272, +21138=>4273, +21105=>4274, +21128=>4275, +21137=>4276, +36776=>4277, +36775=>4278, +21164=>4279, +21165=>4280, +21180=>4281, +21173=>4282, +21185=>4283, +21197=>4284, +21207=>4285, +21214=>4286, +21219=>4287, +21222=>4288, +39149=>4289, +21216=>4290, +21235=>4291, +21237=>4292, +21240=>4293, +12051=>4294, +21241=>4294, +21254=>4295, +21256=>4296, +30008=>4297, +21261=>4298, +21264=>4299, +21263=>4300, +21269=>4301, +12052=>4301, +21274=>4302, +12053=>4302, +21283=>4303, +21295=>4304, +21297=>4305, +21299=>4306, +12054=>4307, +21304=>4307, +21312=>4308, +21318=>4309, +21317=>4310, +19991=>4311, +21321=>4312, +21325=>4313, +20950=>4314, +21342=>4315, +12057=>4316, +21353=>4316, +21358=>4317, +22808=>4318, +21371=>4319, +21367=>4320, +12058=>4321, +21378=>4321, +21398=>4322, +21408=>4323, +21414=>4324, +21413=>4325, +21422=>4326, +21424=>4327, +12059=>4328, +21430=>4328, +21443=>4329, +31762=>4330, +38617=>4331, +21471=>4332, +26364=>4333, +29166=>4334, +21486=>4335, +21480=>4336, +21485=>4337, +21498=>4338, +21505=>4339, +21565=>4340, +21568=>4341, +21548=>4342, +21549=>4343, +21564=>4344, +21550=>4345, +21558=>4346, +21545=>4347, +21533=>4348, +21582=>4349, +21647=>4350, +21621=>4351, +21646=>4352, +21599=>4353, +21617=>4354, +21623=>4355, +21616=>4356, +21650=>4357, +21627=>4358, +21632=>4359, +21622=>4360, +21636=>4361, +21648=>4362, +21638=>4363, +21703=>4364, +21666=>4365, +21688=>4366, +21669=>4367, +21676=>4368, +21700=>4369, +21704=>4370, +21672=>4371, +21675=>4372, +21698=>4373, +21668=>4374, +21694=>4375, +21692=>4376, +21720=>4377, +21733=>4378, +21734=>4379, +21775=>4380, +21780=>4381, +21757=>4382, +21742=>4383, +21741=>4384, +21754=>4385, +21730=>4386, +21817=>4387, +21824=>4388, +21859=>4389, +21836=>4390, +21806=>4391, +21852=>4392, +21829=>4393, +21846=>4394, +21847=>4395, +21816=>4396, +21811=>4397, +21853=>4398, +21913=>4399, +21888=>4400, +21679=>4401, +21898=>4402, +21919=>4403, +21883=>4404, +21886=>4405, +21912=>4406, +21918=>4407, +21934=>4408, +21884=>4409, +21891=>4410, +21929=>4411, +21895=>4412, +21928=>4413, +21978=>4414, +21957=>4415, +21983=>4416, +21956=>4417, +21980=>4418, +21988=>4419, +21972=>4420, +22036=>4421, +22007=>4422, +22038=>4423, +22014=>4424, +22013=>4425, +22043=>4426, +22009=>4427, +22094=>4428, +22096=>4429, +29151=>4430, +22068=>4431, +22070=>4432, +22066=>4433, +22072=>4434, +22123=>4435, +22116=>4436, +22063=>4437, +22124=>4438, +22122=>4439, +22150=>4440, +22144=>4441, +22154=>4442, +22176=>4443, +22164=>4444, +22159=>4445, +22181=>4446, +22190=>4447, +22198=>4448, +22196=>4449, +22210=>4450, +22204=>4451, +22209=>4452, +22211=>4453, +22208=>4454, +22216=>4455, +22222=>4456, +22225=>4457, +22227=>4458, +12062=>4459, +22231=>4459, +22254=>4460, +22265=>4461, +22272=>4462, +22271=>4463, +22276=>4464, +22281=>4465, +22280=>4466, +22283=>4467, +22285=>4468, +22291=>4469, +22296=>4470, +22294=>4471, +21959=>4472, +22300=>4473, +22310=>4474, +22327=>4475, +22328=>4476, +22350=>4477, +22331=>4478, +22336=>4479, +22351=>4480, +22377=>4481, +22464=>4482, +22408=>4483, +22369=>4484, +22399=>4485, +22409=>4486, +22419=>4487, +22432=>4488, +22451=>4489, +22436=>4490, +22442=>4491, +22448=>4492, +22467=>4493, +22470=>4494, +22484=>4495, +22482=>4496, +22483=>4497, +22538=>4498, +22486=>4499, +22499=>4500, +22539=>4501, +22553=>4502, +22557=>4503, +22642=>4504, +22561=>4505, +22626=>4506, +22603=>4507, +22640=>4508, +27584=>4509, +22610=>4510, +22589=>4511, +22649=>4512, +22661=>4513, +22713=>4514, +22687=>4515, +22699=>4516, +22714=>4517, +22750=>4518, +22715=>4519, +22712=>4520, +22702=>4521, +22725=>4522, +22739=>4523, +22737=>4524, +22743=>4525, +22745=>4526, +22744=>4527, +22757=>4528, +22748=>4529, +22756=>4530, +22751=>4531, +22767=>4532, +22778=>4533, +22777=>4534, +22779=>4535, +22780=>4536, +22781=>4537, +22786=>4538, +12065=>4538, +22794=>4539, +12066=>4539, +22800=>4540, +22811=>4541, +26790=>4542, +22821=>4543, +22828=>4544, +22829=>4545, +22834=>4546, +22840=>4547, +22846=>4548, +31442=>4549, +22869=>4550, +22864=>4551, +22862=>4552, +22874=>4553, +22872=>4554, +22882=>4555, +22880=>4556, +22887=>4557, +22892=>4558, +22889=>4559, +22904=>4560, +22913=>4561, +22941=>4562, +20318=>4563, +20395=>4564, +22947=>4565, +22962=>4566, +22982=>4567, +23016=>4568, +23004=>4569, +22925=>4570, +23001=>4571, +23002=>4572, +23077=>4573, +23071=>4574, +23057=>4575, +23068=>4576, +23049=>4577, +23066=>4578, +23104=>4579, +23148=>4580, +23113=>4581, +23093=>4582, +23094=>4583, +23138=>4584, +23146=>4585, +23194=>4586, +23228=>4587, +23230=>4588, +23243=>4589, +23234=>4590, +23229=>4591, +23267=>4592, +23255=>4593, +23270=>4594, +23273=>4595, +23254=>4596, +23290=>4597, +23291=>4598, +23308=>4599, +23307=>4600, +23318=>4601, +23346=>4602, +23248=>4603, +23338=>4604, +23350=>4605, +23358=>4606, +23363=>4607, +23365=>4608, +23360=>4609, +23377=>4610, +23381=>4611, +23386=>4612, +23387=>4613, +23397=>4614, +23401=>4615, +23408=>4616, +23411=>4617, +23413=>4618, +23416=>4619, +25992=>4620, +23418=>4621, +12071=>4622, +23424=>4622, +23427=>4623, +23462=>4624, +23480=>4625, +23491=>4626, +23495=>4627, +23497=>4628, +23508=>4629, +23504=>4630, +23524=>4631, +23526=>4632, +23522=>4633, +23518=>4634, +23525=>4635, +23531=>4636, +23536=>4637, +23542=>4638, +23539=>4639, +23557=>4640, +23559=>4641, +23560=>4642, +23565=>4643, +23571=>4644, +23584=>4645, +11920=>4646, +12074=>4646, +23586=>4646, +23592=>4647, +12075=>4648, +23608=>4648, +23609=>4649, +23617=>4650, +23622=>4651, +23630=>4652, +23635=>4653, +23632=>4654, +23631=>4655, +23409=>4656, +23660=>4657, +12076=>4658, +23662=>4658, +20066=>4659, +23670=>4660, +23673=>4661, +23692=>4662, +23697=>4663, +23700=>4664, +22939=>4665, +23723=>4666, +23739=>4667, +23734=>4668, +23740=>4669, +23735=>4670, +23749=>4671, +23742=>4672, +23751=>4673, +23769=>4674, +23785=>4675, +23805=>4676, +23802=>4677, +23789=>4678, +23948=>4679, +23786=>4680, +23819=>4681, +23829=>4682, +23831=>4683, +23900=>4684, +23839=>4685, +23835=>4686, +23825=>4687, +23828=>4688, +23842=>4689, +23834=>4690, +23833=>4691, +23832=>4692, +23884=>4693, +23890=>4694, +23886=>4695, +23883=>4696, +23916=>4697, +23923=>4698, +23926=>4699, +23943=>4700, +23940=>4701, +23938=>4702, +23970=>4703, +23965=>4704, +23980=>4705, +23982=>4706, +23997=>4707, +23952=>4708, +23991=>4709, +23996=>4710, +24009=>4711, +24013=>4712, +24019=>4713, +24018=>4714, +24022=>4715, +12078=>4716, +24027=>4716, +24043=>4717, +24050=>4718, +24053=>4719, +24075=>4720, +24090=>4721, +24089=>4722, +24081=>4723, +24091=>4724, +24118=>4725, +24119=>4726, +24132=>4727, +24131=>4728, +24128=>4729, +24142=>4730, +24151=>4731, +24148=>4732, +24159=>4733, +24162=>4734, +24164=>4735, +24135=>4736, +24181=>4737, +24182=>4738, +11923=>4739, +12083=>4739, +24186=>4739, +40636=>4740, +12084=>4741, +24191=>4741, +24224=>4742, +24257=>4743, +24258=>4744, +24264=>4745, +24272=>4746, +24271=>4747, +24278=>4748, +24291=>4749, +24285=>4750, +24282=>4751, +24283=>4752, +24290=>4753, +24289=>4754, +24296=>4755, +24297=>4756, +24300=>4757, +24305=>4758, +24307=>4759, +24304=>4760, +12085=>4761, +24308=>4761, +24312=>4762, +12086=>4763, +24318=>4763, +24323=>4764, +24329=>4765, +24413=>4766, +24412=>4767, +12087=>4768, +24331=>4768, +24337=>4769, +24342=>4770, +24361=>4771, +24365=>4772, +24376=>4773, +24385=>4774, +24392=>4775, +24396=>4776, +24398=>4777, +24367=>4778, +11924=>4779, +24401=>4779, +24406=>4780, +24407=>4781, +24409=>4782, +12090=>4783, +24417=>4783, +24429=>4784, +12091=>4785, +24435=>4785, +24439=>4786, +24451=>4787, +24450=>4788, +24447=>4789, +24458=>4790, +24456=>4791, +24465=>4792, +24455=>4793, +24478=>4794, +24473=>4795, +24472=>4796, +24480=>4797, +24488=>4798, +24493=>4799, +24508=>4800, +24534=>4801, +24571=>4802, +24548=>4803, +24568=>4804, +24561=>4805, +24541=>4806, +24755=>4807, +24575=>4808, +24609=>4809, +24672=>4810, +24601=>4811, +24592=>4812, +24617=>4813, +24590=>4814, +24625=>4815, +24603=>4816, +24597=>4817, +24619=>4818, +24614=>4819, +24591=>4820, +24634=>4821, +24666=>4822, +24641=>4823, +24682=>4824, +24695=>4825, +24671=>4826, +24650=>4827, +24646=>4828, +24653=>4829, +24675=>4830, +24643=>4831, +24676=>4832, +24642=>4833, +24684=>4834, +24683=>4835, +24665=>4836, +24705=>4837, +24717=>4838, +24807=>4839, +24707=>4840, +24730=>4841, +24708=>4842, +24731=>4843, +24726=>4844, +24727=>4845, +24722=>4846, +24743=>4847, +24715=>4848, +24801=>4849, +24760=>4850, +24800=>4851, +24787=>4852, +24756=>4853, +24560=>4854, +24765=>4855, +24774=>4856, +24757=>4857, +24792=>4858, +24909=>4859, +24853=>4860, +24838=>4861, +24822=>4862, +24823=>4863, +24832=>4864, +24820=>4865, +24826=>4866, +24835=>4867, +24865=>4868, +24827=>4869, +24817=>4870, +24845=>4871, +24846=>4872, +24903=>4873, +24894=>4874, +24872=>4875, +24871=>4876, +24906=>4877, +24895=>4878, +24892=>4879, +24876=>4880, +24884=>4881, +24893=>4882, +24898=>4883, +24900=>4884, +24947=>4885, +24951=>4886, +24920=>4887, +24921=>4888, +24922=>4889, +24939=>4890, +24948=>4891, +24943=>4892, +24933=>4893, +24945=>4894, +24927=>4895, +24925=>4896, +24915=>4897, +24949=>4898, +24985=>4899, +24982=>4900, +24967=>4901, +25004=>4902, +24980=>4903, +24986=>4904, +24970=>4905, +24977=>4906, +25003=>4907, +25006=>4908, +25036=>4909, +25034=>4910, +25033=>4911, +25079=>4912, +25032=>4913, +25027=>4914, +25030=>4915, +25018=>4916, +25035=>4917, +32633=>4918, +25037=>4919, +25062=>4920, +25059=>4921, +25078=>4922, +25082=>4923, +25076=>4924, +25087=>4925, +25085=>4926, +25084=>4927, +25086=>4928, +25088=>4929, +12093=>4930, +25096=>4930, +25097=>4931, +25101=>4932, +25100=>4933, +25108=>4934, +25115=>4935, +25118=>4936, +25121=>4937, +25130=>4938, +25134=>4939, +25136=>4940, +25138=>4941, +25139=>4942, +25153=>4943, +25166=>4944, +25182=>4945, +25187=>4946, +25179=>4947, +25184=>4948, +25192=>4949, +25212=>4950, +25218=>4951, +25225=>4952, +25214=>4953, +25234=>4954, +25235=>4955, +25238=>4956, +25300=>4957, +25219=>4958, +25236=>4959, +25303=>4960, +25297=>4961, +25275=>4962, +25295=>4963, +25343=>4964, +25286=>4965, +25812=>4966, +25288=>4967, +25308=>4968, +25292=>4969, +25290=>4970, +25282=>4971, +25287=>4972, +25243=>4973, +25289=>4974, +25356=>4975, +25326=>4976, +25329=>4977, +25383=>4978, +25346=>4979, +25352=>4980, +25327=>4981, +25333=>4982, +25424=>4983, +25406=>4984, +25421=>4985, +25628=>4986, +25423=>4987, +25494=>4988, +25486=>4989, +25472=>4990, +25515=>4991, +25462=>4992, +25507=>4993, +25487=>4994, +25481=>4995, +25503=>4996, +25525=>4997, +25451=>4998, +25449=>4999, +25534=>5000, +25577=>5001, +25536=>5002, +25542=>5003, +25571=>5004, +25545=>5005, +25554=>5006, +25590=>5007, +25540=>5008, +25622=>5009, +25652=>5010, +25606=>5011, +25619=>5012, +25638=>5013, +25654=>5014, +25885=>5015, +25623=>5016, +25640=>5017, +25615=>5018, +25703=>5019, +25711=>5020, +25718=>5021, +25678=>5022, +25898=>5023, +25749=>5024, +25747=>5025, +25765=>5026, +25769=>5027, +25736=>5028, +25788=>5029, +25818=>5030, +25810=>5031, +25797=>5032, +25799=>5033, +25787=>5034, +25816=>5035, +25794=>5036, +25841=>5037, +25831=>5038, +33289=>5039, +25824=>5040, +25825=>5041, +25260=>5042, +25827=>5043, +25839=>5044, +25900=>5045, +25846=>5046, +25844=>5047, +25842=>5048, +25850=>5049, +25856=>5050, +25853=>5051, +25880=>5052, +25884=>5053, +25861=>5054, +25892=>5055, +25891=>5056, +25899=>5057, +12097=>5058, +25908=>5058, +11929=>5059, +25909=>5059, +25911=>5060, +25910=>5061, +25912=>5062, +30027=>5063, +25928=>5064, +25942=>5065, +25941=>5066, +25933=>5067, +25944=>5068, +25950=>5069, +25949=>5070, +25970=>5071, +25976=>5072, +25986=>5073, +25987=>5074, +35722=>5075, +26011=>5076, +26015=>5077, +26027=>5078, +26039=>5079, +26051=>5080, +26054=>5081, +26049=>5082, +26052=>5083, +26060=>5084, +26066=>5085, +26075=>5086, +26073=>5087, +12102=>5088, +26080=>5088, +11931=>5089, +26081=>5089, +26097=>5090, +26482=>5091, +26122=>5092, +26115=>5093, +26107=>5094, +26483=>5095, +26165=>5096, +26166=>5097, +26164=>5098, +26140=>5099, +26191=>5100, +26180=>5101, +26185=>5102, +26177=>5103, +26206=>5104, +26205=>5105, +26212=>5106, +26215=>5107, +26216=>5108, +26207=>5109, +26210=>5110, +26224=>5111, +26243=>5112, +26248=>5113, +26254=>5114, +26249=>5115, +26244=>5116, +26264=>5117, +26269=>5118, +26305=>5119, +26297=>5120, +26313=>5121, +26302=>5122, +26300=>5123, +26308=>5124, +26296=>5125, +26326=>5126, +26330=>5127, +26336=>5128, +26175=>5129, +26342=>5130, +26345=>5131, +12104=>5132, +26352=>5132, +26357=>5133, +26359=>5134, +26383=>5135, +26390=>5136, +26398=>5137, +26406=>5138, +26407=>5139, +38712=>5140, +26414=>5141, +26431=>5142, +26422=>5143, +26433=>5144, +26424=>5145, +26423=>5146, +26438=>5147, +26462=>5148, +26464=>5149, +26457=>5150, +26467=>5151, +26468=>5152, +26505=>5153, +26480=>5154, +26537=>5155, +26492=>5156, +26474=>5157, +26508=>5158, +26507=>5159, +26534=>5160, +26529=>5161, +26501=>5162, +26551=>5163, +26607=>5164, +26548=>5165, +26604=>5166, +26547=>5167, +26601=>5168, +26552=>5169, +26596=>5170, +26590=>5171, +26589=>5172, +26594=>5173, +26606=>5174, +26553=>5175, +26574=>5176, +26566=>5177, +26599=>5178, +27292=>5179, +26654=>5180, +26694=>5181, +26665=>5182, +26688=>5183, +26701=>5184, +26674=>5185, +26702=>5186, +26803=>5187, +26667=>5188, +26713=>5189, +26723=>5190, +26743=>5191, +26751=>5192, +26783=>5193, +26767=>5194, +26797=>5195, +26772=>5196, +26781=>5197, +26779=>5198, +26755=>5199, +27310=>5200, +26809=>5201, +26740=>5202, +26805=>5203, +26784=>5204, +26810=>5205, +26895=>5206, +26765=>5207, +26750=>5208, +26881=>5209, +26826=>5210, +26888=>5211, +26840=>5212, +26914=>5213, +26918=>5214, +26849=>5215, +26892=>5216, +26829=>5217, +26836=>5218, +26855=>5219, +26837=>5220, +26934=>5221, +26898=>5222, +26884=>5223, +26839=>5224, +26851=>5225, +26917=>5226, +26873=>5227, +26848=>5228, +26863=>5229, +26920=>5230, +26922=>5231, +26906=>5232, +26915=>5233, +26913=>5234, +26822=>5235, +27001=>5236, +26999=>5237, +26972=>5238, +27000=>5239, +26987=>5240, +26964=>5241, +27006=>5242, +26990=>5243, +26937=>5244, +26996=>5245, +26941=>5246, +26969=>5247, +26928=>5248, +26977=>5249, +26974=>5250, +26973=>5251, +27009=>5252, +26986=>5253, +27058=>5254, +27054=>5255, +27088=>5256, +27071=>5257, +27073=>5258, +27091=>5259, +27070=>5260, +27086=>5261, +23528=>5262, +27082=>5263, +27101=>5264, +27067=>5265, +27075=>5266, +27047=>5267, +27182=>5268, +27025=>5269, +27040=>5270, +27036=>5271, +27029=>5272, +27060=>5273, +27102=>5274, +27112=>5275, +27138=>5276, +27163=>5277, +27135=>5278, +27402=>5279, +27129=>5280, +27122=>5281, +27111=>5282, +27141=>5283, +27057=>5284, +27166=>5285, +27117=>5286, +27156=>5287, +27115=>5288, +27146=>5289, +27154=>5290, +27329=>5291, +27171=>5292, +27155=>5293, +27204=>5294, +27148=>5295, +27250=>5296, +27190=>5297, +27256=>5298, +27207=>5299, +27234=>5300, +27225=>5301, +27238=>5302, +27208=>5303, +27192=>5304, +27170=>5305, +27280=>5306, +27277=>5307, +27296=>5308, +27268=>5309, +27298=>5310, +27299=>5311, +27287=>5312, +34327=>5313, +27323=>5314, +27331=>5315, +27330=>5316, +27320=>5317, +27315=>5318, +27308=>5319, +27358=>5320, +27345=>5321, +27359=>5322, +27306=>5323, +27354=>5324, +27370=>5325, +27387=>5326, +27397=>5327, +34326=>5328, +27386=>5329, +27410=>5330, +27414=>5331, +39729=>5332, +27423=>5333, +27448=>5334, +27447=>5335, +30428=>5336, +27449=>5337, +39150=>5338, +27463=>5339, +27459=>5340, +27465=>5341, +27472=>5342, +27481=>5343, +27476=>5344, +27483=>5345, +27487=>5346, +27489=>5347, +27512=>5348, +12109=>5349, +27513=>5349, +27519=>5350, +27520=>5351, +27524=>5352, +27523=>5353, +27533=>5354, +27544=>5355, +27541=>5356, +27550=>5357, +27556=>5358, +27562=>5359, +27563=>5360, +27567=>5361, +27570=>5362, +27569=>5363, +12110=>5364, +27571=>5364, +27575=>5365, +27580=>5366, +27590=>5367, +12111=>5368, +27595=>5368, +27603=>5369, +27615=>5370, +27628=>5371, +27627=>5372, +27635=>5373, +27631=>5374, +40638=>5375, +27656=>5376, +27667=>5377, +12115=>5378, +27668=>5378, +27675=>5379, +27684=>5380, +27683=>5381, +27742=>5382, +27733=>5383, +27746=>5384, +27754=>5385, +27778=>5386, +27789=>5387, +27802=>5388, +27777=>5389, +27803=>5390, +27774=>5391, +27752=>5392, +27763=>5393, +27794=>5394, +27792=>5395, +27844=>5396, +27889=>5397, +27859=>5398, +27837=>5399, +27863=>5400, +27845=>5401, +27869=>5402, +27822=>5403, +27825=>5404, +27838=>5405, +27834=>5406, +27867=>5407, +27887=>5408, +27865=>5409, +27882=>5410, +27935=>5411, +34893=>5412, +27958=>5413, +27947=>5414, +27965=>5415, +27960=>5416, +27929=>5417, +27957=>5418, +27955=>5419, +27922=>5420, +27916=>5421, +28003=>5422, +28051=>5423, +28004=>5424, +27994=>5425, +28025=>5426, +27993=>5427, +28046=>5428, +28053=>5429, +28644=>5430, +28037=>5431, +28153=>5432, +28181=>5433, +28170=>5434, +28085=>5435, +28103=>5436, +28134=>5437, +28088=>5438, +28102=>5439, +28140=>5440, +28126=>5441, +28108=>5442, +28136=>5443, +28114=>5444, +28101=>5445, +28154=>5446, +28121=>5447, +28132=>5448, +28117=>5449, +28138=>5450, +28142=>5451, +28205=>5452, +28270=>5453, +28206=>5454, +28185=>5455, +28274=>5456, +28255=>5457, +28222=>5458, +28195=>5459, +28267=>5460, +28203=>5461, +28278=>5462, +28237=>5463, +28191=>5464, +28227=>5465, +28218=>5466, +28238=>5467, +28196=>5468, +28415=>5469, +28189=>5470, +28216=>5471, +28290=>5472, +28330=>5473, +28312=>5474, +28361=>5475, +28343=>5476, +28371=>5477, +28349=>5478, +28335=>5479, +28356=>5480, +28338=>5481, +28372=>5482, +28373=>5483, +28303=>5484, +28325=>5485, +28354=>5486, +28319=>5487, +28481=>5488, +28433=>5489, +28748=>5490, +28396=>5491, +28408=>5492, +28414=>5493, +28479=>5494, +28402=>5495, +28465=>5496, +28399=>5497, +28466=>5498, +28364=>5499, +28478=>5500, +28435=>5501, +28407=>5502, +28550=>5503, +28538=>5504, +28536=>5505, +28545=>5506, +28544=>5507, +28527=>5508, +28507=>5509, +28659=>5510, +28525=>5511, +28546=>5512, +28540=>5513, +28504=>5514, +28558=>5515, +28561=>5516, +28610=>5517, +28518=>5518, +28595=>5519, +28579=>5520, +28577=>5521, +28580=>5522, +28601=>5523, +28614=>5524, +28586=>5525, +28639=>5526, +28629=>5527, +28652=>5528, +28628=>5529, +28632=>5530, +28657=>5531, +28654=>5532, +28635=>5533, +28681=>5534, +28683=>5535, +28666=>5536, +28689=>5537, +28673=>5538, +28687=>5539, +28670=>5540, +28699=>5541, +28698=>5542, +28532=>5543, +28701=>5544, +28696=>5545, +28703=>5546, +28720=>5547, +28734=>5548, +28722=>5549, +28753=>5550, +28771=>5551, +28825=>5552, +28818=>5553, +28847=>5554, +28913=>5555, +28844=>5556, +28856=>5557, +28851=>5558, +28846=>5559, +28895=>5560, +28875=>5561, +28893=>5562, +28889=>5563, +28937=>5564, +28925=>5565, +28956=>5566, +28953=>5567, +29029=>5568, +29013=>5569, +29064=>5570, +29030=>5571, +29026=>5572, +29004=>5573, +29014=>5574, +29036=>5575, +29071=>5576, +29179=>5577, +29060=>5578, +29077=>5579, +29096=>5580, +29100=>5581, +29143=>5582, +29113=>5583, +29118=>5584, +29138=>5585, +29129=>5586, +29140=>5587, +29134=>5588, +29152=>5589, +29164=>5590, +29159=>5591, +29173=>5592, +29180=>5593, +29177=>5594, +29183=>5595, +29197=>5596, +29200=>5597, +29211=>5598, +29224=>5599, +29229=>5600, +29228=>5601, +29232=>5602, +29234=>5603, +12120=>5604, +29243=>5604, +29244=>5605, +12121=>5606, +29247=>5606, +29248=>5607, +29254=>5608, +29259=>5609, +29272=>5610, +29300=>5611, +29310=>5612, +29314=>5613, +29313=>5614, +29319=>5615, +29330=>5616, +29334=>5617, +29346=>5618, +29351=>5619, +29369=>5620, +29362=>5621, +29379=>5622, +29382=>5623, +29380=>5624, +29390=>5625, +29394=>5626, +29410=>5627, +29408=>5628, +29409=>5629, +29433=>5630, +29431=>5631, +20495=>5632, +29463=>5633, +29450=>5634, +29468=>5635, +29462=>5636, +29469=>5637, +29492=>5638, +29487=>5639, +29481=>5640, +29477=>5641, +29502=>5642, +29518=>5643, +29519=>5644, +40664=>5645, +29527=>5646, +29546=>5647, +29544=>5648, +29552=>5649, +29560=>5650, +29557=>5651, +29563=>5652, +29562=>5653, +29640=>5654, +29619=>5655, +29646=>5656, +29627=>5657, +29632=>5658, +29669=>5659, +29678=>5660, +29662=>5661, +29858=>5662, +29701=>5663, +29807=>5664, +29733=>5665, +29688=>5666, +29746=>5667, +29754=>5668, +29781=>5669, +29759=>5670, +29791=>5671, +29785=>5672, +29761=>5673, +29788=>5674, +29801=>5675, +29808=>5676, +29795=>5677, +29802=>5678, +29814=>5679, +29822=>5680, +29835=>5681, +29854=>5682, +29863=>5683, +29898=>5684, +29903=>5685, +29908=>5686, +29681=>5687, +29920=>5688, +29923=>5689, +29927=>5690, +29929=>5691, +29934=>5692, +29938=>5693, +29936=>5694, +29937=>5695, +29944=>5696, +29943=>5697, +29956=>5698, +29955=>5699, +29957=>5700, +29964=>5701, +29966=>5702, +29965=>5703, +29973=>5704, +29971=>5705, +29982=>5706, +29990=>5707, +29996=>5708, +30012=>5709, +30020=>5710, +30029=>5711, +30026=>5712, +30025=>5713, +30043=>5714, +30022=>5715, +30042=>5716, +30057=>5717, +30052=>5718, +30055=>5719, +30059=>5720, +30061=>5721, +30072=>5722, +30070=>5723, +30086=>5724, +30087=>5725, +30068=>5726, +30090=>5727, +30089=>5728, +30082=>5729, +30100=>5730, +30106=>5731, +30109=>5732, +30117=>5733, +30115=>5734, +30146=>5735, +30131=>5736, +30147=>5737, +30133=>5738, +30141=>5739, +30136=>5740, +30140=>5741, +30129=>5742, +30157=>5743, +30154=>5744, +30162=>5745, +30169=>5746, +30179=>5747, +30174=>5748, +30206=>5749, +30207=>5750, +30204=>5751, +30209=>5752, +30192=>5753, +30202=>5754, +30194=>5755, +30195=>5756, +30219=>5757, +30221=>5758, +30217=>5759, +30239=>5760, +30247=>5761, +30240=>5762, +30241=>5763, +30242=>5764, +30244=>5765, +30260=>5766, +30256=>5767, +30267=>5768, +30279=>5769, +30280=>5770, +30278=>5771, +30300=>5772, +30296=>5773, +30305=>5774, +30306=>5775, +30312=>5776, +30313=>5777, +30314=>5778, +30311=>5779, +30316=>5780, +30320=>5781, +30322=>5782, +12136=>5783, +30326=>5783, +30328=>5784, +30332=>5785, +30336=>5786, +30339=>5787, +30344=>5788, +30347=>5789, +30350=>5790, +30358=>5791, +30355=>5792, +30361=>5793, +30362=>5794, +30384=>5795, +30388=>5796, +30392=>5797, +30393=>5798, +30394=>5799, +30402=>5800, +30413=>5801, +30422=>5802, +30418=>5803, +30430=>5804, +30433=>5805, +30437=>5806, +30439=>5807, +30442=>5808, +34351=>5809, +30459=>5810, +30472=>5811, +30471=>5812, +30468=>5813, +30505=>5814, +30500=>5815, +30494=>5816, +30501=>5817, +30502=>5818, +30491=>5819, +30519=>5820, +30520=>5821, +30535=>5822, +30554=>5823, +30568=>5824, +30571=>5825, +30555=>5826, +30565=>5827, +30591=>5828, +30590=>5829, +30585=>5830, +30606=>5831, +30603=>5832, +30609=>5833, +30624=>5834, +30622=>5835, +30640=>5836, +30646=>5837, +30649=>5838, +30655=>5839, +30652=>5840, +30653=>5841, +30651=>5842, +30663=>5843, +30669=>5844, +30679=>5845, +30682=>5846, +30684=>5847, +30691=>5848, +30702=>5849, +30716=>5850, +30732=>5851, +30738=>5852, +31014=>5853, +30752=>5854, +31018=>5855, +30789=>5856, +30862=>5857, +30836=>5858, +30854=>5859, +30844=>5860, +30874=>5861, +30860=>5862, +30883=>5863, +30901=>5864, +30890=>5865, +30895=>5866, +30929=>5867, +30918=>5868, +30923=>5869, +30932=>5870, +30910=>5871, +30908=>5872, +30917=>5873, +30922=>5874, +30956=>5875, +30951=>5876, +30938=>5877, +30973=>5878, +30964=>5879, +30983=>5880, +30994=>5881, +30993=>5882, +31001=>5883, +31020=>5884, +31019=>5885, +31040=>5886, +31072=>5887, +31063=>5888, +31071=>5889, +31066=>5890, +31061=>5891, +31059=>5892, +31098=>5893, +31103=>5894, +31114=>5895, +31133=>5896, +31143=>5897, +40779=>5898, +31146=>5899, +31150=>5900, +31155=>5901, +31161=>5902, +31162=>5903, +31177=>5904, +31189=>5905, +31207=>5906, +31212=>5907, +31201=>5908, +31203=>5909, +31240=>5910, +31245=>5911, +31256=>5912, +31257=>5913, +31264=>5914, +31263=>5915, +31104=>5916, +31281=>5917, +31291=>5918, +31294=>5919, +31287=>5920, +31299=>5921, +31319=>5922, +31305=>5923, +31329=>5924, +31330=>5925, +31337=>5926, +40861=>5927, +31344=>5928, +31353=>5929, +31357=>5930, +31368=>5931, +31383=>5932, +31381=>5933, +31384=>5934, +31382=>5935, +31401=>5936, +31432=>5937, +31408=>5938, +31414=>5939, +31429=>5940, +31428=>5941, +31423=>5942, +36995=>5943, +31431=>5944, +31434=>5945, +31437=>5946, +31439=>5947, +31445=>5948, +31443=>5949, +31449=>5950, +31450=>5951, +31453=>5952, +31457=>5953, +31458=>5954, +31462=>5955, +31469=>5956, +31472=>5957, +31490=>5958, +31503=>5959, +31498=>5960, +31494=>5961, +31539=>5962, +31512=>5963, +31513=>5964, +31518=>5965, +31541=>5966, +31528=>5967, +31542=>5968, +31568=>5969, +31610=>5970, +31492=>5971, +31565=>5972, +31499=>5973, +31564=>5974, +31557=>5975, +31605=>5976, +31589=>5977, +31604=>5978, +31591=>5979, +31600=>5980, +31601=>5981, +31596=>5982, +31598=>5983, +31645=>5984, +31640=>5985, +31647=>5986, +31629=>5987, +31644=>5988, +31642=>5989, +31627=>5990, +31634=>5991, +31631=>5992, +31581=>5993, +31641=>5994, +31691=>5995, +31681=>5996, +31692=>5997, +31695=>5998, +31668=>5999, +31686=>6000, +31709=>6001, +31721=>6002, +31761=>6003, +31764=>6004, +31718=>6005, +31717=>6006, +31840=>6007, +31744=>6008, +31751=>6009, +31763=>6010, +31731=>6011, +31735=>6012, +31767=>6013, +31757=>6014, +31734=>6015, +31779=>6016, +31783=>6017, +31786=>6018, +31775=>6019, +31799=>6020, +31787=>6021, +31805=>6022, +31820=>6023, +31811=>6024, +31828=>6025, +31823=>6026, +31808=>6027, +31824=>6028, +31832=>6029, +31839=>6030, +31844=>6031, +31830=>6032, +31845=>6033, +31852=>6034, +31861=>6035, +31875=>6036, +31888=>6037, +31908=>6038, +31917=>6039, +31906=>6040, +31915=>6041, +31905=>6042, +31912=>6043, +31923=>6044, +31922=>6045, +31921=>6046, +31918=>6047, +31929=>6048, +31933=>6049, +31936=>6050, +31941=>6051, +31938=>6052, +31960=>6053, +31954=>6054, +31964=>6055, +31970=>6056, +39739=>6057, +31983=>6058, +31986=>6059, +31988=>6060, +31990=>6061, +31994=>6062, +32006=>6063, +32002=>6064, +32028=>6065, +32021=>6066, +32010=>6067, +32069=>6068, +32075=>6069, +32046=>6070, +32050=>6071, +32063=>6072, +32053=>6073, +32070=>6074, +32115=>6075, +32086=>6076, +32078=>6077, +32114=>6078, +32104=>6079, +32110=>6080, +32079=>6081, +32099=>6082, +32147=>6083, +32137=>6084, +32091=>6085, +32143=>6086, +32125=>6087, +32155=>6088, +32186=>6089, +32174=>6090, +32163=>6091, +32181=>6092, +32199=>6093, +32189=>6094, +32171=>6095, +32317=>6096, +32162=>6097, +32175=>6098, +32220=>6099, +32184=>6100, +32159=>6101, +32176=>6102, +32216=>6103, +32221=>6104, +32228=>6105, +32222=>6106, +32251=>6107, +32242=>6108, +32225=>6109, +32261=>6110, +32266=>6111, +32291=>6112, +32289=>6113, +32274=>6114, +32305=>6115, +32287=>6116, +32265=>6117, +32267=>6118, +32290=>6119, +32326=>6120, +32358=>6121, +32315=>6122, +32309=>6123, +32313=>6124, +32323=>6125, +32311=>6126, +32306=>6127, +32314=>6128, +32359=>6129, +32349=>6130, +32342=>6131, +32350=>6132, +32345=>6133, +32346=>6134, +32377=>6135, +32362=>6136, +32361=>6137, +32380=>6138, +32379=>6139, +32387=>6140, +32213=>6141, +32381=>6142, +36782=>6143, +32383=>6144, +32392=>6145, +32393=>6146, +32396=>6147, +32402=>6148, +32400=>6149, +32403=>6150, +32404=>6151, +32406=>6152, +32398=>6153, +32411=>6154, +32412=>6155, +32568=>6156, +32570=>6157, +32581=>6158, +32588=>6159, +32589=>6160, +32590=>6161, +32592=>6162, +12153=>6163, +32593=>6163, +32597=>6164, +32596=>6165, +32600=>6166, +32607=>6167, +32608=>6168, +32616=>6169, +32617=>6170, +32615=>6171, +32632=>6172, +32642=>6173, +32646=>6174, +32643=>6175, +32648=>6176, +32647=>6177, +32652=>6178, +32660=>6179, +32670=>6180, +32669=>6181, +32666=>6182, +32675=>6183, +32687=>6184, +32690=>6185, +32697=>6186, +32686=>6187, +32694=>6188, +32696=>6189, +35697=>6190, +32709=>6191, +32710=>6192, +32714=>6193, +32725=>6194, +32724=>6195, +32737=>6196, +32742=>6197, +32745=>6198, +32755=>6199, +32761=>6200, +39132=>6201, +32774=>6202, +32772=>6203, +32779=>6204, +12158=>6205, +32786=>6205, +32792=>6206, +32793=>6207, +32796=>6208, +32801=>6209, +32808=>6210, +32831=>6211, +32827=>6212, +32842=>6213, +32838=>6214, +32850=>6215, +32856=>6216, +32858=>6217, +32863=>6218, +32866=>6219, +32872=>6220, +32883=>6221, +32882=>6222, +32880=>6223, +32886=>6224, +32889=>6225, +32893=>6226, +12160=>6227, +32895=>6227, +32900=>6228, +32902=>6229, +32901=>6230, +32923=>6231, +32915=>6232, +32922=>6233, +32941=>6234, +20880=>6235, +32940=>6236, +32987=>6237, +32997=>6238, +32985=>6239, +32989=>6240, +32964=>6241, +32986=>6242, +32982=>6243, +33033=>6244, +33007=>6245, +33009=>6246, +33051=>6247, +33065=>6248, +33059=>6249, +33071=>6250, +33099=>6251, +38539=>6252, +33094=>6253, +33086=>6254, +33107=>6255, +33105=>6256, +33020=>6257, +33137=>6258, +33134=>6259, +33125=>6260, +33126=>6261, +33140=>6262, +33155=>6263, +33160=>6264, +33162=>6265, +33152=>6266, +33154=>6267, +33184=>6268, +33173=>6269, +33188=>6270, +33187=>6271, +33119=>6272, +33171=>6273, +33193=>6274, +33200=>6275, +33205=>6276, +33214=>6277, +33208=>6278, +33213=>6279, +33216=>6280, +33218=>6281, +33210=>6282, +33225=>6283, +33229=>6284, +33233=>6285, +33241=>6286, +33240=>6287, +33224=>6288, +33242=>6289, +33247=>6290, +33248=>6291, +33255=>6292, +33274=>6293, +33275=>6294, +33278=>6295, +33281=>6296, +33282=>6297, +33285=>6298, +33287=>6299, +33290=>6300, +33293=>6301, +33296=>6302, +33302=>6303, +33321=>6304, +33323=>6305, +33336=>6306, +33331=>6307, +33344=>6308, +33369=>6309, +33368=>6310, +33373=>6311, +33370=>6312, +33375=>6313, +33380=>6314, +33378=>6315, +33384=>6316, +33386=>6317, +33387=>6318, +33326=>6319, +33393=>6320, +33399=>6321, +12171=>6322, +33400=>6322, +33406=>6323, +33421=>6324, +33426=>6325, +33451=>6326, +33439=>6327, +33467=>6328, +33452=>6329, +33505=>6330, +33507=>6331, +33503=>6332, +33490=>6333, +33524=>6334, +33523=>6335, +33530=>6336, +33683=>6337, +33539=>6338, +33531=>6339, +33529=>6340, +33502=>6341, +33542=>6342, +33500=>6343, +33545=>6344, +33497=>6345, +33589=>6346, +33588=>6347, +33558=>6348, +33586=>6349, +33585=>6350, +33600=>6351, +33593=>6352, +33616=>6353, +33605=>6354, +33583=>6355, +33579=>6356, +33559=>6357, +33560=>6358, +33669=>6359, +33690=>6360, +33706=>6361, +33695=>6362, +33698=>6363, +33686=>6364, +33571=>6365, +33678=>6366, +33671=>6367, +33674=>6368, +33660=>6369, +33717=>6370, +33651=>6371, +33653=>6372, +33696=>6373, +33673=>6374, +33704=>6375, +33780=>6376, +33811=>6377, +33771=>6378, +33742=>6379, +33789=>6380, +33795=>6381, +33752=>6382, +33803=>6383, +33729=>6384, +33783=>6385, +33799=>6386, +33760=>6387, +33778=>6388, +33805=>6389, +33826=>6390, +33824=>6391, +33725=>6392, +33848=>6393, +34054=>6394, +33787=>6395, +33901=>6396, +33834=>6397, +33852=>6398, +34138=>6399, +33924=>6400, +33911=>6401, +33899=>6402, +33965=>6403, +33902=>6404, +33922=>6405, +33897=>6406, +33862=>6407, +33836=>6408, +33903=>6409, +33913=>6410, +33845=>6411, +33994=>6412, +33890=>6413, +33977=>6414, +33983=>6415, +33951=>6416, +34009=>6417, +33997=>6418, +33979=>6419, +34010=>6420, +34000=>6421, +33985=>6422, +33990=>6423, +34006=>6424, +33953=>6425, +34081=>6426, +34047=>6427, +34036=>6428, +34071=>6429, +34072=>6430, +34092=>6431, +34079=>6432, +34069=>6433, +34068=>6434, +34044=>6435, +34112=>6436, +34147=>6437, +34136=>6438, +34120=>6439, +34113=>6440, +34306=>6441, +34123=>6442, +34133=>6443, +34176=>6444, +34212=>6445, +34184=>6446, +34193=>6447, +34186=>6448, +34216=>6449, +34157=>6450, +34196=>6451, +34203=>6452, +34282=>6453, +34183=>6454, +34204=>6455, +34167=>6456, +34174=>6457, +34192=>6458, +34249=>6459, +34234=>6460, +34255=>6461, +34233=>6462, +34256=>6463, +34261=>6464, +34269=>6465, +34277=>6466, +34268=>6467, +34297=>6468, +34314=>6469, +34323=>6470, +34315=>6471, +34302=>6472, +34298=>6473, +34310=>6474, +34338=>6475, +34330=>6476, +34352=>6477, +34367=>6478, +12172=>6479, +34381=>6479, +20053=>6480, +34388=>6481, +34399=>6482, +34407=>6483, +34417=>6484, +34451=>6485, +34467=>6486, +34473=>6487, +34474=>6488, +34443=>6489, +34444=>6490, +34486=>6491, +34479=>6492, +34500=>6493, +34502=>6494, +34480=>6495, +34505=>6496, +34851=>6497, +34475=>6498, +34516=>6499, +34526=>6500, +34537=>6501, +34540=>6502, +34527=>6503, +34523=>6504, +34543=>6505, +34578=>6506, +34566=>6507, +34568=>6508, +34560=>6509, +34563=>6510, +34555=>6511, +34577=>6512, +34569=>6513, +34573=>6514, +34553=>6515, +34570=>6516, +34612=>6517, +34623=>6518, +34615=>6519, +34619=>6520, +34597=>6521, +34601=>6522, +34586=>6523, +34656=>6524, +34655=>6525, +34680=>6526, +34636=>6527, +34638=>6528, +34676=>6529, +34647=>6530, +34664=>6531, +34670=>6532, +34649=>6533, +34643=>6534, +34659=>6535, +34666=>6536, +34821=>6537, +34722=>6538, +34719=>6539, +34690=>6540, +34735=>6541, +34763=>6542, +34749=>6543, +34752=>6544, +34768=>6545, +38614=>6546, +34731=>6547, +34756=>6548, +34739=>6549, +34759=>6550, +34758=>6551, +34747=>6552, +34799=>6553, +34802=>6554, +34784=>6555, +34831=>6556, +34829=>6557, +34814=>6558, +34806=>6559, +34807=>6560, +34830=>6561, +34770=>6562, +34833=>6563, +34838=>6564, +34837=>6565, +34850=>6566, +34849=>6567, +34865=>6568, +34870=>6569, +34873=>6570, +34855=>6571, +34875=>6572, +34884=>6573, +34882=>6574, +34898=>6575, +34905=>6576, +34910=>6577, +34914=>6578, +34923=>6579, +34945=>6580, +34942=>6581, +34974=>6582, +34933=>6583, +34941=>6584, +34997=>6585, +34930=>6586, +34946=>6587, +34967=>6588, +34962=>6589, +34990=>6590, +34969=>6591, +34978=>6592, +34957=>6593, +34980=>6594, +34992=>6595, +35007=>6596, +34993=>6597, +35011=>6598, +35012=>6599, +35028=>6600, +35032=>6601, +35033=>6602, +35037=>6603, +35065=>6604, +35074=>6605, +35068=>6606, +35060=>6607, +35048=>6608, +35058=>6609, +35076=>6610, +35084=>6611, +35082=>6612, +35091=>6613, +35139=>6614, +35102=>6615, +35109=>6616, +35114=>6617, +35115=>6618, +35137=>6619, +35140=>6620, +35131=>6621, +35126=>6622, +35128=>6623, +35148=>6624, +35101=>6625, +35168=>6626, +35166=>6627, +35174=>6628, +35172=>6629, +35181=>6630, +35178=>6631, +35183=>6632, +35188=>6633, +35191=>6634, +12177=>6635, +35198=>6635, +35203=>6636, +35208=>6637, +35210=>6638, +35219=>6639, +35224=>6640, +35233=>6641, +35241=>6642, +35238=>6643, +35244=>6644, +35247=>6645, +35250=>6646, +35258=>6647, +35261=>6648, +35263=>6649, +35264=>6650, +35290=>6651, +35292=>6652, +35293=>6653, +35303=>6654, +35316=>6655, +35320=>6656, +35331=>6657, +35350=>6658, +35344=>6659, +35340=>6660, +35355=>6661, +35357=>6662, +35365=>6663, +35382=>6664, +35393=>6665, +35419=>6666, +35410=>6667, +35398=>6668, +35400=>6669, +35452=>6670, +35437=>6671, +35436=>6672, +35426=>6673, +35461=>6674, +35458=>6675, +35460=>6676, +35496=>6677, +35489=>6678, +35473=>6679, +35493=>6680, +35494=>6681, +35482=>6682, +35491=>6683, +35524=>6684, +35533=>6685, +35522=>6686, +35546=>6687, +35563=>6688, +35571=>6689, +35559=>6690, +35556=>6691, +35569=>6692, +35604=>6693, +35552=>6694, +35554=>6695, +35575=>6696, +35550=>6697, +35547=>6698, +35596=>6699, +35591=>6700, +35610=>6701, +35553=>6702, +35606=>6703, +35600=>6704, +35607=>6705, +35616=>6706, +35635=>6707, +38827=>6708, +35622=>6709, +35627=>6710, +35646=>6711, +35624=>6712, +35649=>6713, +35660=>6714, +35663=>6715, +35662=>6716, +35657=>6717, +35670=>6718, +35675=>6719, +35674=>6720, +35691=>6721, +35679=>6722, +35692=>6723, +35695=>6724, +35700=>6725, +35709=>6726, +35712=>6727, +35724=>6728, +35726=>6729, +35730=>6730, +35731=>6731, +35734=>6732, +35737=>6733, +35738=>6734, +35898=>6735, +35905=>6736, +35903=>6737, +35912=>6738, +35916=>6739, +35918=>6740, +35920=>6741, +12183=>6742, +35925=>6742, +35938=>6743, +35948=>6744, +12184=>6745, +35960=>6745, +35962=>6746, +35970=>6747, +35977=>6748, +35973=>6749, +35978=>6750, +35981=>6751, +35982=>6752, +35988=>6753, +35964=>6754, +35992=>6755, +25117=>6756, +36013=>6757, +36010=>6758, +36029=>6759, +36018=>6760, +36019=>6761, +36014=>6762, +36022=>6763, +36040=>6764, +36033=>6765, +36068=>6766, +36067=>6767, +36058=>6768, +36093=>6769, +36090=>6770, +36091=>6771, +36100=>6772, +36101=>6773, +36106=>6774, +36103=>6775, +36111=>6776, +36109=>6777, +36112=>6778, +40782=>6779, +36115=>6780, +36045=>6781, +36116=>6782, +36118=>6783, +36199=>6784, +36205=>6785, +36209=>6786, +36211=>6787, +36225=>6788, +36249=>6789, +36290=>6790, +36286=>6791, +36282=>6792, +36303=>6793, +36314=>6794, +36310=>6795, +36300=>6796, +36315=>6797, +36299=>6798, +36330=>6799, +36331=>6800, +36319=>6801, +36323=>6802, +36348=>6803, +36360=>6804, +36361=>6805, +36351=>6806, +36381=>6807, +36382=>6808, +36368=>6809, +36383=>6810, +36418=>6811, +36405=>6812, +36400=>6813, +36404=>6814, +36426=>6815, +36423=>6816, +36425=>6817, +36428=>6818, +36432=>6819, +36424=>6820, +36441=>6821, +36452=>6822, +36448=>6823, +36394=>6824, +36451=>6825, +36437=>6826, +36470=>6827, +36466=>6828, +36476=>6829, +36481=>6830, +36487=>6831, +36485=>6832, +36484=>6833, +36491=>6834, +36490=>6835, +36499=>6836, +36497=>6837, +36500=>6838, +36505=>6839, +36522=>6840, +36513=>6841, +36524=>6842, +36528=>6843, +36550=>6844, +36529=>6845, +36542=>6846, +36549=>6847, +36552=>6848, +36555=>6849, +36571=>6850, +36579=>6851, +36604=>6852, +36603=>6853, +36587=>6854, +36606=>6855, +36618=>6856, +36613=>6857, +36629=>6858, +36626=>6859, +36633=>6860, +36627=>6861, +36636=>6862, +36639=>6863, +36635=>6864, +36620=>6865, +36646=>6866, +36659=>6867, +36667=>6868, +36665=>6869, +36677=>6870, +36674=>6871, +36670=>6872, +36684=>6873, +36681=>6874, +36678=>6875, +36686=>6876, +36695=>6877, +36700=>6878, +36706=>6879, +36707=>6880, +36708=>6881, +36764=>6882, +36767=>6883, +36771=>6884, +36781=>6885, +36783=>6886, +36791=>6887, +36826=>6888, +36837=>6889, +36834=>6890, +36842=>6891, +36847=>6892, +36999=>6893, +36852=>6894, +36869=>6895, +36857=>6896, +36858=>6897, +36881=>6898, +36885=>6899, +36897=>6900, +36877=>6901, +36894=>6902, +36886=>6903, +36875=>6904, +36903=>6905, +36918=>6906, +36917=>6907, +36921=>6908, +36856=>6909, +36943=>6910, +36944=>6911, +36945=>6912, +36946=>6913, +36878=>6914, +36937=>6915, +36926=>6916, +36950=>6917, +36952=>6918, +36958=>6919, +36968=>6920, +36975=>6921, +36982=>6922, +38568=>6923, +36978=>6924, +36994=>6925, +36989=>6926, +36993=>6927, +36992=>6928, +37002=>6929, +37001=>6930, +37007=>6931, +37032=>6932, +37039=>6933, +37041=>6934, +37045=>6935, +37090=>6936, +37092=>6937, +25160=>6938, +37083=>6939, +37122=>6940, +37138=>6941, +37145=>6942, +37170=>6943, +37168=>6944, +37194=>6945, +37206=>6946, +37208=>6947, +37219=>6948, +37221=>6949, +37225=>6950, +37235=>6951, +37234=>6952, +37259=>6953, +37257=>6954, +37250=>6955, +37282=>6956, +37291=>6957, +37295=>6958, +37290=>6959, +37301=>6960, +37300=>6961, +37306=>6962, +37312=>6963, +37313=>6964, +37321=>6965, +37323=>6966, +37328=>6967, +37334=>6968, +37343=>6969, +37345=>6970, +37339=>6971, +37372=>6972, +37365=>6973, +37366=>6974, +37406=>6975, +37375=>6976, +37396=>6977, +37420=>6978, +37397=>6979, +37393=>6980, +37470=>6981, +37463=>6982, +37445=>6983, +37449=>6984, +37476=>6985, +37448=>6986, +37525=>6987, +37439=>6988, +37451=>6989, +37456=>6990, +37532=>6991, +37526=>6992, +37523=>6993, +37531=>6994, +37466=>6995, +37583=>6996, +37561=>6997, +37559=>6998, +37609=>6999, +37647=>7000, +37626=>7001, +37700=>7002, +37678=>7003, +37657=>7004, +37666=>7005, +37658=>7006, +37667=>7007, +37690=>7008, +37685=>7009, +37691=>7010, +37724=>7011, +37728=>7012, +37756=>7013, +37742=>7014, +37718=>7015, +37808=>7016, +37804=>7017, +37805=>7018, +37780=>7019, +37817=>7020, +37846=>7021, +37847=>7022, +37864=>7023, +37861=>7024, +37848=>7025, +37827=>7026, +37853=>7027, +37840=>7028, +37832=>7029, +37860=>7030, +37914=>7031, +37908=>7032, +37907=>7033, +37891=>7034, +37895=>7035, +37904=>7036, +37942=>7037, +37931=>7038, +37941=>7039, +37921=>7040, +37946=>7041, +37953=>7042, +37970=>7043, +37956=>7044, +37979=>7045, +37984=>7046, +37986=>7047, +37982=>7048, +37994=>7049, +37417=>7050, +38000=>7051, +38005=>7052, +38007=>7053, +38013=>7054, +37978=>7055, +38012=>7056, +38014=>7057, +38017=>7058, +38015=>7059, +38274=>7060, +38279=>7061, +38282=>7062, +38292=>7063, +38294=>7064, +38296=>7065, +38297=>7066, +38304=>7067, +38312=>7068, +38311=>7069, +38317=>7070, +38332=>7071, +38331=>7072, +38329=>7073, +38334=>7074, +38346=>7075, +28662=>7076, +38339=>7077, +38349=>7078, +38348=>7079, +38357=>7080, +38356=>7081, +38358=>7082, +38364=>7083, +38369=>7084, +38373=>7085, +38370=>7086, +38433=>7087, +38440=>7088, +38446=>7089, +38447=>7090, +38466=>7091, +38476=>7092, +38479=>7093, +38475=>7094, +38519=>7095, +38492=>7096, +38494=>7097, +38493=>7098, +38495=>7099, +38502=>7100, +38514=>7101, +38508=>7102, +38541=>7103, +38552=>7104, +38549=>7105, +38551=>7106, +38570=>7107, +38567=>7108, +38577=>7109, +38578=>7110, +38576=>7111, +38580=>7112, +12202=>7113, +38582=>7113, +38584=>7114, +12203=>7115, +38585=>7115, +38606=>7116, +38603=>7117, +38601=>7118, +38605=>7119, +35149=>7120, +38620=>7121, +38669=>7122, +38613=>7123, +38649=>7124, +38660=>7125, +38662=>7126, +38664=>7127, +38675=>7128, +38670=>7129, +38673=>7130, +38671=>7131, +38678=>7132, +38681=>7133, +38692=>7134, +38698=>7135, +38704=>7136, +38713=>7137, +38717=>7138, +38718=>7139, +38724=>7140, +38726=>7141, +38728=>7142, +38722=>7143, +38729=>7144, +38748=>7145, +38752=>7146, +38756=>7147, +38758=>7148, +38760=>7149, +21202=>7150, +38763=>7151, +38769=>7152, +38777=>7153, +38789=>7154, +38780=>7155, +38785=>7156, +38778=>7157, +38790=>7158, +38795=>7159, +38799=>7160, +38800=>7161, +38812=>7162, +38824=>7163, +38822=>7164, +38819=>7165, +38835=>7166, +38836=>7167, +38851=>7168, +38854=>7169, +38856=>7170, +12209=>7171, +38859=>7171, +38876=>7172, +12210=>7173, +38893=>7173, +40783=>7174, +38898=>7175, +31455=>7176, +38902=>7177, +38901=>7178, +38927=>7179, +38924=>7180, +38968=>7181, +38948=>7182, +38945=>7183, +38967=>7184, +38973=>7185, +38982=>7186, +38991=>7187, +38987=>7188, +39019=>7189, +39023=>7190, +39024=>7191, +39025=>7192, +39028=>7193, +39027=>7194, +39082=>7195, +39087=>7196, +39089=>7197, +39094=>7198, +39108=>7199, +39107=>7200, +39110=>7201, +39145=>7202, +39147=>7203, +39171=>7204, +39177=>7205, +39186=>7206, +39188=>7207, +39192=>7208, +39201=>7209, +39197=>7210, +39198=>7211, +39204=>7212, +39200=>7213, +39212=>7214, +39214=>7215, +39229=>7216, +39230=>7217, +39234=>7218, +39241=>7219, +39237=>7220, +39248=>7221, +39243=>7222, +39249=>7223, +39250=>7224, +39244=>7225, +39253=>7226, +39319=>7227, +39320=>7228, +39333=>7229, +39341=>7230, +39342=>7231, +39356=>7232, +39391=>7233, +39387=>7234, +39389=>7235, +39384=>7236, +39377=>7237, +39405=>7238, +39406=>7239, +39409=>7240, +39410=>7241, +39419=>7242, +39416=>7243, +39425=>7244, +39439=>7245, +39429=>7246, +39394=>7247, +39449=>7248, +39467=>7249, +39479=>7250, +39493=>7251, +39490=>7252, +39488=>7253, +39491=>7254, +39486=>7255, +39509=>7256, +39501=>7257, +39515=>7258, +39511=>7259, +39519=>7260, +39522=>7261, +39525=>7262, +39524=>7263, +39529=>7264, +39531=>7265, +39530=>7266, +39597=>7267, +39600=>7268, +39612=>7269, +39616=>7270, +39631=>7271, +39633=>7272, +39635=>7273, +39636=>7274, +39646=>7275, +12221=>7276, +39647=>7276, +39650=>7277, +39651=>7278, +39654=>7279, +39663=>7280, +39659=>7281, +39662=>7282, +39668=>7283, +39665=>7284, +39671=>7285, +39675=>7286, +39686=>7287, +39704=>7288, +39706=>7289, +39711=>7290, +39714=>7291, +39715=>7292, +12222=>7293, +39717=>7293, +39719=>7294, +39720=>7295, +39721=>7296, +39722=>7297, +39726=>7298, +12223=>7299, +39727=>7299, +39730=>7300, +12224=>7300, +39748=>7301, +39747=>7302, +39759=>7303, +39757=>7304, +39758=>7305, +39761=>7306, +39768=>7307, +39796=>7308, +39827=>7309, +39811=>7310, +39825=>7311, +39830=>7312, +39831=>7313, +39839=>7314, +39840=>7315, +39848=>7316, +39860=>7317, +39872=>7318, +39882=>7319, +39865=>7320, +39878=>7321, +39887=>7322, +39889=>7323, +39890=>7324, +39907=>7325, +39906=>7326, +39908=>7327, +39892=>7328, +39905=>7329, +39994=>7330, +39922=>7331, +39921=>7332, +39920=>7333, +39957=>7334, +39956=>7335, +39945=>7336, +39955=>7337, +39948=>7338, +39942=>7339, +39944=>7340, +39954=>7341, +39946=>7342, +39940=>7343, +39982=>7344, +39963=>7345, +39973=>7346, +39972=>7347, +39969=>7348, +39984=>7349, +40007=>7350, +39986=>7351, +40006=>7352, +39998=>7353, +40026=>7354, +40032=>7355, +40039=>7356, +40054=>7357, +40056=>7358, +40167=>7359, +40172=>7360, +40176=>7361, +40201=>7362, +40200=>7363, +40171=>7364, +40195=>7365, +40198=>7366, +40234=>7367, +40230=>7368, +40367=>7369, +40227=>7370, +40223=>7371, +40260=>7372, +40213=>7373, +40210=>7374, +40257=>7375, +40255=>7376, +40254=>7377, +40262=>7378, +40264=>7379, +40285=>7380, +40286=>7381, +40292=>7382, +40273=>7383, +40272=>7384, +40281=>7385, +40306=>7386, +40329=>7387, +40327=>7388, +40363=>7389, +40303=>7390, +40314=>7391, +40346=>7392, +40356=>7393, +40361=>7394, +40370=>7395, +40388=>7396, +40385=>7397, +40379=>7398, +40376=>7399, +40378=>7400, +40390=>7401, +40399=>7402, +40386=>7403, +40409=>7404, +40403=>7405, +40440=>7406, +40422=>7407, +40429=>7408, +40431=>7409, +40445=>7410, +40474=>7411, +40475=>7412, +40478=>7413, +12228=>7414, +40565=>7414, +40569=>7415, +40573=>7416, +40577=>7417, +40584=>7418, +40587=>7419, +40588=>7420, +40594=>7421, +40597=>7422, +40593=>7423, +40605=>7424, +12230=>7425, +40613=>7425, +40617=>7426, +40632=>7427, +40618=>7428, +40621=>7429, +38753=>7430, +40652=>7431, +40654=>7432, +40655=>7433, +40656=>7434, +40660=>7435, +40668=>7436, +40670=>7437, +40669=>7438, +40672=>7439, +40677=>7440, +40680=>7441, +40687=>7442, +40692=>7443, +40694=>7444, +40695=>7445, +12235=>7446, +40697=>7446, +40699=>7447, +40700=>7448, +12236=>7449, +40701=>7449, +40711=>7450, +40712=>7451, +30391=>7452, +40725=>7453, +40737=>7454, +40748=>7455, +40766=>7456, +40778=>7457, +12241=>7457, +40786=>7458, +12242=>7458, +40788=>7459, +40803=>7460, +40799=>7461, +40800=>7462, +40801=>7463, +40806=>7464, +40807=>7465, +40812=>7466, +40810=>7467, +40823=>7468, +40818=>7469, +40822=>7470, +40853=>7471, +40860=>7472, +12244=>7472, +40864=>7473, +12245=>7473, +22575=>7474, +27079=>7475, +36953=>7476, +29796=>7477, +9472=>7479, +9473=>7480, +9474=>7481, +9475=>7482, +9476=>7483, +9477=>7484, +9478=>7485, +9479=>7486, +9480=>7487, +9481=>7488, +9482=>7489, +9483=>7490, +9484=>7491, +9485=>7492, +9486=>7493, +9487=>7494, +9488=>7495, +9489=>7496, +9490=>7497, +9491=>7498, +9492=>7499, +9493=>7500, +9494=>7501, +9495=>7502, +9496=>7503, +9497=>7504, +9498=>7505, +9499=>7506, +9500=>7507, +9501=>7508, +9502=>7509, +9503=>7510, +9504=>7511, +9505=>7512, +9506=>7513, +9507=>7514, +9508=>7515, +9509=>7516, +9510=>7517, +9511=>7518, +9512=>7519, +9513=>7520, +9514=>7521, +9515=>7522, +9516=>7523, +9517=>7524, +9518=>7525, +9519=>7526, +9520=>7527, +9521=>7528, +9522=>7529, +9523=>7530, +9524=>7531, +9525=>7532, +9526=>7533, +9527=>7534, +9528=>7535, +9529=>7536, +9530=>7537, +9531=>7538, +9532=>7539, +9533=>7540, +9534=>7541, +9535=>7542, +9536=>7543, +9537=>7544, +9538=>7545, +9539=>7546, +9540=>7547, +9541=>7548, +9542=>7549, +9543=>7550, +9544=>7551, +9545=>7552, +9546=>7553, +9547=>7554, +9312=>7555, +9313=>7556, +9314=>7557, +9315=>7558, +9316=>7559, +9317=>7560, +9318=>7561, +9319=>7562, +9320=>7563, +9321=>7564, +9322=>7565, +9323=>7566, +9324=>7567, +9325=>7568, +9326=>7569, +9327=>7570, +9328=>7571, +9329=>7572, +9330=>7573, +9331=>7574, +8544=>7575, +8545=>7576, +8546=>7577, +8547=>7578, +8548=>7579, +8549=>7580, +8550=>7581, +8551=>7582, +8552=>7583, +8553=>7584, +13129=>7585, +13076=>7586, +13133=>7588, +13095=>7590, +13110=>7592, +13137=>7593, +13069=>7595, +13094=>7596, +13099=>7598, +13130=>7599, +13212=>7601, +13213=>7602, +13214=>7603, +13198=>7604, +13199=>7605, +13252=>7606, +13217=>7607, +12317=>7608, +12319=>7609, +8470=>7610, +13261=>7611, +12964=>7613, +12965=>7614, +12966=>7615, +12967=>7616, +12968=>7617, +12849=>7618, +12850=>7619, +12857=>7620, +13182=>7621, +13181=>7622, +13180=>7623, +8750=>7624, +8721=>7625, +8735=>7629, +8895=>7630, +21854=>7633, +167133=>7641, +28976=>7644, +40407=>7646, +64054=>7651, +22169=>7654, +15694=>7655, +20448=>7660, +36544=>7663, +194797=>7665, +153716=>7670, +32363=>7671, +33606=>7672, +167670=>7673, +40572=>7677, +26171=>7680, +40628=>7682, +26629=>7687, +23650=>7693, +194780=>7695, +32353=>7697, +64070=>7700, +34083=>7706, +37292=>7707, +34796=>7715, +25620=>7724, +39506=>7727, +64074=>7732, +194692=>7734, +31774=>7739, +64016=>7746, +25681=>7747, +63980=>7750, +22625=>7751, +39002=>7752, +194679=>7754, +31153=>7758, +28678=>7760, +22218=>7770, +21085=>7774, +28497=>7776, +37297=>7777, +64106=>7788, +38960=>7795, +40629=>7797, +33802=>7807, +63939=>7808, +63890=>7809, +63891=>7810, +63897=>7811, +34847=>7813, +194575=>7814, +194771=>7816, +194584=>7817, +137754=>7825, +23643=>7826, +25890=>7831, +26618=>7834, +26766=>7836, +148432=>7838, +194848=>7839, +34110=>7861, +30562=>7877, +65041=>7887, +65042=>7888, +65075=>7890, +65073=>7892, +65074=>7893, +8285=>7897, +65049=>7897, +8282=>7898, +65072=>7898, +65077=>7899, +65078=>7900, +65081=>7901, +65082=>7902, +65095=>7903, +65096=>7904, +65079=>7905, +65080=>7906, +65087=>7907, +65088=>7908, +65085=>7909, +65086=>7910, +65089=>7911, +65090=>7912, +65091=>7913, +65092=>7914, +65083=>7915, +65084=>7916, +12436=>7958, +12437=>7959, +12438=>7960, +22099=>7963, +65508=>8005, +65287=>8006, +65282=>8007, +9665=>8009, +9655=>8010, +8681=>8011, +8679=>8012, +8678=>8013, +8680=>8014, +9634=>8015, +9831=>8016, +9825=>8017, +9828=>8018, +9826=>8019, +13216=>8020, +13218=>8021, +13220=>8022, +13221=>8023, +13207=>8024, +8467=>8025, +13208=>8026, +13235=>8027, +13234=>8028, +13233=>8029, +13232=>8030, +13189=>8031, +13190=>8032, +13191=>8033, +13259=>8034, +13200=>8035, +13268=>8036, +13206=>8037, +13090=>8038, +13078=>8039, +13080=>8040, +13077=>8041, +13059=>8042, +13091=>8043, +13143=>8044, +13122=>8045, +13113=>8046, +13115=>8047, +13056=>8048, +13105=>8049, +13127=>8050, +13086=>8051, +13098=>8052, +13183=>8054, +8481=>8055, +9742=>8056, +12342=>8057, +12320=>8058, +9352=>8062, +9353=>8063, +9354=>8064, +9355=>8065, +9356=>8066, +9357=>8067, +9358=>8068, +9359=>8069, +9360=>8070, +9332=>8071, +9333=>8072, +9334=>8073, +9335=>8074, +9336=>8075, +9337=>8076, +9338=>8077, +9339=>8078, +9340=>8079, +9341=>8080, +9342=>8081, +9343=>8082, +9344=>8083, +9345=>8084, +9346=>8085, +9347=>8086, +9348=>8087, +9349=>8088, +9350=>8089, +9351=>8090, +12881=>8091, +8560=>8092, +8561=>8093, +8562=>8094, +8563=>8095, +8564=>8096, +8565=>8097, +8566=>8098, +8567=>8099, +8568=>8100, +8569=>8101, +12882=>8102, +12883=>8103, +12884=>8104, +12885=>8105, +12886=>8106, +12887=>8107, +12888=>8108, +12889=>8109, +12890=>8110, +12891=>8111, +9372=>8112, +9373=>8113, +9374=>8114, +9375=>8115, +9376=>8116, +9377=>8117, +9378=>8118, +9379=>8119, +9380=>8120, +9381=>8121, +9382=>8122, +9383=>8123, +9384=>8124, +9385=>8125, +9386=>8126, +9387=>8127, +9388=>8128, +9389=>8129, +9390=>8130, +9391=>8131, +9392=>8132, +9393=>8133, +9394=>8134, +9395=>8135, +9396=>8136, +9397=>8137, +12867=>8138, +12861=>8139, +12863=>8140, +12852=>8141, +12856=>8142, +12851=>8143, +12860=>8144, +12866=>8145, +12862=>8146, +12854=>8147, +12853=>8148, +12859=>8149, +12864=>8150, +12858=>8151, +12976=>8152, +12973=>8153, +12969=>8154, +12975=>8155, +12948=>8156, +12970=>8157, +12952=>8158, +12971=>8159, +12946=>8160, +12945=>8161, +12947=>8162, +12972=>8163, +12974=>8164, +12950=>8165, +9131=>8174, +9132=>8175, +9133=>8176, +9127=>8178, +9128=>8179, +9129=>8180, +13260=>8182, +13061=>8183, +13215=>8186, +13219=>8187, +13222=>8188, +12958=>8191, +13192=>8192, +13193=>8193, +13256=>8194, +8749=>8195, +12848=>8197, +12842=>8198, +12843=>8199, +12844=>8200, +12845=>8201, +12846=>8202, +12847=>8203, +12855=>8204, +12865=>8205, +10145=>8206, +11013=>8207, +11014=>8208, +11015=>8209, +9673=>8210, +9824=>8211, +9829=>8212, +9827=>8213, +9830=>8214, +9728=>8215, +9729=>8216, +9730=>8217, +9731=>8218, +9758=>8219, +9756=>8220, +9757=>8221, +9759=>8222, +12953=>8223, +9450=>8224, +8554=>8225, +8555=>8226, +9601=>8230, +9602=>8231, +9603=>8232, +9604=>8233, +9605=>8234, +9606=>8235, +9607=>8236, +9608=>8237, +9615=>8238, +9614=>8239, +9613=>8240, +9612=>8241, +9611=>8242, +9610=>8243, +9609=>8244, +9620=>8245, +9621=>8246, +9581=>8247, +9582=>8248, +9584=>8249, +9583=>8250, +9552=>8251, +9566=>8252, +9578=>8253, +9569=>8254, +9698=>8255, +9699=>8256, +9701=>8257, +9700=>8258, +9585=>8261, +9586=>8262, +9587=>8263, +65040=>8268, +20956=>8284, +29081=>8285, +10102=>8286, +10103=>8287, +10104=>8288, +10105=>8289, +10106=>8290, +10107=>8291, +10108=>8292, +10109=>8293, +10110=>8294, +8570=>8298, +8571=>8299, +8575=>8303, +8458=>8304, +8457=>8305, +8507=>8307, +12292=>8308, +8646=>8309, +8644=>8310, +8645=>8311, +12535=>8313, +12536=>8314, +12537=>8315, +12538=>8316, +12957=>8319, +13179=>8323, +13107=>8327, +13134=>8328, +32394=>8359, +35100=>8360, +37704=>8361, +37512=>8362, +34012=>8363, +20425=>8364, +28859=>8365, +26161=>8366, +26824=>8367, +37625=>8368, +26363=>8369, +24389=>8370, +12033=>8371, +20008=>8371, +20193=>8372, +20220=>8373, +20224=>8374, +20227=>8375, +20281=>8376, +20310=>8377, +20370=>8378, +20362=>8379, +20378=>8380, +20372=>8381, +20429=>8382, +20544=>8383, +20514=>8384, +20479=>8385, +20510=>8386, +20550=>8387, +20592=>8388, +20546=>8389, +20628=>8390, +20724=>8391, +20696=>8392, +20810=>8393, +20836=>8394, +20893=>8395, +20926=>8396, +20972=>8397, +21013=>8398, +21148=>8399, +21158=>8400, +21184=>8401, +21211=>8402, +21248=>8403, +21284=>8405, +21362=>8406, +21395=>8407, +21426=>8408, +21469=>8409, +64014=>8410, +21660=>8411, +21642=>8412, +21673=>8413, +21759=>8414, +21894=>8415, +22361=>8416, +22373=>8417, +22444=>8418, +22472=>8419, +22471=>8420, +64015=>8421, +22686=>8423, +22706=>8424, +22795=>8425, +22867=>8426, +22875=>8427, +22877=>8428, +22883=>8429, +22948=>8430, +22970=>8431, +23382=>8432, +23488=>8433, +29999=>8434, +23512=>8435, +23582=>8437, +23718=>8438, +23738=>8439, +23797=>8440, +23847=>8441, +23891=>8442, +23874=>8444, +23917=>8445, +23992=>8446, +23993=>8447, +24016=>8448, +24353=>8449, +24372=>8450, +24423=>8451, +24503=>8452, +24542=>8453, +24669=>8454, +24709=>8455, +24714=>8456, +24798=>8457, +24789=>8458, +24864=>8459, +24818=>8460, +24849=>8461, +24887=>8462, +24880=>8463, +24984=>8464, +25107=>8465, +25254=>8466, +25589=>8467, +25696=>8468, +25757=>8469, +25806=>8470, +25934=>8471, +26112=>8472, +26133=>8473, +26121=>8474, +26158=>8475, +26148=>8477, +26213=>8478, +26199=>8479, +26201=>8480, +64018=>8481, +26227=>8482, +26265=>8483, +26272=>8484, +26290=>8485, +26303=>8486, +26362=>8487, +26382=>8488, +26470=>8490, +26555=>8491, +26706=>8492, +26560=>8493, +26692=>8495, +26831=>8496, +64019=>8497, +26984=>8498, +64020=>8499, +27032=>8500, +27106=>8501, +27184=>8502, +27243=>8503, +27206=>8504, +27251=>8505, +27262=>8506, +27362=>8507, +27364=>8508, +27606=>8509, +27711=>8510, +27740=>8511, +27782=>8512, +27759=>8513, +27866=>8514, +27908=>8515, +28039=>8516, +28015=>8517, +28054=>8518, +28076=>8519, +28111=>8520, +28152=>8521, +28146=>8522, +28156=>8523, +28217=>8524, +28252=>8525, +28199=>8526, +28220=>8527, +28351=>8528, +28552=>8529, +28597=>8530, +28661=>8531, +28677=>8532, +28679=>8533, +28712=>8534, +28805=>8535, +28843=>8536, +28943=>8537, +28932=>8538, +29020=>8539, +28998=>8540, +28999=>8541, +29121=>8543, +29182=>8544, +29361=>8545, +29374=>8546, +29476=>8547, +64022=>8548, +29559=>8549, +29629=>8550, +29641=>8551, +29654=>8552, +29667=>8553, +29650=>8554, +29703=>8555, +29685=>8556, +29734=>8557, +29738=>8558, +29737=>8559, +29742=>8560, +29833=>8562, +29855=>8563, +29953=>8564, +30063=>8565, +30338=>8566, +30364=>8567, +30366=>8568, +30363=>8569, +30374=>8570, +64023=>8571, +30534=>8572, +21167=>8573, +30753=>8574, +30798=>8575, +30820=>8576, +30842=>8577, +31024=>8578, +64024=>8579, +64025=>8580, +64026=>8581, +31124=>8582, +64027=>8583, +31131=>8584, +31441=>8585, +31463=>8586, +64028=>8587, +31467=>8588, +31646=>8589, +64029=>8590, +32072=>8591, +32183=>8593, +32160=>8594, +32214=>8595, +32338=>8596, +32583=>8597, +32673=>8598, +64030=>8599, +33537=>8600, +33634=>8601, +33663=>8602, +33735=>8603, +33782=>8604, +33864=>8605, +33972=>8606, +34131=>8607, +34137=>8608, +34155=>8609, +64031=>8610, +34224=>8611, +64032=>8612, +64033=>8613, +34823=>8614, +35061=>8615, +35346=>8616, +35383=>8617, +35449=>8618, +35495=>8619, +35518=>8620, +35551=>8621, +64034=>8622, +35574=>8623, +35667=>8624, +35711=>8625, +36080=>8626, +36084=>8627, +36114=>8628, +36214=>8629, +64035=>8630, +36559=>8631, +64037=>8633, +36967=>8634, +37086=>8635, +64038=>8636, +37141=>8637, +37159=>8638, +37338=>8639, +37335=>8640, +37342=>8641, +37357=>8642, +37358=>8643, +37348=>8644, +37349=>8645, +37382=>8646, +37392=>8647, +37386=>8648, +37434=>8649, +37440=>8650, +37436=>8651, +37454=>8652, +37465=>8653, +37457=>8654, +37433=>8655, +37479=>8656, +37543=>8657, +37495=>8658, +37496=>8659, +37607=>8660, +37591=>8661, +37593=>8662, +37584=>8663, +64039=>8664, +37589=>8665, +37600=>8666, +37587=>8667, +37669=>8668, +37665=>8669, +37627=>8670, +64040=>8671, +37662=>8672, +37631=>8673, +37661=>8674, +37634=>8675, +37744=>8676, +37719=>8677, +37796=>8678, +37830=>8679, +37854=>8680, +37880=>8681, +37937=>8682, +37957=>8683, +37960=>8684, +38290=>8685, +64041=>8687, +38557=>8688, +38575=>8689, +38707=>8690, +38715=>8691, +38723=>8692, +38733=>8693, +38735=>8694, +12205=>8695, +38737=>8695, +38999=>8697, +39013=>8698, +64042=>8699, +64043=>8700, +39207=>8701, +64044=>8702, +39326=>8703, +39502=>8704, +39641=>8705, +39644=>8706, +39797=>8707, +39794=>8708, +39823=>8709, +39857=>8710, +39867=>8711, +39936=>8712, +40304=>8713, +40299=>8714, +64045=>8715, +40473=>8716, +40657=>8717, +8364=>9354, +8486=>9355, +64256=>9358, +64259=>9359, +64260=>9360, +257=>9361, +299=>9362, +363=>9363, +275=>9364, +333=>9365, +256=>9366, +298=>9367, +362=>9368, +274=>9369, +332=>9370, +8539=>9371, +8540=>9372, +8541=>9373, +8542=>9374, +8531=>9375, +8532=>9376, +8304=>9377, +8308=>9378, +8309=>9379, +8310=>9380, +8311=>9381, +8312=>9382, +8313=>9383, +8320=>9384, +8321=>9385, +8322=>9386, +8323=>9387, +8324=>9388, +8325=>9389, +8326=>9390, +8327=>9391, +8328=>9392, +8329=>9393, +461=>9394, +282=>9395, +7868=>9397, +463=>9398, +296=>9400, +465=>9401, +467=>9403, +366=>9404, +360=>9405, +462=>9406, +283=>9407, +7869=>9409, +464=>9410, +297=>9412, +466=>9413, +468=>9415, +367=>9416, +361=>9417, +593=>9418, +8049=>9419, +8048=>9420, +509=>9421, +596=>9423, +601=>9426, +602=>9429, +603=>9432, +8051=>9433, +8050=>9434, +567=>9435, +331=>9436, +629=>9437, +652=>9438, +658=>9441, +643=>9442, +720=>9443, +8534=>9785, +8535=>9786, +8536=>9787, +8537=>9788, +8538=>9789, +12832=>10126, +12833=>10127, +12834=>10128, +12835=>10129, +12836=>10130, +12837=>10131, +12838=>10132, +12839=>10133, +12840=>10134, +12841=>10135, +12892=>10244, +12893=>10245, +12894=>10246, +12895=>10247, +12977=>10248, +12978=>10249, +12979=>10250, +12980=>10251, +12981=>10252, +12982=>10253, +12983=>10254, +12984=>10255, +12985=>10256, +12986=>10257, +12987=>10258, +12988=>10259, +12989=>10260, +12990=>10261, +12991=>10262, +9424=>10313, +9425=>10314, +9426=>10315, +9427=>10316, +9428=>10317, +9429=>10318, +9430=>10319, +9431=>10320, +9432=>10321, +9433=>10322, +9434=>10323, +9435=>10324, +9436=>10325, +9437=>10326, +9438=>10327, +9439=>10328, +9440=>10329, +9441=>10330, +9442=>10331, +9443=>10332, +9444=>10333, +9445=>10334, +9446=>10335, +9447=>10336, +9448=>10337, +9449=>10338, +9398=>10339, +9399=>10340, +9400=>10341, +9401=>10342, +9402=>10343, +9403=>10344, +9404=>10345, +9405=>10346, +9406=>10347, +9407=>10348, +9408=>10349, +9409=>10350, +9410=>10351, +9411=>10352, +9412=>10353, +9413=>10354, +9414=>10355, +9415=>10356, +9416=>10357, +9417=>10358, +9418=>10359, +9419=>10360, +9420=>10361, +9421=>10362, +9422=>10363, +9423=>10364, +13008=>10413, +13009=>10414, +13010=>10415, +13011=>10416, +13012=>10417, +13013=>10418, +13014=>10419, +13015=>10420, +13016=>10421, +13017=>10422, +13018=>10423, +13019=>10424, +13020=>10425, +13021=>10426, +13022=>10427, +13023=>10428, +13024=>10429, +13025=>10430, +13026=>10431, +13027=>10432, +13028=>10433, +13029=>10434, +13030=>10435, +13031=>10436, +13032=>10437, +13033=>10438, +13034=>10439, +13035=>10440, +13036=>10441, +13037=>10442, +13038=>10443, +13039=>10444, +13040=>10445, +13041=>10446, +13042=>10447, +13043=>10448, +13044=>10449, +13045=>10450, +13046=>10451, +13047=>10452, +13048=>10453, +13049=>10454, +13050=>10455, +13051=>10456, +13052=>10457, +13053=>10458, +13054=>10459, +12928=>10461, +12929=>10462, +12930=>10463, +12931=>10464, +12932=>10465, +12933=>10466, +12934=>10467, +12935=>10468, +12936=>10469, +12937=>10470, +12944=>10471, +12938=>10472, +12939=>10473, +12940=>10474, +12941=>10475, +12942=>10476, +12943=>10477, +12959=>10479, +12960=>10486, +12961=>10487, +12955=>10488, +12954=>10489, +12963=>10490, +12962=>10491, +12951=>10492, +12956=>10494, +12949=>10495, +9676=>10502, +9471=>10503, +10111=>10514, +9451=>10515, +9452=>10516, +9453=>10517, +9454=>10518, +9455=>10519, +9456=>10520, +9457=>10521, +9458=>10522, +9459=>10523, +9460=>10524, +8414=>11035, +13274=>11851, +8448=>11855, +13250=>11856, +8453=>11859, +13169=>11861, +13197=>11864, +13211=>11865, +13271=>11869, +13272=>11870, +13057=>11874, +13058=>11875, +13060=>11876, +13062=>11877, +13064=>11879, +13063=>11881, +13066=>11882, +13065=>11884, +13067=>11886, +13068=>11888, +13070=>11889, +13071=>11890, +13072=>11891, +13073=>11892, +13074=>11893, +13075=>11894, +13079=>11896, +13081=>11898, +13082=>11900, +13083=>11901, +13084=>11902, +13085=>11903, +13087=>11904, +13088=>11905, +13089=>11906, +13092=>11907, +13093=>11909, +13096=>11912, +13097=>11913, +13101=>11915, +13102=>11918, +13103=>11919, +13104=>11920, +13106=>11921, +13108=>11924, +13109=>11925, +13116=>11926, +13111=>11930, +13112=>11932, +13114=>11933, +13117=>11934, +13121=>11935, +13118=>11936, +13119=>11937, +13120=>11938, +13123=>11939, +13124=>11940, +13125=>11941, +13126=>11942, +13128=>11943, +13131=>11944, +13132=>11945, +13135=>11946, +13136=>11947, +13138=>11950, +13140=>11951, +13139=>11954, +13141=>11955, +13142=>11956, +8501=>12089, +976=>12090, +8714=>12091, +8463=>12092, +981=>12094, +987=>12095, +977=>12096, +9832=>12098, +9833=>12099, +9836=>12100, +12347=>12106, +12339=>12108, +12340=>12109, +12341=>12110, +8252=>12111, +8265=>12112, +8723=>12118, +8771=>12120, +8818=>12121, +8819=>12122, +12312=>12129, +12313=>12130, +65375=>12131, +65376=>12132, +9115=>12143, +9117=>12144, +9118=>12145, +9120=>12146, +9121=>12151, +9123=>12152, +9124=>12153, +9126=>12154, +9116=>12167, +9119=>12167, +9122=>12167, +9125=>12167, +9130=>12167, +9986=>12176, +12349=>12179, +12447=>12181, +8709=>12184, +8864=>12185, +8854=>12186, +8856=>12187, +8853=>12188, +8855=>12189, +9888=>12192, +9664=>12194, +9654=>12195, +8656=>12200, +8596=>12201, +8600=>12202, +8601=>12203, +8598=>12204, +8599=>12205, +8652=>12206, +8651=>12207, +12336=>12218, +8967=>12219, +10048=>12228, +10047=>12229, +9643=>12237, +9642=>12239, +10010=>12241, +9702=>12254, +10070=>12259, +65093=>12639, +65094=>12640, +64103=>13320, +64098=>13321, +32227=>13322, +12232=>13323, +40643=>13323, +28331=>13324, +64082=>13325, +64061=>13326, +64069=>13327, +64062=>13328, +27114=>13329, +28212=>13330, +64096=>13331, +64071=>13332, +64056=>13333, +64066=>13334, +64078=>13335, +34395=>13336, +64105=>13337, +64052=>13338, +64099=>13339, +25581=>13340, +25802=>13341, +30799=>13342, +64084=>13343, +63856=>13344, +64077=>13345, +64097=>13346, +64072=>13347, +64076=>13348, +64091=>13349, +64092=>13350, +64081=>13351, +64067=>13352, +64090=>13353, +28041=>13354, +29376=>13355, +194885=>13357, +64086=>13358, +64080=>13359, +64049=>13360, +64059=>13361, +24034=>13362, +64063=>13363, +64101=>13364, +21373=>13365, +64055=>13366, +64095=>13367, +24501=>13368, +64064=>13369, +64083=>13371, +64085=>13373, +64104=>13374, +64068=>13375, +64089=>13376, +26202=>13377, +64053=>13378, +64075=>13379, +64100=>13380, +64065=>13381, +64048=>13382, +64057=>13384, +64051=>13385, +27493=>13386, +64058=>13387, +27599=>13388, +64050=>13389, +25150=>13390, +64079=>13391, +63773=>13392, +63964=>13393, +63798=>13394, +28122=>13395, +63952=>13396, +26310=>13397, +27511=>13398, +64087=>13399, +37706=>13400, +37636=>13402, +133390=>13523, +35999=>13644, +11991=>13645, +11965=>13646, +158033=>13646, +37555=>13652, +38321=>13653, +194812=>13656, +194965=>13670, +194794=>13679, +26478=>13681, +11974=>13682, +194594=>13684, +156194=>13691, +13314=>13698, +26083=>13701, +134071=>13706, +171339=>13717, +194611=>13719, +24378=>13720, +11945=>13729, +20465=>13731, +63753=>13739, +11964=>13747, +194732=>13750, +26435=>13751, +133732=>13755, +35329=>13756, +25142=>13757, +21555=>13760, +23067=>13761, +25221=>13765, +194819=>13768, +21567=>13775, +27506=>13785, +29986=>13790, +19256=>13791, +24063=>13794, +194827=>13801, +29626=>13802, +134047=>13803, +194600=>13807, +194849=>13809, +194623=>13815, +194675=>13832, +11916=>13833, +11917=>13834, +23577=>13835, +131083=>13839, +23426=>13840, +194642=>13841, +11997=>13847, +11999=>13848, +39136=>13848, +11998=>13849, +169599=>13849, +14221=>13850, +11927=>13852, +14586=>13852, +194887=>13854, +11909=>13856, +20155=>13856, +131490=>13857, +13599=>13865, +194738=>13867, +11971=>13870, +35200=>13870, +31237=>13875, +35498=>13880, +32085=>13882, +28568=>13884, +25591=>13892, +30246=>13893, +11978=>13898, +163767=>13898, +146686=>13904, +13351=>13910, +33067=>13913, +194842=>13916, +11950=>13922, +154327=>13922, +194714=>13928, +194831=>13932, +22305=>13952, +135741=>13953, +194586=>13954, +64003=>13956, +21534=>13964, +15240=>13965, +20839=>13966, +63839=>13971, +20023=>13981, +11946=>13995, +150804=>13995, +24421=>13996, +23020=>13997, +194658=>13998, +24217=>14000, +13416=>14047, +40884=>14048, +21200=>14056, +38376=>14061, +26625=>14066, +195024=>14068, +195039=>14069, +153215=>14075, +11959=>14078, +36534=>14083, +63775=>14084, +63875=>14088, +31867=>14094, +63906=>14095, +63898=>14097, +11961=>14099, +32770=>14099, +157360=>14100, +11911=>14105, +132648=>14105, +131210=>14108, +133508=>14109, +194604=>14109, +11915=>14110, +13630=>14110, +21589=>14115, +22841=>14117, +23414=>14120, +194669=>14121, +23572=>14122, +14306=>14123, +23782=>14124, +20040=>14126, +194742=>14129, +158105=>14134, +25371=>14135, +26211=>14138, +194779=>14140, +27126=>14143, +27014=>14144, +27596=>14148, +28183=>14150, +27818=>14153, +11942=>14157, +20012=>14157, +29935=>14160, +30069=>14161, +30188=>14162, +30286=>14163, +16305=>14164, +30570=>14165, +30633=>14166, +31571=>14173, +16996=>14176, +194924=>14180, +32328=>14183, +132415=>14188, +11955=>14189, +156266=>14189, +33089=>14194, +17491=>14195, +33401=>14197, +11966=>14197, +64094=>14198, +11967=>14198, +64093=>14199, +11968=>14199, +20857=>14201, +33626=>14202, +17701=>14206, +34292=>14208, +131248=>14209, +34429=>14214, +13358=>14216, +35014=>14217, +18406=>14224, +36808=>14233, +166279=>14253, +167447=>14256, +38969=>14259, +39432=>14266, +39903=>14271, +148206=>14282, +21385=>14288, +64017=>14290, +194785=>14291, +146622=>14293, +132625=>14294, +19972=>14296, +19973=>14297, +19999=>14298, +20011=>14299, +20015=>14300, +20016=>14301, +20032=>14302, +20033=>14303, +20036=>14304, +11907=>14305, +20058=>14305, +20095=>14306, +20109=>14307, +20118=>14308, +20153=>14309, +20176=>14310, +20192=>14311, +20221=>14312, +20223=>14313, +20235=>14314, +20245=>14315, +20320=>14316, +20283=>14317, +20297=>14318, +20308=>14319, +20346=>14320, +20349=>14321, +20350=>14322, +20375=>14323, +20414=>14324, +20431=>14325, +20477=>14326, +20480=>14327, +20481=>14328, +20496=>14329, +20507=>14330, +20519=>14331, +20526=>14332, +20567=>14333, +20582=>14334, +20586=>14335, +20539=>14336, +20623=>14337, +20630=>14338, +20636=>14339, +20684=>14340, +20710=>14341, +20713=>14342, +20719=>14343, +20744=>14344, +20747=>14345, +20752=>14346, +20763=>14347, +20766=>14348, +20831=>14349, +20897=>14350, +20924=>14351, +20974=>14353, +20980=>14354, +20993=>14355, +11913=>14356, +20994=>14356, +21011=>14357, +21065=>14358, +21089=>14359, +21094=>14360, +21139=>14361, +21192=>14362, +21232=>14363, +21258=>14364, +21259=>14365, +21310=>14366, +21324=>14367, +21323=>14368, +21345=>14369, +21356=>14370, +21419=>14371, +21466=>14372, +21478=>14373, +21493=>14374, +21543=>14375, +21581=>14376, +21606=>14377, +21611=>14378, +21620=>14379, +21645=>14380, +21654=>14381, +21665=>14382, +21677=>14383, +21689=>14384, +21695=>14385, +21702=>14386, +21709=>14387, +21774=>14388, +21803=>14389, +21813=>14390, +21834=>14391, +21856=>14392, +21896=>14394, +21902=>14395, +22024=>14396, +22030=>14397, +22031=>14398, +22071=>14399, +22079=>14400, +22089=>14401, +22091=>14402, +22095=>14403, +22118=>14404, +22121=>14405, +22127=>14406, +22129=>14407, +22130=>14408, +22165=>14409, +22170=>14410, +22188=>14411, +22189=>14412, +22193=>14413, +22217=>14414, +22237=>14415, +22244=>14416, +22282=>14417, +22293=>14418, +22307=>14419, +22319=>14420, +22323=>14421, +22324=>14422, +22348=>14423, +22384=>14424, +22412=>14425, +22428=>14426, +22456=>14427, +22502=>14428, +22509=>14429, +22517=>14430, +22518=>14431, +22527=>14432, +22537=>14433, +22560=>14434, +22578=>14435, +22652=>14436, +22656=>14437, +22697=>14438, +22734=>14439, +22736=>14440, +22740=>14441, +22746=>14442, +22761=>14443, +22796=>14444, +22820=>14445, +22831=>14446, +22881=>14447, +22893=>14448, +22986=>14449, +22994=>14450, +23005=>14451, +23011=>14452, +23012=>14453, +23044=>14454, +23052=>14455, +23075=>14456, +23111=>14457, +23125=>14458, +23139=>14459, +23149=>14460, +23166=>14461, +23198=>14462, +23207=>14463, +23212=>14464, +23219=>14465, +23264=>14466, +23296=>14467, +23321=>14468, +23333=>14469, +23341=>14470, +23361=>14471, +23420=>14472, +23422=>14473, +23423=>14474, +23434=>14475, +11919=>14476, +23587=>14476, +23595=>14477, +23600=>14478, +23651=>14479, +23657=>14480, +23676=>14481, +23755=>14482, +23762=>14483, +23796=>14484, +23844=>14485, +23846=>14486, +23875=>14487, +23878=>14488, +23882=>14489, +23954=>14490, +23956=>14491, +23961=>14492, +23968=>14493, +24024=>14494, +24032=>14495, +24056=>14496, +24064=>14497, +24082=>14498, +24084=>14499, +24085=>14500, +24088=>14501, +24110=>14502, +24152=>14503, +24171=>14504, +24172=>14505, +24232=>14506, +24234=>14507, +24254=>14508, +24255=>14509, +24274=>14511, +24327=>14512, +24334=>14513, +24348=>14514, +24349=>14515, +24354=>14516, +24360=>14517, +24374=>14518, +24379=>14519, +24384=>14520, +12089=>14521, +24400=>14521, +24408=>14522, +24420=>14523, +24457=>14524, +24476=>14525, +24487=>14526, +24484=>14527, +24495=>14528, +24504=>14529, +11926=>14530, +24516=>14530, +24521=>14531, +24545=>14532, +24553=>14533, +24557=>14534, +24572=>14535, +24599=>14536, +24602=>14537, +24627=>14538, +24673=>14539, +24703=>14540, +24734=>14541, +24740=>14542, +24752=>14543, +24779=>14544, +24795=>14545, +24824=>14546, +24850=>14547, +24851=>14548, +24852=>14549, +24860=>14550, +24956=>14551, +24973=>14552, +24991=>14553, +25000=>14554, +25026=>14555, +25055=>14556, +25109=>14557, +25129=>14558, +25155=>14559, +25158=>14560, +11928=>14561, +25164=>14561, +25169=>14562, +25174=>14563, +25284=>14564, +25340=>14565, +25354=>14566, +25357=>14567, +25368=>14568, +25401=>14569, +25410=>14570, +25411=>14571, +25445=>14572, +25460=>14573, +25469=>14574, +25476=>14575, +25479=>14576, +25488=>14577, +25502=>14578, +25553=>14579, +25564=>14580, +25609=>14581, +25616=>14582, +25634=>14583, +25684=>14584, +25691=>14585, +25709=>14586, +25723=>14587, +25790=>14588, +25791=>14589, +25829=>14590, +25847=>14591, +25851=>14592, +25860=>14593, +25878=>14594, +25881=>14595, +25927=>14596, +25959=>14597, +25985=>14598, +25989=>14599, +26050=>14600, +26096=>14601, +26098=>14602, +26156=>14603, +26188=>14604, +26203=>14605, +26204=>14606, +26209=>14607, +26219=>14608, +26276=>14610, +26312=>14611, +26348=>14612, +26373=>14613, +26387=>14614, +26419=>14615, +26440=>14616, +26444=>14617, +26486=>14618, +26491=>14619, +26544=>14620, +26546=>14621, +26617=>14622, +26583=>14623, +26585=>14624, +26608=>14625, +26668=>14626, +26672=>14627, +26673=>14628, +26715=>14629, +26738=>14630, +26741=>14631, +26746=>14632, +26756=>14633, +26789=>14634, +26802=>14635, +26832=>14636, +26838=>14637, +26856=>14638, +26861=>14639, +26864=>14640, +26865=>14641, +26876=>14642, +26897=>14643, +26899=>14644, +26933=>14645, +26939=>14646, +26967=>14647, +26979=>14648, +26994=>14649, +27007=>14650, +27008=>14651, +27046=>14652, +27053=>14653, +27063=>14654, +27094=>14655, +27095=>14656, +27137=>14657, +27151=>14658, +27157=>14659, +27176=>14660, +27188=>14661, +27198=>14662, +27205=>14663, +27216=>14664, +27217=>14665, +27222=>14666, +27227=>14667, +27267=>14668, +27273=>14669, +27281=>14670, +27293=>14671, +27294=>14672, +27295=>14673, +27356=>14674, +27367=>14675, +27372=>14676, +27422=>14677, +27428=>14678, +27445=>14679, +27462=>14680, +27478=>14681, +27488=>14682, +27522=>14683, +27582=>14684, +27617=>14685, +27633=>14686, +27664=>14687, +27699=>14688, +27701=>14689, +11937=>14689, +11938=>14690, +27737=>14691, +27766=>14692, +27771=>14693, +27781=>14694, +27797=>14695, +27804=>14696, +27856=>14697, +27860=>14698, +27862=>14699, +27872=>14700, +27883=>14701, +27884=>14702, +27886=>14703, +27914=>14704, +27918=>14705, +27921=>14706, +27950=>14707, +27991=>14708, +27998=>14709, +28005=>14710, +28034=>14711, +28095=>14712, +28100=>14713, +28106=>14714, +28118=>14715, +28137=>14716, +28194=>14717, +28241=>14718, +28359=>14719, +28362=>14720, +28366=>14721, +28413=>14722, +28442=>14723, +28458=>14724, +28463=>14725, +28467=>14726, +28506=>14727, +28510=>14728, +28514=>14729, +28541=>14730, +28555=>14731, +28557=>14732, +28562=>14733, +28564=>14734, +28570=>14735, +28583=>14736, +28584=>14737, +28598=>14738, +28634=>14739, +28638=>14740, +28729=>14742, +28732=>14743, +28756=>14745, +28765=>14746, +28766=>14747, +28772=>14748, +11939=>14749, +28780=>14749, +28798=>14750, +28801=>14751, +28821=>14752, +28855=>14753, +28883=>14754, +28884=>14755, +28888=>14756, +28892=>14757, +28935=>14758, +28960=>14759, +28977=>14760, +29002=>14761, +29010=>14762, +29024=>14763, +29049=>14764, +29074=>14765, +29131=>14767, +29139=>14768, +29142=>14769, +29184=>14770, +29213=>14771, +29227=>14772, +29240=>14773, +29249=>14774, +29267=>14775, +29269=>14776, +29270=>14777, +29276=>14778, +29325=>14779, +11944=>14780, +29357=>14780, +29364=>14781, +29383=>14782, +29435=>14783, +29444=>14784, +29445=>14785, +29480=>14786, +29489=>14787, +29507=>14788, +29548=>14789, +29564=>14790, +29571=>14791, +29573=>14792, +29574=>14793, +29589=>14794, +29598=>14795, +29599=>14796, +29600=>14797, +29606=>14798, +29611=>14799, +29621=>14800, +29623=>14801, +29628=>14802, +29647=>14803, +29657=>14804, +29673=>14805, +29684=>14806, +29693=>14807, +29700=>14808, +29706=>14809, +29722=>14810, +29723=>14811, +29732=>14812, +29736=>14813, +29740=>14814, +29743=>14815, +29744=>14816, +29745=>14817, +29753=>14818, +29764=>14819, +29767=>14820, +29771=>14821, +29773=>14822, +29777=>14823, +29783=>14824, +29798=>14825, +29803=>14826, +29809=>14827, +29824=>14828, +29829=>14829, +29830=>14830, +29831=>14831, +29840=>14832, +29848=>14833, +29852=>14834, +29856=>14835, +29859=>14836, +29864=>14837, +29867=>14838, +29877=>14839, +29887=>14840, +29896=>14841, +29914=>14842, +29918=>14843, +30030=>14844, +30073=>14845, +30081=>14846, +30096=>14847, +12135=>14848, +30098=>14848, +30099=>14849, +30132=>14850, +30180=>14851, +30201=>14852, +30208=>14853, +30218=>14854, +30229=>14855, +30230=>14856, +30233=>14857, +30238=>14858, +30253=>14859, +30261=>14860, +30275=>14861, +30283=>14862, +30309=>14863, +30317=>14864, +30319=>14865, +30321=>14866, +30324=>14867, +30372=>14868, +30373=>14869, +30405=>14870, +30412=>14871, +30444=>14872, +30460=>14873, +30516=>14874, +30518=>14875, +30556=>14876, +30559=>14877, +30560=>14878, +30578=>14879, +30589=>14880, +30613=>14881, +30634=>14882, +30694=>14883, +30704=>14884, +30708=>14885, +30726=>14886, +30754=>14887, +30765=>14888, +30766=>14889, +30768=>14890, +30773=>14891, +30824=>14892, +30878=>14893, +30920=>14894, +30924=>14895, +30926=>14896, +30948=>14897, +30944=>14898, +30945=>14899, +30962=>14900, +30967=>14901, +30971=>14902, +31025=>14903, +11949=>14905, +31035=>14905, +31037=>14906, +31045=>14907, +31067=>14908, +31068=>14909, +31115=>14910, +31126=>14911, +31128=>14912, +12145=>14913, +31160=>14913, +31163=>14914, +31178=>14915, +31194=>14916, +31235=>14917, +31241=>14918, +31249=>14919, +31262=>14920, +31277=>14921, +31289=>14922, +31301=>14923, +31308=>14924, +31325=>14925, +31341=>14927, +31352=>14928, +31392=>14929, +31395=>14930, +31411=>14931, +31419=>14932, +31420=>14933, +31430=>14934, +31495=>14935, +31508=>14936, +31527=>14937, +31537=>14938, +31559=>14939, +31566=>14940, +31584=>14941, +31593=>14942, +31597=>14943, +31602=>14944, +31633=>14945, +31663=>14946, +31703=>14947, +31705=>14948, +31755=>14949, +31759=>14950, +31776=>14951, +31782=>14952, +31793=>14953, +31798=>14954, +31825=>14955, +31833=>14956, +31847=>14957, +31854=>14958, +31856=>14959, +31932=>14960, +31935=>14961, +31944=>14962, +31945=>14963, +31959=>14964, +31961=>14965, +31965=>14966, +31979=>14967, +32007=>14968, +32008=>14969, +32009=>14970, +32019=>14971, +32029=>14972, +32035=>14973, +32065=>14974, +32083=>14975, +32089=>14976, +32093=>14977, +32122=>14978, +32134=>14979, +32139=>14980, +32140=>14981, +32204=>14982, +32235=>14983, +32241=>14984, +32249=>14985, +32264=>14986, +32273=>14987, +32277=>14988, +32288=>14989, +32327=>14990, +32354=>14991, +32366=>14992, +32371=>14993, +32397=>14994, +32401=>14995, +32408=>14996, +32580=>14997, +32591=>14998, +11947=>14999, +11954=>14999, +32594=>14999, +11953=>15000, +32595=>15000, +32609=>15001, +32657=>15002, +32703=>15003, +32718=>15004, +32735=>15005, +32741=>15006, +32748=>15007, +32750=>15008, +32751=>15009, +32762=>15010, +32782=>15011, +32785=>15012, +32788=>15013, +32804=>15014, +32806=>15015, +32826=>15016, +32828=>15017, +32864=>15018, +32881=>15019, +32885=>15020, +32926=>15021, +32934=>15022, +32939=>15023, +32983=>15024, +32984=>15025, +33046=>15026, +33048=>15027, +33082=>15028, +33098=>15029, +33100=>15030, +33153=>15031, +33156=>15032, +33204=>15033, +33231=>15034, +33273=>15035, +33283=>15036, +33313=>15037, +33330=>15038, +33332=>15039, +33350=>15040, +33355=>15041, +33359=>15042, +33422=>15043, +33454=>15044, +33463=>15045, +33470=>15046, +33478=>15047, +33534=>15048, +33603=>15049, +33617=>15050, +33621=>15051, +33670=>15052, +33677=>15053, +33682=>15054, +33688=>15055, +33705=>15056, +33727=>15057, +33728=>15058, +33770=>15059, +33807=>15060, +33809=>15061, +33866=>15062, +33910=>15063, +33960=>15064, +33967=>15065, +33984=>15066, +33986=>15067, +34032=>15068, +34045=>15069, +34060=>15070, +34100=>15071, +34142=>15072, +34191=>15073, +34231=>15074, +34254=>15075, +34221=>15076, +34322=>15077, +34345=>15078, +34386=>15079, +34403=>15080, +34412=>15081, +34415=>15082, +34426=>15083, +34445=>15084, +34449=>15085, +34456=>15086, +34471=>15087, +34472=>15088, +34554=>15089, +34557=>15090, +34571=>15091, +34579=>15092, +34585=>15093, +34590=>15094, +34600=>15095, +34622=>15096, +34673=>15097, +34696=>15098, +34713=>15099, +34732=>15100, +34733=>15101, +34741=>15102, +34774=>15103, +34795=>15104, +34797=>15105, +34817=>15106, +34822=>15108, +34827=>15109, +34836=>15110, +34844=>15111, +34902=>15112, +34911=>15113, +11970=>15114, +34916=>15114, +34968=>15115, +34986=>15116, +35005=>15117, +35006=>15118, +35018=>15119, +35026=>15120, +35035=>15121, +35056=>15122, +35057=>15123, +35078=>15124, +35096=>15125, +35097=>15126, +35098=>15127, +35111=>15128, +35120=>15129, +35134=>15130, +35195=>15131, +35284=>15132, +35286=>15133, +35301=>15134, +35313=>15135, +35335=>15136, +35343=>15137, +35349=>15138, +35362=>15139, +35406=>15140, +35455=>15141, +35572=>15142, +35615=>15143, +35639=>15144, +35651=>15145, +35652=>15146, +35668=>15147, +35740=>15148, +35742=>15149, +35911=>15150, +35924=>15151, +35955=>15152, +36004=>15153, +36057=>15154, +36065=>15155, +36088=>15156, +36094=>15157, +36123=>15158, +36201=>15159, +36204=>15160, +36228=>15161, +36237=>15162, +36245=>15163, +36262=>15164, +36294=>15165, +36302=>15166, +36324=>15167, +36332=>15168, +36384=>15169, +36427=>15170, +36460=>15171, +36464=>15172, +36474=>15173, +36498=>15174, +36526=>15175, +36531=>15176, +36561=>15177, +36564=>15178, +36601=>15179, +36631=>15180, +36662=>15181, +36774=>15182, +12193=>15183, +36789=>15183, +11981=>15184, +36790=>15184, +36832=>15186, +36836=>15187, +36854=>15188, +36866=>15189, +36908=>15190, +36932=>15191, +37000=>15192, +37013=>15193, +37017=>15194, +37019=>15195, +37026=>15196, +37044=>15197, +37079=>15198, +37085=>15199, +37108=>15200, +37143=>15201, +37148=>15202, +37169=>15203, +37178=>15204, +37181=>15205, +37192=>15206, +37211=>15207, +37217=>15208, +37220=>15209, +37262=>15210, +37278=>15211, +37288=>15212, +37293=>15213, +37294=>15214, +37298=>15215, +37308=>15216, +37360=>15217, +37367=>15218, +37371=>15219, +37383=>15220, +37416=>15221, +37427=>15222, +37432=>15223, +37443=>15224, +37447=>15225, +37455=>15226, +37472=>15227, +37570=>15228, +37579=>15229, +37580=>15230, +37599=>15231, +37645=>15232, +37653=>15233, +37663=>15234, +37671=>15235, +37703=>15236, +37714=>15237, +37738=>15239, +37741=>15240, +37787=>15241, +37818=>15242, +37801=>15243, +37825=>15244, +37834=>15245, +37858=>15246, +37882=>15247, +37885=>15248, +37903=>15249, +37940=>15250, +37951=>15251, +37973=>15252, +37995=>15253, +38002=>15254, +11986=>15255, +38264=>15255, +38310=>15256, +38313=>15257, +38324=>15259, +38333=>15260, +38362=>15261, +11983=>15262, +11990=>15262, +38429=>15262, +38465=>15263, +38488=>15264, +38532=>15265, +38564=>15266, +38569=>15267, +38610=>15268, +195060=>15269, +38622=>15270, +38633=>15271, +38641=>15272, +38658=>15273, +38665=>15274, +38746=>15275, +38755=>15276, +38766=>15277, +38771=>15278, +38810=>15279, +38818=>15280, +38837=>15281, +38838=>15282, +38873=>15283, +38878=>15284, +38900=>15285, +38922=>15286, +38926=>15287, +38942=>15288, +38947=>15289, +38955=>15290, +38974=>15291, +38994=>15292, +38995=>15293, +39001=>15294, +39020=>15295, +39096=>15296, +39098=>15297, +39103=>15298, +39112=>15299, +39141=>15300, +39218=>15301, +39219=>15302, +39232=>15303, +39245=>15304, +39260=>15305, +39263=>15306, +39345=>15307, +39353=>15308, +39354=>15309, +39369=>15310, +39426=>15311, +39446=>15312, +39460=>15313, +39463=>15314, +39469=>15315, +39470=>15316, +39478=>15317, +39480=>15318, +39498=>15319, +39510=>15320, +39605=>15321, +39606=>15322, +39673=>15323, +39683=>15324, +39712=>15325, +39731=>15326, +39732=>15327, +39795=>15328, +39801=>15329, +39847=>15330, +39873=>15331, +39879=>15332, +39895=>15333, +39911=>15334, +39915=>15335, +39927=>15336, +39930=>15337, +39933=>15338, +39947=>15339, +39975=>15340, +39978=>15341, +39990=>15342, +40001=>15343, +40019=>15344, +40035=>15345, +40048=>15346, +40055=>15347, +40194=>15348, +40258=>15349, +40263=>15350, +40291=>15351, +40297=>15352, +40316=>15353, +40318=>15354, +40333=>15355, +40369=>15356, +40387=>15357, +40391=>15358, +40406=>15359, +40415=>15360, +40427=>15361, +40436=>15362, +40469=>15363, +40477=>15364, +40612=>15365, +40616=>15366, +40620=>15367, +40679=>15368, +40686=>15369, +40720=>15370, +40722=>15371, +40727=>15372, +40729=>15373, +40751=>15374, +40759=>15375, +40761=>15376, +40769=>15377, +40773=>15378, +40791=>15379, +40808=>15380, +40817=>15381, +40821=>15382, +40848=>15383, +40852=>15384, +40866=>15385, +13317=>15387, +194564=>15388, +22048=>15389, +24267=>15390, +11925=>15391, +144954=>15393, +28665=>15395, +28390=>15396, +29107=>15397, +11940=>15398, +64073=>15398, +11980=>15403, +64102=>15403, +23986=>15405, +20435=>15407, +20697=>15408, +20720=>15409, +20931=>15410, +22134=>15411, +27220=>15412, +27905=>15413, +28112=>15414, +28226=>15415, +28377=>15416, +29668=>15417, +29729=>15418, +30060=>15419, +30801=>15420, +34805=>15421, +144382=>15422, +29608=>15423, +15091=>15424, +13531=>15425, +17420=>15426, +16010=>15427, +40893=>15429, +19432=>15430, +40892=>15431, +16090=>15432, +15138=>15433, +40894=>15434, +17786=>15435, +16531=>15436, +18021=>15438, +16643=>15439, +17043=>15440, +18094=>15441, +13448=>15442, +140809=>15443, +63584=>15444, +63585=>15445, +63586=>15446, +63610=>15447, +63615=>15448, +8836=>15472, +8837=>15473, +8842=>15474, +8843=>15475, +8713=>15476, +8965=>15478, +8966=>15479, +8741=>15489, +8742=>15490, +8802=>15505, +8773=>15507, +8776=>15508, +8822=>15509, +8823=>15510, +8487=>15515, +8922=>15725, +8923=>15726, +8533=>15727, +8984=>15728, +7742=>15729, +7743=>15730, +504=>15731, +505=>15732, +470=>15733, +472=>15734, +474=>15735, +476=>15736, +260=>15737, +728=>15738, +317=>15739, +346=>15740, +350=>15741, +356=>15742, +377=>15743, +379=>15744, +261=>15745, +731=>15746, +318=>15747, +347=>15748, +711=>15749, +351=>15750, +357=>15751, +378=>15752, +733=>15753, +380=>15754, +340=>15755, +258=>15756, +313=>15757, +262=>15758, +268=>15759, +280=>15760, +270=>15761, +323=>15762, +327=>15763, +336=>15764, +344=>15765, +368=>15766, +354=>15767, +341=>15768, +259=>15769, +314=>15770, +263=>15771, +269=>15772, +281=>15773, +271=>15774, +273=>15775, +324=>15776, +328=>15777, +337=>15778, +345=>15779, +369=>15780, +355=>15781, +729=>15782, +264=>15783, +284=>15784, +292=>15785, +308=>15786, +348=>15787, +364=>15788, +265=>15789, +285=>15790, +293=>15791, +309=>15792, +349=>15793, +365=>15794, +625=>15795, +651=>15796, +638=>15797, +620=>15798, +622=>15799, +633=>15800, +648=>15801, +598=>15802, +627=>15803, +637=>15804, +642=>15805, +656=>15806, +635=>15807, +621=>15808, +607=>15809, +626=>15810, +669=>15811, +654=>15812, +609=>15813, +624=>15814, +641=>15815, +295=>15816, +661=>15817, +660=>15818, +614=>15819, +664=>15820, +450=>15821, +595=>15822, +599=>15823, +644=>15824, +608=>15825, +403=>15826, +616=>15827, +649=>15828, +600=>15829, +604=>15830, +606=>15831, +592=>15832, +623=>15833, +650=>15834, +612=>15835, +594=>15836, +653=>15837, +613=>15838, +674=>15839, +673=>15840, +597=>15841, +657=>15842, +634=>15843, +615=>15844, +865=>15845, +712=>15846, +716=>15847, +721=>15848, +8255=>15849, +783=>15850, +741=>15851, +742=>15852, +743=>15853, +744=>15854, +745=>15855, +805=>15858, +812=>15859, +825=>15860, +796=>15861, +799=>15862, +800=>15863, +829=>15864, +809=>15865, +815=>15866, +734=>15867, +804=>15868, +816=>15869, +828=>15870, +820=>15871, +797=>15872, +798=>15873, +792=>15874, +793=>15875, +810=>15876, +826=>15877, +827=>15878, +794=>15879, +610=>15883, +611=>15884, +618=>15885, +628=>15886, +630=>15887, +632=>15888, +640=>15889, +655=>15890, +665=>15891, +668=>15892, +671=>15893, +688=>15894, +690=>15895, +695=>15896, +705=>15897, +736=>15898, +737=>15899, +8862=>15906, +12348=>16194, +12543=>16195, +12310=>16197, +12311=>16198, +9838=>16199, +9835=>16200, +10548=>16201, +10549=>16202, +10687=>16203, +12448=>16205, +10746=>16207, +10747=>16208, +962=>16222, +9461=>16223, +9462=>16224, +9463=>16225, +9464=>16226, +9465=>16227, +9466=>16228, +9467=>16229, +9468=>16230, +9469=>16231, +9470=>16232, +9750=>16233, +9751=>16234, +9649=>16235, +12784=>16236, +12785=>16237, +12786=>16238, +12787=>16239, +12788=>16240, +12789=>16241, +12790=>16242, +12791=>16243, +12792=>16244, +12793=>16245, +12794=>16247, +12795=>16248, +12796=>16249, +12797=>16250, +12798=>16251, +12799=>16252, +9150=>16253, +9151=>16254, +9152=>16255, +9153=>16256, +9154=>16257, +9155=>16258, +9156=>16259, +9157=>16260, +9158=>16261, +9159=>16262, +9160=>16263, +9161=>16264, +9162=>16265, +9163=>16266, +9164=>16267, +10003=>16270, +9251=>16272, +9166=>16273, +9680=>16274, +9681=>16275, +9682=>16276, +9683=>16277, +8263=>16278, +8264=>16279, +8273=>16281, +8258=>16282, +12688=>16283, +12689=>16284, +12690=>16285, +12691=>16286, +12692=>16287, +12693=>16288, +12694=>16289, +12695=>16290, +12696=>16291, +12697=>16292, +12698=>16293, +12699=>16294, +12700=>16295, +12701=>16296, +12702=>16297, +12703=>16298, +9136=>16312, +9137=>16313, +9842=>16314, +9843=>16315, +9844=>16316, +9845=>16317, +9846=>16318, +9847=>16319, +9848=>16320, +9849=>16321, +9850=>16322, +9851=>16323, +9852=>16324, +9853=>16325, +12441=>16326, +12442=>16327, +8413=>16328, +20296=>16779, +20319=>16780, +20330=>16781, +20332=>16782, +20494=>16783, +20504=>16784, +20545=>16785, +20722=>16786, +20688=>16787, +20742=>16788, +20739=>16789, +20789=>16790, +20821=>16791, +20823=>16792, +13493=>16793, +20938=>16794, +20962=>16795, +21079=>16796, +21196=>16797, +21206=>16798, +21243=>16799, +21276=>16800, +21347=>16801, +21405=>16802, +21522=>16803, +21631=>16804, +21640=>16805, +21840=>16806, +21889=>16807, +21933=>16808, +21966=>16809, +22075=>16810, +22174=>16811, +22185=>16812, +22195=>16813, +22391=>16814, +22396=>16815, +135963=>16816, +22479=>16817, +22500=>16818, +22628=>16819, +22665=>16820, +136302=>16821, +22738=>16822, +22752=>16823, +34369=>16824, +22923=>16825, +22930=>16826, +22979=>16827, +23059=>16828, +23143=>16829, +23159=>16830, +23172=>16831, +23236=>16832, +137405=>16833, +23421=>16834, +23443=>16835, +23570=>16836, +64060=>16837, +136884=>16838, +23674=>16839, +23695=>16840, +23711=>16841, +23715=>16842, +23722=>16843, +23760=>16844, +138804=>16845, +23821=>16846, +23879=>16847, +23937=>16848, +23972=>16849, +23975=>16850, +24011=>16851, +24158=>16852, +24313=>16853, +24320=>16854, +24322=>16855, +24355=>16856, +24381=>16857, +24404=>16858, +24445=>16859, +24589=>16860, +24596=>16861, +24600=>16862, +24629=>16863, +24647=>16864, +24733=>16865, +24788=>16866, +24797=>16867, +24875=>16868, +25020=>16869, +25017=>16870, +25122=>16871, +25178=>16872, +25199=>16873, +25302=>16874, +25468=>16875, +25573=>16876, +25721=>16877, +25796=>16878, +25808=>16879, +25897=>16880, +26013=>16881, +26170=>16882, +26146=>16883, +26155=>16884, +26160=>16885, +26163=>16886, +26184=>16887, +143812=>16888, +26231=>16889, +26232=>16890, +26253=>16891, +26299=>16892, +26331=>16893, +26344=>16894, +26439=>16895, +26497=>16896, +26515=>16897, +26520=>16898, +26523=>16899, +26620=>16900, +26653=>16901, +26787=>16902, +26890=>16903, +26953=>16904, +144836=>16905, +26946=>16906, +26980=>16907, +27045=>16908, +27087=>16909, +15286=>16910, +15299=>16911, +27113=>16912, +27125=>16913, +145215=>16914, +27195=>16915, +145251=>16916, +27284=>16917, +27301=>16918, +15375=>16919, +27419=>16920, +27436=>16921, +27495=>16922, +27561=>16923, +27565=>16924, +27607=>16925, +27647=>16926, +27653=>16927, +27764=>16928, +27800=>16929, +27899=>16930, +27846=>16931, +27953=>16932, +27961=>16933, +27967=>16934, +27992=>16935, +28052=>16936, +28074=>16937, +28123=>16938, +28125=>16939, +28228=>16940, +28254=>16941, +28337=>16942, +28353=>16943, +28432=>16944, +28505=>16945, +28513=>16946, +28542=>16947, +28556=>16948, +28576=>16949, +28604=>16950, +28615=>16951, +28618=>16952, +28656=>16953, +28750=>16954, +28789=>16955, +28836=>16956, +28900=>16957, +28971=>16958, +28958=>16959, +28974=>16960, +29009=>16961, +29032=>16962, +29061=>16963, +29063=>16964, +29114=>16965, +29124=>16966, +29205=>16967, +15935=>16968, +29339=>16969, +149489=>16970, +29479=>16971, +29520=>16972, +29542=>16973, +29602=>16974, +29739=>16975, +29766=>16976, +29794=>16977, +29805=>16978, +29862=>16979, +29865=>16980, +29897=>16981, +29951=>16982, +29975=>16983, +16242=>16984, +30158=>16985, +30210=>16986, +30216=>16987, +30308=>16988, +30337=>16989, +30365=>16990, +30378=>16991, +30390=>16992, +30414=>16993, +30420=>16994, +30438=>16995, +30449=>16996, +30474=>16997, +30489=>16998, +30541=>16999, +30542=>17000, +30586=>17001, +30592=>17002, +30612=>17003, +30688=>17004, +152718=>17005, +30787=>17006, +30830=>17007, +30896=>17008, +152846=>17009, +30893=>17010, +30976=>17011, +31004=>17012, +31022=>17013, +31028=>17014, +31046=>17015, +31097=>17016, +31176=>17017, +153457=>17018, +31188=>17019, +31198=>17020, +31211=>17021, +31213=>17022, +31365=>17023, +154052=>17024, +31438=>17025, +31485=>17026, +31506=>17027, +31533=>17028, +31547=>17029, +31599=>17030, +31745=>17031, +31795=>17032, +155041=>17033, +31853=>17034, +31865=>17035, +31887=>17036, +31892=>17037, +31904=>17038, +31957=>17039, +32049=>17040, +32092=>17041, +32131=>17042, +32166=>17043, +32194=>17044, +32296=>17045, +32663=>17046, +32731=>17047, +32821=>17048, +32823=>17049, +32970=>17050, +32992=>17051, +33011=>17052, +33120=>17053, +33127=>17054, +33128=>17055, +33133=>17056, +33211=>17057, +33226=>17058, +33239=>17059, +17499=>17060, +33376=>17061, +33396=>17062, +158463=>17063, +33441=>17064, +33443=>17065, +33444=>17066, +33449=>17067, +33471=>17068, +33493=>17069, +33533=>17070, +33536=>17071, +33570=>17072, +33581=>17073, +33594=>17074, +33607=>17075, +33661=>17076, +33703=>17077, +33743=>17078, +33745=>17079, +33761=>17080, +33793=>17081, +33798=>17082, +33887=>17083, +33904=>17084, +33907=>17085, +33925=>17086, +33950=>17087, +33978=>17088, +159296=>17089, +34098=>17090, +34078=>17091, +34095=>17092, +34148=>17093, +34170=>17094, +34188=>17095, +34210=>17096, +34251=>17097, +34285=>17098, +34303=>17099, +34308=>17100, +34309=>17101, +34320=>17102, +159988=>17103, +34328=>17104, +34360=>17105, +34391=>17106, +34402=>17107, +17821=>17108, +34421=>17109, +34488=>17110, +34556=>17111, +34695=>17112, +17898=>17113, +34826=>17114, +34832=>17115, +35022=>17116, +161412=>17117, +35122=>17118, +35129=>17119, +35136=>17120, +35220=>17121, +35318=>17122, +35399=>17123, +35421=>17124, +35425=>17125, +35445=>17126, +35536=>17127, +35654=>17128, +35673=>17129, +35689=>17130, +35741=>17131, +35913=>17132, +35944=>17133, +36271=>17134, +36305=>17135, +36311=>17136, +36387=>17137, +36413=>17138, +36475=>17139, +164471=>17140, +18500=>17141, +36602=>17142, +36638=>17143, +36653=>17144, +36692=>17145, +164813=>17146, +36840=>17147, +36846=>17148, +36872=>17149, +36909=>17150, +37015=>17151, +37043=>17152, +37054=>17153, +37060=>17154, +37061=>17155, +37063=>17156, +37103=>17157, +37140=>17158, +37142=>17159, +37154=>17160, +37155=>17161, +37167=>17162, +37172=>17163, +37251=>17164, +37361=>17165, +37705=>17166, +37732=>17167, +37733=>17168, +37795=>17169, +37855=>17170, +37892=>17171, +37939=>17172, +37962=>17173, +37987=>17174, +38001=>17175, +38286=>17176, +38303=>17177, +38316=>17178, +38326=>17179, +38347=>17180, +38352=>17181, +38355=>17182, +18864=>17183, +38366=>17184, +38565=>17185, +38639=>17186, +38734=>17187, +38805=>17188, +38830=>17189, +38842=>17190, +38849=>17191, +38857=>17192, +38875=>17193, +38998=>17194, +39143=>17195, +39256=>17196, +39427=>17197, +39617=>17198, +39619=>17199, +39630=>17200, +39638=>17201, +39682=>17202, +39688=>17203, +19479=>17204, +39725=>17205, +39774=>17206, +39782=>17207, +39812=>17208, +39818=>17209, +39838=>17210, +39886=>17211, +39909=>17212, +39928=>17213, +39971=>17214, +40015=>17215, +40016=>17216, +40037=>17217, +40221=>17218, +40222=>17219, +40259=>17220, +40274=>17221, +40330=>17222, +40342=>17223, +40384=>17224, +40364=>17225, +40380=>17226, +172432=>17227, +40423=>17228, +40455=>17229, +40606=>17230, +40623=>17231, +40855=>17232, +131209=>17233, +19970=>17234, +19983=>17235, +19986=>17236, +20009=>17237, +20014=>17238, +20039=>17239, +131234=>17240, +20049=>17241, +13318=>17242, +131236=>17243, +20073=>17244, +20125=>17245, +13356=>17246, +20156=>17247, +20163=>17248, +20168=>17249, +20203=>17250, +20186=>17251, +20209=>17252, +20213=>17253, +20246=>17254, +20324=>17255, +20279=>17256, +20286=>17257, +20312=>17258, +131603=>17259, +20343=>17260, +20344=>17261, +20354=>17262, +20357=>17263, +20454=>17264, +20402=>17265, +20421=>17266, +20427=>17267, +20434=>17268, +13418=>17269, +20466=>17270, +20499=>17271, +20508=>17272, +20558=>17273, +20563=>17274, +20579=>17275, +20643=>17276, +20616=>17277, +20626=>17278, +20627=>17279, +20629=>17280, +20650=>17281, +131883=>17282, +20657=>17283, +20666=>17284, +20667=>17285, +20676=>17286, +20679=>17287, +20723=>17288, +131969=>17289, +20686=>17290, +131953=>17291, +20692=>17292, +20705=>17293, +13458=>17294, +132089=>17295, +20759=>17296, +132170=>17297, +20832=>17298, +132361=>17299, +20851=>17300, +20867=>17301, +20875=>17302, +13500=>17303, +20888=>17304, +20899=>17305, +20909=>17306, +13511=>17307, +132566=>17308, +20979=>17309, +21010=>17310, +21014=>17311, +132943=>17312, +21077=>17313, +21084=>17314, +21100=>17315, +21111=>17316, +21124=>17317, +21122=>17318, +133127=>17319, +21144=>17320, +133178=>17321, +21156=>17322, +21178=>17323, +21179=>17324, +21194=>17325, +21201=>17326, +133305=>17327, +21239=>17328, +21301=>17329, +21314=>17330, +133500=>17331, +133533=>17332, +21351=>17333, +21370=>17334, +21412=>17335, +21428=>17336, +133843=>17337, +21431=>17338, +21440=>17339, +133917=>17340, +13661=>17341, +13662=>17342, +21461=>17343, +13667=>17344, +21492=>17345, +21540=>17346, +21544=>17347, +13678=>17348, +21571=>17349, +21602=>17350, +21612=>17351, +21653=>17352, +21664=>17353, +21670=>17354, +21678=>17355, +21687=>17356, +21690=>17357, +21699=>17358, +134469=>17359, +21740=>17360, +21743=>17361, +21745=>17362, +21747=>17363, +21760=>17364, +21761=>17365, +21769=>17366, +21820=>17367, +21825=>17368, +13734=>17369, +21831=>17370, +13736=>17371, +21860=>17372, +134625=>17373, +21885=>17374, +21890=>17375, +21905=>17376, +13765=>17377, +21970=>17378, +134805=>17379, +134765=>17380, +21951=>17381, +21961=>17382, +21964=>17383, +21969=>17384, +21981=>17385, +13786=>17386, +21986=>17387, +134756=>17388, +21993=>17389, +22056=>17390, +135007=>17391, +22023=>17392, +22032=>17393, +22064=>17394, +13812=>17395, +22077=>17396, +22080=>17397, +22087=>17398, +22110=>17399, +22112=>17400, +22125=>17401, +13829=>17402, +22152=>17403, +22156=>17404, +22173=>17405, +22184=>17406, +22194=>17407, +22213=>17408, +22221=>17409, +22239=>17410, +22248=>17411, +22262=>17412, +22263=>17413, +135681=>17414, +135765=>17415, +22313=>17416, +135803=>17417, +22341=>17418, +22342=>17419, +22349=>17420, +135796=>17421, +22376=>17422, +22383=>17423, +22387=>17424, +22388=>17425, +22389=>17426, +22395=>17427, +135908=>17428, +135895=>17429, +22426=>17430, +22429=>17431, +22430=>17432, +22440=>17433, +22487=>17434, +135933=>17435, +22476=>17436, +135990=>17437, +136004=>17438, +22494=>17439, +22512=>17440, +13898=>17441, +22520=>17442, +22523=>17443, +22525=>17444, +22532=>17445, +22558=>17446, +22567=>17447, +22585=>17448, +136132=>17449, +22601=>17450, +22604=>17451, +22631=>17452, +22666=>17453, +22667=>17454, +22669=>17455, +22671=>17456, +22672=>17457, +22676=>17458, +22685=>17459, +22698=>17460, +22705=>17461, +136301=>17462, +22723=>17463, +22733=>17464, +22754=>17465, +22771=>17466, +22772=>17467, +22789=>17468, +22790=>17469, +22797=>17470, +22804=>17471, +136663=>17472, +13969=>17473, +22845=>17474, +13977=>17475, +22854=>17476, +13974=>17477, +158761=>17478, +22879=>17479, +136775=>17480, +22901=>17481, +22902=>17482, +22908=>17483, +22943=>17484, +22958=>17485, +22972=>17486, +22984=>17487, +22989=>17488, +23006=>17489, +23015=>17490, +23022=>17491, +136966=>17492, +137026=>17493, +14031=>17494, +23053=>17495, +23063=>17496, +23079=>17497, +23085=>17498, +23141=>17499, +23162=>17500, +23179=>17501, +23196=>17502, +23199=>17503, +23200=>17504, +23202=>17505, +23217=>17506, +23221=>17507, +23226=>17508, +23231=>17509, +23258=>17510, +23260=>17511, +23269=>17512, +23280=>17513, +23278=>17514, +23285=>17515, +23304=>17516, +23319=>17517, +23348=>17518, +23372=>17519, +23378=>17520, +23400=>17521, +23407=>17522, +23425=>17523, +23428=>17524, +137667=>17525, +23446=>17526, +23468=>17527, +14177=>17528, +14178=>17529, +23502=>17530, +23510=>17531, +14188=>17532, +14187=>17533, +23537=>17534, +23549=>17535, +14197=>17536, +23555=>17537, +23593=>17538, +138326=>17539, +23647=>17540, +23655=>17541, +23656=>17542, +23664=>17543, +138541=>17544, +138565=>17545, +138616=>17546, +138594=>17547, +23688=>17548, +23690=>17549, +14273=>17550, +138657=>17551, +138652=>17552, +23712=>17553, +23714=>17554, +23719=>17555, +138642=>17556, +23725=>17557, +23733=>17558, +138679=>17559, +23753=>17560, +138720=>17561, +138803=>17562, +23814=>17563, +23824=>17564, +23851=>17565, +23837=>17566, +23840=>17567, +23857=>17568, +23865=>17569, +14312=>17570, +23905=>17571, +23914=>17572, +14324=>17573, +23920=>17574, +139038=>17575, +14333=>17576, +23944=>17577, +14336=>17578, +23959=>17579, +23984=>17580, +23988=>17581, +139126=>17582, +24017=>17583, +24023=>17584, +139258=>17585, +24036=>17586, +24041=>17587, +14383=>17588, +14390=>17589, +14400=>17590, +24095=>17591, +24126=>17592, +24137=>17593, +14428=>17594, +24150=>17595, +14433=>17596, +24173=>17597, +24174=>17598, +139643=>17599, +24229=>17600, +24236=>17601, +24249=>17602, +24262=>17603, +24281=>17604, +140062=>17605, +24317=>17606, +24328=>17607, +140205=>17608, +24350=>17609, +24391=>17610, +24419=>17611, +24434=>17612, +24446=>17613, +24463=>17614, +24482=>17615, +24519=>17616, +24523=>17617, +24530=>17618, +24531=>17619, +24532=>17620, +24546=>17621, +24558=>17622, +24559=>17623, +24563=>17624, +14615=>17625, +24610=>17626, +24612=>17627, +14618=>17628, +24652=>17629, +24725=>17630, +24744=>17631, +141043=>17632, +24753=>17633, +24766=>17634, +24776=>17635, +24793=>17636, +24814=>17637, +24821=>17638, +24848=>17639, +24857=>17640, +24862=>17641, +24890=>17642, +14703=>17643, +24897=>17644, +24902=>17645, +24928=>17646, +141403=>17647, +24978=>17648, +24979=>17649, +24983=>17650, +24997=>17651, +25005=>17652, +141483=>17653, +25045=>17654, +25053=>17655, +25077=>17656, +141711=>17657, +25123=>17658, +25170=>17659, +25185=>17660, +25188=>17661, +25211=>17662, +25197=>17663, +25203=>17664, +25241=>17665, +25301=>17666, +142008=>17667, +25341=>17668, +25347=>17669, +25360=>17670, +142159=>17671, +142160=>17672, +25394=>17673, +25397=>17674, +25403=>17675, +25404=>17676, +25409=>17677, +25412=>17678, +25422=>17679, +142150=>17680, +25433=>17681, +142365=>17682, +142246=>17683, +25452=>17684, +25497=>17685, +142372=>17686, +25492=>17687, +25533=>17688, +25556=>17689, +25557=>17690, +25568=>17691, +25579=>17692, +25580=>17693, +25586=>17694, +25630=>17695, +25637=>17696, +25641=>17697, +25647=>17698, +25690=>17699, +25693=>17700, +25715=>17701, +25725=>17702, +25735=>17703, +25745=>17704, +25759=>17705, +25803=>17706, +25804=>17707, +25813=>17708, +25815=>17709, +142817=>17710, +25828=>17711, +25855=>17712, +14958=>17713, +25871=>17714, +25876=>17715, +14963=>17716, +25886=>17717, +25906=>17718, +25924=>17719, +25940=>17720, +25963=>17721, +25978=>17722, +25988=>17723, +25994=>17724, +26034=>17725, +26037=>17726, +26040=>17727, +26047=>17728, +26057=>17729, +26068=>17730, +15062=>17731, +26105=>17732, +26108=>17733, +26116=>17734, +26120=>17735, +26145=>17736, +26154=>17737, +26181=>17738, +26193=>17739, +26190=>17740, +15082=>17741, +143811=>17742, +143861=>17743, +143798=>17744, +26218=>17745, +26220=>17746, +26221=>17747, +26235=>17748, +26240=>17749, +26256=>17750, +26258=>17751, +15118=>17752, +26285=>17753, +26289=>17754, +26293=>17755, +15130=>17756, +15132=>17757, +15063=>17758, +26369=>17759, +26386=>17760, +144242=>17761, +26393=>17762, +144339=>17763, +144338=>17764, +26445=>17765, +26452=>17766, +26461=>17767, +144336=>17768, +144356=>17769, +144341=>17770, +26484=>17771, +144346=>17772, +26514=>17773, +144351=>17774, +33635=>17775, +26640=>17776, +26563=>17777, +26568=>17778, +26578=>17779, +26587=>17780, +26615=>17781, +144458=>17782, +144465=>17783, +144459=>17784, +26648=>17785, +26655=>17786, +26669=>17787, +144485=>17788, +26675=>17789, +26683=>17790, +26686=>17791, +26693=>17792, +26697=>17793, +26700=>17794, +26709=>17795, +26711=>17796, +15223=>17797, +26731=>17798, +26734=>17799, +26748=>17800, +26754=>17801, +26768=>17802, +26774=>17803, +15213=>17804, +26776=>17805, +26777=>17806, +26778=>17807, +26780=>17808, +26794=>17809, +26795=>17810, +26804=>17811, +26811=>17812, +26875=>17813, +144612=>17814, +144730=>17815, +26819=>17816, +26821=>17817, +26828=>17818, +26841=>17819, +26852=>17820, +26853=>17821, +26860=>17822, +26871=>17823, +26883=>17824, +26887=>17825, +15239=>17826, +144788=>17827, +15245=>17828, +26950=>17829, +26985=>17830, +26988=>17831, +27002=>17832, +27026=>17833, +15268=>17834, +27030=>17835, +27056=>17836, +27066=>17837, +27068=>17838, +27072=>17839, +27089=>17840, +144953=>17841, +144967=>17842, +144952=>17843, +27107=>17844, +27118=>17845, +27119=>17846, +27123=>17847, +15309=>17848, +27124=>17849, +27134=>17850, +27153=>17851, +27162=>17852, +27165=>17853, +145180=>17854, +27186=>17855, +27187=>17856, +27199=>17857, +27209=>17858, +27258=>17859, +27214=>17860, +27218=>17861, +27236=>17862, +145164=>17863, +27275=>17864, +15344=>17865, +27297=>17866, +145252=>17867, +27307=>17868, +27325=>17869, +27334=>17870, +27348=>17871, +27344=>17872, +27357=>17873, +145407=>17874, +145383=>17875, +27377=>17876, +27378=>17877, +27379=>17878, +27389=>17879, +145444=>17880, +27403=>17881, +27407=>17882, +27408=>17883, +27409=>17884, +145469=>17885, +27415=>17886, +15398=>17887, +27439=>17888, +27466=>17889, +27480=>17890, +27500=>17891, +27509=>17892, +11934=>17893, +27514=>17893, +27521=>17894, +27547=>17895, +27566=>17896, +146072=>17897, +27581=>17898, +27591=>17899, +27592=>17900, +27593=>17901, +27610=>17902, +27622=>17903, +27623=>17904, +27630=>17905, +27650=>17906, +27658=>17907, +27662=>17908, +27702=>17909, +146559=>17910, +27725=>17911, +27739=>17912, +27757=>17913, +27780=>17914, +27785=>17915, +15555=>17916, +27796=>17917, +27799=>17918, +27821=>17919, +27842=>17920, +15570=>17921, +27868=>17922, +27881=>17923, +27885=>17924, +146688=>17925, +27904=>17926, +27940=>17927, +27942=>17928, +27943=>17929, +27751=>17930, +27951=>17931, +27964=>17932, +27995=>17933, +28000=>17934, +28016=>17935, +28032=>17936, +28033=>17937, +28042=>17938, +28045=>17939, +28049=>17940, +28056=>17941, +146752=>17942, +146938=>17943, +146937=>17944, +146899=>17945, +28075=>17946, +28078=>17947, +28084=>17948, +28098=>17949, +27956=>17950, +28104=>17951, +28110=>17952, +28127=>17953, +28150=>17954, +28214=>17955, +28190=>17956, +15633=>17957, +28210=>17958, +28232=>17959, +28233=>17960, +28235=>17961, +28236=>17962, +28239=>17963, +28243=>17964, +28244=>17965, +28247=>17966, +28259=>17967, +15646=>17968, +28307=>17969, +28327=>17970, +28340=>17971, +28355=>17972, +28469=>17973, +28395=>17974, +28409=>17975, +28411=>17976, +28426=>17977, +28428=>17978, +28440=>17979, +28453=>17980, +28470=>17981, +28476=>17982, +147326=>17983, +28498=>17984, +28503=>17985, +28512=>17986, +28520=>17987, +28560=>17988, +28566=>17989, +28606=>17990, +28575=>17991, +28581=>17992, +28591=>17993, +15716=>17994, +28616=>17995, +28617=>17996, +28649=>17997, +147606=>17998, +28668=>17999, +28672=>18000, +28682=>18001, +28707=>18002, +147715=>18003, +28730=>18004, +28739=>18005, +28743=>18006, +28747=>18007, +15770=>18008, +28773=>18009, +28777=>18010, +28782=>18011, +28790=>18012, +28806=>18013, +28823=>18014, +147910=>18015, +28831=>18016, +28849=>18017, +147966=>18018, +28908=>18019, +28874=>18020, +28881=>18021, +28931=>18022, +28934=>18023, +28936=>18024, +28940=>18025, +15808=>18026, +28975=>18027, +29008=>18028, +29011=>18029, +29022=>18030, +15828=>18031, +29078=>18032, +29056=>18033, +29083=>18034, +29088=>18035, +29090=>18036, +29102=>18037, +29103=>18038, +148412=>18039, +29145=>18040, +29148=>18041, +29191=>18042, +15877=>18043, +29236=>18044, +29241=>18045, +29250=>18046, +29271=>18047, +29283=>18048, +149033=>18049, +29294=>18050, +29295=>18051, +29304=>18052, +29311=>18053, +29326=>18054, +149157=>18055, +29358=>18056, +29360=>18057, +29377=>18058, +15968=>18059, +29388=>18060, +15974=>18061, +15976=>18062, +29427=>18063, +29434=>18064, +29447=>18065, +29458=>18066, +29464=>18067, +29465=>18068, +16003=>18069, +29497=>18070, +29484=>18071, +29491=>18072, +29501=>18073, +29522=>18074, +16020=>18075, +29547=>18076, +149654=>18077, +29550=>18078, +29551=>18079, +29553=>18080, +29569=>18081, +29578=>18082, +29588=>18083, +29592=>18084, +29596=>18085, +29605=>18086, +29625=>18087, +29631=>18088, +29637=>18089, +29643=>18090, +29665=>18091, +29671=>18092, +29689=>18093, +29715=>18094, +29690=>18095, +29697=>18096, +29779=>18097, +29760=>18098, +29763=>18099, +29778=>18100, +29789=>18101, +29825=>18102, +29832=>18103, +150093=>18104, +29842=>18105, +29847=>18106, +29849=>18107, +29857=>18108, +29861=>18109, +29866=>18110, +29881=>18111, +29883=>18112, +29882=>18113, +29910=>18114, +29912=>18115, +29931=>18116, +150358=>18117, +29946=>18118, +150383=>18119, +29984=>18120, +29988=>18121, +29994=>18122, +16215=>18123, +150550=>18124, +30013=>18125, +30014=>18126, +30016=>18127, +30024=>18128, +30032=>18129, +30034=>18130, +30066=>18131, +30065=>18132, +30074=>18133, +30077=>18134, +30078=>18135, +30092=>18136, +16245=>18137, +30114=>18138, +16247=>18139, +30128=>18140, +30135=>18141, +30143=>18142, +30144=>18143, +30150=>18144, +30159=>18145, +30163=>18146, +30173=>18147, +30175=>18148, +30176=>18149, +30183=>18150, +30190=>18151, +30193=>18152, +30211=>18153, +30232=>18154, +30215=>18155, +30223=>18156, +16302=>18157, +151054=>18158, +30227=>18159, +30235=>18160, +30236=>18161, +151095=>18162, +30245=>18163, +30248=>18164, +30268=>18165, +30259=>18166, +151146=>18167, +16329=>18168, +30273=>18169, +151179=>18170, +30281=>18171, +30293=>18172, +16343=>18173, +30318=>18174, +30357=>18175, +30369=>18176, +30368=>18177, +30375=>18178, +30376=>18179, +30383=>18180, +151626=>18181, +30409=>18182, +151637=>18183, +30440=>18184, +151842=>18185, +30487=>18186, +30490=>18187, +30509=>18188, +30517=>18189, +151977=>18190, +16441=>18191, +152037=>18192, +152013=>18193, +30552=>18194, +152094=>18195, +30588=>18196, +152140=>18197, +16472=>18198, +30618=>18199, +30623=>18200, +30626=>18201, +30628=>18202, +30686=>18203, +30687=>18204, +30692=>18205, +30698=>18206, +30700=>18207, +30715=>18208, +152622=>18209, +30725=>18210, +30729=>18211, +30733=>18212, +30745=>18213, +30764=>18214, +30791=>18215, +30826=>18216, +152793=>18217, +30858=>18218, +30868=>18219, +30884=>18220, +30877=>18221, +30879=>18222, +30907=>18223, +30933=>18224, +30950=>18225, +30969=>18226, +30970=>18227, +30974=>18228, +152999=>18229, +30992=>18230, +31003=>18231, +31013=>18232, +31050=>18233, +31064=>18234, +16645=>18235, +31079=>18236, +31090=>18237, +31125=>18238, +31137=>18239, +31145=>18240, +31156=>18241, +31170=>18242, +31175=>18243, +31180=>18244, +31181=>18245, +31190=>18246, +16712=>18247, +153513=>18248, +153524=>18249, +16719=>18250, +31242=>18251, +31253=>18252, +31259=>18253, +16739=>18254, +31288=>18255, +31303=>18256, +31318=>18257, +31321=>18258, +31324=>18259, +31327=>18260, +31335=>18261, +31338=>18262, +31349=>18263, +31362=>18264, +31370=>18265, +31376=>18266, +31404=>18267, +154068=>18268, +16820=>18269, +31417=>18270, +31422=>18271, +16831=>18272, +31436=>18273, +31464=>18274, +31476=>18275, +154340=>18276, +154339=>18277, +154353=>18278, +31549=>18279, +31530=>18280, +31534=>18281, +31535=>18282, +16870=>18283, +16883=>18284, +31615=>18285, +31553=>18286, +16878=>18287, +31573=>18288, +31609=>18289, +31588=>18290, +31590=>18291, +31603=>18292, +154546=>18293, +16903=>18294, +31632=>18295, +31643=>18296, +16910=>18297, +31669=>18298, +31676=>18299, +31685=>18300, +31690=>18301, +154699=>18302, +154724=>18303, +31700=>18304, +31702=>18305, +31706=>18306, +31722=>18307, +31728=>18308, +31747=>18309, +31758=>18310, +31813=>18311, +31818=>18312, +31831=>18313, +31838=>18314, +31841=>18315, +31849=>18316, +31855=>18317, +155182=>18318, +155222=>18319, +155237=>18320, +31910=>18321, +155234=>18322, +31926=>18323, +31927=>18324, +155352=>18325, +31940=>18326, +155330=>18327, +31949=>18328, +155368=>18329, +155427=>18330, +31974=>18331, +155484=>18332, +31989=>18333, +32003=>18334, +17094=>18335, +32018=>18336, +32030=>18337, +155616=>18338, +155604=>18339, +32061=>18340, +32062=>18341, +32064=>18342, +32071=>18343, +155660=>18344, +155643=>18345, +17110=>18346, +32090=>18347, +32106=>18348, +32112=>18349, +17117=>18350, +32127=>18351, +155671=>18352, +32136=>18353, +32151=>18354, +155744=>18355, +32157=>18356, +32167=>18357, +32170=>18358, +32182=>18359, +32192=>18360, +32215=>18361, +32217=>18362, +32230=>18363, +17154=>18364, +155885=>18365, +64088=>18366, +32272=>18367, +32279=>18368, +32285=>18369, +32295=>18370, +32300=>18371, +32325=>18372, +32373=>18373, +32382=>18374, +32390=>18375, +32391=>18376, +17195=>18377, +32410=>18378, +17219=>18379, +32572=>18380, +32571=>18381, +32574=>18382, +32579=>18383, +13505=>18384, +156272=>18385, +156294=>18386, +32611=>18387, +32612=>18388, +32621=>18389, +32637=>18390, +32638=>18391, +32656=>18392, +20859=>18393, +146702=>18394, +32662=>18395, +32668=>18396, +32685=>18397, +156674=>18398, +32707=>18399, +32719=>18400, +32739=>18401, +32754=>18402, +32778=>18403, +32776=>18404, +32790=>18405, +32812=>18406, +32816=>18407, +32835=>18408, +32870=>18409, +32891=>18410, +32921=>18411, +32924=>18412, +32932=>18413, +32935=>18414, +32952=>18415, +157310=>18416, +32965=>18417, +32981=>18418, +32998=>18419, +33037=>18420, +33013=>18421, +33019=>18422, +17390=>18423, +33077=>18424, +33054=>18425, +17392=>18426, +33060=>18427, +33063=>18428, +33068=>18429, +157469=>18430, +33085=>18431, +17416=>18432, +33129=>18433, +17431=>18434, +17436=>18435, +33157=>18436, +17442=>18437, +33176=>18438, +33202=>18439, +33217=>18440, +33219=>18441, +33238=>18442, +33243=>18443, +157917=>18444, +33252=>18445, +157930=>18446, +33260=>18447, +33277=>18448, +33279=>18449, +158063=>18450, +33284=>18451, +158173=>18452, +33305=>18453, +33314=>18454, +158238=>18455, +33340=>18456, +33353=>18457, +33349=>18458, +158296=>18459, +17526=>18460, +17530=>18461, +33367=>18462, +158348=>18463, +33372=>18464, +33379=>18465, +158391=>18466, +17553=>18467, +33405=>18468, +33407=>18469, +33411=>18470, +33418=>18471, +33427=>18472, +33447=>18473, +33448=>18474, +33458=>18475, +33460=>18476, +33466=>18477, +33468=>18478, +33506=>18479, +33512=>18480, +33527=>18481, +33543=>18482, +33544=>18483, +33548=>18484, +33620=>18485, +33563=>18486, +33565=>18487, +33584=>18488, +33596=>18489, +33604=>18490, +33623=>18491, +17598=>18492, +17620=>18493, +17587=>18494, +33684=>18495, +33685=>18496, +33691=>18497, +33693=>18498, +33737=>18499, +33744=>18500, +33748=>18501, +33757=>18502, +33765=>18503, +33785=>18504, +33813=>18505, +158835=>18506, +33815=>18507, +33849=>18508, +33871=>18509, +33873=>18510, +33874=>18511, +33881=>18512, +33882=>18513, +33884=>18514, +158941=>18515, +33893=>18516, +33912=>18517, +33916=>18518, +33921=>18519, +17677=>18520, +33943=>18521, +33958=>18522, +33982=>18523, +17672=>18524, +33998=>18525, +33999=>18526, +34003=>18527, +159333=>18528, +34023=>18529, +34026=>18530, +34031=>18531, +34033=>18532, +34042=>18533, +34075=>18534, +34084=>18535, +34085=>18536, +34091=>18537, +34127=>18538, +34159=>18539, +17731=>18540, +34129=>18541, +34145=>18542, +34146=>18543, +159636=>18544, +34171=>18545, +34173=>18546, +34175=>18547, +34177=>18548, +34182=>18549, +34195=>18550, +34205=>18551, +34207=>18552, +159736=>18553, +159734=>18554, +159735=>18555, +34236=>18556, +34247=>18557, +34250=>18558, +34264=>18559, +34265=>18560, +34271=>18561, +34273=>18562, +34278=>18563, +34294=>18564, +34304=>18565, +34321=>18566, +34334=>18567, +34337=>18568, +34340=>18569, +34343=>18570, +160013=>18571, +34361=>18572, +34364=>18573, +160057=>18574, +34368=>18575, +34387=>18576, +34390=>18577, +34423=>18578, +34439=>18579, +34441=>18580, +34460=>18581, +34461=>18582, +34481=>18583, +34483=>18584, +34497=>18585, +34499=>18586, +34513=>18587, +34517=>18588, +34519=>18589, +34531=>18590, +34534=>18591, +17848=>18592, +34565=>18593, +34567=>18594, +34574=>18595, +34576=>18596, +34591=>18597, +34593=>18598, +34595=>18599, +34609=>18600, +34618=>18601, +34624=>18602, +34627=>18603, +34641=>18604, +34648=>18605, +34660=>18606, +34661=>18607, +34674=>18608, +34684=>18609, +160731=>18610, +160730=>18611, +34727=>18612, +34697=>18613, +34699=>18614, +34707=>18615, +34720=>18616, +160766=>18617, +17893=>18618, +34750=>18619, +160784=>18620, +34753=>18621, +34766=>18622, +34783=>18623, +160841=>18624, +34787=>18625, +34789=>18626, +34790=>18627, +34794=>18628, +34835=>18629, +34856=>18630, +34862=>18631, +34866=>18632, +34876=>18633, +17935=>18634, +34890=>18635, +34904=>18636, +161301=>18637, +161300=>18638, +34921=>18639, +161329=>18640, +34927=>18641, +34976=>18642, +35004=>18643, +35008=>18644, +161427=>18645, +35025=>18646, +35027=>18647, +17985=>18648, +35073=>18649, +161550=>18650, +35127=>18651, +161571=>18652, +35138=>18653, +35141=>18654, +35145=>18655, +161618=>18656, +35170=>18657, +35209=>18658, +35216=>18659, +35231=>18660, +35248=>18661, +35255=>18662, +35288=>18663, +35307=>18664, +18081=>18665, +35315=>18666, +35325=>18667, +35327=>18668, +18095=>18669, +35345=>18670, +35348=>18671, +162181=>18672, +35361=>18673, +35381=>18674, +35390=>18675, +35397=>18676, +35405=>18677, +35416=>18678, +35502=>18679, +35472=>18680, +35511=>18681, +35543=>18682, +35580=>18683, +162436=>18684, +35594=>18685, +35589=>18686, +35597=>18687, +35612=>18688, +35629=>18689, +18188=>18690, +35665=>18691, +35678=>18692, +35702=>18693, +35713=>18694, +35723=>18695, +35732=>18696, +35733=>18697, +35897=>18698, +162739=>18699, +35901=>18700, +162750=>18701, +162759=>18702, +35909=>18703, +35919=>18704, +35927=>18705, +35945=>18706, +35949=>18707, +163000=>18708, +35987=>18709, +35986=>18710, +35993=>18711, +18276=>18712, +35995=>18713, +36054=>18714, +36053=>18715, +163232=>18716, +36081=>18717, +163344=>18718, +36105=>18719, +36110=>18720, +36296=>18721, +36313=>18722, +36364=>18723, +18429=>18724, +36349=>18725, +36358=>18726, +163978=>18727, +36372=>18728, +36374=>18729, +36385=>18730, +36386=>18731, +36391=>18732, +164027=>18733, +18454=>18734, +36406=>18735, +36409=>18736, +36436=>18737, +36450=>18738, +36461=>18739, +36463=>18740, +36504=>18741, +36510=>18742, +36533=>18743, +36539=>18744, +164482=>18745, +18510=>18746, +164595=>18747, +36608=>18748, +36616=>18749, +36651=>18750, +36672=>18751, +36682=>18752, +36696=>18753, +164876=>18754, +36772=>18755, +36788=>18756, +164949=>18757, +36801=>18758, +36806=>18759, +64036=>18760, +36810=>18761, +36813=>18762, +36819=>18763, +36821=>18764, +36849=>18765, +36853=>18766, +36859=>18767, +36876=>18768, +36919=>18769, +165227=>18770, +36931=>18771, +36957=>18772, +165320=>18773, +165321=>18774, +36997=>18775, +37004=>18776, +37008=>18777, +37025=>18778, +18613=>18779, +37040=>18780, +37046=>18781, +37059=>18782, +37064=>18783, +165591=>18784, +37084=>18785, +37087=>18786, +165626=>18787, +37110=>18788, +37106=>18789, +37120=>18790, +37099=>18791, +37118=>18792, +37119=>18793, +37124=>18794, +37126=>18795, +37144=>18796, +37150=>18797, +37175=>18798, +37177=>18799, +37190=>18800, +37191=>18801, +37207=>18802, +37209=>18803, +37236=>18804, +37241=>18805, +37253=>18806, +37299=>18807, +37302=>18808, +37315=>18809, +37316=>18810, +166217=>18811, +166214=>18812, +37356=>18813, +37377=>18814, +37398=>18815, +37399=>18816, +166251=>18817, +37442=>18818, +37450=>18819, +37462=>18820, +37473=>18821, +37477=>18822, +37480=>18823, +166280=>18824, +37500=>18825, +37501=>18826, +37503=>18827, +37513=>18828, +37517=>18829, +37527=>18830, +37529=>18831, +37535=>18832, +37547=>18833, +166330=>18834, +166331=>18835, +37554=>18836, +37567=>18837, +37568=>18838, +37574=>18839, +37582=>18840, +37605=>18841, +37649=>18842, +166430=>18843, +166441=>18844, +37623=>18845, +37673=>18846, +166513=>18847, +166467=>18848, +37713=>18849, +37722=>18850, +37739=>18851, +37745=>18852, +37747=>18853, +37793=>18854, +166553=>18855, +166605=>18856, +37768=>18857, +37771=>18858, +37775=>18859, +37790=>18860, +37877=>18861, +166628=>18862, +166621=>18863, +37873=>18864, +37831=>18865, +37852=>18866, +37863=>18867, +37897=>18868, +37910=>18869, +37911=>18870, +37883=>18871, +37938=>18872, +37947=>18873, +166849=>18874, +166895=>18875, +37997=>18876, +37999=>18877, +38265=>18878, +38278=>18879, +38284=>18880, +38285=>18881, +167184=>18882, +167281=>18883, +38344=>18884, +167419=>18885, +167455=>18886, +38444=>18887, +38451=>18888, +38452=>18889, +167478=>18890, +38460=>18891, +38497=>18892, +167561=>18893, +38530=>18894, +167659=>18895, +38554=>18896, +167730=>18897, +18919=>18898, +38579=>18899, +38586=>18900, +38589=>18901, +18938=>18902, +167928=>18903, +38616=>18904, +38618=>18905, +38621=>18906, +18948=>18907, +38676=>18908, +38691=>18909, +18985=>18910, +38710=>18911, +38721=>18912, +38727=>18913, +38743=>18914, +38747=>18915, +38762=>18916, +168608=>18917, +168625=>18918, +38806=>18919, +38814=>18920, +38833=>18921, +38834=>18922, +38846=>18923, +38860=>18924, +38865=>18925, +38868=>18926, +38872=>18927, +38881=>18928, +38897=>18929, +38916=>18930, +38925=>18931, +38932=>18932, +38934=>18933, +19132=>18934, +169104=>18935, +38962=>18936, +38963=>18937, +38949=>18938, +38983=>18939, +39014=>18940, +39083=>18941, +39085=>18942, +39088=>18943, +169423=>18944, +39095=>18945, +39099=>18946, +39100=>18947, +39106=>18948, +39111=>18949, +39115=>18950, +39137=>18951, +39139=>18952, +39146=>18953, +39152=>18954, +39153=>18955, +39155=>18956, +39176=>18957, +19259=>18958, +169712=>18959, +39190=>18960, +39191=>18961, +169753=>18962, +39194=>18963, +39195=>18964, +39196=>18965, +169808=>18966, +39217=>18967, +39226=>18968, +39227=>18969, +39228=>18970, +39233=>18971, +39238=>18972, +39246=>18973, +39264=>18974, +39331=>18975, +39334=>18976, +39357=>18977, +39359=>18978, +39363=>18979, +39380=>18980, +39385=>18981, +39390=>18982, +170182=>18983, +39408=>18984, +39417=>18985, +39420=>18986, +39434=>18987, +39441=>18988, +39450=>18989, +39456=>18990, +39473=>18991, +39492=>18992, +39500=>18993, +39512=>18994, +19394=>18995, +39599=>18996, +19402=>18997, +39607=>18998, +19410=>18999, +39609=>19000, +170610=>19001, +39622=>19002, +39632=>19003, +39634=>19004, +39637=>19005, +39648=>19006, +39653=>19007, +39657=>19008, +39692=>19009, +39696=>19010, +39698=>19011, +39702=>19012, +39708=>19013, +39723=>19014, +39741=>19015, +19488=>19016, +39755=>19017, +39779=>19018, +39781=>19019, +39787=>19020, +39788=>19021, +39798=>19022, +39799=>19023, +39846=>19024, +39852=>19025, +171483=>19026, +39858=>19027, +39864=>19028, +39870=>19029, +39923=>19030, +39896=>19031, +39901=>19032, +39914=>19033, +39919=>19034, +39918=>19035, +171541=>19036, +171658=>19037, +171593=>19038, +39958=>19039, +39960=>19040, +39961=>19041, +39962=>19042, +39965=>19043, +39970=>19044, +39977=>19045, +171716=>19046, +39985=>19047, +39991=>19048, +40005=>19049, +40028=>19050, +171753=>19051, +40009=>19052, +40010=>19053, +171739=>19054, +40020=>19055, +40024=>19056, +40027=>19057, +40029=>19058, +40031=>19059, +40041=>19060, +40042=>19061, +40043=>19062, +40045=>19063, +40046=>19064, +40050=>19065, +40053=>19066, +40058=>19067, +40166=>19068, +40178=>19069, +40203=>19070, +171982=>19071, +171991=>19071, +40209=>19072, +40215=>19073, +40216=>19074, +172079=>19075, +19652=>19076, +172058=>19077, +40242=>19078, +19665=>19079, +40266=>19080, +40287=>19081, +40290=>19082, +172281=>19083, +172162=>19084, +40307=>19085, +40310=>19086, +40311=>19087, +40324=>19088, +40345=>19089, +40353=>19090, +40383=>19091, +40373=>19092, +40377=>19093, +40381=>19094, +40393=>19095, +40410=>19096, +40416=>19097, +40419=>19098, +19719=>19099, +40458=>19100, +40450=>19101, +40461=>19102, +40476=>19103, +40571=>19104, +139800=>19105, +40576=>19106, +40581=>19107, +40603=>19108, +172940=>19109, +40637=>19110, +173111=>19111, +40671=>19112, +40703=>19113, +40706=>19114, +19831=>19115, +40707=>19116, +40762=>19117, +40765=>19118, +40774=>19119, +40787=>19120, +40789=>19121, +40792=>19122, +173553=>19123, +40797=>19124, +173570=>19125, +40809=>19126, +40813=>19127, +40816=>19128, +173746=>19129, +11948=>19130, +13844=>19131, +14509=>19132, +15820=>19133, +16348=>19134, +17854=>19135, +17936=>19136, +19326=>19137, +19512=>19138, +19681=>19139, +19980=>19140, +20003=>19141, +20004=>19142, +20089=>19143, +20211=>19144, +20236=>19145, +20249=>19146, +20267=>19147, +20270=>19148, +20273=>19149, +20356=>19150, +20382=>19151, +20407=>19152, +20484=>19153, +20492=>19154, +20556=>19155, +20575=>19156, +20578=>19157, +20599=>19158, +20622=>19159, +20638=>19160, +20642=>19161, +20675=>19162, +20712=>19163, +20721=>19164, +20734=>19165, +20743=>19166, +20748=>19167, +20749=>19168, +20750=>19169, +20787=>19170, +20792=>19171, +20852=>19172, +20868=>19173, +20920=>19174, +20922=>19175, +20936=>19176, +20943=>19177, +20945=>19178, +20947=>19179, +20948=>19180, +20952=>19181, +20959=>19182, +20997=>19183, +21030=>19184, +21032=>19185, +21035=>19186, +21041=>19187, +21042=>19188, +21045=>19189, +21052=>19190, +21082=>19191, +21088=>19192, +21102=>19193, +21112=>19194, +21113=>19195, +21130=>19196, +21132=>19197, +21217=>19198, +21225=>19199, +21233=>19200, +21251=>19201, +21265=>19202, +21279=>19203, +21293=>19204, +21298=>19205, +21309=>19206, +21349=>19207, +21357=>19208, +21369=>19209, +21374=>19210, +21396=>19211, +21401=>19212, +21418=>19213, +21423=>19214, +21434=>19215, +21441=>19216, +21444=>19217, +21445=>19218, +21472=>19219, +21523=>19220, +21546=>19221, +21553=>19222, +21556=>19223, +21557=>19224, +21580=>19225, +21671=>19226, +21674=>19227, +21681=>19228, +21691=>19229, +21710=>19230, +21738=>19231, +21756=>19232, +21765=>19233, +21768=>19234, +21781=>19235, +21799=>19236, +21802=>19237, +21814=>19238, +21841=>19239, +21862=>19240, +21903=>19241, +21906=>19242, +21908=>19243, +21924=>19244, +21938=>19245, +21955=>19246, +21958=>19247, +21971=>19248, +21979=>19249, +21996=>19250, +21998=>19251, +22001=>19252, +22006=>19253, +22008=>19254, +22021=>19255, +22029=>19256, +22033=>19257, +22034=>19258, +22060=>19259, +22069=>19260, +22073=>19261, +22093=>19262, +22100=>19263, +22149=>19264, +22175=>19265, +22182=>19266, +22199=>19267, +22220=>19268, +22223=>19269, +22233=>19270, +22241=>19271, +22251=>19272, +22253=>19273, +22257=>19274, +22279=>19275, +22284=>19276, +22298=>19277, +22299=>19278, +22301=>19279, +22316=>19280, +22318=>19281, +22333=>19282, +22334=>19283, +22367=>19284, +22379=>19285, +22381=>19286, +22394=>19287, +22403=>19288, +22423=>19289, +22446=>19290, +22485=>19291, +22503=>19292, +22541=>19293, +22566=>19294, +22605=>19295, +22607=>19296, +22623=>19297, +22637=>19298, +22655=>19299, +22657=>19300, +22680=>19301, +22716=>19302, +22815=>19303, +22819=>19304, +22873=>19305, +22905=>19306, +22935=>19307, +22959=>19308, +22963=>19309, +23007=>19310, +23025=>19311, +23032=>19312, +23218=>19313, +23224=>19314, +23274=>19315, +23286=>19316, +23323=>19317, +23325=>19318, +23329=>19319, +23352=>19320, +23479=>19321, +23511=>19322, +23520=>19323, +23583=>19324, +23594=>19325, +23596=>19326, +23606=>19327, +23641=>19328, +23644=>19329, +23661=>19330, +23773=>19331, +23809=>19332, +23860=>19333, +23869=>19334, +23897=>19335, +23934=>19336, +23939=>19337, +24007=>19338, +24057=>19339, +24104=>19340, +24114=>19341, +24117=>19342, +24155=>19343, +24168=>19344, +24170=>19345, +24183=>19346, +24192=>19347, +24203=>19348, +24243=>19349, +24253=>19350, +24273=>19351, +24276=>19352, +24277=>19353, +24397=>19354, +24492=>19355, +24554=>19356, +24583=>19357, +24649=>19358, +24660=>19359, +24679=>19360, +24763=>19361, +24772=>19362, +24829=>19363, +24842=>19364, +24854=>19365, +24874=>19366, +24886=>19367, +24926=>19368, +24932=>19369, +24955=>19370, +24957=>19371, +24959=>19372, +24989=>19373, +25016=>19374, +25052=>19375, +25058=>19376, +25061=>19377, +25064=>19378, +25092=>19379, +25095=>19380, +25137=>19381, +25145=>19382, +25149=>19383, +25210=>19384, +25232=>19385, +25256=>19386, +25306=>19387, +25332=>19388, +25366=>19389, +25386=>19390, +25398=>19391, +25414=>19392, +25419=>19393, +25427=>19394, +25457=>19395, +25461=>19396, +25471=>19397, +25474=>19398, +25482=>19399, +25518=>19400, +25519=>19401, +25578=>19402, +25592=>19403, +25593=>19404, +25618=>19405, +25624=>19406, +25632=>19407, +25636=>19408, +25642=>19409, +25653=>19410, +25661=>19411, +25663=>19412, +25682=>19413, +25695=>19414, +25716=>19415, +25744=>19416, +25752=>19417, +25753=>19418, +25772=>19419, +25779=>19420, +25837=>19421, +25840=>19422, +25883=>19423, +25887=>19424, +25902=>19425, +25929=>19426, +25952=>19427, +26002=>19428, +26005=>19429, +26036=>19430, +26046=>19431, +26056=>19432, +26062=>19433, +26064=>19434, +26079=>19435, +26238=>19436, +26251=>19437, +26252=>19438, +26291=>19439, +26304=>19440, +26319=>19441, +26405=>19442, +26421=>19443, +26453=>19444, +26496=>19445, +26511=>19446, +26513=>19447, +26532=>19448, +26545=>19449, +26549=>19450, +26558=>19451, +26664=>19452, +26758=>19453, +26859=>19454, +26869=>19455, +26903=>19456, +26931=>19457, +26936=>19458, +26971=>19459, +26981=>19460, +27048=>19461, +27051=>19462, +27055=>19463, +27109=>19464, +27121=>19465, +27210=>19466, +27221=>19467, +27239=>19468, +27249=>19469, +27311=>19470, +27336=>19471, +27337=>19472, +27395=>19473, +27451=>19474, +27455=>19475, +27517=>19476, +27518=>19477, +27568=>19478, +27639=>19479, +27641=>19480, +27652=>19481, +27657=>19482, +27661=>19483, +27692=>19484, +27722=>19485, +27730=>19486, +27732=>19487, +27769=>19488, +27820=>19489, +27828=>19490, +27858=>19491, +28001=>19492, +28028=>19493, +28089=>19494, +28144=>19495, +28229=>19496, +28275=>19497, +28283=>19498, +28285=>19499, +28297=>19500, +28348=>19501, +28378=>19502, +28379=>19503, +28454=>19504, +28457=>19505, +28464=>19506, +28551=>19507, +28573=>19508, +28590=>19509, +28599=>19510, +28685=>19511, +28704=>19512, +28745=>19513, +28824=>19514, +28848=>19515, +28885=>19516, +28886=>19517, +28997=>19518, +29106=>19519, +29172=>19520, +29207=>19521, +29215=>19522, +29251=>19523, +29263=>19524, +29264=>19525, +29274=>19526, +29280=>19527, +29288=>19528, +29303=>19529, +29316=>19530, +29385=>19531, +29413=>19532, +29428=>19533, +29442=>19534, +29451=>19535, +29470=>19536, +29474=>19537, +29498=>19538, +29499=>19539, +29517=>19540, +29528=>19541, +29543=>19542, +29810=>19543, +29871=>19544, +29919=>19545, +29924=>19546, +29940=>19547, +29947=>19548, +29974=>19549, +29985=>19550, +30015=>19551, +30046=>19552, +30105=>19553, +30116=>19554, +30145=>19555, +30148=>19556, +30156=>19557, +30167=>19558, +30172=>19559, +30177=>19560, +30191=>19561, +30212=>19562, +30220=>19563, +30237=>19564, +30258=>19565, +30264=>19566, +30277=>19567, +30282=>19568, +30303=>19569, +30381=>19570, +30397=>19571, +30425=>19572, +30443=>19573, +30448=>19574, +30457=>19575, +30464=>19576, +30478=>19577, +30498=>19578, +30504=>19579, +30511=>19580, +30521=>19581, +30526=>19582, +30533=>19583, +30538=>19584, +30543=>19585, +30558=>19586, +30564=>19587, +30567=>19588, +30572=>19589, +30596=>19590, +30604=>19591, +30605=>19592, +30614=>19593, +30631=>19594, +30639=>19595, +30647=>19596, +30654=>19597, +30665=>19598, +30673=>19599, +30681=>19600, +30705=>19601, +30775=>19602, +30812=>19603, +30846=>19604, +30872=>19605, +30881=>19606, +30897=>19607, +30899=>19608, +30921=>19609, +30931=>19610, +30988=>19611, +31007=>19612, +31015=>19613, +31016=>19614, +31039=>19615, +31042=>19616, +31060=>19617, +31083=>19618, +31100=>19619, +31147=>19620, +31172=>19621, +31210=>19622, +31234=>19623, +31244=>19624, +31280=>19625, +31290=>19626, +31300=>19627, +31360=>19628, +31366=>19629, +31380=>19630, +31413=>19631, +31421=>19632, +31486=>19633, +31531=>19634, +31607=>19635, +31648=>19636, +31660=>19637, +31664=>19638, +31720=>19639, +31730=>19640, +31736=>19641, +31740=>19642, +31742=>19643, +31753=>19644, +31784=>19645, +31791=>19646, +31810=>19647, +31826=>19648, +31827=>19649, +31835=>19650, +31836=>19651, +31837=>19652, +31858=>19653, +31869=>19654, +31879=>19655, +31902=>19656, +31930=>19657, +31943=>19658, +31955=>19659, +31962=>19660, +32060=>19661, +32077=>19662, +32130=>19663, +32133=>19664, +32141=>19665, +32145=>19666, +32158=>19667, +32179=>19668, +32185=>19669, +32208=>19670, +32229=>19671, +32245=>19672, +32246=>19673, +32303=>19674, +32310=>19675, +32324=>19676, +32367=>19677, +32376=>19678, +32385=>19679, +32573=>19680, +32603=>19681, +32605=>19682, +32613=>19683, +32625=>19684, +32639=>19685, +32640=>19686, +32651=>19687, +32674=>19688, +32765=>19689, +32766=>19690, +32767=>19691, +32775=>19692, +32781=>19693, +32798=>19694, +32825=>19695, +32904=>19696, +32910=>19697, +32975=>19698, +32980=>19699, +33005=>19700, +33008=>19701, +33015=>19702, +33018=>19703, +33022=>19704, +33027=>19705, +33047=>19706, +33072=>19707, +33111=>19708, +33135=>19709, +33139=>19710, +33163=>19711, +33168=>19712, +33179=>19713, +33182=>19714, +33227=>19715, +33237=>19716, +33245=>19717, +33246=>19718, +33249=>19719, +33263=>19720, +33270=>19721, +33280=>19722, +33291=>19723, +33299=>19724, +33300=>19725, +33306=>19726, +33338=>19727, +33348=>19728, +33389=>19729, +33412=>19730, +33417=>19731, +33425=>19732, +33450=>19733, +33456=>19734, +33488=>19735, +33514=>19736, +33519=>19737, +33526=>19738, +33622=>19739, +33656=>19740, +33784=>19741, +33788=>19742, +33880=>19743, +33939=>19744, +33969=>19745, +33981=>19746, +34043=>19747, +34118=>19748, +34134=>19749, +34141=>19750, +34181=>19751, +34200=>19752, +34370=>19753, +34374=>19754, +34496=>19755, +34580=>19756, +34594=>19757, +34606=>19758, +34617=>19759, +34653=>19760, +34683=>19761, +34700=>19762, +34702=>19763, +34711=>19764, +34712=>19765, +34718=>19766, +34723=>19767, +34734=>19768, +34751=>19769, +34761=>19770, +34778=>19771, +34840=>19772, +34843=>19773, +34861=>19774, +34874=>19775, +34885=>19776, +34891=>19777, +34894=>19778, +34901=>19779, +34906=>19780, +34926=>19781, +34970=>19782, +34971=>19783, +34972=>19784, +35021=>19785, +35040=>19786, +35055=>19787, +35086=>19788, +35087=>19789, +35110=>19790, +35125=>19791, +35162=>19792, +35164=>19793, +35179=>19794, +35184=>19795, +35196=>19796, +35237=>19797, +35253=>19798, +35260=>19799, +35285=>19800, +35401=>19801, +35415=>19802, +35431=>19803, +35454=>19804, +35462=>19805, +35478=>19806, +35510=>19807, +35529=>19808, +35537=>19809, +35549=>19810, +35564=>19811, +35573=>19812, +35590=>19813, +35599=>19814, +35601=>19815, +35653=>19816, +35666=>19817, +35693=>19818, +35704=>19819, +35708=>19820, +35710=>19821, +35717=>19822, +35743=>19823, +35915=>19824, +35923=>19825, +35963=>19826, +36026=>19827, +36037=>19828, +36041=>19829, +36050=>19830, +36076=>19831, +36085=>19832, +36087=>19833, +36097=>19834, +36099=>19835, +36119=>19836, +36124=>19837, +36206=>19838, +36241=>19839, +36255=>19840, +36267=>19841, +36274=>19842, +36309=>19843, +36327=>19844, +36337=>19845, +36338=>19846, +36340=>19847, +36353=>19848, +36363=>19849, +36390=>19850, +36401=>19851, +36416=>19852, +36417=>19853, +36429=>19854, +36431=>19855, +36444=>19856, +36449=>19857, +36457=>19858, +36465=>19859, +36469=>19860, +36471=>19861, +36489=>19862, +36496=>19863, +36501=>19864, +36506=>19865, +36519=>19866, +36521=>19867, +36525=>19868, +36584=>19869, +36592=>19870, +36615=>19871, +36632=>19872, +36645=>19873, +36647=>19874, +36652=>19875, +36661=>19876, +36666=>19877, +36675=>19878, +36679=>19879, +36689=>19880, +36693=>19881, +36768=>19882, +36769=>19883, +36770=>19884, +36773=>19885, +36868=>19886, +36891=>19887, +36911=>19888, +36940=>19889, +36955=>19890, +36976=>19891, +36980=>19892, +36985=>19893, +37003=>19894, +37016=>19895, +37024=>19896, +37042=>19897, +37053=>19898, +37065=>19899, +37104=>19900, +37125=>19901, +37157=>19902, +37210=>19903, +37223=>19904, +37242=>19905, +37258=>19906, +37265=>19907, +37269=>19908, +37296=>19909, +37307=>19910, +37309=>19911, +37314=>19912, +37317=>19913, +37376=>19914, +37385=>19915, +37411=>19916, +37494=>19917, +37518=>19918, +37551=>19919, +37563=>19920, +37564=>19921, +37569=>19922, +37571=>19923, +37573=>19924, +37576=>19925, +37652=>19926, +37683=>19927, +37686=>19928, +37720=>19929, +37759=>19930, +37762=>19931, +37770=>19932, +37819=>19933, +37836=>19934, +37862=>19935, +37881=>19936, +37890=>19937, +37901=>19938, +37902=>19939, +37934=>19940, +37964=>19941, +38280=>19942, +38305=>19943, +38335=>19944, +38342=>19945, +38345=>19946, +38353=>19947, +38354=>19948, +38368=>19949, +38372=>19950, +38374=>19951, +38436=>19952, +38449=>19953, +38456=>19954, +38461=>19955, +38484=>19956, +38516=>19957, +38523=>19958, +38527=>19959, +38529=>19960, +38531=>19961, +38537=>19962, +38550=>19963, +38574=>19964, +38659=>19965, +38683=>19966, +38689=>19967, +38690=>19968, +38696=>19969, +38705=>19970, +38759=>19971, +38774=>19972, +38781=>19973, +38783=>19974, +38809=>19975, +38815=>19976, +38828=>19977, +38841=>19978, +38861=>19979, +38880=>19980, +38895=>19981, +38919=>19982, +38950=>19983, +38958=>19984, +39010=>19985, +39011=>19986, +39092=>19987, +39109=>19988, +39170=>19989, +39185=>19990, +39189=>19991, +39221=>19992, +39240=>19993, +39252=>19994, +39262=>19995, +39393=>19996, +39436=>19997, +39440=>19998, +39459=>19999, +39489=>20000, +39505=>20001, +39613=>20002, +39614=>20003, +39681=>20004, +39689=>20005, +39691=>20006, +39693=>20007, +39694=>20008, +39705=>20009, +39733=>20010, +39752=>20011, +39765=>20012, +39784=>20013, +39808=>20014, +39814=>20015, +39824=>20016, +39837=>20017, +39856=>20018, +39871=>20019, +39880=>20020, +39935=>20021, +39938=>20022, +39964=>20023, +39989=>20024, +40004=>20025, +40022=>20026, +40033=>20027, +40040=>20028, +40240=>20029, +40253=>20030, +40298=>20031, +40315=>20032, +40421=>20033, +40425=>20034, +40435=>20035, +40570=>20036, +40578=>20037, +40579=>20038, +40580=>20039, +40624=>20040, +40676=>20041, +40688=>20042, +40690=>20043, +40713=>20044, +40719=>20045, +40724=>20046, +40731=>20047, +40738=>20048, +40742=>20049, +40746=>20050, +40747=>20051, +40756=>20052, +40794=>20053, +40815=>20054, +40862=>20055, +40869=>20056, +131317=>20057, +151044=>20058, +151538=>20059, +163187=>20060, +194581=>20061, +194630=>20062, +194713=>20063, +194726=>20064, +194789=>20065, +195038=>20066, +13790=>20067, +40895=>20068, +40896=>20069, +40897=>20070, +40898=>20071, +172722=>20072, +131416=>20075, +132529=>20080, +132844=>20083, +134488=>20090, +154060=>20112, +14756=>20122, +14776=>20123, +142914=>20124, +14940=>20127, +133064=>20128, +143339=>20130, +162228=>20133, +15044=>20135, +15051=>20136, +14981=>20142, +15347=>20151, +27384=>20152, +15665=>20158, +147531=>20168, +15936=>20170, +14497=>20171, +158878=>20206, +18207=>20219, +162876=>20220, +18462=>20225, +39709=>20297, +39724=>20298, +20482=>20299, +20958=>20300, +21255=>20301, +23532=>20302, +63784=>20303, +26142=>20304, +63785=>20305, +28746=>20306, +64021=>20307, +21857=>20308, +27706=>20309, +31328=>20310, +156492=>20311, +34819=>20312, +38315=>20313, +38741=>20314, +171581=>20315, +173594=>20316, +900=>20317, +901=>20318, +272=>20322, +294=>20323, +306=>20324, +319=>20325, +330=>20326, +358=>20327, +307=>20328, +312=>20329, +320=>20330, +329=>20331, +359=>20332, +266=>20333, +278=>20334, +286=>20335, +290=>20336, +288=>20337, +304=>20338, +302=>20339, +310=>20340, +315=>20342, +325=>20343, +342=>20344, +370=>20345, +471=>20346, +475=>20347, +473=>20348, +469=>20349, +372=>20350, +374=>20351, +267=>20352, +279=>20353, +501=>20354, +287=>20355, +289=>20356, +303=>20357, +311=>20358, +316=>20360, +326=>20361, +343=>20362, +371=>20363, +373=>20364, +375=>20365, +8494=>20366, +8710=>20367, +8719=>20368, +8804=>20369, +8805=>20370, +9674=>20371, +902=>20427, +904=>20428, +905=>20429, +906=>20430, +938=>20431, +908=>20432, +910=>20433, +939=>20434, +911=>20435, +940=>20436, +941=>20437, +942=>20438, +943=>20439, +970=>20440, +912=>20441, +972=>20442, +973=>20443, +971=>20444, +944=>20445, +974=>20446, +1026=>20447, +1027=>20448, +1028=>20449, +1029=>20450, +1030=>20451, +1031=>20452, +1032=>20453, +1033=>20454, +1034=>20455, +1035=>20456, +1036=>20457, +1038=>20458, +1039=>20459, +1106=>20460, +1107=>20461, +1108=>20462, +1109=>20463, +1110=>20464, +1111=>20465, +1112=>20466, +1113=>20467, +1114=>20468, +1115=>20469, +1116=>20470, +1118=>20471, +1119=>20472, +9361=>20587, +9362=>20588, +20021=>21075, +20060=>21076, +20067=>21077, +20072=>21078, +20084=>21079, +20085=>21080, +20119=>21081, +20143=>21082, +20187=>21083, +20194=>21084, +20200=>21085, +20207=>21086, +20222=>21087, +20226=>21088, +20232=>21089, +20242=>21090, +20247=>21091, +20275=>21092, +20277=>21093, +20288=>21094, +20290=>21095, +20299=>21096, +20300=>21097, +20306=>21098, +20323=>21099, +20334=>21100, +20337=>21101, +20345=>21102, +20353=>21103, +20361=>21104, +20364=>21105, +20366=>21106, +20368=>21107, +20371=>21108, +20377=>21109, +20383=>21110, +20409=>21111, +20411=>21112, +20412=>21113, +20413=>21114, +20416=>21115, +20417=>21116, +20422=>21117, +20424=>21118, +20428=>21119, +20444=>21120, +20450=>21121, +20464=>21122, +20476=>21123, +20487=>21124, +20490=>21125, +20503=>21126, +20509=>21127, +20528=>21128, +20530=>21129, +20531=>21130, +20533=>21131, +20549=>21132, +20554=>21133, +20561=>21134, +20562=>21135, +20569=>21136, +20576=>21137, +20583=>21138, +20589=>21139, +20593=>21140, +20609=>21141, +20611=>21142, +20612=>21143, +20614=>21144, +20618=>21145, +20624=>21146, +20635=>21147, +20639=>21148, +20640=>21149, +20641=>21150, +20655=>21151, +20656=>21152, +20665=>21153, +20669=>21154, +20672=>21155, +20691=>21156, +20700=>21157, +20701=>21158, +20703=>21159, +20706=>21160, +20708=>21161, +20726=>21162, +20730=>21163, +20761=>21165, +20764=>21166, +20765=>21167, +20771=>21168, +20775=>21169, +20776=>21170, +20780=>21171, +20781=>21172, +20783=>21173, +20785=>21174, +20788=>21175, +20793=>21176, +20802=>21177, +20815=>21178, +20819=>21179, +20824=>21180, +20838=>21181, +20862=>21182, +20878=>21183, +20927=>21184, +20930=>21185, +20946=>21186, +20949=>21187, +20965=>21188, +20978=>21189, +20983=>21190, +21016=>21191, +21026=>21192, +21061=>21193, +21080=>21194, +21087=>21195, +21120=>21196, +21125=>21197, +21141=>21198, +21142=>21199, +21143=>21200, +21146=>21201, +21157=>21202, +21159=>21203, +21168=>21204, +21174=>21205, +21175=>21206, +21176=>21207, +21181=>21208, +21188=>21209, +21190=>21210, +21199=>21211, +21204=>21212, +21212=>21213, +21221=>21214, +21224=>21215, +21226=>21216, +21228=>21217, +21236=>21218, +21238=>21219, +21260=>21220, +21267=>21221, +21272=>21222, +21275=>21223, +21278=>21224, +21285=>21225, +21287=>21226, +21288=>21227, +21289=>21228, +21291=>21229, +21292=>21230, +21296=>21231, +21308=>21232, +21337=>21233, +21339=>21234, +21379=>21236, +21383=>21237, +21384=>21238, +21390=>21239, +21409=>21240, +21429=>21241, +21432=>21242, +21437=>21243, +21455=>21244, +21458=>21245, +21459=>21246, +21470=>21247, +21479=>21249, +21506=>21250, +21530=>21251, +21537=>21252, +21551=>21253, +21572=>21254, +21575=>21255, +21583=>21256, +21598=>21257, +21604=>21258, +21607=>21259, +21609=>21260, +21613=>21261, +21614=>21262, +21633=>21263, +21635=>21264, +21637=>21265, +21641=>21266, +21649=>21267, +21663=>21268, +21706=>21269, +21728=>21270, +21750=>21271, +21758=>21272, +21772=>21273, +21773=>21274, +21810=>21275, +21819=>21276, +21821=>21277, +21833=>21278, +21837=>21279, +21848=>21280, +21850=>21281, +21851=>21282, +21887=>21283, +21907=>21284, +21911=>21285, +21923=>21286, +21953=>21287, +21963=>21288, +21975=>21289, +21976=>21290, +21982=>21291, +22015=>21292, +22026=>21294, +22041=>21295, +22067=>21296, +22076=>21297, +22081=>21298, +22083=>21299, +22084=>21300, +22086=>21301, +22113=>21302, +22114=>21303, +22115=>21304, +22133=>21305, +22148=>21306, +22155=>21307, +22183=>21308, +22187=>21309, +22206=>21310, +22219=>21311, +22224=>21312, +22236=>21313, +22245=>21314, +22246=>21315, +22247=>21316, +22273=>21317, +22274=>21318, +22289=>21319, +22304=>21320, +22306=>21321, +22308=>21322, +22309=>21323, +22314=>21324, +22335=>21325, +22354=>21326, +22370=>21327, +22375=>21328, +22382=>21329, +22385=>21330, +22393=>21331, +22398=>21332, +22401=>21333, +22420=>21334, +22425=>21335, +22431=>21336, +22433=>21337, +22421=>21338, +22439=>21339, +22441=>21340, +22461=>21341, +22493=>21342, +22505=>21343, +22526=>21344, +22531=>21345, +22536=>21346, +22497=>21347, +22540=>21348, +22555=>21349, +22559=>21350, +22573=>21351, +22591=>21352, +22608=>21353, +22613=>21354, +22632=>21355, +22648=>21356, +22663=>21357, +22664=>21358, +22668=>21359, +22678=>21360, +22688=>21361, +22689=>21362, +22690=>21363, +22694=>21364, +22724=>21365, +22722=>21366, +22728=>21367, +22742=>21368, +22749=>21369, +22753=>21370, +22802=>21372, +22803=>21373, +22813=>21374, +22817=>21375, +22824=>21376, +22832=>21377, +22835=>21378, +22837=>21379, +22838=>21380, +22847=>21381, +22851=>21382, +22866=>21383, +22878=>21384, +22891=>21385, +22895=>21386, +22898=>21387, +22907=>21388, +22924=>21389, +22926=>21390, +22933=>21391, +22951=>21392, +22957=>21393, +22960=>21394, +22967=>21395, +22977=>21396, +22980=>21397, +23023=>21398, +23026=>21399, +23028=>21400, +23031=>21401, +23040=>21402, +23054=>21403, +23058=>21404, +23070=>21405, +23076=>21406, +23080=>21407, +23082=>21408, +23088=>21409, +23108=>21410, +23109=>21411, +23112=>21412, +23116=>21413, +23120=>21414, +23134=>21415, +23163=>21416, +23184=>21417, +23187=>21418, +23190=>21419, +23193=>21420, +23227=>21421, +23238=>21422, +23240=>21423, +23247=>21424, +23293=>21425, +23297=>21426, +23371=>21427, +23390=>21428, +23406=>21429, +23430=>21430, +23438=>21431, +23440=>21432, +23441=>21433, +23444=>21434, +23464=>21435, +23465=>21436, +23469=>21437, +23471=>21438, +23473=>21439, +23474=>21440, +23482=>21441, +23484=>21442, +23489=>21443, +23501=>21444, +23503=>21445, +23513=>21446, +23514=>21447, +23535=>21448, +23540=>21449, +23564=>21450, +23575=>21451, +23590=>21452, +23598=>21453, +23602=>21454, +23605=>21455, +23642=>21456, +23668=>21457, +23669=>21458, +23675=>21459, +23677=>21460, +23687=>21461, +23698=>21462, +23709=>21463, +23730=>21464, +23732=>21465, +23767=>21466, +23790=>21467, +23793=>21468, +23794=>21469, +23826=>21470, +23843=>21471, +23871=>21472, +23880=>21473, +23893=>21474, +23889=>21475, +23903=>21476, +23904=>21477, +23906=>21478, +23908=>21479, +23929=>21480, +23930=>21481, +23935=>21482, +23946=>21483, +23955=>21484, +23957=>21485, +23963=>21486, +23967=>21487, +23979=>21488, +24003=>21489, +24014=>21490, +24025=>21491, +24071=>21492, +24077=>21493, +24096=>21494, +24139=>21495, +24144=>21496, +24145=>21497, +24156=>21498, +24176=>21499, +24206=>21500, +24226=>21501, +24228=>21502, +24241=>21503, +24268=>21504, +24270=>21505, +24284=>21506, +24286=>21507, +24293=>21508, +24299=>21509, +24326=>21510, +24345=>21511, +24356=>21512, +24363=>21513, +24364=>21514, +24366=>21515, +24368=>21516, +24383=>21517, +24388=>21518, +24411=>21519, +24416=>21520, +24431=>21521, +24436=>21522, +24437=>21523, +24440=>21524, +24442=>21525, +24461=>21526, +24470=>21527, +24477=>21528, +24491=>21529, +24496=>21530, +24497=>21531, +24520=>21532, +24528=>21533, +24529=>21534, +24552=>21535, +24556=>21536, +24562=>21537, +24566=>21538, +24570=>21539, +24586=>21540, +24595=>21541, +24607=>21542, +24621=>21543, +24640=>21544, +24648=>21545, +24657=>21546, +24662=>21547, +24663=>21548, +24689=>21549, +24702=>21550, +24706=>21551, +24710=>21552, +24712=>21553, +24718=>21554, +24721=>21555, +24723=>21556, +24728=>21557, +24738=>21559, +24741=>21560, +24759=>21561, +24770=>21562, +24777=>21563, +24778=>21564, +24782=>21565, +24783=>21566, +24802=>21567, +24805=>21568, +24828=>21569, +24834=>21570, +24839=>21571, +24844=>21572, +24855=>21573, +24866=>21574, +24881=>21575, +24885=>21576, +24889=>21577, +24901=>21578, +24905=>21579, +24940=>21580, +24946=>21581, +24952=>21582, +24960=>21583, +24961=>21584, +24963=>21585, +24964=>21586, +24971=>21587, +24988=>21588, +24992=>21589, +25002=>21590, +25024=>21591, +25025=>21592, +25038=>21593, +25039=>21594, +25054=>21595, +25057=>21596, +25063=>21597, +25065=>21598, +25068=>21599, +25069=>21600, +25071=>21601, +25089=>21602, +25091=>21603, +25116=>21604, +25120=>21605, +25127=>21606, +25131=>21607, +25154=>21608, +25156=>21609, +25168=>21610, +25172=>21611, +25180=>21612, +25213=>21613, +25229=>21614, +25230=>21615, +25231=>21616, +25267=>21617, +25270=>21618, +25271=>21619, +25274=>21620, +25278=>21621, +25279=>21622, +25294=>21623, +25322=>21624, +25330=>21625, +25348=>21626, +25355=>21627, +25363=>21628, +25385=>21629, +25389=>21630, +25418=>21631, +25426=>21632, +25428=>21633, +25432=>21634, +25435=>21635, +25446=>21636, +25453=>21637, +25464=>21638, +25493=>21639, +25498=>21640, +25508=>21641, +25510=>21642, +25517=>21643, +25537=>21644, +25541=>21645, +25544=>21646, +25550=>21647, +25555=>21648, +25587=>21649, +25610=>21650, +25648=>21651, +25675=>21652, +25679=>21653, +25683=>21654, +25692=>21655, +25697=>21656, +25699=>21657, +25733=>21658, +25743=>21659, +25755=>21660, +25761=>21661, +25763=>21662, +25766=>21663, +25768=>21664, +25789=>21665, +25801=>21666, +25809=>21667, +25833=>21668, +25834=>21669, +25845=>21670, +25857=>21671, +25864=>21672, +25865=>21673, +25866=>21674, +25875=>21675, +25894=>21676, +25905=>21677, +25914=>21678, +25916=>21679, +25917=>21680, +25923=>21681, +25936=>21682, +25938=>21683, +25951=>21684, +25981=>21685, +26008=>21686, +26016=>21687, +26019=>21688, +26022=>21689, +26030=>21690, +26035=>21691, +26070=>21692, +26072=>21693, +26100=>21695, +26101=>21696, +26110=>21697, +26111=>21698, +26125=>21699, +26129=>21700, +26130=>21701, +26134=>21702, +26141=>21703, +26147=>21704, +26150=>21705, +26153=>21706, +26169=>21707, +26167=>21708, +26176=>21709, +26182=>21710, +26186=>21711, +26200=>21712, +26208=>21713, +26229=>21714, +26239=>21715, +26233=>21716, +26236=>21717, +26266=>21718, +26267=>21719, +26268=>21720, +26271=>21721, +26306=>21723, +26307=>21724, +26316=>21725, +26318=>21726, +26324=>21727, +26335=>21728, +26347=>21729, +26350=>21730, +26375=>21731, +26396=>21732, +26400=>21733, +26402=>21734, +26430=>21735, +26437=>21736, +26476=>21737, +26500=>21738, +26510=>21739, +26518=>21740, +26521=>21741, +26556=>21742, +26557=>21743, +26562=>21744, +26565=>21745, +26569=>21746, +26588=>21747, +26593=>21748, +26598=>21749, +26610=>21750, +26614=>21751, +26644=>21752, +26649=>21753, +26663=>21754, +26671=>21755, +26687=>21756, +26698=>21757, +26712=>21758, +26735=>21759, +26736=>21760, +26737=>21761, +26745=>21762, +26747=>21763, +26760=>21764, +26785=>21765, +26793=>21766, +26798=>21767, +26833=>21768, +26835=>21769, +26844=>21770, +26845=>21771, +26858=>21772, +26870=>21773, +26877=>21774, +26886=>21775, +26889=>21776, +26896=>21777, +26902=>21778, +26929=>21779, +26949=>21780, +26958=>21781, +26982=>21782, +26992=>21783, +26993=>21784, +27003=>21785, +27021=>21786, +27041=>21787, +27064=>21788, +27077=>21789, +27080=>21790, +27136=>21792, +27139=>21793, +27168=>21794, +27172=>21795, +27191=>21796, +27242=>21798, +27265=>21799, +27270=>21800, +27271=>21801, +27291=>21802, +27312=>21803, +27313=>21804, +27316=>21805, +27326=>21806, +27327=>21807, +27340=>21808, +27349=>21809, +27350=>21810, +27376=>21811, +27388=>21812, +27394=>21813, +27398=>21814, +27399=>21815, +27401=>21816, +27432=>21817, +27435=>21818, +27446=>21819, +27469=>21820, +27474=>21821, +27485=>21822, +27499=>21823, +27502=>21824, +27504=>21825, +27525=>21826, +27543=>21827, +27551=>21828, +27552=>21829, +27554=>21830, +27555=>21831, +27560=>21832, +27564=>21833, +27576=>21834, +27577=>21835, +27587=>21836, +27588=>21837, +27619=>21838, +27666=>21839, +27673=>21840, +27679=>21841, +27686=>21842, +27687=>21843, +27688=>21844, +27694=>21845, +27707=>21846, +27723=>21847, +27727=>21848, +27755=>21849, +27768=>21850, +27783=>21851, +27807=>21852, +27824=>21853, +27826=>21854, +27853=>21855, +27855=>21856, +27857=>21857, +27879=>21858, +27890=>21859, +27892=>21860, +27911=>21861, +27919=>21862, +27923=>21863, +27930=>21864, +27944=>21865, +27999=>21866, +28007=>21867, +28050=>21868, +28055=>21869, +28087=>21870, +28093=>21871, +28128=>21872, +28130=>21873, +28133=>21874, +28143=>21875, +28148=>21876, +28160=>21877, +28164=>21878, +28219=>21879, +28242=>21880, +28253=>21881, +28258=>21882, +28264=>21883, +28301=>21884, +28313=>21885, +28320=>21886, +28333=>21887, +28334=>21888, +28339=>21889, +28347=>21890, +28352=>21891, +28360=>21892, +28365=>21893, +28367=>21894, +28397=>21895, +28398=>21896, +28420=>21897, +28424=>21898, +28429=>21899, +28438=>21900, +28443=>21901, +28475=>21902, +28461=>21903, +28495=>21904, +28499=>21905, +28509=>21906, +28524=>21907, +28547=>21908, +28563=>21909, +28582=>21910, +28592=>21911, +28613=>21912, +28648=>21913, +28669=>21914, +28695=>21915, +28719=>21916, +28724=>21917, +28727=>21918, +28740=>21919, +28744=>21920, +28757=>21921, +28820=>21922, +28822=>21923, +28827=>21924, +28852=>21925, +28922=>21926, +28933=>21927, +28939=>21928, +28973=>21929, +28984=>21930, +28993=>21931, +29003=>21932, +29015=>21934, +29018=>21935, +29068=>21936, +29082=>21937, +29104=>21938, +29119=>21939, +29120=>21940, +29132=>21941, +29146=>21942, +29176=>21943, +29192=>21944, +29193=>21945, +29203=>21946, +29210=>21947, +29220=>21948, +29231=>21949, +29253=>21950, +29262=>21951, +29278=>21952, +29291=>21953, +29297=>21954, +29307=>21955, +29308=>21956, +29321=>21957, +29331=>21958, +29352=>21959, +29397=>21960, +29398=>21961, +29400=>21962, +29407=>21963, +29438=>21964, +29453=>21965, +29459=>21966, +29490=>21967, +29493=>21968, +29526=>21969, +29533=>21970, +29534=>21971, +29535=>21972, +29536=>21973, +29545=>21974, +29561=>21975, +29568=>21976, +29582=>21977, +29584=>21978, +29587=>21979, +29591=>21980, +29610=>21981, +29613=>21982, +29638=>21983, +29644=>21984, +29651=>21985, +29661=>21986, +29670=>21987, +29687=>21988, +29691=>21989, +29695=>21990, +29696=>21991, +29713=>21992, +29741=>21993, +29799=>21994, +29800=>21995, +29806=>21996, +29839=>21997, +29841=>21998, +29850=>21999, +29870=>22000, +29873=>22001, +29874=>22002, +29900=>22003, +29904=>22004, +29907=>22005, +29915=>22007, +29928=>22008, +29930=>22009, +29948=>22011, +29958=>22012, +29970=>22013, +29991=>22014, +29993=>22015, +30006=>22016, +30009=>22017, +30019=>22018, +30023=>22019, +30039=>22020, +30047=>22021, +30049=>22022, +30075=>22023, +30076=>22024, +30085=>22025, +30101=>22026, +30108=>22027, +30138=>22028, +30226=>22029, +30243=>22030, +30249=>22031, +30265=>22032, +30266=>22033, +30272=>22034, +30276=>22035, +30297=>22036, +30341=>22037, +30348=>22038, +30349=>22039, +30367=>22040, +30370=>22041, +30371=>22042, +30401=>22043, +30411=>22044, +30432=>22046, +30454=>22047, +30470=>22048, +30482=>22049, +30484=>22050, +30485=>22051, +30492=>22052, +30510=>22053, +30525=>22054, +30530=>22055, +30546=>22056, +30550=>22057, +30551=>22058, +30576=>22059, +30579=>22060, +30580=>22061, +30638=>22064, +30641=>22065, +30645=>22066, +30659=>22067, +30674=>22068, +30677=>22069, +30712=>22070, +30734=>22071, +30737=>22072, +30749=>22073, +30755=>22074, +30788=>22075, +30792=>22076, +30796=>22077, +30802=>22078, +30814=>22079, +30816=>22080, +30817=>22081, +30819=>22082, +30863=>22083, +30888=>22084, +30892=>22085, +30898=>22086, +30909=>22087, +30911=>22088, +30919=>22089, +30930=>22090, +30934=>22091, +30939=>22092, +30943=>22093, +30954=>22094, +30963=>22095, +30966=>22096, +30975=>22097, +30982=>22098, +31002=>22099, +31006=>22100, +31008=>22101, +31017=>22102, +31021=>22103, +31029=>22104, +31044=>22105, +31051=>22106, +31055=>22107, +31057=>22108, +31081=>22109, +31099=>22110, +31102=>22111, +31116=>22112, +31121=>22113, +31123=>22114, +31132=>22115, +31144=>22116, +31151=>22117, +31183=>22118, +31197=>22119, +31200=>22120, +31202=>22121, +31205=>22122, +31217=>22123, +31224=>22124, +31228=>22125, +31239=>22126, +31265=>22127, +31271=>22128, +31275=>22129, +31279=>22130, +31284=>22131, +31285=>22132, +31304=>22133, +31317=>22134, +31333=>22135, +31358=>22136, +31371=>22137, +31377=>22138, +31390=>22139, +31433=>22140, +31451=>22141, +31465=>22142, +31468=>22143, +31473=>22144, +31483=>22145, +31519=>22146, +31523=>22147, +31529=>22148, +31536=>22149, +31540=>22150, +31551=>22151, +31552=>22152, +31594=>22153, +31620=>22154, +31625=>22155, +31630=>22156, +31638=>22157, +31653=>22158, +31666=>22159, +31670=>22160, +31674=>22161, +31675=>22162, +31677=>22163, +31682=>22164, +31688=>22165, +31707=>22166, +31732=>22167, +31733=>22168, +31737=>22169, +31738=>22170, +31746=>22171, +31748=>22172, +31750=>22173, +31756=>22174, +31769=>22175, +31771=>22176, +31781=>22177, +31788=>22178, +31796=>22179, +31801=>22180, +31802=>22181, +31814=>22182, +31829=>22183, +31834=>22184, +31843=>22185, +31868=>22187, +31878=>22188, +31920=>22189, +31931=>22190, +31951=>22191, +31956=>22192, +31977=>22193, +32015=>22194, +32017=>22195, +32022=>22196, +32038=>22197, +32042=>22198, +32045=>22199, +32081=>22200, +32087=>22201, +32101=>22202, +32103=>22203, +32120=>22204, +32123=>22205, +32129=>22206, +32150=>22207, +32195=>22208, +32196=>22209, +32197=>22210, +32198=>22211, +32205=>22212, +32206=>22213, +32256=>22214, +32226=>22215, +32234=>22216, +32237=>22217, +32250=>22218, +32284=>22219, +32301=>22220, +32307=>22221, +32319=>22222, +32334=>22223, +32336=>22224, +32344=>22225, +32351=>22226, +32357=>22227, +32405=>22228, +32413=>22229, +32414=>22230, +32575=>22231, +32604=>22232, +32614=>22233, +32653=>22235, +32655=>22236, +32678=>22237, +32682=>22238, +32692=>22239, +32700=>22240, +32704=>22241, +32712=>22242, +32744=>22243, +32783=>22244, +32787=>22245, +32797=>22246, +32799=>22247, +32800=>22248, +32814=>22249, +32820=>22250, +32830=>22251, +32832=>22252, +32836=>22253, +32868=>22254, +32877=>22255, +32897=>22256, +32953=>22257, +32968=>22258, +32973=>22259, +32978=>22260, +33006=>22261, +33010=>22262, +33014=>22263, +33017=>22264, +33035=>22265, +33052=>22266, +33056=>22267, +33084=>22268, +33093=>22269, +33095=>22270, +33106=>22271, +33121=>22272, +33143=>22273, +33158=>22274, +33166=>22275, +33174=>22276, +33186=>22277, +33198=>22278, +33221=>22279, +33230=>22280, +33259=>22281, +33264=>22282, +33265=>22283, +33266=>22284, +33269=>22285, +33272=>22286, +33295=>22288, +33309=>22289, +33320=>22290, +33347=>22291, +33358=>22292, +33361=>22293, +33366=>22294, +33383=>22295, +33403=>22296, +33408=>22297, +33409=>22298, +33415=>22299, +33428=>22300, +33430=>22301, +33432=>22302, +33434=>22303, +33435=>22304, +33440=>22305, +33498=>22306, +33504=>22307, +33508=>22308, +33517=>22309, +33546=>22310, +33547=>22311, +33566=>22312, +33567=>22313, +33569=>22314, +33580=>22315, +33582=>22316, +33587=>22317, +33591=>22318, +33597=>22319, +33602=>22320, +33613=>22321, +33614=>22322, +33648=>22323, +33664=>22324, +33666=>22325, +33668=>22326, +33689=>22327, +33692=>22328, +33702=>22329, +33708=>22330, +33726=>22331, +33619=>22332, +33768=>22333, +33817=>22334, +33709=>22335, +33839=>22336, +33861=>22337, +33863=>22338, +33869=>22339, +33878=>22340, +33888=>22342, +33892=>22343, +33895=>22344, +33898=>22345, +33908=>22346, +33917=>22347, +33938=>22348, +33941=>22349, +33961=>22350, +33962=>22351, +33991=>22352, +33992=>22353, +33996=>22354, +34034=>22355, +34039=>22356, +34050=>22357, +34051=>22358, +34055=>22359, +34062=>22360, +34064=>22361, +34076=>22362, +34082=>22363, +34087=>22364, +34090=>22365, +34099=>22366, +34102=>22367, +34111=>22368, +34128=>22369, +34130=>22370, +34140=>22371, +34143=>22373, +34144=>22374, +34169=>22375, +34185=>22376, +34187=>22377, +34208=>22378, +34213=>22379, +34215=>22380, +34228=>22381, +34230=>22382, +34232=>22383, +34237=>22384, +34238=>22385, +34239=>22386, +34242=>22387, +34266=>22388, +34272=>22389, +34280=>22390, +34291=>22391, +34300=>22392, +34317=>22393, +34318=>22394, +34329=>22395, +34331=>22396, +34358=>22397, +34362=>22398, +34365=>22399, +34392=>22400, +34393=>22401, +34397=>22402, +34400=>22403, +34401=>22404, +34404=>22405, +34409=>22406, +34422=>22407, +34454=>22408, +34458=>22409, +34465=>22410, +34470=>22411, +34477=>22412, +34484=>22413, +34485=>22414, +34487=>22415, +34489=>22416, +34495=>22417, +34501=>22418, +34514=>22419, +34522=>22420, +34524=>22421, +34528=>22422, +34533=>22423, +34535=>22424, +34440=>22425, +34564=>22426, +34575=>22427, +34607=>22428, +34610=>22429, +34620=>22430, +34621=>22431, +34629=>22432, +34637=>22433, +34657=>22434, +34671=>22435, +34691=>22436, +34692=>22437, +34693=>22438, +34694=>22439, +34704=>22440, +34709=>22441, +34737=>22443, +34760=>22444, +34762=>22445, +34773=>22446, +34777=>22447, +34780=>22448, +34786=>22449, +34788=>22450, +34801=>22451, +34803=>22452, +34808=>22453, +34810=>22454, +34815=>22455, +34825=>22456, +34841=>22457, +34834=>22458, +34842=>22459, +34846=>22460, +34864=>22461, +34869=>22462, +34881=>22463, +34883=>22464, +34888=>22465, +34889=>22466, +34897=>22468, +34908=>22469, +34912=>22470, +34929=>22471, +34937=>22472, +34939=>22473, +34944=>22474, +34975=>22475, +34984=>22476, +35002=>22477, +35019=>22478, +35020=>22479, +35038=>22480, +35047=>22481, +35063=>22482, +35085=>22483, +35093=>22484, +35094=>22485, +35104=>22486, +35112=>22487, +35121=>22488, +35130=>22489, +35142=>22490, +35151=>22491, +35154=>22492, +35159=>22493, +35163=>22494, +35169=>22495, +35171=>22496, +35182=>22497, +35187=>22498, +35189=>22499, +35194=>22500, +35197=>22501, +35213=>22502, +35221=>22503, +35227=>22504, +35228=>22505, +35232=>22506, +35252=>22507, +35254=>22508, +35287=>22509, +35305=>22510, +35309=>22511, +35321=>22512, +35332=>22513, +35333=>22514, +35358=>22515, +35360=>22516, +35364=>22517, +35366=>22518, +35371=>22519, +35372=>22520, +35375=>22521, +35389=>22522, +35392=>22523, +35395=>22524, +35411=>22525, +35414=>22526, +35420=>22527, +35429=>22528, +35446=>22529, +35447=>22530, +35450=>22531, +35451=>22532, +35456=>22533, +35459=>22534, +35467=>22535, +35471=>22536, +35474=>22537, +35479=>22538, +35481=>22539, +35487=>22540, +35497=>22541, +35503=>22542, +35507=>22543, +35515=>22544, +35523=>22545, +35526=>22546, +35528=>22547, +35530=>22548, +35539=>22549, +35540=>22550, +35541=>22551, +35568=>22552, +35583=>22553, +35595=>22554, +35614=>22555, +35632=>22556, +35644=>22557, +35650=>22558, +35656=>22559, +35661=>22560, +35683=>22561, +35705=>22562, +35716=>22563, +35725=>22564, +35727=>22565, +35896=>22566, +35902=>22567, +35921=>22568, +35928=>22569, +35931=>22570, +35933=>22571, +35929=>22572, +35939=>22573, +35940=>22574, +35942=>22575, +35957=>22576, +35958=>22577, +35966=>22578, +35974=>22579, +35975=>22580, +35979=>22581, +35984=>22582, +35996=>22584, +36025=>22585, +36038=>22586, +36043=>22587, +36047=>22588, +36061=>22589, +36072=>22590, +36079=>22591, +36082=>22592, +36095=>22593, +36197=>22594, +36223=>22595, +36226=>22596, +36232=>22597, +36240=>22598, +36254=>22599, +36256=>22600, +36268=>22601, +36277=>22602, +36279=>22603, +36281=>22604, +36283=>22605, +36288=>22606, +36293=>22607, +36295=>22608, +36298=>22609, +36308=>22610, +36325=>22611, +36336=>22612, +36284=>22613, +36356=>22614, +36357=>22615, +36369=>22616, +36403=>22617, +36407=>22618, +36408=>22619, +36430=>22620, +36443=>22621, +36445=>22622, +36446=>22623, +36473=>22624, +36482=>22625, +36483=>22626, +36507=>22627, +36509=>22628, +36514=>22629, +36538=>22630, +36545=>22631, +36547=>22632, +36548=>22633, +36551=>22634, +36572=>22635, +36590=>22636, +36593=>22637, +36599=>22638, +36589=>22639, +36610=>22640, +36623=>22641, +36624=>22642, +36630=>22643, +36640=>22644, +36641=>22645, +36643=>22646, +36648=>22647, +36654=>22648, +36660=>22649, +36663=>22650, +36673=>22651, +36687=>22652, +36690=>22653, +36691=>22654, +36701=>22655, +36702=>22656, +36709=>22657, +36765=>22658, +36792=>22659, +36798=>22660, +36800=>22661, +36811=>22662, +36816=>22663, +36818=>22664, +36835=>22665, +36862=>22666, +36888=>22667, +36904=>22668, +36905=>22669, +36906=>22670, +36915=>22671, +36916=>22672, +36927=>22673, +36962=>22674, +36966=>22675, +36972=>22676, +37006=>22677, +37029=>22678, +37068=>22679, +37077=>22680, +37080=>22681, +37081=>22682, +37093=>22683, +37074=>22684, +37128=>22685, +37133=>22686, +37136=>22687, +37146=>22688, +37152=>22689, +37161=>22690, +37166=>22691, +37174=>22692, +37180=>22693, +37187=>22694, +37199=>22695, +37203=>22696, +37229=>22697, +37243=>22698, +37249=>22699, +37254=>22700, +37267=>22701, +37268=>22702, +37272=>22703, +37281=>22704, +37286=>22705, +37311=>22706, +37331=>22707, +37332=>22708, +37337=>22709, +37353=>22710, +37354=>22711, +37359=>22712, +37369=>22713, +37373=>22714, +37380=>22715, +37381=>22716, +37388=>22717, +37394=>22718, +37395=>22719, +37400=>22720, +37404=>22721, +37405=>22722, +37412=>22723, +37413=>22724, +37414=>22725, +37422=>22726, +37423=>22727, +37424=>22728, +37429=>22729, +37430=>22730, +37438=>22731, +37446=>22732, +37453=>22733, +37464=>22734, +37468=>22735, +37469=>22736, +37481=>22737, +37486=>22738, +37487=>22739, +37488=>22740, +37493=>22741, +37497=>22742, +37499=>22743, +37514=>22744, +37522=>22745, +37536=>22746, +37540=>22747, +37541=>22748, +37544=>22749, +37558=>22750, +37560=>22751, +37562=>22752, +37565=>22753, +37575=>22754, +37581=>22755, +37592=>22756, +37596=>22757, +37597=>22758, +37601=>22759, +37603=>22760, +37608=>22761, +37612=>22762, +37614=>22763, +37616=>22764, +37632=>22765, +37640=>22766, +37660=>22767, +37668=>22768, +37674=>22769, +37684=>22770, +37687=>22771, +37712=>22772, +37717=>22773, +37726=>22774, +37735=>22775, +37737=>22776, +37743=>22777, +37748=>22778, +37750=>22779, +37754=>22780, +37757=>22781, +37760=>22782, +37761=>22783, +37773=>22784, +37778=>22785, +37781=>22786, +37784=>22787, +37798=>22789, +37800=>22790, +37803=>22791, +37812=>22792, +37813=>22793, +37814=>22794, +37828=>22795, +37829=>22796, +37833=>22797, +37835=>22798, +37837=>22799, +37843=>22800, +37849=>22801, +37879=>22802, +37889=>22803, +37896=>22804, +37909=>22805, +37919=>22806, +37935=>22807, +37949=>22808, +37955=>22809, +37977=>22810, +37980=>22811, +37983=>22812, +37985=>22813, +37992=>22814, +37998=>22815, +38020=>22816, +38019=>22817, +38270=>22818, +38276=>22819, +38301=>22820, +38302=>22821, +38330=>22822, +38361=>22823, +38365=>22824, +38367=>22825, +38430=>22826, +38434=>22827, +38437=>22828, +38438=>22829, +38455=>22830, +38457=>22831, +38458=>22832, +38482=>22833, +38486=>22834, +38487=>22835, +38510=>22836, +38524=>22837, +38526=>22838, +38545=>22839, +38559=>22840, +38566=>22841, +38602=>22842, +38623=>22844, +38650=>22845, +38661=>22846, +38682=>22847, +38685=>22848, +38730=>22850, +38744=>22851, +38775=>22852, +38776=>22853, +38779=>22854, +38784=>22855, +38793=>22856, +38807=>22857, +38840=>22858, +38844=>22859, +38847=>22860, +38852=>22861, +38853=>22862, +38855=>22863, +38858=>22864, +38862=>22865, +38864=>22866, +38871=>22867, +38877=>22868, +38884=>22869, +38903=>22870, +38904=>22871, +38906=>22872, +38937=>22873, +38940=>22874, +38944=>22875, +38959=>22876, +38965=>22877, +38980=>22878, +38986=>22879, +38993=>22880, +39018=>22881, +39086=>22882, +39116=>22883, +39142=>22884, +39158=>22885, +39175=>22886, +39199=>22887, +39202=>22888, +39206=>22889, +39211=>22890, +39220=>22891, +39225=>22892, +39239=>22893, +39257=>22894, +39259=>22895, +39323=>22896, +39325=>22897, +39327=>22898, +39344=>22899, +39346=>22900, +39349=>22901, +39379=>22902, +39386=>22903, +39388=>22904, +39399=>22905, +39402=>22906, +39403=>22907, +39404=>22908, +39412=>22909, +39413=>22910, +39421=>22911, +39422=>22912, +39428=>22913, +39435=>22914, +39454=>22915, +39458=>22916, +39475=>22917, +39477=>22918, +39495=>22919, +39499=>22921, +39508=>22922, +39517=>22923, +39594=>22924, +39596=>22925, +39598=>22926, +39602=>22927, +39604=>22928, +39611=>22929, +39615=>22930, +39624=>22931, +39639=>22932, +39643=>22933, +39652=>22934, +39655=>22935, +39660=>22936, +39666=>22937, +39667=>22938, +39669=>22939, +39674=>22940, +39677=>22941, +39679=>22942, +39680=>22943, +39684=>22944, +39685=>22945, +39707=>22946, +39718=>22947, +39735=>22949, +39737=>22950, +39738=>22951, +39756=>22952, +39766=>22953, +39767=>22954, +39771=>22955, +39777=>22956, +39786=>22957, +39789=>22958, +39790=>22959, +39800=>22960, +39807=>22961, +39813=>22962, +39815=>22963, +39817=>22964, +39819=>22965, +39821=>22966, +39828=>22967, +39834=>22968, +39849=>22969, +39863=>22970, +39868=>22971, +39888=>22972, +39929=>22973, +39951=>22974, +39953=>22975, +39966=>22976, +39974=>22977, +39976=>22978, +39997=>22979, +40003=>22980, +40014=>22981, +40030=>22982, +40059=>22983, +40183=>22984, +40185=>22985, +40220=>22986, +40239=>22987, +40243=>22988, +40244=>22989, +40250=>22990, +40252=>22991, +40261=>22992, +40275=>22993, +40276=>22994, +40293=>22995, +40323=>22996, +40326=>22997, +40334=>22998, +40338=>22999, +40339=>23000, +40341=>23001, +40343=>23002, +40344=>23003, +40362=>23004, +40366=>23005, +40394=>23007, +40404=>23008, +40405=>23009, +40414=>23010, +40430=>23011, +40432=>23012, +40446=>23013, +40462=>23014, +40464=>23015, +40465=>23016, +40466=>23017, +40470=>23018, +40583=>23019, +40590=>23020, +40591=>23021, +40598=>23022, +40600=>23023, +40622=>23024, +40627=>23025, +40646=>23026, +40648=>23027, +40651=>23028, +40661=>23029, +40684=>23030, +40685=>23031, +40689=>23032, +40693=>23033, +40696=>23034, +40721=>23035, +40726=>23036, +40730=>23037, +40735=>23038, +40753=>23039, +40754=>23040, +40764=>23041, +40767=>23042, +40771=>23043, +40772=>23044, +40775=>23045, +40790=>23046, +40798=>23047, +40814=>23048, +40819=>23049, +40826=>23050, +40829=>23051, +40847=>23052, +40849=>23053, +40850=>23054, +40854=>23055, +40865=>23056, +40867=>23057, +); +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/uni2cid_ak12.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/uni2cid_ak12.php new file mode 100644 index 0000000..0a5424c --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/uni2cid_ak12.php @@ -0,0 +1,17530 @@ +<?php +// unicode to cid conversion table is from +// ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/ +// cid2code.txt in ak12.tar.Z +$cidinfo['uni2cid'] = array( +32=>1, +33=>2, +34=>3, +35=>4, +36=>5, +37=>6, +38=>7, +39=>8, +40=>9, +41=>10, +42=>11, +43=>12, +44=>13, +45=>14, +46=>15, +47=>16, +48=>17, +49=>18, +50=>19, +51=>20, +52=>21, +53=>22, +54=>23, +55=>24, +56=>25, +57=>26, +58=>27, +59=>28, +60=>29, +61=>30, +62=>31, +63=>32, +64=>33, +65=>34, +66=>35, +67=>36, +68=>37, +69=>38, +70=>39, +71=>40, +72=>41, +73=>42, +74=>43, +75=>44, +76=>45, +77=>46, +78=>47, +79=>48, +80=>49, +81=>50, +82=>51, +83=>52, +84=>53, +85=>54, +86=>55, +87=>56, +88=>57, +89=>58, +90=>59, +91=>60, +92=>61, +93=>62, +94=>63, +95=>64, +96=>65, +97=>66, +98=>67, +99=>68, +100=>69, +101=>70, +102=>71, +103=>72, +104=>73, +105=>74, +106=>75, +107=>76, +108=>77, +109=>78, +110=>79, +111=>80, +112=>81, +113=>82, +114=>83, +115=>84, +116=>85, +117=>86, +118=>87, +119=>88, +120=>89, +121=>90, +122=>91, +123=>92, +124=>93, +125=>94, +126=>95, +8361=>96, +8208=>97, +169=>98, +12644=>101, +12288=>101, +12289=>102, +12290=>103, +183=>104, +12539=>104, +8229=>105, +8943=>106, +8230=>106, +168=>107, +12291=>108, +8211=>109, +8212=>110, +8214=>111, +65340=>112, +65374=>113, +8216=>114, +8217=>115, +8220=>116, +8221=>117, +12308=>118, +12309=>119, +12296=>120, +12297=>121, +12298=>122, +12299=>123, +12300=>124, +12301=>125, +12302=>126, +12303=>127, +12304=>128, +12305=>129, +177=>130, +215=>131, +247=>132, +8800=>133, +8804=>134, +8805=>135, +8734=>136, +8756=>137, +176=>138, +8242=>139, +8243=>140, +8451=>141, +8491=>142, +65504=>143, +65505=>144, +65509=>145, +9794=>146, +9792=>147, +8736=>148, +8869=>149, +8978=>150, +8706=>151, +8711=>152, +8801=>153, +8786=>154, +167=>155, +8251=>156, +9734=>157, +9733=>158, +9675=>159, +9679=>160, +9678=>161, +9671=>162, +9670=>163, +9633=>164, +9632=>165, +9651=>166, +9650=>167, +9661=>168, +9660=>169, +8594=>170, +8592=>171, +8593=>172, +8595=>173, +8596=>174, +12307=>175, +171=>176, +187=>177, +8730=>178, +8765=>179, +8733=>180, +8757=>181, +8747=>182, +8748=>183, +8712=>184, +8715=>185, +8838=>186, +8839=>187, +8834=>188, +8835=>189, +8746=>190, +8745=>191, +8743=>192, +8744=>193, +65506=>194, +8658=>195, +8660=>196, +8704=>197, +8707=>198, +180=>199, +732=>200, +711=>201, +728=>202, +733=>203, +730=>204, +729=>205, +184=>206, +731=>207, +161=>208, +191=>209, +8758=>210, +8750=>211, +8721=>212, +8719=>213, +164=>214, +8457=>215, +8240=>216, +9665=>217, +9664=>218, +9655=>219, +9654=>220, +9828=>221, +9824=>222, +9825=>223, +9829=>224, +9831=>225, +9827=>226, +9673=>227, +9672=>228, +9635=>229, +9680=>230, +9681=>231, +9618=>232, +9636=>233, +9637=>234, +9640=>235, +9639=>236, +9638=>237, +9641=>238, +9832=>239, +9743=>240, +9742=>241, +9756=>242, +9758=>243, +182=>244, +8224=>245, +8225=>246, +8597=>247, +8599=>248, +8601=>249, +8598=>250, +8600=>251, +9837=>252, +9833=>253, +9834=>254, +9836=>255, +12927=>256, +12828=>257, +8470=>258, +13255=>259, +8482=>260, +13250=>261, +13272=>262, +8481=>263, +65281=>264, +65282=>265, +65283=>266, +65284=>267, +65285=>268, +65286=>269, +65287=>270, +65288=>271, +65289=>272, +65290=>273, +65291=>274, +65292=>275, +65293=>276, +65294=>277, +65295=>278, +65296=>279, +65297=>280, +65298=>281, +65299=>282, +65300=>283, +65301=>284, +65302=>285, +65303=>286, +65304=>287, +65305=>288, +65306=>289, +65307=>290, +65308=>291, +65309=>292, +65310=>293, +65311=>294, +65312=>295, +65313=>296, +65314=>297, +65315=>298, +65316=>299, +65317=>300, +65318=>301, +65319=>302, +65320=>303, +65321=>304, +65322=>305, +65323=>306, +65324=>307, +65325=>308, +65326=>309, +65327=>310, +65328=>311, +65329=>312, +65330=>313, +65331=>314, +65332=>315, +65333=>316, +65334=>317, +65335=>318, +65336=>319, +65337=>320, +65338=>321, +65339=>322, +65510=>323, +65341=>324, +65342=>325, +65343=>326, +65344=>327, +65345=>328, +65346=>329, +65347=>330, +65348=>331, +65349=>332, +65350=>333, +65351=>334, +65352=>335, +65353=>336, +65354=>337, +65355=>338, +65356=>339, +65357=>340, +65358=>341, +65359=>342, +65360=>343, +65361=>344, +65362=>345, +65363=>346, +65364=>347, +65365=>348, +65366=>349, +65367=>350, +65368=>351, +65369=>352, +65370=>353, +65371=>354, +65372=>355, +65373=>356, +65507=>357, +12593=>358, +12594=>359, +12595=>360, +12596=>361, +12597=>362, +12598=>363, +12599=>364, +12600=>365, +12601=>366, +12602=>367, +12603=>368, +12604=>369, +12605=>370, +12606=>371, +12607=>372, +12608=>373, +12609=>374, +12610=>375, +12611=>376, +12612=>377, +12613=>378, +12614=>379, +12615=>380, +12616=>381, +12617=>382, +12618=>383, +12619=>384, +12620=>385, +12621=>386, +12622=>387, +12623=>388, +12624=>389, +12625=>390, +12626=>391, +12627=>392, +12628=>393, +12629=>394, +12630=>395, +12631=>396, +12632=>397, +12633=>398, +12634=>399, +12635=>400, +12636=>401, +12637=>402, +12638=>403, +12639=>404, +12640=>405, +12641=>406, +12642=>407, +12643=>408, +12645=>409, +12646=>410, +12647=>411, +12648=>412, +12649=>413, +12650=>414, +12651=>415, +12652=>416, +12653=>417, +12654=>418, +12655=>419, +12656=>420, +12657=>421, +12658=>422, +12659=>423, +12660=>424, +12661=>425, +12662=>426, +12663=>427, +12664=>428, +12665=>429, +12666=>430, +12667=>431, +12668=>432, +12669=>433, +12670=>434, +12671=>435, +12672=>436, +12673=>437, +12674=>438, +12675=>439, +12676=>440, +12677=>441, +12678=>442, +12679=>443, +12680=>444, +12681=>445, +12682=>446, +12683=>447, +12684=>448, +12685=>449, +12686=>450, +8560=>451, +8561=>452, +8562=>453, +8563=>454, +8564=>455, +8565=>456, +8566=>457, +8567=>458, +8568=>459, +8569=>460, +8544=>461, +8545=>462, +8546=>463, +8547=>464, +8548=>465, +8549=>466, +8550=>467, +8551=>468, +8552=>469, +8553=>470, +913=>471, +914=>472, +915=>473, +916=>474, +917=>475, +918=>476, +919=>477, +920=>478, +921=>479, +922=>480, +923=>481, +924=>482, +925=>483, +926=>484, +927=>485, +928=>486, +929=>487, +931=>488, +932=>489, +933=>490, +934=>491, +935=>492, +936=>493, +937=>494, +945=>495, +946=>496, +947=>497, +948=>498, +949=>499, +950=>500, +951=>501, +952=>502, +953=>503, +954=>504, +955=>505, +956=>506, +957=>507, +958=>508, +959=>509, +960=>510, +961=>511, +963=>512, +964=>513, +965=>514, +966=>515, +967=>516, +968=>517, +969=>518, +9472=>519, +9474=>520, +9484=>521, +9488=>522, +9496=>523, +9492=>524, +9500=>525, +9516=>526, +9508=>527, +9524=>528, +9532=>529, +9473=>530, +9475=>531, +9487=>532, +9491=>533, +9499=>534, +9495=>535, +9507=>536, +9523=>537, +9515=>538, +9531=>539, +9547=>540, +9504=>541, +9519=>542, +9512=>543, +9527=>544, +9535=>545, +9501=>546, +9520=>547, +9509=>548, +9528=>549, +9538=>550, +9490=>551, +9489=>552, +9498=>553, +9497=>554, +9494=>555, +9493=>556, +9486=>557, +9485=>558, +9502=>559, +9503=>560, +9505=>561, +9506=>562, +9510=>563, +9511=>564, +9513=>565, +9514=>566, +9517=>567, +9518=>568, +9521=>569, +9522=>570, +9525=>571, +9526=>572, +9529=>573, +9530=>574, +9533=>575, +9534=>576, +9536=>577, +9537=>578, +9539=>579, +9540=>580, +9541=>581, +9542=>582, +9543=>583, +9544=>584, +9545=>585, +9546=>586, +13205=>587, +13206=>588, +13207=>589, +8467=>590, +13208=>591, +13252=>592, +13219=>593, +13220=>594, +13221=>595, +13222=>596, +13209=>597, +13210=>598, +13211=>599, +13212=>600, +13213=>601, +13214=>602, +13215=>603, +13216=>604, +13217=>605, +13218=>606, +13258=>607, +13197=>608, +13198=>609, +13199=>610, +13263=>611, +13192=>612, +13193=>613, +13256=>614, +13223=>615, +13224=>616, +13232=>617, +13233=>618, +13234=>619, +13235=>620, +13236=>621, +13237=>622, +13238=>623, +13239=>624, +13240=>625, +13241=>626, +13184=>627, +13185=>628, +13186=>629, +13187=>630, +13188=>631, +13242=>632, +13243=>633, +13244=>634, +13245=>635, +13246=>636, +13247=>637, +13200=>638, +13201=>639, +13202=>640, +13203=>641, +13204=>642, +8486=>643, +13248=>644, +13249=>645, +13194=>646, +13195=>647, +13196=>648, +13270=>649, +13253=>650, +13229=>651, +13230=>652, +13231=>653, +13275=>654, +13225=>655, +13226=>656, +13227=>657, +13228=>658, +13277=>659, +13264=>660, +13267=>661, +13251=>662, +13257=>663, +13276=>664, +13254=>665, +198=>666, +208=>667, +170=>668, +294=>669, +306=>670, +319=>671, +321=>672, +216=>673, +338=>674, +186=>675, +222=>676, +358=>677, +330=>678, +12896=>679, +12897=>680, +12898=>681, +12899=>682, +12900=>683, +12901=>684, +12902=>685, +12903=>686, +12904=>687, +12905=>688, +12906=>689, +12907=>690, +12908=>691, +12909=>692, +12910=>693, +12911=>694, +12912=>695, +12913=>696, +12914=>697, +12915=>698, +12916=>699, +12917=>700, +12918=>701, +12919=>702, +12920=>703, +12921=>704, +12922=>705, +12923=>706, +9424=>707, +9425=>708, +9426=>709, +9427=>710, +9428=>711, +9429=>712, +9430=>713, +9431=>714, +9432=>715, +9433=>716, +9434=>717, +9435=>718, +9436=>719, +9437=>720, +9438=>721, +9439=>722, +9440=>723, +9441=>724, +9442=>725, +9443=>726, +9444=>727, +9445=>728, +9446=>729, +9447=>730, +9448=>731, +9449=>732, +9312=>733, +9313=>734, +9314=>735, +9315=>736, +9316=>737, +9317=>738, +9318=>739, +9319=>740, +9320=>741, +9321=>742, +9322=>743, +9323=>744, +9324=>745, +9325=>746, +9326=>747, +189=>748, +8531=>749, +8532=>750, +188=>751, +190=>752, +8539=>753, +8540=>754, +8541=>755, +8542=>756, +230=>757, +273=>758, +240=>759, +295=>760, +305=>761, +307=>762, +312=>763, +320=>764, +322=>765, +248=>766, +339=>767, +223=>768, +254=>769, +359=>770, +331=>771, +329=>772, +12800=>773, +12801=>774, +12802=>775, +12803=>776, +12804=>777, +12805=>778, +12806=>779, +12807=>780, +12808=>781, +12809=>782, +12810=>783, +12811=>784, +12812=>785, +12813=>786, +12814=>787, +12815=>788, +12816=>789, +12817=>790, +12818=>791, +12819=>792, +12820=>793, +12821=>794, +12822=>795, +12823=>796, +12824=>797, +12825=>798, +12826=>799, +12827=>800, +9372=>801, +9373=>802, +9374=>803, +9375=>804, +9376=>805, +9377=>806, +9378=>807, +9379=>808, +9380=>809, +9381=>810, +9382=>811, +9383=>812, +9384=>813, +9385=>814, +9386=>815, +9387=>816, +9388=>817, +9389=>818, +9390=>819, +9391=>820, +9392=>821, +9393=>822, +9394=>823, +9395=>824, +9396=>825, +9397=>826, +9332=>827, +9333=>828, +9334=>829, +9335=>830, +9336=>831, +9337=>832, +9338=>833, +9339=>834, +9340=>835, +9341=>836, +9342=>837, +9343=>838, +9344=>839, +9345=>840, +9346=>841, +185=>842, +178=>843, +179=>844, +8308=>845, +8319=>846, +8321=>847, +8322=>848, +8323=>849, +8324=>850, +12353=>851, +12354=>852, +12355=>853, +12356=>854, +12357=>855, +12358=>856, +12359=>857, +12360=>858, +12361=>859, +12362=>860, +12363=>861, +12364=>862, +12365=>863, +12366=>864, +12367=>865, +12368=>866, +12369=>867, +12370=>868, +12371=>869, +12372=>870, +12373=>871, +12374=>872, +12375=>873, +12376=>874, +12377=>875, +12378=>876, +12379=>877, +12380=>878, +12381=>879, +12382=>880, +12383=>881, +12384=>882, +12385=>883, +12386=>884, +12387=>885, +12388=>886, +12389=>887, +12390=>888, +12391=>889, +12392=>890, +12393=>891, +12394=>892, +12395=>893, +12396=>894, +12397=>895, +12398=>896, +12399=>897, +12400=>898, +12401=>899, +12402=>900, +12403=>901, +12404=>902, +12405=>903, +12406=>904, +12407=>905, +12408=>906, +12409=>907, +12410=>908, +12411=>909, +12412=>910, +12413=>911, +12414=>912, +12415=>913, +12416=>914, +12417=>915, +12418=>916, +12419=>917, +12420=>918, +12421=>919, +12422=>920, +12423=>921, +12424=>922, +12425=>923, +12426=>924, +12427=>925, +12428=>926, +12429=>927, +12430=>928, +12431=>929, +12432=>930, +12433=>931, +12434=>932, +12435=>933, +12449=>934, +12450=>935, +12451=>936, +12452=>937, +12453=>938, +12454=>939, +12455=>940, +12456=>941, +12457=>942, +12458=>943, +12459=>944, +12460=>945, +12461=>946, +12462=>947, +12463=>948, +12464=>949, +12465=>950, +12466=>951, +12467=>952, +12468=>953, +12469=>954, +12470=>955, +12471=>956, +12472=>957, +12473=>958, +12474=>959, +12475=>960, +12476=>961, +12477=>962, +12478=>963, +12479=>964, +12480=>965, +12481=>966, +12482=>967, +12483=>968, +12484=>969, +12485=>970, +12486=>971, +12487=>972, +12488=>973, +12489=>974, +12490=>975, +12491=>976, +12492=>977, +12493=>978, +12494=>979, +12495=>980, +12496=>981, +12497=>982, +12498=>983, +12499=>984, +12500=>985, +12501=>986, +12502=>987, +12503=>988, +12504=>989, +12505=>990, +12506=>991, +12507=>992, +12508=>993, +12509=>994, +12510=>995, +12511=>996, +12512=>997, +12513=>998, +12514=>999, +12515=>1000, +12516=>1001, +12517=>1002, +12518=>1003, +12519=>1004, +12520=>1005, +12521=>1006, +12522=>1007, +12523=>1008, +12524=>1009, +12525=>1010, +12526=>1011, +12527=>1012, +12528=>1013, +12529=>1014, +12530=>1015, +12531=>1016, +12532=>1017, +12533=>1018, +12534=>1019, +1040=>1020, +1041=>1021, +1042=>1022, +1043=>1023, +1044=>1024, +1045=>1025, +1025=>1026, +1046=>1027, +1047=>1028, +1048=>1029, +1049=>1030, +1050=>1031, +1051=>1032, +1052=>1033, +1053=>1034, +1054=>1035, +1055=>1036, +1056=>1037, +1057=>1038, +1058=>1039, +1059=>1040, +1060=>1041, +1061=>1042, +1062=>1043, +1063=>1044, +1064=>1045, +1065=>1046, +1066=>1047, +1067=>1048, +1068=>1049, +1069=>1050, +1070=>1051, +1071=>1052, +1072=>1053, +1073=>1054, +1074=>1055, +1075=>1056, +1076=>1057, +1077=>1058, +1105=>1059, +1078=>1060, +1079=>1061, +1080=>1062, +1081=>1063, +1082=>1064, +1083=>1065, +1084=>1066, +1085=>1067, +1086=>1068, +1087=>1069, +1088=>1070, +1089=>1071, +1090=>1072, +1091=>1073, +1092=>1074, +1093=>1075, +1094=>1076, +1095=>1077, +1096=>1078, +1097=>1079, +1098=>1080, +1099=>1081, +1100=>1082, +1101=>1083, +1102=>1084, +1103=>1085, +44032=>1086, +44033=>1087, +44036=>1088, +44039=>1089, +44040=>1090, +44041=>1091, +44042=>1092, +44048=>1093, +44049=>1094, +44050=>1095, +44051=>1096, +44052=>1097, +44053=>1098, +44054=>1099, +44055=>1100, +44057=>1101, +44058=>1102, +44059=>1103, +44060=>1104, +44061=>1105, +44064=>1106, +44068=>1107, +44076=>1108, +44077=>1109, +44079=>1110, +44080=>1111, +44081=>1112, +44088=>1113, +44089=>1114, +44092=>1115, +44096=>1116, +44107=>1117, +44109=>1118, +44116=>1119, +44120=>1120, +44124=>1121, +44144=>1122, +44145=>1123, +44148=>1124, +44151=>1125, +44152=>1126, +44154=>1127, +44160=>1128, +44161=>1129, +44163=>1130, +44164=>1131, +44165=>1132, +44166=>1133, +44169=>1134, +44170=>1135, +44171=>1136, +44172=>1137, +44176=>1138, +44180=>1139, +44188=>1140, +44189=>1141, +44191=>1142, +44192=>1143, +44193=>1144, +44200=>1145, +44201=>1146, +44202=>1147, +44204=>1148, +44207=>1149, +44208=>1150, +44216=>1151, +44217=>1152, +44219=>1153, +44220=>1154, +44221=>1155, +44225=>1156, +44228=>1157, +44232=>1158, +44236=>1159, +44245=>1160, +44247=>1161, +44256=>1162, +44257=>1163, +44260=>1164, +44263=>1165, +44264=>1166, +44266=>1167, +44268=>1168, +44271=>1169, +44272=>1170, +44273=>1171, +44275=>1172, +44277=>1173, +44278=>1174, +44284=>1175, +44285=>1176, +44288=>1177, +44292=>1178, +44294=>1179, +44300=>1180, +44301=>1181, +44303=>1182, +44305=>1183, +44312=>1184, +44316=>1185, +44320=>1186, +44329=>1187, +44332=>1188, +44333=>1189, +44340=>1190, +44341=>1191, +44344=>1192, +44348=>1193, +44356=>1194, +44357=>1195, +44359=>1196, +44361=>1197, +44368=>1198, +44372=>1199, +44376=>1200, +44385=>1201, +44387=>1202, +44396=>1203, +44397=>1204, +44400=>1205, +44403=>1206, +44404=>1207, +44405=>1208, +44406=>1209, +44411=>1210, +44412=>1211, +44413=>1212, +44415=>1213, +44417=>1214, +44418=>1215, +44424=>1216, +44425=>1217, +44428=>1218, +44432=>1219, +44444=>1220, +44445=>1221, +44452=>1222, +44471=>1223, +44480=>1224, +44481=>1225, +44484=>1226, +44488=>1227, +44496=>1228, +44497=>1229, +44499=>1230, +44508=>1231, +44512=>1232, +44516=>1233, +44536=>1234, +44537=>1235, +44540=>1236, +44543=>1237, +44544=>1238, +44545=>1239, +44552=>1240, +44553=>1241, +44555=>1242, +44557=>1243, +44564=>1244, +44592=>1245, +44593=>1246, +44596=>1247, +44599=>1248, +44600=>1249, +44602=>1250, +44608=>1251, +44609=>1252, +44611=>1253, +44613=>1254, +44614=>1255, +44618=>1256, +44620=>1257, +44621=>1258, +44622=>1259, +44624=>1260, +44628=>1261, +44630=>1262, +44636=>1263, +44637=>1264, +44639=>1265, +44640=>1266, +44641=>1267, +44645=>1268, +44648=>1269, +44649=>1270, +44652=>1271, +44656=>1272, +44664=>1273, +44665=>1274, +44667=>1275, +44668=>1276, +44669=>1277, +44676=>1278, +44677=>1279, +44684=>1280, +44732=>1281, +44733=>1282, +44734=>1283, +44736=>1284, +44740=>1285, +44748=>1286, +44749=>1287, +44751=>1288, +44752=>1289, +44753=>1290, +44760=>1291, +44761=>1292, +44764=>1293, +44776=>1294, +44779=>1295, +44781=>1296, +44788=>1297, +44792=>1298, +44796=>1299, +44807=>1300, +44808=>1301, +44813=>1302, +44816=>1303, +44844=>1304, +44845=>1305, +44848=>1306, +44850=>1307, +44852=>1308, +44860=>1309, +44861=>1310, +44863=>1311, +44865=>1312, +44866=>1313, +44867=>1314, +44872=>1315, +44873=>1316, +44880=>1317, +44892=>1318, +44893=>1319, +44900=>1320, +44901=>1321, +44921=>1322, +44928=>1323, +44932=>1324, +44936=>1325, +44944=>1326, +44945=>1327, +44949=>1328, +44956=>1329, +44984=>1330, +44985=>1331, +44988=>1332, +44992=>1333, +44999=>1334, +45000=>1335, +45001=>1336, +45003=>1337, +45005=>1338, +45006=>1339, +45012=>1340, +45020=>1341, +45032=>1342, +45033=>1343, +45040=>1344, +45041=>1345, +45044=>1346, +45048=>1347, +45056=>1348, +45057=>1349, +45060=>1350, +45068=>1351, +45072=>1352, +45076=>1353, +45084=>1354, +45085=>1355, +45096=>1356, +45124=>1357, +45125=>1358, +45128=>1359, +45130=>1360, +45132=>1361, +45134=>1362, +45139=>1363, +45140=>1364, +45141=>1365, +45143=>1366, +45145=>1367, +45149=>1368, +45180=>1369, +45181=>1370, +45184=>1371, +45188=>1372, +45196=>1373, +45197=>1374, +45199=>1375, +45201=>1376, +45208=>1377, +45209=>1378, +45210=>1379, +45212=>1380, +45215=>1381, +45216=>1382, +45217=>1383, +45218=>1384, +45224=>1385, +45225=>1386, +45227=>1387, +45228=>1388, +45229=>1389, +45230=>1390, +45231=>1391, +45233=>1392, +45235=>1393, +45236=>1394, +45237=>1395, +45240=>1396, +45244=>1397, +45252=>1398, +45253=>1399, +45255=>1400, +45256=>1401, +45257=>1402, +45264=>1403, +45265=>1404, +45268=>1405, +45272=>1406, +45280=>1407, +45285=>1408, +45320=>1409, +45321=>1410, +45323=>1411, +45324=>1412, +45328=>1413, +45330=>1414, +45331=>1415, +45336=>1416, +45337=>1417, +45339=>1418, +45340=>1419, +45341=>1420, +45347=>1421, +45348=>1422, +45349=>1423, +45352=>1424, +45356=>1425, +45364=>1426, +45365=>1427, +45367=>1428, +45368=>1429, +45369=>1430, +45376=>1431, +45377=>1432, +45380=>1433, +45384=>1434, +45392=>1435, +45393=>1436, +45396=>1437, +45397=>1438, +45400=>1439, +45404=>1440, +45408=>1441, +45432=>1442, +45433=>1443, +45436=>1444, +45440=>1445, +45442=>1446, +45448=>1447, +45449=>1448, +45451=>1449, +45453=>1450, +45458=>1451, +45459=>1452, +45460=>1453, +45464=>1454, +45468=>1455, +45480=>1456, +45516=>1457, +45520=>1458, +45524=>1459, +45532=>1460, +45533=>1461, +45535=>1462, +45544=>1463, +45545=>1464, +45548=>1465, +45552=>1466, +45561=>1467, +45563=>1468, +45565=>1469, +45572=>1470, +45573=>1471, +45576=>1472, +45579=>1473, +45580=>1474, +45588=>1475, +45589=>1476, +45591=>1477, +45593=>1478, +45600=>1479, +45620=>1480, +45628=>1481, +45656=>1482, +45660=>1483, +45664=>1484, +45672=>1485, +45673=>1486, +45684=>1487, +45685=>1488, +45692=>1489, +45700=>1490, +45701=>1491, +45705=>1492, +45712=>1493, +45713=>1494, +45716=>1495, +45720=>1496, +45721=>1497, +45722=>1498, +45728=>1499, +45729=>1500, +45731=>1501, +45733=>1502, +45734=>1503, +45738=>1504, +45740=>1505, +45744=>1506, +45748=>1507, +45768=>1508, +45769=>1509, +45772=>1510, +45776=>1511, +45778=>1512, +45784=>1513, +45785=>1514, +45787=>1515, +45789=>1516, +45794=>1517, +45796=>1518, +45797=>1519, +45798=>1520, +45800=>1521, +45803=>1522, +45804=>1523, +45805=>1524, +45806=>1525, +45807=>1526, +45811=>1527, +45812=>1528, +45813=>1529, +45815=>1530, +45816=>1531, +45817=>1532, +45818=>1533, +45819=>1534, +45823=>1535, +45824=>1536, +45825=>1537, +45828=>1538, +45832=>1539, +45840=>1540, +45841=>1541, +45843=>1542, +45844=>1543, +45845=>1544, +45852=>1545, +45908=>1546, +45909=>1547, +45910=>1548, +45912=>1549, +45915=>1550, +45916=>1551, +45918=>1552, +45919=>1553, +45924=>1554, +45925=>1555, +45927=>1556, +45929=>1557, +45931=>1558, +45934=>1559, +45936=>1560, +45937=>1561, +45940=>1562, +45944=>1563, +45952=>1564, +45953=>1565, +45955=>1566, +45956=>1567, +45957=>1568, +45964=>1569, +45968=>1570, +45972=>1571, +45984=>1572, +45985=>1573, +45992=>1574, +45996=>1575, +46020=>1576, +46021=>1577, +46024=>1578, +46027=>1579, +46028=>1580, +46030=>1581, +46032=>1582, +46036=>1583, +46037=>1584, +46039=>1585, +46041=>1586, +46043=>1587, +46045=>1588, +46048=>1589, +46052=>1590, +46056=>1591, +46076=>1592, +46096=>1593, +46104=>1594, +46108=>1595, +46112=>1596, +46120=>1597, +46121=>1598, +46123=>1599, +46132=>1600, +46160=>1601, +46161=>1602, +46164=>1603, +46168=>1604, +46176=>1605, +46177=>1606, +46179=>1607, +46181=>1608, +46188=>1609, +46208=>1610, +46216=>1611, +46237=>1612, +46244=>1613, +46248=>1614, +46252=>1615, +46261=>1616, +46263=>1617, +46265=>1618, +46272=>1619, +46276=>1620, +46280=>1621, +46288=>1622, +46293=>1623, +46300=>1624, +46301=>1625, +46304=>1626, +46307=>1627, +46308=>1628, +46310=>1629, +46316=>1630, +46317=>1631, +46319=>1632, +46321=>1633, +46328=>1634, +46356=>1635, +46357=>1636, +46360=>1637, +46363=>1638, +46364=>1639, +46372=>1640, +46373=>1641, +46375=>1642, +46376=>1643, +46377=>1644, +46378=>1645, +46384=>1646, +46385=>1647, +46388=>1648, +46392=>1649, +46400=>1650, +46401=>1651, +46403=>1652, +46404=>1653, +46405=>1654, +46411=>1655, +46412=>1656, +46413=>1657, +46416=>1658, +46420=>1659, +46428=>1660, +46429=>1661, +46431=>1662, +46432=>1663, +46433=>1664, +46496=>1665, +46497=>1666, +46500=>1667, +46504=>1668, +46506=>1669, +46507=>1670, +46512=>1671, +46513=>1672, +46515=>1673, +46516=>1674, +46517=>1675, +46523=>1676, +46524=>1677, +46525=>1678, +46528=>1679, +46532=>1680, +46540=>1681, +46541=>1682, +46543=>1683, +46544=>1684, +46545=>1685, +46552=>1686, +46572=>1687, +46608=>1688, +46609=>1689, +46612=>1690, +46616=>1691, +46629=>1692, +46636=>1693, +46644=>1694, +46664=>1695, +46692=>1696, +46696=>1697, +46748=>1698, +46749=>1699, +46752=>1700, +46756=>1701, +46763=>1702, +46764=>1703, +46769=>1704, +46804=>1705, +46832=>1706, +46836=>1707, +46840=>1708, +46848=>1709, +46849=>1710, +46853=>1711, +46888=>1712, +46889=>1713, +46892=>1714, +46895=>1715, +46896=>1716, +46904=>1717, +46905=>1718, +46907=>1719, +46916=>1720, +46920=>1721, +46924=>1722, +46932=>1723, +46933=>1724, +46944=>1725, +46948=>1726, +46952=>1727, +46960=>1728, +46961=>1729, +46963=>1730, +46965=>1731, +46972=>1732, +46973=>1733, +46976=>1734, +46980=>1735, +46988=>1736, +46989=>1737, +46991=>1738, +46992=>1739, +46993=>1740, +46994=>1741, +46998=>1742, +46999=>1743, +47000=>1744, +47001=>1745, +47004=>1746, +47008=>1747, +47016=>1748, +47017=>1749, +47019=>1750, +47020=>1751, +47021=>1752, +47028=>1753, +47029=>1754, +47032=>1755, +47047=>1756, +47049=>1757, +47084=>1758, +47085=>1759, +47088=>1760, +47092=>1761, +47100=>1762, +47101=>1763, +47103=>1764, +47104=>1765, +47105=>1766, +47111=>1767, +47112=>1768, +47113=>1769, +47116=>1770, +47120=>1771, +47128=>1772, +47129=>1773, +47131=>1774, +47133=>1775, +47140=>1776, +47141=>1777, +47144=>1778, +47148=>1779, +47156=>1780, +47157=>1781, +47159=>1782, +47160=>1783, +47161=>1784, +47168=>1785, +47172=>1786, +47185=>1787, +47187=>1788, +47196=>1789, +47197=>1790, +47200=>1791, +47204=>1792, +47212=>1793, +47213=>1794, +47215=>1795, +47217=>1796, +47224=>1797, +47228=>1798, +47245=>1799, +47272=>1800, +47280=>1801, +47284=>1802, +47288=>1803, +47296=>1804, +47297=>1805, +47299=>1806, +47301=>1807, +47308=>1808, +47312=>1809, +47316=>1810, +47325=>1811, +47327=>1812, +47329=>1813, +47336=>1814, +47337=>1815, +47340=>1816, +47344=>1817, +47352=>1818, +47353=>1819, +47355=>1820, +47357=>1821, +47364=>1822, +47384=>1823, +47392=>1824, +47420=>1825, +47421=>1826, +47424=>1827, +47428=>1828, +47436=>1829, +47439=>1830, +47441=>1831, +47448=>1832, +47449=>1833, +47452=>1834, +47456=>1835, +47464=>1836, +47465=>1837, +47467=>1838, +47469=>1839, +47476=>1840, +47477=>1841, +47480=>1842, +47484=>1843, +47492=>1844, +47493=>1845, +47495=>1846, +47497=>1847, +47498=>1848, +47501=>1849, +47502=>1850, +47532=>1851, +47533=>1852, +47536=>1853, +47540=>1854, +47548=>1855, +47549=>1856, +47551=>1857, +47553=>1858, +47560=>1859, +47561=>1860, +47564=>1861, +47566=>1862, +47567=>1863, +47568=>1864, +47569=>1865, +47570=>1866, +47576=>1867, +47577=>1868, +47579=>1869, +47581=>1870, +47582=>1871, +47585=>1872, +47587=>1873, +47588=>1874, +47589=>1875, +47592=>1876, +47596=>1877, +47604=>1878, +47605=>1879, +47607=>1880, +47608=>1881, +47609=>1882, +47610=>1883, +47616=>1884, +47617=>1885, +47624=>1886, +47637=>1887, +47672=>1888, +47673=>1889, +47676=>1890, +47680=>1891, +47682=>1892, +47688=>1893, +47689=>1894, +47691=>1895, +47693=>1896, +47694=>1897, +47699=>1898, +47700=>1899, +47701=>1900, +47704=>1901, +47708=>1902, +47716=>1903, +47717=>1904, +47719=>1905, +47720=>1906, +47721=>1907, +47728=>1908, +47729=>1909, +47732=>1910, +47736=>1911, +47747=>1912, +47748=>1913, +47749=>1914, +47751=>1915, +47756=>1916, +47784=>1917, +47785=>1918, +47787=>1919, +47788=>1920, +47792=>1921, +47794=>1922, +47800=>1923, +47801=>1924, +47803=>1925, +47805=>1926, +47812=>1927, +47816=>1928, +47832=>1929, +47833=>1930, +47868=>1931, +47872=>1932, +47876=>1933, +47885=>1934, +47887=>1935, +47889=>1936, +47896=>1937, +47900=>1938, +47904=>1939, +47913=>1940, +47915=>1941, +47924=>1942, +47925=>1943, +47926=>1944, +47928=>1945, +47931=>1946, +47932=>1947, +47933=>1948, +47934=>1949, +47940=>1950, +47941=>1951, +47943=>1952, +47945=>1953, +47949=>1954, +47951=>1955, +47952=>1956, +47956=>1957, +47960=>1958, +47969=>1959, +47971=>1960, +47980=>1961, +48008=>1962, +48012=>1963, +48016=>1964, +48036=>1965, +48040=>1966, +48044=>1967, +48052=>1968, +48055=>1969, +48064=>1970, +48068=>1971, +48072=>1972, +48080=>1973, +48083=>1974, +48120=>1975, +48121=>1976, +48124=>1977, +48127=>1978, +48128=>1979, +48130=>1980, +48136=>1981, +48137=>1982, +48139=>1983, +48140=>1984, +48141=>1985, +48143=>1986, +48145=>1987, +48148=>1988, +48149=>1989, +48150=>1990, +48151=>1991, +48152=>1992, +48155=>1993, +48156=>1994, +48157=>1995, +48158=>1996, +48159=>1997, +48164=>1998, +48165=>1999, +48167=>2000, +48169=>2001, +48173=>2002, +48176=>2003, +48177=>2004, +48180=>2005, +48184=>2006, +48192=>2007, +48193=>2008, +48195=>2009, +48196=>2010, +48197=>2011, +48201=>2012, +48204=>2013, +48205=>2014, +48208=>2015, +48221=>2016, +48260=>2017, +48261=>2018, +48264=>2019, +48267=>2020, +48268=>2021, +48270=>2022, +48276=>2023, +48277=>2024, +48279=>2025, +48281=>2026, +48282=>2027, +48288=>2028, +48289=>2029, +48292=>2030, +48295=>2031, +48296=>2032, +48304=>2033, +48305=>2034, +48307=>2035, +48308=>2036, +48309=>2037, +48316=>2038, +48317=>2039, +48320=>2040, +48324=>2041, +48333=>2042, +48335=>2043, +48336=>2044, +48337=>2045, +48341=>2046, +48344=>2047, +48348=>2048, +48372=>2049, +48373=>2050, +48374=>2051, +48376=>2052, +48380=>2053, +48388=>2054, +48389=>2055, +48391=>2056, +48393=>2057, +48400=>2058, +48404=>2059, +48420=>2060, +48428=>2061, +48448=>2062, +48456=>2063, +48457=>2064, +48460=>2065, +48464=>2066, +48472=>2067, +48473=>2068, +48484=>2069, +48488=>2070, +48512=>2071, +48513=>2072, +48516=>2073, +48519=>2074, +48520=>2075, +48521=>2076, +48522=>2077, +48528=>2078, +48529=>2079, +48531=>2080, +48533=>2081, +48537=>2082, +48538=>2083, +48540=>2084, +48548=>2085, +48560=>2086, +48568=>2087, +48596=>2088, +48597=>2089, +48600=>2090, +48604=>2091, +48617=>2092, +48624=>2093, +48628=>2094, +48632=>2095, +48640=>2096, +48643=>2097, +48645=>2098, +48652=>2099, +48653=>2100, +48656=>2101, +48660=>2102, +48668=>2103, +48669=>2104, +48671=>2105, +48708=>2106, +48709=>2107, +48712=>2108, +48716=>2109, +48718=>2110, +48724=>2111, +48725=>2112, +48727=>2113, +48729=>2114, +48730=>2115, +48731=>2116, +48736=>2117, +48737=>2118, +48740=>2119, +48744=>2120, +48746=>2121, +48752=>2122, +48753=>2123, +48755=>2124, +48756=>2125, +48757=>2126, +48763=>2127, +48764=>2128, +48765=>2129, +48768=>2130, +48772=>2131, +48780=>2132, +48781=>2133, +48783=>2134, +48784=>2135, +48785=>2136, +48792=>2137, +48793=>2138, +48808=>2139, +48848=>2140, +48849=>2141, +48852=>2142, +48855=>2143, +48856=>2144, +48864=>2145, +48867=>2146, +48868=>2147, +48869=>2148, +48876=>2149, +48897=>2150, +48904=>2151, +48905=>2152, +48920=>2153, +48921=>2154, +48923=>2155, +48924=>2156, +48925=>2157, +48960=>2158, +48961=>2159, +48964=>2160, +48968=>2161, +48976=>2162, +48977=>2163, +48981=>2164, +49044=>2165, +49072=>2166, +49093=>2167, +49100=>2168, +49101=>2169, +49104=>2170, +49108=>2171, +49116=>2172, +49119=>2173, +49121=>2174, +49212=>2175, +49233=>2176, +49240=>2177, +49244=>2178, +49248=>2179, +49256=>2180, +49257=>2181, +49296=>2182, +49297=>2183, +49300=>2184, +49304=>2185, +49312=>2186, +49313=>2187, +49315=>2188, +49317=>2189, +49324=>2190, +49325=>2191, +49327=>2192, +49328=>2193, +49331=>2194, +49332=>2195, +49333=>2196, +49334=>2197, +49340=>2198, +49341=>2199, +49343=>2200, +49344=>2201, +49345=>2202, +49349=>2203, +49352=>2204, +49353=>2205, +49356=>2206, +49360=>2207, +49368=>2208, +49369=>2209, +49371=>2210, +49372=>2211, +49373=>2212, +49380=>2213, +49381=>2214, +49384=>2215, +49388=>2216, +49396=>2217, +49397=>2218, +49399=>2219, +49401=>2220, +49408=>2221, +49412=>2222, +49416=>2223, +49424=>2224, +49429=>2225, +49436=>2226, +49437=>2227, +49438=>2228, +49439=>2229, +49440=>2230, +49443=>2231, +49444=>2232, +49446=>2233, +49447=>2234, +49452=>2235, +49453=>2236, +49455=>2237, +49456=>2238, +49457=>2239, +49462=>2240, +49464=>2241, +49465=>2242, +49468=>2243, +49472=>2244, +49480=>2245, +49481=>2246, +49483=>2247, +49484=>2248, +49485=>2249, +49492=>2250, +49493=>2251, +49496=>2252, +49500=>2253, +49508=>2254, +49509=>2255, +49511=>2256, +49512=>2257, +49513=>2258, +49520=>2259, +49524=>2260, +49528=>2261, +49541=>2262, +49548=>2263, +49549=>2264, +49550=>2265, +49552=>2266, +49556=>2267, +49558=>2268, +49564=>2269, +49565=>2270, +49567=>2271, +49569=>2272, +49573=>2273, +49576=>2274, +49577=>2275, +49580=>2276, +49584=>2277, +49597=>2278, +49604=>2279, +49608=>2280, +49612=>2281, +49620=>2282, +49623=>2283, +49624=>2284, +49632=>2285, +49636=>2286, +49640=>2287, +49648=>2288, +49649=>2289, +49651=>2290, +49660=>2291, +49661=>2292, +49664=>2293, +49668=>2294, +49676=>2295, +49677=>2296, +49679=>2297, +49681=>2298, +49688=>2299, +49689=>2300, +49692=>2301, +49695=>2302, +49696=>2303, +49704=>2304, +49705=>2305, +49707=>2306, +49709=>2307, +49711=>2308, +49713=>2309, +49714=>2310, +49716=>2311, +49736=>2312, +49744=>2313, +49745=>2314, +49748=>2315, +49752=>2316, +49760=>2317, +49765=>2318, +49772=>2319, +49773=>2320, +49776=>2321, +49780=>2322, +49788=>2323, +49789=>2324, +49791=>2325, +49793=>2326, +49800=>2327, +49801=>2328, +49808=>2329, +49816=>2330, +49819=>2331, +49821=>2332, +49828=>2333, +49829=>2334, +49832=>2335, +49836=>2336, +49837=>2337, +49844=>2338, +49845=>2339, +49847=>2340, +49849=>2341, +49884=>2342, +49885=>2343, +49888=>2344, +49891=>2345, +49892=>2346, +49899=>2347, +49900=>2348, +49901=>2349, +49903=>2350, +49905=>2351, +49910=>2352, +49912=>2353, +49913=>2354, +49915=>2355, +49916=>2356, +49920=>2357, +49928=>2358, +49929=>2359, +49932=>2360, +49933=>2361, +49939=>2362, +49940=>2363, +49941=>2364, +49944=>2365, +49948=>2366, +49956=>2367, +49957=>2368, +49960=>2369, +49961=>2370, +49989=>2371, +50024=>2372, +50025=>2373, +50028=>2374, +50032=>2375, +50034=>2376, +50040=>2377, +50041=>2378, +50044=>2379, +50045=>2380, +50052=>2381, +50056=>2382, +50060=>2383, +50112=>2384, +50136=>2385, +50137=>2386, +50140=>2387, +50143=>2388, +50144=>2389, +50146=>2390, +50152=>2391, +50153=>2392, +50157=>2393, +50164=>2394, +50165=>2395, +50168=>2396, +50184=>2397, +50192=>2398, +50212=>2399, +50220=>2400, +50224=>2401, +50228=>2402, +50236=>2403, +50237=>2404, +50248=>2405, +50276=>2406, +50277=>2407, +50280=>2408, +50284=>2409, +50292=>2410, +50293=>2411, +50297=>2412, +50304=>2413, +50324=>2414, +50332=>2415, +50360=>2416, +50364=>2417, +50409=>2418, +50416=>2419, +50417=>2420, +50420=>2421, +50424=>2422, +50426=>2423, +50431=>2424, +50432=>2425, +50433=>2426, +50444=>2427, +50448=>2428, +50452=>2429, +50460=>2430, +50472=>2431, +50473=>2432, +50476=>2433, +50480=>2434, +50488=>2435, +50489=>2436, +50491=>2437, +50493=>2438, +50500=>2439, +50501=>2440, +50504=>2441, +50505=>2442, +50506=>2443, +50508=>2444, +50509=>2445, +50510=>2446, +50515=>2447, +50516=>2448, +50517=>2449, +50519=>2450, +50520=>2451, +50521=>2452, +50525=>2453, +50526=>2454, +50528=>2455, +50529=>2456, +50532=>2457, +50536=>2458, +50544=>2459, +50545=>2460, +50547=>2461, +50548=>2462, +50549=>2463, +50556=>2464, +50557=>2465, +50560=>2466, +50564=>2467, +50567=>2468, +50572=>2469, +50573=>2470, +50575=>2471, +50577=>2472, +50581=>2473, +50583=>2474, +50584=>2475, +50588=>2476, +50592=>2477, +50601=>2478, +50612=>2479, +50613=>2480, +50616=>2481, +50617=>2482, +50619=>2483, +50620=>2484, +50621=>2485, +50622=>2486, +50628=>2487, +50629=>2488, +50630=>2489, +50631=>2490, +50632=>2491, +50633=>2492, +50634=>2493, +50636=>2494, +50638=>2495, +50640=>2496, +50641=>2497, +50644=>2498, +50648=>2499, +50656=>2500, +50657=>2501, +50659=>2502, +50661=>2503, +50668=>2504, +50669=>2505, +50670=>2506, +50672=>2507, +50676=>2508, +50678=>2509, +50679=>2510, +50684=>2511, +50685=>2512, +50686=>2513, +50687=>2514, +50688=>2515, +50689=>2516, +50693=>2517, +50694=>2518, +50695=>2519, +50696=>2520, +50700=>2521, +50704=>2522, +50712=>2523, +50713=>2524, +50715=>2525, +50716=>2526, +50724=>2527, +50725=>2528, +50728=>2529, +50732=>2530, +50733=>2531, +50734=>2532, +50736=>2533, +50739=>2534, +50740=>2535, +50741=>2536, +50743=>2537, +50745=>2538, +50747=>2539, +50752=>2540, +50753=>2541, +50756=>2542, +50760=>2543, +50768=>2544, +50769=>2545, +50771=>2546, +50772=>2547, +50773=>2548, +50780=>2549, +50781=>2550, +50784=>2551, +50796=>2552, +50799=>2553, +50801=>2554, +50808=>2555, +50809=>2556, +50812=>2557, +50816=>2558, +50824=>2559, +50825=>2560, +50827=>2561, +50829=>2562, +50836=>2563, +50837=>2564, +50840=>2565, +50844=>2566, +50852=>2567, +50853=>2568, +50855=>2569, +50857=>2570, +50864=>2571, +50865=>2572, +50868=>2573, +50872=>2574, +50873=>2575, +50874=>2576, +50880=>2577, +50881=>2578, +50883=>2579, +50885=>2580, +50892=>2581, +50893=>2582, +50896=>2583, +50900=>2584, +50908=>2585, +50909=>2586, +50912=>2587, +50913=>2588, +50920=>2589, +50921=>2590, +50924=>2591, +50928=>2592, +50936=>2593, +50937=>2594, +50941=>2595, +50948=>2596, +50949=>2597, +50952=>2598, +50956=>2599, +50964=>2600, +50965=>2601, +50967=>2602, +50969=>2603, +50976=>2604, +50977=>2605, +50980=>2606, +50984=>2607, +50992=>2608, +50993=>2609, +50995=>2610, +50997=>2611, +50999=>2612, +51004=>2613, +51005=>2614, +51008=>2615, +51012=>2616, +51018=>2617, +51020=>2618, +51021=>2619, +51023=>2620, +51025=>2621, +51026=>2622, +51027=>2623, +51028=>2624, +51029=>2625, +51030=>2626, +51031=>2627, +51032=>2628, +51036=>2629, +51040=>2630, +51048=>2631, +51051=>2632, +51060=>2633, +51061=>2634, +51064=>2635, +51068=>2636, +51069=>2637, +51070=>2638, +51075=>2639, +51076=>2640, +51077=>2641, +51079=>2642, +51080=>2643, +51081=>2644, +51082=>2645, +51086=>2646, +51088=>2647, +51089=>2648, +51092=>2649, +51094=>2650, +51095=>2651, +51096=>2652, +51098=>2653, +51104=>2654, +51105=>2655, +51107=>2656, +51108=>2657, +51109=>2658, +51110=>2659, +51116=>2660, +51117=>2661, +51120=>2662, +51124=>2663, +51132=>2664, +51133=>2665, +51135=>2666, +51136=>2667, +51137=>2668, +51144=>2669, +51145=>2670, +51148=>2671, +51150=>2672, +51152=>2673, +51160=>2674, +51165=>2675, +51172=>2676, +51176=>2677, +51180=>2678, +51200=>2679, +51201=>2680, +51204=>2681, +51208=>2682, +51210=>2683, +51216=>2684, +51217=>2685, +51219=>2686, +51221=>2687, +51222=>2688, +51228=>2689, +51229=>2690, +51232=>2691, +51236=>2692, +51244=>2693, +51245=>2694, +51247=>2695, +51249=>2696, +51256=>2697, +51260=>2698, +51264=>2699, +51272=>2700, +51273=>2701, +51276=>2702, +51277=>2703, +51284=>2704, +51312=>2705, +51313=>2706, +51316=>2707, +51320=>2708, +51322=>2709, +51328=>2710, +51329=>2711, +51331=>2712, +51333=>2713, +51334=>2714, +51335=>2715, +51339=>2716, +51340=>2717, +51341=>2718, +51348=>2719, +51357=>2720, +51359=>2721, +51361=>2722, +51368=>2723, +51388=>2724, +51389=>2725, +51396=>2726, +51400=>2727, +51404=>2728, +51412=>2729, +51413=>2730, +51415=>2731, +51417=>2732, +51424=>2733, +51425=>2734, +51428=>2735, +51445=>2736, +51452=>2737, +51453=>2738, +51456=>2739, +51460=>2740, +51461=>2741, +51462=>2742, +51468=>2743, +51469=>2744, +51471=>2745, +51473=>2746, +51480=>2747, +51500=>2748, +51508=>2749, +51536=>2750, +51537=>2751, +51540=>2752, +51544=>2753, +51552=>2754, +51553=>2755, +51555=>2756, +51564=>2757, +51568=>2758, +51572=>2759, +51580=>2760, +51592=>2761, +51593=>2762, +51596=>2763, +51600=>2764, +51608=>2765, +51609=>2766, +51611=>2767, +51613=>2768, +51648=>2769, +51649=>2770, +51652=>2771, +51655=>2772, +51656=>2773, +51658=>2774, +51664=>2775, +51665=>2776, +51667=>2777, +51669=>2778, +51670=>2779, +51673=>2780, +51674=>2781, +51676=>2782, +51677=>2783, +51680=>2784, +51682=>2785, +51684=>2786, +51687=>2787, +51692=>2788, +51693=>2789, +51695=>2790, +51696=>2791, +51697=>2792, +51704=>2793, +51705=>2794, +51708=>2795, +51712=>2796, +51720=>2797, +51721=>2798, +51723=>2799, +51724=>2800, +51725=>2801, +51732=>2802, +51736=>2803, +51753=>2804, +51788=>2805, +51789=>2806, +51792=>2807, +51796=>2808, +51804=>2809, +51805=>2810, +51807=>2811, +51808=>2812, +51809=>2813, +51816=>2814, +51837=>2815, +51844=>2816, +51864=>2817, +51900=>2818, +51901=>2819, +51904=>2820, +51908=>2821, +51916=>2822, +51917=>2823, +51919=>2824, +51921=>2825, +51923=>2826, +51928=>2827, +51929=>2828, +51936=>2829, +51948=>2830, +51956=>2831, +51976=>2832, +51984=>2833, +51988=>2834, +51992=>2835, +52000=>2836, +52001=>2837, +52033=>2838, +52040=>2839, +52041=>2840, +52044=>2841, +52048=>2842, +52056=>2843, +52057=>2844, +52061=>2845, +52068=>2846, +52088=>2847, +52089=>2848, +52124=>2849, +52152=>2850, +52180=>2851, +52196=>2852, +52199=>2853, +52201=>2854, +52236=>2855, +52237=>2856, +52240=>2857, +52244=>2858, +52252=>2859, +52253=>2860, +52257=>2861, +52258=>2862, +52263=>2863, +52264=>2864, +52265=>2865, +52268=>2866, +52270=>2867, +52272=>2868, +52280=>2869, +52281=>2870, +52283=>2871, +52284=>2872, +52285=>2873, +52286=>2874, +52292=>2875, +52293=>2876, +52296=>2877, +52300=>2878, +52308=>2879, +52309=>2880, +52311=>2881, +52312=>2882, +52313=>2883, +52320=>2884, +52324=>2885, +52326=>2886, +52328=>2887, +52336=>2888, +52341=>2889, +52376=>2890, +52377=>2891, +52380=>2892, +52384=>2893, +52392=>2894, +52393=>2895, +52395=>2896, +52396=>2897, +52397=>2898, +52404=>2899, +52405=>2900, +52408=>2901, +52412=>2902, +52420=>2903, +52421=>2904, +52423=>2905, +52425=>2906, +52432=>2907, +52436=>2908, +52452=>2909, +52460=>2910, +52464=>2911, +52481=>2912, +52488=>2913, +52489=>2914, +52492=>2915, +52496=>2916, +52504=>2917, +52505=>2918, +52507=>2919, +52509=>2920, +52516=>2921, +52520=>2922, +52524=>2923, +52537=>2924, +52572=>2925, +52576=>2926, +52580=>2927, +52588=>2928, +52589=>2929, +52591=>2930, +52593=>2931, +52600=>2932, +52616=>2933, +52628=>2934, +52629=>2935, +52632=>2936, +52636=>2937, +52644=>2938, +52645=>2939, +52647=>2940, +52649=>2941, +52656=>2942, +52676=>2943, +52684=>2944, +52688=>2945, +52712=>2946, +52716=>2947, +52720=>2948, +52728=>2949, +52729=>2950, +52731=>2951, +52733=>2952, +52740=>2953, +52744=>2954, +52748=>2955, +52756=>2956, +52761=>2957, +52768=>2958, +52769=>2959, +52772=>2960, +52776=>2961, +52784=>2962, +52785=>2963, +52787=>2964, +52789=>2965, +52824=>2966, +52825=>2967, +52828=>2968, +52831=>2969, +52832=>2970, +52833=>2971, +52840=>2972, +52841=>2973, +52843=>2974, +52845=>2975, +52852=>2976, +52853=>2977, +52856=>2978, +52860=>2979, +52868=>2980, +52869=>2981, +52871=>2982, +52873=>2983, +52880=>2984, +52881=>2985, +52884=>2986, +52888=>2987, +52896=>2988, +52897=>2989, +52899=>2990, +52900=>2991, +52901=>2992, +52908=>2993, +52909=>2994, +52929=>2995, +52964=>2996, +52965=>2997, +52968=>2998, +52971=>2999, +52972=>3000, +52980=>3001, +52981=>3002, +52983=>3003, +52984=>3004, +52985=>3005, +52992=>3006, +52993=>3007, +52996=>3008, +53000=>3009, +53008=>3010, +53009=>3011, +53011=>3012, +53013=>3013, +53020=>3014, +53024=>3015, +53028=>3016, +53036=>3017, +53037=>3018, +53039=>3019, +53040=>3020, +53041=>3021, +53048=>3022, +53076=>3023, +53077=>3024, +53080=>3025, +53084=>3026, +53092=>3027, +53093=>3028, +53095=>3029, +53097=>3030, +53104=>3031, +53105=>3032, +53108=>3033, +53112=>3034, +53120=>3035, +53125=>3036, +53132=>3037, +53153=>3038, +53160=>3039, +53168=>3040, +53188=>3041, +53216=>3042, +53217=>3043, +53220=>3044, +53224=>3045, +53232=>3046, +53233=>3047, +53235=>3048, +53237=>3049, +53244=>3050, +53248=>3051, +53252=>3052, +53265=>3053, +53272=>3054, +53293=>3055, +53300=>3056, +53301=>3057, +53304=>3058, +53308=>3059, +53316=>3060, +53317=>3061, +53319=>3062, +53321=>3063, +53328=>3064, +53332=>3065, +53336=>3066, +53344=>3067, +53356=>3068, +53357=>3069, +53360=>3070, +53364=>3071, +53372=>3072, +53373=>3073, +53377=>3074, +53412=>3075, +53413=>3076, +53416=>3077, +53420=>3078, +53428=>3079, +53429=>3080, +53431=>3081, +53433=>3082, +53440=>3083, +53441=>3084, +53444=>3085, +53448=>3086, +53449=>3087, +53456=>3088, +53457=>3089, +53459=>3090, +53460=>3091, +53461=>3092, +53468=>3093, +53469=>3094, +53472=>3095, +53476=>3096, +53484=>3097, +53485=>3098, +53487=>3099, +53488=>3100, +53489=>3101, +53496=>3102, +53517=>3103, +53552=>3104, +53553=>3105, +53556=>3106, +53560=>3107, +53562=>3108, +53568=>3109, +53569=>3110, +53571=>3111, +53572=>3112, +53573=>3113, +53580=>3114, +53581=>3115, +53584=>3116, +53588=>3117, +53596=>3118, +53597=>3119, +53599=>3120, +53601=>3121, +53608=>3122, +53612=>3123, +53628=>3124, +53636=>3125, +53640=>3126, +53664=>3127, +53665=>3128, +53668=>3129, +53672=>3130, +53680=>3131, +53681=>3132, +53683=>3133, +53685=>3134, +53690=>3135, +53692=>3136, +53696=>3137, +53720=>3138, +53748=>3139, +53752=>3140, +53767=>3141, +53769=>3142, +53776=>3143, +53804=>3144, +53805=>3145, +53808=>3146, +53812=>3147, +53820=>3148, +53821=>3149, +53823=>3150, +53825=>3151, +53832=>3152, +53852=>3153, +53860=>3154, +53888=>3155, +53889=>3156, +53892=>3157, +53896=>3158, +53904=>3159, +53905=>3160, +53909=>3161, +53916=>3162, +53920=>3163, +53924=>3164, +53932=>3165, +53937=>3166, +53944=>3167, +53945=>3168, +53948=>3169, +53951=>3170, +53952=>3171, +53954=>3172, +53960=>3173, +53961=>3174, +53963=>3175, +53972=>3176, +53976=>3177, +53980=>3178, +53988=>3179, +53989=>3180, +54000=>3181, +54001=>3182, +54004=>3183, +54008=>3184, +54016=>3185, +54017=>3186, +54019=>3187, +54021=>3188, +54028=>3189, +54029=>3190, +54030=>3191, +54032=>3192, +54036=>3193, +54038=>3194, +54044=>3195, +54045=>3196, +54047=>3197, +54048=>3198, +54049=>3199, +54053=>3200, +54056=>3201, +54057=>3202, +54060=>3203, +54064=>3204, +54072=>3205, +54073=>3206, +54075=>3207, +54076=>3208, +54077=>3209, +54084=>3210, +54085=>3211, +54140=>3212, +54141=>3213, +54144=>3214, +54148=>3215, +54156=>3216, +54157=>3217, +54159=>3218, +54160=>3219, +54161=>3220, +54168=>3221, +54169=>3222, +54172=>3223, +54176=>3224, +54184=>3225, +54185=>3226, +54187=>3227, +54189=>3228, +54196=>3229, +54200=>3230, +54204=>3231, +54212=>3232, +54213=>3233, +54216=>3234, +54217=>3235, +54224=>3236, +54232=>3237, +54241=>3238, +54243=>3239, +54252=>3240, +54253=>3241, +54256=>3242, +54260=>3243, +54268=>3244, +54269=>3245, +54271=>3246, +54273=>3247, +54280=>3248, +54301=>3249, +54336=>3250, +54340=>3251, +54364=>3252, +54368=>3253, +54372=>3254, +54381=>3255, +54383=>3256, +54392=>3257, +54393=>3258, +54396=>3259, +54399=>3260, +54400=>3261, +54402=>3262, +54408=>3263, +54409=>3264, +54411=>3265, +54413=>3266, +54420=>3267, +54441=>3268, +54476=>3269, +54480=>3270, +54484=>3271, +54492=>3272, +54495=>3273, +54504=>3274, +54508=>3275, +54512=>3276, +54520=>3277, +54523=>3278, +54525=>3279, +54532=>3280, +54536=>3281, +54540=>3282, +54548=>3283, +54549=>3284, +54551=>3285, +54588=>3286, +54589=>3287, +54592=>3288, +54596=>3289, +54604=>3290, +54605=>3291, +54607=>3292, +54609=>3293, +54616=>3294, +54617=>3295, +54620=>3296, +54624=>3297, +54629=>3298, +54632=>3299, +54633=>3300, +54635=>3301, +54637=>3302, +54644=>3303, +54645=>3304, +54648=>3305, +54652=>3306, +54660=>3307, +54661=>3308, +54663=>3309, +54664=>3310, +54665=>3311, +54672=>3312, +54693=>3313, +54728=>3314, +54729=>3315, +54732=>3316, +54736=>3317, +54738=>3318, +54744=>3319, +54745=>3320, +54747=>3321, +54749=>3322, +54756=>3323, +54757=>3324, +54760=>3325, +54764=>3326, +54772=>3327, +54773=>3328, +54775=>3329, +54777=>3330, +54784=>3331, +54785=>3332, +54788=>3333, +54792=>3334, +54800=>3335, +54801=>3336, +54803=>3337, +54804=>3338, +54805=>3339, +54812=>3340, +54816=>3341, +54820=>3342, +54829=>3343, +54840=>3344, +54841=>3345, +54844=>3346, +54848=>3347, +54853=>3348, +54856=>3349, +54857=>3350, +54859=>3351, +54861=>3352, +54865=>3353, +54868=>3354, +54869=>3355, +54872=>3356, +54876=>3357, +54887=>3358, +54889=>3359, +54896=>3360, +54897=>3361, +54900=>3362, +54915=>3363, +54917=>3364, +54924=>3365, +54925=>3366, +54928=>3367, +54932=>3368, +54941=>3369, +54943=>3370, +54945=>3371, +54952=>3372, +54956=>3373, +54960=>3374, +54969=>3375, +54971=>3376, +54980=>3377, +54981=>3378, +54984=>3379, +54988=>3380, +54993=>3381, +54996=>3382, +54999=>3383, +55001=>3384, +55008=>3385, +55012=>3386, +55016=>3387, +55024=>3388, +55029=>3389, +55036=>3390, +55037=>3391, +55040=>3392, +55044=>3393, +55057=>3394, +55064=>3395, +55065=>3396, +55068=>3397, +55072=>3398, +55080=>3399, +55081=>3400, +55083=>3401, +55085=>3402, +55092=>3403, +55093=>3404, +55096=>3405, +55100=>3406, +55108=>3407, +55111=>3408, +55113=>3409, +55120=>3410, +55121=>3411, +55124=>3412, +55126=>3413, +55127=>3414, +55128=>3415, +55129=>3416, +55136=>3417, +55137=>3418, +55139=>3419, +55141=>3420, +55145=>3421, +55148=>3422, +55152=>3423, +55156=>3424, +55164=>3425, +55165=>3426, +55169=>3427, +55176=>3428, +55177=>3429, +55180=>3430, +55184=>3431, +55192=>3432, +55193=>3433, +55195=>3434, +55197=>3435, +20285=>3436, +20339=>3437, +20551=>3438, +20729=>3439, +21152=>3440, +21487=>3441, +21621=>3442, +21733=>3443, +22025=>3444, +23233=>3445, +23478=>3446, +26247=>3447, +26550=>3448, +26551=>3449, +26607=>3450, +27468=>3451, +29634=>3452, +30146=>3453, +31292=>3454, +33499=>3455, +33540=>3456, +34903=>3457, +34952=>3458, +35382=>3459, +36040=>3460, +63747=>3460, +36303=>3461, +36603=>3462, +36838=>3463, +39381=>3464, +21051=>3465, +21364=>3466, +21508=>3467, +24682=>3468, +24932=>3469, +27580=>3470, +29647=>3471, +33050=>3472, +35258=>3473, +12179=>3474, +35282=>3474, +38307=>3475, +20355=>3476, +21002=>3477, +22718=>3478, +22904=>3479, +23014=>3480, +12082=>3481, +24178=>3481, +24185=>3482, +25031=>3483, +25536=>3484, +26438=>3485, +26604=>3486, +26751=>3487, +28567=>3488, +30286=>3489, +30475=>3490, +30965=>3491, +31240=>3492, +31487=>3493, +31777=>3494, +32925=>3495, +12169=>3496, +33390=>3496, +33393=>3497, +35563=>3498, +38291=>3499, +20075=>3500, +21917=>3501, +26359=>3502, +28212=>3503, +30883=>3504, +31469=>3505, +33883=>3506, +35088=>3507, +34638=>3508, +38824=>3509, +21208=>3510, +22350=>3511, +22570=>3512, +23884=>3513, +24863=>3514, +25022=>3515, +25121=>3516, +25954=>3517, +26577=>3518, +27204=>3519, +28187=>3520, +12130=>3521, +29976=>3521, +30131=>3522, +30435=>3523, +30640=>3524, +32058=>3525, +37039=>3526, +37969=>3527, +37970=>3528, +40853=>3529, +21283=>3530, +23724=>3531, +30002=>3532, +32987=>3533, +37440=>3534, +38296=>3535, +21083=>3536, +22536=>3537, +23004=>3538, +23713=>3539, +23831=>3540, +24247=>3541, +24378=>3542, +24394=>3543, +24951=>3544, +27743=>3545, +30074=>3546, +30086=>3547, +31968=>3548, +32115=>3549, +32177=>3550, +32652=>3551, +33108=>3552, +33313=>3553, +34193=>3554, +35137=>3555, +35611=>3556, +37628=>3557, +38477=>3558, +64009=>3558, +40007=>3559, +20171=>3560, +20215=>3561, +20491=>3562, +20977=>3563, +22607=>3564, +24887=>3565, +24894=>3566, +24936=>3567, +25913=>3568, +27114=>3569, +28433=>3570, +30117=>3571, +30342=>3572, +30422=>3573, +31623=>3574, +33445=>3575, +33995=>3576, +37799=>3577, +38283=>3578, +21888=>3579, +23458=>3580, +22353=>3581, +31923=>3582, +32697=>3583, +37301=>3584, +20520=>3585, +21435=>3586, +23621=>3587, +24040=>3588, +25298=>3589, +25454=>3590, +25818=>3591, +25831=>3592, +28192=>3593, +28844=>3594, +31067=>3595, +36317=>3596, +36382=>3597, +36989=>3598, +37445=>3599, +37624=>3600, +20094=>3601, +20214=>3602, +20581=>3603, +12081=>3604, +24062=>3604, +24314=>3605, +24838=>3606, +26967=>3607, +33137=>3608, +34388=>3609, +36423=>3610, +37749=>3611, +39467=>3612, +20062=>3613, +20625=>3614, +26480=>3615, +26688=>3616, +20745=>3617, +21133=>3618, +21138=>3619, +27298=>3620, +30652=>3621, +37392=>3622, +40660=>3623, +21163=>3624, +24623=>3625, +36850=>3626, +20552=>3627, +25001=>3628, +25581=>3629, +25802=>3630, +26684=>3631, +27268=>3632, +28608=>3633, +33160=>3634, +35233=>3635, +38548=>3636, +22533=>3637, +29309=>3638, +12125=>3639, +29356=>3639, +29956=>3640, +32121=>3641, +32365=>3642, +32937=>3643, +12178=>3644, +35211=>3644, +64010=>3644, +35700=>3645, +36963=>3646, +40273=>3647, +25225=>3648, +27770=>3649, +28500=>3650, +32080=>3651, +32570=>3652, +35363=>3653, +20860=>3654, +24906=>3655, +31645=>3656, +35609=>3657, +37463=>3658, +37772=>3659, +20140=>3660, +20435=>3661, +20510=>3662, +20670=>3663, +20742=>3664, +21185=>3665, +21197=>3666, +21375=>3667, +22384=>3668, +22659=>3669, +24218=>3670, +24465=>3671, +24950=>3672, +25004=>3673, +25806=>3674, +25964=>3675, +26223=>3676, +26299=>3677, +26356=>3678, +63745=>3678, +26775=>3679, +28039=>3680, +28805=>3681, +28913=>3682, +29855=>3683, +29861=>3684, +29898=>3685, +30169=>3686, +30828=>3687, +30956=>3688, +31455=>3689, +31478=>3690, +32069=>3691, +32147=>3692, +32789=>3693, +32831=>3694, +33051=>3695, +33686=>3696, +35686=>3697, +36629=>3698, +36885=>3699, +37857=>3700, +38915=>3701, +38968=>3702, +39514=>3703, +39912=>3704, +20418=>3705, +21843=>3706, +22586=>3707, +22865=>3708, +63753=>3708, +23395=>3709, +23622=>3710, +24760=>3711, +25106=>3712, +26690=>3713, +26800=>3714, +26856=>3715, +28330=>3716, +30028=>3717, +30328=>3718, +30926=>3719, +31293=>3720, +31995=>3721, +32363=>3722, +32380=>3723, +35336=>3724, +35489=>3725, +35903=>3726, +38542=>3727, +40388=>3728, +21476=>3729, +21481=>3730, +21578=>3731, +21617=>3732, +22266=>3733, +22993=>3734, +23396=>3735, +23611=>3736, +24235=>3737, +25335=>3738, +25911=>3739, +25925=>3740, +25970=>3741, +26272=>3742, +26543=>3743, +27073=>3744, +27837=>3745, +30204=>3746, +30352=>3747, +30590=>3748, +31295=>3749, +32660=>3750, +32771=>3751, +32929=>3752, +33167=>3753, +33510=>3754, +33533=>3755, +33776=>3756, +34241=>3757, +34865=>3758, +34996=>3759, +35493=>3760, +36764=>3761, +37678=>3762, +38599=>3763, +39015=>3764, +12220=>3765, +39640=>3765, +12238=>3766, +40723=>3766, +21741=>3767, +26011=>3768, +26354=>3769, +26767=>3770, +31296=>3771, +12181=>3772, +35895=>3772, +40288=>3773, +22256=>3774, +22372=>3775, +23825=>3776, +26118=>3777, +26801=>3778, +26829=>3779, +28414=>3780, +29736=>3781, +34974=>3782, +39908=>3783, +27752=>3784, +12219=>3785, +39592=>3785, +20379=>3786, +20844=>3787, +20849=>3788, +21151=>3789, +23380=>3790, +12079=>3791, +24037=>3791, +24656=>3792, +24685=>3793, +25329=>3794, +25511=>3795, +25915=>3796, +29657=>3797, +31354=>3798, +34467=>3799, +36002=>3800, +38799=>3801, +20018=>3802, +63749=>3802, +23521=>3803, +12093=>3804, +25096=>3804, +26524=>3805, +12128=>3806, +29916=>3806, +31185=>3807, +33747=>3808, +35463=>3809, +35506=>3810, +36328=>3811, +36942=>3812, +37707=>3813, +38982=>3814, +24275=>3815, +64011=>3815, +27112=>3816, +34303=>3817, +37101=>3818, +20896=>3819, +23448=>3820, +23532=>3821, +24931=>3822, +26874=>3823, +27454=>3824, +28748=>3825, +29743=>3826, +29912=>3827, +31649=>3828, +32592=>3829, +33733=>3830, +35264=>3831, +36011=>3832, +38364=>3833, +39208=>3834, +21038=>3835, +24669=>3836, +25324=>3837, +36866=>3838, +20362=>3839, +20809=>3840, +21281=>3841, +22745=>3842, +24291=>3843, +26336=>3844, +27960=>3845, +28826=>3846, +29378=>3847, +29654=>3848, +31568=>3849, +33009=>3850, +37979=>3851, +21350=>3852, +25499=>3853, +32619=>3854, +20054=>3855, +20608=>3856, +22602=>3857, +22750=>3858, +24618=>3859, +24871=>3860, +25296=>3861, +27088=>3862, +39745=>3863, +23439=>3864, +32024=>3865, +32945=>3866, +36703=>3867, +20132=>3868, +20689=>3869, +21676=>3870, +21932=>3871, +23308=>3872, +23968=>3873, +24039=>3874, +25898=>3875, +25934=>3876, +26657=>3877, +27211=>3878, +29409=>3879, +30350=>3880, +30703=>3881, +32094=>3882, +32761=>3883, +33184=>3884, +34126=>3885, +34527=>3886, +36611=>3887, +36686=>3888, +37066=>3889, +39171=>3890, +39509=>3891, +39851=>3892, +19992=>3893, +20037=>3894, +20061=>3895, +20167=>3896, +20465=>3897, +20855=>3898, +21246=>3899, +21312=>3900, +12061=>3901, +21475=>3901, +21477=>3902, +63750=>3902, +21646=>3903, +22036=>3904, +22389=>3905, +22434=>3906, +23495=>3907, +23943=>3908, +24272=>3909, +25084=>3910, +25304=>3911, +25937=>3912, +26552=>3913, +26601=>3914, +27083=>3915, +27472=>3916, +27590=>3917, +27628=>3918, +27714=>3919, +28317=>3920, +28792=>3921, +29399=>3922, +29590=>3923, +29699=>3924, +30655=>3925, +30697=>3926, +31350=>3927, +32127=>3928, +32777=>3929, +12165=>3930, +33276=>3930, +33285=>3931, +33290=>3932, +33503=>3933, +34914=>3934, +35635=>3935, +36092=>3936, +36544=>3937, +36881=>3938, +37041=>3939, +37476=>3940, +37558=>3941, +39378=>3942, +39493=>3943, +40169=>3944, +40407=>3945, +12244=>3946, +40860=>3946, +63751=>3946, +63752=>3946, +22283=>3947, +23616=>3948, +33738=>3949, +38816=>3950, +38827=>3951, +40628=>3952, +21531=>3953, +31384=>3954, +32676=>3955, +35033=>3956, +36557=>3957, +37089=>3958, +22528=>3959, +23624=>3960, +25496=>3961, +31391=>3962, +23470=>3963, +12088=>3964, +24339=>3964, +31353=>3965, +31406=>3966, +33422=>3967, +36524=>3968, +20518=>3969, +21048=>3970, +21240=>3971, +21367=>3972, +22280=>3973, +25331=>3974, +25458=>3975, +27402=>3976, +28099=>3977, +30519=>3978, +21413=>3979, +29527=>3980, +34152=>3981, +36470=>3982, +38357=>3983, +26426=>3984, +27331=>3985, +28528=>3986, +35437=>3987, +36556=>3988, +39243=>3989, +26231=>3990, +27512=>3991, +36020=>3992, +12225=>3993, +39740=>3993, +21483=>3994, +22317=>3995, +22862=>3996, +25542=>3997, +27131=>3998, +29674=>3999, +30789=>4000, +31418=>4001, +31429=>4002, +31998=>4003, +33909=>4004, +35215=>4005, +36211=>4006, +36917=>4007, +38312=>4008, +21243=>4009, +22343=>4010, +30023=>4011, +31584=>4012, +33740=>4013, +37406=>4014, +27224=>4015, +20811=>4016, +21067=>4017, +21127=>4018, +25119=>4019, +26840=>4020, +26997=>4021, +38553=>4022, +20677=>4023, +21156=>4024, +21220=>4025, +25027=>4026, +12100=>4027, +26020=>4027, +26681=>4028, +27135=>4029, +29822=>4030, +31563=>4031, +33465=>4032, +33771=>4033, +35250=>4034, +35641=>4035, +36817=>4036, +39241=>4037, +20170=>4038, +22935=>4039, +25810=>4040, +26129=>4041, +27278=>4042, +29748=>4043, +31105=>4044, +31165=>4045, +33449=>4046, +34942=>4047, +34943=>4048, +35167=>4049, +37670=>4050, +20235=>4051, +21450=>4052, +24613=>4053, +25201=>4054, +27762=>4055, +32026=>4056, +32102=>4057, +20120=>4058, +20834=>4059, +30684=>4060, +32943=>4061, +20225=>4062, +20238=>4063, +20854=>4064, +20864=>4065, +21980=>4066, +22120=>4067, +22331=>4068, +22522=>4069, +22524=>4070, +22804=>4071, +22855=>4072, +22931=>4073, +23492=>4074, +23696=>4075, +23822=>4076, +12080=>4077, +24049=>4077, +24190=>4078, +24524=>4079, +25216=>4080, +26071=>4081, +26083=>4082, +26398=>4083, +26399=>4084, +26462=>4085, +26827=>4086, +26820=>4087, +27231=>4088, +27450=>4089, +27683=>4090, +27773=>4091, +27778=>4092, +28103=>4093, +29592=>4094, +29734=>4095, +29738=>4096, +29826=>4097, +29859=>4098, +30072=>4099, +30079=>4100, +30849=>4101, +30959=>4102, +31041=>4103, +31047=>4104, +31048=>4105, +31098=>4106, +31637=>4107, +32000=>4108, +32186=>4109, +32648=>4110, +32774=>4111, +32813=>4112, +32908=>4113, +35352=>4114, +35663=>4115, +35912=>4116, +63744=>4116, +36215=>4117, +37665=>4118, +37668=>4119, +39138=>4120, +39249=>4121, +39438=>4122, +39439=>4123, +39525=>4124, +40594=>4125, +32202=>4126, +20342=>4127, +21513=>4128, +25326=>4129, +26708=>4130, +12198=>4131, +37329=>4131, +63754=>4131, +21931=>4132, +20794=>4133, +23068=>4134, +25062=>4135, +25295=>4136, +63835=>4136, +25343=>4137, +37027=>4138, +35582=>4139, +63837=>4139, +26262=>4140, +29014=>4141, +38627=>4142, +25423=>4143, +25466=>4144, +21335=>4145, +26511=>4146, +26976=>4147, +28275=>4148, +30007=>4149, +32013=>4150, +34930=>4151, +22218=>4152, +23064=>4153, +20035=>4154, +20839=>4155, +22856=>4156, +63756=>4156, +26608=>4157, +32784=>4158, +12069=>4159, +22899=>4159, +63873=>4159, +24180=>4160, +63886=>4160, +25754=>4161, +63889=>4161, +31178=>4162, +63893=>4162, +24565=>4163, +63907=>4163, +24684=>4164, +25288=>4165, +25467=>4166, +63908=>4166, +23527=>4167, +63839=>4167, +63914=>4167, +23511=>4168, +21162=>4169, +22900=>4170, +24361=>4171, +24594=>4172, +63840=>4172, +29785=>4173, +39377=>4174, +28611=>4175, +33215=>4176, +36786=>4177, +24817=>4178, +33126=>4179, +23615=>4180, +63933=>4180, +23273=>4181, +35365=>4182, +26491=>4183, +63944=>4183, +32016=>4184, +63951=>4184, +33021=>4185, +23612=>4186, +27877=>4187, +63971=>4187, +21311=>4188, +63979=>4188, +28346=>4189, +63980=>4189, +22810=>4190, +33590=>4191, +63998=>4191, +20025=>4192, +63838=>4192, +20150=>4193, +20294=>4194, +21934=>4195, +22296=>4196, +22727=>4197, +24406=>4198, +26039=>4199, +26086=>4200, +27264=>4201, +27573=>4202, +28237=>4203, +30701=>4204, +31471=>4205, +31774=>4206, +32222=>4207, +34507=>4208, +34962=>4209, +37170=>4210, +37723=>4211, +25787=>4212, +28606=>4213, +29562=>4214, +30136=>4215, +36948=>4216, +21846=>4217, +22349=>4218, +25018=>4219, +25812=>4220, +26311=>4221, +28129=>4222, +28251=>4223, +28525=>4224, +28601=>4225, +30192=>4226, +32835=>4227, +33213=>4228, +34113=>4229, +35203=>4230, +35527=>4231, +35674=>4232, +37663=>4233, +27795=>4234, +30035=>4235, +31572=>4236, +36367=>4237, +36957=>4238, +21776=>4239, +22530=>4240, +22616=>4241, +24162=>4242, +25095=>4243, +25758=>4244, +26848=>4245, +30070=>4246, +31958=>4247, +64003=>4247, +34739=>4248, +40680=>4249, +20195=>4250, +22408=>4251, +22382=>4252, +12068=>4253, +22823=>4253, +23565=>4254, +23729=>4255, +24118=>4256, +24453=>4257, +25140=>4258, +25825=>4259, +29619=>4260, +33274=>4261, +34955=>4262, +36024=>4263, +38538=>4264, +40667=>4265, +23429=>4266, +64004=>4266, +24503=>4267, +24755=>4268, +20498=>4269, +12049=>4270, +20992=>4270, +21040=>4271, +22294=>4272, +22581=>4273, +22615=>4274, +23566=>4275, +23648=>4276, +23798=>4277, +23947=>4278, +24230=>4279, +64001=>4279, +24466=>4280, +24764=>4281, +25361=>4282, +25481=>4283, +25623=>4284, +26691=>4285, +26873=>4286, +27330=>4287, +28120=>4288, +28193=>4289, +28372=>4290, +28644=>4291, +29182=>4292, +30428=>4293, +30585=>4294, +31153=>4295, +31291=>4296, +33796=>4297, +35241=>4298, +36077=>4299, +36339=>4300, +36424=>4301, +36867=>4302, +36884=>4303, +36947=>4304, +37117=>4305, +37709=>4306, +38518=>4307, +38876=>4308, +27602=>4309, +28678=>4310, +29272=>4311, +29346=>4312, +29544=>4313, +30563=>4314, +31167=>4315, +31716=>4316, +32411=>4317, +35712=>4318, +63834=>4318, +22697=>4319, +24775=>4320, +25958=>4321, +26109=>4322, +26302=>4323, +27788=>4324, +28958=>4325, +29129=>4326, +35930=>4327, +38931=>4328, +20077=>4329, +31361=>4330, +20189=>4331, +20908=>4332, +20941=>4333, +21205=>4334, +21516=>4335, +24999=>4336, +26481=>4337, +26704=>4338, +26847=>4339, +27934=>4340, +64005=>4340, +28540=>4341, +30140=>4342, +30643=>4343, +31461=>4344, +33012=>4345, +33891=>4346, +37509=>4347, +20828=>4348, +12099=>4349, +26007=>4349, +26460=>4350, +26515=>4351, +30168=>4352, +31431=>4353, +33651=>4354, +12182=>4355, +35910=>4355, +36887=>4356, +38957=>4357, +23663=>4358, +33216=>4359, +33434=>4360, +36929=>4361, +36975=>4362, +37389=>4363, +24471=>4364, +23965=>4365, +27225=>4366, +29128=>4367, +30331=>4368, +31561=>4369, +34276=>4370, +35588=>4371, +37159=>4372, +39472=>4373, +21895=>4374, +63755=>4374, +25078=>4375, +63757=>4375, +30313=>4376, +63758=>4376, +32645=>4377, +63759=>4377, +34367=>4378, +63760=>4378, +34746=>4379, +63761=>4379, +35064=>4380, +63762=>4380, +37007=>4381, +63763=>4381, +27931=>4382, +63765=>4382, +28889=>4383, +63766=>4383, +29662=>4384, +63767=>4384, +32097=>4385, +33853=>4386, +63768=>4386, +37226=>4387, +63769=>4387, +39409=>4388, +63770=>4388, +20098=>4389, +63771=>4389, +21365=>4390, +63772=>4390, +27396=>4391, +63773=>4391, +27410=>4392, +28734=>4393, +29211=>4394, +63774=>4394, +34349=>4395, +63775=>4395, +40478=>4396, +63776=>4396, +21068=>4397, +36771=>4398, +23888=>4399, +63777=>4399, +25829=>4400, +25900=>4401, +27414=>4402, +28651=>4403, +63778=>4403, +31811=>4404, +32412=>4405, +34253=>4406, +63779=>4406, +35172=>4407, +63780=>4407, +35261=>4408, +25289=>4409, +63781=>4409, +33240=>4410, +63782=>4410, +34847=>4411, +63783=>4411, +24266=>4412, +63784=>4412, +26391=>4413, +63785=>4413, +28010=>4414, +63786=>4414, +29436=>4415, +63787=>4415, +29701=>4416, +29807=>4417, +34690=>4418, +37086=>4419, +63788=>4419, +20358=>4420, +63789=>4420, +23821=>4421, +24480=>4422, +33802=>4423, +20919=>4424, +63790=>4424, +25504=>4425, +63861=>4425, +30053=>4426, +63862=>4426, +20142=>4427, +63863=>4427, +20486=>4428, +20841=>4429, +63864=>4429, +20937=>4430, +63865=>4430, +26753=>4431, +63866=>4431, +27153=>4432, +31918=>4433, +31921=>4434, +31975=>4435, +63867=>4435, +33391=>4436, +63868=>4436, +35538=>4437, +63869=>4437, +36635=>4438, +37327=>4439, +63870=>4439, +20406=>4440, +20791=>4441, +21237=>4442, +63871=>4442, +21570=>4443, +63872=>4443, +24300=>4444, +63874=>4444, +24942=>4445, +25150=>4446, +26053=>4447, +63875=>4447, +27354=>4448, +28670=>4449, +63876=>4449, +31018=>4450, +63877=>4450, +34268=>4451, +34851=>4452, +38317=>4453, +63878=>4453, +39522=>4454, +39530=>4455, +63879=>4455, +40599=>4456, +63880=>4456, +40654=>4457, +63881=>4457, +12050=>4458, +21147=>4458, +63882=>4458, +26310=>4459, +63883=>4459, +27511=>4460, +63884=>4460, +28701=>4461, +31019=>4462, +36706=>4463, +63885=>4463, +38722=>4464, +24976=>4465, +63887=>4465, +25088=>4466, +63888=>4466, +25891=>4467, +28451=>4468, +63890=>4468, +29001=>4469, +63891=>4469, +29833=>4470, +63892=>4470, +32244=>4471, +63894=>4471, +32879=>4472, +63895=>4472, +34030=>4473, +63897=>4473, +36646=>4474, +63896=>4474, +36899=>4475, +63898=>4475, +37706=>4476, +63899=>4476, +20925=>4477, +21015=>4478, +63900=>4478, +21155=>4479, +63901=>4479, +27916=>4480, +28872=>4481, +63903=>4481, +35010=>4482, +63904=>4482, +24265=>4483, +63906=>4483, +25986=>4484, +27566=>4485, +63909=>4485, +28610=>4486, +31806=>4487, +63910=>4487, +29557=>4488, +63911=>4488, +20196=>4489, +63912=>4489, +20278=>4490, +22265=>4491, +63913=>4491, +23738=>4492, +23994=>4493, +63915=>4493, +24604=>4494, +63916=>4494, +29618=>4495, +63917=>4495, +31533=>4496, +32666=>4497, +63919=>4497, +32718=>4498, +32838=>4499, +63920=>4499, +36894=>4500, +37428=>4501, +63921=>4501, +38646=>4502, +63922=>4502, +38728=>4503, +63923=>4503, +38936=>4504, +63924=>4504, +40801=>4505, +20363=>4506, +63925=>4506, +28583=>4507, +31150=>4508, +63926=>4508, +37300=>4509, +63927=>4509, +38583=>4510, +63928=>4510, +21214=>4511, +63791=>4511, +25736=>4512, +25796=>4513, +63792=>4513, +27347=>4514, +63793=>4514, +28510=>4515, +28696=>4516, +29200=>4517, +63794=>4517, +30439=>4518, +63795=>4518, +12156=>4519, +32769=>4519, +63796=>4519, +34310=>4520, +63797=>4520, +34396=>4521, +63798=>4521, +36335=>4522, +63799=>4522, +36613=>4523, +38706=>4524, +63800=>4524, +39791=>4525, +63801=>4525, +40442=>4526, +63802=>4526, +12228=>4527, +40565=>4527, +30860=>4528, +63803=>4528, +31103=>4529, +63804=>4529, +32160=>4530, +63805=>4530, +33737=>4531, +63806=>4531, +37636=>4532, +63807=>4532, +12229=>4533, +40575=>4533, +63808=>4533, +40595=>4534, +35542=>4535, +63809=>4535, +22751=>4536, +63810=>4536, +24324=>4537, +63811=>4537, +26407=>4538, +28711=>4539, +29903=>4540, +31840=>4541, +63812=>4541, +32894=>4542, +63813=>4542, +20769=>4543, +28712=>4544, +29282=>4545, +63814=>4545, +30922=>4546, +63815=>4546, +36034=>4547, +63816=>4547, +36058=>4548, +36084=>4549, +38647=>4550, +63817=>4550, +20102=>4551, +63930=>4551, +20698=>4552, +63931=>4552, +23534=>4553, +63932=>4553, +24278=>4554, +26009=>4555, +63934=>4555, +29134=>4556, +63936=>4556, +30274=>4557, +63937=>4557, +30637=>4558, +32842=>4559, +34044=>4560, +63938=>4560, +36988=>4561, +63939=>4561, +39719=>4562, +12243=>4563, +40845=>4563, +63940=>4563, +22744=>4564, +63818=>4564, +23105=>4565, +23650=>4566, +63819=>4566, +27155=>4567, +63820=>4567, +28122=>4568, +63821=>4568, +28431=>4569, +63822=>4569, +30267=>4570, +32047=>4571, +63823=>4571, +32311=>4572, +63824=>4572, +34078=>4573, +35128=>4574, +37860=>4575, +38475=>4576, +63825=>4576, +21129=>4577, +63943=>4577, +26066=>4578, +26611=>4579, +63945=>4579, +27060=>4580, +27969=>4581, +63946=>4581, +28316=>4582, +63947=>4582, +28687=>4583, +29705=>4584, +63948=>4584, +29792=>4585, +30041=>4586, +63949=>4586, +30244=>4587, +30827=>4588, +63950=>4588, +35628=>4589, +39006=>4590, +63952=>4590, +20845=>4591, +63953=>4591, +25134=>4592, +63954=>4592, +38520=>4593, +63955=>4593, +20374=>4594, +20523=>4595, +63956=>4595, +23833=>4596, +63957=>4596, +28138=>4597, +63958=>4597, +32184=>4598, +36650=>4599, +63959=>4599, +24459=>4600, +63960=>4600, +24900=>4601, +63961=>4601, +26647=>4602, +63962=>4602, +38534=>4603, +63964=>4603, +21202=>4604, +63826=>4604, +32907=>4605, +63827=>4605, +20956=>4606, +63828=>4606, +20940=>4607, +63829=>4607, +26974=>4608, +31260=>4609, +63830=>4609, +32190=>4610, +63831=>4610, +33777=>4611, +63832=>4611, +38517=>4612, +63833=>4612, +20442=>4613, +21033=>4614, +63965=>4614, +21400=>4615, +21519=>4616, +63966=>4616, +21774=>4617, +23653=>4618, +63967=>4618, +24743=>4619, +26446=>4620, +63969=>4620, +26792=>4621, +63970=>4621, +28012=>4622, +29313=>4623, +29432=>4624, +29702=>4625, +63972=>4625, +29827=>4626, +30178=>4627, +63973=>4627, +31852=>4628, +32633=>4629, +63974=>4629, +32696=>4630, +33673=>4631, +35023=>4632, +63975=>4632, +35041=>4633, +63976=>4633, +12197=>4634, +37324=>4634, +63977=>4634, +37328=>4635, +38626=>4636, +63978=>4636, +39881=>4637, +21533=>4638, +63981=>4638, +28542=>4639, +29136=>4640, +63982=>4640, +29848=>4641, +63983=>4641, +34298=>4642, +63984=>4642, +36522=>4643, +38563=>4644, +63985=>4644, +40023=>4645, +63986=>4645, +40607=>4646, +63987=>4646, +26519=>4647, +63988=>4647, +28107=>4648, +63989=>4648, +29747=>4649, +33256=>4650, +63990=>4650, +38678=>4651, +30764=>4652, +12148=>4653, +31435=>4653, +63991=>4653, +31520=>4654, +63992=>4654, +31890=>4655, +63993=>4655, +25705=>4656, +29802=>4657, +30194=>4658, +30908=>4659, +30952=>4660, +12218=>4661, +39340=>4661, +39764=>4662, +12231=>4663, +40635=>4663, +23518=>4664, +24149=>4665, +28448=>4666, +33180=>4667, +33707=>4668, +37000=>4669, +19975=>4670, +21325=>4671, +23081=>4672, +24018=>4673, +24398=>4674, +24930=>4675, +25405=>4676, +26217=>4677, +26364=>4678, +28415=>4679, +28459=>4680, +28771=>4681, +30622=>4682, +33836=>4683, +34067=>4684, +34875=>4685, +36627=>4686, +39237=>4687, +39995=>4688, +21788=>4689, +25273=>4690, +26411=>4691, +27819=>4692, +33545=>4693, +35178=>4694, +38778=>4695, +20129=>4696, +22916=>4697, +24536=>4698, +24537=>4699, +26395=>4700, +32178=>4701, +32596=>4702, +33426=>4703, +33579=>4704, +33725=>4705, +36638=>4706, +37017=>4707, +22475=>4708, +22969=>4709, +23186=>4710, +23504=>4711, +26151=>4712, +26522=>4713, +26757=>4714, +27599=>4715, +29028=>4716, +32629=>4717, +36023=>4718, +36067=>4719, +36993=>4720, +39749=>4721, +33032=>4722, +35978=>4723, +38476=>4724, +39488=>4725, +12230=>4726, +40613=>4726, +23391=>4727, +27667=>4728, +29467=>4729, +30450=>4730, +30431=>4731, +33804=>4732, +20906=>4733, +35219=>4734, +20813=>4735, +20885=>4736, +21193=>4737, +26825=>4738, +27796=>4739, +30468=>4740, +30496=>4741, +32191=>4742, +32236=>4743, +12207=>4744, +38754=>4744, +40629=>4745, +28357=>4746, +34065=>4747, +20901=>4748, +21517=>4749, +21629=>4750, +26126=>4751, +26269=>4752, +26919=>4753, +28319=>4754, +12139=>4755, +30399=>4755, +30609=>4756, +33559=>4757, +33986=>4758, +34719=>4759, +37225=>4760, +37528=>4761, +40180=>4762, +34946=>4763, +20398=>4764, +20882=>4765, +21215=>4766, +22982=>4767, +24125=>4768, +24917=>4769, +25720=>4770, +25721=>4771, +26286=>4772, +26576=>4773, +27169=>4774, +27597=>4775, +12113=>4776, +27611=>4776, +29279=>4777, +29281=>4778, +29761=>4779, +30520=>4780, +12141=>4781, +30683=>4781, +32791=>4782, +33468=>4783, +33541=>4784, +35584=>4785, +35624=>4786, +35980=>4787, +12106=>4788, +26408=>4788, +27792=>4789, +29287=>4790, +12140=>4791, +30446=>4791, +30566=>4792, +31302=>4793, +40361=>4794, +27519=>4795, +27794=>4796, +22818=>4797, +26406=>4798, +33945=>4799, +21359=>4800, +22675=>4801, +22937=>4802, +24287=>4803, +25551=>4804, +26164=>4805, +26483=>4806, +28218=>4807, +29483=>4808, +31447=>4809, +33495=>4810, +37672=>4811, +21209=>4812, +24043=>4813, +25006=>4814, +25035=>4815, +25098=>4816, +25287=>4817, +25771=>4818, +12102=>4819, +26080=>4819, +26969=>4820, +27494=>4821, +12111=>4822, +27595=>4822, +28961=>4823, +29687=>4824, +30045=>4825, +32326=>4826, +33310=>4827, +33538=>4828, +34154=>4829, +35491=>4830, +36031=>4831, +38695=>4832, +40289=>4833, +22696=>4834, +40664=>4835, +20497=>4836, +21006=>4837, +21563=>4838, +21839=>4839, +12098=>4840, +25991=>4840, +27766=>4841, +32010=>4842, +32011=>4843, +32862=>4844, +34442=>4845, +12200=>4846, +38272=>4846, +38639=>4847, +21247=>4848, +27797=>4849, +29289=>4850, +21619=>4851, +23194=>4852, +23614=>4853, +23883=>4854, +24396=>4855, +24494=>4856, +26410=>4857, +26806=>4858, +26979=>4859, +28220=>4860, +28228=>4861, +30473=>4862, +12150=>4863, +31859=>4863, +32654=>4864, +34183=>4865, +35598=>4866, +36855=>4867, +38753=>4868, +40692=>4869, +23735=>4870, +24758=>4871, +24845=>4872, +25003=>4873, +25935=>4874, +26107=>4875, +26108=>4876, +27665=>4877, +27887=>4878, +29599=>4879, +29641=>4880, +32225=>4881, +38292=>4882, +23494=>4883, +34588=>4884, +35600=>4885, +21085=>4886, +21338=>4887, +25293=>4888, +25615=>4889, +25778=>4890, +26420=>4891, +27192=>4892, +27850=>4893, +29632=>4894, +29854=>4895, +31636=>4896, +31893=>4897, +32283=>4898, +33162=>4899, +33334=>4900, +34180=>4901, +36843=>4902, +38649=>4903, +39361=>4904, +20276=>4905, +21322=>4906, +21453=>4907, +21467=>4908, +25292=>4909, +25644=>4910, +25856=>4911, +26001=>4912, +27075=>4913, +27886=>4914, +28504=>4915, +29677=>4916, +30036=>4917, +30242=>4918, +30436=>4919, +30460=>4920, +30928=>4921, +30971=>4922, +63844=>4922, +31020=>4923, +32070=>4924, +33324=>4925, +34784=>4926, +36820=>4927, +38930=>4928, +39151=>4929, +21187=>4930, +25300=>4931, +25765=>4932, +28196=>4933, +28497=>4934, +30332=>4935, +36299=>4936, +37297=>4937, +37474=>4938, +39662=>4939, +39747=>4940, +20515=>4941, +20621=>4942, +22346=>4943, +22952=>4944, +23592=>4945, +24135=>4946, +24439=>4947, +25151=>4948, +25918=>4949, +12101=>4950, +26041=>4950, +26049=>4951, +26121=>4952, +26507=>4953, +27036=>4954, +28354=>4955, +30917=>4956, +32033=>4957, +32938=>4958, +33152=>4959, +33323=>4960, +33459=>4961, +33953=>4962, +34444=>4963, +35370=>4964, +35607=>4965, +37030=>4966, +38450=>4967, +40848=>4968, +20493=>4969, +20467=>4970, +22521=>4971, +24472=>4972, +25308=>4973, +25490=>4974, +26479=>4975, +28227=>4976, +28953=>4977, +30403=>4978, +32972=>4979, +32986=>4980, +35060=>4981, +35061=>4982, +35097=>4983, +36064=>4984, +36649=>4985, +37197=>4986, +38506=>4987, +20271=>4988, +20336=>4989, +24091=>4990, +26575=>4991, +26658=>4992, +12137=>4993, +30333=>4993, +30334=>4994, +39748=>4995, +24161=>4996, +27146=>4997, +29033=>4998, +29140=>4999, +30058=>5000, +32321=>5001, +34115=>5002, +34281=>5003, +39132=>5004, +20240=>5005, +31567=>5006, +32624=>5007, +38309=>5008, +20961=>5009, +24070=>5010, +26805=>5011, +27710=>5012, +27726=>5013, +27867=>5014, +29359=>5015, +31684=>5016, +33539=>5017, +27861=>5018, +29754=>5019, +20731=>5020, +21128=>5021, +22721=>5022, +25816=>5023, +27287=>5024, +29863=>5025, +30294=>5026, +30887=>5027, +34327=>5028, +38370=>5029, +38713=>5030, +21342=>5031, +24321=>5032, +35722=>5033, +36776=>5034, +36783=>5035, +37002=>5036, +21029=>5037, +30629=>5038, +40009=>5039, +40712=>5040, +19993=>5041, +20482=>5042, +20853=>5043, +23643=>5044, +24183=>5045, +26142=>5046, +26170=>5047, +26564=>5048, +26821=>5049, +28851=>5050, +29953=>5051, +30149=>5052, +31177=>5053, +31453=>5054, +36647=>5055, +39200=>5056, +39432=>5057, +20445=>5058, +22561=>5059, +22577=>5060, +23542=>5061, +26222=>5062, +27493=>5063, +27921=>5064, +28282=>5065, +28541=>5066, +29668=>5067, +29995=>5068, +33769=>5069, +35036=>5070, +35091=>5071, +35676=>5072, +36628=>5073, +20239=>5074, +20693=>5075, +21264=>5076, +12056=>5077, +21340=>5077, +23443=>5078, +24489=>5079, +63846=>5079, +26381=>5080, +31119=>5081, +33145=>5082, +33583=>5083, +34068=>5084, +35079=>5085, +35206=>5086, +36665=>5087, +36667=>5088, +64007=>5088, +39333=>5089, +39954=>5090, +26412=>5091, +20086=>5092, +20472=>5093, +22857=>5094, +23553=>5095, +23791=>5096, +23792=>5097, +25447=>5098, +26834=>5099, +28925=>5100, +29090=>5101, +29739=>5102, +32299=>5103, +34028=>5104, +34562=>5105, +36898=>5106, +37586=>5107, +40179=>5108, +19981=>5109, +63847=>5109, +20184=>5110, +20463=>5111, +20613=>5112, +21078=>5113, +21103=>5114, +21542=>5115, +21648=>5116, +22496=>5117, +22827=>5118, +23142=>5119, +23386=>5120, +23413=>5121, +23500=>5122, +24220=>5123, +25206=>5124, +25975=>5125, +26023=>5126, +28014=>5127, +28325=>5128, +12119=>5129, +29238=>5129, +31526=>5130, +31807=>5131, +12152=>5132, +32566=>5132, +33104=>5133, +33105=>5134, +33178=>5135, +33344=>5136, +33433=>5137, +33705=>5138, +35331=>5139, +36000=>5140, +36070=>5141, +36091=>5142, +36212=>5143, +36282=>5144, +37096=>5145, +37340=>5146, +12201=>5147, +38428=>5147, +38468=>5148, +39385=>5149, +40167=>5150, +21271=>5151, +63843=>5151, +20998=>5152, +21545=>5153, +22132=>5154, +22707=>5155, +22868=>5156, +22894=>5157, +24575=>5158, +24996=>5159, +25198=>5160, +26128=>5161, +27774=>5162, +28954=>5163, +30406=>5164, +31881=>5165, +31966=>5166, +32027=>5167, +33452=>5168, +36033=>5169, +38640=>5170, +20315=>5171, +24343=>5172, +24447=>5173, +25282=>5174, +23849=>5175, +26379=>5176, +26842=>5177, +30844=>5178, +32323=>5179, +40300=>5180, +19989=>5181, +20633=>5182, +12052=>5183, +21269=>5183, +21290=>5184, +21329=>5185, +22915=>5186, +23138=>5187, +24199=>5188, +24754=>5189, +24970=>5190, +25161=>5191, +25209=>5192, +26000=>5193, +26503=>5194, +27047=>5195, +12112=>5196, +27604=>5196, +27606=>5197, +27607=>5198, +27608=>5199, +27832=>5200, +29749=>5201, +30202=>5202, +30738=>5203, +30865=>5204, +31189=>5205, +31192=>5206, +31875=>5207, +32203=>5208, +32737=>5209, +32933=>5210, +33086=>5211, +33218=>5212, +33778=>5213, +34586=>5214, +35048=>5215, +35513=>5216, +35692=>5217, +36027=>5218, +37145=>5219, +12206=>5220, +38750=>5220, +12214=>5221, +39131=>5221, +12240=>5222, +40763=>5222, +22188=>5223, +23338=>5224, +24428=>5225, +25996=>5226, +27315=>5227, +27567=>5228, +27996=>5229, +28657=>5230, +28693=>5231, +29277=>5232, +29613=>5233, +36007=>5234, +36051=>5235, +38971=>5236, +24977=>5237, +27703=>5238, +32856=>5239, +39425=>5240, +20045=>5241, +20107=>5242, +20123=>5243, +20181=>5244, +20282=>5245, +20284=>5246, +20351=>5247, +20447=>5248, +20735=>5249, +21490=>5250, +21496=>5251, +21766=>5252, +21987=>5253, +22235=>5254, +12064=>5255, +22763=>5255, +22882=>5256, +23057=>5257, +23531=>5258, +23546=>5259, +23556=>5260, +24051=>5261, +24107=>5262, +24473=>5263, +24605=>5264, +25448=>5265, +26012=>5266, +26031=>5267, +26614=>5268, +26619=>5269, +26797=>5270, +27515=>5271, +27801=>5272, +27863=>5273, +28195=>5274, +28681=>5275, +29509=>5276, +30722=>5277, +31038=>5278, +31040=>5279, +31072=>5280, +31169=>5281, +31721=>5282, +32023=>5283, +32114=>5284, +32902=>5285, +33293=>5286, +33678=>5287, +34001=>5288, +34503=>5289, +35039=>5290, +35408=>5291, +35422=>5292, +35613=>5293, +36060=>5294, +36198=>5295, +36781=>5296, +37034=>5297, +39164=>5298, +39391=>5299, +40605=>5300, +21066=>5301, +26388=>5302, +20632=>5303, +21034=>5304, +12077=>5305, +23665=>5305, +25955=>5306, +27733=>5307, +29642=>5308, +29987=>5309, +30109=>5310, +31639=>5311, +33948=>5312, +37240=>5313, +38704=>5314, +20087=>5315, +25746=>5316, +27578=>5317, +63856=>5317, +29022=>5318, +34217=>5319, +19977=>5320, +26441=>5321, +26862=>5322, +28183=>5323, +33439=>5324, +34072=>5325, +34923=>5326, +25591=>5327, +28545=>5328, +37394=>5329, +39087=>5330, +19978=>5331, +20663=>5332, +20687=>5333, +20767=>5334, +21830=>5335, +21930=>5336, +22039=>5337, +23360=>5338, +23577=>5339, +23776=>5340, +24120=>5341, +24202=>5342, +24224=>5343, +24258=>5344, +24819=>5345, +26705=>5346, +27233=>5347, +28248=>5348, +29245=>5349, +29248=>5350, +29376=>5351, +63994=>5351, +30456=>5352, +31077=>5353, +31665=>5354, +32724=>5355, +35059=>5356, +35316=>5357, +35443=>5358, +35937=>5359, +36062=>5360, +38684=>5361, +22622=>5362, +63852=>5362, +29885=>5363, +36093=>5364, +21959=>5365, +31329=>5366, +32034=>5367, +63850=>5367, +12170=>5368, +33394=>5368, +29298=>5369, +12131=>5370, +29983=>5370, +29989=>5371, +31513=>5372, +22661=>5373, +22779=>5374, +23996=>5375, +24207=>5376, +24246=>5377, +24464=>5378, +24661=>5379, +25234=>5380, +25471=>5381, +25933=>5382, +26257=>5383, +26329=>5384, +26360=>5385, +26646=>5386, +26866=>5387, +29312=>5388, +29790=>5389, +31598=>5390, +32110=>5391, +32214=>5392, +32626=>5393, +32997=>5394, +33298=>5395, +34223=>5396, +35199=>5397, +35475=>5398, +36893=>5399, +37604=>5400, +12233=>5401, +40653=>5401, +12239=>5402, +40736=>5402, +12067=>5403, +22805=>5403, +22893=>5404, +24109=>5405, +24796=>5406, +26132=>5407, +26227=>5408, +26512=>5409, +27728=>5410, +28101=>5411, +28511=>5412, +12143=>5413, +30707=>5413, +30889=>5414, +33990=>5415, +37323=>5416, +37675=>5417, +20185=>5418, +20682=>5419, +20808=>5420, +21892=>5421, +23307=>5422, +23459=>5423, +25159=>5424, +25982=>5425, +26059=>5426, +28210=>5427, +29053=>5428, +29697=>5429, +29764=>5430, +29831=>5431, +29887=>5432, +30316=>5433, +31146=>5434, +32218=>5435, +32341=>5436, +32680=>5437, +33146=>5438, +33203=>5439, +33337=>5440, +34330=>5441, +34796=>5442, +35445=>5443, +36323=>5444, +36984=>5445, +37521=>5446, +37925=>5447, +39245=>5448, +39854=>5449, +21352=>5450, +23633=>5451, +26964=>5452, +27844=>5453, +27945=>5454, +28203=>5455, +12166=>5456, +33292=>5456, +34203=>5457, +35131=>5458, +35373=>5459, +35498=>5460, +63855=>5460, +63905=>5460, +38634=>5461, +40807=>5462, +21089=>5463, +26297=>5464, +27570=>5465, +32406=>5466, +34814=>5467, +36109=>5468, +38275=>5469, +38493=>5470, +25885=>5471, +28041=>5472, +29166=>5473, +22478=>5474, +22995=>5475, +23468=>5476, +24615=>5477, +24826=>5478, +25104=>5479, +26143=>5480, +26207=>5481, +29481=>5482, +29689=>5483, +30427=>5484, +30465=>5485, +63853=>5485, +31596=>5486, +32854=>5487, +32882=>5488, +33125=>5489, +35488=>5490, +37266=>5491, +19990=>5492, +21218=>5493, +27506=>5494, +27927=>5495, +31237=>5496, +31545=>5497, +32048=>5498, +36016=>5499, +21484=>5500, +22063=>5501, +22609=>5502, +23477=>5503, +12073=>5504, +23567=>5504, +23569=>5505, +24034=>5506, +25152=>5507, +25475=>5508, +25620=>5509, +26157=>5510, +26803=>5511, +27836=>5512, +28040=>5513, +28335=>5514, +28703=>5515, +28836=>5516, +29138=>5517, +29990=>5518, +30095=>5519, +30094=>5520, +30233=>5521, +31505=>5522, +31712=>5523, +31787=>5524, +32032=>5525, +32057=>5526, +34092=>5527, +34157=>5528, +34311=>5529, +35380=>5530, +36877=>5531, +36961=>5532, +37045=>5533, +37559=>5534, +38902=>5535, +39479=>5536, +20439=>5537, +23660=>5538, +26463=>5539, +28049=>5540, +31903=>5541, +32396=>5542, +35606=>5543, +36118=>5544, +36895=>5545, +23403=>5546, +24061=>5547, +25613=>5548, +33984=>5549, +36956=>5550, +39137=>5551, +29575=>5552, +63841=>5552, +63963=>5552, +23435=>5553, +24730=>5554, +26494=>5555, +28126=>5556, +35359=>5557, +35494=>5558, +36865=>5559, +38924=>5560, +21047=>5561, +28753=>5562, +30862=>5563, +37782=>5564, +34928=>5565, +37335=>5566, +20462=>5567, +21463=>5568, +22013=>5569, +22234=>5570, +22402=>5571, +22781=>5572, +23234=>5573, +23432=>5574, +23723=>5575, +23744=>5576, +24101=>5577, +24833=>5578, +25101=>5579, +12095=>5580, +25163=>5580, +25480=>5581, +25628=>5582, +25910=>5583, +25976=>5584, +63849=>5584, +27193=>5585, +27530=>5586, +12116=>5587, +27700=>5587, +27929=>5588, +28465=>5589, +29159=>5590, +29417=>5591, +29560=>5592, +29703=>5593, +29874=>5594, +30246=>5595, +30561=>5596, +31168=>5597, +31319=>5598, +31466=>5599, +31929=>5600, +32143=>5601, +32172=>5602, +32353=>5603, +32670=>5604, +33065=>5605, +33585=>5606, +33936=>5607, +34010=>5608, +34282=>5609, +34966=>5610, +35504=>5611, +35728=>5612, +36664=>5613, +36930=>5614, +36995=>5615, +37228=>5616, +37526=>5617, +37561=>5618, +38539=>5619, +38567=>5620, +38568=>5621, +38614=>5622, +38656=>5623, +38920=>5624, +12216=>5625, +39318=>5625, +39635=>5626, +39706=>5627, +21460=>5628, +22654=>5629, +22809=>5630, +23408=>5631, +23487=>5632, +28113=>5633, +28506=>5634, +29087=>5635, +29729=>5636, +29881=>5637, +32901=>5638, +33789=>5639, +24033=>5640, +24455=>5641, +24490=>5642, +24642=>5643, +26092=>5644, +26642=>5645, +26991=>5646, +27219=>5647, +27529=>5648, +27957=>5649, +28147=>5650, +29667=>5651, +30462=>5652, +30636=>5653, +31565=>5654, +32020=>5655, +33059=>5656, +33308=>5657, +33600=>5658, +34036=>5659, +34147=>5660, +35426=>5661, +35524=>5662, +37255=>5663, +37662=>5664, +38918=>5665, +39348=>5666, +25100=>5667, +34899=>5668, +36848=>5669, +37477=>5670, +23815=>5671, +23847=>5672, +23913=>5673, +29791=>5674, +33181=>5675, +34664=>5676, +28629=>5677, +25342=>5678, +63859=>5678, +32722=>5679, +35126=>5680, +35186=>5681, +19998=>5682, +20056=>5683, +20711=>5684, +21213=>5685, +21319=>5686, +25215=>5687, +26119=>5688, +32361=>5689, +34821=>5690, +38494=>5691, +20365=>5692, +21273=>5693, +22070=>5694, +22987=>5695, +23204=>5696, +12075=>5697, +23608=>5697, +23630=>5698, +23629=>5699, +24066=>5700, +24337=>5701, +24643=>5702, +26045=>5703, +26159=>5704, +26178=>5705, +26558=>5706, +26612=>5707, +29468=>5708, +12142=>5709, +30690=>5709, +12144=>5710, +31034=>5710, +32709=>5711, +33940=>5712, +33997=>5713, +35222=>5714, +35430=>5715, +35433=>5716, +35553=>5717, +12183=>5718, +35925=>5718, +35962=>5719, +22516=>5720, +23508=>5721, +24335=>5722, +24687=>5723, +25325=>5724, +26893=>5725, +27542=>5726, +28252=>5727, +29060=>5728, +31698=>5729, +34645=>5730, +35672=>5731, +63996=>5731, +36606=>5732, +12215=>5733, +39135=>5733, +39166=>5734, +20280=>5735, +20353=>5736, +20449=>5737, +21627=>5738, +23072=>5739, +23480=>5740, +24892=>5741, +26032=>5742, +26216=>5743, +29180=>5744, +30003=>5745, +31070=>5746, +32051=>5747, +33102=>5748, +12162=>5749, +33251=>5749, +33688=>5750, +34218=>5751, +34254=>5752, +34563=>5753, +35338=>5754, +12189=>5755, +36523=>5755, +12191=>5756, +36763=>5756, +36805=>5757, +22833=>5758, +23460=>5759, +23526=>5760, +24713=>5761, +23529=>5762, +23563=>5763, +12092=>5764, +24515=>5764, +27777=>5765, +28145=>5766, +28683=>5767, +29978=>5768, +33455=>5769, +35574=>5770, +20160=>5771, +63997=>5771, +12055=>5772, +21313=>5772, +38617=>5773, +12114=>5774, +27663=>5774, +20126=>5775, +20420=>5776, +20818=>5777, +21854=>5778, +23077=>5779, +23784=>5780, +25105=>5781, +12123=>5782, +29273=>5782, +33469=>5783, +33706=>5784, +34558=>5785, +34905=>5786, +35357=>5787, +38463=>5788, +38597=>5789, +39187=>5790, +40201=>5791, +40285=>5792, +22538=>5793, +23731=>5794, +23997=>5795, +24132=>5796, +24801=>5797, +63929=>5797, +24853=>5798, +25569=>5799, +27138=>5800, +63764=>5800, +63836=>5800, +63935=>5800, +28197=>5801, +37122=>5802, +37716=>5803, +38990=>5804, +39952=>5805, +40823=>5806, +23433=>5807, +23736=>5808, +25353=>5809, +26191=>5810, +26696=>5811, +30524=>5812, +38593=>5813, +38797=>5814, +38996=>5815, +39839=>5816, +26017=>5817, +35585=>5818, +36555=>5819, +38332=>5820, +21813=>5821, +23721=>5822, +24022=>5823, +24245=>5824, +26263=>5825, +30284=>5826, +33780=>5827, +38343=>5828, +22739=>5829, +25276=>5830, +29390=>5831, +40232=>5832, +20208=>5833, +22830=>5834, +24591=>5835, +26171=>5836, +27523=>5837, +31207=>5838, +40230=>5839, +21395=>5840, +21696=>5841, +22467=>5842, +23830=>5843, +24859=>5844, +26326=>5845, +28079=>5846, +30861=>5847, +33406=>5848, +38552=>5849, +38724=>5850, +21380=>5851, +25212=>5852, +25494=>5853, +28082=>5854, +32266=>5855, +33099=>5856, +38989=>5857, +27387=>5858, +32588=>5859, +40367=>5860, +40474=>5861, +20063=>5862, +20539=>5863, +20918=>5864, +22812=>5865, +24825=>5866, +25590=>5867, +26928=>5868, +29242=>5869, +32822=>5870, +37326=>5871, +24369=>5872, +32004=>5873, +33509=>5874, +63860=>5874, +33903=>5875, +33979=>5876, +34277=>5877, +36493=>5878, +20335=>5879, +22756=>5880, +23363=>5881, +24665=>5882, +25562=>5883, +25880=>5884, +25965=>5885, +26264=>5886, +26954=>5887, +27171=>5888, +27915=>5889, +28673=>5890, +29036=>5891, +30162=>5892, +30221=>5893, +31155=>5894, +31344=>5895, +12154=>5896, +32650=>5896, +35140=>5897, +35731=>5898, +37312=>5899, +38525=>5900, +39178=>5901, +22276=>5902, +24481=>5903, +26044=>5904, +28417=>5905, +30208=>5906, +31142=>5907, +35486=>5908, +39341=>5909, +12226=>5910, +39770=>5910, +40812=>5911, +20740=>5912, +25014=>5913, +25233=>5914, +27277=>5915, +33222=>5916, +20547=>5917, +22576=>5918, +24422=>5919, +28937=>5920, +12180=>5921, +35328=>5921, +35578=>5922, +23420=>5923, +34326=>5924, +20474=>5925, +20796=>5926, +22196=>5927, +22852=>5928, +25513=>5929, +28153=>5930, +23978=>5931, +26989=>5932, +20870=>5933, +20104=>5934, +20313=>5935, +22914=>5936, +27487=>5937, +27741=>5938, +29877=>5939, +30998=>5940, +33287=>5941, +33349=>5942, +33593=>5943, +36671=>5944, +36701=>5945, +39192=>5946, +20134=>5947, +22495=>5948, +24441=>5949, +26131=>5950, +63968=>5950, +30123=>5951, +32377=>5952, +35695=>5953, +36870=>5954, +39515=>5955, +22181=>5956, +22567=>5957, +23032=>5958, +23071=>5959, +23476=>5960, +24310=>5961, +25424=>5962, +25403=>5963, +26941=>5964, +27783=>5965, +27839=>5966, +28046=>5967, +28051=>5968, +28149=>5969, +28436=>5970, +28895=>5971, +28982=>5972, +29017=>5973, +29123=>5974, +29141=>5975, +30799=>5976, +30831=>5977, +31605=>5978, +32227=>5979, +32303=>5980, +34893=>5981, +36575=>5982, +37467=>5983, +40182=>5984, +24709=>5985, +28037=>5986, +29105=>5987, +38321=>5988, +21421=>5989, +26579=>5990, +28814=>5991, +28976=>5992, +29744=>5993, +33398=>5994, +33490=>5995, +38331=>5996, +39653=>5997, +40573=>5998, +26308=>5999, +29121=>6000, +33865=>6001, +63854=>6001, +22603=>6002, +23992=>6003, +24433=>6004, +26144=>6005, +26254=>6006, +27001=>6007, +27054=>6008, +27704=>6009, +27891=>6010, +28214=>6011, +28481=>6012, +28634=>6013, +28699=>6014, +28719=>6015, +29008=>6016, +29151=>6017, +29552=>6018, +29787=>6019, +29908=>6020, +30408=>6021, +31310=>6022, +32403=>6023, +33521=>6024, +35424=>6025, +36814=>6026, +37704=>6027, +38681=>6028, +20034=>6029, +20522=>6030, +21000=>6031, +21473=>6032, +26355=>6033, +27757=>6034, +28618=>6035, +29450=>6036, +30591=>6037, +31330=>6038, +33454=>6039, +34269=>6040, +34306=>6041, +35028=>6042, +35427=>6043, +35709=>6044, +35947=>6045, +37555=>6046, +38675=>6047, +38928=>6048, +20116=>6049, +20237=>6050, +20425=>6051, +20658=>6052, +21320=>6053, +21566=>6054, +21555=>6055, +21978=>6056, +22626=>6057, +22714=>6058, +22887=>6059, +23067=>6060, +23524=>6061, +24735=>6062, +25034=>6063, +25942=>6064, +26111=>6065, +26212=>6066, +26791=>6067, +27738=>6068, +28595=>6069, +28879=>6070, +29100=>6071, +29522=>6072, +31613=>6073, +34568=>6074, +35492=>6075, +39986=>6076, +40711=>6077, +23627=>6078, +27779=>6079, +29508=>6080, +12127=>6081, +29577=>6081, +37434=>6082, +28331=>6083, +29797=>6084, +30239=>6085, +31337=>6086, +32277=>6087, +34314=>6088, +20800=>6089, +22725=>6090, +25793=>6091, +29934=>6092, +29973=>6093, +30320=>6094, +32705=>6095, +37013=>6096, +38605=>6097, +39252=>6098, +28198=>6099, +12129=>6100, +29926=>6100, +31401=>6101, +31402=>6102, +33253=>6103, +34521=>6104, +34680=>6105, +35355=>6106, +23113=>6107, +23436=>6108, +23451=>6109, +26785=>6110, +26880=>6111, +28003=>6112, +29609=>6113, +29715=>6114, +29740=>6115, +30871=>6116, +32233=>6117, +32747=>6118, +33048=>6119, +33109=>6120, +33694=>6121, +35916=>6122, +38446=>6123, +63942=>6123, +38929=>6124, +12104=>6125, +26352=>6125, +24448=>6126, +26106=>6127, +26505=>6128, +27754=>6129, +29579=>6130, +20525=>6131, +23043=>6132, +27498=>6133, +30702=>6134, +22806=>6135, +23916=>6136, +24013=>6137, +29477=>6138, +30031=>6139, +20709=>6140, +20985=>6141, +22575=>6142, +22829=>6143, +22934=>6144, +23002=>6145, +23525=>6146, +23970=>6147, +25303=>6148, +25622=>6149, +25747=>6150, +25854=>6151, +26332=>6152, +27208=>6153, +29183=>6154, +29796=>6155, +31368=>6156, +31407=>6157, +32327=>6158, +32350=>6159, +32768=>6160, +33136=>6161, +34799=>6162, +35201=>6163, +35616=>6164, +36953=>6165, +36992=>6166, +39250=>6167, +24958=>6168, +27442=>6169, +28020=>6170, +32287=>6171, +35109=>6172, +36785=>6173, +20433=>6174, +20653=>6175, +20887=>6176, +21191=>6177, +22471=>6178, +22665=>6179, +23481=>6180, +24248=>6181, +24898=>6182, +27029=>6183, +28044=>6184, +28263=>6185, +28342=>6186, +29076=>6187, +29794=>6188, +12132=>6189, +29992=>6189, +29996=>6190, +32883=>6191, +33592=>6192, +33993=>6193, +36362=>6194, +37780=>6195, +37854=>6196, +20110=>6197, +20305=>6198, +20598=>6199, +20778=>6200, +12060=>6201, +21448=>6201, +21451=>6202, +21491=>6203, +23431=>6204, +23507=>6205, +23588=>6206, +24858=>6207, +24962=>6208, +26100=>6209, +12124=>6210, +29275=>6210, +29591=>6211, +29760=>6212, +30402=>6213, +31056=>6214, +31121=>6215, +31161=>6216, +32006=>6217, +12155=>6218, +32701=>6218, +33419=>6219, +34261=>6220, +34398=>6221, +36802=>6222, +36935=>6223, +37109=>6224, +37354=>6225, +38533=>6226, +12204=>6227, +38632=>6227, +38633=>6228, +21206=>6229, +24423=>6230, +26093=>6231, +26161=>6232, +26671=>6233, +29020=>6234, +31286=>6235, +37057=>6236, +38922=>6237, +20113=>6238, +27218=>6239, +27550=>6240, +28560=>6241, +29065=>6242, +32792=>6243, +33464=>6244, +34131=>6245, +36939=>6246, +38549=>6247, +38642=>6248, +38907=>6249, +34074=>6250, +39729=>6251, +20112=>6252, +29066=>6253, +38596=>6254, +20803=>6255, +21407=>6256, +21729=>6257, +22291=>6258, +22290=>6259, +22435=>6260, +23195=>6261, +23236=>6262, +23491=>6263, +24616=>6264, +24895=>6265, +25588=>6266, +27781=>6267, +27961=>6268, +28274=>6269, +28304=>6270, +29232=>6271, +29503=>6272, +29783=>6273, +33489=>6274, +34945=>6275, +36677=>6276, +36960=>6277, +38498=>6278, +39000=>6279, +40219=>6280, +12105=>6281, +26376=>6281, +36234=>6282, +37470=>6283, +20301=>6284, +20553=>6285, +20702=>6286, +21361=>6287, +22285=>6288, +22996=>6289, +23041=>6290, +23561=>6291, +24944=>6292, +26256=>6293, +28205=>6294, +29234=>6295, +29771=>6296, +32239=>6297, +32963=>6298, +33806=>6299, +33894=>6300, +34111=>6301, +34655=>6302, +34907=>6303, +35096=>6304, +35586=>6305, +36949=>6306, +12209=>6307, +38859=>6307, +39759=>6308, +20083=>6309, +20369=>6310, +20754=>6311, +20842=>6312, +21807=>6313, +21929=>6314, +23418=>6315, +23461=>6316, +24188=>6317, +24189=>6318, +24254=>6319, +24736=>6320, +24799=>6321, +24840=>6322, +24841=>6323, +25540=>6324, +25912=>6325, +26377=>6326, +26580=>6327, +26586=>6328, +26977=>6329, +26978=>6330, +27833=>6331, +27943=>6332, +28216=>6333, +28641=>6334, +29494=>6335, +29495=>6336, +29788=>6337, +30001=>6338, +30290=>6339, +32173=>6340, +33278=>6341, +33848=>6342, +35029=>6343, +35480=>6344, +35547=>6345, +35565=>6346, +36400=>6347, +36418=>6348, +36938=>6349, +36926=>6350, +36986=>6351, +12195=>6352, +37193=>6352, +37321=>6353, +37742=>6354, +22537=>6355, +27603=>6356, +12161=>6357, +32905=>6357, +32946=>6358, +20801=>6359, +22891=>6360, +23609=>6361, +28516=>6362, +29607=>6363, +32996=>6364, +36103=>6365, +37399=>6366, +38287=>6367, +12160=>6368, +32895=>6368, +25102=>6369, +28700=>6370, +32104=>6371, +34701=>6372, +22432=>6373, +24681=>6374, +24903=>6375, +27575=>6376, +35518=>6377, +37504=>6378, +38577=>6379, +12036=>6380, +20057=>6380, +21535=>6381, +28139=>6382, +34093=>6383, +38512=>6384, +12211=>6385, +38899=>6385, +39150=>6386, +25558=>6387, +27875=>6388, +12194=>6389, +37009=>6389, +20957=>6390, +25033=>6391, +33210=>6392, +40441=>6393, +20381=>6394, +20506=>6395, +20736=>6396, +23452=>6397, +24847=>6398, +25087=>6399, +25836=>6400, +26885=>6401, +27589=>6402, +30097=>6403, +30691=>6404, +32681=>6405, +33380=>6406, +34191=>6407, +34811=>6408, +12176=>6409, +34915=>6409, +35516=>6410, +35696=>6411, +37291=>6412, +12038=>6413, +20108=>6413, +20197=>6414, +20234=>6415, +22839=>6416, +23016=>6417, +24050=>6418, +24347=>6419, +24411=>6420, +24609=>6421, +29246=>6422, +29669=>6423, +30064=>6424, +63842=>6424, +30157=>6425, +31227=>6426, +12157=>6427, +32780=>6427, +12159=>6428, +32819=>6428, +32900=>6429, +33505=>6430, +33617=>6431, +36029=>6432, +36019=>6433, +36999=>6434, +39156=>6435, +39180=>6436, +28727=>6437, +30410=>6438, +32714=>6439, +32716=>6440, +32764=>6441, +35610=>6442, +12040=>6443, +20154=>6443, +20161=>6444, +20995=>6445, +21360=>6446, +21693=>6447, +63902=>6447, +22240=>6448, +23035=>6449, +23493=>6450, +24341=>6451, +24525=>6452, +28270=>6453, +32106=>6454, +33589=>6455, +34451=>6456, +35469=>6457, +38765=>6458, +38775=>6459, +12032=>6460, +19968=>6460, +20314=>6461, +20350=>6462, +22777=>6463, +12103=>6464, +26085=>6464, +28322=>6465, +36920=>6466, +37808=>6467, +39353=>6468, +20219=>6469, +22764=>6470, +22922=>6471, +23001=>6472, +24641=>6473, +31252=>6474, +33615=>6475, +36035=>6476, +12042=>6477, +20837=>6477, +21316=>6478, +20173=>6479, +21097=>6480, +23381=>6481, +33471=>6482, +20180=>6483, +21050=>6484, +63999=>6484, +21672=>6485, +22985=>6486, +23039=>6487, +12070=>6488, +23376=>6488, +23383=>6489, +23388=>6490, +24675=>6491, +24904=>6492, +28363=>6493, +28825=>6494, +63995=>6494, +29038=>6495, +29574=>6496, +29943=>6497, +30133=>6498, +30913=>6499, +32043=>6500, +32773=>6501, +12163=>6502, +33258=>6502, +33576=>6503, +34071=>6504, +34249=>6505, +35566=>6506, +36039=>6507, +38604=>6508, +20316=>6509, +21242=>6510, +22204=>6511, +26027=>6512, +26152=>6513, +28796=>6514, +28856=>6515, +29237=>6516, +32189=>6517, +33421=>6518, +37196=>6519, +38592=>6520, +40306=>6521, +23409=>6522, +26855=>6523, +27544=>6524, +28538=>6525, +30430=>6526, +23697=>6527, +26283=>6528, +28507=>6529, +31668=>6530, +31786=>6531, +34870=>6532, +38620=>6533, +19976=>6534, +20183=>6535, +21280=>6536, +22580=>6537, +22715=>6538, +22767=>6539, +22892=>6540, +23559=>6541, +24115=>6542, +24196=>6543, +24373=>6544, +25484=>6545, +26290=>6546, +26454=>6547, +27167=>6548, +27299=>6549, +27404=>6550, +28479=>6551, +29254=>6552, +29520=>6553, +29835=>6554, +31456=>6555, +31911=>6556, +33144=>6557, +33247=>6558, +33255=>6559, +33674=>6560, +33900=>6561, +34083=>6562, +34196=>6563, +34255=>6564, +35037=>6565, +36115=>6566, +37292=>6567, +12199=>6568, +38263=>6568, +38556=>6569, +20877=>6570, +21705=>6571, +22312=>6572, +23472=>6573, +25165=>6574, +26448=>6575, +26685=>6576, +26771=>6577, +28221=>6578, +28371=>6579, +28797=>6580, +32289=>6581, +35009=>6582, +36001=>6583, +36617=>6584, +40779=>6585, +40782=>6586, +29229=>6587, +31631=>6588, +35533=>6589, +37658=>6590, +20295=>6591, +20302=>6592, +20786=>6593, +21632=>6594, +22992=>6595, +24213=>6596, +25269=>6597, +26485=>6598, +26990=>6599, +27159=>6600, +27822=>6601, +28186=>6602, +29401=>6603, +29482=>6604, +30141=>6605, +31672=>6606, +32053=>6607, +33511=>6608, +33785=>6609, +33879=>6610, +34295=>6611, +35419=>6612, +36015=>6613, +36487=>6614, +36889=>6615, +37048=>6616, +38606=>6617, +40799=>6618, +21219=>6619, +21514=>6620, +23265=>6621, +23490=>6622, +25688=>6623, +25973=>6624, +28404=>6625, +29380=>6626, +30340=>6627, +31309=>6628, +31515=>6629, +31821=>6630, +32318=>6631, +32735=>6632, +33659=>6633, +35627=>6634, +36042=>6635, +12186=>6636, +36196=>6636, +36321=>6637, +36447=>6638, +36842=>6639, +36857=>6640, +36969=>6641, +37841=>6642, +20291=>6643, +20346=>6644, +20659=>6645, +20840=>6646, +20856=>6647, +21069=>6648, +21098=>6649, +22625=>6650, +22652=>6651, +22880=>6652, +23560=>6653, +23637=>6654, +24283=>6655, +24731=>6656, +25136=>6657, +26643=>6658, +27583=>6659, +27656=>6660, +28593=>6661, +29006=>6662, +29728=>6663, +12133=>6664, +30000=>6664, +30008=>6665, +30033=>6666, +30322=>6667, +31564=>6668, +31627=>6669, +31661=>6670, +31686=>6671, +32399=>6672, +35438=>6673, +36670=>6674, +36681=>6675, +37439=>6676, +37523=>6677, +37666=>6678, +37931=>6679, +38651=>6680, +39002=>6681, +39019=>6682, +39198=>6683, +20999=>6684, +64000=>6684, +25130=>6685, +25240=>6686, +27993=>6687, +30308=>6688, +31434=>6689, +31680=>6690, +32118=>6691, +21344=>6692, +23742=>6693, +24215=>6694, +28472=>6695, +28857=>6696, +31896=>6697, +38673=>6698, +39822=>6699, +40670=>6700, +25509=>6701, +25722=>6702, +34678=>6703, +19969=>6704, +20117=>6705, +20141=>6706, +20572=>6707, +20597=>6708, +21576=>6709, +22979=>6710, +23450=>6711, +24128=>6712, +24237=>6713, +24311=>6714, +24449=>6715, +24773=>6716, +25402=>6717, +25919=>6718, +25972=>6719, +26060=>6720, +26230=>6721, +26232=>6722, +26622=>6723, +26984=>6724, +27273=>6725, +27491=>6726, +27712=>6727, +28096=>6728, +28136=>6729, +28191=>6730, +28254=>6731, +28702=>6732, +28833=>6733, +29582=>6734, +29693=>6735, +30010=>6736, +30555=>6737, +30855=>6738, +31118=>6739, +31243=>6740, +31357=>6741, +31934=>6742, +32142=>6743, +33351=>6744, +35330=>6745, +35562=>6746, +35998=>6747, +37165=>6748, +37194=>6749, +37336=>6750, +37478=>6751, +37580=>6752, +37664=>6753, +38662=>6754, +38742=>6755, +38748=>6756, +38914=>6757, +12237=>6758, +40718=>6758, +21046=>6759, +21137=>6760, +21884=>6761, +22564=>6762, +24093=>6763, +24351=>6764, +24716=>6765, +25552=>6766, +26799=>6767, +28639=>6768, +31085=>6769, +31532=>6770, +33229=>6771, +34234=>6772, +35069=>6773, +35576=>6774, +36420=>6775, +37261=>6776, +38500=>6777, +38555=>6778, +38717=>6779, +38988=>6780, +12241=>6781, +40778=>6781, +20430=>6782, +20806=>6783, +20939=>6784, +21161=>6785, +22066=>6786, +24340=>6787, +24427=>6788, +25514=>6789, +25805=>6790, +26089=>6791, +26177=>6792, +26362=>6793, +26361=>6794, +26397=>6795, +26781=>6796, +26839=>6797, +27133=>6798, +28437=>6799, +28526=>6800, +29031=>6801, +29157=>6802, +12118=>6803, +29226=>6803, +29866=>6804, +30522=>6805, +31062=>6806, +31066=>6807, +31199=>6808, +31264=>6809, +31381=>6810, +31895=>6811, +31967=>6812, +32068=>6813, +32368=>6814, +32903=>6815, +34299=>6816, +34468=>6817, +35412=>6818, +35519=>6819, +36249=>6820, +36481=>6821, +36896=>6822, +36973=>6823, +37347=>6824, +38459=>6825, +38613=>6826, +12227=>6827, +40165=>6827, +26063=>6828, +31751=>6829, +12188=>6830, +36275=>6830, +37827=>6831, +23384=>6832, +23562=>6833, +21330=>6834, +25305=>6835, +29469=>6836, +20519=>6837, +23447=>6838, +24478=>6839, +24752=>6840, +24939=>6841, +26837=>6842, +28121=>6843, +29742=>6844, +31278=>6845, +32066=>6846, +32156=>6847, +32305=>6848, +33131=>6849, +36394=>6850, +36405=>6851, +37758=>6852, +37912=>6853, +20304=>6854, +22352=>6855, +24038=>6856, +24231=>6857, +25387=>6858, +32618=>6859, +20027=>6860, +20303=>6861, +20367=>6862, +20570=>6863, +23005=>6864, +32964=>6865, +21610=>6866, +21608=>6867, +22014=>6868, +22863=>6869, +23449=>6870, +24030=>6871, +24282=>6872, +26205=>6873, +26417=>6874, +26609=>6875, +26666=>6876, +27880=>6877, +27954=>6878, +28234=>6879, +28557=>6880, +28855=>6881, +29664=>6882, +30087=>6883, +31820=>6884, +32002=>6885, +32044=>6886, +32162=>6887, +12168=>6888, +33311=>6888, +34523=>6889, +35387=>6890, +35461=>6891, +12187=>6892, +36208=>6892, +36490=>6893, +36659=>6894, +36913=>6895, +37198=>6896, +37202=>6897, +37956=>6898, +39376=>6899, +12149=>6900, +31481=>6900, +31909=>6901, +20426=>6902, +20737=>6903, +20934=>6904, +22472=>6905, +23535=>6906, +23803=>6907, +26201=>6908, +27197=>6909, +27994=>6910, +28310=>6911, +28652=>6912, +28940=>6913, +30063=>6914, +31459=>6915, +34850=>6916, +36897=>6917, +36981=>6918, +38603=>6919, +39423=>6920, +33537=>6921, +20013=>6922, +20210=>6923, +34886=>6924, +37325=>6925, +21373=>6926, +27355=>6927, +26987=>6928, +27713=>6929, +33914=>6930, +22686=>6931, +24974=>6932, +26366=>6933, +25327=>6934, +28893=>6935, +29969=>6936, +30151=>6937, +32338=>6938, +33976=>6939, +35657=>6940, +36104=>6941, +20043=>6942, +21482=>6943, +21675=>6944, +22320=>6945, +22336=>6946, +24535=>6947, +25345=>6948, +25351=>6949, +25711=>6950, +12096=>6951, +25903=>6951, +26088=>6952, +26234=>6953, +26525=>6954, +26547=>6955, +12108=>6956, +27490=>6956, +27744=>6957, +27802=>6958, +28460=>6959, +30693=>6960, +30757=>6961, +31049=>6962, +31063=>6963, +32025=>6964, +32930=>6965, +33026=>6966, +12164=>6967, +33267=>6967, +33437=>6968, +33463=>6969, +34584=>6970, +35468=>6971, +36100=>6972, +36286=>6973, +36978=>6974, +30452=>6975, +31257=>6976, +31287=>6977, +32340=>6978, +32887=>6979, +21767=>6980, +21972=>6981, +22645=>6982, +25391=>6983, +25634=>6984, +26185=>6985, +26187=>6986, +26733=>6987, +27035=>6988, +27524=>6989, +27941=>6990, +28337=>6991, +29645=>6992, +29800=>6993, +29857=>6994, +30043=>6995, +30137=>6996, +30433=>6997, +30494=>6998, +30603=>6999, +31206=>7000, +32265=>7001, +32285=>7002, +33275=>7003, +34095=>7004, +34967=>7005, +35386=>7006, +36049=>7007, +36587=>7008, +12192=>7009, +36784=>7009, +63857=>7009, +36914=>7010, +37805=>7011, +38499=>7012, +38515=>7013, +38663=>7014, +20356=>7015, +21489=>7016, +23018=>7017, +23241=>7018, +24089=>7019, +26702=>7020, +29894=>7021, +30142=>7022, +31209=>7023, +31378=>7024, +33187=>7025, +34541=>7026, +36074=>7027, +36300=>7028, +36845=>7029, +26015=>7030, +26389=>7031, +22519=>7032, +28503=>7033, +32221=>7034, +36655=>7035, +37878=>7036, +38598=>7037, +24501=>7038, +25074=>7039, +28548=>7040, +19988=>7041, +20376=>7042, +20511=>7043, +21449=>7044, +21983=>7045, +23919=>7046, +24046=>7047, +27425=>7048, +27492=>7049, +30923=>7050, +31642=>7051, +36425=>7052, +12190=>7053, +36554=>7053, +63746=>7053, +36974=>7054, +25417=>7055, +25662=>7056, +30528=>7057, +31364=>7058, +37679=>7059, +38015=>7060, +40810=>7061, +25776=>7062, +28591=>7063, +29158=>7064, +29864=>7065, +29914=>7066, +31428=>7067, +31762=>7068, +32386=>7069, +31922=>7070, +32408=>7071, +35738=>7072, +36106=>7073, +38013=>7074, +39184=>7075, +39244=>7076, +21049=>7077, +23519=>7078, +25830=>7079, +26413=>7080, +32046=>7081, +20717=>7082, +21443=>7083, +63851=>7083, +22649=>7084, +24920=>7085, +24921=>7086, +25082=>7087, +26028=>7088, +31449=>7089, +35730=>7090, +35734=>7091, +20489=>7092, +20513=>7093, +21109=>7094, +21809=>7095, +23100=>7096, +24288=>7097, +24432=>7098, +24884=>7099, +25950=>7100, +26124=>7101, +26166=>7102, +26274=>7103, +27085=>7104, +28356=>7105, +28466=>7106, +29462=>7107, +30241=>7108, +31379=>7109, +33081=>7110, +33369=>7111, +33750=>7112, +33980=>7113, +20661=>7114, +22512=>7115, +23488=>7116, +23528=>7117, +24425=>7118, +25505=>7119, +30758=>7120, +32181=>7121, +33756=>7122, +34081=>7123, +37319=>7124, +37365=>7125, +20874=>7126, +26613=>7127, +31574=>7128, +36012=>7129, +20932=>7130, +22971=>7131, +24765=>7132, +34389=>7133, +20508=>7134, +21076=>7135, +23610=>7136, +24957=>7137, +25114=>7138, +25299=>7139, +64002=>7139, +25842=>7140, +26021=>7141, +28364=>7142, +30240=>7143, +33034=>7144, +36448=>7145, +38495=>7146, +38587=>7147, +20191=>7148, +21315=>7149, +21912=>7150, +22825=>7151, +24029=>7152, +25797=>7153, +27849=>7154, +28154=>7155, +29588=>7156, +31359=>7157, +12167=>7158, +33307=>7158, +34214=>7159, +36068=>7160, +36368=>7161, +36983=>7162, +37351=>7163, +38369=>7164, +38433=>7165, +38854=>7166, +20984=>7167, +21746=>7168, +21894=>7169, +24505=>7170, +25764=>7171, +28552=>7172, +32180=>7173, +36639=>7174, +36685=>7175, +37941=>7176, +20681=>7177, +23574=>7178, +27838=>7179, +28155=>7180, +29979=>7181, +30651=>7182, +31805=>7183, +31844=>7184, +35449=>7185, +35522=>7186, +22558=>7187, +22974=>7188, +24086=>7189, +25463=>7190, +29266=>7191, +30090=>7192, +30571=>7193, +35548=>7194, +36028=>7195, +36626=>7196, +24307=>7197, +26228=>7198, +28152=>7199, +32893=>7200, +33729=>7201, +35531=>7202, +12205=>7203, +38737=>7203, +39894=>7204, +21059=>7205, +26367=>7206, +28053=>7207, +28399=>7208, +32224=>7209, +35558=>7210, +36910=>7211, +36958=>7212, +39636=>7213, +21021=>7214, +21119=>7215, +21736=>7216, +24980=>7217, +25220=>7218, +25307=>7219, +26786=>7220, +26898=>7221, +26970=>7222, +27189=>7223, +28818=>7224, +28966=>7225, +30813=>7226, +30977=>7227, +30990=>7228, +31186=>7229, +31245=>7230, +32918=>7231, +12171=>7232, +33400=>7232, +33493=>7233, +33609=>7234, +34121=>7235, +35970=>7236, +36229=>7237, +37218=>7238, +37259=>7239, +37294=>7240, +20419=>7241, +22225=>7242, +29165=>7243, +30679=>7244, +34560=>7245, +35320=>7246, +12072=>7247, +23544=>7247, +24534=>7248, +26449=>7249, +37032=>7250, +21474=>7251, +22618=>7252, +23541=>7253, +24740=>7254, +24961=>7255, +25696=>7256, +32317=>7257, +32880=>7258, +34085=>7259, +37507=>7260, +25774=>7261, +20652=>7262, +23828=>7263, +26368=>7264, +22684=>7265, +25277=>7266, +25512=>7267, +26894=>7268, +27000=>7269, +27166=>7270, +28267=>7271, +30394=>7272, +31179=>7273, +33467=>7274, +33833=>7275, +35535=>7276, +36264=>7277, +36861=>7278, +37138=>7279, +37195=>7280, +37276=>7281, +37648=>7282, +37656=>7283, +37786=>7284, +38619=>7285, +39478=>7286, +39949=>7287, +19985=>7288, +30044=>7289, +31069=>7290, +31482=>7291, +31569=>7292, +31689=>7293, +32302=>7294, +33988=>7295, +36441=>7296, +36468=>7297, +36600=>7298, +36880=>7299, +26149=>7300, +26943=>7301, +29763=>7302, +20986=>7303, +26414=>7304, +40668=>7305, +20805=>7306, +24544=>7307, +27798=>7308, +34802=>7309, +34909=>7310, +34935=>7311, +24756=>7312, +33205=>7313, +33795=>7314, +36101=>7315, +21462=>7316, +21561=>7317, +22068=>7318, +23094=>7319, +23601=>7320, +28810=>7321, +32736=>7322, +32858=>7323, +33030=>7324, +33261=>7325, +36259=>7326, +37257=>7327, +39519=>7328, +40434=>7329, +20596=>7330, +20164=>7331, +21408=>7332, +24827=>7333, +28204=>7334, +23652=>7335, +20360=>7336, +20516=>7337, +21988=>7338, +23769=>7339, +24159=>7340, +24677=>7341, +26772=>7342, +27835=>7343, +28100=>7344, +29118=>7345, +30164=>7346, +30196=>7347, +30305=>7348, +31258=>7349, +31305=>7350, +32199=>7351, +32251=>7352, +32622=>7353, +33268=>7354, +34473=>7355, +36636=>7356, +38601=>7357, +39347=>7358, +12242=>7359, +40786=>7359, +21063=>7360, +21189=>7361, +39149=>7362, +35242=>7363, +19971=>7364, +26578=>7365, +28422=>7366, +20405=>7367, +23522=>7368, +26517=>7369, +27784=>7370, +63858=>7370, +28024=>7371, +29723=>7372, +30759=>7373, +37341=>7374, +37756=>7375, +34756=>7376, +31204=>7377, +31281=>7378, +24555=>7379, +20182=>7380, +21668=>7381, +21822=>7382, +22702=>7383, +22949=>7384, +24816=>7385, +25171=>7386, +25302=>7387, +26422=>7388, +26965=>7389, +33333=>7390, +38464=>7391, +39345=>7392, +39389=>7393, +20524=>7394, +21331=>7395, +21828=>7396, +22396=>7397, +25176=>7398, +25826=>7399, +26219=>7400, +26589=>7401, +28609=>7402, +28655=>7403, +29730=>7404, +29752=>7405, +35351=>7406, +37944=>7407, +21585=>7408, +22022=>7409, +22374=>7410, +24392=>7411, +24986=>7412, +27470=>7413, +28760=>7414, +28845=>7415, +32187=>7416, +35477=>7417, +22890=>7418, +33067=>7419, +25506=>7420, +30472=>7421, +32829=>7422, +36010=>7423, +22612=>7424, +25645=>7425, +27067=>7426, +23445=>7427, +24081=>7428, +28271=>7429, +34153=>7430, +20812=>7431, +21488=>7432, +22826=>7433, +24608=>7434, +24907=>7435, +27526=>7436, +27760=>7437, +27888=>7438, +31518=>7439, +32974=>7440, +33492=>7441, +36294=>7442, +37040=>7443, +39089=>7444, +25799=>7445, +28580=>7446, +25745=>7447, +25860=>7448, +20814=>7449, +21520=>7450, +12063=>7451, +22303=>7451, +35342=>7452, +24927=>7453, +26742=>7454, +30171=>7455, +31570=>7456, +32113=>7457, +36890=>7458, +22534=>7459, +27084=>7460, +33151=>7461, +35114=>7462, +36864=>7463, +38969=>7464, +20600=>7465, +22871=>7466, +22956=>7467, +25237=>7468, +36879=>7469, +39722=>7470, +24925=>7471, +29305=>7472, +38358=>7473, +22369=>7474, +23110=>7475, +24052=>7476, +25226=>7477, +25773=>7478, +25850=>7479, +26487=>7480, +27874=>7481, +27966=>7482, +29228=>7483, +29750=>7484, +30772=>7485, +32631=>7486, +33453=>7487, +36315=>7488, +38935=>7489, +21028=>7490, +22338=>7491, +26495=>7492, +29256=>7493, +29923=>7494, +36009=>7495, +36774=>7496, +37393=>7497, +38442=>7498, +12043=>7499, +20843=>7499, +21485=>7500, +25420=>7501, +20329=>7502, +21764=>7503, +24726=>7504, +25943=>7505, +27803=>7506, +28031=>7507, +29260=>7508, +29437=>7509, +31255=>7510, +35207=>7511, +12185=>7512, +35997=>7512, +24429=>7513, +28558=>7514, +28921=>7515, +33192=>7516, +24846=>7517, +20415=>7518, +63845=>7518, +20559=>7519, +25153=>7520, +12122=>7521, +29255=>7521, +31687=>7522, +32232=>7523, +32745=>7524, +36941=>7525, +38829=>7526, +39449=>7527, +36022=>7528, +22378=>7529, +24179=>7530, +26544=>7531, +33805=>7532, +35413=>7533, +21536=>7534, +23318=>7535, +24163=>7536, +24290=>7537, +24330=>7538, +25987=>7539, +32954=>7540, +34109=>7541, +38281=>7542, +38491=>7543, +20296=>7544, +21253=>7545, +21261=>7546, +21263=>7547, +21638=>7548, +21754=>7549, +22275=>7550, +24067=>7551, +24598=>7552, +25243=>7553, +25265=>7554, +25429=>7555, +27873=>7556, +28006=>7557, +30129=>7558, +30770=>7559, +32990=>7560, +33071=>7561, +33502=>7562, +33889=>7563, +33970=>7564, +34957=>7565, +35090=>7566, +36875=>7567, +37610=>7568, +39165=>7569, +39825=>7570, +24133=>7571, +26292=>7572, +64006=>7572, +26333=>7573, +28689=>7574, +29190=>7575, +20469=>7576, +21117=>7577, +24426=>7578, +24915=>7579, +26451=>7580, +27161=>7581, +28418=>7582, +29922=>7583, +31080=>7584, +34920=>7585, +35961=>7586, +39111=>7587, +39108=>7588, +39491=>7589, +21697=>7590, +31263=>7591, +26963=>7592, +35575=>7593, +35914=>7594, +12213=>7595, +39080=>7595, +39342=>7596, +24444=>7597, +25259=>7598, +30130=>7599, +12138=>7600, +30382=>7600, +34987=>7601, +36991=>7602, +38466=>7603, +21305=>7604, +24380=>7605, +24517=>7606, +27852=>7607, +63848=>7607, +29644=>7608, +30050=>7609, +12134=>7610, +30091=>7610, +31558=>7611, +33534=>7612, +39325=>7613, +20047=>7614, +36924=>7615, +19979=>7616, +20309=>7617, +21414=>7618, +22799=>7619, +24264=>7620, +26160=>7621, +27827=>7622, +29781=>7623, +33655=>7624, +34662=>7625, +36032=>7626, +36944=>7627, +38686=>7628, +39957=>7629, +22737=>7630, +23416=>7631, +34384=>7632, +35604=>7633, +40372=>7634, +23506=>7635, +24680=>7636, +24717=>7637, +26097=>7638, +27735=>7639, +28450=>7640, +28579=>7641, +28698=>7642, +32597=>7643, +32752=>7644, +38289=>7645, +38290=>7646, +38480=>7647, +38867=>7648, +21106=>7649, +36676=>7650, +20989=>7651, +21547=>7652, +21688=>7653, +21859=>7654, +21898=>7655, +27323=>7656, +28085=>7657, +32216=>7658, +33382=>7659, +37532=>7660, +38519=>7661, +40569=>7662, +21512=>7663, +21704=>7664, +30418=>7665, +34532=>7666, +38308=>7667, +38356=>7668, +38492=>7669, +20130=>7670, +20233=>7671, +23022=>7672, +23270=>7673, +24055=>7674, +24658=>7675, +25239=>7676, +26477=>7677, +26689=>7678, +27782=>7679, +28207=>7680, +32568=>7681, +32923=>7682, +33322=>7683, +38917=>7684, +20133=>7685, +20565=>7686, +21683=>7687, +22419=>7688, +22874=>7689, +23401=>7690, +23475=>7691, +25032=>7692, +26999=>7693, +28023=>7694, +28707=>7695, +34809=>7696, +35299=>7697, +35442=>7698, +35559=>7699, +36994=>7700, +39405=>7701, +39608=>7702, +21182=>7703, +26680=>7704, +20502=>7705, +24184=>7706, +26447=>7707, +33607=>7708, +12175=>7709, +34892=>7709, +64008=>7709, +20139=>7710, +21521=>7711, +22190=>7712, +29670=>7713, +37141=>7714, +38911=>7715, +39177=>7716, +39255=>7717, +12217=>7718, +39321=>7718, +22099=>7719, +22687=>7720, +34395=>7721, +35377=>7722, +25010=>7723, +27382=>7724, +29563=>7725, +36562=>7726, +27463=>7727, +38570=>7728, +39511=>7729, +22869=>7730, +29184=>7731, +36203=>7732, +12208=>7733, +38761=>7733, +20436=>7734, +23796=>7735, +24358=>7736, +25080=>7737, +26203=>7738, +27883=>7739, +28843=>7740, +12126=>7741, +29572=>7741, +29625=>7742, +29694=>7743, +30505=>7744, +30541=>7745, +32067=>7746, +32098=>7747, +32291=>7748, +33335=>7749, +34898=>7750, +36066=>7751, +37449=>7752, +39023=>7753, +23377=>7754, +12147=>7755, +31348=>7755, +12174=>7756, +34880=>7756, +12212=>7757, +38913=>7757, +23244=>7758, +20448=>7759, +21332=>7760, +22846=>7761, +23805=>7762, +25406=>7763, +28025=>7764, +29433=>7765, +33029=>7766, +33031=>7767, +33698=>7768, +37583=>7769, +38960=>7770, +20136=>7771, +20804=>7772, +21009=>7773, +22411=>7774, +24418=>7775, +27842=>7776, +28366=>7777, +28677=>7778, +28752=>7779, +28847=>7780, +29074=>7781, +29673=>7782, +29801=>7783, +63918=>7783, +33610=>7784, +34722=>7785, +34913=>7786, +36872=>7787, +37026=>7788, +37795=>7789, +39336=>7790, +20846=>7791, +24407=>7792, +24800=>7793, +24935=>7794, +26291=>7795, +34137=>7796, +36426=>7797, +37295=>7798, +38795=>7799, +20046=>7800, +20114=>7801, +21628=>7802, +22741=>7803, +22778=>7804, +22909=>7805, +23733=>7806, +24359=>7807, +12094=>7808, +25142=>7808, +25160=>7809, +26122=>7810, +26215=>7811, +27627=>7812, +28009=>7813, +28111=>7814, +28246=>7815, +28408=>7816, +28564=>7817, +28640=>7818, +28649=>7819, +28765=>7820, +29392=>7821, +29733=>7822, +29786=>7823, +29920=>7824, +30355=>7825, +31068=>7826, +31946=>7827, +32286=>7828, +32993=>7829, +33446=>7830, +33899=>7831, +33983=>7832, +34382=>7833, +34399=>7834, +34676=>7835, +35703=>7836, +35946=>7837, +37804=>7838, +38912=>7839, +39013=>7840, +24785=>7841, +25110=>7842, +37239=>7843, +23130=>7844, +26127=>7845, +28151=>7846, +28222=>7847, +29759=>7848, +39746=>7849, +24573=>7850, +24794=>7851, +31503=>7852, +21700=>7853, +24344=>7854, +27742=>7855, +27859=>7856, +27946=>7857, +28888=>7858, +32005=>7859, +34425=>7860, +35340=>7861, +40251=>7862, +21270=>7863, +21644=>7864, +23301=>7865, +27194=>7866, +12117=>7867, +28779=>7867, +30069=>7868, +31117=>7869, +12146=>7870, +31166=>7870, +33457=>7871, +33775=>7872, +35441=>7873, +35649=>7874, +36008=>7875, +38772=>7876, +25844=>7877, +25899=>7878, +30906=>7879, +30907=>7880, +31339=>7881, +20024=>7882, +21914=>7883, +22864=>7884, +23462=>7885, +24187=>7886, +24739=>7887, +25563=>7888, +27489=>7889, +26213=>7890, +26707=>7891, +28185=>7892, +29029=>7893, +29872=>7894, +32008=>7895, +36996=>7896, +39529=>7897, +39973=>7898, +27963=>7899, +28369=>7900, +63748=>7900, +29502=>7901, +35905=>7902, +38346=>7903, +20976=>7904, +24140=>7905, +24488=>7906, +24653=>7907, +24822=>7908, +24880=>7909, +24908=>7910, +26179=>7911, +26180=>7912, +27045=>7913, +27841=>7914, +28255=>7915, +28361=>7916, +28514=>7917, +29004=>7918, +29852=>7919, +30343=>7920, +31681=>7921, +31783=>7922, +33618=>7923, +34647=>7924, +36945=>7925, +38541=>7926, +12232=>7927, +40643=>7927, +21295=>7928, +22238=>7929, +24315=>7930, +24458=>7931, +24674=>7932, +24724=>7933, +25079=>7934, +26214=>7935, +26371=>7936, +27292=>7937, +28142=>7938, +28590=>7939, +28784=>7940, +29546=>7941, +32362=>7942, +33214=>7943, +33588=>7944, +34516=>7945, +35496=>7946, +36036=>7947, +21123=>7948, +29554=>7949, +23446=>7950, +27243=>7951, +37892=>7952, +21742=>7953, +22150=>7954, +23389=>7955, +25928=>7956, +25989=>7957, +26313=>7958, +26783=>7959, +28045=>7960, +28102=>7961, +12120=>7962, +29243=>7962, +32948=>7963, +37237=>7964, +39501=>7965, +20399=>7966, +20505=>7967, +21402=>7968, +21518=>7969, +21564=>7970, +21897=>7971, +21957=>7972, +24127=>7973, +24460=>7974, +26429=>7975, +29030=>7976, +29661=>7977, +36869=>7978, +21211=>7979, +21235=>7980, +22628=>7981, +22734=>7982, +28932=>7983, +29071=>7984, +29179=>7985, +34224=>7986, +35347=>7987, +26248=>7988, +63941=>7988, +34216=>7989, +21927=>7990, +26244=>7991, +29002=>7992, +33841=>7993, +21321=>7994, +21913=>7995, +27585=>7996, +24409=>7997, +24509=>7998, +25582=>7999, +26249=>8000, +28999=>8001, +35569=>8002, +36637=>8003, +40638=>8004, +20241=>8005, +25658=>8006, +28875=>8007, +30054=>8008, +34407=>8009, +24676=>8010, +35662=>8011, +40440=>8012, +20807=>8013, +20982=>8014, +21256=>8015, +27958=>8016, +33016=>8017, +12234=>8018, +40657=>8018, +26133=>8019, +27427=>8020, +28824=>8021, +30165=>8022, +21507=>8023, +23673=>8024, +32007=>8025, +35350=>8026, +12107=>8027, +27424=>8027, +27453=>8028, +27462=>8029, +21560=>8030, +24688=>8031, +27965=>8032, +32725=>8033, +33288=>8034, +20694=>8035, +20958=>8036, +21916=>8037, +22123=>8038, +22221=>8039, +23020=>8040, +23305=>8041, +24076=>8042, +24985=>8043, +24984=>8044, +25137=>8045, +26206=>8046, +26342=>8047, +29081=>8048, +29113=>8049, +29114=>8050, +29351=>8051, +31143=>8052, +31232=>8053, +32690=>8054, +35440=>8055, + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +12310=>8219, +12311=>8220, +12312=>8221, +12313=>8222, +8223=>8237, +8219=>8238, +8314=>8239, +8315=>8240, +8316=>8248, +8317=>8250, +8318=>8251, +700=>8275, +8942=>8320, +8759=>8321, +10122=>8342, +10123=>8343, +10124=>8344, +10125=>8345, +10126=>8346, +10127=>8347, +10128=>8348, +10129=>8349, +10130=>8350, +10131=>8351, +9398=>8388, +9399=>8389, +9400=>8390, +9401=>8391, +9402=>8392, +9403=>8393, +9404=>8394, +9405=>8395, +9406=>8396, +9407=>8397, +9408=>8398, +9409=>8399, +9410=>8400, +9411=>8401, +9412=>8402, +9413=>8403, +9414=>8404, +9415=>8405, +9416=>8406, +9417=>8407, +9418=>8408, +9419=>8409, +9420=>8410, +9421=>8411, +9422=>8412, +9423=>8413, +8826=>8475, +8827=>8476, +8910=>8477, +8911=>8478, +8832=>8479, +8833=>8480, +8816=>8481, +8817=>8482, +8818=>8483, +8819=>8484, +8842=>8486, +8843=>8488, +8822=>8489, +8823=>8490, +8825=>8491, +8922=>8492, +8923=>8493, +8773=>8499, +8771=>8500, +8776=>8501, +8868=>8503, +8244=>8582, +9839=>8594, +8258=>8599, +10045=>8604, +8226=>8607, +8249=>8612, +8250=>8613, +10010=>8630, +10006=>8631, +9711=>8633, +10070=>8637, +9676=>8639, +9775=>8664, +12320=>8671, +10102=>8673, +10103=>8674, +10104=>8675, +10105=>8676, +10106=>8677, +10107=>8678, +10108=>8679, +10109=>8680, +10110=>8681, +10111=>8682, +12306=>8700, +12342=>8701, +8710=>8715, +8735=>8717, +8741=>8719, +8742=>8720, +8787=>8722, +8785=>8723, +8806=>8724, +8807=>8725, +8723=>8726, +8853=>8727, +8854=>8728, +8855=>8729, +8980=>8731, +8802=>8734, +9649=>8736, +8738=>8738, +8784=>8739, +8867=>8742, +8814=>8745, +8815=>8746, +8837=>8747, +8836=>8748, +8713=>8749, +8716=>8750, +8891=>8751, +8892=>8752, +8794=>8753, +8966=>8754, +12958=>8761, +8252=>8763, +9702=>8775, +9663=>8779, +9653=>8780, +9657=>8781, +9667=>8782, +9674=>8787, +12849=>8788, +12857=>8789, +13259=>8790, +9327=>8791, +9328=>8792, +9329=>8793, +9330=>8794, +9331=>8795, +8656=>8814, +8655=>8815, +8653=>8816, +8657=>8854, +8659=>8855, +8626=>8864, +8625=>8865, +8628=>8867, +8624=>8868, +8627=>8869, +8636=>8884, +8640=>8885, +8644=>8896, +8645=>8897, +9347=>9042, +9348=>9043, +9349=>9044, +9350=>9045, +9351=>9046, +12948=>9080, +12965=>9096, +8672=>9190, +8674=>9191, +8673=>9192, +8675=>9193, +8678=>9198, +8680=>9199, +8679=>9200, +8681=>9201, +9757=>9222, +9759=>9223, +12944=>9300, +12938=>9301, +12939=>9302, +12940=>9303, +12941=>9304, +12942=>9305, +12943=>9306, +12318=>9322, +12319=>9323, +8246=>9324, +8245=>9326, +12540=>9330, +44034=>9333, +44035=>9334, +44037=>9335, +44038=>9336, +44043=>9337, +44044=>9338, +44045=>9339, +44046=>9340, +44047=>9341, +44056=>9342, +44062=>9343, +44063=>9344, +44065=>9345, +44066=>9346, +44067=>9347, +44069=>9348, +44070=>9349, +44071=>9350, +44072=>9351, +44073=>9352, +44074=>9353, +44075=>9354, +44078=>9355, +44082=>9356, +44083=>9357, +44084=>9358, +44085=>9359, +44086=>9360, +44087=>9361, +44090=>9362, +44091=>9363, +44093=>9364, +44094=>9365, +44095=>9366, +44097=>9367, +44098=>9368, +44099=>9369, +44100=>9370, +44101=>9371, +44102=>9372, +44103=>9373, +44104=>9374, +44105=>9375, +44106=>9376, +44108=>9377, +44110=>9378, +44111=>9379, +44112=>9380, +44113=>9381, +44114=>9382, +44115=>9383, +44117=>9384, +44118=>9385, +44119=>9386, +44121=>9387, +44122=>9388, +44123=>9389, +44125=>9390, +44126=>9391, +44127=>9392, +44128=>9393, +44129=>9394, +44130=>9395, +44131=>9396, +44132=>9397, +44133=>9398, +44134=>9399, +44135=>9400, +44136=>9401, +44137=>9402, +44138=>9403, +44139=>9404, +44140=>9405, +44141=>9406, +44142=>9407, +44143=>9408, +44146=>9409, +44147=>9410, +44149=>9411, +44150=>9412, +44153=>9413, +44155=>9414, +44156=>9415, +44157=>9416, +44158=>9417, +44159=>9418, +44162=>9419, +44167=>9420, +44168=>9421, +44173=>9422, +44174=>9423, +44175=>9424, +44177=>9425, +44178=>9426, +44179=>9427, +44181=>9428, +44182=>9429, +44183=>9430, +44184=>9431, +44185=>9432, +44186=>9433, +44187=>9434, +44190=>9435, +44194=>9436, +44195=>9437, +44196=>9438, +44197=>9439, +44198=>9440, +44199=>9441, +44203=>9442, +44205=>9443, +44206=>9444, +44209=>9445, +44210=>9446, +44211=>9447, +44212=>9448, +44213=>9449, +44214=>9450, +44215=>9451, +44218=>9452, +44222=>9453, +44223=>9454, +44224=>9455, +44226=>9456, +44227=>9457, +44229=>9458, +44230=>9459, +44231=>9460, +44233=>9461, +44234=>9462, +44235=>9463, +44237=>9464, +44238=>9465, +44239=>9466, +44240=>9467, +44241=>9468, +44242=>9469, +44243=>9470, +44244=>9471, +44246=>9472, +44248=>9473, +44249=>9474, +44250=>9475, +44251=>9476, +44252=>9477, +44253=>9478, +44254=>9479, +44255=>9480, +44258=>9481, +44259=>9482, +44261=>9483, +44262=>9484, +44265=>9485, +44267=>9486, +44269=>9487, +44270=>9488, +44274=>9489, +44276=>9490, +44279=>9491, +44280=>9492, +44281=>9493, +44282=>9494, +44283=>9495, +44286=>9496, +44287=>9497, +44289=>9498, +44290=>9499, +44291=>9500, +44293=>9501, +44295=>9502, +44296=>9503, +44297=>9504, +44298=>9505, +44299=>9506, +44302=>9507, +44304=>9508, +44306=>9509, +44307=>9510, +44308=>9511, +44309=>9512, +44310=>9513, +44311=>9514, +44313=>9515, +44314=>9516, +44315=>9517, +44317=>9518, +44318=>9519, +44319=>9520, +44321=>9521, +44322=>9522, +44323=>9523, +44324=>9524, +44325=>9525, +44326=>9526, +44327=>9527, +44328=>9528, +44330=>9529, +44331=>9530, +44334=>9531, +44335=>9532, +44336=>9533, +44337=>9534, +44338=>9535, +44339=>9536, +44342=>9537, +44343=>9538, +44345=>9539, +44346=>9540, +44347=>9541, +44349=>9542, +44350=>9543, +44351=>9544, +44352=>9545, +44353=>9546, +44354=>9547, +44355=>9548, +44358=>9549, +44360=>9550, +44362=>9551, +44363=>9552, +44364=>9553, +44365=>9554, +44366=>9555, +44367=>9556, +44369=>9557, +44370=>9558, +44371=>9559, +44373=>9560, +44374=>9561, +44375=>9562, +44377=>9563, +44378=>9564, +44379=>9565, +44380=>9566, +44381=>9567, +44382=>9568, +44383=>9569, +44384=>9570, +44386=>9571, +44388=>9572, +44389=>9573, +44390=>9574, +44391=>9575, +44392=>9576, +44393=>9577, +44394=>9578, +44395=>9579, +44398=>9580, +44399=>9581, +44401=>9582, +44402=>9583, +44407=>9584, +44408=>9585, +44409=>9586, +44410=>9587, +44414=>9588, +44416=>9589, +44419=>9590, +44420=>9591, +44421=>9592, +44422=>9593, +44423=>9594, +44426=>9595, +44427=>9596, +44429=>9597, +44430=>9598, +44431=>9599, +44433=>9600, +44434=>9601, +44435=>9602, +44436=>9603, +44437=>9604, +44438=>9605, +44439=>9606, +44440=>9607, +44441=>9608, +44442=>9609, +44443=>9610, +44446=>9611, +44447=>9612, +44448=>9613, +44449=>9614, +44450=>9615, +44451=>9616, +44453=>9617, +44454=>9618, +44455=>9619, +44456=>9620, +44457=>9621, +44458=>9622, +44459=>9623, +44460=>9624, +44461=>9625, +44462=>9626, +44463=>9627, +44464=>9628, +44465=>9629, +44466=>9630, +44467=>9631, +44468=>9632, +44469=>9633, +44470=>9634, +44472=>9635, +44473=>9636, +44474=>9637, +44475=>9638, +44476=>9639, +44477=>9640, +44478=>9641, +44479=>9642, +44482=>9643, +44483=>9644, +44485=>9645, +44486=>9646, +44487=>9647, +44489=>9648, +44490=>9649, +44491=>9650, +44492=>9651, +44493=>9652, +44494=>9653, +44495=>9654, +44498=>9655, +44500=>9656, +44501=>9657, +44502=>9658, +44503=>9659, +44504=>9660, +44505=>9661, +44506=>9662, +44507=>9663, +44509=>9664, +44510=>9665, +44511=>9666, +44513=>9667, +44514=>9668, +44515=>9669, +44517=>9670, +44518=>9671, +44519=>9672, +44520=>9673, +44521=>9674, +44522=>9675, +44523=>9676, +44524=>9677, +44525=>9678, +44526=>9679, +44527=>9680, +44528=>9681, +44529=>9682, +44530=>9683, +44531=>9684, +44532=>9685, +44533=>9686, +44534=>9687, +44535=>9688, +44538=>9689, +44539=>9690, +44541=>9691, +44542=>9692, +44546=>9693, +44547=>9694, +44548=>9695, +44549=>9696, +44550=>9697, +44551=>9698, +44554=>9699, +44556=>9700, +44558=>9701, +44559=>9702, +44560=>9703, +44561=>9704, +44562=>9705, +44563=>9706, +44565=>9707, +44566=>9708, +44567=>9709, +44568=>9710, +44569=>9711, +44570=>9712, +44571=>9713, +44572=>9714, +44573=>9715, +44574=>9716, +44575=>9717, +44576=>9718, +44577=>9719, +44578=>9720, +44579=>9721, +44580=>9722, +44581=>9723, +44582=>9724, +44583=>9725, +44584=>9726, +44585=>9727, +44586=>9728, +44587=>9729, +44588=>9730, +44589=>9731, +44590=>9732, +44591=>9733, +44594=>9734, +44595=>9735, +44597=>9736, +44598=>9737, +44601=>9738, +44603=>9739, +44604=>9740, +44605=>9741, +44606=>9742, +44607=>9743, +44610=>9744, +44612=>9745, +44615=>9746, +44616=>9747, +44617=>9748, +44619=>9749, +44623=>9750, +44625=>9751, +44626=>9752, +44627=>9753, +44629=>9754, +44631=>9755, +44632=>9756, +44633=>9757, +44634=>9758, +44635=>9759, +44638=>9760, +44642=>9761, +44643=>9762, +44644=>9763, +44646=>9764, +44647=>9765, +44650=>9766, +44651=>9767, +44653=>9768, +44654=>9769, +44655=>9770, +44657=>9771, +44658=>9772, +44659=>9773, +44660=>9774, +44661=>9775, +44662=>9776, +44663=>9777, +44666=>9778, +44670=>9779, +44671=>9780, +44672=>9781, +44673=>9782, +44674=>9783, +44675=>9784, +44678=>9785, +44679=>9786, +44680=>9787, +44681=>9788, +44682=>9789, +44683=>9790, +44685=>9791, +44686=>9792, +44687=>9793, +44688=>9794, +44689=>9795, +44690=>9796, +44691=>9797, +44692=>9798, +44693=>9799, +44694=>9800, +44695=>9801, +44696=>9802, +44697=>9803, +44698=>9804, +44699=>9805, +44700=>9806, +44701=>9807, +44702=>9808, +44703=>9809, +44704=>9810, +44705=>9811, +44706=>9812, +44707=>9813, +44708=>9814, +44709=>9815, +44710=>9816, +44711=>9817, +44712=>9818, +44713=>9819, +44714=>9820, +44715=>9821, +44716=>9822, +44717=>9823, +44718=>9824, +44719=>9825, +44720=>9826, +44721=>9827, +44722=>9828, +44723=>9829, +44724=>9830, +44725=>9831, +44726=>9832, +44727=>9833, +44728=>9834, +44729=>9835, +44730=>9836, +44731=>9837, +44735=>9838, +44737=>9839, +44738=>9840, +44739=>9841, +44741=>9842, +44742=>9843, +44743=>9844, +44744=>9845, +44745=>9846, +44746=>9847, +44747=>9848, +44750=>9849, +44754=>9850, +44755=>9851, +44756=>9852, +44757=>9853, +44758=>9854, +44759=>9855, +44762=>9856, +44763=>9857, +44765=>9858, +44766=>9859, +44767=>9860, +44768=>9861, +44769=>9862, +44770=>9863, +44771=>9864, +44772=>9865, +44773=>9866, +44774=>9867, +44775=>9868, +44777=>9869, +44778=>9870, +44780=>9871, +44782=>9872, +44783=>9873, +44784=>9874, +44785=>9875, +44786=>9876, +44787=>9877, +44789=>9878, +44790=>9879, +44791=>9880, +44793=>9881, +44794=>9882, +44795=>9883, +44797=>9884, +44798=>9885, +44799=>9886, +44800=>9887, +44801=>9888, +44802=>9889, +44803=>9890, +44804=>9891, +44805=>9892, +44806=>9893, +44809=>9894, +44810=>9895, +44811=>9896, +44812=>9897, +44814=>9898, +44815=>9899, +44817=>9900, +44818=>9901, +44819=>9902, +44820=>9903, +44821=>9904, +44822=>9905, +44823=>9906, +44824=>9907, +44825=>9908, +44826=>9909, +44827=>9910, +44828=>9911, +44829=>9912, +44830=>9913, +44831=>9914, +44832=>9915, +44833=>9916, +44834=>9917, +44835=>9918, +44836=>9919, +44837=>9920, +44838=>9921, +44839=>9922, +44840=>9923, +44841=>9924, +44842=>9925, +44843=>9926, +44846=>9927, +44847=>9928, +44849=>9929, +44851=>9930, +44853=>9931, +44854=>9932, +44855=>9933, +44856=>9934, +44857=>9935, +44858=>9936, +44859=>9937, +44862=>9938, +44864=>9939, +44868=>9940, +44869=>9941, +44870=>9942, +44871=>9943, +44874=>9944, +44875=>9945, +44876=>9946, +44877=>9947, +44878=>9948, +44879=>9949, +44881=>9950, +44882=>9951, +44883=>9952, +44884=>9953, +44885=>9954, +44886=>9955, +44887=>9956, +44888=>9957, +44889=>9958, +44890=>9959, +44891=>9960, +44894=>9961, +44895=>9962, +44896=>9963, +44897=>9964, +44898=>9965, +44899=>9966, +44902=>9967, +44903=>9968, +44904=>9969, +44905=>9970, +44906=>9971, +44907=>9972, +44908=>9973, +44909=>9974, +44910=>9975, +44911=>9976, +44912=>9977, +44913=>9978, +44914=>9979, +44915=>9980, +44916=>9981, +44917=>9982, +44918=>9983, +44919=>9984, +44920=>9985, +44922=>9986, +44923=>9987, +44924=>9988, +44925=>9989, +44926=>9990, +44927=>9991, +44929=>9992, +44930=>9993, +44931=>9994, +44933=>9995, +44934=>9996, +44935=>9997, +44937=>9998, +44938=>9999, +44939=>10000, +44940=>10001, +44941=>10002, +44942=>10003, +44943=>10004, +44946=>10005, +44947=>10006, +44948=>10007, +44950=>10008, +44951=>10009, +44952=>10010, +44953=>10011, +44954=>10012, +44955=>10013, +44957=>10014, +44958=>10015, +44959=>10016, +44960=>10017, +44961=>10018, +44962=>10019, +44963=>10020, +44964=>10021, +44965=>10022, +44966=>10023, +44967=>10024, +44968=>10025, +44969=>10026, +44970=>10027, +44971=>10028, +44972=>10029, +44973=>10030, +44974=>10031, +44975=>10032, +44976=>10033, +44977=>10034, +44978=>10035, +44979=>10036, +44980=>10037, +44981=>10038, +44982=>10039, +44983=>10040, +44986=>10041, +44987=>10042, +44989=>10043, +44990=>10044, +44991=>10045, +44993=>10046, +44994=>10047, +44995=>10048, +44996=>10049, +44997=>10050, +44998=>10051, +45002=>10052, +45004=>10053, +45007=>10054, +45008=>10055, +45009=>10056, +45010=>10057, +45011=>10058, +45013=>10059, +45014=>10060, +45015=>10061, +45016=>10062, +45017=>10063, +45018=>10064, +45019=>10065, +45021=>10066, +45022=>10067, +45023=>10068, +45024=>10069, +45025=>10070, +45026=>10071, +45027=>10072, +45028=>10073, +45029=>10074, +45030=>10075, +45031=>10076, +45034=>10077, +45035=>10078, +45036=>10079, +45037=>10080, +45038=>10081, +45039=>10082, +45042=>10083, +45043=>10084, +45045=>10085, +45046=>10086, +45047=>10087, +45049=>10088, +45050=>10089, +45051=>10090, +45052=>10091, +45053=>10092, +45054=>10093, +45055=>10094, +45058=>10095, +45059=>10096, +45061=>10097, +45062=>10098, +45063=>10099, +45064=>10100, +45065=>10101, +45066=>10102, +45067=>10103, +45069=>10104, +45070=>10105, +45071=>10106, +45073=>10107, +45074=>10108, +45075=>10109, +45077=>10110, +45078=>10111, +45079=>10112, +45080=>10113, +45081=>10114, +45082=>10115, +45083=>10116, +45086=>10117, +45087=>10118, +45088=>10119, +45089=>10120, +45090=>10121, +45091=>10122, +45092=>10123, +45093=>10124, +45094=>10125, +45095=>10126, +45097=>10127, +45098=>10128, +45099=>10129, +45100=>10130, +45101=>10131, +45102=>10132, +45103=>10133, +45104=>10134, +45105=>10135, +45106=>10136, +45107=>10137, +45108=>10138, +45109=>10139, +45110=>10140, +45111=>10141, +45112=>10142, +45113=>10143, +45114=>10144, +45115=>10145, +45116=>10146, +45117=>10147, +45118=>10148, +45119=>10149, +45120=>10150, +45121=>10151, +45122=>10152, +45123=>10153, +45126=>10154, +45127=>10155, +45129=>10156, +45131=>10157, +45133=>10158, +45135=>10159, +45136=>10160, +45137=>10161, +45138=>10162, +45142=>10163, +45144=>10164, +45146=>10165, +45147=>10166, +45148=>10167, +45150=>10168, +45151=>10169, +45152=>10170, +45153=>10171, +45154=>10172, +45155=>10173, +45156=>10174, +45157=>10175, +45158=>10176, +45159=>10177, +45160=>10178, +45161=>10179, +45162=>10180, +45163=>10181, +45164=>10182, +45165=>10183, +45166=>10184, +45167=>10185, +45168=>10186, +45169=>10187, +45170=>10188, +45171=>10189, +45172=>10190, +45173=>10191, +45174=>10192, +45175=>10193, +45176=>10194, +45177=>10195, +45178=>10196, +45179=>10197, +45182=>10198, +45183=>10199, +45185=>10200, +45186=>10201, +45187=>10202, +45189=>10203, +45190=>10204, +45191=>10205, +45192=>10206, +45193=>10207, +45194=>10208, +45195=>10209, +45198=>10210, +45200=>10211, +45202=>10212, +45203=>10213, +45204=>10214, +45205=>10215, +45206=>10216, +45207=>10217, +45211=>10218, +45213=>10219, +45214=>10220, +45219=>10221, +45220=>10222, +45221=>10223, +45222=>10224, +45223=>10225, +45226=>10226, +45232=>10227, +45234=>10228, +45238=>10229, +45239=>10230, +45241=>10231, +45242=>10232, +45243=>10233, +45245=>10234, +45246=>10235, +45247=>10236, +45248=>10237, +45249=>10238, +45250=>10239, +45251=>10240, +45254=>10241, +45258=>10242, +45259=>10243, +45260=>10244, +45261=>10245, +45262=>10246, +45263=>10247, +45266=>10248, +45267=>10249, +45269=>10250, +45270=>10251, +45271=>10252, +45273=>10253, +45274=>10254, +45275=>10255, +45276=>10256, +45277=>10257, +45278=>10258, +45279=>10259, +45281=>10260, +45282=>10261, +45283=>10262, +45284=>10263, +45286=>10264, +45287=>10265, +45288=>10266, +45289=>10267, +45290=>10268, +45291=>10269, +45292=>10270, +45293=>10271, +45294=>10272, +45295=>10273, +45296=>10274, +45297=>10275, +45298=>10276, +45299=>10277, +45300=>10278, +45301=>10279, +45302=>10280, +45303=>10281, +45304=>10282, +45305=>10283, +45306=>10284, +45307=>10285, +45308=>10286, +45309=>10287, +45310=>10288, +45311=>10289, +45312=>10290, +45313=>10291, +45314=>10292, +45315=>10293, +45316=>10294, +45317=>10295, +45318=>10296, +45319=>10297, +45322=>10298, +45325=>10299, +45326=>10300, +45327=>10301, +45329=>10302, +45332=>10303, +45333=>10304, +45334=>10305, +45335=>10306, +45338=>10307, +45342=>10308, +45343=>10309, +45344=>10310, +45345=>10311, +45346=>10312, +45350=>10313, +45351=>10314, +45353=>10315, +45354=>10316, +45355=>10317, +45357=>10318, +45358=>10319, +45359=>10320, +45360=>10321, +45361=>10322, +45362=>10323, +45363=>10324, +45366=>10325, +45370=>10326, +45371=>10327, +45372=>10328, +45373=>10329, +45374=>10330, +45375=>10331, +45378=>10332, +45379=>10333, +45381=>10334, +45382=>10335, +45383=>10336, +45385=>10337, +45386=>10338, +45387=>10339, +45388=>10340, +45389=>10341, +45390=>10342, +45391=>10343, +45394=>10344, +45395=>10345, +45398=>10346, +45399=>10347, +45401=>10348, +45402=>10349, +45403=>10350, +45405=>10351, +45406=>10352, +45407=>10353, +45409=>10354, +45410=>10355, +45411=>10356, +45412=>10357, +45413=>10358, +45414=>10359, +45415=>10360, +45416=>10361, +45417=>10362, +45418=>10363, +45419=>10364, +45420=>10365, +45421=>10366, +45422=>10367, +45423=>10368, +45424=>10369, +45425=>10370, +45426=>10371, +45427=>10372, +45428=>10373, +45429=>10374, +45430=>10375, +45431=>10376, +45434=>10377, +45435=>10378, +45437=>10379, +45438=>10380, +45439=>10381, +45441=>10382, +45443=>10383, +45444=>10384, +45445=>10385, +45446=>10386, +45447=>10387, +45450=>10388, +45452=>10389, +45454=>10390, +45455=>10391, +45456=>10392, +45457=>10393, +45461=>10394, +45462=>10395, +45463=>10396, +45465=>10397, +45466=>10398, +45467=>10399, +45469=>10400, +45470=>10401, +45471=>10402, +45472=>10403, +45473=>10404, +45474=>10405, +45475=>10406, +45476=>10407, +45477=>10408, +45478=>10409, +45479=>10410, +45481=>10411, +45482=>10412, +45483=>10413, +45484=>10414, +45485=>10415, +45486=>10416, +45487=>10417, +45488=>10418, +45489=>10419, +45490=>10420, +45491=>10421, +45492=>10422, +45493=>10423, +45494=>10424, +45495=>10425, +45496=>10426, +45497=>10427, +45498=>10428, +45499=>10429, +45500=>10430, +45501=>10431, +45502=>10432, +45503=>10433, +45504=>10434, +45505=>10435, +45506=>10436, +45507=>10437, +45508=>10438, +45509=>10439, +45510=>10440, +45511=>10441, +45512=>10442, +45513=>10443, +45514=>10444, +45515=>10445, +45517=>10446, +45518=>10447, +45519=>10448, +45521=>10449, +45522=>10450, +45523=>10451, +45525=>10452, +45526=>10453, +45527=>10454, +45528=>10455, +45529=>10456, +45530=>10457, +45531=>10458, +45534=>10459, +45536=>10460, +45537=>10461, +45538=>10462, +45539=>10463, +45540=>10464, +45541=>10465, +45542=>10466, +45543=>10467, +45546=>10468, +45547=>10469, +45549=>10470, +45550=>10471, +45551=>10472, +45553=>10473, +45554=>10474, +45555=>10475, +45556=>10476, +45557=>10477, +45558=>10478, +45559=>10479, +45560=>10480, +45562=>10481, +45564=>10482, +45566=>10483, +45567=>10484, +45568=>10485, +45569=>10486, +45570=>10487, +45571=>10488, +45574=>10489, +45575=>10490, +45577=>10491, +45578=>10492, +45581=>10493, +45582=>10494, +45583=>10495, +45584=>10496, +45585=>10497, +45586=>10498, +45587=>10499, +45590=>10500, +45592=>10501, +45594=>10502, +45595=>10503, +45596=>10504, +45597=>10505, +45598=>10506, +45599=>10507, +45601=>10508, +45602=>10509, +45603=>10510, +45604=>10511, +45605=>10512, +45606=>10513, +45607=>10514, +45608=>10515, +45609=>10516, +45610=>10517, +45611=>10518, +45612=>10519, +45613=>10520, +45614=>10521, +45615=>10522, +45616=>10523, +45617=>10524, +45618=>10525, +45619=>10526, +45621=>10527, +45622=>10528, +45623=>10529, +45624=>10530, +45625=>10531, +45626=>10532, +45627=>10533, +45629=>10534, +45630=>10535, +45631=>10536, +45632=>10537, +45633=>10538, +45634=>10539, +45635=>10540, +45636=>10541, +45637=>10542, +45638=>10543, +45639=>10544, +45640=>10545, +45641=>10546, +45642=>10547, +45643=>10548, +45644=>10549, +45645=>10550, +45646=>10551, +45647=>10552, +45648=>10553, +45649=>10554, +45650=>10555, +45651=>10556, +45652=>10557, +45653=>10558, +45654=>10559, +45655=>10560, +45657=>10561, +45658=>10562, +45659=>10563, +45661=>10564, +45662=>10565, +45663=>10566, +45665=>10567, +45666=>10568, +45667=>10569, +45668=>10570, +45669=>10571, +45670=>10572, +45671=>10573, +45674=>10574, +45675=>10575, +45676=>10576, +45677=>10577, +45678=>10578, +45679=>10579, +45680=>10580, +45681=>10581, +45682=>10582, +45683=>10583, +45686=>10584, +45687=>10585, +45688=>10586, +45689=>10587, +45690=>10588, +45691=>10589, +45693=>10590, +45694=>10591, +45695=>10592, +45696=>10593, +45697=>10594, +45698=>10595, +45699=>10596, +45702=>10597, +45703=>10598, +45704=>10599, +45706=>10600, +45707=>10601, +45708=>10602, +45709=>10603, +45710=>10604, +45711=>10605, +45714=>10606, +45715=>10607, +45717=>10608, +45718=>10609, +45719=>10610, +45723=>10611, +45724=>10612, +45725=>10613, +45726=>10614, +45727=>10615, +45730=>10616, +45732=>10617, +45735=>10618, +45736=>10619, +45737=>10620, +45739=>10621, +45741=>10622, +45742=>10623, +45743=>10624, +45745=>10625, +45746=>10626, +45747=>10627, +45749=>10628, +45750=>10629, +45751=>10630, +45752=>10631, +45753=>10632, +45754=>10633, +45755=>10634, +45756=>10635, +45757=>10636, +45758=>10637, +45759=>10638, +45760=>10639, +45761=>10640, +45762=>10641, +45763=>10642, +45764=>10643, +45765=>10644, +45766=>10645, +45767=>10646, +45770=>10647, +45771=>10648, +45773=>10649, +45774=>10650, +45775=>10651, +45777=>10652, +45779=>10653, +45780=>10654, +45781=>10655, +45782=>10656, +45783=>10657, +45786=>10658, +45788=>10659, +45790=>10660, +45791=>10661, +45792=>10662, +45793=>10663, +45795=>10664, +45799=>10665, +45801=>10666, +45802=>10667, +45808=>10668, +45809=>10669, +45810=>10670, +45814=>10671, +45820=>10672, +45821=>10673, +45822=>10674, +45826=>10675, +45827=>10676, +45829=>10677, +45830=>10678, +45831=>10679, +45833=>10680, +45834=>10681, +45835=>10682, +45836=>10683, +45837=>10684, +45838=>10685, +45839=>10686, +45842=>10687, +45846=>10688, +45847=>10689, +45848=>10690, +45849=>10691, +45850=>10692, +45851=>10693, +45853=>10694, +45854=>10695, +45855=>10696, +45856=>10697, +45857=>10698, +45858=>10699, +45859=>10700, +45860=>10701, +45861=>10702, +45862=>10703, +45863=>10704, +45864=>10705, +45865=>10706, +45866=>10707, +45867=>10708, +45868=>10709, +45869=>10710, +45870=>10711, +45871=>10712, +45872=>10713, +45873=>10714, +45874=>10715, +45875=>10716, +45876=>10717, +45877=>10718, +45878=>10719, +45879=>10720, +45880=>10721, +45881=>10722, +45882=>10723, +45883=>10724, +45884=>10725, +45885=>10726, +45886=>10727, +45887=>10728, +45888=>10729, +45889=>10730, +45890=>10731, +45891=>10732, +45892=>10733, +45893=>10734, +45894=>10735, +45895=>10736, +45896=>10737, +45897=>10738, +45898=>10739, +45899=>10740, +45900=>10741, +45901=>10742, +45902=>10743, +45903=>10744, +45904=>10745, +45905=>10746, +45906=>10747, +45907=>10748, +45911=>10749, +45913=>10750, +45914=>10751, +45917=>10752, +45920=>10753, +45921=>10754, +45922=>10755, +45923=>10756, +45926=>10757, +45928=>10758, +45930=>10759, +45932=>10760, +45933=>10761, +45935=>10762, +45938=>10763, +45939=>10764, +45941=>10765, +45942=>10766, +45943=>10767, +45945=>10768, +45946=>10769, +45947=>10770, +45948=>10771, +45949=>10772, +45950=>10773, +45951=>10774, +45954=>10775, +45958=>10776, +45959=>10777, +45960=>10778, +45961=>10779, +45962=>10780, +45963=>10781, +45965=>10782, +45966=>10783, +45967=>10784, +45969=>10785, +45970=>10786, +45971=>10787, +45973=>10788, +45974=>10789, +45975=>10790, +45976=>10791, +45977=>10792, +45978=>10793, +45979=>10794, +45980=>10795, +45981=>10796, +45982=>10797, +45983=>10798, +45986=>10799, +45987=>10800, +45988=>10801, +45989=>10802, +45990=>10803, +45991=>10804, +45993=>10805, +45994=>10806, +45995=>10807, +45997=>10808, +45998=>10809, +45999=>10810, +46000=>10811, +46001=>10812, +46002=>10813, +46003=>10814, +46004=>10815, +46005=>10816, +46006=>10817, +46007=>10818, +46008=>10819, +46009=>10820, +46010=>10821, +46011=>10822, +46012=>10823, +46013=>10824, +46014=>10825, +46015=>10826, +46016=>10827, +46017=>10828, +46018=>10829, +46019=>10830, +46022=>10831, +46023=>10832, +46025=>10833, +46026=>10834, +46029=>10835, +46031=>10836, +46033=>10837, +46034=>10838, +46035=>10839, +46038=>10840, +46040=>10841, +46042=>10842, +46044=>10843, +46046=>10844, +46047=>10845, +46049=>10846, +46050=>10847, +46051=>10848, +46053=>10849, +46054=>10850, +46055=>10851, +46057=>10852, +46058=>10853, +46059=>10854, +46060=>10855, +46061=>10856, +46062=>10857, +46063=>10858, +46064=>10859, +46065=>10860, +46066=>10861, +46067=>10862, +46068=>10863, +46069=>10864, +46070=>10865, +46071=>10866, +46072=>10867, +46073=>10868, +46074=>10869, +46075=>10870, +46077=>10871, +46078=>10872, +46079=>10873, +46080=>10874, +46081=>10875, +46082=>10876, +46083=>10877, +46084=>10878, +46085=>10879, +46086=>10880, +46087=>10881, +46088=>10882, +46089=>10883, +46090=>10884, +46091=>10885, +46092=>10886, +46093=>10887, +46094=>10888, +46095=>10889, +46097=>10890, +46098=>10891, +46099=>10892, +46100=>10893, +46101=>10894, +46102=>10895, +46103=>10896, +46105=>10897, +46106=>10898, +46107=>10899, +46109=>10900, +46110=>10901, +46111=>10902, +46113=>10903, +46114=>10904, +46115=>10905, +46116=>10906, +46117=>10907, +46118=>10908, +46119=>10909, +46122=>10910, +46124=>10911, +46125=>10912, +46126=>10913, +46127=>10914, +46128=>10915, +46129=>10916, +46130=>10917, +46131=>10918, +46133=>10919, +46134=>10920, +46135=>10921, +46136=>10922, +46137=>10923, +46138=>10924, +46139=>10925, +46140=>10926, +46141=>10927, +46142=>10928, +46143=>10929, +46144=>10930, +46145=>10931, +46146=>10932, +46147=>10933, +46148=>10934, +46149=>10935, +46150=>10936, +46151=>10937, +46152=>10938, +46153=>10939, +46154=>10940, +46155=>10941, +46156=>10942, +46157=>10943, +46158=>10944, +46159=>10945, +46162=>10946, +46163=>10947, +46165=>10948, +46166=>10949, +46167=>10950, +46169=>10951, +46170=>10952, +46171=>10953, +46172=>10954, +46173=>10955, +46174=>10956, +46175=>10957, +46178=>10958, +46180=>10959, +46182=>10960, +46183=>10961, +46184=>10962, +46185=>10963, +46186=>10964, +46187=>10965, +46189=>10966, +46190=>10967, +46191=>10968, +46192=>10969, +46193=>10970, +46194=>10971, +46195=>10972, +46196=>10973, +46197=>10974, +46198=>10975, +46199=>10976, +46200=>10977, +46201=>10978, +46202=>10979, +46203=>10980, +46204=>10981, +46205=>10982, +46206=>10983, +46207=>10984, +46209=>10985, +46210=>10986, +46211=>10987, +46212=>10988, +46213=>10989, +46214=>10990, +46215=>10991, +46217=>10992, +46218=>10993, +46219=>10994, +46220=>10995, +46221=>10996, +46222=>10997, +46223=>10998, +46224=>10999, +46225=>11000, +46226=>11001, +46227=>11002, +46228=>11003, +46229=>11004, +46230=>11005, +46231=>11006, +46232=>11007, +46233=>11008, +46234=>11009, +46235=>11010, +46236=>11011, +46238=>11012, +46239=>11013, +46240=>11014, +46241=>11015, +46242=>11016, +46243=>11017, +46245=>11018, +46246=>11019, +46247=>11020, +46249=>11021, +46250=>11022, +46251=>11023, +46253=>11024, +46254=>11025, +46255=>11026, +46256=>11027, +46257=>11028, +46258=>11029, +46259=>11030, +46260=>11031, +46262=>11032, +46264=>11033, +46266=>11034, +46267=>11035, +46268=>11036, +46269=>11037, +46270=>11038, +46271=>11039, +46273=>11040, +46274=>11041, +46275=>11042, +46277=>11043, +46278=>11044, +46279=>11045, +46281=>11046, +46282=>11047, +46283=>11048, +46284=>11049, +46285=>11050, +46286=>11051, +46287=>11052, +46289=>11053, +46290=>11054, +46291=>11055, +46292=>11056, +46294=>11057, +46295=>11058, +46296=>11059, +46297=>11060, +46298=>11061, +46299=>11062, +46302=>11063, +46303=>11064, +46305=>11065, +46306=>11066, +46309=>11067, +46311=>11068, +46312=>11069, +46313=>11070, +46314=>11071, +46315=>11072, +46318=>11073, +46320=>11074, +46322=>11075, +46323=>11076, +46324=>11077, +46325=>11078, +46326=>11079, +46327=>11080, +46329=>11081, +46330=>11082, +46331=>11083, +46332=>11084, +46333=>11085, +46334=>11086, +46335=>11087, +46336=>11088, +46337=>11089, +46338=>11090, +46339=>11091, +46340=>11092, +46341=>11093, +46342=>11094, +46343=>11095, +46344=>11096, +46345=>11097, +46346=>11098, +46347=>11099, +46348=>11100, +46349=>11101, +46350=>11102, +46351=>11103, +46352=>11104, +46353=>11105, +46354=>11106, +46355=>11107, +46358=>11108, +46359=>11109, +46361=>11110, +46362=>11111, +46365=>11112, +46366=>11113, +46367=>11114, +46368=>11115, +46369=>11116, +46370=>11117, +46371=>11118, +46374=>11119, +46379=>11120, +46380=>11121, +46381=>11122, +46382=>11123, +46383=>11124, +46386=>11125, +46387=>11126, +46389=>11127, +46390=>11128, +46391=>11129, +46393=>11130, +46394=>11131, +46395=>11132, +46396=>11133, +46397=>11134, +46398=>11135, +46399=>11136, +46402=>11137, +46406=>11138, +46407=>11139, +46408=>11140, +46409=>11141, +46410=>11142, +46414=>11143, +46415=>11144, +46417=>11145, +46418=>11146, +46419=>11147, +46421=>11148, +46422=>11149, +46423=>11150, +46424=>11151, +46425=>11152, +46426=>11153, +46427=>11154, +46430=>11155, +46434=>11156, +46435=>11157, +46436=>11158, +46437=>11159, +46438=>11160, +46439=>11161, +46440=>11162, +46441=>11163, +46442=>11164, +46443=>11165, +46444=>11166, +46445=>11167, +46446=>11168, +46447=>11169, +46448=>11170, +46449=>11171, +46450=>11172, +46451=>11173, +46452=>11174, +46453=>11175, +46454=>11176, +46455=>11177, +46456=>11178, +46457=>11179, +46458=>11180, +46459=>11181, +46460=>11182, +46461=>11183, +46462=>11184, +46463=>11185, +46464=>11186, +46465=>11187, +46466=>11188, +46467=>11189, +46468=>11190, +46469=>11191, +46470=>11192, +46471=>11193, +46472=>11194, +46473=>11195, +46474=>11196, +46475=>11197, +46476=>11198, +46477=>11199, +46478=>11200, +46479=>11201, +46480=>11202, +46481=>11203, +46482=>11204, +46483=>11205, +46484=>11206, +46485=>11207, +46486=>11208, +46487=>11209, +46488=>11210, +46489=>11211, +46490=>11212, +46491=>11213, +46492=>11214, +46493=>11215, +46494=>11216, +46495=>11217, +46498=>11218, +46499=>11219, +46501=>11220, +46502=>11221, +46503=>11222, +46505=>11223, +46508=>11224, +46509=>11225, +46510=>11226, +46511=>11227, +46514=>11228, +46518=>11229, +46519=>11230, +46520=>11231, +46521=>11232, +46522=>11233, +46526=>11234, +46527=>11235, +46529=>11236, +46530=>11237, +46531=>11238, +46533=>11239, +46534=>11240, +46535=>11241, +46536=>11242, +46537=>11243, +46538=>11244, +46539=>11245, +46542=>11246, +46546=>11247, +46547=>11248, +46548=>11249, +46549=>11250, +46550=>11251, +46551=>11252, +46553=>11253, +46554=>11254, +46555=>11255, +46556=>11256, +46557=>11257, +46558=>11258, +46559=>11259, +46560=>11260, +46561=>11261, +46562=>11262, +46563=>11263, +46564=>11264, +46565=>11265, +46566=>11266, +46567=>11267, +46568=>11268, +46569=>11269, +46570=>11270, +46571=>11271, +46573=>11272, +46574=>11273, +46575=>11274, +46576=>11275, +46577=>11276, +46578=>11277, +46579=>11278, +46580=>11279, +46581=>11280, +46582=>11281, +46583=>11282, +46584=>11283, +46585=>11284, +46586=>11285, +46587=>11286, +46588=>11287, +46589=>11288, +46590=>11289, +46591=>11290, +46592=>11291, +46593=>11292, +46594=>11293, +46595=>11294, +46596=>11295, +46597=>11296, +46598=>11297, +46599=>11298, +46600=>11299, +46601=>11300, +46602=>11301, +46603=>11302, +46604=>11303, +46605=>11304, +46606=>11305, +46607=>11306, +46610=>11307, +46611=>11308, +46613=>11309, +46614=>11310, +46615=>11311, +46617=>11312, +46618=>11313, +46619=>11314, +46620=>11315, +46621=>11316, +46622=>11317, +46623=>11318, +46624=>11319, +46625=>11320, +46626=>11321, +46627=>11322, +46628=>11323, +46630=>11324, +46631=>11325, +46632=>11326, +46633=>11327, +46634=>11328, +46635=>11329, +46637=>11330, +46638=>11331, +46639=>11332, +46640=>11333, +46641=>11334, +46642=>11335, +46643=>11336, +46645=>11337, +46646=>11338, +46647=>11339, +46648=>11340, +46649=>11341, +46650=>11342, +46651=>11343, +46652=>11344, +46653=>11345, +46654=>11346, +46655=>11347, +46656=>11348, +46657=>11349, +46658=>11350, +46659=>11351, +46660=>11352, +46661=>11353, +46662=>11354, +46663=>11355, +46665=>11356, +46666=>11357, +46667=>11358, +46668=>11359, +46669=>11360, +46670=>11361, +46671=>11362, +46672=>11363, +46673=>11364, +46674=>11365, +46675=>11366, +46676=>11367, +46677=>11368, +46678=>11369, +46679=>11370, +46680=>11371, +46681=>11372, +46682=>11373, +46683=>11374, +46684=>11375, +46685=>11376, +46686=>11377, +46687=>11378, +46688=>11379, +46689=>11380, +46690=>11381, +46691=>11382, +46693=>11383, +46694=>11384, +46695=>11385, +46697=>11386, +46698=>11387, +46699=>11388, +46700=>11389, +46701=>11390, +46702=>11391, +46703=>11392, +46704=>11393, +46705=>11394, +46706=>11395, +46707=>11396, +46708=>11397, +46709=>11398, +46710=>11399, +46711=>11400, +46712=>11401, +46713=>11402, +46714=>11403, +46715=>11404, +46716=>11405, +46717=>11406, +46718=>11407, +46719=>11408, +46720=>11409, +46721=>11410, +46722=>11411, +46723=>11412, +46724=>11413, +46725=>11414, +46726=>11415, +46727=>11416, +46728=>11417, +46729=>11418, +46730=>11419, +46731=>11420, +46732=>11421, +46733=>11422, +46734=>11423, +46735=>11424, +46736=>11425, +46737=>11426, +46738=>11427, +46739=>11428, +46740=>11429, +46741=>11430, +46742=>11431, +46743=>11432, +46744=>11433, +46745=>11434, +46746=>11435, +46747=>11436, +46750=>11437, +46751=>11438, +46753=>11439, +46754=>11440, +46755=>11441, +46757=>11442, +46758=>11443, +46759=>11444, +46760=>11445, +46761=>11446, +46762=>11447, +46765=>11448, +46766=>11449, +46767=>11450, +46768=>11451, +46770=>11452, +46771=>11453, +46772=>11454, +46773=>11455, +46774=>11456, +46775=>11457, +46776=>11458, +46777=>11459, +46778=>11460, +46779=>11461, +46780=>11462, +46781=>11463, +46782=>11464, +46783=>11465, +46784=>11466, +46785=>11467, +46786=>11468, +46787=>11469, +46788=>11470, +46789=>11471, +46790=>11472, +46791=>11473, +46792=>11474, +46793=>11475, +46794=>11476, +46795=>11477, +46796=>11478, +46797=>11479, +46798=>11480, +46799=>11481, +46800=>11482, +46801=>11483, +46802=>11484, +46803=>11485, +46805=>11486, +46806=>11487, +46807=>11488, +46808=>11489, +46809=>11490, +46810=>11491, +46811=>11492, +46812=>11493, +46813=>11494, +46814=>11495, +46815=>11496, +46816=>11497, +46817=>11498, +46818=>11499, +46819=>11500, +46820=>11501, +46821=>11502, +46822=>11503, +46823=>11504, +46824=>11505, +46825=>11506, +46826=>11507, +46827=>11508, +46828=>11509, +46829=>11510, +46830=>11511, +46831=>11512, +46833=>11513, +46834=>11514, +46835=>11515, +46837=>11516, +46838=>11517, +46839=>11518, +46841=>11519, +46842=>11520, +46843=>11521, +46844=>11522, +46845=>11523, +46846=>11524, +46847=>11525, +46850=>11526, +46851=>11527, +46852=>11528, +46854=>11529, +46855=>11530, +46856=>11531, +46857=>11532, +46858=>11533, +46859=>11534, +46860=>11535, +46861=>11536, +46862=>11537, +46863=>11538, +46864=>11539, +46865=>11540, +46866=>11541, +46867=>11542, +46868=>11543, +46869=>11544, +46870=>11545, +46871=>11546, +46872=>11547, +46873=>11548, +46874=>11549, +46875=>11550, +46876=>11551, +46877=>11552, +46878=>11553, +46879=>11554, +46880=>11555, +46881=>11556, +46882=>11557, +46883=>11558, +46884=>11559, +46885=>11560, +46886=>11561, +46887=>11562, +46890=>11563, +46891=>11564, +46893=>11565, +46894=>11566, +46897=>11567, +46898=>11568, +46899=>11569, +46900=>11570, +46901=>11571, +46902=>11572, +46903=>11573, +46906=>11574, +46908=>11575, +46909=>11576, +46910=>11577, +46911=>11578, +46912=>11579, +46913=>11580, +46914=>11581, +46915=>11582, +46917=>11583, +46918=>11584, +46919=>11585, +46921=>11586, +46922=>11587, +46923=>11588, +46925=>11589, +46926=>11590, +46927=>11591, +46928=>11592, +46929=>11593, +46930=>11594, +46931=>11595, +46934=>11596, +46935=>11597, +46936=>11598, +46937=>11599, +46938=>11600, +46939=>11601, +46940=>11602, +46941=>11603, +46942=>11604, +46943=>11605, +46945=>11606, +46946=>11607, +46947=>11608, +46949=>11609, +46950=>11610, +46951=>11611, +46953=>11612, +46954=>11613, +46955=>11614, +46956=>11615, +46957=>11616, +46958=>11617, +46959=>11618, +46962=>11619, +46964=>11620, +46966=>11621, +46967=>11622, +46968=>11623, +46969=>11624, +46970=>11625, +46971=>11626, +46974=>11627, +46975=>11628, +46977=>11629, +46978=>11630, +46979=>11631, +46981=>11632, +46982=>11633, +46983=>11634, +46984=>11635, +46985=>11636, +46986=>11637, +46987=>11638, +46990=>11639, +46995=>11640, +46996=>11641, +46997=>11642, +47002=>11643, +47003=>11644, +47005=>11645, +47006=>11646, +47007=>11647, +47009=>11648, +47010=>11649, +47011=>11650, +47012=>11651, +47013=>11652, +47014=>11653, +47015=>11654, +47018=>11655, +47022=>11656, +47023=>11657, +47024=>11658, +47025=>11659, +47026=>11660, +47027=>11661, +47030=>11662, +47031=>11663, +47033=>11664, +47034=>11665, +47035=>11666, +47036=>11667, +47037=>11668, +47038=>11669, +47039=>11670, +47040=>11671, +47041=>11672, +47042=>11673, +47043=>11674, +47044=>11675, +47045=>11676, +47046=>11677, +47048=>11678, +47050=>11679, +47051=>11680, +47052=>11681, +47053=>11682, +47054=>11683, +47055=>11684, +47056=>11685, +47057=>11686, +47058=>11687, +47059=>11688, +47060=>11689, +47061=>11690, +47062=>11691, +47063=>11692, +47064=>11693, +47065=>11694, +47066=>11695, +47067=>11696, +47068=>11697, +47069=>11698, +47070=>11699, +47071=>11700, +47072=>11701, +47073=>11702, +47074=>11703, +47075=>11704, +47076=>11705, +47077=>11706, +47078=>11707, +47079=>11708, +47080=>11709, +47081=>11710, +47082=>11711, +47083=>11712, +47086=>11713, +47087=>11714, +47089=>11715, +47090=>11716, +47091=>11717, +47093=>11718, +47094=>11719, +47095=>11720, +47096=>11721, +47097=>11722, +47098=>11723, +47099=>11724, +47102=>11725, +47106=>11726, +47107=>11727, +47108=>11728, +47109=>11729, +47110=>11730, +47114=>11731, +47115=>11732, +47117=>11733, +47118=>11734, +47119=>11735, +47121=>11736, +47122=>11737, +47123=>11738, +47124=>11739, +47125=>11740, +47126=>11741, +47127=>11742, +47130=>11743, +47132=>11744, +47134=>11745, +47135=>11746, +47136=>11747, +47137=>11748, +47138=>11749, +47139=>11750, +47142=>11751, +47143=>11752, +47145=>11753, +47146=>11754, +47147=>11755, +47149=>11756, +47150=>11757, +47151=>11758, +47152=>11759, +47153=>11760, +47154=>11761, +47155=>11762, +47158=>11763, +47162=>11764, +47163=>11765, +47164=>11766, +47165=>11767, +47166=>11768, +47167=>11769, +47169=>11770, +47170=>11771, +47171=>11772, +47173=>11773, +47174=>11774, +47175=>11775, +47176=>11776, +47177=>11777, +47178=>11778, +47179=>11779, +47180=>11780, +47181=>11781, +47182=>11782, +47183=>11783, +47184=>11784, +47186=>11785, +47188=>11786, +47189=>11787, +47190=>11788, +47191=>11789, +47192=>11790, +47193=>11791, +47194=>11792, +47195=>11793, +47198=>11794, +47199=>11795, +47201=>11796, +47202=>11797, +47203=>11798, +47205=>11799, +47206=>11800, +47207=>11801, +47208=>11802, +47209=>11803, +47210=>11804, +47211=>11805, +47214=>11806, +47216=>11807, +47218=>11808, +47219=>11809, +47220=>11810, +47221=>11811, +47222=>11812, +47223=>11813, +47225=>11814, +47226=>11815, +47227=>11816, +47229=>11817, +47230=>11818, +47231=>11819, +47232=>11820, +47233=>11821, +47234=>11822, +47235=>11823, +47236=>11824, +47237=>11825, +47238=>11826, +47239=>11827, +47240=>11828, +47241=>11829, +47242=>11830, +47243=>11831, +47244=>11832, +47246=>11833, +47247=>11834, +47248=>11835, +47249=>11836, +47250=>11837, +47251=>11838, +47252=>11839, +47253=>11840, +47254=>11841, +47255=>11842, +47256=>11843, +47257=>11844, +47258=>11845, +47259=>11846, +47260=>11847, +47261=>11848, +47262=>11849, +47263=>11850, +47264=>11851, +47265=>11852, +47266=>11853, +47267=>11854, +47268=>11855, +47269=>11856, +47270=>11857, +47271=>11858, +47273=>11859, +47274=>11860, +47275=>11861, +47276=>11862, +47277=>11863, +47278=>11864, +47279=>11865, +47281=>11866, +47282=>11867, +47283=>11868, +47285=>11869, +47286=>11870, +47287=>11871, +47289=>11872, +47290=>11873, +47291=>11874, +47292=>11875, +47293=>11876, +47294=>11877, +47295=>11878, +47298=>11879, +47300=>11880, +47302=>11881, +47303=>11882, +47304=>11883, +47305=>11884, +47306=>11885, +47307=>11886, +47309=>11887, +47310=>11888, +47311=>11889, +47313=>11890, +47314=>11891, +47315=>11892, +47317=>11893, +47318=>11894, +47319=>11895, +47320=>11896, +47321=>11897, +47322=>11898, +47323=>11899, +47324=>11900, +47326=>11901, +47328=>11902, +47330=>11903, +47331=>11904, +47332=>11905, +47333=>11906, +47334=>11907, +47335=>11908, +47338=>11909, +47339=>11910, +47341=>11911, +47342=>11912, +47343=>11913, +47345=>11914, +47346=>11915, +47347=>11916, +47348=>11917, +47349=>11918, +47350=>11919, +47351=>11920, +47354=>11921, +47356=>11922, +47358=>11923, +47359=>11924, +47360=>11925, +47361=>11926, +47362=>11927, +47363=>11928, +47365=>11929, +47366=>11930, +47367=>11931, +47368=>11932, +47369=>11933, +47370=>11934, +47371=>11935, +47372=>11936, +47373=>11937, +47374=>11938, +47375=>11939, +47376=>11940, +47377=>11941, +47378=>11942, +47379=>11943, +47380=>11944, +47381=>11945, +47382=>11946, +47383=>11947, +47385=>11948, +47386=>11949, +47387=>11950, +47388=>11951, +47389=>11952, +47390=>11953, +47391=>11954, +47393=>11955, +47394=>11956, +47395=>11957, +47396=>11958, +47397=>11959, +47398=>11960, +47399=>11961, +47400=>11962, +47401=>11963, +47402=>11964, +47403=>11965, +47404=>11966, +47405=>11967, +47406=>11968, +47407=>11969, +47408=>11970, +47409=>11971, +47410=>11972, +47411=>11973, +47412=>11974, +47413=>11975, +47414=>11976, +47415=>11977, +47416=>11978, +47417=>11979, +47418=>11980, +47419=>11981, +47422=>11982, +47423=>11983, +47425=>11984, +47426=>11985, +47427=>11986, +47429=>11987, +47430=>11988, +47431=>11989, +47432=>11990, +47433=>11991, +47434=>11992, +47435=>11993, +47437=>11994, +47438=>11995, +47440=>11996, +47442=>11997, +47443=>11998, +47444=>11999, +47445=>12000, +47446=>12001, +47447=>12002, +47450=>12003, +47451=>12004, +47453=>12005, +47454=>12006, +47455=>12007, +47457=>12008, +47458=>12009, +47459=>12010, +47460=>12011, +47461=>12012, +47462=>12013, +47463=>12014, +47466=>12015, +47468=>12016, +47470=>12017, +47471=>12018, +47472=>12019, +47473=>12020, +47474=>12021, +47475=>12022, +47478=>12023, +47479=>12024, +47481=>12025, +47482=>12026, +47483=>12027, +47485=>12028, +47486=>12029, +47487=>12030, +47488=>12031, +47489=>12032, +47490=>12033, +47491=>12034, +47494=>12035, +47496=>12036, +47499=>12037, +47500=>12038, +47503=>12039, +47504=>12040, +47505=>12041, +47506=>12042, +47507=>12043, +47508=>12044, +47509=>12045, +47510=>12046, +47511=>12047, +47512=>12048, +47513=>12049, +47514=>12050, +47515=>12051, +47516=>12052, +47517=>12053, +47518=>12054, +47519=>12055, +47520=>12056, +47521=>12057, +47522=>12058, +47523=>12059, +47524=>12060, +47525=>12061, +47526=>12062, +47527=>12063, +47528=>12064, +47529=>12065, +47530=>12066, +47531=>12067, +47534=>12068, +47535=>12069, +47537=>12070, +47538=>12071, +47539=>12072, +47541=>12073, +47542=>12074, +47543=>12075, +47544=>12076, +47545=>12077, +47546=>12078, +47547=>12079, +47550=>12080, +47552=>12081, +47554=>12082, +47555=>12083, +47556=>12084, +47557=>12085, +47558=>12086, +47559=>12087, +47562=>12088, +47563=>12089, +47565=>12090, +47571=>12091, +47572=>12092, +47573=>12093, +47574=>12094, +47575=>12095, +47578=>12096, +47580=>12097, +47583=>12098, +47584=>12099, +47586=>12100, +47590=>12101, +47591=>12102, +47593=>12103, +47594=>12104, +47595=>12105, +47597=>12106, +47598=>12107, +47599=>12108, +47600=>12109, +47601=>12110, +47602=>12111, +47603=>12112, +47606=>12113, +47611=>12114, +47612=>12115, +47613=>12116, +47614=>12117, +47615=>12118, +47618=>12119, +47619=>12120, +47620=>12121, +47621=>12122, +47622=>12123, +47623=>12124, +47625=>12125, +47626=>12126, +47627=>12127, +47628=>12128, +47629=>12129, +47630=>12130, +47631=>12131, +47632=>12132, +47633=>12133, +47634=>12134, +47635=>12135, +47636=>12136, +47638=>12137, +47639=>12138, +47640=>12139, +47641=>12140, +47642=>12141, +47643=>12142, +47644=>12143, +47645=>12144, +47646=>12145, +47647=>12146, +47648=>12147, +47649=>12148, +47650=>12149, +47651=>12150, +47652=>12151, +47653=>12152, +47654=>12153, +47655=>12154, +47656=>12155, +47657=>12156, +47658=>12157, +47659=>12158, +47660=>12159, +47661=>12160, +47662=>12161, +47663=>12162, +47664=>12163, +47665=>12164, +47666=>12165, +47667=>12166, +47668=>12167, +47669=>12168, +47670=>12169, +47671=>12170, +47674=>12171, +47675=>12172, +47677=>12173, +47678=>12174, +47679=>12175, +47681=>12176, +47683=>12177, +47684=>12178, +47685=>12179, +47686=>12180, +47687=>12181, +47690=>12182, +47692=>12183, +47695=>12184, +47696=>12185, +47697=>12186, +47698=>12187, +47702=>12188, +47703=>12189, +47705=>12190, +47706=>12191, +47707=>12192, +47709=>12193, +47710=>12194, +47711=>12195, +47712=>12196, +47713=>12197, +47714=>12198, +47715=>12199, +47718=>12200, +47722=>12201, +47723=>12202, +47724=>12203, +47725=>12204, +47726=>12205, +47727=>12206, +47730=>12207, +47731=>12208, +47733=>12209, +47734=>12210, +47735=>12211, +47737=>12212, +47738=>12213, +47739=>12214, +47740=>12215, +47741=>12216, +47742=>12217, +47743=>12218, +47744=>12219, +47745=>12220, +47746=>12221, +47750=>12222, +47752=>12223, +47753=>12224, +47754=>12225, +47755=>12226, +47757=>12227, +47758=>12228, +47759=>12229, +47760=>12230, +47761=>12231, +47762=>12232, +47763=>12233, +47764=>12234, +47765=>12235, +47766=>12236, +47767=>12237, +47768=>12238, +47769=>12239, +47770=>12240, +47771=>12241, +47772=>12242, +47773=>12243, +47774=>12244, +47775=>12245, +47776=>12246, +47777=>12247, +47778=>12248, +47779=>12249, +47780=>12250, +47781=>12251, +47782=>12252, +47783=>12253, +47786=>12254, +47789=>12255, +47790=>12256, +47791=>12257, +47793=>12258, +47795=>12259, +47796=>12260, +47797=>12261, +47798=>12262, +47799=>12263, +47802=>12264, +47804=>12265, +47806=>12266, +47807=>12267, +47808=>12268, +47809=>12269, +47810=>12270, +47811=>12271, +47813=>12272, +47814=>12273, +47815=>12274, +47817=>12275, +47818=>12276, +47819=>12277, +47820=>12278, +47821=>12279, +47822=>12280, +47823=>12281, +47824=>12282, +47825=>12283, +47826=>12284, +47827=>12285, +47828=>12286, +47829=>12287, +47830=>12288, +47831=>12289, +47834=>12290, +47835=>12291, +47836=>12292, +47837=>12293, +47838=>12294, +47839=>12295, +47840=>12296, +47841=>12297, +47842=>12298, +47843=>12299, +47844=>12300, +47845=>12301, +47846=>12302, +47847=>12303, +47848=>12304, +47849=>12305, +47850=>12306, +47851=>12307, +47852=>12308, +47853=>12309, +47854=>12310, +47855=>12311, +47856=>12312, +47857=>12313, +47858=>12314, +47859=>12315, +47860=>12316, +47861=>12317, +47862=>12318, +47863=>12319, +47864=>12320, +47865=>12321, +47866=>12322, +47867=>12323, +47869=>12324, +47870=>12325, +47871=>12326, +47873=>12327, +47874=>12328, +47875=>12329, +47877=>12330, +47878=>12331, +47879=>12332, +47880=>12333, +47881=>12334, +47882=>12335, +47883=>12336, +47884=>12337, +47886=>12338, +47888=>12339, +47890=>12340, +47891=>12341, +47892=>12342, +47893=>12343, +47894=>12344, +47895=>12345, +47897=>12346, +47898=>12347, +47899=>12348, +47901=>12349, +47902=>12350, +47903=>12351, +47905=>12352, +47906=>12353, +47907=>12354, +47908=>12355, +47909=>12356, +47910=>12357, +47911=>12358, +47912=>12359, +47914=>12360, +47916=>12361, +47917=>12362, +47918=>12363, +47919=>12364, +47920=>12365, +47921=>12366, +47922=>12367, +47923=>12368, +47927=>12369, +47929=>12370, +47930=>12371, +47935=>12372, +47936=>12373, +47937=>12374, +47938=>12375, +47939=>12376, +47942=>12377, +47944=>12378, +47946=>12379, +47947=>12380, +47948=>12381, +47950=>12382, +47953=>12383, +47954=>12384, +47955=>12385, +47957=>12386, +47958=>12387, +47959=>12388, +47961=>12389, +47962=>12390, +47963=>12391, +47964=>12392, +47965=>12393, +47966=>12394, +47967=>12395, +47968=>12396, +47970=>12397, +47972=>12398, +47973=>12399, +47974=>12400, +47975=>12401, +47976=>12402, +47977=>12403, +47978=>12404, +47979=>12405, +47981=>12406, +47982=>12407, +47983=>12408, +47984=>12409, +47985=>12410, +47986=>12411, +47987=>12412, +47988=>12413, +47989=>12414, +47990=>12415, +47991=>12416, +47992=>12417, +47993=>12418, +47994=>12419, +47995=>12420, +47996=>12421, +47997=>12422, +47998=>12423, +47999=>12424, +48000=>12425, +48001=>12426, +48002=>12427, +48003=>12428, +48004=>12429, +48005=>12430, +48006=>12431, +48007=>12432, +48009=>12433, +48010=>12434, +48011=>12435, +48013=>12436, +48014=>12437, +48015=>12438, +48017=>12439, +48018=>12440, +48019=>12441, +48020=>12442, +48021=>12443, +48022=>12444, +48023=>12445, +48024=>12446, +48025=>12447, +48026=>12448, +48027=>12449, +48028=>12450, +48029=>12451, +48030=>12452, +48031=>12453, +48032=>12454, +48033=>12455, +48034=>12456, +48035=>12457, +48037=>12458, +48038=>12459, +48039=>12460, +48041=>12461, +48042=>12462, +48043=>12463, +48045=>12464, +48046=>12465, +48047=>12466, +48048=>12467, +48049=>12468, +48050=>12469, +48051=>12470, +48053=>12471, +48054=>12472, +48056=>12473, +48057=>12474, +48058=>12475, +48059=>12476, +48060=>12477, +48061=>12478, +48062=>12479, +48063=>12480, +48065=>12481, +48066=>12482, +48067=>12483, +48069=>12484, +48070=>12485, +48071=>12486, +48073=>12487, +48074=>12488, +48075=>12489, +48076=>12490, +48077=>12491, +48078=>12492, +48079=>12493, +48081=>12494, +48082=>12495, +48084=>12496, +48085=>12497, +48086=>12498, +48087=>12499, +48088=>12500, +48089=>12501, +48090=>12502, +48091=>12503, +48092=>12504, +48093=>12505, +48094=>12506, +48095=>12507, +48096=>12508, +48097=>12509, +48098=>12510, +48099=>12511, +48100=>12512, +48101=>12513, +48102=>12514, +48103=>12515, +48104=>12516, +48105=>12517, +48106=>12518, +48107=>12519, +48108=>12520, +48109=>12521, +48110=>12522, +48111=>12523, +48112=>12524, +48113=>12525, +48114=>12526, +48115=>12527, +48116=>12528, +48117=>12529, +48118=>12530, +48119=>12531, +48122=>12532, +48123=>12533, +48125=>12534, +48126=>12535, +48129=>12536, +48131=>12537, +48132=>12538, +48133=>12539, +48134=>12540, +48135=>12541, +48138=>12542, +48142=>12543, +48144=>12544, +48146=>12545, +48147=>12546, +48153=>12547, +48154=>12548, +48160=>12549, +48161=>12550, +48162=>12551, +48163=>12552, +48166=>12553, +48168=>12554, +48170=>12555, +48171=>12556, +48172=>12557, +48174=>12558, +48175=>12559, +48178=>12560, +48179=>12561, +48181=>12562, +48182=>12563, +48183=>12564, +48185=>12565, +48186=>12566, +48187=>12567, +48188=>12568, +48189=>12569, +48190=>12570, +48191=>12571, +48194=>12572, +48198=>12573, +48199=>12574, +48200=>12575, +48202=>12576, +48203=>12577, +48206=>12578, +48207=>12579, +48209=>12580, +48210=>12581, +48211=>12582, +48212=>12583, +48213=>12584, +48214=>12585, +48215=>12586, +48216=>12587, +48217=>12588, +48218=>12589, +48219=>12590, +48220=>12591, +48222=>12592, +48223=>12593, +48224=>12594, +48225=>12595, +48226=>12596, +48227=>12597, +48228=>12598, +48229=>12599, +48230=>12600, +48231=>12601, +48232=>12602, +48233=>12603, +48234=>12604, +48235=>12605, +48236=>12606, +48237=>12607, +48238=>12608, +48239=>12609, +48240=>12610, +48241=>12611, +48242=>12612, +48243=>12613, +48244=>12614, +48245=>12615, +48246=>12616, +48247=>12617, +48248=>12618, +48249=>12619, +48250=>12620, +48251=>12621, +48252=>12622, +48253=>12623, +48254=>12624, +48255=>12625, +48256=>12626, +48257=>12627, +48258=>12628, +48259=>12629, +48262=>12630, +48263=>12631, +48265=>12632, +48266=>12633, +48269=>12634, +48271=>12635, +48272=>12636, +48273=>12637, +48274=>12638, +48275=>12639, +48278=>12640, +48280=>12641, +48283=>12642, +48284=>12643, +48285=>12644, +48286=>12645, +48287=>12646, +48290=>12647, +48291=>12648, +48293=>12649, +48294=>12650, +48297=>12651, +48298=>12652, +48299=>12653, +48300=>12654, +48301=>12655, +48302=>12656, +48303=>12657, +48306=>12658, +48310=>12659, +48311=>12660, +48312=>12661, +48313=>12662, +48314=>12663, +48315=>12664, +48318=>12665, +48319=>12666, +48321=>12667, +48322=>12668, +48323=>12669, +48325=>12670, +48326=>12671, +48327=>12672, +48328=>12673, +48329=>12674, +48330=>12675, +48331=>12676, +48332=>12677, +48334=>12678, +48338=>12679, +48339=>12680, +48340=>12681, +48342=>12682, +48343=>12683, +48345=>12684, +48346=>12685, +48347=>12686, +48349=>12687, +48350=>12688, +48351=>12689, +48352=>12690, +48353=>12691, +48354=>12692, +48355=>12693, +48356=>12694, +48357=>12695, +48358=>12696, +48359=>12697, +48360=>12698, +48361=>12699, +48362=>12700, +48363=>12701, +48364=>12702, +48365=>12703, +48366=>12704, +48367=>12705, +48368=>12706, +48369=>12707, +48370=>12708, +48371=>12709, +48375=>12710, +48377=>12711, +48378=>12712, +48379=>12713, +48381=>12714, +48382=>12715, +48383=>12716, +48384=>12717, +48385=>12718, +48386=>12719, +48387=>12720, +48390=>12721, +48392=>12722, +48394=>12723, +48395=>12724, +48396=>12725, +48397=>12726, +48398=>12727, +48399=>12728, +48401=>12729, +48402=>12730, +48403=>12731, +48405=>12732, +48406=>12733, +48407=>12734, +48408=>12735, +48409=>12736, +48410=>12737, +48411=>12738, +48412=>12739, +48413=>12740, +48414=>12741, +48415=>12742, +48416=>12743, +48417=>12744, +48418=>12745, +48419=>12746, +48421=>12747, +48422=>12748, +48423=>12749, +48424=>12750, +48425=>12751, +48426=>12752, +48427=>12753, +48429=>12754, +48430=>12755, +48431=>12756, +48432=>12757, +48433=>12758, +48434=>12759, +48435=>12760, +48436=>12761, +48437=>12762, +48438=>12763, +48439=>12764, +48440=>12765, +48441=>12766, +48442=>12767, +48443=>12768, +48444=>12769, +48445=>12770, +48446=>12771, +48447=>12772, +48449=>12773, +48450=>12774, +48451=>12775, +48452=>12776, +48453=>12777, +48454=>12778, +48455=>12779, +48458=>12780, +48459=>12781, +48461=>12782, +48462=>12783, +48463=>12784, +48465=>12785, +48466=>12786, +48467=>12787, +48468=>12788, +48469=>12789, +48470=>12790, +48471=>12791, +48474=>12792, +48475=>12793, +48476=>12794, +48477=>12795, +48478=>12796, +48479=>12797, +48480=>12798, +48481=>12799, +48482=>12800, +48483=>12801, +48485=>12802, +48486=>12803, +48487=>12804, +48489=>12805, +48490=>12806, +48491=>12807, +48492=>12808, +48493=>12809, +48494=>12810, +48495=>12811, +48496=>12812, +48497=>12813, +48498=>12814, +48499=>12815, +48500=>12816, +48501=>12817, +48502=>12818, +48503=>12819, +48504=>12820, +48505=>12821, +48506=>12822, +48507=>12823, +48508=>12824, +48509=>12825, +48510=>12826, +48511=>12827, +48514=>12828, +48515=>12829, +48517=>12830, +48518=>12831, +48523=>12832, +48524=>12833, +48525=>12834, +48526=>12835, +48527=>12836, +48530=>12837, +48532=>12838, +48534=>12839, +48535=>12840, +48536=>12841, +48539=>12842, +48541=>12843, +48542=>12844, +48543=>12845, +48544=>12846, +48545=>12847, +48546=>12848, +48547=>12849, +48549=>12850, +48550=>12851, +48551=>12852, +48552=>12853, +48553=>12854, +48554=>12855, +48555=>12856, +48556=>12857, +48557=>12858, +48558=>12859, +48559=>12860, +48561=>12861, +48562=>12862, +48563=>12863, +48564=>12864, +48565=>12865, +48566=>12866, +48567=>12867, +48569=>12868, +48570=>12869, +48571=>12870, +48572=>12871, +48573=>12872, +48574=>12873, +48575=>12874, +48576=>12875, +48577=>12876, +48578=>12877, +48579=>12878, +48580=>12879, +48581=>12880, +48582=>12881, +48583=>12882, +48584=>12883, +48585=>12884, +48586=>12885, +48587=>12886, +48588=>12887, +48589=>12888, +48590=>12889, +48591=>12890, +48592=>12891, +48593=>12892, +48594=>12893, +48595=>12894, +48598=>12895, +48599=>12896, +48601=>12897, +48602=>12898, +48603=>12899, +48605=>12900, +48606=>12901, +48607=>12902, +48608=>12903, +48609=>12904, +48610=>12905, +48611=>12906, +48612=>12907, +48613=>12908, +48614=>12909, +48615=>12910, +48616=>12911, +48618=>12912, +48619=>12913, +48620=>12914, +48621=>12915, +48622=>12916, +48623=>12917, +48625=>12918, +48626=>12919, +48627=>12920, +48629=>12921, +48630=>12922, +48631=>12923, +48633=>12924, +48634=>12925, +48635=>12926, +48636=>12927, +48637=>12928, +48638=>12929, +48639=>12930, +48641=>12931, +48642=>12932, +48644=>12933, +48646=>12934, +48647=>12935, +48648=>12936, +48649=>12937, +48650=>12938, +48651=>12939, +48654=>12940, +48655=>12941, +48657=>12942, +48658=>12943, +48659=>12944, +48661=>12945, +48662=>12946, +48663=>12947, +48664=>12948, +48665=>12949, +48666=>12950, +48667=>12951, +48670=>12952, +48672=>12953, +48673=>12954, +48674=>12955, +48675=>12956, +48676=>12957, +48677=>12958, +48678=>12959, +48679=>12960, +48680=>12961, +48681=>12962, +48682=>12963, +48683=>12964, +48684=>12965, +48685=>12966, +48686=>12967, +48687=>12968, +48688=>12969, +48689=>12970, +48690=>12971, +48691=>12972, +48692=>12973, +48693=>12974, +48694=>12975, +48695=>12976, +48696=>12977, +48697=>12978, +48698=>12979, +48699=>12980, +48700=>12981, +48701=>12982, +48702=>12983, +48703=>12984, +48704=>12985, +48705=>12986, +48706=>12987, +48707=>12988, +48710=>12989, +48711=>12990, +48713=>12991, +48714=>12992, +48715=>12993, +48717=>12994, +48719=>12995, +48720=>12996, +48721=>12997, +48722=>12998, +48723=>12999, +48726=>13000, +48728=>13001, +48732=>13002, +48733=>13003, +48734=>13004, +48735=>13005, +48738=>13006, +48739=>13007, +48741=>13008, +48742=>13009, +48743=>13010, +48745=>13011, +48747=>13012, +48748=>13013, +48749=>13014, +48750=>13015, +48751=>13016, +48754=>13017, +48758=>13018, +48759=>13019, +48760=>13020, +48761=>13021, +48762=>13022, +48766=>13023, +48767=>13024, +48769=>13025, +48770=>13026, +48771=>13027, +48773=>13028, +48774=>13029, +48775=>13030, +48776=>13031, +48777=>13032, +48778=>13033, +48779=>13034, +48782=>13035, +48786=>13036, +48787=>13037, +48788=>13038, +48789=>13039, +48790=>13040, +48791=>13041, +48794=>13042, +48795=>13043, +48796=>13044, +48797=>13045, +48798=>13046, +48799=>13047, +48800=>13048, +48801=>13049, +48802=>13050, +48803=>13051, +48804=>13052, +48805=>13053, +48806=>13054, +48807=>13055, +48809=>13056, +48810=>13057, +48811=>13058, +48812=>13059, +48813=>13060, +48814=>13061, +48815=>13062, +48816=>13063, +48817=>13064, +48818=>13065, +48819=>13066, +48820=>13067, +48821=>13068, +48822=>13069, +48823=>13070, +48824=>13071, +48825=>13072, +48826=>13073, +48827=>13074, +48828=>13075, +48829=>13076, +48830=>13077, +48831=>13078, +48832=>13079, +48833=>13080, +48834=>13081, +48835=>13082, +48836=>13083, +48837=>13084, +48838=>13085, +48839=>13086, +48840=>13087, +48841=>13088, +48842=>13089, +48843=>13090, +48844=>13091, +48845=>13092, +48846=>13093, +48847=>13094, +48850=>13095, +48851=>13096, +48853=>13097, +48854=>13098, +48857=>13099, +48858=>13100, +48859=>13101, +48860=>13102, +48861=>13103, +48862=>13104, +48863=>13105, +48865=>13106, +48866=>13107, +48870=>13108, +48871=>13109, +48872=>13110, +48873=>13111, +48874=>13112, +48875=>13113, +48877=>13114, +48878=>13115, +48879=>13116, +48880=>13117, +48881=>13118, +48882=>13119, +48883=>13120, +48884=>13121, +48885=>13122, +48886=>13123, +48887=>13124, +48888=>13125, +48889=>13126, +48890=>13127, +48891=>13128, +48892=>13129, +48893=>13130, +48894=>13131, +48895=>13132, +48896=>13133, +48898=>13134, +48899=>13135, +48900=>13136, +48901=>13137, +48902=>13138, +48903=>13139, +48906=>13140, +48907=>13141, +48908=>13142, +48909=>13143, +48910=>13144, +48911=>13145, +48912=>13146, +48913=>13147, +48914=>13148, +48915=>13149, +48916=>13150, +48917=>13151, +48918=>13152, +48919=>13153, +48922=>13154, +48926=>13155, +48927=>13156, +48928=>13157, +48929=>13158, +48930=>13159, +48931=>13160, +48932=>13161, +48933=>13162, +48934=>13163, +48935=>13164, +48936=>13165, +48937=>13166, +48938=>13167, +48939=>13168, +48940=>13169, +48941=>13170, +48942=>13171, +48943=>13172, +48944=>13173, +48945=>13174, +48946=>13175, +48947=>13176, +48948=>13177, +48949=>13178, +48950=>13179, +48951=>13180, +48952=>13181, +48953=>13182, +48954=>13183, +48955=>13184, +48956=>13185, +48957=>13186, +48958=>13187, +48959=>13188, +48962=>13189, +48963=>13190, +48965=>13191, +48966=>13192, +48967=>13193, +48969=>13194, +48970=>13195, +48971=>13196, +48972=>13197, +48973=>13198, +48974=>13199, +48975=>13200, +48978=>13201, +48979=>13202, +48980=>13203, +48982=>13204, +48983=>13205, +48984=>13206, +48985=>13207, +48986=>13208, +48987=>13209, +48988=>13210, +48989=>13211, +48990=>13212, +48991=>13213, +48992=>13214, +48993=>13215, +48994=>13216, +48995=>13217, +48996=>13218, +48997=>13219, +48998=>13220, +48999=>13221, +49000=>13222, +49001=>13223, +49002=>13224, +49003=>13225, +49004=>13226, +49005=>13227, +49006=>13228, +49007=>13229, +49008=>13230, +49009=>13231, +49010=>13232, +49011=>13233, +49012=>13234, +49013=>13235, +49014=>13236, +49015=>13237, +49016=>13238, +49017=>13239, +49018=>13240, +49019=>13241, +49020=>13242, +49021=>13243, +49022=>13244, +49023=>13245, +49024=>13246, +49025=>13247, +49026=>13248, +49027=>13249, +49028=>13250, +49029=>13251, +49030=>13252, +49031=>13253, +49032=>13254, +49033=>13255, +49034=>13256, +49035=>13257, +49036=>13258, +49037=>13259, +49038=>13260, +49039=>13261, +49040=>13262, +49041=>13263, +49042=>13264, +49043=>13265, +49045=>13266, +49046=>13267, +49047=>13268, +49048=>13269, +49049=>13270, +49050=>13271, +49051=>13272, +49052=>13273, +49053=>13274, +49054=>13275, +49055=>13276, +49056=>13277, +49057=>13278, +49058=>13279, +49059=>13280, +49060=>13281, +49061=>13282, +49062=>13283, +49063=>13284, +49064=>13285, +49065=>13286, +49066=>13287, +49067=>13288, +49068=>13289, +49069=>13290, +49070=>13291, +49071=>13292, +49073=>13293, +49074=>13294, +49075=>13295, +49076=>13296, +49077=>13297, +49078=>13298, +49079=>13299, +49080=>13300, +49081=>13301, +49082=>13302, +49083=>13303, +49084=>13304, +49085=>13305, +49086=>13306, +49087=>13307, +49088=>13308, +49089=>13309, +49090=>13310, +49091=>13311, +49092=>13312, +49094=>13313, +49095=>13314, +49096=>13315, +49097=>13316, +49098=>13317, +49099=>13318, +49102=>13319, +49103=>13320, +49105=>13321, +49106=>13322, +49107=>13323, +49109=>13324, +49110=>13325, +49111=>13326, +49112=>13327, +49113=>13328, +49114=>13329, +49115=>13330, +49117=>13331, +49118=>13332, +49120=>13333, +49122=>13334, +49123=>13335, +49124=>13336, +49125=>13337, +49126=>13338, +49127=>13339, +49128=>13340, +49129=>13341, +49130=>13342, +49131=>13343, +49132=>13344, +49133=>13345, +49134=>13346, +49135=>13347, +49136=>13348, +49137=>13349, +49138=>13350, +49139=>13351, +49140=>13352, +49141=>13353, +49142=>13354, +49143=>13355, +49144=>13356, +49145=>13357, +49146=>13358, +49147=>13359, +49148=>13360, +49149=>13361, +49150=>13362, +49151=>13363, +49152=>13364, +49153=>13365, +49154=>13366, +49155=>13367, +49156=>13368, +49157=>13369, +49158=>13370, +49159=>13371, +49160=>13372, +49161=>13373, +49162=>13374, +49163=>13375, +49164=>13376, +49165=>13377, +49166=>13378, +49167=>13379, +49168=>13380, +49169=>13381, +49170=>13382, +49171=>13383, +49172=>13384, +49173=>13385, +49174=>13386, +49175=>13387, +49176=>13388, +49177=>13389, +49178=>13390, +49179=>13391, +49180=>13392, +49181=>13393, +49182=>13394, +49183=>13395, +49184=>13396, +49185=>13397, +49186=>13398, +49187=>13399, +49188=>13400, +49189=>13401, +49190=>13402, +49191=>13403, +49192=>13404, +49193=>13405, +49194=>13406, +49195=>13407, +49196=>13408, +49197=>13409, +49198=>13410, +49199=>13411, +49200=>13412, +49201=>13413, +49202=>13414, +49203=>13415, +49204=>13416, +49205=>13417, +49206=>13418, +49207=>13419, +49208=>13420, +49209=>13421, +49210=>13422, +49211=>13423, +49213=>13424, +49214=>13425, +49215=>13426, +49216=>13427, +49217=>13428, +49218=>13429, +49219=>13430, +49220=>13431, +49221=>13432, +49222=>13433, +49223=>13434, +49224=>13435, +49225=>13436, +49226=>13437, +49227=>13438, +49228=>13439, +49229=>13440, +49230=>13441, +49231=>13442, +49232=>13443, +49234=>13444, +49235=>13445, +49236=>13446, +49237=>13447, +49238=>13448, +49239=>13449, +49241=>13450, +49242=>13451, +49243=>13452, +49245=>13453, +49246=>13454, +49247=>13455, +49249=>13456, +49250=>13457, +49251=>13458, +49252=>13459, +49253=>13460, +49254=>13461, +49255=>13462, +49258=>13463, +49259=>13464, +49260=>13465, +49261=>13466, +49262=>13467, +49263=>13468, +49264=>13469, +49265=>13470, +49266=>13471, +49267=>13472, +49268=>13473, +49269=>13474, +49270=>13475, +49271=>13476, +49272=>13477, +49273=>13478, +49274=>13479, +49275=>13480, +49276=>13481, +49277=>13482, +49278=>13483, +49279=>13484, +49280=>13485, +49281=>13486, +49282=>13487, +49283=>13488, +49284=>13489, +49285=>13490, +49286=>13491, +49287=>13492, +49288=>13493, +49289=>13494, +49290=>13495, +49291=>13496, +49292=>13497, +49293=>13498, +49294=>13499, +49295=>13500, +49298=>13501, +49299=>13502, +49301=>13503, +49302=>13504, +49303=>13505, +49305=>13506, +49306=>13507, +49307=>13508, +49308=>13509, +49309=>13510, +49310=>13511, +49311=>13512, +49314=>13513, +49316=>13514, +49318=>13515, +49319=>13516, +49320=>13517, +49321=>13518, +49322=>13519, +49323=>13520, +49326=>13521, +49329=>13522, +49330=>13523, +49335=>13524, +49336=>13525, +49337=>13526, +49338=>13527, +49339=>13528, +49342=>13529, +49346=>13530, +49347=>13531, +49348=>13532, +49350=>13533, +49351=>13534, +49354=>13535, +49355=>13536, +49357=>13537, +49358=>13538, +49359=>13539, +49361=>13540, +49362=>13541, +49363=>13542, +49364=>13543, +49365=>13544, +49366=>13545, +49367=>13546, +49370=>13547, +49374=>13548, +49375=>13549, +49376=>13550, +49377=>13551, +49378=>13552, +49379=>13553, +49382=>13554, +49383=>13555, +49385=>13556, +49386=>13557, +49387=>13558, +49389=>13559, +49390=>13560, +49391=>13561, +49392=>13562, +49393=>13563, +49394=>13564, +49395=>13565, +49398=>13566, +49400=>13567, +49402=>13568, +49403=>13569, +49404=>13570, +49405=>13571, +49406=>13572, +49407=>13573, +49409=>13574, +49410=>13575, +49411=>13576, +49413=>13577, +49414=>13578, +49415=>13579, +49417=>13580, +49418=>13581, +49419=>13582, +49420=>13583, +49421=>13584, +49422=>13585, +49423=>13586, +49425=>13587, +49426=>13588, +49427=>13589, +49428=>13590, +49430=>13591, +49431=>13592, +49432=>13593, +49433=>13594, +49434=>13595, +49435=>13596, +49441=>13597, +49442=>13598, +49445=>13599, +49448=>13600, +49449=>13601, +49450=>13602, +49451=>13603, +49454=>13604, +49458=>13605, +49459=>13606, +49460=>13607, +49461=>13608, +49463=>13609, +49466=>13610, +49467=>13611, +49469=>13612, +49470=>13613, +49471=>13614, +49473=>13615, +49474=>13616, +49475=>13617, +49476=>13618, +49477=>13619, +49478=>13620, +49479=>13621, +49482=>13622, +49486=>13623, +49487=>13624, +49488=>13625, +49489=>13626, +49490=>13627, +49491=>13628, +49494=>13629, +49495=>13630, +49497=>13631, +49498=>13632, +49499=>13633, +49501=>13634, +49502=>13635, +49503=>13636, +49504=>13637, +49505=>13638, +49506=>13639, +49507=>13640, +49510=>13641, +49514=>13642, +49515=>13643, +49516=>13644, +49517=>13645, +49518=>13646, +49519=>13647, +49521=>13648, +49522=>13649, +49523=>13650, +49525=>13651, +49526=>13652, +49527=>13653, +49529=>13654, +49530=>13655, +49531=>13656, +49532=>13657, +49533=>13658, +49534=>13659, +49535=>13660, +49536=>13661, +49537=>13662, +49538=>13663, +49539=>13664, +49540=>13665, +49542=>13666, +49543=>13667, +49544=>13668, +49545=>13669, +49546=>13670, +49547=>13671, +49551=>13672, +49553=>13673, +49554=>13674, +49555=>13675, +49557=>13676, +49559=>13677, +49560=>13678, +49561=>13679, +49562=>13680, +49563=>13681, +49566=>13682, +49568=>13683, +49570=>13684, +49571=>13685, +49572=>13686, +49574=>13687, +49575=>13688, +49578=>13689, +49579=>13690, +49581=>13691, +49582=>13692, +49583=>13693, +49585=>13694, +49586=>13695, +49587=>13696, +49588=>13697, +49589=>13698, +49590=>13699, +49591=>13700, +49592=>13701, +49593=>13702, +49594=>13703, +49595=>13704, +49596=>13705, +49598=>13706, +49599=>13707, +49600=>13708, +49601=>13709, +49602=>13710, +49603=>13711, +49605=>13712, +49606=>13713, +49607=>13714, +49609=>13715, +49610=>13716, +49611=>13717, +49613=>13718, +49614=>13719, +49615=>13720, +49616=>13721, +49617=>13722, +49618=>13723, +49619=>13724, +49621=>13725, +49622=>13726, +49625=>13727, +49626=>13728, +49627=>13729, +49628=>13730, +49629=>13731, +49630=>13732, +49631=>13733, +49633=>13734, +49634=>13735, +49635=>13736, +49637=>13737, +49638=>13738, +49639=>13739, +49641=>13740, +49642=>13741, +49643=>13742, +49644=>13743, +49645=>13744, +49646=>13745, +49647=>13746, +49650=>13747, +49652=>13748, +49653=>13749, +49654=>13750, +49655=>13751, +49656=>13752, +49657=>13753, +49658=>13754, +49659=>13755, +49662=>13756, +49663=>13757, +49665=>13758, +49666=>13759, +49667=>13760, +49669=>13761, +49670=>13762, +49671=>13763, +49672=>13764, +49673=>13765, +49674=>13766, +49675=>13767, +49678=>13768, +49680=>13769, +49682=>13770, +49683=>13771, +49684=>13772, +49685=>13773, +49686=>13774, +49687=>13775, +49690=>13776, +49691=>13777, +49693=>13778, +49694=>13779, +49697=>13780, +49698=>13781, +49699=>13782, +49700=>13783, +49701=>13784, +49702=>13785, +49703=>13786, +49706=>13787, +49708=>13788, +49710=>13789, +49712=>13790, +49715=>13791, +49717=>13792, +49718=>13793, +49719=>13794, +49720=>13795, +49721=>13796, +49722=>13797, +49723=>13798, +49724=>13799, +49725=>13800, +49726=>13801, +49727=>13802, +49728=>13803, +49729=>13804, +49730=>13805, +49731=>13806, +49732=>13807, +49733=>13808, +49734=>13809, +49735=>13810, +49737=>13811, +49738=>13812, +49739=>13813, +49740=>13814, +49741=>13815, +49742=>13816, +49743=>13817, +49746=>13818, +49747=>13819, +49749=>13820, +49750=>13821, +49751=>13822, +49753=>13823, +49754=>13824, +49755=>13825, +49756=>13826, +49757=>13827, +49758=>13828, +49759=>13829, +49761=>13830, +49762=>13831, +49763=>13832, +49764=>13833, +49766=>13834, +49767=>13835, +49768=>13836, +49769=>13837, +49770=>13838, +49771=>13839, +49774=>13840, +49775=>13841, +49777=>13842, +49778=>13843, +49779=>13844, +49781=>13845, +49782=>13846, +49783=>13847, +49784=>13848, +49785=>13849, +49786=>13850, +49787=>13851, +49790=>13852, +49792=>13853, +49794=>13854, +49795=>13855, +49796=>13856, +49797=>13857, +49798=>13858, +49799=>13859, +49802=>13860, +49803=>13861, +49804=>13862, +49805=>13863, +49806=>13864, +49807=>13865, +49809=>13866, +49810=>13867, +49811=>13868, +49812=>13869, +49813=>13870, +49814=>13871, +49815=>13872, +49817=>13873, +49818=>13874, +49820=>13875, +49822=>13876, +49823=>13877, +49824=>13878, +49825=>13879, +49826=>13880, +49827=>13881, +49830=>13882, +49831=>13883, +49833=>13884, +49834=>13885, +49835=>13886, +49838=>13887, +49839=>13888, +49840=>13889, +49841=>13890, +49842=>13891, +49843=>13892, +49846=>13893, +49848=>13894, +49850=>13895, +49851=>13896, +49852=>13897, +49853=>13898, +49854=>13899, +49855=>13900, +49856=>13901, +49857=>13902, +49858=>13903, +49859=>13904, +49860=>13905, +49861=>13906, +49862=>13907, +49863=>13908, +49864=>13909, +49865=>13910, +49866=>13911, +49867=>13912, +49868=>13913, +49869=>13914, +49870=>13915, +49871=>13916, +49872=>13917, +49873=>13918, +49874=>13919, +49875=>13920, +49876=>13921, +49877=>13922, +49878=>13923, +49879=>13924, +49880=>13925, +49881=>13926, +49882=>13927, +49883=>13928, +49886=>13929, +49887=>13930, +49889=>13931, +49890=>13932, +49893=>13933, +49894=>13934, +49895=>13935, +49896=>13936, +49897=>13937, +49898=>13938, +49902=>13939, +49904=>13940, +49906=>13941, +49907=>13942, +49908=>13943, +49909=>13944, +49911=>13945, +49914=>13946, +49917=>13947, +49918=>13948, +49919=>13949, +49921=>13950, +49922=>13951, +49923=>13952, +49924=>13953, +49925=>13954, +49926=>13955, +49927=>13956, +49930=>13957, +49931=>13958, +49934=>13959, +49935=>13960, +49936=>13961, +49937=>13962, +49938=>13963, +49942=>13964, +49943=>13965, +49945=>13966, +49946=>13967, +49947=>13968, +49949=>13969, +49950=>13970, +49951=>13971, +49952=>13972, +49953=>13973, +49954=>13974, +49955=>13975, +49958=>13976, +49959=>13977, +49962=>13978, +49963=>13979, +49964=>13980, +49965=>13981, +49966=>13982, +49967=>13983, +49968=>13984, +49969=>13985, +49970=>13986, +49971=>13987, +49972=>13988, +49973=>13989, +49974=>13990, +49975=>13991, +49976=>13992, +49977=>13993, +49978=>13994, +49979=>13995, +49980=>13996, +49981=>13997, +49982=>13998, +49983=>13999, +49984=>14000, +49985=>14001, +49986=>14002, +49987=>14003, +49988=>14004, +49990=>14005, +49991=>14006, +49992=>14007, +49993=>14008, +49994=>14009, +49995=>14010, +49996=>14011, +49997=>14012, +49998=>14013, +49999=>14014, +50000=>14015, +50001=>14016, +50002=>14017, +50003=>14018, +50004=>14019, +50005=>14020, +50006=>14021, +50007=>14022, +50008=>14023, +50009=>14024, +50010=>14025, +50011=>14026, +50012=>14027, +50013=>14028, +50014=>14029, +50015=>14030, +50016=>14031, +50017=>14032, +50018=>14033, +50019=>14034, +50020=>14035, +50021=>14036, +50022=>14037, +50023=>14038, +50026=>14039, +50027=>14040, +50029=>14041, +50030=>14042, +50031=>14043, +50033=>14044, +50035=>14045, +50036=>14046, +50037=>14047, +50038=>14048, +50039=>14049, +50042=>14050, +50043=>14051, +50046=>14052, +50047=>14053, +50048=>14054, +50049=>14055, +50050=>14056, +50051=>14057, +50053=>14058, +50054=>14059, +50055=>14060, +50057=>14061, +50058=>14062, +50059=>14063, +50061=>14064, +50062=>14065, +50063=>14066, +50064=>14067, +50065=>14068, +50066=>14069, +50067=>14070, +50068=>14071, +50069=>14072, +50070=>14073, +50071=>14074, +50072=>14075, +50073=>14076, +50074=>14077, +50075=>14078, +50076=>14079, +50077=>14080, +50078=>14081, +50079=>14082, +50080=>14083, +50081=>14084, +50082=>14085, +50083=>14086, +50084=>14087, +50085=>14088, +50086=>14089, +50087=>14090, +50088=>14091, +50089=>14092, +50090=>14093, +50091=>14094, +50092=>14095, +50093=>14096, +50094=>14097, +50095=>14098, +50096=>14099, +50097=>14100, +50098=>14101, +50099=>14102, +50100=>14103, +50101=>14104, +50102=>14105, +50103=>14106, +50104=>14107, +50105=>14108, +50106=>14109, +50107=>14110, +50108=>14111, +50109=>14112, +50110=>14113, +50111=>14114, +50113=>14115, +50114=>14116, +50115=>14117, +50116=>14118, +50117=>14119, +50118=>14120, +50119=>14121, +50120=>14122, +50121=>14123, +50122=>14124, +50123=>14125, +50124=>14126, +50125=>14127, +50126=>14128, +50127=>14129, +50128=>14130, +50129=>14131, +50130=>14132, +50131=>14133, +50132=>14134, +50133=>14135, +50134=>14136, +50135=>14137, +50138=>14138, +50139=>14139, +50141=>14140, +50142=>14141, +50145=>14142, +50147=>14143, +50148=>14144, +50149=>14145, +50150=>14146, +50151=>14147, +50154=>14148, +50155=>14149, +50156=>14150, +50158=>14151, +50159=>14152, +50160=>14153, +50161=>14154, +50162=>14155, +50163=>14156, +50166=>14157, +50167=>14158, +50169=>14159, +50170=>14160, +50171=>14161, +50172=>14162, +50173=>14163, +50174=>14164, +50175=>14165, +50176=>14166, +50177=>14167, +50178=>14168, +50179=>14169, +50180=>14170, +50181=>14171, +50182=>14172, +50183=>14173, +50185=>14174, +50186=>14175, +50187=>14176, +50188=>14177, +50189=>14178, +50190=>14179, +50191=>14180, +50193=>14181, +50194=>14182, +50195=>14183, +50196=>14184, +50197=>14185, +50198=>14186, +50199=>14187, +50200=>14188, +50201=>14189, +50202=>14190, +50203=>14191, +50204=>14192, +50205=>14193, +50206=>14194, +50207=>14195, +50208=>14196, +50209=>14197, +50210=>14198, +50211=>14199, +50213=>14200, +50214=>14201, +50215=>14202, +50216=>14203, +50217=>14204, +50218=>14205, +50219=>14206, +50221=>14207, +50222=>14208, +50223=>14209, +50225=>14210, +50226=>14211, +50227=>14212, +50229=>14213, +50230=>14214, +50231=>14215, +50232=>14216, +50233=>14217, +50234=>14218, +50235=>14219, +50238=>14220, +50239=>14221, +50240=>14222, +50241=>14223, +50242=>14224, +50243=>14225, +50244=>14226, +50245=>14227, +50246=>14228, +50247=>14229, +50249=>14230, +50250=>14231, +50251=>14232, +50252=>14233, +50253=>14234, +50254=>14235, +50255=>14236, +50256=>14237, +50257=>14238, +50258=>14239, +50259=>14240, +50260=>14241, +50261=>14242, +50262=>14243, +50263=>14244, +50264=>14245, +50265=>14246, +50266=>14247, +50267=>14248, +50268=>14249, +50269=>14250, +50270=>14251, +50271=>14252, +50272=>14253, +50273=>14254, +50274=>14255, +50275=>14256, +50278=>14257, +50279=>14258, +50281=>14259, +50282=>14260, +50283=>14261, +50285=>14262, +50286=>14263, +50287=>14264, +50288=>14265, +50289=>14266, +50290=>14267, +50291=>14268, +50294=>14269, +50295=>14270, +50296=>14271, +50298=>14272, +50299=>14273, +50300=>14274, +50301=>14275, +50302=>14276, +50303=>14277, +50305=>14278, +50306=>14279, +50307=>14280, +50308=>14281, +50309=>14282, +50310=>14283, +50311=>14284, +50312=>14285, +50313=>14286, +50314=>14287, +50315=>14288, +50316=>14289, +50317=>14290, +50318=>14291, +50319=>14292, +50320=>14293, +50321=>14294, +50322=>14295, +50323=>14296, +50325=>14297, +50326=>14298, +50327=>14299, +50328=>14300, +50329=>14301, +50330=>14302, +50331=>14303, +50333=>14304, +50334=>14305, +50335=>14306, +50336=>14307, +50337=>14308, +50338=>14309, +50339=>14310, +50340=>14311, +50341=>14312, +50342=>14313, +50343=>14314, +50344=>14315, +50345=>14316, +50346=>14317, +50347=>14318, +50348=>14319, +50349=>14320, +50350=>14321, +50351=>14322, +50352=>14323, +50353=>14324, +50354=>14325, +50355=>14326, +50356=>14327, +50357=>14328, +50358=>14329, +50359=>14330, +50361=>14331, +50362=>14332, +50363=>14333, +50365=>14334, +50366=>14335, +50367=>14336, +50368=>14337, +50369=>14338, +50370=>14339, +50371=>14340, +50372=>14341, +50373=>14342, +50374=>14343, +50375=>14344, +50376=>14345, +50377=>14346, +50378=>14347, +50379=>14348, +50380=>14349, +50381=>14350, +50382=>14351, +50383=>14352, +50384=>14353, +50385=>14354, +50386=>14355, +50387=>14356, +50388=>14357, +50389=>14358, +50390=>14359, +50391=>14360, +50392=>14361, +50393=>14362, +50394=>14363, +50395=>14364, +50396=>14365, +50397=>14366, +50398=>14367, +50399=>14368, +50400=>14369, +50401=>14370, +50402=>14371, +50403=>14372, +50404=>14373, +50405=>14374, +50406=>14375, +50407=>14376, +50408=>14377, +50410=>14378, +50411=>14379, +50412=>14380, +50413=>14381, +50414=>14382, +50415=>14383, +50418=>14384, +50419=>14385, +50421=>14386, +50422=>14387, +50423=>14388, +50425=>14389, +50427=>14390, +50428=>14391, +50429=>14392, +50430=>14393, +50434=>14394, +50435=>14395, +50436=>14396, +50437=>14397, +50438=>14398, +50439=>14399, +50440=>14400, +50441=>14401, +50442=>14402, +50443=>14403, +50445=>14404, +50446=>14405, +50447=>14406, +50449=>14407, +50450=>14408, +50451=>14409, +50453=>14410, +50454=>14411, +50455=>14412, +50456=>14413, +50457=>14414, +50458=>14415, +50459=>14416, +50461=>14417, +50462=>14418, +50463=>14419, +50464=>14420, +50465=>14421, +50466=>14422, +50467=>14423, +50468=>14424, +50469=>14425, +50470=>14426, +50471=>14427, +50474=>14428, +50475=>14429, +50477=>14430, +50478=>14431, +50479=>14432, +50481=>14433, +50482=>14434, +50483=>14435, +50484=>14436, +50485=>14437, +50486=>14438, +50487=>14439, +50490=>14440, +50492=>14441, +50494=>14442, +50495=>14443, +50496=>14444, +50497=>14445, +50498=>14446, +50499=>14447, +50502=>14448, +50503=>14449, +50507=>14450, +50511=>14451, +50512=>14452, +50513=>14453, +50514=>14454, +50518=>14455, +50522=>14456, +50523=>14457, +50524=>14458, +50527=>14459, +50530=>14460, +50531=>14461, +50533=>14462, +50534=>14463, +50535=>14464, +50537=>14465, +50538=>14466, +50539=>14467, +50540=>14468, +50541=>14469, +50542=>14470, +50543=>14471, +50546=>14472, +50550=>14473, +50551=>14474, +50552=>14475, +50553=>14476, +50554=>14477, +50555=>14478, +50558=>14479, +50559=>14480, +50561=>14481, +50562=>14482, +50563=>14483, +50565=>14484, +50566=>14485, +50568=>14486, +50569=>14487, +50570=>14488, +50571=>14489, +50574=>14490, +50576=>14491, +50578=>14492, +50579=>14493, +50580=>14494, +50582=>14495, +50585=>14496, +50586=>14497, +50587=>14498, +50589=>14499, +50590=>14500, +50591=>14501, +50593=>14502, +50594=>14503, +50595=>14504, +50596=>14505, +50597=>14506, +50598=>14507, +50599=>14508, +50600=>14509, +50602=>14510, +50603=>14511, +50604=>14512, +50605=>14513, +50606=>14514, +50607=>14515, +50608=>14516, +50609=>14517, +50610=>14518, +50611=>14519, +50614=>14520, +50615=>14521, +50618=>14522, +50623=>14523, +50624=>14524, +50625=>14525, +50626=>14526, +50627=>14527, +50635=>14528, +50637=>14529, +50639=>14530, +50642=>14531, +50643=>14532, +50645=>14533, +50646=>14534, +50647=>14535, +50649=>14536, +50650=>14537, +50651=>14538, +50652=>14539, +50653=>14540, +50654=>14541, +50655=>14542, +50658=>14543, +50660=>14544, +50662=>14545, +50663=>14546, +50664=>14547, +50665=>14548, +50666=>14549, +50667=>14550, +50671=>14551, +50673=>14552, +50674=>14553, +50675=>14554, +50677=>14555, +50680=>14556, +50681=>14557, +50682=>14558, +50683=>14559, +50690=>14560, +50691=>14561, +50692=>14562, +50697=>14563, +50698=>14564, +50699=>14565, +50701=>14566, +50702=>14567, +50703=>14568, +50705=>14569, +50706=>14570, +50707=>14571, +50708=>14572, +50709=>14573, +50710=>14574, +50711=>14575, +50714=>14576, +50717=>14577, +50718=>14578, +50719=>14579, +50720=>14580, +50721=>14581, +50722=>14582, +50723=>14583, +50726=>14584, +50727=>14585, +50729=>14586, +50730=>14587, +50731=>14588, +50735=>14589, +50737=>14590, +50738=>14591, +50742=>14592, +50744=>14593, +50746=>14594, +50748=>14595, +50749=>14596, +50750=>14597, +50751=>14598, +50754=>14599, +50755=>14600, +50757=>14601, +50758=>14602, +50759=>14603, +50761=>14604, +50762=>14605, +50763=>14606, +50764=>14607, +50765=>14608, +50766=>14609, +50767=>14610, +50770=>14611, +50774=>14612, +50775=>14613, +50776=>14614, +50777=>14615, +50778=>14616, +50779=>14617, +50782=>14618, +50783=>14619, +50785=>14620, +50786=>14621, +50787=>14622, +50788=>14623, +50789=>14624, +50790=>14625, +50791=>14626, +50792=>14627, +50793=>14628, +50794=>14629, +50795=>14630, +50797=>14631, +50798=>14632, +50800=>14633, +50802=>14634, +50803=>14635, +50804=>14636, +50805=>14637, +50806=>14638, +50807=>14639, +50810=>14640, +50811=>14641, +50813=>14642, +50814=>14643, +50815=>14644, +50817=>14645, +50818=>14646, +50819=>14647, +50820=>14648, +50821=>14649, +50822=>14650, +50823=>14651, +50826=>14652, +50828=>14653, +50830=>14654, +50831=>14655, +50832=>14656, +50833=>14657, +50834=>14658, +50835=>14659, +50838=>14660, +50839=>14661, +50841=>14662, +50842=>14663, +50843=>14664, +50845=>14665, +50846=>14666, +50847=>14667, +50848=>14668, +50849=>14669, +50850=>14670, +50851=>14671, +50854=>14672, +50856=>14673, +50858=>14674, +50859=>14675, +50860=>14676, +50861=>14677, +50862=>14678, +50863=>14679, +50866=>14680, +50867=>14681, +50869=>14682, +50870=>14683, +50871=>14684, +50875=>14685, +50876=>14686, +50877=>14687, +50878=>14688, +50879=>14689, +50882=>14690, +50884=>14691, +50886=>14692, +50887=>14693, +50888=>14694, +50889=>14695, +50890=>14696, +50891=>14697, +50894=>14698, +50895=>14699, +50897=>14700, +50898=>14701, +50899=>14702, +50901=>14703, +50902=>14704, +50903=>14705, +50904=>14706, +50905=>14707, +50906=>14708, +50907=>14709, +50910=>14710, +50911=>14711, +50914=>14712, +50915=>14713, +50916=>14714, +50917=>14715, +50918=>14716, +50919=>14717, +50922=>14718, +50923=>14719, +50925=>14720, +50926=>14721, +50927=>14722, +50929=>14723, +50930=>14724, +50931=>14725, +50932=>14726, +50933=>14727, +50934=>14728, +50935=>14729, +50938=>14730, +50939=>14731, +50940=>14732, +50942=>14733, +50943=>14734, +50944=>14735, +50945=>14736, +50946=>14737, +50947=>14738, +50950=>14739, +50951=>14740, +50953=>14741, +50954=>14742, +50955=>14743, +50957=>14744, +50958=>14745, +50959=>14746, +50960=>14747, +50961=>14748, +50962=>14749, +50963=>14750, +50966=>14751, +50968=>14752, +50970=>14753, +50971=>14754, +50972=>14755, +50973=>14756, +50974=>14757, +50975=>14758, +50978=>14759, +50979=>14760, +50981=>14761, +50982=>14762, +50983=>14763, +50985=>14764, +50986=>14765, +50987=>14766, +50988=>14767, +50989=>14768, +50990=>14769, +50991=>14770, +50994=>14771, +50996=>14772, +50998=>14773, +51000=>14774, +51001=>14775, +51002=>14776, +51003=>14777, +51006=>14778, +51007=>14779, +51009=>14780, +51010=>14781, +51011=>14782, +51013=>14783, +51014=>14784, +51015=>14785, +51016=>14786, +51017=>14787, +51019=>14788, +51022=>14789, +51024=>14790, +51033=>14791, +51034=>14792, +51035=>14793, +51037=>14794, +51038=>14795, +51039=>14796, +51041=>14797, +51042=>14798, +51043=>14799, +51044=>14800, +51045=>14801, +51046=>14802, +51047=>14803, +51049=>14804, +51050=>14805, +51052=>14806, +51053=>14807, +51054=>14808, +51055=>14809, +51056=>14810, +51057=>14811, +51058=>14812, +51059=>14813, +51062=>14814, +51063=>14815, +51065=>14816, +51066=>14817, +51067=>14818, +51071=>14819, +51072=>14820, +51073=>14821, +51074=>14822, +51078=>14823, +51083=>14824, +51084=>14825, +51085=>14826, +51087=>14827, +51090=>14828, +51091=>14829, +51093=>14830, +51097=>14831, +51099=>14832, +51100=>14833, +51101=>14834, +51102=>14835, +51103=>14836, +51106=>14837, +51111=>14838, +51112=>14839, +51113=>14840, +51114=>14841, +51115=>14842, +51118=>14843, +51119=>14844, +51121=>14845, +51122=>14846, +51123=>14847, +51125=>14848, +51126=>14849, +51127=>14850, +51128=>14851, +51129=>14852, +51130=>14853, +51131=>14854, +51134=>14855, +51138=>14856, +51139=>14857, +51140=>14858, +51141=>14859, +51142=>14860, +51143=>14861, +51146=>14862, +51147=>14863, +51149=>14864, +51151=>14865, +51153=>14866, +51154=>14867, +51155=>14868, +51156=>14869, +51157=>14870, +51158=>14871, +51159=>14872, +51161=>14873, +51162=>14874, +51163=>14875, +51164=>14876, +51166=>14877, +51167=>14878, +51168=>14879, +51169=>14880, +51170=>14881, +51171=>14882, +51173=>14883, +51174=>14884, +51175=>14885, +51177=>14886, +51178=>14887, +51179=>14888, +51181=>14889, +51182=>14890, +51183=>14891, +51184=>14892, +51185=>14893, +51186=>14894, +51187=>14895, +51188=>14896, +51189=>14897, +51190=>14898, +51191=>14899, +51192=>14900, +51193=>14901, +51194=>14902, +51195=>14903, +51196=>14904, +51197=>14905, +51198=>14906, +51199=>14907, +51202=>14908, +51203=>14909, +51205=>14910, +51206=>14911, +51207=>14912, +51209=>14913, +51211=>14914, +51212=>14915, +51213=>14916, +51214=>14917, +51215=>14918, +51218=>14919, +51220=>14920, +51223=>14921, +51224=>14922, +51225=>14923, +51226=>14924, +51227=>14925, +51230=>14926, +51231=>14927, +51233=>14928, +51234=>14929, +51235=>14930, +51237=>14931, +51238=>14932, +51239=>14933, +51240=>14934, +51241=>14935, +51242=>14936, +51243=>14937, +51246=>14938, +51248=>14939, +51250=>14940, +51251=>14941, +51252=>14942, +51253=>14943, +51254=>14944, +51255=>14945, +51257=>14946, +51258=>14947, +51259=>14948, +51261=>14949, +51262=>14950, +51263=>14951, +51265=>14952, +51266=>14953, +51267=>14954, +51268=>14955, +51269=>14956, +51270=>14957, +51271=>14958, +51274=>14959, +51275=>14960, +51278=>14961, +51279=>14962, +51280=>14963, +51281=>14964, +51282=>14965, +51283=>14966, +51285=>14967, +51286=>14968, +51287=>14969, +51288=>14970, +51289=>14971, +51290=>14972, +51291=>14973, +51292=>14974, +51293=>14975, +51294=>14976, +51295=>14977, +51296=>14978, +51297=>14979, +51298=>14980, +51299=>14981, +51300=>14982, +51301=>14983, +51302=>14984, +51303=>14985, +51304=>14986, +51305=>14987, +51306=>14988, +51307=>14989, +51308=>14990, +51309=>14991, +51310=>14992, +51311=>14993, +51314=>14994, +51315=>14995, +51317=>14996, +51318=>14997, +51319=>14998, +51321=>14999, +51323=>15000, +51324=>15001, +51325=>15002, +51326=>15003, +51327=>15004, +51330=>15005, +51332=>15006, +51336=>15007, +51337=>15008, +51338=>15009, +51342=>15010, +51343=>15011, +51344=>15012, +51345=>15013, +51346=>15014, +51347=>15015, +51349=>15016, +51350=>15017, +51351=>15018, +51352=>15019, +51353=>15020, +51354=>15021, +51355=>15022, +51356=>15023, +51358=>15024, +51360=>15025, +51362=>15026, +51363=>15027, +51364=>15028, +51365=>15029, +51366=>15030, +51367=>15031, +51369=>15032, +51370=>15033, +51371=>15034, +51372=>15035, +51373=>15036, +51374=>15037, +51375=>15038, +51376=>15039, +51377=>15040, +51378=>15041, +51379=>15042, +51380=>15043, +51381=>15044, +51382=>15045, +51383=>15046, +51384=>15047, +51385=>15048, +51386=>15049, +51387=>15050, +51390=>15051, +51391=>15052, +51392=>15053, +51393=>15054, +51394=>15055, +51395=>15056, +51397=>15057, +51398=>15058, +51399=>15059, +51401=>15060, +51402=>15061, +51403=>15062, +51405=>15063, +51406=>15064, +51407=>15065, +51408=>15066, +51409=>15067, +51410=>15068, +51411=>15069, +51414=>15070, +51416=>15071, +51418=>15072, +51419=>15073, +51420=>15074, +51421=>15075, +51422=>15076, +51423=>15077, +51426=>15078, +51427=>15079, +51429=>15080, +51430=>15081, +51431=>15082, +51432=>15083, +51433=>15084, +51434=>15085, +51435=>15086, +51436=>15087, +51437=>15088, +51438=>15089, +51439=>15090, +51440=>15091, +51441=>15092, +51442=>15093, +51443=>15094, +51444=>15095, +51446=>15096, +51447=>15097, +51448=>15098, +51449=>15099, +51450=>15100, +51451=>15101, +51454=>15102, +51455=>15103, +51457=>15104, +51458=>15105, +51459=>15106, +51463=>15107, +51464=>15108, +51465=>15109, +51466=>15110, +51467=>15111, +51470=>15112, +51472=>15113, +51474=>15114, +51475=>15115, +51476=>15116, +51477=>15117, +51478=>15118, +51479=>15119, +51481=>15120, +51482=>15121, +51483=>15122, +51484=>15123, +51485=>15124, +51486=>15125, +51487=>15126, +51488=>15127, +51489=>15128, +51490=>15129, +51491=>15130, +51492=>15131, +51493=>15132, +51494=>15133, +51495=>15134, +51496=>15135, +51497=>15136, +51498=>15137, +51499=>15138, +51501=>15139, +51502=>15140, +51503=>15141, +51504=>15142, +51505=>15143, +51506=>15144, +51507=>15145, +51509=>15146, +51510=>15147, +51511=>15148, +51512=>15149, +51513=>15150, +51514=>15151, +51515=>15152, +51516=>15153, +51517=>15154, +51518=>15155, +51519=>15156, +51520=>15157, +51521=>15158, +51522=>15159, +51523=>15160, +51524=>15161, +51525=>15162, +51526=>15163, +51527=>15164, +51528=>15165, +51529=>15166, +51530=>15167, +51531=>15168, +51532=>15169, +51533=>15170, +51534=>15171, +51535=>15172, +51538=>15173, +51539=>15174, +51541=>15175, +51542=>15176, +51543=>15177, +51545=>15178, +51546=>15179, +51547=>15180, +51548=>15181, +51549=>15182, +51550=>15183, +51551=>15184, +51554=>15185, +51556=>15186, +51557=>15187, +51558=>15188, +51559=>15189, +51560=>15190, +51561=>15191, +51562=>15192, +51563=>15193, +51565=>15194, +51566=>15195, +51567=>15196, +51569=>15197, +51570=>15198, +51571=>15199, +51573=>15200, +51574=>15201, +51575=>15202, +51576=>15203, +51577=>15204, +51578=>15205, +51579=>15206, +51581=>15207, +51582=>15208, +51583=>15209, +51584=>15210, +51585=>15211, +51586=>15212, +51587=>15213, +51588=>15214, +51589=>15215, +51590=>15216, +51591=>15217, +51594=>15218, +51595=>15219, +51597=>15220, +51598=>15221, +51599=>15222, +51601=>15223, +51602=>15224, +51603=>15225, +51604=>15226, +51605=>15227, +51606=>15228, +51607=>15229, +51610=>15230, +51612=>15231, +51614=>15232, +51615=>15233, +51616=>15234, +51617=>15235, +51618=>15236, +51619=>15237, +51620=>15238, +51621=>15239, +51622=>15240, +51623=>15241, +51624=>15242, +51625=>15243, +51626=>15244, +51627=>15245, +51628=>15246, +51629=>15247, +51630=>15248, +51631=>15249, +51632=>15250, +51633=>15251, +51634=>15252, +51635=>15253, +51636=>15254, +51637=>15255, +51638=>15256, +51639=>15257, +51640=>15258, +51641=>15259, +51642=>15260, +51643=>15261, +51644=>15262, +51645=>15263, +51646=>15264, +51647=>15265, +51650=>15266, +51651=>15267, +51653=>15268, +51654=>15269, +51657=>15270, +51659=>15271, +51660=>15272, +51661=>15273, +51662=>15274, +51663=>15275, +51666=>15276, +51668=>15277, +51671=>15278, +51672=>15279, +51675=>15280, +51678=>15281, +51679=>15282, +51681=>15283, +51683=>15284, +51685=>15285, +51686=>15286, +51688=>15287, +51689=>15288, +51690=>15289, +51691=>15290, +51694=>15291, +51698=>15292, +51699=>15293, +51700=>15294, +51701=>15295, +51702=>15296, +51703=>15297, +51706=>15298, +51707=>15299, +51709=>15300, +51710=>15301, +51711=>15302, +51713=>15303, +51714=>15304, +51715=>15305, +51716=>15306, +51717=>15307, +51718=>15308, +51719=>15309, +51722=>15310, +51726=>15311, +51727=>15312, +51728=>15313, +51729=>15314, +51730=>15315, +51731=>15316, +51733=>15317, +51734=>15318, +51735=>15319, +51737=>15320, +51738=>15321, +51739=>15322, +51740=>15323, +51741=>15324, +51742=>15325, +51743=>15326, +51744=>15327, +51745=>15328, +51746=>15329, +51747=>15330, +51748=>15331, +51749=>15332, +51750=>15333, +51751=>15334, +51752=>15335, +51754=>15336, +51755=>15337, +51756=>15338, +51757=>15339, +51758=>15340, +51759=>15341, +51760=>15342, +51761=>15343, +51762=>15344, +51763=>15345, +51764=>15346, +51765=>15347, +51766=>15348, +51767=>15349, +51768=>15350, +51769=>15351, +51770=>15352, +51771=>15353, +51772=>15354, +51773=>15355, +51774=>15356, +51775=>15357, +51776=>15358, +51777=>15359, +51778=>15360, +51779=>15361, +51780=>15362, +51781=>15363, +51782=>15364, +51783=>15365, +51784=>15366, +51785=>15367, +51786=>15368, +51787=>15369, +51790=>15370, +51791=>15371, +51793=>15372, +51794=>15373, +51795=>15374, +51797=>15375, +51798=>15376, +51799=>15377, +51800=>15378, +51801=>15379, +51802=>15380, +51803=>15381, +51806=>15382, +51810=>15383, +51811=>15384, +51812=>15385, +51813=>15386, +51814=>15387, +51815=>15388, +51817=>15389, +51818=>15390, +51819=>15391, +51820=>15392, +51821=>15393, +51822=>15394, +51823=>15395, +51824=>15396, +51825=>15397, +51826=>15398, +51827=>15399, +51828=>15400, +51829=>15401, +51830=>15402, +51831=>15403, +51832=>15404, +51833=>15405, +51834=>15406, +51835=>15407, +51836=>15408, +51838=>15409, +51839=>15410, +51840=>15411, +51841=>15412, +51842=>15413, +51843=>15414, +51845=>15415, +51846=>15416, +51847=>15417, +51848=>15418, +51849=>15419, +51850=>15420, +51851=>15421, +51852=>15422, +51853=>15423, +51854=>15424, +51855=>15425, +51856=>15426, +51857=>15427, +51858=>15428, +51859=>15429, +51860=>15430, +51861=>15431, +51862=>15432, +51863=>15433, +51865=>15434, +51866=>15435, +51867=>15436, +51868=>15437, +51869=>15438, +51870=>15439, +51871=>15440, +51872=>15441, +51873=>15442, +51874=>15443, +51875=>15444, +51876=>15445, +51877=>15446, +51878=>15447, +51879=>15448, +51880=>15449, +51881=>15450, +51882=>15451, +51883=>15452, +51884=>15453, +51885=>15454, +51886=>15455, +51887=>15456, +51888=>15457, +51889=>15458, +51890=>15459, +51891=>15460, +51892=>15461, +51893=>15462, +51894=>15463, +51895=>15464, +51896=>15465, +51897=>15466, +51898=>15467, +51899=>15468, +51902=>15469, +51903=>15470, +51905=>15471, +51906=>15472, +51907=>15473, +51909=>15474, +51910=>15475, +51911=>15476, +51912=>15477, +51913=>15478, +51914=>15479, +51915=>15480, +51918=>15481, +51920=>15482, +51922=>15483, +51924=>15484, +51925=>15485, +51926=>15486, +51927=>15487, +51930=>15488, +51931=>15489, +51932=>15490, +51933=>15491, +51934=>15492, +51935=>15493, +51937=>15494, +51938=>15495, +51939=>15496, +51940=>15497, +51941=>15498, +51942=>15499, +51943=>15500, +51944=>15501, +51945=>15502, +51946=>15503, +51947=>15504, +51949=>15505, +51950=>15506, +51951=>15507, +51952=>15508, +51953=>15509, +51954=>15510, +51955=>15511, +51957=>15512, +51958=>15513, +51959=>15514, +51960=>15515, +51961=>15516, +51962=>15517, +51963=>15518, +51964=>15519, +51965=>15520, +51966=>15521, +51967=>15522, +51968=>15523, +51969=>15524, +51970=>15525, +51971=>15526, +51972=>15527, +51973=>15528, +51974=>15529, +51975=>15530, +51977=>15531, +51978=>15532, +51979=>15533, +51980=>15534, +51981=>15535, +51982=>15536, +51983=>15537, +51985=>15538, +51986=>15539, +51987=>15540, +51989=>15541, +51990=>15542, +51991=>15543, +51993=>15544, +51994=>15545, +51995=>15546, +51996=>15547, +51997=>15548, +51998=>15549, +51999=>15550, +52002=>15551, +52003=>15552, +52004=>15553, +52005=>15554, +52006=>15555, +52007=>15556, +52008=>15557, +52009=>15558, +52010=>15559, +52011=>15560, +52012=>15561, +52013=>15562, +52014=>15563, +52015=>15564, +52016=>15565, +52017=>15566, +52018=>15567, +52019=>15568, +52020=>15569, +52021=>15570, +52022=>15571, +52023=>15572, +52024=>15573, +52025=>15574, +52026=>15575, +52027=>15576, +52028=>15577, +52029=>15578, +52030=>15579, +52031=>15580, +52032=>15581, +52034=>15582, +52035=>15583, +52036=>15584, +52037=>15585, +52038=>15586, +52039=>15587, +52042=>15588, +52043=>15589, +52045=>15590, +52046=>15591, +52047=>15592, +52049=>15593, +52050=>15594, +52051=>15595, +52052=>15596, +52053=>15597, +52054=>15598, +52055=>15599, +52058=>15600, +52059=>15601, +52060=>15602, +52062=>15603, +52063=>15604, +52064=>15605, +52065=>15606, +52066=>15607, +52067=>15608, +52069=>15609, +52070=>15610, +52071=>15611, +52072=>15612, +52073=>15613, +52074=>15614, +52075=>15615, +52076=>15616, +52077=>15617, +52078=>15618, +52079=>15619, +52080=>15620, +52081=>15621, +52082=>15622, +52083=>15623, +52084=>15624, +52085=>15625, +52086=>15626, +52087=>15627, +52090=>15628, +52091=>15629, +52092=>15630, +52093=>15631, +52094=>15632, +52095=>15633, +52096=>15634, +52097=>15635, +52098=>15636, +52099=>15637, +52100=>15638, +52101=>15639, +52102=>15640, +52103=>15641, +52104=>15642, +52105=>15643, +52106=>15644, +52107=>15645, +52108=>15646, +52109=>15647, +52110=>15648, +52111=>15649, +52112=>15650, +52113=>15651, +52114=>15652, +52115=>15653, +52116=>15654, +52117=>15655, +52118=>15656, +52119=>15657, +52120=>15658, +52121=>15659, +52122=>15660, +52123=>15661, +52125=>15662, +52126=>15663, +52127=>15664, +52128=>15665, +52129=>15666, +52130=>15667, +52131=>15668, +52132=>15669, +52133=>15670, +52134=>15671, +52135=>15672, +52136=>15673, +52137=>15674, +52138=>15675, +52139=>15676, +52140=>15677, +52141=>15678, +52142=>15679, +52143=>15680, +52144=>15681, +52145=>15682, +52146=>15683, +52147=>15684, +52148=>15685, +52149=>15686, +52150=>15687, +52151=>15688, +52153=>15689, +52154=>15690, +52155=>15691, +52156=>15692, +52157=>15693, +52158=>15694, +52159=>15695, +52160=>15696, +52161=>15697, +52162=>15698, +52163=>15699, +52164=>15700, +52165=>15701, +52166=>15702, +52167=>15703, +52168=>15704, +52169=>15705, +52170=>15706, +52171=>15707, +52172=>15708, +52173=>15709, +52174=>15710, +52175=>15711, +52176=>15712, +52177=>15713, +52178=>15714, +52179=>15715, +52181=>15716, +52182=>15717, +52183=>15718, +52184=>15719, +52185=>15720, +52186=>15721, +52187=>15722, +52188=>15723, +52189=>15724, +52190=>15725, +52191=>15726, +52192=>15727, +52193=>15728, +52194=>15729, +52195=>15730, +52197=>15731, +52198=>15732, +52200=>15733, +52202=>15734, +52203=>15735, +52204=>15736, +52205=>15737, +52206=>15738, +52207=>15739, +52208=>15740, +52209=>15741, +52210=>15742, +52211=>15743, +52212=>15744, +52213=>15745, +52214=>15746, +52215=>15747, +52216=>15748, +52217=>15749, +52218=>15750, +52219=>15751, +52220=>15752, +52221=>15753, +52222=>15754, +52223=>15755, +52224=>15756, +52225=>15757, +52226=>15758, +52227=>15759, +52228=>15760, +52229=>15761, +52230=>15762, +52231=>15763, +52232=>15764, +52233=>15765, +52234=>15766, +52235=>15767, +52238=>15768, +52239=>15769, +52241=>15770, +52242=>15771, +52243=>15772, +52245=>15773, +52246=>15774, +52247=>15775, +52248=>15776, +52249=>15777, +52250=>15778, +52251=>15779, +52254=>15780, +52255=>15781, +52256=>15782, +52259=>15783, +52260=>15784, +52261=>15785, +52262=>15786, +52266=>15787, +52267=>15788, +52269=>15789, +52271=>15790, +52273=>15791, +52274=>15792, +52275=>15793, +52276=>15794, +52277=>15795, +52278=>15796, +52279=>15797, +52282=>15798, +52287=>15799, +52288=>15800, +52289=>15801, +52290=>15802, +52291=>15803, +52294=>15804, +52295=>15805, +52297=>15806, +52298=>15807, +52299=>15808, +52301=>15809, +52302=>15810, +52303=>15811, +52304=>15812, +52305=>15813, +52306=>15814, +52307=>15815, +52310=>15816, +52314=>15817, +52315=>15818, +52316=>15819, +52317=>15820, +52318=>15821, +52319=>15822, +52321=>15823, +52322=>15824, +52323=>15825, +52325=>15826, +52327=>15827, +52329=>15828, +52330=>15829, +52331=>15830, +52332=>15831, +52333=>15832, +52334=>15833, +52335=>15834, +52337=>15835, +52338=>15836, +52339=>15837, +52340=>15838, +52342=>15839, +52343=>15840, +52344=>15841, +52345=>15842, +52346=>15843, +52347=>15844, +52348=>15845, +52349=>15846, +52350=>15847, +52351=>15848, +52352=>15849, +52353=>15850, +52354=>15851, +52355=>15852, +52356=>15853, +52357=>15854, +52358=>15855, +52359=>15856, +52360=>15857, +52361=>15858, +52362=>15859, +52363=>15860, +52364=>15861, +52365=>15862, +52366=>15863, +52367=>15864, +52368=>15865, +52369=>15866, +52370=>15867, +52371=>15868, +52372=>15869, +52373=>15870, +52374=>15871, +52375=>15872, +52378=>15873, +52379=>15874, +52381=>15875, +52382=>15876, +52383=>15877, +52385=>15878, +52386=>15879, +52387=>15880, +52388=>15881, +52389=>15882, +52390=>15883, +52391=>15884, +52394=>15885, +52398=>15886, +52399=>15887, +52400=>15888, +52401=>15889, +52402=>15890, +52403=>15891, +52406=>15892, +52407=>15893, +52409=>15894, +52410=>15895, +52411=>15896, +52413=>15897, +52414=>15898, +52415=>15899, +52416=>15900, +52417=>15901, +52418=>15902, +52419=>15903, +52422=>15904, +52424=>15905, +52426=>15906, +52427=>15907, +52428=>15908, +52429=>15909, +52430=>15910, +52431=>15911, +52433=>15912, +52434=>15913, +52435=>15914, +52437=>15915, +52438=>15916, +52439=>15917, +52440=>15918, +52441=>15919, +52442=>15920, +52443=>15921, +52444=>15922, +52445=>15923, +52446=>15924, +52447=>15925, +52448=>15926, +52449=>15927, +52450=>15928, +52451=>15929, +52453=>15930, +52454=>15931, +52455=>15932, +52456=>15933, +52457=>15934, +52458=>15935, +52459=>15936, +52461=>15937, +52462=>15938, +52463=>15939, +52465=>15940, +52466=>15941, +52467=>15942, +52468=>15943, +52469=>15944, +52470=>15945, +52471=>15946, +52472=>15947, +52473=>15948, +52474=>15949, +52475=>15950, +52476=>15951, +52477=>15952, +52478=>15953, +52479=>15954, +52480=>15955, +52482=>15956, +52483=>15957, +52484=>15958, +52485=>15959, +52486=>15960, +52487=>15961, +52490=>15962, +52491=>15963, +52493=>15964, +52494=>15965, +52495=>15966, +52497=>15967, +52498=>15968, +52499=>15969, +52500=>15970, +52501=>15971, +52502=>15972, +52503=>15973, +52506=>15974, +52508=>15975, +52510=>15976, +52511=>15977, +52512=>15978, +52513=>15979, +52514=>15980, +52515=>15981, +52517=>15982, +52518=>15983, +52519=>15984, +52521=>15985, +52522=>15986, +52523=>15987, +52525=>15988, +52526=>15989, +52527=>15990, +52528=>15991, +52529=>15992, +52530=>15993, +52531=>15994, +52532=>15995, +52533=>15996, +52534=>15997, +52535=>15998, +52536=>15999, +52538=>16000, +52539=>16001, +52540=>16002, +52541=>16003, +52542=>16004, +52543=>16005, +52544=>16006, +52545=>16007, +52546=>16008, +52547=>16009, +52548=>16010, +52549=>16011, +52550=>16012, +52551=>16013, +52552=>16014, +52553=>16015, +52554=>16016, +52555=>16017, +52556=>16018, +52557=>16019, +52558=>16020, +52559=>16021, +52560=>16022, +52561=>16023, +52562=>16024, +52563=>16025, +52564=>16026, +52565=>16027, +52566=>16028, +52567=>16029, +52568=>16030, +52569=>16031, +52570=>16032, +52571=>16033, +52573=>16034, +52574=>16035, +52575=>16036, +52577=>16037, +52578=>16038, +52579=>16039, +52581=>16040, +52582=>16041, +52583=>16042, +52584=>16043, +52585=>16044, +52586=>16045, +52587=>16046, +52590=>16047, +52592=>16048, +52594=>16049, +52595=>16050, +52596=>16051, +52597=>16052, +52598=>16053, +52599=>16054, +52601=>16055, +52602=>16056, +52603=>16057, +52604=>16058, +52605=>16059, +52606=>16060, +52607=>16061, +52608=>16062, +52609=>16063, +52610=>16064, +52611=>16065, +52612=>16066, +52613=>16067, +52614=>16068, +52615=>16069, +52617=>16070, +52618=>16071, +52619=>16072, +52620=>16073, +52621=>16074, +52622=>16075, +52623=>16076, +52624=>16077, +52625=>16078, +52626=>16079, +52627=>16080, +52630=>16081, +52631=>16082, +52633=>16083, +52634=>16084, +52635=>16085, +52637=>16086, +52638=>16087, +52639=>16088, +52640=>16089, +52641=>16090, +52642=>16091, +52643=>16092, +52646=>16093, +52648=>16094, +52650=>16095, +52651=>16096, +52652=>16097, +52653=>16098, +52654=>16099, +52655=>16100, +52657=>16101, +52658=>16102, +52659=>16103, +52660=>16104, +52661=>16105, +52662=>16106, +52663=>16107, +52664=>16108, +52665=>16109, +52666=>16110, +52667=>16111, +52668=>16112, +52669=>16113, +52670=>16114, +52671=>16115, +52672=>16116, +52673=>16117, +52674=>16118, +52675=>16119, +52677=>16120, +52678=>16121, +52679=>16122, +52680=>16123, +52681=>16124, +52682=>16125, +52683=>16126, +52685=>16127, +52686=>16128, +52687=>16129, +52689=>16130, +52690=>16131, +52691=>16132, +52692=>16133, +52693=>16134, +52694=>16135, +52695=>16136, +52696=>16137, +52697=>16138, +52698=>16139, +52699=>16140, +52700=>16141, +52701=>16142, +52702=>16143, +52703=>16144, +52704=>16145, +52705=>16146, +52706=>16147, +52707=>16148, +52708=>16149, +52709=>16150, +52710=>16151, +52711=>16152, +52713=>16153, +52714=>16154, +52715=>16155, +52717=>16156, +52718=>16157, +52719=>16158, +52721=>16159, +52722=>16160, +52723=>16161, +52724=>16162, +52725=>16163, +52726=>16164, +52727=>16165, +52730=>16166, +52732=>16167, +52734=>16168, +52735=>16169, +52736=>16170, +52737=>16171, +52738=>16172, +52739=>16173, +52741=>16174, +52742=>16175, +52743=>16176, +52745=>16177, +52746=>16178, +52747=>16179, +52749=>16180, +52750=>16181, +52751=>16182, +52752=>16183, +52753=>16184, +52754=>16185, +52755=>16186, +52757=>16187, +52758=>16188, +52759=>16189, +52760=>16190, +52762=>16191, +52763=>16192, +52764=>16193, +52765=>16194, +52766=>16195, +52767=>16196, +52770=>16197, +52771=>16198, +52773=>16199, +52774=>16200, +52775=>16201, +52777=>16202, +52778=>16203, +52779=>16204, +52780=>16205, +52781=>16206, +52782=>16207, +52783=>16208, +52786=>16209, +52788=>16210, +52790=>16211, +52791=>16212, +52792=>16213, +52793=>16214, +52794=>16215, +52795=>16216, +52796=>16217, +52797=>16218, +52798=>16219, +52799=>16220, +52800=>16221, +52801=>16222, +52802=>16223, +52803=>16224, +52804=>16225, +52805=>16226, +52806=>16227, +52807=>16228, +52808=>16229, +52809=>16230, +52810=>16231, +52811=>16232, +52812=>16233, +52813=>16234, +52814=>16235, +52815=>16236, +52816=>16237, +52817=>16238, +52818=>16239, +52819=>16240, +52820=>16241, +52821=>16242, +52822=>16243, +52823=>16244, +52826=>16245, +52827=>16246, +52829=>16247, +52830=>16248, +52834=>16249, +52835=>16250, +52836=>16251, +52837=>16252, +52838=>16253, +52839=>16254, +52842=>16255, +52844=>16256, +52846=>16257, +52847=>16258, +52848=>16259, +52849=>16260, +52850=>16261, +52851=>16262, +52854=>16263, +52855=>16264, +52857=>16265, +52858=>16266, +52859=>16267, +52861=>16268, +52862=>16269, +52863=>16270, +52864=>16271, +52865=>16272, +52866=>16273, +52867=>16274, +52870=>16275, +52872=>16276, +52874=>16277, +52875=>16278, +52876=>16279, +52877=>16280, +52878=>16281, +52879=>16282, +52882=>16283, +52883=>16284, +52885=>16285, +52886=>16286, +52887=>16287, +52889=>16288, +52890=>16289, +52891=>16290, +52892=>16291, +52893=>16292, +52894=>16293, +52895=>16294, +52898=>16295, +52902=>16296, +52903=>16297, +52904=>16298, +52905=>16299, +52906=>16300, +52907=>16301, +52910=>16302, +52911=>16303, +52912=>16304, +52913=>16305, +52914=>16306, +52915=>16307, +52916=>16308, +52917=>16309, +52918=>16310, +52919=>16311, +52920=>16312, +52921=>16313, +52922=>16314, +52923=>16315, +52924=>16316, +52925=>16317, +52926=>16318, +52927=>16319, +52928=>16320, +52930=>16321, +52931=>16322, +52932=>16323, +52933=>16324, +52934=>16325, +52935=>16326, +52936=>16327, +52937=>16328, +52938=>16329, +52939=>16330, +52940=>16331, +52941=>16332, +52942=>16333, +52943=>16334, +52944=>16335, +52945=>16336, +52946=>16337, +52947=>16338, +52948=>16339, +52949=>16340, +52950=>16341, +52951=>16342, +52952=>16343, +52953=>16344, +52954=>16345, +52955=>16346, +52956=>16347, +52957=>16348, +52958=>16349, +52959=>16350, +52960=>16351, +52961=>16352, +52962=>16353, +52963=>16354, +52966=>16355, +52967=>16356, +52969=>16357, +52970=>16358, +52973=>16359, +52974=>16360, +52975=>16361, +52976=>16362, +52977=>16363, +52978=>16364, +52979=>16365, +52982=>16366, +52986=>16367, +52987=>16368, +52988=>16369, +52989=>16370, +52990=>16371, +52991=>16372, +52994=>16373, +52995=>16374, +52997=>16375, +52998=>16376, +52999=>16377, +53001=>16378, +53002=>16379, +53003=>16380, +53004=>16381, +53005=>16382, +53006=>16383, +53007=>16384, +53010=>16385, +53012=>16386, +53014=>16387, +53015=>16388, +53016=>16389, +53017=>16390, +53018=>16391, +53019=>16392, +53021=>16393, +53022=>16394, +53023=>16395, +53025=>16396, +53026=>16397, +53027=>16398, +53029=>16399, +53030=>16400, +53031=>16401, +53032=>16402, +53033=>16403, +53034=>16404, +53035=>16405, +53038=>16406, +53042=>16407, +53043=>16408, +53044=>16409, +53045=>16410, +53046=>16411, +53047=>16412, +53049=>16413, +53050=>16414, +53051=>16415, +53052=>16416, +53053=>16417, +53054=>16418, +53055=>16419, +53056=>16420, +53057=>16421, +53058=>16422, +53059=>16423, +53060=>16424, +53061=>16425, +53062=>16426, +53063=>16427, +53064=>16428, +53065=>16429, +53066=>16430, +53067=>16431, +53068=>16432, +53069=>16433, +53070=>16434, +53071=>16435, +53072=>16436, +53073=>16437, +53074=>16438, +53075=>16439, +53078=>16440, +53079=>16441, +53081=>16442, +53082=>16443, +53083=>16444, +53085=>16445, +53086=>16446, +53087=>16447, +53088=>16448, +53089=>16449, +53090=>16450, +53091=>16451, +53094=>16452, +53096=>16453, +53098=>16454, +53099=>16455, +53100=>16456, +53101=>16457, +53102=>16458, +53103=>16459, +53106=>16460, +53107=>16461, +53109=>16462, +53110=>16463, +53111=>16464, +53113=>16465, +53114=>16466, +53115=>16467, +53116=>16468, +53117=>16469, +53118=>16470, +53119=>16471, +53121=>16472, +53122=>16473, +53123=>16474, +53124=>16475, +53126=>16476, +53127=>16477, +53128=>16478, +53129=>16479, +53130=>16480, +53131=>16481, +53133=>16482, +53134=>16483, +53135=>16484, +53136=>16485, +53137=>16486, +53138=>16487, +53139=>16488, +53140=>16489, +53141=>16490, +53142=>16491, +53143=>16492, +53144=>16493, +53145=>16494, +53146=>16495, +53147=>16496, +53148=>16497, +53149=>16498, +53150=>16499, +53151=>16500, +53152=>16501, +53154=>16502, +53155=>16503, +53156=>16504, +53157=>16505, +53158=>16506, +53159=>16507, +53161=>16508, +53162=>16509, +53163=>16510, +53164=>16511, +53165=>16512, +53166=>16513, +53167=>16514, +53169=>16515, +53170=>16516, +53171=>16517, +53172=>16518, +53173=>16519, +53174=>16520, +53175=>16521, +53176=>16522, +53177=>16523, +53178=>16524, +53179=>16525, +53180=>16526, +53181=>16527, +53182=>16528, +53183=>16529, +53184=>16530, +53185=>16531, +53186=>16532, +53187=>16533, +53189=>16534, +53190=>16535, +53191=>16536, +53192=>16537, +53193=>16538, +53194=>16539, +53195=>16540, +53196=>16541, +53197=>16542, +53198=>16543, +53199=>16544, +53200=>16545, +53201=>16546, +53202=>16547, +53203=>16548, +53204=>16549, +53205=>16550, +53206=>16551, +53207=>16552, +53208=>16553, +53209=>16554, +53210=>16555, +53211=>16556, +53212=>16557, +53213=>16558, +53214=>16559, +53215=>16560, +53218=>16561, +53219=>16562, +53221=>16563, +53222=>16564, +53223=>16565, +53225=>16566, +53226=>16567, +53227=>16568, +53228=>16569, +53229=>16570, +53230=>16571, +53231=>16572, +53234=>16573, +53236=>16574, +53238=>16575, +53239=>16576, +53240=>16577, +53241=>16578, +53242=>16579, +53243=>16580, +53245=>16581, +53246=>16582, +53247=>16583, +53249=>16584, +53250=>16585, +53251=>16586, +53253=>16587, +53254=>16588, +53255=>16589, +53256=>16590, +53257=>16591, +53258=>16592, +53259=>16593, +53260=>16594, +53261=>16595, +53262=>16596, +53263=>16597, +53264=>16598, +53266=>16599, +53267=>16600, +53268=>16601, +53269=>16602, +53270=>16603, +53271=>16604, +53273=>16605, +53274=>16606, +53275=>16607, +53276=>16608, +53277=>16609, +53278=>16610, +53279=>16611, +53280=>16612, +53281=>16613, +53282=>16614, +53283=>16615, +53284=>16616, +53285=>16617, +53286=>16618, +53287=>16619, +53288=>16620, +53289=>16621, +53290=>16622, +53291=>16623, +53292=>16624, +53294=>16625, +53295=>16626, +53296=>16627, +53297=>16628, +53298=>16629, +53299=>16630, +53302=>16631, +53303=>16632, +53305=>16633, +53306=>16634, +53307=>16635, +53309=>16636, +53310=>16637, +53311=>16638, +53312=>16639, +53313=>16640, +53314=>16641, +53315=>16642, +53318=>16643, +53320=>16644, +53322=>16645, +53323=>16646, +53324=>16647, +53325=>16648, +53326=>16649, +53327=>16650, +53329=>16651, +53330=>16652, +53331=>16653, +53333=>16654, +53334=>16655, +53335=>16656, +53337=>16657, +53338=>16658, +53339=>16659, +53340=>16660, +53341=>16661, +53342=>16662, +53343=>16663, +53345=>16664, +53346=>16665, +53347=>16666, +53348=>16667, +53349=>16668, +53350=>16669, +53351=>16670, +53352=>16671, +53353=>16672, +53354=>16673, +53355=>16674, +53358=>16675, +53359=>16676, +53361=>16677, +53362=>16678, +53363=>16679, +53365=>16680, +53366=>16681, +53367=>16682, +53368=>16683, +53369=>16684, +53370=>16685, +53371=>16686, +53374=>16687, +53375=>16688, +53376=>16689, +53378=>16690, +53379=>16691, +53380=>16692, +53381=>16693, +53382=>16694, +53383=>16695, +53384=>16696, +53385=>16697, +53386=>16698, +53387=>16699, +53388=>16700, +53389=>16701, +53390=>16702, +53391=>16703, +53392=>16704, +53393=>16705, +53394=>16706, +53395=>16707, +53396=>16708, +53397=>16709, +53398=>16710, +53399=>16711, +53400=>16712, +53401=>16713, +53402=>16714, +53403=>16715, +53404=>16716, +53405=>16717, +53406=>16718, +53407=>16719, +53408=>16720, +53409=>16721, +53410=>16722, +53411=>16723, +53414=>16724, +53415=>16725, +53417=>16726, +53418=>16727, +53419=>16728, +53421=>16729, +53422=>16730, +53423=>16731, +53424=>16732, +53425=>16733, +53426=>16734, +53427=>16735, +53430=>16736, +53432=>16737, +53434=>16738, +53435=>16739, +53436=>16740, +53437=>16741, +53438=>16742, +53439=>16743, +53442=>16744, +53443=>16745, +53445=>16746, +53446=>16747, +53447=>16748, +53450=>16749, +53451=>16750, +53452=>16751, +53453=>16752, +53454=>16753, +53455=>16754, +53458=>16755, +53462=>16756, +53463=>16757, +53464=>16758, +53465=>16759, +53466=>16760, +53467=>16761, +53470=>16762, +53471=>16763, +53473=>16764, +53474=>16765, +53475=>16766, +53477=>16767, +53478=>16768, +53479=>16769, +53480=>16770, +53481=>16771, +53482=>16772, +53483=>16773, +53486=>16774, +53490=>16775, +53491=>16776, +53492=>16777, +53493=>16778, +53494=>16779, +53495=>16780, +53497=>16781, +53498=>16782, +53499=>16783, +53500=>16784, +53501=>16785, +53502=>16786, +53503=>16787, +53504=>16788, +53505=>16789, +53506=>16790, +53507=>16791, +53508=>16792, +53509=>16793, +53510=>16794, +53511=>16795, +53512=>16796, +53513=>16797, +53514=>16798, +53515=>16799, +53516=>16800, +53518=>16801, +53519=>16802, +53520=>16803, +53521=>16804, +53522=>16805, +53523=>16806, +53524=>16807, +53525=>16808, +53526=>16809, +53527=>16810, +53528=>16811, +53529=>16812, +53530=>16813, +53531=>16814, +53532=>16815, +53533=>16816, +53534=>16817, +53535=>16818, +53536=>16819, +53537=>16820, +53538=>16821, +53539=>16822, +53540=>16823, +53541=>16824, +53542=>16825, +53543=>16826, +53544=>16827, +53545=>16828, +53546=>16829, +53547=>16830, +53548=>16831, +53549=>16832, +53550=>16833, +53551=>16834, +53554=>16835, +53555=>16836, +53557=>16837, +53558=>16838, +53559=>16839, +53561=>16840, +53563=>16841, +53564=>16842, +53565=>16843, +53566=>16844, +53567=>16845, +53570=>16846, +53574=>16847, +53575=>16848, +53576=>16849, +53577=>16850, +53578=>16851, +53579=>16852, +53582=>16853, +53583=>16854, +53585=>16855, +53586=>16856, +53587=>16857, +53589=>16858, +53590=>16859, +53591=>16860, +53592=>16861, +53593=>16862, +53594=>16863, +53595=>16864, +53598=>16865, +53600=>16866, +53602=>16867, +53603=>16868, +53604=>16869, +53605=>16870, +53606=>16871, +53607=>16872, +53609=>16873, +53610=>16874, +53611=>16875, +53613=>16876, +53614=>16877, +53615=>16878, +53616=>16879, +53617=>16880, +53618=>16881, +53619=>16882, +53620=>16883, +53621=>16884, +53622=>16885, +53623=>16886, +53624=>16887, +53625=>16888, +53626=>16889, +53627=>16890, +53629=>16891, +53630=>16892, +53631=>16893, +53632=>16894, +53633=>16895, +53634=>16896, +53635=>16897, +53637=>16898, +53638=>16899, +53639=>16900, +53641=>16901, +53642=>16902, +53643=>16903, +53644=>16904, +53645=>16905, +53646=>16906, +53647=>16907, +53648=>16908, +53649=>16909, +53650=>16910, +53651=>16911, +53652=>16912, +53653=>16913, +53654=>16914, +53655=>16915, +53656=>16916, +53657=>16917, +53658=>16918, +53659=>16919, +53660=>16920, +53661=>16921, +53662=>16922, +53663=>16923, +53666=>16924, +53667=>16925, +53669=>16926, +53670=>16927, +53671=>16928, +53673=>16929, +53674=>16930, +53675=>16931, +53676=>16932, +53677=>16933, +53678=>16934, +53679=>16935, +53682=>16936, +53684=>16937, +53686=>16938, +53687=>16939, +53688=>16940, +53689=>16941, +53691=>16942, +53693=>16943, +53694=>16944, +53695=>16945, +53697=>16946, +53698=>16947, +53699=>16948, +53700=>16949, +53701=>16950, +53702=>16951, +53703=>16952, +53704=>16953, +53705=>16954, +53706=>16955, +53707=>16956, +53708=>16957, +53709=>16958, +53710=>16959, +53711=>16960, +53712=>16961, +53713=>16962, +53714=>16963, +53715=>16964, +53716=>16965, +53717=>16966, +53718=>16967, +53719=>16968, +53721=>16969, +53722=>16970, +53723=>16971, +53724=>16972, +53725=>16973, +53726=>16974, +53727=>16975, +53728=>16976, +53729=>16977, +53730=>16978, +53731=>16979, +53732=>16980, +53733=>16981, +53734=>16982, +53735=>16983, +53736=>16984, +53737=>16985, +53738=>16986, +53739=>16987, +53740=>16988, +53741=>16989, +53742=>16990, +53743=>16991, +53744=>16992, +53745=>16993, +53746=>16994, +53747=>16995, +53749=>16996, +53750=>16997, +53751=>16998, +53753=>16999, +53754=>17000, +53755=>17001, +53756=>17002, +53757=>17003, +53758=>17004, +53759=>17005, +53760=>17006, +53761=>17007, +53762=>17008, +53763=>17009, +53764=>17010, +53765=>17011, +53766=>17012, +53768=>17013, +53770=>17014, +53771=>17015, +53772=>17016, +53773=>17017, +53774=>17018, +53775=>17019, +53777=>17020, +53778=>17021, +53779=>17022, +53780=>17023, +53781=>17024, +53782=>17025, +53783=>17026, +53784=>17027, +53785=>17028, +53786=>17029, +53787=>17030, +53788=>17031, +53789=>17032, +53790=>17033, +53791=>17034, +53792=>17035, +53793=>17036, +53794=>17037, +53795=>17038, +53796=>17039, +53797=>17040, +53798=>17041, +53799=>17042, +53800=>17043, +53801=>17044, +53802=>17045, +53803=>17046, +53806=>17047, +53807=>17048, +53809=>17049, +53810=>17050, +53811=>17051, +53813=>17052, +53814=>17053, +53815=>17054, +53816=>17055, +53817=>17056, +53818=>17057, +53819=>17058, +53822=>17059, +53824=>17060, +53826=>17061, +53827=>17062, +53828=>17063, +53829=>17064, +53830=>17065, +53831=>17066, +53833=>17067, +53834=>17068, +53835=>17069, +53836=>17070, +53837=>17071, +53838=>17072, +53839=>17073, +53840=>17074, +53841=>17075, +53842=>17076, +53843=>17077, +53844=>17078, +53845=>17079, +53846=>17080, +53847=>17081, +53848=>17082, +53849=>17083, +53850=>17084, +53851=>17085, +53853=>17086, +53854=>17087, +53855=>17088, +53856=>17089, +53857=>17090, +53858=>17091, +53859=>17092, +53861=>17093, +53862=>17094, +53863=>17095, +53864=>17096, +53865=>17097, +53866=>17098, +53867=>17099, +53868=>17100, +53869=>17101, +53870=>17102, +53871=>17103, +53872=>17104, +53873=>17105, +53874=>17106, +53875=>17107, +53876=>17108, +53877=>17109, +53878=>17110, +53879=>17111, +53880=>17112, +53881=>17113, +53882=>17114, +53883=>17115, +53884=>17116, +53885=>17117, +53886=>17118, +53887=>17119, +53890=>17120, +53891=>17121, +53893=>17122, +53894=>17123, +53895=>17124, +53897=>17125, +53898=>17126, +53899=>17127, +53900=>17128, +53901=>17129, +53902=>17130, +53903=>17131, +53906=>17132, +53907=>17133, +53908=>17134, +53910=>17135, +53911=>17136, +53912=>17137, +53913=>17138, +53914=>17139, +53915=>17140, +53917=>17141, +53918=>17142, +53919=>17143, +53921=>17144, +53922=>17145, +53923=>17146, +53925=>17147, +53926=>17148, +53927=>17149, +53928=>17150, +53929=>17151, +53930=>17152, +53931=>17153, +53933=>17154, +53934=>17155, +53935=>17156, +53936=>17157, +53938=>17158, +53939=>17159, +53940=>17160, +53941=>17161, +53942=>17162, +53943=>17163, +53946=>17164, +53947=>17165, +53949=>17166, +53950=>17167, +53953=>17168, +53955=>17169, +53956=>17170, +53957=>17171, +53958=>17172, +53959=>17173, +53962=>17174, +53964=>17175, +53965=>17176, +53966=>17177, +53967=>17178, +53968=>17179, +53969=>17180, +53970=>17181, +53971=>17182, +53973=>17183, +53974=>17184, +53975=>17185, +53977=>17186, +53978=>17187, +53979=>17188, +53981=>17189, +53982=>17190, +53983=>17191, +53984=>17192, +53985=>17193, +53986=>17194, +53987=>17195, +53990=>17196, +53991=>17197, +53992=>17198, +53993=>17199, +53994=>17200, +53995=>17201, +53996=>17202, +53997=>17203, +53998=>17204, +53999=>17205, +54002=>17206, +54003=>17207, +54005=>17208, +54006=>17209, +54007=>17210, +54009=>17211, +54010=>17212, +54011=>17213, +54012=>17214, +54013=>17215, +54014=>17216, +54015=>17217, +54018=>17218, +54020=>17219, +54022=>17220, +54023=>17221, +54024=>17222, +54025=>17223, +54026=>17224, +54027=>17225, +54031=>17226, +54033=>17227, +54034=>17228, +54035=>17229, +54037=>17230, +54039=>17231, +54040=>17232, +54041=>17233, +54042=>17234, +54043=>17235, +54046=>17236, +54050=>17237, +54051=>17238, +54052=>17239, +54054=>17240, +54055=>17241, +54058=>17242, +54059=>17243, +54061=>17244, +54062=>17245, +54063=>17246, +54065=>17247, +54066=>17248, +54067=>17249, +54068=>17250, +54069=>17251, +54070=>17252, +54071=>17253, +54074=>17254, +54078=>17255, +54079=>17256, +54080=>17257, +54081=>17258, +54082=>17259, +54083=>17260, +54086=>17261, +54087=>17262, +54088=>17263, +54089=>17264, +54090=>17265, +54091=>17266, +54092=>17267, +54093=>17268, +54094=>17269, +54095=>17270, +54096=>17271, +54097=>17272, +54098=>17273, +54099=>17274, +54100=>17275, +54101=>17276, +54102=>17277, +54103=>17278, +54104=>17279, +54105=>17280, +54106=>17281, +54107=>17282, +54108=>17283, +54109=>17284, +54110=>17285, +54111=>17286, +54112=>17287, +54113=>17288, +54114=>17289, +54115=>17290, +54116=>17291, +54117=>17292, +54118=>17293, +54119=>17294, +54120=>17295, +54121=>17296, +54122=>17297, +54123=>17298, +54124=>17299, +54125=>17300, +54126=>17301, +54127=>17302, +54128=>17303, +54129=>17304, +54130=>17305, +54131=>17306, +54132=>17307, +54133=>17308, +54134=>17309, +54135=>17310, +54136=>17311, +54137=>17312, +54138=>17313, +54139=>17314, +54142=>17315, +54143=>17316, +54145=>17317, +54146=>17318, +54147=>17319, +54149=>17320, +54150=>17321, +54151=>17322, +54152=>17323, +54153=>17324, +54154=>17325, +54155=>17326, +54158=>17327, +54162=>17328, +54163=>17329, +54164=>17330, +54165=>17331, +54166=>17332, +54167=>17333, +54170=>17334, +54171=>17335, +54173=>17336, +54174=>17337, +54175=>17338, +54177=>17339, +54178=>17340, +54179=>17341, +54180=>17342, +54181=>17343, +54182=>17344, +54183=>17345, +54186=>17346, +54188=>17347, +54190=>17348, +54191=>17349, +54192=>17350, +54193=>17351, +54194=>17352, +54195=>17353, +54197=>17354, +54198=>17355, +54199=>17356, +54201=>17357, +54202=>17358, +54203=>17359, +54205=>17360, +54206=>17361, +54207=>17362, +54208=>17363, +54209=>17364, +54210=>17365, +54211=>17366, +54214=>17367, +54215=>17368, +54218=>17369, +54219=>17370, +54220=>17371, +54221=>17372, +54222=>17373, +54223=>17374, +54225=>17375, +54226=>17376, +54227=>17377, +54228=>17378, +54229=>17379, +54230=>17380, +54231=>17381, +54233=>17382, +54234=>17383, +54235=>17384, +54236=>17385, +54237=>17386, +54238=>17387, +54239=>17388, +54240=>17389, +54242=>17390, +54244=>17391, +54245=>17392, +54246=>17393, +54247=>17394, +54248=>17395, +54249=>17396, +54250=>17397, +54251=>17398, +54254=>17399, +54255=>17400, +54257=>17401, +54258=>17402, +54259=>17403, +54261=>17404, +54262=>17405, +54263=>17406, +54264=>17407, +54265=>17408, +54266=>17409, +54267=>17410, +54270=>17411, +54272=>17412, +54274=>17413, +54275=>17414, +54276=>17415, +54277=>17416, +54278=>17417, +54279=>17418, +54281=>17419, +54282=>17420, +54283=>17421, +54284=>17422, +54285=>17423, +54286=>17424, +54287=>17425, +54288=>17426, +54289=>17427, +54290=>17428, +54291=>17429, +54292=>17430, +54293=>17431, +54294=>17432, +54295=>17433, +54296=>17434, +54297=>17435, +54298=>17436, +54299=>17437, +54300=>17438, +54302=>17439, +54303=>17440, +54304=>17441, +54305=>17442, +54306=>17443, +54307=>17444, +54308=>17445, +54309=>17446, +54310=>17447, +54311=>17448, +54312=>17449, +54313=>17450, +54314=>17451, +54315=>17452, +54316=>17453, +54317=>17454, +54318=>17455, +54319=>17456, +54320=>17457, +54321=>17458, +54322=>17459, +54323=>17460, +54324=>17461, +54325=>17462, +54326=>17463, +54327=>17464, +54328=>17465, +54329=>17466, +54330=>17467, +54331=>17468, +54332=>17469, +54333=>17470, +54334=>17471, +54335=>17472, +54337=>17473, +54338=>17474, +54339=>17475, +54341=>17476, +54342=>17477, +54343=>17478, +54344=>17479, +54345=>17480, +54346=>17481, +54347=>17482, +54348=>17483, +54349=>17484, +54350=>17485, +54351=>17486, +54352=>17487, +54353=>17488, +54354=>17489, +54355=>17490, +54356=>17491, +54357=>17492, +54358=>17493, +54359=>17494, +54360=>17495, +54361=>17496, +54362=>17497, +54363=>17498, +54365=>17499, +54366=>17500, +54367=>17501, +54369=>17502, +54370=>17503, +54371=>17504, +54373=>17505, +54374=>17506, +54375=>17507, +54376=>17508, +54377=>17509, +54378=>17510, +54379=>17511, +54380=>17512, +54382=>17513, +54384=>17514, +54385=>17515, +54386=>17516, +54387=>17517, +54388=>17518, +54389=>17519, +54390=>17520, +54391=>17521, +54394=>17522, +54395=>17523, +54397=>17524, +54398=>17525, +54401=>17526, +54403=>17527, +54404=>17528, +54405=>17529, +54406=>17530, +54407=>17531, +54410=>17532, +54412=>17533, +54414=>17534, +54415=>17535, +54416=>17536, +54417=>17537, +54418=>17538, +54419=>17539, +54421=>17540, +54422=>17541, +54423=>17542, +54424=>17543, +54425=>17544, +54426=>17545, +54427=>17546, +54428=>17547, +54429=>17548, +54430=>17549, +54431=>17550, +54432=>17551, +54433=>17552, +54434=>17553, +54435=>17554, +54436=>17555, +54437=>17556, +54438=>17557, +54439=>17558, +54440=>17559, +54442=>17560, +54443=>17561, +54444=>17562, +54445=>17563, +54446=>17564, +54447=>17565, +54448=>17566, +54449=>17567, +54450=>17568, +54451=>17569, +54452=>17570, +54453=>17571, +54454=>17572, +54455=>17573, +54456=>17574, +54457=>17575, +54458=>17576, +54459=>17577, +54460=>17578, +54461=>17579, +54462=>17580, +54463=>17581, +54464=>17582, +54465=>17583, +54466=>17584, +54467=>17585, +54468=>17586, +54469=>17587, +54470=>17588, +54471=>17589, +54472=>17590, +54473=>17591, +54474=>17592, +54475=>17593, +54477=>17594, +54478=>17595, +54479=>17596, +54481=>17597, +54482=>17598, +54483=>17599, +54485=>17600, +54486=>17601, +54487=>17602, +54488=>17603, +54489=>17604, +54490=>17605, +54491=>17606, +54493=>17607, +54494=>17608, +54496=>17609, +54497=>17610, +54498=>17611, +54499=>17612, +54500=>17613, +54501=>17614, +54502=>17615, +54503=>17616, +54505=>17617, +54506=>17618, +54507=>17619, +54509=>17620, +54510=>17621, +54511=>17622, +54513=>17623, +54514=>17624, +54515=>17625, +54516=>17626, +54517=>17627, +54518=>17628, +54519=>17629, +54521=>17630, +54522=>17631, +54524=>17632, +54526=>17633, +54527=>17634, +54528=>17635, +54529=>17636, +54530=>17637, +54531=>17638, +54533=>17639, +54534=>17640, +54535=>17641, +54537=>17642, +54538=>17643, +54539=>17644, +54541=>17645, +54542=>17646, +54543=>17647, +54544=>17648, +54545=>17649, +54546=>17650, +54547=>17651, +54550=>17652, +54552=>17653, +54553=>17654, +54554=>17655, +54555=>17656, +54556=>17657, +54557=>17658, +54558=>17659, +54559=>17660, +54560=>17661, +54561=>17662, +54562=>17663, +54563=>17664, +54564=>17665, +54565=>17666, +54566=>17667, +54567=>17668, +54568=>17669, +54569=>17670, +54570=>17671, +54571=>17672, +54572=>17673, +54573=>17674, +54574=>17675, +54575=>17676, +54576=>17677, +54577=>17678, +54578=>17679, +54579=>17680, +54580=>17681, +54581=>17682, +54582=>17683, +54583=>17684, +54584=>17685, +54585=>17686, +54586=>17687, +54587=>17688, +54590=>17689, +54591=>17690, +54593=>17691, +54594=>17692, +54595=>17693, +54597=>17694, +54598=>17695, +54599=>17696, +54600=>17697, +54601=>17698, +54602=>17699, +54603=>17700, +54606=>17701, +54608=>17702, +54610=>17703, +54611=>17704, +54612=>17705, +54613=>17706, +54614=>17707, +54615=>17708, +54618=>17709, +54619=>17710, +54621=>17711, +54622=>17712, +54623=>17713, +54625=>17714, +54626=>17715, +54627=>17716, +54628=>17717, +54630=>17718, +54631=>17719, +54634=>17720, +54636=>17721, +54638=>17722, +54639=>17723, +54640=>17724, +54641=>17725, +54642=>17726, +54643=>17727, +54646=>17728, +54647=>17729, +54649=>17730, +54650=>17731, +54651=>17732, +54653=>17733, +54654=>17734, +54655=>17735, +54656=>17736, +54657=>17737, +54658=>17738, +54659=>17739, +54662=>17740, +54666=>17741, +54667=>17742, +54668=>17743, +54669=>17744, +54670=>17745, +54671=>17746, +54673=>17747, +54674=>17748, +54675=>17749, +54676=>17750, +54677=>17751, +54678=>17752, +54679=>17753, +54680=>17754, +54681=>17755, +54682=>17756, +54683=>17757, +54684=>17758, +54685=>17759, +54686=>17760, +54687=>17761, +54688=>17762, +54689=>17763, +54690=>17764, +54691=>17765, +54692=>17766, +54694=>17767, +54695=>17768, +54696=>17769, +54697=>17770, +54698=>17771, +54699=>17772, +54700=>17773, +54701=>17774, +54702=>17775, +54703=>17776, +54704=>17777, +54705=>17778, +54706=>17779, +54707=>17780, +54708=>17781, +54709=>17782, +54710=>17783, +54711=>17784, +54712=>17785, +54713=>17786, +54714=>17787, +54715=>17788, +54716=>17789, +54717=>17790, +54718=>17791, +54719=>17792, +54720=>17793, +54721=>17794, +54722=>17795, +54723=>17796, +54724=>17797, +54725=>17798, +54726=>17799, +54727=>17800, +54730=>17801, +54731=>17802, +54733=>17803, +54734=>17804, +54735=>17805, +54737=>17806, +54739=>17807, +54740=>17808, +54741=>17809, +54742=>17810, +54743=>17811, +54746=>17812, +54748=>17813, +54750=>17814, +54751=>17815, +54752=>17816, +54753=>17817, +54754=>17818, +54755=>17819, +54758=>17820, +54759=>17821, +54761=>17822, +54762=>17823, +54763=>17824, +54765=>17825, +54766=>17826, +54767=>17827, +54768=>17828, +54769=>17829, +54770=>17830, +54771=>17831, +54774=>17832, +54776=>17833, +54778=>17834, +54779=>17835, +54780=>17836, +54781=>17837, +54782=>17838, +54783=>17839, +54786=>17840, +54787=>17841, +54789=>17842, +54790=>17843, +54791=>17844, +54793=>17845, +54794=>17846, +54795=>17847, +54796=>17848, +54797=>17849, +54798=>17850, +54799=>17851, +54802=>17852, +54806=>17853, +54807=>17854, +54808=>17855, +54809=>17856, +54810=>17857, +54811=>17858, +54813=>17859, +54814=>17860, +54815=>17861, +54817=>17862, +54818=>17863, +54819=>17864, +54821=>17865, +54822=>17866, +54823=>17867, +54824=>17868, +54825=>17869, +54826=>17870, +54827=>17871, +54828=>17872, +54830=>17873, +54831=>17874, +54832=>17875, +54833=>17876, +54834=>17877, +54835=>17878, +54836=>17879, +54837=>17880, +54838=>17881, +54839=>17882, +54842=>17883, +54843=>17884, +54845=>17885, +54846=>17886, +54847=>17887, +54849=>17888, +54850=>17889, +54851=>17890, +54852=>17891, +54854=>17892, +54855=>17893, +54858=>17894, +54860=>17895, +54862=>17896, +54863=>17897, +54864=>17898, +54866=>17899, +54867=>17900, +54870=>17901, +54871=>17902, +54873=>17903, +54874=>17904, +54875=>17905, +54877=>17906, +54878=>17907, +54879=>17908, +54880=>17909, +54881=>17910, +54882=>17911, +54883=>17912, +54884=>17913, +54885=>17914, +54886=>17915, +54888=>17916, +54890=>17917, +54891=>17918, +54892=>17919, +54893=>17920, +54894=>17921, +54895=>17922, +54898=>17923, +54899=>17924, +54901=>17925, +54902=>17926, +54903=>17927, +54904=>17928, +54905=>17929, +54906=>17930, +54907=>17931, +54908=>17932, +54909=>17933, +54910=>17934, +54911=>17935, +54912=>17936, +54913=>17937, +54914=>17938, +54916=>17939, +54918=>17940, +54919=>17941, +54920=>17942, +54921=>17943, +54922=>17944, +54923=>17945, +54926=>17946, +54927=>17947, +54929=>17948, +54930=>17949, +54931=>17950, +54933=>17951, +54934=>17952, +54935=>17953, +54936=>17954, +54937=>17955, +54938=>17956, +54939=>17957, +54940=>17958, +54942=>17959, +54944=>17960, +54946=>17961, +54947=>17962, +54948=>17963, +54949=>17964, +54950=>17965, +54951=>17966, +54953=>17967, +54954=>17968, +54955=>17969, +54957=>17970, +54958=>17971, +54959=>17972, +54961=>17973, +54962=>17974, +54963=>17975, +54964=>17976, +54965=>17977, +54966=>17978, +54967=>17979, +54968=>17980, +54970=>17981, +54972=>17982, +54973=>17983, +54974=>17984, +54975=>17985, +54976=>17986, +54977=>17987, +54978=>17988, +54979=>17989, +54982=>17990, +54983=>17991, +54985=>17992, +54986=>17993, +54987=>17994, +54989=>17995, +54990=>17996, +54991=>17997, +54992=>17998, +54994=>17999, +54995=>18000, +54997=>18001, +54998=>18002, +55000=>18003, +55002=>18004, +55003=>18005, +55004=>18006, +55005=>18007, +55006=>18008, +55007=>18009, +55009=>18010, +55010=>18011, +55011=>18012, +55013=>18013, +55014=>18014, +55015=>18015, +55017=>18016, +55018=>18017, +55019=>18018, +55020=>18019, +55021=>18020, +55022=>18021, +55023=>18022, +55025=>18023, +55026=>18024, +55027=>18025, +55028=>18026, +55030=>18027, +55031=>18028, +55032=>18029, +55033=>18030, +55034=>18031, +55035=>18032, +55038=>18033, +55039=>18034, +55041=>18035, +55042=>18036, +55043=>18037, +55045=>18038, +55046=>18039, +55047=>18040, +55048=>18041, +55049=>18042, +55050=>18043, +55051=>18044, +55052=>18045, +55053=>18046, +55054=>18047, +55055=>18048, +55056=>18049, +55058=>18050, +55059=>18051, +55060=>18052, +55061=>18053, +55062=>18054, +55063=>18055, +55066=>18056, +55067=>18057, +55069=>18058, +55070=>18059, +55071=>18060, +55073=>18061, +55074=>18062, +55075=>18063, +55076=>18064, +55077=>18065, +55078=>18066, +55079=>18067, +55082=>18068, +55084=>18069, +55086=>18070, +55087=>18071, +55088=>18072, +55089=>18073, +55090=>18074, +55091=>18075, +55094=>18076, +55095=>18077, +55097=>18078, +55098=>18079, +55099=>18080, +55101=>18081, +55102=>18082, +55103=>18083, +55104=>18084, +55105=>18085, +55106=>18086, +55107=>18087, +55109=>18088, +55110=>18089, +55112=>18090, +55114=>18091, +55115=>18092, +55116=>18093, +55117=>18094, +55118=>18095, +55119=>18096, +55122=>18097, +55123=>18098, +55125=>18099, +55130=>18100, +55131=>18101, +55132=>18102, +55133=>18103, +55134=>18104, +55135=>18105, +55138=>18106, +55140=>18107, +55142=>18108, +55143=>18109, +55144=>18110, +55146=>18111, +55147=>18112, +55149=>18113, +55150=>18114, +55151=>18115, +55153=>18116, +55154=>18117, +55155=>18118, +55157=>18119, +55158=>18120, +55159=>18121, +55160=>18122, +55161=>18123, +55162=>18124, +55163=>18125, +55166=>18126, +55167=>18127, +55168=>18128, +55170=>18129, +55171=>18130, +55172=>18131, +55173=>18132, +55174=>18133, +55175=>18134, +55178=>18135, +55179=>18136, +55181=>18137, +55182=>18138, +55183=>18139, +55185=>18140, +55186=>18141, +55187=>18142, +55188=>18143, +55189=>18144, +55190=>18145, +55191=>18146, +55194=>18147, +55196=>18148, +55198=>18149, +55199=>18150, +55200=>18151, +55201=>18152, +55202=>18153, +55203=>18154, +); +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/README.TXT b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/README.TXT new file mode 100644 index 0000000..4b1f553 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/README.TXT @@ -0,0 +1,130 @@ +TCPDF Fonts + +TCPDF supports TrueTypeUnicode (UTF-8 Unicode), OpenTypeUnicode, TrueType, OpenType, Type1, CID-0 and Core (standard) fonts. + +There are two ways to use a new font: embedding it in the PDF or not. When a font is not embedded, it is searched in the system. The advantage is that the PDF file is lighter; on the other hand, if it is not available, a substitution font is used. So it is preferable to ensure that the needed font is installed on the client systems. If the file is to be viewed by a large audience, it is recommended to embed. + +The fonts that could be not embedded are only the standard core fonts and CID-0 fonts. + +The PDF Core (standard) fonts are: + + * courier : Courier + * courierb : Courier Bold + * courierbi : Courier Bold Italic + * courieri : Courier Italic + * helvetica : Helvetica + * helveticab : Helvetica Bold + * helveticabi : Helvetica Bold Italic + * helveticai : Helvetica Italic + * symbol : Symbol + * times : Times New Roman + * timesb : Times New Roman Bold + * timesbi : Times New Roman Bold Italic + * timesi : Times New Roman Italic + * zapfdingbats : Zapf Dingbats + +Setting up a font for usage with TCPDF requires the following steps: + + 1. Convert all font filenames to lowercase and rename using the following schema: + * [basic-font-name-in-lowercase].ttf for regular font + * [basic-font-name-in-lowercase]b.ttf for bold variation + * [basic-font-name-in-lowercase]i.ttf for oblique variation + * [basic-font-name-in-lowercase]bi.ttf for bold oblique variation + + 2. Generate the font's metrics file. + * For Type1 font files this first step is not necessary because the AFM file is usually shipped with the font. In case you have only a metric file in PFM format, use the pfm2afm utility (fonts/utils/pfm2afm) to get the AFM file. If you own a Type1 font in ASCII format (.pfa), you can convert it to binary format with Type 1 utilities. + * For TrueTypeUnicode or TrueType font files, use the the provided ttf2ufm utility (fonts/utils/ttf2ufm): + + $ ttf2ufm -a -F myfont.ttf + + * For OpenTypeUnicode or OpenType font files, use the the provided ttf2ufm utility (fonts/utils/ttf2ufm): + + $ ttf2ufm -a -F myfont.otf + + 3. Run makefont.php script. + * For TrueTypeUnicode: + + $ php -q makefont.php myfont.ttf myfont.ufm + + * For OpenTypeUnicode: + + $ php -q makefont.php myfont.otf myfont.ufm + + * For TrueType: + + $ php -q makefont.php myfont.ttf myfont.afm + + * For OpenType: + + $ php -q makefont.php myfont.otf myfont.afm + + * For Type1: + + $ php -q makefont.php myfont.pfb myfont.afm + + You may also specify additional parameters: + + MakeFont(string $fontfile, string $fmfile [, boolean $embedded [, $enc="cp1252" [, $patch=array()]]]) + + * $fontfile : Path to the .ttf or .pfb file. + * $fmfile : Path to the .afm file for Type1 and TrueType or .ufm for TrueTypeUnicode. + * $embedded : Set to false to not embed the font, true otherwise (default). + * $enc : Name of the encoding table to use. Default value: cp1252. Omit this parameter for TrueType Unicode, OpenType Unicode and symbolic fonts like Symbol or ZapfDingBats. The encoding defines the association between a code (from 0 to 255) and a character. The first 128 are fixed and correspond to ASCII. The encodings are stored in .map files. Those available are: + o cp1250 (Central Europe) + o cp1251 (Cyrillic) + o cp1252 (Western Europe) + o cp1253 (Greek) + o cp1254 (Turkish) + o cp1255 (Hebrew) + o cp1257 (Baltic) + o cp1258 (Vietnamese) + o cp874 (Thai) + o iso-8859-1 (Western Europe) + o iso-8859-2 (Central Europe) + o iso-8859-4 (Baltic) + o iso-8859-5 (Cyrillic) + o iso-8859-7 (Greek) + o iso-8859-9 (Turkish) + o iso-8859-11 (Thai) + o iso-8859-15 (Western Europe) + o iso-8859-16 (Central Europe) + o koi8-r (Russian) + o koi8-u (Ukrainian) + Of course, the font must contain the characters corresponding to the chosen encoding. The encodings which begin with cp are those used by Windows; Linux systems usually use ISO. + * $patch : Optional modification of the encoding. Empty by default. This parameter gives the possibility to alter the encoding. Sometimes you may want to add some characters. For instance, ISO-8859-1 does not contain the euro symbol. To add it at position 164, pass array(164=>'Euro'). + + 4. Edit and copy resulting files by case: + * For embedded fonts: copy the resulting .php, .z and .ctg.z (if available) files to the TCPDF fonts directory. + * For not-embedding the font, edit the .php file and comment the $file entry. + * For CID-0 fonts (not embeddeed) you have to edit the .php file: + o change the font type to: $type='cidfont0'; + o set the default font width by adding the line: $dw=1000; + o remove the $enc, $file and $ctg variables definitions + o add one of the following blocks of text at the end of the file (depends by the language you are using - see the arialunicid0.php file for a working example): + + // Chinese Simplified + $enc='UniCNS-UTF16-H'; + $cidinfo=array('Registry'=>'Adobe', 'Ordering'=>'CNS1','Supplement'=>0); + include(dirname(__FILE__).'/uni2cid_ac16.php'); + + + // Chinese Traditional + $enc='UniGB-UTF16-H'; + $cidinfo=array('Registry'=>'Adobe', 'Ordering'=>'GB1','Supplement'=>2); + include(dirname(__FILE__).'/uni2cid_ag15.php'); + + + // Korean + $enc='UniKS-UTF16-H'; + $cidinfo=array('Registry'=>'Adobe', 'Ordering'=>'Korea1','Supplement'=>0); + include(dirname(__FILE__).'/uni2cid_ak12.php'); + + + // Japanese + $enc='UniJIS-UTF16-H'; + $cidinfo=array('Registry'=>'Adobe', 'Ordering'=>'Japan1','Supplement'=>5); + include(dirname(__FILE__).'/uni2cid_aj16.php'); + + o copy the .php file to the TCPDF fonts directory. + 5. Rename php font files variations using the following schema: + * [basic-font-name-in-lowercase].php for regular font + * [basic-font-name-in-lowercase]b.php for bold variation + * [basic-font-name-in-lowercase]i.php for oblique variation + * [basic-font-name-in-lowercase]bi.php for bold oblique variation + diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1250.map b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1250.map new file mode 100644 index 0000000..ec110af --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1250.map @@ -0,0 +1,251 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!89 U+2030 perthousand +!8A U+0160 Scaron +!8B U+2039 guilsinglleft +!8C U+015A Sacute +!8D U+0164 Tcaron +!8E U+017D Zcaron +!8F U+0179 Zacute +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9A U+0161 scaron +!9B U+203A guilsinglright +!9C U+015B sacute +!9D U+0165 tcaron +!9E U+017E zcaron +!9F U+017A zacute +!A0 U+00A0 space +!A1 U+02C7 caron +!A2 U+02D8 breve +!A3 U+0141 Lslash +!A4 U+00A4 currency +!A5 U+0104 Aogonek +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+015E Scedilla +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+017B Zdotaccent +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+02DB ogonek +!B3 U+0142 lslash +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+0105 aogonek +!BA U+015F scedilla +!BB U+00BB guillemotright +!BC U+013D Lcaron +!BD U+02DD hungarumlaut +!BE U+013E lcaron +!BF U+017C zdotaccent +!C0 U+0154 Racute +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+0139 Lacute +!C6 U+0106 Cacute +!C7 U+00C7 Ccedilla +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0118 Eogonek +!CB U+00CB Edieresis +!CC U+011A Ecaron +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+010E Dcaron +!D0 U+0110 Dcroat +!D1 U+0143 Nacute +!D2 U+0147 Ncaron +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+0150 Ohungarumlaut +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+0158 Rcaron +!D9 U+016E Uring +!DA U+00DA Uacute +!DB U+0170 Uhungarumlaut +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+0162 Tcommaaccent +!DF U+00DF germandbls +!E0 U+0155 racute +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+013A lacute +!E6 U+0107 cacute +!E7 U+00E7 ccedilla +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+0119 eogonek +!EB U+00EB edieresis +!EC U+011B ecaron +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+010F dcaron +!F0 U+0111 dcroat +!F1 U+0144 nacute +!F2 U+0148 ncaron +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+0151 ohungarumlaut +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+0159 rcaron +!F9 U+016F uring +!FA U+00FA uacute +!FB U+0171 uhungarumlaut +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+0163 tcommaaccent +!FF U+02D9 dotaccent diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1251.map b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1251.map new file mode 100644 index 0000000..de6a198 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1251.map @@ -0,0 +1,255 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0402 afii10051 +!81 U+0403 afii10052 +!82 U+201A quotesinglbase +!83 U+0453 afii10100 +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+20AC Euro +!89 U+2030 perthousand +!8A U+0409 afii10058 +!8B U+2039 guilsinglleft +!8C U+040A afii10059 +!8D U+040C afii10061 +!8E U+040B afii10060 +!8F U+040F afii10145 +!90 U+0452 afii10099 +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9A U+0459 afii10106 +!9B U+203A guilsinglright +!9C U+045A afii10107 +!9D U+045C afii10109 +!9E U+045B afii10108 +!9F U+045F afii10193 +!A0 U+00A0 space +!A1 U+040E afii10062 +!A2 U+045E afii10110 +!A3 U+0408 afii10057 +!A4 U+00A4 currency +!A5 U+0490 afii10050 +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+0401 afii10023 +!A9 U+00A9 copyright +!AA U+0404 afii10053 +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+0407 afii10056 +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+0406 afii10055 +!B3 U+0456 afii10103 +!B4 U+0491 afii10098 +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+0451 afii10071 +!B9 U+2116 afii61352 +!BA U+0454 afii10101 +!BB U+00BB guillemotright +!BC U+0458 afii10105 +!BD U+0405 afii10054 +!BE U+0455 afii10102 +!BF U+0457 afii10104 +!C0 U+0410 afii10017 +!C1 U+0411 afii10018 +!C2 U+0412 afii10019 +!C3 U+0413 afii10020 +!C4 U+0414 afii10021 +!C5 U+0415 afii10022 +!C6 U+0416 afii10024 +!C7 U+0417 afii10025 +!C8 U+0418 afii10026 +!C9 U+0419 afii10027 +!CA U+041A afii10028 +!CB U+041B afii10029 +!CC U+041C afii10030 +!CD U+041D afii10031 +!CE U+041E afii10032 +!CF U+041F afii10033 +!D0 U+0420 afii10034 +!D1 U+0421 afii10035 +!D2 U+0422 afii10036 +!D3 U+0423 afii10037 +!D4 U+0424 afii10038 +!D5 U+0425 afii10039 +!D6 U+0426 afii10040 +!D7 U+0427 afii10041 +!D8 U+0428 afii10042 +!D9 U+0429 afii10043 +!DA U+042A afii10044 +!DB U+042B afii10045 +!DC U+042C afii10046 +!DD U+042D afii10047 +!DE U+042E afii10048 +!DF U+042F afii10049 +!E0 U+0430 afii10065 +!E1 U+0431 afii10066 +!E2 U+0432 afii10067 +!E3 U+0433 afii10068 +!E4 U+0434 afii10069 +!E5 U+0435 afii10070 +!E6 U+0436 afii10072 +!E7 U+0437 afii10073 +!E8 U+0438 afii10074 +!E9 U+0439 afii10075 +!EA U+043A afii10076 +!EB U+043B afii10077 +!EC U+043C afii10078 +!ED U+043D afii10079 +!EE U+043E afii10080 +!EF U+043F afii10081 +!F0 U+0440 afii10082 +!F1 U+0441 afii10083 +!F2 U+0442 afii10084 +!F3 U+0443 afii10085 +!F4 U+0444 afii10086 +!F5 U+0445 afii10087 +!F6 U+0446 afii10088 +!F7 U+0447 afii10089 +!F8 U+0448 afii10090 +!F9 U+0449 afii10091 +!FA U+044A afii10092 +!FB U+044B afii10093 +!FC U+044C afii10094 +!FD U+044D afii10095 +!FE U+044E afii10096 +!FF U+044F afii10097 diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1252.map b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1252.map new file mode 100644 index 0000000..dd490e5 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1252.map @@ -0,0 +1,251 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8A U+0160 Scaron +!8B U+2039 guilsinglleft +!8C U+0152 OE +!8E U+017D Zcaron +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9A U+0161 scaron +!9B U+203A guilsinglright +!9C U+0153 oe +!9E U+017E zcaron +!9F U+0178 Ydieresis +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+00D0 Eth +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+00DE Thorn +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+00F0 eth +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+00FE thorn +!FF U+00FF ydieresis diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1253.map b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1253.map new file mode 100644 index 0000000..4bd826f --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1253.map @@ -0,0 +1,239 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9B U+203A guilsinglright +!A0 U+00A0 space +!A1 U+0385 dieresistonos +!A2 U+0386 Alphatonos +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+2015 afii00208 +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+0384 tonos +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+0388 Epsilontonos +!B9 U+0389 Etatonos +!BA U+038A Iotatonos +!BB U+00BB guillemotright +!BC U+038C Omicrontonos +!BD U+00BD onehalf +!BE U+038E Upsilontonos +!BF U+038F Omegatonos +!C0 U+0390 iotadieresistonos +!C1 U+0391 Alpha +!C2 U+0392 Beta +!C3 U+0393 Gamma +!C4 U+0394 Delta +!C5 U+0395 Epsilon +!C6 U+0396 Zeta +!C7 U+0397 Eta +!C8 U+0398 Theta +!C9 U+0399 Iota +!CA U+039A Kappa +!CB U+039B Lambda +!CC U+039C Mu +!CD U+039D Nu +!CE U+039E Xi +!CF U+039F Omicron +!D0 U+03A0 Pi +!D1 U+03A1 Rho +!D3 U+03A3 Sigma +!D4 U+03A4 Tau +!D5 U+03A5 Upsilon +!D6 U+03A6 Phi +!D7 U+03A7 Chi +!D8 U+03A8 Psi +!D9 U+03A9 Omega +!DA U+03AA Iotadieresis +!DB U+03AB Upsilondieresis +!DC U+03AC alphatonos +!DD U+03AD epsilontonos +!DE U+03AE etatonos +!DF U+03AF iotatonos +!E0 U+03B0 upsilondieresistonos +!E1 U+03B1 alpha +!E2 U+03B2 beta +!E3 U+03B3 gamma +!E4 U+03B4 delta +!E5 U+03B5 epsilon +!E6 U+03B6 zeta +!E7 U+03B7 eta +!E8 U+03B8 theta +!E9 U+03B9 iota +!EA U+03BA kappa +!EB U+03BB lambda +!EC U+03BC mu +!ED U+03BD nu +!EE U+03BE xi +!EF U+03BF omicron +!F0 U+03C0 pi +!F1 U+03C1 rho +!F2 U+03C2 sigma1 +!F3 U+03C3 sigma +!F4 U+03C4 tau +!F5 U+03C5 upsilon +!F6 U+03C6 phi +!F7 U+03C7 chi +!F8 U+03C8 psi +!F9 U+03C9 omega +!FA U+03CA iotadieresis +!FB U+03CB upsilondieresis +!FC U+03CC omicrontonos +!FD U+03CD upsilontonos +!FE U+03CE omegatonos diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1254.map b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1254.map new file mode 100644 index 0000000..829473b --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1254.map @@ -0,0 +1,249 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8A U+0160 Scaron +!8B U+2039 guilsinglleft +!8C U+0152 OE +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9A U+0161 scaron +!9B U+203A guilsinglright +!9C U+0153 oe +!9F U+0178 Ydieresis +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+011E Gbreve +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0130 Idotaccent +!DE U+015E Scedilla +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+011F gbreve +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0131 dotlessi +!FE U+015F scedilla +!FF U+00FF ydieresis diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1255.map b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1255.map new file mode 100644 index 0000000..079e10c --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1255.map @@ -0,0 +1,233 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9B U+203A guilsinglright +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+20AA afii57636 +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00D7 multiply +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD sfthyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 middot +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00F7 divide +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+05B0 afii57799 +!C1 U+05B1 afii57801 +!C2 U+05B2 afii57800 +!C3 U+05B3 afii57802 +!C4 U+05B4 afii57793 +!C5 U+05B5 afii57794 +!C6 U+05B6 afii57795 +!C7 U+05B7 afii57798 +!C8 U+05B8 afii57797 +!C9 U+05B9 afii57806 +!CB U+05BB afii57796 +!CC U+05BC afii57807 +!CD U+05BD afii57839 +!CE U+05BE afii57645 +!CF U+05BF afii57841 +!D0 U+05C0 afii57842 +!D1 U+05C1 afii57804 +!D2 U+05C2 afii57803 +!D3 U+05C3 afii57658 +!D4 U+05F0 afii57716 +!D5 U+05F1 afii57717 +!D6 U+05F2 afii57718 +!D7 U+05F3 gereshhebrew +!D8 U+05F4 gershayimhebrew +!E0 U+05D0 afii57664 +!E1 U+05D1 afii57665 +!E2 U+05D2 afii57666 +!E3 U+05D3 afii57667 +!E4 U+05D4 afii57668 +!E5 U+05D5 afii57669 +!E6 U+05D6 afii57670 +!E7 U+05D7 afii57671 +!E8 U+05D8 afii57672 +!E9 U+05D9 afii57673 +!EA U+05DA afii57674 +!EB U+05DB afii57675 +!EC U+05DC afii57676 +!ED U+05DD afii57677 +!EE U+05DE afii57678 +!EF U+05DF afii57679 +!F0 U+05E0 afii57680 +!F1 U+05E1 afii57681 +!F2 U+05E2 afii57682 +!F3 U+05E3 afii57683 +!F4 U+05E4 afii57684 +!F5 U+05E5 afii57685 +!F6 U+05E6 afii57686 +!F7 U+05E7 afii57687 +!F8 U+05E8 afii57688 +!F9 U+05E9 afii57689 +!FA U+05EA afii57690 +!FD U+200E afii299 +!FE U+200F afii300 diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1257.map b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1257.map new file mode 100644 index 0000000..2f2ecfa --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1257.map @@ -0,0 +1,244 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!8D U+00A8 dieresis +!8E U+02C7 caron +!8F U+00B8 cedilla +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!99 U+2122 trademark +!9B U+203A guilsinglright +!9D U+00AF macron +!9E U+02DB ogonek +!A0 U+00A0 space +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00D8 Oslash +!A9 U+00A9 copyright +!AA U+0156 Rcommaaccent +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00C6 AE +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00F8 oslash +!B9 U+00B9 onesuperior +!BA U+0157 rcommaaccent +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00E6 ae +!C0 U+0104 Aogonek +!C1 U+012E Iogonek +!C2 U+0100 Amacron +!C3 U+0106 Cacute +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+0118 Eogonek +!C7 U+0112 Emacron +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0179 Zacute +!CB U+0116 Edotaccent +!CC U+0122 Gcommaaccent +!CD U+0136 Kcommaaccent +!CE U+012A Imacron +!CF U+013B Lcommaaccent +!D0 U+0160 Scaron +!D1 U+0143 Nacute +!D2 U+0145 Ncommaaccent +!D3 U+00D3 Oacute +!D4 U+014C Omacron +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+0172 Uogonek +!D9 U+0141 Lslash +!DA U+015A Sacute +!DB U+016A Umacron +!DC U+00DC Udieresis +!DD U+017B Zdotaccent +!DE U+017D Zcaron +!DF U+00DF germandbls +!E0 U+0105 aogonek +!E1 U+012F iogonek +!E2 U+0101 amacron +!E3 U+0107 cacute +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+0119 eogonek +!E7 U+0113 emacron +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+017A zacute +!EB U+0117 edotaccent +!EC U+0123 gcommaaccent +!ED U+0137 kcommaaccent +!EE U+012B imacron +!EF U+013C lcommaaccent +!F0 U+0161 scaron +!F1 U+0144 nacute +!F2 U+0146 ncommaaccent +!F3 U+00F3 oacute +!F4 U+014D omacron +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+0173 uogonek +!F9 U+0142 lslash +!FA U+015B sacute +!FB U+016B umacron +!FC U+00FC udieresis +!FD U+017C zdotaccent +!FE U+017E zcaron +!FF U+02D9 dotaccent diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1258.map b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1258.map new file mode 100644 index 0000000..fed915f --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp1258.map @@ -0,0 +1,247 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!82 U+201A quotesinglbase +!83 U+0192 florin +!84 U+201E quotedblbase +!85 U+2026 ellipsis +!86 U+2020 dagger +!87 U+2021 daggerdbl +!88 U+02C6 circumflex +!89 U+2030 perthousand +!8B U+2039 guilsinglleft +!8C U+0152 OE +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!98 U+02DC tilde +!99 U+2122 trademark +!9B U+203A guilsinglright +!9C U+0153 oe +!9F U+0178 Ydieresis +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+0300 gravecomb +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+0110 Dcroat +!D1 U+00D1 Ntilde +!D2 U+0309 hookabovecomb +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+01A0 Ohorn +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+01AF Uhorn +!DE U+0303 tildecomb +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+0301 acutecomb +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+0111 dcroat +!F1 U+00F1 ntilde +!F2 U+0323 dotbelowcomb +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+01A1 ohorn +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+01B0 uhorn +!FE U+20AB dong +!FF U+00FF ydieresis diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp874.map b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp874.map new file mode 100644 index 0000000..1006e6b --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/cp874.map @@ -0,0 +1,225 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+20AC Euro +!85 U+2026 ellipsis +!91 U+2018 quoteleft +!92 U+2019 quoteright +!93 U+201C quotedblleft +!94 U+201D quotedblright +!95 U+2022 bullet +!96 U+2013 endash +!97 U+2014 emdash +!A0 U+00A0 space +!A1 U+0E01 kokaithai +!A2 U+0E02 khokhaithai +!A3 U+0E03 khokhuatthai +!A4 U+0E04 khokhwaithai +!A5 U+0E05 khokhonthai +!A6 U+0E06 khorakhangthai +!A7 U+0E07 ngonguthai +!A8 U+0E08 chochanthai +!A9 U+0E09 chochingthai +!AA U+0E0A chochangthai +!AB U+0E0B sosothai +!AC U+0E0C chochoethai +!AD U+0E0D yoyingthai +!AE U+0E0E dochadathai +!AF U+0E0F topatakthai +!B0 U+0E10 thothanthai +!B1 U+0E11 thonangmonthothai +!B2 U+0E12 thophuthaothai +!B3 U+0E13 nonenthai +!B4 U+0E14 dodekthai +!B5 U+0E15 totaothai +!B6 U+0E16 thothungthai +!B7 U+0E17 thothahanthai +!B8 U+0E18 thothongthai +!B9 U+0E19 nonuthai +!BA U+0E1A bobaimaithai +!BB U+0E1B poplathai +!BC U+0E1C phophungthai +!BD U+0E1D fofathai +!BE U+0E1E phophanthai +!BF U+0E1F fofanthai +!C0 U+0E20 phosamphaothai +!C1 U+0E21 momathai +!C2 U+0E22 yoyakthai +!C3 U+0E23 roruathai +!C4 U+0E24 ruthai +!C5 U+0E25 lolingthai +!C6 U+0E26 luthai +!C7 U+0E27 wowaenthai +!C8 U+0E28 sosalathai +!C9 U+0E29 sorusithai +!CA U+0E2A sosuathai +!CB U+0E2B hohipthai +!CC U+0E2C lochulathai +!CD U+0E2D oangthai +!CE U+0E2E honokhukthai +!CF U+0E2F paiyannoithai +!D0 U+0E30 saraathai +!D1 U+0E31 maihanakatthai +!D2 U+0E32 saraaathai +!D3 U+0E33 saraamthai +!D4 U+0E34 saraithai +!D5 U+0E35 saraiithai +!D6 U+0E36 sarauethai +!D7 U+0E37 saraueethai +!D8 U+0E38 sarauthai +!D9 U+0E39 sarauuthai +!DA U+0E3A phinthuthai +!DF U+0E3F bahtthai +!E0 U+0E40 saraethai +!E1 U+0E41 saraaethai +!E2 U+0E42 saraothai +!E3 U+0E43 saraaimaimuanthai +!E4 U+0E44 saraaimaimalaithai +!E5 U+0E45 lakkhangyaothai +!E6 U+0E46 maiyamokthai +!E7 U+0E47 maitaikhuthai +!E8 U+0E48 maiekthai +!E9 U+0E49 maithothai +!EA U+0E4A maitrithai +!EB U+0E4B maichattawathai +!EC U+0E4C thanthakhatthai +!ED U+0E4D nikhahitthai +!EE U+0E4E yamakkanthai +!EF U+0E4F fongmanthai +!F0 U+0E50 zerothai +!F1 U+0E51 onethai +!F2 U+0E52 twothai +!F3 U+0E53 threethai +!F4 U+0E54 fourthai +!F5 U+0E55 fivethai +!F6 U+0E56 sixthai +!F7 U+0E57 seventhai +!F8 U+0E58 eightthai +!F9 U+0E59 ninethai +!FA U+0E5A angkhankhuthai +!FB U+0E5B khomutthai diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-1.map b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-1.map new file mode 100644 index 0000000..61740a3 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-1.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+00D0 Eth +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+00DE Thorn +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+00F0 eth +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+00FE thorn +!FF U+00FF ydieresis diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-11.map b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-11.map new file mode 100644 index 0000000..9168812 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-11.map @@ -0,0 +1,248 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0E01 kokaithai +!A2 U+0E02 khokhaithai +!A3 U+0E03 khokhuatthai +!A4 U+0E04 khokhwaithai +!A5 U+0E05 khokhonthai +!A6 U+0E06 khorakhangthai +!A7 U+0E07 ngonguthai +!A8 U+0E08 chochanthai +!A9 U+0E09 chochingthai +!AA U+0E0A chochangthai +!AB U+0E0B sosothai +!AC U+0E0C chochoethai +!AD U+0E0D yoyingthai +!AE U+0E0E dochadathai +!AF U+0E0F topatakthai +!B0 U+0E10 thothanthai +!B1 U+0E11 thonangmonthothai +!B2 U+0E12 thophuthaothai +!B3 U+0E13 nonenthai +!B4 U+0E14 dodekthai +!B5 U+0E15 totaothai +!B6 U+0E16 thothungthai +!B7 U+0E17 thothahanthai +!B8 U+0E18 thothongthai +!B9 U+0E19 nonuthai +!BA U+0E1A bobaimaithai +!BB U+0E1B poplathai +!BC U+0E1C phophungthai +!BD U+0E1D fofathai +!BE U+0E1E phophanthai +!BF U+0E1F fofanthai +!C0 U+0E20 phosamphaothai +!C1 U+0E21 momathai +!C2 U+0E22 yoyakthai +!C3 U+0E23 roruathai +!C4 U+0E24 ruthai +!C5 U+0E25 lolingthai +!C6 U+0E26 luthai +!C7 U+0E27 wowaenthai +!C8 U+0E28 sosalathai +!C9 U+0E29 sorusithai +!CA U+0E2A sosuathai +!CB U+0E2B hohipthai +!CC U+0E2C lochulathai +!CD U+0E2D oangthai +!CE U+0E2E honokhukthai +!CF U+0E2F paiyannoithai +!D0 U+0E30 saraathai +!D1 U+0E31 maihanakatthai +!D2 U+0E32 saraaathai +!D3 U+0E33 saraamthai +!D4 U+0E34 saraithai +!D5 U+0E35 saraiithai +!D6 U+0E36 sarauethai +!D7 U+0E37 saraueethai +!D8 U+0E38 sarauthai +!D9 U+0E39 sarauuthai +!DA U+0E3A phinthuthai +!DF U+0E3F bahtthai +!E0 U+0E40 saraethai +!E1 U+0E41 saraaethai +!E2 U+0E42 saraothai +!E3 U+0E43 saraaimaimuanthai +!E4 U+0E44 saraaimaimalaithai +!E5 U+0E45 lakkhangyaothai +!E6 U+0E46 maiyamokthai +!E7 U+0E47 maitaikhuthai +!E8 U+0E48 maiekthai +!E9 U+0E49 maithothai +!EA U+0E4A maitrithai +!EB U+0E4B maichattawathai +!EC U+0E4C thanthakhatthai +!ED U+0E4D nikhahitthai +!EE U+0E4E yamakkanthai +!EF U+0E4F fongmanthai +!F0 U+0E50 zerothai +!F1 U+0E51 onethai +!F2 U+0E52 twothai +!F3 U+0E53 threethai +!F4 U+0E54 fourthai +!F5 U+0E55 fivethai +!F6 U+0E56 sixthai +!F7 U+0E57 seventhai +!F8 U+0E58 eightthai +!F9 U+0E59 ninethai +!FA U+0E5A angkhankhuthai +!FB U+0E5B khomutthai diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-15.map b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-15.map new file mode 100644 index 0000000..6c2b571 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-15.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+20AC Euro +!A5 U+00A5 yen +!A6 U+0160 Scaron +!A7 U+00A7 section +!A8 U+0161 scaron +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+017D Zcaron +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+017E zcaron +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+0152 OE +!BD U+0153 oe +!BE U+0178 Ydieresis +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+00D0 Eth +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+00DE Thorn +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+00F0 eth +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+00FE thorn +!FF U+00FF ydieresis diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-16.map b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-16.map new file mode 100644 index 0000000..202c8fe --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-16.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0104 Aogonek +!A2 U+0105 aogonek +!A3 U+0141 Lslash +!A4 U+20AC Euro +!A5 U+201E quotedblbase +!A6 U+0160 Scaron +!A7 U+00A7 section +!A8 U+0161 scaron +!A9 U+00A9 copyright +!AA U+0218 Scommaaccent +!AB U+00AB guillemotleft +!AC U+0179 Zacute +!AD U+00AD hyphen +!AE U+017A zacute +!AF U+017B Zdotaccent +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+010C Ccaron +!B3 U+0142 lslash +!B4 U+017D Zcaron +!B5 U+201D quotedblright +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+017E zcaron +!B9 U+010D ccaron +!BA U+0219 scommaaccent +!BB U+00BB guillemotright +!BC U+0152 OE +!BD U+0153 oe +!BE U+0178 Ydieresis +!BF U+017C zdotaccent +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+0106 Cacute +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+0110 Dcroat +!D1 U+0143 Nacute +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+0150 Ohungarumlaut +!D6 U+00D6 Odieresis +!D7 U+015A Sacute +!D8 U+0170 Uhungarumlaut +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0118 Eogonek +!DE U+021A Tcommaaccent +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+0107 cacute +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+0111 dcroat +!F1 U+0144 nacute +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+0151 ohungarumlaut +!F6 U+00F6 odieresis +!F7 U+015B sacute +!F8 U+0171 uhungarumlaut +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0119 eogonek +!FE U+021B tcommaaccent +!FF U+00FF ydieresis diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-2.map b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-2.map new file mode 100644 index 0000000..65ae09f --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-2.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0104 Aogonek +!A2 U+02D8 breve +!A3 U+0141 Lslash +!A4 U+00A4 currency +!A5 U+013D Lcaron +!A6 U+015A Sacute +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+0160 Scaron +!AA U+015E Scedilla +!AB U+0164 Tcaron +!AC U+0179 Zacute +!AD U+00AD hyphen +!AE U+017D Zcaron +!AF U+017B Zdotaccent +!B0 U+00B0 degree +!B1 U+0105 aogonek +!B2 U+02DB ogonek +!B3 U+0142 lslash +!B4 U+00B4 acute +!B5 U+013E lcaron +!B6 U+015B sacute +!B7 U+02C7 caron +!B8 U+00B8 cedilla +!B9 U+0161 scaron +!BA U+015F scedilla +!BB U+0165 tcaron +!BC U+017A zacute +!BD U+02DD hungarumlaut +!BE U+017E zcaron +!BF U+017C zdotaccent +!C0 U+0154 Racute +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+0102 Abreve +!C4 U+00C4 Adieresis +!C5 U+0139 Lacute +!C6 U+0106 Cacute +!C7 U+00C7 Ccedilla +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0118 Eogonek +!CB U+00CB Edieresis +!CC U+011A Ecaron +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+010E Dcaron +!D0 U+0110 Dcroat +!D1 U+0143 Nacute +!D2 U+0147 Ncaron +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+0150 Ohungarumlaut +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+0158 Rcaron +!D9 U+016E Uring +!DA U+00DA Uacute +!DB U+0170 Uhungarumlaut +!DC U+00DC Udieresis +!DD U+00DD Yacute +!DE U+0162 Tcommaaccent +!DF U+00DF germandbls +!E0 U+0155 racute +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+0103 abreve +!E4 U+00E4 adieresis +!E5 U+013A lacute +!E6 U+0107 cacute +!E7 U+00E7 ccedilla +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+0119 eogonek +!EB U+00EB edieresis +!EC U+011B ecaron +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+010F dcaron +!F0 U+0111 dcroat +!F1 U+0144 nacute +!F2 U+0148 ncaron +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+0151 ohungarumlaut +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+0159 rcaron +!F9 U+016F uring +!FA U+00FA uacute +!FB U+0171 uhungarumlaut +!FC U+00FC udieresis +!FD U+00FD yacute +!FE U+0163 tcommaaccent +!FF U+02D9 dotaccent diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-4.map b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-4.map new file mode 100644 index 0000000..a7d87bf --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-4.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0104 Aogonek +!A2 U+0138 kgreenlandic +!A3 U+0156 Rcommaaccent +!A4 U+00A4 currency +!A5 U+0128 Itilde +!A6 U+013B Lcommaaccent +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+0160 Scaron +!AA U+0112 Emacron +!AB U+0122 Gcommaaccent +!AC U+0166 Tbar +!AD U+00AD hyphen +!AE U+017D Zcaron +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+0105 aogonek +!B2 U+02DB ogonek +!B3 U+0157 rcommaaccent +!B4 U+00B4 acute +!B5 U+0129 itilde +!B6 U+013C lcommaaccent +!B7 U+02C7 caron +!B8 U+00B8 cedilla +!B9 U+0161 scaron +!BA U+0113 emacron +!BB U+0123 gcommaaccent +!BC U+0167 tbar +!BD U+014A Eng +!BE U+017E zcaron +!BF U+014B eng +!C0 U+0100 Amacron +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+012E Iogonek +!C8 U+010C Ccaron +!C9 U+00C9 Eacute +!CA U+0118 Eogonek +!CB U+00CB Edieresis +!CC U+0116 Edotaccent +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+012A Imacron +!D0 U+0110 Dcroat +!D1 U+0145 Ncommaaccent +!D2 U+014C Omacron +!D3 U+0136 Kcommaaccent +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+0172 Uogonek +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0168 Utilde +!DE U+016A Umacron +!DF U+00DF germandbls +!E0 U+0101 amacron +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+012F iogonek +!E8 U+010D ccaron +!E9 U+00E9 eacute +!EA U+0119 eogonek +!EB U+00EB edieresis +!EC U+0117 edotaccent +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+012B imacron +!F0 U+0111 dcroat +!F1 U+0146 ncommaaccent +!F2 U+014D omacron +!F3 U+0137 kcommaaccent +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+0173 uogonek +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0169 utilde +!FE U+016B umacron +!FF U+02D9 dotaccent diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-5.map b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-5.map new file mode 100644 index 0000000..f9cd4ed --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-5.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+0401 afii10023 +!A2 U+0402 afii10051 +!A3 U+0403 afii10052 +!A4 U+0404 afii10053 +!A5 U+0405 afii10054 +!A6 U+0406 afii10055 +!A7 U+0407 afii10056 +!A8 U+0408 afii10057 +!A9 U+0409 afii10058 +!AA U+040A afii10059 +!AB U+040B afii10060 +!AC U+040C afii10061 +!AD U+00AD hyphen +!AE U+040E afii10062 +!AF U+040F afii10145 +!B0 U+0410 afii10017 +!B1 U+0411 afii10018 +!B2 U+0412 afii10019 +!B3 U+0413 afii10020 +!B4 U+0414 afii10021 +!B5 U+0415 afii10022 +!B6 U+0416 afii10024 +!B7 U+0417 afii10025 +!B8 U+0418 afii10026 +!B9 U+0419 afii10027 +!BA U+041A afii10028 +!BB U+041B afii10029 +!BC U+041C afii10030 +!BD U+041D afii10031 +!BE U+041E afii10032 +!BF U+041F afii10033 +!C0 U+0420 afii10034 +!C1 U+0421 afii10035 +!C2 U+0422 afii10036 +!C3 U+0423 afii10037 +!C4 U+0424 afii10038 +!C5 U+0425 afii10039 +!C6 U+0426 afii10040 +!C7 U+0427 afii10041 +!C8 U+0428 afii10042 +!C9 U+0429 afii10043 +!CA U+042A afii10044 +!CB U+042B afii10045 +!CC U+042C afii10046 +!CD U+042D afii10047 +!CE U+042E afii10048 +!CF U+042F afii10049 +!D0 U+0430 afii10065 +!D1 U+0431 afii10066 +!D2 U+0432 afii10067 +!D3 U+0433 afii10068 +!D4 U+0434 afii10069 +!D5 U+0435 afii10070 +!D6 U+0436 afii10072 +!D7 U+0437 afii10073 +!D8 U+0438 afii10074 +!D9 U+0439 afii10075 +!DA U+043A afii10076 +!DB U+043B afii10077 +!DC U+043C afii10078 +!DD U+043D afii10079 +!DE U+043E afii10080 +!DF U+043F afii10081 +!E0 U+0440 afii10082 +!E1 U+0441 afii10083 +!E2 U+0442 afii10084 +!E3 U+0443 afii10085 +!E4 U+0444 afii10086 +!E5 U+0445 afii10087 +!E6 U+0446 afii10088 +!E7 U+0447 afii10089 +!E8 U+0448 afii10090 +!E9 U+0449 afii10091 +!EA U+044A afii10092 +!EB U+044B afii10093 +!EC U+044C afii10094 +!ED U+044D afii10095 +!EE U+044E afii10096 +!EF U+044F afii10097 +!F0 U+2116 afii61352 +!F1 U+0451 afii10071 +!F2 U+0452 afii10099 +!F3 U+0453 afii10100 +!F4 U+0454 afii10101 +!F5 U+0455 afii10102 +!F6 U+0456 afii10103 +!F7 U+0457 afii10104 +!F8 U+0458 afii10105 +!F9 U+0459 afii10106 +!FA U+045A afii10107 +!FB U+045B afii10108 +!FC U+045C afii10109 +!FD U+00A7 section +!FE U+045E afii10110 +!FF U+045F afii10193 diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-7.map b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-7.map new file mode 100644 index 0000000..e163796 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-7.map @@ -0,0 +1,250 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+2018 quoteleft +!A2 U+2019 quoteright +!A3 U+00A3 sterling +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AF U+2015 afii00208 +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+0384 tonos +!B5 U+0385 dieresistonos +!B6 U+0386 Alphatonos +!B7 U+00B7 periodcentered +!B8 U+0388 Epsilontonos +!B9 U+0389 Etatonos +!BA U+038A Iotatonos +!BB U+00BB guillemotright +!BC U+038C Omicrontonos +!BD U+00BD onehalf +!BE U+038E Upsilontonos +!BF U+038F Omegatonos +!C0 U+0390 iotadieresistonos +!C1 U+0391 Alpha +!C2 U+0392 Beta +!C3 U+0393 Gamma +!C4 U+0394 Delta +!C5 U+0395 Epsilon +!C6 U+0396 Zeta +!C7 U+0397 Eta +!C8 U+0398 Theta +!C9 U+0399 Iota +!CA U+039A Kappa +!CB U+039B Lambda +!CC U+039C Mu +!CD U+039D Nu +!CE U+039E Xi +!CF U+039F Omicron +!D0 U+03A0 Pi +!D1 U+03A1 Rho +!D3 U+03A3 Sigma +!D4 U+03A4 Tau +!D5 U+03A5 Upsilon +!D6 U+03A6 Phi +!D7 U+03A7 Chi +!D8 U+03A8 Psi +!D9 U+03A9 Omega +!DA U+03AA Iotadieresis +!DB U+03AB Upsilondieresis +!DC U+03AC alphatonos +!DD U+03AD epsilontonos +!DE U+03AE etatonos +!DF U+03AF iotatonos +!E0 U+03B0 upsilondieresistonos +!E1 U+03B1 alpha +!E2 U+03B2 beta +!E3 U+03B3 gamma +!E4 U+03B4 delta +!E5 U+03B5 epsilon +!E6 U+03B6 zeta +!E7 U+03B7 eta +!E8 U+03B8 theta +!E9 U+03B9 iota +!EA U+03BA kappa +!EB U+03BB lambda +!EC U+03BC mu +!ED U+03BD nu +!EE U+03BE xi +!EF U+03BF omicron +!F0 U+03C0 pi +!F1 U+03C1 rho +!F2 U+03C2 sigma1 +!F3 U+03C3 sigma +!F4 U+03C4 tau +!F5 U+03C5 upsilon +!F6 U+03C6 phi +!F7 U+03C7 chi +!F8 U+03C8 psi +!F9 U+03C9 omega +!FA U+03CA iotadieresis +!FB U+03CB upsilondieresis +!FC U+03CC omicrontonos +!FD U+03CD upsilontonos +!FE U+03CE omegatonos diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-9.map b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-9.map new file mode 100644 index 0000000..48c123a --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/iso-8859-9.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+0080 .notdef +!81 U+0081 .notdef +!82 U+0082 .notdef +!83 U+0083 .notdef +!84 U+0084 .notdef +!85 U+0085 .notdef +!86 U+0086 .notdef +!87 U+0087 .notdef +!88 U+0088 .notdef +!89 U+0089 .notdef +!8A U+008A .notdef +!8B U+008B .notdef +!8C U+008C .notdef +!8D U+008D .notdef +!8E U+008E .notdef +!8F U+008F .notdef +!90 U+0090 .notdef +!91 U+0091 .notdef +!92 U+0092 .notdef +!93 U+0093 .notdef +!94 U+0094 .notdef +!95 U+0095 .notdef +!96 U+0096 .notdef +!97 U+0097 .notdef +!98 U+0098 .notdef +!99 U+0099 .notdef +!9A U+009A .notdef +!9B U+009B .notdef +!9C U+009C .notdef +!9D U+009D .notdef +!9E U+009E .notdef +!9F U+009F .notdef +!A0 U+00A0 space +!A1 U+00A1 exclamdown +!A2 U+00A2 cent +!A3 U+00A3 sterling +!A4 U+00A4 currency +!A5 U+00A5 yen +!A6 U+00A6 brokenbar +!A7 U+00A7 section +!A8 U+00A8 dieresis +!A9 U+00A9 copyright +!AA U+00AA ordfeminine +!AB U+00AB guillemotleft +!AC U+00AC logicalnot +!AD U+00AD hyphen +!AE U+00AE registered +!AF U+00AF macron +!B0 U+00B0 degree +!B1 U+00B1 plusminus +!B2 U+00B2 twosuperior +!B3 U+00B3 threesuperior +!B4 U+00B4 acute +!B5 U+00B5 mu +!B6 U+00B6 paragraph +!B7 U+00B7 periodcentered +!B8 U+00B8 cedilla +!B9 U+00B9 onesuperior +!BA U+00BA ordmasculine +!BB U+00BB guillemotright +!BC U+00BC onequarter +!BD U+00BD onehalf +!BE U+00BE threequarters +!BF U+00BF questiondown +!C0 U+00C0 Agrave +!C1 U+00C1 Aacute +!C2 U+00C2 Acircumflex +!C3 U+00C3 Atilde +!C4 U+00C4 Adieresis +!C5 U+00C5 Aring +!C6 U+00C6 AE +!C7 U+00C7 Ccedilla +!C8 U+00C8 Egrave +!C9 U+00C9 Eacute +!CA U+00CA Ecircumflex +!CB U+00CB Edieresis +!CC U+00CC Igrave +!CD U+00CD Iacute +!CE U+00CE Icircumflex +!CF U+00CF Idieresis +!D0 U+011E Gbreve +!D1 U+00D1 Ntilde +!D2 U+00D2 Ograve +!D3 U+00D3 Oacute +!D4 U+00D4 Ocircumflex +!D5 U+00D5 Otilde +!D6 U+00D6 Odieresis +!D7 U+00D7 multiply +!D8 U+00D8 Oslash +!D9 U+00D9 Ugrave +!DA U+00DA Uacute +!DB U+00DB Ucircumflex +!DC U+00DC Udieresis +!DD U+0130 Idotaccent +!DE U+015E Scedilla +!DF U+00DF germandbls +!E0 U+00E0 agrave +!E1 U+00E1 aacute +!E2 U+00E2 acircumflex +!E3 U+00E3 atilde +!E4 U+00E4 adieresis +!E5 U+00E5 aring +!E6 U+00E6 ae +!E7 U+00E7 ccedilla +!E8 U+00E8 egrave +!E9 U+00E9 eacute +!EA U+00EA ecircumflex +!EB U+00EB edieresis +!EC U+00EC igrave +!ED U+00ED iacute +!EE U+00EE icircumflex +!EF U+00EF idieresis +!F0 U+011F gbreve +!F1 U+00F1 ntilde +!F2 U+00F2 ograve +!F3 U+00F3 oacute +!F4 U+00F4 ocircumflex +!F5 U+00F5 otilde +!F6 U+00F6 odieresis +!F7 U+00F7 divide +!F8 U+00F8 oslash +!F9 U+00F9 ugrave +!FA U+00FA uacute +!FB U+00FB ucircumflex +!FC U+00FC udieresis +!FD U+0131 dotlessi +!FE U+015F scedilla +!FF U+00FF ydieresis diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/koi8-r.map b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/koi8-r.map new file mode 100644 index 0000000..6ad5d05 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/koi8-r.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+2500 SF100000 +!81 U+2502 SF110000 +!82 U+250C SF010000 +!83 U+2510 SF030000 +!84 U+2514 SF020000 +!85 U+2518 SF040000 +!86 U+251C SF080000 +!87 U+2524 SF090000 +!88 U+252C SF060000 +!89 U+2534 SF070000 +!8A U+253C SF050000 +!8B U+2580 upblock +!8C U+2584 dnblock +!8D U+2588 block +!8E U+258C lfblock +!8F U+2590 rtblock +!90 U+2591 ltshade +!91 U+2592 shade +!92 U+2593 dkshade +!93 U+2320 integraltp +!94 U+25A0 filledbox +!95 U+2219 periodcentered +!96 U+221A radical +!97 U+2248 approxequal +!98 U+2264 lessequal +!99 U+2265 greaterequal +!9A U+00A0 space +!9B U+2321 integralbt +!9C U+00B0 degree +!9D U+00B2 twosuperior +!9E U+00B7 periodcentered +!9F U+00F7 divide +!A0 U+2550 SF430000 +!A1 U+2551 SF240000 +!A2 U+2552 SF510000 +!A3 U+0451 afii10071 +!A4 U+2553 SF520000 +!A5 U+2554 SF390000 +!A6 U+2555 SF220000 +!A7 U+2556 SF210000 +!A8 U+2557 SF250000 +!A9 U+2558 SF500000 +!AA U+2559 SF490000 +!AB U+255A SF380000 +!AC U+255B SF280000 +!AD U+255C SF270000 +!AE U+255D SF260000 +!AF U+255E SF360000 +!B0 U+255F SF370000 +!B1 U+2560 SF420000 +!B2 U+2561 SF190000 +!B3 U+0401 afii10023 +!B4 U+2562 SF200000 +!B5 U+2563 SF230000 +!B6 U+2564 SF470000 +!B7 U+2565 SF480000 +!B8 U+2566 SF410000 +!B9 U+2567 SF450000 +!BA U+2568 SF460000 +!BB U+2569 SF400000 +!BC U+256A SF540000 +!BD U+256B SF530000 +!BE U+256C SF440000 +!BF U+00A9 copyright +!C0 U+044E afii10096 +!C1 U+0430 afii10065 +!C2 U+0431 afii10066 +!C3 U+0446 afii10088 +!C4 U+0434 afii10069 +!C5 U+0435 afii10070 +!C6 U+0444 afii10086 +!C7 U+0433 afii10068 +!C8 U+0445 afii10087 +!C9 U+0438 afii10074 +!CA U+0439 afii10075 +!CB U+043A afii10076 +!CC U+043B afii10077 +!CD U+043C afii10078 +!CE U+043D afii10079 +!CF U+043E afii10080 +!D0 U+043F afii10081 +!D1 U+044F afii10097 +!D2 U+0440 afii10082 +!D3 U+0441 afii10083 +!D4 U+0442 afii10084 +!D5 U+0443 afii10085 +!D6 U+0436 afii10072 +!D7 U+0432 afii10067 +!D8 U+044C afii10094 +!D9 U+044B afii10093 +!DA U+0437 afii10073 +!DB U+0448 afii10090 +!DC U+044D afii10095 +!DD U+0449 afii10091 +!DE U+0447 afii10089 +!DF U+044A afii10092 +!E0 U+042E afii10048 +!E1 U+0410 afii10017 +!E2 U+0411 afii10018 +!E3 U+0426 afii10040 +!E4 U+0414 afii10021 +!E5 U+0415 afii10022 +!E6 U+0424 afii10038 +!E7 U+0413 afii10020 +!E8 U+0425 afii10039 +!E9 U+0418 afii10026 +!EA U+0419 afii10027 +!EB U+041A afii10028 +!EC U+041B afii10029 +!ED U+041C afii10030 +!EE U+041D afii10031 +!EF U+041E afii10032 +!F0 U+041F afii10033 +!F1 U+042F afii10049 +!F2 U+0420 afii10034 +!F3 U+0421 afii10035 +!F4 U+0422 afii10036 +!F5 U+0423 afii10037 +!F6 U+0416 afii10024 +!F7 U+0412 afii10019 +!F8 U+042C afii10046 +!F9 U+042B afii10045 +!FA U+0417 afii10025 +!FB U+0428 afii10042 +!FC U+042D afii10047 +!FD U+0429 afii10043 +!FE U+0427 afii10041 +!FF U+042A afii10044 diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/koi8-u.map b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/koi8-u.map new file mode 100644 index 0000000..40a7e4f --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/enc/koi8-u.map @@ -0,0 +1,256 @@ +!00 U+0000 .notdef +!01 U+0001 .notdef +!02 U+0002 .notdef +!03 U+0003 .notdef +!04 U+0004 .notdef +!05 U+0005 .notdef +!06 U+0006 .notdef +!07 U+0007 .notdef +!08 U+0008 .notdef +!09 U+0009 .notdef +!0A U+000A .notdef +!0B U+000B .notdef +!0C U+000C .notdef +!0D U+000D .notdef +!0E U+000E .notdef +!0F U+000F .notdef +!10 U+0010 .notdef +!11 U+0011 .notdef +!12 U+0012 .notdef +!13 U+0013 .notdef +!14 U+0014 .notdef +!15 U+0015 .notdef +!16 U+0016 .notdef +!17 U+0017 .notdef +!18 U+0018 .notdef +!19 U+0019 .notdef +!1A U+001A .notdef +!1B U+001B .notdef +!1C U+001C .notdef +!1D U+001D .notdef +!1E U+001E .notdef +!1F U+001F .notdef +!20 U+0020 space +!21 U+0021 exclam +!22 U+0022 quotedbl +!23 U+0023 numbersign +!24 U+0024 dollar +!25 U+0025 percent +!26 U+0026 ampersand +!27 U+0027 quotesingle +!28 U+0028 parenleft +!29 U+0029 parenright +!2A U+002A asterisk +!2B U+002B plus +!2C U+002C comma +!2D U+002D hyphen +!2E U+002E period +!2F U+002F slash +!30 U+0030 zero +!31 U+0031 one +!32 U+0032 two +!33 U+0033 three +!34 U+0034 four +!35 U+0035 five +!36 U+0036 six +!37 U+0037 seven +!38 U+0038 eight +!39 U+0039 nine +!3A U+003A colon +!3B U+003B semicolon +!3C U+003C less +!3D U+003D equal +!3E U+003E greater +!3F U+003F question +!40 U+0040 at +!41 U+0041 A +!42 U+0042 B +!43 U+0043 C +!44 U+0044 D +!45 U+0045 E +!46 U+0046 F +!47 U+0047 G +!48 U+0048 H +!49 U+0049 I +!4A U+004A J +!4B U+004B K +!4C U+004C L +!4D U+004D M +!4E U+004E N +!4F U+004F O +!50 U+0050 P +!51 U+0051 Q +!52 U+0052 R +!53 U+0053 S +!54 U+0054 T +!55 U+0055 U +!56 U+0056 V +!57 U+0057 W +!58 U+0058 X +!59 U+0059 Y +!5A U+005A Z +!5B U+005B bracketleft +!5C U+005C backslash +!5D U+005D bracketright +!5E U+005E asciicircum +!5F U+005F underscore +!60 U+0060 grave +!61 U+0061 a +!62 U+0062 b +!63 U+0063 c +!64 U+0064 d +!65 U+0065 e +!66 U+0066 f +!67 U+0067 g +!68 U+0068 h +!69 U+0069 i +!6A U+006A j +!6B U+006B k +!6C U+006C l +!6D U+006D m +!6E U+006E n +!6F U+006F o +!70 U+0070 p +!71 U+0071 q +!72 U+0072 r +!73 U+0073 s +!74 U+0074 t +!75 U+0075 u +!76 U+0076 v +!77 U+0077 w +!78 U+0078 x +!79 U+0079 y +!7A U+007A z +!7B U+007B braceleft +!7C U+007C bar +!7D U+007D braceright +!7E U+007E asciitilde +!7F U+007F .notdef +!80 U+2500 SF100000 +!81 U+2502 SF110000 +!82 U+250C SF010000 +!83 U+2510 SF030000 +!84 U+2514 SF020000 +!85 U+2518 SF040000 +!86 U+251C SF080000 +!87 U+2524 SF090000 +!88 U+252C SF060000 +!89 U+2534 SF070000 +!8A U+253C SF050000 +!8B U+2580 upblock +!8C U+2584 dnblock +!8D U+2588 block +!8E U+258C lfblock +!8F U+2590 rtblock +!90 U+2591 ltshade +!91 U+2592 shade +!92 U+2593 dkshade +!93 U+2320 integraltp +!94 U+25A0 filledbox +!95 U+2022 bullet +!96 U+221A radical +!97 U+2248 approxequal +!98 U+2264 lessequal +!99 U+2265 greaterequal +!9A U+00A0 space +!9B U+2321 integralbt +!9C U+00B0 degree +!9D U+00B2 twosuperior +!9E U+00B7 periodcentered +!9F U+00F7 divide +!A0 U+2550 SF430000 +!A1 U+2551 SF240000 +!A2 U+2552 SF510000 +!A3 U+0451 afii10071 +!A4 U+0454 afii10101 +!A5 U+2554 SF390000 +!A6 U+0456 afii10103 +!A7 U+0457 afii10104 +!A8 U+2557 SF250000 +!A9 U+2558 SF500000 +!AA U+2559 SF490000 +!AB U+255A SF380000 +!AC U+255B SF280000 +!AD U+0491 afii10098 +!AE U+255D SF260000 +!AF U+255E SF360000 +!B0 U+255F SF370000 +!B1 U+2560 SF420000 +!B2 U+2561 SF190000 +!B3 U+0401 afii10023 +!B4 U+0404 afii10053 +!B5 U+2563 SF230000 +!B6 U+0406 afii10055 +!B7 U+0407 afii10056 +!B8 U+2566 SF410000 +!B9 U+2567 SF450000 +!BA U+2568 SF460000 +!BB U+2569 SF400000 +!BC U+256A SF540000 +!BD U+0490 afii10050 +!BE U+256C SF440000 +!BF U+00A9 copyright +!C0 U+044E afii10096 +!C1 U+0430 afii10065 +!C2 U+0431 afii10066 +!C3 U+0446 afii10088 +!C4 U+0434 afii10069 +!C5 U+0435 afii10070 +!C6 U+0444 afii10086 +!C7 U+0433 afii10068 +!C8 U+0445 afii10087 +!C9 U+0438 afii10074 +!CA U+0439 afii10075 +!CB U+043A afii10076 +!CC U+043B afii10077 +!CD U+043C afii10078 +!CE U+043D afii10079 +!CF U+043E afii10080 +!D0 U+043F afii10081 +!D1 U+044F afii10097 +!D2 U+0440 afii10082 +!D3 U+0441 afii10083 +!D4 U+0442 afii10084 +!D5 U+0443 afii10085 +!D6 U+0436 afii10072 +!D7 U+0432 afii10067 +!D8 U+044C afii10094 +!D9 U+044B afii10093 +!DA U+0437 afii10073 +!DB U+0448 afii10090 +!DC U+044D afii10095 +!DD U+0449 afii10091 +!DE U+0447 afii10089 +!DF U+044A afii10092 +!E0 U+042E afii10048 +!E1 U+0410 afii10017 +!E2 U+0411 afii10018 +!E3 U+0426 afii10040 +!E4 U+0414 afii10021 +!E5 U+0415 afii10022 +!E6 U+0424 afii10038 +!E7 U+0413 afii10020 +!E8 U+0425 afii10039 +!E9 U+0418 afii10026 +!EA U+0419 afii10027 +!EB U+041A afii10028 +!EC U+041B afii10029 +!ED U+041C afii10030 +!EE U+041D afii10031 +!EF U+041E afii10032 +!F0 U+041F afii10033 +!F1 U+042F afii10049 +!F2 U+0420 afii10034 +!F3 U+0421 afii10035 +!F4 U+0422 afii10036 +!F5 U+0423 afii10037 +!F6 U+0416 afii10024 +!F7 U+0412 afii10019 +!F8 U+042C afii10046 +!F9 U+042B afii10045 +!FA U+0417 afii10025 +!FB U+0428 afii10042 +!FC U+042D afii10047 +!FD U+0429 afii10043 +!FE U+0427 afii10041 +!FF U+042A afii10044 diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/freetype6.dll b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/freetype6.dll new file mode 100644 index 0000000..53878a0 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/freetype6.dll differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/makeallttffonts.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/makeallttffonts.php new file mode 100644 index 0000000..16ac969 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/makeallttffonts.php @@ -0,0 +1,71 @@ +<?php +//============================================================+ +// File name : makeallttffonts.php +// Begin : 2008-12-07 +// Last Update : 2008-12-07 +// +// Description : Process all TTF files on current directory to +// build TCPDF compatible font files. +// +// Author: Nicola Asuni +// +// (c) Copyright: +// Nicola Asuni +// Tecnick.com S.r.l. +// Via della Pace, 11 +// 09044 Quartucciu (CA) +// ITALY +// www.tecnick.com +// info@tecnick.com +// +// License: +// Copyright (C) 2004-2009 Nicola Asuni - Tecnick.com S.r.l. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. +// +// Additionally, you can't remove the original TCExam logo, copyrights statements +// and links to Tecnick.com and TCExam websites. +// +// See LICENSE.TXT file for more information. +//============================================================+ + +/** + * Process all TTF files on current directory to build TCPDF compatible font files. + * @package com.tecnick.tcpdf + * @author Nicola Asuni + * @copyright Copyright &copy; 2004-2009, Nicola Asuni - Tecnick.com S.r.l. - ITALY - www.tecnick.com - info@tecnick.com + * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License + * @link www.tecnick.com + * @since 2008-12-07 + */ + +/** + */ + +// read directory for files (only graphics files). +$handle = opendir('.'); +while($file = readdir($handle)) { + $path_parts = pathinfo($file); + $file_ext = strtolower($path_parts['extension']); + if ($file_ext == 'ttf') { + exec('./ttf2ufm -a -F '.$path_parts['basename'].''); + exec('php -q makefont.php '.$path_parts['basename'].' '.$path_parts['filename'].'.ufm'); + } +} +closedir($handle); + +//============================================================+ +// END OF FILE +//============================================================+ +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/makefont.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/makefont.php new file mode 100644 index 0000000..ca66968 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/makefont.php @@ -0,0 +1,610 @@ +<?php +//============================================================+ +// File name : makefont.php +// Begin : 2004-12-31 +// Last Update : 2010-03-19 +// Version : 1.2.006 +// License : GNU LGPL (http://www.gnu.org/copyleft/lesser.html) +// ---------------------------------------------------------------------------- +// Copyright (C) 2008 Nicola Asuni - Tecnick.com S.r.l. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 2.1 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. +// +// See LICENSE.TXT file for more information. +// ---------------------------------------------------------------------------- +// +// Description : Utility to generate font definition files fot TCPDF +// +// Authors: Nicola Asuni, Olivier Plathey, Steven Wittens +// +// (c) Copyright: +// Nicola Asuni +// Tecnick.com S.r.l. +// Via della Pace, 11 +// 09044 Quartucciu (CA) +// ITALY +// www.tecnick.com +// info@tecnick.com +//============================================================+ + +/** + * Utility to generate font definition files fot TCPDF. + * @author Nicola Asuni, Olivier Plathey, Steven Wittens + * @copyright 2004-2008 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com + * @package com.tecnick.tcpdf + * @link http://www.tcpdf.org + * @license http://www.gnu.org/copyleft/lesser.html LGPL +*/ + +/** + * + * @param string $fontfile path to font file (TTF, OTF or PFB). + * @param string $fmfile font metrics file (UFM or AFM). + * @param boolean $embedded Set to false to not embed the font, true otherwise (default). + * @param string $enc Name of the encoding table to use. Omit this parameter for TrueType Unicode, OpenType Unicode and symbolic fonts like Symbol or ZapfDingBats. + * @param array $patch Optional modification of the encoding + */ +function MakeFont($fontfile, $fmfile, $embedded=true, $enc='cp1252', $patch=array()) { + //Generate a font definition file + set_magic_quotes_runtime(0); + ini_set('auto_detect_line_endings', '1'); + if (!file_exists($fontfile)) { + die('Error: file not found: '.$fontfile); + } + if (!file_exists($fmfile)) { + die('Error: file not found: '.$fmfile); + } + $cidtogidmap = ''; + $map = array(); + $diff = ''; + $dw = 0; // default width + $ffext = strtolower(substr($fontfile, -3)); + $fmext = strtolower(substr($fmfile, -3)); + if ($fmext == 'afm') { + if (($ffext == 'ttf') OR ($ffext == 'otf')) { + $type = 'TrueType'; + } elseif ($ffext == 'pfb') { + $type = 'Type1'; + } else { + die('Error: unrecognized font file extension: '.$ffext); + } + if ($enc) { + $map = ReadMap($enc); + foreach ($patch as $cc => $gn) { + $map[$cc] = $gn; + } + } + $fm = ReadAFM($fmfile, $map); + if (isset($widths['.notdef'])) { + $dw = $widths['.notdef']; + } + if ($enc) { + $diff = MakeFontEncoding($map); + } + $fd = MakeFontDescriptor($fm, empty($map)); + } elseif ($fmext == 'ufm') { + $enc = ''; + if (($ffext == 'ttf') OR ($ffext == 'otf')) { + $type = 'TrueTypeUnicode'; + } else { + die('Error: not a TrueType font: '.$ffext); + } + $fm = ReadUFM($fmfile, $cidtogidmap); + $dw = $fm['MissingWidth']; + $fd = MakeFontDescriptor($fm, false); + } + //Start generation + $s = '<?php'."\n"; + $s .= '$type=\''.$type."';\n"; + $s .= '$name=\''.$fm['FontName']."';\n"; + $s .= '$desc='.$fd.";\n"; + if (!isset($fm['UnderlinePosition'])) { + $fm['UnderlinePosition'] = -100; + } + if (!isset($fm['UnderlineThickness'])) { + $fm['UnderlineThickness'] = 50; + } + $s .= '$up='.$fm['UnderlinePosition'].";\n"; + $s .= '$ut='.$fm['UnderlineThickness'].";\n"; + if ($dw <= 0) { + if (isset($fm['Widths'][32]) AND ($fm['Widths'][32] > 0)) { + // assign default space width + $dw = $fm['Widths'][32]; + } else { + $dw = 600; + } + } + $s .= '$dw='.$dw.";\n"; + $w = MakeWidthArray($fm); + $s .= '$cw='.$w.";\n"; + $s .= '$enc=\''.$enc."';\n"; + $s .= '$diff=\''.$diff."';\n"; + $basename = substr(basename($fmfile), 0, -4); + if ($embedded) { + //Embedded font + if (($type == 'TrueType') OR ($type == 'TrueTypeUnicode')) { + CheckTTF($fontfile); + } + $f = fopen($fontfile,'rb'); + if (!$f) { + die('Error: Unable to open '.$fontfile); + } + $file = fread($f, filesize($fontfile)); + fclose($f); + if ($type == 'Type1') { + //Find first two sections and discard third one + $header = (ord($file{0}) == 128); + if ($header) { + //Strip first binary header + $file = substr($file, 6); + } + $pos = strpos($file, 'eexec'); + if (!$pos) { + die('Error: font file does not seem to be valid Type1'); + } + $size1 = $pos + 6; + if ($header AND (ord($file{$size1}) == 128)) { + //Strip second binary header + $file = substr($file, 0, $size1).substr($file, $size1+6); + } + $pos = strpos($file, '00000000'); + if (!$pos) { + die('Error: font file does not seem to be valid Type1'); + } + $size2 = $pos - $size1; + $file = substr($file, 0, ($size1 + $size2)); + } + $basename = strtolower($basename); + if (function_exists('gzcompress')) { + $cmp = $basename.'.z'; + SaveToFile($cmp, gzcompress($file, 9), 'b'); + $s .= '$file=\''.$cmp."';\n"; + print "Font file compressed (".$cmp.")\n"; + if (!empty($cidtogidmap)) { + $cmp = $basename.'.ctg.z'; + SaveToFile($cmp, gzcompress($cidtogidmap, 9), 'b'); + print "CIDToGIDMap created and compressed (".$cmp.")\n"; + $s .= '$ctg=\''.$cmp."';\n"; + } + } else { + $s .= '$file=\''.basename($fontfile)."';\n"; + print "Notice: font file could not be compressed (zlib extension not available)\n"; + if (!empty($cidtogidmap)) { + $cmp = $basename.'.ctg'; + $f = fopen($cmp, 'wb'); + fwrite($f, $cidtogidmap); + fclose($f); + print "CIDToGIDMap created (".$cmp.")\n"; + $s .= '$ctg=\''.$cmp."';\n"; + } + } + if($type == 'Type1') { + $s .= '$size1='.$size1.";\n"; + $s .= '$size2='.$size2.";\n"; + } else { + $s.='$originalsize='.filesize($fontfile).";\n"; + } + } else { + //Not embedded font + $s .= '$file='."'';\n"; + } + $s .= "?>"; + SaveToFile($basename.'.php',$s); + print "Font definition file generated (".$basename.".php)\n"; +} + +/** + * Read the specified encoding map. + * @param string $enc map name (see /enc/ folder for valid names). + */ +function ReadMap($enc) { + //Read a map file + $file = dirname(__FILE__).'/enc/'.strtolower($enc).'.map'; + $a = file($file); + if (empty($a)) { + die('Error: encoding not found: '.$enc); + } + $cc2gn = array(); + foreach ($a as $l) { + if ($l{0} == '!') { + $e = preg_split('/[ \\t]+/',rtrim($l)); + $cc = hexdec(substr($e[0],1)); + $gn = $e[2]; + $cc2gn[$cc] = $gn; + } + } + for($i = 0; $i <= 255; $i++) { + if(!isset($cc2gn[$i])) { + $cc2gn[$i] = '.notdef'; + } + } + return $cc2gn; +} + +/** + * Read UFM file + */ +function ReadUFM($file, &$cidtogidmap) { + //Prepare empty CIDToGIDMap + $cidtogidmap = str_pad('', (256 * 256 * 2), "\x00"); + //Read a font metric file + $a = file($file); + if (empty($a)) { + die('File not found'); + } + $widths = array(); + $fm = array(); + foreach($a as $l) { + $e = explode(' ',chop($l)); + if(count($e) < 2) { + continue; + } + $code = $e[0]; + $param = $e[1]; + if($code == 'U') { + // U 827 ; WX 0 ; N squaresubnosp ; G 675 ; + //Character metrics + $cc = (int)$e[1]; + if ($cc != -1) { + $gn = $e[7]; + $w = $e[4]; + $glyph = $e[10]; + $widths[$cc] = $w; + if($cc == ord('X')) { + $fm['CapXHeight'] = $e[13]; + } + // Set GID + if (($cc >= 0) AND ($cc < 0xFFFF) AND $glyph) { + $cidtogidmap{($cc * 2)} = chr($glyph >> 8); + $cidtogidmap{(($cc * 2) + 1)} = chr($glyph & 0xFF); + } + } + if((isset($gn) AND ($gn == '.notdef')) AND (!isset($fm['MissingWidth']))) { + $fm['MissingWidth'] = $w; + } + } elseif($code == 'FontName') { + $fm['FontName'] = $param; + } elseif($code == 'Weight') { + $fm['Weight'] = $param; + } elseif($code == 'ItalicAngle') { + $fm['ItalicAngle'] = (double)$param; + } elseif($code == 'Ascender') { + $fm['Ascender'] = (int)$param; + } elseif($code == 'Descender') { + $fm['Descender'] = (int)$param; + } elseif($code == 'UnderlineThickness') { + $fm['UnderlineThickness'] = (int)$param; + } elseif($code == 'UnderlinePosition') { + $fm['UnderlinePosition'] = (int)$param; + } elseif($code == 'IsFixedPitch') { + $fm['IsFixedPitch'] = ($param == 'true'); + } elseif($code == 'FontBBox') { + $fm['FontBBox'] = array($e[1], $e[2], $e[3], $e[4]); + } elseif($code == 'CapHeight') { + $fm['CapHeight'] = (int)$param; + } elseif($code == 'StdVW') { + $fm['StdVW'] = (int)$param; + } + } + if(!isset($fm['MissingWidth'])) { + $fm['MissingWidth'] = 600; + } + if(!isset($fm['FontName'])) { + die('FontName not found'); + } + $fm['Widths'] = $widths; + return $fm; +} + +/** + * Read AFM file + */ +function ReadAFM($file,&$map) { + //Read a font metric file + $a = file($file); + if(empty($a)) { + die('File not found'); + } + $widths = array(); + $fm = array(); + $fix = array( + 'Edot'=>'Edotaccent', + 'edot'=>'edotaccent', + 'Idot'=>'Idotaccent', + 'Zdot'=>'Zdotaccent', + 'zdot'=>'zdotaccent', + 'Odblacute' => 'Ohungarumlaut', + 'odblacute' => 'ohungarumlaut', + 'Udblacute'=>'Uhungarumlaut', + 'udblacute'=>'uhungarumlaut', + 'Gcedilla'=>'Gcommaaccent' + ,'gcedilla'=>'gcommaaccent', + 'Kcedilla'=>'Kcommaaccent', + 'kcedilla'=>'kcommaaccent', + 'Lcedilla'=>'Lcommaaccent', + 'lcedilla'=>'lcommaaccent', + 'Ncedilla'=>'Ncommaaccent', + 'ncedilla'=>'ncommaaccent', + 'Rcedilla'=>'Rcommaaccent', + 'rcedilla'=>'rcommaaccent', + 'Scedilla'=>'Scommaaccent', + 'scedilla'=>'scommaaccent', + 'Tcedilla'=>'Tcommaaccent', + 'tcedilla'=>'tcommaaccent', + 'Dslash'=>'Dcroat', + 'dslash'=>'dcroat', + 'Dmacron'=>'Dcroat', + 'dmacron'=>'dcroat', + 'combininggraveaccent'=>'gravecomb', + 'combininghookabove'=>'hookabovecomb', + 'combiningtildeaccent'=>'tildecomb', + 'combiningacuteaccent'=>'acutecomb', + 'combiningdotbelow'=>'dotbelowcomb', + 'dongsign'=>'dong' + ); + foreach($a as $l) { + $e = explode(' ', rtrim($l)); + if (count($e) < 2) { + continue; + } + $code = $e[0]; + $param = $e[1]; + if ($code == 'C') { + //Character metrics + $cc = (int)$e[1]; + $w = $e[4]; + $gn = $e[7]; + if (substr($gn, -4) == '20AC') { + $gn = 'Euro'; + } + if (isset($fix[$gn])) { + //Fix incorrect glyph name + foreach ($map as $c => $n) { + if ($n == $fix[$gn]) { + $map[$c] = $gn; + } + } + } + if (empty($map)) { + //Symbolic font: use built-in encoding + $widths[$cc] = $w; + } else { + $widths[$gn] = $w; + if($gn == 'X') { + $fm['CapXHeight'] = $e[13]; + } + } + if($gn == '.notdef') { + $fm['MissingWidth'] = $w; + } + } elseif($code == 'FontName') { + $fm['FontName'] = $param; + } elseif($code == 'Weight') { + $fm['Weight'] = $param; + } elseif($code == 'ItalicAngle') { + $fm['ItalicAngle'] = (double)$param; + } elseif($code == 'Ascender') { + $fm['Ascender'] = (int)$param; + } elseif($code == 'Descender') { + $fm['Descender'] = (int)$param; + } elseif($code == 'UnderlineThickness') { + $fm['UnderlineThickness'] = (int)$param; + } elseif($code == 'UnderlinePosition') { + $fm['UnderlinePosition'] = (int)$param; + } elseif($code == 'IsFixedPitch') { + $fm['IsFixedPitch'] = ($param == 'true'); + } elseif($code == 'FontBBox') { + $fm['FontBBox'] = array($e[1], $e[2], $e[3], $e[4]); + } elseif($code == 'CapHeight') { + $fm['CapHeight'] = (int)$param; + } elseif($code == 'StdVW') { + $fm['StdVW'] = (int)$param; + } + } + if (!isset($fm['FontName'])) { + die('FontName not found'); + } + if (!empty($map)) { + if (!isset($widths['.notdef'])) { + $widths['.notdef'] = 600; + } + if (!isset($widths['Delta']) AND isset($widths['increment'])) { + $widths['Delta'] = $widths['increment']; + } + //Order widths according to map + for ($i = 0; $i <= 255; $i++) { + if (!isset($widths[$map[$i]])) { + print "Warning: character ".$map[$i]." is missing\n"; + $widths[$i] = $widths['.notdef']; + } else { + $widths[$i] = $widths[$map[$i]]; + } + } + } + $fm['Widths'] = $widths; + return $fm; +} + +function MakeFontDescriptor($fm, $symbolic=false) { + //Ascent + $asc = (isset($fm['Ascender']) ? $fm['Ascender'] : 1000); + $fd = "array('Ascent'=>".$asc; + //Descent + $desc = (isset($fm['Descender']) ? $fm['Descender'] : -200); + $fd .= ",'Descent'=>".$desc; + //CapHeight + if (isset($fm['CapHeight'])) { + $ch = $fm['CapHeight']; + } elseif (isset($fm['CapXHeight'])) { + $ch = $fm['CapXHeight']; + } else { + $ch = $asc; + } + $fd .= ",'CapHeight'=>".$ch; + //Flags + $flags = 0; + if (isset($fm['IsFixedPitch']) AND $fm['IsFixedPitch']) { + $flags += 1<<0; + } + if ($symbolic) { + $flags += 1<<2; + } else { + $flags += 1<<5; + } + if (isset($fm['ItalicAngle']) AND ($fm['ItalicAngle'] != 0)) { + $flags += 1<<6; + } + $fd .= ",'Flags'=>".$flags; + //FontBBox + if (isset($fm['FontBBox'])) { + $fbb = $fm['FontBBox']; + } else { + $fbb = array(0, ($desc - 100), 1000, ($asc + 100)); + } + $fd .= ",'FontBBox'=>'[".$fbb[0].' '.$fbb[1].' '.$fbb[2].' '.$fbb[3]."]'"; + //ItalicAngle + $ia = (isset($fm['ItalicAngle']) ? $fm['ItalicAngle'] : 0); + $fd .= ",'ItalicAngle'=>".$ia; + //StemV + if (isset($fm['StdVW'])) { + $stemv = $fm['StdVW']; + } elseif (isset($fm['Weight']) AND preg_match('/(bold|black)/i', $fm['Weight'])) { + $stemv = 120; + } else { + $stemv = 70; + } + $fd .= ",'StemV'=>".$stemv; + //MissingWidth + if(isset($fm['MissingWidth'])) { + $fd .= ",'MissingWidth'=>".$fm['MissingWidth']; + } + $fd .= ')'; + return $fd; +} + +function MakeWidthArray($fm) { + //Make character width array + $s = 'array('; + $cw = $fm['Widths']; + $els = array(); + $c = 0; + foreach ($cw as $i => $w) { + if (is_numeric($i)) { + $els[] = (((($c++)%10) == 0) ? "\n" : '').$i.'=>'.$w; + } + } + $s .= implode(',', $els); + $s .= ')'; + return $s; +} + +function MakeFontEncoding($map) { + //Build differences from reference encoding + $ref = ReadMap('cp1252'); + $s = ''; + $last = 0; + for ($i = 32; $i <= 255; $i++) { + if ($map[$i] != $ref[$i]) { + if ($i != $last+1) { + $s .= $i.' '; + } + $last = $i; + $s .= '/'.$map[$i].' '; + } + } + return rtrim($s); +} + +function SaveToFile($file, $s, $mode='t') { + $f = fopen($file, 'w'.$mode); + if(!$f) { + die('Can\'t write to file '.$file); + } + fwrite($f, $s, strlen($s)); + fclose($f); +} + +function ReadShort($f) { + $a = unpack('n1n', fread($f, 2)); + return $a['n']; +} + +function ReadLong($f) { + $a = unpack('N1N', fread($f, 4)); + return $a['N']; +} + +function CheckTTF($file) { + //Check if font license allows embedding + $f = fopen($file, 'rb'); + if (!$f) { + die('Error: unable to open '.$file); + } + //Extract number of tables + fseek($f, 4, SEEK_CUR); + $nb = ReadShort($f); + fseek($f, 6, SEEK_CUR); + //Seek OS/2 table + $found = false; + for ($i = 0; $i < $nb; $i++) { + if (fread($f, 4) == 'OS/2') { + $found = true; + break; + } + fseek($f, 12, SEEK_CUR); + } + if (!$found) { + fclose($f); + return; + } + fseek($f, 4, SEEK_CUR); + $offset = ReadLong($f); + fseek($f, $offset, SEEK_SET); + //Extract fsType flags + fseek($f, 8, SEEK_CUR); + $fsType = ReadShort($f); + $rl = ($fsType & 0x02) != 0; + $pp = ($fsType & 0x04) != 0; + $e = ($fsType & 0x08) != 0; + fclose($f); + if($rl AND (!$pp) AND (!$e)) { + print "Warning: font license does not allow embedding\n"; + } +} + +$arg = $GLOBALS['argv']; +if (count($arg) >= 3) { + ob_start(); + array_shift($arg); + if (sizeof($arg) == 3) { + $arg[3] = $arg[2]; + $arg[2] = true; + } else { + if (!isset($arg[2])) { + $arg[2] = true; + } + if (!isset($arg[3])) { + $arg[3] = 'cp1252'; + } + } + if (!isset($arg[4])) { + $arg[4] = array(); + } + MakeFont($arg[0], $arg[1], $arg[2], $arg[3], $arg[4]); + $t = ob_get_clean(); + print preg_replace('!<BR( /)?>!i', "\n", $t); +} else { + print "Usage: makefont.php <ttf/otf/pfb file> <afm/ufm file> <encoding> <patch>\n"; +} +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/pfm2afm b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/pfm2afm new file mode 100644 index 0000000..c75b565 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/pfm2afm differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/pfm2afm.exe b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/pfm2afm.exe new file mode 100644 index 0000000..25c21fa Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/pfm2afm.exe differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/src/pfm2afm-src.tar.gz b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/src/pfm2afm-src.tar.gz new file mode 100644 index 0000000..72abae5 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/src/pfm2afm-src.tar.gz differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/src/readme.txt b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/src/readme.txt new file mode 100644 index 0000000..6e5b40d --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/src/readme.txt @@ -0,0 +1,17 @@ +To embed TrueType and OpenType font files, you need to extract the +font metrics from the font files and build the required tables using +the utility TTF2UFM. + +TTF2UFM is a modified version of Mark Heath's TTF 2 PT1 converter +(http://ttf2pt1.sourceforge.net/) by Steven Wittens <steven@acko.net> +(http://www.acko.net/blog/ufpdf). That version has been further +modified by Ulrich Telle for use with the wxWidgets component +wxPdfDocument. + +Following changes where made: + +1) Generated AFM files contain the glyph number for each character. +2) Generated UFM files contain the bounding box for each character. +3) OpenType support has been activated for the Windows binary, + and the generated AFM/UFM files contain the associated + original Unicode codes for each character. diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/src/ttf2ufm-src.tar.gz b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/src/ttf2ufm-src.tar.gz new file mode 100644 index 0000000..2aeca60 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/src/ttf2ufm-src.tar.gz differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/ttf2ufm b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/ttf2ufm new file mode 100644 index 0000000..f81604f Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/ttf2ufm differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/ttf2ufm.exe b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/ttf2ufm.exe new file mode 100644 index 0000000..0775105 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/ttf2ufm.exe differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/zlib1.dll b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/zlib1.dll new file mode 100644 index 0000000..31996cd Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/fonts/utils/zlib1.dll differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/zapfdingbats.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/zapfdingbats.php new file mode 100644 index 0000000..f4c679b --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/zapfdingbats.php @@ -0,0 +1,32 @@ +<?php + // core font definition file for TCPDF (www.tcpdf.org) +$type='core'; +$dw=788; +$cw=array(0=>0,1=>0,2=>0,3=>0,4=>0,5=>0,6=>0,7=>0,8=>0,9=>0,10=>0,11=>0,12=>0, +13=>0,14=>0,15=>0,16=>0,17=>0,18=>0,19=>0,20=>0,21=>0,22=>0,23=>0,24=>0,25=>0, +26=>0,27=>0,28=>0,29=>0,30=>0,31=>0,32=>278,33=>974,34=>961,35=>974,36=>980, +37=>719,38=>789,39=>790,40=>791,41=>690,42=>960,43=>939,44=>549,45=>855,46=>911, +47=>933,48=>911,49=>945,50=>974,51=>755,52=>846,53=>762,54=>761,55=>571,56=>677, +57=>763,58=>760,59=>759,60=>754,61=>494,62=>552,63=>537,64=>577,65=>692,66=>786, +67=>788,68=>788,69=>790,70=>793,71=>794,72=>816,73=>823,74=>789,75=>841,76=>823, +77=>833,78=>816,79=>831,80=>923,81=>744,82=>723,83=>749,84=>790,85=>792,86=>695, +87=>776,88=>768,89=>792,90=>759,91=>707,92=>708,93=>682,94=>701,95=>826,96=>815, +97=>789,98=>789,99=>707,100=>687,101=>696,102=>689,103=>786,104=>787,105=>713, +106=>791,107=>785,108=>791,109=>873,110=>761,111=>762,112=>762,113=>759,114=>759, +115=>892,116=>892,117=>788,118=>784,119=>438,120=>138,121=>277,122=>415,123=>392, +124=>392,125=>668,126=>668,127=>0,128=>390,129=>390,130=>317,131=>317,132=>276, +133=>276,134=>509,135=>509,136=>410,137=>410,138=>234,139=>234,140=>334,141=>334, +142=>0,143=>0,144=>0,145=>0,146=>0,147=>0,148=>0,149=>0,150=>0,151=>0,152=>0, +153=>0,154=>0,155=>0,156=>0,157=>0,158=>0,159=>0,160=>0,161=>732,162=>544,163=>544, +164=>910,165=>667,166=>760,167=>760,168=>776,169=>595,170=>694,171=>626,172=>788, +173=>788,174=>788,175=>788,176=>788,177=>788,178=>788,179=>788,180=>788,181=>788, +182=>788,183=>788,184=>788,185=>788,186=>788,187=>788,188=>788,189=>788,190=>788, +191=>788,192=>788,193=>788,194=>788,195=>788,196=>788,197=>788,198=>788,199=>788, +200=>788,201=>788,202=>788,203=>788,204=>788,205=>788,206=>788,207=>788,208=>788, +209=>788,210=>788,211=>788,212=>894,213=>838,214=>1016,215=>458,216=>748,217=>924, +218=>748,219=>918,220=>927,221=>928,222=>928,223=>834,224=>873,225=>828,226=>924, +227=>924,228=>917,229=>930,230=>931,231=>463,232=>883,233=>836,234=>836,235=>867, +236=>867,237=>696,238=>696,239=>874,240=>0,241=>874,242=>760,243=>946,244=>771, +245=>865,246=>771,247=>888,248=>967,249=>888,250=>831,251=>873,252=>927,253=>970, +254=>918,255=>0); +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/fonts/zarbold.php b/assets/html2pdf/_tcpdf_5.0.002/fonts/zarbold.php new file mode 100644 index 0000000..c854a4e --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/fonts/zarbold.php @@ -0,0 +1,47 @@ +<?php +/* Mohammad Ali Golkar + m.a.golkar@gmail.com + http://www.30minonline.com + LICENSE : GPLv2 */ +$type='TrueTypeUnicode'; +$name='ZarBold'; +$desc=array('Ascent'=>733,'Descent'=>-317,'CapHeight'=>733,'Flags'=>32,'FontBBox'=>'[-126 -535 1164 1046]','ItalicAngle'=>0,'StemV'=>120,'MissingWidth'=>600); +$up=-356; +$ut=49; +$dw=600; +$cw=array( + 0=>0,32=>227,33=>235,34=>282,35=>667,36=>458,37=>493,38=>635,39=>156,40=>303,41=>303,42=>489,43=>489,44=>237,45=>489,46=>231,47=>277, + 48=>552,49=>552,50=>552,51=>552,52=>552,53=>552,54=>552,55=>552,56=>552,57=>552,58=>231,59=>237,60=>667,61=>489,62=>667,63=>448, + 64=>917,65=>604,66=>542,67=>615,68=>708,69=>479,70=>427,71=>667,72=>688,73=>302,74=>292,75=>583,76=>469,77=>885,78=>677,79=>729, + 80=>479,81=>729,82=>542,83=>448,84=>521,85=>677,86=>615,87=>969,88=>604,89=>583,90=>594,91=>208,92=>510,93=>208,94=>469,95=>500, + 96=>333,97=>469,98=>510,99=>448,100=>521,101=>438,102=>313,103=>500,104=>552,105=>271,106=>260,107=>500,108=>271,109=>802,110=>552,111=>490, + 112=>531,113=>521,114=>396,115=>365,116=>292,117=>552,118=>479,119=>750,120=>521,121=>469,122=>448,123=>479,124=>510,125=>479,126=>667,8218=>240, + 402=>531,8222=>458,8230=>1000,8224=>438,8225=>438,710=>333,8240=>1010,352=>448,8249=>250,338=>865,8216=>240,8217=>240,8220=>317,8221=>317,8226=>281,8211=>500, + 8212=>1000,8482=>906,353=>365,8250=>250,339=>823,376=>583,160=>244,161=>317,162=>448,163=>583,164=>500,165=>583,166=>200,167=>417,168=>333,169=>765, + 170=>313,171=>417,172=>667,173=>564,174=>765,175=>333,176=>375,177=>462,178=>354,179=>354,180=>333,181=>510,182=>438,183=>198,184=>333,185=>354, + 186=>323,187=>417,188=>854,189=>854,190=>854,191=>448,192=>604,711=>333,215=>462,224=>469,226=>469,231=>448,232=>438,233=>438,234=>438,235=>438, + 238=>271,239=>271,244=>490,305=>271,247=>483,249=>552,251=>552,252=>552,255=>469,9249=>781,1548=>237,1563=>237,1567=>340,1569=>426,1570=>416,1571=>238, + 1572=>429,1573=>260,1574=>817,1575=>238,1576=>853,1577=>439,1578=>853,1579=>853,1580=>720,1581=>720,1582=>720,1583=>485,1584=>485,1585=>423,1586=>423,1587=>1016, + 1588=>1016,1589=>1128,1590=>1128,1591=>794,1592=>794,1593=>685,1594=>685,1600=>371,1601=>840,1602=>696,1603=>1148,1604=>744,1605=>514,1606=>686,1607=>439,1608=>429, + 1609=>817,1610=>817,1611=>0,1612=>0,1613=>0,1614=>0,1615=>0,1616=>0,1617=>0,1618=>0,1632=>479,1633=>479,1634=>479,1635=>479,1636=>479,1637=>479, + 1638=>479,1639=>479,1640=>479,1641=>483,1642=>493,1645=>563,1648=>227,1649=>363,1652=>227,1662=>853,1670=>720,1688=>423,1700=>840,1705=>1148,1711=>1149,1740=>817, + 1749=>439,1764=>227,1776=>479,1777=>479,1778=>479,1779=>479,1780=>479,1781=>479,1782=>479,1783=>479,1784=>479,1785=>483,8204=>22,8205=>22,8206=>22,8207=>22, + 59424=>227,59425=>227,59426=>227,59427=>227,59428=>227,59429=>227,59430=>227,59431=>227,59432=>227,59433=>227,59434=>227,59435=>227,59436=>227,59416=>227,59437=>227,59442=>227, + 59443=>227,59444=>227,59445=>227,59446=>227,64336=>363,64337=>263,64342=>853,64343=>967,64344=>267,64345=>271,64362=>840,64363=>959,64364=>305,64365=>341,64378=>720,64379=>725, + 64380=>630,64381=>652,64394=>423,64395=>450,64398=>1148,64399=>1089,64400=>522,64401=>461,64402=>1149,64403=>1084,64404=>525,64405=>462,64508=>817,64509=>784,64606=>227,64607=>227, + 64608=>227,64609=>227,64610=>227,64754=>371,64755=>371,64756=>371,64828=>331,64829=>276,64830=>303,64831=>303,65010=>866,65136=>227,65137=>371,65138=>227,65140=>227,65142=>227, + 65143=>371,65144=>227,65145=>371,65146=>227,65147=>371,65148=>227,65149=>371,65150=>227,65151=>371,65152=>426,65153=>416,65154=>354,65155=>238,65156=>282,65157=>429,65158=>507, + 65159=>260,65160=>286,65161=>817,65162=>784,65163=>190,65164=>276,65165=>238,65166=>263,65167=>853,65168=>967,65169=>186,65170=>271,65171=>439,65172=>452,65173=>853,65174=>967, + 65175=>256,65176=>271,65177=>853,65178=>967,65179=>267,65180=>271,65181=>720,65182=>725,65183=>630,65184=>652,65185=>720,65186=>725,65187=>630,65188=>652,65189=>720,65190=>725, + 65191=>630,65192=>652,65193=>485,65194=>608,65195=>485,65196=>608,65197=>423,65198=>450,65199=>423,65200=>450,65201=>1016,65202=>1041,65203=>498,65204=>475,65205=>1016,65206=>1041, + 65207=>498,65208=>475,65209=>1128,65210=>1150,65211=>633,65212=>655,65213=>1128,65214=>1150,65215=>633,65216=>655,65217=>794,65218=>814,65219=>566,65220=>588,65221=>794,65222=>814, + 65223=>566,65224=>588,65225=>685,65226=>655,65227=>414,65228=>330,65229=>685,65230=>655,65231=>414,65232=>330,65233=>840,65234=>959,65235=>305,65236=>341,65237=>696,65238=>780, + 65239=>305,65240=>341,65241=>1148,65242=>1089,65243=>522,65244=>461,65245=>744,65246=>741,65247=>202,65248=>259,65249=>514,65250=>585,65251=>345,65252=>477,65253=>686,65254=>764, + 65255=>186,65256=>271,65257=>439,65258=>452,65259=>501,65260=>381,65261=>429,65262=>507,65263=>817,65264=>784,65265=>817,65266=>784,64510=>265,64511=>271,65269=>610,65270=>652, + 65271=>539,65272=>611,65273=>539,65274=>611,65275=>539,65276=>611,65279=>0,64486=>408,64487=>408); +$enc=''; +$diff=''; +$file='zarbold.z'; +$ctg='zarbold.ctg.z'; +$originalsize=73296; +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/htmlcolors.php b/assets/html2pdf/_tcpdf_5.0.002/htmlcolors.php new file mode 100644 index 0000000..dd59fe2 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/htmlcolors.php @@ -0,0 +1,210 @@ +<?php +//============================================================+ +// File name : htmlcolors.php +// Begin : 2002-04-09 +// Last Update : 2010-04-20 +// Version : 1.0.004 +// License : GNU LGPL (http://www.gnu.org/copyleft/lesser.html) +// ---------------------------------------------------------------------------- +// Copyright (C) 2002-2009 Nicola Asuni - Tecnick.com S.r.l. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 2.1 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. +// +// See LICENSE.TXT file for more information. +// ---------------------------------------------------------------------------- +// +// Description : Array of WEB safe colors +// +// Author: Nicola Asuni +// +// (c) Copyright: +// Nicola Asuni +// Tecnick.com S.r.l. +// Via della Pace, 11 +// 09044 Quartucciu (CA) +// ITALY +// www.tecnick.com +// info@tecnick.com +//============================================================+ + +/** + * Array of WEB safe colors. + * @author Nicola Asuni + * @copyright 2004-2009 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com + * @package com.tecnick.tcpdf + * @link http://www.tcpdf.org + * @license http://www.gnu.org/copyleft/lesser.html LGPL + * @since 2.9.000 (2008-03-26) +*/ + +/** + * Array of WEB safe colors + */ +global $webcolor; +$webcolor = array ( +'aliceblue' => 'f0f8ff', +'antiquewhite' => 'faebd7', +'aqua' => '00ffff', +'aquamarine' => '7fffd4', +'azure' => 'f0ffff', +'beige' => 'f5f5dc', +'bisque' => 'ffe4c4', +'black' => '000000', +'blanchedalmond' => 'ffebcd', +'blue' => '0000ff', +'blueviolet' => '8a2be2', +'brown' => 'a52a2a', +'burlywood' => 'deb887', +'cadetblue' => '5f9ea0', +'chartreuse' => '7fff00', +'chocolate' => 'd2691e', +'coral' => 'ff7f50', +'cornflowerblue' => '6495ed', +'cornsilk' => 'fff8dc', +'crimson' => 'dc143c', +'cyan' => '00ffff', +'darkblue' => '00008b', +'darkcyan' => '008b8b', +'darkgoldenrod' => 'b8860b', +'dkgray' => 'a9a9a9', +'darkgray' => 'a9a9a9', +'darkgrey' => 'a9a9a9', +'darkgreen' => '006400', +'darkkhaki' => 'bdb76b', +'darkmagenta' => '8b008b', +'darkolivegreen' => '556b2f', +'darkorange' => 'ff8c00', +'darkorchid' => '9932cc', +'darkred' => '8b0000', +'darksalmon' => 'e9967a', +'darkseagreen' => '8fbc8f', +'darkslateblue' => '483d8b', +'darkslategray' => '2f4f4f', +'darkslategrey' => '2f4f4f', +'darkturquoise' => '00ced1', +'darkviolet' => '9400d3', +'deeppink' => 'ff1493', +'deepskyblue' => '00bfff', +'dimgray' => '696969', +'dimgrey' => '696969', +'dodgerblue' => '1e90ff', +'firebrick' => 'b22222', +'floralwhite' => 'fffaf0', +'forestgreen' => '228b22', +'fuchsia' => 'ff00ff', +'gainsboro' => 'dcdcdc', +'ghostwhite' => 'f8f8ff', +'gold' => 'ffd700', +'goldenrod' => 'daa520', +'gray' => '808080', +'grey' => '808080', +'green' => '008000', +'greenyellow' => 'adff2f', +'honeydew' => 'f0fff0', +'hotpink' => 'ff69b4', +'indianred' => 'cd5c5c', +'indigo' => '4b0082', +'ivory' => 'fffff0', +'khaki' => 'f0e68c', +'lavender' => 'e6e6fa', +'lavenderblush' => 'fff0f5', +'lawngreen' => '7cfc00', +'lemonchiffon' => 'fffacd', +'lightblue' => 'add8e6', +'lightcoral' => 'f08080', +'lightcyan' => 'e0ffff', +'lightgoldenrodyellow' => 'fafad2', +'ltgray' => 'd3d3d3', +'lightgray' => 'd3d3d3', +'lightgrey' => 'd3d3d3', +'lightgreen' => '90ee90', +'lightpink' => 'ffb6c1', +'lightsalmon' => 'ffa07a', +'lightseagreen' => '20b2aa', +'lightskyblue' => '87cefa', +'lightslategray' => '778899', +'lightslategrey' => '778899', +'lightsteelblue' => 'b0c4de', +'lightyellow' => 'ffffe0', +'lime' => '00ff00', +'limegreen' => '32cd32', +'linen' => 'faf0e6', +'magenta' => 'ff00ff', +'maroon' => '800000', +'mediumaquamarine' => '66cdaa', +'mediumblue' => '0000cd', +'mediumorchid' => 'ba55d3', +'mediumpurple' => '9370d8', +'mediumseagreen' => '3cb371', +'mediumslateblue' => '7b68ee', +'mediumspringgreen' => '00fa9a', +'mediumturquoise' => '48d1cc', +'mediumvioletred' => 'c71585', +'midnightblue' => '191970', +'mintcream' => 'f5fffa', +'mistyrose' => 'ffe4e1', +'moccasin' => 'ffe4b5', +'navajowhite' => 'ffdead', +'navy' => '000080', +'oldlace' => 'fdf5e6', +'olive' => '808000', +'olivedrab' => '6b8e23', +'orange' => 'ffa500', +'orangered' => 'ff4500', +'orchid' => 'da70d6', +'palegoldenrod' => 'eee8aa', +'palegreen' => '98fb98', +'paleturquoise' => 'afeeee', +'palevioletred' => 'd87093', +'papayawhip' => 'ffefd5', +'peachpuff' => 'ffdab9', +'peru' => 'cd853f', +'pink' => 'ffc0cb', +'plum' => 'dda0dd', +'powderblue' => 'b0e0e6', +'purple' => '800080', +'red' => 'ff0000', +'rosybrown' => 'bc8f8f', +'royalblue' => '4169e1', +'saddlebrown' => '8b4513', +'salmon' => 'fa8072', +'sandybrown' => 'f4a460', +'seagreen' => '2e8b57', +'seashell' => 'fff5ee', +'sienna' => 'a0522d', +'silver' => 'c0c0c0', +'skyblue' => '87ceeb', +'slateblue' => '6a5acd', +'slategray' => '708090', +'slategrey' => '708090', +'snow' => 'fffafa', +'springgreen' => '00ff7f', +'steelblue' => '4682b4', +'tan' => 'd2b48c', +'teal' => '008080', +'thistle' => 'd8bfd8', +'tomato' => 'ff6347', +'turquoise' => '40e0d0', +'violet' => 'ee82ee', +'wheat' => 'f5deb3', +'white' => 'ffffff', +'whitesmoke' => 'f5f5f5', +'yellow' => 'ffff00', +'yellowgreen' => '9acd32' +); + +//============================================================+ +// END OF FILE +//============================================================+ +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/images/read_me.txt b/assets/html2pdf/_tcpdf_5.0.002/images/read_me.txt new file mode 100644 index 0000000..2ef419b --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/images/read_me.txt @@ -0,0 +1,3 @@ +download the TCPDF package to have this resources. + +it has been removed because of the size of the package of HTML2PDF... \ No newline at end of file diff --git a/assets/html2pdf/_tcpdf_5.0.002/qrcode.php b/assets/html2pdf/_tcpdf_5.0.002/qrcode.php new file mode 100644 index 0000000..5879ff4 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/qrcode.php @@ -0,0 +1,2875 @@ +<?php +//============================================================+ +// File name : qrcode.php +// Begin : 2010-03-22 +// Last Update : 2010-03-30 +// Version : 1.0.003 +// License : GNU LGPL v.3 (http://www.gnu.org/copyleft/lesser.html) +// ---------------------------------------------------------------------------- +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +// or browse http://www.gnu.org/copyleft/lesser.html +// +// ---------------------------------------------------------------------------- +// +// DESCRIPTION : +// +// Class to create QR-code arrays for TCPDF class. +// QR Code symbol is a 2D barcode that can be scanned by +// handy terminals such as a mobile phone with CCD. +// The capacity of QR Code is up to 7000 digits or 4000 +// characters, and has high robustness. +// This class supports QR Code model 2, described in +// JIS (Japanese Industrial Standards) X0510:2004 +// or ISO/IEC 18004. +// Currently the following features are not supported: +// ECI and FNC1 mode, Micro QR Code, QR Code model 1, +// Structured mode. +// +// This class is derived from the following projects: +// --------------------------------------------------------- +// "PHP QR Code encoder" +// License: GNU-LGPLv3 +// Copyright (C) 2010 by Dominik Dzienia <deltalab at poczta dot fm> +// http://phpqrcode.sourceforge.net/ +// https://sourceforge.net/projects/phpqrcode/ +// +// The "PHP QR Code encoder" is based on +// "C libqrencode library" (ver. 3.1.1) +// License: GNU-LGPL 2.1 +// Copyright (C) 2006-2010 by Kentaro Fukuchi +// http://megaui.net/fukuchi/works/qrencode/index.en.html +// +// Reed-Solomon code encoder is written by Phil Karn, KA9Q. +// Copyright (C) 2002-2006 Phil Karn, KA9Q +// +// QR Code is registered trademark of DENSO WAVE INCORPORATED +// http://www.denso-wave.com/qrcode/index-e.html +// --------------------------------------------------------- +// +// Author: Nicola Asuni +// +// (c) Copyright 2010: +// Nicola Asuni +// Tecnick.com S.r.l. +// Via della Pace, 11 +// 09044 Quartucciu (CA) +// ITALY +// www.tecnick.com +// info@tecnick.com +//============================================================+ + +/** + * Class to create QR-code arrays for TCPDF class. + * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD. + * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness. + * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004. + * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode. + * + * This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html). + * Please read comments on this class source file for full copyright and license information. + * + * @package com.tecnick.tcpdf + * @abstract Class for generating QR-code array for TCPDF. + * @author Nicola Asuni + * @copyright 2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com + * @link http://www.tcpdf.org + * @license http://www.gnu.org/copyleft/lesser.html LGPL + * @version 1.0.003 + */ + +// definitions +if (!defined('QRCODEDEFS')) { + + /** + * Indicate that definitions for this class are set + */ + define('QRCODEDEFS', true); + + // ----------------------------------------------------- + + // Encoding modes (characters which can be encoded in QRcode) + + /** + * Encoding mode + */ + define('QR_MODE_NL', -1); + + /** + * Encoding mode numeric (0-9). 3 characters are encoded to 10bit length. In theory, 7089 characters or less can be stored in a QRcode. + */ + define('QR_MODE_NM', 0); + + /** + * Encoding mode alphanumeric (0-9A-Z $%*+-./:) 45characters. 2 characters are encoded to 11bit length. In theory, 4296 characters or less can be stored in a QRcode. + */ + define('QR_MODE_AN', 1); + + /** + * Encoding mode 8bit byte data. In theory, 2953 characters or less can be stored in a QRcode. + */ + define('QR_MODE_8B', 2); + + /** + * Encoding mode KANJI. A KANJI character (multibyte character) is encoded to 13bit length. In theory, 1817 characters or less can be stored in a QRcode. + */ + define('QR_MODE_KJ', 3); + + /** + * Encoding mode STRUCTURED (currently unsupported) + */ + define('QR_MODE_ST', 4); + + // ----------------------------------------------------- + + // Levels of error correction. + // QRcode has a function of an error correcting for miss reading that white is black. + // Error correcting is defined in 4 level as below. + + /** + * Error correction level L : About 7% or less errors can be corrected. + */ + define('QR_ECLEVEL_L', 0); + + /** + * Error correction level M : About 15% or less errors can be corrected. + */ + define('QR_ECLEVEL_M', 1); + + /** + * Error correction level Q : About 25% or less errors can be corrected. + */ + define('QR_ECLEVEL_Q', 2); + + /** + * Error correction level H : About 30% or less errors can be corrected. + */ + define('QR_ECLEVEL_H', 3); + + // ----------------------------------------------------- + + // Version. Size of QRcode is defined as version. + // Version is from 1 to 40. + // Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases. + // So version 40 is 177*177 matrix. + + /** + * Maximum QR Code version. + */ + define('QRSPEC_VERSION_MAX', 40); + + /** + * Maximum matrix size for maximum version (version 40 is 177*177 matrix). + */ + define('QRSPEC_WIDTH_MAX', 177); + + // ----------------------------------------------------- + + /** + * Matrix index to get width from $capacity array. + */ + define('QRCAP_WIDTH', 0); + + /** + * Matrix index to get number of words from $capacity array. + */ + define('QRCAP_WORDS', 1); + + /** + * Matrix index to get remainder from $capacity array. + */ + define('QRCAP_REMINDER', 2); + + /** + * Matrix index to get error correction level from $capacity array. + */ + define('QRCAP_EC', 3); + + // ----------------------------------------------------- + + // Structure (currently usupported) + + /** + * Number of header bits for structured mode + */ + define('STRUCTURE_HEADER_BITS', 20); + + /** + * Max number of symbols for structured mode + */ + define('MAX_STRUCTURED_SYMBOLS', 16); + + // ----------------------------------------------------- + + // Masks + + /** + * Down point base value for case 1 mask pattern (concatenation of same color in a line or a column) + */ + define('N1', 3); + + /** + * Down point base value for case 2 mask pattern (module block of same color) + */ + define('N2', 3); + + /** + * Down point base value for case 3 mask pattern (1:1:3:1:1(dark:bright:dark:bright:dark)pattern in a line or a column) + */ + define('N3', 40); + + /** + * Down point base value for case 4 mask pattern (ration of dark modules in whole) + */ + define('N4', 10); + + // ----------------------------------------------------- + + // Optimization settings + + /** + * if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code + */ + define('QR_FIND_BEST_MASK', true); + + /** + * if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly + */ + define('QR_FIND_FROM_RANDOM', 2); + + /** + * when QR_FIND_BEST_MASK === false + */ + define('QR_DEFAULT_MASK', 2); + + // ----------------------------------------------------- + +} // end of definitions + +// #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*# + +if (!class_exists('QRcode', false)) { + + // for compaibility with PHP4 + if (!function_exists('str_split')) { + /** + * Convert a string to an array (needed for PHP4 compatibility) + * @param string $string The input string. + * @param int $split_length Maximum length of the chunk. + * @return If the optional split_length parameter is specified, the returned array will be broken down into chunks with each being split_length in length, otherwise each chunk will be one character in length. FALSE is returned if split_length is less than 1. If the split_length length exceeds the length of string , the entire string is returned as the first (and only) array element. + */ + function str_split($string, $split_length=1) { + if ((strlen($string) > $split_length) OR (!$split_length)) { + do { + $c = strlen($string); + $parts[] = substr($string, 0, $split_length); + $string = substr($string, $split_length); + } while ($string !== false); + } else { + $parts = array($string); + } + return $parts; + } + } + + // ##################################################### + + /** + * Class to create QR-code arrays for TCPDF class. + * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD. + * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness. + * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004. + * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode. + * + * This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html). + * Please read comments on this class source file for full copyright and license information. + * + * @name QRcode + * @package com.tecnick.tcpdf + * @abstract Class for generating QR-code array for TCPDF. + * @author Nicola Asuni + * @copyright 2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com + * @link http://www.tcpdf.org + * @license http://www.gnu.org/copyleft/lesser.html LGPL + * @version 1.0.002 + */ + class QRcode { + + /** + * @var barcode array to be returned which is readable by TCPDF + * @access protected + */ + protected $barcode_array = array(); + + /** + * @var QR code version. Size of QRcode is defined as version. Version is from 1 to 40. Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases. So version 40 is 177*177 matrix. + * @access protected + */ + protected $version = 0; + + /** + * @var Levels of error correction. See definitions for possible values. + * @access protected + */ + protected $level = QR_ECLEVEL_L; + + /** + * @var Encoding mode + * @access protected + */ + protected $hint = QR_MODE_8B; + + /** + * @var if true the input string will be converted to uppercase + * @access protected + */ + protected $casesensitive = true; + + /** + * @var structured QR code (not supported yet) + * @access protected + */ + protected $structured = 0; + + /** + * @var mask data + * @access protected + */ + protected $data; + + // FrameFiller + + /** + * @var width + * @access protected + */ + protected $width; + + /** + * @var frame + * @access protected + */ + protected $frame; + + /** + * @var X position of bit + * @access protected + */ + protected $x; + + /** + * @var Y position of bit + * @access protected + */ + protected $y; + + /** + * @var direction + * @access protected + */ + protected $dir; + + /** + * @var single bit + * @access protected + */ + protected $bit; + + // ---- QRrawcode ---- + + /** + * @var data code + * @access protected + */ + protected $datacode = array(); + + /** + * @var error correction code + * @access protected + */ + protected $ecccode = array(); + + /** + * @var blocks + * @access protected + */ + protected $blocks; + + /** + * @var Reed-Solomon blocks + * @access protected + */ + protected $rsblocks = array(); //of RSblock + + /** + * @var counter + * @access protected + */ + protected $count; + + /** + * @var data length + * @access protected + */ + protected $dataLength; + + /** + * @var error correction length + * @access protected + */ + protected $eccLength; + + /** + * @var b1 + * @access protected + */ + protected $b1; + + // ---- QRmask ---- + + /** + * @var run length + * @access protected + */ + protected $runLength = array(); + + // ---- QRsplit ---- + + /** + * @var input data string + * @access protected + */ + protected $dataStr = ''; + + /** + * @var input items + * @access protected + */ + protected $items; + + // Reed-Solomon items + + /** + * @var Reed-Solomon items + * @access protected + */ + protected $rsitems = array(); + + /** + * @var array of frames + * @access protected + */ + protected $frames = array(); + + /** + * @var alphabet-numeric convesion table + * @access protected + */ + protected $anTable = array( + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // + 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, // + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, // + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, // + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, // + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 // + ); + + /** + * @var array Table of the capacity of symbols + * See Table 1 (pp.13) and Table 12-16 (pp.30-36), JIS X0510:2004. + * @access protected + */ + protected $capacity = array( + array( 0, 0, 0, array( 0, 0, 0, 0)), // + array( 21, 26, 0, array( 7, 10, 13, 17)), // 1 + array( 25, 44, 7, array( 10, 16, 22, 28)), // + array( 29, 70, 7, array( 15, 26, 36, 44)), // + array( 33, 100, 7, array( 20, 36, 52, 64)), // + array( 37, 134, 7, array( 26, 48, 72, 88)), // 5 + array( 41, 172, 7, array( 36, 64, 96, 112)), // + array( 45, 196, 0, array( 40, 72, 108, 130)), // + array( 49, 242, 0, array( 48, 88, 132, 156)), // + array( 53, 292, 0, array( 60, 110, 160, 192)), // + array( 57, 346, 0, array( 72, 130, 192, 224)), // 10 + array( 61, 404, 0, array( 80, 150, 224, 264)), // + array( 65, 466, 0, array( 96, 176, 260, 308)), // + array( 69, 532, 0, array( 104, 198, 288, 352)), // + array( 73, 581, 3, array( 120, 216, 320, 384)), // + array( 77, 655, 3, array( 132, 240, 360, 432)), // 15 + array( 81, 733, 3, array( 144, 280, 408, 480)), // + array( 85, 815, 3, array( 168, 308, 448, 532)), // + array( 89, 901, 3, array( 180, 338, 504, 588)), // + array( 93, 991, 3, array( 196, 364, 546, 650)), // + array( 97, 1085, 3, array( 224, 416, 600, 700)), // 20 + array(101, 1156, 4, array( 224, 442, 644, 750)), // + array(105, 1258, 4, array( 252, 476, 690, 816)), // + array(109, 1364, 4, array( 270, 504, 750, 900)), // + array(113, 1474, 4, array( 300, 560, 810, 960)), // + array(117, 1588, 4, array( 312, 588, 870, 1050)), // 25 + array(121, 1706, 4, array( 336, 644, 952, 1110)), // + array(125, 1828, 4, array( 360, 700, 1020, 1200)), // + array(129, 1921, 3, array( 390, 728, 1050, 1260)), // + array(133, 2051, 3, array( 420, 784, 1140, 1350)), // + array(137, 2185, 3, array( 450, 812, 1200, 1440)), // 30 + array(141, 2323, 3, array( 480, 868, 1290, 1530)), // + array(145, 2465, 3, array( 510, 924, 1350, 1620)), // + array(149, 2611, 3, array( 540, 980, 1440, 1710)), // + array(153, 2761, 3, array( 570, 1036, 1530, 1800)), // + array(157, 2876, 0, array( 570, 1064, 1590, 1890)), // 35 + array(161, 3034, 0, array( 600, 1120, 1680, 1980)), // + array(165, 3196, 0, array( 630, 1204, 1770, 2100)), // + array(169, 3362, 0, array( 660, 1260, 1860, 2220)), // + array(173, 3532, 0, array( 720, 1316, 1950, 2310)), // + array(177, 3706, 0, array( 750, 1372, 2040, 2430)) // 40 + ); + + /** + * @var array Length indicator + * @access protected + */ + protected $lengthTableBits = array( + array(10, 12, 14), + array( 9, 11, 13), + array( 8, 16, 16), + array( 8, 10, 12) + ); + + /** + * @var array Table of the error correction code (Reed-Solomon block) + * See Table 12-16 (pp.30-36), JIS X0510:2004. + * @access protected + */ + protected $eccTable = array( + array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), // + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1 + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // + array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), // + array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), // + array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5 + array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), // + array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), // + array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), // + array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), // + array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), // 10 + array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), // + array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), // + array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), // + array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), // + array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), // 15 + array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), // + array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), // + array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), // + array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), // + array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), // 20 + array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), // + array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), // + array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), // + array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), // + array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), // 25 + array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), // + array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), // + array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), // + array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), // + array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), // 30 + array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), // + array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), // + array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), // + array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), // + array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), // 35 + array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), // + array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), // + array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), // + array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), // + array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)) // 40 + ); + + /** + * @var array Positions of alignment patterns. + * This array includes only the second and the third position of the alignment patterns. Rest of them can be calculated from the distance between them. + * See Table 1 in Appendix E (pp.71) of JIS X0510:2004. + * @access protected + */ + protected $alignmentPattern = array( + array( 0, 0), + array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5 + array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10 + array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), // 11-15 + array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), // 16-20 + array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), // 21-25 + array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), // 26-30 + array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), // 31-35 + array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58) // 35-40 + ); + + /** + * @var array Version information pattern (BCH coded). + * See Table 1 in Appendix D (pp.68) of JIS X0510:2004. + * size: [QRSPEC_VERSION_MAX - 6] + * @access protected + */ + protected $versionPattern = array( + 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, // + 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, // + 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, // + 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, // + 0x27541, 0x28c69 + ); + + /** + * @var array Format information + * @access protected + */ + protected $formatInfo = array( + array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), // + array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), // + array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), // + array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) // + ); + + + // ------------------------------------------------- + // ------------------------------------------------- + + + /** + * This is the class constructor. + * Creates a QRcode object + * @param string $code code to represent using QRcode + * @param string $eclevel error level: <ul><li>L : About 7% or less errors can be corrected.</li><li>M : About 15% or less errors can be corrected.</li><li>Q : About 25% or less errors can be corrected.</li><li>H : About 30% or less errors can be corrected.</li></ul> + * @access public + * @since 1.0.000 + */ + public function __construct($code, $eclevel = 'L') { + $barcode_array = array(); + if ((is_null($code)) OR ($code == '\0') OR ($code == '')) { + return false; + } + // set error correction level + $this->level = array_search($eclevel, array('L', 'M', 'Q', 'H')); + if ($this->level === false) { + $this->level = QR_ECLEVEL_L; + } + if (($this->hint != QR_MODE_8B) AND ($this->hint != QR_MODE_KJ)) { + return false; + } + if (($this->version < 0) OR ($this->version > QRSPEC_VERSION_MAX)) { + return false; + } + $this->items = array(); + $this->encodeString($code); + $qrTab = $this->binarize($this->data); + $size = count($qrTab); + $barcode_array['num_rows'] = $size; + $barcode_array['num_cols'] = $size; + $barcode_array['bcode'] = array(); + foreach ($qrTab as $line) { + $arrAdd = array(); + foreach (str_split($line) as $char) { + $arrAdd[] = ($char=='1')?1:0; + } + $barcode_array['bcode'][] = $arrAdd; + } + $this->barcode_array = $barcode_array; + } + + /** + * Returns a barcode array which is readable by TCPDF + * @return array barcode array readable by TCPDF; + * @access public + */ + public function getBarcodeArray() { + return $this->barcode_array; + } + + /** + * Convert the frame in binary form + * @param array $frame array to binarize + * @return array frame in binary form + */ + protected function binarize($frame) { + $len = count($frame); + // the frame is square (width = height) + foreach ($frame as &$frameLine) { + for ($i=0; $i<$len; $i++) { + $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0'; + } + } + return $frame; + } + + /** + * Encode the input string to QR code + * @param string $string input string to encode + */ + protected function encodeString($string) { + $this->dataStr = $string; + if (!$this->casesensitive) { + $this->toUpper(); + } + $ret = $this->splitString(); + if ($ret < 0) { + return NULL; + } + $this->encodeMask(-1); + } + + /** + * Encode mask + * @param int $mask masking mode + */ + protected function encodeMask($mask) { + $spec = array(0, 0, 0, 0, 0); + $this->datacode = $this->getByteStream($this->items); + if (is_null($this->datacode)) { + return NULL; + } + $spec = $this->getEccSpec($this->version, $this->level, $spec); + $this->b1 = $this->rsBlockNum1($spec); + $this->dataLength = $this->rsDataLength($spec); + $this->eccLength = $this->rsEccLength($spec); + $this->ecccode = array_fill(0, $this->eccLength, 0); + $this->blocks = $this->rsBlockNum($spec); + $ret = $this->init($spec); + if ($ret < 0) { + return NULL; + } + $this->count = 0; + $this->width = $this->getWidth($this->version); + $this->frame = $this->newFrame($this->version); + $this->x = $this->width - 1; + $this->y = $this->width - 1; + $this->dir = -1; + $this->bit = -1; + // inteleaved data and ecc codes + for ($i=0; $i < ($this->dataLength + $this->eccLength); $i++) { + $code = $this->getCode(); + $bit = 0x80; + for ($j=0; $j<8; $j++) { + $addr = $this->getNextPosition(); + $this->setFrameAt($addr, 0x02 | (($bit & $code) != 0)); + $bit = $bit >> 1; + } + } + // remainder bits + $j = $this->getRemainder($this->version); + for ($i=0; $i<$j; $i++) { + $addr = $this->getNextPosition(); + $this->setFrameAt($addr, 0x02); + } + // masking + $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0); + if ($mask < 0) { + if (QR_FIND_BEST_MASK) { + $masked = $this->mask($this->width, $this->frame, $this->level); + } else { + $masked = $this->makeMask($this->width, $this->frame, (intval(QR_DEFAULT_MASK) % 8), $this->level); + } + } else { + $masked = $this->makeMask($this->width, $this->frame, $mask, $this->level); + } + if ($masked == NULL) { + return NULL; + } + $this->data = $masked; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // FrameFiller + + /** + * Set frame value at specified position + * @param array $at x,y position + * @param int $val value of the character to set + */ + protected function setFrameAt($at, $val) { + $this->frame[$at['y']][$at['x']] = chr($val); + } + + /** + * Get frame value at specified position + * @param array $at x,y position + * @return value at specified position + */ + protected function getFrameAt($at) { + return ord($this->frame[$at['y']][$at['x']]); + } + + /** + * Return the next frame position + * @return array of x,y coordinates + */ + protected function getNextPosition() { + do { + if ($this->bit == -1) { + $this->bit = 0; + return array('x'=>$this->x, 'y'=>$this->y); + } + $x = $this->x; + $y = $this->y; + $w = $this->width; + if ($this->bit == 0) { + $x--; + $this->bit++; + } else { + $x++; + $y += $this->dir; + $this->bit--; + } + if ($this->dir < 0) { + if ($y < 0) { + $y = 0; + $x -= 2; + $this->dir = 1; + if ($x == 6) { + $x--; + $y = 9; + } + } + } else { + if ($y == $w) { + $y = $w - 1; + $x -= 2; + $this->dir = -1; + if ($x == 6) { + $x--; + $y -= 8; + } + } + } + if (($x < 0) OR ($y < 0)) { + return NULL; + } + $this->x = $x; + $this->y = $y; + } while(ord($this->frame[$y][$x]) & 0x80); + return array('x'=>$x, 'y'=>$y); + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRrawcode + + /** + * Initialize code. + * @param array $spec array of ECC specification + * @return 0 in case of success, -1 in case of error + */ + protected function init($spec) { + $dl = $this->rsDataCodes1($spec); + $el = $this->rsEccCodes1($spec); + $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + $blockNo = 0; + $dataPos = 0; + $eccPos = 0; + $endfor = $this->rsBlockNum1($spec); + for ($i=0; $i < $endfor; ++$i) { + $ecc = array_slice($this->ecccode, $eccPos); + $this->rsblocks[$blockNo] = array(); + $this->rsblocks[$blockNo]['dataLength'] = $dl; + $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos); + $this->rsblocks[$blockNo]['eccLength'] = $el; + $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc); + $this->rsblocks[$blockNo]['ecc'] = $ecc; + $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + if ($this->rsBlockNum2($spec) == 0) { + return 0; + } + $dl = $this->rsDataCodes2($spec); + $el = $this->rsEccCodes2($spec); + $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + if ($rs == NULL) { + return -1; + } + $endfor = $this->rsBlockNum2($spec); + for ($i=0; $i < $endfor; ++$i) { + $ecc = array_slice($this->ecccode, $eccPos); + $this->rsblocks[$blockNo] = array(); + $this->rsblocks[$blockNo]['dataLength'] = $dl; + $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos); + $this->rsblocks[$blockNo]['eccLength'] = $el; + $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc); + $this->rsblocks[$blockNo]['ecc'] = $ecc; + $this->ecccode = array_merge(array_slice($this->ecccode, 0, $eccPos), $ecc); + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + return 0; + } + + /** + * Return Reed-Solomon block code. + * @return array rsblocks + */ + protected function getCode() { + if ($this->count < $this->dataLength) { + $row = $this->count % $this->blocks; + $col = $this->count / $this->blocks; + if ($col >= $this->rsblocks[0]['dataLength']) { + $row += $this->b1; + } + $ret = $this->rsblocks[$row]['data'][$col]; + } elseif ($this->count < $this->dataLength + $this->eccLength) { + $row = ($this->count - $this->dataLength) % $this->blocks; + $col = ($this->count - $this->dataLength) / $this->blocks; + $ret = $this->rsblocks[$row]['ecc'][$col]; + } else { + return 0; + } + $this->count++; + return $ret; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRmask + + /** + * Write Format Information on frame and returns the number of black bits + * @param int $width frame width + * @param array $frame frame + * @param array $mask masking mode + * @param int $level error correction level + * @return int blacks + */ + protected function writeFormatInformation($width, &$frame, $mask, $level) { + $blacks = 0; + $format = $this->getFormatInfo($mask, $level); + for ($i=0; $i<8; ++$i) { + if ($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + $frame[8][$width - 1 - $i] = chr($v); + if ($i < 6) { + $frame[$i][8] = chr($v); + } else { + $frame[$i + 1][8] = chr($v); + } + $format = $format >> 1; + } + for ($i=0; $i<7; ++$i) { + if ($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + $frame[$width - 7 + $i][8] = chr($v); + if ($i == 0) { + $frame[8][7] = chr($v); + } else { + $frame[8][6 - $i] = chr($v); + } + $format = $format >> 1; + } + return $blacks; + } + + /** + * mask0 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask0($x, $y) { + return ($x + $y) & 1; + } + + /** + * mask1 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask1($x, $y) { + return ($y & 1); + } + + /** + * mask2 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask2($x, $y) { + return ($x % 3); + } + + /** + * mask3 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask3($x, $y) { + return ($x + $y) % 3; + } + + /** + * mask4 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask4($x, $y) { + return (((int)($y / 2)) + ((int)($x / 3))) & 1; + } + + /** + * mask5 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask5($x, $y) { + return (($x * $y) & 1) + ($x * $y) % 3; + } + + /** + * mask6 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask6($x, $y) { + return ((($x * $y) & 1) + ($x * $y) % 3) & 1; + } + + /** + * mask7 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask7($x, $y) { + return ((($x * $y) % 3) + (($x + $y) & 1)) & 1; + } + + /** + * Return bitmask + * @param int $maskNo mask number + * @param int $width width + * @param array $frame frame + * @return array bitmask + */ + protected function generateMaskNo($maskNo, $width, $frame) { + $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); + for ($y=0; $y<$width; ++$y) { + for ($x=0; $x<$width; ++$x) { + if (ord($frame[$y][$x]) & 0x80) { + $bitMask[$y][$x] = 0; + } else { + $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y); + $bitMask[$y][$x] = ($maskFunc == 0)?1:0; + } + } + } + return $bitMask; + } + + /** + * makeMaskNo + * @param int $maskNo + * @param int $width + * @param int $s + * @param int $d + * @param boolean $maskGenOnly + * @return int b + */ + protected function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly=false) { + $b = 0; + $bitMask = array(); + $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); + if ($maskGenOnly) { + return; + } + $d = $s; + for ($y=0; $y<$width; ++$y) { + for ($x=0; $x<$width; ++$x) { + if ($bitMask[$y][$x] == 1) { + $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]); + } + $b += (int)(ord($d[$y][$x]) & 1); + } + } + return $b; + } + + /** + * makeMask + * @param int $width + * @param array $frame + * @param int $maskNo + * @param int $level + * @return array mask + */ + protected function makeMask($width, $frame, $maskNo, $level) { + $masked = array_fill(0, $width, str_repeat("\0", $width)); + $this->makeMaskNo($maskNo, $width, $frame, $masked); + $this->writeFormatInformation($width, $masked, $maskNo, $level); + return $masked; + } + + /** + * calcN1N3 + * @param int $length + * @return int demerit + */ + protected function calcN1N3($length) { + $demerit = 0; + for ($i=0; $i<$length; ++$i) { + if ($this->runLength[$i] >= 5) { + $demerit += (N1 + ($this->runLength[$i] - 5)); + } + if ($i & 1) { + if (($i >= 3) AND ($i < ($length-2)) AND ($this->runLength[$i] % 3 == 0)) { + $fact = (int)($this->runLength[$i] / 3); + if (($this->runLength[$i-2] == $fact) + AND ($this->runLength[$i-1] == $fact) + AND ($this->runLength[$i+1] == $fact) + AND ($this->runLength[$i+2] == $fact)) { + if (($this->runLength[$i-3] < 0) OR ($this->runLength[$i-3] >= (4 * $fact))) { + $demerit += N3; + } elseif ((($i+3) >= $length) OR ($this->runLength[$i+3] >= (4 * $fact))) { + $demerit += N3; + } + } + } + } + } + return $demerit; + } + + /** + * evaluateSymbol + * @param int $width + * @param array $frame + * @return int demerit + */ + protected function evaluateSymbol($width, $frame) { + $head = 0; + $demerit = 0; + for ($y=0; $y<$width; ++$y) { + $head = 0; + $this->runLength[0] = 1; + $frameY = $frame[$y]; + if ($y > 0) { + $frameYM = $frame[$y-1]; + } + for ($x=0; $x<$width; ++$x) { + if (($x > 0) AND ($y > 0)) { + $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]); + $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]); + if (($b22 | ($w22 ^ 1)) & 1) { + $demerit += N2; + } + } + if (($x == 0) AND (ord($frameY[$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } elseif ($x > 0) { + if ((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + $demerit += $this->calcN1N3($head+1); + } + for ($x=0; $x<$width; ++$x) { + $head = 0; + $this->runLength[0] = 1; + for ($y=0; $y<$width; ++$y) { + if (($y == 0) AND (ord($frame[$y][$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } elseif ($y > 0) { + if ((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + $demerit += $this->calcN1N3($head+1); + } + return $demerit; + } + + /** + * mask + * @param int $width + * @param array $frame + * @param int $level + * @return array best mask + */ + protected function mask($width, $frame, $level) { + $minDemerit = PHP_INT_MAX; + $bestMaskNum = 0; + $bestMask = array(); + $checked_masks = array(0, 1, 2, 3, 4, 5, 6, 7); + if (QR_FIND_FROM_RANDOM !== false) { + $howManuOut = 8 - (QR_FIND_FROM_RANDOM % 9); + for ($i = 0; $i < $howManuOut; ++$i) { + $remPos = rand (0, count($checked_masks)-1); + unset($checked_masks[$remPos]); + $checked_masks = array_values($checked_masks); + } + } + $bestMask = $frame; + foreach ($checked_masks as $i) { + $mask = array_fill(0, $width, str_repeat("\0", $width)); + $demerit = 0; + $blacks = 0; + $blacks = $this->makeMaskNo($i, $width, $frame, $mask); + $blacks += $this->writeFormatInformation($width, $mask, $i, $level); + $blacks = (int)(100 * $blacks / ($width * $width)); + $demerit = (int)((int)(abs($blacks - 50) / 5) * N4); + $demerit += $this->evaluateSymbol($width, $mask); + if ($demerit < $minDemerit) { + $minDemerit = $demerit; + $bestMask = $mask; + $bestMaskNum = $i; + } + } + return $bestMask; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRsplit + + /** + * Return true if the character at specified position is a number + * @param string $str string + * @param int $pos characted position + * @return boolean true of false + */ + protected function isdigitat($str, $pos) { + if ($pos >= strlen($str)) { + return false; + } + return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9'))); + } + + /** + * Return true if the character at specified position is an alphanumeric character + * @param string $str string + * @param int $pos characted position + * @return boolean true of false + */ + protected function isalnumat($str, $pos) { + if ($pos >= strlen($str)) { + return false; + } + return ($this->lookAnTable(ord($str[$pos])) >= 0); + } + + /** + * identifyMode + * @param int $pos + * @return int mode + */ + protected function identifyMode($pos) { + if ($pos >= strlen($this->dataStr)) { + return QR_MODE_NL; + } + $c = $this->dataStr[$pos]; + if ($this->isdigitat($this->dataStr, $pos)) { + return QR_MODE_NM; + } elseif ($this->isalnumat($this->dataStr, $pos)) { + return QR_MODE_AN; + } elseif ($this->hint == QR_MODE_KJ) { + if ($pos+1 < strlen($this->dataStr)) { + $d = $this->dataStr[$pos+1]; + $word = (ord($c) << 8) | ord($d); + if (($word >= 0x8140 && $word <= 0x9ffc) OR ($word >= 0xe040 && $word <= 0xebbf)) { + return QR_MODE_KJ; + } + } + } + return QR_MODE_8B; + } + + /** + * eatNum + * @return int run + */ + protected function eatNum() { + $ln = $this->lengthIndicator(QR_MODE_NM, $this->version); + $p = 0; + while($this->isdigitat($this->dataStr, $p)) { + $p++; + } + $run = $p; + $mode = $this->identifyMode($p); + if ($mode == QR_MODE_8B) { + $dif = $this->estimateBitsModeNum($run) + 4 + $ln + + $this->estimateBitsMode8(1) // + 4 + l8 + - $this->estimateBitsMode8($run + 1); // - 4 - l8 + if ($dif > 0) { + return $this->eat8(); + } + } + if ($mode == QR_MODE_AN) { + $dif = $this->estimateBitsModeNum($run) + 4 + $ln + + $this->estimateBitsModeAn(1) // + 4 + la + - $this->estimateBitsModeAn($run + 1);// - 4 - la + if ($dif > 0) { + return $this->eatAn(); + } + } + $this->items = $this->appendNewInputItem($this->items, QR_MODE_NM, $run, str_split($this->dataStr)); + return $run; + } + + /** + * eatAn + * @return int run + */ + protected function eatAn() { + $la = $this->lengthIndicator(QR_MODE_AN, $this->version); + $ln = $this->lengthIndicator(QR_MODE_NM, $this->version); + $p = 0; + while($this->isalnumat($this->dataStr, $p)) { + if ($this->isdigitat($this->dataStr, $p)) { + $q = $p; + while($this->isdigitat($this->dataStr, $q)) { + $q++; + } + $dif = $this->estimateBitsModeAn($p) // + 4 + la + + $this->estimateBitsModeNum($q - $p) + 4 + $ln + - $this->estimateBitsModeAn($q); // - 4 - la + if ($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + $run = $p; + if (!$this->isalnumat($this->dataStr, $p)) { + $dif = $this->estimateBitsModeAn($run) + 4 + $la + + $this->estimateBitsMode8(1) // + 4 + l8 + - $this->estimateBitsMode8($run + 1); // - 4 - l8 + if ($dif > 0) { + return $this->eat8(); + } + } + $this->items = $this->appendNewInputItem($this->items, QR_MODE_AN, $run, str_split($this->dataStr)); + return $run; + } + + /** + * eatKanji + * @return int run + */ + protected function eatKanji() { + $p = 0; + while($this->identifyMode($p) == QR_MODE_KJ) { + $p += 2; + } + $this->items = $this->appendNewInputItem($this->items, QR_MODE_KJ, $p, str_split($this->dataStr)); + return $run; + } + + /** + * eat8 + * @return int run + */ + protected function eat8() { + $la = $this->lengthIndicator(QR_MODE_AN, $this->version); + $ln = $this->lengthIndicator(QR_MODE_NM, $this->version); + $p = 1; + $dataStrLen = strlen($this->dataStr); + while($p < $dataStrLen) { + $mode = $this->identifyMode($p); + if ($mode == QR_MODE_KJ) { + break; + } + if ($mode == QR_MODE_NM) { + $q = $p; + while($this->isdigitat($this->dataStr, $q)) { + $q++; + } + $dif = $this->estimateBitsMode8($p) // + 4 + l8 + + $this->estimateBitsModeNum($q - $p) + 4 + $ln + - $this->estimateBitsMode8($q); // - 4 - l8 + if ($dif < 0) { + break; + } else { + $p = $q; + } + } elseif ($mode == QR_MODE_AN) { + $q = $p; + while($this->isalnumat($this->dataStr, $q)) { + $q++; + } + $dif = $this->estimateBitsMode8($p) // + 4 + l8 + + $this->estimateBitsModeAn($q - $p) + 4 + $la + - $this->estimateBitsMode8($q); // - 4 - l8 + if ($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + $run = $p; + $this->items = $this->appendNewInputItem($this->items, QR_MODE_8B, $run, str_split($this->dataStr)); + return $run; + } + + /** + * splitString + */ + protected function splitString() { + while (strlen($this->dataStr) > 0) { + if ($this->dataStr == '') { + return 0; + } + $mode = $this->identifyMode(0); + switch ($mode) { + case QR_MODE_NM: { + $length = $this->eatNum(); + break; + } + case QR_MODE_AN: { + $length = $this->eatAn(); + break; + } + case QR_MODE_KJ: { + if ($hint == QR_MODE_KJ) { + $length = $this->eatKanji(); + } else { + $length = $this->eat8(); + } + break; + } + default: { + $length = $this->eat8(); + break; + } + } + if ($length == 0) { + return 0; + } + if ($length < 0) { + return -1; + } + $this->dataStr = substr($this->dataStr, $length); + } + } + + /** + * toUpper + */ + protected function toUpper() { + $stringLen = strlen($this->dataStr); + $p = 0; + while ($p < $stringLen) { + $mode = $this->identifyMode(substr($this->dataStr, $p), $this->hint); + if ($mode == QR_MODE_KJ) { + $p += 2; + } else { + if ((ord($this->dataStr[$p]) >= ord('a')) AND (ord($this->dataStr[$p]) <= ord('z'))) { + $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32); + } + $p++; + } + } + return $this->dataStr; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRinputItem + + /** + * newInputItem + * @param int $mode + * @param int $size + * @param array $data + * @param array $bstream + * @return array input item + */ + protected function newInputItem($mode, $size, $data, $bstream=null) { + $setData = array_slice($data, 0, $size); + if (count($setData) < $size) { + $setData = array_merge($setData, array_fill(0, ($size - count($setData)), 0)); + } + if (!$this->check($mode, $size, $setData)) { + return NULL; + } + $inputitem = array(); + $inputitem['mode'] = $mode; + $inputitem['size'] = $size; + $inputitem['data'] = $setData; + $inputitem['bstream'] = $bstream; + return $inputitem; + } + + /** + * encodeModeNum + * @param array $inputitem + * @param int $version + * @return array input item + */ + protected function encodeModeNum($inputitem, $version) { + $words = (int)($inputitem['size'] / 3); + $inputitem['bstream'] = array(); + $val = 0x1; + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_NM, $version), $inputitem['size']); + for ($i=0; $i < $words; ++$i) { + $val = (ord($inputitem['data'][$i*3 ]) - ord('0')) * 100; + $val += (ord($inputitem['data'][$i*3+1]) - ord('0')) * 10; + $val += (ord($inputitem['data'][$i*3+2]) - ord('0')); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 10, $val); + } + if ($inputitem['size'] - $words * 3 == 1) { + $val = ord($inputitem['data'][$words*3]) - ord('0'); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val); + } elseif (($inputitem['size'] - ($words * 3)) == 2) { + $val = (ord($inputitem['data'][$words*3 ]) - ord('0')) * 10; + $val += (ord($inputitem['data'][$words*3+1]) - ord('0')); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 7, $val); + } + return $inputitem; + } + + /** + * encodeModeAn + * @param array $inputitem + * @param int $version + * @return array input item + */ + protected function encodeModeAn($inputitem, $version) { + $words = (int)($inputitem['size'] / 2); + $inputitem['bstream'] = array(); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x02); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_AN, $version), $inputitem['size']); //DEBUG + for ($i=0; $i < $words; ++$i) { + $val = (int)$this->lookAnTable(ord($inputitem['data'][$i*2 ])) * 45; + $val += (int)$this->lookAnTable(ord($inputitem['data'][$i*2+1])); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 11, $val); + } + if ($inputitem['size'] & 1) { + $val = $this->lookAnTable(ord($inputitem['data'][($words * 2)])); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 6, $val); + } + return $inputitem; + } + + /** + * encodeMode8 + * @param array $inputitem + * @param int $version + * @return array input item + */ + protected function encodeMode8($inputitem, $version) { + $inputitem['bstream'] = array(); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x4); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_8B, $version), $inputitem['size']); + for ($i=0; $i < $inputitem['size']; ++$i) { + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][$i])); + } + return $inputitem; + } + + /** + * encodeModeKanji + * @param array $inputitem + * @param int $version + * @return array input item + */ + protected function encodeModeKanji($inputitem, $version) { + $inputitem['bstream'] = array(); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x8); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_KJ, $version), (int)($inputitem['size'] / 2)); + for ($i=0; $i<$inputitem['size']; $i+=2) { + $val = (ord($inputitem['data'][$i]) << 8) | ord($inputitem['data'][$i+1]); + if ($val <= 0x9ffc) { + $val -= 0x8140; + } else { + $val -= 0xc140; + } + $h = ($val >> 8) * 0xc0; + $val = ($val & 0xff) + $h; + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 13, $val); + } + return $inputitem; + } + + /** + * encodeModeStructure + * @param array $inputitem + * @return array input item + */ + protected function encodeModeStructure($inputitem) { + $inputitem['bstream'] = array(); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x03); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][1]) - 1); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][0]) - 1); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][2])); + return $inputitem; + } + + /** + * encodeBitStream + * @param array $inputitem + * @param int $version + * @return array input item + */ + protected function encodeBitStream($inputitem, $version) { + $inputitem['bstream'] = array(); + $words = $this->maximumWords($inputitem['mode'], $version); + if ($inputitem['size'] > $words) { + $st1 = $this->newInputItem($inputitem['mode'], $words, $inputitem['data']); + $st2 = $this->newInputItem($inputitem['mode'], $inputitem['size'] - $words, array_slice($inputitem['data'], $words)); + $st1 = $this->encodeBitStream($st1, $version); + $st2 = $this->encodeBitStream($st2, $version); + $inputitem['bstream'] = array(); + $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st1['bstream']); + $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st2['bstream']); + } else { + switch($inputitem['mode']) { + case QR_MODE_NM: { + $inputitem = $this->encodeModeNum($inputitem, $version); + break; + } + case QR_MODE_AN: { + $inputitem = $this->encodeModeAn($inputitem, $version); + break; + } + case QR_MODE_8B: { + $inputitem = $this->encodeMode8($inputitem, $version); + break; + } + case QR_MODE_KJ: { + $inputitem = $this->encodeModeKanji($inputitem, $version); + break; + } + case QR_MODE_ST: { + $inputitem = $this->encodeModeStructure($inputitem); + break; + } + default: { + break; + } + } + } + return $inputitem; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRinput + + /** + * Append data to an input object. + * The data is copied and appended to the input object. + * @param array items input items + * @param int $mode encoding mode. + * @param int $size size of data (byte). + * @param array $data array of input data. + * @return items + * + */ + protected function appendNewInputItem($items, $mode, $size, $data) { + $items[] = $this->newInputItem($mode, $size, $data); + return $items; + } + + /** + * insertStructuredAppendHeader + * @param array $items + * @param int $size + * @param int $index + * @param int $parity + * @return array items + */ + protected function insertStructuredAppendHeader($items, $size, $index, $parity) { + if ($size > MAX_STRUCTURED_SYMBOLS) { + return -1; + } + if (($index <= 0) OR ($index > MAX_STRUCTURED_SYMBOLS)) { + return -1; + } + $buf = array($size, $index, $parity); + $entry = $this->newInputItem(QR_MODE_ST, 3, buf); + array_unshift($items, $entry); + return $items; + } + + /** + * calcParity + * @param array $items + * @return int parity + */ + protected function calcParity($items) { + $parity = 0; + foreach ($items as $item) { + if ($item['mode'] != QR_MODE_ST) { + for ($i=$item['size']-1; $i>=0; --$i) { + $parity ^= $item['data'][$i]; + } + } + } + return $parity; + } + + /** + * checkModeNum + * @param int $size + * @param array $data + * @return boolean true or false + */ + protected function checkModeNum($size, $data) { + for ($i=0; $i<$size; ++$i) { + if ((ord($data[$i]) < ord('0')) OR (ord($data[$i]) > ord('9'))){ + return false; + } + } + return true; + } + + /** + * estimateBitsModeNum + * @param int $size + * @return int number of bits + */ + protected function estimateBitsModeNum($size) { + $w = (int)$size / 3; + $bits = $w * 10; + switch($size - $w * 3) { + case 1: { + $bits += 4; + break; + } + case 2: { + $bits += 7; + break; + } + default: { + break; + } + } + return $bits; + } + + /** + * Look up the alphabet-numeric convesion table (see JIS X0510:2004, pp.19). + * @param int $c character value + * @return value + */ + protected function lookAnTable($c) { + return (($c > 127)?-1:$this->anTable[$c]); + } + + /** + * checkModeAn + * @param int $size + * @param array $data + * @return boolean true or false + */ + protected function checkModeAn($size, $data) { + for ($i=0; $i<$size; ++$i) { + if ($this->lookAnTable(ord($data[$i])) == -1) { + return false; + } + } + return true; + } + + /** + * estimateBitsModeAn + * @param int $size + * @return int number of bits + */ + protected function estimateBitsModeAn($size) { + $w = (int)($size / 2); + $bits = $w * 11; + if ($size & 1) { + $bits += 6; + } + return $bits; + } + + /** + * estimateBitsMode8 + * @param int $size + * @return int number of bits + */ + protected function estimateBitsMode8($size) { + return $size * 8; + } + + /** + * estimateBitsModeKanji + * @param int $size + * @return int number of bits + */ + protected function estimateBitsModeKanji($size) { + return (int)(($size / 2) * 13); + } + + /** + * checkModeKanji + * @param int $size + * @param array $data + * @return boolean true or false + */ + protected function checkModeKanji($size, $data) { + if ($size & 1) { + return false; + } + for ($i=0; $i<$size; $i+=2) { + $val = (ord($data[$i]) << 8) | ord($data[$i+1]); + if (($val < 0x8140) OR (($val > 0x9ffc) AND ($val < 0xe040)) OR ($val > 0xebbf)) { + return false; + } + } + return true; + } + + /** + * Validate the input data. + * @param int $mode encoding mode. + * @param int $size size of data (byte). + * @param array data data to validate + * @return boolean true in case of valid data, false otherwise + */ + protected function check($mode, $size, $data) { + if ($size <= 0) { + return false; + } + switch($mode) { + case QR_MODE_NM: { + return $this->checkModeNum($size, $data); + } + case QR_MODE_AN: { + return $this->checkModeAn($size, $data); + } + case QR_MODE_KJ: { + return $this->checkModeKanji($size, $data); + } + case QR_MODE_8B: { + return true; + } + case QR_MODE_ST: { + return true; + } + default: { + break; + } + } + return false; + } + + /** + * estimateBitStreamSize + * @param array $items + * @param int $version + * @return int bits + */ + protected function estimateBitStreamSize($items, $version) { + $bits = 0; + if ($version == 0) { + $version = 1; + } + foreach ($items as $item) { + switch($item['mode']) { + case QR_MODE_NM: { + $bits = $this->estimateBitsModeNum($item['size']); + break; + } + case QR_MODE_AN: { + $bits = $this->estimateBitsModeAn($item['size']); + break; + } + case QR_MODE_8B: { + $bits = $this->estimateBitsMode8($item['size']); + break; + } + case QR_MODE_KJ: { + $bits = $this->estimateBitsModeKanji($item['size']); + break; + } + case QR_MODE_ST: { + return STRUCTURE_HEADER_BITS; + } + default: { + return 0; + } + } + $l = $this->lengthIndicator($item['mode'], $version); + $m = 1 << $l; + $num = (int)(($item['size'] + $m - 1) / $m); + $bits += $num * (4 + $l); + } + return $bits; + } + + /** + * estimateVersion + * @param array $items + * @return int version + */ + protected function estimateVersion($items) { + $version = 0; + $prev = 0; + do { + $prev = $version; + $bits = $this->estimateBitStreamSize($items, $prev); + $version = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if ($version < 0) { + return -1; + } + } while ($version > $prev); + return $version; + } + + /** + * lengthOfCode + * @param int $mode + * @param int $version + * @param int $bits + * @return int size + */ + protected function lengthOfCode($mode, $version, $bits) { + $payload = $bits - 4 - $this->lengthIndicator($mode, $version); + switch($mode) { + case QR_MODE_NM: { + $chunks = (int)($payload / 10); + $remain = $payload - $chunks * 10; + $size = $chunks * 3; + if ($remain >= 7) { + $size += 2; + } elseif ($remain >= 4) { + $size += 1; + } + break; + } + case QR_MODE_AN: { + $chunks = (int)($payload / 11); + $remain = $payload - $chunks * 11; + $size = $chunks * 2; + if ($remain >= 6) { + ++$size; + } + break; + } + case QR_MODE_8B: { + $size = (int)($payload / 8); + break; + } + case QR_MODE_KJ: { + $size = (int)(($payload / 13) * 2); + break; + } + case QR_MODE_ST: { + $size = (int)($payload / 8); + break; + } + default: { + $size = 0; + break; + } + } + $maxsize = $this->maximumWords($mode, $version); + if ($size < 0) { + $size = 0; + } + if ($size > $maxsize) { + $size = $maxsize; + } + return $size; + } + + /** + * createBitStream + * @param array $items + * @return array of items and total bits + */ + protected function createBitStream($items) { + $total = 0; + foreach ($items as $key => $item) { + $items[$key] = $this->encodeBitStream($item, $this->version); + $bits = count($items[$key]['bstream']); + $total += $bits; + } + return array($items, $total); + } + + /** + * convertData + * @param array $items + * @return array items + */ + protected function convertData($items) { + $ver = $this->estimateVersion($items); + if ($ver > $this->version) { + $this->version = $ver; + } + for (;;) { + $cbs = $this->createBitStream($items); + $items = $cbs[0]; + $bits = $cbs[1]; + if ($bits < 0) { + return -1; + } + $ver = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if ($ver < 0) { + return -1; + } elseif ($ver > $this->version) { + $this->version = $ver; + } else { + break; + } + } + return $items; + } + + /** + * Append Padding Bit to bitstream + * @param array $bstream + * @return array bitstream + */ + protected function appendPaddingBit($bstream) { + $bits = count($bstream); + $maxwords = $this->getDataLength($this->version, $this->level); + $maxbits = $maxwords * 8; + if ($maxbits == $bits) { + return 0; + } + if ($maxbits - $bits < 5) { + return $this->appendNum($bstream, $maxbits - $bits, 0); + } + $bits += 4; + $words = (int)(($bits + 7) / 8); + $padding = array(); + $padding = $this->appendNum($padding, $words * 8 - $bits + 4, 0); + $padlen = $maxwords - $words; + if ($padlen > 0) { + $padbuf = array(); + for ($i=0; $i<$padlen; ++$i) { + $padbuf[$i] = ($i&1)?0x11:0xec; + } + $padding = $this->appendBytes($padding, $padlen, $padbuf); + } + return $this->appendBitstream($bstream, $padding); + } + + /** + * mergeBitStream + * @param array $bstream + * @return array bitstream + */ + protected function mergeBitStream($items) { + $items = $this->convertData($items); + $bstream = array(); + foreach ($items as $item) { + $bstream = $this->appendBitstream($bstream, $item['bstream']); + } + return $bstream; + } + + /** + * Returns a stream of bits. + * @param int $items + * @return array padded merged byte stream + */ + protected function getBitStream($items) { + $bstream = $this->mergeBitStream($items); + return $this->appendPaddingBit($bstream); + } + + /** + * Pack all bit streams padding bits into a byte array. + * @param int $items + * @return array padded merged byte stream + */ + protected function getByteStream($items) { + $bstream = $this->getBitStream($items); + return $this->bitstreamToByte($bstream); + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRbitstream + + /** + * Return an array with zeros + * @param int $setLength array size + * @return array + */ + protected function allocate($setLength) { + return array_fill(0, $setLength, 0); + } + + /** + * Return new bitstream from number + * @param int $bits number of bits + * @param int $num number + * @return array bitstream + */ + protected function newFromNum($bits, $num) { + $bstream = $this->allocate($bits); + $mask = 1 << ($bits - 1); + for ($i=0; $i<$bits; ++$i) { + if ($num & $mask) { + $bstream[$i] = 1; + } else { + $bstream[$i] = 0; + } + $mask = $mask >> 1; + } + return $bstream; + } + + /** + * Return new bitstream from bytes + * @param int $size size + * @param array $data bytes + * @return array bitstream + */ + protected function newFromBytes($size, $data) { + $bstream = $this->allocate($size * 8); + $p=0; + for ($i=0; $i<$size; ++$i) { + $mask = 0x80; + for ($j=0; $j<8; ++$j) { + if ($data[$i] & $mask) { + $bstream[$p] = 1; + } else { + $bstream[$p] = 0; + } + $p++; + $mask = $mask >> 1; + } + } + return $bstream; + } + + /** + * Append one bitstream to another + * @param array $bitstream original bitstream + * @param array $append bitstream to append + * @return array bitstream + */ + protected function appendBitstream($bitstream, $append) { + if ((!is_array($append)) OR (count($append) == 0)) { + return $bitstream; + } + if (count($bitstream) == 0) { + return $append; + } + return array_values(array_merge($bitstream, $append)); + } + + /** + * Append one bitstream created from number to another + * @param array $bitstream original bitstream + * @param int $bits number of bits + * @param int $num number + * @return array bitstream + */ + protected function appendNum($bitstream, $bits, $num) { + if ($bits == 0) { + return 0; + } + $b = $this->newFromNum($bits, $num); + return $this->appendBitstream($bitstream, $b); + } + + /** + * Append one bitstream created from bytes to another + * @param array $bitstream original bitstream + * @param int $size size + * @param array $data bytes + * @return array bitstream + */ + protected function appendBytes($bitstream, $size, $data) { + if ($size == 0) { + return 0; + } + $b = $this->newFromBytes($size, $data); + return $this->appendBitstream($bitstream, $b); + } + + /** + * Convert bitstream to bytes + * @param array $bitstream original bitstream + * @return array of bytes + */ + protected function bitstreamToByte($bstream) { + $size = count($bstream); + if ($size == 0) { + return array(); + } + $data = array_fill(0, (int)(($size + 7) / 8), 0); + $bytes = (int)($size / 8); + $p = 0; + for ($i=0; $i<$bytes; $i++) { + $v = 0; + for ($j=0; $j<8; $j++) { + $v = $v << 1; + $v |= $bstream[$p]; + $p++; + } + $data[$i] = $v; + } + if ($size & 7) { + $v = 0; + for ($j=0; $j<($size & 7); $j++) { + $v = $v << 1; + $v |= $bstream[$p]; + $p++; + } + $data[$bytes] = $v; + } + return $data; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRspec + + /** + * Replace a value on the array at the specified position + * @param array $srctab + * @param int $x X position + * @param int $y Y position + * @param string $repl value to replace + * @param int $replLen length of the repl string + * @return array srctab + */ + protected function qrstrset($srctab, $x, $y, $repl, $replLen=false) { + $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl)); + return $srctab; + } + + /** + * Return maximum data code length (bytes) for the version. + * @param int $version version + * @param int $level error correction level + * @return int maximum size (bytes) + */ + protected function getDataLength($version, $level) { + return $this->capacity[$version][QRCAP_WORDS] - $this->capacity[$version][QRCAP_EC][$level]; + } + + /** + * Return maximum error correction code length (bytes) for the version. + * @param int $version version + * @param int $level error correction level + * @return int ECC size (bytes) + */ + protected function getECCLength($version, $level){ + return $this->capacity[$version][QRCAP_EC][$level]; + } + + /** + * Return the width of the symbol for the version. + * @param int $version version + * @return int width + */ + protected function getWidth($version) { + return $this->capacity[$version][QRCAP_WIDTH]; + } + + /** + * Return the numer of remainder bits. + * @param int $version version + * @return int number of remainder bits + */ + protected function getRemainder($version) { + return $this->capacity[$version][QRCAP_REMINDER]; + } + + /** + * Return a version number that satisfies the input code length. + * @param int $size input code length (byte) + * @param int $level error correction level + * @return int version number + */ + protected function getMinimumVersion($size, $level) { + for ($i=1; $i <= QRSPEC_VERSION_MAX; ++$i) { + $words = $this->capacity[$i][QRCAP_WORDS] - $this->capacity[$i][QRCAP_EC][$level]; + if ($words >= $size) { + return $i; + } + } + return -1; + } + + /** + * Return the size of length indicator for the mode and version. + * @param int $mode encoding mode + * @param int $version version + * @return int the size of the appropriate length indicator (bits). + */ + protected function lengthIndicator($mode, $version) { + if ($mode == QR_MODE_ST) { + return 0; + } + if ($version <= 9) { + $l = 0; + } elseif ($version <= 26) { + $l = 1; + } else { + $l = 2; + } + return $this->lengthTableBits[$mode][$l]; + } + + /** + * Return the maximum length for the mode and version. + * @param int $mode encoding mode + * @param int $version version + * @return int the maximum length (bytes) + */ + protected function maximumWords($mode, $version) { + if ($mode == QR_MODE_ST) { + return 3; + } + if ($version <= 9) { + $l = 0; + } else if ($version <= 26) { + $l = 1; + } else { + $l = 2; + } + $bits = $this->lengthTableBits[$mode][$l]; + $words = (1 << $bits) - 1; + if ($mode == QR_MODE_KJ) { + $words *= 2; // the number of bytes is required + } + return $words; + } + + /** + * Return an array of ECC specification. + * @param int $version version + * @param int $level error correction level + * @param array $spec an array of ECC specification contains as following: {# of type1 blocks, # of data code, # of ecc code, # of type2 blocks, # of data code} + * @return array spec + */ + protected function getEccSpec($version, $level, $spec) { + if (count($spec) < 5) { + $spec = array(0, 0, 0, 0, 0); + } + $b1 = $this->eccTable[$version][$level][0]; + $b2 = $this->eccTable[$version][$level][1]; + $data = $this->getDataLength($version, $level); + $ecc = $this->getECCLength($version, $level); + if ($b2 == 0) { + $spec[0] = $b1; + $spec[1] = (int)($data / $b1); + $spec[2] = (int)($ecc / $b1); + $spec[3] = 0; + $spec[4] = 0; + } else { + $spec[0] = $b1; + $spec[1] = (int)($data / ($b1 + $b2)); + $spec[2] = (int)($ecc / ($b1 + $b2)); + $spec[3] = $b2; + $spec[4] = $spec[1] + 1; + } + return $spec; + } + + /** + * Put an alignment marker. + * @param array $frame frame + * @param int $width width + * @param int $ox X center coordinate of the pattern + * @param int $oy Y center coordinate of the pattern + * @return array frame + */ + protected function putAlignmentMarker($frame, $ox, $oy) { + $finder = array( + "\xa1\xa1\xa1\xa1\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa0\xa1\xa0\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa1\xa1\xa1\xa1" + ); + $yStart = $oy - 2; + $xStart = $ox - 2; + for ($y=0; $y < 5; $y++) { + $frame = $this->qrstrset($frame, $xStart, $yStart+$y, $finder[$y]); + } + return $frame; + } + + /** + * Put an alignment pattern. + * @param int $version version + * @param array $fram frame + * @param int $width width + * @return array frame + */ + protected function putAlignmentPattern($version, $frame, $width) { + if ($version < 2) { + return $frame; + } + $d = $this->alignmentPattern[$version][1] - $this->alignmentPattern[$version][0]; + if ($d < 0) { + $w = 2; + } else { + $w = (int)(($width - $this->alignmentPattern[$version][0]) / $d + 2); + } + if ($w * $w - 3 == 1) { + $x = $this->alignmentPattern[$version][0]; + $y = $this->alignmentPattern[$version][0]; + $frame = $this->putAlignmentMarker($frame, $x, $y); + return $frame; + } + $cx = $this->alignmentPattern[$version][0]; + $wo = $w - 1; + for ($x=1; $x < $wo; ++$x) { + $frame = $this->putAlignmentMarker($frame, 6, $cx); + $frame = $this->putAlignmentMarker($frame, $cx, 6); + $cx += $d; + } + $cy = $this->alignmentPattern[$version][0]; + for ($y=0; $y < $wo; ++$y) { + $cx = $this->alignmentPattern[$version][0]; + for ($x=0; $x < $wo; ++$x) { + $frame = $this->putAlignmentMarker($frame, $cx, $cy); + $cx += $d; + } + $cy += $d; + } + return $frame; + } + + /** + * Return BCH encoded version information pattern that is used for the symbol of version 7 or greater. Use lower 18 bits. + * @param int $version version + * @return BCH encoded version information pattern + */ + protected function getVersionPattern($version) { + if (($version < 7) OR ($version > QRSPEC_VERSION_MAX)) { + return 0; + } + return $this->versionPattern[($version - 7)]; + } + + /** + * Return BCH encoded format information pattern. + * @param array $mask + * @param int $level error correction level + * @return BCH encoded format information pattern + */ + protected function getFormatInfo($mask, $level) { + if (($mask < 0) OR ($mask > 7)) { + return 0; + } + if (($level < 0) OR ($level > 3)) { + return 0; + } + return $this->formatInfo[$level][$mask]; + } + + /** + * Put a finder pattern. + * @param array $frame frame + * @param int $width width + * @param int $ox X center coordinate of the pattern + * @param int $oy Y center coordinate of the pattern + * @return array frame + */ + protected function putFinderPattern($frame, $ox, $oy) { + $finder = array( + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1" + ); + for ($y=0; $y < 7; $y++) { + $frame = $this->qrstrset($frame, $ox, ($oy + $y), $finder[$y]); + } + return $frame; + } + + /** + * Return a copy of initialized frame. + * @param int $version version + * @return Array of unsigned char. + */ + protected function createFrame($version) { + $width = $this->capacity[$version][QRCAP_WIDTH]; + $frameLine = str_repeat ("\0", $width); + $frame = array_fill(0, $width, $frameLine); + // Finder pattern + $frame = $this->putFinderPattern($frame, 0, 0); + $frame = $this->putFinderPattern($frame, $width - 7, 0); + $frame = $this->putFinderPattern($frame, 0, $width - 7); + // Separator + $yOffset = $width - 7; + for ($y=0; $y < 7; ++$y) { + $frame[$y][7] = "\xc0"; + $frame[$y][$width - 8] = "\xc0"; + $frame[$yOffset][7] = "\xc0"; + ++$yOffset; + } + $setPattern = str_repeat("\xc0", 8); + $frame = $this->qrstrset($frame, 0, 7, $setPattern); + $frame = $this->qrstrset($frame, $width-8, 7, $setPattern); + $frame = $this->qrstrset($frame, 0, $width - 8, $setPattern); + // Format info + $setPattern = str_repeat("\x84", 9); + $frame = $this->qrstrset($frame, 0, 8, $setPattern); + $frame = $this->qrstrset($frame, $width - 8, 8, $setPattern, 8); + $yOffset = $width - 8; + for ($y=0; $y < 8; ++$y,++$yOffset) { + $frame[$y][8] = "\x84"; + $frame[$yOffset][8] = "\x84"; + } + // Timing pattern + $wo = $width - 15; + for ($i=1; $i < $wo; ++$i) { + $frame[6][7+$i] = chr(0x90 | ($i & 1)); + $frame[7+$i][6] = chr(0x90 | ($i & 1)); + } + // Alignment pattern + $frame = $this->putAlignmentPattern($version, $frame, $width); + // Version information + if ($version >= 7) { + $vinf = $this->getVersionPattern($version); + $v = $vinf; + for ($x=0; $x<6; ++$x) { + for ($y=0; $y<3; ++$y) { + $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + $v = $vinf; + for ($y=0; $y<6; ++$y) { + for ($x=0; $x<3; ++$x) { + $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + } + // and a little bit... + $frame[$width - 8][8] = "\x81"; + return $frame; + } + + /** + * Set new frame for the specified version. + * @param int $version version + * @return Array of unsigned char. + */ + protected function newFrame($version) { + if (($version < 1) OR ($version > QRSPEC_VERSION_MAX)) { + return NULL; + } + if (!isset($this->frames[$version])) { + $this->frames[$version] = $this->createFrame($version); + } + if (is_null($this->frames[$version])) { + return NULL; + } + return $this->frames[$version]; + } + + /** + * Return block number 0 + * @param array $spec + * @return int value + */ + protected function rsBlockNum($spec) { + return ($spec[0] + $spec[3]); + } + + /** + * Return block number 1 + * @param array $spec + * @return int value + */ + protected function rsBlockNum1($spec) { + return $spec[0]; + } + + /** + * Return data codes 1 + * @param array $spec + * @return int value + */ + protected function rsDataCodes1($spec) { + return $spec[1]; + } + + /** + * Return ecc codes 1 + * @param array $spec + * @return int value + */ + protected function rsEccCodes1($spec) { + return $spec[2]; + } + + /** + * Return block number 2 + * @param array $spec + * @return int value + */ + protected function rsBlockNum2($spec) { + return $spec[3]; + } + + /** + * Return data codes 2 + * @param array $spec + * @return int value + */ + protected function rsDataCodes2($spec) { + return $spec[4]; + } + + /** + * Return ecc codes 2 + * @param array $spec + * @return int value + */ + protected function rsEccCodes2($spec) { + return $spec[2]; + } + + /** + * Return data length + * @param array $spec + * @return int value + */ + protected function rsDataLength($spec) { + return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); + } + + /** + * Return ecc length + * @param array $spec + * @return int value + */ + protected function rsEccLength($spec) { + return ($spec[0] + $spec[3]) * $spec[2]; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRrs + + /** + * Initialize a Reed-Solomon codec and add it to existing rsitems + * @param int $symsize symbol size, bits + * @param int $gfpoly Field generator polynomial coefficients + * @param int $fcr first root of RS code generator polynomial, index form + * @param int $prim primitive element to generate polynomial roots + * @param int $nroots RS code generator polynomial degree (number of roots) + * @param int $pad padding bytes at front of shortened block + * @return array Array of RS values:<ul><li>mm = Bits per symbol;</li><li>nn = Symbols per block;</li><li>alpha_to = log lookup table array;</li><li>index_of = Antilog lookup table array;</li><li>genpoly = Generator polynomial array;</li><li>nroots = Number of generator;</li><li>roots = number of parity symbols;</li><li>fcr = First consecutive root, index form;</li><li>prim = Primitive element, index form;</li><li>iprim = prim-th root of 1, index form;</li><li>pad = Padding bytes in shortened block;</li><li>gfpoly</ul>. + */ + protected function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) { + foreach ($this->rsitems as $rs) { + if (($rs['pad'] != $pad) OR ($rs['nroots'] != $nroots) OR ($rs['mm'] != $symsize) + OR ($rs['gfpoly'] != $gfpoly) OR ($rs['fcr'] != $fcr) OR ($rs['prim'] != $prim)) { + continue; + } + return $rs; + } + $rs = $this->init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad); + array_unshift($this->rsitems, $rs); + return $rs; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRrsItem + + /** + * modnn + * @param array RS values + * @param int $x X position + * @return int X osition + */ + protected function modnn($rs, $x) { + while ($x >= $rs['nn']) { + $x -= $rs['nn']; + $x = ($x >> $rs['mm']) + ($x & $rs['nn']); + } + return $x; + } + + /** + * Initialize a Reed-Solomon codec and returns an array of values. + * @param int $symsize symbol size, bits + * @param int $gfpoly Field generator polynomial coefficients + * @param int $fcr first root of RS code generator polynomial, index form + * @param int $prim primitive element to generate polynomial roots + * @param int $nroots RS code generator polynomial degree (number of roots) + * @param int $pad padding bytes at front of shortened block + * @return array Array of RS values:<ul><li>mm = Bits per symbol;</li><li>nn = Symbols per block;</li><li>alpha_to = log lookup table array;</li><li>index_of = Antilog lookup table array;</li><li>genpoly = Generator polynomial array;</li><li>nroots = Number of generator;</li><li>roots = number of parity symbols;</li><li>fcr = First consecutive root, index form;</li><li>prim = Primitive element, index form;</li><li>iprim = prim-th root of 1, index form;</li><li>pad = Padding bytes in shortened block;</li><li>gfpoly</ul>. + */ + protected function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) { + // Based on Reed solomon encoder by Phil Karn, KA9Q (GNU-LGPLv2) + $rs = null; + // Check parameter ranges + if (($symsize < 0) OR ($symsize > 8)) { + return $rs; + } + if (($fcr < 0) OR ($fcr >= (1<<$symsize))) { + return $rs; + } + if (($prim <= 0) OR ($prim >= (1<<$symsize))) { + return $rs; + } + if (($nroots < 0) OR ($nroots >= (1<<$symsize))) { + return $rs; + } + if (($pad < 0) OR ($pad >= ((1<<$symsize) -1 - $nroots))) { + return $rs; + } + $rs = array(); + $rs['mm'] = $symsize; + $rs['nn'] = (1 << $symsize) - 1; + $rs['pad'] = $pad; + $rs['alpha_to'] = array_fill(0, ($rs['nn'] + 1), 0); + $rs['index_of'] = array_fill(0, ($rs['nn'] + 1), 0); + // PHP style macro replacement ;) + $NN =& $rs['nn']; + $A0 =& $NN; + // Generate Galois field lookup tables + $rs['index_of'][0] = $A0; // log(zero) = -inf + $rs['alpha_to'][$A0] = 0; // alpha**-inf = 0 + $sr = 1; + for ($i=0; $i<$rs['nn']; ++$i) { + $rs['index_of'][$sr] = $i; + $rs['alpha_to'][$i] = $sr; + $sr <<= 1; + if ($sr & (1 << $symsize)) { + $sr ^= $gfpoly; + } + $sr &= $rs['nn']; + } + if ($sr != 1) { + // field generator polynomial is not primitive! + return NULL; + } + // Form RS code generator polynomial from its roots + $rs['genpoly'] = array_fill(0, ($nroots + 1), 0); + $rs['fcr'] = $fcr; + $rs['prim'] = $prim; + $rs['nroots'] = $nroots; + $rs['gfpoly'] = $gfpoly; + // Find prim-th root of 1, used in decoding + for ($iprim=1; ($iprim % $prim) != 0; $iprim += $rs['nn']) { + ; // intentional empty-body loop! + } + $rs['iprim'] = (int)($iprim / $prim); + $rs['genpoly'][0] = 1; + + + for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) { + $rs['genpoly'][$i+1] = 1; + // Multiply rs->genpoly[] by @**(root + x) + for ($j = $i; $j > 0; --$j) { + if ($rs['genpoly'][$j] != 0) { + $rs['genpoly'][$j] = $rs['genpoly'][$j-1] ^ $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][$j]] + $root)]; + } else { + $rs['genpoly'][$j] = $rs['genpoly'][$j-1]; + } + } + // rs->genpoly[0] can never be zero + $rs['genpoly'][0] = $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][0]] + $root)]; + } + // convert rs->genpoly[] to index form for quicker encoding + for ($i = 0; $i <= $nroots; ++$i) { + $rs['genpoly'][$i] = $rs['index_of'][$rs['genpoly'][$i]]; + } + return $rs; + } + + /** + * Encode a Reed-Solomon codec and returns the parity array + * @param array $rs RS values + * @param array $data data + * @param array $parity parity + * @return parity array + */ + protected function encode_rs_char($rs, $data, $parity) { + $MM =& $rs['mm']; // bits per symbol + $NN =& $rs['nn']; // the total number of symbols in a RS block + $ALPHA_TO =& $rs['alpha_to']; // the address of an array of NN elements to convert Galois field elements in index (log) form to polynomial form + $INDEX_OF =& $rs['index_of']; // the address of an array of NN elements to convert Galois field elements in polynomial form to index (log) form + $GENPOLY =& $rs['genpoly']; // an array of NROOTS+1 elements containing the generator polynomial in index form + $NROOTS =& $rs['nroots']; // the number of roots in the RS code generator polynomial, which is the same as the number of parity symbols in a block + $FCR =& $rs['fcr']; // first consecutive root, index form + $PRIM =& $rs['prim']; // primitive element, index form + $IPRIM =& $rs['iprim']; // prim-th root of 1, index form + $PAD =& $rs['pad']; // the number of pad symbols in a block + $A0 =& $NN; + $parity = array_fill(0, $NROOTS, 0); + for ($i=0; $i < ($NN - $NROOTS - $PAD); $i++) { + $feedback = $INDEX_OF[$data[$i] ^ $parity[0]]; + if ($feedback != $A0) { + // feedback term is non-zero + // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must + // always be for the polynomials constructed by init_rs() + $feedback = $this->modnn($rs, $NN - $GENPOLY[$NROOTS] + $feedback); + for ($j=1; $j < $NROOTS; ++$j) { + $parity[$j] ^= $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[($NROOTS - $j)])]; + } + } + // Shift + array_shift($parity); + if ($feedback != $A0) { + array_push($parity, $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[0])]); + } else { + array_push($parity, 0); + } + } + return $parity; + } + + } // end QRcode class + +} // END OF "class_exists QRcode" +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/tcpdf.crt b/assets/html2pdf/_tcpdf_5.0.002/tcpdf.crt new file mode 100644 index 0000000..f049139 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/tcpdf.crt @@ -0,0 +1,40 @@ +Bag Attributes + localKeyID: 7B AB 1B 7A BE 4C 85 C0 1A A6 DC 59 3F 79 48 C3 93 38 68 9C +subject=/CN=TCPDF DEMO/O=TCPDF/OU=DEMO/emailAddress=you@example.com/C=IT +issuer=/CN=TCPDF DEMO/O=TCPDF/OU=DEMO/emailAddress=you@example.com/C=IT +-----BEGIN CERTIFICATE----- +MIIC1TCCAj6gAwIBAgIKkehOL/XGkB5cjjANBgkqhkiG9w0BAQUFADBhMRMwEQYD +VQQDEwpUQ1BERiBERU1PMQ4wDAYDVQQKEwVUQ1BERjENMAsGA1UECxMEREVNTzEe +MBwGCSqGSIb3DQEJARYPeW91QGV4YW1wbGUuY29tMQswCQYDVQQGEwJJVDAeFw0w +OTA4MjExMjU0NDhaFw0xNDA4MjExMjU0NDhaMGExEzARBgNVBAMTClRDUERGIERF +TU8xDjAMBgNVBAoTBVRDUERGMQ0wCwYDVQQLEwRERU1PMR4wHAYJKoZIhvcNAQkB +Fg95b3VAZXhhbXBsZS5jb20xCzAJBgNVBAYTAklUMIGfMA0GCSqGSIb3DQEBAQUA +A4GNADCBiQKBgQDAqIL0uGKmTR98Lxx2vEEE1OGKkMXFo0JViitALe7Onhxxqx0H +XMUDKF5mvEVu1rcvh7/oAnAfrCuEpL/up3u1mQCgBE7WXBnFFE/AE3jCksh9OkS0 +Z0Xj9woN5bzxRDsGoPiOu/4xzk5qSEXt8jf2Ep90QuNkqLIRT4swAzpDbwIDAQAB +o4GTMIGQMDcGA1UdEgQwMC6gEQYDVQQDDApUQ1BERiBERU1PoAwGA1UECgwFVENQ +REagCwYDVQQLDARERU1PMDcGA1UdEQQwMC6gEQYDVQQDDApUQ1BERiBERU1PoAwG +A1UECgwFVENQREagCwYDVQQLDARERU1PMA8GCSqGSIb3LwEBCgQCBQAwCwYDVR0P +BAQDAgSQMA0GCSqGSIb3DQEBBQUAA4GBAEhTQfqX3ZNdHmpTLDbIj22RHXii2roE +OavCbu9WsHoWpva0qSd+yIoD594VHvYAd29sfzDfiN+7W0aiZfDhq5jpaSQMVlN8 +RGYMupbHY/+a9Gz1wqxnR84mlTtIkZVRYAhsfPwy6M1BEjdMqfdh9h40JIdkdjtb +8faTCfXPePWQ +-----END CERTIFICATE----- +Bag Attributes + localKeyID: 7B AB 1B 7A BE 4C 85 C0 1A A6 DC 59 3F 79 48 C3 93 38 68 9C +Key Attributes: <No Attributes> +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQDAqIL0uGKmTR98Lxx2vEEE1OGKkMXFo0JViitALe7Onhxxqx0H +XMUDKF5mvEVu1rcvh7/oAnAfrCuEpL/up3u1mQCgBE7WXBnFFE/AE3jCksh9OkS0 +Z0Xj9woN5bzxRDsGoPiOu/4xzk5qSEXt8jf2Ep90QuNkqLIRT4swAzpDbwIDAQAB +AoGAXc+wNMmz/5Z+RlIKYia44klmqbplEx+0JULqXI4BQsrqvs67i+I4bJkznoL+ +rEIRYSuQ3sCRKFsFtckjTGpxadnxkB+uwGKc6pZChv99BFX6HFR4hgBlT/BBRAQA +hMDlM2JIRr4S4SMVXR7MHwGMUf9mUeanGLR3ZWtU3aXJrIECQQD7OaYUVYNEEnM9 +uXyjm22CuHyqyEf5gb13sK0uQty67547yJTMUQZd/sQc9KGwhzBbhrob2LO2jAhh +S+f+NSRnAkEAxFHm3fMI5RgXmswxlGm4QW07a/Ueo7ZJG6xjTkFXluJhd+XHswRD +dQIO3zG9nGjNUoeMrPhXhPvKqFc2F9RDuQJAQBEGin74N77gxqfr4ik79y8nE8J5 +oGZ2s/RJZdfFRKLg3mwbjjNHhWb4Ck5UgZkoOt8TzRApXG8/n9hktE5HFwJBALur +M5AueO1Pl5kB489lNJ9OxUQRYUXMxpxuscuoCQwSwmv0O2+0/qtG2WKhUQnI4aYo +L+FV0YwtivBb1jj3T/kCQQDIWOxq8eRowdaMzvJpRUHFgMcf1AVZExKyrugwYOWd +KNsDxC4KaQOsPt8iT/Ulo4g/MJC0HolCOhWibKmR9Ayl +-----END RSA PRIVATE KEY----- diff --git a/assets/html2pdf/_tcpdf_5.0.002/tcpdf.fdf b/assets/html2pdf/_tcpdf_5.0.002/tcpdf.fdf new file mode 100644 index 0000000..a8f7c35 Binary files /dev/null and b/assets/html2pdf/_tcpdf_5.0.002/tcpdf.fdf differ diff --git a/assets/html2pdf/_tcpdf_5.0.002/tcpdf.php b/assets/html2pdf/_tcpdf_5.0.002/tcpdf.php new file mode 100644 index 0000000..02c35df --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/tcpdf.php @@ -0,0 +1,19818 @@ +<?php +//============================================================+ +// File name : tcpdf.php +// Begin : 2002-08-03 +// Last Update : 2010-05-06 +// Author : Nicola Asuni - info@tecnick.com - http://www.tcpdf.org +// Version : 5.0.002 +// License : GNU LGPL (http://www.gnu.org/copyleft/lesser.html) +// ---------------------------------------------------------------------------- +// Copyright (C) 2002-2010 Nicola Asuni - Tecnick.com S.r.l. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 2.1 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. +// +// See LICENSE.TXT file for more information. +// ---------------------------------------------------------------------------- +// +// Description : This is a PHP class for generating PDF documents without +// requiring external extensions. +// +// NOTE: +// This class was originally derived in 2002 from the Public +// Domain FPDF class by Olivier Plathey (http://www.fpdf.org), +// but now is almost entirely rewritten. +// +// Main features: +// * no external libraries are required for the basic functions; +// * all ISO page formats, custom page formats, custom margins and units of measure; +// * UTF-8 Unicode and Right-To-Left languages; +// * TrueTypeUnicode, OpenTypeUnicode, TrueType, OpenType, Type1 and CID-0 fonts; +// * methods to publish some XHTML code, Javascript and Forms; +// * images, graphic (geometric figures) and transformation methods; +// * supports JPEG, PNG and SVG images natively, all images supported by GD (GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM) and all images supported via ImagMagick (http://www.imagemagick.org/www/formats.html) +// * 1D and 2D barcodes: CODE 39, ANSI MH10.8M-1983, USD-3, 3 of 9, CODE 93, USS-93, Standard 2 of 5, Interleaved 2 of 5, CODE 128 A/B/C, 2 and 5 Digits UPC-Based Extention, EAN 8, EAN 13, UPC-A, UPC-E, MSI, POSTNET, PLANET, RMS4CC (Royal Mail 4-state Customer Code), CBC (Customer Bar Code), KIX (Klant index - Customer index), Intelligent Mail Barcode, Onecode, USPS-B-3200, CODABAR, CODE 11, PHARMACODE, PHARMACODE TWO-TRACKS, QR-Code; +// * Grayscale, RGB, CMYK, Spot Colors and Transparencies; +// * automatic page header and footer management; +// * document encryption and digital signature certifications; +// * transactions to UNDO commands; +// * PDF annotations, including links, text and file attachments; +// * text rendering modes (fill, stroke and clipping); +// * multiple columns mode; +// * bookmarks and table of content; +// * text hyphenation; +// * automatic page break, line break and text alignments including justification; +// * automatic page numbering and page groups; +// * move and delete pages; +// * page compression (requires php-zlib extension); +// +// ----------------------------------------------------------- +// THANKS TO: +// +// Olivier Plathey (http://www.fpdf.org) for original FPDF. +// Efthimios Mavrogeorgiadis (emavro@yahoo.com) for suggestions on RTL language support. +// Klemen Vodopivec (http://www.fpdf.de/downloads/addons/37/) for Encryption algorithm. +// Warren Sherliker (wsherliker@gmail.com) for better image handling. +// dullus for text Justification. +// Bob Vincent (pillarsdotnet@users.sourceforge.net) for <li> value attribute. +// Patrick Benny for text stretch suggestion on Cell(). +// Johannes Gntert for JavaScript support. +// Denis Van Nuffelen for Dynamic Form. +// Jacek Czekaj for multibyte justification +// Anthony Ferrara for the reintroduction of legacy image methods. +// Sourceforge user 1707880 (hucste) for line-trough mode. +// Larry Stanbery for page groups. +// Martin Hall-May for transparency. +// Aaron C. Spike for Polycurve method. +// Mohamad Ali Golkar, Saleh AlMatrafe, Charles Abbott for Arabic and Persian support. +// Moritz Wagner and Andreas Wurmser for graphic functions. +// Andrew Whitehead for core fonts support. +// Esteban Jol Marn for OpenType font conversion. +// Teus Hagen for several suggestions and fixes. +// Yukihiro Nakadaira for CID-0 CJK fonts fixes. +// Kosmas Papachristos for some CSS improvements. +// Marcel Partap for some fixes. +// Won Kyu Park for several suggestions, fixes and patches. +// Dominik Dzienia for QR-code support. +// Laurent Minguet for some suggestions. +// Anyone that has reported a bug or sent a suggestion. +//============================================================+ + +/** + * This is a PHP class for generating PDF documents without requiring external extensions.<br> + * TCPDF project (http://www.tcpdf.org) was originally derived in 2002 from the Public Domain FPDF class by Olivier Plathey (http://www.fpdf.org), but now is almost entirely rewritten.<br> + * <h3>TCPDF main features are:</h3> + * <ul> + * <li>no external libraries are required for the basic functions;</li> + * <li>all ISO page formats, custom page formats, custom margins and units of measure;</li> + * <li>UTF-8 Unicode and Right-To-Left languages;</li> + * <li>TrueTypeUnicode, OpenTypeUnicode, TrueType, OpenType, Type1 and CID-0 fonts;</li> + * <li>methods to publish some XHTML code, Javascript and Forms;</li> + * <li>images, graphic (geometric figures) and transformation methods; + * <li>supports JPEG, PNG and SVG images natively, all images supported by GD (GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM) and all images supported via ImagMagick (http://www.imagemagick.org/www/formats.html)</li> + * <li>1D and 2D barcodes: CODE 39, ANSI MH10.8M-1983, USD-3, 3 of 9, CODE 93, USS-93, Standard 2 of 5, Interleaved 2 of 5, CODE 128 A/B/C, 2 and 5 Digits UPC-Based Extention, EAN 8, EAN 13, UPC-A, UPC-E, MSI, POSTNET, PLANET, RMS4CC (Royal Mail 4-state Customer Code), CBC (Customer Bar Code), KIX (Klant index - Customer index), Intelligent Mail Barcode, Onecode, USPS-B-3200, CODABAR, CODE 11, PHARMACODE, PHARMACODE TWO-TRACKS, QR-Code;</li> + * <li>Grayscale, RGB, CMYK, Spot Colors and Transparencies;</li> + * <li>automatic page header and footer management;</li> + * <li>document encryption and digital signature certifications;</li> + * <li>transactions to UNDO commands;</li> + * <li>PDF annotations, including links, text and file attachments;</li> + * <li>text rendering modes (fill, stroke and clipping);</li> + * <li>multiple columns mode;</li> + * <li>bookmarks and table of content;</li> + * <li>text hyphenation;</li> + * <li>automatic page break, line break and text alignments including justification;</li> + * <li>automatic page numbering and page groups;</li> + * <li>move and delete pages;</li> + * <li>page compression (requires php-zlib extension);</li> + * </ul> + * Tools to encode your unicode fonts are on fonts/utils directory.</p> + * @package com.tecnick.tcpdf + * @abstract Class for generating PDF files on-the-fly without requiring external extensions. + * @author Nicola Asuni + * @copyright 2002-2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com + * @link http://www.tcpdf.org + * @license http://www.gnu.org/copyleft/lesser.html LGPL + * @version 5.0.002 + */ + +/** + * main configuration file + */ +require_once(dirname(__FILE__).'/config/tcpdf_config.php'); + +// includes some support files + +/** + * unicode data + */ +require_once(dirname(__FILE__).'/unicode_data.php'); + +/** + * html colors table + */ +require_once(dirname(__FILE__).'/htmlcolors.php'); + +if (!class_exists('TCPDF', false)) { + /** + * define default PDF document producer + */ + define('PDF_PRODUCER', 'TCPDF 5.0.002 (http://www.tcpdf.org)'); + + /** + * This is a PHP class for generating PDF documents without requiring external extensions.<br> + * TCPDF project (http://www.tcpdf.org) has been originally derived in 2002 from the Public Domain FPDF class by Olivier Plathey (http://www.fpdf.org), but now is almost entirely rewritten.<br> + * @name TCPDF + * @package com.tecnick.tcpdf + * @version 5.0.002 + * @author Nicola Asuni - info@tecnick.com + * @link http://www.tcpdf.org + * @license http://www.gnu.org/copyleft/lesser.html LGPL + */ + class TCPDF { + + // protected or Protected properties + + /** + * @var current page number + * @access protected + */ + protected $page; + + /** + * @var current object number + * @access protected + */ + protected $n; + + /** + * @var array of object offsets + * @access protected + */ + protected $offsets; + + /** + * @var buffer holding in-memory PDF + * @access protected + */ + protected $buffer; + + /** + * @var array containing pages + * @access protected + */ + protected $pages = array(); + + /** + * @var current document state + * @access protected + */ + protected $state; + + /** + * @var compression flag + * @access protected + */ + protected $compress; + + /** + * @var current page orientation (P = Portrait, L = Landscape) + * @access protected + */ + protected $CurOrientation; + + /** + * @var array that stores page dimensions and graphic status.<ul><li>$this->pagedim[$this->page]['w'] => page_width_in_points</li><li>$this->pagedim[$this->page]['h'] => height in points</li><li>$this->pagedim[$this->page]['wk'] => page_width_in_points</li><li>$this->pagedim[$this->page]['hk'] => height</li><li>$this->pagedim[$this->page]['tm'] => top_margin</li><li>$this->pagedim[$this->page]['bm'] => bottom_margin</li><li>$this->pagedim[$this->page]['lm'] => left_margin</li><li>$this->pagedim[$this->page]['rm'] => right_margin</li><li>$this->pagedim[$this->page]['pb'] => auto_page_break</li><li>$this->pagedim[$this->page]['or'] => page_orientation</li><li>$this->pagedim[$this->page]['olm'] => original_left_margin</li><li>$this->pagedim[$this->page]['orm'] => original_right_margin</li></ul> + * @access protected + */ + protected $pagedim = array(); + + /** + * @var scale factor (number of points in user unit) + * @access protected + */ + protected $k; + + /** + * @var width of page format in points + * @access protected + */ + protected $fwPt; + + /** + * @var height of page format in points + * @access protected + */ + protected $fhPt; + + /** + * @var current width of page in points + * @access protected + */ + protected $wPt; + + /** + * @var current height of page in points + * @access protected + */ + protected $hPt; + + /** + * @var current width of page in user unit + * @access protected + */ + protected $w; + + /** + * @var current height of page in user unit + * @access protected + */ + protected $h; + + /** + * @var left margin + * @access protected + */ + protected $lMargin; + + /** + * @var top margin + * @access protected + */ + protected $tMargin; + + /** + * @var right margin + * @access protected + */ + protected $rMargin; + + /** + * @var page break margin + * @access protected + */ + protected $bMargin; + + /** + * @var cell internal padding + * @access protected + */ + //protected + public $cMargin; + + /** + * @var cell internal padding (previous value) + * @access protected + */ + protected $oldcMargin; + + /** + * @var current horizontal position in user unit for cell positioning + * @access protected + */ + protected $x; + + /** + * @var current vertical position in user unit for cell positioning + * @access protected + */ + protected $y; + + /** + * @var height of last cell printed + * @access protected + */ + protected $lasth; + + /** + * @var line width in user unit + * @access protected + */ + protected $LineWidth; + + /** + * @var array of standard font names + * @access protected + */ + protected $CoreFonts; + + /** + * @var array of used fonts + * @access protected + */ + protected $fonts = array(); + + /** + * @var array of font files + * @access protected + */ + protected $FontFiles = array(); + + /** + * @var array of encoding differences + * @access protected + */ + protected $diffs = array(); + + /** + * @var array of used images + * @access protected + */ + protected $images = array(); + + /** + * @var array of Annotations in pages + * @access protected + */ + protected $PageAnnots = array(); + + /** + * @var array of internal links + * @access protected + */ + protected $links = array(); + + /** + * @var current font family + * @access protected + */ + protected $FontFamily; + + /** + * @var current font style + * @access protected + */ + protected $FontStyle; + + /** + * @var current font ascent (distance between font top and baseline) + * @access protected + * @since 2.8.000 (2007-03-29) + */ + protected $FontAscent; + + /** + * @var current font descent (distance between font bottom and baseline) + * @access protected + * @since 2.8.000 (2007-03-29) + */ + protected $FontDescent; + + /** + * @var underlining flag + * @access protected + */ + protected $underline; + + /** + * @var overlining flag + * @access protected + */ + protected $overline; + + /** + * @var current font info + * @access protected + */ + protected $CurrentFont; + + /** + * @var current font size in points + * @access protected + */ + protected $FontSizePt; + + /** + * @var current font size in user unit + * @access protected + */ + protected $FontSize; + + /** + * @var commands for drawing color + * @access protected + */ + protected $DrawColor; + + /** + * @var commands for filling color + * @access protected + */ + protected $FillColor; + + /** + * @var commands for text color + * @access protected + */ + protected $TextColor; + + /** + * @var indicates whether fill and text colors are different + * @access protected + */ + protected $ColorFlag; + + /** + * @var automatic page breaking + * @access protected + */ + protected $AutoPageBreak; + + /** + * @var threshold used to trigger page breaks + * @access protected + */ + protected $PageBreakTrigger; + + /** + * @var flag set when processing footer + * @access protected + */ + protected $InFooter = false; + + /** + * @var zoom display mode + * @access protected + */ + protected $ZoomMode; + + /** + * @var layout display mode + * @access protected + */ + protected $LayoutMode; + + /** + * @var title + * @access protected + */ + protected $title = ''; + + /** + * @var subject + * @access protected + */ + protected $subject = ''; + + /** + * @var author + * @access protected + */ + protected $author = ''; + + /** + * @var keywords + * @access protected + */ + protected $keywords = ''; + + /** + * @var creator + * @access protected + */ + protected $creator = ''; + + /** + * @var alias for total number of pages + * @access protected + */ + protected $AliasNbPages = '{nb}'; + + /** + * @var alias for page number + * @access protected + */ + protected $AliasNumPage = '{pnb}'; + + /** + * @var right-bottom corner X coordinate of inserted image + * @since 2002-07-31 + * @author Nicola Asuni + * @access protected + */ + protected $img_rb_x; + + /** + * @var right-bottom corner Y coordinate of inserted image + * @since 2002-07-31 + * @author Nicola Asuni + * @access protected + */ + protected $img_rb_y; + + /** + * @var adjusting factor to convert pixels to user units. + * @since 2004-06-14 + * @author Nicola Asuni + * @access protected + */ + protected $imgscale = 1; + + /** + * @var boolean set to true when the input text is unicode (require unicode fonts) + * @since 2005-01-02 + * @author Nicola Asuni + * @access protected + */ + protected $isunicode = false; + + /** + * @var PDF version + * @since 1.5.3 + * @access protected + */ + protected $PDFVersion = '1.7'; + + /** + * @var Minimum distance between header and top page margin. + * @access protected + */ + protected $header_margin; + + /** + * @var Minimum distance between footer and bottom page margin. + * @access protected + */ + protected $footer_margin; + + /** + * @var original left margin value + * @access protected + * @since 1.53.0.TC013 + */ + protected $original_lMargin; + + /** + * @var original right margin value + * @access protected + * @since 1.53.0.TC013 + */ + protected $original_rMargin; + + /** + * @var Header font. + * @access protected + */ + protected $header_font; + + /** + * @var Footer font. + * @access protected + */ + protected $footer_font; + + /** + * @var Language templates. + * @access protected + */ + protected $l; + + /** + * @var Barcode to print on page footer (only if set). + * @access protected + */ + protected $barcode = false; + + /** + * @var If true prints header + * @access protected + */ + protected $print_header = true; + + /** + * @var If true prints footer. + * @access protected + */ + protected $print_footer = true; + + /** + * @var Header image logo. + * @access protected + */ + protected $header_logo = ''; + + /** + * @var Header image logo width in mm. + * @access protected + */ + protected $header_logo_width = 30; + + /** + * @var String to print as title on document header. + * @access protected + */ + protected $header_title = ''; + + /** + * @var String to print on document header. + * @access protected + */ + protected $header_string = ''; + + /** + * @var Default number of columns for html table. + * @access protected + */ + protected $default_table_columns = 4; + + + // variables for html parser + + /** + * @var HTML PARSER: array to store current link and rendering styles. + * @access protected + */ + protected $HREF = array(); + + /** + * @var store a list of available fonts on filesystem. + * @access protected + */ + protected $fontlist = array(); + + /** + * @var current foreground color + * @access protected + */ + protected $fgcolor; + + /** + * @var HTML PARSER: array of boolean values, true in case of ordered list (OL), false otherwise. + * @access protected + */ + protected $listordered = array(); + + /** + * @var HTML PARSER: array count list items on nested lists. + * @access protected + */ + protected $listcount = array(); + + /** + * @var HTML PARSER: current list nesting level. + * @access protected + */ + protected $listnum = 0; + + /** + * @var HTML PARSER: indent amount for lists. + * @access protected + */ + protected $listindent = 0; + + /** + * @var HTML PARSER: current list indententation level. + * @access protected + */ + protected $listindentlevel = 0; + + /** + * @var current background color + * @access protected + */ + protected $bgcolor; + + /** + * @var Store temporary font size in points. + * @access protected + */ + protected $tempfontsize = 10; + + /** + * @var spacer for LI tags. + * @access protected + */ + protected $lispacer = ''; + + /** + * @var default encoding + * @access protected + * @since 1.53.0.TC010 + */ + protected $encoding = 'UTF-8'; + + /** + * @var PHP internal encoding + * @access protected + * @since 1.53.0.TC016 + */ + protected $internal_encoding; + + /** + * @var indicates if the document language is Right-To-Left + * @access protected + * @since 2.0.000 + */ + protected $rtl = false; + + /** + * @var used to force RTL or LTR string inversion + * @access protected + * @since 2.0.000 + */ + protected $tmprtl = false; + + // --- Variables used for document encryption: + + /** + * Indicates whether document is protected + * @access protected + * @since 2.0.000 (2008-01-02) + */ + protected $encrypted; + + /** + * U entry in pdf document + * @access protected + * @since 2.0.000 (2008-01-02) + */ + protected $Uvalue; + + /** + * O entry in pdf document + * @access protected + * @since 2.0.000 (2008-01-02) + */ + protected $Ovalue; + + /** + * P entry in pdf document + * @access protected + * @since 2.0.000 (2008-01-02) + */ + protected $Pvalue; + + /** + * encryption object id + * @access protected + * @since 2.0.000 (2008-01-02) + */ + protected $enc_obj_id; + + /** + * last RC4 key encrypted (cached for optimisation) + * @access protected + * @since 2.0.000 (2008-01-02) + */ + protected $last_rc4_key; + + /** + * last RC4 computed key + * @access protected + * @since 2.0.000 (2008-01-02) + */ + protected $last_rc4_key_c; + + /** + * RC4 padding + * @access protected + */ + protected $padding = "\x28\xBF\x4E\x5E\x4E\x75\x8A\x41\x64\x00\x4E\x56\xFF\xFA\x01\x08\x2E\x2E\x00\xB6\xD0\x68\x3E\x80\x2F\x0C\xA9\xFE\x64\x53\x69\x7A"; + + /** + * RC4 encryption key + * @access protected + */ + protected $encryption_key; + + // --- bookmark --- + + /** + * Outlines for bookmark + * @access protected + * @since 2.1.002 (2008-02-12) + */ + protected $outlines = array(); + + /** + * Outline root for bookmark + * @access protected + * @since 2.1.002 (2008-02-12) + */ + protected $OutlineRoot; + + + // --- javascript and form --- + + /** + * javascript code + * @access protected + * @since 2.1.002 (2008-02-12) + */ + protected $javascript = ''; + + /** + * javascript counter + * @access protected + * @since 2.1.002 (2008-02-12) + */ + protected $n_js; + + /** + * line trough state + * @access protected + * @since 2.8.000 (2008-03-19) + */ + protected $linethrough; + + // --- Variables used for User's Rights --- + // See PDF reference chapter 8.7 Digital Signatures + + /** + * If true enables user's rights on PDF reader + * @access protected + * @since 2.9.000 (2008-03-26) + */ + protected $ur; + + /** + * Names specifying additional document-wide usage rights for the document. + * @access protected + * @since 2.9.000 (2008-03-26) + */ + protected $ur_document; + + /** + * Names specifying additional annotation-related usage rights for the document. + * @access protected + * @since 2.9.000 (2008-03-26) + */ + protected $ur_annots; + + /** + * Names specifying additional form-field-related usage rights for the document. + * @access protected + * @since 2.9.000 (2008-03-26) + */ + protected $ur_form; + + /** + * Names specifying additional signature-related usage rights for the document. + * @access protected + * @since 2.9.000 (2008-03-26) + */ + protected $ur_signature; + + /** + * Dot Per Inch Document Resolution (do not change) + * @access protected + * @since 3.0.000 (2008-03-27) + */ + protected $dpi = 72; + + /** + * Array of page numbers were a new page group was started + * @access protected + * @since 3.0.000 (2008-03-27) + */ + protected $newpagegroup = array(); + + /** + * Contains the number of pages of the groups + * @access protected + * @since 3.0.000 (2008-03-27) + */ + protected $pagegroups; + + /** + * Contains the alias of the current page group + * @access protected + * @since 3.0.000 (2008-03-27) + */ + protected $currpagegroup; + + /** + * Restrict the rendering of some elements to screen or printout. + * @access protected + * @since 3.0.000 (2008-03-27) + */ + protected $visibility = 'all'; + + /** + * Print visibility. + * @access protected + * @since 3.0.000 (2008-03-27) + */ + protected $n_ocg_print; + + /** + * View visibility. + * @access protected + * @since 3.0.000 (2008-03-27) + */ + protected $n_ocg_view; + + /** + * Array of transparency objects and parameters. + * @access protected + * @since 3.0.000 (2008-03-27) + */ + protected $extgstates; + + /** + * Set the default JPEG compression quality (1-100) + * @access protected + * @since 3.0.000 (2008-03-27) + */ + protected $jpeg_quality; + + /** + * Default cell height ratio. + * @access protected + * @since 3.0.014 (2008-05-23) + */ + protected $cell_height_ratio = K_CELL_HEIGHT_RATIO; + + /** + * PDF viewer preferences. + * @access protected + * @since 3.1.000 (2008-06-09) + */ + protected $viewer_preferences; + + /** + * A name object specifying how the document should be displayed when opened. + * @access protected + * @since 3.1.000 (2008-06-09) + */ + protected $PageMode; + + /** + * Array for storing gradient information. + * @access protected + * @since 3.1.000 (2008-06-09) + */ + protected $gradients = array(); + + /** + * Array used to store positions inside the pages buffer. + * keys are the page numbers + * @access protected + * @since 3.2.000 (2008-06-26) + */ + protected $intmrk = array(); + + /** + * Array used to store content positions inside the pages buffer. + * keys are the page numbers + * @access protected + * @since 4.6.021 (2009-07-20) + */ + protected $cntmrk = array(); + + /** + * Array used to store footer positions of each page. + * @access protected + * @since 3.2.000 (2008-07-01) + */ + protected $footerpos = array(); + + + /** + * Array used to store footer length of each page. + * @access protected + * @since 4.0.014 (2008-07-29) + */ + protected $footerlen = array(); + + /** + * True if a newline is created. + * @access protected + * @since 3.2.000 (2008-07-01) + */ + protected $newline = true; + + /** + * End position of the latest inserted line + * @access protected + * @since 3.2.000 (2008-07-01) + */ + protected $endlinex = 0; + + /** + * PDF string for last line width + * @access protected + * @since 4.0.006 (2008-07-16) + */ + protected $linestyleWidth = ''; + + /** + * PDF string for last line width + * @access protected + * @since 4.0.006 (2008-07-16) + */ + protected $linestyleCap = '0 J'; + + /** + * PDF string for last line width + * @access protected + * @since 4.0.006 (2008-07-16) + */ + protected $linestyleJoin = '0 j'; + + /** + * PDF string for last line width + * @access protected + * @since 4.0.006 (2008-07-16) + */ + protected $linestyleDash = '[] 0 d'; + + /** + * True if marked-content sequence is open + * @access protected + * @since 4.0.013 (2008-07-28) + */ + protected $openMarkedContent = false; + + /** + * Count the latest inserted vertical spaces on HTML + * @access protected + * @since 4.0.021 (2008-08-24) + */ + protected $htmlvspace = 0; + + /** + * Array of Spot colors + * @access protected + * @since 4.0.024 (2008-09-12) + */ + protected $spot_colors = array(); + + /** + * Symbol used for HTML unordered list items + * @access protected + * @since 4.0.028 (2008-09-26) + */ + protected $lisymbol = ''; + + /** + * String used to mark the beginning and end of EPS image blocks + * @access protected + * @since 4.1.000 (2008-10-18) + */ + protected $epsmarker = 'x#!#EPS#!#x'; + + /** + * Array of transformation matrix + * @access protected + * @since 4.2.000 (2008-10-29) + */ + protected $transfmatrix = array(); + + /** + * Current key for transformation matrix + * @access protected + * @since 4.8.005 (2009-09-17) + */ + protected $transfmatrix_key = 0; + + /** + * Booklet mode for double-sided pages + * @access protected + * @since 4.2.000 (2008-10-29) + */ + protected $booklet = false; + + /** + * Epsilon value used for float calculations + * @access protected + * @since 4.2.000 (2008-10-29) + */ + protected $feps = 0.005; + + /** + * Array used for custom vertical spaces for HTML tags + * @access protected + * @since 4.2.001 (2008-10-30) + */ + protected $tagvspaces = array(); + + /** + * @var HTML PARSER: custom indent amount for lists. + * Negative value means disabled. + * @access protected + * @since 4.2.007 (2008-11-12) + */ + protected $customlistindent = -1; + + /** + * @var if true keeps the border open for the cell sides that cross the page. + * @access protected + * @since 4.2.010 (2008-11-14) + */ + protected $opencell = true; + + /** + * @var array of files to embedd + * @access protected + * @since 4.4.000 (2008-12-07) + */ + protected $embeddedfiles = array(); + + /** + * @var boolean true when inside html pre tag + * @access protected + * @since 4.4.001 (2008-12-08) + */ + protected $premode = false; + + /** + * Array used to store positions of graphics transformation blocks inside the page buffer. + * keys are the page numbers + * @access protected + * @since 4.4.002 (2008-12-09) + */ + protected $transfmrk = array(); + + /** + * Default color for html links + * @access protected + * @since 4.4.003 (2008-12-09) + */ + protected $htmlLinkColorArray = array(0, 0, 255); + + /** + * Default font style to add to html links + * @access protected + * @since 4.4.003 (2008-12-09) + */ + protected $htmlLinkFontStyle = 'U'; + + /** + * Counts the number of pages. + * @access protected + * @since 4.5.000 (2008-12-31) + */ + protected $numpages = 0; + + /** + * Array containing page lengths in bytes. + * @access protected + * @since 4.5.000 (2008-12-31) + */ + protected $pagelen = array(); + + /** + * Counts the number of pages. + * @access protected + * @since 4.5.000 (2008-12-31) + */ + protected $numimages = 0; + + /** + * Store the image keys. + * @access protected + * @since 4.5.000 (2008-12-31) + */ + protected $imagekeys = array(); + + /** + * Length of the buffer in bytes. + * @access protected + * @since 4.5.000 (2008-12-31) + */ + protected $bufferlen = 0; + + /** + * If true enables disk caching. + * @access protected + * @since 4.5.000 (2008-12-31) + */ + protected $diskcache = false; + + /** + * Counts the number of fonts. + * @access protected + * @since 4.5.000 (2009-01-02) + */ + protected $numfonts = 0; + + /** + * Store the font keys. + * @access protected + * @since 4.5.000 (2009-01-02) + */ + protected $fontkeys = array(); + + /** + * Store the font object IDs. + * @access protected + * @since 4.8.001 (2009-09-09) + */ + protected $font_obj_ids = array(); + + /** + * Store the fage status (true when opened, false when closed). + * @access protected + * @since 4.5.000 (2009-01-02) + */ + protected $pageopen = array(); + + /** + * Default monospaced font + * @access protected + * @since 4.5.025 (2009-03-10) + */ + protected $default_monospaced_font = 'courier'; + + /** + * Used to store a cloned copy of the current class object + * @access protected + * @since 4.5.029 (2009-03-19) + */ + protected $objcopy; + + /** + * Array used to store the lengths of cache files + * @access protected + * @since 4.5.029 (2009-03-19) + */ + protected $cache_file_length = array(); + + /** + * Table header content to be repeated on each new page + * @access protected + * @since 4.5.030 (2009-03-20) + */ + protected $thead = ''; + + /** + * Margins used for table header. + * @access protected + * @since 4.5.030 (2009-03-20) + */ + protected $theadMargins = array(); + + /** + * Cache array for UTF8StringToArray() method. + * @access protected + * @since 4.5.037 (2009-04-07) + */ + protected $cache_UTF8StringToArray = array(); + + /** + * Maximum size of cache array used for UTF8StringToArray() method. + * @access protected + * @since 4.5.037 (2009-04-07) + */ + protected $cache_maxsize_UTF8StringToArray = 8; + + /** + * Current size of cache array used for UTF8StringToArray() method. + * @access protected + * @since 4.5.037 (2009-04-07) + */ + protected $cache_size_UTF8StringToArray = 0; + + /** + * If true enables document signing + * @access protected + * @since 4.6.005 (2009-04-24) + */ + protected $sign = false; + + /** + * Signature data + * @access protected + * @since 4.6.005 (2009-04-24) + */ + protected $signature_data = array(); + + /** + * Signature max length + * @access protected + * @since 4.6.005 (2009-04-24) + */ + protected $signature_max_length = 11742; + + /** + * Regular expression used to find blank characters used for word-wrapping. + * @access protected + * @since 4.6.006 (2009-04-28) + */ + protected $re_spaces = '/[\s]/'; + + /** + * Signature object ID + * @access protected + * @since 4.6.022 (2009-06-23) + */ + protected $sig_obj_id = 0; + + /** + * ByteRange placemark used during signature process. + * @access protected + * @since 4.6.028 (2009-08-25) + */ + protected $byterange_string = '/ByteRange[0 ********** ********** **********]'; + + /** + * Placemark used during signature process. + * @access protected + * @since 4.6.028 (2009-08-25) + */ + protected $sig_annot_ref = '***SIGANNREF*** 0 R'; + + /** + * ID of page objects + * @access protected + * @since 4.7.000 (2009-08-29) + */ + protected $page_obj_id = array(); + + /** + * Start ID for embedded file objects + * @access protected + * @since 4.7.000 (2009-08-29) + */ + protected $embedded_start_obj_id = 100000; + + /** + * Start ID for annotation objects + * @access protected + * @since 4.7.000 (2009-08-29) + */ + protected $annots_start_obj_id = 200000; + + /** + * Max ID of annotation object + * @access protected + * @since 4.7.000 (2009-08-29) + */ + protected $annot_obj_id = 200000; + + /** + * Current ID of annotation object + * @access protected + * @since 4.8.003 (2009-09-15) + */ + protected $curr_annot_obj_id = 200000; + + /** + * List of form annotations IDs + * @access protected + * @since 4.8.000 (2009-09-07) + */ + protected $form_obj_id = array(); + + /** + * Deafult Javascript field properties. Possible values are described on official Javascript for Acrobat API reference. Annotation options can be directly specified using the 'aopt' entry. + * @access protected + * @since 4.8.000 (2009-09-07) + */ + protected $default_form_prop = array('lineWidth'=>1, 'borderStyle'=>'solid', 'fillColor'=>array(255, 255, 255), 'strokeColor'=>array(128, 128, 128)); + + /** + * Javascript objects array + * @access protected + * @since 4.8.000 (2009-09-07) + */ + protected $js_objects = array(); + + /** + * Start ID for javascript objects + * @access protected + * @since 4.8.000 (2009-09-07) + */ + protected $js_start_obj_id = 300000; + + /** + * Current ID of javascript object + * @access protected + * @since 4.8.000 (2009-09-07) + */ + protected $js_obj_id = 300000; + + /** + * Current form action (used during XHTML rendering) + * @access protected + * @since 4.8.000 (2009-09-07) + */ + protected $form_action = ''; + + /** + * Current form encryption type (used during XHTML rendering) + * @access protected + * @since 4.8.000 (2009-09-07) + */ + protected $form_enctype = 'application/x-www-form-urlencoded'; + + /** + * Current method to submit forms. + * @access protected + * @since 4.8.000 (2009-09-07) + */ + protected $form_mode = 'post'; + + /** + * Start ID for appearance streams XObjects + * @access protected + * @since 4.8.001 (2009-09-09) + */ + protected $apxo_start_obj_id = 400000; + + /** + * Current ID of appearance streams XObjects + * @access protected + * @since 4.8.001 (2009-09-09) + */ + protected $apxo_obj_id = 400000; + + /** + * List of fonts used on form fields (fontname => fontkey). + * @access protected + * @since 4.8.001 (2009-09-09) + */ + protected $annotation_fonts = array(); + + /** + * List of radio buttons parent objects. + * @access protected + * @since 4.8.001 (2009-09-09) + */ + protected $radiobutton_groups = array(); + + /** + * List of radio group objects IDs + * @access protected + * @since 4.8.001 (2009-09-09) + */ + protected $radio_groups = array(); + + /** + * Text indentation value (used for text-indent CSS attribute) + * @access protected + * @since 4.8.006 (2009-09-23) + */ + protected $textindent = 0; + + /** + * Store page number when startTransaction() is called. + * @access protected + * @since 4.8.006 (2009-09-23) + */ + protected $start_transaction_page = 0; + + /** + * Store Y position when startTransaction() is called. + * @access protected + * @since 4.9.001 (2010-03-28) + */ + protected $start_transaction_y = 0; + + /** + * True when we are printing the thead section on a new page + * @access protected + * @since 4.8.027 (2010-01-25) + */ + protected $inthead = false; + + /** + * Array of column measures (width, space, starting Y position) + * @access protected + * @since 4.9.001 (2010-03-28) + */ + protected $columns = array(); + + /** + * Number of colums + * @access protected + * @since 4.9.001 (2010-03-28) + */ + protected $num_columns = 0; + + /** + * Current column number + * @access protected + * @since 4.9.001 (2010-03-28) + */ + protected $current_column = 0; + + /** + * Starting page for columns + * @access protected + * @since 4.9.001 (2010-03-28) + */ + protected $column_start_page = 0; + + /** + * Text rendering mode: 0 = Fill text; 1 = Stroke text; 2 = Fill, then stroke text; 3 = Neither fill nor stroke text (invisible); 4 = Fill text and add to path for clipping; 5 = Stroke text and add to path for clipping; 6 = Fill, then stroke text and add to path for clipping; 7 = Add text to path for clipping. + * @access protected + * @since 4.9.008 (2010-04-03) + */ + protected $textrendermode = 0; + + /** + * Text stroke width in doc units + * @access protected + * @since 4.9.008 (2010-04-03) + */ + protected $textstrokewidth = 0; + + /** + * @var current stroke color + * @access protected + * @since 4.9.008 (2010-04-03) + */ + protected $strokecolor; + + /** + * @var default unit of measure for document + * @access protected + * @since 5.0.000 (2010-04-22) + */ + protected $pdfunit = 'mm'; + + /** + * @var true when we are on TOC (Table Of Content) page + * @access protected + */ + protected $tocpage = false; + + /** + * @var If true convert vector images (SVG, EPS) to raster image using GD or ImageMagick library. + * @access protected + * @since 5.0.000 (2010-04-26) + */ + protected $rasterize_vector_images = false; + + /** + * @var directory used for the last SVG image + * @access protected + * @since 5.0.000 (2010-05-05) + */ + protected $svgdir = ''; + + /** + * @var Deafult unit of measure for SVG + * @access protected + * @since 5.0.000 (2010-05-02) + */ + protected $svgunit = 'px'; + + /** + * @var array of SVG gradients + * @access protected + * @since 5.0.000 (2010-05-02) + */ + protected $svggradients = array(); + + /** + * @var ID of last SVG gradient + * @access protected + * @since 5.0.000 (2010-05-02) + */ + protected $svggradientid = 0; + + /** + * @var true when in SVG defs group + * @access protected + * @since 5.0.000 (2010-05-02) + */ + protected $svgdefsmode = false; + + /** + * @var array of SVG defs + * @access protected + * @since 5.0.000 (2010-05-02) + */ + protected $svgdefs = array(); + + /** + * @var true when in SVG clipPath tag + * @access protected + * @since 5.0.000 (2010-04-26) + */ + protected $svgclipmode = false; + + /** + * @var array of SVG clipPath commands + * @access protected + * @since 5.0.000 (2010-05-02) + */ + protected $svgclippaths = array(); + + /** + * @var ID of last SVG clipPath + * @access protected + * @since 5.0.000 (2010-05-02) + */ + protected $svgclipid = 0; + + /** + * @var svg text + * @access protected + * @since 5.0.000 (2010-05-02) + */ + protected $svgtext = ''; + + /** + * @var array of hinheritable SVG properties + * @access protected + * @since 5.0.000 (2010-05-02) + */ + protected $svginheritprop = array('clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cursor', 'direction', 'fill', 'fill-opacity', 'fill-rule', 'font', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'image-rendering', 'kerning', 'letter-spacing', 'marker', 'marker-end', 'marker-mid', 'marker-start', 'pointer-events', 'shape-rendering', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-rendering', 'visibility', 'word-spacing', 'writing-mode'); + + /** + * @var array of SVG properties + * @access protected + * @since 5.0.000 (2010-05-02) + */ + protected $svgstyles = array(array( + 'alignment-baseline' => 'auto', + 'baseline-shift' => 'baseline', + 'clip' => 'auto', + 'clip-path' => 'none', + 'clip-rule' => 'nonzero', + 'color' => 'black', + 'color-interpolation' => 'sRGB', + 'color-interpolation-filters' => 'linearRGB', + 'color-profile' => 'auto', + 'color-rendering' => 'auto', + 'cursor' => 'auto', + 'direction' => 'ltr', + 'display' => 'inline', + 'dominant-baseline' => 'auto', + 'enable-background' => 'accumulate', + 'fill' => 'black', + 'fill-opacity' => 1, + 'fill-rule' => 'nonzero', + 'filter' => 'none', + 'flood-color' => 'black', + 'flood-opacity' => 1, + 'font' => '', + 'font-family' => 'helvetica', + 'font-size' => 'medium', + 'font-size-adjust' => 'none', + 'font-stretch' => 'normal', + 'font-style' => 'normal', + 'font-variant' => 'normal', + 'font-weight' => 'normal', + 'glyph-orientation-horizontal' => '0deg', + 'glyph-orientation-vertical' => 'auto', + 'image-rendering' => 'auto', + 'kerning' => 'auto', + 'letter-spacing' => 'normal', + 'lighting-color' => 'white', + 'marker' => '', + 'marker-end' => 'none', + 'marker-mid' => 'none', + 'marker-start' => 'none', + 'mask' => 'none', + 'opacity' => 1, + 'overflow' => 'auto', + 'pointer-events' => 'visiblePainted', + 'shape-rendering' => 'auto', + 'stop-color' => 'black', + 'stop-opacity' => 1, + 'stroke' => 'none', + 'stroke-dasharray' => 'none', + 'stroke-dashoffset' => 0, + 'stroke-linecap' => 'butt', + 'stroke-linejoin' => 'miter', + 'stroke-miterlimit' => 4, + 'stroke-opacity' => 1, + 'stroke-width' => 1, + 'text-anchor' => 'start', + 'text-decoration' => 'none', + 'text-rendering' => 'auto', + 'unicode-bidi' => 'normal', + 'visibility' => 'visible', + 'word-spacing' => 'normal', + 'writing-mode' => 'lr-tb', + 'text-color' => 'black', + 'transfmatrix' => array(1, 0, 0, 1, 0, 0) + )); + + //------------------------------------------------------------ + // METHODS + //------------------------------------------------------------ + + /** + * This is the class constructor. + * It allows to set up the page format, the orientation and + * the measure unit used in all the methods (except for the font sizes). + * @since 1.0 + * @param string $orientation page orientation. Possible values are (case insensitive):<ul><li>P or Portrait (default)</li><li>L or Landscape</li></ul> + * @param string $unit User measure unit. Possible values are:<ul><li>pt: point</li><li>mm: millimeter (default)</li><li>cm: centimeter</li><li>in: inch</li></ul><br />A point equals 1/72 of inch, that is to say about 0.35 mm (an inch being 2.54 cm). This is a very common unit in typography; font sizes are expressed in that unit. + * @param mixed $format The format used for pages. It can be either one of the following values (case insensitive) or a custom format in the form of a two-element array containing the width and the height (expressed in the unit given by unit).<ul><li>4A0</li><li>2A0</li><li>A0</li><li>A1</li><li>A2</li><li>A3</li><li>A4 (default)</li><li>A5</li><li>A6</li><li>A7</li><li>A8</li><li>A9</li><li>A10</li><li>B0</li><li>B1</li><li>B2</li><li>B3</li><li>B4</li><li>B5</li><li>B6</li><li>B7</li><li>B8</li><li>B9</li><li>B10</li><li>C0</li><li>C1</li><li>C2</li><li>C3</li><li>C4</li><li>C5</li><li>C6</li><li>C7</li><li>C8</li><li>C9</li><li>C10</li><li>RA0</li><li>RA1</li><li>RA2</li><li>RA3</li><li>RA4</li><li>SRA0</li><li>SRA1</li><li>SRA2</li><li>SRA3</li><li>SRA4</li><li>LETTER</li><li>LEGAL</li><li>EXECUTIVE</li><li>FOLIO</li></ul> + * @param boolean $unicode TRUE means that the input text is unicode (default = true) + * @param boolean $diskcache if TRUE reduce the RAM memory usage by caching temporary data on filesystem (slower). + * @param String $encoding charset encoding; default is UTF-8 + * @access public + */ + public function __construct($orientation='P', $unit='mm', $format='A4', $unicode=true, $encoding='UTF-8', $diskcache=false) { + /* Set internal character encoding to ASCII */ + if (function_exists('mb_internal_encoding') AND mb_internal_encoding()) { + $this->internal_encoding = mb_internal_encoding(); + mb_internal_encoding('ASCII'); + } + // set disk caching + $this->diskcache = $diskcache ? true : false; + // set language direction + $this->rtl = false; + $this->tmprtl = false; + //Some checks + $this->_dochecks(); + //Initialization of properties + $this->isunicode = $unicode; + $this->page = 0; + $this->transfmrk[0] = array(); + $this->pagedim = array(); + $this->n = 2; + $this->buffer = ''; + $this->pages = array(); + $this->state = 0; + $this->fonts = array(); + $this->FontFiles = array(); + $this->diffs = array(); + $this->images = array(); + $this->links = array(); + $this->gradients = array(); + $this->InFooter = false; + $this->lasth = 0; + $this->FontFamily = 'helvetica'; + $this->FontStyle = ''; + $this->FontSizePt = 12; + $this->underline = false; + $this->overline = false; + $this->linethrough = false; + $this->DrawColor = '0 G'; + $this->FillColor = '0 g'; + $this->TextColor = '0 g'; + $this->ColorFlag = false; + // encryption values + $this->encrypted = false; + $this->last_rc4_key = ''; + $this->padding = "\x28\xBF\x4E\x5E\x4E\x75\x8A\x41\x64\x00\x4E\x56\xFF\xFA\x01\x08\x2E\x2E\x00\xB6\xD0\x68\x3E\x80\x2F\x0C\xA9\xFE\x64\x53\x69\x7A"; + //Standard Unicode fonts + $this->CoreFonts = array( + 'courier'=>'Courier', + 'courierB'=>'Courier-Bold', + 'courierI'=>'Courier-Oblique', + 'courierBI'=>'Courier-BoldOblique', + 'helvetica'=>'Helvetica', + 'helveticaB'=>'Helvetica-Bold', + 'helveticaI'=>'Helvetica-Oblique', + 'helveticaBI'=>'Helvetica-BoldOblique', + 'times'=>'Times-Roman', + 'timesB'=>'Times-Bold', + 'timesI'=>'Times-Italic', + 'timesBI'=>'Times-BoldItalic', + 'symbol'=>'Symbol', + 'zapfdingbats'=>'ZapfDingbats' + ); + //Set scale factor + $this->setPageUnit($unit); + // set page format and orientation + $this->setPageFormat($format, $orientation); + //Page margins (1 cm) + $margin = 28.35 / $this->k; + $this->SetMargins($margin, $margin); + //Interior cell margin + $this->cMargin = $margin / 10; + //Line width (0.2 mm) + $this->LineWidth = 0.57 / $this->k; + $this->linestyleWidth = sprintf('%.2F w', ($this->LineWidth * $this->k)); + $this->linestyleCap = '0 J'; + $this->linestyleJoin = '0 j'; + $this->linestyleDash = '[] 0 d'; + //Automatic page break + $this->SetAutoPageBreak(true, (2 * $margin)); + //Full width display mode + $this->SetDisplayMode('fullwidth'); + //Compression + $this->SetCompression(true); + //Set default PDF version number + $this->PDFVersion = '1.7'; + $this->encoding = $encoding; + $this->HREF = array(); + $this->getFontsList(); + $this->fgcolor = array('R' => 0, 'G' => 0, 'B' => 0); + $this->strokecolor = array('R' => 0, 'G' => 0, 'B' => 0); + $this->bgcolor = array('R' => 255, 'G' => 255, 'B' => 255); + $this->extgstates = array(); + // user's rights + $this->sign = false; + $this->ur = false; + $this->ur_document = '/FullSave'; + $this->ur_annots = '/Create/Delete/Modify/Copy/Import/Export'; + $this->ur_form = '/Add/Delete/FillIn/Import/Export/SubmitStandalone/SpawnTemplate'; + $this->ur_signature = '/Modify'; + // set default JPEG quality + $this->jpeg_quality = 75; + // initialize some settings + $this->utf8Bidi(array(''), ''); + // set default font + $this->SetFont($this->FontFamily, $this->FontStyle, $this->FontSizePt); + // check if PCRE Unicode support is enabled + if ($this->isunicode AND (@preg_match('/\pL/u', 'a') == 1)) { + // PCRE unicode support is turned ON + // \p{Z} or \p{Separator}: any kind of Unicode whitespace or invisible separator. + // \p{Lo} or \p{Other_Letter}: a Unicode letter or ideograph that does not have lowercase and uppercase variants. + // \p{Lo} is needed because Chinese characters are packed next to each other without spaces in between. + //$this->re_spaces = '/[\s\p{Z}\p{Lo}]/u'; + $this->re_spaces = '/[\s\p{Z}]/u'; + } else { + // PCRE unicode support is turned OFF + $this->re_spaces = '/[\s]/'; + } + $this->annot_obj_id = $this->annots_start_obj_id; + $this->curr_annot_obj_id = $this->annots_start_obj_id; + $this->apxo_obj_id = $this->apxo_start_obj_id; + $this->js_obj_id = $this->js_start_obj_id; + $this->default_form_prop = array('lineWidth'=>1, 'borderStyle'=>'solid', 'fillColor'=>array(255, 255, 255), 'strokeColor'=>array(128, 128, 128)); + } + + /** + * Default destructor. + * @access public + * @since 1.53.0.TC016 + */ + public function __destruct() { + // restore internal encoding + if (isset($this->internal_encoding) AND !empty($this->internal_encoding)) { + mb_internal_encoding($this->internal_encoding); + } + // unset all class variables + $this->_destroy(true); + } + + /** + * Set the units of measure for the document. + * @param string $unit User measure unit. Possible values are:<ul><li>pt: point</li><li>mm: millimeter (default)</li><li>cm: centimeter</li><li>in: inch</li></ul><br />A point equals 1/72 of inch, that is to say about 0.35 mm (an inch being 2.54 cm). This is a very common unit in typography; font sizes are expressed in that unit. + * @access public + * @since 3.0.015 (2008-06-06) + */ + public function setPageUnit($unit) { + $unit = strtolower($unit); + //Set scale factor + switch ($unit) { + // points + case 'px': + case 'pt': { + $this->k = 1; + break; + } + // millimeters + case 'mm': { + $this->k = $this->dpi / 25.4; + break; + } + // centimeters + case 'cm': { + $this->k = $this->dpi / 2.54; + break; + } + // inches + case 'in': { + $this->k = $this->dpi; + break; + } + // unsupported unit + default : { + $this->Error('Incorrect unit: '.$unit); + break; + } + } + $this->pdfunit = $unit; + if (isset($this->CurOrientation)) { + $this->setPageOrientation($this->CurOrientation); + } + } + + /** + * Set the page format + * @param mixed $format The format used for pages. It can be either one of the following values (case insensitive) or a custom format in the form of a two-element array containing the width and the height (expressed in the unit given by unit).<ul><li>4A0</li><li>2A0</li><li>A0</li><li>A1</li><li>A2</li><li>A3</li><li>A4 (default)</li><li>A5</li><li>A6</li><li>A7</li><li>A8</li><li>A9</li><li>A10</li><li>B0</li><li>B1</li><li>B2</li><li>B3</li><li>B4</li><li>B5</li><li>B6</li><li>B7</li><li>B8</li><li>B9</li><li>B10</li><li>C0</li><li>C1</li><li>C2</li><li>C3</li><li>C4</li><li>C5</li><li>C6</li><li>C7</li><li>C8</li><li>C9</li><li>C10</li><li>RA0</li><li>RA1</li><li>RA2</li><li>RA3</li><li>RA4</li><li>SRA0</li><li>SRA1</li><li>SRA2</li><li>SRA3</li><li>SRA4</li><li>LETTER</li><li>LEGAL</li><li>EXECUTIVE</li><li>FOLIO</li></ul> + * @param string $orientation page orientation. Possible values are (case insensitive):<ul><li>P or PORTRAIT (default)</li><li>L or LANDSCAPE</li></ul> + * @access public + * @since 3.0.015 (2008-06-06) + */ + public function setPageFormat($format, $orientation='P') { + //Page format + if (is_string($format)) { + // Page formats (45 standard ISO paper formats and 4 american common formats). + // Paper cordinates are calculated in this way: (inches * 72) where (1 inch = 2.54 cm) + switch (strtoupper($format)) { + case '4A0': {$format = array(4767.87,6740.79); break;} + case '2A0': {$format = array(3370.39,4767.87); break;} + case 'A0': {$format = array(2383.94,3370.39); break;} + case 'A1': {$format = array(1683.78,2383.94); break;} + case 'A2': {$format = array(1190.55,1683.78); break;} + case 'A3': {$format = array(841.89,1190.55); break;} + case 'A4': default: {$format = array(595.28,841.89); break;} + case 'A5': {$format = array(419.53,595.28); break;} + case 'A6': {$format = array(297.64,419.53); break;} + case 'A7': {$format = array(209.76,297.64); break;} + case 'A8': {$format = array(147.40,209.76); break;} + case 'A9': {$format = array(104.88,147.40); break;} + case 'A10': {$format = array(73.70,104.88); break;} + case 'B0': {$format = array(2834.65,4008.19); break;} + case 'B1': {$format = array(2004.09,2834.65); break;} + case 'B2': {$format = array(1417.32,2004.09); break;} + case 'B3': {$format = array(1000.63,1417.32); break;} + case 'B4': {$format = array(708.66,1000.63); break;} + case 'B5': {$format = array(498.90,708.66); break;} + case 'B6': {$format = array(354.33,498.90); break;} + case 'B7': {$format = array(249.45,354.33); break;} + case 'B8': {$format = array(175.75,249.45); break;} + case 'B9': {$format = array(124.72,175.75); break;} + case 'B10': {$format = array(87.87,124.72); break;} + case 'C0': {$format = array(2599.37,3676.54); break;} + case 'C1': {$format = array(1836.85,2599.37); break;} + case 'C2': {$format = array(1298.27,1836.85); break;} + case 'C3': {$format = array(918.43,1298.27); break;} + case 'C4': {$format = array(649.13,918.43); break;} + case 'C5': {$format = array(459.21,649.13); break;} + case 'C6': {$format = array(323.15,459.21); break;} + case 'C7': {$format = array(229.61,323.15); break;} + case 'C8': {$format = array(161.57,229.61); break;} + case 'C9': {$format = array(113.39,161.57); break;} + case 'C10': {$format = array(79.37,113.39); break;} + case 'RA0': {$format = array(2437.80,3458.27); break;} + case 'RA1': {$format = array(1729.13,2437.80); break;} + case 'RA2': {$format = array(1218.90,1729.13); break;} + case 'RA3': {$format = array(864.57,1218.90); break;} + case 'RA4': {$format = array(609.45,864.57); break;} + case 'SRA0': {$format = array(2551.18,3628.35); break;} + case 'SRA1': {$format = array(1814.17,2551.18); break;} + case 'SRA2': {$format = array(1275.59,1814.17); break;} + case 'SRA3': {$format = array(907.09,1275.59); break;} + case 'SRA4': {$format = array(637.80,907.09); break;} + case 'LETTER': {$format = array(612.00,792.00); break;} + case 'LEGAL': {$format = array(612.00,1008.00); break;} + case 'EXECUTIVE': {$format = array(521.86,756.00); break;} + case 'FOLIO': {$format = array(612.00,936.00); break;} + } + $this->fwPt = $format[0]; + $this->fhPt = $format[1]; + } else { + $this->fwPt = $format[0] * $this->k; + $this->fhPt = $format[1] * $this->k; + } + $this->setPageOrientation($orientation); + } + + /** + * Set page orientation. + * @param string $orientation page orientation. Possible values are (case insensitive):<ul><li>P or PORTRAIT (default)</li><li>L or LANDSCAPE</li></ul> + * @param boolean $autopagebreak Boolean indicating if auto-page-break mode should be on or off. + * @param float $bottommargin bottom margin of the page. + * @access public + * @since 3.0.015 (2008-06-06) + */ + public function setPageOrientation($orientation, $autopagebreak='', $bottommargin='') { + if ($this->fwPt > $this->fhPt) { + // landscape + $default_orientation = 'L'; + } else { + // portrait + $default_orientation = 'P'; + } + $valid_orientations = array('P', 'L'); + if (empty($orientation)) { + $orientation = $default_orientation; + } else { + $orientation = $orientation{0}; + $orientation = strtoupper($orientation); + } + if (in_array($orientation, $valid_orientations) AND ($orientation != $default_orientation)) { + $this->CurOrientation = $orientation; + $this->wPt = $this->fhPt; + $this->hPt = $this->fwPt; + } else { + $this->CurOrientation = $default_orientation; + $this->wPt = $this->fwPt; + $this->hPt = $this->fhPt; + } + $this->w = $this->wPt / $this->k; + $this->h = $this->hPt / $this->k; + if ($this->empty_string($autopagebreak)) { + if (isset($this->AutoPageBreak)) { + $autopagebreak = $this->AutoPageBreak; + } else { + $autopagebreak = true; + } + } + if ($this->empty_string($bottommargin)) { + if (isset($this->bMargin)) { + $bottommargin = $this->bMargin; + } else { + // default value = 2 cm + $bottommargin = 2 * 28.35 / $this->k; + } + } + $this->SetAutoPageBreak($autopagebreak, $bottommargin); + // store page dimensions + $this->pagedim[$this->page] = array('w' => $this->wPt, 'h' => $this->hPt, 'wk' => $this->w, 'hk' => $this->h, 'tm' => $this->tMargin, 'bm' => $bottommargin, 'lm' => $this->lMargin, 'rm' => $this->rMargin, 'pb' => $autopagebreak, 'or' => $this->CurOrientation, 'olm' => $this->original_lMargin, 'orm' => $this->original_rMargin); + } + + /** + * Set regular expression to detect withespaces or word separators. + * @param string $re regular expression (leave empty for default). + * @access public + * @since 4.6.016 (2009-06-15) + */ + public function setSpacesRE($re='/[\s]/') { + // if PCRE unicode support is turned ON: + // \p{Z} or \p{Separator}: any kind of Unicode whitespace or invisible separator. + // \p{Lo} or \p{Other_Letter}: a Unicode letter or ideograph that does not have lowercase and uppercase variants. + // \p{Lo} is needed because Chinese characters are packed next to each other without spaces in between. + $this->re_spaces = $re; + } + + /** + * Enable or disable Right-To-Left language mode + * @param Boolean $enable if true enable Right-To-Left language mode. + * @param Boolean $resetx if true reset the X position on direction change. + * @access public + * @since 2.0.000 (2008-01-03) + */ + public function setRTL($enable, $resetx=true) { + $enable = $enable ? true : false; + $resetx = ($resetx AND ($enable != $this->rtl)); + $this->rtl = $enable; + $this->tmprtl = false; + if ($resetx) { + $this->Ln(0); + } + } + + /** + * Return the RTL status + * @return boolean + * @access public + * @since 4.0.012 (2008-07-24) + */ + public function getRTL() { + return $this->rtl; + } + + /** + * Force temporary RTL language direction + * @param mixed $mode can be false, 'L' for LTR or 'R' for RTL + * @access public + * @since 2.1.000 (2008-01-09) + */ + public function setTempRTL($mode) { + $newmode = false; + switch ($mode) { + case 'ltr': + case 'LTR': + case 'L': { + if ($this->rtl) { + $newmode = 'L'; + } + break; + } + case 'rtl': + case 'RTL': + case 'R': { + if (!$this->rtl) { + $newmode = 'R'; + } + break; + } + case false: + default: { + $newmode = false; + break; + } + } + $this->tmprtl = $newmode; + } + + /** + * Return the current temporary RTL status + * @return boolean + * @access public + * @since 4.8.014 (2009-11-04) + */ + public function isRTLTextDir() { + return ($this->rtl OR ($this->tmprtl == 'R')); + } + + /** + * Set the last cell height. + * @param float $h cell height. + * @author Nicola Asuni + * @access public + * @since 1.53.0.TC034 + */ + public function setLastH($h) { + $this->lasth = $h; + } + + /** + * Get the last cell height. + * @return last cell height + * @access public + * @since 4.0.017 (2008-08-05) + */ + public function getLastH() { + return $this->lasth; + } + + /** + * Set the adjusting factor to convert pixels to user units. + * @param float $scale adjusting factor to convert pixels to user units. + * @author Nicola Asuni + * @access public + * @since 1.5.2 + */ + public function setImageScale($scale) { + $this->imgscale = $scale; + } + + /** + * Returns the adjusting factor to convert pixels to user units. + * @return float adjusting factor to convert pixels to user units. + * @author Nicola Asuni + * @access public + * @since 1.5.2 + */ + public function getImageScale() { + return $this->imgscale; + } + + /** + * Returns an array of page dimensions: + * <ul><li>$this->pagedim[$this->page]['w'] => page_width_in_points</li><li>$this->pagedim[$this->page]['h'] => height in points</li><li>$this->pagedim[$this->page]['wk'] => page_width_in_points</li><li>$this->pagedim[$this->page]['hk'] => height</li><li>$this->pagedim[$this->page]['tm'] => top_margin</li><li>$this->pagedim[$this->page]['bm'] => bottom_margin</li><li>$this->pagedim[$this->page]['lm'] => left_margin</li><li>$this->pagedim[$this->page]['rm'] => right_margin</li><li>$this->pagedim[$this->page]['pb'] => auto_page_break</li><li>$this->pagedim[$this->page]['or'] => page_orientation</li><li>$this->pagedim[$this->page]['olm'] => original_left_margin</li><li>$this->pagedim[$this->page]['orm'] => original_right_margin</li></ul> + * @param int $pagenum page number (empty = current page) + * @return array of page dimensions. + * @author Nicola Asuni + * @access public + * @since 4.5.027 (2009-03-16) + */ + public function getPageDimensions($pagenum='') { + if (empty($pagenum)) { + $pagenum = $this->page; + } + return $this->pagedim[$pagenum]; + } + + /** + * Returns the page width in units. + * @param int $pagenum page number (empty = current page) + * @return int page width. + * @author Nicola Asuni + * @access public + * @since 1.5.2 + * @see getPageDimensions() + */ + public function getPageWidth($pagenum='') { + if (empty($pagenum)) { + return $this->w; + } + return $this->pagedim[$pagenum]['w']; + } + + /** + * Returns the page height in units. + * @param int $pagenum page number (empty = current page) + * @return int page height. + * @author Nicola Asuni + * @access public + * @since 1.5.2 + * @see getPageDimensions() + */ + public function getPageHeight($pagenum='') { + if (empty($pagenum)) { + return $this->h; + } + return $this->pagedim[$pagenum]['h']; + } + + /** + * Returns the page break margin. + * @param int $pagenum page number (empty = current page) + * @return int page break margin. + * @author Nicola Asuni + * @access public + * @since 1.5.2 + * @see getPageDimensions() + */ + public function getBreakMargin($pagenum='') { + if (empty($pagenum)) { + return $this->bMargin; + } + return $this->pagedim[$pagenum]['bm']; + } + + /** + * Returns the scale factor (number of points in user unit). + * @return int scale factor. + * @author Nicola Asuni + * @access public + * @since 1.5.2 + */ + public function getScaleFactor() { + return $this->k; + } + + /** + * Defines the left, top and right margins. + * @param float $left Left margin. + * @param float $top Top margin. + * @param float $right Right margin. Default value is the left one. + * @param boolean $keepmargins if true overwrites the default page margins + * @access public + * @since 1.0 + * @see SetLeftMargin(), SetTopMargin(), SetRightMargin(), SetAutoPageBreak() + */ + public function SetMargins($left, $top, $right=-1, $keepmargins=false) { + //Set left, top and right margins + $this->lMargin = $left; + $this->tMargin = $top; + if ($right == -1) { + $right = $left; + } + $this->rMargin = $right; + if ($keepmargins) { + // overwrite original values + $this->original_lMargin = $this->lMargin; + $this->original_rMargin = $this->rMargin; + } + } + + /** + * Defines the left margin. The method can be called before creating the first page. If the current abscissa gets out of page, it is brought back to the margin. + * @param float $margin The margin. + * @access public + * @since 1.4 + * @see SetTopMargin(), SetRightMargin(), SetAutoPageBreak(), SetMargins() + */ + public function SetLeftMargin($margin) { + //Set left margin + $this->lMargin=$margin; + if (($this->page > 0) AND ($this->x < $margin)) { + $this->x = $margin; + } + } + + /** + * Defines the top margin. The method can be called before creating the first page. + * @param float $margin The margin. + * @access public + * @since 1.5 + * @see SetLeftMargin(), SetRightMargin(), SetAutoPageBreak(), SetMargins() + */ + public function SetTopMargin($margin) { + //Set top margin + $this->tMargin=$margin; + if (($this->page > 0) AND ($this->y < $margin)) { + $this->y = $margin; + } + } + + /** + * Defines the right margin. The method can be called before creating the first page. + * @param float $margin The margin. + * @access public + * @since 1.5 + * @see SetLeftMargin(), SetTopMargin(), SetAutoPageBreak(), SetMargins() + */ + public function SetRightMargin($margin) { + $this->rMargin=$margin; + if (($this->page > 0) AND ($this->x > ($this->w - $margin))) { + $this->x = $this->w - $margin; + } + } + + /** + * Set the internal Cell padding. + * @param float $pad internal padding. + * @access public + * @since 2.1.000 (2008-01-09) + * @see Cell(), SetLeftMargin(), SetTopMargin(), SetAutoPageBreak(), SetMargins() + */ + public function SetCellPadding($pad) { + $this->cMargin = $pad; + } + + /** + * Enables or disables the automatic page breaking mode. When enabling, the second parameter is the distance from the bottom of the page that defines the triggering limit. By default, the mode is on and the margin is 2 cm. + * @param boolean $auto Boolean indicating if mode should be on or off. + * @param float $margin Distance from the bottom of the page. + * @access public + * @since 1.0 + * @see Cell(), MultiCell(), AcceptPageBreak() + */ + public function SetAutoPageBreak($auto, $margin=0) { + //Set auto page break mode and triggering margin + $this->AutoPageBreak = $auto; + $this->bMargin = $margin; + $this->PageBreakTrigger = $this->h - $margin; + } + + /** + * Defines the way the document is to be displayed by the viewer. + * @param mixed $zoom The zoom to use. It can be one of the following string values or a number indicating the zooming factor to use. <ul><li>fullpage: displays the entire page on screen </li><li>fullwidth: uses maximum width of window</li><li>real: uses real size (equivalent to 100% zoom)</li><li>default: uses viewer default mode</li></ul> + * @param string $layout The page layout. Possible values are:<ul><li>SinglePage Display one page at a time</li><li>OneColumn Display the pages in one column</li><li>TwoColumnLeft Display the pages in two columns, with odd-numbered pages on the left</li><li>TwoColumnRight Display the pages in two columns, with odd-numbered pages on the right</li><li>TwoPageLeft (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the left</li><li>TwoPageRight (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the right</li></ul> + * @param string $mode A name object specifying how the document should be displayed when opened:<ul><li>UseNone Neither document outline nor thumbnail images visible</li><li>UseOutlines Document outline visible</li><li>UseThumbs Thumbnail images visible</li><li>FullScreen Full-screen mode, with no menu bar, window controls, or any other window visible</li><li>UseOC (PDF 1.5) Optional content group panel visible</li><li>UseAttachments (PDF 1.6) Attachments panel visible</li></ul> + * @access public + * @since 1.2 + */ + public function SetDisplayMode($zoom, $layout='SinglePage', $mode='UseNone') { + //Set display mode in viewer + if (($zoom == 'fullpage') OR ($zoom == 'fullwidth') OR ($zoom == 'real') OR ($zoom == 'default') OR (!is_string($zoom))) { + $this->ZoomMode = $zoom; + } else { + $this->Error('Incorrect zoom display mode: '.$zoom); + } + switch ($layout) { + case 'default': + case 'single': + case 'SinglePage': { + $this->LayoutMode = 'SinglePage'; + break; + } + case 'continuous': + case 'OneColumn': { + $this->LayoutMode = 'OneColumn'; + break; + } + case 'two': + case 'TwoColumnLeft': { + $this->LayoutMode = 'TwoColumnLeft'; + break; + } + case 'TwoColumnRight': { + $this->LayoutMode = 'TwoColumnRight'; + break; + } + case 'TwoPageLeft': { + $this->LayoutMode = 'TwoPageLeft'; + break; + } + case 'TwoPageRight': { + $this->LayoutMode = 'TwoPageRight'; + break; + } + default: { + $this->LayoutMode = 'SinglePage'; + } + } + switch ($mode) { + case 'UseNone': { + $this->PageMode = 'UseNone'; + break; + } + case 'UseOutlines': { + $this->PageMode = 'UseOutlines'; + break; + } + case 'UseThumbs': { + $this->PageMode = 'UseThumbs'; + break; + } + case 'FullScreen': { + $this->PageMode = 'FullScreen'; + break; + } + case 'UseOC': { + $this->PageMode = 'UseOC'; + break; + } + case '': { + $this->PageMode = 'UseAttachments'; + break; + } + default: { + $this->PageMode = 'UseNone'; + } + } + } + + /** + * Activates or deactivates page compression. When activated, the internal representation of each page is compressed, which leads to a compression ratio of about 2 for the resulting document. Compression is on by default. + * Note: the Zlib extension is required for this feature. If not present, compression will be turned off. + * @param boolean $compress Boolean indicating if compression must be enabled. + * @access public + * @since 1.4 + */ + public function SetCompression($compress) { + //Set page compression + if (function_exists('gzcompress')) { + $this->compress = $compress; + } else { + $this->compress = false; + } + } + + /** + * Defines the title of the document. + * @param string $title The title. + * @access public + * @since 1.2 + * @see SetAuthor(), SetCreator(), SetKeywords(), SetSubject() + */ + public function SetTitle($title) { + //Title of document + $this->title = $title; + } + + /** + * Defines the subject of the document. + * @param string $subject The subject. + * @access public + * @since 1.2 + * @see SetAuthor(), SetCreator(), SetKeywords(), SetTitle() + */ + public function SetSubject($subject) { + //Subject of document + $this->subject = $subject; + } + + /** + * Defines the author of the document. + * @param string $author The name of the author. + * @access public + * @since 1.2 + * @see SetCreator(), SetKeywords(), SetSubject(), SetTitle() + */ + public function SetAuthor($author) { + //Author of document + $this->author = $author; + } + + /** + * Associates keywords with the document, generally in the form 'keyword1 keyword2 ...'. + * @param string $keywords The list of keywords. + * @access public + * @since 1.2 + * @see SetAuthor(), SetCreator(), SetSubject(), SetTitle() + */ + public function SetKeywords($keywords) { + //Keywords of document + $this->keywords = $keywords; + } + + /** + * Defines the creator of the document. This is typically the name of the application that generates the PDF. + * @param string $creator The name of the creator. + * @access public + * @since 1.2 + * @see SetAuthor(), SetKeywords(), SetSubject(), SetTitle() + */ + public function SetCreator($creator) { + //Creator of document + $this->creator = $creator; + } + + /** + * This method is automatically called in case of fatal error; it simply outputs the message and halts the execution. An inherited class may override it to customize the error handling but should always halt the script, or the resulting document would probably be invalid. + * 2004-06-11 :: Nicola Asuni : changed bold tag with strong + * @param string $msg The error message + * @access public + * @since 1.0 + */ + public function Error($msg) { + // unset all class variables + $this->_destroy(true); + // exit program and print error + die('<strong>TCPDF ERROR: </strong>'.$msg); + } + + /** + * This method begins the generation of the PDF document. + * It is not necessary to call it explicitly because AddPage() does it automatically. + * Note: no page is created by this method + * @access public + * @since 1.0 + * @see AddPage(), Close() + */ + public function Open() { + //Begin document + $this->state = 1; + } + + /** + * Terminates the PDF document. + * It is not necessary to call this method explicitly because Output() does it automatically. + * If the document contains no page, AddPage() is called to prevent from getting an invalid document. + * @access public + * @since 1.0 + * @see Open(), Output() + */ + public function Close() { + if ($this->state == 3) { + return; + } + if ($this->page == 0) { + $this->AddPage(); + } + // close page + $this->endPage(); + // close document + $this->_enddoc(); + // unset all class variables (except critical ones) + $this->_destroy(false); + } + + /** + * Move pointer at the specified document page and update page dimensions. + * @param int $pnum page number (1 ... numpages) + * @param boolean $resetmargins if true reset left, right, top margins and Y position. + * @access public + * @since 2.1.000 (2008-01-07) + * @see getPage(), lastpage(), getNumPages() + */ + public function setPage($pnum, $resetmargins=false) { + if ($pnum == $this->page) { + return; + } + if (($pnum > 0) AND ($pnum <= $this->numpages)) { + $this->state = 2; + // save current graphic settings + //$gvars = $this->getGraphicVars(); + $oldpage = $this->page; + $this->page = $pnum; + $this->wPt = $this->pagedim[$this->page]['w']; + $this->hPt = $this->pagedim[$this->page]['h']; + $this->w = $this->wPt / $this->k; + $this->h = $this->hPt / $this->k; + $this->tMargin = $this->pagedim[$this->page]['tm']; + $this->bMargin = $this->pagedim[$this->page]['bm']; + $this->original_lMargin = $this->pagedim[$this->page]['olm']; + $this->original_rMargin = $this->pagedim[$this->page]['orm']; + $this->AutoPageBreak = $this->pagedim[$this->page]['pb']; + $this->CurOrientation = $this->pagedim[$this->page]['or']; + $this->SetAutoPageBreak($this->AutoPageBreak, $this->bMargin); + // restore graphic settings + //$this->setGraphicVars($gvars); + if ($resetmargins) { + $this->lMargin = $this->pagedim[$this->page]['olm']; + $this->rMargin = $this->pagedim[$this->page]['orm']; + $this->SetY($this->tMargin); + } else { + // account for booklet mode + if ($this->pagedim[$this->page]['olm'] != $this->pagedim[$oldpage]['olm']) { + $deltam = $this->pagedim[$this->page]['olm'] - $this->pagedim[$this->page]['orm']; + $this->lMargin += $deltam; + $this->rMargin -= $deltam; + } + } + } else { + $this->Error('Wrong page number on setPage() function.'); + } + } + + /** + * Reset pointer to the last document page. + * @param boolean $resetmargins if true reset left, right, top margins and Y position. + * @access public + * @since 2.0.000 (2008-01-04) + * @see setPage(), getPage(), getNumPages() + */ + public function lastPage($resetmargins=false) { + $this->setPage($this->getNumPages(), $resetmargins); + } + + /** + * Get current document page number. + * @return int page number + * @access public + * @since 2.1.000 (2008-01-07) + * @see setPage(), lastpage(), getNumPages() + */ + public function getPage() { + return $this->page; + } + + + /** + * Get the total number of insered pages. + * @return int number of pages + * @access public + * @since 2.1.000 (2008-01-07) + * @see setPage(), getPage(), lastpage() + */ + public function getNumPages() { + return $this->numpages; + } + + /** + * Adds a new TOC (Table Of Content) page to the document. + * @param string $orientation page orientation. + * @param boolean $keepmargins if true overwrites the default page margins with the current margins + * @access public + * @since 5.0.001 (2010-05-06) + * @see AddPage(), startPage(), endPage(), endTOCPage() + */ + public function addTOCPage($orientation='', $format='', $keepmargins=false) { + $this->AddPage($orientation, $format, $keepmargins, true); + } + + /** + * Terminate the current TOC (Table Of Content) page + * @access public + * @since 5.0.001 (2010-05-06) + * @see AddPage(), startPage(), endPage(), addTOCPage() + */ + public function endTOCPage() { + $this->endPage(true); + } + + /** + * Adds a new page to the document. If a page is already present, the Footer() method is called first to output the footer (if enabled). Then the page is added, the current position set to the top-left corner according to the left and top margins (or top-right if in RTL mode), and Header() is called to display the header (if enabled). + * The origin of the coordinate system is at the top-left corner (or top-right for RTL) and increasing ordinates go downwards. + * @param string $orientation page orientation. Possible values are (case insensitive):<ul><li>P or PORTRAIT (default)</li><li>L or LANDSCAPE</li></ul> + * @param mixed $format The format used for pages. It can be either one of the following values (case insensitive) or a custom format in the form of a two-element array containing the width and the height (expressed in the unit given by unit).<ul><li>4A0</li><li>2A0</li><li>A0</li><li>A1</li><li>A2</li><li>A3</li><li>A4 (default)</li><li>A5</li><li>A6</li><li>A7</li><li>A8</li><li>A9</li><li>A10</li><li>B0</li><li>B1</li><li>B2</li><li>B3</li><li>B4</li><li>B5</li><li>B6</li><li>B7</li><li>B8</li><li>B9</li><li>B10</li><li>C0</li><li>C1</li><li>C2</li><li>C3</li><li>C4</li><li>C5</li><li>C6</li><li>C7</li><li>C8</li><li>C9</li><li>C10</li><li>RA0</li><li>RA1</li><li>RA2</li><li>RA3</li><li>RA4</li><li>SRA0</li><li>SRA1</li><li>SRA2</li><li>SRA3</li><li>SRA4</li><li>LETTER</li><li>LEGAL</li><li>EXECUTIVE</li><li>FOLIO</li></ul> + * @param boolean $keepmargins if true overwrites the default page margins with the current margins + * @param boolean $tocpage if true set the tocpage state to true (the added page will be used to display Table Of Content). + * @access public + * @since 1.0 + * @see startPage(), endPage(), addTOCPage(), endTOCPage() + */ + public function AddPage($orientation='', $format='', $keepmargins=false, $tocpage=false) { + if (!isset($this->original_lMargin) OR $keepmargins) { + $this->original_lMargin = $this->lMargin; + } + if (!isset($this->original_rMargin) OR $keepmargins) { + $this->original_rMargin = $this->rMargin; + } + // terminate previous page + $this->endPage(); + // start new page + $this->startPage($orientation, $format, $tocpage); + } + + /** + * Terminate the current page + * @param boolean $tocpage if true set the tocpage state to false (end the page used to display Table Of Content). + * @access public + * @since 4.2.010 (2008-11-14) + * @see AddPage(), startPage(), addTOCPage(), endTOCPage() + */ + public function endPage($tocpage=false) { + // check if page is already closed + if (($this->page == 0) OR ($this->numpages > $this->page) OR (!$this->pageopen[$this->page])) { + return; + } + $this->InFooter = true; + // print page footer + $this->setFooter(); + // close page + $this->_endpage(); + // mark page as closed + $this->pageopen[$this->page] = false; + $this->InFooter = false; + if ($tocpage) { + $this->tocpage = false; + } + } + + /** + * Starts a new page to the document. The page must be closed using the endPage() function. + * The origin of the coordinate system is at the top-left corner and increasing ordinates go downwards. + * @param string $orientation page orientation. Possible values are (case insensitive):<ul><li>P or PORTRAIT (default)</li><li>L or LANDSCAPE</li></ul> + * @param mixed $format The format used for pages. It can be either one of the following values (case insensitive) or a custom format in the form of a two-element array containing the width and the height (expressed in the unit given by unit).<ul><li>4A0</li><li>2A0</li><li>A0</li><li>A1</li><li>A2</li><li>A3</li><li>A4 (default)</li><li>A5</li><li>A6</li><li>A7</li><li>A8</li><li>A9</li><li>A10</li><li>B0</li><li>B1</li><li>B2</li><li>B3</li><li>B4</li><li>B5</li><li>B6</li><li>B7</li><li>B8</li><li>B9</li><li>B10</li><li>C0</li><li>C1</li><li>C2</li><li>C3</li><li>C4</li><li>C5</li><li>C6</li><li>C7</li><li>C8</li><li>C9</li><li>C10</li><li>RA0</li><li>RA1</li><li>RA2</li><li>RA3</li><li>RA4</li><li>SRA0</li><li>SRA1</li><li>SRA2</li><li>SRA3</li><li>SRA4</li><li>LETTER</li><li>LEGAL</li><li>EXECUTIVE</li><li>FOLIO</li></ul> + * @param boolean $tocpage if true set the tocpage state to true (the added page will be used to display Table of Content). + * @access public + * @since 4.2.010 (2008-11-14) + * @see AddPage(), endPage(), addTOCPage(), endTOCPage() + */ + public function startPage($orientation='', $format='', $tocpage=false) { + if ($tocpage) { + $this->tocpage = true; + } + if ($this->numpages > $this->page) { + // this page has been already added + $this->setPage($this->page + 1); + $this->SetY($this->tMargin); + return; + } + // start a new page + if ($this->state == 0) { + $this->Open(); + } + ++$this->numpages; + $this->swapMargins($this->booklet); + // save current graphic settings + $gvars = $this->getGraphicVars(); + // start new page + $this->_beginpage($orientation, $format); + // mark page as open + $this->pageopen[$this->page] = true; + // restore graphic settings + $this->setGraphicVars($gvars); + // mark this point + $this->setPageMark(); + // print page header + $this->setHeader(); + // restore graphic settings + $this->setGraphicVars($gvars); + // mark this point + $this->setPageMark(); + // print table header (if any) + $this->setTableHeader(); + } + + /** + * Set start-writing mark on current page stream used to put borders and fills. + * Borders and fills are always created after content and inserted on the position marked by this method. + * This function must be called after calling Image() function for a background image. + * Background images must be always inserted before calling Multicell() or WriteHTMLCell() or WriteHTML() functions. + * @access public + * @since 4.0.016 (2008-07-30) + */ + public function setPageMark() { + $this->intmrk[$this->page] = $this->pagelen[$this->page]; + $this->setContentMark(); + } + + /** + * Set start-writing mark on selected page. + * Borders and fills are always created after content and inserted on the position marked by this method. + * @param int $page page number (default is the current page) + * @access protected + * @since 4.6.021 (2009-07-20) + */ + protected function setContentMark($page=0) { + if ($page <= 0) { + $page = $this->page; + } + if (isset($this->footerlen[$page])) { + $this->cntmrk[$page] = $this->pagelen[$page] - $this->footerlen[$page]; + } else { + $this->cntmrk[$page] = $this->pagelen[$page]; + } + } + + /** + * Set header data. + * @param string $ln header image logo + * @param string $lw header image logo width in mm + * @param string $ht string to print as title on document header + * @param string $hs string to print on document header + * @access public + */ + public function setHeaderData($ln='', $lw=0, $ht='', $hs='') { + $this->header_logo = $ln; + $this->header_logo_width = $lw; + $this->header_title = $ht; + $this->header_string = $hs; + } + + /** + * Returns header data: + * <ul><li>$ret['logo'] = logo image</li><li>$ret['logo_width'] = width of the image logo in user units</li><li>$ret['title'] = header title</li><li>$ret['string'] = header description string</li></ul> + * @return array() + * @access public + * @since 4.0.012 (2008-07-24) + */ + public function getHeaderData() { + $ret = array(); + $ret['logo'] = $this->header_logo; + $ret['logo_width'] = $this->header_logo_width; + $ret['title'] = $this->header_title; + $ret['string'] = $this->header_string; + return $ret; + } + + /** + * Set header margin. + * (minimum distance between header and top page margin) + * @param int $hm distance in user units + * @access public + */ + public function setHeaderMargin($hm=10) { + $this->header_margin = $hm; + } + + /** + * Returns header margin in user units. + * @return float + * @since 4.0.012 (2008-07-24) + * @access public + */ + public function getHeaderMargin() { + return $this->header_margin; + } + + /** + * Set footer margin. + * (minimum distance between footer and bottom page margin) + * @param int $fm distance in user units + * @access public + */ + public function setFooterMargin($fm=10) { + $this->footer_margin = $fm; + } + + /** + * Returns footer margin in user units. + * @return float + * @since 4.0.012 (2008-07-24) + * @access public + */ + public function getFooterMargin() { + return $this->footer_margin; + } + /** + * Set a flag to print page header. + * @param boolean $val set to true to print the page header (default), false otherwise. + * @access public + */ + public function setPrintHeader($val=true) { + $this->print_header = $val; + } + + /** + * Set a flag to print page footer. + * @param boolean $value set to true to print the page footer (default), false otherwise. + * @access public + */ + public function setPrintFooter($val=true) { + $this->print_footer = $val; + } + + /** + * Return the right-bottom (or left-bottom for RTL) corner X coordinate of last inserted image + * @return float + * @access public + */ + public function getImageRBX() { + return $this->img_rb_x; + } + + /** + * Return the right-bottom (or left-bottom for RTL) corner Y coordinate of last inserted image + * @return float + * @access public + */ + public function getImageRBY() { + return $this->img_rb_y; + } + + /** + * This method is used to render the page header. + * It is automatically called by AddPage() and could be overwritten in your own inherited class. + * @access public + */ + public function Header() { + $ormargins = $this->getOriginalMargins(); + $headerfont = $this->getHeaderFont(); + $headerdata = $this->getHeaderData(); + if (($headerdata['logo']) AND ($headerdata['logo'] != K_BLANK_IMAGE)) { + $this->Image(K_PATH_IMAGES.$headerdata['logo'], $this->GetX(), $this->getHeaderMargin(), $headerdata['logo_width']); + $imgy = $this->getImageRBY(); + } else { + $imgy = $this->GetY(); + } + $cell_height = round(($this->getCellHeightRatio() * $headerfont[2]) / $this->getScaleFactor(), 2); + // set starting margin for text data cell + if ($this->getRTL()) { + $header_x = $ormargins['right'] + ($headerdata['logo_width'] * 1.1); + } else { + $header_x = $ormargins['left'] + ($headerdata['logo_width'] * 1.1); + } + $this->SetTextColor(0, 0, 0); + // header title + $this->SetFont($headerfont[0], 'B', $headerfont[2] + 1); + $this->SetX($header_x); + $this->Cell(0, $cell_height, $headerdata['title'], 0, 1, '', 0, '', 0); + // header string + $this->SetFont($headerfont[0], $headerfont[1], $headerfont[2]); + $this->SetX($header_x); + $this->MultiCell(0, $cell_height, $headerdata['string'], 0, '', 0, 1, '', '', true, 0, false); + // print an ending header line + $this->SetLineStyle(array('width' => 0.85 / $this->getScaleFactor(), 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))); + $this->SetY((2.835 / $this->getScaleFactor()) + max($imgy, $this->GetY())); + if ($this->getRTL()) { + $this->SetX($ormargins['right']); + } else { + $this->SetX($ormargins['left']); + } + $this->Cell(0, 0, '', 'T', 0, 'C'); + } + + /** + * This method is used to render the page footer. + * It is automatically called by AddPage() and could be overwritten in your own inherited class. + * @access public + */ + public function Footer() { + $cur_y = $this->GetY(); + $ormargins = $this->getOriginalMargins(); + $this->SetTextColor(0, 0, 0); + //set style for cell border + $line_width = 0.85 / $this->getScaleFactor(); + $this->SetLineStyle(array('width' => $line_width, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0))); + //print document barcode + $barcode = $this->getBarcode(); + if (!empty($barcode)) { + $this->Ln($line_width); + $barcode_width = round(($this->getPageWidth() - $ormargins['left'] - $ormargins['right'])/3); + $this->write1DBarcode($barcode, 'C128B', $this->GetX(), $cur_y + $line_width, $barcode_width, (($this->getFooterMargin() / 3) - $line_width), 0.3, '', ''); + } + if (empty($this->pagegroups)) { + $pagenumtxt = $this->l['w_page'].' '.$this->getAliasNumPage().' / '.$this->getAliasNbPages(); + } else { + $pagenumtxt = $this->l['w_page'].' '.$this->getPageNumGroupAlias().' / '.$this->getPageGroupAlias(); + } + $this->SetY($cur_y); + //Print page number + if ($this->getRTL()) { + $this->SetX($ormargins['right']); + $this->Cell(0, 0, $pagenumtxt, 'T', 0, 'L'); + } else { + $this->SetX($ormargins['left']); + $this->Cell(0, 0, $pagenumtxt, 'T', 0, 'R'); + } + } + + /** + * This method is used to render the page header. + * @access protected + * @since 4.0.012 (2008-07-24) + */ + protected function setHeader() { + if ($this->print_header) { + $temp_thead = $this->thead; + $temp_theadMargins = $this->theadMargins; + $lasth = $this->lasth; + $this->_out('q'); + $this->rMargin = $this->original_rMargin; + $this->lMargin = $this->original_lMargin; + $this->cMargin = 0; + //set current position + if ($this->rtl) { + $this->SetXY($this->original_rMargin, $this->header_margin); + } else { + $this->SetXY($this->original_lMargin, $this->header_margin); + } + $this->SetFont($this->header_font[0], $this->header_font[1], $this->header_font[2]); + $this->Header(); + //restore position + if ($this->rtl) { + $this->SetXY($this->original_rMargin, $this->tMargin); + } else { + $this->SetXY($this->original_lMargin, $this->tMargin); + } + $this->_out('Q'); + $this->lasth = $lasth; + $this->thead = $temp_thead; + $this->theadMargins = $temp_theadMargins; + $this->newline = false; + } + } + + /** + * This method is used to render the page footer. + * @access protected + * @since 4.0.012 (2008-07-24) + */ + protected function setFooter() { + //Page footer + // save current graphic settings + $gvars = $this->getGraphicVars(); + // mark this point + $this->footerpos[$this->page] = $this->pagelen[$this->page]; + $this->_out("\n"); + if ($this->print_footer) { + $temp_thead = $this->thead; + $temp_theadMargins = $this->theadMargins; + $lasth = $this->lasth; + $this->_out('q'); + $this->rMargin = $this->original_rMargin; + $this->lMargin = $this->original_lMargin; + $this->cMargin = 0; + //set current position + $footer_y = $this->h - $this->footer_margin; + if ($this->rtl) { + $this->SetXY($this->original_rMargin, $footer_y); + } else { + $this->SetXY($this->original_lMargin, $footer_y); + } + $this->SetFont($this->footer_font[0], $this->footer_font[1], $this->footer_font[2]); + $this->Footer(); + //restore position + if ($this->rtl) { + $this->SetXY($this->original_rMargin, $this->tMargin); + } else { + $this->SetXY($this->original_lMargin, $this->tMargin); + } + $this->_out('Q'); + $this->lasth = $lasth; + $this->thead = $temp_thead; + $this->theadMargins = $temp_theadMargins; + } + // restore graphic settings + $this->setGraphicVars($gvars); + // calculate footer length + $this->footerlen[$this->page] = $this->pagelen[$this->page] - $this->footerpos[$this->page] + 1; + } + + /** + * This method is used to render the table header on new page (if any). + * @access protected + * @since 4.5.030 (2009-03-25) + */ + protected function setTableHeader() { + if ($this->num_columns > 1) { + // multi column mode + return; + } + if (isset($this->theadMargins['top'])) { + // restore the original top-margin + $this->tMargin = $this->theadMargins['top']; + $this->pagedim[$this->page]['tm'] = $this->tMargin; + $this->y = $this->tMargin; + } + if (!$this->empty_string($this->thead) AND (!$this->inthead)) { + // set margins + $prev_lMargin = $this->lMargin; + $prev_rMargin = $this->rMargin; + $this->lMargin = $this->pagedim[$this->page]['olm']; + $this->rMargin = $this->pagedim[$this->page]['orm']; + $this->cMargin = $this->theadMargins['cmargin']; + if ($this->rtl) { + $this->x = $this->w - $this->rMargin; + } else { + $this->x = $this->lMargin; + } + // print table header + $this->writeHTML($this->thead, false, false, false, false, ''); + // set new top margin to skip the table headers + if (!isset($this->theadMargins['top'])) { + $this->theadMargins['top'] = $this->tMargin; + } + $this->tMargin = $this->y; + $this->pagedim[$this->page]['tm'] = $this->tMargin; + $this->lasth = 0; + $this->lMargin = $prev_lMargin; + $this->rMargin = $prev_rMargin; + } + } + + /** + * Returns the current page number. + * @return int page number + * @access public + * @since 1.0 + * @see AliasNbPages(), getAliasNbPages() + */ + public function PageNo() { + return $this->page; + } + + /** + * Defines a new spot color. + * It can be expressed in RGB components or gray scale. + * The method can be called before the first page is created and the value is retained from page to page. + * @param int $c Cyan color for CMYK. Value between 0 and 255 + * @param int $m Magenta color for CMYK. Value between 0 and 255 + * @param int $y Yellow color for CMYK. Value between 0 and 255 + * @param int $k Key (Black) color for CMYK. Value between 0 and 255 + * @access public + * @since 4.0.024 (2008-09-12) + * @see SetDrawSpotColor(), SetFillSpotColor(), SetTextSpotColor() + */ + public function AddSpotColor($name, $c, $m, $y, $k) { + if (!isset($this->spot_colors[$name])) { + $i = 1 + count($this->spot_colors); + $this->spot_colors[$name] = array('i' => $i, 'c' => $c, 'm' => $m, 'y' => $y, 'k' => $k); + } + } + + /** + * Defines the color used for all drawing operations (lines, rectangles and cell borders). + * It can be expressed in RGB components or gray scale. + * The method can be called before the first page is created and the value is retained from page to page. + * @param array $color array of colors + * @access public + * @since 3.1.000 (2008-06-11) + * @see SetDrawColor() + */ + public function SetDrawColorArray($color) { + if (isset($color)) { + $color = array_values($color); + $r = isset($color[0]) ? $color[0] : -1; + $g = isset($color[1]) ? $color[1] : -1; + $b = isset($color[2]) ? $color[2] : -1; + $k = isset($color[3]) ? $color[3] : -1; + if ($r >= 0) { + $this->SetDrawColor($r, $g, $b, $k); + } + } + } + + /** + * Defines the color used for all drawing operations (lines, rectangles and cell borders). It can be expressed in RGB components or gray scale. The method can be called before the first page is created and the value is retained from page to page. + * @param int $col1 Gray level for single color, or Red color for RGB, or Cyan color for CMYK. Value between 0 and 255 + * @param int $col2 Green color for RGB, or Magenta color for CMYK. Value between 0 and 255 + * @param int $col3 Blue color for RGB, or Yellow color for CMYK. Value between 0 and 255 + * @param int $col4 Key (Black) color for CMYK. Value between 0 and 255 + * @access public + * @since 1.3 + * @see SetDrawColorArray(), SetFillColor(), SetTextColor(), Line(), Rect(), Cell(), MultiCell() + */ + public function SetDrawColor($col1=0, $col2=-1, $col3=-1, $col4=-1) { + // set default values + if (!is_numeric($col1)) { + $col1 = 0; + } + if (!is_numeric($col2)) { + $col2 = -1; + } + if (!is_numeric($col3)) { + $col3 = -1; + } + if (!is_numeric($col4)) { + $col4 = -1; + } + //Set color for all stroking operations + if (($col2 == -1) AND ($col3 == -1) AND ($col4 == -1)) { + // Grey scale + $this->DrawColor = sprintf('%.3F G', $col1/255); + $this->strokecolor = array('G' => $col1); + } elseif ($col4 == -1) { + // RGB + $this->DrawColor = sprintf('%.3F %.3F %.3F RG', $col1/255, $col2/255, $col3/255); + $this->strokecolor = array('R' => $col1, 'G' => $col2, 'B' => $col3); + } else { + // CMYK + $this->DrawColor = sprintf('%.3F %.3F %.3F %.3F K', $col1/100, $col2/100, $col3/100, $col4/100); + $this->strokecolor = array('C' => $col1, 'M' => $col2, 'Y' => $col3, 'K' => $col4); + } + if ($this->page > 0) { + $this->_out($this->DrawColor); + } + } + + /** + * Defines the spot color used for all drawing operations (lines, rectangles and cell borders). + * @param string $name name of the spot color + * @param int $tint the intensity of the color (from 0 to 100 ; 100 = full intensity by default). + * @access public + * @since 4.0.024 (2008-09-12) + * @see AddSpotColor(), SetFillSpotColor(), SetTextSpotColor() + */ + public function SetDrawSpotColor($name, $tint=100) { + if (!isset($this->spot_colors[$name])) { + $this->Error('Undefined spot color: '.$name); + } + $this->DrawColor = sprintf('/CS%d CS %.3F SCN', $this->spot_colors[$name]['i'], $tint/100); + if ($this->page > 0) { + $this->_out($this->DrawColor); + } + } + + /** + * Defines the color used for all filling operations (filled rectangles and cell backgrounds). + * It can be expressed in RGB components or gray scale. + * The method can be called before the first page is created and the value is retained from page to page. + * @param array $color array of colors + * @access public + * @since 3.1.000 (2008-6-11) + * @see SetFillColor() + */ + public function SetFillColorArray($color) { + if (isset($color)) { + $color = array_values($color); + $r = isset($color[0]) ? $color[0] : -1; + $g = isset($color[1]) ? $color[1] : -1; + $b = isset($color[2]) ? $color[2] : -1; + $k = isset($color[3]) ? $color[3] : -1; + if ($r >= 0) { + $this->SetFillColor($r, $g, $b, $k); + } + } + } + + /** + * Defines the color used for all filling operations (filled rectangles and cell backgrounds). It can be expressed in RGB components or gray scale. The method can be called before the first page is created and the value is retained from page to page. + * @param int $col1 Gray level for single color, or Red color for RGB, or Cyan color for CMYK. Value between 0 and 255 + * @param int $col2 Green color for RGB, or Magenta color for CMYK. Value between 0 and 255 + * @param int $col3 Blue color for RGB, or Yellow color for CMYK. Value between 0 and 255 + * @param int $col4 Key (Black) color for CMYK. Value between 0 and 255 + * @access public + * @since 1.3 + * @see SetFillColorArray(), SetDrawColor(), SetTextColor(), Rect(), Cell(), MultiCell() + */ + public function SetFillColor($col1=0, $col2=-1, $col3=-1, $col4=-1) { + // set default values + if (!is_numeric($col1)) { + $col1 = 0; + } + if (!is_numeric($col2)) { + $col2 = -1; + } + if (!is_numeric($col3)) { + $col3 = -1; + } + if (!is_numeric($col4)) { + $col4 = -1; + } + //Set color for all filling operations + if (($col2 == -1) AND ($col3 == -1) AND ($col4 == -1)) { + // Grey scale + $this->FillColor = sprintf('%.3F g', $col1/255); + $this->bgcolor = array('G' => $col1); + } elseif ($col4 == -1) { + // RGB + $this->FillColor = sprintf('%.3F %.3F %.3F rg', $col1/255, $col2/255, $col3/255); + $this->bgcolor = array('R' => $col1, 'G' => $col2, 'B' => $col3); + } else { + // CMYK + $this->FillColor = sprintf('%.3F %.3F %.3F %.3F k', $col1/100, $col2/100, $col3/100, $col4/100); + $this->bgcolor = array('C' => $col1, 'M' => $col2, 'Y' => $col3, 'K' => $col4); + } + $this->ColorFlag = ($this->FillColor != $this->TextColor); + if ($this->page > 0) { + $this->_out($this->FillColor); + } + } + + /** + * Defines the spot color used for all filling operations (filled rectangles and cell backgrounds). + * @param string $name name of the spot color + * @param int $tint the intensity of the color (from 0 to 100 ; 100 = full intensity by default). + * @access public + * @since 4.0.024 (2008-09-12) + * @see AddSpotColor(), SetDrawSpotColor(), SetTextSpotColor() + */ + public function SetFillSpotColor($name, $tint=100) { + if (!isset($this->spot_colors[$name])) { + $this->Error('Undefined spot color: '.$name); + } + $this->FillColor = sprintf('/CS%d cs %.3F scn', $this->spot_colors[$name]['i'], $tint/100); + $this->ColorFlag = ($this->FillColor != $this->TextColor); + if ($this->page > 0) { + $this->_out($this->FillColor); + } + } + + /** + * Defines the color used for text. It can be expressed in RGB components or gray scale. + * The method can be called before the first page is created and the value is retained from page to page. + * @param array $color array of colors + * @access public + * @since 3.1.000 (2008-6-11) + * @see SetFillColor() + */ + public function SetTextColorArray($color) { + if (isset($color)) { + $color = array_values($color); + $r = isset($color[0]) ? $color[0] : -1; + $g = isset($color[1]) ? $color[1] : -1; + $b = isset($color[2]) ? $color[2] : -1; + $k = isset($color[3]) ? $color[3] : -1; + if ($r >= 0) { + $this->SetTextColor($r, $g, $b, $k); + } + } + } + + /** + * Defines the color used for text. It can be expressed in RGB components or gray scale. The method can be called before the first page is created and the value is retained from page to page. + * @param int $col1 Gray level for single color, or Red color for RGB, or Cyan color for CMYK. Value between 0 and 255 + * @param int $col2 Green color for RGB, or Magenta color for CMYK. Value between 0 and 255 + * @param int $col3 Blue color for RGB, or Yellow color for CMYK. Value between 0 and 255 + * @param int $col4 Key (Black) color for CMYK. Value between 0 and 255 + * @access public + * @since 1.3 + * @see SetTextColorArray(), SetDrawColor(), SetFillColor(), Text(), Cell(), MultiCell() + */ + public function SetTextColor($col1=0, $col2=-1, $col3=-1, $col4=-1) { + // set default values + if (!is_numeric($col1)) { + $col1 = 0; + } + if (!is_numeric($col2)) { + $col2 = -1; + } + if (!is_numeric($col3)) { + $col3 = -1; + } + if (!is_numeric($col4)) { + $col4 = -1; + } + //Set color for text + if (($col2 == -1) AND ($col3 == -1) AND ($col4 == -1)) { + // Grey scale + $this->TextColor = sprintf('%.3F g', $col1/255); + $this->fgcolor = array('G' => $col1); + } elseif ($col4 == -1) { + // RGB + $this->TextColor = sprintf('%.3F %.3F %.3F rg', $col1/255, $col2/255, $col3/255); + $this->fgcolor = array('R' => $col1, 'G' => $col2, 'B' => $col3); + } else { + // CMYK + $this->TextColor = sprintf('%.3F %.3F %.3F %.3F k', $col1/100, $col2/100, $col3/100, $col4/100); + $this->fgcolor = array('C' => $col1, 'M' => $col2, 'Y' => $col3, 'K' => $col4); + } + $this->ColorFlag = ($this->FillColor != $this->TextColor); + } + + /** + * Defines the spot color used for text. + * @param string $name name of the spot color + * @param int $tint the intensity of the color (from 0 to 100 ; 100 = full intensity by default). + * @access public + * @since 4.0.024 (2008-09-12) + * @see AddSpotColor(), SetDrawSpotColor(), SetFillSpotColor() + */ + public function SetTextSpotColor($name, $tint=100) { + if (!isset($this->spot_colors[$name])) { + $this->Error('Undefined spot color: '.$name); + } + $this->TextColor = sprintf('/CS%d cs %.3F scn', $this->spot_colors[$name]['i'], $tint/100); + $this->ColorFlag = ($this->FillColor != $this->TextColor); + if ($this->page > 0) { + $this->_out($this->TextColor); + } + } + + /** + * Returns the length of a string in user unit. A font must be selected.<br> + * @param string $s The string whose length is to be computed + * @param string $fontname Family font. It can be either a name defined by AddFont() or one of the standard families. It is also possible to pass an empty string, in that case, the current family is retained. + * @param string $fontstyle Font style. Possible values are (case insensitive):<ul><li>empty string: regular</li><li>B: bold</li><li>I: italic</li><li>U: underline</li><li>D: line-trough</li><li>O: overline</li></ul> or any combination. The default value is regular. + * @param float $fontsize Font size in points. The default value is the current size. + * @param boolean $getarray if true returns an array of characters widths, if false returns the total length. + * @return mixed int total string length or array of characted widths + * @author Nicola Asuni + * @access public + * @since 1.2 + */ + public function GetStringWidth($s, $fontname='', $fontstyle='', $fontsize=0, $getarray=false) { + return $this->GetArrStringWidth($this->utf8Bidi($this->UTF8StringToArray($s), $s, $this->tmprtl), $fontname, $fontstyle, $fontsize, $getarray); + } + + /** + * Returns the string length of an array of chars in user unit or an array of characters widths. A font must be selected.<br> + * @param string $sa The array of chars whose total length is to be computed + * @param string $fontname Family font. It can be either a name defined by AddFont() or one of the standard families. It is also possible to pass an empty string, in that case, the current family is retained. + * @param string $fontstyle Font style. Possible values are (case insensitive):<ul><li>empty string: regular</li><li>B: bold</li><li>I: italic</li><li>U: underline</li><li>D: line trough</li><li>O: overline</li></ul> or any combination. The default value is regular. + * @param float $fontsize Font size in points. The default value is the current size. + * @param boolean $getarray if true returns an array of characters widths, if false returns the total length. + * @return mixed int total string length or array of characted widths + * @author Nicola Asuni + * @access public + * @since 2.4.000 (2008-03-06) + */ + public function GetArrStringWidth($sa, $fontname='', $fontstyle='', $fontsize=0, $getarray=false) { + // store current values + if (!$this->empty_string($fontname)) { + $prev_FontFamily = $this->FontFamily; + $prev_FontStyle = $this->FontStyle; + $prev_FontSizePt = $this->FontSizePt; + $this->SetFont($fontname, $fontstyle, $fontsize); + } + // convert UTF-8 array to Latin1 if required + $sa = $this->UTF8ArrToLatin1($sa); + $w = 0; // total width + $wa = array(); // array of characters widths + foreach ($sa as $char) { + // character width + $cw = $this->GetCharWidth($char); + $wa[] = $cw; + $w += $cw; + } + // restore previous values + if (!$this->empty_string($fontname)) { + $this->SetFont($prev_FontFamily, $prev_FontStyle, $prev_FontSizePt); + } + if ($getarray) { + return $wa; + } + return $w; + } + + /** + * Returns the length of the char in user unit for the current font. + * @param int $char The char code whose length is to be returned + * @return int char width + * @author Nicola Asuni + * @access public + * @since 2.4.000 (2008-03-06) + */ + public function GetCharWidth($char) { + if ($char == 173) { + // SHY character will not be printed + return (0); + } + $cw = &$this->CurrentFont['cw']; + if (isset($cw[$char])) { + $w = $cw[$char]; + } elseif (isset($this->CurrentFont['dw'])) { + // default width + $w = $this->CurrentFont['dw']; + } elseif (isset($cw[32])) { + // default width + $w = $cw[32]; + } else { + $w = 600; + } + return ($w * $this->FontSize / 1000); + } + + /** + * Returns the numbero of characters in a string. + * @param string $s The input string. + * @return int number of characters + * @access public + * @since 2.0.0001 (2008-01-07) + */ + public function GetNumChars($s) { + if (($this->CurrentFont['type'] == 'TrueTypeUnicode') OR ($this->CurrentFont['type'] == 'cidfont0')) { + return count($this->UTF8StringToArray($s)); + } + return strlen($s); + } + + /** + * Fill the list of available fonts ($this->fontlist). + * @access protected + * @since 4.0.013 (2008-07-28) + */ + protected function getFontsList() { + $fontsdir = opendir($this->_getfontpath()); + while (($file = readdir($fontsdir)) !== false) { + if (substr($file, -4) == '.php') { + array_push($this->fontlist, strtolower(basename($file, '.php'))); + } + } + closedir($fontsdir); + } + + /** + * Imports a TrueType, Type1, core, or CID0 font and makes it available. + * It is necessary to generate a font definition file first (read /fonts/utils/README.TXT). + * The definition file (and the font file itself when embedding) must be present either in the current directory or in the one indicated by K_PATH_FONTS if the constant is defined. If it could not be found, the error "Could not include font definition file" is generated. + * @param string $family Font family. The name can be chosen arbitrarily. If it is a standard family name, it will override the corresponding font. + * @param string $style Font style. Possible values are (case insensitive):<ul><li>empty string: regular (default)</li><li>B: bold</li><li>I: italic</li><li>BI or IB: bold italic</li></ul> + * @param string $fontfile The font definition file. By default, the name is built from the family and style, in lower case with no spaces. + * @return array containing the font data, or false in case of error. + * @access public + * @since 1.5 + * @see SetFont() + */ + public function AddFont($family, $style='', $fontfile='') { + if ($this->empty_string($family)) { + if (!$this->empty_string($this->FontFamily)) { + $family = $this->FontFamily; + } else { + $this->Error('Empty font family'); + } + } + $family = strtolower($family); + if ((!$this->isunicode) AND ($family == 'arial')) { + $family = 'helvetica'; + } + if (($family == 'symbol') OR ($family == 'zapfdingbats')) { + $style = ''; + } + $tempstyle = strtoupper($style); + $style = ''; + // underline + if (strpos($tempstyle, 'U') !== false) { + $this->underline = true; + } else { + $this->underline = false; + } + // line-through (deleted) + if (strpos($tempstyle, 'D') !== false) { + $this->linethrough = true; + } else { + $this->linethrough = false; + } + // overline + if (strpos($tempstyle, 'O') !== false) { + $this->overline = true; + } else { + $this->overline = false; + } + // bold + if (strpos($tempstyle, 'B') !== false) { + $style .= 'B'; + } + // oblique + if (strpos($tempstyle, 'I') !== false) { + $style .= 'I'; + } + $bistyle = $style; + $fontkey = $family.$style; + $font_style = $style.($this->underline ? 'U' : '').($this->linethrough ? 'D' : '').($this->overline ? 'O' : ''); + $fontdata = array('fontkey' => $fontkey, 'family' => $family, 'style' => $font_style); + // check if the font has been already added + if ($this->getFontBuffer($fontkey) !== false) { + return $fontdata; + } + if (isset($type)) { + unset($type); + } + if (isset($cw)) { + unset($cw); + } + // get specified font directory (if any) + $fontdir = false; + if (!$this->empty_string($fontfile)) { + $fontdir = dirname($fontfile); + if ($this->empty_string($fontdir) OR ($fontdir == '.')) { + $fontdir = ''; + } else { + $fontdir .= '/'; + } + } + // search and include font file + if ($this->empty_string($fontfile) OR (!file_exists($fontfile))) { + // build a standard filenames for specified font + $fontfile1 = str_replace(' ', '', $family).strtolower($style).'.php'; + $fontfile2 = str_replace(' ', '', $family).'.php'; + // search files on various directories + if (($fontdir !== false) AND file_exists($fontdir.$fontfile1)) { + $fontfile = $fontdir.$fontfile1; + } elseif (file_exists($this->_getfontpath().$fontfile1)) { + $fontfile = $this->_getfontpath().$fontfile1; + } elseif (file_exists($fontfile1)) { + $fontfile = $fontfile1; + } elseif (($fontdir !== false) AND file_exists($fontdir.$fontfile2)) { + $fontfile = $fontdir.$fontfile2; + } elseif (file_exists($this->_getfontpath().$fontfile2)) { + $fontfile = $this->_getfontpath().$fontfile2; + } else { + $fontfile = $fontfile2; + } + } + // include font file + if (file_exists($fontfile)) { + include($fontfile); + } else { + $this->Error('Could not include font definition file: '.$family.''); + } + // check font parameters + if ((!isset($type)) OR (!isset($cw))) { + $this->Error('The font definition file has a bad format: '.$fontfile.''); + } + // SET default parameters + if (!isset($file) OR $this->empty_string($file)) { + $file = ''; + } + if (!isset($enc) OR $this->empty_string($enc)) { + $enc = ''; + } + if (!isset($cidinfo) OR $this->empty_string($cidinfo)) { + $cidinfo = array('Registry'=>'Adobe','Ordering'=>'Identity','Supplement'=>0); + $cidinfo['uni2cid'] = array(); + } + if (!isset($ctg) OR $this->empty_string($ctg)) { + $ctg = ''; + } + if (!isset($desc) OR $this->empty_string($desc)) { + $desc = array(); + } + if (!isset($up) OR $this->empty_string($up)) { + $up = -100; + } + if (!isset($ut) OR $this->empty_string($ut)) { + $ut = 50; + } + if (!isset($cw) OR $this->empty_string($cw)) { + $cw = array(); + } + if (!isset($dw) OR $this->empty_string($dw)) { + // set default width + if (isset($desc['MissingWidth']) AND ($desc['MissingWidth'] > 0)) { + $dw = $desc['MissingWidth']; + } elseif (isset($cw[32])) { + $dw = $cw[32]; + } else { + $dw = 600; + } + } + ++$this->numfonts; + if ($type == 'cidfont0') { + // register CID font (all styles at once) + $styles = array('' => '', 'B' => ',Bold', 'I' => ',Italic', 'BI' => ',BoldItalic'); + $sname = $name.$styles[$bistyle]; + // artificial bold + if (strpos($bistyle, 'B') !== false) { + if (isset($desc['StemV'])) { + $desc['StemV'] *= 2; + } else { + $desc['StemV'] = 120; + } + } + // artificial italic + if (strpos($bistyle, 'I') !== false) { + if (isset($desc['ItalicAngle'])) { + $desc['ItalicAngle'] -= 11; + } else { + $desc['ItalicAngle'] = -11; + } + } + } elseif ($type == 'core') { + $name = $this->CoreFonts[$fontkey]; + } elseif (($type == 'TrueType') OR ($type == 'Type1')) { + // ... + } elseif ($type == 'TrueTypeUnicode') { + $enc = 'Identity-H'; + } else { + $this->Error('Unknow font type: '.$type.''); + } + $this->setFontBuffer($fontkey, array('i' => $this->numfonts, 'type' => $type, 'name' => $name, 'desc' => $desc, 'up' => $up, 'ut' => $ut, 'cw' => $cw, 'dw' => $dw, 'enc' => $enc, 'cidinfo' => $cidinfo, 'file' => $file, 'ctg' => $ctg)); + if (isset($diff) AND (!empty($diff))) { + //Search existing encodings + $d = 0; + $nb = count($this->diffs); + for ($i=1; $i <= $nb; ++$i) { + if ($this->diffs[$i] == $diff) { + $d = $i; + break; + } + } + if ($d == 0) { + $d = $nb + 1; + $this->diffs[$d] = $diff; + } + $this->setFontSubBuffer($fontkey, 'diff', $d); + } + if (!$this->empty_string($file)) { + if ((strcasecmp($type,'TrueType') == 0) OR (strcasecmp($type, 'TrueTypeUnicode') == 0)) { + $this->FontFiles[$file] = array('length1' => $originalsize, 'fontdir' => $fontdir); + } elseif ($type != 'core') { + $this->FontFiles[$file] = array('length1' => $size1, 'length2' => $size2, 'fontdir' => $fontdir); + } + } + return $fontdata; + } + + /** + * Sets the font used to print character strings. + * The font can be either a standard one or a font added via the AddFont() method. Standard fonts use Windows encoding cp1252 (Western Europe). + * The method can be called before the first page is created and the font is retained from page to page. + * If you just wish to change the current font size, it is simpler to call SetFontSize(). + * Note: for the standard fonts, the font metric files must be accessible. There are three possibilities for this:<ul><li>They are in the current directory (the one where the running script lies)</li><li>They are in one of the directories defined by the include_path parameter</li><li>They are in the directory defined by the K_PATH_FONTS constant</li></ul><br /> + * @param string $family Family font. It can be either a name defined by AddFont() or one of the standard Type1 families (case insensitive):<ul><li>times (Times-Roman)</li><li>timesb (Times-Bold)</li><li>timesi (Times-Italic)</li><li>timesbi (Times-BoldItalic)</li><li>helvetica (Helvetica)</li><li>helveticab (Helvetica-Bold)</li><li>helveticai (Helvetica-Oblique)</li><li>helveticabi (Helvetica-BoldOblique)</li><li>courier (Courier)</li><li>courierb (Courier-Bold)</li><li>courieri (Courier-Oblique)</li><li>courierbi (Courier-BoldOblique)</li><li>symbol (Symbol)</li><li>zapfdingbats (ZapfDingbats)</li></ul> It is also possible to pass an empty string. In that case, the current family is retained. + * @param string $style Font style. Possible values are (case insensitive):<ul><li>empty string: regular</li><li>B: bold</li><li>I: italic</li><li>U: underline</li><li>D: line trough</li><li>O: overline</li></ul> or any combination. The default value is regular. Bold and italic styles do not apply to Symbol and ZapfDingbats basic fonts or other fonts when not defined. + * @param float $size Font size in points. The default value is the current size. If no size has been specified since the beginning of the document, the value taken is 12 + * @param string $fontfile The font definition file. By default, the name is built from the family and style, in lower case with no spaces. + * @access public + * @since 1.0 + * @see AddFont(), SetFontSize() + */ + public function SetFont($family, $style='', $size=0, $fontfile='') { + //Select a font; size given in points + if ($size == 0) { + $size = $this->FontSizePt; + } + // try to add font (if not already added) + $fontdata = $this->AddFont($family, $style, $fontfile); + $this->FontFamily = $fontdata['family']; + $this->FontStyle = $fontdata['style']; + $this->CurrentFont = $this->getFontBuffer($fontdata['fontkey']); + $this->SetFontSize($size); + } + + /** + * Defines the size of the current font. + * @param float $size The size (in points) + * @access public + * @since 1.0 + * @see SetFont() + */ + public function SetFontSize($size) { + //Set font size in points + $this->FontSizePt = $size; + $this->FontSize = $size / $this->k; + if (isset($this->CurrentFont['desc']['Ascent']) AND ($this->CurrentFont['desc']['Ascent'] > 0)) { + $this->FontAscent = $this->CurrentFont['desc']['Ascent'] * $this->FontSize / 1000; + } else { + $this->FontAscent = 0.85 * $this->FontSize; + } + if (isset($this->CurrentFont['desc']['Descent']) AND ($this->CurrentFont['desc']['Descent'] <= 0)) { + $this->FontDescent = - $this->CurrentFont['desc']['Descent'] * $this->FontSize / 1000; + } else { + $this->FontDescent = 0.15 * $this->FontSize; + } + if (($this->page > 0) AND (isset($this->CurrentFont['i']))) { + $this->_out(sprintf('BT /F%d %.2F Tf ET', $this->CurrentFont['i'], $this->FontSizePt)); + } + } + + /** + * Return the font descent value + * @param string $font font name + * @param string $style font style + * @param float $size The size (in points) + * @return int font descent + * @access public + * @since 4.9.003 (2010-03-30) + */ + public function getFontDescent($font, $style='', $size=0) { + //Set font size in points + $sizek = $size / $this->k; + $fontdata = $this->AddFont($font, $style); + if (isset($fontdata['desc']['Descent']) AND ($fontdata['desc']['Descent'] <= 0)) { + $descent = - $fontdata['desc']['Descent'] * $sizek / 1000; + } else { + $descent = 0.15 * $sizek; + } + return $descent; + } + + /** + * Return the font ascent value + * @param string $font font name + * @param string $style font style + * @param float $size The size (in points) + * @return int font ascent + * @access public + * @since 4.9.003 (2010-03-30) + */ + public function getFontAscent($font, $style='', $size=0) { + //Set font size in points + $sizek = $size / $this->k; + $fontdata = $this->AddFont($font, $style); + if (isset($fontdata['desc']['Ascent']) AND ($fontdata['desc']['Ascent'] > 0)) { + $ascent = $fontdata['desc']['Ascent'] * $sizek / 1000; + } else { + $ascent = 0.85 * $sizek; + } + return $ascent; + } + + /** + * Defines the default monospaced font. + * @param string $font Font name. + * @access public + * @since 4.5.025 + */ + public function SetDefaultMonospacedFont($font) { + $this->default_monospaced_font = $font; + } + + /** + * Creates a new internal link and returns its identifier. An internal link is a clickable area which directs to another place within the document.<br /> + * The identifier can then be passed to Cell(), Write(), Image() or Link(). The destination is defined with SetLink(). + * @access public + * @since 1.5 + * @see Cell(), Write(), Image(), Link(), SetLink() + */ + public function AddLink() { + //Create a new internal link + $n = count($this->links) + 1; + $this->links[$n] = array(0, 0); + return $n; + } + + /** + * Defines the page and position a link points to. + * @param int $link The link identifier returned by AddLink() + * @param float $y Ordinate of target position; -1 indicates the current position. The default value is 0 (top of page) + * @param int $page Number of target page; -1 indicates the current page. This is the default value + * @access public + * @since 1.5 + * @see AddLink() + */ + public function SetLink($link, $y=0, $page=-1) { + if ($y == -1) { + $y = $this->y; + } + if ($page == -1) { + $page = $this->page; + } + $this->links[$link] = array($page, $y); + } + + /** + * Puts a link on a rectangular area of the page. + * Text or image links are generally put via Cell(), Write() or Image(), but this method can be useful for instance to define a clickable area inside an image. + * @param float $x Abscissa of the upper-left corner of the rectangle + * @param float $y Ordinate of the upper-left corner of the rectangle + * @param float $w Width of the rectangle + * @param float $h Height of the rectangle + * @param mixed $link URL or identifier returned by AddLink() + * @param int $spaces number of spaces on the text to link + * @access public + * @since 1.5 + * @see AddLink(), Annotation(), Cell(), Write(), Image() + */ + public function Link($x, $y, $w, $h, $link, $spaces=0) { + $this->Annotation($x, $y, $w, $h, $link, array('Subtype'=>'Link'), $spaces); + } + + /** + * Puts a markup annotation on a rectangular area of the page. + * !!!!THE ANNOTATION SUPPORT IS NOT YET FULLY IMPLEMENTED !!!! + * @param float $x Abscissa of the upper-left corner of the rectangle + * @param float $y Ordinate of the upper-left corner of the rectangle + * @param float $w Width of the rectangle + * @param float $h Height of the rectangle + * @param string $text annotation text or alternate content + * @param array $opt array of options (see section 8.4 of PDF reference 1.7). + * @param int $spaces number of spaces on the text to link + * @access public + * @since 4.0.018 (2008-08-06) + */ + public function Annotation($x, $y, $w, $h, $text, $opt=array('Subtype'=>'Text'), $spaces=0) { + if ($x === '') { + $x = $this->x; + } + if ($y === '') { + $y = $this->y; + } + // recalculate coordinates to account for graphic transformations + if (isset($this->transfmatrix)) { + for ($i=$this->transfmatrix_key; $i > 0; --$i) { + $maxid = count($this->transfmatrix[$i]) - 1; + for ($j=$maxid; $j >= 0; --$j) { + $ctm = $this->transfmatrix[$i][$j]; + if (isset($ctm['a'])) { + $x = $x * $this->k; + $y = ($this->h - $y) * $this->k; + $w = $w * $this->k; + $h = $h * $this->k; + // top left + $xt = $x; + $yt = $y; + $x1 = ($ctm['a'] * $xt) + ($ctm['c'] * $yt) + $ctm['e']; + $y1 = ($ctm['b'] * $xt) + ($ctm['d'] * $yt) + $ctm['f']; + // top right + $xt = $x + $w; + $yt = $y; + $x2 = ($ctm['a'] * $xt) + ($ctm['c'] * $yt) + $ctm['e']; + $y2 = ($ctm['b'] * $xt) + ($ctm['d'] * $yt) + $ctm['f']; + // bottom left + $xt = $x; + $yt = $y - $h; + $x3 = ($ctm['a'] * $xt) + ($ctm['c'] * $yt) + $ctm['e']; + $y3 = ($ctm['b'] * $xt) + ($ctm['d'] * $yt) + $ctm['f']; + // bottom right + $xt = $x + $w; + $yt = $y - $h; + $x4 = ($ctm['a'] * $xt) + ($ctm['c'] * $yt) + $ctm['e']; + $y4 = ($ctm['b'] * $xt) + ($ctm['d'] * $yt) + $ctm['f']; + // new coordinates (rectangle area) + $x = min($x1, $x2, $x3, $x4); + $y = max($y1, $y2, $y3, $y4); + $w = (max($x1, $x2, $x3, $x4) - $x) / $this->k; + $h = ($y - min($y1, $y2, $y3, $y4)) / $this->k; + $x = $x / $this->k; + $y = $this->h - ($y / $this->k); + } + } + } + } + if ($this->page <= 0) { + $page = 1; + } else { + $page = $this->page; + } + if (!isset($this->PageAnnots[$page])) { + $this->PageAnnots[$page] = array(); + } + $this->PageAnnots[$page][] = array('x' => $x, 'y' => $y, 'w' => $w, 'h' => $h, 'txt' => $text, 'opt' => $opt, 'numspaces' => $spaces); + if ((($opt['Subtype'] == 'FileAttachment') OR ($opt['Subtype'] == 'Sound')) AND (!$this->empty_string($opt['FS'])) AND file_exists($opt['FS']) AND (!isset($this->embeddedfiles[basename($opt['FS'])]))) { + $this->embeddedfiles[basename($opt['FS'])] = array('file' => $opt['FS'], 'n' => (count($this->embeddedfiles) + $this->embedded_start_obj_id)); + } + // Add widgets annotation's icons + if (isset($opt['mk']['i']) AND file_exists($opt['mk']['i'])) { + $this->Image($opt['mk']['i'], '', '', 10, 10, '', '', '', false, 300, '', false, false, 0, false, true); + } + if (isset($opt['mk']['ri']) AND file_exists($opt['mk']['ri'])) { + $this->Image($opt['mk']['ri'], '', '', 0, 0, '', '', '', false, 300, '', false, false, 0, false, true); + } + if (isset($opt['mk']['ix']) AND file_exists($opt['mk']['ix'])) { + $this->Image($opt['mk']['ix'], '', '', 0, 0, '', '', '', false, 300, '', false, false, 0, false, true); + } + ++$this->annot_obj_id; + } + + /** + * Embedd the attached files. + * @since 4.4.000 (2008-12-07) + * @access protected + * @see Annotation() + */ + protected function _putEmbeddedFiles() { + reset($this->embeddedfiles); + foreach ($this->embeddedfiles as $filename => $filedata) { + $data = file_get_contents($filedata['file']); + $filter = ''; + if ($this->compress) { + $data = gzcompress($data); + $filter = ' /Filter /FlateDecode'; + } + $this->offsets[$filedata['n']] = $this->bufferlen; + $out = $filedata['n'].' 0 obj'; + $out .= ' <</Type /EmbeddedFile'.$filter.' /Length '.strlen($data).' >>'; + $out .= ' '.$this->_getstream($data, $filedata['n']); + $out .= ' endobj'; + $this->_out($out); + } + } + + /** + * Prints a text cell at the specified position. + * The origin is on the left of the first charcter, on the baseline. + * This method allows to place a string precisely on the page. + * @param float $x Abscissa of the cell origin + * @param float $y Ordinate of the cell origin + * @param string $txt String to print + * @param int $fstroke outline size in user units (false = disable) + * @param boolean $fclip if true activate clipping mode (you must call StartTransform() before this function and StopTransform() to stop the clipping tranformation). + * @param boolean $ffill if true fills the text + * @param mixed $border Indicates if borders must be drawn around the cell. The value can be either a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul>or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> + * @param int $ln Indicates where the current position should go after the call. Possible values are:<ul><li>0: to the right (or left for RTL languages)</li><li>1: to the beginning of the next line</li><li>2: below</li></ul>Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: 0. + * @param string $align Allows to center or align the text. Possible values are:<ul><li>L or empty string: left align (default value)</li><li>C: center</li><li>R: right align</li><li>J: justify</li></ul> + * @param int $fill Indicates if the cell background must be painted (1) or transparent (0). Default value: 0. + * @param mixed $link URL or identifier returned by AddLink(). + * @param int $stretch stretch carachter mode: <ul><li>0 = disabled</li><li>1 = horizontal scaling only if necessary</li><li>2 = forced horizontal scaling</li><li>3 = character spacing only if necessary</li><li>4 = forced character spacing</li></ul> + * @param boolean $ignore_min_height if true ignore automatic minimum height value. + * @param string $calign cell vertical alignment relative to the specified Y value. Possible values are:<ul><li>T : cell top</li><li>A : font top</li><li>L : font baseline</li><li>D : font bottom</li><li>B : cell bottom</li></ul> + * @param string $valign text vertical alignment inside the cell. Possible values are:<ul><li>T : top</li><li>C : center</li><li>B : bottom</li></ul> + * @param boolean $rtloff if true uses the page top-left corner as origin of axis for $x and $y initial position. + * @access public + * @since 1.0 + * @see Cell(), Write(), MultiCell(), WriteHTML(), WriteHTMLCell() + */ + public function Text($x, $y, $txt, $fstroke=false, $fclip=false, $ffill=true, $border=0, $ln=0, $align='', $fill=0, $link='', $stretch=0, $ignore_min_height=false, $calign='T', $valign='M', $rtloff=false) { + $textrendermode = $this->textrendermode; + $textstrokewidth = $this->textstrokewidth; + $this->setTextRenderingMode($fstroke, $ffill, $fclip); + $this->SetXY($x, $y, $rtloff); + $this->Cell(0, 0, $txt, $border, $ln, $align, $fill, $link, $stretch, $ignore_min_height, $calign, $valign); + // restore previous rendering mode + $this->textrendermode = $textrendermode; + $this->textstrokewidth = $textstrokewidth; + } + + /** + * Whenever a page break condition is met, the method is called, and the break is issued or not depending on the returned value. + * The default implementation returns a value according to the mode selected by SetAutoPageBreak().<br /> + * This method is called automatically and should not be called directly by the application. + * @return boolean + * @access public + * @since 1.4 + * @see SetAutoPageBreak() + */ + public function AcceptPageBreak() { + if ($this->num_columns > 1) { + // multi column mode + if($this->current_column < ($this->num_columns - 1)) { + // go to next column + $this->selectColumn($this->current_column + 1); + } else { + // add a new page + $this->AddPage(); + // set first column + $this->selectColumn(0); + } + // avoid page breaking from checkPageBreak() + return false; + } + return $this->AutoPageBreak; + } + + /** + * Add page if needed. + * @param float $h Cell height. Default value: 0. + * @param mixed $y starting y position, leave empty for current position. + * @param boolean $addpage if true add a page, otherwise only return the true/false state + * @return boolean true in case of page break, false otherwise. + * @since 3.2.000 (2008-07-01) + * @access protected + */ + protected function checkPageBreak($h=0, $y='', $addpage=true) { + if ($this->empty_string($y)) { + $y = $this->y; + } + if ((($y + $h) > $this->PageBreakTrigger) AND (!$this->InFooter) AND ($this->AcceptPageBreak())) { + if ($addpage) { + //Automatic page break + $x = $this->x; + $this->AddPage($this->CurOrientation); + $this->y = $this->tMargin; + $oldpage = $this->page - 1; + if ($this->rtl) { + if ($this->pagedim[$this->page]['orm'] != $this->pagedim[$oldpage]['orm']) { + $this->x = $x - ($this->pagedim[$this->page]['orm'] - $this->pagedim[$oldpage]['orm']); + } else { + $this->x = $x; + } + } else { + if ($this->pagedim[$this->page]['olm'] != $this->pagedim[$oldpage]['olm']) { + $this->x = $x + ($this->pagedim[$this->page]['olm'] - $this->pagedim[$oldpage]['olm']); + } else { + $this->x = $x; + } + } + } + return true; + } + return false; + } + + /** + * Prints a cell (rectangular area) with optional borders, background color and character string. The upper-left corner of the cell corresponds to the current position. The text can be aligned or centered. After the call, the current position moves to the right or to the next line. It is possible to put a link on the text.<br /> + * If automatic page breaking is enabled and the cell goes beyond the limit, a page break is done before outputting. + * @param float $w Cell width. If 0, the cell extends up to the right margin. + * @param float $h Cell height. Default value: 0. + * @param string $txt String to print. Default value: empty string. + * @param mixed $border Indicates if borders must be drawn around the cell. The value can be either a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul>or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> + * @param int $ln Indicates where the current position should go after the call. Possible values are:<ul><li>0: to the right (or left for RTL languages)</li><li>1: to the beginning of the next line</li><li>2: below</li></ul> + Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: 0. + * @param string $align Allows to center or align the text. Possible values are:<ul><li>L or empty string: left align (default value)</li><li>C: center</li><li>R: right align</li><li>J: justify</li></ul> + * @param int $fill Indicates if the cell background must be painted (1) or transparent (0). Default value: 0. + * @param mixed $link URL or identifier returned by AddLink(). + * @param int $stretch stretch carachter mode: <ul><li>0 = disabled</li><li>1 = horizontal scaling only if necessary</li><li>2 = forced horizontal scaling</li><li>3 = character spacing only if necessary</li><li>4 = forced character spacing</li></ul> + * @param boolean $ignore_min_height if true ignore automatic minimum height value. + * @param string $calign cell vertical alignment relative to the specified Y value. Possible values are:<ul><li>T : cell top</li><li>C : center</li><li>B : cell bottom</li><li>A : font top</li><li>L : font baseline</li><li>D : font bottom</li></ul> + * @param string $valign text vertical alignment inside the cell. Possible values are:<ul><li>T : top</li><li>C : center</li><li>B : bottom</li></ul> + * @access public + * @since 1.0 + * @see SetFont(), SetDrawColor(), SetFillColor(), SetTextColor(), SetLineWidth(), AddLink(), Ln(), MultiCell(), Write(), SetAutoPageBreak() + */ + public function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=0, $link='', $stretch=0, $ignore_min_height=false, $calign='T', $valign='M') { + if (!$ignore_min_height) { + $min_cell_height = $this->FontSize * $this->cell_height_ratio; + if ($h < $min_cell_height) { + $h = $min_cell_height; + } + } + $this->checkPageBreak($h); + $this->_out($this->getCellCode($w, $h, $txt, $border, $ln, $align, $fill, $link, $stretch, $ignore_min_height, $calign, $valign)); + } + + /** + * Removes SHY characters from text. + * @param string $txt input string + * @return string without SHY characters. + * @access public + * @since (4.5.019) 2009-02-28 + */ + public function removeSHY($txt='') { + /* + * Unicode Data + * Name : SOFT HYPHEN, commonly abbreviated as SHY + * HTML Entity (decimal): &#173; + * HTML Entity (hex): &#xad; + * HTML Entity (named): &shy; + * How to type in Microsoft Windows: [Alt +00AD] or [Alt 0173] + * UTF-8 (hex): 0xC2 0xAD (c2ad) + * UTF-8 character: chr(194).chr(173) + */ + $txt = preg_replace('/([\\xc2]{1}[\\xad]{1})/', '', $txt); + if (!$this->isunicode) { + $txt = preg_replace('/([\\xad]{1})/', '', $txt); + } + return $txt; + } + + /** + * Returns the PDF string code to print a cell (rectangular area) with optional borders, background color and character string. The upper-left corner of the cell corresponds to the current position. The text can be aligned or centered. After the call, the current position moves to the right or to the next line. It is possible to put a link on the text.<br /> + * If automatic page breaking is enabled and the cell goes beyond the limit, a page break is done before outputting. + * @param float $w Cell width. If 0, the cell extends up to the right margin. + * @param float $h Cell height. Default value: 0. + * @param string $txt String to print. Default value: empty string. + * @param mixed $border Indicates if borders must be drawn around the cell. The value can be either a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul>or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> + * @param int $ln Indicates where the current position should go after the call. Possible values are:<ul><li>0: to the right (or left for RTL languages)</li><li>1: to the beginning of the next line</li><li>2: below</li></ul>Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: 0. + * @param string $align Allows to center or align the text. Possible values are:<ul><li>L or empty string: left align (default value)</li><li>C: center</li><li>R: right align</li><li>J: justify</li></ul> + * @param int $fill Indicates if the cell background must be painted (1) or transparent (0). Default value: 0. + * @param mixed $link URL or identifier returned by AddLink(). + * @param int $stretch stretch carachter mode: <ul><li>0 = disabled</li><li>1 = horizontal scaling only if necessary</li><li>2 = forced horizontal scaling</li><li>3 = character spacing only if necessary</li><li>4 = forced character spacing</li></ul> + * @param boolean $ignore_min_height if true ignore automatic minimum height value. + * @param string $calign cell vertical alignment relative to the specified Y value. Possible values are:<ul><li>T : cell top</li><li>C : center</li><li>B : cell bottom</li><li>A : font top</li><li>L : font baseline</li><li>D : font bottom</li></ul> + * @param string $valign text vertical alignment inside the cell. Possible values are:<ul><li>T : top</li><li>C : center</li><li>B : bottom</li></ul> + * @access protected + * @since 1.0 + * @see Cell() + */ + protected function getCellCode($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=0, $link='', $stretch=0, $ignore_min_height=false, $calign='T', $valign='M') { + $txt = $this->removeSHY($txt); + $rs = ''; //string to be returned + if (!$ignore_min_height) { + $min_cell_height = $this->FontSize * $this->cell_height_ratio; + if ($h < $min_cell_height) { + $h = $min_cell_height; + } + } + $k = $this->k; + $x = $this->x; + $y = $this->y; + // cell vertical alignment + switch ($calign) { + case 'A': { + // font top + switch ($valign) { + case 'T': { + // top + $y -= ($this->LineWidth / 2); + break; + } + case 'B': { + // bottom + $y -= ($h - $this->FontAscent - $this->FontDescent - ($this->LineWidth / 2)); + break; + } + default: + case 'M': { + // center + $y -= (($h - $this->FontAscent - $this->FontDescent) / 2); + break; + } + } + break; + } + case 'L': { + // font baseline + switch ($valign) { + case 'T': { + // top + $y -= ($this->FontAscent + ($this->LineWidth / 2)); + break; + } + case 'B': { + // bottom + $y -= ($h - $this->FontDescent - ($this->LineWidth / 2)); + break; + } + default: + case 'M': { + // center + $y -= (($h + $this->FontAscent - $this->FontDescent) / 2); + break; + } + } + break; + } + case 'D': { + // font bottom + switch ($valign) { + case 'T': { + // top + $y -= ($this->FontAscent + $this->FontDescent + ($this->LineWidth / 2)); + break; + } + case 'B': { + // bottom + $y -= ($h - ($this->LineWidth / 2)); + break; + } + default: + case 'M': { + // center + $y -= (($h + $this->FontAscent + $this->FontDescent) / 2); + break; + } + } + break; + } + case 'B': { + // cell bottom + $y -= $h; + break; + } + case 'C': { + // cell center + $y -= ($h / 2); + break; + } + default: + case 'T': { + // cell top + break; + } + } + // text vertical alignment + switch ($valign) { + case 'T': { + // top + $basefonty = $y + $this->FontAscent + ($this->LineWidth / 2); + break; + } + case 'B': { + // bottom + $basefonty = $y + $h - $this->FontDescent - ($this->LineWidth / 2); + break; + } + default: + case 'M': { + // center + $basefonty = $y + (($h + $this->FontAscent - $this->FontDescent) / 2); + break; + } + } + if ($this->empty_string($w) OR ($w <= 0)) { + if ($this->rtl) { + $w = $x - $this->lMargin; + } else { + $w = $this->w - $this->rMargin - $x; + } + } + $s = ''; + // fill and borders + if (($fill == 1) OR ($border == 1)) { + if ($fill == 1) { + $op = ($border == 1) ? 'B' : 'f'; + } else { + $op = 'S'; + } + if ($this->rtl) { + $xk = (($this->x - $w) * $k); + } else { + $xk = ($this->x * $k); + } + $s .= sprintf('%.2F %.2F %.2F %.2F re %s ', $xk, (($this->h - $y) * $k), ($w * $k), (-$h * $k), $op); + } + if (is_string($border)) { + $lm = ($this->LineWidth / 2); + if (strpos($border,'L') !== false) { + if ($this->rtl) { + $xk = ($x - $w) * $k; + } else { + $xk = $x * $k; + } + $s .= sprintf('%.2F %.2F m %.2F %.2F l S ', $xk, (($this->h - $y + $lm) * $k), $xk, (($this->h - ($y + $h + $lm)) * $k)); + } + if (strpos($border,'T') !== false) { + if ($this->rtl) { + $xk = ($x - $w + $lm) * $k; + $xwk = ($x - $lm) * $k; + } else { + $xk = ($x - $lm) * $k; + $xwk = ($x + $w + $lm) * $k; + } + $s .= sprintf('%.2F %.2F m %.2F %.2F l S ', $xk, (($this->h - $y) * $k), $xwk, (($this->h - $y) * $k)); + } + if (strpos($border,'R') !== false) { + if ($this->rtl) { + $xk = $x * $k; + } else { + $xk = ($x + $w) * $k; + } + $s .= sprintf('%.2F %.2F m %.2F %.2F l S ', $xk, (($this->h - $y + $lm) * $k), $xk, (($this->h - ($y + $h + $lm))* $k)); + } + if (strpos($border,'B') !== false) { + if ($this->rtl) { + $xk = ($x - $w + $lm) * $k; + $xwk = ($x - $lm) * $k; + } else { + $xk = ($x - $lm) * $k; + $xwk = ($x + $w + $lm) * $k; + } + $s .= sprintf('%.2F %.2F m %.2F %.2F l S ', $xk, (($this->h - ($y + $h)) * $k), $xwk, (($this->h - ($y + $h)) * $k)); + } + } + if ($txt != '') { + $txt2 = $txt; + if ($this->isunicode) { + if (($this->CurrentFont['type'] == 'core') OR ($this->CurrentFont['type'] == 'TrueType') OR ($this->CurrentFont['type'] == 'Type1')) { + $txt2 = $this->UTF8ToLatin1($txt2); + } else { + $unicode = $this->UTF8StringToArray($txt); // array of UTF-8 unicode values + $unicode = $this->utf8Bidi($unicode, '', $this->tmprtl); + if (defined('K_THAI_TOPCHARS') AND (K_THAI_TOPCHARS == true)) { + // ---- Fix for bug #2977340 "Incorrect Thai characters position arrangement" ---- + // NOTE: this doesn't work with HTML justification + // Symbols that could overlap on the font top (only works in LTR) + $topchar = array(3611, 3613, 3615, 3650, 3651, 3652); // chars that extends on top + $topsym = array(3633, 3636, 3637, 3638, 3639, 3655, 3656, 3657, 3658, 3659, 3660, 3661, 3662); // symbols with top position + $numchars = count($unicode); // number of chars + $unik = 0; + $uniblock = array(); + $uniblock[$unik] = array(); + $uniblock[$unik][] = $unicode[0]; + // resolve overlapping conflicts by splitting the string in several parts + for ($i = 1; $i < $numchars; ++$i) { + // check if symbols overlaps at top + if (in_array($unicode[$i], $topsym) AND (in_array($unicode[($i - 1)], $topsym) OR in_array($unicode[($i - 1)], $topchar))) { + // move symbols to another array + ++$unik; + $uniblock[$unik] = array(); + $uniblock[$unik][] = $unicode[$i]; + ++$unik; + $uniblock[$unik] = array(); + $unicode[$i] = 8203; // Unicode Character 'ZERO WIDTH SPACE' (U+200B) + } else { + $uniblock[$unik][] = $unicode[$i]; + } + } + // ---- END OF Fix for bug #2977340 + } + $txt2 = $this->arrUTF8ToUTF16BE($unicode, false); + } + } + $txt2 = $this->_escape($txt2); + // text length + $txwidth = $this->GetStringWidth($txt); + $width = $txwidth; + // ratio between cell length and text length + if ($width <= 0) { + $ratio = 1; + } else { + $ratio = ($w - (2 * $this->cMargin)) / $width; + } + // stretch text if required + if (($stretch > 0) AND (($ratio < 1) OR (($ratio > 1) AND (($stretch % 2) == 0)))) { + if ($stretch > 2) { + // spacing + //Calculate character spacing in points + $char_space = (($w - $width - (2 * $this->cMargin)) * $this->k) / max($this->GetNumChars($txt)-1,1); + //Set character spacing + $rs .= sprintf('BT %.2F Tc ET ', $char_space); + } else { + // scaling + //Calculate horizontal scaling + $horiz_scale = $ratio * 100.0; + //Set horizontal scaling + $rs .= sprintf('BT %.2F Tz ET ', $horiz_scale); + } + $align = ''; + $width = $w - (2 * $this->cMargin); + } else { + $stretch == 0; + } + if ($this->ColorFlag) { + $s .= 'q '.$this->TextColor.' '; + } + // rendering mode + $s .= sprintf('BT %d Tr %.2F w ET ', $this->textrendermode, $this->textstrokewidth); + // count number of spaces + $ns = substr_count($txt, ' '); + // Justification + $spacewidth = 0; + if (($align == 'J') AND ($ns > 0)) { + if (($this->CurrentFont['type'] == 'TrueTypeUnicode') OR ($this->CurrentFont['type'] == 'cidfont0')) { + // get string width without spaces + $width = $this->GetStringWidth(str_replace(' ', '', $txt)); + // calculate average space width + $spacewidth = -1000 * ($w - $width - (2 * $this->cMargin)) / ($ns?$ns:1) / $this->FontSize; + // set word position to be used with TJ operator + $txt2 = str_replace(chr(0).chr(32), ') '.sprintf('%.3F', $spacewidth).' (', $txt2); + $unicode_justification = true; + } else { + // get string width + $width = $txwidth; + $spacewidth = (($w - $width - (2 * $this->cMargin)) / ($ns?$ns:1)) * $this->k; + // set word spacing + $rs .= sprintf('BT %.3F Tw ET ', $spacewidth); + } + $width = $w - (2 * $this->cMargin); + } + // replace carriage return characters + $txt2 = str_replace("\r", ' ', $txt2); + switch ($align) { + case 'C': { + $dx = ($w - $width) / 2; + break; + } + case 'R': { + if ($this->rtl) { + $dx = $this->cMargin; + } else { + $dx = $w - $width - $this->cMargin; + } + break; + } + case 'L': { + if ($this->rtl) { + $dx = $w - $width - $this->cMargin; + } else { + $dx = $this->cMargin; + } + break; + } + case 'J': + default: { + $dx = $this->cMargin; + break; + } + } + if ($this->rtl) { + $xdx = $this->x - $dx - $width; + } else { + $xdx = $this->x + $dx; + } + $xdk = $xdx * $k; + // print text + $s .= sprintf('BT %.2F %.2F Td [(%s)] TJ ET', $xdk, (($this->h - $basefonty) * $k), $txt2); + if (isset($uniblock)) { + // print overlapping characters as separate string + $xshift = 0; // horizontal shift + $ty = (($this->h - $basefonty + (0.2 * $this->FontSize)) * $k); + $spw = (($w - $txwidth - (2 * $this->cMargin)) / ($ns?$ns:1)); + foreach ($uniblock as $uk => $uniarr) { + if (($uk % 2) == 0) { + // x space to skip + if ($spacewidth != 0) { + // justification shift + $xshift += (count(array_keys($uniarr, 32)) * $spw); + } + $xshift += $this->GetArrStringWidth($uniarr); // + shift justification + } else { + // character to print + $topchr = $this->arrUTF8ToUTF16BE($uniarr, false); + $topchr = $this->_escape($topchr); + $s .= sprintf(' BT %.2F %.2F Td [(%s)] TJ ET', ($xdk + ($xshift * $k)), $ty, $topchr); + } + } + } + if ($this->underline) { + $s .= ' '.$this->_dounderlinew($xdx, $basefonty, $width); + } + if ($this->linethrough) { + $s .= ' '.$this->_dolinethroughw($xdx, $basefonty, $width); + } + if ($this->overline) { + $s .= ' '.$this->_dooverlinew($xdx, $basefonty, $width); + } + if ($this->ColorFlag) { + $s .= ' Q'; + } + if ($link) { + $this->Link($xdx, $y + (($h - $this->FontSize)/2), $width, $this->FontSize, $link, $ns); + } + } + // output cell + if ($s) { + // output cell + $rs .= $s; + // reset text stretching + if ($stretch > 2) { + //Reset character horizontal spacing + $rs .= ' BT 0 Tc ET'; + } elseif ($stretch > 0) { + //Reset character horizontal scaling + $rs .= ' BT 100 Tz ET'; + } + } + // reset word spacing + if (!(($this->CurrentFont['type'] == 'TrueTypeUnicode') OR ($this->CurrentFont['type'] == 'cidfont0')) AND ($align == 'J')) { + $rs .= ' BT 0 Tw ET'; + } + $this->lasth = $h; + if ($ln > 0) { + //Go to the beginning of the next line + $this->y = $y + $h; + if ($ln == 1) { + if ($this->rtl) { + $this->x = $this->w - $this->rMargin; + } else { + $this->x = $this->lMargin; + } + } + } else { + // go left or right by case + if ($this->rtl) { + $this->x -= $w; + } else { + $this->x += $w; + } + } + $gstyles = ''.$this->linestyleWidth.' '.$this->linestyleCap.' '.$this->linestyleJoin.' '.$this->linestyleDash.' '.$this->DrawColor.' '.$this->FillColor."\n"; + $rs = $gstyles.$rs; + return $rs; + } + + /** + * This method allows printing text with line breaks. + * They can be automatic (as soon as the text reaches the right border of the cell) or explicit (via the \n character). As many cells as necessary are output, one below the other.<br /> + * Text can be aligned, centered or justified. The cell block can be framed and the background painted. + * @param float $w Width of cells. If 0, they extend up to the right margin of the page. + * @param float $h Cell minimum height. The cell extends automatically if needed. + * @param string $txt String to print + * @param mixed $border Indicates if borders must be drawn around the cell block. The value can be either a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul>or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> + * @param string $align Allows to center or align the text. Possible values are:<ul><li>L or empty string: left align</li><li>C: center</li><li>R: right align</li><li>J: justification (default value when $ishtml=false)</li></ul> + * @param int $fill Indicates if the cell background must be painted (1) or transparent (0). Default value: 0. + * @param int $ln Indicates where the current position should go after the call. Possible values are:<ul><li>0: to the right</li><li>1: to the beginning of the next line [DEFAULT]</li><li>2: below</li></ul> + * @param float $x x position in user units + * @param float $y y position in user units + * @param boolean $reseth if true reset the last cell height (default true). + * @param int $stretch stretch carachter mode: <ul><li>0 = disabled</li><li>1 = horizontal scaling only if necessary</li><li>2 = forced horizontal scaling</li><li>3 = character spacing only if necessary</li><li>4 = forced character spacing</li></ul> + * @param boolean $ishtml set to true if $txt is HTML content (default = false). + * @param boolean $autopadding if true, uses internal padding and automatically adjust it to account for line width. + * @param float $maxh maximum height. It should be >= $h and less then remaining space to the bottom of the page, or 0 for disable this feature. This feature works only when $ishtml=false. + * @return int Return the number of cells or 1 for html mode. + * @access public + * @since 1.3 + * @see SetFont(), SetDrawColor(), SetFillColor(), SetTextColor(), SetLineWidth(), Cell(), Write(), SetAutoPageBreak() + */ + public function MultiCell($w, $h, $txt, $border=0, $align='J', $fill=0, $ln=1, $x='', $y='', $reseth=true, $stretch=0, $ishtml=false, $autopadding=true, $maxh=0) { + if ($this->empty_string($this->lasth) OR $reseth) { + //set row height + $this->lasth = $this->FontSize * $this->cell_height_ratio; + } + if (!$this->empty_string($y)) { + $this->SetY($y); + } else { + $y = $this->GetY(); + } + // check for page break + $this->checkPageBreak($h); + $y = $this->GetY(); + // get current page number + $startpage = $this->page; + if (!$this->empty_string($x)) { + $this->SetX($x); + } else { + $x = $this->GetX(); + } + if ($this->empty_string($w) OR ($w <= 0)) { + if ($this->rtl) { + $w = $this->x - $this->lMargin; + } else { + $w = $this->w - $this->rMargin - $this->x; + } + } + // store original margin values + $lMargin = $this->lMargin; + $rMargin = $this->rMargin; + if ($this->rtl) { + $this->SetRightMargin($this->w - $this->x); + $this->SetLeftMargin($this->x - $w); + } else { + $this->SetLeftMargin($this->x); + $this->SetRightMargin($this->w - $this->x - $w); + } + $starty = $this->y; + if ($autopadding) { + // Adjust internal padding + if ($this->cMargin < ($this->LineWidth / 2)) { + $this->cMargin = ($this->LineWidth / 2); + } + // Add top space if needed + if (($this->lasth - $this->FontSize) < $this->LineWidth) { + $this->y += $this->LineWidth / 2; + } + // add top padding + $this->y += $this->cMargin; + } + if ($ishtml) { + // ******* Write HTML text + $this->writeHTML($txt, true, 0, $reseth, true, $align); + $nl = 1; + } else { + // ******* Write text + $nl = $this->Write($this->lasth, $txt, '', 0, $align, true, $stretch, false, true, $maxh); + } + if ($autopadding) { + // add bottom padding + $this->y += $this->cMargin; + // Add bottom space if needed + if (($this->lasth - $this->FontSize) < $this->LineWidth) { + $this->y += $this->LineWidth / 2; + } + } + // Get end-of-text Y position + $currentY = $this->y; + // get latest page number + $endpage = $this->page; + // check if a new page has been created + if ($endpage > $startpage) { + // design borders around HTML cells. + for ($page=$startpage; $page <= $endpage; ++$page) { + $this->setPage($page); + if ($page == $startpage) { + $this->y = $starty; // put cursor at the beginning of cell on the first page + $h = $this->getPageHeight() - $starty - $this->getBreakMargin(); + $cborder = $this->getBorderMode($border, $position='start'); + } elseif ($page == $endpage) { + $this->y = $this->tMargin; // put cursor at the beginning of last page + $h = $currentY - $this->tMargin; + $cborder = $this->getBorderMode($border, $position='end'); + } else { + $this->y = $this->tMargin; // put cursor at the beginning of the current page + $h = $this->getPageHeight() - $this->tMargin - $this->getBreakMargin(); + $cborder = $this->getBorderMode($border, $position='middle'); + } + $nx = $x; + // account for margin changes + if ($page > $startpage) { + if (($this->rtl) AND ($this->pagedim[$page]['orm'] != $this->pagedim[$startpage]['orm'])) { + $nx = $x + ($this->pagedim[$page]['orm'] - $this->pagedim[$startpage]['orm']); + } elseif ((!$this->rtl) AND ($this->pagedim[$page]['olm'] != $this->pagedim[$startpage]['olm'])) { + $nx = $x + ($this->pagedim[$page]['olm'] - $this->pagedim[$startpage]['olm']); + } + } + $this->SetX($nx); + $ccode = $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, false); + if ($cborder OR $fill) { + $pagebuff = $this->getPageBuffer($this->page); + $pstart = substr($pagebuff, 0, $this->intmrk[$this->page]); + $pend = substr($pagebuff, $this->intmrk[$this->page]); + $this->setPageBuffer($this->page, $pstart.$ccode."\n".$pend); + $this->intmrk[$this->page] += strlen($ccode."\n"); + } + } + } else { + $h = max($h, ($currentY - $y)); + // put cursor at the beginning of text + $this->SetY($y); + $this->SetX($x); + // design a cell around the text + $ccode = $this->getCellCode($w, $h, '', $border, 1, '', $fill, '', 0, true); + if ($border OR $fill) { + if (end($this->transfmrk[$this->page]) !== false) { + $pagemarkkey = key($this->transfmrk[$this->page]); + $pagemark = &$this->transfmrk[$this->page][$pagemarkkey]; + } elseif ($this->InFooter) { + $pagemark = &$this->footerpos[$this->page]; + } else { + $pagemark = &$this->intmrk[$this->page]; + } + $pagebuff = $this->getPageBuffer($this->page); + $pstart = substr($pagebuff, 0, $pagemark); + $pend = substr($pagebuff, $pagemark); + $this->setPageBuffer($this->page, $pstart.$ccode."\n".$pend); + $pagemark += strlen($ccode."\n"); + } + } + // Get end-of-cell Y position + $currentY = $this->GetY(); + // restore original margin values + $this->SetLeftMargin($lMargin); + $this->SetRightMargin($rMargin); + if ($ln > 0) { + //Go to the beginning of the next line + $this->SetY($currentY); + if ($ln == 2) { + $this->SetX($x + $w); + } + } else { + // go left or right by case + $this->setPage($startpage); + $this->y = $y; + $this->SetX($x + $w); + } + $this->setContentMark(); + return $nl; + } + + /** + * Get the border mode accounting for multicell position (opens bottom side of multicell crossing pages) + * @param mixed $border Indicates if borders must be drawn around the cell block. The value can be either a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul>or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> + * @param string multicell position: 'start', 'middle', 'end' + * @return border mode + * @access protected + * @since 4.4.002 (2008-12-09) + */ + protected function getBorderMode($border, $position='start') { + if ((!$this->opencell) AND ($border == 1)) { + return 1; + } + $cborder = ''; + switch ($position) { + case 'start': { + if ($border == 1) { + $cborder = 'LTR'; + } else { + if (!(false === strpos($border, 'L'))) { + $cborder .= 'L'; + } + if (!(false === strpos($border, 'T'))) { + $cborder .= 'T'; + } + if (!(false === strpos($border, 'R'))) { + $cborder .= 'R'; + } + if ((!$this->opencell) AND (!(false === strpos($border, 'B')))) { + $cborder .= 'B'; + } + } + break; + } + case 'middle': { + if ($border == 1) { + $cborder = 'LR'; + } else { + if (!(false === strpos($border, 'L'))) { + $cborder .= 'L'; + } + if ((!$this->opencell) AND (!(false === strpos($border, 'T')))) { + $cborder .= 'T'; + } + if (!(false === strpos($border, 'R'))) { + $cborder .= 'R'; + } + if ((!$this->opencell) AND (!(false === strpos($border, 'B')))) { + $cborder .= 'B'; + } + } + break; + } + case 'end': { + if ($border == 1) { + $cborder = 'LRB'; + } else { + if (!(false === strpos($border, 'L'))) { + $cborder .= 'L'; + } + if ((!$this->opencell) AND (!(false === strpos($border, 'T')))) { + $cborder .= 'T'; + } + if (!(false === strpos($border, 'R'))) { + $cborder .= 'R'; + } + if (!(false === strpos($border, 'B'))) { + $cborder .= 'B'; + } + } + break; + } + default: { + $cborder = $border; + break; + } + } + return $cborder; + } + + /** + * This method returns the estimated number of lines required to print the text (not the real number just a quick estimation). + * If you want o know the exact number of lines you have to use the following technique: + * <pre> + * // store current object + * $pdf->startTransaction(); + * // get the number of lines for multicell + * $lines = $pdf->MultiCell($w, 0, $txt, 0, 'L', 0, 0, '', '', true, 0, false, true, 0); + * // restore previous object + * $pdf = $pdf->rollbackTransaction(); + * </pre> + * @param string $txt text to print + * @param float $w width of cell. If 0, they extend up to the right margin of the page. + * @return int Return the estimated number of lines. + * @access public + * @since 4.5.011 + */ + public function getNumLines($txt, $w=0) { + $lines = 0; + if ($this->empty_string($w) OR ($w <= 0)) { + if ($this->rtl) { + $w = $this->x - $this->lMargin; + } else { + $w = $this->w - $this->rMargin - $this->x; + } + } + // max column width + $wmax = $w - (2 * $this->cMargin); + // remove carriage returns + $txt = str_replace("\r", '', $txt); + // remove last newline (if any) + if (substr($txt,-1) == "\n") { + $txt = substr($txt, 0, -1); + } + // divide text in blocks + $txtblocks = explode("\n", $txt); + // for each text block + foreach ($txtblocks as $block) { + // estimate the number of lines + $lines += $this->empty_string($block) ? 1 : (ceil($this->GetStringWidth($block) / $wmax)); + } + // return the number of lines + return $lines; + } + + /** + * This method prints text from the current position.<br /> + * @param float $h Line height + * @param string $txt String to print + * @param mixed $link URL or identifier returned by AddLink() + * @param int $fill Indicates if the background must be painted (1) or transparent (0). Default value: 0. + * @param string $align Allows to center or align the text. Possible values are:<ul><li>L or empty string: left align (default value)</li><li>C: center</li><li>R: right align</li><li>J: justify</li></ul> + * @param boolean $ln if true set cursor at the bottom of the line, otherwise set cursor at the top of the line. + * @param int $stretch stretch carachter mode: <ul><li>0 = disabled</li><li>1 = horizontal scaling only if necessary</li><li>2 = forced horizontal scaling</li><li>3 = character spacing only if necessary</li><li>4 = forced character spacing</li></ul> + * @param boolean $firstline if true prints only the first line and return the remaining string. + * @param boolean $firstblock if true the string is the starting of a line. + * @param float $maxh maximum height. The remaining unprinted text will be returned. It should be >= $h and less then remaining space to the bottom of the page, or 0 for disable this feature. + * @return mixed Return the number of cells or the remaining string if $firstline = true. + * @access public + * @since 1.5 + */ + public function Write($h, $txt, $link='', $fill=0, $align='', $ln=false, $stretch=0, $firstline=false, $firstblock=false, $maxh=0) { + if (strlen($txt) == 0) { + $txt = ' '; + } + // remove carriage returns + $s = str_replace("\r", '', $txt); + // check if string contains arabic text + if (preg_match(K_RE_PATTERN_ARABIC, $s)) { + $arabic = true; + } else { + $arabic = false; + } + // check if string contains RTL text + if ($arabic OR ($this->tmprtl == 'R') OR preg_match(K_RE_PATTERN_RTL, $txt)) { + $rtlmode = true; + } else { + $rtlmode = false; + } + // get a char width + $chrwidth = $this->GetCharWidth('.'); + // get array of unicode values + $chars = $this->UTF8StringToArray($s); + // get array of chars + $uchars = $this->UTF8ArrayToUniArray($chars); + // get the number of characters + $nb = count($chars); + // replacement for SHY character (minus symbol) + $shy_replacement = 45; + $shy_replacement_char = $this->unichr($shy_replacement); + // widht for SHY replacement + $shy_replacement_width = $this->GetCharWidth($shy_replacement); + // store current position + $prevx = $this->x; + $prevy = $this->y; + // max Y + $maxy = $this->y + $maxh - $h - (2 * $this->cMargin); + // calculate remaining line width ($w) + if ($this->rtl) { + $w = $this->x - $this->lMargin; + } else { + $w = $this->w - $this->rMargin - $this->x; + } + // max column width + $wmax = $w - (2 * $this->cMargin); + if ((!$firstline) AND (($chrwidth > $wmax) OR ($this->GetCharWidth($chars[0]) > $wmax))) { + // a single character do not fit on column + return ''; + } + $i = 0; // character position + $j = 0; // current starting position + $sep = -1; // position of the last blank space + $shy = false; // true if the last blank is a soft hypen (SHY) + $l = 0; // current string length + $nl = 0; //number of lines + $linebreak = false; + $pc = 0; // previous character + // for each character + while ($i < $nb) { + if (($maxh > 0) AND ($this->y >= $maxy) ) { + break; + } + //Get the current character + $c = $chars[$i]; + if ($c == 10) { // 10 = "\n" = new line + //Explicit line break + if ($align == 'J') { + if ($this->rtl) { + $talign = 'R'; + } else { + $talign = 'L'; + } + } else { + $talign = $align; + } + $tmpstr = $this->UniArrSubString($uchars, $j, $i); + if ($firstline) { + $startx = $this->x; + $tmparr = array_slice($chars, $j, ($i - $j)); + if ($rtlmode) { + $tmparr = $this->utf8Bidi($tmparr, $tmpstr, $this->tmprtl); + } + $linew = $this->GetArrStringWidth($tmparr); + unset($tmparr); + if ($this->rtl) { + $this->endlinex = $startx - $linew; + } else { + $this->endlinex = $startx + $linew; + } + $w = $linew; + $tmpcmargin = $this->cMargin; + if ($maxh == 0) { + $this->cMargin = 0; + } + } + if ($firstblock AND $this->isRTLTextDir()) { + $tmpstr = rtrim($tmpstr); + } + $this->Cell($w, $h, $tmpstr, 0, 1, $talign, $fill, $link, $stretch); + unset($tmpstr); + if ($firstline) { + $this->cMargin = $tmpcmargin; + return ($this->UniArrSubString($uchars, $i)); + } + ++$nl; + $j = $i + 1; + $l = 0; + $sep = -1; + $shy = false; + // account for margin changes + if ((($this->y + $this->lasth) > $this->PageBreakTrigger) AND (!$this->InFooter)) { + // AcceptPageBreak() may be overriden on extended classed to include margin changes + $this->AcceptPageBreak(); + } + $w = $this->getRemainingWidth(); + $wmax = $w - (2 * $this->cMargin); + } else { + // 160 is the non-breaking space. + // 173 is SHY (Soft Hypen). + // \p{Z} or \p{Separator}: any kind of Unicode whitespace or invisible separator. + // \p{Lo} or \p{Other_Letter}: a Unicode letter or ideograph that does not have lowercase and uppercase variants. + // \p{Lo} is needed because Chinese characters are packed next to each other without spaces in between. + if (($c != 160) AND (($c == 173) OR preg_match($this->re_spaces, $this->unichr($c)))) { + // update last blank space position + $sep = $i; + // check if is a SHY + if ($c == 173) { + $shy = true; + if ($pc == 45) { + $tmp_shy_replacement_width = 0; + $tmp_shy_replacement_char = ''; + } else { + $tmp_shy_replacement_width = $shy_replacement_width; + $tmp_shy_replacement_char = $shy_replacement_char; + } + } else { + $shy = false; + } + } + // update string length + if ((($this->CurrentFont['type'] == 'TrueTypeUnicode') OR ($this->CurrentFont['type'] == 'cidfont0')) AND ($arabic)) { + // with bidirectional algorithm some chars may be changed affecting the line length + // *** very slow *** + $l = $this->GetArrStringWidth($this->utf8Bidi(array_slice($chars, $j, ($i - $j)), '', $this->tmprtl)); + } else { + $l += $this->GetCharWidth($c); + } + if (($l > $wmax) OR (($c == 173) AND (($l + $tmp_shy_replacement_width) > $wmax)) ) { + // we have reached the end of column + if ($sep == -1) { + // check if the line was already started + if (($this->rtl AND ($this->x <= ($this->w - $this->rMargin - $chrwidth))) + OR ((!$this->rtl) AND ($this->x >= ($this->lMargin + $chrwidth)))) { + // print a void cell and go to next line + $this->Cell($w, $h, '', 0, 1); + $linebreak = true; + if ($firstline) { + return ($this->UniArrSubString($uchars, $j)); + } + } else { + // truncate the word because do not fit on column + $tmpstr = $this->UniArrSubString($uchars, $j, $i); + if ($firstline) { + $startx = $this->x; + $tmparr = array_slice($chars, $j, ($i - $j)); + if ($rtlmode) { + $tmparr = $this->utf8Bidi($tmparr, $tmpstr, $this->tmprtl); + } + $linew = $this->GetArrStringWidth($tmparr); + unset($tmparr); + if ($this->rtl) { + $this->endlinex = $startx - $linew; + } else { + $this->endlinex = $startx + $linew; + } + $w = $linew; + $tmpcmargin = $this->cMargin; + if ($maxh == 0) { + $this->cMargin = 0; + } + } + if ($firstblock AND $this->isRTLTextDir()) { + $tmpstr = rtrim($tmpstr); + } + $this->Cell($w, $h, $tmpstr, 0, 1, $align, $fill, $link, $stretch); + unset($tmpstr); + if ($firstline) { + $this->cMargin = $tmpcmargin; + return ($this->UniArrSubString($uchars, $i)); + } + $j = $i; + --$i; + } + } else { + // word wrapping + if ($this->rtl AND (!$firstblock)) { + $endspace = 1; + } else { + $endspace = 0; + } + if ($shy) { + // add hypen (minus symbol) at the end of the line + $shy_width = $tmp_shy_replacement_width; + if ($this->rtl) { + $shy_char_left = $tmp_shy_replacement_char; + $shy_char_right = ''; + } else { + $shy_char_left = ''; + $shy_char_right = $tmp_shy_replacement_char; + } + } else { + $shy_width = 0; + $shy_char_left = ''; + $shy_char_right = ''; + } + $tmpstr = $this->UniArrSubString($uchars, $j, ($sep + $endspace)); + if ($firstline) { + $startx = $this->x; + $tmparr = array_slice($chars, $j, (($sep + $endspace) - $j)); + if ($rtlmode) { + $tmparr = $this->utf8Bidi($tmparr, $tmpstr, $this->tmprtl); + } + $linew = $this->GetArrStringWidth($tmparr); + unset($tmparr); + if ($this->rtl) { + $this->endlinex = $startx - $linew - $shy_width; + } else { + $this->endlinex = $startx + $linew + $shy_width; + } + $w = $linew; + $tmpcmargin = $this->cMargin; + if ($maxh == 0) { + $this->cMargin = 0; + } + } + // print the line + if ($firstblock AND $this->isRTLTextDir()) { + $tmpstr = rtrim($tmpstr); + } + $this->Cell($w, $h, $shy_char_left.$tmpstr.$shy_char_right, 0, 1, $align, $fill, $link, $stretch); + unset($tmpstr); + if ($firstline) { + // return the remaining text + $this->cMargin = $tmpcmargin; + return ($this->UniArrSubString($uchars, ($sep + $endspace))); + } + $i = $sep; + $sep = -1; + $shy = false; + $j = ($i+1); + } + // account for margin changes + if ((($this->y + $this->lasth) > $this->PageBreakTrigger) AND (!$this->InFooter)) { + // AcceptPageBreak() may be overriden on extended classed to include margin changes + $this->AcceptPageBreak(); + } + $w = $this->getRemainingWidth(); + $wmax = $w - (2 * $this->cMargin); + if ($linebreak) { + $linebreak = false; + } else { + ++$nl; + $l = 0; + } + } + } + // save last character + $pc = $c; + ++$i; + } // end while i < nb + // print last substring (if any) + if ($l > 0) { + switch ($align) { + case 'J': + case 'C': { + $w = $w; + break; + } + case 'L': { + if ($this->rtl) { + $w = $w; + } else { + $w = $l; + } + break; + } + case 'R': { + if ($this->rtl) { + $w = $l; + } else { + $w = $w; + } + break; + } + default: { + $w = $l; + break; + } + } + $tmpstr = $this->UniArrSubString($uchars, $j, $nb); + if ($firstline) { + $startx = $this->x; + $tmparr = array_slice($chars, $j, ($nb - $j)); + if ($rtlmode) { + $tmparr = $this->utf8Bidi($tmparr, $tmpstr, $this->tmprtl); + } + $linew = $this->GetArrStringWidth($tmparr); + unset($tmparr); + if ($this->rtl) { + $this->endlinex = $startx - $linew; + } else { + $this->endlinex = $startx + $linew; + } + $w = $linew; + $tmpcmargin = $this->cMargin; + if ($maxh == 0) { + $this->cMargin = 0; + } + } + if ($firstblock AND $this->isRTLTextDir()) { + $tmpstr = rtrim($tmpstr); + } + $this->Cell($w, $h, $tmpstr, 0, $ln, $align, $fill, $link, $stretch); + unset($tmpstr); + if ($firstline) { + $this->cMargin = $tmpcmargin; + return ($this->UniArrSubString($uchars, $nb)); + } + ++$nl; + } + if ($firstline) { + return ''; + } + return $nl; + } + + /** + * Returns the remaining width between the current position and margins. + * @return int Return the remaining width + * @access protected + */ + protected function getRemainingWidth() { + if ($this->rtl) { + return ($this->x - $this->lMargin); + } else { + return ($this->w - $this->rMargin - $this->x); + } + } + + /** + * Extract a slice of the $strarr array and return it as string. + * @param string $strarr The input array of characters. + * @param int $start the starting element of $strarr. + * @param int $end first element that will not be returned. + * @return Return part of a string + * @access public + */ + public function UTF8ArrSubString($strarr, $start='', $end='') { + if (strlen($start) == 0) { + $start = 0; + } + if (strlen($end) == 0) { + $end = count($strarr); + } + $string = ''; + for ($i=$start; $i < $end; ++$i) { + $string .= $this->unichr($strarr[$i]); + } + return $string; + } + + /** + * Extract a slice of the $uniarr array and return it as string. + * @param string $uniarr The input array of characters. + * @param int $start the starting element of $strarr. + * @param int $end first element that will not be returned. + * @return Return part of a string + * @access public + * @since 4.5.037 (2009-04-07) + */ + public function UniArrSubString($uniarr, $start='', $end='') { + if (strlen($start) == 0) { + $start = 0; + } + if (strlen($end) == 0) { + $end = count($uniarr); + } + $string = ''; + for ($i=$start; $i < $end; ++$i) { + $string .= $uniarr[$i]; + } + return $string; + } + + /** + * Convert an array of UTF8 values to array of unicode characters + * @param string $ta The input array of UTF8 values. + * @return Return array of unicode characters + * @access public + * @since 4.5.037 (2009-04-07) + */ + public function UTF8ArrayToUniArray($ta) { + return array_map(array($this, 'unichr'), $ta); + } + + /** + * Returns the unicode caracter specified by UTF-8 value + * @param int $c UTF-8 value + * @return Returns the specified character. + * @author Miguel Perez, Nicola Asuni + * @access public + * @since 2.3.000 (2008-03-05) + */ + public function unichr($c) { + if (!$this->isunicode) { + return chr($c); + } elseif ($c <= 0x7F) { + // one byte + return chr($c); + } elseif ($c <= 0x7FF) { + // two bytes + return chr(0xC0 | $c >> 6).chr(0x80 | $c & 0x3F); + } elseif ($c <= 0xFFFF) { + // three bytes + return chr(0xE0 | $c >> 12).chr(0x80 | $c >> 6 & 0x3F).chr(0x80 | $c & 0x3F); + } elseif ($c <= 0x10FFFF) { + // four bytes + return chr(0xF0 | $c >> 18).chr(0x80 | $c >> 12 & 0x3F).chr(0x80 | $c >> 6 & 0x3F).chr(0x80 | $c & 0x3F); + } else { + return ''; + } + } + + /** + * Return the image type given the file name or array returned by getimagesize() function. + * @param string $imgfile image file name + * @param array $iminfo array of image information returned by getimagesize() function. + * @return string image type + * @since 4.8.017 (2009-11-27) + */ + public function getImageFileType($imgfile, $iminfo=array()) { + if (isset($iminfo['mime']) AND !empty($iminfo['mime'])) { + $mime = explode('/', $iminfo['mime']); + if ((count($mime) > 1) AND ($mime[0] == 'image') AND (!empty($mime[1]))) { + return trim($mime[1]); + } + } + $type = ''; + $fileinfo = pathinfo($imgfile); + if (isset($fileinfo['extension']) AND (!$this->empty_string($fileinfo['extension']))) { + $type = strtolower(trim($fileinfo['extension'])); + } + if ($type == 'jpg') { + $type = 'jpeg'; + } + return $type; + } + + /** + * Puts an image in the page. + * The upper-left corner must be given. + * The dimensions can be specified in different ways:<ul> + * <li>explicit width and height (expressed in user unit)</li> + * <li>one explicit dimension, the other being calculated automatically in order to keep the original proportions</li> + * <li>no explicit dimension, in which case the image is put at 72 dpi</li></ul> + * Supported formats are JPEG and PNG images whitout GD library and all images supported by GD: GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM; + * The format can be specified explicitly or inferred from the file extension.<br /> + * It is possible to put a link on the image.<br /> + * Remark: if an image is used several times, only one copy will be embedded in the file.<br /> + * @param string $file Name of the file containing the image. + * @param float $x Abscissa of the upper-left corner. + * @param float $y Ordinate of the upper-left corner. + * @param float $w Width of the image in the page. If not specified or equal to zero, it is automatically calculated. + * @param float $h Height of the image in the page. If not specified or equal to zero, it is automatically calculated. + * @param string $type Image format. Possible values are (case insensitive): JPEG and PNG (whitout GD library) and all images supported by GD: GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM;. If not specified, the type is inferred from the file extension. + * @param mixed $link URL or identifier returned by AddLink(). + * @param string $align Indicates the alignment of the pointer next to image insertion relative to image height. The value can be:<ul><li>T: top-right for LTR or top-left for RTL</li><li>M: middle-right for LTR or middle-left for RTL</li><li>B: bottom-right for LTR or bottom-left for RTL</li><li>N: next line</li></ul> + * @param mixed $resize If true resize (reduce) the image to fit $w and $h (requires GD or ImageMagick library); if false do not resize; if 2 force resize in all cases (upscaling and downscaling). + * @param int $dpi dot-per-inch resolution used on resize + * @param string $palign Allows to center or align the image on the current line. Possible values are:<ul><li>L : left align</li><li>C : center</li><li>R : right align</li><li>'' : empty string : left for LTR or right for RTL</li></ul> + * @param boolean $ismask true if this image is a mask, false otherwise + * @param mixed $imgmask image object returned by this function or false + * @param mixed $border Indicates if borders must be drawn around the image. The value can be either a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul>or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> + * @param boolean $fitbox If true scale image dimensions proportionally to fit within the ($w, $h) box. + * @param boolean $hidden if true do not display the image. + * @param boolean $fitonpage if true the image is resized to not exceed page dimensions. + * @return image information + * @access public + * @since 1.1 + */ + public function Image($file, $x='', $y='', $w=0, $h=0, $type='', $link='', $align='', $resize=false, $dpi=300, $palign='', $ismask=false, $imgmask=false, $border=0, $fitbox=false, $hidden=false, $fitonpage=false) { + if ($x === '') { + $x = $this->x; + } + if ($y === '') { + $y = $this->y; + } + // get image dimensions + $imsize = @getimagesize($file); + if ($imsize === FALSE) { + // encode spaces on filename + $file = str_replace(' ', '%20', $file); + $imsize = @getimagesize($file); + if ($imsize === FALSE) { + if (($w > 0) AND ($h > 0)) { + $pw = $this->getHTMLUnitToUnits($w, 0, $this->pdfunit, true) * $this->imgscale * $this->k; + $ph = $this->getHTMLUnitToUnits($h, 0, $this->pdfunit, true) * $this->imgscale * $this->k; + $imsize = array($pw, $ph); + } else { + $this->Error('[Image] Unable to get image width and height: '.$file); + } + } + } + // get original image width and height in pixels + list($pixw, $pixh) = $imsize; + // calculate image width and height on document + if (($w <= 0) AND ($h <= 0)) { + // convert image size to document unit + $w = $this->pixelsToUnits($pixw); + $h = $this->pixelsToUnits($pixh); + } elseif ($w <= 0) { + $w = $h * $pixw / $pixh; + } elseif ($h <= 0) { + $h = $w * $pixh / $pixw; + } elseif ($fitbox AND ($w > 0) AND ($h > 0)) { + // scale image dimensions proportionally to fit within the ($w, $h) box + if ((($w * $pixh) / ($h * $pixw)) < 1) { + $h = $w * $pixh / $pixw; + } else { + $w = $h * $pixw / $pixh; + } + } + // Check whether we need a new page first as this does not fit + $prev_x = $this->x; + if ($this->checkPageBreak($h, $y)) { + $y = $this->y; + if ($this->rtl) { + $x += ($prev_x - $this->x); + } else { + $x += ($this->x - $prev_x); + } + } + // resize image to be contained on a single page + if ($fitonpage) { + $ratio_wh = $w / $h; + if (($y + $h) > $this->PageBreakTrigger) { + $h = $this->PageBreakTrigger - $y; + $w = $h * $ratio_wh; + } + if (($x + $w) > ($this->w - $this->rMargin)) { + $w = $this->w - $this->rMargin - $x; + $h = $w / $ratio_wh; + } + } + // calculate new minimum dimensions in pixels + $neww = round($w * $this->k * $dpi / $this->dpi); + $newh = round($h * $this->k * $dpi / $this->dpi); + // check if resize is necessary (resize is used only to reduce the image) + $newsize = ($neww * $newh); + $pixsize = ($pixw * $pixh); + if (intval($resize) == 2) { + $resize = true; + } elseif ($newsize >= $pixsize) { + $resize = false; + } + // check if image has been already added on document + $newimage = true; + if (in_array($file, $this->imagekeys)) { + $newimage = false; + // get existing image data + $info = $this->getImageBuffer($file); + // check if the newer image is larger + $oldsize = ($info['w'] * $info['h']); + if ((($oldsize < $newsize) AND ($resize)) OR (($oldsize < $pixsize) AND (!$resize))) { + $newimage = true; + } + } + if ($newimage) { + //First use of image, get info + if ($type == '') { + $type = $this->getImageFileType($file, $imsize); + } + $mqr = $this->get_mqr(); + $this->set_mqr(false); + // Specific image handlers + $mtd = '_parse'.$type; + // GD image handler function + $gdfunction = 'imagecreatefrom'.$type; + $info = false; + if ((method_exists($this, $mtd)) AND (!($resize AND function_exists($gdfunction)))) { + // TCPDF image functions + $info = $this->$mtd($file); + if ($info == 'pngalpha') { + return $this->ImagePngAlpha($file, $x, $y, $w, $h, 'PNG', $link, $align, $resize, $dpi, $palign); + } + } + if (!$info) { + if (function_exists($gdfunction)) { + // GD library + $img = $gdfunction($file); + if ($resize) { + $imgr = imagecreatetruecolor($neww, $newh); + if (($type == 'gif') OR ($type == 'png')) { + $imgr = $this->_setGDImageTransparency($imgr, $img); + } + imagecopyresampled($imgr, $img, 0, 0, 0, 0, $neww, $newh, $pixw, $pixh); + if (($type == 'gif') OR ($type == 'png')) { + $info = $this->_toPNG($imgr); + } else { + $info = $this->_toJPEG($imgr); + } + } else { + if (($type == 'gif') OR ($type == 'png')) { + $info = $this->_toPNG($img); + } else { + $info = $this->_toJPEG($img); + } + } + } elseif (extension_loaded('imagick')) { + // ImageMagick library + $img = new Imagick(); + if ($type == 'SVG') { + // get SBG file content + $svgimg = file_get_contents($file); + // get width and height + $regs = array(); + if (preg_match('/<svg([^\>]*)>/si', $svgimg, $regs)) { + $tmp = array(); + if (preg_match('/[\s]+width[\s]*=[\s]*"([^"]*)"/si', $regs[1], $tmp)) { + $ow = $this->getHTMLUnitToUnits($tmp[1], 1, $this->svgunit, false) * $dpi / 72; + $svgimg = preg_replace('/[\s]+width[\s]*=[\s]*"[^"]*"/si', ' width="'.$ow.$this->pdfunit.'"', $svgimg); + } + $tmp = array(); + if (preg_match('/[\s]+height[\s]*=[\s]*"([^"]*)"/si', $regs[1], $tmp)) { + $oh = $this->getHTMLUnitToUnits($tmp[1], 1, $this->svgunit, false) * $dpi / 72; + $svgimg = preg_replace('/[\s]+height[\s]*=[\s]*"[^"]*"/si', ' height="'.$oh.$this->pdfunit.'"', $svgimg); + } + $tmp = array(); + if (!preg_match('/[\s]+viewBox[\s]*=[\s]*"[\s]*([0-9\.]+)[\s]+([0-9\.]+)[\s]+([0-9\.]+)[\s]+([0-9\.]+)[\s]*"/si', $regs[1], $tmp)) { + $vbw = $ow * (72 / $dpi) * $this->imgscale * $this->k; + $vbh = $oh * (72 / $dpi) * $this->imgscale * $this->k; + $svgimg = preg_replace('/<svg/si', '<svg viewBox="0 0 '.$vbw.' '.$vbh.'"', $svgimg); + } + } + $img->readImageBlob($svgimg); + } else { + $img->readImage($file); + } + if ($resize) { + $img->resizeImage($neww, $newh, 10, 1, false); + } + $img->setCompressionQuality($this->jpeg_quality); + $img->setImageFormat('jpeg'); + $tempname = tempnam(K_PATH_CACHE, 'jpg_'); + $img->writeImage($tempname); + $info = $this->_parsejpeg($tempname); + unlink($tempname); + $img->destroy(); + } else { + return; + } + } + if ($info === false) { + //If false, we cannot process image + return; + } + $this->set_mqr($mqr); + if ($ismask) { + // force grayscale + $info['cs'] = 'DeviceGray'; + } + $info['i'] = $this->numimages; + if (!in_array($file, $this->imagekeys)) { + ++$info['i']; + } + if ($imgmask !== false) { + $info['masked'] = $imgmask; + } + // add image to document + $this->setImageBuffer($file, $info); + } + // set alignment + $this->img_rb_y = $y + $h; + // set alignment + if ($this->rtl) { + if ($palign == 'L') { + $ximg = $this->lMargin; + } elseif ($palign == 'C') { + $ximg = ($this->w - $w) / 2; + } elseif ($palign == 'R') { + $ximg = $this->w - $this->rMargin - $w; + } else { + $ximg = $this->w - $x - $w; + } + $this->img_rb_x = $ximg; + } else { + if ($palign == 'L') { + $ximg = $this->lMargin; + } elseif ($palign == 'C') { + $ximg = ($this->w - $w) / 2; + } elseif ($palign == 'R') { + $ximg = $this->w - $this->rMargin - $w; + } else { + $ximg = $x; + } + $this->img_rb_x = $ximg + $w; + } + if ($ismask OR $hidden) { + // image is not displayed + return $info['i']; + } + $xkimg = $ximg * $this->k; + $this->_out(sprintf('q %.2F 0 0 %.2F %.2F %.2F cm /I%d Do Q', ($w * $this->k), ($h * $this->k), $xkimg, (($this->h - ($y + $h)) * $this->k), $info['i'])); + if (!empty($border)) { + $bx = $x; + $by = $y; + $this->x = $ximg; + if ($this->rtl) { + $this->x += $w; + } + $this->y = $y; + $this->Cell($w, $h, '', $border, 0, '', 0, '', 0); + $this->x = $bx; + $this->y = $by; + } + if ($link) { + $this->Link($ximg, $y, $w, $h, $link, 0); + } + // set pointer to align the successive text/objects + switch($align) { + case 'T': { + $this->y = $y; + $this->x = $this->img_rb_x; + break; + } + case 'M': { + $this->y = $y + round($h/2); + $this->x = $this->img_rb_x; + break; + } + case 'B': { + $this->y = $this->img_rb_y; + $this->x = $this->img_rb_x; + break; + } + case 'N': { + $this->SetY($this->img_rb_y); + break; + } + default:{ + break; + } + } + $this->endlinex = $this->img_rb_x; + return $info['i']; + } + + /** + * Sets the current active configuration setting of magic_quotes_runtime (if the set_magic_quotes_runtime function exist) + * @param boolean $mqr FALSE for off, TRUE for on. + * @since 4.6.025 (2009-08-17) + */ + public function set_mqr($mqr) { + if(!defined('PHP_VERSION_ID')) { + $version = PHP_VERSION; + define('PHP_VERSION_ID', (($version{0} * 10000) + ($version{2} * 100) + $version{4})); + } + if (PHP_VERSION_ID < 50300) { + @set_magic_quotes_runtime($mqr); + } + } + + /** + * Gets the current active configuration setting of magic_quotes_runtime (if the get_magic_quotes_runtime function exist) + * @return Returns 0 if magic quotes runtime is off or get_magic_quotes_runtime doesn't exist, 1 otherwise. + * @since 4.6.025 (2009-08-17) + */ + public function get_mqr() { + if(!defined('PHP_VERSION_ID')) { + $version = PHP_VERSION; + define('PHP_VERSION_ID', (($version{0} * 10000) + ($version{2} * 100) + $version{4})); + } + if (PHP_VERSION_ID < 50300) { + return @get_magic_quotes_runtime(); + } + return 0; + } + + /** + * Convert the loaded image to a JPEG and then return a structure for the PDF creator. + * This function requires GD library and write access to the directory defined on K_PATH_CACHE constant. + * @param string $file Image file name. + * @param image $image Image object. + * return image JPEG image object. + * @access protected + */ + protected function _toJPEG($image) { + $tempname = tempnam(K_PATH_CACHE, 'jpg_'); + imagejpeg($image, $tempname, $this->jpeg_quality); + imagedestroy($image); + $retvars = $this->_parsejpeg($tempname); + // tidy up by removing temporary image + unlink($tempname); + return $retvars; + } + + /** + * Convert the loaded image to a PNG and then return a structure for the PDF creator. + * This function requires GD library and write access to the directory defined on K_PATH_CACHE constant. + * @param string $file Image file name. + * @param image $image Image object. + * return image PNG image object. + * @access protected + * @since 4.9.016 (2010-04-20) + */ + protected function _toPNG($image) { + $tempname = tempnam(K_PATH_CACHE, 'jpg_'); + imagepng($image, $tempname); + imagedestroy($image); + $retvars = $this->_parsepng($tempname); + // tidy up by removing temporary image + unlink($tempname); + return $retvars; + } + + /** + * Set the transparency for the given GD image. + * @param image $new_image GD image object + * @param image $image GD image object. + * return GD image object. + * @access protected + * @since 4.9.016 (2010-04-20) + */ + protected function _setGDImageTransparency($new_image, $image) { + // transparency index + $tid = imagecolortransparent($image); + // default transparency color + $tcol = array('red' => 255, 'green' => 255, 'blue' => 255); + if ($tid >= 0) { + // get the colors for the transparency index + $tcol = imagecolorsforindex($image, $tid); + } + $tid = imagecolorallocate($new_image, $tcol['red'], $tcol['green'], $tcol['blue']); + imagefill($new_image, 0, 0, $tid); + imagecolortransparent($new_image, $tid); + return $new_image; + } + + /** + * Extract info from a JPEG file without using the GD library. + * @param string $file image file to parse + * @return array structure containing the image data + * @access protected + */ + protected function _parsejpeg($file) { + $a = getimagesize($file); + if (empty($a)) { + $this->Error('Missing or incorrect image file: '.$file); + } + if ($a[2] != 2) { + $this->Error('Not a JPEG file: '.$file); + } + if ((!isset($a['channels'])) OR ($a['channels'] == 3)) { + $colspace = 'DeviceRGB'; + } elseif ($a['channels'] == 4) { + $colspace = 'DeviceCMYK'; + } else { + $colspace = 'DeviceGray'; + } + $bpc = isset($a['bits']) ? $a['bits'] : 8; + $data = file_get_contents($file); + return array('w' => $a[0], 'h' => $a[1], 'cs' => $colspace, 'bpc' => $bpc, 'f' => 'DCTDecode', 'data' => $data); + } + + /** + * Extract info from a PNG file without using the GD library. + * @param string $file image file to parse + * @return array structure containing the image data + * @access protected + */ + protected function _parsepng($file) { + $f = fopen($file, 'rb'); + if ($f === false) { + $this->Error('Can\'t open image file: '.$file); + } + //Check signature + if (fread($f, 8) != chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) { + $this->Error('Not a PNG file: '.$file); + } + //Read header chunk + fread($f, 4); + if (fread($f, 4) != 'IHDR') { + $this->Error('Incorrect PNG file: '.$file); + } + $w = $this->_freadint($f); + $h = $this->_freadint($f); + $bpc = ord(fread($f, 1)); + if ($bpc > 8) { + //$this->Error('16-bit depth not supported: '.$file); + fclose($f); + return false; + } + $ct = ord(fread($f, 1)); + if ($ct == 0) { + $colspace = 'DeviceGray'; + } elseif ($ct == 2) { + $colspace = 'DeviceRGB'; + } elseif ($ct == 3) { + $colspace = 'Indexed'; + } else { + // alpha channel + fclose($f); + return 'pngalpha'; + } + if (ord(fread($f, 1)) != 0) { + //$this->Error('Unknown compression method: '.$file); + fclose($f); + return false; + } + if (ord(fread($f, 1)) != 0) { + //$this->Error('Unknown filter method: '.$file); + fclose($f); + return false; + } + if (ord(fread($f, 1)) != 0) { + //$this->Error('Interlacing not supported: '.$file); + fclose($f); + return false; + } + fread($f, 4); + $parms = '/DecodeParms <</Predictor 15 /Colors '.($ct==2 ? 3 : 1).' /BitsPerComponent '.$bpc.' /Columns '.$w.'>>'; + //Scan chunks looking for palette, transparency and image data + $pal = ''; + $trns = ''; + $data = ''; + do { + $n = $this->_freadint($f); + $type = fread($f, 4); + if ($type == 'PLTE') { + //Read palette + $pal = $this->rfread($f, $n); + fread($f, 4); + } elseif ($type == 'tRNS') { + //Read transparency info + $t = $this->rfread($f, $n); + if ($ct == 0) { + $trns = array(ord(substr($t, 1, 1))); + } elseif ($ct == 2) { + $trns = array(ord(substr($t, 1, 1)), ord(substr($t, 3, 1)), ord(substr($t, 5, 1))); + } else { + $pos = strpos($t, chr(0)); + if ($pos !== false) { + $trns = array($pos); + } + } + fread($f, 4); + } elseif ($type == 'IDAT') { + //Read image data block + $data .= $this->rfread($f, $n); + fread($f, 4); + } elseif ($type == 'IEND') { + break; + } else { + $this->rfread($f, $n + 4); + } + } while ($n); + if (($colspace == 'Indexed') AND (empty($pal))) { + //$this->Error('Missing palette in '.$file); + fclose($f); + return false; + } + fclose($f); + return array('w' => $w, 'h' => $h, 'cs' => $colspace, 'bpc' => $bpc, 'f' => 'FlateDecode', 'parms' => $parms, 'pal' => $pal, 'trns' => $trns, 'data' => $data); + } + + /** + * Binary-safe and URL-safe file read. + * Reads up to length bytes from the file pointer referenced by handle. Reading stops as soon as one of the following conditions is met: length bytes have been read; EOF (end of file) is reached. + * @param resource $handle + * @param int $length + * @return Returns the read string or FALSE in case of error. + * @author Nicola Asuni + * @access protected + * @since 4.5.027 (2009-03-16) + */ + protected function rfread($handle, $length) { + $data = fread($handle, $length); + if ($data === false) { + return false; + } + $rest = $length - strlen($data); + if ($rest > 0) { + $data .= $this->rfread($handle, $rest); + } + return $data; + } + + /** + * Extract info from a PNG image with alpha channel using the GD library. + * @param string $file Name of the file containing the image. + * @param float $x Abscissa of the upper-left corner. + * @param float $y Ordinate of the upper-left corner. + * @param float $w Width of the image in the page. If not specified or equal to zero, it is automatically calculated. + * @param float $h Height of the image in the page. If not specified or equal to zero, it is automatically calculated. + * @param string $type Image format. Possible values are (case insensitive): JPEG and PNG (whitout GD library) and all images supported by GD: GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM;. If not specified, the type is inferred from the file extension. + * @param mixed $link URL or identifier returned by AddLink(). + * @param string $align Indicates the alignment of the pointer next to image insertion relative to image height. The value can be:<ul><li>T: top-right for LTR or top-left for RTL</li><li>M: middle-right for LTR or middle-left for RTL</li><li>B: bottom-right for LTR or bottom-left for RTL</li><li>N: next line</li></ul> + * @param boolean $resize If true resize (reduce) the image to fit $w and $h (requires GD library). + * @param int $dpi dot-per-inch resolution used on resize + * @param string $palign Allows to center or align the image on the current line. Possible values are:<ul><li>L : left align</li><li>C : center</li><li>R : right align</li><li>'' : empty string : left for LTR or right for RTL</li></ul> + * @author Valentin Schmidt, Nicola Asuni + * @access protected + * @since 4.3.007 (2008-12-04) + * @see Image() + */ + protected function ImagePngAlpha($file, $x='', $y='', $w=0, $h=0, $type='', $link='', $align='', $resize=false, $dpi=300, $palign='') { + // get image size + list($wpx, $hpx) = getimagesize($file); + // generate images + $img = imagecreatefrompng($file); + $imgalpha = imagecreate($wpx, $hpx); + // generate gray scale pallete + for ($c = 0; $c < 256; ++$c) { + ImageColorAllocate($imgalpha, $c, $c, $c); + } + // extract alpha channel + for ($xpx = 0; $xpx < $wpx; ++$xpx) { + for ($ypx = 0; $ypx < $hpx; ++$ypx) { + $colorindex = imagecolorat($img, $xpx, $ypx); + $col = imagecolorsforindex($img, $colorindex); + imagesetpixel($imgalpha, $xpx, $ypx, $this->getGDgamma((127 - $col['alpha']) * 255 / 127)); + } + } + // create temp alpha file + $tempfile_alpha = tempnam(K_PATH_CACHE, 'mska_'); + imagepng($imgalpha, $tempfile_alpha); + imagedestroy($imgalpha); + // extract image without alpha channel + $imgplain = imagecreatetruecolor($wpx, $hpx); + imagecopy($imgplain, $img, 0, 0, 0, 0, $wpx, $hpx); + // create temp image file + $tempfile_plain = tempnam(K_PATH_CACHE, 'mskp_'); + imagepng($imgplain, $tempfile_plain); + imagedestroy($imgplain); + // embed mask image + $imgmask = $this->Image($tempfile_alpha, $x, $y, $w, $h, 'PNG', '', '', $resize, $dpi, '', true, false); + // embed image, masked with previously embedded mask + $this->Image($tempfile_plain, $x, $y, $w, $h, $type, $link, $align, $resize, $dpi, $palign, false, $imgmask); + // remove temp files + unlink($tempfile_alpha); + unlink($tempfile_plain); + } + + /** + * Correct the gamma value to be used with GD library + * @param float $v the gamma value to be corrected + * @access protected + * @since 4.3.007 (2008-12-04) + */ + protected function getGDgamma($v) { + return (pow(($v / 255), 2.2) * 255); + } + + /** + * Performs a line break. + * The current abscissa goes back to the left margin and the ordinate increases by the amount passed in parameter. + * @param float $h The height of the break. By default, the value equals the height of the last printed cell. + * @param boolean $cell if true add a cMargin to the x coordinate + * @access public + * @since 1.0 + * @see Cell() + */ + public function Ln($h='', $cell=false) { + if (($this->num_columns > 0) AND ($this->y == $this->columns[$this->current_column]['y']) AND isset($this->columns[$this->current_column]['x']) AND ($this->x == $this->columns[$this->current_column]['x'])) { + // revove vertical space from the top of the column + return; + } + if ($cell) { + $cellmargin = $this->cMargin; + } else { + $cellmargin = 0; + } + if ($this->rtl) { + $this->x = $this->w - $this->rMargin - $cellmargin; + } else { + $this->x = $this->lMargin + $cellmargin; + } + if (is_string($h)) { + $this->y += $this->lasth; + } else { + $this->y += $h; + } + $this->newline = true; + } + + /** + * Returns the relative X value of current position. + * The value is relative to the left border for LTR languages and to the right border for RTL languages. + * @return float + * @access public + * @since 1.2 + * @see SetX(), GetY(), SetY() + */ + public function GetX() { + //Get x position + if ($this->rtl) { + return ($this->w - $this->x); + } else { + return $this->x; + } + } + + /** + * Returns the absolute X value of current position. + * @return float + * @access public + * @since 1.2 + * @see SetX(), GetY(), SetY() + */ + public function GetAbsX() { + return $this->x; + } + + /** + * Returns the ordinate of the current position. + * @return float + * @access public + * @since 1.0 + * @see SetY(), GetX(), SetX() + */ + public function GetY() { + return $this->y; + } + + /** + * Defines the abscissa of the current position. + * If the passed value is negative, it is relative to the right of the page (or left if language is RTL). + * @param float $x The value of the abscissa. + * @param boolean $rtloff if true always uses the page top-left corner as origin of axis. + * @access public + * @since 1.2 + * @see GetX(), GetY(), SetY(), SetXY() + */ + public function SetX($x, $rtloff=false) { + if (!$rtloff AND $this->rtl) { + if ($x >= 0) { + $this->x = $this->w - $x; + } else { + $this->x = abs($x); + } + } else { + if ($x >= 0) { + $this->x = $x; + } else { + $this->x = $this->w + $x; + } + } + if ($this->x < 0) { + $this->x = 0; + } + if ($this->x > $this->w) { + $this->x = $this->w; + } + } + + /** + * Moves the current abscissa back to the left margin and sets the ordinate. + * If the passed value is negative, it is relative to the bottom of the page. + * @param float $y The value of the ordinate. + * @param bool $resetx if true (default) reset the X position. + * @param boolean $rtloff if true always uses the page top-left corner as origin of axis. + * @access public + * @since 1.0 + * @see GetX(), GetY(), SetY(), SetXY() + */ + public function SetY($y, $resetx=true, $rtloff=false) { + if ($resetx) { + //reset x + if (!$rtloff AND $this->rtl) { + $this->x = $this->w - $this->rMargin; + } else { + $this->x = $this->lMargin; + } + } + if ($y >= 0) { + $this->y = $y; + } else { + $this->y = $this->h + $y; + } + if ($this->y < 0) { + $this->y = 0; + } + if ($this->y > $this->h) { + $this->y = $this->h; + } + } + + /** + * Defines the abscissa and ordinate of the current position. + * If the passed values are negative, they are relative respectively to the right and bottom of the page. + * @param float $x The value of the abscissa. + * @param float $y The value of the ordinate. + * @param boolean $rtloff if true always uses the page top-left corner as origin of axis. + * @access public + * @since 1.2 + * @see SetX(), SetY() + */ + public function SetXY($x, $y, $rtloff=false) { + $this->SetY($y, false, $rtloff); + $this->SetX($x, $rtloff); + } + + /** + * Send the document to a given destination: string, local file or browser. + * In the last case, the plug-in may be used (if present) or a download ("Save as" dialog box) may be forced.<br /> + * The method first calls Close() if necessary to terminate the document. + * @param string $name The name of the file when saved. Note that special characters are removed and blanks characters are replaced with the underscore character. + * @param string $dest Destination where to send the document. It can take one of the following values:<ul><li>I: send the file inline to the browser (default). The plug-in is used if available. The name given by name is used when one selects the "Save as" option on the link generating the PDF.</li><li>D: send to the browser and force a file download with the name given by name.</li><li>F: save to a local server file with the name given by name.</li><li>S: return the document as a string. name is ignored.</li><li>FI: equivalent to F + I option</li><li>FD: equivalent to F + D option</li></ul> + * @access public + * @since 1.0 + * @see Close() + */ + public function Output($name='doc.pdf', $dest='I') { + //Output PDF to some destination + //Finish document if necessary + $this->lastpage(); + if ($this->state < 3) { + $this->Close(); + } + //Normalize parameters + if (is_bool($dest)) { + $dest = $dest ? 'D' : 'F'; + } + $dest = strtoupper($dest); + if ($dest != 'F') { + $name = preg_replace('/[\s]+/', '_', $name); + $name = preg_replace('/[^a-zA-Z0-9_\.-]/', '', $name); + } + if ($this->sign) { + // *** apply digital signature to the document *** + // get the document content + $pdfdoc = $this->getBuffer(); + // remove last newline + $pdfdoc = substr($pdfdoc, 0, -1); + // Remove the original buffer + if (isset($this->diskcache) AND $this->diskcache) { + // remove buffer file from cache + unlink($this->buffer); + } + unset($this->buffer); + // remove filler space + $byterange_string_len = strlen($this->byterange_string); + // define the ByteRange + $byte_range = array(); + $byte_range[0] = 0; + $byte_range[1] = strpos($pdfdoc, $this->byterange_string) + $byterange_string_len + 10; + $byte_range[2] = $byte_range[1] + $this->signature_max_length + 2; + $byte_range[3] = strlen($pdfdoc) - $byte_range[2]; + $pdfdoc = substr($pdfdoc, 0, $byte_range[1]).substr($pdfdoc, $byte_range[2]); + // replace the ByteRange + $byterange = sprintf('/ByteRange[0 %u %u %u]', $byte_range[1], $byte_range[2], $byte_range[3]); + $byterange .= str_repeat(' ', ($byterange_string_len - strlen($byterange))); + $pdfdoc = str_replace($this->byterange_string, $byterange, $pdfdoc); + // write the document to a temporary folder + $tempdoc = tempnam(K_PATH_CACHE, 'tmppdf_'); + $f = fopen($tempdoc, 'wb'); + if (!$f) { + $this->Error('Unable to create temporary file: '.$tempdoc); + } + $pdfdoc_length = strlen($pdfdoc); + fwrite($f, $pdfdoc, $pdfdoc_length); + fclose($f); + // get digital signature via openssl library + $tempsign = tempnam(K_PATH_CACHE, 'tmpsig_'); + if (empty($this->signature_data['extracerts'])) { + openssl_pkcs7_sign($tempdoc, $tempsign, $this->signature_data['signcert'], array($this->signature_data['privkey'], $this->signature_data['password']), array(), PKCS7_BINARY | PKCS7_DETACHED); + } else { + openssl_pkcs7_sign($tempdoc, $tempsign, $this->signature_data['signcert'], array($this->signature_data['privkey'], $this->signature_data['password']), array(), PKCS7_BINARY | PKCS7_DETACHED, $this->signature_data['extracerts']); + } + unlink($tempdoc); + // read signature + $signature = file_get_contents($tempsign, false, null, $pdfdoc_length); + unlink($tempsign); + // extract signature + $signature = substr($signature, (strpos($signature, "%%EOF\n\n------") + 13)); + $tmparr = explode("\n\n", $signature); + $signature = $tmparr[1]; + unset($tmparr); + // decode signature + $signature = base64_decode(trim($signature)); + // convert signature to hex + $signature = current(unpack('H*', $signature)); + $signature = str_pad($signature, $this->signature_max_length, '0'); + // Add signature to the document + $pdfdoc = substr($pdfdoc, 0, $byte_range[1]).'<'.$signature.'>'.substr($pdfdoc, ($byte_range[1])); + $this->diskcache = false; + $this->buffer = &$pdfdoc; + $this->bufferlen = strlen($pdfdoc); + } + switch($dest) { + case 'I': { + // Send PDF to the standard output + if (ob_get_contents()) { + $this->Error('Some data has already been output, can\'t send PDF file'); + } + if (php_sapi_name() != 'cli') { + //We send to a browser + header('Content-Type: application/pdf'); + if (headers_sent()) { + $this->Error('Some data has already been output to browser, can\'t send PDF file'); + } + header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1 + header('Pragma: public'); + header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past + header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + header('Content-Length: '.$this->bufferlen); + header('Content-Disposition: inline; filename="'.basename($name).'";'); + } + echo $this->getBuffer(); + break; + } + case 'D': { + // Download PDF as file + if (ob_get_contents()) { + $this->Error('Some data has already been output, can\'t send PDF file'); + } + header('Content-Description: File Transfer'); + if (headers_sent()) { + $this->Error('Some data has already been output to browser, can\'t send PDF file'); + } + header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1 + header('Pragma: public'); + header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past + header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + // force download dialog + header('Content-Type: application/force-download'); + header('Content-Type: application/octet-stream', false); + header('Content-Type: application/download', false); + header('Content-Type: application/pdf', false); + // use the Content-Disposition header to supply a recommended filename + header('Content-Disposition: attachment; filename="'.basename($name).'";'); + header('Content-Transfer-Encoding: binary'); + header('Content-Length: '.$this->bufferlen); + echo $this->getBuffer(); + break; + } + case 'F': + case 'FI': + case 'FD': { + // Save PDF to a local file + if ($this->diskcache) { + copy($this->buffer, $name); + } else { + $f = fopen($name, 'wb'); + if (!$f) { + $this->Error('Unable to create output file: '.$name); + } + fwrite($f, $this->getBuffer(), $this->bufferlen); + fclose($f); + } + if ($dest == 'FI') { + // send headers to browser + header('Content-Type: application/pdf'); + header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1 + header('Pragma: public'); + header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past + header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + header('Content-Length: '.filesize($name)); + header('Content-Disposition: inline; filename="'.basename($name).'";'); + // send document to the browser + echo file_get_contents($name); + } elseif ($dest == 'FD') { + // send headers to browser + if (ob_get_contents()) { + $this->Error('Some data has already been output, can\'t send PDF file'); + } + header('Content-Description: File Transfer'); + if (headers_sent()) { + $this->Error('Some data has already been output to browser, can\'t send PDF file'); + } + header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1 + header('Pragma: public'); + header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past + header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); + // force download dialog + header('Content-Type: application/force-download'); + header('Content-Type: application/octet-stream', false); + header('Content-Type: application/download', false); + header('Content-Type: application/pdf', false); + // use the Content-Disposition header to supply a recommended filename + header('Content-Disposition: attachment; filename="'.basename($name).'";'); + header('Content-Transfer-Encoding: binary'); + header('Content-Length: '.filesize($name)); + // send document to the browser + echo file_get_contents($name); + } + break; + } + case 'S': { + // Returns PDF as a string + return $this->getBuffer(); + } + default: { + $this->Error('Incorrect output destination: '.$dest); + } + } + return ''; + } + + /** + * Unset all class variables except the following critical variables: internal_encoding, state, bufferlen, buffer and diskcache. + * @param boolean $destroyall if true destroys all class variables, otherwise preserves critical variables. + * @param boolean $preserve_objcopy if true preserves the objcopy variable + * @access public + * @since 4.5.016 (2009-02-24) + */ + public function _destroy($destroyall=false, $preserve_objcopy=false) { + if ($destroyall AND isset($this->diskcache) AND $this->diskcache AND (!$preserve_objcopy) AND (!$this->empty_string($this->buffer))) { + // remove buffer file from cache + unlink($this->buffer); + } + foreach (array_keys(get_object_vars($this)) as $val) { + if ($destroyall OR ( + ($val != 'internal_encoding') + AND ($val != 'state') + AND ($val != 'bufferlen') + AND ($val != 'buffer') + AND ($val != 'diskcache') + AND ($val != 'sign') + AND ($val != 'signature_data') + AND ($val != 'signature_max_length') + AND ($val != 'byterange_string') + )) { + if ((!$preserve_objcopy OR ($val != 'objcopy')) AND isset($this->$val)) { + unset($this->$val); + } + } + } + } + + /** + * Check for locale-related bug + * @access protected + */ + protected function _dochecks() { + //Check for locale-related bug + if (1.1 == 1) { + $this->Error('Don\'t alter the locale before including class file'); + } + //Check for decimal separator + if (sprintf('%.1F', 1.0) != '1.0') { + setlocale(LC_NUMERIC, 'C'); + } + } + + /** + * Return fonts path + * @return string + * @access protected + */ + protected function _getfontpath() { + if (!defined('K_PATH_FONTS') AND is_dir(dirname(__FILE__).'/fonts')) { + define('K_PATH_FONTS', dirname(__FILE__).'/fonts/'); + } + return defined('K_PATH_FONTS') ? K_PATH_FONTS : ''; + } + + /** + * Output pages. + * @access protected + */ + protected function _putpages() { + $nb = $this->numpages; + if (!empty($this->AliasNbPages)) { + $nbs = $this->formatPageNumber($nb); + $nbu = $this->UTF8ToUTF16BE($nbs, false); // replacement for unicode font + $alias_a = $this->_escape($this->AliasNbPages); + $alias_au = $this->_escape('{'.$this->AliasNbPages.'}'); + if ($this->isunicode) { + $alias_b = $this->_escape($this->UTF8ToLatin1($this->AliasNbPages)); + $alias_bu = $this->_escape($this->UTF8ToLatin1('{'.$this->AliasNbPages.'}')); + $alias_c = $this->_escape($this->utf8StrRev($this->AliasNbPages, false, $this->tmprtl)); + $alias_cu = $this->_escape($this->utf8StrRev('{'.$this->AliasNbPages.'}', false, $this->tmprtl)); + } + } + if (!empty($this->AliasNumPage)) { + $alias_pa = $this->_escape($this->AliasNumPage); + $alias_pau = $this->_escape('{'.$this->AliasNumPage.'}'); + if ($this->isunicode) { + $alias_pb = $this->_escape($this->UTF8ToLatin1($this->AliasNumPage)); + $alias_pbu = $this->_escape($this->UTF8ToLatin1('{'.$this->AliasNumPage.'}')); + $alias_pc = $this->_escape($this->utf8StrRev($this->AliasNumPage, false, $this->tmprtl)); + $alias_pcu = $this->_escape($this->utf8StrRev('{'.$this->AliasNumPage.'}', false, $this->tmprtl)); + } + } + $pagegroupnum = 0; + $filter = ($this->compress) ? '/Filter /FlateDecode ' : ''; + for ($n=1; $n <= $nb; ++$n) { + $temppage = $this->getPageBuffer($n); + if (!empty($this->pagegroups)) { + if(isset($this->newpagegroup[$n])) { + $pagegroupnum = 0; + } + ++$pagegroupnum; + foreach ($this->pagegroups as $k => $v) { + // replace total pages group numbers + $vs = $this->formatPageNumber($v); + $vu = $this->UTF8ToUTF16BE($vs, false); + $alias_ga = $this->_escape($k); + $alias_gau = $this->_escape('{'.$k.'}'); + if ($this->isunicode) { + $alias_gb = $this->_escape($this->UTF8ToLatin1($k)); + $alias_gbu = $this->_escape($this->UTF8ToLatin1('{'.$k.'}')); + $alias_gc = $this->_escape($this->utf8StrRev($k, false, $this->tmprtl)); + $alias_gcu = $this->_escape($this->utf8StrRev('{'.$k.'}', false, $this->tmprtl)); + } + $temppage = str_replace($alias_gau, $vu, $temppage); + if ($this->isunicode) { + $temppage = str_replace($alias_gbu, $vu, $temppage); + $temppage = str_replace($alias_gcu, $vu, $temppage); + $temppage = str_replace($alias_gb, $vs, $temppage); + $temppage = str_replace($alias_gc, $vs, $temppage); + } + $temppage = str_replace($alias_ga, $vs, $temppage); + // replace page group numbers + $pvs = $this->formatPageNumber($pagegroupnum); + $pvu = $this->UTF8ToUTF16BE($pvs, false); + $pk = str_replace('{nb', '{pnb', $k); + $alias_pga = $this->_escape($pk); + $alias_pgau = $this->_escape('{'.$pk.'}'); + if ($this->isunicode) { + $alias_pgb = $this->_escape($this->UTF8ToLatin1($pk)); + $alias_pgbu = $this->_escape($this->UTF8ToLatin1('{'.$pk.'}')); + $alias_pgc = $this->_escape($this->utf8StrRev($pk, false, $this->tmprtl)); + $alias_pgcu = $this->_escape($this->utf8StrRev('{'.$pk.'}', false, $this->tmprtl)); + } + $temppage = str_replace($alias_pgau, $pvu, $temppage); + if ($this->isunicode) { + $temppage = str_replace($alias_pgbu, $pvu, $temppage); + $temppage = str_replace($alias_pgcu, $pvu, $temppage); + $temppage = str_replace($alias_pgb, $pvs, $temppage); + $temppage = str_replace($alias_pgc, $pvs, $temppage); + } + $temppage = str_replace($alias_pga, $pvs, $temppage); + } + } + if (!empty($this->AliasNbPages)) { + // replace total pages number + $temppage = str_replace($alias_au, $nbu, $temppage); + if ($this->isunicode) { + $temppage = str_replace($alias_bu, $nbu, $temppage); + $temppage = str_replace($alias_cu, $nbu, $temppage); + $temppage = str_replace($alias_b, $nbs, $temppage); + $temppage = str_replace($alias_c, $nbs, $temppage); + } + $temppage = str_replace($alias_a, $nbs, $temppage); + } + if (!empty($this->AliasNumPage)) { + // replace page number + $pnbs = $this->formatPageNumber($n); + $pnbu = $this->UTF8ToUTF16BE($pnbs, false); // replacement for unicode font + $temppage = str_replace($alias_pau, $pnbu, $temppage); + if ($this->isunicode) { + $temppage = str_replace($alias_pbu, $pnbu, $temppage); + $temppage = str_replace($alias_pcu, $pnbu, $temppage); + $temppage = str_replace($alias_pb, $pnbs, $temppage); + $temppage = str_replace($alias_pc, $pnbs, $temppage); + } + $temppage = str_replace($alias_pa, $pnbs, $temppage); + } + $temppage = str_replace($this->epsmarker, '', $temppage); + //Page + $this->page_obj_id[$n] = $this->_newobj(); + $out = '<</Type /Page'; + $out .= ' /Parent 1 0 R'; + $out .= ' '.sprintf('/MediaBox [0 0 %.2F %.2F]', $this->pagedim[$n]['w'], $this->pagedim[$n]['h']); + $out .= ' /Group << /Type /Group /S /Transparency /CS /DeviceRGB >>'; + $out .= ' /Resources 2 0 R'; + $this->_out($out); + $this->_putannotsrefs($n); + $this->_out('/Contents '.($this->n + 1).' 0 R>> endobj'); + //Page content + $p = ($this->compress) ? gzcompress($temppage) : $temppage; + $this->_newobj(); + $this->_out('<<'.$filter.'/Length '.strlen($p).'>> '.$this->_getstream($p).' endobj'); + if ($this->diskcache) { + // remove temporary files + unlink($this->pages[$n]); + } + } + //Pages root + $this->offsets[1] = $this->bufferlen; + $out = '1 0 obj <</Type /Pages /Kids ['; + foreach($this->page_obj_id as $page_obj) { + $out .= ' '.$page_obj.' 0 R'; + } + $out .= ' ] /Count '.$nb.' >> endobj'; + $this->_out($out); + } + + /** + * Output references to page annotations + * @param int $n page number + * @access protected + * @author Nicola Asuni + * @since 4.7.000 (2008-08-29) + */ + protected function _putannotsrefs($n) { + if (!(isset($this->PageAnnots[$n]) OR ($this->sign AND isset($this->signature_data['cert_type'])))) { + return; + } + $out = '/Annots ['; + if (isset($this->PageAnnots[$n])) { + $num_annots = count($this->PageAnnots[$n]); + for ($i = 0; $i < $num_annots; ++$i) { + ++$this->curr_annot_obj_id; + if (!in_array($this->curr_annot_obj_id, $this->radio_groups)) { + $out .= ' '.$this->curr_annot_obj_id.' 0 R'; + } else { + ++$num_annots; + } + } + } + if (($n==1) AND $this->sign AND isset($this->signature_data['cert_type'])) { + // set reference for signature object + $out .= ' '.$this->sig_annot_ref; + } + $out .= ' ]'; + $this->_out($out); + } + + /** + * Output annotations objects for all pages. + * !!! THIS METHOD IS NOT YET COMPLETED !!! + * See section 12.5 of PDF 32000_2008 reference. + * @access protected + * @author Nicola Asuni + * @since 4.0.018 (2008-08-06) + */ + protected function _putannotsobjs() { + // reset object counter + $this->annot_obj_id = $this->annots_start_obj_id; + for ($n=1; $n <= $this->numpages; ++$n) { + if (isset($this->PageAnnots[$n])) { + // set page annotations + foreach ($this->PageAnnots[$n] as $key => $pl) { + // create annotation object for grouping radiobuttons + if (isset($this->radiobutton_groups[$n][$pl['txt']]) AND is_array($this->radiobutton_groups[$n][$pl['txt']])) { + $annots = '<<'; + $annots .= ' /Type /Annot'; + $annots .= ' /Subtype /Widget'; + $annots .= ' /T '.$this->_dataannobjstring($pl['txt']); + $annots .= ' /FT /Btn'; + $annots .= ' /Ff 49152'; + $annots .= ' /Kids ['; + foreach ($this->radiobutton_groups[$n][$pl['txt']] as $data) { + $annots .= ' '.$data['kid'].' 0 R'; + if ($data['def'] !== 'Off') { + $defval = $data['def']; + } + } + $annots .= ' ]'; + if (isset($defval)) { + $annots .= ' /V /'.$defval; + } + $annots .= ' >>'; + ++$this->annot_obj_id; + $this->offsets[$this->annot_obj_id] = $this->bufferlen; + $this->_out($this->annot_obj_id.' 0 obj '.$annots.' endobj'); + $this->form_obj_id[] = $this->annot_obj_id; + // store object id to be used on Parent entry of Kids + $this->radiobutton_groups[$n][$pl['txt']] = $this->annot_obj_id; + } + $formfield = false; + $pl['opt'] = array_change_key_case($pl['opt'], CASE_LOWER); + $a = $pl['x'] * $this->k; + $b = $this->pagedim[$n]['h'] - (($pl['y'] + $pl['h']) * $this->k); + $c = $pl['w'] * $this->k; + $d = $pl['h'] * $this->k; + $rect = sprintf('%.2F %.2F %.2F %.2F', $a, $b, $a+$c, $b+$d); + // create new annotation object + $annots = '<</Type /Annot'; + $annots .= ' /Subtype /'.$pl['opt']['subtype']; + $annots .= ' /Rect ['.$rect.']'; + $ft = array('Btn', 'Tx', 'Ch', 'Sig'); + if (isset($pl['opt']['ft']) AND in_array($pl['opt']['ft'], $ft)) { + $annots .= ' /FT /'.$pl['opt']['ft']; + $formfield = true; + } + $annots .= ' /Contents '.$this->_textannobjstring($pl['txt']); + $annots .= ' /P '.$this->page_obj_id[$n].' 0 R'; + $annots .= ' /NM '.$this->_dataannobjstring(sprintf('%04u-%04u', $n, $key)); + $annots .= ' /M '.$this->_datestring(); + if (isset($pl['opt']['f'])) { + $val = 0; + if (is_array($pl['opt']['f'])) { + foreach ($pl['opt']['f'] as $f) { + switch (strtolower($f)) { + case 'invisible': { + $val += 1 << 0; + break; + } + case 'hidden': { + $val += 1 << 1; + break; + } + case 'print': { + $val += 1 << 2; + break; + } + case 'nozoom': { + $val += 1 << 3; + break; + } + case 'norotate': { + $val += 1 << 4; + break; + } + case 'noview': { + $val += 1 << 5; + break; + } + case 'readonly': { + $val += 1 << 6; + break; + } + case 'locked': { + $val += 1 << 8; + break; + } + case 'togglenoview': { + $val += 1 << 9; + break; + } + case 'lockedcontents': { + $val += 1 << 10; + break; + } + default: { + break; + } + } + } + } else { + $val = intval($pl['opt']['f']); + } + $annots .= ' /F '.intval($val); + } + if (isset($pl['opt']['as']) AND is_string($pl['opt']['as'])) { + $annots .= ' /AS /'.$pl['opt']['as']; + } + if (isset($pl['opt']['ap'])) { + // appearance stream + $annots .= ' /AP <<'; + if (is_array($pl['opt']['ap'])) { + foreach ($pl['opt']['ap'] as $apmode => $apdef) { + // $apmode can be: n = normal; r = rollover; d = down; + $annots .= ' /'.strtoupper($apmode); + if (is_array($apdef)) { + $annots .= ' <<'; + foreach ($apdef as $apstate => $stream) { + // reference to XObject that define the appearance for this mode-state + $apsobjid = $this->_putAPXObject($c, $d, $stream); + $annots .= ' /'.$apstate.' '.$apsobjid.' 0 R'; + } + $annots .= ' >>'; + } else { + // reference to XObject that define the appearance for this mode + $apsobjid = $this->_putAPXObject($c, $d, $apdef); + $annots .= ' '.$apsobjid.' 0 R'; + } + } + } else { + $annots .= $pl['opt']['ap']; + } + $annots .= ' >>'; + } + if (isset($pl['opt']['bs']) AND (is_array($pl['opt']['bs']))) { + $annots .= ' /BS <<'; + $annots .= ' /Type /Border'; + if (isset($pl['opt']['bs']['w'])) { + $annots .= ' /W '.intval($pl['opt']['bs']['w']); + } + $bstyles = array('S', 'D', 'B', 'I', 'U'); + if (isset($pl['opt']['bs']['s']) AND in_array($pl['opt']['bs']['s'], $bstyles)) { + $annots .= ' /S /'.$pl['opt']['bs']['s']; + } + if (isset($pl['opt']['bs']['d']) AND (is_array($pl['opt']['bs']['d']))) { + $annots .= ' /D ['; + foreach ($pl['opt']['bs']['d'] as $cord) { + $annots .= ' '.intval($cord); + } + $annots .= ']'; + } + $annots .= ' >>'; + } else { + $annots .= ' /Border ['; + if (isset($pl['opt']['border']) AND (count($pl['opt']['border']) >= 3)) { + $annots .= intval($pl['opt']['border'][0]).' '; + $annots .= intval($pl['opt']['border'][1]).' '; + $annots .= intval($pl['opt']['border'][2]); + if (isset($pl['opt']['border'][3]) AND is_array($pl['opt']['border'][3])) { + $annots .= ' ['; + foreach ($pl['opt']['border'][3] as $dash) { + $annots .= intval($dash).' '; + } + $annots .= ']'; + } + } else { + $annots .= '0 0 0'; + } + $annots .= ']'; + } + if (isset($pl['opt']['be']) AND (is_array($pl['opt']['be']))) { + $annots .= ' /BE <<'; + $bstyles = array('S', 'C'); + if (isset($pl['opt']['be']['s']) AND in_array($pl['opt']['be']['s'], $markups)) { + $annots .= ' /S /'.$pl['opt']['bs']['s']; + } else { + $annots .= ' /S /S'; + } + if (isset($pl['opt']['be']['i']) AND ($pl['opt']['be']['i'] >= 0) AND ($pl['opt']['be']['i'] <= 2)) { + $annots .= ' /I '.sprintf(' %.4F', $pl['opt']['be']['i']); + } + $annots .= '>>'; + } + if (isset($pl['opt']['c']) AND (is_array($pl['opt']['c'])) AND !empty($pl['opt']['c'])) { + $annots .= ' /C ['; + foreach ($pl['opt']['c'] as $col) { + $col = intval($col); + $color = $col <= 0 ? 0 : ($col >= 255 ? 1 : $col / 255); + $annots .= sprintf(' %.4F', $color); + } + $annots .= ']'; + } + //$annots .= ' /StructParent '; + //$annots .= ' /OC '; + $markups = array('text', 'freetext', 'line', 'square', 'circle', 'polygon', 'polyline', 'highlight', 'underline', 'squiggly', 'strikeout', 'stamp', 'caret', 'ink', 'fileattachment', 'sound'); + if (in_array(strtolower($pl['opt']['subtype']), $markups)) { + // this is a markup type + if (isset($pl['opt']['t']) AND is_string($pl['opt']['t'])) { + $annots .= ' /T '.$this->_textannobjstring($pl['opt']['t']); + } + //$annots .= ' /Popup '; + if (isset($pl['opt']['ca'])) { + $annots .= ' /CA '.sprintf('%.4F', floatval($pl['opt']['ca'])); + } + if (isset($pl['opt']['rc'])) { + $annots .= ' /RC '.$this->_textannobjstring($pl['opt']['rc']); + } + $annots .= ' /CreationDate '.$this->_datestring(); + //$annots .= ' /IRT '; + if (isset($pl['opt']['subj'])) { + $annots .= ' /Subj '.$this->_textannobjstring($pl['opt']['subj']); + } + //$annots .= ' /RT '; + //$annots .= ' /IT '; + //$annots .= ' /ExData '; + } + $lineendings = array('Square', 'Circle', 'Diamond', 'OpenArrow', 'ClosedArrow', 'None', 'Butt', 'ROpenArrow', 'RClosedArrow', 'Slash'); + switch (strtolower($pl['opt']['subtype'])) { + case 'text': { + if (isset($pl['opt']['open'])) { + $annots .= ' /Open '. (strtolower($pl['opt']['open']) == 'true' ? 'true' : 'false'); + } + $iconsapp = array('Comment', 'Help', 'Insert', 'Key', 'NewParagraph', 'Note', 'Paragraph'); + if (isset($pl['opt']['name']) AND in_array($pl['opt']['name'], $iconsapp)) { + $annots .= ' /Name /'.$pl['opt']['name']; + } else { + $annots .= ' /Name /Note'; + } + $statemodels = array('Marked', 'Review'); + if (isset($pl['opt']['statemodel']) AND in_array($pl['opt']['statemodel'], $statemodels)) { + $annots .= ' /StateModel /'.$pl['opt']['statemodel']; + } else { + $pl['opt']['statemodel'] = 'Marked'; + $annots .= ' /StateModel /'.$pl['opt']['statemodel']; + } + if ($pl['opt']['statemodel'] == 'Marked') { + $states = array('Accepted', 'Unmarked'); + } else { + $states = array('Accepted', 'Rejected', 'Cancelled', 'Completed', 'None'); + } + if (isset($pl['opt']['state']) AND in_array($pl['opt']['state'], $states)) { + $annots .= ' /State /'.$pl['opt']['state']; + } else { + if ($pl['opt']['statemodel'] == 'Marked') { + $annots .= ' /State /Unmarked'; + } else { + $annots .= ' /State /None'; + } + } + break; + } + case 'link': { + if(is_string($pl['txt'])) { + // external URI link + $annots .= ' /A <</S /URI /URI '.$this->_dataannobjstring($this->unhtmlentities($pl['txt'])).'>>'; + } else { + // internal link + $l = $this->links[$pl['txt']]; + $annots .= sprintf(' /Dest [%d 0 R /XYZ 0 %.2F null]', (1 + (2 * $l[0])), ($this->pagedim[$l[0]]['h'] - ($l[1] * $this->k))); + } + $hmodes = array('N', 'I', 'O', 'P'); + if (isset($pl['opt']['h']) AND in_array($pl['opt']['h'], $hmodes)) { + $annots .= ' /H /'.$pl['opt']['h']; + } else { + $annots .= ' /H /I'; + } + //$annots .= ' /PA '; + //$annots .= ' /Quadpoints '; + break; + } + case 'freetext': { + if (isset($pl['opt']['da']) AND !empty($pl['opt']['da'])) { + $annots .= ' /DA ('.$pl['opt']['da'].')'; + } + if (isset($pl['opt']['q']) AND ($pl['opt']['q'] >= 0) AND ($pl['opt']['q'] <= 2)) { + $annots .= ' /Q '.intval($pl['opt']['q']); + } + if (isset($pl['opt']['rc'])) { + $annots .= ' /RC '.$this->_textannobjstring($pl['opt']['rc']); + } + if (isset($pl['opt']['ds'])) { + $annots .= ' /DS '.$this->_textannobjstring($pl['opt']['ds']); + } + if (isset($pl['opt']['cl']) AND is_array($pl['opt']['cl'])) { + $annots .= ' /CL ['; + foreach ($pl['opt']['cl'] as $cl) { + $annots .= sprintf('%.4F ', $cl * $this->k); + } + $annots .= ']'; + } + $tfit = array('FreeText', 'FreeTextCallout', 'FreeTextTypeWriter'); + if (isset($pl['opt']['it']) AND in_array($pl['opt']['it'], $tfit)) { + $annots .= ' /IT '.$pl['opt']['it']; + } + if (isset($pl['opt']['rd']) AND is_array($pl['opt']['rd'])) { + $l = $pl['opt']['rd'][0] * $this->k; + $r = $pl['opt']['rd'][1] * $this->k; + $t = $pl['opt']['rd'][2] * $this->k; + $b = $pl['opt']['rd'][3] * $this->k; + $annots .= ' /RD ['.sprintf('%.2F %.2F %.2F %.2F', $l, $r, $t, $b).']'; + } + if (isset($pl['opt']['le']) AND in_array($pl['opt']['le'], $lineendings)) { + $annots .= ' /LE /'.$pl['opt']['le']; + } + break; + } + case 'line': { + break; + } + case 'square': { + break; + } + case 'circle': { + break; + } + case 'polygon': { + break; + } + case 'polyline': { + break; + } + case 'highlight': { + break; + } + case 'underline': { + break; + } + case 'squiggly': { + break; + } + case 'strikeout': { + break; + } + case 'stamp': { + break; + } + case 'caret': { + break; + } + case 'ink': { + break; + } + case 'popup': { + break; + } + case 'fileattachment': { + if (!isset($pl['opt']['fs'])) { + break; + } + $filename = basename($pl['opt']['fs']); + if (isset($this->embeddedfiles[$filename]['n'])) { + $annots .= ' /FS <</Type /Filespec /F '.$this->_dataannobjstring($filename).' /EF <</F '.$this->embeddedfiles[$filename]['n'].' 0 R>> >>'; + $iconsapp = array('Graph', 'Paperclip', 'PushPin', 'Tag'); + if (isset($pl['opt']['name']) AND in_array($pl['opt']['name'], $iconsapp)) { + $annots .= ' /Name /'.$pl['opt']['name']; + } else { + $annots .= ' /Name /PushPin'; + } + } + break; + } + case 'sound': { + if (!isset($pl['opt']['fs'])) { + break; + } + $filename = basename($pl['opt']['fs']); + if (isset($this->embeddedfiles[$filename]['n'])) { + // ... TO BE COMPLETED ... + // /R /C /B /E /CO /CP + $annots .= ' /Sound <</Type /Filespec /F '.$this->_dataannobjstring($filename).' /EF <</F '.$this->embeddedfiles[$filename]['n'].' 0 R>> >>'; + $iconsapp = array('Speaker', 'Mic'); + if (isset($pl['opt']['name']) AND in_array($pl['opt']['name'], $iconsapp)) { + $annots .= ' /Name /'.$pl['opt']['name']; + } else { + $annots .= ' /Name /Speaker'; + } + } + break; + } + case 'movie': { + break; + } + case 'widget': { + $hmode = array('N', 'I', 'O', 'P', 'T'); + if (isset($pl['opt']['h']) AND in_array($pl['opt']['h'], $hmode)) { + $annots .= ' /H /'.$pl['opt']['h']; + } + if (isset($pl['opt']['mk']) AND (is_array($pl['opt']['mk'])) AND !empty($pl['opt']['mk'])) { + $annots .= ' /MK <<'; + if (isset($pl['opt']['mk']['r'])) { + $annots .= ' /R '.$pl['opt']['mk']['r']; + } + if (isset($pl['opt']['mk']['bc']) AND (is_array($pl['opt']['mk']['bc']))) { + $annots .= ' /BC ['; + foreach($pl['opt']['mk']['bc'] AS $col) { + $col = intval($col); + $color = $col <= 0 ? 0 : ($col >= 255 ? 1 : $col / 255); + $annots .= sprintf(' %.2F', $color); + } + $annots .= ']'; + } + if (isset($pl['opt']['mk']['bg']) AND (is_array($pl['opt']['mk']['bg']))) { + $annots .= ' /BG ['; + foreach($pl['opt']['mk']['bg'] AS $col) { + $col = intval($col); + $color = $col <= 0 ? 0 : ($col >= 255 ? 1 : $col / 255); + $annots .= sprintf(' %.2F', $color); + } + $annots .= ']'; + } + if (isset($pl['opt']['mk']['ca'])) { + $annots .= ' /CA '.$pl['opt']['mk']['ca'].''; + } + if (isset($pl['opt']['mk']['rc'])) { + $annots .= ' /RC '.$pl['opt']['mk']['ca'].''; + } + if (isset($pl['opt']['mk']['ac'])) { + $annots .= ' /AC '.$pl['opt']['mk']['ca'].''; + } + if (isset($pl['opt']['mk']['i'])) { + $info = $this->getImageBuffer($pl['opt']['mk']['i']); + if ($info !== false) { + $annots .= ' /I '.$info['n'].' 0 R'; + } + } + if (isset($pl['opt']['mk']['ri'])) { + $info = $this->getImageBuffer($pl['opt']['mk']['ri']); + if ($info !== false) { + $annots .= ' /RI '.$info['n'].' 0 R'; + } + } + if (isset($pl['opt']['mk']['ix'])) { + $info = $this->getImageBuffer($pl['opt']['mk']['ix']); + if ($info !== false) { + $annots .= ' /IX '.$info['n'].' 0 R'; + } + } + if (isset($pl['opt']['mk']['if']) AND (is_array($pl['opt']['mk']['if'])) AND !empty($pl['opt']['mk']['if'])) { + $annots .= ' /IF <<'; + $if_sw = array('A', 'B', 'S', 'N'); + if (isset($pl['opt']['mk']['if']['sw']) AND in_array($pl['opt']['mk']['if']['sw'], $if_sw)) { + $annots .= ' /SW /'.$pl['opt']['mk']['if']['sw']; + } + $if_s = array('A', 'P'); + if (isset($pl['opt']['mk']['if']['s']) AND in_array($pl['opt']['mk']['if']['s'], $if_s)) { + $annots .= ' /S /'.$pl['opt']['mk']['if']['s']; + } + if (isset($pl['opt']['mk']['if']['a']) AND (is_array($pl['opt']['mk']['if']['a'])) AND !empty($pl['opt']['mk']['if']['a'])) { + $annots .= sprintf(' /A [%.2F %.2F]', $pl['opt']['mk']['if']['a'][0], $pl['opt']['mk']['if']['a'][1]); + } + if (isset($pl['opt']['mk']['if']['fb']) AND ($pl['opt']['mk']['if']['fb'])) { + $annots .= ' /FB true'; + } + $annots .= '>>'; + } + if (isset($pl['opt']['mk']['tp']) AND ($pl['opt']['mk']['tp'] >= 0) AND ($pl['opt']['mk']['tp'] <= 6)) { + $annots .= ' /TP '.intval($pl['opt']['mk']['tp']); + } else { + $annots .= ' /TP 0'; + } + $annots .= '>>'; + } // end MK + // --- Entries for field dictionaries --- + if (isset($this->radiobutton_groups[$n][$pl['txt']])) { + // set parent + $annots .= ' /Parent '.$this->radiobutton_groups[$n][$pl['txt']].' 0 R'; + } + if (isset($pl['opt']['t']) AND is_string($pl['opt']['t'])) { + $annots .= ' /T '.$this->_dataannobjstring($pl['opt']['t']); + } + if (isset($pl['opt']['tu']) AND is_string($pl['opt']['tu'])) { + $annots .= ' /TU '.$this->_dataannobjstring($pl['opt']['tu']); + } + if (isset($pl['opt']['tm']) AND is_string($pl['opt']['tm'])) { + $annots .= ' /TM '.$this->_dataannobjstring($pl['opt']['tm']); + } + if (isset($pl['opt']['ff'])) { + if (is_array($pl['opt']['ff'])) { + // array of bit settings + $flag = 0; + foreach($pl['opt']['ff'] as $val) { + $flag += 1 << ($val - 1); + } + } else { + $flag = intval($pl['opt']['ff']); + } + $annots .= ' /Ff '.$flag; + } + if (isset($pl['opt']['maxlen'])) { + $annots .= ' /MaxLen '.intval($pl['opt']['maxlen']); + } + if (isset($pl['opt']['v'])) { + $annots .= ' /V'; + if (is_array($pl['opt']['v'])) { + foreach ($pl['opt']['v'] AS $optval) { + if (is_float($optval)) { + $optval = sprintf('%.2F', $optval); + } + $annots .= ' '.$optval; + } + } else { + $annots .= ' '.$this->_textannobjstring($pl['opt']['v']); + } + } + if (isset($pl['opt']['dv'])) { + $annots .= ' /DV'; + if (is_array($pl['opt']['dv'])) { + foreach ($pl['opt']['dv'] AS $optval) { + if (is_float($optval)) { + $optval = sprintf('%.2F', $optval); + } + $annots .= ' '.$optval; + } + } else { + $annots .= ' '.$this->_textannobjstring($pl['opt']['dv']); + } + } + if (isset($pl['opt']['rv'])) { + $annots .= ' /RV'; + if (is_array($pl['opt']['rv'])) { + foreach ($pl['opt']['rv'] AS $optval) { + if (is_float($optval)) { + $optval = sprintf('%.2F', $optval); + } + $annots .= ' '.$optval; + } + } else { + $annots .= ' '.$this->_textannobjstring($pl['opt']['rv']); + } + } + if (isset($pl['opt']['a']) AND !empty($pl['opt']['a'])) { + $annots .= ' /A << '.$pl['opt']['a'].' >>'; + } + if (isset($pl['opt']['aa']) AND !empty($pl['opt']['aa'])) { + $annots .= ' /AA << '.$pl['opt']['aa'].' >>'; + } + if (isset($pl['opt']['da']) AND !empty($pl['opt']['da'])) { + $annots .= ' /DA ('.$pl['opt']['da'].')'; + } + if (isset($pl['opt']['q']) AND ($pl['opt']['q'] >= 0) AND ($pl['opt']['q'] <= 2)) { + $annots .= ' /Q '.intval($pl['opt']['q']); + } + if (isset($pl['opt']['opt']) AND (is_array($pl['opt']['opt'])) AND !empty($pl['opt']['opt'])) { + $annots .= ' /Opt ['; + foreach($pl['opt']['opt'] AS $copt) { + if (is_array($copt)) { + $annots .= ' ['.$this->_textannobjstring($copt[0]).' '.$this->_textannobjstring($copt[1]).']'; + } else { + $annots .= ' '.$this->_textannobjstring($copt); + } + } + $annots .= ']'; + } + if (isset($pl['opt']['ti'])) { + $annots .= ' /TI '.intval($pl['opt']['ti']); + } + if (isset($pl['opt']['i']) AND (is_array($pl['opt']['i'])) AND !empty($pl['opt']['i'])) { + $annots .= ' /I ['; + foreach($pl['opt']['i'] AS $copt) { + $annots .= intval($copt).' '; + } + $annots .= ']'; + } + break; + } + case 'screen': { + break; + } + case 'printermark': { + break; + } + case 'trapnet': { + break; + } + case 'watermark': { + break; + } + case '3d': { + break; + } + default: { + break; + } + } + $annots .= '>>'; + // create new annotation object + ++$this->annot_obj_id; + $this->offsets[$this->annot_obj_id] = $this->bufferlen; + $this->_out($this->annot_obj_id.' 0 obj '.$annots.' endobj'); + if ($formfield AND ! isset($this->radiobutton_groups[$n][$pl['txt']])) { + // store reference of form object + $this->form_obj_id[] = $this->annot_obj_id; + } + } + } + } // end for each page + } + + /** + * Put appearance streams XObject used to define annotation's appearance states + * @param int $w annotation width + * @param int $h annotation height + * @param string $stream appearance stream + * @return int object ID + * @access protected + * @since 4.8.001 (2009-09-09) + */ + protected function _putAPXObject($w=0, $h=0, $stream='') { + $stream = trim($stream); + ++$this->apxo_obj_id; + $this->offsets[$this->apxo_obj_id] = $this->bufferlen; + $out = $this->apxo_obj_id.' 0 obj'; + $out .= ' <<'; + $out .= ' /Type /XObject'; + $out .= ' /Subtype /Form'; + $out .= ' /FormType 1'; + if ($this->compress) { + $stream = gzcompress($stream); + $out .= ' /Filter /FlateDecode'; + } + $rect = sprintf('%.2F %.2F', $w, $h); + $out .= ' /BBox [0 0 '.$rect.']'; + $out .= ' /Matrix [1 0 0 1 0 0]'; + $out .= ' /Resources <</ProcSet [/PDF]>>'; + $out .= ' /Length '.strlen($stream); + $out .= ' >>'; + $out .= ' '.$this->_getstream($stream); + $out .= ' endobj'; + $this->_out($out); + return $this->apxo_obj_id; + } + + /** + * Output fonts. + * @access protected + */ + protected function _putfonts() { + $nf = $this->n; + foreach ($this->diffs as $diff) { + //Encodings + $this->_newobj(); + $this->_out('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['.$diff.']>> endobj'); + } + $mqr = $this->get_mqr(); + $this->set_mqr(false); + foreach ($this->FontFiles as $file => $info) { + // search and get font file to embedd + $fontdir = $info['fontdir']; + $file = strtolower($file); + $fontfile = ''; + // search files on various directories + if (($fontdir !== false) AND file_exists($fontdir.$file)) { + $fontfile = $fontdir.$file; + } elseif (file_exists($this->_getfontpath().$file)) { + $fontfile = $this->_getfontpath().$file; + } elseif (file_exists($file)) { + $fontfile = $file; + } + if (!$this->empty_string($fontfile)) { + $font = file_get_contents($fontfile); + $compressed = (substr($file, -2) == '.z'); + if ((!$compressed) AND (isset($info['length2']))) { + $header = (ord($font{0}) == 128); + if ($header) { + //Strip first binary header + $font = substr($font, 6); + } + if ($header AND (ord($font{$info['length1']}) == 128)) { + //Strip second binary header + $font = substr($font, 0, $info['length1']).substr($font, ($info['length1'] + 6)); + } + } + $this->_newobj(); + $this->FontFiles[$file]['n'] = $this->n; + $out = '<</Length '.strlen($font); + if ($compressed) { + $out .= ' /Filter /FlateDecode'; + } + $out .= ' /Length1 '.$info['length1']; + if (isset($info['length2'])) { + $out .= ' /Length2 '.$info['length2'].' /Length3 0'; + } + $out .= ' >>'; + $out .= ' '.$this->_getstream($font); + $out .= ' endobj'; + $this->_out($out); + } + } + $this->set_mqr($mqr); + foreach ($this->fontkeys as $k) { + //Font objects + $this->setFontSubBuffer($k, 'n', $this->n + 1); + $font = $this->getFontBuffer($k); + $type = $font['type']; + $name = $font['name']; + if ($type == 'core') { + //Standard font + $obj_id = $this->_newobj(); + $out = '<</Type /Font'; + $out .= ' /Subtype /Type1'; + $out .= ' /BaseFont /'.$name; + $out .= ' /Name /F'.$font['i']; + if ((strtolower($name) != 'symbol') AND (strtolower($name) != 'zapfdingbats')) { + $out .= ' /Encoding /WinAnsiEncoding'; + } + if (strtolower($name) == 'helvetica') { + // add default font for annotations + $this->annotation_fonts['helvetica'] = $k; + } + $out .= ' >> endobj'; + $this->_out($out); + } elseif (($type == 'Type1') OR ($type == 'TrueType')) { + //Additional Type1 or TrueType font + $obj_id = $this->_newobj(); + $out = '<</Type /Font'; + $out .= ' /Subtype /'.$type; + $out .= ' /BaseFont /'.$name; + $out .= ' /Name /F'.$font['i']; + $out .= ' /FirstChar 32 /LastChar 255'; + $out .= ' /Widths '.($this->n + 1).' 0 R'; + $out .= ' /FontDescriptor '.($this->n + 2).' 0 R'; + if ($font['enc']) { + if (isset($font['diff'])) { + $out .= ' /Encoding '.($nf + $font['diff']).' 0 R'; + } else { + $out .= ' /Encoding /WinAnsiEncoding'; + } + } + $out .= ' >> endobj'; + $this->_out($out); + // Widths + $this->_newobj(); + $cw = &$font['cw']; + $s = '['; + for ($i = 32; $i < 256; ++$i) { + $s .= $cw[$i].' '; + } + $this->_out($s.'] endobj'); + //Descriptor + $this->_newobj(); + $s = '<</Type /FontDescriptor /FontName /'.$name; + foreach ($font['desc'] as $fdk => $fdv) { + if(is_float($fdv)) { + $fdv = sprintf('%.3F', $fdv); + } + $s .= ' /'.$fdk.' '.$fdv.''; + } + if (!$this->empty_string($font['file'])) { + $s .= ' /FontFile'.($type == 'Type1' ? '' : '2').' '.$this->FontFiles[$font['file']]['n'].' 0 R'; + } + $this->_out($s.'>> endobj'); + } else { + //Allow for additional types + $mtd = '_put'.strtolower($type); + if (!method_exists($this, $mtd)) { + $this->Error('Unsupported font type: '.$type); + } + $obj_id = $this->$mtd($font); + } + // store object ID for current font + $this->font_obj_ids[$k] = $obj_id; + } + } + + /** + * Outputs font widths + * @parameter array $font font data + * @parameter int $cidoffset offset for CID values + * @return PDF command string for font widths + * @author Nicola Asuni + * @access protected + * @since 4.4.000 (2008-12-07) + */ + protected function _putfontwidths($font, $cidoffset=0) { + ksort($font['cw']); + $rangeid = 0; + $range = array(); + $prevcid = -2; + $prevwidth = -1; + $interval = false; + // for each character + foreach ($font['cw'] as $cid => $width) { + $cid -= $cidoffset; + if ($width != $font['dw']) { + if ($cid == ($prevcid + 1)) { + // consecutive CID + if ($width == $prevwidth) { + if ($width == $range[$rangeid][0]) { + $range[$rangeid][] = $width; + } else { + array_pop($range[$rangeid]); + // new range + $rangeid = $prevcid; + $range[$rangeid] = array(); + $range[$rangeid][] = $prevwidth; + $range[$rangeid][] = $width; + } + $interval = true; + $range[$rangeid]['interval'] = true; + } else { + if ($interval) { + // new range + $rangeid = $cid; + $range[$rangeid] = array(); + $range[$rangeid][] = $width; + } else { + $range[$rangeid][] = $width; + } + $interval = false; + } + } else { + // new range + $rangeid = $cid; + $range[$rangeid] = array(); + $range[$rangeid][] = $width; + $interval = false; + } + $prevcid = $cid; + $prevwidth = $width; + } + } + // optimize ranges + $prevk = -1; + $nextk = -1; + $prevint = false; + foreach ($range as $k => $ws) { + $cws = count($ws); + if (($k == $nextk) AND (!$prevint) AND ((!isset($ws['interval'])) OR ($cws < 4))) { + if (isset($range[$k]['interval'])) { + unset($range[$k]['interval']); + } + $range[$prevk] = array_merge($range[$prevk], $range[$k]); + unset($range[$k]); + } else { + $prevk = $k; + } + $nextk = $k + $cws; + if (isset($ws['interval'])) { + if ($cws > 3) { + $prevint = true; + } else { + $prevint = false; + } + unset($range[$k]['interval']); + --$nextk; + } else { + $prevint = false; + } + } + // output data + $w = ''; + foreach ($range as $k => $ws) { + if (count(array_count_values($ws)) == 1) { + // interval mode is more compact + $w .= ' '.$k.' '.($k + count($ws) - 1).' '.$ws[0]; + } else { + // range mode + $w .= ' '.$k.' [ '.implode(' ', $ws).' ]'; + } + } + return '/W ['.$w.' ]'; + } + + /** + * Adds unicode fonts.<br> + * Based on PDF Reference 1.3 (section 5) + * @parameter array $font font data + * @return int font object ID + * @access protected + * @author Nicola Asuni + * @since 1.52.0.TC005 (2005-01-05) + */ + protected function _puttruetypeunicode($font) { + // Type0 Font + // A composite font composed of other fonts, organized hierarchically + $obj_id = $this->_newobj(); + $out = '<</Type /Font'; + $out .= ' /Subtype /Type0'; + $out .= ' /BaseFont /'.$font['name'].''; + $out .= ' /Name /F'.$font['i']; + $out .= ' /Encoding /'.$font['enc']; + $out .= ' /ToUnicode /Identity-H'; + $out .= ' /DescendantFonts ['.($this->n + 1).' 0 R]'; + $out .= ' >>'; + $out .= ' endobj'; + $this->_out($out); + // CIDFontType2 + // A CIDFont whose glyph descriptions are based on TrueType font technology + $this->_newobj(); + $out = '<</Type /Font'; + $out .= ' /Subtype /CIDFontType2'; + $out .= ' /BaseFont /'.$font['name']; + // A dictionary containing entries that define the character collection of the CIDFont. + $cidinfo = '/Registry '.$this->_datastring($font['cidinfo']['Registry']); + $cidinfo .= ' /Ordering '.$this->_datastring($font['cidinfo']['Ordering']); + $cidinfo .= ' /Supplement '.$font['cidinfo']['Supplement']; + $out .= ' /CIDSystemInfo <<'.$cidinfo.'>>'; + $out .= ' /FontDescriptor '.($this->n + 1).' 0 R'; + $out .= ' /DW '.$font['dw']; // default width + $out .= "\n".$this->_putfontwidths($font, 0); + $out .= ' /CIDToGIDMap '.($this->n + 2).' 0 R >> endobj'; + $this->_out($out); + // Font descriptor + // A font descriptor describing the CIDFont default metrics other than its glyph widths + $this->_newobj(); + $out = '<</Type /FontDescriptor'; + $out .= ' /FontName /'.$font['name']; + foreach ($font['desc'] as $key => $value) { + if(is_float($value)) { + $value = sprintf('%.3F', $value); + } + $out .= ' /'.$key.' '.$value; + } + $fontdir = false; + if (!$this->empty_string($font['file'])) { + // A stream containing a TrueType font + $out .= ' /FontFile2 '.$this->FontFiles[$font['file']]['n'].' 0 R'; + $fontdir = $this->FontFiles[$font['file']]['fontdir']; + } + $out .= ' >> endobj'; + $this->_out($out); + if (isset($font['ctg']) AND (!$this->empty_string($font['ctg']))) { + $this->_newobj(); + // Embed CIDToGIDMap + // A specification of the mapping from CIDs to glyph indices + // search and get CTG font file to embedd + $ctgfile = strtolower($font['ctg']); + // search and get ctg font file to embedd + $fontfile = ''; + // search files on various directories + if (($fontdir !== false) AND file_exists($fontdir.$ctgfile)) { + $fontfile = $fontdir.$ctgfile; + } elseif (file_exists($this->_getfontpath().$ctgfile)) { + $fontfile = $this->_getfontpath().$ctgfile; + } elseif (file_exists($ctgfile)) { + $fontfile = $ctgfile; + } + if ($this->empty_string($fontfile)) { + $this->Error('Font file not found: '.$ctgfile); + } + $size = filesize($fontfile); + $out = '<</Length '.$size.''; + if (substr($fontfile, -2) == '.z') { // check file extension + // Decompresses data encoded using the public-domain + // zlib/deflate compression method, reproducing the + // original text or binary data + $out .= ' /Filter /FlateDecode'; + } + $out .= ' >>'; + $out .= ' '.$this->_getstream(file_get_contents($fontfile)); + $out .= ' endobj'; + $this->_out($out); + } + return $obj_id; + } + + /** + * Output CID-0 fonts. + * A Type 0 CIDFont contains glyph descriptions based on the Adobe Type 1 font format + * @param array $font font data + * @return int font object ID + * @access protected + * @author Andrew Whitehead, Nicola Asuni, Yukihiro Nakadaira + * @since 3.2.000 (2008-06-23) + */ + protected function _putcidfont0($font) { + $cidoffset = 0; + if (!isset($font['cw'][1])) { + $cidoffset = 31; + } + if (isset($font['cidinfo']['uni2cid'])) { + // convert unicode to cid. + $uni2cid = $font['cidinfo']['uni2cid']; + $cw = array(); + foreach ($font['cw'] as $uni => $width) { + if (isset($uni2cid[$uni])) { + $cw[($uni2cid[$uni] + $cidoffset)] = $width; + } elseif ($uni < 256) { + $cw[$uni] = $width; + } // else unknown character + } + $font = array_merge($font, array('cw' => $cw)); + } + $name = $font['name']; + $enc = $font['enc']; + if ($enc) { + $longname = $name.'-'.$enc; + } else { + $longname = $name; + } + $obj_id = $this->_newobj(); + $out = '<</Type /Font'; + $out .= ' /Subtype /Type0'; + $out .= ' /BaseFont /'.$longname; + $out .= ' /Name /F'.$font['i']; + if ($enc) { + $out .= ' /Encoding /'.$enc; + } + $out .= ' /DescendantFonts ['.($this->n + 1).' 0 R]'; + $out .= ' >> endobj'; + $this->_out($out); + $this->_newobj(); + $out = '<</Type /Font'; + $out .= ' /Subtype /CIDFontType0'; + $out .= ' /BaseFont /'.$name; + $cidinfo = '/Registry '.$this->_datastring($font['cidinfo']['Registry']); + $cidinfo .= ' /Ordering '.$this->_datastring($font['cidinfo']['Ordering']); + $cidinfo .= ' /Supplement '.$font['cidinfo']['Supplement']; + $out .= ' /CIDSystemInfo <<'.$cidinfo.'>>'; + $out .= ' /FontDescriptor '.($this->n + 1).' 0 R'; + $out .= ' /DW '.$font['dw']; + $out .= "\n".$this->_putfontwidths($font, $cidoffset); + $out .= ' >> endobj'; + $this->_out($out); + $this->_newobj(); + $s = '<</Type /FontDescriptor /FontName /'.$name; + foreach ($font['desc'] as $k => $v) { + if ($k != 'Style') { + if(is_float($v)) { + $v = sprintf('%.3F', $v); + } + $s .= ' /'.$k.' '.$v.''; + } + } + $this->_out($s.'>> endobj'); + return $obj_id; + } + + /** + * Output images. + * @access protected + */ + protected function _putimages() { + $filter = ($this->compress) ? '/Filter /FlateDecode ' : ''; + foreach ($this->imagekeys as $file) { + $info = $this->getImageBuffer($file); + $this->_newobj(); + $this->setImageSubBuffer($file, 'n', $this->n); + $out = '<</Type /XObject'; + $out .= ' /Subtype /Image'; + $out .= ' /Width '.$info['w']; + $out .= ' /Height '.$info['h']; + if (array_key_exists('masked', $info)) { + $out .= ' /SMask '.($this->n - 1).' 0 R'; + } + if ($info['cs'] == 'Indexed') { + $out .= ' /ColorSpace [/Indexed /DeviceRGB '.((strlen($info['pal']) / 3) - 1).' '.($this->n + 1).' 0 R]'; + } else { + $out .= ' /ColorSpace /'.$info['cs']; + if ($info['cs'] == 'DeviceCMYK') { + $out .= ' /Decode [1 0 1 0 1 0 1 0]'; + } + } + $out .= ' /BitsPerComponent '.$info['bpc']; + if (isset($info['f'])) { + $out .= ' /Filter /'.$info['f']; + } + if (isset($info['parms'])) { + $out .= ' '.$info['parms']; + } + if (isset($info['trns']) AND is_array($info['trns'])) { + $trns=''; + $count_info = count($info['trns']); + for ($i=0; $i < $count_info; ++$i) { + $trns .= $info['trns'][$i].' '.$info['trns'][$i].' '; + } + $out .= ' /Mask ['.$trns.']'; + } + $out .= ' /Length '.strlen($info['data']).' >>'; + $out .= ' '.$this->_getstream($info['data']); + $out .= ' endobj'; + $this->_out($out); + //Palette + if ($info['cs'] == 'Indexed') { + $this->_newobj(); + $pal = ($this->compress) ? gzcompress($info['pal']) : $info['pal']; + $this->_out('<<'.$filter.'/Length '.strlen($pal).'>> '.$this->_getstream($pal).' endobj'); + } + } + } + + /** + * Output Spot Colors Resources. + * @access protected + * @since 4.0.024 (2008-09-12) + */ + protected function _putspotcolors() { + foreach ($this->spot_colors as $name => $color) { + $this->_newobj(); + $this->spot_colors[$name]['n'] = $this->n; + $out = '[/Separation /'.str_replace(' ', '#20', $name); + $out .= ' /DeviceCMYK <<'; + $out .= ' /Range [0 1 0 1 0 1 0 1] /C0 [0 0 0 0]'; + $out .= ' '.sprintf('/C1 [%.4F %.4F %.4F %.4F] ', $color['c']/100, $color['m']/100, $color['y']/100, $color['k']/100); + $out .= ' /FunctionType 2 /Domain [0 1] /N 1>>]'; + $out .= ' endobj'; + $this->_out($out); + } + } + + /** + * Output Resources Dictionary. + * @access protected + */ + protected function _putresourcedict() { + $out = '2 0 obj'; + $out .= ' << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'; + $out .= ' /Font <<'; + foreach ($this->fontkeys as $fontkey) { + $font = $this->getFontBuffer($fontkey); + $out .= ' /F'.$font['i'].' '.$font['n'].' 0 R'; + } + $out .= ' >>'; + $out .= ' /XObject <<'; + foreach ($this->imagekeys as $file) { + $info = $this->getImageBuffer($file); + $out .= ' /I'.$info['i'].' '.$info['n'].' 0 R'; + } + $out .= ' >>'; + // visibility + $out .= ' /Properties <</OC1 '.$this->n_ocg_print.' 0 R /OC2 '.$this->n_ocg_view.' 0 R>>'; + // transparency + $out .= ' /ExtGState <<'; + foreach ($this->extgstates as $k => $extgstate) { + if (isset($extgstate['name'])) { + $out .= ' /'.$extgstate['name']; + } else { + $out .= ' /GS'.$k; + } + $out .= ' '.$extgstate['n'].' 0 R'; + } + $out .= ' >>'; + // gradient patterns + if (isset($this->gradients) AND (count($this->gradients) > 0)) { + $out .= ' /Pattern <<'; + foreach ($this->gradients as $id => $grad) { + $out .= ' /p'.$id.' '.$grad['pattern'].' 0 R'; + } + $out .= ' >>'; + } + // gradient shadings + if (isset($this->gradients) AND (count($this->gradients) > 0)) { + $out .= ' /Shading <<'; + foreach ($this->gradients as $id => $grad) { + $out .= ' /Sh'.$id.' '.$grad['id'].' 0 R'; + } + $out .= ' >>'; + } + // spot colors + if (isset($this->spot_colors) AND (count($this->spot_colors) > 0)) { + $out .= ' /ColorSpace <<'; + foreach ($this->spot_colors as $color) { + $out .= ' /CS'.$color['i'].' '.$color['n'].' 0 R'; + } + $out .= ' >>'; + } + $out .= ' >> endobj'; + $this->_out($out); + } + + /** + * Output Resources. + * @access protected + */ + protected function _putresources() { + $this->_putextgstates(); + $this->_putocg(); + $this->_putfonts(); + $this->_putimages(); + $this->_putspotcolors(); + $this->_putshaders(); + //Resource dictionary + $this->offsets[2] = $this->bufferlen; + $this->_putresourcedict(); + $this->_putbookmarks(); + $this->_putEmbeddedFiles(); + $this->_putannotsobjs(); + $this->_putjavascript(); + // encryption + $this->_putencryption(); + } + + /** + * Adds some Metadata information (Document Information Dictionary) + * (see Chapter 14.3.3 Document Information Dictionary of PDF32000_2008.pdf Reference) + * @access protected + */ + protected function _putinfo() { + $this->_newobj(); + $out = '<<'; + if (!$this->empty_string($this->title)) { + // The document's title. + $out .= ' /Title '.$this->_textstring($this->title); + } + if (!$this->empty_string($this->author)) { + // The name of the person who created the document. + $out .= ' /Author '.$this->_textstring($this->author); + } + if (!$this->empty_string($this->subject)) { + // The subject of the document. + $out .= ' /Subject '.$this->_textstring($this->subject); + } + if (!$this->empty_string($this->keywords)) { + // Keywords associated with the document. + $out .= ' /Keywords '.$this->_textstring($this->keywords.' TCP'.'DF'); + } + if (!$this->empty_string($this->creator)) { + // If the document was converted to PDF from another format, the name of the conforming product that created the original document from which it was converted. + $out .= ' /Creator '.$this->_textstring($this->creator); + } + if (defined('PDF_PRODUCER')) { + // If the document was converted to PDF from another format, the name of the conforming product that converted it to PDF. + $out .= ' /Producer '.$this->_textstring(PDF_PRODUCER.' (TCP'.'DF)'); + } else { + // default producer + $out .= ' /Producer '.$this->_textstring('TCP'.'DF'); + } + // The date and time the document was created, in human-readable form + $out .= ' /CreationDate '.$this->_datestring(); + // The date and time the document was most recently modified, in human-readable form + $out .= ' /ModDate '.$this->_datestring(); + // A name object indicating whether the document has been modified to include trapping information + //$out .= ' /Trapped /False'); + $out .= ' >> endobj'; + $this->_out($out); + } + + /** + * Output Catalog. + * @access protected + */ + protected function _putcatalog() { + $this->_newobj(); + $out = '<< /Type /Catalog'; + $out .= ' /Pages 1 0 R'; + if ($this->ZoomMode == 'fullpage') { + $out .= ' /OpenAction [3 0 R /Fit]'; + } elseif ($this->ZoomMode == 'fullwidth') { + $out .= ' /OpenAction [3 0 R /FitH null]'; + } elseif ($this->ZoomMode == 'real') { + $out .= ' /OpenAction [3 0 R /XYZ null null 1]'; + } elseif (!is_string($this->ZoomMode)) { + $out .= ' /OpenAction [3 0 R /XYZ null null '.($this->ZoomMode / 100).']'; + } + if (isset($this->LayoutMode) AND (!$this->empty_string($this->LayoutMode))) { + $out .= ' /PageLayout /'.$this->LayoutMode; + } + if (isset($this->PageMode) AND (!$this->empty_string($this->PageMode))) { + $out .= ' /PageMode /'.$this->PageMode; + } + if (isset($this->l['a_meta_language'])) { + $out .= ' /Lang /'.$this->l['a_meta_language']; + } + $out .= ' /Names <<'; + if ((!empty($this->javascript)) OR (!empty($this->js_objects))) { + $out .= ' /JavaScript '.($this->n_js).' 0 R'; + } + $out .= ' >>'; + if (count($this->outlines) > 0) { + $out .= ' /Outlines '.$this->OutlineRoot.' 0 R'; + $out .= ' /PageMode /UseOutlines'; + } + $out .= ' '.$this->_putviewerpreferences(); + $p = $this->n_ocg_print.' 0 R'; + $v = $this->n_ocg_view.' 0 R'; + $as = '<</Event /Print /OCGs ['.$p.' '.$v.'] /Category [/Print]>> <</Event /View /OCGs ['.$p.' '.$v.'] /Category [/View]>>'; + $out .= ' /OCProperties <</OCGs ['.$p.' '.$v.'] /D <</ON ['.$p.'] /OFF ['.$v.'] /AS ['.$as.']>>>>'; + // AcroForm + if (!empty($this->form_obj_id) OR ($this->sign AND isset($this->signature_data['cert_type']))) { + $out .= ' /AcroForm<<'; + $objrefs = ''; + if ($this->sign AND isset($this->signature_data['cert_type'])) { + $objrefs .= $this->sig_obj_id.' 0 R'; + } + if (!empty($this->form_obj_id)) { + foreach($this->form_obj_id as $objid) { + $objrefs .= ' '.$objid.' 0 R'; + } + } + $out .= ' /Fields ['.$objrefs.']'; + $out .= ' /NeedAppearances '.(empty($this->form_obj_id)?'false':'true'); + if ($this->sign AND isset($this->signature_data['cert_type'])) { + $out .= ' /SigFlags 3'; + } + //$out .= ' /CO '; + if (isset($this->annotation_fonts) AND !empty($this->annotation_fonts)) { + $out .= ' /DR <<'; + $out .= ' /Font <<'; + foreach ($this->annotation_fonts as $font => $fontkey) { + $out .= ' /F'.($fontkey + 1).' '.$this->font_obj_ids[$font].' 0 R'; + } + $out .= ' >> >>'; + } + $out .= ' /DA (/F'.(array_search('helvetica', $this->fontkeys) + 1).' 0 Tf 0 g)'; + $out .= ' /Q '.(($this->rtl)?'2':'0'); + //$out .= ' /XFA '; + $out .= ' >>'; + // signatures + if ($this->sign AND isset($this->signature_data['cert_type'])) { + if ($this->signature_data['cert_type'] > 0) { + $out .= ' /Perms<</DocMDP '.($this->sig_obj_id + 1).' 0 R>>'; + } else { + $out .= ' /Perms<</UR3 '.($this->sig_obj_id + 1).' 0 R>>'; + } + } + } + $out .= ' >> endobj'; + $this->_out($out); + } + + /** + * Output viewer preferences. + * @return string for viewer preferences + * @author Nicola asuni + * @since 3.1.000 (2008-06-09) + * @access protected + */ + protected function _putviewerpreferences() { + $out = '/ViewerPreferences <<'; + if ($this->rtl) { + $out .= ' /Direction /R2L'; + } else { + $out .= ' /Direction /L2R'; + } + if (isset($this->viewer_preferences['HideToolbar']) AND ($this->viewer_preferences['HideToolbar'])) { + $out .= ' /HideToolbar true'; + } + if (isset($this->viewer_preferences['HideMenubar']) AND ($this->viewer_preferences['HideMenubar'])) { + $out .= ' /HideMenubar true'; + } + if (isset($this->viewer_preferences['HideWindowUI']) AND ($this->viewer_preferences['HideWindowUI'])) { + $out .= ' /HideWindowUI true'; + } + if (isset($this->viewer_preferences['FitWindow']) AND ($this->viewer_preferences['FitWindow'])) { + $out .= ' /FitWindow true'; + } + if (isset($this->viewer_preferences['CenterWindow']) AND ($this->viewer_preferences['CenterWindow'])) { + $out .= ' /CenterWindow true'; + } + if (isset($this->viewer_preferences['DisplayDocTitle']) AND ($this->viewer_preferences['DisplayDocTitle'])) { + $out .= ' /DisplayDocTitle true'; + } + if (isset($this->viewer_preferences['NonFullScreenPageMode'])) { + $out .= ' /NonFullScreenPageMode /'.$this->viewer_preferences['NonFullScreenPageMode']; + } + if (isset($this->viewer_preferences['ViewArea'])) { + $out .= ' /ViewArea /'.$this->viewer_preferences['ViewArea']; + } + if (isset($this->viewer_preferences['ViewClip'])) { + $out .= ' /ViewClip /'.$this->viewer_preferences['ViewClip']; + } + if (isset($this->viewer_preferences['PrintArea'])) { + $out .= ' /PrintArea /'.$this->viewer_preferences['PrintArea']; + } + if (isset($this->viewer_preferences['PrintClip'])) { + $out .= ' /PrintClip /'.$this->viewer_preferences['PrintClip']; + } + if (isset($this->viewer_preferences['PrintScaling'])) { + $out .= ' /PrintScaling /'.$this->viewer_preferences['PrintScaling']; + } + if (isset($this->viewer_preferences['Duplex']) AND (!$this->empty_string($this->viewer_preferences['Duplex']))) { + $out .= ' /Duplex /'.$this->viewer_preferences['Duplex']; + } + if (isset($this->viewer_preferences['PickTrayByPDFSize'])) { + if ($this->viewer_preferences['PickTrayByPDFSize']) { + $out .= ' /PickTrayByPDFSize true'; + } else { + $out .= ' /PickTrayByPDFSize false'; + } + } + if (isset($this->viewer_preferences['PrintPageRange'])) { + $PrintPageRangeNum = ''; + foreach ($this->viewer_preferences['PrintPageRange'] as $k => $v) { + $PrintPageRangeNum .= ' '.($v - 1).''; + } + $out .= ' /PrintPageRange ['.substr($PrintPageRangeNum,1).']'; + } + if (isset($this->viewer_preferences['NumCopies'])) { + $out .= ' /NumCopies '.intval($this->viewer_preferences['NumCopies']); + } + $out .= ' >>'; + return $out; + } + + /** + * Output trailer. + * @access protected + */ + protected function _puttrailer() { + $out = 'trailer <<'; + $out .= ' /Size '.($this->n + 1); + $out .= ' /Root '.$this->n.' 0 R'; + $out .= ' /Info '.($this->n - 1).' 0 R'; + if ($this->encrypted) { + $out .= ' /Encrypt '.$this->enc_obj_id.' 0 R'; + $out .= ' /ID [()()]'; + } + $out .= ' >>'; + $this->_out($out); + } + + /** + * Output PDF header. + * @access protected + */ + protected function _putheader() { + $this->_out('%PDF-'.$this->PDFVersion); + } + + /** + * Output end of document (EOF). + * @access protected + */ + protected function _enddoc() { + $this->state = 1; + $this->_putheader(); + $this->_putpages(); + $this->_putresources(); + // Signature + if ($this->sign AND isset($this->signature_data['cert_type'])) { + // widget annotation for signature + $this->sig_obj_id = $this->_newobj(); + // --- replace signature ID on the first page --- + // get the document content + $pdfdoc = $this->getBuffer(); + // Remove the original buffer + if (isset($this->diskcache) AND $this->diskcache) { + // remove buffer file from cache + unlink($this->buffer); + } + unset($this->buffer); + $signature_widget_ref = sprintf('%u 0 R', $this->sig_obj_id); + $signature_widget_ref .= str_repeat(' ', (strlen($this->sig_annot_ref) - strlen($signature_widget_ref))); + $pdfdoc = str_replace($this->sig_annot_ref, $signature_widget_ref, $pdfdoc); + $this->diskcache = false; + $this->buffer = &$pdfdoc; + $this->bufferlen = strlen($pdfdoc); + // --- + $out = '<< /Type /Annot /Subtype /Widget /Rect [0 0 0 0]'; + $out .= ' /P 3 0 R'; // link to first page object + $out .= ' /FT /Sig'; + $out .= ' /T '.$this->_textstring('Signature'); + $out .= ' /Ff 0'; + $out .= ' /V '.($this->sig_obj_id + 1).' 0 R'; + $out .= ' >> endobj'; + $this->_out($out); + // signature + $this->_putsignature(); + } + // Info + $this->_putinfo(); + // Catalog + $this->_putcatalog(); + // Cross-ref + $o = $this->bufferlen; + $this->_out('xref'); + $this->_out('0 '.($this->n + 1)); + $this->_out('0000000000 65535 f '); + for ($i=1; $i <= $this->n; ++$i) { + $this->_out(sprintf('%010d 00000 n ', $this->offsets[$i])); + } + // Embedded Files + if (isset($this->embeddedfiles) AND count($this->embeddedfiles) > 0) { + $this->_out($this->embedded_start_obj_id.' '.count($this->embeddedfiles)); + foreach ($this->embeddedfiles as $filename => $filedata) { + $this->_out(sprintf('%010d 00000 n ', $this->offsets[$filedata['n']])); + } + } + // Annotation Objects + if ($this->annot_obj_id > $this->annots_start_obj_id) { + $this->_out(($this->annots_start_obj_id + 1).' '.($this->annot_obj_id - $this->annots_start_obj_id)); + for ($i = ($this->annots_start_obj_id + 1); $i <= $this->annot_obj_id; ++$i) { + $this->_out(sprintf('%010d 00000 n ', $this->offsets[$i])); + } + } + // Javascript Objects + if ($this->js_obj_id > $this->js_start_obj_id) { + $this->_out(($this->js_start_obj_id + 1).' '.($this->js_obj_id - $this->js_start_obj_id)); + for ($i = ($this->js_start_obj_id + 1); $i <= $this->js_obj_id; ++$i) { + $this->_out(sprintf('%010d 00000 n ', $this->offsets[$i])); + } + } + // Appearance streams XObjects + if ($this->apxo_obj_id > $this->apxo_start_obj_id) { + $this->_out(($this->apxo_start_obj_id + 1).' '.($this->apxo_obj_id - $this->apxo_start_obj_id)); + for ($i = ($this->apxo_start_obj_id + 1); $i <= $this->apxo_obj_id; ++$i) { + $this->_out(sprintf('%010d 00000 n ', $this->offsets[$i])); + } + } + //Trailer + $this->_puttrailer(); + $this->_out('startxref'); + $this->_out($o); + $this->_out('%%EOF'); + $this->state = 3; // end-of-doc + if ($this->diskcache) { + // remove temporary files used for images + foreach ($this->imagekeys as $key) { + // remove temporary files + unlink($this->images[$key]); + } + foreach ($this->fontkeys as $key) { + // remove temporary files + unlink($this->fonts[$key]); + } + } + } + + /** + * Initialize a new page. + * @param string $orientation page orientation. Possible values are (case insensitive):<ul><li>P or PORTRAIT (default)</li><li>L or LANDSCAPE</li></ul> + * @param mixed $format The format used for pages. It can be either one of the following values (case insensitive) or a custom format in the form of a two-element array containing the width and the height (expressed in the unit given by unit).<ul><li>4A0</li><li>2A0</li><li>A0</li><li>A1</li><li>A2</li><li>A3</li><li>A4 (default)</li><li>A5</li><li>A6</li><li>A7</li><li>A8</li><li>A9</li><li>A10</li><li>B0</li><li>B1</li><li>B2</li><li>B3</li><li>B4</li><li>B5</li><li>B6</li><li>B7</li><li>B8</li><li>B9</li><li>B10</li><li>C0</li><li>C1</li><li>C2</li><li>C3</li><li>C4</li><li>C5</li><li>C6</li><li>C7</li><li>C8</li><li>C9</li><li>C10</li><li>RA0</li><li>RA1</li><li>RA2</li><li>RA3</li><li>RA4</li><li>SRA0</li><li>SRA1</li><li>SRA2</li><li>SRA3</li><li>SRA4</li><li>LETTER</li><li>LEGAL</li><li>EXECUTIVE</li><li>FOLIO</li></ul> + * @access protected + */ + protected function _beginpage($orientation='', $format='') { + ++$this->page; + $this->setPageBuffer($this->page, ''); + // initialize array for graphics tranformation positions inside a page buffer + $this->transfmrk[$this->page] = array(); + $this->state = 2; + if ($this->empty_string($orientation)) { + if (isset($this->CurOrientation)) { + $orientation = $this->CurOrientation; + } else { + $orientation = 'P'; + } + } + if ($this->empty_string($format)) { + $this->setPageOrientation($orientation); + } else { + $this->setPageFormat($format, $orientation); + } + if ($this->rtl) { + $this->x = $this->w - $this->rMargin; + } else { + $this->x = $this->lMargin; + } + $this->y = $this->tMargin; + if (isset($this->newpagegroup[$this->page])) { + // start a new group + $n = sizeof($this->pagegroups) + 1; + $alias = '{nb'.$n.'}'; + $this->pagegroups[$alias] = 1; + $this->currpagegroup = $alias; + } elseif ($this->currpagegroup) { + ++$this->pagegroups[$this->currpagegroup]; + } + } + + /** + * Mark end of page. + * @access protected + */ + protected function _endpage() { + $this->setVisibility('all'); + $this->state = 1; + } + + /** + * Begin a new object and return the object number. + * @return int object number + * @access protected + */ + protected function _newobj() { + ++$this->n; + $this->offsets[$this->n] = $this->bufferlen; + $this->_out($this->n.' 0 obj'); + return $this->n; + } + + /** + * Underline text. + * @param int $x X coordinate + * @param int $y Y coordinate + * @param string $txt text to underline + * @access protected + */ + protected function _dounderline($x, $y, $txt) { + $w = $this->GetStringWidth($txt); + return $this->_dounderlinew($x, $y, $w); + } + + /** + * Underline for rectangular text area. + * @param int $x X coordinate + * @param int $y Y coordinate + * @param int $w width to underline + * @access protected + * @since 4.8.008 (2009-09-29) + */ + protected function _dounderlinew($x, $y, $w) { + $linew = - $this->CurrentFont['ut'] / 1000 * $this->FontSizePt; + return sprintf('%.2F %.2F %.2F %.2F re f', $x * $this->k, ($this->h - $y + ($linew / 2)) * $this->k, $w * $this->k, $linew); + } + + /** + * Line through text. + * @param int $x X coordinate + * @param int $y Y coordinate + * @param string $txt text to linethrough + * @access protected + */ + protected function _dolinethrough($x, $y, $txt) { + $w = $this->GetStringWidth($txt); + return $this->_dolinethroughw($x, $y, $w); + } + + /** + * Line through for rectangular text area. + * @param int $x X coordinate + * @param int $y Y coordinate + * @param string $txt text to linethrough + * @access protected + * @since 4.9.008 (2009-09-29) + */ + protected function _dolinethroughw($x, $y, $w) { + $linew = - $this->CurrentFont['ut'] / 1000 * $this->FontSizePt; + return sprintf('%.2F %.2F %.2F %.2F re f', $x * $this->k, ($this->h - $y + ($this->FontSize / 3) + ($linew / 2)) * $this->k, $w * $this->k, $linew); + } + + /** + * Overline text. + * @param int $x X coordinate + * @param int $y Y coordinate + * @param string $txt text to overline + * @access protected + * @since 4.9.015 (2010-04-19) + */ + protected function _dooverline($x, $y, $txt) { + $w = $this->GetStringWidth($txt); + return $this->_dooverlinew($x, $y, $w); + } + + /** + * Overline for rectangular text area. + * @param int $x X coordinate + * @param int $y Y coordinate + * @param int $w width to overline + * @access protected + * @since 4.9.015 (2010-04-19) + */ + protected function _dooverlinew($x, $y, $w) { + $linew = - $this->CurrentFont['ut'] / 1000 * $this->FontSizePt; + return sprintf('%.2F %.2F %.2F %.2F re f', $x * $this->k, ($this->h - $y + $this->FontAscent - ($linew / 2)) * $this->k, $w * $this->k, $linew); + + } + + /** + * Read a 4-byte integer from file. + * @param string $f file name. + * @return 4-byte integer + * @access protected + */ + protected function _freadint($f) { + $a = unpack('Ni', fread($f, 4)); + return $a['i']; + } + + /** + * Add "\" before "\", "(" and ")" + * @param string $s string to escape. + * @return string escaped string. + * @access protected + */ + protected function _escape($s) { + // the chr(13) substitution fixes the Bugs item #1421290. + return strtr($s, array(')' => '\\)', '(' => '\\(', '\\' => '\\\\', chr(13) => '\r')); + } + + /** + * Format a data string for meta information + * @param string $s data string to escape. + * @return string escaped string. + * @access protected + */ + protected function _datastring($s) { + if ($this->encrypted) { + $s = $this->_RC4($this->_objectkey($this->n), $s); + } + return '('. $this->_escape($s).')'; + } + + /** + * Format a data string for annotation objects + * @param string $s data string to escape. + * @return string escaped string. + * @access protected + */ + protected function _dataannobjstring($s) { + if ($this->encrypted) { + $s = $this->_RC4($this->_objectkey($this->annot_obj_id + 1), $s); + } + return '('. $this->_escape($s).')'; + } + + /** + * Returns a formatted date for meta information + * @return string escaped date string. + * @access protected + * @since 4.6.028 (2009-08-25) + */ + protected function _datestring() { + $current_time = substr_replace(date('YmdHisO'), '\'', (0 - 2), 0).'\''; + return $this->_datastring('D:'.$current_time); + } + + /** + * Format a text string for meta information + * @param string $s string to escape. + * @return string escaped string. + * @access protected + */ + protected function _textstring($s) { + if ($this->isunicode) { + //Convert string to UTF-16BE + $s = $this->UTF8ToUTF16BE($s, true); + } + return $this->_datastring($s); + } + + /** + * Format a UTF-8 text string for meta information on annotations + * @param string $s string to escape. + * @return string escaped string. + * @access protected + */ + protected function _textannobjstring($s) { + if ($this->isunicode) { + //Convert string to UTF-16BE + $s = $this->UTF8ToUTF16BE($s, true); + } + return $this->_dataannobjstring($s); + } + + /** + * Format a text string + * @param string $s string to escape. + * @return string escaped string. + * @access protected + */ + protected function _escapetext($s) { + if ($this->isunicode) { + if (($this->CurrentFont['type'] == 'core') OR ($this->CurrentFont['type'] == 'TrueType') OR ($this->CurrentFont['type'] == 'Type1')) { + $s = $this->UTF8ToLatin1($s); + } else { + //Convert string to UTF-16BE and reverse RTL language + $s = $this->utf8StrRev($s, false, $this->tmprtl); + } + } + return $this->_escape($s); + } + + /** + * Format output stream. + * @param string $s string to output. + * @param int $n object reference for encryption mode + * @access protected + */ + protected function _getstream($s, $n=0) { + if ($this->encrypted) { + if ($n <= 0) { + // default to current object + $n = $this->n; + } + $s = $this->_RC4($this->_objectkey($n), $s); + } + return "stream\n".$s."\nendstream"; + } + + /** + * Output a stream. + * @param string $s string to output. + * @param int $n object reference for encryption mode + * @access protected + */ + protected function _putstream($s, $n=0) { + $this->_out($this->_getstream($s, $n)); + } + + /** + * Output a string to the document. + * @param string $s string to output. + * @access protected + */ + protected function _out($s) { + if ($this->state == 2) { + if ((!$this->InFooter) AND isset($this->footerlen[$this->page]) AND ($this->footerlen[$this->page] > 0)) { + // puts data before page footer + $pagebuff = $this->getPageBuffer($this->page); + $page = substr($pagebuff, 0, -$this->footerlen[$this->page]); + $footer = substr($pagebuff, -$this->footerlen[$this->page]); + $this->setPageBuffer($this->page, $page.$s."\n".$footer); + // update footer position + $this->footerpos[$this->page] += strlen($s."\n"); + } else { + $this->setPageBuffer($this->page, $s."\n", true); + } + } else { + $this->setBuffer($s."\n"); + } + } + + /** + * Converts UTF-8 strings to codepoints array.<br> + * Invalid byte sequences will be replaced with 0xFFFD (replacement character)<br> + * Based on: http://www.faqs.org/rfcs/rfc3629.html + * <pre> + * Char. number range | UTF-8 octet sequence + * (hexadecimal) | (binary) + * --------------------+----------------------------------------------- + * 0000 0000-0000 007F | 0xxxxxxx + * 0000 0080-0000 07FF | 110xxxxx 10xxxxxx + * 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx + * 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + * --------------------------------------------------------------------- + * + * ABFN notation: + * --------------------------------------------------------------------- + * UTF8-octets = *( UTF8-char ) + * UTF8-char = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4 + * UTF8-1 = %x00-7F + * UTF8-2 = %xC2-DF UTF8-tail + * + * UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) / + * %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail ) + * UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) / + * %xF4 %x80-8F 2( UTF8-tail ) + * UTF8-tail = %x80-BF + * --------------------------------------------------------------------- + * </pre> + * @param string $str string to process. + * @return array containing codepoints (UTF-8 characters values) + * @access protected + * @author Nicola Asuni + * @since 1.53.0.TC005 (2005-01-05) + */ + protected function UTF8StringToArray($str) { + if (isset($this->cache_UTF8StringToArray['_'.$str])) { + // return cached value + return($this->cache_UTF8StringToArray['_'.$str]); + } + // check cache size + if ($this->cache_size_UTF8StringToArray >= $this->cache_maxsize_UTF8StringToArray) { + // remove first element + array_shift($this->cache_UTF8StringToArray); + } + ++$this->cache_size_UTF8StringToArray; + if (!$this->isunicode) { + // split string into array of equivalent codes + $strarr = array(); + $strlen = strlen($str); + for ($i=0; $i < $strlen; ++$i) { + $strarr[] = ord($str{$i}); + } + // insert new value on cache + $this->cache_UTF8StringToArray['_'.$str] = $strarr; + return $strarr; + } + $unicode = array(); // array containing unicode values + $bytes = array(); // array containing single character byte sequences + $numbytes = 1; // number of octetc needed to represent the UTF-8 character + $str .= ''; // force $str to be a string + $length = strlen($str); + for ($i = 0; $i < $length; ++$i) { + $char = ord($str{$i}); // get one string character at time + if (count($bytes) == 0) { // get starting octect + if ($char <= 0x7F) { + $unicode[] = $char; // use the character "as is" because is ASCII + $numbytes = 1; + } elseif (($char >> 0x05) == 0x06) { // 2 bytes character (0x06 = 110 BIN) + $bytes[] = ($char - 0xC0) << 0x06; + $numbytes = 2; + } elseif (($char >> 0x04) == 0x0E) { // 3 bytes character (0x0E = 1110 BIN) + $bytes[] = ($char - 0xE0) << 0x0C; + $numbytes = 3; + } elseif (($char >> 0x03) == 0x1E) { // 4 bytes character (0x1E = 11110 BIN) + $bytes[] = ($char - 0xF0) << 0x12; + $numbytes = 4; + } else { + // use replacement character for other invalid sequences + $unicode[] = 0xFFFD; + $bytes = array(); + $numbytes = 1; + } + } elseif (($char >> 0x06) == 0x02) { // bytes 2, 3 and 4 must start with 0x02 = 10 BIN + $bytes[] = $char - 0x80; + if (count($bytes) == $numbytes) { + // compose UTF-8 bytes to a single unicode value + $char = $bytes[0]; + for ($j = 1; $j < $numbytes; ++$j) { + $char += ($bytes[$j] << (($numbytes - $j - 1) * 0x06)); + } + if ((($char >= 0xD800) AND ($char <= 0xDFFF)) OR ($char >= 0x10FFFF)) { + /* The definition of UTF-8 prohibits encoding character numbers between + U+D800 and U+DFFF, which are reserved for use with the UTF-16 + encoding form (as surrogate pairs) and do not directly represent + characters. */ + $unicode[] = 0xFFFD; // use replacement character + } else { + $unicode[] = $char; // add char to array + } + // reset data for next char + $bytes = array(); + $numbytes = 1; + } + } else { + // use replacement character for other invalid sequences + $unicode[] = 0xFFFD; + $bytes = array(); + $numbytes = 1; + } + } + // insert new value on cache + $this->cache_UTF8StringToArray['_'.$str] = $unicode; + return $unicode; + } + + /** + * Converts UTF-8 strings to UTF16-BE.<br> + * @param string $str string to process. + * @param boolean $setbom if true set the Byte Order Mark (BOM = 0xFEFF) + * @return string + * @access protected + * @author Nicola Asuni + * @since 1.53.0.TC005 (2005-01-05) + * @uses UTF8StringToArray(), arrUTF8ToUTF16BE() + */ + protected function UTF8ToUTF16BE($str, $setbom=true) { + if (!$this->isunicode) { + return $str; // string is not in unicode + } + $unicode = $this->UTF8StringToArray($str); // array containing UTF-8 unicode values + return $this->arrUTF8ToUTF16BE($unicode, $setbom); + } + + /** + * Converts UTF-8 strings to Latin1 when using the standard 14 core fonts.<br> + * @param string $str string to process. + * @return string + * @author Andrew Whitehead, Nicola Asuni + * @access protected + * @since 3.2.000 (2008-06-23) + */ + protected function UTF8ToLatin1($str) { + global $utf8tolatin; + if (!$this->isunicode) { + return $str; // string is not in unicode + } + $outstr = ''; // string to be returned + $unicode = $this->UTF8StringToArray($str); // array containing UTF-8 unicode values + foreach ($unicode as $char) { + if ($char < 256) { + $outstr .= chr($char); + } elseif (array_key_exists($char, $utf8tolatin)) { + // map from UTF-8 + $outstr .= chr($utf8tolatin[$char]); + } elseif ($char == 0xFFFD) { + // skip + } else { + $outstr .= '?'; + } + } + return $outstr; + } + + /** + * Converts UTF-8 characters array to array of Latin1 characters<br> + * @param array $unicode array containing UTF-8 unicode values + * @return array + * @author Nicola Asuni + * @access protected + * @since 4.8.023 (2010-01-15) + */ + protected function UTF8ArrToLatin1($unicode) { + global $utf8tolatin; + if ((!$this->isunicode) OR ($this->CurrentFont['type'] == 'TrueTypeUnicode') OR ($this->CurrentFont['type'] == 'cidfont0')) { + return $unicode; // string is not in unicode + } + $outarr = array(); // array to be returned + foreach ($unicode as $char) { + if ($char < 256) { + $outarr[] = $char; + } elseif (array_key_exists($char, $utf8tolatin)) { + // map from UTF-8 + $outarr[] = $utf8tolatin[$char]; + } elseif ($char == 0xFFFD) { + // skip + } else { + $outarr[] = 63; // '?' character + } + } + return $outarr; + } + + /** + * Converts array of UTF-8 characters to UTF16-BE string.<br> + * Based on: http://www.faqs.org/rfcs/rfc2781.html + * <pre> + * Encoding UTF-16: + * + * Encoding of a single character from an ISO 10646 character value to + * UTF-16 proceeds as follows. Let U be the character number, no greater + * than 0x10FFFF. + * + * 1) If U < 0x10000, encode U as a 16-bit unsigned integer and + * terminate. + * + * 2) Let U' = U - 0x10000. Because U is less than or equal to 0x10FFFF, + * U' must be less than or equal to 0xFFFFF. That is, U' can be + * represented in 20 bits. + * + * 3) Initialize two 16-bit unsigned integers, W1 and W2, to 0xD800 and + * 0xDC00, respectively. These integers each have 10 bits free to + * encode the character value, for a total of 20 bits. + * + * 4) Assign the 10 high-order bits of the 20-bit U' to the 10 low-order + * bits of W1 and the 10 low-order bits of U' to the 10 low-order + * bits of W2. Terminate. + * + * Graphically, steps 2 through 4 look like: + * U' = yyyyyyyyyyxxxxxxxxxx + * W1 = 110110yyyyyyyyyy + * W2 = 110111xxxxxxxxxx + * </pre> + * @param array $unicode array containing UTF-8 unicode values + * @param boolean $setbom if true set the Byte Order Mark (BOM = 0xFEFF) + * @return string + * @access protected + * @author Nicola Asuni + * @since 2.1.000 (2008-01-08) + * @see UTF8ToUTF16BE() + */ + protected function arrUTF8ToUTF16BE($unicode, $setbom=true) { + $outstr = ''; // string to be returned + if ($setbom) { + $outstr .= "\xFE\xFF"; // Byte Order Mark (BOM) + } + foreach ($unicode as $char) { + if ($char == 0xFFFD) { + $outstr .= "\xFF\xFD"; // replacement character + } elseif ($char < 0x10000) { + $outstr .= chr($char >> 0x08); + $outstr .= chr($char & 0xFF); + } else { + $char -= 0x10000; + $w1 = 0xD800 | ($char >> 0x10); + $w2 = 0xDC00 | ($char & 0x3FF); + $outstr .= chr($w1 >> 0x08); + $outstr .= chr($w1 & 0xFF); + $outstr .= chr($w2 >> 0x08); + $outstr .= chr($w2 & 0xFF); + } + } + return $outstr; + } + // ==================================================== + + /** + * Set header font. + * @param array $font font + * @access public + * @since 1.1 + */ + public function setHeaderFont($font) { + $this->header_font = $font; + } + + /** + * Get header font. + * @return array() + * @access public + * @since 4.0.012 (2008-07-24) + */ + public function getHeaderFont() { + return $this->header_font; + } + + /** + * Set footer font. + * @param array $font font + * @access public + * @since 1.1 + */ + public function setFooterFont($font) { + $this->footer_font = $font; + } + + /** + * Get Footer font. + * @return array() + * @access public + * @since 4.0.012 (2008-07-24) + */ + public function getFooterFont() { + return $this->footer_font; + } + + /** + * Set language array. + * @param array $language + * @access public + * @since 1.1 + */ + public function setLanguageArray($language) { + $this->l = $language; + if (isset($this->l['a_meta_dir'])) { + $this->rtl = $this->l['a_meta_dir']=='rtl' ? true : false; + } else { + $this->rtl = false; + } + } + + /** + * Returns the PDF data. + * @access public + */ + public function getPDFData() { + if ($this->state < 3) { + $this->Close(); + } + return $this->buffer; + } + + /** + * Output anchor link. + * @param string $url link URL or internal link (i.e.: &lt;a href="#23"&gt;link to page 23&lt;/a&gt;) + * @param string $name link name + * @param int $fill Indicates if the cell background must be painted (1) or transparent (0). Default value: 0. + * @param boolean $firstline if true prints only the first line and return the remaining string. + * @param array $color array of RGB text color + * @param string $style font style (U, D, B, I) + * @param boolean $firstblock if true the string is the starting of a line. + * @return the number of cells used or the remaining text if $firstline = true; + * @access public + */ + public function addHtmlLink($url, $name, $fill=0, $firstline=false, $color='', $style=-1, $firstblock=false) { + if (!$this->empty_string($url) AND ($url{0} == '#')) { + // convert url to internal link + $page = intval(substr($url, 1)); + $url = $this->AddLink(); + $this->SetLink($url, 0, $page); + } + // store current settings + $prevcolor = $this->fgcolor; + $prevstyle = $this->FontStyle; + if (empty($color)) { + $this->SetTextColorArray($this->htmlLinkColorArray); + } else { + $this->SetTextColorArray($color); + } + if ($style == -1) { + $this->SetFont('', $this->FontStyle.$this->htmlLinkFontStyle); + } else { + $this->SetFont('', $this->FontStyle.$style); + } + $ret = $this->Write($this->lasth, $name, $url, $fill, '', false, 0, $firstline, $firstblock, 0); + // restore settings + $this->SetFont('', $prevstyle); + $this->SetTextColorArray($prevcolor); + return $ret; + } + + /** + * Returns an associative array (keys: R,G,B) from an html color name or a six-digit or three-digit hexadecimal color representation (i.e. #3FE5AA or #7FF). + * @param string $color html color + * @return array RGB color or false in case of error. + * @access public + */ + public function convertHTMLColorToDec($color='#FFFFFF') { + global $webcolor; + $returncolor = false; + $color = preg_replace('/[\s]*/', '', $color); // remove extra spaces + $color = strtolower($color); + if (($dotpos = strpos($color, '.')) !== false) { + // remove class parent (i.e.: color.red) + $color = substr($color, ($dotpos + 1)); + } + if (strlen($color) == 0) { + return false; + } + if (substr($color, 0, 3) == 'rgb') { + $codes = substr($color, 4); + $codes = str_replace(')', '', $codes); + $returncolor = explode(',', $codes, 3); + return $returncolor; + } + if (substr($color, 0, 1) != '#') { + // decode color name + if (isset($webcolor[$color])) { + $color_code = $webcolor[$color]; + } else { + return false; + } + } else { + $color_code = substr($color, 1); + } + switch (strlen($color_code)) { + case 3: { + // three-digit hexadecimal representation + $r = substr($color_code, 0, 1); + $g = substr($color_code, 1, 1); + $b = substr($color_code, 2, 1); + $returncolor['R'] = hexdec($r.$r); + $returncolor['G'] = hexdec($g.$g); + $returncolor['B'] = hexdec($b.$b); + break; + } + case 6: { + // six-digit hexadecimal representation + $returncolor['R'] = hexdec(substr($color_code, 0, 2)); + $returncolor['G'] = hexdec(substr($color_code, 2, 2)); + $returncolor['B'] = hexdec(substr($color_code, 4, 2)); + break; + } + } + return $returncolor; + } + + /** + * Converts pixels to User's Units. + * @param int $px pixels + * @return float value in user's unit + * @access public + * @see setImageScale(), getImageScale() + */ + public function pixelsToUnits($px) { + return ($px / ($this->imgscale * $this->k)); + } + + /** + * Reverse function for htmlentities. + * Convert entities in UTF-8. + * @param $text_to_convert Text to convert. + * @return string converted + * @access public + */ + public function unhtmlentities($text_to_convert) { + return html_entity_decode($text_to_convert, ENT_QUOTES, $this->encoding); + } + + // ENCRYPTION METHODS ---------------------------------- + // SINCE 2.0.000 (2008-01-02) + + /** + * Compute encryption key depending on object number where the encrypted data is stored + * @param int $n object number + * @access protected + * @since 2.0.000 (2008-01-02) + */ + protected function _objectkey($n) { + return substr($this->_md5_16($this->encryption_key.pack('VXxx', $n)), 0, 10); + } + + /** + * Put encryption on PDF document. + * @access protected + * @since 2.0.000 (2008-01-02) + */ + protected function _putencryption() { + if (!$this->encrypted) { + return; + } + $this->_newobj(); + $this->enc_obj_id = $this->n; + $out = '<< /Filter /Standard /V 1 /R 2'; + $out .= ' /O ('.$this->_escape($this->Ovalue).')'; + $out .= ' /U ('.$this->_escape($this->Uvalue).')'; + $out .= ' /P '.$this->Pvalue; + $out .= ' >> endobj'; + $this->_out($out); + } + + /** + * Returns the input text exrypted using RC4 algorithm and the specified key. + * RC4 is the standard encryption algorithm used in PDF format + * @param string $key encryption key + * @param String $text input text to be encrypted + * @return String encrypted text + * @access protected + * @since 2.0.000 (2008-01-02) + * @author Klemen Vodopivec + */ + protected function _RC4($key, $text) { + if ($this->last_rc4_key != $key) { + $k = str_repeat($key, ((256 / strlen($key)) + 1)); + $rc4 = range(0, 255); + $j = 0; + for ($i = 0; $i < 256; ++$i) { + $t = $rc4[$i]; + $j = ($j + $t + ord($k{$i})) % 256; + $rc4[$i] = $rc4[$j]; + $rc4[$j] = $t; + } + $this->last_rc4_key = $key; + $this->last_rc4_key_c = $rc4; + } else { + $rc4 = $this->last_rc4_key_c; + } + $len = strlen($text); + $a = 0; + $b = 0; + $out = ''; + for ($i = 0; $i < $len; ++$i) { + $a = ($a + 1) % 256; + $t = $rc4[$a]; + $b = ($b + $t) % 256; + $rc4[$a] = $rc4[$b]; + $rc4[$b] = $t; + $k = $rc4[($rc4[$a] + $rc4[$b]) % 256]; + $out .= chr(ord($text{$i}) ^ $k); + } + return $out; + } + + /** + * Encrypts a string using MD5 and returns it's value as a binary string. + * @param string $str input string + * @return String MD5 encrypted binary string + * @access protected + * @since 2.0.000 (2008-01-02) + * @author Klemen Vodopivec + */ + protected function _md5_16($str) { + return pack('H*', md5($str)); + } + + /** + * Compute O value (used for RC4 encryption) + * @param String $user_pass user password + * @param String $owner_pass user password + * @return String O value + * @access protected + * @since 2.0.000 (2008-01-02) + * @author Klemen Vodopivec + */ + protected function _Ovalue($user_pass, $owner_pass) { + $tmp = $this->_md5_16($owner_pass); + $owner_RC4_key = substr($tmp, 0, 5); + return $this->_RC4($owner_RC4_key, $user_pass); + } + + /** + * Compute U value (used for RC4 encryption) + * @return String U value + * @access protected + * @since 2.0.000 (2008-01-02) + * @author Klemen Vodopivec + */ + protected function _Uvalue() { + return $this->_RC4($this->encryption_key, $this->padding); + } + + /** + * Compute encryption key + * @param String $user_pass user password + * @param String $owner_pass user password + * @param String $protection protection type + * @access protected + * @since 2.0.000 (2008-01-02) + * @author Klemen Vodopivec + */ + protected function _generateencryptionkey($user_pass, $owner_pass, $protection) { + // Pad passwords + $user_pass = substr($user_pass.$this->padding, 0, 32); + $owner_pass = substr($owner_pass.$this->padding, 0, 32); + // Compute O value + $this->Ovalue = $this->_Ovalue($user_pass, $owner_pass); + // Compute encyption key + $tmp = $this->_md5_16($user_pass.$this->Ovalue.chr($protection)."\xFF\xFF\xFF"); + $this->encryption_key = substr($tmp, 0, 5); + // Compute U value + $this->Uvalue = $this->_Uvalue(); + // Compute P value + $this->Pvalue = -(($protection^255) + 1); + } + + /** + * Set document protection + * The permission array is composed of values taken from the following ones: + * - copy: copy text and images to the clipboard + * - print: print the document + * - modify: modify it (except for annotations and forms) + * - annot-forms: add annotations and forms + * Remark: the protection against modification is for people who have the full Acrobat product. + * If you don't set any password, the document will open as usual. If you set a user password, the PDF viewer will ask for it before displaying the document. The master password, if different from the user one, can be used to get full access. + * Note: protecting a document requires to encrypt it, which increases the processing time a lot. This can cause a PHP time-out in some cases, especially if the document contains images or fonts. + * @param Array $permissions the set of permissions. Empty by default (only viewing is allowed). (print, modify, copy, annot-forms) + * @param String $user_pass user password. Empty by default. + * @param String $owner_pass owner password. If not specified, a random value is used. + * @access public + * @since 2.0.000 (2008-01-02) + * @author Klemen Vodopivec + */ + public function SetProtection($permissions=array(), $user_pass='', $owner_pass=null) { + $options = array('print' => 4, 'modify' => 8, 'copy' => 16, 'annot-forms' => 32); + $protection = 192; + foreach ($permissions as $permission) { + if (!isset($options[$permission])) { + $this->Error('Incorrect permission: '.$permission); + } + $protection += $options[$permission]; + } + if ($owner_pass === null) { + $owner_pass = uniqid(rand()); + } + $this->encrypted = true; + $this->_generateencryptionkey($user_pass, $owner_pass, $protection); + } + + // END OF ENCRYPTION FUNCTIONS ------------------------- + + // START TRANSFORMATIONS SECTION ----------------------- + + /** + * Starts a 2D tranformation saving current graphic state. + * This function must be called before scaling, mirroring, translation, rotation and skewing. + * Use StartTransform() before, and StopTransform() after the transformations to restore the normal behavior. + * @access public + * @since 2.1.000 (2008-01-07) + * @see StartTransform(), StopTransform() + */ + public function StartTransform() { + $this->_out('q'); + $this->transfmrk[$this->page][] = $this->pagelen[$this->page]; + ++$this->transfmatrix_key; + $this->transfmatrix[$this->transfmatrix_key] = array(); + } + + /** + * Stops a 2D tranformation restoring previous graphic state. + * This function must be called after scaling, mirroring, translation, rotation and skewing. + * Use StartTransform() before, and StopTransform() after the transformations to restore the normal behavior. + * @access public + * @since 2.1.000 (2008-01-07) + * @see StartTransform(), StopTransform() + */ + public function StopTransform() { + $this->_out('Q'); + if (isset($this->transfmatrix[$this->transfmatrix_key])) { + array_pop($this->transfmatrix[$this->transfmatrix_key]); + --$this->transfmatrix_key; + } + array_pop($this->transfmrk[$this->page]); + } + /** + * Horizontal Scaling. + * @param float $s_x scaling factor for width as percent. 0 is not allowed. + * @param int $x abscissa of the scaling center. Default is current x position + * @param int $y ordinate of the scaling center. Default is current y position + * @access public + * @since 2.1.000 (2008-01-07) + * @see StartTransform(), StopTransform() + */ + public function ScaleX($s_x, $x='', $y='') { + $this->Scale($s_x, 100, $x, $y); + } + + /** + * Vertical Scaling. + * @param float $s_y scaling factor for height as percent. 0 is not allowed. + * @param int $x abscissa of the scaling center. Default is current x position + * @param int $y ordinate of the scaling center. Default is current y position + * @access public + * @since 2.1.000 (2008-01-07) + * @see StartTransform(), StopTransform() + */ + public function ScaleY($s_y, $x='', $y='') { + $this->Scale(100, $s_y, $x, $y); + } + + /** + * Vertical and horizontal proportional Scaling. + * @param float $s scaling factor for width and height as percent. 0 is not allowed. + * @param int $x abscissa of the scaling center. Default is current x position + * @param int $y ordinate of the scaling center. Default is current y position + * @access public + * @since 2.1.000 (2008-01-07) + * @see StartTransform(), StopTransform() + */ + public function ScaleXY($s, $x='', $y='') { + $this->Scale($s, $s, $x, $y); + } + + /** + * Vertical and horizontal non-proportional Scaling. + * @param float $s_x scaling factor for width as percent. 0 is not allowed. + * @param float $s_y scaling factor for height as percent. 0 is not allowed. + * @param int $x abscissa of the scaling center. Default is current x position + * @param int $y ordinate of the scaling center. Default is current y position + * @access public + * @since 2.1.000 (2008-01-07) + * @see StartTransform(), StopTransform() + */ + public function Scale($s_x, $s_y, $x='', $y='') { + if ($x === '') { + $x = $this->x; + } + if ($y === '') { + $y = $this->y; + } + if (($s_x == 0) OR ($s_y == 0)) { + $this->Error('Please do not use values equal to zero for scaling'); + } + $y = ($this->h - $y) * $this->k; + $x *= $this->k; + //calculate elements of transformation matrix + $s_x /= 100; + $s_y /= 100; + $tm[0] = $s_x; + $tm[1] = 0; + $tm[2] = 0; + $tm[3] = $s_y; + $tm[4] = $x * (1 - $s_x); + $tm[5] = $y * (1 - $s_y); + //scale the coordinate system + $this->Transform($tm); + } + + /** + * Horizontal Mirroring. + * @param int $x abscissa of the point. Default is current x position + * @access public + * @since 2.1.000 (2008-01-07) + * @see StartTransform(), StopTransform() + */ + public function MirrorH($x='') { + $this->Scale(-100, 100, $x); + } + + /** + * Verical Mirroring. + * @param int $y ordinate of the point. Default is current y position + * @access public + * @since 2.1.000 (2008-01-07) + * @see StartTransform(), StopTransform() + */ + public function MirrorV($y='') { + $this->Scale(100, -100, '', $y); + } + + /** + * Point reflection mirroring. + * @param int $x abscissa of the point. Default is current x position + * @param int $y ordinate of the point. Default is current y position + * @access public + * @since 2.1.000 (2008-01-07) + * @see StartTransform(), StopTransform() + */ + public function MirrorP($x='',$y='') { + $this->Scale(-100, -100, $x, $y); + } + + /** + * Reflection against a straight line through point (x, y) with the gradient angle (angle). + * @param float $angle gradient angle of the straight line. Default is 0 (horizontal line). + * @param int $x abscissa of the point. Default is current x position + * @param int $y ordinate of the point. Default is current y position + * @access public + * @since 2.1.000 (2008-01-07) + * @see StartTransform(), StopTransform() + */ + public function MirrorL($angle=0, $x='',$y='') { + $this->Scale(-100, 100, $x, $y); + $this->Rotate(-2*($angle-90), $x, $y); + } + + /** + * Translate graphic object horizontally. + * @param int $t_x movement to the right (or left for RTL) + * @access public + * @since 2.1.000 (2008-01-07) + * @see StartTransform(), StopTransform() + */ + public function TranslateX($t_x) { + $this->Translate($t_x, 0); + } + + /** + * Translate graphic object vertically. + * @param int $t_y movement to the bottom + * @access public + * @since 2.1.000 (2008-01-07) + * @see StartTransform(), StopTransform() + */ + public function TranslateY($t_y) { + $this->Translate(0, $t_y); + } + + /** + * Translate graphic object horizontally and vertically. + * @param int $t_x movement to the right + * @param int $t_y movement to the bottom + * @access public + * @since 2.1.000 (2008-01-07) + * @see StartTransform(), StopTransform() + */ + public function Translate($t_x, $t_y) { + //calculate elements of transformation matrix + $tm[0] = 1; + $tm[1] = 0; + $tm[2] = 0; + $tm[3] = 1; + $tm[4] = $t_x * $this->k; + $tm[5] = -$t_y * $this->k; + //translate the coordinate system + $this->Transform($tm); + } + + /** + * Rotate object. + * @param float $angle angle in degrees for counter-clockwise rotation + * @param int $x abscissa of the rotation center. Default is current x position + * @param int $y ordinate of the rotation center. Default is current y position + * @access public + * @since 2.1.000 (2008-01-07) + * @see StartTransform(), StopTransform() + */ + public function Rotate($angle, $x='', $y='') { + if ($x === '') { + $x = $this->x; + } + if ($y === '') { + $y = $this->y; + } + $y = ($this->h - $y) * $this->k; + $x *= $this->k; + //calculate elements of transformation matrix + $tm[0] = cos(deg2rad($angle)); + $tm[1] = sin(deg2rad($angle)); + $tm[2] = -$tm[1]; + $tm[3] = $tm[0]; + $tm[4] = $x + ($tm[1] * $y) - ($tm[0] * $x); + $tm[5] = $y - ($tm[0] * $y) - ($tm[1] * $x); + //rotate the coordinate system around ($x,$y) + $this->Transform($tm); + } + + /** + * Skew horizontally. + * @param float $angle_x angle in degrees between -90 (skew to the left) and 90 (skew to the right) + * @param int $x abscissa of the skewing center. default is current x position + * @param int $y ordinate of the skewing center. default is current y position + * @access public + * @since 2.1.000 (2008-01-07) + * @see StartTransform(), StopTransform() + */ + public function SkewX($angle_x, $x='', $y='') { + $this->Skew($angle_x, 0, $x, $y); + } + + /** + * Skew vertically. + * @param float $angle_y angle in degrees between -90 (skew to the bottom) and 90 (skew to the top) + * @param int $x abscissa of the skewing center. default is current x position + * @param int $y ordinate of the skewing center. default is current y position + * @access public + * @since 2.1.000 (2008-01-07) + * @see StartTransform(), StopTransform() + */ + public function SkewY($angle_y, $x='', $y='') { + $this->Skew(0, $angle_y, $x, $y); + } + + /** + * Skew. + * @param float $angle_x angle in degrees between -90 (skew to the left) and 90 (skew to the right) + * @param float $angle_y angle in degrees between -90 (skew to the bottom) and 90 (skew to the top) + * @param int $x abscissa of the skewing center. default is current x position + * @param int $y ordinate of the skewing center. default is current y position + * @access public + * @since 2.1.000 (2008-01-07) + * @see StartTransform(), StopTransform() + */ + public function Skew($angle_x, $angle_y, $x='', $y='') { + if ($x === '') { + $x = $this->x; + } + if ($y === '') { + $y = $this->y; + } + if (($angle_x <= -90) OR ($angle_x >= 90) OR ($angle_y <= -90) OR ($angle_y >= 90)) { + $this->Error('Please use values between -90 and +90 degrees for Skewing.'); + } + $x *= $this->k; + $y = ($this->h - $y) * $this->k; + //calculate elements of transformation matrix + $tm[0] = 1; + $tm[1] = tan(deg2rad($angle_y)); + $tm[2] = tan(deg2rad($angle_x)); + $tm[3] = 1; + $tm[4] = -$tm[2] * $y; + $tm[5] = -$tm[1] * $x; + //skew the coordinate system + $this->Transform($tm); + } + + /** + * Apply graphic transformations. + * @param array $tm transformation matrix + * @access protected + * @since 2.1.000 (2008-01-07) + * @see StartTransform(), StopTransform() + */ + protected function Transform($tm) { + $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F cm', $tm[0], $tm[1], $tm[2], $tm[3], $tm[4], $tm[5])); + // add tranformation matrix + $this->transfmatrix[$this->transfmatrix_key][] = array('a' => $tm[0], 'b' => $tm[1], 'c' => $tm[2], 'd' => $tm[3], 'e' => $tm[4], 'f' => $tm[5]); + // update tranformation mark + if (end($this->transfmrk[$this->page]) !== false) { + $key = key($this->transfmrk[$this->page]); + $this->transfmrk[$this->page][$key] = $this->pagelen[$this->page]; + } + } + + // END TRANSFORMATIONS SECTION ------------------------- + + + // START GRAPHIC FUNCTIONS SECTION --------------------- + // The following section is based on the code provided by David Hernandez Sanz + + /** + * Defines the line width. By default, the value equals 0.2 mm. The method can be called before the first page is created and the value is retained from page to page. + * @param float $width The width. + * @access public + * @since 1.0 + * @see Line(), Rect(), Cell(), MultiCell() + */ + public function SetLineWidth($width) { + //Set line width + $this->LineWidth = $width; + $this->linestyleWidth = sprintf('%.2F w', ($width * $this->k)); + if ($this->page > 0) { + $this->_out($this->linestyleWidth); + } + } + + /** + * Returns the current the line width. + * @return int Line width + * @access public + * @since 2.1.000 (2008-01-07) + * @see Line(), SetLineWidth() + */ + public function GetLineWidth() { + return $this->LineWidth; + } + + /** + * Set line style. + * @param array $style Line style. Array with keys among the following: + * <ul> + * <li>width (float): Width of the line in user units.</li> + * <li>cap (string): Type of cap to put on the line. Possible values are: + * butt, round, square. The difference between "square" and "butt" is that + * "square" projects a flat end past the end of the line.</li> + * <li>join (string): Type of join. Possible values are: miter, round, + * bevel.</li> + * <li>dash (mixed): Dash pattern. Is 0 (without dash) or string with + * series of length values, which are the lengths of the on and off dashes. + * For example: "2" represents 2 on, 2 off, 2 on, 2 off, ...; "2,1" is 2 on, + * 1 off, 2 on, 1 off, ...</li> + * <li>phase (integer): Modifier on the dash pattern which is used to shift + * the point at which the pattern starts.</li> + * <li>color (array): Draw color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K).</li> + * </ul> + * @access public + * @since 2.1.000 (2008-01-08) + */ + public function SetLineStyle($style) { + if (!is_array($style)) { + return; + } + extract($style); + if (isset($width)) { + $width_prev = $this->LineWidth; + $this->SetLineWidth($width); + $this->LineWidth = $width_prev; + } + if (isset($cap)) { + $ca = array('butt' => 0, 'round'=> 1, 'square' => 2); + if (isset($ca[$cap])) { + $this->linestyleCap = $ca[$cap].' J'; + $this->_out($this->linestyleCap); + } + } + if (isset($join)) { + $ja = array('miter' => 0, 'round' => 1, 'bevel' => 2); + if (isset($ja[$join])) { + $this->linestyleJoin = $ja[$join].' j'; + $this->_out($this->linestyleJoin); + } + } + if (isset($dash)) { + $dash_string = ''; + if ($dash) { + if (preg_match('/^.+,/', $dash) > 0) { + $tab = explode(',', $dash); + } else { + $tab = array($dash); + } + $dash_string = ''; + foreach ($tab as $i => $v) { + if ($i) { + $dash_string .= ' '; + } + $dash_string .= sprintf('%.2F', $v); + } + } + if (!isset($phase) OR !$dash) { + $phase = 0; + } + $this->linestyleDash = sprintf('[%s] %.2F d', $dash_string, $phase); + $this->_out($this->linestyleDash); + } + if (isset($color)) { + $this->SetDrawColorArray($color); + } + } + + /** + * Begin a new subpath by moving the current point to coordinates (x, y), omitting any connecting line segment. + * @param float $x Abscissa of point. + * @param float $y Ordinate of point. + * @access protected + * @since 2.1.000 (2008-01-08) + */ + protected function _outPoint($x, $y) { + $this->_out(sprintf('%.2F %.2F m', $x * $this->k, ($this->h - $y) * $this->k)); + } + + /** + * Append a straight line segment from the current point to the point (x, y). + * The new current point shall be (x, y). + * @param float $x Abscissa of end point. + * @param float $y Ordinate of end point. + * @access protected + * @since 2.1.000 (2008-01-08) + */ + protected function _outLine($x, $y) { + $this->_out(sprintf('%.2F %.2F l', $x * $this->k, ($this->h - $y) * $this->k)); + } + + /** + * Append a rectangle to the current path as a complete subpath, with lower-left corner (x, y) and dimensions widthand height in user space. + * @param float $x Abscissa of upper-left corner (or upper-right corner for RTL language). + * @param float $y Ordinate of upper-left corner (or upper-right corner for RTL language). + * @param float $w Width. + * @param float $h Height. + * @param string $op options + * @access protected + * @since 2.1.000 (2008-01-08) + */ + protected function _outRect($x, $y, $w, $h, $op) { + $this->_out(sprintf('%.2F %.2F %.2F %.2F re %s', $x * $this->k, ($this->h - $y) * $this->k, $w * $this->k, -$h * $this->k, $op)); + } + + /** + * Append a cubic Bzier curve to the current path. The curve shall extend from the current point to the point (x3, y3), using (x1, y1) and (x2, y2) as the Bzier control points. + * The new current point shall be (x3, y3). + * @param float $x1 Abscissa of control point 1. + * @param float $y1 Ordinate of control point 1. + * @param float $x2 Abscissa of control point 2. + * @param float $y2 Ordinate of control point 2. + * @param float $x3 Abscissa of end point. + * @param float $y3 Ordinate of end point. + * @access protected + * @since 2.1.000 (2008-01-08) + */ + protected function _outCurve($x1, $y1, $x2, $y2, $x3, $y3) { + $this->_out(sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c', $x1 * $this->k, ($this->h - $y1) * $this->k, $x2 * $this->k, ($this->h - $y2) * $this->k, $x3 * $this->k, ($this->h - $y3) * $this->k)); + } + + /** + * Append a cubic Bzier curve to the current path. The curve shall extend from the current point to the point (x3, y3), using the current point and (x2, y2) as the Bzier control points. + * The new current point shall be (x3, y3). + * @param float $x2 Abscissa of control point 2. + * @param float $y2 Ordinate of control point 2. + * @param float $x3 Abscissa of end point. + * @param float $y3 Ordinate of end point. + * @access protected + * @since 4.9.019 (2010-04-26) + */ + protected function _outCurveV($x2, $y2, $x3, $y3) { + $this->_out(sprintf('%.2F %.2F %.2F %.2F v', $x2 * $this->k, ($this->h - $y2) * $this->k, $x3 * $this->k, ($this->h - $y3) * $this->k)); + } + + /** + * Append a cubic Bzier curve to the current path. The curve shall extend from the current point to the point (x3, y3), using (x1, y1) and (x3, y3) as the Bzier control points. + * The new current point shall be (x3, y3). + * @param float $x1 Abscissa of control point 1. + * @param float $y1 Ordinate of control point 1. + * @param float $x2 Abscissa of control point 2. + * @param float $y2 Ordinate of control point 2. + * @param float $x3 Abscissa of end point. + * @param float $y3 Ordinate of end point. + * @access protected + * @since 2.1.000 (2008-01-08) + */ + protected function _outCurveY($x1, $y1, $x3, $y3) { + $this->_out(sprintf('%.2F %.2F %.2F %.2F y', $x1 * $this->k, ($this->h - $y1) * $this->k, $x3 * $this->k, ($this->h - $y3) * $this->k)); + } + + /** + * Draws a line between two points. + * @param float $x1 Abscissa of first point. + * @param float $y1 Ordinate of first point. + * @param float $x2 Abscissa of second point. + * @param float $y2 Ordinate of second point. + * @param array $style Line style. Array like for {@link SetLineStyle SetLineStyle}. Default value: default line style (empty array). + * @access public + * @since 1.0 + * @see SetLineWidth(), SetDrawColor(), SetLineStyle() + */ + public function Line($x1, $y1, $x2, $y2, $style=array()) { + if (is_array($style)) { + $this->SetLineStyle($style); + } + $this->_outPoint($x1, $y1); + $this->_outLine($x2, $y2); + $this->_out('S'); + } + + /** + * Draws a rectangle. + * @param float $x Abscissa of upper-left corner (or upper-right corner for RTL language). + * @param float $y Ordinate of upper-left corner (or upper-right corner for RTL language). + * @param float $w Width. + * @param float $h Height. + * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. + * @param array $border_style Border style of rectangle. Array with keys among the following: + * <ul> + * <li>all: Line style of all borders. Array like for {@link SetLineStyle SetLineStyle}.</li> + * <li>L, T, R, B or combinations: Line style of left, top, right or bottom border. Array like for {@link SetLineStyle SetLineStyle}.</li> + * </ul> + * If a key is not present or is null, not draws the border. Default value: default line style (empty array). + * @param array $border_style Border style of rectangle. Array like for {@link SetLineStyle SetLineStyle}. Default value: default line style (empty array). + * @param array $fill_color Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K). Default value: default color (empty array). + * @access public + * @since 1.0 + * @see SetLineStyle() + */ + public function Rect($x, $y, $w, $h, $style='', $border_style=array(), $fill_color=array()) { + if (!(false === strpos($style, 'F')) AND !empty($fill_color)) { + $this->SetFillColorArray($fill_color); + } + $op = $this->getPathPaintOperator($style); + if ((!$border_style) OR (isset($border_style['all']))) { + if (isset($border_style['all']) AND $border_style['all']) { + $this->SetLineStyle($border_style['all']); + $border_style = array(); + } + } + $this->_outRect($x, $y, $w, $h, $op); + + if ($border_style) { + $border_style2 = array(); + foreach ($border_style as $line => $value) { + $length = strlen($line); + for ($i = 0; $i < $length; ++$i) { + $border_style2[$line[$i]] = $value; + } + } + $border_style = $border_style2; + if (isset($border_style['L']) AND $border_style['L']) { + $this->Line($x, $y, $x, $y + $h, $border_style['L']); + } + if (isset($border_style['T']) AND $border_style['T']) { + $this->Line($x, $y, $x + $w, $y, $border_style['T']); + } + if (isset($border_style['R']) AND $border_style['R']) { + $this->Line($x + $w, $y, $x + $w, $y + $h, $border_style['R']); + } + if (isset($border_style['B']) AND $border_style['B']) { + $this->Line($x, $y + $h, $x + $w, $y + $h, $border_style['B']); + } + } + } + + /** + * Draws a Bezier curve. + * The Bezier curve is a tangent to the line between the control points at + * either end of the curve. + * @param float $x0 Abscissa of start point. + * @param float $y0 Ordinate of start point. + * @param float $x1 Abscissa of control point 1. + * @param float $y1 Ordinate of control point 1. + * @param float $x2 Abscissa of control point 2. + * @param float $y2 Ordinate of control point 2. + * @param float $x3 Abscissa of end point. + * @param float $y3 Ordinate of end point. + * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. + * @param array $line_style Line style of curve. Array like for {@link SetLineStyle SetLineStyle}. Default value: default line style (empty array). + * @param array $fill_color Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K). Default value: default color (empty array). + * @access public + * @see SetLineStyle() + * @since 2.1.000 (2008-01-08) + */ + public function Curve($x0, $y0, $x1, $y1, $x2, $y2, $x3, $y3, $style='', $line_style=array(), $fill_color=array()) { + if (!(false === strpos($style, 'F')) AND isset($fill_color)) { + $this->SetFillColorArray($fill_color); + } + $op = $this->getPathPaintOperator($style); + if ($line_style) { + $this->SetLineStyle($line_style); + } + $this->_outPoint($x0, $y0); + $this->_outCurve($x1, $y1, $x2, $y2, $x3, $y3); + $this->_out($op); + } + + /** + * Draws a poly-Bezier curve. + * Each Bezier curve segment is a tangent to the line between the control points at + * either end of the curve. + * @param float $x0 Abscissa of start point. + * @param float $y0 Ordinate of start point. + * @param float $segments An array of bezier descriptions. Format: array(x1, y1, x2, y2, x3, y3). + * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. + * @param array $line_style Line style of curve. Array like for {@link SetLineStyle SetLineStyle}. Default value: default line style (empty array). + * @param array $fill_color Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K). Default value: default color (empty array). + * @access public + * @see SetLineStyle() + * @since 3.0008 (2008-05-12) + */ + public function Polycurve($x0, $y0, $segments, $style='', $line_style=array(), $fill_color=array()) { + if (!(false === strpos($style, 'F')) AND isset($fill_color)) { + $this->SetFillColorArray($fill_color); + } + $op = $this->getPathPaintOperator($style); + if ($op == 'f') { + $line_style = array(); + } + if ($line_style) { + $this->SetLineStyle($line_style); + } + $this->_outPoint($x0, $y0); + foreach ($segments as $segment) { + list($x1, $y1, $x2, $y2, $x3, $y3) = $segment; + $this->_outCurve($x1, $y1, $x2, $y2, $x3, $y3); + } + $this->_out($op); + } + + /** + * Draws an ellipse. + * An ellipse is formed from n Bezier curves. + * @param float $x0 Abscissa of center point. + * @param float $y0 Ordinate of center point. + * @param float $rx Horizontal radius. + * @param float $ry Vertical radius (if ry = 0 then is a circle, see {@link Circle Circle}). Default value: 0. + * @param float $angle: Angle oriented (anti-clockwise). Default value: 0. + * @param float $astart: Angle start of draw line. Default value: 0. + * @param float $afinish: Angle finish of draw line. Default value: 360. + * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. + * @param array $line_style Line style of ellipse. Array like for {@link SetLineStyle SetLineStyle}. Default value: default line style (empty array). + * @param array $fill_color Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K). Default value: default color (empty array). + * @param integer $nc Number of curves used to draw a 90 degrees portion of ellipse. + * @author Nicola Asuni + * @access public + * @since 2.1.000 (2008-01-08) + */ + public function Ellipse($x0, $y0, $rx, $ry='', $angle=0, $astart=0, $afinish=360, $style='', $line_style=array(), $fill_color=array(), $nc=2) { + if ($this->empty_string($ry) OR ($ry == 0)) { + $ry = $rx; + } + if (!(false === strpos($style, 'F')) AND isset($fill_color)) { + $this->SetFillColorArray($fill_color); + } + $op = $this->getPathPaintOperator($style); + if ($op == 'f') { + $line_style = array(); + } + if ($line_style) { + $this->SetLineStyle($line_style); + } + $this->_outellipticalarc($x0, $y0, $rx, $ry, $angle, $astart, $afinish, false, $nc); + $this->_out($op); + } + + /** + * Append an elliptical arc to the current path. + * An ellipse is formed from n Bezier curves. + * @param float $xc Abscissa of center point. + * @param float $yc Ordinate of center point. + * @param float $rx Horizontal radius. + * @param float $ry Vertical radius (if ry = 0 then is a circle, see {@link Circle Circle}). Default value: 0. + * @param float $xang: Angle between the X-axis and the major axis of the ellipse. Default value: 0. + * @param float $angs: Angle start of draw line. Default value: 0. + * @param float $angf: Angle finish of draw line. Default value: 360. + * @param boolean $pie if true do not mark the border point (used to draw pie sectors). + * @param integer $nc Number of curves used to draw a 90 degrees portion of ellipse. + * @author Nicola Asuni + * @access protected + * @since 4.9.019 (2010-04-26) + */ + protected function _outellipticalarc($xc, $yc, $rx, $ry, $xang=0, $angs=0, $angf=360, $pie=false, $nc=2) { + $k = $this->k; + if ($nc < 2) { + $nc = 2; + } + if ($pie) { + // center of the arc + $this->_outPoint($xc, $yc); + } + $xang = deg2rad((float) $xang); + $angs = deg2rad((float) $angs); + $angf = deg2rad((float) $angf); + $as = atan2((sin($angs) / $ry), (cos($angs) / $rx)); + $af = atan2((sin($angf) / $ry), (cos($angf) / $rx)); + if ($as < 0) { + $as += (2 * M_PI); + } + if ($af < 0) { + $af += (2 * M_PI); + } + if ($as > $af) { + // reverse rotation go clockwise + $as -= (2 * M_PI); + } + $total_angle = ($af - $as); + if ($nc < 2) { + $nc = 2; + } + // total arcs to draw + $nc *= (2 * abs($total_angle) / M_PI); + $nc = round($nc) + 1; + // angle of each arc + $arcang = $total_angle / $nc; + // center point in PDF coordiantes + $x0 = $xc; + $y0 = ($this->h - $yc); + // starting angle + $ang = $as; + $alpha = sin($arcang) * ((sqrt(4 + (3 * pow(tan(($arcang) / 2), 2))) - 1) / 3); + $cos_xang = cos($xang); + $sin_xang = sin($xang); + $cos_ang = cos($ang); + $sin_ang = sin($ang); + // first arc point + $px1 = $x0 + ($rx * $cos_xang * $cos_ang) - ($ry * $sin_xang * $sin_ang); + $py1 = $y0 + ($rx * $sin_xang * $cos_ang) + ($ry * $cos_xang * $sin_ang); + // first Bezier control point + $qx1 = ($alpha * ((-$rx * $cos_xang * $sin_ang) - ($ry * $sin_xang * $cos_ang))); + $qy1 = ($alpha * ((-$rx * $sin_xang * $sin_ang) + ($ry * $cos_xang * $cos_ang))); + if ($pie) { + $this->_outLine($px1, $this->h - $py1); + } else { + $this->_outPoint($px1, $this->h - $py1); + } + // draw arcs + for ($i = 1; $i <= $nc; ++$i) { + // starting angle + $ang = $as + ($i * $arcang); + $cos_xang = cos($xang); + $sin_xang = sin($xang); + $cos_ang = cos($ang); + $sin_ang = sin($ang); + // second arc point + $px2 = $x0 + ($rx * $cos_xang * $cos_ang) - ($ry * $sin_xang * $sin_ang); + $py2 = $y0 + ($rx * $sin_xang * $cos_ang) + ($ry * $cos_xang * $sin_ang); + // second Bezier control point + $qx2 = ($alpha * ((-$rx * $cos_xang * $sin_ang) - ($ry * $sin_xang * $cos_ang))); + $qy2 = ($alpha * ((-$rx * $sin_xang * $sin_ang) + ($ry * $cos_xang * $cos_ang))); + // draw arc + $this->_outCurve(($px1 + $qx1), ($this->h - ($py1 + $qy1)), ($px2 - $qx2), ($this->h - ($py2 - $qy2)), $px2, ($this->h - $py2)); + // move to next point + $px1 = $px2; + $py1 = $py2; + $qx1 = $qx2; + $qy1 = $qy2; + } + if ($pie) { + $this->_outLine($xc, $yc); + } + } + + + /** + * Draws a circle. + * A circle is formed from n Bezier curves. + * @param float $x0 Abscissa of center point. + * @param float $y0 Ordinate of center point. + * @param float $r Radius. + * @param float $angstr: Angle start of draw line. Default value: 0. + * @param float $angend: Angle finish of draw line. Default value: 360. + * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. + * @param array $line_style Line style of circle. Array like for {@link SetLineStyle SetLineStyle}. Default value: default line style (empty array). + * @param array $fill_color Fill color. Format: array(red, green, blue). Default value: default color (empty array). + * @param integer $nc Number of curves used to draw a 90 degrees portion of circle. + * @access public + * @since 2.1.000 (2008-01-08) + */ + public function Circle($x0, $y0, $r, $angstr=0, $angend=360, $style='', $line_style=array(), $fill_color=array(), $nc=2) { + $this->Ellipse($x0, $y0, $r, $r, 0, $angstr, $angend, $style, $line_style, $fill_color, $nc); + } + + /** + * Draws a polygonal line + * @param array $p Points 0 to ($np - 1). Array with values (x0, y0, x1, y1,..., x(np-1), y(np - 1)) + * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. + * @param array $line_style Line style of polygon. Array with keys among the following: + * <ul> + * <li>all: Line style of all lines. Array like for {@link SetLineStyle SetLineStyle}.</li> + * <li>0 to ($np - 1): Line style of each line. Array like for {@link SetLineStyle SetLineStyle}.</li> + * </ul> + * If a key is not present or is null, not draws the line. Default value is default line style (empty array). + * @param array $fill_color Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K). Default value: default color (empty array). + * @param boolean $closed if true the polygon is closes, otherwise will remain open + * @access public + * @since 4.8.003 (2009-09-15) + */ + public function PolyLine($p, $style='', $line_style=array(), $fill_color=array()) { + $this->Polygon($p, $style, $line_style, $fill_color, false); + } + + /** + * Draws a polygon. + * @param array $p Points 0 to ($np - 1). Array with values (x0, y0, x1, y1,..., x(np-1), y(np - 1)) + * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. + * @param array $line_style Line style of polygon. Array with keys among the following: + * <ul> + * <li>all: Line style of all lines. Array like for {@link SetLineStyle SetLineStyle}.</li> + * <li>0 to ($np - 1): Line style of each line. Array like for {@link SetLineStyle SetLineStyle}.</li> + * </ul> + * If a key is not present or is null, not draws the line. Default value is default line style (empty array). + * @param array $fill_color Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K). Default value: default color (empty array). + * @param boolean $closed if true the polygon is closes, otherwise will remain open + * @access public + * @since 2.1.000 (2008-01-08) + */ + public function Polygon($p, $style='', $line_style=array(), $fill_color=array(), $closed=true) { + $nc = count($p); // number of coordinates + $np = $nc / 2; // number of points + if ($closed) { + // close polygon by adding the first 2 points at the end (one line) + for ($i = 0; $i < 4; ++$i) { + $p[$nc + $i] = $p[$i]; + } + // copy style for the last added line + if (isset($line_style[0])) { + $line_style[$np] = $line_style[0]; + } + $nc += 4; + } + if (!(false === strpos($style, 'F')) AND isset($fill_color)) { + $this->SetFillColorArray($fill_color); + } + $op = $this->getPathPaintOperator($style); + if ($op == 'f') { + $line_style = array(); + } + $draw = true; + if ($line_style) { + if (isset($line_style['all'])) { + $this->SetLineStyle($line_style['all']); + } else { + $draw = false; + if ($op == 'B') { + // draw fill + $op = 'f'; + $this->_outPoint($p[0], $p[1]); + for ($i = 2; $i < $nc; $i = $i + 2) { + $this->_outLine($p[$i], $p[$i + 1]); + } + $this->_out($op); + } + // draw outline + $this->_outPoint($p[0], $p[1]); + for ($i = 2; $i < $nc; $i = $i + 2) { + $line_num = ($i / 2) - 1; + if (isset($line_style[$line_num])) { + if ($line_style[$line_num] != 0) { + if (is_array($line_style[$line_num])) { + $this->_out('S'); + $this->SetLineStyle($line_style[$line_num]); + $this->_outPoint($p[$i - 2], $p[$i - 1]); + $this->_outLine($p[$i], $p[$i + 1]); + $this->_out('S'); + $this->_outPoint($p[$i], $p[$i + 1]); + } else { + $this->_outLine($p[$i], $p[$i + 1]); + } + } + } else { + $this->_outLine($p[$i], $p[$i + 1]); + } + } + $this->_out($op); + } + } + if ($draw) { + $this->_outPoint($p[0], $p[1]); + for ($i = 2; $i < $nc; $i = $i + 2) { + $this->_outLine($p[$i], $p[$i + 1]); + } + $this->_out($op); + } + } + + /** + * Draws a regular polygon. + * @param float $x0 Abscissa of center point. + * @param float $y0 Ordinate of center point. + * @param float $r: Radius of inscribed circle. + * @param integer $ns Number of sides. + * @param float $angle Angle oriented (anti-clockwise). Default value: 0. + * @param boolean $draw_circle Draw inscribed circle or not. Default value: false. + * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. + * @param array $line_style Line style of polygon sides. Array with keys among the following: + * <ul> + * <li>all: Line style of all sides. Array like for {@link SetLineStyle SetLineStyle}.</li> + * <li>0 to ($ns - 1): Line style of each side. Array like for {@link SetLineStyle SetLineStyle}.</li> + * </ul> + * If a key is not present or is null, not draws the side. Default value is default line style (empty array). + * @param array $fill_color Fill color. Format: array(red, green, blue). Default value: default color (empty array). + * @param string $circle_style Style of rendering of inscribed circle (if draws). Possible values are: + * <ul> + * <li>D or empty string: Draw (default).</li> + * <li>F: Fill.</li> + * <li>DF or FD: Draw and fill.</li> + * <li>CNZ: Clipping mode (using the even-odd rule to determine which regions lie inside the clipping path).</li> + * <li>CEO: Clipping mode (using the nonzero winding number rule to determine which regions lie inside the clipping path).</li> + * </ul> + * @param array $circle_outLine_style Line style of inscribed circle (if draws). Array like for {@link SetLineStyle SetLineStyle}. Default value: default line style (empty array). + * @param array $circle_fill_color Fill color of inscribed circle (if draws). Format: array(red, green, blue). Default value: default color (empty array). + * @access public + * @since 2.1.000 (2008-01-08) + */ + public function RegularPolygon($x0, $y0, $r, $ns, $angle=0, $draw_circle=false, $style='', $line_style=array(), $fill_color=array(), $circle_style='', $circle_outLine_style=array(), $circle_fill_color=array()) { + if (3 > $ns) { + $ns = 3; + } + if ($draw_circle) { + $this->Circle($x0, $y0, $r, 0, 360, $circle_style, $circle_outLine_style, $circle_fill_color); + } + $p = array(); + for ($i = 0; $i < $ns; ++$i) { + $a = $angle + ($i * 360 / $ns); + $a_rad = deg2rad((float) $a); + $p[] = $x0 + ($r * sin($a_rad)); + $p[] = $y0 + ($r * cos($a_rad)); + } + $this->Polygon($p, $style, $line_style, $fill_color); + } + + /** + * Draws a star polygon + * @param float $x0 Abscissa of center point. + * @param float $y0 Ordinate of center point. + * @param float $r Radius of inscribed circle. + * @param integer $nv Number of vertices. + * @param integer $ng Number of gap (if ($ng % $nv = 1) then is a regular polygon). + * @param float $angle: Angle oriented (anti-clockwise). Default value: 0. + * @param boolean $draw_circle: Draw inscribed circle or not. Default value is false. + * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. + * @param array $line_style Line style of polygon sides. Array with keys among the following: + * <ul> + * <li>all: Line style of all sides. Array like for + * {@link SetLineStyle SetLineStyle}.</li> + * <li>0 to (n - 1): Line style of each side. Array like for {@link SetLineStyle SetLineStyle}.</li> + * </ul> + * If a key is not present or is null, not draws the side. Default value is default line style (empty array). + * @param array $fill_color Fill color. Format: array(red, green, blue). Default value: default color (empty array). + * @param string $circle_style Style of rendering of inscribed circle (if draws). Possible values are: + * <ul> + * <li>D or empty string: Draw (default).</li> + * <li>F: Fill.</li> + * <li>DF or FD: Draw and fill.</li> + * <li>CNZ: Clipping mode (using the even-odd rule to determine which regions lie inside the clipping path).</li> + * <li>CEO: Clipping mode (using the nonzero winding number rule to determine which regions lie inside the clipping path).</li> + * </ul> + * @param array $circle_outLine_style Line style of inscribed circle (if draws). Array like for {@link SetLineStyle SetLineStyle}. Default value: default line style (empty array). + * @param array $circle_fill_color Fill color of inscribed circle (if draws). Format: array(red, green, blue). Default value: default color (empty array). + * @access public + * @since 2.1.000 (2008-01-08) + */ + public function StarPolygon($x0, $y0, $r, $nv, $ng, $angle=0, $draw_circle=false, $style='', $line_style=array(), $fill_color=array(), $circle_style='', $circle_outLine_style=array(), $circle_fill_color=array()) { + if ($nv < 2) { + $nv = 2; + } + if ($draw_circle) { + $this->Circle($x0, $y0, $r, 0, 360, $circle_style, $circle_outLine_style, $circle_fill_color); + } + $p2 = array(); + $visited = array(); + for ($i = 0; $i < $nv; ++$i) { + $a = $angle + ($i * 360 / $nv); + $a_rad = deg2rad((float) $a); + $p2[] = $x0 + ($r * sin($a_rad)); + $p2[] = $y0 + ($r * cos($a_rad)); + $visited[] = false; + } + $p = array(); + $i = 0; + do { + $p[] = $p2[$i * 2]; + $p[] = $p2[($i * 2) + 1]; + $visited[$i] = true; + $i += $ng; + $i %= $nv; + } while (!$visited[$i]); + $this->Polygon($p, $style, $line_style, $fill_color); + } + + /** + * Draws a rounded rectangle. + * @param float $x Abscissa of upper-left corner. + * @param float $y Ordinate of upper-left corner. + * @param float $w Width. + * @param float $h Height. + * @param float $r the radius of the circle used to round off the corners of the rectangle. + * @param string $round_corner Draws rounded corner or not. String with a 0 (not rounded i-corner) or 1 (rounded i-corner) in i-position. Positions are, in order and begin to 0: top left, top right, bottom right and bottom left. Default value: all rounded corner ("1111"). + * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. + * @param array $border_style Border style of rectangle. Array like for {@link SetLineStyle SetLineStyle}. Default value: default line style (empty array). + * @param array $fill_color Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K). Default value: default color (empty array). + * @access public + * @since 2.1.000 (2008-01-08) + */ + public function RoundedRect($x, $y, $w, $h, $r, $round_corner='1111', $style='', $border_style=array(), $fill_color=array()) { + $this->RoundedRectXY($x, $y, $w, $h, $r, $r, $round_corner, $style, $border_style, $fill_color); + } + + /** + * Draws a rounded rectangle. + * @param float $x Abscissa of upper-left corner. + * @param float $y Ordinate of upper-left corner. + * @param float $w Width. + * @param float $h Height. + * @param float $rx the x-axis radius of the ellipse used to round off the corners of the rectangle. + * @param float $ry the y-axis radius of the ellipse used to round off the corners of the rectangle. + * @param string $round_corner Draws rounded corner or not. String with a 0 (not rounded i-corner) or 1 (rounded i-corner) in i-position. Positions are, in order and begin to 0: top left, top right, bottom right and bottom left. Default value: all rounded corner ("1111"). + * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. + * @param array $border_style Border style of rectangle. Array like for {@link SetLineStyle SetLineStyle}. Default value: default line style (empty array). + * @param array $fill_color Fill color. Format: array(GREY) or array(R,G,B) or array(C,M,Y,K). Default value: default color (empty array). + * @access public + * @since 4.9.019 (2010-04-22) + */ + public function RoundedRectXY($x, $y, $w, $h, $rx, $ry, $round_corner='1111', $style='', $border_style=array(), $fill_color=array()) { + if (($round_corner == '0000') OR (($rx == $ry) AND ($rx == 0))) { + // Not rounded + $this->Rect($x, $y, $w, $h, $style, $border_style, $fill_color); + return; + } + // Rounded + if (!(false === strpos($style, 'F')) AND isset($fill_color)) { + $this->SetFillColorArray($fill_color); + } + $op = $this->getPathPaintOperator($style); + if ($op == 'f') { + $border_style = array(); + } + if ($border_style) { + $this->SetLineStyle($border_style); + } + $MyArc = 4 / 3 * (sqrt(2) - 1); + $this->_outPoint($x + $rx, $y); + $xc = $x + $w - $rx; + $yc = $y + $ry; + $this->_outLine($xc, $y); + if ($round_corner[0]) { + $this->_outCurve($xc + ($rx * $MyArc), $yc - $ry, $xc + $rx, $yc - ($ry * $MyArc), $xc + $rx, $yc); + } else { + $this->_outLine($x + $w, $y); + } + $xc = $x + $w - $rx; + $yc = $y + $h - $ry; + $this->_outLine($x + $w, $yc); + if ($round_corner[1]) { + $this->_outCurve($xc + $rx, $yc + ($ry * $MyArc), $xc + ($rx * $MyArc), $yc + $ry, $xc, $yc + $ry); + } else { + $this->_outLine($x + $w, $y + $h); + } + $xc = $x + $rx; + $yc = $y + $h - $ry; + $this->_outLine($xc, $y + $h); + if ($round_corner[2]) { + $this->_outCurve($xc - ($rx * $MyArc), $yc + $ry, $xc - $rx, $yc + ($ry * $MyArc), $xc - $rx, $yc); + } else { + $this->_outLine($x, $y + $h); + } + $xc = $x + $rx; + $yc = $y + $ry; + $this->_outLine($x, $yc); + if ($round_corner[3]) { + $this->_outCurve($xc - $rx, $yc - ($ry * $MyArc), $xc - ($rx * $MyArc), $yc - $ry, $xc, $yc - $ry); + } else { + $this->_outLine($x, $y); + $this->_outLine($x + $rx, $y); + } + $this->_out($op); + } + + /** + * Draws a grahic arrow. + * @parameter float $x0 Abscissa of first point. + * @parameter float $y0 Ordinate of first point. + * @parameter float $x0 Abscissa of second point. + * @parameter float $y1 Ordinate of second point. + * @parameter int $head_style (0 = draw only arrowhead arms, 1 = draw closed arrowhead, but no fill, 2 = closed and filled arrowhead, 3 = filled arrowhead) + * @parameter float $arm_size length of arrowhead arms + * @parameter int $arm_angle angle between an arm and the shaft + * @author Piotr Galecki, Nicola Asuni, Andy Meier + * @since 4.6.018 (2009-07-10) + */ + public function Arrow($x0, $y0, $x1, $y1, $head_style=0, $arm_size=5, $arm_angle=15) { + // getting arrow direction angle + // 0 deg angle is when both arms go along X axis. angle grows clockwise. + $dir_angle = atan2(($y0 - $y1), ($x0 - $x1)); + if ($dir_angle < 0) { + $dir_angle += (2 * M_PI); + } + $arm_angle = deg2rad($arm_angle); + $sx1 = $x1; + $sy1 = $y1; + if ($head_style > 0) { + // calculate the stopping point for the arrow shaft + $sx1 = $x1 + (($arm_size - $this->LineWidth) * cos($dir_angle)); + $sy1 = $y1 + (($arm_size - $this->LineWidth) * sin($dir_angle)); + } + // main arrow line / shaft + $this->Line($x0, $y0, $sx1, $sy1); + // left arrowhead arm tip + $x2L = $x1 + ($arm_size * cos($dir_angle + $arm_angle)); + $y2L = $y1 + ($arm_size * sin($dir_angle + $arm_angle)); + // right arrowhead arm tip + $x2R = $x1 + ($arm_size * cos($dir_angle - $arm_angle)); + $y2R = $y1 + ($arm_size * sin($dir_angle - $arm_angle)); + $mode = 'D'; + $style = array(); + switch ($head_style) { + case 0: { + // draw only arrowhead arms + $mode = 'D'; + $style = array(1, 1, 0); + break; + } + case 1: { + // draw closed arrowhead, but no fill + $mode = 'D'; + break; + } + case 2: { + // closed and filled arrowhead + $mode = 'DF'; + break; + } + case 3: { + // filled arrowhead + $mode = 'F'; + break; + } + } + $this->Polygon(array($x2L, $y2L, $x1, $y1, $x2R, $y2R), $mode, $style, array()); + } + + // END GRAPHIC FUNCTIONS SECTION ----------------------- + + // BIDIRECTIONAL TEXT SECTION -------------------------- + + /** + * Reverse the RLT substrings using the Bidirectional Algorithm (http://unicode.org/reports/tr9/). + * @param string $str string to manipulate. + * @param bool $setbom if true set the Byte Order Mark (BOM = 0xFEFF) + * @param bool $forcertl if true forces RTL text direction + * @return string + * @access protected + * @author Nicola Asuni + * @since 2.1.000 (2008-01-08) + */ + protected function utf8StrRev($str, $setbom=false, $forcertl=false) { + return $this->utf8StrArrRev($this->UTF8StringToArray($str), $str, $setbom, $forcertl); + } + + /** + * Reverse the RLT substrings array using the Bidirectional Algorithm (http://unicode.org/reports/tr9/). + * @param array $arr array of unicode values. + * @param string $str string to manipulate (or empty value). + * @param bool $setbom if true set the Byte Order Mark (BOM = 0xFEFF) + * @param bool $forcertl if true forces RTL text direction + * @return string + * @access protected + * @author Nicola Asuni + * @since 4.9.000 (2010-03-27) + */ + protected function utf8StrArrRev($arr, $str='', $setbom=false, $forcertl=false) { + return $this->arrUTF8ToUTF16BE($this->utf8Bidi($arr, $str, $forcertl), $setbom); + } + + /** + * Reverse the RLT substrings using the Bidirectional Algorithm (http://unicode.org/reports/tr9/). + * @param array $ta array of characters composing the string. + * @param string $str string to process + * @param bool $forcertl if 'R' forces RTL, if 'L' forces LTR + * @return array of unicode chars + * @author Nicola Asuni + * @access protected + * @since 2.4.000 (2008-03-06) + */ + protected function utf8Bidi($ta, $str='', $forcertl=false) { + global $unicode, $unicode_mirror, $unicode_arlet, $laa_array, $diacritics; + // paragraph embedding level + $pel = 0; + // max level + $maxlevel = 0; + if ($this->empty_string($str)) { + // create string from array + $str = $this->UTF8ArrSubString($ta); + } + // check if string contains arabic text + if (preg_match(K_RE_PATTERN_ARABIC, $str)) { + $arabic = true; + } else { + $arabic = false; + } + // check if string contains RTL text + if (!($forcertl OR $arabic OR preg_match(K_RE_PATTERN_RTL, $str))) { + return $ta; + } + + // get number of chars + $numchars = count($ta); + + if ($forcertl == 'R') { + $pel = 1; + } elseif ($forcertl == 'L') { + $pel = 0; + } else { + // P2. In each paragraph, find the first character of type L, AL, or R. + // P3. If a character is found in P2 and it is of type AL or R, then set the paragraph embedding level to one; otherwise, set it to zero. + for ($i=0; $i < $numchars; ++$i) { + $type = $unicode[$ta[$i]]; + if ($type == 'L') { + $pel = 0; + break; + } elseif (($type == 'AL') OR ($type == 'R')) { + $pel = 1; + break; + } + } + } + + // Current Embedding Level + $cel = $pel; + // directional override status + $dos = 'N'; + $remember = array(); + // start-of-level-run + $sor = $pel % 2 ? 'R' : 'L'; + $eor = $sor; + + // Array of characters data + $chardata = Array(); + + // X1. Begin by setting the current embedding level to the paragraph embedding level. Set the directional override status to neutral. Process each character iteratively, applying rules X2 through X9. Only embedding levels from 0 to 61 are valid in this phase. + // In the resolution of levels in rules I1 and I2, the maximum embedding level of 62 can be reached. + for ($i=0; $i < $numchars; ++$i) { + if ($ta[$i] == K_RLE) { + // X2. With each RLE, compute the least greater odd embedding level. + // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to neutral. + // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. + $next_level = $cel + ($cel % 2) + 1; + if ($next_level < 62) { + $remember[] = array('num' => K_RLE, 'cel' => $cel, 'dos' => $dos); + $cel = $next_level; + $dos = 'N'; + $sor = $eor; + $eor = $cel % 2 ? 'R' : 'L'; + } + } elseif ($ta[$i] == K_LRE) { + // X3. With each LRE, compute the least greater even embedding level. + // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to neutral. + // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. + $next_level = $cel + 2 - ($cel % 2); + if ( $next_level < 62 ) { + $remember[] = array('num' => K_LRE, 'cel' => $cel, 'dos' => $dos); + $cel = $next_level; + $dos = 'N'; + $sor = $eor; + $eor = $cel % 2 ? 'R' : 'L'; + } + } elseif ($ta[$i] == K_RLO) { + // X4. With each RLO, compute the least greater odd embedding level. + // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to right-to-left. + // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. + $next_level = $cel + ($cel % 2) + 1; + if ($next_level < 62) { + $remember[] = array('num' => K_RLO, 'cel' => $cel, 'dos' => $dos); + $cel = $next_level; + $dos = 'R'; + $sor = $eor; + $eor = $cel % 2 ? 'R' : 'L'; + } + } elseif ($ta[$i] == K_LRO) { + // X5. With each LRO, compute the least greater even embedding level. + // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to left-to-right. + // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status. + $next_level = $cel + 2 - ($cel % 2); + if ( $next_level < 62 ) { + $remember[] = array('num' => K_LRO, 'cel' => $cel, 'dos' => $dos); + $cel = $next_level; + $dos = 'L'; + $sor = $eor; + $eor = $cel % 2 ? 'R' : 'L'; + } + } elseif ($ta[$i] == K_PDF) { + // X7. With each PDF, determine the matching embedding or override code. If there was a valid matching code, restore (pop) the last remembered (pushed) embedding level and directional override. + if (count($remember)) { + $last = count($remember ) - 1; + if (($remember[$last]['num'] == K_RLE) OR + ($remember[$last]['num'] == K_LRE) OR + ($remember[$last]['num'] == K_RLO) OR + ($remember[$last]['num'] == K_LRO)) { + $match = array_pop($remember); + $cel = $match['cel']; + $dos = $match['dos']; + $sor = $eor; + $eor = ($cel > $match['cel'] ? $cel : $match['cel']) % 2 ? 'R' : 'L'; + } + } + } elseif (($ta[$i] != K_RLE) AND + ($ta[$i] != K_LRE) AND + ($ta[$i] != K_RLO) AND + ($ta[$i] != K_LRO) AND + ($ta[$i] != K_PDF)) { + // X6. For all types besides RLE, LRE, RLO, LRO, and PDF: + // a. Set the level of the current character to the current embedding level. + // b. Whenever the directional override status is not neutral, reset the current character type to the directional override status. + if ($dos != 'N') { + $chardir = $dos; + } else { + if (isset($unicode[$ta[$i]])) { + $chardir = $unicode[$ta[$i]]; + } else { + $chardir = 'L'; + } + } + // stores string characters and other information + $chardata[] = array('char' => $ta[$i], 'level' => $cel, 'type' => $chardir, 'sor' => $sor, 'eor' => $eor); + } + } // end for each char + + // X8. All explicit directional embeddings and overrides are completely terminated at the end of each paragraph. Paragraph separators are not included in the embedding. + // X9. Remove all RLE, LRE, RLO, LRO, PDF, and BN codes. + // X10. The remaining rules are applied to each run of characters at the same level. For each run, determine the start-of-level-run (sor) and end-of-level-run (eor) type, either L or R. This depends on the higher of the two levels on either side of the boundary (at the start or end of the paragraph, the level of the 'other' run is the base embedding level). If the higher level is odd, the type is R; otherwise, it is L. + + // 3.3.3 Resolving Weak Types + // Weak types are now resolved one level run at a time. At level run boundaries where the type of the character on the other side of the boundary is required, the type assigned to sor or eor is used. + // Nonspacing marks are now resolved based on the previous characters. + $numchars = count($chardata); + + // W1. Examine each nonspacing mark (NSM) in the level run, and change the type of the NSM to the type of the previous character. If the NSM is at the start of the level run, it will get the type of sor. + $prevlevel = -1; // track level changes + $levcount = 0; // counts consecutive chars at the same level + for ($i=0; $i < $numchars; ++$i) { + if ($chardata[$i]['type'] == 'NSM') { + if ($levcount) { + $chardata[$i]['type'] = $chardata[$i]['sor']; + } elseif ($i > 0) { + $chardata[$i]['type'] = $chardata[($i-1)]['type']; + } + } + if ($chardata[$i]['level'] != $prevlevel) { + $levcount = 0; + } else { + ++$levcount; + } + $prevlevel = $chardata[$i]['level']; + } + + // W2. Search backward from each instance of a European number until the first strong type (R, L, AL, or sor) is found. If an AL is found, change the type of the European number to Arabic number. + $prevlevel = -1; + $levcount = 0; + for ($i=0; $i < $numchars; ++$i) { + if ($chardata[$i]['char'] == 'EN') { + for ($j=$levcount; $j >= 0; $j--) { + if ($chardata[$j]['type'] == 'AL') { + $chardata[$i]['type'] = 'AN'; + } elseif (($chardata[$j]['type'] == 'L') OR ($chardata[$j]['type'] == 'R')) { + break; + } + } + } + if ($chardata[$i]['level'] != $prevlevel) { + $levcount = 0; + } else { + ++$levcount; + } + $prevlevel = $chardata[$i]['level']; + } + + // W3. Change all ALs to R. + for ($i=0; $i < $numchars; ++$i) { + if ($chardata[$i]['type'] == 'AL') { + $chardata[$i]['type'] = 'R'; + } + } + + // W4. A single European separator between two European numbers changes to a European number. A single common separator between two numbers of the same type changes to that type. + $prevlevel = -1; + $levcount = 0; + for ($i=0; $i < $numchars; ++$i) { + if (($levcount > 0) AND (($i+1) < $numchars) AND ($chardata[($i+1)]['level'] == $prevlevel)) { + if (($chardata[$i]['type'] == 'ES') AND ($chardata[($i-1)]['type'] == 'EN') AND ($chardata[($i+1)]['type'] == 'EN')) { + $chardata[$i]['type'] = 'EN'; + } elseif (($chardata[$i]['type'] == 'CS') AND ($chardata[($i-1)]['type'] == 'EN') AND ($chardata[($i+1)]['type'] == 'EN')) { + $chardata[$i]['type'] = 'EN'; + } elseif (($chardata[$i]['type'] == 'CS') AND ($chardata[($i-1)]['type'] == 'AN') AND ($chardata[($i+1)]['type'] == 'AN')) { + $chardata[$i]['type'] = 'AN'; + } + } + if ($chardata[$i]['level'] != $prevlevel) { + $levcount = 0; + } else { + ++$levcount; + } + $prevlevel = $chardata[$i]['level']; + } + + // W5. A sequence of European terminators adjacent to European numbers changes to all European numbers. + $prevlevel = -1; + $levcount = 0; + for ($i=0; $i < $numchars; ++$i) { + if ($chardata[$i]['type'] == 'ET') { + if (($levcount > 0) AND ($chardata[($i-1)]['type'] == 'EN')) { + $chardata[$i]['type'] = 'EN'; + } else { + $j = $i+1; + while (($j < $numchars) AND ($chardata[$j]['level'] == $prevlevel)) { + if ($chardata[$j]['type'] == 'EN') { + $chardata[$i]['type'] = 'EN'; + break; + } elseif ($chardata[$j]['type'] != 'ET') { + break; + } + ++$j; + } + } + } + if ($chardata[$i]['level'] != $prevlevel) { + $levcount = 0; + } else { + ++$levcount; + } + $prevlevel = $chardata[$i]['level']; + } + + // W6. Otherwise, separators and terminators change to Other Neutral. + $prevlevel = -1; + $levcount = 0; + for ($i=0; $i < $numchars; ++$i) { + if (($chardata[$i]['type'] == 'ET') OR ($chardata[$i]['type'] == 'ES') OR ($chardata[$i]['type'] == 'CS')) { + $chardata[$i]['type'] = 'ON'; + } + if ($chardata[$i]['level'] != $prevlevel) { + $levcount = 0; + } else { + ++$levcount; + } + $prevlevel = $chardata[$i]['level']; + } + + //W7. Search backward from each instance of a European number until the first strong type (R, L, or sor) is found. If an L is found, then change the type of the European number to L. + $prevlevel = -1; + $levcount = 0; + for ($i=0; $i < $numchars; ++$i) { + if ($chardata[$i]['char'] == 'EN') { + for ($j=$levcount; $j >= 0; $j--) { + if ($chardata[$j]['type'] == 'L') { + $chardata[$i]['type'] = 'L'; + } elseif ($chardata[$j]['type'] == 'R') { + break; + } + } + } + if ($chardata[$i]['level'] != $prevlevel) { + $levcount = 0; + } else { + ++$levcount; + } + $prevlevel = $chardata[$i]['level']; + } + + // N1. A sequence of neutrals takes the direction of the surrounding strong text if the text on both sides has the same direction. European and Arabic numbers act as if they were R in terms of their influence on neutrals. Start-of-level-run (sor) and end-of-level-run (eor) are used at level run boundaries. + $prevlevel = -1; + $levcount = 0; + for ($i=0; $i < $numchars; ++$i) { + if (($levcount > 0) AND (($i+1) < $numchars) AND ($chardata[($i+1)]['level'] == $prevlevel)) { + if (($chardata[$i]['type'] == 'N') AND ($chardata[($i-1)]['type'] == 'L') AND ($chardata[($i+1)]['type'] == 'L')) { + $chardata[$i]['type'] = 'L'; + } elseif (($chardata[$i]['type'] == 'N') AND + (($chardata[($i-1)]['type'] == 'R') OR ($chardata[($i-1)]['type'] == 'EN') OR ($chardata[($i-1)]['type'] == 'AN')) AND + (($chardata[($i+1)]['type'] == 'R') OR ($chardata[($i+1)]['type'] == 'EN') OR ($chardata[($i+1)]['type'] == 'AN'))) { + $chardata[$i]['type'] = 'R'; + } elseif ($chardata[$i]['type'] == 'N') { + // N2. Any remaining neutrals take the embedding direction + $chardata[$i]['type'] = $chardata[$i]['sor']; + } + } elseif (($levcount == 0) AND (($i+1) < $numchars) AND ($chardata[($i+1)]['level'] == $prevlevel)) { + // first char + if (($chardata[$i]['type'] == 'N') AND ($chardata[$i]['sor'] == 'L') AND ($chardata[($i+1)]['type'] == 'L')) { + $chardata[$i]['type'] = 'L'; + } elseif (($chardata[$i]['type'] == 'N') AND + (($chardata[$i]['sor'] == 'R') OR ($chardata[$i]['sor'] == 'EN') OR ($chardata[$i]['sor'] == 'AN')) AND + (($chardata[($i+1)]['type'] == 'R') OR ($chardata[($i+1)]['type'] == 'EN') OR ($chardata[($i+1)]['type'] == 'AN'))) { + $chardata[$i]['type'] = 'R'; + } elseif ($chardata[$i]['type'] == 'N') { + // N2. Any remaining neutrals take the embedding direction + $chardata[$i]['type'] = $chardata[$i]['sor']; + } + } elseif (($levcount > 0) AND ((($i+1) == $numchars) OR (($i+1) < $numchars) AND ($chardata[($i+1)]['level'] != $prevlevel))) { + //last char + if (($chardata[$i]['type'] == 'N') AND ($chardata[($i-1)]['type'] == 'L') AND ($chardata[$i]['eor'] == 'L')) { + $chardata[$i]['type'] = 'L'; + } elseif (($chardata[$i]['type'] == 'N') AND + (($chardata[($i-1)]['type'] == 'R') OR ($chardata[($i-1)]['type'] == 'EN') OR ($chardata[($i-1)]['type'] == 'AN')) AND + (($chardata[$i]['eor'] == 'R') OR ($chardata[$i]['eor'] == 'EN') OR ($chardata[$i]['eor'] == 'AN'))) { + $chardata[$i]['type'] = 'R'; + } elseif ($chardata[$i]['type'] == 'N') { + // N2. Any remaining neutrals take the embedding direction + $chardata[$i]['type'] = $chardata[$i]['sor']; + } + } elseif ($chardata[$i]['type'] == 'N') { + // N2. Any remaining neutrals take the embedding direction + $chardata[$i]['type'] = $chardata[$i]['sor']; + } + if ($chardata[$i]['level'] != $prevlevel) { + $levcount = 0; + } else { + ++$levcount; + } + $prevlevel = $chardata[$i]['level']; + } + + // I1. For all characters with an even (left-to-right) embedding direction, those of type R go up one level and those of type AN or EN go up two levels. + // I2. For all characters with an odd (right-to-left) embedding direction, those of type L, EN or AN go up one level. + for ($i=0; $i < $numchars; ++$i) { + $odd = $chardata[$i]['level'] % 2; + if ($odd) { + if (($chardata[$i]['type'] == 'L') OR ($chardata[$i]['type'] == 'AN') OR ($chardata[$i]['type'] == 'EN')) { + $chardata[$i]['level'] += 1; + } + } else { + if ($chardata[$i]['type'] == 'R') { + $chardata[$i]['level'] += 1; + } elseif (($chardata[$i]['type'] == 'AN') OR ($chardata[$i]['type'] == 'EN')) { + $chardata[$i]['level'] += 2; + } + } + $maxlevel = max($chardata[$i]['level'],$maxlevel); + } + + // L1. On each line, reset the embedding level of the following characters to the paragraph embedding level: + // 1. Segment separators, + // 2. Paragraph separators, + // 3. Any sequence of whitespace characters preceding a segment separator or paragraph separator, and + // 4. Any sequence of white space characters at the end of the line. + for ($i=0; $i < $numchars; ++$i) { + if (($chardata[$i]['type'] == 'B') OR ($chardata[$i]['type'] == 'S')) { + $chardata[$i]['level'] = $pel; + } elseif ($chardata[$i]['type'] == 'WS') { + $j = $i+1; + while ($j < $numchars) { + if ((($chardata[$j]['type'] == 'B') OR ($chardata[$j]['type'] == 'S')) OR + (($j == ($numchars-1)) AND ($chardata[$j]['type'] == 'WS'))) { + $chardata[$i]['level'] = $pel; + break; + } elseif ($chardata[$j]['type'] != 'WS') { + break; + } + ++$j; + } + } + } + + // Arabic Shaping + // Cursively connected scripts, such as Arabic or Syriac, require the selection of positional character shapes that depend on adjacent characters. Shaping is logically applied after the Bidirectional Algorithm is used and is limited to characters within the same directional run. + if ($arabic) { + $endedletter = array(1569,1570,1571,1572,1573,1575,1577,1583,1584,1585,1586,1608,1688); + $alfletter = array(1570,1571,1573,1575); + $chardata2 = $chardata; + $laaletter = false; + $charAL = array(); + $x = 0; + for ($i=0; $i < $numchars; ++$i) { + if (($unicode[$chardata[$i]['char']] == 'AL') OR ($chardata[$i]['char'] == 32) OR ($chardata[$i]['char'] == 8204)) { + $charAL[$x] = $chardata[$i]; + $charAL[$x]['i'] = $i; + $chardata[$i]['x'] = $x; + ++$x; + } + } + $numAL = $x; + for ($i=0; $i < $numchars; ++$i) { + $thischar = $chardata[$i]; + if ($i > 0) { + $prevchar = $chardata[($i-1)]; + } else { + $prevchar = false; + } + if (($i+1) < $numchars) { + $nextchar = $chardata[($i+1)]; + } else { + $nextchar = false; + } + if ($unicode[$thischar['char']] == 'AL') { + $x = $thischar['x']; + if ($x > 0) { + $prevchar = $charAL[($x-1)]; + } else { + $prevchar = false; + } + if (($x+1) < $numAL) { + $nextchar = $charAL[($x+1)]; + } else { + $nextchar = false; + } + // if laa letter + if (($prevchar !== false) AND ($prevchar['char'] == 1604) AND (in_array($thischar['char'], $alfletter))) { + $arabicarr = $laa_array; + $laaletter = true; + if ($x > 1) { + $prevchar = $charAL[($x-2)]; + } else { + $prevchar = false; + } + } else { + $arabicarr = $unicode_arlet; + $laaletter = false; + } + if (($prevchar !== false) AND ($nextchar !== false) AND + (($unicode[$prevchar['char']] == 'AL') OR ($unicode[$prevchar['char']] == 'NSM')) AND + (($unicode[$nextchar['char']] == 'AL') OR ($unicode[$nextchar['char']] == 'NSM')) AND + ($prevchar['type'] == $thischar['type']) AND + ($nextchar['type'] == $thischar['type']) AND + ($nextchar['char'] != 1567)) { + if (in_array($prevchar['char'], $endedletter)) { + if (isset($arabicarr[$thischar['char']][2])) { + // initial + $chardata2[$i]['char'] = $arabicarr[$thischar['char']][2]; + } + } else { + if (isset($arabicarr[$thischar['char']][3])) { + // medial + $chardata2[$i]['char'] = $arabicarr[$thischar['char']][3]; + } + } + } elseif (($nextchar !== false) AND + (($unicode[$nextchar['char']] == 'AL') OR ($unicode[$nextchar['char']] == 'NSM')) AND + ($nextchar['type'] == $thischar['type']) AND + ($nextchar['char'] != 1567)) { + if (isset($arabicarr[$chardata[$i]['char']][2])) { + // initial + $chardata2[$i]['char'] = $arabicarr[$thischar['char']][2]; + } + } elseif ((($prevchar !== false) AND + (($unicode[$prevchar['char']] == 'AL') OR ($unicode[$prevchar['char']] == 'NSM')) AND + ($prevchar['type'] == $thischar['type'])) OR + (($nextchar !== false) AND ($nextchar['char'] == 1567))) { + // final + if (($i > 1) AND ($thischar['char'] == 1607) AND + ($chardata[$i-1]['char'] == 1604) AND + ($chardata[$i-2]['char'] == 1604)) { + //Allah Word + // mark characters to delete with false + $chardata2[$i-2]['char'] = false; + $chardata2[$i-1]['char'] = false; + $chardata2[$i]['char'] = 65010; + } else { + if (($prevchar !== false) AND in_array($prevchar['char'], $endedletter)) { + if (isset($arabicarr[$thischar['char']][0])) { + // isolated + $chardata2[$i]['char'] = $arabicarr[$thischar['char']][0]; + } + } else { + if (isset($arabicarr[$thischar['char']][1])) { + // final + $chardata2[$i]['char'] = $arabicarr[$thischar['char']][1]; + } + } + } + } elseif (isset($arabicarr[$thischar['char']][0])) { + // isolated + $chardata2[$i]['char'] = $arabicarr[$thischar['char']][0]; + } + // if laa letter + if ($laaletter) { + // mark characters to delete with false + $chardata2[($charAL[($x-1)]['i'])]['char'] = false; + } + } // end if AL (Arabic Letter) + } // end for each char + /* + * Combining characters that can occur with Arabic Shadda (0651 HEX, 1617 DEC) are replaced. + * Putting the combining mark and shadda in the same glyph allows us to avoid the two marks overlapping each other in an illegible manner. + */ + $cw = &$this->CurrentFont['cw']; + for ($i = 0; $i < ($numchars-1); ++$i) { + if (($chardata2[$i]['char'] == 1617) AND (isset($diacritics[($chardata2[$i+1]['char'])]))) { + // check if the subtitution font is defined on current font + if (isset($cw[($diacritics[($chardata2[$i+1]['char'])])])) { + $chardata2[$i]['char'] = false; + $chardata2[$i+1]['char'] = $diacritics[($chardata2[$i+1]['char'])]; + } + } + } + // remove marked characters + foreach ($chardata2 as $key => $value) { + if ($value['char'] === false) { + unset($chardata2[$key]); + } + } + $chardata = array_values($chardata2); + $numchars = count($chardata); + unset($chardata2); + unset($arabicarr); + unset($laaletter); + unset($charAL); + } + + // L2. From the highest level found in the text to the lowest odd level on each line, including intermediate levels not actually present in the text, reverse any contiguous sequence of characters that are at that level or higher. + for ($j=$maxlevel; $j > 0; $j--) { + $ordarray = Array(); + $revarr = Array(); + $onlevel = false; + for ($i=0; $i < $numchars; ++$i) { + if ($chardata[$i]['level'] >= $j) { + $onlevel = true; + if (isset($unicode_mirror[$chardata[$i]['char']])) { + // L4. A character is depicted by a mirrored glyph if and only if (a) the resolved directionality of that character is R, and (b) the Bidi_Mirrored property value of that character is true. + $chardata[$i]['char'] = $unicode_mirror[$chardata[$i]['char']]; + } + $revarr[] = $chardata[$i]; + } else { + if ($onlevel) { + $revarr = array_reverse($revarr); + $ordarray = array_merge($ordarray, $revarr); + $revarr = Array(); + $onlevel = false; + } + $ordarray[] = $chardata[$i]; + } + } + if ($onlevel) { + $revarr = array_reverse($revarr); + $ordarray = array_merge($ordarray, $revarr); + } + $chardata = $ordarray; + } + + $ordarray = array(); + for ($i=0; $i < $numchars; ++$i) { + $ordarray[] = $chardata[$i]['char']; + } + + return $ordarray; + } + + // END OF BIDIRECTIONAL TEXT SECTION ------------------- + + /** + * Adds a bookmark. + * @param string $txt bookmark description. + * @param int $level bookmark level (minimum value is 0). + * @param float $y Ordinate of the boorkmark position (default = -1 = current position). + * @param int $page target page number (leave empty for current page). + * @access public + * @author Olivier Plathey, Nicola Asuni + * @since 2.1.002 (2008-02-12) + */ + public function Bookmark($txt, $level=0, $y=-1, $page='') { + if ($level < 0) { + $level = 0; + } + if (isset($this->outlines[0])) { + $lastoutline = end($this->outlines); + $maxlevel = $lastoutline['l'] + 1; + } else { + $maxlevel = 0; + } + if ($level > $maxlevel) { + $level = $maxlevel; + } + if ($y == -1) { + $y = $this->GetY(); + } + if (empty($page)) { + $page = $this->PageNo(); + } + $this->outlines[] = array('t' => $txt, 'l' => $level, 'y' => $y, 'p' => $page); + } + + /** + * Create a bookmark PDF string. + * @access protected + * @author Olivier Plathey, Nicola Asuni + * @since 2.1.002 (2008-02-12) + */ + protected function _putbookmarks() { + $nb = count($this->outlines); + if ($nb == 0) { + return; + } + // get sorting columns + $outline_p = array(); + $outline_y = array(); + foreach ($this->outlines as $key => $row) { + $outline_p[$key] = $row['p']; + $outline_k[$key] = $key; + } + // sort outlines by page and original position + array_multisort($outline_p, SORT_NUMERIC, SORT_ASC, $outline_k, SORT_NUMERIC, SORT_ASC, $this->outlines); + $lru = array(); + $level = 0; + foreach ($this->outlines as $i => $o) { + if ($o['l'] > 0) { + $parent = $lru[($o['l'] - 1)]; + //Set parent and last pointers + $this->outlines[$i]['parent'] = $parent; + $this->outlines[$parent]['last'] = $i; + if ($o['l'] > $level) { + //Level increasing: set first pointer + $this->outlines[$parent]['first'] = $i; + } + } else { + $this->outlines[$i]['parent'] = $nb; + } + if (($o['l'] <= $level) AND ($i > 0)) { + //Set prev and next pointers + $prev = $lru[$o['l']]; + $this->outlines[$prev]['next'] = $i; + $this->outlines[$i]['prev'] = $prev; + } + $lru[$o['l']] = $i; + $level = $o['l']; + } + //Outline items + $n = $this->n + 1; + foreach ($this->outlines as $i => $o) { + $this->_newobj(); + // covert HTML title to string + $nltags = '/<br[\s]?\/>|<\/(blockquote|dd|dl|div|dt|h1|h2|h3|h4|h5|h6|hr|li|ol|p|pre|ul|tcpdf|table|tr|td)>/si'; + $title = preg_replace($nltags, "\n", $o['t']); + $title = preg_replace("/[\r]+/si", '', $title); + $title = preg_replace("/[\n]+/si", "\n", $title); + $title = strip_tags(trim($title)); + $out = '<</Title '.$this->_textstring($title); + $out .= ' /Parent '.($n + $o['parent']).' 0 R'; + if (isset($o['prev'])) { + $out .= ' /Prev '.($n + $o['prev']).' 0 R'; + } + if (isset($o['next'])) { + $out .= ' /Next '.($n + $o['next']).' 0 R'; + } + if (isset($o['first'])) { + $out .= ' /First '.($n + $o['first']).' 0 R'; + } + if (isset($o['last'])) { + $out .= ' /Last '.($n + $o['last']).' 0 R'; + } + $out .= ' '.sprintf('/Dest [%d 0 R /XYZ 0 %.2F null]', (1 + (2 * $o['p'])), ($this->pagedim[$o['p']]['h'] - ($o['y'] * $this->k))); + $out .= ' /Count 0 >> endobj'; + $this->_out($out); + } + //Outline root + $this->_newobj(); + $this->OutlineRoot = $this->n; + $this->_out('<< /Type /Outlines /First '.$n.' 0 R /Last '.($n + $lru[0]).' 0 R >> endobj'); + } + + // --- JAVASCRIPT ------------------------------------------------------ + + /** + * Adds a javascript + * @param string $script Javascript code + * @access public + * @author Johannes Gntert, Nicola Asuni + * @since 2.1.002 (2008-02-12) + */ + public function IncludeJS($script) { + $this->javascript .= $script; + } + + /** + * Adds a javascript object and return object ID + * @param string $script Javascript code + * @param boolean $onload if true executes this object when opening the document + * @return int internal object ID + * @access public + * @author Nicola Asuni + * @since 4.8.000 (2009-09-07) + */ + public function addJavascriptObject($script, $onload=false) { + ++$this->js_obj_id; + $this->js_objects[$this->js_obj_id] = array('js' => $script, 'onload' => $onload); + return $this->js_obj_id; + } + + /** + * Create a javascript PDF string. + * @access protected + * @author Johannes Gntert, Nicola Asuni + * @since 2.1.002 (2008-02-12) + */ + protected function _putjavascript() { + if (empty($this->javascript) AND empty($this->js_objects)) { + return; + } + if (strpos($this->javascript, 'this.addField') > 0) { + if (!$this->ur) { + //$this->setUserRights(); + } + // the following two lines are used to avoid form fields duplication after saving + // The addField method only works on Acrobat Writer, unless the document is signed with Adobe private key (UR3) + $jsa = sprintf("ftcpdfdocsaved=this.addField('%s','%s',%d,[%.2F,%.2F,%.2F,%.2F]);", 'tcpdfdocsaved', 'text', 0, 0, 1, 0, 1); + $jsb = "getField('tcpdfdocsaved').value='saved';"; + $this->javascript = $jsa."\n".$this->javascript."\n".$jsb; + } + $this->n_js = $this->_newobj(); + $out = ' << /Names ['; + if (!empty($this->javascript)) { + $out .= ' (EmbeddedJS) '.($this->n + 1).' 0 R'; + } + if (!empty($this->js_objects)) { + foreach ($this->js_objects as $key => $val) { + if ($val['onload']) { + $out .= ' (JS'.$key.') '.$key.' 0 R'; + } + } + } + $out .= ' ] >> endobj'; + $this->_out($out); + // default Javascript object + if (!empty($this->javascript)) { + $this->_newobj(); + $out = '<< /S /JavaScript'; + $out .= ' /JS '.$this->_textstring($this->javascript); + $out .= ' >> endobj'; + $this->_out($out); + } + // additional Javascript objects + if (!empty($this->js_objects)) { + foreach ($this->js_objects as $key => $val) { + $this->offsets[$key] = $this->bufferlen; + $out = $key.' 0 obj'."\n".' << /S /JavaScript /JS '.$this->_textstring($val['js']).' >> endobj'; + $this->_out($out); + } + } + } + + /** + * Convert color to javascript color. + * @param string $color color name or #RRGGBB + * @access protected + * @author Denis Van Nuffelen, Nicola Asuni + * @since 2.1.002 (2008-02-12) + */ + protected function _JScolor($color) { + static $aColors = array('transparent', 'black', 'white', 'red', 'green', 'blue', 'cyan', 'magenta', 'yellow', 'dkGray', 'gray', 'ltGray'); + if (substr($color,0,1) == '#') { + return sprintf("['RGB',%.3F,%.3F,%.3F]", hexdec(substr($color,1,2))/255, hexdec(substr($color,3,2))/255, hexdec(substr($color,5,2))/255); + } + if (!in_array($color,$aColors)) { + $this->Error('Invalid color: '.$color); + } + return 'color.'.$color; + } + + /** + * Adds a javascript form field. + * @param string $type field type + * @param string $name field name + * @param int $x horizontal position + * @param int $y vertical position + * @param int $w width + * @param int $h height + * @param array $prop javascript field properties. Possible values are described on official Javascript for Acrobat API reference. + * @access protected + * @author Denis Van Nuffelen, Nicola Asuni + * @since 2.1.002 (2008-02-12) + */ + protected function _addfield($type, $name, $x, $y, $w, $h, $prop) { + if ($this->rtl) { + $x = $x - $w; + } + // the followind avoid fields duplication after saving the document + $this->javascript .= "if(getField('tcpdfdocsaved').value != 'saved') {"; + $k = $this->k; + $this->javascript .= sprintf("f".$name."=this.addField('%s','%s',%d,[%.2F,%.2F,%.2F,%.2F]);", $name, $type, $this->PageNo()-1, $x*$k, ($this->h-$y)*$k+1, ($x+$w)*$k, ($this->h-$y-$h)*$k+1)."\n"; + $this->javascript .= 'f'.$name.'.textSize='.$this->FontSizePt.";\n"; + while (list($key, $val) = each($prop)) { + if (strcmp(substr($key, -5), 'Color') == 0) { + $val = $this->_JScolor($val); + } else { + $val = "'".$val."'"; + } + $this->javascript .= 'f'.$name.'.'.$key.'='.$val.";\n"; + } + if ($this->rtl) { + $this->x -= $w; + } else { + $this->x += $w; + } + $this->javascript .= '}'; + } + + // --- FORM FIELDS ----------------------------------------------------- + + /** + * Convert JavaScript form fields properties array to Annotation Properties array. + * @param array $prop javascript field properties. Possible values are described on official Javascript for Acrobat API reference. + * @return array of annotation properties + * @access protected + * @author Nicola Asuni + * @since 4.8.000 (2009-09-06) + */ + protected function getAnnotOptFromJSProp($prop) { + if (isset($prop['aopt']) AND is_array($prop['aopt'])) { + // the annotation options area lready defined + return $prop['aopt']; + } + $opt = array(); // value to be returned + // alignment: Controls how the text is laid out within the text field. + if (isset($prop['alignment'])) { + switch ($prop['alignment']) { + case 'left': { + $opt['q'] = 0; + break; + } + case 'center': { + $opt['q'] = 1; + break; + } + case 'right': { + $opt['q'] = 2; + break; + } + default: { + $opt['q'] = ($this->rtl)?2:0; + break; + } + } + } + // lineWidth: Specifies the thickness of the border when stroking the perimeter of a field's rectangle. + if (isset($prop['lineWidth'])) { + $linewidth = intval($prop['lineWidth']); + } else { + $linewidth = 1; + } + // borderStyle: The border style for a field. + if (isset($prop['borderStyle'])) { + switch ($prop['borderStyle']) { + case 'border.d': + case 'dashed': { + $opt['border'] = array(0, 0, $linewidth, array(3, 2)); + $opt['bs'] = array('w'=>$linewidth, 's'=>'D', 'd'=>array(3, 2)); + break; + } + case 'border.b': + case 'beveled': { + $opt['border'] = array(0, 0, $linewidth); + $opt['bs'] = array('w'=>$linewidth, 's'=>'B'); + break; + } + case 'border.i': + case 'inset': { + $opt['border'] = array(0, 0, $linewidth); + $opt['bs'] = array('w'=>$linewidth, 's'=>'I'); + break; + } + case 'border.u': + case 'underline': { + $opt['border'] = array(0, 0, $linewidth); + $opt['bs'] = array('w'=>$linewidth, 's'=>'U'); + break; + } + default: + case 'border.s': + case 'solid': { + $opt['border'] = array(0, 0, $linewidth); + $opt['bs'] = array('w'=>$linewidth, 's'=>'S'); + break; + } + } + } + if (isset($prop['border']) AND is_array($prop['border'])) { + $opt['border'] = $prop['border']; + } + if (!isset($opt['mk'])) { + $opt['mk'] = array(); + } + if (!isset($opt['mk']['if'])) { + $opt['mk']['if'] = array(); + } + $opt['mk']['if']['a'] = array(0.5, 0.5); + // buttonAlignX: Controls how space is distributed from the left of the button face with respect to the icon. + if (isset($prop['buttonAlignX'])) { + $opt['mk']['if']['a'][0] = $prop['buttonAlignX']; + } + // buttonAlignY: Controls how unused space is distributed from the bottom of the button face with respect to the icon. + if (isset($prop['buttonAlignY'])) { + $opt['mk']['if']['a'][1] = $prop['buttonAlignY']; + } + // buttonFitBounds: If true, the extent to which the icon may be scaled is set to the bounds of the button field. + if (isset($prop['buttonFitBounds']) AND ($prop['buttonFitBounds'] == 'true')) { + $opt['mk']['if']['fb'] = true; + } + // buttonScaleHow: Controls how the icon is scaled (if necessary) to fit inside the button face. + if (isset($prop['buttonScaleHow'])) { + switch ($prop['buttonScaleHow']) { + case 'scaleHow.proportional': { + $opt['mk']['if']['s'] = 'P'; + break; + } + case 'scaleHow.anamorphic': { + $opt['mk']['if']['s'] = 'A'; + break; + } + } + } + // buttonScaleWhen: Controls when an icon is scaled to fit inside the button face. + if (isset($prop['buttonScaleWhen'])) { + switch ($prop['buttonScaleWhen']) { + case 'scaleWhen.always': { + $opt['mk']['if']['sw'] = 'A'; + break; + } + case 'scaleWhen.never': { + $opt['mk']['if']['sw'] = 'N'; + break; + } + case 'scaleWhen.tooBig': { + $opt['mk']['if']['sw'] = 'B'; + break; + } + case 'scaleWhen.tooSmall': { + $opt['mk']['if']['sw'] = 'S'; + break; + } + } + } + // buttonPosition: Controls how the text and the icon of the button are positioned with respect to each other within the button face. + if (isset($prop['buttonPosition'])) { + switch ($prop['buttonPosition']) { + case 0: + case 'position.textOnly': { + $opt['mk']['tp'] = 0; + break; + } + case 1: + case 'position.iconOnly': { + $opt['mk']['tp'] = 1; + break; + } + case 2: + case 'position.iconTextV': { + $opt['mk']['tp'] = 2; + break; + } + case 3: + case 'position.textIconV': { + $opt['mk']['tp'] = 3; + break; + } + case 4: + case 'position.iconTextH': { + $opt['mk']['tp'] = 4; + break; + } + case 5: + case 'position.textIconH': { + $opt['mk']['tp'] = 5; + break; + } + case 6: + case 'position.overlay': { + $opt['mk']['tp'] = 6; + break; + } + } + } + // fillColor: Specifies the background color for a field. + if (isset($prop['fillColor'])) { + if (is_array($prop['fillColor'])) { + $opt['mk']['bg'] = $prop['fillColor']; + } else { + $opt['mk']['bg'] = $this->convertHTMLColorToDec($prop['fillColor']); + } + } + // strokeColor: Specifies the stroke color for a field that is used to stroke the rectangle of the field with a line as large as the line width. + if (isset($prop['strokeColor'])) { + if (is_array($prop['strokeColor'])) { + $opt['mk']['bc'] = $prop['strokeColor']; + } else { + $opt['mk']['bc'] = $this->convertHTMLColorToDec($prop['strokeColor']); + } + } + // rotation: The rotation of a widget in counterclockwise increments. + if (isset($prop['rotation'])) { + $opt['mk']['r'] = $prop['rotation']; + } + // charLimit: Limits the number of characters that a user can type into a text field. + if (isset($prop['charLimit'])) { + $opt['maxlen'] = intval($prop['charLimit']); + } + if (!isset($ff)) { + $ff = 0; + } + // readonly: The read-only characteristic of a field. If a field is read-only, the user can see the field but cannot change it. + if (isset($prop['readonly']) AND ($prop['readonly'] == 'true')) { + $ff += 1 << 0; + } + // required: Specifies whether a field requires a value. + if (isset($prop['required']) AND ($prop['required'] == 'true')) { + $ff += 1 << 1; + } + // multiline: Controls how text is wrapped within the field. + if (isset($prop['multiline']) AND ($prop['multiline'] == 'true')) { + $ff += 1 << 12; + } + // password: Specifies whether the field should display asterisks when data is entered in the field. + if (isset($prop['password']) AND ($prop['password'] == 'true')) { + $ff += 1 << 13; + } + // NoToggleToOff: If set, exactly one radio button shall be selected at all times; selecting the currently selected button has no effect. + if (isset($prop['NoToggleToOff']) AND ($prop['NoToggleToOff'] == 'true')) { + $ff += 1 << 14; + } + // Radio: If set, the field is a set of radio buttons. + if (isset($prop['Radio']) AND ($prop['Radio'] == 'true')) { + $ff += 1 << 15; + } + // Pushbutton: If set, the field is a pushbutton that does not retain a permanent value. + if (isset($prop['Pushbutton']) AND ($prop['Pushbutton'] == 'true')) { + $ff += 1 << 16; + } + // Combo: If set, the field is a combo box; if clear, the field is a list box. + if (isset($prop['Combo']) AND ($prop['Combo'] == 'true')) { + $ff += 1 << 17; + } + // editable: Controls whether a combo box is editable. + if (isset($prop['editable']) AND ($prop['editable'] == 'true')) { + $ff += 1 << 18; + } + // Sort: If set, the field's option items shall be sorted alphabetically. + if (isset($prop['Sort']) AND ($prop['Sort'] == 'true')) { + $ff += 1 << 19; + } + // fileSelect: If true, sets the file-select flag in the Options tab of the text field (Field is Used for File Selection). + if (isset($prop['fileSelect']) AND ($prop['fileSelect'] == 'true')) { + $ff += 1 << 20; + } + // multipleSelection: If true, indicates that a list box allows a multiple selection of items. + if (isset($prop['multipleSelection']) AND ($prop['multipleSelection'] == 'true')) { + $ff += 1 << 21; + } + // doNotSpellCheck: If true, spell checking is not performed on this editable text field. + if (isset($prop['doNotSpellCheck']) AND ($prop['doNotSpellCheck'] == 'true')) { + $ff += 1 << 22; + } + // doNotScroll: If true, the text field does not scroll and the user, therefore, is limited by the rectangular region designed for the field. + if (isset($prop['doNotScroll']) AND ($prop['doNotScroll'] == 'true')) { + $ff += 1 << 23; + } + // comb: If set to true, the field background is drawn as series of boxes (one for each character in the value of the field) and each character of the content is drawn within those boxes. The number of boxes drawn is determined from the charLimit property. It applies only to text fields. The setter will also raise if any of the following field properties are also set multiline, password, and fileSelect. A side-effect of setting this property is that the doNotScroll property is also set. + if (isset($prop['comb']) AND ($prop['comb'] == 'true')) { + $ff += 1 << 24; + } + // radiosInUnison: If false, even if a group of radio buttons have the same name and export value, they behave in a mutually exclusive fashion, like HTML radio buttons. + if (isset($prop['radiosInUnison']) AND ($prop['radiosInUnison'] == 'true')) { + $ff += 1 << 25; + } + // richText: If true, the field allows rich text formatting. + if (isset($prop['richText']) AND ($prop['richText'] == 'true')) { + $ff += 1 << 25; + } + // commitOnSelChange: Controls whether a field value is committed after a selection change. + if (isset($prop['commitOnSelChange']) AND ($prop['commitOnSelChange'] == 'true')) { + $ff += 1 << 26; + } + $opt['ff'] = $ff; + // defaultValue: The default value of a field - that is, the value that the field is set to when the form is reset. + if (isset($prop['defaultValue'])) { + $opt['dv'] = $prop['defaultValue']; + } + $f = 4; // default value for annotation flags + // readonly: The read-only characteristic of a field. If a field is read-only, the user can see the field but cannot change it. + if (isset($prop['readonly']) AND ($prop['readonly'] == 'true')) { + $f += 1 << 6; + } + // display: Controls whether the field is hidden or visible on screen and in print. + if (isset($prop['display'])) { + if ($prop['display'] == 'display.visible') { + // + } elseif ($prop['display'] == 'display.hidden') { + $f += 1 << 1; + } elseif ($prop['display'] == 'display.noPrint') { + $f -= 1 << 2; + } elseif ($prop['display'] == 'display.noView') { + $f += 1 << 5; + } + } + $opt['f'] = $f; + // currentValueIndices: Reads and writes single or multiple values of a list box or combo box. + if (isset($prop['currentValueIndices']) AND is_array($prop['currentValueIndices'])) { + $opt['i'] = $prop['currentValueIndices']; + } + // value: The value of the field data that the user has entered. + if (isset($prop['value'])) { + if (is_array($prop['value'])) { + $opt['opt'] = array(); + foreach ($prop['value'] AS $key => $optval) { + // exportValues: An array of strings representing the export values for the field. + if (isset($prop['exportValues'][$key])) { + $opt['opt'][$key] = array($prop['exportValues'][$key], $prop['value'][$key]); + } else { + $opt['opt'][$key] = $prop['value'][$key]; + } + } + } else { + $opt['v'] = $prop['value']; + } + } + // richValue: This property specifies the text contents and formatting of a rich text field. + if (isset($prop['richValue'])) { + $opt['rv'] = $prop['richValue']; + } + // submitName: If nonempty, used during form submission instead of name. Only applicable if submitting in HTML format (that is, URL-encoded). + if (isset($prop['submitName'])) { + $opt['tm'] = $prop['submitName']; + } + // name: Fully qualified field name. + if (isset($prop['name'])) { + $opt['t'] = $prop['name']; + } + // userName: The user name (short description string) of the field. + if (isset($prop['userName'])) { + $opt['tu'] = $prop['userName']; + } + // highlight: Defines how a button reacts when a user clicks it. + if (isset($prop['highlight'])) { + switch ($prop['highlight']) { + case 'none': + case 'highlight.n': { + $opt['h'] = 'N'; + break; + } + case 'invert': + case 'highlight.i': { + $opt['h'] = 'i'; + break; + } + case 'push': + case 'highlight.p': { + $opt['h'] = 'P'; + break; + } + case 'outline': + case 'highlight.o': { + $opt['h'] = 'O'; + break; + } + } + } + // Unsupported options: + // - calcOrderIndex: Changes the calculation order of fields in the document. + // - delay: Delays the redrawing of a field's appearance. + // - defaultStyle: This property defines the default style attributes for the form field. + // - style: Allows the user to set the glyph style of a check box or radio button. + // - textColor, textFont, textSize + return $opt; + } + + /** + * Set default properties for form fields. + * @param array $prop javascript field properties. Possible values are described on official Javascript for Acrobat API reference. + * @access public + * @author Nicola Asuni + * @since 4.8.000 (2009-09-06) + */ + public function setFormDefaultProp($prop=array()) { + $this->default_form_prop = $prop; + } + + /** + * Return the default properties for form fields. + * @return array $prop javascript field properties. Possible values are described on official Javascript for Acrobat API reference. + * @access public + * @author Nicola Asuni + * @since 4.8.000 (2009-09-06) + */ + public function getFormDefaultProp() { + return $this->default_form_prop; + } + + /** + * Creates a text field + * @param string $name field name + * @param float $w Width of the rectangle + * @param float $h Height of the rectangle + * @param array $prop javascript field properties. Possible values are described on official Javascript for Acrobat API reference. + * @param array $opt annotation parameters. Possible values are described on official PDF32000_2008 reference. + * @param float $x Abscissa of the upper-left corner of the rectangle + * @param float $y Ordinate of the upper-left corner of the rectangle + * @param boolean $js if true put the field using JavaScript (requires Acrobat Writer to be rendered). + * @access public + * @author Nicola Asuni + * @since 4.8.000 (2009-09-07) + */ + public function TextField($name, $w, $h, $prop=array(), $opt=array(), $x='', $y='', $js=false) { + if ($x === '') { + $x = $this->x; + } + if ($y === '') { + $y = $this->y; + } + if ($js) { + $this->_addfield('text', $name, $x, $y, $w, $h, $prop); + return; + } + // get default style + $prop = array_merge($this->getFormDefaultProp(), $prop); + // get annotation data + $popt = $this->getAnnotOptFromJSProp($prop); + // set default appearance stream + $font = $this->FontFamily; + $fontkey = array_search($font, $this->fontkeys); + if (!in_array($fontkey, $this->annotation_fonts)) { + $this->annotation_fonts[$font] = $fontkey; + } + $fontstyle = sprintf('/F%d %.2F Tf %s', ($fontkey + 1), $this->FontSizePt, $this->TextColor); + $popt['da'] = $fontstyle; + $popt['ap'] = array(); + $popt['ap']['n'] = 'q BT '.$fontstyle.' ET Q'; + // merge options + $opt = array_merge($popt, $opt); + // remove some conflicting options + unset($opt['bs']); + // set remaining annotation data + $opt['Subtype'] = 'Widget'; + $opt['ft'] = 'Tx'; + $opt['t'] = $name; + /* + Additional annotation's parameters (check _putannotsobj() method): + //$opt['f'] + //$opt['ap'] + //$opt['as'] + //$opt['bs'] + //$opt['be'] + //$opt['c'] + //$opt['border'] + //$opt['h'] + //$opt['mk'] + //$opt['mk']['r'] + //$opt['mk']['bc'] + //$opt['mk']['bg'] + //$opt['mk']['ca'] + //$opt['mk']['rc'] + //$opt['mk']['ac'] + //$opt['mk']['i'] + //$opt['mk']['ri'] + //$opt['mk']['ix'] + //$opt['mk']['if'] + //$opt['mk']['if']['sw'] + //$opt['mk']['if']['s'] + //$opt['mk']['if']['a'] + //$opt['mk']['if']['fb'] + //$opt['mk']['tp'] + //$opt['tu'] + //$opt['tm'] + //$opt['ff'] + //$opt['v'] + //$opt['dv'] + //$opt['a'] + //$opt['aa'] + //$opt['q'] + */ + $this->Annotation($x, $y, $w, $h, $name, $opt, 0); + if ($this->rtl) { + $this->x -= $w; + } else { + $this->x += $w; + } + } + + /** + * Creates a RadioButton field + * @param string $name field name + * @param int $w width + * @param array $prop javascript field properties. Possible values are described on official Javascript for Acrobat API reference. + * @param array $opt annotation parameters. Possible values are described on official PDF32000_2008 reference. + * @param string $onvalue value to be returned if selected. + * @param boolean $checked define the initial state. + * @param float $x Abscissa of the upper-left corner of the rectangle + * @param float $y Ordinate of the upper-left corner of the rectangle + * @param boolean $js if true put the field using JavaScript (requires Acrobat Writer to be rendered). + * @access public + * @author Nicola Asuni + * @since 4.8.000 (2009-09-07) + */ + public function RadioButton($name, $w, $prop=array(), $opt=array(), $onvalue='On', $checked=false, $x='', $y='', $js=false) { + if ($x === '') { + $x = $this->x; + } + if ($y === '') { + $y = $this->y; + } + if ($js) { + $this->_addfield('radiobutton', $name, $x, $y, $w, $w, $prop); + return; + } + if ($this->empty_string($onvalue)) { + $onvalue = 'On'; + } + if ($checked) { + $defval = $onvalue; + } else { + $defval = 'Off'; + } + // set data for parent group + if (!isset($this->radiobutton_groups[$this->page])) { + $this->radiobutton_groups[$this->page] = array(); + } + if (!isset($this->radiobutton_groups[$this->page][$name])) { + $this->radiobutton_groups[$this->page][$name] = array(); + ++$this->annot_obj_id; + $this->radio_groups[] = $this->annot_obj_id; + } + // save object ID to be added on Kids entry on parent object + $this->radiobutton_groups[$this->page][$name][] = array('kid' => ($this->annot_obj_id + 1), 'def' => $defval); + // get default style + $prop = array_merge($this->getFormDefaultProp(), $prop); + $prop['NoToggleToOff'] = 'true'; + $prop['Radio'] = 'true'; + $prop['borderStyle'] = 'inset'; + // get annotation data + $popt = $this->getAnnotOptFromJSProp($prop); + // set additional default values + $font = 'zapfdingbats'; + $this->AddFont($font); + $fontkey = array_search($font, $this->fontkeys); + if (!in_array($fontkey, $this->annotation_fonts)) { + $this->annotation_fonts[$font] = $fontkey; + } + $fontstyle = sprintf('/F%d %.2F Tf %s', ($fontkey + 1), $this->FontSizePt, $this->TextColor); + $popt['da'] = $fontstyle; + $popt['ap'] = array(); + $popt['ap']['n'] = array(); + $popt['ap']['n'][$onvalue] = 'q BT '.$fontstyle.' 0 0 Td (8) Tj ET Q'; + $popt['ap']['n']['Off'] = 'q BT '.$fontstyle.' 0 0 Td (8) Tj ET Q'; + if (!isset($popt['mk'])) { + $popt['mk'] = array(); + } + $popt['mk']['ca'] = '(l)'; + // merge options + $opt = array_merge($popt, $opt); + // set remaining annotation data + $opt['Subtype'] = 'Widget'; + $opt['ft'] = 'Btn'; + if ($checked) { + $opt['v'] = array('/'.$onvalue); + $opt['as'] = $onvalue; + } else { + $opt['as'] = 'Off'; + } + $this->Annotation($x, $y, $w, $w, $name, $opt, 0); + if ($this->rtl) { + $this->x -= $w; + } else { + $this->x += $w; + } + } + + /** + * Creates a List-box field + * @param string $name field name + * @param int $w width + * @param int $h height + * @param array $values array containing the list of values. + * @param array $prop javascript field properties. Possible values are described on official Javascript for Acrobat API reference. + * @param array $opt annotation parameters. Possible values are described on official PDF32000_2008 reference. + * @param float $x Abscissa of the upper-left corner of the rectangle + * @param float $y Ordinate of the upper-left corner of the rectangle + * @param boolean $js if true put the field using JavaScript (requires Acrobat Writer to be rendered). + * @access public + * @author Nicola Asuni + * @since 4.8.000 (2009-09-07) + */ + public function ListBox($name, $w, $h, $values, $prop=array(), $opt=array(), $x='', $y='', $js=false) { + if ($x === '') { + $x = $this->x; + } + if ($y === '') { + $y = $this->y; + } + if ($js) { + $this->_addfield('listbox', $name, $x, $y, $w, $h, $prop); + $s = ''; + foreach ($values as $value) { + $s .= "'".addslashes($value)."',"; + } + $this->javascript .= 'f'.$name.'.setItems(['.substr($s, 0, -1)."]);\n"; + return; + } + // get default style + $prop = array_merge($this->getFormDefaultProp(), $prop); + // get annotation data + $popt = $this->getAnnotOptFromJSProp($prop); + // set additional default values + $font = $this->FontFamily; + $fontkey = array_search($font, $this->fontkeys); + if (!in_array($fontkey, $this->annotation_fonts)) { + $this->annotation_fonts[$font] = $fontkey; + } + $fontstyle = sprintf('/F%d %.2F Tf %s', ($fontkey + 1), $this->FontSizePt, $this->TextColor); + $popt['da'] = $fontstyle; + $popt['ap'] = array(); + $popt['ap']['n'] = 'q BT '.$fontstyle.' ET Q'; + // merge options + $opt = array_merge($popt, $opt); + // set remaining annotation data + $opt['Subtype'] = 'Widget'; + $opt['ft'] = 'Ch'; + $opt['t'] = $name; + $opt['opt'] = $values; + $this->Annotation($x, $y, $w, $h, $name, $opt, 0); + if ($this->rtl) { + $this->x -= $w; + } else { + $this->x += $w; + } + } + + /** + * Creates a Combo-box field + * @param string $name field name + * @param int $w width + * @param int $h height + * @param array $values array containing the list of values. + * @param array $prop javascript field properties. Possible values are described on official Javascript for Acrobat API reference. + * @param array $opt annotation parameters. Possible values are described on official PDF32000_2008 reference. + * @param float $x Abscissa of the upper-left corner of the rectangle + * @param float $y Ordinate of the upper-left corner of the rectangle + * @param boolean $js if true put the field using JavaScript (requires Acrobat Writer to be rendered). + * @access public + * @author Nicola Asuni + * @since 4.8.000 (2009-09-07) + */ + public function ComboBox($name, $w, $h, $values, $prop=array(), $opt=array(), $x='', $y='', $js=false) { + if ($x === '') { + $x = $this->x; + } + if ($y === '') { + $y = $this->y; + } + if ($js) { + $this->_addfield('combobox', $name, $x, $y, $w, $h, $prop); + $s = ''; + foreach ($values as $value) { + $s .= "'".addslashes($value)."',"; + } + $this->javascript .= 'f'.$name.'.setItems(['.substr($s, 0, -1)."]);\n"; + return; + } + // get default style + $prop = array_merge($this->getFormDefaultProp(), $prop); + $prop['Combo'] = true; + // get annotation data + $popt = $this->getAnnotOptFromJSProp($prop); + // set additional default options + $font = $this->FontFamily; + $fontkey = array_search($font, $this->fontkeys); + if (!in_array($fontkey, $this->annotation_fonts)) { + $this->annotation_fonts[$font] = $fontkey; + } + $fontstyle = sprintf('/F%d %.2F Tf %s', ($fontkey + 1), $this->FontSizePt, $this->TextColor); + $popt['da'] = $fontstyle; + $popt['ap'] = array(); + $popt['ap']['n'] = 'q BT '.$fontstyle.' ET Q'; + // merge options + $opt = array_merge($popt, $opt); + // set remaining annotation data + $opt['Subtype'] = 'Widget'; + $opt['ft'] = 'Ch'; + $opt['t'] = $name; + $opt['opt'] = $values; + $this->Annotation($x, $y, $w, $h, $name, $opt, 0); + if ($this->rtl) { + $this->x -= $w; + } else { + $this->x += $w; + } + } + + /** + * Creates a CheckBox field + * @param string $name field name + * @param int $w width + * @param boolean $checked define the initial state. + * @param array $prop javascript field properties. Possible values are described on official Javascript for Acrobat API reference. + * @param array $opt annotation parameters. Possible values are described on official PDF32000_2008 reference. + * @param string $onvalue value to be returned if selected. + * @param float $x Abscissa of the upper-left corner of the rectangle + * @param float $y Ordinate of the upper-left corner of the rectangle + * @param boolean $js if true put the field using JavaScript (requires Acrobat Writer to be rendered). + * @access public + * @author Nicola Asuni + * @since 4.8.000 (2009-09-07) + */ + public function CheckBox($name, $w, $checked=false, $prop=array(), $opt=array(), $onvalue='Yes', $x='', $y='', $js=false) { + if ($x === '') { + $x = $this->x; + } + if ($y === '') { + $y = $this->y; + } + if ($js) { + $this->_addfield('checkbox', $name, $x, $y, $w, $w, $prop); + return; + } + if (!isset($prop['value'])) { + $prop['value'] = array('Yes'); + } + // get default style + $prop = array_merge($this->getFormDefaultProp(), $prop); + $prop['borderStyle'] = 'inset'; + // get annotation data + $popt = $this->getAnnotOptFromJSProp($prop); + // set additional default options + $font = 'zapfdingbats'; + $this->AddFont($font); + $fontkey = array_search($font, $this->fontkeys); + if (!in_array($fontkey, $this->annotation_fonts)) { + $this->annotation_fonts[$font] = $fontkey; + } + $fontstyle = sprintf('/F%d %.2F Tf %s', ($fontkey + 1), $this->FontSizePt, $this->TextColor); + $popt['da'] = $fontstyle; + $popt['ap'] = array(); + $popt['ap']['n'] = array(); + $popt['ap']['n']['Yes'] = 'q BT '.$fontstyle.' 0 0 Td (8) Tj ET Q'; + $popt['ap']['n']['Off'] = 'q BT '.$fontstyle.' 0 0 Td (8) Tj ET Q'; + // merge options + $opt = array_merge($popt, $opt); + // set remaining annotation data + $opt['Subtype'] = 'Widget'; + $opt['ft'] = 'Btn'; + $opt['t'] = $name; + $opt['opt'] = array($onvalue); + if ($checked) { + $opt['v'] = array('/0'); + $opt['as'] = 'Yes'; + } else { + $opt['v'] = array('/Off'); + $opt['as'] = 'Off'; + } + $this->Annotation($x, $y, $w, $w, $name, $opt, 0); + if ($this->rtl) { + $this->x -= $w; + } else { + $this->x += $w; + } + } + + /** + * Creates a button field + * @param string $name field name + * @param int $w width + * @param int $h height + * @param string $caption caption. + * @param mixed $action action triggered by pressing the button. Use a string to specify a javascript action. Use an array to specify a form action options as on section 12.7.5 of PDF32000_2008. + * @param array $prop javascript field properties. Possible values are described on official Javascript for Acrobat API reference. + * @param array $opt annotation parameters. Possible values are described on official PDF32000_2008 reference. + * @param float $x Abscissa of the upper-left corner of the rectangle + * @param float $y Ordinate of the upper-left corner of the rectangle + * @param boolean $js if true put the field using JavaScript (requires Acrobat Writer to be rendered). + * @access public + * @author Nicola Asuni + * @since 4.8.000 (2009-09-07) + */ + public function Button($name, $w, $h, $caption, $action, $prop=array(), $opt=array(), $x='', $y='', $js=false) { + if ($x === '') { + $x = $this->x; + } + if ($y === '') { + $y = $this->y; + } + if ($js) { + $this->_addfield('button', $name, $this->x, $this->y, $w, $h, $prop); + $this->javascript .= 'f'.$name.".buttonSetCaption('".addslashes($caption)."');\n"; + $this->javascript .= 'f'.$name.".setAction('MouseUp','".addslashes($action)."');\n"; + $this->javascript .= 'f'.$name.".highlight='push';\n"; + $this->javascript .= 'f'.$name.".print=false;\n"; + return; + } + // get default style + $prop = array_merge($this->getFormDefaultProp(), $prop); + $prop['Pushbutton'] = 'true'; + $prop['highlight'] = 'push'; + $prop['display'] = 'display.noPrint'; + // get annotation data + $popt = $this->getAnnotOptFromJSProp($prop); + // set additional default options + if (!isset($popt['mk'])) { + $popt['mk'] = array(); + } + $popt['mk']['ca'] = $this->_textstring($caption); + $popt['mk']['rc'] = $this->_textstring($caption); + $popt['mk']['ac'] = $this->_textstring($caption); + $font = $this->FontFamily; + $fontkey = array_search($font, $this->fontkeys); + if (!in_array($fontkey, $this->annotation_fonts)) { + $this->annotation_fonts[$font] = $fontkey; + } + $fontstyle = sprintf('/F%d %.2F Tf %s', ($fontkey + 1), $this->FontSizePt, $this->TextColor); + $popt['da'] = $fontstyle; + $popt['ap'] = array(); + $popt['ap']['n'] = 'q BT '.$fontstyle.' ET Q'; + // merge options + $opt = array_merge($popt, $opt); + // set remaining annotation data + $opt['Subtype'] = 'Widget'; + $opt['ft'] = 'Btn'; + $opt['t'] = $caption; + $opt['v'] = $name; + if (!empty($action)) { + if (is_array($action)) { + // form action options as on section 12.7.5 of PDF32000_2008. + $opt['aa'] = '/D <<'; + $bmode = array('SubmitForm', 'ResetForm', 'ImportData'); + foreach ($action AS $key => $val) { + if (($key == 'S') AND in_array($val, $bmode)) { + $opt['aa'] .= ' /S /'.$val; + } elseif (($key == 'F') AND (!empty($val))) { + $opt['aa'] .= ' /F '.$this->_datastring($val); + } elseif (($key == 'Fields') AND is_array($val) AND !empty($val)) { + $opt['aa'] .= ' /Fields ['; + foreach ($val AS $field) { + $opt['aa'] .= ' '.$this->_textstring($field); + } + $opt['aa'] .= ']'; + } elseif (($key == 'Flags')) { + $ff = 0; + if (is_array($val)) { + foreach ($val AS $flag) { + switch ($flag) { + case 'Include/Exclude': { + $ff += 1 << 0; + break; + } + case 'IncludeNoValueFields': { + $ff += 1 << 1; + break; + } + case 'ExportFormat': { + $ff += 1 << 2; + break; + } + case 'GetMethod': { + $ff += 1 << 3; + break; + } + case 'SubmitCoordinates': { + $ff += 1 << 4; + break; + } + case 'XFDF': { + $ff += 1 << 5; + break; + } + case 'IncludeAppendSaves': { + $ff += 1 << 6; + break; + } + case 'IncludeAnnotations': { + $ff += 1 << 7; + break; + } + case 'SubmitPDF': { + $ff += 1 << 8; + break; + } + case 'CanonicalFormat': { + $ff += 1 << 9; + break; + } + case 'ExclNonUserAnnots': { + $ff += 1 << 10; + break; + } + case 'ExclFKey': { + $ff += 1 << 11; + break; + } + case 'EmbedForm': { + $ff += 1 << 13; + break; + } + } + } + } else { + $ff = intval($val); + } + $opt['aa'] .= ' /Flags '.$ff; + } + } + $opt['aa'] .= ' >>'; + } else { + // Javascript action or raw action command + $js_obj_id = $this->addJavascriptObject($action); + $opt['aa'] = '/D '.$js_obj_id.' 0 R'; + } + } + $this->Annotation($x, $y, $w, $h, $name, $opt, 0); + if ($this->rtl) { + $this->x -= $w; + } else { + $this->x += $w; + } + } + + // --- END FORMS FIELDS ------------------------------------------------ + + /** + * Add certification signature (DocMDP or UR3) + * You can set only one signature type + * @access protected + * @author Nicola Asuni + * @since 4.6.008 (2009-05-07) + */ + protected function _putsignature() { + if ((!$this->sign) OR (!isset($this->signature_data['cert_type']))) { + return; + } + $this->_newobj(); + $out = ' << /Type /Sig'; + $out .= ' /Filter /Adobe.PPKLite'; + $out .= ' /SubFilter /adbe.pkcs7.detached'; + $out .= ' '.$this->byterange_string; + $out .= ' /Contents<>'.str_repeat(' ', $this->signature_max_length); + $out .= ' /Reference'; + $out .= ' ['; + $out .= ' << /Type /SigRef'; + if ($this->signature_data['cert_type'] > 0) { + $out .= ' /TransformMethod /DocMDP'; + $out .= ' /TransformParams'; + $out .= ' <<'; + $out .= ' /Type /TransformParams'; + $out .= ' /V /1.2'; + $out .= ' /P '.$this->signature_data['cert_type']; + } else { + $out .= ' /TransformMethod /UR3'; + $out .= ' /TransformParams'; + $out .= ' << /Type /TransformParams'; + $out .= ' /V /2.2'; + if (!$this->empty_string($this->ur_document)) { + $out .= ' /Document['.$this->ur_document.']'; + } + if (!$this->empty_string($this->ur_annots)) { + $out .= ' /Annots['.$this->ur_annots.']'; + } + if (!$this->empty_string($this->ur_form)) { + $out .= ' /Form['.$this->ur_form.']'; + } + if (!$this->empty_string($this->ur_signature)) { + $out .= ' /Signature['.$this->ur_signature.']'; + } + } + $out .= ' >> >> ]'; + if (isset($this->signature_data['info']['Name']) AND !$this->empty_string($this->signature_data['info']['Name'])) { + $out .= ' /Name '.$this->_textstring($this->signature_data['info']['Name']); + } + if (isset($this->signature_data['info']['Location']) AND !$this->empty_string($this->signature_data['info']['Location'])) { + $out .= ' /Location '.$this->_textstring($this->signature_data['info']['Location']); + } + if (isset($this->signature_data['info']['Reason']) AND !$this->empty_string($this->signature_data['info']['Reason'])) { + $out .= ' /Reason '.$this->_textstring($this->signature_data['info']['Reason']); + } + if (isset($this->signature_data['info']['ContactInfo']) AND !$this->empty_string($this->signature_data['info']['ContactInfo'])) { + $out .= ' /ContactInfo '.$this->_textstring($this->signature_data['info']['ContactInfo']); + } + $out .= ' /M '.$this->_datestring(); + $out .= ' >> endobj'; + $this->_out($out); + } + + /** + * Set User's Rights for PDF Reader + * WARNING: This works only using the Adobe private key with the setSignature() method!. + * Check the PDF Reference 8.7.1 Transform Methods, + * Table 8.105 Entries in the UR transform parameters dictionary + * @param boolean $enable if true enable user's rights on PDF reader + * @param string $document Names specifying additional document-wide usage rights for the document. The only defined value is "/FullSave", which permits a user to save the document along with modified form and/or annotation data. + * @param string $annots Names specifying additional annotation-related usage rights for the document. Valid names in PDF 1.5 and later are /Create/Delete/Modify/Copy/Import/Export, which permit the user to perform the named operation on annotations. + * @param string $form Names specifying additional form-field-related usage rights for the document. Valid names are: /Add/Delete/FillIn/Import/Export/SubmitStandalone/SpawnTemplate + * @param string $signature Names specifying additional signature-related usage rights for the document. The only defined value is /Modify, which permits a user to apply a digital signature to an existing signature form field or clear a signed signature form field. + * @access public + * @author Nicola Asuni + * @since 2.9.000 (2008-03-26) + */ + public function setUserRights( + $enable=true, + $document='/FullSave', + $annots='/Create/Delete/Modify/Copy/Import/Export', + $form='/Add/Delete/FillIn/Import/Export/SubmitStandalone/SpawnTemplate', + $signature='/Modify') { + $this->ur = $enable; + $this->ur_document = $document; + $this->ur_annots = $annots; + $this->ur_form = $form; + $this->ur_signature = $signature; + if (!$this->sign) { + // This signature only works using the Adobe Private key that is unavailable! + $this->setSignature('', '', '', '', 0, array()); + } + } + + /** + * Enable document signature (requires the OpenSSL Library). + * The digital signature improve document authenticity and integrity and allows o enable extra features on Acrobat Reader. + * @param mixed $signing_cert signing certificate (string or filename prefixed with 'file://') + * @param mixed $private_key private key (string or filename prefixed with 'file://') + * @param string $private_key_password password + * @param string $extracerts specifies the name of a file containing a bunch of extra certificates to include in the signature which can for example be used to help the recipient to verify the certificate that you used. + * @param int $cert_type The access permissions granted for this document. Valid values shall be: 1 = No changes to the document shall be permitted; any change to the document shall invalidate the signature; 2 = Permitted changes shall be filling in forms, instantiating page templates, and signing; other changes shall invalidate the signature; 3 = Permitted changes shall be the same as for 2, as well as annotation creation, deletion, and modification; other changes shall invalidate the signature. + * @param array $info array of option information: Name, Location, Reason, ContactInfo. + * @access public + * @author Nicola Asuni + * @since 4.6.005 (2009-04-24) + */ + public function setSignature($signing_cert='', $private_key='', $private_key_password='', $extracerts='', $cert_type=2, $info=array()) { + // to create self-signed signature: openssl req -x509 -nodes -days 365000 -newkey rsa:1024 -keyout tcpdf.crt -out tcpdf.crt + // to convert pfx certificate to pem: openssl + // OpenSSL> pkcs12 -in <cert.pfx> -out <cert.crt> -nodes + $this->sign = true; + $this->signature_data = array(); + if (strlen($signing_cert) == 0) { + $signing_cert = 'file://'.dirname(__FILE__).'/tcpdf.crt'; + $private_key_password = 'tcpdfdemo'; + } + if (strlen($private_key) == 0) { + $private_key = $signing_cert; + } + $this->signature_data['signcert'] = $signing_cert; + $this->signature_data['privkey'] = $private_key; + $this->signature_data['password'] = $private_key_password; + $this->signature_data['extracerts'] = $extracerts; + $this->signature_data['cert_type'] = $cert_type; + $this->signature_data['info'] = $info; + } + + /** + * Create a new page group. + * NOTE: call this function before calling AddPage() + * @param int $page starting group page (leave empty for next page). + * @access public + * @since 3.0.000 (2008-03-27) + */ + public function startPageGroup($page='') { + if (empty($page)) { + $page = $this->page + 1; + } + $this->newpagegroup[$page] = true; + } + + /** + * Defines an alias for the total number of pages. + * It will be substituted as the document is closed. + * @param string $alias The alias. + * @access public + * @since 1.4 + * @see getAliasNbPages(), PageNo(), Footer() + */ + public function AliasNbPages($alias='{nb}') { + $this->AliasNbPages = $alias; + } + + /** + * Returns the string alias used for the total number of pages. + * If the current font is unicode type, the returned string is surrounded by additional curly braces. + * @return string + * @access public + * @since 4.0.018 (2008-08-08) + * @see AliasNbPages(), PageNo(), Footer() + */ + public function getAliasNbPages() { + if (($this->CurrentFont['type'] == 'TrueTypeUnicode') OR ($this->CurrentFont['type'] == 'cidfont0')) { + return '{'.$this->AliasNbPages.'}'; + } + return $this->AliasNbPages; + } + + /** + * Defines an alias for the page number. + * It will be substituted as the document is closed. + * @param string $alias The alias. + * @access public + * @since 4.5.000 (2009-01-02) + * @see getAliasNbPages(), PageNo(), Footer() + */ + public function AliasNumPage($alias='{pnb}') { + //Define an alias for total number of pages + $this->AliasNumPage = $alias; + } + + /** + * Returns the string alias used for the page number. + * If the current font is unicode type, the returned string is surrounded by additional curly braces. + * @return string + * @access public + * @since 4.5.000 (2009-01-02) + * @see AliasNbPages(), PageNo(), Footer() + */ + public function getAliasNumPage() { + if (($this->CurrentFont['type'] == 'TrueTypeUnicode') OR ($this->CurrentFont['type'] == 'cidfont0')) { + return '{'.$this->AliasNumPage.'}'; + } + return $this->AliasNumPage; + } + + /** + * Return the current page in the group. + * @return current page in the group + * @access public + * @since 3.0.000 (2008-03-27) + */ + public function getGroupPageNo() { + return $this->pagegroups[$this->currpagegroup]; + } + + /** + * Returns the current group page number formatted as a string. + * @access public + * @since 4.3.003 (2008-11-18) + * @see PaneNo(), formatPageNumber() + */ + public function getGroupPageNoFormatted() { + return $this->formatPageNumber($this->getGroupPageNo()); + } + + /** + * Return the alias of the current page group + * If the current font is unicode type, the returned string is surrounded by additional curly braces. + * (will be replaced by the total number of pages in this group). + * @return alias of the current page group + * @access public + * @since 3.0.000 (2008-03-27) + */ + public function getPageGroupAlias() { + if (($this->CurrentFont['type'] == 'TrueTypeUnicode') OR ($this->CurrentFont['type'] == 'cidfont0')) { + return '{'.$this->currpagegroup.'}'; + } + return $this->currpagegroup; + } + + /** + * Return the alias for the page number on the current page group + * If the current font is unicode type, the returned string is surrounded by additional curly braces. + * (will be replaced by the total number of pages in this group). + * @return alias of the current page group + * @access public + * @since 4.5.000 (2009-01-02) + */ + public function getPageNumGroupAlias() { + if (($this->CurrentFont['type'] == 'TrueTypeUnicode') OR ($this->CurrentFont['type'] == 'cidfont0')) { + return '{'.str_replace('{nb', '{pnb', $this->currpagegroup).'}'; + } + return str_replace('{nb', '{pnb', $this->currpagegroup); + } + + /** + * Format the page numbers. + * This method can be overriden for custom formats. + * @param int $num page number + * @access protected + * @since 4.2.005 (2008-11-06) + */ + protected function formatPageNumber($num) { + return number_format((float)$num, 0, '', '.'); + } + + /** + * Format the page numbers on the Table Of Content. + * This method can be overriden for custom formats. + * @param int $num page number + * @access protected + * @since 4.5.001 (2009-01-04) + * @see addTOC(), addHTMLTOC() + */ + protected function formatTOCPageNumber($num) { + return number_format((float)$num, 0, '', '.'); + } + + /** + * Returns the current page number formatted as a string. + * @access public + * @since 4.2.005 (2008-11-06) + * @see PaneNo(), formatPageNumber() + */ + public function PageNoFormatted() { + return $this->formatPageNumber($this->PageNo()); + } + + /** + * Put visibility settings. + * @access protected + * @since 3.0.000 (2008-03-27) + */ + protected function _putocg() { + $this->_newobj(); + $this->n_ocg_print = $this->n; + $this->_out('<< /Type /OCG /Name '.$this->_textstring('print').' /Usage << /Print <</PrintState /ON>> /View <</ViewState /OFF>> >> >> endobj'); + $this->_newobj(); + $this->n_ocg_view = $this->n; + $this->_out('<< /Type /OCG /Name '.$this->_textstring('view').' /Usage << /Print <</PrintState /OFF>> /View <</ViewState /ON>> >> >> endobj'); + } + + /** + * Set the visibility of the successive elements. + * This can be useful, for instance, to put a background + * image or color that will show on screen but won't print. + * @param string $v visibility mode. Legal values are: all, print, screen. + * @access public + * @since 3.0.000 (2008-03-27) + */ + public function setVisibility($v) { + if ($this->openMarkedContent) { + // close existing open marked-content + $this->_out('EMC'); + $this->openMarkedContent = false; + } + switch($v) { + case 'print': { + $this->_out('/OC /OC1 BDC'); + $this->openMarkedContent = true; + break; + } + case 'screen': { + $this->_out('/OC /OC2 BDC'); + $this->openMarkedContent = true; + break; + } + case 'all': { + $this->_out(''); + break; + } + default: { + $this->Error('Incorrect visibility: '.$v); + break; + } + } + $this->visibility = $v; + } + + /** + * Add transparency parameters to the current extgstate + * @param array $params parameters + * @return the number of extgstates + * @access protected + * @since 3.0.000 (2008-03-27) + */ + protected function addExtGState($parms) { + $n = count($this->extgstates) + 1; + // check if this ExtGState already exist + for ($i = 1; $i < $n; ++$i) { + if ($this->extgstates[$i]['parms'] == $parms) { + // return reference to existing ExtGState + return $i; + } + } + $this->extgstates[$n]['parms'] = $parms; + return $n; + } + + /** + * Add an extgstate + * @param array $gs extgstate + * @access protected + * @since 3.0.000 (2008-03-27) + */ + protected function setExtGState($gs) { + $this->_out(sprintf('/GS%d gs', $gs)); + } + + /** + * Put extgstates for object transparency + * @param array $gs extgstate + * @access protected + * @since 3.0.000 (2008-03-27) + */ + protected function _putextgstates() { + $ne = count($this->extgstates); + for ($i = 1; $i <= $ne; ++$i) { + $this->_newobj(); + $this->extgstates[$i]['n'] = $this->n; + $out = '<< /Type /ExtGState'; + foreach ($this->extgstates[$i]['parms'] as $k => $v) { + if (is_float($v)) { + $v = sprintf('%.2F', $v); + } + $out .= ' /'.$k.' '.$v; + } + $out .= ' >> endobj'; + $this->_out($out); + } + } + + /** + * Set alpha for stroking (CA) and non-stroking (ca) operations. + * @param float $alpha real value from 0 (transparent) to 1 (opaque) + * @param string $bm blend mode, one of the following: Normal, Multiply, Screen, Overlay, Darken, Lighten, ColorDodge, ColorBurn, HardLight, SoftLight, Difference, Exclusion, Hue, Saturation, Color, Luminosity + * @access public + * @since 3.0.000 (2008-03-27) + */ + public function setAlpha($alpha, $bm='Normal') { + $gs = $this->addExtGState(array('ca' => $alpha, 'CA' => $alpha, 'BM' => '/'.$bm, 'AIS' => 'false')); + $this->setExtGState($gs); + } + + /** + * Set the default JPEG compression quality (1-100) + * @param int $quality JPEG quality, integer between 1 and 100 + * @access public + * @since 3.0.000 (2008-03-27) + */ + public function setJPEGQuality($quality) { + if (($quality < 1) OR ($quality > 100)) { + $quality = 75; + } + $this->jpeg_quality = intval($quality); + } + + /** + * Set the default number of columns in a row for HTML tables. + * @param int $cols number of columns + * @access public + * @since 3.0.014 (2008-06-04) + */ + public function setDefaultTableColumns($cols=4) { + $this->default_table_columns = intval($cols); + } + + /** + * Set the height of the cell (line height) respect the font height. + * @param int $h cell proportion respect font height (typical value = 1.25). + * @access public + * @since 3.0.014 (2008-06-04) + */ + public function setCellHeightRatio($h) { + $this->cell_height_ratio = $h; + } + + /** + * return the height of cell repect font height. + * @access public + * @since 4.0.012 (2008-07-24) + */ + public function getCellHeightRatio() { + return $this->cell_height_ratio; + } + + /** + * Set the PDF version (check PDF reference for valid values). + * Default value is 1.t + * @access public + * @since 3.1.000 (2008-06-09) + */ + public function setPDFVersion($version='1.7') { + $this->PDFVersion = $version; + } + + /** + * Set the viewer preferences dictionary controlling the way the document is to be presented on the screen or in print. + * (see Section 8.1 of PDF reference, "Viewer Preferences"). + * <ul><li>HideToolbar boolean (Optional) A flag specifying whether to hide the viewer application's tool bars when the document is active. Default value: false.</li><li>HideMenubar boolean (Optional) A flag specifying whether to hide the viewer application's menu bar when the document is active. Default value: false.</li><li>HideWindowUI boolean (Optional) A flag specifying whether to hide user interface elements in the document's window (such as scroll bars and navigation controls), leaving only the document's contents displayed. Default value: false.</li><li>FitWindow boolean (Optional) A flag specifying whether to resize the document's window to fit the size of the first displayed page. Default value: false.</li><li>CenterWindow boolean (Optional) A flag specifying whether to position the document's window in the center of the screen. Default value: false.</li><li>DisplayDocTitle boolean (Optional; PDF 1.4) A flag specifying whether the window's title bar should display the document title taken from the Title entry of the document information dictionary (see Section 10.2.1, "Document Information Dictionary"). If false, the title bar should instead display the name of the PDF file containing the document. Default value: false.</li><li>NonFullScreenPageMode name (Optional) The document's page mode, specifying how to display the document on exiting full-screen mode:<ul><li>UseNone Neither document outline nor thumbnail images visible</li><li>UseOutlines Document outline visible</li><li>UseThumbs Thumbnail images visible</li><li>UseOC Optional content group panel visible</li></ul>This entry is meaningful only if the value of the PageMode entry in the catalog dictionary (see Section 3.6.1, "Document Catalog") is FullScreen; it is ignored otherwise. Default value: UseNone.</li><li>ViewArea name (Optional; PDF 1.4) The name of the page boundary representing the area of a page to be displayed when viewing the document on the screen. Valid values are (see Section 10.10.1, "Page Boundaries").:<ul><li>MediaBox</li><li>CropBox (default)</li><li>BleedBox</li><li>TrimBox</li><li>ArtBox</li></ul></li><li>ViewClip name (Optional; PDF 1.4) The name of the page boundary to which the contents of a page are to be clipped when viewing the document on the screen. Valid values are (see Section 10.10.1, "Page Boundaries").:<ul><li>MediaBox</li><li>CropBox (default)</li><li>BleedBox</li><li>TrimBox</li><li>ArtBox</li></ul></li><li>PrintArea name (Optional; PDF 1.4) The name of the page boundary representing the area of a page to be rendered when printing the document. Valid values are (see Section 10.10.1, "Page Boundaries").:<ul><li>MediaBox</li><li>CropBox (default)</li><li>BleedBox</li><li>TrimBox</li><li>ArtBox</li></ul></li><li>PrintClip name (Optional; PDF 1.4) The name of the page boundary to which the contents of a page are to be clipped when printing the document. Valid values are (see Section 10.10.1, "Page Boundaries").:<ul><li>MediaBox</li><li>CropBox (default)</li><li>BleedBox</li><li>TrimBox</li><li>ArtBox</li></ul></li><li>PrintScaling name (Optional; PDF 1.6) The page scaling option to be selected when a print dialog is displayed for this document. Valid values are: <ul><li>None, which indicates that the print dialog should reflect no page scaling</li><li>AppDefault (default), which indicates that applications should use the current print scaling</li></ul></li><li>Duplex name (Optional; PDF 1.7) The paper handling option to use when printing the file from the print dialog. The following values are valid:<ul><li>Simplex - Print single-sided</li><li>DuplexFlipShortEdge - Duplex and flip on the short edge of the sheet</li><li>DuplexFlipLongEdge - Duplex and flip on the long edge of the sheet</li></ul>Default value: none</li><li>PickTrayByPDFSize boolean (Optional; PDF 1.7) A flag specifying whether the PDF page size is used to select the input paper tray. This setting influences only the preset values used to populate the print dialog presented by a PDF viewer application. If PickTrayByPDFSize is true, the check box in the print dialog associated with input paper tray is checked. Note: This setting has no effect on Mac OS systems, which do not provide the ability to pick the input tray by size.</li><li>PrintPageRange array (Optional; PDF 1.7) The page numbers used to initialize the print dialog box when the file is printed. The first page of the PDF file is denoted by 1. Each pair consists of the first and last pages in the sub-range. An odd number of integers causes this entry to be ignored. Negative numbers cause the entire array to be ignored. Default value: as defined by PDF viewer application</li><li>NumCopies integer (Optional; PDF 1.7) The number of copies to be printed when the print dialog is opened for this file. Supported values are the integers 2 through 5. Values outside this range are ignored. Default value: as defined by PDF viewer application, but typically 1</li></ul> + * @param array $preferences array of options. + * @author Nicola Asuni + * @access public + * @since 3.1.000 (2008-06-09) + */ + public function setViewerPreferences($preferences) { + $this->viewer_preferences = $preferences; + } + + /** + * Paints color transition registration bars + * @param float $x abscissa of the top left corner of the rectangle. + * @param float $y ordinate of the top left corner of the rectangle. + * @param float $w width of the rectangle. + * @param float $h height of the rectangle. + * @param boolean $transition if true prints tcolor transitions to white. + * @param boolean $vertical if true prints bar vertically. + * @param string $colors colors to print, one letter per color separated by comma (for example 'A,W,R,G,B,C,M,Y,K'): A=black, W=white, R=red, G=green, B=blue, C=cyan, M=magenta, Y=yellow, K=black. + * @author Nicola Asuni + * @since 4.9.000 (2010-03-26) + * @access public + */ + public function colorRegistrationBar($x, $y, $w, $h, $transition=true, $vertical=false, $colors='A,R,G,B,C,M,Y,K') { + $bars = explode(',', $colors); + $numbars = count($bars); // number of bars to print + // set bar measures + if ($vertical) { + $coords = array(0, 0, 0, 1); + $wb = $w / $numbars; // bar width + $hb = $h; // bar height + $xd = $wb; // delta x + $yd = 0; // delta y + } else { + $coords = array(1, 0, 0, 0); + $wb = $w; // bar width + $hb = $h / $numbars; // bar height + $xd = 0; // delta x + $yd = $hb; // delta y + } + $xb = $x; + $yb = $y; + foreach ($bars as $col) { + switch ($col) { + // set transition colors + case 'A': { // BLACK + $col_a = array(255); + $col_b = array(0); + break; + } + case 'W': { // WHITE + $col_a = array(0); + $col_b = array(255); + break; + } + case 'R': { // R + $col_a = array(255,255,255); + $col_b = array(255,0,0); + break; + } + case 'G': { // G + $col_a = array(255,255,255); + $col_b = array(0,255,0); + break; + } + case 'B': { // B + $col_a = array(255,255,255); + $col_b = array(0,0,255); + break; + } + case 'C': { // C + $col_a = array(0,0,0,0); + $col_b = array(100,0,0,0); + break; + } + case 'M': { // M + $col_a = array(0,0,0,0); + $col_b = array(0,100,0,0); + break; + } + case 'Y': { // Y + $col_a = array(0,0,0,0); + $col_b = array(0,0,100,0); + break; + } + case 'K': { // K + $col_a = array(0,0,0,0); + $col_b = array(0,0,0,100); + break; + } + default: { // GRAY + $col_a = array(255); + $col_b = array(0); + break; + } + } + if ($transition) { + // color gradient + $this->LinearGradient($xb, $yb, $wb, $hb, $col_a, $col_b, $coords); + } else { + // color rectangle + $this->SetFillColorArray($col_b); + $this->Rect($xb, $yb, $wb, $hb, 'F', array()); + } + $xb += $xd; + $yb += $yd; + } + } + + /** + * Paints crop mark + * @param float $x abscissa of the crop mark center. + * @param float $y ordinate of the crop mark center. + * @param float $w width of the crop mark. + * @param float $h height of the crop mark. + * @param string $type type of crop mark, one sybol per type separated by comma: A = top left, B = top right, C = bottom left, D = bottom right. + * @param array $color crop mark color (default black). + * @author Nicola Asuni + * @since 4.9.000 (2010-03-26) + * @access public + */ + public function cropMark($x, $y, $w, $h, $type='A,B,C,D', $color=array(0,0,0)) { + $this->SetLineStyle(array('width' => (0.5 / $this->k), 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => $color)); + $crops = explode(',', $type); + $numcrops = count($crops); // number of crop marks to print + $dw = $w / 4; // horizontal space to leave before the intersection point + $dh = $h / 4; // vertical space to leave before the intersection point + foreach ($crops as $crop) { + switch ($crop) { + case 'A': { + $x1 = $x; + $y1 = $y - $h; + $x2 = $x; + $y2 = $y - $dh; + $x3 = $x - $w; + $y3 = $y; + $x4 = $x - $dw; + $y4 = $y; + break; + } + case 'B': { + $x1 = $x; + $y1 = $y - $h; + $x2 = $x; + $y2 = $y - $dh; + $x3 = $x + $dw; + $y3 = $y; + $x4 = $x + $w; + $y4 = $y; + break; + } + case 'C': { + $x1 = $x - $w; + $y1 = $y; + $x2 = $x - $dw; + $y2 = $y; + $x3 = $x; + $y3 = $y + $dh; + $x4 = $x; + $y4 = $y + $h; + break; + } + case 'D': { + $x1 = $x + $dw; + $y1 = $y; + $x2 = $x + $w; + $y2 = $y; + $x3 = $x; + $y3 = $y + $dh; + $x4 = $x; + $y4 = $y + $h; + break; + } + } + $this->Line($x1, $y1, $x2, $y2); + $this->Line($x3, $y3, $x4, $y4); + } + } + + /** + * Paints a registration mark + * @param float $x abscissa of the registration mark center. + * @param float $y ordinate of the registration mark center. + * @param float $r radius of the crop mark. + * @param boolean $double if true print two concentric crop marks. + * @param array $cola crop mark color (default black). + * @param array $colb second crop mark color. + * @author Nicola Asuni + * @since 4.9.000 (2010-03-26) + * @access public + */ + public function registrationMark($x, $y, $r, $double=false, $cola=array(0,0,0), $colb=array(255,255,255)) { + $line_style = array('width' => (0.5 / $this->k), 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => $cola); + $this->SetFillColorArray($cola); + $this->PieSector($x, $y, $r, 90, 180, 'F'); + $this->PieSector($x, $y, $r, 270, 360, 'F'); + $this->Circle($x, $y, $r, 0, 360, 'C', $line_style, array(), 8); + if ($double) { + $r2 = $r * 0.5; + $this->SetFillColorArray($colb); + $this->PieSector($x, $y, $r2, 90, 180, 'F'); + $this->PieSector($x, $y, $r2, 270, 360, 'F'); + $this->SetFillColorArray($cola); + $this->PieSector($x, $y, $r2, 0, 90, 'F'); + $this->PieSector($x, $y, $r2, 180, 270, 'F'); + $this->Circle($x, $y, $r2, 0, 360, 'C', $line_style, array(), 8); + } + } + + /** + * Paints a linear colour gradient. + * @param float $x abscissa of the top left corner of the rectangle. + * @param float $y ordinate of the top left corner of the rectangle. + * @param float $w width of the rectangle. + * @param float $h height of the rectangle. + * @param array $col1 first color (Grayscale, RGB or CMYK components). + * @param array $col2 second color (Grayscale, RGB or CMYK components). + * @param array $coords array of the form (x1, y1, x2, y2) which defines the gradient vector (see linear_gradient_coords.jpg). The default value is from left to right (x1=0, y1=0, x2=1, y2=0). + * @author Andreas Wrmser, Nicola Asuni + * @since 3.1.000 (2008-06-09) + * @access public + */ + public function LinearGradient($x, $y, $w, $h, $col1=array(), $col2=array(), $coords=array(0,0,1,0)) { + $this->Clip($x, $y, $w, $h); + $this->Gradient(2, $coords, array(array('color' => $col1, 'offset' => 0, 'exponent' => 1), array('color' => $col2, 'offset' => 1, 'exponent' => 1)), array(), false); + } + + /** + * Paints a radial colour gradient. + * @param float $x abscissa of the top left corner of the rectangle. + * @param float $y ordinate of the top left corner of the rectangle. + * @param float $w width of the rectangle. + * @param float $h height of the rectangle. + * @param array $col1 first color (Grayscale, RGB or CMYK components). + * @param array $col2 second color (Grayscale, RGB or CMYK components). + * @param array $coords array of the form (fx, fy, cx, cy, r) where (fx, fy) is the starting point of the gradient with color1, (cx, cy) is the center of the circle with color2, and r is the radius of the circle (see radial_gradient_coords.jpg). (fx, fy) should be inside the circle, otherwise some areas will not be defined. + * @author Andreas Wrmser, Nicola Asuni + * @since 3.1.000 (2008-06-09) + * @access public + */ + public function RadialGradient($x, $y, $w, $h, $col1=array(), $col2=array(), $coords=array(0.5,0.5,0.5,0.5,1)) { + $this->Clip($x, $y, $w, $h); + $this->Gradient(3, $coords, array(array('color' => $col1, 'offset' => 0, 'exponent' => 1), array('color' => $col2, 'offset' => 1, 'exponent' => 1)), array(), false); + } + + /** + * Paints a coons patch mesh. + * @param float $x abscissa of the top left corner of the rectangle. + * @param float $y ordinate of the top left corner of the rectangle. + * @param float $w width of the rectangle. + * @param float $h height of the rectangle. + * @param array $col1 first color (lower left corner) (RGB components). + * @param array $col2 second color (lower right corner) (RGB components). + * @param array $col3 third color (upper right corner) (RGB components). + * @param array $col4 fourth color (upper left corner) (RGB components). + * @param array $coords <ul><li>for one patch mesh: array(float x1, float y1, .... float x12, float y12): 12 pairs of coordinates (normally from 0 to 1) which specify the Bezier control points that define the patch. First pair is the lower left edge point, next is its right control point (control point 2). Then the other points are defined in the order: control point 1, edge point, control point 2 going counter-clockwise around the patch. Last (x12, y12) is the first edge point's left control point (control point 1).</li><li>for two or more patch meshes: array[number of patches]: arrays with the following keys for each patch: f: where to put that patch (0 = first patch, 1, 2, 3 = right, top and left of precedent patch - I didn't figure this out completely - just try and error ;-) points: 12 pairs of coordinates of the Bezier control points as above for the first patch, 8 pairs of coordinates for the following patches, ignoring the coordinates already defined by the precedent patch (I also didn't figure out the order of these - also: try and see what's happening) colors: must be 4 colors for the first patch, 2 colors for the following patches</li></ul> + * @param array $coords_min minimum value used by the coordinates. If a coordinate's value is smaller than this it will be cut to coords_min. default: 0 + * @param array $coords_max maximum value used by the coordinates. If a coordinate's value is greater than this it will be cut to coords_max. default: 1 + * @param boolean $antialias A flag indicating whether to filter the shading function to prevent aliasing artifacts. + * @author Andreas Wrmser, Nicola Asuni + * @since 3.1.000 (2008-06-09) + * @access public + */ + public function CoonsPatchMesh($x, $y, $w, $h, $col1=array(), $col2=array(), $col3=array(), $col4=array(), $coords=array(0.00,0.0,0.33,0.00,0.67,0.00,1.00,0.00,1.00,0.33,1.00,0.67,1.00,1.00,0.67,1.00,0.33,1.00,0.00,1.00,0.00,0.67,0.00,0.33), $coords_min=0, $coords_max=1, $antialias=false) { + $this->Clip($x, $y, $w, $h); + $n = count($this->gradients) + 1; + $this->gradients[$n] = array(); + $this->gradients[$n]['type'] = 6; //coons patch mesh + $this->gradients[$n]['coords'] = array(); + $this->gradients[$n]['antialias'] = $antialias; + $this->gradients[$n]['colors'] = array(); + $this->gradients[$n]['transparency'] = false; + //check the coords array if it is the simple array or the multi patch array + if (!isset($coords[0]['f'])) { + //simple array -> convert to multi patch array + if (!isset($col1[1])) { + $col1[1] = $col1[2] = $col1[0]; + } + if (!isset($col2[1])) { + $col2[1] = $col2[2] = $col2[0]; + } + if (!isset($col3[1])) { + $col3[1] = $col3[2] = $col3[0]; + } + if (!isset($col4[1])) { + $col4[1] = $col4[2] = $col4[0]; + } + $patch_array[0]['f'] = 0; + $patch_array[0]['points'] = $coords; + $patch_array[0]['colors'][0]['r'] = $col1[0]; + $patch_array[0]['colors'][0]['g'] = $col1[1]; + $patch_array[0]['colors'][0]['b'] = $col1[2]; + $patch_array[0]['colors'][1]['r'] = $col2[0]; + $patch_array[0]['colors'][1]['g'] = $col2[1]; + $patch_array[0]['colors'][1]['b'] = $col2[2]; + $patch_array[0]['colors'][2]['r'] = $col3[0]; + $patch_array[0]['colors'][2]['g'] = $col3[1]; + $patch_array[0]['colors'][2]['b'] = $col3[2]; + $patch_array[0]['colors'][3]['r'] = $col4[0]; + $patch_array[0]['colors'][3]['g'] = $col4[1]; + $patch_array[0]['colors'][3]['b'] = $col4[2]; + } else { + //multi patch array + $patch_array = $coords; + } + $bpcd = 65535; //16 bits per coordinate + //build the data stream + $this->gradients[$n]['stream'] = ''; + $count_patch = count($patch_array); + for ($i=0; $i < $count_patch; ++$i) { + $this->gradients[$n]['stream'] .= chr($patch_array[$i]['f']); //start with the edge flag as 8 bit + $count_points = count($patch_array[$i]['points']); + for ($j=0; $j < $count_points; ++$j) { + //each point as 16 bit + $patch_array[$i]['points'][$j] = (($patch_array[$i]['points'][$j] - $coords_min) / ($coords_max - $coords_min)) * $bpcd; + if ($patch_array[$i]['points'][$j] < 0) { + $patch_array[$i]['points'][$j] = 0; + } + if ($patch_array[$i]['points'][$j] > $bpcd) { + $patch_array[$i]['points'][$j] = $bpcd; + } + $this->gradients[$n]['stream'] .= chr(floor($patch_array[$i]['points'][$j] / 256)); + $this->gradients[$n]['stream'] .= chr(floor($patch_array[$i]['points'][$j] % 256)); + } + $count_cols = count($patch_array[$i]['colors']); + for ($j=0; $j < $count_cols; ++$j) { + //each color component as 8 bit + $this->gradients[$n]['stream'] .= chr($patch_array[$i]['colors'][$j]['r']); + $this->gradients[$n]['stream'] .= chr($patch_array[$i]['colors'][$j]['g']); + $this->gradients[$n]['stream'] .= chr($patch_array[$i]['colors'][$j]['b']); + } + } + //paint the gradient + $this->_out('/Sh'.$n.' sh'); + //restore previous Graphic State + $this->_out('Q'); + } + + /** + * Set a rectangular clipping area. + * @param float $x abscissa of the top left corner of the rectangle (or top right corner for RTL mode). + * @param float $y ordinate of the top left corner of the rectangle. + * @param float $w width of the rectangle. + * @param float $h height of the rectangle. + * @author Andreas Wrmser, Nicola Asuni + * @since 3.1.000 (2008-06-09) + * @access protected + */ + protected function Clip($x, $y, $w, $h) { + if ($this->rtl) { + $x = $this->w - $x - $w; + } + //save current Graphic State + $s = 'q'; + //set clipping area + $s .= sprintf(' %.2F %.2F %.2F %.2F re W n', $x*$this->k, ($this->h-$y)*$this->k, $w*$this->k, -$h*$this->k); + //set up transformation matrix for gradient + $s .= sprintf(' %.3F 0 0 %.3F %.3F %.3F cm', $w*$this->k, $h*$this->k, $x*$this->k, ($this->h-($y+$h))*$this->k); + $this->_out($s); + } + + /** + * Output gradient. + * @param int $type type of gradient (1 Function-based shading; 2 Axial shading; 3 Radial shading; 4 Free-form Gouraud-shaded triangle mesh; 5 Lattice-form Gouraud-shaded triangle mesh; 6 Coons patch mesh; 7 Tensor-product patch mesh). (Not all types are currently supported) + * @param array $coords array of coordinates. + * @param array $stops array gradient color components: color = array of GRAY, RGB or CMYK color components; offset = (0 to 1) represents a location along the gradient vector; exponent = exponent of the exponential interpolation function (default = 1). + * @param array $background An array of colour components appropriate to the colour space, specifying a single background colour value. + * @param boolean $antialias A flag indicating whether to filter the shading function to prevent aliasing artifacts. + * @author Nicola Asuni + * @since 3.1.000 (2008-06-09) + * @access public + */ + public function Gradient($type, $coords, $stops, $background=array(), $antialias=false) { + $n = count($this->gradients) + 1; + $this->gradients[$n] = array(); + $this->gradients[$n]['type'] = $type; + $this->gradients[$n]['coords'] = $coords; + $this->gradients[$n]['antialias'] = $antialias; + $this->gradients[$n]['colors'] = array(); + $this->gradients[$n]['transparency'] = false; + // color space + $numcolspace = count($stops[0]['color']); + $bcolor = array_values($background); + switch($numcolspace) { + case 4: { // CMYK + $this->gradients[$n]['colspace'] = 'DeviceCMYK'; + if (!empty($background)) { + $this->gradients[$n]['background'] = sprintf('%.3F %.3F %.3F %.3F', $bcolor[0]/100, $bcolor[1]/100, $bcolor[2]/100, $bcolor[3]/100); + } + break; + } + case 3: { // RGB + $this->gradients[$n]['colspace'] = 'DeviceRGB'; + if (!empty($background)) { + $this->gradients[$n]['background'] = sprintf('%.3F %.3F %.3F', $bcolor[0]/255, $bcolor[1]/255, $bcolor[2]/255); + } + break; + } + case 1: { // Gray scale + $this->gradients[$n]['colspace'] = 'DeviceGray'; + if (!empty($background)) { + $this->gradients[$n]['background'] = sprintf('%.3F', $bcolor[0]/255); + } + break; + } + } + $num_stops = count($stops); + $last_stop_id = $num_stops - 1; + foreach ($stops as $key => $stop) { + $this->gradients[$n]['colors'][$key] = array(); + // offset represents a location along the gradient vector + if (isset($stop['offset'])) { + $this->gradients[$n]['colors'][$key]['offset'] = $stop['offset']; + } else { + if ($key == 0) { + $this->gradients[$n]['colors'][$key]['offset'] = 0; + } elseif ($key == $last_stop_id) { + $this->gradients[$n]['colors'][$key]['offset'] = 1; + } else { + $offsetstep = (1 - $this->gradients[$n]['colors'][($key - 1)]['offset']) / ($num_stops - $key); + $this->gradients[$n]['colors'][$key]['offset'] = $this->gradients[$n]['colors'][($key - 1)]['offset'] + $offsetstep; + } + } + if (isset($stop['opacity'])) { + $this->gradients[$n]['colors'][$key]['opacity'] = $stop['opacity']; + if ($stop['opacity'] < 1) { + $this->gradients[$n]['transparency'] = true; + } + } else { + $this->gradients[$n]['colors'][$key]['opacity'] = 1; + } + // exponent for the exponential interpolation function + if (isset($stop['exponent'])) { + $this->gradients[$n]['colors'][$key]['exponent'] = $stop['exponent']; + } else { + $this->gradients[$n]['colors'][$key]['exponent'] = 1; + } + // set colors + $color = array_values($stop['color']); + switch($numcolspace) { + case 4: { // CMYK + $this->gradients[$n]['colors'][$key]['color'] = sprintf('%.3F %.3F %.3F %.3F', $color[0]/100, $color[1]/100, $color[2]/100, $color[3]/100); + break; + } + case 3: { // RGB + $this->gradients[$n]['colors'][$key]['color'] = sprintf('%.3F %.3F %.3F', $color[0]/255, $color[1]/255, $color[2]/255); + break; + } + case 1: { // Gray scale + $this->gradients[$n]['colors'][$key]['color'] = sprintf('%.3F', $color[0]/255); + break; + } + } + } + if ($this->gradients[$n]['transparency']) { + // paint luminosity gradient + $this->_out('/TGS'.$n.' gs'); + } + //paint the gradient + $this->_out('/Sh'.$n.' sh'); + //restore previous Graphic State + $this->_out('Q'); + } + + /** + * Output gradient shaders. + * @author Nicola Asuni + * @since 3.1.000 (2008-06-09) + * @access protected + */ + function _putshaders() { + $idt = count($this->gradients); //index for transparency gradients + foreach ($this->gradients as $id => $grad) { + if (($grad['type'] == 2) OR ($grad['type'] == 3)) { + $this->_newobj(); + $fc = $this->n; + $out = '<<'; + $out .= ' /FunctionType 3'; + $out .= ' /Domain [0 1]'; + $functions = ''; + $bounds = ''; + $encode = ''; + $i = 1; + $num_cols = count($grad['colors']); + $lastcols = $num_cols - 1; + for ($i = 1; $i < $num_cols; ++$i) { + $functions .= ($fc + $i).' 0 R '; + if ($i < $lastcols) { + $bounds .= sprintf('%.3F ', $grad['colors'][$i]['offset']); + } + $encode .= '0 1 '; + } + $out .= ' /Functions ['.trim($functions).']'; + $out .= ' /Bounds ['.trim($bounds).']'; + $out .= ' /Encode ['.trim($encode).']'; + $out .= ' >>'; + $out .= ' endobj'; + $this->_out($out); + for ($i = 1; $i < $num_cols; ++$i) { + $this->_newobj(); + $out = '<<'; + $out .= ' /FunctionType 2'; + $out .= ' /Domain [0 1]'; + $out .= ' /C0 ['.$grad['colors'][($i - 1)]['color'].']'; + $out .= ' /C1 ['.$grad['colors'][$i]['color'].']'; + $out .= ' /N '.$grad['colors'][$i]['exponent']; + $out .= ' >>'; + $out .= ' endobj'; + $this->_out($out); + } + // set transparency fuctions + if ($grad['transparency']) { + $this->_newobj(); + $ft = $this->n; + $out = '<<'; + $out .= ' /FunctionType 3'; + $out .= ' /Domain [0 1]'; + $functions = ''; + $i = 1; + $num_cols = count($grad['colors']); + for ($i = 1; $i < $num_cols; ++$i) { + $functions .= ($ft + $i).' 0 R '; + } + $out .= ' /Functions ['.trim($functions).']'; + $out .= ' /Bounds ['.trim($bounds).']'; + $out .= ' /Encode ['.trim($encode).']'; + $out .= ' >>'; + $out .= ' endobj'; + $this->_out($out); + for ($i = 1; $i < $num_cols; ++$i) { + $this->_newobj(); + $out = '<<'; + $out .= ' /FunctionType 2'; + $out .= ' /Domain [0 1]'; + $out .= ' /C0 ['.$grad['colors'][($i - 1)]['opacity'].']'; + $out .= ' /C1 ['.$grad['colors'][$i]['opacity'].']'; + $out .= ' /N '.$grad['colors'][$i]['exponent']; + $out .= ' >>'; + $out .= ' endobj'; + $this->_out($out); + } + } + } + // set shading object + $this->_newobj(); + $out = '<< /ShadingType '.$grad['type']; + if (isset($grad['colspace'])) { + $out .= ' /ColorSpace /'.$grad['colspace']; + } else { + $out .= ' /ColorSpace /DeviceRGB'; + } + if (isset($grad['background']) AND !empty($grad['background'])) { + $out .= ' /Background ['.$grad['background'].']'; + } + if (isset($grad['antialias']) AND ($grad['antialias'] === true)) { + $out .= ' /AntiAlias true'; + } + if ($grad['type'] == 2) { + $out .= ' '.sprintf('/Coords [%.3F %.3F %.3F %.3F]', $grad['coords'][0], $grad['coords'][1], $grad['coords'][2], $grad['coords'][3]); + $out .= ' /Domain [0 1]'; + $out .= ' /Function '.$fc.' 0 R'; + $out .= ' /Extend [true true]'; + $out .= ' >>'; + } elseif ($grad['type'] == 3) { + //x0, y0, r0, x1, y1, r1 + //at this this time radius of inner circle is 0 + $out .= ' '.sprintf('/Coords [%.3F %.3F 0 %.3F %.3F %.3F]', $grad['coords'][0], $grad['coords'][1], $grad['coords'][2], $grad['coords'][3], $grad['coords'][4]); + $out .= ' /Domain [0 1]'; + $out .= ' /Function '.$fc.' 0 R'; + $out .= ' /Extend [true true]'; + $out .= ' >>'; + } elseif ($grad['type'] == 6) { + $out .= ' /BitsPerCoordinate 16'; + $out .= ' /BitsPerComponent 8'; + $out .= ' /Decode[0 1 0 1 0 1 0 1 0 1]'; + $out .= ' /BitsPerFlag 8'; + $out .= ' /Length '.strlen($grad['stream']); + $out .= ' >>'; + $out .= ' '.$this->_getstream($grad['stream']); + } + $out .= ' endobj'; + $this->_out($out); + if ($grad['transparency']) { + $shading_transparency = preg_replace('/\/ColorSpace \/[^\s]+/si', '/ColorSpace /DeviceGray', $out); + $shading_transparency = preg_replace('/\/Function [0-9]+ /si', '/Function '.$ft.' ', $shading_transparency); + } + $this->gradients[$id]['id'] = $this->n; + // set pattern object + $this->_newobj(); + $out = '<< /Type /Pattern /PatternType 2'; + $out .= ' /Shading '.$this->gradients[$id]['id'].' 0 R'; + $out .= ' >> endobj'; + $this->_out($out); + $this->gradients[$id]['pattern'] = $this->n; + // set shading and pattern for transparency mask + if ($grad['transparency']) { + // luminosity pattern + $idgs = $id + $idt; + $this->_newobj(); + $this->_out($shading_transparency); + $this->gradients[$idgs]['id'] = $this->n; + $this->_newobj(); + $out = '<< /Type /Pattern /PatternType 2'; + $out .= ' /Shading '.$this->gradients[$idgs]['id'].' 0 R'; + $out .= ' >> endobj'; + $this->_out($out); + $this->gradients[$idgs]['pattern'] = $this->n; + // luminosity XObject + $this->_newobj(); + $filter = ($this->compress)?' /Filter /FlateDecode':''; + $out = '<< /Type /XObject /Subtype /Form /FormType 1'.$filter; + $stream = 'q /a0 gs /Pattern cs /p'.$idgs.' scn 0 0 '.$this->wPt.' '.$this->hPt.' re f Q'; + $out .= ' /Length '.strlen($stream); + $out .= ' /BBox [0 0 '.$this->wPt.' '.$this->hPt.']'; + $out .= ' /Group << /Type /Group /S /Transparency /CS /DeviceGray >>'; + $out .= ' /Resources <<'; + $out .= ' /ExtGState << /a0 << /ca 1 /CA 1 >> >>'; + $out .= ' /Pattern << /p'.$idgs.' '.$this->gradients[$idgs]['pattern'].' 0 R >>'; + $out .= ' >>'; + $out .= ' >> '; + $out .= $this->_getstream($stream); + $out .= ' endobj'; + $this->_out($out); + // SMask + $this->_newobj(); + $out = '<< /Type /Mask /S /Luminosity /G '.($this->n - 1).' 0 R >> endobj'; + $this->_out($out); + // ExtGState + $this->_newobj(); + $out = '<< /Type /ExtGState /SMask '.($this->n - 1).' 0 R /AIS false >> endobj'; + $this->_out($out); + $this->extgstates[] = array('n' => $this->n, 'name' => 'TGS'.$id); + } + } + } + + /** + * Draw the sector of a circle. + * It can be used for instance to render pie charts. + * @param float $xc abscissa of the center. + * @param float $yc ordinate of the center. + * @param float $r radius. + * @param float $a start angle (in degrees). + * @param float $b end angle (in degrees). + * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. + * @param float $cw: indicates whether to go clockwise (default: true). + * @param float $o: origin of angles (0 for 3 o'clock, 90 for noon, 180 for 9 o'clock, 270 for 6 o'clock). Default: 90. + * @author Maxime Delorme, Nicola Asuni + * @since 3.1.000 (2008-06-09) + * @access public + */ + public function PieSector($xc, $yc, $r, $a, $b, $style='FD', $cw=true, $o=90) { + $this->PieSectorXY($xc, $yc, $r, $r, $a, $b, $style, $cw, $o); + } + + /** + * Draw the sector of an ellipse. + * It can be used for instance to render pie charts. + * @param float $xc abscissa of the center. + * @param float $yc ordinate of the center. + * @param float $rx the x-axis radius. + * @param float $ry the y-axis radius. + * @param float $a start angle (in degrees). + * @param float $b end angle (in degrees). + * @param string $style Style of rendering. See the getPathPaintOperator() function for more information. + * @param float $cw: indicates whether to go clockwise. + * @param float $o: origin of angles (0 for 3 o'clock, 90 for noon, 180 for 9 o'clock, 270 for 6 o'clock). + * @param integer $nc Number of curves used to draw a 90 degrees portion of arc. + * @author Maxime Delorme, Nicola Asuni + * @since 3.1.000 (2008-06-09) + * @access public + */ + public function PieSectorXY($xc, $yc, $rx, $ry, $a, $b, $style='FD', $cw=false, $o=0, $nc=2) { + if ($this->rtl) { + $xc = $this->w - $xc; + } + $op = $this->getPathPaintOperator($style); + if ($op == 'f') { + $line_style = array(); + } + if ($cw) { + $d = $b; + $b = 360 - $a + $o; + $a = 360 - $d + $o; + } else { + $b += $o; + $a += $o; + } + $this->_outellipticalarc($xc, $yc, $rx, $ry, 0, $a, $b, true, $nc); + $this->_out($op); + } + + /** + * Embed vector-based Adobe Illustrator (AI) or AI-compatible EPS files. + * NOTE: EPS is not yet fully implemented, use the setRasterizeVectorImages() method to enable/disable rasterization of SVG images using ImageMagick library. + * Only vector drawing is supported, not text or bitmap. + * Although the script was successfully tested with various AI format versions, best results are probably achieved with files that were exported in the AI3 format (tested with Illustrator CS2, Freehand MX and Photoshop CS2). + * @param string $file Name of the file containing the image. + * @param float $x Abscissa of the upper-left corner. + * @param float $y Ordinate of the upper-left corner. + * @param float $w Width of the image in the page. If not specified or equal to zero, it is automatically calculated. + * @param float $h Height of the image in the page. If not specified or equal to zero, it is automatically calculated. + * @param mixed $link URL or identifier returned by AddLink(). + * @param boolean useBoundingBox specifies whether to position the bounding box (true) or the complete canvas (false) at location (x,y). Default value is true. + * @param string $align Indicates the alignment of the pointer next to image insertion relative to image height. The value can be:<ul><li>T: top-right for LTR or top-left for RTL</li><li>M: middle-right for LTR or middle-left for RTL</li><li>B: bottom-right for LTR or bottom-left for RTL</li><li>N: next line</li></ul> + * @param string $palign Allows to center or align the image on the current line. Possible values are:<ul><li>L : left align</li><li>C : center</li><li>R : right align</li><li>'' : empty string : left for LTR or right for RTL</li></ul> + * @param mixed $border Indicates if borders must be drawn around the image. The value can be either a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul>or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> + * @param boolean $fitonpage if true the image is resized to not exceed page dimensions. + * @author Valentin Schmidt, Nicola Asuni + * @since 3.1.000 (2008-06-09) + * @access public + */ + public function ImageEps($file, $x='', $y='', $w=0, $h=0, $link='', $useBoundingBox=true, $align='', $palign='', $border=0, $fitonpage=false) { + if ($this->rasterize_vector_images) { + // convert SVG to raster image using GD or ImageMagick libraries + return $this->Image($file, $x, $y, $w, $h, 'EPS', $link, $align, true, 300, $palign, false, false, $border, false, false, $fitonpage); + } + if ($x === '') { + $x = $this->x; + } + if ($y === '') { + $y = $this->y; + } + $k = $this->k; + $data = file_get_contents($file); + if ($data === false) { + $this->Error('EPS file not found: '.$file); + } + $regs = array(); + // EPS/AI compatibility check (only checks files created by Adobe Illustrator!) + preg_match("/%%Creator:([^\r\n]+)/", $data, $regs); # find Creator + if (count($regs) > 1) { + $version_str = trim($regs[1]); # e.g. "Adobe Illustrator(R) 8.0" + if (strpos($version_str, 'Adobe Illustrator') !== false) { + $versexp = explode(' ', $version_str); + $version = (float)array_pop($versexp); + if ($version >= 9) { + $this->Error('This version of Adobe Illustrator file is not supported: '.$file); + } + } + } + // strip binary bytes in front of PS-header + $start = strpos($data, '%!PS-Adobe'); + if ($start > 0) { + $data = substr($data, $start); + } + // find BoundingBox params + preg_match("/%%BoundingBox:([^\r\n]+)/", $data, $regs); + if (count($regs) > 1) { + list($x1, $y1, $x2, $y2) = explode(' ', trim($regs[1])); + } else { + $this->Error('No BoundingBox found in EPS file: '.$file); + } + $start = strpos($data, '%%EndSetup'); + if ($start === false) { + $start = strpos($data, '%%EndProlog'); + } + if ($start === false) { + $start = strpos($data, '%%BoundingBox'); + } + $data = substr($data, $start); + $end = strpos($data, '%%PageTrailer'); + if ($end===false) { + $end = strpos($data, 'showpage'); + } + if ($end) { + $data = substr($data, 0, $end); + } + // calculate image width and height on document + if (($w <= 0) AND ($h <= 0)) { + $w = ($x2 - $x1) / $k; + $h = ($y2 - $y1) / $k; + } elseif ($w <= 0) { + $w = ($x2-$x1) / $k * ($h / (($y2 - $y1) / $k)); + } elseif ($h <= 0) { + $h = ($y2 - $y1) / $k * ($w / (($x2 - $x1) / $k)); + } + // Check whether we need a new page first as this does not fit + $prev_x = $this->x; + if ($this->checkPageBreak($h, $y)) { + $y = $this->y; + if ($this->rtl) { + $x += ($prev_x - $this->x); + } else { + $x += ($this->x - $prev_x); + } + } + // resize image to be contained on a single page + if ($fitonpage) { + $ratio_wh = $w / $h; + if (($y + $h) > $this->PageBreakTrigger) { + $h = $this->PageBreakTrigger - $y; + $w = $h * $ratio_wh; + } + if (($x + $w) > ($this->w - $this->rMargin)) { + $w = $this->w - $this->rMargin - $x; + $h = $w / $ratio_wh; + } + } + // set scaling factors + $scale_x = $w / (($x2 - $x1) / $k); + $scale_y = $h / (($y2 - $y1) / $k); + // set alignment + $this->img_rb_y = $y + $h; + // set alignment + if ($this->rtl) { + if ($palign == 'L') { + $ximg = $this->lMargin; + } elseif ($palign == 'C') { + $ximg = ($this->w - $w) / 2; + } elseif ($palign == 'R') { + $ximg = $this->w - $this->rMargin - $w; + } else { + $ximg = $this->w - $x - $w; + } + $this->img_rb_x = $ximg; + } else { + if ($palign == 'L') { + $ximg = $this->lMargin; + } elseif ($palign == 'C') { + $ximg = ($this->w - $w) / 2; + } elseif ($palign == 'R') { + $ximg = $this->w - $this->rMargin - $w; + } else { + $ximg = $x; + } + $this->img_rb_x = $ximg + $w; + } + if ($useBoundingBox) { + $dx = $ximg * $k - $x1; + $dy = $y * $k - $y1; + } else { + $dx = $ximg * $k; + $dy = $y * $k; + } + // save the current graphic state + $this->_out('q'.$this->epsmarker); + // translate + $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F cm', 1, 0, 0, 1, $dx, $dy + ($this->hPt - (2 * $y * $k) - ($y2 - $y1)))); + // scale + if (isset($scale_x)) { + $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F cm', $scale_x, 0, 0, $scale_y, $x1 * (1 - $scale_x), $y2 * (1 - $scale_y))); + } + // handle pc/unix/mac line endings + preg_match('/[\r\n]+/s', $data, $regs); + $lines = explode($regs[0], $data); + $u=0; + $cnt = count($lines); + for ($i=0; $i < $cnt; ++$i) { + $line = $lines[$i]; + if (($line == '') OR ($line{0} == '%')) { + continue; + } + $len = strlen($line); + $chunks = explode(' ', $line); + $cmd = array_pop($chunks); + // RGB + if (($cmd == 'Xa') OR ($cmd == 'XA')) { + $b = array_pop($chunks); + $g = array_pop($chunks); + $r = array_pop($chunks); + $this->_out(''.$r.' '.$g.' '.$b.' '.($cmd=='Xa'?'rg':'RG')); //substr($line, 0, -2).'rg' -> in EPS (AI8): c m y k r g b rg! + continue; + } + switch ($cmd) { + case 'm': + case 'l': + case 'v': + case 'y': + case 'c': + case 'k': + case 'K': + case 'g': + case 'G': + case 's': + case 'S': + case 'J': + case 'j': + case 'w': + case 'M': + case 'd': + case 'n': { + $this->_out($line); + break; + } + case 'x': {// custom fill color + list($c,$m,$y,$k) = $chunks; + $this->_out(''.$c.' '.$m.' '.$y.' '.$k.' k'); + break; + } + case 'X': { // custom stroke color + list($c,$m,$y,$k) = $chunks; + $this->_out(''.$c.' '.$m.' '.$y.' '.$k.' K'); + break; + } + case 'Y': + case 'N': + case 'V': + case 'L': + case 'C': { + $line{$len-1} = strtolower($cmd); + $this->_out($line); + break; + } + case 'b': + case 'B': { + $this->_out($cmd . '*'); + break; + } + case 'f': + case 'F': { + if ($u > 0) { + $isU = false; + $max = min($i+5, $cnt); + for ($j=$i+1; $j < $max; ++$j) { + $isU = ($isU OR (($lines[$j] == 'U') OR ($lines[$j] == '*U'))); + } + if ($isU) { + $this->_out('f*'); + } + } else { + $this->_out('f*'); + } + break; + } + case '*u': { + ++$u; + break; + } + case '*U': { + --$u; + break; + } + } + } + // restore previous graphic state + $this->_out($this->epsmarker.'Q'); + if (!empty($border)) { + $bx = $x; + $by = $y; + $this->x = $ximg; + if ($this->rtl) { + $this->x += $w; + } + $this->y = $y; + $this->Cell($w, $h, '', $border, 0, '', 0, '', 0); + $this->x = $bx; + $this->y = $by; + } + if ($link) { + $this->Link($ximg, $y, $w, $h, $link, 0); + } + // set pointer to align the successive text/objects + switch($align) { + case 'T':{ + $this->y = $y; + $this->x = $this->img_rb_x; + break; + } + case 'M':{ + $this->y = $y + round($h/2); + $this->x = $this->img_rb_x; + break; + } + case 'B':{ + $this->y = $this->img_rb_y; + $this->x = $this->img_rb_x; + break; + } + case 'N':{ + $this->SetY($this->img_rb_y); + break; + } + default:{ + break; + } + } + $this->endlinex = $this->img_rb_x; + } + + /** + * Set document barcode. + * @param string $bc barcode + * @access public + */ + public function setBarcode($bc='') { + $this->barcode = $bc; + } + + /** + * Get current barcode. + * @return string + * @access public + * @since 4.0.012 (2008-07-24) + */ + public function getBarcode() { + return $this->barcode; + } + + /** + * Print a Linear Barcode. + * @param string $code code to print + * @param string $type type of barcode (see barcodes.php for supported formats). + * @param int $x x position in user units + * @param int $y y position in user units + * @param int $w width in user units + * @param int $h height in user units + * @param float $xres width of the smallest bar in user units + * @param array $style array of options:<ul><li>string $style['position'] barcode position inside the specified width: L = left (default for LTR); C = center; R = right (default for RTL); S = stretch</li><li>boolean $style['border'] if true prints a border around the barcode</li><li>int $style['padding'] padding to leave around the barcode in user units (set to 'auto' for automatic padding)</li><li>array $style['fgcolor'] color array for bars and text</li><li>mixed $style['bgcolor'] color array for background or false for transparent</li><li>boolean $style["text"] boolean if true prints text below the barcode</li><li>string $style['font'] font name for text</li><li>int $style['fontsize'] font size for text</li><li>int $style['stretchtext']: 0 = disabled; 1 = horizontal scaling only if necessary; 2 = forced horizontal scaling; 3 = character spacing only if necessary; 4 = forced character spacing</li></ul> + * @param string $align Indicates the alignment of the pointer next to barcode insertion relative to barcode height. The value can be:<ul><li>T: top-right for LTR or top-left for RTL</li><li>M: middle-right for LTR or middle-left for RTL</li><li>B: bottom-right for LTR or bottom-left for RTL</li><li>N: next line</li></ul> + * @author Nicola Asuni + * @since 3.1.000 (2008-06-09) + * @access public + */ + public function write1DBarcode($code, $type, $x='', $y='', $w='', $h='', $xres=0.4, $style='', $align='') { + if ($this->empty_string($code)) { + return; + } + require_once(dirname(__FILE__).'/barcodes.php'); + // save current graphic settings + $gvars = $this->getGraphicVars(); + // create new barcode object + $barcodeobj = new TCPDFBarcode($code, $type); + $arrcode = $barcodeobj->getBarcodeArray(); + if ($arrcode === false) { + $this->Error('Error in 1D barcode string'); + } + // set default values + if (!isset($style['position'])) { + if ($this->rtl) { + $style['position'] = 'R'; + } else { + $style['position'] = 'L'; + } + } + if (!isset($style['fgcolor'])) { + $style['fgcolor'] = array(0,0,0); // default black + } + if (!isset($style['bgcolor'])) { + $style['bgcolor'] = false; // default transparent + } + if (!isset($style['border'])) { + $style['border'] = false; + } + $fontsize = 0; + if (!isset($style['text'])) { + $style['text'] = false; + } + if ($style['text'] AND isset($style['font'])) { + if (isset($style['fontsize'])) { + $fontsize = $style['fontsize']; + } + $this->SetFont($style['font'], '', $fontsize); + } + if (!isset($style['stretchtext'])) { + $style['stretchtext'] = 4; + } + // set foreground color + $this->SetDrawColorArray($style['fgcolor']); + $this->SetTextColorArray($style['fgcolor']); + if ($this->empty_string($w) OR ($w <= 0)) { + if ($this->rtl) { + $w = $this->x - $this->lMargin; + } else { + $w = $this->w - $this->rMargin - $this->x; + } + } + if ($this->empty_string($x)) { + $x = $this->GetX(); + } + if ($this->rtl) { + $x = $this->w - $x; + } + if ($this->empty_string($y)) { + $y = $this->GetY(); + } + if ($this->empty_string($xres)) { + $xres = 0.4; + } + if ($this->empty_string($h) OR ($h <= 0)) { + $h = $w / 3; + } + // padding + if (!isset($style['padding'])) { + $style['padding'] = 0; + } elseif ($style['padding'] === 'auto') { + $style['padding'] = $h / 4; + } + $fbw = ($arrcode['maxw'] * $xres) + (2 * $style['padding']); + $extraspace = ($this->cell_height_ratio * $fontsize / $this->k) + (2 * $style['padding']); + $prev_x = $this->x; + // maximum bar height + $barh = $h; + $h += $extraspace; + if ($this->checkPageBreak($h, $y)) { + $y = $this->GetY() + $this->cMargin; + if ($this->rtl) { + $x += ($prev_x - $this->x); + } else { + $x += ($this->x - $prev_x); + } + } + switch ($style['position']) { + case 'L': { // left + if ($this->rtl) { + $xpos = $x - $w; + } else { + $xpos = $x; + } + break; + } + case 'C': { // center + $xdiff = (($w - $fbw) / 2); + if ($this->rtl) { + $xpos = $x - $w + $xdiff; + } else { + $xpos = $x + $xdiff; + } + break; + } + case 'R': { // right + if ($this->rtl) { + $xpos = $x - $fbw; + } else { + $xpos = $x + $w - $fbw; + } + break; + } + case 'S': { // stretch + $fbw = $w; + $xres = ($w - (2 * $style['padding'])) / $arrcode['maxw']; + if ($this->rtl) { + $xpos = $x - $w; + } else { + $xpos = $x; + } + break; + } + } + $xpos_rect = $xpos; + $xpos = $xpos_rect + $style['padding']; + $xpos_text = $xpos; + // barcode is always printed in LTR direction + $tempRTL = $this->rtl; + $this->rtl = false; + // print background color + if ($style['bgcolor']) { + $this->Rect($xpos_rect, $y, $fbw, $h, $style['border'] ? 'DF' : 'F', '', $style['bgcolor']); + } elseif ($style['border']) { + $this->Rect($xpos_rect, $y, $fbw, $h, 'D'); + } + // print bars + if ($arrcode !== false) { + foreach ($arrcode['bcode'] as $k => $v) { + $bw = ($v['w'] * $xres); + if ($v['t']) { + // draw a vertical bar + $ypos = $y + $style['padding'] + ($v['p'] * $barh / $arrcode['maxh']); + $this->Rect($xpos, $ypos, $bw, ($v['h'] * $barh / $arrcode['maxh']), 'F', array(), $style['fgcolor']); + } + $xpos += $bw; + } + } + // print text + if ($style['text']) { + // print text + $this->x = $xpos_text; + $this->y = $y + $style['padding'] + $barh; + $this->Cell(($arrcode['maxw'] * $xres), ($this->cell_height_ratio * $fontsize / $this->k), $code, 0, 0, 'C', 0, '', $style['stretchtext']); + } + // restore original direction + $this->rtl = $tempRTL; + // restore previous settings + $this->setGraphicVars($gvars); + // set bottomcoordinates + $this->img_rb_y = $y + $h; + if ($this->rtl) { + // set left side coordinate + $this->img_rb_x = ($this->w - $x - $w); + } else { + // set right side coordinate + $this->img_rb_x = $x + $w; + } + // set pointer to align the successive text/objects + switch($align) { + case 'T':{ + $this->y = $y; + $this->x = $this->img_rb_x; + break; + } + case 'M':{ + $this->y = $y + round($h/2); + $this->x = $this->img_rb_x; + break; + } + case 'B':{ + $this->y = $this->img_rb_y; + $this->x = $this->img_rb_x; + break; + } + case 'N':{ + $this->SetY($this->img_rb_y); + break; + } + default:{ + break; + } + } + } + + /** + * This function is DEPRECATED, please use the new write1DBarcode() function. + * @param int $x x position in user units + * @param int $y y position in user units + * @param int $w width in user units + * @param int $h height position in user units + * @param string $type type of barcode (I25, C128A, C128B, C128C, C39) + * @param string $style barcode style + * @param string $font font for text + * @param int $xres x resolution + * @param string $code code to print + * @deprecated deprecated since version 3.1.000 (2008-06-10) + * @access public + * @see write1DBarcode() + */ + public function writeBarcode($x, $y, $w, $h, $type, $style, $font, $xres, $code) { + // convert old settings for the new write1DBarcode() function. + $xres = 1 / $xres; + $newstyle = array( + 'position' => 'L', + 'border' => false, + 'padding' => 0, + 'fgcolor' => array(0,0,0), + 'bgcolor' => false, + 'text' => true, + 'font' => $font, + 'fontsize' => 8, + 'stretchtext' => 4 + ); + if ($style & 1) { + $newstyle['border'] = true; + } + if ($style & 2) { + $newstyle['bgcolor'] = false; + } + if ($style & 4) { + $newstyle['position'] = 'C'; + } elseif ($style & 8) { + $newstyle['position'] = 'L'; + } elseif ($style & 16) { + $newstyle['position'] = 'R'; + } + if ($style & 128) { + $newstyle['text'] = true; + } + if ($style & 256) { + $newstyle['stretchtext'] = 4; + } + $this->write1DBarcode($code, $type, $x, $y, $w, $h, $xres, $newstyle, ''); + } + + /** + * Print 2D Barcode. + * @param string $code code to print + * @param string $type type of barcode (see 2dbarcodes.php for supported formats). + * @param int $x x position in user units + * @param int $y y position in user units + * @param int $w width in user units + * @param int $h height in user units + * @param array $style array of options:<ul><li>boolean $style['border'] if true prints a border around the barcode</li><li>int $style['padding'] padding to leave around the barcode in user units (set to 'auto' for automatic padding)</li><li>array $style['fgcolor'] color array for bars and text</li><li>mixed $style['bgcolor'] color array for background or false for transparent</li></ul> + * @param string $align Indicates the alignment of the pointer next to barcode insertion relative to barcode height. The value can be:<ul><li>T: top-right for LTR or top-left for RTL</li><li>M: middle-right for LTR or middle-left for RTL</li><li>B: bottom-right for LTR or bottom-left for RTL</li><li>N: next line</li></ul> + * @author Nicola Asuni + * @since 4.5.037 (2009-04-07) + * @access public + */ + public function write2DBarcode($code, $type, $x='', $y='', $w='', $h='', $style='', $align='') { + if ($this->empty_string($code)) { + return; + } + require_once(dirname(__FILE__).'/2dbarcodes.php'); + // save current graphic settings + $gvars = $this->getGraphicVars(); + // create new barcode object + $barcodeobj = new TCPDF2DBarcode($code, $type); + $arrcode = $barcodeobj->getBarcodeArray(); + if ($arrcode === false) { + $this->Error('Error in 2D barcode string'); + } + // set default values + if (!isset($style['fgcolor'])) { + $style['fgcolor'] = array(0,0,0); // default black + } + if (!isset($style['bgcolor'])) { + $style['bgcolor'] = false; // default transparent + } + if (!isset($style['border'])) { + $style['border'] = false; + } + // set foreground color + $this->SetDrawColorArray($style['fgcolor']); + if ($this->empty_string($x)) { + $x = $this->GetX(); + } + if ($this->rtl) { + $x = $this->w - $x; + } + if ($this->empty_string($y)) { + $y = $this->GetY(); + } + if ($this->empty_string($w) OR ($w <= 0)) { + if ($this->rtl) { + $w = $x - $this->lMargin; + } else { + $w = $this->w - $this->rMargin - $x; + } + } + if ($this->empty_string($h) OR ($h <= 0)) { + // 2d barcodes are square by default + $h = $w; + } + $prev_x = $this->x; + if ($this->checkPageBreak($h, $y)) { + $y = $this->GetY() + $this->cMargin; + if ($this->rtl) { + $x += ($prev_x - $this->x); + } else { + $x += ($this->x - $prev_x); + } + } + // padding + if (!isset($style['padding'])) { + $style['padding'] = 0; + } elseif ($style['padding'] === 'auto') { + $style['padding'] = 4 * $w / (8 + $arrcode['num_cols']); + } + // calculate barcode size (excluding padding) + $bw = $w - (2 * $style['padding']); + $bh = $h - (2 * $style['padding']); + // calculate starting coordinates + if ($this->rtl) { + $xpos = $x - $w; + } else { + $xpos = $x; + } + $xpos += $style['padding']; + $ypos = $y + $style['padding']; + // barcode is always printed in LTR direction + $tempRTL = $this->rtl; + $this->rtl = false; + // print background color + if ($style['bgcolor']) { + $this->Rect($x, $y, $w, $h, $style['border'] ? 'DF' : 'F', '', $style['bgcolor']); + } elseif ($style['border']) { + $this->Rect($x, $y, $w, $h, 'D'); + } + // print barcode cells + if ($arrcode !== false) { + $rows = $arrcode['num_rows']; + $cols = $arrcode['num_cols']; + // calculate dimension of single barcode cell + $cw = $bw / $cols; + $ch = $bh / $rows; + // for each row + for ($r = 0; $r < $rows; ++$r) { + $xr = $xpos; + // for each column + for ($c = 0; $c < $cols; ++$c) { + if ($arrcode['bcode'][$r][$c] == 1) { + // draw a single barcode cell + $this->Rect($xr, $ypos, $cw, $ch, 'F', array(), $style['fgcolor']); + } + $xr += $cw; + } + $ypos += $ch; + } + } + // restore original direction + $this->rtl = $tempRTL; + // restore previous settings + $this->setGraphicVars($gvars); + // set bottomcoordinates + $this->img_rb_y = $y + $h; + if ($this->rtl) { + // set left side coordinate + $this->img_rb_x = ($this->w - $x - $w); + } else { + // set right side coordinate + $this->img_rb_x = $x + $w; + } + // set pointer to align the successive text/objects + switch($align) { + case 'T':{ + $this->y = $y; + $this->x = $this->img_rb_x; + break; + } + case 'M':{ + $this->y = $y + round($h/2); + $this->x = $this->img_rb_x; + break; + } + case 'B':{ + $this->y = $this->img_rb_y; + $this->x = $this->img_rb_x; + break; + } + case 'N':{ + $this->SetY($this->img_rb_y); + break; + } + default:{ + break; + } + } + } + + /** + * Returns an array containing current margins: + * <ul> + <li>$ret['left'] = left margin</li> + <li>$ret['right'] = right margin</li> + <li>$ret['top'] = top margin</li> + <li>$ret['bottom'] = bottom margin</li> + <li>$ret['header'] = header margin</li> + <li>$ret['footer'] = footer margin</li> + <li>$ret['cell'] = cell margin</li> + * </ul> + * @return array containing all margins measures + * @access public + * @since 3.2.000 (2008-06-23) + */ + public function getMargins() { + $ret = array( + 'left' => $this->lMargin, + 'right' => $this->rMargin, + 'top' => $this->tMargin, + 'bottom' => $this->bMargin, + 'header' => $this->header_margin, + 'footer' => $this->footer_margin, + 'cell' => $this->cMargin, + ); + return $ret; + } + + /** + * Returns an array containing original margins: + * <ul> + <li>$ret['left'] = left margin</li> + <li>$ret['right'] = right margin</li> + * </ul> + * @return array containing all margins measures + * @access public + * @since 4.0.012 (2008-07-24) + */ + public function getOriginalMargins() { + $ret = array( + 'left' => $this->original_lMargin, + 'right' => $this->original_rMargin + ); + return $ret; + } + + /** + * Returns the current font size. + * @return current font size + * @access public + * @since 3.2.000 (2008-06-23) + */ + public function getFontSize() { + return $this->FontSize; + } + + /** + * Returns the current font size in points unit. + * @return current font size in points unit + * @access public + * @since 3.2.000 (2008-06-23) + */ + public function getFontSizePt() { + return $this->FontSizePt; + } + + /** + * Returns the current font family name. + * @return string current font family name + * @access public + * @since 4.3.008 (2008-12-05) + */ + public function getFontFamily() { + return $this->FontFamily; + } + + /** + * Returns the current font style. + * @return string current font style + * @access public + * @since 4.3.008 (2008-12-05) + */ + public function getFontStyle() { + return $this->FontStyle; + } + + /** + * Prints a cell (rectangular area) with optional borders, background color and html text string. + * The upper-left corner of the cell corresponds to the current position. After the call, the current position moves to the right or to the next line.<br /> + * If automatic page breaking is enabled and the cell goes beyond the limit, a page break is done before outputting. + * @param float $w Cell width. If 0, the cell extends up to the right margin. + * @param float $h Cell minimum height. The cell extends automatically if needed. + * @param float $x upper-left corner X coordinate + * @param float $y upper-left corner Y coordinate + * @param string $html html text to print. Default value: empty string. + * @param mixed $border Indicates if borders must be drawn around the cell. The value can be either a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul>or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> + * @param int $ln Indicates where the current position should go after the call. Possible values are:<ul><li>0: to the right (or left for RTL language)</li><li>1: to the beginning of the next line</li><li>2: below</li></ul> + Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: 0. + * @param int $fill Indicates if the cell background must be painted (1) or transparent (0). Default value: 0. + * @param boolean $reseth if true reset the last cell height (default true). + * @param string $align Allows to center or align the text. Possible values are:<ul><li>L : left align</li><li>C : center</li><li>R : right align</li><li>'' : empty string : left for LTR or right for RTL</li></ul> + * @param boolean $autopadding if true, uses internal padding and automatically adjust it to account for line width. + * @access public + * @uses MultiCell() + * @see Multicell(), writeHTML() + */ + public function writeHTMLCell($w, $h, $x, $y, $html='', $border=0, $ln=0, $fill=0, $reseth=true, $align='', $autopadding=true) { + return $this->MultiCell($w, $h, $html, $border, $align, $fill, $ln, $x, $y, $reseth, 0, true, $autopadding, 0); + } + + /** + * Returns the HTML DOM array. + * <ul><li>$dom[$key]['tag'] = true if tag, false otherwise;</li><li>$dom[$key]['value'] = tag name or text;</li><li>$dom[$key]['opening'] = true if opening tag, false otherwise;</li><li>$dom[$key]['attribute'] = array of attributes (attribute name is the key);</li><li>$dom[$key]['style'] = array of style attributes (attribute name is the key);</li><li>$dom[$key]['parent'] = id of parent element;</li><li>$dom[$key]['fontname'] = font family name;</li><li>$dom[$key]['fontstyle'] = font style;</li><li>$dom[$key]['fontsize'] = font size in points;</li><li>$dom[$key]['bgcolor'] = RGB array of background color;</li><li>$dom[$key]['fgcolor'] = RGB array of foreground color;</li><li>$dom[$key]['width'] = width in pixels;</li><li>$dom[$key]['height'] = height in pixels;</li><li>$dom[$key]['align'] = text alignment;</li><li>$dom[$key]['cols'] = number of colums in table;</li><li>$dom[$key]['rows'] = number of rows in table;</li></ul> + * @param string $html html code + * @return array + * @access protected + * @since 3.2.000 (2008-06-20) + */ + protected function getHtmlDomArray($html) { + // define block tags + $blocktags = array('blockquote','br','dd','dl','div','dt','h1','h2','h3','h4','h5','h6','hr','li','ol','p','pre','ul','tcpdf','table','tr','td'); + // remove all unsupported tags (the line below lists all supported tags) + $html = strip_tags($html, '<marker/><a><b><blockquote><body><br><br/><dd><del><div><dl><dt><em><font><form><h1><h2><h3><h4><h5><h6><hr><i><img><input><label><li><ol><option><p><pre><select><small><span><strong><sub><sup><table><tablehead><tcpdf><td><textarea><th><thead><tr><tt><u><ul>'); + //replace some blank characters + $html = preg_replace('/<pre/', '<xre', $html); // preserve pre tag + $html = preg_replace('/<(table|tr|td|th|tcpdf|blockquote|dd|div|dl|dt|form|h1|h2|h3|h4|h5|h6|br|hr|li|ol|ul|p)([^\>]*)>[\n\r\t]+/', '<\\1\\2>', $html); + $html = preg_replace('@(\r\n|\r)@', "\n", $html); + $repTable = array("\t" => ' ', "\0" => ' ', "\x0B" => ' ', "\\" => "\\\\"); + $html = strtr($html, $repTable); + $offset = 0; + while (($offset < strlen($html)) AND ($pos = strpos($html, '</pre>', $offset)) !== false) { + $html_a = substr($html, 0, $offset); + $html_b = substr($html, $offset, ($pos - $offset + 6)); + while (preg_match("'<xre([^\>]*)>(.*?)\n(.*?)</pre>'si", $html_b)) { + // preserve newlines on <pre> tag + $html_b = preg_replace("'<xre([^\>]*)>(.*?)\n(.*?)</pre>'si", "<xre\\1>\\2<br />\\3</pre>", $html_b); + } + $html = $html_a.$html_b.substr($html, $pos + 6); + $offset = strlen($html_a.$html_b); + } + $offset = 0; + while (($offset < strlen($html)) AND ($pos = strpos($html, '</textarea>', $offset)) !== false) { + $html_a = substr($html, 0, $offset); + $html_b = substr($html, $offset, ($pos - $offset + 11)); + while (preg_match("'<textarea([^\>]*)>(.*?)\n(.*?)</textarea>'si", $html_b)) { + // preserve newlines on <textarea> tag + $html_b = preg_replace("'<textarea([^\>]*)>(.*?)\n(.*?)</textarea>'si", "<textarea\\1>\\2<TBR>\\3</textarea>", $html_b); + $html_b = preg_replace("'<textarea([^\>]*)>(.*?)[\"](.*?)</textarea>'si", "<textarea\\1>\\2''\\3</textarea>", $html_b); + } + $html = $html_a.$html_b.substr($html, $pos + 11); + $offset = strlen($html_a.$html_b); + } + $html = preg_replace("'([\s]*)<option'si", "<option", $html); + $html = preg_replace("'</option>([\s]*)'si", "</option>", $html); + $offset = 0; + while (($offset < strlen($html)) AND ($pos = strpos($html, '</option>', $offset)) !== false) { + $html_a = substr($html, 0, $offset); + $html_b = substr($html, $offset, ($pos - $offset + 9)); + while (preg_match("'<option([^\>]*)>(.*?)</option>'si", $html_b)) { + $html_b = preg_replace("'<option([\s]+)value=\"([^\"]*)\"([^\>]*)>(.*?)</option>'si", "\\2\t\\4\r", $html_b); + $html_b = preg_replace("'<option([^\>]*)>(.*?)</option>'si", "\\2\r", $html_b); + } + $html = $html_a.$html_b.substr($html, $pos + 9); + $offset = strlen($html_a.$html_b); + } + $html = preg_replace("'<select([^\>]*)>'si", "<select\\1 opt=\"", $html); + $html = preg_replace("'([\s]+)</select>'si", "\" />", $html); + $html = str_replace("\n", ' ', $html); + // restore textarea newlines + $html = str_replace('<TBR>', "\n", $html); + // remove extra spaces from code + $html = preg_replace('/[\s]+<\/(table|tr|td|th|ul|ol|li|dl|dt|dd)>/', '</\\1>', $html); + $html = preg_replace('/[\s]+<(tr|td|th|ul|ol|li|dl|dt|dd|br)/', '<\\1', $html); + $html = preg_replace('/<\/(table|tr|td|th|blockquote|dd|dt|dl|div|dt|h1|h2|h3|h4|h5|h6|hr|li|ol|ul|p)>[\s]+</', '</\\1><', $html); + $html = preg_replace('/<\/(td|th)>/', '<marker style="font-size:0"/></\\1>', $html); + $html = preg_replace('/<\/table>([\s]*)<marker style="font-size:0"\/>/', '</table>', $html); + $html = preg_replace('/[\s]*<img/', ' <img', $html); + $html = preg_replace('/<img([^\>]*)>/xi', '<img\\1><span><marker style="font-size:0"/></span>', $html); + $html = preg_replace('/<xre/', '<pre', $html); // restore pre tag + $html = preg_replace('/<textarea([^\>]*)>/xi', '<textarea\\1 value="', $html); + $html = preg_replace('/<\/textarea>/', '" />', $html); + // trim string + $html = preg_replace('/^[\s]+/', '', $html); + $html = preg_replace('/[\s]+$/', '', $html); + // pattern for generic tag + $tagpattern = '/(<[^>]+>)/'; + // explodes the string + $a = preg_split($tagpattern, $html, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); + // count elements + $maxel = count($a); + $elkey = 0; + $key = 0; + // create an array of elements + $dom = array(); + $dom[$key] = array(); + // set first void element + $dom[$key]['tag'] = false; + $dom[$key]['block'] = false; + $dom[$key]['value'] = ''; + $dom[$key]['parent'] = 0; + $dom[$key]['fontname'] = $this->FontFamily; + $dom[$key]['fontstyle'] = $this->FontStyle; + $dom[$key]['fontsize'] = $this->FontSizePt; + $dom[$key]['stroke'] = $this->textstrokewidth; + $dom[$key]['fill'] = (($this->textrendermode % 2) == 0); + $dom[$key]['clip'] = ($this->textrendermode > 3); + $dom[$key]['line-height'] = $this->cell_height_ratio; + $dom[$key]['bgcolor'] = false; + $dom[$key]['fgcolor'] = $this->fgcolor; + $dom[$key]['strokecolor'] = $this->strokecolor; + $dom[$key]['align'] = ''; + $dom[$key]['listtype'] = ''; + $dom[$key]['text-indent'] = 0; + $thead = false; // true when we are inside the THEAD tag + ++$key; + $level = array(); + array_push($level, 0); // root + while ($elkey < $maxel) { + $dom[$key] = array(); + $element = $a[$elkey]; + $dom[$key]['elkey'] = $elkey; + if (preg_match($tagpattern, $element)) { + // html tag + $element = substr($element, 1, -1); + // get tag name + preg_match('/[\/]?([a-zA-Z0-9]*)/', $element, $tag); + $tagname = strtolower($tag[1]); + // check if we are inside a table header + if ($tagname == 'thead') { + if ($element{0} == '/') { + $thead = false; + } else { + $thead = true; + } + ++$elkey; + continue; + } + $dom[$key]['tag'] = true; + $dom[$key]['value'] = $tagname; + if (in_array($dom[$key]['value'], $blocktags)) { + $dom[$key]['block'] = true; + } else { + $dom[$key]['block'] = false; + } + if ($element{0} == '/') { + // *** closing html tag + $dom[$key]['opening'] = false; + $dom[$key]['parent'] = end($level); + array_pop($level); + $dom[$key]['fontname'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fontname']; + $dom[$key]['fontstyle'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fontstyle']; + $dom[$key]['fontsize'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fontsize']; + $dom[$key]['stroke'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['stroke']; + $dom[$key]['fill'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fill']; + $dom[$key]['clip'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['clip']; + $dom[$key]['line-height'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['line-height']; + $dom[$key]['bgcolor'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['bgcolor']; + $dom[$key]['fgcolor'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['fgcolor']; + $dom[$key]['strokecolor'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['strokecolor']; + $dom[$key]['align'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['align']; + if (isset($dom[($dom[($dom[$key]['parent'])]['parent'])]['listtype'])) { + $dom[$key]['listtype'] = $dom[($dom[($dom[$key]['parent'])]['parent'])]['listtype']; + } + // set the number of columns in table tag + if (($dom[$key]['value'] == 'tr') AND (!isset($dom[($dom[($dom[$key]['parent'])]['parent'])]['cols']))) { + $dom[($dom[($dom[$key]['parent'])]['parent'])]['cols'] = $dom[($dom[$key]['parent'])]['cols']; + } + if (($dom[$key]['value'] == 'td') OR ($dom[$key]['value'] == 'th')) { + $dom[($dom[$key]['parent'])]['content'] = ''; + for ($i = ($dom[$key]['parent'] + 1); $i < $key; ++$i) { + $dom[($dom[$key]['parent'])]['content'] .= $a[$dom[$i]['elkey']]; + } + $key = $i; + // mark nested tables + $dom[($dom[$key]['parent'])]['content'] = str_replace('<table', '<table nested="true"', $dom[($dom[$key]['parent'])]['content']); + // remove thead sections from nested tables + $dom[($dom[$key]['parent'])]['content'] = str_replace('<thead>', '', $dom[($dom[$key]['parent'])]['content']); + $dom[($dom[$key]['parent'])]['content'] = str_replace('</thead>', '', $dom[($dom[$key]['parent'])]['content']); + } + // store header rows on a new table + if (($dom[$key]['value'] == 'tr') AND ($dom[($dom[$key]['parent'])]['thead'] === true)) { + if ($this->empty_string($dom[($dom[($dom[$key]['parent'])]['parent'])]['thead'])) { + $dom[($dom[($dom[$key]['parent'])]['parent'])]['thead'] = $a[$dom[($dom[($dom[$key]['parent'])]['parent'])]['elkey']]; + } + for ($i = $dom[$key]['parent']; $i <= $key; ++$i) { + $dom[($dom[($dom[$key]['parent'])]['parent'])]['thead'] .= $a[$dom[$i]['elkey']]; + } + if (!isset($dom[($dom[$key]['parent'])]['attribute'])) { + $dom[($dom[$key]['parent'])]['attribute'] = array(); + } + // header elements must be always contained in a single page + $dom[($dom[$key]['parent'])]['attribute']['nobr'] = 'true'; + } + if (($dom[$key]['value'] == 'table') AND (!$this->empty_string($dom[($dom[$key]['parent'])]['thead']))) { + // remove the nobr attributes from the table header + $dom[($dom[$key]['parent'])]['thead'] = str_replace(' nobr="true"', '', $dom[($dom[$key]['parent'])]['thead']); + $dom[($dom[$key]['parent'])]['thead'] .= '</tablehead>'; + } + } else { + // *** opening html tag + $dom[$key]['opening'] = true; + $dom[$key]['parent'] = end($level); + if (substr($element, -1, 1) != '/') { + // not self-closing tag + array_push($level, $key); + $dom[$key]['self'] = false; + } else { + $dom[$key]['self'] = true; + } + // copy some values from parent + $parentkey = 0; + if ($key > 0) { + $parentkey = $dom[$key]['parent']; + $dom[$key]['fontname'] = $dom[$parentkey]['fontname']; + $dom[$key]['fontstyle'] = $dom[$parentkey]['fontstyle']; + $dom[$key]['fontsize'] = $dom[$parentkey]['fontsize']; + $dom[$key]['stroke'] = $dom[$parentkey]['stroke']; + $dom[$key]['fill'] = $dom[$parentkey]['fill']; + $dom[$key]['clip'] = $dom[$parentkey]['clip']; + $dom[$key]['line-height'] = $dom[$parentkey]['line-height']; + $dom[$key]['bgcolor'] = $dom[$parentkey]['bgcolor']; + $dom[$key]['fgcolor'] = $dom[$parentkey]['fgcolor']; + $dom[$key]['strokecolor'] = $dom[$parentkey]['strokecolor']; + $dom[$key]['align'] = $dom[$parentkey]['align']; + $dom[$key]['listtype'] = $dom[$parentkey]['listtype']; + $dom[$key]['text-indent'] = $dom[$parentkey]['text-indent']; + } + // get attributes + preg_match_all('/([^=\s]*)=["]?([^"]*)["]?/', $element, $attr_array, PREG_PATTERN_ORDER); + $dom[$key]['attribute'] = array(); // reset attribute array + while (list($id, $name) = each($attr_array[1])) { + $dom[$key]['attribute'][strtolower($name)] = $attr_array[2][$id]; + } + // split style attributes + if (isset($dom[$key]['attribute']['style'])) { + // get style attributes + preg_match_all('/([^;:\s]*):([^;]*)/', $dom[$key]['attribute']['style'], $style_array, PREG_PATTERN_ORDER); + $dom[$key]['style'] = array(); // reset style attribute array + while (list($id, $name) = each($style_array[1])) { + $dom[$key]['style'][strtolower($name)] = trim($style_array[2][$id]); + } + // --- get some style attributes --- + if (isset($dom[$key]['style']['font-family'])) { + // font family + if (isset($dom[$key]['style']['font-family'])) { + $fontslist = preg_split('/[,]/', strtolower($dom[$key]['style']['font-family'])); + foreach ($fontslist as $font) { + $font = trim(strtolower($font)); + if (in_array($font, $this->fontlist) OR in_array($font, $this->fontkeys)) { + $dom[$key]['fontname'] = $font; + break; + } + } + } + } + // list-style-type + if (isset($dom[$key]['style']['list-style-type'])) { + $dom[$key]['listtype'] = trim(strtolower($dom[$key]['style']['list-style-type'])); + if ($dom[$key]['listtype'] == 'inherit') { + $dom[$key]['listtype'] = $dom[$parentkey]['listtype']; + } + } + // text-indent + if (isset($dom[$key]['style']['text-indent'])) { + $dom[$key]['text-indent'] = $this->getHTMLUnitToUnits($dom[$key]['style']['text-indent']); + if ($dom[$key]['text-indent'] == 'inherit') { + $dom[$key]['text-indent'] = $dom[$parentkey]['text-indent']; + } + } + // font size + if (isset($dom[$key]['style']['font-size'])) { + $fsize = trim($dom[$key]['style']['font-size']); + switch ($fsize) { + // absolute-size + case 'xx-small': { + $dom[$key]['fontsize'] = $dom[0]['fontsize'] - 4; + break; + } + case 'x-small': { + $dom[$key]['fontsize'] = $dom[0]['fontsize'] - 3; + break; + } + case 'small': { + $dom[$key]['fontsize'] = $dom[0]['fontsize'] - 2; + break; + } + case 'medium': { + $dom[$key]['fontsize'] = $dom[0]['fontsize']; + break; + } + case 'large': { + $dom[$key]['fontsize'] = $dom[0]['fontsize'] + 2; + break; + } + case 'x-large': { + $dom[$key]['fontsize'] = $dom[0]['fontsize'] + 4; + break; + } + case 'xx-large': { + $dom[$key]['fontsize'] = $dom[0]['fontsize'] + 6; + break; + } + // relative-size + case 'smaller': { + $dom[$key]['fontsize'] = $dom[$parentkey]['fontsize'] - 3; + break; + } + case 'larger': { + $dom[$key]['fontsize'] = $dom[$parentkey]['fontsize'] + 3; + break; + } + default: { + $dom[$key]['fontsize'] = $this->getHTMLUnitToUnits($fsize, $dom[$parentkey]['fontsize'], 'pt', true); + } + } + } + // line-height + if (isset($dom[$key]['style']['line-height'])) { + $lineheight = trim($dom[$key]['style']['line-height']); + switch ($lineheight) { + // A normal line height. This is default + case 'normal': { + $dom[$key]['line-height'] = $dom[0]['line-height']; + break; + } + default: { + if (is_numeric($lineheight)) { + $lineheight = $lineheight * 100; + } + $dom[$key]['line-height'] = $this->getHTMLUnitToUnits($lineheight, 1, '%', true); + } + } + } + // font style + if (isset($dom[$key]['style']['font-weight']) AND (strtolower($dom[$key]['style']['font-weight']{0}) == 'b')) { + $dom[$key]['fontstyle'] .= 'B'; + } + if (isset($dom[$key]['style']['font-style']) AND (strtolower($dom[$key]['style']['font-style']{0}) == 'i')) { + $dom[$key]['fontstyle'] .= 'I'; + } + // font color + if (isset($dom[$key]['style']['color']) AND (!$this->empty_string($dom[$key]['style']['color']))) { + $dom[$key]['fgcolor'] = $this->convertHTMLColorToDec($dom[$key]['style']['color']); + } + // background color + if (isset($dom[$key]['style']['background-color']) AND (!$this->empty_string($dom[$key]['style']['background-color']))) { + $dom[$key]['bgcolor'] = $this->convertHTMLColorToDec($dom[$key]['style']['background-color']); + } + // text-decoration + if (isset($dom[$key]['style']['text-decoration'])) { + $decors = explode(' ', strtolower($dom[$key]['style']['text-decoration'])); + foreach ($decors as $dec) { + $dec = trim($dec); + if (!$this->empty_string($dec)) { + if ($dec{0} == 'u') { + // underline + $dom[$key]['fontstyle'] .= 'U'; + } elseif ($dec{0} == 'l') { + // line-trough + $dom[$key]['fontstyle'] .= 'D'; + } elseif ($dec{0} == 'o') { + // overline + $dom[$key]['fontstyle'] .= 'O'; + } + } + } + } + // check for width attribute + if (isset($dom[$key]['style']['width'])) { + $dom[$key]['width'] = $dom[$key]['style']['width']; + } + // check for height attribute + if (isset($dom[$key]['style']['height'])) { + $dom[$key]['height'] = $dom[$key]['style']['height']; + } + // check for text alignment + if (isset($dom[$key]['style']['text-align'])) { + $dom[$key]['align'] = strtoupper($dom[$key]['style']['text-align']{0}); + } + // check for border attribute + if (isset($dom[$key]['style']['border'])) { + $dom[$key]['attribute']['border'] = $dom[$key]['style']['border']; + } + // page-break-inside + if (isset($dom[$key]['style']['page-break-inside']) AND ($dom[$key]['style']['page-break-inside'] == 'avoid')) { + $dom[$key]['attribute']['nobr'] = 'true'; + } + // page-break-before + if (isset($dom[$key]['style']['page-break-before'])) { + if ($dom[$key]['style']['page-break-before'] == 'always') { + $dom[$key]['attribute']['pagebreak'] = 'true'; + } elseif ($dom[$key]['style']['page-break-before'] == 'left') { + $dom[$key]['attribute']['pagebreak'] = 'left'; + } elseif ($dom[$key]['style']['page-break-before'] == 'right') { + $dom[$key]['attribute']['pagebreak'] = 'right'; + } + } + // page-break-after + if (isset($dom[$key]['style']['page-break-after'])) { + if ($dom[$key]['style']['page-break-after'] == 'always') { + $dom[$key]['attribute']['pagebreakafter'] = 'true'; + } elseif ($dom[$key]['style']['page-break-after'] == 'left') { + $dom[$key]['attribute']['pagebreakafter'] = 'left'; + } elseif ($dom[$key]['style']['page-break-after'] == 'right') { + $dom[$key]['attribute']['pagebreakafter'] = 'right'; + } + } + } + // check for font tag + if ($dom[$key]['value'] == 'font') { + // font family + if (isset($dom[$key]['attribute']['face'])) { + $fontslist = preg_split('/[,]/', strtolower($dom[$key]['attribute']['face'])); + foreach ($fontslist as $font) { + $font = trim(strtolower($font)); + if (in_array($font, $this->fontlist) OR in_array($font, $this->fontkeys)) { + $dom[$key]['fontname'] = $font; + break; + } + } + } + // font size + if (isset($dom[$key]['attribute']['size'])) { + if ($key > 0) { + if ($dom[$key]['attribute']['size']{0} == '+') { + $dom[$key]['fontsize'] = $dom[($dom[$key]['parent'])]['fontsize'] + intval(substr($dom[$key]['attribute']['size'], 1)); + } elseif ($dom[$key]['attribute']['size']{0} == '-') { + $dom[$key]['fontsize'] = $dom[($dom[$key]['parent'])]['fontsize'] - intval(substr($dom[$key]['attribute']['size'], 1)); + } else { + $dom[$key]['fontsize'] = intval($dom[$key]['attribute']['size']); + } + } else { + $dom[$key]['fontsize'] = intval($dom[$key]['attribute']['size']); + } + } + } + // force natural alignment for lists + if ((($dom[$key]['value'] == 'ul') OR ($dom[$key]['value'] == 'ol') OR ($dom[$key]['value'] == 'dl')) + AND (!isset($dom[$key]['align']) OR $this->empty_string($dom[$key]['align']) OR ($dom[$key]['align'] != 'J'))) { + if ($this->rtl) { + $dom[$key]['align'] = 'R'; + } else { + $dom[$key]['align'] = 'L'; + } + } + if (($dom[$key]['value'] == 'small') OR ($dom[$key]['value'] == 'sup') OR ($dom[$key]['value'] == 'sub')) { + $dom[$key]['fontsize'] = $dom[$key]['fontsize'] * K_SMALL_RATIO; + } + if (($dom[$key]['value'] == 'strong') OR ($dom[$key]['value'] == 'b')) { + $dom[$key]['fontstyle'] .= 'B'; + } + if (($dom[$key]['value'] == 'em') OR ($dom[$key]['value'] == 'i')) { + $dom[$key]['fontstyle'] .= 'I'; + } + if ($dom[$key]['value'] == 'u') { + $dom[$key]['fontstyle'] .= 'U'; + } + if ($dom[$key]['value'] == 'del') { + $dom[$key]['fontstyle'] .= 'D'; + } + if (($dom[$key]['value'] == 'pre') OR ($dom[$key]['value'] == 'tt')) { + $dom[$key]['fontname'] = $this->default_monospaced_font; + } + if (($dom[$key]['value']{0} == 'h') AND (intval($dom[$key]['value']{1}) > 0) AND (intval($dom[$key]['value']{1}) < 7)) { + $headsize = (4 - intval($dom[$key]['value']{1})) * 2; + $dom[$key]['fontsize'] = $dom[0]['fontsize'] + $headsize; + $dom[$key]['fontstyle'] .= 'B'; + } + if (($dom[$key]['value'] == 'table')) { + $dom[$key]['rows'] = 0; // number of rows + $dom[$key]['trids'] = array(); // IDs of TR elements + $dom[$key]['thead'] = ''; // table header rows + } + if (($dom[$key]['value'] == 'tr')) { + $dom[$key]['cols'] = 0; + if ($thead) { + $dom[$key]['thead'] = true; + // rows on thead block are printed as a separate table + } else { + $dom[$key]['thead'] = false; + // store the number of rows on table element + ++$dom[($dom[$key]['parent'])]['rows']; + // store the TR elements IDs on table element + array_push($dom[($dom[$key]['parent'])]['trids'], $key); + } + } + if (($dom[$key]['value'] == 'th') OR ($dom[$key]['value'] == 'td')) { + if (isset($dom[$key]['attribute']['colspan'])) { + $colspan = intval($dom[$key]['attribute']['colspan']); + } else { + $colspan = 1; + } + $dom[$key]['attribute']['colspan'] = $colspan; + $dom[($dom[$key]['parent'])]['cols'] += $colspan; + } + // set foreground color attribute + if (isset($dom[$key]['attribute']['color']) AND (!$this->empty_string($dom[$key]['attribute']['color']))) { + $dom[$key]['fgcolor'] = $this->convertHTMLColorToDec($dom[$key]['attribute']['color']); + } + // set background color attribute + if (isset($dom[$key]['attribute']['bgcolor']) AND (!$this->empty_string($dom[$key]['attribute']['bgcolor']))) { + $dom[$key]['bgcolor'] = $this->convertHTMLColorToDec($dom[$key]['attribute']['bgcolor']); + } + // set stroke color attribute + if (isset($dom[$key]['attribute']['strokecolor']) AND (!$this->empty_string($dom[$key]['attribute']['strokecolor']))) { + $dom[$key]['strokecolor'] = $this->convertHTMLColorToDec($dom[$key]['attribute']['strokecolor']); + } + // check for width attribute + if (isset($dom[$key]['attribute']['width'])) { + $dom[$key]['width'] = $dom[$key]['attribute']['width']; + } + // check for height attribute + if (isset($dom[$key]['attribute']['height'])) { + $dom[$key]['height'] = $dom[$key]['attribute']['height']; + } + // check for text alignment + if (isset($dom[$key]['attribute']['align']) AND (!$this->empty_string($dom[$key]['attribute']['align'])) AND ($dom[$key]['value'] !== 'img')) { + $dom[$key]['align'] = strtoupper($dom[$key]['attribute']['align']{0}); + } + // check for text rendering mode (the following attributes do not exist in HTML) + if (isset($dom[$key]['attribute']['stroke'])) { + // font stroke width + $dom[$key]['stroke'] = $this->getHTMLUnitToUnits($dom[$key]['attribute']['stroke'], $dom[$key]['fontsize'], 'pt', true); + } + if (isset($dom[$key]['attribute']['fill'])) { + // font fill + if ($dom[$key]['attribute']['fill'] == 'true') { + $dom[$key]['fill'] = true; + } else { + $dom[$key]['fill'] = false; + } + } + if (isset($dom[$key]['attribute']['clip'])) { + // clipping mode + if ($dom[$key]['attribute']['clip'] == 'true') { + $dom[$key]['clip'] = true; + } else { + $dom[$key]['clip'] = false; + } + } + } // end opening tag + } else { + // text + $dom[$key]['tag'] = false; + $dom[$key]['block'] = false; + $dom[$key]['value'] = stripslashes($this->unhtmlentities($element)); + $dom[$key]['parent'] = end($level); + } + ++$elkey; + ++$key; + } + return $dom; + } + + /** + * Returns the string used to find spaces + * @return string + * @access protected + * @author Nicola Asuni + * @since 4.8.024 (2010-01-15) + */ + protected function getSpaceString() { + $spacestr = chr(32); + if (($this->CurrentFont['type'] == 'TrueTypeUnicode') OR ($this->CurrentFont['type'] == 'cidfont0')) { + $spacestr = chr(0).chr(32); + } + return $spacestr; + } + + /** + * Allows to preserve some HTML formatting (limited support).<br /> + * IMPORTANT: The HTML must be well formatted - try to clean-up it using an application like HTML-Tidy before submitting. + * Supported tags are: a, b, blockquote, br, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, img, li, ol, p, pre, small, span, strong, sub, sup, table, tcpdf, td, th, thead, tr, tt, u, ul + * @param string $html text to display + * @param boolean $ln if true add a new line after text (default = true) + * @param int $fill Indicates if the background must be painted (true) or transparent (false). + * @param boolean $reseth if true reset the last cell height (default false). + * @param boolean $cell if true add the default cMargin space to each Write (default false). + * @param string $align Allows to center or align the text. Possible values are:<ul><li>L : left align</li><li>C : center</li><li>R : right align</li><li>'' : empty string : left for LTR or right for RTL</li></ul> + * @access public + */ + public function writeHTML($html, $ln=true, $fill=false, $reseth=false, $cell=false, $align='') { + $gvars = $this->getGraphicVars(); + // store current values + $prevPage = $this->page; + $prevlMargin = $this->lMargin; + $prevrMargin = $this->rMargin; + $curfontname = $this->FontFamily; + $curfontstyle = $this->FontStyle; + $curfontsize = $this->FontSizePt; + $curfontascent = $this->getFontAscent($curfontname, $curfontstyle, $curfontsize); + $curfontdescent = $this->getFontDescent($curfontname, $curfontstyle, $curfontsize); + $this->newline = true; + $startlinepage = $this->page; + $minstartliney = $this->y; + $maxbottomliney = 0; + $startlinex = $this->x; + $startliney = $this->y; + $yshift = 0; + $newline = true; + $loop = 0; + $curpos = 0; + $this_method_vars = array(); + $undo = false; + $fontaligned = false; + $this->premode = false; + if (isset($this->PageAnnots[$this->page])) { + $pask = count($this->PageAnnots[$this->page]); + } else { + $pask = 0; + } + if (!$this->InFooter) { + if (isset($this->footerlen[$this->page])) { + $this->footerpos[$this->page] = $this->pagelen[$this->page] - $this->footerlen[$this->page]; + } else { + $this->footerpos[$this->page] = $this->pagelen[$this->page]; + } + $startlinepos = $this->footerpos[$this->page]; + } else { + $startlinepos = $this->pagelen[$this->page]; + } + $lalign = $align; + $plalign = $align; + if ($this->rtl) { + $w = $this->x - $this->lMargin; + } else { + $w = $this->w - $this->rMargin - $this->x; + } + $w -= (2 * $this->cMargin); + if ($cell) { + if ($this->rtl) { + $this->x -= $this->cMargin; + } else { + $this->x += $this->cMargin; + } + } + if ($this->customlistindent >= 0) { + $this->listindent = $this->customlistindent; + } else { + $this->listindent = $this->GetStringWidth('0000'); + } + $this->listindentlevel = 0; + // save previous states + $prev_cell_height_ratio = $this->cell_height_ratio; + $prev_listnum = $this->listnum; + $prev_listordered = $this->listordered; + $prev_listcount = $this->listcount; + $prev_lispacer = $this->lispacer; + $this->listnum = 0; + $this->listordered = array(); + $this->listcount = array(); + $this->lispacer = ''; + if (($this->empty_string($this->lasth)) OR ($reseth)) { + //set row height + $this->lasth = $this->FontSize * $this->cell_height_ratio; + } + $dom = $this->getHtmlDomArray($html); + $maxel = count($dom); + $key = 0; + while ($key < $maxel) { + if ($dom[$key]['tag'] AND isset($dom[$key]['attribute']['pagebreak'])) { + // check for pagebreak + if (($dom[$key]['attribute']['pagebreak'] == 'true') OR ($dom[$key]['attribute']['pagebreak'] == 'left') OR ($dom[$key]['attribute']['pagebreak'] == 'right')) { + // add a page (or trig AcceptPageBreak() for multicolumn mode) + $this->checkPageBreak($this->PageBreakTrigger + 1); + } + if ((($dom[$key]['attribute']['pagebreak'] == 'left') AND (((!$this->rtl) AND (($this->page % 2) == 0)) OR (($this->rtl) AND (($this->page % 2) != 0)))) + OR (($dom[$key]['attribute']['pagebreak'] == 'right') AND (((!$this->rtl) AND (($this->page % 2) != 0)) OR (($this->rtl) AND (($this->page % 2) == 0))))) { + // add a page (or trig AcceptPageBreak() for multicolumn mode) + $this->checkPageBreak($this->PageBreakTrigger + 1); + } + } + if ($dom[$key]['tag'] AND $dom[$key]['opening'] AND isset($dom[$key]['attribute']['nobr']) AND ($dom[$key]['attribute']['nobr'] == 'true')) { + if (isset($dom[($dom[$key]['parent'])]['attribute']['nobr']) AND ($dom[($dom[$key]['parent'])]['attribute']['nobr'] == 'true')) { + $dom[$key]['attribute']['nobr'] = false; + } else { + // store current object + $this->startTransaction(); + // save this method vars + $this_method_vars['html'] = $html; + $this_method_vars['ln'] = $ln; + $this_method_vars['fill'] = $fill; + $this_method_vars['reseth'] = $reseth; + $this_method_vars['cell'] = $cell; + $this_method_vars['align'] = $align; + $this_method_vars['gvars'] = $gvars; + $this_method_vars['prevPage'] = $prevPage; + $this_method_vars['prevlMargin'] = $prevlMargin; + $this_method_vars['prevrMargin'] = $prevrMargin; + $this_method_vars['curfontname'] = $curfontname; + $this_method_vars['curfontstyle'] = $curfontstyle; + $this_method_vars['curfontsize'] = $curfontsize; + $this_method_vars['curfontascent'] = $curfontascent; + $this_method_vars['curfontdescent'] = $curfontdescent; + $this_method_vars['minstartliney'] = $minstartliney; + $this_method_vars['maxbottomliney'] = $maxbottomliney; + $this_method_vars['yshift'] = $yshift; + $this_method_vars['startlinepage'] = $startlinepage; + $this_method_vars['startlinepos'] = $startlinepos; + $this_method_vars['startlinex'] = $startlinex; + $this_method_vars['startliney'] = $startliney; + $this_method_vars['newline'] = $newline; + $this_method_vars['loop'] = $loop; + $this_method_vars['curpos'] = $curpos; + $this_method_vars['pask'] = $pask; + $this_method_vars['lalign'] = $lalign; + $this_method_vars['plalign'] = $plalign; + $this_method_vars['w'] = $w; + $this_method_vars['prev_cell_height_ratio'] = $prev_cell_height_ratio; + $this_method_vars['prev_listnum'] = $prev_listnum; + $this_method_vars['prev_listordered'] = $prev_listordered; + $this_method_vars['prev_listcount'] = $prev_listcount; + $this_method_vars['prev_lispacer'] = $prev_lispacer; + $this_method_vars['fontaligned'] = $fontaligned; + $this_method_vars['key'] = $key; + $this_method_vars['dom'] = $dom; + } + } + // print THEAD block + if (($dom[$key]['value'] == 'tr') AND isset($dom[$key]['thead']) AND $dom[$key]['thead']) { + if (isset($dom[$key]['parent']) AND isset($dom[$dom[$key]['parent']]['thead']) AND !$this->empty_string($dom[$dom[$key]['parent']]['thead'])) { + $this->inthead = true; + // print table header (thead) + $this->writeHTML($this->thead, false, false, false, false, ''); + if (($this->start_transaction_page == ($this->numpages - 1)) OR ($this->y < $this->start_transaction_y) OR ($this->checkPageBreak($this->lasth, '', false))) { + // restore previous object + $this->rollbackTransaction(true); + // restore previous values + foreach ($this_method_vars as $vkey => $vval) { + $$vkey = $vval; + } + // add a page (or trig AcceptPageBreak() for multicolumn mode) + $pre_y = $this->y; + if ((!$this->checkPageBreak($this->PageBreakTrigger + 1)) AND ($this->y < $pre_y)) { + // fix for multicolumn mode + $startliney = $this->y; + } + $this->start_transaction_page = $this->page; + $this->start_transaction_y = $this->y; + } + } + // move $key index forward to skip THEAD block + while ( ($key < $maxel) AND (!( + ($dom[$key]['tag'] AND $dom[$key]['opening'] AND ($dom[$key]['value'] == 'tr') AND (!isset($dom[$key]['thead']) OR !$dom[$key]['thead'])) + OR ($dom[$key]['tag'] AND (!$dom[$key]['opening']) AND ($dom[$key]['value'] == 'table'))) )) { + ++$key; + } + } + if ($dom[$key]['tag'] OR ($key == 0)) { + if (isset($dom[$key]['line-height'])) { + // set line height + $this->cell_height_ratio = $dom[$key]['line-height']; + $this->lasth = $this->FontSize * $this->cell_height_ratio; + } + if ((($dom[$key]['value'] == 'table') OR ($dom[$key]['value'] == 'tr')) AND (isset($dom[$key]['align']))) { + $dom[$key]['align'] = ($this->rtl) ? 'R' : 'L'; + } + // vertically align image in line + if ((!$this->newline) AND ($dom[$key]['value'] == 'img') AND (isset($dom[$key]['attribute']['height'])) AND ($dom[$key]['attribute']['height'] > 0)) { + // get image height + $imgh = $this->getHTMLUnitToUnits($dom[$key]['attribute']['height'], $this->lasth, 'px'); + // check for automatic line break + $autolinebreak = false; + if (isset($dom[$key]['attribute']['width']) AND ($dom[$key]['attribute']['width'] > 0)) { + $imgw = $this->getHTMLUnitToUnits($dom[$key]['attribute']['width'], 1, 'px', false); + if (($this->rtl AND (($this->x - $imgw) < ($this->lMargin + $this->cMargin))) + OR (!$this->rtl AND (($this->x + $imgw) > ($this->w - $this->rMargin - $this->cMargin)))) { + // add automatic line break + $autolinebreak = true; + $this->Ln('', $cell); + // go back to evaluate this line break + --$key; + } + } + if (!$autolinebreak) { + if (!$this->InFooter) { + $pre_y = $this->y; + // check for page break + if ((!$this->checkPageBreak($imgh)) AND ($this->y < $pre_y)) { + // fix for multicolumn mode + $startliney = $this->y; + } + } + if ($this->page > $startlinepage) { + // fix line splitted over two pages + if (isset($this->footerlen[$startlinepage])) { + $curpos = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; + } + // line to be moved one page forward + $pagebuff = $this->getPageBuffer($startlinepage); + $linebeg = substr($pagebuff, $startlinepos, ($curpos - $startlinepos)); + $tstart = substr($pagebuff, 0, $startlinepos); + $tend = substr($this->getPageBuffer($startlinepage), $curpos); + // remove line from previous page + $this->setPageBuffer($startlinepage, $tstart.''.$tend); + $pagebuff = $this->getPageBuffer($this->page); + $tstart = substr($pagebuff, 0, $this->cntmrk[$this->page]); + $tend = substr($pagebuff, $this->cntmrk[$this->page]); + // add line start to current page + $yshift = $minstartliney - $this->y; + if ($fontaligned) { + $yshift += ($curfontsize / $this->k); + } + $try = sprintf('1 0 0 1 0 %.3F cm', ($yshift * $this->k)); + $this->setPageBuffer($this->page, $tstart."\nq\n".$try."\n".$linebeg."\nQ\n".$tend); + // shift the annotations and links + if (isset($this->PageAnnots[$this->page])) { + $next_pask = count($this->PageAnnots[$this->page]); + } else { + $next_pask = 0; + } + if (isset($this->PageAnnots[$startlinepage])) { + foreach ($this->PageAnnots[$startlinepage] as $pak => $pac) { + if ($pak >= $pask) { + $this->PageAnnots[$this->page][] = $pac; + unset($this->PageAnnots[$startlinepage][$pak]); + $npak = count($this->PageAnnots[$this->page]) - 1; + $this->PageAnnots[$this->page][$npak]['y'] -= $yshift; + } + } + } + $pask = $next_pask; + $startlinepos = $this->cntmrk[$this->page]; + $startlinepage = $this->page; + $startliney = $this->y; + } + $this->y += ((($curfontsize * $this->cell_height_ratio / $this->k) + $curfontascent - $curfontdescent) / 2) - $imgh; + $minstartliney = min($this->y, $minstartliney); + $maxbottomliney = ($startliney + ($this->FontSize * $this->cell_height_ratio)); + } + } elseif (isset($dom[$key]['fontname']) OR isset($dom[$key]['fontstyle']) OR isset($dom[$key]['fontsize'])) { + // account for different font size + $pfontname = $curfontname; + $pfontstyle = $curfontstyle; + $pfontsize = $curfontsize; + $fontname = isset($dom[$key]['fontname']) ? $dom[$key]['fontname'] : $curfontname; + $fontstyle = isset($dom[$key]['fontstyle']) ? $dom[$key]['fontstyle'] : $curfontstyle; + $fontsize = isset($dom[$key]['fontsize']) ? $dom[$key]['fontsize'] : $curfontsize; + $fontascent = $this->getFontAscent($fontname, $fontstyle, $fontsize); + $fontdescent = $this->getFontDescent($fontname, $fontstyle, $fontsize); + if (($fontname != $curfontname) OR ($fontstyle != $curfontstyle) OR ($fontsize != $curfontsize)) { + if (is_numeric($fontsize) AND ($fontsize >= 0) + AND is_numeric($curfontsize) AND ($curfontsize >= 0) + AND ($fontsize != $curfontsize) AND (!$this->newline) + AND ($key < ($maxel - 1)) + ) { + if ((!$this->newline) AND ($this->page > $startlinepage)) { + // fix lines splitted over two pages + if (isset($this->footerlen[$startlinepage])) { + $curpos = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; + } + // line to be moved one page forward + $pagebuff = $this->getPageBuffer($startlinepage); + $linebeg = substr($pagebuff, $startlinepos, ($curpos - $startlinepos)); + $tstart = substr($pagebuff, 0, $startlinepos); + $tend = substr($this->getPageBuffer($startlinepage), $curpos); + // remove line start from previous page + $this->setPageBuffer($startlinepage, $tstart.''.$tend); + $pagebuff = $this->getPageBuffer($this->page); + $tstart = substr($pagebuff, 0, $this->cntmrk[$this->page]); + $tend = substr($pagebuff, $this->cntmrk[$this->page]); + // add line start to current page + $yshift = $minstartliney - $this->y; + $try = sprintf('1 0 0 1 0 %.3F cm', ($yshift * $this->k)); + $this->setPageBuffer($this->page, $tstart."\nq\n".$try."\n".$linebeg."\nQ\n".$tend); + // shift the annotations and links + if (isset($this->PageAnnots[$this->page])) { + $next_pask = count($this->PageAnnots[$this->page]); + } else { + $next_pask = 0; + } + if (isset($this->PageAnnots[$startlinepage])) { + foreach ($this->PageAnnots[$startlinepage] as $pak => $pac) { + if ($pak >= $pask) { + $this->PageAnnots[$this->page][] = $pac; + unset($this->PageAnnots[$startlinepage][$pak]); + $npak = count($this->PageAnnots[$this->page]) - 1; + $this->PageAnnots[$this->page][$npak]['y'] -= $yshift; + } + } + } + $pask = $next_pask; + $startlinepos = $this->cntmrk[$this->page]; + $startlinepage = $this->page; + $startliney = $this->y; + } + if (!$dom[$key]['block']) { + $this->y += ((($curfontsize - $fontsize) * $this->cell_height_ratio / $this->k) + $curfontascent - $fontascent - $curfontdescent + $fontdescent) / 2; + $minstartliney = min($this->y, $minstartliney); + $maxbottomliney = max(($this->y + (($fontsize * $this->cell_height_ratio) / $this->k)), $maxbottomliney); + } + $fontaligned = true; + } + $this->SetFont($fontname, $fontstyle, $fontsize); + $this->lasth = $this->FontSize * $this->cell_height_ratio; + $curfontname = $fontname; + $curfontstyle = $fontstyle; + $curfontsize = $fontsize; + $curfontascent = $fontascent; + $curfontdescent = $fontdescent; + } + } + // set text rendering mode + $textstroke = isset($dom[$key]['stroke']) ? $dom[$key]['stroke'] : $this->textstrokewidth; + $textfill = isset($dom[$key]['fill']) ? $dom[$key]['fill'] : (($this->textrendermode % 2) == 0); + $textclip = isset($dom[$key]['clip']) ? $dom[$key]['clip'] : ($this->textrendermode > 3); + $this->setTextRenderingMode($textstroke, $textfill, $textclip); + if (($plalign == 'J') AND $dom[$key]['block']) { + $plalign = ''; + } + // get current position on page buffer + $curpos = $this->pagelen[$startlinepage]; + if (isset($dom[$key]['bgcolor']) AND ($dom[$key]['bgcolor'] !== false)) { + $this->SetFillColorArray($dom[$key]['bgcolor']); + $wfill = true; + } else { + $wfill = $fill | false; + } + if (isset($dom[$key]['fgcolor']) AND ($dom[$key]['fgcolor'] !== false)) { + $this->SetTextColorArray($dom[$key]['fgcolor']); + } + if (isset($dom[$key]['strokecolor']) AND ($dom[$key]['strokecolor'] !== false)) { + $this->SetDrawColorArray($dom[$key]['strokecolor']); + } + if (isset($dom[$key]['align'])) { + $lalign = $dom[$key]['align']; + } + if ($this->empty_string($lalign)) { + $lalign = $align; + } + } + // align lines + if ($this->newline AND (strlen($dom[$key]['value']) > 0) AND ($dom[$key]['value'] != 'td') AND ($dom[$key]['value'] != 'th')) { + $newline = true; + $fontaligned = false; + // we are at the beginning of a new line + if (isset($startlinex)) { + $yshift = $minstartliney - $startliney; + if (($yshift > 0) OR ($this->page > $startlinepage)) { + $yshift = 0; + } + $t_x = 0; + // the last line must be shifted to be aligned as requested + $linew = abs($this->endlinex - $startlinex); + $pstart = substr($this->getPageBuffer($startlinepage), 0, $startlinepos); + if (isset($opentagpos) AND isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)) { + $this->footerpos[$startlinepage] = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; + $midpos = min($opentagpos, $this->footerpos[$startlinepage]); + } elseif (isset($opentagpos)) { + $midpos = $opentagpos; + } elseif (isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)) { + $this->footerpos[$startlinepage] = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; + $midpos = $this->footerpos[$startlinepage]; + } else { + $midpos = 0; + } + if ($midpos > 0) { + $pmid = substr($this->getPageBuffer($startlinepage), $startlinepos, ($midpos - $startlinepos)); + $pend = substr($this->getPageBuffer($startlinepage), $midpos); + } else { + $pmid = substr($this->getPageBuffer($startlinepage), $startlinepos); + $pend = ''; + } + if ((isset($plalign) AND ((($plalign == 'C') OR ($plalign == 'J') OR (($plalign == 'R') AND (!$this->rtl)) OR (($plalign == 'L') AND ($this->rtl))))) OR ($yshift < 0)) { + // calculate shifting amount + $tw = $w; + if (($plalign == 'J') AND $this->isRTLTextDir() AND ($this->num_columns > 1)) { + $tw += $this->cMargin; + } + if ($this->lMargin != $prevlMargin) { + $tw += ($prevlMargin - $this->lMargin); + } + if ($this->rMargin != $prevrMargin) { + $tw += ($prevrMargin - $this->rMargin); + } + $one_space_width = $this->GetStringWidth(chr(32)); + $mdiff = abs($tw - $linew); + if ($plalign == 'C') { + if ($this->rtl) { + $t_x = -($mdiff / 2); + } else { + $t_x = ($mdiff / 2); + } + } elseif (($plalign == 'R') AND (!$this->rtl)) { + // right alignment on LTR document + if (intval($this->revstrpos($pmid, ')]')) == (intval($this->revstrpos($pmid, ' )]')) + 1)) { + // remove last space (if any) + $linew -= $one_space_width; + $mdiff = abs($tw - $linew); + } + $t_x = $mdiff; + } elseif (($plalign == 'L') AND ($this->rtl)) { + // left alignment on RTL document + if (($this->revstrpos($pmid, '[(') > 0) AND ((intval($this->revstrpos($pmid, '[( ')) == intval($this->revstrpos($pmid, '[('))) OR (intval($this->revstrpos($pmid, '[('.chr(0).chr(32))) == intval($this->revstrpos($pmid, '[('))))) { + // remove first space (if any) + $linew -= $one_space_width; + } + if ((strpos($pmid, '[(') > 0) AND (intval(strpos($pmid, '[(')) == (intval($this->revstrpos($pmid, '[('))))) { + // remove last space (if any) + $linew -= $one_space_width; + if (($this->CurrentFont['type'] == 'TrueTypeUnicode') OR ($this->CurrentFont['type'] == 'cidfont0')) { + $linew -= $one_space_width; + } + } + $mdiff = abs($tw - $linew); + $t_x = -$mdiff; + } elseif (($plalign == 'J') AND ($plalign == $lalign)) { + // Justification + if ($this->isRTLTextDir()) { + $t_x = $this->lMargin - $this->endlinex + $this->cMargin; + } + $no = 0; // spaces without trim + $ns = 0; // spaces with trim + $pmidtemp = $pmid; + // escape special characters + $pmidtemp = preg_replace('/[\\\][\(]/x', '\\#!#OP#!#', $pmidtemp); + $pmidtemp = preg_replace('/[\\\][\)]/x', '\\#!#CP#!#', $pmidtemp); + // search spaces + if (preg_match_all('/\[\(([^\)]*)\)\]/x', $pmidtemp, $lnstring, PREG_PATTERN_ORDER)) { + $spacestr = $this->getSpaceString(); + $maxkk = count($lnstring[1]) - 1; + for ($kk=0; $kk <= $maxkk; ++$kk) { + // restore special characters + $lnstring[1][$kk] = str_replace('#!#OP#!#', '(', $lnstring[1][$kk]); + $lnstring[1][$kk] = str_replace('#!#CP#!#', ')', $lnstring[1][$kk]); + if ($kk == $maxkk) { + if ($this->isRTLTextDir()) { + $tvalue = ltrim($lnstring[1][$kk]); + } else { + $tvalue = rtrim($lnstring[1][$kk]); + } + } else { + $tvalue = $lnstring[1][$kk]; + } + // store number of spaces on the strings + $lnstring[2][$kk] = substr_count($lnstring[1][$kk], $spacestr); + $lnstring[3][$kk] = substr_count($tvalue, $spacestr); + // count total spaces on line + $no += $lnstring[2][$kk]; + $ns += $lnstring[3][$kk]; + $lnstring[4][$kk] = $no; + $lnstring[5][$kk] = $ns; + } + if ($this->isRTLTextDir()) { + $t_x = $this->lMargin - $this->endlinex + $this->cMargin - (($no - $ns) * $one_space_width); + } + // calculate additional space to add to each space + $spacelen = $one_space_width; + $spacewidth = ((($tw - $linew) + (($no - $ns) * $spacelen)) / ($ns?$ns:1)) * $this->k; + $spacewidthu = -1000 * (($tw - $linew) + ($no * $spacelen)) / ($ns?$ns:1) / $this->FontSize; + $nsmax = $ns; + $ns = 0; + reset($lnstring); + $offset = 0; + $strcount = 0; + $prev_epsposbeg = 0; + $textpos = 0; + if ($this->isRTLTextDir()) { + $textpos = $this->wPt; + } + global $spacew; + while (preg_match('/([0-9\.\+\-]*)[\s](Td|cm|m|l|c|re)[\s]/x', $pmid, $strpiece, PREG_OFFSET_CAPTURE, $offset) == 1) { + // check if we are inside a string section '[( ... )]' + $stroffset = strpos($pmid, '[(', $offset); + if (($stroffset !== false) AND ($stroffset <= $strpiece[2][1])) { + // set offset to the end of string section + $offset = strpos($pmid, ')]', $stroffset); + while (($offset !== false) AND ($pmid{($offset - 1)} == '\\')) { + $offset = strpos($pmid, ')]', ($offset + 1)); + } + if ($offset === false) { + $this->Error('HTML Justification: malformed PDF code.'); + } + continue; + } + if ($this->isRTLTextDir()) { + $spacew = ($spacewidth * ($nsmax - $ns)); + } else { + $spacew = ($spacewidth * $ns); + } + $offset = $strpiece[2][1] + strlen($strpiece[2][0]); + $epsposbeg = strpos($pmid, 'q'.$this->epsmarker, $offset); + $epsposend = strpos($pmid, $this->epsmarker.'Q', $offset) + strlen($this->epsmarker.'Q'); + if ((($epsposbeg > 0) AND ($epsposend > 0) AND ($offset > $epsposbeg) AND ($offset < $epsposend)) + OR (($epsposbeg === false) AND ($epsposend > 0) AND ($offset < $epsposend))) { + // shift EPS images + $trx = sprintf('1 0 0 1 %.3F 0 cm', $spacew); + $epsposbeg = strpos($pmid, 'q'.$this->epsmarker, ($prev_epsposbeg - 6)); + $pmid_b = substr($pmid, 0, $epsposbeg); + $pmid_m = substr($pmid, $epsposbeg, ($epsposend - $epsposbeg)); + $pmid_e = substr($pmid, $epsposend); + $pmid = $pmid_b."\nq\n".$trx."\n".$pmid_m."\nQ\n".$pmid_e; + $offset = $epsposend; + continue; + + } + $prev_epsposbeg = $epsposbeg; + $currentxpos = 0; + // shift blocks of code + switch ($strpiece[2][0]) { + case 'Td': + case 'cm': + case 'm': + case 'l': { + // get current X position + preg_match('/([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s]('.$strpiece[2][0].')([\s]*)/x', $pmid, $xmatches); + $currentxpos = $xmatches[1]; + $textpos = $currentxpos; + if (($strcount <= $maxkk) AND ($strpiece[2][0] == 'Td')) { + if ($strcount == $maxkk) { + if ($this->isRTLTextDir()) { + $tvalue = $lnstring[1][$strcount]; + } else { + $tvalue = rtrim($lnstring[1][$strcount]); + } + } else { + $tvalue = $lnstring[1][$strcount]; + } + $ns += substr_count($tvalue, $spacestr); + ++$strcount; + } + if ($this->isRTLTextDir()) { + $spacew = ($spacewidth * ($nsmax - $ns)); + } + // justify block + $pmid = preg_replace_callback('/([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s]('.$strpiece[2][0].')([\s]*)/x', + create_function('$matches', 'global $spacew; + $newx = sprintf("%.2F",(floatval($matches[1]) + $spacew)); + return "".$newx." ".$matches[2]." x*#!#*x".$matches[3].$matches[4];'), $pmid, 1); + break; + } + case 're': { + // justify block + preg_match('/([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s](re)([\s]*)/x', $pmid, $xmatches); + $currentxpos = $xmatches[1]; + global $x_diff, $w_diff; + $x_diff = 0; + $w_diff = 0; + if ($this->isRTLTextDir()) { // RTL + if ($currentxpos < $textpos) { + $x_diff = ($spacewidth * ($nsmax - $lnstring[5][$strcount])); + $w_diff = ($spacewidth * $lnstring[3][$strcount]); + } else { + if ($strcount > 0) { + $x_diff = ($spacewidth * ($nsmax - $lnstring[5][($strcount - 1)])); + $w_diff = ($spacewidth * $lnstring[3][($strcount - 1)]); + } + } + } else { // LTR + if ($currentxpos > $textpos) { + if ($strcount > 0) { + $x_diff = ($spacewidth * $lnstring[4][($strcount - 1)]); + } + $w_diff = ($spacewidth * $lnstring[3][$strcount]); + } else { + if ($strcount > 1) { + $x_diff = ($spacewidth * $lnstring[4][($strcount - 2)]); + } + if ($strcount > 0) { + $w_diff = ($spacewidth * $lnstring[3][($strcount - 1)]); + } + } + } + $pmid = preg_replace_callback('/('.$xmatches[1].')[\s]('.$xmatches[2].')[\s]('.$xmatches[3].')[\s]('.$strpiece[1][0].')[\s](re)([\s]*)/x', + create_function('$matches', 'global $x_diff, $w_diff; + $newx = sprintf("%.2F",(floatval($matches[1]) + $x_diff)); + $neww = sprintf("%.2F",(floatval($matches[3]) + $w_diff)); + return "".$newx." ".$matches[2]." ".$neww." ".$matches[4]." x*#!#*x".$matches[5].$matches[6];'), $pmid, 1); + break; + } + case 'c': { + // get current X position + preg_match('/([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]([0-9\.\+\-]*)[\s]('.$strpiece[1][0].')[\s](c)([\s]*)/x', $pmid, $xmatches); + $currentxpos = $xmatches[1]; + // justify block + $pmid = preg_replace_callback('/('.$xmatches[1].')[\s]('.$xmatches[2].')[\s]('.$xmatches[3].')[\s]('.$xmatches[4].')[\s]('.$xmatches[5].')[\s]('.$strpiece[1][0].')[\s](c)([\s]*)/x', + create_function('$matches', 'global $spacew; + $newx1 = sprintf("%.3F",(floatval($matches[1]) + $spacew)); + $newx2 = sprintf("%.3F",(floatval($matches[3]) + $spacew)); + $newx3 = sprintf("%.3F",(floatval($matches[5]) + $spacew)); + return "".$newx1." ".$matches[2]." ".$newx2." ".$matches[4]." ".$newx3." ".$matches[6]." x*#!#*x".$matches[7].$matches[8];'), $pmid, 1); + break; + } + } + // shift the annotations and links + if (isset($this->PageAnnots[$this->page])) { + $cxpos = ($currentxpos / $this->k); + $lmpos = ($this->lMargin + $this->cMargin + $this->feps); + foreach ($this->PageAnnots[$this->page] as $pak => $pac) { + if (($pac['y'] >= $minstartliney) AND (($pac['x'] * $this->k) >= ($currentxpos - $this->feps)) AND (($pac['x'] * $this->k) <= ($currentxpos + $this->feps))) { + if ($cxpos > $lmpos) { + $this->PageAnnots[$this->page][$pak]['x'] += (($spacew - $one_space_width) / $this->k); + $this->PageAnnots[$this->page][$pak]['w'] += (($spacewidth * $pac['numspaces']) / $this->k); + } else { + $this->PageAnnots[$this->page][$pak]['w'] += ((($spacewidth * $pac['numspaces']) - $one_space_width) / $this->k); + } + break; + } + } + } + } // end of while + // remove markers + $pmid = str_replace('x*#!#*x', '', $pmid); + if (($this->CurrentFont['type'] == 'TrueTypeUnicode') OR ($this->CurrentFont['type'] == 'cidfont0')) { + // multibyte characters + $spacew = $spacewidthu; + $pmidtemp = $pmid; + // escape special characters + $pmidtemp = preg_replace('/[\\\][\(]/x', '\\#!#OP#!#', $pmidtemp); + $pmidtemp = preg_replace('/[\\\][\)]/x', '\\#!#CP#!#', $pmidtemp); + $pmid = preg_replace_callback("/\[\(([^\)]*)\)\]/x", + create_function('$matches', 'global $spacew; + $matches[1] = str_replace("#!#OP#!#", "(", $matches[1]); + $matches[1] = str_replace("#!#CP#!#", ")", $matches[1]); + return "[(".str_replace(chr(0).chr(32), ") ".sprintf("%.3F", $spacew)." (", $matches[1]).")]";'), $pmidtemp); + $this->setPageBuffer($startlinepage, $pstart."\n".$pmid."\n".$pend); + $endlinepos = strlen($pstart."\n".$pmid."\n"); + } else { + // non-unicode (single-byte characters) + $rs = sprintf('%.3F Tw', $spacewidth); + $pmid = preg_replace("/\[\(/x", $rs.' [(', $pmid); + $this->setPageBuffer($startlinepage, $pstart."\n".$pmid."\nBT 0 Tw ET\n".$pend); + $endlinepos = strlen($pstart."\n".$pmid."\nBT 0 Tw ET\n"); + } + } + } // end of J + } // end if $startlinex + if (($t_x != 0) OR ($yshift < 0)) { + // shift the line + $trx = sprintf('1 0 0 1 %.3F %.3F cm', ($t_x * $this->k), ($yshift * $this->k)); + $this->setPageBuffer($startlinepage, $pstart."\nq\n".$trx."\n".$pmid."\nQ\n".$pend); + $endlinepos = strlen($pstart."\nq\n".$trx."\n".$pmid."\nQ\n"); + // shift the annotations and links + if (isset($this->PageAnnots[$this->page])) { + foreach ($this->PageAnnots[$this->page] as $pak => $pac) { + if ($pak >= $pask) { + $this->PageAnnots[$this->page][$pak]['x'] += $t_x; + $this->PageAnnots[$this->page][$pak]['y'] -= $yshift; + } + } + } + $this->y -= $yshift; + } + } + $this->newline = false; + $pbrk = $this->checkPageBreak($this->lasth); + $startlinex = $this->x; + $startliney = $this->y; + $minstartliney = $startliney; + $maxbottomliney = ($this->y + (($fontsize * $this->cell_height_ratio) / $this->k)); + $startlinepage = $this->page; + if (isset($endlinepos) AND (!$pbrk)) { + $startlinepos = $endlinepos; + } else { + if (!$this->InFooter) { + if (isset($this->footerlen[$this->page])) { + $this->footerpos[$this->page] = $this->pagelen[$this->page] - $this->footerlen[$this->page]; + } else { + $this->footerpos[$this->page] = $this->pagelen[$this->page]; + } + $startlinepos = $this->footerpos[$this->page]; + } else { + $startlinepos = $this->pagelen[$this->page]; + } + } + unset($endlinepos); + $plalign = $lalign; + if (isset($this->PageAnnots[$this->page])) { + $pask = count($this->PageAnnots[$this->page]); + } else { + $pask = 0; + } + $this->SetFont($fontname, $fontstyle, $fontsize); + if ($wfill) { + $this->SetFillColorArray($this->bgcolor); + } + } // end newline + if (isset($opentagpos)) { + unset($opentagpos); + } + if ($dom[$key]['tag']) { + if ($dom[$key]['opening']) { + // get text indentation (if any) + if (isset($dom[$key]['text-indent']) AND $dom[$key]['block']) { + $this->textindent = $dom[$key]['text-indent']; + $this->newline = true; + } + if ($dom[$key]['value'] == 'table') { + // available page width + if ($this->rtl) { + $wtmp = $this->x - $this->lMargin; + } else { + $wtmp = $this->w - $this->rMargin - $this->x; + } + if (isset($dom[$key]['attribute']['nested']) AND ($dom[$key]['attribute']['nested'] == 'true')) { + // add margin for nested tables + $wtmp -= $this->cMargin; + } + // table width + if (isset($dom[$key]['width'])) { + $table_width = $this->getHTMLUnitToUnits($dom[$key]['width'], $wtmp, 'px'); + } else { + $table_width = $wtmp; + } + } + if (($dom[$key]['value'] == 'td') OR ($dom[$key]['value'] == 'th')) { + $trid = $dom[$key]['parent']; + $table_el = $dom[$trid]['parent']; + if (!isset($dom[$table_el]['cols'])) { + $dom[$table_el]['cols'] = $dom[$trid]['cols']; + } + $oldmargin = $this->cMargin; + if (isset($dom[($dom[$trid]['parent'])]['attribute']['cellpadding'])) { + $currentcmargin = $this->getHTMLUnitToUnits($dom[($dom[$trid]['parent'])]['attribute']['cellpadding'], 1, 'px'); + } else { + $currentcmargin = 0; + } + $this->cMargin = $currentcmargin; + if (isset($dom[($dom[$trid]['parent'])]['attribute']['cellspacing'])) { + $cellspacing = $this->getHTMLUnitToUnits($dom[($dom[$trid]['parent'])]['attribute']['cellspacing'], 1, 'px'); + } else { + $cellspacing = 0; + } + if ($this->rtl) { + $cellspacingx = -$cellspacing; + } else { + $cellspacingx = $cellspacing; + } + $colspan = $dom[$key]['attribute']['colspan']; + $table_columns_width = ($table_width - ($cellspacing * ($dom[$table_el]['cols'] - 1))); + $wtmp = ($colspan * ($table_columns_width / $dom[$table_el]['cols'])) + (($colspan - 1) * $cellspacing); + if (isset($dom[$key]['width'])) { + $cellw = $this->getHTMLUnitToUnits($dom[$key]['width'], $table_columns_width, 'px'); + } else { + $cellw = $wtmp; + } + if (isset($dom[$key]['height'])) { + // minimum cell height + $cellh = $this->getHTMLUnitToUnits($dom[$key]['height'], 0, 'px'); + } else { + $cellh = 0; + } + if (isset($dom[$key]['content'])) { + $cell_content = $dom[$key]['content']; + } else { + $cell_content = '&nbsp;'; + } + $tagtype = $dom[$key]['value']; + $parentid = $key; + while (($key < $maxel) AND (!(($dom[$key]['tag']) AND (!$dom[$key]['opening']) AND ($dom[$key]['value'] == $tagtype) AND ($dom[$key]['parent'] == $parentid)))) { + // move $key index forward + ++$key; + } + if (!isset($dom[$trid]['startpage'])) { + $dom[$trid]['startpage'] = $this->page; + } else { + $this->setPage($dom[$trid]['startpage']); + } + if (!isset($dom[$trid]['starty'])) { + $dom[$trid]['starty'] = $this->y; + } else { + $this->y = $dom[$trid]['starty']; + } + if (!isset($dom[$trid]['startx'])) { + $dom[$trid]['startx'] = $this->x; + } else { + $this->x += ($cellspacingx / 2); + } + if (isset($dom[$parentid]['attribute']['rowspan'])) { + $rowspan = intval($dom[$parentid]['attribute']['rowspan']); + } else { + $rowspan = 1; + } + // skip row-spanned cells started on the previous rows + if (isset($dom[$table_el]['rowspans'])) { + $rsk = 0; + $rskmax = count($dom[$table_el]['rowspans']); + while ($rsk < $rskmax) { + $trwsp = $dom[$table_el]['rowspans'][$rsk]; + $rsstartx = $trwsp['startx']; + $rsendx = $trwsp['endx']; + // account for margin changes + if ($trwsp['startpage'] < $this->page) { + if (($this->rtl) AND ($this->pagedim[$this->page]['orm'] != $this->pagedim[$trwsp['startpage']]['orm'])) { + $dl = ($this->pagedim[$this->page]['orm'] - $this->pagedim[$trwsp['startpage']]['orm']); + $rsstartx -= $dl; + $rsendx -= $dl; + } elseif ((!$this->rtl) AND ($this->pagedim[$this->page]['olm'] != $this->pagedim[$trwsp['startpage']]['olm'])) { + $dl = ($this->pagedim[$this->page]['olm'] - $this->pagedim[$trwsp['startpage']]['olm']); + $rsstartx += $dl; + $rsendx += $dl; + } + } + if (($trwsp['rowspan'] > 0) + AND ($rsstartx > ($this->x - $cellspacing - $currentcmargin - $this->feps)) + AND ($rsstartx < ($this->x + $cellspacing + $currentcmargin + $this->feps)) + AND (($trwsp['starty'] < ($this->y - $this->feps)) OR ($trwsp['startpage'] < $this->page))) { + // set the starting X position of the current cell + $this->x = $rsendx + $cellspacingx; + if (($trwsp['rowspan'] == 1) + AND (isset($dom[$trid]['endy'])) + AND (isset($dom[$trid]['endpage'])) + AND ($trwsp['endpage'] == $dom[$trid]['endpage'])) { + // set ending Y position for row + $dom[$table_el]['rowspans'][$rsk]['endy'] = max($dom[$trid]['endy'], $trwsp['endy']); + $dom[$trid]['endy'] = $dom[$table_el]['rowspans'][$rsk]['endy']; + } + $rsk = 0; + } else { + ++$rsk; + } + } + } + // add rowspan information to table element + if ($rowspan > 1) { + $trsid = array_push($dom[$table_el]['rowspans'], array('trid' => $trid, 'rowspan' => $rowspan, 'mrowspan' => $rowspan, 'colspan' => $colspan, 'startpage' => $this->page, 'startx' => $this->x, 'starty' => $this->y)); + } + $cellid = array_push($dom[$trid]['cellpos'], array('startx' => $this->x)); + if ($rowspan > 1) { + $dom[$trid]['cellpos'][($cellid - 1)]['rowspanid'] = ($trsid - 1); + } + // push background colors + if (isset($dom[$parentid]['bgcolor']) AND ($dom[$parentid]['bgcolor'] !== false)) { + $dom[$trid]['cellpos'][($cellid - 1)]['bgcolor'] = $dom[$parentid]['bgcolor']; + } + $prevLastH = $this->lasth; + // ****** write the cell content ****** + $this->MultiCell($cellw, $cellh, $cell_content, false, $lalign, false, 2, '', '', true, 0, true); + $this->lasth = $prevLastH; + $this->cMargin = $oldmargin; + $dom[$trid]['cellpos'][($cellid - 1)]['endx'] = $this->x; + // update the end of row position + if ($rowspan <= 1) { + if (isset($dom[$trid]['endy'])) { + if ($this->page == $dom[$trid]['endpage']) { + $dom[$trid]['endy'] = max($this->y, $dom[$trid]['endy']); + } elseif ($this->page > $dom[$trid]['endpage']) { + $dom[$trid]['endy'] = $this->y; + } + } else { + $dom[$trid]['endy'] = $this->y; + } + if (isset($dom[$trid]['endpage'])) { + $dom[$trid]['endpage'] = max($this->page, $dom[$trid]['endpage']); + } else { + $dom[$trid]['endpage'] = $this->page; + } + } else { + // account for row-spanned cells + $dom[$table_el]['rowspans'][($trsid - 1)]['endx'] = $this->x; + $dom[$table_el]['rowspans'][($trsid - 1)]['endy'] = $this->y; + $dom[$table_el]['rowspans'][($trsid - 1)]['endpage'] = $this->page; + } + if (isset($dom[$table_el]['rowspans'])) { + // update endy and endpage on rowspanned cells + foreach ($dom[$table_el]['rowspans'] as $k => $trwsp) { + if ($trwsp['rowspan'] > 0) { + if (isset($dom[$trid]['endpage'])) { + if ($trwsp['endpage'] == $dom[$trid]['endpage']) { + $dom[$table_el]['rowspans'][$k]['endy'] = max($dom[$trid]['endy'], $trwsp['endy']); + } elseif ($trwsp['endpage'] < $dom[$trid]['endpage']) { + $dom[$table_el]['rowspans'][$k]['endy'] = $dom[$trid]['endy']; + $dom[$table_el]['rowspans'][$k]['endpage'] = $dom[$trid]['endpage']; + } else { + $dom[$trid]['endy'] = $this->pagedim[$dom[$trid]['endpage']]['hk'] - $this->pagedim[$dom[$trid]['endpage']]['bm']; + } + } + } + } + } + $this->x += ($cellspacingx / 2); + } else { + // opening tag (or self-closing tag) + if (!isset($opentagpos)) { + if (!$this->InFooter) { + if (isset($this->footerlen[$this->page])) { + $this->footerpos[$this->page] = $this->pagelen[$this->page] - $this->footerlen[$this->page]; + } else { + $this->footerpos[$this->page] = $this->pagelen[$this->page]; + } + $opentagpos = $this->footerpos[$this->page]; + } + } + $this->openHTMLTagHandler($dom, $key, $cell); + } + } else { + // closing tag + $this->closeHTMLTagHandler($dom, $key, $cell, $maxbottomliney); + } + } elseif (strlen($dom[$key]['value']) > 0) { + // print list-item + if (!$this->empty_string($this->lispacer)) { + $this->SetFont($pfontname, $pfontstyle, $pfontsize); + $this->lasth = $this->FontSize * $this->cell_height_ratio; + $minstartliney = $this->y; + $maxbottomliney = ($startliney + ($this->FontSize * $this->cell_height_ratio)); + $this->putHtmlListBullet($this->listnum, $this->lispacer, $pfontsize); + $this->SetFont($curfontname, $curfontstyle, $curfontsize); + $this->lasth = $this->FontSize * $this->cell_height_ratio; + if (is_numeric($pfontsize) AND ($pfontsize > 0) AND is_numeric($curfontsize) AND ($curfontsize > 0) AND ($pfontsize != $curfontsize)) { + $pfontascent = $this->getFontAscent($pfontname, $pfontstyle, $pfontsize); + $pfontdescent = $this->getFontDescent($pfontname, $pfontstyle, $pfontsize); + $this->y += ((($pfontsize - $curfontsize) * $this->cell_height_ratio / $this->k) + $pfontascent - $curfontascent - $pfontdescent + $curfontdescent) / 2; + $minstartliney = min($this->y, $minstartliney); + $maxbottomliney = max(($this->y + (($pfontsize * $this->cell_height_ratio) / $this->k)), $maxbottomliney); + } + } + // text + $this->htmlvspace = 0; + if ((!$this->premode) AND $this->isRTLTextDir()) { + // reverse spaces order + $len1 = strlen($dom[$key]['value']); + $lsp = $len1 - strlen(ltrim($dom[$key]['value'])); + $rsp = $len1 - strlen(rtrim($dom[$key]['value'])); + $tmpstr = ''; + if ($rsp > 0) { + $tmpstr .= substr($dom[$key]['value'], -$rsp); + } + $tmpstr .= trim($dom[$key]['value']); + if ($lsp > 0) { + $tmpstr .= substr($dom[$key]['value'], 0, $lsp); + } + $dom[$key]['value'] = $tmpstr; + } + if ($newline) { + if (!$this->premode) { + $prelen = strlen($dom[$key]['value']); + if ($this->isRTLTextDir()) { + $dom[$key]['value'] = rtrim($dom[$key]['value']).chr(0); + } else { + $dom[$key]['value'] = ltrim($dom[$key]['value']); + } + $postlen = strlen($dom[$key]['value']); + if (($postlen == 0) AND ($prelen > 0)) { + $dom[$key]['trimmed_space'] = true; + } + } + $newline = false; + $firstblock = true; + } else { + $firstblock = false; + } + $strrest = ''; + if ($this->rtl) { + $this->x -= $this->textindent; + } else { + $this->x += $this->textindent; + } + if (!empty($this->HREF) AND (isset($this->HREF['url']))) { + // HTML <a> Link + $strrest = $this->addHtmlLink($this->HREF['url'], $dom[$key]['value'], $wfill, true, $this->HREF['color'], $this->HREF['style'], true); + } else { + // ****** write only until the end of the line and get the rest ****** + $strrest = $this->Write($this->lasth, $dom[$key]['value'], '', $wfill, '', false, 0, true, $firstblock, 0); + } + $this->textindent = 0; + + if (strlen($strrest) > 0) { + // store the remaining string on the previous $key position + $this->newline = true; + if ($cell) { + if ($this->rtl) { + $this->x -= $this->cMargin; + } else { + $this->x += $this->cMargin; + } + } + if ($strrest == $dom[$key]['value']) { + // used to avoid infinite loop + ++$loop; + } else { + $loop = 0; + } + if (!empty($this->HREF) AND (isset($this->HREF['url']))) { + $dom[$key]['value'] = trim($strrest); + } elseif ($this->premode) { + $dom[$key]['value'] = $strrest; + } elseif ($this->isRTLTextDir()) { + $dom[$key]['value'] = rtrim($strrest); + } else { + $dom[$key]['value'] = ltrim($strrest); + } + if ($loop < 3) { + --$key; + } + } else { + $loop = 0; + } + } + ++$key; + if (isset($dom[$key]['tag']) AND $dom[$key]['tag'] AND (!isset($dom[$key]['opening']) OR !$dom[$key]['opening']) AND isset($dom[($dom[$key]['parent'])]['attribute']['nobr']) AND ($dom[($dom[$key]['parent'])]['attribute']['nobr'] == 'true')) { + if ( (!$undo) AND (($this->start_transaction_page == ($this->numpages - 1)) OR ($this->y < $this->start_transaction_y))) { + // restore previous object + $this->rollbackTransaction(true); + // restore previous values + foreach ($this_method_vars as $vkey => $vval) { + $$vkey = $vval; + } + // add a page (or trig AcceptPageBreak() for multicolumn mode) + $pre_y = $this->y; + if ((!$this->checkPageBreak($this->PageBreakTrigger + 1)) AND ($this->y < $pre_y)) { + $startliney = $this->y; + } + $undo = true; // avoid infinite loop + } else { + $undo = false; + } + } + } // end for each $key + // align the last line + if (isset($startlinex)) { + $yshift = $minstartliney - $startliney; + if (($yshift > 0) OR ($this->page > $startlinepage)) { + $yshift = 0; + } + $t_x = 0; + // the last line must be shifted to be aligned as requested + $linew = abs($this->endlinex - $startlinex); + $pstart = substr($this->getPageBuffer($startlinepage), 0, $startlinepos); + if (isset($opentagpos) AND isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)) { + $this->footerpos[$startlinepage] = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; + $midpos = min($opentagpos, $this->footerpos[$startlinepage]); + } elseif (isset($opentagpos)) { + $midpos = $opentagpos; + } elseif (isset($this->footerlen[$startlinepage]) AND (!$this->InFooter)) { + $this->footerpos[$startlinepage] = $this->pagelen[$startlinepage] - $this->footerlen[$startlinepage]; + $midpos = $this->footerpos[$startlinepage]; + } else { + $midpos = 0; + } + if ($midpos > 0) { + $pmid = substr($this->getPageBuffer($startlinepage), $startlinepos, ($midpos - $startlinepos)); + $pend = substr($this->getPageBuffer($startlinepage), $midpos); + } else { + $pmid = substr($this->getPageBuffer($startlinepage), $startlinepos); + $pend = ''; + } + if ((isset($plalign) AND ((($plalign == 'C') OR (($plalign == 'R') AND (!$this->rtl)) OR (($plalign == 'L') AND ($this->rtl))))) OR ($yshift < 0)) { + // calculate shifting amount + $tw = $w; + if ($this->lMargin != $prevlMargin) { + $tw += ($prevlMargin - $this->lMargin); + } + if ($this->rMargin != $prevrMargin) { + $tw += ($prevrMargin - $this->rMargin); + } + $one_space_width = $this->GetStringWidth(chr(32)); + $mdiff = abs($tw - $linew); + if ($plalign == 'C') { + if ($this->rtl) { + $t_x = -($mdiff / 2); + } else { + $t_x = ($mdiff / 2); + } + } elseif (($plalign == 'R') AND (!$this->rtl)) { + // right alignment on LTR document + if (intval($this->revstrpos($pmid, ')]')) == (intval($this->revstrpos($pmid, ' )]')) + 1)) { + // remove last space (if any) + $linew -= $one_space_width; + $mdiff = abs($tw - $linew); + } + $t_x = $mdiff; + } elseif (($plalign == 'L') AND ($this->rtl)) { + // left alignment on RTL document + if (($this->revstrpos($pmid, '[(') > 0) AND ((intval($this->revstrpos($pmid, '[( ')) == intval($this->revstrpos($pmid, '[('))) OR (intval($this->revstrpos($pmid, '[('.chr(0).chr(32))) == intval($this->revstrpos($pmid, '[('))))) { + // remove first space (if any) + $linew -= $one_space_width; + } + if ((strpos($pmid, '[(') > 0) AND (intval(strpos($pmid, '[(')) == (intval($this->revstrpos($pmid, '[('))))) { + // remove last space (if any) + $linew -= $one_space_width; + if (($this->CurrentFont['type'] == 'TrueTypeUnicode') OR ($this->CurrentFont['type'] == 'cidfont0')) { + $linew -= $one_space_width; + } + } + $mdiff = abs($tw - $linew); + $t_x = -$mdiff; + } + } // end if startlinex + if (($t_x != 0) OR ($yshift < 0)) { + // shift the line + $trx = sprintf('1 0 0 1 %.3F %.3F cm', ($t_x * $this->k), ($yshift * $this->k)); + $this->setPageBuffer($startlinepage, $pstart."\nq\n".$trx."\n".$pmid."\nQ\n".$pend); + $endlinepos = strlen($pstart."\nq\n".$trx."\n".$pmid."\nQ\n"); + // shift the annotations and links + if (isset($this->PageAnnots[$this->page])) { + foreach ($this->PageAnnots[$this->page] as $pak => $pac) { + if ($pak >= $pask) { + $this->PageAnnots[$this->page][$pak]['x'] += $t_x; + $this->PageAnnots[$this->page][$pak]['y'] -= $yshift; + } + } + } + $this->y -= $yshift; + } + } + if ($ln AND (!($cell AND ($dom[$key-1]['value'] == 'table')))) { + $this->Ln($this->lasth); + if ($this->y < $maxbottomliney) { + $this->y = $maxbottomliney; + } + } + // restore previous values + $this->setGraphicVars($gvars); + if ($this->page > $prevPage) { + $this->lMargin = $this->pagedim[$this->page]['olm']; + $this->rMargin = $this->pagedim[$this->page]['orm']; + } + // restore previous list state + $this->cell_height_ratio = $prev_cell_height_ratio; + $this->listnum = $prev_listnum; + $this->listordered = $prev_listordered; + $this->listcount = $prev_listcount; + $this->lispacer = $prev_lispacer; + unset($dom); + } + + /** + * Process opening tags. + * @param array $dom html dom array + * @param int $key current element id + * @param boolean $cell if true add the default cMargin space to each new line (default false). + * @access protected + */ + protected function openHTMLTagHandler(&$dom, $key, $cell) { + $tag = $dom[$key]; + $parent = $dom[($dom[$key]['parent'])]; + $firstorlast = ($key == 1); + // check for text direction attribute + if (isset($tag['attribute']['dir'])) { + $this->setTempRTL($tag['attribute']['dir']); + } else { + $this->tmprtl = false; + } + if ($tag['block']) { + $hbz = 0; // distance from y to line bottom + $hb = 0; // vertical space between block tags + // calculate vertical space for block tags + if (isset($this->tagvspaces[$tag['value']][0]['h']) AND ($this->tagvspaces[$tag['value']][0]['h'] >= 0)) { + $cur_h = $this->tagvspaces[$tag['value']][0]['h']; + } elseif (isset($tag['fontsize'])) { + $cur_h = ($tag['fontsize'] / $this->k) * $this->cell_height_ratio; + } else { + $cur_h = $this->FontSize * $this->cell_height_ratio; + } + if (isset($this->tagvspaces[$tag['value']][0]['n'])) { + $n = $this->tagvspaces[$tag['value']][0]['n']; + } elseif (preg_match('/[h][0-9]/', $tag['value']) > 0) { + $n = 0.6; + } else { + $n = 1; + } + $hb = ($n * $cur_h); + if (($this->htmlvspace <= 0) AND ($n > 0)) { + if (isset($parent['fontsize'])) { + $hbz = (($parent['fontsize'] / $this->k) * $this->cell_height_ratio); + } else { + $hbz = $this->FontSize * $this->cell_height_ratio; + } + } + } + //Opening tag + switch($tag['value']) { + case 'table': { + $cp = 0; + $cs = 0; + $dom[$key]['rowspans'] = array(); + if (!isset($dom[$key]['attribute']['nested']) OR ($dom[$key]['attribute']['nested'] != 'true')) { + // set table header + if (!$this->empty_string($dom[$key]['thead'])) { + // set table header + $this->thead = $dom[$key]['thead']; + if (!isset($this->theadMargins) OR (empty($this->theadMargins))) { + $this->theadMargins = array(); + $this->theadMargins['cmargin'] = $this->cMargin; + } + } + } + if (isset($tag['attribute']['cellpadding'])) { + $cp = $this->getHTMLUnitToUnits($tag['attribute']['cellpadding'], 1, 'px'); + $this->oldcMargin = $this->cMargin; + $this->cMargin = $cp; + } + if (isset($tag['attribute']['cellspacing'])) { + $cs = $this->getHTMLUnitToUnits($tag['attribute']['cellspacing'], 1, 'px'); + } + if ($this->checkPageBreak(((2 * $cp) + (2 * $cs) + $this->lasth), '', false)) { + $this->inthead = true; + // add a page (or trig AcceptPageBreak() for multicolumn mode) + $this->checkPageBreak($this->PageBreakTrigger + 1); + } + break; + } + case 'tr': { + // array of columns positions + $dom[$key]['cellpos'] = array(); + break; + } + case 'hr': { + $wtmp = $this->w - $this->lMargin - $this->rMargin; + if ((isset($tag['attribute']['width'])) AND ($tag['attribute']['width'] != '')) { + $hrWidth = $this->getHTMLUnitToUnits($tag['attribute']['width'], $wtmp, 'px'); + } else { + $hrWidth = $wtmp; + } + if ((isset($tag['height'])) AND ($tag['height'] != '')) { + $hrHeight = $this->getHTMLUnitToUnits($tag['height'], 1, 'px'); + } else { + $hrHeight = $this->GetLineWidth(); + } + $this->addHTMLVertSpace($hbz, ($hrHeight / 2), $cell, $firstorlast); + $x = $this->GetX(); + $y = $this->GetY(); + $prevlinewidth = $this->GetLineWidth(); + $this->SetLineWidth($hrHeight); + $this->Line($x, $y, $x + $hrWidth, $y); + $this->SetLineWidth($prevlinewidth); + $this->addHTMLVertSpace(($hrHeight / 2), 0, $cell, !isset($dom[($key + 1)])); + break; + } + case 'a': { + if (array_key_exists('href', $tag['attribute'])) { + $this->HREF['url'] = $tag['attribute']['href']; + } + $this->HREF['color'] = $this->htmlLinkColorArray; + $this->HREF['style'] = $this->htmlLinkFontStyle; + if (array_key_exists('style', $tag['attribute'])) { + // get style attributes + preg_match_all('/([^;:\s]*):([^;]*)/', $tag['attribute']['style'], $style_array, PREG_PATTERN_ORDER); + $astyle = array(); + while (list($id, $name) = each($style_array[1])) { + $name = strtolower($name); + $astyle[$name] = trim($style_array[2][$id]); + } + if (isset($astyle['color'])) { + $this->HREF['color'] = $this->convertHTMLColorToDec($astyle['color']); + } + if (isset($astyle['text-decoration'])) { + $this->HREF['style'] = ''; + $decors = explode(' ', strtolower($astyle['text-decoration'])); + foreach ($decors as $dec) { + $dec = trim($dec); + if (!$this->empty_string($dec)) { + if ($dec{0} == 'u') { + // underline + $this->HREF['style'] .= 'U'; + } elseif ($dec{0} == 'l') { + // line-trough + $this->HREF['style'] .= 'D'; + } elseif ($dec{0} == 'o') { + // overline + $this->HREF['style'] .= 'O'; + } + } + } + } + } + break; + } + case 'img': { + if (isset($tag['attribute']['src'])) { + // replace relative path with real server path + if (($tag['attribute']['src'][0] == '/') AND ($_SERVER['DOCUMENT_ROOT'] != '/')) { + $findroot = strpos($tag['attribute']['src'], $_SERVER['DOCUMENT_ROOT']); + if (($findroot === false) OR ($findroot > 1)) { + $tag['attribute']['src'] = $_SERVER['DOCUMENT_ROOT'].$tag['attribute']['src']; + } + } + $tag['attribute']['src'] = urldecode($tag['attribute']['src']); + $type = $this->getImageFileType($tag['attribute']['src']); + $testscrtype = @parse_url($tag['attribute']['src']); + if (!isset($testscrtype['query']) OR empty($testscrtype['query'])) { + // convert URL to server path + $tag['attribute']['src'] = str_replace(K_PATH_URL, K_PATH_MAIN, $tag['attribute']['src']); + } + if (!isset($tag['attribute']['width'])) { + $tag['attribute']['width'] = 0; + } + if (!isset($tag['attribute']['height'])) { + $tag['attribute']['height'] = 0; + } + //if (!isset($tag['attribute']['align'])) { + // the only alignment supported is "bottom" + // further development is required for other modes. + $tag['attribute']['align'] = 'bottom'; + //} + switch($tag['attribute']['align']) { + case 'top': { + $align = 'T'; + break; + } + case 'middle': { + $align = 'M'; + break; + } + case 'bottom': { + $align = 'B'; + break; + } + default: { + $align = 'B'; + break; + } + } + $prevy = $this->y; + $xpos = $this->GetX(); + // eliminate marker spaces + if (isset($dom[($key - 1)])) { + if (($dom[($key - 1)]['value'] == ' ') OR (isset($dom[($key - 1)]['trimmed_space']))) { + $xpos -= $this->GetStringWidth(chr(32)); + } elseif ($this->rtl AND $dom[($key - 1)]['value'] == ' ') { + $xpos -= (2 * $this->GetStringWidth(chr(32))); + } + } + $imglink = ''; + if (isset($this->HREF['url']) AND !$this->empty_string($this->HREF['url'])) { + $imglink = $this->HREF['url']; + if ($imglink{0} == '#') { + // convert url to internal link + $page = intval(substr($imglink, 1)); + $imglink = $this->AddLink(); + $this->SetLink($imglink, 0, $page); + } + } + $border = 0; + if (isset($tag['attribute']['border']) AND !empty($tag['attribute']['border'])) { + // currently only support 1 (frame) or a combination of 'LTRB' + $border = $tag['attribute']['border']; + } + $iw = ''; + if (isset($tag['attribute']['width'])) { + $iw = $this->getHTMLUnitToUnits($tag['attribute']['width'], 1, 'px', false); + } + $ih = ''; + if (isset($tag['attribute']['height'])) { + $ih = $this->getHTMLUnitToUnits($tag['attribute']['height'], 1, 'px', false); + } + if (($type == 'eps') OR ($type == 'ai')) { + $this->ImageEps($tag['attribute']['src'], $xpos, $this->y, $iw, $ih, $imglink, true, $align, '', $border, true); + } elseif ($type == 'svg') { + $this->ImageSVG($tag['attribute']['src'], $xpos, $this->y, $iw, $ih, $imglink, $align, '', $border, true); + } else { + $this->Image($tag['attribute']['src'], $xpos, $this->y, $iw, $ih, '', $imglink, $align, false, 300, '', false, false, $border, false, false, true); + } + switch($align) { + case 'T': { + $this->y = $prevy; + break; + } + case 'M': { + $this->y = (($this->img_rb_y + $prevy - ($tag['fontsize'] / $this->k)) / 2) ; + break; + } + case 'B': { + $this->y = $this->img_rb_y - ($tag['fontsize'] / $this->k); + break; + } + } + } + break; + } + case 'dl': { + ++$this->listnum; + if ($this->listnum == 1) { + $this->addHTMLVertSpace($hbz, $hb, $cell, $firstorlast); + } else { + $this->addHTMLVertSpace(0, 0, $cell, $firstorlast); + } + break; + } + case 'dt': { + $this->addHTMLVertSpace($hbz, 0, $cell, $firstorlast); + break; + } + case 'dd': { + if ($this->rtl) { + $this->rMargin += $this->listindent; + } else { + $this->lMargin += $this->listindent; + } + ++$this->listindentlevel; + $this->addHTMLVertSpace($hbz, 0, $cell, $firstorlast); + break; + } + case 'ul': + case 'ol': { + ++$this->listnum; + if ($tag['value'] == 'ol') { + $this->listordered[$this->listnum] = true; + } else { + $this->listordered[$this->listnum] = false; + } + if (isset($tag['attribute']['start'])) { + $this->listcount[$this->listnum] = intval($tag['attribute']['start']) - 1; + } else { + $this->listcount[$this->listnum] = 0; + } + if ($this->rtl) { + $this->rMargin += $this->listindent; + } else { + $this->lMargin += $this->listindent; + } + ++$this->listindentlevel; + if ($this->listnum == 1) { + $this->addHTMLVertSpace($hbz, $hb, $cell, $firstorlast); + } else { + $this->addHTMLVertSpace(0, 0, $cell, $firstorlast); + } + break; + } + case 'li': { + $this->addHTMLVertSpace($hbz, 0, $cell, $firstorlast); + if ($this->listordered[$this->listnum]) { + // ordered item + if (isset($parent['attribute']['type']) AND !$this->empty_string($parent['attribute']['type'])) { + $this->lispacer = $parent['attribute']['type']; + } elseif (isset($parent['listtype']) AND !$this->empty_string($parent['listtype'])) { + $this->lispacer = $parent['listtype']; + } elseif (isset($this->lisymbol) AND !$this->empty_string($this->lisymbol)) { + $this->lispacer = $this->lisymbol; + } else { + $this->lispacer = '#'; + } + ++$this->listcount[$this->listnum]; + if (isset($tag['attribute']['value'])) { + $this->listcount[$this->listnum] = intval($tag['attribute']['value']); + } + } else { + // unordered item + if (isset($parent['attribute']['type']) AND !$this->empty_string($parent['attribute']['type'])) { + $this->lispacer = $parent['attribute']['type']; + } elseif (isset($parent['listtype']) AND !$this->empty_string($parent['listtype'])) { + $this->lispacer = $parent['listtype']; + } elseif (isset($this->lisymbol) AND !$this->empty_string($this->lisymbol)) { + $this->lispacer = $this->lisymbol; + } else { + $this->lispacer = '!'; + } + } + break; + } + case 'blockquote': { + if ($this->rtl) { + $this->rMargin += $this->listindent; + } else { + $this->lMargin += $this->listindent; + } + ++$this->listindentlevel; + $this->addHTMLVertSpace($hbz, $hb, $cell, $firstorlast); + break; + } + case 'br': { + $this->addHTMLVertSpace($hbz, 0, $cell, $firstorlast); + break; + } + case 'div': { + $this->addHTMLVertSpace($hbz, 0, $cell, $firstorlast); + break; + } + case 'p': { + $this->addHTMLVertSpace($hbz, $hb, $cell, $firstorlast); + break; + } + case 'pre': { + $this->addHTMLVertSpace($hbz, $hb, $cell, $firstorlast); + $this->premode = true; + break; + } + case 'sup': { + $this->SetXY($this->GetX(), $this->GetY() - ((0.7 * $this->FontSizePt) / $this->k)); + break; + } + case 'sub': { + $this->SetXY($this->GetX(), $this->GetY() + ((0.3 * $this->FontSizePt) / $this->k)); + break; + } + case 'h1': + case 'h2': + case 'h3': + case 'h4': + case 'h5': + case 'h6': { + $this->addHTMLVertSpace($hbz, $hb, $cell, $firstorlast); + break; + } + // Form fields (since 4.8.000 - 2009-09-07) + case 'form': { + if (isset($tag['attribute']['action'])) { + $this->form_action = $tag['attribute']['action']; + } else { + $this->form_action = K_PATH_URL.$_SERVER['SCRIPT_NAME']; + } + if (isset($tag['attribute']['enctype'])) { + $this->form_enctype = $tag['attribute']['enctype']; + } else { + $this->form_enctype = 'application/x-www-form-urlencoded'; + } + if (isset($tag['attribute']['method'])) { + $this->form_mode = $tag['attribute']['method']; + } else { + $this->form_mode = 'post'; + } + break; + } + case 'input': { + if (isset($tag['attribute']['name']) AND !$this->empty_string($tag['attribute']['name'])) { + $name = $tag['attribute']['name']; + } else { + break; + } + $prop = array(); + $opt = array(); + if (isset($tag['attribute']['value']) AND !$this->empty_string($tag['attribute']['value'])) { + $value = $tag['attribute']['value']; + } + if (isset($tag['attribute']['maxlength']) AND !$this->empty_string($tag['attribute']['maxlength'])) { + $opt['maxlen'] = intval($tag['attribute']['value']); + } + $h = $this->FontSize * $this->cell_height_ratio; + if (isset($tag['attribute']['size']) AND !$this->empty_string($tag['attribute']['size'])) { + $w = intval($tag['attribute']['size']) * $this->GetStringWidth(chr(32)) * 2; + } else { + $w = $h; + } + if (isset($tag['attribute']['checked']) AND (($tag['attribute']['checked'] == 'checked') OR ($tag['attribute']['checked'] == 'true'))) { + $checked = true; + } else { + $checked = false; + } + switch ($tag['attribute']['type']) { + case 'text': { + if (isset($value)) { + $opt['v'] = $value; + } + $this->TextField($name, $w, $h, $prop, $opt, '', '', false); + break; + } + case 'password': { + if (isset($value)) { + $opt['v'] = $value; + } + $prop['password'] = 'true'; + $this->TextField($name, $w, $h, $prop, $opt, '', '', false); + break; + } + case 'checkbox': { + $this->CheckBox($name, $w, $checked, $prop, $opt, $value, '', '', false); + break; + } + case 'radio': { + $this->RadioButton($name, $w, $prop, $opt, $value, $checked, '', '', false); + break; + } + case 'submit': { + $w = $this->GetStringWidth($value) * 1.5; + $h *= 1.6; + $prop = array('lineWidth'=>1, 'borderStyle'=>'beveled', 'fillColor'=>array(196, 196, 196), 'strokeColor'=>array(255, 255, 255)); + $action = array(); + $action['S'] = 'SubmitForm'; + $action['F'] = $this->form_action; + if ($this->form_enctype != 'FDF') { + $action['Flags'] = array('ExportFormat'); + } + if ($this->form_mode == 'get') { + $action['Flags'] = array('GetMethod'); + } + $this->Button($name, $w, $h, $value, $action, $prop, $opt, '', '', false); + break; + } + case 'reset': { + $w = $this->GetStringWidth($value) * 1.5; + $h *= 1.6; + $prop = array('lineWidth'=>1, 'borderStyle'=>'beveled', 'fillColor'=>array(196, 196, 196), 'strokeColor'=>array(255, 255, 255)); + $this->Button($name, $w, $h, $value, array('S'=>'ResetForm'), $prop, $opt, '', '', false); + break; + } + case 'file': { + $prop['fileSelect'] = 'true'; + $this->TextField($name, $w, $h, $prop, $opt, '', '', false); + if (!isset($value)) { + $value = '*'; + } + $w = $this->GetStringWidth($value) * 2; + $h *= 1.2; + $prop = array('lineWidth'=>1, 'borderStyle'=>'beveled', 'fillColor'=>array(196, 196, 196), 'strokeColor'=>array(255, 255, 255)); + $jsaction = 'var f=this.getField(\''.$name.'\'); f.browseForFileToSubmit();'; + $this->Button('FB_'.$name, $w, $h, $value, $jsaction, $prop, $opt, '', '', false); + break; + } + case 'hidden': { + if (isset($value)) { + $opt['v'] = $value; + } + $opt['f'] = array('invisible', 'hidden'); + $this->TextField($name, 0, 0, $prop, $opt, '', '', false); + break; + } + case 'image': { + // THIS TYPE MUST BE FIXED + if (isset($tag['attribute']['src']) AND !$this->empty_string($tag['attribute']['src'])) { + $img = $tag['attribute']['src']; + } else { + break; + } + $value = 'img'; + //$opt['mk'] = array('i'=>$img, 'tp'=>1, 'if'=>array('sw'=>'A', 's'=>'A', 'fb'=>false)); + if (isset($tag['attribute']['onclick']) AND !empty($tag['attribute']['onclick'])) { + $jsaction = $tag['attribute']['onclick']; + } else { + $jsaction = ''; + } + $this->Button($name, $w, $h, $value, $jsaction, $prop, $opt, '', '', false); + break; + } + case 'button': { + $w = $this->GetStringWidth($value) * 1.5; + $h *= 1.6; + $prop = array('lineWidth'=>1, 'borderStyle'=>'beveled', 'fillColor'=>array(196, 196, 196), 'strokeColor'=>array(255, 255, 255)); + if (isset($tag['attribute']['onclick']) AND !empty($tag['attribute']['onclick'])) { + $jsaction = $tag['attribute']['onclick']; + } else { + $jsaction = ''; + } + $this->Button($name, $w, $h, $value, $jsaction, $prop, $opt, '', '', false); + break; + } + } + break; + } + case 'textarea': { + $prop = array(); + $opt = array(); + if (isset($tag['attribute']['name']) AND !$this->empty_string($tag['attribute']['name'])) { + $name = $tag['attribute']['name']; + } else { + break; + } + if (isset($tag['attribute']['value']) AND !$this->empty_string($tag['attribute']['value'])) { + $opt['v'] = $tag['attribute']['value']; + } + if (isset($tag['attribute']['cols']) AND !$this->empty_string($tag['attribute']['cols'])) { + $w = intval($tag['attribute']['cols']) * $this->GetStringWidth(chr(32)) * 2; + } else { + $w = 40; + } + if (isset($tag['attribute']['rows']) AND !$this->empty_string($tag['attribute']['rows'])) { + $h = intval($tag['attribute']['rows']) * $this->FontSize * $this->cell_height_ratio; + } else { + $h = 10; + } + $prop['multiline'] = 'true'; + $this->TextField($name, $w, $h, $prop, $opt, '', '', false); + break; + } + case 'select': { + $h = $this->FontSize * $this->cell_height_ratio; + if (isset($tag['attribute']['size']) AND !$this->empty_string($tag['attribute']['size'])) { + $h *= ($tag['attribute']['size'] + 1); + } + $prop = array(); + $opt = array(); + if (isset($tag['attribute']['name']) AND !$this->empty_string($tag['attribute']['name'])) { + $name = $tag['attribute']['name']; + } else { + break; + } + $w = 0; + if (isset($tag['attribute']['opt']) AND !$this->empty_string($tag['attribute']['opt'])) { + $options = explode ("\r", $tag['attribute']['opt']); + $values = array(); + foreach ($options as $val) { + if (strpos($val, "\t") !== false) { + $opts = explode("\t", $val); + $values[] = $opts; + $w = max($w, $this->GetStringWidth($opts[1])); + } else { + $values[] = $val; + $w = max($w, $this->GetStringWidth($val)); + } + } + } else { + break; + } + $w *= 2; + if (isset($tag['attribute']['multiple']) AND ($tag['attribute']['multiple']='multiple')) { + $prop['multipleSelection'] = 'true'; + $this->ListBox($name, $w, $h, $values, $prop, $opt, '', '', false); + } else { + $this->ComboBox($name, $w, $h, $values, $prop, $opt, '', '', false); + } + break; + } + case 'tcpdf': { + if (defined('K_TCPDF_CALLS_IN_HTML') AND (K_TCPDF_CALLS_IN_HTML === true)) { + // Special tag used to call TCPDF methods + if (isset($tag['attribute']['method'])) { + $tcpdf_method = $tag['attribute']['method']; + if (method_exists($this, $tcpdf_method)) { + if (isset($tag['attribute']['params']) AND (!empty($tag['attribute']['params']))) { + $params = unserialize(urldecode($tag['attribute']['params'])); + call_user_func_array(array($this, $tcpdf_method), $params); + } else { + $this->$tcpdf_method(); + } + $this->newline = true; + } + } + } + break; + } + default: { + break; + } + } + if ($dom[$key]['self'] AND isset($dom[$key]['attribute']['pagebreakafter'])) { + $pba = $dom[$key]['attribute']['pagebreakafter']; + // check for pagebreak + if (($pba == 'true') OR ($pba == 'left') OR ($pba == 'right')) { + // add a page (or trig AcceptPageBreak() for multicolumn mode) + $this->checkPageBreak($this->PageBreakTrigger + 1); + } + if ((($pba == 'left') AND (((!$this->rtl) AND (($this->page % 2) == 0)) OR (($this->rtl) AND (($this->page % 2) != 0)))) + OR (($pba == 'right') AND (((!$this->rtl) AND (($this->page % 2) != 0)) OR (($this->rtl) AND (($this->page % 2) == 0))))) { + // add a page (or trig AcceptPageBreak() for multicolumn mode) + $this->checkPageBreak($this->PageBreakTrigger + 1); + } + } + } + + /** + * Process closing tags. + * @param array $dom html dom array + * @param int $key current element id + * @param boolean $cell if true add the default cMargin space to each new line (default false). + * @param int $maxbottomliney maximum y value of current line + * @access protected + */ + protected function closeHTMLTagHandler(&$dom, $key, $cell, $maxbottomliney=0) { + $tag = $dom[$key]; + $parent = $dom[($dom[$key]['parent'])]; + $firstorlast = ((!isset($dom[($key + 1)])) OR ((!isset($dom[($key + 2)])) AND ($dom[($key + 1)]['value'] == 'marker'))); + $in_table_head = false; + if ($tag['block']) { + $hbz = 0; // distance from y to line bottom + $hb = 0; // vertical space between block tags + // calculate vertical space for block tags + if (isset($this->tagvspaces[$tag['value']][1]['h']) AND ($this->tagvspaces[$tag['value']][1]['h'] >= 0)) { + $pre_h = $this->tagvspaces[$tag['value']][1]['h']; + } elseif (isset($parent['fontsize'])) { + $pre_h = (($parent['fontsize'] / $this->k) * $this->cell_height_ratio); + } else { + $pre_h = $this->FontSize * $this->cell_height_ratio; + } + if (isset($this->tagvspaces[$tag['value']][1]['n'])) { + $n = $this->tagvspaces[$tag['value']][1]['n']; + } elseif (preg_match('/[h][0-9]/', $tag['value']) > 0) { + $n = 0.6; + } else { + $n = 1; + } + $hb = ($n * $pre_h); + if ($this->y < $maxbottomliney) { + $hbz = ($maxbottomliney - $this->y); + } + } + //Closing tag + switch($tag['value']) { + case 'tr': { + $table_el = $dom[($dom[$key]['parent'])]['parent']; + if (!isset($parent['endy'])) { + $dom[($dom[$key]['parent'])]['endy'] = $this->y; + $parent['endy'] = $this->y; + } + if (!isset($parent['endpage'])) { + $dom[($dom[$key]['parent'])]['endpage'] = $this->page; + $parent['endpage'] = $this->page; + } + // update row-spanned cells + if (isset($dom[$table_el]['rowspans'])) { + foreach ($dom[$table_el]['rowspans'] as $k => $trwsp) { + $dom[$table_el]['rowspans'][$k]['rowspan'] -= 1; + if ($dom[$table_el]['rowspans'][$k]['rowspan'] == 0) { + if ($dom[$table_el]['rowspans'][$k]['endpage'] == $parent['endpage']) { + $dom[($dom[$key]['parent'])]['endy'] = max($dom[$table_el]['rowspans'][$k]['endy'], $parent['endy']); + } elseif ($dom[$table_el]['rowspans'][$k]['endpage'] > $parent['endpage']) { + $dom[($dom[$key]['parent'])]['endy'] = $dom[$table_el]['rowspans'][$k]['endy']; + $dom[($dom[$key]['parent'])]['endpage'] = $dom[$table_el]['rowspans'][$k]['endpage']; + } + } + } + // report new endy and endpage to the rowspanned cells + foreach ($dom[$table_el]['rowspans'] as $k => $trwsp) { + if ($dom[$table_el]['rowspans'][$k]['rowspan'] == 0) { + $dom[$table_el]['rowspans'][$k]['endpage'] = max($dom[$table_el]['rowspans'][$k]['endpage'], $dom[($dom[$key]['parent'])]['endpage']); + $dom[($dom[$key]['parent'])]['endpage'] = $dom[$table_el]['rowspans'][$k]['endpage']; + $dom[$table_el]['rowspans'][$k]['endy'] = max($dom[$table_el]['rowspans'][$k]['endy'], $dom[($dom[$key]['parent'])]['endy']); + $dom[($dom[$key]['parent'])]['endy'] = $dom[$table_el]['rowspans'][$k]['endy']; + } + } + // update remaining rowspanned cells + foreach ($dom[$table_el]['rowspans'] as $k => $trwsp) { + if ($dom[$table_el]['rowspans'][$k]['rowspan'] == 0) { + $dom[$table_el]['rowspans'][$k]['endpage'] = $dom[($dom[$key]['parent'])]['endpage']; + $dom[$table_el]['rowspans'][$k]['endy'] = $dom[($dom[$key]['parent'])]['endy']; + } + } + } + if (($this->num_columns > 1) AND ($dom[($dom[$key]['parent'])]['endy'] >= ($this->PageBreakTrigger - $this->lasth)) AND ($this->y < $dom[($dom[$key]['parent'])]['endy'])) { + $this->Ln(0, $cell); + } else { + $this->setPage($dom[($dom[$key]['parent'])]['endpage']); + $this->y = $dom[($dom[$key]['parent'])]['endy']; + if (isset($dom[$table_el]['attribute']['cellspacing'])) { + $cellspacing = $this->getHTMLUnitToUnits($dom[$table_el]['attribute']['cellspacing'], 1, 'px'); + $this->y += $cellspacing; + } + $this->Ln(0, $cell); + $this->x = $parent['startx']; + // account for booklet mode + if ($this->page > $parent['startpage']) { + if (($this->rtl) AND ($this->pagedim[$this->page]['orm'] != $this->pagedim[$parent['startpage']]['orm'])) { + $this->x -= ($this->pagedim[$this->page]['orm'] - $this->pagedim[$parent['startpage']]['orm']); + } elseif ((!$this->rtl) AND ($this->pagedim[$this->page]['olm'] != $this->pagedim[$parent['startpage']]['olm'])) { + $this->x += ($this->pagedim[$this->page]['olm'] - $this->pagedim[$parent['startpage']]['olm']); + } + } + } + break; + } + case 'tablehead': + // closing tag used for the thead part + $in_table_head = true; + $this->inthead = false; + case 'table': { + $table_el = $parent; + // draw borders + if ((isset($table_el['attribute']['border']) AND ($table_el['attribute']['border'] > 0)) + OR (isset($table_el['style']['border']) AND ($table_el['style']['border'] > 0))) { + $border = 1; + } else { + $border = 0; + } + // fix bottom line alignment of last line before page break + foreach ($dom[($dom[$key]['parent'])]['trids'] as $j => $trkey) { + // update row-spanned cells + if (isset($dom[($dom[$key]['parent'])]['rowspans'])) { + foreach ($dom[($dom[$key]['parent'])]['rowspans'] as $k => $trwsp) { + if ($trwsp['trid'] == $trkey) { + $dom[($dom[$key]['parent'])]['rowspans'][$k]['mrowspan'] -= 1; + } + if (isset($prevtrkey) AND ($trwsp['trid'] == $prevtrkey) AND ($trwsp['mrowspan'] >= 0)) { + $dom[($dom[$key]['parent'])]['rowspans'][$k]['trid'] = $trkey; + } + } + } + if (isset($prevtrkey) AND ($dom[$trkey]['startpage'] > $dom[$prevtrkey]['endpage'])) { + $pgendy = $this->pagedim[$dom[$prevtrkey]['endpage']]['hk'] - $this->pagedim[$dom[$prevtrkey]['endpage']]['bm']; + $dom[$prevtrkey]['endy'] = $pgendy; + // update row-spanned cells + if (isset($dom[($dom[$key]['parent'])]['rowspans'])) { + foreach ($dom[($dom[$key]['parent'])]['rowspans'] as $k => $trwsp) { + if (($trwsp['trid'] == $trkey) AND ($trwsp['mrowspan'] > 1) AND ($trwsp['endpage'] == $dom[$prevtrkey]['endpage'])) { + $dom[($dom[$key]['parent'])]['rowspans'][$k]['endy'] = $pgendy; + $dom[($dom[$key]['parent'])]['rowspans'][$k]['mrowspan'] = -1; + } + } + } + } + $prevtrkey = $trkey; + $table_el = $dom[($dom[$key]['parent'])]; + } + // for each row + foreach ($table_el['trids'] as $j => $trkey) { + $parent = $dom[$trkey]; + // for each cell on the row + foreach ($parent['cellpos'] as $k => $cellpos) { + if (isset($cellpos['rowspanid']) AND ($cellpos['rowspanid'] >= 0)) { + $cellpos['startx'] = $table_el['rowspans'][($cellpos['rowspanid'])]['startx']; + $cellpos['endx'] = $table_el['rowspans'][($cellpos['rowspanid'])]['endx']; + $endy = $table_el['rowspans'][($cellpos['rowspanid'])]['endy']; + $startpage = $table_el['rowspans'][($cellpos['rowspanid'])]['startpage']; + $endpage = $table_el['rowspans'][($cellpos['rowspanid'])]['endpage']; + } else { + $endy = $parent['endy']; + $startpage = $parent['startpage']; + $endpage = $parent['endpage']; + } + if ($endpage > $startpage) { + // design borders around HTML cells. + for ($page=$startpage; $page <= $endpage; ++$page) { + $this->setPage($page); + if ($page == $startpage) { + $this->y = $parent['starty']; // put cursor at the beginning of row on the first page + $ch = $this->getPageHeight() - $parent['starty'] - $this->getBreakMargin(); + $cborder = $this->getBorderMode($border, $position='start'); + } elseif ($page == $endpage) { + $this->y = $this->tMargin; // put cursor at the beginning of last page + $ch = $endy - $this->tMargin; + $cborder = $this->getBorderMode($border, $position='end'); + } else { + $this->y = $this->tMargin; // put cursor at the beginning of the current page + $ch = $this->getPageHeight() - $this->tMargin - $this->getBreakMargin(); + $cborder = $this->getBorderMode($border, $position='middle'); + } + if (isset($cellpos['bgcolor']) AND ($cellpos['bgcolor']) !== false) { + $this->SetFillColorArray($cellpos['bgcolor']); + $fill = true; + } else { + $fill = false; + } + $cw = abs($cellpos['endx'] - $cellpos['startx']); + $this->x = $cellpos['startx']; + // account for margin changes + if ($page > $startpage) { + if (($this->rtl) AND ($this->pagedim[$page]['orm'] != $this->pagedim[$startpage]['orm'])) { + $this->x -= ($this->pagedim[$page]['orm'] - $this->pagedim[$startpage]['orm']); + } elseif ((!$this->rtl) AND ($this->pagedim[$page]['lm'] != $this->pagedim[$startpage]['olm'])) { + $this->x += ($this->pagedim[$page]['olm'] - $this->pagedim[$startpage]['olm']); + } + } + // design a cell around the text + $ccode = $this->FillColor."\n".$this->getCellCode($cw, $ch, '', $cborder, 1, '', $fill, '', 0, true); + if ($cborder OR $fill) { + $pagebuff = $this->getPageBuffer($this->page); + $pstart = substr($pagebuff, 0, $this->intmrk[$this->page]); + $pend = substr($pagebuff, $this->intmrk[$this->page]); + $this->setPageBuffer($this->page, $pstart.$ccode."\n".$pend); + $this->intmrk[$this->page] += strlen($ccode."\n"); + } + } + } else { + $this->setPage($startpage); + if (isset($cellpos['bgcolor']) AND ($cellpos['bgcolor']) !== false) { + $this->SetFillColorArray($cellpos['bgcolor']); + $fill = true; + } else { + $fill = false; + } + $this->x = $cellpos['startx']; + $this->y = $parent['starty']; + $cw = abs($cellpos['endx'] - $cellpos['startx']); + $ch = $endy - $parent['starty']; + // design a cell around the text + $ccode = $this->FillColor."\n".$this->getCellCode($cw, $ch, '', $border, 1, '', $fill, '', 0, true); + if ($border OR $fill) { + if (end($this->transfmrk[$this->page]) !== false) { + $pagemarkkey = key($this->transfmrk[$this->page]); + $pagemark = &$this->transfmrk[$this->page][$pagemarkkey]; + } elseif ($this->InFooter) { + $pagemark = &$this->footerpos[$this->page]; + } else { + $pagemark = &$this->intmrk[$this->page]; + } + $pagebuff = $this->getPageBuffer($this->page); + $pstart = substr($pagebuff, 0, $pagemark); + $pend = substr($pagebuff, $pagemark); + $this->setPageBuffer($this->page, $pstart.$ccode."\n".$pend); + $pagemark += strlen($ccode."\n"); + } + } + } + if (isset($table_el['attribute']['cellspacing'])) { + $cellspacing = $this->getHTMLUnitToUnits($table_el['attribute']['cellspacing'], 1, 'px'); + $this->y += $cellspacing; + } + $this->Ln(0, $cell); + $this->x = $parent['startx']; + if ($endpage > $startpage) { + if (($this->rtl) AND ($this->pagedim[$endpage]['orm'] != $this->pagedim[$startpage]['orm'])) { + $this->x += ($this->pagedim[$endpage]['orm'] - $this->pagedim[$startpage]['orm']); + } elseif ((!$this->rtl) AND ($this->pagedim[$endpage]['olm'] != $this->pagedim[$startpage]['olm'])) { + $this->x += ($this->pagedim[$endpage]['olm'] - $this->pagedim[$startpage]['olm']); + } + } + } + if (!$in_table_head) { + // we are not inside a thead section + if (isset($parent['cellpadding'])) { + $this->cMargin = $this->oldcMargin; + } + $this->lasth = $this->FontSize * $this->cell_height_ratio; + if (isset($this->theadMargins['top'])) { + if (($this->theadMargins['top'] == $this->tMargin) AND ($this->page == ($this->numpages - 1))) { + // remove last page containing only THEAD + $this->deletePage($this->numpages); + } + // restore top margin + $this->tMargin = $this->theadMargins['top']; + $this->pagedim[$this->page]['tm'] = $this->tMargin; + } + if (!isset($table_el['attribute']['nested']) OR ($table_el['attribute']['nested'] != 'true')) { + // reset main table header + $this->thead = ''; + $this->theadMargins = array(); + } + } + break; + } + case 'a': { + $this->HREF = ''; + break; + } + case 'sup': { + $this->SetXY($this->GetX(), $this->GetY() + ((0.7 * $parent['fontsize']) / $this->k)); + break; + } + case 'sub': { + $this->SetXY($this->GetX(), $this->GetY() - ((0.3 * $parent['fontsize'])/$this->k)); + break; + } + case 'div': { + $this->addHTMLVertSpace($hbz, 0, $cell, $firstorlast); + break; + } + case 'blockquote': { + if ($this->rtl) { + $this->rMargin -= $this->listindent; + } else { + $this->lMargin -= $this->listindent; + } + --$this->listindentlevel; + $this->addHTMLVertSpace($hbz, $hb, $cell, $firstorlast); + break; + } + case 'p': { + $this->addHTMLVertSpace($hbz, $hb, $cell, $firstorlast); + break; + } + case 'pre': { + $this->addHTMLVertSpace($hbz, $hb, $cell, $firstorlast); + $this->premode = false; + break; + } + case 'dl': { + --$this->listnum; + if ($this->listnum <= 0) { + $this->listnum = 0; + $this->addHTMLVertSpace($hbz, $hb, $cell, $firstorlast); + } else { + $this->addHTMLVertSpace(0, 0, $cell, $firstorlast); + } + $this->lasth = $this->FontSize * $this->cell_height_ratio; + break; + } + case 'dt': { + $this->lispacer = ''; + $this->addHTMLVertSpace(0, 0, $cell, $firstorlast); + break; + } + case 'dd': { + $this->lispacer = ''; + if ($this->rtl) { + $this->rMargin -= $this->listindent; + } else { + $this->lMargin -= $this->listindent; + } + --$this->listindentlevel; + $this->addHTMLVertSpace(0, 0, $cell, $firstorlast); + break; + } + case 'ul': + case 'ol': { + --$this->listnum; + $this->lispacer = ''; + if ($this->rtl) { + $this->rMargin -= $this->listindent; + } else { + $this->lMargin -= $this->listindent; + } + --$this->listindentlevel; + if ($this->listnum <= 0) { + $this->listnum = 0; + $this->addHTMLVertSpace($hbz, $hb, $cell, $firstorlast); + } else { + $this->addHTMLVertSpace(0, 0, $cell, $firstorlast); + } + $this->lasth = $this->FontSize * $this->cell_height_ratio; + break; + } + case 'li': { + $this->lispacer = ''; + $this->addHTMLVertSpace(0, 0, $cell, $firstorlast); + break; + } + case 'h1': + case 'h2': + case 'h3': + case 'h4': + case 'h5': + case 'h6': { + $this->addHTMLVertSpace($hbz, $hb, $cell, $firstorlast); + break; + } + // Form fields (since 4.8.000 - 2009-09-07) + case 'form': { + $this->form_action = ''; + $this->form_enctype = 'application/x-www-form-urlencoded'; + break; + } + default : { + break; + } + } + if (isset($dom[($dom[$key]['parent'])]['attribute']['pagebreakafter'])) { + $pba = $dom[($dom[$key]['parent'])]['attribute']['pagebreakafter']; + // check for pagebreak + if (($pba == 'true') OR ($pba == 'left') OR ($pba == 'right')) { + // add a page (or trig AcceptPageBreak() for multicolumn mode) + $this->checkPageBreak($this->PageBreakTrigger + 1); + } + if ((($pba == 'left') AND (((!$this->rtl) AND (($this->page % 2) == 0)) OR (($this->rtl) AND (($this->page % 2) != 0)))) + OR (($pba == 'right') AND (((!$this->rtl) AND (($this->page % 2) != 0)) OR (($this->rtl) AND (($this->page % 2) == 0))))) { + // add a page (or trig AcceptPageBreak() for multicolumn mode) + $this->checkPageBreak($this->PageBreakTrigger + 1); + } + } + $this->tmprtl = false; + } + + /** + * Add vertical spaces if needed. + * @param string $hbz Distance between current y and line bottom. + * @param string $hb The height of the break. + * @param boolean $cell if true add the default cMargin space to each new line (default false). + * @param boolean $firstorlast if true do not print additional empty lines. + * @access protected + */ + protected function addHTMLVertSpace($hbz=0, $hb=0, $cell=false, $firstorlast=false) { + if ($firstorlast) { + $this->Ln(0, $cell); + $this->htmlvspace = 0; + return; + } + if ($hb < $this->htmlvspace) { + $hd = 0; + } else { + $hd = $hb - $this->htmlvspace; + $this->htmlvspace = $hb; + } + $this->Ln(($hbz + $hd), $cell); + } + + /** + * Set the default bullet to be used as LI bullet symbol + * @param string $symbol character or string to be used (legal values are: '' = automatic, '!' = auto bullet, '#' = auto numbering, 'disc', 'disc', 'circle', 'square', '1', 'decimal', 'decimal-leading-zero', 'i', 'lower-roman', 'I', 'upper-roman', 'a', 'lower-alpha', 'lower-latin', 'A', 'upper-alpha', 'upper-latin', 'lower-greek') + * @access public + * @since 4.0.028 (2008-09-26) + */ + public function setLIsymbol($symbol='!') { + $symbol = strtolower($symbol); + switch ($symbol) { + case '!' : + case '#' : + case 'disc' : + case 'circle' : + case 'square' : + case '1': + case 'decimal': + case 'decimal-leading-zero': + case 'i': + case 'lower-roman': + case 'I': + case 'upper-roman': + case 'a': + case 'lower-alpha': + case 'lower-latin': + case 'A': + case 'upper-alpha': + case 'upper-latin': + case 'lower-greek': { + $this->lisymbol = $symbol; + break; + } + default : { + $this->lisymbol = ''; + } + } + } + + /** + * Set the booklet mode for double-sided pages. + * @param boolean $booklet true set the booklet mode on, fals eotherwise. + * @param float $inner Inner page margin. + * @param float $outer Outer page margin. + * @access public + * @since 4.2.000 (2008-10-29) + */ + public function SetBooklet($booklet=true, $inner=-1, $outer=-1) { + $this->booklet = $booklet; + if ($inner >= 0) { + $this->lMargin = $inner; + } + if ($outer >= 0) { + $this->rMargin = $outer; + } + } + + /** + * Swap the left and right margins. + * @param boolean $reverse if true swap left and right margins. + * @access protected + * @since 4.2.000 (2008-10-29) + */ + protected function swapMargins($reverse=true) { + if ($reverse) { + // swap left and right margins + $mtemp = $this->original_lMargin; + $this->original_lMargin = $this->original_rMargin; + $this->original_rMargin = $mtemp; + $deltam = $this->original_lMargin - $this->original_rMargin; + $this->lMargin += $deltam; + $this->rMargin -= $deltam; + } + } + + /** + * Set the vertical spaces for HTML tags. + * The array must have the following structure (example): + * $tagvs = array('h1' => array(0 => array('h' => '', 'n' => 2), 1 => array('h' => 1.3, 'n' => 1))); + * The first array level contains the tag names, + * the second level contains 0 for opening tags or 1 for closing tags, + * the third level contains the vertical space unit (h) and the number spaces to add (n). + * If the h parameter is not specified, default values are used. + * @param array $tagvs array of tags and relative vertical spaces. + * @access public + * @since 4.2.001 (2008-10-30) + */ + public function setHtmlVSpace($tagvs) { + $this->tagvspaces = $tagvs; + } + + /** + * Set custom width for list indentation. + * @param float $width width of the indentation. Use negative value to disable it. + * @access public + * @since 4.2.007 (2008-11-12) + */ + public function setListIndentWidth($width) { + return $this->customlistindent = floatval($width); + } + + /** + * Set the top/bottom cell sides to be open or closed when the cell cross the page. + * @param boolean $isopen if true keeps the top/bottom border open for the cell sides that cross the page. + * @access public + * @since 4.2.010 (2008-11-14) + */ + public function setOpenCell($isopen) { + $this->opencell = $isopen; + } + + /** + * Set the color and font style for HTML links. + * @param array $color RGB array of colors + * @param string $fontstyle additional font styles to add + * @access public + * @since 4.4.003 (2008-12-09) + */ + public function setHtmlLinksStyle($color=array(0,0,255), $fontstyle='U') { + $this->htmlLinkColorArray = $color; + $this->htmlLinkFontStyle = $fontstyle; + } + + /** + * Convert HTML string containing value and unit of measure to user's units or points. + * @param string $htmlval string containing values and unit + * @param string $refsize reference value in points + * @param string $defaultunit default unit (can be one of the following: %, em, ex, px, in, mm, pc, pt). + * @param boolean $point if true returns points, otherwise returns value in user's units + * @return float value in user's unit or point if $points=true + * @access public + * @since 4.4.004 (2008-12-10) + */ + public function getHTMLUnitToUnits($htmlval, $refsize=1, $defaultunit='px', $points=false) { + $supportedunits = array('%', 'em', 'ex', 'px', 'in', 'cm', 'mm', 'pc', 'pt'); + $retval = 0; + $value = 0; + $unit = 'px'; + $k = $this->k; + if ($points) { + $k = 1; + } + if (in_array($defaultunit, $supportedunits)) { + $unit = $defaultunit; + } + if (is_numeric($htmlval)) { + $value = floatval($htmlval); + } elseif (preg_match('/([0-9\.\-\+]+)/', $htmlval, $mnum)) { + $value = floatval($mnum[1]); + if (preg_match('/([a-z%]+)/', $htmlval, $munit)) { + if (in_array($munit[1], $supportedunits)) { + $unit = $munit[1]; + } + } + } + switch ($unit) { + // percentage + case '%': { + $retval = (($value * $refsize) / 100); + break; + } + // relative-size + case 'em': { + $retval = ($value * $refsize); + break; + } + case 'ex': { + $retval = $value * ($refsize / 2); + break; + } + // absolute-size + case 'in': { + $retval = ($value * $this->dpi) / $k; + break; + } + case 'cm': { + $retval = ($value / 2.54 * $this->dpi) / $k; + break; + } + case 'mm': { + $retval = ($value / 25.4 * $this->dpi) / $k; + break; + } + case 'pc': { + // one pica is 12 points + $retval = ($value * 12) / $k; + break; + } + case 'pt': { + $retval = $value / $k; + break; + } + case 'px': { + $retval = $this->pixelsToUnits($value); + break; + } + } + return $retval; + } + + /** + * Returns the Roman representation of an integer number + * @param int number to convert + * @return string roman representation of the specified number + * @access public + * @since 4.4.004 (2008-12-10) + */ + public function intToRoman($number) { + $roman = ''; + while ($number >= 1000) { + $roman .= 'M'; + $number -= 1000; + } + while ($number >= 900) { + $roman .= 'CM'; + $number -= 900; + } + while ($number >= 500) { + $roman .= 'D'; + $number -= 500; + } + while ($number >= 400) { + $roman .= 'CD'; + $number -= 400; + } + while ($number >= 100) { + $roman .= 'C'; + $number -= 100; + } + while ($number >= 90) { + $roman .= 'XC'; + $number -= 90; + } + while ($number >= 50) { + $roman .= 'L'; + $number -= 50; + } + while ($number >= 40) { + $roman .= 'XL'; + $number -= 40; + } + while ($number >= 10) { + $roman .= 'X'; + $number -= 10; + } + while ($number >= 9) { + $roman .= 'IX'; + $number -= 9; + } + while ($number >= 5) { + $roman .= 'V'; + $number -= 5; + } + while ($number >= 4) { + $roman .= 'IV'; + $number -= 4; + } + while ($number >= 1) { + $roman .= 'I'; + --$number; + } + return $roman; + } + + /** + * Output an HTML list bullet or ordered item symbol + * @param int $listdepth list nesting level + * @param string $listtype type of list + * @param float $size current font size + * @access protected + * @since 4.4.004 (2008-12-10) + */ + protected function putHtmlListBullet($listdepth, $listtype='', $size=10) { + $size /= $this->k; + $fill = ''; + $color = $this->fgcolor; + $width = 0; + $textitem = ''; + $tmpx = $this->x; + $lspace = $this->GetStringWidth(' '); + if ($listtype == '!') { + // set default list type for unordered list + $deftypes = array('disc', 'circle', 'square'); + $listtype = $deftypes[($listdepth - 1) % 3]; + } elseif ($listtype == '#') { + // set default list type for ordered list + $listtype = 'decimal'; + } + switch ($listtype) { + // unordered types + case 'none': { + break; + } + case 'disc': { + $fill = 'F'; + } + case 'circle': { + $fill .= 'D'; + $r = $size / 6; + $lspace += (2 * $r); + if ($this->rtl) { + $this->x += $lspace; + } else { + $this->x -= $lspace; + } + $this->Circle(($this->x + $r), ($this->y + ($this->lasth / 2)), $r, 0, 360, $fill, array('color'=>$color), $color, 8); + break; + } + case 'square': { + $l = $size / 3; + $lspace += $l; + if ($this->rtl) {; + $this->x += $lspace; + } else { + $this->x -= $lspace; + } + $this->Rect($this->x, ($this->y + (($this->lasth - $l)/ 2)), $l, $l, 'F', array(), $color); + break; + } + // ordered types + // $this->listcount[$this->listnum]; + // $textitem + case '1': + case 'decimal': { + $textitem = $this->listcount[$this->listnum]; + break; + } + case 'decimal-leading-zero': { + $textitem = sprintf('%02d', $this->listcount[$this->listnum]); + break; + } + case 'i': + case 'lower-roman': { + $textitem = strtolower($this->intToRoman($this->listcount[$this->listnum])); + break; + } + case 'I': + case 'upper-roman': { + $textitem = $this->intToRoman($this->listcount[$this->listnum]); + break; + } + case 'a': + case 'lower-alpha': + case 'lower-latin': { + $textitem = chr(97 + $this->listcount[$this->listnum] - 1); + break; + } + case 'A': + case 'upper-alpha': + case 'upper-latin': { + $textitem = chr(65 + $this->listcount[$this->listnum] - 1); + break; + } + case 'lower-greek': { + $textitem = $this->unichr(945 + $this->listcount[$this->listnum] - 1); + break; + } + /* + // Types to be implemented (special handling) + case 'hebrew': { + break; + } + case 'armenian': { + break; + } + case 'georgian': { + break; + } + case 'cjk-ideographic': { + break; + } + case 'hiragana': { + break; + } + case 'katakana': { + break; + } + case 'hiragana-iroha': { + break; + } + case 'katakana-iroha': { + break; + } + */ + default: { + $textitem = $this->listcount[$this->listnum]; + } + } + if (!$this->empty_string($textitem)) { + // print ordered item + if ($this->rtl) { + $textitem = '.'.$textitem; + } else { + $textitem = $textitem.'.'; + } + $lspace += $this->GetStringWidth($textitem); + if ($this->rtl) { + $this->x += $lspace; + } else { + $this->x -= $lspace; + } + $this->Write($this->lasth, $textitem, '', false, '', false, 0, false); + } + $this->x = $tmpx; + $this->lispacer = ''; + } + + /** + * Returns current graphic variables as array. + * @return array graphic variables + * @access protected + * @since 4.2.010 (2008-11-14) + */ + protected function getGraphicVars() { + $grapvars = array( + 'FontFamily' => $this->FontFamily, + 'FontStyle' => $this->FontStyle, + 'FontSizePt' => $this->FontSizePt, + 'rMargin' => $this->rMargin, + 'lMargin' => $this->lMargin, + 'cMargin' => $this->cMargin, + 'LineWidth' => $this->LineWidth, + 'linestyleWidth' => $this->linestyleWidth, + 'linestyleCap' => $this->linestyleCap, + 'linestyleJoin' => $this->linestyleJoin, + 'linestyleDash' => $this->linestyleDash, + 'textrendermode' => $this->textrendermode, + 'textstrokewidth' => $this->textstrokewidth, + 'DrawColor' => $this->DrawColor, + 'FillColor' => $this->FillColor, + 'TextColor' => $this->TextColor, + 'ColorFlag' => $this->ColorFlag, + 'bgcolor' => $this->bgcolor, + 'fgcolor' => $this->fgcolor, + 'htmlvspace' => $this->htmlvspace, + 'lasth' => $this->lasth + ); + return $grapvars; + } + + /** + * Set graphic variables. + * @param $gvars array graphic variables + * @access protected + * @since 4.2.010 (2008-11-14) + */ + protected function setGraphicVars($gvars) { + $this->FontFamily = $gvars['FontFamily']; + $this->FontStyle = $gvars['FontStyle']; + $this->FontSizePt = $gvars['FontSizePt']; + $this->rMargin = $gvars['rMargin']; + $this->lMargin = $gvars['lMargin']; + $this->cMargin = $gvars['cMargin']; + $this->LineWidth = $gvars['LineWidth']; + $this->linestyleWidth = $gvars['linestyleWidth']; + $this->linestyleCap = $gvars['linestyleCap']; + $this->linestyleJoin = $gvars['linestyleJoin']; + $this->linestyleDash = $gvars['linestyleDash']; + $this->textrendermode = $gvars['textrendermode']; + $this->textstrokewidth = $gvars['textstrokewidth']; + $this->DrawColor = $gvars['DrawColor']; + $this->FillColor = $gvars['FillColor']; + $this->TextColor = $gvars['TextColor']; + $this->ColorFlag = $gvars['ColorFlag']; + $this->bgcolor = $gvars['bgcolor']; + $this->fgcolor = $gvars['fgcolor']; + $this->htmlvspace = $gvars['htmlvspace']; + //$this->lasth = $gvars['lasth']; + $this->_out(''.$this->linestyleWidth.' '.$this->linestyleCap.' '.$this->linestyleJoin.' '.$this->linestyleDash.' '.$this->DrawColor.' '.$this->FillColor.''); + if (!$this->empty_string($this->FontFamily)) { + $this->SetFont($this->FontFamily, $this->FontStyle, $this->FontSizePt); + } + } + + /** + * Returns a temporary filename for caching object on filesystem. + * @param string $prefix prefix to add to filename + * return string filename. + * @access protected + * @since 4.5.000 (2008-12-31) + */ + protected function getObjFilename($name) { + return tempnam(K_PATH_CACHE, $name.'_'); + } + + /** + * Writes data to a temporary file on filesystem. + * @param string $file file name + * @param mixed $data data to write on file + * @param boolean $append if true append data, false replace. + * @access protected + * @since 4.5.000 (2008-12-31) + */ + protected function writeDiskCache($filename, $data, $append=false) { + if ($append) { + $fmode = 'ab+'; + } else { + $fmode = 'wb+'; + } + $f = @fopen($filename, $fmode); + if (!$f) { + $this->Error('Unable to write cache file: '.$filename); + } else { + fwrite($f, $data); + fclose($f); + } + // update file length (needed for transactions) + if (!isset($this->cache_file_length['_'.$filename])) { + $this->cache_file_length['_'.$filename] = strlen($data); + } else { + $this->cache_file_length['_'.$filename] += strlen($data); + } + } + + /** + * Read data from a temporary file on filesystem. + * @param string $file file name + * @return mixed retrieved data + * @access protected + * @since 4.5.000 (2008-12-31) + */ + protected function readDiskCache($filename) { + return file_get_contents($filename); + } + + /** + * Set buffer content (always append data). + * @param string $data data + * @access protected + * @since 4.5.000 (2009-01-02) + */ + protected function setBuffer($data) { + $this->bufferlen += strlen($data); + if ($this->diskcache) { + if (!isset($this->buffer) OR $this->empty_string($this->buffer)) { + $this->buffer = $this->getObjFilename('buffer'); + } + $this->writeDiskCache($this->buffer, $data, true); + } else { + $this->buffer .= $data; + } + } + + /** + * Get buffer content. + * @return string buffer content + * @access protected + * @since 4.5.000 (2009-01-02) + */ + protected function getBuffer() { + if ($this->diskcache) { + return $this->readDiskCache($this->buffer); + } else { + return $this->buffer; + } + } + + /** + * Set page buffer content. + * @param int $page page number + * @param string $data page data + * @param boolean $append if true append data, false replace. + * @access protected + * @since 4.5.000 (2008-12-31) + */ + protected function setPageBuffer($page, $data, $append=false) { + if ($this->diskcache) { + if (!isset($this->pages[$page])) { + $this->pages[$page] = $this->getObjFilename('page'.$page); + } + $this->writeDiskCache($this->pages[$page], $data, $append); + } else { + if ($append) { + $this->pages[$page] .= $data; + } else { + $this->pages[$page] = $data; + } + } + if ($append AND isset($this->pagelen[$page])) { + $this->pagelen[$page] += strlen($data); + } else { + $this->pagelen[$page] = strlen($data); + } + } + + /** + * Get page buffer content. + * @param int $page page number + * @return string page buffer content or false in case of error + * @access protected + * @since 4.5.000 (2008-12-31) + */ + protected function getPageBuffer($page) { + if ($this->diskcache) { + return $this->readDiskCache($this->pages[$page]); + } elseif (isset($this->pages[$page])) { + return $this->pages[$page]; + } + return false; + } + + /** + * Set image buffer content. + * @param string $image image key + * @param array $data image data + * @access protected + * @since 4.5.000 (2008-12-31) + */ + protected function setImageBuffer($image, $data) { + if ($this->diskcache) { + if (!isset($this->images[$image])) { + $this->images[$image] = $this->getObjFilename('image'.$image); + } + $this->writeDiskCache($this->images[$image], serialize($data)); + } else { + $this->images[$image] = $data; + } + if (!in_array($image, $this->imagekeys)) { + $this->imagekeys[] = $image; + ++$this->numimages; + } + } + + /** + * Set image buffer content for a specified sub-key. + * @param string $image image key + * @param string $key image sub-key + * @param array $data image data + * @access protected + * @since 4.5.000 (2008-12-31) + */ + protected function setImageSubBuffer($image, $key, $data) { + if (!isset($this->images[$image])) { + $this->setImageBuffer($image, array()); + } + if ($this->diskcache) { + $tmpimg = $this->getImageBuffer($image); + $tmpimg[$key] = $data; + $this->writeDiskCache($this->images[$image], serialize($tmpimg)); + } else { + $this->images[$image][$key] = $data; + } + } + + /** + * Get image buffer content. + * @param string $image image key + * @return string image buffer content or false in case of error + * @access protected + * @since 4.5.000 (2008-12-31) + */ + protected function getImageBuffer($image) { + if ($this->diskcache AND isset($this->images[$image])) { + return unserialize($this->readDiskCache($this->images[$image])); + } elseif (isset($this->images[$image])) { + return $this->images[$image]; + } + return false; + } + + /** + * Set font buffer content. + * @param string $font font key + * @param array $data font data + * @access protected + * @since 4.5.000 (2009-01-02) + */ + protected function setFontBuffer($font, $data) { + if ($this->diskcache) { + if (!isset($this->fonts[$font])) { + $this->fonts[$font] = $this->getObjFilename('font'); + } + $this->writeDiskCache($this->fonts[$font], serialize($data)); + } else { + $this->fonts[$font] = $data; + } + if (!in_array($font, $this->fontkeys)) { + $this->fontkeys[] = $font; + } + } + + /** + * Set font buffer content. + * @param string $font font key + * @param string $key font sub-key + * @param array $data font data + * @access protected + * @since 4.5.000 (2009-01-02) + */ + protected function setFontSubBuffer($font, $key, $data) { + if (!isset($this->fonts[$font])) { + $this->setFontBuffer($font, array()); + } + if ($this->diskcache) { + $tmpfont = $this->getFontBuffer($font); + $tmpfont[$key] = $data; + $this->writeDiskCache($this->fonts[$font], serialize($tmpfont)); + } else { + $this->fonts[$font][$key] = $data; + } + } + + /** + * Get font buffer content. + * @param string $font font key + * @return string font buffer content or false in case of error + * @access protected + * @since 4.5.000 (2009-01-02) + */ + protected function getFontBuffer($font) { + if ($this->diskcache AND isset($this->fonts[$font])) { + return unserialize($this->readDiskCache($this->fonts[$font])); + } elseif (isset($this->fonts[$font])) { + return $this->fonts[$font]; + } + return false; + } + + /** + * Move a page to a previous position. + * @param int $frompage number of the source page + * @param int $topage number of the destination page (must be less than $frompage) + * @return true in case of success, false in case of error. + * @access public + * @since 4.5.000 (2009-01-02) + */ + public function movePage($frompage, $topage) { + if (($frompage > $this->numpages) OR ($frompage <= $topage)) { + return false; + } + if ($frompage == $this->page) { + // close the page before moving it + $this->endPage(); + } + // move all page-related states + $tmppage = $this->pages[$frompage]; + $tmppagedim = $this->pagedim[$frompage]; + $tmppagelen = $this->pagelen[$frompage]; + $tmpintmrk = $this->intmrk[$frompage]; + if (isset($this->footerpos[$frompage])) { + $tmpfooterpos = $this->footerpos[$frompage]; + } + if (isset($this->footerlen[$frompage])) { + $tmpfooterlen = $this->footerlen[$frompage]; + } + if (isset($this->transfmrk[$frompage])) { + $tmptransfmrk = $this->transfmrk[$frompage]; + } + if (isset($this->PageAnnots[$frompage])) { + $tmpannots = $this->PageAnnots[$frompage]; + } + if (isset($this->newpagegroup[$frompage])) { + $tmpnewpagegroup = $this->newpagegroup[$frompage]; + } + for ($i = $frompage; $i > $topage; --$i) { + $j = $i - 1; + // shift pages down + $this->pages[$i] = $this->pages[$j]; + $this->pagedim[$i] = $this->pagedim[$j]; + $this->pagelen[$i] = $this->pagelen[$j]; + $this->intmrk[$i] = $this->intmrk[$j]; + if (isset($this->footerpos[$j])) { + $this->footerpos[$i] = $this->footerpos[$j]; + } elseif (isset($this->footerpos[$i])) { + unset($this->footerpos[$i]); + } + if (isset($this->footerlen[$j])) { + $this->footerlen[$i] = $this->footerlen[$j]; + } elseif (isset($this->footerlen[$i])) { + unset($this->footerlen[$i]); + } + if (isset($this->transfmrk[$j])) { + $this->transfmrk[$i] = $this->transfmrk[$j]; + } elseif (isset($this->transfmrk[$i])) { + unset($this->transfmrk[$i]); + } + if (isset($this->PageAnnots[$j])) { + $this->PageAnnots[$i] = $this->PageAnnots[$j]; + } elseif (isset($this->PageAnnots[$i])) { + unset($this->PageAnnots[$i]); + } + if (isset($this->newpagegroup[$j])) { + $this->newpagegroup[$i] = $this->newpagegroup[$j]; + } elseif (isset($this->newpagegroup[$i])) { + unset($this->newpagegroup[$i]); + } + } + $this->pages[$topage] = $tmppage; + $this->pagedim[$topage] = $tmppagedim; + $this->pagelen[$topage] = $tmppagelen; + $this->intmrk[$topage] = $tmpintmrk; + if (isset($tmpfooterpos)) { + $this->footerpos[$topage] = $tmpfooterpos; + } elseif (isset($this->footerpos[$topage])) { + unset($this->footerpos[$topage]); + } + if (isset($tmpfooterlen)) { + $this->footerlen[$topage] = $tmpfooterlen; + } elseif (isset($this->footerlen[$topage])) { + unset($this->footerlen[$topage]); + } + if (isset($tmptransfmrk)) { + $this->transfmrk[$topage] = $tmptransfmrk; + } elseif (isset($this->transfmrk[$topage])) { + unset($this->transfmrk[$topage]); + } + if (isset($tmpannots)) { + $this->PageAnnots[$topage] = $tmpannots; + } elseif (isset($this->PageAnnots[$topage])) { + unset($this->PageAnnots[$topage]); + } + if (isset($tmpnewpagegroup)) { + $this->newpagegroup[$topage] = $tmpnewpagegroup; + } elseif (isset($this->newpagegroup[$topage])) { + unset($this->newpagegroup[$topage]); + } + // adjust outlines + $tmpoutlines = $this->outlines; + foreach ($tmpoutlines as $key => $outline) { + if (($outline['p'] >= $topage) AND ($outline['p'] < $frompage)) { + $this->outlines[$key]['p'] = $outline['p'] + 1; + } elseif ($outline['p'] == $frompage) { + $this->outlines[$key]['p'] = $topage; + } + } + // adjust links + $tmplinks = $this->links; + foreach ($tmplinks as $key => $link) { + if (($link[0] >= $topage) AND ($link[0] < $frompage)) { + $this->links[$key][0] = $link[0] + 1; + } elseif ($link[0] == $frompage) { + $this->links[$key][0] = $topage; + } + } + // adjust javascript + $tmpjavascript = $this->javascript; + global $jfrompage, $jtopage; + $jfrompage = $frompage; + $jtopage = $topage; + $this->javascript = preg_replace_callback('/this\.addField\(\'([^\']*)\',\'([^\']*)\',([0-9]+)/', + create_function('$matches', 'global $jfrompage, $jtopage; + $pagenum = intval($matches[3]) + 1; + if (($pagenum >= $jtopage) AND ($pagenum < $jfrompage)) { + $newpage = ($pagenum + 1); + } elseif ($pagenum == $jfrompage) { + $newpage = $jtopage; + } else { + $newpage = $pagenum; + } + --$newpage; + return "this.addField(\'".$matches[1]."\',\'".$matches[2]."\',".$newpage."";'), $tmpjavascript); + // return to last page + $this->lastPage(true); + return true; + } + + /** + * Remove the specified page. + * @param int $page page to remove + * @return true in case of success, false in case of error. + * @access public + * @since 4.6.004 (2009-04-23) + */ + public function deletePage($page) { + if ($page > $this->numpages) { + return false; + } + // delete current page + unset($this->pages[$page]); + unset($this->pagedim[$page]); + unset($this->pagelen[$page]); + unset($this->intmrk[$page]); + if (isset($this->footerpos[$page])) { + unset($this->footerpos[$page]); + } + if (isset($this->footerlen[$page])) { + unset($this->footerlen[$page]); + } + if (isset($this->transfmrk[$page])) { + unset($this->transfmrk[$page]); + } + if (isset($this->PageAnnots[$page])) { + unset($this->PageAnnots[$page]); + } + if (isset($this->newpagegroup[$page])) { + unset($this->newpagegroup[$page]); + } + if (isset($this->pageopen[$page])) { + unset($this->pageopen[$page]); + } + // update remaining pages + for ($i = $page; $i < $this->numpages; ++$i) { + $j = $i + 1; + // shift pages + $this->pages[$i] = $this->pages[$j]; + $this->pagedim[$i] = $this->pagedim[$j]; + $this->pagelen[$i] = $this->pagelen[$j]; + $this->intmrk[$i] = $this->intmrk[$j]; + if (isset($this->footerpos[$j])) { + $this->footerpos[$i] = $this->footerpos[$j]; + } elseif (isset($this->footerpos[$i])) { + unset($this->footerpos[$i]); + } + if (isset($this->footerlen[$j])) { + $this->footerlen[$i] = $this->footerlen[$j]; + } elseif (isset($this->footerlen[$i])) { + unset($this->footerlen[$i]); + } + if (isset($this->transfmrk[$j])) { + $this->transfmrk[$i] = $this->transfmrk[$j]; + } elseif (isset($this->transfmrk[$i])) { + unset($this->transfmrk[$i]); + } + if (isset($this->PageAnnots[$j])) { + $this->PageAnnots[$i] = $this->PageAnnots[$j]; + } elseif (isset($this->PageAnnots[$i])) { + unset($this->PageAnnots[$i]); + } + if (isset($this->newpagegroup[$j])) { + $this->newpagegroup[$i] = $this->newpagegroup[$j]; + } elseif (isset($this->newpagegroup[$i])) { + unset($this->newpagegroup[$i]); + } + if (isset($this->pageopen[$j])) { + $this->pageopen[$i] = $this->pageopen[$j]; + } elseif (isset($this->pageopen[$i])) { + unset($this->pageopen[$i]); + } + } + // remove last page + unset($this->pages[$this->numpages]); + unset($this->pagedim[$this->numpages]); + unset($this->pagelen[$this->numpages]); + unset($this->intmrk[$this->numpages]); + if (isset($this->footerpos[$this->numpages])) { + unset($this->footerpos[$this->numpages]); + } + if (isset($this->footerlen[$this->numpages])) { + unset($this->footerlen[$this->numpages]); + } + if (isset($this->transfmrk[$this->numpages])) { + unset($this->transfmrk[$this->numpages]); + } + if (isset($this->PageAnnots[$this->numpages])) { + unset($this->PageAnnots[$this->numpages]); + } + if (isset($this->newpagegroup[$this->numpages])) { + unset($this->newpagegroup[$this->numpages]); + } + if (isset($this->pageopen[$this->numpages])) { + unset($this->pageopen[$this->numpages]); + } + --$this->numpages; + $this->page = $this->numpages; + // adjust outlines + $tmpoutlines = $this->outlines; + foreach ($tmpoutlines as $key => $outline) { + if ($outline['p'] > $page) { + $this->outlines[$key]['p'] = $outline['p'] - 1; + } elseif ($outline['p'] == $page) { + unset($this->outlines[$key]); + } + } + // adjust links + $tmplinks = $this->links; + foreach ($tmplinks as $key => $link) { + if ($link[0] > $page) { + $this->links[$key][0] = $link[0] - 1; + } elseif ($link[0] == $page) { + unset($this->links[$key]); + } + } + // adjust javascript + $tmpjavascript = $this->javascript; + global $jpage; + $jpage = $page; + $this->javascript = preg_replace_callback('/this\.addField\(\'([^\']*)\',\'([^\']*)\',([0-9]+)/', + create_function('$matches', 'global $jpage; + $pagenum = intval($matches[3]) + 1; + if ($pagenum >= $jpage) { + $newpage = ($pagenum - 1); + } elseif ($pagenum == $jpage) { + $newpage = 1; + } else { + $newpage = $pagenum; + } + --$newpage; + return "this.addField(\'".$matches[1]."\',\'".$matches[2]."\',".$newpage."";'), $tmpjavascript); + // return to last page + $this->lastPage(true); + return true; + } + + /** + * Clone the specified page to a new page. + * @param int $page number of page to copy (0 = current page) + * @return true in case of success, false in case of error. + * @access public + * @since 4.9.015 (2010-04-20) + */ + public function copyPage($page=0) { + if ($page == 0) { + // default value + $page = $this->page; + } + if ($page > $this->numpages) { + return false; + } + if ($page == $this->page) { + // close the page before cloning it + $this->endPage(); + } + // copy all page-related states + ++$this->numpages; + $this->page = $this->numpages; + $this->pages[$this->page] = $this->pages[$page]; + $this->pagedim[$this->page] = $this->pagedim[$page]; + $this->pagelen[$this->page] = $this->pagelen[$page]; + $this->intmrk[$this->page] = $this->intmrk[$page]; + $this->pageopen[$this->page] = false; + if (isset($this->footerpos[$page])) { + $this->footerpos[$this->page] = $this->footerpos[$page]; + } + if (isset($this->footerlen[$page])) { + $this->footerlen[$this->page] = $this->footerlen[$page]; + } + if (isset($this->transfmrk[$page])) { + $this->transfmrk[$this->page] = $this->transfmrk[$page]; + } + if (isset($this->PageAnnots[$page])) { + $this->PageAnnots[$this->page] = $this->PageAnnots[$page]; + } + if (isset($this->newpagegroup[$page])) { + $this->newpagegroup[$this->page] = $this->newpagegroup[$page]; + } + // copy outlines + $tmpoutlines = $this->outlines; + foreach ($tmpoutlines as $key => $outline) { + if ($outline['p'] == $page) { + $this->outlines[] = array('t' => $outline['t'], 'l' => $outline['l'], 'y' => $outline['y'], 'p' => $this->page); + } + } + // copy links + $tmplinks = $this->links; + foreach ($tmplinks as $key => $link) { + if ($link[0] == $page) { + $this->links[] = array($this->page, $link[1]); + } + } + // return to last page + $this->lastPage(true); + return true; + } + + /** + * Output a Table of Content Index (TOC). + * Before calling this method you have to open the page using the addTOCPage() method. + * After calling this method you have to call endTOCPage() to close the TOC page. + * You can override this method to achieve different styles. + * @param int $page page number where this TOC should be inserted (leave empty for current page). + * @param string $numbersfont set the font for page numbers (please use monospaced font for better alignment). + * @param string $filler string used to fill the space between text and page number. + * @param string $toc_name name to use for TOC bookmark. + * @access public + * @author Nicola Asuni + * @since 4.5.000 (2009-01-02) + * @see addTOCPage(), endTOCPage(), addHTMLTOC() + */ + public function addTOC($page='', $numbersfont='', $filler='.', $toc_name='TOC') { + $fontsize = $this->FontSizePt; + $fontfamily = $this->FontFamily; + $fontstyle = $this->FontStyle; + $w = $this->w - $this->lMargin - $this->rMargin; + $spacer = $this->GetStringWidth(chr(32)) * 4; + $page_first = $this->getPage(); + $lmargin = $this->lMargin; + $rmargin = $this->rMargin; + $x_start = $this->GetX(); + if ($this->empty_string($numbersfont)) { + $numbersfont = $this->default_monospaced_font; + } + if ($this->empty_string($filler)) { + $filler = ' '; + } + if ($this->empty_string($page)) { + $gap = ' '; + } else { + $gap = ''; + } + foreach ($this->outlines as $key => $outline) { + if ($this->rtl) { + $aligntext = 'R'; + $alignnum = 'L'; + } else { + $aligntext = 'L'; + $alignnum = 'R'; + } + if ($outline['l'] == 0) { + $this->SetFont($fontfamily, $fontstyle.'B', $fontsize); + } else { + $this->SetFont($fontfamily, $fontstyle, $fontsize - $outline['l']); + } + $indent = ($spacer * $outline['l']); + if ($this->rtl) { + $this->rMargin += $indent; + $this->x -= $indent; + } else { + $this->lMargin += $indent; + $this->x += $indent; + } + $link = $this->AddLink(); + $this->SetLink($link, 0, $outline['p']); + // write the text + $this->Write(0, $outline['t'], $link, 0, $aligntext, false, 0, false, false, 0); + $this->SetFont($numbersfont, $fontstyle, $fontsize); + if ($this->empty_string($page)) { + $pagenum = $outline['p']; + } else { + // placemark to be replaced with the correct number + $pagenum = '{#'.($outline['p']).'}'; + if (($this->CurrentFont['type'] == 'TrueTypeUnicode') OR ($this->CurrentFont['type'] == 'cidfont0')) { + $pagenum = '{'.$pagenum.'}'; + } + } + $numwidth = $this->GetStringWidth($pagenum); + if ($this->rtl) { + $tw = $this->x - $this->lMargin; + } else { + $tw = $this->w - $this->rMargin - $this->x; + } + $fw = $tw - $numwidth - $this->GetStringWidth(chr(32)); + $numfills = floor($fw / $this->GetStringWidth($filler)); + if ($numfills > 0) { + $rowfill = str_repeat($filler, $numfills); + } else { + $rowfill = ''; + } + if ($this->rtl) { + $pagenum = $pagenum.$gap.$rowfill.' '; + } else { + $pagenum = ' '.$rowfill.$gap.$pagenum; + } + // write the number + $this->Cell($tw, 0, $pagenum, 0, 1, $alignnum, 0, $link, 0); + $this->SetX($x_start); + $this->lMargin = $lmargin; + $this->rMargin = $rmargin; + } + $page_last = $this->getPage(); + $numpages = $page_last - $page_first + 1; + if (!$this->empty_string($page)) { + for ($p = $page_first; $p <= $page_last; ++$p) { + // get page data + $temppage = $this->getPageBuffer($p); + for ($n = 1; $n <= $this->numpages; ++$n) { + // update page numbers + $k = '{#'.$n.'}'; + $ku = '{'.$k.'}'; + $alias_a = $this->_escape($k); + $alias_au = $this->_escape('{'.$k.'}'); + if ($this->isunicode) { + $alias_b = $this->_escape($this->UTF8ToLatin1($k)); + $alias_bu = $this->_escape($this->UTF8ToLatin1($ku)); + $alias_c = $this->_escape($this->utf8StrRev($k, false, $this->tmprtl)); + $alias_cu = $this->_escape($this->utf8StrRev($ku, false, $this->tmprtl)); + } + if ($n >= $page) { + $np = $n + $numpages; + } else { + $np = $n; + } + $ns = $this->formatTOCPageNumber($np); + $nu = $ns; + $sdiff = strlen($k) - strlen($ns) - 1; + $sdiffu = strlen($ku) - strlen($ns) - 1; + $sfill = str_repeat($filler, $sdiff); + $sfillu = str_repeat($filler, $sdiffu); + if ($this->rtl) { + $ns = $ns.' '.$sfill; + $nu = $nu.' '.$sfillu; + } else { + $ns = $sfill.' '.$ns; + $nu = $sfillu.' '.$nu; + } + $nu = $this->UTF8ToUTF16BE($nu, false); + $temppage = str_replace($alias_au, $nu, $temppage); + if ($this->isunicode) { + $temppage = str_replace($alias_bu, $nu, $temppage); + $temppage = str_replace($alias_cu, $nu, $temppage); + $temppage = str_replace($alias_b, $ns, $temppage); + $temppage = str_replace($alias_c, $ns, $temppage); + } + $temppage = str_replace($alias_a, $ns, $temppage); + } + // save changes + $this->setPageBuffer($p, $temppage); + } + // move pages + $this->Bookmark($toc_name, 0, 0, $page_first); + for ($i = 0; $i < $numpages; ++$i) { + $this->movePage($page_last, $page); + } + } + } + + /** + * Output a Table Of Content Index (TOC) using HTML templates. + * Before calling this method you have to open the page using the addTOCPage() method. + * After calling this method you have to call endTOCPage() to close the TOC page. + * @param int $page page number where this TOC should be inserted (leave empty for current page). + * @param string $toc_name name to use for TOC bookmark. + * @param array $templates array of html templates. Use: #TOC_DESCRIPTION# for bookmark title, #TOC_PAGE_NUMBER# for page number. + * @parma boolean $correct_align if true correct the number alignment (numbers must be in monospaced font like courier and right aligned on LTR, or left aligned on RTL) + * @access public + * @author Nicola Asuni + * @since 5.0.001 (2010-05-06) + * @see addTOCPage(), endTOCPage(), addTOC() + */ + public function addHTMLTOC($page='', $toc_name='TOC', $templates=array(), $correct_align=true) { + $prev_htmlLinkColorArray = $this->htmlLinkColorArray; + $prev_htmlLinkFontStyle = $this->htmlLinkFontStyle; + // set new style for link + $this->htmlLinkColorArray = array(); + $this->htmlLinkFontStyle = ''; + $page_first = $this->getPage(); + foreach ($this->outlines as $key => $outline) { + if ($this->empty_string($page)) { + $pagenum = $outline['p']; + } else { + // placemark to be replaced with the correct number + $pagenum = '{#'.($outline['p']).'}'; + if (($this->CurrentFont['type'] == 'TrueTypeUnicode') OR ($this->CurrentFont['type'] == 'cidfont0')) { + $pagenum = '{'.$pagenum.'}'; + } + } + // get HTML template + $row = $templates[$outline['l']]; + // replace templates with current values + $row = str_replace('#TOC_DESCRIPTION#', $outline['t'], $row); + $row = str_replace('#TOC_PAGE_NUMBER#', $pagenum, $row); + // add link to page + $row = '<a href="#'.$outline['p'].'">'.$row.'</a>'; + // write bookmark entry + $this->writeHTML($row, false, false, true, false, ''); + } + // restore link styles + $this->htmlLinkColorArray = $prev_htmlLinkColorArray; + $this->htmlLinkFontStyle = $prev_htmlLinkFontStyle; + // move TOC page and replace numbers + $page_last = $this->getPage(); + $numpages = $page_last - $page_first + 1; + if (!$this->empty_string($page)) { + for ($p = $page_first; $p <= $page_last; ++$p) { + // get page data + $temppage = $this->getPageBuffer($p); + for ($n = 1; $n <= $this->numpages; ++$n) { + // update page numbers + $k = '{#'.$n.'}'; + $ku = '{'.$k.'}'; + $alias_a = $this->_escape($k); + $alias_au = $this->_escape('{'.$k.'}'); + if ($this->isunicode) { + $alias_b = $this->_escape($this->UTF8ToLatin1($k)); + $alias_bu = $this->_escape($this->UTF8ToLatin1($ku)); + $alias_c = $this->_escape($this->utf8StrRev($k, false, $this->tmprtl)); + $alias_cu = $this->_escape($this->utf8StrRev($ku, false, $this->tmprtl)); + } + if ($n >= $page) { + $np = $n + $numpages; + } else { + $np = $n; + } + $ns = $this->formatTOCPageNumber($np); + $nu = $ns; + if ($correct_align) { + $sdiff = strlen($k) - strlen($ns); + $sdiffu = strlen($ku) - strlen($ns); + $sfill = str_repeat(' ', $sdiff); + $sfillu = str_repeat(' ', $sdiffu); + if ($this->rtl) { + $ns = $ns.$sfill; + $nu = $nu.$sfillu; + } else { + $ns = $sfill.$ns; + $nu = $sfillu.$nu; + } + } + $nu = $this->UTF8ToUTF16BE($nu, false); + $temppage = str_replace($alias_au, $nu, $temppage); + if ($this->isunicode) { + $temppage = str_replace($alias_bu, $nu, $temppage); + $temppage = str_replace($alias_cu, $nu, $temppage); + $temppage = str_replace($alias_b, $ns, $temppage); + $temppage = str_replace($alias_c, $ns, $temppage); + } + $temppage = str_replace($alias_a, $ns, $temppage); + } + // save changes + $this->setPageBuffer($p, $temppage); + } + // move pages + $this->Bookmark($toc_name, 0, 0, $page_first); + for ($i = 0; $i < $numpages; ++$i) { + $this->movePage($page_last, $page); + } + } + } + + /** + * Stores a copy of the current TCPDF object used for undo operation. + * @access public + * @since 4.5.029 (2009-03-19) + */ + public function startTransaction() { + if (isset($this->objcopy)) { + // remove previous copy + $this->commitTransaction(); + } + // record current page number and Y position + $this->start_transaction_page = $this->page; + $this->start_transaction_y = $this->y; + // clone current object + $this->objcopy = $this->objclone($this); + } + + /** + * Delete the copy of the current TCPDF object used for undo operation. + * @access public + * @since 4.5.029 (2009-03-19) + */ + public function commitTransaction() { + if (isset($this->objcopy)) { + $this->objcopy->_destroy(true, true); + unset($this->objcopy); + } + } + + /** + * This method allows to undo the latest transaction by returning the latest saved TCPDF object with startTransaction(). + * @param boolean $self if true restores current class object to previous state without the need of reassignment via the returned value. + * @return TCPDF object. + * @access public + * @since 4.5.029 (2009-03-19) + */ + public function rollbackTransaction($self=false) { + if (isset($this->objcopy)) { + if (isset($this->objcopy->diskcache) AND $this->objcopy->diskcache) { + // truncate files to previous values + foreach ($this->objcopy->cache_file_length as $file => $length) { + $file = substr($file, 1); + $handle = fopen($file, 'r+'); + ftruncate($handle, $length); + } + } + $this->_destroy(true, true); + if ($self) { + $objvars = get_object_vars($this->objcopy); + foreach ($objvars as $key => $value) { + $this->$key = $value; + } + } + return $this->objcopy; + } + return $this; + } + + /** + * Creates a copy of a class object + * @param object $object class object to be cloned + * @return cloned object + * @access public + * @since 4.5.029 (2009-03-19) + */ + public function objclone($object) { + return @clone($object); + } + + /** + * Determine whether a string is empty. + * @param string $str string to be checked + * @return boolean true if string is empty + * @access public + * @since 4.5.044 (2009-04-16) + */ + public function empty_string($str) { + return (is_null($str) OR (is_string($str) AND (strlen($str) == 0))); + } + + /** + * Find position of last occurrence of a substring in a string + * @param string $haystack The string to search in. + * @param string $needle substring to search. + * @param int $offset May be specified to begin searching an arbitrary number of characters into the string. + * @return Returns the position where the needle exists. Returns FALSE if the needle was not found. + * @access public + * @since 4.8.038 (2010-03-13) + */ + public function revstrpos($haystack, $needle, $offset = 0) { + $length = strlen($haystack); + $offset = ($offset > 0)?($length - $offset):abs($offset); + $pos = strpos(strrev($haystack), strrev($needle), $offset); + return ($pos === false)?false:($length - $pos - strlen($needle)); + } + + // --- MULTI COLUMNS METHODS ----------------------- + + /** + * Set multiple columns of the same size + * @param int $numcols number of columns (set to zero to disable columns mode) + * @param int $width column width + * @param int $y column starting Y position (leave empty for current Y position) + * @access public + * @since 4.9.001 (2010-03-28) + */ + public function setEqualColumns($numcols=0, $width=0, $y='') { + $this->columns = array(); + if ($numcols < 2) { + $numcols = 0; + $this->columns = array(); + } else { + // maximum column width + $maxwidth = ($this->w - $this->original_lMargin - $this->original_rMargin) / $numcols; + if ($width > $maxwidth) { + $width = $maxwidth; + } + if ($this->empty_string($y)) { + $y = $this->y; + } + // space between columns + $space = (($this->w - $this->original_lMargin - $this->original_rMargin - ($numcols * $width)) / ($numcols - 1)); + // fill the columns array (with, space, starting Y position) + for ($i = 0; $i < $numcols; ++$i) { + $this->columns[$i] = array('w' => $width, 's' => $space, 'y' => $y); + } + } + $this->num_columns = $numcols; + $this->current_column = 0; + $this->column_start_page = $this->page; + } + + /** + * Set columns array. + * Each column is represented by and array with the following keys: (w = width, s = space between columns, y = column top position). + * @param array $columns + * @access public + * @since 4.9.001 (2010-03-28) + */ + public function setColumnsArray($columns) { + $this->columns = $columns; + $this->num_columns = count($columns); + $this->current_column = 0; + $this->column_start_page = $this->page; + } + + /** + * Set position at a given column + * @param int $col column number (from 0 to getNumberOfColumns()-1); empty string = current column. + * @access public + * @since 4.9.001 (2010-03-28) + */ + public function selectColumn($col='') { + if (is_string($col)) { + $col = $this->current_column; + } elseif($col >= $this->num_columns) { + $col = 0; + } + if ($this->num_columns > 1) { + if ($col != $this->current_column) { + // move pointer at column top on the first page + if ($this->column_start_page == $this->page) { + $this->y = $this->columns[$col]['y']; + } else { + $this->y = $this->tMargin; + } + } + // set X position of the current column by case + $listindent = ($this->listindentlevel * $this->listindent); + if ($this->rtl) { + $x = $this->w - $this->original_rMargin - ($col * ($this->columns[$col]['w'] + $this->columns[$col]['s'])); + $this->SetRightMargin($this->w - $x + $listindent); + $this->SetLeftMargin($x - $this->columns[$col]['w']); + $this->x = $x - $listindent; + } else { + $x = $this->original_lMargin + ($col * ($this->columns[$col]['w'] + $this->columns[$col]['s'])); + $this->SetLeftMargin($x + $listindent); + $this->SetRightMargin($this->w - $x - $this->columns[$col]['w']); + $this->x = $x + $listindent; + } + $this->columns[$col]['x'] = $x; + } + $this->current_column = $col; + // fix for HTML mode + $this->newline = true; + // print HTML table header (if any) + if (!$this->empty_string($this->thead) AND (!$this->inthead)) { + // print table header + $this->writeHTML($this->thead, false, false, false, false, ''); + } + } + + /** + * Serialize an array of parameters to be used with TCPDF tag in HTML code. + * @param array $pararray parameters array + * @return sting containing serialized data + * @access public + * @since 4.9.006 (2010-04-02) + */ + public function serializeTCPDFtagParameters($pararray) { + return urlencode(serialize($pararray)); + } + + /** + * Set Text rendering mode. + * @param int $stroke outline size in user units (0 = disable). + * @param boolean $fill if true fills the text (default). + * @param boolean $clip if true activate clipping mode + * @access public + * @since 4.9.008 (2009-04-02) + */ + public function setTextRenderingMode($stroke=0, $fill=true, $clip=false) { + // Ref.: PDF 32000-1:2008 - 9.3.6 Text Rendering Mode + // convert text rendering parameters + if ($stroke < 0) { + $stroke = 0; + } + if ($fill === true) { + if ($stroke > 0) { + if ($clip === true) { + // Fill, then stroke text and add to path for clipping + $textrendermode = 6; + } else { + // Fill, then stroke text + $textrendermode = 2; + } + $textstrokewidth = $stroke; + } else { + if ($clip === true) { + // Fill text and add to path for clipping + $textrendermode = 4; + } else { + // Fill text + $textrendermode = 0; + } + } + } else { + if ($stroke > 0) { + if ($clip === true) { + // Stroke text and add to path for clipping + $textrendermode = 5; + } else { + // Stroke text + $textrendermode = 1; + } + $textstrokewidth = $stroke; + } else { + if ($clip === true) { + // Add text to path for clipping + $textrendermode = 7; + } else { + // Neither fill nor stroke text (invisible) + $textrendermode = 3; + } + } + } + $this->textrendermode = $textrendermode; + $this->textstrokewidth = $stroke * $this->k; + } + + /** + * Returns an array of chars containing soft hyphens. + * @param array $word array of chars + * @param array $patterns Array of hypenation patterns. + * @param array $dictionary Array of words to be returned without applying the hyphenation algoritm. + * @param int $leftmin Minimum number of character to leave on the left of the word without applying the hyphens. + * @param int $rightmin Minimum number of character to leave on the right of the word without applying the hyphens. + * @param int $charmin Minimum word lenght to apply the hyphenation algoritm. + * @param int $charmax Maximum lenght of broken piece of word. + * @return array text with soft hyphens + * @author Nicola Asuni + * @since 4.9.012 (2010-04-12) + * @access protected + */ + protected function hyphenateWord($word, $patterns, $dictionary=array(), $leftmin=1, $rightmin=2, $charmin=1, $charmax=8) { + $hyphenword = array(); // hyphens positions + $numchars = count($word); + if ($numchars <= $charmin) { + return $word; + } + $word_string = $this->UTF8ArrSubString($word); + // some words will be returned as-is + $pattern = '/^([a-zA-Z0-9_\.\-]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/'; + if (preg_match($pattern, $word_string) > 0) { + // email + return $word; + } + $pattern = '/(([a-zA-Z0-9\-]+\.)?)((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/'; + if (preg_match($pattern, $word_string) > 0) { + // URL + return $word; + } + if (isset($dictionary[$word_string])) { + return $this->UTF8StringToArray($dictionary[$word_string]); + } + // suround word with '_' characters + $tmpword = array_merge(array(95), $word, array(95)); + $tmpnumchars = $numchars + 2; + $maxpos = $tmpnumchars - $charmin; + for ($pos = 0; $pos < $maxpos; ++$pos) { + $imax = min(($tmpnumchars - $pos), $charmax); + for ($i = $charmin; $i <= $imax; ++$i) { + $subword = strtolower($this->UTF8ArrSubString($tmpword, $pos, $pos + $i)); + if (isset($patterns[$subword])) { + $pattern = $this->UTF8StringToArray($patterns[$subword]); + $pattern_length = count($pattern); + $digits = 1; + for ($j = 0; $j < $pattern_length; ++$j) { + // check if $pattern[$j] is a number + if (($pattern[$j] >= 48) AND ($pattern[$j] <= 57)) { + if ($j == 0) { + $zero = $pos - 1; + } else { + $zero = $pos + $j - $digits; + } + if (!isset($hyphenword[$zero]) OR ($hyphenword[$zero] != $pattern[$j])) { + $hyphenword[$zero] = $this->unichr($pattern[$j]); + } + ++$digits; + } + } + } + } + } + $inserted = 0; + $maxpos = $numchars - $rightmin; + for($i = $leftmin; $i <= $maxpos; ++$i) { + if(isset($hyphenword[$i]) AND (($hyphenword[$i] % 2) != 0)) { + // 173 = soft hyphen character + array_splice($word, $i + $inserted, 0, 173); + ++$inserted; + } + } + return $word; + } + + /** + * Returns an array of hyphenation patterns. + * @param string $file TEX file containing hypenation patterns. TEX pattrns can be downloaded from http://www.ctan.org/tex-archive/language/hyph-utf8/tex/generic/hyph-utf8/patterns/ + * @return array of hyphenation patterns + * @author Nicola Asuni + * @since 4.9.012 (2010-04-12) + * @access public + */ + public function getHyphenPatternsFromTEX($file) { + // TEX patterns are available at: + // http://www.ctan.org/tex-archive/language/hyph-utf8/tex/generic/hyph-utf8/patterns/ + $data = file_get_contents($file); + $patterns = array(); + // remove comments + $data = preg_replace('/\%[^\n]*/', '', $data); + // extract the patterns part + preg_match('/\\\\patterns\{([^\}]*)\}/i', $data, $matches); + $data = trim(substr($matches[0], 10, -1)); + // extract each pattern + $patterns_array = preg_split('/[\s]+/', $data); + // create new language array of patterns + $patterns = array(); + foreach($patterns_array as $val) { + if (!$this->empty_string($val)) { + $val = trim($val); + $val = str_replace('\'', '\\\'', $val); + $key = preg_replace('/[0-9]+/', '', $val); + $patterns[$key] = $val; + } + } + return $patterns; + } + + /** + * Returns text with soft hyphens. + * @param string $text text to process + * @param mixed $patterns Array of hypenation patterns or a TEX file containing hypenation patterns. TEX patterns can be downloaded from http://www.ctan.org/tex-archive/language/hyph-utf8/tex/generic/hyph-utf8/patterns/ + * @param array $dictionary Array of words to be returned without applying the hyphenation algoritm. + * @param int $leftmin Minimum number of character to leave on the left of the word without applying the hyphens. + * @param int $rightmin Minimum number of character to leave on the right of the word without applying the hyphens. + * @param int $charmin Minimum word lenght to apply the hyphenation algoritm. + * @param int $charmax Maximum lenght of broken piece of word. + * @return array text with soft hyphens + * @author Nicola Asuni + * @since 4.9.012 (2010-04-12) + * @access public + */ + public function hyphenateText($text, $patterns, $dictionary=array(), $leftmin=1, $rightmin=2, $charmin=1, $charmax=8) { + global $unicode; + $text = $this->unhtmlentities($text); + $word = array(); // last word + $txtarr = array(); // text to be returned + $intag = false; // true if we are inside an HTML tag + if (!is_array($patterns)) { + $patterns = $this->getHyphenPatternsFromTEX($patterns); + } + // get array of characters + $unichars = $this->UTF8StringToArray($text); + // for each char + foreach ($unichars as $char) { + if ((!$intag) AND $unicode[$char] == 'L') { + // letter character + $word[] = $char; + } else { + // other type of character + if (!$this->empty_string($word)) { + // hypenate the word + $txtarr = array_merge($txtarr, $this->hyphenateWord($word, $patterns, $dictionary, $leftmin, $rightmin, $charmin, $charmax)); + $word = array(); + } + $txtarr[] = $char; + if (chr($char) == '<') { + // we are inside an HTML tag + $intag = true; + } elseif ($intag AND (chr($char) == '>')) { + // end of HTML tag + $intag = false; + } + } + } + if (!$this->empty_string($word)) { + // hypenate the word + $txtarr = array_merge($txtarr, $this->hyphenateWord($word, $patterns, $dictionary, $leftmin, $rightmin, $charmin, $charmax)); + } + // convert char array to string and return + return $this->UTF8ArrSubString($txtarr); + } + + /** + * Enable/disable rasterization of SVG images using ImageMagick library. + * @param boolean $mode if true enable rasterization, false otherwise. + * @access public + * @since 5.0.000 (2010-04-27) + */ + public function setRasterizeVectorImages($mode) { + $this->rasterize_vector_images = $mode; + } + + /** + * Get the Path-Painting Operators. + * @param string $style Style of rendering. Possible values are: + * <ul> + * <li>S or D: Stroke the path.</li> + * <li>s or d: Close and stroke the path.</li> + * <li>f or F: Fill the path, using the nonzero winding number rule to determine the region to fill.</li> + * <li>f* or F*: Fill the path, using the even-odd rule to determine the region to fill.</li> + * <li>B or FD or DF: Fill and then stroke the path, using the nonzero winding number rule to determine the region to fill.</li> + * <li>B* or F*D or DF*: Fill and then stroke the path, using the even-odd rule to determine the region to fill.</li> + * <li>b or fd or df: Close, fill, and then stroke the path, using the nonzero winding number rule to determine the region to fill.</li> + * <li>b or f*d or df*: Close, fill, and then stroke the path, using the even-odd rule to determine the region to fill.</li> + * <li>CNZ: Clipping mode using the even-odd rule to determine which regions lie inside the clipping path.</li> + * <li>CEO: Clipping mode using the nonzero winding number rule to determine which regions lie inside the clipping path</li> + * <li>n: End the path object without filling or stroking it.</li> + * </ul> + * @param string $default default style + * @param boolean $mode if true enable rasterization, false otherwise. + * @author Nicola Asuni + * @access protected + * @since 5.0.000 (2010-04-30) + */ + protected function getPathPaintOperator($style, $default='S') { + $op = ''; + switch($style) { + case 'S': + case 'D': { + $op = 'S'; + break; + } + case 's': + case 'd': { + $op = 's'; + break; + } + case 'f': + case 'F': { + $op = 'f'; + break; + } + case 'f*': + case 'F*': { + $op = 'f*'; + break; + } + case 'B': + case 'FD': + case 'DF': { + $op = 'B'; + break; + } + case 'B*': + case 'F*D': + case 'DF*': { + $op = 'B*'; + break; + } + case 'b': + case 'fd': + case 'df': { + $op = 'b'; + break; + } + case 'b*': + case 'f*d': + case 'df*': { + $op = 'b*'; + break; + } + case 'CNZ': { + $op = 'W n'; + break; + } + case 'CEO': { + $op = 'W* n'; + break; + } + case 'n': { + $op = 'n'; + break; + } + default: { + if (!empty($default)) { + $op = $this->getPathPaintOperator($default, ''); + } else { + $op = ''; + } + } + } + return $op; + } + + // -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- + // SVG METHODS + // -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- + + /** + * Embedd a Scalable Vector Graphics (SVG) image. + * NOTE: SVG standard is not yet fully implemented, use the setRasterizeVectorImages() method to enable/disable rasterization of SVG images using ImageMagick library. + * @param string $file Name of the SVG file. + * @param float $x Abscissa of the upper-left corner. + * @param float $y Ordinate of the upper-left corner. + * @param float $w Width of the image in the page. If not specified or equal to zero, it is automatically calculated. + * @param float $h Height of the image in the page. If not specified or equal to zero, it is automatically calculated. + * @param mixed $link URL or identifier returned by AddLink(). + * @param string $align Indicates the alignment of the pointer next to image insertion relative to image height. The value can be:<ul><li>T: top-right for LTR or top-left for RTL</li><li>M: middle-right for LTR or middle-left for RTL</li><li>B: bottom-right for LTR or bottom-left for RTL</li><li>N: next line</li></ul> + * @param string $palign Allows to center or align the image on the current line. Possible values are:<ul><li>L : left align</li><li>C : center</li><li>R : right align</li><li>'' : empty string : left for LTR or right for RTL</li></ul> + * @param mixed $border Indicates if borders must be drawn around the image. The value can be either a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul>or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> + * @param boolean $fitonpage if true the image is resized to not exceed page dimensions. + * @author Nicola Asuni + * @since 5.0.000 (2010-05-02) + * @access public + */ + public function ImageSVG($file, $x='', $y='', $w=0, $h=0, $link='', $align='', $palign='', $border=0, $fitonpage=false) { + if ($this->rasterize_vector_images) { + // convert SVG to raster image using GD or ImageMagick libraries + return $this->Image($file, $x, $y, $w, $h, 'SVG', $link, $align, true, 300, $palign, false, false, $border, false, false, false); + } + $this->svgdir = dirname($file); + $svgdata = file_get_contents($file); + if ($svgdata === false) { + $this->Error('SVG file not found: '.$file); + } + if ($x === '') { + $x = $this->x; + } + if ($y === '') { + $y = $this->y; + } + $k = $this->k; + $ox = 0; + $oy = 0; + $ow = $w; + $oh = $h; + $aspect_ratio_align = 'xMidYMid'; + $aspect_ratio_ms = 'meet'; + $regs = array(); + // get original image width and height + preg_match('/<svg([^\>]*)>/si', $svgdata, $regs); + if (isset($regs[1]) AND !empty($regs[1])) { + $tmp = array(); + if (preg_match('/[\s]+x[\s]*=[\s]*"([^"]*)"/si', $regs[1], $tmp)) { + $ox = $this->getHTMLUnitToUnits($tmp[1], 0, $this->svgunit, false); + } + $tmp = array(); + if (preg_match('/[\s]+y[\s]*=[\s]*"([^"]*)"/si', $regs[1], $tmp)) { + $oy = $this->getHTMLUnitToUnits($tmp[1], 0, $this->svgunit, false); + } + $tmp = array(); + if (preg_match('/[\s]+width[\s]*=[\s]*"([^"]*)"/si', $regs[1], $tmp)) { + $ow = $this->getHTMLUnitToUnits($tmp[1], 1, $this->svgunit, false); + } + $tmp = array(); + if (preg_match('/[\s]+height[\s]*=[\s]*"([^"]*)"/si', $regs[1], $tmp)) { + $oh = $this->getHTMLUnitToUnits($tmp[1], 1, $this->svgunit, false); + } + $tmp = array(); + $view_box = array(); + if (preg_match('/[\s]+viewBox[\s]*=[\s]*"[\s]*([0-9\.\-]+)[\s]+([0-9\.\-]+)[\s]+([0-9\.]+)[\s]+([0-9\.]+)[\s]*"/si', $regs[1], $tmp)) { + if (count($tmp) == 5) { + array_shift($tmp); + foreach ($tmp as $key => $val) { + $view_box[$key] = $this->getHTMLUnitToUnits($val, 0, $this->svgunit, false); + } + $ox = $view_box[0]; + $oy = $view_box[1]; + } + // get aspect ratio + $tmp = array(); + if (preg_match('/[\s]+preserveAspectRatio[\s]*=[\s]*"([^"]*)"/si', $regs[1], $tmp)) { + $aspect_ratio = preg_split("/[\s]+/si", $tmp[1]); + switch (count($aspect_ratio)) { + case 3: { + $aspect_ratio_align = $aspect_ratio[1]; + $aspect_ratio_ms = $aspect_ratio[2]; + break; + } + case 2: { + $aspect_ratio_align = $aspect_ratio[0]; + $aspect_ratio_ms = $aspect_ratio[1]; + break; + } + case 1: { + $aspect_ratio_align = $aspect_ratio[0]; + $aspect_ratio_ms = 'meet'; + break; + } + } + } + } + } + // calculate image width and height on document + if (($w <= 0) AND ($h <= 0)) { + // convert image size to document unit + $w = $ow; + $h = $oh; + } elseif ($w <= 0) { + $w = $h * $ow / $oh; + } elseif ($h <= 0) { + $h = $w * $oh / $ow; + } + // Check whether we need a new page first as this does not fit + $prev_x = $this->x; + if ($this->checkPageBreak($h, $y)) { + $y = $this->y; + if ($this->rtl) { + $x += ($prev_x - $this->x); + } else { + $x += ($this->x - $prev_x); + } + } + // resize image to be contained on a single page + if ($fitonpage) { + $ratio_wh = $w / $h; + if (($y + $h) > $this->PageBreakTrigger) { + $h = $this->PageBreakTrigger - $y; + $w = $h * $ratio_wh; + } + if (($x + $w) > ($this->w - $this->rMargin)) { + $w = $this->w - $this->rMargin - $x; + $h = $w / $ratio_wh; + } + } + // set alignment + $this->img_rb_y = $y + $h; + // set alignment + if ($this->rtl) { + if ($palign == 'L') { + $ximg = $this->lMargin; + } elseif ($palign == 'C') { + $ximg = ($this->w - $w) / 2; + } elseif ($palign == 'R') { + $ximg = $this->w - $this->rMargin - $w; + } else { + $ximg = $this->w - $x - $w; + } + $this->img_rb_x = $ximg; + } else { + if ($palign == 'L') { + $ximg = $this->lMargin; + } elseif ($palign == 'C') { + $ximg = ($this->w - $w) / 2; + } elseif ($palign == 'R') { + $ximg = $this->w - $this->rMargin - $w; + } else { + $ximg = $x; + } + $this->img_rb_x = $ximg + $w; + } + // store current graphic vars + $gvars = $this->getGraphicVars(); + // store SVG position and scale factors + $svgoffset_x = ($ximg - $ox) * $this->k; + $svgoffset_y = -($y - $oy) * $this->k; + if (isset($view_box[2]) AND ($view_box[2] > 0) AND ($view_box[3] > 0)) { + $ow = $view_box[2]; + $oh = $view_box[3]; + } + $svgscale_x = $w / $ow; + $svgscale_y = $h / $oh; + // scaling and alignment + if ($aspect_ratio_align != 'none') { + // store current scaling values + $svgscale_old_x = $svgscale_x; + $svgscale_old_y = $svgscale_y; + // force uniform scaling + if ($aspect_ratio_ms == 'slice') { + // the entire viewport is covered by the viewBox + if ($svgscale_x > $svgscale_y) { + $svgscale_y = $svgscale_x; + } elseif ($svgscale_x < $svgscale_y) { + $svgscale_x = $svgscale_y; + } + } else { // meet + // the entire viewBox is visible within the viewport + if ($svgscale_x < $svgscale_y) { + $svgscale_y = $svgscale_x; + } elseif ($svgscale_x > $svgscale_y) { + $svgscale_x = $svgscale_y; + } + } + // correct X alignment + switch (substr($aspect_ratio_align, 1, 3)) { + case 'Min': { + // do nothing + break; + } + case 'Max': { + $svgoffset_x += (($w * $this->k) - ($ow * $this->k * $svgscale_x)); + break; + } + default: + case 'Mid': { + $svgoffset_x += ((($w * $this->k) - ($ow * $this->k * $svgscale_x)) / 2); + break; + } + } + // correct Y alignment + switch (substr($aspect_ratio_align, 5)) { + case 'Min': { + // do nothing + break; + } + case 'Max': { + $svgoffset_y -= (($h * $this->k) - ($oh * $this->k * $svgscale_y)); + break; + } + default: + case 'Mid': { + $svgoffset_y -= ((($h * $this->k) - ($oh * $this->k * $svgscale_y)) / 2); + break; + } + } + } + // save the current graphic state + $this->_out('q'.$this->epsmarker); + // set initial clipping mask + $this->Rect($x, $y, $w, $h, 'CNZ', array(), array()); + // scale and translate + $e = $ox * $this->k * (1 - $svgscale_x); + $f = ($this->h - $oy) * $this->k * (1 - $svgscale_y); + $this->_out(sprintf('%.3F %.3F %.3F %.3F %.3F %.3F cm', $svgscale_x, 0, 0, $svgscale_y, $e + $svgoffset_x, $f + $svgoffset_y)); + // creates a new XML parser to be used by the other XML functions + $this->parser = xml_parser_create('UTF-8'); + // the following function allows to use parser inside object + xml_set_object($this->parser, $this); + // disable case-folding for this XML parser + xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0); + // sets the element handler functions for the XML parser + xml_set_element_handler($this->parser, 'startSVGElementHandler', 'endSVGElementHandler'); + // sets the character data handler function for the XML parser + xml_set_character_data_handler($this->parser, 'segSVGContentHandler'); + // start parsing an XML document + if(!xml_parse($this->parser, $svgdata)) { + $error_message = sprintf("SVG Error: %s at line %d", xml_error_string(xml_get_error_code($this->parser)), xml_get_current_line_number($this->parser)); + $this->Error($error_message); + } + // free this XML parser + xml_parser_free($this->parser); + // restore previous graphic state + $this->_out($this->epsmarker.'Q'); + // restore graphic vars + $this->setGraphicVars($gvars); + if (!empty($border)) { + $bx = $x; + $by = $y; + $this->x = $ximg; + if ($this->rtl) { + $this->x += $w; + } + $this->y = $y; + $this->Cell($w, $h, '', $border, 0, '', 0, '', 0); + $this->x = $bx; + $this->y = $by; + } + if ($link) { + $this->Link($ximg, $y, $w, $h, $link, 0); + } + // set pointer to align the successive text/objects + switch($align) { + case 'T':{ + $this->y = $y; + $this->x = $this->img_rb_x; + break; + } + case 'M':{ + $this->y = $y + round($h/2); + $this->x = $this->img_rb_x; + break; + } + case 'B':{ + $this->y = $this->img_rb_y; + $this->x = $this->img_rb_x; + break; + } + case 'N':{ + $this->SetY($this->img_rb_y); + break; + } + default:{ + break; + } + } + $this->endlinex = $this->img_rb_x; + } + + /** + * Get the tranformation matrix from SVG transform attribute + * @param string transformation + * @return array of transformations + * @author Nicola Asuni + * @since 5.0.000 (2010-05-02) + * @access protected + */ + protected function getSVGTransformMatrix($attribute) { + // identity matrix + $tm = array(1, 0, 0, 1, 0, 0); + $continue = true; + while ($continue) { + $continue = false; + // matrix + $regs = array(); + if (preg_match('/matrix\(([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)\)/si', $attribute, $regs)) { + $attribute = str_replace($regs[0], '', $attribute); + $continue = true; + $a = $regs[1]; + $b = $regs[2]; + $c = $regs[3]; + $d = $regs[4]; + $e = $regs[5]; + $f = $regs[6]; + $tm = $this->getTransformationMatrixProduct($tm, array($a, $b, $c, $d, $e, $f)); + } + // translate x + $regs = array(); + if (preg_match('/translate\(([a-z0-9\-\.]+)\)/si', $attribute, $regs)) { + $attribute = str_replace($regs[0], 'translate('.$regs[1].',0)', $attribute); + $continue = true; + } + // translate x,y + $regs = array(); + if (preg_match('/translate\(([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)\)/si', $attribute, $regs)) { + $attribute = str_replace($regs[0], '', $attribute); + $continue = true; + $e = $regs[1]; + $f = $regs[2]; + $tm = $this->getTransformationMatrixProduct($tm, array(1, 0, 0, 1, $e, $f)); + } + // scale x + $regs = array(); + if (preg_match('/scale\(([a-z0-9\-\.]+)\)/si', $attribute, $regs)) { + $attribute = str_replace($regs[0], 'scale('.$regs[1].','.$regs[1].')', $attribute); + $continue = true; + } + // scale x,y + $regs = array(); + if (preg_match('/scale\(([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)\)/si', $attribute, $regs)) { + $attribute = str_replace($regs[0], '', $attribute); + $continue = true; + $a = $regs[1]; + if (isset($regs[2]) AND (strlen(trim($regs[2])) > 0)) { + $d = $regs[2]; + } else { + $d = $a; + } + $tm = $this->getTransformationMatrixProduct($tm, array($a, 0, 0, $d, 0, 0)); + } + // rotate ang + $regs = array(); + if (preg_match('/rotate\(([a-z0-9\-\.]+)\)/si', $attribute, $regs)) { + $attribute = str_replace($regs[0], 'rotate('.$regs[1].',0,0)', $attribute); + $continue = true; + } + // rotate ang,x,y + $regs = array(); + if (preg_match('/rotate\(([0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)\)/si', $attribute, $regs)) { + $attribute = str_replace($regs[0], '', $attribute); + $continue = true; + $ang = deg2rad($regs[1]); + $a = cos($ang); + $b = sin($ang); + $c = -$b; + $d = $a; + $x = $regs[2]; + $y = $regs[3]; + $e = ($x * (1 - $a)) - ($y * $c); + $f = ($y * (1 - $d)) - ($x * $b); + $tm = $this->getTransformationMatrixProduct($tm, array($a, $b, $c, $d, $e, $f)); + } + // skewX + $regs = array(); + if (preg_match('/skewX\(([0-9\-\.]+)\)/si', $attribute, $regs)) { + $attribute = str_replace($regs[0], '', $attribute); + $continue = true; + $c = tan(deg2rad($regs[1])); + $tm = $this->getTransformationMatrixProduct($tm, array(1, 0, $c, 1, 0, 0)); + } + // skewY + $regs = array(); + if (preg_match('/skewY\(([0-9\-\.]+)\)/si', $attribute, $regs)) { + $attribute = str_replace($regs[0], '', $attribute); + $continue = true; + $b = tan(deg2rad($regs[1])); + $tm = $this->getTransformationMatrixProduct($tm, array(1, $b, 0, 1, 0, 0)); + } + } + return $tm; + } + + /** + * Get the product of two SVG tranformation matrices + * @param array $ta first SVG tranformation matrix + * @param array $tb second SVG tranformation matrix + * @return transformation array + * @author Nicola Asuni + * @since 5.0.000 (2010-05-02) + * @access protected + */ + protected function getTransformationMatrixProduct($ta, $tb) { + $tm = array(); + $tm[0] = ($ta[0] * $tb[0]) + ($ta[2] * $tb[1]); + $tm[1] = ($ta[1] * $tb[0]) + ($ta[3] * $tb[1]); + $tm[2] = ($ta[0] * $tb[2]) + ($ta[2] * $tb[3]); + $tm[3] = ($ta[1] * $tb[2]) + ($ta[3] * $tb[3]); + $tm[4] = ($ta[0] * $tb[4]) + ($ta[2] * $tb[5]) + $ta[4]; + $tm[5] = ($ta[1] * $tb[4]) + ($ta[3] * $tb[5]) + $ta[5]; + return $tm; + } + + /** + * Convert SVG transformation matrix to PDF. + * @param array $tm original SVG transformation matrix + * @return array transformation matrix + * @access protected + * @since 5.0.000 (2010-05-02) + */ + protected function convertSVGtMatrix($tm) { + $a = $tm[0]; + $b = -$tm[1]; + $c = -$tm[2]; + $d = $tm[3]; + $e = $this->getHTMLUnitToUnits($tm[4], 1, $this->svgunit, false) * $this->k; + $f = -$this->getHTMLUnitToUnits($tm[5], 1, $this->svgunit, false) * $this->k; + $x = 0; + $y = $this->h * $this->k; + $e = ($x * (1 - $a)) - ($y * $c) + $e; + $f = ($y * (1 - $d)) - ($x * $b) + $f; + return array($a, $b, $c, $d, $e, $f); + } + + /** + * Apply SVG graphic transformation matrix. + * @param array $tm original SVG transformation matrix + * @access protected + * @since 5.0.000 (2010-05-02) + */ + protected function SVGTransform($tm) { + $this->Transform($this->convertSVGtMatrix($tm)); + } + + /** + * Apply the requested SVG styles (*** TO BE COMPLETED ***) + * @param array $svgstyle array of SVG styles to apply + * @param array $prevsvgstyle array of previous SVG style + * @param int $x X origin of the bounding box + * @param int $y Y origin of the bounding box + * @param int $w width of the bounding box + * @param int $h height of the bounding box + * @param string $clip_function clip function + * @param array $clip_params array of parameters for clipping function + * @return object style + * @author Nicola Asuni + * @since 5.0.000 (2010-05-02) + * @access protected + */ + protected function setSVGStyles($svgstyle, $prevsvgstyle, $x=0, $y=0, $w=1, $h=1, $clip_function='', $clip_params=array()) { + $objstyle = ''; + if(!isset($svgstyle['opacity'])) { + return $objstyle; + } + // clip-path + $regs = array(); + if (preg_match('/url\([\s]*\#([^\)]*)\)/si', $svgstyle['clip-path'], $regs)) { + $clip_path = $this->svgclippaths[$regs[1]]; + foreach ($clip_path as $cp) { + $this->startSVGElementHandler('clip-path', $cp['name'], $cp['attribs']); + } + } + //$this->SetAlpha(1); // reset alpha + // opacity + if ($svgstyle['opacity'] != 1) { + $this->SetAlpha($svgstyle['opacity']); + } + // color + $fill_color = $this->convertHTMLColorToDec($svgstyle['color']); + $this->SetFillColorArray($fill_color); + // text color + $text_color = $this->convertHTMLColorToDec($svgstyle['text-color']); + $this->SetTextColorArray($text_color); + // clip + if (preg_match('/rect\(([a-z0-9\-\.]*)[\s]*([a-z0-9\-\.]*)[\s]*([a-z0-9\-\.]*)[\s]*([a-z0-9\-\.]*)\)/si', $svgstyle['clip'], $regs)) { + $top = (isset($regs[1])?$this->getHTMLUnitToUnits($regs[1], 0, $this->svgunit, false):0); + $right = (isset($regs[2])?$this->getHTMLUnitToUnits($regs[2], 0, $this->svgunit, false):0); + $bottom = (isset($regs[3])?$this->getHTMLUnitToUnits($regs[3], 0, $this->svgunit, false):0); + $left = (isset($regs[4])?$this->getHTMLUnitToUnits($regs[4], 0, $this->svgunit, false):0); + $cx = $x + $left; + $cy = $y + $top; + $cw = $w - $left - $right; + $ch = $h - $top - $bottom; + if ($svgstyle['clip-rule'] == 'evenodd') { + $clip_rule = 'CNZ'; + } else { + $clip_rule = 'CEO'; + } + $this->Rect($cx, $cy, $cw, $ch, $clip_rule, array(), array()); + } + // fill + $regs = array(); + if (preg_match('/url\([\s]*\#([^\)]*)\)/si', $svgstyle['fill'], $regs)) { + // gradient + $gradient = $this->svggradients[$regs[1]]; + if (isset($gradient['xref'])) { + // reference to another gradient definition + $newgradient = $this->svggradients[$gradient['xref']]; + $newgradient['coords'] = $gradient['coords']; + $newgradient['mode'] = $gradient['mode']; + $newgradient['gradientUnits'] = $gradient['gradientUnits']; + if (isset($gradient['gradientTransform'])) { + $newgradient['gradientTransform'] = $gradient['gradientTransform']; + } + $gradient = $newgradient; + } + //save current Graphic State + $this->_out('q'); + //set clipping area + if (!empty($clip_function) AND method_exists($this, $clip_function)) { + $bbox = call_user_func_array(array($this, $clip_function), $clip_params); + if (is_array($bbox) AND (count($bbox) == 4)) { + list($x, $y, $w, $h) = $bbox; + } + } + if ($gradient['mode'] == 'measure') { + if (isset($gradient['gradientTransform']) AND !empty($gradient['gradientTransform'])) { + $gtm = $gradient['gradientTransform']; + // apply transformation matrix + $xa = ($gtm[0] * $gradient['coords'][0]) + ($gtm[2] * $gradient['coords'][1]) + $gtm[4]; + $ya = ($gtm[1] * $gradient['coords'][0]) + ($gtm[3] * $gradient['coords'][1]) + $gtm[5]; + $xb = ($gtm[0] * $gradient['coords'][2]) + ($gtm[2] * $gradient['coords'][3]) + $gtm[4]; + $yb = ($gtm[1] * $gradient['coords'][2]) + ($gtm[3] * $gradient['coords'][3]) + $gtm[5]; + if (isset($gradient['coords'][4])) { + $gradient['coords'][4] = sqrt(pow(($gtm[0] * $gradient['coords'][4]), 2) + pow(($gtm[1] * $gradient['coords'][4]), 2)); + } + $gradient['coords'][0] = $xa; + $gradient['coords'][1] = $ya; + $gradient['coords'][2] = $xb; + $gradient['coords'][3] = $yb; + + } + // convert SVG coordinates to user units + $gradient['coords'][0] = $this->getHTMLUnitToUnits($gradient['coords'][0], 0, $this->svgunit, false); + $gradient['coords'][1] = $this->getHTMLUnitToUnits($gradient['coords'][1], 0, $this->svgunit, false); + $gradient['coords'][2] = $this->getHTMLUnitToUnits($gradient['coords'][2], 0, $this->svgunit, false); + $gradient['coords'][3] = $this->getHTMLUnitToUnits($gradient['coords'][3], 0, $this->svgunit, false); + if (isset($gradient['coords'][4])) { + $gradient['coords'][4] = $this->getHTMLUnitToUnits($gradient['coords'][4], 0, $this->svgunit, false); + } + // shift units + if ($gradient['gradientUnits'] == 'objectBoundingBox') { + // convert to SVG coordinate system + $gradient['coords'][0] += $x; + $gradient['coords'][1] += $y; + $gradient['coords'][2] += $x; + $gradient['coords'][3] += $y; + } + // calculate percentages + $gradient['coords'][0] = ($gradient['coords'][0] - $x) / $w; + $gradient['coords'][1] = ($gradient['coords'][1] - $y) / $h; + $gradient['coords'][2] = ($gradient['coords'][2] - $x) / $w; + $gradient['coords'][3] = ($gradient['coords'][3] - $y) / $h; + if (isset($gradient['coords'][4])) { + $gradient['coords'][4] /= $w; + } + // fix values + foreach($gradient['coords'] as $key => $val) { + if ($val < 0) { + $gradient['coords'][$key] = 0; + } elseif ($val > 1) { + $gradient['coords'][$key] = 1; + } + } + if (($gradient['type'] == 2) AND ($gradient['coords'][0] == $gradient['coords'][2]) AND ($gradient['coords'][1] == $gradient['coords'][3])) { + // single color (no shading) + $gradient['coords'][0] = 1; + $gradient['coords'][1] = 0; + $gradient['coords'][2] = 0.999; + $gradient['coords'][3] = 0; + } + } + // swap Y coordinates + $tmp = $gradient['coords'][1]; + $gradient['coords'][1] = $gradient['coords'][3]; + $gradient['coords'][3] = $tmp; + // set transformation map for gradient + if (($gradient['type'] == 3) AND ($gradient['mode'] == 'measure')) { + // gradient is always circular + $cy = $this->h - $y - ($gradient['coords'][1] * ($w + $h)); + $this->_out(sprintf('%.3F 0 0 %.3F %.3F %.3F cm', $w*$this->k, $w*$this->k, $x*$this->k, $cy*$this->k)); + } else { + $this->_out(sprintf('%.3F 0 0 %.3F %.3F %.3F cm', $w*$this->k, $h*$this->k, $x*$this->k, ($this->h-($y+$h))*$this->k)); + } + if (count($gradient['stops']) > 1) { + $this->Gradient($gradient['type'], $gradient['coords'], $gradient['stops'], array(), false); + } + } elseif ($svgstyle['fill'] != 'none') { + $fill_color = $this->convertHTMLColorToDec($svgstyle['fill']); + if ($svgstyle['fill-opacity'] != 1) { + $this->SetAlpha($svgstyle['fill-opacity']); + } + $this->SetFillColorArray($fill_color); + if ($svgstyle['fill-rule'] == 'evenodd') { + $objstyle .= 'F*'; + } else { + $objstyle .= 'F'; + } + } + // stroke + if ($svgstyle['stroke'] != 'none') { + $stroke_style = array( + 'color' => $this->convertHTMLColorToDec($svgstyle['stroke']), + 'width' => $this->getHTMLUnitToUnits($svgstyle['stroke-width'], 0, $this->svgunit, false), + 'cap' => $svgstyle['stroke-linecap'], + 'join' => $svgstyle['stroke-linejoin'] + ); + if (isset($svgstyle['stroke-dasharray']) AND !empty($svgstyle['stroke-dasharray']) AND ($svgstyle['stroke-dasharray'] != 'none')) { + $stroke_style['dash'] = $svgstyle['stroke-dasharray']; + } + $this->SetLineStyle($stroke_style); + $objstyle .= 'D'; + } + // font + $regs = array(); + if (!empty($svgstyle['font'])) { + if (preg_match('/font-family[\s]*:[\s]*([^\s\;\"]*)/si', $svgstyle['font'], $regs)) { + $font_family = trim($regs[1]); + } else { + $font_family = $svgstyle['font-family']; + } + if (preg_match('/font-size[\s]*:[\s]*([^\s\;\"]*)/si', $svgstyle['font'], $regs)) { + $font_size = trim($regs[1]); + } else { + $font_size = $svgstyle['font-size']; + } + if (preg_match('/font-style[\s]*:[\s]*([^\s\;\"]*)/si', $svgstyle['font'], $regs)) { + $font_style = trim($regs[1]); + } else { + $font_style = $svgstyle['font-style']; + } + if (preg_match('/font-weight[\s]*:[\s]*([^\s\;\"]*)/si', $svgstyle['font'], $regs)) { + $font_weight = trim($regs[1]); + } else { + $font_weight = $svgstyle['font-weight']; + } + } else { + $font_family = $svgstyle['font-family']; + $font_size = $svgstyle['font-size']; + $font_style = $svgstyle['font-style']; + $font_weight = $svgstyle['font-weight']; + } + $font_size = $this->getHTMLUnitToUnits($font_size, $prevsvgstyle['font-size'], $this->svgunit, false) * $this->k; + switch ($font_style) { + case 'italic': { + $font_style = 'I'; + break; + } + case 'oblique': { + $font_style = 'I'; + break; + } + default: + case 'normal': { + $font_style = ''; + break; + } + } + switch ($font_weight) { + case 'bold': + case 'bolder': { + $font_style .= 'B'; + break; + } + } + switch ($svgstyle['text-decoration']) { + case 'underline': { + $font_style .= 'U'; + break; + } + case 'overline': { + $font_style .= 'O'; + break; + } + case 'line-through': { + $font_style .= 'D'; + break; + } + default: + case 'none': { + break; + } + } + $this->SetFont($font_family, $font_style, $font_size); + return $objstyle; + } + + /** + * Draws an SVG path + * @param string $d attribute d of the path SVG element + * @param string $style Style of rendering. Possible values are: + * <ul> + * <li>D or empty string: Draw (default).</li> + * <li>F: Fill.</li> + * <li>F*: Fill using the even-odd rule to determine which regions lie inside the clipping path.</li> + * <li>DF or FD: Draw and fill.</li> + * <li>DF* or FD*: Draw and fill using the even-odd rule to determine which regions lie inside the clipping path.</li> + * <li>CNZ: Clipping mode (using the even-odd rule to determine which regions lie inside the clipping path).</li> + * <li>CEO: Clipping mode (using the nonzero winding number rule to determine which regions lie inside the clipping path).</li> + * </ul> + * @return array of container box measures (x, y, w, h) + * @author Nicola Asuni + * @since 5.0.000 (2010-05-02) + * @access protected + */ + protected function SVGPath($d, $style='') { + // set fill/stroke style + $op = $this->getPathPaintOperator($style, ''); + if (empty($op)) { + return; + } + $paths = array(); + preg_match_all('/([a-zA-Z])[\s]*([^a-zA-Z\"]*)/si', $d, $paths, PREG_SET_ORDER); + $x = 0; + $y = 0; + $x1 = 0; + $y1 = 0; + $x2 = 0; + $y2 = 0; + $xmin = 2147483647; + $xmax = 0; + $ymin = 2147483647; + $ymax = 0; + $relcoord = false; + // draw curve pieces + foreach ($paths as $key => $val) { + // get curve type + $cmd = trim($val[1]); + if (strtolower($cmd) == $cmd) { + // use relative coordinated instead of absolute + $relcoord = true; + $xoffset = $x; + $yoffset = $y; + } else { + $relcoord = false; + $xoffset = 0; + $yoffset = 0; + } + $params = array(); + if (isset($val[2])) { + // get curve parameters + $rawparams = preg_split('/([\,\s]+)/si', trim($val[2])); + $params = array(); + foreach ($rawparams as $ck => $cp) { + $params[$ck] = $this->getHTMLUnitToUnits($cp, 0, $this->svgunit, false); + } + } + switch (strtoupper($cmd)) { + case 'M': { // moveto + foreach ($params as $ck => $cp) { + if (($ck % 2) == 0) { + $x = $cp + $xoffset; + } else { + $y = $cp + $yoffset; + if ($ck == 1) { + $this->_outPoint($x, $y); + } else { + $this->_outLine($x, $y); + } + $xmin = min($xmin, $x); + $ymin = min($ymin, $y); + $xmax = max($xmax, $x); + $ymax = max($ymax, $y); + if ($relcoord) { + $xoffset = $x; + $yoffset = $y; + } + } + } + break; + } + case 'L': { // lineto + foreach ($params as $ck => $cp) { + if (($ck % 2) == 0) { + $x = $cp + $xoffset; + } else { + $y = $cp + $yoffset; + $this->_outLine($x, $y); + $xmin = min($xmin, $x); + $ymin = min($ymin, $y); + $xmax = max($xmax, $x); + $ymax = max($ymax, $y); + if ($relcoord) { + $xoffset = $x; + $yoffset = $y; + } + } + } + break; + } + case 'H': { // horizontal lineto + foreach ($params as $ck => $cp) { + $x = $cp + $xoffset; + $this->_outLine($x, $y); + $xmin = min($xmin, $x); + $xmax = max($xmax, $x); + if ($relcoord) { + $xoffset = $x; + } + } + break; + } + case 'V': { // vertical lineto + foreach ($params as $ck => $cp) { + $y = $cp + $yoffset; + $this->_outLine($x, $y); + $ymin = min($ymin, $y); + $ymax = max($ymax, $y); + if ($relcoord) { + $yoffset = $y; + } + } + break; + } + case 'C': { // curveto + foreach ($params as $ck => $cp) { + $params[$ck] = $cp; + if ((($ck + 1) % 6) == 0) { + $x1 = $params[($ck - 5)] + $xoffset; + $y1 = $params[($ck - 4)] + $yoffset; + $x2 = $params[($ck - 3)] + $xoffset; + $y2 = $params[($ck - 2)] + $yoffset; + $x = $params[($ck - 1)] + $xoffset; + $y = $params[($ck)] + $yoffset; + $this->_outCurve($x1, $y1, $x2, $y2, $x, $y); + $xmin = min($xmin, $x, $x1, $x2); + $ymin = min($ymin, $y, $y1, $y2); + $xmax = max($xmax, $x, $x1, $x2); + $ymax = max($ymax, $y, $y1, $y2); + if ($relcoord) { + $xoffset = $x; + $yoffset = $y; + } + } + } + break; + } + case 'S': { // shorthand/smooth curveto + foreach ($params as $ck => $cp) { + $params[$ck] = $cp; + if ((($ck + 1) % 4) == 0) { + if (($key > 0) AND ((strtoupper($paths[($key - 1)][1]) == 'C') OR (strtoupper($paths[($key - 1)][1]) == 'S'))) { + $x1 = (2 * $x) - $x2; + $y1 = (2 * $y) - $y2; + } else { + $x1 = $x; + $y1 = $y; + } + $x2 = $params[($ck - 3)] + $xoffset; + $y2 = $params[($ck - 2)] + $yoffset; + $x = $params[($ck - 1)] + $xoffset; + $y = $params[($ck)] + $yoffset; + $this->_outCurve($x1, $y1, $x2, $y2, $x, $y); + $xmin = min($xmin, $x, $x1, $x2); + $ymin = min($ymin, $y, $y1, $y2); + $xmax = max($xmax, $x, $x1, $x2); + $ymax = max($ymax, $y, $y1, $y2); + if ($relcoord) { + $xoffset = $x; + $yoffset = $y; + } + } + } + break; + } + case 'Q': { // quadratic Bzier curveto + foreach ($params as $ck => $cp) { + $params[$ck] = $cp; + if ((($ck + 1) % 4) == 0) { + // convert quadratic points to cubic points + $x1 = $params[($ck - 3)] + $xoffset; + $y1 = $params[($ck - 2)] + $yoffset; + $xa = ($x + (2 * $x1)) / 3; + $ya = ($y + (2 * $y1)) / 3; + $x = $params[($ck - 1)] + $xoffset; + $y = $params[($ck)] + $yoffset; + $xb = ($x + (2 * $x1)) / 3; + $yb = ($y + (2 * $y1)) / 3; + $this->_outCurve($xa, $ya, $xb, $yb, $x, $y); + $xmin = min($xmin, $x, $xa, $xb); + $ymin = min($ymin, $y, $ya, $yb); + $xmax = max($xmax, $x, $xa, $xb); + $ymax = max($ymax, $y, $ya, $yb); + if ($relcoord) { + $xoffset = $x; + $yoffset = $y; + } + } + } + break; + } + case 'T': { // shorthand/smooth quadratic Bzier curveto + foreach ($params as $ck => $cp) { + $params[$ck] = $cp; + if (($ck % 2) != 0) { + if (($key > 0) AND ((strtoupper($paths[($key - 1)][1]) == 'Q') OR (strtoupper($paths[($key - 1)][1]) == 'T'))) { + $x1 = (2 * $x) - $x1; + $y1 = (2 * $y) - $y1; + } else { + $x1 = $x; + $y1 = $y; + } + // convert quadratic points to cubic points + $xa = ($x + (2 * $x1)) / 3; + $ya = ($y + (2 * $y1)) / 3; + $x = $params[($ck - 1)] + $xoffset; + $y = $params[($ck)] + $yoffset; + $xb = ($x + (2 * $x1)) / 3; + $yb = ($y + (2 * $y1)) / 3; + $this->_outCurve($xa, $ya, $xb, $yb, $x, $y); + $xmin = min($xmin, $x, $x1, $x2); + $ymin = min($ymin, $y, $y1, $y2); + $xmax = max($xmax, $x, $x1, $x2); + $ymax = max($ymax, $y, $y1, $y2); + if ($relcoord) { + $xoffset = $x; + $yoffset = $y; + } + } + } + break; + } + case 'A': { // elliptical arc + foreach ($params as $ck => $cp) { + $params[$ck] = $cp; + if ((($ck + 1) % 7) == 0) { + $x0 = $x; + $y0 = $y; + $rx = abs($params[($ck - 6)]); + $ry = abs($params[($ck - 5)]); + $ang = -$rawparams[($ck - 4)]; + $angle = deg2rad($ang); + $fa = $rawparams[($ck - 3)]; // large-arc-flag + $fs = $rawparams[($ck - 2)]; // sweep-flag + $x = $params[($ck - 1)] + $xoffset; + $y = $params[$ck] + $yoffset; + $cos_ang = cos($angle); + $sin_ang = sin($angle); + $a = ($x0 - $x) / 2; + $b = ($y0 - $y) / 2; + $xa = ($a * $cos_ang) - ($b * $sin_ang); + $ya = ($a * $sin_ang) + ($b * $cos_ang); + $rx2 = $rx * $rx; + $ry2 = $ry * $ry; + $xa2 = $xa * $xa; + $ya2 = $ya * $ya; + $delta = ($xa2 / $rx2) + ($ya2 / $ry2); + if ($delta > 1) { + $rx *= sqrt($delta); + $ry *= sqrt($delta); + $rx2 = $rx * $rx; + $ry2 = $ry * $ry; + } + $numerator = (($rx2 * $ry2) - ($rx2 * $ya2) - ($ry2 * $xa2)); + if ($numerator < 0) { + $root = 0; + } else { + $root = sqrt($numerator / (($rx2 * $ya2) + ($ry2 * $xa2))); + } + if ($fa == $fs) { + $root *= -1; + } + $cax = $root * (($rx * $ya) / $ry); + $cay = -$root * (($ry * $xa) / $rx); + // coordinates of ellipse center + $cx = ($cax * $cos_ang) - ($cay * $sin_ang) + (($x0 + $x) / 2); + $cy = ($cax * $sin_ang) + ($cay * $cos_ang) + (($y0 + $y) / 2); + // get angles + $angs = $this->getVectorsAngle(1, 0, (($xa - $cax) / $rx), (($cay - $ya) / $ry)); + $dang = $this->getVectorsAngle((($xa - $cax) / $rx), (($ya - $cay) / $ry), ((-$xa - $cax) / $rx), ((-$ya - $cay) / $ry)); + if (($fs == 0) AND ($dang > 0)) { + $dang -= (2 * M_PI); + } elseif (($fs == 1) AND ($dang < 0)) { + $dang += (2 * M_PI); + } + $angf = $angs - $dang; + if (($fs == 1) AND ($angs > $angf)) { + $tmp = $angs; + $angs = $angf; + $angf = $tmp; + } + $angs = rad2deg($angs); + $angf = rad2deg($angf); + $pie = false; + if ((isset($paths[($key + 1)][1])) AND (trim($paths[($key + 1)][1]) == 'z')) { + $pie = true; + } + $this->_outellipticalarc($cx, $cy, $rx, $ry, $ang, $angs, $angf, $pie, 2); + $this->_outPoint($x, $y); + $xmin = min($xmin, $x); + $ymin = min($ymin, $y); + $xmax = max($xmax, $x); + $ymax = max($ymax, $y); + if ($relcoord) { + $xoffset = $x; + $yoffset = $y; + } + } + } + break; + } + case 'Z': { + $this->_out('h'); + break; + } + } + } // end foreach + if (!empty($op)) { + $this->_out($op); + } + return array($xmin, $ymin, ($xmax - $xmin), ($ymax - $ymin)); + } + + /** + * Returns the angle in radiants between two vectors + * @param int $x1 X coordiante of first vector point + * @param int $y1 Y coordiante of first vector point + * @param int $x2 X coordiante of second vector point + * @param int $y2 Y coordiante of second vector point + * @author Nicola Asuni + * @since 5.0.000 (2010-05-04) + * @access protected + */ + protected function getVectorsAngle($x1, $y1, $x2, $y2) { + $dprod = ($x1 * $x2) + ($y1 * $y2); + $dist1 = sqrt(($x1 * $x1) + ($y1 * $y1)); + $dist2 = sqrt(($x2 * $x2) + ($y2 * $y2)); + $angle = acos($dprod / ($dist1 * $dist2)); + if (is_nan($angle)) { + $angle = M_PI; + } + if ((($x1 * $y2) - ($x2 * $y1)) < 0) { + $angle *= -1; + } + return $angle; + } + + /** + * Sets the opening SVG element handler function for the XML parser. (*** TO BE COMPLETED ***) + * @param resource $parser The first parameter, parser, is a reference to the XML parser calling the handler. + * @param string $name The second parameter, name, contains the name of the element for which this handler is called. If case-folding is in effect for this parser, the element name will be in uppercase letters. + * @param array $attribs The third parameter, attribs, contains an associative array with the element's attributes (if any). The keys of this array are the attribute names, the values are the attribute values. Attribute names are case-folded on the same criteria as element names. Attribute values are not case-folded. The original order of the attributes can be retrieved by walking through attribs the normal way, using each(). The first key in the array was the first attribute, and so on. + * @author Nicola Asuni + * @since 5.0.000 (2010-05-02) + * @access protected + */ + protected function startSVGElementHandler($parser, $name, $attribs) { + // check if we are in clip mode + if ($this->svgclipmode) { + $this->svgclippaths[$this->svgclipid][] = array('name' => $name, 'attribs' => $attribs); + return; + } + if ($this->svgdefsmode AND !in_array($name, array('clipPath', 'linearGradient', 'radialGradient', 'stop'))) { + $this->svgdefs[$attribs['id']] = array('name' => $name, 'attribs' => $attribs); + return; + } + $clipping = false; + if ($parser == 'clip-path') { + // set clipping mode + $clipping = true; + } + // get styling properties + $prev_svgstyle = $this->svgstyles[(count($this->svgstyles) - 1)]; // previous style + $svgstyle = array(); // current style + if (isset($attribs['style'])) { + $attribs['style'] = ';'.$attribs['style']; + } + foreach ($prev_svgstyle as $key => $val) { + if (isset($attribs[$key])) { + if ($attribs[$key] == 'inherit') { + $svgstyle[$key] = $val; + } else { + $svgstyle[$key] = $attribs[$key]; + } + } elseif (isset($attribs['style'])) { + // CSS style syntax + $attrval = array(); + if (preg_match('/[;\"\s]{1}'.$key.'[\s]*:[\s]*([^;\"\s]*)/si', $attribs['style'], $attrval) AND isset($attrval[1])) { + if ($attrval[1] == 'inherit') { + $svgstyle[$key] = $val; + } else { + $svgstyle[$key] = $attrval[1]; + } + } else { + // default value + $svgstyle[$key] = $this->svgstyles[0][$key]; + } + } else { + if (in_array($key, $this->svginheritprop)) { + // inherit previous value + $svgstyle[$key] = $val; + } else { + // default value + $svgstyle[$key] = $this->svgstyles[0][$key]; + } + } + } + // transformation matrix + $tm = $this->svgstyles[(count($this->svgstyles) - 1)]['transfmatrix']; + if (isset($attribs['transform']) AND !empty($attribs['transform'])) { + $tm = $this->getTransformationMatrixProduct($tm, $this->getSVGTransformMatrix($attribs['transform'])); + } + $svgstyle['transfmatrix'] = $tm; + // process tag + switch($name) { + case 'defs': { + $this->svgdefsmode = true; + break; + } + // clipPath + case 'clipPath': { + $this->svgclipmode = true; + $this->svgclipid = $attribs['id']; + $this->svgclippaths[$this->svgclipid] = array(); + break; + } + case 'svg': { + // start of SVG object + break; + } + case 'g': { + // group together related graphics elements + array_push($this->svgstyles, $svgstyle); + $this->StartTransform(); + $this->setSVGStyles($svgstyle, $prev_svgstyle); + break; + } + case 'linearGradient': { + $this->svggradientid = $attribs['id']; + $this->svggradients[$this->svggradientid] = array(); + $this->svggradients[$this->svggradientid]['type'] = 2; + $this->svggradients[$this->svggradientid]['stops'] = array(); + if (isset($attribs['gradientUnits'])) { + $this->svggradients[$this->svggradientid]['gradientUnits'] = $attribs['gradientUnits']; + } else { + $this->svggradients[$this->svggradientid]['gradientUnits'] = 'objectBoundingBox'; + } + //$attribs['spreadMethod'] + $x1 = (isset($attribs['x1'])?$attribs['x1']:0); + $y1 = (isset($attribs['y1'])?$attribs['y1']:0); + $x2 = (isset($attribs['x2'])?$attribs['x2']:1); + $y2 = (isset($attribs['y2'])?$attribs['y2']:0); + if (isset($attribs['x1']) AND (substr($attribs['x1'], -1) != '%')) { + $this->svggradients[$this->svggradientid]['mode'] = 'measure'; + } else { + $this->svggradients[$this->svggradientid]['mode'] = 'percentage'; + } + if (isset($attribs['gradientTransform'])) { + $this->svggradients[$this->svggradientid]['gradientTransform'] = $this->getSVGTransformMatrix($attribs['gradientTransform']); + } + $this->svggradients[$this->svggradientid]['coords'] = array($x1, $y1, $x2, $y2); + if (isset($attribs['xlink:href']) AND !empty($attribs['xlink:href'])) { + // gradient is defined on another place + $this->svggradients[$this->svggradientid]['xref'] = substr($attribs['xlink:href'], 1); + } + break; + } + case 'radialGradient': { + $this->svggradientid = $attribs['id']; + $this->svggradients[$this->svggradientid] = array(); + $this->svggradients[$this->svggradientid]['type'] = 3; + $this->svggradients[$this->svggradientid]['stops'] = array(); + if (isset($attribs['gradientUnits'])) { + $this->svggradients[$this->svggradientid]['gradientUnits'] = $attribs['gradientUnits']; + } else { + $this->svggradients[$this->svggradientid]['gradientUnits'] = 'objectBoundingBox'; + } + //$attribs['spreadMethod'] + $cx = (isset($attribs['cx'])?$attribs['cx']:0.5); + $cy = (isset($attribs['cy'])?$attribs['cy']:0.5); + $fx = (isset($attribs['fx'])?$attribs['fx']:$cx); + $fy = (isset($attribs['fy'])?$attribs['fy']:$cy); + $r = (isset($attribs['r'])?$attribs['r']:0.5); + if (isset($attribs['cx']) AND (substr($attribs['cx'], -1) != '%')) { + $this->svggradients[$this->svggradientid]['mode'] = 'measure'; + } else { + $this->svggradients[$this->svggradientid]['mode'] = 'percentage'; + } + if (isset($attribs['gradientTransform'])) { + $this->svggradients[$this->svggradientid]['gradientTransform'] = $this->getSVGTransformMatrix($attribs['gradientTransform']); + } + $this->svggradients[$this->svggradientid]['coords'] = array($cx, $cy, $fx, $fy, $r); + if (isset($attribs['xlink:href']) AND !empty($attribs['xlink:href'])) { + // gradient is defined on another place + $this->svggradients[$this->svggradientid]['xref'] = substr($attribs['xlink:href'], 1); + } + break; + } + case 'stop': { + // gradient stops + if (substr($attribs['offset'], -1) == '%') { + $offset = floatval(substr($attribs['offset'], -1)) / 100; + } else { + $offset = floatval($attribs['offset']); + if ($offset > 1) { + $offset /= 100; + } + } + $stop_color = isset($svgstyle['stop-color'])?$this->convertHTMLColorToDec($svgstyle['stop-color']):'black'; + $opacity = isset($svgstyle['stop-opacity'])?$svgstyle['stop-opacity']:1; + $this->svggradients[$this->svggradientid]['stops'][] = array('offset' => $offset, 'color' => $stop_color, 'opacity' => $opacity); + break; + } + // paths + case 'path': { + $d = trim($attribs['d']); + if ($clipping) { + $this->SVGTransform($tm); + $this->SVGPath($d, 'CNZ'); + } else { + $this->StartTransform(); + $this->SVGTransform($tm); + $obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, 0, 0, 1, 1, 'SVGPath', array($d, 'CNZ')); + if (!empty($obstyle)) { + $this->SVGPath($d, $obstyle); + } + $this->StopTransform(); + } + break; + } + // shapes + case 'rect': { + $x = (isset($attribs['x'])?$this->getHTMLUnitToUnits($attribs['x'], 0, $this->svgunit, false):0); + $y = (isset($attribs['y'])?$this->getHTMLUnitToUnits($attribs['y'], 0, $this->svgunit, false):0); + $w = (isset($attribs['width'])?$this->getHTMLUnitToUnits($attribs['width'], 0, $this->svgunit, false):0); + $h = (isset($attribs['height'])?$this->getHTMLUnitToUnits($attribs['height'], 0, $this->svgunit, false):0); + $rx = (isset($attribs['rx'])?$this->getHTMLUnitToUnits($attribs['rx'], 0, $this->svgunit, false):0); + $ry = (isset($attribs['ry'])?$this->getHTMLUnitToUnits($attribs['ry'], 0, $this->svgunit, false):$rx); + if ($clipping) { + $this->SVGTransform($tm); + $this->RoundedRectXY($x, $y, $w, $h, $rx, $ry, '1111', 'CNZ', array(), array()); + } else { + $this->StartTransform(); + $this->SVGTransform($tm); + $obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, $w, $h, 'RoundedRectXY', array($x, $y, $w, $h, $rx, $ry, '1111', 'CNZ')); + if (!empty($obstyle)) { + $this->RoundedRectXY($x, $y, $w, $h, $rx, $ry, '1111', $obstyle, array(), array()); + } + $this->StopTransform(); + } + break; + } + case 'circle': { + $cx = (isset($attribs['cx'])?$this->getHTMLUnitToUnits($attribs['cx'], 0, $this->svgunit, false):0); + $cy = (isset($attribs['cy'])?$this->getHTMLUnitToUnits($attribs['cy'], 0, $this->svgunit, false):0); + $r = (isset($attribs['r'])?$this->getHTMLUnitToUnits($attribs['r'], 0, $this->svgunit, false):0); + $x = $cx - $r; + $y = $cy - $r; + $w = 2 * $r; + $h = $w; + if ($clipping) { + $this->SVGTransform($tm); + $this->Circle($cx, $cy, $r, 0, 360, 'CNZ', array(), array(), 8); + } else { + $this->StartTransform(); + $this->SVGTransform($tm); + $obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, $w, $h, 'Circle', array($cx, $cy, $r, 0, 360, 'CNZ')); + if (!empty($obstyle)) { + $this->Circle($cx, $cy, $r, 0, 360, $obstyle, array(), array(), 8); + } + $this->StopTransform(); + } + break; + } + case 'ellipse': { + $cx = (isset($attribs['cx'])?$this->getHTMLUnitToUnits($attribs['cx'], 0, $this->svgunit, false):0); + $cy = (isset($attribs['cy'])?$this->getHTMLUnitToUnits($attribs['cy'], 0, $this->svgunit, false):0); + $rx = (isset($attribs['rx'])?$this->getHTMLUnitToUnits($attribs['rx'], 0, $this->svgunit, false):0); + $ry = (isset($attribs['ry'])?$this->getHTMLUnitToUnits($attribs['ry'], 0, $this->svgunit, false):0); + $x = $cx - $rx; + $y = $cy - $ry; + $w = 2 * $rx; + $h = 2 * $ry; + if ($clipping) { + $this->SVGTransform($tm); + $this->Ellipse($cx, $cy, $rx, $ry, 0, 0, 360, 'CNZ', array(), array(), 8); + } else { + $this->StartTransform(); + $this->SVGTransform($tm); + $obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, $w, $h, 'Ellipse', array($cx, $cy, $rx, $ry, 0, 0, 360, 'CNZ')); + if (!empty($obstyle)) { + $this->Ellipse($cx, $cy, $rx, $ry, 0, 0, 360, $obstyle, array(), array(), 8); + } + $this->StopTransform(); + } + break; + } + case 'line': { + $x1 = (isset($attribs['x1'])?$this->getHTMLUnitToUnits($attribs['x1'], 0, $this->svgunit, false):0); + $y1 = (isset($attribs['y1'])?$this->getHTMLUnitToUnits($attribs['y1'], 0, $this->svgunit, false):0); + $x2 = (isset($attribs['x2'])?$this->getHTMLUnitToUnits($attribs['x2'], 0, $this->svgunit, false):0); + $y2 = (isset($attribs['y2'])?$this->getHTMLUnitToUnits($attribs['y2'], 0, $this->svgunit, false):0); + $x = $x1; + $y = $y1; + $w = abs($x2 - $x1); + $h = abs($y2 - $y1); + if (!$clipping) { + $this->StartTransform(); + $this->SVGTransform($tm); + $obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, $w, $h, 'Line', array($x1, $y1, $x2, $y2)); + $this->Line($x1, $y1, $x2, $y2); + $this->StopTransform(); + } + break; + } + case 'polyline': + case 'polygon': { + $points = (isset($attribs['points'])?$attribs['points']:'0 0'); + $points = trim($points); + // note that point may use a complex syntax not covered here + $points = preg_split('/[\,\s]+/si', $points); + if (count($points) < 4) { + break; + } + $p = array(); + $xmin = 2147483647; + $xmax = 0; + $ymin = 2147483647; + $ymax = 0; + foreach ($points as $key => $val) { + $p[$key] = $this->getHTMLUnitToUnits($val, 0, $this->svgunit, false); + if (($key % 2) == 0) { + // X coordinate + $xmin = min($xmin, $p[$key]); + $xmax = max($xmax, $p[$key]); + } else { + // Y coordinate + $ymin = min($ymin, $p[$key]); + $ymax = max($ymax, $p[$key]); + } + } + $x = $xmin; + $y = $ymin; + $w = ($xmax - $xmin); + $h = ($ymax - $ymin); + if ($name == 'polyline') { + $this->StartTransform(); + $this->SVGTransform($tm); + $obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, $w, $h, 'PolyLine', array($p, 'CNZ')); + $this->PolyLine($p, 'D', array(), array()); + $this->StopTransform(); + } else { // polygon + if ($clipping) { + $this->SVGTransform($tm); + $this->Polygon($p, 'CNZ', array(), array(), true); + } else { + $this->StartTransform(); + $this->SVGTransform($tm); + $obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, $w, $h, 'Polygon', array($p, 'CNZ')); + if (!empty($obstyle)) { + $this->Polygon($p, $obstyle, array(), array(), true); + } + $this->StopTransform(); + } + } + break; + } + // image + case 'image': { + if (!isset($attribs['xlink:href']) OR empty($attribs['xlink:href'])) { + break; + } + $x = (isset($attribs['x'])?$this->getHTMLUnitToUnits($attribs['x'], 0, $this->svgunit, false):0); + $y = (isset($attribs['y'])?$this->getHTMLUnitToUnits($attribs['y'], 0, $this->svgunit, false):0); + $w = (isset($attribs['width'])?$this->getHTMLUnitToUnits($attribs['width'], 0, $this->svgunit, false):0); + $h = (isset($attribs['height'])?$this->getHTMLUnitToUnits($attribs['height'], 0, $this->svgunit, false):0); + $img = $attribs['xlink:href']; + if (!$clipping) { + $this->StartTransform(); + $this->SVGTransform($tm); + $obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, $w, $h); + // fix image path + if (!$this->empty_string($this->svgdir) AND (($img{0} == '.') OR (basename($img) == $img))) { + // replace relative path with full server path + $img = $this->svgdir.'/'.$img; + } + if (($img{0} == '/') AND ($_SERVER['DOCUMENT_ROOT'] != '/')) { + $findroot = strpos($img, $_SERVER['DOCUMENT_ROOT']); + if (($findroot === false) OR ($findroot > 1)) { + // replace relative path with full server path + $img = $_SERVER['DOCUMENT_ROOT'].$img; + } + } + $img = urldecode($img); + $testscrtype = @parse_url($img); + if (!isset($testscrtype['query']) OR empty($testscrtype['query'])) { + // convert URL to server path + $img = str_replace(K_PATH_URL, K_PATH_MAIN, $img); + } + $this->Image($img, $x, $y, $w, $h); + $this->StopTransform(); + } + break; + } + // text + case 'text': + case 'tspan': { + // only basic support - advanced features must be implemented + $x = (isset($attribs['x'])?$this->getHTMLUnitToUnits($attribs['x'], 0, $this->svgunit, false):0); + $y = (isset($attribs['y'])?$this->getHTMLUnitToUnits($attribs['y'], 0, $this->svgunit, false):0); + $svgstyle['text-color'] = $svgstyle['fill']; + $this->svgtext = ''; + $this->StartTransform(); + $this->SVGTransform($tm); + $obstyle = $this->setSVGStyles($svgstyle, $prev_svgstyle, $x, $y, 1, 1); + $this->SetXY($x, $y, true); + break; + } + // use + case 'use': { + if (isset($attribs['xlink:href'])) { + $use = $this->svgdefs[substr($attribs['xlink:href'], 1)]; + if (isset($attribs['xlink:href'])) { + unset($attribs['xlink:href']); + } + if (isset($attribs['id'])) { + unset($attribs['id']); + } + $attribs = array_merge($use['attribs'], $attribs); + $this->startSVGElementHandler($parser, $use['name'], $use['attribs']); + } + break; + } + default: { + break; + } + } + } + + /** + * Sets the closing SVG element handler function for the XML parser. + * @param resource $parser The first parameter, parser, is a reference to the XML parser calling the handler. + * @param string $name The second parameter, name, contains the name of the element for which this handler is called. If case-folding is in effect for this parser, the element name will be in uppercase letters. + * @author Nicola Asuni + * @since 5.0.000 (2010-05-02) + * @access protected + */ + protected function endSVGElementHandler($parser, $name) { + switch($name) { + case 'defs': { + $this->svgdefsmode = false; + break; + } + // clipPath + case 'clipPath': { + $this->svgclipmode = false; + break; + } + case 'g': { + // ungroup: remove last style from array + array_pop($this->svgstyles); + $this->StopTransform(); + break; + } + case 'text': + case 'tspan': { + // print text + $this->Cell(0, 0, trim($this->svgtext), 0, 0, '', 0, '', 0, false, 'L', 'T'); + $this->StopTransform(); + break; + } + default: { + break; + } + } + } + + /** + * Sets the character data handler function for the XML parser. + * @param resource $parser The first parameter, parser, is a reference to the XML parser calling the handler. + * @param string $data The second parameter, data, contains the character data as a string. + * @author Nicola Asuni + * @since 5.0.000 (2010-05-02) + * @access protected + */ + protected function segSVGContentHandler($parser, $data) { + $this->svgtext .= $data; + } + + } // END OF TCPDF CLASS +} +//============================================================+ +// END OF FILE +//============================================================+ +?> diff --git a/assets/html2pdf/_tcpdf_5.0.002/unicode_data.php b/assets/html2pdf/_tcpdf_5.0.002/unicode_data.php new file mode 100644 index 0000000..ed863a2 --- /dev/null +++ b/assets/html2pdf/_tcpdf_5.0.002/unicode_data.php @@ -0,0 +1,18360 @@ +<?php +//============================================================+ +// File name : unicode_data.php +// Begin : 2008-01-01 +// Last Update : 2009-08-17 +// License : GNU LGPL (http://www.gnu.org/copyleft/lesser.html) +// ---------------------------------------------------------------------------- +// Copyright (C) 2002-2009 Nicola Asuni - Tecnick.com S.r.l. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 2.1 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. +// +// See LICENSE.TXT file for more information. +// ---------------------------------------------------------------------------- +// +// Description : Unicode Include file for TCPDF. +// +// Author: Nicola Asuni +// +// (c) Copyright: +// Nicola Asuni +// Tecnick.com s.r.l. +// Via Della Pace, 11 +// 09044 Quartucciu (CA) +// ITALY +// www.tecnick.com +// info@tecnick.com +//============================================================+ +// THANKS TO +// Efthimios Mavrogeorgiadis +// Saleh AlMatrafe + +/** + * Unicode Include file for TCPDF. + * @author Nicola Asuni + * @copyright 2004-2009 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com + * @package com.tecnick.tcpdf + * @link http://www.tcpdf.org + * @license http://www.gnu.org/copyleft/lesser.html LGPL + * @since 2.1.000 (2008-01-08) +*/ + +/** +* Left-to-Right Mark +*/ +define('K_LRM', 8206); +/** +* Right-to-Left Mark +*/ +define('K_RLM', 8207); +/** +* Left-to-Right Embedding +*/ +define('K_LRE', 8234); +/** +* Right-to-Left Embedding +*/ +define('K_RLE', 8235); +/** +* Pop Directional Format +*/ +define('K_PDF', 8236); +/** +* Left-to-Right Override +*/ +define('K_LRO', 8237); +/** +* Right-to-Left Override +*/ +define('K_RLO', 8238); + +/* + * Pattern to test RTL (Righ-To-Left) strings using regular expressions. + */ +define('K_RE_PATTERN_RTL', "/( + \xD6\xBE # R + | \xD7[\x80\x83\x86\x90-\xAA\xB0-\xB4] # R + | \xDF[\x80-\xAA\xB4\xB5\xBA] # R + | \xE2\x80\x8F # R + | \xEF\xAC[\x9D\x9F\xA0-\xA8\xAA-\xB6\xB8-\xBC\xBE] # R + | \xEF\xAD[\x80\x81\x83\x84\x86-\x8F] # R + | \xF0\x90\xA0[\x80-\x85\x88\x8A-\xB5\xB7\xB8\xBC\xBF] # R + | \xF0\x90\xA4[\x80-\x99] # R + | \xF0\x90\xA8[\x80\x90-\x93\x95-\x97\x99-\xB3] # R + | \xF0\x90\xA9[\x80-\x87\x90-\x98] # R + | \xE2\x80[\xAB\xAE] # RLE & RLO + )/x"); + +/* + * Pattern to test Arabic strings using regular expressions. + * source: http://www.w3.org/International/questions/qa-forms-utf-8 + */ +define("K_RE_PATTERN_ARABIC", "/( + \xD8[\x80-\x83\x8B\x8D\x9B\x9E\x9F\xA1-\xBA] # AL + | \xD9[\x80-\x8A\xAD-\xAF\xB1-\xBF] # AL + | \xDA[\x80-\xBF] # AL + | \xDB[\x80-\x95\x9D\xA5\xA6\xAE\xAF\xBA-\xBF] # AL + | \xDC[\x80-\x8D\x90\x92-\xAF] # AL + | \xDD[\x8D-\xAD] # AL + | \xDE[\x80-\xA5\xB1] # AL + | \xEF\xAD[\x90-\xBF] # AL + | \xEF\xAE[\x80-\xB1] # AL + | \xEF\xAF[\x93-\xBF] # AL + | \xEF[\xB0-\xB3][\x80-\xBF] # AL + | \xEF\xB4[\x80-\xBD] # AL + | \xEF\xB5[\x90-\xBF] # AL + | \xEF\xB6[\x80-\x8F\x92-\xBF] # AL + | \xEF\xB7[\x80-\x87\xB0-\xBC] # AL + | \xEF\xB9[\xB0-\xB4\xB6-\xBF] # AL + | \xEF\xBA[\x80-\xBF] # AL + | \xEF\xBB[\x80-\xBC] # AL + | \xD9[\xA0-\xA9\xAB\xAC] # AN + )/x"); + +/** + * Array of unicode types + */ +global $unicode; +$unicode = array( +0=>'BN', +1=>'BN', +2=>'BN', +3=>'BN', +4=>'BN', +5=>'BN', +6=>'BN', +7=>'BN', +8=>'BN', +9=>'S', +10=>'B', +11=>'S', +12=>'WS', +13=>'B', +14=>'BN', +15=>'BN', +16=>'BN', +17=>'BN', +18=>'BN', +19=>'BN', +20=>'BN', +21=>'BN', +22=>'BN', +23=>'BN', +24=>'BN', +25=>'BN', +26=>'BN', +27=>'BN', +28=>'B', +29=>'B', +30=>'B', +31=>'S', +32=>'WS', +33=>'ON', +34=>'ON', +35=>'ET', +36=>'ET', +37=>'ET', +38=>'ON', +39=>'ON', +40=>'ON', +41=>'ON', +42=>'ON', +43=>'ES', +44=>'CS', +45=>'ES', +46=>'CS', +47=>'CS', +48=>'EN', +49=>'EN', +50=>'EN', +51=>'EN', +52=>'EN', +53=>'EN', +54=>'EN', +55=>'EN', +56=>'EN', +57=>'EN', +58=>'CS', +59=>'ON', +60=>'ON', +61=>'ON', +62=>'ON', +63=>'ON', +64=>'ON', +65=>'L', +66=>'L', +67=>'L', +68=>'L', +69=>'L', +70=>'L', +71=>'L', +72=>'L', +73=>'L', +74=>'L', +75=>'L', +76=>'L', +77=>'L', +78=>'L', +79=>'L', +80=>'L', +81=>'L', +82=>'L', +83=>'L', +84=>'L', +85=>'L', +86=>'L', +87=>'L', +88=>'L', +89=>'L', +90=>'L', +91=>'ON', +92=>'ON', +93=>'ON', +94=>'ON', +95=>'ON', +96=>'ON', +97=>'L', +98=>'L', +99=>'L', +100=>'L', +101=>'L', +102=>'L', +103=>'L', +104=>'L', +105=>'L', +106=>'L', +107=>'L', +108=>'L', +109=>'L', +110=>'L', +111=>'L', +112=>'L', +113=>'L', +114=>'L', +115=>'L', +116=>'L', +117=>'L', +118=>'L', +119=>'L', +120=>'L', +121=>'L', +122=>'L', +123=>'ON', +124=>'ON', +125=>'ON', +126=>'ON', +127=>'BN', +128=>'BN', +129=>'BN', +130=>'BN', +131=>'BN', +132=>'BN', +133=>'B', +134=>'BN', +135=>'BN', +136=>'BN', +137=>'BN', +138=>'BN', +139=>'BN', +140=>'BN', +141=>'BN', +142=>'BN', +143=>'BN', +144=>'BN', +145=>'BN', +146=>'BN', +147=>'BN', +148=>'BN', +149=>'BN', +150=>'BN', +151=>'BN', +152=>'BN', +153=>'BN', +154=>'BN', +155=>'BN', +156=>'BN', +157=>'BN', +158=>'BN', +159=>'BN', +160=>'CS', +161=>'ON', +162=>'ET', +163=>'ET', +164=>'ET', +165=>'ET', +166=>'ON', +167=>'ON', +168=>'ON', +169=>'ON', +170=>'L', +171=>'ON', +172=>'ON', +173=>'BN', +174=>'ON', +175=>'ON', +176=>'ET', +177=>'ET', +178=>'EN', +179=>'EN', +180=>'ON', +181=>'L', +182=>'ON', +183=>'ON', +184=>'ON', +185=>'EN', +186=>'L', +187=>'ON', +188=>'ON', +189=>'ON', +190=>'ON', +191=>'ON', +192=>'L', +193=>'L', +194=>'L', +195=>'L', +196=>'L', +197=>'L', +198=>'L', +199=>'L', +200=>'L', +201=>'L', +202=>'L', +203=>'L', +204=>'L', +205=>'L', +206=>'L', +207=>'L', +208=>'L', +209=>'L', +210=>'L', +211=>'L', +212=>'L', +213=>'L', +214=>'L', +215=>'ON', +216=>'L', +217=>'L', +218=>'L', +219=>'L', +220=>'L', +221=>'L', +222=>'L', +223=>'L', +224=>'L', +225=>'L', +226=>'L', +227=>'L', +228=>'L', +229=>'L', +230=>'L', +231=>'L', +232=>'L', +233=>'L', +234=>'L', +235=>'L', +236=>'L', +237=>'L', +238=>'L', +239=>'L', +240=>'L', +241=>'L', +242=>'L', +243=>'L', +244=>'L', +245=>'L', +246=>'L', +247=>'ON', +248=>'L', +249=>'L', +250=>'L', +251=>'L', +252=>'L', +253=>'L', +254=>'L', +255=>'L', +256=>'L', +257=>'L', +258=>'L', +259=>'L', +260=>'L', +261=>'L', +262=>'L', +263=>'L', +264=>'L', +265=>'L', +266=>'L', +267=>'L', +268=>'L', +269=>'L', +270=>'L', +271=>'L', +272=>'L', +273=>'L', +274=>'L', +275=>'L', +276=>'L', +277=>'L', +278=>'L', +279=>'L', +280=>'L', +281=>'L', +282=>'L', +283=>'L', +284=>'L', +285=>'L', +286=>'L', +287=>'L', +288=>'L', +289=>'L', +290=>'L', +291=>'L', +292=>'L', +293=>'L', +294=>'L', +295=>'L', +296=>'L', +297=>'L', +298=>'L', +299=>'L', +300=>'L', +301=>'L', +302=>'L', +303=>'L', +304=>'L', +305=>'L', +306=>'L', +307=>'L', +308=>'L', +309=>'L', +310=>'L', +311=>'L', +312=>'L', +313=>'L', +314=>'L', +315=>'L', +316=>'L', +317=>'L', +318=>'L', +319=>'L', +320=>'L', +321=>'L', +322=>'L', +323=>'L', +324=>'L', +325=>'L', +326=>'L', +327=>'L', +328=>'L', +329=>'L', +330=>'L', +331=>'L', +332=>'L', +333=>'L', +334=>'L', +335=>'L', +336=>'L', +337=>'L', +338=>'L', +339=>'L', +340=>'L', +341=>'L', +342=>'L', +343=>'L', +344=>'L', +345=>'L', +346=>'L', +347=>'L', +348=>'L', +349=>'L', +350=>'L', +351=>'L', +352=>'L', +353=>'L', +354=>'L', +355=>'L', +356=>'L', +357=>'L', +358=>'L', +359=>'L', +360=>'L', +361=>'L', +362=>'L', +363=>'L', +364=>'L', +365=>'L', +366=>'L', +367=>'L', +368=>'L', +369=>'L', +370=>'L', +371=>'L', +372=>'L', +373=>'L', +374=>'L', +375=>'L', +376=>'L', +377=>'L', +378=>'L', +379=>'L', +380=>'L', +381=>'L', +382=>'L', +383=>'L', +384=>'L', +385=>'L', +386=>'L', +387=>'L', +388=>'L', +389=>'L', +390=>'L', +391=>'L', +392=>'L', +393=>'L', +394=>'L', +395=>'L', +396=>'L', +397=>'L', +398=>'L', +399=>'L', +400=>'L', +401=>'L', +402=>'L', +403=>'L', +404=>'L', +405=>'L', +406=>'L', +407=>'L', +408=>'L', +409=>'L', +410=>'L', +411=>'L', +412=>'L', +413=>'L', +414=>'L', +415=>'L', +416=>'L', +417=>'L', +418=>'L', +419=>'L', +420=>'L', +421=>'L', +422=>'L', +423=>'L', +424=>'L', +425=>'L', +426=>'L', +427=>'L', +428=>'L', +429=>'L', +430=>'L', +431=>'L', +432=>'L', +433=>'L', +434=>'L', +435=>'L', +436=>'L', +437=>'L', +438=>'L', +439=>'L', +440=>'L', +441=>'L', +442=>'L', +443=>'L', +444=>'L', +445=>'L', +446=>'L', +447=>'L', +448=>'L', +449=>'L', +450=>'L', +451=>'L', +452=>'L', +453=>'L', +454=>'L', +455=>'L', +456=>'L', +457=>'L', +458=>'L', +459=>'L', +460=>'L', +461=>'L', +462=>'L', +463=>'L', +464=>'L', +465=>'L', +466=>'L', +467=>'L', +468=>'L', +469=>'L', +470=>'L', +471=>'L', +472=>'L', +473=>'L', +474=>'L', +475=>'L', +476=>'L', +477=>'L', +478=>'L', +479=>'L', +480=>'L', +481=>'L', +482=>'L', +483=>'L', +484=>'L', +485=>'L', +486=>'L', +487=>'L', +488=>'L', +489=>'L', +490=>'L', +491=>'L', +492=>'L', +493=>'L', +494=>'L', +495=>'L', +496=>'L', +497=>'L', +498=>'L', +499=>'L', +500=>'L', +501=>'L', +502=>'L', +503=>'L', +504=>'L', +505=>'L', +506=>'L', +507=>'L', +508=>'L', +509=>'L', +510=>'L', +511=>'L', +512=>'L', +513=>'L', +514=>'L', +515=>'L', +516=>'L', +517=>'L', +518=>'L', +519=>'L', +520=>'L', +521=>'L', +522=>'L', +523=>'L', +524=>'L', +525=>'L', +526=>'L', +527=>'L', +528=>'L', +529=>'L', +530=>'L', +531=>'L', +532=>'L', +533=>'L', +534=>'L', +535=>'L', +536=>'L', +537=>'L', +538=>'L', +539=>'L', +540=>'L', +541=>'L', +542=>'L', +543=>'L', +544=>'L', +545=>'L', +546=>'L', +547=>'L', +548=>'L', +549=>'L', +550=>'L', +551=>'L', +552=>'L', +553=>'L', +554=>'L', +555=>'L', +556=>'L', +557=>'L', +558=>'L', +559=>'L', +560=>'L', +561=>'L', +562=>'L', +563=>'L', +564=>'L', +565=>'L', +566=>'L', +567=>'L', +568=>'L', +569=>'L', +570=>'L', +571=>'L', +572=>'L', +573=>'L', +574=>'L', +575=>'L', +576=>'L', +577=>'L', +578=>'L', +579=>'L', +580=>'L', +581=>'L', +582=>'L', +583=>'L', +584=>'L', +585=>'L', +586=>'L', +587=>'L', +588=>'L', +589=>'L', +590=>'L', +591=>'L', +592=>'L', +593=>'L', +594=>'L', +595=>'L', +596=>'L', +597=>'L', +598=>'L', +599=>'L', +600=>'L', +601=>'L', +602=>'L', +603=>'L', +604=>'L', +605=>'L', +606=>'L', +607=>'L', +608=>'L', +609=>'L', +610=>'L', +611=>'L', +612=>'L', +613=>'L', +614=>'L', +615=>'L', +616=>'L', +617=>'L', +618=>'L', +619=>'L', +620=>'L', +621=>'L', +622=>'L', +623=>'L', +624=>'L', +625=>'L', +626=>'L', +627=>'L', +628=>'L', +629=>'L', +630=>'L', +631=>'L', +632=>'L', +633=>'L', +634=>'L', +635=>'L', +636=>'L', +637=>'L', +638=>'L', +639=>'L', +640=>'L', +641=>'L', +642=>'L', +643=>'L', +644=>'L', +645=>'L', +646=>'L', +647=>'L', +648=>'L', +649=>'L', +650=>'L', +651=>'L', +652=>'L', +653=>'L', +654=>'L', +655=>'L', +656=>'L', +657=>'L', +658=>'L', +659=>'L', +660=>'L', +661=>'L', +662=>'L', +663=>'L', +664=>'L', +665=>'L', +666=>'L', +667=>'L', +668=>'L', +669=>'L', +670=>'L', +671=>'L', +672=>'L', +673=>'L', +674=>'L', +675=>'L', +676=>'L', +677=>'L', +678=>'L', +679=>'L', +680=>'L', +681=>'L', +682=>'L', +683=>'L', +684=>'L', +685=>'L', +686=>'L', +687=>'L', +688=>'L', +689=>'L', +690=>'L', +691=>'L', +692=>'L', +693=>'L', +694=>'L', +695=>'L', +696=>'L', +697=>'ON', +698=>'ON', +699=>'L', +700=>'L', +701=>'L', +702=>'L', +703=>'L', +704=>'L', +705=>'L', +706=>'ON', +707=>'ON', +708=>'ON', +709=>'ON', +710=>'ON', +711=>'ON', +712=>'ON', +713=>'ON', +714=>'ON', +715=>'ON', +716=>'ON', +717=>'ON', +718=>'ON', +719=>'ON', +720=>'L', +721=>'L', +722=>'ON', +723=>'ON', +724=>'ON', +725=>'ON', +726=>'ON', +727=>'ON', +728=>'ON', +729=>'ON', +730=>'ON', +731=>'ON', +732=>'ON', +733=>'ON', +734=>'ON', +735=>'ON', +736=>'L', +737=>'L', +738=>'L', +739=>'L', +740=>'L', +741=>'ON', +742=>'ON', +743=>'ON', +744=>'ON', +745=>'ON', +746=>'ON', +747=>'ON', +748=>'ON', +749=>'ON', +750=>'L', +751=>'ON', +752=>'ON', +753=>'ON', +754=>'ON', +755=>'ON', +756=>'ON', +757=>'ON', +758=>'ON', +759=>'ON', +760=>'ON', +761=>'ON', +762=>'ON', +763=>'ON', +764=>'ON', +765=>'ON', +766=>'ON', +767=>'ON', +768=>'NSM', +769=>'NSM', +770=>'NSM', +771=>'NSM', +772=>'NSM', +773=>'NSM', +774=>'NSM', +775=>'NSM', +776=>'NSM', +777=>'NSM', +778=>'NSM', +779=>'NSM', +780=>'NSM', +781=>'NSM', +782=>'NSM', +783=>'NSM', +784=>'NSM', +785=>'NSM', +786=>'NSM', +787=>'NSM', +788=>'NSM', +789=>'NSM', +790=>'NSM', +791=>'NSM', +792=>'NSM', +793=>'NSM', +794=>'NSM', +795=>'NSM', +796=>'NSM', +797=>'NSM', +798=>'NSM', +799=>'NSM', +800=>'NSM', +801=>'NSM', +802=>'NSM', +803=>'NSM', +804=>'NSM', +805=>'NSM', +806=>'NSM', +807=>'NSM', +808=>'NSM', +809=>'NSM', +810=>'NSM', +811=>'NSM', +812=>'NSM', +813=>'NSM', +814=>'NSM', +815=>'NSM', +816=>'NSM', +817=>'NSM', +818=>'NSM', +819=>'NSM', +820=>'NSM', +821=>'NSM', +822=>'NSM', +823=>'NSM', +824=>'NSM', +825=>'NSM', +826=>'NSM', +827=>'NSM', +828=>'NSM', +829=>'NSM', +830=>'NSM', +831=>'NSM', +832=>'NSM', +833=>'NSM', +834=>'NSM', +835=>'NSM', +836=>'NSM', +837=>'NSM', +838=>'NSM', +839=>'NSM', +840=>'NSM', +841=>'NSM', +842=>'NSM', +843=>'NSM', +844=>'NSM', +845=>'NSM', +846=>'NSM', +847=>'NSM', +848=>'NSM', +849=>'NSM', +850=>'NSM', +851=>'NSM', +852=>'NSM', +853=>'NSM', +854=>'NSM', +855=>'NSM', +856=>'NSM', +857=>'NSM', +858=>'NSM', +859=>'NSM', +860=>'NSM', +861=>'NSM', +862=>'NSM', +863=>'NSM', +864=>'NSM', +865=>'NSM', +866=>'NSM', +867=>'NSM', +868=>'NSM', +869=>'NSM', +870=>'NSM', +871=>'NSM', +872=>'NSM', +873=>'NSM', +874=>'NSM', +875=>'NSM', +876=>'NSM', +877=>'NSM', +878=>'NSM', +879=>'NSM', +884=>'ON', +885=>'ON', +890=>'L', +891=>'L', +892=>'L', +893=>'L', +894=>'ON', +900=>'ON', +901=>'ON', +902=>'L', +903=>'ON', +904=>'L', +905=>'L', +906=>'L', +908=>'L', +910=>'L', +911=>'L', +912=>'L', +913=>'L', +914=>'L', +915=>'L', +916=>'L', +917=>'L', +918=>'L', +919=>'L', +920=>'L', +921=>'L', +922=>'L', +923=>'L', +924=>'L', +925=>'L', +926=>'L', +927=>'L', +928=>'L', +929=>'L', +931=>'L', +932=>'L', +933=>'L', +934=>'L', +935=>'L', +936=>'L', +937=>'L', +938=>'L', +939=>'L', +940=>'L', +941=>'L', +942=>'L', +943=>'L', +944=>'L', +945=>'L', +946=>'L', +947=>'L', +948=>'L', +949=>'L', +950=>'L', +951=>'L', +952=>'L', +953=>'L', +954=>'L', +955=>'L', +956=>'L', +957=>'L', +958=>'L', +959=>'L', +960=>'L', +961=>'L', +962=>'L', +963=>'L', +964=>'L', +965=>'L', +966=>'L', +967=>'L', +968=>'L', +969=>'L', +970=>'L', +971=>'L', +972=>'L', +973=>'L', +974=>'L', +976=>'L', +977=>'L', +978=>'L', +979=>'L', +980=>'L', +981=>'L', +982=>'L', +983=>'L', +984=>'L', +985=>'L', +986=>'L', +987=>'L', +988=>'L', +989=>'L', +990=>'L', +991=>'L', +992=>'L', +993=>'L', +994=>'L', +995=>'L', +996=>'L', +997=>'L', +998=>'L', +999=>'L', +1000=>'L', +1001=>'L', +1002=>'L', +1003=>'L', +1004=>'L', +1005=>'L', +1006=>'L', +1007=>'L', +1008=>'L', +1009=>'L', +1010=>'L', +1011=>'L', +1012=>'L', +1013=>'L', +1014=>'ON', +1015=>'L', +1016=>'L', +1017=>'L', +1018=>'L', +1019=>'L', +1020=>'L', +1021=>'L', +1022=>'L', +1023=>'L', +1024=>'L', +1025=>'L', +1026=>'L', +1027=>'L', +1028=>'L', +1029=>'L', +1030=>'L', +1031=>'L', +1032=>'L', +1033=>'L', +1034=>'L', +1035=>'L', +1036=>'L', +1037=>'L', +1038=>'L', +1039=>'L', +1040=>'L', +1041=>'L', +1042=>'L', +1043=>'L', +1044=>'L', +1045=>'L', +1046=>'L', +1047=>'L', +1048=>'L', +1049=>'L', +1050=>'L', +1051=>'L', +1052=>'L', +1053=>'L', +1054=>'L', +1055=>'L', +1056=>'L', +1057=>'L', +1058=>'L', +1059=>'L', +1060=>'L', +1061=>'L', +1062=>'L', +1063=>'L', +1064=>'L', +1065=>'L', +1066=>'L', +1067=>'L', +1068=>'L', +1069=>'L', +1070=>'L', +1071=>'L', +1072=>'L', +1073=>'L', +1074=>'L', +1075=>'L', +1076=>'L', +1077=>'L', +1078=>'L', +1079=>'L', +1080=>'L', +1081=>'L', +1082=>'L', +1083=>'L', +1084=>'L', +1085=>'L', +1086=>'L', +1087=>'L', +1088=>'L', +1089=>'L', +1090=>'L', +1091=>'L', +1092=>'L', +1093=>'L', +1094=>'L', +1095=>'L', +1096=>'L', +1097=>'L', +1098=>'L', +1099=>'L', +1100=>'L', +1101=>'L', +1102=>'L', +1103=>'L', +1104=>'L', +1105=>'L', +1106=>'L', +1107=>'L', +1108=>'L', +1109=>'L', +1110=>'L', +1111=>'L', +1112=>'L', +1113=>'L', +1114=>'L', +1115=>'L', +1116=>'L', +1117=>'L', +1118=>'L', +1119=>'L', +1120=>'L', +1121=>'L', +1122=>'L', +1123=>'L', +1124=>'L', +1125=>'L', +1126=>'L', +1127=>'L', +1128=>'L', +1129=>'L', +1130=>'L', +1131=>'L', +1132=>'L', +1133=>'L', +1134=>'L', +1135=>'L', +1136=>'L', +1137=>'L', +1138=>'L', +1139=>'L', +1140=>'L', +1141=>'L', +1142=>'L', +1143=>'L', +1144=>'L', +1145=>'L', +1146=>'L', +1147=>'L', +1148=>'L', +1149=>'L', +1150=>'L', +1151=>'L', +1152=>'L', +1153=>'L', +1154=>'L', +1155=>'NSM', +1156=>'NSM', +1157=>'NSM', +1158=>'NSM', +1160=>'NSM', +1161=>'NSM', +1162=>'L', +1163=>'L', +1164=>'L', +1165=>'L', +1166=>'L', +1167=>'L', +1168=>'L', +1169=>'L', +1170=>'L', +1171=>'L', +1172=>'L', +1173=>'L', +1174=>'L', +1175=>'L', +1176=>'L', +1177=>'L', +1178=>'L', +1179=>'L', +1180=>'L', +1181=>'L', +1182=>'L', +1183=>'L', +1184=>'L', +1185=>'L', +1186=>'L', +1187=>'L', +1188=>'L', +1189=>'L', +1190=>'L', +1191=>'L', +1192=>'L', +1193=>'L', +1194=>'L', +1195=>'L', +1196=>'L', +1197=>'L', +1198=>'L', +1199=>'L', +1200=>'L', +1201=>'L', +1202=>'L', +1203=>'L', +1204=>'L', +1205=>'L', +1206=>'L', +1207=>'L', +1208=>'L', +1209=>'L', +1210=>'L', +1211=>'L', +1212=>'L', +1213=>'L', +1214=>'L', +1215=>'L', +1216=>'L', +1217=>'L', +1218=>'L', +1219=>'L', +1220=>'L', +1221=>'L', +1222=>'L', +1223=>'L', +1224=>'L', +1225=>'L', +1226=>'L', +1227=>'L', +1228=>'L', +1229=>'L', +1230=>'L', +1231=>'L', +1232=>'L', +1233=>'L', +1234=>'L', +1235=>'L', +1236=>'L', +1237=>'L', +1238=>'L', +1239=>'L', +1240=>'L', +1241=>'L', +1242=>'L', +1243=>'L', +1244=>'L', +1245=>'L', +1246=>'L', +1247=>'L', +1248=>'L', +1249=>'L', +1250=>'L', +1251=>'L', +1252=>'L', +1253=>'L', +1254=>'L', +1255=>'L', +1256=>'L', +1257=>'L', +1258=>'L', +1259=>'L', +1260=>'L', +1261=>'L', +1262=>'L', +1263=>'L', +1264=>'L', +1265=>'L', +1266=>'L', +1267=>'L', +1268=>'L', +1269=>'L', +1270=>'L', +1271=>'L', +1272=>'L', +1273=>'L', +1274=>'L', +1275=>'L', +1276=>'L', +1277=>'L', +1278=>'L', +1279=>'L', +1280=>'L', +1281=>'L', +1282=>'L', +1283=>'L', +1284=>'L', +1285=>'L', +1286=>'L', +1287=>'L', +1288=>'L', +1289=>'L', +1290=>'L', +1291=>'L', +1292=>'L', +1293=>'L', +1294=>'L', +1295=>'L', +1296=>'L', +1297=>'L', +1298=>'L', +1299=>'L', +1329=>'L', +1330=>'L', +1331=>'L', +1332=>'L', +1333=>'L', +1334=>'L', +1335=>'L', +1336=>'L', +1337=>'L', +1338=>'L', +1339=>'L', +1340=>'L', +1341=>'L', +1342=>'L', +1343=>'L', +1344=>'L', +1345=>'L', +1346=>'L', +1347=>'L', +1348=>'L', +1349=>'L', +1350=>'L', +1351=>'L', +1352=>'L', +1353=>'L', +1354=>'L', +1355=>'L', +1356=>'L', +1357=>'L', +1358=>'L', +1359=>'L', +1360=>'L', +1361=>'L', +1362=>'L', +1363=>'L', +1364=>'L', +1365=>'L', +1366=>'L', +1369=>'L', +1370=>'L', +1371=>'L', +1372=>'L', +1373=>'L', +1374=>'L', +1375=>'L', +1377=>'L', +1378=>'L', +1379=>'L', +1380=>'L', +1381=>'L', +1382=>'L', +1383=>'L', +1384=>'L', +1385=>'L', +1386=>'L', +1387=>'L', +1388=>'L', +1389=>'L', +1390=>'L', +1391=>'L', +1392=>'L', +1393=>'L', +1394=>'L', +1395=>'L', +1396=>'L', +1397=>'L', +1398=>'L', +1399=>'L', +1400=>'L', +1401=>'L', +1402=>'L', +1403=>'L', +1404=>'L', +1405=>'L', +1406=>'L', +1407=>'L', +1408=>'L', +1409=>'L', +1410=>'L', +1411=>'L', +1412=>'L', +1413=>'L', +1414=>'L', +1415=>'L', +1417=>'L', +1418=>'ON', +1425=>'NSM', +1426=>'NSM', +1427=>'NSM', +1428=>'NSM', +1429=>'NSM', +1430=>'NSM', +1431=>'NSM', +1432=>'NSM', +1433=>'NSM', +1434=>'NSM', +1435=>'NSM', +1436=>'NSM', +1437=>'NSM', +1438=>'NSM', +1439=>'NSM', +1440=>'NSM', +1441=>'NSM', +1442=>'NSM', +1443=>'NSM', +1444=>'NSM', +1445=>'NSM', +1446=>'NSM', +1447=>'NSM', +1448=>'NSM', +1449=>'NSM', +1450=>'NSM', +1451=>'NSM', +1452=>'NSM', +1453=>'NSM', +1454=>'NSM', +1455=>'NSM', +1456=>'NSM', +1457=>'NSM', +1458=>'NSM', +1459=>'NSM', +1460=>'NSM', +1461=>'NSM', +1462=>'NSM', +1463=>'NSM', +1464=>'NSM', +1465=>'NSM', +1466=>'NSM', +1467=>'NSM', +1468=>'NSM', +1469=>'NSM', +1470=>'R', +1471=>'NSM', +1472=>'R', +1473=>'NSM', +1474=>'NSM', +1475=>'R', +1476=>'NSM', +1477=>'NSM', +1478=>'R', +1479=>'NSM', +1488=>'R', +1489=>'R', +1490=>'R', +1491=>'R', +1492=>'R', +1493=>'R', +1494=>'R', +1495=>'R', +1496=>'R', +1497=>'R', +1498=>'R', +1499=>'R', +1500=>'R', +1501=>'R', +1502=>'R', +1503=>'R', +1504=>'R', +1505=>'R', +1506=>'R', +1507=>'R', +1508=>'R', +1509=>'R', +1510=>'R', +1511=>'R', +1512=>'R', +1513=>'R', +1514=>'R', +1520=>'R', +1521=>'R', +1522=>'R', +1523=>'R', +1524=>'R', +1536=>'AL', +1537=>'AL', +1538=>'AL', +1539=>'AL', +1547=>'AL', +1548=>'CS', +1549=>'AL', +1550=>'ON', +1551=>'ON', +1552=>'NSM', +1553=>'NSM', +1554=>'NSM', +1555=>'NSM', +1556=>'NSM', +1557=>'NSM', +1563=>'AL', +1566=>'AL', +1567=>'AL', +1569=>'AL', +1570=>'AL', +1571=>'AL', +1572=>'AL', +1573=>'AL', +1574=>'AL', +1575=>'AL', +1576=>'AL', +1577=>'AL', +1578=>'AL', +1579=>'AL', +1580=>'AL', +1581=>'AL', +1582=>'AL', +1583=>'AL', +1584=>'AL', +1585=>'AL', +1586=>'AL', +1587=>'AL', +1588=>'AL', +1589=>'AL', +1590=>'AL', +1591=>'AL', +1592=>'AL', +1593=>'AL', +1594=>'AL', +1600=>'AL', +1601=>'AL', +1602=>'AL', +1603=>'AL', +1604=>'AL', +1605=>'AL', +1606=>'AL', +1607=>'AL', +1608=>'AL', +1609=>'AL', +1610=>'AL', +1611=>'NSM', +1612=>'NSM', +1613=>'NSM', +1614=>'NSM', +1615=>'NSM', +1616=>'NSM', +1617=>'NSM', +1618=>'NSM', +1619=>'NSM', +1620=>'NSM', +1621=>'NSM', +1622=>'NSM', +1623=>'NSM', +1624=>'NSM', +1625=>'NSM', +1626=>'NSM', +1627=>'NSM', +1628=>'NSM', +1629=>'NSM', +1630=>'NSM', +1632=>'AN', +1633=>'AN', +1634=>'AN', +1635=>'AN', +1636=>'AN', +1637=>'AN', +1638=>'AN', +1639=>'AN', +1640=>'AN', +1641=>'AN', +1642=>'ET', +1643=>'AN', +1644=>'AN', +1645=>'AL', +1646=>'AL', +1647=>'AL', +1648=>'NSM', +1649=>'AL', +1650=>'AL', +1651=>'AL', +1652=>'AL', +1653=>'AL', +1654=>'AL', +1655=>'AL', +1656=>'AL', +1657=>'AL', +1658=>'AL', +1659=>'AL', +1660=>'AL', +1661=>'AL', +1662=>'AL', +1663=>'AL', +1664=>'AL', +1665=>'AL', +1666=>'AL', +1667=>'AL', +1668=>'AL', +1669=>'AL', +1670=>'AL', +1671=>'AL', +1672=>'AL', +1673=>'AL', +1674=>'AL', +1675=>'AL', +1676=>'AL', +1677=>'AL', +1678=>'AL', +1679=>'AL', +1680=>'AL', +1681=>'AL', +1682=>'AL', +1683=>'AL', +1684=>'AL', +1685=>'AL', +1686=>'AL', +1687=>'AL', +1688=>'AL', +1689=>'AL', +1690=>'AL', +1691=>'AL', +1692=>'AL', +1693=>'AL', +1694=>'AL', +1695=>'AL', +1696=>'AL', +1697=>'AL', +1698=>'AL', +1699=>'AL', +1700=>'AL', +1701=>'AL', +1702=>'AL', +1703=>'AL', +1704=>'AL', +1705=>'AL', +1706=>'AL', +1707=>'AL', +1708=>'AL', +1709=>'AL', +1710=>'AL', +1711=>'AL', +1712=>'AL', +1713=>'AL', +1714=>'AL', +1715=>'AL', +1716=>'AL', +1717=>'AL', +1718=>'AL', +1719=>'AL', +1720=>'AL', +1721=>'AL', +1722=>'AL', +1723=>'AL', +1724=>'AL', +1725=>'AL', +1726=>'AL', +1727=>'AL', +1728=>'AL', +1729=>'AL', +1730=>'AL', +1731=>'AL', +1732=>'AL', +1733=>'AL', +1734=>'AL', +1735=>'AL', +1736=>'AL', +1737=>'AL', +1738=>'AL', +1739=>'AL', +1740=>'AL', +1741=>'AL', +1742=>'AL', +1743=>'AL', +1744=>'AL', +1745=>'AL', +1746=>'AL', +1747=>'AL', +1748=>'AL', +1749=>'AL', +1750=>'NSM', +1751=>'NSM', +1752=>'NSM', +1753=>'NSM', +1754=>'NSM', +1755=>'NSM', +1756=>'NSM', +1757=>'AL', +1758=>'NSM', +1759=>'NSM', +1760=>'NSM', +1761=>'NSM', +1762=>'NSM', +1763=>'NSM', +1764=>'NSM', +1765=>'AL', +1766=>'AL', +1767=>'NSM', +1768=>'NSM', +1769=>'ON', +1770=>'NSM', +1771=>'NSM', +1772=>'NSM', +1773=>'NSM', +1774=>'AL', +1775=>'AL', +1776=>'EN', +1777=>'EN', +1778=>'EN', +1779=>'EN', +1780=>'EN', +1781=>'EN', +1782=>'EN', +1783=>'EN', +1784=>'EN', +1785=>'EN', +1786=>'AL', +1787=>'AL', +1788=>'AL', +1789=>'AL', +1790=>'AL', +1791=>'AL', +1792=>'AL', +1793=>'AL', +1794=>'AL', +1795=>'AL', +1796=>'AL', +1797=>'AL', +1798=>'AL', +1799=>'AL', +1800=>'AL', +1801=>'AL', +1802=>'AL', +1803=>'AL', +1804=>'AL', +1805=>'AL', +1807=>'BN', +1808=>'AL', +1809=>'NSM', +1810=>'AL', +1811=>'AL', +1812=>'AL', +1813=>'AL', +1814=>'AL', +1815=>'AL', +1816=>'AL', +1817=>'AL', +1818=>'AL', +1819=>'AL', +1820=>'AL', +1821=>'AL', +1822=>'AL', +1823=>'AL', +1824=>'AL', +1825=>'AL', +1826=>'AL', +1827=>'AL', +1828=>'AL', +1829=>'AL', +1830=>'AL', +1831=>'AL', +1832=>'AL', +1833=>'AL', +1834=>'AL', +1835=>'AL', +1836=>'AL', +1837=>'AL', +1838=>'AL', +1839=>'AL', +1840=>'NSM', +1841=>'NSM', +1842=>'NSM', +1843=>'NSM', +1844=>'NSM', +1845=>'NSM', +1846=>'NSM', +1847=>'NSM', +1848=>'NSM', +1849=>'NSM', +1850=>'NSM', +1851=>'NSM', +1852=>'NSM', +1853=>'NSM', +1854=>'NSM', +1855=>'NSM', +1856=>'NSM', +1857=>'NSM', +1858=>'NSM', +1859=>'NSM', +1860=>'NSM', +1861=>'NSM', +1862=>'NSM', +1863=>'NSM', +1864=>'NSM', +1865=>'NSM', +1866=>'NSM', +1869=>'AL', +1870=>'AL', +1871=>'AL', +1872=>'AL', +1873=>'AL', +1874=>'AL', +1875=>'AL', +1876=>'AL', +1877=>'AL', +1878=>'AL', +1879=>'AL', +1880=>'AL', +1881=>'AL', +1882=>'AL', +1883=>'AL', +1884=>'AL', +1885=>'AL', +1886=>'AL', +1887=>'AL', +1888=>'AL', +1889=>'AL', +1890=>'AL', +1891=>'AL', +1892=>'AL', +1893=>'AL', +1894=>'AL', +1895=>'AL', +1896=>'AL', +1897=>'AL', +1898=>'AL', +1899=>'AL', +1900=>'AL', +1901=>'AL', +1920=>'AL', +1921=>'AL', +1922=>'AL', +1923=>'AL', +1924=>'AL', +1925=>'AL', +1926=>'AL', +1927=>'AL', +1928=>'AL', +1929=>'AL', +1930=>'AL', +1931=>'AL', +1932=>'AL', +1933=>'AL', +1934=>'AL', +1935=>'AL', +1936=>'AL', +1937=>'AL', +1938=>'AL', +1939=>'AL', +1940=>'AL', +1941=>'AL', +1942=>'AL', +1943=>'AL', +1944=>'AL', +1945=>'AL', +1946=>'AL', +1947=>'AL', +1948=>'AL', +1949=>'AL', +1950=>'AL', +1951=>'AL', +1952=>'AL', +1953=>'AL', +1954=>'AL', +1955=>'AL', +1956=>'AL', +1957=>'AL', +1958=>'NSM', +1959=>'NSM', +1960=>'NSM', +1961=>'NSM', +1962=>'NSM', +1963=>'NSM', +1964=>'NSM', +1965=>'NSM', +1966=>'NSM', +1967=>'NSM', +1968=>'NSM', +1969=>'AL', +1984=>'R', +1985=>'R', +1986=>'R', +1987=>'R', +1988=>'R', +1989=>'R', +1990=>'R', +1991=>'R', +1992=>'R', +1993=>'R', +1994=>'R', +1995=>'R', +1996=>'R', +1997=>'R', +1998=>'R', +1999=>'R', +2000=>'R', +2001=>'R', +2002=>'R', +2003=>'R', +2004=>'R', +2005=>'R', +2006=>'R', +2007=>'R', +2008=>'R', +2009=>'R', +2010=>'R', +2011=>'R', +2012=>'R', +2013=>'R', +2014=>'R', +2015=>'R', +2016=>'R', +2017=>'R', +2018=>'R', +2019=>'R', +2020=>'R', +2021=>'R', +2022=>'R', +2023=>'R', +2024=>'R', +2025=>'R', +2026=>'R', +2027=>'NSM', +2028=>'NSM', +2029=>'NSM', +2030=>'NSM', +2031=>'NSM', +2032=>'NSM', +2033=>'NSM', +2034=>'NSM', +2035=>'NSM', +2036=>'R', +2037=>'R', +2038=>'ON', +2039=>'ON', +2040=>'ON', +2041=>'ON', +2042=>'R', +2305=>'NSM', +2306=>'NSM', +2307=>'L', +2308=>'L', +2309=>'L', +2310=>'L', +2311=>'L', +2312=>'L', +2313=>'L', +2314=>'L', +2315=>'L', +2316=>'L', +2317=>'L', +2318=>'L', +2319=>'L', +2320=>'L', +2321=>'L', +2322=>'L', +2323=>'L', +2324=>'L', +2325=>'L', +2326=>'L', +2327=>'L', +2328=>'L', +2329=>'L', +2330=>'L', +2331=>'L', +2332=>'L', +2333=>'L', +2334=>'L', +2335=>'L', +2336=>'L', +2337=>'L', +2338=>'L', +2339=>'L', +2340=>'L', +2341=>'L', +2342=>'L', +2343=>'L', +2344=>'L', +2345=>'L', +2346=>'L', +2347=>'L', +2348=>'L', +2349=>'L', +2350=>'L', +2351=>'L', +2352=>'L', +2353=>'L', +2354=>'L', +2355=>'L', +2356=>'L', +2357=>'L', +2358=>'L', +2359=>'L', +2360=>'L', +2361=>'L', +2364=>'NSM', +2365=>'L', +2366=>'L', +2367=>'L', +2368=>'L', +2369=>'NSM', +2370=>'NSM', +2371=>'NSM', +2372=>'NSM', +2373=>'NSM', +2374=>'NSM', +2375=>'NSM', +2376=>'NSM', +2377=>'L', +2378=>'L', +2379=>'L', +2380=>'L', +2381=>'NSM', +2384=>'L', +2385=>'NSM', +2386=>'NSM', +2387=>'NSM', +2388=>'NSM', +2392=>'L', +2393=>'L', +2394=>'L', +2395=>'L', +2396=>'L', +2397=>'L', +2398=>'L', +2399=>'L', +2400=>'L', +2401=>'L', +2402=>'NSM', +2403=>'NSM', +2404=>'L', +2405=>'L', +2406=>'L', +2407=>'L', +2408=>'L', +2409=>'L', +2410=>'L', +2411=>'L', +2412=>'L', +2413=>'L', +2414=>'L', +2415=>'L', +2416=>'L', +2427=>'L', +2428=>'L', +2429=>'L', +2430=>'L', +2431=>'L', +2433=>'NSM', +2434=>'L', +2435=>'L', +2437=>'L', +2438=>'L', +2439=>'L', +2440=>'L', +2441=>'L', +2442=>'L', +2443=>'L', +2444=>'L', +2447=>'L', +2448=>'L', +2451=>'L', +2452=>'L', +2453=>'L', +2454=>'L', +2455=>'L', +2456=>'L', +2457=>'L', +2458=>'L', +2459=>'L', +2460=>'L', +2461=>'L', +2462=>'L', +2463=>'L', +2464=>'L', +2465=>'L', +2466=>'L', +2467=>'L', +2468=>'L', +2469=>'L', +2470=>'L', +2471=>'L', +2472=>'L', +2474=>'L', +2475=>'L', +2476=>'L', +2477=>'L', +2478=>'L', +2479=>'L', +2480=>'L', +2482=>'L', +2486=>'L', +2487=>'L', +2488=>'L', +2489=>'L', +2492=>'NSM', +2493=>'L', +2494=>'L', +2495=>'L', +2496=>'L', +2497=>'NSM', +2498=>'NSM', +2499=>'NSM', +2500=>'NSM', +2503=>'L', +2504=>'L', +2507=>'L', +2508=>'L', +2509=>'NSM', +2510=>'L', +2519=>'L', +2524=>'L', +2525=>'L', +2527=>'L', +2528=>'L', +2529=>'L', +2530=>'NSM', +2531=>'NSM', +2534=>'L', +2535=>'L', +2536=>'L', +2537=>'L', +2538=>'L', +2539=>'L', +2540=>'L', +2541=>'L', +2542=>'L', +2543=>'L', +2544=>'L', +2545=>'L', +2546=>'ET', +2547=>'ET', +2548=>'L', +2549=>'L', +2550=>'L', +2551=>'L', +2552=>'L', +2553=>'L', +2554=>'L', +2561=>'NSM', +2562=>'NSM', +2563=>'L', +2565=>'L', +2566=>'L', +2567=>'L', +2568=>'L', +2569=>'L', +2570=>'L', +2575=>'L', +2576=>'L', +2579=>'L', +2580=>'L', +2581=>'L', +2582=>'L', +2583=>'L', +2584=>'L', +2585=>'L', +2586=>'L', +2587=>'L', +2588=>'L', +2589=>'L', +2590=>'L', +2591=>'L', +2592=>'L', +2593=>'L', +2594=>'L', +2595=>'L', +2596=>'L', +2597=>'L', +2598=>'L', +2599=>'L', +2600=>'L', +2602=>'L', +2603=>'L', +2604=>'L', +2605=>'L', +2606=>'L', +2607=>'L', +2608=>'L', +2610=>'L', +2611=>'L', +2613=>'L', +2614=>'L', +2616=>'L', +2617=>'L', +2620=>'NSM', +2622=>'L', +2623=>'L', +2624=>'L', +2625=>'NSM', +2626=>'NSM', +2631=>'NSM', +2632=>'NSM', +2635=>'NSM', +2636=>'NSM', +2637=>'NSM', +2649=>'L', +2650=>'L', +2651=>'L', +2652=>'L', +2654=>'L', +2662=>'L', +2663=>'L', +2664=>'L', +2665=>'L', +2666=>'L', +2667=>'L', +2668=>'L', +2669=>'L', +2670=>'L', +2671=>'L', +2672=>'NSM', +2673=>'NSM', +2674=>'L', +2675=>'L', +2676=>'L', +2689=>'NSM', +2690=>'NSM', +2691=>'L', +2693=>'L', +2694=>'L', +2695=>'L', +2696=>'L', +2697=>'L', +2698=>'L', +2699=>'L', +2700=>'L', +2701=>'L', +2703=>'L', +2704=>'L', +2705=>'L', +2707=>'L', +2708=>'L', +2709=>'L', +2710=>'L', +2711=>'L', +2712=>'L', +2713=>'L', +2714=>'L', +2715=>'L', +2716=>'L', +2717=>'L', +2718=>'L', +2719=>'L', +2720=>'L', +2721=>'L', +2722=>'L', +2723=>'L', +2724=>'L', +2725=>'L', +2726=>'L', +2727=>'L', +2728=>'L', +2730=>'L', +2731=>'L', +2732=>'L', +2733=>'L', +2734=>'L', +2735=>'L', +2736=>'L', +2738=>'L', +2739=>'L', +2741=>'L', +2742=>'L', +2743=>'L', +2744=>'L', +2745=>'L', +2748=>'NSM', +2749=>'L', +2750=>'L', +2751=>'L', +2752=>'L', +2753=>'NSM', +2754=>'NSM', +2755=>'NSM', +2756=>'NSM', +2757=>'NSM', +2759=>'NSM', +2760=>'NSM', +2761=>'L', +2763=>'L', +2764=>'L', +2765=>'NSM', +2768=>'L', +2784=>'L', +2785=>'L', +2786=>'NSM', +2787=>'NSM', +2790=>'L', +2791=>'L', +2792=>'L', +2793=>'L', +2794=>'L', +2795=>'L', +2796=>'L', +2797=>'L', +2798=>'L', +2799=>'L', +2801=>'ET', +2817=>'NSM', +2818=>'L', +2819=>'L', +2821=>'L', +2822=>'L', +2823=>'L', +2824=>'L', +2825=>'L', +2826=>'L', +2827=>'L', +2828=>'L', +2831=>'L', +2832=>'L', +2835=>'L', +2836=>'L', +2837=>'L', +2838=>'L', +2839=>'L', +2840=>'L', +2841=>'L', +2842=>'L', +2843=>'L', +2844=>'L', +2845=>'L', +2846=>'L', +2847=>'L', +2848=>'L', +2849=>'L', +2850=>'L', +2851=>'L', +2852=>'L', +2853=>'L', +2854=>'L', +2855=>'L', +2856=>'L', +2858=>'L', +2859=>'L', +2860=>'L', +2861=>'L', +2862=>'L', +2863=>'L', +2864=>'L', +2866=>'L', +2867=>'L', +2869=>'L', +2870=>'L', +2871=>'L', +2872=>'L', +2873=>'L', +2876=>'NSM', +2877=>'L', +2878=>'L', +2879=>'NSM', +2880=>'L', +2881=>'NSM', +2882=>'NSM', +2883=>'NSM', +2887=>'L', +2888=>'L', +2891=>'L', +2892=>'L', +2893=>'NSM', +2902=>'NSM', +2903=>'L', +2908=>'L', +2909=>'L', +2911=>'L', +2912=>'L', +2913=>'L', +2918=>'L', +2919=>'L', +2920=>'L', +2921=>'L', +2922=>'L', +2923=>'L', +2924=>'L', +2925=>'L', +2926=>'L', +2927=>'L', +2928=>'L', +2929=>'L', +2946=>'NSM', +2947=>'L', +2949=>'L', +2950=>'L', +2951=>'L', +2952=>'L', +2953=>'L', +2954=>'L', +2958=>'L', +2959=>'L', +2960=>'L', +2962=>'L', +2963=>'L', +2964=>'L', +2965=>'L', +2969=>'L', +2970=>'L', +2972=>'L', +2974=>'L', +2975=>'L', +2979=>'L', +2980=>'L', +2984=>'L', +2985=>'L', +2986=>'L', +2990=>'L', +2991=>'L', +2992=>'L', +2993=>'L', +2994=>'L', +2995=>'L', +2996=>'L', +2997=>'L', +2998=>'L', +2999=>'L', +3000=>'L', +3001=>'L', +3006=>'L', +3007=>'L', +3008=>'NSM', +3009=>'L', +3010=>'L', +3014=>'L', +3015=>'L', +3016=>'L', +3018=>'L', +3019=>'L', +3020=>'L', +3021=>'NSM', +3031=>'L', +3046=>'L', +3047=>'L', +3048=>'L', +3049=>'L', +3050=>'L', +3051=>'L', +3052=>'L', +3053=>'L', +3054=>'L', +3055=>'L', +3056=>'L', +3057=>'L', +3058=>'L', +3059=>'ON', +3060=>'ON', +3061=>'ON', +3062=>'ON', +3063=>'ON', +3064=>'ON', +3065=>'ET', +3066=>'ON', +3073=>'L', +3074=>'L', +3075=>'L', +3077=>'L', +3078=>'L', +3079=>'L', +3080=>'L', +3081=>'L', +3082=>'L', +3083=>'L', +3084=>'L', +3086=>'L', +3087=>'L', +3088=>'L', +3090=>'L', +3091=>'L', +3092=>'L', +3093=>'L', +3094=>'L', +3095=>'L', +3096=>'L', +3097=>'L', +3098=>'L', +3099=>'L', +3100=>'L', +3101=>'L', +3102=>'L', +3103=>'L', +3104=>'L', +3105=>'L', +3106=>'L', +3107=>'L', +3108=>'L', +3109=>'L', +3110=>'L', +3111=>'L', +3112=>'L', +3114=>'L', +3115=>'L', +3116=>'L', +3117=>'L', +3118=>'L', +3119=>'L', +3120=>'L', +3121=>'L', +3122=>'L', +3123=>'L', +3125=>'L', +3126=>'L', +3127=>'L', +3128=>'L', +3129=>'L', +3134=>'NSM', +3135=>'NSM', +3136=>'NSM', +3137=>'L', +3138=>'L', +3139=>'L', +3140=>'L', +3142=>'NSM', +3143=>'NSM', +3144=>'NSM', +3146=>'NSM', +3147=>'NSM', +3148=>'NSM', +3149=>'NSM', +3157=>'NSM', +3158=>'NSM', +3168=>'L', +3169=>'L', +3174=>'L', +3175=>'L', +3176=>'L', +3177=>'L', +3178=>'L', +3179=>'L', +3180=>'L', +3181=>'L', +3182=>'L', +3183=>'L', +3202=>'L', +3203=>'L', +3205=>'L', +3206=>'L', +3207=>'L', +3208=>'L', +3209=>'L', +3210=>'L', +3211=>'L', +3212=>'L', +3214=>'L', +3215=>'L', +3216=>'L', +3218=>'L', +3219=>'L', +3220=>'L', +3221=>'L', +3222=>'L', +3223=>'L', +3224=>'L', +3225=>'L', +3226=>'L', +3227=>'L', +3228=>'L', +3229=>'L', +3230=>'L', +3231=>'L', +3232=>'L', +3233=>'L', +3234=>'L', +3235=>'L', +3236=>'L', +3237=>'L', +3238=>'L', +3239=>'L', +3240=>'L', +3242=>'L', +3243=>'L', +3244=>'L', +3245=>'L', +3246=>'L', +3247=>'L', +3248=>'L', +3249=>'L', +3250=>'L', +3251=>'L', +3253=>'L', +3254=>'L', +3255=>'L', +3256=>'L', +3257=>'L', +3260=>'NSM', +3261=>'L', +3262=>'L', +3263=>'L', +3264=>'L', +3265=>'L', +3266=>'L', +3267=>'L', +3268=>'L', +3270=>'L', +3271=>'L', +3272=>'L', +3274=>'L', +3275=>'L', +3276=>'NSM', +3277=>'NSM', +3285=>'L', +3286=>'L', +3294=>'L', +3296=>'L', +3297=>'L', +3298=>'NSM', +3299=>'NSM', +3302=>'L', +3303=>'L', +3304=>'L', +3305=>'L', +3306=>'L', +3307=>'L', +3308=>'L', +3309=>'L', +3310=>'L', +3311=>'L', +3313=>'ON', +3314=>'ON', +3330=>'L', +3331=>'L', +3333=>'L', +3334=>'L', +3335=>'L', +3336=>'L', +3337=>'L', +3338=>'L', +3339=>'L', +3340=>'L', +3342=>'L', +3343=>'L', +3344=>'L', +3346=>'L', +3347=>'L', +3348=>'L', +3349=>'L', +3350=>'L', +3351=>'L', +3352=>'L', +3353=>'L', +3354=>'L', +3355=>'L', +3356=>'L', +3357=>'L', +3358=>'L', +3359=>'L', +3360=>'L', +3361=>'L', +3362=>'L', +3363=>'L', +3364=>'L', +3365=>'L', +3366=>'L', +3367=>'L', +3368=>'L', +3370=>'L', +3371=>'L', +3372=>'L', +3373=>'L', +3374=>'L', +3375=>'L', +3376=>'L', +3377=>'L', +3378=>'L', +3379=>'L', +3380=>'L', +3381=>'L', +3382=>'L', +3383=>'L', +3384=>'L', +3385=>'L', +3390=>'L', +3391=>'L', +3392=>'L', +3393=>'NSM', +3394=>'NSM', +3395=>'NSM', +3398=>'L', +3399=>'L', +3400=>'L', +3402=>'L', +3403=>'L', +3404=>'L', +3405=>'NSM', +3415=>'L', +3424=>'L', +3425=>'L', +3430=>'L', +3431=>'L', +3432=>'L', +3433=>'L', +3434=>'L', +3435=>'L', +3436=>'L', +3437=>'L', +3438=>'L', +3439=>'L', +3458=>'L', +3459=>'L', +3461=>'L', +3462=>'L', +3463=>'L', +3464=>'L', +3465=>'L', +3466=>'L', +3467=>'L', +3468=>'L', +3469=>'L', +3470=>'L', +3471=>'L', +3472=>'L', +3473=>'L', +3474=>'L', +3475=>'L', +3476=>'L', +3477=>'L', +3478=>'L', +3482=>'L', +3483=>'L', +3484=>'L', +3485=>'L', +3486=>'L', +3487=>'L', +3488=>'L', +3489=>'L', +3490=>'L', +3491=>'L', +3492=>'L', +3493=>'L', +3494=>'L', +3495=>'L', +3496=>'L', +3497=>'L', +3498=>'L', +3499=>'L', +3500=>'L', +3501=>'L', +3502=>'L', +3503=>'L', +3504=>'L', +3505=>'L', +3507=>'L', +3508=>'L', +3509=>'L', +3510=>'L', +3511=>'L', +3512=>'L', +3513=>'L', +3514=>'L', +3515=>'L', +3517=>'L', +3520=>'L', +3521=>'L', +3522=>'L', +3523=>'L', +3524=>'L', +3525=>'L', +3526=>'L', +3530=>'NSM', +3535=>'L', +3536=>'L', +3537=>'L', +3538=>'NSM', +3539=>'NSM', +3540=>'NSM', +3542=>'NSM', +3544=>'L', +3545=>'L', +3546=>'L', +3547=>'L', +3548=>'L', +3549=>'L', +3550=>'L', +3551=>'L', +3570=>'L', +3571=>'L', +3572=>'L', +3585=>'L', +3586=>'L', +3587=>'L', +3588=>'L', +3589=>'L', +3590=>'L', +3591=>'L', +3592=>'L', +3593=>'L', +3594=>'L', +3595=>'L', +3596=>'L', +3597=>'L', +3598=>'L', +3599=>'L', +3600=>'L', +3601=>'L', +3602=>'L', +3603=>'L', +3604=>'L', +3605=>'L', +3606=>'L', +3607=>'L', +3608=>'L', +3609=>'L', +3610=>'L', +3611=>'L', +3612=>'L', +3613=>'L', +3614=>'L', +3615=>'L', +3616=>'L', +3617=>'L', +3618=>'L', +3619=>'L', +3620=>'L', +3621=>'L', +3622=>'L', +3623=>'L', +3624=>'L', +3625=>'L', +3626=>'L', +3627=>'L', +3628=>'L', +3629=>'L', +3630=>'L', +3631=>'L', +3632=>'L', +3633=>'NSM', +3634=>'L', +3635=>'L', +3636=>'NSM', +3637=>'NSM', +3638=>'NSM', +3639=>'NSM', +3640=>'NSM', +3641=>'NSM', +3642=>'NSM', +3647=>'ET', +3648=>'L', +3649=>'L', +3650=>'L', +3651=>'L', +3652=>'L', +3653=>'L', +3654=>'L', +3655=>'NSM', +3656=>'NSM', +3657=>'NSM', +3658=>'NSM', +3659=>'NSM', +3660=>'NSM', +3661=>'NSM', +3662=>'NSM', +3663=>'L', +3664=>'L', +3665=>'L', +3666=>'L', +3667=>'L', +3668=>'L', +3669=>'L', +3670=>'L', +3671=>'L', +3672=>'L', +3673=>'L', +3674=>'L', +3675=>'L', +3713=>'L', +3714=>'L', +3716=>'L', +3719=>'L', +3720=>'L', +3722=>'L', +3725=>'L', +3732=>'L', +3733=>'L', +3734=>'L', +3735=>'L', +3737=>'L', +3738=>'L', +3739=>'L', +3740=>'L', +3741=>'L', +3742=>'L', +3743=>'L', +3745=>'L', +3746=>'L', +3747=>'L', +3749=>'L', +3751=>'L', +3754=>'L', +3755=>'L', +3757=>'L', +3758=>'L', +3759=>'L', +3760=>'L', +3761=>'NSM', +3762=>'L', +3763=>'L', +3764=>'NSM', +3765=>'NSM', +3766=>'NSM', +3767=>'NSM', +3768=>'NSM', +3769=>'NSM', +3771=>'NSM', +3772=>'NSM', +3773=>'L', +3776=>'L', +3777=>'L', +3778=>'L', +3779=>'L', +3780=>'L', +3782=>'L', +3784=>'NSM', +3785=>'NSM', +3786=>'NSM', +3787=>'NSM', +3788=>'NSM', +3789=>'NSM', +3792=>'L', +3793=>'L', +3794=>'L', +3795=>'L', +3796=>'L', +3797=>'L', +3798=>'L', +3799=>'L', +3800=>'L', +3801=>'L', +3804=>'L', +3805=>'L', +3840=>'L', +3841=>'L', +3842=>'L', +3843=>'L', +3844=>'L', +3845=>'L', +3846=>'L', +3847=>'L', +3848=>'L', +3849=>'L', +3850=>'L', +3851=>'L', +3852=>'L', +3853=>'L', +3854=>'L', +3855=>'L', +3856=>'L', +3857=>'L', +3858=>'L', +3859=>'L', +3860=>'L', +3861=>'L', +3862=>'L', +3863=>'L', +3864=>'NSM', +3865=>'NSM', +3866=>'L', +3867=>'L', +3868=>'L', +3869=>'L', +3870=>'L', +3871=>'L', +3872=>'L', +3873=>'L', +3874=>'L', +3875=>'L', +3876=>'L', +3877=>'L', +3878=>'L', +3879=>'L', +3880=>'L', +3881=>'L', +3882=>'L', +3883=>'L', +3884=>'L', +3885=>'L', +3886=>'L', +3887=>'L', +3888=>'L', +3889=>'L', +3890=>'L', +3891=>'L', +3892=>'L', +3893=>'NSM', +3894=>'L', +3895=>'NSM', +3896=>'L', +3897=>'NSM', +3898=>'ON', +3899=>'ON', +3900=>'ON', +3901=>'ON', +3902=>'L', +3903=>'L', +3904=>'L', +3905=>'L', +3906=>'L', +3907=>'L', +3908=>'L', +3909=>'L', +3910=>'L', +3911=>'L', +3913=>'L', +3914=>'L', +3915=>'L', +3916=>'L', +3917=>'L', +3918=>'L', +3919=>'L', +3920=>'L', +3921=>'L', +3922=>'L', +3923=>'L', +3924=>'L', +3925=>'L', +3926=>'L', +3927=>'L', +3928=>'L', +3929=>'L', +3930=>'L', +3931=>'L', +3932=>'L', +3933=>'L', +3934=>'L', +3935=>'L', +3936=>'L', +3937=>'L', +3938=>'L', +3939=>'L', +3940=>'L', +3941=>'L', +3942=>'L', +3943=>'L', +3944=>'L', +3945=>'L', +3946=>'L', +3953=>'NSM', +3954=>'NSM', +3955=>'NSM', +3956=>'NSM', +3957=>'NSM', +3958=>'NSM', +3959=>'NSM', +3960=>'NSM', +3961=>'NSM', +3962=>'NSM', +3963=>'NSM', +3964=>'NSM', +3965=>'NSM', +3966=>'NSM', +3967=>'L', +3968=>'NSM', +3969=>'NSM', +3970=>'NSM', +3971=>'NSM', +3972=>'NSM', +3973=>'L', +3974=>'NSM', +3975=>'NSM', +3976=>'L', +3977=>'L', +3978=>'L', +3979=>'L', +3984=>'NSM', +3985=>'NSM', +3986=>'NSM', +3987=>'NSM', +3988=>'NSM', +3989=>'NSM', +3990=>'NSM', +3991=>'NSM', +3993=>'NSM', +3994=>'NSM', +3995=>'NSM', +3996=>'NSM', +3997=>'NSM', +3998=>'NSM', +3999=>'NSM', +4000=>'NSM', +4001=>'NSM', +4002=>'NSM', +4003=>'NSM', +4004=>'NSM', +4005=>'NSM', +4006=>'NSM', +4007=>'NSM', +4008=>'NSM', +4009=>'NSM', +4010=>'NSM', +4011=>'NSM', +4012=>'NSM', +4013=>'NSM', +4014=>'NSM', +4015=>'NSM', +4016=>'NSM', +4017=>'NSM', +4018=>'NSM', +4019=>'NSM', +4020=>'NSM', +4021=>'NSM', +4022=>'NSM', +4023=>'NSM', +4024=>'NSM', +4025=>'NSM', +4026=>'NSM', +4027=>'NSM', +4028=>'NSM', +4030=>'L', +4031=>'L', +4032=>'L', +4033=>'L', +4034=>'L', +4035=>'L', +4036=>'L', +4037=>'L', +4038=>'NSM', +4039=>'L', +4040=>'L', +4041=>'L', +4042=>'L', +4043=>'L', +4044=>'L', +4047=>'L', +4048=>'L', +4049=>'L', +4096=>'L', +4097=>'L', +4098=>'L', +4099=>'L', +4100=>'L', +4101=>'L', +4102=>'L', +4103=>'L', +4104=>'L', +4105=>'L', +4106=>'L', +4107=>'L', +4108=>'L', +4109=>'L', +4110=>'L', +4111=>'L', +4112=>'L', +4113=>'L', +4114=>'L', +4115=>'L', +4116=>'L', +4117=>'L', +4118=>'L', +4119=>'L', +4120=>'L', +4121=>'L', +4122=>'L', +4123=>'L', +4124=>'L', +4125=>'L', +4126=>'L', +4127=>'L', +4128=>'L', +4129=>'L', +4131=>'L', +4132=>'L', +4133=>'L', +4134=>'L', +4135=>'L', +4137=>'L', +4138=>'L', +4140=>'L', +4141=>'NSM', +4142=>'NSM', +4143=>'NSM', +4144=>'NSM', +4145=>'L', +4146=>'NSM', +4150=>'NSM', +4151=>'NSM', +4152=>'L', +4153=>'NSM', +4160=>'L', +4161=>'L', +4162=>'L', +4163=>'L', +4164=>'L', +4165=>'L', +4166=>'L', +4167=>'L', +4168=>'L', +4169=>'L', +4170=>'L', +4171=>'L', +4172=>'L', +4173=>'L', +4174=>'L', +4175=>'L', +4176=>'L', +4177=>'L', +4178=>'L', +4179=>'L', +4180=>'L', +4181=>'L', +4182=>'L', +4183=>'L', +4184=>'NSM', +4185=>'NSM', +4256=>'L', +4257=>'L', +4258=>'L', +4259=>'L', +4260=>'L', +4261=>'L', +4262=>'L', +4263=>'L', +4264=>'L', +4265=>'L', +4266=>'L', +4267=>'L', +4268=>'L', +4269=>'L', +4270=>'L', +4271=>'L', +4272=>'L', +4273=>'L', +4274=>'L', +4275=>'L', +4276=>'L', +4277=>'L', +4278=>'L', +4279=>'L', +4280=>'L', +4281=>'L', +4282=>'L', +4283=>'L', +4284=>'L', +4285=>'L', +4286=>'L', +4287=>'L', +4288=>'L', +4289=>'L', +4290=>'L', +4291=>'L', +4292=>'L', +4293=>'L', +4304=>'L', +4305=>'L', +4306=>'L', +4307=>'L', +4308=>'L', +4309=>'L', +4310=>'L', +4311=>'L', +4312=>'L', +4313=>'L', +4314=>'L', +4315=>'L', +4316=>'L', +4317=>'L', +4318=>'L', +4319=>'L', +4320=>'L', +4321=>'L', +4322=>'L', +4323=>'L', +4324=>'L', +4325=>'L', +4326=>'L', +4327=>'L', +4328=>'L', +4329=>'L', +4330=>'L', +4331=>'L', +4332=>'L', +4333=>'L', +4334=>'L', +4335=>'L', +4336=>'L', +4337=>'L', +4338=>'L', +4339=>'L', +4340=>'L', +4341=>'L', +4342=>'L', +4343=>'L', +4344=>'L', +4345=>'L', +4346=>'L', +4347=>'L', +4348=>'L', +4352=>'L', +4353=>'L', +4354=>'L', +4355=>'L', +4356=>'L', +4357=>'L', +4358=>'L', +4359=>'L', +4360=>'L', +4361=>'L', +4362=>'L', +4363=>'L', +4364=>'L', +4365=>'L', +4366=>'L', +4367=>'L', +4368=>'L', +4369=>'L', +4370=>'L', +4371=>'L', +4372=>'L', +4373=>'L', +4374=>'L', +4375=>'L', +4376=>'L', +4377=>'L', +4378=>'L', +4379=>'L', +4380=>'L', +4381=>'L', +4382=>'L', +4383=>'L', +4384=>'L', +4385=>'L', +4386=>'L', +4387=>'L', +4388=>'L', +4389=>'L', +4390=>'L', +4391=>'L', +4392=>'L', +4393=>'L', +4394=>'L', +4395=>'L', +4396=>'L', +4397=>'L', +4398=>'L', +4399=>'L', +4400=>'L', +4401=>'L', +4402=>'L', +4403=>'L', +4404=>'L', +4405=>'L', +4406=>'L', +4407=>'L', +4408=>'L', +4409=>'L', +4410=>'L', +4411=>'L', +4412=>'L', +4413=>'L', +4414=>'L', +4415=>'L', +4416=>'L', +4417=>'L', +4418=>'L', +4419=>'L', +4420=>'L', +4421=>'L', +4422=>'L', +4423=>'L', +4424=>'L', +4425=>'L', +4426=>'L', +4427=>'L', +4428=>'L', +4429=>'L', +4430=>'L', +4431=>'L', +4432=>'L', +4433=>'L', +4434=>'L', +4435=>'L', +4436=>'L', +4437=>'L', +4438=>'L', +4439=>'L', +4440=>'L', +4441=>'L', +4447=>'L', +4448=>'L', +4449=>'L', +4450=>'L', +4451=>'L', +4452=>'L', +4453=>'L', +4454=>'L', +4455=>'L', +4456=>'L', +4457=>'L', +4458=>'L', +4459=>'L', +4460=>'L', +4461=>'L', +4462=>'L', +4463=>'L', +4464=>'L', +4465=>'L', +4466=>'L', +4467=>'L', +4468=>'L', +4469=>'L', +4470=>'L', +4471=>'L', +4472=>'L', +4473=>'L', +4474=>'L', +4475=>'L', +4476=>'L', +4477=>'L', +4478=>'L', +4479=>'L', +4480=>'L', +4481=>'L', +4482=>'L', +4483=>'L', +4484=>'L', +4485=>'L', +4486=>'L', +4487=>'L', +4488=>'L', +4489=>'L', +4490=>'L', +4491=>'L', +4492=>'L', +4493=>'L', +4494=>'L', +4495=>'L', +4496=>'L', +4497=>'L', +4498=>'L', +4499=>'L', +4500=>'L', +4501=>'L', +4502=>'L', +4503=>'L', +4504=>'L', +4505=>'L', +4506=>'L', +4507=>'L', +4508=>'L', +4509=>'L', +4510=>'L', +4511=>'L', +4512=>'L', +4513=>'L', +4514=>'L', +4520=>'L', +4521=>'L', +4522=>'L', +4523=>'L', +4524=>'L', +4525=>'L', +4526=>'L', +4527=>'L', +4528=>'L', +4529=>'L', +4530=>'L', +4531=>'L', +4532=>'L', +4533=>'L', +4534=>'L', +4535=>'L', +4536=>'L', +4537=>'L', +4538=>'L', +4539=>'L', +4540=>'L', +4541=>'L', +4542=>'L', +4543=>'L', +4544=>'L', +4545=>'L', +4546=>'L', +4547=>'L', +4548=>'L', +4549=>'L', +4550=>'L', +4551=>'L', +4552=>'L', +4553=>'L', +4554=>'L', +4555=>'L', +4556=>'L', +4557=>'L', +4558=>'L', +4559=>'L', +4560=>'L', +4561=>'L', +4562=>'L', +4563=>'L', +4564=>'L', +4565=>'L', +4566=>'L', +4567=>'L', +4568=>'L', +4569=>'L', +4570=>'L', +4571=>'L', +4572=>'L', +4573=>'L', +4574=>'L', +4575=>'L', +4576=>'L', +4577=>'L', +4578=>'L', +4579=>'L', +4580=>'L', +4581=>'L', +4582=>'L', +4583=>'L', +4584=>'L', +4585=>'L', +4586=>'L', +4587=>'L', +4588=>'L', +4589=>'L', +4590=>'L', +4591=>'L', +4592=>'L', +4593=>'L', +4594=>'L', +4595=>'L', +4596=>'L', +4597=>'L', +4598=>'L', +4599=>'L', +4600=>'L', +4601=>'L', +4608=>'L', +4609=>'L', +4610=>'L', +4611=>'L', +4612=>'L', +4613=>'L', +4614=>'L', +4615=>'L', +4616=>'L', +4617=>'L', +4618=>'L', +4619=>'L', +4620=>'L', +4621=>'L', +4622=>'L', +4623=>'L', +4624=>'L', +4625=>'L', +4626=>'L', +4627=>'L', +4628=>'L', +4629=>'L', +4630=>'L', +4631=>'L', +4632=>'L', +4633=>'L', +4634=>'L', +4635=>'L', +4636=>'L', +4637=>'L', +4638=>'L', +4639=>'L', +4640=>'L', +4641=>'L', +4642=>'L', +4643=>'L', +4644=>'L', +4645=>'L', +4646=>'L', +4647=>'L', +4648=>'L', +4649=>'L', +4650=>'L', +4651=>'L', +4652=>'L', +4653=>'L', +4654=>'L', +4655=>'L', +4656=>'L', +4657=>'L', +4658=>'L', +4659=>'L', +4660=>'L', +4661=>'L', +4662=>'L', +4663=>'L', +4664=>'L', +4665=>'L', +4666=>'L', +4667=>'L', +4668=>'L', +4669=>'L', +4670=>'L', +4671=>'L', +4672=>'L', +4673=>'L', +4674=>'L', +4675=>'L', +4676=>'L', +4677=>'L', +4678=>'L', +4679=>'L', +4680=>'L', +4682=>'L', +4683=>'L', +4684=>'L', +4685=>'L', +4688=>'L', +4689=>'L', +4690=>'L', +4691=>'L', +4692=>'L', +4693=>'L', +4694=>'L', +4696=>'L', +4698=>'L', +4699=>'L', +4700=>'L', +4701=>'L', +4704=>'L', +4705=>'L', +4706=>'L', +4707=>'L', +4708=>'L', +4709=>'L', +4710=>'L', +4711=>'L', +4712=>'L', +4713=>'L', +4714=>'L', +4715=>'L', +4716=>'L', +4717=>'L', +4718=>'L', +4719=>'L', +4720=>'L', +4721=>'L', +4722=>'L', +4723=>'L', +4724=>'L', +4725=>'L', +4726=>'L', +4727=>'L', +4728=>'L', +4729=>'L', +4730=>'L', +4731=>'L', +4732=>'L', +4733=>'L', +4734=>'L', +4735=>'L', +4736=>'L', +4737=>'L', +4738=>'L', +4739=>'L', +4740=>'L', +4741=>'L', +4742=>'L', +4743=>'L', +4744=>'L', +4746=>'L', +4747=>'L', +4748=>'L', +4749=>'L', +4752=>'L', +4753=>'L', +4754=>'L', +4755=>'L', +4756=>'L', +4757=>'L', +4758=>'L', +4759=>'L', +4760=>'L', +4761=>'L', +4762=>'L', +4763=>'L', +4764=>'L', +4765=>'L', +4766=>'L', +4767=>'L', +4768=>'L', +4769=>'L', +4770=>'L', +4771=>'L', +4772=>'L', +4773=>'L', +4774=>'L', +4775=>'L', +4776=>'L', +4777=>'L', +4778=>'L', +4779=>'L', +4780=>'L', +4781=>'L', +4782=>'L', +4783=>'L', +4784=>'L', +4786=>'L', +4787=>'L', +4788=>'L', +4789=>'L', +4792=>'L', +4793=>'L', +4794=>'L', +4795=>'L', +4796=>'L', +4797=>'L', +4798=>'L', +4800=>'L', +4802=>'L', +4803=>'L', +4804=>'L', +4805=>'L', +4808=>'L', +4809=>'L', +4810=>'L', +4811=>'L', +4812=>'L', +4813=>'L', +4814=>'L', +4815=>'L', +4816=>'L', +4817=>'L', +4818=>'L', +4819=>'L', +4820=>'L', +4821=>'L', +4822=>'L', +4824=>'L', +4825=>'L', +4826=>'L', +4827=>'L', +4828=>'L', +4829=>'L', +4830=>'L', +4831=>'L', +4832=>'L', +4833=>'L', +4834=>'L', +4835=>'L', +4836=>'L', +4837=>'L', +4838=>'L', +4839=>'L', +4840=>'L', +4841=>'L', +4842=>'L', +4843=>'L', +4844=>'L', +4845=>'L', +4846=>'L', +4847=>'L', +4848=>'L', +4849=>'L', +4850=>'L', +4851=>'L', +4852=>'L', +4853=>'L', +4854=>'L', +4855=>'L', +4856=>'L', +4857=>'L', +4858=>'L', +4859=>'L', +4860=>'L', +4861=>'L', +4862=>'L', +4863=>'L', +4864=>'L', +4865=>'L', +4866=>'L', +4867=>'L', +4868=>'L', +4869=>'L', +4870=>'L', +4871=>'L', +4872=>'L', +4873=>'L', +4874=>'L', +4875=>'L', +4876=>'L', +4877=>'L', +4878=>'L', +4879=>'L', +4880=>'L', +4882=>'L', +4883=>'L', +4884=>'L', +4885=>'L', +4888=>'L', +4889=>'L', +4890=>'L', +4891=>'L', +4892=>'L', +4893=>'L', +4894=>'L', +4895=>'L', +4896=>'L', +4897=>'L', +4898=>'L', +4899=>'L', +4900=>'L', +4901=>'L', +4902=>'L', +4903=>'L', +4904=>'L', +4905=>'L', +4906=>'L', +4907=>'L', +4908=>'L', +4909=>'L', +4910=>'L', +4911=>'L', +4912=>'L', +4913=>'L', +4914=>'L', +4915=>'L', +4916=>'L', +4917=>'L', +4918=>'L', +4919=>'L', +4920=>'L', +4921=>'L', +4922=>'L', +4923=>'L', +4924=>'L', +4925=>'L', +4926=>'L', +4927=>'L', +4928=>'L', +4929=>'L', +4930=>'L', +4931=>'L', +4932=>'L', +4933=>'L', +4934=>'L', +4935=>'L', +4936=>'L', +4937=>'L', +4938=>'L', +4939=>'L', +4940=>'L', +4941=>'L', +4942=>'L', +4943=>'L', +4944=>'L', +4945=>'L', +4946=>'L', +4947=>'L', +4948=>'L', +4949=>'L', +4950=>'L', +4951=>'L', +4952=>'L', +4953=>'L', +4954=>'L', +4959=>'NSM', +4960=>'L', +4961=>'L', +4962=>'L', +4963=>'L', +4964=>'L', +4965=>'L', +4966=>'L', +4967=>'L', +4968=>'L', +4969=>'L', +4970=>'L', +4971=>'L', +4972=>'L', +4973=>'L', +4974=>'L', +4975=>'L', +4976=>'L', +4977=>'L', +4978=>'L', +4979=>'L', +4980=>'L', +4981=>'L', +4982=>'L', +4983=>'L', +4984=>'L', +4985=>'L', +4986=>'L', +4987=>'L', +4988=>'L', +4992=>'L', +4993=>'L', +4994=>'L', +4995=>'L', +4996=>'L', +4997=>'L', +4998=>'L', +4999=>'L', +5000=>'L', +5001=>'L', +5002=>'L', +5003=>'L', +5004=>'L', +5005=>'L', +5006=>'L', +5007=>'L', +5008=>'ON', +5009=>'ON', +5010=>'ON', +5011=>'ON', +5012=>'ON', +5013=>'ON', +5014=>'ON', +5015=>'ON', +5016=>'ON', +5017=>'ON', +5024=>'L', +5025=>'L', +5026=>'L', +5027=>'L', +5028=>'L', +5029=>'L', +5030=>'L', +5031=>'L', +5032=>'L', +5033=>'L', +5034=>'L', +5035=>'L', +5036=>'L', +5037=>'L', +5038=>'L', +5039=>'L', +5040=>'L', +5041=>'L', +5042=>'L', +5043=>'L', +5044=>'L', +5045=>'L', +5046=>'L', +5047=>'L', +5048=>'L', +5049=>'L', +5050=>'L', +5051=>'L', +5052=>'L', +5053=>'L', +5054=>'L', +5055=>'L', +5056=>'L', +5057=>'L', +5058=>'L', +5059=>'L', +5060=>'L', +5061=>'L', +5062=>'L', +5063=>'L', +5064=>'L', +5065=>'L', +5066=>'L', +5067=>'L', +5068=>'L', +5069=>'L', +5070=>'L', +5071=>'L', +5072=>'L', +5073=>'L', +5074=>'L', +5075=>'L', +5076=>'L', +5077=>'L', +5078=>'L', +5079=>'L', +5080=>'L', +5081=>'L', +5082=>'L', +5083=>'L', +5084=>'L', +5085=>'L', +5086=>'L', +5087=>'L', +5088=>'L', +5089=>'L', +5090=>'L', +5091=>'L', +5092=>'L', +5093=>'L', +5094=>'L', +5095=>'L', +5096=>'L', +5097=>'L', +5098=>'L', +5099=>'L', +5100=>'L', +5101=>'L', +5102=>'L', +5103=>'L', +5104=>'L', +5105=>'L', +5106=>'L', +5107=>'L', +5108=>'L', +5121=>'L', +5122=>'L', +5123=>'L', +5124=>'L', +5125=>'L', +5126=>'L', +5127=>'L', +5128=>'L', +5129=>'L', +5130=>'L', +5131=>'L', +5132=>'L', +5133=>'L', +5134=>'L', +5135=>'L', +5136=>'L', +5137=>'L', +5138=>'L', +5139=>'L', +5140=>'L', +5141=>'L', +5142=>'L', +5143=>'L', +5144=>'L', +5145=>'L', +5146=>'L', +5147=>'L', +5148=>'L', +5149=>'L', +5150=>'L', +5151=>'L', +5152=>'L', +5153=>'L', +5154=>'L', +5155=>'L', +5156=>'L', +5157=>'L', +5158=>'L', +5159=>'L', +5160=>'L', +5161=>'L', +5162=>'L', +5163=>'L', +5164=>'L', +5165=>'L', +5166=>'L', +5167=>'L', +5168=>'L', +5169=>'L', +5170=>'L', +5171=>'L', +5172=>'L', +5173=>'L', +5174=>'L', +5175=>'L', +5176=>'L', +5177=>'L', +5178=>'L', +5179=>'L', +5180=>'L', +5181=>'L', +5182=>'L', +5183=>'L', +5184=>'L', +5185=>'L', +5186=>'L', +5187=>'L', +5188=>'L', +5189=>'L', +5190=>'L', +5191=>'L', +5192=>'L', +5193=>'L', +5194=>'L', +5195=>'L', +5196=>'L', +5197=>'L', +5198=>'L', +5199=>'L', +5200=>'L', +5201=>'L', +5202=>'L', +5203=>'L', +5204=>'L', +5205=>'L', +5206=>'L', +5207=>'L', +5208=>'L', +5209=>'L', +5210=>'L', +5211=>'L', +5212=>'L', +5213=>'L', +5214=>'L', +5215=>'L', +5216=>'L', +5217=>'L', +5218=>'L', +5219=>'L', +5220=>'L', +5221=>'L', +5222=>'L', +5223=>'L', +5224=>'L', +5225=>'L', +5226=>'L', +5227=>'L', +5228=>'L', +5229=>'L', +5230=>'L', +5231=>'L', +5232=>'L', +5233=>'L', +5234=>'L', +5235=>'L', +5236=>'L', +5237=>'L', +5238=>'L', +5239=>'L', +5240=>'L', +5241=>'L', +5242=>'L', +5243=>'L', +5244=>'L', +5245=>'L', +5246=>'L', +5247=>'L', +5248=>'L', +5249=>'L', +5250=>'L', +5251=>'L', +5252=>'L', +5253=>'L', +5254=>'L', +5255=>'L', +5256=>'L', +5257=>'L', +5258=>'L', +5259=>'L', +5260=>'L', +5261=>'L', +5262=>'L', +5263=>'L', +5264=>'L', +5265=>'L', +5266=>'L', +5267=>'L', +5268=>'L', +5269=>'L', +5270=>'L', +5271=>'L', +5272=>'L', +5273=>'L', +5274=>'L', +5275=>'L', +5276=>'L', +5277=>'L', +5278=>'L', +5279=>'L', +5280=>'L', +5281=>'L', +5282=>'L', +5283=>'L', +5284=>'L', +5285=>'L', +5286=>'L', +5287=>'L', +5288=>'L', +5289=>'L', +5290=>'L', +5291=>'L', +5292=>'L', +5293=>'L', +5294=>'L', +5295=>'L', +5296=>'L', +5297=>'L', +5298=>'L', +5299=>'L', +5300=>'L', +5301=>'L', +5302=>'L', +5303=>'L', +5304=>'L', +5305=>'L', +5306=>'L', +5307=>'L', +5308=>'L', +5309=>'L', +5310=>'L', +5311=>'L', +5312=>'L', +5313=>'L', +5314=>'L', +5315=>'L', +5316=>'L', +5317=>'L', +5318=>'L', +5319=>'L', +5320=>'L', +5321=>'L', +5322=>'L', +5323=>'L', +5324=>'L', +5325=>'L', +5326=>'L', +5327=>'L', +5328=>'L', +5329=>'L', +5330=>'L', +5331=>'L', +5332=>'L', +5333=>'L', +5334=>'L', +5335=>'L', +5336=>'L', +5337=>'L', +5338=>'L', +5339=>'L', +5340=>'L', +5341=>'L', +5342=>'L', +5343=>'L', +5344=>'L', +5345=>'L', +5346=>'L', +5347=>'L', +5348=>'L', +5349=>'L', +5350=>'L', +5351=>'L', +5352=>'L', +5353=>'L', +5354=>'L', +5355=>'L', +5356=>'L', +5357=>'L', +5358=>'L', +5359=>'L', +5360=>'L', +5361=>'L', +5362=>'L', +5363=>'L', +5364=>'L', +5365=>'L', +5366=>'L', +5367=>'L', +5368=>'L', +5369=>'L', +5370=>'L', +5371=>'L', +5372=>'L', +5373=>'L', +5374=>'L', +5375=>'L', +5376=>'L', +5377=>'L', +5378=>'L', +5379=>'L', +5380=>'L', +5381=>'L', +5382=>'L', +5383=>'L', +5384=>'L', +5385=>'L', +5386=>'L', +5387=>'L', +5388=>'L', +5389=>'L', +5390=>'L', +5391=>'L', +5392=>'L', +5393=>'L', +5394=>'L', +5395=>'L', +5396=>'L', +5397=>'L', +5398=>'L', +5399=>'L', +5400=>'L', +5401=>'L', +5402=>'L', +5403=>'L', +5404=>'L', +5405=>'L', +5406=>'L', +5407=>'L', +5408=>'L', +5409=>'L', +5410=>'L', +5411=>'L', +5412=>'L', +5413=>'L', +5414=>'L', +5415=>'L', +5416=>'L', +5417=>'L', +5418=>'L', +5419=>'L', +5420=>'L', +5421=>'L', +5422=>'L', +5423=>'L', +5424=>'L', +5425=>'L', +5426=>'L', +5427=>'L', +5428=>'L', +5429=>'L', +5430=>'L', +5431=>'L', +5432=>'L', +5433=>'L', +5434=>'L', +5435=>'L', +5436=>'L', +5437=>'L', +5438=>'L', +5439=>'L', +5440=>'L', +5441=>'L', +5442=>'L', +5443=>'L', +5444=>'L', +5445=>'L', +5446=>'L', +5447=>'L', +5448=>'L', +5449=>'L', +5450=>'L', +5451=>'L', +5452=>'L', +5453=>'L', +5454=>'L', +5455=>'L', +5456=>'L', +5457=>'L', +5458=>'L', +5459=>'L', +5460=>'L', +5461=>'L', +5462=>'L', +5463=>'L', +5464=>'L', +5465=>'L', +5466=>'L', +5467=>'L', +5468=>'L', +5469=>'L', +5470=>'L', +5471=>'L', +5472=>'L', +5473=>'L', +5474=>'L', +5475=>'L', +5476=>'L', +5477=>'L', +5478=>'L', +5479=>'L', +5480=>'L', +5481=>'L', +5482=>'L', +5483=>'L', +5484=>'L', +5485=>'L', +5486=>'L', +5487=>'L', +5488=>'L', +5489=>'L', +5490=>'L', +5491=>'L', +5492=>'L', +5493=>'L', +5494=>'L', +5495=>'L', +5496=>'L', +5497=>'L', +5498=>'L', +5499=>'L', +5500=>'L', +5501=>'L', +5502=>'L', +5503=>'L', +5504=>'L', +5505=>'L', +5506=>'L', +5507=>'L', +5508=>'L', +5509=>'L', +5510=>'L', +5511=>'L', +5512=>'L', +5513=>'L', +5514=>'L', +5515=>'L', +5516=>'L', +5517=>'L', +5518=>'L', +5519=>'L', +5520=>'L', +5521=>'L', +5522=>'L', +5523=>'L', +5524=>'L', +5525=>'L', +5526=>'L', +5527=>'L', +5528=>'L', +5529=>'L', +5530=>'L', +5531=>'L', +5532=>'L', +5533=>'L', +5534=>'L', +5535=>'L', +5536=>'L', +5537=>'L', +5538=>'L', +5539=>'L', +5540=>'L', +5541=>'L', +5542=>'L', +5543=>'L', +5544=>'L', +5545=>'L', +5546=>'L', +5547=>'L', +5548=>'L', +5549=>'L', +5550=>'L', +5551=>'L', +5552=>'L', +5553=>'L', +5554=>'L', +5555=>'L', +5556=>'L', +5557=>'L', +5558=>'L', +5559=>'L', +5560=>'L', +5561=>'L', +5562=>'L', +5563=>'L', +5564=>'L', +5565=>'L', +5566=>'L', +5567=>'L', +5568=>'L', +5569=>'L', +5570=>'L', +5571=>'L', +5572=>'L', +5573=>'L', +5574=>'L', +5575=>'L', +5576=>'L', +5577=>'L', +5578=>'L', +5579=>'L', +5580=>'L', +5581=>'L', +5582=>'L', +5583=>'L', +5584=>'L', +5585=>'L', +5586=>'L', +5587=>'L', +5588=>'L', +5589=>'L', +5590=>'L', +5591=>'L', +5592=>'L', +5593=>'L', +5594=>'L', +5595=>'L', +5596=>'L', +5597=>'L', +5598=>'L', +5599=>'L', +5600=>'L', +5601=>'L', +5602=>'L', +5603=>'L', +5604=>'L', +5605=>'L', +5606=>'L', +5607=>'L', +5608=>'L', +5609=>'L', +5610=>'L', +5611=>'L', +5612=>'L', +5613=>'L', +5614=>'L', +5615=>'L', +5616=>'L', +5617=>'L', +5618=>'L', +5619=>'L', +5620=>'L', +5621=>'L', +5622=>'L', +5623=>'L', +5624=>'L', +5625=>'L', +5626=>'L', +5627=>'L', +5628=>'L', +5629=>'L', +5630=>'L', +5631=>'L', +5632=>'L', +5633=>'L', +5634=>'L', +5635=>'L', +5636=>'L', +5637=>'L', +5638=>'L', +5639=>'L', +5640=>'L', +5641=>'L', +5642=>'L', +5643=>'L', +5644=>'L', +5645=>'L', +5646=>'L', +5647=>'L', +5648=>'L', +5649=>'L', +5650=>'L', +5651=>'L', +5652=>'L', +5653=>'L', +5654=>'L', +5655=>'L', +5656=>'L', +5657=>'L', +5658=>'L', +5659=>'L', +5660=>'L', +5661=>'L', +5662=>'L', +5663=>'L', +5664=>'L', +5665=>'L', +5666=>'L', +5667=>'L', +5668=>'L', +5669=>'L', +5670=>'L', +5671=>'L', +5672=>'L', +5673=>'L', +5674=>'L', +5675=>'L', +5676=>'L', +5677=>'L', +5678=>'L', +5679=>'L', +5680=>'L', +5681=>'L', +5682=>'L', +5683=>'L', +5684=>'L', +5685=>'L', +5686=>'L', +5687=>'L', +5688=>'L', +5689=>'L', +5690=>'L', +5691=>'L', +5692=>'L', +5693=>'L', +5694=>'L', +5695=>'L', +5696=>'L', +5697=>'L', +5698=>'L', +5699=>'L', +5700=>'L', +5701=>'L', +5702=>'L', +5703=>'L', +5704=>'L', +5705=>'L', +5706=>'L', +5707=>'L', +5708=>'L', +5709=>'L', +5710=>'L', +5711=>'L', +5712=>'L', +5713=>'L', +5714=>'L', +5715=>'L', +5716=>'L', +5717=>'L', +5718=>'L', +5719=>'L', +5720=>'L', +5721=>'L', +5722=>'L', +5723=>'L', +5724=>'L', +5725=>'L', +5726=>'L', +5727=>'L', +5728=>'L', +5729=>'L', +5730=>'L', +5731=>'L', +5732=>'L', +5733=>'L', +5734=>'L', +5735=>'L', +5736=>'L', +5737=>'L', +5738=>'L', +5739=>'L', +5740=>'L', +5741=>'L', +5742=>'L', +5743=>'L', +5744=>'L', +5745=>'L', +5746=>'L', +5747=>'L', +5748=>'L', +5749=>'L', +5750=>'L', +5760=>'WS', +5761=>'L', +5762=>'L', +5763=>'L', +5764=>'L', +5765=>'L', +5766=>'L', +5767=>'L', +5768=>'L', +5769=>'L', +5770=>'L', +5771=>'L', +5772=>'L', +5773=>'L', +5774=>'L', +5775=>'L', +5776=>'L', +5777=>'L', +5778=>'L', +5779=>'L', +5780=>'L', +5781=>'L', +5782=>'L', +5783=>'L', +5784=>'L', +5785=>'L', +5786=>'L', +5787=>'ON', +5788=>'ON', +5792=>'L', +5793=>'L', +5794=>'L', +5795=>'L', +5796=>'L', +5797=>'L', +5798=>'L', +5799=>'L', +5800=>'L', +5801=>'L', +5802=>'L', +5803=>'L', +5804=>'L', +5805=>'L', +5806=>'L', +5807=>'L', +5808=>'L', +5809=>'L', +5810=>'L', +5811=>'L', +5812=>'L', +5813=>'L', +5814=>'L', +5815=>'L', +5816=>'L', +5817=>'L', +5818=>'L', +5819=>'L', +5820=>'L', +5821=>'L', +5822=>'L', +5823=>'L', +5824=>'L', +5825=>'L', +5826=>'L', +5827=>'L', +5828=>'L', +5829=>'L', +5830=>'L', +5831=>'L', +5832=>'L', +5833=>'L', +5834=>'L', +5835=>'L', +5836=>'L', +5837=>'L', +5838=>'L', +5839=>'L', +5840=>'L', +5841=>'L', +5842=>'L', +5843=>'L', +5844=>'L', +5845=>'L', +5846=>'L', +5847=>'L', +5848=>'L', +5849=>'L', +5850=>'L', +5851=>'L', +5852=>'L', +5853=>'L', +5854=>'L', +5855=>'L', +5856=>'L', +5857=>'L', +5858=>'L', +5859=>'L', +5860=>'L', +5861=>'L', +5862=>'L', +5863=>'L', +5864=>'L', +5865=>'L', +5866=>'L', +5867=>'L', +5868=>'L', +5869=>'L', +5870=>'L', +5871=>'L', +5872=>'L', +5888=>'L', +5889=>'L', +5890=>'L', +5891=>'L', +5892=>'L', +5893=>'L', +5894=>'L', +5895=>'L', +5896=>'L', +5897=>'L', +5898=>'L', +5899=>'L', +5900=>'L', +5902=>'L', +5903=>'L', +5904=>'L', +5905=>'L', +5906=>'NSM', +5907=>'NSM', +5908=>'NSM', +5920=>'L', +5921=>'L', +5922=>'L', +5923=>'L', +5924=>'L', +5925=>'L', +5926=>'L', +5927=>'L', +5928=>'L', +5929=>'L', +5930=>'L', +5931=>'L', +5932=>'L', +5933=>'L', +5934=>'L', +5935=>'L', +5936=>'L', +5937=>'L', +5938=>'NSM', +5939=>'NSM', +5940=>'NSM', +5941=>'L', +5942=>'L', +5952=>'L', +5953=>'L', +5954=>'L', +5955=>'L', +5956=>'L', +5957=>'L', +5958=>'L', +5959=>'L', +5960=>'L', +5961=>'L', +5962=>'L', +5963=>'L', +5964=>'L', +5965=>'L', +5966=>'L', +5967=>'L', +5968=>'L', +5969=>'L', +5970=>'NSM', +5971=>'NSM', +5984=>'L', +5985=>'L', +5986=>'L', +5987=>'L', +5988=>'L', +5989=>'L', +5990=>'L', +5991=>'L', +5992=>'L', +5993=>'L', +5994=>'L', +5995=>'L', +5996=>'L', +5998=>'L', +5999=>'L', +6000=>'L', +6002=>'NSM', +6003=>'NSM', +6016=>'L', +6017=>'L', +6018=>'L', +6019=>'L', +6020=>'L', +6021=>'L', +6022=>'L', +6023=>'L', +6024=>'L', +6025=>'L', +6026=>'L', +6027=>'L', +6028=>'L', +6029=>'L', +6030=>'L', +6031=>'L', +6032=>'L', +6033=>'L', +6034=>'L', +6035=>'L', +6036=>'L', +6037=>'L', +6038=>'L', +6039=>'L', +6040=>'L', +6041=>'L', +6042=>'L', +6043=>'L', +6044=>'L', +6045=>'L', +6046=>'L', +6047=>'L', +6048=>'L', +6049=>'L', +6050=>'L', +6051=>'L', +6052=>'L', +6053=>'L', +6054=>'L', +6055=>'L', +6056=>'L', +6057=>'L', +6058=>'L', +6059=>'L', +6060=>'L', +6061=>'L', +6062=>'L', +6063=>'L', +6064=>'L', +6065=>'L', +6066=>'L', +6067=>'L', +6068=>'L', +6069=>'L', +6070=>'L', +6071=>'NSM', +6072=>'NSM', +6073=>'NSM', +6074=>'NSM', +6075=>'NSM', +6076=>'NSM', +6077=>'NSM', +6078=>'L', +6079=>'L', +6080=>'L', +6081=>'L', +6082=>'L', +6083=>'L', +6084=>'L', +6085=>'L', +6086=>'NSM', +6087=>'L', +6088=>'L', +6089=>'NSM', +6090=>'NSM', +6091=>'NSM', +6092=>'NSM', +6093=>'NSM', +6094=>'NSM', +6095=>'NSM', +6096=>'NSM', +6097=>'NSM', +6098=>'NSM', +6099=>'NSM', +6100=>'L', +6101=>'L', +6102=>'L', +6103=>'L', +6104=>'L', +6105=>'L', +6106=>'L', +6107=>'ET', +6108=>'L', +6109=>'NSM', +6112=>'L', +6113=>'L', +6114=>'L', +6115=>'L', +6116=>'L', +6117=>'L', +6118=>'L', +6119=>'L', +6120=>'L', +6121=>'L', +6128=>'ON', +6129=>'ON', +6130=>'ON', +6131=>'ON', +6132=>'ON', +6133=>'ON', +6134=>'ON', +6135=>'ON', +6136=>'ON', +6137=>'ON', +6144=>'ON', +6145=>'ON', +6146=>'ON', +6147=>'ON', +6148=>'ON', +6149=>'ON', +6150=>'ON', +6151=>'ON', +6152=>'ON', +6153=>'ON', +6154=>'ON', +6155=>'NSM', +6156=>'NSM', +6157=>'NSM', +6158=>'WS', +6160=>'L', +6161=>'L', +6162=>'L', +6163=>'L', +6164=>'L', +6165=>'L', +6166=>'L', +6167=>'L', +6168=>'L', +6169=>'L', +6176=>'L', +6177=>'L', +6178=>'L', +6179=>'L', +6180=>'L', +6181=>'L', +6182=>'L', +6183=>'L', +6184=>'L', +6185=>'L', +6186=>'L', +6187=>'L', +6188=>'L', +6189=>'L', +6190=>'L', +6191=>'L', +6192=>'L', +6193=>'L', +6194=>'L', +6195=>'L', +6196=>'L', +6197=>'L', +6198=>'L', +6199=>'L', +6200=>'L', +6201=>'L', +6202=>'L', +6203=>'L', +6204=>'L', +6205=>'L', +6206=>'L', +6207=>'L', +6208=>'L', +6209=>'L', +6210=>'L', +6211=>'L', +6212=>'L', +6213=>'L', +6214=>'L', +6215=>'L', +6216=>'L', +6217=>'L', +6218=>'L', +6219=>'L', +6220=>'L', +6221=>'L', +6222=>'L', +6223=>'L', +6224=>'L', +6225=>'L', +6226=>'L', +6227=>'L', +6228=>'L', +6229=>'L', +6230=>'L', +6231=>'L', +6232=>'L', +6233=>'L', +6234=>'L', +6235=>'L', +6236=>'L', +6237=>'L', +6238=>'L', +6239=>'L', +6240=>'L', +6241=>'L', +6242=>'L', +6243=>'L', +6244=>'L', +6245=>'L', +6246=>'L', +6247=>'L', +6248=>'L', +6249=>'L', +6250=>'L', +6251=>'L', +6252=>'L', +6253=>'L', +6254=>'L', +6255=>'L', +6256=>'L', +6257=>'L', +6258=>'L', +6259=>'L', +6260=>'L', +6261=>'L', +6262=>'L', +6263=>'L', +6272=>'L', +6273=>'L', +6274=>'L', +6275=>'L', +6276=>'L', +6277=>'L', +6278=>'L', +6279=>'L', +6280=>'L', +6281=>'L', +6282=>'L', +6283=>'L', +6284=>'L', +6285=>'L', +6286=>'L', +6287=>'L', +6288=>'L', +6289=>'L', +6290=>'L', +6291=>'L', +6292=>'L', +6293=>'L', +6294=>'L', +6295=>'L', +6296=>'L', +6297=>'L', +6298=>'L', +6299=>'L', +6300=>'L', +6301=>'L', +6302=>'L', +6303=>'L', +6304=>'L', +6305=>'L', +6306=>'L', +6307=>'L', +6308=>'L', +6309=>'L', +6310=>'L', +6311=>'L', +6312=>'L', +6313=>'NSM', +6400=>'L', +6401=>'L', +6402=>'L', +6403=>'L', +6404=>'L', +6405=>'L', +6406=>'L', +6407=>'L', +6408=>'L', +6409=>'L', +6410=>'L', +6411=>'L', +6412=>'L', +6413=>'L', +6414=>'L', +6415=>'L', +6416=>'L', +6417=>'L', +6418=>'L', +6419=>'L', +6420=>'L', +6421=>'L', +6422=>'L', +6423=>'L', +6424=>'L', +6425=>'L', +6426=>'L', +6427=>'L', +6428=>'L', +6432=>'NSM', +6433=>'NSM', +6434=>'NSM', +6435=>'L', +6436=>'L', +6437=>'L', +6438=>'L', +6439=>'NSM', +6440=>'NSM', +6441=>'NSM', +6442=>'NSM', +6443=>'NSM', +6448=>'L', +6449=>'L', +6450=>'NSM', +6451=>'L', +6452=>'L', +6453=>'L', +6454=>'L', +6455=>'L', +6456=>'L', +6457=>'NSM', +6458=>'NSM', +6459=>'NSM', +6464=>'ON', +6468=>'ON', +6469=>'ON', +6470=>'L', +6471=>'L', +6472=>'L', +6473=>'L', +6474=>'L', +6475=>'L', +6476=>'L', +6477=>'L', +6478=>'L', +6479=>'L', +6480=>'L', +6481=>'L', +6482=>'L', +6483=>'L', +6484=>'L', +6485=>'L', +6486=>'L', +6487=>'L', +6488=>'L', +6489=>'L', +6490=>'L', +6491=>'L', +6492=>'L', +6493=>'L', +6494=>'L', +6495=>'L', +6496=>'L', +6497=>'L', +6498=>'L', +6499=>'L', +6500=>'L', +6501=>'L', +6502=>'L', +6503=>'L', +6504=>'L', +6505=>'L', +6506=>'L', +6507=>'L', +6508=>'L', +6509=>'L', +6512=>'L', +6513=>'L', +6514=>'L', +6515=>'L', +6516=>'L', +6528=>'L', +6529=>'L', +6530=>'L', +6531=>'L', +6532=>'L', +6533=>'L', +6534=>'L', +6535=>'L', +6536=>'L', +6537=>'L', +6538=>'L', +6539=>'L', +6540=>'L', +6541=>'L', +6542=>'L', +6543=>'L', +6544=>'L', +6545=>'L', +6546=>'L', +6547=>'L', +6548=>'L', +6549=>'L', +6550=>'L', +6551=>'L', +6552=>'L', +6553=>'L', +6554=>'L', +6555=>'L', +6556=>'L', +6557=>'L', +6558=>'L', +6559=>'L', +6560=>'L', +6561=>'L', +6562=>'L', +6563=>'L', +6564=>'L', +6565=>'L', +6566=>'L', +6567=>'L', +6568=>'L', +6569=>'L', +6576=>'L', +6577=>'L', +6578=>'L', +6579=>'L', +6580=>'L', +6581=>'L', +6582=>'L', +6583=>'L', +6584=>'L', +6585=>'L', +6586=>'L', +6587=>'L', +6588=>'L', +6589=>'L', +6590=>'L', +6591=>'L', +6592=>'L', +6593=>'L', +6594=>'L', +6595=>'L', +6596=>'L', +6597=>'L', +6598=>'L', +6599=>'L', +6600=>'L', +6601=>'L', +6608=>'L', +6609=>'L', +6610=>'L', +6611=>'L', +6612=>'L', +6613=>'L', +6614=>'L', +6615=>'L', +6616=>'L', +6617=>'L', +6622=>'ON', +6623=>'ON', +6624=>'ON', +6625=>'ON', +6626=>'ON', +6627=>'ON', +6628=>'ON', +6629=>'ON', +6630=>'ON', +6631=>'ON', +6632=>'ON', +6633=>'ON', +6634=>'ON', +6635=>'ON', +6636=>'ON', +6637=>'ON', +6638=>'ON', +6639=>'ON', +6640=>'ON', +6641=>'ON', +6642=>'ON', +6643=>'ON', +6644=>'ON', +6645=>'ON', +6646=>'ON', +6647=>'ON', +6648=>'ON', +6649=>'ON', +6650=>'ON', +6651=>'ON', +6652=>'ON', +6653=>'ON', +6654=>'ON', +6655=>'ON', +6656=>'L', +6657=>'L', +6658=>'L', +6659=>'L', +6660=>'L', +6661=>'L', +6662=>'L', +6663=>'L', +6664=>'L', +6665=>'L', +6666=>'L', +6667=>'L', +6668=>'L', +6669=>'L', +6670=>'L', +6671=>'L', +6672=>'L', +6673=>'L', +6674=>'L', +6675=>'L', +6676=>'L', +6677=>'L', +6678=>'L', +6679=>'NSM', +6680=>'NSM', +6681=>'L', +6682=>'L', +6683=>'L', +6686=>'L', +6687=>'L', +6912=>'NSM', +6913=>'NSM', +6914=>'NSM', +6915=>'NSM', +6916=>'L', +6917=>'L', +6918=>'L', +6919=>'L', +6920=>'L', +6921=>'L', +6922=>'L', +6923=>'L', +6924=>'L', +6925=>'L', +6926=>'L', +6927=>'L', +6928=>'L', +6929=>'L', +6930=>'L', +6931=>'L', +6932=>'L', +6933=>'L', +6934=>'L', +6935=>'L', +6936=>'L', +6937=>'L', +6938=>'L', +6939=>'L', +6940=>'L', +6941=>'L', +6942=>'L', +6943=>'L', +6944=>'L', +6945=>'L', +6946=>'L', +6947=>'L', +6948=>'L', +6949=>'L', +6950=>'L', +6951=>'L', +6952=>'L', +6953=>'L', +6954=>'L', +6955=>'L', +6956=>'L', +6957=>'L', +6958=>'L', +6959=>'L', +6960=>'L', +6961=>'L', +6962=>'L', +6963=>'L', +6964=>'NSM', +6965=>'L', +6966=>'NSM', +6967=>'NSM', +6968=>'NSM', +6969=>'NSM', +6970=>'NSM', +6971=>'L', +6972=>'NSM', +6973=>'L', +6974=>'L', +6975=>'L', +6976=>'L', +6977=>'L', +6978=>'NSM', +6979=>'L', +6980=>'L', +6981=>'L', +6982=>'L', +6983=>'L', +6984=>'L', +6985=>'L', +6986=>'L', +6987=>'L', +6992=>'L', +6993=>'L', +6994=>'L', +6995=>'L', +6996=>'L', +6997=>'L', +6998=>'L', +6999=>'L', +7000=>'L', +7001=>'L', +7002=>'L', +7003=>'L', +7004=>'L', +7005=>'L', +7006=>'L', +7007=>'L', +7008=>'L', +7009=>'L', +7010=>'L', +7011=>'L', +7012=>'L', +7013=>'L', +7014=>'L', +7015=>'L', +7016=>'L', +7017=>'L', +7018=>'L', +7019=>'NSM', +7020=>'NSM', +7021=>'NSM', +7022=>'NSM', +7023=>'NSM', +7024=>'NSM', +7025=>'NSM', +7026=>'NSM', +7027=>'NSM', +7028=>'L', +7029=>'L', +7030=>'L', +7031=>'L', +7032=>'L', +7033=>'L', +7034=>'L', +7035=>'L', +7036=>'L', +7424=>'L', +7425=>'L', +7426=>'L', +7427=>'L', +7428=>'L', +7429=>'L', +7430=>'L', +7431=>'L', +7432=>'L', +7433=>'L', +7434=>'L', +7435=>'L', +7436=>'L', +7437=>'L', +7438=>'L', +7439=>'L', +7440=>'L', +7441=>'L', +7442=>'L', +7443=>'L', +7444=>'L', +7445=>'L', +7446=>'L', +7447=>'L', +7448=>'L', +7449=>'L', +7450=>'L', +7451=>'L', +7452=>'L', +7453=>'L', +7454=>'L', +7455=>'L', +7456=>'L', +7457=>'L', +7458=>'L', +7459=>'L', +7460=>'L', +7461=>'L', +7462=>'L', +7463=>'L', +7464=>'L', +7465=>'L', +7466=>'L', +7467=>'L', +7468=>'L', +7469=>'L', +7470=>'L', +7471=>'L', +7472=>'L', +7473=>'L', +7474=>'L', +7475=>'L', +7476=>'L', +7477=>'L', +7478=>'L', +7479=>'L', +7480=>'L', +7481=>'L', +7482=>'L', +7483=>'L', +7484=>'L', +7485=>'L', +7486=>'L', +7487=>'L', +7488=>'L', +7489=>'L', +7490=>'L', +7491=>'L', +7492=>'L', +7493=>'L', +7494=>'L', +7495=>'L', +7496=>'L', +7497=>'L', +7498=>'L', +7499=>'L', +7500=>'L', +7501=>'L', +7502=>'L', +7503=>'L', +7504=>'L', +7505=>'L', +7506=>'L', +7507=>'L', +7508=>'L', +7509=>'L', +7510=>'L', +7511=>'L', +7512=>'L', +7513=>'L', +7514=>'L', +7515=>'L', +7516=>'L', +7517=>'L', +7518=>'L', +7519=>'L', +7520=>'L', +7521=>'L', +7522=>'L', +7523=>'L', +7524=>'L', +7525=>'L', +7526=>'L', +7527=>'L', +7528=>'L', +7529=>'L', +7530=>'L', +7531=>'L', +7532=>'L', +7533=>'L', +7534=>'L', +7535=>'L', +7536=>'L', +7537=>'L', +7538=>'L', +7539=>'L', +7540=>'L', +7541=>'L', +7542=>'L', +7543=>'L', +7544=>'L', +7545=>'L', +7546=>'L', +7547=>'L', +7548=>'L', +7549=>'L', +7550=>'L', +7551=>'L', +7552=>'L', +7553=>'L', +7554=>'L', +7555=>'L', +7556=>'L', +7557=>'L', +7558=>'L', +7559=>'L', +7560=>'L', +7561=>'L', +7562=>'L', +7563=>'L', +7564=>'L', +7565=>'L', +7566=>'L', +7567=>'L', +7568=>'L', +7569=>'L', +7570=>'L', +7571=>'L', +7572=>'L', +7573=>'L', +7574=>'L', +7575=>'L', +7576=>'L', +7577=>'L', +7578=>'L', +7579=>'L', +7580=>'L', +7581=>'L', +7582=>'L', +7583=>'L', +7584=>'L', +7585=>'L', +7586=>'L', +7587=>'L', +7588=>'L', +7589=>'L', +7590=>'L', +7591=>'L', +7592=>'L', +7593=>'L', +7594=>'L', +7595=>'L', +7596=>'L', +7597=>'L', +7598=>'L', +7599=>'L', +7600=>'L', +7601=>'L', +7602=>'L', +7603=>'L', +7604=>'L', +7605=>'L', +7606=>'L', +7607=>'L', +7608=>'L', +7609=>'L', +7610=>'L', +7611=>'L', +7612=>'L', +7613=>'L', +7614=>'L', +7615=>'L', +7616=>'NSM', +7617=>'NSM', +7618=>'NSM', +7619=>'NSM', +7620=>'NSM', +7621=>'NSM', +7622=>'NSM', +7623=>'NSM', +7624=>'NSM', +7625=>'NSM', +7626=>'NSM', +7678=>'NSM', +7679=>'NSM', +7680=>'L', +7681=>'L', +7682=>'L', +7683=>'L', +7684=>'L', +7685=>'L', +7686=>'L', +7687=>'L', +7688=>'L', +7689=>'L', +7690=>'L', +7691=>'L', +7692=>'L', +7693=>'L', +7694=>'L', +7695=>'L', +7696=>'L', +7697=>'L', +7698=>'L', +7699=>'L', +7700=>'L', +7701=>'L', +7702=>'L', +7703=>'L', +7704=>'L', +7705=>'L', +7706=>'L', +7707=>'L', +7708=>'L', +7709=>'L', +7710=>'L', +7711=>'L', +7712=>'L', +7713=>'L', +7714=>'L', +7715=>'L', +7716=>'L', +7717=>'L', +7718=>'L', +7719=>'L', +7720=>'L', +7721=>'L', +7722=>'L', +7723=>'L', +7724=>'L', +7725=>'L', +7726=>'L', +7727=>'L', +7728=>'L', +7729=>'L', +7730=>'L', +7731=>'L', +7732=>'L', +7733=>'L', +7734=>'L', +7735=>'L', +7736=>'L', +7737=>'L', +7738=>'L', +7739=>'L', +7740=>'L', +7741=>'L', +7742=>'L', +7743=>'L', +7744=>'L', +7745=>'L', +7746=>'L', +7747=>'L', +7748=>'L', +7749=>'L', +7750=>'L', +7751=>'L', +7752=>'L', +7753=>'L', +7754=>'L', +7755=>'L', +7756=>'L', +7757=>'L', +7758=>'L', +7759=>'L', +7760=>'L', +7761=>'L', +7762=>'L', +7763=>'L', +7764=>'L', +7765=>'L', +7766=>'L', +7767=>'L', +7768=>'L', +7769=>'L', +7770=>'L', +7771=>'L', +7772=>'L', +7773=>'L', +7774=>'L', +7775=>'L', +7776=>'L', +7777=>'L', +7778=>'L', +7779=>'L', +7780=>'L', +7781=>'L', +7782=>'L', +7783=>'L', +7784=>'L', +7785=>'L', +7786=>'L', +7787=>'L', +7788=>'L', +7789=>'L', +7790=>'L', +7791=>'L', +7792=>'L', +7793=>'L', +7794=>'L', +7795=>'L', +7796=>'L', +7797=>'L', +7798=>'L', +7799=>'L', +7800=>'L', +7801=>'L', +7802=>'L', +7803=>'L', +7804=>'L', +7805=>'L', +7806=>'L', +7807=>'L', +7808=>'L', +7809=>'L', +7810=>'L', +7811=>'L', +7812=>'L', +7813=>'L', +7814=>'L', +7815=>'L', +7816=>'L', +7817=>'L', +7818=>'L', +7819=>'L', +7820=>'L', +7821=>'L', +7822=>'L', +7823=>'L', +7824=>'L', +7825=>'L', +7826=>'L', +7827=>'L', +7828=>'L', +7829=>'L', +7830=>'L', +7831=>'L', +7832=>'L', +7833=>'L', +7834=>'L', +7835=>'L', +7840=>'L', +7841=>'L', +7842=>'L', +7843=>'L', +7844=>'L', +7845=>'L', +7846=>'L', +7847=>'L', +7848=>'L', +7849=>'L', +7850=>'L', +7851=>'L', +7852=>'L', +7853=>'L', +7854=>'L', +7855=>'L', +7856=>'L', +7857=>'L', +7858=>'L', +7859=>'L', +7860=>'L', +7861=>'L', +7862=>'L', +7863=>'L', +7864=>'L', +7865=>'L', +7866=>'L', +7867=>'L', +7868=>'L', +7869=>'L', +7870=>'L', +7871=>'L', +7872=>'L', +7873=>'L', +7874=>'L', +7875=>'L', +7876=>'L', +7877=>'L', +7878=>'L', +7879=>'L', +7880=>'L', +7881=>'L', +7882=>'L', +7883=>'L', +7884=>'L', +7885=>'L', +7886=>'L', +7887=>'L', +7888=>'L', +7889=>'L', +7890=>'L', +7891=>'L', +7892=>'L', +7893=>'L', +7894=>'L', +7895=>'L', +7896=>'L', +7897=>'L', +7898=>'L', +7899=>'L', +7900=>'L', +7901=>'L', +7902=>'L', +7903=>'L', +7904=>'L', +7905=>'L', +7906=>'L', +7907=>'L', +7908=>'L', +7909=>'L', +7910=>'L', +7911=>'L', +7912=>'L', +7913=>'L', +7914=>'L', +7915=>'L', +7916=>'L', +7917=>'L', +7918=>'L', +7919=>'L', +7920=>'L', +7921=>'L', +7922=>'L', +7923=>'L', +7924=>'L', +7925=>'L', +7926=>'L', +7927=>'L', +7928=>'L', +7929=>'L', +7936=>'L', +7937=>'L', +7938=>'L', +7939=>'L', +7940=>'L', +7941=>'L', +7942=>'L', +7943=>'L', +7944=>'L', +7945=>'L', +7946=>'L', +7947=>'L', +7948=>'L', +7949=>'L', +7950=>'L', +7951=>'L', +7952=>'L', +7953=>'L', +7954=>'L', +7955=>'L', +7956=>'L', +7957=>'L', +7960=>'L', +7961=>'L', +7962=>'L', +7963=>'L', +7964=>'L', +7965=>'L', +7968=>'L', +7969=>'L', +7970=>'L', +7971=>'L', +7972=>'L', +7973=>'L', +7974=>'L', +7975=>'L', +7976=>'L', +7977=>'L', +7978=>'L', +7979=>'L', +7980=>'L', +7981=>'L', +7982=>'L', +7983=>'L', +7984=>'L', +7985=>'L', +7986=>'L', +7987=>'L', +7988=>'L', +7989=>'L', +7990=>'L', +7991=>'L', +7992=>'L', +7993=>'L', +7994=>'L', +7995=>'L', +7996=>'L', +7997=>'L', +7998=>'L', +7999=>'L', +8000=>'L', +8001=>'L', +8002=>'L', +8003=>'L', +8004=>'L', +8005=>'L', +8008=>'L', +8009=>'L', +8010=>'L', +8011=>'L', +8012=>'L', +8013=>'L', +8016=>'L', +8017=>'L', +8018=>'L', +8019=>'L', +8020=>'L', +8021=>'L', +8022=>'L', +8023=>'L', +8025=>'L', +8027=>'L', +8029=>'L', +8031=>'L', +8032=>'L', +8033=>'L', +8034=>'L', +8035=>'L', +8036=>'L', +8037=>'L', +8038=>'L', +8039=>'L', +8040=>'L', +8041=>'L', +8042=>'L', +8043=>'L', +8044=>'L', +8045=>'L', +8046=>'L', +8047=>'L', +8048=>'L', +8049=>'L', +8050=>'L', +8051=>'L', +8052=>'L', +8053=>'L', +8054=>'L', +8055=>'L', +8056=>'L', +8057=>'L', +8058=>'L', +8059=>'L', +8060=>'L', +8061=>'L', +8064=>'L', +8065=>'L', +8066=>'L', +8067=>'L', +8068=>'L', +8069=>'L', +8070=>'L', +8071=>'L', +8072=>'L', +8073=>'L', +8074=>'L', +8075=>'L', +8076=>'L', +8077=>'L', +8078=>'L', +8079=>'L', +8080=>'L', +8081=>'L', +8082=>'L', +8083=>'L', +8084=>'L', +8085=>'L', +8086=>'L', +8087=>'L', +8088=>'L', +8089=>'L', +8090=>'L', +8091=>'L', +8092=>'L', +8093=>'L', +8094=>'L', +8095=>'L', +8096=>'L', +8097=>'L', +8098=>'L', +8099=>'L', +8100=>'L', +8101=>'L', +8102=>'L', +8103=>'L', +8104=>'L', +8105=>'L', +8106=>'L', +8107=>'L', +8108=>'L', +8109=>'L', +8110=>'L', +8111=>'L', +8112=>'L', +8113=>'L', +8114=>'L', +8115=>'L', +8116=>'L', +8118=>'L', +8119=>'L', +8120=>'L', +8121=>'L', +8122=>'L', +8123=>'L', +8124=>'L', +8125=>'ON', +8126=>'L', +8127=>'ON', +8128=>'ON', +8129=>'ON', +8130=>'L', +8131=>'L', +8132=>'L', +8134=>'L', +8135=>'L', +8136=>'L', +8137=>'L', +8138=>'L', +8139=>'L', +8140=>'L', +8141=>'ON', +8142=>'ON', +8143=>'ON', +8144=>'L', +8145=>'L', +8146=>'L', +8147=>'L', +8150=>'L', +8151=>'L', +8152=>'L', +8153=>'L', +8154=>'L', +8155=>'L', +8157=>'ON', +8158=>'ON', +8159=>'ON', +8160=>'L', +8161=>'L', +8162=>'L', +8163=>'L', +8164=>'L', +8165=>'L', +8166=>'L', +8167=>'L', +8168=>'L', +8169=>'L', +8170=>'L', +8171=>'L', +8172=>'L', +8173=>'ON', +8174=>'ON', +8175=>'ON', +8178=>'L', +8179=>'L', +8180=>'L', +8182=>'L', +8183=>'L', +8184=>'L', +8185=>'L', +8186=>'L', +8187=>'L', +8188=>'L', +8189=>'ON', +8190=>'ON', +8192=>'WS', +8193=>'WS', +8194=>'WS', +8195=>'WS', +8196=>'WS', +8197=>'WS', +8198=>'WS', +8199=>'WS', +8200=>'WS', +8201=>'WS', +8202=>'WS', +8203=>'BN', +8204=>'BN', +8205=>'BN', +8206=>'L', +8207=>'R', +8208=>'ON', +8209=>'ON', +8210=>'ON', +8211=>'ON', +8212=>'ON', +8213=>'ON', +8214=>'ON', +8215=>'ON', +8216=>'ON', +8217=>'ON', +8218=>'ON', +8219=>'ON', +8220=>'ON', +8221=>'ON', +8222=>'ON', +8223=>'ON', +8224=>'ON', +8225=>'ON', +8226=>'ON', +8227=>'ON', +8228=>'ON', +8229=>'ON', +8230=>'ON', +8231=>'ON', +8232=>'WS', +8233=>'B', +8234=>'LRE', +8235=>'RLE', +8236=>'PDF', +8237=>'LRO', +8238=>'RLO', +8239=>'CS', +8240=>'ET', +8241=>'ET', +8242=>'ET', +8243=>'ET', +8244=>'ET', +8245=>'ON', +8246=>'ON', +8247=>'ON', +8248=>'ON', +8249=>'ON', +8250=>'ON', +8251=>'ON', +8252=>'ON', +8253=>'ON', +8254=>'ON', +8255=>'ON', +8256=>'ON', +8257=>'ON', +8258=>'ON', +8259=>'ON', +8260=>'CS', +8261=>'ON', +8262=>'ON', +8263=>'ON', +8264=>'ON', +8265=>'ON', +8266=>'ON', +8267=>'ON', +8268=>'ON', +8269=>'ON', +8270=>'ON', +8271=>'ON', +8272=>'ON', +8273=>'ON', +8274=>'ON', +8275=>'ON', +8276=>'ON', +8277=>'ON', +8278=>'ON', +8279=>'ON', +8280=>'ON', +8281=>'ON', +8282=>'ON', +8283=>'ON', +8284=>'ON', +8285=>'ON', +8286=>'ON', +8287=>'WS', +8288=>'BN', +8289=>'BN', +8290=>'BN', +8291=>'BN', +8298=>'BN', +8299=>'BN', +8300=>'BN', +8301=>'BN', +8302=>'BN', +8303=>'BN', +8304=>'EN', +8305=>'L', +8308=>'EN', +8309=>'EN', +8310=>'EN', +8311=>'EN', +8312=>'EN', +8313=>'EN', +8314=>'ES', +8315=>'ES', +8316=>'ON', +8317=>'ON', +8318=>'ON', +8319=>'L', +8320=>'EN', +8321=>'EN', +8322=>'EN', +8323=>'EN', +8324=>'EN', +8325=>'EN', +8326=>'EN', +8327=>'EN', +8328=>'EN', +8329=>'EN', +8330=>'ES', +8331=>'ES', +8332=>'ON', +8333=>'ON', +8334=>'ON', +8336=>'L', +8337=>'L', +8338=>'L', +8339=>'L', +8340=>'L', +8352=>'ET', +8353=>'ET', +8354=>'ET', +8355=>'ET', +8356=>'ET', +8357=>'ET', +8358=>'ET', +8359=>'ET', +8360=>'ET', +8361=>'ET', +8362=>'ET', +8363=>'ET', +8364=>'ET', +8365=>'ET', +8366=>'ET', +8367=>'ET', +8368=>'ET', +8369=>'ET', +8370=>'ET', +8371=>'ET', +8372=>'ET', +8373=>'ET', +8400=>'NSM', +8401=>'NSM', +8402=>'NSM', +8403=>'NSM', +8404=>'NSM', +8405=>'NSM', +8406=>'NSM', +8407=>'NSM', +8408=>'NSM', +8409=>'NSM', +8410=>'NSM', +8411=>'NSM', +8412=>'NSM', +8413=>'NSM', +8414=>'NSM', +8415=>'NSM', +8416=>'NSM', +8417=>'NSM', +8418=>'NSM', +8419=>'NSM', +8420=>'NSM', +8421=>'NSM', +8422=>'NSM', +8423=>'NSM', +8424=>'NSM', +8425=>'NSM', +8426=>'NSM', +8427=>'NSM', +8428=>'NSM', +8429=>'NSM', +8430=>'NSM', +8431=>'NSM', +8448=>'ON', +8449=>'ON', +8450=>'L', +8451=>'ON', +8452=>'ON', +8453=>'ON', +8454=>'ON', +8455=>'L', +8456=>'ON', +8457=>'ON', +8458=>'L', +8459=>'L', +8460=>'L', +8461=>'L', +8462=>'L', +8463=>'L', +8464=>'L', +8465=>'L', +8466=>'L', +8467=>'L', +8468=>'ON', +8469=>'L', +8470=>'ON', +8471=>'ON', +8472=>'ON', +8473=>'L', +8474=>'L', +8475=>'L', +8476=>'L', +8477=>'L', +8478=>'ON', +8479=>'ON', +8480=>'ON', +8481=>'ON', +8482=>'ON', +8483=>'ON', +8484=>'L', +8485=>'ON', +8486=>'L', +8487=>'ON', +8488=>'L', +8489=>'ON', +8490=>'L', +8491=>'L', +8492=>'L', +8493=>'L', +8494=>'ET', +8495=>'L', +8496=>'L', +8497=>'L', +8498=>'L', +8499=>'L', +8500=>'L', +8501=>'L', +8502=>'L', +8503=>'L', +8504=>'L', +8505=>'L', +8506=>'ON', +8507=>'ON', +8508=>'L', +8509=>'L', +8510=>'L', +8511=>'L', +8512=>'ON', +8513=>'ON', +8514=>'ON', +8515=>'ON', +8516=>'ON', +8517=>'L', +8518=>'L', +8519=>'L', +8520=>'L', +8521=>'L', +8522=>'ON', +8523=>'ON', +8524=>'ON', +8525=>'ON', +8526=>'L', +8531=>'ON', +8532=>'ON', +8533=>'ON', +8534=>'ON', +8535=>'ON', +8536=>'ON', +8537=>'ON', +8538=>'ON', +8539=>'ON', +8540=>'ON', +8541=>'ON', +8542=>'ON', +8543=>'ON', +8544=>'L', +8545=>'L', +8546=>'L', +8547=>'L', +8548=>'L', +8549=>'L', +8550=>'L', +8551=>'L', +8552=>'L', +8553=>'L', +8554=>'L', +8555=>'L', +8556=>'L', +8557=>'L', +8558=>'L', +8559=>'L', +8560=>'L', +8561=>'L', +8562=>'L', +8563=>'L', +8564=>'L', +8565=>'L', +8566=>'L', +8567=>'L', +8568=>'L', +8569=>'L', +8570=>'L', +8571=>'L', +8572=>'L', +8573=>'L', +8574=>'L', +8575=>'L', +8576=>'L', +8577=>'L', +8578=>'L', +8579=>'L', +8580=>'L', +8592=>'ON', +8593=>'ON', +8594=>'ON', +8595=>'ON', +8596=>'ON', +8597=>'ON', +8598=>'ON', +8599=>'ON', +8600=>'ON', +8601=>'ON', +8602=>'ON', +8603=>'ON', +8604=>'ON', +8605=>'ON', +8606=>'ON', +8607=>'ON', +8608=>'ON', +8609=>'ON', +8610=>'ON', +8611=>'ON', +8612=>'ON', +8613=>'ON', +8614=>'ON', +8615=>'ON', +8616=>'ON', +8617=>'ON', +8618=>'ON', +8619=>'ON', +8620=>'ON', +8621=>'ON', +8622=>'ON', +8623=>'ON', +8624=>'ON', +8625=>'ON', +8626=>'ON', +8627=>'ON', +8628=>'ON', +8629=>'ON', +8630=>'ON', +8631=>'ON', +8632=>'ON', +8633=>'ON', +8634=>'ON', +8635=>'ON', +8636=>'ON', +8637=>'ON', +8638=>'ON', +8639=>'ON', +8640=>'ON', +8641=>'ON', +8642=>'ON', +8643=>'ON', +8644=>'ON', +8645=>'ON', +8646=>'ON', +8647=>'ON', +8648=>'ON', +8649=>'ON', +8650=>'ON', +8651=>'ON', +8652=>'ON', +8653=>'ON', +8654=>'ON', +8655=>'ON', +8656=>'ON', +8657=>'ON', +8658=>'ON', +8659=>'ON', +8660=>'ON', +8661=>'ON', +8662=>'ON', +8663=>'ON', +8664=>'ON', +8665=>'ON', +8666=>'ON', +8667=>'ON', +8668=>'ON', +8669=>'ON', +8670=>'ON', +8671=>'ON', +8672=>'ON', +8673=>'ON', +8674=>'ON', +8675=>'ON', +8676=>'ON', +8677=>'ON', +8678=>'ON', +8679=>'ON', +8680=>'ON', +8681=>'ON', +8682=>'ON', +8683=>'ON', +8684=>'ON', +8685=>'ON', +8686=>'ON', +8687=>'ON', +8688=>'ON', +8689=>'ON', +8690=>'ON', +8691=>'ON', +8692=>'ON', +8693=>'ON', +8694=>'ON', +8695=>'ON', +8696=>'ON', +8697=>'ON', +8698=>'ON', +8699=>'ON', +8700=>'ON', +8701=>'ON', +8702=>'ON', +8703=>'ON', +8704=>'ON', +8705=>'ON', +8706=>'ON', +8707=>'ON', +8708=>'ON', +8709=>'ON', +8710=>'ON', +8711=>'ON', +8712=>'ON', +8713=>'ON', +8714=>'ON', +8715=>'ON', +8716=>'ON', +8717=>'ON', +8718=>'ON', +8719=>'ON', +8720=>'ON', +8721=>'ON', +8722=>'ES', +8723=>'ET', +8724=>'ON', +8725=>'ON', +8726=>'ON', +8727=>'ON', +8728=>'ON', +8729=>'ON', +8730=>'ON', +8731=>'ON', +8732=>'ON', +8733=>'ON', +8734=>'ON', +8735=>'ON', +8736=>'ON', +8737=>'ON', +8738=>'ON', +8739=>'ON', +8740=>'ON', +8741=>'ON', +8742=>'ON', +8743=>'ON', +8744=>'ON', +8745=>'ON', +8746=>'ON', +8747=>'ON', +8748=>'ON', +8749=>'ON', +8750=>'ON', +8751=>'ON', +8752=>'ON', +8753=>'ON', +8754=>'ON', +8755=>'ON', +8756=>'ON', +8757=>'ON', +8758=>'ON', +8759=>'ON', +8760=>'ON', +8761=>'ON', +8762=>'ON', +8763=>'ON', +8764=>'ON', +8765=>'ON', +8766=>'ON', +8767=>'ON', +8768=>'ON', +8769=>'ON', +8770=>'ON', +8771=>'ON', +8772=>'ON', +8773=>'ON', +8774=>'ON', +8775=>'ON', +8776=>'ON', +8777=>'ON', +8778=>'ON', +8779=>'ON', +8780=>'ON', +8781=>'ON', +8782=>'ON', +8783=>'ON', +8784=>'ON', +8785=>'ON', +8786=>'ON', +8787=>'ON', +8788=>'ON', +8789=>'ON', +8790=>'ON', +8791=>'ON', +8792=>'ON', +8793=>'ON', +8794=>'ON', +8795=>'ON', +8796=>'ON', +8797=>'ON', +8798=>'ON', +8799=>'ON', +8800=>'ON', +8801=>'ON', +8802=>'ON', +8803=>'ON', +8804=>'ON', +8805=>'ON', +8806=>'ON', +8807=>'ON', +8808=>'ON', +8809=>'ON', +8810=>'ON', +8811=>'ON', +8812=>'ON', +8813=>'ON', +8814=>'ON', +8815=>'ON', +8816=>'ON', +8817=>'ON', +8818=>'ON', +8819=>'ON', +8820=>'ON', +8821=>'ON', +8822=>'ON', +8823=>'ON', +8824=>'ON', +8825=>'ON', +8826=>'ON', +8827=>'ON', +8828=>'ON', +8829=>'ON', +8830=>'ON', +8831=>'ON', +8832=>'ON', +8833=>'ON', +8834=>'ON', +8835=>'ON', +8836=>'ON', +8837=>'ON', +8838=>'ON', +8839=>'ON', +8840=>'ON', +8841=>'ON', +8842=>'ON', +8843=>'ON', +8844=>'ON', +8845=>'ON', +8846=>'ON', +8847=>'ON', +8848=>'ON', +8849=>'ON', +8850=>'ON', +8851=>'ON', +8852=>'ON', +8853=>'ON', +8854=>'ON', +8855=>'ON', +8856=>'ON', +8857=>'ON', +8858=>'ON', +8859=>'ON', +8860=>'ON', +8861=>'ON', +8862=>'ON', +8863=>'ON', +8864=>'ON', +8865=>'ON', +8866=>'ON', +8867=>'ON', +8868=>'ON', +8869=>'ON', +8870=>'ON', +8871=>'ON', +8872=>'ON', +8873=>'ON', +8874=>'ON', +8875=>'ON', +8876=>'ON', +8877=>'ON', +8878=>'ON', +8879=>'ON', +8880=>'ON', +8881=>'ON', +8882=>'ON', +8883=>'ON', +8884=>'ON', +8885=>'ON', +8886=>'ON', +8887=>'ON', +8888=>'ON', +8889=>'ON', +8890=>'ON', +8891=>'ON', +8892=>'ON', +8893=>'ON', +8894=>'ON', +8895=>'ON', +8896=>'ON', +8897=>'ON', +8898=>'ON', +8899=>'ON', +8900=>'ON', +8901=>'ON', +8902=>'ON', +8903=>'ON', +8904=>'ON', +8905=>'ON', +8906=>'ON', +8907=>'ON', +8908=>'ON', +8909=>'ON', +8910=>'ON', +8911=>'ON', +8912=>'ON', +8913=>'ON', +8914=>'ON', +8915=>'ON', +8916=>'ON', +8917=>'ON', +8918=>'ON', +8919=>'ON', +8920=>'ON', +8921=>'ON', +8922=>'ON', +8923=>'ON', +8924=>'ON', +8925=>'ON', +8926=>'ON', +8927=>'ON', +8928=>'ON', +8929=>'ON', +8930=>'ON', +8931=>'ON', +8932=>'ON', +8933=>'ON', +8934=>'ON', +8935=>'ON', +8936=>'ON', +8937=>'ON', +8938=>'ON', +8939=>'ON', +8940=>'ON', +8941=>'ON', +8942=>'ON', +8943=>'ON', +8944=>'ON', +8945=>'ON', +8946=>'ON', +8947=>'ON', +8948=>'ON', +8949=>'ON', +8950=>'ON', +8951=>'ON', +8952=>'ON', +8953=>'ON', +8954=>'ON', +8955=>'ON', +8956=>'ON', +8957=>'ON', +8958=>'ON', +8959=>'ON', +8960=>'ON', +8961=>'ON', +8962=>'ON', +8963=>'ON', +8964=>'ON', +8965=>'ON', +8966=>'ON', +8967=>'ON', +8968=>'ON', +8969=>'ON', +8970=>'ON', +8971=>'ON', +8972=>'ON', +8973=>'ON', +8974=>'ON', +8975=>'ON', +8976=>'ON', +8977=>'ON', +8978=>'ON', +8979=>'ON', +8980=>'ON', +8981=>'ON', +8982=>'ON', +8983=>'ON', +8984=>'ON', +8985=>'ON', +8986=>'ON', +8987=>'ON', +8988=>'ON', +8989=>'ON', +8990=>'ON', +8991=>'ON', +8992=>'ON', +8993=>'ON', +8994=>'ON', +8995=>'ON', +8996=>'ON', +8997=>'ON', +8998=>'ON', +8999=>'ON', +9000=>'ON', +9001=>'ON', +9002=>'ON', +9003=>'ON', +9004=>'ON', +9005=>'ON', +9006=>'ON', +9007=>'ON', +9008=>'ON', +9009=>'ON', +9010=>'ON', +9011=>'ON', +9012=>'ON', +9013=>'ON', +9014=>'L', +9015=>'L', +9016=>'L', +9017=>'L', +9018=>'L', +9019=>'L', +9020=>'L', +9021=>'L', +9022=>'L', +9023=>'L', +9024=>'L', +9025=>'L', +9026=>'L', +9027=>'L', +9028=>'L', +9029=>'L', +9030=>'L', +9031=>'L', +9032=>'L', +9033=>'L', +9034=>'L', +9035=>'L', +9036=>'L', +9037=>'L', +9038=>'L', +9039=>'L', +9040=>'L', +9041=>'L', +9042=>'L', +9043=>'L', +9044=>'L', +9045=>'L', +9046=>'L', +9047=>'L', +9048=>'L', +9049=>'L', +9050=>'L', +9051=>'L', +9052=>'L', +9053=>'L', +9054=>'L', +9055=>'L', +9056=>'L', +9057=>'L', +9058=>'L', +9059=>'L', +9060=>'L', +9061=>'L', +9062=>'L', +9063=>'L', +9064=>'L', +9065=>'L', +9066=>'L', +9067=>'L', +9068=>'L', +9069=>'L', +9070=>'L', +9071=>'L', +9072=>'L', +9073=>'L', +9074=>'L', +9075=>'L', +9076=>'L', +9077=>'L', +9078=>'L', +9079=>'L', +9080=>'L', +9081=>'L', +9082=>'L', +9083=>'ON', +9084=>'ON', +9085=>'ON', +9086=>'ON', +9087=>'ON', +9088=>'ON', +9089=>'ON', +9090=>'ON', +9091=>'ON', +9092=>'ON', +9093=>'ON', +9094=>'ON', +9095=>'ON', +9096=>'ON', +9097=>'ON', +9098=>'ON', +9099=>'ON', +9100=>'ON', +9101=>'ON', +9102=>'ON', +9103=>'ON', +9104=>'ON', +9105=>'ON', +9106=>'ON', +9107=>'ON', +9108=>'ON', +9109=>'L', +9110=>'ON', +9111=>'ON', +9112=>'ON', +9113=>'ON', +9114=>'ON', +9115=>'ON', +9116=>'ON', +9117=>'ON', +9118=>'ON', +9119=>'ON', +9120=>'ON', +9121=>'ON', +9122=>'ON', +9123=>'ON', +9124=>'ON', +9125=>'ON', +9126=>'ON', +9127=>'ON', +9128=>'ON', +9129=>'ON', +9130=>'ON', +9131=>'ON', +9132=>'ON', +9133=>'ON', +9134=>'ON', +9135=>'ON', +9136=>'ON', +9137=>'ON', +9138=>'ON', +9139=>'ON', +9140=>'ON', +9141=>'ON', +9142=>'ON', +9143=>'ON', +9144=>'ON', +9145=>'ON', +9146=>'ON', +9147=>'ON', +9148=>'ON', +9149=>'ON', +9150=>'ON', +9151=>'ON', +9152=>'ON', +9153=>'ON', +9154=>'ON', +9155=>'ON', +9156=>'ON', +9157=>'ON', +9158=>'ON', +9159=>'ON', +9160=>'ON', +9161=>'ON', +9162=>'ON', +9163=>'ON', +9164=>'ON', +9165=>'ON', +9166=>'ON', +9167=>'ON', +9168=>'ON', +9169=>'ON', +9170=>'ON', +9171=>'ON', +9172=>'ON', +9173=>'ON', +9174=>'ON', +9175=>'ON', +9176=>'ON', +9177=>'ON', +9178=>'ON', +9179=>'ON', +9180=>'ON', +9181=>'ON', +9182=>'ON', +9183=>'ON', +9184=>'ON', +9185=>'ON', +9186=>'ON', +9187=>'ON', +9188=>'ON', +9189=>'ON', +9190=>'ON', +9191=>'ON', +9216=>'ON', +9217=>'ON', +9218=>'ON', +9219=>'ON', +9220=>'ON', +9221=>'ON', +9222=>'ON', +9223=>'ON', +9224=>'ON', +9225=>'ON', +9226=>'ON', +9227=>'ON', +9228=>'ON', +9229=>'ON', +9230=>'ON', +9231=>'ON', +9232=>'ON', +9233=>'ON', +9234=>'ON', +9235=>'ON', +9236=>'ON', +9237=>'ON', +9238=>'ON', +9239=>'ON', +9240=>'ON', +9241=>'ON', +9242=>'ON', +9243=>'ON', +9244=>'ON', +9245=>'ON', +9246=>'ON', +9247=>'ON', +9248=>'ON', +9249=>'ON', +9250=>'ON', +9251=>'ON', +9252=>'ON', +9253=>'ON', +9254=>'ON', +9280=>'ON', +9281=>'ON', +9282=>'ON', +9283=>'ON', +9284=>'ON', +9285=>'ON', +9286=>'ON', +9287=>'ON', +9288=>'ON', +9289=>'ON', +9290=>'ON', +9312=>'ON', +9313=>'ON', +9314=>'ON', +9315=>'ON', +9316=>'ON', +9317=>'ON', +9318=>'ON', +9319=>'ON', +9320=>'ON', +9321=>'ON', +9322=>'ON', +9323=>'ON', +9324=>'ON', +9325=>'ON', +9326=>'ON', +9327=>'ON', +9328=>'ON', +9329=>'ON', +9330=>'ON', +9331=>'ON', +9332=>'ON', +9333=>'ON', +9334=>'ON', +9335=>'ON', +9336=>'ON', +9337=>'ON', +9338=>'ON', +9339=>'ON', +9340=>'ON', +9341=>'ON', +9342=>'ON', +9343=>'ON', +9344=>'ON', +9345=>'ON', +9346=>'ON', +9347=>'ON', +9348=>'ON', +9349=>'ON', +9350=>'ON', +9351=>'ON', +9352=>'EN', +9353=>'EN', +9354=>'EN', +9355=>'EN', +9356=>'EN', +9357=>'EN', +9358=>'EN', +9359=>'EN', +9360=>'EN', +9361=>'EN', +9362=>'EN', +9363=>'EN', +9364=>'EN', +9365=>'EN', +9366=>'EN', +9367=>'EN', +9368=>'EN', +9369=>'EN', +9370=>'EN', +9371=>'EN', +9372=>'L', +9373=>'L', +9374=>'L', +9375=>'L', +9376=>'L', +9377=>'L', +9378=>'L', +9379=>'L', +9380=>'L', +9381=>'L', +9382=>'L', +9383=>'L', +9384=>'L', +9385=>'L', +9386=>'L', +9387=>'L', +9388=>'L', +9389=>'L', +9390=>'L', +9391=>'L', +9392=>'L', +9393=>'L', +9394=>'L', +9395=>'L', +9396=>'L', +9397=>'L', +9398=>'L', +9399=>'L', +9400=>'L', +9401=>'L', +9402=>'L', +9403=>'L', +9404=>'L', +9405=>'L', +9406=>'L', +9407=>'L', +9408=>'L', +9409=>'L', +9410=>'L', +9411=>'L', +9412=>'L', +9413=>'L', +9414=>'L', +9415=>'L', +9416=>'L', +9417=>'L', +9418=>'L', +9419=>'L', +9420=>'L', +9421=>'L', +9422=>'L', +9423=>'L', +9424=>'L', +9425=>'L', +9426=>'L', +9427=>'L', +9428=>'L', +9429=>'L', +9430=>'L', +9431=>'L', +9432=>'L', +9433=>'L', +9434=>'L', +9435=>'L', +9436=>'L', +9437=>'L', +9438=>'L', +9439=>'L', +9440=>'L', +9441=>'L', +9442=>'L', +9443=>'L', +9444=>'L', +9445=>'L', +9446=>'L', +9447=>'L', +9448=>'L', +9449=>'L', +9450=>'ON', +9451=>'ON', +9452=>'ON', +9453=>'ON', +9454=>'ON', +9455=>'ON', +9456=>'ON', +9457=>'ON', +9458=>'ON', +9459=>'ON', +9460=>'ON', +9461=>'ON', +9462=>'ON', +9463=>'ON', +9464=>'ON', +9465=>'ON', +9466=>'ON', +9467=>'ON', +9468=>'ON', +9469=>'ON', +9470=>'ON', +9471=>'ON', +9472=>'ON', +9473=>'ON', +9474=>'ON', +9475=>'ON', +9476=>'ON', +9477=>'ON', +9478=>'ON', +9479=>'ON', +9480=>'ON', +9481=>'ON', +9482=>'ON', +9483=>'ON', +9484=>'ON', +9485=>'ON', +9486=>'ON', +9487=>'ON', +9488=>'ON', +9489=>'ON', +9490=>'ON', +9491=>'ON', +9492=>'ON', +9493=>'ON', +9494=>'ON', +9495=>'ON', +9496=>'ON', +9497=>'ON', +9498=>'ON', +9499=>'ON', +9500=>'ON', +9501=>'ON', +9502=>'ON', +9503=>'ON', +9504=>'ON', +9505=>'ON', +9506=>'ON', +9507=>'ON', +9508=>'ON', +9509=>'ON', +9510=>'ON', +9511=>'ON', +9512=>'ON', +9513=>'ON', +9514=>'ON', +9515=>'ON', +9516=>'ON', +9517=>'ON', +9518=>'ON', +9519=>'ON', +9520=>'ON', +9521=>'ON', +9522=>'ON', +9523=>'ON', +9524=>'ON', +9525=>'ON', +9526=>'ON', +9527=>'ON', +9528=>'ON', +9529=>'ON', +9530=>'ON', +9531=>'ON', +9532=>'ON', +9533=>'ON', +9534=>'ON', +9535=>'ON', +9536=>'ON', +9537=>'ON', +9538=>'ON', +9539=>'ON', +9540=>'ON', +9541=>'ON', +9542=>'ON', +9543=>'ON', +9544=>'ON', +9545=>'ON', +9546=>'ON', +9547=>'ON', +9548=>'ON', +9549=>'ON', +9550=>'ON', +9551=>'ON', +9552=>'ON', +9553=>'ON', +9554=>'ON', +9555=>'ON', +9556=>'ON', +9557=>'ON', +9558=>'ON', +9559=>'ON', +9560=>'ON', +9561=>'ON', +9562=>'ON', +9563=>'ON', +9564=>'ON', +9565=>'ON', +9566=>'ON', +9567=>'ON', +9568=>'ON', +9569=>'ON', +9570=>'ON', +9571=>'ON', +9572=>'ON', +9573=>'ON', +9574=>'ON', +9575=>'ON', +9576=>'ON', +9577=>'ON', +9578=>'ON', +9579=>'ON', +9580=>'ON', +9581=>'ON', +9582=>'ON', +9583=>'ON', +9584=>'ON', +9585=>'ON', +9586=>'ON', +9587=>'ON', +9588=>'ON', +9589=>'ON', +9590=>'ON', +9591=>'ON', +9592=>'ON', +9593=>'ON', +9594=>'ON', +9595=>'ON', +9596=>'ON', +9597=>'ON', +9598=>'ON', +9599=>'ON', +9600=>'ON', +9601=>'ON', +9602=>'ON', +9603=>'ON', +9604=>'ON', +9605=>'ON', +9606=>'ON', +9607=>'ON', +9608=>'ON', +9609=>'ON', +9610=>'ON', +9611=>'ON', +9612=>'ON', +9613=>'ON', +9614=>'ON', +9615=>'ON', +9616=>'ON', +9617=>'ON', +9618=>'ON', +9619=>'ON', +9620=>'ON', +9621=>'ON', +9622=>'ON', +9623=>'ON', +9624=>'ON', +9625=>'ON', +9626=>'ON', +9627=>'ON', +9628=>'ON', +9629=>'ON', +9630=>'ON', +9631=>'ON', +9632=>'ON', +9633=>'ON', +9634=>'ON', +9635=>'ON', +9636=>'ON', +9637=>'ON', +9638=>'ON', +9639=>'ON', +9640=>'ON', +9641=>'ON', +9642=>'ON', +9643=>'ON', +9644=>'ON', +9645=>'ON', +9646=>'ON', +9647=>'ON', +9648=>'ON', +9649=>'ON', +9650=>'ON', +9651=>'ON', +9652=>'ON', +9653=>'ON', +9654=>'ON', +9655=>'ON', +9656=>'ON', +9657=>'ON', +9658=>'ON', +9659=>'ON', +9660=>'ON', +9661=>'ON', +9662=>'ON', +9663=>'ON', +9664=>'ON', +9665=>'ON', +9666=>'ON', +9667=>'ON', +9668=>'ON', +9669=>'ON', +9670=>'ON', +9671=>'ON', +9672=>'ON', +9673=>'ON', +9674=>'ON', +9675=>'ON', +9676=>'ON', +9677=>'ON', +9678=>'ON', +9679=>'ON', +9680=>'ON', +9681=>'ON', +9682=>'ON', +9683=>'ON', +9684=>'ON', +9685=>'ON', +9686=>'ON', +9687=>'ON', +9688=>'ON', +9689=>'ON', +9690=>'ON', +9691=>'ON', +9692=>'ON', +9693=>'ON', +9694=>'ON', +9695=>'ON', +9696=>'ON', +9697=>'ON', +9698=>'ON', +9699=>'ON', +9700=>'ON', +9701=>'ON', +9702=>'ON', +9703=>'ON', +9704=>'ON', +9705=>'ON', +9706=>'ON', +9707=>'ON', +9708=>'ON', +9709=>'ON', +9710=>'ON', +9711=>'ON', +9712=>'ON', +9713=>'ON', +9714=>'ON', +9715=>'ON', +9716=>'ON', +9717=>'ON', +9718=>'ON', +9719=>'ON', +9720=>'ON', +9721=>'ON', +9722=>'ON', +9723=>'ON', +9724=>'ON', +9725=>'ON', +9726=>'ON', +9727=>'ON', +9728=>'ON', +9729=>'ON', +9730=>'ON', +9731=>'ON', +9732=>'ON', +9733=>'ON', +9734=>'ON', +9735=>'ON', +9736=>'ON', +9737=>'ON', +9738=>'ON', +9739=>'ON', +9740=>'ON', +9741=>'ON', +9742=>'ON', +9743=>'ON', +9744=>'ON', +9745=>'ON', +9746=>'ON', +9747=>'ON', +9748=>'ON', +9749=>'ON', +9750=>'ON', +9751=>'ON', +9752=>'ON', +9753=>'ON', +9754=>'ON', +9755=>'ON', +9756=>'ON', +9757=>'ON', +9758=>'ON', +9759=>'ON', +9760=>'ON', +9761=>'ON', +9762=>'ON', +9763=>'ON', +9764=>'ON', +9765=>'ON', +9766=>'ON', +9767=>'ON', +9768=>'ON', +9769=>'ON', +9770=>'ON', +9771=>'ON', +9772=>'ON', +9773=>'ON', +9774=>'ON', +9775=>'ON', +9776=>'ON', +9777=>'ON', +9778=>'ON', +9779=>'ON', +9780=>'ON', +9781=>'ON', +9782=>'ON', +9783=>'ON', +9784=>'ON', +9785=>'ON', +9786=>'ON', +9787=>'ON', +9788=>'ON', +9789=>'ON', +9790=>'ON', +9791=>'ON', +9792=>'ON', +9793=>'ON', +9794=>'ON', +9795=>'ON', +9796=>'ON', +9797=>'ON', +9798=>'ON', +9799=>'ON', +9800=>'ON', +9801=>'ON', +9802=>'ON', +9803=>'ON', +9804=>'ON', +9805=>'ON', +9806=>'ON', +9807=>'ON', +9808=>'ON', +9809=>'ON', +9810=>'ON', +9811=>'ON', +9812=>'ON', +9813=>'ON', +9814=>'ON', +9815=>'ON', +9816=>'ON', +9817=>'ON', +9818=>'ON', +9819=>'ON', +9820=>'ON', +9821=>'ON', +9822=>'ON', +9823=>'ON', +9824=>'ON', +9825=>'ON', +9826=>'ON', +9827=>'ON', +9828=>'ON', +9829=>'ON', +9830=>'ON', +9831=>'ON', +9832=>'ON', +9833=>'ON', +9834=>'ON', +9835=>'ON', +9836=>'ON', +9837=>'ON', +9838=>'ON', +9839=>'ON', +9840=>'ON', +9841=>'ON', +9842=>'ON', +9843=>'ON', +9844=>'ON', +9845=>'ON', +9846=>'ON', +9847=>'ON', +9848=>'ON', +9849=>'ON', +9850=>'ON', +9851=>'ON', +9852=>'ON', +9853=>'ON', +9854=>'ON', +9855=>'ON', +9856=>'ON', +9857=>'ON', +9858=>'ON', +9859=>'ON', +9860=>'ON', +9861=>'ON', +9862=>'ON', +9863=>'ON', +9864=>'ON', +9865=>'ON', +9866=>'ON', +9867=>'ON', +9868=>'ON', +9869=>'ON', +9870=>'ON', +9871=>'ON', +9872=>'ON', +9873=>'ON', +9874=>'ON', +9875=>'ON', +9876=>'ON', +9877=>'ON', +9878=>'ON', +9879=>'ON', +9880=>'ON', +9881=>'ON', +9882=>'ON', +9883=>'ON', +9884=>'ON', +9888=>'ON', +9889=>'ON', +9890=>'ON', +9891=>'ON', +9892=>'ON', +9893=>'ON', +9894=>'ON', +9895=>'ON', +9896=>'ON', +9897=>'ON', +9898=>'ON', +9899=>'ON', +9900=>'L', +9901=>'ON', +9902=>'ON', +9903=>'ON', +9904=>'ON', +9905=>'ON', +9906=>'ON', +9985=>'ON', +9986=>'ON', +9987=>'ON', +9988=>'ON', +9990=>'ON', +9991=>'ON', +9992=>'ON', +9993=>'ON', +9996=>'ON', +9997=>'ON', +9998=>'ON', +9999=>'ON', +10000=>'ON', +10001=>'ON', +10002=>'ON', +10003=>'ON', +10004=>'ON', +10005=>'ON', +10006=>'ON', +10007=>'ON', +10008=>'ON', +10009=>'ON', +10010=>'ON', +10011=>'ON', +10012=>'ON', +10013=>'ON', +10014=>'ON', +10015=>'ON', +10016=>'ON', +10017=>'ON', +10018=>'ON', +10019=>'ON', +10020=>'ON', +10021=>'ON', +10022=>'ON', +10023=>'ON', +10025=>'ON', +10026=>'ON', +10027=>'ON', +10028=>'ON', +10029=>'ON', +10030=>'ON', +10031=>'ON', +10032=>'ON', +10033=>'ON', +10034=>'ON', +10035=>'ON', +10036=>'ON', +10037=>'ON', +10038=>'ON', +10039=>'ON', +10040=>'ON', +10041=>'ON', +10042=>'ON', +10043=>'ON', +10044=>'ON', +10045=>'ON', +10046=>'ON', +10047=>'ON', +10048=>'ON', +10049=>'ON', +10050=>'ON', +10051=>'ON', +10052=>'ON', +10053=>'ON', +10054=>'ON', +10055=>'ON', +10056=>'ON', +10057=>'ON', +10058=>'ON', +10059=>'ON', +10061=>'ON', +10063=>'ON', +10064=>'ON', +10065=>'ON', +10066=>'ON', +10070=>'ON', +10072=>'ON', +10073=>'ON', +10074=>'ON', +10075=>'ON', +10076=>'ON', +10077=>'ON', +10078=>'ON', +10081=>'ON', +10082=>'ON', +10083=>'ON', +10084=>'ON', +10085=>'ON', +10086=>'ON', +10087=>'ON', +10088=>'ON', +10089=>'ON', +10090=>'ON', +10091=>'ON', +10092=>'ON', +10093=>'ON', +10094=>'ON', +10095=>'ON', +10096=>'ON', +10097=>'ON', +10098=>'ON', +10099=>'ON', +10100=>'ON', +10101=>'ON', +10102=>'ON', +10103=>'ON', +10104=>'ON', +10105=>'ON', +10106=>'ON', +10107=>'ON', +10108=>'ON', +10109=>'ON', +10110=>'ON', +10111=>'ON', +10112=>'ON', +10113=>'ON', +10114=>'ON', +10115=>'ON', +10116=>'ON', +10117=>'ON', +10118=>'ON', +10119=>'ON', +10120=>'ON', +10121=>'ON', +10122=>'ON', +10123=>'ON', +10124=>'ON', +10125=>'ON', +10126=>'ON', +10127=>'ON', +10128=>'ON', +10129=>'ON', +10130=>'ON', +10131=>'ON', +10132=>'ON', +10136=>'ON', +10137=>'ON', +10138=>'ON', +10139=>'ON', +10140=>'ON', +10141=>'ON', +10142=>'ON', +10143=>'ON', +10144=>'ON', +10145=>'ON', +10146=>'ON', +10147=>'ON', +10148=>'ON', +10149=>'ON', +10150=>'ON', +10151=>'ON', +10152=>'ON', +10153=>'ON', +10154=>'ON', +10155=>'ON', +10156=>'ON', +10157=>'ON', +10158=>'ON', +10159=>'ON', +10161=>'ON', +10162=>'ON', +10163=>'ON', +10164=>'ON', +10165=>'ON', +10166=>'ON', +10167=>'ON', +10168=>'ON', +10169=>'ON', +10170=>'ON', +10171=>'ON', +10172=>'ON', +10173=>'ON', +10174=>'ON', +10176=>'ON', +10177=>'ON', +10178=>'ON', +10179=>'ON', +10180=>'ON', +10181=>'ON', +10182=>'ON', +10183=>'ON', +10184=>'ON', +10185=>'ON', +10186=>'ON', +10192=>'ON', +10193=>'ON', +10194=>'ON', +10195=>'ON', +10196=>'ON', +10197=>'ON', +10198=>'ON', +10199=>'ON', +10200=>'ON', +10201=>'ON', +10202=>'ON', +10203=>'ON', +10204=>'ON', +10205=>'ON', +10206=>'ON', +10207=>'ON', +10208=>'ON', +10209=>'ON', +10210=>'ON', +10211=>'ON', +10212=>'ON', +10213=>'ON', +10214=>'ON', +10215=>'ON', +10216=>'ON', +10217=>'ON', +10218=>'ON', +10219=>'ON', +10224=>'ON', +10225=>'ON', +10226=>'ON', +10227=>'ON', +10228=>'ON', +10229=>'ON', +10230=>'ON', +10231=>'ON', +10232=>'ON', +10233=>'ON', +10234=>'ON', +10235=>'ON', +10236=>'ON', +10237=>'ON', +10238=>'ON', +10239=>'ON', +10240=>'L', +10241=>'L', +10242=>'L', +10243=>'L', +10244=>'L', +10245=>'L', +10246=>'L', +10247=>'L', +10248=>'L', +10249=>'L', +10250=>'L', +10251=>'L', +10252=>'L', +10253=>'L', +10254=>'L', +10255=>'L', +10256=>'L', +10257=>'L', +10258=>'L', +10259=>'L', +10260=>'L', +10261=>'L', +10262=>'L', +10263=>'L', +10264=>'L', +10265=>'L', +10266=>'L', +10267=>'L', +10268=>'L', +10269=>'L', +10270=>'L', +10271=>'L', +10272=>'L', +10273=>'L', +10274=>'L', +10275=>'L', +10276=>'L', +10277=>'L', +10278=>'L', +10279=>'L', +10280=>'L', +10281=>'L', +10282=>'L', +10283=>'L', +10284=>'L', +10285=>'L', +10286=>'L', +10287=>'L', +10288=>'L', +10289=>'L', +10290=>'L', +10291=>'L', +10292=>'L', +10293=>'L', +10294=>'L', +10295=>'L', +10296=>'L', +10297=>'L', +10298=>'L', +10299=>'L', +10300=>'L', +10301=>'L', +10302=>'L', +10303=>'L', +10304=>'L', +10305=>'L', +10306=>'L', +10307=>'L', +10308=>'L', +10309=>'L', +10310=>'L', +10311=>'L', +10312=>'L', +10313=>'L', +10314=>'L', +10315=>'L', +10316=>'L', +10317=>'L', +10318=>'L', +10319=>'L', +10320=>'L', +10321=>'L', +10322=>'L', +10323=>'L', +10324=>'L', +10325=>'L', +10326=>'L', +10327=>'L', +10328=>'L', +10329=>'L', +10330=>'L', +10331=>'L', +10332=>'L', +10333=>'L', +10334=>'L', +10335=>'L', +10336=>'L', +10337=>'L', +10338=>'L', +10339=>'L', +10340=>'L', +10341=>'L', +10342=>'L', +10343=>'L', +10344=>'L', +10345=>'L', +10346=>'L', +10347=>'L', +10348=>'L', +10349=>'L', +10350=>'L', +10351=>'L', +10352=>'L', +10353=>'L', +10354=>'L', +10355=>'L', +10356=>'L', +10357=>'L', +10358=>'L', +10359=>'L', +10360=>'L', +10361=>'L', +10362=>'L', +10363=>'L', +10364=>'L', +10365=>'L', +10366=>'L', +10367=>'L', +10368=>'L', +10369=>'L', +10370=>'L', +10371=>'L', +10372=>'L', +10373=>'L', +10374=>'L', +10375=>'L', +10376=>'L', +10377=>'L', +10378=>'L', +10379=>'L', +10380=>'L', +10381=>'L', +10382=>'L', +10383=>'L', +10384=>'L', +10385=>'L', +10386=>'L', +10387=>'L', +10388=>'L', +10389=>'L', +10390=>'L', +10391=>'L', +10392=>'L', +10393=>'L', +10394=>'L', +10395=>'L', +10396=>'L', +10397=>'L', +10398=>'L', +10399=>'L', +10400=>'L', +10401=>'L', +10402=>'L', +10403=>'L', +10404=>'L', +10405=>'L', +10406=>'L', +10407=>'L', +10408=>'L', +10409=>'L', +10410=>'L', +10411=>'L', +10412=>'L', +10413=>'L', +10414=>'L', +10415=>'L', +10416=>'L', +10417=>'L', +10418=>'L', +10419=>'L', +10420=>'L', +10421=>'L', +10422=>'L', +10423=>'L', +10424=>'L', +10425=>'L', +10426=>'L', +10427=>'L', +10428=>'L', +10429=>'L', +10430=>'L', +10431=>'L', +10432=>'L', +10433=>'L', +10434=>'L', +10435=>'L', +10436=>'L', +10437=>'L', +10438=>'L', +10439=>'L', +10440=>'L', +10441=>'L', +10442=>'L', +10443=>'L', +10444=>'L', +10445=>'L', +10446=>'L', +10447=>'L', +10448=>'L', +10449=>'L', +10450=>'L', +10451=>'L', +10452=>'L', +10453=>'L', +10454=>'L', +10455=>'L', +10456=>'L', +10457=>'L', +10458=>'L', +10459=>'L', +10460=>'L', +10461=>'L', +10462=>'L', +10463=>'L', +10464=>'L', +10465=>'L', +10466=>'L', +10467=>'L', +10468=>'L', +10469=>'L', +10470=>'L', +10471=>'L', +10472=>'L', +10473=>'L', +10474=>'L', +10475=>'L', +10476=>'L', +10477=>'L', +10478=>'L', +10479=>'L', +10480=>'L', +10481=>'L', +10482=>'L', +10483=>'L', +10484=>'L', +10485=>'L', +10486=>'L', +10487=>'L', +10488=>'L', +10489=>'L', +10490=>'L', +10491=>'L', +10492=>'L', +10493=>'L', +10494=>'L', +10495=>'L', +10496=>'ON', +10497=>'ON', +10498=>'ON', +10499=>'ON', +10500=>'ON', +10501=>'ON', +10502=>'ON', +10503=>'ON', +10504=>'ON', +10505=>'ON', +10506=>'ON', +10507=>'ON', +10508=>'ON', +10509=>'ON', +10510=>'ON', +10511=>'ON', +10512=>'ON', +10513=>'ON', +10514=>'ON', +10515=>'ON', +10516=>'ON', +10517=>'ON', +10518=>'ON', +10519=>'ON', +10520=>'ON', +10521=>'ON', +10522=>'ON', +10523=>'ON', +10524=>'ON', +10525=>'ON', +10526=>'ON', +10527=>'ON', +10528=>'ON', +10529=>'ON', +10530=>'ON', +10531=>'ON', +10532=>'ON', +10533=>'ON', +10534=>'ON', +10535=>'ON', +10536=>'ON', +10537=>'ON', +10538=>'ON', +10539=>'ON', +10540=>'ON', +10541=>'ON', +10542=>'ON', +10543=>'ON', +10544=>'ON', +10545=>'ON', +10546=>'ON', +10547=>'ON', +10548=>'ON', +10549=>'ON', +10550=>'ON', +10551=>'ON', +10552=>'ON', +10553=>'ON', +10554=>'ON', +10555=>'ON', +10556=>'ON', +10557=>'ON', +10558=>'ON', +10559=>'ON', +10560=>'ON', +10561=>'ON', +10562=>'ON', +10563=>'ON', +10564=>'ON', +10565=>'ON', +10566=>'ON', +10567=>'ON', +10568=>'ON', +10569=>'ON', +10570=>'ON', +10571=>'ON', +10572=>'ON', +10573=>'ON', +10574=>'ON', +10575=>'ON', +10576=>'ON', +10577=>'ON', +10578=>'ON', +10579=>'ON', +10580=>'ON', +10581=>'ON', +10582=>'ON', +10583=>'ON', +10584=>'ON', +10585=>'ON', +10586=>'ON', +10587=>'ON', +10588=>'ON', +10589=>'ON', +10590=>'ON', +10591=>'ON', +10592=>'ON', +10593=>'ON', +10594=>'ON', +10595=>'ON', +10596=>'ON', +10597=>'ON', +10598=>'ON', +10599=>'ON', +10600=>'ON', +10601=>'ON', +10602=>'ON', +10603=>'ON', +10604=>'ON', +10605=>'ON', +10606=>'ON', +10607=>'ON', +10608=>'ON', +10609=>'ON', +10610=>'ON', +10611=>'ON', +10612=>'ON', +10613=>'ON', +10614=>'ON', +10615=>'ON', +10616=>'ON', +10617=>'ON', +10618=>'ON', +10619=>'ON', +10620=>'ON', +10621=>'ON', +10622=>'ON', +10623=>'ON', +10624=>'ON', +10625=>'ON', +10626=>'ON', +10627=>'ON', +10628=>'ON', +10629=>'ON', +10630=>'ON', +10631=>'ON', +10632=>'ON', +10633=>'ON', +10634=>'ON', +10635=>'ON', +10636=>'ON', +10637=>'ON', +10638=>'ON', +10639=>'ON', +10640=>'ON', +10641=>'ON', +10642=>'ON', +10643=>'ON', +10644=>'ON', +10645=>'ON', +10646=>'ON', +10647=>'ON', +10648=>'ON', +10649=>'ON', +10650=>'ON', +10651=>'ON', +10652=>'ON', +10653=>'ON', +10654=>'ON', +10655=>'ON', +10656=>'ON', +10657=>'ON', +10658=>'ON', +10659=>'ON', +10660=>'ON', +10661=>'ON', +10662=>'ON', +10663=>'ON', +10664=>'ON', +10665=>'ON', +10666=>'ON', +10667=>'ON', +10668=>'ON', +10669=>'ON', +10670=>'ON', +10671=>'ON', +10672=>'ON', +10673=>'ON', +10674=>'ON', +10675=>'ON', +10676=>'ON', +10677=>'ON', +10678=>'ON', +10679=>'ON', +10680=>'ON', +10681=>'ON', +10682=>'ON', +10683=>'ON', +10684=>'ON', +10685=>'ON', +10686=>'ON', +10687=>'ON', +10688=>'ON', +10689=>'ON', +10690=>'ON', +10691=>'ON', +10692=>'ON', +10693=>'ON', +10694=>'ON', +10695=>'ON', +10696=>'ON', +10697=>'ON', +10698=>'ON', +10699=>'ON', +10700=>'ON', +10701=>'ON', +10702=>'ON', +10703=>'ON', +10704=>'ON', +10705=>'ON', +10706=>'ON', +10707=>'ON', +10708=>'ON', +10709=>'ON', +10710=>'ON', +10711=>'ON', +10712=>'ON', +10713=>'ON', +10714=>'ON', +10715=>'ON', +10716=>'ON', +10717=>'ON', +10718=>'ON', +10719=>'ON', +10720=>'ON', +10721=>'ON', +10722=>'ON', +10723=>'ON', +10724=>'ON', +10725=>'ON', +10726=>'ON', +10727=>'ON', +10728=>'ON', +10729=>'ON', +10730=>'ON', +10731=>'ON', +10732=>'ON', +10733=>'ON', +10734=>'ON', +10735=>'ON', +10736=>'ON', +10737=>'ON', +10738=>'ON', +10739=>'ON', +10740=>'ON', +10741=>'ON', +10742=>'ON', +10743=>'ON', +10744=>'ON', +10745=>'ON', +10746=>'ON', +10747=>'ON', +10748=>'ON', +10749=>'ON', +10750=>'ON', +10751=>'ON', +10752=>'ON', +10753=>'ON', +10754=>'ON', +10755=>'ON', +10756=>'ON', +10757=>'ON', +10758=>'ON', +10759=>'ON', +10760=>'ON', +10761=>'ON', +10762=>'ON', +10763=>'ON', +10764=>'ON', +10765=>'ON', +10766=>'ON', +10767=>'ON', +10768=>'ON', +10769=>'ON', +10770=>'ON', +10771=>'ON', +10772=>'ON', +10773=>'ON', +10774=>'ON', +10775=>'ON', +10776=>'ON', +10777=>'ON', +10778=>'ON', +10779=>'ON', +10780=>'ON', +10781=>'ON', +10782=>'ON', +10783=>'ON', +10784=>'ON', +10785=>'ON', +10786=>'ON', +10787=>'ON', +10788=>'ON', +10789=>'ON', +10790=>'ON', +10791=>'ON', +10792=>'ON', +10793=>'ON', +10794=>'ON', +10795=>'ON', +10796=>'ON', +10797=>'ON', +10798=>'ON', +10799=>'ON', +10800=>'ON', +10801=>'ON', +10802=>'ON', +10803=>'ON', +10804=>'ON', +10805=>'ON', +10806=>'ON', +10807=>'ON', +10808=>'ON', +10809=>'ON', +10810=>'ON', +10811=>'ON', +10812=>'ON', +10813=>'ON', +10814=>'ON', +10815=>'ON', +10816=>'ON', +10817=>'ON', +10818=>'ON', +10819=>'ON', +10820=>'ON', +10821=>'ON', +10822=>'ON', +10823=>'ON', +10824=>'ON', +10825=>'ON', +10826=>'ON', +10827=>'ON', +10828=>'ON', +10829=>'ON', +10830=>'ON', +10831=>'ON', +10832=>'ON', +10833=>'ON', +10834=>'ON', +10835=>'ON', +10836=>'ON', +10837=>'ON', +10838=>'ON', +10839=>'ON', +10840=>'ON', +10841=>'ON', +10842=>'ON', +10843=>'ON', +10844=>'ON', +10845=>'ON', +10846=>'ON', +10847=>'ON', +10848=>'ON', +10849=>'ON', +10850=>'ON', +10851=>'ON', +10852=>'ON', +10853=>'ON', +10854=>'ON', +10855=>'ON', +10856=>'ON', +10857=>'ON', +10858=>'ON', +10859=>'ON', +10860=>'ON', +10861=>'ON', +10862=>'ON', +10863=>'ON', +10864=>'ON', +10865=>'ON', +10866=>'ON', +10867=>'ON', +10868=>'ON', +10869=>'ON', +10870=>'ON', +10871=>'ON', +10872=>'ON', +10873=>'ON', +10874=>'ON', +10875=>'ON', +10876=>'ON', +10877=>'ON', +10878=>'ON', +10879=>'ON', +10880=>'ON', +10881=>'ON', +10882=>'ON', +10883=>'ON', +10884=>'ON', +10885=>'ON', +10886=>'ON', +10887=>'ON', +10888=>'ON', +10889=>'ON', +10890=>'ON', +10891=>'ON', +10892=>'ON', +10893=>'ON', +10894=>'ON', +10895=>'ON', +10896=>'ON', +10897=>'ON', +10898=>'ON', +10899=>'ON', +10900=>'ON', +10901=>'ON', +10902=>'ON', +10903=>'ON', +10904=>'ON', +10905=>'ON', +10906=>'ON', +10907=>'ON', +10908=>'ON', +10909=>'ON', +10910=>'ON', +10911=>'ON', +10912=>'ON', +10913=>'ON', +10914=>'ON', +10915=>'ON', +10916=>'ON', +10917=>'ON', +10918=>'ON', +10919=>'ON', +10920=>'ON', +10921=>'ON', +10922=>'ON', +10923=>'ON', +10924=>'ON', +10925=>'ON', +10926=>'ON', +10927=>'ON', +10928=>'ON', +10929=>'ON', +10930=>'ON', +10931=>'ON', +10932=>'ON', +10933=>'ON', +10934=>'ON', +10935=>'ON', +10936=>'ON', +10937=>'ON', +10938=>'ON', +10939=>'ON', +10940=>'ON', +10941=>'ON', +10942=>'ON', +10943=>'ON', +10944=>'ON', +10945=>'ON', +10946=>'ON', +10947=>'ON', +10948=>'ON', +10949=>'ON', +10950=>'ON', +10951=>'ON', +10952=>'ON', +10953=>'ON', +10954=>'ON', +10955=>'ON', +10956=>'ON', +10957=>'ON', +10958=>'ON', +10959=>'ON', +10960=>'ON', +10961=>'ON', +10962=>'ON', +10963=>'ON', +10964=>'ON', +10965=>'ON', +10966=>'ON', +10967=>'ON', +10968=>'ON', +10969=>'ON', +10970=>'ON', +10971=>'ON', +10972=>'ON', +10973=>'ON', +10974=>'ON', +10975=>'ON', +10976=>'ON', +10977=>'ON', +10978=>'ON', +10979=>'ON', +10980=>'ON', +10981=>'ON', +10982=>'ON', +10983=>'ON', +10984=>'ON', +10985=>'ON', +10986=>'ON', +10987=>'ON', +10988=>'ON', +10989=>'ON', +10990=>'ON', +10991=>'ON', +10992=>'ON', +10993=>'ON', +10994=>'ON', +10995=>'ON', +10996=>'ON', +10997=>'ON', +10998=>'ON', +10999=>'ON', +11000=>'ON', +11001=>'ON', +11002=>'ON', +11003=>'ON', +11004=>'ON', +11005=>'ON', +11006=>'ON', +11007=>'ON', +11008=>'ON', +11009=>'ON', +11010=>'ON', +11011=>'ON', +11012=>'ON', +11013=>'ON', +11014=>'ON', +11015=>'ON', +11016=>'ON', +11017=>'ON', +11018=>'ON', +11019=>'ON', +11020=>'ON', +11021=>'ON', +11022=>'ON', +11023=>'ON', +11024=>'ON', +11025=>'ON', +11026=>'ON', +11027=>'ON', +11028=>'ON', +11029=>'ON', +11030=>'ON', +11031=>'ON', +11032=>'ON', +11033=>'ON', +11034=>'ON', +11040=>'ON', +11041=>'ON', +11042=>'ON', +11043=>'ON', +11264=>'L', +11265=>'L', +11266=>'L', +11267=>'L', +11268=>'L', +11269=>'L', +11270=>'L', +11271=>'L', +11272=>'L', +11273=>'L', +11274=>'L', +11275=>'L', +11276=>'L', +11277=>'L', +11278=>'L', +11279=>'L', +11280=>'L', +11281=>'L', +11282=>'L', +11283=>'L', +11284=>'L', +11285=>'L', +11286=>'L', +11287=>'L', +11288=>'L', +11289=>'L', +11290=>'L', +11291=>'L', +11292=>'L', +11293=>'L', +11294=>'L', +11295=>'L', +11296=>'L', +11297=>'L', +11298=>'L', +11299=>'L', +11300=>'L', +11301=>'L', +11302=>'L', +11303=>'L', +11304=>'L', +11305=>'L', +11306=>'L', +11307=>'L', +11308=>'L', +11309=>'L', +11310=>'L', +11312=>'L', +11313=>'L', +11314=>'L', +11315=>'L', +11316=>'L', +11317=>'L', +11318=>'L', +11319=>'L', +11320=>'L', +11321=>'L', +11322=>'L', +11323=>'L', +11324=>'L', +11325=>'L', +11326=>'L', +11327=>'L', +11328=>'L', +11329=>'L', +11330=>'L', +11331=>'L', +11332=>'L', +11333=>'L', +11334=>'L', +11335=>'L', +11336=>'L', +11337=>'L', +11338=>'L', +11339=>'L', +11340=>'L', +11341=>'L', +11342=>'L', +11343=>'L', +11344=>'L', +11345=>'L', +11346=>'L', +11347=>'L', +11348=>'L', +11349=>'L', +11350=>'L', +11351=>'L', +11352=>'L', +11353=>'L', +11354=>'L', +11355=>'L', +11356=>'L', +11357=>'L', +11358=>'L', +11360=>'L', +11361=>'L', +11362=>'L', +11363=>'L', +11364=>'L', +11365=>'L', +11366=>'L', +11367=>'L', +11368=>'L', +11369=>'L', +11370=>'L', +11371=>'L', +11372=>'L', +11380=>'L', +11381=>'L', +11382=>'L', +11383=>'L', +11392=>'L', +11393=>'L', +11394=>'L', +11395=>'L', +11396=>'L', +11397=>'L', +11398=>'L', +11399=>'L', +11400=>'L', +11401=>'L', +11402=>'L', +11403=>'L', +11404=>'L', +11405=>'L', +11406=>'L', +11407=>'L', +11408=>'L', +11409=>'L', +11410=>'L', +11411=>'L', +11412=>'L', +11413=>'L', +11414=>'L', +11415=>'L', +11416=>'L', +11417=>'L', +11418=>'L', +11419=>'L', +11420=>'L', +11421=>'L', +11422=>'L', +11423=>'L', +11424=>'L', +11425=>'L', +11426=>'L', +11427=>'L', +11428=>'L', +11429=>'L', +11430=>'L', +11431=>'L', +11432=>'L', +11433=>'L', +11434=>'L', +11435=>'L', +11436=>'L', +11437=>'L', +11438=>'L', +11439=>'L', +11440=>'L', +11441=>'L', +11442=>'L', +11443=>'L', +11444=>'L', +11445=>'L', +11446=>'L', +11447=>'L', +11448=>'L', +11449=>'L', +11450=>'L', +11451=>'L', +11452=>'L', +11453=>'L', +11454=>'L', +11455=>'L', +11456=>'L', +11457=>'L', +11458=>'L', +11459=>'L', +11460=>'L', +11461=>'L', +11462=>'L', +11463=>'L', +11464=>'L', +11465=>'L', +11466=>'L', +11467=>'L', +11468=>'L', +11469=>'L', +11470=>'L', +11471=>'L', +11472=>'L', +11473=>'L', +11474=>'L', +11475=>'L', +11476=>'L', +11477=>'L', +11478=>'L', +11479=>'L', +11480=>'L', +11481=>'L', +11482=>'L', +11483=>'L', +11484=>'L', +11485=>'L', +11486=>'L', +11487=>'L', +11488=>'L', +11489=>'L', +11490=>'L', +11491=>'L', +11492=>'L', +11493=>'ON', +11494=>'ON', +11495=>'ON', +11496=>'ON', +11497=>'ON', +11498=>'ON', +11513=>'ON', +11514=>'ON', +11515=>'ON', +11516=>'ON', +11517=>'ON', +11518=>'ON', +11519=>'ON', +11520=>'L', +11521=>'L', +11522=>'L', +11523=>'L', +11524=>'L', +11525=>'L', +11526=>'L', +11527=>'L', +11528=>'L', +11529=>'L', +11530=>'L', +11531=>'L', +11532=>'L', +11533=>'L', +11534=>'L', +11535=>'L', +11536=>'L', +11537=>'L', +11538=>'L', +11539=>'L', +11540=>'L', +11541=>'L', +11542=>'L', +11543=>'L', +11544=>'L', +11545=>'L', +11546=>'L', +11547=>'L', +11548=>'L', +11549=>'L', +11550=>'L', +11551=>'L', +11552=>'L', +11553=>'L', +11554=>'L', +11555=>'L', +11556=>'L', +11557=>'L', +11568=>'L', +11569=>'L', +11570=>'L', +11571=>'L', +11572=>'L', +11573=>'L', +11574=>'L', +11575=>'L', +11576=>'L', +11577=>'L', +11578=>'L', +11579=>'L', +11580=>'L', +11581=>'L', +11582=>'L', +11583=>'L', +11584=>'L', +11585=>'L', +11586=>'L', +11587=>'L', +11588=>'L', +11589=>'L', +11590=>'L', +11591=>'L', +11592=>'L', +11593=>'L', +11594=>'L', +11595=>'L', +11596=>'L', +11597=>'L', +11598=>'L', +11599=>'L', +11600=>'L', +11601=>'L', +11602=>'L', +11603=>'L', +11604=>'L', +11605=>'L', +11606=>'L', +11607=>'L', +11608=>'L', +11609=>'L', +11610=>'L', +11611=>'L', +11612=>'L', +11613=>'L', +11614=>'L', +11615=>'L', +11616=>'L', +11617=>'L', +11618=>'L', +11619=>'L', +11620=>'L', +11621=>'L', +11631=>'L', +11648=>'L', +11649=>'L', +11650=>'L', +11651=>'L', +11652=>'L', +11653=>'L', +11654=>'L', +11655=>'L', +11656=>'L', +11657=>'L', +11658=>'L', +11659=>'L', +11660=>'L', +11661=>'L', +11662=>'L', +11663=>'L', +11664=>'L', +11665=>'L', +11666=>'L', +11667=>'L', +11668=>'L', +11669=>'L', +11670=>'L', +11680=>'L', +11681=>'L', +11682=>'L', +11683=>'L', +11684=>'L', +11685=>'L', +11686=>'L', +11688=>'L', +11689=>'L', +11690=>'L', +11691=>'L', +11692=>'L', +11693=>'L', +11694=>'L', +11696=>'L', +11697=>'L', +11698=>'L', +11699=>'L', +11700=>'L', +11701=>'L', +11702=>'L', +11704=>'L', +11705=>'L', +11706=>'L', +11707=>'L', +11708=>'L', +11709=>'L', +11710=>'L', +11712=>'L', +11713=>'L', +11714=>'L', +11715=>'L', +11716=>'L', +11717=>'L', +11718=>'L', +11720=>'L', +11721=>'L', +11722=>'L', +11723=>'L', +11724=>'L', +11725=>'L', +11726=>'L', +11728=>'L', +11729=>'L', +11730=>'L', +11731=>'L', +11732=>'L', +11733=>'L', +11734=>'L', +11736=>'L', +11737=>'L', +11738=>'L', +11739=>'L', +11740=>'L', +11741=>'L', +11742=>'L', +11776=>'ON', +11777=>'ON', +11778=>'ON', +11779=>'ON', +11780=>'ON', +11781=>'ON', +11782=>'ON', +11783=>'ON', +11784=>'ON', +11785=>'ON', +11786=>'ON', +11787=>'ON', +11788=>'ON', +11789=>'ON', +11790=>'ON', +11791=>'ON', +11792=>'ON', +11793=>'ON', +11794=>'ON', +11795=>'ON', +11796=>'ON', +11797=>'ON', +11798=>'ON', +11799=>'ON', +11804=>'ON', +11805=>'ON', +11904=>'ON', +11905=>'ON', +11906=>'ON', +11907=>'ON', +11908=>'ON', +11909=>'ON', +11910=>'ON', +11911=>'ON', +11912=>'ON', +11913=>'ON', +11914=>'ON', +11915=>'ON', +11916=>'ON', +11917=>'ON', +11918=>'ON', +11919=>'ON', +11920=>'ON', +11921=>'ON', +11922=>'ON', +11923=>'ON', +11924=>'ON', +11925=>'ON', +11926=>'ON', +11927=>'ON', +11928=>'ON', +11929=>'ON', +11931=>'ON', +11932=>'ON', +11933=>'ON', +11934=>'ON', +11935=>'ON', +11936=>'ON', +11937=>'ON', +11938=>'ON', +11939=>'ON', +11940=>'ON', +11941=>'ON', +11942=>'ON', +11943=>'ON', +11944=>'ON', +11945=>'ON', +11946=>'ON', +11947=>'ON', +11948=>'ON', +11949=>'ON', +11950=>'ON', +11951=>'ON', +11952=>'ON', +11953=>'ON', +11954=>'ON', +11955=>'ON', +11956=>'ON', +11957=>'ON', +11958=>'ON', +11959=>'ON', +11960=>'ON', +11961=>'ON', +11962=>'ON', +11963=>'ON', +11964=>'ON', +11965=>'ON', +11966=>'ON', +11967=>'ON', +11968=>'ON', +11969=>'ON', +11970=>'ON', +11971=>'ON', +11972=>'ON', +11973=>'ON', +11974=>'ON', +11975=>'ON', +11976=>'ON', +11977=>'ON', +11978=>'ON', +11979=>'ON', +11980=>'ON', +11981=>'ON', +11982=>'ON', +11983=>'ON', +11984=>'ON', +11985=>'ON', +11986=>'ON', +11987=>'ON', +11988=>'ON', +11989=>'ON', +11990=>'ON', +11991=>'ON', +11992=>'ON', +11993=>'ON', +11994=>'ON', +11995=>'ON', +11996=>'ON', +11997=>'ON', +11998=>'ON', +11999=>'ON', +12000=>'ON', +12001=>'ON', +12002=>'ON', +12003=>'ON', +12004=>'ON', +12005=>'ON', +12006=>'ON', +12007=>'ON', +12008=>'ON', +12009=>'ON', +12010=>'ON', +12011=>'ON', +12012=>'ON', +12013=>'ON', +12014=>'ON', +12015=>'ON', +12016=>'ON', +12017=>'ON', +12018=>'ON', +12019=>'ON', +12032=>'ON', +12033=>'ON', +12034=>'ON', +12035=>'ON', +12036=>'ON', +12037=>'ON', +12038=>'ON', +12039=>'ON', +12040=>'ON', +12041=>'ON', +12042=>'ON', +12043=>'ON', +12044=>'ON', +12045=>'ON', +12046=>'ON', +12047=>'ON', +12048=>'ON', +12049=>'ON', +12050=>'ON', +12051=>'ON', +12052=>'ON', +12053=>'ON', +12054=>'ON', +12055=>'ON', +12056=>'ON', +12057=>'ON', +12058=>'ON', +12059=>'ON', +12060=>'ON', +12061=>'ON', +12062=>'ON', +12063=>'ON', +12064=>'ON', +12065=>'ON', +12066=>'ON', +12067=>'ON', +12068=>'ON', +12069=>'ON', +12070=>'ON', +12071=>'ON', +12072=>'ON', +12073=>'ON', +12074=>'ON', +12075=>'ON', +12076=>'ON', +12077=>'ON', +12078=>'ON', +12079=>'ON', +12080=>'ON', +12081=>'ON', +12082=>'ON', +12083=>'ON', +12084=>'ON', +12085=>'ON', +12086=>'ON', +12087=>'ON', +12088=>'ON', +12089=>'ON', +12090=>'ON', +12091=>'ON', +12092=>'ON', +12093=>'ON', +12094=>'ON', +12095=>'ON', +12096=>'ON', +12097=>'ON', +12098=>'ON', +12099=>'ON', +12100=>'ON', +12101=>'ON', +12102=>'ON', +12103=>'ON', +12104=>'ON', +12105=>'ON', +12106=>'ON', +12107=>'ON', +12108=>'ON', +12109=>'ON', +12110=>'ON', +12111=>'ON', +12112=>'ON', +12113=>'ON', +12114=>'ON', +12115=>'ON', +12116=>'ON', +12117=>'ON', +12118=>'ON', +12119=>'ON', +12120=>'ON', +12121=>'ON', +12122=>'ON', +12123=>'ON', +12124=>'ON', +12125=>'ON', +12126=>'ON', +12127=>'ON', +12128=>'ON', +12129=>'ON', +12130=>'ON', +12131=>'ON', +12132=>'ON', +12133=>'ON', +12134=>'ON', +12135=>'ON', +12136=>'ON', +12137=>'ON', +12138=>'ON', +12139=>'ON', +12140=>'ON', +12141=>'ON', +12142=>'ON', +12143=>'ON', +12144=>'ON', +12145=>'ON', +12146=>'ON', +12147=>'ON', +12148=>'ON', +12149=>'ON', +12150=>'ON', +12151=>'ON', +12152=>'ON', +12153=>'ON', +12154=>'ON', +12155=>'ON', +12156=>'ON', +12157=>'ON', +12158=>'ON', +12159=>'ON', +12160=>'ON', +12161=>'ON', +12162=>'ON', +12163=>'ON', +12164=>'ON', +12165=>'ON', +12166=>'ON', +12167=>'ON', +12168=>'ON', +12169=>'ON', +12170=>'ON', +12171=>'ON', +12172=>'ON', +12173=>'ON', +12174=>'ON', +12175=>'ON', +12176=>'ON', +12177=>'ON', +12178=>'ON', +12179=>'ON', +12180=>'ON', +12181=>'ON', +12182=>'ON', +12183=>'ON', +12184=>'ON', +12185=>'ON', +12186=>'ON', +12187=>'ON', +12188=>'ON', +12189=>'ON', +12190=>'ON', +12191=>'ON', +12192=>'ON', +12193=>'ON', +12194=>'ON', +12195=>'ON', +12196=>'ON', +12197=>'ON', +12198=>'ON', +12199=>'ON', +12200=>'ON', +12201=>'ON', +12202=>'ON', +12203=>'ON', +12204=>'ON', +12205=>'ON', +12206=>'ON', +12207=>'ON', +12208=>'ON', +12209=>'ON', +12210=>'ON', +12211=>'ON', +12212=>'ON', +12213=>'ON', +12214=>'ON', +12215=>'ON', +12216=>'ON', +12217=>'ON', +12218=>'ON', +12219=>'ON', +12220=>'ON', +12221=>'ON', +12222=>'ON', +12223=>'ON', +12224=>'ON', +12225=>'ON', +12226=>'ON', +12227=>'ON', +12228=>'ON', +12229=>'ON', +12230=>'ON', +12231=>'ON', +12232=>'ON', +12233=>'ON', +12234=>'ON', +12235=>'ON', +12236=>'ON', +12237=>'ON', +12238=>'ON', +12239=>'ON', +12240=>'ON', +12241=>'ON', +12242=>'ON', +12243=>'ON', +12244=>'ON', +12245=>'ON', +12272=>'ON', +12273=>'ON', +12274=>'ON', +12275=>'ON', +12276=>'ON', +12277=>'ON', +12278=>'ON', +12279=>'ON', +12280=>'ON', +12281=>'ON', +12282=>'ON', +12283=>'ON', +12288=>'WS', +12289=>'ON', +12290=>'ON', +12291=>'ON', +12292=>'ON', +12293=>'L', +12294=>'L', +12295=>'L', +12296=>'ON', +12297=>'ON', +12298=>'ON', +12299=>'ON', +12300=>'ON', +12301=>'ON', +12302=>'ON', +12303=>'ON', +12304=>'ON', +12305=>'ON', +12306=>'ON', +12307=>'ON', +12308=>'ON', +12309=>'ON', +12310=>'ON', +12311=>'ON', +12312=>'ON', +12313=>'ON', +12314=>'ON', +12315=>'ON', +12316=>'ON', +12317=>'ON', +12318=>'ON', +12319=>'ON', +12320=>'ON', +12321=>'L', +12322=>'L', +12323=>'L', +12324=>'L', +12325=>'L', +12326=>'L', +12327=>'L', +12328=>'L', +12329=>'L', +12330=>'NSM', +12331=>'NSM', +12332=>'NSM', +12333=>'NSM', +12334=>'NSM', +12335=>'NSM', +12336=>'ON', +12337=>'L', +12338=>'L', +12339=>'L', +12340=>'L', +12341=>'L', +12342=>'ON', +12343=>'ON', +12344=>'L', +12345=>'L', +12346=>'L', +12347=>'L', +12348=>'L', +12349=>'ON', +12350=>'ON', +12351=>'ON', +12353=>'L', +12354=>'L', +12355=>'L', +12356=>'L', +12357=>'L', +12358=>'L', +12359=>'L', +12360=>'L', +12361=>'L', +12362=>'L', +12363=>'L', +12364=>'L', +12365=>'L', +12366=>'L', +12367=>'L', +12368=>'L', +12369=>'L', +12370=>'L', +12371=>'L', +12372=>'L', +12373=>'L', +12374=>'L', +12375=>'L', +12376=>'L', +12377=>'L', +12378=>'L', +12379=>'L', +12380=>'L', +12381=>'L', +12382=>'L', +12383=>'L', +12384=>'L', +12385=>'L', +12386=>'L', +12387=>'L', +12388=>'L', +12389=>'L', +12390=>'L', +12391=>'L', +12392=>'L', +12393=>'L', +12394=>'L', +12395=>'L', +12396=>'L', +12397=>'L', +12398=>'L', +12399=>'L', +12400=>'L', +12401=>'L', +12402=>'L', +12403=>'L', +12404=>'L', +12405=>'L', +12406=>'L', +12407=>'L', +12408=>'L', +12409=>'L', +12410=>'L', +12411=>'L', +12412=>'L', +12413=>'L', +12414=>'L', +12415=>'L', +12416=>'L', +12417=>'L', +12418=>'L', +12419=>'L', +12420=>'L', +12421=>'L', +12422=>'L', +12423=>'L', +12424=>'L', +12425=>'L', +12426=>'L', +12427=>'L', +12428=>'L', +12429=>'L', +12430=>'L', +12431=>'L', +12432=>'L', +12433=>'L', +12434=>'L', +12435=>'L', +12436=>'L', +12437=>'L', +12438=>'L', +12441=>'NSM', +12442=>'NSM', +12443=>'ON', +12444=>'ON', +12445=>'L', +12446=>'L', +12447=>'L', +12448=>'ON', +12449=>'L', +12450=>'L', +12451=>'L', +12452=>'L', +12453=>'L', +12454=>'L', +12455=>'L', +12456=>'L', +12457=>'L', +12458=>'L', +12459=>'L', +12460=>'L', +12461=>'L', +12462=>'L', +12463=>'L', +12464=>'L', +12465=>'L', +12466=>'L', +12467=>'L', +12468=>'L', +12469=>'L', +12470=>'L', +12471=>'L', +12472=>'L', +12473=>'L', +12474=>'L', +12475=>'L', +12476=>'L', +12477=>'L', +12478=>'L', +12479=>'L', +12480=>'L', +12481=>'L', +12482=>'L', +12483=>'L', +12484=>'L', +12485=>'L', +12486=>'L', +12487=>'L', +12488=>'L', +12489=>'L', +12490=>'L', +12491=>'L', +12492=>'L', +12493=>'L', +12494=>'L', +12495=>'L', +12496=>'L', +12497=>'L', +12498=>'L', +12499=>'L', +12500=>'L', +12501=>'L', +12502=>'L', +12503=>'L', +12504=>'L', +12505=>'L', +12506=>'L', +12507=>'L', +12508=>'L', +12509=>'L', +12510=>'L', +12511=>'L', +12512=>'L', +12513=>'L', +12514=>'L', +12515=>'L', +12516=>'L', +12517=>'L', +12518=>'L', +12519=>'L', +12520=>'L', +12521=>'L', +12522=>'L', +12523=>'L', +12524=>'L', +12525=>'L', +12526=>'L', +12527=>'L', +12528=>'L', +12529=>'L', +12530=>'L', +12531=>'L', +12532=>'L', +12533=>'L', +12534=>'L', +12535=>'L', +12536=>'L', +12537=>'L', +12538=>'L', +12539=>'ON', +12540=>'L', +12541=>'L', +12542=>'L', +12543=>'L', +12549=>'L', +12550=>'L', +12551=>'L', +12552=>'L', +12553=>'L', +12554=>'L', +12555=>'L', +12556=>'L', +12557=>'L', +12558=>'L', +12559=>'L', +12560=>'L', +12561=>'L', +12562=>'L', +12563=>'L', +12564=>'L', +12565=>'L', +12566=>'L', +12567=>'L', +12568=>'L', +12569=>'L', +12570=>'L', +12571=>'L', +12572=>'L', +12573=>'L', +12574=>'L', +12575=>'L', +12576=>'L', +12577=>'L', +12578=>'L', +12579=>'L', +12580=>'L', +12581=>'L', +12582=>'L', +12583=>'L', +12584=>'L', +12585=>'L', +12586=>'L', +12587=>'L', +12588=>'L', +12593=>'L', +12594=>'L', +12595=>'L', +12596=>'L', +12597=>'L', +12598=>'L', +12599=>'L', +12600=>'L', +12601=>'L', +12602=>'L', +12603=>'L', +12604=>'L', +12605=>'L', +12606=>'L', +12607=>'L', +12608=>'L', +12609=>'L', +12610=>'L', +12611=>'L', +12612=>'L', +12613=>'L', +12614=>'L', +12615=>'L', +12616=>'L', +12617=>'L', +12618=>'L', +12619=>'L', +12620=>'L', +12621=>'L', +12622=>'L', +12623=>'L', +12624=>'L', +12625=>'L', +12626=>'L', +12627=>'L', +12628=>'L', +12629=>'L', +12630=>'L', +12631=>'L', +12632=>'L', +12633=>'L', +12634=>'L', +12635=>'L', +12636=>'L', +12637=>'L', +12638=>'L', +12639=>'L', +12640=>'L', +12641=>'L', +12642=>'L', +12643=>'L', +12644=>'L', +12645=>'L', +12646=>'L', +12647=>'L', +12648=>'L', +12649=>'L', +12650=>'L', +12651=>'L', +12652=>'L', +12653=>'L', +12654=>'L', +12655=>'L', +12656=>'L', +12657=>'L', +12658=>'L', +12659=>'L', +12660=>'L', +12661=>'L', +12662=>'L', +12663=>'L', +12664=>'L', +12665=>'L', +12666=>'L', +12667=>'L', +12668=>'L', +12669=>'L', +12670=>'L', +12671=>'L', +12672=>'L', +12673=>'L', +12674=>'L', +12675=>'L', +12676=>'L', +12677=>'L', +12678=>'L', +12679=>'L', +12680=>'L', +12681=>'L', +12682=>'L', +12683=>'L', +12684=>'L', +12685=>'L', +12686=>'L', +12688=>'L', +12689=>'L', +12690=>'L', +12691=>'L', +12692=>'L', +12693=>'L', +12694=>'L', +12695=>'L', +12696=>'L', +12697=>'L', +12698=>'L', +12699=>'L', +12700=>'L', +12701=>'L', +12702=>'L', +12703=>'L', +12704=>'L', +12705=>'L', +12706=>'L', +12707=>'L', +12708=>'L', +12709=>'L', +12710=>'L', +12711=>'L', +12712=>'L', +12713=>'L', +12714=>'L', +12715=>'L', +12716=>'L', +12717=>'L', +12718=>'L', +12719=>'L', +12720=>'L', +12721=>'L', +12722=>'L', +12723=>'L', +12724=>'L', +12725=>'L', +12726=>'L', +12727=>'L', +12736=>'ON', +12737=>'ON', +12738=>'ON', +12739=>'ON', +12740=>'ON', +12741=>'ON', +12742=>'ON', +12743=>'ON', +12744=>'ON', +12745=>'ON', +12746=>'ON', +12747=>'ON', +12748=>'ON', +12749=>'ON', +12750=>'ON', +12751=>'ON', +12784=>'L', +12785=>'L', +12786=>'L', +12787=>'L', +12788=>'L', +12789=>'L', +12790=>'L', +12791=>'L', +12792=>'L', +12793=>'L', +12794=>'L', +12795=>'L', +12796=>'L', +12797=>'L', +12798=>'L', +12799=>'L', +12800=>'L', +12801=>'L', +12802=>'L', +12803=>'L', +12804=>'L', +12805=>'L', +12806=>'L', +12807=>'L', +12808=>'L', +12809=>'L', +12810=>'L', +12811=>'L', +12812=>'L', +12813=>'L', +12814=>'L', +12815=>'L', +12816=>'L', +12817=>'L', +12818=>'L', +12819=>'L', +12820=>'L', +12821=>'L', +12822=>'L', +12823=>'L', +12824=>'L', +12825=>'L', +12826=>'L', +12827=>'L', +12828=>'L', +12829=>'ON', +12830=>'ON', +12832=>'L', +12833=>'L', +12834=>'L', +12835=>'L', +12836=>'L', +12837=>'L', +12838=>'L', +12839=>'L', +12840=>'L', +12841=>'L', +12842=>'L', +12843=>'L', +12844=>'L', +12845=>'L', +12846=>'L', +12847=>'L', +12848=>'L', +12849=>'L', +12850=>'L', +12851=>'L', +12852=>'L', +12853=>'L', +12854=>'L', +12855=>'L', +12856=>'L', +12857=>'L', +12858=>'L', +12859=>'L', +12860=>'L', +12861=>'L', +12862=>'L', +12863=>'L', +12864=>'L', +12865=>'L', +12866=>'L', +12867=>'L', +12880=>'ON', +12881=>'ON', +12882=>'ON', +12883=>'ON', +12884=>'ON', +12885=>'ON', +12886=>'ON', +12887=>'ON', +12888=>'ON', +12889=>'ON', +12890=>'ON', +12891=>'ON', +12892=>'ON', +12893=>'ON', +12894=>'ON', +12895=>'ON', +12896=>'L', +12897=>'L', +12898=>'L', +12899=>'L', +12900=>'L', +12901=>'L', +12902=>'L', +12903=>'L', +12904=>'L', +12905=>'L', +12906=>'L', +12907=>'L', +12908=>'L', +12909=>'L', +12910=>'L', +12911=>'L', +12912=>'L', +12913=>'L', +12914=>'L', +12915=>'L', +12916=>'L', +12917=>'L', +12918=>'L', +12919=>'L', +12920=>'L', +12921=>'L', +12922=>'L', +12923=>'L', +12924=>'ON', +12925=>'ON', +12926=>'ON', +12927=>'L', +12928=>'L', +12929=>'L', +12930=>'L', +12931=>'L', +12932=>'L', +12933=>'L', +12934=>'L', +12935=>'L', +12936=>'L', +12937=>'L', +12938=>'L', +12939=>'L', +12940=>'L', +12941=>'L', +12942=>'L', +12943=>'L', +12944=>'L', +12945=>'L', +12946=>'L', +12947=>'L', +12948=>'L', +12949=>'L', +12950=>'L', +12951=>'L', +12952=>'L', +12953=>'L', +12954=>'L', +12955=>'L', +12956=>'L', +12957=>'L', +12958=>'L', +12959=>'L', +12960=>'L', +12961=>'L', +12962=>'L', +12963=>'L', +12964=>'L', +12965=>'L', +12966=>'L', +12967=>'L', +12968=>'L', +12969=>'L', +12970=>'L', +12971=>'L', +12972=>'L', +12973=>'L', +12974=>'L', +12975=>'L', +12976=>'L', +12977=>'ON', +12978=>'ON', +12979=>'ON', +12980=>'ON', +12981=>'ON', +12982=>'ON', +12983=>'ON', +12984=>'ON', +12985=>'ON', +12986=>'ON', +12987=>'ON', +12988=>'ON', +12989=>'ON', +12990=>'ON', +12991=>'ON', +12992=>'L', +12993=>'L', +12994=>'L', +12995=>'L', +12996=>'L', +12997=>'L', +12998=>'L', +12999=>'L', +13000=>'L', +13001=>'L', +13002=>'L', +13003=>'L', +13004=>'ON', +13005=>'ON', +13006=>'ON', +13007=>'ON', +13008=>'L', +13009=>'L', +13010=>'L', +13011=>'L', +13012=>'L', +13013=>'L', +13014=>'L', +13015=>'L', +13016=>'L', +13017=>'L', +13018=>'L', +13019=>'L', +13020=>'L', +13021=>'L', +13022=>'L', +13023=>'L', +13024=>'L', +13025=>'L', +13026=>'L', +13027=>'L', +13028=>'L', +13029=>'L', +13030=>'L', +13031=>'L', +13032=>'L', +13033=>'L', +13034=>'L', +13035=>'L', +13036=>'L', +13037=>'L', +13038=>'L', +13039=>'L', +13040=>'L', +13041=>'L', +13042=>'L', +13043=>'L', +13044=>'L', +13045=>'L', +13046=>'L', +13047=>'L', +13048=>'L', +13049=>'L', +13050=>'L', +13051=>'L', +13052=>'L', +13053=>'L', +13054=>'L', +13056=>'L', +13057=>'L', +13058=>'L', +13059=>'L', +13060=>'L', +13061=>'L', +13062=>'L', +13063=>'L', +13064=>'L', +13065=>'L', +13066=>'L', +13067=>'L', +13068=>'L', +13069=>'L', +13070=>'L', +13071=>'L', +13072=>'L', +13073=>'L', +13074=>'L', +13075=>'L', +13076=>'L', +13077=>'L', +13078=>'L', +13079=>'L', +13080=>'L', +13081=>'L', +13082=>'L', +13083=>'L', +13084=>'L', +13085=>'L', +13086=>'L', +13087=>'L', +13088=>'L', +13089=>'L', +13090=>'L', +13091=>'L', +13092=>'L', +13093=>'L', +13094=>'L', +13095=>'L', +13096=>'L', +13097=>'L', +13098=>'L', +13099=>'L', +13100=>'L', +13101=>'L', +13102=>'L', +13103=>'L', +13104=>'L', +13105=>'L', +13106=>'L', +13107=>'L', +13108=>'L', +13109=>'L', +13110=>'L', +13111=>'L', +13112=>'L', +13113=>'L', +13114=>'L', +13115=>'L', +13116=>'L', +13117=>'L', +13118=>'L', +13119=>'L', +13120=>'L', +13121=>'L', +13122=>'L', +13123=>'L', +13124=>'L', +13125=>'L', +13126=>'L', +13127=>'L', +13128=>'L', +13129=>'L', +13130=>'L', +13131=>'L', +13132=>'L', +13133=>'L', +13134=>'L', +13135=>'L', +13136=>'L', +13137=>'L', +13138=>'L', +13139=>'L', +13140=>'L', +13141=>'L', +13142=>'L', +13143=>'L', +13144=>'L', +13145=>'L', +13146=>'L', +13147=>'L', +13148=>'L', +13149=>'L', +13150=>'L', +13151=>'L', +13152=>'L', +13153=>'L', +13154=>'L', +13155=>'L', +13156=>'L', +13157=>'L', +13158=>'L', +13159=>'L', +13160=>'L', +13161=>'L', +13162=>'L', +13163=>'L', +13164=>'L', +13165=>'L', +13166=>'L', +13167=>'L', +13168=>'L', +13169=>'L', +13170=>'L', +13171=>'L', +13172=>'L', +13173=>'L', +13174=>'L', +13175=>'ON', +13176=>'ON', +13177=>'ON', +13178=>'ON', +13179=>'L', +13180=>'L', +13181=>'L', +13182=>'L', +13183=>'L', +13184=>'L', +13185=>'L', +13186=>'L', +13187=>'L', +13188=>'L', +13189=>'L', +13190=>'L', +13191=>'L', +13192=>'L', +13193=>'L', +13194=>'L', +13195=>'L', +13196=>'L', +13197=>'L', +13198=>'L', +13199=>'L', +13200=>'L', +13201=>'L', +13202=>'L', +13203=>'L', +13204=>'L', +13205=>'L', +13206=>'L', +13207=>'L', +13208=>'L', +13209=>'L', +13210=>'L', +13211=>'L', +13212=>'L', +13213=>'L', +13214=>'L', +13215=>'L', +13216=>'L', +13217=>'L', +13218=>'L', +13219=>'L', +13220=>'L', +13221=>'L', +13222=>'L', +13223=>'L', +13224=>'L', +13225=>'L', +13226=>'L', +13227=>'L', +13228=>'L', +13229=>'L', +13230=>'L', +13231=>'L', +13232=>'L', +13233=>'L', +13234=>'L', +13235=>'L', +13236=>'L', +13237=>'L', +13238=>'L', +13239=>'L', +13240=>'L', +13241=>'L', +13242=>'L', +13243=>'L', +13244=>'L', +13245=>'L', +13246=>'L', +13247=>'L', +13248=>'L', +13249=>'L', +13250=>'L', +13251=>'L', +13252=>'L', +13253=>'L', +13254=>'L', +13255=>'L', +13256=>'L', +13257=>'L', +13258=>'L', +13259=>'L', +13260=>'L', +13261=>'L', +13262=>'L', +13263=>'L', +13264=>'L', +13265=>'L', +13266=>'L', +13267=>'L', +13268=>'L', +13269=>'L', +13270=>'L', +13271=>'L', +13272=>'L', +13273=>'L', +13274=>'L', +13275=>'L', +13276=>'L', +13277=>'L', +13278=>'ON', +13279=>'ON', +13280=>'L', +13281=>'L', +13282=>'L', +13283=>'L', +13284=>'L', +13285=>'L', +13286=>'L', +13287=>'L', +13288=>'L', +13289=>'L', +13290=>'L', +13291=>'L', +13292=>'L', +13293=>'L', +13294=>'L', +13295=>'L', +13296=>'L', +13297=>'L', +13298=>'L', +13299=>'L', +13300=>'L', +13301=>'L', +13302=>'L', +13303=>'L', +13304=>'L', +13305=>'L', +13306=>'L', +13307=>'L', +13308=>'L', +13309=>'L', +13310=>'L', +13311=>'ON', +13312=>'L', +19893=>'L', +19904=>'ON', +19905=>'ON', +19906=>'ON', +19907=>'ON', +19908=>'ON', +19909=>'ON', +19910=>'ON', +19911=>'ON', +19912=>'ON', +19913=>'ON', +19914=>'ON', +19915=>'ON', +19916=>'ON', +19917=>'ON', +19918=>'ON', +19919=>'ON', +19920=>'ON', +19921=>'ON', +19922=>'ON', +19923=>'ON', +19924=>'ON', +19925=>'ON', +19926=>'ON', +19927=>'ON', +19928=>'ON', +19929=>'ON', +19930=>'ON', +19931=>'ON', +19932=>'ON', +19933=>'ON', +19934=>'ON', +19935=>'ON', +19936=>'ON', +19937=>'ON', +19938=>'ON', +19939=>'ON', +19940=>'ON', +19941=>'ON', +19942=>'ON', +19943=>'ON', +19944=>'ON', +19945=>'ON', +19946=>'ON', +19947=>'ON', +19948=>'ON', +19949=>'ON', +19950=>'ON', +19951=>'ON', +19952=>'ON', +19953=>'ON', +19954=>'ON', +19955=>'ON', +19956=>'ON', +19957=>'ON', +19958=>'ON', +19959=>'ON', +19960=>'ON', +19961=>'ON', +19962=>'ON', +19963=>'ON', +19964=>'ON', +19965=>'ON', +19966=>'ON', +19967=>'ON', +19968=>'L', +40891=>'L', +40960=>'L', +40961=>'L', +40962=>'L', +40963=>'L', +40964=>'L', +40965=>'L', +40966=>'L', +40967=>'L', +40968=>'L', +40969=>'L', +40970=>'L', +40971=>'L', +40972=>'L', +40973=>'L', +40974=>'L', +40975=>'L', +40976=>'L', +40977=>'L', +40978=>'L', +40979=>'L', +40980=>'L', +40981=>'L', +40982=>'L', +40983=>'L', +40984=>'L', +40985=>'L', +40986=>'L', +40987=>'L', +40988=>'L', +40989=>'L', +40990=>'L', +40991=>'L', +40992=>'L', +40993=>'L', +40994=>'L', +40995=>'L', +40996=>'L', +40997=>'L', +40998=>'L', +40999=>'L', +41000=>'L', +41001=>'L', +41002=>'L', +41003=>'L', +41004=>'L', +41005=>'L', +41006=>'L', +41007=>'L', +41008=>'L', +41009=>'L', +41010=>'L', +41011=>'L', +41012=>'L', +41013=>'L', +41014=>'L', +41015=>'L', +41016=>'L', +41017=>'L', +41018=>'L', +41019=>'L', +41020=>'L', +41021=>'L', +41022=>'L', +41023=>'L', +41024=>'L', +41025=>'L', +41026=>'L', +41027=>'L', +41028=>'L', +41029=>'L', +41030=>'L', +41031=>'L', +41032=>'L', +41033=>'L', +41034=>'L', +41035=>'L', +41036=>'L', +41037=>'L', +41038=>'L', +41039=>'L', +41040=>'L', +41041=>'L', +41042=>'L', +41043=>'L', +41044=>'L', +41045=>'L', +41046=>'L', +41047=>'L', +41048=>'L', +41049=>'L', +41050=>'L', +41051=>'L', +41052=>'L', +41053=>'L', +41054=>'L', +41055=>'L', +41056=>'L', +41057=>'L', +41058=>'L', +41059=>'L', +41060=>'L', +41061=>'L', +41062=>'L', +41063=>'L', +41064=>'L', +41065=>'L', +41066=>'L', +41067=>'L', +41068=>'L', +41069=>'L', +41070=>'L', +41071=>'L', +41072=>'L', +41073=>'L', +41074=>'L', +41075=>'L', +41076=>'L', +41077=>'L', +41078=>'L', +41079=>'L', +41080=>'L', +41081=>'L', +41082=>'L', +41083=>'L', +41084=>'L', +41085=>'L', +41086=>'L', +41087=>'L', +41088=>'L', +41089=>'L', +41090=>'L', +41091=>'L', +41092=>'L', +41093=>'L', +41094=>'L', +41095=>'L', +41096=>'L', +41097=>'L', +41098=>'L', +41099=>'L', +41100=>'L', +41101=>'L', +41102=>'L', +41103=>'L', +41104=>'L', +41105=>'L', +41106=>'L', +41107=>'L', +41108=>'L', +41109=>'L', +41110=>'L', +41111=>'L', +41112=>'L', +41113=>'L', +41114=>'L', +41115=>'L', +41116=>'L', +41117=>'L', +41118=>'L', +41119=>'L', +41120=>'L', +41121=>'L', +41122=>'L', +41123=>'L', +41124=>'L', +41125=>'L', +41126=>'L', +41127=>'L', +41128=>'L', +41129=>'L', +41130=>'L', +41131=>'L', +41132=>'L', +41133=>'L', +41134=>'L', +41135=>'L', +41136=>'L', +41137=>'L', +41138=>'L', +41139=>'L', +41140=>'L', +41141=>'L', +41142=>'L', +41143=>'L', +41144=>'L', +41145=>'L', +41146=>'L', +41147=>'L', +41148=>'L', +41149=>'L', +41150=>'L', +41151=>'L', +41152=>'L', +41153=>'L', +41154=>'L', +41155=>'L', +41156=>'L', +41157=>'L', +41158=>'L', +41159=>'L', +41160=>'L', +41161=>'L', +41162=>'L', +41163=>'L', +41164=>'L', +41165=>'L', +41166=>'L', +41167=>'L', +41168=>'L', +41169=>'L', +41170=>'L', +41171=>'L', +41172=>'L', +41173=>'L', +41174=>'L', +41175=>'L', +41176=>'L', +41177=>'L', +41178=>'L', +41179=>'L', +41180=>'L', +41181=>'L', +41182=>'L', +41183=>'L', +41184=>'L', +41185=>'L', +41186=>'L', +41187=>'L', +41188=>'L', +41189=>'L', +41190=>'L', +41191=>'L', +41192=>'L', +41193=>'L', +41194=>'L', +41195=>'L', +41196=>'L', +41197=>'L', +41198=>'L', +41199=>'L', +41200=>'L', +41201=>'L', +41202=>'L', +41203=>'L', +41204=>'L', +41205=>'L', +41206=>'L', +41207=>'L', +41208=>'L', +41209=>'L', +41210=>'L', +41211=>'L', +41212=>'L', +41213=>'L', +41214=>'L', +41215=>'L', +41216=>'L', +41217=>'L', +41218=>'L', +41219=>'L', +41220=>'L', +41221=>'L', +41222=>'L', +41223=>'L', +41224=>'L', +41225=>'L', +41226=>'L', +41227=>'L', +41228=>'L', +41229=>'L', +41230=>'L', +41231=>'L', +41232=>'L', +41233=>'L', +41234=>'L', +41235=>'L', +41236=>'L', +41237=>'L', +41238=>'L', +41239=>'L', +41240=>'L', +41241=>'L', +41242=>'L', +41243=>'L', +41244=>'L', +41245=>'L', +41246=>'L', +41247=>'L', +41248=>'L', +41249=>'L', +41250=>'L', +41251=>'L', +41252=>'L', +41253=>'L', +41254=>'L', +41255=>'L', +41256=>'L', +41257=>'L', +41258=>'L', +41259=>'L', +41260=>'L', +41261=>'L', +41262=>'L', +41263=>'L', +41264=>'L', +41265=>'L', +41266=>'L', +41267=>'L', +41268=>'L', +41269=>'L', +41270=>'L', +41271=>'L', +41272=>'L', +41273=>'L', +41274=>'L', +41275=>'L', +41276=>'L', +41277=>'L', +41278=>'L', +41279=>'L', +41280=>'L', +41281=>'L', +41282=>'L', +41283=>'L', +41284=>'L', +41285=>'L', +41286=>'L', +41287=>'L', +41288=>'L', +41289=>'L', +41290=>'L', +41291=>'L', +41292=>'L', +41293=>'L', +41294=>'L', +41295=>'L', +41296=>'L', +41297=>'L', +41298=>'L', +41299=>'L', +41300=>'L', +41301=>'L', +41302=>'L', +41303=>'L', +41304=>'L', +41305=>'L', +41306=>'L', +41307=>'L', +41308=>'L', +41309=>'L', +41310=>'L', +41311=>'L', +41312=>'L', +41313=>'L', +41314=>'L', +41315=>'L', +41316=>'L', +41317=>'L', +41318=>'L', +41319=>'L', +41320=>'L', +41321=>'L', +41322=>'L', +41323=>'L', +41324=>'L', +41325=>'L', +41326=>'L', +41327=>'L', +41328=>'L', +41329=>'L', +41330=>'L', +41331=>'L', +41332=>'L', +41333=>'L', +41334=>'L', +41335=>'L', +41336=>'L', +41337=>'L', +41338=>'L', +41339=>'L', +41340=>'L', +41341=>'L', +41342=>'L', +41343=>'L', +41344=>'L', +41345=>'L', +41346=>'L', +41347=>'L', +41348=>'L', +41349=>'L', +41350=>'L', +41351=>'L', +41352=>'L', +41353=>'L', +41354=>'L', +41355=>'L', +41356=>'L', +41357=>'L', +41358=>'L', +41359=>'L', +41360=>'L', +41361=>'L', +41362=>'L', +41363=>'L', +41364=>'L', +41365=>'L', +41366=>'L', +41367=>'L', +41368=>'L', +41369=>'L', +41370=>'L', +41371=>'L', +41372=>'L', +41373=>'L', +41374=>'L', +41375=>'L', +41376=>'L', +41377=>'L', +41378=>'L', +41379=>'L', +41380=>'L', +41381=>'L', +41382=>'L', +41383=>'L', +41384=>'L', +41385=>'L', +41386=>'L', +41387=>'L', +41388=>'L', +41389=>'L', +41390=>'L', +41391=>'L', +41392=>'L', +41393=>'L', +41394=>'L', +41395=>'L', +41396=>'L', +41397=>'L', +41398=>'L', +41399=>'L', +41400=>'L', +41401=>'L', +41402=>'L', +41403=>'L', +41404=>'L', +41405=>'L', +41406=>'L', +41407=>'L', +41408=>'L', +41409=>'L', +41410=>'L', +41411=>'L', +41412=>'L', +41413=>'L', +41414=>'L', +41415=>'L', +41416=>'L', +41417=>'L', +41418=>'L', +41419=>'L', +41420=>'L', +41421=>'L', +41422=>'L', +41423=>'L', +41424=>'L', +41425=>'L', +41426=>'L', +41427=>'L', +41428=>'L', +41429=>'L', +41430=>'L', +41431=>'L', +41432=>'L', +41433=>'L', +41434=>'L', +41435=>'L', +41436=>'L', +41437=>'L', +41438=>'L', +41439=>'L', +41440=>'L', +41441=>'L', +41442=>'L', +41443=>'L', +41444=>'L', +41445=>'L', +41446=>'L', +41447=>'L', +41448=>'L', +41449=>'L', +41450=>'L', +41451=>'L', +41452=>'L', +41453=>'L', +41454=>'L', +41455=>'L', +41456=>'L', +41457=>'L', +41458=>'L', +41459=>'L', +41460=>'L', +41461=>'L', +41462=>'L', +41463=>'L', +41464=>'L', +41465=>'L', +41466=>'L', +41467=>'L', +41468=>'L', +41469=>'L', +41470=>'L', +41471=>'L', +41472=>'L', +41473=>'L', +41474=>'L', +41475=>'L', +41476=>'L', +41477=>'L', +41478=>'L', +41479=>'L', +41480=>'L', +41481=>'L', +41482=>'L', +41483=>'L', +41484=>'L', +41485=>'L', +41486=>'L', +41487=>'L', +41488=>'L', +41489=>'L', +41490=>'L', +41491=>'L', +41492=>'L', +41493=>'L', +41494=>'L', +41495=>'L', +41496=>'L', +41497=>'L', +41498=>'L', +41499=>'L', +41500=>'L', +41501=>'L', +41502=>'L', +41503=>'L', +41504=>'L', +41505=>'L', +41506=>'L', +41507=>'L', +41508=>'L', +41509=>'L', +41510=>'L', +41511=>'L', +41512=>'L', +41513=>'L', +41514=>'L', +41515=>'L', +41516=>'L', +41517=>'L', +41518=>'L', +41519=>'L', +41520=>'L', +41521=>'L', +41522=>'L', +41523=>'L', +41524=>'L', +41525=>'L', +41526=>'L', +41527=>'L', +41528=>'L', +41529=>'L', +41530=>'L', +41531=>'L', +41532=>'L', +41533=>'L', +41534=>'L', +41535=>'L', +41536=>'L', +41537=>'L', +41538=>'L', +41539=>'L', +41540=>'L', +41541=>'L', +41542=>'L', +41543=>'L', +41544=>'L', +41545=>'L', +41546=>'L', +41547=>'L', +41548=>'L', +41549=>'L', +41550=>'L', +41551=>'L', +41552=>'L', +41553=>'L', +41554=>'L', +41555=>'L', +41556=>'L', +41557=>'L', +41558=>'L', +41559=>'L', +41560=>'L', +41561=>'L', +41562=>'L', +41563=>'L', +41564=>'L', +41565=>'L', +41566=>'L', +41567=>'L', +41568=>'L', +41569=>'L', +41570=>'L', +41571=>'L', +41572=>'L', +41573=>'L', +41574=>'L', +41575=>'L', +41576=>'L', +41577=>'L', +41578=>'L', +41579=>'L', +41580=>'L', +41581=>'L', +41582=>'L', +41583=>'L', +41584=>'L', +41585=>'L', +41586=>'L', +41587=>'L', +41588=>'L', +41589=>'L', +41590=>'L', +41591=>'L', +41592=>'L', +41593=>'L', +41594=>'L', +41595=>'L', +41596=>'L', +41597=>'L', +41598=>'L', +41599=>'L', +41600=>'L', +41601=>'L', +41602=>'L', +41603=>'L', +41604=>'L', +41605=>'L', +41606=>'L', +41607=>'L', +41608=>'L', +41609=>'L', +41610=>'L', +41611=>'L', +41612=>'L', +41613=>'L', +41614=>'L', +41615=>'L', +41616=>'L', +41617=>'L', +41618=>'L', +41619=>'L', +41620=>'L', +41621=>'L', +41622=>'L', +41623=>'L', +41624=>'L', +41625=>'L', +41626=>'L', +41627=>'L', +41628=>'L', +41629=>'L', +41630=>'L', +41631=>'L', +41632=>'L', +41633=>'L', +41634=>'L', +41635=>'L', +41636=>'L', +41637=>'L', +41638=>'L', +41639=>'L', +41640=>'L', +41641=>'L', +41642=>'L', +41643=>'L', +41644=>'L', +41645=>'L', +41646=>'L', +41647=>'L', +41648=>'L', +41649=>'L', +41650=>'L', +41651=>'L', +41652=>'L', +41653=>'L', +41654=>'L', +41655=>'L', +41656=>'L', +41657=>'L', +41658=>'L', +41659=>'L', +41660=>'L', +41661=>'L', +41662=>'L', +41663=>'L', +41664=>'L', +41665=>'L', +41666=>'L', +41667=>'L', +41668=>'L', +41669=>'L', +41670=>'L', +41671=>'L', +41672=>'L', +41673=>'L', +41674=>'L', +41675=>'L', +41676=>'L', +41677=>'L', +41678=>'L', +41679=>'L', +41680=>'L', +41681=>'L', +41682=>'L', +41683=>'L', +41684=>'L', +41685=>'L', +41686=>'L', +41687=>'L', +41688=>'L', +41689=>'L', +41690=>'L', +41691=>'L', +41692=>'L', +41693=>'L', +41694=>'L', +41695=>'L', +41696=>'L', +41697=>'L', +41698=>'L', +41699=>'L', +41700=>'L', +41701=>'L', +41702=>'L', +41703=>'L', +41704=>'L', +41705=>'L', +41706=>'L', +41707=>'L', +41708=>'L', +41709=>'L', +41710=>'L', +41711=>'L', +41712=>'L', +41713=>'L', +41714=>'L', +41715=>'L', +41716=>'L', +41717=>'L', +41718=>'L', +41719=>'L', +41720=>'L', +41721=>'L', +41722=>'L', +41723=>'L', +41724=>'L', +41725=>'L', +41726=>'L', +41727=>'L', +41728=>'L', +41729=>'L', +41730=>'L', +41731=>'L', +41732=>'L', +41733=>'L', +41734=>'L', +41735=>'L', +41736=>'L', +41737=>'L', +41738=>'L', +41739=>'L', +41740=>'L', +41741=>'L', +41742=>'L', +41743=>'L', +41744=>'L', +41745=>'L', +41746=>'L', +41747=>'L', +41748=>'L', +41749=>'L', +41750=>'L', +41751=>'L', +41752=>'L', +41753=>'L', +41754=>'L', +41755=>'L', +41756=>'L', +41757=>'L', +41758=>'L', +41759=>'L', +41760=>'L', +41761=>'L', +41762=>'L', +41763=>'L', +41764=>'L', +41765=>'L', +41766=>'L', +41767=>'L', +41768=>'L', +41769=>'L', +41770=>'L', +41771=>'L', +41772=>'L', +41773=>'L', +41774=>'L', +41775=>'L', +41776=>'L', +41777=>'L', +41778=>'L', +41779=>'L', +41780=>'L', +41781=>'L', +41782=>'L', +41783=>'L', +41784=>'L', +41785=>'L', +41786=>'L', +41787=>'L', +41788=>'L', +41789=>'L', +41790=>'L', +41791=>'L', +41792=>'L', +41793=>'L', +41794=>'L', +41795=>'L', +41796=>'L', +41797=>'L', +41798=>'L', +41799=>'L', +41800=>'L', +41801=>'L', +41802=>'L', +41803=>'L', +41804=>'L', +41805=>'L', +41806=>'L', +41807=>'L', +41808=>'L', +41809=>'L', +41810=>'L', +41811=>'L', +41812=>'L', +41813=>'L', +41814=>'L', +41815=>'L', +41816=>'L', +41817=>'L', +41818=>'L', +41819=>'L', +41820=>'L', +41821=>'L', +41822=>'L', +41823=>'L', +41824=>'L', +41825=>'L', +41826=>'L', +41827=>'L', +41828=>'L', +41829=>'L', +41830=>'L', +41831=>'L', +41832=>'L', +41833=>'L', +41834=>'L', +41835=>'L', +41836=>'L', +41837=>'L', +41838=>'L', +41839=>'L', +41840=>'L', +41841=>'L', +41842=>'L', +41843=>'L', +41844=>'L', +41845=>'L', +41846=>'L', +41847=>'L', +41848=>'L', +41849=>'L', +41850=>'L', +41851=>'L', +41852=>'L', +41853=>'L', +41854=>'L', +41855=>'L', +41856=>'L', +41857=>'L', +41858=>'L', +41859=>'L', +41860=>'L', +41861=>'L', +41862=>'L', +41863=>'L', +41864=>'L', +41865=>'L', +41866=>'L', +41867=>'L', +41868=>'L', +41869=>'L', +41870=>'L', +41871=>'L', +41872=>'L', +41873=>'L', +41874=>'L', +41875=>'L', +41876=>'L', +41877=>'L', +41878=>'L', +41879=>'L', +41880=>'L', +41881=>'L', +41882=>'L', +41883=>'L', +41884=>'L', +41885=>'L', +41886=>'L', +41887=>'L', +41888=>'L', +41889=>'L', +41890=>'L', +41891=>'L', +41892=>'L', +41893=>'L', +41894=>'L', +41895=>'L', +41896=>'L', +41897=>'L', +41898=>'L', +41899=>'L', +41900=>'L', +41901=>'L', +41902=>'L', +41903=>'L', +41904=>'L', +41905=>'L', +41906=>'L', +41907=>'L', +41908=>'L', +41909=>'L', +41910=>'L', +41911=>'L', +41912=>'L', +41913=>'L', +41914=>'L', +41915=>'L', +41916=>'L', +41917=>'L', +41918=>'L', +41919=>'L', +41920=>'L', +41921=>'L', +41922=>'L', +41923=>'L', +41924=>'L', +41925=>'L', +41926=>'L', +41927=>'L', +41928=>'L', +41929=>'L', +41930=>'L', +41931=>'L', +41932=>'L', +41933=>'L', +41934=>'L', +41935=>'L', +41936=>'L', +41937=>'L', +41938=>'L', +41939=>'L', +41940=>'L', +41941=>'L', +41942=>'L', +41943=>'L', +41944=>'L', +41945=>'L', +41946=>'L', +41947=>'L', +41948=>'L', +41949=>'L', +41950=>'L', +41951=>'L', +41952=>'L', +41953=>'L', +41954=>'L', +41955=>'L', +41956=>'L', +41957=>'L', +41958=>'L', +41959=>'L', +41960=>'L', +41961=>'L', +41962=>'L', +41963=>'L', +41964=>'L', +41965=>'L', +41966=>'L', +41967=>'L', +41968=>'L', +41969=>'L', +41970=>'L', +41971=>'L', +41972=>'L', +41973=>'L', +41974=>'L', +41975=>'L', +41976=>'L', +41977=>'L', +41978=>'L', +41979=>'L', +41980=>'L', +41981=>'L', +41982=>'L', +41983=>'L', +41984=>'L', +41985=>'L', +41986=>'L', +41987=>'L', +41988=>'L', +41989=>'L', +41990=>'L', +41991=>'L', +41992=>'L', +41993=>'L', +41994=>'L', +41995=>'L', +41996=>'L', +41997=>'L', +41998=>'L', +41999=>'L', +42000=>'L', +42001=>'L', +42002=>'L', +42003=>'L', +42004=>'L', +42005=>'L', +42006=>'L', +42007=>'L', +42008=>'L', +42009=>'L', +42010=>'L', +42011=>'L', +42012=>'L', +42013=>'L', +42014=>'L', +42015=>'L', +42016=>'L', +42017=>'L', +42018=>'L', +42019=>'L', +42020=>'L', +42021=>'L', +42022=>'L', +42023=>'L', +42024=>'L', +42025=>'L', +42026=>'L', +42027=>'L', +42028=>'L', +42029=>'L', +42030=>'L', +42031=>'L', +42032=>'L', +42033=>'L', +42034=>'L', +42035=>'L', +42036=>'L', +42037=>'L', +42038=>'L', +42039=>'L', +42040=>'L', +42041=>'L', +42042=>'L', +42043=>'L', +42044=>'L', +42045=>'L', +42046=>'L', +42047=>'L', +42048=>'L', +42049=>'L', +42050=>'L', +42051=>'L', +42052=>'L', +42053=>'L', +42054=>'L', +42055=>'L', +42056=>'L', +42057=>'L', +42058=>'L', +42059=>'L', +42060=>'L', +42061=>'L', +42062=>'L', +42063=>'L', +42064=>'L', +42065=>'L', +42066=>'L', +42067=>'L', +42068=>'L', +42069=>'L', +42070=>'L', +42071=>'L', +42072=>'L', +42073=>'L', +42074=>'L', +42075=>'L', +42076=>'L', +42077=>'L', +42078=>'L', +42079=>'L', +42080=>'L', +42081=>'L', +42082=>'L', +42083=>'L', +42084=>'L', +42085=>'L', +42086=>'L', +42087=>'L', +42088=>'L', +42089=>'L', +42090=>'L', +42091=>'L', +42092=>'L', +42093=>'L', +42094=>'L', +42095=>'L', +42096=>'L', +42097=>'L', +42098=>'L', +42099=>'L', +42100=>'L', +42101=>'L', +42102=>'L', +42103=>'L', +42104=>'L', +42105=>'L', +42106=>'L', +42107=>'L', +42108=>'L', +42109=>'L', +42110=>'L', +42111=>'L', +42112=>'L', +42113=>'L', +42114=>'L', +42115=>'L', +42116=>'L', +42117=>'L', +42118=>'L', +42119=>'L', +42120=>'L', +42121=>'L', +42122=>'L', +42123=>'L', +42124=>'L', +42128=>'ON', +42129=>'ON', +42130=>'ON', +42131=>'ON', +42132=>'ON', +42133=>'ON', +42134=>'ON', +42135=>'ON', +42136=>'ON', +42137=>'ON', +42138=>'ON', +42139=>'ON', +42140=>'ON', +42141=>'ON', +42142=>'ON', +42143=>'ON', +42144=>'ON', +42145=>'ON', +42146=>'ON', +42147=>'ON', +42148=>'ON', +42149=>'ON', +42150=>'ON', +42151=>'ON', +42152=>'ON', +42153=>'ON', +42154=>'ON', +42155=>'ON', +42156=>'ON', +42157=>'ON', +42158=>'ON', +42159=>'ON', +42160=>'ON', +42161=>'ON', +42162=>'ON', +42163=>'ON', +42164=>'ON', +42165=>'ON', +42166=>'ON', +42167=>'ON', +42168=>'ON', +42169=>'ON', +42170=>'ON', +42171=>'ON', +42172=>'ON', +42173=>'ON', +42174=>'ON', +42175=>'ON', +42176=>'ON', +42177=>'ON', +42178=>'ON', +42179=>'ON', +42180=>'ON', +42181=>'ON', +42182=>'ON', +42752=>'ON', +42753=>'ON', +42754=>'ON', +42755=>'ON', +42756=>'ON', +42757=>'ON', +42758=>'ON', +42759=>'ON', +42760=>'ON', +42761=>'ON', +42762=>'ON', +42763=>'ON', +42764=>'ON', +42765=>'ON', +42766=>'ON', +42767=>'ON', +42768=>'ON', +42769=>'ON', +42770=>'ON', +42771=>'ON', +42772=>'ON', +42773=>'ON', +42774=>'ON', +42775=>'ON', +42776=>'ON', +42777=>'ON', +42778=>'ON', +42784=>'ON', +42785=>'ON', +43008=>'L', +43009=>'L', +43010=>'NSM', +43011=>'L', +43012=>'L', +43013=>'L', +43014=>'NSM', +43015=>'L', +43016=>'L', +43017=>'L', +43018=>'L', +43019=>'NSM', +43020=>'L', +43021=>'L', +43022=>'L', +43023=>'L', +43024=>'L', +43025=>'L', +43026=>'L', +43027=>'L', +43028=>'L', +43029=>'L', +43030=>'L', +43031=>'L', +43032=>'L', +43033=>'L', +43034=>'L', +43035=>'L', +43036=>'L', +43037=>'L', +43038=>'L', +43039=>'L', +43040=>'L', +43041=>'L', +43042=>'L', +43043=>'L', +43044=>'L', +43045=>'NSM', +43046=>'NSM', +43047=>'L', +43048=>'ON', +43049=>'ON', +43050=>'ON', +43051=>'ON', +43072=>'L', +43073=>'L', +43074=>'L', +43075=>'L', +43076=>'L', +43077=>'L', +43078=>'L', +43079=>'L', +43080=>'L', +43081=>'L', +43082=>'L', +43083=>'L', +43084=>'L', +43085=>'L', +43086=>'L', +43087=>'L', +43088=>'L', +43089=>'L', +43090=>'L', +43091=>'L', +43092=>'L', +43093=>'L', +43094=>'L', +43095=>'L', +43096=>'L', +43097=>'L', +43098=>'L', +43099=>'L', +43100=>'L', +43101=>'L', +43102=>'L', +43103=>'L', +43104=>'L', +43105=>'L', +43106=>'L', +43107=>'L', +43108=>'L', +43109=>'L', +43110=>'L', +43111=>'L', +43112=>'L', +43113=>'L', +43114=>'L', +43115=>'L', +43116=>'L', +43117=>'L', +43118=>'L', +43119=>'L', +43120=>'L', +43121=>'L', +43122=>'L', +43123=>'L', +43124=>'ON', +43125=>'ON', +43126=>'ON', +43127=>'ON', +44032=>'L', +55203=>'L', +55296=>'L', +56191=>'L', +56192=>'L', +56319=>'L', +56320=>'L', +57343=>'L', +57344=>'L', +63743=>'L', +63744=>'L', +63745=>'L', +63746=>'L', +63747=>'L', +63748=>'L', +63749=>'L', +63750=>'L', +63751=>'L', +63752=>'L', +63753=>'L', +63754=>'L', +63755=>'L', +63756=>'L', +63757=>'L', +63758=>'L', +63759=>'L', +63760=>'L', +63761=>'L', +63762=>'L', +63763=>'L', +63764=>'L', +63765=>'L', +63766=>'L', +63767=>'L', +63768=>'L', +63769=>'L', +63770=>'L', +63771=>'L', +63772=>'L', +63773=>'L', +63774=>'L', +63775=>'L', +63776=>'L', +63777=>'L', +63778=>'L', +63779=>'L', +63780=>'L', +63781=>'L', +63782=>'L', +63783=>'L', +63784=>'L', +63785=>'L', +63786=>'L', +63787=>'L', +63788=>'L', +63789=>'L', +63790=>'L', +63791=>'L', +63792=>'L', +63793=>'L', +63794=>'L', +63795=>'L', +63796=>'L', +63797=>'L', +63798=>'L', +63799=>'L', +63800=>'L', +63801=>'L', +63802=>'L', +63803=>'L', +63804=>'L', +63805=>'L', +63806=>'L', +63807=>'L', +63808=>'L', +63809=>'L', +63810=>'L', +63811=>'L', +63812=>'L', +63813=>'L', +63814=>'L', +63815=>'L', +63816=>'L', +63817=>'L', +63818=>'L', +63819=>'L', +63820=>'L', +63821=>'L', +63822=>'L', +63823=>'L', +63824=>'L', +63825=>'L', +63826=>'L', +63827=>'L', +63828=>'L', +63829=>'L', +63830=>'L', +63831=>'L', +63832=>'L', +63833=>'L', +63834=>'L', +63835=>'L', +63836=>'L', +63837=>'L', +63838=>'L', +63839=>'L', +63840=>'L', +63841=>'L', +63842=>'L', +63843=>'L', +63844=>'L', +63845=>'L', +63846=>'L', +63847=>'L', +63848=>'L', +63849=>'L', +63850=>'L', +63851=>'L', +63852=>'L', +63853=>'L', +63854=>'L', +63855=>'L', +63856=>'L', +63857=>'L', +63858=>'L', +63859=>'L', +63860=>'L', +63861=>'L', +63862=>'L', +63863=>'L', +63864=>'L', +63865=>'L', +63866=>'L', +63867=>'L', +63868=>'L', +63869=>'L', +63870=>'L', +63871=>'L', +63872=>'L', +63873=>'L', +63874=>'L', +63875=>'L', +63876=>'L', +63877=>'L', +63878=>'L', +63879=>'L', +63880=>'L', +63881=>'L', +63882=>'L', +63883=>'L', +63884=>'L', +63885=>'L', +63886=>'L', +63887=>'L', +63888=>'L', +63889=>'L', +63890=>'L', +63891=>'L', +63892=>'L', +63893=>'L', +63894=>'L', +63895=>'L', +63896=>'L', +63897=>'L', +63898=>'L', +63899=>'L', +63900=>'L', +63901=>'L', +63902=>'L', +63903=>'L', +63904=>'L', +63905=>'L', +63906=>'L', +63907=>'L', +63908=>'L', +63909=>'L', +63910=>'L', +63911=>'L', +63912=>'L', +63913=>'L', +63914=>'L', +63915=>'L', +63916=>'L', +63917=>'L', +63918=>'L', +63919=>'L', +63920=>'L', +63921=>'L', +63922=>'L', +63923=>'L', +63924=>'L', +63925=>'L', +63926=>'L', +63927=>'L', +63928=>'L', +63929=>'L', +63930=>'L', +63931=>'L', +63932=>'L', +63933=>'L', +63934=>'L', +63935=>'L', +63936=>'L', +63937=>'L', +63938=>'L', +63939=>'L', +63940=>'L', +63941=>'L', +63942=>'L', +63943=>'L', +63944=>'L', +63945=>'L', +63946=>'L', +63947=>'L', +63948=>'L', +63949=>'L', +63950=>'L', +63951=>'L', +63952=>'L', +63953=>'L', +63954=>'L', +63955=>'L', +63956=>'L', +63957=>'L', +63958=>'L', +63959=>'L', +63960=>'L', +63961=>'L', +63962=>'L', +63963=>'L', +63964=>'L', +63965=>'L', +63966=>'L', +63967=>'L', +63968=>'L', +63969=>'L', +63970=>'L', +63971=>'L', +63972=>'L', +63973=>'L', +63974=>'L', +63975=>'L', +63976=>'L', +63977=>'L', +63978=>'L', +63979=>'L', +63980=>'L', +63981=>'L', +63982=>'L', +63983=>'L', +63984=>'L', +63985=>'L', +63986=>'L', +63987=>'L', +63988=>'L', +63989=>'L', +63990=>'L', +63991=>'L', +63992=>'L', +63993=>'L', +63994=>'L', +63995=>'L', +63996=>'L', +63997=>'L', +63998=>'L', +63999=>'L', +64000=>'L', +64001=>'L', +64002=>'L', +64003=>'L', +64004=>'L', +64005=>'L', +64006=>'L', +64007=>'L', +64008=>'L', +64009=>'L', +64010=>'L', +64011=>'L', +64012=>'L', +64013=>'L', +64014=>'L', +64015=>'L', +64016=>'L', +64017=>'L', +64018=>'L', +64019=>'L', +64020=>'L', +64021=>'L', +64022=>'L', +64023=>'L', +64024=>'L', +64025=>'L', +64026=>'L', +64027=>'L', +64028=>'L', +64029=>'L', +64030=>'L', +64031=>'L', +64032=>'L', +64033=>'L', +64034=>'L', +64035=>'L', +64036=>'L', +64037=>'L', +64038=>'L', +64039=>'L', +64040=>'L', +64041=>'L', +64042=>'L', +64043=>'L', +64044=>'L', +64045=>'L', +64048=>'L', +64049=>'L', +64050=>'L', +64051=>'L', +64052=>'L', +64053=>'L', +64054=>'L', +64055=>'L', +64056=>'L', +64057=>'L', +64058=>'L', +64059=>'L', +64060=>'L', +64061=>'L', +64062=>'L', +64063=>'L', +64064=>'L', +64065=>'L', +64066=>'L', +64067=>'L', +64068=>'L', +64069=>'L', +64070=>'L', +64071=>'L', +64072=>'L', +64073=>'L', +64074=>'L', +64075=>'L', +64076=>'L', +64077=>'L', +64078=>'L', +64079=>'L', +64080=>'L', +64081=>'L', +64082=>'L', +64083=>'L', +64084=>'L', +64085=>'L', +64086=>'L', +64087=>'L', +64088=>'L', +64089=>'L', +64090=>'L', +64091=>'L', +64092=>'L', +64093=>'L', +64094=>'L', +64095=>'L', +64096=>'L', +64097=>'L', +64098=>'L', +64099=>'L', +64100=>'L', +64101=>'L', +64102=>'L', +64103=>'L', +64104=>'L', +64105=>'L', +64106=>'L', +64112=>'L', +64113=>'L', +64114=>'L', +64115=>'L', +64116=>'L', +64117=>'L', +64118=>'L', +64119=>'L', +64120=>'L', +64121=>'L', +64122=>'L', +64123=>'L', +64124=>'L', +64125=>'L', +64126=>'L', +64127=>'L', +64128=>'L', +64129=>'L', +64130=>'L', +64131=>'L', +64132=>'L', +64133=>'L', +64134=>'L', +64135=>'L', +64136=>'L', +64137=>'L', +64138=>'L', +64139=>'L', +64140=>'L', +64141=>'L', +64142=>'L', +64143=>'L', +64144=>'L', +64145=>'L', +64146=>'L', +64147=>'L', +64148=>'L', +64149=>'L', +64150=>'L', +64151=>'L', +64152=>'L', +64153=>'L', +64154=>'L', +64155=>'L', +64156=>'L', +64157=>'L', +64158=>'L', +64159=>'L', +64160=>'L', +64161=>'L', +64162=>'L', +64163=>'L', +64164=>'L', +64165=>'L', +64166=>'L', +64167=>'L', +64168=>'L', +64169=>'L', +64170=>'L', +64171=>'L', +64172=>'L', +64173=>'L', +64174=>'L', +64175=>'L', +64176=>'L', +64177=>'L', +64178=>'L', +64179=>'L', +64180=>'L', +64181=>'L', +64182=>'L', +64183=>'L', +64184=>'L', +64185=>'L', +64186=>'L', +64187=>'L', +64188=>'L', +64189=>'L', +64190=>'L', +64191=>'L', +64192=>'L', +64193=>'L', +64194=>'L', +64195=>'L', +64196=>'L', +64197=>'L', +64198=>'L', +64199=>'L', +64200=>'L', +64201=>'L', +64202=>'L', +64203=>'L', +64204=>'L', +64205=>'L', +64206=>'L', +64207=>'L', +64208=>'L', +64209=>'L', +64210=>'L', +64211=>'L', +64212=>'L', +64213=>'L', +64214=>'L', +64215=>'L', +64216=>'L', +64217=>'L', +64256=>'L', +64257=>'L', +64258=>'L', +64259=>'L', +64260=>'L', +64261=>'L', +64262=>'L', +64275=>'L', +64276=>'L', +64277=>'L', +64278=>'L', +64279=>'L', +64285=>'R', +64286=>'NSM', +64287=>'R', +64288=>'R', +64289=>'R', +64290=>'R', +64291=>'R', +64292=>'R', +64293=>'R', +64294=>'R', +64295=>'R', +64296=>'R', +64297=>'ES', +64298=>'R', +64299=>'R', +64300=>'R', +64301=>'R', +64302=>'R', +64303=>'R', +64304=>'R', +64305=>'R', +64306=>'R', +64307=>'R', +64308=>'R', +64309=>'R', +64310=>'R', +64312=>'R', +64313=>'R', +64314=>'R', +64315=>'R', +64316=>'R', +64318=>'R', +64320=>'R', +64321=>'R', +64323=>'R', +64324=>'R', +64326=>'R', +64327=>'R', +64328=>'R', +64329=>'R', +64330=>'R', +64331=>'R', +64332=>'R', +64333=>'R', +64334=>'R', +64335=>'R', +64336=>'AL', +64337=>'AL', +64338=>'AL', +64339=>'AL', +64340=>'AL', +64341=>'AL', +64342=>'AL', +64343=>'AL', +64344=>'AL', +64345=>'AL', +64346=>'AL', +64347=>'AL', +64348=>'AL', +64349=>'AL', +64350=>'AL', +64351=>'AL', +64352=>'AL', +64353=>'AL', +64354=>'AL', +64355=>'AL', +64356=>'AL', +64357=>'AL', +64358=>'AL', +64359=>'AL', +64360=>'AL', +64361=>'AL', +64362=>'AL', +64363=>'AL', +64364=>'AL', +64365=>'AL', +64366=>'AL', +64367=>'AL', +64368=>'AL', +64369=>'AL', +64370=>'AL', +64371=>'AL', +64372=>'AL', +64373=>'AL', +64374=>'AL', +64375=>'AL', +64376=>'AL', +64377=>'AL', +64378=>'AL', +64379=>'AL', +64380=>'AL', +64381=>'AL', +64382=>'AL', +64383=>'AL', +64384=>'AL', +64385=>'AL', +64386=>'AL', +64387=>'AL', +64388=>'AL', +64389=>'AL', +64390=>'AL', +64391=>'AL', +64392=>'AL', +64393=>'AL', +64394=>'AL', +64395=>'AL', +64396=>'AL', +64397=>'AL', +64398=>'AL', +64399=>'AL', +64400=>'AL', +64401=>'AL', +64402=>'AL', +64403=>'AL', +64404=>'AL', +64405=>'AL', +64406=>'AL', +64407=>'AL', +64408=>'AL', +64409=>'AL', +64410=>'AL', +64411=>'AL', +64412=>'AL', +64413=>'AL', +64414=>'AL', +64415=>'AL', +64416=>'AL', +64417=>'AL', +64418=>'AL', +64419=>'AL', +64420=>'AL', +64421=>'AL', +64422=>'AL', +64423=>'AL', +64424=>'AL', +64425=>'AL', +64426=>'AL', +64427=>'AL', +64428=>'AL', +64429=>'AL', +64430=>'AL', +64431=>'AL', +64432=>'AL', +64433=>'AL', +64467=>'AL', +64468=>'AL', +64469=>'AL', +64470=>'AL', +64471=>'AL', +64472=>'AL', +64473=>'AL', +64474=>'AL', +64475=>'AL', +64476=>'AL', +64477=>'AL', +64478=>'AL', +64479=>'AL', +64480=>'AL', +64481=>'AL', +64482=>'AL', +64483=>'AL', +64484=>'AL', +64485=>'AL', +64486=>'AL', +64487=>'AL', +64488=>'AL', +64489=>'AL', +64490=>'AL', +64491=>'AL', +64492=>'AL', +64493=>'AL', +64494=>'AL', +64495=>'AL', +64496=>'AL', +64497=>'AL', +64498=>'AL', +64499=>'AL', +64500=>'AL', +64501=>'AL', +64502=>'AL', +64503=>'AL', +64504=>'AL', +64505=>'AL', +64506=>'AL', +64507=>'AL', +64508=>'AL', +64509=>'AL', +64510=>'AL', +64511=>'AL', +64512=>'AL', +64513=>'AL', +64514=>'AL', +64515=>'AL', +64516=>'AL', +64517=>'AL', +64518=>'AL', +64519=>'AL', +64520=>'AL', +64521=>'AL', +64522=>'AL', +64523=>'AL', +64524=>'AL', +64525=>'AL', +64526=>'AL', +64527=>'AL', +64528=>'AL', +64529=>'AL', +64530=>'AL', +64531=>'AL', +64532=>'AL', +64533=>'AL', +64534=>'AL', +64535=>'AL', +64536=>'AL', +64537=>'AL', +64538=>'AL', +64539=>'AL', +64540=>'AL', +64541=>'AL', +64542=>'AL', +64543=>'AL', +64544=>'AL', +64545=>'AL', +64546=>'AL', +64547=>'AL', +64548=>'AL', +64549=>'AL', +64550=>'AL', +64551=>'AL', +64552=>'AL', +64553=>'AL', +64554=>'AL', +64555=>'AL', +64556=>'AL', +64557=>'AL', +64558=>'AL', +64559=>'AL', +64560=>'AL', +64561=>'AL', +64562=>'AL', +64563=>'AL', +64564=>'AL', +64565=>'AL', +64566=>'AL', +64567=>'AL', +64568=>'AL', +64569=>'AL', +64570=>'AL', +64571=>'AL', +64572=>'AL', +64573=>'AL', +64574=>'AL', +64575=>'AL', +64576=>'AL', +64577=>'AL', +64578=>'AL', +64579=>'AL', +64580=>'AL', +64581=>'AL', +64582=>'AL', +64583=>'AL', +64584=>'AL', +64585=>'AL', +64586=>'AL', +64587=>'AL', +64588=>'AL', +64589=>'AL', +64590=>'AL', +64591=>'AL', +64592=>'AL', +64593=>'AL', +64594=>'AL', +64595=>'AL', +64596=>'AL', +64597=>'AL', +64598=>'AL', +64599=>'AL', +64600=>'AL', +64601=>'AL', +64602=>'AL', +64603=>'AL', +64604=>'AL', +64605=>'AL', +64606=>'AL', +64607=>'AL', +64608=>'AL', +64609=>'AL', +64610=>'AL', +64611=>'AL', +64612=>'AL', +64613=>'AL', +64614=>'AL', +64615=>'AL', +64616=>'AL', +64617=>'AL', +64618=>'AL', +64619=>'AL', +64620=>'AL', +64621=>'AL', +64622=>'AL', +64623=>'AL', +64624=>'AL', +64625=>'AL', +64626=>'AL', +64627=>'AL', +64628=>'AL', +64629=>'AL', +64630=>'AL', +64631=>'AL', +64632=>'AL', +64633=>'AL', +64634=>'AL', +64635=>'AL', +64636=>'AL', +64637=>'AL', +64638=>'AL', +64639=>'AL', +64640=>'AL', +64641=>'AL', +64642=>'AL', +64643=>'AL', +64644=>'AL', +64645=>'AL', +64646=>'AL', +64647=>'AL', +64648=>'AL', +64649=>'AL', +64650=>'AL', +64651=>'AL', +64652=>'AL', +64653=>'AL', +64654=>'AL', +64655=>'AL', +64656=>'AL', +64657=>'AL', +64658=>'AL', +64659=>'AL', +64660=>'AL', +64661=>'AL', +64662=>'AL', +64663=>'AL', +64664=>'AL', +64665=>'AL', +64666=>'AL', +64667=>'AL', +64668=>'AL', +64669=>'AL', +64670=>'AL', +64671=>'AL', +64672=>'AL', +64673=>'AL', +64674=>'AL', +64675=>'AL', +64676=>'AL', +64677=>'AL', +64678=>'AL', +64679=>'AL', +64680=>'AL', +64681=>'AL', +64682=>'AL', +64683=>'AL', +64684=>'AL', +64685=>'AL', +64686=>'AL', +64687=>'AL', +64688=>'AL', +64689=>'AL', +64690=>'AL', +64691=>'AL', +64692=>'AL', +64693=>'AL', +64694=>'AL', +64695=>'AL', +64696=>'AL', +64697=>'AL', +64698=>'AL', +64699=>'AL', +64700=>'AL', +64701=>'AL', +64702=>'AL', +64703=>'AL', +64704=>'AL', +64705=>'AL', +64706=>'AL', +64707=>'AL', +64708=>'AL', +64709=>'AL', +64710=>'AL', +64711=>'AL', +64712=>'AL', +64713=>'AL', +64714=>'AL', +64715=>'AL', +64716=>'AL', +64717=>'AL', +64718=>'AL', +64719=>'AL', +64720=>'AL', +64721=>'AL', +64722=>'AL', +64723=>'AL', +64724=>'AL', +64725=>'AL', +64726=>'AL', +64727=>'AL', +64728=>'AL', +64729=>'AL', +64730=>'AL', +64731=>'AL', +64732=>'AL', +64733=>'AL', +64734=>'AL', +64735=>'AL', +64736=>'AL', +64737=>'AL', +64738=>'AL', +64739=>'AL', +64740=>'AL', +64741=>'AL', +64742=>'AL', +64743=>'AL', +64744=>'AL', +64745=>'AL', +64746=>'AL', +64747=>'AL', +64748=>'AL', +64749=>'AL', +64750=>'AL', +64751=>'AL', +64752=>'AL', +64753=>'AL', +64754=>'AL', +64755=>'AL', +64756=>'AL', +64757=>'AL', +64758=>'AL', +64759=>'AL', +64760=>'AL', +64761=>'AL', +64762=>'AL', +64763=>'AL', +64764=>'AL', +64765=>'AL', +64766=>'AL', +64767=>'AL', +64768=>'AL', +64769=>'AL', +64770=>'AL', +64771=>'AL', +64772=>'AL', +64773=>'AL', +64774=>'AL', +64775=>'AL', +64776=>'AL', +64777=>'AL', +64778=>'AL', +64779=>'AL', +64780=>'AL', +64781=>'AL', +64782=>'AL', +64783=>'AL', +64784=>'AL', +64785=>'AL', +64786=>'AL', +64787=>'AL', +64788=>'AL', +64789=>'AL', +64790=>'AL', +64791=>'AL', +64792=>'AL', +64793=>'AL', +64794=>'AL', +64795=>'AL', +64796=>'AL', +64797=>'AL', +64798=>'AL', +64799=>'AL', +64800=>'AL', +64801=>'AL', +64802=>'AL', +64803=>'AL', +64804=>'AL', +64805=>'AL', +64806=>'AL', +64807=>'AL', +64808=>'AL', +64809=>'AL', +64810=>'AL', +64811=>'AL', +64812=>'AL', +64813=>'AL', +64814=>'AL', +64815=>'AL', +64816=>'AL', +64817=>'AL', +64818=>'AL', +64819=>'AL', +64820=>'AL', +64821=>'AL', +64822=>'AL', +64823=>'AL', +64824=>'AL', +64825=>'AL', +64826=>'AL', +64827=>'AL', +64828=>'AL', +64829=>'AL', +64830=>'ON', +64831=>'ON', +64848=>'AL', +64849=>'AL', +64850=>'AL', +64851=>'AL', +64852=>'AL', +64853=>'AL', +64854=>'AL', +64855=>'AL', +64856=>'AL', +64857=>'AL', +64858=>'AL', +64859=>'AL', +64860=>'AL', +64861=>'AL', +64862=>'AL', +64863=>'AL', +64864=>'AL', +64865=>'AL', +64866=>'AL', +64867=>'AL', +64868=>'AL', +64869=>'AL', +64870=>'AL', +64871=>'AL', +64872=>'AL', +64873=>'AL', +64874=>'AL', +64875=>'AL', +64876=>'AL', +64877=>'AL', +64878=>'AL', +64879=>'AL', +64880=>'AL', +64881=>'AL', +64882=>'AL', +64883=>'AL', +64884=>'AL', +64885=>'AL', +64886=>'AL', +64887=>'AL', +64888=>'AL', +64889=>'AL', +64890=>'AL', +64891=>'AL', +64892=>'AL', +64893=>'AL', +64894=>'AL', +64895=>'AL', +64896=>'AL', +64897=>'AL', +64898=>'AL', +64899=>'AL', +64900=>'AL', +64901=>'AL', +64902=>'AL', +64903=>'AL', +64904=>'AL', +64905=>'AL', +64906=>'AL', +64907=>'AL', +64908=>'AL', +64909=>'AL', +64910=>'AL', +64911=>'AL', +64914=>'AL', +64915=>'AL', +64916=>'AL', +64917=>'AL', +64918=>'AL', +64919=>'AL', +64920=>'AL', +64921=>'AL', +64922=>'AL', +64923=>'AL', +64924=>'AL', +64925=>'AL', +64926=>'AL', +64927=>'AL', +64928=>'AL', +64929=>'AL', +64930=>'AL', +64931=>'AL', +64932=>'AL', +64933=>'AL', +64934=>'AL', +64935=>'AL', +64936=>'AL', +64937=>'AL', +64938=>'AL', +64939=>'AL', +64940=>'AL', +64941=>'AL', +64942=>'AL', +64943=>'AL', +64944=>'AL', +64945=>'AL', +64946=>'AL', +64947=>'AL', +64948=>'AL', +64949=>'AL', +64950=>'AL', +64951=>'AL', +64952=>'AL', +64953=>'AL', +64954=>'AL', +64955=>'AL', +64956=>'AL', +64957=>'AL', +64958=>'AL', +64959=>'AL', +64960=>'AL', +64961=>'AL', +64962=>'AL', +64963=>'AL', +64964=>'AL', +64965=>'AL', +64966=>'AL', +64967=>'AL', +65008=>'AL', +65009=>'AL', +65010=>'AL', +65011=>'AL', +65012=>'AL', +65013=>'AL', +65014=>'AL', +65015=>'AL', +65016=>'AL', +65017=>'AL', +65018=>'AL', +65019=>'AL', +65020=>'AL', +65021=>'ON', +65024=>'NSM', +65025=>'NSM', +65026=>'NSM', +65027=>'NSM', +65028=>'NSM', +65029=>'NSM', +65030=>'NSM', +65031=>'NSM', +65032=>'NSM', +65033=>'NSM', +65034=>'NSM', +65035=>'NSM', +65036=>'NSM', +65037=>'NSM', +65038=>'NSM', +65039=>'NSM', +65040=>'ON', +65041=>'ON', +65042=>'ON', +65043=>'ON', +65044=>'ON', +65045=>'ON', +65046=>'ON', +65047=>'ON', +65048=>'ON', +65049=>'ON', +65056=>'NSM', +65057=>'NSM', +65058=>'NSM', +65059=>'NSM', +65072=>'ON', +65073=>'ON', +65074=>'ON', +65075=>'ON', +65076=>'ON', +65077=>'ON', +65078=>'ON', +65079=>'ON', +65080=>'ON', +65081=>'ON', +65082=>'ON', +65083=>'ON', +65084=>'ON', +65085=>'ON', +65086=>'ON', +65087=>'ON', +65088=>'ON', +65089=>'ON', +65090=>'ON', +65091=>'ON', +65092=>'ON', +65093=>'ON', +65094=>'ON', +65095=>'ON', +65096=>'ON', +65097=>'ON', +65098=>'ON', +65099=>'ON', +65100=>'ON', +65101=>'ON', +65102=>'ON', +65103=>'ON', +65104=>'CS', +65105=>'ON', +65106=>'CS', +65108=>'ON', +65109=>'CS', +65110=>'ON', +65111=>'ON', +65112=>'ON', +65113=>'ON', +65114=>'ON', +65115=>'ON', +65116=>'ON', +65117=>'ON', +65118=>'ON', +65119=>'ET', +65120=>'ON', +65121=>'ON', +65122=>'ES', +65123=>'ES', +65124=>'ON', +65125=>'ON', +65126=>'ON', +65128=>'ON', +65129=>'ET', +65130=>'ET', +65131=>'ON', +65136=>'AL', +65137=>'AL', +65138=>'AL', +65139=>'AL', +65140=>'AL', +65142=>'AL', +65143=>'AL', +65144=>'AL', +65145=>'AL', +65146=>'AL', +65147=>'AL', +65148=>'AL', +65149=>'AL', +65150=>'AL', +65151=>'AL', +65152=>'AL', +65153=>'AL', +65154=>'AL', +65155=>'AL', +65156=>'AL', +65157=>'AL', +65158=>'AL', +65159=>'AL', +65160=>'AL', +65161=>'AL', +65162=>'AL', +65163=>'AL', +65164=>'AL', +65165=>'AL', +65166=>'AL', +65167=>'AL', +65168=>'AL', +65169=>'AL', +65170=>'AL', +65171=>'AL', +65172=>'AL', +65173=>'AL', +65174=>'AL', +65175=>'AL', +65176=>'AL', +65177=>'AL', +65178=>'AL', +65179=>'AL', +65180=>'AL', +65181=>'AL', +65182=>'AL', +65183=>'AL', +65184=>'AL', +65185=>'AL', +65186=>'AL', +65187=>'AL', +65188=>'AL', +65189=>'AL', +65190=>'AL', +65191=>'AL', +65192=>'AL', +65193=>'AL', +65194=>'AL', +65195=>'AL', +65196=>'AL', +65197=>'AL', +65198=>'AL', +65199=>'AL', +65200=>'AL', +65201=>'AL', +65202=>'AL', +65203=>'AL', +65204=>'AL', +65205=>'AL', +65206=>'AL', +65207=>'AL', +65208=>'AL', +65209=>'AL', +65210=>'AL', +65211=>'AL', +65212=>'AL', +65213=>'AL', +65214=>'AL', +65215=>'AL', +65216=>'AL', +65217=>'AL', +65218=>'AL', +65219=>'AL', +65220=>'AL', +65221=>'AL', +65222=>'AL', +65223=>'AL', +65224=>'AL', +65225=>'AL', +65226=>'AL', +65227=>'AL', +65228=>'AL', +65229=>'AL', +65230=>'AL', +65231=>'AL', +65232=>'AL', +65233=>'AL', +65234=>'AL', +65235=>'AL', +65236=>'AL', +65237=>'AL', +65238=>'AL', +65239=>'AL', +65240=>'AL', +65241=>'AL', +65242=>'AL', +65243=>'AL', +65244=>'AL', +65245=>'AL', +65246=>'AL', +65247=>'AL', +65248=>'AL', +65249=>'AL', +65250=>'AL', +65251=>'AL', +65252=>'AL', +65253=>'AL', +65254=>'AL', +65255=>'AL', +65256=>'AL', +65257=>'AL', +65258=>'AL', +65259=>'AL', +65260=>'AL', +65261=>'AL', +65262=>'AL', +65263=>'AL', +65264=>'AL', +65265=>'AL', +65266=>'AL', +65267=>'AL', +65268=>'AL', +65269=>'AL', +65270=>'AL', +65271=>'AL', +65272=>'AL', +65273=>'AL', +65274=>'AL', +65275=>'AL', +65276=>'AL', +65279=>'BN', +65281=>'ON', +65282=>'ON', +65283=>'ET', +65284=>'ET', +65285=>'ET', +65286=>'ON', +65287=>'ON', +65288=>'ON', +65289=>'ON', +65290=>'ON', +65291=>'ES', +65292=>'CS', +65293=>'ES', +65294=>'CS', +65295=>'CS', +65296=>'EN', +65297=>'EN', +65298=>'EN', +65299=>'EN', +65300=>'EN', +65301=>'EN', +65302=>'EN', +65303=>'EN', +65304=>'EN', +65305=>'EN', +65306=>'CS', +65307=>'ON', +65308=>'ON', +65309=>'ON', +65310=>'ON', +65311=>'ON', +65312=>'ON', +65313=>'L', +65314=>'L', +65315=>'L', +65316=>'L', +65317=>'L', +65318=>'L', +65319=>'L', +65320=>'L', +65321=>'L', +65322=>'L', +65323=>'L', +65324=>'L', +65325=>'L', +65326=>'L', +65327=>'L', +65328=>'L', +65329=>'L', +65330=>'L', +65331=>'L', +65332=>'L', +65333=>'L', +65334=>'L', +65335=>'L', +65336=>'L', +65337=>'L', +65338=>'L', +65339=>'ON', +65340=>'ON', +65341=>'ON', +65342=>'ON', +65343=>'ON', +65344=>'ON', +65345=>'L', +65346=>'L', +65347=>'L', +65348=>'L', +65349=>'L', +65350=>'L', +65351=>'L', +65352=>'L', +65353=>'L', +65354=>'L', +65355=>'L', +65356=>'L', +65357=>'L', +65358=>'L', +65359=>'L', +65360=>'L', +65361=>'L', +65362=>'L', +65363=>'L', +65364=>'L', +65365=>'L', +65366=>'L', +65367=>'L', +65368=>'L', +65369=>'L', +65370=>'L', +65371=>'ON', +65372=>'ON', +65373=>'ON', +65374=>'ON', +65375=>'ON', +65376=>'ON', +65377=>'ON', +65378=>'ON', +65379=>'ON', +65380=>'ON', +65381=>'ON', +65382=>'L', +65383=>'L', +65384=>'L', +65385=>'L', +65386=>'L', +65387=>'L', +65388=>'L', +65389=>'L', +65390=>'L', +65391=>'L', +65392=>'L', +65393=>'L', +65394=>'L', +65395=>'L', +65396=>'L', +65397=>'L', +65398=>'L', +65399=>'L', +65400=>'L', +65401=>'L', +65402=>'L', +65403=>'L', +65404=>'L', +65405=>'L', +65406=>'L', +65407=>'L', +65408=>'L', +65409=>'L', +65410=>'L', +65411=>'L', +65412=>'L', +65413=>'L', +65414=>'L', +65415=>'L', +65416=>'L', +65417=>'L', +65418=>'L', +65419=>'L', +65420=>'L', +65421=>'L', +65422=>'L', +65423=>'L', +65424=>'L', +65425=>'L', +65426=>'L', +65427=>'L', +65428=>'L', +65429=>'L', +65430=>'L', +65431=>'L', +65432=>'L', +65433=>'L', +65434=>'L', +65435=>'L', +65436=>'L', +65437=>'L', +65438=>'L', +65439=>'L', +65440=>'L', +65441=>'L', +65442=>'L', +65443=>'L', +65444=>'L', +65445=>'L', +65446=>'L', +65447=>'L', +65448=>'L', +65449=>'L', +65450=>'L', +65451=>'L', +65452=>'L', +65453=>'L', +65454=>'L', +65455=>'L', +65456=>'L', +65457=>'L', +65458=>'L', +65459=>'L', +65460=>'L', +65461=>'L', +65462=>'L', +65463=>'L', +65464=>'L', +65465=>'L', +65466=>'L', +65467=>'L', +65468=>'L', +65469=>'L', +65470=>'L', +65474=>'L', +65475=>'L', +65476=>'L', +65477=>'L', +65478=>'L', +65479=>'L', +65482=>'L', +65483=>'L', +65484=>'L', +65485=>'L', +65486=>'L', +65487=>'L', +65490=>'L', +65491=>'L', +65492=>'L', +65493=>'L', +65494=>'L', +65495=>'L', +65498=>'L', +65499=>'L', +65500=>'L', +65504=>'ET', +65505=>'ET', +65506=>'ON', +65507=>'ON', +65508=>'ON', +65509=>'ET', +65510=>'ET', +65512=>'ON', +65513=>'ON', +65514=>'ON', +65515=>'ON', +65516=>'ON', +65517=>'ON', +65518=>'ON', +65529=>'ON', +65530=>'ON', +65531=>'ON', +65532=>'ON', +65533=>'ON', +65536=>'L', +65537=>'L', +65538=>'L', +65539=>'L', +65540=>'L', +65541=>'L', +65542=>'L', +65543=>'L', +65544=>'L', +65545=>'L', +65546=>'L', +65547=>'L', +65549=>'L', +65550=>'L', +65551=>'L', +65552=>'L', +65553=>'L', +65554=>'L', +65555=>'L', +65556=>'L', +65557=>'L', +65558=>'L', +65559=>'L', +65560=>'L', +65561=>'L', +65562=>'L', +65563=>'L', +65564=>'L', +65565=>'L', +65566=>'L', +65567=>'L', +65568=>'L', +65569=>'L', +65570=>'L', +65571=>'L', +65572=>'L', +65573=>'L', +65574=>'L', +65576=>'L', +65577=>'L', +65578=>'L', +65579=>'L', +65580=>'L', +65581=>'L', +65582=>'L', +65583=>'L', +65584=>'L', +65585=>'L', +65586=>'L', +65587=>'L', +65588=>'L', +65589=>'L', +65590=>'L', +65591=>'L', +65592=>'L', +65593=>'L', +65594=>'L', +65596=>'L', +65597=>'L', +65599=>'L', +65600=>'L', +65601=>'L', +65602=>'L', +65603=>'L', +65604=>'L', +65605=>'L', +65606=>'L', +65607=>'L', +65608=>'L', +65609=>'L', +65610=>'L', +65611=>'L', +65612=>'L', +65613=>'L', +65616=>'L', +65617=>'L', +65618=>'L', +65619=>'L', +65620=>'L', +65621=>'L', +65622=>'L', +65623=>'L', +65624=>'L', +65625=>'L', +65626=>'L', +65627=>'L', +65628=>'L', +65629=>'L', +65664=>'L', +65665=>'L', +65666=>'L', +65667=>'L', +65668=>'L', +65669=>'L', +65670=>'L', +65671=>'L', +65672=>'L', +65673=>'L', +65674=>'L', +65675=>'L', +65676=>'L', +65677=>'L', +65678=>'L', +65679=>'L', +65680=>'L', +65681=>'L', +65682=>'L', +65683=>'L', +65684=>'L', +65685=>'L', +65686=>'L', +65687=>'L', +65688=>'L', +65689=>'L', +65690=>'L', +65691=>'L', +65692=>'L', +65693=>'L', +65694=>'L', +65695=>'L', +65696=>'L', +65697=>'L', +65698=>'L', +65699=>'L', +65700=>'L', +65701=>'L', +65702=>'L', +65703=>'L', +65704=>'L', +65705=>'L', +65706=>'L', +65707=>'L', +65708=>'L', +65709=>'L', +65710=>'L', +65711=>'L', +65712=>'L', +65713=>'L', +65714=>'L', +65715=>'L', +65716=>'L', +65717=>'L', +65718=>'L', +65719=>'L', +65720=>'L', +65721=>'L', +65722=>'L', +65723=>'L', +65724=>'L', +65725=>'L', +65726=>'L', +65727=>'L', +65728=>'L', +65729=>'L', +65730=>'L', +65731=>'L', +65732=>'L', +65733=>'L', +65734=>'L', +65735=>'L', +65736=>'L', +65737=>'L', +65738=>'L', +65739=>'L', +65740=>'L', +65741=>'L', +65742=>'L', +65743=>'L', +65744=>'L', +65745=>'L', +65746=>'L', +65747=>'L', +65748=>'L', +65749=>'L', +65750=>'L', +65751=>'L', +65752=>'L', +65753=>'L', +65754=>'L', +65755=>'L', +65756=>'L', +65757=>'L', +65758=>'L', +65759=>'L', +65760=>'L', +65761=>'L', +65762=>'L', +65763=>'L', +65764=>'L', +65765=>'L', +65766=>'L', +65767=>'L', +65768=>'L', +65769=>'L', +65770=>'L', +65771=>'L', +65772=>'L', +65773=>'L', +65774=>'L', +65775=>'L', +65776=>'L', +65777=>'L', +65778=>'L', +65779=>'L', +65780=>'L', +65781=>'L', +65782=>'L', +65783=>'L', +65784=>'L', +65785=>'L', +65786=>'L', +65792=>'L', +65793=>'ON', +65794=>'L', +65799=>'L', +65800=>'L', +65801=>'L', +65802=>'L', +65803=>'L', +65804=>'L', +65805=>'L', +65806=>'L', +65807=>'L', +65808=>'L', +65809=>'L', +65810=>'L', +65811=>'L', +65812=>'L', +65813=>'L', +65814=>'L', +65815=>'L', +65816=>'L', +65817=>'L', +65818=>'L', +65819=>'L', +65820=>'L', +65821=>'L', +65822=>'L', +65823=>'L', +65824=>'L', +65825=>'L', +65826=>'L', +65827=>'L', +65828=>'L', +65829=>'L', +65830=>'L', +65831=>'L', +65832=>'L', +65833=>'L', +65834=>'L', +65835=>'L', +65836=>'L', +65837=>'L', +65838=>'L', +65839=>'L', +65840=>'L', +65841=>'L', +65842=>'L', +65843=>'L', +65847=>'L', +65848=>'L', +65849=>'L', +65850=>'L', +65851=>'L', +65852=>'L', +65853=>'L', +65854=>'L', +65855=>'L', +65856=>'ON', +65857=>'ON', +65858=>'ON', +65859=>'ON', +65860=>'ON', +65861=>'ON', +65862=>'ON', +65863=>'ON', +65864=>'ON', +65865=>'ON', +65866=>'ON', +65867=>'ON', +65868=>'ON', +65869=>'ON', +65870=>'ON', +65871=>'ON', +65872=>'ON', +65873=>'ON', +65874=>'ON', +65875=>'ON', +65876=>'ON', +65877=>'ON', +65878=>'ON', +65879=>'ON', +65880=>'ON', +65881=>'ON', +65882=>'ON', +65883=>'ON', +65884=>'ON', +65885=>'ON', +65886=>'ON', +65887=>'ON', +65888=>'ON', +65889=>'ON', +65890=>'ON', +65891=>'ON', +65892=>'ON', +65893=>'ON', +65894=>'ON', +65895=>'ON', +65896=>'ON', +65897=>'ON', +65898=>'ON', +65899=>'ON', +65900=>'ON', +65901=>'ON', +65902=>'ON', +65903=>'ON', +65904=>'ON', +65905=>'ON', +65906=>'ON', +65907=>'ON', +65908=>'ON', +65909=>'ON', +65910=>'ON', +65911=>'ON', +65912=>'ON', +65913=>'ON', +65914=>'ON', +65915=>'ON', +65916=>'ON', +65917=>'ON', +65918=>'ON', +65919=>'ON', +65920=>'ON', +65921=>'ON', +65922=>'ON', +65923=>'ON', +65924=>'ON', +65925=>'ON', +65926=>'ON', +65927=>'ON', +65928=>'ON', +65929=>'ON', +65930=>'ON', +66304=>'L', +66305=>'L', +66306=>'L', +66307=>'L', +66308=>'L', +66309=>'L', +66310=>'L', +66311=>'L', +66312=>'L', +66313=>'L', +66314=>'L', +66315=>'L', +66316=>'L', +66317=>'L', +66318=>'L', +66319=>'L', +66320=>'L', +66321=>'L', +66322=>'L', +66323=>'L', +66324=>'L', +66325=>'L', +66326=>'L', +66327=>'L', +66328=>'L', +66329=>'L', +66330=>'L', +66331=>'L', +66332=>'L', +66333=>'L', +66334=>'L', +66336=>'L', +66337=>'L', +66338=>'L', +66339=>'L', +66352=>'L', +66353=>'L', +66354=>'L', +66355=>'L', +66356=>'L', +66357=>'L', +66358=>'L', +66359=>'L', +66360=>'L', +66361=>'L', +66362=>'L', +66363=>'L', +66364=>'L', +66365=>'L', +66366=>'L', +66367=>'L', +66368=>'L', +66369=>'L', +66370=>'L', +66371=>'L', +66372=>'L', +66373=>'L', +66374=>'L', +66375=>'L', +66376=>'L', +66377=>'L', +66378=>'L', +66432=>'L', +66433=>'L', +66434=>'L', +66435=>'L', +66436=>'L', +66437=>'L', +66438=>'L', +66439=>'L', +66440=>'L', +66441=>'L', +66442=>'L', +66443=>'L', +66444=>'L', +66445=>'L', +66446=>'L', +66447=>'L', +66448=>'L', +66449=>'L', +66450=>'L', +66451=>'L', +66452=>'L', +66453=>'L', +66454=>'L', +66455=>'L', +66456=>'L', +66457=>'L', +66458=>'L', +66459=>'L', +66460=>'L', +66461=>'L', +66463=>'L', +66464=>'L', +66465=>'L', +66466=>'L', +66467=>'L', +66468=>'L', +66469=>'L', +66470=>'L', +66471=>'L', +66472=>'L', +66473=>'L', +66474=>'L', +66475=>'L', +66476=>'L', +66477=>'L', +66478=>'L', +66479=>'L', +66480=>'L', +66481=>'L', +66482=>'L', +66483=>'L', +66484=>'L', +66485=>'L', +66486=>'L', +66487=>'L', +66488=>'L', +66489=>'L', +66490=>'L', +66491=>'L', +66492=>'L', +66493=>'L', +66494=>'L', +66495=>'L', +66496=>'L', +66497=>'L', +66498=>'L', +66499=>'L', +66504=>'L', +66505=>'L', +66506=>'L', +66507=>'L', +66508=>'L', +66509=>'L', +66510=>'L', +66511=>'L', +66512=>'L', +66513=>'L', +66514=>'L', +66515=>'L', +66516=>'L', +66517=>'L', +66560=>'L', +66561=>'L', +66562=>'L', +66563=>'L', +66564=>'L', +66565=>'L', +66566=>'L', +66567=>'L', +66568=>'L', +66569=>'L', +66570=>'L', +66571=>'L', +66572=>'L', +66573=>'L', +66574=>'L', +66575=>'L', +66576=>'L', +66577=>'L', +66578=>'L', +66579=>'L', +66580=>'L', +66581=>'L', +66582=>'L', +66583=>'L', +66584=>'L', +66585=>'L', +66586=>'L', +66587=>'L', +66588=>'L', +66589=>'L', +66590=>'L', +66591=>'L', +66592=>'L', +66593=>'L', +66594=>'L', +66595=>'L', +66596=>'L', +66597=>'L', +66598=>'L', +66599=>'L', +66600=>'L', +66601=>'L', +66602=>'L', +66603=>'L', +66604=>'L', +66605=>'L', +66606=>'L', +66607=>'L', +66608=>'L', +66609=>'L', +66610=>'L', +66611=>'L', +66612=>'L', +66613=>'L', +66614=>'L', +66615=>'L', +66616=>'L', +66617=>'L', +66618=>'L', +66619=>'L', +66620=>'L', +66621=>'L', +66622=>'L', +66623=>'L', +66624=>'L', +66625=>'L', +66626=>'L', +66627=>'L', +66628=>'L', +66629=>'L', +66630=>'L', +66631=>'L', +66632=>'L', +66633=>'L', +66634=>'L', +66635=>'L', +66636=>'L', +66637=>'L', +66638=>'L', +66639=>'L', +66640=>'L', +66641=>'L', +66642=>'L', +66643=>'L', +66644=>'L', +66645=>'L', +66646=>'L', +66647=>'L', +66648=>'L', +66649=>'L', +66650=>'L', +66651=>'L', +66652=>'L', +66653=>'L', +66654=>'L', +66655=>'L', +66656=>'L', +66657=>'L', +66658=>'L', +66659=>'L', +66660=>'L', +66661=>'L', +66662=>'L', +66663=>'L', +66664=>'L', +66665=>'L', +66666=>'L', +66667=>'L', +66668=>'L', +66669=>'L', +66670=>'L', +66671=>'L', +66672=>'L', +66673=>'L', +66674=>'L', +66675=>'L', +66676=>'L', +66677=>'L', +66678=>'L', +66679=>'L', +66680=>'L', +66681=>'L', +66682=>'L', +66683=>'L', +66684=>'L', +66685=>'L', +66686=>'L', +66687=>'L', +66688=>'L', +66689=>'L', +66690=>'L', +66691=>'L', +66692=>'L', +66693=>'L', +66694=>'L', +66695=>'L', +66696=>'L', +66697=>'L', +66698=>'L', +66699=>'L', +66700=>'L', +66701=>'L', +66702=>'L', +66703=>'L', +66704=>'L', +66705=>'L', +66706=>'L', +66707=>'L', +66708=>'L', +66709=>'L', +66710=>'L', +66711=>'L', +66712=>'L', +66713=>'L', +66714=>'L', +66715=>'L', +66716=>'L', +66717=>'L', +66720=>'L', +66721=>'L', +66722=>'L', +66723=>'L', +66724=>'L', +66725=>'L', +66726=>'L', +66727=>'L', +66728=>'L', +66729=>'L', +67584=>'R', +67585=>'R', +67586=>'R', +67587=>'R', +67588=>'R', +67589=>'R', +67592=>'R', +67594=>'R', +67595=>'R', +67596=>'R', +67597=>'R', +67598=>'R', +67599=>'R', +67600=>'R', +67601=>'R', +67602=>'R', +67603=>'R', +67604=>'R', +67605=>'R', +67606=>'R', +67607=>'R', +67608=>'R', +67609=>'R', +67610=>'R', +67611=>'R', +67612=>'R', +67613=>'R', +67614=>'R', +67615=>'R', +67616=>'R', +67617=>'R', +67618=>'R', +67619=>'R', +67620=>'R', +67621=>'R', +67622=>'R', +67623=>'R', +67624=>'R', +67625=>'R', +67626=>'R', +67627=>'R', +67628=>'R', +67629=>'R', +67630=>'R', +67631=>'R', +67632=>'R', +67633=>'R', +67634=>'R', +67635=>'R', +67636=>'R', +67637=>'R', +67639=>'R', +67640=>'R', +67644=>'R', +67647=>'R', +67840=>'R', +67841=>'R', +67842=>'R', +67843=>'R', +67844=>'R', +67845=>'R', +67846=>'R', +67847=>'R', +67848=>'R', +67849=>'R', +67850=>'R', +67851=>'R', +67852=>'R', +67853=>'R', +67854=>'R', +67855=>'R', +67856=>'R', +67857=>'R', +67858=>'R', +67859=>'R', +67860=>'R', +67861=>'R', +67862=>'R', +67863=>'R', +67864=>'R', +67865=>'R', +67871=>'ON', +68096=>'R', +68097=>'NSM', +68098=>'NSM', +68099=>'NSM', +68101=>'NSM', +68102=>'NSM', +68108=>'NSM', +68109=>'NSM', +68110=>'NSM', +68111=>'NSM', +68112=>'R', +68113=>'R', +68114=>'R', +68115=>'R', +68117=>'R', +68118=>'R', +68119=>'R', +68121=>'R', +68122=>'R', +68123=>'R', +68124=>'R', +68125=>'R', +68126=>'R', +68127=>'R', +68128=>'R', +68129=>'R', +68130=>'R', +68131=>'R', +68132=>'R', +68133=>'R', +68134=>'R', +68135=>'R', +68136=>'R', +68137=>'R', +68138=>'R', +68139=>'R', +68140=>'R', +68141=>'R', +68142=>'R', +68143=>'R', +68144=>'R', +68145=>'R', +68146=>'R', +68147=>'R', +68152=>'NSM', +68153=>'NSM', +68154=>'NSM', +68159=>'NSM', +68160=>'R', +68161=>'R', +68162=>'R', +68163=>'R', +68164=>'R', +68165=>'R', +68166=>'R', +68167=>'R', +68176=>'R', +68177=>'R', +68178=>'R', +68179=>'R', +68180=>'R', +68181=>'R', +68182=>'R', +68183=>'R', +68184=>'R', +73728=>'L', +73729=>'L', +73730=>'L', +73731=>'L', +73732=>'L', +73733=>'L', +73734=>'L', +73735=>'L', +73736=>'L', +73737=>'L', +73738=>'L', +73739=>'L', +73740=>'L', +73741=>'L', +73742=>'L', +73743=>'L', +73744=>'L', +73745=>'L', +73746=>'L', +73747=>'L', +73748=>'L', +73749=>'L', +73750=>'L', +73751=>'L', +73752=>'L', +73753=>'L', +73754=>'L', +73755=>'L', +73756=>'L', +73757=>'L', +73758=>'L', +73759=>'L', +73760=>'L', +73761=>'L', +73762=>'L', +73763=>'L', +73764=>'L', +73765=>'L', +73766=>'L', +73767=>'L', +73768=>'L', +73769=>'L', +73770=>'L', +73771=>'L', +73772=>'L', +73773=>'L', +73774=>'L', +73775=>'L', +73776=>'L', +73777=>'L', +73778=>'L', +73779=>'L', +73780=>'L', +73781=>'L', +73782=>'L', +73783=>'L', +73784=>'L', +73785=>'L', +73786=>'L', +73787=>'L', +73788=>'L', +73789=>'L', +73790=>'L', +73791=>'L', +73792=>'L', +73793=>'L', +73794=>'L', +73795=>'L', +73796=>'L', +73797=>'L', +73798=>'L', +73799=>'L', +73800=>'L', +73801=>'L', +73802=>'L', +73803=>'L', +73804=>'L', +73805=>'L', +73806=>'L', +73807=>'L', +73808=>'L', +73809=>'L', +73810=>'L', +73811=>'L', +73812=>'L', +73813=>'L', +73814=>'L', +73815=>'L', +73816=>'L', +73817=>'L', +73818=>'L', +73819=>'L', +73820=>'L', +73821=>'L', +73822=>'L', +73823=>'L', +73824=>'L', +73825=>'L', +73826=>'L', +73827=>'L', +73828=>'L', +73829=>'L', +73830=>'L', +73831=>'L', +73832=>'L', +73833=>'L', +73834=>'L', +73835=>'L', +73836=>'L', +73837=>'L', +73838=>'L', +73839=>'L', +73840=>'L', +73841=>'L', +73842=>'L', +73843=>'L', +73844=>'L', +73845=>'L', +73846=>'L', +73847=>'L', +73848=>'L', +73849=>'L', +73850=>'L', +73851=>'L', +73852=>'L', +73853=>'L', +73854=>'L', +73855=>'L', +73856=>'L', +73857=>'L', +73858=>'L', +73859=>'L', +73860=>'L', +73861=>'L', +73862=>'L', +73863=>'L', +73864=>'L', +73865=>'L', +73866=>'L', +73867=>'L', +73868=>'L', +73869=>'L', +73870=>'L', +73871=>'L', +73872=>'L', +73873=>'L', +73874=>'L', +73875=>'L', +73876=>'L', +73877=>'L', +73878=>'L', +73879=>'L', +73880=>'L', +73881=>'L', +73882=>'L', +73883=>'L', +73884=>'L', +73885=>'L', +73886=>'L', +73887=>'L', +73888=>'L', +73889=>'L', +73890=>'L', +73891=>'L', +73892=>'L', +73893=>'L', +73894=>'L', +73895=>'L', +73896=>'L', +73897=>'L', +73898=>'L', +73899=>'L', +73900=>'L', +73901=>'L', +73902=>'L', +73903=>'L', +73904=>'L', +73905=>'L', +73906=>'L', +73907=>'L', +73908=>'L', +73909=>'L', +73910=>'L', +73911=>'L', +73912=>'L', +73913=>'L', +73914=>'L', +73915=>'L', +73916=>'L', +73917=>'L', +73918=>'L', +73919=>'L', +73920=>'L', +73921=>'L', +73922=>'L', +73923=>'L', +73924=>'L', +73925=>'L', +73926=>'L', +73927=>'L', +73928=>'L', +73929=>'L', +73930=>'L', +73931=>'L', +73932=>'L', +73933=>'L', +73934=>'L', +73935=>'L', +73936=>'L', +73937=>'L', +73938=>'L', +73939=>'L', +73940=>'L', +73941=>'L', +73942=>'L', +73943=>'L', +73944=>'L', +73945=>'L', +73946=>'L', +73947=>'L', +73948=>'L', +73949=>'L', +73950=>'L', +73951=>'L', +73952=>'L', +73953=>'L', +73954=>'L', +73955=>'L', +73956=>'L', +73957=>'L', +73958=>'L', +73959=>'L', +73960=>'L', +73961=>'L', +73962=>'L', +73963=>'L', +73964=>'L', +73965=>'L', +73966=>'L', +73967=>'L', +73968=>'L', +73969=>'L', +73970=>'L', +73971=>'L', +73972=>'L', +73973=>'L', +73974=>'L', +73975=>'L', +73976=>'L', +73977=>'L', +73978=>'L', +73979=>'L', +73980=>'L', +73981=>'L', +73982=>'L', +73983=>'L', +73984=>'L', +73985=>'L', +73986=>'L', +73987=>'L', +73988=>'L', +73989=>'L', +73990=>'L', +73991=>'L', +73992=>'L', +73993=>'L', +73994=>'L', +73995=>'L', +73996=>'L', +73997=>'L', +73998=>'L', +73999=>'L', +74000=>'L', +74001=>'L', +74002=>'L', +74003=>'L', +74004=>'L', +74005=>'L', +74006=>'L', +74007=>'L', +74008=>'L', +74009=>'L', +74010=>'L', +74011=>'L', +74012=>'L', +74013=>'L', +74014=>'L', +74015=>'L', +74016=>'L', +74017=>'L', +74018=>'L', +74019=>'L', +74020=>'L', +74021=>'L', +74022=>'L', +74023=>'L', +74024=>'L', +74025=>'L', +74026=>'L', +74027=>'L', +74028=>'L', +74029=>'L', +74030=>'L', +74031=>'L', +74032=>'L', +74033=>'L', +74034=>'L', +74035=>'L', +74036=>'L', +74037=>'L', +74038=>'L', +74039=>'L', +74040=>'L', +74041=>'L', +74042=>'L', +74043=>'L', +74044=>'L', +74045=>'L', +74046=>'L', +74047=>'L', +74048=>'L', +74049=>'L', +74050=>'L', +74051=>'L', +74052=>'L', +74053=>'L', +74054=>'L', +74055=>'L', +74056=>'L', +74057=>'L', +74058=>'L', +74059=>'L', +74060=>'L', +74061=>'L', +74062=>'L', +74063=>'L', +74064=>'L', +74065=>'L', +74066=>'L', +74067=>'L', +74068=>'L', +74069=>'L', +74070=>'L', +74071=>'L', +74072=>'L', +74073=>'L', +74074=>'L', +74075=>'L', +74076=>'L', +74077=>'L', +74078=>'L', +74079=>'L', +74080=>'L', +74081=>'L', +74082=>'L', +74083=>'L', +74084=>'L', +74085=>'L', +74086=>'L', +74087=>'L', +74088=>'L', +74089=>'L', +74090=>'L', +74091=>'L', +74092=>'L', +74093=>'L', +74094=>'L', +74095=>'L', +74096=>'L', +74097=>'L', +74098=>'L', +74099=>'L', +74100=>'L', +74101=>'L', +74102=>'L', +74103=>'L', +74104=>'L', +74105=>'L', +74106=>'L', +74107=>'L', +74108=>'L', +74109=>'L', +74110=>'L', +74111=>'L', +74112=>'L', +74113=>'L', +74114=>'L', +74115=>'L', +74116=>'L', +74117=>'L', +74118=>'L', +74119=>'L', +74120=>'L', +74121=>'L', +74122=>'L', +74123=>'L', +74124=>'L', +74125=>'L', +74126=>'L', +74127=>'L', +74128=>'L', +74129=>'L', +74130=>'L', +74131=>'L', +74132=>'L', +74133=>'L', +74134=>'L', +74135=>'L', +74136=>'L', +74137=>'L', +74138=>'L', +74139=>'L', +74140=>'L', +74141=>'L', +74142=>'L', +74143=>'L', +74144=>'L', +74145=>'L', +74146=>'L', +74147=>'L', +74148=>'L', +74149=>'L', +74150=>'L', +74151=>'L', +74152=>'L', +74153=>'L', +74154=>'L', +74155=>'L', +74156=>'L', +74157=>'L', +74158=>'L', +74159=>'L', +74160=>'L', +74161=>'L', +74162=>'L', +74163=>'L', +74164=>'L', +74165=>'L', +74166=>'L', +74167=>'L', +74168=>'L', +74169=>'L', +74170=>'L', +74171=>'L', +74172=>'L', +74173=>'L', +74174=>'L', +74175=>'L', +74176=>'L', +74177=>'L', +74178=>'L', +74179=>'L', +74180=>'L', +74181=>'L', +74182=>'L', +74183=>'L', +74184=>'L', +74185=>'L', +74186=>'L', +74187=>'L', +74188=>'L', +74189=>'L', +74190=>'L', +74191=>'L', +74192=>'L', +74193=>'L', +74194=>'L', +74195=>'L', +74196=>'L', +74197=>'L', +74198=>'L', +74199=>'L', +74200=>'L', +74201=>'L', +74202=>'L', +74203=>'L', +74204=>'L', +74205=>'L', +74206=>'L', +74207=>'L', +74208=>'L', +74209=>'L', +74210=>'L', +74211=>'L', +74212=>'L', +74213=>'L', +74214=>'L', +74215=>'L', +74216=>'L', +74217=>'L', +74218=>'L', +74219=>'L', +74220=>'L', +74221=>'L', +74222=>'L', +74223=>'L', +74224=>'L', +74225=>'L', +74226=>'L', +74227=>'L', +74228=>'L', +74229=>'L', +74230=>'L', +74231=>'L', +74232=>'L', +74233=>'L', +74234=>'L', +74235=>'L', +74236=>'L', +74237=>'L', +74238=>'L', +74239=>'L', +74240=>'L', +74241=>'L', +74242=>'L', +74243=>'L', +74244=>'L', +74245=>'L', +74246=>'L', +74247=>'L', +74248=>'L', +74249=>'L', +74250=>'L', +74251=>'L', +74252=>'L', +74253=>'L', +74254=>'L', +74255=>'L', +74256=>'L', +74257=>'L', +74258=>'L', +74259=>'L', +74260=>'L', +74261=>'L', +74262=>'L', +74263=>'L', +74264=>'L', +74265=>'L', +74266=>'L', +74267=>'L', +74268=>'L', +74269=>'L', +74270=>'L', +74271=>'L', +74272=>'L', +74273=>'L', +74274=>'L', +74275=>'L', +74276=>'L', +74277=>'L', +74278=>'L', +74279=>'L', +74280=>'L', +74281=>'L', +74282=>'L', +74283=>'L', +74284=>'L', +74285=>'L', +74286=>'L', +74287=>'L', +74288=>'L', +74289=>'L', +74290=>'L', +74291=>'L', +74292=>'L', +74293=>'L', +74294=>'L', +74295=>'L', +74296=>'L', +74297=>'L', +74298=>'L', +74299=>'L', +74300=>'L', +74301=>'L', +74302=>'L', +74303=>'L', +74304=>'L', +74305=>'L', +74306=>'L', +74307=>'L', +74308=>'L', +74309=>'L', +74310=>'L', +74311=>'L', +74312=>'L', +74313=>'L', +74314=>'L', +74315=>'L', +74316=>'L', +74317=>'L', +74318=>'L', +74319=>'L', +74320=>'L', +74321=>'L', +74322=>'L', +74323=>'L', +74324=>'L', +74325=>'L', +74326=>'L', +74327=>'L', +74328=>'L', +74329=>'L', +74330=>'L', +74331=>'L', +74332=>'L', +74333=>'L', +74334=>'L', +74335=>'L', +74336=>'L', +74337=>'L', +74338=>'L', +74339=>'L', +74340=>'L', +74341=>'L', +74342=>'L', +74343=>'L', +74344=>'L', +74345=>'L', +74346=>'L', +74347=>'L', +74348=>'L', +74349=>'L', +74350=>'L', +74351=>'L', +74352=>'L', +74353=>'L', +74354=>'L', +74355=>'L', +74356=>'L', +74357=>'L', +74358=>'L', +74359=>'L', +74360=>'L', +74361=>'L', +74362=>'L', +74363=>'L', +74364=>'L', +74365=>'L', +74366=>'L', +74367=>'L', +74368=>'L', +74369=>'L', +74370=>'L', +74371=>'L', +74372=>'L', +74373=>'L', +74374=>'L', +74375=>'L', +74376=>'L', +74377=>'L', +74378=>'L', +74379=>'L', +74380=>'L', +74381=>'L', +74382=>'L', +74383=>'L', +74384=>'L', +74385=>'L', +74386=>'L', +74387=>'L', +74388=>'L', +74389=>'L', +74390=>'L', +74391=>'L', +74392=>'L', +74393=>'L', +74394=>'L', +74395=>'L', +74396=>'L', +74397=>'L', +74398=>'L', +74399=>'L', +74400=>'L', +74401=>'L', +74402=>'L', +74403=>'L', +74404=>'L', +74405=>'L', +74406=>'L', +74407=>'L', +74408=>'L', +74409=>'L', +74410=>'L', +74411=>'L', +74412=>'L', +74413=>'L', +74414=>'L', +74415=>'L', +74416=>'L', +74417=>'L', +74418=>'L', +74419=>'L', +74420=>'L', +74421=>'L', +74422=>'L', +74423=>'L', +74424=>'L', +74425=>'L', +74426=>'L', +74427=>'L', +74428=>'L', +74429=>'L', +74430=>'L', +74431=>'L', +74432=>'L', +74433=>'L', +74434=>'L', +74435=>'L', +74436=>'L', +74437=>'L', +74438=>'L', +74439=>'L', +74440=>'L', +74441=>'L', +74442=>'L', +74443=>'L', +74444=>'L', +74445=>'L', +74446=>'L', +74447=>'L', +74448=>'L', +74449=>'L', +74450=>'L', +74451=>'L', +74452=>'L', +74453=>'L', +74454=>'L', +74455=>'L', +74456=>'L', +74457=>'L', +74458=>'L', +74459=>'L', +74460=>'L', +74461=>'L', +74462=>'L', +74463=>'L', +74464=>'L', +74465=>'L', +74466=>'L', +74467=>'L', +74468=>'L', +74469=>'L', +74470=>'L', +74471=>'L', +74472=>'L', +74473=>'L', +74474=>'L', +74475=>'L', +74476=>'L', +74477=>'L', +74478=>'L', +74479=>'L', +74480=>'L', +74481=>'L', +74482=>'L', +74483=>'L', +74484=>'L', +74485=>'L', +74486=>'L', +74487=>'L', +74488=>'L', +74489=>'L', +74490=>'L', +74491=>'L', +74492=>'L', +74493=>'L', +74494=>'L', +74495=>'L', +74496=>'L', +74497=>'L', +74498=>'L', +74499=>'L', +74500=>'L', +74501=>'L', +74502=>'L', +74503=>'L', +74504=>'L', +74505=>'L', +74506=>'L', +74507=>'L', +74508=>'L', +74509=>'L', +74510=>'L', +74511=>'L', +74512=>'L', +74513=>'L', +74514=>'L', +74515=>'L', +74516=>'L', +74517=>'L', +74518=>'L', +74519=>'L', +74520=>'L', +74521=>'L', +74522=>'L', +74523=>'L', +74524=>'L', +74525=>'L', +74526=>'L', +74527=>'L', +74528=>'L', +74529=>'L', +74530=>'L', +74531=>'L', +74532=>'L', +74533=>'L', +74534=>'L', +74535=>'L', +74536=>'L', +74537=>'L', +74538=>'L', +74539=>'L', +74540=>'L', +74541=>'L', +74542=>'L', +74543=>'L', +74544=>'L', +74545=>'L', +74546=>'L', +74547=>'L', +74548=>'L', +74549=>'L', +74550=>'L', +74551=>'L', +74552=>'L', +74553=>'L', +74554=>'L', +74555=>'L', +74556=>'L', +74557=>'L', +74558=>'L', +74559=>'L', +74560=>'L', +74561=>'L', +74562=>'L', +74563=>'L', +74564=>'L', +74565=>'L', +74566=>'L', +74567=>'L', +74568=>'L', +74569=>'L', +74570=>'L', +74571=>'L', +74572=>'L', +74573=>'L', +74574=>'L', +74575=>'L', +74576=>'L', +74577=>'L', +74578=>'L', +74579=>'L', +74580=>'L', +74581=>'L', +74582=>'L', +74583=>'L', +74584=>'L', +74585=>'L', +74586=>'L', +74587=>'L', +74588=>'L', +74589=>'L', +74590=>'L', +74591=>'L', +74592=>'L', +74593=>'L', +74594=>'L', +74595=>'L', +74596=>'L', +74597=>'L', +74598=>'L', +74599=>'L', +74600=>'L', +74601=>'L', +74602=>'L', +74603=>'L', +74604=>'L', +74605=>'L', +74606=>'L', +74752=>'L', +74753=>'L', +74754=>'L', +74755=>'L', +74756=>'L', +74757=>'L', +74758=>'L', +74759=>'L', +74760=>'L', +74761=>'L', +74762=>'L', +74763=>'L', +74764=>'L', +74765=>'L', +74766=>'L', +74767=>'L', +74768=>'L', +74769=>'L', +74770=>'L', +74771=>'L', +74772=>'L', +74773=>'L', +74774=>'L', +74775=>'L', +74776=>'L', +74777=>'L', +74778=>'L', +74779=>'L', +74780=>'L', +74781=>'L', +74782=>'L', +74783=>'L', +74784=>'L', +74785=>'L', +74786=>'L', +74787=>'L', +74788=>'L', +74789=>'L', +74790=>'L', +74791=>'L', +74792=>'L', +74793=>'L', +74794=>'L', +74795=>'L', +74796=>'L', +74797=>'L', +74798=>'L', +74799=>'L', +74800=>'L', +74801=>'L', +74802=>'L', +74803=>'L', +74804=>'L', +74805=>'L', +74806=>'L', +74807=>'L', +74808=>'L', +74809=>'L', +74810=>'L', +74811=>'L', +74812=>'L', +74813=>'L', +74814=>'L', +74815=>'L', +74816=>'L', +74817=>'L', +74818=>'L', +74819=>'L', +74820=>'L', +74821=>'L', +74822=>'L', +74823=>'L', +74824=>'L', +74825=>'L', +74826=>'L', +74827=>'L', +74828=>'L', +74829=>'L', +74830=>'L', +74831=>'L', +74832=>'L', +74833=>'L', +74834=>'L', +74835=>'L', +74836=>'L', +74837=>'L', +74838=>'L', +74839=>'L', +74840=>'L', +74841=>'L', +74842=>'L', +74843=>'L', +74844=>'L', +74845=>'L', +74846=>'L', +74847=>'L', +74848=>'L', +74849=>'L', +74850=>'L', +74864=>'L', +74865=>'L', +74866=>'L', +74867=>'L', +118784=>'L', +118785=>'L', +118786=>'L', +118787=>'L', +118788=>'L', +118789=>'L', +118790=>'L', +118791=>'L', +118792=>'L', +118793=>'L', +118794=>'L', +118795=>'L', +118796=>'L', +118797=>'L', +118798=>'L', +118799=>'L', +118800=>'L', +118801=>'L', +118802=>'L', +118803=>'L', +118804=>'L', +118805=>'L', +118806=>'L', +118807=>'L', +118808=>'L', +118809=>'L', +118810=>'L', +118811=>'L', +118812=>'L', +118813=>'L', +118814=>'L', +118815=>'L', +118816=>'L', +118817=>'L', +118818=>'L', +118819=>'L', +118820=>'L', +118821=>'L', +118822=>'L', +118823=>'L', +118824=>'L', +118825=>'L', +118826=>'L', +118827=>'L', +118828=>'L', +118829=>'L', +118830=>'L', +118831=>'L', +118832=>'L', +118833=>'L', +118834=>'L', +118835=>'L', +118836=>'L', +118837=>'L', +118838=>'L', +118839=>'L', +118840=>'L', +118841=>'L', +118842=>'L', +118843=>'L', +118844=>'L', +118845=>'L', +118846=>'L', +118847=>'L', +118848=>'L', +118849=>'L', +118850=>'L', +118851=>'L', +118852=>'L', +118853=>'L', +118854=>'L', +118855=>'L', +118856=>'L', +118857=>'L', +118858=>'L', +118859=>'L', +118860=>'L', +118861=>'L', +118862=>'L', +118863=>'L', +118864=>'L', +118865=>'L', +118866=>'L', +118867=>'L', +118868=>'L', +118869=>'L', +118870=>'L', +118871=>'L', +118872=>'L', +118873=>'L', +118874=>'L', +118875=>'L', +118876=>'L', +118877=>'L', +118878=>'L', +118879=>'L', +118880=>'L', +118881=>'L', +118882=>'L', +118883=>'L', +118884=>'L', +118885=>'L', +118886=>'L', +118887=>'L', +118888=>'L', +118889=>'L', +118890=>'L', +118891=>'L', +118892=>'L', +118893=>'L', +118894=>'L', +118895=>'L', +118896=>'L', +118897=>'L', +118898=>'L', +118899=>'L', +118900=>'L', +118901=>'L', +118902=>'L', +118903=>'L', +118904=>'L', +118905=>'L', +118906=>'L', +118907=>'L', +118908=>'L', +118909=>'L', +118910=>'L', +118911=>'L', +118912=>'L', +118913=>'L', +118914=>'L', +118915=>'L', +118916=>'L', +118917=>'L', +118918=>'L', +118919=>'L', +118920=>'L', +118921=>'L', +118922=>'L', +118923=>'L', +118924=>'L', +118925=>'L', +118926=>'L', +118927=>'L', +118928=>'L', +118929=>'L', +118930=>'L', +118931=>'L', +118932=>'L', +118933=>'L', +118934=>'L', +118935=>'L', +118936=>'L', +118937=>'L', +118938=>'L', +118939=>'L', +118940=>'L', +118941=>'L', +118942=>'L', +118943=>'L', +118944=>'L', +118945=>'L', +118946=>'L', +118947=>'L', +118948=>'L', +118949=>'L', +118950=>'L', +118951=>'L', +118952=>'L', +118953=>'L', +118954=>'L', +118955=>'L', +118956=>'L', +118957=>'L', +118958=>'L', +118959=>'L', +118960=>'L', +118961=>'L', +118962=>'L', +118963=>'L', +118964=>'L', +118965=>'L', +118966=>'L', +118967=>'L', +118968=>'L', +118969=>'L', +118970=>'L', +118971=>'L', +118972=>'L', +118973=>'L', +118974=>'L', +118975=>'L', +118976=>'L', +118977=>'L', +118978=>'L', +118979=>'L', +118980=>'L', +118981=>'L', +118982=>'L', +118983=>'L', +118984=>'L', +118985=>'L', +118986=>'L', +118987=>'L', +118988=>'L', +118989=>'L', +118990=>'L', +118991=>'L', +118992=>'L', +118993=>'L', +118994=>'L', +118995=>'L', +118996=>'L', +118997=>'L', +118998=>'L', +118999=>'L', +119000=>'L', +119001=>'L', +119002=>'L', +119003=>'L', +119004=>'L', +119005=>'L', +119006=>'L', +119007=>'L', +119008=>'L', +119009=>'L', +119010=>'L', +119011=>'L', +119012=>'L', +119013=>'L', +119014=>'L', +119015=>'L', +119016=>'L', +119017=>'L', +119018=>'L', +119019=>'L', +119020=>'L', +119021=>'L', +119022=>'L', +119023=>'L', +119024=>'L', +119025=>'L', +119026=>'L', +119027=>'L', +119028=>'L', +119029=>'L', +119040=>'L', +119041=>'L', +119042=>'L', +119043=>'L', +119044=>'L', +119045=>'L', +119046=>'L', +119047=>'L', +119048=>'L', +119049=>'L', +119050=>'L', +119051=>'L', +119052=>'L', +119053=>'L', +119054=>'L', +119055=>'L', +119056=>'L', +119057=>'L', +119058=>'L', +119059=>'L', +119060=>'L', +119061=>'L', +119062=>'L', +119063=>'L', +119064=>'L', +119065=>'L', +119066=>'L', +119067=>'L', +119068=>'L', +119069=>'L', +119070=>'L', +119071=>'L', +119072=>'L', +119073=>'L', +119074=>'L', +119075=>'L', +119076=>'L', +119077=>'L', +119078=>'L', +119082=>'L', +119083=>'L', +119084=>'L', +119085=>'L', +119086=>'L', +119087=>'L', +119088=>'L', +119089=>'L', +119090=>'L', +119091=>'L', +119092=>'L', +119093=>'L', +119094=>'L', +119095=>'L', +119096=>'L', +119097=>'L', +119098=>'L', +119099=>'L', +119100=>'L', +119101=>'L', +119102=>'L', +119103=>'L', +119104=>'L', +119105=>'L', +119106=>'L', +119107=>'L', +119108=>'L', +119109=>'L', +119110=>'L', +119111=>'L', +119112=>'L', +119113=>'L', +119114=>'L', +119115=>'L', +119116=>'L', +119117=>'L', +119118=>'L', +119119=>'L', +119120=>'L', +119121=>'L', +119122=>'L', +119123=>'L', +119124=>'L', +119125=>'L', +119126=>'L', +119127=>'L', +119128=>'L', +119129=>'L', +119130=>'L', +119131=>'L', +119132=>'L', +119133=>'L', +119134=>'L', +119135=>'L', +119136=>'L', +119137=>'L', +119138=>'L', +119139=>'L', +119140=>'L', +119141=>'L', +119142=>'L', +119143=>'NSM', +119144=>'NSM', +119145=>'NSM', +119146=>'L', +119147=>'L', +119148=>'L', +119149=>'L', +119150=>'L', +119151=>'L', +119152=>'L', +119153=>'L', +119154=>'L', +119155=>'BN', +119156=>'BN', +119157=>'BN', +119158=>'BN', +119159=>'BN', +119160=>'BN', +119161=>'BN', +119162=>'BN', +119163=>'NSM', +119164=>'NSM', +119165=>'NSM', +119166=>'NSM', +119167=>'NSM', +119168=>'NSM', +119169=>'NSM', +119170=>'NSM', +119171=>'L', +119172=>'L', +119173=>'NSM', +119174=>'NSM', +119175=>'NSM', +119176=>'NSM', +119177=>'NSM', +119178=>'NSM', +119179=>'NSM', +119180=>'L', +119181=>'L', +119182=>'L', +119183=>'L', +119184=>'L', +119185=>'L', +119186=>'L', +119187=>'L', +119188=>'L', +119189=>'L', +119190=>'L', +119191=>'L', +119192=>'L', +119193=>'L', +119194=>'L', +119195=>'L', +119196=>'L', +119197=>'L', +119198=>'L', +119199=>'L', +119200=>'L', +119201=>'L', +119202=>'L', +119203=>'L', +119204=>'L', +119205=>'L', +119206=>'L', +119207=>'L', +119208=>'L', +119209=>'L', +119210=>'NSM', +119211=>'NSM', +119212=>'NSM', +119213=>'NSM', +119214=>'L', +119215=>'L', +119216=>'L', +119217=>'L', +119218=>'L', +119219=>'L', +119220=>'L', +119221=>'L', +119222=>'L', +119223=>'L', +119224=>'L', +119225=>'L', +119226=>'L', +119227=>'L', +119228=>'L', +119229=>'L', +119230=>'L', +119231=>'L', +119232=>'L', +119233=>'L', +119234=>'L', +119235=>'L', +119236=>'L', +119237=>'L', +119238=>'L', +119239=>'L', +119240=>'L', +119241=>'L', +119242=>'L', +119243=>'L', +119244=>'L', +119245=>'L', +119246=>'L', +119247=>'L', +119248=>'L', +119249=>'L', +119250=>'L', +119251=>'L', +119252=>'L', +119253=>'L', +119254=>'L', +119255=>'L', +119256=>'L', +119257=>'L', +119258=>'L', +119259=>'L', +119260=>'L', +119261=>'L', +119296=>'ON', +119297=>'ON', +119298=>'ON', +119299=>'ON', +119300=>'ON', +119301=>'ON', +119302=>'ON', +119303=>'ON', +119304=>'ON', +119305=>'ON', +119306=>'ON', +119307=>'ON', +119308=>'ON', +119309=>'ON', +119310=>'ON', +119311=>'ON', +119312=>'ON', +119313=>'ON', +119314=>'ON', +119315=>'ON', +119316=>'ON', +119317=>'ON', +119318=>'ON', +119319=>'ON', +119320=>'ON', +119321=>'ON', +119322=>'ON', +119323=>'ON', +119324=>'ON', +119325=>'ON', +119326=>'ON', +119327=>'ON', +119328=>'ON', +119329=>'ON', +119330=>'ON', +119331=>'ON', +119332=>'ON', +119333=>'ON', +119334=>'ON', +119335=>'ON', +119336=>'ON', +119337=>'ON', +119338=>'ON', +119339=>'ON', +119340=>'ON', +119341=>'ON', +119342=>'ON', +119343=>'ON', +119344=>'ON', +119345=>'ON', +119346=>'ON', +119347=>'ON', +119348=>'ON', +119349=>'ON', +119350=>'ON', +119351=>'ON', +119352=>'ON', +119353=>'ON', +119354=>'ON', +119355=>'ON', +119356=>'ON', +119357=>'ON', +119358=>'ON', +119359=>'ON', +119360=>'ON', +119361=>'ON', +119362=>'NSM', +119363=>'NSM', +119364=>'NSM', +119365=>'ON', +119552=>'ON', +119553=>'ON', +119554=>'ON', +119555=>'ON', +119556=>'ON', +119557=>'ON', +119558=>'ON', +119559=>'ON', +119560=>'ON', +119561=>'ON', +119562=>'ON', +119563=>'ON', +119564=>'ON', +119565=>'ON', +119566=>'ON', +119567=>'ON', +119568=>'ON', +119569=>'ON', +119570=>'ON', +119571=>'ON', +119572=>'ON', +119573=>'ON', +119574=>'ON', +119575=>'ON', +119576=>'ON', +119577=>'ON', +119578=>'ON', +119579=>'ON', +119580=>'ON', +119581=>'ON', +119582=>'ON', +119583=>'ON', +119584=>'ON', +119585=>'ON', +119586=>'ON', +119587=>'ON', +119588=>'ON', +119589=>'ON', +119590=>'ON', +119591=>'ON', +119592=>'ON', +119593=>'ON', +119594=>'ON', +119595=>'ON', +119596=>'ON', +119597=>'ON', +119598=>'ON', +119599=>'ON', +119600=>'ON', +119601=>'ON', +119602=>'ON', +119603=>'ON', +119604=>'ON', +119605=>'ON', +119606=>'ON', +119607=>'ON', +119608=>'ON', +119609=>'ON', +119610=>'ON', +119611=>'ON', +119612=>'ON', +119613=>'ON', +119614=>'ON', +119615=>'ON', +119616=>'ON', +119617=>'ON', +119618=>'ON', +119619=>'ON', +119620=>'ON', +119621=>'ON', +119622=>'ON', +119623=>'ON', +119624=>'ON', +119625=>'ON', +119626=>'ON', +119627=>'ON', +119628=>'ON', +119629=>'ON', +119630=>'ON', +119631=>'ON', +119632=>'ON', +119633=>'ON', +119634=>'ON', +119635=>'ON', +119636=>'ON', +119637=>'ON', +119638=>'ON', +119648=>'L', +119649=>'L', +119650=>'L', +119651=>'L', +119652=>'L', +119653=>'L', +119654=>'L', +119655=>'L', +119656=>'L', +119657=>'L', +119658=>'L', +119659=>'L', +119660=>'L', +119661=>'L', +119662=>'L', +119663=>'L', +119664=>'L', +119665=>'L', +119808=>'L', +119809=>'L', +119810=>'L', +119811=>'L', +119812=>'L', +119813=>'L', +119814=>'L', +119815=>'L', +119816=>'L', +119817=>'L', +119818=>'L', +119819=>'L', +119820=>'L', +119821=>'L', +119822=>'L', +119823=>'L', +119824=>'L', +119825=>'L', +119826=>'L', +119827=>'L', +119828=>'L', +119829=>'L', +119830=>'L', +119831=>'L', +119832=>'L', +119833=>'L', +119834=>'L', +119835=>'L', +119836=>'L', +119837=>'L', +119838=>'L', +119839=>'L', +119840=>'L', +119841=>'L', +119842=>'L', +119843=>'L', +119844=>'L', +119845=>'L', +119846=>'L', +119847=>'L', +119848=>'L', +119849=>'L', +119850=>'L', +119851=>'L', +119852=>'L', +119853=>'L', +119854=>'L', +119855=>'L', +119856=>'L', +119857=>'L', +119858=>'L', +119859=>'L', +119860=>'L', +119861=>'L', +119862=>'L', +119863=>'L', +119864=>'L', +119865=>'L', +119866=>'L', +119867=>'L', +119868=>'L', +119869=>'L', +119870=>'L', +119871=>'L', +119872=>'L', +119873=>'L', +119874=>'L', +119875=>'L', +119876=>'L', +119877=>'L', +119878=>'L', +119879=>'L', +119880=>'L', +119881=>'L', +119882=>'L', +119883=>'L', +119884=>'L', +119885=>'L', +119886=>'L', +119887=>'L', +119888=>'L', +119889=>'L', +119890=>'L', +119891=>'L', +119892=>'L', +119894=>'L', +119895=>'L', +119896=>'L', +119897=>'L', +119898=>'L', +119899=>'L', +119900=>'L', +119901=>'L', +119902=>'L', +119903=>'L', +119904=>'L', +119905=>'L', +119906=>'L', +119907=>'L', +119908=>'L', +119909=>'L', +119910=>'L', +119911=>'L', +119912=>'L', +119913=>'L', +119914=>'L', +119915=>'L', +119916=>'L', +119917=>'L', +119918=>'L', +119919=>'L', +119920=>'L', +119921=>'L', +119922=>'L', +119923=>'L', +119924=>'L', +119925=>'L', +119926=>'L', +119927=>'L', +119928=>'L', +119929=>'L', +119930=>'L', +119931=>'L', +119932=>'L', +119933=>'L', +119934=>'L', +119935=>'L', +119936=>'L', +119937=>'L', +119938=>'L', +119939=>'L', +119940=>'L', +119941=>'L', +119942=>'L', +119943=>'L', +119944=>'L', +119945=>'L', +119946=>'L', +119947=>'L', +119948=>'L', +119949=>'L', +119950=>'L', +119951=>'L', +119952=>'L', +119953=>'L', +119954=>'L', +119955=>'L', +119956=>'L', +119957=>'L', +119958=>'L', +119959=>'L', +119960=>'L', +119961=>'L', +119962=>'L', +119963=>'L', +119964=>'L', +119966=>'L', +119967=>'L', +119970=>'L', +119973=>'L', +119974=>'L', +119977=>'L', +119978=>'L', +119979=>'L', +119980=>'L', +119982=>'L', +119983=>'L', +119984=>'L', +119985=>'L', +119986=>'L', +119987=>'L', +119988=>'L', +119989=>'L', +119990=>'L', +119991=>'L', +119992=>'L', +119993=>'L', +119995=>'L', +119997=>'L', +119998=>'L', +119999=>'L', +120000=>'L', +120001=>'L', +120002=>'L', +120003=>'L', +120005=>'L', +120006=>'L', +120007=>'L', +120008=>'L', +120009=>'L', +120010=>'L', +120011=>'L', +120012=>'L', +120013=>'L', +120014=>'L', +120015=>'L', +120016=>'L', +120017=>'L', +120018=>'L', +120019=>'L', +120020=>'L', +120021=>'L', +120022=>'L', +120023=>'L', +120024=>'L', +120025=>'L', +120026=>'L', +120027=>'L', +120028=>'L', +120029=>'L', +120030=>'L', +120031=>'L', +120032=>'L', +120033=>'L', +120034=>'L', +120035=>'L', +120036=>'L', +120037=>'L', +120038=>'L', +120039=>'L', +120040=>'L', +120041=>'L', +120042=>'L', +120043=>'L', +120044=>'L', +120045=>'L', +120046=>'L', +120047=>'L', +120048=>'L', +120049=>'L', +120050=>'L', +120051=>'L', +120052=>'L', +120053=>'L', +120054=>'L', +120055=>'L', +120056=>'L', +120057=>'L', +120058=>'L', +120059=>'L', +120060=>'L', +120061=>'L', +120062=>'L', +120063=>'L', +120064=>'L', +120065=>'L', +120066=>'L', +120067=>'L', +120068=>'L', +120069=>'L', +120071=>'L', +120072=>'L', +120073=>'L', +120074=>'L', +120077=>'L', +120078=>'L', +120079=>'L', +120080=>'L', +120081=>'L', +120082=>'L', +120083=>'L', +120084=>'L', +120086=>'L', +120087=>'L', +120088=>'L', +120089=>'L', +120090=>'L', +120091=>'L', +120092=>'L', +120094=>'L', +120095=>'L', +120096=>'L', +120097=>'L', +120098=>'L', +120099=>'L', +120100=>'L', +120101=>'L', +120102=>'L', +120103=>'L', +120104=>'L', +120105=>'L', +120106=>'L', +120107=>'L', +120108=>'L', +120109=>'L', +120110=>'L', +120111=>'L', +120112=>'L', +120113=>'L', +120114=>'L', +120115=>'L', +120116=>'L', +120117=>'L', +120118=>'L', +120119=>'L', +120120=>'L', +120121=>'L', +120123=>'L', +120124=>'L', +120125=>'L', +120126=>'L', +120128=>'L', +120129=>'L', +120130=>'L', +120131=>'L', +120132=>'L', +120134=>'L', +120138=>'L', +120139=>'L', +120140=>'L', +120141=>'L', +120142=>'L', +120143=>'L', +120144=>'L', +120146=>'L', +120147=>'L', +120148=>'L', +120149=>'L', +120150=>'L', +120151=>'L', +120152=>'L', +120153=>'L', +120154=>'L', +120155=>'L', +120156=>'L', +120157=>'L', +120158=>'L', +120159=>'L', +120160=>'L', +120161=>'L', +120162=>'L', +120163=>'L', +120164=>'L', +120165=>'L', +120166=>'L', +120167=>'L', +120168=>'L', +120169=>'L', +120170=>'L', +120171=>'L', +120172=>'L', +120173=>'L', +120174=>'L', +120175=>'L', +120176=>'L', +120177=>'L', +120178=>'L', +120179=>'L', +120180=>'L', +120181=>'L', +120182=>'L', +120183=>'L', +120184=>'L', +120185=>'L', +120186=>'L', +120187=>'L', +120188=>'L', +120189=>'L', +120190=>'L', +120191=>'L', +120192=>'L', +120193=>'L', +120194=>'L', +120195=>'L', +120196=>'L', +120197=>'L', +120198=>'L', +120199=>'L', +120200=>'L', +120201=>'L', +120202=>'L', +120203=>'L', +120204=>'L', +120205=>'L', +120206=>'L', +120207=>'L', +120208=>'L', +120209=>'L', +120210=>'L', +120211=>'L', +120212=>'L', +120213=>'L', +120214=>'L', +120215=>'L', +120216=>'L', +120217=>'L', +120218=>'L', +120219=>'L', +120220=>'L', +120221=>'L', +120222=>'L', +120223=>'L', +120224=>'L', +120225=>'L', +120226=>'L', +120227=>'L', +120228=>'L', +120229=>'L', +120230=>'L', +120231=>'L', +120232=>'L', +120233=>'L', +120234=>'L', +120235=>'L', +120236=>'L', +120237=>'L', +120238=>'L', +120239=>'L', +120240=>'L', +120241=>'L', +120242=>'L', +120243=>'L', +120244=>'L', +120245=>'L', +120246=>'L', +120247=>'L', +120248=>'L', +120249=>'L', +120250=>'L', +120251=>'L', +120252=>'L', +120253=>'L', +120254=>'L', +120255=>'L', +120256=>'L', +120257=>'L', +120258=>'L', +120259=>'L', +120260=>'L', +120261=>'L', +120262=>'L', +120263=>'L', +120264=>'L', +120265=>'L', +120266=>'L', +120267=>'L', +120268=>'L', +120269=>'L', +120270=>'L', +120271=>'L', +120272=>'L', +120273=>'L', +120274=>'L', +120275=>'L', +120276=>'L', +120277=>'L', +120278=>'L', +120279=>'L', +120280=>'L', +120281=>'L', +120282=>'L', +120283=>'L', +120284=>'L', +120285=>'L', +120286=>'L', +120287=>'L', +120288=>'L', +120289=>'L', +120290=>'L', +120291=>'L', +120292=>'L', +120293=>'L', +120294=>'L', +120295=>'L', +120296=>'L', +120297=>'L', +120298=>'L', +120299=>'L', +120300=>'L', +120301=>'L', +120302=>'L', +120303=>'L', +120304=>'L', +120305=>'L', +120306=>'L', +120307=>'L', +120308=>'L', +120309=>'L', +120310=>'L', +120311=>'L', +120312=>'L', +120313=>'L', +120314=>'L', +120315=>'L', +120316=>'L', +120317=>'L', +120318=>'L', +120319=>'L', +120320=>'L', +120321=>'L', +120322=>'L', +120323=>'L', +120324=>'L', +120325=>'L', +120326=>'L', +120327=>'L', +120328=>'L', +120329=>'L', +120330=>'L', +120331=>'L', +120332=>'L', +120333=>'L', +120334=>'L', +120335=>'L', +120336=>'L', +120337=>'L', +120338=>'L', +120339=>'L', +120340=>'L', +120341=>'L', +120342=>'L', +120343=>'L', +120344=>'L', +120345=>'L', +120346=>'L', +120347=>'L', +120348=>'L', +120349=>'L', +120350=>'L', +120351=>'L', +120352=>'L', +120353=>'L', +120354=>'L', +120355=>'L', +120356=>'L', +120357=>'L', +120358=>'L', +120359=>'L', +120360=>'L', +120361=>'L', +120362=>'L', +120363=>'L', +120364=>'L', +120365=>'L', +120366=>'L', +120367=>'L', +120368=>'L', +120369=>'L', +120370=>'L', +120371=>'L', +120372=>'L', +120373=>'L', +120374=>'L', +120375=>'L', +120376=>'L', +120377=>'L', +120378=>'L', +120379=>'L', +120380=>'L', +120381=>'L', +120382=>'L', +120383=>'L', +120384=>'L', +120385=>'L', +120386=>'L', +120387=>'L', +120388=>'L', +120389=>'L', +120390=>'L', +120391=>'L', +120392=>'L', +120393=>'L', +120394=>'L', +120395=>'L', +120396=>'L', +120397=>'L', +120398=>'L', +120399=>'L', +120400=>'L', +120401=>'L', +120402=>'L', +120403=>'L', +120404=>'L', +120405=>'L', +120406=>'L', +120407=>'L', +120408=>'L', +120409=>'L', +120410=>'L', +120411=>'L', +120412=>'L', +120413=>'L', +120414=>'L', +120415=>'L', +120416=>'L', +120417=>'L', +120418=>'L', +120419=>'L', +120420=>'L', +120421=>'L', +120422=>'L', +120423=>'L', +120424=>'L', +120425=>'L', +120426=>'L', +120427=>'L', +120428=>'L', +120429=>'L', +120430=>'L', +120431=>'L', +120432=>'L', +120433=>'L', +120434=>'L', +120435=>'L', +120436=>'L', +120437=>'L', +120438=>'L', +120439=>'L', +120440=>'L', +120441=>'L', +120442=>'L', +120443=>'L', +120444=>'L', +120445=>'L', +120446=>'L', +120447=>'L', +120448=>'L', +120449=>'L', +120450=>'L', +120451=>'L', +120452=>'L', +120453=>'L', +120454=>'L', +120455=>'L', +120456=>'L', +120457=>'L', +120458=>'L', +120459=>'L', +120460=>'L', +120461=>'L', +120462=>'L', +120463=>'L', +120464=>'L', +120465=>'L', +120466=>'L', +120467=>'L', +120468=>'L', +120469=>'L', +120470=>'L', +120471=>'L', +120472=>'L', +120473=>'L', +120474=>'L', +120475=>'L', +120476=>'L', +120477=>'L', +120478=>'L', +120479=>'L', +120480=>'L', +120481=>'L', +120482=>'L', +120483=>'L', +120484=>'L', +120485=>'L', +120488=>'L', +120489=>'L', +120490=>'L', +120491=>'L', +120492=>'L', +120493=>'L', +120494=>'L', +120495=>'L', +120496=>'L', +120497=>'L', +120498=>'L', +120499=>'L', +120500=>'L', +120501=>'L', +120502=>'L', +120503=>'L', +120504=>'L', +120505=>'L', +120506=>'L', +120507=>'L', +120508=>'L', +120509=>'L', +120510=>'L', +120511=>'L', +120512=>'L', +120513=>'L', +120514=>'L', +120515=>'L', +120516=>'L', +120517=>'L', +120518=>'L', +120519=>'L', +120520=>'L', +120521=>'L', +120522=>'L', +120523=>'L', +120524=>'L', +120525=>'L', +120526=>'L', +120527=>'L', +120528=>'L', +120529=>'L', +120530=>'L', +120531=>'L', +120532=>'L', +120533=>'L', +120534=>'L', +120535=>'L', +120536=>'L', +120537=>'L', +120538=>'L', +120539=>'L', +120540=>'L', +120541=>'L', +120542=>'L', +120543=>'L', +120544=>'L', +120545=>'L', +120546=>'L', +120547=>'L', +120548=>'L', +120549=>'L', +120550=>'L', +120551=>'L', +120552=>'L', +120553=>'L', +120554=>'L', +120555=>'L', +120556=>'L', +120557=>'L', +120558=>'L', +120559=>'L', +120560=>'L', +120561=>'L', +120562=>'L', +120563=>'L', +120564=>'L', +120565=>'L', +120566=>'L', +120567=>'L', +120568=>'L', +120569=>'L', +120570=>'L', +120571=>'L', +120572=>'L', +120573=>'L', +120574=>'L', +120575=>'L', +120576=>'L', +120577=>'L', +120578=>'L', +120579=>'L', +120580=>'L', +120581=>'L', +120582=>'L', +120583=>'L', +120584=>'L', +120585=>'L', +120586=>'L', +120587=>'L', +120588=>'L', +120589=>'L', +120590=>'L', +120591=>'L', +120592=>'L', +120593=>'L', +120594=>'L', +120595=>'L', +120596=>'L', +120597=>'L', +120598=>'L', +120599=>'L', +120600=>'L', +120601=>'L', +120602=>'L', +120603=>'L', +120604=>'L', +120605=>'L', +120606=>'L', +120607=>'L', +120608=>'L', +120609=>'L', +120610=>'L', +120611=>'L', +120612=>'L', +120613=>'L', +120614=>'L', +120615=>'L', +120616=>'L', +120617=>'L', +120618=>'L', +120619=>'L', +120620=>'L', +120621=>'L', +120622=>'L', +120623=>'L', +120624=>'L', +120625=>'L', +120626=>'L', +120627=>'L', +120628=>'L', +120629=>'L', +120630=>'L', +120631=>'L', +120632=>'L', +120633=>'L', +120634=>'L', +120635=>'L', +120636=>'L', +120637=>'L', +120638=>'L', +120639=>'L', +120640=>'L', +120641=>'L', +120642=>'L', +120643=>'L', +120644=>'L', +120645=>'L', +120646=>'L', +120647=>'L', +120648=>'L', +120649=>'L', +120650=>'L', +120651=>'L', +120652=>'L', +120653=>'L', +120654=>'L', +120655=>'L', +120656=>'L', +120657=>'L', +120658=>'L', +120659=>'L', +120660=>'L', +120661=>'L', +120662=>'L', +120663=>'L', +120664=>'L', +120665=>'L', +120666=>'L', +120667=>'L', +120668=>'L', +120669=>'L', +120670=>'L', +120671=>'L', +120672=>'L', +120673=>'L', +120674=>'L', +120675=>'L', +120676=>'L', +120677=>'L', +120678=>'L', +120679=>'L', +120680=>'L', +120681=>'L', +120682=>'L', +120683=>'L', +120684=>'L', +120685=>'L', +120686=>'L', +120687=>'L', +120688=>'L', +120689=>'L', +120690=>'L', +120691=>'L', +120692=>'L', +120693=>'L', +120694=>'L', +120695=>'L', +120696=>'L', +120697=>'L', +120698=>'L', +120699=>'L', +120700=>'L', +120701=>'L', +120702=>'L', +120703=>'L', +120704=>'L', +120705=>'L', +120706=>'L', +120707=>'L', +120708=>'L', +120709=>'L', +120710=>'L', +120711=>'L', +120712=>'L', +120713=>'L', +120714=>'L', +120715=>'L', +120716=>'L', +120717=>'L', +120718=>'L', +120719=>'L', +120720=>'L', +120721=>'L', +120722=>'L', +120723=>'L', +120724=>'L', +120725=>'L', +120726=>'L', +120727=>'L', +120728=>'L', +120729=>'L', +120730=>'L', +120731=>'L', +120732=>'L', +120733=>'L', +120734=>'L', +120735=>'L', +120736=>'L', +120737=>'L', +120738=>'L', +120739=>'L', +120740=>'L', +120741=>'L', +120742=>'L', +120743=>'L', +120744=>'L', +120745=>'L', +120746=>'L', +120747=>'L', +120748=>'L', +120749=>'L', +120750=>'L', +120751=>'L', +120752=>'L', +120753=>'L', +120754=>'L', +120755=>'L', +120756=>'L', +120757=>'L', +120758=>'L', +120759=>'L', +120760=>'L', +120761=>'L', +120762=>'L', +120763=>'L', +120764=>'L', +120765=>'L', +120766=>'L', +120767=>'L', +120768=>'L', +120769=>'L', +120770=>'L', +120771=>'L', +120772=>'L', +120773=>'L', +120774=>'L', +120775=>'L', +120776=>'L', +120777=>'L', +120778=>'L', +120779=>'L', +120782=>'EN', +120783=>'EN', +120784=>'EN', +120785=>'EN', +120786=>'EN', +120787=>'EN', +120788=>'EN', +120789=>'EN', +120790=>'EN', +120791=>'EN', +120792=>'EN', +120793=>'EN', +120794=>'EN', +120795=>'EN', +120796=>'EN', +120797=>'EN', +120798=>'EN', +120799=>'EN', +120800=>'EN', +120801=>'EN', +120802=>'EN', +120803=>'EN', +120804=>'EN', +120805=>'EN', +120806=>'EN', +120807=>'EN', +120808=>'EN', +120809=>'EN', +120810=>'EN', +120811=>'EN', +120812=>'EN', +120813=>'EN', +120814=>'EN', +120815=>'EN', +120816=>'EN', +120817=>'EN', +120818=>'EN', +120819=>'EN', +120820=>'EN', +120821=>'EN', +120822=>'EN', +120823=>'EN', +120824=>'EN', +120825=>'EN', +120826=>'EN', +120827=>'EN', +120828=>'EN', +120829=>'EN', +120830=>'EN', +120831=>'EN', +131072=>'L', +173782=>'L', +194560=>'L', +194561=>'L', +194562=>'L', +194563=>'L', +194564=>'L', +194565=>'L', +194566=>'L', +194567=>'L', +194568=>'L', +194569=>'L', +194570=>'L', +194571=>'L', +194572=>'L', +194573=>'L', +194574=>'L', +194575=>'L', +194576=>'L', +194577=>'L', +194578=>'L', +194579=>'L', +194580=>'L', +194581=>'L', +194582=>'L', +194583=>'L', +194584=>'L', +194585=>'L', +194586=>'L', +194587=>'L', +194588=>'L', +194589=>'L', +194590=>'L', +194591=>'L', +194592=>'L', +194593=>'L', +194594=>'L', +194595=>'L', +194596=>'L', +194597=>'L', +194598=>'L', +194599=>'L', +194600=>'L', +194601=>'L', +194602=>'L', +194603=>'L', +194604=>'L', +194605=>'L', +194606=>'L', +194607=>'L', +194608=>'L', +194609=>'L', +194610=>'L', +194611=>'L', +194612=>'L', +194613=>'L', +194614=>'L', +194615=>'L', +194616=>'L', +194617=>'L', +194618=>'L', +194619=>'L', +194620=>'L', +194621=>'L', +194622=>'L', +194623=>'L', +194624=>'L', +194625=>'L', +194626=>'L', +194627=>'L', +194628=>'L', +194629=>'L', +194630=>'L', +194631=>'L', +194632=>'L', +194633=>'L', +194634=>'L', +194635=>'L', +194636=>'L', +194637=>'L', +194638=>'L', +194639=>'L', +194640=>'L', +194641=>'L', +194642=>'L', +194643=>'L', +194644=>'L', +194645=>'L', +194646=>'L', +194647=>'L', +194648=>'L', +194649=>'L', +194650=>'L', +194651=>'L', +194652=>'L', +194653=>'L', +194654=>'L', +194655=>'L', +194656=>'L', +194657=>'L', +194658=>'L', +194659=>'L', +194660=>'L', +194661=>'L', +194662=>'L', +194663=>'L', +194664=>'L', +194665=>'L', +194666=>'L', +194667=>'L', +194668=>'L', +194669=>'L', +194670=>'L', +194671=>'L', +194672=>'L', +194673=>'L', +194674=>'L', +194675=>'L', +194676=>'L', +194677=>'L', +194678=>'L', +194679=>'L', +194680=>'L', +194681=>'L', +194682=>'L', +194683=>'L', +194684=>'L', +194685=>'L', +194686=>'L', +194687=>'L', +194688=>'L', +194689=>'L', +194690=>'L', +194691=>'L', +194692=>'L', +194693=>'L', +194694=>'L', +194695=>'L', +194696=>'L', +194697=>'L', +194698=>'L', +194699=>'L', +194700=>'L', +194701=>'L', +194702=>'L', +194703=>'L', +194704=>'L', +194705=>'L', +194706=>'L', +194707=>'L', +194708=>'L', +194709=>'L', +194710=>'L', +194711=>'L', +194712=>'L', +194713=>'L', +194714=>'L', +194715=>'L', +194716=>'L', +194717=>'L', +194718=>'L', +194719=>'L', +194720=>'L', +194721=>'L', +194722=>'L', +194723=>'L', +194724=>'L', +194725=>'L', +194726=>'L', +194727=>'L', +194728=>'L', +194729=>'L', +194730=>'L', +194731=>'L', +194732=>'L', +194733=>'L', +194734=>'L', +194735=>'L', +194736=>'L', +194737=>'L', +194738=>'L', +194739=>'L', +194740=>'L', +194741=>'L', +194742=>'L', +194743=>'L', +194744=>'L', +194745=>'L', +194746=>'L', +194747=>'L', +194748=>'L', +194749=>'L', +194750=>'L', +194751=>'L', +194752=>'L', +194753=>'L', +194754=>'L', +194755=>'L', +194756=>'L', +194757=>'L', +194758=>'L', +194759=>'L', +194760=>'L', +194761=>'L', +194762=>'L', +194763=>'L', +194764=>'L', +194765=>'L', +194766=>'L', +194767=>'L', +194768=>'L', +194769=>'L', +194770=>'L', +194771=>'L', +194772=>'L', +194773=>'L', +194774=>'L', +194775=>'L', +194776=>'L', +194777=>'L', +194778=>'L', +194779=>'L', +194780=>'L', +194781=>'L', +194782=>'L', +194783=>'L', +194784=>'L', +194785=>'L', +194786=>'L', +194787=>'L', +194788=>'L', +194789=>'L', +194790=>'L', +194791=>'L', +194792=>'L', +194793=>'L', +194794=>'L', +194795=>'L', +194796=>'L', +194797=>'L', +194798=>'L', +194799=>'L', +194800=>'L', +194801=>'L', +194802=>'L', +194803=>'L', +194804=>'L', +194805=>'L', +194806=>'L', +194807=>'L', +194808=>'L', +194809=>'L', +194810=>'L', +194811=>'L', +194812=>'L', +194813=>'L', +194814=>'L', +194815=>'L', +194816=>'L', +194817=>'L', +194818=>'L', +194819=>'L', +194820=>'L', +194821=>'L', +194822=>'L', +194823=>'L', +194824=>'L', +194825=>'L', +194826=>'L', +194827=>'L', +194828=>'L', +194829=>'L', +194830=>'L', +194831=>'L', +194832=>'L', +194833=>'L', +194834=>'L', +194835=>'L', +194836=>'L', +194837=>'L', +194838=>'L', +194839=>'L', +194840=>'L', +194841=>'L', +194842=>'L', +194843=>'L', +194844=>'L', +194845=>'L', +194846=>'L', +194847=>'L', +194848=>'L', +194849=>'L', +194850=>'L', +194851=>'L', +194852=>'L', +194853=>'L', +194854=>'L', +194855=>'L', +194856=>'L', +194857=>'L', +194858=>'L', +194859=>'L', +194860=>'L', +194861=>'L', +194862=>'L', +194863=>'L', +194864=>'L', +194865=>'L', +194866=>'L', +194867=>'L', +194868=>'L', +194869=>'L', +194870=>'L', +194871=>'L', +194872=>'L', +194873=>'L', +194874=>'L', +194875=>'L', +194876=>'L', +194877=>'L', +194878=>'L', +194879=>'L', +194880=>'L', +194881=>'L', +194882=>'L', +194883=>'L', +194884=>'L', +194885=>'L', +194886=>'L', +194887=>'L', +194888=>'L', +194889=>'L', +194890=>'L', +194891=>'L', +194892=>'L', +194893=>'L', +194894=>'L', +194895=>'L', +194896=>'L', +194897=>'L', +194898=>'L', +194899=>'L', +194900=>'L', +194901=>'L', +194902=>'L', +194903=>'L', +194904=>'L', +194905=>'L', +194906=>'L', +194907=>'L', +194908=>'L', +194909=>'L', +194910=>'L', +194911=>'L', +194912=>'L', +194913=>'L', +194914=>'L', +194915=>'L', +194916=>'L', +194917=>'L', +194918=>'L', +194919=>'L', +194920=>'L', +194921=>'L', +194922=>'L', +194923=>'L', +194924=>'L', +194925=>'L', +194926=>'L', +194927=>'L', +194928=>'L', +194929=>'L', +194930=>'L', +194931=>'L', +194932=>'L', +194933=>'L', +194934=>'L', +194935=>'L', +194936=>'L', +194937=>'L', +194938=>'L', +194939=>'L', +194940=>'L', +194941=>'L', +194942=>'L', +194943=>'L', +194944=>'L', +194945=>'L', +194946=>'L', +194947=>'L', +194948=>'L', +194949=>'L', +194950=>'L', +194951=>'L', +194952=>'L', +194953=>'L', +194954=>'L', +194955=>'L', +194956=>'L', +194957=>'L', +194958=>'L', +194959=>'L', +194960=>'L', +194961=>'L', +194962=>'L', +194963=>'L', +194964=>'L', +194965=>'L', +194966=>'L', +194967=>'L', +194968=>'L', +194969=>'L', +194970=>'L', +194971=>'L', +194972=>'L', +194973=>'L', +194974=>'L', +194975=>'L', +194976=>'L', +194977=>'L', +194978=>'L', +194979=>'L', +194980=>'L', +194981=>'L', +194982=>'L', +194983=>'L', +194984=>'L', +194985=>'L', +194986=>'L', +194987=>'L', +194988=>'L', +194989=>'L', +194990=>'L', +194991=>'L', +194992=>'L', +194993=>'L', +194994=>'L', +194995=>'L', +194996=>'L', +194997=>'L', +194998=>'L', +194999=>'L', +195000=>'L', +195001=>'L', +195002=>'L', +195003=>'L', +195004=>'L', +195005=>'L', +195006=>'L', +195007=>'L', +195008=>'L', +195009=>'L', +195010=>'L', +195011=>'L', +195012=>'L', +195013=>'L', +195014=>'L', +195015=>'L', +195016=>'L', +195017=>'L', +195018=>'L', +195019=>'L', +195020=>'L', +195021=>'L', +195022=>'L', +195023=>'L', +195024=>'L', +195025=>'L', +195026=>'L', +195027=>'L', +195028=>'L', +195029=>'L', +195030=>'L', +195031=>'L', +195032=>'L', +195033=>'L', +195034=>'L', +195035=>'L', +195036=>'L', +195037=>'L', +195038=>'L', +195039=>'L', +195040=>'L', +195041=>'L', +195042=>'L', +195043=>'L', +195044=>'L', +195045=>'L', +195046=>'L', +195047=>'L', +195048=>'L', +195049=>'L', +195050=>'L', +195051=>'L', +195052=>'L', +195053=>'L', +195054=>'L', +195055=>'L', +195056=>'L', +195057=>'L', +195058=>'L', +195059=>'L', +195060=>'L', +195061=>'L', +195062=>'L', +195063=>'L', +195064=>'L', +195065=>'L', +195066=>'L', +195067=>'L', +195068=>'L', +195069=>'L', +195070=>'L', +195071=>'L', +195072=>'L', +195073=>'L', +195074=>'L', +195075=>'L', +195076=>'L', +195077=>'L', +195078=>'L', +195079=>'L', +195080=>'L', +195081=>'L', +195082=>'L', +195083=>'L', +195084=>'L', +195085=>'L', +195086=>'L', +195087=>'L', +195088=>'L', +195089=>'L', +195090=>'L', +195091=>'L', +195092=>'L', +195093=>'L', +195094=>'L', +195095=>'L', +195096=>'L', +195097=>'L', +195098=>'L', +195099=>'L', +195100=>'L', +195101=>'L', +917505=>'BN', +917536=>'BN', +917537=>'BN', +917538=>'BN', +917539=>'BN', +917540=>'BN', +917541=>'BN', +917542=>'BN', +917543=>'BN', +917544=>'BN', +917545=>'BN', +917546=>'BN', +917547=>'BN', +917548=>'BN', +917549=>'BN', +917550=>'BN', +917551=>'BN', +917552=>'BN', +917553=>'BN', +917554=>'BN', +917555=>'BN', +917556=>'BN', +917557=>'BN', +917558=>'BN', +917559=>'BN', +917560=>'BN', +917561=>'BN', +917562=>'BN', +917563=>'BN', +917564=>'BN', +917565=>'BN', +917566=>'BN', +917567=>'BN', +917568=>'BN', +917569=>'BN', +917570=>'BN', +917571=>'BN', +917572=>'BN', +917573=>'BN', +917574=>'BN', +917575=>'BN', +917576=>'BN', +917577=>'BN', +917578=>'BN', +917579=>'BN', +917580=>'BN', +917581=>'BN', +917582=>'BN', +917583=>'BN', +917584=>'BN', +917585=>'BN', +917586=>'BN', +917587=>'BN', +917588=>'BN', +917589=>'BN', +917590=>'BN', +917591=>'BN', +917592=>'BN', +917593=>'BN', +917594=>'BN', +917595=>'BN', +917596=>'BN', +917597=>'BN', +917598=>'BN', +917599=>'BN', +917600=>'BN', +917601=>'BN', +917602=>'BN', +917603=>'BN', +917604=>'BN', +917605=>'BN', +917606=>'BN', +917607=>'BN', +917608=>'BN', +917609=>'BN', +917610=>'BN', +917611=>'BN', +917612=>'BN', +917613=>'BN', +917614=>'BN', +917615=>'BN', +917616=>'BN', +917617=>'BN', +917618=>'BN', +917619=>'BN', +917620=>'BN', +917621=>'BN', +917622=>'BN', +917623=>'BN', +917624=>'BN', +917625=>'BN', +917626=>'BN', +917627=>'BN', +917628=>'BN', +917629=>'BN', +917630=>'BN', +917631=>'BN', +917760=>'NSM', +917761=>'NSM', +917762=>'NSM', +917763=>'NSM', +917764=>'NSM', +917765=>'NSM', +917766=>'NSM', +917767=>'NSM', +917768=>'NSM', +917769=>'NSM', +917770=>'NSM', +917771=>'NSM', +917772=>'NSM', +917773=>'NSM', +917774=>'NSM', +917775=>'NSM', +917776=>'NSM', +917777=>'NSM', +917778=>'NSM', +917779=>'NSM', +917780=>'NSM', +917781=>'NSM', +917782=>'NSM', +917783=>'NSM', +917784=>'NSM', +917785=>'NSM', +917786=>'NSM', +917787=>'NSM', +917788=>'NSM', +917789=>'NSM', +917790=>'NSM', +917791=>'NSM', +917792=>'NSM', +917793=>'NSM', +917794=>'NSM', +917795=>'NSM', +917796=>'NSM', +917797=>'NSM', +917798=>'NSM', +917799=>'NSM', +917800=>'NSM', +917801=>'NSM', +917802=>'NSM', +917803=>'NSM', +917804=>'NSM', +917805=>'NSM', +917806=>'NSM', +917807=>'NSM', +917808=>'NSM', +917809=>'NSM', +917810=>'NSM', +917811=>'NSM', +917812=>'NSM', +917813=>'NSM', +917814=>'NSM', +917815=>'NSM', +917816=>'NSM', +917817=>'NSM', +917818=>'NSM', +917819=>'NSM', +917820=>'NSM', +917821=>'NSM', +917822=>'NSM', +917823=>'NSM', +917824=>'NSM', +917825=>'NSM', +917826=>'NSM', +917827=>'NSM', +917828=>'NSM', +917829=>'NSM', +917830=>'NSM', +917831=>'NSM', +917832=>'NSM', +917833=>'NSM', +917834=>'NSM', +917835=>'NSM', +917836=>'NSM', +917837=>'NSM', +917838=>'NSM', +917839=>'NSM', +917840=>'NSM', +917841=>'NSM', +917842=>'NSM', +917843=>'NSM', +917844=>'NSM', +917845=>'NSM', +917846=>'NSM', +917847=>'NSM', +917848=>'NSM', +917849=>'NSM', +917850=>'NSM', +917851=>'NSM', +917852=>'NSM', +917853=>'NSM', +917854=>'NSM', +917855=>'NSM', +917856=>'NSM', +917857=>'NSM', +917858=>'NSM', +917859=>'NSM', +917860=>'NSM', +917861=>'NSM', +917862=>'NSM', +917863=>'NSM', +917864=>'NSM', +917865=>'NSM', +917866=>'NSM', +917867=>'NSM', +917868=>'NSM', +917869=>'NSM', +917870=>'NSM', +917871=>'NSM', +917872=>'NSM', +917873=>'NSM', +917874=>'NSM', +917875=>'NSM', +917876=>'NSM', +917877=>'NSM', +917878=>'NSM', +917879=>'NSM', +917880=>'NSM', +917881=>'NSM', +917882=>'NSM', +917883=>'NSM', +917884=>'NSM', +917885=>'NSM', +917886=>'NSM', +917887=>'NSM', +917888=>'NSM', +917889=>'NSM', +917890=>'NSM', +917891=>'NSM', +917892=>'NSM', +917893=>'NSM', +917894=>'NSM', +917895=>'NSM', +917896=>'NSM', +917897=>'NSM', +917898=>'NSM', +917899=>'NSM', +917900=>'NSM', +917901=>'NSM', +917902=>'NSM', +917903=>'NSM', +917904=>'NSM', +917905=>'NSM', +917906=>'NSM', +917907=>'NSM', +917908=>'NSM', +917909=>'NSM', +917910=>'NSM', +917911=>'NSM', +917912=>'NSM', +917913=>'NSM', +917914=>'NSM', +917915=>'NSM', +917916=>'NSM', +917917=>'NSM', +917918=>'NSM', +917919=>'NSM', +917920=>'NSM', +917921=>'NSM', +917922=>'NSM', +917923=>'NSM', +917924=>'NSM', +917925=>'NSM', +917926=>'NSM', +917927=>'NSM', +917928=>'NSM', +917929=>'NSM', +917930=>'NSM', +917931=>'NSM', +917932=>'NSM', +917933=>'NSM', +917934=>'NSM', +917935=>'NSM', +917936=>'NSM', +917937=>'NSM', +917938=>'NSM', +917939=>'NSM', +917940=>'NSM', +917941=>'NSM', +917942=>'NSM', +917943=>'NSM', +917944=>'NSM', +917945=>'NSM', +917946=>'NSM', +917947=>'NSM', +917948=>'NSM', +917949=>'NSM', +917950=>'NSM', +917951=>'NSM', +917952=>'NSM', +917953=>'NSM', +917954=>'NSM', +917955=>'NSM', +917956=>'NSM', +917957=>'NSM', +917958=>'NSM', +917959=>'NSM', +917960=>'NSM', +917961=>'NSM', +917962=>'NSM', +917963=>'NSM', +917964=>'NSM', +917965=>'NSM', +917966=>'NSM', +917967=>'NSM', +917968=>'NSM', +917969=>'NSM', +917970=>'NSM', +917971=>'NSM', +917972=>'NSM', +917973=>'NSM', +917974=>'NSM', +917975=>'NSM', +917976=>'NSM', +917977=>'NSM', +917978=>'NSM', +917979=>'NSM', +917980=>'NSM', +917981=>'NSM', +917982=>'NSM', +917983=>'NSM', +917984=>'NSM', +917985=>'NSM', +917986=>'NSM', +917987=>'NSM', +917988=>'NSM', +917989=>'NSM', +917990=>'NSM', +917991=>'NSM', +917992=>'NSM', +917993=>'NSM', +917994=>'NSM', +917995=>'NSM', +917996=>'NSM', +917997=>'NSM', +917998=>'NSM', +917999=>'NSM', +983040=>'L', +1048573=>'L', +1048576=>'L', +1114109=>'L' +); + +/** + * Mirror unicode characters. + * For information on bidi mirroring, see UAX #9: Bidirectional Algorithm, + * at http://www.unicode.org/unicode/reports/tr9/ + */ +global $unicode_mirror; +$unicode_mirror = array ( +0x0028=>0x0029, +0x0029=>0x0028, +0x003C=>0x003E, +0x003E=>0x003C, +0x005B=>0x005D, +0x005D=>0x005B, +0x007B=>0x007D, +0x007D=>0x007B, +0x00AB=>0x00BB, +0x00BB=>0x00AB, +0x0F3A=>0x0F3B, +0x0F3B=>0x0F3A, +0x0F3C=>0x0F3D, +0x0F3D=>0x0F3C, +0x169B=>0x169C, +0x169C=>0x169B, +0x2018=>0x2019, +0x2019=>0x2018, +0x201C=>0x201D, +0x201D=>0x201C, +0x2039=>0x203A, +0x203A=>0x2039, +0x2045=>0x2046, +0x2046=>0x2045, +0x207D=>0x207E, +0x207E=>0x207D, +0x208D=>0x208E, +0x208E=>0x208D, +0x2208=>0x220B, +0x2209=>0x220C, +0x220A=>0x220D, +0x220B=>0x2208, +0x220C=>0x2209, +0x220D=>0x220A, +0x2215=>0x29F5, +0x223C=>0x223D, +0x223D=>0x223C, +0x2243=>0x22CD, +0x2252=>0x2253, +0x2253=>0x2252, +0x2254=>0x2255, +0x2255=>0x2254, +0x2264=>0x2265, +0x2265=>0x2264, +0x2266=>0x2267, +0x2267=>0x2266, +0x2268=>0x2269, +0x2269=>0x2268, +0x226A=>0x226B, +0x226B=>0x226A, +0x226E=>0x226F, +0x226F=>0x226E, +0x2270=>0x2271, +0x2271=>0x2270, +0x2272=>0x2273, +0x2273=>0x2272, +0x2274=>0x2275, +0x2275=>0x2274, +0x2276=>0x2277, +0x2277=>0x2276, +0x2278=>0x2279, +0x2279=>0x2278, +0x227A=>0x227B, +0x227B=>0x227A, +0x227C=>0x227D, +0x227D=>0x227C, +0x227E=>0x227F, +0x227F=>0x227E, +0x2280=>0x2281, +0x2281=>0x2280, +0x2282=>0x2283, +0x2283=>0x2282, +0x2284=>0x2285, +0x2285=>0x2284, +0x2286=>0x2287, +0x2287=>0x2286, +0x2288=>0x2289, +0x2289=>0x2288, +0x228A=>0x228B, +0x228B=>0x228A, +0x228F=>0x2290, +0x2290=>0x228F, +0x2291=>0x2292, +0x2292=>0x2291, +0x2298=>0x29B8, +0x22A2=>0x22A3, +0x22A3=>0x22A2, +0x22A6=>0x2ADE, +0x22A8=>0x2AE4, +0x22A9=>0x2AE3, +0x22AB=>0x2AE5, +0x22B0=>0x22B1, +0x22B1=>0x22B0, +0x22B2=>0x22B3, +0x22B3=>0x22B2, +0x22B4=>0x22B5, +0x22B5=>0x22B4, +0x22B6=>0x22B7, +0x22B7=>0x22B6, +0x22C9=>0x22CA, +0x22CA=>0x22C9, +0x22CB=>0x22CC, +0x22CC=>0x22CB, +0x22CD=>0x2243, +0x22D0=>0x22D1, +0x22D1=>0x22D0, +0x22D6=>0x22D7, +0x22D7=>0x22D6, +0x22D8=>0x22D9, +0x22D9=>0x22D8, +0x22DA=>0x22DB, +0x22DB=>0x22DA, +0x22DC=>0x22DD, +0x22DD=>0x22DC, +0x22DE=>0x22DF, +0x22DF=>0x22DE, +0x22E0=>0x22E1, +0x22E1=>0x22E0, +0x22E2=>0x22E3, +0x22E3=>0x22E2, +0x22E4=>0x22E5, +0x22E5=>0x22E4, +0x22E6=>0x22E7, +0x22E7=>0x22E6, +0x22E8=>0x22E9, +0x22E9=>0x22E8, +0x22EA=>0x22EB, +0x22EB=>0x22EA, +0x22EC=>0x22ED, +0x22ED=>0x22EC, +0x22F0=>0x22F1, +0x22F1=>0x22F0, +0x22F2=>0x22FA, +0x22F3=>0x22FB, +0x22F4=>0x22FC, +0x22F6=>0x22FD, +0x22F7=>0x22FE, +0x22FA=>0x22F2, +0x22FB=>0x22F3, +0x22FC=>0x22F4, +0x22FD=>0x22F6, +0x22FE=>0x22F7, +0x2308=>0x2309, +0x2309=>0x2308, +0x230A=>0x230B, +0x230B=>0x230A, +0x2329=>0x232A, +0x232A=>0x2329, +0x2768=>0x2769, +0x2769=>0x2768, +0x276A=>0x276B, +0x276B=>0x276A, +0x276C=>0x276D, +0x276D=>0x276C, +0x276E=>0x276F, +0x276F=>0x276E, +0x2770=>0x2771, +0x2771=>0x2770, +0x2772=>0x2773, +0x2773=>0x2772, +0x2774=>0x2775, +0x2775=>0x2774, +0x27C3=>0x27C4, +0x27C4=>0x27C3, +0x27C5=>0x27C6, +0x27C6=>0x27C5, +0x27D5=>0x27D6, +0x27D6=>0x27D5, +0x27DD=>0x27DE, +0x27DE=>0x27DD, +0x27E2=>0x27E3, +0x27E3=>0x27E2, +0x27E4=>0x27E5, +0x27E5=>0x27E4, +0x27E6=>0x27E7, +0x27E7=>0x27E6, +0x27E8=>0x27E9, +0x27E9=>0x27E8, +0x27EA=>0x27EB, +0x27EB=>0x27EA, +0x2983=>0x2984, +0x2984=>0x2983, +0x2985=>0x2986, +0x2986=>0x2985, +0x2987=>0x2988, +0x2988=>0x2987, +0x2989=>0x298A, +0x298A=>0x2989, +0x298B=>0x298C, +0x298C=>0x298B, +0x298D=>0x2990, +0x298E=>0x298F, +0x298F=>0x298E, +0x2990=>0x298D, +0x2991=>0x2992, +0x2992=>0x2991, +0x2993=>0x2994, +0x2994=>0x2993, +0x2995=>0x2996, +0x2996=>0x2995, +0x2997=>0x2998, +0x2998=>0x2997, +0x29B8=>0x2298, +0x29C0=>0x29C1, +0x29C1=>0x29C0, +0x29C4=>0x29C5, +0x29C5=>0x29C4, +0x29CF=>0x29D0, +0x29D0=>0x29CF, +0x29D1=>0x29D2, +0x29D2=>0x29D1, +0x29D4=>0x29D5, +0x29D5=>0x29D4, +0x29D8=>0x29D9, +0x29D9=>0x29D8, +0x29DA=>0x29DB, +0x29DB=>0x29DA, +0x29F5=>0x2215, +0x29F8=>0x29F9, +0x29F9=>0x29F8, +0x29FC=>0x29FD, +0x29FD=>0x29FC, +0x2A2B=>0x2A2C, +0x2A2C=>0x2A2B, +0x2A2D=>0x2A2E, +0x2A2E=>0x2A2D, +0x2A34=>0x2A35, +0x2A35=>0x2A34, +0x2A3C=>0x2A3D, +0x2A3D=>0x2A3C, +0x2A64=>0x2A65, +0x2A65=>0x2A64, +0x2A79=>0x2A7A, +0x2A7A=>0x2A79, +0x2A7D=>0x2A7E, +0x2A7E=>0x2A7D, +0x2A7F=>0x2A80, +0x2A80=>0x2A7F, +0x2A81=>0x2A82, +0x2A82=>0x2A81, +0x2A83=>0x2A84, +0x2A84=>0x2A83, +0x2A8B=>0x2A8C, +0x2A8C=>0x2A8B, +0x2A91=>0x2A92, +0x2A92=>0x2A91, +0x2A93=>0x2A94, +0x2A94=>0x2A93, +0x2A95=>0x2A96, +0x2A96=>0x2A95, +0x2A97=>0x2A98, +0x2A98=>0x2A97, +0x2A99=>0x2A9A, +0x2A9A=>0x2A99, +0x2A9B=>0x2A9C, +0x2A9C=>0x2A9B, +0x2AA1=>0x2AA2, +0x2AA2=>0x2AA1, +0x2AA6=>0x2AA7, +0x2AA7=>0x2AA6, +0x2AA8=>0x2AA9, +0x2AA9=>0x2AA8, +0x2AAA=>0x2AAB, +0x2AAB=>0x2AAA, +0x2AAC=>0x2AAD, +0x2AAD=>0x2AAC, +0x2AAF=>0x2AB0, +0x2AB0=>0x2AAF, +0x2AB3=>0x2AB4, +0x2AB4=>0x2AB3, +0x2ABB=>0x2ABC, +0x2ABC=>0x2ABB, +0x2ABD=>0x2ABE, +0x2ABE=>0x2ABD, +0x2ABF=>0x2AC0, +0x2AC0=>0x2ABF, +0x2AC1=>0x2AC2, +0x2AC2=>0x2AC1, +0x2AC3=>0x2AC4, +0x2AC4=>0x2AC3, +0x2AC5=>0x2AC6, +0x2AC6=>0x2AC5, +0x2ACD=>0x2ACE, +0x2ACE=>0x2ACD, +0x2ACF=>0x2AD0, +0x2AD0=>0x2ACF, +0x2AD1=>0x2AD2, +0x2AD2=>0x2AD1, +0x2AD3=>0x2AD4, +0x2AD4=>0x2AD3, +0x2AD5=>0x2AD6, +0x2AD6=>0x2AD5, +0x2ADE=>0x22A6, +0x2AE3=>0x22A9, +0x2AE4=>0x22A8, +0x2AE5=>0x22AB, +0x2AEC=>0x2AED, +0x2AED=>0x2AEC, +0x2AF7=>0x2AF8, +0x2AF8=>0x2AF7, +0x2AF9=>0x2AFA, +0x2AFA=>0x2AF9, +0x2E02=>0x2E03, +0x2E03=>0x2E02, +0x2E04=>0x2E05, +0x2E05=>0x2E04, +0x2E09=>0x2E0A, +0x2E0A=>0x2E09, +0x2E0C=>0x2E0D, +0x2E0D=>0x2E0C, +0x2E1C=>0x2E1D, +0x2E1D=>0x2E1C, +0x3008=>0x3009, +0x3009=>0x3008, +0x300A=>0x300B, +0x300B=>0x300A, +0x300C=>0x300D, +0x300D=>0x300C, +0x300E=>0x300F, +0x300F=>0x300E, +0x3010=>0x3011, +0x3011=>0x3010, +0x3014=>0x3015, +0x3015=>0x3014, +0x3016=>0x3017, +0x3017=>0x3016, +0x3018=>0x3019, +0x3019=>0x3018, +0x301A=>0x301B, +0x301B=>0x301A, +0x301D=>0x301E, +0x301E=>0x301D, +0xFE59=>0xFE5A, +0xFE5A=>0xFE59, +0xFE5B=>0xFE5C, +0xFE5C=>0xFE5B, +0xFE5D=>0xFE5E, +0xFE5E=>0xFE5D, +0xFE64=>0xFE65, +0xFE65=>0xFE64, +0xFF08=>0xFF09, +0xFF09=>0xFF08, +0xFF1C=>0xFF1E, +0xFF1E=>0xFF1C, +0xFF3B=>0xFF3D, +0xFF3D=>0xFF3B, +0xFF5B=>0xFF5D, +0xFF5D=>0xFF5B, +0xFF5F=>0xFF60, +0xFF60=>0xFF5F, +0xFF62=>0xFF63, +0xFF63=>0xFF62); + +/** + * Arabic shape subtitutions + * char code=>isolated, final, initial, medial + */ +global $unicode_arlet; +$unicode_arlet = array( +1569=>array(65152), +1570=>array(65153, 65154, 65153, 65154), +1571=>array(65155, 65156, 65155, 65156), +1572=>array(65157, 65158), +1573=>array(65159, 65160, 65159, 65160), +1574=>array(65161, 65162, 65163, 65164), +1575=>array(65165, 65166, 65165, 65166), +1576=>array(65167, 65168, 65169, 65170), +1577=>array(65171, 65172), +1578=>array(65173, 65174, 65175, 65176), +1579=>array(65177, 65178, 65179, 65180), +1580=>array(65181, 65182, 65183, 65184), +1581=>array(65185, 65186, 65187, 65188), +1582=>array(65189, 65190, 65191, 65192), +1583=>array(65193, 65194, 65193, 65194), +1584=>array(65195, 65196, 65195, 65196), +1585=>array(65197, 65198, 65197, 65198), +1586=>array(65199, 65200, 65199, 65200), +1587=>array(65201, 65202, 65203, 65204), +1588=>array(65205, 65206, 65207, 65208), +1589=>array(65209, 65210, 65211, 65212), +1590=>array(65213, 65214, 65215, 65216), +1591=>array(65217, 65218, 65219, 65220), +1592=>array(65221, 65222, 65223, 65224), +1593=>array(65225, 65226, 65227, 65228), +1594=>array(65229, 65230, 65231, 65232), +1601=>array(65233, 65234, 65235, 65236), +1602=>array(65237, 65238, 65239, 65240), +1603=>array(65241, 65242, 65243, 65244), +1604=>array(65245, 65246, 65247, 65248), +1605=>array(65249, 65250, 65251, 65252), +1606=>array(65253, 65254, 65255, 65256), +1607=>array(65257, 65258, 65259, 65260), +1608=>array(65261, 65262, 65261, 65262), +1609=>array(65263, 65264, 64488, 64489), +1610=>array(65265, 65266, 65267, 65268), +1649=>array(64336, 64337), +1655=>array(64477), +1657=>array(64358, 64359, 64360, 64361), +1658=>array(64350, 64351, 64352, 64353), +1659=>array(64338, 64339, 64340, 64341), +1662=>array(64342, 64343, 64344, 64345), +1663=>array(64354, 64355, 64356, 64357), +1664=>array(64346, 64347, 64348, 64349), +1667=>array(64374, 64375, 64376, 64377), +1668=>array(64370, 64371, 64372, 64373), +1670=>array(64378, 64379, 64380, 64381), +1671=>array(64382, 64383, 64384, 64385), +1672=>array(64392, 64393), +1676=>array(64388, 64389), +1677=>array(64386, 64387), +1678=>array(64390, 64391), +1681=>array(64396, 64397), +1688=>array(64394, 64395, 64394, 64395), +1700=>array(64362, 64363, 64364, 64365), +1702=>array(64366, 64367, 64368, 64369), +1705=>array(64398, 64399, 64400, 64401), +1709=>array(64467, 64468, 64469, 64470), +1711=>array(64402, 64403, 64404, 64405), +1713=>array(64410, 64411, 64412, 64413), +1715=>array(64406, 64407, 64408, 64409), +1722=>array(64414, 64415), +1723=>array(64416, 64417, 64418, 64419), +1726=>array(64426, 64427, 64428, 64429), +1728=>array(64420, 64421), +1729=>array(64422, 64423, 64424, 64425), +1733=>array(64480, 64481), +1734=>array(64473, 64474), +1735=>array(64471, 64472), +1736=>array(64475, 64476), +1737=>array(64482, 64483), +1739=>array(64478, 64479), +1740=>array(64508, 64509, 64510, 64511), +1744=>array(64484, 64485, 64486, 64487), +1746=>array(64430, 64431), +1747=>array(64432, 64433) +); + +/** + * Arabic laa letter + * char code=>isolated, final, initial, medial + */ +global $laa_array; +$laa_array = array ( +1570 =>array(65269, 65270, 65269, 65270), +1571 =>array(65271, 65272, 65271, 65272), +1573 =>array(65273, 65274, 65273, 65274), +1575 =>array(65275, 65276, 65275, 65276) +); + +/** + * Array of character substitutions for sequences of two diacritics symbols starting with SHADDA (0651 HEX, 1617 DEC). + * Combining characters that can occur with Shadda (U0651) are placed in UE586-UE594. + * Putting the combining mark and shadda in the same glyph allows us to avoid the two marks overlapping each other in an illegible manner. + * second NSM char code=>substitution char + */ +global $diacritics; +$diacritics = array ( +1612=>64606, # Shadda + Dammatan +1613=>64607, # Shadda + Kasratan +1614=>64608, # Shadda + Fatha +1615=>64609, # Shadda + Damma +1616=>64610 # Shadda + Kasra +); + +/** + * Array of character substitutions from UTF-8 unicode to latin1 + */ +global $utf8tolatin; +$utf8tolatin = array ( +8364=>128, # Euro1 +338=>140, # OE +352=>138, # Scaron +376=>159, # Ydieresis +381=>142, # Zcaron2 +8226=>149, # bullet3 +710=>136, # circumflex +8224=>134, # dagger +8225=>135, # daggerdbl +8230=>133, # ellipsis +8212=>151, # emdash +8211=>150, # endash +402=>131, # florin +8249=>139, # guilsinglleft +8250=>155, # guilsinglright +339=>156, # oe +8240=>137, # perthousand +8222=>132, # quotedblbase +8220=>147, # quotedblleft +8221=>148, # quotedblright +8216=>145, # quoteleft +8217=>146, # quoteright +8218=>130, # quotesinglbase +353=>154, # scaron +732=>152, # tilde +8482=>153, # trademark +382=>158 # zcaron2 +); + +//============================================================+ +// END OF FILE +//============================================================+ +?> diff --git a/assets/html2pdf/examples/about.php b/assets/html2pdf/examples/about.php new file mode 100644 index 0000000..67d4346 --- /dev/null +++ b/assets/html2pdf/examples/about.php @@ -0,0 +1,40 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + + // get the HTML + ob_start(); + include(dirname('__FILE__').'/res/about.php'); + $content = ob_get_clean(); + + try + { + // init HTML2PDF + $html2pdf = new HTML2PDF('P', 'A4', 'fr', true, 'UTF-8', array(0, 0, 0, 0)); + + // display the full page + $html2pdf->pdf->SetDisplayMode('fullpage'); + + // convert + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + + // add the automatic index + $html2pdf->createIndex('Sommaire', 30, 12, false, true, 2); + + // send the PDF + $html2pdf->Output('about.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/bookmark.php b/assets/html2pdf/examples/bookmark.php new file mode 100644 index 0000000..2a5d99d --- /dev/null +++ b/assets/html2pdf/examples/bookmark.php @@ -0,0 +1,111 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + +ob_start(); +?> +<style type="text/css"> +<!-- + table.page_header {width: 100%; border: none; background-color: #DDDDFF; border-bottom: solid 1mm #AAAADD; padding: 2mm } + table.page_footer {width: 100%; border: none; background-color: #DDDDFF; border-top: solid 1mm #AAAADD; padding: 2mm} + h1 {color: #000033} + h2 {color: #000055} + h3 {color: #000077} + + div.niveau + { + padding-left: 5mm; + } +--> +</style> +<page backtop="14mm" backbottom="14mm" backleft="10mm" backright="10mm" style="font-size: 12pt"> + <page_header> + <table class="page_header"> + <tr> + <td style="width: 100%; text-align: left"> + Exemple d'utilisation des bookmarks + </td> + </tr> + </table> + </page_header> + <page_footer> + <table class="page_footer"> + <tr> + <td style="width: 100%; text-align: right"> + page [[page_cu]]/[[page_nb]] + </td> + </tr> + </table> + </page_footer> + <bookmark title="Sommaire" level="0" ></bookmark> +</page> +<page pageset="old"> + <bookmark title="Chapitre 1" level="0" ></bookmark><h1>Chapitre 1</h1> + <div class="niveau"> + Contenu du chapitre 1 + </div> +</page> +<page pageset="old"> + <bookmark title="Chapitre 2" level="0" ></bookmark><h1>Chapitre 2</h1> + <div class="niveau"> + intro au chapitre 2 + <bookmark title="Chapitre 2.1" level="1" ></bookmark><h2>Chapitre 2.1</h2> + <div class="niveau"> + Contenu du chapitre 2.1 + </div> + <bookmark title="Chapitre 2.2" level="1" ></bookmark><h2>Chapitre 2.2</h2> + <div class="niveau"> + Contenu du chapitre 2.2 + </div> + <bookmark title="Chapitre 2.3" level="1" ></bookmark><h2>Chapitre 2.3</h2> + <div class="niveau"> + Contenu du chapitre 2.3 + </div> + </div> +</page> +<page pageset="old"> + <bookmark title="Chapitre 3" level="0" ></bookmark><h1>Chapitre 3</h1> + <div class="niveau"> + intro au chapitre 3 + <bookmark title="Chapitre 3.1" level="1" ></bookmark><h2>Chapitre 3.1</h2> + <div class="niveau"> + Contenu du chapitre 3.1 + </div> + <bookmark title="Chapitre 3.2" level="1" ></bookmark><h2>Chapitre 3.2</h2> + <div class="niveau"> + intro au chapitre 3.2 + <bookmark title="Chapitre 3.2.1" level="2" ></bookmark><h3>Chapitre 3.2.1</h3> + <div class="niveau"> + Contenu du chapitre 3.2.1 + </div> + <bookmark title="Chapitre 3.2.2" level="2" ></bookmark><h3>Chapitre 3.2.2</h3> + <div class="niveau"> + Contenu du chapitre 3.2.2 + </div> + </div> + </div> +</page> +<?php + $content = ob_get_clean(); + + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr', true, 'UTF-8', 0); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->createIndex('Sommaire', 25, 12, false, true, 1); + $html2pdf->Output('bookmark.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/exemple00.php b/assets/html2pdf/examples/exemple00.php new file mode 100644 index 0000000..08b1e5f --- /dev/null +++ b/assets/html2pdf/examples/exemple00.php @@ -0,0 +1,32 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + + // get the HTML + ob_start(); + include(dirname(__FILE__).'/res/exemple00.php'); + $content = ob_get_clean(); + + // convert in PDF + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr'); +// $html2pdf->setModeDebug(); + $html2pdf->setDefaultFont('Arial'); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('exemple00.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/exemple01.php b/assets/html2pdf/examples/exemple01.php new file mode 100644 index 0000000..c165b0b --- /dev/null +++ b/assets/html2pdf/examples/exemple01.php @@ -0,0 +1,30 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + + // get the HTML + ob_start(); + include(dirname(__FILE__).'/res/exemple01.php'); + $content = ob_get_clean(); + + // convert in PDF + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr'); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('exemple01.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/exemple02.php b/assets/html2pdf/examples/exemple02.php new file mode 100644 index 0000000..8e3d2d5 --- /dev/null +++ b/assets/html2pdf/examples/exemple02.php @@ -0,0 +1,32 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + + // get the HTML + ob_start(); + include(dirname(__FILE__).'/res/exemple02.php'); + $content = ob_get_clean(); + + // convert in PDF + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr', true, 'UTF-8', array(15, 5, 15, 5)); + $html2pdf->pdf->SetDisplayMode('fullpage'); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('exemple02.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } + diff --git a/assets/html2pdf/examples/exemple03.php b/assets/html2pdf/examples/exemple03.php new file mode 100644 index 0000000..adfeddc --- /dev/null +++ b/assets/html2pdf/examples/exemple03.php @@ -0,0 +1,31 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + + // get the HTML + ob_start(); + include(dirname(__FILE__).'/res/exemple03.php'); + $content = ob_get_clean(); + + // convert to PDF + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr', true, 'UTF-8', 3); + $html2pdf->pdf->SetDisplayMode('fullpage'); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('exemple03.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/exemple04.php b/assets/html2pdf/examples/exemple04.php new file mode 100644 index 0000000..3512f0c --- /dev/null +++ b/assets/html2pdf/examples/exemple04.php @@ -0,0 +1,31 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + + // get the HTML + ob_start(); + include(dirname(__FILE__).'/res/exemple04.php'); + $content = ob_get_clean(); + + // convert to PDF + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr'); + $html2pdf->pdf->SetDisplayMode('fullpage'); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('exemple04.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/exemple05.php b/assets/html2pdf/examples/exemple05.php new file mode 100644 index 0000000..0ab051e --- /dev/null +++ b/assets/html2pdf/examples/exemple05.php @@ -0,0 +1,31 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + + // get the HTML + ob_start(); + include(dirname(__FILE__).'/res/exemple05.php'); + $content = ob_get_clean(); + + // convert to PDF + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr'); + $html2pdf->pdf->SetDisplayMode('fullpage'); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('exemple05.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/exemple06.php b/assets/html2pdf/examples/exemple06.php new file mode 100644 index 0000000..9b89df1 --- /dev/null +++ b/assets/html2pdf/examples/exemple06.php @@ -0,0 +1,30 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + + // get the HTML + ob_start(); + include(dirname(__FILE__).'/res/exemple06.php'); + $content = ob_get_clean(); + + // convert to PDF + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr'); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('exemple06.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/exemple07.php b/assets/html2pdf/examples/exemple07.php new file mode 100644 index 0000000..b43f954 --- /dev/null +++ b/assets/html2pdf/examples/exemple07.php @@ -0,0 +1,33 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + + // get the HTML + ob_start(); + include(dirname(__FILE__).'/res/exemple07a.php'); + include(dirname(__FILE__).'/res/exemple07b.php'); + $content = ob_get_clean(); + + // convert to PDF + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr'); + $html2pdf->pdf->SetDisplayMode('fullpage'); +// $html2pdf->pdf->SetProtection(array('print'), 'spipu'); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('exemple07.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/exemple08.php b/assets/html2pdf/examples/exemple08.php new file mode 100644 index 0000000..4ab8ad8 --- /dev/null +++ b/assets/html2pdf/examples/exemple08.php @@ -0,0 +1,30 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + + // get the HTML + ob_start(); + include(dirname(__FILE__).'/res/exemple08.php'); + $content = ob_get_clean(); + + // convert to PDF + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr', true, 'UTF-8', 0); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('exemple08.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/exemple09.php b/assets/html2pdf/examples/exemple09.php new file mode 100644 index 0000000..ab79655 --- /dev/null +++ b/assets/html2pdf/examples/exemple09.php @@ -0,0 +1,74 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + */ + +$generate = isset($_GET['make_pdf']); +$nom = isset($_GET['nom']) ? $_GET['nom'] : 'inconnu'; + +$nom = substr(preg_replace('/[^a-zA-Z0-9]/isU', '', $nom), 0, 26); + +if ($generate) { + ob_start(); +} else { +?> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<html> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" > + <title>Exemple d'auto génération de PDF</title> + </head> + <body> +<?php +} + +$url = dirname($_SERVER['REQUEST_URI']).'/res/exemple09.png.php?px=5&amp;py=20'; +if (substr($url, 0, 7)!=='http://') { + $url = 'http://'.$_SERVER['HTTP_HOST'].$url; +} +?> +<br> +Ceci est un exemple de génération de PDF via un bouton :)<br> +<br> +<img src="<?php echo $url; ?>" alt="image_php" ><br> +<br> +<?php + if ($generate) { +?> +Bonjour <b><?php echo $nom; ?></b>, ton nom peut s'écrire : <br> +<barcode type="C39" value="<?php echo strtoupper($nom); ?>" style="color: #770000" ></barcode><hr> +<br> +<?php + } +?> +<br> +<?php + if ($generate) { + $content = ob_get_clean(); + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr'); + $html2pdf->writeHTML($content); + $html2pdf->Output('exemple09.pdf'); + exit; + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } + } +?> + <form method="get" action=""> + <input type="hidden" name="make_pdf" value=""> + Ton nom : <input type="text" name="nom" value=""> - + <input type="submit" value="Generer le PDF" > + </form> + </body> +</html> \ No newline at end of file diff --git a/assets/html2pdf/examples/exemple10.php b/assets/html2pdf/examples/exemple10.php new file mode 100644 index 0000000..2e9e3ca --- /dev/null +++ b/assets/html2pdf/examples/exemple10.php @@ -0,0 +1,28 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + + ob_start(); + include(dirname(__FILE__).'/res/exemple10.php'); + $content = ob_get_clean(); + + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr'); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('exemple10.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } \ No newline at end of file diff --git a/assets/html2pdf/examples/exemple11.php b/assets/html2pdf/examples/exemple11.php new file mode 100644 index 0000000..8a8ee68 --- /dev/null +++ b/assets/html2pdf/examples/exemple11.php @@ -0,0 +1,31 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + + // get the HTML + ob_start(); + include(dirname(__FILE__).'/res/exemple11.php'); + $content = ob_get_clean(); + + // convert to PDF + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr'); + $html2pdf->setTestTdInOnePage(false); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('exemple11.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/exemple12.php b/assets/html2pdf/examples/exemple12.php new file mode 100644 index 0000000..5cf6ef7 --- /dev/null +++ b/assets/html2pdf/examples/exemple12.php @@ -0,0 +1,30 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + + // get the HTML + ob_start(); + include(dirname(__FILE__).'/res/exemple12.php'); + $content = ob_get_clean(); + + // convert to PDF + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr'); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('exemple12.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/exemple13.php b/assets/html2pdf/examples/exemple13.php new file mode 100644 index 0000000..6d3c485 --- /dev/null +++ b/assets/html2pdf/examples/exemple13.php @@ -0,0 +1,30 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + + // get the HTML + ob_start(); + include(dirname(__FILE__).'/res/exemple13.php'); + $content = ob_get_clean(); + + // convert to PDF + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr'); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('exemple13.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/forms.php b/assets/html2pdf/examples/forms.php new file mode 100644 index 0000000..dbe105a --- /dev/null +++ b/assets/html2pdf/examples/forms.php @@ -0,0 +1,39 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + + // for display the post information + if (isset($_POST['test'])) { + echo '<pre>'; + echo htmlentities(print_r($_POST, true)); + echo '</pre>'; + exit; + } + + // get the HTML + ob_start(); + include(dirname(__FILE__).'/res/forms.php'); + $content = ob_get_clean(); + + // convert to PDF + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr'); + $html2pdf->pdf->SetDisplayMode('fullpage'); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('forms.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/groups.php b/assets/html2pdf/examples/groups.php new file mode 100644 index 0000000..65d0400 --- /dev/null +++ b/assets/html2pdf/examples/groups.php @@ -0,0 +1,71 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + +ob_start(); +?> +<style type="text/css"> +<!-- + table.page_header {width: 100%; border: none; background-color: #DDDDFF; border-bottom: solid 1mm #AAAADD; padding: 2mm } + table.page_footer {width: 100%; border: none; background-color: #DDDDFF; border-top: solid 1mm #AAAADD; padding: 2mm} +--> +</style> +<page backtop="14mm" backbottom="14mm" backleft="10mm" backright="10mm" pagegroup="new"> + <page_header> + <table class="page_header"> + <tr> + <td style="width: 100%; text-align: left"> + Exemple d'utilisation des groupes de pages + </td> + </tr> + </table> + </page_header> + <page_footer> + <table class="page_footer"> + <tr> + <td style="width: 100%; text-align: right"> + page [[page_cu]]/[[page_nb]] + </td> + </tr> + </table> + </page_footer> + Ceci est la page 1 du groupe 1 +</page> +<page pageset="old"> + Ceci est la page 2 du groupe 1 +</page> +<page pageset="old"> + Ceci est la page 3 du groupe 1 +</page> +<?php for ($k=2; $k<5; $k++): ?> +<page pageset="old" pagegroup="new"> + Ceci est la page 1 du groupe <?php echo $k; ?> +</page> +<page pageset="old"> + Ceci est la page 2 du groupe <?php echo $k; ?> +</page> +<?php endfor; ?> +<?php + $content = ob_get_clean(); + + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr', true, 'UTF-8', 0); + $html2pdf->pdf->SetDisplayMode('fullpage'); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('groups.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/js1.php b/assets/html2pdf/examples/js1.php new file mode 100644 index 0000000..5bf1baf --- /dev/null +++ b/assets/html2pdf/examples/js1.php @@ -0,0 +1,37 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + + // get the HTML + ob_start(); +?> +<page> + <h1>Test de JavaScript 1</h1><br> + <br> + Normalement la fenetre d'impression devrait apparaitre automatiquement +</page> +<?php + $content = ob_get_clean(); + + // convert to PDF + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr'); + $html2pdf->pdf->IncludeJS("print(true);"); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('js1.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/js2.php b/assets/html2pdf/examples/js2.php new file mode 100644 index 0000000..9658715 --- /dev/null +++ b/assets/html2pdf/examples/js2.php @@ -0,0 +1,37 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + + // get the HTML + ob_start(); +?> +<page> + <h1>Test de JavaScript 2</h1><br> + <br> + Normalement une alerte devrait apparaitre, indiquant "coucou" +</page> +<?php + $content = ob_get_clean(); + + // convert to PDF + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr'); + $html2pdf->pdf->IncludeJS("app.alert('coucou');"); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('js2.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/js3.php b/assets/html2pdf/examples/js3.php new file mode 100644 index 0000000..1bff910 --- /dev/null +++ b/assets/html2pdf/examples/js3.php @@ -0,0 +1,43 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + + // get the HTML + ob_start(); +?> +<page> + <h1>Test de JavaScript 3</h1><br> + <br> + Normalement une valeur devrait vous être demandée, puis affichée +</page> +<?php + $content = ob_get_clean(); + + // PDF script to execute + $script = " +var rep = app.response('Donnez votre nom'); +app.alert('Vous vous appelez '+rep); +"; + + // convert to PDF + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr'); + $html2pdf->pdf->IncludeJS($script); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('js3.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/qrcode.php b/assets/html2pdf/examples/qrcode.php new file mode 100644 index 0000000..9210105 --- /dev/null +++ b/assets/html2pdf/examples/qrcode.php @@ -0,0 +1,65 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + + // get the HTML + ob_start(); + $msg = "Le site de html2pdf\r\nhttp://html2pdf.fr/"; +?> +<page backtop="10mm" > + <page_header> + <table style="width: 100%; border: solid 1px black;"> + <tr> + <td style="text-align: left; width: 50%">html2pdf</td> + <td style="text-align: right; width: 50%">Exemples de QRcode</td> + </tr> + </table> + </page_header> + <h1>Exemples de QRcode</h1> + <h3>Message avec Correction d'erreur L, M, Q, H (valeur par défaut : H)</h3> + <qrcode value="<?php echo $msg; ?>" ec="L" style="width: 30mm;"></qrcode> + <qrcode value="<?php echo $msg; ?>" ec="M" style="width: 30mm;"></qrcode> + <qrcode value="<?php echo $msg; ?>" ec="Q" style="width: 30mm;"></qrcode> + <qrcode value="<?php echo $msg; ?>" ec="H" style="width: 30mm;"></qrcode> + <br> + <h3>Message avec différentes largeurs</h3> + <qrcode value="<?php echo $msg; ?>" style="width: 20mm;"></qrcode> + <qrcode value="<?php echo $msg; ?>" style="width: 30mm;"></qrcode> + <qrcode value="<?php echo $msg; ?>" style="width: 40mm;"></qrcode> + <qrcode value="<?php echo $msg; ?>" style="width: 50mm;"></qrcode> + <br> + <h3>Message de différentes couleurs</h3> + <qrcode value="<?php echo $msg; ?>" style="width: 40mm; background-color: white; color: black;"></qrcode> + <qrcode value="<?php echo $msg; ?>" style="width: 40mm; background-color: yellow; color: red"></qrcode> + <qrcode value="<?php echo $msg; ?>" style="width: 40mm; background-color: #FFCCFF; color: #003300"></qrcode> + <qrcode value="<?php echo $msg; ?>" style="width: 40mm; background-color: #CCFFFF; color: #003333"></qrcode> + <br> + <h3>Message sans border</h3> + <qrcode value="<?php echo $msg; ?>" style="border: none; width: 40mm;"></qrcode> + <br> +</page> +<?php + $content = ob_get_clean(); + + // convert to PDF + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr'); + $html2pdf->pdf->SetDisplayMode('fullpage'); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('qrcode.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/radius.php b/assets/html2pdf/examples/radius.php new file mode 100644 index 0000000..dc71e92 --- /dev/null +++ b/assets/html2pdf/examples/radius.php @@ -0,0 +1,53 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + // get the HTML + ob_start(); +?> +<style type="text/css"> +<!-- +.div { background: #CCDDCC; color: #002200; text-align: center; width: 70mm; height: 20mm; margin: 2mm; } +.div1 { border: solid 2mm black; border-radius: 5mm; -moz-border-radius: 5mm; } +.div2 { border: solid 2mm black; border-radius: 3mm 10mm 0mm 3mm; -moz-border-radius: 3mm 10mm 0mm 3mm; } +.div3 { border: solid 2mm black; border-radius: 10mm / 7mm; -moz-border-radius: 10mm / 7mm; } +.div4 { border: solid 6mm black; border-radius: 5mm / 10mm; -moz-border-radius: 5mm / 10mm; } +.div5 { border: solid 5mm black; border-top: none; border-bottom: none; border-radius: 5mm; -moz-border-radius: 5mm; } +.div6 { border: solid 5mm black; border-left: none; border-right: none; border-radius: 5mm; -moz-border-radius: 5mm; } +.div7 { border: solid 5mm black; border-left: none; border-top: none; border-radius: 5mm; -moz-border-radius: 5mm; } +.div8 { border-radius: 8mm; -moz-border-radius: 8mm; border-left: solid 2mm #660000; border-top: solid 1mm #006600; border-right: solid 2mm #000066; border-bottom: solid 4mm #004444;} +--> +</style> +<page> + <div class="div div1">Exemple de div</div> + <div class="div div2">Exemple de div</div> + <div class="div div3">Exemple de div</div> + <div class="div div4">Exemple de div</div> + <div class="div div5">Exemple de div</div> + <div class="div div6">Exemple de div</div> + <div class="div div7">Exemple de div</div> + <div class="div div8">Exemple de div</div> +</page> +<?php + $content = ob_get_clean(); + + // convert to PDF + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr'); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('radius.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/regle.php b/assets/html2pdf/examples/regle.php new file mode 100644 index 0000000..23ef463 --- /dev/null +++ b/assets/html2pdf/examples/regle.php @@ -0,0 +1,59 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + + // get the HTML + ob_start(); +?> +<style type="text/css"> +<!-- + table + { + padding: 0; + margin: 0; + border: none; + border-right: solid 0.2mm black; + } + td + { + padding: 0; + margin: 0; + border: none; + } + + img + { + width: 10mm; + } +--> +</style> +<page> +<table cellpadding="0" cellspacing="0"><tr> +<?php for($k=0; $k<28; $k++) echo '<td><img src="./res/regle.png" alt="" ><br>'.$k.'</td>'; ?> +</tr></table> +</page> +<?php + $content = ob_get_clean(); + + // convert to PDF + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('L', 'A4', 'fr', true, 'UTF-8', 10); + $html2pdf->pdf->SetDisplayMode('fullpage'); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('regle.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/res/about.php b/assets/html2pdf/examples/res/about.php new file mode 100644 index 0000000..d35ecea --- /dev/null +++ b/assets/html2pdf/examples/res/about.php @@ -0,0 +1,241 @@ +<style type="text/css"> +<!-- + table.page_header {width: 100%; border: none; background-color: #DDDDFF; border-bottom: solid 1mm #AAAADD; padding: 2mm } + table.page_footer {width: 100%; border: none; background-color: #DDDDFF; border-top: solid 1mm #AAAADD; padding: 2mm} + div.note {border: solid 1mm #DDDDDD;background-color: #EEEEEE; padding: 2mm; border-radius: 2mm; width: 100%; } + ul.main { width: 95%; list-style-type: square; } + ul.main li { padding-bottom: 2mm; } + h1 { text-align: center; font-size: 20mm} + h3 { text-align: center; font-size: 14mm} +--> +</style> +<page backtop="14mm" backbottom="14mm" backleft="10mm" backright="10mm" style="font-size: 12pt"> + <page_header> + <table class="page_header"> + <tr> + <td style="width: 50%; text-align: left"> + A propos de ... + </td> + <td style="width: 50%; text-align: right"> + HTML2PDF v<?php echo __CLASS_HTML2PDF__; ?> + </td> + </tr> + </table> + </page_header> + <page_footer> + <table class="page_footer"> + <tr> + <td style="width: 33%; text-align: left;"> + http://html2pdf.fr/ + </td> + <td style="width: 34%; text-align: center"> + page [[page_cu]]/[[page_nb]] + </td> + <td style="width: 33%; text-align: right"> + &copy;Spipu 2008-2011 + </td> + </tr> + </table> + </page_footer> + <bookmark title="Présentation" level="0" ></bookmark> + <br><br><br><br><br><br><br><br> + <h1>HTML2PDF</h1> + <h3>v<?php echo __CLASS_HTML2PDF__; ?></h3><br> + <br><br><br><br><br> + <div style="text-align: center; width: 100%;"> + <br> + <img src="./res/logo.png" alt="Logo HTML2PDF" style="width: 150mm"> + <br> + </div> + <br><br><br><br><br> + <div class="note"> + HTML2PDF est un convertisseur de code HTML vers PDF écrit en PHP5, utilisant la librairie <a href="http://tcpdf.org">TCPDF.</a><br> + <br> + Il permet la conversion d'HTML et d'xHTML valide au format PDF, et est distribué sous licence LGPL.<br> + <br> + Cette librairie a été conçue pour gérer principalement les TABLE imbriquées afin de générer des factures, bon de livraison, et autres documents officiels.<br> + <br> + Vous pouvez télécharger la dernière version de HTML2PDF ici : <a href="http://html2pdf.fr/">http://html2pdf.fr/</a>.<br> + </div> +</page> +<page pageset="old"> + <bookmark title="Sommaire" level="0" ></bookmark> + <!-- here will be the automatic index --> +</page> +<page pageset="old"> + <bookmark title="Compatibilité" level="0" ></bookmark> + <bookmark title="Balises HTML" level="1" ></bookmark> + <bookmark title="Balises classiques" level="2" ></bookmark> + <div class="note"> + La liste des balises HTML utilisables est la suivante :<br> + </div> + <br> + <ul class="main"> + <li>&lt;a&gt; : Ceci est un lien vers <a href="http://html2pdf.fr">le site de HTML2PDF</a></li> + <li>&lt;b&gt;, &lt;strong&gt; : Ecrire en <b>gras</b>.</li> + <li>&lt;big&gt; : Ecrire plus <big>gros</big>.</li> + <li>&lt;br&gt; : Permet d'aller à la ligne</li> + <li>&lt;cite&gt; : <cite>Ceci est une citation</cite></li> + <li>&lt;code&gt;, &lt;pre&gt;</li> + <li>&lt;div&gt; :&nbsp;<div style="border: solid 1px #AADDAA; background: #DDFFDD; text-align: center; width: 50mm">exemple de DIV</div></li> + <li>&lt;em&gt;, &lt;i&gt;, &lt;samp&gt; : Ecrire en <em>italique</em>.</li> + <li>&lt;font&gt;, &lt;span&gt; : <font style="color: #000066; font-family: times">Exemple d'utilisation</font></li> + <li>&lt;h1&gt;, &lt;h2&gt;, &lt;h3&gt;, &lt;h4&gt;, &lt;h5&gt;, &lt;h6&gt;</li> + <li>&lt;hr&gt; : barre horizontale</li> + <li>&lt;img&gt; : <img src="./res/tcpdf_logo.jpg" style="width: 10mm"></li> + <li>&lt;p&gt; : Ecrire dans un paragraphe</li> + <li>&lt;s&gt; : Texte <s>barré</s></li> + <li>&lt;small&gt; : Ecrire plus <small>petit</small>.</li> + <li>&lt;style&gt;</li> + <li>&lt;sup&gt; : Exemple<sup>haut</sup>.</li> + <li>&lt;sub&gt; : Exemple<sub>bas</sub>.</li> + <li>&lt;u&gt; : Texte <u>souligné</u></li> + <li>&lt;table&gt;, &lt;td&gt;, &lt;th&gt;, &lt;tr&gt;, &lt;thead&gt;, &lt;tbody&gt;, &lt;tfoot&gt;, &lt;col&gt; </li> + <li>&lt;ol&gt;, &lt;ul&gt;, &lt;li&gt;</li> + <li>&lt;form&gt;, &lt;input&gt;, &lt;textarea&gt;, &lt;select&gt;, &lt;option&gt;</li> + <li>&lt;fieldset&gt;, &lt;legend&gt;</li> + <li>&lt;del&gt;, &lt;ins&gt;</li> + <li>&lt;draw&gt;, &lt;line&gt;, &lt;rect&gt;, &lt;circle&gt;, &lt;ellipse&gt;, &lt;polygone&gt;, &lt;polyline&gt;, &lt;path&gt;</li> + </ul> + <bookmark title="Balises spécifiques" level="2" ></bookmark> + <div class="note"> + Les balises spécifiques suivantes ont été ajoutées :<br> + </div> + <br> + <ul class="main" > + <li>&lt;page&gt;</li> + <li>&lt;page_header&gt;</li> + <li>&lt;page_footer&gt;</li> + <li>&lt;nobreak&gt;</li> + <li>&lt;barcode&gt;</li> + <li>&lt;bookmark&gt;</li> + <li>&lt;qrcode&gt;</li> + </ul> +</page> +<page pageset="old"> + <bookmark title="Styles CSS" level="1" ></bookmark> + <div class="note"> + La liste des styles CSS utilisables est la suivante :<br> + </div> + <br> + <table style="width: 100%"> + <tr style="vertical-align: top"> + <td style="width: 50%"> + <ul class="main"> + <li>color</li> + <li>font-family</li> + <li>font-weight</li> + <li>font-style</li> + <li>font-size</li> + <li>text-decoration</li> + <li>text-indent</li> + <li>text-align</li> + <li>text-transform</li> + <li>vertical-align</li> + <li>width</li> + <li>height</li> + <li>line-height</li> + <li>padding</li> + <li>padding-top</li> + <li>padding-right</li> + <li>padding-bottom</li> + <li>padding-left</li> + <li>margin</li> + <li>margin-top</li> + <li>margin-right</li> + <li>margin-bottom</li> + <li>margin-left</li> + <li>position</li> + <li>top</li> + <li>bottom</li> + <li>left</li> + <li>right</li> + <li>float</li> + <li>rotate</li> + <li>background</li> + <li>background-color</li> + <li>background-image</li> + <li>background-position</li> + <li>background-repeat</li> + </ul> + </td> + <td style="width: 50%"> + <ul class="main"> + <li>border</li> + <li>border-style</li> + <li>border-color</li> + <li>border-width</li> + <li>border-collapse</li> + <li>border-top</li> + <li>border-top-style</li> + <li>border-top-color</li> + <li>border-top-width</li> + <li>border-right</li> + <li>border-right-style</li> + <li>border-right-color</li> + <li>border-right-width</li> + <li>border-bottom</li> + <li>border-bottom-style</li> + <li>border-bottom-color</li> + <li>border-bottom-width</li> + <li>border-left</li> + <li>border-left-style</li> + <li>border-left-color</li> + <li>border-left-width</li> + <li>border-radius</li> + <li>border-top-left-radius</li> + <li>border-top-right-radius</li> + <li>border-bottom-left-radius</li> + <li>border-bottom-right-radius</li> + <li>list-style</li> + <li>list-style-type</li> + <li>list-style-image</li> + </ul> + </td> + </tr> + </table> +</page> +<page pageset="old"> + <bookmark title="Propriétés" level="1" ></bookmark> + <div class="note"> + La liste des propriétés utilisables est la suivante :<br> + </div> + <br> + <table style="width: 100%"> + <tr style="vertical-align: top"> + <td style="width: 50%"> + <ul class="main"> + <li>cellpadding</li> + <li>cellspacing</li> + <li>colspan</li> + <li>rowspan</li> + <li>width</li> + <li>height</li> + </ul> + </td> + <td style="width: 50%"> + <ul class="main"> + <li>align</li> + <li>valign</li> + <li>bgcolor</li> + <li>bordercolor</li> + <li>border</li> + <li>type</li> + <li>value</li> + </ul> + </td> + </tr> + </table> + <bookmark title="Limitations" level="0" ></bookmark> + <div class="note"> + Cette librairie comporte des limitations :<br> + </div> + <br> + <ul class="main"> + <li>Les float ne sont gérés que pour la balise IMG.</li> + <li>Elle ne permet généralement pas la conversion directe d'une page HTML en PDF, ni la conversion du résultat d'un WYSIWYG en PDF.</li> + <li>Cette librairie est là pour faciliter la génération de documents PDF, pas pour convertir n'importe quelle page HTML.</li> + <li>Les formulaires ne marchent pas avec tous les viewers PDFs...</li> + <li>Lisez bien le wiki : <a href="http://wiki.spipu.net/doku.php?id=html2pdf:Accueil">http://wiki.spipu.net/doku.php?id=html2pdf:Accueil</a>.</li> + </ul> +</page> \ No newline at end of file diff --git a/assets/html2pdf/examples/res/bas_page.png b/assets/html2pdf/examples/res/bas_page.png new file mode 100644 index 0000000..16d532f Binary files /dev/null and b/assets/html2pdf/examples/res/bas_page.png differ diff --git a/assets/html2pdf/examples/res/exemple00.php b/assets/html2pdf/examples/res/exemple00.php new file mode 100644 index 0000000..76bd3b9 --- /dev/null +++ b/assets/html2pdf/examples/res/exemple00.php @@ -0,0 +1,86 @@ +<style type="text/Css"> +<!-- +.test1 +{ + border: solid 1px #FF0000; + background: #FFFFFF; + border-collapse: collapse; +} +--> +</style> +<page style="font-size: 14px"> + <span style="font-weight: bold; font-size: 18pt; color: #FF0000; font-family: Times">Bonjour, voici quelques exemples<br></span> + <br> + Retours à la ligne autorisés : &lt;br&gt;, &lt;br &gt;, &lt;br/&gt;, &lt;br /&gt; <br /> + <br> + Barre horizontale &lt;hr&gt;<hr style="height: 4mm; background: #AA5500; border: solid 1mm #0055AA"> + Exemple de lien : <a href="http://html2pdf.fr/" >le site HTML2PDF</a><br> + <br> + Image : <img src="./res/logo.gif" alt="Logo" width=150 /><br> + <br> + Alignement horizontal des DIVs et TABLEs<br /> + <table style="text-align: center; border: solid 2px red; background: #FFEEEE;width: 40%" align="center"><tr><td style="width: 100%">Test 1</td></tr></table><br /> + <table style="text-align: center; border: solid 2px red; background: #FFEEEE;width: 40%; margin: auto"><tr><td style="width: 100%">Test 2</td></tr></table><br /> + <div style="text-align: center; border: solid 2px red; background: #FFEEEE;width: 40%; margin: auto">Test 3</div><br /> + test de tableau imbriqué :<br> + <table border="1" bordercolor="#007" bgcolor="#AAAAAA" align="center"> + <tr> + <td border="1"> + <table style="border: solid 1px #FF0000; background: #FFFFFF; width: 100%; text-align: center"> + <tr> + <th style="border: solid 1px #007700;width: 50%">C1 € «</th> + <td style="border: solid 1px #007700;width: 50%">C2 € «</td> + </tr> + <tr> + <td style="border: solid 1px #007700;width: 50%">D1 &euro; &laquo;</td> + <th style="border: solid 1px #007700;width: 50%">D2 &euro; &laquo;</th> + </tr> + </table> + </td> + <td border="1">A2</td> + <td border="1">AAAAAAAA</td> + </tr> + <tr> + <td border="1">B1</td> + <td border="1" rowspan="2"> + <table class="test1"> + <tr> + <td style="border: solid 2px #007700">E1</td> + <td style="border: solid 2px #000077; padding: 2mm"> + <table style="border: solid 1px #445500"> + <tr> + <td> + <img src="./res/logo.gif" alt="Logo" width=100 /> + </td> + </tr> + </table> + </td> + </tr> + <tr> + <td style="border: solid 2px #770000">F1</td> + <td style="border: solid 2px #007777">F2</td> + </tr> + </table> + </td> + <td border="1"><barcode type="EAN13" value="45" style="width: 30mm; height: 6mm; font-size: 4mm"></barcode></td> + </tr> + <tr> + <td border="1"><barcode type="C39" value="HTML2PDF" label="none" style="width: 35mm; height: 8mm"></barcode></td> + <td border="1">A2</td> + </tr> + </table> + <br> + Exemple avec border et padding : <br> + <table style="border: solid 5mm #770000; padding: 5mm;" cellspacing="0" > + <tr> + <td style="border: solid 3mm #007700; padding: 2mm;"><img src="./res/off.png" alt="" style="width: 20mm"></td> + </tr> + </table> + <img src="./res/off.png" style="width: 10mm;"><img src="./res/off.png" style="width: 10mm;"><img src="./res/off.png" style="width: 10mm;"><img src="./res/off.png" style="width: 10mm;"><img src="./res/off.png" style="width: 10mm;"><br> + <br> + <table style="border: solid 1px #440000; width: 150px" cellspacing="0"><tr><td style="width: 100%">Largeur : 150px</td></tr></table><br> + <table style="border: solid 1px #440000; width: 150pt" cellspacing="0"><tr><td style="width: 100%">Largeur : 150pt</td></tr></table><br> + <table style="border: solid 1px #440000; width: 100mm" cellspacing="0"><tr><td style="width: 100%">Largeur : 100mm</td></tr></table><br> + <table style="border: solid 1px #440000; width: 5in" cellspacing="0"><tr><td style="width: 100%">Largeur : 5in</td></tr></table><br> + <table style="border: solid 1px #440000; width: 80%" cellspacing="0"><tr><td style="width: 100%">Largeur : 80% </td></tr></table><br> +</page> \ No newline at end of file diff --git a/assets/html2pdf/examples/res/exemple01.php b/assets/html2pdf/examples/res/exemple01.php new file mode 100644 index 0000000..49cb76b --- /dev/null +++ b/assets/html2pdf/examples/res/exemple01.php @@ -0,0 +1,96 @@ +<style type="text/css"> +<!-- +table.morpion +{ + border: dashed 1px #444444; +} + +table.morpion td +{ + font-size: 15pt; + font-weight: bold; + border: solid 1px #000000; + padding: 1px; + text-align: center; + width: 25px; +} + +table.morpion td.j1 { color: #0A0; } +table.morpion td.j2 { color: #A00; } + +--> +</style> +<page style="font-size: 10pt"> + <span style="font-weight: bold; font-size: 20pt; color: #F00">Bonjour, voici quelques exemples</span><br> + Bonjour, ceci est un test <b>de gras</b>, <i>d'italic</i>, <b><i>et des 2 ensembles</i></b>.<br> + <br> + <span style="background: red; color: white;">Ceci est un message important</span><br> + <br> + <small>Texte écrit avec small</small>, Texte écrit normalement, <big>Texte écrit avec big</big><br> + <span style="font-size: 20px">A<sub>test d'<b>indice</b></sub> et N<sup>test d'<b>exposant</b></sup>, + test<sub>test<sub>test</sub></sub>, + test<sup>test<sup>test</sup></sup>, + test<sub>test<sup>test</sup></sub>. + </span><br> + <br> + <table align="center" style="border-radius: 6mm; border-top: solid 3mm #000077; border-right: solid 2mm #007700; border-bottom: solid 1mm #770000; border-left: solid 2mm #007777; background: #DDDDAA;" ><tr><td style="width: 100mm; height: 20mm; text-align: center; ">Coucou ! ceci est un border solid avec un radius !!! </td></tr></table> + <br> + <table align="center" style="border-radius: 6mm; border: none; background: #DDDDAA;" ><tr><td style="width: 100mm; height: 20mm; text-align: center; ">Coucou ! ceci est un background avec un radius !!! </td></tr></table> + <br> + <table align="center" style="border: solid 1px #000000;"><tr><td style="border-top: solid 4mm #000077; border-right: solid 3mm #007700; border-bottom: solid 2mm #770000; border-left: solid 1mm #007777; padding: 2mm 4mm 6mm 8mm; width: 100mm; background: #FFDDDD">Coucou ! ceci est un border solid</td></tr></table><br> + <table align="center" style="border: solid 1px #000000;"><tr><td style="border-top: dotted 4mm #000077; border-right: dotted 3mm #007700; border-bottom: dotted 2mm #770000; border-left: dotted 1mm #007777; padding: 2mm 4mm 6mm 8mm; width: 100mm; background: #FFDDDD">Coucou ! ceci est un border dotted</td></tr></table><br> + <table align="center" style="border: solid 1px #000000;"><tr><td style="border-top: dashed 4mm #000077; border-right: dashed 3mm #007700; border-bottom: dashed 2mm #770000; border-left: dashed 1mm #007777; padding: 2mm 4mm 6mm 8mm; width: 100mm; background: #FFDDDD">Coucou ! ceci est un border dashed</td></tr></table><br> + <table align="center" style="border: solid 1px #000000;"><tr><td style="border-top: double 4mm #000077; border-right: double 3mm #007700; border-bottom: double 2mm #770000; border-left: double 1mm #007777; padding: 2mm 4mm 6mm 8mm; width: 100mm; background: #FFDDDD">Coucou ! ceci est un border double</td></tr></table><br> +<?php $back = 'background-image: url(./res/off.png); background-position: left top; background-repeat: repeat; '; ?> + <table style="background: #FFAAAA; color: #000022; border: 3px solid #555555;"> + <tr> + <td style="width: 40mm; border: solid 1px #000000; <?php echo $back; ?>color: #003300">Case A1</td> + <td style="width: 50mm; border: solid 1px #000000; <?php echo $back; ?>font-weight: bold;">Case A2</td> + <td style="width: 60mm; border: solid 1px #000000; <?php echo $back; ?>font-size: 20px;">Case A3</td> + </tr> + <tr> + <td style="border: solid 1px #000000; text-align: left; <?php echo $back; ?>vertical-align: top; ">Case B1</td> + <td style="border: solid 1px #000000; text-align: center; <?php echo $back; ?>vertical-align: middle; height: 20mm">Case B2<hr style="color: #22AA22">test de hr</td> + <td style="border: solid 1px #000000; text-align: right; <?php echo $back; ?>vertical-align: bottom; border-radius: 3mm; ">Case B3</td> + </tr> + </table> + <br> + <table style="border: solid 2px #550000; background: #000022 url(./res/logo.png) center center no-repeat; color: #FFFFFF;"> + <tr > + <td style="border: solid 1px #AAAAAA;">Case A1<BR>avec tests diverses</td> + <td style="border: solid 1px #AAAAAA;">Case A2</td> + <td style="border: solid 1px #AAAAAA;">Case A3 classic</td> + </tr> + <tr> + <td style="border: solid 1px #AAAAAA;">Case B1<br>toto</td> + <td style="border: solid 1px #AAAAAA;background: #FF0000">Case B2</td> + <td style="border: solid 1px #AAAAAA;">Case B3</td> + </tr> + </table> + <br> + <table class="morpion" cellspacing="5px"> + <tr> + <td class="j1">X</td> + <td class="j2">O</td> + <td class="j1">X</td> + </tr> + <tr> + <td class="j2">O</td> + <td class="j1">X</td> + <td ></td> + </tr> + <tr> + <td class="j2">O</td> + <td></td> + <td class="j1">X</td> + </tr> + </table> + <br> + <table style="border: dotted 1mm #FFFFFF; background: #AAAAFF"> + <tr> + <td style="width: 42mm; text-align: center;font-size: 5mm"> + Ceci est un test + </td> + </tr> + </table> +</page> \ No newline at end of file diff --git a/assets/html2pdf/examples/res/exemple02.php b/assets/html2pdf/examples/res/exemple02.php new file mode 100644 index 0000000..8b3ee14 --- /dev/null +++ b/assets/html2pdf/examples/res/exemple02.php @@ -0,0 +1,118 @@ +<?php +$content = 'A Test overflow<br>A Test overflow<br>A Test overflow<br> +<img src="./res/logo.gif" alt="logo" style="width: XXXmm"><br> +B Test overflow<br>B Test overflow<br>B Test overflow<br> +<img src="./res/logo.gif" alt="logo" style="width: XXXmm"><br> +C Test overflow<br>C Test overflow<br>C Test overflow<br>'; +?> +<style type="text/css"> +<!-- +div.zone +{ + border: solid 2mm #66AACC; + border-radius: 3mm; + padding: 1mm; + background-color: #FFEEEE; + color: #440000; +} +div.zone_over +{ + width: 30mm; + height: 35mm; + overflow: hidden; +} + +--> +</style> +<page style="font-size: 10pt"> + <span style="font-size: 16pt ; font-weight: bold">Démonstration des images</span><br> + <br> + <b>Dans un tableau :</b><br> + <table style="width: 50%;border: solid 3px #5544DD" align="center"> + <tr> + <td style="width: 30%; text-align: left; ">Text à gauche<br>avec retour à<br>la ligne</td> + <td style="width: 40%; text-align: center;"><img src="./res/logo.gif" alt="" ><br><i>légende</i></td> + <td style="width: 30%; text-align: right; ">Texte à droite</td> + </tr> + </table> + <br> + Texte <span style="text-decoration: underline">souligné</span>, + texte <span style="text-decoration: overline">surligné</span>, + texte <span style="text-decoration: line-through">barré</span>, + texte <span style="text-decoration: underline overline line-through">avec les trois</span>.<br> + <br> + <b>Dans un texte :</b><br> + texte à la suite d'une image, <img src="./res/logo.gif" alt="" style="height: 10mm"> + texte à la suite d'une image, répétitif car besoin d'un retour à la ligne + texte à la suite d'une image, répétitif car besoin d'un retour à la ligne + texte à la suite d'une image, répétitif car besoin d'un retour à la ligne + texte à la suite d'une image, répétitif car besoin d'un retour à la ligne<br> + <br> + <br> + Test différentes tailles texte + <span style="font-size: 18pt;">Test Size</span> + <span style="font-size: 16pt;">Test Size</span> + <span style="font-size: 14pt;">Test Size</span> + <span style="font-size: 12pt;">Test Size</span> + Test différentes tailles texte, répétitif car besoin d'un retour à la ligne + Test différentes tailles texte, répétitif car besoin d'un retour à la ligne + Test différentes tailles texte, répétitif car besoin d'un retour à la ligne + Test différentes tailles texte, répétitif car besoin d'un retour à la ligne + <br> + <br> + <b>Exemple de couleur : </b><br> + <span style="color: RGB(255, 0, 0)">Texte de couleur</span><br> + <span style="color: RGB(0., 1., 0.)">Texte de couleur</span><br> + <span style="color: RGB(0, 0, 100%)">Texte de couleur</span><br> + <span style="color: CMYK(255, 0, 0, 0)">Texte de couleur</span><br> + <span style="color: CMYK(0., 1., 0., 0.)">Texte de couleur</span><br> + <span style="color: CMYK(0, 0, 100%, 0)">Texte de couleur</span><br> + <span style="color: CMYK(0, 0, 0, 255)">Texte de couleur</span><br> + <br> + <table> + <tr style="vertical-align: top"> + <td> + <u>Exemple 0 :</u><br><br> + <div class="zone" ><?php echo str_replace('XXX', '40', $content); ?></div> + sans overflow + </td> + <td> + <u>Exemple 1 :</u><br><br> + <div class="zone zone_over" style="text-align: left; vertical-align: top; "><?php echo str_replace('XXX', '40', $content); ?></div> + hidden left top + </td> + <td> + <u>Exemple 2 :</u><br><br> + <div class="zone zone_over" style="text-align: center; vertical-align: middle;"><?php echo str_replace('XXX', '40', $content); ?></div> + hidden center middle + </td> + <td> + <u>Exemple 3 :</u><br><br> + <div class="zone zone_over" style="text-align: right; vertical-align: bottom;"><?php echo str_replace('XXX', '40', $content); ?></div> + hidden right bottom + </td> + </tr> + <tr style="vertical-align: top"> + <td> + <u>Exemple 0 :</u><br><br> + <div class="zone" ><?php echo str_replace('XXX', '20', $content); ?></div> + sans overflow + </td> + <td> + <u>Exemple 1 :</u><br><br> + <div class="zone zone_over" style="text-align: left; vertical-align: top; "><?php echo str_replace('XXX', '20', $content); ?></div> + hidden left top + </td> + <td> + <u>Exemple 2 :</u><br><br> + <div class="zone zone_over" style="text-align: center; vertical-align: middle;"><?php echo str_replace('XXX', '20', $content); ?></div> + hidden center middle + </td> + <td> + <u>Exemple 3 :</u><br><br> + <div class="zone zone_over" style="text-align: right; vertical-align: bottom;"><?php echo str_replace('XXX', '20', $content); ?></div> + hidden right bottom + </td> + </tr> + </table> +</page> \ No newline at end of file diff --git a/assets/html2pdf/examples/res/exemple03.php b/assets/html2pdf/examples/res/exemple03.php new file mode 100644 index 0000000..1ff72fb --- /dev/null +++ b/assets/html2pdf/examples/res/exemple03.php @@ -0,0 +1,87 @@ +<page backtop="10mm" backbottom="10mm" backleft="20mm" backright="20mm"> + <page_header> + <table style="width: 100%; border: solid 1px black;"> + <tr> + <td style="text-align: left; width: 33%">html2pdf</td> + <td style="text-align: center; width: 34%">Test d'header</td> + <td style="text-align: right; width: 33%"><?php echo date('d/m/Y'); ?></td> + </tr> + </table> + </page_header> + <page_footer> + <table style="width: 100%; border: solid 1px black;"> + <tr> + <td style="text-align: left; width: 50%">html2pdf.fr</td> + <td style="text-align: right; width: 50%">page [[page_cu]]/[[page_nb]]</td> + </tr> + </table> + </page_footer> + <span style="font-size: 20px; font-weight: bold">Démonstration des retour à la ligne automatique, ainsi que des sauts de page automatique</span><br> + <br> + <br> + <table style="width: 80%;border: solid 1px #5544DD; border-collapse: collapse" align="center"> + <thead> + <tr> + <th style="width: 30%; text-align: left; border: solid 1px #337722; background: #CCFFCC">Header 1</th> + <th style="width: 30%; text-align: left; border: solid 1px #337722; background: #CCFFCC">Header 2</th> + </tr> + </thead> + <tbody> +<?php + for ($k=0; $k<13; $k++) { +?> + <tr> + <td style="width: 30%; text-align: left; border: solid 1px #55DD44"> + test de texte assez long pour engendrer des retours à la ligne automatique... + a b c d e f g h i j k l m n o p q r s t u v w x y z + a b c d e f g h i j k l m n o p q r s t u v w x y z + </td> + <td style="width: 70%; text-align: left; border: solid 1px #55DD44"> + test de texte assez long pour engendrer des retours à la ligne automatique... + a b c d e f g h i j k l m n o p q r s t u v w x y z + a b c d e f g h i j k l m n o p q r s t u v w x y z + + </td> + </tr> +<?php + } +?> + </tbody> + <tfoot> + <tr> + <th style="width: 30%; text-align: left; border: solid 1px #337722; background: #CCFFCC">Footer 1</th> + <th style="width: 30%; text-align: left; border: solid 1px #337722; background: #CCFFCC">Footer 2</th> + </tr> + </tfoot> + </table> + <br> + Ca marche !!!<br> + refaisons un test : <br> + <table style="width: 80%;border: solid 1px #5544DD"> +<?php + for ($k=0; $k<12; $k++) { +?> + <tr> + <td style="width: 30%; text-align: left; border: solid 1px #55DD44"> + test de texte assez long pour engendrer des retours à la ligne automatique... + a b c d e f g h i j k l m n o p q r s t u v w x y z + a b c d e f g h i j k l m n o p q r s t u v w x y z + </td> + <td style="width: 70%; text-align: left; border: solid 1px #55DD44"> + test de texte assez long pour engendrer des retours à la ligne automatique... + a b c d e f g h i j k l m n o p q r s t u v w x y z + a b c d e f g h i j k l m n o p q r s t u v w x y z + + </td> + </tr> +<?php + } +?> + </table> + <br> + Ca marche toujours !<br> + De plus, vous pouvez faire des sauts de page manuellement en utilisant les balises &lt;page&gt; &lt;/page&gt;, comme ici par exemple : +</page> +<page pageset="old"> + Nouvelle page !!!! +</page> \ No newline at end of file diff --git a/assets/html2pdf/examples/res/exemple04.php b/assets/html2pdf/examples/res/exemple04.php new file mode 100644 index 0000000..1a0e4a5 --- /dev/null +++ b/assets/html2pdf/examples/res/exemple04.php @@ -0,0 +1,89 @@ +<style type="text/css"> +<!-- +div.special { margin: auto; width:95%; border:1px solid #000000; padding: 2px; } +div.special table { width:100%; border:1px solid #000000; font-size:10px; border-collapse:collapse; } +.topLeftRight { border-top:1px solid #000; border-left:1px solid #000; border-right:1px solid #000;} +.topLeftBottom { border-top:1px solid #000; border-left:1px solid #000; border-bottom:1px solid #000; } +.topLeft { border-top:1px solid #000; border-left:1px solid #000; } +.bottomLeft { border-bottom:1px solid #000; border-left:1px solid #000; } +.topRight { border-top:1px solid #000; border-right:1px solid #000; } +.bottomRight { border-bottom:1px solid #000; border-right:1px solid #000; } +.topRightBottom { border-top:1px solid #000; border-bottom:1px solid #000; border-right:1px solid #000; } +--> +</style> +<page style="font-size: 16px" > + Vous pouvez choisir le format et l'orientation de votre document, en utilisant ceci :<br> + <br> + &lt;page orientation="portrait" format="A5" &gt; <i>A5 en portrait</i> &lt;/page&gt; <br> + <br> + &lt;page orientation="paysage" format="100x200" &gt; <i>100mm x 200mm en paysage</i> &lt;/page&gt;<br> + <br> + En voici un petit exemple ! +</page> +<page orientation="paysage" style="font-size: 18px"> + Ceci est une page en paysage<br> + <table style="width: 100%; border: solid 1px #FFFFFF;"> + <tr> + <td style="width: 30%; border: solid 1px #FF0000;">AAA</td> + <td style="width: 40%; border: solid 1px #00FF00;">BBB</td> + <td style="width: 30%; border: solid 1px #0000FF;">CCC</td> + </tr> + <tr> + <td style="width: 30%; border: solid 1px #FF0000;">AAA</td> + <td style="width: 40%; border: solid 1px #00FF00;">BBB</td> + <td style="width: 30%; border: solid 1px #0000FF;">CCC</td> + </tr> + <tr> + <td style="width: 30%; border: solid 1px #FF0000;">AAA</td> + <td style="width: 40%; border: solid 1px #00FF00;">BBB</td> + <td style="width: 30%; border: solid 1px #0000FF;">CCC</td> + </tr> + </table> + <div style="width: 70%; border: solid 1mm #770000; margin: 1mm; padding: 2mm; font-size: 4mm; line-height: normal; text-align: justify"> + <img src="./res/logo.gif" alt="logo html2pdf" style="float: left; width: 60mm; margin: 2mm;"> + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed elementum, nibh eu ultricies scelerisque, est lorem dignissim elit, quis tempus tortor eros non ipsum. Mauris convallis augue ac sapien. In scelerisque dignissim elit. Donec consequat semper lectus. Sed in quam. Nunc molestie hendrerit ipsum. Curabitur elit risus, rhoncus ut, mattis a, convallis eu, neque. Morbi luctus est sit amet nunc. In nisl. Donec magna libero, aliquet eu, vestibulum ut, mollis sed, felis. + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed elementum, nibh eu ultricies scelerisque, est lorem dignissim elit, quis tempus tortor eros non ipsum. Mauris convallis augue ac sapien. In scelerisque dignissim elit. Donec consequat semper lectus. Sed in quam. Nunc molestie hendrerit ipsum. Curabitur elit risus, rhoncus ut, mattis a, convallis eu, neque. Morbi luctus est sit amet nunc. In nisl. Donec magna libero, aliquet eu, vestibulum ut, mollis sed, felis. + </div> + <div style="width: 70%; border: solid 1mm #770000; margin: 1mm; padding: 2mm; font-size: 4mm; line-height: 150%;text-align: right;"> + <img src="./res/logo.gif" alt="logo html2pdf" style="float: right; width: 60mm; margin: 2mm; "> + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed elementum, nibh eu ultricies scelerisque, est lorem dignissim elit, quis tempus tortor eros non ipsum. Mauris convallis augue ac sapien. In scelerisque dignissim elit. Donec consequat semper lectus. Sed in quam. Nunc molestie hendrerit ipsum. Curabitur elit risus, rhoncus ut, mattis a, convallis eu, neque. Morbi luctus est sit amet nunc. In nisl. Donec magna libero, aliquet eu, vestibulum ut, mollis sed, felis. + </div> + <fieldset style="width: 70%; border: solid 1mm #770000; margin: 1mm; padding: 2mm; padding-top: 0mm; font-size: 4mm; line-height: normal; background: #FFFFFF;"> + <legend style=" background: #FFFFFF; padding: 1; border: solid 1px #440000;">Ceci est un exemple de fieldset</legend> + <img src="./res/logo.gif" alt="logo html2pdf" style="float: left; width: 60mm; margin: 2mm; "> + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed elementum, nibh eu ultricies scelerisque, est lorem dignissim elit, quis tempus tortor eros non ipsum. Mauris convallis augue ac sapien. In scelerisque dignissim elit. Donec consequat semper lectus. Sed in quam. Nunc molestie hendrerit ipsum. Curabitur elit risus, rhoncus ut, mattis a, convallis eu, neque. Morbi luctus est sit amet nunc. In nisl. Donec magna libero, aliquet eu, vestibulum ut, mollis sed, felis. + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed elementum, nibh eu ultricies scelerisque, est lorem dignissim elit, quis tempus tortor eros non ipsum. Mauris convallis augue ac sapien. In scelerisque dignissim elit. Donec consequat semper lectus. Sed in quam. Nunc molestie hendrerit ipsum. Curabitur elit risus, rhoncus ut, mattis a, convallis eu, neque. Morbi luctus est sit amet nunc. In nisl. Donec magna libero, aliquet eu, vestibulum ut, mollis sed, felis. + </fieldset> +</page> +<page orientation="portrait" format="150x200" style="font-size: 18px"> + Ceci est une page en portrait de 150mm x 200mm<br> + <table style="width: 100%; border: solid 1px #FFFFFF;"> + <tr> + <td style="width: 30%; border: solid 1px #FF0000;">AAA</td> + <td style="width: 40%; border: solid 1px #00FF00;">BBB</td> + <td style="width: 30%; border: solid 1px #0000FF;">CCC</td> + </tr> + <tr> + <td style="width: 30%; border: solid 1px #FF0000;">AAA</td> + <td style="width: 40%; border: solid 1px #00FF00;">BBB</td> + <td style="width: 30%; border: solid 1px #0000FF;">CCC</td> + </tr> + <tr> + <td style="width: 30%; border: solid 1px #FF0000;">AAA</td> + <td style="width: 40%; border: solid 1px #00FF00;">BBB</td> + <td style="width: 30%; border: solid 1px #0000FF;">CCC</td> + </tr> + </table> + <br> + <div class="special"> + <table> + <tr> + <td colspan="2" class="topLeftRight" style="width: 100%; text-align:left;border-bottom:1px dashed #000000">blabla blabla</td> + </tr> + <tr> + <td class="bottomLeft" style="width:70%;border-right:1px dashed #000000;text-align:left;">blabla blabla</td> + <td class="bottomRight" style="width: 30%; text-align:left;vertical-align:top;">Date :<br /> Signature :</td> + </tr> + </table> + </div> +</page> \ No newline at end of file diff --git a/assets/html2pdf/examples/res/exemple05.php b/assets/html2pdf/examples/res/exemple05.php new file mode 100644 index 0000000..d92548e --- /dev/null +++ b/assets/html2pdf/examples/res/exemple05.php @@ -0,0 +1,71 @@ +<style type="text/css"> +<!-- +table +{ + width: 100%; + border: solid 1px #5544DD; +} + +th +{ + text-align: center; + border: solid 1px #113300; + background: #EEFFEE; +} + +td +{ + text-align: left; + border: solid 1px #55DD44; +} + +td.col1 +{ + border: solid 1px red; + text-align: right; +} + +--> +</style> +<span style="font-size: 20px; font-weight: bold">Démonstration des retour à la ligne automatique, ainsi que des sauts de page automatique<br></span> +<br> +<br> +<table> + <col style="width: 5%" class="col1"> + <col style="width: 25%"> + <col style="width: 30%"> + <col style="width: 40%"> + <thead> + <tr> + <th rowspan="2">n°</th> + <th colspan="3" style="font-size: 16px;"> + Titre du tableau + </th> + </tr> + <tr> + <th>Colonne 1</th> + <th>Colonne 2</th> + <th>Colonne 3</th> + </tr> + </thead> +<?php + for ($k=0; $k<50; $k++) { +?> + <tr> + <td><?php echo $k; ?></td> + <td>test de texte assez long pour engendrer des retours à la ligne automatique...</td> + <td>test de texte assez long pour engendrer des retours à la ligne automatique...</td> + <td>test de texte assez long pour engendrer des retours à la ligne automatique...</td> + </tr> +<?php + } +?> + <tfoot> + <tr> + <th colspan="4" style="font-size: 16px;"> + bas du tableau + </th> + </tr> + </tfoot> +</table> +Cool non ?<br> \ No newline at end of file diff --git a/assets/html2pdf/examples/res/exemple06.css b/assets/html2pdf/examples/res/exemple06.css new file mode 100644 index 0000000..7825066 --- /dev/null +++ b/assets/html2pdf/examples/res/exemple06.css @@ -0,0 +1,12 @@ +.titre +{ + text-decoration: underline; +} + +* {color: #FF0000; } +H1 {color: #AA0055; } +H2 {color: #990066; } +H3 {color: #880077; } +H4 {color: #770088; } +H5 {color: #660099; } +H6 {color: #5500AA; } \ No newline at end of file diff --git a/assets/html2pdf/examples/res/exemple06.php b/assets/html2pdf/examples/res/exemple06.php new file mode 100644 index 0000000..a904e44 --- /dev/null +++ b/assets/html2pdf/examples/res/exemple06.php @@ -0,0 +1,45 @@ +<link type="text/css" href="./res/exemple06.css" rel="stylesheet" > +<style type="text/css"> +<!-- +/* commentaire dans un css */ +table, td { border: solid 1px #000000; color: #0000AA; } +td.col1 { color: #00AA00; } + +/* autre commentaire */ +table.liste { border: solid 2px #FF0000; } +table.liste td { background: #DDDDDD; } +table.liste td.col1 { color: #FF0000; } +--> +</style> +<page> + <table> + <tr> + <td>Ceci est un</td> + <td class="col1">test de style</td> + </tr> + </table> + <br> + <table class="liste"> + <tr> + <td>Ceci est un</td> + <td class="col1">test de style</td> + </tr> + </table> + <br> + <H1>Essai de titre en H1</H1> + <H2>Essai de titre en H2</H2> + <H3>Essai de titre en H3</H3> + <H4>Essai de titre en H4</H4> + <H5>Essai de titre en H5</H5> + <H6>Essai de titre en H6</H6> + <H6 class="titre">Essai de titre en H6</H6> + <H5 class="titre">Essai de titre en H5</H5> + <H4 class="titre">Essai de titre en H4</H4> + <H3 class="titre">Essai de titre en H3</H3> + <H2 class="titre">Essai de titre en H2</H2> + <H1 class="titre">Essai de titre en H1</H1> + <br> + <s>Texte barré !</s><br> + <br> + <span>Texte avec la couleur par défault (style *)</span><br> +</page> \ No newline at end of file diff --git a/assets/html2pdf/examples/res/exemple07a.php b/assets/html2pdf/examples/res/exemple07a.php new file mode 100644 index 0000000..57c4d82 --- /dev/null +++ b/assets/html2pdf/examples/res/exemple07a.php @@ -0,0 +1,132 @@ +<style type="text/css"> +<!-- +table { vertical-align: top; } +tr { vertical-align: top; } +td { vertical-align: top; } +} +--> +</style> +<page backcolor="#FEFEFE" backimg="./res/bas_page.png" backimgx="center" backimgy="bottom" backimgw="100%" backtop="0" backbottom="30mm" footer="date;heure;page" style="font-size: 12pt"> + <bookmark title="Lettre" level="0" ></bookmark> + <table cellspacing="0" style="width: 100%; text-align: center; font-size: 14px"> + <tr> + <td style="width: 75%;"> + </td> + <td style="width: 25%; color: #444444;"> + <img style="width: 100%;" src="./res/logo.gif" alt="Logo"><br> + RELATION CLIENT + </td> + </tr> + </table> + <br> + <br> + <table cellspacing="0" style="width: 100%; text-align: left; font-size: 11pt;"> + <tr> + <td style="width:50%;"></td> + <td style="width:14%; ">Client :</td> + <td style="width:36%">M. Albert Dupont</td> + </tr> + <tr> + <td style="width:50%;"></td> + <td style="width:14%; ">Adresse :</td> + <td style="width:36%"> + Résidence perdue<br> + 1, rue sans nom<br> + 00 000 - Pas de Ville<br> + </td> + </tr> + <tr> + <td style="width:50%;"></td> + <td style="width:14%; ">Email :</td> + <td style="width:36%">nomail@domain.com</td> + </tr> + <tr> + <td style="width:50%;"></td> + <td style="width:14%; ">Tel :</td> + <td style="width:36%">33 (0) 1 00 00 00 00</td> + </tr> + </table> + <br> + <br> + <table cellspacing="0" style="width: 100%; text-align: left;font-size: 10pt"> + <tr> + <td style="width:50%;"></td> + <td style="width:50%; ">Spipu Ville, le <?php echo date('d/m/Y'); ?></td> + </tr> + </table> + <br> + <i> + <b><u>Objet </u>: &laquo; Bon de Retour &raquo;</b><br> + Compte client : 00C4520100A<br> + Référence du Dossier : 71326<br> + </i> + <br> + <br> + Madame, Monsieur, Cher Client,<br> + <br> + <br> + Nous souhaitons vous informer que le dossier <b>71326</b> concernant un &laquo; Bon de Retour &raquo; pour les articles suivants a été accepté.<br> + <br> + <table cellspacing="0" style="width: 100%; border: solid 1px black; background: #E7E7E7; text-align: center; font-size: 10pt;"> + <tr> + <th style="width: 12%">Produit</th> + <th style="width: 52%">Désignation</th> + <th style="width: 13%">Prix Unitaire</th> + <th style="width: 10%">Quantité</th> + <th style="width: 13%">Prix Net</th> + </tr> + </table> +<?php + $nb = rand(5, 11); + $produits = array(); + $total = 0; + for ($k=0; $k<$nb; $k++) { + $num = rand(100000, 999999); + $nom = "le produit n°".rand(1, 100); + $qua = rand(1, 20); + $prix = rand(100, 9999)/100.; + $total+= $prix*$qua; + $produits[] = array($num, $nom, $qua, $prix, rand(0, $qua)); +?> + <table cellspacing="0" style="width: 100%; border: solid 1px black; background: #F7F7F7; text-align: center; font-size: 10pt;"> + <tr> + <td style="width: 12%; text-align: left"><?php echo $num; ?></td> + <td style="width: 52%; text-align: left"><?php echo $nom; ?></td> + <td style="width: 13%; text-align: right"><?php echo number_format($prix, 2, ',', ' '); ?> &euro;</td> + <td style="width: 10%"><?php echo $qua; ?></td> + <td style="width: 13%; text-align: right;"><?php echo number_format($prix*$qua, 2, ',', ' '); ?> &euro;</td> + </tr> + </table> +<?php + } +?> + <table cellspacing="0" style="width: 100%; border: solid 1px black; background: #E7E7E7; text-align: center; font-size: 10pt;"> + <tr> + <th style="width: 87%; text-align: right;">Total : </th> + <th style="width: 13%; text-align: right;"><?php echo number_format($total, 2, ',', ' '); ?> &euro;</th> + </tr> + </table> + <br> + Cette reprise concerne la quantité et les matériels dont la référence figure sur le <a href="#document_reprise">document de reprise joint</a>.<br> + Nous vous demandons de nous retourner ces produits en parfait état et dans leur emballage d'origine.<br> + <br> + Nous vous demandons également de coller impérativement l'autorisation de reprise jointe, sur le colis à reprendre afin de faciliter le traitement à l'entrepôt.<br> + <br> + Notre Service Clients ne manquera pas de revenir vers vous dès que l'avoir de ces matériels sera établi.<br> + <nobreak> + <br> + Dans cette attente, nous vous prions de recevoir, Madame, Monsieur, Cher Client, nos meilleures salutations.<br> + <br> + <table cellspacing="0" style="width: 100%; text-align: left;"> + <tr> + <td style="width:50%;"></td> + <td style="width:50%; "> + Mle Jesuis CELIBATAIRE<br> + Service Relation Client<br> + Tel : 33 (0) 1 00 00 00 00<br> + Email : on_va@chez.moi<br> + </td> + </tr> + </table> + </nobreak> +</page> \ No newline at end of file diff --git a/assets/html2pdf/examples/res/exemple07b.php b/assets/html2pdf/examples/res/exemple07b.php new file mode 100644 index 0000000..a6430ec --- /dev/null +++ b/assets/html2pdf/examples/res/exemple07b.php @@ -0,0 +1,176 @@ +<page orientation="paysage" > + <bookmark title="Document" level="0" ></bookmark> + <a name="document_reprise"></a> + <table cellspacing="0" style="width: 100%;"> + <tr> + <td style="width: 10%;"> + <img style="width: 100%" src="./res/logo.gif" alt="Logo HTML2PDF" > + </td> + <td style="width: 80%; text-align: center; text-decoration: underline; font-weight: bold; font-size: 20pt;"> + <span style="font-size: 10pt"><br></span> + ACCORD DE RETOUR + </td> + <td style="width: 10%;"> + </td> + </tr> + </table> + <table cellspacing="0" style="width: 100%;"> + <tr> + <td style="width: 55% "> + <table cellspacing="0" style="width: 100%; border: solid 2px #000000; "> + <tr> + <td style="width: 100%; font-size: 12pt;"> + <span style="font-size: 15pt; font-weight: bold;">ADRESSE DE RETOUR<br></span> + <br> + <b>Entrepot des Bois</b><br> + sur une grande route<br> + 00000 - Spipu Ville<br> + <br> + Date : <?php echo date('d/m/Y'); ?><br> + Dossier suivi par <b>Mle Jesuis CELIBATAIRE</b><br> + Tel : 33 (0) 1 00 00 00 00<br> + Email : on_va@chez.moi<br> + </td> + </tr> + </table> + <br>&nbsp; + </td> + <td style="width: 4%"></td> + <td style="width: 37% "> + <table cellspacing="0" style="width: 100%; border: solid 2px #000000; font-size: 12pt;"> + <tr><td style="width: 40%;">Référence : </td><td style="width: 60%;">71326</td></tr> + <tr><td style="width: 40%;">Client : </td><td style="width: 60%;">M. Albert Dupont</td></tr> + <tr><td style="width: 40%;">Adresse : </td><td style="width: 60%;">Résidence perdue<br>1, rue sans nom<br>00 000 - Pas de Ville</td></tr> + <tr><td style="width: 40%;">TEL : </td><td style="width: 60%;">33 (0) 1 00 00 00 00</td></tr> + <tr><td style="width: 40%;">FAX : </td><td style="width: 60%;">33 (0) 1 00 00 00 01</td></tr> + <tr><td style="width: 40%;">Code Client : </td><td style="width: 60%;">00C4520100A</td></tr> + </table> + <table cellspacing="0" style="width: 100%; border: solid 2px #000000"> + <tr> + <th style="width: 40%;">Motif de la Reprise</th> + <td style="width: 60%;">Produit non Conforme</td> + </tr> + </table> + <br> + </td> + <td style="width: 4%"></td> + </tr> + <tr> + <td style="width:55%;"> + <table cellspacing="0" style="padding: 1px; width: 100%; border: solid 2px #000000; font-size: 11pt; "> + <tr> + <th style="width: 100%; text-align: center; border: solid 1px #000000;" colspan="4"> + Partie réservée à Spipu Corp + </th> + </tr> + <tr> + <th style="width: 100%; text-align: center; border: solid 1px #000000;" colspan="4"> + QUANTITE PREVUE AU CHARGEMENT + </th> + </tr> + <tr> + <th style="width: 15%; border: solid 1px #000000;">Produit</th> + <th style="width: 55%; border: solid 1px #000000;">Designation</th> + <th style="width: 15%; border: solid 1px #000000;">Neuf</th> + <th style="width: 15%; border: solid 1px #000000;">Abîmé</th> + </tr> +<?php +$i=0; +foreach ($produits as $produit) { + $i++; +?> + <tr> + <td style="width: 15%; border: solid 1px #000000;"><?php echo $produit[0]; ?></td> + <td style="width: 55%; border: solid 1px #000000;text-align: left;"><?php echo $produit[1]; ?></td> + <td style="width: 15%; border: solid 1px #000000;"><?php echo $produit[4]; ?></td> + <td style="width: 15%; border: solid 1px #000000;"><?php echo $produit[2]-$produit[4]; ?></td> + </tr> + +<?php +} +for ($i; $i<12; $i++) { +?> + <tr> + <td style="width: 15%; border: solid 1px #000000;">&nbsp;</td> + <td style="width: 55%; border: solid 1px #000000;">&nbsp;</td> + <td style="width: 15%; border: solid 1px #000000;">&nbsp;</td> + <td style="width: 15%; border: solid 1px #000000;">&nbsp;</td> + </tr> +<?php +} +?> + </table> + <br> + <table cellspacing="0" style="width: 100%; text-align: left; font-size: 8pt"> + <tr> + <td style="width: 100%"> + <b><u>Conditions des Retours</u></b><br> + 1 - il faut des conditions<br> + 2 - encore des conditions<br> + 3 - toujours des conditions<br> + </td> + </tr> + </table> + <br> + <table cellspacing="0" style="width: 100%; border: solid 2px #000000; text-align: center; font-size: 10pt"> + <tr> + <td style="width: 30%"></td> + <td style="width: 40%">ACCORD SOCIETE</td> + <td style="width: 30%"></td> + </tr> + <tr> + <td style="width: 30%"><br><br>M. XX</td> + <td style="width: 40%"></td> + <td style="width: 30%"><br><br>Mme XY</td> + </tr> + </table> + </td> + <td style="width: 4%"></td> + <td style="width: 37%;"> + <table cellspacing="0" style="padding: 1px; width: 100%; border: solid 2px #000000; font-size: 11pt; "> + <tr> + <th style="width: 100%; text-align: center; border: solid 1px #000000;" colspan="2"> + Partie réservée à l'entrepôt + </th> + </tr> + <tr> + <th style="width: 100%; text-align: center; border: solid 1px #000000;" colspan="2"> + QUANTITE PREVUE AU CHARGEMENT + </th> + </tr> + <tr> + <th style="width: 50%; border: solid 1px #000000;">Produit neuf </th> + <th style="width: 50%; border: solid 1px #000000;">Produit à reconditionner </th> + </tr> +<?php + for ($i=0; $i<12; $i++) { +?> + <tr> + <td style="width: 50%; border: solid 1px #000000;">&nbsp;</td> + <td style="width: 50%; border: solid 1px #000000;">&nbsp;</td> + </tr> +<?php + } +?> + </table> + <br> + <table cellspacing="0" style="width: 100%; border: solid 2px #000000; text-align: left; font-size: 10pt"> + <tr> + <th style="width: 30%;"> + Commentaire<br> + Retour :<br> + &nbsp;<br> + &nbsp;<br> + </th> + <td style="width: 70%;"> + </td> + </tr> + </table> + <br> + <br> + <span style="font-size: 13pt"><b><u>A COLLER IMPERATIVEMENT SUR LES COLIS</u></b></span> + </td> + <td style="width: 4%"></td> + </tr> + </table> +</page> \ No newline at end of file diff --git a/assets/html2pdf/examples/res/exemple08.php b/assets/html2pdf/examples/res/exemple08.php new file mode 100644 index 0000000..bffd99a --- /dev/null +++ b/assets/html2pdf/examples/res/exemple08.php @@ -0,0 +1,114 @@ +<style type="text/css"> +<!-- +table +{ + padding: 0; + border: solid 1mm LawnGreen; + font-size: 12pt; + background: #FFFFFF; + text-align: center; + vertical-align: middle; +} + +td +{ + padding: 1mm; + border: solid 1mm black; +} + +td.div +{ + width: 110px; + height: 110px; + text-align: left; + padding: 0 +} + +td.div div +{ + margin: auto; + background: yellow; + border: solid 2px blue; + color: red; + width: 100px; + height: 65px; + text-align: center; +} + +--> +</style> +<page backcolor="#AACCFF" backleft="5mm" backright="5mm" backtop="10mm" backbottom="10mm" > + <table> + <tr> + <td class="div"><div style="rotate: 0;">Hello ! ceci <b>est</b> un test !<br><img src="./res/logo.png" style="width: 80px;" alt="logo"></div></td> + <td class="div"><div style="rotate: 270;">Hello ! ceci <b>est</b> un test !<br><img src="./res/logo.png" style="width: 80px;" alt="logo"></div></td> + </tr> + <tr> + <td class="div"><div style="rotate: 90;">Hello ! ceci <b>est</b> un test !<br><img src="./res/logo.png" style="width: 80px;" alt="logo"></div></td> + <td class="div"><div style="rotate: 180;">Hello ! ceci <b>est</b> un test !<br><img src="./res/logo.png" style="width: 80px;" alt="logo"></div></td> + </tr> + </table> + <br> + <table cellspacing="4"> + <tr> + <td>a A1</td> + <td>aa A2</td> + <td>aaa A3</td> + <td>aaaa A4</td> + </tr> + <tr> + <td rowspan="2">B1</td> + <td style="font-size: 16pt">B2</td> + <td colspan="2">B3</td> + </tr> + <tr> + <td>C1</td> + <td>C2</td> + <td>C3</td> + </tr> + <tr> + <td colspan="2">D1</td> + <td colspan="2">D2</td> + </tr> + </table> + <hr> + <table> + <tr> + <td colspan="2">CoucouCoucou !</td> + <td>B</td> + <td>CC</td> + </tr> + <tr> + <td>AA</td> + <td colspan="2">CoucouCoucou !</td> + <td>CC</td> + </tr> + <tr> + <td>AA</td> + <td>B</td> + <td colspan="2">CoucouCoucou !</td> + </tr> + </table> + <hr> + <table style="background: #FFFFFF"> + <tr> + <td>AA</td> + <td>AA</td> + <td>AA</td> + <td rowspan="2">AA</td> + </tr> + <tr> + <td>AA</td> + <td rowspan="2" colspan="2" >CoucouCoucou !</td> + </tr> + <tr> + <td>AA</td> + <td>CC</td> + </tr> + <tr> + <td colspan="2">D1</td> + <td colspan="2">D2</td> + </tr> + </table> + <hr> +</page> \ No newline at end of file diff --git a/assets/html2pdf/examples/res/exemple09.png.php b/assets/html2pdf/examples/res/exemple09.png.php new file mode 100644 index 0000000..48a2c93 --- /dev/null +++ b/assets/html2pdf/examples/res/exemple09.png.php @@ -0,0 +1,24 @@ +<?php + $px = isset($_GET['px']) ? $_GET['px'] : 0; $px = preg_replace('/[^0-9]/isU', '', $px); + $py = isset($_GET['py']) ? $_GET['py'] : 0; $py = preg_replace('/[^0-9]/isU', '', $py); + + if ($px<1) $px = 5; + if ($py<1) $py = 5; + + if ($px>20) $px = 20; + if ($py>20) $py = 20; + + $width = 100; + $height = 100; + $im = imagecreatetruecolor($width, $height); + + for ($y=0; $y<$height; $y+= $py) { + for ($x=0; $x<$width; $x+= $px) { + $c = imagecolorallocate($im, 200-$x, 100+$y, 100+$x-$y); + imagefilledrectangle($im, $x, $y, $x+$px, $y+$py, $c); + } + } + + header("Content-type: image/png"); + imagepng($im); + imagedestroy($im); diff --git a/assets/html2pdf/examples/res/exemple10.php b/assets/html2pdf/examples/res/exemple10.php new file mode 100644 index 0000000..01541bd --- /dev/null +++ b/assets/html2pdf/examples/res/exemple10.php @@ -0,0 +1,120 @@ +<style type="text/css"> +<!-- +div.minifiche +{ + position: relative; + overflow: hidden; + width: 454px; + height: 138px; + padding: 0; + font-size: 11px; + text-align: left; + font-weight: normal; + background-image: url(./res/exemple10a.gif); +} +div.minifiche img.icone { position: absolute; border: none; left: 5px; top: 5px; width: 240px; height: 128px;overflow: hidden; } +div.minifiche div.zone1 { position: absolute; border: none; left: 257px; top: 8px; width: 188px; height: 14px; padding-top: 1px; overflow: hidden; text-align: center; font-weight: bold; } +div.minifiche div.zone2 { position: absolute; border: none; left: 315px; top: 28px; width: 131px; height: 14px; padding-top: 1px; overflow: hidden; text-align: left; font-weight: normal; } +div.minifiche div.zone3 { position: absolute; border: none; left: 315px; top: 48px; width: 131px; height: 14px; padding-top: 1px; overflow: hidden; text-align: left; font-weight: normal; } +div.minifiche div.zone4 { position: absolute; border: none; left: 315px; top: 68px; width: 131px; height: 14px; padding-top: 1px; overflow: hidden; text-align: left; font-weight: normal; } +div.minifiche div.zone5 { position: absolute; border: none; left: 315px; top: 88px; width: 131px; height: 14px; padding-top: 1px; overflow: hidden; text-align: left; font-weight: normal; } +div.minifiche div.download { position: absolute; border: none; left: 257px; top: 108px;width: 188px; height: 22px; overflow: hidden; text-align: center; font-weight: normal; } +--> +</style> +<page> + <div style="position: absolute; width: 10mm; height: 10mm; left: 0; top: 0; border: solid 2px #0000EE; background: #AAAAEE"></div> + <div style="position: absolute; width: 10mm; height: 10mm; right: 0; top: 0; border: solid 2px #00EE00; background: #AAEEAA"></div> + <div style="position: absolute; width: 10mm; height: 10mm; left: 0; bottom: 0; border: solid 2px #EE0000; background: #EEAAAA"></div> + <div style="position: absolute; width: 10mm; height: 10mm; right: 0; bottom: 0; border: solid 2px #EEEE00; background: #EEEEAA"></div> + <table style="width: 100%"> + <tr> + <td style="text-indent: 10mm; border: solid 1px #007700; width: 80%"> + <p> + Ligne dans un paragraphe, + test de texte assez long pour engendrer des retours à la ligne automatique... a b c d e f g h i j k l m n o p q r s t u v w x y z a b c d e f g h i j k l m n o p q r s t u v w x y z + test de texte assez long pour engendrer des retours à la ligne automatique... a b c d e f g h i j k l m n o p q r s t u v w x y z a b c d e f g h i j k l m n o p q r s t u v w x y z + </p> + <p> + Ligne dans un paragraphe, + test de texte assez long pour engendrer des retours à la ligne automatique... a b c d e f g h i j k l m n o p q r s t u v w x y z a b c d e f g h i j k l m n o p q r s t u v w x y z + test de texte assez long pour engendrer des retours à la ligne automatique... a b c d e f g h i j k l m n o p q r s t u v w x y z a b c d e f g h i j k l m n o p q r s t u v w x y z + </p> + </td> + <td style="border: solid 1px #000077; width: 20%"> + Test de paragraphe :) + </td> + </tr> + </table> + <hr> + <div class="minifiche" > + <img class="icone" src="./res/exemple10b.jpg" alt="HTML2PDF" > + <div class="zone1">HTML2PDF</div> + <div class="zone2">PHP</div> + <div class="zone3">Utilitaire</div> + <div class="zone4">1.00</div> + <div class="zone5">01/01/1901</div> + <div class="download"><img src="./res/exemple10c.gif" alt="" style="border: none;"></div> + </div> + <hr> + <div style="border: solid 1px #000000; margin: 0; padding: 0; background: rgb(255, 255, 255); width: 400px; height: 300px; position: relative;"> + <div style="border-style: solid; border-color: transparent rgb(170, 34, 34) rgb(170, 34, 34) transparent; border-width: 39.5px 59px; position: absolute; left: 101px; top: 52px; height: 0pt; width: 0pt;"></div> + <div style="border-style: solid; border-color: rgb(34, 170, 34) rgb(34, 170, 34) transparent transparent; border-width: 59px 39.5px; position: absolute; left: 101px; top: 131px; height: 0pt; width: 0pt;"></div> + <div style="border-style: solid; border-color: rgb(34, 34, 170) transparent transparent rgb(34, 34, 170); border-width: 39.5px 59px; position: absolute; left: 180px; top: 170px; height: 0pt; width: 0pt;"></div> + <div style="border-style: solid; border-color: transparent transparent rgb(170, 170, 34) rgb(170, 170, 34); border-width: 59px 39.5px; position: absolute; left: 219px; top: 52px; height: 0pt; width: 0pt;"></div> + <div style="position: absolute; left: 10px; top: 10px; font-size: 20px; font-family: Arial;">Exemple</div> + </div> + <hr> + <pre><?php + ob_start(); + readfile(dirname(__FILE__).'/../exemple10.php'); + echo htmlentities(ob_get_clean()); + ?></pre> +</page> +<page orientation="paysage" > +<style type="text/css"> +<!-- + +div.main +{ + padding: 0; + margin: 0; + position: relative; + left: 50%; + margin-left: -80mm; + width: 160mm; + height: 100mm; + text-align: center; + border: solid 10px #111111; + background: #222222; + color: #FFFFFF; + font-size: 10pt; + font-weight: bold; + text-align: center; +} + +div.main a +{ + text-decoration: none; + color: #EEEEEE; +} + +div.main a:hover +{ + text-decoration: underline; + color: #FFFFFF; +} +--> +</style> + <div class="main"> + <div style="position: absolute; top: 5mm; left: 5mm; font-size:12pt;text-align: left;">Spipu.net</div><br> + <div style="position: absolute; bottom: 5mm; right: 5mm; font-size:12pt; text-align: right; ">(c)2011 Spipu</div> + <br><br><br> + <a href="http://cineblog.spipu.net/" >Cineblog by Spipu </a><br><br> + <a href="http://html2pdf.fr/" >HTML2PDF </a><br><br> + <a href="http://lambda.spipu.net/" >Lambda Finder </a><br><br> + <a href="http://open.spipu.net/" >Gestion des Opens - Yaronet </a><br><br> + <a href="http://perso.spipu.net/" >A propos de moi </a><br><br> + <a href="http://prgm.spipu.net/" >Programmes by Spipu </a><br><br> + <br><br><br> + </div> +</page> \ No newline at end of file diff --git a/assets/html2pdf/examples/res/exemple10a.gif b/assets/html2pdf/examples/res/exemple10a.gif new file mode 100644 index 0000000..c575f1c Binary files /dev/null and b/assets/html2pdf/examples/res/exemple10a.gif differ diff --git a/assets/html2pdf/examples/res/exemple10b.jpg b/assets/html2pdf/examples/res/exemple10b.jpg new file mode 100644 index 0000000..2c4b7aa Binary files /dev/null and b/assets/html2pdf/examples/res/exemple10b.jpg differ diff --git a/assets/html2pdf/examples/res/exemple10c.gif b/assets/html2pdf/examples/res/exemple10c.gif new file mode 100644 index 0000000..955d498 Binary files /dev/null and b/assets/html2pdf/examples/res/exemple10c.gif differ diff --git a/assets/html2pdf/examples/res/exemple11.php b/assets/html2pdf/examples/res/exemple11.php new file mode 100644 index 0000000..9423f40 --- /dev/null +++ b/assets/html2pdf/examples/res/exemple11.php @@ -0,0 +1,27 @@ +<div style="border: 1px solid rgb(0, 0, 0); margin: 0; padding: 0; background: rgb(255, 255, 255); width: 400px; height: 300px;"> + <div style="border-style: solid; border-color: transparent rgb(170, 34, 170) rgb(170, 34, 170) transparent; border-width: 18px 56px; position: absolute; left: 111px; top: 69px; height: 0pt; width: 0pt;"></div><div style="border-style: solid; border-color: rgb(170, 34, 170) transparent transparent rgb(170, 34, 170); border-width: 18px 9px; position: absolute; left: 223px; top: 69px; height: 0pt; width: 0pt;"></div><div style="border-style: solid; border-color: transparent rgb(170, 34, 170) rgb(170, 34, 170) transparent; border-width: 3px 9px; position: absolute; left: 223px; top: 63px; height: 0pt; width: 0pt;"></div><div style="border-style: solid; border-color: rgb(170, 34, 170) transparent transparent rgb(170, 34, 170); border-width: 3px 1.5px; position: absolute; left: 241px; top: 63px; height: 0pt; width: 0pt;"></div><div style="border-style: solid; border-color: transparent rgb(170, 34, 170) rgb(170, 34, 170) transparent; border-width: 0.5px 1.5px; position: absolute; left: 241px; top: 62px; height: 0pt; width: 0pt;"></div><div style="border-style: solid; border-color: rgb(170, 34, 170) rgb(170, 34, 170) transparent transparent; border-width: 67px 22px; position: absolute; left: 111px; top: 105px; height: 0pt; width: 0pt;"></div><div style="border-style: solid; border-color: rgb(170, 34, 170) transparent transparent rgb(170, 34, 170); border-width: 67px 34px; position: absolute; left: 155px; top: 105px; height: 0pt; width: 0pt;"></div><div style="border-style: solid; border-color: transparent rgb(34, 170, 170) rgb(34, 170, 170) transparent; border-width: 67px 33.5px; position: absolute; left: 178px; top: 61px; height: 0pt; width: 0pt;"></div><div style="border-style: solid; border-color: transparent transparent rgb(34, 170, 170) rgb(34, 170, 170); border-width: 67px 22px; position: absolute; left: 245px; top: 61px; height: 0pt; width: 0pt;"></div><div style="border-style: solid; border-color: rgb(34, 170, 170) transparent transparent rgb(34, 170, 170); border-width: 18px 55.5px; position: absolute; left: 178px; top: 195px; height: 0pt; width: 0pt;"></div><div style="border-style: solid; border-color: transparent rgb(34, 170, 170) rgb(34, 170, 170) transparent; border-width: 18px 9px; position: absolute; left: 160px; top: 195px; height: 0pt; width: 0pt;"></div><div style="border-style: solid; border-color: rgb(34, 170, 170) transparent transparent rgb(34, 170, 170); border-width: 3px 9px; position: absolute; left: 160px; top: 231px; height: 0pt; width: 0pt;"></div><div style="border-style: solid; border-color: transparent rgb(34, 170, 170) rgb(34, 170, 170) transparent; border-width: 3px 1.5px; position: absolute; left: 157px; top: 231px; height: 0pt; width: 0pt;"></div><div style="border-style: solid; border-color: rgb(34, 170, 170) transparent transparent rgb(34, 170, 170); border-width: 0.5px 1.5px; position: absolute; left: 157px; top: 237px; height: 0pt; width: 0pt;"></div> +</div> +<hr> +<table style="width:100%;"> + <tr> + <td id="mon_td_trop_grand" style="width:100%;"> + Test de TD très grand, en désactivant le test de TD ne devant pas depasser une page<br> + via la méthode <b>setTestTdInOnePage</b>.<br> + <table style="width:100%;"> +<?php + for ($i=0; $i<=40; $i++) { +?> + <tr> + <td style="border:1px solid red;width:100%;"> + test de texte assez long pour engendrer des retours à la ligne automatique... + a b c d e f g h i j k l m n o p q r s t u v w x y z + a b c d e f g h i j k l m n o p q r s t u v w x y z + </td> + </tr> +<?php + } +?> + </table> + </td> + </tr> +</table> \ No newline at end of file diff --git a/assets/html2pdf/examples/res/exemple12.php b/assets/html2pdf/examples/res/exemple12.php new file mode 100644 index 0000000..dcebe84 --- /dev/null +++ b/assets/html2pdf/examples/res/exemple12.php @@ -0,0 +1,114 @@ +<?php + $chaine = 'test de texte assez long pour engendrer des retours à la ligne automatique...'; + $chaine.= ', répétitif car besoin d\'un retour à la ligne'; + $chaine.= ', répétitif car besoin d\'un retour à la ligne'; + $chaine.= ', répétitif car besoin d\'un retour à la ligne'; + $chaine.= ', répétitif car besoin d\'un retour à la ligne'; +?> +<style type="text/css"> +<!-- +ul +{ + background: #FFDDDD; + border: solid 1px #FF0000; +} + +ol +{ + background: #DDFFDD; + border: solid 1px #00FF00; +} + +ul li +{ + background: #DDFFAA; + border: solid 1px #AAFF00; +} + +ol li +{ + background: #AADDFF; + border: solid 1px #00AAFF; +} +--> +</style> +<page style="font-size: 11px"> + <ul style="list-style-type: disc; width: 80%"> + <li> + Point 1 :<br><?php echo $chaine; ?> + </li> + <li> + Point 2 :<br><?php echo $chaine; ?> + <ul style="list-style-type: circle"> + <li> + Point 1 :<br><?php echo $chaine; ?> + </li> + <li> + Point 2 :<br><?php echo $chaine; ?> + <ul style="list-style-type: square"> + <li> + Point 1 :<br><?php echo $chaine; ?> + </li> + <li> + Point 2 :<br><?php echo $chaine; ?> + </li> + <li> + Point 3 :<br><?php echo $chaine; ?> + <ul style="list-style-image: url(./res/puce.gif)"> + <li> + Puce en image 1 :<br><?php echo $chaine; ?> + </li> + <li> + Puce en image 2 :<br><?php echo $chaine; ?> + </li> + <li> + Puce en image 3 :<br><?php echo $chaine; ?> + </li> + </ul> + </li> + </ul> + </li> + <li> + Point 3 :<br><?php echo $chaine; ?> + </li> + </ul> + </li> + <li> + Point 3 :<br><?php echo $chaine; ?> + </li> + </ul> + <hr><hr> + <ol style="list-style-type: upper-roman"> + <li> + Point 1 :<br><?php echo $chaine; ?> + </li> + <li> + Point 2 :<br><?php echo $chaine; ?> + <ol style="list-style-type: lower-alpha"> + <li> + Point 1 :<br><?php echo $chaine; ?> + </li> + <li> + Point 2 :<br><?php echo $chaine; ?> + <ol style="list-style-type: decimal"> + <li> + Point 1 :<br><?php echo $chaine; ?> + </li> + <li> + Point 2 :<br><?php echo $chaine; ?> + </li> + <li> + Point 3 :<br><?php echo $chaine; ?> + </li> + </ol> + </li> + <li> + Point 3 :<br><?php echo $chaine; ?> + </li> + </ol> + </li> + <li> + Point 3 :<br><?php echo $chaine; ?> + </li> + </ol> +</page> \ No newline at end of file diff --git a/assets/html2pdf/examples/res/exemple13.php b/assets/html2pdf/examples/res/exemple13.php new file mode 100644 index 0000000..7243d4f --- /dev/null +++ b/assets/html2pdf/examples/res/exemple13.php @@ -0,0 +1,88 @@ +<style type="text/css"> +<!-- +table.tableau { text-align: left; } +table.tableau td { width: 15mm; font-family: courier; } +table.tableau th { width: 15mm; font-family: courier; } + +.ul1 +{ + list-style-image: url(./res/puce2.gif); +} +.ul1 li +{ + color:#F19031; +} +.ul2 +{ + list-style: square; +} +.ul2 li +{ + color:#31F190; +} +.ul3 +{ + list-style: none; +} +.ul3 li +{ + color:#9031F1; +} +--> +</style> +Exemple de liste avec puce personnalisée :<br> +<table style="width: 100%;" > + <tr> + <td style="width: 33%;"> + <ul class="ul1"> + <li>Votre ligne 1</li> + <li>Votre ligne 2</li> + <li>Votre ligne 3</li> + </ul> + </td> + <td style="width: 34%;"> + <ul class="ul2"> + <li>Votre ligne 1</li> + <li>Votre ligne 2</li> + <li>Votre ligne 3</li> + </ul> + </td> + <td style="width: 33%;"> + <ul class="ul3"> + <li>Votre ligne 1</li> + <li>Votre ligne 2</li> + <li>Votre ligne 3</li> + </ul> + </td> + </tr> +</table> +Exemple de caracteres :<br> +<table class="tableau" > + <tr><th>0</th><th>a</th><th>e</th><th>i</th><th>o</th><th>u</th></tr> + <tr><th>1</th><td>&agrave;</td><td>&egrave;</td><td>&igrave;</td><td>&ograve;</td><td>&ugrave;</td></tr> + <tr><th>2</th><td>&aacute;</td><td>&eacute;</td><td>&iacute;</td><td>&oacute;</td><td>&uacute;</td></tr> + <tr><th>3</th><td>&acirc;</td><td>&ecirc;</td><td>&icirc;</td><td>&ocirc;</td><td>&ucirc;</td></tr> + <tr><th>4</th><td>&auml;</td><td>&euml;</td><td>&iuml;</td><td>&ouml;</td><td>&uuml;</td></tr> + <tr><th>5</th><td>&atilde;</td><td> </td><td> </td><td>&otilde;</td><td> </td></tr> + <tr><th>6</th><td>&aring;</td><td> </td><td> </td><td> </td><td> </td></tr> + <tr><th>7</th><td>&euro;</td><td>&laquo;</td><td> </td><td>&oslash;</td><td> </td></tr> +</table> +<br> +<?php + $phrase = "ceci est un exemple avec <b>du gras</b>, "; + $phrase.= "<i>de l'italique</i>, "; + $phrase.= "<u>du souligné</u>, "; + $phrase.= "<u><i><b>et une image</b></i></u> : "; + $phrase.= "<img src='./res/logo.gif' alt='logo' style='width: 15mm'>"; +?> +Table :<br> +<table style="border: solid 1px red; width: 105mm"> + <tr><td style="width: 100%; border: solid 1px green; text-align: left; "><?php echo $phrase; ?></td></tr> + <tr><td style="width: 100%; border: solid 1px green; text-align: center;"><?php echo $phrase; ?></td></tr> + <tr><td style="width: 100%; border: solid 1px green; text-align: right; "><?php echo $phrase; ?></td></tr> +</table> +<br> +Div :<br> +<div style="width: 103mm; border: solid 1px green; text-align: left; margin: 1mm 0 1mm 0;padding: 1mm;"><?php echo $phrase; ?></div> +<div style="width: 103mm; border: solid 1px green; text-align: center;margin: 1mm 0 1mm 0;padding: 1mm;"><?php echo $phrase; ?></div> +<div style="width: 103mm; border: solid 1px green; text-align: right; margin: 1mm 0 1mm 0;padding: 1mm;"><?php echo $phrase; ?></div> \ No newline at end of file diff --git a/assets/html2pdf/examples/res/forms.php b/assets/html2pdf/examples/res/forms.php new file mode 100644 index 0000000..e642056 --- /dev/null +++ b/assets/html2pdf/examples/res/forms.php @@ -0,0 +1,64 @@ +<?php + $url = $_SERVER['REQUEST_URI']; + if (substr($url, 0, 7)!=='http://') { + $url = 'http://'.$_SERVER['HTTP_HOST']; + if (ISSET($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT']!=80) $url.= ':'.$_SERVER['SERVER_PORT']; + $url.= $_SERVER['REQUEST_URI']; + } +?> +<style type="text/css"> +li +{ font-size: 10pt; } + +input, textarea, select +{ + border: dashed 1mm red; + background: #FCC; + color: #400; + text-align: left; + font-size: 11pt; +} +</style> +<page footer="form"> + <h1>Test de formulaire</h1><br> + <br> + <form action="<?php echo $url; ?>"> + <input type="hidden" name="test" value="1"> + Vous utilisez cette librairie dans le cadre : + <ul style="list-style: none"> + <li><input type="checkbox" name="cadre_boulot" checked="checked"> du boulot</li> + <li><input type="checkbox" name="cadre_perso" > perso</li> + </ul> + Vous êtes : + <ul style="list-style: none"> + <li><input type="radio" name="sexe" value="homme" checked="checked"> un homme</li> + <li><input type="radio" name="sexe" value="femme"> une femme</li> + </ul> + Vous avez : + <select name="age" > + <option value="15">moins de 15 ans</option> + <option value="20">entre 15 et 20 ans</option> + <option value="25">entre 20 et 25 ans</option> + <option value="30">entre 25 et 30 ans</option> + <option value="40">plus de 30 ans</option> + </select><br> + <br> + Vous aimez : + <select name="aime[]" size="5" multiple="multiple"> + <option value="ch1">l'informatique</option> + <option value="ch2">le cinéma</option> + <option value="ch3">le sport</option> + <option value="ch4">la littérature</option> + <option value="ch5">autre</option> + </select><br> + <br> + Votre phrase fétiche : <input type="text" name="phrase" value="cette lib est géniale !!!" style="width: 100mm"><br> + <br> + Un commentaire ?<br> + <textarea name="comment" rows="3" cols="30">rien de particulier</textarea><br> + <br> + <input type="reset" name="btn_reset" value="Initialiser"> + <input type="button" name="btn_print" value="Imprimer" onclick="print(true);"> + <input type="submit" name="btn_submit" value="Envoyer"> + </form> +</page> \ No newline at end of file diff --git a/assets/html2pdf/examples/res/logo.gif b/assets/html2pdf/examples/res/logo.gif new file mode 100644 index 0000000..1400667 Binary files /dev/null and b/assets/html2pdf/examples/res/logo.gif differ diff --git a/assets/html2pdf/examples/res/logo.png b/assets/html2pdf/examples/res/logo.png new file mode 100644 index 0000000..bdd7594 Binary files /dev/null and b/assets/html2pdf/examples/res/logo.png differ diff --git a/assets/html2pdf/examples/res/off.png b/assets/html2pdf/examples/res/off.png new file mode 100644 index 0000000..ebb30bb Binary files /dev/null and b/assets/html2pdf/examples/res/off.png differ diff --git a/assets/html2pdf/examples/res/puce.gif b/assets/html2pdf/examples/res/puce.gif new file mode 100644 index 0000000..7d35e4d Binary files /dev/null and b/assets/html2pdf/examples/res/puce.gif differ diff --git a/assets/html2pdf/examples/res/puce2.gif b/assets/html2pdf/examples/res/puce2.gif new file mode 100644 index 0000000..be43fe7 Binary files /dev/null and b/assets/html2pdf/examples/res/puce2.gif differ diff --git a/assets/html2pdf/examples/res/regle.png b/assets/html2pdf/examples/res/regle.png new file mode 100644 index 0000000..9ad4310 Binary files /dev/null and b/assets/html2pdf/examples/res/regle.png differ diff --git a/assets/html2pdf/examples/res/svg.php b/assets/html2pdf/examples/res/svg.php new file mode 100644 index 0000000..5134e7f --- /dev/null +++ b/assets/html2pdf/examples/res/svg.php @@ -0,0 +1,23 @@ +<page> + <draw style="margin: auto; width:150mm; height:100mm; background: #000000; border: solid 0.5mm #777777;"> + <line style="stroke:#FF0000; stroke-width:1mm" x1="10mm" y1="10mm" x2="140mm" y2="10mm" > + <rect style="stroke:#770077; stroke-width:1mm; fill:#008888" x="15%" y="15%" w="70%" h="70%"> + <ellipse style="stroke:#000077; stroke-width:1mm; fill:#888800" cx="50%" cy="50%" rx="30%" ry="30%"> + <circle style="stroke:#0000AA; stroke-width:1mm; fill:#AAAA00" cx="50%" cy="50%" r="15%"> + </draw><br> + <draw style="margin: auto; width:150mm; height:100mm; background: #000000; border: solid 0.5mm #777777;"> + <path style="fill:#AAAA00; stroke:#0000AA; stroke-width:1mm" d="M20mm,10mm H130mm A10mm,10mm 0,0,0 140mm,20mm V80mm A10mm,10mm 0,0,0 130mm,90mm H20mm A10mm,10mm 0,0,0 10mm,80mm V20mm A10mm,10mm 0,0,0 20mm,10mm"> + <path style="fill:#770000; stroke:#AA0033; stroke-width:0.5mm" d="M 20mm,40mm a16mm,8mm 0,0,0 16mm,8mm" /> + <path style="fill:#770000; stroke:#00AA33; stroke-width:0.5mm" d="M 20mm,40mm l16mm,8mm" /> + <path style="fill:#770000; stroke:#AA0033; stroke-width:0.5mm" d="M 40mm,40mm a16mm,8mm 0,0,1 16mm,8mm" /> + <path style="fill:#770000; stroke:#00AA33; stroke-width:0.5mm" d="M 40mm,40mm l16mm,8mm" /> + <path style="fill:#770000; stroke:#AA0033; stroke-width:0.5mm" d="M 80mm,40mm a16mm,8mm 0,1,0 16mm,8mm" /> + <path style="fill:#770000; stroke:#00AA33; stroke-width:0.5mm" d="M 80mm,40mm l16mm,8mm" /> + <path style="fill:#770000; stroke:#AA0033; stroke-width:0.5mm" d="M100mm,40mm a16mm,8mm 0,1,1 16mm,8mm" /> + <path style="fill:#770000; stroke:#00AA33; stroke-width:0.5mm" d="M100mm,40mm l16mm,8mm" /> + </draw><br> + <br> + Les balises SVG suivantes sont reconnues : LINE, RECT, CIRCLE, ELLIPSE, PATH, POLYGON, POLYLINE, G<br> + <br> + Spécifications SVG : <a href="http://www.w3.org/TR/SVG11/expanded-toc.html">http://www.w3.org/TR/SVG11/expanded-toc.html</a> +</page> \ No newline at end of file diff --git a/assets/html2pdf/examples/res/tcpdf_logo.jpg b/assets/html2pdf/examples/res/tcpdf_logo.jpg new file mode 100644 index 0000000..257f8fb Binary files /dev/null and b/assets/html2pdf/examples/res/tcpdf_logo.jpg differ diff --git a/assets/html2pdf/examples/svg.php b/assets/html2pdf/examples/svg.php new file mode 100644 index 0000000..cba8024 --- /dev/null +++ b/assets/html2pdf/examples/svg.php @@ -0,0 +1,31 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + + // get the HTML + ob_start(); + include(dirname(__FILE__).'/res/svg.php'); + $content = ob_get_clean(); + + // convert into PDF + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr'); + $html2pdf->pdf->SetDisplayMode('fullpage'); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('svg.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/svg_tiger.php b/assets/html2pdf/examples/svg_tiger.php new file mode 100644 index 0000000..5968eb8 --- /dev/null +++ b/assets/html2pdf/examples/svg_tiger.php @@ -0,0 +1,274 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + +$content = ' +<page> + <draw style="margin:auto; width:180mm; height:180mm; background: #444444; border: solid 0.5mm #777777;"> + <g transform="translate(90mm,90mm) scale(1.3) translate(-20mm,-30mm)"> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.172"><path d="M-122.304 84.285C-122.304 84.285 -122.203 86.179 -123.027 86.16C-123.851 86.141 -140.305 38.066 -160.833 40.309C-160.833 40.309 -143.05 32.956 -122.304 84.285z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.172"><path d="M-118.774 81.262C-118.774 81.262 -119.323 83.078 -120.092 82.779C-120.86 82.481 -119.977 31.675 -140.043 26.801C-140.043 26.801 -120.82 25.937 -118.774 81.262z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.172"><path d="M-91.284 123.59C-91.284 123.59 -89.648 124.55 -90.118 125.227C-90.589 125.904 -139.763 113.102 -149.218 131.459C-149.218 131.459 -145.539 112.572 -91.284 123.59z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.172"><path d="M-94.093 133.801C-94.093 133.801 -92.237 134.197 -92.471 134.988C-92.704 135.779 -143.407 139.121 -146.597 159.522C-146.597 159.522 -149.055 140.437 -94.093 133.801z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.172"><path d="M-98.304 128.276C-98.304 128.276 -96.526 128.939 -96.872 129.687C-97.218 130.435 -147.866 126.346 -153.998 146.064C-153.998 146.064 -153.646 126.825 -98.304 128.276z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.172"><path d="M-109.009 110.072C-109.009 110.072 -107.701 111.446 -108.34 111.967C-108.979 112.488 -152.722 86.634 -166.869 101.676C-166.869 101.676 -158.128 84.533 -109.009 110.072z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.172"><path d="M-116.554 114.263C-116.554 114.263 -115.098 115.48 -115.674 116.071C-116.25 116.661 -162.638 95.922 -174.992 112.469C-174.992 112.469 -168.247 94.447 -116.554 114.263z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.172"><path d="M-119.154 118.335C-119.154 118.335 -117.546 119.343 -118.036 120.006C-118.526 120.669 -167.308 106.446 -177.291 124.522C-177.291 124.522 -173.066 105.749 -119.154 118.335z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.172"><path d="M-108.42 118.949C-108.42 118.949 -107.298 120.48 -107.999 120.915C-108.7 121.35 -148.769 90.102 -164.727 103.207C-164.727 103.207 -153.862 87.326 -108.42 118.949z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.172"><path d="M-128.2 90C-128.2 90 -127.6 91.8 -128.4 92C-129.2 92.2 -157.8 50.2 -177.001 57.8C-177.001 57.8 -161.8 46 -128.2 90z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.172"><path d="M-127.505 96.979C-127.505 96.979 -126.53 98.608 -127.269 98.975C-128.007 99.343 -164.992 64.499 -182.101 76.061C-182.101 76.061 -169.804 61.261 -127.505 96.979z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.172"><path d="M-127.62 101.349C-127.62 101.349 -126.498 102.88 -127.199 103.315C-127.9 103.749 -167.969 72.502 -183.927 85.607C-183.927 85.607 -173.062 69.726 -127.62 101.349z"/></g> + <g style="fill: #ffffff; stroke:#000000"><path d="M-129.83 103.065C-129.327 109.113 -128.339 115.682 -126.6 118.801C-126.6 118.801 -130.2 131.201 -121.4 144.401C-121.4 144.401 -121.8 151.601 -120.2 154.801C-120.2 154.801 -116.2 163.201 -111.4 164.001C-107.516 164.648 -98.793 167.717 -88.932 169.121C-88.932 169.121 -71.8 183.201 -75 196.001C-75 196.001 -75.4 212.401 -79 214.001C-79 214.001 -67.4 202.801 -77 219.601L-81.4 238.401C-81.4 238.401 -55.8 216.801 -71.4 235.201L-81.4 261.201C-81.4 261.201 -61.8 242.801 -69 251.201L-72.2 260.001C-72.2 260.001 -29 232.801 -59.8 262.401C-59.8 262.401 -51.8 258.801 -47.4 261.601C-47.4 261.601 -40.6 260.401 -41.4 262.001C-41.4 262.001 -62.2 272.401 -65.8 290.801C-65.8 290.801 -57.4 280.801 -60.6 291.601L-60.2 303.201C-60.2 303.201 -56.2 281.601 -56.6 319.201C-56.6 319.201 -37.4 301.201 -49 322.001L-49 338.801C-49 338.801 -33.8 322.401 -40.2 335.201C-40.2 335.201 -30.2 326.401 -34.2 341.601C-34.2 341.601 -35 352.001 -30.6 340.801C-30.6 340.801 -14.6 310.201 -20.6 336.401C-20.6 336.401 -21.4 355.601 -16.6 340.801C-16.6 340.801 -16.2 351.201 -7 358.401C-7 358.401 -8.2 307.601 4.6 343.601L8.6 360.001C8.6 360.001 11.4 350.801 11 345.601C11 345.601 25.8 329.201 19 353.601C19 353.601 34.2 330.801 31 344.001C31 344.001 23.4 360.001 25 364.801C25 364.801 41.8 330.001 43 328.401C43 328.401 41 370.802 51.8 334.801C51.8 334.801 57.4 346.801 54.6 351.201C54.6 351.201 62.6 343.201 61.8 340.001C61.8 340.001 66.4 331.801 69.2 345.401C69.2 345.401 71 354.801 72.6 351.601C72.6 351.601 76.6 375.602 77.8 352.801C77.8 352.801 79.4 339.201 72.2 327.601C72.2 327.601 73 324.401 70.2 320.401C70.2 320.401 83.8 342.001 76.6 313.201C76.6 313.201 87.801 321.201 89.001 321.201C89.001 321.201 75.4 298.001 84.2 302.801C84.2 302.801 79 292.401 97.001 304.401C97.001 304.401 81 288.401 98.601 298.001C98.601 298.001 106.601 304.401 99.001 294.401C99.001 294.401 84.6 278.401 106.601 296.401C106.601 296.401 118.201 312.801 119.001 315.601C119.001 315.601 109.001 286.401 104.601 283.601C104.601 283.601 113.001 247.201 154.201 262.801C154.201 262.801 161.001 280.001 165.401 261.601C165.401 261.601 178.201 255.201 189.401 282.801C189.401 282.801 193.401 269.201 192.601 266.401C192.601 266.401 199.401 267.601 198.601 266.401C198.601 266.401 211.801 270.801 213.001 270.001C213.001 270.001 219.801 276.801 220.201 273.201C220.201 273.201 229.401 276.001 227.401 272.401C227.401 272.401 236.201 288.001 236.601 291.601L239.001 277.601L241.001 280.401C241.001 280.401 242.601 272.801 241.801 271.601C241.001 270.401 261.801 278.401 266.601 299.201L268.601 307.601C268.601 307.601 274.601 292.801 273.001 288.801C273.001 288.801 278.201 289.601 278.601 294.001C278.601 294.001 282.601 270.801 277.801 264.801C277.801 264.801 282.201 264.001 283.401 267.601L283.401 260.401C283.401 260.401 290.601 261.201 290.601 258.801C290.601 258.801 295.001 254.801 297.001 259.601C297.001 259.601 284.601 224.401 303.001 243.601C303.001 243.601 310.201 254.401 306.601 235.601C303.001 216.801 299.001 215.201 303.801 214.801C303.801 214.801 304.601 211.201 302.601 209.601C300.601 208.001 303.801 209.601 303.801 209.601C303.801 209.601 308.601 213.601 303.401 191.601C303.401 191.601 309.801 193.201 297.801 164.001C297.801 164.001 300.601 161.601 296.601 153.201C296.601 153.201 304.601 157.601 307.401 156.001C307.401 156.001 307.001 154.401 303.801 150.401C303.801 150.401 282.201 95.6 302.601 117.601C302.601 117.601 314.451 131.151 308.051 108.351C308.051 108.351 298.94 84.341 299.717 80.045L-129.83 103.065z"/></g> + <g style="fill: #cc7226; stroke:#000000"><path d="M299.717 80.245C300.345 80.426 302.551 81.55 303.801 83.2C303.801 83.2 310.601 94 305.401 75.6C305.401 75.6 296.201 46.8 305.001 58C305.001 58 311.001 65.2 307.801 51.6C303.936 35.173 301.401 28.8 301.401 28.8C301.401 28.8 313.001 33.6 286.201 -6L295.001 -2.4C295.001 -2.4 275.401 -42 253.801 -47.2L245.801 -53.2C245.801 -53.2 284.201 -91.2 271.401 -128C271.401 -128 264.601 -133.2 255.001 -124C255.001 -124 248.601 -119.2 242.601 -120.8C242.601 -120.8 211.801 -119.6 209.801 -119.6C207.801 -119.6 173.001 -156.8 107.401 -139.2C107.401 -139.2 102.201 -137.2 97.801 -138.4C97.801 -138.4 79.4 -154.4 30.6 -131.6C30.6 -131.6 20.6 -129.6 19 -129.6C17.4 -129.6 14.6 -129.6 6.6 -123.2C-1.4 -116.8 -1.8 -116 -3.8 -114.4C-3.8 -114.4 -20.2 -103.2 -25 -102.4C-25 -102.4 -36.6 -96 -41 -86L-44.6 -84.8C-44.6 -84.8 -46.2 -77.6 -46.6 -76.4C-46.6 -76.4 -51.4 -72.8 -52.2 -67.2C-52.2 -67.2 -61 -61.2 -60.6 -56.8C-60.6 -56.8 -62.2 -51.6 -63 -46.8C-63 -46.8 -70.2 -42 -69.4 -39.2C-69.4 -39.2 -77 -25.2 -75.8 -18.4C-75.8 -18.4 -82.2 -18.8 -85 -16.4C-85 -16.4 -85.8 -11.6 -87.4 -11.2C-87.4 -11.2 -90.2 -10 -87.8 -6C-87.8 -6 -89.4 -3.2 -89.8 -1.6C-89.8 -1.6 -89 1.2 -93.4 6.8C-93.4 6.8 -99.8 25.6 -97.8 30.8C-97.8 30.8 -97.4 35.6 -100.2 37.2C-100.2 37.2 -103.8 36.8 -95.4 48.8C-95.4 48.8 -94.6 50 -97.8 52.4C-97.8 52.4 -115 56 -117.4 72.4C-117.4 72.4 -131 87.2 -131 92.4C-131 94.705 -130.729 97.852 -130.03 102.465C-130.03 102.465 -130.6 110.801 -103 111.601C-75.4 112.401 299.717 80.245 299.717 80.245z"/></g> + <g style="fill: #cc7226"><path d="M-115.6 102.6C-140.6 63.2 -126.2 119.601 -126.2 119.601C-117.4 154.001 12.2 116.401 12.2 116.401C12.2 116.401 181.001 86 192.201 82C203.401 78 298.601 84.4 298.601 84.4L293.001 67.6C228.201 21.2 209.001 44.4 195.401 40.4C181.801 36.4 184.201 46 181.001 46.8C177.801 47.6 138.601 22.8 132.201 23.6C125.801 24.4 100.459 0.649 115.401 32.4C131.401 66.4 57 71.6 40.2 60.4C23.4 49.2 47.4 78.8 47.4 78.8C65.8 98.8 31.4 82 31.4 82C-3 69.2 -27 94.8 -30.2 95.6C-33.4 96.4 -38.2 99.6 -39 93.2C-39.8 86.8 -47.31 70.099 -79 96.4C-99 113.001 -112.8 91 -112.8 91L-115.6 102.6z"/></g> + <g style="fill: #e87f3a"><path d="M133.51 25.346C127.11 26.146 101.743 2.407 116.71 34.146C133.31 69.346 58.31 73.346 41.51 62.146C24.709 50.946 48.71 80.546 48.71 80.546C67.11 100.546 32.709 83.746 32.709 83.746C-1.691 70.946 -25.691 96.546 -28.891 97.346C-32.091 98.146 -36.891 101.346 -37.691 94.946C-38.491 88.546 -45.87 72.012 -77.691 98.146C-98.927 115.492 -112.418 94.037 -112.418 94.037L-115.618 104.146C-140.618 64.346 -125.546 122.655 -125.546 122.655C-116.745 157.056 13.509 118.146 13.509 118.146C13.509 118.146 182.31 87.746 193.51 83.746C204.71 79.746 299.038 86.073 299.038 86.073L293.51 68.764C228.71 22.364 210.31 46.146 196.71 42.146C183.11 38.146 185.51 47.746 182.31 48.546C179.11 49.346 139.91 24.546 133.51 25.346z"/></g> + <g style="fill: #ea8c4d"><path d="M134.819 27.091C128.419 27.891 103.685 3.862 118.019 35.891C134.219 72.092 59.619 75.092 42.819 63.892C26.019 52.692 50.019 82.292 50.019 82.292C68.419 102.292 34.019 85.492 34.019 85.492C-0.381 72.692 -24.382 98.292 -27.582 99.092C-30.782 99.892 -35.582 103.092 -36.382 96.692C-37.182 90.292 -44.43 73.925 -76.382 99.892C-98.855 117.983 -112.036 97.074 -112.036 97.074L-115.636 105.692C-139.436 66.692 -124.891 125.71 -124.891 125.71C-116.091 160.11 14.819 119.892 14.819 119.892C14.819 119.892 183.619 89.492 194.819 85.492C206.019 81.492 299.474 87.746 299.474 87.746L294.02 69.928C229.219 23.528 211.619 47.891 198.019 43.891C184.419 39.891 186.819 49.491 183.619 50.292C180.419 51.092 141.219 26.291 134.819 27.091z"/></g> + <g style="fill: #ec9961"><path d="M136.128 28.837C129.728 29.637 104.999 5.605 119.328 37.637C136.128 75.193 60.394 76.482 44.128 65.637C27.328 54.437 51.328 84.037 51.328 84.037C69.728 104.037 35.328 87.237 35.328 87.237C0.928 74.437 -23.072 100.037 -26.272 100.837C-29.472 101.637 -34.272 104.837 -35.072 98.437C-35.872 92.037 -42.989 75.839 -75.073 101.637C-98.782 120.474 -111.655 100.11 -111.655 100.11L-115.655 107.237C-137.455 70.437 -124.236 128.765 -124.236 128.765C-115.436 163.165 16.128 121.637 16.128 121.637C16.128 121.637 184.928 91.237 196.129 87.237C207.329 83.237 299.911 89.419 299.911 89.419L294.529 71.092C229.729 24.691 212.929 49.637 199.329 45.637C185.728 41.637 188.128 51.237 184.928 52.037C181.728 52.837 142.528 28.037 136.128 28.837z"/></g> + <g style="fill: #eea575"><path d="M137.438 30.583C131.037 31.383 106.814 7.129 120.637 39.383C137.438 78.583 62.237 78.583 45.437 67.383C28.637 56.183 52.637 85.783 52.637 85.783C71.037 105.783 36.637 88.983 36.637 88.983C2.237 76.183 -21.763 101.783 -24.963 102.583C-28.163 103.383 -32.963 106.583 -33.763 100.183C-34.563 93.783 -41.548 77.752 -73.763 103.383C-98.709 122.965 -111.273 103.146 -111.273 103.146L-115.673 108.783C-135.473 73.982 -123.582 131.819 -123.582 131.819C-114.782 166.22 17.437 123.383 17.437 123.383C17.437 123.383 186.238 92.983 197.438 88.983C208.638 84.983 300.347 91.092 300.347 91.092L295.038 72.255C230.238 25.855 214.238 51.383 200.638 47.383C187.038 43.383 189.438 52.983 186.238 53.783C183.038 54.583 143.838 29.783 137.438 30.583z"/></g> + <g style="fill: #f1b288"><path d="M138.747 32.328C132.347 33.128 106.383 9.677 121.947 41.128C141.147 79.928 63.546 80.328 46.746 69.128C29.946 57.928 53.946 87.528 53.946 87.528C72.346 107.528 37.946 90.728 37.946 90.728C3.546 77.928 -20.454 103.528 -23.654 104.328C-26.854 105.128 -31.654 108.328 -32.454 101.928C-33.254 95.528 -40.108 79.665 -72.454 105.128C-98.636 125.456 -110.891 106.183 -110.891 106.183L-115.691 110.328C-133.691 77.128 -122.927 134.874 -122.927 134.874C-114.127 169.274 18.746 125.128 18.746 125.128C18.746 125.128 187.547 94.728 198.747 90.728C209.947 86.728 300.783 92.764 300.783 92.764L295.547 73.419C230.747 27.019 215.547 53.128 201.947 49.128C188.347 45.128 190.747 54.728 187.547 55.528C184.347 56.328 145.147 31.528 138.747 32.328z"/></g> + <g style="fill: #f3bf9c"><path d="M140.056 34.073C133.655 34.873 107.313 11.613 123.255 42.873C143.656 82.874 64.855 82.074 48.055 70.874C31.255 59.674 55.255 89.274 55.255 89.274C73.655 109.274 39.255 92.474 39.255 92.474C4.855 79.674 -19.145 105.274 -22.345 106.074C-25.545 106.874 -30.345 110.074 -31.145 103.674C-31.945 97.274 -38.668 81.578 -71.145 106.874C-98.564 127.947 -110.509 109.219 -110.509 109.219L-115.709 111.874C-131.709 81.674 -122.273 137.929 -122.273 137.929C-113.473 172.329 20.055 126.874 20.055 126.874C20.055 126.874 188.856 96.474 200.056 92.474C211.256 88.474 301.22 94.437 301.22 94.437L296.056 74.583C231.256 28.183 216.856 54.874 203.256 50.874C189.656 46.873 192.056 56.474 188.856 57.274C185.656 58.074 146.456 33.273 140.056 34.073z"/></g> + <g style="fill: #f5ccb0"><path d="M141.365 35.819C134.965 36.619 107.523 13.944 124.565 44.619C146.565 84.219 66.164 83.819 49.364 72.619C32.564 61.419 56.564 91.019 56.564 91.019C74.964 111.019 40.564 94.219 40.564 94.219C6.164 81.419 -17.836 107.019 -21.036 107.819C-24.236 108.619 -29.036 111.819 -29.836 105.419C-30.636 99.019 -37.227 83.492 -69.836 108.619C-98.491 130.438 -110.127 112.256 -110.127 112.256L-115.727 113.419C-130.128 85.019 -121.618 140.983 -121.618 140.983C-112.818 175.384 21.364 128.619 21.364 128.619C21.364 128.619 190.165 98.219 201.365 94.219C212.565 90.219 301.656 96.11 301.656 96.11L296.565 75.746C231.765 29.346 218.165 56.619 204.565 52.619C190.965 48.619 193.365 58.219 190.165 59.019C186.965 59.819 147.765 35.019 141.365 35.819z"/></g> + <g style="fill: #f8d8c4"><path d="M142.674 37.565C136.274 38.365 108.832 15.689 125.874 46.365C147.874 85.965 67.474 85.565 50.674 74.365C33.874 63.165 57.874 92.765 57.874 92.765C76.274 112.765 41.874 95.965 41.874 95.965C7.473 83.165 -16.527 108.765 -19.727 109.565C-22.927 110.365 -27.727 113.565 -28.527 107.165C-29.327 100.765 -35.786 85.405 -68.527 110.365C-98.418 132.929 -109.745 115.293 -109.745 115.293L-115.745 114.965C-129.346 88.564 -120.963 144.038 -120.963 144.038C-112.163 178.438 22.673 130.365 22.673 130.365C22.673 130.365 191.474 99.965 202.674 95.965C213.874 91.965 302.093 97.783 302.093 97.783L297.075 76.91C232.274 30.51 219.474 58.365 205.874 54.365C192.274 50.365 194.674 59.965 191.474 60.765C188.274 61.565 149.074 36.765 142.674 37.565z"/></g> + <g style="fill: #fae5d7"><path d="M143.983 39.31C137.583 40.11 110.529 17.223 127.183 48.11C149.183 88.91 68.783 87.31 51.983 76.11C35.183 64.91 59.183 94.51 59.183 94.51C77.583 114.51 43.183 97.71 43.183 97.71C8.783 84.91 -15.217 110.51 -18.417 111.31C-21.618 112.11 -26.418 115.31 -27.218 108.91C-28.018 102.51 -34.346 87.318 -67.218 112.11C-98.345 135.42 -109.363 118.329 -109.363 118.329L-115.764 116.51C-128.764 92.51 -120.309 147.093 -120.309 147.093C-111.509 181.493 23.983 132.11 23.983 132.11C23.983 132.11 192.783 101.71 203.983 97.71C215.183 93.71 302.529 99.456 302.529 99.456L297.583 78.074C232.783 31.673 220.783 60.11 207.183 56.11C193.583 52.11 195.983 61.71 192.783 62.51C189.583 63.31 150.383 38.51 143.983 39.31z"/></g> + <g style="fill: #fcf2eb"><path d="M145.292 41.055C138.892 41.855 112.917 18.411 128.492 49.855C149.692 92.656 70.092 89.056 53.292 77.856C36.492 66.656 60.492 96.256 60.492 96.256C78.892 116.256 44.492 99.456 44.492 99.456C10.092 86.656 -13.908 112.256 -17.108 113.056C-20.308 113.856 -25.108 117.056 -25.908 110.656C-26.708 104.256 -32.905 89.232 -65.908 113.856C-98.273 137.911 -108.982 121.365 -108.982 121.365L-115.782 118.056C-128.582 94.856 -119.654 150.147 -119.654 150.147C-110.854 184.547 25.292 133.856 25.292 133.856C25.292 133.856 194.093 103.456 205.293 99.456C216.493 95.456 302.965 101.128 302.965 101.128L298.093 79.237C233.292 32.837 222.093 61.856 208.493 57.856C194.893 53.855 197.293 63.456 194.093 64.256C190.892 65.056 151.692 40.255 145.292 41.055z"/></g> + <g style="fill: #ffffff"><path d="M-115.8 119.601C-128.6 97.6 -119 153.201 -119 153.201C-110.2 187.601 26.6 135.601 26.6 135.601C26.6 135.601 195.401 105.2 206.601 101.2C217.801 97.2 303.401 102.8 303.401 102.8L298.601 80.4C233.801 34 223.401 63.6 209.801 59.6C196.201 55.6 198.601 65.2 195.401 66C192.201 66.8 153.001 42 146.601 42.8C140.201 43.6 114.981 19.793 129.801 51.6C152.028 99.307 69.041 89.227 54.6 79.6C37.8 68.4 61.8 98 61.8 98C80.2 118.001 45.8 101.2 45.8 101.2C11.4 88.4 -12.6 114.001 -15.8 114.801C-19 115.601 -23.8 118.801 -24.6 112.401C-25.4 106 -31.465 91.144 -64.6 115.601C-98.2 140.401 -108.6 124.401 -108.6 124.401L-115.8 119.601z"/></g> + <g style="fill: #000000"><path d="M-74.2 149.601C-74.2 149.601 -81.4 161.201 -60.6 174.401C-60.6 174.401 -59.2 175.801 -77.2 171.601C-77.2 171.601 -83.4 169.601 -85 159.201C-85 159.201 -89.8 154.801 -94.6 149.201C-99.4 143.601 -74.2 149.601 -74.2 149.601z"/></g> + <g style="fill: #cccccc"><path d="M65.8 102C65.8 102 83.498 128.821 82.9 133.601C81.6 144.001 81.4 153.601 84.6 157.601C87.801 161.601 96.601 194.801 96.601 194.801C96.601 194.801 96.201 196.001 108.601 158.001C108.601 158.001 120.201 142.001 100.201 123.601C100.201 123.601 65 94.8 65.8 102z"/></g> + <g style="fill: #000000"><path d="M-54.2 176.401C-54.2 176.401 -43 183.601 -57.4 214.801L-51 212.401C-51 212.401 -51.8 223.601 -55 226.001L-47.8 222.801C-47.8 222.801 -43 230.801 -47 235.601C-47 235.601 -30.2 243.601 -31 250.001C-31 250.001 -24.6 242.001 -28.6 235.601C-32.6 229.201 -39.8 233.201 -39 214.801L-47.8 218.001C-47.8 218.001 -42.2 209.201 -42.2 202.801L-50.2 205.201C-50.2 205.201 -34.731 178.623 -45.4 177.201C-51.4 176.401 -54.2 176.401 -54.2 176.401z"/></g> + <g style="fill: #cccccc"><path d="M-21.8 193.201C-21.8 193.201 -19 188.801 -21.8 189.601C-24.6 190.401 -55.8 205.201 -61.8 214.801C-61.8 214.801 -27.4 190.401 -21.8 193.201z"/></g> + <g style="fill: #cccccc"><path d="M-11.4 201.201C-11.4 201.201 -8.6 196.801 -11.4 197.601C-14.2 198.401 -45.4 213.201 -51.4 222.801C-51.4 222.801 -17 198.401 -11.4 201.201z"/></g> + <g style="fill: #cccccc"><path d="M1.8 186.001C1.8 186.001 4.6 181.601 1.8 182.401C-1 183.201 -32.2 198.001 -38.2 207.601C-38.2 207.601 -3.8 183.201 1.8 186.001z"/></g> + <g style="fill: #cccccc"><path d="M-21.4 229.601C-21.4 229.601 -21.4 223.601 -24.2 224.401C-27 225.201 -63 242.801 -69 252.401C-69 252.401 -27 226.801 -21.4 229.601z"/></g> + <g style="fill: #cccccc"><path d="M-20.2 218.801C-20.2 218.801 -19 214.001 -21.8 214.801C-23.8 214.801 -50.2 226.401 -56.2 236.001C-56.2 236.001 -26.6 214.401 -20.2 218.801z"/></g> + <g style="fill: #cccccc"><path d="M-34.6 266.401L-44.6 274.001C-44.6 274.001 -34.2 266.401 -30.6 267.601C-30.6 267.601 -37.4 278.801 -38.2 284.001C-38.2 284.001 -27.8 271.201 -22.2 271.601C-22.2 271.601 -14.6 272.001 -14.6 282.801C-14.6 282.801 -9 272.401 -5.8 272.801C-5.8 272.801 -4.6 279.201 -5.8 286.001C-5.8 286.001 -1.8 278.401 2.2 280.001C2.2 280.001 8.6 278.001 7.8 289.601C7.8 289.601 7.8 300.001 7 302.801C7 302.801 12.6 276.401 15 276.001C15 276.001 23 274.801 27.8 283.601C27.8 283.601 23.8 276.001 28.6 278.001C28.6 278.001 39.4 279.601 42.6 286.401C42.6 286.401 35.8 274.401 41.4 277.601C41.4 277.601 48.2 277.601 49.4 284.001C49.4 284.001 57.8 305.201 59.8 306.801C59.8 306.801 52.2 285.201 53.8 285.201C53.8 285.201 51.8 273.201 57 288.001C57 288.001 53.8 274.001 59.4 274.801C65 275.601 69.4 285.601 77.8 283.201C77.8 283.201 87.401 288.801 89.401 219.601L-34.6 266.401z"/></g> + <g style="fill: #000000"><path d="M-29.8 173.601C-29.8 173.601 -15 167.601 25 173.601C25 173.601 32.2 174.001 39 165.201C45.8 156.401 72.6 149.201 79 151.201L88.601 157.601L89.401 158.801C89.401 158.801 101.801 169.201 102.201 176.801C102.601 184.401 87.801 232.401 78.2 248.401C68.6 264.401 59 276.801 39.8 274.401C39.8 274.401 19 270.401 -6.6 274.401C-6.6 274.401 -35.8 272.801 -38.6 264.801C-41.4 256.801 -27.4 241.601 -27.4 241.601C-27.4 241.601 -23 233.201 -24.2 218.801C-25.4 204.401 -25 176.401 -29.8 173.601z"/></g> + <g style="fill: #e5668c"><path d="M-7.8 175.601C0.6 194.001 -29 259.201 -29 259.201C-31 260.801 -16.34 266.846 -6.2 264.401C4.746 261.763 45 266.001 45 266.001C68.6 250.401 81.4 206.001 81.4 206.001C81.4 206.001 91.801 182.001 74.2 178.801C56.6 175.601 -7.8 175.601 -7.8 175.601z"/></g> + <g style="fill: #b23259"><path d="M-9.831 206.497C-6.505 193.707 -4.921 181.906 -7.8 175.601C-7.8 175.601 54.6 182.001 65.8 161.201C70.041 153.326 84.801 184.001 84.4 193.601C84.4 193.601 21.4 208.001 6.6 196.801L-9.831 206.497z"/></g> + <g style="fill: #a5264c"><path d="M-5.4 222.801C-5.4 222.801 -3.4 230.001 -5.8 234.001C-5.8 234.001 -7.4 234.801 -8.6 235.201C-8.6 235.201 -7.4 238.801 -1.4 240.401C-1.4 240.401 0.6 244.801 3 245.201C5.4 245.601 10.2 251.201 14.2 250.001C18.2 248.801 29.4 244.801 29.4 244.801C29.4 244.801 35 241.601 43.8 245.201C43.8 245.201 46.175 244.399 46.6 240.401C47.1 235.701 50.2 232.001 52.2 230.001C54.2 228.001 63.8 215.201 62.6 214.801C61.4 214.401 -5.4 222.801 -5.4 222.801z"/></g> + <g style="fill: #ff727f; stroke:#000000"><path d="M-9.8 174.401C-9.8 174.401 -12.6 196.801 -9.4 205.201C-6.2 213.601 -7 215.601 -7.8 219.601C-8.6 223.601 -4.2 233.601 1.4 239.601L13.4 241.201C13.4 241.201 28.6 237.601 37.8 240.401C37.8 240.401 46.794 241.744 50.2 226.801C50.2 226.801 55 220.401 62.2 217.601C69.4 214.801 76.6 173.201 72.6 165.201C68.6 157.201 54.2 152.801 38.2 168.401C22.2 184.001 20.2 167.201 -9.8 174.401z"/></g> + <g style="fill: #ffffcc; stroke:#000000; stroke-width:0.5"><path d="M-8.2 249.201C-8.2 249.201 -9 247.201 -13.4 246.801C-13.4 246.801 -35.8 243.201 -44.2 230.801C-44.2 230.801 -51 225.201 -46.6 236.801C-46.6 236.801 -36.2 257.201 -29.4 260.001C-29.4 260.001 -13 264.001 -8.2 249.201z"/></g> + <g style="fill: #cc3f4c"><path d="M71.742 185.229C72.401 177.323 74.354 168.709 72.6 165.201C66.154 152.307 49.181 157.695 38.2 168.401C22.2 184.001 20.2 167.201 -9.8 174.401C-9.8 174.401 -11.545 188.364 -10.705 198.376C-10.705 198.376 26.6 186.801 27.4 192.401C27.4 192.401 29 189.201 38.2 189.201C47.4 189.201 70.142 188.029 71.742 185.229z"/></g> + <g style="stroke:#a51926; stroke-width:2"><path d="M28.6 175.201C28.6 175.201 33.4 180.001 29.8 189.601C29.8 189.601 15.4 205.601 17.4 219.601"/></g> + <g style="fill: #ffffcc; stroke:#000000; stroke-width:0.5"><path d="M-19.4 260.001C-19.4 260.001 -23.8 247.201 -15 254.001C-15 254.001 -10.2 256.001 -11.4 257.601C-12.6 259.201 -18.2 263.201 -19.4 260.001z"/></g> + <g style="fill: #ffffcc; stroke:#000000; stroke-width:0.5"><path d="M-14.36 261.201C-14.36 261.201 -17.88 250.961 -10.84 256.401C-10.84 256.401 -6.419 258.849 -7.96 259.281C-12.52 260.561 -7.96 263.121 -14.36 261.201z"/></g> + <g style="fill: #ffffcc; stroke:#000000; stroke-width:0.5"><path d="M-9.56 261.201C-9.56 261.201 -13.08 250.961 -6.04 256.401C-6.04 256.401 -1.665 258.711 -3.16 259.281C-6.52 260.561 -3.16 263.121 -9.56 261.201z"/></g> + <g style="fill: #ffffcc; stroke:#000000; stroke-width:0.5"><path d="M-2.96 261.401C-2.96 261.401 -6.48 251.161 0.56 256.601C0.56 256.601 4.943 258.933 3.441 259.481C0.48 260.561 3.441 263.321 -2.96 261.401z"/></g> + <g style="fill: #ffffcc; stroke:#000000; stroke-width:0.5"><path d="M3.52 261.321C3.52 261.321 0 251.081 7.041 256.521C7.041 256.521 10.881 258.121 9.921 259.401C8.961 260.681 9.921 263.241 3.52 261.321z"/></g> + <g style="fill: #ffffcc; stroke:#000000; stroke-width:0.5"><path d="M10.2 262.001C10.2 262.001 5.4 249.601 14.6 256.001C14.6 256.001 19.4 258.001 18.2 259.601C17 261.201 18.2 264.401 10.2 262.001z"/></g> + <g style="stroke:#a5264c; stroke-width:2"><path d="M-18.2 244.801C-18.2 244.801 -5 242.001 1 245.201C1 245.201 7 246.401 8.2 246.001C9.4 245.601 12.6 245.201 12.6 245.201"/></g> + <g style="stroke:#a5264c; stroke-width:2"><path d="M15.8 253.601C15.8 253.601 27.8 240.001 39.8 244.401C46.816 246.974 45.8 243.601 46.6 240.801C47.4 238.001 47.6 233.801 52.6 230.801"/></g> + <g style="fill: #ffffcc; stroke:#000000; stroke-width:0.5"><path d="M33 237.601C33 237.601 29 226.801 26.2 239.601C23.4 252.401 20.2 256.001 18.6 258.801C18.6 258.801 18.6 264.001 27 263.601C27 263.601 37.8 263.201 38.2 260.401C38.6 257.601 37 246.001 33 237.601z"/></g> + <g style="stroke:#a5264c; stroke-width:2"><path d="M47 244.801C47 244.801 50.6 242.401 53 243.601"/></g> + <g style="stroke:#a5264c; stroke-width:2"><path d="M53.5 228.401C53.5 228.401 56.4 223.501 61.2 222.701"/></g> + <g style="fill: #b2b2b2"><path d="M-25.8 265.201C-25.8 265.201 -7.8 268.401 -3.4 266.801C-3.4 266.801 5.4 266.801 -3 268.801C-3 268.801 -15.8 268.801 -23.8 267.601C-23.8 267.601 -35.4 262.001 -25.8 265.201z"/></g> + <g style="fill: #ffffcc; stroke:#000000; stroke-width:0.5"><path d="M-11.8 172.001C-11.8 172.001 5.8 172.001 7.8 172.801C7.8 172.801 15 203.601 11.4 211.201C11.4 211.201 10.2 214.001 7.4 208.401C7.4 208.401 -11 175.601 -14.2 173.601C-17.4 171.601 -13 172.001 -11.8 172.001z"/></g> + <g style="fill: #ffffcc; stroke:#000000; stroke-width:0.5"><path d="M-88.9 169.301C-88.9 169.301 -80 171.001 -67.4 173.601C-67.4 173.601 -62.6 196.001 -59.4 200.801C-56.2 205.601 -59.8 205.601 -63.4 202.801C-67 200.001 -81.8 186.001 -83.8 181.601C-85.8 177.201 -88.9 169.301 -88.9 169.301z"/></g> + <g style="fill: #ffffcc; stroke:#000000; stroke-width:0.5"><path d="M-67.039 173.818C-67.039 173.818 -61.239 175.366 -60.23 177.581C-59.222 179.795 -61.432 183.092 -61.432 183.092C-61.432 183.092 -62.432 186.397 -63.634 184.235C-64.836 182.072 -67.708 174.412 -67.039 173.818z"/></g> + <g style="fill: #000000"><path d="M-67 173.601C-67 173.601 -63.4 178.801 -59.8 178.801C-56.2 178.801 -55.818 178.388 -53 179.001C-48.4 180.001 -48.8 178.001 -42.2 179.201C-39.56 179.681 -37 178.801 -34.2 180.001C-31.4 181.201 -28.2 180.401 -27 178.401C-25.8 176.401 -21 172.201 -21 172.201C-21 172.201 -33.8 174.001 -36.6 174.801C-36.6 174.801 -59 176.001 -67 173.601z"/></g> + <g style="fill: #ffffcc; stroke:#000000; stroke-width:0.5"><path d="M-22.4 173.801C-22.4 173.801 -28.85 177.301 -29.25 179.701C-29.65 182.101 -24 185.801 -24 185.801C-24 185.801 -21.25 190.401 -20.65 188.001C-20.05 185.601 -21.6 174.201 -22.4 173.801z"/></g> + <g style="fill: #ffffcc; stroke:#000000; stroke-width:0.5"><path d="M-59.885 179.265C-59.885 179.265 -52.878 190.453 -52.661 179.242C-52.661 179.242 -52.104 177.984 -53.864 177.962C-59.939 177.886 -58.418 173.784 -59.885 179.265z"/></g> + <g style="fill: #ffffcc; stroke:#000000; stroke-width:0.5"><path d="M-52.707 179.514C-52.707 179.514 -44.786 190.701 -45.422 179.421C-45.422 179.421 -45.415 179.089 -47.168 178.936C-51.915 178.522 -51.57 174.004 -52.707 179.514z"/></g> + <g style="fill: #ffffcc; stroke:#000000; stroke-width:0.5"><path d="M-45.494 179.522C-45.494 179.522 -37.534 190.15 -38.203 180.484C-38.203 180.484 -38.084 179.251 -39.738 178.95C-43.63 178.244 -43.841 174.995 -45.494 179.522z"/></g> + <g style="fill: #ffffcc; stroke:#000000; stroke-width:0.5"><path d="M-38.618 179.602C-38.618 179.602 -30.718 191.163 -30.37 181.382C-30.37 181.382 -28.726 180.004 -30.472 179.782C-36.29 179.042 -35.492 174.588 -38.618 179.602z"/></g> + <g style="fill: #e5e5b2"><path d="M-74.792 183.132L-82.45 181.601C-85.05 176.601 -87.15 170.451 -87.15 170.451C-87.15 170.451 -80.8 171.451 -68.3 174.251C-68.3 174.251 -67.424 177.569 -65.952 183.364L-74.792 183.132z"/></g> + <g style="fill: #e5e5b2"><path d="M-9.724 178.47C-11.39 175.964 -12.707 174.206 -13.357 173.8C-16.37 171.917 -12.227 172.294 -11.098 172.294C-11.098 172.294 5.473 172.294 7.356 173.047C7.356 173.047 7.88 175.289 8.564 178.68C8.564 178.68 -1.524 176.67 -9.724 178.47z"/></g> + <g style="fill: #cc7226"><path d="M43.88 40.321C71.601 44.281 97.121 8.641 98.881 -1.04C100.641 -10.72 90.521 -22.6 90.521 -22.6C91.841 -25.68 87.001 -39.76 81.721 -49C76.441 -58.24 60.54 -57.266 43 -58.24C27.16 -59.12 8.68 -35.8 7.36 -34.04C6.04 -32.28 12.2 6.001 13.52 11.721C14.84 17.441 12.2 43.841 12.2 43.841C46.44 34.741 16.16 36.361 43.88 40.321z"/></g> + <g style="fill: #ea8e51"><path d="M8.088 -33.392C6.792 -31.664 12.84 5.921 14.136 11.537C15.432 17.153 12.84 43.073 12.84 43.073C45.512 34.193 16.728 35.729 43.944 39.617C71.161 43.505 96.217 8.513 97.945 -0.992C99.673 -10.496 89.737 -22.16 89.737 -22.16C91.033 -25.184 86.281 -39.008 81.097 -48.08C75.913 -57.152 60.302 -56.195 43.08 -57.152C27.528 -58.016 9.384 -35.12 8.088 -33.392z"/></g> + <g style="fill: #efaa7c"><path d="M8.816 -32.744C7.544 -31.048 13.48 5.841 14.752 11.353C16.024 16.865 13.48 42.305 13.48 42.305C44.884 33.145 17.296 35.097 44.008 38.913C70.721 42.729 95.313 8.385 97.009 -0.944C98.705 -10.272 88.953 -21.72 88.953 -21.72C90.225 -24.688 85.561 -38.256 80.473 -47.16C75.385 -56.064 60.063 -55.125 43.16 -56.064C27.896 -56.912 10.088 -34.44 8.816 -32.744z"/></g> + <g style="fill: #f4c6a8"><path d="M9.544 -32.096C8.296 -30.432 14.12 5.761 15.368 11.169C16.616 16.577 14.12 41.537 14.12 41.537C43.556 32.497 17.864 34.465 44.072 38.209C70.281 41.953 94.409 8.257 96.073 -0.895C97.737 -10.048 88.169 -21.28 88.169 -21.28C89.417 -24.192 84.841 -37.504 79.849 -46.24C74.857 -54.976 59.824 -54.055 43.24 -54.976C28.264 -55.808 10.792 -33.76 9.544 -32.096z"/></g> + <g style="fill: #f9e2d3"><path d="M10.272 -31.448C9.048 -29.816 14.76 5.681 15.984 10.985C17.208 16.289 14.76 40.769 14.76 40.769C42.628 31.849 18.432 33.833 44.136 37.505C69.841 41.177 93.505 8.129 95.137 -0.848C96.769 -9.824 87.385 -20.84 87.385 -20.84C88.609 -23.696 84.121 -36.752 79.225 -45.32C74.329 -53.888 59.585 -52.985 43.32 -53.888C28.632 -54.704 11.496 -33.08 10.272 -31.448z"/></g> + <g style="fill: #ffffff"><path d="M44.2 36.8C69.4 40.4 92.601 8 94.201 -0.8C95.801 -9.6 86.601 -20.4 86.601 -20.4C87.801 -23.2 83.4 -36 78.6 -44.4C73.8 -52.8 59.346 -51.914 43.4 -52.8C29 -53.6 12.2 -32.4 11 -30.8C9.8 -29.2 15.4 5.6 16.6 10.8C17.8 16 15.4 40 15.4 40C40.9 31.4 19 33.2 44.2 36.8z"/></g> + <g style="fill: #cccccc"><path d="M90.601 2.8C90.601 2.8 62.8 10.4 51.2 8.8C51.2 8.8 35.4 2.2 26.6 24C26.6 24 23 31.2 21 33.2C19 35.2 90.601 2.8 90.601 2.8z"/></g> + <g style="fill: #000000"><path d="M94.401 0.6C94.401 0.6 65.4 12.8 55.4 12.4C55.4 12.4 39 7.8 30.6 22.4C30.6 22.4 22.2 31.6 19 33.2C19 33.2 18.6 34.8 25 30.8L35.4 36C35.4 36 50.2 45.6 59.8 29.6C59.8 29.6 63.8 18.4 63.8 16.4C63.8 14.4 85 8.8 86.601 8.4C88.201 8 94.801 3.8 94.401 0.6z"/></g> + <g style="fill: #99cc32"><path d="M47 36.514C40.128 36.514 31.755 32.649 31.755 26.4C31.755 20.152 40.128 13.887 47 13.887C53.874 13.887 59.446 18.952 59.446 25.2C59.446 31.449 53.874 36.514 47 36.514z"/></g> + <g style="fill: #659900"><path d="M43.377 19.83C38.531 20.552 33.442 22.055 33.514 21.839C35.054 17.22 41.415 13.887 47 13.887C51.296 13.887 55.084 15.865 57.32 18.875C57.32 18.875 52.004 18.545 43.377 19.83z"/></g> + <g style="fill: #ffffff"><path d="M55.4 19.6C55.4 19.6 51 16.4 51 18.6C51 18.6 54.6 23 55.4 19.6z"/></g> + <g style="fill: #000000"><path d="M45.4 27.726C42.901 27.726 40.875 25.7 40.875 23.2C40.875 20.701 42.901 18.675 45.4 18.675C47.9 18.675 49.926 20.701 49.926 23.2C49.926 25.7 47.9 27.726 45.4 27.726z"/></g> + <g style="fill: #cc7226"><path d="M-58.6 14.4C-58.6 14.4 -61.8 -6.8 -59.4 -11.2C-59.4 -11.2 -48.6 -21.2 -49 -24.8C-49 -24.8 -49.4 -42.8 -50.6 -43.6C-51.8 -44.4 -59.4 -50.4 -65.4 -44C-65.4 -44 -75.8 -26 -75 -19.6L-75 -17.6C-75 -17.6 -82.6 -18 -84.2 -16C-84.2 -16 -85.4 -10.8 -86.6 -10.4C-86.6 -10.4 -89.4 -8 -87.4 -5.2C-87.4 -5.2 -89.4 -2.8 -89 1.2L-81.4 5.2C-81.4 5.2 -79.4 19.6 -68.6 24.8C-63.764 27.129 -60.6 20.4 -58.6 14.4z"/></g> + <g style="fill: #ffffff"><path d="M-59.6 12.56C-59.6 12.56 -62.48 -6.52 -60.32 -10.48C-60.32 -10.48 -50.6 -19.48 -50.96 -22.72C-50.96 -22.72 -51.32 -38.92 -52.4 -39.64C-53.48 -40.36 -60.32 -45.76 -65.72 -40C-65.72 -40 -75.08 -23.8 -74.36 -18.04L-74.36 -16.24C-74.36 -16.24 -81.2 -16.6 -82.64 -14.8C-82.64 -14.8 -83.72 -10.12 -84.8 -9.76C-84.8 -9.76 -87.32 -7.6 -85.52 -5.08C-85.52 -5.08 -87.32 -2.92 -86.96 0.68L-80.12 4.28C-80.12 4.28 -78.32 17.24 -68.6 21.92C-64.248 24.015 -61.4 17.96 -59.6 12.56z"/></g> + <g style="fill: #eb955c"><path d="M-51.05 -42.61C-52.14 -43.47 -59.63 -49.24 -65.48 -43C-65.48 -43 -75.62 -25.45 -74.84 -19.21L-74.84 -17.26C-74.84 -17.26 -82.25 -17.65 -83.81 -15.7C-83.81 -15.7 -84.98 -10.63 -86.15 -10.24C-86.15 -10.24 -88.88 -7.9 -86.93 -5.17C-86.93 -5.17 -88.88 -2.83 -88.49 1.07L-81.08 4.97C-81.08 4.97 -79.13 19.01 -68.6 24.08C-63.886 26.35 -60.8 19.79 -58.85 13.94C-58.85 13.94 -61.97 -6.73 -59.63 -11.02C-59.63 -11.02 -49.1 -20.77 -49.49 -24.28C-49.49 -24.28 -49.88 -41.83 -51.05 -42.61z"/></g> + <g style="fill: #f2b892"><path d="M-51.5 -41.62C-52.48 -42.54 -59.86 -48.08 -65.56 -42C-65.56 -42 -75.44 -24.9 -74.68 -18.82L-74.68 -16.92C-74.68 -16.92 -81.9 -17.3 -83.42 -15.4C-83.42 -15.4 -84.56 -10.46 -85.7 -10.08C-85.7 -10.08 -88.36 -7.8 -86.46 -5.14C-86.46 -5.14 -88.36 -2.86 -87.98 0.94L-80.76 4.74C-80.76 4.74 -78.86 18.42 -68.6 23.36C-64.006 25.572 -61 19.18 -59.1 13.48C-59.1 13.48 -62.14 -6.66 -59.86 -10.84C-59.86 -10.84 -49.6 -20.34 -49.98 -23.76C-49.98 -23.76 -50.36 -40.86 -51.5 -41.62z"/></g> + <g style="fill: #f8dcc8"><path d="M-51.95 -40.63C-52.82 -41.61 -60.09 -46.92 -65.64 -41C-65.64 -41 -75.26 -24.35 -74.52 -18.43L-74.52 -16.58C-74.52 -16.58 -81.55 -16.95 -83.03 -15.1C-83.03 -15.1 -84.14 -10.29 -85.25 -9.92C-85.25 -9.92 -87.84 -7.7 -85.99 -5.11C-85.99 -5.11 -87.84 -2.89 -87.47 0.81L-80.44 4.51C-80.44 4.51 -78.59 17.83 -68.6 22.64C-64.127 24.794 -61.2 18.57 -59.35 13.02C-59.35 13.02 -62.31 -6.59 -60.09 -10.66C-60.09 -10.66 -50.1 -19.91 -50.47 -23.24C-50.47 -23.24 -50.84 -39.89 -51.95 -40.63z"/></g> + <g style="fill: #ffffff"><path d="M-59.6 12.46C-59.6 12.46 -62.48 -6.52 -60.32 -10.48C-60.32 -10.48 -50.6 -19.48 -50.96 -22.72C-50.96 -22.72 -51.32 -38.92 -52.4 -39.64C-53.16 -40.68 -60.32 -45.76 -65.72 -40C-65.72 -40 -75.08 -23.8 -74.36 -18.04L-74.36 -16.24C-74.36 -16.24 -81.2 -16.6 -82.64 -14.8C-82.64 -14.8 -83.72 -10.12 -84.8 -9.76C-84.8 -9.76 -87.32 -7.6 -85.52 -5.08C-85.52 -5.08 -87.32 -2.92 -86.96 0.68L-80.12 4.28C-80.12 4.28 -78.32 17.24 -68.6 21.92C-64.248 24.015 -61.4 17.86 -59.6 12.46z"/></g> + <g style="fill: #cccccc"><path d="M-62.7 6.2C-62.7 6.2 -84.3 -4 -85.2 -4.8C-85.2 -4.8 -76.1 3.4 -75.3 3.4C-74.5 3.4 -62.7 6.2 -62.7 6.2z"/></g> + <g style="fill: #000000"><path d="M-79.8 0C-79.8 0 -61.4 3.6 -61.4 8C-61.4 10.912 -61.643 24.331 -67 22.8C-75.4 20.4 -71.8 6 -79.8 0z"/></g> + <g style="fill: #99cc32"><path d="M-71.4 3.8C-71.4 3.8 -62.422 5.274 -61.4 8C-60.8 9.6 -60.137 17.908 -65.6 19C-70.152 19.911 -72.382 9.69 -71.4 3.8z"/></g> + <g style="fill: #000000"><path d="M14.595 46.349C14.098 44.607 15.409 44.738 17.2 44.2C19.2 43.6 31.4 39.8 32.2 37.2C33 34.6 46.2 39 46.2 39C48 39.8 52.4 42.4 52.4 42.4C57.2 43.6 63.8 44 63.8 44C66.2 45 69.6 47.8 69.6 47.8C84.2 58 96.601 50.8 96.601 50.8C116.601 44.2 110.601 27 110.601 27C107.601 18 110.801 14.6 110.801 14.6C111.001 10.8 118.201 17.2 118.201 17.2C120.801 21.4 121.601 26.4 121.601 26.4C129.601 37.6 126.201 19.8 126.201 19.8C126.401 18.8 123.601 15.2 123.601 14C123.601 12.8 121.801 9.4 121.801 9.4C118.801 6 121.201 -1 121.201 -1C123.001 -14.8 120.801 -13 120.801 -13C119.601 -14.8 110.401 -4.8 110.401 -4.8C108.201 -1.4 102.201 0.2 102.201 0.2C99.401 2 96.001 0.6 96.001 0.6C93.401 0.2 87.801 7.2 87.801 7.2C90.601 7 93.001 11.4 95.401 11.6C97.801 11.8 99.601 9.2 101.201 8.6C102.801 8 105.601 13.8 105.601 13.8C106.001 16.4 100.401 21.2 100.401 21.2C100.001 25.8 98.401 24.2 98.401 24.2C95.401 23.6 94.201 27.4 93.201 32C92.201 36.6 88.001 37 88.001 37C86.401 44.4 85.2 41.4 85.2 41.4C85 35.8 79 41.6 79 41.6C77.8 43.6 73.2 41.4 73.2 41.4C66.4 39.4 68.8 37.4 68.8 37.4C70.6 35.2 81.8 37.4 81.8 37.4C84 35.8 76 31.8 76 31.8C75.4 30 76.4 25.6 76.4 25.6C77.6 22.4 84.4 16.8 84.4 16.8C93.801 15.6 91.001 14 91.001 14C84.801 8.8 79 16.4 79 16.4C76.8 22.6 59.4 37.6 59.4 37.6C54.6 41 57.2 34.2 53.2 37.6C49.2 41 28.6 32 28.6 32C17.038 30.807 14.306 46.549 10.777 43.429C10.777 43.429 16.195 51.949 14.595 46.349z"/></g> + <g style="fill: #000000"><path d="M209.401 -120C209.401 -120 183.801 -112 181.001 -93.2C181.001 -93.2 178.601 -70.4 199.001 -52.8C199.001 -52.8 199.401 -46.4 201.401 -43.2C201.401 -43.2 199.801 -38.4 218.601 -46L245.801 -54.4C245.801 -54.4 252.201 -56.8 257.401 -65.6C262.601 -74.4 277.801 -93.2 274.201 -118.4C274.201 -118.4 275.401 -129.6 269.401 -130C269.401 -130 261.001 -131.6 253.801 -124C253.801 -124 247.001 -120.8 244.601 -121.2L209.401 -120z"/></g> + <g style="fill: #000000"><path d="M264.022 -120.99C264.022 -120.99 266.122 -129.92 261.282 -125.08C261.282 -125.08 254.242 -119.36 246.761 -119.36C246.761 -119.36 232.241 -117.16 227.841 -103.96C227.841 -103.96 223.881 -77.12 231.801 -71.4C231.801 -71.4 236.641 -63.92 243.681 -70.52C250.722 -77.12 266.222 -107.35 264.022 -120.99z"/></g> + <g style="fill: #323232"><path d="M263.648 -120.632C263.648 -120.632 265.738 -129.376 260.986 -124.624C260.986 -124.624 254.074 -119.008 246.729 -119.008C246.729 -119.008 232.473 -116.848 228.153 -103.888C228.153 -103.888 224.265 -77.536 232.041 -71.92C232.041 -71.92 236.793 -64.576 243.705 -71.056C250.618 -77.536 265.808 -107.24 263.648 -120.632z"/></g> + <g style="fill: #666666"><path d="M263.274 -120.274C263.274 -120.274 265.354 -128.832 260.69 -124.168C260.69 -124.168 253.906 -118.656 246.697 -118.656C246.697 -118.656 232.705 -116.536 228.465 -103.816C228.465 -103.816 224.649 -77.952 232.281 -72.44C232.281 -72.44 236.945 -65.232 243.729 -71.592C250.514 -77.952 265.394 -107.13 263.274 -120.274z"/></g> + <g style="fill: #999999"><path d="M262.9 -119.916C262.9 -119.916 264.97 -128.288 260.394 -123.712C260.394 -123.712 253.738 -118.304 246.665 -118.304C246.665 -118.304 232.937 -116.224 228.777 -103.744C228.777 -103.744 225.033 -78.368 232.521 -72.96C232.521 -72.96 237.097 -65.888 243.753 -72.128C250.41 -78.368 264.98 -107.02 262.9 -119.916z"/></g> + <g style="fill: #cccccc"><path d="M262.526 -119.558C262.526 -119.558 264.586 -127.744 260.098 -123.256C260.098 -123.256 253.569 -117.952 246.633 -117.952C246.633 -117.952 233.169 -115.912 229.089 -103.672C229.089 -103.672 225.417 -78.784 232.761 -73.48C232.761 -73.48 237.249 -66.544 243.777 -72.664C250.305 -78.784 264.566 -106.91 262.526 -119.558z"/></g> + <g style="fill: #ffffff"><path d="M262.151 -119.2C262.151 -119.2 264.201 -127.2 259.801 -122.8C259.801 -122.8 253.401 -117.6 246.601 -117.6C246.601 -117.6 233.401 -115.6 229.401 -103.6C229.401 -103.6 225.801 -79.2 233.001 -74C233.001 -74 237.401 -67.2 243.801 -73.2C250.201 -79.2 264.151 -106.8 262.151 -119.2z"/></g> + <g style="fill: #992600"><path d="M50.6 84C50.6 84 30.2 64.8 22.2 64C22.2 64 -12.2 60 -27 78C-27 78 -9.4 57.6 18.2 63.2C18.2 63.2 -3.4 58.8 -15.8 62C-15.8 62 -32.6 62 -42.2 76L-45 80.8C-45 80.8 -41 66 -22.6 60C-22.6 60 0.2 55.2 11 60C11 60 -10.6 53.2 -20.6 55.2C-20.6 55.2 -51 52.8 -63.8 79.2C-63.8 79.2 -59.8 64.8 -45 57.6C-45 57.6 -31.4 48.8 -11 51.6C-11 51.6 3.4 54.8 8.6 57.2C13.8 59.6 12.6 56.8 4.2 52C4.2 52 -1.4 42 -15.4 42.4C-15.4 42.4 -58.2 46 -68.6 58C-68.6 58 -55 46.8 -44.6 44C-44.6 44 -22.2 36 -13.8 36.8C-13.8 36.8 11 37.8 18.6 33.8C18.6 33.8 7.4 38.8 10.6 42C13.8 45.2 20.6 52.8 20.6 54C20.6 55.2 44.8 77.3 48.4 81.7L50.6 84z"/></g> + <g style="fill: #cccccc"><path d="M189 278C189 278 173.5 241.5 161 232C161 232 187 248 190.5 266C190.5 266 190.5 276 189 278z"/></g> + <g style="fill: #cccccc"><path d="M236 285.5C236 285.5 209.5 230.5 191 206.5C191 206.5 234.5 244 239.5 270.5L240 276L237 273.5C237 273.5 236.5 282.5 236 285.5z"/></g> + <g style="fill: #cccccc"><path d="M292.5 237C292.5 237 230 177.5 228.5 175C228.5 175 289 241 292 248.5C292 248.5 290 239.5 292.5 237z"/></g> + <g style="fill: #cccccc"><path d="M104 280.5C104 280.5 123.5 228.5 142.5 251C142.5 251 157.5 261 157 264C157 264 153 257.5 135 258C135 258 116 255 104 280.5z"/></g> + <g style="fill: #cccccc"><path d="M294.5 153C294.5 153 249.5 124.5 242 123C230.193 120.639 291.5 152 296.5 162.5C296.5 162.5 298.5 160 294.5 153z"/></g> + <g style="fill: #000000"><path d="M143.801 259.601C143.801 259.601 164.201 257.601 171.001 250.801L175.401 254.401L193.001 216.001L196.601 221.201C196.601 221.201 211.001 206.401 210.201 198.401C209.401 190.401 223.001 204.401 223.001 204.401C223.001 204.401 222.201 192.801 229.401 199.601C229.401 199.601 227.001 184.001 235.401 192.001C235.401 192.001 224.864 161.844 247.401 187.601C253.001 194.001 248.601 187.201 248.601 187.201C248.601 187.201 222.601 139.201 244.201 153.601C244.201 153.601 246.201 130.801 245.001 126.401C243.801 122.001 241.801 99.6 237.001 94.4C232.201 89.2 237.401 87.6 243.001 92.8C243.001 92.8 231.801 68.8 245.001 80.8C245.001 80.8 241.401 65.6 237.001 62.8C237.001 62.8 231.401 45.6 246.601 56.4C246.601 56.4 242.201 44 239.001 40.8C239.001 40.8 227.401 13.2 234.601 18L239.001 21.6C239.001 21.6 232.201 7.6 238.601 12C245.001 16.4 245.001 16 245.001 16C245.001 16 223.801 -17.2 244.201 0.4C244.201 0.4 236.042 -13.518 232.601 -20.4C232.601 -20.4 213.801 -40.8 228.201 -34.4L233.001 -32.8C233.001 -32.8 224.201 -42.8 216.201 -44.4C208.201 -46 218.601 -52.4 225.001 -50.4C231.401 -48.4 247.001 -40.8 247.001 -40.8C247.001 -40.8 259.801 -22 263.801 -21.6C263.801 -21.6 243.801 -29.2 249.801 -21.2C249.801 -21.2 264.201 -7.2 257.001 -7.6C257.001 -7.6 251.001 -0.4 255.801 8.4C255.801 8.4 237.342 -9.991 252.201 15.6L259.001 32C259.001 32 234.601 7.2 245.801 29.2C245.801 29.2 263.001 52.8 265.001 53.2C267.001 53.6 271.401 62.4 271.401 62.4L267.001 60.4L272.201 69.2C272.201 69.2 261.001 57.2 267.001 70.4L272.601 84.8C272.601 84.8 252.201 62.8 265.801 92.4C265.801 92.4 249.401 87.2 258.201 104.4C258.201 104.4 256.601 120.401 257.001 125.601C257.401 130.801 258.601 159.201 254.201 167.201C249.801 175.201 260.201 194.401 262.201 198.401C264.201 202.401 267.801 213.201 259.001 204.001C250.201 194.801 254.601 200.401 256.601 209.201C258.601 218.001 264.601 233.601 263.801 239.201C263.801 239.201 262.601 240.401 259.401 236.801C259.401 236.801 244.601 214.001 246.201 228.401C246.201 228.401 245.001 236.401 241.801 245.201C241.801 245.201 238.601 256.001 238.601 247.201C238.601 247.201 235.401 230.401 232.601 238.001C229.801 245.601 226.201 251.601 223.401 254.001C220.601 256.401 215.401 233.601 214.201 244.001C214.201 244.001 202.201 231.601 197.401 248.001L185.801 264.401C185.801 264.401 185.401 252.001 184.201 258.001C184.201 258.001 154.201 264.001 143.801 259.601z"/></g> + <g style="fill: #000000"><path d="M109.401 -97.2C109.401 -97.2 97.801 -105.2 93.801 -104.8C89.801 -104.4 121.401 -113.6 162.601 -86C162.601 -86 167.401 -83.2 171.001 -83.6C171.001 -83.6 174.201 -81.2 171.401 -77.6C171.401 -77.6 162.601 -68 173.801 -56.8C173.801 -56.8 192.201 -50 186.601 -58.8C186.601 -58.8 197.401 -54.8 199.801 -50.8C202.201 -46.8 201.001 -50.8 201.001 -50.8C201.001 -50.8 194.601 -58 188.601 -63.2C188.601 -63.2 183.401 -65.2 180.601 -73.6C177.801 -82 175.401 -92 179.801 -95.2C179.801 -95.2 175.801 -90.8 176.601 -94.8C177.401 -98.8 181.001 -102.4 182.601 -102.8C184.201 -103.2 200.601 -119 207.401 -119.4C207.401 -119.4 198.201 -118 195.201 -119C192.201 -120 165.601 -131.4 159.601 -132.6C159.601 -132.6 142.801 -139.2 154.801 -137.2C154.801 -137.2 190.601 -133.4 208.801 -120.2C208.801 -120.2 201.601 -128.6 183.201 -135.6C183.201 -135.6 161.001 -148.2 125.801 -143.2C125.801 -143.2 108.001 -140 100.201 -138.2C100.201 -138.2 97.601 -138.8 97.001 -139.2C96.401 -139.6 84.6 -148.6 57 -141.6C57 -141.6 40 -137 31.4 -132.2C31.4 -132.2 16.2 -131 12.6 -127.8C12.6 -127.8 -6 -113.2 -8 -112.4C-10 -111.6 -21.4 -104 -22.2 -103.6C-22.2 -103.6 2.4 -110.2 4.8 -112.6C7.2 -115 24.6 -117.6 27 -116.2C29.4 -114.8 37.8 -115.4 28.2 -114.8C28.2 -114.8 103.801 -100 104.601 -98C105.401 -96 109.401 -97.2 109.401 -97.2z"/></g> + <g style="fill: #cc7226"><path d="M180.801 -106.4C180.801 -106.4 170.601 -113.8 168.601 -113.8C166.601 -113.8 154.201 -124 150.001 -123.6C145.801 -123.2 133.601 -133.2 106.201 -125C106.201 -125 105.601 -127 109.201 -127.8C109.201 -127.8 115.601 -130 116.001 -130.6C116.001 -130.6 136.201 -134.8 143.401 -131.2C143.401 -131.2 152.601 -128.6 158.801 -122.4C158.801 -122.4 170.001 -119.2 173.201 -120.2C173.201 -120.2 182.001 -118 182.401 -116.2C182.401 -116.2 188.201 -113.2 186.401 -110.6C186.401 -110.6 186.801 -109 180.801 -106.4z"/></g> + <g style="fill: #cc7226"><path d="M168.33 -108.509C169.137 -107.877 170.156 -107.779 170.761 -106.97C170.995 -106.656 170.706 -106.33 170.391 -106.233C169.348 -105.916 168.292 -106.486 167.15 -105.898C166.748 -105.691 166.106 -105.873 165.553 -106.022C163.921 -106.463 162.092 -106.488 160.401 -105.8C158.416 -106.929 156.056 -106.345 153.975 -107.346C153.917 -107.373 153.695 -107.027 153.621 -107.054C150.575 -108.199 146.832 -107.916 144.401 -110.2C141.973 -110.612 139.616 -111.074 137.188 -111.754C135.37 -112.263 133.961 -113.252 132.341 -114.084C130.964 -114.792 129.507 -115.314 127.973 -115.686C126.11 -116.138 124.279 -116.026 122.386 -116.546C122.293 -116.571 122.101 -116.227 122.019 -116.254C121.695 -116.362 121.405 -116.945 121.234 -116.892C119.553 -116.37 118.065 -117.342 116.401 -117C115.223 -118.224 113.495 -117.979 111.949 -118.421C108.985 -119.269 105.831 -117.999 102.801 -119C106.914 -120.842 111.601 -119.61 115.663 -121.679C117.991 -122.865 120.653 -121.763 123.223 -122.523C123.71 -122.667 124.401 -122.869 124.801 -122.2C124.935 -122.335 125.117 -122.574 125.175 -122.546C127.625 -121.389 129.94 -120.115 132.422 -119.049C132.763 -118.903 133.295 -119.135 133.547 -118.933C135.067 -117.717 137.01 -117.82 138.401 -116.6C140.099 -117.102 141.892 -116.722 143.621 -117.346C143.698 -117.373 143.932 -117.032 143.965 -117.054C145.095 -117.802 146.25 -117.531 147.142 -117.227C147.48 -117.112 148.143 -116.865 148.448 -116.791C149.574 -116.515 150.43 -116.035 151.609 -115.852C151.723 -115.834 151.908 -116.174 151.98 -116.146C153.103 -115.708 154.145 -115.764 154.801 -114.6C154.936 -114.735 155.101 -114.973 155.183 -114.946C156.21 -114.608 156.859 -113.853 157.96 -113.612C158.445 -113.506 159.057 -112.88 159.633 -112.704C162.025 -111.973 163.868 -110.444 166.062 -109.549C166.821 -109.239 167.697 -109.005 168.33 -108.509z"/></g> + <g style="fill: #cc7226"><path d="M91.696 -122.739C89.178 -124.464 86.81 -125.57 84.368 -127.356C84.187 -127.489 83.827 -127.319 83.625 -127.441C82.618 -128.05 81.73 -128.631 80.748 -129.327C80.209 -129.709 79.388 -129.698 78.88 -129.956C76.336 -131.248 73.707 -131.806 71.2 -133C71.882 -133.638 73.004 -133.394 73.6 -134.2C73.795 -133.92 74.033 -133.636 74.386 -133.827C76.064 -134.731 77.914 -134.884 79.59 -134.794C81.294 -134.702 83.014 -134.397 84.789 -134.125C85.096 -134.078 85.295 -133.555 85.618 -133.458C87.846 -132.795 90.235 -133.32 92.354 -132.482C93.945 -131.853 95.515 -131.03 96.754 -129.755C97.006 -129.495 96.681 -129.194 96.401 -129C96.789 -129.109 97.062 -128.903 97.173 -128.59C97.257 -128.351 97.257 -128.049 97.173 -127.81C97.061 -127.498 96.782 -127.397 96.408 -127.346C95.001 -127.156 96.773 -128.536 96.073 -128.088C94.8 -127.274 95.546 -125.868 94.801 -124.6C94.521 -124.794 94.291 -125.012 94.401 -125.4C94.635 -124.878 94.033 -124.588 93.865 -124.272C93.48 -123.547 92.581 -122.132 91.696 -122.739z"/></g> + <g style="fill: #cc7226"><path d="M59.198 -115.391C56.044 -116.185 52.994 -116.07 49.978 -117.346C49.911 -117.374 49.688 -117.027 49.624 -117.054C48.258 -117.648 47.34 -118.614 46.264 -119.66C45.351 -120.548 43.693 -120.161 42.419 -120.648C42.095 -120.772 41.892 -121.284 41.591 -121.323C40.372 -121.48 39.445 -122.429 38.4 -123C40.736 -123.795 43.147 -123.764 45.609 -124.148C45.722 -124.166 45.867 -123.845 46 -123.845C46.136 -123.845 46.266 -124.066 46.4 -124.2C46.595 -123.92 46.897 -123.594 47.154 -123.848C47.702 -124.388 48.258 -124.198 48.798 -124.158C48.942 -124.148 49.067 -123.845 49.2 -123.845C49.336 -123.845 49.467 -124.156 49.6 -124.156C49.736 -124.155 49.867 -123.845 50 -123.845C50.136 -123.845 50.266 -124.066 50.4 -124.2C51.092 -123.418 51.977 -123.972 52.799 -123.793C53.837 -123.566 54.104 -122.418 55.178 -122.12C59.893 -120.816 64.03 -118.671 68.393 -116.584C68.7 -116.437 68.91 -116.189 68.8 -115.8C69.067 -115.8 69.38 -115.888 69.57 -115.756C70.628 -115.024 71.669 -114.476 72.366 -113.378C72.582 -113.039 72.253 -112.632 72.02 -112.684C67.591 -113.679 63.585 -114.287 59.198 -115.391z"/></g> + <g style="fill: #cc7226"><path d="M45.338 -71.179C43.746 -72.398 43.162 -74.429 42.034 -76.221C41.82 -76.561 42.094 -76.875 42.411 -76.964C42.971 -77.123 43.514 -76.645 43.923 -76.443C45.668 -75.581 47.203 -74.339 49.2 -74.2C51.19 -71.966 55.45 -71.581 55.457 -68.2C55.458 -67.341 54.03 -68.259 53.6 -67.4C51.149 -68.403 48.76 -68.3 46.38 -69.767C45.763 -70.148 46.093 -70.601 45.338 -71.179z"/></g> + <g style="fill: #cc7226"><path d="M17.8 -123.756C17.935 -123.755 24.966 -123.522 24.949 -123.408C24.904 -123.099 17.174 -122.05 16.81 -122.22C16.646 -122.296 9.134 -119.866 9 -120C9.268 -120.135 17.534 -123.756 17.8 -123.756z"/></g> + <g style="fill: #000000"><path d="M33.2 -114C33.2 -114 18.4 -112.2 14 -111C9.6 -109.8 -9 -102.2 -12 -100.2C-12 -100.2 -25.4 -94.8 -42.4 -74.8C-42.4 -74.8 -34.8 -78.2 -32.6 -81C-32.6 -81 -19 -93.6 -19.2 -91C-19.2 -91 -7 -99.6 -7.6 -97.4C-7.6 -97.4 16.8 -108.6 14.8 -105.4C14.8 -105.4 36.4 -110 35.4 -108C35.4 -108 54.2 -103.6 51.4 -103.4C51.4 -103.4 45.6 -102.2 52 -98.6C52 -98.6 48.6 -94.2 43.2 -98.2C37.8 -102.2 40.8 -100 35.8 -99C35.8 -99 33.2 -98.2 28.6 -102.2C28.6 -102.2 23 -106.8 14.2 -103.2C14.2 -103.2 -16.4 -90.6 -18.4 -90C-18.4 -90 -22 -87.2 -24.4 -83.6C-24.4 -83.6 -30.2 -79.2 -33.2 -77.8C-33.2 -77.8 -46 -66.2 -47.2 -64.8C-47.2 -64.8 -50.6 -59.6 -51.4 -59.2C-51.4 -59.2 -45 -63 -43 -65C-43 -65 -29 -75 -23.6 -75.8C-23.6 -75.8 -19.2 -78.8 -18.4 -80.2C-18.4 -80.2 -4 -89.4 0.2 -89.4C0.2 -89.4 9.4 -84.2 11.8 -91.2C11.8 -91.2 17.6 -93 23.2 -91.8C23.2 -91.8 26.4 -94.4 25.6 -96.6C25.6 -96.6 27.2 -98.4 28.2 -94.6C28.2 -94.6 31.6 -91 36.4 -93C36.4 -93 40.4 -93.2 38.4 -90.8C38.4 -90.8 34 -87 22.2 -86.8C22.2 -86.8 9.8 -86.2 -6.6 -78.6C-6.6 -78.6 -36.4 -68.2 -45.6 -57.8C-45.6 -57.8 -52 -49 -57.4 -47.8C-57.4 -47.8 -63.2 -47 -69.2 -39.6C-69.2 -39.6 -59.4 -45.4 -50.4 -45.4C-50.4 -45.4 -46.4 -47.8 -50.2 -44.2C-50.2 -44.2 -53.8 -36.6 -52.2 -31.2C-52.2 -31.2 -52.8 -26 -53.6 -24.4C-53.6 -24.4 -61.4 -11.6 -61.4 -9.2C-61.4 -6.8 -60.2 3 -59.8 3.6C-59.4 4.2 -60.8 2 -57 4.4C-53.2 6.8 -50.4 8.4 -49.6 11.2C-48.8 14 -51.6 5.8 -51.8 4C-52 2.2 -56.2 -5 -55.4 -7.4C-55.4 -7.4 -54.4 -6.4 -53.6 -5C-53.6 -5 -54.2 -5.6 -53.6 -9.2C-53.6 -9.2 -52.8 -14.4 -51.4 -17.6C-50 -20.8 -48 -24.6 -47.6 -25.4C-47.2 -26.2 -47.2 -32 -45.8 -29.4L-42.4 -26.8C-42.4 -26.8 -45.2 -29.4 -43 -31.6C-43 -31.6 -44 -37.2 -42.2 -39.8C-42.2 -39.8 -35.2 -48.2 -33.6 -49.2C-32 -50.2 -33.4 -49.8 -33.4 -49.8C-33.4 -49.8 -27.4 -54 -33.2 -52.4C-33.2 -52.4 -37.2 -50.8 -40.2 -50.8C-40.2 -50.8 -47.8 -48.8 -43.8 -53C-39.8 -57.2 -29.8 -62.6 -26 -62.4L-25.2 -60.8L-14 -63.2L-15.2 -62.4C-15.2 -62.4 -15.4 -62.6 -11.2 -63C-7 -63.4 -1.2 -62 0.2 -63.8C1.6 -65.6 5 -66.6 4.6 -65.2C4.2 -63.8 4 -61.8 4 -61.8C4 -61.8 9 -67.6 8.4 -65.4C7.8 -63.2 -0.4 -58 -1.8 -51.8L8.6 -60L12.2 -63C12.2 -63 15.8 -60.8 16 -62.4C16.2 -64 20.8 -69.8 22 -69.6C23.2 -69.4 25.2 -72.2 25 -69.6C24.8 -67 32.4 -61.6 32.4 -61.6C32.4 -61.6 35.6 -63.4 37 -62C38.4 -60.6 42.6 -81.8 42.6 -81.8L67.6 -92.4L111.201 -95.8L94.201 -102.6L33.2 -114z"/></g> + <g style="stroke:#4c0000; stroke-width:2"><path d="M51.4 85C51.4 85 36.4 68.2 28 65.6C28 65.6 14.6 58.8 -10 66.6"/></g> + <g style="stroke:#4c0000; stroke-width:2"><path d="M24.8 64.2C24.8 64.2 -0.4 56.2 -15.8 60.4C-15.8 60.4 -34.2 62.4 -42.6 76.2"/></g> + <g style="stroke:#4c0000; stroke-width:2"><path d="M21.2 63C21.2 63 4.2 55.8 -10.6 53.6C-10.6 53.6 -27.2 51 -43.8 58.2C-43.8 58.2 -56 64.2 -61.4 74.4"/></g> + <g style="stroke:#4c0000; stroke-width:2"><path d="M22.2 63.4C22.2 63.4 6.8 52.4 5.8 51C5.8 51 -1.2 40 -14.2 39.6C-14.2 39.6 -35.6 40.4 -52.8 48.4"/></g> + <g style="fill: #000000"><path d="M20.895 54.407C22.437 55.87 49.4 84.8 49.4 84.8C84.6 121.401 56.6 87.2 56.6 87.2C49 82.4 39.8 63.6 39.8 63.6C38.6 60.8 53.8 70.8 53.8 70.8C57.8 71.6 71.4 90.8 71.4 90.8C64.6 88.4 69.4 95.6 69.4 95.6C72.2 97.6 92.601 113.201 92.601 113.201C96.201 117.201 100.201 118.801 100.201 118.801C114.201 113.601 107.801 126.801 107.801 126.801C110.201 133.601 115.801 122.001 115.801 122.001C127.001 105.2 110.601 107.601 110.601 107.601C80.6 110.401 73.8 94.4 73.8 94.4C71.4 92 80.2 94.4 80.2 94.4C88.601 96.4 73 82 73 82C75.4 82 84.6 88.8 84.6 88.8C95.001 98 97.001 96 97.001 96C115.001 87.2 125.401 94.8 125.401 94.8C127.401 96.4 121.801 103.2 123.401 108.401C125.001 113.601 129.801 126.001 129.801 126.001C127.401 127.601 127.801 138.401 127.801 138.401C144.601 161.601 135.001 159.601 135.001 159.601C119.401 159.201 134.201 166.801 134.201 166.801C137.401 168.801 146.201 176.001 146.201 176.001C143.401 174.801 141.801 180.001 141.801 180.001C146.601 184.001 143.801 188.801 143.801 188.801C137.801 190.001 136.601 194.001 136.601 194.001C143.401 202.001 133.401 202.401 133.401 202.401C137.001 206.801 132.201 218.801 132.201 218.801C127.401 218.801 121.001 224.401 121.001 224.401C123.401 229.201 113.001 234.801 113.001 234.801C104.601 236.401 107.401 243.201 107.401 243.201C99.401 249.201 97.001 265.201 97.001 265.201C96.201 275.601 93.801 278.801 99.001 276.801C104.201 274.801 103.401 262.401 103.401 262.401C98.601 246.801 141.401 230.801 141.401 230.801C145.401 229.201 146.201 224.001 146.201 224.001C148.201 224.401 157.001 232.001 157.001 232.001C164.601 243.201 165.001 234.001 165.001 234.001C166.201 230.401 164.601 224.401 164.601 224.401C170.601 202.801 156.601 196.401 156.601 196.401C146.601 162.801 160.601 171.201 160.601 171.201C163.401 176.801 174.201 182.001 174.201 182.001L177.801 179.601C176.201 174.801 184.601 168.801 184.601 168.801C187.401 175.201 193.401 167.201 193.401 167.201C197.001 142.801 209.401 157.201 209.401 157.201C213.401 158.401 214.601 151.601 214.601 151.601C218.201 141.201 214.601 127.601 214.601 127.601C218.201 127.201 227.801 133.201 227.801 133.201C230.601 129.601 221.401 112.801 225.401 115.201C229.401 117.601 233.801 119.201 233.801 119.201C234.601 117.201 224.601 104.801 224.601 104.801C220.201 102 215.001 81.6 215.001 81.6C222.201 85.2 212.201 70 212.201 70C212.201 66.8 218.201 55.6 218.201 55.6C217.401 48.8 218.201 49.2 218.201 49.2C221.001 50.4 229.001 52 222.201 45.6C215.401 39.2 223.001 34.4 223.001 34.4C227.401 31.6 213.801 32 213.801 32C208.601 27.6 209.001 23.6 209.001 23.6C217.001 25.6 202.601 11.2 200.201 7.6C197.801 4 207.401 -1.2 207.401 -1.2C220.601 -4.8 209.001 -8 209.001 -8C189.401 -7.6 200.201 -18.4 200.201 -18.4C206.201 -18 204.601 -20.4 204.601 -20.4C199.401 -21.6 189.801 -28 189.801 -28C185.801 -31.6 189.401 -30.8 189.401 -30.8C206.201 -29.6 177.401 -40.8 177.401 -40.8C185.401 -40.8 167.401 -51.2 167.401 -51.2C165.401 -52.8 162.201 -60.4 162.201 -60.4C156.201 -65.6 151.401 -72.4 151.401 -72.4C151.001 -76.8 146.201 -81.6 146.201 -81.6C134.601 -95.2 129.001 -94.8 129.001 -94.8C114.201 -98.4 109.001 -97.6 109.001 -97.6L56.2 -93.2C29.8 -80.4 37.6 -59.4 37.6 -59.4C44 -51 53.2 -54.8 53.2 -54.8C57.8 -61 69.4 -58.8 69.4 -58.8C89.801 -55.6 87.201 -59.2 87.201 -59.2C84.801 -63.8 68.6 -70 68.4 -70.6C68.2 -71.2 59.4 -74.6 59.4 -74.6C56.4 -75.8 52 -85 52 -85C48.8 -88.4 64.6 -82.6 64.6 -82.6C63.4 -81.6 70.8 -77.6 70.8 -77.6C88.201 -78.6 98.801 -67.8 98.801 -67.8C109.601 -51.2 109.801 -59.4 109.801 -59.4C112.601 -68.8 100.801 -90 100.801 -90C101.201 -92 109.401 -85.4 109.401 -85.4C110.801 -87.4 111.601 -81.6 111.601 -81.6C111.801 -79.2 115.601 -71.2 115.601 -71.2C118.401 -58.2 122.001 -65.6 122.001 -65.6L126.601 -56.2C128.001 -53.6 122.001 -46 122.001 -46C121.801 -43.2 122.601 -43.4 117.001 -35.8C111.401 -28.2 114.801 -23.8 114.801 -23.8C113.401 -17.2 122.201 -17.6 122.201 -17.6C124.801 -15.4 128.201 -15.4 128.201 -15.4C130.001 -13.4 132.401 -14 132.401 -14C134.001 -17.8 140.201 -15.8 140.201 -15.8C141.601 -18.2 149.801 -18.6 149.801 -18.6C150.801 -21.2 151.201 -22.8 154.601 -23.4C158.001 -24 133.401 -67 133.401 -67C139.801 -67.8 131.601 -80.2 131.601 -80.2C129.401 -86.8 140.801 -72.2 143.001 -70.8C145.201 -69.4 146.201 -67.2 144.601 -67.4C143.001 -67.6 141.201 -65.4 142.601 -65.2C144.001 -65 157.001 -50 160.401 -39.8C163.801 -29.6 169.801 -25.6 176.001 -19.6C182.201 -13.6 181.401 10.6 181.401 10.6C181.001 19.4 187.001 30 187.001 30C189.001 33.8 184.801 52 184.801 52C182.801 54.2 184.201 55 184.201 55C185.201 56.2 192.001 69.4 192.001 69.4C190.201 69.2 193.801 72.8 193.801 72.8C199.001 78.8 192.601 75.8 192.601 75.8C186.601 74.2 193.601 84 193.601 84C194.801 85.8 185.801 81.2 185.801 81.2C176.601 80.6 188.201 87.8 188.201 87.8C196.801 95 185.401 90.6 185.401 90.6C180.801 88.8 184.001 95.6 184.001 95.6C187.201 97.2 204.401 104.2 204.401 104.2C204.801 108.001 201.801 113.001 201.801 113.001C202.201 117.001 200.001 120.401 200.001 120.401C198.801 128.601 198.201 129.401 198.201 129.401C194.001 129.601 186.601 143.401 186.601 143.401C184.801 146.001 174.601 158.001 174.601 158.001C172.601 165.001 154.601 157.801 154.601 157.801C148.001 161.201 150.001 157.801 150.001 157.801C149.601 155.601 154.401 149.601 154.401 149.601C161.401 147.001 158.801 136.201 158.801 136.201C162.801 134.801 151.601 132.001 151.801 130.801C152.001 129.601 157.801 128.201 157.801 128.201C165.801 126.201 161.401 123.801 161.401 123.801C160.801 119.801 163.801 114.201 163.801 114.201C175.401 113.401 163.801 97.2 163.801 97.2C153.001 89.6 152.001 83.8 152.001 83.8C164.601 75.6 156.401 63.2 156.601 59.6C156.801 56 158.001 34.4 158.001 34.4C156.001 28.2 153.001 14.6 153.001 14.6C155.201 9.4 162.601 -3.2 162.601 -3.2C165.401 -7.4 174.201 -12.2 172.001 -15.2C169.801 -18.2 162.001 -16.4 162.001 -16.4C154.201 -17.8 154.801 -12.6 154.801 -12.6C153.201 -11.6 152.401 -6.6 152.401 -6.6C151.68 1.333 142.801 7.6 142.801 7.6C131.601 13.8 140.801 17.8 140.801 17.8C146.801 24.4 137.001 24.6 137.001 24.6C126.001 22.8 134.201 33 134.201 33C145.001 45.8 142.001 48.6 142.001 48.6C131.801 49.6 144.401 58.8 144.401 58.8C144.401 58.8 143.601 56.8 143.801 58.6C144.001 60.4 147.001 64.6 147.801 66.6C148.601 68.6 144.601 68.8 144.601 68.8C145.201 78.4 129.801 74.2 129.801 74.2C129.801 74.2 129.801 74.2 128.201 74.4C126.601 74.6 115.401 73.8 109.601 71.6C103.801 69.4 97.001 69.4 97.001 69.4C97.001 69.4 93.001 71.2 85.4 71C77.8 70.8 69.8 73.6 69.8 73.6C65.4 73.2 74 68.8 74.2 69C74.4 69.2 80 63.6 72 64.2C50.203 65.835 39.4 55.6 39.4 55.6C37.4 54.2 34.8 51.4 34.8 51.4C24.8 49.4 36.2 63.8 36.2 63.8C37.4 65.2 36 66.2 36 66.2C35.2 64.6 27.4 59.2 27.4 59.2C24.589 58.227 23.226 56.893 20.895 54.407z"/></g> + <g style="fill: #4c0000"><path d="M-3 42.8C-3 42.8 8.6 48.4 11.2 51.2C13.8 54 27.8 65.4 27.8 65.4C27.8 65.4 22.4 63.4 19.8 61.6C17.2 59.8 6.4 51.6 6.4 51.6C6.4 51.6 2.6 45.6 -3 42.8z"/></g> + <g style="fill: #99cc32"><path d="M-61.009 11.603C-60.672 11.455 -61.196 8.743 -61.4 8.2C-62.422 5.474 -71.4 4 -71.4 4C-71.627 5.365 -71.682 6.961 -71.576 8.599C-71.576 8.599 -66.708 14.118 -61.009 11.603z"/></g> + <g style="fill: #659900"><path d="M-61.009 11.403C-61.458 11.561 -61.024 8.669 -61.2 8.2C-62.222 5.474 -71.4 3.9 -71.4 3.9C-71.627 5.265 -71.682 6.861 -71.576 8.499C-71.576 8.499 -67.308 13.618 -61.009 11.403z"/></g> + <g style="fill: #000000"><path d="M-65.4 11.546C-66.025 11.546 -66.531 10.406 -66.531 9C-66.531 7.595 -66.025 6.455 -65.4 6.455C-64.775 6.455 -64.268 7.595 -64.268 9C-64.268 10.406 -64.775 11.546 -65.4 11.546z"/></g> + <g style="fill: #000000"><path d="M-65.4 9z"/></g> + <g style="fill: #000000"><path d="M-111 109.601C-111 109.601 -116.6 119.601 -91.8 113.601C-91.8 113.601 -77.8 112.401 -75.4 110.001C-74.2 110.801 -65.834 113.734 -63 114.401C-56.2 116.001 -47.8 106 -47.8 106C-47.8 106 -43.2 95.5 -40.4 95.5C-37.6 95.5 -40.8 97.1 -40.8 97.1C-40.8 97.1 -47.4 107.201 -47 108.801C-47 108.801 -52.2 128.801 -68.2 129.601C-68.2 129.601 -84.35 130.551 -83 136.401C-83 136.401 -74.2 134.001 -71.8 136.401C-71.8 136.401 -61 136.001 -69 142.401L-75.8 154.001C-75.8 154.001 -75.66 157.919 -85.8 154.401C-95.6 151.001 -105.9 138.101 -105.9 138.101C-105.9 138.101 -121.85 123.551 -111 109.601z"/></g> + <g style="fill: #e59999"><path d="M-112.2 113.601C-112.2 113.601 -114.2 123.201 -77.4 112.801C-77.4 112.801 -73 112.801 -70.6 113.601C-68.2 114.401 -56.2 117.201 -54.2 116.001C-54.2 116.001 -61.4 129.601 -73 128.001C-73 128.001 -86.2 129.601 -85.8 134.401C-85.8 134.401 -81.8 141.601 -77 144.001C-77 144.001 -74.2 146.401 -74.6 149.601C-75 152.801 -77.8 154.401 -79.8 155.201C-81.8 156.001 -85 152.801 -86.6 152.801C-88.2 152.801 -96.6 146.401 -101 141.601C-105.4 136.801 -113.8 124.801 -113.4 122.001C-113 119.201 -112.2 113.601 -112.2 113.601z"/></g> + <g style="fill: #b26565"><path d="M-109 131.051C-106.4 135.001 -103.2 139.201 -101 141.601C-96.6 146.401 -88.2 152.801 -86.6 152.801C-85 152.801 -81.8 156.001 -79.8 155.201C-77.8 154.401 -75 152.801 -74.6 149.601C-74.2 146.401 -77 144.001 -77 144.001C-80.066 142.468 -82.806 138.976 -84.385 136.653C-84.385 136.653 -84.2 139.201 -89.4 138.401C-94.6 137.601 -99.8 134.801 -101.4 131.601C-103 128.401 -105.4 126.001 -103.8 129.601C-102.2 133.201 -99.8 136.801 -98.2 137.201C-96.6 137.601 -97 138.801 -99.4 138.401C-101.8 138.001 -104.6 137.601 -109 132.401z"/></g> + <g style="fill: #992600"><path d="M-111.6 110.001C-111.6 110.001 -109.8 96.4 -108.6 92.4C-108.6 92.4 -109.4 85.6 -107 81.4C-104.6 77.2 -102.6 71 -99.6 65.6C-96.6 60.2 -96.4 56.2 -92.4 54.6C-88.4 53 -82.4 44.4 -79.6 43.4C-76.8 42.4 -77 43.2 -77 43.2C-77 43.2 -70.2 28.4 -56.6 32.4C-56.6 32.4 -72.8 29.6 -57 20.2C-57 20.2 -61.8 21.3 -58.5 14.3C-56.299 9.632 -56.8 16.4 -67.8 28.2C-67.8 28.2 -72.8 36.8 -78 39.8C-83.2 42.8 -95.2 49.8 -96.4 53.6C-97.6 57.4 -100.8 63.2 -102.8 64.8C-104.8 66.4 -107.6 70.6 -108 74C-108 74 -109.2 78 -110.6 79.2C-112 80.4 -112.2 83.6 -112.2 85.6C-112.2 87.6 -114.2 90.4 -114 92.8C-114 92.8 -113.2 111.801 -113.6 113.801L-111.6 110.001z"/></g> + <g style="fill: #ffffff"><path d="M-120.2 114.601C-120.2 114.601 -122.2 113.201 -126.6 119.201C-126.6 119.201 -119.3 152.201 -119.3 153.601C-119.3 153.601 -118.2 151.501 -119.5 144.301C-120.8 137.101 -121.7 124.401 -121.7 124.401L-120.2 114.601z"/></g> + <g style="fill: #992600"><path d="M-98.6 54C-98.6 54 -116.2 57.2 -115.8 86.4L-116.6 111.201C-116.6 111.201 -117.8 85.6 -119 84C-120.2 82.4 -116.2 71.2 -119.4 77.2C-119.4 77.2 -133.4 91.2 -125.4 112.401C-125.4 112.401 -123.9 115.701 -126.9 111.101C-126.9 111.101 -131.5 98.5 -130.4 92.1C-130.4 92.1 -130.2 89.9 -128.3 87.1C-128.3 87.1 -119.7 75.4 -117 73.1C-117 73.1 -115.2 58.7 -99.8 53.5C-99.8 53.5 -94.1 51.2 -98.6 54z"/></g> + <g style="fill: #000000"><path d="M40.8 -12.2C41.46 -12.554 41.451 -13.524 42.031 -13.697C43.18 -14.041 43.344 -15.108 43.862 -15.892C44.735 -17.211 44.928 -18.744 45.51 -20.235C45.782 -20.935 45.809 -21.89 45.496 -22.55C44.322 -25.031 43.62 -27.48 42.178 -29.906C41.91 -30.356 41.648 -31.15 41.447 -31.748C40.984 -33.132 39.727 -34.123 38.867 -35.443C38.579 -35.884 39.104 -36.809 38.388 -36.893C37.491 -36.998 36.042 -37.578 35.809 -36.552C35.221 -33.965 36.232 -31.442 37.2 -29C36.418 -28.308 36.752 -27.387 36.904 -26.62C37.614 -23.014 36.416 -19.662 35.655 -16.188C35.632 -16.084 35.974 -15.886 35.946 -15.824C34.724 -13.138 33.272 -10.693 31.453 -8.312C30.695 -7.32 29.823 -6.404 29.326 -5.341C28.958 -4.554 28.55 -3.588 28.8 -2.6C25.365 0.18 23.115 4.025 20.504 7.871C20.042 8.551 20.333 9.76 20.884 10.029C21.697 10.427 22.653 9.403 23.123 8.557C23.512 7.859 23.865 7.209 24.356 6.566C24.489 6.391 24.31 5.972 24.445 5.851C27.078 3.504 28.747 0.568 31.2 -1.8C33.15 -2.129 34.687 -3.127 36.435 -4.14C36.743 -4.319 37.267 -4.07 37.557 -4.265C39.31 -5.442 39.308 -7.478 39.414 -9.388C39.464 -10.272 39.66 -11.589 40.8 -12.2z"/></g> + <g style="fill: #000000"><path d="M31.959 -16.666C32.083 -16.743 31.928 -17.166 32.037 -17.382C32.199 -17.706 32.602 -17.894 32.764 -18.218C32.873 -18.434 32.71 -18.814 32.846 -18.956C35.179 -21.403 35.436 -24.427 34.4 -27.4C35.424 -28.02 35.485 -29.282 35.06 -30.129C34.207 -31.829 34.014 -33.755 33.039 -35.298C32.237 -36.567 30.659 -37.811 29.288 -36.508C28.867 -36.108 28.546 -35.321 28.824 -34.609C28.888 -34.446 29.173 -34.3 29.146 -34.218C29.039 -33.894 28.493 -33.67 28.487 -33.398C28.457 -31.902 27.503 -30.391 28.133 -29.062C28.905 -27.433 29.724 -25.576 30.4 -23.8C29.166 -21.684 30.199 -19.235 28.446 -17.358C28.31 -17.212 28.319 -16.826 28.441 -16.624C28.733 -16.138 29.139 -15.732 29.625 -15.44C29.827 -15.319 30.175 -15.317 30.375 -15.441C30.953 -15.803 31.351 -16.29 31.959 -16.666z"/></g> + <g style="fill: #000000"><path d="M94.771 -26.977C96.16 -25.185 96.45 -22.39 94.401 -21C94.951 -17.691 98.302 -19.67 100.401 -20.2C100.292 -20.588 100.519 -20.932 100.802 -20.937C101.859 -20.952 102.539 -21.984 103.601 -21.8C104.035 -23.357 105.673 -24.059 106.317 -25.439C108.043 -29.134 107.452 -33.407 104.868 -36.653C104.666 -36.907 104.883 -37.424 104.759 -37.786C104.003 -39.997 101.935 -40.312 100.001 -41C98.824 -44.875 98.163 -48.906 96.401 -52.6C94.787 -52.85 94.089 -54.589 92.752 -55.309C91.419 -56.028 90.851 -54.449 90.892 -53.403C90.899 -53.198 91.351 -52.974 91.181 -52.609C91.105 -52.445 90.845 -52.334 90.845 -52.2C90.846 -52.065 91.067 -51.934 91.201 -51.8C90.283 -50.98 88.86 -50.503 88.565 -49.358C87.611 -45.648 90.184 -42.523 91.852 -39.322C92.443 -38.187 91.707 -36.916 90.947 -35.708C90.509 -35.013 90.617 -33.886 90.893 -33.03C91.645 -30.699 93.236 -28.96 94.771 -26.977z"/></g> + <g style="fill: #000000"><path d="M57.611 -8.591C56.124 -6.74 52.712 -4.171 55.629 -2.243C55.823 -2.114 56.193 -2.11 56.366 -2.244C58.387 -3.809 60.39 -4.712 62.826 -5.294C62.95 -5.323 63.224 -4.856 63.593 -5.017C65.206 -5.72 67.216 -5.662 68.4 -7C72.167 -6.776 75.732 -7.892 79.123 -9.2C80.284 -9.648 81.554 -10.207 82.755 -10.709C84.131 -11.285 85.335 -12.213 86.447 -13.354C86.58 -13.49 86.934 -13.4 87.201 -13.4C87.161 -14.263 88.123 -14.39 88.37 -15.012C88.462 -15.244 88.312 -15.64 88.445 -15.742C90.583 -17.372 91.503 -19.39 90.334 -21.767C90.049 -22.345 89.8 -22.963 89.234 -23.439C88.149 -24.35 87.047 -23.496 86 -23.8C85.841 -23.172 85.112 -23.344 84.726 -23.146C83.867 -22.707 82.534 -23.292 81.675 -22.854C80.313 -22.159 79.072 -21.99 77.65 -21.613C77.338 -21.531 76.56 -21.627 76.4 -21C76.266 -21.134 76.118 -21.368 76.012 -21.346C74.104 -20.95 72.844 -20.736 71.543 -19.044C71.44 -18.911 70.998 -19.09 70.839 -18.955C69.882 -18.147 69.477 -16.913 68.376 -16.241C68.175 -16.118 67.823 -16.286 67.629 -16.157C66.983 -15.726 66.616 -15.085 65.974 -14.638C65.645 -14.409 65.245 -14.734 65.277 -14.99C65.522 -16.937 66.175 -18.724 65.6 -20.6C67.677 -23.12 70.194 -25.069 72 -27.8C72.015 -29.966 72.707 -32.112 72.594 -34.189C72.584 -34.382 72.296 -35.115 72.17 -35.462C71.858 -36.316 72.764 -37.382 71.92 -38.106C70.516 -39.309 69.224 -38.433 68.4 -37C66.562 -36.61 64.496 -35.917 62.918 -37.151C61.911 -37.938 61.333 -38.844 60.534 -39.9C59.549 -41.202 59.884 -42.638 59.954 -44.202C59.96 -44.33 59.645 -44.466 59.645 -44.6C59.646 -44.735 59.866 -44.866 60 -45C59.294 -45.626 59.019 -46.684 58 -47C58.305 -48.092 57.629 -48.976 56.758 -49.278C54.763 -49.969 53.086 -48.057 51.194 -47.984C50.68 -47.965 50.213 -49.003 49.564 -49.328C49.132 -49.544 48.428 -49.577 48.066 -49.311C47.378 -48.807 46.789 -48.693 46.031 -48.488C44.414 -48.052 43.136 -46.958 41.656 -46.103C40.171 -45.246 39.216 -43.809 38.136 -42.489C37.195 -41.337 37.059 -38.923 38.479 -38.423C40.322 -37.773 41.626 -40.476 43.592 -40.15C43.904 -40.099 44.11 -39.788 44 -39.4C44.389 -39.291 44.607 -39.52 44.8 -39.8C45.658 -38.781 46.822 -38.444 47.76 -37.571C48.73 -36.667 50.476 -37.085 51.491 -36.088C53.02 -34.586 52.461 -31.905 54.4 -30.6C53.814 -29.287 53.207 -28.01 52.872 -26.583C52.59 -25.377 53.584 -24.18 54.795 -24.271C56.053 -24.365 56.315 -25.124 56.8 -26.2C57.067 -25.933 57.536 -25.636 57.495 -25.42C57.038 -23.033 56.011 -21.04 55.553 -18.609C55.494 -18.292 55.189 -18.09 54.8 -18.2C54.332 -14.051 50.28 -11.657 47.735 -8.492C47.332 -7.99 47.328 -6.741 47.737 -6.338C49.14 -4.951 51.1 -6.497 52.8 -7C53.013 -8.206 53.872 -9.148 55.204 -9.092C55.46 -9.082 55.695 -9.624 56.019 -9.754C56.367 -9.892 56.869 -9.668 57.155 -9.866C58.884 -11.061 60.292 -12.167 62.03 -13.356C62.222 -13.487 62.566 -13.328 62.782 -13.436C63.107 -13.598 63.294 -13.985 63.617 -14.17C63.965 -14.37 64.207 -14.08 64.4 -13.8C63.754 -13.451 63.75 -12.494 63.168 -12.292C62.393 -12.024 61.832 -11.511 61.158 -11.064C60.866 -10.871 60.207 -11.119 60.103 -10.94C59.505 -9.912 58.321 -9.474 57.611 -8.591z"/></g> + <g style="fill: #000000"><path d="M2.2 -58C2.2 -58 -7.038 -60.872 -18.2 -35.2C-18.2 -35.2 -20.6 -30 -23 -28C-25.4 -26 -36.6 -22.4 -38.6 -18.4L-49 -2.4C-49 -2.4 -34.2 -18.4 -31 -20.8C-31 -20.8 -23 -29.2 -26.2 -22.4C-26.2 -22.4 -40.2 -11.6 -39 -2.4C-39 -2.4 -44.6 12 -45.4 14C-45.4 14 -29.4 -18 -27 -19.2C-24.6 -20.4 -23.4 -20.4 -24.6 -16.8C-25.8 -13.2 -26.2 3.2 -29 5.2C-29 5.2 -21 -15.2 -21.8 -18.4C-21.8 -18.4 -18.6 -22 -16.2 -16.8L-17.4 -0.8L-13 11.2C-13 11.2 -15.4 0 -13.8 -15.6C-13.8 -15.6 -15.8 -26 -11.8 -20.4C-7.8 -14.8 1.8 -8.8 1.8 -4C1.8 -4 -3.4 -21.6 -12.6 -26.4L-16.6 -20.4L-17.8 -22.4C-17.8 -22.4 -21.4 -23.2 -17 -30C-12.6 -36.8 -13 -37.6 -13 -37.6C-13 -37.6 -6.6 -30.4 -5 -30.4C-5 -30.4 8.2 -38 9.4 -13.6C9.4 -13.6 16.2 -28 7 -34.8C7 -34.8 -7.8 -36.8 -6.6 -42L0.6 -54.4C4.2 -59.6 2.6 -56.8 2.6 -56.8z"/></g> + <g style="fill: #000000"><path d="M-17.8 -41.6C-17.8 -41.6 -30.6 -41.6 -33.8 -36.4L-41 -26.8C-41 -26.8 -23.8 -36.8 -19.8 -38C-15.8 -39.2 -17.8 -41.6 -17.8 -41.6z"/></g> + <g style="fill: #000000"><path d="M-57.8 -35.2C-57.8 -35.2 -59.8 -34 -60.2 -31.2C-60.6 -28.4 -63 -28 -62.2 -25.2C-61.4 -22.4 -59.4 -20 -59.4 -24C-59.4 -28 -57.8 -30 -57 -31.2C-56.2 -32.4 -54.6 -36.8 -57.8 -35.2z"/></g> + <g style="fill: #000000"><path d="M-66.6 26C-66.6 26 -75 22 -78.2 18.4C-81.4 14.8 -80.948 19.966 -85.8 19.6C-91.647 19.159 -90.6 3.2 -90.6 3.2L-94.6 10.8C-94.6 10.8 -95.8 25.2 -87.8 22.8C-83.893 21.628 -82.6 23.2 -84.2 24C-85.8 24.8 -78.6 25.2 -81.4 26.8C-84.2 28.4 -69.8 23.2 -72.2 33.6L-66.6 26z"/></g> + <g style="fill: #000000"><path d="M-79.2 40.4C-79.2 40.4 -94.6 44.8 -98.2 35.2C-98.2 35.2 -103 37.6 -100.8 40.6C-98.6 43.6 -97.4 44 -97.4 44C-97.4 44 -92 45.2 -92.6 46C-93.2 46.8 -95.6 50.2 -95.6 50.2C-95.6 50.2 -85.4 44.2 -79.2 40.4z"/></g> + <g style="fill: #ffffff"><path d="M149.201 118.601C148.774 120.735 147.103 121.536 145.201 122.201C143.284 121.243 140.686 118.137 138.801 120.201C138.327 119.721 137.548 119.661 137.204 118.999C136.739 118.101 137.011 117.055 136.669 116.257C136.124 114.985 135.415 113.619 135.601 112.201C137.407 111.489 138.002 109.583 137.528 107.82C137.459 107.563 137.03 107.366 137.23 107.017C137.416 106.694 137.734 106.467 138.001 106.2C137.866 106.335 137.721 106.568 137.61 106.548C137 106.442 137.124 105.805 137.254 105.418C137.839 103.672 139.853 103.408 141.201 104.6C141.457 104.035 141.966 104.229 142.401 104.2C142.351 103.621 142.759 103.094 142.957 102.674C143.475 101.576 145.104 102.682 145.901 102.07C146.977 101.245 148.04 100.546 149.118 101.149C150.927 102.162 152.636 103.374 153.835 105.115C154.41 105.949 154.65 107.23 154.592 108.188C154.554 108.835 153.173 108.483 152.83 109.412C152.185 111.16 154.016 111.679 154.772 113.017C154.97 113.366 154.706 113.67 154.391 113.768C153.98 113.896 153.196 113.707 153.334 114.16C154.306 117.353 151.55 118.031 149.201 118.601z"/></g> + <g style="fill: #ffffff"><path d="M139.6 138.201C139.593 136.463 137.992 134.707 139.201 133.001C139.336 133.135 139.467 133.356 139.601 133.356C139.736 133.356 139.867 133.135 140.001 133.001C141.496 135.217 145.148 136.145 145.006 138.991C144.984 139.438 143.897 140.356 144.801 141.001C142.988 142.349 142.933 144.719 142.001 146.601C140.763 146.315 139.551 145.952 138.401 145.401C138.753 143.915 138.636 142.231 139.456 140.911C139.89 140.213 139.603 139.134 139.6 138.201z"/></g> + <g style="fill: #cccccc"><path d="M-26.6 129.201C-26.6 129.201 -43.458 139.337 -29.4 124.001C-20.6 114.401 -10.6 108.801 -10.6 108.801C-10.6 108.801 -0.2 104.4 3.4 103.2C7 102 22.2 96.8 25.4 96.4C28.6 96 38.2 92 45 96C51.8 100 59.8 104.4 59.8 104.4C59.8 104.4 43.4 96 39.8 98.4C36.2 100.8 29 100.4 23 103.6C23 103.6 8.2 108.001 5 110.001C1.8 112.001 -8.6 123.601 -10.2 122.801C-11.8 122.001 -9.8 121.601 -8.6 118.801C-7.4 116.001 -9.4 114.401 -17.4 120.801C-25.4 127.201 -26.6 129.201 -26.6 129.201z"/></g> + <g style="fill: #000000"><path d="M-19.195 123.234C-19.195 123.234 -17.785 110.194 -9.307 111.859C-9.307 111.859 -1.081 107.689 1.641 105.721C1.641 105.721 9.78 104.019 11.09 103.402C29.569 94.702 44.288 99.221 44.835 98.101C45.381 96.982 65.006 104.099 68.615 108.185C69.006 108.628 58.384 102.588 48.686 100.697C40.413 99.083 18.811 100.944 7.905 106.48C4.932 107.989 -4.013 113.773 -6.544 113.662C-9.075 113.55 -19.195 123.234 -19.195 123.234z"/></g> + <g style="fill: #cccccc"><path d="M-23 148.801C-23 148.801 -38.2 146.401 -21.4 144.801C-21.4 144.801 -3.4 142.801 0.6 137.601C0.6 137.601 14.2 128.401 17 128.001C19.8 127.601 49.8 120.401 50.2 118.001C50.6 115.601 56.2 115.601 57.8 116.401C59.4 117.201 58.6 118.401 55.8 119.201C53 120.001 21.8 136.401 15.4 137.601C9 138.801 -2.6 146.401 -7.4 147.601C-12.2 148.801 -23 148.801 -23 148.801z"/></g> + <g style="fill: #000000"><path d="M-3.48 141.403C-3.48 141.403 -12.062 140.574 -3.461 139.755C-3.461 139.755 5.355 136.331 7.403 133.668C7.403 133.668 14.367 128.957 15.8 128.753C17.234 128.548 31.194 124.861 31.399 123.633C31.604 122.404 65.67 109.823 70.09 113.013C73.001 115.114 63.1 113.437 53.466 117.847C52.111 118.467 18.258 133.054 14.981 133.668C11.704 134.283 5.765 138.174 3.307 138.788C0.85 139.403 -3.48 141.403 -3.48 141.403z"/></g> + <g style="fill: #000000"><path d="M-11.4 143.601C-11.4 143.601 -6.2 143.201 -7.4 144.801C-8.6 146.401 -11 145.601 -11 145.601L-11.4 143.601z"/></g> + <g style="fill: #000000"><path d="M-18.6 145.201C-18.6 145.201 -13.4 144.801 -14.6 146.401C-15.8 148.001 -18.2 147.201 -18.2 147.201L-18.6 145.201z"/></g> + <g style="fill: #000000"><path d="M-29 146.801C-29 146.801 -23.8 146.401 -25 148.001C-26.2 149.601 -28.6 148.801 -28.6 148.801L-29 146.801z"/></g> + <g style="fill: #000000"><path d="M-36.6 147.601C-36.6 147.601 -31.4 147.201 -32.6 148.801C-33.8 150.401 -36.2 149.601 -36.2 149.601L-36.6 147.601z"/></g> + <g style="fill: #000000"><path d="M1.8 108.001C1.8 108.001 6.2 108.001 5 109.601C3.8 111.201 0.6 110.801 0.6 110.801L1.8 108.001z"/></g> + <g style="fill: #000000"><path d="M-8.2 113.601C-8.2 113.601 -1.694 111.46 -4.2 114.801C-5.4 116.401 -7.8 115.601 -7.8 115.601L-8.2 113.601z"/></g> + <g style="fill: #000000"><path d="M-19.4 118.401C-19.4 118.401 -14.2 118.001 -15.4 119.601C-16.6 121.201 -19 120.401 -19 120.401L-19.4 118.401z"/></g> + <g style="fill: #000000"><path d="M-27 124.401C-27 124.401 -21.8 124.001 -23 125.601C-24.2 127.201 -26.6 126.401 -26.6 126.401L-27 124.401z"/></g> + <g style="fill: #000000"><path d="M-33.8 129.201C-33.8 129.201 -28.6 128.801 -29.8 130.401C-31 132.001 -33.4 131.201 -33.4 131.201L-33.8 129.201z"/></g> + <g style="fill: #000000"><path d="M5.282 135.598C5.282 135.598 12.203 135.066 10.606 137.195C9.009 139.325 5.814 138.26 5.814 138.26L5.282 135.598z"/></g> + <g style="fill: #000000"><path d="M15.682 130.798C15.682 130.798 22.603 130.266 21.006 132.395C19.409 134.525 16.214 133.46 16.214 133.46L15.682 130.798z"/></g> + <g style="fill: #000000"><path d="M26.482 126.398C26.482 126.398 33.403 125.866 31.806 127.995C30.209 130.125 27.014 129.06 27.014 129.06L26.482 126.398z"/></g> + <g style="fill: #000000"><path d="M36.882 121.598C36.882 121.598 43.803 121.066 42.206 123.195C40.609 125.325 37.414 124.26 37.414 124.26L36.882 121.598z"/></g> + <g style="fill: #000000"><path d="M9.282 103.598C9.282 103.598 16.203 103.066 14.606 105.195C13.009 107.325 9.014 107.06 9.014 107.06L9.282 103.598z"/></g> + <g style="fill: #000000"><path d="M19.282 100.398C19.282 100.398 26.203 99.866 24.606 101.995C23.009 104.125 18.614 103.86 18.614 103.86L19.282 100.398z"/></g> + <g style="fill: #000000"><path d="M-3.4 140.401C-3.4 140.401 1.8 140.001 0.6 141.601C-0.6 143.201 -3 142.401 -3 142.401L-3.4 140.401z"/></g> + <g style="fill: #992600"><path d="M-76.6 41.2C-76.6 41.2 -81 50 -81.4 53.2C-81.4 53.2 -80.6 44.4 -79.4 42.4C-78.2 40.4 -76.6 41.2 -76.6 41.2z"/></g> + <g style="fill: #992600"><path d="M-95 55.2C-95 55.2 -98.2 69.6 -97.8 72.4C-97.8 72.4 -99 60.8 -98.6 59.6C-98.2 58.4 -95 55.2 -95 55.2z"/></g> + <g style="fill: #cccccc"><path d="M-74.2 -19.4L-74.4 -16.2L-76.6 -16C-76.6 -16 -62.4 -3.4 -61.8 4.2C-61.8 4.2 -61 -4 -74.2 -19.4z"/></g> + <g style="fill: #000000"><path d="M-70.216 -18.135C-70.647 -18.551 -70.428 -19.296 -70.836 -19.556C-71.645 -20.072 -69.538 -20.129 -69.766 -20.845C-70.149 -22.051 -69.962 -22.072 -70.084 -23.348C-70.141 -23.946 -69.553 -25.486 -69.168 -25.926C-67.722 -27.578 -69.046 -30.51 -67.406 -32.061C-67.102 -32.35 -66.726 -32.902 -66.441 -33.32C-65.782 -34.283 -64.598 -34.771 -63.648 -35.599C-63.33 -35.875 -63.531 -36.702 -62.962 -36.61C-62.248 -36.495 -61.007 -36.625 -61.052 -35.784C-61.165 -33.664 -62.494 -31.944 -63.774 -30.276C-63.323 -29.572 -63.781 -28.937 -64.065 -28.38C-65.4 -25.76 -65.211 -22.919 -65.385 -20.079C-65.39 -19.994 -65.697 -19.916 -65.689 -19.863C-65.336 -17.528 -64.752 -15.329 -63.873 -13.1C-63.507 -12.17 -63.036 -11.275 -62.886 -10.348C-62.775 -9.662 -62.672 -8.829 -63.08 -8.124C-61.045 -5.234 -62.354 -2.583 -61.185 0.948C-60.978 1.573 -59.286 3.487 -59.749 3.326C-62.262 2.455 -62.374 2.057 -62.551 1.304C-62.697 0.681 -63.027 -0.696 -63.264 -1.298C-63.328 -1.462 -63.499 -3.346 -63.577 -3.468C-65.09 -5.85 -63.732 -5.674 -65.102 -8.032C-66.53 -8.712 -67.496 -9.816 -68.619 -10.978C-68.817 -11.182 -67.674 -11.906 -67.855 -12.119C-68.947 -13.408 -70.1 -14.175 -69.764 -15.668C-69.609 -16.358 -69.472 -17.415 -70.216 -18.135z"/></g> + <g style="fill: #000000"><path d="M-73.8 -16.4C-73.8 -16.4 -73.4 -9.6 -71 -8C-68.6 -6.4 -69.8 -7.2 -73 -8.4C-76.2 -9.6 -75 -10.4 -75 -10.4C-75 -10.4 -77.8 -10 -75.4 -8C-73 -6 -69.4 -3.6 -71 -3.6C-72.6 -3.6 -80.2 -7.6 -80.2 -10.4C-80.2 -13.2 -81.2 -17.3 -81.2 -17.3C-81.2 -17.3 -80.1 -18.1 -75.3 -18C-75.3 -18 -73.9 -17.3 -73.8 -16.4z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M-74.6 2.2C-74.6 2.2 -83.12 -0.591 -101.6 2.8C-101.6 2.8 -92.569 0.722 -73.8 3C-63.5 4.25 -74.6 2.2 -74.6 2.2z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M-72.502 2.129C-72.502 2.129 -80.748 -1.389 -99.453 0.392C-99.453 0.392 -90.275 -0.897 -71.774 2.995C-61.62 5.131 -72.502 2.129 -72.502 2.129z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M-70.714 2.222C-70.714 2.222 -78.676 -1.899 -97.461 -1.514C-97.461 -1.514 -88.213 -2.118 -70.052 3.14C-60.086 6.025 -70.714 2.222 -70.714 2.222z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M-69.444 2.445C-69.444 2.445 -76.268 -1.862 -93.142 -2.96C-93.142 -2.96 -84.803 -2.79 -68.922 3.319C-60.206 6.672 -69.444 2.445 -69.444 2.445z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M45.84 12.961C45.84 12.961 44.91 13.605 45.124 12.424C45.339 11.243 73.547 -1.927 77.161 -1.677C77.161 -1.677 46.913 11.529 45.84 12.961z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M42.446 13.6C42.446 13.6 41.57 14.315 41.691 13.121C41.812 11.927 68.899 -3.418 72.521 -3.452C72.521 -3.452 43.404 12.089 42.446 13.6z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M39.16 14.975C39.16 14.975 38.332 15.747 38.374 14.547C38.416 13.348 58.233 -2.149 68.045 -4.023C68.045 -4.023 50.015 4.104 39.16 14.975z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M36.284 16.838C36.284 16.838 35.539 17.532 35.577 16.453C35.615 15.373 53.449 1.426 62.28 -0.26C62.28 -0.26 46.054 7.054 36.284 16.838z"/></g> + <g style="fill: #cccccc"><path d="M4.6 164.801C4.6 164.801 -10.6 162.401 6.2 160.801C6.2 160.801 24.2 158.801 28.2 153.601C28.2 153.601 41.8 144.401 44.6 144.001C47.4 143.601 63.8 140.001 64.2 137.601C64.6 135.201 70.6 132.801 72.2 133.601C73.8 134.401 73.8 143.601 71 144.401C68.2 145.201 49.4 152.401 43 153.601C36.6 154.801 25 162.401 20.2 163.601C15.4 164.801 4.6 164.801 4.6 164.801z"/></g> + <g style="fill: #000000"><path d="M77.6 127.401C77.6 127.401 74.6 129.001 73.4 131.601C73.4 131.601 67 142.201 52.8 145.401C52.8 145.401 29.8 154.401 22 156.401C22 156.401 8.6 161.401 1.2 160.601C1.2 160.601 -5.8 160.801 0.4 162.401C0.4 162.401 20.6 160.401 24 158.601C24 158.601 39.6 153.401 42.6 150.801C45.6 148.201 63.8 143.201 66 141.201C68.2 139.201 78 130.801 77.6 127.401z"/></g> + <g style="fill: #000000"><path d="M18.882 158.911C18.882 158.911 24.111 158.685 22.958 160.234C21.805 161.784 19.357 160.91 19.357 160.91L18.882 158.911z"/></g> + <g style="fill: #000000"><path d="M11.68 160.263C11.68 160.263 16.908 160.037 15.756 161.586C14.603 163.136 12.155 162.263 12.155 162.263L11.68 160.263z"/></g> + <g style="fill: #000000"><path d="M1.251 161.511C1.251 161.511 6.48 161.284 5.327 162.834C4.174 164.383 1.726 163.51 1.726 163.51L1.251 161.511z"/></g> + <g style="fill: #000000"><path d="M-6.383 162.055C-6.383 162.055 -1.154 161.829 -2.307 163.378C-3.46 164.928 -5.908 164.054 -5.908 164.054L-6.383 162.055z"/></g> + <g style="fill: #000000"><path d="M35.415 151.513C35.415 151.513 42.375 151.212 40.84 153.274C39.306 155.336 36.047 154.174 36.047 154.174L35.415 151.513z"/></g> + <g style="fill: #000000"><path d="M45.73 147.088C45.73 147.088 51.689 143.787 51.155 148.849C50.885 151.405 46.362 149.749 46.362 149.749L45.73 147.088z"/></g> + <g style="fill: #000000"><path d="M54.862 144.274C54.862 144.274 62.021 140.573 60.287 146.035C59.509 148.485 55.493 146.935 55.493 146.935L54.862 144.274z"/></g> + <g style="fill: #000000"><path d="M64.376 139.449C64.376 139.449 68.735 134.548 69.801 141.21C70.207 143.748 65.008 142.11 65.008 142.11L64.376 139.449z"/></g> + <g style="fill: #000000"><path d="M26.834 155.997C26.834 155.997 32.062 155.77 30.91 157.32C29.757 158.869 27.308 157.996 27.308 157.996L26.834 155.997z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M62.434 34.603C62.434 34.603 61.708 35.268 61.707 34.197C61.707 33.127 79.191 19.863 88.034 18.479C88.034 18.479 71.935 25.208 62.434 34.603z"/></g> + <g style="fill: #000000"><path d="M65.4 98.4C65.4 98.4 87.401 120.801 96.601 124.401C96.601 124.401 105.801 135.601 101.801 161.601C101.801 161.601 98.601 169.201 95.401 148.401C95.401 148.401 98.601 123.201 87.401 139.201C87.401 139.201 79 129.301 85.4 129.601C85.4 129.601 88.601 131.601 89.001 130.001C89.401 128.401 81.4 114.801 64.2 100.4C47 86 65.4 98.4 65.4 98.4z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M7 137.201C7 137.201 6.8 135.401 8.6 136.201C10.4 137.001 104.601 143.201 136.201 167.201C136.201 167.201 91.001 144.001 7 137.201z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M17.4 132.801C17.4 132.801 17.2 131.001 19 131.801C20.8 132.601 157.401 131.601 181.001 164.001C181.001 164.001 159.001 138.801 17.4 132.801z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M29 128.801C29 128.801 28.8 127.001 30.6 127.801C32.4 128.601 205.801 115.601 229.401 148.001C229.401 148.001 219.801 122.401 29 128.801z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M39 124.001C39 124.001 38.8 122.201 40.6 123.001C42.4 123.801 164.601 85.2 188.201 117.601C188.201 117.601 174.801 93 39 124.001z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M-19 146.801C-19 146.801 -19.2 145.001 -17.4 145.801C-15.6 146.601 2.2 148.801 4.2 187.601C4.2 187.601 -3 145.601 -19 146.801z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M-27.8 148.401C-27.8 148.401 -28 146.601 -26.2 147.401C-24.4 148.201 -10.2 143.601 -13 182.401C-13 182.401 -11.8 147.201 -27.8 148.401z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M-35.8 148.801C-35.8 148.801 -36 147.001 -34.2 147.801C-32.4 148.601 -17 149.201 -29.4 171.601C-29.4 171.601 -19.8 147.601 -35.8 148.801z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M11.526 104.465C11.526 104.465 11.082 106.464 12.631 105.247C28.699 92.622 61.141 33.72 116.826 28.086C116.826 28.086 78.518 15.976 11.526 104.465z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M22.726 102.665C22.726 102.665 21.363 101.472 23.231 100.847C25.099 100.222 137.541 27.72 176.826 35.686C176.826 35.686 149.719 28.176 22.726 102.665z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M1.885 108.767C1.885 108.767 1.376 110.366 3.087 109.39C12.062 104.27 15.677 47.059 59.254 45.804C59.254 45.804 26.843 31.09 1.885 108.767z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M-18.038 119.793C-18.038 119.793 -19.115 121.079 -17.162 120.825C-6.916 119.493 14.489 78.222 58.928 83.301C58.928 83.301 26.962 68.955 -18.038 119.793z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M-6.8 113.667C-6.8 113.667 -7.611 115.136 -5.742 114.511C4.057 111.237 17.141 66.625 61.729 63.078C61.729 63.078 27.603 55.135 -6.8 113.667z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M-25.078 124.912C-25.078 124.912 -25.951 125.954 -24.369 125.748C-16.07 124.669 1.268 91.24 37.264 95.354C37.264 95.354 11.371 83.734 -25.078 124.912z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M-32.677 130.821C-32.677 130.821 -33.682 131.866 -32.091 131.748C-27.923 131.439 2.715 98.36 21.183 113.862C21.183 113.862 9.168 95.139 -32.677 130.821z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M36.855 98.898C36.855 98.898 35.654 97.543 37.586 97.158C39.518 96.774 160.221 39.061 198.184 51.927C198.184 51.927 172.243 41.053 36.855 98.898z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M3.4 163.201C3.4 163.201 3.2 161.401 5 162.201C6.8 163.001 22.2 163.601 9.8 186.001C9.8 186.001 19.4 162.001 3.4 163.201z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M13.8 161.601C13.8 161.601 13.6 159.801 15.4 160.601C17.2 161.401 35 163.601 37 202.401C37 202.401 29.8 160.401 13.8 161.601z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M20.6 160.001C20.6 160.001 20.4 158.201 22.2 159.001C24 159.801 48.6 163.201 72.2 195.601C72.2 195.601 36.6 158.801 20.6 160.001z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M28.225 157.972C28.225 157.972 27.788 156.214 29.678 156.768C31.568 157.322 52.002 155.423 90.099 189.599C90.099 189.599 43.924 154.656 28.225 157.972z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M38.625 153.572C38.625 153.572 38.188 151.814 40.078 152.368C41.968 152.922 76.802 157.423 128.499 192.399C128.499 192.399 54.324 150.256 38.625 153.572z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M-1.8 142.001C-1.8 142.001 -2 140.201 -0.2 141.001C1.6 141.801 55 144.401 85.4 171.201C85.4 171.201 50.499 146.426 -1.8 142.001z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M-11.8 146.001C-11.8 146.001 -12 144.201 -10.2 145.001C-8.4 145.801 16.2 149.201 39.8 181.601C39.8 181.601 4.2 144.801 -11.8 146.001z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M49.503 148.962C49.503 148.962 48.938 147.241 50.864 147.655C52.79 148.068 87.86 150.004 141.981 181.098C141.981 181.098 64.317 146.704 49.503 148.962z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M57.903 146.562C57.903 146.562 57.338 144.841 59.264 145.255C61.19 145.668 96.26 147.604 150.381 178.698C150.381 178.698 73.317 143.904 57.903 146.562z"/></g> + <g style="fill: #ffffff; stroke:#000000; stroke-width:0.1"><path d="M67.503 141.562C67.503 141.562 66.938 139.841 68.864 140.255C70.79 140.668 113.86 145.004 203.582 179.298C203.582 179.298 82.917 138.904 67.503 141.562z"/></g> + <g style="fill: #000000"><path d="M-43.8 148.401C-43.8 148.401 -38.6 148.001 -39.8 149.601C-41 151.201 -43.4 150.401 -43.4 150.401L-43.8 148.401z"/></g> + <g style="fill: #000000"><path d="M-13 162.401C-13 162.401 -7.8 162.001 -9 163.601C-10.2 165.201 -12.6 164.401 -12.6 164.401L-13 162.401z"/></g> + <g style="fill: #000000"><path d="M-21.8 162.001C-21.8 162.001 -16.6 161.601 -17.8 163.201C-19 164.801 -21.4 164.001 -21.4 164.001L-21.8 162.001z"/></g> + <g style="fill: #000000"><path d="M-117.169 150.182C-117.169 150.182 -112.124 151.505 -113.782 152.624C-115.439 153.744 -117.446 152.202 -117.446 152.202L-117.169 150.182z"/></g> + <g style="fill: #000000"><path d="M-115.169 140.582C-115.169 140.582 -110.124 141.905 -111.782 143.024C-113.439 144.144 -115.446 142.602 -115.446 142.602L-115.169 140.582z"/></g> + <g style="fill: #000000"><path d="M-122.369 136.182C-122.369 136.182 -117.324 137.505 -118.982 138.624C-120.639 139.744 -122.646 138.202 -122.646 138.202L-122.369 136.182z"/></g> + <g style="fill: #cccccc"><path d="M-42.6 211.201C-42.6 211.201 -44.2 211.201 -48.2 213.201C-50.2 213.201 -61.4 216.801 -67 226.801C-67 226.801 -54.6 217.201 -42.6 211.201z"/></g> + <g style="fill: #cccccc"><path d="M45.116 303.847C45.257 304.105 45.312 304.525 45.604 304.542C46.262 304.582 47.495 304.883 47.37 304.247C46.522 299.941 45.648 295.004 41.515 293.197C40.876 292.918 39.434 293.331 39.36 294.215C39.233 295.739 39.116 297.088 39.425 298.554C39.725 299.975 41.883 299.985 42.8 298.601C43.736 300.273 44.168 302.116 45.116 303.847z"/></g> + <g style="fill: #cccccc"><path d="M34.038 308.581C34.786 309.994 34.659 311.853 36.074 312.416C36.814 312.71 38.664 311.735 38.246 310.661C37.444 308.6 37.056 306.361 35.667 304.55C35.467 304.288 35.707 303.755 35.547 303.427C34.953 302.207 33.808 301.472 32.4 301.801C31.285 304.004 32.433 306.133 33.955 307.842C34.091 307.994 33.925 308.37 34.038 308.581z"/></g> + <g style="fill: #cccccc"><path d="M-5.564 303.391C-5.672 303.014 -5.71 302.551 -5.545 302.23C-5.014 301.197 -4.221 300.075 -4.558 299.053C-4.906 297.997 -6.022 298.179 -6.672 298.748C-7.807 299.742 -7.856 301.568 -8.547 302.927C-8.743 303.313 -8.692 303.886 -9.133 304.277C-9.607 304.698 -10.047 306.222 -9.951 306.793C-9.898 307.106 -10.081 317.014 -9.859 316.751C-9.24 316.018 -6.19 306.284 -6.121 305.392C-6.064 304.661 -5.332 304.196 -5.564 303.391z"/></g> + <g style="fill: #cccccc"><path d="M-31.202 296.599C-28.568 294.1 -25.778 291.139 -26.22 287.427C-26.336 286.451 -28.111 286.978 -28.298 287.824C-29.1 291.449 -31.139 294.11 -33.707 296.502C-35.903 298.549 -37.765 304.893 -38 305.401C-34.303 300.145 -32.046 297.399 -31.202 296.599z"/></g> + <g style="fill: #cccccc"><path d="M-44.776 290.635C-44.253 290.265 -44.555 289.774 -44.338 289.442C-43.385 287.984 -42.084 286.738 -42.066 285C-42.063 284.723 -42.441 284.414 -42.776 284.638C-43.053 284.822 -43.395 284.952 -43.503 285.082C-45.533 287.531 -46.933 290.202 -48.376 293.014C-48.559 293.371 -49.703 297.862 -49.39 297.973C-49.151 298.058 -47.431 293.877 -47.221 293.763C-45.958 293.077 -45.946 291.462 -44.776 290.635z"/></g> + <g style="fill: #cccccc"><path d="M-28.043 310.179C-27.599 309.31 -26.023 308.108 -26.136 307.219C-26.254 306.291 -25.786 304.848 -26.698 305.536C-27.955 306.484 -31.404 307.833 -31.674 313.641C-31.7 314.212 -28.726 311.519 -28.043 310.179z"/></g> + <g style="fill: #cccccc"><path d="M-13.6 293.001C-13.2 292.333 -12.492 292.806 -12.033 292.543C-11.385 292.171 -10.774 291.613 -10.482 290.964C-9.512 288.815 -7.743 286.995 -7.6 284.601C-9.091 283.196 -9.77 285.236 -10.4 286.201C-11.723 284.554 -12.722 286.428 -14.022 286.947C-14.092 286.975 -14.305 286.628 -14.38 286.655C-15.557 287.095 -16.237 288.176 -17.235 288.957C-17.406 289.091 -17.811 288.911 -17.958 289.047C-18.61 289.65 -19.583 289.975 -19.863 290.657C-20.973 293.364 -24.113 295.459 -26 303.001C-25.619 303.91 -21.488 296.359 -21.001 295.661C-20.165 294.465 -20.047 297.322 -18.771 296.656C-18.72 296.629 -18.534 296.867 -18.4 297.001C-18.206 296.721 -17.988 296.492 -17.6 296.601C-17.6 296.201 -17.734 295.645 -17.533 295.486C-16.296 294.509 -16.38 293.441 -15.6 292.201C-15.142 292.99 -14.081 292.271 -13.6 293.001z"/></g> + <g style="fill: #cccccc"><path d="M46.2 347.401C46.2 347.401 53.6 327.001 49.2 315.801C49.2 315.801 60.6 337.401 56 348.601C56 348.601 55.6 338.201 51.6 333.201C51.6 333.201 47.6 346.001 46.2 347.401z"/></g> + <g style="fill: #cccccc"><path d="M31.4 344.801C31.4 344.801 36.8 336.001 28.8 317.601C28.8 317.601 28 338.001 21.2 349.001C21.2 349.001 35.4 328.801 31.4 344.801z"/></g> + <g style="fill: #cccccc"><path d="M21.4 342.801C21.4 342.801 21.2 322.801 21.6 319.801C21.6 319.801 17.8 336.401 7.6 346.001C7.6 346.001 22 334.001 21.4 342.801z"/></g> + <g style="fill: #cccccc"><path d="M11.8 310.801C11.8 310.801 17.8 324.401 7.8 342.801C7.8 342.801 14.2 330.601 9.4 323.601C9.4 323.601 12 320.201 11.8 310.801z"/></g> + <g style="fill: #cccccc"><path d="M-7.4 342.401C-7.4 342.401 -8.4 326.801 -6.6 324.601C-6.6 324.601 -6.4 318.201 -6.8 317.201C-6.8 317.201 -2.8 311.001 -2.6 318.401C-2.6 318.401 -1.2 326.201 1.6 330.801C1.6 330.801 5.2 336.201 5 342.601C5 342.601 -5 312.401 -7.4 342.401z"/></g> + <g style="fill: #cccccc"><path d="M-11 314.801C-11 314.801 -17.6 325.601 -19.4 344.601C-19.4 344.601 -20.8 338.401 -17 324.001C-17 324.001 -12.8 308.601 -11 314.801z"/></g> + <g style="fill: #cccccc"><path d="M-32.8 334.601C-32.8 334.601 -27.8 329.201 -26.4 324.201C-26.4 324.201 -22.8 308.401 -29.2 317.001C-29.2 317.001 -29 325.001 -37.2 332.401C-37.2 332.401 -32.4 330.001 -32.8 334.601z"/></g> + <g style="fill: #cccccc"><path d="M-38.6 329.601C-38.6 329.601 -35.2 312.201 -34.4 311.401C-34.4 311.401 -32.6 308.001 -35.4 311.201C-35.4 311.201 -44.2 330.401 -48.2 337.001C-48.2 337.001 -40.2 327.801 -38.6 329.601z"/></g> + <g style="fill: #cccccc"><path d="M-44.4 313.001C-44.4 313.001 -32.8 290.601 -54.6 316.401C-54.6 316.401 -43.6 306.601 -44.4 313.001z"/></g> + <g style="fill: #cccccc"><path d="M-59.8 298.401C-59.8 298.401 -55 279.601 -52.4 279.801C-52.4 279.801 -44.2 270.801 -50.8 281.401C-50.8 281.401 -56.8 291.001 -56.2 300.801C-56.2 300.801 -56.8 291.201 -59.8 298.401z"/></g> + <g style="fill: #cccccc"><path d="M270.5 287C270.5 287 258.5 277 256 273.5C256 273.5 269.5 292 269.5 299C269.5 299 272 291.5 270.5 287z"/></g> + <g style="fill: #cccccc"><path d="M276 265C276 265 255 250 251.5 242.5C251.5 242.5 278 272 278 276.5C278 276.5 278.5 267.5 276 265z"/></g> + <g style="fill: #cccccc"><path d="M293 111C293 111 281 103 279.5 105C279.5 105 290 111.5 292.5 120C292.5 120 291 111 293 111z"/></g> + <g style="fill: #cccccc"><path d="M301.5 191.5L284 179.5C284 179.5 303 196.5 303.5 200.5L301.5 191.5z"/></g> + <g style="stroke:#000000"><path d="M-89.25 169L-67.25 173.75"/></g> + <g style="stroke:#000000"><path d="M-39 331C-39 331 -39.5 327.5 -48.5 338"/></g> + <g style="stroke:#000000"><path d="M-33.5 336C-33.5 336 -31.5 329.5 -38 334"/></g> + <g style="stroke:#000000"><path d="M20.5 344.5C20.5 344.5 22 333.5 10.5 346.5"/></g> + </g> + </draw> +</page>'; + + // convert to PDF + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('L', 'A4', 'fr'); + $html2pdf->pdf->SetDisplayMode('fullpage'); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('svg_tiger.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/svg_tree.php b/assets/html2pdf/examples/svg_tree.php new file mode 100644 index 0000000..1cf430c --- /dev/null +++ b/assets/html2pdf/examples/svg_tree.php @@ -0,0 +1,140 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + +$content = ' +<page> + <draw style="margin: auto; width:180mm; height:240mm; background: #444444; border: solid 0.5mm #777777;"> + <g transform="translate(90mm,120mm) scale(1.8) translate(-250,-245)"> + <path d="M 157.219 412.757 C 158.128 465.467 355.334 465.467 354.425 413.666 C 353.516 358.23 159.036 357.322 157.219 412.757 z " id="path749" sodipodi:nodetypes="ccc" style="fill:#623e35;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:3.75;stroke-linejoin:bevel;stroke-linecap:butt;fill-opacity:1;stroke-dasharray:none;"/> + <path d="M 212.655 306.43 L 211.746 413.665 C 219.694 425.479 288.517 427.298 299.898 412.757 L 299.898 305.521 C 289.901 320.97 232.647 326.423 212.655 306.43 z " id="path748" sodipodi:nodetypes="ccccc" style="fill:#623e35;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:4.76806;stroke-linejoin:bevel;stroke-linecap:butt;fill-opacity:1;stroke-dasharray:none;" transform="matrix(0.618557,0.000000,0.000000,1.000000,98.94439,-0.908813)"/> + <path d="M 248.097 24.7078 C 244.462 35.6132 134.5 111.951 71.7941 150.119 C 109.053 250.994 394.412 247.359 425.31 150.121 C 371.692 134.671 250.823 34.7044 248.097 24.7078 z " id="path747" sodipodi:nodetypes="cccc" style="fill:#009500;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:3.75;stroke-linejoin:bevel;stroke-linecap:butt;fill-opacity:1;stroke-dasharray:none;" transform="translate(0.908775,139.0434)"/> + <path d="M 248.097 24.7078 C 244.462 35.6132 168.125 111.951 105.419 150.119 C 144.496 206.464 356.243 212.826 390.776 148.303 C 337.158 132.853 250.823 34.7044 248.097 24.7078 z " id="path746" sodipodi:nodetypes="cccc" style="fill:#009500;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:3.75;stroke-linejoin:bevel;stroke-linecap:butt;fill-opacity:1;stroke-dasharray:none;" transform="translate(-3.725290e-7,71.79367)"/> + <path d="M 157.343 412.757 L 158.596 431.841 C 201.308 481.824 340.324 469.226 353.047 431.966 L 354.205 412.757 C 356.023 466.375 160.07 463.649 157.343 412.757 z " id="path750" sodipodi:nodetypes="ccccc" style="fill:#623e35;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:3.75;stroke-linejoin:bevel;stroke-linecap:butt;fill-opacity:1;stroke-dasharray:none;"/> + <path d="M 248.097 24.7078 C 244.462 35.6132 207.202 107.407 144.497 145.575 C 181.756 190.106 322.618 193.742 357.151 146.485 C 303.533 131.035 250.823 34.7044 248.097 24.7078 z " id="path745" sodipodi:nodetypes="cccc" style="fill:#009500;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:3.75;stroke-linejoin:bevel;stroke-linecap:butt;fill-opacity:1;stroke-dasharray:none;"/> + <path d="M 247.188 38.3395 C 219.016 91.0487 170.85 136.488 151.766 145.575 C 159.946 160.116 206.293 174.657 225.378 171.931 C 213.564 141.032 216.289 111.951 247.188 38.3395 z " id="path751" sodipodi:nodetypes="cccc" style="fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.5;"/> + <path d="M 179.938 171.93 C 168.124 181.927 125.412 215.552 114.506 222.822 C 106.327 223.731 157.219 251.903 175.395 251.903 C 135.408 228.275 217.199 177.383 179.938 171.93 z " id="path752" sodipodi:nodetypes="cccc" style="fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.498039;"/> + <path d="M 140.861 250.994 C 126.321 260.082 102.692 277.349 78.1551 290.071 C 83.6078 310.065 123.594 335.511 132.682 338.237 C 96.331 292.798 175.395 260.082 140.861 250.994 z " id="path753" sodipodi:nodetypes="cccc" style="fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.498039;"/> + <path d="M 233.308 366.285 C 234.121 379.008 231.643 403.487 233.623 413.293 C 247.255 420.056 256.276 418.554 266.962 418.114 C 253.33 412.661 242.329 402.388 233.308 366.285 z " id="path755" sodipodi:nodetypes="cccc" style="fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.3;"/> + <path d="M 222.459 376.374 C 201.797 379.129 155.308 391.181 161.506 415.975 C 167.705 438.703 213.505 443.18 226.247 446.624 C 220.048 439.392 171.837 405.988 222.459 376.374 z " id="path756" sodipodi:nodetypes="cccc" style="fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.3;"/> + <path d="M 161.162 428.028 C 163.573 429.061 172.871 441.803 208.685 456.955 C 193.532 452.822 163.228 440.425 161.162 428.028 z " id="path757" sodipodi:nodetypes="ccc" style="fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.3;" transform=""/> + <path d="M 315.437 454.544 C 329.556 448.345 346.774 443.524 349.873 432.505 C 355.039 422.174 348.496 436.292 315.437 454.544 z " id="path758" sodipodi:nodetypes="ccc" style="fill:#000011;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.25;"/> + <path d="M 287.888 377.407 C 326.457 377.407 383.965 411.154 327.834 438.359 C 362.615 398.413 287.888 378.44 287.888 377.407 z " id="path759" sodipodi:nodetypes="ccc" style="fill:#000011;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.247059;"/> + <path d="M 259.65 366.043 C 259.65 366.043 279.967 363.288 281.345 365.698 C 282.722 368.109 281.689 387.049 281.001 391.87 C 279.968 382.572 282.378 368.798 259.65 366.043 z " id="path760" sodipodi:nodetypes="cccc" style="fill:#000011;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.247059;"/> + <path d="M 387.929 328.061 C 401.191 322.851 418.716 301.536 421.559 292.536 C 418.243 288.747 385.56 275.484 377.982 268.853 C 383.666 278.326 409.717 297.747 387.929 328.061 z " id="path761" sodipodi:nodetypes="cccc" style="fill:#000011;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.247059;"/> + <path d="M 352.404 245.644 C 370.876 238.539 382.244 229.065 384.613 222.908 C 375.613 219.119 355.246 205.856 345.299 200.172 C 352.878 208.224 368.509 221.487 352.404 245.644 z " id="path762" sodipodi:nodetypes="cccc" style="fill:#000011;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.247059;"/> + <path d="M 305.038 115.861 C 312.617 126.755 346.72 147.595 350.51 148.543 C 345.773 156.122 322.09 168.437 313.09 169.384 C 308.354 168.911 336.773 152.806 305.038 115.861 z " id="path763" sodipodi:nodetypes="cccc" style="fill:#000011;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.247059;"/> + <g id="g771" transform="translate(-249.1874,169.4743)"> + <path d="M 424.69 52.5344 C 445.456 51.8645 445.456 82.0082 426.03 82.0082 C 401.245 82.678 404.594 53.2043 424.69 52.5344 z " id="path772" sodipodi:nodetypes="ccc" style="fill:#ff0000;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:3.75;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;stroke-dasharray:none;"/> + <path d="M 425.36 55.2139 C 423.35 53.2043 401.915 63.922 415.982 75.3096 C 424.691 74.6397 427.37 57.2234 425.36 55.2139 z " id="path773" sodipodi:nodetypes="ccc" style="fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.7;"/> + </g> + <g id="g774" transform="translate(-46.89011,243.8286)"> + <path d="M 424.69 52.5344 C 445.456 51.8645 445.456 82.0082 426.03 82.0082 C 401.245 82.678 404.594 53.2043 424.69 52.5344 z " id="path775" sodipodi:nodetypes="ccc" style="fill:#ff0000;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:3.75;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;stroke-dasharray:none;"/> + <path d="M 425.36 55.2139 C 423.35 53.2043 401.915 63.922 415.982 75.3096 C 424.691 74.6397 427.37 57.2234 425.36 55.2139 z " id="path776" sodipodi:nodetypes="ccc" style="fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.7;"/> + </g> + <g id="g777" transform="translate(-226.4122,271.2928)"> + <path d="M 424.69 52.5344 C 445.456 51.8645 445.456 82.0082 426.03 82.0082 C 401.245 82.678 404.594 53.2043 424.69 52.5344 z " id="path778" sodipodi:nodetypes="ccc" style="fill:#ff0000;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:3.75;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;stroke-dasharray:none;"/> + <path d="M 425.36 55.2139 C 423.35 53.2043 401.915 63.922 415.982 75.3096 C 424.691 74.6397 427.37 57.2234 425.36 55.2139 z " id="path779" sodipodi:nodetypes="ccc" style="fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.7;"/> + </g> + <g id="g780" transform="translate(-117.8951,83.73234)"> + <path d="M 424.69 52.5344 C 445.456 51.8645 445.456 82.0082 426.03 82.0082 C 401.245 82.678 404.594 53.2043 424.69 52.5344 z " id="path781" sodipodi:nodetypes="ccc" style="fill:#ff0000;fill-rule:evenodd;stroke:black;stroke-opacity:1;stroke-width:3.75;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;stroke-dasharray:none;"/> + <path d="M 425.36 55.2139 C 423.35 53.2043 401.915 63.922 415.982 75.3096 C 424.691 74.6397 427.37 57.2234 425.36 55.2139 z " id="path782" sodipodi:nodetypes="ccc" style="fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.7;"/> + </g> + <g id="g791" transform="translate(-236.4601,103.1582)"> + <path d="M 424.69 52.5344 C 445.456 51.8645 445.456 82.0082 426.03 82.0082 C 401.245 82.678 404.594 53.2043 424.69 52.5344 z " id="path792" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ff00ff;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;fill-opacity:1;"/> + <path d="M 425.36 55.2139 C 423.35 53.2043 401.915 63.922 415.982 75.3096 C 424.691 74.6397 427.37 57.2234 425.36 55.2139 z " id="path793" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ffffff;fill-opacity:0.7;fill-rule:evenodd;stroke-width:1pt;"/> + </g> + <g id="g794" transform="translate(-85.74192,124.5937)"> + <path d="M 424.69 52.5344 C 445.456 51.8645 445.456 82.0082 426.03 82.0082 C 401.245 82.678 404.594 53.2043 424.69 52.5344 z " id="path795" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ff00ff;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;fill-opacity:1;"/> + <path d="M 425.36 55.2139 C 423.35 53.2043 401.915 63.922 415.982 75.3096 C 424.691 74.6397 427.37 57.2234 425.36 55.2139 z " id="path796" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ffffff;fill-opacity:0.7;fill-rule:evenodd;stroke-width:1pt;"/> + </g> + <g id="g797" transform="translate(-144.0196,236.4601)"> + <path d="M 424.69 52.5344 C 445.456 51.8645 445.456 82.0082 426.03 82.0082 C 401.245 82.678 404.594 53.2043 424.69 52.5344 z " id="path798" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ff00ff;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;fill-opacity:1;"/> + <path d="M 425.36 55.2139 C 423.35 53.2043 401.915 63.922 415.982 75.3096 C 424.691 74.6397 427.37 57.2234 425.36 55.2139 z " id="path799" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ffffff;fill-opacity:0.7;fill-rule:evenodd;stroke-width:1pt;"/> + </g> + <g id="g808" transform="translate(-158.7565,60.28728)"> + <path d="M 424.69 52.5344 C 445.456 51.8645 445.456 82.0082 426.03 82.0082 C 401.245 82.678 404.594 53.2043 424.69 52.5344 z " id="path809" sodipodi:nodetypes="ccc" style="font-size:12;fill:#0000ff;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;fill-opacity:1;"/> + <path d="M 425.36 55.2139 C 423.35 53.2043 401.915 63.922 415.982 75.3096 C 424.691 74.6397 427.37 57.2234 425.36 55.2139 z " id="path810" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ffffff;fill-opacity:0.7;fill-rule:evenodd;stroke-width:1pt;"/> + </g> + <g id="g811" transform="translate(-300.7665,212.3452)"> + <path d="M 424.69 52.5344 C 445.456 51.8645 445.456 82.0082 426.03 82.0082 C 401.245 82.678 404.594 53.2043 424.69 52.5344 z " id="path812" sodipodi:nodetypes="ccc" style="font-size:12;fill:#0000ff;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;fill-opacity:1;"/> + <path d="M 425.36 55.2139 C 423.35 53.2043 401.915 63.922 415.982 75.3096 C 424.691 74.6397 427.37 57.2234 425.36 55.2139 z " id="path813" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ffffff;fill-opacity:0.7;fill-rule:evenodd;stroke-width:1pt;"/> + </g> + <g id="g814" transform="translate(-109.1869,185.5508)"> + <path d="M 424.69 52.5344 C 445.456 51.8645 445.456 82.0082 426.03 82.0082 C 401.245 82.678 404.594 53.2043 424.69 52.5344 z " id="path815" sodipodi:nodetypes="ccc" style="font-size:12;fill:#0000ff;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;fill-opacity:1;"/> + <path d="M 425.36 55.2139 C 423.35 53.2043 401.915 63.922 415.982 75.3096 C 424.691 74.6397 427.37 57.2234 425.36 55.2139 z " id="path816" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ffffff;fill-opacity:0.7;fill-rule:evenodd;stroke-width:1pt;"/> + </g> + <g id="g822" transform="translate(-192.9193,111.8663)"> + <path d="M 424.69 52.5344 C 445.456 51.8645 445.456 82.0082 426.03 82.0082 C 401.245 82.678 404.594 53.2043 424.69 52.5344 z " id="path823" sodipodi:nodetypes="ccc" style="font-size:12;fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;fill-opacity:1;"/> + <path d="M 425.36 55.2139 C 423.35 53.2043 401.915 63.922 415.982 75.3096 C 424.691 74.6397 427.37 57.2234 425.36 55.2139 z " id="path824" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ffffff;fill-opacity:0.7;fill-rule:evenodd;stroke-width:1pt;"/> + </g> + <g id="g825" transform="translate(-101.1486,279.3311)"> + <path d="M 424.69 52.5344 C 445.456 51.8645 445.456 82.0082 426.03 82.0082 C 401.245 82.678 404.594 53.2043 424.69 52.5344 z " id="path826" sodipodi:nodetypes="ccc" style="font-size:12;fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;fill-opacity:1;"/> + <path d="M 425.36 55.2139 C 423.35 53.2043 401.915 63.922 415.982 75.3096 C 424.691 74.6397 427.37 57.2234 425.36 55.2139 z " id="path827" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ffffff;fill-opacity:0.7;fill-rule:evenodd;stroke-width:1pt;"/> + </g> + <g id="g836" transform="translate(-293.3981,267.9435)"> + <path d="M 424.69 52.5344 C 445.456 51.8645 445.456 82.0082 426.03 82.0082 C 401.245 82.678 404.594 53.2043 424.69 52.5344 z " id="path837" sodipodi:nodetypes="ccc" style="font-size:12;fill:#00ff00;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;fill-opacity:1;"/> + <path d="M 425.36 55.2139 C 423.35 53.2043 401.915 63.922 415.982 75.3096 C 424.691 74.6397 427.37 57.2234 425.36 55.2139 z " id="path838" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ffffff;fill-opacity:0.7;fill-rule:evenodd;stroke-width:1pt;"/> + </g> + <g id="g839" transform="translate(-203.6370,194.9289)"> + <path d="M 424.69 52.5344 C 445.456 51.8645 445.456 82.0082 426.03 82.0082 C 401.245 82.678 404.594 53.2043 424.69 52.5344 z " id="path840" sodipodi:nodetypes="ccc" style="font-size:12;fill:#00ff00;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;fill-opacity:1;"/> + <path d="M 425.36 55.2139 C 423.35 53.2043 401.915 63.922 415.982 75.3096 C 424.691 74.6397 427.37 57.2234 425.36 55.2139 z " id="path841" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ffffff;fill-opacity:0.7;fill-rule:evenodd;stroke-width:1pt;"/> + </g> + <g id="g851" transform="translate(-81.05289,214.3548)"> + <path d="M 424.69 52.5344 C 445.456 51.8645 445.456 82.0082 426.03 82.0082 C 401.245 82.678 404.594 53.2043 424.69 52.5344 z " id="path852" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ffff00;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;fill-opacity:1;"/> + <path d="M 425.36 55.2139 C 423.35 53.2043 401.915 63.922 415.982 75.3096 C 424.691 74.6397 427.37 57.2234 425.36 55.2139 z " id="path853" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ffffff;fill-opacity:0.7;fill-rule:evenodd;stroke-width:1pt;"/> + </g> + <g id="g854" transform="translate(-146.0292,146.0292)"> + <path d="M 424.69 52.5344 C 445.456 51.8645 445.456 82.0082 426.03 82.0082 C 401.245 82.678 404.594 53.2043 424.69 52.5344 z " id="path855" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ffff00;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;fill-opacity:1;"/> + <path d="M 425.36 55.2139 C 423.35 53.2043 401.915 63.922 415.982 75.3096 C 424.691 74.6397 427.37 57.2234 425.36 55.2139 z " id="path856" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ffffff;fill-opacity:0.7;fill-rule:evenodd;stroke-width:1pt;"/> + </g> + <g id="g857" transform="translate(-231.7711,227.7519)"> + <path d="M 424.69 52.5344 C 445.456 51.8645 445.456 82.0082 426.03 82.0082 C 401.245 82.678 404.594 53.2043 424.69 52.5344 z " id="path858" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ffff00;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;fill-opacity:1;"/> + <path d="M 425.36 55.2139 C 423.35 53.2043 401.915 63.922 415.982 75.3096 C 424.691 74.6397 427.37 57.2234 425.36 55.2139 z " id="path859" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ffffff;fill-opacity:0.7;fill-rule:evenodd;stroke-width:1pt;"/> + </g> + <g id="g865" transform="translate(-202.9672,64.97627)"> + <path d="M 424.69 52.5344 C 445.456 51.8645 445.456 82.0082 426.03 82.0082 C 401.245 82.678 404.594 53.2043 424.69 52.5344 z " id="path866" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ff9300;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;fill-opacity:1;"/> + <path d="M 425.36 55.2139 C 423.35 53.2043 401.915 63.922 415.982 75.3096 C 424.691 74.6397 427.37 57.2234 425.36 55.2139 z " id="path867" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ffffff;fill-opacity:0.7;fill-rule:evenodd;stroke-width:1pt;"/> + </g> + <g id="g868" transform="translate(-158.0866,287.3694)"> + <path d="M 424.69 52.5344 C 445.456 51.8645 445.456 82.0082 426.03 82.0082 C 401.245 82.678 404.594 53.2043 424.69 52.5344 z " id="path869" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ff9300;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;fill-opacity:1;"/> + <path d="M 425.36 55.2139 C 423.35 53.2043 401.915 63.922 415.982 75.3096 C 424.691 74.6397 427.37 57.2234 425.36 55.2139 z " id="path870" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ffffff;fill-opacity:0.7;fill-rule:evenodd;stroke-width:1pt;"/> + </g> + <g id="g871" transform="translate(-152.7278,188.2303)"> + <path d="M 424.69 52.5344 C 445.456 51.8645 445.456 82.0082 426.03 82.0082 C 401.245 82.678 404.594 53.2043 424.69 52.5344 z " id="path872" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ff9300;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;fill-opacity:1;"/> + <path d="M 425.36 55.2139 C 423.35 53.2043 401.915 63.922 415.982 75.3096 C 424.691 74.6397 427.37 57.2234 425.36 55.2139 z " id="path873" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ffffff;fill-opacity:0.7;fill-rule:evenodd;stroke-width:1pt;"/> + </g> + <g id="g880" transform="translate(-140.0000,25.00000)"> + <polygon id="polygon878" points="418.662,76.6493 399.532,56.5037 376.859,72.5587 390.107,48.1396 367.832,31.538 395.15,36.5918 404.055,10.2764 407.69,37.819 435.47,38.1568 410.399,50.1252 418.662,76.6493 " sodipodi:arg1="1.04002345" sodipodi:arg2="1.66834199" sodipodi:cx="400.575500" sodipodi:cy="45.8358383" sodipodi:r1="35.7292557" sodipodi:r2="10.7187767" sodipodi:sides="5" sodipodi:type="star" style="font-size:12;fill:#ff0000;fill-rule:evenodd;stroke-width:3.75;stroke:#000000;stroke-opacity:1;stroke-dasharray:none;fill-opacity:1;" transform="matrix(0.994342,-0.106230,0.106230,0.994342,-2.344353,42.91328)"/> + <path d="M 388.532 62.8101 C 401.79 40.713 380.796 41.775 381.792 39.3513 C 399.139 44.4405 399.022 35.5462 400.79 24.014 C 403.441 40.3242 406.708 43.765 388.532 62.8101 z " id="path879" sodipodi:nodetypes="cccc" style="fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-opacity:1;stroke-width:1pt;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:0.5;"/> + </g> + <g id="g883" transform="translate(-216.1370,24.92889)"> + <path d="M 424.69 52.5344 C 445.456 51.8645 445.456 82.0082 426.03 82.0082 C 401.245 82.678 404.594 53.2043 424.69 52.5344 z " id="path884" sodipodi:nodetypes="ccc" style="font-size:12;fill:#00ff00;fill-rule:evenodd;stroke:#000000;stroke-width:3.75;fill-opacity:1;"/> + <path d="M 425.36 55.2139 C 423.35 53.2043 401.915 63.922 415.982 75.3096 C 424.691 74.6397 427.37 57.2234 425.36 55.2139 z " id="path885" sodipodi:nodetypes="ccc" style="font-size:12;fill:#ffffff;fill-opacity:0.7;fill-rule:evenodd;stroke-width:1pt;"/> + </g> + </g> + </draw> +</page>'; + + // onvert to PDF + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr'); + $html2pdf->pdf->SetDisplayMode('fullpage'); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('svg_tree.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/examples/ticket.php b/assets/html2pdf/examples/ticket.php new file mode 100644 index 0000000..a3ba59a --- /dev/null +++ b/assets/html2pdf/examples/ticket.php @@ -0,0 +1,98 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + // get the HTML + ob_start(); + $num = 'CMD01-'.date('ymd'); + $nom = 'DUPONT Alphonse'; + $date = '01/01/2012'; +?> +<style type="text/css"> +<!-- + div.zone { border: none; border-radius: 6mm; background: #FFFFFF; border-collapse: collapse; padding:3mm; font-size: 2.7mm;} + h1 { padding: 0; margin: 0; color: #DD0000; font-size: 7mm; } + h2 { padding: 0; margin: 0; color: #222222; font-size: 5mm; position: relative; } +--> +</style> +<page format="100x200" orientation="L" backcolor="#AAAACC" style="font: arial;"> + <div style="rotate: 90; position: absolute; width: 100mm; height: 4mm; left: 195mm; top: 0; font-style: italic; font-weight: normal; text-align: center; font-size: 2.5mm;"> + Ceci est votre e-ticket à présenter au contrôle d'accès - + billet généré par <a href="http://html2pdf.fr/" style="color: #222222; text-decoration: none;">html2pdf</a> + </div> + <table style="width: 99%;border: none;" cellspacing="4mm" cellpadding="0"> + <tr> + <td colspan="2" style="width: 100%"> + <div class="zone" style="height: 34mm;position: relative;font-size: 5mm;"> + <div style="position: absolute; right: 3mm; top: 3mm; text-align: right; font-size: 4mm; "> + <b><?php echo $nom; ?></b><br> + </div> + <div style="position: absolute; right: 3mm; bottom: 3mm; text-align: right; font-size: 4mm; "> + <b>1</b> place <b>plein tarif</b><br> + Prix unitaire TTC : <b>45,00&euro;</b><br> + N° commande : <b><?php echo $num; ?></b><br> + Date d'achat : <b><?php echo date('d/m/Y à H:i:s'); ?></b><br> + </div> + <h1>Billet soirée spécial HTML2PDF</h1> + &nbsp;&nbsp;&nbsp;&nbsp;<b>Valable le <?php echo $date; ?> à 20h30</b><br> + <img src="./res/logo.gif" alt="logo" style="margin-top: 3mm; margin-left: 20mm"> + </div> + </td> + </tr> + <tr> + <td style="width: 25%;"> + <div class="zone" style="height: 40mm;vertical-align: middle;text-align: center;"> + <qrcode value="<?php echo $num."\n".$nom."\n".$date; ?>" ec="Q" style="width: 37mm; border: none;" ></qrcode> + </div> + </td> + <td style="width: 75%"> + <div class="zone" style="height: 40mm;vertical-align: middle; text-align: justify"> + <b>Conditions d'utilisation du billet</b><br> + Le billet est soumis aux conditions générales de vente que vous avez + acceptées avant l'achat du billet. Le billet d'entrée est uniquement + valable s'il est imprimé sur du papier A4 blanc, vierge recto et verso. + L'entrée est soumise au contrôle de la validité de votre billet. Une bonne + qualité d'impression est nécessaire. Les billets partiellement imprimés, + souillés, endommagés ou illisibles ne seront pas acceptés et seront + considérés comme non valables. En cas d'incident ou de mauvaise qualité + d'impression, vous devez imprimer à nouveau votre fichier. Pour vérifier + la bonne qualité de l'impression, assurez-vous que les informations écrites + sur le billet, ainsi que les pictogrammes (code à barres 2D) sont bien + lisibles. Ce titre doit être conservé jusqu'à la fin de la manifestation. + Une pièce d'identité pourra être demandée conjointement à ce billet. En + cas de non respect de l'ensemble des règles précisées ci-dessus, ce billet + sera considéré comme non valable.<br> + <br> + <i>Ce billet est reconnu électroniquement lors de votre + arrivée sur site. A ce titre, il ne doit être ni dupliqué, ni photocopié. + Toute reproduction est frauduleuse et inutile.</i> + </div> + </td> + </tr> + </table> +</page> +<?php + $content = ob_get_clean(); + + // convert + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr', true, 'UTF-8', 0); + $html2pdf->pdf->SetDisplayMode('fullpage'); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('ticket.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } + diff --git a/assets/html2pdf/examples/utf8.php b/assets/html2pdf/examples/utf8.php new file mode 100644 index 0000000..3982ecc --- /dev/null +++ b/assets/html2pdf/examples/utf8.php @@ -0,0 +1,31 @@ +<?php +/** + * HTML2PDF Librairy - example + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * + * isset($_GET['vuehtml']) is not mandatory + * it allow to display the result in the HTML format + */ + + require_once(dirname(__FILE__).'/../html2pdf.class.php'); + + // get the HTML + $content = file_get_contents(dirname(__FILE__).'/../_tcpdf_'.HTML2PDF_USED_TCPDF_VERSION.'/cache/utf8test.txt'); + $content = '<page style="font-family: freeserif"><br />'.nl2br($content).'</page>'; + + // convert to PDF + try + { + $html2pdf = new HTML2PDF('P', 'A4', 'fr'); + $html2pdf->pdf->SetDisplayMode('real'); + $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); + $html2pdf->Output('utf8.pdf'); + } + catch(HTML2PDF_exception $e) { + echo $e; + exit; + } diff --git a/assets/html2pdf/html2pdf.class.php b/assets/html2pdf/html2pdf.class.php new file mode 100644 index 0000000..91b854b --- /dev/null +++ b/assets/html2pdf/html2pdf.class.php @@ -0,0 +1,6488 @@ +<?php +/** + * HTML2PDF Librairy - main class + * + * HTML => PDF convertor + * distributed under the LGPL License + * + * @author Laurent MINGUET <webmaster@html2pdf.fr> + * @version 4.03 + */ + +if (!defined('__CLASS_HTML2PDF__')) { + + define('__CLASS_HTML2PDF__', '4.03'); + define('HTML2PDF_USED_TCPDF_VERSION', '5.0.002'); + + require_once(dirname(__FILE__).'/_class/exception.class.php'); + require_once(dirname(__FILE__).'/_class/locale.class.php'); + require_once(dirname(__FILE__).'/_class/myPdf.class.php'); + require_once(dirname(__FILE__).'/_class/parsingHtml.class.php'); + require_once(dirname(__FILE__).'/_class/parsingCss.class.php'); + + class HTML2PDF + { + /** + * HTML2PDF_myPdf object, extends from TCPDF + * @var HTML2PDF_myPdf + */ + public $pdf = null; + + /** + * CSS parsing + * @var HTML2PDF_parsingCss + */ + public $parsingCss = null; + + /** + * HTML parsing + * @var HTML2PDF_parsingHtml + */ + public $parsingHtml = null; + + protected $_langue = 'fr'; // locale of the messages + protected $_orientation = 'P'; // page orientation : Portrait ou Landscape + protected $_format = 'A4'; // page format : A4, A3, ... + protected $_encoding = ''; // charset encoding + protected $_unicode = true; // means that the input text is unicode (default = true) + + protected $_testTdInOnepage = true; // test of TD that can not take more than one page + protected $_testIsImage = true; // test if the images exist or not + protected $_testIsDeprecated = false; // test the deprecated functions + + protected $_parsePos = 0; // position in the parsing + protected $_tempPos = 0; // temporary position for complex table + protected $_page = 0; // current page number + + protected $_subHtml = null; // sub html + protected $_subPart = false; // sub HTML2PDF + protected $_subHEADER = array(); // sub action to make the header + protected $_subFOOTER = array(); // sub action to make the footer + protected $_subSTATES = array(); // array to save some parameters + + protected $_isSubPart = false; // flag : in a sub html2pdf + protected $_isInThead = false; // flag : in a thead + protected $_isInTfoot = false; // flag : in a tfoot + protected $_isInOverflow = false; // flag : in a overflow + protected $_isInFooter = false; // flag : in a footer + protected $_isInDraw = null; // flag : in a draw (svg) + protected $_isAfterFloat = false; // flag : is just after a float + protected $_isInForm = false; // flag : is in a float. false / action of the form + protected $_isInLink = ''; // flag : is in a link. empty / href of the link + protected $_isInParagraph = false; // flag : is in a paragraph + protected $_isForOneLine = false; // flag : in a specific sub html2pdf to have the height of the next line + + protected $_maxX = 0; // maximum X of the current zone + protected $_maxY = 0; // maximum Y of the current zone + protected $_maxE = 0; // number of elements in the current zone + protected $_maxH = 0; // maximum height of the line in the current zone + protected $_maxSave = array(); // save the maximums of the current zone + protected $_currentH = 0; // height of the current line + + protected $_defaultLeft = 0; // default marges of the page + protected $_defaultTop = 0; + protected $_defaultRight = 0; + protected $_defaultBottom = 0; + protected $_defaultFont = null; // default font to use, is the asked font does not exist + + protected $_margeLeft = 0; // current marges of the page + protected $_margeTop = 0; + protected $_margeRight = 0; + protected $_margeBottom = 0; + protected $_marges = array(); // save the different marges of the current page + protected $_pageMarges = array(); // float marges of the current page + protected $_background = array(); // background informations + + + protected $_firstPage = true; // flag : first page + protected $_defList = array(); // table to save the stats of the tags UL and OL + + protected $_lstAnchor = array(); // list of the anchors + protected $_lstField = array(); // list of the fields + protected $_lstSelect = array(); // list of the options of the current select + protected $_previousCall = null; // last action called + + protected $_debugActif = false; // flag : mode debug is active + protected $_debugOkUsage = false; // flag : the function memory_get_usage exist + protected $_debugOkPeak = false; // flag : the function memory_get_peak_usage exist + protected $_debugLevel = 0; // level in the debug + protected $_debugStartTime = 0; // debug start time + protected $_debugLastTime = 0; // debug stop time + + static protected $_subobj = null; // object html2pdf prepared in order to accelerate the creation of sub html2pdf + static protected $_tables = array(); // static table to prepare the nested html tables + + /** + * class constructor + * + * @access public + * @param string $orientation page orientation, same as TCPDF + * @param mixed $format The format used for pages, same as TCPDF + * @param $tring $langue Langue : fr, en, it... + * @param boolean $unicode TRUE means that the input text is unicode (default = true) + * @param String $encoding charset encoding; default is UTF-8 + * @param array $marges Default marges (left, top, right, bottom) + * @return HTML2PDF $this + */ + public function __construct($orientation = 'P', $format = 'A4', $langue='fr', $unicode=true, $encoding='UTF-8', $marges = array(5, 5, 5, 8)) + { + // init the page number + $this->_page = 0; + $this->_firstPage = true; + + // save the parameters + $this->_orientation = $orientation; + $this->_format = $format; + $this->_langue = strtolower($langue); + $this->_unicode = $unicode; + $this->_encoding = $encoding; + + // load the Local + HTML2PDF_locale::load($this->_langue); + + // create the HTML2PDF_myPdf object + $this->pdf = new HTML2PDF_myPdf($orientation, 'mm', $format, $unicode, $encoding); + + // init the CSS parsing object + $this->parsingCss = new HTML2PDF_parsingCss($this->pdf); + $this->parsingCss->fontSet(); + $this->_defList = array(); + + // init some tests + $this->setTestTdInOnePage(true); + $this->setTestIsImage(true); + $this->setTestIsDeprecated(true); + + // init the default font + $this->setDefaultFont(null); + + // init the HTML parsing object + $this->parsingHtml = new HTML2PDF_parsingHtml($this->_encoding); + $this->_subHtml = null; + $this->_subPart = false; + + // init the marges of the page + if (!is_array($marges)) $marges = array($marges, $marges, $marges, $marges); + $this->_setDefaultMargins($marges[0], $marges[1], $marges[2], $marges[3]); + $this->_setMargins(); + $this->_marges = array(); + + // init the form's fields + $this->_lstField = array(); + + return $this; + } + + /** + * Destructor + * + * @access public + * @return null + */ + public function __destruct() + { + + } + + /** + * Clone to create a sub HTML2PDF from HTML2PDF::$_subobj + * + * @access public + */ + public function __clone() + { + $this->pdf = clone $this->pdf; + $this->parsingHtml = clone $this->parsingHtml; + $this->parsingCss = clone $this->parsingCss; + $this->parsingCss->setPdfParent($this->pdf); + } + + /** + * set the debug mode to On + * + * @access public + * @return HTML2PDF $this + */ + public function setModeDebug() + { + $time = microtime(true); + + $this->_debugActif = true; + $this->_debugOkUsage = function_exists('memory_get_usage'); + $this->_debugOkPeak = function_exists('memory_get_peak_usage'); + $this->_debugStartTime = $time; + $this->_debugLastTime = $time; + + $this->_DEBUG_stepline('step', 'time', 'delta', 'memory', 'peak'); + $this->_DEBUG_add('Init debug'); + + return $this; + } + + /** + * Set the test of TD thdat can not take more than one page + * + * @access public + * @param boolean $mode + * @return HTML2PDF $this + */ + public function setTestTdInOnePage($mode = true) + { + $this->_testTdInOnepage = $mode ? true : false; + + return $this; + } + + /** + * Set the test if the images exist or not + * + * @access public + * @param boolean $mode + * @return HTML2PDF $this + */ + public function setTestIsImage($mode = true) + { + $this->_testIsImage = $mode ? true : false; + + return $this; + } + + /** + * Set the test on deprecated functions + * + * @access public + * @param boolean $mode + * @return HTML2PDF $this + */ + public function setTestIsDeprecated($mode = true) + { + $this->_testIsDeprecated = $mode ? true : false; + + return $this; + } + + /** + * Set the default font to use, if no font is specify, or if the asked font does not exist + * + * @access public + * @param string $default name of the default font to use. If null : Arial is no font is specify, and error if the asked font does not exist + * @return HTML2PDF $this + */ + public function setDefaultFont($default = null) + { + $this->_defaultFont = $default; + $this->parsingCss->setDefaultFont($default); + + return $this; + } + + /** + * add a font, see TCPDF function addFont + * + * @access public + * @param string $family Font family. The name can be chosen arbitrarily. If it is a standard family name, it will override the corresponding font. + * @param string $style Font style. Possible values are (case insensitive):<ul><li>empty string: regular (default)</li><li>B: bold</li><li>I: italic</li><li>BI or IB: bold italic</li></ul> + * @param string $fontfile The font definition file. By default, the name is built from the family and style, in lower case with no spaces. + * @return HTML2PDF $this + * @see TCPDF::addFont + */ + public function addFont($family, $style='', $file='') + { + $this->pdf->AddFont($family, $style, $file); + + return $this; + } + + /** + * display a automatic index, from the bookmarks + * + * @access public + * @param string $titre index title + * @param int $sizeTitle font size of the index title, in mm + * @param int $sizeBookmark font size of the index, in mm + * @param boolean $bookmarkTitle add a bookmark for the index, at his beginning + * @param boolean $displayPage display the page numbers + * @param int $onPage if null : at the end of the document on a new page, else on the $onPage page + * @param string $fontName font name to use + * @return null + */ + public function createIndex($titre = 'Index', $sizeTitle = 20, $sizeBookmark = 15, $bookmarkTitle = true, $displayPage = true, $onPage = null, $fontName = 'helvetica') + { + $oldPage = $this->_INDEX_NewPage($onPage); + $this->pdf->createIndex($this, $titre, $sizeTitle, $sizeBookmark, $bookmarkTitle, $displayPage, $onPage, $fontName); + if ($oldPage) $this->pdf->setPage($oldPage); + } + + /** + * clean up the objects + * + * @access protected + */ + protected function _cleanUp() + { + HTML2PDF::$_subobj = null; + HTML2PDF::$_tables = array(); + } + + /** + * Send the document to a given destination: string, local file or browser. + * Dest can be : + * I : send the file inline to the browser (default). The plug-in is used if available. The name given by name is used when one selects the "Save as" option on the link generating the PDF. + * D : send to the browser and force a file download with the name given by name. + * F : save to a local server file with the name given by name. + * S : return the document as a string. name is ignored. + * FI: equivalent to F + I option + * FD: equivalent to F + D option + * true => I + * false => S + * + * @param string $name The name of the file when saved. + * @param string $dest Destination where to send the document. + * @return string content of the PDF, if $dest=S + * @see TCPDF::close + * @access public + + */ + public function Output($name = '', $dest = false) + { + // close the pdf and clean up + $this->_cleanUp(); + + // if on debug mode + if ($this->_debugActif) { + $this->_DEBUG_add('Before output'); + $this->pdf->Close(); + exit; + } + + // complete parameters + if ($dest===false) $dest = 'I'; + if ($dest===true) $dest = 'S'; + if ($dest==='') $dest = 'I'; + if ($name=='') $name='document.pdf'; + + // clean up the destination + $dest = strtoupper($dest); + if (!in_array($dest, array('I', 'D', 'F', 'S', 'FI','FD'))) $dest = 'I'; + + // the name must be a PDF name + if (strtolower(substr($name, -4))!='.pdf') { + throw new HTML2PDF_exception(0, 'The output document name "'.$name.'" is not a PDF name'); + } + + // call the output of TCPDF + return $this->pdf->Output($name, $dest); + } + + /** + * convert HTML to PDF + * + * @access public + * @param string $html + * @param boolean $debugVue enable the HTML debug vue + * @return null + */ + public function writeHTML($html, $debugVue = false) + { + // if it is a real html page, we have to convert it + if (preg_match('/<body/isU', $html)) + $html = $this->getHtmlFromPage($html); + + $html = str_replace('[[date_y]]', date('Y'), $html); + $html = str_replace('[[date_m]]', date('m'), $html); + $html = str_replace('[[date_d]]', date('d'), $html); + + $html = str_replace('[[date_h]]', date('H'), $html); + $html = str_replace('[[date_i]]', date('i'), $html); + $html = str_replace('[[date_s]]', date('s'), $html); + + // If we are in HTML debug vue : display the HTML + if ($debugVue) { + return $this->_vueHTML($html); + } + + // convert HTMl to PDF + $this->parsingCss->readStyle($html); + $this->parsingHtml->setHTML($html); + $this->parsingHtml->parse(); + $this->_makeHTMLcode(); + } + + /** + * convert the HTML of a real page, to a code adapted to HTML2PDF + * + * @access public + * @param string HTML of a real page + * @return string HTML adapted to HTML2PDF + */ + public function getHtmlFromPage($html) + { + $html = str_replace('<BODY', '<body', $html); + $html = str_replace('</BODY', '</body', $html); + + // extract the content + $res = explode('<body', $html); + if (count($res)<2) return $html; + $content = '<page'.$res[1]; + $content = explode('</body', $content); + $content = $content[0].'</page>'; + + // extract the link tags + preg_match_all('/<link([^>]*)>/isU', $html, $match); + foreach ($match[0] as $src) + $content = $src.'</link>'.$content; + + // extract the css style tags + preg_match_all('/<style[^>]*>(.*)<\/style[^>]*>/isU', $html, $match); + foreach ($match[0] as $src) + $content = $src.$content; + + return $content; + } + + /** + * init a sub HTML2PDF. does not use it directly. Only the method createSubHTML must use it + * + * @access public + * @param string $format + * @param string $orientation + * @param array $marge + * @param integer $page + * @param array $defLIST + * @param integer $myLastPageGroup + * @param integer $myLastPageGroupNb + */ + public function initSubHtml($format, $orientation, $marge, $page, $defLIST, $myLastPageGroup, $myLastPageGroupNb) + { + $this->_isSubPart = true; + + $this->parsingCss->setOnlyLeft(); + + $this->_setNewPage($format, $orientation, null, null, ($myLastPageGroup!==null)); + + $this->_saveMargin(0, 0, $marge); + $this->_defList = $defLIST; + + $this->_page = $page; + $this->pdf->setMyLastPageGroup($myLastPageGroup); + $this->pdf->setMyLastPageGroupNb($myLastPageGroupNb); + $this->pdf->setXY(0, 0); + $this->parsingCss->fontSet(); + } + + /** + * display the content in HTML moden for debug + * + * @access protected + * @param string $contenu + */ + protected function _vueHTML($content) + { + $content = preg_replace('/<page_header([^>]*)>/isU', '<hr>'.HTML2PDF_locale::get('vue01').' : $1<hr><div$1>', $content); + $content = preg_replace('/<page_footer([^>]*)>/isU', '<hr>'.HTML2PDF_locale::get('vue02').' : $1<hr><div$1>', $content); + $content = preg_replace('/<page([^>]*)>/isU', '<hr>'.HTML2PDF_locale::get('vue03').' : $1<hr><div$1>', $content); + $content = preg_replace('/<\/page([^>]*)>/isU', '</div><hr>', $content); + $content = preg_replace('/<bookmark([^>]*)>/isU', '<hr>bookmark : $1<hr>', $content); + $content = preg_replace('/<\/bookmark([^>]*)>/isU', '', $content); + $content = preg_replace('/<barcode([^>]*)>/isU', '<hr>barcode : $1<hr>', $content); + $content = preg_replace('/<\/barcode([^>]*)>/isU', '', $content); + $content = preg_replace('/<qrcode([^>]*)>/isU', '<hr>qrcode : $1<hr>', $content); + $content = preg_replace('/<\/qrcode([^>]*)>/isU', '', $content); + + echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<html> + <head> + <title>'.HTML2PDF_locale::get('vue04').' HTML</title> + <meta http-equiv="Content-Type" content="text/html; charset='.$this->_encoding.'" > + </head> + <body style="padding: 10px; font-size: 10pt;font-family: Verdana;"> +'.$content.' + </body> +</html>'; + exit; + } + + /** + * set the default margins of the page + * + * @access protected + * @param int $left (mm, left margin) + * @param int $top (mm, top margin) + * @param int $right (mm, right margin, if null => left=right) + * @param int $bottom (mm, bottom margin, if null => bottom=8mm) + */ + protected function _setDefaultMargins($left, $top, $right = null, $bottom = null) + { + if ($right===null) $right = $left; + if ($bottom===null) $bottom = 8; + + $this->_defaultLeft = $this->parsingCss->ConvertToMM($left.'mm'); + $this->_defaultTop = $this->parsingCss->ConvertToMM($top.'mm'); + $this->_defaultRight = $this->parsingCss->ConvertToMM($right.'mm'); + $this->_defaultBottom = $this->parsingCss->ConvertToMM($bottom.'mm'); + } + + /** + * create a new page + * + * @access protected + * @param mixed $format + * @param string $orientation + * @param array $background background information + * @param integer $curr real position in the html parseur (if break line in the write of a text) + * @param boolean $resetPageNumber + */ + protected function _setNewPage($format = null, $orientation = '', $background = null, $curr = null, $resetPageNumber=false) + { + $this->_firstPage = false; + + $this->_format = $format ? $format : $this->_format; + $this->_orientation = $orientation ? $orientation : $this->_orientation; + $this->_background = $background!==null ? $background : $this->_background; + $this->_maxY = 0; + $this->_maxX = 0; + $this->_maxH = 0; + $this->_maxE = 0; + + $this->pdf->SetMargins($this->_defaultLeft, $this->_defaultTop, $this->_defaultRight); + + if ($resetPageNumber) { + $this->pdf->startPageGroup(); + } + + $this->pdf->AddPage($this->_orientation, $this->_format); + + if ($resetPageNumber) { + $this->pdf->myStartPageGroup(); + } + + $this->_page++; + + if (!$this->_subPart && !$this->_isSubPart) { + if (is_array($this->_background)) { + if (isset($this->_background['color']) && $this->_background['color']) { + $this->pdf->setFillColorArray($this->_background['color']); + $this->pdf->Rect(0, 0, $this->pdf->getW(), $this->pdf->getH(), 'F'); + } + + if (isset($this->_background['img']) && $this->_background['img']) + $this->pdf->Image($this->_background['img'], $this->_background['posX'], $this->_background['posY'], $this->_background['width']); + } + + $this->_setPageHeader(); + $this->_setPageFooter(); + } + + $this->_setMargins(); + $this->pdf->setY($this->_margeTop); + + $this->_setNewPositionForNewLine($curr); + $this->_maxH = 0; + } + + /** + * set the real margin, using the default margins and the page margins + * + * @access protected + */ + protected function _setMargins() + { + // prepare the margins + $this->_margeLeft = $this->_defaultLeft + (isset($this->_background['left']) ? $this->_background['left'] : 0); + $this->_margeRight = $this->_defaultRight + (isset($this->_background['right']) ? $this->_background['right'] : 0); + $this->_margeTop = $this->_defaultTop + (isset($this->_background['top']) ? $this->_background['top'] : 0); + $this->_margeBottom = $this->_defaultBottom + (isset($this->_background['bottom']) ? $this->_background['bottom'] : 0); + + // set the PDF margins + $this->pdf->SetMargins($this->_margeLeft, $this->_margeTop, $this->_margeRight); + $this->pdf->SetAutoPageBreak(false, $this->_margeBottom); + + // set the float Margins + $this->_pageMarges = array(); + if ($this->_isInParagraph!==false) { + $this->_pageMarges[floor($this->_margeTop*100)] = array($this->_isInParagraph[0], $this->pdf->getW()-$this->_isInParagraph[1]); + } else { + $this->_pageMarges[floor($this->_margeTop*100)] = array($this->_margeLeft, $this->pdf->getW()-$this->_margeRight); + } + } + + /** + * add a debug step + * + * @access protected + * @param string $name step name + * @param boolean $level (true=up, false=down, null=nothing to do) + * @return $this + */ + protected function _DEBUG_add($name, $level=null) + { + // if true : UP + if ($level===true) $this->_debugLevel++; + + $name = str_repeat(' ', $this->_debugLevel). $name.($level===true ? ' Begin' : ($level===false ? ' End' : '')); + $time = microtime(true); + $usage = ($this->_debugOkUsage ? memory_get_usage() : 0); + $peak = ($this->_debugOkPeak ? memory_get_peak_usage() : 0); + + $this->_DEBUG_stepline( + $name, + number_format(($time - $this->_debugStartTime)*1000, 1, '.', ' ').' ms', + number_format(($time - $this->_debugLastTime)*1000, 1, '.', ' ').' ms', + number_format($usage/1024, 1, '.', ' ').' Ko', + number_format($peak/1024, 1, '.', ' ').' Ko' + ); + + $this->_debugLastTime = $time; + + // it false : DOWN + if ($level===false) $this->_debugLevel--; + + return $this; + } + + /** + * display a debug line + * + * + * @access protected + * @param string $name + * @param string $timeTotal + * @param string $timeStep + * @param string $memoryUsage + * @param string $memoryPeak + */ + protected function _DEBUG_stepline($name, $timeTotal, $timeStep, $memoryUsage, $memoryPeak) + { + $txt = str_pad($name, 30, ' ', STR_PAD_RIGHT). + str_pad($timeTotal, 12, ' ', STR_PAD_LEFT). + str_pad($timeStep, 12, ' ', STR_PAD_LEFT). + str_pad($memoryUsage, 15, ' ', STR_PAD_LEFT). + str_pad($memoryPeak, 15, ' ', STR_PAD_LEFT); + + echo '<pre style="padding:0; margin:0">'.$txt.'</pre>'; + } + + /** + * get the Min and Max X, for Y (use the float margins) + * + * @access protected + * @param float $y + * @return array(float, float) + */ + protected function _getMargins($y) + { + $y = floor($y*100); + $x = array($this->pdf->getlMargin(), $this->pdf->getW()-$this->pdf->getrMargin()); + + foreach ($this->_pageMarges as $mY => $mX) + if ($mY<=$y) $x = $mX; + + return $x; + } + + /** + * Add margins, for a float + * + * @access protected + * @param string $float (left / right) + * @param float $xLeft + * @param float $yTop + * @param float $xRight + * @param float $yBottom + */ + protected function _addMargins($float, $xLeft, $yTop, $xRight, $yBottom) + { + // get the current float margins, for top and bottom + $oldTop = $this->_getMargins($yTop); + $oldBottom = $this->_getMargins($yBottom); + + // update the top float margin + if ($float=='left' && $oldTop[0]<$xRight) $oldTop[0] = $xRight; + if ($float=='right' && $oldTop[1]>$xLeft) $oldTop[1] = $xLeft; + + $yTop = floor($yTop*100); + $yBottom = floor($yBottom*100); + + // erase all the float margins that are smaller than the new one + foreach ($this->_pageMarges as $mY => $mX) { + if ($mY<$yTop) continue; + if ($mY>$yBottom) break; + if ($float=='left' && $this->_pageMarges[$mY][0]<$xRight) unset($this->_pageMarges[$mY]); + if ($float=='right' && $this->_pageMarges[$mY][1]>$xLeft) unset($this->_pageMarges[$mY]); + } + + // save the new Top and Bottom margins + $this->_pageMarges[$yTop] = $oldTop; + $this->_pageMarges[$yBottom] = $oldBottom; + + // sort the margins + ksort($this->_pageMarges); + + // we are just after float + $this->_isAfterFloat = true; + } + + /** + * Save old margins (push), and set new ones + * + * @access protected + * @param float $ml left margin + * @param float $mt top margin + * @param float $mr right margin + */ + protected function _saveMargin($ml, $mt, $mr) + { + // save old margins + $this->_marges[] = array('l' => $this->pdf->getlMargin(), 't' => $this->pdf->gettMargin(), 'r' => $this->pdf->getrMargin(), 'page' => $this->_pageMarges); + + // set new ones + $this->pdf->SetMargins($ml, $mt, $mr); + + // prepare for float margins + $this->_pageMarges = array(); + $this->_pageMarges[floor($mt*100)] = array($ml, $this->pdf->getW()-$mr); + } + + /** + * load the last saved margins (pop) + * + * @access protected + */ + protected function _loadMargin() + { + $old = array_pop($this->_marges); + if ($old) { + $ml = $old['l']; + $mt = $old['t']; + $mr = $old['r']; + $mP = $old['page']; + } else { + $ml = $this->_margeLeft; + $mt = 0; + $mr = $this->_margeRight; + $mP = array($mt => array($ml, $this->pdf->getW()-$mr)); + } + + $this->pdf->SetMargins($ml, $mt, $mr); + $this->_pageMarges = $mP; + } + + /** + * save the current maxs (push) + * + * @access protected + */ + protected function _saveMax() + { + $this->_maxSave[] = array($this->_maxX, $this->_maxY, $this->_maxH, $this->_maxE); + } + + /** + * load the last saved current maxs (pop) + * + * @access protected + */ + protected function _loadMax() + { + $old = array_pop($this->_maxSave); + + if ($old) { + $this->_maxX = $old[0]; + $this->_maxY = $old[1]; + $this->_maxH = $old[2]; + $this->_maxE = $old[3]; + } else { + $this->_maxX = 0; + $this->_maxY = 0; + $this->_maxH = 0; + $this->_maxE = 0; + } + } + + /** + * draw the PDF header with the HTML in page_header + * + * @access protected + */ + protected function _setPageHeader() + { + if (!count($this->_subHEADER)) return false; + + $oldParsePos = $this->_parsePos; + $oldParseCode = $this->parsingHtml->code; + + $this->_parsePos = 0; + $this->parsingHtml->code = $this->_subHEADER; + $this->_makeHTMLcode(); + + $this->_parsePos = $oldParsePos; + $this->parsingHtml->code = $oldParseCode; + } + + /** + * draw the PDF footer with the HTML in page_footer + * + * @access protected + */ + protected function _setPageFooter() + { + if (!count($this->_subFOOTER)) return false; + + $oldParsePos = $this->_parsePos; + $oldParseCode = $this->parsingHtml->code; + + $this->_parsePos = 0; + $this->parsingHtml->code = $this->_subFOOTER; + $this->_isInFooter = true; + $this->_makeHTMLcode(); + $this->_isInFooter = false; + + $this->_parsePos = $oldParsePos; + $this->parsingHtml->code = $oldParseCode; + } + + /** + * new line, with a specific height + * + * @access protected + * @param float $h + * @param integer $curr real current position in the text, if new line in the write of a text + */ + protected function _setNewLine($h, $curr = null) + { + $this->pdf->Ln($h); + $this->_setNewPositionForNewLine($curr); + } + + /** + * calculate the start position of the next line, depending on the text-align + * + * @access protected + * @param integer $curr real current position in the text, if new line in the write of a text + */ + protected function _setNewPositionForNewLine($curr = null) + { + // get the margins for the current line + list($lx, $rx) = $this->_getMargins($this->pdf->getY()); + $this->pdf->setX($lx); + $wMax = $rx-$lx; + $this->_currentH = 0; + + // if subPart => return because align left + if ($this->_subPart || $this->_isSubPart || $this->_isForOneLine) { + $this->pdf->setWordSpacing(0); + return null; + } + + // create the sub object + $sub = null; + $this->_createSubHTML($sub); + $sub->_saveMargin(0, 0, $sub->pdf->getW()-$wMax); + $sub->_isForOneLine = true; + $sub->_parsePos = $this->_parsePos; + $sub->parsingHtml->code = $this->parsingHtml->code; + + // if $curr => adapt the current position of the parsing + if ($curr!==null && $sub->parsingHtml->code[$this->_parsePos]['name']=='write') { + $txt = $sub->parsingHtml->code[$this->_parsePos]['param']['txt']; + $txt = str_replace('[[page_cu]]', $sub->pdf->getMyNumPage($this->_page), $txt); + $sub->parsingHtml->code[$this->_parsePos]['param']['txt'] = substr($txt, $curr+1); + } else + $sub->_parsePos++; + + // for each element of the parsing => load the action + $res = null; + for ($sub->_parsePos; $sub->_parsePos<count($sub->parsingHtml->code); $sub->_parsePos++) { + $action = $sub->parsingHtml->code[$sub->_parsePos]; + $res = $sub->_executeAction($action); + if (!$res) break; + } + + $w = $sub->_maxX; // max width + $h = $sub->_maxH; // max height + $e = ($res===null ? $sub->_maxE : 0); // maxnumber of elemets on the line + + // destroy the sub HTML + $this->_destroySubHTML($sub); + + // adapt the start of the line, depending on the text-align + if ($this->parsingCss->value['text-align']=='center') + $this->pdf->setX(($rx+$this->pdf->getX()-$w)*0.5-0.01); + else if ($this->parsingCss->value['text-align']=='right') + $this->pdf->setX($rx-$w-0.01); + else + $this->pdf->setX($lx); + + // set the height of the line + $this->_currentH = $h; + + // if justify => set the word spacing + if ($this->parsingCss->value['text-align']=='justify' && $e>1) { + $this->pdf->setWordSpacing(($wMax-$w)/($e-1)); + } else { + $this->pdf->setWordSpacing(0); + } + } + + /** + * prepare HTML2PDF::$_subobj (used for create the sub HTML2PDF objects + * + * @access protected + */ + protected function _prepareSubObj() + { + $pdf = null; + + // create the sub object + HTML2PDF::$_subobj = new HTML2PDF( + $this->_orientation, + $this->_format, + $this->_langue, + $this->_unicode, + $this->_encoding, + array($this->_defaultLeft,$this->_defaultTop,$this->_defaultRight,$this->_defaultBottom) + ); + + // init + HTML2PDF::$_subobj->setTestTdInOnePage($this->_testTdInOnepage); + HTML2PDF::$_subobj->setTestIsImage($this->_testIsImage); + HTML2PDF::$_subobj->setTestIsDeprecated($this->_testIsDeprecated); + HTML2PDF::$_subobj->setDefaultFont($this->_defaultFont); + HTML2PDF::$_subobj->parsingCss->css = &$this->parsingCss->css; + HTML2PDF::$_subobj->parsingCss->cssKeys = &$this->parsingCss->cssKeys; + + // clone font from the original PDF + HTML2PDF::$_subobj->pdf->cloneFontFrom($this->pdf); + + // remove the link to the parent + HTML2PDF::$_subobj->parsingCss->setPdfParent($pdf); + } + + /** + * create a sub HTML2PDF, to calculate the multi-tables + * + * @access protected + * @param &HTML2PDF $subHtml sub HTML2PDF to create + * @param integer $cellmargin if in a TD : cellmargin of this td + */ + protected function _createSubHTML(&$subHtml, $cellmargin=0) + { + // prepare the subObject, if never prepare before + if (HTML2PDF::$_subobj===null) { + $this->_prepareSubObj(); + } + + // calculate the width to use + if ($this->parsingCss->value['width']) { + $marge = $cellmargin*2; + $marge+= $this->parsingCss->value['padding']['l'] + $this->parsingCss->value['padding']['r']; + $marge+= $this->parsingCss->value['border']['l']['width'] + $this->parsingCss->value['border']['r']['width']; + $marge = $this->pdf->getW() - $this->parsingCss->value['width'] + $marge; + } else { + $marge = $this->_margeLeft+$this->_margeRight; + } + + // BUGFIX : we have to call the method, because of a bug in php 5.1.6 + HTML2PDF::$_subobj->pdf->getPage(); + + // clone the sub oject + $subHtml = clone HTML2PDF::$_subobj; + $subHtml->parsingCss->table = $this->parsingCss->table; + $subHtml->parsingCss->value = $this->parsingCss->value; + $subHtml->initSubHtml( + $this->_format, + $this->_orientation, + $marge, + $this->_page, + $this->_defList, + $this->pdf->getMyLastPageGroup(), + $this->pdf->getMyLastPageGroupNb() + ); + } + + /** + * destroy a subHTML2PDF + * + * @access protected + */ + protected function _destroySubHTML(&$subHtml) + { + unset($subHtml); + $subHtml = null; + } + + /** + * Convert a arabic number in roman number + * + * @access protected + * @param integer $nbArabic + * @return string $nbRoman + */ + protected function _listeArab2Rom($nbArabic) + { + $nbBaseTen = array('I','X','C','M'); + $nbBaseFive = array('V','L','D'); + $nbRoman = ''; + + if ($nbArabic<1) return $nbArabic; + if ($nbArabic>3999) return $nbArabic; + + for ($i=3; $i>=0 ; $i--) { + $chiffre=floor($nbArabic/pow(10, $i)); + if ($chiffre>=1) { + $nbArabic=$nbArabic-$chiffre*pow(10, $i); + if ($chiffre<=3) { + for ($j=$chiffre; $j>=1; $j--) { + $nbRoman=$nbRoman.$nbBaseTen[$i]; + } + } else if ($chiffre==9) { + $nbRoman=$nbRoman.$nbBaseTen[$i].$nbBaseTen[$i+1]; + } else if ($chiffre==4) { + $nbRoman=$nbRoman.$nbBaseTen[$i].$nbBaseFive[$i]; + } else { + $nbRoman=$nbRoman.$nbBaseFive[$i]; + for ($j=$chiffre-5; $j>=1; $j--) { + $nbRoman=$nbRoman.$nbBaseTen[$i]; + } + } + } + } + return $nbRoman; + } + + /** + * add a LI to the current level + * + * @access protected + */ + protected function _listeAddLi() + { + $this->_defList[count($this->_defList)-1]['nb']++; + } + + /** + * get the width to use for the column of the list + * + * @access protected + * @return string $width + */ + protected function _listeGetWidth() + { + return '7mm'; + } + + /** + * get the padding to use for the column of the list + * + * @access protected + * @return string $padding + */ + protected function _listeGetPadding() + { + return '1mm'; + } + + /** + * get the information of the li on the current level + * + * @access protected + * @return array(fontName, small size, string) + */ + protected function _listeGetLi() + { + $im = $this->_defList[count($this->_defList)-1]['img']; + $st = $this->_defList[count($this->_defList)-1]['style']; + $nb = $this->_defList[count($this->_defList)-1]['nb']; + $up = (substr($st, 0, 6)=='upper-'); + + if ($im) return array(false, false, $im); + + switch($st) + { + case 'none': + return array('helvetica', true, ' '); + + case 'upper-alpha': + case 'lower-alpha': + $str = ''; + while ($nb>26) { + $str = chr(96+$nb%26).$str; + $nb = floor($nb/26); + } + $str = chr(96+$nb).$str; + + return array('helvetica', false, ($up ? strtoupper($str) : $str).'.'); + + case 'upper-roman': + case 'lower-roman': + $str = $this->_listeArab2Rom($nb); + + return array('helvetica', false, ($up ? strtoupper($str) : $str).'.'); + + case 'decimal': + return array('helvetica', false, $nb.'.'); + + case 'square': + return array('zapfdingbats', true, chr(110)); + + case 'circle': + return array('zapfdingbats', true, chr(109)); + + case 'disc': + default: + return array('zapfdingbats', true, chr(108)); + } + } + + /** + * add a level to the list + * + * @access protected + * @param string $type : ul, ol + * @param string $style : lower-alpha, ... + * @param string $img + */ + protected function _listeAddLevel($type = 'ul', $style = '', $img = null) + { + // get the url of the image, if we want to use a image + if ($img) { + if (preg_match('/^url\(([^)]+)\)$/isU', trim($img), $match)) { + $img = $match[1]; + } else { + $img = null; + } + } else { + $img = null; + } + + // prepare the datas + if (!in_array($type, array('ul', 'ol'))) $type = 'ul'; + if (!in_array($style, array('lower-alpha', 'upper-alpha', 'upper-roman', 'lower-roman', 'decimal', 'square', 'circle', 'disc', 'none'))) $style = ''; + + if (!$style) { + if ($type=='ul') $style = 'disc'; + else $style = 'decimal'; + } + + // add the new level + $this->_defList[count($this->_defList)] = array('style' => $style, 'nb' => 0, 'img' => $img); + } + + /** + * remove a level to the list + * + * @access protected + */ + protected function _listeDelLevel() + { + if (count($this->_defList)) { + unset($this->_defList[count($this->_defList)-1]); + $this->_defList = array_values($this->_defList); + } + } + + /** + * execute the actions to convert the html + * + * @access protected + */ + protected function _makeHTMLcode() + { + // foreach elements of the parsing + for ($this->_parsePos=0; $this->_parsePos<count($this->parsingHtml->code); $this->_parsePos++) { + + // get the action to do + $action = $this->parsingHtml->code[$this->_parsePos]; + + // if it is a opening of table / ul / ol + if (in_array($action['name'], array('table', 'ul', 'ol')) && !$action['close']) { + + // we will work as a sub HTML to calculate the size of the element + $this->_subPart = true; + + // get the name of the opening tag + $tagOpen = $action['name']; + + // save the actual pos on the parsing + $this->_tempPos = $this->_parsePos; + + // foreach elements, while we are in the opened tag + while (isset($this->parsingHtml->code[$this->_tempPos]) && !($this->parsingHtml->code[$this->_tempPos]['name']==$tagOpen && $this->parsingHtml->code[$this->_tempPos]['close'])) { + // make the action + $this->_executeAction($this->parsingHtml->code[$this->_tempPos]); + $this->_tempPos++; + } + + // execute the closure of the tag + if (isset($this->parsingHtml->code[$this->_tempPos])) { + $this->_executeAction($this->parsingHtml->code[$this->_tempPos]); + } + + // end of the sub part + $this->_subPart = false; + } + + // execute the action + $this->_executeAction($action); + } + } + + /** + * execute the action from the parsing + * + * @access protected + * @param array $action + */ + protected function _executeAction($action) + { + // name of the action + $fnc = ($action['close'] ? '_tag_close_' : '_tag_open_').strtoupper($action['name']); + + // parameters of the action + $param = $action['param']; + + // if it the first action of the first page, and if it is not a open tag of PAGE => create the new page + if ($fnc!='_tag_open_PAGE' && $this->_firstPage) { + $this->_setNewPage(); + } + + // the action must exist + if (!is_callable(array(&$this, $fnc))) { + throw new HTML2PDF_exception(1, strtoupper($action['name']), $this->parsingHtml->getHtmlErrorCode($action['html_pos'])); + } + + // lauch the action + $res = $this->{$fnc}($param); + + // save the name of the action + $this->_previousCall = $fnc; + + // return the result + return $res; + } + + /** + * get the position of the element on the current line, depending on his height + * + * @access protected + * @param float $h + * @return float + */ + protected function _getElementY($h) + { + if ($this->_subPart || $this->_isSubPart || !$this->_currentH || $this->_currentH<$h) + return 0; + + return ($this->_currentH-$h)*0.8; + } + + /** + * make a break line + * + * @access protected + * @param float $h current line height + * @param integer $curr real current position in the text, if new line in the write of a text + */ + protected function _makeBreakLine($h, $curr = null) + { + if ($h) { + if (($this->pdf->getY()+$h<$this->pdf->getH() - $this->pdf->getbMargin()) || $this->_isInOverflow || $this->_isInFooter) + $this->_setNewLine($h, $curr); + else + $this->_setNewPage(null, '', null, $curr); + } else { + $this->_setNewPositionForNewLine($curr); + } + + $this->_maxH = 0; + $this->_maxE = 0; + } + + /** + * display a image + * + * @access protected + * @param string $src + * @param boolean $subLi if true=image of a list + * @return boolean depending on "isForOneLine" + */ + protected function _drawImage($src, $subLi=false) + { + // get the size of the image + // WARNING : if URL, "allow_url_fopen" must turned to "on" in php.ini + $infos=@getimagesize($src); + + // if the image does not exist, or can not be loaded + if (count($infos)<2) { + // if the test is activ => exception + if ($this->_testIsImage) { + throw new HTML2PDF_exception(6, $src); + } + + // else, display a gray rectangle + $src = null; + $infos = array(16, 16); + } + + // convert the size of the image in the unit of the PDF + $imageWidth = $infos[0]/$this->pdf->getK(); + $imageHeight = $infos[1]/$this->pdf->getK(); + + // calculate the size from the css style + if ($this->parsingCss->value['width'] && $this->parsingCss->value['height']) { + $w = $this->parsingCss->value['width']; + $h = $this->parsingCss->value['height']; + } else if ($this->parsingCss->value['width']) { + $w = $this->parsingCss->value['width']; + $h = $imageHeight*$w/$imageWidth; + } else if ($this->parsingCss->value['height']) { + $h = $this->parsingCss->value['height']; + $w = $imageWidth*$h/$imageHeight; + } else { + // convert px to pt + $w = 72./96.*$imageWidth; + $h = 72./96.*$imageHeight; + } + + // are we in a float + $float = $this->parsingCss->getFloat(); + + // if we are in a float, but if something else if on the line => Break Line + if ($float && $this->_maxH) { + // make the break line (false if we are in "_isForOneLine" mode) + if (!$this->_tag_open_BR(array())) { + return false; + } + } + + // position of the image + $x = $this->pdf->getX(); + $y = $this->pdf->getY(); + + // if the image can not be put on the current line => new line + if (!$float && ($x + $w>$this->pdf->getW() - $this->pdf->getrMargin()) && $this->_maxH) { + if ($this->_isForOneLine) { + return false; + } + + // set the new line + $hnl = max($this->_maxH, $this->parsingCss->getLineHeight()); + $this->_setNewLine($hnl); + + // get the new position + $x = $this->pdf->getX(); + $y = $this->pdf->getY(); + } + + // if the image can not be put on the current page + if (($y + $h>$this->pdf->getH() - $this->pdf->getbMargin()) && !$this->_isInOverflow) { + // new page + $this->_setNewPage(); + + // get the new position + $x = $this->pdf->getX(); + $y = $this->pdf->getY(); + } + + // correction for display the image of a list + $hT = 0.80*$this->parsingCss->value['font-size']; + if ($subLi && $h<$hT) { + $y+=($hT-$h); + } + + // add the margin top + $yc = $y-$this->parsingCss->value['margin']['t']; + + // get the width and the position of the parent + $old = $this->parsingCss->getOldValues(); + if ( $old['width']) { + $parentWidth = $old['width']; + $parentX = $x; + } else { + $parentWidth = $this->pdf->getW() - $this->pdf->getlMargin() - $this->pdf->getrMargin(); + $parentX = $this->pdf->getlMargin(); + } + + // if we are in a gloat => adapt the parent position and width + if ($float) { + list($lx, $rx) = $this->_getMargins($yc); + $parentX = $lx; + $parentWidth = $rx-$lx; + } + + // calculate the position of the image, if align to the right + if ($parentWidth>$w && $float!='left') { + if ($float=='right' || $this->parsingCss->value['text-align']=='li_right') $x = $parentX + $parentWidth - $w-$this->parsingCss->value['margin']['r']-$this->parsingCss->value['margin']['l']; + } + + // display the image + if (!$this->_subPart && !$this->_isSubPart) { + if ($src) { + $this->pdf->Image($src, $x, $y, $w, $h, '', $this->_isInLink); + } else { + // rectangle if the image can not be loaded + $this->pdf->setFillColorArray(array(240, 220, 220)); + $this->pdf->Rect($x, $y, $w, $h, 'F'); + } + } + + // apply the margins + $x-= $this->parsingCss->value['margin']['l']; + $y-= $this->parsingCss->value['margin']['t']; + $w+= $this->parsingCss->value['margin']['l'] + $this->parsingCss->value['margin']['r']; + $h+= $this->parsingCss->value['margin']['t'] + $this->parsingCss->value['margin']['b']; + + if ($float=='left') { + // save the current max + $this->_maxX = max($this->_maxX, $x+$w); + $this->_maxY = max($this->_maxY, $y+$h); + + // add the image to the margins + $this->_addMargins($float, $x, $y, $x+$w, $y+$h); + + // get the new position + list($lx, $rx) = $this->_getMargins($yc); + $this->pdf->setXY($lx, $yc); + } else if ($float=='right') { + // save the current max. We don't save the X because it is not the real max of the line + $this->_maxY = max($this->_maxY, $y+$h); + + // add the image to the margins + $this->_addMargins($float, $x, $y, $x+$w, $y+$h); + + // get the new position + list($lx, $rx) = $this->_getMargins($yc); + $this->pdf->setXY($lx, $yc); + } else { + // set the new position at the end of the image + $this->pdf->setX($x+$w); + + // save the current max + $this->_maxX = max($this->_maxX, $x+$w); + $this->_maxY = max($this->_maxY, $y+$h); + $this->_maxH = max($this->_maxH, $h); + } + + return true; + } + + /** + * draw a rectangle + * + * @access protected + * @param float $x + * @param float $y + * @param float $w + * @param float $h + * @param array $border + * @param float $padding - internal marge of the rectanble => not used, but... + * @param float $margin - external marge of the rectanble + * @param array $background + * @return boolean + */ + protected function _drawRectangle($x, $y, $w, $h, $border, $padding, $margin, $background) + { + // if we are in a subpart or if height is null => return false + if ($this->_subPart || $this->_isSubPart || $h===null) return false; + + // add the margin + $x+= $margin; + $y+= $margin; + $w-= $margin*2; + $h-= $margin*2; + + // get the radius of the border + $outTL = $border['radius']['tl']; + $outTR = $border['radius']['tr']; + $outBR = $border['radius']['br']; + $outBL = $border['radius']['bl']; + + // prepare the out radius + $outTL = ($outTL[0] && $outTL[1]) ? $outTL : null; + $outTR = ($outTR[0] && $outTR[1]) ? $outTR : null; + $outBR = ($outBR[0] && $outBR[1]) ? $outBR : null; + $outBL = ($outBL[0] && $outBL[1]) ? $outBL : null; + + // prepare the in radius + $inTL = $outTL; + $inTR = $outTR; + $inBR = $outBR; + $inBL = $outBL; + + if (is_array($inTL)) { + $inTL[0]-= $border['l']['width']; + $inTL[1]-= $border['t']['width']; + } + if (is_array($inTR)) { + $inTR[0]-= $border['r']['width']; + $inTR[1]-= $border['t']['width']; + } + if (is_array($inBR)) { + $inBR[0]-= $border['r']['width']; + $inBR[1]-= $border['b']['width']; + } + if (is_array($inBL)) { + $inBL[0]-= $border['l']['width']; + $inBL[1]-= $border['b']['width']; + } + + if ($inTL[0]<=0 || $inTL[1]<=0) $inTL = null; + if ($inTR[0]<=0 || $inTR[1]<=0) $inTR = null; + if ($inBR[0]<=0 || $inBR[1]<=0) $inBR = null; + if ($inBL[0]<=0 || $inBL[1]<=0) $inBL = null; + + // prepare the background color + $pdfStyle = ''; + if ($background['color']) { + $this->pdf->setFillColorArray($background['color']); + $pdfStyle.= 'F'; + } + + // if we have a background to fill => fill it with a path (because of the radius) + if ($pdfStyle) { + $this->pdf->clippingPathStart($x, $y, $w, $h, $outTL, $outTR, $outBL, $outBR); + $this->pdf->Rect($x, $y, $w, $h, $pdfStyle); + $this->pdf->clippingPathStop(); + } + + // prepare the background image + if ($background['image']) { + $iName = $background['image']; + $iPosition = $background['position']!==null ? $background['position'] : array(0, 0); + $iRepeat = $background['repeat']!==null ? $background['repeat'] : array(true, true); + + // size of the background without the borders + $bX = $x; + $bY = $y; + $bW = $w; + $bH = $h; + + if ($border['b']['width']) { + $bH-= $border['b']['width']; + } + if ($border['l']['width']) { + $bW-= $border['l']['width']; + $bX+= $border['l']['width']; + } + if ($border['t']['width']) { + $bH-= $border['t']['width']; + $bY+= $border['t']['width']; + } + if ($border['r']['width']) { + $bW-= $border['r']['width']; + } + + // get the size of the image + // WARNING : if URL, "allow_url_fopen" must turned to "on" in php.ini + $imageInfos=@getimagesize($iName); + + // if the image can not be loaded + if (count($imageInfos)<2) { + if ($this->_testIsImage) { + throw new HTML2PDF_exception(6, $iName); + } + } else { + // convert the size of the image from pixel to the unit of the PDF + $imageWidth = 72./96.*$imageInfos[0]/$this->pdf->getK(); + $imageHeight = 72./96.*$imageInfos[1]/$this->pdf->getK(); + + // prepare the position of the backgroung + if ($iRepeat[0]) $iPosition[0] = $bX; + else if (preg_match('/^([-]?[0-9\.]+)%/isU', $iPosition[0], $match)) $iPosition[0] = $bX + $match[1]*($bW-$imageWidth)/100; + else $iPosition[0] = $bX+$iPosition[0]; + + if ($iRepeat[1]) $iPosition[1] = $bY; + else if (preg_match('/^([-]?[0-9\.]+)%/isU', $iPosition[1], $match)) $iPosition[1] = $bY + $match[1]*($bH-$imageHeight)/100; + else $iPosition[1] = $bY+$iPosition[1]; + + $imageXmin = $bX; + $imageXmax = $bX+$bW; + $imageYmin = $bY; + $imageYmax = $bY+$bH; + + if (!$iRepeat[0] && !$iRepeat[1]) { + $imageXmin = $iPosition[0]; $imageXmax = $iPosition[0]+$imageWidth; + $imageYmin = $iPosition[1]; $imageYmax = $iPosition[1]+$imageHeight; + } else if ($iRepeat[0] && !$iRepeat[1]) { + $imageYmin = $iPosition[1]; $imageYmax = $iPosition[1]+$imageHeight; + } else if (!$iRepeat[0] && $iRepeat[1]) { + $imageXmin = $iPosition[0]; $imageXmax = $iPosition[0]+$imageWidth; + } + + // build the path to display the image (because of radius) + $this->pdf->clippingPathStart($bX, $bY, $bW, $bH, $inTL, $inTR, $inBL, $inBR); + + // repeat the image + for ($iY=$imageYmin; $iY<$imageYmax; $iY+=$imageHeight) { + for ($iX=$imageXmin; $iX<$imageXmax; $iX+=$imageWidth) { + $cX = null; + $cY = null; + $cW = $imageWidth; + $cH = $imageHeight; + if ($imageYmax-$iY<$imageHeight) { + $cX = $iX; + $cY = $iY; + $cH = $imageYmax-$iY; + } + if ($imageXmax-$iX<$imageWidth) { + $cX = $iX; + $cY = $iY; + $cW = $imageXmax-$iX; + } + + $this->pdf->Image($iName, $iX, $iY, $imageWidth, $imageHeight, '', ''); + } + } + + // end of the path + $this->pdf->clippingPathStop(); + } + } + + // adding some loose (0.01mm) + $loose = 0.01; + $x-= $loose; + $y-= $loose; + $w+= 2.*$loose; + $h+= 2.*$loose; + if ($border['l']['width']) $border['l']['width']+= 2.*$loose; + if ($border['t']['width']) $border['t']['width']+= 2.*$loose; + if ($border['r']['width']) $border['r']['width']+= 2.*$loose; + if ($border['b']['width']) $border['b']['width']+= 2.*$loose; + + // prepare the test on borders + $testBl = ($border['l']['width'] && $border['l']['color'][0]!==null); + $testBt = ($border['t']['width'] && $border['t']['color'][0]!==null); + $testBr = ($border['r']['width'] && $border['r']['color'][0]!==null); + $testBb = ($border['b']['width'] && $border['b']['color'][0]!==null); + + // draw the radius bottom-left + if (is_array($outBL) && ($testBb || $testBl)) { + if ($inBL) { + $courbe = array(); + $courbe[] = $x+$outBL[0]; $courbe[] = $y+$h; + $courbe[] = $x; $courbe[] = $y+$h-$outBL[1]; + $courbe[] = $x+$outBL[0]; $courbe[] = $y+$h-$border['b']['width']; + $courbe[] = $x+$border['l']['width']; $courbe[] = $y+$h-$outBL[1]; + $courbe[] = $x+$outBL[0]; $courbe[] = $y+$h-$outBL[1]; + } else { + $courbe = array(); + $courbe[] = $x+$outBL[0]; $courbe[] = $y+$h; + $courbe[] = $x; $courbe[] = $y+$h-$outBL[1]; + $courbe[] = $x+$border['l']['width']; $courbe[] = $y+$h-$border['b']['width']; + $courbe[] = $x+$outBL[0]; $courbe[] = $y+$h-$outBL[1]; + } + $this->_drawCurve($courbe, $border['l']['color']); + } + + // draw the radius left-top + if (is_array($outTL) && ($testBt || $testBl)) { + if ($inTL) { + $courbe = array(); + $courbe[] = $x; $courbe[] = $y+$outTL[1]; + $courbe[] = $x+$outTL[0]; $courbe[] = $y; + $courbe[] = $x+$border['l']['width']; $courbe[] = $y+$outTL[1]; + $courbe[] = $x+$outTL[0]; $courbe[] = $y+$border['t']['width']; + $courbe[] = $x+$outTL[0]; $courbe[] = $y+$outTL[1]; + } else { + $courbe = array(); + $courbe[] = $x; $courbe[] = $y+$outTL[1]; + $courbe[] = $x+$outTL[0]; $courbe[] = $y; + $courbe[] = $x+$border['l']['width']; $courbe[] = $y+$border['t']['width']; + $courbe[] = $x+$outTL[0]; $courbe[] = $y+$outTL[1]; + } + $this->_drawCurve($courbe, $border['t']['color']); + } + + // draw the radius top-right + if (is_array($outTR) && ($testBt || $testBr)) { + if ($inTR) { + $courbe = array(); + $courbe[] = $x+$w-$outTR[0]; $courbe[] = $y; + $courbe[] = $x+$w; $courbe[] = $y+$outTR[1]; + $courbe[] = $x+$w-$outTR[0]; $courbe[] = $y+$border['t']['width']; + $courbe[] = $x+$w-$border['r']['width']; $courbe[] = $y+$outTR[1]; + $courbe[] = $x+$w-$outTR[0]; $courbe[] = $y+$outTR[1]; + } else { + $courbe = array(); + $courbe[] = $x+$w-$outTR[0]; $courbe[] = $y; + $courbe[] = $x+$w; $courbe[] = $y+$outTR[1]; + $courbe[] = $x+$w-$border['r']['width']; $courbe[] = $y+$border['t']['width']; + $courbe[] = $x+$w-$outTR[0]; $courbe[] = $y+$outTR[1]; + } + $this->_drawCurve($courbe, $border['r']['color']); + } + + // draw the radius right-bottom + if (is_array($outBR) && ($testBb || $testBr)) { + if ($inBR) { + $courbe = array(); + $courbe[] = $x+$w; $courbe[] = $y+$h-$outBR[1]; + $courbe[] = $x+$w-$outBR[0]; $courbe[] = $y+$h; + $courbe[] = $x+$w-$border['r']['width']; $courbe[] = $y+$h-$outBR[1]; + $courbe[] = $x+$w-$outBR[0]; $courbe[] = $y+$h-$border['b']['width']; + $courbe[] = $x+$w-$outBR[0]; $courbe[] = $y+$h-$outBR[1]; + } else { + $courbe = array(); + $courbe[] = $x+$w; $courbe[] = $y+$h-$outBR[1]; + $courbe[] = $x+$w-$outBR[0]; $courbe[] = $y+$h; + $courbe[] = $x+$w-$border['r']['width']; $courbe[] = $y+$h-$border['b']['width']; + $courbe[] = $x+$w-$outBR[0]; $courbe[] = $y+$h-$outBR[1]; + } + $this->_drawCurve($courbe, $border['b']['color']); + } + + // draw the left border + if ($testBl) { + $pt = array(); + $pt[] = $x; $pt[] = $y+$h; + $pt[] = $x; $pt[] = $y+$h-$border['b']['width']; + $pt[] = $x; $pt[] = $y+$border['t']['width']; + $pt[] = $x; $pt[] = $y; + $pt[] = $x+$border['l']['width']; $pt[] = $y+$border['t']['width']; + $pt[] = $x+$border['l']['width']; $pt[] = $y+$h-$border['b']['width']; + + $bord = 3; + if (is_array($outBL)) { + $bord-=1; + $pt[3] -= $outBL[1] - $border['b']['width']; + if ($inBL) $pt[11]-= $inBL[1]; + unset($pt[0]);unset($pt[1]); + } + if (is_array($outTL)) { + $bord-=2; + $pt[5] += $outTL[1]-$border['t']['width']; + if ($inTL) $pt[9] += $inTL[1]; + unset($pt[6]);unset($pt[7]); + } + + $pt = array_values($pt); + $this->_drawLine($pt, $border['l']['color'], $border['l']['type'], $border['l']['width'], $bord); + } + + // draw the top border + if ($testBt) { + $pt = array(); + $pt[] = $x; $pt[] = $y; + $pt[] = $x+$border['l']['width']; $pt[] = $y; + $pt[] = $x+$w-$border['r']['width']; $pt[] = $y; + $pt[] = $x+$w; $pt[] = $y; + $pt[] = $x+$w-$border['r']['width']; $pt[] = $y+$border['t']['width']; + $pt[] = $x+$border['l']['width']; $pt[] = $y+$border['t']['width']; + + $bord = 3; + if (is_array($outTL)) { + $bord-=1; + $pt[2] += $outTL[0] - $border['l']['width']; + if ($inTL) $pt[10]+= $inTL[0]; + unset($pt[0]);unset($pt[1]); + } + if (is_array($outTR)) { + $bord-=2; + $pt[4] -= $outTR[0] - $border['r']['width']; + if ($inTR) $pt[8] -= $inTR[0]; + unset($pt[6]);unset($pt[7]); + } + + $pt = array_values($pt); + $this->_drawLine($pt, $border['t']['color'], $border['t']['type'], $border['t']['width'], $bord); + } + + // draw the right border + if ($testBr) { + $pt = array(); + $pt[] = $x+$w; $pt[] = $y; + $pt[] = $x+$w; $pt[] = $y+$border['t']['width']; + $pt[] = $x+$w; $pt[] = $y+$h-$border['b']['width']; + $pt[] = $x+$w; $pt[] = $y+$h; + $pt[] = $x+$w-$border['r']['width']; $pt[] = $y+$h-$border['b']['width']; + $pt[] = $x+$w-$border['r']['width']; $pt[] = $y+$border['t']['width']; + + $bord = 3; + if (is_array($outTR)) { + $bord-=1; + $pt[3] += $outTR[1] - $border['t']['width']; + if ($inTR) $pt[11]+= $inTR[1]; + unset($pt[0]);unset($pt[1]); + } + if (is_array($outBR)) { + $bord-=2; + $pt[5] -= $outBR[1] - $border['b']['width']; + if ($inBR) $pt[9] -= $inBR[1]; + unset($pt[6]);unset($pt[7]); + } + + $pt = array_values($pt); + $this->_drawLine($pt, $border['r']['color'], $border['r']['type'], $border['r']['width'], $bord); + } + + // draw the bottom border + if ($testBb) { + $pt = array(); + $pt[] = $x+$w; $pt[] = $y+$h; + $pt[] = $x+$w-$border['r']['width']; $pt[] = $y+$h; + $pt[] = $x+$border['l']['width']; $pt[] = $y+$h; + $pt[] = $x; $pt[] = $y+$h; + $pt[] = $x+$border['l']['width']; $pt[] = $y+$h-$border['b']['width']; + $pt[] = $x+$w-$border['r']['width']; $pt[] = $y+$h-$border['b']['width']; + + $bord = 3; + if (is_array($outBL)) { + $bord-=2; + $pt[4] += $outBL[0] - $border['l']['width']; + if ($inBL) $pt[8] += $inBL[0]; + unset($pt[6]);unset($pt[7]); + } + if (is_array($outBR)) { + $bord-=1; + $pt[2] -= $outBR[0] - $border['r']['width']; + if ($inBR) $pt[10]-= $inBR[0]; + unset($pt[0]);unset($pt[1]); + + } + + $pt = array_values($pt); + $this->_drawLine($pt, $border['b']['color'], $border['b']['type'], $border['b']['width'], $bord); + } + + if ($background['color']) { + $this->pdf->setFillColorArray($background['color']); + } + + return true; + } + + /** + * draw a curve (for border radius) + * + * @access protected + * @param array $pt + * @param array $color + */ + protected function _drawCurve($pt, $color) + { + $this->pdf->setFillColorArray($color); + + if (count($pt)==10) + $this->pdf->drawCurve($pt[0], $pt[1], $pt[2], $pt[3], $pt[4], $pt[5], $pt[6], $pt[7], $pt[8], $pt[9]); + else + $this->pdf->drawCorner($pt[0], $pt[1], $pt[2], $pt[3], $pt[4], $pt[5], $pt[6], $pt[7]); + } + + /** + * draw a ligne with a specific type, and specific start and end for radius + * + * @access protected + * @param array $pt + * @param float $color + * @param string $type (dashed, dotted, double, solid) + * @param float $width + * @param integer $radius (binary from 0 to 3 with 1=>start with a radius, 2=>end with a radius) + */ + protected function _drawLine($pt, $color, $type, $width, $radius=3) + { + // set the fill color + $this->pdf->setFillColorArray($color); + + // if dashed or dotted + if ($type=='dashed' || $type=='dotted') { + + // clean the end of the line, if radius + if ($radius==1) { + $tmp = array(); $tmp[]=$pt[0]; $tmp[]=$pt[1]; $tmp[]=$pt[2]; $tmp[]=$pt[3]; $tmp[]=$pt[8]; $tmp[]=$pt[9]; + $this->pdf->Polygon($tmp, 'F'); + + $tmp = array(); $tmp[]=$pt[2]; $tmp[]=$pt[3]; $tmp[]=$pt[4]; $tmp[]=$pt[5]; $tmp[]=$pt[6]; $tmp[]=$pt[7]; $tmp[]=$pt[8]; $tmp[]=$pt[9]; + $pt = $tmp; + } else if ($radius==2) { + $tmp = array(); $tmp[]=$pt[2]; $tmp[]=$pt[3]; $tmp[]=$pt[4]; $tmp[]=$pt[5]; $tmp[]=$pt[6]; $tmp[]=$pt[7]; + $this->pdf->Polygon($tmp, 'F'); + + $tmp = array(); $tmp[]=$pt[0]; $tmp[]=$pt[1]; $tmp[]=$pt[2]; $tmp[]=$pt[3]; $tmp[]=$pt[6]; $tmp[]=$pt[7]; $tmp[]=$pt[8]; $tmp[]=$pt[9]; + $pt = $tmp; + } else if ($radius==3) { + $tmp = array(); $tmp[]=$pt[0]; $tmp[]=$pt[1]; $tmp[]=$pt[2]; $tmp[]=$pt[3]; $tmp[]=$pt[10]; $tmp[]=$pt[11]; + $this->pdf->Polygon($tmp, 'F'); + + $tmp = array(); $tmp[]=$pt[4]; $tmp[]=$pt[5]; $tmp[]=$pt[6]; $tmp[]=$pt[7]; $tmp[]=$pt[8]; $tmp[]=$pt[9]; + $this->pdf->Polygon($tmp, 'F'); + + $tmp = array(); $tmp[]=$pt[2]; $tmp[]=$pt[3]; $tmp[]=$pt[4]; $tmp[]=$pt[5]; $tmp[]=$pt[8]; $tmp[]=$pt[9]; $tmp[]=$pt[10]; $tmp[]=$pt[11]; + $pt = $tmp; + } + + // horisontal or vertical line + if ($pt[2]==$pt[0]) { + $l = abs(($pt[3]-$pt[1])*0.5); + $px = 0; + $py = $width; + $x1 = $pt[0]; $y1 = ($pt[3]+$pt[1])*0.5; + $x2 = $pt[6]; $y2 = ($pt[7]+$pt[5])*0.5; + } else { + $l = abs(($pt[2]-$pt[0])*0.5); + $px = $width; + $py = 0; + $x1 = ($pt[2]+$pt[0])*0.5; $y1 = $pt[1]; + $x2 = ($pt[6]+$pt[4])*0.5; $y2 = $pt[7]; + } + + // if dashed : 3x bigger than dotted + if ($type=='dashed') { + $px = $px*3.; + $py = $py*3.; + } + $mode = ($l/($px+$py)<.5); + + // display the dotted/dashed line + for ($i=0; $l-($px+$py)*($i-0.5)>0; $i++) { + if (($i%2)==$mode) { + $j = $i-0.5; + $lx1 = $px*($j); if ($lx1<-$l) $lx1 =-$l; + $ly1 = $py*($j); if ($ly1<-$l) $ly1 =-$l; + $lx2 = $px*($j+1); if ($lx2>$l) $lx2 = $l; + $ly2 = $py*($j+1); if ($ly2>$l) $ly2 = $l; + + $tmp = array(); + $tmp[] = $x1+$lx1; $tmp[] = $y1+$ly1; + $tmp[] = $x1+$lx2; $tmp[] = $y1+$ly2; + $tmp[] = $x2+$lx2; $tmp[] = $y2+$ly2; + $tmp[] = $x2+$lx1; $tmp[] = $y2+$ly1; + $this->pdf->Polygon($tmp, 'F'); + + if ($j>0) { + $tmp = array(); + $tmp[] = $x1-$lx1; $tmp[] = $y1-$ly1; + $tmp[] = $x1-$lx2; $tmp[] = $y1-$ly2; + $tmp[] = $x2-$lx2; $tmp[] = $y2-$ly2; + $tmp[] = $x2-$lx1; $tmp[] = $y2-$ly1; + $this->pdf->Polygon($tmp, 'F'); + } + } + } + } else if ($type=='double') { + + // if double, 2 lines : 0=>1/3 and 2/3=>1 + $pt1 = $pt; + $pt2 = $pt; + + if (count($pt)==12) { + // line 1 + $pt1[0] = ($pt[0]-$pt[10])*0.33 + $pt[10]; + $pt1[1] = ($pt[1]-$pt[11])*0.33 + $pt[11]; + $pt1[2] = ($pt[2]-$pt[10])*0.33 + $pt[10]; + $pt1[3] = ($pt[3]-$pt[11])*0.33 + $pt[11]; + $pt1[4] = ($pt[4]-$pt[8])*0.33 + $pt[8]; + $pt1[5] = ($pt[5]-$pt[9])*0.33 + $pt[9]; + $pt1[6] = ($pt[6]-$pt[8])*0.33 + $pt[8]; + $pt1[7] = ($pt[7]-$pt[9])*0.33 + $pt[9]; + $pt2[10]= ($pt[10]-$pt[0])*0.33 + $pt[0]; + $pt2[11]= ($pt[11]-$pt[1])*0.33 + $pt[1]; + + // line 2 + $pt2[2] = ($pt[2] -$pt[0])*0.33 + $pt[0]; + $pt2[3] = ($pt[3] -$pt[1])*0.33 + $pt[1]; + $pt2[4] = ($pt[4] -$pt[6])*0.33 + $pt[6]; + $pt2[5] = ($pt[5] -$pt[7])*0.33 + $pt[7]; + $pt2[8] = ($pt[8] -$pt[6])*0.33 + $pt[6]; + $pt2[9] = ($pt[9] -$pt[7])*0.33 + $pt[7]; + } else { + // line 1 + $pt1[0] = ($pt[0]-$pt[6])*0.33 + $pt[6]; + $pt1[1] = ($pt[1]-$pt[7])*0.33 + $pt[7]; + $pt1[2] = ($pt[2]-$pt[4])*0.33 + $pt[4]; + $pt1[3] = ($pt[3]-$pt[5])*0.33 + $pt[5]; + + // line 2 + $pt2[6] = ($pt[6]-$pt[0])*0.33 + $pt[0]; + $pt2[7] = ($pt[7]-$pt[1])*0.33 + $pt[1]; + $pt2[4] = ($pt[4]-$pt[2])*0.33 + $pt[2]; + $pt2[5] = ($pt[5]-$pt[3])*0.33 + $pt[3]; + } + $this->pdf->Polygon($pt1, 'F'); + $this->pdf->Polygon($pt2, 'F'); + } else if ($type=='solid') { + // solid line : draw directly the polygon + $this->pdf->Polygon($pt, 'F'); + } + } + + /** + * prepare a transform matrix, only for drawing a SVG graphic + * + * @access protected + * @param string $transform + * @return array $matrix + */ + protected function _prepareTransform($transform) + { + // it can not be empty + if (!$transform) return null; + + // sctions must be like scale(...) + if (!preg_match_all('/([a-z]+)\(([^\)]*)\)/isU', $transform, $match)) return null; + + // prepare the list of the actions + $actions = array(); + + // for actions + for ($k=0; $k<count($match[0]); $k++) { + + // get the name of the action + $name = strtolower($match[1][$k]); + + // get the parameters of the action + $val = explode(',', trim($match[2][$k])); + foreach ($val as $i => $j) { + $val[$i] = trim($j); + } + + // prepare the matrix, depending on the action + switch($name) + { + case 'scale': + if (!isset($val[0])) $val[0] = 1.; else $val[0] = 1.*$val[0]; + if (!isset($val[1])) $val[1] = $val[0]; else $val[1] = 1.*$val[1]; + $actions[] = array($val[0],0,0,$val[1],0,0); + break; + + case 'translate': + if (!isset($val[0])) $val[0] = 0.; else $val[0] = $this->parsingCss->ConvertToMM($val[0], $this->_isInDraw['w']); + if (!isset($val[1])) $val[1] = 0.; else $val[1] = $this->parsingCss->ConvertToMM($val[1], $this->_isInDraw['h']); + $actions[] = array(1,0,0,1,$val[0],$val[1]); + break; + + case 'rotate': + if (!isset($val[0])) $val[0] = 0.; else $val[0] = $val[0]*M_PI/180.; + if (!isset($val[1])) $val[1] = 0.; else $val[1] = $this->parsingCss->ConvertToMM($val[1], $this->_isInDraw['w']); + if (!isset($val[2])) $val[2] = 0.; else $val[2] = $this->parsingCss->ConvertToMM($val[2], $this->_isInDraw['h']); + if ($val[1] || $val[2]) $actions[] = array(1,0,0,1,-$val[1],-$val[2]); + $actions[] = array(cos($val[0]),sin($val[0]),-sin($val[0]),cos($val[0]),0,0); + if ($val[1] || $val[2]) $actions[] = array(1,0,0,1,$val[1],$val[2]); + break; + + case 'skewx': + if (!isset($val[0])) $val[0] = 0.; else $val[0] = $val[0]*M_PI/180.; + $actions[] = array(1,0,tan($val[0]),1,0,0); + break; + + case 'skewy': + if (!isset($val[0])) $val[0] = 0.; else $val[0] = $val[0]*M_PI/180.; + $actions[] = array(1,tan($val[0]),0,1,0,0); + break; + case 'matrix': + if (!isset($val[0])) $val[0] = 0.; else $val[0] = $val[0]*1.; + if (!isset($val[1])) $val[1] = 0.; else $val[1] = $val[1]*1.; + if (!isset($val[2])) $val[2] = 0.; else $val[2] = $val[2]*1.; + if (!isset($val[3])) $val[3] = 0.; else $val[3] = $val[3]*1.; + if (!isset($val[4])) $val[4] = 0.; else $val[4] = $this->parsingCss->ConvertToMM($val[4], $this->_isInDraw['w']); + if (!isset($val[5])) $val[5] = 0.; else $val[5] = $this->parsingCss->ConvertToMM($val[5], $this->_isInDraw['h']); + $actions[] =$val; + break; + } + } + + // if ther is no actions => return + if (!$actions) return null; + + // get the first matrix + $m = $actions[0]; unset($actions[0]); + + // foreach matrix => multiply to the last matrix + foreach ($actions as $n) { + $m = array( + $m[0]*$n[0]+$m[2]*$n[1], + $m[1]*$n[0]+$m[3]*$n[1], + $m[0]*$n[2]+$m[2]*$n[3], + $m[1]*$n[2]+$m[3]*$n[3], + $m[0]*$n[4]+$m[2]*$n[5]+$m[4], + $m[1]*$n[4]+$m[3]*$n[5]+$m[5] + ); + } + + // return the matrix + return $m; + } + + /** + * @access protected + * @param &array $cases + * @param &array $corr + */ + protected function _calculateTableCellSize(&$cases, &$corr) + { + if (!isset($corr[0])) return true; + + // for each cell without colspan, we get the max width for each column + $sw = array(); + for ($x=0; $x<count($corr[0]); $x++) { + $m=0; + for ($y=0; $y<count($corr); $y++) { + if (isset($corr[$y][$x]) && is_array($corr[$y][$x]) && $corr[$y][$x][2]==1) { + $m = max($m, $cases[$corr[$y][$x][1]][$corr[$y][$x][0]]['w']); + } + } + $sw[$x] = $m; + } + + // for each cell with colspan, we adapt the width of each column + for ($x=0; $x<count($corr[0]); $x++) { + for ($y=0; $y<count($corr); $y++) { + if (isset($corr[$y][$x]) && is_array($corr[$y][$x]) && $corr[$y][$x][2]>1) { + + // sum the max width of each column in colspan + $s = 0; for ($i=0; $i<$corr[$y][$x][2]; $i++) $s+= $sw[$x+$i]; + + // if the max width is < the width of the cell with colspan => we adapt the width of each max width + if ($s>0 && $s<$cases[$corr[$y][$x][1]][$corr[$y][$x][0]]['w']) { + for ($i=0; $i<$corr[$y][$x][2]; $i++) { + $sw[$x+$i] = $sw[$x+$i]/$s*$cases[$corr[$y][$x][1]][$corr[$y][$x][0]]['w']; + } + } + } + } + } + + // set the new width, for each cell + for ($x=0; $x<count($corr[0]); $x++) { + for ($y=0; $y<count($corr); $y++) { + if (isset($corr[$y][$x]) && is_array($corr[$y][$x])) { + // without colspan + if ($corr[$y][$x][2]==1) { + $cases[$corr[$y][$x][1]][$corr[$y][$x][0]]['w'] = $sw[$x]; + // with colspan + } else { + $s = 0; + for ($i=0; $i<$corr[$y][$x][2]; $i++) { + $s+= $sw[$x+$i]; + } + $cases[$corr[$y][$x][1]][$corr[$y][$x][0]]['w'] = $s; + } + } + } + } + + // for each cell without rowspan, we get the max height for each line + $sh = array(); + for ($y=0; $y<count($corr); $y++) { + $m=0; + for ($x=0; $x<count($corr[0]); $x++) { + if (isset($corr[$y][$x]) && is_array($corr[$y][$x]) && $corr[$y][$x][3]==1) { + $m = max($m, $cases[$corr[$y][$x][1]][$corr[$y][$x][0]]['h']); + } + } + $sh[$y] = $m; + } + + // for each cell with rowspan, we adapt the height of each line + for ($y=0; $y<count($corr); $y++) { + for ($x=0; $x<count($corr[0]); $x++) { + if (isset($corr[$y][$x]) && is_array($corr[$y][$x]) && $corr[$y][$x][3]>1) { + + // sum the max height of each line in rowspan + $s = 0; for ($i=0; $i<$corr[$y][$x][3]; $i++) $s+= $sh[$y+$i]; + + // if the max height is < the height of the cell with rowspan => we adapt the height of each max height + if ($s>0 && $s<$cases[$corr[$y][$x][1]][$corr[$y][$x][0]]['h']) { + for ($i=0; $i<$corr[$y][$x][3]; $i++) { + $sh[$y+$i] = $sh[$y+$i]/$s*$cases[$corr[$y][$x][1]][$corr[$y][$x][0]]['h']; + } + } + } + } + } + + // set the new height, for each cell + for ($y=0; $y<count($corr); $y++) { + for ($x=0; $x<count($corr[0]); $x++) { + if (isset($corr[$y][$x]) && is_array($corr[$y][$x])) { + // without rowspan + if ($corr[$y][$x][3]==1) { + $cases[$corr[$y][$x][1]][$corr[$y][$x][0]]['h'] = $sh[$y]; + // with rowspan + } else { + $s = 0; + for ($i=0; $i<$corr[$y][$x][3]; $i++) { + $s+= $sh[$y+$i]; + } + $cases[$corr[$y][$x][1]][$corr[$y][$x][0]]['h'] = $s; + + for ($j=1; $j<$corr[$y][$x][3]; $j++) { + $tx = $x+1; + $ty = $y+$j; + for (true; isset($corr[$ty][$tx]) && !is_array($corr[$ty][$tx]); $tx++); + if (isset($corr[$ty][$tx])) { + $cases[$corr[$ty][$tx][1]][$corr[$ty][$tx][0]]['dw']+= $cases[$corr[$y][$x][1]][$corr[$y][$x][0]]['w']; + } + } + } + } + } + } + } + + /** + * tag : PAGE + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_PAGE($param) + { + if ($this->_isForOneLine) return false; + if ($this->_debugActif) $this->_DEBUG_add('PAGE '.($this->_page+1), true); + + $newPageSet= (!isset($param['pageset']) || $param['pageset']!='old'); + + $resetPageNumber = (isset($param['pagegroup']) && $param['pagegroup']=='new'); + + $this->_maxH = 0; + + // if new page set asked + if ($newPageSet) { + $this->_subHEADER = array(); + $this->_subFOOTER = array(); + + // orientation + $orientation = ''; + if (isset($param['orientation'])) { + $param['orientation'] = strtolower($param['orientation']); + if ($param['orientation']=='p') $orientation = 'P'; + if ($param['orientation']=='portrait') $orientation = 'P'; + + if ($param['orientation']=='l') $orientation = 'L'; + if ($param['orientation']=='paysage') $orientation = 'L'; + if ($param['orientation']=='landscape') $orientation = 'L'; + } + + // format + $format = null; + if (isset($param['format'])) { + $format = strtolower($param['format']); + if (preg_match('/^([0-9]+)x([0-9]+)$/isU', $format, $match)) { + $format = array(intval($match[1]), intval($match[2])); + } + } + + // background + $background = array(); + if (isset($param['backimg'])) { + $background['img'] = isset($param['backimg']) ? $param['backimg'] : ''; // src of the image + $background['posX'] = isset($param['backimgx']) ? $param['backimgx'] : 'center'; // horizontale position of the image + $background['posY'] = isset($param['backimgy']) ? $param['backimgy'] : 'middle'; // vertical position of the image + $background['width'] = isset($param['backimgw']) ? $param['backimgw'] : '100%'; // width of the image (100% = page width) + + // convert the src of the image, if parameters + $background['img'] = str_replace('&amp;', '&', $background['img']); + + // convert the positions + if ($background['posX']=='left') $background['posX'] = '0%'; + if ($background['posX']=='center') $background['posX'] = '50%'; + if ($background['posX']=='right') $background['posX'] = '100%'; + if ($background['posY']=='top') $background['posY'] = '0%'; + if ($background['posY']=='middle') $background['posY'] = '50%'; + if ($background['posY']=='bottom') $background['posY'] = '100%'; + + if ($background['img']) { + // get the size of the image + // WARNING : if URL, "allow_url_fopen" must turned to "on" in php.ini + $infos=@getimagesize($background['img']); + if (count($infos)>1) { + $imageWidth = $this->parsingCss->ConvertToMM($background['width'], $this->pdf->getW()); + $imageHeight = $imageWidth*$infos[1]/$infos[0]; + + $background['width'] = $imageWidth; + $background['posX'] = $this->parsingCss->ConvertToMM($background['posX'], $this->pdf->getW() - $imageWidth); + $background['posY'] = $this->parsingCss->ConvertToMM($background['posY'], $this->pdf->getH() - $imageHeight); + } else { + $background = array(); + } + } else { + $background = array(); + } + } + + // margins of the page + $background['top'] = isset($param['backtop']) ? $param['backtop'] : '0'; + $background['bottom'] = isset($param['backbottom']) ? $param['backbottom'] : '0'; + $background['left'] = isset($param['backleft']) ? $param['backleft'] : '0'; + $background['right'] = isset($param['backright']) ? $param['backright'] : '0'; + + // if no unit => mm + if (preg_match('/^([0-9]*)$/isU', $background['top'])) $background['top'] .= 'mm'; + if (preg_match('/^([0-9]*)$/isU', $background['bottom'])) $background['bottom'] .= 'mm'; + if (preg_match('/^([0-9]*)$/isU', $background['left'])) $background['left'] .= 'mm'; + if (preg_match('/^([0-9]*)$/isU', $background['right'])) $background['right'] .= 'mm'; + + // convert to mm + $background['top'] = $this->parsingCss->ConvertToMM($background['top'], $this->pdf->getH()); + $background['bottom'] = $this->parsingCss->ConvertToMM($background['bottom'], $this->pdf->getH()); + $background['left'] = $this->parsingCss->ConvertToMM($background['left'], $this->pdf->getW()); + $background['right'] = $this->parsingCss->ConvertToMM($background['right'], $this->pdf->getW()); + + // get the background color + $res = false; + $background['color'] = isset($param['backcolor']) ? $this->parsingCss->convertToColor($param['backcolor'], $res) : null; + if (!$res) $background['color'] = null; + + $this->parsingCss->save(); + $this->parsingCss->analyse('PAGE', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + // new page + $this->_setNewPage($format, $orientation, $background, null, $resetPageNumber); + + // automatic footer + if (isset($param['footer'])) { + $lst = explode(';', $param['footer']); + foreach ($lst as $key => $val) $lst[$key] = trim(strtolower($val)); + $page = in_array('page', $lst); + $date = in_array('date', $lst); + $hour = in_array('heure', $lst); + $form = in_array('form', $lst); + } else { + $page = null; + $date = null; + $hour = null; + $form = null; + } + $this->pdf->SetMyFooter($page, $date, $hour, $form); + // else => we use the last page set used + } else { + $this->parsingCss->save(); + $this->parsingCss->analyse('PAGE', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + $this->_setNewPage(null, null, null, null, $resetPageNumber); + } + + return true; + } + + /** + * tag : PAGE + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_PAGE($param) + { + if ($this->_isForOneLine) return false; + + $this->_maxH = 0; + + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + if ($this->_debugActif) $this->_DEBUG_add('PAGE '.$this->_page, false); + + return true; + } + + /** + * tag : PAGE_HEADER + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_PAGE_HEADER($param) + { + if ($this->_isForOneLine) return false; + + $this->_subHEADER = array(); + for ($this->_parsePos; $this->_parsePos<count($this->parsingHtml->code); $this->_parsePos++) { + $action = $this->parsingHtml->code[$this->_parsePos]; + if ($action['name']=='page_header') $action['name']='page_header_sub'; + $this->_subHEADER[] = $action; + if (strtolower($action['name'])=='page_header_sub' && $action['close']) break; + } + + $this->_setPageHeader(); + + return true; + } + + /** + * tag : PAGE_FOOTER + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_PAGE_FOOTER($param) + { + if ($this->_isForOneLine) return false; + + $this->_subFOOTER = array(); + for ($this->_parsePos; $this->_parsePos<count($this->parsingHtml->code); $this->_parsePos++) { + $action = $this->parsingHtml->code[$this->_parsePos]; + if ($action['name']=='page_footer') $action['name']='page_footer_sub'; + $this->_subFOOTER[] = $action; + if (strtolower($action['name'])=='page_footer_sub' && $action['close']) break; + } + + $this->_setPageFooter(); + + return true; + } + + /** + * It is not a real tag. Does not use it directly + * + * @param array $param + * @return boolean + */ + protected function _tag_open_PAGE_HEADER_SUB($param) + { + if ($this->_isForOneLine) return false; + + // save the current stat + $this->_subSTATES = array(); + $this->_subSTATES['x'] = $this->pdf->getX(); + $this->_subSTATES['y'] = $this->pdf->getY(); + $this->_subSTATES['s'] = $this->parsingCss->value; + $this->_subSTATES['t'] = $this->parsingCss->table; + $this->_subSTATES['ml'] = $this->_margeLeft; + $this->_subSTATES['mr'] = $this->_margeRight; + $this->_subSTATES['mt'] = $this->_margeTop; + $this->_subSTATES['mb'] = $this->_margeBottom; + $this->_subSTATES['mp'] = $this->_pageMarges; + + // new stat for the header + $this->_pageMarges = array(); + $this->_margeLeft = $this->_defaultLeft; + $this->_margeRight = $this->_defaultRight; + $this->_margeTop = $this->_defaultTop; + $this->_margeBottom = $this->_defaultBottom; + $this->pdf->SetMargins($this->_margeLeft, $this->_margeTop, $this->_margeRight); + $this->pdf->SetAutoPageBreak(false, $this->_margeBottom); + $this->pdf->setXY($this->_defaultLeft, $this->_defaultTop); + + $this->parsingCss->initStyle(); + $this->parsingCss->resetStyle(); + $this->parsingCss->value['width'] = $this->pdf->getW() - $this->_defaultLeft - $this->_defaultRight; + $this->parsingCss->table = array(); + + $this->parsingCss->save(); + $this->parsingCss->analyse('page_header_sub', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + $this->_setNewPositionForNewLine(); + return true; + } + + /** + * It is not a real tag. Does not use it directly + * + * @param array $param + * @return boolean + */ + protected function _tag_close_PAGE_HEADER_SUB($param) + { + if ($this->_isForOneLine) return false; + + $this->parsingCss->load(); + + // restore the stat + $this->parsingCss->value = $this->_subSTATES['s']; + $this->parsingCss->table = $this->_subSTATES['t']; + $this->_pageMarges = $this->_subSTATES['mp']; + $this->_margeLeft = $this->_subSTATES['ml']; + $this->_margeRight = $this->_subSTATES['mr']; + $this->_margeTop = $this->_subSTATES['mt']; + $this->_margeBottom = $this->_subSTATES['mb']; + $this->pdf->SetMargins($this->_margeLeft, $this->_margeTop, $this->_margeRight); + $this->pdf->setbMargin($this->_margeBottom); + $this->pdf->SetAutoPageBreak(false, $this->_margeBottom); + $this->pdf->setXY($this->_subSTATES['x'], $this->_subSTATES['y']); + + $this->parsingCss->fontSet(); + $this->_maxH = 0; + + return true; + } + + /** + * It is not a real tag. Does not use it directly + * + * @param array $param + * @return boolean + */ + protected function _tag_open_PAGE_FOOTER_SUB($param) + { + if ($this->_isForOneLine) return false; + + // save the current stat + $this->_subSTATES = array(); + $this->_subSTATES['x'] = $this->pdf->getX(); + $this->_subSTATES['y'] = $this->pdf->getY(); + $this->_subSTATES['s'] = $this->parsingCss->value; + $this->_subSTATES['t'] = $this->parsingCss->table; + $this->_subSTATES['ml'] = $this->_margeLeft; + $this->_subSTATES['mr'] = $this->_margeRight; + $this->_subSTATES['mt'] = $this->_margeTop; + $this->_subSTATES['mb'] = $this->_margeBottom; + $this->_subSTATES['mp'] = $this->_pageMarges; + + // new stat for the footer + $this->_pageMarges = array(); + $this->_margeLeft = $this->_defaultLeft; + $this->_margeRight = $this->_defaultRight; + $this->_margeTop = $this->_defaultTop; + $this->_margeBottom = $this->_defaultBottom; + $this->pdf->SetMargins($this->_margeLeft, $this->_margeTop, $this->_margeRight); + $this->pdf->SetAutoPageBreak(false, $this->_margeBottom); + $this->pdf->setXY($this->_defaultLeft, $this->_defaultTop); + + $this->parsingCss->initStyle(); + $this->parsingCss->resetStyle(); + $this->parsingCss->value['width'] = $this->pdf->getW() - $this->_defaultLeft - $this->_defaultRight; + $this->parsingCss->table = array(); + + // we create a sub HTML2PFDF, and we execute on it the content of the footer, to get the height of it + $sub = null; + $this->_createSubHTML($sub); + $sub->parsingHtml->code = $this->parsingHtml->getLevel($this->_parsePos); + $sub->_makeHTMLcode(); + $this->pdf->setY($this->pdf->getH() - $sub->_maxY - $this->_defaultBottom - 0.01); + $this->_destroySubHTML($sub); + + $this->parsingCss->save(); + $this->parsingCss->analyse('page_footer_sub', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + $this->_setNewPositionForNewLine(); + + return true; + } + + /** + * It is not a real tag. Does not use it directly + * + * @param array $param + * @return boolean + */ + protected function _tag_close_PAGE_FOOTER_SUB($param) + { + if ($this->_isForOneLine) return false; + + $this->parsingCss->load(); + + $this->parsingCss->value = $this->_subSTATES['s']; + $this->parsingCss->table = $this->_subSTATES['t']; + $this->_pageMarges = $this->_subSTATES['mp']; + $this->_margeLeft = $this->_subSTATES['ml']; + $this->_margeRight = $this->_subSTATES['mr']; + $this->_margeTop = $this->_subSTATES['mt']; + $this->_margeBottom = $this->_subSTATES['mb']; + $this->pdf->SetMargins($this->_margeLeft, $this->_margeTop, $this->_margeRight); + $this->pdf->SetAutoPageBreak(false, $this->_margeBottom); + $this->pdf->setXY($this->_subSTATES['x'], $this->_subSTATES['y']); + + $this->parsingCss->fontSet(); + $this->_maxH = 0; + + return true; + } + + /** + * tag : NOBREAK + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_NOBREAK($param) + { + if ($this->_isForOneLine) return false; + + $this->_maxH = 0; + + // create a sub HTML2PDF to execute the content of the tag, to get the dimensions + $sub = null; + $this->_createSubHTML($sub); + $sub->parsingHtml->code = $this->parsingHtml->getLevel($this->_parsePos); + $sub->_makeHTMLcode(); + $y = $this->pdf->getY(); + + // if the content does not fit on the page => new page + if ( + $sub->_maxY < ($this->pdf->getH() - $this->pdf->gettMargin()-$this->pdf->getbMargin()) && + $y + $sub->_maxY>=($this->pdf->getH() - $this->pdf->getbMargin()) + ) { + $this->_setNewPage(); + } + + // destroy the sub HTML2PDF + $this->_destroySubHTML($sub); + + return true; + } + + + /** + * tag : NOBREAK + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_NOBREAK($param) + { + if ($this->_isForOneLine) return false; + + $this->_maxH = 0; + + return true; + } + + /** + * tag : DIV + * mode : OPEN + * + * @param array $param + * @param string $other name of tag that used the div tag + * @return boolean + */ + protected function _tag_open_DIV($param, $other = 'div') + { + if ($this->_isForOneLine) return false; + if ($this->_debugActif) $this->_DEBUG_add(strtoupper($other), true); + + $this->parsingCss->save(); + $this->parsingCss->analyse($other, $param); + $this->parsingCss->fontSet(); + + // for fieldset and legend + if (in_array($other, array('fieldset', 'legend'))) { + if (isset($param['moveTop'])) $this->parsingCss->value['margin']['t'] += $param['moveTop']; + if (isset($param['moveLeft'])) $this->parsingCss->value['margin']['l'] += $param['moveLeft']; + if (isset($param['moveDown'])) $this->parsingCss->value['margin']['b'] += $param['moveDown']; + } + + $alignObject = null; + if ($this->parsingCss->value['margin-auto']) $alignObject = 'center'; + + $marge = array(); + $marge['l'] = $this->parsingCss->value['border']['l']['width'] + $this->parsingCss->value['padding']['l']+0.03; + $marge['r'] = $this->parsingCss->value['border']['r']['width'] + $this->parsingCss->value['padding']['r']+0.03; + $marge['t'] = $this->parsingCss->value['border']['t']['width'] + $this->parsingCss->value['padding']['t']+0.03; + $marge['b'] = $this->parsingCss->value['border']['b']['width'] + $this->parsingCss->value['padding']['b']+0.03; + + // extract the content of the div + $level = $this->parsingHtml->getLevel($this->_parsePos); + + // create a sub HTML2PDF to get the dimensions of the content of the div + $w = 0; $h = 0; + if (count($level)) { + $sub = null; + $this->_createSubHTML($sub); + $sub->parsingHtml->code = $level; + $sub->_makeHTMLcode(); + $w = $sub->_maxX; + $h = $sub->_maxY; + $this->_destroySubHTML($sub); + } + $wReel = $w; + $hReel = $h; + + $w+= $marge['l']+$marge['r']+0.001; + $h+= $marge['t']+$marge['b']+0.001; + + if ($this->parsingCss->value['overflow']=='hidden') { + $overW = max($w, $this->parsingCss->value['width']); + $overH = max($h, $this->parsingCss->value['height']); + $overflow = true; + $this->parsingCss->value['old_maxX'] = $this->_maxX; + $this->parsingCss->value['old_maxY'] = $this->_maxY; + $this->parsingCss->value['old_maxH'] = $this->_maxH; + $this->parsingCss->value['old_overflow'] = $this->_isInOverflow; + $this->_isInOverflow = true; + } else { + $overW = null; + $overH = null; + $overflow = false; + $this->parsingCss->value['width'] = max($w, $this->parsingCss->value['width']); + $this->parsingCss->value['height'] = max($h, $this->parsingCss->value['height']); + } + + switch($this->parsingCss->value['rotate']) + { + case 90: + $tmp = $overH; $overH = $overW; $overW = $tmp; + $tmp = $hReel; $hReel = $wReel; $wReel = $tmp; + unset($tmp); + $w = $this->parsingCss->value['height']; + $h = $this->parsingCss->value['width']; + $tX =-$h; + $tY = 0; + break; + + case 180: + $w = $this->parsingCss->value['width']; + $h = $this->parsingCss->value['height']; + $tX = -$w; + $tY = -$h; + break; + + case 270: + $tmp = $overH; $overH = $overW; $overW = $tmp; + $tmp = $hReel; $hReel = $wReel; $wReel = $tmp; + unset($tmp); + $w = $this->parsingCss->value['height']; + $h = $this->parsingCss->value['width']; + $tX = 0; + $tY =-$w; + break; + + default: + $w = $this->parsingCss->value['width']; + $h = $this->parsingCss->value['height']; + $tX = 0; + $tY = 0; + break; + } + + if (!$this->parsingCss->value['position']) { + if ( + $w < ($this->pdf->getW() - $this->pdf->getlMargin()-$this->pdf->getrMargin()) && + $this->pdf->getX() + $w>=($this->pdf->getW() - $this->pdf->getrMargin()) + ) + $this->_tag_open_BR(array()); + + if ( + ($h < ($this->pdf->getH() - $this->pdf->gettMargin()-$this->pdf->getbMargin())) && + ($this->pdf->getY() + $h>=($this->pdf->getH() - $this->pdf->getbMargin())) && + !$this->_isInOverflow + ) + $this->_setNewPage(); + + $old = $this->parsingCss->getOldValues(); + $parentWidth = $old['width'] ? $old['width'] : $this->pdf->getW() - $this->pdf->getlMargin() - $this->pdf->getrMargin(); + + if ($parentWidth>$w) { + if ($alignObject=='center') $this->pdf->setX($this->pdf->getX() + ($parentWidth-$w)*0.5); + else if ($alignObject=='right') $this->pdf->setX($this->pdf->getX() + $parentWidth-$w); + } + + $this->parsingCss->setPosition(); + } else { + $old = $this->parsingCss->getOldValues(); + $parentWidth = $old['width'] ? $old['width'] : $this->pdf->getW() - $this->pdf->getlMargin() - $this->pdf->getrMargin(); + + if ($parentWidth>$w) { + if ($alignObject=='center') $this->pdf->setX($this->pdf->getX() + ($parentWidth-$w)*0.5); + else if ($alignObject=='right') $this->pdf->setX($this->pdf->getX() + $parentWidth-$w); + } + + $this->parsingCss->setPosition(); + $this->_saveMax(); + $this->_maxX = 0; + $this->_maxY = 0; + $this->_maxH = 0; + $this->_maxE = 0; + } + + if ($this->parsingCss->value['rotate']) { + $this->pdf->startTransform(); + $this->pdf->setRotation($this->parsingCss->value['rotate']); + $this->pdf->setTranslate($tX, $tY); + } + + $this->_drawRectangle( + $this->parsingCss->value['x'], + $this->parsingCss->value['y'], + $this->parsingCss->value['width'], + $this->parsingCss->value['height'], + $this->parsingCss->value['border'], + $this->parsingCss->value['padding'], + 0, + $this->parsingCss->value['background'] + ); + + $marge = array(); + $marge['l'] = $this->parsingCss->value['border']['l']['width'] + $this->parsingCss->value['padding']['l']+0.03; + $marge['r'] = $this->parsingCss->value['border']['r']['width'] + $this->parsingCss->value['padding']['r']+0.03; + $marge['t'] = $this->parsingCss->value['border']['t']['width'] + $this->parsingCss->value['padding']['t']+0.03; + $marge['b'] = $this->parsingCss->value['border']['b']['width'] + $this->parsingCss->value['padding']['b']+0.03; + + $this->parsingCss->value['width'] -= $marge['l']+$marge['r']; + $this->parsingCss->value['height']-= $marge['t']+$marge['b']; + + $xCorr = 0; + $yCorr = 0; + if (!$this->_subPart && !$this->_isSubPart) { + switch($this->parsingCss->value['text-align']) + { + case 'right': + $xCorr = ($this->parsingCss->value['width']-$wReel); + break; + case 'center': + $xCorr = ($this->parsingCss->value['width']-$wReel)*0.5; + break; + } + if ($xCorr>0) $xCorr=0; + switch($this->parsingCss->value['vertical-align']) + { + case 'bottom': + $yCorr = ($this->parsingCss->value['height']-$hReel); + break; + case 'middle': + $yCorr = ($this->parsingCss->value['height']-$hReel)*0.5; + break; + } + } + + if ($overflow) { + $overW-= $marge['l']+$marge['r']; + $overH-= $marge['t']+$marge['b']; + $this->pdf->clippingPathStart( + $this->parsingCss->value['x']+$marge['l'], + $this->parsingCss->value['y']+$marge['t'], + $this->parsingCss->value['width'], + $this->parsingCss->value['height'] + ); + + $this->parsingCss->value['x']+= $xCorr; + + // marges from the dimension of the content + $mL = $this->parsingCss->value['x']+$marge['l']; + $mR = $this->pdf->getW() - $mL - $overW; + } else { + // marges from the dimension of the div + $mL = $this->parsingCss->value['x']+$marge['l']; + $mR = $this->pdf->getW() - $mL - $this->parsingCss->value['width']; + } + + $x = $this->parsingCss->value['x']+$marge['l']; + $y = $this->parsingCss->value['y']+$marge['t']+$yCorr; + $this->_saveMargin($mL, 0, $mR); + $this->pdf->setXY($x, $y); + + $this->_setNewPositionForNewLine(); + + return true; + } + + /** + * tag : BLOCKQUOTE + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_BLOCKQUOTE($param) + { + return $this->_tag_open_DIV($param, 'blockquote'); + } + + /** + * tag : LEGEND + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_LEGEND($param) + { + return $this->_tag_open_DIV($param, 'legend'); + } + + /** + * tag : FIELDSET + * mode : OPEN + * + * @author Pavel Kochman + * @param array $param + * @return boolean + */ + protected function _tag_open_FIELDSET($param) + { + + $this->parsingCss->save(); + $this->parsingCss->analyse('fieldset', $param); + + // get height of LEGEND element and make fieldset corrections + for ($tempPos = $this->_parsePos + 1; $tempPos<count($this->parsingHtml->code); $tempPos++) { + $action = $this->parsingHtml->code[$tempPos]; + if ($action['name'] == 'fieldset') break; + if ($action['name'] == 'legend' && !$action['close']) { + $legendOpenPos = $tempPos; + + $sub = null; + $this->_createSubHTML($sub); + $sub->parsingHtml->code = $this->parsingHtml->getLevel($tempPos - 1); + + $res = null; + for ($sub->_parsePos = 0; $sub->_parsePos<count($sub->parsingHtml->code); $sub->_parsePos++) { + $action = $sub->parsingHtml->code[$sub->_parsePos]; + $sub->_executeAction($action); + + if ($action['name'] == 'legend' && $action['close']) + break; + } + + $legendH = $sub->_maxY; + $this->_destroySubHTML($sub); + + $move = $this->parsingCss->value['padding']['t'] + $this->parsingCss->value['border']['t']['width'] + 0.03; + + $param['moveTop'] = $legendH / 2; + + $this->parsingHtml->code[$legendOpenPos]['param']['moveTop'] = - ($legendH / 2 + $move); + $this->parsingHtml->code[$legendOpenPos]['param']['moveLeft'] = 2 - $this->parsingCss->value['border']['l']['width'] - $this->parsingCss->value['padding']['l']; + $this->parsingHtml->code[$legendOpenPos]['param']['moveDown'] = $move; + break; + } + } + $this->parsingCss->load(); + + return $this->_tag_open_DIV($param, 'fieldset'); + } + + /** + * tag : DIV + * mode : CLOSE + * + * @param array $param + * @param string $other name of tag that used the div tag + * @return boolean + */ + protected function _tag_close_DIV($param, $other='div') + { + if ($this->_isForOneLine) return false; + + if ($this->parsingCss->value['overflow']=='hidden') { + $this->_maxX = $this->parsingCss->value['old_maxX']; + $this->_maxY = $this->parsingCss->value['old_maxY']; + $this->_maxH = $this->parsingCss->value['old_maxH']; + $this->_isInOverflow = $this->parsingCss->value['old_overflow']; + $this->pdf->clippingPathStop(); + } + + if ($this->parsingCss->value['rotate']) + $this->pdf->stopTransform(); + + $marge = array(); + $marge['l'] = $this->parsingCss->value['border']['l']['width'] + $this->parsingCss->value['padding']['l']+0.03; + $marge['r'] = $this->parsingCss->value['border']['r']['width'] + $this->parsingCss->value['padding']['r']+0.03; + $marge['t'] = $this->parsingCss->value['border']['t']['width'] + $this->parsingCss->value['padding']['t']+0.03; + $marge['b'] = $this->parsingCss->value['border']['b']['width'] + $this->parsingCss->value['padding']['b']+0.03; + + $x = $this->parsingCss->value['x']; + $y = $this->parsingCss->value['y']; + $w = $this->parsingCss->value['width']+$marge['l']+$marge['r']+$this->parsingCss->value['margin']['r']; + $h = $this->parsingCss->value['height']+$marge['t']+$marge['b']+$this->parsingCss->value['margin']['b']; + + switch($this->parsingCss->value['rotate']) + { + case 90: + $t = $w; $w = $h; $h = $t; + break; + + case 270: + $t = $w; $w = $h; $h = $t; + break; + + default: + break; + } + + + if ($this->parsingCss->value['position']!='absolute') { + $this->pdf->setXY($x+$w, $y); + + $this->_maxX = max($this->_maxX, $x+$w); + $this->_maxY = max($this->_maxY, $y+$h); + $this->_maxH = max($this->_maxH, $h); + } else { + $this->pdf->setXY($this->parsingCss->value['xc'], $this->parsingCss->value['yc']); + + $this->_loadMax(); + } + + $block = ($this->parsingCss->value['display']!='inline' && $this->parsingCss->value['position']!='absolute'); + + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + $this->_loadMargin(); + + if ($block) $this->_tag_open_BR(array()); + if ($this->_debugActif) $this->_DEBUG_add(strtoupper($other), false); + + return true; + } + + /** + * tag : BLOCKQUOTE + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_BLOCKQUOTE($param) + { + return $this->_tag_close_DIV($param, 'blockquote'); + } + + /** + * tag : FIELDSET + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_FIELDSET($param) + { + return $this->_tag_close_DIV($param, 'fieldset'); + } + + /** + * tag : LEGEND + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_LEGEND($param) + { + return $this->_tag_close_DIV($param, 'legend'); + } + + /** + * tag : BARCODE + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_BARCODE($param) + { + // for compatibility with old versions < 3.29 + $lstBarcode = array(); + $lstBarcode['UPC_A'] = 'UPCA'; + $lstBarcode['CODE39'] = 'C39'; + + if (!isset($param['type'])) $param['type'] = 'C39'; + if (!isset($param['value'])) $param['value'] = 0; + if (!isset($param['label'])) $param['label'] = 'label'; + if (!isset($param['style']['color'])) $param['style']['color'] = '#000000'; + + if ($this->_testIsDeprecated && (isset($param['bar_h']) || isset($param['bar_w']))) + throw new HTML2PDF_exception(9, array('BARCODE', 'bar_h, bar_w')); + + $param['type'] = strtoupper($param['type']); + if (isset($lstBarcode[$param['type']])) $param['type'] = $lstBarcode[$param['type']]; + + $this->parsingCss->save(); + $this->parsingCss->analyse('barcode', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + $x = $this->pdf->getX(); + $y = $this->pdf->getY(); + $w = $this->parsingCss->value['width']; if (!$w) $w = $this->parsingCss->ConvertToMM('50mm'); + $h = $this->parsingCss->value['height']; if (!$h) $h = $this->parsingCss->ConvertToMM('10mm'); + $txt = ($param['label']!=='none' ? $this->parsingCss->value['font-size'] : false); + $c = $this->parsingCss->value['color']; + $infos = $this->pdf->myBarcode($param['value'], $param['type'], $x, $y, $w, $h, $txt, $c); + + $this->_maxX = max($this->_maxX, $x+$infos[0]); + $this->_maxY = max($this->_maxY, $y+$infos[1]); + $this->_maxH = max($this->_maxH, $infos[1]); + $this->_maxE++; + + $this->pdf->setXY($x+$infos[0], $y); + + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : BARCODE + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_BARCODE($param) + { + // there is nothing to do here + + return true; + } + + /** + * tag : QRCODE + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_QRCODE($param) + { + if ($this->_testIsDeprecated && (isset($param['size']) || isset($param['noborder']))) + throw new HTML2PDF_exception(9, array('QRCODE', 'size, noborder')); + + if ($this->_debugActif) $this->_DEBUG_add('QRCODE'); + + if (!isset($param['value'])) $param['value'] = ''; + if (!isset($param['ec'])) $param['ec'] = 'H'; + if (!isset($param['style']['color'])) $param['style']['color'] = '#000000'; + if (!isset($param['style']['background-color'])) $param['style']['background-color'] = '#FFFFFF'; + if (isset($param['style']['border'])) { + $borders = $param['style']['border']!='none'; + unset($param['style']['border']); + } else { + $borders = true; + } + + if ($param['value']==='') return true; + if (!in_array($param['ec'], array('L', 'M', 'Q', 'H'))) $param['ec'] = 'H'; + + $this->parsingCss->save(); + $this->parsingCss->analyse('qrcode', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + $x = $this->pdf->getX(); + $y = $this->pdf->getY(); + $w = $this->parsingCss->value['width']; + $h = $this->parsingCss->value['height']; + $size = max($w, $h); if (!$size) $size = $this->parsingCss->ConvertToMM('50mm'); + + $style = array( + 'fgcolor' => $this->parsingCss->value['color'], + 'bgcolor' => $this->parsingCss->value['background']['color'], + ); + + if ($borders) { + $style['border'] = true; + $style['padding'] = 'auto'; + } else { + $style['border'] = false; + $style['padding'] = 0; + } + + if (!$this->_subPart && !$this->_isSubPart) { + $this->pdf->write2DBarcode($param['value'], 'QRCODE,'.$param['ec'], $x, $y, $size, $size, $style); + } + + $this->_maxX = max($this->_maxX, $x+$size); + $this->_maxY = max($this->_maxY, $y+$size); + $this->_maxH = max($this->_maxH, $size); + $this->_maxE++; + + $this->pdf->setX($x+$size); + + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : QRCODE + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_QRCODE($param) + { + // there is nothing to do here + + return true; + } + + /** + * tag : BOOKMARK + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_BOOKMARK($param) + { + $titre = isset($param['title']) ? trim($param['title']) : ''; + $level = isset($param['level']) ? floor($param['level']) : 0; + + if ($level<0) $level = 0; + if ($titre) $this->pdf->Bookmark($titre, $level, -1); + + return true; + } + + /** + * tag : BOOKMARK + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_BOOKMARK($param) + { + // there is nothing to do here + + return true; + } + + /** + * this is not a real TAG, it is just to write texts + * + * @param array $param + * @return boolean + */ + protected function _tag_open_WRITE($param) + { + $fill = ($this->parsingCss->value['background']['color']!==null && $this->parsingCss->value['background']['image']===null); + if (in_array($this->parsingCss->value['id_tag'], array('fieldset', 'legend', 'div', 'table', 'tr', 'td', 'th'))) { + $fill = false; + } + + // get the text to write + $txt = $param['txt']; + + if ($this->_isAfterFloat) { + $txt = ltrim($txt); + $this->_isAfterFloat = false; + } + + $txt = str_replace('[[page_nb]]', $this->pdf->getMyAliasNbPages(), $txt); + $txt = str_replace('[[page_cu]]', $this->pdf->getMyNumPage($this->_page), $txt); + + if ($this->parsingCss->value['text-transform']!='none') { + if ($this->parsingCss->value['text-transform']=='capitalize') + $txt = ucwords($txt); + else if ($this->parsingCss->value['text-transform']=='uppercase') + $txt = strtoupper($txt); + else if ($this->parsingCss->value['text-transform']=='lowercase') + $txt = strtolower($txt); + } + + // size of the text + $h = 1.08*$this->parsingCss->value['font-size']; + $dh = $h*$this->parsingCss->value['mini-decal']; + $lh = $this->parsingCss->getLineHeight(); + + // identify the align + $align = 'L'; + if ($this->parsingCss->value['text-align']=='li_right') { + $w = $this->parsingCss->value['width']; + $align = 'R'; + } + + // calculate the width of each words, and of all the sentence + $w = 0; + $words = explode(' ', $txt); + foreach ($words as $k => $word) { + $words[$k] = array($word, $this->pdf->GetStringWidth($word)); + $w+= $words[$k][1]; + } + $space = $this->pdf->GetStringWidth(' '); + $w+= $space*(count($words)-1); + + // position in the text + $currPos = 0; + + // the bigger width of the text, after automatic break line + $maxX = 0; + + // position of the text + $x = $this->pdf->getX(); + $y = $this->pdf->getY(); + $dy = $this->_getElementY($lh); + + // margins + list($left, $right) = $this->_getMargins($y); + + // number of lines after automatic break line + $nb = 0; + + // while we have words, and the text does not fit on the line => we cut the sentence + while ($x+$w>$right && $x<$right+$space && count($words)) { + // adding words 1 by 1 to fit on the line + $i=0; + $old = array('', 0); + $str = $words[0]; + $add = false; + while (($x+$str[1])<$right) { + $i++; + $add = true; + + array_shift($words); + $old = $str; + + if (!count($words)) break; + $str[0].= ' '.$words[0][0]; + $str[1]+= $space+$words[0][1]; + } + $str = $old; + + // if nothing fit on the line, and if the first word does not fit on the line => the word is too long, we put it + if ($i==0 && (($left+$words[0][1])>=$right)) { + $str = $words[0]; + array_shift($words); + $i++; + $add = true; + } + $currPos+= ($currPos ? 1 : 0)+strlen($str[0]); + + // write the extract sentence that fit on the page + $wc = ($align=='L' ? $str[1] : $this->parsingCss->value['width']); + if ($right - $left<$wc) $wc = $right - $left; + + if (strlen($str[0])) { + $this->pdf->setXY($this->pdf->getX(), $y+$dh+$dy); + $this->pdf->Cell($wc, $h, $str[0], 0, 0, $align, $fill, $this->_isInLink); + $this->pdf->setXY($this->pdf->getX(), $y); + } + $this->_maxH = max($this->_maxH, $lh); + + // max width + $maxX = max($maxX, $this->pdf->getX()); + + // new position and new width for the "while" + $w-= $str[1]; + $y = $this->pdf->getY(); + $x = $this->pdf->getX(); + $dy = $this->_getElementY($lh); + + // if we have again words to write + if (count($words)) { + // remove the space at the end + if ($add) $w-= $space; + + // if we don't add any word, and if the first word is empty => useless space to skip + if (!$add && $words[0][0]==='') { + array_shift($words); + } + + // if it is just to calculate for one line => adding the number of words + if ($this->_isForOneLine) { + $this->_maxE+= $i; + $this->_maxX = max($this->_maxX, $maxX); + return null; + } + + // automatic line break + $this->_tag_open_BR(array('style' => ''), $currPos); + + // new position + $y = $this->pdf->getY(); + $x = $this->pdf->getX(); + $dy = $this->_getElementY($lh); + + // if the next line does not fit on the page => new page + if ($y + $h>=$this->pdf->getH() - $this->pdf->getbMargin()) { + if (!$this->_isInOverflow && !$this->_isInFooter) { + $this->_setNewPage(null, '', null, $currPos); + $y = $this->pdf->getY(); + $x = $this->pdf->getX(); + $dy = $this->_getElementY($lh); + } + } + + // if more than 10000 line => error + $nb++; + if ($nb>10000) { + $txt = ''; foreach ($words as $k => $word) $txt.= ($k ? ' ' : '').$word[0]; + throw new HTML2PDF_exception(2, array($txt, $right-$left, $w)); + } + + // new margins for the new line + list($left, $right) = $this->_getMargins($y); + } + } + + // if we have words after automatic cut, it is because they fit on the line => we write the text + if (count($words)) { + $txt = ''; foreach ($words as $k => $word) $txt.= ($k ? ' ' : '').$word[0]; + $w+= $this->pdf->getWordSpacing()*(count($words)); + $this->pdf->setXY($this->pdf->getX(), $y+$dh+$dy); + $this->pdf->Cell(($align=='L' ? $w : $this->parsingCss->value['width']), $h, $txt, 0, 0, $align, $fill, $this->_isInLink); + $this->pdf->setXY($this->pdf->getX(), $y); + $this->_maxH = max($this->_maxH, $lh); + $this->_maxE+= count($words); + } + + $maxX = max($maxX, $this->pdf->getX()); + $maxY = $this->pdf->getY()+$h; + + $this->_maxX = max($this->_maxX, $maxX); + $this->_maxY = max($this->_maxY, $maxY); + + return true; + } + + /** + * tag : BR + * mode : OPEN + * + * @param array $param + * @param integer $curr real position in the html parseur (if break line in the write of a text) + * @return boolean + */ + protected function _tag_open_BR($param, $curr = null) + { + if ($this->_isForOneLine) return false; + + $h = max($this->_maxH, $this->parsingCss->getLineHeight()); + + if ($this->_maxH==0) $this->_maxY = max($this->_maxY, $this->pdf->getY()+$h); + + $this->_makeBreakLine($h, $curr); + + $this->_maxH = 0; + $this->_maxE = 0; + + return true; + } + + /** + * tag : HR + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_HR($param) + { + if ($this->_isForOneLine) return false; + $oldAlign = $this->parsingCss->value['text-align']; + $this->parsingCss->value['text-align'] = 'left'; + + if ($this->_maxH) $this->_tag_open_BR($param); + + $fontSize = $this->parsingCss->value['font-size']; + $this->parsingCss->value['font-size']=$fontSize*0.5; $this->_tag_open_BR($param); + $this->parsingCss->value['font-size']=0; + + $param['style']['width'] = '100%'; + + $this->parsingCss->save(); + $this->parsingCss->value['height']=$this->parsingCss->ConvertToMM('1mm'); + + $this->parsingCss->analyse('hr', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + $h = $this->parsingCss->value['height']; + if ($h) $h-= $this->parsingCss->value['border']['t']['width']+$this->parsingCss->value['border']['b']['width']; + if ($h<=0) $h = $this->parsingCss->value['border']['t']['width']+$this->parsingCss->value['border']['b']['width']; + + $this->_drawRectangle($this->pdf->getX(), $this->pdf->getY(), $this->parsingCss->value['width'], $h, $this->parsingCss->value['border'], 0, 0, $this->parsingCss->value['background']); + $this->_maxH = $h; + + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + $this->_tag_open_BR($param); + + $this->parsingCss->value['font-size']=$fontSize*0.5; $this->_tag_open_BR($param); + $this->parsingCss->value['font-size']=$fontSize; + + $this->parsingCss->value['text-align'] = $oldAlign; + $this->_setNewPositionForNewLine(); + + return true; + } + + /** + * tag : B + * mode : OPEN + * + * @param array $param + * @param string $other + * @return boolean + */ + protected function _tag_open_B($param, $other = 'b') + { + $this->parsingCss->save(); + $this->parsingCss->value['font-bold'] = true; + $this->parsingCss->analyse($other, $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : STRONG + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_STRONG($param) + { + return $this->_tag_open_B($param, 'strong'); + } + + /** + * tag : B + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_B($param) + { + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : STRONG + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_STRONG($param) + { + return $this->_tag_close_B($param); + } + + /** + * tag : I + * mode : OPEN + * + * @param array $param + * @param string $other + * @return boolean + */ + protected function _tag_open_I($param, $other = 'i') + { + $this->parsingCss->save(); + $this->parsingCss->value['font-italic'] = true; + $this->parsingCss->analyse($other, $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : ADDRESS + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_ADDRESS($param) + { + return $this->_tag_open_I($param, 'address'); + } + + /** + * tag : CITE + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_CITE($param) + { + return $this->_tag_open_I($param, 'cite'); + } + + /** + * tag : EM + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_EM($param) + { + return $this->_tag_open_I($param, 'em'); + } + + /** + * tag : SAMP + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_SAMP($param) + { + return $this->_tag_open_I($param, 'samp'); + } + + /** + * tag : I + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_I($param) + { + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : ADDRESS + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_ADDRESS($param) + { + return $this->_tag_close_I($param); + } + + /** + * tag : CITE + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_CITE($param) + { + return $this->_tag_close_I($param); + } + + /** + * tag : EM + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_EM($param) + { + return $this->_tag_close_I($param); + } + + /** + * tag : SAMP + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_SAMP($param) + { + return $this->_tag_close_I($param); + } + + /** + * tag : S + * mode : OPEN + * + * @param array $param + * @param string $other + * @return boolean + */ + protected function _tag_open_S($param, $other = 's') + { + $this->parsingCss->save(); + $this->parsingCss->value['font-linethrough'] = true; + $this->parsingCss->analyse($other, $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : DEL + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_DEL($param) + { + return $this->_tag_open_S($param, 'del'); + } + + /** + * tag : S + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_S($param) + { + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : DEL + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_DEL($param) + { + return $this->_tag_close_S($param); + } + + /** + * tag : U + * mode : OPEN + * + * @param array $param + * @param string $other + * @return boolean + */ + protected function _tag_open_U($param, $other='u') + { + $this->parsingCss->save(); + $this->parsingCss->value['font-underline'] = true; + $this->parsingCss->analyse($other, $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : INS + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_INS($param) + { + return $this->_tag_open_U($param, 'ins'); + } + + /** + * tag : U + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_U($param) + { + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : INS + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_INS($param) + { + return $this->_tag_close_U($param); + } + + /** + * tag : A + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_A($param) + { + $this->_isInLink = str_replace('&amp;', '&', isset($param['href']) ? $param['href'] : ''); + + if (isset($param['name'])) { + $name = $param['name']; + if (!isset($this->_lstAnchor[$name])) $this->_lstAnchor[$name] = array($this->pdf->AddLink(), false); + + if (!$this->_lstAnchor[$name][1]) { + $this->_lstAnchor[$name][1] = true; + $this->pdf->SetLink($this->_lstAnchor[$name][0], -1, -1); + } + } + + if (preg_match('/^#([^#]+)$/isU', $this->_isInLink, $match)) { + $name = $match[1]; + if (!isset($this->_lstAnchor[$name])) $this->_lstAnchor[$name] = array($this->pdf->AddLink(), false); + + $this->_isInLink = $this->_lstAnchor[$name][0]; + } + + $this->parsingCss->save(); + $this->parsingCss->value['font-underline'] = true; + $this->parsingCss->value['color'] = array(20, 20, 250); + $this->parsingCss->analyse('a', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : A + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_A($param) + { + $this->_isInLink = ''; + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : H1 + * mode : OPEN + * + * @param array $param + * @param string $other + * @return boolean + */ + protected function _tag_open_H1($param, $other = 'h1') + { + if ($this->_isForOneLine) return false; + + if ($this->_maxH) $this->_tag_open_BR(array()); + $this->parsingCss->save(); + $this->parsingCss->value['font-bold'] = true; + + $size = array('h1' => '28px', 'h2' => '24px', 'h3' => '20px', 'h4' => '16px', 'h5' => '12px', 'h6' => '9px'); + $this->parsingCss->value['margin']['l'] = 0; + $this->parsingCss->value['margin']['r'] = 0; + $this->parsingCss->value['margin']['t'] = $this->parsingCss->ConvertToMM('16px'); + $this->parsingCss->value['margin']['b'] = $this->parsingCss->ConvertToMM('16px'); + $this->parsingCss->value['font-size'] = $this->parsingCss->ConvertToMM($size[$other]); + + $this->parsingCss->analyse($other, $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + $this->_setNewPositionForNewLine(); + + return true; + } + + /** + * tag : H2 + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_H2($param) + { + return $this->_tag_open_H1($param, 'h2'); + } + + /** + * tag : H3 + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_H3($param) + { + return $this->_tag_open_H1($param, 'h3'); + } + + /** + * tag : H4 + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_H4($param) + { + return $this->_tag_open_H1($param, 'h4'); + } + + /** + * tag : H5 + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_H5($param) + { + return $this->_tag_open_H1($param, 'h5'); + } + + /** + * tag : H6 + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_H6($param) + { + return $this->_tag_open_H1($param, 'h6'); + } + + /** + * tag : H1 + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_H1($param) + { + if ($this->_isForOneLine) return false; + + $this->_maxH+= $this->parsingCss->value['margin']['b']; + $h = max($this->_maxH, $this->parsingCss->getLineHeight()); + + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + $this->_makeBreakLine($h); + $this->_maxH = 0; + + $this->_maxY = max($this->_maxY, $this->pdf->getY()); + + return true; + } + + /** + * tag : H2 + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_H2($param) + { + return $this->_tag_close_H1($param); + } + + /** + * tag : H3 + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_H3($param) + { + return $this->_tag_close_H1($param); + } + + /** + * tag : H4 + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_H4($param) + { + return $this->_tag_close_H1($param); + } + + /** + * tag : H5 + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_H5($param) + { + return $this->_tag_close_H1($param); + } + + /** + * tag : H6 + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_H6($param) + { + return $this->_tag_close_H1($param); + } + + /** + * tag : SPAN + * mode : OPEN + * + * @param array $param + * @param string $other + * @return boolean + */ + protected function _tag_open_SPAN($param, $other = 'span') + { + $this->parsingCss->save(); + $this->parsingCss->analyse($other, $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : FONT + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_FONT($param) + { + return $this->_tag_open_SPAN($param, 'font'); + } + + /** + * tag : LABEL + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_LABEL($param) + { + return $this->_tag_open_SPAN($param, 'label'); + } + + /** + * tag : SPAN + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_SPAN($param) + { + $this->parsingCss->restorePosition(); + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : FONT + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_FONT($param) + { + return $this->_tag_close_SPAN($param); + } + + /** + * tag : LABEL + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_LABEL($param) + { + return $this->_tag_close_SPAN($param); + } + + /** + * tag : P + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_P($param) + { + if ($this->_isForOneLine) return false; + + if (!in_array($this->_previousCall, array('_tag_close_P', '_tag_close_UL'))) { + if ($this->_maxH) $this->_tag_open_BR(array()); + } + + $this->parsingCss->save(); + $this->parsingCss->analyse('p', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + // cancel the effects of the setPosition + $this->pdf->setXY($this->pdf->getX()-$this->parsingCss->value['margin']['l'], $this->pdf->getY()-$this->parsingCss->value['margin']['t']); + + list($mL, $mR) = $this->_getMargins($this->pdf->getY()); + $mR = $this->pdf->getW()-$mR; + $mL+= $this->parsingCss->value['margin']['l']+$this->parsingCss->value['padding']['l']; + $mR+= $this->parsingCss->value['margin']['r']+$this->parsingCss->value['padding']['r']; + $this->_saveMargin($mL, 0, $mR); + + if ($this->parsingCss->value['text-indent']>0) { + $y = $this->pdf->getY()+$this->parsingCss->value['margin']['t']+$this->parsingCss->value['padding']['t']; + $this->_pageMarges[floor($y*100)] = array($mL+$this->parsingCss->value['text-indent'], $this->pdf->getW()-$mR); + $y+= $this->parsingCss->getLineHeight()*0.1; + $this->_pageMarges[floor($y*100)] = array($mL, $this->pdf->getW()-$mR); + } + $this->_makeBreakLine($this->parsingCss->value['margin']['t']+$this->parsingCss->value['padding']['t']); + $this->_isInParagraph = array($mL, $mR); + return true; + } + + /** + * tag : P + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_P($param) + { + if ($this->_isForOneLine) return false; + + if ($this->_maxH) $this->_tag_open_BR(array()); + $this->_isInParagraph = false; + $this->_loadMargin(); + $h = $this->parsingCss->value['margin']['b']+$this->parsingCss->value['padding']['b']; + + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + $this->_makeBreakLine($h); + + return true; + } + + /** + * tag : PRE + * mode : OPEN + * + * @param array $param + * @param string $other + * @return boolean + */ + protected function _tag_open_PRE($param, $other = 'pre') + { + if ($other=='pre' && $this->_maxH) $this->_tag_open_BR(array()); + + $this->parsingCss->save(); + $this->parsingCss->value['font-family'] = 'courier'; + $this->parsingCss->analyse($other, $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + if ($other=='pre') return $this->_tag_open_DIV($param, $other); + + return true; + } + + /** + * tag : CODE + * mode : OPEN + * + * @param array $param + * @param string $other + * @return boolean + */ + protected function _tag_open_CODE($param) + { + return $this->_tag_open_PRE($param, 'code'); + } + + /** + * tag : PRE + * mode : CLOSE + * + * @param array $param + * @param string $other + * @return boolean + */ + protected function _tag_close_PRE($param, $other = 'pre') + { + if ($other=='pre') { + if ($this->_isForOneLine) return false; + + $this->_tag_close_DIV($param, $other); + $this->_tag_open_BR(array()); + } + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : CODE + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_CODE($param) + { + return $this->_tag_close_PRE($param, 'code'); + } + + /** + * tag : BIG + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_BIG($param) + { + $this->parsingCss->save(); + $this->parsingCss->value['mini-decal']-= $this->parsingCss->value['mini-size']*0.12; + $this->parsingCss->value['mini-size'] *= 1.2; + $this->parsingCss->analyse('big', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + return true; + } + + /** + * tag : BIG + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_BIG($param) + { + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : SMALL + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_SMALL($param) + { + $this->parsingCss->save(); + $this->parsingCss->value['mini-decal']+= $this->parsingCss->value['mini-size']*0.05; + $this->parsingCss->value['mini-size'] *= 0.82; + $this->parsingCss->analyse('small', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + return true; + } + + /** + * tag : SMALL + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_SMALL($param) + { + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : SUP + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_SUP($param) + { + $this->parsingCss->save(); + $this->parsingCss->value['mini-decal']-= $this->parsingCss->value['mini-size']*0.15; + $this->parsingCss->value['mini-size'] *= 0.75; + $this->parsingCss->analyse('sup', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : SUP + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_SUP($param) + { + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : SUB + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_SUB($param) + { + $this->parsingCss->save(); + $this->parsingCss->value['mini-decal']+= $this->parsingCss->value['mini-size']*0.15; + $this->parsingCss->value['mini-size'] *= 0.75; + $this->parsingCss->analyse('sub', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + return true; + } + + /** + * tag : SUB + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_SUB($param) + { + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : UL + * mode : OPEN + * + * @param array $param + * @param string $other + * @return boolean + */ + protected function _tag_open_UL($param, $other = 'ul') + { + if ($this->_isForOneLine) return false; + + if (!in_array($this->_previousCall, array('_tag_close_P', '_tag_close_UL'))) { + if ($this->_maxH) $this->_tag_open_BR(array()); + if (!count($this->_defList)) $this->_tag_open_BR(array()); + } + + if (!isset($param['style']['width'])) $param['allwidth'] = true; + $param['cellspacing'] = 0; + + // a list is like a table + $this->_tag_open_TABLE($param, $other); + + // add a level of list + $this->_listeAddLevel($other, $this->parsingCss->value['list-style-type'], $this->parsingCss->value['list-style-image']); + + return true; + } + + /** + * tag : OL + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_OL($param) + { + return $this->_tag_open_UL($param, 'ol'); + } + + /** + * tag : UL + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_UL($param) + { + if ($this->_isForOneLine) return false; + + $this->_tag_close_TABLE($param); + + $this->_listeDelLevel(); + + if (!$this->_subPart) { + if (!count($this->_defList)) $this->_tag_open_BR(array()); + } + + return true; + } + + /** + * tag : OL + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_OL($param) + { + return $this->_tag_close_UL($param); + } + + /** + * tag : LI + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_LI($param) + { + if ($this->_isForOneLine) return false; + + $this->_listeAddLi(); + + if (!isset($param['style']['width'])) $param['style']['width'] = '100%'; + + $paramPUCE = $param; + + $inf = $this->_listeGetLi(); + if ($inf[0]) { + $paramPUCE['style']['font-family'] = $inf[0]; + $paramPUCE['style']['text-align'] = 'li_right'; + $paramPUCE['style']['vertical-align'] = 'top'; + $paramPUCE['style']['width'] = $this->_listeGetWidth(); + $paramPUCE['style']['padding-right'] = $this->_listeGetPadding(); + $paramPUCE['txt'] = $inf[2]; + } else { + $paramPUCE['style']['text-align'] = 'li_right'; + $paramPUCE['style']['vertical-align'] = 'top'; + $paramPUCE['style']['width'] = $this->_listeGetWidth(); + $paramPUCE['style']['padding-right'] = $this->_listeGetPadding(); + $paramPUCE['src'] = $inf[2]; + $paramPUCE['sub_li'] = true; + } + + $this->_tag_open_TR($param, 'li'); + + $this->parsingCss->save(); + + // if small LI + if ($inf[1]) { + $this->parsingCss->value['mini-decal']+= $this->parsingCss->value['mini-size']*0.045; + $this->parsingCss->value['mini-size'] *= 0.75; + } + + // if we are in a sub html => prepare. Else : display + if ($this->_subPart) { + // TD for the puce + $tmpPos = $this->_tempPos; + $tmpLst1 = $this->parsingHtml->code[$tmpPos+1]; + $tmpLst2 = $this->parsingHtml->code[$tmpPos+2]; + $this->parsingHtml->code[$tmpPos+1] = array(); + $this->parsingHtml->code[$tmpPos+1]['name'] = (isset($paramPUCE['src'])) ? 'img' : 'write'; + $this->parsingHtml->code[$tmpPos+1]['param'] = $paramPUCE; unset($this->parsingHtml->code[$tmpPos+1]['param']['style']['width']); + $this->parsingHtml->code[$tmpPos+1]['close'] = 0; + $this->parsingHtml->code[$tmpPos+2] = array(); + $this->parsingHtml->code[$tmpPos+2]['name'] = 'li'; + $this->parsingHtml->code[$tmpPos+2]['param'] = $paramPUCE; + $this->parsingHtml->code[$tmpPos+2]['close'] = 1; + $this->_tag_open_TD($paramPUCE, 'li_sub'); + $this->_tag_close_TD($param); + $this->_tempPos = $tmpPos; + $this->parsingHtml->code[$tmpPos+1] = $tmpLst1; + $this->parsingHtml->code[$tmpPos+2] = $tmpLst2; + } else { + // TD for the puce + $this->_tag_open_TD($paramPUCE, 'li_sub'); + unset($paramPUCE['style']['width']); + if (isset($paramPUCE['src'])) $this->_tag_open_IMG($paramPUCE); + else $this->_tag_open_WRITE($paramPUCE); + $this->_tag_close_TD($paramPUCE); + } + $this->parsingCss->load(); + + + // TD for the content + $this->_tag_open_TD($param, 'li'); + + return true; + } + + /** + * tag : LI + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_LI($param) + { + if ($this->_isForOneLine) return false; + + $this->_tag_close_TD($param); + + $this->_tag_close_TR($param); + + return true; + } + + /** + * tag : TBODY + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_TBODY($param) + { + if ($this->_isForOneLine) return false; + + $this->parsingCss->save(); + $this->parsingCss->analyse('tbody', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : TBODY + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_TBODY($param) + { + if ($this->_isForOneLine) return false; + + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : THEAD + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_THEAD($param) + { + if ($this->_isForOneLine) return false; + + $this->parsingCss->save(); + $this->parsingCss->analyse('thead', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + // if we are in a sub part, save the number of the first TR in the thead + if ($this->_subPart) { + HTML2PDF::$_tables[$param['num']]['thead']['tr'][0] = HTML2PDF::$_tables[$param['num']]['tr_curr']; + HTML2PDF::$_tables[$param['num']]['thead']['code'] = array(); + for ($pos=$this->_tempPos; $pos<count($this->parsingHtml->code); $pos++) { + $action = $this->parsingHtml->code[$pos]; + if (strtolower($action['name'])=='thead') $action['name'] = 'thead_sub'; + HTML2PDF::$_tables[$param['num']]['thead']['code'][] = $action; + if (strtolower($action['name'])=='thead_sub' && $action['close']) break; + } + } else { + $level = $this->parsingHtml->getLevel($this->_parsePos); + $this->_parsePos+= count($level); + HTML2PDF::$_tables[$param['num']]['tr_curr']+= count(HTML2PDF::$_tables[$param['num']]['thead']['tr']); + } + + return true; + } + + /** + * tag : THEAD + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_THEAD($param) + { + if ($this->_isForOneLine) return false; + + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + // if we are in a sub HTM, construct the list of the TR in the thead + if ($this->_subPart) { + $min = HTML2PDF::$_tables[$param['num']]['thead']['tr'][0]; + $max = HTML2PDF::$_tables[$param['num']]['tr_curr']-1; + HTML2PDF::$_tables[$param['num']]['thead']['tr'] = range($min, $max); + } + + return true; + } + + /** + * tag : TFOOT + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_TFOOT($param) + { + if ($this->_isForOneLine) return false; + + $this->parsingCss->save(); + $this->parsingCss->analyse('tfoot', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + // if we are in a sub part, save the number of the first TR in the tfoot + if ($this->_subPart) { + HTML2PDF::$_tables[$param['num']]['tfoot']['tr'][0] = HTML2PDF::$_tables[$param['num']]['tr_curr']; + HTML2PDF::$_tables[$param['num']]['tfoot']['code'] = array(); + for ($pos=$this->_tempPos; $pos<count($this->parsingHtml->code); $pos++) { + $action = $this->parsingHtml->code[$pos]; + if (strtolower($action['name'])=='tfoot') $action['name'] = 'tfoot_sub'; + HTML2PDF::$_tables[$param['num']]['tfoot']['code'][] = $action; + if (strtolower($action['name'])=='tfoot_sub' && $action['close']) break; + } + } else { + $level = $this->parsingHtml->getLevel($this->_parsePos); + $this->_parsePos+= count($level); + HTML2PDF::$_tables[$param['num']]['tr_curr']+= count(HTML2PDF::$_tables[$param['num']]['tfoot']['tr']); + } + + return true; + } + + /** + * tag : TFOOT + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_TFOOT($param) + { + if ($this->_isForOneLine) return false; + + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + // if we are in a sub HTM, construct the list of the TR in the tfoot + if ($this->_subPart) { + $min = HTML2PDF::$_tables[$param['num']]['tfoot']['tr'][0]; + $max = HTML2PDF::$_tables[$param['num']]['tr_curr']-1; + HTML2PDF::$_tables[$param['num']]['tfoot']['tr'] = range($min, $max); + } + + return true; + } + + /** + * It is not a real TAG, does not use it ! + * + * @param array $param + * @return boolean + */ + protected function _tag_open_THEAD_SUB($param) + { + if ($this->_isForOneLine) return false; + + $this->parsingCss->save(); + $this->parsingCss->analyse('thead', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * It is not a real TAG, does not use it ! + * + * @param array $param + * @return boolean + */ + protected function _tag_close_THEAD_SUB($param) + { + if ($this->_isForOneLine) return false; + + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * It is not a real TAG, does not use it ! + * + * @param array $param + * @return boolean + */ + protected function _tag_open_TFOOT_SUB($param) + { + if ($this->_isForOneLine) return false; + + $this->parsingCss->save(); + $this->parsingCss->analyse('tfoot', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * It is not a real TAG, does not use it ! + * + * @param array $param + * @return boolean + */ + protected function _tag_close_TFOOT_SUB($param) + { + if ($this->_isForOneLine) return false; + + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : FORM + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_FORM($param) + { + $this->parsingCss->save(); + $this->parsingCss->analyse('form', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + $this->pdf->setFormDefaultProp( + array( + 'lineWidth'=>1, + 'borderStyle'=>'solid', + 'fillColor'=>array(220, 220, 255), + 'strokeColor'=>array(128, 128, 200) + ) + ); + + $this->_isInForm = isset($param['action']) ? $param['action'] : ''; + + return true; + } + + /** + * tag : FORM + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_FORM($param) + { + $this->_isInForm = false; + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : TABLE + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_TABLE($param, $other = 'table') + { + if ($this->_maxH) { + if ($this->_isForOneLine) return false; + $this->_tag_open_BR(array()); + } + + if ($this->_isForOneLine) { + $this->_maxX = $this->pdf->getW() - $this->pdf->getlMargin() - $this->pdf->getrMargin(); + return false; + } + + $this->_maxH = 0; + + $alignObject = isset($param['align']) ? strtolower($param['align']) : 'left'; + if (isset($param['align'])) unset($param['align']); + if (!in_array($alignObject, array('left', 'center', 'right'))) $alignObject = 'left'; + + $this->parsingCss->save(); + $this->parsingCss->analyse($other, $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + if ($this->parsingCss->value['margin-auto']) $alignObject = 'center'; + + // collapse table ? + $collapse = false; + if ($other=='table') { + $collapse = isset($this->parsingCss->value['border']['collapse']) ? $this->parsingCss->value['border']['collapse'] : false; + } + + // if collapse => no borders for the table, only for TD + if ($collapse) { + $param['style']['border'] = 'none'; + $param['cellspacing'] = 0; + $none = $this->parsingCss->readBorder('none'); + $this->parsingCss->value['border']['t'] = $none; + $this->parsingCss->value['border']['r'] = $none; + $this->parsingCss->value['border']['b'] = $none; + $this->parsingCss->value['border']['l'] = $none; + } + + // if we are in a SUB html => prepare the properties of the table + if ($this->_subPart) { + if ($this->_debugActif) $this->_DEBUG_add('Table n'.$param['num'], true); + HTML2PDF::$_tables[$param['num']] = array(); + HTML2PDF::$_tables[$param['num']]['border'] = isset($param['border']) ? $this->parsingCss->readBorder($param['border']) : null; + HTML2PDF::$_tables[$param['num']]['cellpadding'] = $this->parsingCss->ConvertToMM(isset($param['cellpadding']) ? $param['cellpadding'] : '1px'); + HTML2PDF::$_tables[$param['num']]['cellspacing'] = $this->parsingCss->ConvertToMM(isset($param['cellspacing']) ? $param['cellspacing'] : '2px'); + HTML2PDF::$_tables[$param['num']]['cases'] = array(); // properties of each TR/TD + HTML2PDF::$_tables[$param['num']]['corr'] = array(); // link between TR/TD and colspan/rowspan + HTML2PDF::$_tables[$param['num']]['corr_x'] = 0; // position in 'cases' + HTML2PDF::$_tables[$param['num']]['corr_y'] = 0; // position in 'cases' + HTML2PDF::$_tables[$param['num']]['td_curr'] = 0; // current column + HTML2PDF::$_tables[$param['num']]['tr_curr'] = 0; // current row + HTML2PDF::$_tables[$param['num']]['curr_x'] = $this->pdf->getX(); + HTML2PDF::$_tables[$param['num']]['curr_y'] = $this->pdf->getY(); + HTML2PDF::$_tables[$param['num']]['width'] = 0; // global width + HTML2PDF::$_tables[$param['num']]['height'] = 0; // global height + HTML2PDF::$_tables[$param['num']]['align'] = $alignObject; + HTML2PDF::$_tables[$param['num']]['marge'] = array(); + HTML2PDF::$_tables[$param['num']]['marge']['t'] = $this->parsingCss->value['padding']['t']+$this->parsingCss->value['border']['t']['width']+HTML2PDF::$_tables[$param['num']]['cellspacing']*0.5; + HTML2PDF::$_tables[$param['num']]['marge']['r'] = $this->parsingCss->value['padding']['r']+$this->parsingCss->value['border']['r']['width']+HTML2PDF::$_tables[$param['num']]['cellspacing']*0.5; + HTML2PDF::$_tables[$param['num']]['marge']['b'] = $this->parsingCss->value['padding']['b']+$this->parsingCss->value['border']['b']['width']+HTML2PDF::$_tables[$param['num']]['cellspacing']*0.5; + HTML2PDF::$_tables[$param['num']]['marge']['l'] = $this->parsingCss->value['padding']['l']+$this->parsingCss->value['border']['l']['width']+HTML2PDF::$_tables[$param['num']]['cellspacing']*0.5; + HTML2PDF::$_tables[$param['num']]['page'] = 0; // number of pages + HTML2PDF::$_tables[$param['num']]['new_page'] = true; // flag : new page for the current TR + HTML2PDF::$_tables[$param['num']]['style_value'] = null; // CSS style of the table + HTML2PDF::$_tables[$param['num']]['thead'] = array(); // properties on the thead + HTML2PDF::$_tables[$param['num']]['tfoot'] = array(); // properties on the tfoot + HTML2PDF::$_tables[$param['num']]['thead']['tr'] = array(); // list of the TRs in the thead + HTML2PDF::$_tables[$param['num']]['tfoot']['tr'] = array(); // list of the TRs in the tfoot + HTML2PDF::$_tables[$param['num']]['thead']['height'] = 0; // thead height + HTML2PDF::$_tables[$param['num']]['tfoot']['height'] = 0; // tfoot height + HTML2PDF::$_tables[$param['num']]['thead']['code'] = array(); // HTML content of the thead + HTML2PDF::$_tables[$param['num']]['tfoot']['code'] = array(); // HTML content of the tfoot + HTML2PDF::$_tables[$param['num']]['cols'] = array(); // properties of the COLs + + $this->_saveMargin($this->pdf->getlMargin(), $this->pdf->gettMargin(), $this->pdf->getrMargin()); + + $this->parsingCss->value['width']-= HTML2PDF::$_tables[$param['num']]['marge']['l'] + HTML2PDF::$_tables[$param['num']]['marge']['r']; + } else { + // we start from the first page and the first page of the table + HTML2PDF::$_tables[$param['num']]['page'] = 0; + HTML2PDF::$_tables[$param['num']]['td_curr'] = 0; + HTML2PDF::$_tables[$param['num']]['tr_curr'] = 0; + HTML2PDF::$_tables[$param['num']]['td_x'] = HTML2PDF::$_tables[$param['num']]['marge']['l']+HTML2PDF::$_tables[$param['num']]['curr_x']; + HTML2PDF::$_tables[$param['num']]['td_y'] = HTML2PDF::$_tables[$param['num']]['marge']['t']+HTML2PDF::$_tables[$param['num']]['curr_y']; + + // draw the borders/background of the first page/part of the table + $this->_drawRectangle( + HTML2PDF::$_tables[$param['num']]['curr_x'], + HTML2PDF::$_tables[$param['num']]['curr_y'], + HTML2PDF::$_tables[$param['num']]['width'], + isset(HTML2PDF::$_tables[$param['num']]['height'][0]) ? HTML2PDF::$_tables[$param['num']]['height'][0] : null, + $this->parsingCss->value['border'], + $this->parsingCss->value['padding'], + 0, + $this->parsingCss->value['background'] + ); + + HTML2PDF::$_tables[$param['num']]['style_value'] = $this->parsingCss->value; + } + + return true; + } + + /** + * tag : TABLE + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_TABLE($param) + { + if ($this->_isForOneLine) return false; + + $this->_maxH = 0; + + // if we are in a sub HTML + if ($this->_subPart) { + // calculate the size of each case + $this->_calculateTableCellSize(HTML2PDF::$_tables[$param['num']]['cases'], HTML2PDF::$_tables[$param['num']]['corr']); + + // calculate the height of the thead and the tfoot + $lst = array('thead', 'tfoot'); + foreach ($lst as $mode) { + HTML2PDF::$_tables[$param['num']][$mode]['height'] = 0; + foreach (HTML2PDF::$_tables[$param['num']][$mode]['tr'] as $tr) { + // hauteur de la ligne tr + $h = 0; + for ($i=0; $i<count(HTML2PDF::$_tables[$param['num']]['cases'][$tr]); $i++) + if (HTML2PDF::$_tables[$param['num']]['cases'][$tr][$i]['rowspan']==1) + $h = max($h, HTML2PDF::$_tables[$param['num']]['cases'][$tr][$i]['h']); + HTML2PDF::$_tables[$param['num']][$mode]['height']+= $h; + } + } + + // calculate the width of the table + HTML2PDF::$_tables[$param['num']]['width'] = HTML2PDF::$_tables[$param['num']]['marge']['l'] + HTML2PDF::$_tables[$param['num']]['marge']['r']; + if (isset(HTML2PDF::$_tables[$param['num']]['cases'][0])) { + foreach (HTML2PDF::$_tables[$param['num']]['cases'][0] as $case) { + HTML2PDF::$_tables[$param['num']]['width']+= $case['w']; + } + } + + // X position of the table + $old = $this->parsingCss->getOldValues(); + $parentWidth = $old['width'] ? $old['width'] : $this->pdf->getW() - $this->pdf->getlMargin() - $this->pdf->getrMargin(); + $x = HTML2PDF::$_tables[$param['num']]['curr_x']; + $w = HTML2PDF::$_tables[$param['num']]['width']; + if ($parentWidth>$w) { + if (HTML2PDF::$_tables[$param['num']]['align']=='center') + $x = $x + ($parentWidth-$w)*0.5; + else if (HTML2PDF::$_tables[$param['num']]['align']=='right') + $x = $x + $parentWidth-$w; + + HTML2PDF::$_tables[$param['num']]['curr_x'] = $x; + } + + // calculate the height of the table + HTML2PDF::$_tables[$param['num']]['height'] = array(); + + // minimum of the height because of margins, and of the thead and tfoot height + $h0 = HTML2PDF::$_tables[$param['num']]['marge']['t'] + HTML2PDF::$_tables[$param['num']]['marge']['b']; + $h0+= HTML2PDF::$_tables[$param['num']]['thead']['height'] + HTML2PDF::$_tables[$param['num']]['tfoot']['height']; + + // max height of the page + $max = $this->pdf->getH() - $this->pdf->getbMargin(); + + // current position on the page + $y = HTML2PDF::$_tables[$param['num']]['curr_y']; + $height = $h0; + + // we get the height of each line + for ($k=0; $k<count(HTML2PDF::$_tables[$param['num']]['cases']); $k++) { + + // if it is a TR of the thead or of the tfoot => skip + if (in_array($k, HTML2PDF::$_tables[$param['num']]['thead']['tr'])) continue; + if (in_array($k, HTML2PDF::$_tables[$param['num']]['tfoot']['tr'])) continue; + + // height of the line + $th = 0; + $h = 0; + for ($i=0; $i<count(HTML2PDF::$_tables[$param['num']]['cases'][$k]); $i++) { + $h = max($h, HTML2PDF::$_tables[$param['num']]['cases'][$k][$i]['h']); + + if (HTML2PDF::$_tables[$param['num']]['cases'][$k][$i]['rowspan']==1) + $th = max($th, HTML2PDF::$_tables[$param['num']]['cases'][$k][$i]['h']); + } + + // if the row does not fit on the page => new page + if ($y+$h+$height>$max) { + if ($height==$h0) $height = null; + HTML2PDF::$_tables[$param['num']]['height'][] = $height; + $height = $h0; + $y = $this->_margeTop; + } + $height+= $th; + } + + // if ther is a height at the end, add it + if ($height!=$h0 || $k==0) HTML2PDF::$_tables[$param['num']]['height'][] = $height; + } else { + // if we have tfoor, draw it + if (count(HTML2PDF::$_tables[$param['num']]['tfoot']['code'])) { + $tmpTR = HTML2PDF::$_tables[$param['num']]['tr_curr']; + $tmpTD = HTML2PDF::$_tables[$param['num']]['td_curr']; + $oldParsePos = $this->_parsePos; + $oldParseCode = $this->parsingHtml->code; + + HTML2PDF::$_tables[$param['num']]['tr_curr'] = HTML2PDF::$_tables[$param['num']]['tfoot']['tr'][0]; + HTML2PDF::$_tables[$param['num']]['td_curr'] = 0; + $this->_parsePos = 0; + $this->parsingHtml->code = HTML2PDF::$_tables[$param['num']]['tfoot']['code']; + $this->_isInTfoot = true; + $this->_makeHTMLcode(); + $this->_isInTfoot = false; + + $this->_parsePos = $oldParsePos; + $this->parsingHtml->code = $oldParseCode; + HTML2PDF::$_tables[$param['num']]['tr_curr'] = $tmpTR; + HTML2PDF::$_tables[$param['num']]['td_curr'] = $tmpTD; + } + + // get the positions of the end of the table + $x = HTML2PDF::$_tables[$param['num']]['curr_x'] + HTML2PDF::$_tables[$param['num']]['width']; + if (count(HTML2PDF::$_tables[$param['num']]['height'])>1) + $y = $this->_margeTop+HTML2PDF::$_tables[$param['num']]['height'][count(HTML2PDF::$_tables[$param['num']]['height'])-1]; + else if (count(HTML2PDF::$_tables[$param['num']]['height'])==1) + $y = HTML2PDF::$_tables[$param['num']]['curr_y']+HTML2PDF::$_tables[$param['num']]['height'][count(HTML2PDF::$_tables[$param['num']]['height'])-1]; + else + $y = HTML2PDF::$_tables[$param['num']]['curr_y']; + + $this->_maxX = max($this->_maxX, $x); + $this->_maxY = max($this->_maxY, $y); + + $this->pdf->setXY($this->pdf->getlMargin(), $y); + + $this->_loadMargin(); + + if ($this->_debugActif) $this->_DEBUG_add('Table '.$param['num'], false); + } + + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + + return true; + } + + /** + * tag : COL + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_COL($param) + { + $span = isset($param['span']) ? $param['span'] : 1; + for ($k=0; $k<$span; $k++) + HTML2PDF::$_tables[$param['num']]['cols'][] = $param; + } + + /** + * tag : COL + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_COL($param) + { + // there is nothing to do here + + return true; + } + + /** + * tag : TR + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_TR($param, $other = 'tr') + { + if ($this->_isForOneLine) return false; + + $this->_maxH = 0; + + $this->parsingCss->save(); + $this->parsingCss->analyse($other, $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + // position in the table + HTML2PDF::$_tables[$param['num']]['tr_curr']++; + HTML2PDF::$_tables[$param['num']]['td_curr']= 0; + + // if we are not in a sub html + if (!$this->_subPart) { + + // Y after the row + $ty=null; + for ($ii=0; $ii<count(HTML2PDF::$_tables[$param['num']]['cases'][HTML2PDF::$_tables[$param['num']]['tr_curr']-1]); $ii++) { + $ty = max($ty, HTML2PDF::$_tables[$param['num']]['cases'][HTML2PDF::$_tables[$param['num']]['tr_curr']-1][$ii]['h']); + } + + // height of the tfoot + $hfoot = HTML2PDF::$_tables[$param['num']]['tfoot']['height']; + + // if the line does not fit on the page => new page + if (!$this->_isInTfoot && HTML2PDF::$_tables[$param['num']]['td_y'] + HTML2PDF::$_tables[$param['num']]['marge']['b'] + $ty +$hfoot> $this->pdf->getH() - $this->pdf->getbMargin()) { + + // fi ther is a tfoot => draw it + if (count(HTML2PDF::$_tables[$param['num']]['tfoot']['code'])) { + $tmpTR = HTML2PDF::$_tables[$param['num']]['tr_curr']; + $tmpTD = HTML2PDF::$_tables[$param['num']]['td_curr']; + $oldParsePos = $this->_parsePos; + $oldParseCode = $this->parsingHtml->code; + + HTML2PDF::$_tables[$param['num']]['tr_curr'] = HTML2PDF::$_tables[$param['num']]['tfoot']['tr'][0]; + HTML2PDF::$_tables[$param['num']]['td_curr'] = 0; + $this->_parsePos = 0; + $this->parsingHtml->code = HTML2PDF::$_tables[$param['num']]['tfoot']['code']; + $this->_isInTfoot = true; + $this->_makeHTMLcode(); + $this->_isInTfoot = false; + + $this->_parsePos = $oldParsePos; + $this->parsingHtml->code = $oldParseCode; + HTML2PDF::$_tables[$param['num']]['tr_curr'] = $tmpTR; + HTML2PDF::$_tables[$param['num']]['td_curr'] = $tmpTD; + } + + // new page + HTML2PDF::$_tables[$param['num']]['new_page'] = true; + $this->_setNewPage(); + + // new position + HTML2PDF::$_tables[$param['num']]['page']++; + HTML2PDF::$_tables[$param['num']]['curr_y'] = $this->pdf->getY(); + HTML2PDF::$_tables[$param['num']]['td_y'] = HTML2PDF::$_tables[$param['num']]['curr_y']+HTML2PDF::$_tables[$param['num']]['marge']['t']; + + // if we have the height of the tbale on the page => draw borders and background + if (isset(HTML2PDF::$_tables[$param['num']]['height'][HTML2PDF::$_tables[$param['num']]['page']])) { + $old = $this->parsingCss->value; + $this->parsingCss->value = HTML2PDF::$_tables[$param['num']]['style_value']; + + $this->_drawRectangle( + HTML2PDF::$_tables[$param['num']]['curr_x'], + HTML2PDF::$_tables[$param['num']]['curr_y'], + HTML2PDF::$_tables[$param['num']]['width'], + HTML2PDF::$_tables[$param['num']]['height'][HTML2PDF::$_tables[$param['num']]['page']], + $this->parsingCss->value['border'], + $this->parsingCss->value['padding'], + HTML2PDF::$_tables[$param['num']]['cellspacing']*0.5, + $this->parsingCss->value['background'] + ); + + $this->parsingCss->value = $old; + } + } + + // if we are in a new page, and if we have a thead => draw it + if (HTML2PDF::$_tables[$param['num']]['new_page'] && count(HTML2PDF::$_tables[$param['num']]['thead']['code'])) { + HTML2PDF::$_tables[$param['num']]['new_page'] = false; + $tmpTR = HTML2PDF::$_tables[$param['num']]['tr_curr']; + $tmpTD = HTML2PDF::$_tables[$param['num']]['td_curr']; + $oldParsePos = $this->_parsePos; + $oldParseCode = $this->parsingHtml->code; + + HTML2PDF::$_tables[$param['num']]['tr_curr'] = HTML2PDF::$_tables[$param['num']]['thead']['tr'][0]; + HTML2PDF::$_tables[$param['num']]['td_curr'] = 0; + $this->_parsePos = 0; + $this->parsingHtml->code = HTML2PDF::$_tables[$param['num']]['thead']['code']; + $this->_isInThead = true; + $this->_makeHTMLcode(); + $this->_isInThead = false; + + $this->_parsePos = $oldParsePos; + $this->parsingHtml->code = $oldParseCode; + HTML2PDF::$_tables[$param['num']]['tr_curr'] = $tmpTR; + HTML2PDF::$_tables[$param['num']]['td_curr'] = $tmpTD; + HTML2PDF::$_tables[$param['num']]['new_page'] = true; + } + // else (in a sub HTML) + } else { + // prepare it + HTML2PDF::$_tables[$param['num']]['cases'][HTML2PDF::$_tables[$param['num']]['tr_curr']-1] = array(); + if (!isset(HTML2PDF::$_tables[$param['num']]['corr'][HTML2PDF::$_tables[$param['num']]['corr_y']])) + HTML2PDF::$_tables[$param['num']]['corr'][HTML2PDF::$_tables[$param['num']]['corr_y']] = array(); + + HTML2PDF::$_tables[$param['num']]['corr_x']=0; + while(isset(HTML2PDF::$_tables[$param['num']]['corr'][HTML2PDF::$_tables[$param['num']]['corr_y']][HTML2PDF::$_tables[$param['num']]['corr_x']])) + HTML2PDF::$_tables[$param['num']]['corr_x']++; + } + + return true; + } + + /** + * tag : TR + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_TR($param) + { + if ($this->_isForOneLine) return false; + + $this->_maxH = 0; + + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + // if we are not in a sub HTML + if (!$this->_subPart) { + + // Y of the current line + $ty=null; + for ($ii=0; $ii<count(HTML2PDF::$_tables[$param['num']]['cases'][HTML2PDF::$_tables[$param['num']]['tr_curr']-1]); $ii++) { + if (HTML2PDF::$_tables[$param['num']]['cases'][HTML2PDF::$_tables[$param['num']]['tr_curr']-1][$ii]['rowspan']==1) { + $ty = HTML2PDF::$_tables[$param['num']]['cases'][HTML2PDF::$_tables[$param['num']]['tr_curr']-1][$ii]['h']; + } + } + + // new position + HTML2PDF::$_tables[$param['num']]['td_x'] = HTML2PDF::$_tables[$param['num']]['curr_x']+HTML2PDF::$_tables[$param['num']]['marge']['l']; + HTML2PDF::$_tables[$param['num']]['td_y']+= $ty; + HTML2PDF::$_tables[$param['num']]['new_page'] = false; + } else { + HTML2PDF::$_tables[$param['num']]['corr_y']++; + } + + return true; + } + + /** + * tag : TD + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_TD($param, $other = 'td') + { + if ($this->_isForOneLine) return false; + + $this->_maxH = 0; + + $param['cellpadding'] = HTML2PDF::$_tables[$param['num']]['cellpadding'].'mm'; + $param['cellspacing'] = HTML2PDF::$_tables[$param['num']]['cellspacing'].'mm'; + + // specific style for LI + if ($other=='li') { + $specialLi = true; + } else { + $specialLi = false; + if ($other=='li_sub') { + $param['style']['border'] = 'none'; + $param['style']['background-color'] = 'transparent'; + $param['style']['background-image'] = 'none'; + $param['style']['background-position'] = ''; + $param['style']['background-repeat'] = ''; + $other = 'li'; + } + } + + // get the properties of the TD + $x = HTML2PDF::$_tables[$param['num']]['td_curr']; + $y = HTML2PDF::$_tables[$param['num']]['tr_curr']-1; + $colspan = isset($param['colspan']) ? $param['colspan'] : 1; + $rowspan = isset($param['rowspan']) ? $param['rowspan'] : 1; + + // flag for collapse table + $collapse = false; + + // specific traitment for TD and TH + if (in_array($other, array('td', 'th'))) { + // id of the column + $numCol = isset(HTML2PDF::$_tables[$param['num']]['cases'][$y][$x]['Xr']) ? HTML2PDF::$_tables[$param['num']]['cases'][$y][$x]['Xr'] : HTML2PDF::$_tables[$param['num']]['corr_x']; + + // we get the properties of the COL tag, if exist + if (isset(HTML2PDF::$_tables[$param['num']]['cols'][$numCol])) { + + $colParam = HTML2PDF::$_tables[$param['num']]['cols'][$numCol]; + + // for colspans => we get all the neede widths + $colParam['style']['width'] = array(); + for ($k=0; $k<$colspan; $k++) { + if (isset(HTML2PDF::$_tables[$param['num']]['cols'][$numCol+$k]['style']['width'])) { + $colParam['style']['width'][] = HTML2PDF::$_tables[$param['num']]['cols'][$numCol+$k]['style']['width']; + } + } + + // calculate the total width of the column + $total = ''; + $last = $this->parsingCss->getLastWidth(); + if (count($colParam['style']['width'])) { + $total = $colParam['style']['width'][0]; unset($colParam['style']['width'][0]); + foreach ($colParam['style']['width'] as $width) { + if (substr($total, -1)=='%' && substr($width, -1)=='%') + $total = (str_replace('%', '', $total)+str_replace('%', '', $width)).'%'; + else + $total = ($this->parsingCss->ConvertToMM($total, $last) + $this->parsingCss->ConvertToMM($width, $last)).'mm'; + } + } + + // get the final width + if ($total) { + $colParam['style']['width'] = $total; + } else { + unset($colParam['style']['width']); + } + + + // merge the styles of the COL and the TD + $param['style'] = array_merge($colParam['style'], $param['style']); + + // merge the class of the COL and the TD + if (isset($colParam['class'])) { + $param['class'] = $colParam['class'].(isset($param['class']) ? ' '.$param['class'] : ''); + } + } + + $collapse = isset($this->parsingCss->value['border']['collapse']) ? $this->parsingCss->value['border']['collapse'] : false; + } + + $this->parsingCss->save(); + + // legacy for TD and TH + $legacy = null; + if (in_array($other, array('td', 'th'))) { + $legacy = array(); + + $old = $this->parsingCss->getLastValue('background'); + if ($old && ($old['color'] || $old['image'])) + $legacy['background'] = $old; + + if (HTML2PDF::$_tables[$param['num']]['border']) { + $legacy['border'] = array(); + $legacy['border']['l'] = HTML2PDF::$_tables[$param['num']]['border']; + $legacy['border']['t'] = HTML2PDF::$_tables[$param['num']]['border']; + $legacy['border']['r'] = HTML2PDF::$_tables[$param['num']]['border']; + $legacy['border']['b'] = HTML2PDF::$_tables[$param['num']]['border']; + } + } + $return = $this->parsingCss->analyse($other, $param, $legacy); + + if ($specialLi) { + $this->parsingCss->value['width']-= $this->parsingCss->ConvertToMM($this->_listeGetWidth()); + $this->parsingCss->value['width']-= $this->parsingCss->ConvertToMM($this->_listeGetPadding()); + } + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + // if tale collapse => modify the borders + if ($collapse) { + if (!$this->_subPart) { + if ( + (HTML2PDF::$_tables[$param['num']]['tr_curr']>1 && !HTML2PDF::$_tables[$param['num']]['new_page']) || + (!$this->_isInThead && count(HTML2PDF::$_tables[$param['num']]['thead']['code'])) + ) { + $this->parsingCss->value['border']['t'] = $this->parsingCss->readBorder('none'); + } + } + + if (HTML2PDF::$_tables[$param['num']]['td_curr']>0) { + if (!$return) $this->parsingCss->value['width']+= $this->parsingCss->value['border']['l']['width']; + $this->parsingCss->value['border']['l'] = $this->parsingCss->readBorder('none'); + } + } + + // margins of the table + $marge = array(); + $marge['t'] = $this->parsingCss->value['padding']['t']+0.5*HTML2PDF::$_tables[$param['num']]['cellspacing']+$this->parsingCss->value['border']['t']['width']; + $marge['r'] = $this->parsingCss->value['padding']['r']+0.5*HTML2PDF::$_tables[$param['num']]['cellspacing']+$this->parsingCss->value['border']['r']['width']; + $marge['b'] = $this->parsingCss->value['padding']['b']+0.5*HTML2PDF::$_tables[$param['num']]['cellspacing']+$this->parsingCss->value['border']['b']['width']; + $marge['l'] = $this->parsingCss->value['padding']['l']+0.5*HTML2PDF::$_tables[$param['num']]['cellspacing']+$this->parsingCss->value['border']['l']['width']; + + // if we are in a sub HTML + if ($this->_subPart) { + // new position in the table + HTML2PDF::$_tables[$param['num']]['td_curr']++; + HTML2PDF::$_tables[$param['num']]['cases'][$y][$x] = array(); + HTML2PDF::$_tables[$param['num']]['cases'][$y][$x]['w'] = 0; + HTML2PDF::$_tables[$param['num']]['cases'][$y][$x]['h'] = 0; + HTML2PDF::$_tables[$param['num']]['cases'][$y][$x]['dw'] = 0; + HTML2PDF::$_tables[$param['num']]['cases'][$y][$x]['colspan'] = $colspan; + HTML2PDF::$_tables[$param['num']]['cases'][$y][$x]['rowspan'] = $rowspan; + HTML2PDF::$_tables[$param['num']]['cases'][$y][$x]['Xr'] = HTML2PDF::$_tables[$param['num']]['corr_x']; + HTML2PDF::$_tables[$param['num']]['cases'][$y][$x]['Yr'] = HTML2PDF::$_tables[$param['num']]['corr_y']; + + // prepare the mapping for rowspan and colspan + for ($j=0; $j<$rowspan; $j++) { + for ($i=0; $i<$colspan; $i++) { + HTML2PDF::$_tables[$param['num']]['corr'] + [HTML2PDF::$_tables[$param['num']]['corr_y']+$j] + [HTML2PDF::$_tables[$param['num']]['corr_x']+$i] = ($i+$j>0) ? '' : array($x,$y,$colspan,$rowspan); + } + } + HTML2PDF::$_tables[$param['num']]['corr_x']+= $colspan; + while (isset(HTML2PDF::$_tables[$param['num']]['corr'][HTML2PDF::$_tables[$param['num']]['corr_y']][HTML2PDF::$_tables[$param['num']]['corr_x']])) { + HTML2PDF::$_tables[$param['num']]['corr_x']++; + } + + // extract the content of the TD, and calculate his size + $level = $this->parsingHtml->getLevel($this->_tempPos); + $this->_createSubHTML($this->_subHtml); + $this->_subHtml->parsingHtml->code = $level; + $this->_subHtml->_makeHTMLcode(); + $this->_tempPos+= count($level); + } else { + // new position in the table + HTML2PDF::$_tables[$param['num']]['td_curr']++; + HTML2PDF::$_tables[$param['num']]['td_x']+= HTML2PDF::$_tables[$param['num']]['cases'][$y][$x]['dw']; + + // borders and background of the TD + $this->_drawRectangle( + HTML2PDF::$_tables[$param['num']]['td_x'], + HTML2PDF::$_tables[$param['num']]['td_y'], + HTML2PDF::$_tables[$param['num']]['cases'][$y][$x]['w'], + HTML2PDF::$_tables[$param['num']]['cases'][$y][$x]['h'], + $this->parsingCss->value['border'], + $this->parsingCss->value['padding'], + HTML2PDF::$_tables[$param['num']]['cellspacing']*0.5, + $this->parsingCss->value['background'] + ); + + $this->parsingCss->value['width'] = HTML2PDF::$_tables[$param['num']]['cases'][$y][$x]['w'] - $marge['l'] - $marge['r']; + + // marges = size of the TD + $mL = HTML2PDF::$_tables[$param['num']]['td_x']+$marge['l']; + $mR = $this->pdf->getW() - $mL - $this->parsingCss->value['width']; + $this->_saveMargin($mL, 0, $mR); + + // position of the content, from vertical-align + $hCorr = HTML2PDF::$_tables[$param['num']]['cases'][$y][$x]['h']; + $hReel = HTML2PDF::$_tables[$param['num']]['cases'][$y][$x]['real_h']; + switch($this->parsingCss->value['vertical-align']) + { + case 'bottom': + $yCorr = $hCorr-$hReel; + break; + + case 'middle': + $yCorr = ($hCorr-$hReel)*0.5; + break; + + case 'top': + default: + $yCorr = 0; + break; + } + + // position of the content + $x = HTML2PDF::$_tables[$param['num']]['td_x']+$marge['l']; + $y = HTML2PDF::$_tables[$param['num']]['td_y']+$marge['t']+$yCorr; + $this->pdf->setXY($x, $y); + $this->_setNewPositionForNewLine(); + } + + return true; + } + + /** + * tag : TD + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_TD($param) + { + if ($this->_isForOneLine) return false; + + $this->_maxH = 0; + + // get the margins + $marge = array(); + $marge['t'] = $this->parsingCss->value['padding']['t']+0.5*HTML2PDF::$_tables[$param['num']]['cellspacing']+$this->parsingCss->value['border']['t']['width']; + $marge['r'] = $this->parsingCss->value['padding']['r']+0.5*HTML2PDF::$_tables[$param['num']]['cellspacing']+$this->parsingCss->value['border']['r']['width']; + $marge['b'] = $this->parsingCss->value['padding']['b']+0.5*HTML2PDF::$_tables[$param['num']]['cellspacing']+$this->parsingCss->value['border']['b']['width']; + $marge['l'] = $this->parsingCss->value['padding']['l']+0.5*HTML2PDF::$_tables[$param['num']]['cellspacing']+$this->parsingCss->value['border']['l']['width']; + $marge['t']+= 0.001; + $marge['r']+= 0.001; + $marge['b']+= 0.001; + $marge['l']+= 0.001; + + // if we are in a sub HTML + if ($this->_subPart) { + + // it msut take only one page + if ($this->_testTdInOnepage && $this->_subHtml->pdf->getPage()>1) { + throw new HTML2PDF_exception(7); + } + + // size of the content of the TD + $w0 = $this->_subHtml->_maxX + $marge['l'] + $marge['r']; + $h0 = $this->_subHtml->_maxY + $marge['t'] + $marge['b']; + + // size from the CSS style + $w2 = $this->parsingCss->value['width'] + $marge['l'] + $marge['r']; + $h2 = $this->parsingCss->value['height'] + $marge['t'] + $marge['b']; + + // final size of the TD + HTML2PDF::$_tables[$param['num']]['cases'][HTML2PDF::$_tables[$param['num']]['tr_curr']-1][HTML2PDF::$_tables[$param['num']]['td_curr']-1]['w'] = max(array($w0, $w2)); + HTML2PDF::$_tables[$param['num']]['cases'][HTML2PDF::$_tables[$param['num']]['tr_curr']-1][HTML2PDF::$_tables[$param['num']]['td_curr']-1]['h'] = max(array($h0, $h2)); + + // real position of the content + HTML2PDF::$_tables[$param['num']]['cases'][HTML2PDF::$_tables[$param['num']]['tr_curr']-1][HTML2PDF::$_tables[$param['num']]['td_curr']-1]['real_w'] = $w0; + HTML2PDF::$_tables[$param['num']]['cases'][HTML2PDF::$_tables[$param['num']]['tr_curr']-1][HTML2PDF::$_tables[$param['num']]['td_curr']-1]['real_h'] = $h0; + + // destroy the sub HTML + $this->_destroySubHTML($this->_subHtml); + } else { + $this->_loadMargin(); + + HTML2PDF::$_tables[$param['num']]['td_x']+= HTML2PDF::$_tables[$param['num']]['cases'][HTML2PDF::$_tables[$param['num']]['tr_curr']-1][HTML2PDF::$_tables[$param['num']]['td_curr']-1]['w']; + } + + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + return true; + } + + + /** + * tag : TH + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_TH($param) + { + if ($this->_isForOneLine) return false; + + $this->parsingCss->save(); + $this->parsingCss->value['font-bold'] = true; + + $this->_tag_open_TD($param, 'th'); + + return true; + } + + /** + * tag : TH + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_TH($param) + { + if ($this->_isForOneLine) return false; + + $this->_tag_close_TD($param); + + $this->parsingCss->load(); + + return true; + } + + /** + * tag : IMG + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_IMG($param) + { + $src = str_replace('&amp;', '&', $param['src']); + + $this->parsingCss->save(); + $this->parsingCss->value['width'] = 0; + $this->parsingCss->value['height'] = 0; + $this->parsingCss->value['border'] = array('type' => 'none', 'width' => 0, 'color' => array(0, 0, 0)); + $this->parsingCss->value['background'] = array('color' => null, 'image' => null, 'position' => null, 'repeat' => null); + $this->parsingCss->analyse('img', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + $res = $this->_drawImage($src, isset($param['sub_li'])); + if (!$res) return $res; + + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + $this->_maxE++; + + return true; + } + + /** + * tag : SELECT + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_SELECT($param) + { + if (!isset($param['name'])) { + $param['name'] = 'champs_pdf_'.(count($this->_lstField)+1); + } + + $param['name'] = strtolower($param['name']); + + if (isset($this->_lstField[$param['name']])) { + $this->_lstField[$param['name']]++; + } else { + $this->_lstField[$param['name']] = 1; + } + + $this->parsingCss->save(); + $this->parsingCss->analyse('select', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + $this->_lstSelect = array(); + $this->_lstSelect['name'] = $param['name']; + $this->_lstSelect['multi'] = isset($param['multiple']) ? true : false; + $this->_lstSelect['size'] = isset($param['size']) ? $param['size'] : 1; + $this->_lstSelect['options'] = array(); + + if ($this->_lstSelect['multi'] && $this->_lstSelect['size']<3) $this->_lstSelect['size'] = 3; + + return true; + } + + /** + * tag : OPTION + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_OPTION($param) + { + // get the content of the option : it is the text of the option + $level = $this->parsingHtml->getLevel($this->_parsePos); + $this->_parsePos+= count($level); + $value = isset($param['value']) ? $param['value'] : 'aut_tag_open_opt_'.(count($this->_lstSelect)+1); + + $this->_lstSelect['options'][$value] = isset($level[0]['param']['txt']) ? $level[0]['param']['txt'] : ''; + + return true; + } + + /** + * tag : OPTION + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_OPTION($param) + { + // nothing to do here + + return true; + } + + /** + * tag : SELECT + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_SELECT() + { + // position of the select + $x = $this->pdf->getX(); + $y = $this->pdf->getY(); + $f = 1.08*$this->parsingCss->value['font-size']; + + // width + $w = $this->parsingCss->value['width']; if (!$w) $w = 50; + + // height (automatic) + $h = ($f*1.07*$this->_lstSelect['size'] + 1); + + $prop = $this->parsingCss->getFormStyle(); + + // multy select + if ($this->_lstSelect['multi']) { + $prop['multipleSelection'] = 'true'; + } + + + // single or multi select + if ($this->_lstSelect['size']>1) { + $this->pdf->ListBox($this->_lstSelect['name'], $w, $h, $this->_lstSelect['options'], $prop); + } else { + $this->pdf->ComboBox($this->_lstSelect['name'], $w, $h, $this->_lstSelect['options'], $prop); + } + + $this->_maxX = max($this->_maxX, $x+$w); + $this->_maxY = max($this->_maxY, $y+$h); + $this->_maxH = max($this->_maxH, $h); + $this->_maxE++; + $this->pdf->setX($x+$w); + + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + $this->_lstSelect = array(); + + return true; + } + + /** + * tag : TEXTAREA + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_TEXTAREA($param) + { + if (!isset($param['name'])) { + $param['name'] = 'champs_pdf_'.(count($this->_lstField)+1); + } + + $param['name'] = strtolower($param['name']); + + if (isset($this->_lstField[$param['name']])) { + $this->_lstField[$param['name']]++; + } else { + $this->_lstField[$param['name']] = 1; + } + + $this->parsingCss->save(); + $this->parsingCss->analyse('textarea', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + $x = $this->pdf->getX(); + $y = $this->pdf->getY(); + $fx = 0.65*$this->parsingCss->value['font-size']; + $fy = 1.08*$this->parsingCss->value['font-size']; + + // extract the content the textarea : value + $level = $this->parsingHtml->getLevel($this->_parsePos); + $this->_parsePos+= count($level); + + // automatic size, from cols and rows properties + $w = $fx*(isset($param['cols']) ? $param['cols'] : 22)+1; + $h = $fy*1.07*(isset($param['rows']) ? $param['rows'] : 3)+3; + + $prop = $this->parsingCss->getFormStyle(); + + $prop['multiline'] = true; + $prop['value'] = isset($level[0]['param']['txt']) ? $level[0]['param']['txt'] : ''; + + $this->pdf->TextField($param['name'], $w, $h, $prop, array(), $x, $y); + + $this->_maxX = max($this->_maxX, $x+$w); + $this->_maxY = max($this->_maxY, $y+$h); + $this->_maxH = max($this->_maxH, $h); + $this->_maxE++; + $this->pdf->setX($x+$w); + + return true; + } + + /** + * tag : TEXTAREA + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_TEXTAREA() + { + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : INPUT + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_INPUT($param) + { + if (!isset($param['name'])) $param['name'] = 'champs_pdf_'.(count($this->_lstField)+1); + if (!isset($param['value'])) $param['value'] = ''; + if (!isset($param['type'])) $param['type'] = 'text'; + + $param['name'] = strtolower($param['name']); + $param['type'] = strtolower($param['type']); + + // the type must be valid + if (!in_array($param['type'], array('text', 'checkbox', 'radio', 'hidden', 'submit', 'reset', 'button'))) { + $param['type'] = 'text'; + } + + if (isset($this->_lstField[$param['name']])) { + $this->_lstField[$param['name']]++; + } else { + $this->_lstField[$param['name']] = 1; + } + + $this->parsingCss->save(); + $this->parsingCss->analyse('input', $param); + $this->parsingCss->setPosition(); + $this->parsingCss->fontSet(); + + $name = $param['name']; + + $x = $this->pdf->getX(); + $y = $this->pdf->getY(); + $f = 1.08*$this->parsingCss->value['font-size']; + + $prop = $this->parsingCss->getFormStyle(); + + switch($param['type']) + { + case 'checkbox': + $w = 3; + $h = $w; + if ($h<$f) $y+= ($f-$h)*0.5; + $checked = (isset($param['checked']) && $param['checked']=='checked'); + $this->pdf->CheckBox($name, $w, $checked, $prop, array(), ($param['value'] ? $param['value'] : 'Yes'), $x, $y); + break; + + case 'radio': + $w = 3; + $h = $w; + if ($h<$f) $y+= ($f-$h)*0.5; + $checked = (isset($param['checked']) && $param['checked']=='checked'); + $this->pdf->RadioButton($name, $w, $prop, array(), ($param['value'] ? $param['value'] : 'On'), $checked, $x, $y); + break; + + case 'hidden': + $w = 0; + $h = 0; + $prop['value'] = $param['value']; + $this->pdf->TextField($name, $w, $h, $prop, array(), $x, $y); + break; + + case 'text': + $w = $this->parsingCss->value['width']; if (!$w) $w = 40; + $h = $f*1.3; + $prop['value'] = $param['value']; + $this->pdf->TextField($name, $w, $h, $prop, array(), $x, $y); + break; + + case 'submit': + $w = $this->parsingCss->value['width']; if (!$w) $w = 40; + $h = $this->parsingCss->value['height']; if (!$h) $h = $f*1.3; + $action = array('S'=>'SubmitForm', 'F'=>$this->_isInForm, 'Flags'=>array('ExportFormat')); + $this->pdf->Button($name, $w, $h, $param['value'], $action, $prop, array(), $x, $y); + break; + + case 'reset': + $w = $this->parsingCss->value['width']; if (!$w) $w = 40; + $h = $this->parsingCss->value['height']; if (!$h) $h = $f*1.3; + $action = array('S'=>'ResetForm'); + $this->pdf->Button($name, $w, $h, $param['value'], $action, $prop, array(), $x, $y); + break; + + case 'button': + $w = $this->parsingCss->value['width']; if (!$w) $w = 40; + $h = $this->parsingCss->value['height']; if (!$h) $h = $f*1.3; + $action = isset($param['onclick']) ? $param['onclick'] : ''; + $this->pdf->Button($name, $w, $h, $param['value'], $action, $prop, array(), $x, $y); + break; + + default: + $w = 0; + $h = 0; + break; + } + + $this->_maxX = max($this->_maxX, $x+$w); + $this->_maxY = max($this->_maxY, $y+$h); + $this->_maxH = max($this->_maxH, $h); + $this->_maxE++; + $this->pdf->setX($x+$w); + + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + + return true; + } + + /** + * tag : DRAW + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_DRAW($param) + { + if ($this->_isForOneLine) return false; + if ($this->_debugActif) $this->_DEBUG_add('DRAW', true); + + $this->parsingCss->save(); + $this->parsingCss->analyse('draw', $param); + $this->parsingCss->fontSet(); + + $alignObject = null; + if ($this->parsingCss->value['margin-auto']) $alignObject = 'center'; + + $overW = $this->parsingCss->value['width']; + $overH = $this->parsingCss->value['height']; + $this->parsingCss->value['old_maxX'] = $this->_maxX; + $this->parsingCss->value['old_maxY'] = $this->_maxY; + $this->parsingCss->value['old_maxH'] = $this->_maxH; + + $w = $this->parsingCss->value['width']; + $h = $this->parsingCss->value['height']; + + if (!$this->parsingCss->value['position']) { + if ( + $w < ($this->pdf->getW() - $this->pdf->getlMargin()-$this->pdf->getrMargin()) && + $this->pdf->getX() + $w>=($this->pdf->getW() - $this->pdf->getrMargin()) + ) + $this->_tag_open_BR(array()); + + if ( + ($h < ($this->pdf->getH() - $this->pdf->gettMargin()-$this->pdf->getbMargin())) && + ($this->pdf->getY() + $h>=($this->pdf->getH() - $this->pdf->getbMargin())) && + !$this->_isInOverflow + ) + $this->_setNewPage(); + + $old = $this->parsingCss->getOldValues(); + $parentWidth = $old['width'] ? $old['width'] : $this->pdf->getW() - $this->pdf->getlMargin() - $this->pdf->getrMargin(); + + if ($parentWidth>$w) { + if ($alignObject=='center') $this->pdf->setX($this->pdf->getX() + ($parentWidth-$w)*0.5); + else if ($alignObject=='right') $this->pdf->setX($this->pdf->getX() + $parentWidth-$w); + } + + $this->parsingCss->setPosition(); + } else { + $old = $this->parsingCss->getOldValues(); + $parentWidth = $old['width'] ? $old['width'] : $this->pdf->getW() - $this->pdf->getlMargin() - $this->pdf->getrMargin(); + + if ($parentWidth>$w) { + if ($alignObject=='center') $this->pdf->setX($this->pdf->getX() + ($parentWidth-$w)*0.5); + else if ($alignObject=='right') $this->pdf->setX($this->pdf->getX() + $parentWidth-$w); + } + + $this->parsingCss->setPosition(); + $this->_saveMax(); + $this->_maxX = 0; + $this->_maxY = 0; + $this->_maxH = 0; + $this->_maxE = 0; + } + + $this->_drawRectangle( + $this->parsingCss->value['x'], + $this->parsingCss->value['y'], + $this->parsingCss->value['width'], + $this->parsingCss->value['height'], + $this->parsingCss->value['border'], + $this->parsingCss->value['padding'], + 0, + $this->parsingCss->value['background'] + ); + + $marge = array(); + $marge['l'] = $this->parsingCss->value['border']['l']['width']; + $marge['r'] = $this->parsingCss->value['border']['r']['width']; + $marge['t'] = $this->parsingCss->value['border']['t']['width']; + $marge['b'] = $this->parsingCss->value['border']['b']['width']; + + $this->parsingCss->value['width'] -= $marge['l']+$marge['r']; + $this->parsingCss->value['height']-= $marge['t']+$marge['b']; + + $overW-= $marge['l']+$marge['r']; + $overH-= $marge['t']+$marge['b']; + + // clipping to draw only in the size opf the DRAW tag + $this->pdf->clippingPathStart( + $this->parsingCss->value['x']+$marge['l'], + $this->parsingCss->value['y']+$marge['t'], + $this->parsingCss->value['width'], + $this->parsingCss->value['height'] + ); + + // left and right of the DRAW tag + $mL = $this->parsingCss->value['x']+$marge['l']; + $mR = $this->pdf->getW() - $mL - $overW; + + // position of the DRAW tag + $x = $this->parsingCss->value['x']+$marge['l']; + $y = $this->parsingCss->value['y']+$marge['t']; + + // prepare the drawing area + $this->_saveMargin($mL, 0, $mR); + $this->pdf->setXY($x, $y); + + // we are in a draw tag + $this->_isInDraw = array( + 'x' => $x, + 'y' => $y, + 'w' => $overW, + 'h' => $overH, + ); + + // init the translate matrix : (0,0) => ($x, $y) + $this->pdf->doTransform(array(1,0,0,1,$x,$y)); + $this->pdf->SetAlpha(1.); + return true; + } + + /** + * tag : DRAW + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_DRAW($param) + { + if ($this->_isForOneLine) return false; + + $this->pdf->SetAlpha(1.); + $this->pdf->undoTransform(); + $this->pdf->clippingPathStop(); + + $this->_maxX = $this->parsingCss->value['old_maxX']; + $this->_maxY = $this->parsingCss->value['old_maxY']; + $this->_maxH = $this->parsingCss->value['old_maxH']; + + $marge = array(); + $marge['l'] = $this->parsingCss->value['border']['l']['width']; + $marge['r'] = $this->parsingCss->value['border']['r']['width']; + $marge['t'] = $this->parsingCss->value['border']['t']['width']; + $marge['b'] = $this->parsingCss->value['border']['b']['width']; + + $x = $this->parsingCss->value['x']; + $y = $this->parsingCss->value['y']; + $w = $this->parsingCss->value['width']+$marge['l']+$marge['r']; + $h = $this->parsingCss->value['height']+$marge['t']+$marge['b']; + + if ($this->parsingCss->value['position']!='absolute') { + $this->pdf->setXY($x+$w, $y); + + $this->_maxX = max($this->_maxX, $x+$w); + $this->_maxY = max($this->_maxY, $y+$h); + $this->_maxH = max($this->_maxH, $h); + $this->_maxE++; + } else { + // position + $this->pdf->setXY($this->parsingCss->value['xc'], $this->parsingCss->value['yc']); + + $this->_loadMax(); + } + + $block = ($this->parsingCss->value['display']!='inline' && $this->parsingCss->value['position']!='absolute'); + + $this->parsingCss->load(); + $this->parsingCss->fontSet(); + $this->_loadMargin(); + + if ($block) $this->_tag_open_BR(array()); + if ($this->_debugActif) $this->_DEBUG_add('DRAW', false); + + $this->_isInDraw = null; + + return true; + } + + /** + * tag : LINE + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_LINE($param) + { + if (!$this->_isInDraw) throw new HTML2PDF_exception(8, 'LINE'); + + $this->pdf->doTransform(isset($param['transform']) ? $this->_prepareTransform($param['transform']) : null); + $this->parsingCss->save(); + $styles = $this->parsingCss->getSvgStyle('path', $param); + $styles['fill'] = null; + $style = $this->pdf->svgSetStyle($styles); + + $x1 = isset($param['x1']) ? $this->parsingCss->ConvertToMM($param['x1'], $this->_isInDraw['w']) : 0.; + $y1 = isset($param['y1']) ? $this->parsingCss->ConvertToMM($param['y1'], $this->_isInDraw['h']) : 0.; + $x2 = isset($param['x2']) ? $this->parsingCss->ConvertToMM($param['x2'], $this->_isInDraw['w']) : 0.; + $y2 = isset($param['y2']) ? $this->parsingCss->ConvertToMM($param['y2'], $this->_isInDraw['h']) : 0.; + $this->pdf->svgLine($x1, $y1, $x2, $y2); + + $this->pdf->undoTransform(); + $this->parsingCss->load(); + } + + /** + * tag : RECT + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_RECT($param) + { + if (!$this->_isInDraw) throw new HTML2PDF_exception(8, 'RECT'); + + $this->pdf->doTransform(isset($param['transform']) ? $this->_prepareTransform($param['transform']) : null); + $this->parsingCss->save(); + $styles = $this->parsingCss->getSvgStyle('path', $param); + $style = $this->pdf->svgSetStyle($styles); + + $x = isset($param['x']) ? $this->parsingCss->ConvertToMM($param['x'], $this->_isInDraw['w']) : 0.; + $y = isset($param['y']) ? $this->parsingCss->ConvertToMM($param['y'], $this->_isInDraw['h']) : 0.; + $w = isset($param['w']) ? $this->parsingCss->ConvertToMM($param['w'], $this->_isInDraw['w']) : 0.; + $h = isset($param['h']) ? $this->parsingCss->ConvertToMM($param['h'], $this->_isInDraw['h']) : 0.; + + $this->pdf->svgRect($x, $y, $w, $h, $style); + + $this->pdf->undoTransform(); + $this->parsingCss->load(); + } + + /** + * tag : CIRCLE + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_CIRCLE($param) + { + if (!$this->_isInDraw) throw new HTML2PDF_exception(8, 'CIRCLE'); + + $this->pdf->doTransform(isset($param['transform']) ? $this->_prepareTransform($param['transform']) : null); + $this->parsingCss->save(); + $styles = $this->parsingCss->getSvgStyle('path', $param); + $style = $this->pdf->svgSetStyle($styles); + + $cx = isset($param['cx']) ? $this->parsingCss->ConvertToMM($param['cx'], $this->_isInDraw['w']) : 0.; + $cy = isset($param['cy']) ? $this->parsingCss->ConvertToMM($param['cy'], $this->_isInDraw['h']) : 0.; + $r = isset($param['r']) ? $this->parsingCss->ConvertToMM($param['r'], $this->_isInDraw['w']) : 0.; + $this->pdf->svgEllipse($cx, $cy, $r, $r, $style); + + $this->pdf->undoTransform(); + $this->parsingCss->load(); + } + + /** + * tag : ELLIPSE + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_ELLIPSE($param) + { + if (!$this->_isInDraw) throw new HTML2PDF_exception(8, 'ELLIPSE'); + + $this->pdf->doTransform(isset($param['transform']) ? $this->_prepareTransform($param['transform']) : null); + $this->parsingCss->save(); + $styles = $this->parsingCss->getSvgStyle('path', $param); + $style = $this->pdf->svgSetStyle($styles); + + $cx = isset($param['cx']) ? $this->parsingCss->ConvertToMM($param['cx'], $this->_isInDraw['w']) : 0.; + $cy = isset($param['cy']) ? $this->parsingCss->ConvertToMM($param['cy'], $this->_isInDraw['h']) : 0.; + $rx = isset($param['ry']) ? $this->parsingCss->ConvertToMM($param['rx'], $this->_isInDraw['w']) : 0.; + $ry = isset($param['rx']) ? $this->parsingCss->ConvertToMM($param['ry'], $this->_isInDraw['h']) : 0.; + $this->pdf->svgEllipse($cx, $cy, $rx, $ry, $style); + + $this->pdf->undoTransform(); + $this->parsingCss->load(); + } + + + /** + * tag : POLYLINE + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_POLYLINE($param) + { + if (!$this->_isInDraw) throw new HTML2PDF_exception(8, 'POLYGON'); + + $this->pdf->doTransform(isset($param['transform']) ? $this->_prepareTransform($param['transform']) : null); + $this->parsingCss->save(); + $styles = $this->parsingCss->getSvgStyle('path', $param); + $style = $this->pdf->svgSetStyle($styles); + + $path = isset($param['points']) ? $param['points'] : null; + if ($path) { + $path = str_replace(',', ' ', $path); + $path = preg_replace('/[\s]+/', ' ', trim($path)); + + // prepare the path + $path = explode(' ', $path); + foreach ($path as $k => $v) { + $path[$k] = trim($v); + if ($path[$k]==='') unset($path[$k]); + } + $path = array_values($path); + + $actions = array(); + for ($k=0; $k<count($path); $k+=2) { + $actions[] = array( + ($k ? 'L' : 'M') , + $this->parsingCss->ConvertToMM($path[$k+0], $this->_isInDraw['w']), + $this->parsingCss->ConvertToMM($path[$k+1], $this->_isInDraw['h']) + ); + } + + // drawing + $this->pdf->svgPolygone($actions, $style); + } + + $this->pdf->undoTransform(); + $this->parsingCss->load(); + } + + /** + * tag : POLYGON + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_POLYGON($param) + { + if (!$this->_isInDraw) throw new HTML2PDF_exception(8, 'POLYGON'); + + $this->pdf->doTransform(isset($param['transform']) ? $this->_prepareTransform($param['transform']) : null); + $this->parsingCss->save(); + $styles = $this->parsingCss->getSvgStyle('path', $param); + $style = $this->pdf->svgSetStyle($styles); + + $path = (isset($param['points']) ? $param['points'] : null); + if ($path) { + $path = str_replace(',', ' ', $path); + $path = preg_replace('/[\s]+/', ' ', trim($path)); + + // prepare the path + $path = explode(' ', $path); + foreach ($path as $k => $v) { + $path[$k] = trim($v); + if ($path[$k]==='') unset($path[$k]); + } + $path = array_values($path); + + $actions = array(); + for ($k=0; $k<count($path); $k+=2) { + $actions[] = array( + ($k ? 'L' : 'M') , + $this->parsingCss->ConvertToMM($path[$k+0], $this->_isInDraw['w']), + $this->parsingCss->ConvertToMM($path[$k+1], $this->_isInDraw['h']) + ); + } + $actions[] = array('z'); + + // drawing + $this->pdf->svgPolygone($actions, $style); + } + + $this->pdf->undoTransform(); + $this->parsingCss->load(); + } + + /** + * tag : PATH + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_PATH($param) + { + if (!$this->_isInDraw) throw new HTML2PDF_exception(8, 'PATH'); + + $this->pdf->doTransform(isset($param['transform']) ? $this->_prepareTransform($param['transform']) : null); + $this->parsingCss->save(); + $styles = $this->parsingCss->getSvgStyle('path', $param); + $style = $this->pdf->svgSetStyle($styles); + + $path = isset($param['d']) ? $param['d'] : null; + + if ($path) { + // prepare the path + $path = str_replace(',', ' ', $path); + $path = preg_replace('/([a-zA-Z])([0-9\.\-])/', '$1 $2', $path); + $path = preg_replace('/([0-9\.])([a-zA-Z])/', '$1 $2', $path); + $path = preg_replace('/[\s]+/', ' ', trim($path)); + $path = preg_replace('/ ([a-z]{2})/', '$1', $path); + + $path = explode(' ', $path); + foreach ($path as $k => $v) { + $path[$k] = trim($v); + if ($path[$k]==='') unset($path[$k]); + } + $path = array_values($path); + + // read each actions in the path + $actions = array(); + $action = array(); + $lastAction = null; // last action found + for ($k=0; $k<count($path);true) { + + // for this actions, we can not have multi coordonate + if (in_array($lastAction, array('z', 'Z'))) { + $lastAction = null; + } + + // read the new action (forcing if no action before) + if (preg_match('/^[a-z]+$/i', $path[$k]) || $lastAction===null) { + $lastAction = $path[$k]; + $k++; + } + + // current action + $action = array(); + $action[] = $lastAction; + switch($lastAction) + { + case 'C': + case 'c': + $action[] = $this->parsingCss->ConvertToMM($path[$k+0], $this->_isInDraw['w']); // x1 + $action[] = $this->parsingCss->ConvertToMM($path[$k+1], $this->_isInDraw['h']); // y1 + $action[] = $this->parsingCss->ConvertToMM($path[$k+2], $this->_isInDraw['w']); // x2 + $action[] = $this->parsingCss->ConvertToMM($path[$k+3], $this->_isInDraw['h']); // y2 + $action[] = $this->parsingCss->ConvertToMM($path[$k+4], $this->_isInDraw['w']); // x + $action[] = $this->parsingCss->ConvertToMM($path[$k+5], $this->_isInDraw['h']); // y + $k+= 6; + break; + + case 'Q': + case 'S': + case 'q': + case 's': + $action[] = $this->parsingCss->ConvertToMM($path[$k+0], $this->_isInDraw['w']); // x2 + $action[] = $this->parsingCss->ConvertToMM($path[$k+1], $this->_isInDraw['h']); // y2 + $action[] = $this->parsingCss->ConvertToMM($path[$k+2], $this->_isInDraw['w']); // x + $action[] = $this->parsingCss->ConvertToMM($path[$k+3], $this->_isInDraw['h']); // y + $k+= 4; + break; + + case 'A': + case 'a': + $action[] = $this->parsingCss->ConvertToMM($path[$k+0], $this->_isInDraw['w']); // rx + $action[] = $this->parsingCss->ConvertToMM($path[$k+1], $this->_isInDraw['h']); // ry + $action[] = 1.*$path[$k+2]; // angle de deviation de l'axe X + $action[] = ($path[$k+3]=='1') ? 1 : 0; // large-arc-flag + $action[] = ($path[$k+4]=='1') ? 1 : 0; // sweep-flag + $action[] = $this->parsingCss->ConvertToMM($path[$k+5], $this->_isInDraw['w']); // x + $action[] = $this->parsingCss->ConvertToMM($path[$k+6], $this->_isInDraw['h']); // y + $k+= 7; + break; + + case 'M': + case 'L': + case 'T': + case 'm': + case 'l': + case 't': + $action[] = $this->parsingCss->ConvertToMM($path[$k+0], $this->_isInDraw['w']); // x + $action[] = $this->parsingCss->ConvertToMM($path[$k+1], $this->_isInDraw['h']); // y + $k+= 2; + break; + + case 'H': + case 'h': + $action[] = $this->parsingCss->ConvertToMM($path[$k+0], $this->_isInDraw['w']); // x + $k+= 1; + break; + + case 'V': + case 'v': + $action[] = $this->parsingCss->ConvertToMM($path[$k+0], $this->_isInDraw['h']); // y + $k+= 1; + break; + + case 'z': + case 'Z': + default: + break; + } + // add the action + $actions[] = $action; + } + + // drawing + $this->pdf->svgPolygone($actions, $style); + } + + $this->pdf->undoTransform(); + $this->parsingCss->load(); + } + + /** + * tag : G + * mode : OPEN + * + * @param array $param + * @return boolean + */ + protected function _tag_open_G($param) + { + if (!$this->_isInDraw) throw new HTML2PDF_exception(8, 'G'); + + $this->pdf->doTransform(isset($param['transform']) ? $this->_prepareTransform($param['transform']) : null); + $this->parsingCss->save(); + $styles = $this->parsingCss->getSvgStyle('path', $param); + $style = $this->pdf->svgSetStyle($styles); + } + + /** + * tag : G + * mode : CLOSE + * + * @param array $param + * @return boolean + */ + protected function _tag_close_G($param) + { + $this->pdf->undoTransform(); + $this->parsingCss->load(); + } + + /** + * new page for the automatic Index, does not use thie method. Only HTML2PDF_myPdf could use it !!!! + * + * @param &int $page + * @return integer $oldPage + */ + public function _INDEX_NewPage(&$page) + { + if ($page) { + $oldPage = $this->pdf->getPage(); + $this->pdf->setPage($page); + $this->pdf->setXY($this->_margeLeft, $this->_margeTop); + $this->_maxH = 0; + $page++; + return $oldPage; + } else { + $this->_setNewPage(); + return null; + } + } + + } +} \ No newline at end of file diff --git a/assets/html2pdf/locale/ca.csv b/assets/html2pdf/locale/ca.csv new file mode 100644 index 0000000..33ade8e --- /dev/null +++ b/assets/html2pdf/locale/ca.csv @@ -0,0 +1,21 @@ +"err01","L'etiqueta <b>&lt;[[OTHER]]&gt;</b> encara no existeix.<br><br>Si voleu afegir-la, heu de crear els mètodes <b>o_[[OTHER]]</b> (per l'obertura) i <b>c_[[OTHER]]</b> (pel tancament) seguint el model de les etiquetes existents.<br><br>A més, si creeu nous mètodes, envieu-ho a webmaster@html2pdf.fr per tal d'afegir-los a les següents versions d'HTML2PDF, i que tothom en pugui gaudir." +"err02","Frase de 1000 línies => massa llarga<br><b>Frase :</b> [[OTHER_0]]<br><b>Mida casella :</b> [[OTHER_1]]<br><b>Mida text :</b> [[OTHER_2]]<br>" +"err03","Codi HTML no vàlid, una etiqueta té un tancament de més : <b>&lt;[[OTHER]]&gt;</b>" +"err04","Codi HTML no vàlid, les etiquetes no estan tancades en l'ordre correcte.<br>Estat : <pre>[[OTHER]]</pre>" +"err05","Codi HTML no vàlid, totes les etiquetes han de tenir el seu tancament.<br>Estat : <pre>[[OTHER]]</pre>" +"err06","Impossible carregar la imatge <b>[[OTHER]]</b>" +"err07","El contingut d'una etiqueta TD no quep en una sola pàgina" +"err08","<b>&lt;[[OTHER]]&gt;</b> tag not in a &lt;DRAW&gt; tag" +"err09","The using of the <b>&lt;[[OTHER_0]]&gt;</b>> tag has changed, you can not use [[OTHER_1]] anymore. Read the WIKI" +"txt01","ERROR n°" +"txt02","Fitxer :" +"txt03","Línia :" +"pdf01","Document generat el [[date_d]]/[[date_m]]/[[date_y]]" +"pdf02","Document generat a les [[date_h]]:[[date_i]]" +"pdf03","Document generat el [[date_d]]/[[date_m]]/[[date_y]] a les [[date_h]]:[[date_i]]" +"pdf04","Pàgina [[page_cu]]/[[page_nb]]" +"pdf05","Els formularis requereixen l'ús de l'Adobe Reader 9" +"vue01","CAPÇALERA" +"vue02","PEU DE PÀGINA" +"vue03","PÀGINA" +"vue04","Visualització" diff --git a/assets/html2pdf/locale/cs.csv b/assets/html2pdf/locale/cs.csv new file mode 100644 index 0000000..67d5bce --- /dev/null +++ b/assets/html2pdf/locale/cs.csv @@ -0,0 +1,21 @@ +"err01","Element <b>&lt;[[OTHER]]&gt;</b> neexistuje.<br><br>Pokud ho chcete přidat, musíte vytvořit metodu <b>o_[[OTHER]]</b> (pro otevření) a <b>c_[[OTHER]]</b> (pro zavření) k začlenění do modelu jako existující element.<br><br>Pokud vytvoříte metodu, nebojte se poslat email na webmaster@html2pdf.fr k zařazení do další verze HTML2PDF." +"err02","Sentence of 1000 lines => too long<br><b>Sentence :</b> [[OTHER_0]]<br><b>Width box :</b> [[OTHER_1]]<br><b>Length text :</b> [[OTHER_2]]<br>" +"err03","Chyba v HTML, element je příliš mnohokrát zavřen: <b>&lt;[[OTHER]]&gt;</b>" +"err04","Chyba v HTML, element není uzavřen ve správném pořadí.<br>Stav : <pre>[[OTHER]]</pre>" +"err05","Chyba v HTML, všechny elementy musí být zavřeny.<br>Stav : <pre>[[OTHER]]</pre>" +"err06","Menohu načíst orbázek <b>[[OTHER]]</b>" +"err07","Obsah TD elementu se nevejde na jednu stránku" +"err08","<b>&lt;[[OTHER]]&gt;</b> element není v &lt;DRAW&gt; elementu" +"err09","The using of the <b>&lt;[[OTHER_0]]&gt;</b>> tag has changed, you can not use [[OTHER_1]] anymore. Read the WIKI" +"txt01","CHYBA č." +"txt02","Soubor :" +"txt03","Řádek :" +"pdf01","Dokument vytvořen dne [[date_d]].[[date_m]].[[date_y]]" +"pdf02","Dokument vytvořen v [[date_h]]:[[date_i]]" +"pdf03","Dokument vytvořen dne [[date_d]].[[date_m]].[[date_y]] v [[date_h]]:[[date_i]]" +"pdf04","Stránka [[page_cu]]/[[page_nb]]" +"pdf05","Formuláře vyžadují Adobe Reader 9" +"vue01","HLAVIČKA" +"vue02","PATIČKA" +"vue03","STRÁNKA" +"vue04","POHLED" diff --git a/assets/html2pdf/locale/da.csv b/assets/html2pdf/locale/da.csv new file mode 100644 index 0000000..9b4bcd9 --- /dev/null +++ b/assets/html2pdf/locale/da.csv @@ -0,0 +1,21 @@ +"err01","Tag <b>&lt;[[OTHER]]&gt;</b> endnu ikke eksisterer.<br><br>Hvis du ønsker at tilføje det, skal du oprette de metoder <b>o_[[OTHER]]</b> (for åbning) og <b>c_[[OTHER]]</b> (for lukning) ved at følge den model af eksisterende tags.<br><br>Hvis du opretter disse metoder, så tøv ikke med at send mig en e-mail til webmaster@html2pdf.fr til indsat dem i den næste version af HTML2PDF." +"err02","Sætning af 1000 lines => er for lang<br><b>sætning :</b> [[OTHER_0]]<br><b>Bredde boksen :</b> [[OTHER_1]]<br><b>Længde tekst :</b> [[OTHER_2]]<br>" +"err03","HTML-kode er ugyldig, et tag er lukket for mange gange: <b>&lt;[[OTHER]]&gt;</b>" +"err04","HTML-kode er ugyldig, tags er ikke afsluttet på en ordentlig måde.<br>Status : <pre>[[OTHER]]</pre>" +"err05","HTML-kode er ugyldig, alle tags skal lukkes. <br>Status : <pre>[[OTHER]]</pre>" +"err06","Umuligt at indlæse billedet <b>[[OTHER]]</b>" +"err07","Indholdet af en TD tag ikke passer på én side" +"err08","<b>&lt;[[OTHER]]&gt;</b> tag not in a &lt;DRAW&gt; tag" +"err09","The using of the <b>&lt;[[OTHER_0]]&gt;</b>> tag has changed, you can not use [[OTHER_1]] anymore. Read the WIKI" +"txt01","FEJL n°" +"txt02","File :" +"txt03","Linje :" +"pdf01","Siden oprettet d. [[date_y]]-[[date_m]]-[[date_d]]" +"pdf02","Siden oprettet d. [[date_h]]:[[date_i]]" +"pdf03","Siden oprettet d. [[date_y]]-[[date_m]]-[[date_d]] at [[date_h]]:[[date_i]]" +"pdf04","Side [[page_cu]]/[[page_nb]]" +"pdf05","De formularer kræver brug af Adobe Reader 9" +"vue01","HEADER" +"vue02","FOOTER" +"vue03","PAGE" +"vue04","View" diff --git a/assets/html2pdf/locale/de.csv b/assets/html2pdf/locale/de.csv new file mode 100644 index 0000000..fc848b3 --- /dev/null +++ b/assets/html2pdf/locale/de.csv @@ -0,0 +1,21 @@ +"err01","Das Tag <b>&lt;[[OTHER]]&gt;</b> existiert noch nicht.<br><br>Wenn Sie es hinzufügen möchten, sollen Sie die Methoden<b>o_[[OTHER]]</b> (zu öffnen) und <b>c_[[OTHER]]</b> (zu schließen) nach dem Modell den existierenden Tags.<br><br>Wenn Sie diese Methoden außerdem aufbauen, bitte teilen Sie sie duch eine E-Mail an meine Adresse : webmaster@html2pdf.fr, so daß sie künftig in die nächste Version von HTML2PDF erscheinen." +"err02","1000-Linien Satz => zu lang<br><b>Satz :</b> [[OTHER_0]]<br><b>Breite des Eingabefelds :</b> [[OTHER_1]]<br><b>Länge des Texts :</b> [[OTHER_2]]<br>" +"err03","Falsches HTML Code, überzähliges geschloßene Tag : <b>&lt;[[OTHER]]&gt;</b>" +"err04","Falsches HTML Code, die Tags sind nicht in richtiger Ordnung geschloßen.<br>Status : <pre>[[OTHER]]</pre>" +"err05","Falsches HTML Code, alle Tags sollen geschloßen sein.<br>Status : <pre>[[OTHER]]</pre>" +"err06","Ladung des Bilds unmöglich <b>[[OTHER]]</b>" +"err07","Er Inhalt eines TD-Tag passt nicht nur auf einer Seite" +"err08","<b>&lt;[[OTHER]]&gt;</b> tag not in a &lt;DRAW&gt; tag" +"err09","The using of the <b>&lt;[[OTHER_0]]&gt;</b>> tag has changed, you can not use [[OTHER_1]] anymore. Read the WIKI" +"txt01","Fehler n°" +"txt02","Datei :" +"txt03","Linie :" +"pdf01","Datei aufgebaut am [[date_d]]/[[date_m]]/[[date_y]]" +"pdf02","Datei aufgebaut um [[date_h]]:[[date_m]]" +"pdf03","Datei aufgebaut am [[date_d]]/[[date_m]]/[[date_y]] um [[date_h]]:[[date_i]]" +"pdf04","Seite [[page_cu]]/[[page_nb]]" +"pdf05","Die Formulare benötigen Sie den Adobe Reader 9" +"vue01","Seite-Header" +"vue02","Fußzeile" +"vue03","Seite" +"vue04","Visualisierung" diff --git a/assets/html2pdf/locale/en.csv b/assets/html2pdf/locale/en.csv new file mode 100644 index 0000000..04dcac5 --- /dev/null +++ b/assets/html2pdf/locale/en.csv @@ -0,0 +1,21 @@ +"err01","The tag <b>&lt;[[OTHER]]&gt;</b> does not yet exist.<br><br>If you want to add it, you must create the methods <b>o_[[OTHER]]</b> (for opening) and <b>c_[[OTHER]]</b> (for closure) by following the model of existing tags.<br><br>If you create these methods, do not hesitate to send me an email to webmaster@html2pdf.fr to included them in the next version of HTML2PDF." +"err02","Sentence of 1000 lines => too long<br><b>Sentence :</b> [[OTHER_0]]<br><b>Width box :</b> [[OTHER_1]]<br><b>Length text :</b> [[OTHER_2]]<br>" +"err03","HTML code invalid, a tag is closed too many times: <b>&lt;[[OTHER]]&gt;</b>" +"err04","HTML code invalid, the tags are not closed in an orderly fashion.<br>Status : <pre>[[OTHER]]</pre>" +"err05","HTML code invalid, all tags must be closed.<br>Status : <pre>[[OTHER]]</pre>" +"err06","Impossible to load the image <b>[[OTHER]]</b>" +"err07","The content of a TD tag does not fit on only one page" +"err08","<b>&lt;[[OTHER]]&gt;</b> tag not in a &lt;DRAW&gt; tag" +"err09","The using of the <b>&lt;[[OTHER_0]]&gt;</b>> tag has changed, you can not use [[OTHER_1]] anymore. Read the WIKI" +"txt01","ERROR n°" +"txt02","File :" +"txt03","Line :" +"pdf01","Document generated on [[date_y]]-[[date_m]]-[[date_d]]" +"pdf02","Document generated at [[date_h]]:[[date_i]]" +"pdf03","Document generated on [[date_y]]-[[date_m]]-[[date_d]] at [[date_h]]:[[date_i]]" +"pdf04","Page [[page_cu]]/[[page_nb]]" +"pdf05","The forms require the use of Adobe Reader 9" +"vue01","HEADER" +"vue02","FOOTER" +"vue03","PAGE" +"vue04","View" diff --git a/assets/html2pdf/locale/es.csv b/assets/html2pdf/locale/es.csv new file mode 100644 index 0000000..994c8da --- /dev/null +++ b/assets/html2pdf/locale/es.csv @@ -0,0 +1,21 @@ +"err01","La etiqueta <b>&lt;[[OTHER]]&gt;</b> todavía no existe.<br><br>Si quiere añadirla, debe crear los métodos <b>o_[[OTHER]]</b> (para la apertura) y <b>c_[[OTHER]]</b> (para el cierre) siguiendo el modelo de las etiquetas existentes.<br><br>Si crea nuevos métodos, envíelos a webmaster@html2pdf.fr para añadirlos a las siguientes versiones de HTML2PDF, y que todo el mundo se pueda beneficiar." +"err02","Frase de 1000 líneas => demasiado larga<br><b>Frase :</b> [[OTHER_0]]<br><b>Tamaño casilla :</b> [[OTHER_1]]<br><b>Tamaño texto :</b> [[OTHER_2]]<br>" +"err03","Código HTML no válido, una etiqueta tiene un cierre de más : <b>&lt;[[OTHER]]&gt;</b>" +"err04","Código HTML no válido, las etiquetas no estan cerradas en el orden correcto.<br>Estado : <pre>[[OTHER]]</pre>" +"err05","Código HTML no válido, todas las etiquetas deben tener su cierre.<br>Estado : <pre>[[OTHER]]</pre>" +"err06","Imposible cargar la imagen <b>[[OTHER]]</b>" +"err07","El contenido de una etiqueta TD no encaja en una sola página" +"err08","<b>&lt;[[OTHER]]&gt;</b> tag not in a &lt;DRAW&gt; tag" +"err09","The using of the <b>&lt;[[OTHER_0]]&gt;</b>> tag has changed, you can not use [[OTHER_1]] anymore. Read the WIKI" +"txt01","ERROR n°" +"txt02","Fichero :" +"txt03","Línea :" +"pdf01","Documento generado el [[date_d]]/[[date_m]]/[[date_y]]" +"pdf02","Documento generado a las [[date_h]]:[[date_i]]" +"pdf03","Documento generado el [[date_d]]/[[date_m]]/[[date_y]] a las [[date_h]]:[[date_i]]" +"pdf04","Página [[page_cu]]/[[page_nb]]" +"pdf05","Los formularios requieren el uso de Adobe Reader 9" +"vue01","ENCABEZADO" +"vue02","PIE DE PÁGINA" +"vue03","PÁGINA" +"vue04","Visualización" diff --git a/assets/html2pdf/locale/fr.csv b/assets/html2pdf/locale/fr.csv new file mode 100644 index 0000000..34e19ff --- /dev/null +++ b/assets/html2pdf/locale/fr.csv @@ -0,0 +1,21 @@ +"err01","La balise <b>&lt;[[OTHER]]&gt;</b> n'existe pas encore.<br><br>Si vous voulez la rajouter, vous devez créer les méthodes <b>o_[[OTHER]]</b> (pour l'ouverture) et <b>c_[[OTHER]]</b> (pour la fermeture) en suivant le modèle des balises existantes.<br><br>De plus, si vous créez ces méthodes, n'hésitez pas à en faire profiter tout le monde en m'écrivant sur webmaster@html2pdf.fr afin qu'elles se retrouvent dans la prochaine version d'HTML2PDF." +"err02","Phrase de 1000 lignes => trop long<br><b>Phrase :</b> [[OTHER_0]]<br><b>Largeur case :</b> [[OTHER_1]]<br><b>Longueur text :</b> [[OTHER_2]]<br>" +"err03","Code HTML non valide, une balise est fermée en trop : <b>&lt;[[OTHER]]&gt;</b>" +"err04","Code HTML non valide, les balises ne sont pas fermées dans le bon ordre.<br>Etat : <pre>[[OTHER]]</pre>" +"err05","Code HTML non valide, toutes les balises doivent être fermées.<br>Etat : <pre>[[OTHER]]</pre>" +"err06","Impossible de charger l'image <b>[[OTHER]]</b>" +"err07","le contenu d'une balise TD ne rentre pas sur une seule page" +"err08","Balise <b>&lt;[[OTHER]]&gt;</b> non contenu dans une balise &lt;DRAW&gt;" +"err09","L'utilisation de la balise <b>&lt;[[OTHER_0]]&gt;</b> a changé, vous ne pouvez plus utiliser [[OTHER_1]]. Lisez le WIKI" +"txt01","ERREUR n°" +"txt02","Fichier :" +"txt03","Ligne :" +"pdf01","Document généré le [[date_d]]/[[date_m]]/[[date_y]]" +"pdf02","Document généré à [[date_h]]:[[date_i]]" +"pdf03","Document généré le [[date_d]]/[[date_m]]/[[date_y]] à [[date_h]]:[[date_i]]" +"pdf04","Page [[page_cu]]/[[page_nb]]" +"pdf05","Les formulaires nécessitent l'utilisation de Adobe Reader 9" +"vue01","HEADER" +"vue02","FOOTER" +"vue03","PAGE" +"vue04","Restitution" diff --git a/assets/html2pdf/locale/it.csv b/assets/html2pdf/locale/it.csv new file mode 100644 index 0000000..2a840e1 --- /dev/null +++ b/assets/html2pdf/locale/it.csv @@ -0,0 +1,21 @@ +"err01","Il tag <b>&lt;[[OTHER]]&gt;</b> non esiste ancora.<br><br>Se si desidera aggiungere, è necessario creare metodi <b>o_[[OTHER]]</b> (di apertura) e <b>C_[[OTHER]]</b> (per la chiusura) secondo il modello esistente di tag.<br><br>Inoltre, se si creare questi metodi, non esitate a portare il mondo intero ha scritto su webmaster@html2pdf.fr in modo che alla fine nella prossima versione di HTML2PDF." +"err02","Citazione di 1000 linee => troppo lungo<br><b>frase :</b> [[OTHER_0]]<br><b>casella Larghezza :</b> [[OTHER_1]]<br><b>Lunghezza testo :</b> [[OTHER_2]]<br>" +"err03","HTML non valido, un tag è chiusa troppo <b>&lt;[[OTHER]]&gt;</ b>" +"err04","HTML non validi, i tag non sono chiusi nel corretto ordine.<br>Stato :<pre>[[OTHER]]</pre>" +"err05","HTML non valido, tutte le tag deve essere chiuso.<br>Stato :<pre>[[OTHER]]</pre>" +"err06","Impossibile caricare l'immagine <b>[[OTHER]]</b>" +"err07","il contenuto di un tag TD non rientra in una sola pagina" +"err08","<b>&lt;[[OTHER]]&gt;</b> tag not in a &lt;DRAW&gt; tag" +"err09","The using of the <b>&lt;[[OTHER_0]]&gt;</b>> tag has changed, you can not use [[OTHER_1]] anymore. Read the WIKI" +"txt01","ERRORE n°" +"txt02","File :" +"txt03","Linea :" +"pdf01","Documento generato il [[date_d]]/[[date_m]]/[[date_y]]" +"pdf02","Documento generato [[date_h]]:[[date_i]]" +"pdf03","Documento generato il [[date_d]]/[[date_m]]/[[date_y]] nel [[date_h]]:[[date_i]]" +"pdf04","Pagina [[page_cu]]/[[page_nb]]" +"pdf05","I moduli richiedono l'uso di Adobe Reader 9" +"vue01","HEADER" +"vue02","FOOTER" +"vue03","PAGINA" +"vue04","Visualization" diff --git a/assets/html2pdf/locale/nl.csv b/assets/html2pdf/locale/nl.csv new file mode 100644 index 0000000..d9244cb --- /dev/null +++ b/assets/html2pdf/locale/nl.csv @@ -0,0 +1,21 @@ +"err01","De tag <b>&lt;[[OTHER]]&gt;</b> bestaat nog niet.<br><br>Om deze toe te voegen, gebruik de methods <b>o_[[OTHER]]</b> (om te openen) en <b>c_[[OTHER]]</b> (om te sluiten) volgens het model van de bestaande tags.<br><br>Als u deze methods maakt, stuur deze dan a.u.b. via e-mail naar webmaster@html2pdf.fr voor opname in de volgende versie van HTML2PDF." +"err02","Zin van 1000 regels => te lang<br><b>Zin :</b> [[OTHER_0]]<br><b>Kaderbreedte :</b> [[OTHER_1]]<br><b>Tekstlengte :</b> [[OTHER_2]]<br>" +"err03","Ongeldige HTML code, overvloedig afgesloten tag : <b>&lt;[[OTHER]]&gt;</b>" +"err04","Ongeldige HTML code, de tags zijn niet correct afgesloten.<br>Status : <pre>[[OTHER]]</pre>" +"err05","Ongeldige HTML code, alle tags dienen te zijn gesloten.<br>Status : <pre>[[OTHER]]</pre>" +"err06","Kan afbeelding niet laden: <b>[[OTHER]]</b>" +"err07","De inhoud van de cel (<TD>) past niet op een pagina" +"err08","<b>&lt;[[OTHER]]&gt;</b> tag not in a &lt;DRAW&gt; tag" +"err09","The using of the <b>&lt;[[OTHER_0]]&gt;</b>> tag has changed, you can not use [[OTHER_1]] anymore. Read the WIKI" +"txt01","Fout nr" +"txt02","Bestand :" +"txt03","Regel :" +"pdf01","Document gemaakt op [[date_d]]-[[date_m]]-[[date_y]]" +"pdf02","Document gemaakt om [[date_h]]:[[date_i]]" +"pdf03","Document gemaakt op [[date_d]]-[[date_m]]-[[date_y]] om [[date_h]]:[[date_i]]" +"pdf04","Pagina [[page_cu]] van [[page_nb]]" +"pdf05","De formulieren vereisen het gebruik van Adobe Reader 9" +"vue01","Paginakop" +"vue02","Paginavoet" +"vue03","Pagina" +"vue04","Bekijken" diff --git a/assets/html2pdf/locale/pt.csv b/assets/html2pdf/locale/pt.csv new file mode 100644 index 0000000..9bdbd20 --- /dev/null +++ b/assets/html2pdf/locale/pt.csv @@ -0,0 +1,21 @@ +"err01","A tag <b>&lt;[[OTHER]]&gt;</b> ainda não existe.<br><br>Se você quer inserí-la, deve criar os métodos <b>o_[[OTHER]]</b> (para abrí-la) e <b>c_[[OTHER]]</b> (para fechá-la) seguindo o modelo das tags existentes.<br><br>Se você criar novos métodos, os envie para webmaster@html2pdf.fr para que as próximas versões de HTML2PDF, e o restante do mundo se beneficie com isso." +"err02","Frase de 1000 linhas => muito grande<br><b>Frase :</b> [[OTHER_0]]<br><b>Tamanho do quadro :</b> [[OTHER_1]]<br><b>Tamanho do texto :</b> [[OTHER_2]]<br>" +"err03","Código HTML não válido, uma tag está com fechamento sobrando : <b>&lt;[[OTHER]]&gt;</b>" +"err04","Código HTML não válido, as tags não estão fechadas na ordem correta.<br>Estado : <pre>[[OTHER]]</pre>" +"err05","Código HTML não válido, todas as tags devem ser fechadas.<br>Estado : <pre>[[OTHER]]</pre>" +"err06","Impossível carregar imagem <b>[[OTHER]]</b>" +"err07","O conteúdo de uma tag TD não se encaixa em apenas uma página" +"err08","<b>&lt;[[OTHER]]&gt;</b> tag not in a &lt;DRAW&gt; tag" +"err09","The using of the <b>&lt;[[OTHER_0]]&gt;</b>> tag has changed, you can not use [[OTHER_1]] anymore. Read the WIKI" +"txt01","ERRO n°" +"txt02","Arquivo :" +"txt03","Linha :" +"pdf01","Documento generado em [[date_d]]/[[date_m]]/[[date_y]]" +"pdf02","Documento generado às [[date_h]]:[[date_i]]" +"pdf03","Documento generado em [[date_d]]/[[date_m]]/[[date_y]] às [[date_h]]:[[date_i]]" +"pdf04","Página [[page_cu]]/[[page_nb]]" +"pdf05","Os formulários exigem a utilização do Adobe Reader 9" +"vue01","CABEÇALHO" +"vue02","RODAPÉ" +"vue03","PÁGINA" +"vue04","Visualização" diff --git a/assets/html2pdf/locale/tr.csv b/assets/html2pdf/locale/tr.csv new file mode 100644 index 0000000..63b29e2 --- /dev/null +++ b/assets/html2pdf/locale/tr.csv @@ -0,0 +1,21 @@ +"err01","<b>&lt;[[OTHER]]&gt;</b> etiketi bulunamadý.<br><br>Eklemek isterseniz, <b>o_[[OTHER]]</b> þeklinde açýp, <b>c_[[OTHER]]</b> þeklinde kapatabilirsiniz.<br><br> Bu þekilde etiketler üretirseniz lütfen daha sonraki HTML2PDF versiyonuna eklenmek üzere bana gönderin. ( webmaster@html2pdf.fr )." +"err02","Ýçerik 1000 satýrdan fazla ve gerekenden uzun <br><b>Konu :</b> [[OTHER_0]]<br><b>Geniþlik :</b> [[OTHER_1]]<br><b>Yazý boyutu :</b> [[OTHER_2]]<br>" +"err03","HTML kodu hatalý, etiket birden fazla defa kapatýlmýþ: <b>&lt;[[OTHER]]&gt;</b>" +"err04","HTML kodu hatalý, etiketler gereken düzen içinde kapatýlmamýþ.<br>Durum : <pre>[[OTHER]]</pre>" +"err05","HTML kodu hatalý, bütün etiketler kapatýlmalý.<br>Durum : <pre>[[OTHER]]</pre>" +"err06","Resim dosyasý okunamýyor <b>[[OTHER]]</b>" +"err07","TD içeriði bir sayfaya sýðmýyor" +"err08","<b>&lt;[[OTHER]]&gt;</b> tag not in a &lt;DRAW&gt; tag" +"err09","The using of the <b>&lt;[[OTHER_0]]&gt;</b>> tag has changed, you can not use [[OTHER_1]] anymore. Read the WIKI" +"txt01","HATA n°" +"txt02","Dosya :" +"txt03","Satýr :" +"pdf01","Doküman üretilme tarihi [[date_y]]-[[date_m]]-[[date_d]]" +"pdf02","Doküman üretilme tarihi [[date_h]]:[[date_i]]" +"pdf03","Doküman üretilme tarihi [[date_y]]-[[date_m]]-[[date_d]] saati [[date_h]]:[[date_i]]" +"pdf04","Sayfa [[page_cu]]/[[page_nb]]" +"pdf05","Adobe Reader 9 gerektirir" +"vue01","DOSYA ÜSTÜ" +"vue02","DOSYA ALTI" +"vue03","SAYFA" +"vue04","Görünüm" diff --git a/assets/ionicons.min.css b/assets/ionicons.min.css new file mode 100644 index 0000000..81b2400 --- /dev/null +++ b/assets/ionicons.min.css @@ -0,0 +1,11 @@ +@charset "UTF-8";/*! + Ionicons, v2.0.1 + Created by Ben Sperry for the Ionic Framework, http://ionicons.com/ + https://twitter.com/benjsperry https://twitter.com/ionicframework + MIT License: https://github.com/driftyco/ionicons + + Android-style icons originally built by Google’s + Material Design Icons: https://github.com/google/material-design-icons + used under CC BY http://creativecommons.org/licenses/by/4.0/ + Modified icons to fit ionicon’s grid from original. +*/@font-face{font-family:"Ionicons";src:url("../fonts/ionicons.eot?v=2.0.1");src:url("../fonts/ionicons.eot?v=2.0.1#iefix") format("embedded-opentype"),url("../fonts/ionicons.ttf?v=2.0.1") format("truetype"),url("../fonts/ionicons.woff?v=2.0.1") format("woff"),url("../fonts/ionicons.svg?v=2.0.1#Ionicons") format("svg");font-weight:normal;font-style:normal}.ion,.ionicons,.ion-alert:before,.ion-alert-circled:before,.ion-android-add:before,.ion-android-add-circle:before,.ion-android-alarm-clock:before,.ion-android-alert:before,.ion-android-apps:before,.ion-android-archive:before,.ion-android-arrow-back:before,.ion-android-arrow-down:before,.ion-android-arrow-dropdown:before,.ion-android-arrow-dropdown-circle:before,.ion-android-arrow-dropleft:before,.ion-android-arrow-dropleft-circle:before,.ion-android-arrow-dropright:before,.ion-android-arrow-dropright-circle:before,.ion-android-arrow-dropup:before,.ion-android-arrow-dropup-circle:before,.ion-android-arrow-forward:before,.ion-android-arrow-up:before,.ion-android-attach:before,.ion-android-bar:before,.ion-android-bicycle:before,.ion-android-boat:before,.ion-android-bookmark:before,.ion-android-bulb:before,.ion-android-bus:before,.ion-android-calendar:before,.ion-android-call:before,.ion-android-camera:before,.ion-android-cancel:before,.ion-android-car:before,.ion-android-cart:before,.ion-android-chat:before,.ion-android-checkbox:before,.ion-android-checkbox-blank:before,.ion-android-checkbox-outline:before,.ion-android-checkbox-outline-blank:before,.ion-android-checkmark-circle:before,.ion-android-clipboard:before,.ion-android-close:before,.ion-android-cloud:before,.ion-android-cloud-circle:before,.ion-android-cloud-done:before,.ion-android-cloud-outline:before,.ion-android-color-palette:before,.ion-android-compass:before,.ion-android-contact:before,.ion-android-contacts:before,.ion-android-contract:before,.ion-android-create:before,.ion-android-delete:before,.ion-android-desktop:before,.ion-android-document:before,.ion-android-done:before,.ion-android-done-all:before,.ion-android-download:before,.ion-android-drafts:before,.ion-android-exit:before,.ion-android-expand:before,.ion-android-favorite:before,.ion-android-favorite-outline:before,.ion-android-film:before,.ion-android-folder:before,.ion-android-folder-open:before,.ion-android-funnel:before,.ion-android-globe:before,.ion-android-hand:before,.ion-android-hangout:before,.ion-android-happy:before,.ion-android-home:before,.ion-android-image:before,.ion-android-laptop:before,.ion-android-list:before,.ion-android-locate:before,.ion-android-lock:before,.ion-android-mail:before,.ion-android-map:before,.ion-android-menu:before,.ion-android-microphone:before,.ion-android-microphone-off:before,.ion-android-more-horizontal:before,.ion-android-more-vertical:before,.ion-android-navigate:before,.ion-android-notifications:before,.ion-android-notifications-none:before,.ion-android-notifications-off:before,.ion-android-open:before,.ion-android-options:before,.ion-android-people:before,.ion-android-person:before,.ion-android-person-add:before,.ion-android-phone-landscape:before,.ion-android-phone-portrait:before,.ion-android-pin:before,.ion-android-plane:before,.ion-android-playstore:before,.ion-android-print:before,.ion-android-radio-button-off:before,.ion-android-radio-button-on:before,.ion-android-refresh:before,.ion-android-remove:before,.ion-android-remove-circle:before,.ion-android-restaurant:before,.ion-android-sad:before,.ion-android-search:before,.ion-android-send:before,.ion-android-settings:before,.ion-android-share:before,.ion-android-share-alt:before,.ion-android-star:before,.ion-android-star-half:before,.ion-android-star-outline:before,.ion-android-stopwatch:before,.ion-android-subway:before,.ion-android-sunny:before,.ion-android-sync:before,.ion-android-textsms:before,.ion-android-time:before,.ion-android-train:before,.ion-android-unlock:before,.ion-android-upload:before,.ion-android-volume-down:before,.ion-android-volume-mute:before,.ion-android-volume-off:before,.ion-android-volume-up:before,.ion-android-walk:before,.ion-android-warning:before,.ion-android-watch:before,.ion-android-wifi:before,.ion-aperture:before,.ion-archive:before,.ion-arrow-down-a:before,.ion-arrow-down-b:before,.ion-arrow-down-c:before,.ion-arrow-expand:before,.ion-arrow-graph-down-left:before,.ion-arrow-graph-down-right:before,.ion-arrow-graph-up-left:before,.ion-arrow-graph-up-right:before,.ion-arrow-left-a:before,.ion-arrow-left-b:before,.ion-arrow-left-c:before,.ion-arrow-move:before,.ion-arrow-resize:before,.ion-arrow-return-left:before,.ion-arrow-return-right:before,.ion-arrow-right-a:before,.ion-arrow-right-b:before,.ion-arrow-right-c:before,.ion-arrow-shrink:before,.ion-arrow-swap:before,.ion-arrow-up-a:before,.ion-arrow-up-b:before,.ion-arrow-up-c:before,.ion-asterisk:before,.ion-at:before,.ion-backspace:before,.ion-backspace-outline:before,.ion-bag:before,.ion-battery-charging:before,.ion-battery-empty:before,.ion-battery-full:before,.ion-battery-half:before,.ion-battery-low:before,.ion-beaker:before,.ion-beer:before,.ion-bluetooth:before,.ion-bonfire:before,.ion-bookmark:before,.ion-bowtie:before,.ion-briefcase:before,.ion-bug:before,.ion-calculator:before,.ion-calendar:before,.ion-camera:before,.ion-card:before,.ion-cash:before,.ion-chatbox:before,.ion-chatbox-working:before,.ion-chatboxes:before,.ion-chatbubble:before,.ion-chatbubble-working:before,.ion-chatbubbles:before,.ion-checkmark:before,.ion-checkmark-circled:before,.ion-checkmark-round:before,.ion-chevron-down:before,.ion-chevron-left:before,.ion-chevron-right:before,.ion-chevron-up:before,.ion-clipboard:before,.ion-clock:before,.ion-close:before,.ion-close-circled:before,.ion-close-round:before,.ion-closed-captioning:before,.ion-cloud:before,.ion-code:before,.ion-code-download:before,.ion-code-working:before,.ion-coffee:before,.ion-compass:before,.ion-compose:before,.ion-connection-bars:before,.ion-contrast:before,.ion-crop:before,.ion-cube:before,.ion-disc:before,.ion-document:before,.ion-document-text:before,.ion-drag:before,.ion-earth:before,.ion-easel:before,.ion-edit:before,.ion-egg:before,.ion-eject:before,.ion-email:before,.ion-email-unread:before,.ion-erlenmeyer-flask:before,.ion-erlenmeyer-flask-bubbles:before,.ion-eye:before,.ion-eye-disabled:before,.ion-female:before,.ion-filing:before,.ion-film-marker:before,.ion-fireball:before,.ion-flag:before,.ion-flame:before,.ion-flash:before,.ion-flash-off:before,.ion-folder:before,.ion-fork:before,.ion-fork-repo:before,.ion-forward:before,.ion-funnel:before,.ion-gear-a:before,.ion-gear-b:before,.ion-grid:before,.ion-hammer:before,.ion-happy:before,.ion-happy-outline:before,.ion-headphone:before,.ion-heart:before,.ion-heart-broken:before,.ion-help:before,.ion-help-buoy:before,.ion-help-circled:before,.ion-home:before,.ion-icecream:before,.ion-image:before,.ion-images:before,.ion-information:before,.ion-information-circled:before,.ion-ionic:before,.ion-ios-alarm:before,.ion-ios-alarm-outline:before,.ion-ios-albums:before,.ion-ios-albums-outline:before,.ion-ios-americanfootball:before,.ion-ios-americanfootball-outline:before,.ion-ios-analytics:before,.ion-ios-analytics-outline:before,.ion-ios-arrow-back:before,.ion-ios-arrow-down:before,.ion-ios-arrow-forward:before,.ion-ios-arrow-left:before,.ion-ios-arrow-right:before,.ion-ios-arrow-thin-down:before,.ion-ios-arrow-thin-left:before,.ion-ios-arrow-thin-right:before,.ion-ios-arrow-thin-up:before,.ion-ios-arrow-up:before,.ion-ios-at:before,.ion-ios-at-outline:before,.ion-ios-barcode:before,.ion-ios-barcode-outline:before,.ion-ios-baseball:before,.ion-ios-baseball-outline:before,.ion-ios-basketball:before,.ion-ios-basketball-outline:before,.ion-ios-bell:before,.ion-ios-bell-outline:before,.ion-ios-body:before,.ion-ios-body-outline:before,.ion-ios-bolt:before,.ion-ios-bolt-outline:before,.ion-ios-book:before,.ion-ios-book-outline:before,.ion-ios-bookmarks:before,.ion-ios-bookmarks-outline:before,.ion-ios-box:before,.ion-ios-box-outline:before,.ion-ios-briefcase:before,.ion-ios-briefcase-outline:before,.ion-ios-browsers:before,.ion-ios-browsers-outline:before,.ion-ios-calculator:before,.ion-ios-calculator-outline:before,.ion-ios-calendar:before,.ion-ios-calendar-outline:before,.ion-ios-camera:before,.ion-ios-camera-outline:before,.ion-ios-cart:before,.ion-ios-cart-outline:before,.ion-ios-chatboxes:before,.ion-ios-chatboxes-outline:before,.ion-ios-chatbubble:before,.ion-ios-chatbubble-outline:before,.ion-ios-checkmark:before,.ion-ios-checkmark-empty:before,.ion-ios-checkmark-outline:before,.ion-ios-circle-filled:before,.ion-ios-circle-outline:before,.ion-ios-clock:before,.ion-ios-clock-outline:before,.ion-ios-close:before,.ion-ios-close-empty:before,.ion-ios-close-outline:before,.ion-ios-cloud:before,.ion-ios-cloud-download:before,.ion-ios-cloud-download-outline:before,.ion-ios-cloud-outline:before,.ion-ios-cloud-upload:before,.ion-ios-cloud-upload-outline:before,.ion-ios-cloudy:before,.ion-ios-cloudy-night:before,.ion-ios-cloudy-night-outline:before,.ion-ios-cloudy-outline:before,.ion-ios-cog:before,.ion-ios-cog-outline:before,.ion-ios-color-filter:before,.ion-ios-color-filter-outline:before,.ion-ios-color-wand:before,.ion-ios-color-wand-outline:before,.ion-ios-compose:before,.ion-ios-compose-outline:before,.ion-ios-contact:before,.ion-ios-contact-outline:before,.ion-ios-copy:before,.ion-ios-copy-outline:before,.ion-ios-crop:before,.ion-ios-crop-strong:before,.ion-ios-download:before,.ion-ios-download-outline:before,.ion-ios-drag:before,.ion-ios-email:before,.ion-ios-email-outline:before,.ion-ios-eye:before,.ion-ios-eye-outline:before,.ion-ios-fastforward:before,.ion-ios-fastforward-outline:before,.ion-ios-filing:before,.ion-ios-filing-outline:before,.ion-ios-film:before,.ion-ios-film-outline:before,.ion-ios-flag:before,.ion-ios-flag-outline:before,.ion-ios-flame:before,.ion-ios-flame-outline:before,.ion-ios-flask:before,.ion-ios-flask-outline:before,.ion-ios-flower:before,.ion-ios-flower-outline:before,.ion-ios-folder:before,.ion-ios-folder-outline:before,.ion-ios-football:before,.ion-ios-football-outline:before,.ion-ios-game-controller-a:before,.ion-ios-game-controller-a-outline:before,.ion-ios-game-controller-b:before,.ion-ios-game-controller-b-outline:before,.ion-ios-gear:before,.ion-ios-gear-outline:before,.ion-ios-glasses:before,.ion-ios-glasses-outline:before,.ion-ios-grid-view:before,.ion-ios-grid-view-outline:before,.ion-ios-heart:before,.ion-ios-heart-outline:before,.ion-ios-help:before,.ion-ios-help-empty:before,.ion-ios-help-outline:before,.ion-ios-home:before,.ion-ios-home-outline:before,.ion-ios-infinite:before,.ion-ios-infinite-outline:before,.ion-ios-information:before,.ion-ios-information-empty:before,.ion-ios-information-outline:before,.ion-ios-ionic-outline:before,.ion-ios-keypad:before,.ion-ios-keypad-outline:before,.ion-ios-lightbulb:before,.ion-ios-lightbulb-outline:before,.ion-ios-list:before,.ion-ios-list-outline:before,.ion-ios-location:before,.ion-ios-location-outline:before,.ion-ios-locked:before,.ion-ios-locked-outline:before,.ion-ios-loop:before,.ion-ios-loop-strong:before,.ion-ios-medical:before,.ion-ios-medical-outline:before,.ion-ios-medkit:before,.ion-ios-medkit-outline:before,.ion-ios-mic:before,.ion-ios-mic-off:before,.ion-ios-mic-outline:before,.ion-ios-minus:before,.ion-ios-minus-empty:before,.ion-ios-minus-outline:before,.ion-ios-monitor:before,.ion-ios-monitor-outline:before,.ion-ios-moon:before,.ion-ios-moon-outline:before,.ion-ios-more:before,.ion-ios-more-outline:before,.ion-ios-musical-note:before,.ion-ios-musical-notes:before,.ion-ios-navigate:before,.ion-ios-navigate-outline:before,.ion-ios-nutrition:before,.ion-ios-nutrition-outline:before,.ion-ios-paper:before,.ion-ios-paper-outline:before,.ion-ios-paperplane:before,.ion-ios-paperplane-outline:before,.ion-ios-partlysunny:before,.ion-ios-partlysunny-outline:before,.ion-ios-pause:before,.ion-ios-pause-outline:before,.ion-ios-paw:before,.ion-ios-paw-outline:before,.ion-ios-people:before,.ion-ios-people-outline:before,.ion-ios-person:before,.ion-ios-person-outline:before,.ion-ios-personadd:before,.ion-ios-personadd-outline:before,.ion-ios-photos:before,.ion-ios-photos-outline:before,.ion-ios-pie:before,.ion-ios-pie-outline:before,.ion-ios-pint:before,.ion-ios-pint-outline:before,.ion-ios-play:before,.ion-ios-play-outline:before,.ion-ios-plus:before,.ion-ios-plus-empty:before,.ion-ios-plus-outline:before,.ion-ios-pricetag:before,.ion-ios-pricetag-outline:before,.ion-ios-pricetags:before,.ion-ios-pricetags-outline:before,.ion-ios-printer:before,.ion-ios-printer-outline:before,.ion-ios-pulse:before,.ion-ios-pulse-strong:before,.ion-ios-rainy:before,.ion-ios-rainy-outline:before,.ion-ios-recording:before,.ion-ios-recording-outline:before,.ion-ios-redo:before,.ion-ios-redo-outline:before,.ion-ios-refresh:before,.ion-ios-refresh-empty:before,.ion-ios-refresh-outline:before,.ion-ios-reload:before,.ion-ios-reverse-camera:before,.ion-ios-reverse-camera-outline:before,.ion-ios-rewind:before,.ion-ios-rewind-outline:before,.ion-ios-rose:before,.ion-ios-rose-outline:before,.ion-ios-search:before,.ion-ios-search-strong:before,.ion-ios-settings:before,.ion-ios-settings-strong:before,.ion-ios-shuffle:before,.ion-ios-shuffle-strong:before,.ion-ios-skipbackward:before,.ion-ios-skipbackward-outline:before,.ion-ios-skipforward:before,.ion-ios-skipforward-outline:before,.ion-ios-snowy:before,.ion-ios-speedometer:before,.ion-ios-speedometer-outline:before,.ion-ios-star:before,.ion-ios-star-half:before,.ion-ios-star-outline:before,.ion-ios-stopwatch:before,.ion-ios-stopwatch-outline:before,.ion-ios-sunny:before,.ion-ios-sunny-outline:before,.ion-ios-telephone:before,.ion-ios-telephone-outline:before,.ion-ios-tennisball:before,.ion-ios-tennisball-outline:before,.ion-ios-thunderstorm:before,.ion-ios-thunderstorm-outline:before,.ion-ios-time:before,.ion-ios-time-outline:before,.ion-ios-timer:before,.ion-ios-timer-outline:before,.ion-ios-toggle:before,.ion-ios-toggle-outline:before,.ion-ios-trash:before,.ion-ios-trash-outline:before,.ion-ios-undo:before,.ion-ios-undo-outline:before,.ion-ios-unlocked:before,.ion-ios-unlocked-outline:before,.ion-ios-upload:before,.ion-ios-upload-outline:before,.ion-ios-videocam:before,.ion-ios-videocam-outline:before,.ion-ios-volume-high:before,.ion-ios-volume-low:before,.ion-ios-wineglass:before,.ion-ios-wineglass-outline:before,.ion-ios-world:before,.ion-ios-world-outline:before,.ion-ipad:before,.ion-iphone:before,.ion-ipod:before,.ion-jet:before,.ion-key:before,.ion-knife:before,.ion-laptop:before,.ion-leaf:before,.ion-levels:before,.ion-lightbulb:before,.ion-link:before,.ion-load-a:before,.ion-load-b:before,.ion-load-c:before,.ion-load-d:before,.ion-location:before,.ion-lock-combination:before,.ion-locked:before,.ion-log-in:before,.ion-log-out:before,.ion-loop:before,.ion-magnet:before,.ion-male:before,.ion-man:before,.ion-map:before,.ion-medkit:before,.ion-merge:before,.ion-mic-a:before,.ion-mic-b:before,.ion-mic-c:before,.ion-minus:before,.ion-minus-circled:before,.ion-minus-round:before,.ion-model-s:before,.ion-monitor:before,.ion-more:before,.ion-mouse:before,.ion-music-note:before,.ion-navicon:before,.ion-navicon-round:before,.ion-navigate:before,.ion-network:before,.ion-no-smoking:before,.ion-nuclear:before,.ion-outlet:before,.ion-paintbrush:before,.ion-paintbucket:before,.ion-paper-airplane:before,.ion-paperclip:before,.ion-pause:before,.ion-person:before,.ion-person-add:before,.ion-person-stalker:before,.ion-pie-graph:before,.ion-pin:before,.ion-pinpoint:before,.ion-pizza:before,.ion-plane:before,.ion-planet:before,.ion-play:before,.ion-playstation:before,.ion-plus:before,.ion-plus-circled:before,.ion-plus-round:before,.ion-podium:before,.ion-pound:before,.ion-power:before,.ion-pricetag:before,.ion-pricetags:before,.ion-printer:before,.ion-pull-request:before,.ion-qr-scanner:before,.ion-quote:before,.ion-radio-waves:before,.ion-record:before,.ion-refresh:before,.ion-reply:before,.ion-reply-all:before,.ion-ribbon-a:before,.ion-ribbon-b:before,.ion-sad:before,.ion-sad-outline:before,.ion-scissors:before,.ion-search:before,.ion-settings:before,.ion-share:before,.ion-shuffle:before,.ion-skip-backward:before,.ion-skip-forward:before,.ion-social-android:before,.ion-social-android-outline:before,.ion-social-angular:before,.ion-social-angular-outline:before,.ion-social-apple:before,.ion-social-apple-outline:before,.ion-social-bitcoin:before,.ion-social-bitcoin-outline:before,.ion-social-buffer:before,.ion-social-buffer-outline:before,.ion-social-chrome:before,.ion-social-chrome-outline:before,.ion-social-codepen:before,.ion-social-codepen-outline:before,.ion-social-css3:before,.ion-social-css3-outline:before,.ion-social-designernews:before,.ion-social-designernews-outline:before,.ion-social-dribbble:before,.ion-social-dribbble-outline:before,.ion-social-dropbox:before,.ion-social-dropbox-outline:before,.ion-social-euro:before,.ion-social-euro-outline:before,.ion-social-facebook:before,.ion-social-facebook-outline:before,.ion-social-foursquare:before,.ion-social-foursquare-outline:before,.ion-social-freebsd-devil:before,.ion-social-github:before,.ion-social-github-outline:before,.ion-social-google:before,.ion-social-google-outline:before,.ion-social-googleplus:before,.ion-social-googleplus-outline:before,.ion-social-hackernews:before,.ion-social-hackernews-outline:before,.ion-social-html5:before,.ion-social-html5-outline:before,.ion-social-instagram:before,.ion-social-instagram-outline:before,.ion-social-javascript:before,.ion-social-javascript-outline:before,.ion-social-linkedin:before,.ion-social-linkedin-outline:before,.ion-social-markdown:before,.ion-social-nodejs:before,.ion-social-octocat:before,.ion-social-pinterest:before,.ion-social-pinterest-outline:before,.ion-social-python:before,.ion-social-reddit:before,.ion-social-reddit-outline:before,.ion-social-rss:before,.ion-social-rss-outline:before,.ion-social-sass:before,.ion-social-skype:before,.ion-social-skype-outline:before,.ion-social-snapchat:before,.ion-social-snapchat-outline:before,.ion-social-tumblr:before,.ion-social-tumblr-outline:before,.ion-social-tux:before,.ion-social-twitch:before,.ion-social-twitch-outline:before,.ion-social-twitter:before,.ion-social-twitter-outline:before,.ion-social-usd:before,.ion-social-usd-outline:before,.ion-social-vimeo:before,.ion-social-vimeo-outline:before,.ion-social-whatsapp:before,.ion-social-whatsapp-outline:before,.ion-social-windows:before,.ion-social-windows-outline:before,.ion-social-wordpress:before,.ion-social-wordpress-outline:before,.ion-social-yahoo:before,.ion-social-yahoo-outline:before,.ion-social-yen:before,.ion-social-yen-outline:before,.ion-social-youtube:before,.ion-social-youtube-outline:before,.ion-soup-can:before,.ion-soup-can-outline:before,.ion-speakerphone:before,.ion-speedometer:before,.ion-spoon:before,.ion-star:before,.ion-stats-bars:before,.ion-steam:before,.ion-stop:before,.ion-thermometer:before,.ion-thumbsdown:before,.ion-thumbsup:before,.ion-toggle:before,.ion-toggle-filled:before,.ion-transgender:before,.ion-trash-a:before,.ion-trash-b:before,.ion-trophy:before,.ion-tshirt:before,.ion-tshirt-outline:before,.ion-umbrella:before,.ion-university:before,.ion-unlocked:before,.ion-upload:before,.ion-usb:before,.ion-videocamera:before,.ion-volume-high:before,.ion-volume-low:before,.ion-volume-medium:before,.ion-volume-mute:before,.ion-wand:before,.ion-waterdrop:before,.ion-wifi:before,.ion-wineglass:before,.ion-woman:before,.ion-wrench:before,.ion-xbox:before{display:inline-block;font-family:"Ionicons";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ion-alert:before{content:"\f101"}.ion-alert-circled:before{content:"\f100"}.ion-android-add:before{content:"\f2c7"}.ion-android-add-circle:before{content:"\f359"}.ion-android-alarm-clock:before{content:"\f35a"}.ion-android-alert:before{content:"\f35b"}.ion-android-apps:before{content:"\f35c"}.ion-android-archive:before{content:"\f2c9"}.ion-android-arrow-back:before{content:"\f2ca"}.ion-android-arrow-down:before{content:"\f35d"}.ion-android-arrow-dropdown:before{content:"\f35f"}.ion-android-arrow-dropdown-circle:before{content:"\f35e"}.ion-android-arrow-dropleft:before{content:"\f361"}.ion-android-arrow-dropleft-circle:before{content:"\f360"}.ion-android-arrow-dropright:before{content:"\f363"}.ion-android-arrow-dropright-circle:before{content:"\f362"}.ion-android-arrow-dropup:before{content:"\f365"}.ion-android-arrow-dropup-circle:before{content:"\f364"}.ion-android-arrow-forward:before{content:"\f30f"}.ion-android-arrow-up:before{content:"\f366"}.ion-android-attach:before{content:"\f367"}.ion-android-bar:before{content:"\f368"}.ion-android-bicycle:before{content:"\f369"}.ion-android-boat:before{content:"\f36a"}.ion-android-bookmark:before{content:"\f36b"}.ion-android-bulb:before{content:"\f36c"}.ion-android-bus:before{content:"\f36d"}.ion-android-calendar:before{content:"\f2d1"}.ion-android-call:before{content:"\f2d2"}.ion-android-camera:before{content:"\f2d3"}.ion-android-cancel:before{content:"\f36e"}.ion-android-car:before{content:"\f36f"}.ion-android-cart:before{content:"\f370"}.ion-android-chat:before{content:"\f2d4"}.ion-android-checkbox:before{content:"\f374"}.ion-android-checkbox-blank:before{content:"\f371"}.ion-android-checkbox-outline:before{content:"\f373"}.ion-android-checkbox-outline-blank:before{content:"\f372"}.ion-android-checkmark-circle:before{content:"\f375"}.ion-android-clipboard:before{content:"\f376"}.ion-android-close:before{content:"\f2d7"}.ion-android-cloud:before{content:"\f37a"}.ion-android-cloud-circle:before{content:"\f377"}.ion-android-cloud-done:before{content:"\f378"}.ion-android-cloud-outline:before{content:"\f379"}.ion-android-color-palette:before{content:"\f37b"}.ion-android-compass:before{content:"\f37c"}.ion-android-contact:before{content:"\f2d8"}.ion-android-contacts:before{content:"\f2d9"}.ion-android-contract:before{content:"\f37d"}.ion-android-create:before{content:"\f37e"}.ion-android-delete:before{content:"\f37f"}.ion-android-desktop:before{content:"\f380"}.ion-android-document:before{content:"\f381"}.ion-android-done:before{content:"\f383"}.ion-android-done-all:before{content:"\f382"}.ion-android-download:before{content:"\f2dd"}.ion-android-drafts:before{content:"\f384"}.ion-android-exit:before{content:"\f385"}.ion-android-expand:before{content:"\f386"}.ion-android-favorite:before{content:"\f388"}.ion-android-favorite-outline:before{content:"\f387"}.ion-android-film:before{content:"\f389"}.ion-android-folder:before{content:"\f2e0"}.ion-android-folder-open:before{content:"\f38a"}.ion-android-funnel:before{content:"\f38b"}.ion-android-globe:before{content:"\f38c"}.ion-android-hand:before{content:"\f2e3"}.ion-android-hangout:before{content:"\f38d"}.ion-android-happy:before{content:"\f38e"}.ion-android-home:before{content:"\f38f"}.ion-android-image:before{content:"\f2e4"}.ion-android-laptop:before{content:"\f390"}.ion-android-list:before{content:"\f391"}.ion-android-locate:before{content:"\f2e9"}.ion-android-lock:before{content:"\f392"}.ion-android-mail:before{content:"\f2eb"}.ion-android-map:before{content:"\f393"}.ion-android-menu:before{content:"\f394"}.ion-android-microphone:before{content:"\f2ec"}.ion-android-microphone-off:before{content:"\f395"}.ion-android-more-horizontal:before{content:"\f396"}.ion-android-more-vertical:before{content:"\f397"}.ion-android-navigate:before{content:"\f398"}.ion-android-notifications:before{content:"\f39b"}.ion-android-notifications-none:before{content:"\f399"}.ion-android-notifications-off:before{content:"\f39a"}.ion-android-open:before{content:"\f39c"}.ion-android-options:before{content:"\f39d"}.ion-android-people:before{content:"\f39e"}.ion-android-person:before{content:"\f3a0"}.ion-android-person-add:before{content:"\f39f"}.ion-android-phone-landscape:before{content:"\f3a1"}.ion-android-phone-portrait:before{content:"\f3a2"}.ion-android-pin:before{content:"\f3a3"}.ion-android-plane:before{content:"\f3a4"}.ion-android-playstore:before{content:"\f2f0"}.ion-android-print:before{content:"\f3a5"}.ion-android-radio-button-off:before{content:"\f3a6"}.ion-android-radio-button-on:before{content:"\f3a7"}.ion-android-refresh:before{content:"\f3a8"}.ion-android-remove:before{content:"\f2f4"}.ion-android-remove-circle:before{content:"\f3a9"}.ion-android-restaurant:before{content:"\f3aa"}.ion-android-sad:before{content:"\f3ab"}.ion-android-search:before{content:"\f2f5"}.ion-android-send:before{content:"\f2f6"}.ion-android-settings:before{content:"\f2f7"}.ion-android-share:before{content:"\f2f8"}.ion-android-share-alt:before{content:"\f3ac"}.ion-android-star:before{content:"\f2fc"}.ion-android-star-half:before{content:"\f3ad"}.ion-android-star-outline:before{content:"\f3ae"}.ion-android-stopwatch:before{content:"\f2fd"}.ion-android-subway:before{content:"\f3af"}.ion-android-sunny:before{content:"\f3b0"}.ion-android-sync:before{content:"\f3b1"}.ion-android-textsms:before{content:"\f3b2"}.ion-android-time:before{content:"\f3b3"}.ion-android-train:before{content:"\f3b4"}.ion-android-unlock:before{content:"\f3b5"}.ion-android-upload:before{content:"\f3b6"}.ion-android-volume-down:before{content:"\f3b7"}.ion-android-volume-mute:before{content:"\f3b8"}.ion-android-volume-off:before{content:"\f3b9"}.ion-android-volume-up:before{content:"\f3ba"}.ion-android-walk:before{content:"\f3bb"}.ion-android-warning:before{content:"\f3bc"}.ion-android-watch:before{content:"\f3bd"}.ion-android-wifi:before{content:"\f305"}.ion-aperture:before{content:"\f313"}.ion-archive:before{content:"\f102"}.ion-arrow-down-a:before{content:"\f103"}.ion-arrow-down-b:before{content:"\f104"}.ion-arrow-down-c:before{content:"\f105"}.ion-arrow-expand:before{content:"\f25e"}.ion-arrow-graph-down-left:before{content:"\f25f"}.ion-arrow-graph-down-right:before{content:"\f260"}.ion-arrow-graph-up-left:before{content:"\f261"}.ion-arrow-graph-up-right:before{content:"\f262"}.ion-arrow-left-a:before{content:"\f106"}.ion-arrow-left-b:before{content:"\f107"}.ion-arrow-left-c:before{content:"\f108"}.ion-arrow-move:before{content:"\f263"}.ion-arrow-resize:before{content:"\f264"}.ion-arrow-return-left:before{content:"\f265"}.ion-arrow-return-right:before{content:"\f266"}.ion-arrow-right-a:before{content:"\f109"}.ion-arrow-right-b:before{content:"\f10a"}.ion-arrow-right-c:before{content:"\f10b"}.ion-arrow-shrink:before{content:"\f267"}.ion-arrow-swap:before{content:"\f268"}.ion-arrow-up-a:before{content:"\f10c"}.ion-arrow-up-b:before{content:"\f10d"}.ion-arrow-up-c:before{content:"\f10e"}.ion-asterisk:before{content:"\f314"}.ion-at:before{content:"\f10f"}.ion-backspace:before{content:"\f3bf"}.ion-backspace-outline:before{content:"\f3be"}.ion-bag:before{content:"\f110"}.ion-battery-charging:before{content:"\f111"}.ion-battery-empty:before{content:"\f112"}.ion-battery-full:before{content:"\f113"}.ion-battery-half:before{content:"\f114"}.ion-battery-low:before{content:"\f115"}.ion-beaker:before{content:"\f269"}.ion-beer:before{content:"\f26a"}.ion-bluetooth:before{content:"\f116"}.ion-bonfire:before{content:"\f315"}.ion-bookmark:before{content:"\f26b"}.ion-bowtie:before{content:"\f3c0"}.ion-briefcase:before{content:"\f26c"}.ion-bug:before{content:"\f2be"}.ion-calculator:before{content:"\f26d"}.ion-calendar:before{content:"\f117"}.ion-camera:before{content:"\f118"}.ion-card:before{content:"\f119"}.ion-cash:before{content:"\f316"}.ion-chatbox:before{content:"\f11b"}.ion-chatbox-working:before{content:"\f11a"}.ion-chatboxes:before{content:"\f11c"}.ion-chatbubble:before{content:"\f11e"}.ion-chatbubble-working:before{content:"\f11d"}.ion-chatbubbles:before{content:"\f11f"}.ion-checkmark:before{content:"\f122"}.ion-checkmark-circled:before{content:"\f120"}.ion-checkmark-round:before{content:"\f121"}.ion-chevron-down:before{content:"\f123"}.ion-chevron-left:before{content:"\f124"}.ion-chevron-right:before{content:"\f125"}.ion-chevron-up:before{content:"\f126"}.ion-clipboard:before{content:"\f127"}.ion-clock:before{content:"\f26e"}.ion-close:before{content:"\f12a"}.ion-close-circled:before{content:"\f128"}.ion-close-round:before{content:"\f129"}.ion-closed-captioning:before{content:"\f317"}.ion-cloud:before{content:"\f12b"}.ion-code:before{content:"\f271"}.ion-code-download:before{content:"\f26f"}.ion-code-working:before{content:"\f270"}.ion-coffee:before{content:"\f272"}.ion-compass:before{content:"\f273"}.ion-compose:before{content:"\f12c"}.ion-connection-bars:before{content:"\f274"}.ion-contrast:before{content:"\f275"}.ion-crop:before{content:"\f3c1"}.ion-cube:before{content:"\f318"}.ion-disc:before{content:"\f12d"}.ion-document:before{content:"\f12f"}.ion-document-text:before{content:"\f12e"}.ion-drag:before{content:"\f130"}.ion-earth:before{content:"\f276"}.ion-easel:before{content:"\f3c2"}.ion-edit:before{content:"\f2bf"}.ion-egg:before{content:"\f277"}.ion-eject:before{content:"\f131"}.ion-email:before{content:"\f132"}.ion-email-unread:before{content:"\f3c3"}.ion-erlenmeyer-flask:before{content:"\f3c5"}.ion-erlenmeyer-flask-bubbles:before{content:"\f3c4"}.ion-eye:before{content:"\f133"}.ion-eye-disabled:before{content:"\f306"}.ion-female:before{content:"\f278"}.ion-filing:before{content:"\f134"}.ion-film-marker:before{content:"\f135"}.ion-fireball:before{content:"\f319"}.ion-flag:before{content:"\f279"}.ion-flame:before{content:"\f31a"}.ion-flash:before{content:"\f137"}.ion-flash-off:before{content:"\f136"}.ion-folder:before{content:"\f139"}.ion-fork:before{content:"\f27a"}.ion-fork-repo:before{content:"\f2c0"}.ion-forward:before{content:"\f13a"}.ion-funnel:before{content:"\f31b"}.ion-gear-a:before{content:"\f13d"}.ion-gear-b:before{content:"\f13e"}.ion-grid:before{content:"\f13f"}.ion-hammer:before{content:"\f27b"}.ion-happy:before{content:"\f31c"}.ion-happy-outline:before{content:"\f3c6"}.ion-headphone:before{content:"\f140"}.ion-heart:before{content:"\f141"}.ion-heart-broken:before{content:"\f31d"}.ion-help:before{content:"\f143"}.ion-help-buoy:before{content:"\f27c"}.ion-help-circled:before{content:"\f142"}.ion-home:before{content:"\f144"}.ion-icecream:before{content:"\f27d"}.ion-image:before{content:"\f147"}.ion-images:before{content:"\f148"}.ion-information:before{content:"\f14a"}.ion-information-circled:before{content:"\f149"}.ion-ionic:before{content:"\f14b"}.ion-ios-alarm:before{content:"\f3c8"}.ion-ios-alarm-outline:before{content:"\f3c7"}.ion-ios-albums:before{content:"\f3ca"}.ion-ios-albums-outline:before{content:"\f3c9"}.ion-ios-americanfootball:before{content:"\f3cc"}.ion-ios-americanfootball-outline:before{content:"\f3cb"}.ion-ios-analytics:before{content:"\f3ce"}.ion-ios-analytics-outline:before{content:"\f3cd"}.ion-ios-arrow-back:before{content:"\f3cf"}.ion-ios-arrow-down:before{content:"\f3d0"}.ion-ios-arrow-forward:before{content:"\f3d1"}.ion-ios-arrow-left:before{content:"\f3d2"}.ion-ios-arrow-right:before{content:"\f3d3"}.ion-ios-arrow-thin-down:before{content:"\f3d4"}.ion-ios-arrow-thin-left:before{content:"\f3d5"}.ion-ios-arrow-thin-right:before{content:"\f3d6"}.ion-ios-arrow-thin-up:before{content:"\f3d7"}.ion-ios-arrow-up:before{content:"\f3d8"}.ion-ios-at:before{content:"\f3da"}.ion-ios-at-outline:before{content:"\f3d9"}.ion-ios-barcode:before{content:"\f3dc"}.ion-ios-barcode-outline:before{content:"\f3db"}.ion-ios-baseball:before{content:"\f3de"}.ion-ios-baseball-outline:before{content:"\f3dd"}.ion-ios-basketball:before{content:"\f3e0"}.ion-ios-basketball-outline:before{content:"\f3df"}.ion-ios-bell:before{content:"\f3e2"}.ion-ios-bell-outline:before{content:"\f3e1"}.ion-ios-body:before{content:"\f3e4"}.ion-ios-body-outline:before{content:"\f3e3"}.ion-ios-bolt:before{content:"\f3e6"}.ion-ios-bolt-outline:before{content:"\f3e5"}.ion-ios-book:before{content:"\f3e8"}.ion-ios-book-outline:before{content:"\f3e7"}.ion-ios-bookmarks:before{content:"\f3ea"}.ion-ios-bookmarks-outline:before{content:"\f3e9"}.ion-ios-box:before{content:"\f3ec"}.ion-ios-box-outline:before{content:"\f3eb"}.ion-ios-briefcase:before{content:"\f3ee"}.ion-ios-briefcase-outline:before{content:"\f3ed"}.ion-ios-browsers:before{content:"\f3f0"}.ion-ios-browsers-outline:before{content:"\f3ef"}.ion-ios-calculator:before{content:"\f3f2"}.ion-ios-calculator-outline:before{content:"\f3f1"}.ion-ios-calendar:before{content:"\f3f4"}.ion-ios-calendar-outline:before{content:"\f3f3"}.ion-ios-camera:before{content:"\f3f6"}.ion-ios-camera-outline:before{content:"\f3f5"}.ion-ios-cart:before{content:"\f3f8"}.ion-ios-cart-outline:before{content:"\f3f7"}.ion-ios-chatboxes:before{content:"\f3fa"}.ion-ios-chatboxes-outline:before{content:"\f3f9"}.ion-ios-chatbubble:before{content:"\f3fc"}.ion-ios-chatbubble-outline:before{content:"\f3fb"}.ion-ios-checkmark:before{content:"\f3ff"}.ion-ios-checkmark-empty:before{content:"\f3fd"}.ion-ios-checkmark-outline:before{content:"\f3fe"}.ion-ios-circle-filled:before{content:"\f400"}.ion-ios-circle-outline:before{content:"\f401"}.ion-ios-clock:before{content:"\f403"}.ion-ios-clock-outline:before{content:"\f402"}.ion-ios-close:before{content:"\f406"}.ion-ios-close-empty:before{content:"\f404"}.ion-ios-close-outline:before{content:"\f405"}.ion-ios-cloud:before{content:"\f40c"}.ion-ios-cloud-download:before{content:"\f408"}.ion-ios-cloud-download-outline:before{content:"\f407"}.ion-ios-cloud-outline:before{content:"\f409"}.ion-ios-cloud-upload:before{content:"\f40b"}.ion-ios-cloud-upload-outline:before{content:"\f40a"}.ion-ios-cloudy:before{content:"\f410"}.ion-ios-cloudy-night:before{content:"\f40e"}.ion-ios-cloudy-night-outline:before{content:"\f40d"}.ion-ios-cloudy-outline:before{content:"\f40f"}.ion-ios-cog:before{content:"\f412"}.ion-ios-cog-outline:before{content:"\f411"}.ion-ios-color-filter:before{content:"\f414"}.ion-ios-color-filter-outline:before{content:"\f413"}.ion-ios-color-wand:before{content:"\f416"}.ion-ios-color-wand-outline:before{content:"\f415"}.ion-ios-compose:before{content:"\f418"}.ion-ios-compose-outline:before{content:"\f417"}.ion-ios-contact:before{content:"\f41a"}.ion-ios-contact-outline:before{content:"\f419"}.ion-ios-copy:before{content:"\f41c"}.ion-ios-copy-outline:before{content:"\f41b"}.ion-ios-crop:before{content:"\f41e"}.ion-ios-crop-strong:before{content:"\f41d"}.ion-ios-download:before{content:"\f420"}.ion-ios-download-outline:before{content:"\f41f"}.ion-ios-drag:before{content:"\f421"}.ion-ios-email:before{content:"\f423"}.ion-ios-email-outline:before{content:"\f422"}.ion-ios-eye:before{content:"\f425"}.ion-ios-eye-outline:before{content:"\f424"}.ion-ios-fastforward:before{content:"\f427"}.ion-ios-fastforward-outline:before{content:"\f426"}.ion-ios-filing:before{content:"\f429"}.ion-ios-filing-outline:before{content:"\f428"}.ion-ios-film:before{content:"\f42b"}.ion-ios-film-outline:before{content:"\f42a"}.ion-ios-flag:before{content:"\f42d"}.ion-ios-flag-outline:before{content:"\f42c"}.ion-ios-flame:before{content:"\f42f"}.ion-ios-flame-outline:before{content:"\f42e"}.ion-ios-flask:before{content:"\f431"}.ion-ios-flask-outline:before{content:"\f430"}.ion-ios-flower:before{content:"\f433"}.ion-ios-flower-outline:before{content:"\f432"}.ion-ios-folder:before{content:"\f435"}.ion-ios-folder-outline:before{content:"\f434"}.ion-ios-football:before{content:"\f437"}.ion-ios-football-outline:before{content:"\f436"}.ion-ios-game-controller-a:before{content:"\f439"}.ion-ios-game-controller-a-outline:before{content:"\f438"}.ion-ios-game-controller-b:before{content:"\f43b"}.ion-ios-game-controller-b-outline:before{content:"\f43a"}.ion-ios-gear:before{content:"\f43d"}.ion-ios-gear-outline:before{content:"\f43c"}.ion-ios-glasses:before{content:"\f43f"}.ion-ios-glasses-outline:before{content:"\f43e"}.ion-ios-grid-view:before{content:"\f441"}.ion-ios-grid-view-outline:before{content:"\f440"}.ion-ios-heart:before{content:"\f443"}.ion-ios-heart-outline:before{content:"\f442"}.ion-ios-help:before{content:"\f446"}.ion-ios-help-empty:before{content:"\f444"}.ion-ios-help-outline:before{content:"\f445"}.ion-ios-home:before{content:"\f448"}.ion-ios-home-outline:before{content:"\f447"}.ion-ios-infinite:before{content:"\f44a"}.ion-ios-infinite-outline:before{content:"\f449"}.ion-ios-information:before{content:"\f44d"}.ion-ios-information-empty:before{content:"\f44b"}.ion-ios-information-outline:before{content:"\f44c"}.ion-ios-ionic-outline:before{content:"\f44e"}.ion-ios-keypad:before{content:"\f450"}.ion-ios-keypad-outline:before{content:"\f44f"}.ion-ios-lightbulb:before{content:"\f452"}.ion-ios-lightbulb-outline:before{content:"\f451"}.ion-ios-list:before{content:"\f454"}.ion-ios-list-outline:before{content:"\f453"}.ion-ios-location:before{content:"\f456"}.ion-ios-location-outline:before{content:"\f455"}.ion-ios-locked:before{content:"\f458"}.ion-ios-locked-outline:before{content:"\f457"}.ion-ios-loop:before{content:"\f45a"}.ion-ios-loop-strong:before{content:"\f459"}.ion-ios-medical:before{content:"\f45c"}.ion-ios-medical-outline:before{content:"\f45b"}.ion-ios-medkit:before{content:"\f45e"}.ion-ios-medkit-outline:before{content:"\f45d"}.ion-ios-mic:before{content:"\f461"}.ion-ios-mic-off:before{content:"\f45f"}.ion-ios-mic-outline:before{content:"\f460"}.ion-ios-minus:before{content:"\f464"}.ion-ios-minus-empty:before{content:"\f462"}.ion-ios-minus-outline:before{content:"\f463"}.ion-ios-monitor:before{content:"\f466"}.ion-ios-monitor-outline:before{content:"\f465"}.ion-ios-moon:before{content:"\f468"}.ion-ios-moon-outline:before{content:"\f467"}.ion-ios-more:before{content:"\f46a"}.ion-ios-more-outline:before{content:"\f469"}.ion-ios-musical-note:before{content:"\f46b"}.ion-ios-musical-notes:before{content:"\f46c"}.ion-ios-navigate:before{content:"\f46e"}.ion-ios-navigate-outline:before{content:"\f46d"}.ion-ios-nutrition:before{content:"\f470"}.ion-ios-nutrition-outline:before{content:"\f46f"}.ion-ios-paper:before{content:"\f472"}.ion-ios-paper-outline:before{content:"\f471"}.ion-ios-paperplane:before{content:"\f474"}.ion-ios-paperplane-outline:before{content:"\f473"}.ion-ios-partlysunny:before{content:"\f476"}.ion-ios-partlysunny-outline:before{content:"\f475"}.ion-ios-pause:before{content:"\f478"}.ion-ios-pause-outline:before{content:"\f477"}.ion-ios-paw:before{content:"\f47a"}.ion-ios-paw-outline:before{content:"\f479"}.ion-ios-people:before{content:"\f47c"}.ion-ios-people-outline:before{content:"\f47b"}.ion-ios-person:before{content:"\f47e"}.ion-ios-person-outline:before{content:"\f47d"}.ion-ios-personadd:before{content:"\f480"}.ion-ios-personadd-outline:before{content:"\f47f"}.ion-ios-photos:before{content:"\f482"}.ion-ios-photos-outline:before{content:"\f481"}.ion-ios-pie:before{content:"\f484"}.ion-ios-pie-outline:before{content:"\f483"}.ion-ios-pint:before{content:"\f486"}.ion-ios-pint-outline:before{content:"\f485"}.ion-ios-play:before{content:"\f488"}.ion-ios-play-outline:before{content:"\f487"}.ion-ios-plus:before{content:"\f48b"}.ion-ios-plus-empty:before{content:"\f489"}.ion-ios-plus-outline:before{content:"\f48a"}.ion-ios-pricetag:before{content:"\f48d"}.ion-ios-pricetag-outline:before{content:"\f48c"}.ion-ios-pricetags:before{content:"\f48f"}.ion-ios-pricetags-outline:before{content:"\f48e"}.ion-ios-printer:before{content:"\f491"}.ion-ios-printer-outline:before{content:"\f490"}.ion-ios-pulse:before{content:"\f493"}.ion-ios-pulse-strong:before{content:"\f492"}.ion-ios-rainy:before{content:"\f495"}.ion-ios-rainy-outline:before{content:"\f494"}.ion-ios-recording:before{content:"\f497"}.ion-ios-recording-outline:before{content:"\f496"}.ion-ios-redo:before{content:"\f499"}.ion-ios-redo-outline:before{content:"\f498"}.ion-ios-refresh:before{content:"\f49c"}.ion-ios-refresh-empty:before{content:"\f49a"}.ion-ios-refresh-outline:before{content:"\f49b"}.ion-ios-reload:before{content:"\f49d"}.ion-ios-reverse-camera:before{content:"\f49f"}.ion-ios-reverse-camera-outline:before{content:"\f49e"}.ion-ios-rewind:before{content:"\f4a1"}.ion-ios-rewind-outline:before{content:"\f4a0"}.ion-ios-rose:before{content:"\f4a3"}.ion-ios-rose-outline:before{content:"\f4a2"}.ion-ios-search:before{content:"\f4a5"}.ion-ios-search-strong:before{content:"\f4a4"}.ion-ios-settings:before{content:"\f4a7"}.ion-ios-settings-strong:before{content:"\f4a6"}.ion-ios-shuffle:before{content:"\f4a9"}.ion-ios-shuffle-strong:before{content:"\f4a8"}.ion-ios-skipbackward:before{content:"\f4ab"}.ion-ios-skipbackward-outline:before{content:"\f4aa"}.ion-ios-skipforward:before{content:"\f4ad"}.ion-ios-skipforward-outline:before{content:"\f4ac"}.ion-ios-snowy:before{content:"\f4ae"}.ion-ios-speedometer:before{content:"\f4b0"}.ion-ios-speedometer-outline:before{content:"\f4af"}.ion-ios-star:before{content:"\f4b3"}.ion-ios-star-half:before{content:"\f4b1"}.ion-ios-star-outline:before{content:"\f4b2"}.ion-ios-stopwatch:before{content:"\f4b5"}.ion-ios-stopwatch-outline:before{content:"\f4b4"}.ion-ios-sunny:before{content:"\f4b7"}.ion-ios-sunny-outline:before{content:"\f4b6"}.ion-ios-telephone:before{content:"\f4b9"}.ion-ios-telephone-outline:before{content:"\f4b8"}.ion-ios-tennisball:before{content:"\f4bb"}.ion-ios-tennisball-outline:before{content:"\f4ba"}.ion-ios-thunderstorm:before{content:"\f4bd"}.ion-ios-thunderstorm-outline:before{content:"\f4bc"}.ion-ios-time:before{content:"\f4bf"}.ion-ios-time-outline:before{content:"\f4be"}.ion-ios-timer:before{content:"\f4c1"}.ion-ios-timer-outline:before{content:"\f4c0"}.ion-ios-toggle:before{content:"\f4c3"}.ion-ios-toggle-outline:before{content:"\f4c2"}.ion-ios-trash:before{content:"\f4c5"}.ion-ios-trash-outline:before{content:"\f4c4"}.ion-ios-undo:before{content:"\f4c7"}.ion-ios-undo-outline:before{content:"\f4c6"}.ion-ios-unlocked:before{content:"\f4c9"}.ion-ios-unlocked-outline:before{content:"\f4c8"}.ion-ios-upload:before{content:"\f4cb"}.ion-ios-upload-outline:before{content:"\f4ca"}.ion-ios-videocam:before{content:"\f4cd"}.ion-ios-videocam-outline:before{content:"\f4cc"}.ion-ios-volume-high:before{content:"\f4ce"}.ion-ios-volume-low:before{content:"\f4cf"}.ion-ios-wineglass:before{content:"\f4d1"}.ion-ios-wineglass-outline:before{content:"\f4d0"}.ion-ios-world:before{content:"\f4d3"}.ion-ios-world-outline:before{content:"\f4d2"}.ion-ipad:before{content:"\f1f9"}.ion-iphone:before{content:"\f1fa"}.ion-ipod:before{content:"\f1fb"}.ion-jet:before{content:"\f295"}.ion-key:before{content:"\f296"}.ion-knife:before{content:"\f297"}.ion-laptop:before{content:"\f1fc"}.ion-leaf:before{content:"\f1fd"}.ion-levels:before{content:"\f298"}.ion-lightbulb:before{content:"\f299"}.ion-link:before{content:"\f1fe"}.ion-load-a:before{content:"\f29a"}.ion-load-b:before{content:"\f29b"}.ion-load-c:before{content:"\f29c"}.ion-load-d:before{content:"\f29d"}.ion-location:before{content:"\f1ff"}.ion-lock-combination:before{content:"\f4d4"}.ion-locked:before{content:"\f200"}.ion-log-in:before{content:"\f29e"}.ion-log-out:before{content:"\f29f"}.ion-loop:before{content:"\f201"}.ion-magnet:before{content:"\f2a0"}.ion-male:before{content:"\f2a1"}.ion-man:before{content:"\f202"}.ion-map:before{content:"\f203"}.ion-medkit:before{content:"\f2a2"}.ion-merge:before{content:"\f33f"}.ion-mic-a:before{content:"\f204"}.ion-mic-b:before{content:"\f205"}.ion-mic-c:before{content:"\f206"}.ion-minus:before{content:"\f209"}.ion-minus-circled:before{content:"\f207"}.ion-minus-round:before{content:"\f208"}.ion-model-s:before{content:"\f2c1"}.ion-monitor:before{content:"\f20a"}.ion-more:before{content:"\f20b"}.ion-mouse:before{content:"\f340"}.ion-music-note:before{content:"\f20c"}.ion-navicon:before{content:"\f20e"}.ion-navicon-round:before{content:"\f20d"}.ion-navigate:before{content:"\f2a3"}.ion-network:before{content:"\f341"}.ion-no-smoking:before{content:"\f2c2"}.ion-nuclear:before{content:"\f2a4"}.ion-outlet:before{content:"\f342"}.ion-paintbrush:before{content:"\f4d5"}.ion-paintbucket:before{content:"\f4d6"}.ion-paper-airplane:before{content:"\f2c3"}.ion-paperclip:before{content:"\f20f"}.ion-pause:before{content:"\f210"}.ion-person:before{content:"\f213"}.ion-person-add:before{content:"\f211"}.ion-person-stalker:before{content:"\f212"}.ion-pie-graph:before{content:"\f2a5"}.ion-pin:before{content:"\f2a6"}.ion-pinpoint:before{content:"\f2a7"}.ion-pizza:before{content:"\f2a8"}.ion-plane:before{content:"\f214"}.ion-planet:before{content:"\f343"}.ion-play:before{content:"\f215"}.ion-playstation:before{content:"\f30a"}.ion-plus:before{content:"\f218"}.ion-plus-circled:before{content:"\f216"}.ion-plus-round:before{content:"\f217"}.ion-podium:before{content:"\f344"}.ion-pound:before{content:"\f219"}.ion-power:before{content:"\f2a9"}.ion-pricetag:before{content:"\f2aa"}.ion-pricetags:before{content:"\f2ab"}.ion-printer:before{content:"\f21a"}.ion-pull-request:before{content:"\f345"}.ion-qr-scanner:before{content:"\f346"}.ion-quote:before{content:"\f347"}.ion-radio-waves:before{content:"\f2ac"}.ion-record:before{content:"\f21b"}.ion-refresh:before{content:"\f21c"}.ion-reply:before{content:"\f21e"}.ion-reply-all:before{content:"\f21d"}.ion-ribbon-a:before{content:"\f348"}.ion-ribbon-b:before{content:"\f349"}.ion-sad:before{content:"\f34a"}.ion-sad-outline:before{content:"\f4d7"}.ion-scissors:before{content:"\f34b"}.ion-search:before{content:"\f21f"}.ion-settings:before{content:"\f2ad"}.ion-share:before{content:"\f220"}.ion-shuffle:before{content:"\f221"}.ion-skip-backward:before{content:"\f222"}.ion-skip-forward:before{content:"\f223"}.ion-social-android:before{content:"\f225"}.ion-social-android-outline:before{content:"\f224"}.ion-social-angular:before{content:"\f4d9"}.ion-social-angular-outline:before{content:"\f4d8"}.ion-social-apple:before{content:"\f227"}.ion-social-apple-outline:before{content:"\f226"}.ion-social-bitcoin:before{content:"\f2af"}.ion-social-bitcoin-outline:before{content:"\f2ae"}.ion-social-buffer:before{content:"\f229"}.ion-social-buffer-outline:before{content:"\f228"}.ion-social-chrome:before{content:"\f4db"}.ion-social-chrome-outline:before{content:"\f4da"}.ion-social-codepen:before{content:"\f4dd"}.ion-social-codepen-outline:before{content:"\f4dc"}.ion-social-css3:before{content:"\f4df"}.ion-social-css3-outline:before{content:"\f4de"}.ion-social-designernews:before{content:"\f22b"}.ion-social-designernews-outline:before{content:"\f22a"}.ion-social-dribbble:before{content:"\f22d"}.ion-social-dribbble-outline:before{content:"\f22c"}.ion-social-dropbox:before{content:"\f22f"}.ion-social-dropbox-outline:before{content:"\f22e"}.ion-social-euro:before{content:"\f4e1"}.ion-social-euro-outline:before{content:"\f4e0"}.ion-social-facebook:before{content:"\f231"}.ion-social-facebook-outline:before{content:"\f230"}.ion-social-foursquare:before{content:"\f34d"}.ion-social-foursquare-outline:before{content:"\f34c"}.ion-social-freebsd-devil:before{content:"\f2c4"}.ion-social-github:before{content:"\f233"}.ion-social-github-outline:before{content:"\f232"}.ion-social-google:before{content:"\f34f"}.ion-social-google-outline:before{content:"\f34e"}.ion-social-googleplus:before{content:"\f235"}.ion-social-googleplus-outline:before{content:"\f234"}.ion-social-hackernews:before{content:"\f237"}.ion-social-hackernews-outline:before{content:"\f236"}.ion-social-html5:before{content:"\f4e3"}.ion-social-html5-outline:before{content:"\f4e2"}.ion-social-instagram:before{content:"\f351"}.ion-social-instagram-outline:before{content:"\f350"}.ion-social-javascript:before{content:"\f4e5"}.ion-social-javascript-outline:before{content:"\f4e4"}.ion-social-linkedin:before{content:"\f239"}.ion-social-linkedin-outline:before{content:"\f238"}.ion-social-markdown:before{content:"\f4e6"}.ion-social-nodejs:before{content:"\f4e7"}.ion-social-octocat:before{content:"\f4e8"}.ion-social-pinterest:before{content:"\f2b1"}.ion-social-pinterest-outline:before{content:"\f2b0"}.ion-social-python:before{content:"\f4e9"}.ion-social-reddit:before{content:"\f23b"}.ion-social-reddit-outline:before{content:"\f23a"}.ion-social-rss:before{content:"\f23d"}.ion-social-rss-outline:before{content:"\f23c"}.ion-social-sass:before{content:"\f4ea"}.ion-social-skype:before{content:"\f23f"}.ion-social-skype-outline:before{content:"\f23e"}.ion-social-snapchat:before{content:"\f4ec"}.ion-social-snapchat-outline:before{content:"\f4eb"}.ion-social-tumblr:before{content:"\f241"}.ion-social-tumblr-outline:before{content:"\f240"}.ion-social-tux:before{content:"\f2c5"}.ion-social-twitch:before{content:"\f4ee"}.ion-social-twitch-outline:before{content:"\f4ed"}.ion-social-twitter:before{content:"\f243"}.ion-social-twitter-outline:before{content:"\f242"}.ion-social-usd:before{content:"\f353"}.ion-social-usd-outline:before{content:"\f352"}.ion-social-vimeo:before{content:"\f245"}.ion-social-vimeo-outline:before{content:"\f244"}.ion-social-whatsapp:before{content:"\f4f0"}.ion-social-whatsapp-outline:before{content:"\f4ef"}.ion-social-windows:before{content:"\f247"}.ion-social-windows-outline:before{content:"\f246"}.ion-social-wordpress:before{content:"\f249"}.ion-social-wordpress-outline:before{content:"\f248"}.ion-social-yahoo:before{content:"\f24b"}.ion-social-yahoo-outline:before{content:"\f24a"}.ion-social-yen:before{content:"\f4f2"}.ion-social-yen-outline:before{content:"\f4f1"}.ion-social-youtube:before{content:"\f24d"}.ion-social-youtube-outline:before{content:"\f24c"}.ion-soup-can:before{content:"\f4f4"}.ion-soup-can-outline:before{content:"\f4f3"}.ion-speakerphone:before{content:"\f2b2"}.ion-speedometer:before{content:"\f2b3"}.ion-spoon:before{content:"\f2b4"}.ion-star:before{content:"\f24e"}.ion-stats-bars:before{content:"\f2b5"}.ion-steam:before{content:"\f30b"}.ion-stop:before{content:"\f24f"}.ion-thermometer:before{content:"\f2b6"}.ion-thumbsdown:before{content:"\f250"}.ion-thumbsup:before{content:"\f251"}.ion-toggle:before{content:"\f355"}.ion-toggle-filled:before{content:"\f354"}.ion-transgender:before{content:"\f4f5"}.ion-trash-a:before{content:"\f252"}.ion-trash-b:before{content:"\f253"}.ion-trophy:before{content:"\f356"}.ion-tshirt:before{content:"\f4f7"}.ion-tshirt-outline:before{content:"\f4f6"}.ion-umbrella:before{content:"\f2b7"}.ion-university:before{content:"\f357"}.ion-unlocked:before{content:"\f254"}.ion-upload:before{content:"\f255"}.ion-usb:before{content:"\f2b8"}.ion-videocamera:before{content:"\f256"}.ion-volume-high:before{content:"\f257"}.ion-volume-low:before{content:"\f258"}.ion-volume-medium:before{content:"\f259"}.ion-volume-mute:before{content:"\f25a"}.ion-wand:before{content:"\f358"}.ion-waterdrop:before{content:"\f25b"}.ion-wifi:before{content:"\f25c"}.ion-wineglass:before{content:"\f2b9"}.ion-woman:before{content:"\f25d"}.ion-wrench:before{content:"\f2ba"}.ion-xbox:before{content:"\f30c"} \ No newline at end of file diff --git a/assets/jquery-ui.min.js b/assets/jquery-ui.min.js new file mode 100644 index 0000000..7525e71 --- /dev/null +++ b/assets/jquery-ui.min.js @@ -0,0 +1,13 @@ +/*! jQuery UI - v1.11.4 - 2015-03-11 +* http://jqueryui.com +* Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js, menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js, sortable.js, spinner.js, tabs.js, tooltip.js +* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */ + +(function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap='#"+a+"']")[0],!!o&&i(o)):!1):(/^(input|select|textarea|button|object)$/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}function s(e){for(var t,i;e.length&&e[0]!==document;){if(t=e.css("position"),("absolute"===t||"relative"===t||"fixed"===t)&&(i=parseInt(e.css("zIndex"),10),!isNaN(i)&&0!==i))return i;e=e.parent()}return 0}function n(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},e.extend(this._defaults,this.regional[""]),this.regional.en=e.extend(!0,{},this.regional[""]),this.regional["en-US"]=e.extend(!0,{},this.regional.en),this.dpDiv=a(e("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function a(t){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return t.delegate(i,"mouseout",function(){e(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).removeClass("ui-datepicker-next-hover")}).delegate(i,"mouseover",o)}function o(){e.datepicker._isDisabledDatepicker(v.inline?v.dpDiv.parent()[0]:v.input[0])||(e(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),e(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).addClass("ui-datepicker-next-hover"))}function r(t,i){e.extend(t,i);for(var s in i)null==i[s]&&(t[s]=i[s]);return t}function h(e){return function(){var t=this.element.val();e.apply(this,arguments),this._refresh(),t!==this.element.val()&&this._trigger("change")}}e.ui=e.ui||{},e.extend(e.ui,{version:"1.11.4",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({scrollParent:function(t){var i=this.css("position"),s="absolute"===i,n=t?/(auto|scroll|hidden)/:/(auto|scroll)/,a=this.parents().filter(function(){var t=e(this);return s&&"static"===t.css("position")?!1:n.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==i&&a.length?a:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,"tabindex")))},tabbable:function(i){var s=e.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+"px")})},e.fn["outer"+i]=function(t,n){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(e+".ui-disableSelection",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(t){if(void 0!==t)return this.css("zIndex",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var l=0,u=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,"events"),s&&s.remove&&e(n).triggerHandler("remove")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,n=u.call(arguments,1),a=0,o=n.length;o>a;a++)for(i in n[a])s=n[a][i],n[a].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(n){var a="string"==typeof n,o=u.call(arguments,1),r=this;return a?this.each(function(){var i,a=e.data(this,s);return"instance"===n?(r=a,!1):a?e.isFunction(a[n])&&"_"!==n.charAt(0)?(i=a[n].apply(a,o),i!==a&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+n+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+n+"'")}):(o.length&&(n=e.widget.extend.apply(null,[n].concat(o))),this.each(function(){var t=e.data(this,s);t?(t.option(n||{}),t._init&&t._init()):e.data(this,s,new i(n,this))})),r}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=l++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(t,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(i).undelegate(i),this.bindings=e(this.bindings.not(t).get()),this.focusable=e(this.focusable.not(t).get()),this.hoverable=e(this.hoverable.not(t).get())},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget;var d=!1;e(document).mouseup(function(){d=!1}),e.widget("ui.mouse",{version:"1.11.4",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!d){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var i=this,s=1===t.which,n="string"==typeof this.options.cancel&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(t)!==!1,!this._mouseStarted)?(t.preventDefault(),!0):(!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return i._mouseMove(e)},this._mouseUpDelegate=function(e){return i._mouseUp(e)},this.document.bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),d=!0,!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button)return this._mouseUp(t);if(!t.which)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){return this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),d=!1,!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),function(){function t(e,t,i){return[parseFloat(e[0])*(p.test(e[0])?t/100:1),parseFloat(e[1])*(p.test(e[1])?i/100:1)]}function i(t,i){return parseInt(e.css(t,i),10)||0}function s(t){var i=t[0];return 9===i.nodeType?{width:t.width(),height:t.height(),offset:{top:0,left:0}}:e.isWindow(i)?{width:t.width(),height:t.height(),offset:{top:t.scrollTop(),left:t.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:t.outerWidth(),height:t.outerHeight(),offset:t.offset()}}e.ui=e.ui||{};var n,a,o=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,u=/top|center|bottom/,d=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,p=/%$/,f=e.fn.position;e.position={scrollbarWidth:function(){if(void 0!==n)return n;var t,i,s=e("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),a=s.children()[0];return e("body").append(s),t=a.offsetWidth,s.css("overflow","scroll"),i=a.offsetWidth,t===i&&(i=s[0].clientWidth),s.remove(),n=t-i},getScrollInfo:function(t){var i=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),s=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),n="scroll"===i||"auto"===i&&t.width<t.element[0].scrollWidth,a="scroll"===s||"auto"===s&&t.height<t.element[0].scrollHeight;return{width:a?e.position.scrollbarWidth():0,height:n?e.position.scrollbarWidth():0}},getWithinInfo:function(t){var i=e(t||window),s=e.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType;return{element:i,isWindow:s,isDocument:n,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s||n?i.width():i.outerWidth(),height:s||n?i.height():i.outerHeight()}}},e.fn.position=function(n){if(!n||!n.of)return f.apply(this,arguments);n=e.extend({},n);var p,m,g,v,y,b,_=e(n.of),x=e.position.getWithinInfo(n.within),w=e.position.getScrollInfo(x),k=(n.collision||"flip").split(" "),T={};return b=s(_),_[0].preventDefault&&(n.at="left top"),m=b.width,g=b.height,v=b.offset,y=e.extend({},v),e.each(["my","at"],function(){var e,t,i=(n[this]||"").split(" ");1===i.length&&(i=l.test(i[0])?i.concat(["center"]):u.test(i[0])?["center"].concat(i):["center","center"]),i[0]=l.test(i[0])?i[0]:"center",i[1]=u.test(i[1])?i[1]:"center",e=d.exec(i[0]),t=d.exec(i[1]),T[this]=[e?e[0]:0,t?t[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===k.length&&(k[1]=k[0]),"right"===n.at[0]?y.left+=m:"center"===n.at[0]&&(y.left+=m/2),"bottom"===n.at[1]?y.top+=g:"center"===n.at[1]&&(y.top+=g/2),p=t(T.at,m,g),y.left+=p[0],y.top+=p[1],this.each(function(){var s,l,u=e(this),d=u.outerWidth(),c=u.outerHeight(),f=i(this,"marginLeft"),b=i(this,"marginTop"),D=d+f+i(this,"marginRight")+w.width,S=c+b+i(this,"marginBottom")+w.height,M=e.extend({},y),C=t(T.my,u.outerWidth(),u.outerHeight());"right"===n.my[0]?M.left-=d:"center"===n.my[0]&&(M.left-=d/2),"bottom"===n.my[1]?M.top-=c:"center"===n.my[1]&&(M.top-=c/2),M.left+=C[0],M.top+=C[1],a||(M.left=h(M.left),M.top=h(M.top)),s={marginLeft:f,marginTop:b},e.each(["left","top"],function(t,i){e.ui.position[k[t]]&&e.ui.position[k[t]][i](M,{targetWidth:m,targetHeight:g,elemWidth:d,elemHeight:c,collisionPosition:s,collisionWidth:D,collisionHeight:S,offset:[p[0]+C[0],p[1]+C[1]],my:n.my,at:n.at,within:x,elem:u})}),n.using&&(l=function(e){var t=v.left-M.left,i=t+m-d,s=v.top-M.top,a=s+g-c,h={target:{element:_,left:v.left,top:v.top,width:m,height:g},element:{element:u,left:M.left,top:M.top,width:d,height:c},horizontal:0>i?"left":t>0?"right":"center",vertical:0>a?"top":s>0?"bottom":"middle"};d>m&&m>r(t+i)&&(h.horizontal="center"),c>g&&g>r(s+a)&&(h.vertical="middle"),h.important=o(r(t),r(i))>o(r(s),r(a))?"horizontal":"vertical",n.using.call(this,e,h)}),u.offset(e.extend(M,{using:l}))})},e.ui.position={fit:{left:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=e.left-t.collisionPosition.marginLeft,h=n-r,l=r+t.collisionWidth-a-n;t.collisionWidth>a?h>0&&0>=l?(i=e.left+h+t.collisionWidth-a-n,e.left+=h-i):e.left=l>0&&0>=h?n:h>l?n+a-t.collisionWidth:n:h>0?e.left+=h:l>0?e.left-=l:e.left=o(e.left-r,e.left)},top:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollTop:s.offset.top,a=t.within.height,r=e.top-t.collisionPosition.marginTop,h=n-r,l=r+t.collisionHeight-a-n;t.collisionHeight>a?h>0&&0>=l?(i=e.top+h+t.collisionHeight-a-n,e.top+=h-i):e.top=l>0&&0>=h?n:h>l?n+a-t.collisionHeight:n:h>0?e.top+=h:l>0?e.top-=l:e.top=o(e.top-r,e.top)}},flip:{left:function(e,t){var i,s,n=t.within,a=n.offset.left+n.scrollLeft,o=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=e.left-t.collisionPosition.marginLeft,u=l-h,d=l+t.collisionWidth-o-h,c="left"===t.my[0]?-t.elemWidth:"right"===t.my[0]?t.elemWidth:0,p="left"===t.at[0]?t.targetWidth:"right"===t.at[0]?-t.targetWidth:0,f=-2*t.offset[0];0>u?(i=e.left+c+p+f+t.collisionWidth-o-a,(0>i||r(u)>i)&&(e.left+=c+p+f)):d>0&&(s=e.left-t.collisionPosition.marginLeft+c+p+f-h,(s>0||d>r(s))&&(e.left+=c+p+f))},top:function(e,t){var i,s,n=t.within,a=n.offset.top+n.scrollTop,o=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=e.top-t.collisionPosition.marginTop,u=l-h,d=l+t.collisionHeight-o-h,c="top"===t.my[1],p=c?-t.elemHeight:"bottom"===t.my[1]?t.elemHeight:0,f="top"===t.at[1]?t.targetHeight:"bottom"===t.at[1]?-t.targetHeight:0,m=-2*t.offset[1];0>u?(s=e.top+p+f+m+t.collisionHeight-o-a,(0>s||r(u)>s)&&(e.top+=p+f+m)):d>0&&(i=e.top-t.collisionPosition.marginTop+p+f+m-h,(i>0||d>r(i))&&(e.top+=p+f+m))}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments),e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments),e.ui.position.fit.top.apply(this,arguments)}}},function(){var t,i,s,n,o,r=document.getElementsByTagName("body")[0],h=document.createElement("div");t=document.createElement(r?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},r&&e.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)t.style[o]=s[o];t.appendChild(h),i=r||document.documentElement,i.insertBefore(t,i.firstChild),h.style.cssText="position: absolute; left: 10.7432222px;",n=e(h).offset().left,a=n>10&&11>n,t.innerHTML="",i.removeChild(t)}()}(),e.ui.position,e.widget("ui.accordion",{version:"1.11.4",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var t=this.options;this.prevShow=this.prevHide=e(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),t.collapsible||t.active!==!1&&null!=t.active||(t.active=0),this._processPanels(),0>t.active&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():e()}},_createIcons:function(){var t=this.options.icons;t&&(e("<span>").addClass("ui-accordion-header-icon ui-icon "+t.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(t.header).addClass(t.activeHeader),this.headers.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").removeUniqueId(),this._destroyIcons(),e=this.headers.next().removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").css("display","").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&e.css("height","")},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):("event"===e&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(t)),this._super(e,t),"collapsible"!==e||t||this.options.active!==!1||this._activate(0),"icons"===e&&(this._destroyIcons(),t&&this._createIcons()),"disabled"===e&&(this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!t)),void 0)},_keydown:function(t){if(!t.altKey&&!t.ctrlKey){var i=e.ui.keyCode,s=this.headers.length,n=this.headers.index(t.target),a=!1;switch(t.keyCode){case i.RIGHT:case i.DOWN:a=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:a=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(t);break;case i.HOME:a=this.headers[0];break;case i.END:a=this.headers[s-1]}a&&(e(t.target).attr("tabIndex",-1),e(a).attr("tabIndex",0),a.focus(),t.preventDefault())}},_panelKeyDown:function(t){t.keyCode===e.ui.keyCode.UP&&t.ctrlKey&&e(t.currentTarget).prev().focus()},refresh:function(){var t=this.options;this._processPanels(),t.active===!1&&t.collapsible===!0||!this.headers.length?(t.active=!1,this.active=e()):t.active===!1?this._activate(0):this.active.length&&!e.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(t.active=!1,this.active=e()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var e=this.headers,t=this.panels;this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-state-default ui-corner-all"),this.panels=this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide(),t&&(this._off(e.not(this.headers)),this._off(t.not(this.panels)))},_refresh:function(){var t,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(){var t=e(this),i=t.uniqueId().attr("id"),s=t.next(),n=s.uniqueId().attr("id");t.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(t=n.height(),this.element.siblings(":visible").each(function(){var i=e(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(t-=i.outerHeight(!0))}),this.headers.each(function(){t-=e(this).outerHeight(!0)}),this.headers.next().each(function(){e(this).height(Math.max(0,t-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===s&&(t=0,this.headers.next().each(function(){t=Math.max(t,e(this).css("height","").height())}).height(t))},_activate:function(t){var i=this._findActive(t)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return"number"==typeof t?this.headers.eq(t):e()},_setupEvents:function(t){var i={keydown:"_keydown"};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n[0]===s[0],o=a&&i.collapsible,r=o?e():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:o?e():n,newPanel:r};t.preventDefault(),a&&!i.collapsible||this._trigger("beforeActivate",t,l)===!1||(i.active=o?!1:this.headers.index(n),this.active=a?e():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),a||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))},_toggle:function(t){var i=t.newPanel,s=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,t):(s.hide(),i.show(),this._toggleComplete(t)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(e(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(e,t,i){var s,n,a,o=this,r=0,h=e.css("box-sizing"),l=e.length&&(!t.length||e.index()<t.index()),u=this.options.animate||{},d=l&&u.down||u,c=function(){o._toggleComplete(i)};return"number"==typeof d&&(a=d),"string"==typeof d&&(n=d),n=n||d.easing||u.easing,a=a||d.duration||u.duration,t.length?e.length?(s=e.show().outerHeight(),t.animate(this.hideProps,{duration:a,easing:n,step:function(e,t){t.now=Math.round(e)}}),e.hide().animate(this.showProps,{duration:a,easing:n,complete:c,step:function(e,i){i.now=Math.round(e),"height"!==i.prop?"content-box"===h&&(r+=i.now):"content"!==o.options.heightStyle&&(i.now=Math.round(s-t.outerHeight()-r),r=0)}}),void 0):t.animate(this.hideProps,a,n,c):e.animate(this.showProps,a,n,c)},_toggleComplete:function(e){var t=e.oldPanel;t.removeClass("ui-accordion-content-active").prev().removeClass("ui-corner-top").addClass("ui-corner-all"),t.length&&(t.parent()[0].className=t.parent()[0].className),this._trigger("activate",null,e)}}),e.widget("ui.menu",{version:"1.11.4",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},items:"> *",menus:"ul",position:{my:"left-1 top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item":function(e){e.preventDefault()},"click .ui-menu-item":function(t){var i=e(t.target);!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&e(this.document[0].activeElement).closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(t){if(!this.previousFilter){var i=e(t.currentTarget); +i.siblings(".ui-state-active").removeClass("ui-state-active"),this.focus(t,i)}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var i=this.active||this.element.find(this.options.items).eq(0);t||this.focus(e,i)},blur:function(t){this._delay(function(){e.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){this._closeOnDocumentClick(e)&&this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-menu-icons ui-front").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").removeUniqueId().removeClass("ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var t=e(this);t.data("ui-menu-submenu-carat")&&t.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(t){var i,s,n,a,o=!0;switch(t.keyCode){case e.ui.keyCode.PAGE_UP:this.previousPage(t);break;case e.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case e.ui.keyCode.HOME:this._move("first","first",t);break;case e.ui.keyCode.END:this._move("last","last",t);break;case e.ui.keyCode.UP:this.previous(t);break;case e.ui.keyCode.DOWN:this.next(t);break;case e.ui.keyCode.LEFT:this.collapse(t);break;case e.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case e.ui.keyCode.ENTER:case e.ui.keyCode.SPACE:this._activate(t);break;case e.ui.keyCode.ESCAPE:this.collapse(t);break;default:o=!1,s=this.previousFilter||"",n=String.fromCharCode(t.keyCode),a=!1,clearTimeout(this.filterTimer),n===s?a=!0:n=s+n,i=this._filterMenuItems(n),i=a&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(t.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(t,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}o&&t.preventDefault()},_activate:function(e){this.active.is(".ui-state-disabled")||(this.active.is("[aria-haspopup='true']")?this.expand(e):this.select(e))},refresh:function(){var t,i,s=this,n=this.options.icons.submenu,a=this.element.find(this.options.menus);this.element.toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length),a.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-front").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=e(this),i=t.parent(),s=e("<span>").addClass("ui-menu-icon ui-icon "+n).data("ui-menu-submenu-carat",!0);i.attr("aria-haspopup","true").prepend(s),t.attr("aria-labelledby",i.attr("id"))}),t=a.add(this.element),i=t.find(this.options.items),i.not(".ui-menu-item").each(function(){var t=e(this);s._isDivider(t)&&t.addClass("ui-widget-content ui-menu-divider")}),i.not(".ui-menu-item, .ui-menu-divider").addClass("ui-menu-item").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!e.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(e,t){"icons"===e&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(t.submenu),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},focus:function(e,t){var i,s;this.blur(e,e&&"focus"===e.type),this._scrollIntoView(t),this.active=t.first(),s=this.active.addClass("ui-state-focus").removeClass("ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").addClass("ui-state-active"),e&&"keydown"===e.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=t.children(".ui-menu"),i.length&&e&&/^mouse/.test(e.type)&&this._startOpening(i),this.activeMenu=t.parent(),this._trigger("focus",e,{item:t})},_scrollIntoView:function(t){var i,s,n,a,o,r;this._hasScroll()&&(i=parseFloat(e.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(e.css(this.activeMenu[0],"paddingTop"))||0,n=t.offset().top-this.activeMenu.offset().top-i-s,a=this.activeMenu.scrollTop(),o=this.activeMenu.height(),r=t.outerHeight(),0>n?this.activeMenu.scrollTop(a+n):n+r>o&&this.activeMenu.scrollTop(a+n-o+r))},blur:function(e,t){t||clearTimeout(this.timer),this.active&&(this.active.removeClass("ui-state-focus"),this.active=null,this._trigger("blur",e,{item:this.active}))},_startOpening:function(e){clearTimeout(this.timer),"true"===e.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(e)},this.delay))},_open:function(t){var i=e.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(t,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:e(t&&t.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(t),this.activeMenu=s},this.delay)},_close:function(e){e||(e=this.active?this.active.parent():this.element),e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find(".ui-state-active").not(".ui-state-focus").removeClass("ui-state-active")},_closeOnDocumentClick:function(t){return!e(t.target).closest(".ui-menu").length},_isDivider:function(e){return!/[^\-\u2014\u2013\s]/.test(e.text())},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);t&&t.length&&(this._close(),this.focus(e,t))},expand:function(e){var t=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();t&&t.length&&(this._open(t.parent()),this._delay(function(){this.focus(e,t)}))},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(e,t,i){var s;this.active&&(s="first"===e||"last"===e?this.active["first"===e?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[e+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[t]()),this.focus(i,s)},nextPage:function(t){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=e(this),0>i.offset().top-s-n}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(t),void 0)},previousPage:function(t){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=e(this),i.offset().top-s+n>0}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items).first())),void 0):(this.next(t),void 0)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(t){this.active=this.active||e(t.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(t,!0),this._trigger("select",t,i)},_filterMenuItems:function(t){var i=t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&"),s=RegExp("^"+i,"i");return this.activeMenu.find(this.options.items).filter(".ui-menu-item").filter(function(){return s.test(e.trim(e(this).text()))})}}),e.widget("ui.autocomplete",{version:"1.11.4",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var t,i,s,n=this.element[0].nodeName.toLowerCase(),a="textarea"===n,o="input"===n;this.isMultiLine=a?!0:o?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[a||o?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return t=!0,s=!0,i=!0,void 0;t=!1,s=!1,i=!1;var a=e.ui.keyCode;switch(n.keyCode){case a.PAGE_UP:t=!0,this._move("previousPage",n);break;case a.PAGE_DOWN:t=!0,this._move("nextPage",n);break;case a.UP:t=!0,this._keyEvent("previous",n);break;case a.DOWN:t=!0,this._keyEvent("next",n);break;case a.ENTER:this.menu.active&&(t=!0,n.preventDefault(),this.menu.select(n));break;case a.TAB:this.menu.active&&this.menu.select(n);break;case a.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(t)return t=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=e.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(e){return s?(s=!1,e.preventDefault(),void 0):(this._searchTimeout(e),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(e),this._change(e),void 0)}}),this._initSource(),this.menu=e("<ul>").addClass("ui-autocomplete ui-front").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var i=this.menu.element[0];e(t.target).closest(".ui-menu-item").length||this._delay(function(){var t=this;this.document.one("mousedown",function(s){s.target===t.element[0]||s.target===i||e.contains(i,s.target)||t.close()})})},menufocus:function(t,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){e(t.target).trigger(t.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:n})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&e.trim(s).length&&(this.liveRegion.children().hide(),e("<div>").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,t){var i=t.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",e,{item:i})&&this._value(i.value),this.term=this._value(),this.close(e),this.selectedItem=i}}),this.liveRegion=e("<span>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),"source"===e&&this._initSource(),"appendTo"===e&&this.menu.element.appendTo(this._appendTo()),"disabled"===e&&t&&this.xhr&&this.xhr.abort()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_initSource:function(){var t,i,s=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(i,s){s(e.ui.autocomplete.filter(t,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(t,n){s.xhr&&s.xhr.abort(),s.xhr=e.ajax({url:i,data:t,dataType:"json",success:function(e){n(e)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),i=this.menu.element.is(":visible"),s=e.altKey||e.ctrlKey||e.metaKey||e.shiftKey;(!t||t&&!i&&!s)&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){return e=null!=e?e:this._value(),this.term=this._value(),e.length<this.options.minLength?this.close(t):this._trigger("search",t)!==!1?this._search(e):void 0},_search:function(e){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:e},this._response())},_response:function(){var t=++this.requestIndex;return e.proxy(function(e){t===this.requestIndex&&this.__response(e),this.pending--,this.pending||this.element.removeClass("ui-autocomplete-loading")},this)},__response:function(e){e&&(e=this._normalize(e)),this._trigger("response",null,{content:e}),!this.options.disabled&&e&&e.length&&!this.cancelSearch?(this._suggest(e),this._trigger("open")):this._close()},close:function(e){this.cancelSearch=!0,this._close(e)},_close:function(e){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",e))},_change:function(e){this.previous!==this._value()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(t){return t.length&&t[0].label&&t[0].value?t:e.map(t,function(t){return"string"==typeof t?{label:t,value:t}:e.extend({},t,{label:t.label||t.value,value:t.value||t.label})})},_suggest:function(t){var i=this.menu.element.empty();this._renderMenu(i,t),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(e.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(t,i){var s=this;e.each(i,function(e,i){s._renderItemData(t,i)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-autocomplete-item",t)},_renderItem:function(t,i){return e("<li>").text(i.label).appendTo(t)},_move:function(e,t){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[e](t),void 0):(this.search(null,t),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(e,t),t.preventDefault())}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,i){var s=RegExp(e.ui.autocomplete.escapeRegex(i),"i");return e.grep(t,function(e){return s.test(e.label||e.value||e)})}}),e.widget("ui.autocomplete",e.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(e){return e+(e>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(t){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=t&&t.length?this.options.messages.results(t.length):this.options.messages.noResults,this.liveRegion.children().hide(),e("<div>").text(i).appendTo(this.liveRegion))}}),e.ui.autocomplete;var c,p="ui-button ui-widget ui-state-default ui-corner-all",f="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",m=function(){var t=e(this);setTimeout(function(){t.find(":ui-button").button("refresh")},1)},g=function(t){var i=t.name,s=t.form,n=e([]);return i&&(i=i.replace(/'/g,"\\'"),n=s?e(s).find("[name='"+i+"'][type=radio]"):e("[name='"+i+"'][type=radio]",t.ownerDocument).filter(function(){return!this.form})),n};e.widget("ui.button",{version:"1.11.4",defaultElement:"<button>",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset"+this.eventNamespace).bind("reset"+this.eventNamespace,m),"boolean"!=typeof this.options.disabled?this.options.disabled=!!this.element.prop("disabled"):this.element.prop("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var t=this,i=this.options,s="checkbox"===this.type||"radio"===this.type,n=s?"":"ui-state-active";null===i.label&&(i.label="input"===this.type?this.buttonElement.val():this.buttonElement.html()),this._hoverable(this.buttonElement),this.buttonElement.addClass(p).attr("role","button").bind("mouseenter"+this.eventNamespace,function(){i.disabled||this===c&&e(this).addClass("ui-state-active")}).bind("mouseleave"+this.eventNamespace,function(){i.disabled||e(this).removeClass(n)}).bind("click"+this.eventNamespace,function(e){i.disabled&&(e.preventDefault(),e.stopImmediatePropagation())}),this._on({focus:function(){this.buttonElement.addClass("ui-state-focus")},blur:function(){this.buttonElement.removeClass("ui-state-focus")}}),s&&this.element.bind("change"+this.eventNamespace,function(){t.refresh()}),"checkbox"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){return i.disabled?!1:void 0}):"radio"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){if(i.disabled)return!1;e(this).addClass("ui-state-active"),t.buttonElement.attr("aria-pressed","true");var s=t.element[0];g(s).not(s).map(function(){return e(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown"+this.eventNamespace,function(){return i.disabled?!1:(e(this).addClass("ui-state-active"),c=this,t.document.one("mouseup",function(){c=null}),void 0)}).bind("mouseup"+this.eventNamespace,function(){return i.disabled?!1:(e(this).removeClass("ui-state-active"),void 0)}).bind("keydown"+this.eventNamespace,function(t){return i.disabled?!1:((t.keyCode===e.ui.keyCode.SPACE||t.keyCode===e.ui.keyCode.ENTER)&&e(this).addClass("ui-state-active"),void 0)}).bind("keyup"+this.eventNamespace+" blur"+this.eventNamespace,function(){e(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(t){t.keyCode===e.ui.keyCode.SPACE&&e(this).click()})),this._setOption("disabled",i.disabled),this._resetButton()},_determineButtonType:function(){var e,t,i;this.type=this.element.is("[type=checkbox]")?"checkbox":this.element.is("[type=radio]")?"radio":this.element.is("input")?"input":"button","checkbox"===this.type||"radio"===this.type?(e=this.element.parents().last(),t="label[for='"+this.element.attr("id")+"']",this.buttonElement=e.find(t),this.buttonElement.length||(e=e.length?e.siblings():this.element.siblings(),this.buttonElement=e.filter(t),this.buttonElement.length||(this.buttonElement=e.find(t))),this.element.addClass("ui-helper-hidden-accessible"),i=this.element.is(":checked"),i&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.prop("aria-pressed",i)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(p+" ui-state-active "+f).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title")},_setOption:function(e,t){return this._super(e,t),"disabled"===e?(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),t&&("checkbox"===this.type||"radio"===this.type?this.buttonElement.removeClass("ui-state-focus"):this.buttonElement.removeClass("ui-state-focus ui-state-active")),void 0):(this._resetButton(),void 0)},refresh:function(){var t=this.element.is("input, button")?this.element.is(":disabled"):this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOption("disabled",t),"radio"===this.type?g(this.element[0]).each(function(){e(this).is(":checked")?e(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):e(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):"checkbox"===this.type&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if("input"===this.type)return this.options.label&&this.element.val(this.options.label),void 0;var t=this.buttonElement.removeClass(f),i=e("<span></span>",this.document[0]).addClass("ui-button-text").html(this.options.label).appendTo(t.empty()).text(),s=this.options.icons,n=s.primary&&s.secondary,a=[];s.primary||s.secondary?(this.options.text&&a.push("ui-button-text-icon"+(n?"s":s.primary?"-primary":"-secondary")),s.primary&&t.prepend("<span class='ui-button-icon-primary ui-icon "+s.primary+"'></span>"),s.secondary&&t.append("<span class='ui-button-icon-secondary ui-icon "+s.secondary+"'></span>"),this.options.text||(a.push(n?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||t.attr("title",e.trim(i)))):a.push("ui-button-text-only"),t.addClass(a.join(" "))}}),e.widget("ui.buttonset",{version:"1.11.4",options:{items:"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(e,t){"disabled"===e&&this.buttons.button("option",e,t),this._super(e,t)},refresh:function(){var t="rtl"===this.element.css("direction"),i=this.element.find(this.options.items),s=i.filter(":ui-button");i.not(":ui-button").button(),s.button("refresh"),this.buttons=i.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(t?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(t?"ui-corner-left":"ui-corner-right").end().end()},_destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy")}}),e.ui.button,e.extend(e.ui,{datepicker:{version:"1.11.4"}});var v;e.extend(n.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(e){return r(this._defaults,e||{}),this},_attachDatepicker:function(t,i){var s,n,a;s=t.nodeName.toLowerCase(),n="div"===s||"span"===s,t.id||(this.uuid+=1,t.id="dp"+this.uuid),a=this._newInst(e(t),n),a.settings=e.extend({},i||{}),"input"===s?this._connectDatepicker(t,a):n&&this._inlineDatepicker(t,a)},_newInst:function(t,i){var s=t[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:s,input:t,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?a(e("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(t,i){var s=e(t);i.append=e([]),i.trigger=e([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp),this._autoSize(i),e.data(t,"datepicker",i),i.settings.disabled&&this._disableDatepicker(t))},_attachments:function(t,i){var s,n,a,o=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),o&&(i.append=e("<span class='"+this._appendClass+"'>"+o+"</span>"),t[r?"before":"after"](i.append)),t.unbind("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&t.focus(this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),a=this._get(i,"buttonImage"),i.trigger=e(this._get(i,"buttonImageOnly")?e("<img/>").addClass(this._triggerClass).attr({src:a,alt:n,title:n}):e("<button type='button'></button>").addClass(this._triggerClass).html(a?e("<img/>").attr({src:a,alt:n,title:n}):n)),t[r?"before":"after"](i.trigger),i.trigger.click(function(){return e.datepicker._datepickerShowing&&e.datepicker._lastInput===t[0]?e.datepicker._hideDatepicker():e.datepicker._datepickerShowing&&e.datepicker._lastInput!==t[0]?(e.datepicker._hideDatepicker(),e.datepicker._showDatepicker(t[0])):e.datepicker._showDatepicker(t[0]),!1}))},_autoSize:function(e){if(this._get(e,"autoSize")&&!e.inline){var t,i,s,n,a=new Date(2009,11,20),o=this._get(e,"dateFormat");o.match(/[DM]/)&&(t=function(e){for(i=0,s=0,n=0;e.length>n;n++)e[n].length>i&&(i=e[n].length,s=n);return s},a.setMonth(t(this._get(e,o.match(/MM/)?"monthNames":"monthNamesShort"))),a.setDate(t(this._get(e,o.match(/DD/)?"dayNames":"dayNamesShort"))+20-a.getDay())),e.input.attr("size",this._formatDate(e,a).length)}},_inlineDatepicker:function(t,i){var s=e(t);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),e.data(t,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(t),i.dpDiv.css("display","block"))},_dialogDatepicker:function(t,i,s,n,a){var o,h,l,u,d,c=this._dialogInst;return c||(this.uuid+=1,o="dp"+this.uuid,this._dialogInput=e("<input type='text' id='"+o+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.keydown(this._doKeyDown),e("body").append(this._dialogInput),c=this._dialogInst=this._newInst(this._dialogInput,!1),c.settings={},e.data(this._dialogInput[0],"datepicker",c)),r(c.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(c,i):i,this._dialogInput.val(i),this._pos=a?a.length?a:[a.pageX,a.pageY]:null,this._pos||(h=document.documentElement.clientWidth,l=document.documentElement.clientHeight,u=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[h/2-100+u,l/2-150+d]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),c.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),e.blockUI&&e.blockUI(this.dpDiv),e.data(this._dialogInput[0],"datepicker",c),this},_destroyDatepicker:function(t){var i,s=e(t),n=e.data(t,"datepicker");s.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),e.removeData(t,"datepicker"),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty(),v===n&&(v=null))},_enableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!1,a.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}))},_disableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!0,a.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}),this._disabledInputs[this._disabledInputs.length]=t)},_isDisabledDatepicker:function(e){if(!e)return!1;for(var t=0;this._disabledInputs.length>t;t++)if(this._disabledInputs[t]===e)return!0;return!1},_getInst:function(t){try{return e.data(t,"datepicker")}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(t,i,s){var n,a,o,h,l=this._getInst(t);return 2===arguments.length&&"string"==typeof i?"defaults"===i?e.extend({},e.datepicker._defaults):l?"all"===i?e.extend({},l.settings):this._get(l,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),l&&(this._curInst===l&&this._hideDatepicker(),a=this._getDateDatepicker(t,!0),o=this._getMinMaxDate(l,"min"),h=this._getMinMaxDate(l,"max"),r(l.settings,n),null!==o&&void 0!==n.dateFormat&&void 0===n.minDate&&(l.settings.minDate=this._formatDate(l,o)),null!==h&&void 0!==n.dateFormat&&void 0===n.maxDate&&(l.settings.maxDate=this._formatDate(l,h)),"disabled"in n&&(n.disabled?this._disableDatepicker(t):this._enableDatepicker(t)),this._attachments(e(t),l),this._autoSize(l),this._setDate(l,a),this._updateAlternate(l),this._updateDatepicker(l)),void 0)},_changeDatepicker:function(e,t,i){this._optionDatepicker(e,t,i)},_refreshDatepicker:function(e){var t=this._getInst(e);t&&this._updateDatepicker(t)},_setDateDatepicker:function(e,t){var i=this._getInst(e);i&&(this._setDate(i,t),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(e,t){var i=this._getInst(e);return i&&!i.inline&&this._setDateFromField(i,t),i?this._getDate(i):null},_doKeyDown:function(t){var i,s,n,a=e.datepicker._getInst(t.target),o=!0,r=a.dpDiv.is(".ui-datepicker-rtl");if(a._keyEvent=!0,e.datepicker._datepickerShowing)switch(t.keyCode){case 9:e.datepicker._hideDatepicker(),o=!1;break;case 13:return n=e("td."+e.datepicker._dayOverClass+":not(."+e.datepicker._currentClass+")",a.dpDiv),n[0]&&e.datepicker._selectDay(t.target,a.selectedMonth,a.selectedYear,n[0]),i=e.datepicker._get(a,"onSelect"),i?(s=e.datepicker._formatDate(a),i.apply(a.input?a.input[0]:null,[s,a])):e.datepicker._hideDatepicker(),!1;case 27:e.datepicker._hideDatepicker();break;case 33:e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 34:e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 35:(t.ctrlKey||t.metaKey)&&e.datepicker._clearDate(t.target),o=t.ctrlKey||t.metaKey;break;case 36:(t.ctrlKey||t.metaKey)&&e.datepicker._gotoToday(t.target),o=t.ctrlKey||t.metaKey;break;case 37:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?1:-1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 38:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,-7,"D"),o=t.ctrlKey||t.metaKey;break;case 39:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?-1:1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 40:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,7,"D"),o=t.ctrlKey||t.metaKey;break;default:o=!1}else 36===t.keyCode&&t.ctrlKey?e.datepicker._showDatepicker(this):o=!1;o&&(t.preventDefault(),t.stopPropagation())},_doKeyPress:function(t){var i,s,n=e.datepicker._getInst(t.target); +return e.datepicker._get(n,"constrainInput")?(i=e.datepicker._possibleChars(e.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==t.charCode?t.keyCode:t.charCode),t.ctrlKey||t.metaKey||" ">s||!i||i.indexOf(s)>-1):void 0},_doKeyUp:function(t){var i,s=e.datepicker._getInst(t.target);if(s.input.val()!==s.lastVal)try{i=e.datepicker.parseDate(e.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,e.datepicker._getFormatConfig(s)),i&&(e.datepicker._setDateFromField(s),e.datepicker._updateAlternate(s),e.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(t){if(t=t.target||t,"input"!==t.nodeName.toLowerCase()&&(t=e("input",t.parentNode)[0]),!e.datepicker._isDisabledDatepicker(t)&&e.datepicker._lastInput!==t){var i,n,a,o,h,l,u;i=e.datepicker._getInst(t),e.datepicker._curInst&&e.datepicker._curInst!==i&&(e.datepicker._curInst.dpDiv.stop(!0,!0),i&&e.datepicker._datepickerShowing&&e.datepicker._hideDatepicker(e.datepicker._curInst.input[0])),n=e.datepicker._get(i,"beforeShow"),a=n?n.apply(t,[t,i]):{},a!==!1&&(r(i.settings,a),i.lastVal=null,e.datepicker._lastInput=t,e.datepicker._setDateFromField(i),e.datepicker._inDialog&&(t.value=""),e.datepicker._pos||(e.datepicker._pos=e.datepicker._findPos(t),e.datepicker._pos[1]+=t.offsetHeight),o=!1,e(t).parents().each(function(){return o|="fixed"===e(this).css("position"),!o}),h={left:e.datepicker._pos[0],top:e.datepicker._pos[1]},e.datepicker._pos=null,i.dpDiv.empty(),i.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),e.datepicker._updateDatepicker(i),h=e.datepicker._checkOffset(i,h,o),i.dpDiv.css({position:e.datepicker._inDialog&&e.blockUI?"static":o?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"}),i.inline||(l=e.datepicker._get(i,"showAnim"),u=e.datepicker._get(i,"duration"),i.dpDiv.css("z-index",s(e(t))+1),e.datepicker._datepickerShowing=!0,e.effects&&e.effects.effect[l]?i.dpDiv.show(l,e.datepicker._get(i,"showOptions"),u):i.dpDiv[l||"show"](l?u:null),e.datepicker._shouldFocusInput(i)&&i.input.focus(),e.datepicker._curInst=i))}},_updateDatepicker:function(t){this.maxRows=4,v=t,t.dpDiv.empty().append(this._generateHTML(t)),this._attachHandlers(t);var i,s=this._getNumberOfMonths(t),n=s[1],a=17,r=t.dpDiv.find("."+this._dayOverClass+" a");r.length>0&&o.apply(r.get(0)),t.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&t.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),t.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),t.dpDiv[(this._get(t,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),t===e.datepicker._curInst&&e.datepicker._datepickerShowing&&e.datepicker._shouldFocusInput(t)&&t.input.focus(),t.yearshtml&&(i=t.yearshtml,setTimeout(function(){i===t.yearshtml&&t.yearshtml&&t.dpDiv.find("select.ui-datepicker-year:first").replaceWith(t.yearshtml),i=t.yearshtml=null},0))},_shouldFocusInput:function(e){return e.input&&e.input.is(":visible")&&!e.input.is(":disabled")&&!e.input.is(":focus")},_checkOffset:function(t,i,s){var n=t.dpDiv.outerWidth(),a=t.dpDiv.outerHeight(),o=t.input?t.input.outerWidth():0,r=t.input?t.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:e(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:e(document).scrollTop());return i.left-=this._get(t,"isRTL")?n-o:0,i.left-=s&&i.left===t.input.offset().left?e(document).scrollLeft():0,i.top-=s&&i.top===t.input.offset().top+r?e(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+a>l&&l>a?Math.abs(a+r):0),i},_findPos:function(t){for(var i,s=this._getInst(t),n=this._get(s,"isRTL");t&&("hidden"===t.type||1!==t.nodeType||e.expr.filters.hidden(t));)t=t[n?"previousSibling":"nextSibling"];return i=e(t).offset(),[i.left,i.top]},_hideDatepicker:function(t){var i,s,n,a,o=this._curInst;!o||t&&o!==e.data(t,"datepicker")||this._datepickerShowing&&(i=this._get(o,"showAnim"),s=this._get(o,"duration"),n=function(){e.datepicker._tidyDialog(o)},e.effects&&(e.effects.effect[i]||e.effects[i])?o.dpDiv.hide(i,e.datepicker._get(o,"showOptions"),s,n):o.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,a=this._get(o,"onClose"),a&&a.apply(o.input?o.input[0]:null,[o.input?o.input.val():"",o]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),e.blockUI&&(e.unblockUI(),e("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(e){e.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(t){if(e.datepicker._curInst){var i=e(t.target),s=e.datepicker._getInst(i[0]);(i[0].id!==e.datepicker._mainDivId&&0===i.parents("#"+e.datepicker._mainDivId).length&&!i.hasClass(e.datepicker.markerClassName)&&!i.closest("."+e.datepicker._triggerClass).length&&e.datepicker._datepickerShowing&&(!e.datepicker._inDialog||!e.blockUI)||i.hasClass(e.datepicker.markerClassName)&&e.datepicker._curInst!==s)&&e.datepicker._hideDatepicker()}},_adjustDate:function(t,i,s){var n=e(t),a=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(a,i+("M"===s?this._get(a,"showCurrentAtPos"):0),s),this._updateDatepicker(a))},_gotoToday:function(t){var i,s=e(t),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(t,i,s){var n=e(t),a=this._getInst(n[0]);a["selected"+("M"===s?"Month":"Year")]=a["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(a),this._adjustDate(n)},_selectDay:function(t,i,s,n){var a,o=e(t);e(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(o[0])||(a=this._getInst(o[0]),a.selectedDay=a.currentDay=e("a",n).html(),a.selectedMonth=a.currentMonth=i,a.selectedYear=a.currentYear=s,this._selectDate(t,this._formatDate(a,a.currentDay,a.currentMonth,a.currentYear)))},_clearDate:function(t){var i=e(t);this._selectDate(i,"")},_selectDate:function(t,i){var s,n=e(t),a=this._getInst(n[0]);i=null!=i?i:this._formatDate(a),a.input&&a.input.val(i),this._updateAlternate(a),s=this._get(a,"onSelect"),s?s.apply(a.input?a.input[0]:null,[i,a]):a.input&&a.input.trigger("change"),a.inline?this._updateDatepicker(a):(this._hideDatepicker(),this._lastInput=a.input[0],"object"!=typeof a.input[0]&&a.input.focus(),this._lastInput=null)},_updateAlternate:function(t){var i,s,n,a=this._get(t,"altField");a&&(i=this._get(t,"altFormat")||this._get(t,"dateFormat"),s=this._getDate(t),n=this.formatDate(i,s,this._getFormatConfig(t)),e(a).each(function(){e(this).val(n)}))},noWeekends:function(e){var t=e.getDay();return[t>0&&6>t,""]},iso8601Week:function(e){var t,i=new Date(e.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),t=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((t-i)/864e5)/7)+1},parseDate:function(t,i,s){if(null==t||null==i)throw"Invalid arguments";if(i="object"==typeof i?""+i:i+"",""===i)return null;var n,a,o,r,h=0,l=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,u="string"!=typeof l?l:(new Date).getFullYear()%100+parseInt(l,10),d=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,c=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,m=-1,g=-1,v=-1,y=-1,b=!1,_=function(e){var i=t.length>n+1&&t.charAt(n+1)===e;return i&&n++,i},x=function(e){var t=_(e),s="@"===e?14:"!"===e?20:"y"===e&&t?4:"o"===e?3:2,n="y"===e?s:1,a=RegExp("^\\d{"+n+","+s+"}"),o=i.substring(h).match(a);if(!o)throw"Missing number at position "+h;return h+=o[0].length,parseInt(o[0],10)},w=function(t,s,n){var a=-1,o=e.map(_(t)?n:s,function(e,t){return[[t,e]]}).sort(function(e,t){return-(e[1].length-t[1].length)});if(e.each(o,function(e,t){var s=t[1];return i.substr(h,s.length).toLowerCase()===s.toLowerCase()?(a=t[0],h+=s.length,!1):void 0}),-1!==a)return a+1;throw"Unknown name at position "+h},k=function(){if(i.charAt(h)!==t.charAt(n))throw"Unexpected literal at position "+h;h++};for(n=0;t.length>n;n++)if(b)"'"!==t.charAt(n)||_("'")?k():b=!1;else switch(t.charAt(n)){case"d":v=x("d");break;case"D":w("D",d,c);break;case"o":y=x("o");break;case"m":g=x("m");break;case"M":g=w("M",p,f);break;case"y":m=x("y");break;case"@":r=new Date(x("@")),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"!":r=new Date((x("!")-this._ticksTo1970)/1e4),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"'":_("'")?k():b=!0;break;default:k()}if(i.length>h&&(o=i.substr(h),!/^\s+/.test(o)))throw"Extra/unparsed characters found in date: "+o;if(-1===m?m=(new Date).getFullYear():100>m&&(m+=(new Date).getFullYear()-(new Date).getFullYear()%100+(u>=m?0:-100)),y>-1)for(g=1,v=y;;){if(a=this._getDaysInMonth(m,g-1),a>=v)break;g++,v-=a}if(r=this._daylightSavingAdjust(new Date(m,g-1,v)),r.getFullYear()!==m||r.getMonth()+1!==g||r.getDate()!==v)throw"Invalid date";return r},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(e,t,i){if(!t)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,a=(i?i.dayNames:null)||this._defaults.dayNames,o=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(t){var i=e.length>s+1&&e.charAt(s+1)===t;return i&&s++,i},l=function(e,t,i){var s=""+t;if(h(e))for(;i>s.length;)s="0"+s;return s},u=function(e,t,i,s){return h(e)?s[t]:i[t]},d="",c=!1;if(t)for(s=0;e.length>s;s++)if(c)"'"!==e.charAt(s)||h("'")?d+=e.charAt(s):c=!1;else switch(e.charAt(s)){case"d":d+=l("d",t.getDate(),2);break;case"D":d+=u("D",t.getDay(),n,a);break;case"o":d+=l("o",Math.round((new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()-new Date(t.getFullYear(),0,0).getTime())/864e5),3);break;case"m":d+=l("m",t.getMonth()+1,2);break;case"M":d+=u("M",t.getMonth(),o,r);break;case"y":d+=h("y")?t.getFullYear():(10>t.getYear()%100?"0":"")+t.getYear()%100;break;case"@":d+=t.getTime();break;case"!":d+=1e4*t.getTime()+this._ticksTo1970;break;case"'":h("'")?d+="'":c=!0;break;default:d+=e.charAt(s)}return d},_possibleChars:function(e){var t,i="",s=!1,n=function(i){var s=e.length>t+1&&e.charAt(t+1)===i;return s&&t++,s};for(t=0;e.length>t;t++)if(s)"'"!==e.charAt(t)||n("'")?i+=e.charAt(t):s=!1;else switch(e.charAt(t)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=e.charAt(t)}return i},_get:function(e,t){return void 0!==e.settings[t]?e.settings[t]:this._defaults[t]},_setDateFromField:function(e,t){if(e.input.val()!==e.lastVal){var i=this._get(e,"dateFormat"),s=e.lastVal=e.input?e.input.val():null,n=this._getDefaultDate(e),a=n,o=this._getFormatConfig(e);try{a=this.parseDate(i,s,o)||n}catch(r){s=t?"":s}e.selectedDay=a.getDate(),e.drawMonth=e.selectedMonth=a.getMonth(),e.drawYear=e.selectedYear=a.getFullYear(),e.currentDay=s?a.getDate():0,e.currentMonth=s?a.getMonth():0,e.currentYear=s?a.getFullYear():0,this._adjustInstDate(e)}},_getDefaultDate:function(e){return this._restrictMinMax(e,this._determineDate(e,this._get(e,"defaultDate"),new Date))},_determineDate:function(t,i,s){var n=function(e){var t=new Date;return t.setDate(t.getDate()+e),t},a=function(i){try{return e.datepicker.parseDate(e.datepicker._get(t,"dateFormat"),i,e.datepicker._getFormatConfig(t))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?e.datepicker._getDate(t):null)||new Date,a=n.getFullYear(),o=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":o+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o));break;case"y":case"Y":a+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o))}l=h.exec(i)}return new Date(a,o,r)},o=null==i||""===i?s:"string"==typeof i?a(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return o=o&&"Invalid Date"==""+o?s:o,o&&(o.setHours(0),o.setMinutes(0),o.setSeconds(0),o.setMilliseconds(0)),this._daylightSavingAdjust(o)},_daylightSavingAdjust:function(e){return e?(e.setHours(e.getHours()>12?e.getHours()+2:0),e):null},_setDate:function(e,t,i){var s=!t,n=e.selectedMonth,a=e.selectedYear,o=this._restrictMinMax(e,this._determineDate(e,t,new Date));e.selectedDay=e.currentDay=o.getDate(),e.drawMonth=e.selectedMonth=e.currentMonth=o.getMonth(),e.drawYear=e.selectedYear=e.currentYear=o.getFullYear(),n===e.selectedMonth&&a===e.selectedYear||i||this._notifyChange(e),this._adjustInstDate(e),e.input&&e.input.val(s?"":this._formatDate(e))},_getDate:function(e){var t=!e.currentYear||e.input&&""===e.input.val()?null:this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return t},_attachHandlers:function(t){var i=this._get(t,"stepMonths"),s="#"+t.id.replace(/\\\\/g,"\\");t.dpDiv.find("[data-handler]").map(function(){var t={prev:function(){e.datepicker._adjustDate(s,-i,"M")},next:function(){e.datepicker._adjustDate(s,+i,"M")},hide:function(){e.datepicker._hideDatepicker()},today:function(){e.datepicker._gotoToday(s)},selectDay:function(){return e.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return e.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return e.datepicker._selectMonthYear(s,this,"Y"),!1}};e(this).bind(this.getAttribute("data-event"),t[this.getAttribute("data-handler")])})},_generateHTML:function(e){var t,i,s,n,a,o,r,h,l,u,d,c,p,f,m,g,v,y,b,_,x,w,k,T,D,S,M,C,N,A,P,I,H,z,F,E,O,j,W,L=new Date,R=this._daylightSavingAdjust(new Date(L.getFullYear(),L.getMonth(),L.getDate())),Y=this._get(e,"isRTL"),B=this._get(e,"showButtonPanel"),J=this._get(e,"hideIfNoPrevNext"),q=this._get(e,"navigationAsDateFormat"),K=this._getNumberOfMonths(e),V=this._get(e,"showCurrentAtPos"),U=this._get(e,"stepMonths"),Q=1!==K[0]||1!==K[1],G=this._daylightSavingAdjust(e.currentDay?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(9999,9,9)),X=this._getMinMaxDate(e,"min"),$=this._getMinMaxDate(e,"max"),Z=e.drawMonth-V,et=e.drawYear;if(0>Z&&(Z+=12,et--),$)for(t=this._daylightSavingAdjust(new Date($.getFullYear(),$.getMonth()-K[0]*K[1]+1,$.getDate())),t=X&&X>t?X:t;this._daylightSavingAdjust(new Date(et,Z,1))>t;)Z--,0>Z&&(Z=11,et--);for(e.drawMonth=Z,e.drawYear=et,i=this._get(e,"prevText"),i=q?this.formatDate(i,this._daylightSavingAdjust(new Date(et,Z-U,1)),this._getFormatConfig(e)):i,s=this._canAdjustMonth(e,-1,et,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>":J?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(e,"nextText"),n=q?this.formatDate(n,this._daylightSavingAdjust(new Date(et,Z+U,1)),this._getFormatConfig(e)):n,a=this._canAdjustMonth(e,1,et,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>":J?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>",o=this._get(e,"currentText"),r=this._get(e,"gotoCurrent")&&e.currentDay?G:R,o=q?this.formatDate(o,r,this._getFormatConfig(e)):o,h=e.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(e,"closeText")+"</button>",l=B?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(this._isInRange(e,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+o+"</button>":"")+(Y?"":h)+"</div>":"",u=parseInt(this._get(e,"firstDay"),10),u=isNaN(u)?0:u,d=this._get(e,"showWeek"),c=this._get(e,"dayNames"),p=this._get(e,"dayNamesMin"),f=this._get(e,"monthNames"),m=this._get(e,"monthNamesShort"),g=this._get(e,"beforeShowDay"),v=this._get(e,"showOtherMonths"),y=this._get(e,"selectOtherMonths"),b=this._getDefaultDate(e),_="",w=0;K[0]>w;w++){for(k="",this.maxRows=4,T=0;K[1]>T;T++){if(D=this._daylightSavingAdjust(new Date(et,Z,e.selectedDay)),S=" ui-corner-all",M="",Q){if(M+="<div class='ui-datepicker-group",K[1]>1)switch(T){case 0:M+=" ui-datepicker-group-first",S=" ui-corner-"+(Y?"right":"left");break;case K[1]-1:M+=" ui-datepicker-group-last",S=" ui-corner-"+(Y?"left":"right");break;default:M+=" ui-datepicker-group-middle",S=""}M+="'>"}for(M+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+S+"'>"+(/all|left/.test(S)&&0===w?Y?a:s:"")+(/all|right/.test(S)&&0===w?Y?s:a:"")+this._generateMonthYearHeader(e,Z,et,X,$,w>0||T>0,f,m)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",C=d?"<th class='ui-datepicker-week-col'>"+this._get(e,"weekHeader")+"</th>":"",x=0;7>x;x++)N=(x+u)%7,C+="<th scope='col'"+((x+u+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+c[N]+"'>"+p[N]+"</span></th>";for(M+=C+"</tr></thead><tbody>",A=this._getDaysInMonth(et,Z),et===e.selectedYear&&Z===e.selectedMonth&&(e.selectedDay=Math.min(e.selectedDay,A)),P=(this._getFirstDayOfMonth(et,Z)-u+7)%7,I=Math.ceil((P+A)/7),H=Q?this.maxRows>I?this.maxRows:I:I,this.maxRows=H,z=this._daylightSavingAdjust(new Date(et,Z,1-P)),F=0;H>F;F++){for(M+="<tr>",E=d?"<td class='ui-datepicker-week-col'>"+this._get(e,"calculateWeek")(z)+"</td>":"",x=0;7>x;x++)O=g?g.apply(e.input?e.input[0]:null,[z]):[!0,""],j=z.getMonth()!==Z,W=j&&!y||!O[0]||X&&X>z||$&&z>$,E+="<td class='"+((x+u+6)%7>=5?" ui-datepicker-week-end":"")+(j?" ui-datepicker-other-month":"")+(z.getTime()===D.getTime()&&Z===e.selectedMonth&&e._keyEvent||b.getTime()===z.getTime()&&b.getTime()===D.getTime()?" "+this._dayOverClass:"")+(W?" "+this._unselectableClass+" ui-state-disabled":"")+(j&&!v?"":" "+O[1]+(z.getTime()===G.getTime()?" "+this._currentClass:"")+(z.getTime()===R.getTime()?" ui-datepicker-today":""))+"'"+(j&&!v||!O[2]?"":" title='"+O[2].replace(/'/g,"&#39;")+"'")+(W?"":" data-handler='selectDay' data-event='click' data-month='"+z.getMonth()+"' data-year='"+z.getFullYear()+"'")+">"+(j&&!v?"&#xa0;":W?"<span class='ui-state-default'>"+z.getDate()+"</span>":"<a class='ui-state-default"+(z.getTime()===R.getTime()?" ui-state-highlight":"")+(z.getTime()===G.getTime()?" ui-state-active":"")+(j?" ui-priority-secondary":"")+"' href='#'>"+z.getDate()+"</a>")+"</td>",z.setDate(z.getDate()+1),z=this._daylightSavingAdjust(z);M+=E+"</tr>"}Z++,Z>11&&(Z=0,et++),M+="</tbody></table>"+(Q?"</div>"+(K[0]>0&&T===K[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),k+=M}_+=k}return _+=l,e._keyEvent=!1,_},_generateMonthYearHeader:function(e,t,i,s,n,a,o,r){var h,l,u,d,c,p,f,m,g=this._get(e,"changeMonth"),v=this._get(e,"changeYear"),y=this._get(e,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",_="";if(a||!g)_+="<span class='ui-datepicker-month'>"+o[t]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,_+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",u=0;12>u;u++)(!h||u>=s.getMonth())&&(!l||n.getMonth()>=u)&&(_+="<option value='"+u+"'"+(u===t?" selected='selected'":"")+">"+r[u]+"</option>");_+="</select>"}if(y||(b+=_+(!a&&g&&v?"":"&#xa0;")),!e.yearshtml)if(e.yearshtml="",a||!v)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(d=this._get(e,"yearRange").split(":"),c=(new Date).getFullYear(),p=function(e){var t=e.match(/c[+\-].*/)?i+parseInt(e.substring(1),10):e.match(/[+\-].*/)?c+parseInt(e,10):parseInt(e,10);return isNaN(t)?c:t},f=p(d[0]),m=Math.max(f,p(d[1]||"")),f=s?Math.max(f,s.getFullYear()):f,m=n?Math.min(m,n.getFullYear()):m,e.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";m>=f;f++)e.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";e.yearshtml+="</select>",b+=e.yearshtml,e.yearshtml=null}return b+=this._get(e,"yearSuffix"),y&&(b+=(!a&&g&&v?"":"&#xa0;")+_),b+="</div>"},_adjustInstDate:function(e,t,i){var s=e.drawYear+("Y"===i?t:0),n=e.drawMonth+("M"===i?t:0),a=Math.min(e.selectedDay,this._getDaysInMonth(s,n))+("D"===i?t:0),o=this._restrictMinMax(e,this._daylightSavingAdjust(new Date(s,n,a)));e.selectedDay=o.getDate(),e.drawMonth=e.selectedMonth=o.getMonth(),e.drawYear=e.selectedYear=o.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(e)},_restrictMinMax:function(e,t){var i=this._getMinMaxDate(e,"min"),s=this._getMinMaxDate(e,"max"),n=i&&i>t?i:t;return s&&n>s?s:n},_notifyChange:function(e){var t=this._get(e,"onChangeMonthYear");t&&t.apply(e.input?e.input[0]:null,[e.selectedYear,e.selectedMonth+1,e])},_getNumberOfMonths:function(e){var t=this._get(e,"numberOfMonths");return null==t?[1,1]:"number"==typeof t?[1,t]:t},_getMinMaxDate:function(e,t){return this._determineDate(e,this._get(e,t+"Date"),null)},_getDaysInMonth:function(e,t){return 32-this._daylightSavingAdjust(new Date(e,t,32)).getDate()},_getFirstDayOfMonth:function(e,t){return new Date(e,t,1).getDay()},_canAdjustMonth:function(e,t,i,s){var n=this._getNumberOfMonths(e),a=this._daylightSavingAdjust(new Date(i,s+(0>t?t:n[0]*n[1]),1));return 0>t&&a.setDate(this._getDaysInMonth(a.getFullYear(),a.getMonth())),this._isInRange(e,a)},_isInRange:function(e,t){var i,s,n=this._getMinMaxDate(e,"min"),a=this._getMinMaxDate(e,"max"),o=null,r=null,h=this._get(e,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),o=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(o+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||t.getTime()>=n.getTime())&&(!a||t.getTime()<=a.getTime())&&(!o||t.getFullYear()>=o)&&(!r||r>=t.getFullYear())},_getFormatConfig:function(e){var t=this._get(e,"shortYearCutoff");return t="string"!=typeof t?t:(new Date).getFullYear()%100+parseInt(t,10),{shortYearCutoff:t,dayNamesShort:this._get(e,"dayNamesShort"),dayNames:this._get(e,"dayNames"),monthNamesShort:this._get(e,"monthNamesShort"),monthNames:this._get(e,"monthNames")}},_formatDate:function(e,t,i,s){t||(e.currentDay=e.selectedDay,e.currentMonth=e.selectedMonth,e.currentYear=e.selectedYear);var n=t?"object"==typeof t?t:this._daylightSavingAdjust(new Date(s,i,t)):this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return this.formatDate(this._get(e,"dateFormat"),n,this._getFormatConfig(e))}}),e.fn.datepicker=function(t){if(!this.length)return this;e.datepicker.initialized||(e(document).mousedown(e.datepicker._checkExternalClick),e.datepicker.initialized=!0),0===e("#"+e.datepicker._mainDivId).length&&e("body").append(e.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof t||"isDisabled"!==t&&"getDate"!==t&&"widget"!==t?"option"===t&&2===arguments.length&&"string"==typeof arguments[1]?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof t?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this].concat(i)):e.datepicker._attachDatepicker(this,t)}):e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i))},e.datepicker=new n,e.datepicker.initialized=!1,e.datepicker.uuid=(new Date).getTime(),e.datepicker.version="1.11.4",e.datepicker,e.widget("ui.draggable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._setHandleClassName(),this._mouseInit()},_setOption:function(e,t){this._super(e,t),"handle"===e&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(t){var i=this.options;return this._blurActiveElement(t),this.helper||i.disabled||e(t.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(t),this.handle?(this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(t){this.iframeBlocks=this.document.find(t).map(function(){var t=e(this);return e("<div>").css("position","absolute").appendTo(t.parent()).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(t){var i=this.document[0];if(this.handleElement.is(t.target))try{i.activeElement&&"body"!==i.activeElement.nodeName.toLowerCase()&&e(i.activeElement).blur()}catch(s){}},_mouseStart:function(t){var i=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===e(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(t),this.originalPosition=this.position=this._generatePosition(t,!1),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._normalizeRightBottom(),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_refreshOffsets:function(e){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:e.pageX-this.offset.left,top:e.pageY-this.offset.top}},_mouseDrag:function(t,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(t,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",t,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var i=this,s=!1;return e.ui.ddmanager&&!this.options.dropBehaviour&&(s=e.ui.ddmanager.drop(this,t)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",t)!==!1&&i._clear()}):this._trigger("stop",t)!==!1&&this._clear(),!1},_mouseUp:function(t){return this._unblockFrames(),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),this.handleElement.is(t.target)&&this.element.focus(),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){return this.options.handle?!!e(t.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this.handleElement.addClass("ui-draggable-handle")},_removeHandleClassName:function(){this.handleElement.removeClass("ui-draggable-handle")},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper),n=s?e(i.helper.apply(this.element[0],[t])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return n.parents("body").length||n.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css("position"))||n.css("position","absolute"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_isRootNode:function(e){return/(html|body)/i.test(e.tagName)||e===this.document[0]},_getParentOffset:function(){var t=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var e=this.element.position(),t=this._isRootNode(this.scrollParent[0]);return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+(t?0:this.scrollParent.scrollTop()),left:e.left-(parseInt(this.helper.css("left"),10)||0)+(t?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options,a=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,e(window).scrollLeft()+e(window).width()-this.helperProportions.width-this.margins.left,e(window).scrollTop()+(e(window).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,e(a).width()-this.helperProportions.width-this.margins.left,(e(a).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=e(n.containment),s=i[0],s&&(t=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(t?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(t?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0) +},_convertPositionTo:function(e,t){t||(t=this.position);var i="absolute"===e?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:t.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:t.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(e,t){var i,s,n,a,o=this.options,r=this._isRootNode(this.scrollParent[0]),h=e.pageX,l=e.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),t&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,e.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),e.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),e.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),o.grid&&(n=o.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-o.grid[1]:n+o.grid[1]:n,a=o.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,h=i?a-this.offset.click.left>=i[0]||a-this.offset.click.left>i[2]?a:a-this.offset.click.left>=i[0]?a-o.grid[0]:a+o.grid[0]:a),"y"===o.axis&&(h=this.originalPageX),"x"===o.axis&&(l=this.originalPageY)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_normalizeRightBottom:function(){"y"!==this.options.axis&&"auto"!==this.helper.css("right")&&(this.helper.width(this.helper.width()),this.helper.css("right","auto")),"x"!==this.options.axis&&"auto"!==this.helper.css("bottom")&&(this.helper.height(this.helper.height()),this.helper.css("bottom","auto"))},_trigger:function(t,i,s){return s=s||this._uiHash(),e.ui.plugin.call(this,t,[i,s,this],!0),/^(drag|start|stop)/.test(t)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),e.Widget.prototype._trigger.call(this,t,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add("draggable","connectToSortable",{start:function(t,i,s){var n=e.extend({},i,{item:s.element});s.sortables=[],e(s.options.connectToSortable).each(function(){var i=e(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",t,n))})},stop:function(t,i,s){var n=e.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,e.each(s.sortables,function(){var e=this;e.isOver?(e.isOver=0,s.cancelHelperRemoval=!0,e.cancelHelperRemoval=!1,e._storedCSS={position:e.placeholder.css("position"),top:e.placeholder.css("top"),left:e.placeholder.css("left")},e._mouseStop(t),e.options.helper=e.options._helper):(e.cancelHelperRemoval=!0,e._trigger("deactivate",t,n))})},drag:function(t,i,s){e.each(s.sortables,function(){var n=!1,a=this;a.positionAbs=s.positionAbs,a.helperProportions=s.helperProportions,a.offset.click=s.offset.click,a._intersectsWith(a.containerCache)&&(n=!0,e.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==a&&this._intersectsWith(this.containerCache)&&e.contains(a.element[0],this.element[0])&&(n=!1),n})),n?(a.isOver||(a.isOver=1,s._parent=i.helper.parent(),a.currentItem=i.helper.appendTo(a.element).data("ui-sortable-item",!0),a.options._helper=a.options.helper,a.options.helper=function(){return i.helper[0]},t.target=a.currentItem[0],a._mouseCapture(t,!0),a._mouseStart(t,!0,!0),a.offset.click.top=s.offset.click.top,a.offset.click.left=s.offset.click.left,a.offset.parent.left-=s.offset.parent.left-a.offset.parent.left,a.offset.parent.top-=s.offset.parent.top-a.offset.parent.top,s._trigger("toSortable",t),s.dropped=a.element,e.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,a.fromOutside=s),a.currentItem&&(a._mouseDrag(t),i.position=a.position)):a.isOver&&(a.isOver=0,a.cancelHelperRemoval=!0,a.options._revert=a.options.revert,a.options.revert=!1,a._trigger("out",t,a._uiHash(a)),a._mouseStop(t,!0),a.options.revert=a.options._revert,a.options.helper=a.options._helper,a.placeholder&&a.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(t),i.position=s._generatePosition(t,!0),s._trigger("fromSortable",t),s.dropped=!1,e.each(s.sortables,function(){this.refreshPositions()}))})}}),e.ui.plugin.add("draggable","cursor",{start:function(t,i,s){var n=e("body"),a=s.options;n.css("cursor")&&(a._cursor=n.css("cursor")),n.css("cursor",a.cursor)},stop:function(t,i,s){var n=s.options;n._cursor&&e("body").css("cursor",n._cursor)}}),e.ui.plugin.add("draggable","opacity",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("opacity")&&(a._opacity=n.css("opacity")),n.css("opacity",a.opacity)},stop:function(t,i,s){var n=s.options;n._opacity&&e(i.helper).css("opacity",n._opacity)}}),e.ui.plugin.add("draggable","scroll",{start:function(e,t,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(t,i,s){var n=s.options,a=!1,o=s.scrollParentNotHidden[0],r=s.document[0];o!==r&&"HTML"!==o.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+o.offsetHeight-t.pageY<n.scrollSensitivity?o.scrollTop=a=o.scrollTop+n.scrollSpeed:t.pageY-s.overflowOffset.top<n.scrollSensitivity&&(o.scrollTop=a=o.scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+o.offsetWidth-t.pageX<n.scrollSensitivity?o.scrollLeft=a=o.scrollLeft+n.scrollSpeed:t.pageX-s.overflowOffset.left<n.scrollSensitivity&&(o.scrollLeft=a=o.scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(t.pageY-e(r).scrollTop()<n.scrollSensitivity?a=e(r).scrollTop(e(r).scrollTop()-n.scrollSpeed):e(window).height()-(t.pageY-e(r).scrollTop())<n.scrollSensitivity&&(a=e(r).scrollTop(e(r).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(t.pageX-e(r).scrollLeft()<n.scrollSensitivity?a=e(r).scrollLeft(e(r).scrollLeft()-n.scrollSpeed):e(window).width()-(t.pageX-e(r).scrollLeft())<n.scrollSensitivity&&(a=e(r).scrollLeft(e(r).scrollLeft()+n.scrollSpeed)))),a!==!1&&e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(s,t)}}),e.ui.plugin.add("draggable","snap",{start:function(t,i,s){var n=s.options;s.snapElements=[],e(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var t=e(this),i=t.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:t.outerWidth(),height:t.outerHeight(),top:i.top,left:i.left})})},drag:function(t,i,s){var n,a,o,r,h,l,u,d,c,p,f=s.options,m=f.snapTolerance,g=i.offset.left,v=g+s.helperProportions.width,y=i.offset.top,b=y+s.helperProportions.height;for(c=s.snapElements.length-1;c>=0;c--)h=s.snapElements[c].left-s.margins.left,l=h+s.snapElements[c].width,u=s.snapElements[c].top-s.margins.top,d=u+s.snapElements[c].height,h-m>v||g>l+m||u-m>b||y>d+m||!e.contains(s.snapElements[c].item.ownerDocument,s.snapElements[c].item)?(s.snapElements[c].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=!1):("inner"!==f.snapMode&&(n=m>=Math.abs(u-b),a=m>=Math.abs(d-y),o=m>=Math.abs(h-v),r=m>=Math.abs(l-g),n&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left)),p=n||a||o||r,"outer"!==f.snapMode&&(n=m>=Math.abs(u-y),a=m>=Math.abs(d-b),o=m>=Math.abs(h-g),r=m>=Math.abs(l-v),n&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d-s.helperProportions.height,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left)),!s.snapElements[c].snapping&&(n||a||o||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=n||a||o||r||p)}}),e.ui.plugin.add("draggable","stack",{start:function(t,i,s){var n,a=s.options,o=e.makeArray(e(a.stack)).sort(function(t,i){return(parseInt(e(t).css("zIndex"),10)||0)-(parseInt(e(i).css("zIndex"),10)||0)});o.length&&(n=parseInt(e(o[0]).css("zIndex"),10)||0,e(o).each(function(t){e(this).css("zIndex",n+t)}),this.css("zIndex",n+o.length))}}),e.ui.plugin.add("draggable","zIndex",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("zIndex")&&(a._zIndex=n.css("zIndex")),n.css("zIndex",a.zIndex)},stop:function(t,i,s){var n=s.options;n._zIndex&&e(i.helper).css("zIndex",n._zIndex)}}),e.ui.draggable,e.widget("ui.resizable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(e){return parseInt(e,10)||0},_isNumber:function(e){return!isNaN(parseInt(e,10))},_hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return t[s]>0?!0:(t[s]=1,n=t[s]>0,t[s]=0,n)},_create:function(){var t,i,s,n,a,o=this,r=this.options;if(this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(e("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=e(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),t=this.handles.split(","),this.handles={},i=0;t.length>i;i++)s=e.trim(t[i]),a="ui-resizable-"+s,n=e("<div class='ui-resizable-handle "+a+"'></div>"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(t){var i,s,n,a;t=t||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=e(this.handles[i]),this._on(this.handles[i],{mousedown:o._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=e(this.handles[i],this.element),a=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),t.css(n,a),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.mouseover(function(){o.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),o.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(e(this).removeClass("ui-resizable-autohide"),o._handles.show())}).mouseleave(function(){r.disabled||o.resizing||(e(this).addClass("ui-resizable-autohide"),o._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t,i=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),t=this.element,this.originalElement.css({position:t.css("position"),width:t.outerWidth(),height:t.outerHeight(),top:t.css("top"),left:t.css("left")}).insertAfter(t),t.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(t){var i,s,n=!1;for(i in this.handles)s=e(this.handles[i])[0],(s===t.target||e.contains(s,t.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(t){var i,s,n,a=this.options,o=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),a.containment&&(i+=e(a.containment).scrollLeft()||0,s+=e(a.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:o.width(),height:o.height()},this.originalSize=this._helper?{width:o.outerWidth(),height:o.outerHeight()}:{width:o.width(),height:o.height()},this.sizeDiff={width:o.outerWidth()-o.width(),height:o.outerHeight()-o.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof a.aspectRatio?a.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=e(".ui-resizable-"+this.axis).css("cursor"),e("body").css("cursor","auto"===n?this.axis+"-resize":n),o.addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var i,s,n=this.originalMousePosition,a=this.axis,o=t.pageX-n.left||0,r=t.pageY-n.top||0,h=this._change[a];return this._updatePrevProperties(),h?(i=h.apply(this,[t,o,r]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(i=this._updateRatio(i,t)),i=this._respectSize(i,t),this._updateCache(i),this._propagate("resize",t),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),e.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(t){this.resizing=!1;var i,s,n,a,o,r,h,l=this.options,u=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:u.sizeDiff.height,a=s?0:u.sizeDiff.width,o={width:u.helper.width()-a,height:u.helper.height()-n},r=parseInt(u.element.css("left"),10)+(u.position.left-u.originalPosition.left)||null,h=parseInt(u.element.css("top"),10)+(u.position.top-u.originalPosition.top)||null,l.animate||this.element.css(e.extend(o,{top:h,left:r})),u.helper.height(u.size.height),u.helper.width(u.size.width),this._helper&&!l.animate&&this._proportionallyResize()),e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var e={};return this.position.top!==this.prevPosition.top&&(e.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(e.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(e.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(e.height=this.size.height+"px"),this.helper.css(e),e},_updateVirtualBoundaries:function(e){var t,i,s,n,a,o=this.options;a={minWidth:this._isNumber(o.minWidth)?o.minWidth:0,maxWidth:this._isNumber(o.maxWidth)?o.maxWidth:1/0,minHeight:this._isNumber(o.minHeight)?o.minHeight:0,maxHeight:this._isNumber(o.maxHeight)?o.maxHeight:1/0},(this._aspectRatio||e)&&(t=a.minHeight*this.aspectRatio,s=a.minWidth/this.aspectRatio,i=a.maxHeight*this.aspectRatio,n=a.maxWidth/this.aspectRatio,t>a.minWidth&&(a.minWidth=t),s>a.minHeight&&(a.minHeight=s),a.maxWidth>i&&(a.maxWidth=i),a.maxHeight>n&&(a.maxHeight=n)),this._vBoundaries=a},_updateCache:function(e){this.offset=this.helper.offset(),this._isNumber(e.left)&&(this.position.left=e.left),this._isNumber(e.top)&&(this.position.top=e.top),this._isNumber(e.height)&&(this.size.height=e.height),this._isNumber(e.width)&&(this.size.width=e.width)},_updateRatio:function(e){var t=this.position,i=this.size,s=this.axis;return this._isNumber(e.height)?e.width=e.height*this.aspectRatio:this._isNumber(e.width)&&(e.height=e.width/this.aspectRatio),"sw"===s&&(e.left=t.left+(i.width-e.width),e.top=null),"nw"===s&&(e.top=t.top+(i.height-e.height),e.left=t.left+(i.width-e.width)),e},_respectSize:function(e){var t=this._vBoundaries,i=this.axis,s=this._isNumber(e.width)&&t.maxWidth&&t.maxWidth<e.width,n=this._isNumber(e.height)&&t.maxHeight&&t.maxHeight<e.height,a=this._isNumber(e.width)&&t.minWidth&&t.minWidth>e.width,o=this._isNumber(e.height)&&t.minHeight&&t.minHeight>e.height,r=this.originalPosition.left+this.originalSize.width,h=this.position.top+this.size.height,l=/sw|nw|w/.test(i),u=/nw|ne|n/.test(i);return a&&(e.width=t.minWidth),o&&(e.height=t.minHeight),s&&(e.width=t.maxWidth),n&&(e.height=t.maxHeight),a&&l&&(e.left=r-t.minWidth),s&&l&&(e.left=r-t.maxWidth),o&&u&&(e.top=h-t.minHeight),n&&u&&(e.top=h-t.maxHeight),e.width||e.height||e.left||!e.top?e.width||e.height||e.top||!e.left||(e.left=null):e.top=null,e},_getPaddingPlusBorderDimensions:function(e){for(var t=0,i=[],s=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],n=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];4>t;t++)i[t]=parseInt(s[t],10)||0,i[t]+=parseInt(n[t],10)||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var e,t=0,i=this.helper||this.element;this._proportionallyResizeElements.length>t;t++)e=this._proportionallyResizeElements[t],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(e)),e.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var t=this.element,i=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||e("<div style='overflow:hidden;'></div>"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(e,t){return{width:this.originalSize.width+t}},w:function(e,t){var i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(e,t,i){return{height:this.originalSize.height+i}},se:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},sw:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,i,s]))},ne:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},nw:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,i,s]))}},_propagate:function(t,i){e.ui.plugin.call(this,t,[i,this.ui()]),"resize"!==t&&this._trigger(t,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add("resizable","animate",{stop:function(t){var i=e(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,a=n.length&&/textarea/i.test(n[0].nodeName),o=a&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=a?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-o},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,u=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(e.extend(h,u&&l?{top:u,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&e(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(){var t,i,s,n,a,o,r,h=e(this).resizable("instance"),l=h.options,u=h.element,d=l.containment,c=d instanceof e?d.get(0):/parent/.test(d)?u.parent().get(0):d;c&&(h.containerElement=e(c),/document/.test(d)||d===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}):(t=e(c),i=[],e(["Top","Right","Left","Bottom"]).each(function(e,s){i[e]=h._num(t.css("padding"+s))}),h.containerOffset=t.offset(),h.containerPosition=t.position(),h.containerSize={height:t.innerHeight()-i[3],width:t.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,a=h.containerSize.width,o=h._hasScroll(c,"left")?c.scrollWidth:a,r=h._hasScroll(c)?c.scrollHeight:n,h.parentData={element:c,left:s.left,top:s.top,width:o,height:r}))},resize:function(t){var i,s,n,a,o=e(this).resizable("instance"),r=o.options,h=o.containerOffset,l=o.position,u=o._aspectRatio||t.shiftKey,d={top:0,left:0},c=o.containerElement,p=!0;c[0]!==document&&/static/.test(c.css("position"))&&(d=h),l.left<(o._helper?h.left:0)&&(o.size.width=o.size.width+(o._helper?o.position.left-h.left:o.position.left-d.left),u&&(o.size.height=o.size.width/o.aspectRatio,p=!1),o.position.left=r.helper?h.left:0),l.top<(o._helper?h.top:0)&&(o.size.height=o.size.height+(o._helper?o.position.top-h.top:o.position.top),u&&(o.size.width=o.size.height*o.aspectRatio,p=!1),o.position.top=o._helper?h.top:0),n=o.containerElement.get(0)===o.element.parent().get(0),a=/relative|absolute/.test(o.containerElement.css("position")),n&&a?(o.offset.left=o.parentData.left+o.position.left,o.offset.top=o.parentData.top+o.position.top):(o.offset.left=o.element.offset().left,o.offset.top=o.element.offset().top),i=Math.abs(o.sizeDiff.width+(o._helper?o.offset.left-d.left:o.offset.left-h.left)),s=Math.abs(o.sizeDiff.height+(o._helper?o.offset.top-d.top:o.offset.top-h.top)),i+o.size.width>=o.parentData.width&&(o.size.width=o.parentData.width-i,u&&(o.size.height=o.size.width/o.aspectRatio,p=!1)),s+o.size.height>=o.parentData.height&&(o.size.height=o.parentData.height-s,u&&(o.size.width=o.size.height*o.aspectRatio,p=!1)),p||(o.position.left=o.prevPosition.left,o.position.top=o.prevPosition.top,o.size.width=o.prevSize.width,o.size.height=o.prevSize.height)},stop:function(){var t=e(this).resizable("instance"),i=t.options,s=t.containerOffset,n=t.containerPosition,a=t.containerElement,o=e(t.helper),r=o.offset(),h=o.outerWidth()-t.sizeDiff.width,l=o.outerHeight()-t.sizeDiff.height;t._helper&&!i.animate&&/relative/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l}),t._helper&&!i.animate&&/static/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),e.ui.plugin.add("resizable","alsoResize",{start:function(){var t=e(this).resizable("instance"),i=t.options;e(i.alsoResize).each(function(){var t=e(this);t.data("ui-resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})},resize:function(t,i){var s=e(this).resizable("instance"),n=s.options,a=s.originalSize,o=s.originalPosition,r={height:s.size.height-a.height||0,width:s.size.width-a.width||0,top:s.position.top-o.top||0,left:s.position.left-o.left||0};e(n.alsoResize).each(function(){var t=e(this),s=e(this).data("ui-resizable-alsoresize"),n={},a=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(a,function(e,t){var i=(s[t]||0)+(r[t]||0);i&&i>=0&&(n[t]=i||null)}),t.css(n)})},stop:function(){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","ghost",{start:function(){var t=e(this).resizable("instance"),i=t.options,s=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),t.ghost.appendTo(t.helper)},resize:function(){var t=e(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=e(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(){var t,i=e(this).resizable("instance"),s=i.options,n=i.size,a=i.originalSize,o=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,u=h[1]||1,d=Math.round((n.width-a.width)/l)*l,c=Math.round((n.height-a.height)/u)*u,p=a.width+d,f=a.height+c,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,v=s.minWidth&&s.minWidth>p,y=s.minHeight&&s.minHeight>f;s.grid=h,v&&(p+=l),y&&(f+=u),m&&(p-=l),g&&(f-=u),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=o.top-c):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=o.left-d):((0>=f-u||0>=p-l)&&(t=i._getPaddingPlusBorderDimensions(this)),f-u>0?(i.size.height=f,i.position.top=o.top-c):(f=u-t.height,i.size.height=f,i.position.top=o.top+a.height-f),p-l>0?(i.size.width=p,i.position.left=o.left-d):(p=l-t.width,i.size.width=p,i.position.left=o.left+a.width-p))}}),e.ui.resizable,e.widget("ui.dialog",{version:"1.11.4",options:{appendTo:"body",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:"Close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(t){var i=e(this).css(t).offset().top;0>i&&e(this).css("top",t.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),this.options.title=this.options.title||this.originalTitle,this._createWrapper(),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(this.uiDialog),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&e.fn.draggable&&this._makeDraggable(),this.options.resizable&&e.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var t=this.options.appendTo;return t&&(t.jquery||t.nodeType)?e(t):this.document.find(t||"body").eq(0)},_destroy:function(){var e,t=this.originalPosition;this._untrackInstance(),this._destroyOverlay(),this.element.removeUniqueId().removeClass("ui-dialog-content ui-widget-content").css(this.originalCss).detach(),this.uiDialog.stop(!0,!0).remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),e=t.parent.children().eq(t.index),e.length&&e[0]!==this.element[0]?e.before(this.element):t.parent.append(this.element)},widget:function(){return this.uiDialog},disable:e.noop,enable:e.noop,close:function(t){var i,s=this;if(this._isOpen&&this._trigger("beforeClose",t)!==!1){if(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),!this.opener.filter(":focusable").focus().length)try{i=this.document[0].activeElement,i&&"body"!==i.nodeName.toLowerCase()&&e(i).blur()}catch(n){}this._hide(this.uiDialog,this.options.hide,function(){s._trigger("close",t)})}},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(t,i){var s=!1,n=this.uiDialog.siblings(".ui-front:visible").map(function(){return+e(this).css("z-index")}).get(),a=Math.max.apply(null,n);return a>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",a+1),s=!0),s&&!i&&this._trigger("focus",t),s},open:function(){var t=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=e(this.document[0].activeElement),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){t._focusTabbable(),t._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"),void 0)},_focusTabbable:function(){var e=this._focusedElement;e||(e=this.element.find("[autofocus]")),e.length||(e=this.element.find(":tabbable")),e.length||(e=this.uiDialogButtonPane.find(":tabbable")),e.length||(e=this.uiDialogTitlebarClose.filter(":tabbable")),e.length||(e=this.uiDialog),e.eq(0).focus()},_keepFocus:function(t){function i(){var t=this.document[0].activeElement,i=this.uiDialog[0]===t||e.contains(this.uiDialog[0],t);i||this._focusTabbable()}t.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=e("<div>").addClass("ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "+this.options.dialogClass).hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._on(this.uiDialog,{keydown:function(t){if(this.options.closeOnEscape&&!t.isDefaultPrevented()&&t.keyCode&&t.keyCode===e.ui.keyCode.ESCAPE)return t.preventDefault(),this.close(t),void 0; +if(t.keyCode===e.ui.keyCode.TAB&&!t.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");t.target!==n[0]&&t.target!==this.uiDialog[0]||t.shiftKey?t.target!==s[0]&&t.target!==this.uiDialog[0]||!t.shiftKey||(this._delay(function(){n.focus()}),t.preventDefault()):(this._delay(function(){s.focus()}),t.preventDefault())}},mousedown:function(e){this._moveToTop(e)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var t;this.uiDialogTitlebar=e("<div>").addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(this.uiDialog),this._on(this.uiDialogTitlebar,{mousedown:function(t){e(t.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.focus()}}),this.uiDialogTitlebarClose=e("<button type='button'></button>").button({label:this.options.closeText,icons:{primary:"ui-icon-closethick"},text:!1}).addClass("ui-dialog-titlebar-close").appendTo(this.uiDialogTitlebar),this._on(this.uiDialogTitlebarClose,{click:function(e){e.preventDefault(),this.close(e)}}),t=e("<span>").uniqueId().addClass("ui-dialog-title").prependTo(this.uiDialogTitlebar),this._title(t),this.uiDialog.attr({"aria-labelledby":t.attr("id")})},_title:function(e){this.options.title||e.html("&#160;"),e.text(this.options.title)},_createButtonPane:function(){this.uiDialogButtonPane=e("<div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),this.uiButtonSet=e("<div>").addClass("ui-dialog-buttonset").appendTo(this.uiDialogButtonPane),this._createButtons()},_createButtons:function(){var t=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),e.isEmptyObject(i)||e.isArray(i)&&!i.length?(this.uiDialog.removeClass("ui-dialog-buttons"),void 0):(e.each(i,function(i,s){var n,a;s=e.isFunction(s)?{click:s,text:i}:s,s=e.extend({type:"button"},s),n=s.click,s.click=function(){n.apply(t.element[0],arguments)},a={icons:s.icons,text:s.showText},delete s.icons,delete s.showText,e("<button></button>",s).button(a).appendTo(t.uiButtonSet)}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function t(e){return{position:e.position,offset:e.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){e(this).addClass("ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,t(n))},drag:function(e,s){i._trigger("drag",e,t(s))},stop:function(n,a){var o=a.offset.left-i.document.scrollLeft(),r=a.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(o>=0?"+":"")+o+" "+"top"+(r>=0?"+":"")+r,of:i.window},e(this).removeClass("ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,t(a))}})},_makeResizable:function(){function t(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}var i=this,s=this.options,n=s.resizable,a=this.uiDialog.css("position"),o="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:o,start:function(s,n){e(this).addClass("ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,t(n))},resize:function(e,s){i._trigger("resize",e,t(s))},stop:function(n,a){var o=i.uiDialog.offset(),r=o.left-i.document.scrollLeft(),h=o.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(h>=0?"+":"")+h,of:i.window},e(this).removeClass("ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,t(a))}}).css("position",a)},_trackFocus:function(){this._on(this.widget(),{focusin:function(t){this._makeFocusTarget(),this._focusedElement=e(t.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var t=this._trackingInstances(),i=e.inArray(this,t);-1!==i&&t.splice(i,1)},_trackingInstances:function(){var e=this.document.data("ui-dialog-instances");return e||(e=[],this.document.data("ui-dialog-instances",e)),e},_minHeight:function(){var e=this.options;return"auto"===e.height?e.minHeight:Math.min(e.minHeight,e.height)},_position:function(){var e=this.uiDialog.is(":visible");e||this.uiDialog.show(),this.uiDialog.position(this.options.position),e||this.uiDialog.hide()},_setOptions:function(t){var i=this,s=!1,n={};e.each(t,function(e,t){i._setOption(e,t),e in i.sizeRelatedOptions&&(s=!0),e in i.resizableRelatedOptions&&(n[e]=t)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(e,t){var i,s,n=this.uiDialog;"dialogClass"===e&&n.removeClass(this.options.dialogClass).addClass(t),"disabled"!==e&&(this._super(e,t),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:""+t}),"draggable"===e&&(i=n.is(":data(ui-draggable)"),i&&!t&&n.draggable("destroy"),!i&&t&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(s=n.is(":data(ui-resizable)"),s&&!t&&n.resizable("destroy"),s&&"string"==typeof t&&n.resizable("option","handles",t),s||t===!1||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var e,t,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),e=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),t=Math.max(0,s.minHeight-e),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-e):"none","auto"===s.height?this.element.css({minHeight:t,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-e)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var t=e(this);return e("<div>").css({position:"absolute",width:t.outerWidth(),height:t.outerHeight()}).appendTo(t.parent()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(t){return e(t.target).closest(".ui-dialog").length?!0:!!e(t.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var t=!0;this._delay(function(){t=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(e){t||this._allowInteraction(e)||(e.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=e("<div>").addClass("ui-widget-overlay ui-front").appendTo(this._appendTo()),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var e=this.document.data("ui-dialog-overlays")-1;e?this.document.data("ui-dialog-overlays",e):this.document.unbind("focusin").removeData("ui-dialog-overlays"),this.overlay.remove(),this.overlay=null}}}),e.widget("ui.droppable",{version:"1.11.4",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var t,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=e.isFunction(s)?s:function(e){return e.is(s)},this.proportions=function(){return arguments.length?(t=arguments[0],void 0):t?t:t={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this.element.addClass("ui-droppable")},_addToManager:function(t){e.ui.ddmanager.droppables[t]=e.ui.ddmanager.droppables[t]||[],e.ui.ddmanager.droppables[t].push(this)},_splice:function(e){for(var t=0;e.length>t;t++)e[t]===this&&e.splice(t,1)},_destroy:function(){var t=e.ui.ddmanager.droppables[this.options.scope];this._splice(t),this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(t,i){if("accept"===t)this.accept=e.isFunction(i)?i:function(e){return e.is(i)};else if("scope"===t){var s=e.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(t,i)},_activate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger("activate",t,this.ui(i))},_deactivate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger("deactivate",t,this.ui(i))},_over:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",t,this.ui(i)))},_out:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",t,this.ui(i)))},_drop:function(t,i){var s=i||e.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=e(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&e.ui.intersect(s,e.extend(i,{offset:i.element.offset()}),i.options.tolerance,t)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",t,this.ui(s)),this.element):!1):!1},ui:function(e){return{draggable:e.currentItem||e.element,helper:e.helper,position:e.position,offset:e.positionAbs}}}),e.ui.intersect=function(){function e(e,t,i){return e>=t&&t+i>e}return function(t,i,s,n){if(!i.offset)return!1;var a=(t.positionAbs||t.position.absolute).left+t.margins.left,o=(t.positionAbs||t.position.absolute).top+t.margins.top,r=a+t.helperProportions.width,h=o+t.helperProportions.height,l=i.offset.left,u=i.offset.top,d=l+i.proportions().width,c=u+i.proportions().height;switch(s){case"fit":return a>=l&&d>=r&&o>=u&&c>=h;case"intersect":return a+t.helperProportions.width/2>l&&d>r-t.helperProportions.width/2&&o+t.helperProportions.height/2>u&&c>h-t.helperProportions.height/2;case"pointer":return e(n.pageY,u,i.proportions().height)&&e(n.pageX,l,i.proportions().width);case"touch":return(o>=u&&c>=o||h>=u&&c>=h||u>o&&h>c)&&(a>=l&&d>=a||r>=l&&d>=r||l>a&&r>d);default:return!1}}}(),e.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(t,i){var s,n,a=e.ui.ddmanager.droppables[t.options.scope]||[],o=i?i.type:null,r=(t.currentItem||t.element).find(":data(ui-droppable)").addBack();e:for(s=0;a.length>s;s++)if(!(a[s].options.disabled||t&&!a[s].accept.call(a[s].element[0],t.currentItem||t.element))){for(n=0;r.length>n;n++)if(r[n]===a[s].element[0]){a[s].proportions().height=0;continue e}a[s].visible="none"!==a[s].element.css("display"),a[s].visible&&("mousedown"===o&&a[s]._activate.call(a[s],i),a[s].offset=a[s].element.offset(),a[s].proportions({width:a[s].element[0].offsetWidth,height:a[s].element[0].offsetHeight}))}},drop:function(t,i){var s=!1;return e.each((e.ui.ddmanager.droppables[t.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&e.ui.intersect(t,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],t.currentItem||t.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(t,i){t.element.parentsUntil("body").bind("scroll.droppable",function(){t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)})},drag:function(t,i){t.options.refreshPositions&&e.ui.ddmanager.prepareOffsets(t,i),e.each(e.ui.ddmanager.droppables[t.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,a,o=e.ui.intersect(t,this,this.options.tolerance,i),r=!o&&this.isover?"isout":o&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,a=this.element.parents(":data(ui-droppable)").filter(function(){return e(this).droppable("instance").options.scope===n}),a.length&&(s=e(a[0]).droppable("instance"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(t,i){t.element.parentsUntil("body").unbind("scroll.droppable"),t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)}},e.ui.droppable;var y="ui-effects-",b=e;e.effects={effect:{}},function(e,t){function i(e,t,i){var s=d[t.type]||{};return null==e?i||!t.def?null:t.def:(e=s.floor?~~e:parseFloat(e),isNaN(e)?t.def:s.mod?(e+s.mod)%s.mod:0>e?0:e>s.max?s.max:e)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(e,a){var o,r=a.re.exec(i),h=r&&a.parse(r),l=a.space||"rgba";return h?(o=s[l](h),s[u[l].cache]=o[u[l].cache],n=s._rgba=o._rgba,!1):t}),n.length?("0,0,0,0"===n.join()&&e.extend(n,a.transparent),s):a[i]}function n(e,t,i){return i=(i+1)%1,1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+6*(t-e)*(2/3-i):e}var a,o="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[e[1],e[2],e[3],e[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[2.55*e[1],2.55*e[2],2.55*e[3],e[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(e){return[e[1],e[2]/100,e[3]/100,e[4]]}}],l=e.Color=function(t,i,s,n){return new e.Color.fn.parse(t,i,s,n)},u={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},d={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},c=l.support={},p=e("<p>")[0],f=e.each;p.style.cssText="background-color:rgba(1,1,1,.5)",c.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(u,function(e,t){t.cache="_"+e,t.props.alpha={idx:3,type:"percent",def:1}}),l.fn=e.extend(l.prototype,{parse:function(n,o,r,h){if(n===t)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=e(n).css(o),o=t);var d=this,c=e.type(n),p=this._rgba=[];return o!==t&&(n=[n,o,r,h],c="array"),"string"===c?this.parse(s(n)||a._default):"array"===c?(f(u.rgba.props,function(e,t){p[t.idx]=i(n[t.idx],t)}),this):"object"===c?(n instanceof l?f(u,function(e,t){n[t.cache]&&(d[t.cache]=n[t.cache].slice())}):f(u,function(t,s){var a=s.cache;f(s.props,function(e,t){if(!d[a]&&s.to){if("alpha"===e||null==n[e])return;d[a]=s.to(d._rgba)}d[a][t.idx]=i(n[e],t,!0)}),d[a]&&0>e.inArray(null,d[a].slice(0,3))&&(d[a][3]=1,s.from&&(d._rgba=s.from(d[a])))}),this):t},is:function(e){var i=l(e),s=!0,n=this;return f(u,function(e,a){var o,r=i[a.cache];return r&&(o=n[a.cache]||a.to&&a.to(n._rgba)||[],f(a.props,function(e,i){return null!=r[i.idx]?s=r[i.idx]===o[i.idx]:t})),s}),s},_space:function(){var e=[],t=this;return f(u,function(i,s){t[s.cache]&&e.push(i)}),e.pop()},transition:function(e,t){var s=l(e),n=s._space(),a=u[n],o=0===this.alpha()?l("transparent"):this,r=o[a.cache]||a.to(o._rgba),h=r.slice();return s=s[a.cache],f(a.props,function(e,n){var a=n.idx,o=r[a],l=s[a],u=d[n.type]||{};null!==l&&(null===o?h[a]=l:(u.mod&&(l-o>u.mod/2?o+=u.mod:o-l>u.mod/2&&(o-=u.mod)),h[a]=i((l-o)*t+o,n)))}),this[n](h)},blend:function(t){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(t)._rgba;return l(e.map(i,function(e,t){return(1-s)*n[t]+s*e}))},toRgbaString:function(){var t="rgba(",i=e.map(this._rgba,function(e,t){return null==e?t>2?1:0:e});return 1===i[3]&&(i.pop(),t="rgb("),t+i.join()+")"},toHslaString:function(){var t="hsla(",i=e.map(this.hsla(),function(e,t){return null==e&&(e=t>2?1:0),t&&3>t&&(e=Math.round(100*e)+"%"),e});return 1===i[3]&&(i.pop(),t="hsl("),t+i.join()+")"},toHexString:function(t){var i=this._rgba.slice(),s=i.pop();return t&&i.push(~~(255*s)),"#"+e.map(i,function(e){return e=(e||0).toString(16),1===e.length?"0"+e:e}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,u.hsla.to=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t,i,s=e[0]/255,n=e[1]/255,a=e[2]/255,o=e[3],r=Math.max(s,n,a),h=Math.min(s,n,a),l=r-h,u=r+h,d=.5*u;return t=h===r?0:s===r?60*(n-a)/l+360:n===r?60*(a-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=d?l/u:l/(2-u),[Math.round(t)%360,i,d,null==o?1:o]},u.hsla.from=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t=e[0]/360,i=e[1],s=e[2],a=e[3],o=.5>=s?s*(1+i):s+i-s*i,r=2*s-o;return[Math.round(255*n(r,o,t+1/3)),Math.round(255*n(r,o,t)),Math.round(255*n(r,o,t-1/3)),a]},f(u,function(s,n){var a=n.props,o=n.cache,h=n.to,u=n.from;l.fn[s]=function(s){if(h&&!this[o]&&(this[o]=h(this._rgba)),s===t)return this[o].slice();var n,r=e.type(s),d="array"===r||"object"===r?s:arguments,c=this[o].slice();return f(a,function(e,t){var s=d["object"===r?e:t.idx];null==s&&(s=c[t.idx]),c[t.idx]=i(s,t)}),u?(n=l(u(c)),n[o]=c,n):l(c)},f(a,function(t,i){l.fn[t]||(l.fn[t]=function(n){var a,o=e.type(n),h="alpha"===t?this._hsla?"hsla":"rgba":s,l=this[h](),u=l[i.idx];return"undefined"===o?u:("function"===o&&(n=n.call(this,u),o=e.type(n)),null==n&&i.empty?this:("string"===o&&(a=r.exec(n),a&&(n=u+parseFloat(a[2])*("+"===a[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(t){var i=t.split(" ");f(i,function(t,i){e.cssHooks[i]={set:function(t,n){var a,o,r="";if("transparent"!==n&&("string"!==e.type(n)||(a=s(n)))){if(n=l(a||n),!c.rgba&&1!==n._rgba[3]){for(o="backgroundColor"===i?t.parentNode:t;(""===r||"transparent"===r)&&o&&o.style;)try{r=e.css(o,"backgroundColor"),o=o.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{t.style[i]=n}catch(h){}}},e.fx.step[i]=function(t){t.colorInit||(t.start=l(t.elem,i),t.end=l(t.end),t.colorInit=!0),e.cssHooks[i].set(t.elem,t.start.transition(t.end,t.pos))}})},l.hook(o),e.cssHooks.borderColor={expand:function(e){var t={};return f(["Top","Right","Bottom","Left"],function(i,s){t["border"+s+"Color"]=e}),t}},a=e.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(b),function(){function t(t){var i,s,n=t.ownerDocument.defaultView?t.ownerDocument.defaultView.getComputedStyle(t,null):t.currentStyle,a={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(a[e.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(a[i]=n[i]);return a}function i(t,i){var s,a,o={};for(s in i)a=i[s],t[s]!==a&&(n[s]||(e.fx.step[s]||!isNaN(parseFloat(a)))&&(o[s]=a));return o}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};e.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(t,i){e.fx.step[i]=function(e){("none"!==e.end&&!e.setAttr||1===e.pos&&!e.setAttr)&&(b.style(e.elem,i,e.end),e.setAttr=!0)}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e.effects.animateClass=function(n,a,o,r){var h=e.speed(a,o,r);return this.queue(function(){var a,o=e(this),r=o.attr("class")||"",l=h.children?o.find("*").addBack():o;l=l.map(function(){var i=e(this);return{el:i,start:t(this)}}),a=function(){e.each(s,function(e,t){n[t]&&o[t+"Class"](n[t])})},a(),l=l.map(function(){return this.end=t(this.el[0]),this.diff=i(this.start,this.end),this}),o.attr("class",r),l=l.map(function(){var t=this,i=e.Deferred(),s=e.extend({},h,{queue:!1,complete:function(){i.resolve(t)}});return this.el.animate(this.diff,s),i.promise()}),e.when.apply(e,l.get()).done(function(){a(),e.each(arguments,function(){var t=this.el;e.each(this.diff,function(e){t.css(e,"")})}),h.complete.call(o[0])})})},e.fn.extend({addClass:function(t){return function(i,s,n,a){return s?e.effects.animateClass.call(this,{add:i},s,n,a):t.apply(this,arguments)}}(e.fn.addClass),removeClass:function(t){return function(i,s,n,a){return arguments.length>1?e.effects.animateClass.call(this,{remove:i},s,n,a):t.apply(this,arguments)}}(e.fn.removeClass),toggleClass:function(t){return function(i,s,n,a,o){return"boolean"==typeof s||void 0===s?n?e.effects.animateClass.call(this,s?{add:i}:{remove:i},n,a,o):t.apply(this,arguments):e.effects.animateClass.call(this,{toggle:i},s,n,a)}}(e.fn.toggleClass),switchClass:function(t,i,s,n,a){return e.effects.animateClass.call(this,{add:i,remove:t},s,n,a)}})}(),function(){function t(t,i,s,n){return e.isPlainObject(t)&&(i=t,t=t.effect),t={effect:t},null==i&&(i={}),e.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||e.fx.speeds[i])&&(n=s,s=i,i={}),e.isFunction(s)&&(n=s,s=null),i&&e.extend(t,i),s=s||i.duration,t.duration=e.fx.off?0:"number"==typeof s?s:s in e.fx.speeds?e.fx.speeds[s]:e.fx.speeds._default,t.complete=n||i.complete,t}function i(t){return!t||"number"==typeof t||e.fx.speeds[t]?!0:"string"!=typeof t||e.effects.effect[t]?e.isFunction(t)?!0:"object"!=typeof t||t.effect?!1:!0:!0}e.extend(e.effects,{version:"1.11.4",save:function(e,t){for(var i=0;t.length>i;i++)null!==t[i]&&e.data(y+t[i],e[0].style[t[i]])},restore:function(e,t){var i,s;for(s=0;t.length>s;s++)null!==t[s]&&(i=e.data(y+t[s]),void 0===i&&(i=""),e.css(t[s],i))},setMode:function(e,t){return"toggle"===t&&(t=e.is(":hidden")?"show":"hide"),t},getBaseline:function(e,t){var i,s;switch(e[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=e[0]/t.height}switch(e[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=e[1]/t.width}return{x:s,y:i}},createWrapper:function(t){if(t.parent().is(".ui-effects-wrapper"))return t.parent();var i={width:t.outerWidth(!0),height:t.outerHeight(!0),"float":t.css("float")},s=e("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:t.width(),height:t.height()},a=document.activeElement;try{a.id}catch(o){a=document.body}return t.wrap(s),(t[0]===a||e.contains(t[0],a))&&e(a).focus(),s=t.parent(),"static"===t.css("position")?(s.css({position:"relative"}),t.css({position:"relative"})):(e.extend(i,{position:t.css("position"),zIndex:t.css("z-index")}),e.each(["top","left","bottom","right"],function(e,s){i[s]=t.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),t.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),t.css(n),s.css(i).show()},removeWrapper:function(t){var i=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),(t[0]===i||e.contains(t[0],i))&&e(i).focus()),t},setTransition:function(t,i,s,n){return n=n||{},e.each(i,function(e,i){var a=t.cssUnit(i);a[0]>0&&(n[i]=a[0]*s+a[1])}),n}}),e.fn.extend({effect:function(){function i(t){function i(){e.isFunction(a)&&a.call(n[0]),e.isFunction(t)&&t()}var n=e(this),a=s.complete,r=s.mode;(n.is(":hidden")?"hide"===r:"show"===r)?(n[r](),i()):o.call(n[0],s,i)}var s=t.apply(this,arguments),n=s.mode,a=s.queue,o=e.effects.effect[s.effect];return e.fx.off||!o?n?this[n](s.duration,s.complete):this.each(function(){s.complete&&s.complete.call(this)}):a===!1?this.each(i):this.queue(a||"fx",i)},show:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="show",this.effect.call(this,n)}}(e.fn.show),hide:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(e.fn.hide),toggle:function(e){return function(s){if(i(s)||"boolean"==typeof s)return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(e.fn.toggle),cssUnit:function(t){var i=this.css(t),s=[];return e.each(["em","px","%","pt"],function(e,t){i.indexOf(t)>0&&(s=[parseFloat(i),t])}),s}})}(),function(){var t={};e.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,i){t[i]=function(t){return Math.pow(t,e+2)}}),e.extend(t,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)},Elastic:function(e){return 0===e||1===e?e:-Math.pow(2,8*(e-1))*Math.sin((80*(e-1)-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){for(var t,i=4;((t=Math.pow(2,--i))-1)/11>e;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*t-2)/22-e,2)}}),e.each(t,function(t,i){e.easing["easeIn"+t]=i,e.easing["easeOut"+t]=function(e){return 1-i(1-e)},e.easing["easeInOut"+t]=function(e){return.5>e?i(2*e)/2:1-i(-2*e+2)/2}})}(),e.effects,e.effects.effect.blind=function(t,i){var s,n,a,o=e(this),r=/up|down|vertical/,h=/up|left|vertical|horizontal/,l=["position","top","bottom","left","right","height","width"],u=e.effects.setMode(o,t.mode||"hide"),d=t.direction||"up",c=r.test(d),p=c?"height":"width",f=c?"top":"left",m=h.test(d),g={},v="show"===u;o.parent().is(".ui-effects-wrapper")?e.effects.save(o.parent(),l):e.effects.save(o,l),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n=s[p](),a=parseFloat(s.css(f))||0,g[p]=v?n:0,m||(o.css(c?"bottom":"right",0).css(c?"top":"left","auto").css({position:"absolute"}),g[f]=v?a:n+a),v&&(s.css(p,0),m||s.css(f,a+n)),s.animate(g,{duration:t.duration,easing:t.easing,queue:!1,complete:function(){"hide"===u&&o.hide(),e.effects.restore(o,l),e.effects.removeWrapper(o),i()}})},e.effects.effect.bounce=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"effect"),l="hide"===h,u="show"===h,d=t.direction||"up",c=t.distance,p=t.times||5,f=2*p+(u||l?1:0),m=t.duration/f,g=t.easing,v="up"===d||"down"===d?"top":"left",y="up"===d||"left"===d,b=o.queue(),_=b.length;for((u||l)&&r.push("opacity"),e.effects.save(o,r),o.show(),e.effects.createWrapper(o),c||(c=o["top"===v?"outerHeight":"outerWidth"]()/3),u&&(a={opacity:1},a[v]=0,o.css("opacity",0).css(v,y?2*-c:2*c).animate(a,m,g)),l&&(c/=Math.pow(2,p-1)),a={},a[v]=0,s=0;p>s;s++)n={},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g).animate(a,m,g),c=l?2*c:c/2;l&&(n={opacity:0},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g)),o.queue(function(){l&&o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}),_>1&&b.splice.apply(b,[1,0].concat(b.splice(_,f+1))),o.dequeue()},e.effects.effect.clip=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"hide"),l="show"===h,u=t.direction||"vertical",d="vertical"===u,c=d?"height":"width",p=d?"top":"left",f={};e.effects.save(o,r),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n="IMG"===o[0].tagName?s:o,a=n[c](),l&&(n.css(c,0),n.css(p,a/2)),f[c]=l?a:0,f[p]=l?0:a/2,n.animate(f,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){l||o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}})},e.effects.effect.drop=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","opacity","height","width"],o=e.effects.setMode(n,t.mode||"hide"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h?"pos":"neg",d={opacity:r?1:0};e.effects.save(n,a),n.show(),e.effects.createWrapper(n),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0)/2,r&&n.css("opacity",0).css(l,"pos"===u?-s:s),d[l]=(r?"pos"===u?"+=":"-=":"pos"===u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.explode=function(t,i){function s(){b.push(this),b.length===d*c&&n()}function n(){p.css({visibility:"visible"}),e(b).remove(),m||p.hide(),i()}var a,o,r,h,l,u,d=t.pieces?Math.round(Math.sqrt(t.pieces)):3,c=d,p=e(this),f=e.effects.setMode(p,t.mode||"hide"),m="show"===f,g=p.show().css("visibility","hidden").offset(),v=Math.ceil(p.outerWidth()/c),y=Math.ceil(p.outerHeight()/d),b=[];for(a=0;d>a;a++)for(h=g.top+a*y,u=a-(d-1)/2,o=0;c>o;o++)r=g.left+o*v,l=o-(c-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-o*v,top:-a*y}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:v,height:y,left:r+(m?l*v:0),top:h+(m?u*y:0),opacity:m?0:1}).animate({left:r+(m?0:l*v),top:h+(m?0:u*y),opacity:m?1:0},t.duration||500,t.easing,s)},e.effects.effect.fade=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"toggle");s.animate({opacity:n},{queue:!1,duration:t.duration,easing:t.easing,complete:i})},e.effects.effect.fold=function(t,i){var s,n,a=e(this),o=["position","top","bottom","left","right","height","width"],r=e.effects.setMode(a,t.mode||"hide"),h="show"===r,l="hide"===r,u=t.size||15,d=/([0-9]+)%/.exec(u),c=!!t.horizFirst,p=h!==c,f=p?["width","height"]:["height","width"],m=t.duration/2,g={},v={};e.effects.save(a,o),a.show(),s=e.effects.createWrapper(a).css({overflow:"hidden"}),n=p?[s.width(),s.height()]:[s.height(),s.width()],d&&(u=parseInt(d[1],10)/100*n[l?0:1]),h&&s.css(c?{height:0,width:u}:{height:u,width:0}),g[f[0]]=h?n[0]:u,v[f[1]]=h?n[1]:0,s.animate(g,m,t.easing).animate(v,m,t.easing,function(){l&&a.hide(),e.effects.restore(a,o),e.effects.removeWrapper(a),i()})},e.effects.effect.highlight=function(t,i){var s=e(this),n=["backgroundImage","backgroundColor","opacity"],a=e.effects.setMode(s,t.mode||"show"),o={backgroundColor:s.css("backgroundColor")};"hide"===a&&(o.opacity=0),e.effects.save(s,n),s.show().css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(o,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===a&&s.hide(),e.effects.restore(s,n),i()}})},e.effects.effect.size=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","width","height","overflow","opacity"],h=["position","top","bottom","left","right","overflow","opacity"],l=["width","height","overflow"],u=["fontSize"],d=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],c=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=e.effects.setMode(o,t.mode||"effect"),f=t.restore||"effect"!==p,m=t.scale||"both",g=t.origin||["middle","center"],v=o.css("position"),y=f?r:h,b={height:0,width:0,outerHeight:0,outerWidth:0};"show"===p&&o.show(),s={height:o.height(),width:o.width(),outerHeight:o.outerHeight(),outerWidth:o.outerWidth()},"toggle"===t.mode&&"show"===p?(o.from=t.to||b,o.to=t.from||s):(o.from=t.from||("show"===p?b:s),o.to=t.to||("hide"===p?b:s)),a={from:{y:o.from.height/s.height,x:o.from.width/s.width},to:{y:o.to.height/s.height,x:o.to.width/s.width}},("box"===m||"both"===m)&&(a.from.y!==a.to.y&&(y=y.concat(d),o.from=e.effects.setTransition(o,d,a.from.y,o.from),o.to=e.effects.setTransition(o,d,a.to.y,o.to)),a.from.x!==a.to.x&&(y=y.concat(c),o.from=e.effects.setTransition(o,c,a.from.x,o.from),o.to=e.effects.setTransition(o,c,a.to.x,o.to))),("content"===m||"both"===m)&&a.from.y!==a.to.y&&(y=y.concat(u).concat(l),o.from=e.effects.setTransition(o,u,a.from.y,o.from),o.to=e.effects.setTransition(o,u,a.to.y,o.to)),e.effects.save(o,y),o.show(),e.effects.createWrapper(o),o.css("overflow","hidden").css(o.from),g&&(n=e.effects.getBaseline(g,s),o.from.top=(s.outerHeight-o.outerHeight())*n.y,o.from.left=(s.outerWidth-o.outerWidth())*n.x,o.to.top=(s.outerHeight-o.to.outerHeight)*n.y,o.to.left=(s.outerWidth-o.to.outerWidth)*n.x),o.css(o.from),("content"===m||"both"===m)&&(d=d.concat(["marginTop","marginBottom"]).concat(u),c=c.concat(["marginLeft","marginRight"]),l=r.concat(d).concat(c),o.find("*[width]").each(function(){var i=e(this),s={height:i.height(),width:i.width(),outerHeight:i.outerHeight(),outerWidth:i.outerWidth()}; +f&&e.effects.save(i,l),i.from={height:s.height*a.from.y,width:s.width*a.from.x,outerHeight:s.outerHeight*a.from.y,outerWidth:s.outerWidth*a.from.x},i.to={height:s.height*a.to.y,width:s.width*a.to.x,outerHeight:s.height*a.to.y,outerWidth:s.width*a.to.x},a.from.y!==a.to.y&&(i.from=e.effects.setTransition(i,d,a.from.y,i.from),i.to=e.effects.setTransition(i,d,a.to.y,i.to)),a.from.x!==a.to.x&&(i.from=e.effects.setTransition(i,c,a.from.x,i.from),i.to=e.effects.setTransition(i,c,a.to.x,i.to)),i.css(i.from),i.animate(i.to,t.duration,t.easing,function(){f&&e.effects.restore(i,l)})})),o.animate(o.to,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){0===o.to.opacity&&o.css("opacity",o.from.opacity),"hide"===p&&o.hide(),e.effects.restore(o,y),f||("static"===v?o.css({position:"relative",top:o.to.top,left:o.to.left}):e.each(["top","left"],function(e,t){o.css(t,function(t,i){var s=parseInt(i,10),n=e?o.to.left:o.to.top;return"auto"===i?n+"px":s+n+"px"})})),e.effects.removeWrapper(o),i()}})},e.effects.effect.scale=function(t,i){var s=e(this),n=e.extend(!0,{},t),a=e.effects.setMode(s,t.mode||"effect"),o=parseInt(t.percent,10)||(0===parseInt(t.percent,10)?0:"hide"===a?0:100),r=t.direction||"both",h=t.origin,l={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()},u={y:"horizontal"!==r?o/100:1,x:"vertical"!==r?o/100:1};n.effect="size",n.queue=!1,n.complete=i,"effect"!==a&&(n.origin=h||["middle","center"],n.restore=!0),n.from=t.from||("show"===a?{height:0,width:0,outerHeight:0,outerWidth:0}:l),n.to={height:l.height*u.y,width:l.width*u.x,outerHeight:l.outerHeight*u.y,outerWidth:l.outerWidth*u.x},n.fade&&("show"===a&&(n.from.opacity=0,n.to.opacity=1),"hide"===a&&(n.from.opacity=1,n.to.opacity=0)),s.effect(n)},e.effects.effect.puff=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"hide"),a="hide"===n,o=parseInt(t.percent,10)||150,r=o/100,h={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()};e.extend(t,{effect:"scale",queue:!1,fade:!0,mode:n,complete:i,percent:a?o:100,from:a?h:{height:h.height*r,width:h.width*r,outerHeight:h.outerHeight*r,outerWidth:h.outerWidth*r}}),s.effect(t)},e.effects.effect.pulsate=function(t,i){var s,n=e(this),a=e.effects.setMode(n,t.mode||"show"),o="show"===a,r="hide"===a,h=o||"hide"===a,l=2*(t.times||5)+(h?1:0),u=t.duration/l,d=0,c=n.queue(),p=c.length;for((o||!n.is(":visible"))&&(n.css("opacity",0).show(),d=1),s=1;l>s;s++)n.animate({opacity:d},u,t.easing),d=1-d;n.animate({opacity:d},u,t.easing),n.queue(function(){r&&n.hide(),i()}),p>1&&c.splice.apply(c,[1,0].concat(c.splice(p,l+1))),n.dequeue()},e.effects.effect.shake=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","height","width"],o=e.effects.setMode(n,t.mode||"effect"),r=t.direction||"left",h=t.distance||20,l=t.times||3,u=2*l+1,d=Math.round(t.duration/u),c="up"===r||"down"===r?"top":"left",p="up"===r||"left"===r,f={},m={},g={},v=n.queue(),y=v.length;for(e.effects.save(n,a),n.show(),e.effects.createWrapper(n),f[c]=(p?"-=":"+=")+h,m[c]=(p?"+=":"-=")+2*h,g[c]=(p?"-=":"+=")+2*h,n.animate(f,d,t.easing),s=1;l>s;s++)n.animate(m,d,t.easing).animate(g,d,t.easing);n.animate(m,d,t.easing).animate(f,d/2,t.easing).queue(function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}),y>1&&v.splice.apply(v,[1,0].concat(v.splice(y,u+1))),n.dequeue()},e.effects.effect.slide=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","width","height"],o=e.effects.setMode(n,t.mode||"show"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h,d={};e.effects.save(n,a),n.show(),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0),e.effects.createWrapper(n).css({overflow:"hidden"}),r&&n.css(l,u?isNaN(s)?"-"+s:-s:s),d[l]=(r?u?"+=":"-=":u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.transfer=function(t,i){var s=e(this),n=e(t.to),a="fixed"===n.css("position"),o=e("body"),r=a?o.scrollTop():0,h=a?o.scrollLeft():0,l=n.offset(),u={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},d=s.offset(),c=e("<div class='ui-effects-transfer'></div>").appendTo(document.body).addClass(t.className).css({top:d.top-r,left:d.left-h,height:s.innerHeight(),width:s.innerWidth(),position:a?"fixed":"absolute"}).animate(u,t.duration,t.easing,function(){c.remove(),i()})},e.widget("ui.progressbar",{version:"1.11.4",options:{max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min}),this.valueDiv=e("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove()},value:function(e){return void 0===e?this.options.value:(this.options.value=this._constrainedValue(e),this._refreshValue(),void 0)},_constrainedValue:function(e){return void 0===e&&(e=this.options.value),this.indeterminate=e===!1,"number"!=typeof e&&(e=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,e))},_setOptions:function(e){var t=e.value;delete e.value,this._super(e),this.options.value=this._constrainedValue(t),this._refreshValue()},_setOption:function(e,t){"max"===e&&(t=Math.max(this.min,t)),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var t=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||t>this.min).toggleClass("ui-corner-right",t===this.options.max).width(i.toFixed(0)+"%"),this.element.toggleClass("ui-progressbar-indeterminate",this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=e("<div class='ui-progressbar-overlay'></div>").appendTo(this.valueDiv))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":t}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==t&&(this.oldValue=t,this._trigger("change")),t===this.options.max&&this._trigger("complete")}}),e.widget("ui.selectable",e.ui.mouse,{version:"1.11.4",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var t,i=this;this.element.addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){t=e(i.options.filter,i.element[0]),t.addClass("ui-selectee"),t.each(function(){var t=e(this),i=t.offset();e.data(this,"selectable-item",{element:this,$element:t,left:i.left,top:i.top,right:i.left+t.outerWidth(),bottom:i.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=t.addClass("ui-selectee"),this._mouseInit(),this.helper=e("<div class='ui-selectable-helper'></div>")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(t){var i=this,s=this.options;this.opos=[t.pageX,t.pageY],this.options.disabled||(this.selectees=e(s.filter,this.element[0]),this._trigger("start",t),e(s.appendTo).append(this.helper),this.helper.css({left:t.pageX,top:t.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=e.data(this,"selectable-item");s.startselected=!0,t.metaKey||t.ctrlKey||(s.$element.removeClass("ui-selected"),s.selected=!1,s.$element.addClass("ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",t,{unselecting:s.element}))}),e(t.target).parents().addBack().each(function(){var s,n=e.data(this,"selectable-item");return n?(s=!t.metaKey&&!t.ctrlKey||!n.$element.hasClass("ui-selected"),n.$element.removeClass(s?"ui-unselecting":"ui-selected").addClass(s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",t,{selecting:n.element}):i._trigger("unselecting",t,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(t){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,a=this.opos[0],o=this.opos[1],r=t.pageX,h=t.pageY;return a>r&&(i=r,r=a,a=i),o>h&&(i=h,h=o,o=i),this.helper.css({left:a,top:o,width:r-a,height:h-o}),this.selectees.each(function(){var i=e.data(this,"selectable-item"),l=!1;i&&i.element!==s.element[0]&&("touch"===n.tolerance?l=!(i.left>r||a>i.right||i.top>h||o>i.bottom):"fit"===n.tolerance&&(l=i.left>a&&r>i.right&&i.top>o&&h>i.bottom),l?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,s._trigger("selecting",t,{selecting:i.element}))):(i.selecting&&((t.metaKey||t.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",t,{unselecting:i.element}))),i.selected&&(t.metaKey||t.ctrlKey||i.startselected||(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",t,{unselecting:i.element})))))}),!1}},_mouseStop:function(t){var i=this;return this.dragged=!1,e(".ui-unselecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",t,{unselected:s.element})}),e(".ui-selecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-selecting").addClass("ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",t,{selected:s.element})}),this._trigger("stop",t),this.helper.remove(),!1}}),e.widget("ui.selectmenu",{version:"1.11.4",defaultElement:"<select>",options:{appendTo:null,disabled:null,icons:{button:"ui-icon-triangle-1-s"},position:{my:"left top",at:"left bottom",collision:"none"},width:null,change:null,close:null,focus:null,open:null,select:null},_create:function(){var e=this.element.uniqueId().attr("id");this.ids={element:e,button:e+"-button",menu:e+"-menu"},this._drawButton(),this._drawMenu(),this.options.disabled&&this.disable()},_drawButton:function(){var t=this;this.label=e("label[for='"+this.ids.element+"']").attr("for",this.ids.button),this._on(this.label,{click:function(e){this.button.focus(),e.preventDefault()}}),this.element.hide(),this.button=e("<span>",{"class":"ui-selectmenu-button ui-widget ui-state-default ui-corner-all",tabindex:this.options.disabled?-1:0,id:this.ids.button,role:"combobox","aria-expanded":"false","aria-autocomplete":"list","aria-owns":this.ids.menu,"aria-haspopup":"true"}).insertAfter(this.element),e("<span>",{"class":"ui-icon "+this.options.icons.button}).prependTo(this.button),this.buttonText=e("<span>",{"class":"ui-selectmenu-text"}).appendTo(this.button),this._setText(this.buttonText,this.element.find("option:selected").text()),this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one("focusin",function(){t.menuItems||t._refreshMenu()}),this._hoverable(this.button),this._focusable(this.button)},_drawMenu:function(){var t=this;this.menu=e("<ul>",{"aria-hidden":"true","aria-labelledby":this.ids.button,id:this.ids.menu}),this.menuWrap=e("<div>",{"class":"ui-selectmenu-menu ui-front"}).append(this.menu).appendTo(this._appendTo()),this.menuInstance=this.menu.menu({role:"listbox",select:function(e,i){e.preventDefault(),t._setSelection(),t._select(i.item.data("ui-selectmenu-item"),e)},focus:function(e,i){var s=i.item.data("ui-selectmenu-item");null!=t.focusIndex&&s.index!==t.focusIndex&&(t._trigger("focus",e,{item:s}),t.isOpen||t._select(s,e)),t.focusIndex=s.index,t.button.attr("aria-activedescendant",t.menuItems.eq(s.index).attr("id"))}}).menu("instance"),this.menu.addClass("ui-corner-bottom").removeClass("ui-corner-all"),this.menuInstance._off(this.menu,"mouseleave"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this._setText(this.buttonText,this._getSelectedItem().text()),this.options.width||this._resizeButton()},_refreshMenu:function(){this.menu.empty();var e,t=this.element.find("option");t.length&&(this._parseOptions(t),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find("li").not(".ui-selectmenu-optgroup"),e=this._getSelectedItem(),this.menuInstance.focus(null,e),this._setAria(e.data("ui-selectmenu-item")),this._setOption("disabled",this.element.prop("disabled")))},open:function(e){this.options.disabled||(this.menuItems?(this.menu.find(".ui-state-focus").removeClass("ui-state-focus"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger("open",e))},_position:function(){this.menuWrap.position(e.extend({of:this.button},this.options.position))},close:function(e){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this.range=null,this._off(this.document),this._trigger("close",e))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderMenu:function(t,i){var s=this,n="";e.each(i,function(i,a){a.optgroup!==n&&(e("<li>",{"class":"ui-selectmenu-optgroup ui-menu-divider"+(a.element.parent("optgroup").prop("disabled")?" ui-state-disabled":""),text:a.optgroup}).appendTo(t),n=a.optgroup),s._renderItemData(t,a)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-selectmenu-item",t)},_renderItem:function(t,i){var s=e("<li>");return i.disabled&&s.addClass("ui-state-disabled"),this._setText(s,i.label),s.appendTo(t)},_setText:function(e,t){t?e.text(t):e.html("&#160;")},_move:function(e,t){var i,s,n=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex):(i=this.menuItems.eq(this.element[0].selectedIndex),n+=":not(.ui-state-disabled)"),s="first"===e||"last"===e?i["first"===e?"prevAll":"nextAll"](n).eq(-1):i[e+"All"](n).eq(0),s.length&&this.menuInstance.focus(t,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex)},_toggle:function(e){this[this.isOpen?"close":"open"](e)},_setSelection:function(){var e;this.range&&(window.getSelection?(e=window.getSelection(),e.removeAllRanges(),e.addRange(this.range)):this.range.select(),this.button.focus())},_documentClick:{mousedown:function(t){this.isOpen&&(e(t.target).closest(".ui-selectmenu-menu, #"+this.ids.button).length||this.close(t))}},_buttonEvents:{mousedown:function(){var e;window.getSelection?(e=window.getSelection(),e.rangeCount&&(this.range=e.getRangeAt(0))):this.range=document.selection.createRange()},click:function(e){this._setSelection(),this._toggle(e)},keydown:function(t){var i=!0;switch(t.keyCode){case e.ui.keyCode.TAB:case e.ui.keyCode.ESCAPE:this.close(t),i=!1;break;case e.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(t);break;case e.ui.keyCode.UP:t.altKey?this._toggle(t):this._move("prev",t);break;case e.ui.keyCode.DOWN:t.altKey?this._toggle(t):this._move("next",t);break;case e.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(t):this._toggle(t);break;case e.ui.keyCode.LEFT:this._move("prev",t);break;case e.ui.keyCode.RIGHT:this._move("next",t);break;case e.ui.keyCode.HOME:case e.ui.keyCode.PAGE_UP:this._move("first",t);break;case e.ui.keyCode.END:case e.ui.keyCode.PAGE_DOWN:this._move("last",t);break;default:this.menu.trigger(t),i=!1}i&&t.preventDefault()}},_selectFocusedItem:function(e){var t=this.menuItems.eq(this.focusIndex);t.hasClass("ui-state-disabled")||this._select(t.data("ui-selectmenu-item"),e)},_select:function(e,t){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=e.index,this._setText(this.buttonText,e.label),this._setAria(e),this._trigger("select",t,{item:e}),e.index!==i&&this._trigger("change",t,{item:e}),this.close(t)},_setAria:function(e){var t=this.menuItems.eq(e.index).attr("id");this.button.attr({"aria-labelledby":t,"aria-activedescendant":t}),this.menu.attr("aria-activedescendant",t)},_setOption:function(e,t){"icons"===e&&this.button.find("span.ui-icon").removeClass(this.options.icons.button).addClass(t.button),this._super(e,t),"appendTo"===e&&this.menuWrap.appendTo(this._appendTo()),"disabled"===e&&(this.menuInstance.option("disabled",t),this.button.toggleClass("ui-state-disabled",t).attr("aria-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)),"width"===e&&this._resizeButton()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_toggleAttr:function(){this.button.toggleClass("ui-corner-top",this.isOpen).toggleClass("ui-corner-all",!this.isOpen).attr("aria-expanded",this.isOpen),this.menuWrap.toggleClass("ui-selectmenu-open",this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var e=this.options.width;e||(e=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(e)},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){return{disabled:this.element.prop("disabled")}},_parseOptions:function(t){var i=[];t.each(function(t,s){var n=e(s),a=n.parent("optgroup");i.push({element:n,index:t,value:n.val(),label:n.text(),optgroup:a.attr("label")||"",disabled:a.prop("disabled")||n.prop("disabled")})}),this.items=i},_destroy:function(){this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.label.attr("for",this.ids.element)}}),e.widget("ui.slider",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"),this._refresh(),this._setOption("disabled",this.options.disabled),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var t,i,s=this.options,n=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),a="<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>",o=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),t=n.length;i>t;t++)o.push(a);this.handles=n.add(e(o.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.each(function(t){e(this).data("ui-slider-handle-index",t)})},_createRange:function(){var t=this.options,i="";t.range?(t.range===!0&&(t.values?t.values.length&&2!==t.values.length?t.values=[t.values[0],t.values[0]]:e.isArray(t.values)&&(t.values=t.values.slice(0)):t.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?this.range.removeClass("ui-slider-range-min ui-slider-range-max").css({left:"",bottom:""}):(this.range=e("<div></div>").appendTo(this.element),i="ui-slider-range ui-widget-header ui-corner-all"),this.range.addClass(i+("min"===t.range||"max"===t.range?" ui-slider-range-"+t.range:""))):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(t){var i,s,n,a,o,r,h,l,u=this,d=this.options;return d.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:t.pageX,y:t.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var i=Math.abs(s-u.values(t));(n>i||n===i&&(t===u._lastChangedValue||u.values(t)===d.min))&&(n=i,a=e(this),o=t)}),r=this._start(t,o),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=o,a.addClass("ui-state-active").focus(),h=a.offset(),l=!e(t.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:t.pageX-h.left-a.width()/2,top:t.pageY-h.top-a.height()/2-(parseInt(a.css("borderTopWidth"),10)||0)-(parseInt(a.css("borderBottomWidth"),10)||0)+(parseInt(a.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,o,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(e){var t={x:e.pageX,y:e.pageY},i=this._normValueFromMouse(t);return this._slide(e,this._handleIndex,i),!1},_mouseStop:function(e){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(e,this._handleIndex),this._change(e,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(e){var t,i,s,n,a;return"horizontal"===this.orientation?(t=this.elementSize.width,i=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(t=this.elementSize.height,i=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/t,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),a=this._valueMin()+s*n,this._trimAlignValue(a)},_start:function(e,t){var i={handle:this.handles[t],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("start",e,i)},_slide:function(e,t,i){var s,n,a;this.options.values&&this.options.values.length?(s=this.values(t?0:1),2===this.options.values.length&&this.options.range===!0&&(0===t&&i>s||1===t&&s>i)&&(i=s),i!==this.values(t)&&(n=this.values(),n[t]=i,a=this._trigger("slide",e,{handle:this.handles[t],value:i,values:n}),s=this.values(t?0:1),a!==!1&&this.values(t,i))):i!==this.value()&&(a=this._trigger("slide",e,{handle:this.handles[t],value:i}),a!==!1&&this.value(i))},_stop:function(e,t){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("stop",e,i)},_change:function(e,t){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._lastChangedValue=t,this._trigger("change",e,i)}},value:function(e){return arguments.length?(this.options.value=this._trimAlignValue(e),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(t,i){var s,n,a;if(arguments.length>1)return this.options.values[t]=this._trimAlignValue(i),this._refreshValue(),this._change(null,t),void 0;if(!arguments.length)return this._values();if(!e.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(t):this.value();for(s=this.options.values,n=arguments[0],a=0;s.length>a;a+=1)s[a]=this._trimAlignValue(n[a]),this._change(null,a);this._refreshValue()},_setOption:function(t,i){var s,n=0;switch("range"===t&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),e.isArray(this.options.values)&&(n=this.options.values.length),"disabled"===t&&this.element.toggleClass("ui-state-disabled",!!i),this._super(t,i),t){case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue(),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case"step":case"min":case"max":this._animateOff=!0,this._calculateNewMax(),this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_value:function(){var e=this.options.value;return e=this._trimAlignValue(e)},_values:function(e){var t,i,s;if(arguments.length)return t=this.options.values[e],t=this._trimAlignValue(t);if(this.options.values&&this.options.values.length){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(e){if(this._valueMin()>=e)return this._valueMin();if(e>=this._valueMax())return this._valueMax();var t=this.options.step>0?this.options.step:1,i=(e-this._valueMin())%t,s=e-i;return 2*Math.abs(i)>=t&&(s+=i>0?t:-t),parseFloat(s.toFixed(5))},_calculateNewMax:function(){var e=this.options.max,t=this._valueMin(),i=this.options.step,s=Math.floor(+(e-t).toFixed(this._precision())/i)*i;e=s+t,this.max=parseFloat(e.toFixed(this._precision()))},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshValue:function(){var t,i,s,n,a,o=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,u={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),u["horizontal"===h.orientation?"left":"bottom"]=i+"%",e(this).stop(1,1)[l?"animate":"css"](u,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-t+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-t+"%"},{queue:!1,duration:r.animate}))),t=i}):(s=this.value(),n=this._valueMin(),a=this._valueMax(),i=a!==n?100*((s-n)/(a-n)):0,u["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](u,r.animate),"min"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===o&&"horizontal"===this.orientation&&this.range[l?"animate":"css"]({width:100-i+"%"},{queue:!1,duration:r.animate}),"min"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===o&&"vertical"===this.orientation&&this.range[l?"animate":"css"]({height:100-i+"%"},{queue:!1,duration:r.animate}))},_handleEvents:{keydown:function(t){var i,s,n,a,o=e(t.target).data("ui-slider-handle-index");switch(t.keyCode){case e.ui.keyCode.HOME:case e.ui.keyCode.END:case e.ui.keyCode.PAGE_UP:case e.ui.keyCode.PAGE_DOWN:case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(t.preventDefault(),!this._keySliding&&(this._keySliding=!0,e(t.target).addClass("ui-state-active"),i=this._start(t,o),i===!1))return}switch(a=this.options.step,s=n=this.options.values&&this.options.values.length?this.values(o):this.value(),t.keyCode){case e.ui.keyCode.HOME:n=this._valueMin();break;case e.ui.keyCode.END:n=this._valueMax();break;case e.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+a);break;case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-a)}this._slide(t,o,n)},keyup:function(t){var i=e(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,i),this._change(t,i),e(t.target).removeClass("ui-state-active"))}}}),e.widget("ui.sortable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(e,t,i){return e>=t&&t+i>e},_isFloating:function(e){return/left|right/.test(e.css("float"))||/inline|table-cell/.test(e.css("display"))},_create:function(){this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(e,t){this._super(e,t),"handle"===e&&this._setHandleClassName()},_setHandleClassName:function(){this.element.find(".ui-sortable-handle").removeClass("ui-sortable-handle"),e.each(this.items,function(){(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item).addClass("ui-sortable-handle")})},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").find(".ui-sortable-handle").removeClass("ui-sortable-handle"),this._mouseDestroy();for(var e=this.items.length-1;e>=0;e--)this.items[e].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(t,i){var s=null,n=!1,a=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(t),e(t.target).parents().each(function(){return e.data(this,a.widgetName+"-item")===a?(s=e(this),!1):void 0}),e.data(t.target,a.widgetName+"-item")===a&&(s=e(t.target)),s?!this.options.handle||i||(e(this.options.handle,s).find("*").addBack().each(function(){this===t.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(t,i,s){var n,a,o=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(t),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,o.cursorAt&&this._adjustOffsetFromHelper(o.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),o.containment&&this._setContainment(),o.cursor&&"auto"!==o.cursor&&(a=this.document.find("body"),this.storedCursor=a.css("cursor"),a.css("cursor",o.cursor),this.storedStylesheet=e("<style>*{ cursor: "+o.cursor+" !important; }</style>").appendTo(a)),o.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",o.opacity)),o.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",o.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",t,this._uiHash(this)); +return e.ui.ddmanager&&(e.ui.ddmanager.current=this),e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(t),!0},_mouseDrag:function(t){var i,s,n,a,o=this.options,r=!1;for(this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY<o.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+o.scrollSpeed:t.pageY-this.overflowOffset.top<o.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-o.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-t.pageX<o.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+o.scrollSpeed:t.pageX-this.overflowOffset.left<o.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-o.scrollSpeed)):(t.pageY-this.document.scrollTop()<o.scrollSensitivity?r=this.document.scrollTop(this.document.scrollTop()-o.scrollSpeed):this.window.height()-(t.pageY-this.document.scrollTop())<o.scrollSensitivity&&(r=this.document.scrollTop(this.document.scrollTop()+o.scrollSpeed)),t.pageX-this.document.scrollLeft()<o.scrollSensitivity?r=this.document.scrollLeft(this.document.scrollLeft()-o.scrollSpeed):this.window.width()-(t.pageX-this.document.scrollLeft())<o.scrollSensitivity&&(r=this.document.scrollLeft(this.document.scrollLeft()+o.scrollSpeed))),r!==!1&&e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],a=this._intersectsWithPointer(s),a&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===a?"next":"prev"]()[0]!==n&&!e.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!e.contains(this.element[0],n):!0)){if(this.direction=1===a?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(t,s),this._trigger("change",t,this._uiHash());break}return this._contactContainers(t),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),this._trigger("sort",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,i){if(t){if(e.ui.ddmanager&&!this.options.dropBehaviour&&e.ui.ddmanager.drop(this,t),this.options.revert){var s=this,n=this.placeholder.offset(),a=this.options.axis,o={};a&&"x"!==a||(o.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),a&&"y"!==a||(o.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,e(this.helper).animate(o,parseInt(this.options.revert,10)||500,function(){s._clear(t)})}else this._clear(t,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var t=this.containers.length-1;t>=0;t--)this.containers[t]._trigger("deactivate",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger("out",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),e.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?e(this.domPosition.prev).after(this.currentItem):e(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},e(i).each(function(){var i=(e(t.item||this).attr(t.attribute||"id")||"").match(t.expression||/(.+)[\-=_](.+)/);i&&s.push((t.key||i[1]+"[]")+"="+(t.key&&t.expression?i[1]:i[2]))}),!s.length&&t.key&&s.push(t.key+"="),s.join("&")},toArray:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},i.each(function(){s.push(e(t.item||this).attr(t.attribute||"id")||"")}),s},_intersectsWith:function(e){var t=this.positionAbs.left,i=t+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,a=e.left,o=a+e.width,r=e.top,h=r+e.height,l=this.offset.click.top,u=this.offset.click.left,d="x"===this.options.axis||s+l>r&&h>s+l,c="y"===this.options.axis||t+u>a&&o>t+u,p=d&&c;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>e[this.floating?"width":"height"]?p:t+this.helperProportions.width/2>a&&o>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(e){var t="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top,e.height),i="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left,e.width),s=t&&i,n=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return s?this.floating?a&&"right"===a||"down"===n?2:1:n&&("down"===n?2:1):!1},_intersectsWithSides:function(e){var t=this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top+e.height/2,e.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left+e.width/2,e.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&t||"up"===s&&!t)},_getDragVerticalDirection:function(){var e=this.positionAbs.top-this.lastPositionAbs.top;return 0!==e&&(e>0?"down":"up")},_getDragHorizontalDirection:function(){var e=this.positionAbs.left-this.lastPositionAbs.left;return 0!==e&&(e>0?"right":"left")},refresh:function(e){return this._refreshItems(e),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var e=this.options;return e.connectWith.constructor===String?[e.connectWith]:e.connectWith},_getItemsAsjQuery:function(t){function i(){r.push(this)}var s,n,a,o,r=[],h=[],l=this._connectWith();if(l&&t)for(s=l.length-1;s>=0;s--)for(a=e(l[s],this.document[0]),n=a.length-1;n>=0;n--)o=e.data(a[n],this.widgetFullName),o&&o!==this&&!o.options.disabled&&h.push([e.isFunction(o.options.items)?o.options.items.call(o.element):e(o.options.items,o.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),o]);for(h.push([e.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):e(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return e(r)},_removeCurrentsFromItems:function(){var t=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=e.grep(this.items,function(e){for(var i=0;t.length>i;i++)if(t[i]===e.item[0])return!1;return!0})},_refreshItems:function(t){this.items=[],this.containers=[this];var i,s,n,a,o,r,h,l,u=this.items,d=[[e.isFunction(this.options.items)?this.options.items.call(this.element[0],t,{item:this.currentItem}):e(this.options.items,this.element),this]],c=this._connectWith();if(c&&this.ready)for(i=c.length-1;i>=0;i--)for(n=e(c[i],this.document[0]),s=n.length-1;s>=0;s--)a=e.data(n[s],this.widgetFullName),a&&a!==this&&!a.options.disabled&&(d.push([e.isFunction(a.options.items)?a.options.items.call(a.element[0],t,{item:this.currentItem}):e(a.options.items,a.element),a]),this.containers.push(a));for(i=d.length-1;i>=0;i--)for(o=d[i][1],r=d[i][0],s=0,l=r.length;l>s;s++)h=e(r[s]),h.data(this.widgetName+"-item",o),u.push({item:h,instance:o,width:0,height:0,left:0,top:0})},refreshPositions:function(t){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,a;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?e(this.options.toleranceElement,s.item):s.item,t||(s.width=n.outerWidth(),s.height=n.outerHeight()),a=n.offset(),s.left=a.left,s.top=a.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)a=this.containers[i].element.offset(),this.containers[i].containerCache.left=a.left,this.containers[i].containerCache.top=a.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(t){t=t||this;var i,s=t.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=t.currentItem[0].nodeName.toLowerCase(),n=e("<"+s+">",t.document[0]).addClass(i||t.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tbody"===s?t._createTrPlaceholder(t.currentItem.find("tr").eq(0),e("<tr>",t.document[0]).appendTo(n)):"tr"===s?t._createTrPlaceholder(t.currentItem,n):"img"===s&&n.attr("src",t.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(e,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(t.currentItem.innerHeight()-parseInt(t.currentItem.css("paddingTop")||0,10)-parseInt(t.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(t.currentItem.innerWidth()-parseInt(t.currentItem.css("paddingLeft")||0,10)-parseInt(t.currentItem.css("paddingRight")||0,10)))}}),t.placeholder=e(s.placeholder.element.call(t.element,t.currentItem)),t.currentItem.after(t.placeholder),s.placeholder.update(t,t.placeholder)},_createTrPlaceholder:function(t,i){var s=this;t.children().each(function(){e("<td>&#160;</td>",s.document[0]).attr("colspan",e(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(t){var i,s,n,a,o,r,h,l,u,d,c=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!e.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(c&&e.contains(this.containers[i].element[0],c.element[0]))continue;c=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",t,this._uiHash(this)),this.containers[i].containerCache.over=0);if(c)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,a=null,u=c.floating||this._isFloating(this.currentItem),o=u?"left":"top",r=u?"width":"height",d=u?"clientX":"clientY",s=this.items.length-1;s>=0;s--)e.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(h=this.items[s].item.offset()[o],l=!1,t[d]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(t[d]-h)&&(n=Math.abs(t[d]-h),a=this.items[s],this.direction=l?"up":"down"));if(!a&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;a?this._rearrange(t,a,null,!0):this._rearrange(t,null,this.containers[p].element,!0),this._trigger("change",t,this._uiHash()),this.containers[p]._trigger("change",t,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||e("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&e.ui.ie)&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var e=this.currentItem.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.width():this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(t=e(n.containment)[0],i=e(n.containment).offset(),s="hidden"!==e(t).css("overflow"),this.containment=[i.left+(parseInt(e(t).css("borderLeftWidth"),10)||0)+(parseInt(e(t).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(e(t).css("borderTopWidth"),10)||0)+(parseInt(e(t).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(t.scrollWidth,t.offsetWidth):t.offsetWidth)-(parseInt(e(t).css("borderLeftWidth"),10)||0)-(parseInt(e(t).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(t.scrollHeight,t.offsetHeight):t.offsetHeight)-(parseInt(e(t).css("borderTopWidth"),10)||0)-(parseInt(e(t).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(t,i){i||(i=this.position);var s="absolute"===t?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,a=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():a?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():a?0:n.scrollLeft())*s}},_generatePosition:function(t){var i,s,n=this.options,a=t.pageX,o=t.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(t.pageX-this.offset.click.left<this.containment[0]&&(a=this.containment[0]+this.offset.click.left),t.pageY-this.offset.click.top<this.containment[1]&&(o=this.containment[1]+this.offset.click.top),t.pageX-this.offset.click.left>this.containment[2]&&(a=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1],o=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((a-this.originalPageX)/n.grid[0])*n.grid[0],a=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(e,t,i,s){i?i[0].appendChild(this.placeholder[0]):t.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?t.item[0]:t.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(e,t){function i(e,t,i){return function(s){i._trigger(e,s,t._uiHash(t))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!t&&n.push(function(e){this._trigger("receive",e,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||t||n.push(function(e){this._trigger("update",e,this._uiHash())}),this!==this.currentContainer&&(t||(n.push(function(e){this._trigger("remove",e,this._uiHash())}),n.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)t||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,t||this._trigger("beforeStop",e,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!t){for(s=0;n.length>s;s++)n[s].call(this,e);this._trigger("stop",e,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){e.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(t){var i=t||this;return{helper:i.helper,placeholder:i.placeholder||e([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:t?t.element:null}}}),e.widget("ui.spinner",{version:"1.11.4",defaultElement:"<input>",widgetEventPrefix:"spin",options:{culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var t={},i=this.element;return e.each(["min","max","step"],function(e,s){var n=i.attr(s);void 0!==n&&n.length&&(t[s]=n)}),t},_events:{keydown:function(e){this._start(e)&&this._keydown(e)&&e.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",e),void 0)},mousewheel:function(e,t){if(t){if(!this.spinning&&!this._start(e))return!1;this._spin((t>0?1:-1)*this.options.step,e),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(e)},100),e.preventDefault()}},"mousedown .ui-spinner-button":function(t){function i(){var e=this.element[0]===this.document[0].activeElement;e||(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),t.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(t)!==!1&&this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(t){return e(t.currentTarget).hasClass("ui-state-active")?this._start(t)===!1?!1:(this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var e=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this.element.attr("role","spinbutton"),this.buttons=e.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all"),this.buttons.height()>Math.ceil(.5*e.height())&&e.height()>0&&e.height(e.height()),this.options.disabled&&this.disable()},_keydown:function(t){var i=this.options,s=e.ui.keyCode;switch(t.keyCode){case s.UP:return this._repeat(null,1,t),!0;case s.DOWN:return this._repeat(null,-1,t),!0;case s.PAGE_UP:return this._repeat(null,i.page,t),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,t),!0}return!1},_uiSpinnerHtml:function(){return"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>"},_buttonHtml:function(){return"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'><span class='ui-icon "+this.options.icons.up+"'>&#9650;</span>"+"</a>"+"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>"+"<span class='ui-icon "+this.options.icons.down+"'>&#9660;</span>"+"</a>"},_start:function(e){return this.spinning||this._trigger("start",e)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(e,t,i){e=e||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,t,i)},e),this._spin(t*this.options.step,i)},_spin:function(e,t){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+e*this._increment(this.counter)),this.spinning&&this._trigger("spin",t,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(t){var i=this.options.incremental;return i?e.isFunction(i)?i(t):Math.floor(t*t*t/5e4-t*t/500+17*t/200+1):1},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_adjustValue:function(e){var t,i,s=this.options;return t=null!==s.min?s.min:0,i=e-t,i=Math.round(i/s.step)*s.step,e=t+i,e=parseFloat(e.toFixed(this._precision())),null!==s.max&&e>s.max?s.max:null!==s.min&&s.min>e?s.min:e},_stop:function(e){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",e))},_setOption:function(e,t){if("culture"===e||"numberFormat"===e){var i=this._parse(this.element.val());return this.options[e]=t,this.element.val(this._format(i)),void 0}("max"===e||"min"===e||"step"===e)&&"string"==typeof t&&(t=this._parse(t)),"icons"===e&&(this.buttons.first().find(".ui-icon").removeClass(this.options.icons.up).addClass(t.up),this.buttons.last().find(".ui-icon").removeClass(this.options.icons.down).addClass(t.down)),this._super(e,t),"disabled"===e&&(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable"))},_setOptions:h(function(e){this._super(e)}),_parse:function(e){return"string"==typeof e&&""!==e&&(e=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(e,10,this.options.culture):+e),""===e||isNaN(e)?null:e},_format:function(e){return""===e?"":window.Globalize&&this.options.numberFormat?Globalize.format(e,this.options.numberFormat,this.options.culture):e},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var e=this.value();return null===e?!1:e===this._adjustValue(e)},_value:function(e,t){var i;""!==e&&(i=this._parse(e),null!==i&&(t||(i=this._adjustValue(i)),e=this._format(i))),this.element.val(e),this._refresh()},_destroy:function(){this.element.removeClass("ui-spinner-input").prop("disabled",!1).removeAttr("autocomplete").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:h(function(e){this._stepUp(e)}),_stepUp:function(e){this._start()&&(this._spin((e||1)*this.options.step),this._stop())},stepDown:h(function(e){this._stepDown(e)}),_stepDown:function(e){this._start()&&(this._spin((e||1)*-this.options.step),this._stop())},pageUp:h(function(e){this._stepUp((e||1)*this.options.page)}),pageDown:h(function(e){this._stepDown((e||1)*this.options.page)}),value:function(e){return arguments.length?(h(this._value).call(this,e),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),e.widget("ui.tabs",{version:"1.11.4",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var e=/#.*$/;return function(t){var i,s;t=t.cloneNode(!1),i=t.href.replace(e,""),s=location.href.replace(e,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return t.hash.length>1&&i===s}}(),_create:function(){var t=this,i=this.options;this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",i.collapsible),this._processTabs(),i.active=this._initialActive(),e.isArray(i.disabled)&&(i.disabled=e.unique(i.disabled.concat(e.map(this.tabs.filter(".ui-state-disabled"),function(e){return t.tabs.index(e)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):e(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var t=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===t&&(s&&this.tabs.each(function(i,n){return e(n).attr("aria-controls")===s?(t=i,!1):void 0}),null===t&&(t=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===t||-1===t)&&(t=this.tabs.length?0:!1)),t!==!1&&(t=this.tabs.index(this.tabs.eq(t)),-1===t&&(t=i?!1:0)),!i&&t===!1&&this.anchors.length&&(t=0),t},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):e()}},_tabKeydown:function(t){var i=e(this.document[0].activeElement).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(t)){switch(t.keyCode){case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:s++;break;case e.ui.keyCode.UP:case e.ui.keyCode.LEFT:n=!1,s--;break;case e.ui.keyCode.END:s=this.anchors.length-1;break;case e.ui.keyCode.HOME:s=0;break;case e.ui.keyCode.SPACE:return t.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case e.ui.keyCode.ENTER:return t.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}t.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),t.ctrlKey||t.metaKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(t){this._handlePageNav(t)||t.ctrlKey&&t.keyCode===e.ui.keyCode.UP&&(t.preventDefault(),this.active.focus())},_handlePageNav:function(t){return t.altKey&&t.keyCode===e.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):t.altKey&&t.keyCode===e.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(t,i){function s(){return t>n&&(t=0),0>t&&(t=n),t}for(var n=this.tabs.length-1;-1!==e.inArray(s(),this.options.disabled);)t=i?t+1:t-1;return t},_focusNextTab:function(e,t){return e=this._findNextTab(e,t),this.tabs.eq(e).focus(),e},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):"disabled"===e?(this._setupDisabled(t),void 0):(this._super(e,t),"collapsible"===e&&(this.element.toggleClass("ui-tabs-collapsible",t),t||this.options.active!==!1||this._activate(0)),"event"===e&&this._setupEvents(t),"heightStyle"===e&&this._setupHeightStyle(t),void 0)},_sanitizeSelector:function(e){return e?e.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var t=this.options,i=this.tablist.children(":has(a[href])");t.disabled=e.map(i.filter(".ui-state-disabled"),function(e){return i.index(e)}),this._processTabs(),t.active!==!1&&this.anchors.length?this.active.length&&!e.contains(this.tablist[0],this.active[0])?this.tabs.length===t.disabled.length?(t.active=!1,this.active=e()):this._activate(this._findNextTab(Math.max(0,t.active-1),!1)):t.active=this.tabs.index(this.active):(t.active=!1,this.active=e()),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var t=this,i=this.tabs,s=this.anchors,n=this.panels; +this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist").delegate("> li","mousedown"+this.eventNamespace,function(t){e(this).is(".ui-state-disabled")&&t.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){e(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return e("a",this)[0]}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=e(),this.anchors.each(function(i,s){var n,a,o,r=e(s).uniqueId().attr("id"),h=e(s).closest("li"),l=h.attr("aria-controls");t._isLocal(s)?(n=s.hash,o=n.substring(1),a=t.element.find(t._sanitizeSelector(n))):(o=h.attr("aria-controls")||e({}).uniqueId()[0].id,n="#"+o,a=t.element.find(n),a.length||(a=t._createPanel(o),a.insertAfter(t.panels[i-1]||t.tablist)),a.attr("aria-live","polite")),a.length&&(t.panels=t.panels.add(a)),l&&h.data("ui-tabs-aria-controls",l),h.attr({"aria-controls":o,"aria-labelledby":r}),a.attr("aria-labelledby",r)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel"),i&&(this._off(i.not(this.tabs)),this._off(s.not(this.anchors)),this._off(n.not(this.panels)))},_getList:function(){return this.tablist||this.element.find("ol,ul").eq(0)},_createPanel:function(t){return e("<div>").attr("id",t).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(t){e.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1);for(var i,s=0;i=this.tabs[s];s++)t===!0||-1!==e.inArray(s,t)?e(i).addClass("ui-state-disabled").attr("aria-disabled","true"):e(i).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=t},_setupEvents:function(t){var i={};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(e){e.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var i,s=this.element.parent();"fill"===t?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var t=e(this),s=t.css("position");"absolute"!==s&&"fixed"!==s&&(i-=t.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=e(this).outerHeight(!0)}),this.panels.each(function(){e(this).height(Math.max(0,i-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===t&&(i=0,this.panels.each(function(){i=Math.max(i,e(this).height("").height())}).height(i))},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n.closest("li"),o=a[0]===s[0],r=o&&i.collapsible,h=r?e():this._getPanelForTab(a),l=s.length?this._getPanelForTab(s):e(),u={oldTab:s,oldPanel:l,newTab:r?e():a,newPanel:h};t.preventDefault(),a.hasClass("ui-state-disabled")||a.hasClass("ui-tabs-loading")||this.running||o&&!i.collapsible||this._trigger("beforeActivate",t,u)===!1||(i.active=r?!1:this.tabs.index(a),this.active=o?e():a,this.xhr&&this.xhr.abort(),l.length||h.length||e.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(a),t),this._toggle(t,u))},_toggle:function(t,i){function s(){a.running=!1,a._trigger("activate",t,i)}function n(){i.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),o.length&&a.options.show?a._show(o,a.options.show,s):(o.show(),s())}var a=this,o=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),n()}):(i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),o.length&&r.length?i.oldTab.attr("tabIndex",-1):o.length&&this.tabs.filter(function(){return 0===e(this).attr("tabIndex")}).attr("tabIndex",-1),o.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(t){var i,s=this._findActive(t);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return t===!1?e():this.tabs.eq(t)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+e+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeUniqueId(),this.tablist.unbind(this.eventNamespace),this.tabs.add(this.panels).each(function(){e.data(this,"ui-tabs-destroy")?e(this).remove():e(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),this.tabs.each(function(){var t=e(this),i=t.data("ui-tabs-aria-controls");i?t.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):t.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(t){var i=this.options.disabled;i!==!1&&(void 0===t?i=!1:(t=this._getIndex(t),i=e.isArray(i)?e.map(i,function(e){return e!==t?e:null}):e.map(this.tabs,function(e,i){return i!==t?i:null})),this._setupDisabled(i))},disable:function(t){var i=this.options.disabled;if(i!==!0){if(void 0===t)i=!0;else{if(t=this._getIndex(t),-1!==e.inArray(t,i))return;i=e.isArray(i)?e.merge([t],i).sort():[t]}this._setupDisabled(i)}},load:function(t,i){t=this._getIndex(t);var s=this,n=this.tabs.eq(t),a=n.find(".ui-tabs-anchor"),o=this._getPanelForTab(n),r={tab:n,panel:o},h=function(e,t){"abort"===t&&s.panels.stop(!1,!0),n.removeClass("ui-tabs-loading"),o.removeAttr("aria-busy"),e===s.xhr&&delete s.xhr};this._isLocal(a[0])||(this.xhr=e.ajax(this._ajaxSettings(a,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(n.addClass("ui-tabs-loading"),o.attr("aria-busy","true"),this.xhr.done(function(e,t,n){setTimeout(function(){o.html(e),s._trigger("load",i,r),h(n,t)},1)}).fail(function(e,t){setTimeout(function(){h(e,t)},1)})))},_ajaxSettings:function(t,i,s){var n=this;return{url:t.attr("href"),beforeSend:function(t,a){return n._trigger("beforeLoad",i,e.extend({jqXHR:t,ajaxSettings:a},s))}}},_getPanelForTab:function(t){var i=e(t).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),e.widget("ui.tooltip",{version:"1.11.4",options:{content:function(){var t=e(this).attr("title")||"";return e("<a>").text(t).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_addDescribedBy:function(t,i){var s=(t.attr("aria-describedby")||"").split(/\s+/);s.push(i),t.data("ui-tooltip-id",i).attr("aria-describedby",e.trim(s.join(" ")))},_removeDescribedBy:function(t){var i=t.data("ui-tooltip-id"),s=(t.attr("aria-describedby")||"").split(/\s+/),n=e.inArray(i,s);-1!==n&&s.splice(n,1),t.removeData("ui-tooltip-id"),s=e.trim(s.join(" ")),s?t.attr("aria-describedby",s):t.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable(),this.liveRegion=e("<div>").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body)},_setOption:function(t,i){var s=this;return"disabled"===t?(this[i?"_disable":"_enable"](),this.options[t]=i,void 0):(this._super(t,i),"content"===t&&e.each(this.tooltips,function(e,t){s._updateContent(t.element)}),void 0)},_disable:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur");n.target=n.currentTarget=s.element[0],t.close(n,!0)}),this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.is("[title]")&&t.data("ui-tooltip-title",t.attr("title")).removeAttr("title")})},_enable:function(){this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.data("ui-tooltip-title")&&t.attr("title",t.data("ui-tooltip-title"))})},open:function(t){var i=this,s=e(t?t.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),t&&"mouseover"===t.type&&s.parents().each(function(){var t,s=e(this);s.data("ui-tooltip-open")&&(t=e.Event("blur"),t.target=t.currentTarget=this,i.close(t,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._registerCloseHandlers(t,s),this._updateContent(s,t))},_updateContent:function(e,t){var i,s=this.options.content,n=this,a=t?t.type:null;return"string"==typeof s?this._open(t,e,s):(i=s.call(e[0],function(i){n._delay(function(){e.data("ui-tooltip-open")&&(t&&(t.type=a),this._open(t,e,i))})}),i&&this._open(t,e,i),void 0)},_open:function(t,i,s){function n(e){l.of=e,o.is(":hidden")||o.position(l)}var a,o,r,h,l=e.extend({},this.options.position);if(s){if(a=this._find(i))return a.tooltip.find(".ui-tooltip-content").html(s),void 0;i.is("[title]")&&(t&&"mouseover"===t.type?i.attr("title",""):i.removeAttr("title")),a=this._tooltip(i),o=a.tooltip,this._addDescribedBy(i,o.attr("id")),o.find(".ui-tooltip-content").html(s),this.liveRegion.children().hide(),s.clone?(h=s.clone(),h.removeAttr("id").find("[id]").removeAttr("id")):h=s,e("<div>").html(h).appendTo(this.liveRegion),this.options.track&&t&&/^mouse/.test(t.type)?(this._on(this.document,{mousemove:n}),n(t)):o.position(e.extend({of:i},this.options.position)),o.hide(),this._show(o,this.options.show),this.options.show&&this.options.show.delay&&(r=this.delayedShow=setInterval(function(){o.is(":visible")&&(n(l.of),clearInterval(r))},e.fx.interval)),this._trigger("open",t,{tooltip:o})}},_registerCloseHandlers:function(t,i){var s={keyup:function(t){if(t.keyCode===e.ui.keyCode.ESCAPE){var s=e.Event(t);s.currentTarget=i[0],this.close(s,!0)}}};i[0]!==this.element[0]&&(s.remove=function(){this._removeTooltip(this._find(i).tooltip)}),t&&"mouseover"!==t.type||(s.mouseleave="close"),t&&"focusin"!==t.type||(s.focusout="close"),this._on(!0,i,s)},close:function(t){var i,s=this,n=e(t?t.currentTarget:this.element),a=this._find(n);return a?(i=a.tooltip,a.closing||(clearInterval(this.delayedShow),n.data("ui-tooltip-title")&&!n.attr("title")&&n.attr("title",n.data("ui-tooltip-title")),this._removeDescribedBy(n),a.hiding=!0,i.stop(!0),this._hide(i,this.options.hide,function(){s._removeTooltip(e(this))}),n.removeData("ui-tooltip-open"),this._off(n,"mouseleave focusout keyup"),n[0]!==this.element[0]&&this._off(n,"remove"),this._off(this.document,"mousemove"),t&&"mouseleave"===t.type&&e.each(this.parents,function(t,i){e(i.element).attr("title",i.title),delete s.parents[t]}),a.closing=!0,this._trigger("close",t,{tooltip:i}),a.hiding||(a.closing=!1)),void 0):(n.removeData("ui-tooltip-open"),void 0)},_tooltip:function(t){var i=e("<div>").attr("role","tooltip").addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||"")),s=i.uniqueId().attr("id");return e("<div>").addClass("ui-tooltip-content").appendTo(i),i.appendTo(this.document[0].body),this.tooltips[s]={element:t,tooltip:i}},_find:function(e){var t=e.data("ui-tooltip-id");return t?this.tooltips[t]:null},_removeTooltip:function(e){e.remove(),delete this.tooltips[e.attr("id")]},_destroy:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur"),a=s.element;n.target=n.currentTarget=a[0],t.close(n,!0),e("#"+i).remove(),a.data("ui-tooltip-title")&&(a.attr("title")||a.attr("title",a.data("ui-tooltip-title")),a.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}})}); \ No newline at end of file diff --git a/assets/moment.min.js b/assets/moment.min.js new file mode 100644 index 0000000..a54ef2f --- /dev/null +++ b/assets/moment.min.js @@ -0,0 +1,7 @@ +//! moment.js +//! version : 2.10.2 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com +!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.moment=b()}(this,function(){"use strict";function a(){return Ac.apply(null,arguments)}function b(a){Ac=a}function c(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function d(a){return"[object Array]"===Object.prototype.toString.call(a)}function e(a){return"[object Date]"===Object.prototype.toString.call(a)||a instanceof Date}function f(a,b){var c,d=[];for(c=0;c<a.length;++c)d.push(b(a[c],c));return d}function g(a,b){return Object.prototype.hasOwnProperty.call(a,b)}function h(a,b){for(var c in b)g(b,c)&&(a[c]=b[c]);return g(b,"toString")&&(a.toString=b.toString),g(b,"valueOf")&&(a.valueOf=b.valueOf),a}function i(a,b,c,d){return ya(a,b,c,d,!0).utc()}function j(a){return null==a._isValid&&(a._isValid=!isNaN(a._d.getTime())&&a._pf.overflow<0&&!a._pf.empty&&!a._pf.invalidMonth&&!a._pf.nullInput&&!a._pf.invalidFormat&&!a._pf.userInvalidated,a._strict&&(a._isValid=a._isValid&&0===a._pf.charsLeftOver&&0===a._pf.unusedTokens.length&&void 0===a._pf.bigHour)),a._isValid}function k(a){var b=i(0/0);return null!=a?h(b._pf,a):b._pf.userInvalidated=!0,b}function l(a,b){var c,d,e;if("undefined"!=typeof b._isAMomentObject&&(a._isAMomentObject=b._isAMomentObject),"undefined"!=typeof b._i&&(a._i=b._i),"undefined"!=typeof b._f&&(a._f=b._f),"undefined"!=typeof b._l&&(a._l=b._l),"undefined"!=typeof b._strict&&(a._strict=b._strict),"undefined"!=typeof b._tzm&&(a._tzm=b._tzm),"undefined"!=typeof b._isUTC&&(a._isUTC=b._isUTC),"undefined"!=typeof b._offset&&(a._offset=b._offset),"undefined"!=typeof b._pf&&(a._pf=b._pf),"undefined"!=typeof b._locale&&(a._locale=b._locale),Cc.length>0)for(c in Cc)d=Cc[c],e=b[d],"undefined"!=typeof e&&(a[d]=e);return a}function m(b){l(this,b),this._d=new Date(+b._d),Dc===!1&&(Dc=!0,a.updateOffset(this),Dc=!1)}function n(a){return a instanceof m||null!=a&&g(a,"_isAMomentObject")}function o(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function p(a,b,c){var d,e=Math.min(a.length,b.length),f=Math.abs(a.length-b.length),g=0;for(d=0;e>d;d++)(c&&a[d]!==b[d]||!c&&o(a[d])!==o(b[d]))&&g++;return g+f}function q(){}function r(a){return a?a.toLowerCase().replace("_","-"):a}function s(a){for(var b,c,d,e,f=0;f<a.length;){for(e=r(a[f]).split("-"),b=e.length,c=r(a[f+1]),c=c?c.split("-"):null;b>0;){if(d=t(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&p(e,c,!0)>=b-1)break;b--}f++}return null}function t(a){var b=null;if(!Ec[a]&&"undefined"!=typeof module&&module&&module.exports)try{b=Bc._abbr,require("./locale/"+a),u(b)}catch(c){}return Ec[a]}function u(a,b){var c;return a&&(c="undefined"==typeof b?w(a):v(a,b),c&&(Bc=c)),Bc._abbr}function v(a,b){return null!==b?(b.abbr=a,Ec[a]||(Ec[a]=new q),Ec[a].set(b),u(a),Ec[a]):(delete Ec[a],null)}function w(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return Bc;if(!d(a)){if(b=t(a))return b;a=[a]}return s(a)}function x(a,b){var c=a.toLowerCase();Fc[c]=Fc[c+"s"]=Fc[b]=a}function y(a){return"string"==typeof a?Fc[a]||Fc[a.toLowerCase()]:void 0}function z(a){var b,c,d={};for(c in a)g(a,c)&&(b=y(c),b&&(d[b]=a[c]));return d}function A(b,c){return function(d){return null!=d?(C(this,b,d),a.updateOffset(this,c),this):B(this,b)}}function B(a,b){return a._d["get"+(a._isUTC?"UTC":"")+b]()}function C(a,b,c){return a._d["set"+(a._isUTC?"UTC":"")+b](c)}function D(a,b){var c;if("object"==typeof a)for(c in a)this.set(c,a[c]);else if(a=y(a),"function"==typeof this[a])return this[a](b);return this}function E(a,b,c){for(var d=""+Math.abs(a),e=a>=0;d.length<b;)d="0"+d;return(e?c?"+":"":"-")+d}function F(a,b,c,d){var e=d;"string"==typeof d&&(e=function(){return this[d]()}),a&&(Jc[a]=e),b&&(Jc[b[0]]=function(){return E(e.apply(this,arguments),b[1],b[2])}),c&&(Jc[c]=function(){return this.localeData().ordinal(e.apply(this,arguments),a)})}function G(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function H(a){var b,c,d=a.match(Gc);for(b=0,c=d.length;c>b;b++)d[b]=Jc[d[b]]?Jc[d[b]]:G(d[b]);return function(e){var f="";for(b=0;c>b;b++)f+=d[b]instanceof Function?d[b].call(e,a):d[b];return f}}function I(a,b){return a.isValid()?(b=J(b,a.localeData()),Ic[b]||(Ic[b]=H(b)),Ic[b](a)):a.localeData().invalidDate()}function J(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(Hc.lastIndex=0;d>=0&&Hc.test(a);)a=a.replace(Hc,c),Hc.lastIndex=0,d-=1;return a}function K(a,b,c){Yc[a]="function"==typeof b?b:function(a){return a&&c?c:b}}function L(a,b){return g(Yc,a)?Yc[a](b._strict,b._locale):new RegExp(M(a))}function M(a){return a.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e}).replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function N(a,b){var c,d=b;for("string"==typeof a&&(a=[a]),"number"==typeof b&&(d=function(a,c){c[b]=o(a)}),c=0;c<a.length;c++)Zc[a[c]]=d}function O(a,b){N(a,function(a,c,d,e){d._w=d._w||{},b(a,d._w,d,e)})}function P(a,b,c){null!=b&&g(Zc,a)&&Zc[a](b,c._a,c,a)}function Q(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function R(a){return this._months[a.month()]}function S(a){return this._monthsShort[a.month()]}function T(a,b,c){var d,e,f;for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),d=0;12>d;d++){if(e=i([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}}function U(a,b){var c;return"string"==typeof b&&(b=a.localeData().monthsParse(b),"number"!=typeof b)?a:(c=Math.min(a.date(),Q(a.year(),b)),a._d["set"+(a._isUTC?"UTC":"")+"Month"](b,c),a)}function V(b){return null!=b?(U(this,b),a.updateOffset(this,!0),this):B(this,"Month")}function W(){return Q(this.year(),this.month())}function X(a){var b,c=a._a;return c&&-2===a._pf.overflow&&(b=c[_c]<0||c[_c]>11?_c:c[ad]<1||c[ad]>Q(c[$c],c[_c])?ad:c[bd]<0||c[bd]>24||24===c[bd]&&(0!==c[cd]||0!==c[dd]||0!==c[ed])?bd:c[cd]<0||c[cd]>59?cd:c[dd]<0||c[dd]>59?dd:c[ed]<0||c[ed]>999?ed:-1,a._pf._overflowDayOfYear&&($c>b||b>ad)&&(b=ad),a._pf.overflow=b),a}function Y(b){a.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+b)}function Z(a,b){var c=!0;return h(function(){return c&&(Y(a),c=!1),b.apply(this,arguments)},b)}function $(a,b){hd[a]||(Y(b),hd[a]=!0)}function _(a){var b,c,d=a._i,e=id.exec(d);if(e){for(a._pf.iso=!0,b=0,c=jd.length;c>b;b++)if(jd[b][1].exec(d)){a._f=jd[b][0]+(e[6]||" ");break}for(b=0,c=kd.length;c>b;b++)if(kd[b][1].exec(d)){a._f+=kd[b][0];break}d.match(Vc)&&(a._f+="Z"),sa(a)}else a._isValid=!1}function aa(b){var c=ld.exec(b._i);return null!==c?void(b._d=new Date(+c[1])):(_(b),void(b._isValid===!1&&(delete b._isValid,a.createFromInputFallback(b))))}function ba(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return 1970>a&&h.setFullYear(a),h}function ca(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function da(a){return ea(a)?366:365}function ea(a){return a%4===0&&a%100!==0||a%400===0}function fa(){return ea(this.year())}function ga(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=za(a).add(f,"d"),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function ha(a){return ga(a,this._week.dow,this._week.doy).week}function ia(){return this._week.dow}function ja(){return this._week.doy}function ka(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")}function la(a){var b=ga(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")}function ma(a,b,c,d,e){var f,g,h=ca(a,0,1).getUTCDay();return h=0===h?7:h,c=null!=c?c:e,f=e-h+(h>d?7:0)-(e>h?7:0),g=7*(b-1)+(c-e)+f+1,{year:g>0?a:a-1,dayOfYear:g>0?g:da(a-1)+g}}function na(a){var b=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")}function oa(a,b,c){return null!=a?a:null!=b?b:c}function pa(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function qa(a){var b,c,d,e,f=[];if(!a._d){for(d=pa(a),a._w&&null==a._a[ad]&&null==a._a[_c]&&ra(a),a._dayOfYear&&(e=oa(a._a[$c],d[$c]),a._dayOfYear>da(e)&&(a._pf._overflowDayOfYear=!0),c=ca(e,0,a._dayOfYear),a._a[_c]=c.getUTCMonth(),a._a[ad]=c.getUTCDate()),b=0;3>b&&null==a._a[b];++b)a._a[b]=f[b]=d[b];for(;7>b;b++)a._a[b]=f[b]=null==a._a[b]?2===b?1:0:a._a[b];24===a._a[bd]&&0===a._a[cd]&&0===a._a[dd]&&0===a._a[ed]&&(a._nextDay=!0,a._a[bd]=0),a._d=(a._useUTC?ca:ba).apply(null,f),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[bd]=24)}}function ra(a){var b,c,d,e,f,g,h;b=a._w,null!=b.GG||null!=b.W||null!=b.E?(f=1,g=4,c=oa(b.GG,a._a[$c],ga(za(),1,4).year),d=oa(b.W,1),e=oa(b.E,1)):(f=a._locale._week.dow,g=a._locale._week.doy,c=oa(b.gg,a._a[$c],ga(za(),f,g).year),d=oa(b.w,1),null!=b.d?(e=b.d,f>e&&++d):e=null!=b.e?b.e+f:f),h=ma(c,d,e,g,f),a._a[$c]=h.year,a._dayOfYear=h.dayOfYear}function sa(b){if(b._f===a.ISO_8601)return void _(b);b._a=[],b._pf.empty=!0;var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=J(b._f,b._locale).match(Gc)||[],c=0;c<e.length;c++)f=e[c],d=(h.match(L(f,b))||[])[0],d&&(g=h.substr(0,h.indexOf(d)),g.length>0&&b._pf.unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length),Jc[f]?(d?b._pf.empty=!1:b._pf.unusedTokens.push(f),P(f,d,b)):b._strict&&!d&&b._pf.unusedTokens.push(f);b._pf.charsLeftOver=i-j,h.length>0&&b._pf.unusedInput.push(h),b._pf.bigHour===!0&&b._a[bd]<=12&&(b._pf.bigHour=void 0),b._a[bd]=ta(b._locale,b._a[bd],b._meridiem),qa(b),X(b)}function ta(a,b,c){var d;return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&12>b&&(b+=12),d||12!==b||(b=0),b):b}function ua(a){var b,d,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,void(a._d=new Date(0/0));for(f=0;f<a._f.length;f++)g=0,b=l({},a),null!=a._useUTC&&(b._useUTC=a._useUTC),b._pf=c(),b._f=a._f[f],sa(b),j(b)&&(g+=b._pf.charsLeftOver,g+=10*b._pf.unusedTokens.length,b._pf.score=g,(null==e||e>g)&&(e=g,d=b));h(a,d||b)}function va(a){if(!a._d){var b=z(a._i);a._a=[b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],qa(a)}}function wa(a){var b,c=a._i,e=a._f;return a._locale=a._locale||w(a._l),null===c||void 0===e&&""===c?k({nullInput:!0}):("string"==typeof c&&(a._i=c=a._locale.preparse(c)),n(c)?new m(X(c)):(d(e)?ua(a):e?sa(a):xa(a),b=new m(X(a)),b._nextDay&&(b.add(1,"d"),b._nextDay=void 0),b))}function xa(b){var c=b._i;void 0===c?b._d=new Date:e(c)?b._d=new Date(+c):"string"==typeof c?aa(b):d(c)?(b._a=f(c.slice(0),function(a){return parseInt(a,10)}),qa(b)):"object"==typeof c?va(b):"number"==typeof c?b._d=new Date(c):a.createFromInputFallback(b)}function ya(a,b,d,e,f){var g={};return"boolean"==typeof d&&(e=d,d=void 0),g._isAMomentObject=!0,g._useUTC=g._isUTC=f,g._l=d,g._i=a,g._f=b,g._strict=e,g._pf=c(),wa(g)}function za(a,b,c,d){return ya(a,b,c,d,!1)}function Aa(a,b){var c,e;if(1===b.length&&d(b[0])&&(b=b[0]),!b.length)return za();for(c=b[0],e=1;e<b.length;++e)b[e][a](c)&&(c=b[e]);return c}function Ba(){var a=[].slice.call(arguments,0);return Aa("isBefore",a)}function Ca(){var a=[].slice.call(arguments,0);return Aa("isAfter",a)}function Da(a){var b=z(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0;this._milliseconds=+k+1e3*j+6e4*i+36e5*h,this._days=+g+7*f,this._months=+e+3*d+12*c,this._data={},this._locale=w(),this._bubble()}function Ea(a){return a instanceof Da}function Fa(a,b){F(a,0,0,function(){var a=this.utcOffset(),c="+";return 0>a&&(a=-a,c="-"),c+E(~~(a/60),2)+b+E(~~a%60,2)})}function Ga(a){var b=(a||"").match(Vc)||[],c=b[b.length-1]||[],d=(c+"").match(qd)||["-",0,0],e=+(60*d[1])+o(d[2]);return"+"===d[0]?e:-e}function Ha(b,c){var d,f;return c._isUTC?(d=c.clone(),f=(n(b)||e(b)?+b:+za(b))-+d,d._d.setTime(+d._d+f),a.updateOffset(d,!1),d):za(b).local();return c._isUTC?za(b).zone(c._offset||0):za(b).local()}function Ia(a){return 15*-Math.round(a._d.getTimezoneOffset()/15)}function Ja(b,c){var d,e=this._offset||0;return null!=b?("string"==typeof b&&(b=Ga(b)),Math.abs(b)<16&&(b=60*b),!this._isUTC&&c&&(d=Ia(this)),this._offset=b,this._isUTC=!0,null!=d&&this.add(d,"m"),e!==b&&(!c||this._changeInProgress?Za(this,Ua(b-e,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?e:Ia(this)}function Ka(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}function La(a){return this.utcOffset(0,a)}function Ma(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(Ia(this),"m")),this}function Na(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(Ga(this._i)),this}function Oa(a){return a=a?za(a).utcOffset():0,(this.utcOffset()-a)%60===0}function Pa(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Qa(){if(this._a){var a=this._isUTC?i(this._a):za(this._a);return this.isValid()&&p(this._a,a.toArray())>0}return!1}function Ra(){return!this._isUTC}function Sa(){return this._isUTC}function Ta(){return this._isUTC&&0===this._offset}function Ua(a,b){var c,d,e,f=a,h=null;return Ea(a)?f={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(f={},b?f[b]=a:f.milliseconds=a):(h=rd.exec(a))?(c="-"===h[1]?-1:1,f={y:0,d:o(h[ad])*c,h:o(h[bd])*c,m:o(h[cd])*c,s:o(h[dd])*c,ms:o(h[ed])*c}):(h=sd.exec(a))?(c="-"===h[1]?-1:1,f={y:Va(h[2],c),M:Va(h[3],c),d:Va(h[4],c),h:Va(h[5],c),m:Va(h[6],c),s:Va(h[7],c),w:Va(h[8],c)}):null==f?f={}:"object"==typeof f&&("from"in f||"to"in f)&&(e=Xa(za(f.from),za(f.to)),f={},f.ms=e.milliseconds,f.M=e.months),d=new Da(f),Ea(a)&&g(a,"_locale")&&(d._locale=a._locale),d}function Va(a,b){var c=a&&parseFloat(a.replace(",","."));return(isNaN(c)?0:c)*b}function Wa(a,b){var c={milliseconds:0,months:0};return c.months=b.month()-a.month()+12*(b.year()-a.year()),a.clone().add(c.months,"M").isAfter(b)&&--c.months,c.milliseconds=+b-+a.clone().add(c.months,"M"),c}function Xa(a,b){var c;return b=Ha(b,a),a.isBefore(b)?c=Wa(a,b):(c=Wa(b,a),c.milliseconds=-c.milliseconds,c.months=-c.months),c}function Ya(a,b){return function(c,d){var e,f;return null===d||isNaN(+d)||($(b,"moment()."+b+"(period, number) is deprecated. Please use moment()."+b+"(number, period)."),f=c,c=d,d=f),c="string"==typeof c?+c:c,e=Ua(c,d),Za(this,e,a),this}}function Za(b,c,d,e){var f=c._milliseconds,g=c._days,h=c._months;e=null==e?!0:e,f&&b._d.setTime(+b._d+f*d),g&&C(b,"Date",B(b,"Date")+g*d),h&&U(b,B(b,"Month")+h*d),e&&a.updateOffset(b,g||h)}function $a(a){var b=a||za(),c=Ha(b,this).startOf("day"),d=this.diff(c,"days",!0),e=-6>d?"sameElse":-1>d?"lastWeek":0>d?"lastDay":1>d?"sameDay":2>d?"nextDay":7>d?"nextWeek":"sameElse";return this.format(this.localeData().calendar(e,this,za(b)))}function _a(){return new m(this)}function ab(a,b){var c;return b=y("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=n(a)?a:za(a),+this>+a):(c=n(a)?+a:+za(a),c<+this.clone().startOf(b))}function bb(a,b){var c;return b=y("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=n(a)?a:za(a),+a>+this):(c=n(a)?+a:+za(a),+this.clone().endOf(b)<c)}function cb(a,b,c){return this.isAfter(a,c)&&this.isBefore(b,c)}function db(a,b){var c;return b=y(b||"millisecond"),"millisecond"===b?(a=n(a)?a:za(a),+this===+a):(c=+za(a),+this.clone().startOf(b)<=c&&c<=+this.clone().endOf(b))}function eb(a){return 0>a?Math.ceil(a):Math.floor(a)}function fb(a,b,c){var d,e,f=Ha(a,this),g=6e4*(f.utcOffset()-this.utcOffset());return b=y(b),"year"===b||"month"===b||"quarter"===b?(e=gb(this,f),"quarter"===b?e/=3:"year"===b&&(e/=12)):(d=this-f,e="second"===b?d/1e3:"minute"===b?d/6e4:"hour"===b?d/36e5:"day"===b?(d-g)/864e5:"week"===b?(d-g)/6048e5:d),c?e:eb(e)}function gb(a,b){var c,d,e=12*(b.year()-a.year())+(b.month()-a.month()),f=a.clone().add(e,"months");return 0>b-f?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)}function hb(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function ib(){var a=this.clone().utc();return 0<a.year()&&a.year()<=9999?"function"==typeof Date.prototype.toISOString?this.toDate().toISOString():I(a,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):I(a,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]")}function jb(b){var c=I(this,b||a.defaultFormat);return this.localeData().postformat(c)}function kb(a,b){return Ua({to:this,from:a}).locale(this.locale()).humanize(!b)}function lb(a){return this.from(za(),a)}function mb(a){var b;return void 0===a?this._locale._abbr:(b=w(a),null!=b&&(this._locale=b),this)}function nb(){return this._locale}function ob(a){switch(a=y(a)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===a&&this.weekday(0),"isoWeek"===a&&this.isoWeekday(1),"quarter"===a&&this.month(3*Math.floor(this.month()/3)),this}function pb(a){return a=y(a),void 0===a||"millisecond"===a?this:this.startOf(a).add(1,"isoWeek"===a?"week":a).subtract(1,"ms")}function qb(){return+this._d-6e4*(this._offset||0)}function rb(){return Math.floor(+this/1e3)}function sb(){return this._offset?new Date(+this):this._d}function tb(){var a=this;return[a.year(),a.month(),a.date(),a.hour(),a.minute(),a.second(),a.millisecond()]}function ub(){return j(this)}function vb(){return h({},this._pf)}function wb(){return this._pf.overflow}function xb(a,b){F(0,[a,a.length],0,b)}function yb(a,b,c){return ga(za([a,11,31+b-c]),b,c).week}function zb(a){var b=ga(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return null==a?b:this.add(a-b,"y")}function Ab(a){var b=ga(this,1,4).year;return null==a?b:this.add(a-b,"y")}function Bb(){return yb(this.year(),1,4)}function Cb(){var a=this.localeData()._week;return yb(this.year(),a.dow,a.doy)}function Db(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)}function Eb(a,b){if("string"==typeof a)if(isNaN(a)){if(a=b.weekdaysParse(a),"number"!=typeof a)return null}else a=parseInt(a,10);return a}function Fb(a){return this._weekdays[a.day()]}function Gb(a){return this._weekdaysShort[a.day()]}function Hb(a){return this._weekdaysMin[a.day()]}function Ib(a){var b,c,d;for(this._weekdaysParse||(this._weekdaysParse=[]),b=0;7>b;b++)if(this._weekdaysParse[b]||(c=za([2e3,1]).day(b),d="^"+this.weekdays(c,"")+"|^"+this.weekdaysShort(c,"")+"|^"+this.weekdaysMin(c,""),this._weekdaysParse[b]=new RegExp(d.replace(".",""),"i")),this._weekdaysParse[b].test(a))return b}function Jb(a){var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=Eb(a,this.localeData()),this.add(a-b,"d")):b}function Kb(a){var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")}function Lb(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)}function Mb(a,b){F(a,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),b)})}function Nb(a,b){return b._meridiemParse}function Ob(a){return"p"===(a+"").toLowerCase().charAt(0)}function Pb(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"}function Qb(a){F(0,[a,3],0,"millisecond")}function Rb(){return this._isUTC?"UTC":""}function Sb(){return this._isUTC?"Coordinated Universal Time":""}function Tb(a){return za(1e3*a)}function Ub(){return za.apply(null,arguments).parseZone()}function Vb(a,b,c){var d=this._calendar[a];return"function"==typeof d?d.call(b,c):d}function Wb(a){var b=this._longDateFormat[a];return!b&&this._longDateFormat[a.toUpperCase()]&&(b=this._longDateFormat[a.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a]=b),b}function Xb(){return this._invalidDate}function Yb(a){return this._ordinal.replace("%d",a)}function Zb(a){return a}function $b(a,b,c,d){var e=this._relativeTime[c];return"function"==typeof e?e(a,b,c,d):e.replace(/%d/i,a)}function _b(a,b){var c=this._relativeTime[a>0?"future":"past"];return"function"==typeof c?c(b):c.replace(/%s/i,b)}function ac(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)}function bc(a,b,c,d){var e=w(),f=i().set(d,b);return e[c](f,a)}function cc(a,b,c,d,e){if("number"==typeof a&&(b=a,a=void 0),a=a||"",null!=b)return bc(a,b,c,e);var f,g=[];for(f=0;d>f;f++)g[f]=bc(a,f,c,e);return g}function dc(a,b){return cc(a,b,"months",12,"month")}function ec(a,b){return cc(a,b,"monthsShort",12,"month")}function fc(a,b){return cc(a,b,"weekdays",7,"day")}function gc(a,b){return cc(a,b,"weekdaysShort",7,"day")}function hc(a,b){return cc(a,b,"weekdaysMin",7,"day")}function ic(){var a=this._data;return this._milliseconds=Od(this._milliseconds),this._days=Od(this._days),this._months=Od(this._months),a.milliseconds=Od(a.milliseconds),a.seconds=Od(a.seconds),a.minutes=Od(a.minutes),a.hours=Od(a.hours),a.months=Od(a.months),a.years=Od(a.years),this}function jc(a,b,c,d){var e=Ua(b,c);return a._milliseconds+=d*e._milliseconds,a._days+=d*e._days,a._months+=d*e._months,a._bubble()}function kc(a,b){return jc(this,a,b,1)}function lc(a,b){return jc(this,a,b,-1)}function mc(){var a,b,c,d=this._milliseconds,e=this._days,f=this._months,g=this._data,h=0;return g.milliseconds=d%1e3,a=eb(d/1e3),g.seconds=a%60,b=eb(a/60),g.minutes=b%60,c=eb(b/60),g.hours=c%24,e+=eb(c/24),h=eb(nc(e)),e-=eb(oc(h)),f+=eb(e/30),e%=30,h+=eb(f/12),f%=12,g.days=e,g.months=f,g.years=h,this}function nc(a){return 400*a/146097}function oc(a){return 146097*a/400}function pc(a){var b,c,d=this._milliseconds;if(a=y(a),"month"===a||"year"===a)return b=this._days+d/864e5,c=this._months+12*nc(b),"month"===a?c:c/12;switch(b=this._days+Math.round(oc(this._months/12)),a){case"week":return b/7+d/6048e5;case"day":return b+d/864e5;case"hour":return 24*b+d/36e5;case"minute":return 24*b*60+d/6e4;case"second":return 24*b*60*60+d/1e3;case"millisecond":return Math.floor(24*b*60*60*1e3)+d;default:throw new Error("Unknown unit "+a)}}function qc(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*o(this._months/12)}function rc(a){return function(){return this.as(a)}}function sc(a){return a=y(a),this[a+"s"]()}function tc(a){return function(){return this._data[a]}}function uc(){return eb(this.days()/7)}function vc(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function wc(a,b,c){var d=Ua(a).abs(),e=ce(d.as("s")),f=ce(d.as("m")),g=ce(d.as("h")),h=ce(d.as("d")),i=ce(d.as("M")),j=ce(d.as("y")),k=e<de.s&&["s",e]||1===f&&["m"]||f<de.m&&["mm",f]||1===g&&["h"]||g<de.h&&["hh",g]||1===h&&["d"]||h<de.d&&["dd",h]||1===i&&["M"]||i<de.M&&["MM",i]||1===j&&["y"]||["yy",j];return k[2]=b,k[3]=+a>0,k[4]=c,vc.apply(null,k)}function xc(a,b){return void 0===de[a]?!1:void 0===b?de[a]:(de[a]=b,!0)}function yc(a){var b=this.localeData(),c=wc(this,!a,b);return a&&(c=b.pastFuture(+this,c)),b.postformat(c)}function zc(){var a=ee(this.years()),b=ee(this.months()),c=ee(this.days()),d=ee(this.hours()),e=ee(this.minutes()),f=ee(this.seconds()+this.milliseconds()/1e3),g=this.asSeconds();return g?(0>g?"-":"")+"P"+(a?a+"Y":"")+(b?b+"M":"")+(c?c+"D":"")+(d||e||f?"T":"")+(d?d+"H":"")+(e?e+"M":"")+(f?f+"S":""):"P0D"}var Ac,Bc,Cc=a.momentProperties=[],Dc=!1,Ec={},Fc={},Gc=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g,Hc=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,Ic={},Jc={},Kc=/\d/,Lc=/\d\d/,Mc=/\d{3}/,Nc=/\d{4}/,Oc=/[+-]?\d{6}/,Pc=/\d\d?/,Qc=/\d{1,3}/,Rc=/\d{1,4}/,Sc=/[+-]?\d{1,6}/,Tc=/\d+/,Uc=/[+-]?\d+/,Vc=/Z|[+-]\d\d:?\d\d/gi,Wc=/[+-]?\d+(\.\d{1,3})?/,Xc=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Yc={},Zc={},$c=0,_c=1,ad=2,bd=3,cd=4,dd=5,ed=6;F("M",["MM",2],"Mo",function(){return this.month()+1}),F("MMM",0,0,function(a){return this.localeData().monthsShort(this,a)}),F("MMMM",0,0,function(a){return this.localeData().months(this,a)}),x("month","M"),K("M",Pc),K("MM",Pc,Lc),K("MMM",Xc),K("MMMM",Xc),N(["M","MM"],function(a,b){b[_c]=o(a)-1}),N(["MMM","MMMM"],function(a,b,c,d){var e=c._locale.monthsParse(a,d,c._strict);null!=e?b[_c]=e:c._pf.invalidMonth=a});var fd="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),gd="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),hd={};a.suppressDeprecationWarnings=!1;var id=/^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,jd=[["YYYYYY-MM-DD",/[+-]\d{6}-\d{2}-\d{2}/],["YYYY-MM-DD",/\d{4}-\d{2}-\d{2}/],["GGGG-[W]WW-E",/\d{4}-W\d{2}-\d/],["GGGG-[W]WW",/\d{4}-W\d{2}/],["YYYY-DDD",/\d{4}-\d{3}/]],kd=[["HH:mm:ss.SSSS",/(T| )\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],ld=/^\/?Date\((\-?\d+)/i;a.createFromInputFallback=Z("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),F(0,["YY",2],0,function(){return this.year()%100}),F(0,["YYYY",4],0,"year"),F(0,["YYYYY",5],0,"year"),F(0,["YYYYYY",6,!0],0,"year"),x("year","y"),K("Y",Uc),K("YY",Pc,Lc),K("YYYY",Rc,Nc),K("YYYYY",Sc,Oc),K("YYYYYY",Sc,Oc),N(["YYYY","YYYYY","YYYYYY"],$c),N("YY",function(b,c){c[$c]=a.parseTwoDigitYear(b)}),a.parseTwoDigitYear=function(a){return o(a)+(o(a)>68?1900:2e3)};var md=A("FullYear",!1);F("w",["ww",2],"wo","week"),F("W",["WW",2],"Wo","isoWeek"),x("week","w"),x("isoWeek","W"),K("w",Pc),K("ww",Pc,Lc),K("W",Pc),K("WW",Pc,Lc),O(["w","ww","W","WW"],function(a,b,c,d){b[d.substr(0,1)]=o(a)});var nd={dow:0,doy:6};F("DDD",["DDDD",3],"DDDo","dayOfYear"),x("dayOfYear","DDD"),K("DDD",Qc),K("DDDD",Mc),N(["DDD","DDDD"],function(a,b,c){c._dayOfYear=o(a)}),a.ISO_8601=function(){};var od=Z("moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(){var a=za.apply(null,arguments);return this>a?this:a}),pd=Z("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(){var a=za.apply(null,arguments);return a>this?this:a});Fa("Z",":"),Fa("ZZ",""),K("Z",Vc),K("ZZ",Vc),N(["Z","ZZ"],function(a,b,c){c._useUTC=!0,c._tzm=Ga(a)});var qd=/([\+\-]|\d\d)/gi;a.updateOffset=function(){};var rd=/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,sd=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/;Ua.fn=Da.prototype;var td=Ya(1,"add"),ud=Ya(-1,"subtract");a.defaultFormat="YYYY-MM-DDTHH:mm:ssZ";var vd=Z("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(a){return void 0===a?this.localeData():this.locale(a)});F(0,["gg",2],0,function(){return this.weekYear()%100}),F(0,["GG",2],0,function(){return this.isoWeekYear()%100}),xb("gggg","weekYear"),xb("ggggg","weekYear"),xb("GGGG","isoWeekYear"),xb("GGGGG","isoWeekYear"),x("weekYear","gg"),x("isoWeekYear","GG"),K("G",Uc),K("g",Uc),K("GG",Pc,Lc),K("gg",Pc,Lc),K("GGGG",Rc,Nc),K("gggg",Rc,Nc),K("GGGGG",Sc,Oc),K("ggggg",Sc,Oc),O(["gggg","ggggg","GGGG","GGGGG"],function(a,b,c,d){b[d.substr(0,2)]=o(a)}),O(["gg","GG"],function(b,c,d,e){c[e]=a.parseTwoDigitYear(b)}),F("Q",0,0,"quarter"),x("quarter","Q"),K("Q",Kc),N("Q",function(a,b){b[_c]=3*(o(a)-1)}),F("D",["DD",2],"Do","date"),x("date","D"),K("D",Pc),K("DD",Pc,Lc),K("Do",function(a,b){return a?b._ordinalParse:b._ordinalParseLenient}),N(["D","DD"],ad),N("Do",function(a,b){b[ad]=o(a.match(Pc)[0],10)});var wd=A("Date",!0);F("d",0,"do","day"),F("dd",0,0,function(a){return this.localeData().weekdaysMin(this,a)}),F("ddd",0,0,function(a){return this.localeData().weekdaysShort(this,a)}),F("dddd",0,0,function(a){return this.localeData().weekdays(this,a)}),F("e",0,0,"weekday"),F("E",0,0,"isoWeekday"),x("day","d"),x("weekday","e"),x("isoWeekday","E"),K("d",Pc),K("e",Pc),K("E",Pc),K("dd",Xc),K("ddd",Xc),K("dddd",Xc),O(["dd","ddd","dddd"],function(a,b,c){var d=c._locale.weekdaysParse(a);null!=d?b.d=d:c._pf.invalidWeekday=a}),O(["d","e","E"],function(a,b,c,d){b[d]=o(a)});var xd="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),yd="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),zd="Su_Mo_Tu_We_Th_Fr_Sa".split("_");F("H",["HH",2],0,"hour"),F("h",["hh",2],0,function(){return this.hours()%12||12}),Mb("a",!0),Mb("A",!1),x("hour","h"),K("a",Nb),K("A",Nb),K("H",Pc),K("h",Pc),K("HH",Pc,Lc),K("hh",Pc,Lc),N(["H","HH"],bd),N(["a","A"],function(a,b,c){c._isPm=c._locale.isPM(a),c._meridiem=a}),N(["h","hh"],function(a,b,c){b[bd]=o(a),c._pf.bigHour=!0});var Ad=/[ap]\.?m?\.?/i,Bd=A("Hours",!0);F("m",["mm",2],0,"minute"),x("minute","m"),K("m",Pc),K("mm",Pc,Lc),N(["m","mm"],cd);var Cd=A("Minutes",!1);F("s",["ss",2],0,"second"),x("second","s"),K("s",Pc),K("ss",Pc,Lc),N(["s","ss"],dd);var Dd=A("Seconds",!1);F("S",0,0,function(){return~~(this.millisecond()/100)}),F(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),Qb("SSS"),Qb("SSSS"),x("millisecond","ms"),K("S",Qc,Kc),K("SS",Qc,Lc),K("SSS",Qc,Mc),K("SSSS",Tc),N(["S","SS","SSS","SSSS"],function(a,b){b[ed]=o(1e3*("0."+a))});var Ed=A("Milliseconds",!1);F("z",0,0,"zoneAbbr"),F("zz",0,0,"zoneName");var Fd=m.prototype;Fd.add=td,Fd.calendar=$a,Fd.clone=_a,Fd.diff=fb,Fd.endOf=pb,Fd.format=jb,Fd.from=kb,Fd.fromNow=lb,Fd.get=D,Fd.invalidAt=wb,Fd.isAfter=ab,Fd.isBefore=bb,Fd.isBetween=cb,Fd.isSame=db,Fd.isValid=ub,Fd.lang=vd,Fd.locale=mb,Fd.localeData=nb,Fd.max=pd,Fd.min=od,Fd.parsingFlags=vb,Fd.set=D,Fd.startOf=ob,Fd.subtract=ud,Fd.toArray=tb,Fd.toDate=sb,Fd.toISOString=ib,Fd.toJSON=ib,Fd.toString=hb,Fd.unix=rb,Fd.valueOf=qb,Fd.year=md,Fd.isLeapYear=fa,Fd.weekYear=zb,Fd.isoWeekYear=Ab,Fd.quarter=Fd.quarters=Db,Fd.month=V,Fd.daysInMonth=W,Fd.week=Fd.weeks=ka,Fd.isoWeek=Fd.isoWeeks=la,Fd.weeksInYear=Cb,Fd.isoWeeksInYear=Bb,Fd.date=wd,Fd.day=Fd.days=Jb,Fd.weekday=Kb,Fd.isoWeekday=Lb,Fd.dayOfYear=na,Fd.hour=Fd.hours=Bd,Fd.minute=Fd.minutes=Cd,Fd.second=Fd.seconds=Dd,Fd.millisecond=Fd.milliseconds=Ed,Fd.utcOffset=Ja,Fd.utc=La,Fd.local=Ma,Fd.parseZone=Na,Fd.hasAlignedHourOffset=Oa,Fd.isDST=Pa,Fd.isDSTShifted=Qa,Fd.isLocal=Ra,Fd.isUtcOffset=Sa,Fd.isUtc=Ta,Fd.isUTC=Ta,Fd.zoneAbbr=Rb,Fd.zoneName=Sb,Fd.dates=Z("dates accessor is deprecated. Use date instead.",wd),Fd.months=Z("months accessor is deprecated. Use month instead",V),Fd.years=Z("years accessor is deprecated. Use year instead",md),Fd.zone=Z("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",Ka);var Gd=Fd,Hd={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},Id={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM D, YYYY LT"},Jd="Invalid date",Kd="%d",Ld=/\d{1,2}/,Md={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},Nd=q.prototype;Nd._calendar=Hd,Nd.calendar=Vb,Nd._longDateFormat=Id,Nd.longDateFormat=Wb,Nd._invalidDate=Jd,Nd.invalidDate=Xb,Nd._ordinal=Kd,Nd.ordinal=Yb,Nd._ordinalParse=Ld, +Nd.preparse=Zb,Nd.postformat=Zb,Nd._relativeTime=Md,Nd.relativeTime=$b,Nd.pastFuture=_b,Nd.set=ac,Nd.months=R,Nd._months=fd,Nd.monthsShort=S,Nd._monthsShort=gd,Nd.monthsParse=T,Nd.week=ha,Nd._week=nd,Nd.firstDayOfYear=ja,Nd.firstDayOfWeek=ia,Nd.weekdays=Fb,Nd._weekdays=xd,Nd.weekdaysMin=Hb,Nd._weekdaysMin=zd,Nd.weekdaysShort=Gb,Nd._weekdaysShort=yd,Nd.weekdaysParse=Ib,Nd.isPM=Ob,Nd._meridiemParse=Ad,Nd.meridiem=Pb,u("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===o(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),a.lang=Z("moment.lang is deprecated. Use moment.locale instead.",u),a.langData=Z("moment.langData is deprecated. Use moment.localeData instead.",w);var Od=Math.abs,Pd=rc("ms"),Qd=rc("s"),Rd=rc("m"),Sd=rc("h"),Td=rc("d"),Ud=rc("w"),Vd=rc("M"),Wd=rc("y"),Xd=tc("milliseconds"),Yd=tc("seconds"),Zd=tc("minutes"),$d=tc("hours"),_d=tc("days"),ae=tc("months"),be=tc("years"),ce=Math.round,de={s:45,m:45,h:22,d:26,M:11},ee=Math.abs,fe=Da.prototype;fe.abs=ic,fe.add=kc,fe.subtract=lc,fe.as=pc,fe.asMilliseconds=Pd,fe.asSeconds=Qd,fe.asMinutes=Rd,fe.asHours=Sd,fe.asDays=Td,fe.asWeeks=Ud,fe.asMonths=Vd,fe.asYears=Wd,fe.valueOf=qc,fe._bubble=mc,fe.get=sc,fe.milliseconds=Xd,fe.seconds=Yd,fe.minutes=Zd,fe.hours=$d,fe.days=_d,fe.weeks=uc,fe.months=ae,fe.years=be,fe.humanize=yc,fe.toISOString=zc,fe.toString=zc,fe.toJSON=zc,fe.locale=mb,fe.localeData=nb,fe.toIsoString=Z("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",zc),fe.lang=vd,F("X",0,0,"unix"),F("x",0,0,"valueOf"),K("x",Uc),K("X",Wc),N("X",function(a,b,c){c._d=new Date(1e3*parseFloat(a,10))}),N("x",function(a,b,c){c._d=new Date(o(a))}),a.version="2.10.2",b(za),a.fn=Gd,a.min=Ba,a.max=Ca,a.utc=i,a.unix=Tb,a.months=dc,a.isDate=e,a.locale=u,a.invalid=k,a.duration=Ua,a.isMoment=n,a.weekdays=fc,a.parseZone=Ub,a.localeData=w,a.isDuration=Ea,a.monthsShort=ec,a.weekdaysMin=hc,a.defineLocale=v,a.weekdaysShort=gc,a.normalizeUnits=y,a.relativeTimeThreshold=xc;var ge=a;return ge}); \ No newline at end of file diff --git a/assets/php-barcode-master/LICENSE b/assets/php-barcode-master/LICENSE new file mode 100644 index 0000000..80bd9bb --- /dev/null +++ b/assets/php-barcode-master/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 David Tufts + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/assets/php-barcode-master/README.md b/assets/php-barcode-master/README.md new file mode 100644 index 0000000..5455283 --- /dev/null +++ b/assets/php-barcode-master/README.md @@ -0,0 +1,17 @@ +php-barcode +=========== + +Source code for the article "How To Create Barcodes in PHP" found at: +http://davidscotttufts.com/2009/03/31/how-to-create-barcodes-in-php/ + +This script that generates barcodes in four barcode formats including +Code 128, Code 39, Code 2of5, and Codabar. With a little over 100 lines +of code you have the options of “vertical” or “horizontal” display, +varying barcode heights, and one of four barcode formats. It does require +the GD Library to be installed as a module in PHP. + +Usage: +&lt;img alt="testing" src="barcode.php?text=testing" /&gt; + +Result: +<img alt="testing" src="http://davidscotttufts.com/code/barcode.php?text=testing" /> diff --git a/assets/php-barcode-master/barcode.php b/assets/php-barcode-master/barcode.php new file mode 100644 index 0000000..a678a67 --- /dev/null +++ b/assets/php-barcode-master/barcode.php @@ -0,0 +1,153 @@ +<?php + +/* + * Author David S. Tufts + * Company davidscotttufts.com + * + * Date: 05/25/2003 + * Usage: <img src="/barcode.php?text=testing" alt="testing" /> + */ + +// For demonstration purposes, get pararameters that are passed in through $_GET or set to the default value +$filepath = (isset($_GET["filepath"])?$_GET["filepath"]:""); +$text = (isset($_GET["text"])?$_GET["text"]:"0"); +$size = (isset($_GET["size"])?$_GET["size"]:"20"); +$orientation = (isset($_GET["orientation"])?$_GET["orientation"]:"horizontal"); +$code_type = (isset($_GET["codetype"])?$_GET["codetype"]:"code128"); +$print = (isset($_GET["print"])&&$_GET["print"]=='true'?true:false); +$sizefactor = (isset($_GET["sizefactor"])?$_GET["sizefactor"]:"1"); + + +// This function call can be copied into your project and can be made from anywhere in your code +barcode( $filepath, $text, $size, $orientation, $code_type, $print, $sizefactor ); + +function barcode( $filepath="", $text="0", $size="20", $orientation="horizontal", $code_type="code128", $print=false, $SizeFactor=1 ) { + $code_string = ""; + // Translate the $text into barcode the correct $code_type + if ( in_array(strtolower($code_type), array("code128", "code128b")) ) { + $chksum = 104; + // Must not change order of array elements as the checksum depends on the array's key to validate final code + $code_array = array(" "=>"212222","!"=>"222122","\""=>"222221","#"=>"121223","$"=>"121322","%"=>"131222","&"=>"122213","'"=>"122312","("=>"132212",")"=>"221213","*"=>"221312","+"=>"231212",","=>"112232","-"=>"122132","."=>"122231","/"=>"113222","0"=>"123122","1"=>"123221","2"=>"223211","3"=>"221132","4"=>"221231","5"=>"213212","6"=>"223112","7"=>"312131","8"=>"311222","9"=>"321122",":"=>"321221",";"=>"312212","<"=>"322112","="=>"322211",">"=>"212123","?"=>"212321","@"=>"232121","A"=>"111323","B"=>"131123","C"=>"131321","D"=>"112313","E"=>"132113","F"=>"132311","G"=>"211313","H"=>"231113","I"=>"231311","J"=>"112133","K"=>"112331","L"=>"132131","M"=>"113123","N"=>"113321","O"=>"133121","P"=>"313121","Q"=>"211331","R"=>"231131","S"=>"213113","T"=>"213311","U"=>"213131","V"=>"311123","W"=>"311321","X"=>"331121","Y"=>"312113","Z"=>"312311","["=>"332111","\\"=>"314111","]"=>"221411","^"=>"431111","_"=>"111224","\`"=>"111422","a"=>"121124","b"=>"121421","c"=>"141122","d"=>"141221","e"=>"112214","f"=>"112412","g"=>"122114","h"=>"122411","i"=>"142112","j"=>"142211","k"=>"241211","l"=>"221114","m"=>"413111","n"=>"241112","o"=>"134111","p"=>"111242","q"=>"121142","r"=>"121241","s"=>"114212","t"=>"124112","u"=>"124211","v"=>"411212","w"=>"421112","x"=>"421211","y"=>"212141","z"=>"214121","{"=>"412121","|"=>"111143","}"=>"111341","~"=>"131141","DEL"=>"114113","FNC 3"=>"114311","FNC 2"=>"411113","SHIFT"=>"411311","CODE C"=>"113141","FNC 4"=>"114131","CODE A"=>"311141","FNC 1"=>"411131","Start A"=>"211412","Start B"=>"211214","Start C"=>"211232","Stop"=>"2331112"); + $code_keys = array_keys($code_array); + $code_values = array_flip($code_keys); + for ( $X = 1; $X <= strlen($text); $X++ ) { + $activeKey = substr( $text, ($X-1), 1); + $code_string .= $code_array[$activeKey]; + $chksum=($chksum + ($code_values[$activeKey] * $X)); + } + $code_string .= $code_array[$code_keys[($chksum - (intval($chksum / 103) * 103))]]; + + $code_string = "211214" . $code_string . "2331112"; + } elseif ( strtolower($code_type) == "code128a" ) { + $chksum = 103; + $text = strtoupper($text); // Code 128A doesn't support lower case + // Must not change order of array elements as the checksum depends on the array's key to validate final code + $code_array = array(" "=>"212222","!"=>"222122","\""=>"222221","#"=>"121223","$"=>"121322","%"=>"131222","&"=>"122213","'"=>"122312","("=>"132212",")"=>"221213","*"=>"221312","+"=>"231212",","=>"112232","-"=>"122132","."=>"122231","/"=>"113222","0"=>"123122","1"=>"123221","2"=>"223211","3"=>"221132","4"=>"221231","5"=>"213212","6"=>"223112","7"=>"312131","8"=>"311222","9"=>"321122",":"=>"321221",";"=>"312212","<"=>"322112","="=>"322211",">"=>"212123","?"=>"212321","@"=>"232121","A"=>"111323","B"=>"131123","C"=>"131321","D"=>"112313","E"=>"132113","F"=>"132311","G"=>"211313","H"=>"231113","I"=>"231311","J"=>"112133","K"=>"112331","L"=>"132131","M"=>"113123","N"=>"113321","O"=>"133121","P"=>"313121","Q"=>"211331","R"=>"231131","S"=>"213113","T"=>"213311","U"=>"213131","V"=>"311123","W"=>"311321","X"=>"331121","Y"=>"312113","Z"=>"312311","["=>"332111","\\"=>"314111","]"=>"221411","^"=>"431111","_"=>"111224","NUL"=>"111422","SOH"=>"121124","STX"=>"121421","ETX"=>"141122","EOT"=>"141221","ENQ"=>"112214","ACK"=>"112412","BEL"=>"122114","BS"=>"122411","HT"=>"142112","LF"=>"142211","VT"=>"241211","FF"=>"221114","CR"=>"413111","SO"=>"241112","SI"=>"134111","DLE"=>"111242","DC1"=>"121142","DC2"=>"121241","DC3"=>"114212","DC4"=>"124112","NAK"=>"124211","SYN"=>"411212","ETB"=>"421112","CAN"=>"421211","EM"=>"212141","SUB"=>"214121","ESC"=>"412121","FS"=>"111143","GS"=>"111341","RS"=>"131141","US"=>"114113","FNC 3"=>"114311","FNC 2"=>"411113","SHIFT"=>"411311","CODE C"=>"113141","CODE B"=>"114131","FNC 4"=>"311141","FNC 1"=>"411131","Start A"=>"211412","Start B"=>"211214","Start C"=>"211232","Stop"=>"2331112"); + $code_keys = array_keys($code_array); + $code_values = array_flip($code_keys); + for ( $X = 1; $X <= strlen($text); $X++ ) { + $activeKey = substr( $text, ($X-1), 1); + $code_string .= $code_array[$activeKey]; + $chksum=($chksum + ($code_values[$activeKey] * $X)); + } + $code_string .= $code_array[$code_keys[($chksum - (intval($chksum / 103) * 103))]]; + + $code_string = "211412" . $code_string . "2331112"; + } elseif ( strtolower($code_type) == "code39" ) { + $code_array = array("0"=>"111221211","1"=>"211211112","2"=>"112211112","3"=>"212211111","4"=>"111221112","5"=>"211221111","6"=>"112221111","7"=>"111211212","8"=>"211211211","9"=>"112211211","A"=>"211112112","B"=>"112112112","C"=>"212112111","D"=>"111122112","E"=>"211122111","F"=>"112122111","G"=>"111112212","H"=>"211112211","I"=>"112112211","J"=>"111122211","K"=>"211111122","L"=>"112111122","M"=>"212111121","N"=>"111121122","O"=>"211121121","P"=>"112121121","Q"=>"111111222","R"=>"211111221","S"=>"112111221","T"=>"111121221","U"=>"221111112","V"=>"122111112","W"=>"222111111","X"=>"121121112","Y"=>"221121111","Z"=>"122121111","-"=>"121111212","."=>"221111211"," "=>"122111211","$"=>"121212111","/"=>"121211121","+"=>"121112121","%"=>"111212121","*"=>"121121211"); + + // Convert to uppercase + $upper_text = strtoupper($text); + + for ( $X = 1; $X<=strlen($upper_text); $X++ ) { + $code_string .= $code_array[substr( $upper_text, ($X-1), 1)] . "1"; + } + + $code_string = "1211212111" . $code_string . "121121211"; + } elseif ( strtolower($code_type) == "code25" ) { + $code_array1 = array("1","2","3","4","5","6","7","8","9","0"); + $code_array2 = array("3-1-1-1-3","1-3-1-1-3","3-3-1-1-1","1-1-3-1-3","3-1-3-1-1","1-3-3-1-1","1-1-1-3-3","3-1-1-3-1","1-3-1-3-1","1-1-3-3-1"); + + for ( $X = 1; $X <= strlen($text); $X++ ) { + for ( $Y = 0; $Y < count($code_array1); $Y++ ) { + if ( substr($text, ($X-1), 1) == $code_array1[$Y] ) + $temp[$X] = $code_array2[$Y]; + } + } + + for ( $X=1; $X<=strlen($text); $X+=2 ) { + if ( isset($temp[$X]) && isset($temp[($X + 1)]) ) { + $temp1 = explode( "-", $temp[$X] ); + $temp2 = explode( "-", $temp[($X + 1)] ); + for ( $Y = 0; $Y < count($temp1); $Y++ ) + $code_string .= $temp1[$Y] . $temp2[$Y]; + } + } + + $code_string = "1111" . $code_string . "311"; + } elseif ( strtolower($code_type) == "codabar" ) { + $code_array1 = array("1","2","3","4","5","6","7","8","9","0","-","$",":","/",".","+","A","B","C","D"); + $code_array2 = array("1111221","1112112","2211111","1121121","2111121","1211112","1211211","1221111","2112111","1111122","1112211","1122111","2111212","2121112","2121211","1121212","1122121","1212112","1112122","1112221"); + + // Convert to uppercase + $upper_text = strtoupper($text); + + for ( $X = 1; $X<=strlen($upper_text); $X++ ) { + for ( $Y = 0; $Y<count($code_array1); $Y++ ) { + if ( substr($upper_text, ($X-1), 1) == $code_array1[$Y] ) + $code_string .= $code_array2[$Y] . "1"; + } + } + $code_string = "11221211" . $code_string . "1122121"; + } + + // Pad the edges of the barcode + $code_length = 20; + if ($print) { + $text_height = 30; + } else { + $text_height = 0; + } + + for ( $i=1; $i <= strlen($code_string); $i++ ){ + $code_length = $code_length + (integer)(substr($code_string,($i-1),1)); + } + + if ( strtolower($orientation) == "horizontal" ) { + $img_width = $code_length*$SizeFactor; + $img_height = $size; + } else { + $img_width = $size; + $img_height = $code_length*$SizeFactor; + } + $image = imagecreate($img_width, $img_height + $text_height); + $black = imagecolorallocate ($image, 0, 0, 0); + $white = imagecolorallocate ($image, 255, 255, 255); + + imagefill( $image, 0, 0, $white ); + if ( $print ) { + imagestring($image, 5, 31, $img_height, $text, $black ); + } + + $location = 10; + for ( $position = 1 ; $position <= strlen($code_string); $position++ ) { + $cur_size = $location + ( substr($code_string, ($position-1), 1) ); + if ( strtolower($orientation) == "horizontal" ) + imagefilledrectangle( $image, $location*$SizeFactor, 0, $cur_size*$SizeFactor, $img_height, ($position % 2 == 0 ? $white : $black) ); + else + imagefilledrectangle( $image, 0, $location*$SizeFactor, $img_width, $cur_size*$SizeFactor, ($position % 2 == 0 ? $white : $black) ); + $location = $cur_size; + } + + // Draw barcode to the screen or save in a file + if ( $filepath=="" ) { + header ('Content-type: image/png'); + imagepng($image); + imagedestroy($image); + } else { + imagepng($image,$filepath); + imagedestroy($image); + } +} + +?> diff --git a/assets/raphael-min.js b/assets/raphael-min.js new file mode 100644 index 0000000..ed99de2 --- /dev/null +++ b/assets/raphael-min.js @@ -0,0 +1,10 @@ +// ┌────────────────────────────────────────────────────────────────────┐ \\ +// │ Raphaël 2.1.0 - JavaScript Vector Library │ \\ +// ├────────────────────────────────────────────────────────────────────┤ \\ +// │ Copyright © 2008-2012 Dmitry Baranovskiy (http://raphaeljs.com) │ \\ +// │ Copyright © 2008-2012 Sencha Labs (http://sencha.com) │ \\ +// ├────────────────────────────────────────────────────────────────────┤ \\ +// │ Licensed under the MIT (http://raphaeljs.com/license.html) license.│ \\ +// └────────────────────────────────────────────────────────────────────┘ \\ + +(function(a){var b="0.3.4",c="hasOwnProperty",d=/[\.\/]/,e="*",f=function(){},g=function(a,b){return a-b},h,i,j={n:{}},k=function(a,b){var c=j,d=i,e=Array.prototype.slice.call(arguments,2),f=k.listeners(a),l=0,m=!1,n,o=[],p={},q=[],r=h,s=[];h=a,i=0;for(var t=0,u=f.length;t<u;t++)"zIndex"in f[t]&&(o.push(f[t].zIndex),f[t].zIndex<0&&(p[f[t].zIndex]=f[t]));o.sort(g);while(o[l]<0){n=p[o[l++]],q.push(n.apply(b,e));if(i){i=d;return q}}for(t=0;t<u;t++){n=f[t];if("zIndex"in n)if(n.zIndex==o[l]){q.push(n.apply(b,e));if(i)break;do{l++,n=p[o[l]],n&&q.push(n.apply(b,e));if(i)break}while(n)}else p[n.zIndex]=n;else{q.push(n.apply(b,e));if(i)break}}i=d,h=r;return q.length?q:null};k.listeners=function(a){var b=a.split(d),c=j,f,g,h,i,k,l,m,n,o=[c],p=[];for(i=0,k=b.length;i<k;i++){n=[];for(l=0,m=o.length;l<m;l++){c=o[l].n,g=[c[b[i]],c[e]],h=2;while(h--)f=g[h],f&&(n.push(f),p=p.concat(f.f||[]))}o=n}return p},k.on=function(a,b){var c=a.split(d),e=j;for(var g=0,h=c.length;g<h;g++)e=e.n,!e[c[g]]&&(e[c[g]]={n:{}}),e=e[c[g]];e.f=e.f||[];for(g=0,h=e.f.length;g<h;g++)if(e.f[g]==b)return f;e.f.push(b);return function(a){+a==+a&&(b.zIndex=+a)}},k.stop=function(){i=1},k.nt=function(a){if(a)return(new RegExp("(?:\\.|\\/|^)"+a+"(?:\\.|\\/|$)")).test(h);return h},k.off=k.unbind=function(a,b){var f=a.split(d),g,h,i,k,l,m,n,o=[j];for(k=0,l=f.length;k<l;k++)for(m=0;m<o.length;m+=i.length-2){i=[m,1],g=o[m].n;if(f[k]!=e)g[f[k]]&&i.push(g[f[k]]);else for(h in g)g[c](h)&&i.push(g[h]);o.splice.apply(o,i)}for(k=0,l=o.length;k<l;k++){g=o[k];while(g.n){if(b){if(g.f){for(m=0,n=g.f.length;m<n;m++)if(g.f[m]==b){g.f.splice(m,1);break}!g.f.length&&delete g.f}for(h in g.n)if(g.n[c](h)&&g.n[h].f){var p=g.n[h].f;for(m=0,n=p.length;m<n;m++)if(p[m]==b){p.splice(m,1);break}!p.length&&delete g.n[h].f}}else{delete g.f;for(h in g.n)g.n[c](h)&&g.n[h].f&&delete g.n[h].f}g=g.n}}},k.once=function(a,b){var c=function(){var d=b.apply(this,arguments);k.unbind(a,c);return d};return k.on(a,c)},k.version=b,k.toString=function(){return"You are running Eve "+b},typeof module!="undefined"&&module.exports?module.exports=k:typeof define!="undefined"?define("eve",[],function(){return k}):a.eve=k})(this),function(){function cF(a){for(var b=0;b<cy.length;b++)cy[b].el.paper==a&&cy.splice(b--,1)}function cE(b,d,e,f,h,i){e=Q(e);var j,k,l,m=[],o,p,q,t=b.ms,u={},v={},w={};if(f)for(y=0,z=cy.length;y<z;y++){var x=cy[y];if(x.el.id==d.id&&x.anim==b){x.percent!=e?(cy.splice(y,1),l=1):k=x,d.attr(x.totalOrigin);break}}else f=+v;for(var y=0,z=b.percents.length;y<z;y++){if(b.percents[y]==e||b.percents[y]>f*b.top){e=b.percents[y],p=b.percents[y-1]||0,t=t/b.top*(e-p),o=b.percents[y+1],j=b.anim[e];break}f&&d.attr(b.anim[b.percents[y]])}if(!!j){if(!k){for(var A in j)if(j[g](A))if(U[g](A)||d.paper.customAttributes[g](A)){u[A]=d.attr(A),u[A]==null&&(u[A]=T[A]),v[A]=j[A];switch(U[A]){case C:w[A]=(v[A]-u[A])/t;break;case"colour":u[A]=a.getRGB(u[A]);var B=a.getRGB(v[A]);w[A]={r:(B.r-u[A].r)/t,g:(B.g-u[A].g)/t,b:(B.b-u[A].b)/t};break;case"path":var D=bR(u[A],v[A]),E=D[1];u[A]=D[0],w[A]=[];for(y=0,z=u[A].length;y<z;y++){w[A][y]=[0];for(var F=1,G=u[A][y].length;F<G;F++)w[A][y][F]=(E[y][F]-u[A][y][F])/t}break;case"transform":var H=d._,I=ca(H[A],v[A]);if(I){u[A]=I.from,v[A]=I.to,w[A]=[],w[A].real=!0;for(y=0,z=u[A].length;y<z;y++){w[A][y]=[u[A][y][0]];for(F=1,G=u[A][y].length;F<G;F++)w[A][y][F]=(v[A][y][F]-u[A][y][F])/t}}else{var J=d.matrix||new cb,K={_:{transform:H.transform},getBBox:function(){return d.getBBox(1)}};u[A]=[J.a,J.b,J.c,J.d,J.e,J.f],b$(K,v[A]),v[A]=K._.transform,w[A]=[(K.matrix.a-J.a)/t,(K.matrix.b-J.b)/t,(K.matrix.c-J.c)/t,(K.matrix.d-J.d)/t,(K.matrix.e-J.e)/t,(K.matrix.f-J.f)/t]}break;case"csv":var L=r(j[A])[s](c),M=r(u[A])[s](c);if(A=="clip-rect"){u[A]=M,w[A]=[],y=M.length;while(y--)w[A][y]=(L[y]-u[A][y])/t}v[A]=L;break;default:L=[][n](j[A]),M=[][n](u[A]),w[A]=[],y=d.paper.customAttributes[A].length;while(y--)w[A][y]=((L[y]||0)-(M[y]||0))/t}}var O=j.easing,P=a.easing_formulas[O];if(!P){P=r(O).match(N);if(P&&P.length==5){var R=P;P=function(a){return cC(a,+R[1],+R[2],+R[3],+R[4],t)}}else P=bf}q=j.start||b.start||+(new Date),x={anim:b,percent:e,timestamp:q,start:q+(b.del||0),status:0,initstatus:f||0,stop:!1,ms:t,easing:P,from:u,diff:w,to:v,el:d,callback:j.callback,prev:p,next:o,repeat:i||b.times,origin:d.attr(),totalOrigin:h},cy.push(x);if(f&&!k&&!l){x.stop=!0,x.start=new Date-t*f;if(cy.length==1)return cA()}l&&(x.start=new Date-x.ms*f),cy.length==1&&cz(cA)}else k.initstatus=f,k.start=new Date-k.ms*f;eve("raphael.anim.start."+d.id,d,b)}}function cD(a,b){var c=[],d={};this.ms=b,this.times=1;if(a){for(var e in a)a[g](e)&&(d[Q(e)]=a[e],c.push(Q(e)));c.sort(bd)}this.anim=d,this.top=c[c.length-1],this.percents=c}function cC(a,b,c,d,e,f){function o(a,b){var c,d,e,f,j,k;for(e=a,k=0;k<8;k++){f=m(e)-a;if(z(f)<b)return e;j=(3*i*e+2*h)*e+g;if(z(j)<1e-6)break;e=e-f/j}c=0,d=1,e=a;if(e<c)return c;if(e>d)return d;while(c<d){f=m(e);if(z(f-a)<b)return e;a>f?c=e:d=e,e=(d-c)/2+c}return e}function n(a,b){var c=o(a,b);return((l*c+k)*c+j)*c}function m(a){return((i*a+h)*a+g)*a}var g=3*b,h=3*(d-b)-g,i=1-g-h,j=3*c,k=3*(e-c)-j,l=1-j-k;return n(a,1/(200*f))}function cq(){return this.x+q+this.y+q+this.width+" × "+this.height}function cp(){return this.x+q+this.y}function cb(a,b,c,d,e,f){a!=null?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function bH(b,c,d){b=a._path2curve(b),c=a._path2curve(c);var e,f,g,h,i,j,k,l,m,n,o=d?0:[];for(var p=0,q=b.length;p<q;p++){var r=b[p];if(r[0]=="M")e=i=r[1],f=j=r[2];else{r[0]=="C"?(m=[e,f].concat(r.slice(1)),e=m[6],f=m[7]):(m=[e,f,e,f,i,j,i,j],e=i,f=j);for(var s=0,t=c.length;s<t;s++){var u=c[s];if(u[0]=="M")g=k=u[1],h=l=u[2];else{u[0]=="C"?(n=[g,h].concat(u.slice(1)),g=n[6],h=n[7]):(n=[g,h,g,h,k,l,k,l],g=k,h=l);var v=bG(m,n,d);if(d)o+=v;else{for(var w=0,x=v.length;w<x;w++)v[w].segment1=p,v[w].segment2=s,v[w].bez1=m,v[w].bez2=n;o=o.concat(v)}}}}}return o}function bG(b,c,d){var e=a.bezierBBox(b),f=a.bezierBBox(c);if(!a.isBBoxIntersect(e,f))return d?0:[];var g=bB.apply(0,b),h=bB.apply(0,c),i=~~(g/5),j=~~(h/5),k=[],l=[],m={},n=d?0:[];for(var o=0;o<i+1;o++){var p=a.findDotsAtSegment.apply(a,b.concat(o/i));k.push({x:p.x,y:p.y,t:o/i})}for(o=0;o<j+1;o++)p=a.findDotsAtSegment.apply(a,c.concat(o/j)),l.push({x:p.x,y:p.y,t:o/j});for(o=0;o<i;o++)for(var q=0;q<j;q++){var r=k[o],s=k[o+1],t=l[q],u=l[q+1],v=z(s.x-r.x)<.001?"y":"x",w=z(u.x-t.x)<.001?"y":"x",x=bD(r.x,r.y,s.x,s.y,t.x,t.y,u.x,u.y);if(x){if(m[x.x.toFixed(4)]==x.y.toFixed(4))continue;m[x.x.toFixed(4)]=x.y.toFixed(4);var y=r.t+z((x[v]-r[v])/(s[v]-r[v]))*(s.t-r.t),A=t.t+z((x[w]-t[w])/(u[w]-t[w]))*(u.t-t.t);y>=0&&y<=1&&A>=0&&A<=1&&(d?n++:n.push({x:x.x,y:x.y,t1:y,t2:A}))}}return n}function bF(a,b){return bG(a,b,1)}function bE(a,b){return bG(a,b)}function bD(a,b,c,d,e,f,g,h){if(!(x(a,c)<y(e,g)||y(a,c)>x(e,g)||x(b,d)<y(f,h)||y(b,d)>x(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(!k)return;var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(n<+y(a,c).toFixed(2)||n>+x(a,c).toFixed(2)||n<+y(e,g).toFixed(2)||n>+x(e,g).toFixed(2)||o<+y(b,d).toFixed(2)||o>+x(b,d).toFixed(2)||o<+y(f,h).toFixed(2)||o>+x(f,h).toFixed(2))return;return{x:l,y:m}}}function bC(a,b,c,d,e,f,g,h,i){if(!(i<0||bB(a,b,c,d,e,f,g,h)<i)){var j=1,k=j/2,l=j-k,m,n=.01;m=bB(a,b,c,d,e,f,g,h,l);while(z(m-i)>n)k/=2,l+=(m<i?1:-1)*k,m=bB(a,b,c,d,e,f,g,h,l);return l}}function bB(a,b,c,d,e,f,g,h,i){i==null&&(i=1),i=i>1?1:i<0?0:i;var j=i/2,k=12,l=[-0.1252,.1252,-0.3678,.3678,-0.5873,.5873,-0.7699,.7699,-0.9041,.9041,-0.9816,.9816],m=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],n=0;for(var o=0;o<k;o++){var p=j*l[o]+j,q=bA(p,a,c,e,g),r=bA(p,b,d,f,h),s=q*q+r*r;n+=m[o]*w.sqrt(s)}return j*n}function bA(a,b,c,d,e){var f=-3*b+9*c-9*d+3*e,g=a*f+6*b-12*c+6*d;return a*g-3*b+3*c}function by(a,b){var c=[];for(var d=0,e=a.length;e-2*!b>d;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push(["C",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])}return c}function bx(){return this.hex}function bv(a,b,c){function d(){var e=Array.prototype.slice.call(arguments,0),f=e.join("␀"),h=d.cache=d.cache||{},i=d.count=d.count||[];if(h[g](f)){bu(i,f);return c?c(h[f]):h[f]}i.length>=1e3&&delete h[i.shift()],i.push(f),h[f]=a[m](b,e);return c?c(h[f]):h[f]}return d}function bu(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return a.push(a.splice(c,1)[0])}function bm(a){if(Object(a)!==a)return a;var b=new a.constructor;for(var c in a)a[g](c)&&(b[c]=bm(a[c]));return b}function a(c){if(a.is(c,"function"))return b?c():eve.on("raphael.DOMload",c);if(a.is(c,E))return a._engine.create[m](a,c.splice(0,3+a.is(c[0],C))).add(c);var d=Array.prototype.slice.call(arguments,0);if(a.is(d[d.length-1],"function")){var e=d.pop();return b?e.call(a._engine.create[m](a,d)):eve.on("raphael.DOMload",function(){e.call(a._engine.create[m](a,d))})}return a._engine.create[m](a,arguments)}a.version="2.1.0",a.eve=eve;var b,c=/[, ]+/,d={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},e=/\{(\d+)\}/g,f="prototype",g="hasOwnProperty",h={doc:document,win:window},i={was:Object.prototype[g].call(h.win,"Raphael"),is:h.win.Raphael},j=function(){this.ca=this.customAttributes={}},k,l="appendChild",m="apply",n="concat",o="createTouch"in h.doc,p="",q=" ",r=String,s="split",t="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[s](q),u={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},v=r.prototype.toLowerCase,w=Math,x=w.max,y=w.min,z=w.abs,A=w.pow,B=w.PI,C="number",D="string",E="array",F="toString",G="fill",H=Object.prototype.toString,I={},J="push",K=a._ISURL=/^url\(['"]?([^\)]+?)['"]?\)$/i,L=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,M={NaN:1,Infinity:1,"-Infinity":1},N=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,O=w.round,P="setAttribute",Q=parseFloat,R=parseInt,S=r.prototype.toUpperCase,T=a._availableAttrs={"arrow-end":"none","arrow-start":"none",blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/","letter-spacing":0,opacity:1,path:"M0,0",r:0,rx:0,ry:0,src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",transform:"",width:0,x:0,y:0},U=a._availableAnimAttrs={blur:C,"clip-rect":"csv",cx:C,cy:C,fill:"colour","fill-opacity":C,"font-size":C,height:C,opacity:C,path:"path",r:C,rx:C,ry:C,stroke:"colour","stroke-opacity":C,"stroke-width":C,transform:"transform",width:C,x:C,y:C},V=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]/g,W=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/,X={hs:1,rg:1},Y=/,?([achlmqrstvxz]),?/gi,Z=/([achlmrqstvz])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/ig,$=/([rstm])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/ig,_=/(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/ig,ba=a._radial_gradient=/^r(?:\(([^,]+?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*([^\)]+?)\))?/,bb={},bc=function(a,b){return a.key-b.key},bd=function(a,b){return Q(a)-Q(b)},be=function(){},bf=function(a){return a},bg=a._rectPath=function(a,b,c,d,e){if(e)return[["M",a+e,b],["l",c-e*2,0],["a",e,e,0,0,1,e,e],["l",0,d-e*2],["a",e,e,0,0,1,-e,e],["l",e*2-c,0],["a",e,e,0,0,1,-e,-e],["l",0,e*2-d],["a",e,e,0,0,1,e,-e],["z"]];return[["M",a,b],["l",c,0],["l",0,d],["l",-c,0],["z"]]},bh=function(a,b,c,d){d==null&&(d=c);return[["M",a,b],["m",0,-d],["a",c,d,0,1,1,0,2*d],["a",c,d,0,1,1,0,-2*d],["z"]]},bi=a._getPath={path:function(a){return a.attr("path")},circle:function(a){var b=a.attrs;return bh(b.cx,b.cy,b.r)},ellipse:function(a){var b=a.attrs;return bh(b.cx,b.cy,b.rx,b.ry)},rect:function(a){var b=a.attrs;return bg(b.x,b.y,b.width,b.height,b.r)},image:function(a){var b=a.attrs;return bg(b.x,b.y,b.width,b.height)},text:function(a){var b=a._getBBox();return bg(b.x,b.y,b.width,b.height)}},bj=a.mapPath=function(a,b){if(!b)return a;var c,d,e,f,g,h,i;a=bR(a);for(e=0,g=a.length;e<g;e++){i=a[e];for(f=1,h=i.length;f<h;f+=2)c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d}return a};a._g=h,a.type=h.win.SVGAngle||h.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML";if(a.type=="VML"){var bk=h.doc.createElement("div"),bl;bk.innerHTML='<v:shape adj="1"/>',bl=bk.firstChild,bl.style.behavior="url(#default#VML)";if(!bl||typeof bl.adj!="object")return a.type=p;bk=null}a.svg=!(a.vml=a.type=="VML"),a._Paper=j,a.fn=k=j.prototype=a.prototype,a._id=0,a._oid=0,a.is=function(a,b){b=v.call(b);if(b=="finite")return!M[g](+a);if(b=="array")return a instanceof Array;return b=="null"&&a===null||b==typeof a&&a!==null||b=="object"&&a===Object(a)||b=="array"&&Array.isArray&&Array.isArray(a)||H.call(a).slice(8,-1).toLowerCase()==b},a.angle=function(b,c,d,e,f,g){if(f==null){var h=b-d,i=c-e;if(!h&&!i)return 0;return(180+w.atan2(-i,-h)*180/B+360)%360}return a.angle(b,c,f,g)-a.angle(d,e,f,g)},a.rad=function(a){return a%360*B/180},a.deg=function(a){return a*180/B%360},a.snapTo=function(b,c,d){d=a.is(d,"finite")?d:10;if(a.is(b,E)){var e=b.length;while(e--)if(z(b[e]-c)<=d)return b[e]}else{b=+b;var f=c%b;if(f<d)return c-f;if(f>b-d)return c-f+b}return c};var bn=a.createUUID=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=w.random()*16|0,c=a=="x"?b:b&3|8;return c.toString(16)});a.setWindow=function(b){eve("raphael.setWindow",a,h.win,b),h.win=b,h.doc=h.win.document,a._engine.initWin&&a._engine.initWin(h.win)};var bo=function(b){if(a.vml){var c=/^\s+|\s+$/g,d;try{var e=new ActiveXObject("htmlfile");e.write("<body>"),e.close(),d=e.body}catch(f){d=createPopup().document.body}var g=d.createTextRange();bo=bv(function(a){try{d.style.color=r(a).replace(c,p);var b=g.queryCommandValue("ForeColor");b=(b&255)<<16|b&65280|(b&16711680)>>>16;return"#"+("000000"+b.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=h.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",h.doc.body.appendChild(i),bo=bv(function(a){i.style.color=a;return h.doc.defaultView.getComputedStyle(i,p).getPropertyValue("color")})}return bo(b)},bp=function(){return"hsb("+[this.h,this.s,this.b]+")"},bq=function(){return"hsl("+[this.h,this.s,this.l]+")"},br=function(){return this.hex},bs=function(b,c,d){c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b&&(d=b.b,c=b.g,b=b.r);if(c==null&&a.is(b,D)){var e=a.getRGB(b);b=e.r,c=e.g,d=e.b}if(b>1||c>1||d>1)b/=255,c/=255,d/=255;return[b,c,d]},bt=function(b,c,d,e){b*=255,c*=255,d*=255;var f={r:b,g:c,b:d,hex:a.rgb(b,c,d),toString:br};a.is(e,"finite")&&(f.opacity=e);return f};a.color=function(b){var c;a.is(b,"object")&&"h"in b&&"s"in b&&"b"in b?(c=a.hsb2rgb(b),b.r=c.r,b.g=c.g,b.b=c.b,b.hex=c.hex):a.is(b,"object")&&"h"in b&&"s"in b&&"l"in b?(c=a.hsl2rgb(b),b.r=c.r,b.g=c.g,b.b=c.b,b.hex=c.hex):(a.is(b,"string")&&(b=a.getRGB(b)),a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b?(c=a.rgb2hsl(b),b.h=c.h,b.s=c.s,b.l=c.l,c=a.rgb2hsb(b),b.v=c.b):(b={hex:"none"},b.r=b.g=b.b=b.h=b.s=b.v=b.l=-1)),b.toString=br;return b},a.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,a=a.h,d=a.o),a*=360;var e,f,g,h,i;a=a%360/60,i=c*b,h=i*(1-z(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bt(e,f,g,d)},a.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h);if(a>1||b>1||c>1)a/=360,b/=100,c/=100;a*=360;var e,f,g,h,i;a=a%360/60,i=2*b*(c<.5?c:1-c),h=i*(1-z(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bt(e,f,g,d)},a.rgb2hsb=function(a,b,c){c=bs(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;f=x(a,b,c),g=f-y(a,b,c),d=g==0?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=g==0?0:g/f;return{h:d,s:e,b:f,toString:bp}},a.rgb2hsl=function(a,b,c){c=bs(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;g=x(a,b,c),h=y(a,b,c),i=g-h,d=i==0?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=i==0?0:f<.5?i/(2*f):i/(2-2*f);return{h:d,s:e,l:f,toString:bq}},a._path2string=function(){return this.join(",").replace(Y,"$1")};var bw=a._preload=function(a,b){var c=h.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top:-9999em",c.onload=function(){b.call(this),this.onload=null,h.doc.body.removeChild(this)},c.onerror=function(){h.doc.body.removeChild(this)},h.doc.body.appendChild(c),c.src=a};a.getRGB=bv(function(b){if(!b||!!((b=r(b)).indexOf("-")+1))return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:bx};if(b=="none")return{r:-1,g:-1,b:-1,hex:"none",toString:bx};!X[g](b.toLowerCase().substring(0,2))&&b.charAt()!="#"&&(b=bo(b));var c,d,e,f,h,i,j,k=b.match(L);if(k){k[2]&&(f=R(k[2].substring(5),16),e=R(k[2].substring(3,5),16),d=R(k[2].substring(1,3),16)),k[3]&&(f=R((i=k[3].charAt(3))+i,16),e=R((i=k[3].charAt(2))+i,16),d=R((i=k[3].charAt(1))+i,16)),k[4]&&(j=k[4][s](W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),k[1].toLowerCase().slice(0,4)=="rgba"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100));if(k[5]){j=k[5][s](W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsba"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsb2rgb(d,e,f,h)}if(k[6]){j=k[6][s](W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsla"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsl2rgb(d,e,f,h)}k={r:d,g:e,b:f,toString:bx},k.hex="#"+(16777216|f|e<<8|d<<16).toString(16).slice(1),a.is(h,"finite")&&(k.opacity=h);return k}return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:bx}},a),a.hsb=bv(function(b,c,d){return a.hsb2rgb(b,c,d).hex}),a.hsl=bv(function(b,c,d){return a.hsl2rgb(b,c,d).hex}),a.rgb=bv(function(a,b,c){return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),a.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b}));return c.hex},a.getColor.reset=function(){delete this.start},a.parsePathString=function(b){if(!b)return null;var c=bz(b);if(c.arr)return bJ(c.arr);var d={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},e=[];a.is(b,E)&&a.is(b[0],E)&&(e=bJ(b)),e.length||r(b).replace(Z,function(a,b,c){var f=[],g=b.toLowerCase();c.replace(_,function(a,b){b&&f.push(+b)}),g=="m"&&f.length>2&&(e.push([b][n](f.splice(0,2))),g="l",b=b=="m"?"l":"L");if(g=="r")e.push([b][n](f));else while(f.length>=d[g]){e.push([b][n](f.splice(0,d[g])));if(!d[g])break}}),e.toString=a._path2string,c.arr=bJ(e);return e},a.parseTransformString=bv(function(b){if(!b)return null;var c={r:3,s:4,t:2,m:6},d=[];a.is(b,E)&&a.is(b[0],E)&&(d=bJ(b)),d.length||r(b).replace($,function(a,b,c){var e=[],f=v.call(b);c.replace(_,function(a,b){b&&e.push(+b)}),d.push([b][n](e))}),d.toString=a._path2string;return d});var bz=function(a){var b=bz.ps=bz.ps||{};b[a]?b[a].sleep=100:b[a]={sleep:100},setTimeout(function(){for(var c in b)b[g](c)&&c!=a&&(b[c].sleep--,!b[c].sleep&&delete b[c])});return b[a]};a.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=A(j,3),l=A(j,2),m=i*i,n=m*i,o=k*a+l*3*i*c+j*3*i*i*e+n*g,p=k*b+l*3*i*d+j*3*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,x=j*e+i*g,y=j*f+i*h,z=90-w.atan2(q-s,r-t)*180/B;(q>s||r<t)&&(z+=180);return{x:o,y:p,m:{x:q,y:r},n:{x:s,y:t},start:{x:u,y:v},end:{x:x,y:y},alpha:z}},a.bezierBBox=function(b,c,d,e,f,g,h,i){a.is(b,"array")||(b=[b,c,d,e,f,g,h,i]);var j=bQ.apply(null,b);return{x:j.min.x,y:j.min.y,x2:j.max.x,y2:j.max.y,width:j.max.x-j.min.x,height:j.max.y-j.min.y}},a.isPointInsideBBox=function(a,b,c){return b>=a.x&&b<=a.x2&&c>=a.y&&c<=a.y2},a.isBBoxIntersect=function(b,c){var d=a.isPointInsideBBox;return d(c,b.x,b.y)||d(c,b.x2,b.y)||d(c,b.x,b.y2)||d(c,b.x2,b.y2)||d(b,c.x,c.y)||d(b,c.x2,c.y)||d(b,c.x,c.y2)||d(b,c.x2,c.y2)||(b.x<c.x2&&b.x>c.x||c.x<b.x2&&c.x>b.x)&&(b.y<c.y2&&b.y>c.y||c.y<b.y2&&c.y>b.y)},a.pathIntersection=function(a,b){return bH(a,b)},a.pathIntersectionNumber=function(a,b){return bH(a,b,1)},a.isPointInsidePath=function(b,c,d){var e=a.pathBBox(b);return a.isPointInsideBBox(e,c,d)&&bH(b,[["M",c,d],["H",e.x2+10]],1)%2==1},a._removedFactory=function(a){return function(){eve("raphael.log",null,"Raphaël: you are calling to method “"+a+"” of removed object",a)}};var bI=a.pathBBox=function(a){var b=bz(a);if(b.bbox)return b.bbox;if(!a)return{x:0,y:0,width:0,height:0,x2:0,y2:0};a=bR(a);var c=0,d=0,e=[],f=[],g;for(var h=0,i=a.length;h<i;h++){g=a[h];if(g[0]=="M")c=g[1],d=g[2],e.push(c),f.push(d);else{var j=bQ(c,d,g[1],g[2],g[3],g[4],g[5],g[6]);e=e[n](j.min.x,j.max.x),f=f[n](j.min.y,j.max.y),c=g[5],d=g[6]}}var k=y[m](0,e),l=y[m](0,f),o=x[m](0,e),p=x[m](0,f),q={x:k,y:l,x2:o,y2:p,width:o-k,height:p-l};b.bbox=bm(q);return q},bJ=function(b){var c=bm(b);c.toString=a._path2string;return c},bK=a._pathToRelative=function(b){var c=bz(b);if(c.rel)return bJ(c.rel);if(!a.is(b,E)||!a.is(b&&b[0],E))b=a.parsePathString(b);var d=[],e=0,f=0,g=0,h=0,i=0;b[0][0]=="M"&&(e=b[0][1],f=b[0][2],g=e,h=f,i++,d.push(["M",e,f]));for(var j=i,k=b.length;j<k;j++){var l=d[j]=[],m=b[j];if(m[0]!=v.call(m[0])){l[0]=v.call(m[0]);switch(l[0]){case"a":l[1]=m[1],l[2]=m[2],l[3]=m[3],l[4]=m[4],l[5]=m[5],l[6]=+(m[6]-e).toFixed(3),l[7]=+(m[7]-f).toFixed(3);break;case"v":l[1]=+(m[1]-f).toFixed(3);break;case"m":g=m[1],h=m[2];default:for(var n=1,o=m.length;n<o;n++)l[n]=+(m[n]-(n%2?e:f)).toFixed(3)}}else{l=d[j]=[],m[0]=="m"&&(g=m[1]+e,h=m[2]+f);for(var p=0,q=m.length;p<q;p++)d[j][p]=m[p]}var r=d[j].length;switch(d[j][0]){case"z":e=g,f=h;break;case"h":e+=+d[j][r-1];break;case"v":f+=+d[j][r-1];break;default:e+=+d[j][r-2],f+=+d[j][r-1]}}d.toString=a._path2string,c.rel=bJ(d);return d},bL=a._pathToAbsolute=function(b){var c=bz(b);if(c.abs)return bJ(c.abs);if(!a.is(b,E)||!a.is(b&&b[0],E))b=a.parsePathString(b);if(!b||!b.length)return[["M",0,0]];var d=[],e=0,f=0,g=0,h=0,i=0;b[0][0]=="M"&&(e=+b[0][1],f=+b[0][2],g=e,h=f,i++,d[0]=["M",e,f]);var j=b.length==3&&b[0][0]=="M"&&b[1][0].toUpperCase()=="R"&&b[2][0].toUpperCase()=="Z";for(var k,l,m=i,o=b.length;m<o;m++){d.push(k=[]),l=b[m];if(l[0]!=S.call(l[0])){k[0]=S.call(l[0]);switch(k[0]){case"A":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]+e),k[7]=+(l[7]+f);break;case"V":k[1]=+l[1]+f;break;case"H":k[1]=+l[1]+e;break;case"R":var p=[e,f][n](l.slice(1));for(var q=2,r=p.length;q<r;q++)p[q]=+p[q]+e,p[++q]=+p[q]+f;d.pop(),d=d[n](by(p,j));break;case"M":g=+l[1]+e,h=+l[2]+f;default:for(q=1,r=l.length;q<r;q++)k[q]=+l[q]+(q%2?e:f)}}else if(l[0]=="R")p=[e,f][n](l.slice(1)),d.pop(),d=d[n](by(p,j)),k=["R"][n](l.slice(-2));else for(var s=0,t=l.length;s<t;s++)k[s]=l[s];switch(k[0]){case"Z":e=g,f=h;break;case"H":e=k[1];break;case"V":f=k[1];break;case"M":g=k[k.length-2],h=k[k.length-1];default:e=k[k.length-2],f=k[k.length-1]}}d.toString=a._path2string,c.abs=bJ(d);return d},bM=function(a,b,c,d){return[a,b,c,d,c,d]},bN=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},bO=function(a,b,c,d,e,f,g,h,i,j){var k=B*120/180,l=B/180*(+e||0),m=[],o,p=bv(function(a,b,c){var d=a*w.cos(c)-b*w.sin(c),e=a*w.sin(c)+b*w.cos(c);return{x:d,y:e}});if(!j){o=p(a,b,-l),a=o.x,b=o.y,o=p(h,i,-l),h=o.x,i=o.y;var q=w.cos(B/180*e),r=w.sin(B/180*e),t=(a-h)/2,u=(b-i)/2,v=t*t/(c*c)+u*u/(d*d);v>1&&(v=w.sqrt(v),c=v*c,d=v*d);var x=c*c,y=d*d,A=(f==g?-1:1)*w.sqrt(z((x*y-x*u*u-y*t*t)/(x*u*u+y*t*t))),C=A*c*u/d+(a+h)/2,D=A*-d*t/c+(b+i)/2,E=w.asin(((b-D)/d).toFixed(9)),F=w.asin(((i-D)/d).toFixed(9));E=a<C?B-E:E,F=h<C?B-F:F,E<0&&(E=B*2+E),F<0&&(F=B*2+F),g&&E>F&&(E=E-B*2),!g&&F>E&&(F=F-B*2)}else E=j[0],F=j[1],C=j[2],D=j[3];var G=F-E;if(z(G)>k){var H=F,I=h,J=i;F=E+k*(g&&F>E?1:-1),h=C+c*w.cos(F),i=D+d*w.sin(F),m=bO(h,i,c,d,e,0,g,I,J,[F,H,C,D])}G=F-E;var K=w.cos(E),L=w.sin(E),M=w.cos(F),N=w.sin(F),O=w.tan(G/4),P=4/3*c*O,Q=4/3*d*O,R=[a,b],S=[a+P*L,b-Q*K],T=[h+P*N,i-Q*M],U=[h,i];S[0]=2*R[0]-S[0],S[1]=2*R[1]-S[1];if(j)return[S,T,U][n](m);m=[S,T,U][n](m).join()[s](",");var V=[];for(var W=0,X=m.length;W<X;W++)V[W]=W%2?p(m[W-1],m[W],l).y:p(m[W],m[W+1],l).x;return V},bP=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:A(j,3)*a+A(j,2)*3*i*c+j*3*i*i*e+A(i,3)*g,y:A(j,3)*b+A(j,2)*3*i*d+j*3*i*i*f+A(i,3)*h}},bQ=bv(function(a,b,c,d,e,f,g,h){var i=e-2*c+a-(g-2*e+c),j=2*(c-a)-2*(e-c),k=a-c,l=(-j+w.sqrt(j*j-4*i*k))/2/i,n=(-j-w.sqrt(j*j-4*i*k))/2/i,o=[b,h],p=[a,g],q;z(l)>"1e12"&&(l=.5),z(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bP(a,b,c,d,e,f,g,h,l),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bP(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y)),i=f-2*d+b-(h-2*f+d),j=2*(d-b)-2*(f-d),k=b-d,l=(-j+w.sqrt(j*j-4*i*k))/2/i,n=(-j-w.sqrt(j*j-4*i*k))/2/i,z(l)>"1e12"&&(l=.5),z(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bP(a,b,c,d,e,f,g,h,l),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bP(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y));return{min:{x:y[m](0,p),y:y[m](0,o)},max:{x:x[m](0,p),y:x[m](0,o)}}}),bR=a._path2curve=bv(function(a,b){var c=!b&&bz(a);if(!b&&c.curve)return bJ(c.curve);var d=bL(a),e=b&&bL(b),f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},h=function(a,b){var c,d;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null);switch(a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][n](bO[m](0,[b.x,b.y][n](a.slice(1))));break;case"S":c=b.x+(b.x-(b.bx||b.x)),d=b.y+(b.y-(b.by||b.y)),a=["C",c,d][n](a.slice(1));break;case"T":b.qx=b.x+(b.x-(b.qx||b.x)),b.qy=b.y+(b.y-(b.qy||b.y)),a=["C"][n](bN(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][n](bN(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][n](bM(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][n](bM(b.x,b.y,a[1],b.y));break;case"V":a=["C"][n](bM(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][n](bM(b.x,b.y,b.X,b.Y))}return a},i=function(a,b){if(a[b].length>7){a[b].shift();var c=a[b];while(c.length)a.splice(b++,0,["C"][n](c.splice(0,6)));a.splice(b,1),l=x(d.length,e&&e.length||0)}},j=function(a,b,c,f,g){a&&b&&a[g][0]=="M"&&b[g][0]!="M"&&(b.splice(g,0,["M",f.x,f.y]),c.bx=0,c.by=0,c.x=a[g][1],c.y=a[g][2],l=x(d.length,e&&e.length||0))};for(var k=0,l=x(d.length,e&&e.length||0);k<l;k++){d[k]=h(d[k],f),i(d,k),e&&(e[k]=h(e[k],g)),e&&i(e,k),j(d,e,f,g,k),j(e,d,g,f,k);var o=d[k],p=e&&e[k],q=o.length,r=e&&p.length;f.x=o[q-2],f.y=o[q-1],f.bx=Q(o[q-4])||f.x,f.by=Q(o[q-3])||f.y,g.bx=e&&(Q(p[r-4])||g.x),g.by=e&&(Q(p[r-3])||g.y),g.x=e&&p[r-2],g.y=e&&p[r-1]}e||(c.curve=bJ(d));return e?[d,e]:d},null,bJ),bS=a._parseDots=bv(function(b){var c=[];for(var d=0,e=b.length;d<e;d++){var f={},g=b[d].match(/^([^:]*):?([\d\.]*)/);f.color=a.getRGB(g[1]);if(f.color.error)return null;f.color=f.color.hex,g[2]&&(f.offset=g[2]+"%"),c.push(f)}for(d=1,e=c.length-1;d<e;d++)if(!c[d].offset){var h=Q(c[d-1].offset||0),i=0;for(var j=d+1;j<e;j++)if(c[j].offset){i=c[j].offset;break}i||(i=100,j=e),i=Q(i);var k=(i-h)/(j-d+1);for(;d<j;d++)h+=k,c[d].offset=h+"%"}return c}),bT=a._tear=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)},bU=a._tofront=function(a,b){b.top!==a&&(bT(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},bV=a._toback=function(a,b){b.bottom!==a&&(bT(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},bW=a._insertafter=function(a,b,c){bT(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},bX=a._insertbefore=function(a,b,c){bT(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},bY=a.toMatrix=function(a,b){var c=bI(a),d={_:{transform:p},getBBox:function(){return c}};b$(d,b);return d.matrix},bZ=a.transformPath=function(a,b){return bj(a,bY(a,b))},b$=a._extractTransform=function(b,c){if(c==null)return b._.transform;c=r(c).replace(/\.{3}|\u2026/g,b._.transform||p);var d=a.parseTransformString(c),e=0,f=0,g=0,h=1,i=1,j=b._,k=new cb;j.transform=d||[];if(d)for(var l=0,m=d.length;l<m;l++){var n=d[l],o=n.length,q=r(n[0]).toLowerCase(),s=n[0]!=q,t=s?k.invert():0,u,v,w,x,y;q=="t"&&o==3?s?(u=t.x(0,0),v=t.y(0,0),w=t.x(n[1],n[2]),x=t.y(n[1],n[2]),k.translate(w-u,x-v)):k.translate(n[1],n[2]):q=="r"?o==2?(y=y||b.getBBox(1),k.rotate(n[1],y.x+y.width/2,y.y+y.height/2),e+=n[1]):o==4&&(s?(w=t.x(n[2],n[3]),x=t.y(n[2],n[3]),k.rotate(n[1],w,x)):k.rotate(n[1],n[2],n[3]),e+=n[1]):q=="s"?o==2||o==3?(y=y||b.getBBox(1),k.scale(n[1],n[o-1],y.x+y.width/2,y.y+y.height/2),h*=n[1],i*=n[o-1]):o==5&&(s?(w=t.x(n[3],n[4]),x=t.y(n[3],n[4]),k.scale(n[1],n[2],w,x)):k.scale(n[1],n[2],n[3],n[4]),h*=n[1],i*=n[2]):q=="m"&&o==7&&k.add(n[1],n[2],n[3],n[4],n[5],n[6]),j.dirtyT=1,b.matrix=k}b.matrix=k,j.sx=h,j.sy=i,j.deg=e,j.dx=f=k.e,j.dy=g=k.f,h==1&&i==1&&!e&&j.bbox?(j.bbox.x+=+f,j.bbox.y+=+g):j.dirtyT=1},b_=function(a){var b=a[0];switch(b.toLowerCase()){case"t":return[b,0,0];case"m":return[b,1,0,0,1,0,0];case"r":return a.length==4?[b,0,a[2],a[3]]:[b,0];case"s":return a.length==5?[b,1,1,a[3],a[4]]:a.length==3?[b,1,1]:[b,1]}},ca=a._equaliseTransform=function(b,c){c=r(c).replace(/\.{3}|\u2026/g,b),b=a.parseTransformString(b)||[],c=a.parseTransformString(c)||[];var d=x(b.length,c.length),e=[],f=[],g=0,h,i,j,k;for(;g<d;g++){j=b[g]||b_(c[g]),k=c[g]||b_(j);if(j[0]!=k[0]||j[0].toLowerCase()=="r"&&(j[2]!=k[2]||j[3]!=k[3])||j[0].toLowerCase()=="s"&&(j[3]!=k[3]||j[4]!=k[4]))return;e[g]=[],f[g]=[];for(h=0,i=x(j.length,k.length);h<i;h++)h in j&&(e[g][h]=j[h]),h in k&&(f[g][h]=k[h])}return{from:e,to:f}};a._getContainer=function(b,c,d,e){var f;f=e==null&&!a.is(b,"object")?h.doc.getElementById(b):b;if(f!=null){if(f.tagName)return c==null?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:c,height:d};return{container:1,x:b,y:c,width:d,height:e}}},a.pathToRelative=bK,a._engine={},a.path2curve=bR,a.matrix=function(a,b,c,d,e,f){return new cb(a,b,c,d,e,f)},function(b){function d(a){var b=w.sqrt(c(a));a[0]&&(a[0]/=b),a[1]&&(a[1]/=b)}function c(a){return a[0]*a[0]+a[1]*a[1]}b.add=function(a,b,c,d,e,f){var g=[[],[],[]],h=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],i=[[a,c,e],[b,d,f],[0,0,1]],j,k,l,m;a&&a instanceof cb&&(i=[[a.a,a.c,a.e],[a.b,a.d,a.f],[0,0,1]]);for(j=0;j<3;j++)for(k=0;k<3;k++){m=0;for(l=0;l<3;l++)m+=h[j][l]*i[l][k];g[j][k]=m}this.a=g[0][0],this.b=g[1][0],this.c=g[0][1],this.d=g[1][1],this.e=g[0][2],this.f=g[1][2]},b.invert=function(){var a=this,b=a.a*a.d-a.b*a.c;return new cb(a.d/b,-a.b/b,-a.c/b,a.a/b,(a.c*a.f-a.d*a.e)/b,(a.b*a.e-a.a*a.f)/b)},b.clone=function(){return new cb(this.a,this.b,this.c,this.d,this.e,this.f)},b.translate=function(a,b){this.add(1,0,0,1,a,b)},b.scale=function(a,b,c,d){b==null&&(b=a),(c||d)&&this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),(c||d)&&this.add(1,0,0,1,-c,-d)},b.rotate=function(b,c,d){b=a.rad(b),c=c||0,d=d||0;var e=+w.cos(b).toFixed(9),f=+w.sin(b).toFixed(9);this.add(e,f,-f,e,c,d),this.add(1,0,0,1,-c,-d)},b.x=function(a,b){return a*this.a+b*this.c+this.e},b.y=function(a,b){return a*this.b+b*this.d+this.f},b.get=function(a){return+this[r.fromCharCode(97+a)].toFixed(4)},b.toString=function(){return a.svg?"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},b.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0)+", M12="+this.get(2)+", M21="+this.get(1)+", M22="+this.get(3)+", Dx="+this.get(4)+", Dy="+this.get(5)+", sizingmethod='auto expand')"},b.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},b.split=function(){var b={};b.dx=this.e,b.dy=this.f;var e=[[this.a,this.c],[this.b,this.d]];b.scalex=w.sqrt(c(e[0])),d(e[0]),b.shear=e[0][0]*e[1][0]+e[0][1]*e[1][1],e[1]=[e[1][0]-e[0][0]*b.shear,e[1][1]-e[0][1]*b.shear],b.scaley=w.sqrt(c(e[1])),d(e[1]),b.shear/=b.scaley;var f=-e[0][1],g=e[1][1];g<0?(b.rotate=a.deg(w.acos(g)),f<0&&(b.rotate=360-b.rotate)):b.rotate=a.deg(w.asin(f)),b.isSimple=!+b.shear.toFixed(9)&&(b.scalex.toFixed(9)==b.scaley.toFixed(9)||!b.rotate),b.isSuperSimple=!+b.shear.toFixed(9)&&b.scalex.toFixed(9)==b.scaley.toFixed(9)&&!b.rotate,b.noRotation=!+b.shear.toFixed(9)&&!b.rotate;return b},b.toTransformString=function(a){var b=a||this[s]();if(b.isSimple){b.scalex=+b.scalex.toFixed(4),b.scaley=+b.scaley.toFixed(4),b.rotate=+b.rotate.toFixed(4);return(b.dx||b.dy?"t"+[b.dx,b.dy]:p)+(b.scalex!=1||b.scaley!=1?"s"+[b.scalex,b.scaley,0,0]:p)+(b.rotate?"r"+[b.rotate,0,0]:p)}return"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(cb.prototype);var cc=navigator.userAgent.match(/Version\/(.*?)\s/)||navigator.userAgent.match(/Chrome\/(\d+)/);navigator.vendor=="Apple Computer, Inc."&&(cc&&cc[1]<4||navigator.platform.slice(0,2)=="iP")||navigator.vendor=="Google Inc."&&cc&&cc[1]<8?k.safari=function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});setTimeout(function(){a.remove()})}:k.safari=be;var cd=function(){this.returnValue=!1},ce=function(){return this.originalEvent.preventDefault()},cf=function(){this.cancelBubble=!0},cg=function(){return this.originalEvent.stopPropagation()},ch=function(){if(h.doc.addEventListener)return function(a,b,c,d){var e=o&&u[b]?u[b]:b,f=function(e){var f=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,i=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft,j=e.clientX+i,k=e.clientY+f;if(o&&u[g](b))for(var l=0,m=e.targetTouches&&e.targetTouches.length;l<m;l++)if(e.targetTouches[l].target==a){var n=e;e=e.targetTouches[l],e.originalEvent=n,e.preventDefault=ce,e.stopPropagation=cg;break}return c.call(d,e,j,k)};a.addEventListener(e,f,!1);return function(){a.removeEventListener(e,f,!1);return!0}};if(h.doc.attachEvent)return function(a,b,c,d){var e=function(a){a=a||h.win.event;var b=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,e=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft,f=a.clientX+e,g=a.clientY+b;a.preventDefault=a.preventDefault||cd,a.stopPropagation=a.stopPropagation||cf;return c.call(d,a,f,g)};a.attachEvent("on"+b,e);var f=function(){a.detachEvent("on"+b,e);return!0};return f}}(),ci=[],cj=function(a){var b=a.clientX,c=a.clientY,d=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,e=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft,f,g=ci.length;while(g--){f=ci[g];if(o){var i=a.touches.length,j;while(i--){j=a.touches[i];if(j.identifier==f.el._drag.id){b=j.clientX,c=j.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}}else a.preventDefault();var k=f.el.node,l,m=k.nextSibling,n=k.parentNode,p=k.style.display;h.win.opera&&n.removeChild(k),k.style.display="none",l=f.el.paper.getElementByPoint(b,c),k.style.display=p,h.win.opera&&(m?n.insertBefore(k,m):n.appendChild(k)),l&&eve("raphael.drag.over."+f.el.id,f.el,l),b+=e,c+=d,eve("raphael.drag.move."+f.el.id,f.move_scope||f.el,b-f.el._drag.x,c-f.el._drag.y,b,c,a)}},ck=function(b){a.unmousemove(cj).unmouseup(ck);var c=ci.length,d;while(c--)d=ci[c],d.el._drag={},eve("raphael.drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,b);ci=[]},cl=a.el={};for(var cm=t.length;cm--;)(function(b){a[b]=cl[b]=function(c,d){a.is(c,"function")&&(this.events=this.events||[],this.events.push({name:b,f:c,unbind:ch(this.shape||this.node||h.doc,b,c,d||this)}));return this},a["un"+b]=cl["un"+b]=function(a){var c=this.events||[],d=c.length;while(d--)if(c[d].name==b&&c[d].f==a){c[d].unbind(),c.splice(d,1),!c.length&&delete this.events;return this}return this}})(t[cm]);cl.data=function(b,c){var d=bb[this.id]=bb[this.id]||{};if(arguments.length==1){if(a.is(b,"object")){for(var e in b)b[g](e)&&this.data(e,b[e]);return this}eve("raphael.data.get."+this.id,this,d[b],b);return d[b]}d[b]=c,eve("raphael.data.set."+this.id,this,c,b);return this},cl.removeData=function(a){a==null?bb[this.id]={}:bb[this.id]&&delete bb[this.id][a];return this},cl.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},cl.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var cn=[];cl.drag=function(b,c,d,e,f,g){function i(i){(i.originalEvent||i).preventDefault();var j=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,k=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft;this._drag.x=i.clientX+k,this._drag.y=i.clientY+j,this._drag.id=i.identifier,!ci.length&&a.mousemove(cj).mouseup(ck),ci.push({el:this,move_scope:e,start_scope:f,end_scope:g}),c&&eve.on("raphael.drag.start."+this.id,c),b&&eve.on("raphael.drag.move."+this.id,b),d&&eve.on("raphael.drag.end."+this.id,d),eve("raphael.drag.start."+this.id,f||e||this,i.clientX+k,i.clientY+j,i)}this._drag={},cn.push({el:this,start:i}),this.mousedown(i);return this},cl.onDragOver=function(a){a?eve.on("raphael.drag.over."+this.id,a):eve.unbind("raphael.drag.over."+this.id)},cl.undrag=function(){var b=cn.length;while(b--)cn[b].el==this&&(this.unmousedown(cn[b].start),cn.splice(b,1),eve.unbind("raphael.drag.*."+this.id));!cn.length&&a.unmousemove(cj).unmouseup(ck)},k.circle=function(b,c,d){var e=a._engine.circle(this,b||0,c||0,d||0);this.__set__&&this.__set__.push(e);return e},k.rect=function(b,c,d,e,f){var g=a._engine.rect(this,b||0,c||0,d||0,e||0,f||0);this.__set__&&this.__set__.push(g);return g},k.ellipse=function(b,c,d,e){var f=a._engine.ellipse(this,b||0,c||0,d||0,e||0);this.__set__&&this.__set__.push(f);return f},k.path=function(b){b&&!a.is(b,D)&&!a.is(b[0],E)&&(b+=p);var c=a._engine.path(a.format[m](a,arguments),this);this.__set__&&this.__set__.push(c);return c},k.image=function(b,c,d,e,f){var g=a._engine.image(this,b||"about:blank",c||0,d||0,e||0,f||0);this.__set__&&this.__set__.push(g);return g},k.text=function(b,c,d){var e=a._engine.text(this,b||0,c||0,r(d));this.__set__&&this.__set__.push(e);return e},k.set=function(b){!a.is(b,"array")&&(b=Array.prototype.splice.call(arguments,0,arguments.length));var c=new cG(b);this.__set__&&this.__set__.push(c);return c},k.setStart=function(a){this.__set__=a||this.set()},k.setFinish=function(a){var b=this.__set__;delete this.__set__;return b},k.setSize=function(b,c){return a._engine.setSize.call(this,b,c)},k.setViewBox=function(b,c,d,e,f){return a._engine.setViewBox.call(this,b,c,d,e,f)},k.top=k.bottom=null,k.raphael=a;var co=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,g=e.clientLeft||d.clientLeft||0,i=b.top+(h.win.pageYOffset||e.scrollTop||d.scrollTop)-f,j=b.left+(h.win.pageXOffset||e.scrollLeft||d.scrollLeft)-g;return{y:i,x:j}};k.getElementByPoint=function(a,b){var c=this,d=c.canvas,e=h.doc.elementFromPoint(a,b);if(h.win.opera&&e.tagName=="svg"){var f=co(d),g=d.createSVGRect();g.x=a-f.x,g.y=b-f.y,g.width=g.height=1;var i=d.getIntersectionList(g,null);i.length&&(e=i[i.length-1])}if(!e)return null;while(e.parentNode&&e!=d.parentNode&&!e.raphael)e=e.parentNode;e==c.canvas.parentNode&&(e=d),e=e&&e.raphael?c.getById(e.raphaelid):null;return e},k.getById=function(a){var b=this.bottom;while(b){if(b.id==a)return b;b=b.next}return null},k.forEach=function(a,b){var c=this.bottom;while(c){if(a.call(b,c)===!1)return this;c=c.next}return this},k.getElementsByPoint=function(a,b){var c=this.set();this.forEach(function(d){d.isPointInside(a,b)&&c.push(d)});return c},cl.isPointInside=function(b,c){var d=this.realPath=this.realPath||bi[this.type](this);return a.isPointInsidePath(d,b,c)},cl.getBBox=function(a){if(this.removed)return{};var b=this._;if(a){if(b.dirty||!b.bboxwt)this.realPath=bi[this.type](this),b.bboxwt=bI(this.realPath),b.bboxwt.toString=cq,b.dirty=0;return b.bboxwt}if(b.dirty||b.dirtyT||!b.bbox){if(b.dirty||!this.realPath)b.bboxwt=0,this.realPath=bi[this.type](this);b.bbox=bI(bj(this.realPath,this.matrix)),b.bbox.toString=cq,b.dirty=b.dirtyT=0}return b.bbox},cl.clone=function(){if(this.removed)return null;var a=this.paper[this.type]().attr(this.attr());this.__set__&&this.__set__.push(a);return a},cl.glow=function(a){if(this.type=="text")return null;a=a||{};var b={width:(a.width||10)+(+this.attr("stroke-width")||1),fill:a.fill||!1,opacity:a.opacity||.5,offsetx:a.offsetx||0,offsety:a.offsety||0,color:a.color||"#000"},c=b.width/2,d=this.paper,e=d.set(),f=this.realPath||bi[this.type](this);f=this.matrix?bj(f,this.matrix):f;for(var g=1;g<c+1;g++)e.push(d.path(f).attr({stroke:b.color,fill:b.fill?b.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(b.width/c*g).toFixed(3),opacity:+(b.opacity/c).toFixed(3)}));return e.insertBefore(this).translate(b.offsetx,b.offsety)};var cr={},cs=function(b,c,d,e,f,g,h,i,j){return j==null?bB(b,c,d,e,f,g,h,i):a.findDotsAtSegment(b,c,d,e,f,g,h,i,bC(b,c,d,e,f,g,h,i,j))},ct=function(b,c){return function(d,e,f){d=bR(d);var g,h,i,j,k="",l={},m,n=0;for(var o=0,p=d.length;o<p;o++){i=d[o];if(i[0]=="M")g=+i[1],h=+i[2];else{j=cs(g,h,i[1],i[2],i[3],i[4],i[5],i[6]);if(n+j>e){if(c&&!l.start){m=cs(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),k+=["C"+m.start.x,m.start.y,m.m.x,m.m.y,m.x,m.y];if(f)return k;l.start=k,k=["M"+m.x,m.y+"C"+m.n.x,m.n.y,m.end.x,m.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!b&&!c){m=cs(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);return{x:m.x,y:m.y,alpha:m.alpha}}}n+=j,g=+i[5],h=+i[6]}k+=i.shift()+i}l.end=k,m=b?n:c?l:a.findDotsAtSegment(g,h,i[0],i[1],i[2],i[3],i[4],i[5],1),m.alpha&&(m={x:m.x,y:m.y,alpha:m.alpha});return m}},cu=ct(1),cv=ct(),cw=ct(0,1);a.getTotalLength=cu,a.getPointAtLength=cv,a.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return cw(a,b).end;var d=cw(a,c,1);return b?cw(d,b).end:d},cl.getTotalLength=function(){if(this.type=="path"){if(this.node.getTotalLength)return this.node.getTotalLength();return cu(this.attrs.path)}},cl.getPointAtLength=function(a){if(this.type=="path")return cv(this.attrs.path,a)},cl.getSubpath=function(b,c){if(this.type=="path")return a.getSubpath(this.attrs.path,b,c)};var cx=a.easing_formulas={linear:function(a){return a},"<":function(a){return A(a,1.7)},">":function(a){return A(a,.48)},"<>":function(a){var b=.48-a/1.04,c=w.sqrt(.1734+b*b),d=c-b,e=A(z(d),1/3)*(d<0?-1:1),f=-c-b,g=A(z(f),1/3)*(f<0?-1:1),h=e+g+.5;return(1-h)*3*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a=a-1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){if(a==!!a)return a;return A(2,-10*a)*w.sin((a-.075)*2*B/.3)+1},bounce:function(a){var b=7.5625,c=2.75,d;a<1/c?d=b*a*a:a<2/c?(a-=1.5/c,d=b*a*a+.75):a<2.5/c?(a-=2.25/c,d=b*a*a+.9375):(a-=2.625/c,d=b*a*a+.984375);return d}};cx.easeIn=cx["ease-in"]=cx["<"],cx.easeOut=cx["ease-out"]=cx[">"],cx.easeInOut=cx["ease-in-out"]=cx["<>"],cx["back-in"]=cx.backIn,cx["back-out"]=cx.backOut;var cy=[],cz=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){setTimeout(a,16)},cA=function(){var b=+(new Date),c=0;for(;c<cy.length;c++){var d=cy[c];if(d.el.removed||d.paused)continue;var e=b-d.start,f=d.ms,h=d.easing,i=d.from,j=d.diff,k=d.to,l=d.t,m=d.el,o={},p,r={},s;d.initstatus?(e=(d.initstatus*d.anim.top-d.prev)/(d.percent-d.prev)*f,d.status=d.initstatus,delete d.initstatus,d.stop&&cy.splice(c--,1)):d.status=(d.prev+(d.percent-d.prev)*(e/f))/d.anim.top;if(e<0)continue;if(e<f){var t=h(e/f);for(var u in i)if(i[g](u)){switch(U[u]){case C:p=+i[u]+t*f*j[u];break;case"colour":p="rgb("+[cB(O(i[u].r+t*f*j[u].r)),cB(O(i[u].g+t*f*j[u].g)),cB(O(i[u].b+t*f*j[u].b))].join(",")+")";break;case"path":p=[];for(var v=0,w=i[u].length;v<w;v++){p[v]=[i[u][v][0]];for(var x=1,y=i[u][v].length;x<y;x++)p[v][x]=+i[u][v][x]+t*f*j[u][v][x];p[v]=p[v].join(q)}p=p.join(q);break;case"transform":if(j[u].real){p=[];for(v=0,w=i[u].length;v<w;v++){p[v]=[i[u][v][0]];for(x=1,y=i[u][v].length;x<y;x++)p[v][x]=i[u][v][x]+t*f*j[u][v][x]}}else{var z=function(a){return+i[u][a]+t*f*j[u][a]};p=[["m",z(0),z(1),z(2),z(3),z(4),z(5)]]}break;case"csv":if(u=="clip-rect"){p=[],v=4;while(v--)p[v]=+i[u][v]+t*f*j[u][v]}break;default:var A=[][n](i[u]);p=[],v=m.paper.customAttributes[u].length;while(v--)p[v]=+A[v]+t*f*j[u][v]}o[u]=p}m.attr(o),function(a,b,c){setTimeout(function(){eve("raphael.anim.frame."+a,b,c)})}(m.id,m,d.anim)}else{(function(b,c,d){setTimeout(function(){eve("raphael.anim.frame."+c.id,c,d),eve("raphael.anim.finish."+c.id,c,d),a.is(b,"function")&&b.call(c)})})(d.callback,m,d.anim),m.attr(k),cy.splice(c--,1);if(d.repeat>1&&!d.next){for(s in k)k[g](s)&&(r[s]=d.totalOrigin[s]);d.el.attr(r),cE(d.anim,d.el,d.anim.percents[0],null,d.totalOrigin,d.repeat-1)}d.next&&!d.stop&&cE(d.anim,d.el,d.next,null,d.totalOrigin,d.repeat)}}a.svg&&m&&m.paper&&m.paper.safari(),cy.length&&cz(cA)},cB=function(a){return a>255?255:a<0?0:a};cl.animateWith=function(b,c,d,e,f,g){var h=this;if(h.removed){g&&g.call(h);return h}var i=d instanceof cD?d:a.animation(d,e,f,g),j,k;cE(i,h,i.percents[0],null,h.attr());for(var l=0,m=cy.length;l<m;l++)if(cy[l].anim==c&&cy[l].el==b){cy[m-1].start=cy[l].start;break}return h},cl.onAnimation=function(a){a?eve.on("raphael.anim.frame."+this.id,a):eve.unbind("raphael.anim.frame."+this.id);return this},cD.prototype.delay=function(a){var b=new cD(this.anim,this.ms);b.times=this.times,b.del=+a||0;return b},cD.prototype.repeat=function(a){var b=new cD(this.anim,this.ms);b.del=this.del,b.times=w.floor(x(a,0))||1;return b},a.animation=function(b,c,d,e){if(b instanceof cD)return b;if(a.is(d,"function")||!d)e=e||d||null,d=null;b=Object(b),c=+c||0;var f={},h,i;for(i in b)b[g](i)&&Q(i)!=i&&Q(i)+"%"!=i&&(h=!0,f[i]=b[i]);if(!h)return new cD(b,c);d&&(f.easing=d),e&&(f.callback=e);return new cD({100:f},c)},cl.animate=function(b,c,d,e){var f=this;if(f.removed){e&&e.call(f);return f}var g=b instanceof cD?b:a.animation(b,c,d,e);cE(g,f,g.percents[0],null,f.attr());return f},cl.setTime=function(a,b){a&&b!=null&&this.status(a,y(b,a.ms)/a.ms);return this},cl.status=function(a,b){var c=[],d=0,e,f;if(b!=null){cE(a,this,-1,y(b,1));return this}e=cy.length;for(;d<e;d++){f=cy[d];if(f.el.id==this.id&&(!a||f.anim==a)){if(a)return f.status;c.push({anim:f.anim,status:f.status})}}if(a)return 0;return c},cl.pause=function(a){for(var b=0;b<cy.length;b++)cy[b].el.id==this.id&&(!a||cy[b].anim==a)&&eve("raphael.anim.pause."+this.id,this,cy[b].anim)!==!1&&(cy[b].paused=!0);return this},cl.resume=function(a){for(var b=0;b<cy.length;b++)if(cy[b].el.id==this.id&&(!a||cy[b].anim==a)){var c=cy[b];eve("raphael.anim.resume."+this.id,this,c.anim)!==!1&&(delete c.paused,this.status(c.anim,c.status))}return this},cl.stop=function(a){for(var b=0;b<cy.length;b++)cy[b].el.id==this.id&&(!a||cy[b].anim==a)&&eve("raphael.anim.stop."+this.id,this,cy[b].anim)!==!1&&cy.splice(b--,1);return this},eve.on("raphael.remove",cF),eve.on("raphael.clear",cF),cl.toString=function(){return"Raphaël’s object"};var cG=function(a){this.items=[],this.length=0,this.type="set";if(a)for(var b=0,c=a.length;b<c;b++)a[b]&&(a[b].constructor==cl.constructor||a[b].constructor==cG)&&(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},cH=cG.prototype;cH.push=function(){var a,b;for(var c=0,d=arguments.length;c<d;c++)a=arguments[c],a&&(a.constructor==cl.constructor||a.constructor==cG)&&(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},cH.pop=function(){this.length&&delete this[this.length--];return this.items.pop()},cH.forEach=function(a,b){for(var c=0,d=this.items.length;c<d;c++)if(a.call(b,this.items[c],c)===!1)return this;return this};for(var cI in cl)cl[g](cI)&&(cH[cI]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a][m](c,b)})}}(cI));cH.attr=function(b,c){if(b&&a.is(b,E)&&a.is(b[0],"object"))for(var d=0,e=b.length;d<e;d++)this.items[d].attr(b[d]);else for(var f=0,g=this.items.length;f<g;f++)this.items[f].attr(b,c);return this},cH.clear=function(){while(this.length)this.pop()},cH.splice=function(a,b,c){a=a<0?x(this.length+a,0):a,b=x(0,y(this.length-a,b));var d=[],e=[],f=[],g;for(g=2;g<arguments.length;g++)f.push(arguments[g]);for(g=0;g<b;g++)e.push(this[a+g]);for(;g<this.length-a;g++)d.push(this[a+g]);var h=f.length;for(g=0;g<h+d.length;g++)this.items[a+g]=this[a+g]=g<h?f[g]:d[g-h];g=this.items.length=this.length-=b-h;while(this[g])delete this[g++];return new cG(e)},cH.exclude=function(a){for(var b=0,c=this.length;b<c;b++)if(this[b]==a){this.splice(b,1);return!0}},cH.animate=function(b,c,d,e){(a.is(d,"function")||!d)&&(e=d||null);var f=this.items.length,g=f,h,i=this,j;if(!f)return this;e&&(j=function(){!--f&&e.call(i)}),d=a.is(d,D)?d:j;var k=a.animation(b,c,d,j);h=this.items[--g].animate(k);while(g--)this.items[g]&&!this.items[g].removed&&this.items[g].animateWith(h,k,k);return this},cH.insertAfter=function(a){var b=this.items.length;while(b--)this.items[b].insertAfter(a);return this},cH.getBBox=function(){var a=[],b=[],c=[],d=[];for(var e=this.items.length;e--;)if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)}a=y[m](0,a),b=y[m](0,b),c=x[m](0,c),d=x[m](0,d);return{x:a,y:b,x2:c,y2:d,width:c-a,height:d-b}},cH.clone=function(a){a=new cG;for(var b=0,c=this.items.length;b<c;b++)a.push(this.items[b].clone());return a},cH.toString=function(){return"Raphaël‘s set"},a.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[g](d)&&(b.face[d]=a.face[d]);this.fonts[c]?this.fonts[c].push(b):this.fonts[c]=[b];if(!a.svg){b.face["units-per-em"]=R(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[g](e)){var f=a.glyphs[e];b.glyphs[e]={w:f.w,k:{},d:f.d&&"M"+f.d.replace(/[mlcxtrv]/g,function(a){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[a]||"M"})+"z"};if(f.k)for(var h in f.k)f[g](h)&&(b.glyphs[e].k[h]=f.k[h])}}return a},k.getFont=function(b,c,d,e){e=e||"normal",d=d||"normal",c=+c||{normal:400,bold:700,lighter:300,bolder:800}[c]||400;if(!!a.fonts){var f=a.fonts[b];if(!f){var h=new RegExp("(^|\\s)"+b.replace(/[^\w\d\s+!~.:_-]/g,p)+"(\\s|$)","i");for(var i in a.fonts)if(a.fonts[g](i)&&h.test(i)){f=a.fonts[i];break}}var j;if(f)for(var k=0,l=f.length;k<l;k++){j=f[k];if(j.face["font-weight"]==c&&(j.face["font-style"]==d||!j.face["font-style"])&&j.face["font-stretch"]==e)break}return j}},k.print=function(b,d,e,f,g,h,i){h=h||"middle",i=x(y(i||0,1),-1);var j=r(e)[s](p),k=0,l=0,m=p,n;a.is(f,e)&&(f=this.getFont(f));if(f){n=(g||16)/f.face["units-per-em"];var o=f.face.bbox[s](c),q=+o[0],t=o[3]-o[1],u=0,v=+o[1]+(h=="baseline"?t+ +f.face.descent:t/2);for(var w=0,z=j.length;w<z;w++){if(j[w]=="\n")k=0,B=0,l=0,u+=t;else{var A=l&&f.glyphs[j[w-1]]||{},B=f.glyphs[j[w]];k+=l?(A.w||f.w)+(A.k&&A.k[j[w]]||0)+f.w*i:0,l=1}B&&B.d&&(m+=a.transformPath(B.d,["t",k*n,u*n,"s",n,n,q,v,"t",(b-q)/n,(d-v)/n]))}}return this.path(m).attr({fill:"#000",stroke:"none"})},k.add=function(b){if(a.is(b,"array")){var c=this.set(),e=0,f=b.length,h;for(;e<f;e++)h=b[e]||{},d[g](h.type)&&c.push(this[h.type]().attr(h))}return c},a.format=function(b,c){var d=a.is(c,E)?[0][n](c):arguments;b&&a.is(b,D)&&d.length-1&&(b=b.replace(e,function(a,b){return d[++b]==null?p:d[b]}));return b||p},a.fullfill=function(){var a=/\{([^\}]+)\}/g,b=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,c=function(a,c,d){var e=d;c.replace(b,function(a,b,c,d,f){b=b||d,e&&(b in e&&(e=e[b]),typeof e=="function"&&f&&(e=e()))}),e=(e==null||e==d?a:e)+"";return e};return function(b,d){return String(b).replace(a,function(a,b){return c(a,b,d)})}}(),a.ninja=function(){i.was?h.win.Raphael=i.is:delete Raphael;return a},a.st=cH,function(b,c,d){function e(){/in/.test(b.readyState)?setTimeout(e,9):a.eve("raphael.DOMload")}b.readyState==null&&b.addEventListener&&(b.addEventListener(c,d=function(){b.removeEventListener(c,d,!1),b.readyState="complete"},!1),b.readyState="loading"),e()}(document,"DOMContentLoaded"),i.was?h.win.Raphael=a:Raphael=a,eve.on("raphael.DOMload",function(){b=!0})}(),window.Raphael.svg&&function(a){var b="hasOwnProperty",c=String,d=parseFloat,e=parseInt,f=Math,g=f.max,h=f.abs,i=f.pow,j=/[, ]+/,k=a.eve,l="",m=" ",n="http://www.w3.org/1999/xlink",o={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},p={};a.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var q=function(d,e){if(e){typeof d=="string"&&(d=q(d));for(var f in e)e[b](f)&&(f.substring(0,6)=="xlink:"?d.setAttributeNS(n,f.substring(6),c(e[f])):d.setAttribute(f,c(e[f])))}else d=a._g.doc.createElementNS("http://www.w3.org/2000/svg",d),d.style&&(d.style.webkitTapHighlightColor="rgba(0,0,0,0)");return d},r=function(b,e){var j="linear",k=b.id+e,m=.5,n=.5,o=b.node,p=b.paper,r=o.style,s=a._g.doc.getElementById(k);if(!s){e=c(e).replace(a._radial_gradient,function(a,b,c){j="radial";if(b&&c){m=d(b),n=d(c);var e=(n>.5)*2-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&n!=.5&&(n=n.toFixed(5)-1e-5*e)}return l}),e=e.split(/\s*\-\s*/);if(j=="linear"){var t=e.shift();t=-d(t);if(isNaN(t))return null;var u=[0,0,f.cos(a.rad(t)),f.sin(a.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)}var w=a._parseDots(e);if(!w)return null;k=k.replace(/[\(\)\s,\xb0#]/g,"_"),b.gradient&&k!=b.gradient.id&&(p.defs.removeChild(b.gradient),delete b.gradient);if(!b.gradient){s=q(j+"Gradient",{id:k}),b.gradient=s,q(s,j=="radial"?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:b.matrix.invert()}),p.defs.appendChild(s);for(var x=0,y=w.length;x<y;x++)s.appendChild(q("stop",{offset:w[x].offset?w[x].offset:x?"100%":"0%","stop-color":w[x].color||"#fff"}))}}q(o,{fill:"url(#"+k+")",opacity:1,"fill-opacity":1}),r.fill=l,r.opacity=1,r.fillOpacity=1;return 1},s=function(a){var b=a.getBBox(1);q(a.pattern,{patternTransform:a.matrix.invert()+" translate("+b.x+","+b.y+")"})},t=function(d,e,f){if(d.type=="path"){var g=c(e).toLowerCase().split("-"),h=d.paper,i=f?"end":"start",j=d.node,k=d.attrs,m=k["stroke-width"],n=g.length,r="classic",s,t,u,v,w,x=3,y=3,z=5;while(n--)switch(g[n]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":r=g[n];break;case"wide":y=5;break;case"narrow":y=2;break;case"long":x=5;break;case"short":x=2}r=="open"?(x+=2,y+=2,z+=2,u=1,v=f?4:1,w={fill:"none",stroke:k.stroke}):(v=u=x/2,w={fill:k.stroke,stroke:"none"}),d._.arrows?f?(d._.arrows.endPath&&p[d._.arrows.endPath]--,d._.arrows.endMarker&&p[d._.arrows.endMarker]--):(d._.arrows.startPath&&p[d._.arrows.startPath]--,d._.arrows.startMarker&&p[d._.arrows.startMarker]--):d._.arrows={};if(r!="none"){var A="raphael-marker-"+r,B="raphael-marker-"+i+r+x+y;a._g.doc.getElementById(A)?p[A]++:(h.defs.appendChild(q(q("path"),{"stroke-linecap":"round",d:o[r],id:A})),p[A]=1);var C=a._g.doc.getElementById(B),D;C?(p[B]++,D=C.getElementsByTagName("use")[0]):(C=q(q("marker"),{id:B,markerHeight:y,markerWidth:x,orient:"auto",refX:v,refY:y/2}),D=q(q("use"),{"xlink:href":"#"+A,transform:(f?"rotate(180 "+x/2+" "+y/2+") ":l)+"scale("+x/z+","+y/z+")","stroke-width":(1/((x/z+y/z)/2)).toFixed(4)}),C.appendChild(D),h.defs.appendChild(C),p[B]=1),q(D,w);var F=u*(r!="diamond"&&r!="oval");f?(s=d._.arrows.startdx*m||0,t=a.getTotalLength(k.path)-F*m):(s=F*m,t=a.getTotalLength(k.path)-(d._.arrows.enddx*m||0)),w={},w["marker-"+i]="url(#"+B+")";if(t||s)w.d=Raphael.getSubpath(k.path,s,t);q(j,w),d._.arrows[i+"Path"]=A,d._.arrows[i+"Marker"]=B,d._.arrows[i+"dx"]=F,d._.arrows[i+"Type"]=r,d._.arrows[i+"String"]=e}else f?(s=d._.arrows.startdx*m||0,t=a.getTotalLength(k.path)-s):(s=0,t=a.getTotalLength(k.path)-(d._.arrows.enddx*m||0)),d._.arrows[i+"Path"]&&q(j,{d:Raphael.getSubpath(k.path,s,t)}),delete d._.arrows[i+"Path"],delete d._.arrows[i+"Marker"],delete d._.arrows[i+"dx"],delete d._.arrows[i+"Type"],delete d._.arrows[i+"String"];for(w in p)if(p[b](w)&&!p[w]){var G=a._g.doc.getElementById(w);G&&G.parentNode.removeChild(G)}}},u={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},v=function(a,b,d){b=u[c(b).toLowerCase()];if(b){var e=a.attrs["stroke-width"]||"1",f={round:e,square:e,butt:0}[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],h=b.length;while(h--)g[h]=b[h]*e+(h%2?1:-1)*f;q(a.node,{"stroke-dasharray":g.join(",")})}},w=function(d,f){var i=d.node,k=d.attrs,m=i.style.visibility;i.style.visibility="hidden";for(var o in f)if(f[b](o)){if(!a._availableAttrs[b](o))continue;var p=f[o];k[o]=p;switch(o){case"blur":d.blur(p);break;case"href":case"title":case"target":var u=i.parentNode;if(u.tagName.toLowerCase()!="a"){var w=q("a");u.insertBefore(w,i),w.appendChild(i),u=w}o=="target"?u.setAttributeNS(n,"show",p=="blank"?"new":p):u.setAttributeNS(n,o,p);break;case"cursor":i.style.cursor=p;break;case"transform":d.transform(p);break;case"arrow-start":t(d,p);break;case"arrow-end":t(d,p,1);break;case"clip-rect":var x=c(p).split(j);if(x.length==4){d.clip&&d.clip.parentNode.parentNode.removeChild(d.clip.parentNode);var z=q("clipPath"),A=q("rect");z.id=a.createUUID(),q(A,{x:x[0],y:x[1],width:x[2],height:x[3]}),z.appendChild(A),d.paper.defs.appendChild(z),q(i,{"clip-path":"url(#"+z.id+")"}),d.clip=A}if(!p){var B=i.getAttribute("clip-path");if(B){var C=a._g.doc.getElementById(B.replace(/(^url\(#|\)$)/g,l));C&&C.parentNode.removeChild(C),q(i,{"clip-path":l}),delete d.clip}}break;case"path":d.type=="path"&&(q(i,{d:p?k.path=a._pathToAbsolute(p):"M0,0"}),d._.dirty=1,d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1)));break;case"width":i.setAttribute(o,p),d._.dirty=1;if(k.fx)o="x",p=k.x;else break;case"x":k.fx&&(p=-k.x-(k.width||0));case"rx":if(o=="rx"&&d.type=="rect")break;case"cx":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"height":i.setAttribute(o,p),d._.dirty=1;if(k.fy)o="y",p=k.y;else break;case"y":k.fy&&(p=-k.y-(k.height||0));case"ry":if(o=="ry"&&d.type=="rect")break;case"cy":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"r":d.type=="rect"?q(i,{rx:p,ry:p}):i.setAttribute(o,p),d._.dirty=1;break;case"src":d.type=="image"&&i.setAttributeNS(n,"href",p);break;case"stroke-width":if(d._.sx!=1||d._.sy!=1)p/=g(h(d._.sx),h(d._.sy))||1;d.paper._vbSize&&(p*=d.paper._vbSize),i.setAttribute(o,p),k["stroke-dasharray"]&&v(d,k["stroke-dasharray"],f),d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"stroke-dasharray":v(d,p,f);break;case"fill":var D=c(p).match(a._ISURL);if(D){z=q("pattern");var F=q("image");z.id=a.createUUID(),q(z,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),q(F,{x:0,y:0,"xlink:href":D[1]}),z.appendChild(F),function(b){a._preload(D[1],function(){var a=this.offsetWidth,c=this.offsetHeight;q(b,{width:a,height:c}),q(F,{width:a,height:c}),d.paper.safari()})}(z),d.paper.defs.appendChild(z),q(i,{fill:"url(#"+z.id+")"}),d.pattern=z,d.pattern&&s(d);break}var G=a.getRGB(p);if(!G.error)delete f.gradient,delete k.gradient,!a.is(k.opacity,"undefined")&&a.is(f.opacity,"undefined")&&q(i,{opacity:k.opacity}),!a.is(k["fill-opacity"],"undefined")&&a.is(f["fill-opacity"],"undefined")&&q(i,{"fill-opacity":k["fill-opacity"]});else if((d.type=="circle"||d.type=="ellipse"||c(p).charAt()!="r")&&r(d,p)){if("opacity"in k||"fill-opacity"in k){var H=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l));if(H){var I=H.getElementsByTagName("stop");q(I[I.length-1],{"stop-opacity":("opacity"in k?k.opacity:1)*("fill-opacity"in k?k["fill-opacity"]:1)})}}k.gradient=p,k.fill="none";break}G[b]("opacity")&&q(i,{"fill-opacity":G.opacity>1?G.opacity/100:G.opacity});case"stroke":G=a.getRGB(p),i.setAttribute(o,G.hex),o=="stroke"&&G[b]("opacity")&&q(i,{"stroke-opacity":G.opacity>1?G.opacity/100:G.opacity}),o=="stroke"&&d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"gradient":(d.type=="circle"||d.type=="ellipse"||c(p).charAt()!="r")&&r(d,p);break;case"opacity":k.gradient&&!k[b]("stroke-opacity")&&q(i,{"stroke-opacity":p>1?p/100:p});case"fill-opacity":if(k.gradient){H=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l)),H&&(I=H.getElementsByTagName("stop"),q(I[I.length-1],{"stop-opacity":p}));break};default:o=="font-size"&&(p=e(p,10)+"px");var J=o.replace(/(\-.)/g,function(a){return a.substring(1).toUpperCase()});i.style[J]=p,d._.dirty=1,i.setAttribute(o,p)}}y(d,f),i.style.visibility=m},x=1.2,y=function(d,f){if(d.type=="text"&&!!(f[b]("text")||f[b]("font")||f[b]("font-size")||f[b]("x")||f[b]("y"))){var g=d.attrs,h=d.node,i=h.firstChild?e(a._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue("font-size"),10):10;if(f[b]("text")){g.text=f.text;while(h.firstChild)h.removeChild(h.firstChild);var j=c(f.text).split("\n"),k=[],m;for(var n=0,o=j.length;n<o;n++)m=q("tspan"),n&&q(m,{dy:i*x,x:g.x}),m.appendChild(a._g.doc.createTextNode(j[n])),h.appendChild(m),k[n]=m}else{k=h.getElementsByTagName("tspan");for(n=0,o=k.length;n<o;n++)n?q(k[n],{dy:i*x,x:g.x}):q(k[0],{dy:0})}q(h,{x:g.x,y:g.y}),d._.dirty=1;var p=d._getBBox(),r=g.y-(p.y+p.height/2);r&&a.is(r,"finite")&&q(k[0],{dy:r})}},z=function(b,c){var d=0,e=0;this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.matrix=a.matrix(),this.realPath=null,this.paper=c,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},A=a.el;z.prototype=A,A.constructor=z,a._engine.path=function(a,b){var c=q("path");b.canvas&&b.canvas.appendChild(c);var d=new z(c,b);d.type="path",w(d,{fill:"none",stroke:"#000",path:a});return d},A.rotate=function(a,b,e){if(this.removed)return this;a=c(a).split(j),a.length-1&&(b=d(a[1]),e=d(a[2])),a=d(a[0]),e==null&&(b=e);if(b==null||e==null){var f=this.getBBox(1);b=f.x+f.width/2,e=f.y+f.height/2}this.transform(this._.transform.concat([["r",a,b,e]]));return this},A.scale=function(a,b,e,f){if(this.removed)return this;a=c(a).split(j),a.length-1&&(b=d(a[1]),e=d(a[2]),f=d(a[3])),a=d(a[0]),b==null&&(b=a),f==null&&(e=f);if(e==null||f==null)var g=this.getBBox(1);e=e==null?g.x+g.width/2:e,f=f==null?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,b,e,f]]));return this},A.translate=function(a,b){if(this.removed)return this;a=c(a).split(j),a.length-1&&(b=d(a[1])),a=d(a[0])||0,b=+b||0,this.transform(this._.transform.concat([["t",a,b]]));return this},A.transform=function(c){var d=this._;if(c==null)return d.transform;a._extractTransform(this,c),this.clip&&q(this.clip,{transform:this.matrix.invert()}),this.pattern&&s(this),this.node&&q(this.node,{transform:this.matrix});if(d.sx!=1||d.sy!=1){var e=this.attrs[b]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":e})}return this},A.hide=function(){!this.removed&&this.paper.safari(this.node.style.display="none");return this},A.show=function(){!this.removed&&this.paper.safari(this.node.style.display="");return this},A.remove=function(){if(!this.removed&&!!this.node.parentNode){var b=this.paper;b.__set__&&b.__set__.exclude(this),k.unbind("raphael.*.*."+this.id),this.gradient&&b.defs.removeChild(this.gradient),a._tear(this,b),this.node.parentNode.tagName.toLowerCase()=="a"?this.node.parentNode.parentNode.removeChild(this.node.parentNode):this.node.parentNode.removeChild(this.node);for(var c in this)this[c]=typeof this[c]=="function"?a._removedFactory(c):null;this.removed=!0}},A._getBBox=function(){if(this.node.style.display=="none"){this.show();var a=!0}var b={};try{b=this.node.getBBox()}catch(c){}finally{b=b||{}}a&&this.hide();return b},A.attr=function(c,d){if(this.removed)return this;if(c==null){var e={};for(var f in this.attrs)this.attrs[b](f)&&(e[f]=this.attrs[f]);e.gradient&&e.fill=="none"&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform;return e}if(d==null&&a.is(c,"string")){if(c=="fill"&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;if(c=="transform")return this._.transform;var g=c.split(j),h={};for(var i=0,l=g.length;i<l;i++)c=g[i],c in this.attrs?h[c]=this.attrs[c]:a.is(this.paper.customAttributes[c],"function")?h[c]=this.paper.customAttributes[c].def:h[c]=a._availableAttrs[c];return l-1?h:h[g[0]]}if(d==null&&a.is(c,"array")){h={};for(i=0,l=c.length;i<l;i++)h[c[i]]=this.attr(c[i]);return h}if(d!=null){var m={};m[c]=d}else c!=null&&a.is(c,"object")&&(m=c);for(var n in m)k("raphael.attr."+n+"."+this.id,this,m[n]);for(n in this.paper.customAttributes)if(this.paper.customAttributes[b](n)&&m[b](n)&&a.is(this.paper.customAttributes[n],"function")){var o=this.paper.customAttributes[n].apply(this,[].concat(m[n]));this.attrs[n]=m[n];for(var p in o)o[b](p)&&(m[p]=o[p])}w(this,m);return this},A.toFront=function(){if(this.removed)return this;this.node.parentNode.tagName.toLowerCase()=="a"?this.node.parentNode.parentNode.appendChild(this.node.parentNode):this.node.parentNode.appendChild(this.node);var b=this.paper;b.top!=this&&a._tofront(this,b);return this},A.toBack=function(){if(this.removed)return this;var b=this.node.parentNode;b.tagName.toLowerCase()=="a"?b.parentNode.insertBefore(this.node.parentNode,this.node.parentNode.parentNode.firstChild):b.firstChild!=this.node&&b.insertBefore(this.node,this.node.parentNode.firstChild),a._toback(this,this.paper);var c=this.paper;return this},A.insertAfter=function(b){if(this.removed)return this;var c=b.node||b[b.length-1].node;c.nextSibling?c.parentNode.insertBefore(this.node,c.nextSibling):c.parentNode.appendChild(this.node),a._insertafter(this,b,this.paper);return this},A.insertBefore=function(b){if(this.removed)return this;var c=b.node||b[0].node;c.parentNode.insertBefore(this.node,c),a._insertbefore(this,b,this.paper);return this},A.blur=function(b){var c=this;if(+b!==0){var d=q("filter"),e=q("feGaussianBlur");c.attrs.blur=b,d.id=a.createUUID(),q(e,{stdDeviation:+b||1.5}),d.appendChild(e),c.paper.defs.appendChild(d),c._blur=d,q(c.node,{filter:"url(#"+d.id+")"})}else c._blur&&(c._blur.parentNode.removeChild(c._blur),delete c._blur,delete c.attrs.blur),c.node.removeAttribute("filter")},a._engine.circle=function(a,b,c,d){var e=q("circle");a.canvas&&a.canvas.appendChild(e);var f=new z(e,a);f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"},f.type="circle",q(e,f.attrs);return f},a._engine.rect=function(a,b,c,d,e,f){var g=q("rect");a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);h.attrs={x:b,y:c,width:d,height:e,r:f||0,rx:f||0,ry:f||0,fill:"none",stroke:"#000"},h.type="rect",q(g,h.attrs);return h},a._engine.ellipse=function(a,b,c,d,e){var f=q("ellipse");a.canvas&&a.canvas.appendChild(f);var g=new z(f,a);g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"},g.type="ellipse",q(f,g.attrs);return g},a._engine.image=function(a,b,c,d,e,f){var g=q("image");q(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"}),g.setAttributeNS(n,"href",b),a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);h.attrs={x:c,y:d,width:e,height:f,src:b},h.type="image";return h},a._engine.text=function(b,c,d,e){var f=q("text");b.canvas&&b.canvas.appendChild(f);var g=new z(f,b);g.attrs={x:c,y:d,"text-anchor":"middle",text:e,font:a._availableAttrs.font,stroke:"none",fill:"#000"},g.type="text",w(g,g.attrs);return g},a._engine.setSize=function(a,b){this.width=a||this.width,this.height=b||this.height,this.canvas.setAttribute("width",this.width),this.canvas.setAttribute("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox);return this},a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b&&b.container,d=b.x,e=b.y,f=b.width,g=b.height;if(!c)throw new Error("SVG container not found.");var h=q("svg"),i="overflow:hidden;",j;d=d||0,e=e||0,f=f||512,g=g||342,q(h,{height:g,version:1.1,width:f,xmlns:"http://www.w3.org/2000/svg"}),c==1?(h.style.cssText=i+"position:absolute;left:"+d+"px;top:"+e+"px",a._g.doc.body.appendChild(h),j=1):(h.style.cssText=i+"position:relative",c.firstChild?c.insertBefore(h,c.firstChild):c.appendChild(h)),c=new a._Paper,c.width=f,c.height=g,c.canvas=h,c.clear(),c._left=c._top=0,j&&(c.renderfix=function(){}),c.renderfix();return c},a._engine.setViewBox=function(a,b,c,d,e){k("raphael.setViewBox",this,this._viewBox,[a,b,c,d,e]);var f=g(c/this.width,d/this.height),h=this.top,i=e?"meet":"xMinYMin",j,l;a==null?(this._vbSize&&(f=1),delete this._vbSize,j="0 0 "+this.width+m+this.height):(this._vbSize=f,j=a+m+b+m+c+m+d),q(this.canvas,{viewBox:j,preserveAspectRatio:i});while(f&&h)l="stroke-width"in h.attrs?h.attrs["stroke-width"]:1,h.attr({"stroke-width":l}),h._.dirty=1,h._.dirtyT=1,h=h.prev;this._viewBox=[a,b,c,d,!!e];return this},a.prototype.renderfix=function(){var a=this.canvas,b=a.style,c;try{c=a.getScreenCTM()||a.createSVGMatrix()}catch(d){c=a.createSVGMatrix()}var e=-c.e%1,f=-c.f%1;if(e||f)e&&(this._left=(this._left+e)%1,b.left=this._left+"px"),f&&(this._top=(this._top+f)%1,b.top=this._top+"px")},a.prototype.clear=function(){a.eve("raphael.clear",this);var b=this.canvas;while(b.firstChild)b.removeChild(b.firstChild);this.bottom=this.top=null,(this.desc=q("desc")).appendChild(a._g.doc.createTextNode("Created with Raphaël "+a.version)),b.appendChild(this.desc),b.appendChild(this.defs=q("defs"))},a.prototype.remove=function(){k("raphael.remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]=typeof this[b]=="function"?a._removedFactory(b):null};var B=a.st;for(var C in A)A[b](C)&&!B[b](C)&&(B[C]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(C))}(window.Raphael),window.Raphael.vml&&function(a){var b="hasOwnProperty",c=String,d=parseFloat,e=Math,f=e.round,g=e.max,h=e.min,i=e.abs,j="fill",k=/[, ]+/,l=a.eve,m=" progid:DXImageTransform.Microsoft",n=" ",o="",p={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},q=/([clmz]),?([^clmz]*)/gi,r=/ progid:\S+Blur\([^\)]+\)/g,s=/-?[^,\s-]+/g,t="position:absolute;left:0;top:0;width:1px;height:1px",u=21600,v={path:1,rect:1,image:1},w={circle:1,ellipse:1},x=function(b){var d=/[ahqstv]/ig,e=a._pathToAbsolute;c(b).match(d)&&(e=a._path2curve),d=/[clmz]/g;if(e==a._pathToAbsolute&&!c(b).match(d)){var g=c(b).replace(q,function(a,b,c){var d=[],e=b.toLowerCase()=="m",g=p[b];c.replace(s,function(a){e&&d.length==2&&(g+=d+p[b=="m"?"l":"L"],d=[]),d.push(f(a*u))});return g+d});return g}var h=e(b),i,j;g=[];for(var k=0,l=h.length;k<l;k++){i=h[k],j=h[k][0].toLowerCase(),j=="z"&&(j="x");for(var m=1,r=i.length;m<r;m++)j+=f(i[m]*u)+(m!=r-1?",":o);g.push(j)}return g.join(n)},y=function(b,c,d){var e=a.matrix();e.rotate(-b,.5,.5);return{dx:e.x(c,d),dy:e.y(c,d)}},z=function(a,b,c,d,e,f){var g=a._,h=a.matrix,k=g.fillpos,l=a.node,m=l.style,o=1,p="",q,r=u/b,s=u/c;m.visibility="hidden";if(!!b&&!!c){l.coordsize=i(r)+n+i(s),m.rotation=f*(b*c<0?-1:1);if(f){var t=y(f,d,e);d=t.dx,e=t.dy}b<0&&(p+="x"),c<0&&(p+=" y")&&(o=-1),m.flip=p,l.coordorigin=d*-r+n+e*-s;if(k||g.fillsize){var v=l.getElementsByTagName(j);v=v&&v[0],l.removeChild(v),k&&(t=y(f,h.x(k[0],k[1]),h.y(k[0],k[1])),v.position=t.dx*o+n+t.dy*o),g.fillsize&&(v.size=g.fillsize[0]*i(b)+n+g.fillsize[1]*i(c)),l.appendChild(v)}m.visibility="visible"}};a.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};var A=function(a,b,d){var e=c(b).toLowerCase().split("-"),f=d?"end":"start",g=e.length,h="classic",i="medium",j="medium";while(g--)switch(e[g]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":h=e[g];break;case"wide":case"narrow":j=e[g];break;case"long":case"short":i=e[g]}var k=a.node.getElementsByTagName("stroke")[0];k[f+"arrow"]=h,k[f+"arrowlength"]=i,k[f+"arrowwidth"]=j},B=function(e,i){e.attrs=e.attrs||{};var l=e.node,m=e.attrs,p=l.style,q,r=v[e.type]&&(i.x!=m.x||i.y!=m.y||i.width!=m.width||i.height!=m.height||i.cx!=m.cx||i.cy!=m.cy||i.rx!=m.rx||i.ry!=m.ry||i.r!=m.r),s=w[e.type]&&(m.cx!=i.cx||m.cy!=i.cy||m.r!=i.r||m.rx!=i.rx||m.ry!=i.ry),t=e;for(var y in i)i[b](y)&&(m[y]=i[y]);r&&(m.path=a._getPath[e.type](e),e._.dirty=1),i.href&&(l.href=i.href),i.title&&(l.title=i.title),i.target&&(l.target=i.target),i.cursor&&(p.cursor=i.cursor),"blur"in i&&e.blur(i.blur);if(i.path&&e.type=="path"||r)l.path=x(~c(m.path).toLowerCase().indexOf("r")?a._pathToAbsolute(m.path):m.path),e.type=="image"&&(e._.fillpos=[m.x,m.y],e._.fillsize=[m.width,m.height],z(e,1,1,0,0,0));"transform"in i&&e.transform(i.transform);if(s){var B=+m.cx,D=+m.cy,E=+m.rx||+m.r||0,G=+m.ry||+m.r||0;l.path=a.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",f((B-E)*u),f((D-G)*u),f((B+E)*u),f((D+G)*u),f(B*u))}if("clip-rect"in i){var H=c(i["clip-rect"]).split(k);if(H.length==4){H[2]=+H[2]+ +H[0],H[3]=+H[3]+ +H[1];var I=l.clipRect||a._g.doc.createElement("div"),J=I.style;J.clip=a.format("rect({1}px {2}px {3}px {0}px)",H),l.clipRect||(J.position="absolute",J.top=0,J.left=0,J.width=e.paper.width+"px",J.height=e.paper.height+"px",l.parentNode.insertBefore(I,l),I.appendChild(l),l.clipRect=I)}i["clip-rect"]||l.clipRect&&(l.clipRect.style.clip="auto")}if(e.textpath){var K=e.textpath.style;i.font&&(K.font=i.font),i["font-family"]&&(K.fontFamily='"'+i["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,o)+'"'),i["font-size"]&&(K.fontSize=i["font-size"]),i["font-weight"]&&(K.fontWeight=i["font-weight"]),i["font-style"]&&(K.fontStyle=i["font-style"])}"arrow-start"in i&&A(t,i["arrow-start"]),"arrow-end"in i&&A(t,i["arrow-end"],1);if(i.opacity!=null||i["stroke-width"]!=null||i.fill!=null||i.src!=null||i.stroke!=null||i["stroke-width"]!=null||i["stroke-opacity"]!=null||i["fill-opacity"]!=null||i["stroke-dasharray"]!=null||i["stroke-miterlimit"]!=null||i["stroke-linejoin"]!=null||i["stroke-linecap"]!=null){var L=l.getElementsByTagName(j),M=!1;L=L&&L[0],!L&&(M=L=F(j)),e.type=="image"&&i.src&&(L.src=i.src),i.fill&&(L.on=!0);if(L.on==null||i.fill=="none"||i.fill===null)L.on=!1;if(L.on&&i.fill){var N=c(i.fill).match(a._ISURL);if(N){L.parentNode==l&&l.removeChild(L),L.rotate=!0,L.src=N[1],L.type="tile";var O=e.getBBox(1);L.position=O.x+n+O.y,e._.fillpos=[O.x,O.y],a._preload(N[1],function(){e._.fillsize=[this.offsetWidth,this.offsetHeight]})}else L.color=a.getRGB(i.fill).hex,L.src=o,L.type="solid",a.getRGB(i.fill).error&&(t.type in{circle:1,ellipse:1}||c(i.fill).charAt()!="r")&&C(t,i.fill,L)&&(m.fill="none",m.gradient=i.fill,L.rotate=!1)}if("fill-opacity"in i||"opacity"in i){var P=((+m["fill-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+a.getRGB(i.fill).o+1||2)-1);P=h(g(P,0),1),L.opacity=P,L.src&&(L.color="none")}l.appendChild(L);var Q=l.getElementsByTagName("stroke")&&l.getElementsByTagName("stroke")[0],T=!1;!Q&&(T=Q=F("stroke"));if(i.stroke&&i.stroke!="none"||i["stroke-width"]||i["stroke-opacity"]!=null||i["stroke-dasharray"]||i["stroke-miterlimit"]||i["stroke-linejoin"]||i["stroke-linecap"])Q.on=!0;(i.stroke=="none"||i.stroke===null||Q.on==null||i.stroke==0||i["stroke-width"]==0)&&(Q.on=!1);var U=a.getRGB(i.stroke);Q.on&&i.stroke&&(Q.color=U.hex),P=((+m["stroke-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+U.o+1||2)-1);var V=(d(i["stroke-width"])||1)*.75;P=h(g(P,0),1),i["stroke-width"]==null&&(V=m["stroke-width"]),i["stroke-width"]&&(Q.weight=V),V&&V<1&&(P*=V)&&(Q.weight=1),Q.opacity=P,i["stroke-linejoin"]&&(Q.joinstyle=i["stroke-linejoin"]||"miter"),Q.miterlimit=i["stroke-miterlimit"]||8,i["stroke-linecap"]&&(Q.endcap=i["stroke-linecap"]=="butt"?"flat":i["stroke-linecap"]=="square"?"square":"round");if(i["stroke-dasharray"]){var W={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};Q.dashstyle=W[b](i["stroke-dasharray"])?W[i["stroke-dasharray"]]:o}T&&l.appendChild(Q)}if(t.type=="text"){t.paper.canvas.style.display=o;var X=t.paper.span,Y=100,Z=m.font&&m.font.match(/\d+(?:\.\d*)?(?=px)/);p=X.style,m.font&&(p.font=m.font),m["font-family"]&&(p.fontFamily=m["font-family"]),m["font-weight"]&&(p.fontWeight=m["font-weight"]),m["font-style"]&&(p.fontStyle=m["font-style"]),Z=d(m["font-size"]||Z&&Z[0])||10,p.fontSize=Z*Y+"px",t.textpath.string&&(X.innerHTML=c(t.textpath.string).replace(/</g,"&#60;").replace(/&/g,"&#38;").replace(/\n/g,"<br>"));var $=X.getBoundingClientRect();t.W=m.w=($.right-$.left)/Y,t.H=m.h=($.bottom-$.top)/Y,t.X=m.x,t.Y=m.y+t.H/2,("x"in i||"y"in i)&&(t.path.v=a.format("m{0},{1}l{2},{1}",f(m.x*u),f(m.y*u),f(m.x*u)+1));var _=["x","y","text","font","font-family","font-weight","font-style","font-size"];for(var ba=0,bb=_.length;ba<bb;ba++)if(_[ba]in i){t._.dirty=1;break}switch(m["text-anchor"]){case"start":t.textpath.style["v-text-align"]="left",t.bbx=t.W/2;break;case"end":t.textpath.style["v-text-align"]="right",t.bbx=-t.W/2;break;default:t.textpath.style["v-text-align"]="center",t.bbx=0}t.textpath.style["v-text-kern"]=!0}},C=function(b,f,g){b.attrs=b.attrs||{};var h=b.attrs,i=Math.pow,j,k,l="linear",m=".5 .5";b.attrs.gradient=f,f=c(f).replace(a._radial_gradient,function(a,b,c){l="radial",b&&c&&(b=d(b),c=d(c),i(b-.5,2)+i(c-.5,2)>.25&&(c=e.sqrt(.25-i(b-.5,2))*((c>.5)*2-1)+.5),m=b+n+c);return o}),f=f.split(/\s*\-\s*/);if(l=="linear"){var p=f.shift();p=-d(p);if(isNaN(p))return null}var q=a._parseDots(f);if(!q)return null;b=b.shape||b.node;if(q.length){b.removeChild(g),g.on=!0,g.method="none",g.color=q[0].color,g.color2=q[q.length-1].color;var r=[];for(var s=0,t=q.length;s<t;s++)q[s].offset&&r.push(q[s].offset+n+q[s].color);g.colors=r.length?r.join():"0% "+g.color,l=="radial"?(g.type="gradientTitle",g.focus="100%",g.focussize="0 0",g.focusposition=m,g.angle=0):(g.type="gradient",g.angle=(270-p)%360),b.appendChild(g)}return 1},D=function(b,c){this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=c,this.matrix=a.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},E=a.el;D.prototype=E,E.constructor=D,E.transform=function(b){if(b==null)return this._.transform;var d=this.paper._viewBoxShift,e=d?"s"+[d.scale,d.scale]+"-1-1t"+[d.dx,d.dy]:o,f;d&&(f=b=c(b).replace(/\.{3}|\u2026/g,this._.transform||o)),a._extractTransform(this,e+b);var g=this.matrix.clone(),h=this.skew,i=this.node,j,k=~c(this.attrs.fill).indexOf("-"),l=!c(this.attrs.fill).indexOf("url(");g.translate(-0.5,-0.5);if(l||k||this.type=="image"){h.matrix="1 0 0 1",h.offset="0 0",j=g.split();if(k&&j.noRotation||!j.isSimple){i.style.filter=g.toFilter();var m=this.getBBox(),p=this.getBBox(1),q=m.x-p.x,r=m.y-p.y;i.coordorigin=q*-u+n+r*-u,z(this,1,1,q,r,0)}else i.style.filter=o,z(this,j.scalex,j.scaley,j.dx,j.dy,j.rotate)}else i.style.filter=o,h.matrix=c(g),h.offset=g.offset();f&&(this._.transform=f);return this},E.rotate=function(a,b,e){if(this.removed)return this;if(a!=null){a=c(a).split(k),a.length-1&&(b=d(a[1]),e=d(a[2])),a=d(a[0]),e==null&&(b=e);if(b==null||e==null){var f=this.getBBox(1);b=f.x+f.width/2,e=f.y+f.height/2}this._.dirtyT=1,this.transform(this._.transform.concat([["r",a,b,e]]));return this}},E.translate=function(a,b){if(this.removed)return this;a=c(a).split(k),a.length-1&&(b=d(a[1])),a=d(a[0])||0,b=+b||0,this._.bbox&&(this._.bbox.x+=a,this._.bbox.y+=b),this.transform(this._.transform.concat([["t",a,b]]));return this},E.scale=function(a,b,e,f){if(this.removed)return this;a=c(a).split(k),a.length-1&&(b=d(a[1]),e=d(a[2]),f=d(a[3]),isNaN(e)&&(e=null),isNaN(f)&&(f=null)),a=d(a[0]),b==null&&(b=a),f==null&&(e=f);if(e==null||f==null)var g=this.getBBox(1);e=e==null?g.x+g.width/2:e,f=f==null?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,b,e,f]])),this._.dirtyT=1;return this},E.hide=function(){!this.removed&&(this.node.style.display="none");return this},E.show=function(){!this.removed&&(this.node.style.display=o);return this},E._getBBox=function(){if(this.removed)return{};return{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},E.remove=function(){if(!this.removed&&!!this.node.parentNode){this.paper.__set__&&this.paper.__set__.exclude(this),a.eve.unbind("raphael.*.*."+this.id),a._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var b in this)this[b]=typeof this[b]=="function"?a._removedFactory(b):null;this.removed=!0}},E.attr=function(c,d){if(this.removed)return this;if(c==null){var e={};for(var f in this.attrs)this.attrs[b](f)&&(e[f]=this.attrs[f]);e.gradient&&e.fill=="none"&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform;return e}if(d==null&&a.is(c,"string")){if(c==j&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;var g=c.split(k),h={};for(var i=0,m=g.length;i<m;i++)c=g[i],c in this.attrs?h[c]=this.attrs[c]:a.is(this.paper.customAttributes[c],"function")?h[c]=this.paper.customAttributes[c].def:h[c]=a._availableAttrs[c];return m-1?h:h[g[0]]}if(this.attrs&&d==null&&a.is(c,"array")){h={};for(i=0,m=c.length;i<m;i++)h[c[i]]=this.attr(c[i]);return h}var n;d!=null&&(n={},n[c]=d),d==null&&a.is(c,"object")&&(n=c);for(var o in n)l("raphael.attr."+o+"."+this.id,this,n[o]);if(n){for(o in this.paper.customAttributes)if(this.paper.customAttributes[b](o)&&n[b](o)&&a.is(this.paper.customAttributes[o],"function")){var p=this.paper.customAttributes[o].apply(this,[].concat(n[o]));this.attrs[o]=n[o];for(var q in p)p[b](q)&&(n[q]=p[q])}n.text&&this.type=="text"&&(this.textpath.string=n.text),B(this,n)}return this},E.toFront=function(){!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&a._tofront(this,this.paper);return this},E.toBack=function(){if(this.removed)return this;this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),a._toback(this,this.paper));return this},E.insertAfter=function(b){if(this.removed)return this;b.constructor==a.st.constructor&&(b=b[b.length-1]),b.node.nextSibling?b.node.parentNode.insertBefore(this.node,b.node.nextSibling):b.node.parentNode.appendChild(this.node),a._insertafter(this,b,this.paper);return this},E.insertBefore=function(b){if(this.removed)return this;b.constructor==a.st.constructor&&(b=b[0]),b.node.parentNode.insertBefore(this.node,b.node),a._insertbefore(this,b,this.paper);return this},E.blur=function(b){var c=this.node.runtimeStyle,d=c.filter;d=d.replace(r,o),+b!==0?(this.attrs.blur=b,c.filter=d+n+m+".Blur(pixelradius="+(+b||1.5)+")",c.margin=a.format("-{0}px 0 0 -{0}px",f(+b||1.5))):(c.filter=d,c.margin=0,delete this.attrs.blur)},a._engine.path=function(a,b){var c=F("shape");c.style.cssText=t,c.coordsize=u+n+u,c.coordorigin=b.coordorigin;var d=new D(c,b),e={fill:"none",stroke:"#000"};a&&(e.path=a),d.type="path",d.path=[],d.Path=o,B(d,e),b.canvas.appendChild(c);var f=F("skew");f.on=!0,c.appendChild(f),d.skew=f,d.transform(o);return d},a._engine.rect=function(b,c,d,e,f,g){var h=a._rectPath(c,d,e,f,g),i=b.path(h),j=i.attrs;i.X=j.x=c,i.Y=j.y=d,i.W=j.width=e,i.H=j.height=f,j.r=g,j.path=h,i.type="rect";return i},a._engine.ellipse=function(a,b,c,d,e){var f=a.path(),g=f.attrs;f.X=b-d,f.Y=c-e,f.W=d*2,f.H=e*2,f.type="ellipse",B(f,{cx:b,cy:c,rx:d,ry:e});return f},a._engine.circle=function(a,b,c,d){var e=a.path(),f=e.attrs;e.X=b-d,e.Y=c-d,e.W=e.H=d*2,e.type="circle",B(e,{cx:b,cy:c,r:d});return e},a._engine.image=function(b,c,d,e,f,g){var h=a._rectPath(d,e,f,g),i=b.path(h).attr({stroke:"none"}),k=i.attrs,l=i.node,m=l.getElementsByTagName(j)[0];k.src=c,i.X=k.x=d,i.Y=k.y=e,i.W=k.width=f,i.H=k.height=g,k.path=h,i.type="image",m.parentNode==l&&l.removeChild(m),m.rotate=!0,m.src=c,m.type="tile",i._.fillpos=[d,e],i._.fillsize=[f,g],l.appendChild(m),z(i,1,1,0,0,0);return i},a._engine.text=function(b,d,e,g){var h=F("shape"),i=F("path"),j=F("textpath");d=d||0,e=e||0,g=g||"",i.v=a.format("m{0},{1}l{2},{1}",f(d*u),f(e*u),f(d*u)+1),i.textpathok=!0,j.string=c(g),j.on=!0,h.style.cssText=t,h.coordsize=u+n+u,h.coordorigin="0 0";var k=new D(h,b),l={fill:"#000",stroke:"none",font:a._availableAttrs.font,text:g};k.shape=h,k.path=i,k.textpath=j,k.type="text",k.attrs.text=c(g),k.attrs.x=d,k.attrs.y=e,k.attrs.w=1,k.attrs.h=1,B(k,l),h.appendChild(j),h.appendChild(i),b.canvas.appendChild(h);var m=F("skew");m.on=!0,h.appendChild(m),k.skew=m,k.transform(o);return k},a._engine.setSize=function(b,c){var d=this.canvas.style;this.width=b,this.height=c,b==+b&&(b+="px"),c==+c&&(c+="px"),d.width=b,d.height=c,d.clip="rect(0 "+b+" "+c+" 0)",this._viewBox&&a._engine.setViewBox.apply(this,this._viewBox);return this},a._engine.setViewBox=function(b,c,d,e,f){a.eve("raphael.setViewBox",this,this._viewBox,[b,c,d,e,f]);var h=this.width,i=this.height,j=1/g(d/h,e/i),k,l;f&&(k=i/e,l=h/d,d*k<h&&(b-=(h-d*k)/2/k),e*l<i&&(c-=(i-e*l)/2/l)),this._viewBox=[b,c,d,e,!!f],this._viewBoxShift={dx:-b,dy:-c,scale:j},this.forEach(function(a){a.transform("...")});return this};var F;a._engine.initWin=function(a){var b=a.document;b.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!b.namespaces.rvml&&b.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),F=function(a){return b.createElement("<rvml:"+a+' class="rvml">')}}catch(c){F=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},a._engine.initWin(a._g.win),a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b.container,d=b.height,e,f=b.width,g=b.x,h=b.y;if(!c)throw new Error("VML container not found.");var i=new a._Paper,j=i.canvas=a._g.doc.createElement("div"),k=j.style;g=g||0,h=h||0,f=f||512,d=d||342,i.width=f,i.height=d,f==+f&&(f+="px"),d==+d&&(d+="px"),i.coordsize=u*1e3+n+u*1e3,i.coordorigin="0 0",i.span=a._g.doc.createElement("span"),i.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",j.appendChild(i.span),k.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",f,d),c==1?(a._g.doc.body.appendChild(j),k.left=g+"px",k.top=h+"px",k.position="absolute"):c.firstChild?c.insertBefore(j,c.firstChild):c.appendChild(j),i.renderfix=function(){};return i},a.prototype.clear=function(){a.eve("raphael.clear",this),this.canvas.innerHTML=o,this.span=a._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},a.prototype.remove=function(){a.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]=typeof this[b]=="function"?a._removedFactory(b):null;return!0};var G=a.st;for(var H in E)E[b](H)&&!G[b](H)&&(G[H]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(H))}(window.Raphael) \ No newline at end of file diff --git a/assets/responsivevoice.js.php b/assets/responsivevoice.js.php new file mode 100644 index 0000000..91f4c46 --- /dev/null +++ b/assets/responsivevoice.js.php @@ -0,0 +1,691 @@ +<script> +if (typeof rvAgentPlayer !== 'undefined') { + throw new Error('ResponsiveVoice Website Agent is already running'); +} + +var rvAgentPlayer = { version : 1 }; +var rvApiKey = 'VZgeKlw3'; +var rvApiEndpoint = 'https://texttospeech.responsivevoice.org/v1/text:synthesize'; + +if (typeof responsiveVoice === 'undefined') { + +/* + ResponsiveVoice JS v1.6.5 + + (c) 2015-2020 LearnBrite + + License: http://responsivevoice.org/license +*/ +var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.arrayIteratorImpl=function(g){var k=0;return function(){return k<g.length?{done:!1,value:g[k++]}:{done:!0}}};$jscomp.arrayIterator=function(g){return{next:$jscomp.arrayIteratorImpl(g)}};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.SIMPLE_FROUND_POLYFILL=!1;$jscomp.ISOLATE_POLYFILLS=!1; +$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(g,k,l){if(g==Array.prototype||g==Object.prototype)return g;g[k]=l.value;return g};$jscomp.getGlobal=function(g){g=["object"==typeof globalThis&&globalThis,g,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var k=0;k<g.length;++k){var l=g[k];if(l&&l.Math==Math)return l}throw Error("Cannot find global object");};$jscomp.global=$jscomp.getGlobal(this); +$jscomp.IS_SYMBOL_NATIVE="function"===typeof Symbol&&"symbol"===typeof Symbol("x");$jscomp.TRUST_ES6_POLYFILLS=!$jscomp.ISOLATE_POLYFILLS||$jscomp.IS_SYMBOL_NATIVE;$jscomp.polyfills={};$jscomp.propertyToPolyfillSymbol={};$jscomp.POLYFILL_PREFIX="$jscp$";var $jscomp$lookupPolyfilledValue=function(g,k){var l=$jscomp.propertyToPolyfillSymbol[k];if(null==l)return g[k];l=g[l];return void 0!==l?l:g[k]}; +$jscomp.polyfill=function(g,k,l,n){k&&($jscomp.ISOLATE_POLYFILLS?$jscomp.polyfillIsolated(g,k,l,n):$jscomp.polyfillUnisolated(g,k,l,n))};$jscomp.polyfillUnisolated=function(g,k,l,n){l=$jscomp.global;g=g.split(".");for(n=0;n<g.length-1;n++){var a=g[n];if(!(a in l))return;l=l[a]}g=g[g.length-1];n=l[g];k=k(n);k!=n&&null!=k&&$jscomp.defineProperty(l,g,{configurable:!0,writable:!0,value:k})}; +$jscomp.polyfillIsolated=function(g,k,l,n){var a=g.split(".");g=1===a.length;n=a[0];n=!g&&n in $jscomp.polyfills?$jscomp.polyfills:$jscomp.global;for(var w=0;w<a.length-1;w++){var z=a[w];if(!(z in n))return;n=n[z]}a=a[a.length-1];l=$jscomp.IS_SYMBOL_NATIVE&&"es6"===l?n[a]:null;k=k(l);null!=k&&(g?$jscomp.defineProperty($jscomp.polyfills,a,{configurable:!0,writable:!0,value:k}):k!==l&&($jscomp.propertyToPolyfillSymbol[a]=$jscomp.IS_SYMBOL_NATIVE?$jscomp.global.Symbol(a):$jscomp.POLYFILL_PREFIX+a,a= +$jscomp.propertyToPolyfillSymbol[a],$jscomp.defineProperty(n,a,{configurable:!0,writable:!0,value:k})))};$jscomp.initSymbol=function(){}; +$jscomp.polyfill("Symbol",function(g){if(g)return g;var k=function(a,w){this.$jscomp$symbol$id_=a;$jscomp.defineProperty(this,"description",{configurable:!0,writable:!0,value:w})};k.prototype.toString=function(){return this.$jscomp$symbol$id_};var l=0,n=function(a){if(this instanceof n)throw new TypeError("Symbol is not a constructor");return new k("jscomp_symbol_"+(a||"")+"_"+l++,a)};return n},"es6","es3");$jscomp.initSymbolIterator=function(){}; +$jscomp.polyfill("Symbol.iterator",function(g){if(g)return g;g=Symbol("Symbol.iterator");for(var k="Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array".split(" "),l=0;l<k.length;l++){var n=$jscomp.global[k[l]];"function"===typeof n&&"function"!=typeof n.prototype[g]&&$jscomp.defineProperty(n.prototype,g,{configurable:!0,writable:!0,value:function(){return $jscomp.iteratorPrototype($jscomp.arrayIteratorImpl(this))}})}return g},"es6", +"es3");$jscomp.initSymbolAsyncIterator=function(){};$jscomp.iteratorPrototype=function(g){g={next:g};g[Symbol.iterator]=function(){return this};return g}; +Array.from||(Array.from=function(){var g=Object.prototype.toString,k=function(n){return"function"===typeof n||"[object Function]"===g.call(n)},l=Math.pow(2,53)-1;return function(n){var a=Object(n);if(null==n)throw new TypeError("Array.from requires an array-like object - not null or undefined");var w=1<arguments.length?arguments[1]:void 0,z;if("undefined"!==typeof w){if(!k(w))throw new TypeError("Array.from: when provided, the second argument must be a function");2<arguments.length&&(z=arguments[2])}var b= +Number(a.length);b=isNaN(b)?0:0!==b&&isFinite(b)?(0<b?1:-1)*Math.floor(Math.abs(b)):b;b=Math.min(Math.max(b,0),l);for(var c=k(this)?Object(new this(b)):Array(b),d=0,e;d<b;)e=a[d],c[d]=w?"undefined"===typeof z?w(e,d):w.call(z,e,d):e,d+=1;c.length=b;return c}}()); +if("undefined"!=typeof responsiveVoice)console.log("ResponsiveVoice already loaded"),console.log(responsiveVoice);else var ResponsiveVoice=function(){function g(b){b=b.replace(/([\n\r])+/gm,"\n");for(var c=/([,.:!\u00a1?\u00bf;()\[\]\u2014\u00ab\u00bb])+[\n\r]/gm,d=!0;d;)null===b.match(c)?d=!1:b=b.replace(c,"$1 ");return b}function k(b,c){if(!w)return b;console.log(c);var d=b;try{for(var e=0;e<w.length;e++){var m=w[e],f=!1,h=m.collectionvoices;h?(Array.isArray(h)||(h=[h]),c.collectionvoice&&c.collectionvoice.name&& +-1!=h.indexOf(c.collectionvoice.name)&&(f=!0)):f=!0;var r=!1,p=m.systemvoices;p?(Array.isArray(p)||(p=[p]),c.systemvoice&&c.systemvoice.name&&-1!=p.indexOf(c.systemvoice.name)&&(r=!0)):r=!0;(null==h||null!=h&&f)&&(null==p||null!=p&&r)&&(d=d.replace(m.searchvalue,m.newvalue))}return d}catch(u){return console.warn("ResponsiveVoice: There was an error while processing the textReplacements array"),b}}function l(){var b=document.getElementsByTagName("script"),c;for(c=0;c<b.length;++c)if(b[c].src&&z.test(b[c].src)){var d= +b[c].src;var e=document.createElement("a");var m={};e.href=d;if(e.search){var f=e.search.replace(/^\?/,"").split("&");for(d=0;d<f.length;d++)e=f[d].split("="),m[e[0]]=e[1];m=m.source?m.source:!1}else m=!1;if(m&&"wp-plugin"==m)return z.lastIndex=0,!0}return!1}function n(){var b=document.getElementsByTagName("script"),c;for(c=0;c<b.length;++c)if(b[c].src&&z.test(b[c].src))return z.lastIndex=0,!1;return!0}var a=this;a.version="1.6.5";console.log("ResponsiveVoice r"+a.version);a.responsivevoices=[{name:"UK English Female", +flag:"gb",gender:"f",lang:"en-GB",voiceIDs:[3,7,171,201,5,1,257,286,342,258,287,343,8]},{name:"UK English Male",flag:"gb",gender:"m",lang:"en-GB",voiceIDs:[0,277,202,75,4,2,256,285,341,159]},{name:"US English Female",flag:"us",gender:"f",lang:"en-US",voiceIDs:[432,433,434,40,41,42,383,205,204,43,173,235,283,339,408,44]},{name:"US English Male",flag:"us",gender:"m",lang:"en-US",voiceIDs:[431,39,234,282,338,236,284,340,2,4,0,75,195,169]},{name:"Arabic Male",flag:"ar",gender:"m",lang:"ar-SA",voiceIDs:[96, +95,97,196,388]},{name:"Arabic Female",flag:"ar",gender:"f",lang:"ar-SA",voiceIDs:[98]},{name:"Armenian Male",flag:"hy",gender:"f",lang:"hy-AM",voiceIDs:[99]},{name:"Australian Female",flag:"au",gender:"f",lang:"en-AU",voiceIDs:[415,276,201,87,5,88]},{name:"Australian Male",flag:"au",gender:"m",lang:"en-AU",voiceIDs:[86,386]},{name:"Bangla Bangladesh Female",flag:"bd",gender:"f",lang:"bn-BD",voiceIDs:[435]},{name:"Bangla Bangladesh Male",flag:"bd",gender:"m",lang:"bn-BD",voiceIDs:[410,436]},{name:"Bangla India Female", +flag:"bd",gender:"f",lang:"bn-IN",voiceIDs:[447]},{name:"Bangla India Male",flag:"bd",gender:"m",lang:"bn-IN",voiceIDs:[411,448]},{name:"Brazilian Portuguese Female",flag:"br",gender:"f",lang:"pt-BR",voiceIDs:[245,124,123,125,186,223,126]},{name:"Brazilian Portuguese Male",flag:"br",gender:"m",lang:"pt-BR",voiceIDs:[315,332,371,399],deprecated:!0},{name:"Chinese Female",flag:"cn",gender:"f",lang:"zh-CN",voiceIDs:[249,58,59,380,281,231,155,60,191,268,297,353,269,298,354,409,61]},{name:"Chinese Male", +flag:"cn",gender:"m",lang:"zh-CN",voiceIDs:[317,334,373,389]},{name:"Chinese (Hong Kong) Female",flag:"hk",gender:"f",lang:"zh-HK",voiceIDs:[192,193,232,250,251,270,299,355,409,444,252]},{name:"Chinese (Hong Kong) Male",flag:"hk",gender:"m",lang:"zh-HK",voiceIDs:[430,318,335,374,445,390]},{name:"Chinese Taiwan Female",flag:"tw",gender:"f",lang:"zh-TW",voiceIDs:[194,233,253,254,305,322,361,384,319,336,375,409,255]},{name:"Chinese Taiwan Male",flag:"tw",gender:"m",lang:"zh-TW",voiceIDs:[320,337,376, +391]},{name:"Czech Female",flag:"cz",gender:"f",lang:"cs-CZ",voiceIDs:[412,101,100,102,197,103]},{name:"Czech Male",flag:"cz",gender:"m",lang:"cs-CZ",voiceIDs:[161],deprecated:!0},{name:"Danish Female",flag:"dk",gender:"f",lang:"da-DK",voiceIDs:[413,105,104,106,198,107]},{name:"Danish Male",flag:"da",gender:"m",lang:"da-DK",voiceIDs:[162],deprecated:!0},{name:"Deutsch Female",flag:"de",gender:"f",lang:"de-DE",voiceIDs:[27,28,29,30,78,170,275,199,31,261,290,346,262,291,347,32]},{name:"Deutsch Male", +flag:"de",gender:"m",lang:"de-DE",voiceIDs:[307,324,363,377,393]},{name:"Dutch Female",flag:"nl",gender:"f",lang:"nl-NL",voiceIDs:[243,219,84,157,158,184,45]},{name:"Dutch Male",flag:"nl",gender:"m",lang:"nl-NL",voiceIDs:[157,220,407]},{name:"Estonian Male",flag:"ee",gender:"m",lang:"et-EE",voiceIDs:[416,446]},{name:"Filipino Female",flag:"ph",gender:"f",lang:"fil-PH",voiceIDs:[418,437]},{name:"Finnish Female",flag:"fi",gender:"f",lang:"fi-FI",voiceIDs:[417,90,89,91,209,92]},{name:"Finnish Male", +flag:"fi",gender:"m",lang:"fi-FI",voiceIDs:[160],deprecated:!0},{name:"French Female",flag:"fr",gender:"f",lang:"fr-FR",voiceIDs:[240,21,22,23,77,178,279,210,266,295,351,304,321,360,26]},{name:"French Male",flag:"fr",gender:"m",lang:"fr-FR",voiceIDs:[311,328,367,378,392]},{name:"French Canadian Female",flag:"ca",gender:"f",lang:"fr-CA",voiceIDs:[419,210,449]},{name:"French Canadian Male",flag:"ca",gender:"m",lang:"fr-CA",voiceIDs:[450]},{name:"Greek Female",flag:"gr",gender:"f",lang:"el-GR",voiceIDs:[414, +62,63,80,200,64]},{name:"Greek Male",flag:"gr",gender:"m",lang:"el-GR",voiceIDs:[163],deprecated:!0},{name:"Hindi Female",flag:"hi",gender:"f",lang:"hi-IN",voiceIDs:[247,66,154,179,213,259,288,344,67]},{name:"Hindi Male",flag:"hi",gender:"m",lang:"hi-IN",voiceIDs:[394]},{name:"Hungarian Female",flag:"hu",gender:"f",lang:"hu-HU",voiceIDs:[420,9,10,81,214,11]},{name:"Hungarian Male",flag:"hu",gender:"m",lang:"hu-HU",voiceIDs:[164],deprecated:!0},{name:"Indonesian Female",flag:"id",gender:"f",lang:"id-ID", +voiceIDs:[241,111,112,180,215,113]},{name:"Indonesian Male",flag:"id",gender:"m",lang:"id-ID",voiceIDs:[395]},{name:"Italian Female",flag:"it",gender:"f",lang:"it-IT",voiceIDs:[242,33,34,35,36,37,79,181,216,271,300,356,38]},{name:"Italian Male",flag:"it",gender:"m",lang:"it-IT",voiceIDs:[312,329,368,406]},{name:"Japanese Female",flag:"jp",gender:"f",lang:"ja-JP",voiceIDs:[51,280,217,52,153,182,273,302,358,274,303,359,53]},{name:"Japanese Male",flag:"jp",gender:"m",lang:"ja-JP",voiceIDs:[248,50,313, +330,369,396]},{name:"Korean Female",flag:"kr",gender:"f",lang:"ko-KR",voiceIDs:[54,55,56,156,183,218,306,323,362,384,57]},{name:"Korean Male",flag:"kr",gender:"m",lang:"ko-KR",voiceIDs:[397]},{name:"Latin Female",flag:"va",gender:"f",lang:"la",voiceIDs:[114],deprecated:!0},{name:"Latin Male",flag:"va",gender:"m",lang:"la",voiceIDs:[165]},{name:"Nepali",flag:"np",gender:"f",lang:"ne-NP",voiceIDs:[423,441]},{name:"Norwegian Female",flag:"no",gender:"f",lang:"nb-NO",voiceIDs:[422,72,73,221,74]},{name:"Norwegian Male", +flag:"no",gender:"m",lang:"nb-NO",voiceIDs:[166]},{name:"Polish Female",flag:"pl",gender:"f",lang:"pl-PL",voiceIDs:[244,120,119,121,185,222,267,296,352,122]},{name:"Polish Male",flag:"pl",gender:"m",lang:"pl-PL",voiceIDs:[314,331,370,398]},{name:"Portuguese Female",flag:"br",gender:"f",lang:"pt-BR",voiceIDs:[128,127,129,187,224,272,301,357,130]},{name:"Portuguese Male",flag:"br",gender:"m",lang:"pt-BR",voiceIDs:[400]},{name:"Romanian Female",flag:"ro",gender:"f",lang:"ro-RO",voiceIDs:[424,151,150, +152,225,46]},{name:"Russian Female",flag:"ru",gender:"f",lang:"ru-RU",voiceIDs:[246,47,48,83,188,226,260,289,345,49]},{name:"Russian Male",flag:"ru",gender:"m",lang:"ru-RU",voiceIDs:[316,333,372,387],deprecated:!0},{name:"Sinhala",flag:"lk",gender:"f",lang:"si-LK",voiceIDs:[425,442]},{name:"Slovak Female",flag:"sk",gender:"f",lang:"sk-SK",voiceIDs:[426,133,132,134,227,135]},{name:"Slovak Male",flag:"sk",gender:"m",lang:"sk-SK",voiceIDs:[167],deprecated:!0},{name:"Spanish Female",flag:"es",gender:"f", +lang:"es-ES",voiceIDs:[19,238,16,17,18,20,76,174,207,263,292,348,264,293,349,15]},{name:"Spanish Male",flag:"es",gender:"m",lang:"es-ES",voiceIDs:[309,326,365,401],deprecated:!0},{name:"Spanish Latin American Female",flag:"es",gender:"f",lang:"es-MX",voiceIDs:[239,137,136,138,175,208,265,294,350,139]},{name:"Spanish Latin American Male",flag:"es",gender:"m",lang:"es-MX",voiceIDs:[136,310,327,366,402]},{name:"Swedish Female",flag:"sv",gender:"f",lang:"sv-SE",voiceIDs:[427,85,149,228,65]},{name:"Swedish Male", +flag:"sv",gender:"m",lang:"sv-SE",voiceIDs:[148,168]},{name:"Tamil Female",flag:"hi",gender:"m",lang:"hi-IN",voiceIDs:[451]},{name:"Tamil Male",flag:"hi",gender:"m",lang:"hi-IN",voiceIDs:[141]},{name:"Thai Female",flag:"th",gender:"f",lang:"th-TH",voiceIDs:[143,142,144,189,229,145]},{name:"Thai Male",flag:"th",gender:"m",lang:"th-TH",voiceIDs:[403]},{name:"Turkish Female",flag:"tr",gender:"f",lang:"tr-TR",voiceIDs:[69,70,82,190,230,71]},{name:"Turkish Male",flag:"tr",gender:"m",lang:"tr-TR",voiceIDs:[404]}, +{name:"Ukrainian Female",flag:"ua",gender:"f",lang:"uk-UA",voiceIDs:[428,443]},{name:"Vietnamese Female",flag:"vi",gender:"f",lang:"vi-VN",voiceIDs:[429,405]},{name:"Vietnamese Male",flag:"vi",gender:"m",lang:"vi-VN",voiceIDs:[146]},{name:"Afrikaans Male",flag:"af",gender:"m",lang:"af-ZA",voiceIDs:[93]},{name:"Albanian Male",flag:"sq",gender:"m",lang:"sq-AL",voiceIDs:[94]},{name:"Bosnian Male",flag:"bs",gender:"m",lang:"bs",voiceIDs:[14]},{name:"Catalan Male",flag:"catalonia",gender:"m",lang:"ca-ES", +voiceIDs:[68]},{name:"Croatian Male",flag:"hr",gender:"m",lang:"hr-HR",voiceIDs:[13]},{name:"Esperanto Male",flag:"eo",gender:"m",lang:"eo",voiceIDs:[108]},{name:"Icelandic Male",flag:"is",gender:"m",lang:"is-IS",voiceIDs:[110]},{name:"Latvian Male",flag:"lv",gender:"m",lang:"lv-LV",voiceIDs:[115]},{name:"Macedonian Male",flag:"mk",gender:"m",lang:"mk-MK",voiceIDs:[116]},{name:"Moldavian Female",flag:"md",gender:"f",lang:"md",voiceIDs:[117]},{name:"Moldavian Male",flag:"md",gender:"m",lang:"md",voiceIDs:[117], +deprecated:!0},{name:"Montenegrin Male",flag:"me",gender:"m",lang:"me",voiceIDs:[118]},{name:"Serbian Male",flag:"sr",gender:"m",lang:"sr-RS",voiceIDs:[12]},{name:"Serbo-Croatian Male",flag:"hr",gender:"m",lang:"hr-HR",voiceIDs:[131]},{name:"Swahili Male",flag:"sw",gender:"m",lang:"sw-KE",voiceIDs:[140]},{name:"Welsh Male",flag:"cy",gender:"m",lang:"cy",voiceIDs:[147]},{name:"Fallback UK Female",flag:"gb",gender:"f",lang:"en-GB",voiceIDs:[8]}];a.voicecollection=[{name:"Google UK English Male"},{name:"Agnes"}, +{name:"Daniel Compact"},{name:"Google UK English Female"},{name:"en-GB",rate:.25,pitch:1},{name:"en-AU",rate:.25,pitch:1},{name:"ingl\u00e9s Reino Unido"},{name:"English United Kingdom"},{name:"Fallback en-GB Female",lang:"en-GB",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Eszter Compact"},{name:"hu-HU",rate:.4},{name:"Fallback Hungarian Female",lang:"hu",fallbackvoice:!0,service:"g1"},{name:"Fallback Serbian Male",lang:"sr",fallbackvoice:!0,service:"g1",gender:"male"},{name:"Fallback Croatian Male", +lang:"hr",fallbackvoice:!0,service:"g1",gender:"male"},{name:"Fallback Bosnian Male",lang:"bs",fallbackvoice:!0,service:"g1",gender:"male"},{name:"Fallback Spanish Female",lang:"es",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Spanish Spain"},{name:"espa\u00f1ol Espa\u00f1a"},{name:"Diego Compact",rate:.3},{name:"Google Espa\u00f1ol"},{name:"es-ES",rate:.2},{name:"Google Fran\u00e7ais"},{name:"French France"},{name:"franc\u00e9s Francia"},{name:"Virginie Compact",rate:.5},{name:"fr-FR",rate:.25}, +{name:"Fallback French Female",lang:"fr",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Google Deutsch"},{name:"German Germany"},{name:"alem\u00e1n Alemania"},{name:"Yannick Compact",rate:.5},{name:"de-DE",rate:.25},{name:"Fallback Deutsch Female",lang:"de",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Google Italiano"},{name:"Italian Italy"},{name:"italiano Italia"},{name:"Paolo Compact",rate:.5},{name:"it-IT",rate:.25},{name:"Fallback Italian Female",lang:"it",fallbackvoice:!0,service:"g1", +gender:"female"},{name:"Google US English",timerSpeed:1},{name:"English United States"},{name:"ingl\u00e9s Estados Unidos"},{name:"Vicki"},{name:"en-US",rate:.2,pitch:1,timerSpeed:1.3},{name:"Fallback US English",lang:"en-US",fallbackvoice:!0,timerSpeed:0,service:"g1",gender:"female"},{name:"Fallback Dutch Female",lang:"nl",fallbackvoice:!0,timerSpeed:0,service:"g1",gender:"female"},{name:"Fallback Romanian",lang:"ro",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Milena Compact"},{name:"ru-RU", +rate:.25},{name:"Fallback Russian",lang:"ru",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Google \u65e5\u672c\u4eba",timerSpeed:1},{name:"Kyoko Compact"},{name:"ja-JP",rate:.25},{name:"Fallback Japanese Female",lang:"ja",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Google \ud55c\uad6d\uc758",timerSpeed:1},{name:"Narae Compact"},{name:"ko-KR",rate:.25},{name:"Fallback Korean Female",lang:"ko",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Google \u4e2d\u56fd\u7684",timerSpeed:1}, +{name:"Ting-Ting Compact"},{name:"zh-CN",rate:.25},{name:"Fallback Chinese",lang:"zh-CN",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Alexandros Compact"},{name:"el-GR",rate:.25},{name:"Fallback Greek",lang:"el",fallbackvoice:!0,service:"g3",gender:"female"},{name:"Fallback Swedish",lang:"sv",fallbackvoice:!0,service:"g3",gender:"female"},{name:"hi-IN",rate:.25},{name:"Fallback Hindi Female",lang:"hi",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Fallback Catalan",lang:"ca",fallbackvoice:!0, +service:"g1",gender:"male"},{name:"Aylin Compact"},{name:"tr-TR",rate:.25},{name:"Fallback Turkish",lang:"tr",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Stine Compact"},{name:"no-NO",rate:.25},{name:"Fallback Norwegian",lang:"no",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Daniel"},{name:"Monica"},{name:"Amelie"},{name:"Anna"},{name:"Alice"},{name:"Melina"},{name:"Mariska"},{name:"Yelda"},{name:"Milena"},{name:"Xander"},{name:"Alva"},{name:"Lee Compact"},{name:"Karen"},{name:"Fallback Australian Female", +lang:"en-AU",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Mikko Compact"},{name:"Satu"},{name:"fi-FI",rate:.25},{name:"Fallback Finnish",lang:"fi",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Fallback Afrikans",lang:"af",fallbackvoice:!0,service:"g1",gender:"male"},{name:"Fallback Albanian",lang:"sq",fallbackvoice:!0,service:"g1",gender:"male"},{name:"Maged Compact"},{name:"Tarik"},{name:"ar-SA",rate:.25},{name:"Fallback Arabic",lang:"ar",fallbackvoice:!0,service:"g1",gender:"female"}, +{name:"Fallback Armenian",lang:"hy",fallbackvoice:!0,service:"g1",gender:"male"},{name:"Zuzana Compact"},{name:"Zuzana"},{name:"cs-CZ",rate:.25},{name:"Fallback Czech",lang:"cs",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Ida Compact"},{name:"Sara"},{name:"da-DK",rate:.25},{name:"Fallback Danish",lang:"da",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Fallback Esperanto",lang:"eo",fallbackvoice:!0,service:"g1",gender:"male"},{name:"Fallback Haitian Creole",lang:"ht",fallbackvoice:!0}, +{name:"Fallback Icelandic",lang:"is",fallbackvoice:!0,service:"g1",gender:"male"},{name:"Damayanti"},{name:"id-ID",rate:.25},{name:"Fallback Indonesian Female",lang:"id",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Fallback Latin Female",lang:"la",fallbackvoice:!0,service:"g2",gender:"female"},{name:"Fallback Latvian Male",lang:"lv",fallbackvoice:!0,service:"g1",gender:"male"},{name:"Fallback Macedonian Male",lang:"mk",fallbackvoice:!0,service:"g1",gender:"male"},{name:"Fallback Moldavian Female", +lang:"mo",fallbackvoice:!0,service:"g2",gender:"female"},{name:"Fallback Montenegrin Male",lang:"sr-ME",fallbackvoice:!0,service:"g1",gender:"male"},{name:"Agata Compact"},{name:"Zosia"},{name:"pl-PL",rate:.25},{name:"Fallback Polish Female",lang:"pl",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Raquel Compact"},{name:"Luciana"},{name:"pt-BR",rate:.25},{name:"Fallback Brazilian Portuguese Female",lang:"pt-BR",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Joana Compact"},{name:"Joana"}, +{name:"pt-PT",rate:.25},{name:"Fallback Portuguese",lang:"pt-PT",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Fallback Serbo-Croation",lang:"sh",fallbackvoice:!0,service:"g2",gender:"male"},{name:"Laura Compact"},{name:"Laura"},{name:"sk-SK",rate:.25},{name:"Fallback Slovak",lang:"sk",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Javier Compact"},{name:"Paulina"},{name:"es-MX",rate:.25},{name:"Fallback Spanish (Latin American) Female",lang:"es-419",fallbackvoice:!0,service:"g1",gender:"female"}, +{name:"Fallback Swahili",lang:"sw",fallbackvoice:!0,service:"g1",gender:"male"},{name:"Fallback Tamil",lang:"ta",fallbackvoice:!0,service:"g1",gender:"male"},{name:"Narisa Compact"},{name:"Kanya"},{name:"th-TH",rate:.25},{name:"Fallback Thai Female",lang:"th",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Fallback Vietnamese Male",lang:"vi",fallbackvoice:!0,service:"g3",gender:"male"},{name:"Fallback Welsh",lang:"cy",fallbackvoice:!0,service:"g1",gender:"male"},{name:"Oskar Compact"},{name:"sv-SE", +rate:.25},{name:"Simona Compact"},{name:"Ioana"},{name:"ro-RO",rate:.25},{name:"Kyoko"},{name:"Lekha"},{name:"Ting-Ting"},{name:"Yuna"},{name:"Xander Compact"},{name:"nl-NL",rate:.25},{name:"Fallback UK English Male",lang:"en-GB",fallbackvoice:!0,service:"g1",voicename:"rjs",gender:"male"},{name:"Finnish Male",lang:"fi",fallbackvoice:!0,service:"g3",voicename:"",gender:"male",deprecated:!0},{name:"Czech Male",lang:"cs",fallbackvoice:!0,service:"g3",voicename:"",gender:"male",deprecated:!0},{name:"Danish Male", +lang:"da",fallbackvoice:!0,service:"g3",voicename:"",gender:"male",deprecated:!0},{name:"Greek Male",lang:"el",fallbackvoice:!0,service:"g3",voicename:"",gender:"male",deprecated:!0},{name:"Hungarian Male",lang:"hu",fallbackvoice:!0,service:"g3",voicename:"",gender:"male",deprecated:!0},{name:"Latin Male",lang:"la",fallbackvoice:!0,service:"g1",voicename:"",gender:"male"},{name:"Norwegian Male",lang:"no",fallbackvoice:!0,service:"g3",voicename:"",gender:"male"},{name:"Slovak Male",lang:"sk",fallbackvoice:!0, +service:"g3",voicename:"",gender:"male",deprecated:!0},{name:"Swedish Male",lang:"sv",fallbackvoice:!0,service:"g3",voicename:"",gender:"male"},{name:"Fallback US English Male",lang:"en-US",fallbackvoice:!0,service:"g3",voicename:"",gender:"male"},{name:"German Germany",lang:"de_DE"},{name:"English United Kingdom",lang:"en_GB"},{name:"English India",lang:"en_IN"},{name:"English United States",lang:"en_US"},{name:"Spanish Spain",lang:"es_ES"},{name:"Spanish Mexico",lang:"es_MX"},{name:"Spanish United States", +lang:"es_US"},{name:"French Belgium",lang:"fr_BE"},{name:"French France",lang:"fr_FR"},{name:"Hindi India",lang:"hi_IN"},{name:"Indonesian Indonesia",lang:"in_ID"},{name:"Italian Italy",lang:"it_IT"},{name:"Japanese Japan",lang:"ja_JP"},{name:"Korean South Korea",lang:"ko_KR"},{name:"Dutch Netherlands",lang:"nl_NL"},{name:"Polish Poland",lang:"pl_PL"},{name:"Portuguese Brazil",lang:"pt_BR"},{name:"Portuguese Portugal",lang:"pt_PT"},{name:"Russian Russia",lang:"ru_RU"},{name:"Thai Thailand",lang:"th_TH"}, +{name:"Turkish Turkey",lang:"tr_TR"},{name:"Chinese China",lang:"zh_CN_#Hans"},{name:"Chinese Hong Kong",lang:"zh_HK_#Hans"},{name:"Chinese Hong Kong",lang:"zh_HK_#Hant"},{name:"Chinese Taiwan",lang:"zh_TW_#Hant"},{name:"Alex"},{name:"Maged",lang:"ar-SA"},{name:"Zuzana",lang:"cs-CZ"},{name:"Sara",lang:"da-DK"},{name:"Anna",lang:"de-DE"},{name:"Melina",lang:"el-GR"},{name:"Karen",lang:"en-AU"},{name:"Daniel",lang:"en-GB"},{name:"Moira",lang:"en-IE"},{name:"Samantha (Enhanced)",lang:"en-US"},{name:"Samantha", +lang:"en-US"},{name:"Tessa",lang:"en-ZA"},{name:"Monica",lang:"es-ES"},{name:"Paulina",lang:"es-MX"},{name:"Satu",lang:"fi-FI"},{name:"Amelie",lang:"fr-CA"},{name:"Thomas",lang:"fr-FR"},{name:"Carmit",lang:"he-IL"},{name:"Lekha",lang:"hi-IN"},{name:"Mariska",lang:"hu-HU"},{name:"Damayanti",lang:"id-ID"},{name:"Alice",lang:"it-IT"},{name:"Kyoko",lang:"ja-JP"},{name:"Yuna",lang:"ko-KR"},{name:"Ellen",lang:"nl-BE"},{name:"Xander",lang:"nl-NL"},{name:"Nora",lang:"no-NO"},{name:"Zosia",lang:"pl-PL"},{name:"Luciana", +lang:"pt-BR"},{name:"Joana",lang:"pt-PT"},{name:"Ioana",lang:"ro-RO"},{name:"Milena",lang:"ru-RU"},{name:"Laura",lang:"sk-SK"},{name:"Alva",lang:"sv-SE"},{name:"Kanya",lang:"th-TH"},{name:"Yelda",lang:"tr-TR"},{name:"Ting-Ting",lang:"zh-CN"},{name:"Sin-Ji",lang:"zh-HK"},{name:"Mei-Jia",lang:"zh-TW"},{name:"Microsoft David Mobile - English (United States)",lang:"en-US"},{name:"Microsoft Zira Mobile - English (United States)",lang:"en-US"},{name:"Microsoft Mark Mobile - English (United States)",lang:"en-US"}, +{name:"native",lang:""},{name:"Google espa\u00f1ol"},{name:"Google espa\u00f1ol de Estados Unidos"},{name:"Google fran\u00e7ais"},{name:"Google Bahasa Indonesia"},{name:"Google italiano"},{name:"Google Nederlands"},{name:"Google polski"},{name:"Google portugu\u00eas do Brasil"},{name:"Google \u0440\u0443\u0441\u0441\u043a\u0438\u0439"},{name:"Google \u0939\u093f\u0928\u094d\u0926\u0940"},{name:"Google \u65e5\u672c\u8a9e"},{name:"Google \u666e\u901a\u8bdd\uff08\u4e2d\u56fd\u5927\u9646\uff09"},{name:"Google \u7ca4\u8a9e\uff08\u9999\u6e2f\uff09"}, +{name:"zh-HK",rate:.25},{name:"Fallback Chinese (Hong Kong) Female",lang:"zh-HK",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Google \u7ca4\u8a9e\uff08\u9999\u6e2f\uff09"},{name:"zh-TW",rate:.25},{name:"Fallback Chinese (Taiwan) Female",lang:"zh-TW",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Microsoft George Mobile - English (United Kingdom)",lang:"en-GB"},{name:"Microsoft Susan Mobile - English (United Kingdom)",lang:"en-GB"},{name:"Microsoft Hazel Mobile - English (United Kingdom)", +lang:"en-GB"},{name:"Microsoft Heera Mobile - English (India)",lang:"en-In"},{name:"Microsoft Irina Mobile - Russian (Russia)",lang:"ru-RU"},{name:"Microsoft Hedda Mobile - German (Germany)",lang:"de-DE"},{name:"Microsoft Katja Mobile - German (Germany)",lang:"de-DE"},{name:"Microsoft Helena Mobile - Spanish (Spain)",lang:"es-ES"},{name:"Microsoft Laura Mobile - Spanish (Spain)",lang:"es-ES"},{name:"Microsoft Sabina Mobile - Spanish (Mexico)",lang:"es-MX"},{name:"Microsoft Julie Mobile - French (France)", +lang:"fr-FR"},{name:"Microsoft Paulina Mobile - Polish (Poland)",lang:"pl-PL"},{name:"Microsoft Huihui Mobile - Chinese (Simplified, PRC)",lang:"zh-CN"},{name:"Microsoft Yaoyao Mobile - Chinese (Simplified, PRC)",lang:"zh-CN"},{name:"Microsoft Tracy Mobile - Chinese (Traditional, Hong Kong S.A.R.)",lang:"zh-CN"},{name:"Microsoft Elsa Mobile - Italian (Italy)",lang:"it-IT"},{name:"Microsoft Maria Mobile - Portuguese (Brazil)",lang:"pt-BR"},{name:"Microsoft Ayumi Mobile - Japanese (Japan)",lang:"ja-JP"}, +{name:"Microsoft Haruka Mobile - Japanese (Japan)",lang:"ja-JP"},{name:"Helena",lang:"de-DE"},{name:"Catherine",lang:"en-AU"},{name:"Arthur",lang:"en-GB"},{name:"Martha",lang:"en-GB"},{name:"Marie",lang:"fr-FR"},{name:"O-ren",lang:"ja-JP"},{name:"Yu-shu",lang:"zh-CN"},{name:"Microsoft David - English (United States)",lang:"en-US"},{name:"Microsoft Zira - English (United States)",lang:"en-US"},{name:"Microsoft Mark - English (United States)",lang:"en-US"},{name:"Microsoft George - English (United Kingdom)", +lang:"en-GB"},{name:"Microsoft Susan - English (United Kingdom)",lang:"en-GB"},{name:"Microsoft Hazel - English (United Kingdom)",lang:"en-GB"},{name:"Microsoft Heera - English (India)",lang:"en-In"},{name:"Microsoft Irina - Russian (Russia)",lang:"ru-RU"},{name:"Microsoft Hedda - German (Germany)",lang:"de-DE"},{name:"Microsoft Katja - German (Germany)",lang:"de-DE"},{name:"Microsoft Helena - Spanish (Spain)",lang:"es-ES"},{name:"Microsoft Laura - Spanish (Spain)",lang:"es-ES"},{name:"Microsoft Sabina - Spanish (Mexico)", +lang:"es-MX"},{name:"Microsoft Julie - French (France)",lang:"fr-FR"},{name:"Microsoft Paulina - Polish (Poland)",lang:"pl-PL"},{name:"Microsoft Huihui - Chinese (Simplified, PRC)",lang:"zh-CN"},{name:"Microsoft Yaoyao - Chinese (Simplified, PRC)",lang:"zh-CN"},{name:"Microsoft Tracy - Chinese (Traditional, Hong Kong S.A.R.)",lang:"zh-CN"},{name:"Microsoft Elsa - Italian (Italy)",lang:"it-IT"},{name:"Microsoft Maria - Portuguese (Brazil)",lang:"pt-BR"},{name:"Microsoft Ayumi - Japanese (Japan)",lang:"ja-JP"}, +{name:"Microsoft Haruka - Japanese (Japan)",lang:"ja-JP"},{name:"Microsoft Hortense - French (France)",lang:"fr-FR"},{name:"Microsoft Hanhan - Chinese (Traditional, Taiwan)",lang:"zh-TW"},{name:"Microsoft Heami - Korean (Korean)",lang:"ko-KR"},{name:"Microsoft Stefan - German (Germany)",lang:"de-DE"},{name:"Microsoft Ravi - English (India)",lang:"en-IN"},{name:"Microsoft Pablo - Spanish (Spain)",lang:"es-ES"},{name:"Microsoft Raul - Spanish (Mexico)",lang:"es-MX"},{name:"Microsoft Paul - French (France)", +lang:"fr-FR"},{name:"Microsoft Cosimo - Italian (Italy)",lang:"it-IT"},{name:"Microsoft Ichiro - Japanese (Japan)",lang:"ja-JP"},{name:"Microsoft Adam - Polish (Poland)",lang:"pl-PL"},{name:"Microsoft Daniel - Portuguese (Brazil)",lang:"pt-BR"},{name:"Microsoft Pavel - Russian (Russia)",lang:"ru-RU"},{name:"Microsoft Kangkang - Chinese (Simplified, PRC)",lang:"zh-CN"},{name:"Microsoft Danny - Chinese (Traditional, Hong Kong S.A.R.)",lang:"zh-HK"},{name:"Microsoft Yating - Chinese (Traditional, Taiwan)", +lang:"zh-TW"},{name:"Microsoft Zhiwei - Chinese (Traditional, Taiwan)",lang:"zh-TW"},{name:"Microsoft Hortense Mobile - French (France)",lang:"fr-FR"},{name:"Microsoft Hanhan Mobile - Chinese (Traditional, Taiwan)",lang:"zh-TW"},{name:"Microsoft Heami Mobile - Korean (Korean)",lang:"ko-KR"},{name:"Microsoft Stefan Mobile - German (Germany)",lang:"de-DE"},{name:"Microsoft Ravi Mobile - English (India)",lang:"en-IN"},{name:"Microsoft Pablo Mobile - Spanish (Spain)",lang:"es-ES"},{name:"Microsoft Raul Mobile - Spanish (Mexico)", +lang:"es-MX"},{name:"Microsoft Paul Mobile - French (France)",lang:"fr-FR"},{name:"Microsoft Cosimo Mobile - Italian (Italy)",lang:"it-IT"},{name:"Microsoft Ichiro Mobile - Japanese (Japan)",lang:"ja-JP"},{name:"Microsoft Adam Mobile - Polish (Poland)",lang:"pl-PL"},{name:"Microsoft Daniel Mobile - Portuguese (Brazil)",lang:"pt-BR"},{name:"Microsoft Pavel Mobile - Russian (Russia)",lang:"ru-RU"},{name:"Microsoft Kangkang Mobile - Chinese (Simplified, PRC)",lang:"zh-CN"},{name:"Microsoft Danny Mobile - Chinese (Traditional, Hong Kong S.A.R.)", +lang:"zh-HK"},{name:"Microsoft Yating Mobile - Chinese (Traditional, Taiwan)",lang:"zh-TW"},{name:"Microsoft Zhiwei Mobile - Chinese (Traditional, Taiwan)",lang:"zh-TW"},{name:"Microsoft David Desktop - English (United States)",lang:"en-US"},{name:"Microsoft Zira Desktop - English (United States)",lang:"en-US"},{name:"Microsoft Mark Desktop - English (United States)",lang:"en-US"},{name:"Microsoft George Desktop - English (United Kingdom)",lang:"en-GB"},{name:"Microsoft Susan Desktop - English (United Kingdom)", +lang:"en-GB"},{name:"Microsoft Hazel Desktop - English (United Kingdom)",lang:"en-GB"},{name:"Microsoft Heera Desktop - English (India)",lang:"en-In"},{name:"Microsoft Irina Desktop - Russian (Russia)",lang:"ru-RU"},{name:"Microsoft Hedda Desktop - German (Germany)",lang:"de-DE"},{name:"Microsoft Katja Desktop - German (Germany)",lang:"de-DE"},{name:"Microsoft Helena Desktop - Spanish (Spain)",lang:"es-ES"},{name:"Microsoft Laura Desktop - Spanish (Spain)",lang:"es-ES"},{name:"Microsoft Sabina Desktop - Spanish (Mexico)", +lang:"es-MX"},{name:"Microsoft Julie Desktop - French (France)",lang:"fr-FR"},{name:"Microsoft Paulina Desktop - Polish (Poland)",lang:"pl-PL"},{name:"Microsoft Huihui Desktop - Chinese (Simplified, PRC)",lang:"zh-CN"},{name:"Microsoft Yaoyao Desktop - Chinese (Simplified, PRC)",lang:"zh-CN"},{name:"Microsoft Tracy Desktop - Chinese (Traditional, Hong Kong S.A.R.)",lang:"zh-CN"},{name:"Microsoft Elsa Desktop - Italian (Italy)",lang:"it-IT"},{name:"Microsoft Maria Desktop - Portuguese (Brazil)",lang:"pt-BR"}, +{name:"Microsoft Ayumi Desktop - Japanese (Japan)",lang:"ja-JP"},{name:"Microsoft Haruka Desktop - Japanese (Japan)",lang:"ja-JP"},{name:"Microsoft Hortense Desktop - French (France)",lang:"fr-FR"},{name:"Microsoft Hanhan Desktop - Chinese (Traditional, Taiwan)",lang:"zh-TW"},{name:"Microsoft Heami Desktop - Korean (Korean)",lang:"ko-KR"},{name:"Microsoft Stefan Desktop - German (Germany)",lang:"de-DE"},{name:"Microsoft Ravi Desktop - English (India)",lang:"en-IN"},{name:"Microsoft Pablo Desktop - Spanish (Spain)", +lang:"es-ES"},{name:"Microsoft Raul Desktop - Spanish (Mexico)",lang:"es-MX"},{name:"Microsoft Paul Desktop - French (France)",lang:"fr-FR"},{name:"Microsoft Cosimo Desktop - Italian (Italy)",lang:"it-IT"},{name:"Microsoft Ichiro Desktop - Japanese (Japan)",lang:"ja-JP"},{name:"Microsoft Adam Desktop - Polish (Poland)",lang:"pl-PL"},{name:"Microsoft Daniel Desktop - Portuguese (Brazil)",lang:"pt-BR"},{name:"Microsoft Pavel Desktop - Russian (Russia)",lang:"ru-RU"},{name:"Microsoft Kangkang Desktop - Chinese (Simplified, PRC)", +lang:"zh-CN"},{name:"Microsoft Danny Desktop - Chinese (Traditional, Hong Kong S.A.R.)",lang:"zh-HK"},{name:"Microsoft Yating Desktop - Chinese (Traditional, Taiwan)",lang:"zh-TW"},{name:"Microsoft Zhiwei Desktop - Chinese (Traditional, Taiwan)",lang:"zh-TW"},{name:"Martin",lang:"de-DE"},{name:"Daniel",lang:"fr-FR"},{name:"Hattori",lang:"ja-JP"},{name:"Li-mu",lang:"zh-CN"},{name:"Gordon",lang:"en-AU"},{name:"Aaron",lang:"en-US"},{name:"Nicky",lang:"en-US"},{name:"Microsoft Hanhan Desktop - Chinese (Taiwan)", +lang:"zh-TW"},{name:"Microsoft Heami Desktop - Korean",lang:"ko-KR"},{name:"Fallback Australian Male",lang:"en-AU",fallbackvoice:!0,service:"g3",gender:"male"},{name:"Fallback Russian Male",lang:"ru",fallbackvoice:!0,service:"g3",gender:"male",deprecated:!0},{name:"Fallback Arabic Male",lang:"ar",fallbackvoice:!0,service:"g3",gender:"male"},{name:"Fallback Chinese",lang:"zh-CN",fallbackvoice:!0,service:"g3",gender:"male"},{name:"Fallback Chinese HK",lang:"zh-HK",fallbackvoice:!0,service:"g3",gender:"male"}, +{name:"Fallback Chinese TW",lang:"zh-TW",fallbackvoice:!0,service:"g3",gender:"male"},{name:"Fallback French Male",lang:"fr",fallbackvoice:!0,service:"g3",gender:"male"},{name:"Fallback Deutsch Male",lang:"de",fallbackvoice:!0,service:"g3",gender:"male"},{name:"Fallback Hindi Male",lang:"hi",fallbackvoice:!0,service:"g3",gender:"male"},{name:"Fallback Indonesian Male",lang:"id",fallbackvoice:!0,service:"g3",gender:"male"},{name:"Fallback Japanese Male",lang:"ja",fallbackvoice:!0,service:"g3",gender:"male"}, +{name:"Fallback Korean Male",lang:"ko",fallbackvoice:!0,service:"g3",gender:"male"},{name:"Fallback Polish Male",lang:"pl",fallbackvoice:!0,service:"g1",gender:"male"},{name:"Fallback Brazilian Portuguese Male",lang:"pt-BR",fallbackvoice:!0,service:"g3",gender:"male",deprecated:!0},{name:"Fallback Portuguese Male",lang:"pt-PT",fallbackvoice:!0,service:"g1",gender:"male"},{name:"Fallback Spanish Male",lang:"es",fallbackvoice:!0,service:"g3",gender:"male",deprecated:!0},{name:"Fallback Spanish (Latin American) Male", +lang:"es-419",fallbackvoice:!0,service:"g3",gender:"male"},{name:"Fallback Thai Male",lang:"th",fallbackvoice:!0,service:"g3",gender:"male"},{name:"Fallback Turkish Male",lang:"tr",fallbackvoice:!0,service:"g3",gender:"male"},{name:"Fallback Vietnamese Female",lang:"vi",fallbackvoice:!0,service:"g1",gender:"female"},{name:"Fallback Italian Male",lang:"it",fallbackvoice:!0,service:"g3",gender:"male"},{name:"Fallback Dutch Male",lang:"nl",fallbackvoice:!0,timerSpeed:0,service:"g3",gender:"male"},{name:"Microsoft Anna - English (United States)", +lang:"en-US",gender:"female"},{name:"Microsoft Lili - Chinese (China)",lang:"zh-CN",gender:"female"},{name:"Bangla Bangladesh",lang:"bn_BD",gender:"male"},{name:"Bangla India",lang:"bn_IN",gender:"male"},{name:"Czech Czechia",lang:"cs_CZ",gender:"female"},{name:"Danish Denmark",lang:"da_DK",gender:"female"},{name:"Greek Greece",lang:"el_GR",gender:"female"},{name:"English Australia",lang:"en_AU",gender:"female"},{name:"Estonian Estonia",lang:"et_EE",gender:"male"},{name:"Finnish Finland",lang:"fi_FI", +gender:"female"},{name:"Filipino Philippines",lang:"fil_PH",gender:"female"},{name:"French Canada",lang:"fr_CAF",gender:"female"},{name:"Hungarian Hungary",lang:"hu_HU",gender:"female"},{name:"Khmer Cambodia",lang:"km_KH",gender:"female"},{name:"Norwegian Bokm\u00e5l Norway",lang:"nb_NO",gender:"female"},{name:"Nepali Nepal",lang:"ne_NP",gender:"female"},{name:"Romanian Romania",lang:"ro_RO",gender:"female"},{name:"Sinhala Sri Lanka",lang:"si_LK",gender:"female"},{name:"Slovak Slovakia",lang:"sk_SK", +gender:"female"},{name:"Swedish Sweden",lang:"sv_SE",gender:"female"},{name:"Ukrainian Ukraine",lang:"uk_UA",gender:"female"},{name:"Vietnamese Vietnam",lang:"vi_VN",gender:"female"},{name:"Cantonese Hong Kong",lang:"yue_HK_#Hant",gender:"female"},{name:"Microsoft Server Speech Text to Speech Voice (en-US, Guy24kRUS)",lang:"en-US",gender:"male"},{name:"Microsoft Server Speech Text to Speech Voice (en-US, Jessa24kRUS)",lang:"en-US",gender:"female"},{name:"Microsoft Server Speech Text to Speech Voice (en-US, JessaRUS)", +lang:"en-US",gender:"female"},{name:"Microsoft Server Speech Text to Speech Voice (en-US, ZiraRUS)",lang:"en-US",gender:"female"},{name:"Fallback Bangla Bangladeh Female",lang:"bn-BD",fallbackvoice:!0,timerSpeed:0,service:"g3",gender:"female"},{name:"Fallback Bangla Bangladeh Male",lang:"bn-BD",fallbackvoice:!0,timerSpeed:0,service:"g3",gender:"male"},{name:"Fallback Filipino Female",lang:"fil-PH",fallbackvoice:!0,timerSpeed:0,service:"g3",gender:"female"},{name:"Fallback Filipino Male",lang:"fil-PH", +fallbackvoice:!0,timerSpeed:0,service:"g3",gender:"male"},{name:"Fallback Cambodian Khmer Female",lang:"km-KH",fallbackvoice:!0,timerSpeed:0,service:"g3",gender:"female"},{name:"Fallback Cambodian Khmer Male",lang:"km-KH",fallbackvoice:!0,timerSpeed:0,service:"g3",gender:"male"},{name:"Fallback Nepali Female",lang:"ne-NP",fallbackvoice:!0,timerSpeed:0,service:"g3",gender:"female"},{name:"Fallback Sinhala Female",lang:"si-LK",fallbackvoice:!0,timerSpeed:0,service:"g3",gender:"female"},{name:"Fallback Ukrainian Female", +lang:"uk-UA",fallbackvoice:!0,timerSpeed:0,service:"g3",gender:"female"},{name:"Fallback Cantonese Hong Kong Female",lang:"yue-HK",fallbackvoice:!0,timerSpeed:0,service:"g3",gender:"female"},{name:"Fallback Cantonese Hong Kong Male",lang:"yue-HK",fallbackvoice:!0,timerSpeed:0,service:"g3",gender:"male"},{name:"Fallback Estonian Male",lang:"et-EE",fallbackvoice:!0,timerSpeed:0,service:"g3",gender:"male"},{name:"Fallback Bangla India Female",lang:"bn-IN",fallbackvoice:!0,timerSpeed:0,service:"g3",gender:"female"}, +{name:"Fallback Bangla India Male",lang:"bn-IN",fallbackvoice:!0,timerSpeed:0,service:"g3",gender:"male"},{name:"Fallback French Canadian Female",lang:"fr-CA",fallbackvoice:!0,timerSpeed:0,service:"g3",gender:"female"},{name:"Fallback French Canadian Male",lang:"fr-CA",fallbackvoice:!0,timerSpeed:0,service:"g3",gender:"male"},{name:"Fallback Tamil",lang:"ta",fallbackvoice:!0,service:"g1",gender:"female"}];a.iOS=/(iPad|iPhone|iPod)/g.test(navigator.userAgent);a.iOS9=/(iphone|ipod|ipad).* os 9_/.test(navigator.userAgent.toLowerCase()); +a.iOS10=/(iphone|ipod|ipad).* os 10_/.test(navigator.userAgent.toLowerCase());a.iOS11=/(iphone|ipod|ipad).* os 11_/.test(navigator.userAgent.toLowerCase());a.iOS9plus=/(iphone|ipod|ipad).* os 10_/.test(navigator.userAgent.toLowerCase())||/(iphone|ipod|ipad).* os 10_/.test(navigator.userAgent.toLowerCase());a.iOS12_0=/(iphone|ipod|ipad).* os 12_0/.test(navigator.userAgent.toLowerCase());a.iOS12=/(iphone|ipod|ipad).* os 12_/.test(navigator.userAgent.toLowerCase());a.iOS13_0=/(iphone|ipod|ipad).* os 13_0/.test(navigator.userAgent.toLowerCase()); +a.iOS13=/(iphone|ipod|ipad).* os 13/.test(navigator.userAgent.toLowerCase());a.is_chrome=-1<navigator.userAgent.indexOf("Chrome");a.is_safari=-1<navigator.userAgent.indexOf("Safari");a.is_chrome&&a.is_safari&&(a.is_safari=!1);a.is_opera=!!window.opera||0<=navigator.userAgent.indexOf(" OPR/");a.is_android=-1<navigator.userAgent.toLowerCase().indexOf("android");a.iOS_initialized=!1;a.iOS9_initialized=!1;a.iOS10_initialized=!1;a.iOS11_initialized=!1;a.cache_ios_voices=[{name:"he-IL",voiceURI:"he-IL", +lang:"he-IL"},{name:"th-TH",voiceURI:"th-TH",lang:"th-TH"},{name:"pt-BR",voiceURI:"pt-BR",lang:"pt-BR"},{name:"sk-SK",voiceURI:"sk-SK",lang:"sk-SK"},{name:"fr-CA",voiceURI:"fr-CA",lang:"fr-CA"},{name:"ro-RO",voiceURI:"ro-RO",lang:"ro-RO"},{name:"no-NO",voiceURI:"no-NO",lang:"no-NO"},{name:"fi-FI",voiceURI:"fi-FI",lang:"fi-FI"},{name:"pl-PL",voiceURI:"pl-PL",lang:"pl-PL"},{name:"de-DE",voiceURI:"de-DE",lang:"de-DE"},{name:"nl-NL",voiceURI:"nl-NL",lang:"nl-NL"},{name:"id-ID",voiceURI:"id-ID",lang:"id-ID"}, +{name:"tr-TR",voiceURI:"tr-TR",lang:"tr-TR"},{name:"it-IT",voiceURI:"it-IT",lang:"it-IT"},{name:"pt-PT",voiceURI:"pt-PT",lang:"pt-PT"},{name:"fr-FR",voiceURI:"fr-FR",lang:"fr-FR"},{name:"ru-RU",voiceURI:"ru-RU",lang:"ru-RU"},{name:"es-MX",voiceURI:"es-MX",lang:"es-MX"},{name:"zh-HK",voiceURI:"zh-HK",lang:"zh-HK"},{name:"sv-SE",voiceURI:"sv-SE",lang:"sv-SE"},{name:"hu-HU",voiceURI:"hu-HU",lang:"hu-HU"},{name:"zh-TW",voiceURI:"zh-TW",lang:"zh-TW"},{name:"es-ES",voiceURI:"es-ES",lang:"es-ES"},{name:"zh-CN", +voiceURI:"zh-CN",lang:"zh-CN"},{name:"nl-BE",voiceURI:"nl-BE",lang:"nl-BE"},{name:"en-GB",voiceURI:"en-GB",lang:"en-GB"},{name:"ar-SA",voiceURI:"ar-SA",lang:"ar-SA"},{name:"ko-KR",voiceURI:"ko-KR",lang:"ko-KR"},{name:"cs-CZ",voiceURI:"cs-CZ",lang:"cs-CZ"},{name:"en-ZA",voiceURI:"en-ZA",lang:"en-ZA"},{name:"en-AU",voiceURI:"en-AU",lang:"en-AU"},{name:"da-DK",voiceURI:"da-DK",lang:"da-DK"},{name:"en-US",voiceURI:"en-US",lang:"en-US"},{name:"en-IE",voiceURI:"en-IE",lang:"en-IE"},{name:"hi-IN",voiceURI:"hi-IN", +lang:"hi-IN"},{name:"el-GR",voiceURI:"el-GR",lang:"el-GR"},{name:"ja-JP",voiceURI:"ja-JP",lang:"ja-JP"}];a.cache_ios9_voices=[{name:"Maged",voiceURI:"com.apple.ttsbundle.Maged-compact",lang:"ar-SA",localService:!0,"default":!0},{name:"Zuzana",voiceURI:"com.apple.ttsbundle.Zuzana-compact",lang:"cs-CZ",localService:!0,"default":!0},{name:"Sara",voiceURI:"com.apple.ttsbundle.Sara-compact",lang:"da-DK",localService:!0,"default":!0},{name:"Anna",voiceURI:"com.apple.ttsbundle.Anna-compact",lang:"de-DE", +localService:!0,"default":!0},{name:"Melina",voiceURI:"com.apple.ttsbundle.Melina-compact",lang:"el-GR",localService:!0,"default":!0},{name:"Karen",voiceURI:"com.apple.ttsbundle.Karen-compact",lang:"en-AU",localService:!0,"default":!0},{name:"Daniel",voiceURI:"com.apple.ttsbundle.Daniel-compact",lang:"en-GB",localService:!0,"default":!0},{name:"Moira",voiceURI:"com.apple.ttsbundle.Moira-compact",lang:"en-IE",localService:!0,"default":!0},{name:"Samantha (Enhanced)",voiceURI:"com.apple.ttsbundle.Samantha-premium", +lang:"en-US",localService:!0,"default":!0},{name:"Samantha",voiceURI:"com.apple.ttsbundle.Samantha-compact",lang:"en-US",localService:!0,"default":!0},{name:"Tessa",voiceURI:"com.apple.ttsbundle.Tessa-compact",lang:"en-ZA",localService:!0,"default":!0},{name:"Monica",voiceURI:"com.apple.ttsbundle.Monica-compact",lang:"es-ES",localService:!0,"default":!0},{name:"Paulina",voiceURI:"com.apple.ttsbundle.Paulina-compact",lang:"es-MX",localService:!0,"default":!0},{name:"Satu",voiceURI:"com.apple.ttsbundle.Satu-compact", +lang:"fi-FI",localService:!0,"default":!0},{name:"Amelie",voiceURI:"com.apple.ttsbundle.Amelie-compact",lang:"fr-CA",localService:!0,"default":!0},{name:"Thomas",voiceURI:"com.apple.ttsbundle.Thomas-compact",lang:"fr-FR",localService:!0,"default":!0},{name:"Carmit",voiceURI:"com.apple.ttsbundle.Carmit-compact",lang:"he-IL",localService:!0,"default":!0},{name:"Lekha",voiceURI:"com.apple.ttsbundle.Lekha-compact",lang:"hi-IN",localService:!0,"default":!0},{name:"Mariska",voiceURI:"com.apple.ttsbundle.Mariska-compact", +lang:"hu-HU",localService:!0,"default":!0},{name:"Damayanti",voiceURI:"com.apple.ttsbundle.Damayanti-compact",lang:"id-ID",localService:!0,"default":!0},{name:"Alice",voiceURI:"com.apple.ttsbundle.Alice-compact",lang:"it-IT",localService:!0,"default":!0},{name:"Kyoko",voiceURI:"com.apple.ttsbundle.Kyoko-compact",lang:"ja-JP",localService:!0,"default":!0},{name:"Yuna",voiceURI:"com.apple.ttsbundle.Yuna-compact",lang:"ko-KR",localService:!0,"default":!0},{name:"Ellen",voiceURI:"com.apple.ttsbundle.Ellen-compact", +lang:"nl-BE",localService:!0,"default":!0},{name:"Xander",voiceURI:"com.apple.ttsbundle.Xander-compact",lang:"nl-NL",localService:!0,"default":!0},{name:"Nora",voiceURI:"com.apple.ttsbundle.Nora-compact",lang:"no-NO",localService:!0,"default":!0},{name:"Zosia",voiceURI:"com.apple.ttsbundle.Zosia-compact",lang:"pl-PL",localService:!0,"default":!0},{name:"Luciana",voiceURI:"com.apple.ttsbundle.Luciana-compact",lang:"pt-BR",localService:!0,"default":!0},{name:"Joana",voiceURI:"com.apple.ttsbundle.Joana-compact", +lang:"pt-PT",localService:!0,"default":!0},{name:"Ioana",voiceURI:"com.apple.ttsbundle.Ioana-compact",lang:"ro-RO",localService:!0,"default":!0},{name:"Milena",voiceURI:"com.apple.ttsbundle.Milena-compact",lang:"ru-RU",localService:!0,"default":!0},{name:"Laura",voiceURI:"com.apple.ttsbundle.Laura-compact",lang:"sk-SK",localService:!0,"default":!0},{name:"Alva",voiceURI:"com.apple.ttsbundle.Alva-compact",lang:"sv-SE",localService:!0,"default":!0},{name:"Kanya",voiceURI:"com.apple.ttsbundle.Kanya-compact", +lang:"th-TH",localService:!0,"default":!0},{name:"Yelda",voiceURI:"com.apple.ttsbundle.Yelda-compact",lang:"tr-TR",localService:!0,"default":!0},{name:"Ting-Ting",voiceURI:"com.apple.ttsbundle.Ting-Ting-compact",lang:"zh-CN",localService:!0,"default":!0},{name:"Sin-Ji",voiceURI:"com.apple.ttsbundle.Sin-Ji-compact",lang:"zh-HK",localService:!0,"default":!0},{name:"Mei-Jia",voiceURI:"com.apple.ttsbundle.Mei-Jia-compact",lang:"zh-TW",localService:!0,"default":!0}];a.cache_ios10_voices=[{name:"Maged", +voiceURI:"com.apple.ttsbundle.Maged-compact",lang:"ar-SA"},{name:"Zuzana",voiceURI:"com.apple.ttsbundle.Zuzana-compact",lang:"cs-CZ"},{name:"Sara",voiceURI:"com.apple.ttsbundle.Sara-compact",lang:"da-DK"},{name:"Anna",voiceURI:"com.apple.ttsbundle.Anna-compact",lang:"de-DE"},{name:"Helena",voiceURI:"com.apple.ttsbundle.siri_female_de-DE_compact",lang:"de-DE"},{name:"Martin",voiceURI:"com.apple.ttsbundle.siri_male_de-DE_compact",lang:"de-DE"},{name:"Nikos (Enhanced)",voiceURI:"com.apple.ttsbundle.Nikos-premium", +lang:"el-GR"},{name:"Melina",voiceURI:"com.apple.ttsbundle.Melina-compact",lang:"el-GR"},{name:"Nikos",voiceURI:"com.apple.ttsbundle.Nikos-compact",lang:"el-GR"},{name:"Catherine",voiceURI:"com.apple.ttsbundle.siri_female_en-AU_compact",lang:"en-AU"},{name:"Gordon",voiceURI:"com.apple.ttsbundle.siri_male_en-AU_compact",lang:"en-AU"},{name:"Karen",voiceURI:"com.apple.ttsbundle.Karen-compact",lang:"en-AU"},{name:"Daniel (Enhanced)",voiceURI:"com.apple.ttsbundle.Daniel-premium",lang:"en-GB"},{name:"Arthur", +voiceURI:"com.apple.ttsbundle.siri_male_en-GB_compact",lang:"en-GB"},{name:"Daniel",voiceURI:"com.apple.ttsbundle.Daniel-compact",lang:"en-GB"},{name:"Martha",voiceURI:"com.apple.ttsbundle.siri_female_en-GB_compact",lang:"en-GB"},{name:"Moira",voiceURI:"com.apple.ttsbundle.Moira-compact",lang:"en-IE"},{name:"Nicky (Enhanced)",voiceURI:"com.apple.ttsbundle.siri_female_en-US_premium",lang:"en-US"},{name:"Samantha (Enhanced)",voiceURI:"com.apple.ttsbundle.Samantha-premium",lang:"en-US"},{name:"Aaron", +voiceURI:"com.apple.ttsbundle.siri_male_en-US_compact",lang:"en-US"},{name:"Fred",voiceURI:"com.apple.speech.synthesis.voice.Fred",lang:"en-US"},{name:"Nicky",voiceURI:"com.apple.ttsbundle.siri_female_en-US_compact",lang:"en-US"},{name:"Samantha",voiceURI:"com.apple.ttsbundle.Samantha-compact",lang:"en-US"},{name:"Tessa",voiceURI:"com.apple.ttsbundle.Tessa-compact",lang:"en-ZA"},{name:"Monica",voiceURI:"com.apple.ttsbundle.Monica-compact",lang:"es-ES"},{name:"Paulina",voiceURI:"com.apple.ttsbundle.Paulina-compact", +lang:"es-MX"},{name:"Satu",voiceURI:"com.apple.ttsbundle.Satu-compact",lang:"fi-FI"},{name:"Amelie",voiceURI:"com.apple.ttsbundle.Amelie-compact",lang:"fr-CA"},{name:"Daniel",voiceURI:"com.apple.ttsbundle.siri_male_fr-FR_compact",lang:"fr-FR"},{name:"Marie",voiceURI:"com.apple.ttsbundle.siri_female_fr-FR_compact",lang:"fr-FR"},{name:"Thomas",voiceURI:"com.apple.ttsbundle.Thomas-compact",lang:"fr-FR"},{name:"Carmit",voiceURI:"com.apple.ttsbundle.Carmit-compact",lang:"he-IL"},{name:"Lekha",voiceURI:"com.apple.ttsbundle.Lekha-compact", +lang:"hi-IN"},{name:"Mariska",voiceURI:"com.apple.ttsbundle.Mariska-compact",lang:"hu-HU"},{name:"Damayanti",voiceURI:"com.apple.ttsbundle.Damayanti-compact",lang:"id-ID"},{name:"Alice",voiceURI:"com.apple.ttsbundle.Alice-compact",lang:"it-IT"},{name:"Hattori",voiceURI:"com.apple.ttsbundle.siri_male_ja-JP_compact",lang:"ja-JP"},{name:"Kyoko",voiceURI:"com.apple.ttsbundle.Kyoko-compact",lang:"ja-JP"},{name:"O-ren",voiceURI:"com.apple.ttsbundle.siri_female_ja-JP_compact",lang:"ja-JP"},{name:"Yuna", +voiceURI:"com.apple.ttsbundle.Yuna-compact",lang:"ko-KR"},{name:"Ellen",voiceURI:"com.apple.ttsbundle.Ellen-compact",lang:"nl-BE"},{name:"Xander",voiceURI:"com.apple.ttsbundle.Xander-compact",lang:"nl-NL"},{name:"Nora",voiceURI:"com.apple.ttsbundle.Nora-compact",lang:"no-NO"},{name:"Zosia",voiceURI:"com.apple.ttsbundle.Zosia-compact",lang:"pl-PL"},{name:"Luciana",voiceURI:"com.apple.ttsbundle.Luciana-compact",lang:"pt-BR"},{name:"Joana",voiceURI:"com.apple.ttsbundle.Joana-compact",lang:"pt-PT"},{name:"Ioana", +voiceURI:"com.apple.ttsbundle.Ioana-compact",lang:"ro-RO"},{name:"Milena",voiceURI:"com.apple.ttsbundle.Milena-compact",lang:"ru-RU"},{name:"Laura",voiceURI:"com.apple.ttsbundle.Laura-compact",lang:"sk-SK"},{name:"Alva",voiceURI:"com.apple.ttsbundle.Alva-compact",lang:"sv-SE"},{name:"Kanya",voiceURI:"com.apple.ttsbundle.Kanya-compact",lang:"th-TH"},{name:"Yelda",voiceURI:"com.apple.ttsbundle.Yelda-compact",lang:"tr-TR"},{name:"Li-mu",voiceURI:"com.apple.ttsbundle.siri_male_zh-CN_compact",lang:"zh-CN"}, +{name:"Ting-Ting",voiceURI:"com.apple.ttsbundle.Ting-Ting-compact",lang:"zh-CN"},{name:"Yu-shu",voiceURI:"com.apple.ttsbundle.siri_female_zh-CN_compact",lang:"zh-CN"},{name:"Sin-Ji",voiceURI:"com.apple.ttsbundle.Sin-Ji-compact",lang:"zh-HK"},{name:"Mei-Jia",voiceURI:"com.apple.ttsbundle.Mei-Jia-compact",lang:"zh-TW"}];a.cache_ios11_voices=[{name:"Maged",voiceURI:"com.apple.ttsbundle.Maged-compact",lang:"ar-SA"},{name:"Zuzana",voiceURI:"com.apple.ttsbundle.Zuzana-compact",lang:"cs-CZ"},{name:"Sara", +voiceURI:"com.apple.ttsbundle.Sara-compact",lang:"da-DK"},{name:"Anna",voiceURI:"com.apple.ttsbundle.Anna-compact",lang:"de-DE"},{name:"Helena",voiceURI:"com.apple.ttsbundle.siri_female_de-DE_compact",lang:"de-DE"},{name:"Martin",voiceURI:"com.apple.ttsbundle.siri_male_de-DE_compact",lang:"de-DE"},{name:"Melina",voiceURI:"com.apple.ttsbundle.Melina-compact",lang:"el-GR"},{name:"Catherine",voiceURI:"com.apple.ttsbundle.siri_female_en-AU_compact",lang:"en-AU"},{name:"Gordon",voiceURI:"com.apple.ttsbundle.siri_male_en-AU_compact", +lang:"en-AU"},{name:"Karen",voiceURI:"com.apple.ttsbundle.Karen-compact",lang:"en-AU"},{name:"Arthur",voiceURI:"com.apple.ttsbundle.siri_male_en-GB_compact",lang:"en-GB"},{name:"Daniel",voiceURI:"com.apple.ttsbundle.Daniel-compact",lang:"en-GB"},{name:"Martha",voiceURI:"com.apple.ttsbundle.siri_female_en-GB_compact",lang:"en-GB"},{name:"Moira",voiceURI:"com.apple.ttsbundle.Moira-compact",lang:"en-IE"},{name:"Aaron",voiceURI:"com.apple.ttsbundle.siri_male_en-US_compact",lang:"en-US"},{name:"Fred", +voiceURI:"com.apple.speech.synthesis.voice.Fred",lang:"en-US"},{name:"Nicky",voiceURI:"com.apple.ttsbundle.siri_female_en-US_compact",lang:"en-US"},{name:"Samantha",voiceURI:"com.apple.ttsbundle.Samantha-compact",lang:"en-US"},{name:"Tessa",voiceURI:"com.apple.ttsbundle.Tessa-compact",lang:"en-ZA"},{name:"Monica",voiceURI:"com.apple.ttsbundle.Monica-compact",lang:"es-ES"},{name:"Paulina",voiceURI:"com.apple.ttsbundle.Paulina-compact",lang:"es-MX"},{name:"Satu",voiceURI:"com.apple.ttsbundle.Satu-compact", +lang:"fi-FI"},{name:"Amelie",voiceURI:"com.apple.ttsbundle.Amelie-compact",lang:"fr-CA"},{name:"Daniel",voiceURI:"com.apple.ttsbundle.siri_male_fr-FR_compact",lang:"fr-FR"},{name:"Marie",voiceURI:"com.apple.ttsbundle.siri_female_fr-FR_compact",lang:"fr-FR"},{name:"Thomas",voiceURI:"com.apple.ttsbundle.Thomas-compact",lang:"fr-FR"},{name:"Carmit",voiceURI:"com.apple.ttsbundle.Carmit-compact",lang:"he-IL"},{name:"Lekha",voiceURI:"com.apple.ttsbundle.Lekha-compact",lang:"hi-IN"},{name:"Mariska",voiceURI:"com.apple.ttsbundle.Mariska-compact", +lang:"hu-HU"},{name:"Damayanti",voiceURI:"com.apple.ttsbundle.Damayanti-compact",lang:"id-ID"},{name:"Alice",voiceURI:"com.apple.ttsbundle.Alice-compact",lang:"it-IT"},{name:"Hattori",voiceURI:"com.apple.ttsbundle.siri_male_ja-JP_compact",lang:"ja-JP"},{name:"Kyoko",voiceURI:"com.apple.ttsbundle.Kyoko-compact",lang:"ja-JP"},{name:"O-ren",voiceURI:"com.apple.ttsbundle.siri_female_ja-JP_compact",lang:"ja-JP"},{name:"Yuna",voiceURI:"com.apple.ttsbundle.Yuna-compact",lang:"ko-KR"},{name:"Ellen",voiceURI:"com.apple.ttsbundle.Ellen-compact", +lang:"nl-BE"},{name:"Xander",voiceURI:"com.apple.ttsbundle.Xander-compact",lang:"nl-NL"},{name:"Nora",voiceURI:"com.apple.ttsbundle.Nora-compact",lang:"no-NO"},{name:"Zosia",voiceURI:"com.apple.ttsbundle.Zosia-compact",lang:"pl-PL"},{name:"Luciana",voiceURI:"com.apple.ttsbundle.Luciana-compact",lang:"pt-BR"},{name:"Joana",voiceURI:"com.apple.ttsbundle.Joana-compact",lang:"pt-PT"},{name:"Ioana",voiceURI:"com.apple.ttsbundle.Ioana-compact",lang:"ro-RO"},{name:"Milena",voiceURI:"com.apple.ttsbundle.Milena-compact", +lang:"ru-RU"},{name:"Laura",voiceURI:"com.apple.ttsbundle.Laura-compact",lang:"sk-SK"},{name:"Alva",voiceURI:"com.apple.ttsbundle.Alva-compact",lang:"sv-SE"},{name:"Kanya",voiceURI:"com.apple.ttsbundle.Kanya-compact",lang:"th-TH"},{name:"Yelda",voiceURI:"com.apple.ttsbundle.Yelda-compact",lang:"tr-TR"},{name:"Li-mu",voiceURI:"com.apple.ttsbundle.siri_male_zh-CN_compact",lang:"zh-CN"},{name:"Ting-Ting",voiceURI:"com.apple.ttsbundle.Ting-Ting-compact",lang:"zh-CN"},{name:"Yu-shu",voiceURI:"com.apple.ttsbundle.siri_female_zh-CN_compact", +lang:"zh-CN"},{name:"Sin-Ji",voiceURI:"com.apple.ttsbundle.Sin-Ji-compact",lang:"zh-HK"},{name:"Mei-Jia",voiceURI:"com.apple.ttsbundle.Mei-Jia-compact",lang:"zh-TW"}];a.systemvoices=null;a.CHARACTER_LIMIT=100;a.VOICESUPPORT_ATTEMPTLIMIT=5;a.voicesupport_attempts=0;a.fallbackMode=!1;a.WORDS_PER_MINUTE=130;a.fallback_audio=null;a.fallback_playbackrate=1;a.def_fallback_playbackrate=a.fallback_playbackrate;a.fallback_audiopool=[];a.msgparameters=null;a.timeoutId=null;a.OnLoad_callbacks=[];a.useTimer= +!1;a.utterances=[];a.userInteractionEvents=["mousedown","mouseup","mousewheel","keydown"];a.fallbackBufferLength=5;a.iOS&&(a.fallbackBufferLength=2);var w=null;a.tstCompiled=function(){return!/param/.test(function(b){})};a.fallbackServicePath="undefined"!=typeof rvApiEndpoint&&rvApiEndpoint?rvApiEndpoint:"https://code.responsivevoice.org/"+(a.tstCompiled()?"":"develop/")+"getvoice.php";a.default_rv=a.responsivevoices[0];a.debug=!1;a.rvsMapped=!1;a.forcedFallbackMode=!1;a.speechAllowedByUser=!0;a.enableEstimationTimeout= +!0;a.log=function(b){a.debug&&console.log(b)};a.init=function(){a.is_wordpress=l();a.is_bundle=n();"undefined"==typeof rvApiKey&&console.error("ResponsiveVoice missing API key. See https://responsivevoice.org/register?devtools="+encodeURIComponent(window.location.href));if(a.is_android||a.iOS||a.is_safari)a.useTimer=!0;a.is_opera||"undefined"===typeof speechSynthesis?(console.log("RV: Voice synthesis not supported"),a.enableFallbackMode()):setTimeout(function(){var b=setInterval(function(){var c= +window.speechSynthesis.getVoices();0!=c.length||null!=a.systemvoices&&0!=a.systemvoices.length?(console.log("RV: Voice support ready"),a.systemVoicesReady(c),clearInterval(b)):(console.log("Voice support NOT ready"),a.voicesupport_attempts++,a.voicesupport_attempts>a.VOICESUPPORT_ATTEMPTLIMIT&&(clearInterval(b),null!=window.speechSynthesis?a.iOS?(a.iOS11||a.iOS12||a.iOS13_0||a.iOS13?a.systemVoicesReady(a.cache_ios11_voices):a.iOS10?a.systemVoicesReady(a.cache_ios10_voices):a.iOS9?a.systemVoicesReady(a.cache_ios9_voices): +a.systemVoicesReady(a.cache_ios_voices),console.log("RV: Voice support ready (cached)")):(console.log("RV: speechSynthesis present but no system voices found"),a.enableFallbackMode()):a.enableFallbackMode()))},100)},100);(a.iOS||a.is_android||a.is_safari)&&a.enableWindowClickHook();a.Dispatch("OnLoad")};a.systemVoicesReady=function(b){a.systemvoices=b;a.mapRVs();null!=a.OnVoiceReady&&a.OnVoiceReady.call();a.Dispatch("OnReady");window.hasOwnProperty("dispatchEvent")&&window.dispatchEvent(new Event("ResponsiveVoice_OnReady"))}; +a.enableFallbackMode=function(){a.fallbackMode=!0;a.forcedFallbackMode=!0;console.log("RV: Enabling fallback mode");a.mapRVs();null!=a.OnVoiceReady&&a.OnVoiceReady.call();a.Dispatch("OnReady");window.hasOwnProperty("dispatchEvent")&&window.dispatchEvent(new Event("ResponsiveVoice_OnReady"));a.Dispatch("OnServiceSwitched")};a.getVoices=function(){for(var b=[],c=0;c<a.responsivevoices.length;c++){var d=a.responsivevoices[c];!0!==d.deprecated&&b.push({name:d.name})}return b};a.speak=function(b,c,d){if(null== +b)a.log("No text provided");else if(a.initializePermissionsTimeout&&clearTimeout(a.initializePermissionsTimeout),a.rvsMapped){var e=function(A){-1!=A.search(/[\u3002]/gm)?A.split(/[\u3002]/).filter(function(C){C&&r.push(C)}):r.push(A)},m=null;if(a.isPlaying())a.log("Cancelling previous speech"),a.cancel(),setTimeout(function(){a.speak(b,c,d)},50);else{if(null==c){var f=a.default_rv;a.setDefaultVoice(f.name)}else f=a.getResponsiveVoice(c);if(f){!0===f.deprecated&&console.warn('ResponsiveVoice: Voice "'+ +f.name+'" is deprecated; it might not always be the right gender, and could be removed in future releases');var h={};if(null!=f.mappedProfile)h=f.mappedProfile;else if(h.systemvoice=a.getMatchedVoice(f),h.collectionvoice={},null==h.systemvoice){console.log("RV: ERROR: No voice found for: "+c);return}b=k(b,h);b=b.replace(/["`]/gm,"'");a.msgparameters=d||{};a.msgtext=b;a.msgvoicename=c;a.onstartFired=!1;var r=[];if(b.length>a.CHARACTER_LIMIT){for(var p=b=g(b);p.length>a.CHARACTER_LIMIT;){f=p.search(/([\u3002:!\u00a1?\u00bf;\(\)\[\]\u2014\u00ab\u00bb\n]+|\.[^0-9]+)/); +var u="";if(-1==f||f>=a.CHARACTER_LIMIT)f=p.search(/,[^0-9]+/);if((-1==f||f>=a.CHARACTER_LIMIT)&&-1!=p.search(" ")){var x=p.split(" ");for(f=0;f<x.length;f++){if(u.length+x[f].length+1>a.CHARACTER_LIMIT){x[f].length>=a.CHARACTER_LIMIT&&(u+=x[f].substr(0,a.CHARACTER_LIMIT-u.length-1));break}u+=(0!=f?" ":"")+x[f]}}else{if(-1==f||f>=a.CHARACTER_LIMIT)f=a.CHARACTER_LIMIT-1;u=p.substr(0,f+1)}p=p.substr(u.length,p.length-u.length);r.push(u)}0<p.length&&e(p)}else e(b);console.log(r);a.multipartText=r;if(a.checkSpeechAllowed()){a.fallbackMode&& +0<a.fallback_audiopool.length&&a.clearFallbackPool();a.msgprofile=h;a.log("Voice picked: "+a.msgprofile.systemvoice.name);a.utterances=[];a.fallbackChunks=[];for(f=0;f<r.length;f++)if(!a.fallbackMode&&a.getServiceEnabled(a.services.NATIVE_TTS))a.log("Using SpeechSynthesis"),m=a.services.NATIVE_TTS,e=new SpeechSynthesisUtterance,e.voiceURI=h.systemvoice.voiceURI,e.volume=a.selectBest([h.collectionvoice.volume,h.systemvoice.volume,1]),e.rate=a.selectBest([a.iOS9plus?1:null,h.collectionvoice.rate,h.systemvoice.rate, +1]),e.pitch=a.selectBest([h.collectionvoice.pitch,h.systemvoice.pitch,1]),e.text=r[f],e.lang=a.selectBest([h.collectionvoice.lang,h.systemvoice.lang]),e.rvIndex=f,e.rvTotal=r.length,0==f&&(e.onstart=a.speech_onstart),a.msgparameters.onendcalled=!1,null!=d?(e.voice="undefined"!==typeof d.voice?d.voice:h.systemvoice,f<r.length-1&&1<r.length?(e.onend=a.onPartEnd,e.hasOwnProperty("addEventListener")&&e.addEventListener("end",a.onPartEnd)):(e.onend=a.speech_onend,e.hasOwnProperty("addEventListener")&& +e.addEventListener("end",a.speech_onend)),e.onerror=d.onerror||function(A){a.log("RV: Unknown Error");a.log(A);"not-allowed"===A.error&&(a.speechSynthesisNotAllowedError=!0,a.speak(b,c,d))},d.rate=a.validateParameters(d,"rate"),d.pitch=a.validateParameters(d,"pitch"),d.volume=a.validateParameters(d,"volume"),e.onpause=d.onpause,e.onresume=d.onresume,e.onmark=d.onmark,e.onboundary=d.onboundary||a.onboundary,e.pitch=null!=d.pitch?d.pitch:e.pitch,e.rate=a.iOS?(null!=d.rate?d.rate*d.rate:1)*e.rate:(null!= +d.rate?d.rate:1)*e.rate,e.volume=null!=d.volume?d.volume:e.volume):(a.log("No Params received for current Utterance"),e.voice=h.systemvoice,e.onend=a.speech_onend,e.onboundary=a.onboundary,e.onerror=function(A){a.log("RV: Unknown Error");a.log(A);"not-allowed"===A.error&&(a.speechSynthesisNotAllowedError=!0,a.speak(b,c,d))}),a.utterances.push(e),0==f&&(a.currentMsg=e),console.log(e),a.tts_speak(e);else if(a.fallbackMode&&a.getServiceEnabled(a.services.FALLBACK_AUDIO)){m=a.services.FALLBACK_AUDIO; +a.fallback_playbackrate=a.def_fallback_playbackrate;e=a.selectBest([h.collectionvoice.pitch,h.systemvoice.pitch,1]);p=a.selectBest([a.iOS9plus?1:null,h.collectionvoice.rate,h.systemvoice.rate,1]);u=a.selectBest([h.collectionvoice.volume,h.systemvoice.volume,1]);if(null!=d){e*=null!=d.pitch?d.pitch:1;p*=null!=d.rate?d.rate:1;u*=null!=d.volume?d.volume:1;var B=d.extraParams||null}e/=2;p/=2;u*=2;e=Math.min(Math.max(e,0),1);p=Math.min(Math.max(p,0),1);u=Math.min(Math.max(u,0),1);x="?t="+encodeURIComponent(r[f])+ +"&tl="+(h.collectionvoice.lang||h.systemvoice.lang||"en-US")+"&sv="+(h.collectionvoice.service||h.systemvoice.service||"")+"&vn="+(h.collectionvoice.voicename||h.systemvoice.voicename||"")+"&pitch="+e.toString()+"&rate="+p.toString()+"&vol="+u.toString();"undefined"!=typeof rvApiEndpoint&&rvApiEndpoint&&(x="?text="+encodeURIComponent(r[f])+"&lang="+(h.collectionvoice.lang||h.systemvoice.lang||"en-US")+"&engine="+(h.collectionvoice.service||h.systemvoice.service||"")+"&name="+(h.collectionvoice.voicename|| +h.systemvoice.voicename||"")+"&pitch="+e.toString()+"&rate="+p.toString()+"&volume="+u.toString());e=a.fallbackServicePath+x;"undefined"!=typeof rvApiKey&&(e+="&key="+rvApiKey);"undefined"==typeof rvApiKey&&a.is_bundle&&(e+="&key=FQ9r4hgY");"undefined"==typeof rvApiKey&&a.is_wordpress&&(e+="&key=HY7lTyiS");void 0!==h.collectionvoice.gender&&(e+="&gender="+h.collectionvoice.gender);B&&(e+="&extraParams="+JSON.stringify(B));a.fallbackChunks.push({text:r[f],url:e,audio:null})}a.fallbackMode&&a.getServiceEnabled(a.services.FALLBACK_AUDIO)&& +(a.fallbackChunkIndex=0,a.fallback_startPart());a.log("Service used: "+m)}else a.scheduledSpeak={text:b,voicename:c,parameters:d}}else console.error("Selected voice does not exist: "+c),a.Dispatch("OnMissingVoiceError",{voice:c})}}else setTimeout(function(){a.speak(b,c,d)},15)};a.startTimeout=function(b,c){var d=a.msgprofile.collectionvoice.timerSpeed;null==a.msgprofile.collectionvoice.timerSpeed&&(d=1);0>=d||(a.timeoutId=setTimeout(c,a.getEstimatedTimeLength(b,d)),a.log("Timeout ID: "+a.timeoutId))}; +a.checkAndCancelTimeout=function(){null!=a.timeoutId&&(clearTimeout(a.timeoutId),a.timeoutId=null)};a.speech_timedout=function(){a.cancel();a.cancelled=!1;a.speech_onend()};a.speech_onend=function(){a.checkAndCancelTimeout();!0===a.cancelled?a.cancelled=!1:(a.log("on end fired"),null!=a.msgparameters&&null!=a.msgparameters.onend&&1!=a.msgparameters.onendcalled&&(a.log("Speech on end called -"+a.msgtext),a.msgparameters.onendcalled=!0,a.msgparameters.onend()))};a.speech_onstart=function(){if(!a.onstartFired&& +(a.onstartFired=!0,a.log("Speech start"),a.enableEstimationTimeout&&a.useTimer&&(a.fallbackMode||a.startTimeout(a.msgtext,a.speech_timedout)),a.msgparameters.onendcalled=!1,null!=a.msgparameters&&null!=a.msgparameters.onstart))a.msgparameters.onstart()};a.fallback_startPart=function(){0==a.fallbackChunkIndex&&a.speech_onstart();a.fallback_updateChunksBuffer();a.fallback_audio=a.fallbackChunks[a.fallbackChunkIndex].audio;null==a.fallback_audio?a.log("RV: Fallback Audio is not available"):(function(){var b= +a.fallback_audio;setTimeout(function(){b.playbackRate=a.fallback_playbackrate},50);b.onloadedmetadata=function(){b.playbackRate=a.fallback_playbackrate};var c=function(e){setTimeout(function(){if(0==e.currentTime){a.log("Audio chunk not playing. Trying to recover. Disabling time estimation");a.enableEstimationTimeout=!1;a.checkAndCancelTimeout();e.load();var m=function(){e.play();e.removeEventListener("canplaythrough",m)};e.addEventListener("canplaythrough",m,!1)}},700)};if(2<=b.readyState)b.play(), +c(b);else{var d=function(){b.play();b.removeEventListener("canplaythrough",d)};b.addEventListener("canplaythrough",d,!1)}}(),a.fallback_audio.onerror=function(b){function c(){if(this.readyState==this.DONE&&200!==this.status)switch(this.status){case 400:console.error("ResponsiveVoice audio could not be loaded. Invalid parameters.");break;case 403:console.error("ResponsiveVoice invalid API key. See https://responsivevoice.org/register?devtools="+encodeURIComponent(window.location.href));break;default:console.error("ResponsiveVoice audio could not be loaded. There is an issue connecting your browser to the API endpoint.")}} +switch(b.target.error.code){case b.target.error.MEDIA_ERR_SRC_NOT_SUPPORTED:var d=new XMLHttpRequest;d.open("GET",b.target.src,!0);d.send();d.onreadystatechange=c;break;default:console.error("ResponsiveVoice: an unknown error occurred.")}},a.fallback_audio.addEventListener("ended",a.fallback_finishPart),a.enableEstimationTimeout&&a.useTimer&&a.startTimeout(a.multipartText[a.fallbackChunkIndex],a.fallback_finishPart))};a.isFallbackAudioPlaying=function(){var b;for(b=0;b<a.fallback_audiopool.length;b++){var c= +a.fallback_audiopool[b];if(!c.paused&&!c.ended&&c.currentTime!=c.duration)return!0}return!1};a.fallback_finishPart=function(b){a.isFallbackAudioPlaying()?(a.checkAndCancelTimeout(),a.timeoutId=setTimeout(a.fallback_finishPart,1E3*(a.fallback_audio.duration-a.fallback_audio.currentTime))):(a.checkAndCancelTimeout(),a.fallbackChunkIndex<a.fallbackChunks.length-1?(a.fallbackChunkIndex++,a.fallback_startPart()):a.speech_onend())};a.cancel=function(){a.checkAndCancelTimeout();a.fallbackMode?(null!=a.fallback_audio&& +a.fallback_audio.pause(),a.clearFallbackPool()):(a.cancelled=!0,speechSynthesis.cancel())};a.voiceSupport=function(){return"speechSynthesis"in window};a.OnFinishedPlaying=function(b){if(null!=a.msgparameters&&null!=a.msgparameters.onend)a.msgparameters.onend()};a.setDefaultVoice=function(b){if(a.rvsMapped){var c=a.getResponsiveVoice(b);null!=c&&(a.default_rv=c)}else setTimeout(function(){a.setDefaultVoice(b)},15)};a.mapRVs=function(){if("object"==typeof navigator){var b,c="anguage";var d=navigator; +d=(b=d["l"+c+"s"],b&&b.length?b:(c=d["l"+c]||d["browserL"+c]||d["userL"+c])?[c]:c)}else d=void 0;b=d[0];for(c=0;c<a.responsivevoices.length;c++){d=a.responsivevoices[c];for(var e=0;e<d.voiceIDs.length;e++){var m=a.voicecollection[d.voiceIDs[e]];if(1!=m.fallbackvoice){var f=a.getSystemVoice(m.name);a.forcedFallbackMode&&(f=null);a.iOS12_0&&d.lang.toLowerCase()!=b.toLowerCase()&&d.lang.toLowerCase().split("-")[0]!=b.toLowerCase()&&(f=null);if(null!=f){d.mappedProfile={systemvoice:f,collectionvoice:m}; +break}}else{d.mappedProfile={systemvoice:{},collectionvoice:m};break}}}a.rvsMapped=!0};a.getMatchedVoice=function(b){for(var c=0;c<b.voiceIDs.length;c++){var d=a.getSystemVoice(a.voicecollection[b.voiceIDs[c]].name);if(null!=d)return d}return null};a.getSystemVoice=function(b){var c=String.fromCharCode(160);var d=b.replace(new RegExp("\\s+|"+c,"g"),"");if("undefined"===typeof a.systemvoices||null===a.systemvoices)return null;for(var e=0;e<a.systemvoices.length;e++)if(0===a.systemvoices[e].name.localeCompare(b)|| +0===a.systemvoices[e].name.replace(new RegExp("\\s+|"+c,"g"),"").replace(/ *\([^)]*\) */g,"").localeCompare(d))return a.systemvoices[e];return null};a.getResponsiveVoice=function(b){for(var c=0;c<a.responsivevoices.length;c++)if(a.responsivevoices[c].name==b)return b=a.fallbackMode,a.fallbackMode=!0===a.responsivevoices[c].mappedProfile.collectionvoice.fallbackvoice||!0===a.forcedFallbackMode?!0:!1,b!=a.fallbackMode&&(a.mapRVs(),a.Dispatch("OnServiceSwitched")),a.responsivevoices[c];return null}; +a.Dispatch=function(b,c){c=void 0!==c?c:null;if(a.hasOwnProperty(b+"_callbacks")&&null!=a[b+"_callbacks"]&&0<a[b+"_callbacks"].length){for(var d=a[b+"_callbacks"],e=0;e<d.length;e++)d[e](c);return!0}var m=b+"_callbacks_timeout",f=b+"_callbacks_timeoutCount";a.hasOwnProperty(m)||(a[f]=10,a[m]=setInterval(function(){--a[f];(a.Dispatch(b,c)||0>a[f])&&clearTimeout(a[m])},50));return!1};a.AddEventListener=function(b,c){a.hasOwnProperty(b+"_callbacks")||(a[b+"_callbacks"]=[]);a[b+"_callbacks"].push(c)}; +a.addEventListener=a.AddEventListener;a.RemoveEventListener=function(b,c){a[b+"_callbacks"]&&-1!=a[b+"_callbacks"].indexOf(c)&&a[b+"_callbacks"].splice(a[b+"_callbacks"].indexOf(c),1)};a.clickEvent=function(){a.log("Click event");a.click_event_detected=!0;a.initializePermissionsTimeout=setTimeout(a.initializePermissions,5);a.userInteractionEvents.forEach(function(b){window.removeEventListener(b,a.clickEvent,!1)});a.Dispatch("OnClickEvent")};a.initializePermissions=function(){if(a.iOS&&!a.iOS_initialized){a.log("Initializing iOS click event"); +if("undefined"!==typeof speechSynthesis){var b=new SpeechSynthesisUtterance(" ");speechSynthesis.speak(b)}a.iOS_initialized=!0}a.is_android&&!a.android_initialized&&(a.log("Initializing Android click event"),"undefined"!==typeof speechSynthesis&&(b=new SpeechSynthesisUtterance(" "),speechSynthesis.speak(b)),a.android_initialized=!0);a.initFallbackPool()};a.isPlaying=function(){return a.fallbackMode?null!=a.fallback_audio&&!a.fallback_audio.ended&&!a.fallback_audio.paused:"undefined"!=typeof speechSynthesis? +speechSynthesis.speaking:!1};a.clearFallbackPool=function(){for(var b=0;b<a.fallback_audiopool.length;b++)null!=a.fallback_audiopool[b]&&a.fallback_audiopool[b].pause();a.fallback_audiopool_index=0;a.fallbackChunks=[]};a.initFallbackPool=function(){if(!a.fallback_audiopool||0==a.fallback_audiopool.length){for(var b=0;10>b;b++){var c=b,d=document.createElement("AUDIO");d.preload="auto";a.is_android&&(d.src="data:audio/mpeg;base64,/+NIxAAAAAAAAAAAAFhpbmcAAAAPAAAAEwAACZAAIiIiIiIqKioqKjMzMzMzRERERERETExMTExdXV1dXWZmZmZmd3d3d3d3gICAgICRkZGRkZmZmZmZqqqqqqqqs7Ozs7PExMTExMzMzMzM3d3d3d3d5ubm5ub39/f39///////AAAAUExBTUUzLjEwMAQoAAAAAAAAAAAVCCQCQCEAAeAAAAmQ/qJL7wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+NIxAAGkAJAGAAAAABn///////////////6w//L/IeGCGc//+U61QAP/4LmWycNjPzmXtEL0VxbXSoQaadV7pSNs2X6hJ3Ok1a9yNRtf7ddPJrLR2nyP/p/30b0OdF6Su29GKp9Ls6LORkWRJ1sOsGr4mUADf9n/P+9v/FR5t08rK1UubPiChtJS2Yoop4MH48ec+PjR01tJJOmX8O3Mvmf//nf6s7pnCzO5wl8y7aVyzX5lLGdCKJYgd6S33q26FtBZVczczydHIbM6oMQuaUADf9n/9v//js/ijDGj7uNKCaLVPLY2TzXwmkzHCZrHdGypjNcBdIf+cssK+/f4397ez1JaRw1aI3FlV5ubTY1LQIWVb2m7K89qpjxLf5g/+MYxPgS5FZAeADFKNGO6mh1fMqEEQGWqWYmg3FqAA2vQlp77/uffWS702wqfv8vFD5PuNitqPG8p77pLmWf/+/HA5ryUlu7/+MYxOcXRFo8eAGHKS//vwnLX//6HPNCIzXla56JRuFPNdKV2pety8ID4VN+uRuoU+VV8zTMMfXYUQ4eh9ZoGKKlPHBCqgAN/+MoxMUX3CY8eAGHKbdmn+OeVJTGIlzpdOsUYwaXtdxnHOiuHjAFIU+ZnMzIo2eVWlxPy//y8rD9GK8OTKZXL6Wply47bXzyeYUcuXSE5qSwGGPcoJv2DchBu8Jw8gGwmW09AA23RXO3nb6WmOopONBSqNIeqnXWiAz7K4XEHwmcIdATmzwV0jJ9s4V/k////+MYxOgYlGo4eAGHLO/5f9nlL8kDpHZv+mbMu4mH7HHuyyqHq6TeK5/8aMjm1eRixEgQJqGo+0p5lQAN/0f477nlU9IqLh3g/+MoxMAV6+48eABHIXO7Otw9wgTCohOLjxNDi9CJZRx1mRayrbDuUE9K1/pzV12nzc/+fe9/4ZerXKtVHrfdcl3Snkp5pGPb7DmYQNJNSh9zwUw9UvZi6fQYM8eKDZqHEZhiAA3/Y/3//e/ncbwBH455AViDJuJXNlQhwMiabt6ZEy6bRZ0EyOvDkSz2KvaZ/+MYxOsWVDY8eAFHJX7d09JbPf7UcpGYFU4MK/TuiMtVI3U+7sa9XVlqveysYtTVmOxmQruJCGeRFdkDcQANv0P3v3+7/3v8/+MoxMwY7F48eAIHLXy7nE/l1671KjRcnSXttqsdJjz2h+kezUHiUdTRuwjpGa8vMy/+f55c7D+2xUlyOfmTv66UvLp0GeRl5WIljlTvLXeKT5Jwvad3F1mByDEbg4DVAA33Y/siOm/FK0CDQEmy6l1gwcQJgyQLX8QIFrg8G8A8hcy4q8OF+ZHkb0p5fP/K/+MYxOsXRCo8eAGFKUPMFnky0+ddOU/S++kPVj1z5qq55m56zXyFmmU0V3mwIsuiUKchEUZjC1y1AA33Y+///fv+5GmZj12N/+MoxMkXhGI8eAGHKcORvd5V0ztA0tUM1d+s21a+e6KTMnBOORPRyKWf/+1Of+f5OxsW9IyZ2uy3M/mef1/vzuZZ1+5S4ttla/eWHjROLbPed0N/NGppAxUqAA33YL08vVo7VkuqIZR2GbZVHBO0MUUIGSGq5ID2e8wpwECpKV8878nSmv//S/Ms5dUdI5Hm/+MYxO4W3F48eABHIQiMTfh86Vs7nfvC9Uz8pZcymIeTPMKyUIcIsjkcyeKlrzc2k0CVAA3/Y+Pr/fn//7zv3OWUiaOhGM2//+MoxM0Wy+48eAGHKRjF4VTgSyzCCRr9P73Jc005wH9MiLp5G/2/Kn+yf/86jUqeNwFTqP5fqU4xMbl/8SdmZ/NtnZjdrWFF6UKjAWGFTDC2EeELBAvBAA2vI/f7nm2z7j8yZbGhowotlks7nfrmUdf4x2L/eGdHO1CiZMbZmtjJ08Rr/e+YzL1v///y7/3O/+MYxPQW3G48eAAGPNpFgkl87qjOVlLOrn9vCSGL5fOHCRe/Unm5gbFu+VQFRSCPW4kxnBUHAA2/R//35++f7/8f5UFOi5dp/+MoxNMXs/48eAGHKeb7ShEhrRrJ7ox2Dwom6lJchCIyAxmlmRblJ8/+J///5/9kbi6dYzc7Dzh3ZeZJOeKImygKWGTGRWucLNkQ180DEbzPRTV2MRjGM6SOHQoADfdn/vX13Zq7bvdmzAaHWaYxtxRuGeiA/JGqh7PMwvZd9KC2NEoEYzKdkrrd/Z21t1u7/+MYxPcYhGY4eAGHLTf0v8++Rq1UzJCdC1k5f3yfRSooW/dmui4H0GqxkF8S+GJJmuU6GQOYJDfCiLo9zim9ElBNAA+/gj5S/+MoxNAYHGY8eAGHKKw6Zmxn++StD2qiVTXJhRFSftxQ4s7mwjZjKC1IcjKvv8xXov/77EeQqjPV3az/vqlNe6XVJFSs7UVlR7oxnY/eeRFcis7KrkJGMgtyc+lMAFWYnvEQQh4ViYhGFC/59/vG+MdJtVsaBhUV3+FHcKDf/EVLf/6KCeBWWK2STEFNRTMu/+MYxPIaLG44eAGHLDEwMKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq/+MoxMQVRE48eADFKaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq/+MYxPELK54oGABHoaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", +d.load(),9==c&&(a.log("Android HTML audio initialized"),a.android_initialized=!0));a.iOS&&(d.src="data:audio/mpeg;base64,/+NIxAAAAAAAAAAAAFhpbmcAAAAPAAAAEwAACZAAIiIiIiIqKioqKjMzMzMzRERERERETExMTExdXV1dXWZmZmZmd3d3d3d3gICAgICRkZGRkZmZmZmZqqqqqqqqs7Ozs7PExMTExMzMzMzM3d3d3d3d5ubm5ub39/f39///////AAAAUExBTUUzLjEwMAQoAAAAAAAAAAAVCCQCQCEAAeAAAAmQ/qJL7wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+NIxAAGkAJAGAAAAABn///////////////6w//L/IeGCGc//+U61QAP/4LmWycNjPzmXtEL0VxbXSoQaadV7pSNs2X6hJ3Ok1a9yNRtf7ddPJrLR2nyP/p/30b0OdF6Su29GKp9Ls6LORkWRJ1sOsGr4mUADf9n/P+9v/FR5t08rK1UubPiChtJS2Yoop4MH48ec+PjR01tJJOmX8O3Mvmf//nf6s7pnCzO5wl8y7aVyzX5lLGdCKJYgd6S33q26FtBZVczczydHIbM6oMQuaUADf9n/9v//js/ijDGj7uNKCaLVPLY2TzXwmkzHCZrHdGypjNcBdIf+cssK+/f4397ez1JaRw1aI3FlV5ubTY1LQIWVb2m7K89qpjxLf5g/+MYxPgS5FZAeADFKNGO6mh1fMqEEQGWqWYmg3FqAA2vQlp77/uffWS702wqfv8vFD5PuNitqPG8p77pLmWf/+/HA5ryUlu7/+MYxOcXRFo8eAGHKS//vwnLX//6HPNCIzXla56JRuFPNdKV2pety8ID4VN+uRuoU+VV8zTMMfXYUQ4eh9ZoGKKlPHBCqgAN/+MoxMUX3CY8eAGHKbdmn+OeVJTGIlzpdOsUYwaXtdxnHOiuHjAFIU+ZnMzIo2eVWlxPy//y8rD9GK8OTKZXL6Wply47bXzyeYUcuXSE5qSwGGPcoJv2DchBu8Jw8gGwmW09AA23RXO3nb6WmOopONBSqNIeqnXWiAz7K4XEHwmcIdATmzwV0jJ9s4V/k////+MYxOgYlGo4eAGHLO/5f9nlL8kDpHZv+mbMu4mH7HHuyyqHq6TeK5/8aMjm1eRixEgQJqGo+0p5lQAN/0f477nlU9IqLh3g/+MoxMAV6+48eABHIXO7Otw9wgTCohOLjxNDi9CJZRx1mRayrbDuUE9K1/pzV12nzc/+fe9/4ZerXKtVHrfdcl3Snkp5pGPb7DmYQNJNSh9zwUw9UvZi6fQYM8eKDZqHEZhiAA3/Y/3//e/ncbwBH455AViDJuJXNlQhwMiabt6ZEy6bRZ0EyOvDkSz2KvaZ/+MYxOsWVDY8eAFHJX7d09JbPf7UcpGYFU4MK/TuiMtVI3U+7sa9XVlqveysYtTVmOxmQruJCGeRFdkDcQANv0P3v3+7/3v8/+MoxMwY7F48eAIHLXy7nE/l1671KjRcnSXttqsdJjz2h+kezUHiUdTRuwjpGa8vMy/+f55c7D+2xUlyOfmTv66UvLp0GeRl5WIljlTvLXeKT5Jwvad3F1mByDEbg4DVAA33Y/siOm/FK0CDQEmy6l1gwcQJgyQLX8QIFrg8G8A8hcy4q8OF+ZHkb0p5fP/K/+MYxOsXRCo8eAGFKUPMFnky0+ddOU/S++kPVj1z5qq55m56zXyFmmU0V3mwIsuiUKchEUZjC1y1AA33Y+///fv+5GmZj12N/+MoxMkXhGI8eAGHKcORvd5V0ztA0tUM1d+s21a+e6KTMnBOORPRyKWf/+1Of+f5OxsW9IyZ2uy3M/mef1/vzuZZ1+5S4ttla/eWHjROLbPed0N/NGppAxUqAA33YL08vVo7VkuqIZR2GbZVHBO0MUUIGSGq5ID2e8wpwECpKV8878nSmv//S/Ms5dUdI5Hm/+MYxO4W3F48eABHIQiMTfh86Vs7nfvC9Uz8pZcymIeTPMKyUIcIsjkcyeKlrzc2k0CVAA3/Y+Pr/fn//7zv3OWUiaOhGM2//+MoxM0Wy+48eAGHKRjF4VTgSyzCCRr9P73Jc005wH9MiLp5G/2/Kn+yf/86jUqeNwFTqP5fqU4xMbl/8SdmZ/NtnZjdrWFF6UKjAWGFTDC2EeELBAvBAA2vI/f7nm2z7j8yZbGhowotlks7nfrmUdf4x2L/eGdHO1CiZMbZmtjJ08Rr/e+YzL1v///y7/3O/+MYxPQW3G48eAAGPNpFgkl87qjOVlLOrn9vCSGL5fOHCRe/Unm5gbFu+VQFRSCPW4kxnBUHAA2/R//35++f7/8f5UFOi5dp/+MoxNMXs/48eAGHKeb7ShEhrRrJ7ox2Dwom6lJchCIyAxmlmRblJ8/+J///5/9kbi6dYzc7Dzh3ZeZJOeKImygKWGTGRWucLNkQ180DEbzPRTV2MRjGM6SOHQoADfdn/vX13Zq7bvdmzAaHWaYxtxRuGeiA/JGqh7PMwvZd9KC2NEoEYzKdkrrd/Z21t1u7/+MYxPcYhGY4eAGHLTf0v8++Rq1UzJCdC1k5f3yfRSooW/dmui4H0GqxkF8S+GJJmuU6GQOYJDfCiLo9zim9ElBNAA+/gj5S/+MoxNAYHGY8eAGHKKw6Zmxn++StD2qiVTXJhRFSftxQ4s7mwjZjKC1IcjKvv8xXov/77EeQqjPV3az/vqlNe6XVJFSs7UVlR7oxnY/eeRFcis7KrkJGMgtyc+lMAFWYnvEQQh4ViYhGFC/59/vG+MdJtVsaBhUV3+FHcKDf/EVLf/6KCeBWWK2STEFNRTMu/+MYxPIaLG44eAGHLDEwMKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq/+MoxMQVRE48eADFKaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq/+MYxPELK54oGABHoaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", +d.load(),9==c&&(a.log("iOS HTML audio initialized"),a.iOS_initialized=!0));a.fallback_audiopool.push(d)}a.fallback_audiopool_index=0}};a.allowSpeechClicked=function(b){a.allowSpeechDiv.parentNode.removeChild(a.allowSpeechDiv);a.allowSpeechDiv=null;if(a.speechAllowedByUser=b)a.clickEvent(),a.scheduledSpeak&&(a.speak(a.scheduledSpeak.text,a.scheduledSpeak.voicename,a.scheduledSpeak.parameters),a.scheduledSpeak=null);a.Dispatch("OnAllowSpeechClicked")};a.checkSpeechAllowed=function(b){if(0==a.speechAllowedByUser)return!1; +var c=a.is_android||a.iOS,d=a.is_safari&&(a.fallbackMode||a.forcedFallbackMode);if(!0!==a.disablePermissionPopup&&(!0===a.allowPermissionPopupEverywhere||c||d||!0===a.speechSynthesisNotAllowedError)&&!a.click_event_detected){if(a.allowSpeechDiv)return;a.allowSpeechDiv_appearances=null==a.allowSpeechDiv_appearances?1:++a.allowSpeechDiv_appearances;if(2<a.allowSpeechDiv_appearances)return console.log("ResponsiveVoice: Speech not allowed by user"),!1;c=document.createElement("style");c.innerHTML='.rvNotification{position:fixed;background-color:#fff;text-align:center;font-family:-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:400;line-height:1.5;box-shadow:0 4px 8px 0 rgba(0,0,0,.2),0 6px 20px 0 rgba(0,0,0,.19);z-index:10000;width:100vw;left:0;bottom:0;font-size:1rem;padding-bottom:.5em;padding-right:.5em}.rvButtonRow{padding-right:2em;padding-bottom:1em;text-align:right;font-size:medium}.rvButton{cursor:pointer;display:inline-block;margin-left:1em;padding:.8em 2em;border-radius:3px;font-size:small}.rvButtonAllow{border:none;background-color:#2b8cff;color:#fff}.rvButtonDeny{border:1px solid #2b8cff;color:#2b8cff;background-color:#fff}.rvTextRow{padding-top:1em;padding-bottom:2em}@media (min-width:576px){.rvNotification{width:60vw;left:20vw}}@media (min-width:768px){.rvNotification{width:50vw;left:25vw}}@media (min-width:992px){.rvNotification{width:40vw;left:30vw}}@media (min-width:1200px){.rvNotification{width:30vw;left:35vw}}'; +document.body.appendChild(c);a.allowSpeechDiv=document.createElement("div");a.allowSpeechDiv.classList.add("rvNotification");void 0==b&&(b={});a.allowSpeechDiv.innerHTML='<div class="rvTextRow"><strong>'+(void 0!=b.urlOverride?b.urlOverride:window.location.hostname)+"</strong> "+(void 0!=b.textOverride?b.textOverride:"wants to play speech")+'</div><div class="rvButtonRow"><div onclick="responsiveVoice.allowSpeechClicked(false);" class="rvButton rvButtonDeny">DENY</div><div onclick="responsiveVoice.allowSpeechClicked(true);" class="rvButton rvButtonAllow">ALLOW</div></div>'; +document.body.appendChild(a.allowSpeechDiv);return!1}return!0};a.fallback_audioPool_getAudio=function(){a.initFallbackPool();a.fallback_audiopool_index>=a.fallback_audiopool.length&&(a.fallback_audiopool_index=0);return a.fallback_audiopool[a.fallback_audiopool_index++]};a.fallback_updateChunksBuffer=function(){for(var b=a.fallbackChunkIndex;b<Math.min(a.fallbackChunks.length,a.fallbackChunkIndex+a.fallbackBufferLength);b++){var c=a.fallbackChunks[b];null==c.audio&&(c.audio=a.fallback_audioPool_getAudio(), +function(d){var e=function(){d.audio.src=d.url;d.audio.playbackRate=a.fallback_playbackrate;d.audio.preload="auto";d.audio.load()};0==b?e():setTimeout(e,50*b)}(c))}};a.selectBest=function(b){for(var c=0;c<b.length;c++)if(null!=b[c])return b[c];return null};a.pause=function(){a.fallbackMode?null!=a.fallback_audio&&a.fallback_audio.pause():(speechSynthesis.pause(),a.ttsCancelledByTimeout=!1,a.ttsKeepAliveTimeout=setTimeout(function(){a.ttsKeepAliveTimeout=null;speechSynthesis.cancel();a.ttsCancelledByTimeout= +!0},6E4))};a.resume=function(){if(a.fallbackMode)null!=a.fallback_audio&&a.fallback_audio.play();else if(a.ttsCancelledByTimeout)for(var b=a.ttsCancelledByTimeout=!1,c=0;c<a.utterances.length;c++){var d=a.utterances[c];a.currentMsg==d&&(b=!0);b&&a.tts_speak(d)}else a.ttsKeepAliveTimeout&&(clearTimeout(a.ttsKeepAliveTimeout),a.ttsKeepAliveTimeout=null),speechSynthesis.resume()};a.tts_speak=function(b){setTimeout(function(){a.cancelled=!1;speechSynthesis.speak(b)},.01)};a.setVolume=function(b){if(a.isPlaying())if(a.fallbackMode){for(var c= +0;c<a.fallback_audiopool.length;c++)a.fallback_audiopool[c].volume=b;a.fallback_audio.volume=b}else for(c=0;c<a.utterances.length;c++)a.utterances[c].volume=b};a.onPartEnd=function(b){if(null!=a.msgparameters&&null!=a.msgparameters.onchuckend)a.msgparameters.onchuckend();a.Dispatch("OnPartEnd");b=a.utterances.indexOf(b.utterance);a.currentMsg=a.utterances[b+1]};a.onboundary=function(b){a.log("On Boundary");a.iOS&&!a.onstartFired&&a.speech_onstart()};a.numToWords=function(b){function c(t){if(Array.isArray(t)){for(var q= +0,v=Array(t.length);q<t.length;q++)v[q]=t[q];return v}return Array.from(t)}var d=function(){return function(t,q){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t)){var v=[],y=!0,E=!1,F=void 0;try{for(var D=t[Symbol.iterator](),G;!(y=(G=D.next()).done)&&(v.push(G.value),!q||v.length!==q);y=!0);}catch(H){E=!0,F=H}finally{try{if(!y&&D["return"])D["return"]()}finally{if(E)throw F;}}return v}throw new TypeError("Invalid attempt to destructure non-iterable instance");}}(),e=function(t){return 0=== +t.length},m=function(t){return function(q){return q.slice(0,t)}},f=function(t){return function(q){return q.slice(t)}},h=function(t){return t.slice(0).reverse()},r=function(t){return function(q){return function(v){return t(q(v))}}},p=function(t){return!t},u=function v(q){return function(y){return e(y)?[]:[m(q)(y)].concat(c(v(q)(f(q)(y))))}},x=" one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen".split(" "),B=" twenty thirty forty fifty sixty seventy eighty ninety".split(" "), +A=" thousand million billion trillion quadrillion quintillion sextillion septillion octillion nonillion".split(" "),C=function(q){var v=d(q,3);q=v[0];var y=v[1];v=v[2];return[0===(Number(v)||0)?"":x[v]+" hundred ",0===(Number(q)||0)?B[y]:B[y]&&B[y]+" "||"",x[y+q]||x[q]].join("")},I=function(q,v){return""===q?q:q+" "+A[v]};return"number"===typeof b?a.numToWords(String(b)):"0"===b?"zero":r(u(3))(h)(Array.from(b)).map(C).map(I).filter(r(p)(e)).reverse().join(" ").trim()};a.getWords=function(b){b=b.replace(/$|\u00a5|\u20a1|\u20ac|\u00a3|\u20aa|\u20b9|\uffe5|\u17db|\u20a9|\u20a6|\u0e3f|\u20b4|\u20ab/gi, +" dummy currency ");var c=b.split(/(\s*[\s,]\s*|\?|;|:|\.|\(|\)|!)/);c=c.filter(function(e){return/[^\s]/.test(e)});for(var d=0;d<c.length;d++)null!=(b=c[d].toString().match(/\d+/))&&(c.splice(d,1),a.numToWords(+b[0]).split(/\s+/).map(function(e){c.push(e)}));return c};a.getEstimatedTimeLength=function(b,c){var d=a.getWords(b),e=0,m=a.fallbackMode?1300:700;c=c||1;d.map(function(r,p){e+=(r.toString().match(/[^ ]/igm)||r).length});var f=d.length,h=60/a.WORDS_PER_MINUTE*c*1E3*f;5>f&&(h=c*(m+50*e));a.log("Estimated time length: "+ +h+" ms, words: ["+d+"], charsCount: "+e);return h};a.validateParameters=function(b,c){if("undefined"===typeof b[c])return b[c];switch(c){case "rate":case "pitch":case "volume":var d=Number(b[c]);isNaN(d)&&console.warn("ResponsiveVoice: the parameter "+c+' has a wrong value "'+b[c]+'". Defaults were used.');b[c]=isNaN(d)?"1":b[c]}return b[c]};a.services={NATIVE_TTS:0,FALLBACK_AUDIO:1};a.servicesPriority=[0,1];a.servicesEnabled=[];a.setServiceEnabled=function(b,c){a.servicesEnabled[b]=c};a.getServiceEnabled= +function(b){return a.servicesEnabled[b]||!1};a.setServiceEnabled(a.services.NATIVE_TTS,!0);a.setServiceEnabled(a.services.FALLBACK_AUDIO,!0);a.forceFallbackMode=function(b){a.forcedFallbackMode=b;a.fallbackMode=b;a.mapRVs();a.Dispatch("OnServiceSwitched")};a.enableWindowClickHook=function(){a.userInteractionEvents.forEach(function(b){window.addEventListener(b,a.clickEvent,!1)})};a.setTextReplacements=function(b){if(null==b)w=null;else{w=[];for(var c=0;c<b.length;c++){var d=b[c],e=d.searchvalue;if("string"== +typeof e)try{var m=e.match(/^\/(.*?)\/([gimy]*)$/),f=new RegExp(m[1],m[2]);f instanceof RegExp&&(e=f)}catch(h){e=new RegExp(e,"g")}w.push({searchvalue:e,newvalue:d.newvalue,collectionvoices:d.collectionvoices,systemvoices:d.systemvoices})}}};var z=/(code\.responsivevoice\.org|local-lb).*?responsivevoice(\.\w+)?\.js/ig;"interactive"===document.readyState?a.init():document.addEventListener("DOMContentLoaded",function(){a.init()})},responsiveVoice=new ResponsiveVoice; + +/// -------- RESPONSIVE VOICE ends + responsiveVoice.debug = true; +} + +if( document.location.search && /rvWebsiteVerify=VZgeKlw3/gi.test(document.location.search) ){ + function rvNotificationPopup(){ + + var css = '#rv_VZgeKlw3_notification,#rv_VZgeKlw3_notification *{font-family:"Open Sans",Helvetica,Arial,sans-serif,Tahoma!important}#rv_VZgeKlw3_notification{transition-duration:.3s;opacity:1;transform:scale(1);background:#fff;border:1px solid rgba(0,0,0,.125);border-radius:.3rem;position:fixed;z-index:2147483646;top:20px;left:20px;width:400px;padding:25px;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.3);-moz-box-shadow:0 2px 4px 0 rgba(0,0,0,.3);box-shadow:0 2px 4px 0 rgba(0,0,0,.3)}#rv_VZgeKlw3_notification .rv_notification_logo{background:url(https://app.responsivevoice.org/favicon-96x96.png) no-repeat;background-size:50px 50px;float:left;margin:0 20px 0 0;width:50px;height:50px}#rv_VZgeKlw3_notification_play{background:url(https://app.responsivevoice.org/images/play.png) no-repeat;background-size:25px 25px;float:left;margin:0 5px 0 0;width:25px;height:25px;cursor:pointer}#rv_VZgeKlw3_notification .rv_notification_body{float:left;color:#343a40;font-size:13px;width:78%;min-height:50px;vertical-align:middle}#rv_VZgeKlw3_notification .rv_notification_title{color:#1d643b;font-size:16px;font-weight:700;margin:1px 0 4px 0;display:inline-block}#rv_VZgeKlw3_notification_close{position:absolute;top:15px;right:15px;font-size:22px;color:#343a40;cursor:pointer;line-height:11px}.rv_notification_clear{clear:both}', + head = document.head || document.getElementsByTagName('head')[0], + style = document.createElement('style'); + head.appendChild(style); + style.type = 'text/css'; + + if (style.styleSheet){ + + style.styleSheet.cssText = css; + } else { + style.appendChild(document.createTextNode(css) ); + } + + + var rvNotification = document.createElement('div'); + rvNotification.innerHTML = '<div id=rv_VZgeKlw3_notification><div id=rv_VZgeKlw3_notification_close>×</div><div class=rv_notification_logo></div><div class=rv_notification_body><div id=rv_VZgeKlw3_notification_play></div><span class=rv_notification_title>ResponsiveVoice URL verified</span><br><span class=rv_notification_text>Your <i style="display: none;">ResponsivVoice</i> code snippet is correctly installed, you may now close this window.</span></div><div class=rv_notification_clear></div></div>'; + document.body.appendChild(rvNotification); + + + function speakVerification(){ + responsiveVoice.speak( document.getElementById('rv_VZgeKlw3_notification').getElementsByClassName('rv_notification_text')[0].textContent ); + } + + document.getElementById("rv_VZgeKlw3_notification_play").addEventListener( "click" , function(e) { + speakVerification(); + }); + + document.getElementById("rv_VZgeKlw3_notification_close").addEventListener( "click" , function(e) { + style.remove(); + rvNotification.remove(); + }); + + speakVerification(); + } + + document.addEventListener('DOMContentLoaded', function(){ + var xhttp = new XMLHttpRequest(); + xhttp.open("POST", "https://code.responsivevoice.org/verify/VZgeKlw3", true); + xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + xhttp.send("rv=" + (typeof responsiveVoice !== 'undefined') ); + xhttp.onreadystatechange = function() { + if (this.readyState == 4 && this.status == 200) { + rvNotificationPopup(); + } + }; + }, false); +} + + +/** + Copyright (c) Tristen Brown + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +!function(e,t){if("function"==typeof define&&define.amd)define("hoverintent",["module"],t);else if("undefined"!=typeof exports)t(module);else{var n={exports:{}};t(n),e.hoverintent=n.exports}}(this,function(e){"use strict";var t=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e};e.exports=function(e,n,o){function i(e,t){return y&&(y=clearTimeout(y)),b=0,p?void 0:o.call(e,t)}function r(e){m=e.clientX,d=e.clientY}function u(e,t){if(y&&(y=clearTimeout(y)),Math.abs(h-m)+Math.abs(E-d)<x.sensitivity)return b=1,p?void 0:n.call(e,t);h=m,E=d,y=setTimeout(function(){u(e,t)},x.interval)}function s(t){return L=!0,y&&(y=clearTimeout(y)),e.removeEventListener("mousemove",r,!1),1!==b&&(h=t.clientX,E=t.clientY,e.addEventListener("mousemove",r,!1),y=setTimeout(function(){u(e,t)},x.interval)),this}function c(t){return L=!1,y&&(y=clearTimeout(y)),e.removeEventListener("mousemove",r,!1),1===b&&(y=setTimeout(function(){i(e,t)},x.timeout)),this}function v(t){L||(p=!0,n.call(e,t))}function a(t){!L&&p&&(p=!1,o.call(e,t))}function f(){e.addEventListener("focus",v,!1),e.addEventListener("blur",a,!1)}function l(){e.removeEventListener("focus",v,!1),e.removeEventListener("blur",a,!1)}var m,d,h,E,L=!1,p=!1,T={},b=0,y=0,x={sensitivity:7,interval:100,timeout:0,handleFocus:!1};return T.options=function(e){var n=e.handleFocus!==x.handleFocus;return x=t({},x,e),n&&(x.handleFocus?f():l()),T},T.remove=function(){e&&(e.removeEventListener("mouseover",s,!1),e.removeEventListener("mouseout",c,!1),l())},e&&(e.addEventListener("mouseover",s,!1),e.addEventListener("mouseout",c,!1)),T}}); + +var config = {"welcomeMessage":false,"speakSelectedText":false,"speakLinks":false,"speakInactivity":false,"speakEndPage":false,"exitIntent":false,"accesibilityNavigation":false,"accesibilityNavigation2":false,"welcomeMessageTime":false,"text_welcomeMessage":null,"text_speakInactivity":"","text_speakEndPage":"","text_exitIntent":"","trackEvents":false,"abTesting":false,"analytics_id":null,"another_field":null}; + + /*<!-- LearnBriteAnalytics --> +var _wla = _wla || []; +_wla.push(['trackPageView']); +//_wla.setCountPrerender(true); +_wla.push(['enableLinkTracking']); +(function() { + var u="//ai.learnbrite.com/"; + _wla.push(['setTrackerUrl', u+'analytics.php']); + _wla.push(['setSiteId', 75]); + var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; + g.type='text/javascript'; + g.async=true; g.defer=true; g.src=u+'analytics.js.php'; s.parentNode.insertBefore(g,s); })(); */ + +var splitTestEnabled = config.abTesting || false; +var splitTest_useGS = (Math.random() < 0.5); + +function GetRandomMsg(text) { + var texts = text.split("|"); + return texts[Math.floor(Math.random() * texts.length)]; +} + +function getHiddenProp(){ + var prefixes = ['webkit', 'moz', 'ms', 'o']; + + // if 'hidden' is natively supported just return it + if ('hidden' in document) return 'hidden'; + + // otherwise loop over all the known prefixes until we find one + for (var i = 0; i < prefixes.length; i++) { + if ((prefixes[i] + 'Hidden') in document) + return prefixes[i] + 'Hidden'; + } + + // otherwise it's not supported + return null; +} + +function getVisibilityState() { + var prefixes = ['webkit', 'moz', 'ms', 'o']; + + // if 'visibilityState' is natively supported just return it + if ('visibilityState' in document) return 'visibilityState'; + + // otherwise loop over all the known prefixes until we find one + for (var i = 0; i < prefixes.length; i++) { + if ((prefixes[i] + 'VisibilityState') in document) + return prefixes[i] + 'VisibilityState'; + } + // otherwise it's not supported + return null; +} + +function isHidden() { + var prop = getHiddenProp(); + if (!prop) return false; + + return document[prop]; +} + +function isPrerendered() { + var prop = getVisibilityState(); + //console.log(prop); + if (!prop) return false; + //console.log(document[prop]); + if (document[prop] != "prerender") return false; + return document[prop]; +} +console.log("isHidden: " + isHidden()); +console.log("Prerender: " + isPrerendered()); + +//Analytics + + + + +//Search Message + +var prerenderUsed = false; + +if (isPrerendered() && !prerenderUsed) { + prerenderUsed = true; + setTimeout(function () { + + if (!splitTestEnabled || (splitTestEnabled && splitTest_useGS)) { + var txt = GetRandomMsg(''); + if (txt != null && txt != "") { + console.log("Launching search message"); + responsiveVoice.speak("According to Voicebrite, " + txt, 'UK English Male'); + } + } + + //Search Message Split Test - Impression + if (splitTestEnabled) { + if (splitTest_useGS) { + trackEvent('searchMessage', 'impressionAB', 'true'); + } else { + trackEvent('searchMessage', 'impressionAB', 'false'); + } + } else { + trackEvent('searchMessage', 'impression'); + } + + }, 1500); + +} + +window.addEventListener('load', function() { +//We came from prerender + var smessInterval = null; + if (prerenderUsed) { + smessInterval = setInterval(function () { + if (!isPrerendered()) { + + clearInterval(smessInterval); + + //Search Message Split Test - Impression + if (splitTestEnabled) { + if (splitTest_useGS) { + trackEvent('searchMessage', 'visitAB', 'true'); + } else { + trackEvent('searchMessage', 'visitAB', 'false'); + } + } else { + trackEvent('searchMessage', 'visit'); + } + } + }, 1000); + } + + console.log("Configuring"); + + //Speak links + var _allLinks = document.getElementsByTagName('a') + Array.prototype.forEach.call(_allLinks, function(el) { + hoverintent(el, + function () { + if (config.speakLinks) { + //responsiveVoice.cancel(); + responsiveVoice.speak(el.textContent, 'UK English Male'); + trackEvent('agentFeature', 'spokenLink'); + } + }, function () { + } + ); + }); + + + //Speak selected text + var selectedText = ""; + var last_selectedText = ""; + + function getSelectionText() { + var text = ""; + if (window.getSelection) { + text = window.getSelection().toString(); + } else if (document.selection && document.selection.type != "Control") { // for Internet Explorer 8 and below + text = document.selection.createRange().text; + } + return text; + } + + if (config.speakSelectedText) { + attachToElements( document.querySelectorAll("PRE,DIV"), ['mouseup', 'touchend'], onMouseUp); + } + + function attachToElements(elements, events, callback){ + if(elements.length > 0){ + for(var i = 0; i < elements.length; i++){ + events.forEach(function(event){ + elements[i].addEventListener(event, function(e){ + callback(); + }); + }); + } + } + } + + function onMouseUp() { + selectedText = getSelectionText(); + console.log("Selected text *" + selectedText + "*"); + if (selectedText != last_selectedText && selectedText != "") { + last_selectedText = selectedText; + + responsiveVoice.cancel(); // stop anything currently being spoken + responsiveVoice.speak(selectedText, 'UK English Male'); //speak the text as returned by getSelectionText + trackEvent('agentFeature', 'highlightText'); + } + } + + //Speak welcome message. Will only play if user didn't came from google. + var welcomeMessageLaunched = false; + if (config.welcomeMessage && (!config.welcomeMessageTime || oneTimeTest("welcomeMessage")) && !isPrerendered() && !prerenderUsed) { + welcomeMessageLaunched = true; + setTimeout(function () { + if (config.text_welcomeMessage != null && config.text_welcomeMessage != "") { + console.log("Launching welcome message"); + responsiveVoice.speak(GetRandomMsg(config.text_welcomeMessage), 'UK English Male'); + trackEvent('agentFeature', 'welcomeMessage'); + } + }, 1500); + } + + //Speak welcome message when user came from Google. Won't play if default message played + var welcomeMessage2Launched = false; + var welcomeMessage2Interval = null; + if (!welcomeMessageLaunched && config.welcomeMessage2 && (!config.welcomeMessageTime || oneTimeTest("welcomeMessage2")) + && config.text_welcomeMessage2 != null && config.text_welcomeMessage2 != "") { + //Wait until we're visible and launch message + + welcomeMessage2Interval = setInterval(function () { + console.log("Welcome Message from Google Waiting"); + if (!isPrerendered() && !welcomeMessage2Launched) { + console.log("Welcome Message from Google launched"); + + welcomeMessage2Launched = true; + responsiveVoice.speak(GetRandomMsg(config.text_welcomeMessage2), 'UK English Male'); + trackEvent('agentFeature', 'welcomeMessage2'); + clearInterval(welcomeMessage2Interval); + } + + }, 1000); + } + + //Speak when scroll end + function bindScroll() { + if ((window.innerHeight + window.pageYOffset) >= document.body.offsetHeight - 100 && config.text_speakEndPage != null && config.text_speakEndPage != "") { + console.log("bottom"); + window.removeEventListener('scroll', bindScroll); + + responsiveVoice.speak(GetRandomMsg(config.text_speakEndPage), 'UK English Male'); + trackEvent('agentFeature', 'scrollEnd'); + } + } + + if (config.speakEndPage) { + window.addEventListener('scroll', bindScroll); + } + + //Inactivity + var idleTime = 0; + if (config.speakInactivity) { + setInterval(timerIncrement, 1000); + + window.addEventListener('mousemove', function() { + idleTime = 0; + }); + + window.addEventListener('keyup', function() { + idleTime = 0; + }); + } + + function timerIncrement() { + idleTime += 1000; + + if (idleTime >= 30000) { + responsiveVoice.speak(GetRandomMsg(config.text_speakInactivity), 'UK English Male'); + trackEvent('agentFeature', 'inactivity'); + idleTime = 0; + } + } + + //Exit intent + if (config.speakInactivity) { + console.info("setting up exit intent"); + document.addEventListener('mouseout', exitIntent); + } + + function exitIntent(e) { + if (e.clientY < 0) { + responsiveVoice.speak(GetRandomMsg(config.text_exitIntent), 'UK English Male'); + trackEvent('agentFeature', 'exitIntent'); + } + } + + //Tab and ctrl to speak - Accessibility Navigation + var started = 0; + if (config.accesibilityNavigation) { + console.log("accesibilityNavigation"); + + document.addEventListener('keyup',function(e){ + console.log('keyup called'); + + var code = e.keyCode || e.which; + + if(e.target){ + switch(e.target.tagName){ + case 'A': + if (code == '9') { + responsiveVoice.speak('Link 2 ' + e.target.text, 'UK English Male'); + trackEvent('agentFeature', 'accesibilityNavigation', 'tab'); + } + break; + + case 'BUTTON': + if (code == '9') { + setTimeout(responsiveVoice.speak( e.target.textContent + ' button', 'UK English Male'), 1000); + trackEvent('agentFeature', 'accesibilityNavigation', 'tab'); + } + break; + + case 'TEXTAREA': + if (code == '9') { + responsiveVoice.speak('Text Input ' + document.querySelectorAll(':focus')[0].getAttribute('placeholder'), 'UK English Male'); + trackEvent('agentFeature', 'accesibilityNavigation', 'tab'); + } + break; + } + } + }); + } + + if (config.accesibilityNavigation2) { + + document.addEventListener('keyup',function(e){ + console.log('keyup called'); + + var code = e.keyCode || e.which; + + if (code == '40' && e.ctrlKey) { + console.log('ctrl + down arrow'); + + responsiveVoice.speak(document.querySelectorAll('p')[started].textContent, 'UK English Male'); + trackEvent('agentFeature', 'accesibilityNavigation', 'ctrl-arrow'); + document.querySelectorAll('p')[started].scrollIntoView(false); + started = started + 1; + } + if (code == '38' && e.ctrlKey) { + console.log('ctrl + up arrow'); + + responsiveVoice.speak(document.querySelectorAll('p')[started].textContent, 'UK English Male'); + trackEvent('agentFeature', 'accesibilityNavigation', 'ctrl-arrow'); + document.querySelectorAll('p')[started].scrollIntoView(false); + started = started - 1; + if(started < 1){ + started = 0; + } + } + }); + } +}); + + +function createCookie(name, value, days) { + if (days) { + var date = new Date(); + date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); + var expires = "; expires=" + date.toGMTString(); + } else var expires = ""; + document.cookie = name + "=" + value + expires + "; path=/"; +} + +function readCookie(name) { + var nameEQ = name + "="; + var ca = document.cookie.split(';'); + for (var i = 0; i < ca.length; i++) { + var c = ca[i]; + while (c.charAt(0) == ' ') c = c.substring(1, c.length); + if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length); + } + return null; +} + +function eraseCookie(name) { + createCookie(name, "", -1); +} + +function getOrCreateTest(name, prob, days) { + + var c = readCookie(name); + + if (c == null) { + console.log("Cookie set"); + var v = (Math.random() < (prob != null ? prob : 0.5)); + //1 hour + createCookie(name, v.toString(), (days != null ? days : (1 / 24))); + return v; + } + console.log("Cookie read"); + return c == (true).toString(); + +} + +function oneTimeTest(name, days) { + + var c = readCookie(name); + + if (c == null) { + console.log("Cookie set - one time True"); + //1 hour + createCookie(name, (false).toString(), (days != null ? days : (0.5 / 24))); + return true; + } + console.log("Cookie read - one time False"); + return false; + +} + +function trackEvent(category, action, name, value) { + + if (config.trackEvents != true) return; + + console.log("Track " + category + "," + action + "," + name); + + var url = 'https://ai.learnbrite.com/analytics.php'; + var postArray = []; + + var data = { + idsite: config.analytics_id, + rec: 1, + url: window.location.href, + rand: Math.floor(Math.random() * 1000000000), + e_c: category, + e_a: action, + e_n: name, + e_v: value + }; + + for (var property in data){ + postArray.push( encodeURI(property + '=' + data[property])); + } + + var xhttp = new XMLHttpRequest(); + + xhttp.open("POST", url, true); + xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + xhttp.send( postArray.join('&') ); + + xhttp.onreadystatechange = function() { + if (this.readyState == 4 && this.status == 200) { + console.log("Tracking Success"); + console.log(data); + } + }; +} +</script> \ No newline at end of file diff --git a/dist/css/AdminLTE.css b/dist/css/AdminLTE.css new file mode 100644 index 0000000..2b6b9ee --- /dev/null +++ b/dist/css/AdminLTE.css @@ -0,0 +1,4729 @@ +@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic); +/*! + * AdminLTE v2.3.0 + * Author: Almsaeed Studio + * Website: Almsaeed Studio <http://almsaeedstudio.com> + * License: Open source - MIT + * Please visit http://opensource.org/licenses/MIT for more information +!*/ +/* + * Core: General Layout Style + * ------------------------- + */ +html, +body { + min-height: 100%; +} +.layout-boxed html, +.layout-boxed body { + height: 100%; +} +body { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-weight: 400; + overflow-x: hidden; + overflow-y: auto; +} +/* Layout */ +.wrapper { + min-height: 100%; + position: static; + overflow: hidden; +} +.wrapper:before, +.wrapper:after { + content: " "; + display: table; +} +.wrapper:after { + clear: both; +} +.layout-boxed .wrapper { + max-width: 1250px; + margin: 0 auto; + min-height: 100%; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.5); + position: relative; +} +.layout-boxed { + background: url('../img/boxed-bg.jpg') repeat fixed; +} +/* + * Content Wrapper - contains the main content + * ```.right-side has been deprecated as of v2.0.0 in favor of .content-wrapper ``` + */ +.content-wrapper, +.right-side, +.main-footer { + -webkit-transition: -webkit-transform 0.3s ease-in-out, margin 0.3s ease-in-out; + -moz-transition: -moz-transform 0.3s ease-in-out, margin 0.3s ease-in-out; + -o-transition: -o-transform 0.3s ease-in-out, margin 0.3s ease-in-out; + transition: transform 0.3s ease-in-out, margin 0.3s ease-in-out; + margin-left: 230px; + z-index: 820; +} +.layout-top-nav .content-wrapper, +.layout-top-nav .right-side, +.layout-top-nav .main-footer { + margin-left: 0; +} +@media (max-width: 767px) { + .content-wrapper, + .right-side, + .main-footer { + margin-left: 0; + } +} +@media (min-width: 768px) { + .sidebar-collapse .content-wrapper, + .sidebar-collapse .right-side, + .sidebar-collapse .main-footer { + margin-left: 0; + } +} +@media (max-width: 767px) { + .sidebar-open .content-wrapper, + .sidebar-open .right-side, + .sidebar-open .main-footer { + -webkit-transform: translate(230px, 0); + -ms-transform: translate(230px, 0); + -o-transform: translate(230px, 0); + transform: translate(230px, 0); + } +} +.content-wrapper, +.right-side { + min-height: 100%; + background-color: #ecf0f5; + z-index: 800; +} +.main-footer { + background: #fff; + padding: 15px; + color: #444; + border-top: 1px solid #d2d6de; +} +/* Fixed layout */ +.fixed .main-header, +.fixed .main-sidebar, +.fixed .left-side { + position: fixed; +} +.fixed .main-header { + top: 0; + right: 0; + left: 0; +} +.fixed .content-wrapper, +.fixed .right-side { + padding-top: 50px; +} +@media (max-width: 767px) { + .fixed .content-wrapper, + .fixed .right-side { + padding-top: 100px; + } +} +.fixed.layout-boxed .wrapper { + max-width: 100%; +} +body.hold-transition .content-wrapper, +body.hold-transition .right-side, +body.hold-transition .main-footer, +body.hold-transition .main-sidebar, +body.hold-transition .left-side, +body.hold-transition .main-header > .navbar, +body.hold-transition .main-header .logo { + /* Fix for IE */ + -webkit-transition: none; + -o-transition: none; + transition: none; +} +/* Content */ +.content { + min-height: 250px; + padding: 15px; + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +/* H1 - H6 font */ +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: 'Source Sans Pro', sans-serif; +} +/* General Links */ +a { + color: #3c8dbc; +} +a:hover, +a:active, +a:focus { + outline: none; + text-decoration: none; + color: #72afd2; +} +/* Page Header */ +.page-header { + margin: 10px 0 20px 0; + font-size: 22px; +} +.page-header > small { + color: #666; + display: block; + margin-top: 5px; +} +/* + * Component: Main Header + * ---------------------- + */ +.main-header { + position: relative; + max-height: 100px; + z-index: 1030; +} +.main-header > .navbar { + -webkit-transition: margin-left 0.3s ease-in-out; + -o-transition: margin-left 0.3s ease-in-out; + transition: margin-left 0.3s ease-in-out; + margin-bottom: 0; + margin-left: 230px; + border: none; + min-height: 50px; + border-radius: 0; +} +.layout-top-nav .main-header > .navbar { + margin-left: 0; +} +.main-header #navbar-search-input.form-control { + background: rgba(255, 255, 255, 0.2); + border-color: transparent; +} +.main-header #navbar-search-input.form-control:focus, +.main-header #navbar-search-input.form-control:active { + border-color: rgba(0, 0, 0, 0.1); + background: rgba(255, 255, 255, 0.9); +} +.main-header #navbar-search-input.form-control::-moz-placeholder { + color: #ccc; + opacity: 1; +} +.main-header #navbar-search-input.form-control:-ms-input-placeholder { + color: #ccc; +} +.main-header #navbar-search-input.form-control::-webkit-input-placeholder { + color: #ccc; +} +.main-header .navbar-custom-menu, +.main-header .navbar-right { + float: right; +} +@media (max-width: 991px) { + .main-header .navbar-custom-menu a, + .main-header .navbar-right a { + color: inherit; + background: transparent; + } +} +@media (max-width: 767px) { + .main-header .navbar-right { + float: none; + } + .navbar-collapse .main-header .navbar-right { + margin: 7.5px -15px; + } + .main-header .navbar-right > li { + color: inherit; + border: 0; + } +} +.main-header .sidebar-toggle { + float: left; + background-color: transparent; + background-image: none; + padding: 15px 15px; + font-family: fontAwesome; +} +.main-header .sidebar-toggle:before { + content: "\f0c9"; +} +.main-header .sidebar-toggle:hover { + color: #fff; +} +.main-header .sidebar-toggle:focus, +.main-header .sidebar-toggle:active { + background: transparent; +} +.main-header .sidebar-toggle .icon-bar { + display: none; +} +.main-header .navbar .nav > li.user > a > .fa, +.main-header .navbar .nav > li.user > a > .glyphicon, +.main-header .navbar .nav > li.user > a > .ion { + margin-right: 5px; +} +.main-header .navbar .nav > li > a > .label { + position: absolute; + top: 9px; + right: 7px; + text-align: center; + font-size: 9px; + padding: 2px 3px; + line-height: .9; +} +.main-header .logo { + -webkit-transition: width 0.3s ease-in-out; + -o-transition: width 0.3s ease-in-out; + transition: width 0.3s ease-in-out; + display: block; + float: left; + height: 50px; + font-size: 20px; + line-height: 50px; + text-align: center; + width: 230px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + padding: 0 15px; + font-weight: 300; + overflow: hidden; +} +.main-header .logo .logo-lg { + display: block; +} +.main-header .logo .logo-mini { + display: none; +} +.main-header .navbar-brand { + color: #fff; +} +.content-header { + position: relative; + padding: 15px 15px 0 15px; +} +.content-header > h1 { + margin: 0; + font-size: 24px; +} +.content-header > h1 > small { + font-size: 15px; + display: inline-block; + padding-left: 4px; + font-weight: 300; +} +.content-header > .breadcrumb { + float: right; + background: transparent; + margin-top: 0; + margin-bottom: 0; + font-size: 12px; + padding: 7px 5px; + position: absolute; + top: 15px; + right: 10px; + border-radius: 2px; +} +.content-header > .breadcrumb > li > a { + color: #444; + text-decoration: none; + display: inline-block; +} +.content-header > .breadcrumb > li > a > .fa, +.content-header > .breadcrumb > li > a > .glyphicon, +.content-header > .breadcrumb > li > a > .ion { + margin-right: 5px; +} +.content-header > .breadcrumb > li + li:before { + content: '>\00a0'; +} +@media (max-width: 991px) { + .content-header > .breadcrumb { + position: relative; + margin-top: 5px; + top: 0; + right: 0; + float: none; + background: #d2d6de; + padding-left: 10px; + } + .content-header > .breadcrumb li:before { + color: #97a0b3; + } +} +.navbar-toggle { + color: #fff; + border: 0; + margin: 0; + padding: 15px 15px; +} +@media (max-width: 991px) { + .navbar-custom-menu .navbar-nav > li { + float: left; + } + .navbar-custom-menu .navbar-nav { + margin: 0; + float: left; + } + .navbar-custom-menu .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + line-height: 20px; + } +} +@media (max-width: 767px) { + .main-header { + position: relative; + } + .main-header .logo, + .main-header .navbar { + width: 100%; + float: none; + } + .main-header .navbar { + margin: 0; + } + .main-header .navbar-custom-menu { + float: right; + } +} +@media (max-width: 991px) { + .navbar-collapse.pull-left { + float: none!important; + } + .navbar-collapse.pull-left + .navbar-custom-menu { + display: block; + position: absolute; + top: 0; + right: 40px; + } +} +/* + * Component: Sidebar + * ------------------ + */ +.main-sidebar, +.left-side { + position: absolute; + top: 0; + left: 0; + padding-top: 50px; + min-height: 100%; + width: 230px; + z-index: 810; + -webkit-transition: -webkit-transform 0.3s ease-in-out, width 0.3s ease-in-out; + -moz-transition: -moz-transform 0.3s ease-in-out, width 0.3s ease-in-out; + -o-transition: -o-transform 0.3s ease-in-out, width 0.3s ease-in-out; + transition: transform 0.3s ease-in-out, width 0.3s ease-in-out; +} +@media (max-width: 767px) { + .main-sidebar, + .left-side { + padding-top: 100px; + } +} +@media (max-width: 767px) { + .main-sidebar, + .left-side { + -webkit-transform: translate(-230px, 0); + -ms-transform: translate(-230px, 0); + -o-transform: translate(-230px, 0); + transform: translate(-230px, 0); + } +} +@media (min-width: 768px) { + .sidebar-collapse .main-sidebar, + .sidebar-collapse .left-side { + -webkit-transform: translate(-230px, 0); + -ms-transform: translate(-230px, 0); + -o-transform: translate(-230px, 0); + transform: translate(-230px, 0); + } +} +@media (max-width: 767px) { + .sidebar-open .main-sidebar, + .sidebar-open .left-side { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); + } +} +.sidebar { + padding-bottom: 10px; +} +.sidebar-form input:focus { + border-color: transparent; +} +.user-panel { + position: relative; + width: 100%; + padding: 10px; + overflow: hidden; +} +.user-panel:before, +.user-panel:after { + content: " "; + display: table; +} +.user-panel:after { + clear: both; +} +.user-panel > .image > img { + width: 100%; + max-width: 45px; + height: auto; +} +.user-panel > .info { + padding: 5px 5px 5px 15px; + line-height: 1; + position: absolute; + left: 55px; +} +.user-panel > .info > p { + font-weight: 600; + margin-bottom: 9px; +} +.user-panel > .info > a { + text-decoration: none; + padding-right: 5px; + margin-top: 3px; + font-size: 11px; +} +.user-panel > .info > a > .fa, +.user-panel > .info > a > .ion, +.user-panel > .info > a > .glyphicon { + margin-right: 3px; +} +.sidebar-menu { + list-style: none; + margin: 0; + padding: 0; +} +.sidebar-menu > li { + position: relative; + margin: 0; + padding: 0; +} +.sidebar-menu > li > a { + padding: 12px 5px 12px 15px; + display: block; +} +.sidebar-menu > li > a > .fa, +.sidebar-menu > li > a > .glyphicon, +.sidebar-menu > li > a > .ion { + width: 20px; +} +.sidebar-menu > li .label, +.sidebar-menu > li .badge { + margin-top: 3px; + margin-right: 5px; +} +.sidebar-menu li.header { + padding: 10px 25px 10px 15px; + font-size: 12px; +} +.sidebar-menu li > a > .fa-angle-left { + width: auto; + height: auto; + padding: 0; + margin-right: 10px; + margin-top: 3px; +} +.sidebar-menu li.active > a > .fa-angle-left { + -webkit-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + transform: rotate(-90deg); +} +.sidebar-menu li.active > .treeview-menu { + display: block; +} +.sidebar-menu .treeview-menu { + display: none; + list-style: none; + padding: 0; + margin: 0; + padding-left: 5px; +} +.sidebar-menu .treeview-menu .treeview-menu { + padding-left: 20px; +} +.sidebar-menu .treeview-menu > li { + margin: 0; +} +.sidebar-menu .treeview-menu > li > a { + padding: 5px 5px 5px 15px; + display: block; + font-size: 14px; +} +.sidebar-menu .treeview-menu > li > a > .fa, +.sidebar-menu .treeview-menu > li > a > .glyphicon, +.sidebar-menu .treeview-menu > li > a > .ion { + width: 20px; +} +.sidebar-menu .treeview-menu > li > a > .fa-angle-left, +.sidebar-menu .treeview-menu > li > a > .fa-angle-down { + width: auto; +} +/* + * Component: Sidebar Mini + */ +@media (min-width: 768px) { + .sidebar-mini.sidebar-collapse .content-wrapper, + .sidebar-mini.sidebar-collapse .right-side, + .sidebar-mini.sidebar-collapse .main-footer { + margin-left: 50px!important; + z-index: 840; + } + .sidebar-mini.sidebar-collapse .main-sidebar { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); + width: 50px!important; + z-index: 850; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li { + position: relative; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li > a { + margin-right: 0; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span { + border-top-right-radius: 4px; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li:not(.treeview) > a > span { + border-bottom-right-radius: 4px; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + padding-top: 5px; + padding-bottom: 5px; + border-bottom-right-radius: 4px; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > a > span:not(.pull-right), + .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > .treeview-menu { + display: block!important; + position: absolute; + width: 180px; + left: 50px; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > a > span { + top: 0; + margin-left: -3px; + padding: 12px 5px 12px 20px; + background-color: inherit; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > .treeview-menu { + top: 44px; + margin-left: 0; + } + .sidebar-mini.sidebar-collapse .main-sidebar .user-panel > .info, + .sidebar-mini.sidebar-collapse .sidebar-form, + .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span, + .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu, + .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > .pull-right, + .sidebar-mini.sidebar-collapse .sidebar-menu li.header { + display: none!important; + -webkit-transform: translateZ(0); + } + .sidebar-mini.sidebar-collapse .main-header .logo { + width: 50px; + } + .sidebar-mini.sidebar-collapse .main-header .logo > .logo-mini { + display: block; + margin-left: -15px; + margin-right: -15px; + font-size: 18px; + } + .sidebar-mini.sidebar-collapse .main-header .logo > .logo-lg { + display: none; + } + .sidebar-mini.sidebar-collapse .main-header .navbar { + margin-left: 50px; + } +} +.sidebar-menu, +.main-sidebar .user-panel, +.sidebar-menu > li.header { + white-space: nowrap; + overflow: hidden; +} +.sidebar-menu:hover { + overflow: visible; +} +.sidebar-form, +.sidebar-menu > li.header { + overflow: hidden; + text-overflow: clip; +} +.sidebar-menu li > a { + position: relative; +} +.sidebar-menu li > a > .pull-right { + position: absolute; + top: 50%; + right: 10px; + margin-top: -7px; +} +/* + * Component: Control sidebar. By default, this is the right sidebar. + */ +.control-sidebar-bg { + position: fixed; + z-index: 1000; + bottom: 0; +} +.control-sidebar-bg, +.control-sidebar { + top: 0; + right: -230px; + width: 230px; + -webkit-transition: right 0.3s ease-in-out; + -o-transition: right 0.3s ease-in-out; + transition: right 0.3s ease-in-out; +} +.control-sidebar { + position: absolute; + padding-top: 50px; + z-index: 1010; +} +@media (max-width: 768px) { + .control-sidebar { + padding-top: 100px; + } +} +.control-sidebar > .tab-content { + padding: 10px 15px; +} +.control-sidebar.control-sidebar-open, +.control-sidebar.control-sidebar-open + .control-sidebar-bg { + right: 0; +} +.control-sidebar-open .control-sidebar-bg, +.control-sidebar-open .control-sidebar { + right: 0; +} +@media (min-width: 768px) { + .control-sidebar-open .content-wrapper, + .control-sidebar-open .right-side, + .control-sidebar-open .main-footer { + margin-right: 230px; + } +} +.nav-tabs.control-sidebar-tabs > li:first-of-type > a, +.nav-tabs.control-sidebar-tabs > li:first-of-type > a:hover, +.nav-tabs.control-sidebar-tabs > li:first-of-type > a:focus { + border-left-width: 0; +} +.nav-tabs.control-sidebar-tabs > li > a { + border-radius: 0; +} +.nav-tabs.control-sidebar-tabs > li > a, +.nav-tabs.control-sidebar-tabs > li > a:hover { + border-top: none; + border-right: none; + border-left: 1px solid transparent; + border-bottom: 1px solid transparent; +} +.nav-tabs.control-sidebar-tabs > li > a .icon { + font-size: 16px; +} +.nav-tabs.control-sidebar-tabs > li.active > a, +.nav-tabs.control-sidebar-tabs > li.active > a:hover, +.nav-tabs.control-sidebar-tabs > li.active > a:focus, +.nav-tabs.control-sidebar-tabs > li.active > a:active { + border-top: none; + border-right: none; + border-bottom: none; +} +@media (max-width: 768px) { + .nav-tabs.control-sidebar-tabs { + display: table; + } + .nav-tabs.control-sidebar-tabs > li { + display: table-cell; + } +} +.control-sidebar-heading { + font-weight: 400; + font-size: 16px; + padding: 10px 0; + margin-bottom: 10px; +} +.control-sidebar-subheading { + display: block; + font-weight: 400; + font-size: 14px; +} +.control-sidebar-menu { + list-style: none; + padding: 0; + margin: 0 -15px; +} +.control-sidebar-menu > li > a { + display: block; + padding: 10px 15px; +} +.control-sidebar-menu > li > a:before, +.control-sidebar-menu > li > a:after { + content: " "; + display: table; +} +.control-sidebar-menu > li > a:after { + clear: both; +} +.control-sidebar-menu > li > a > .control-sidebar-subheading { + margin-top: 0; +} +.control-sidebar-menu .menu-icon { + float: left; + width: 35px; + height: 35px; + border-radius: 50%; + text-align: center; + line-height: 35px; +} +.control-sidebar-menu .menu-info { + margin-left: 45px; + margin-top: 3px; +} +.control-sidebar-menu .menu-info > .control-sidebar-subheading { + margin: 0; +} +.control-sidebar-menu .menu-info > p { + margin: 0; + font-size: 11px; +} +.control-sidebar-menu .progress { + margin: 0; +} +.control-sidebar-dark { + color: #b8c7ce; +} +.control-sidebar-dark, +.control-sidebar-dark + .control-sidebar-bg { + background: #222d32; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs { + border-bottom: #1c2529; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a { + background: #181f23; + color: #b8c7ce; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus { + border-left-color: #141a1d; + border-bottom-color: #141a1d; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:active { + background: #1c2529; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover { + color: #fff; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:hover, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:focus, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:active { + background: #222d32; + color: #fff; +} +.control-sidebar-dark .control-sidebar-heading, +.control-sidebar-dark .control-sidebar-subheading { + color: #fff; +} +.control-sidebar-dark .control-sidebar-menu > li > a:hover { + background: #1e282c; +} +.control-sidebar-dark .control-sidebar-menu > li > a .menu-info > p { + color: #b8c7ce; +} +.control-sidebar-light { + color: #5e5e5e; +} +.control-sidebar-light, +.control-sidebar-light + .control-sidebar-bg { + background: #f9fafc; + border-left: 1px solid #d2d6de; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs { + border-bottom: #d2d6de; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a { + background: #e8ecf4; + color: #444444; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus { + border-left-color: #d2d6de; + border-bottom-color: #d2d6de; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:active { + background: #eff1f7; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:hover, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:focus, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:active { + background: #f9fafc; + color: #111; +} +.control-sidebar-light .control-sidebar-heading, +.control-sidebar-light .control-sidebar-subheading { + color: #111; +} +.control-sidebar-light .control-sidebar-menu { + margin-left: -14px; +} +.control-sidebar-light .control-sidebar-menu > li > a:hover { + background: #f4f4f5; +} +.control-sidebar-light .control-sidebar-menu > li > a .menu-info > p { + color: #5e5e5e; +} +/* + * Component: Dropdown menus + * ------------------------- + */ +/*Dropdowns in general*/ +.dropdown-menu { + box-shadow: none; + border-color: #eee; +} +.dropdown-menu > li > a { + color: #777; +} +.dropdown-menu > li > a > .glyphicon, +.dropdown-menu > li > a > .fa, +.dropdown-menu > li > a > .ion { + margin-right: 10px; +} +.dropdown-menu > li > a:hover { + background-color: #e1e3e9; + color: #333; +} +.dropdown-menu > .divider { + background-color: #eee; +} +.navbar-nav > .notifications-menu > .dropdown-menu, +.navbar-nav > .messages-menu > .dropdown-menu, +.navbar-nav > .tasks-menu > .dropdown-menu { + width: 280px; + padding: 0 0 0 0; + margin: 0; + top: 100%; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li, +.navbar-nav > .messages-menu > .dropdown-menu > li, +.navbar-nav > .tasks-menu > .dropdown-menu > li { + position: relative; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li.header, +.navbar-nav > .messages-menu > .dropdown-menu > li.header, +.navbar-nav > .tasks-menu > .dropdown-menu > li.header { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + background-color: #ffffff; + padding: 7px 10px; + border-bottom: 1px solid #f4f4f4; + color: #444444; + font-size: 14px; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a, +.navbar-nav > .messages-menu > .dropdown-menu > li.footer > a, +.navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; + font-size: 12px; + background-color: #fff; + padding: 7px 10px; + border-bottom: 1px solid #eeeeee; + color: #444!important; + text-align: center; +} +@media (max-width: 991px) { + .navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a, + .navbar-nav > .messages-menu > .dropdown-menu > li.footer > a, + .navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a { + background: #fff!important; + color: #444!important; + } +} +.navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a:hover, +.navbar-nav > .messages-menu > .dropdown-menu > li.footer > a:hover, +.navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a:hover { + text-decoration: none; + font-weight: normal; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu, +.navbar-nav > .messages-menu > .dropdown-menu > li .menu, +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu { + max-height: 200px; + margin: 0; + padding: 0; + list-style: none; + overflow-x: hidden; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a, +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a, +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a { + display: block; + white-space: nowrap; + /* Prevent text from breaking */ + border-bottom: 1px solid #f4f4f4; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a:hover, +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:hover, +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a:hover { + background: #f4f4f4; + text-decoration: none; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a { + color: #444444; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + padding: 10px; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .glyphicon, +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .fa, +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .ion { + width: 20px; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a { + margin: 0; + padding: 10px 10px; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > div > img { + margin: auto 10px auto auto; + width: 40px; + height: 40px; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 { + padding: 0; + margin: 0 0 0 45px; + color: #444444; + font-size: 15px; + position: relative; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 > small { + color: #999999; + font-size: 10px; + position: absolute; + top: 0; + right: 0; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > p { + margin: 0 0 0 45px; + font-size: 12px; + color: #888888; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:before, +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after { + content: " "; + display: table; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after { + clear: both; +} +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a { + padding: 10px; +} +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > h3 { + font-size: 14px; + padding: 0; + margin: 0 0 10px 0; + color: #666666; +} +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > .progress { + padding: 0; + margin: 0; +} +.navbar-nav > .user-menu > .dropdown-menu { + border-top-right-radius: 0; + border-top-left-radius: 0; + padding: 1px 0 0 0; + border-top-width: 0; + width: 280px; +} +.navbar-nav > .user-menu > .dropdown-menu, +.navbar-nav > .user-menu > .dropdown-menu > .user-body { + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.navbar-nav > .user-menu > .dropdown-menu > li.user-header { + height: 175px; + padding: 10px; + text-align: center; +} +.navbar-nav > .user-menu > .dropdown-menu > li.user-header > img { + z-index: 5; + height: 90px; + width: 90px; + border: 3px solid; + border-color: transparent; + border-color: rgba(255, 255, 255, 0.2); +} +.navbar-nav > .user-menu > .dropdown-menu > li.user-header > p { + z-index: 5; + color: #fff; + color: rgba(255, 255, 255, 0.8); + font-size: 17px; + margin-top: 10px; +} +.navbar-nav > .user-menu > .dropdown-menu > li.user-header > p > small { + display: block; + font-size: 12px; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-body { + padding: 15px; + border-bottom: 1px solid #f4f4f4; + border-top: 1px solid #dddddd; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-body:before, +.navbar-nav > .user-menu > .dropdown-menu > .user-body:after { + content: " "; + display: table; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-body:after { + clear: both; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-body a { + color: #444 !important; +} +@media (max-width: 991px) { + .navbar-nav > .user-menu > .dropdown-menu > .user-body a { + background: #fff !important; + color: #444 !important; + } +} +.navbar-nav > .user-menu > .dropdown-menu > .user-footer { + background-color: #f9f9f9; + padding: 10px; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-footer:before, +.navbar-nav > .user-menu > .dropdown-menu > .user-footer:after { + content: " "; + display: table; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-footer:after { + clear: both; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default { + color: #666666; +} +@media (max-width: 991px) { + .navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default:hover { + background-color: #f9f9f9; + } +} +.navbar-nav > .user-menu .user-image { + float: left; + width: 25px; + height: 25px; + border-radius: 50%; + margin-right: 10px; + margin-top: -2px; +} +@media (max-width: 767px) { + .navbar-nav > .user-menu .user-image { + float: none; + margin-right: 0; + margin-top: -8px; + line-height: 10px; + } +} +/* Add fade animation to dropdown menus by appending + the class .animated-dropdown-menu to the .dropdown-menu ul (or ol)*/ +.open:not(.dropup) > .animated-dropdown-menu { + backface-visibility: visible !important; + -webkit-animation: flipInX 0.7s both; + -o-animation: flipInX 0.7s both; + animation: flipInX 0.7s both; +} +@keyframes flipInX { + 0% { + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transition-timing-function: ease-in; + opacity: 0; + } + 40% { + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transition-timing-function: ease-in; + } + 60% { + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + 80% { + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + 100% { + transform: perspective(400px); + } +} +@-webkit-keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-transition-timing-function: ease-in; + opacity: 0; + } + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-transition-timing-function: ease-in; + } + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + 100% { + -webkit-transform: perspective(400px); + } +} +/* Fix dropdown menu in navbars */ +.navbar-custom-menu > .navbar-nav > li { + position: relative; +} +.navbar-custom-menu > .navbar-nav > li > .dropdown-menu { + position: absolute; + right: 0; + left: auto; +} +@media (max-width: 991px) { + .navbar-custom-menu > .navbar-nav { + float: right; + } + .navbar-custom-menu > .navbar-nav > li { + position: static; + } + .navbar-custom-menu > .navbar-nav > li > .dropdown-menu { + position: absolute; + right: 5%; + left: auto; + border: 1px solid #ddd; + background: #fff; + } +} +/* + * Component: Form + * --------------- + */ +.form-control { + border-radius: 0; + box-shadow: none; + border-color: #d2d6de; +} +.form-control:focus { + border-color: #3c8dbc; + box-shadow: none; +} +.form-control::-moz-placeholder, +.form-control:-ms-input-placeholder, +.form-control::-webkit-input-placeholder { + color: #bbb; + opacity: 1; +} +.form-control:not(select) { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +.form-group.has-success label { + color: #00a65a; +} +.form-group.has-success .form-control { + border-color: #00a65a; + box-shadow: none; +} +.form-group.has-warning label { + color: #f39c12; +} +.form-group.has-warning .form-control { + border-color: #f39c12; + box-shadow: none; +} +.form-group.has-error label { + color: #dd4b39; +} +.form-group.has-error .form-control { + border-color: #dd4b39; + box-shadow: none; +} +/* Input group */ +.input-group .input-group-addon { + border-radius: 0; + border-color: #d2d6de; + background-color: #fff; +} +/* button groups */ +.btn-group-vertical .btn.btn-flat:first-of-type, +.btn-group-vertical .btn.btn-flat:last-of-type { + border-radius: 0; +} +.icheck > label { + padding-left: 0; +} +/* support Font Awesome icons in form-control */ +.form-control-feedback.fa { + line-height: 34px; +} +.input-lg + .form-control-feedback.fa, +.input-group-lg + .form-control-feedback.fa, +.form-group-lg .form-control + .form-control-feedback.fa { + line-height: 46px; +} +.input-sm + .form-control-feedback.fa, +.input-group-sm + .form-control-feedback.fa, +.form-group-sm .form-control + .form-control-feedback.fa { + line-height: 30px; +} +/* + * Component: Progress Bar + * ----------------------- + */ +.progress, +.progress > .progress-bar { + -webkit-box-shadow: none; + box-shadow: none; +} +.progress, +.progress > .progress-bar, +.progress .progress-bar, +.progress > .progress-bar .progress-bar { + border-radius: 1px; +} +/* size variation */ +.progress.sm, +.progress-sm { + height: 10px; +} +.progress.sm, +.progress-sm, +.progress.sm .progress-bar, +.progress-sm .progress-bar { + border-radius: 1px; +} +.progress.xs, +.progress-xs { + height: 7px; +} +.progress.xs, +.progress-xs, +.progress.xs .progress-bar, +.progress-xs .progress-bar { + border-radius: 1px; +} +.progress.xxs, +.progress-xxs { + height: 3px; +} +.progress.xxs, +.progress-xxs, +.progress.xxs .progress-bar, +.progress-xxs .progress-bar { + border-radius: 1px; +} +/* Vertical bars */ +.progress.vertical { + position: relative; + width: 30px; + height: 200px; + display: inline-block; + margin-right: 10px; +} +.progress.vertical > .progress-bar { + width: 100%; + position: absolute; + bottom: 0; +} +.progress.vertical.sm, +.progress.vertical.progress-sm { + width: 20px; +} +.progress.vertical.xs, +.progress.vertical.progress-xs { + width: 10px; +} +.progress.vertical.xxs, +.progress.vertical.progress-xxs { + width: 3px; +} +.progress-group .progress-text { + font-weight: 600; +} +.progress-group .progress-number { + float: right; +} +/* Remove margins from progress bars when put in a table */ +.table tr > td .progress { + margin: 0; +} +.progress-bar-light-blue, +.progress-bar-primary { + background-color: #3c8dbc; +} +.progress-striped .progress-bar-light-blue, +.progress-striped .progress-bar-primary { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-green, +.progress-bar-success { + background-color: #00a65a; +} +.progress-striped .progress-bar-green, +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-aqua, +.progress-bar-info { + background-color: #00c0ef; +} +.progress-striped .progress-bar-aqua, +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-yellow, +.progress-bar-warning { + background-color: #f39c12; +} +.progress-striped .progress-bar-yellow, +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-red, +.progress-bar-danger { + background-color: #dd4b39; +} +.progress-striped .progress-bar-red, +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +/* + * Component: Small Box + * -------------------- + */ +.small-box { + border-radius: 2px; + position: relative; + display: block; + margin-bottom: 20px; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} +.small-box > .inner { + padding: 10px; +} +.small-box > .small-box-footer { + position: relative; + text-align: center; + padding: 3px 0; + color: #fff; + color: rgba(255, 255, 255, 0.8); + display: block; + z-index: 10; + background: rgba(0, 0, 0, 0.1); + text-decoration: none; +} +.small-box > .small-box-footer:hover { + color: #fff; + background: rgba(0, 0, 0, 0.15); +} +.small-box h3 { + font-size: 38px; + font-weight: bold; + margin: 0 0 10px 0; + white-space: nowrap; + padding: 0; +} +.small-box p { + font-size: 15px; +} +.small-box p > small { + display: block; + color: #f9f9f9; + font-size: 13px; + margin-top: 5px; +} +.small-box h3, +.small-box p { + z-index: 5px; +} +.small-box .icon { + -webkit-transition: all 0.3s linear; + -o-transition: all 0.3s linear; + transition: all 0.3s linear; + position: absolute; + top: -10px; + right: 10px; + z-index: 0; + font-size: 90px; + color: rgba(0, 0, 0, 0.15); +} +.small-box:hover { + text-decoration: none; + color: #f9f9f9; +} +.small-box:hover .icon { + font-size: 95px; +} +@media (max-width: 767px) { + .small-box { + text-align: center; + } + .small-box .icon { + display: none; + } + .small-box p { + font-size: 12px; + } +} +/* + * Component: Box + * -------------- + */ +.box { + position: relative; + border-radius: 3px; + background: #ffffff; + border-top: 3px solid #d2d6de; + margin-bottom: 20px; + width: 100%; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} +.box.box-primary { + border-top-color: #3c8dbc; +} +.box.box-info { + border-top-color: #00c0ef; +} +.box.box-danger { + border-top-color: #dd4b39; +} +.box.box-warning { + border-top-color: #f39c12; +} +.box.box-success { + border-top-color: #00a65a; +} +.box.box-default { + border-top-color: #d2d6de; +} +.box.collapsed-box .box-body, +.box.collapsed-box .box-footer { + display: none; +} +.box .nav-stacked > li { + border-bottom: 1px solid #f4f4f4; + margin: 0; +} +.box .nav-stacked > li:last-of-type { + border-bottom: none; +} +.box.height-control .box-body { + max-height: 300px; + overflow: auto; +} +.box .border-right { + border-right: 1px solid #f4f4f4; +} +.box .border-left { + border-left: 1px solid #f4f4f4; +} +.box.box-solid { + border-top: 0; +} +.box.box-solid > .box-header .btn.btn-default { + background: transparent; +} +.box.box-solid > .box-header .btn:hover, +.box.box-solid > .box-header a:hover { + background: rgba(0, 0, 0, 0.1); +} +.box.box-solid.box-default { + border: 1px solid #d2d6de; +} +.box.box-solid.box-default > .box-header { + color: #444444; + background: #d2d6de; + background-color: #d2d6de; +} +.box.box-solid.box-default > .box-header a, +.box.box-solid.box-default > .box-header .btn { + color: #444444; +} +.box.box-solid.box-primary { + border: 1px solid #3c8dbc; +} +.box.box-solid.box-primary > .box-header { + color: #ffffff; + background: #3c8dbc; + background-color: #3c8dbc; +} +.box.box-solid.box-primary > .box-header a, +.box.box-solid.box-primary > .box-header .btn { + color: #ffffff; +} +.box.box-solid.box-info { + border: 1px solid #00c0ef; +} +.box.box-solid.box-info > .box-header { + color: #ffffff; + background: #00c0ef; + background-color: #00c0ef; +} +.box.box-solid.box-info > .box-header a, +.box.box-solid.box-info > .box-header .btn { + color: #ffffff; +} +.box.box-solid.box-danger { + border: 1px solid #dd4b39; +} +.box.box-solid.box-danger > .box-header { + color: #ffffff; + background: #dd4b39; + background-color: #dd4b39; +} +.box.box-solid.box-danger > .box-header a, +.box.box-solid.box-danger > .box-header .btn { + color: #ffffff; +} +.box.box-solid.box-warning { + border: 1px solid #f39c12; +} +.box.box-solid.box-warning > .box-header { + color: #ffffff; + background: #f39c12; + background-color: #f39c12; +} +.box.box-solid.box-warning > .box-header a, +.box.box-solid.box-warning > .box-header .btn { + color: #ffffff; +} +.box.box-solid.box-success { + border: 1px solid #00a65a; +} +.box.box-solid.box-success > .box-header { + color: #ffffff; + background: #00a65a; + background-color: #00a65a; +} +.box.box-solid.box-success > .box-header a, +.box.box-solid.box-success > .box-header .btn { + color: #ffffff; +} +.box.box-solid > .box-header > .box-tools .btn { + border: 0; + box-shadow: none; +} +.box.box-solid[class*='bg'] > .box-header { + color: #fff; +} +.box .box-group > .box { + margin-bottom: 5px; +} +.box .knob-label { + text-align: center; + color: #333; + font-weight: 100; + font-size: 12px; + margin-bottom: 0.3em; +} +.box > .overlay, +.overlay-wrapper > .overlay, +.box > .loading-img, +.overlay-wrapper > .loading-img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.box .overlay, +.overlay-wrapper .overlay { + z-index: 50; + background: rgba(255, 255, 255, 0.7); + border-radius: 3px; +} +.box .overlay > .fa, +.overlay-wrapper .overlay > .fa { + position: absolute; + top: 50%; + left: 50%; + margin-left: -15px; + margin-top: -15px; + color: #000; + font-size: 30px; +} +.box .overlay.dark, +.overlay-wrapper .overlay.dark { + background: rgba(0, 0, 0, 0.5); +} +.box-header:before, +.box-body:before, +.box-footer:before, +.box-header:after, +.box-body:after, +.box-footer:after { + content: " "; + display: table; +} +.box-header:after, +.box-body:after, +.box-footer:after { + clear: both; +} +.box-header { + color: #444; + display: block; + padding: 10px; + position: relative; +} +.box-header.with-border { + border-bottom: 1px solid #f4f4f4; +} +.collapsed-box .box-header.with-border { + border-bottom: none; +} +.box-header > .fa, +.box-header > .glyphicon, +.box-header > .ion, +.box-header .box-title { + display: inline-block; + font-size: 18px; + margin: 0; + line-height: 1; +} +.box-header > .fa, +.box-header > .glyphicon, +.box-header > .ion { + margin-right: 5px; +} +.box-header > .box-tools { + position: absolute; + right: 10px; + top: 5px; +} +.box-header > .box-tools [data-toggle="tooltip"] { + position: relative; +} +.box-header > .box-tools.pull-right .dropdown-menu { + right: 0; + left: auto; +} +.btn-box-tool { + padding: 5px; + font-size: 12px; + background: transparent; + color: #97a0b3; +} +.open .btn-box-tool, +.btn-box-tool:hover { + color: #606c84; +} +.btn-box-tool.btn:active { + box-shadow: none; +} +.box-body { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + padding: 10px; +} +.no-header .box-body { + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.box-body > .table { + margin-bottom: 0; +} +.box-body .fc { + margin-top: 5px; +} +.box-body .full-width-chart { + margin: -19px; +} +.box-body.no-padding .full-width-chart { + margin: -9px; +} +.box-body .box-pane { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 3px; +} +.box-body .box-pane-right { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 0; +} +.box-footer { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + border-top: 1px solid #f4f4f4; + padding: 10px; + background-color: #ffffff; +} +.chart-legend { + margin: 10px 0; +} +@media (max-width: 991px) { + .chart-legend > li { + float: left; + margin-right: 10px; + } +} +.box-comments { + background: #f7f7f7; +} +.box-comments .box-comment { + padding: 8px 0; + border-bottom: 1px solid #eee; +} +.box-comments .box-comment:before, +.box-comments .box-comment:after { + content: " "; + display: table; +} +.box-comments .box-comment:after { + clear: both; +} +.box-comments .box-comment:last-of-type { + border-bottom: 0; +} +.box-comments .box-comment:first-of-type { + padding-top: 0; +} +.box-comments .box-comment img { + float: left; +} +.box-comments .comment-text { + margin-left: 40px; + color: #555; +} +.box-comments .username { + color: #444; + display: block; + font-weight: 600; +} +.box-comments .text-muted { + font-weight: 400; + font-size: 12px; +} +/* Widget: TODO LIST */ +.todo-list { + margin: 0; + padding: 0; + list-style: none; + overflow: auto; +} +.todo-list > li { + border-radius: 2px; + padding: 10px; + background: #f4f4f4; + margin-bottom: 2px; + border-left: 2px solid #e6e7e8; + color: #444; +} +.todo-list > li:last-of-type { + margin-bottom: 0; +} +.todo-list > li > input[type='checkbox'] { + margin: 0 10px 0 5px; +} +.todo-list > li .text { + display: inline-block; + margin-left: 5px; + font-weight: 600; +} +.todo-list > li .label { + margin-left: 10px; + font-size: 9px; +} +.todo-list > li .tools { + display: none; + float: right; + color: #dd4b39; +} +.todo-list > li .tools > .fa, +.todo-list > li .tools > .glyphicon, +.todo-list > li .tools > .ion { + margin-right: 5px; + cursor: pointer; +} +.todo-list > li:hover .tools { + display: inline-block; +} +.todo-list > li.done { + color: #999; +} +.todo-list > li.done .text { + text-decoration: line-through; + font-weight: 500; +} +.todo-list > li.done .label { + background: #d2d6de !important; +} +.todo-list .danger { + border-left-color: #dd4b39; +} +.todo-list .warning { + border-left-color: #f39c12; +} +.todo-list .info { + border-left-color: #00c0ef; +} +.todo-list .success { + border-left-color: #00a65a; +} +.todo-list .primary { + border-left-color: #3c8dbc; +} +.todo-list .handle { + display: inline-block; + cursor: move; + margin: 0 5px; +} +/* Chat widget (DEPRECATED - this will be removed in the next major release. Use Direct Chat instead)*/ +.chat { + padding: 5px 20px 5px 10px; +} +.chat .item { + margin-bottom: 10px; +} +.chat .item:before, +.chat .item:after { + content: " "; + display: table; +} +.chat .item:after { + clear: both; +} +.chat .item > img { + width: 40px; + height: 40px; + border: 2px solid transparent; + border-radius: 50%; +} +.chat .item > .online { + border: 2px solid #00a65a; +} +.chat .item > .offline { + border: 2px solid #dd4b39; +} +.chat .item > .message { + margin-left: 55px; + margin-top: -40px; +} +.chat .item > .message > .name { + display: block; + font-weight: 600; +} +.chat .item > .attachment { + border-radius: 3px; + background: #f4f4f4; + margin-left: 65px; + margin-right: 15px; + padding: 10px; +} +.chat .item > .attachment > h4 { + margin: 0 0 5px 0; + font-weight: 600; + font-size: 14px; +} +.chat .item > .attachment > p, +.chat .item > .attachment > .filename { + font-weight: 600; + font-size: 13px; + font-style: italic; + margin: 0; +} +.chat .item > .attachment:before, +.chat .item > .attachment:after { + content: " "; + display: table; +} +.chat .item > .attachment:after { + clear: both; +} +.box-input { + max-width: 200px; +} +.modal .panel-body { + color: #444; +} +/* + * Component: Info Box + * ------------------- + */ +.info-box { + display: block; + min-height: 90px; + background: #fff; + width: 100%; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + border-radius: 2px; + margin-bottom: 15px; +} +.info-box small { + font-size: 14px; +} +.info-box .progress { + background: rgba(0, 0, 0, 0.2); + margin: 5px -10px 5px -10px; + height: 2px; +} +.info-box .progress, +.info-box .progress .progress-bar { + border-radius: 0; +} +.info-box .progress .progress-bar { + background: #fff; +} +.info-box-icon { + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; + display: block; + float: left; + height: 90px; + width: 90px; + text-align: center; + font-size: 45px; + line-height: 90px; + background: rgba(0, 0, 0, 0.2); +} +.info-box-icon > img { + max-width: 100%; +} +.info-box-content { + padding: 5px 10px; + margin-left: 90px; +} +.info-box-number { + display: block; + font-weight: bold; + font-size: 18px; +} +.progress-description, +.info-box-text { + display: block; + font-size: 14px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.info-box-text { + text-transform: uppercase; +} +.info-box-more { + display: block; +} +.progress-description { + margin: 0; +} +/* + * Component: Timeline + * ------------------- + */ +.timeline { + position: relative; + margin: 0 0 30px 0; + padding: 0; + list-style: none; +} +.timeline:before { + content: ''; + position: absolute; + top: 0; + bottom: 0; + width: 4px; + background: #ddd; + left: 31px; + margin: 0; + border-radius: 2px; +} +.timeline > li { + position: relative; + margin-right: 10px; + margin-bottom: 15px; +} +.timeline > li:before, +.timeline > li:after { + content: " "; + display: table; +} +.timeline > li:after { + clear: both; +} +.timeline > li > .timeline-item { + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + border-radius: 3px; + margin-top: 0; + background: #fff; + color: #444; + margin-left: 60px; + margin-right: 15px; + padding: 0; + position: relative; +} +.timeline > li > .timeline-item > .time { + color: #999; + float: right; + padding: 10px; + font-size: 12px; +} +.timeline > li > .timeline-item > .timeline-header { + margin: 0; + color: #555; + border-bottom: 1px solid #f4f4f4; + padding: 10px; + font-size: 16px; + line-height: 1.1; +} +.timeline > li > .timeline-item > .timeline-header > a { + font-weight: 600; +} +.timeline > li > .timeline-item > .timeline-body, +.timeline > li > .timeline-item > .timeline-footer { + padding: 10px; +} +.timeline > li > .fa, +.timeline > li > .glyphicon, +.timeline > li > .ion { + width: 30px; + height: 30px; + font-size: 15px; + line-height: 30px; + position: absolute; + color: #666; + background: #d2d6de; + border-radius: 50%; + text-align: center; + left: 18px; + top: 0; +} +.timeline > .time-label > span { + font-weight: 600; + padding: 5px; + display: inline-block; + background-color: #fff; + border-radius: 4px; +} +.timeline-inverse > li > .timeline-item { + background: #f0f0f0; + border: 1px solid #ddd; + -webkit-box-shadow: none; + box-shadow: none; +} +.timeline-inverse > li > .timeline-item > .timeline-header { + border-bottom-color: #ddd; +} +/* + * Component: Button + * ----------------- + */ +.btn { + border-radius: 3px; + -webkit-box-shadow: none; + box-shadow: none; + border: 1px solid transparent; +} +.btn.uppercase { + text-transform: uppercase; +} +.btn.btn-flat { + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + border-width: 1px; +} +.btn:active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn:focus { + outline: none; +} +.btn.btn-file { + position: relative; + overflow: hidden; +} +.btn.btn-file > input[type='file'] { + position: absolute; + top: 0; + right: 0; + min-width: 100%; + min-height: 100%; + font-size: 100px; + text-align: right; + opacity: 0; + filter: alpha(opacity=0); + outline: none; + background: white; + cursor: inherit; + display: block; +} +.btn-default { + background-color: #f4f4f4; + color: #444; + border-color: #ddd; +} +.btn-default:hover, +.btn-default:active, +.btn-default.hover { + background-color: #e7e7e7; +} +.btn-primary { + background-color: #3c8dbc; + border-color: #367fa9; +} +.btn-primary:hover, +.btn-primary:active, +.btn-primary.hover { + background-color: #367fa9; +} +.btn-success { + background-color: #00a65a; + border-color: #008d4c; +} +.btn-success:hover, +.btn-success:active, +.btn-success.hover { + background-color: #008d4c; +} +.btn-info { + background-color: #00c0ef; + border-color: #00acd6; +} +.btn-info:hover, +.btn-info:active, +.btn-info.hover { + background-color: #00acd6; +} +.btn-danger { + background-color: #dd4b39; + border-color: #d73925; +} +.btn-danger:hover, +.btn-danger:active, +.btn-danger.hover { + background-color: #d73925; +} +.btn-warning { + background-color: #f39c12; + border-color: #e08e0b; +} +.btn-warning:hover, +.btn-warning:active, +.btn-warning.hover { + background-color: #e08e0b; +} +.btn-outline { + border: 1px solid #fff; + background: transparent; + color: #fff; +} +.btn-outline:hover, +.btn-outline:focus, +.btn-outline:active { + color: rgba(255, 255, 255, 0.7); + border-color: rgba(255, 255, 255, 0.7); +} +.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn[class*='bg-']:hover { + -webkit-box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2); + box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2); +} +.btn-app { + border-radius: 3px; + position: relative; + padding: 15px 5px; + margin: 0 0 10px 10px; + min-width: 80px; + height: 60px; + text-align: center; + color: #666; + border: 1px solid #ddd; + background-color: #f4f4f4; + font-size: 12px; +} +.btn-app > .fa, +.btn-app > .glyphicon, +.btn-app > .ion { + font-size: 20px; + display: block; +} +.btn-app:hover { + background: #f4f4f4; + color: #444; + border-color: #aaa; +} +.btn-app:active, +.btn-app:focus { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-app > .badge { + position: absolute; + top: -3px; + right: -10px; + font-size: 10px; + font-weight: 400; +} +/* + * Component: Callout + * ------------------ + */ +.callout { + border-radius: 3px; + margin: 0 0 20px 0; + padding: 15px 30px 15px 15px; + border-left: 5px solid #eee; +} +.callout a { + color: #fff; + text-decoration: underline; +} +.callout a:hover { + color: #eee; +} +.callout h4 { + margin-top: 0; + font-weight: 600; +} +.callout p:last-child { + margin-bottom: 0; +} +.callout code, +.callout .highlight { + background-color: #fff; +} +.callout.callout-danger { + border-color: #c23321; +} +.callout.callout-warning { + border-color: #c87f0a; +} +.callout.callout-info { + border-color: #0097bc; +} +.callout.callout-success { + border-color: #00733e; +} +/* + * Component: alert + * ---------------- + */ +.alert { + border-radius: 3px; +} +.alert h4 { + font-weight: 600; +} +.alert .icon { + margin-right: 10px; +} +.alert .close { + color: #000; + opacity: 0.2; + filter: alpha(opacity=20); +} +.alert .close:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} +.alert a { + color: #fff; + text-decoration: underline; +} +.alert-success { + border-color: #008d4c; +} +.alert-danger, +.alert-error { + border-color: #d73925; +} +.alert-warning { + border-color: #e08e0b; +} +.alert-info { + border-color: #00acd6; +} +/* + * Component: Nav + * -------------- + */ +.nav > li > a:hover, +.nav > li > a:active, +.nav > li > a:focus { + color: #444; + background: #f7f7f7; +} +/* NAV PILLS */ +.nav-pills > li > a { + border-radius: 0; + border-top: 3px solid transparent; + color: #444; +} +.nav-pills > li > a > .fa, +.nav-pills > li > a > .glyphicon, +.nav-pills > li > a > .ion { + margin-right: 5px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + border-top-color: #3c8dbc; +} +.nav-pills > li.active > a { + font-weight: 600; +} +/* NAV STACKED */ +.nav-stacked > li > a { + border-radius: 0; + border-top: 0; + border-left: 3px solid transparent; + color: #444; +} +.nav-stacked > li.active > a, +.nav-stacked > li.active > a:hover { + background: transparent; + color: #444; + border-top: 0; + border-left-color: #3c8dbc; +} +.nav-stacked > li.header { + border-bottom: 1px solid #ddd; + color: #777; + margin-bottom: 10px; + padding: 5px 10px; + text-transform: uppercase; +} +/* NAV TABS */ +.nav-tabs-custom { + margin-bottom: 20px; + background: #fff; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + border-radius: 3px; +} +.nav-tabs-custom > .nav-tabs { + margin: 0; + border-bottom-color: #f4f4f4; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.nav-tabs-custom > .nav-tabs > li { + border-top: 3px solid transparent; + margin-bottom: -2px; + margin-right: 5px; +} +.nav-tabs-custom > .nav-tabs > li > a { + color: #444; + border-radius: 0; +} +.nav-tabs-custom > .nav-tabs > li > a.text-muted { + color: #999; +} +.nav-tabs-custom > .nav-tabs > li > a, +.nav-tabs-custom > .nav-tabs > li > a:hover { + background: transparent; + margin: 0; +} +.nav-tabs-custom > .nav-tabs > li > a:hover { + color: #999; +} +.nav-tabs-custom > .nav-tabs > li:not(.active) > a:hover, +.nav-tabs-custom > .nav-tabs > li:not(.active) > a:focus, +.nav-tabs-custom > .nav-tabs > li:not(.active) > a:active { + border-color: transparent; +} +.nav-tabs-custom > .nav-tabs > li.active { + border-top-color: #3c8dbc; +} +.nav-tabs-custom > .nav-tabs > li.active > a, +.nav-tabs-custom > .nav-tabs > li.active:hover > a { + background-color: #fff; + color: #444; +} +.nav-tabs-custom > .nav-tabs > li.active > a { + border-top-color: transparent; + border-left-color: #f4f4f4; + border-right-color: #f4f4f4; +} +.nav-tabs-custom > .nav-tabs > li:first-of-type { + margin-left: 0; +} +.nav-tabs-custom > .nav-tabs > li:first-of-type.active > a { + border-left-color: transparent; +} +.nav-tabs-custom > .nav-tabs.pull-right { + float: none!important; +} +.nav-tabs-custom > .nav-tabs.pull-right > li { + float: right; +} +.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type { + margin-right: 0; +} +.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type > a { + border-left-width: 1px; +} +.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type.active > a { + border-left-color: #f4f4f4; + border-right-color: transparent; +} +.nav-tabs-custom > .nav-tabs > li.header { + line-height: 35px; + padding: 0 10px; + font-size: 20px; + color: #444; +} +.nav-tabs-custom > .nav-tabs > li.header > .fa, +.nav-tabs-custom > .nav-tabs > li.header > .glyphicon, +.nav-tabs-custom > .nav-tabs > li.header > .ion { + margin-right: 5px; +} +.nav-tabs-custom > .tab-content { + background: #fff; + padding: 10px; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.nav-tabs-custom .dropdown.open > a:active, +.nav-tabs-custom .dropdown.open > a:focus { + background: transparent; + color: #999; +} +/* PAGINATION */ +.pagination > li > a { + background: #fafafa; + color: #666; +} +.pagination.pagination-flat > li > a { + border-radius: 0 !important; +} +/* + * Component: Products List + * ------------------------ + */ +.products-list { + list-style: none; + margin: 0; + padding: 0; +} +.products-list > .item { + border-radius: 3px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + padding: 10px 0; + background: #fff; +} +.products-list > .item:before, +.products-list > .item:after { + content: " "; + display: table; +} +.products-list > .item:after { + clear: both; +} +.products-list .product-img { + float: left; +} +.products-list .product-img img { + width: 50px; + height: 50px; +} +.products-list .product-info { + margin-left: 60px; +} +.products-list .product-title { + font-weight: 600; +} +.products-list .product-description { + display: block; + color: #999; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.product-list-in-box > .item { + -webkit-box-shadow: none; + box-shadow: none; + border-radius: 0; + border-bottom: 1px solid #f4f4f4; +} +.product-list-in-box > .item:last-of-type { + border-bottom-width: 0; +} +/* + * Component: Table + * ---------------- + */ +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + border-top: 1px solid #f4f4f4; +} +.table > thead > tr > th { + border-bottom: 2px solid #f4f4f4; +} +.table tr td .progress { + margin-top: 5px; +} +.table-bordered { + border: 1px solid #f4f4f4; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #f4f4f4; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table.no-border, +.table.no-border td, +.table.no-border th { + border: 0; +} +/* .text-center in tables */ +table.text-center, +table.text-center td, +table.text-center th { + text-align: center; +} +.table.align th { + text-align: left; +} +.table.align td { + text-align: right; +} +/* + * Component: Label + * ---------------- + */ +.label-default { + background-color: #d2d6de; + color: #444; +} +/* + * Component: Direct Chat + * ---------------------- + */ +.direct-chat .box-body { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + position: relative; + overflow-x: hidden; + padding: 0; +} +.direct-chat.chat-pane-open .direct-chat-contacts { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.direct-chat-messages { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); + padding: 10px; + height: 250px; + overflow: auto; +} +.direct-chat-msg, +.direct-chat-text { + display: block; +} +.direct-chat-msg { + margin-bottom: 10px; +} +.direct-chat-msg:before, +.direct-chat-msg:after { + content: " "; + display: table; +} +.direct-chat-msg:after { + clear: both; +} +.direct-chat-messages, +.direct-chat-contacts { + -webkit-transition: -webkit-transform 0.5s ease-in-out; + -moz-transition: -moz-transform 0.5s ease-in-out; + -o-transition: -o-transform 0.5s ease-in-out; + transition: transform 0.5s ease-in-out; +} +.direct-chat-text { + border-radius: 5px; + position: relative; + padding: 5px 10px; + background: #d2d6de; + border: 1px solid #d2d6de; + margin: 5px 0 0 50px; + color: #444444; +} +.direct-chat-text:after, +.direct-chat-text:before { + position: absolute; + right: 100%; + top: 15px; + border: solid transparent; + border-right-color: #d2d6de; + content: ' '; + height: 0; + width: 0; + pointer-events: none; +} +.direct-chat-text:after { + border-width: 5px; + margin-top: -5px; +} +.direct-chat-text:before { + border-width: 6px; + margin-top: -6px; +} +.right .direct-chat-text { + margin-right: 50px; + margin-left: 0; +} +.right .direct-chat-text:after, +.right .direct-chat-text:before { + right: auto; + left: 100%; + border-right-color: transparent; + border-left-color: #d2d6de; +} +.direct-chat-img { + border-radius: 50%; + float: left; + width: 40px; + height: 40px; +} +.right .direct-chat-img { + float: right; +} +.direct-chat-info { + display: block; + margin-bottom: 2px; + font-size: 12px; +} +.direct-chat-name { + font-weight: 600; +} +.direct-chat-timestamp { + color: #999; +} +.direct-chat-contacts-open .direct-chat-contacts { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.direct-chat-contacts { + -webkit-transform: translate(101%, 0); + -ms-transform: translate(101%, 0); + -o-transform: translate(101%, 0); + transform: translate(101%, 0); + position: absolute; + top: 0; + bottom: 0; + height: 250px; + width: 100%; + background: #222d32; + color: #fff; + overflow: auto; +} +.contacts-list > li { + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + padding: 10px; + margin: 0; +} +.contacts-list > li:before, +.contacts-list > li:after { + content: " "; + display: table; +} +.contacts-list > li:after { + clear: both; +} +.contacts-list > li:last-of-type { + border-bottom: none; +} +.contacts-list-img { + border-radius: 50%; + width: 40px; + float: left; +} +.contacts-list-info { + margin-left: 45px; + color: #fff; +} +.contacts-list-name, +.contacts-list-status { + display: block; +} +.contacts-list-name { + font-weight: 600; +} +.contacts-list-status { + font-size: 12px; +} +.contacts-list-date { + color: #aaa; + font-weight: normal; +} +.contacts-list-msg { + color: #999; +} +.direct-chat-danger .right > .direct-chat-text { + background: #dd4b39; + border-color: #dd4b39; + color: #ffffff; +} +.direct-chat-danger .right > .direct-chat-text:after, +.direct-chat-danger .right > .direct-chat-text:before { + border-left-color: #dd4b39; +} +.direct-chat-primary .right > .direct-chat-text { + background: #3c8dbc; + border-color: #3c8dbc; + color: #ffffff; +} +.direct-chat-primary .right > .direct-chat-text:after, +.direct-chat-primary .right > .direct-chat-text:before { + border-left-color: #3c8dbc; +} +.direct-chat-warning .right > .direct-chat-text { + background: #f39c12; + border-color: #f39c12; + color: #ffffff; +} +.direct-chat-warning .right > .direct-chat-text:after, +.direct-chat-warning .right > .direct-chat-text:before { + border-left-color: #f39c12; +} +.direct-chat-info .right > .direct-chat-text { + background: #00c0ef; + border-color: #00c0ef; + color: #ffffff; +} +.direct-chat-info .right > .direct-chat-text:after, +.direct-chat-info .right > .direct-chat-text:before { + border-left-color: #00c0ef; +} +.direct-chat-success .right > .direct-chat-text { + background: #00a65a; + border-color: #00a65a; + color: #ffffff; +} +.direct-chat-success .right > .direct-chat-text:after, +.direct-chat-success .right > .direct-chat-text:before { + border-left-color: #00a65a; +} +/* + * Component: Users List + * --------------------- + */ +.users-list > li { + width: 25%; + float: left; + padding: 10px; + text-align: center; +} +.users-list > li img { + border-radius: 50%; + max-width: 100%; + height: auto; +} +.users-list > li > a:hover, +.users-list > li > a:hover .users-list-name { + color: #999; +} +.users-list-name, +.users-list-date { + display: block; +} +.users-list-name { + font-weight: 600; + color: #444; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.users-list-date { + color: #999; + font-size: 12px; +} +/* + * Component: Carousel + * ------------------- + */ +.carousel-control.left, +.carousel-control.right { + background-image: none; +} +.carousel-control > .fa { + font-size: 40px; + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -20px; +} +/* + * Component: modal + * ---------------- + */ +.modal { + background: rgba(0, 0, 0, 0.3); +} +.modal-content { + border-radius: 0; + -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); + border: 0; +} +@media (min-width: 768px) { + .modal-content { + -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); + } +} +.modal-header { + border-bottom-color: #f4f4f4; +} +.modal-footer { + border-top-color: #f4f4f4; +} +.modal-primary .modal-header, +.modal-primary .modal-footer { + border-color: #307095; +} +.modal-warning .modal-header, +.modal-warning .modal-footer { + border-color: #c87f0a; +} +.modal-info .modal-header, +.modal-info .modal-footer { + border-color: #0097bc; +} +.modal-success .modal-header, +.modal-success .modal-footer { + border-color: #00733e; +} +.modal-danger .modal-header, +.modal-danger .modal-footer { + border-color: #c23321; +} +/* + * Component: Social Widgets + * ------------------------- + */ +.box-widget { + border: none; + position: relative; +} +.widget-user .widget-user-header { + padding: 20px; + height: 120px; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.widget-user .widget-user-username { + margin-top: 0; + margin-bottom: 5px; + font-size: 25px; + font-weight: 300; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); +} +.widget-user .widget-user-desc { + margin-top: 0; +} +.widget-user .widget-user-image { + position: absolute; + top: 65px; + left: 50%; + margin-left: -45px; +} +.widget-user .widget-user-image > img { + width: 90px; + height: auto; + border: 3px solid #fff; +} +.widget-user .box-footer { + padding-top: 30px; +} +.widget-user-2 .widget-user-header { + padding: 20px; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.widget-user-2 .widget-user-username { + margin-top: 5px; + margin-bottom: 5px; + font-size: 25px; + font-weight: 300; +} +.widget-user-2 .widget-user-desc { + margin-top: 0; +} +.widget-user-2 .widget-user-username, +.widget-user-2 .widget-user-desc { + margin-left: 75px; +} +.widget-user-2 .widget-user-image > img { + width: 65px; + height: auto; + float: left; +} +/* + * Page: Mailbox + * ------------- + */ +.mailbox-messages > .table { + margin: 0; +} +.mailbox-controls { + padding: 5px; +} +.mailbox-controls.with-border { + border-bottom: 1px solid #f4f4f4; +} +.mailbox-read-info { + border-bottom: 1px solid #f4f4f4; + padding: 10px; +} +.mailbox-read-info h3 { + font-size: 20px; + margin: 0; +} +.mailbox-read-info h5 { + margin: 0; + padding: 5px 0 0 0; +} +.mailbox-read-time { + color: #999; + font-size: 13px; +} +.mailbox-read-message { + padding: 10px; +} +.mailbox-attachments li { + float: left; + width: 200px; + border: 1px solid #eee; + margin-bottom: 10px; + margin-right: 10px; +} +.mailbox-attachment-name { + font-weight: bold; + color: #666; +} +.mailbox-attachment-icon, +.mailbox-attachment-info, +.mailbox-attachment-size { + display: block; +} +.mailbox-attachment-info { + padding: 10px; + background: #f4f4f4; +} +.mailbox-attachment-size { + color: #999; + font-size: 12px; +} +.mailbox-attachment-icon { + text-align: center; + font-size: 65px; + color: #666; + padding: 20px 10px; +} +.mailbox-attachment-icon.has-img { + padding: 0; +} +.mailbox-attachment-icon.has-img > img { + max-width: 100%; + height: auto; +} +/* + * Page: Lock Screen + * ----------------- + */ +/* ADD THIS CLASS TO THE <BODY> TAG */ +.lockscreen { + background: #d2d6de; +} +.lockscreen-logo { + font-size: 35px; + text-align: center; + margin-bottom: 25px; + font-weight: 300; +} +.lockscreen-logo a { + color: #444; +} +.lockscreen-wrapper { + max-width: 400px; + margin: 0 auto; + margin-top: 10%; +} +/* User name [optional] */ +.lockscreen .lockscreen-name { + text-align: center; + font-weight: 600; +} +/* Will contain the image and the sign in form */ +.lockscreen-item { + border-radius: 4px; + padding: 0; + background: #fff; + position: relative; + margin: 10px auto 30px auto; + width: 290px; +} +/* User image */ +.lockscreen-image { + border-radius: 50%; + position: absolute; + left: -10px; + top: -25px; + background: #fff; + padding: 5px; + z-index: 10; +} +.lockscreen-image > img { + border-radius: 50%; + width: 70px; + height: 70px; +} +/* Contains the password input and the login button */ +.lockscreen-credentials { + margin-left: 70px; +} +.lockscreen-credentials .form-control { + border: 0; +} +.lockscreen-credentials .btn { + background-color: #fff; + border: 0; + padding: 0 10px; +} +.lockscreen-footer { + margin-top: 10px; +} +/* + * Page: Login & Register + * ---------------------- + */ +.login-logo, +.register-logo { + font-size: 35px; + text-align: center; + margin-bottom: 25px; + font-weight: 300; +} +.login-logo a, +.register-logo a { + color: #444; +} +.login-page, +.register-page { + background: #d2d6de; +} +.login-box, +.register-box { + width: 360px; + margin: 7% auto; +} +@media (max-width: 768px) { + .login-box, + .register-box { + width: 90%; + margin-top: 20px; + } +} +.login-box-body, +.register-box-body { + background: #fff; + padding: 20px; + border-top: 0; + color: #666; +} +.login-box-body .form-control-feedback, +.register-box-body .form-control-feedback { + color: #777; +} +.login-box-msg, +.register-box-msg { + margin: 0; + text-align: center; + padding: 0 20px 20px 20px; +} +.social-auth-links { + margin: 10px 0; +} +/* + * Page: 400 and 500 error pages + * ------------------------------ + */ +.error-page { + width: 600px; + margin: 20px auto 0 auto; +} +@media (max-width: 991px) { + .error-page { + width: 100%; + } +} +.error-page > .headline { + float: left; + font-size: 100px; + font-weight: 300; +} +@media (max-width: 991px) { + .error-page > .headline { + float: none; + text-align: center; + } +} +.error-page > .error-content { + margin-left: 190px; + display: block; +} +@media (max-width: 991px) { + .error-page > .error-content { + margin-left: 0; + } +} +.error-page > .error-content > h3 { + font-weight: 300; + font-size: 25px; +} +@media (max-width: 991px) { + .error-page > .error-content > h3 { + text-align: center; + } +} +/* + * Page: Invoice + * ------------- + */ +.invoice { + position: relative; + background: #fff; + border: 1px solid #f4f4f4; + padding: 20px; + margin: 10px 25px; +} +.invoice-title { + margin-top: 0; +} +/* + * Page: Profile + * ------------- + */ +.profile-user-img { + margin: 0 auto; + width: 100px; + padding: 3px; + border: 3px solid #d2d6de; +} +.profile-username { + font-size: 21px; + margin-top: 5px; +} +.post { + border-bottom: 1px solid #d2d6de; + margin-bottom: 15px; + padding-bottom: 15px; + color: #666; +} +.post:last-of-type { + border-bottom: 0; + margin-bottom: 0; + padding-bottom: 0; +} +.post .user-block { + margin-bottom: 15px; +} +/* + * Social Buttons for Bootstrap + * + * Copyright 2013-2015 Panayiotis Lipiridis + * Licensed under the MIT License + * + * https://github.com/lipis/bootstrap-social + */ +.btn-social { + position: relative; + padding-left: 44px; + text-align: left; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.btn-social > :first-child { + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 32px; + line-height: 34px; + font-size: 1.6em; + text-align: center; + border-right: 1px solid rgba(0, 0, 0, 0.2); +} +.btn-social.btn-lg { + padding-left: 61px; +} +.btn-social.btn-lg > :first-child { + line-height: 45px; + width: 45px; + font-size: 1.8em; +} +.btn-social.btn-sm { + padding-left: 38px; +} +.btn-social.btn-sm > :first-child { + line-height: 28px; + width: 28px; + font-size: 1.4em; +} +.btn-social.btn-xs { + padding-left: 30px; +} +.btn-social.btn-xs > :first-child { + line-height: 20px; + width: 20px; + font-size: 1.2em; +} +.btn-social-icon { + position: relative; + padding-left: 44px; + text-align: left; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + height: 34px; + width: 34px; + padding: 0; +} +.btn-social-icon > :first-child { + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 32px; + line-height: 34px; + font-size: 1.6em; + text-align: center; + border-right: 1px solid rgba(0, 0, 0, 0.2); +} +.btn-social-icon.btn-lg { + padding-left: 61px; +} +.btn-social-icon.btn-lg > :first-child { + line-height: 45px; + width: 45px; + font-size: 1.8em; +} +.btn-social-icon.btn-sm { + padding-left: 38px; +} +.btn-social-icon.btn-sm > :first-child { + line-height: 28px; + width: 28px; + font-size: 1.4em; +} +.btn-social-icon.btn-xs { + padding-left: 30px; +} +.btn-social-icon.btn-xs > :first-child { + line-height: 20px; + width: 20px; + font-size: 1.2em; +} +.btn-social-icon > :first-child { + border: none; + text-align: center; + width: 100%; +} +.btn-social-icon.btn-lg { + height: 45px; + width: 45px; + padding-left: 0; + padding-right: 0; +} +.btn-social-icon.btn-sm { + height: 30px; + width: 30px; + padding-left: 0; + padding-right: 0; +} +.btn-social-icon.btn-xs { + height: 22px; + width: 22px; + padding-left: 0; + padding-right: 0; +} +.btn-adn { + color: #ffffff; + background-color: #d87a68; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-adn:hover, +.btn-adn:focus, +.btn-adn.focus, +.btn-adn:active, +.btn-adn.active, +.open > .dropdown-toggle.btn-adn { + color: #ffffff; + background-color: #ce563f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-adn:active, +.btn-adn.active, +.open > .dropdown-toggle.btn-adn { + background-image: none; +} +.btn-adn .badge { + color: #d87a68; + background-color: #ffffff; +} +.btn-bitbucket { + color: #ffffff; + background-color: #205081; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-bitbucket:hover, +.btn-bitbucket:focus, +.btn-bitbucket.focus, +.btn-bitbucket:active, +.btn-bitbucket.active, +.open > .dropdown-toggle.btn-bitbucket { + color: #ffffff; + background-color: #163758; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-bitbucket:active, +.btn-bitbucket.active, +.open > .dropdown-toggle.btn-bitbucket { + background-image: none; +} +.btn-bitbucket .badge { + color: #205081; + background-color: #ffffff; +} +.btn-dropbox { + color: #ffffff; + background-color: #1087dd; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-dropbox:hover, +.btn-dropbox:focus, +.btn-dropbox.focus, +.btn-dropbox:active, +.btn-dropbox.active, +.open > .dropdown-toggle.btn-dropbox { + color: #ffffff; + background-color: #0d6aad; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-dropbox:active, +.btn-dropbox.active, +.open > .dropdown-toggle.btn-dropbox { + background-image: none; +} +.btn-dropbox .badge { + color: #1087dd; + background-color: #ffffff; +} +.btn-facebook { + color: #ffffff; + background-color: #3b5998; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-facebook:hover, +.btn-facebook:focus, +.btn-facebook.focus, +.btn-facebook:active, +.btn-facebook.active, +.open > .dropdown-toggle.btn-facebook { + color: #ffffff; + background-color: #2d4373; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-facebook:active, +.btn-facebook.active, +.open > .dropdown-toggle.btn-facebook { + background-image: none; +} +.btn-facebook .badge { + color: #3b5998; + background-color: #ffffff; +} +.btn-flickr { + color: #ffffff; + background-color: #ff0084; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-flickr:hover, +.btn-flickr:focus, +.btn-flickr.focus, +.btn-flickr:active, +.btn-flickr.active, +.open > .dropdown-toggle.btn-flickr { + color: #ffffff; + background-color: #cc006a; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-flickr:active, +.btn-flickr.active, +.open > .dropdown-toggle.btn-flickr { + background-image: none; +} +.btn-flickr .badge { + color: #ff0084; + background-color: #ffffff; +} +.btn-foursquare { + color: #ffffff; + background-color: #f94877; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-foursquare:hover, +.btn-foursquare:focus, +.btn-foursquare.focus, +.btn-foursquare:active, +.btn-foursquare.active, +.open > .dropdown-toggle.btn-foursquare { + color: #ffffff; + background-color: #f71752; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-foursquare:active, +.btn-foursquare.active, +.open > .dropdown-toggle.btn-foursquare { + background-image: none; +} +.btn-foursquare .badge { + color: #f94877; + background-color: #ffffff; +} +.btn-github { + color: #ffffff; + background-color: #444444; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-github:hover, +.btn-github:focus, +.btn-github.focus, +.btn-github:active, +.btn-github.active, +.open > .dropdown-toggle.btn-github { + color: #ffffff; + background-color: #2b2b2b; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-github:active, +.btn-github.active, +.open > .dropdown-toggle.btn-github { + background-image: none; +} +.btn-github .badge { + color: #444444; + background-color: #ffffff; +} +.btn-google { + color: #ffffff; + background-color: #dd4b39; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-google:hover, +.btn-google:focus, +.btn-google.focus, +.btn-google:active, +.btn-google.active, +.open > .dropdown-toggle.btn-google { + color: #ffffff; + background-color: #c23321; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-google:active, +.btn-google.active, +.open > .dropdown-toggle.btn-google { + background-image: none; +} +.btn-google .badge { + color: #dd4b39; + background-color: #ffffff; +} +.btn-instagram { + color: #ffffff; + background-color: #3f729b; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-instagram:hover, +.btn-instagram:focus, +.btn-instagram.focus, +.btn-instagram:active, +.btn-instagram.active, +.open > .dropdown-toggle.btn-instagram { + color: #ffffff; + background-color: #305777; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-instagram:active, +.btn-instagram.active, +.open > .dropdown-toggle.btn-instagram { + background-image: none; +} +.btn-instagram .badge { + color: #3f729b; + background-color: #ffffff; +} +.btn-linkedin { + color: #ffffff; + background-color: #007bb6; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-linkedin:hover, +.btn-linkedin:focus, +.btn-linkedin.focus, +.btn-linkedin:active, +.btn-linkedin.active, +.open > .dropdown-toggle.btn-linkedin { + color: #ffffff; + background-color: #005983; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-linkedin:active, +.btn-linkedin.active, +.open > .dropdown-toggle.btn-linkedin { + background-image: none; +} +.btn-linkedin .badge { + color: #007bb6; + background-color: #ffffff; +} +.btn-microsoft { + color: #ffffff; + background-color: #2672ec; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-microsoft:hover, +.btn-microsoft:focus, +.btn-microsoft.focus, +.btn-microsoft:active, +.btn-microsoft.active, +.open > .dropdown-toggle.btn-microsoft { + color: #ffffff; + background-color: #125acd; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-microsoft:active, +.btn-microsoft.active, +.open > .dropdown-toggle.btn-microsoft { + background-image: none; +} +.btn-microsoft .badge { + color: #2672ec; + background-color: #ffffff; +} +.btn-openid { + color: #ffffff; + background-color: #f7931e; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-openid:hover, +.btn-openid:focus, +.btn-openid.focus, +.btn-openid:active, +.btn-openid.active, +.open > .dropdown-toggle.btn-openid { + color: #ffffff; + background-color: #da7908; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-openid:active, +.btn-openid.active, +.open > .dropdown-toggle.btn-openid { + background-image: none; +} +.btn-openid .badge { + color: #f7931e; + background-color: #ffffff; +} +.btn-pinterest { + color: #ffffff; + background-color: #cb2027; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-pinterest:hover, +.btn-pinterest:focus, +.btn-pinterest.focus, +.btn-pinterest:active, +.btn-pinterest.active, +.open > .dropdown-toggle.btn-pinterest { + color: #ffffff; + background-color: #9f191f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-pinterest:active, +.btn-pinterest.active, +.open > .dropdown-toggle.btn-pinterest { + background-image: none; +} +.btn-pinterest .badge { + color: #cb2027; + background-color: #ffffff; +} +.btn-reddit { + color: #000000; + background-color: #eff7ff; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-reddit:hover, +.btn-reddit:focus, +.btn-reddit.focus, +.btn-reddit:active, +.btn-reddit.active, +.open > .dropdown-toggle.btn-reddit { + color: #000000; + background-color: #bcddff; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-reddit:active, +.btn-reddit.active, +.open > .dropdown-toggle.btn-reddit { + background-image: none; +} +.btn-reddit .badge { + color: #eff7ff; + background-color: #000000; +} +.btn-soundcloud { + color: #ffffff; + background-color: #ff5500; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-soundcloud:hover, +.btn-soundcloud:focus, +.btn-soundcloud.focus, +.btn-soundcloud:active, +.btn-soundcloud.active, +.open > .dropdown-toggle.btn-soundcloud { + color: #ffffff; + background-color: #cc4400; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-soundcloud:active, +.btn-soundcloud.active, +.open > .dropdown-toggle.btn-soundcloud { + background-image: none; +} +.btn-soundcloud .badge { + color: #ff5500; + background-color: #ffffff; +} +.btn-tumblr { + color: #ffffff; + background-color: #2c4762; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-tumblr:hover, +.btn-tumblr:focus, +.btn-tumblr.focus, +.btn-tumblr:active, +.btn-tumblr.active, +.open > .dropdown-toggle.btn-tumblr { + color: #ffffff; + background-color: #1c2d3f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-tumblr:active, +.btn-tumblr.active, +.open > .dropdown-toggle.btn-tumblr { + background-image: none; +} +.btn-tumblr .badge { + color: #2c4762; + background-color: #ffffff; +} +.btn-twitter { + color: #ffffff; + background-color: #55acee; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-twitter:hover, +.btn-twitter:focus, +.btn-twitter.focus, +.btn-twitter:active, +.btn-twitter.active, +.open > .dropdown-toggle.btn-twitter { + color: #ffffff; + background-color: #2795e9; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-twitter:active, +.btn-twitter.active, +.open > .dropdown-toggle.btn-twitter { + background-image: none; +} +.btn-twitter .badge { + color: #55acee; + background-color: #ffffff; +} +.btn-vimeo { + color: #ffffff; + background-color: #1ab7ea; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vimeo:hover, +.btn-vimeo:focus, +.btn-vimeo.focus, +.btn-vimeo:active, +.btn-vimeo.active, +.open > .dropdown-toggle.btn-vimeo { + color: #ffffff; + background-color: #1295bf; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vimeo:active, +.btn-vimeo.active, +.open > .dropdown-toggle.btn-vimeo { + background-image: none; +} +.btn-vimeo .badge { + color: #1ab7ea; + background-color: #ffffff; +} +.btn-vk { + color: #ffffff; + background-color: #587ea3; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vk:hover, +.btn-vk:focus, +.btn-vk.focus, +.btn-vk:active, +.btn-vk.active, +.open > .dropdown-toggle.btn-vk { + color: #ffffff; + background-color: #466482; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vk:active, +.btn-vk.active, +.open > .dropdown-toggle.btn-vk { + background-image: none; +} +.btn-vk .badge { + color: #587ea3; + background-color: #ffffff; +} +.btn-yahoo { + color: #ffffff; + background-color: #720e9e; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-yahoo:hover, +.btn-yahoo:focus, +.btn-yahoo.focus, +.btn-yahoo:active, +.btn-yahoo.active, +.open > .dropdown-toggle.btn-yahoo { + color: #ffffff; + background-color: #500a6f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-yahoo:active, +.btn-yahoo.active, +.open > .dropdown-toggle.btn-yahoo { + background-image: none; +} +.btn-yahoo .badge { + color: #720e9e; + background-color: #ffffff; +} +/* + * Plugin: Full Calendar + * --------------------- + */ +.fc-button { + background: #f4f4f4; + background-image: none; + color: #444; + border-color: #ddd; + border-bottom-color: #ddd; +} +.fc-button:hover, +.fc-button:active, +.fc-button.hover { + background-color: #e9e9e9; +} +.fc-header-title h2 { + font-size: 15px; + line-height: 1.6em; + color: #666; + margin-left: 10px; +} +.fc-header-right { + padding-right: 10px; +} +.fc-header-left { + padding-left: 10px; +} +.fc-widget-header { + background: #fafafa; +} +.fc-grid { + width: 100%; + border: 0; +} +.fc-widget-header:first-of-type, +.fc-widget-content:first-of-type { + border-left: 0; + border-right: 0; +} +.fc-widget-header:last-of-type, +.fc-widget-content:last-of-type { + border-right: 0; +} +.fc-toolbar { + padding: 10px; + margin: 0; +} +.fc-day-number { + font-size: 20px; + font-weight: 300; + padding-right: 10px; +} +.fc-color-picker { + list-style: none; + margin: 0; + padding: 0; +} +.fc-color-picker > li { + float: left; + font-size: 30px; + margin-right: 5px; + line-height: 30px; +} +.fc-color-picker > li .fa { + -webkit-transition: -webkit-transform linear 0.3s; + -moz-transition: -moz-transform linear 0.3s; + -o-transition: -o-transform linear 0.3s; + transition: transform linear 0.3s; +} +.fc-color-picker > li .fa:hover { + -webkit-transform: rotate(30deg); + -ms-transform: rotate(30deg); + -o-transform: rotate(30deg); + transform: rotate(30deg); +} +#add-new-event { + -webkit-transition: all linear 0.3s; + -o-transition: all linear 0.3s; + transition: all linear 0.3s; +} +.external-event { + padding: 5px 10px; + font-weight: bold; + margin-bottom: 4px; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + border-radius: 3px; + cursor: move; +} +.external-event:hover { + box-shadow: inset 0 0 90px rgba(0, 0, 0, 0.2); +} +/* + * Plugin: Select2 + * --------------- + */ +.select2-container--default.select2-container--focus, +.select2-selection.select2-container--focus, +.select2-container--default:focus, +.select2-selection:focus, +.select2-container--default:active, +.select2-selection:active { + outline: none; +} +.select2-container--default .select2-selection--single, +.select2-selection .select2-selection--single { + border: 1px solid #d2d6de; + border-radius: 0; + padding: 6px 12px; + height: 34px; +} +.select2-container--default.select2-container--open { + border-color: #3c8dbc; +} +.select2-dropdown { + border: 1px solid #d2d6de; + border-radius: 0; +} +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #3c8dbc; + color: white; +} +.select2-results__option { + padding: 6px 12px; + user-select: none; + -webkit-user-select: none; +} +.select2-container .select2-selection--single .select2-selection__rendered { + padding-left: 0; + padding-right: 0; + height: auto; + margin-top: -4px; +} +.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { + padding-right: 6px; + padding-left: 20px; +} +.select2-container--default .select2-selection--single .select2-selection__arrow { + height: 28px; + right: 3px; +} +.select2-container--default .select2-selection--single .select2-selection__arrow b { + margin-top: 0; +} +.select2-dropdown .select2-search__field, +.select2-search--inline .select2-search__field { + border: 1px solid #d2d6de; +} +.select2-dropdown .select2-search__field:focus, +.select2-search--inline .select2-search__field:focus { + outline: none; + border: 1px solid #3c8dbc; +} +.select2-container--default .select2-results__option[aria-disabled=true] { + color: #999; +} +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #ddd; +} +.select2-container--default .select2-results__option[aria-selected=true], +.select2-container--default .select2-results__option[aria-selected=true]:hover { + color: #444; +} +.select2-container--default .select2-selection--multiple { + border: 1px solid #d2d6de; + border-radius: 0; +} +.select2-container--default .select2-selection--multiple:focus { + border-color: #3c8dbc; +} +.select2-container--default.select2-container--focus .select2-selection--multiple { + border-color: #d2d6de; +} +.select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: #3c8dbc; + border-color: #367fa9; + padding: 1px 10px; + color: #fff; +} +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + margin-right: 5px; + color: rgba(255, 255, 255, 0.7); +} +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #fff; +} +.select2-container .select2-selection--single .select2-selection__rendered { + padding-right: 10px; +} +/* + * General: Miscellaneous + * ---------------------- + */ +.pad { + padding: 10px; +} +.margin { + margin: 10px; +} +.margin-bottom { + margin-bottom: 20px; +} +.margin-bottom-none { + margin-bottom: 0; +} +.margin-r-5 { + margin-right: 5px; +} +.inline { + display: inline; +} +.description-block { + display: block; + margin: 10px 0; + text-align: center; +} +.description-block.margin-bottom { + margin-bottom: 25px; +} +.description-block > .description-header { + margin: 0; + padding: 0; + font-weight: 600; + font-size: 16px; +} +.description-block > .description-text { + text-transform: uppercase; +} +.bg-red, +.bg-yellow, +.bg-aqua, +.bg-blue, +.bg-light-blue, +.bg-green, +.bg-navy, +.bg-teal, +.bg-olive, +.bg-lime, +.bg-orange, +.bg-fuchsia, +.bg-purple, +.bg-maroon, +.bg-black, +.bg-red-active, +.bg-yellow-active, +.bg-aqua-active, +.bg-blue-active, +.bg-light-blue-active, +.bg-green-active, +.bg-navy-active, +.bg-teal-active, +.bg-olive-active, +.bg-lime-active, +.bg-orange-active, +.bg-fuchsia-active, +.bg-purple-active, +.bg-maroon-active, +.bg-black-active, +.callout.callout-danger, +.callout.callout-warning, +.callout.callout-info, +.callout.callout-success, +.alert-success, +.alert-danger, +.alert-error, +.alert-warning, +.alert-info, +.label-danger, +.label-info, +.label-warning, +.label-primary, +.label-success, +.modal-primary .modal-body, +.modal-primary .modal-header, +.modal-primary .modal-footer, +.modal-warning .modal-body, +.modal-warning .modal-header, +.modal-warning .modal-footer, +.modal-info .modal-body, +.modal-info .modal-header, +.modal-info .modal-footer, +.modal-success .modal-body, +.modal-success .modal-header, +.modal-success .modal-footer, +.modal-danger .modal-body, +.modal-danger .modal-header, +.modal-danger .modal-footer { + color: #fff !important; +} +.bg-gray { + color: #000; + background-color: #d2d6de !important; +} +.bg-gray-light { + background-color: #f7f7f7; +} +.bg-black { + background-color: #111111 !important; +} +.bg-red, +.callout.callout-danger, +.alert-danger, +.alert-error, +.label-danger, +.modal-danger .modal-body { + background-color: #dd4b39 !important; +} +.bg-yellow, +.callout.callout-warning, +.alert-warning, +.label-warning, +.modal-warning .modal-body { + background-color: #f39c12 !important; +} +.bg-aqua, +.callout.callout-info, +.alert-info, +.label-info, +.modal-info .modal-body { + background-color: #00c0ef !important; +} +.bg-blue { + background-color: #0073b7 !important; +} +.bg-light-blue, +.label-primary, +.modal-primary .modal-body { + background-color: #3c8dbc !important; +} +.bg-green, +.callout.callout-success, +.alert-success, +.label-success, +.modal-success .modal-body { + background-color: #00a65a !important; +} +.bg-navy { + background-color: #001f3f !important; +} +.bg-teal { + background-color: #39cccc !important; +} +.bg-olive { + background-color: #3d9970 !important; +} +.bg-lime { + background-color: #01ff70 !important; +} +.bg-orange { + background-color: #ff851b !important; +} +.bg-fuchsia { + background-color: #f012be !important; +} +.bg-purple { + background-color: #605ca8 !important; +} +.bg-maroon { + background-color: #d81b60 !important; +} +.bg-gray-active { + color: #000; + background-color: #b5bbc8 !important; +} +.bg-black-active { + background-color: #000000 !important; +} +.bg-red-active, +.modal-danger .modal-header, +.modal-danger .modal-footer { + background-color: #d33724 !important; +} +.bg-yellow-active, +.modal-warning .modal-header, +.modal-warning .modal-footer { + background-color: #db8b0b !important; +} +.bg-aqua-active, +.modal-info .modal-header, +.modal-info .modal-footer { + background-color: #00a7d0 !important; +} +.bg-blue-active { + background-color: #005384 !important; +} +.bg-light-blue-active, +.modal-primary .modal-header, +.modal-primary .modal-footer { + background-color: #357ca5 !important; +} +.bg-green-active, +.modal-success .modal-header, +.modal-success .modal-footer { + background-color: #008d4c !important; +} +.bg-navy-active { + background-color: #001a35 !important; +} +.bg-teal-active { + background-color: #30bbbb !important; +} +.bg-olive-active { + background-color: #368763 !important; +} +.bg-lime-active { + background-color: #00e765 !important; +} +.bg-orange-active { + background-color: #ff7701 !important; +} +.bg-fuchsia-active { + background-color: #db0ead !important; +} +.bg-purple-active { + background-color: #555299 !important; +} +.bg-maroon-active { + background-color: #ca195a !important; +} +[class^="bg-"].disabled { + opacity: 0.65; + filter: alpha(opacity=65); +} +.text-red { + color: #dd4b39 !important; +} +.text-yellow { + color: #f39c12 !important; +} +.text-aqua { + color: #00c0ef !important; +} +.text-blue { + color: #0073b7 !important; +} +.text-black { + color: #111111 !important; +} +.text-light-blue { + color: #3c8dbc !important; +} +.text-green { + color: #00a65a !important; +} +.text-gray { + color: #d2d6de !important; +} +.text-navy { + color: #001f3f !important; +} +.text-teal { + color: #39cccc !important; +} +.text-olive { + color: #3d9970 !important; +} +.text-lime { + color: #01ff70 !important; +} +.text-orange { + color: #ff851b !important; +} +.text-fuchsia { + color: #f012be !important; +} +.text-purple { + color: #605ca8 !important; +} +.text-maroon { + color: #d81b60 !important; +} +.link-muted { + color: #7a869d; +} +.link-muted:hover, +.link-muted:focus { + color: #606c84; +} +.link-black { + color: #666; +} +.link-black:hover, +.link-black:focus { + color: #999; +} +.hide { + display: none !important; +} +.no-border { + border: 0 !important; +} +.no-padding { + padding: 0 !important; +} +.no-margin { + margin: 0 !important; +} +.no-shadow { + box-shadow: none!important; +} +.list-unstyled, +.chart-legend, +.contacts-list, +.users-list, +.mailbox-attachments { + list-style: none; + margin: 0; + padding: 0; +} +.list-group-unbordered > .list-group-item { + border-left: 0; + border-right: 0; + border-radius: 0; + padding-left: 0; + padding-right: 0; +} +.flat { + border-radius: 0 !important; +} +.text-bold, +.text-bold.table td, +.text-bold.table th { + font-weight: 700; +} +.text-sm { + font-size: 12px; +} +.jqstooltip { + padding: 5px!important; + width: auto!important; + height: auto!important; +} +.bg-teal-gradient { + background: #39cccc !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #39cccc), color-stop(1, #7adddd)) !important; + background: -ms-linear-gradient(bottom, #39cccc, #7adddd) !important; + background: -moz-linear-gradient(center bottom, #39cccc 0%, #7adddd 100%) !important; + background: -o-linear-gradient(#7adddd, #39cccc) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39cccc', GradientType=0) !important; + color: #fff; +} +.bg-light-blue-gradient { + background: #3c8dbc !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #3c8dbc), color-stop(1, #67a8ce)) !important; + background: -ms-linear-gradient(bottom, #3c8dbc, #67a8ce) !important; + background: -moz-linear-gradient(center bottom, #3c8dbc 0%, #67a8ce 100%) !important; + background: -o-linear-gradient(#67a8ce, #3c8dbc) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important; + color: #fff; +} +.bg-blue-gradient { + background: #0073b7 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #0073b7), color-stop(1, #0089db)) !important; + background: -ms-linear-gradient(bottom, #0073b7, #0089db) !important; + background: -moz-linear-gradient(center bottom, #0073b7 0%, #0089db 100%) !important; + background: -o-linear-gradient(#0089db, #0073b7) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important; + color: #fff; +} +.bg-aqua-gradient { + background: #00c0ef !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #00c0ef), color-stop(1, #14d1ff)) !important; + background: -ms-linear-gradient(bottom, #00c0ef, #14d1ff) !important; + background: -moz-linear-gradient(center bottom, #00c0ef 0%, #14d1ff 100%) !important; + background: -o-linear-gradient(#14d1ff, #00c0ef) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important; + color: #fff; +} +.bg-yellow-gradient { + background: #f39c12 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #f39c12), color-stop(1, #f7bc60)) !important; + background: -ms-linear-gradient(bottom, #f39c12, #f7bc60) !important; + background: -moz-linear-gradient(center bottom, #f39c12 0%, #f7bc60 100%) !important; + background: -o-linear-gradient(#f7bc60, #f39c12) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important; + color: #fff; +} +.bg-purple-gradient { + background: #605ca8 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #605ca8), color-stop(1, #9491c4)) !important; + background: -ms-linear-gradient(bottom, #605ca8, #9491c4) !important; + background: -moz-linear-gradient(center bottom, #605ca8 0%, #9491c4 100%) !important; + background: -o-linear-gradient(#9491c4, #605ca8) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important; + color: #fff; +} +.bg-green-gradient { + background: #00a65a !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #00a65a), color-stop(1, #00ca6d)) !important; + background: -ms-linear-gradient(bottom, #00a65a, #00ca6d) !important; + background: -moz-linear-gradient(center bottom, #00a65a 0%, #00ca6d 100%) !important; + background: -o-linear-gradient(#00ca6d, #00a65a) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important; + color: #fff; +} +.bg-red-gradient { + background: #dd4b39 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #dd4b39), color-stop(1, #e47365)) !important; + background: -ms-linear-gradient(bottom, #dd4b39, #e47365) !important; + background: -moz-linear-gradient(center bottom, #dd4b39 0%, #e47365 100%) !important; + background: -o-linear-gradient(#e47365, #dd4b39) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important; + color: #fff; +} +.bg-black-gradient { + background: #111111 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #111111), color-stop(1, #2b2b2b)) !important; + background: -ms-linear-gradient(bottom, #111111, #2b2b2b) !important; + background: -moz-linear-gradient(center bottom, #111111 0%, #2b2b2b 100%) !important; + background: -o-linear-gradient(#2b2b2b, #111111) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111111', GradientType=0) !important; + color: #fff; +} +.bg-maroon-gradient { + background: #d81b60 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #d81b60), color-stop(1, #e73f7c)) !important; + background: -ms-linear-gradient(bottom, #d81b60, #e73f7c) !important; + background: -moz-linear-gradient(center bottom, #d81b60 0%, #e73f7c 100%) !important; + background: -o-linear-gradient(#e73f7c, #d81b60) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#d81b60', GradientType=0) !important; + color: #fff; +} +.description-block .description-icon { + font-size: 16px; +} +.no-pad-top { + padding-top: 0; +} +.position-static { + position: static!important; +} +.list-header { + font-size: 15px; + padding: 10px 4px; + font-weight: bold; + color: #666; +} +.list-seperator { + height: 1px; + background: #f4f4f4; + margin: 15px 0 9px 0; +} +.list-link > a { + padding: 4px; + color: #777; +} +.list-link > a:hover { + color: #222; +} +.font-light { + font-weight: 300; +} +.user-block:before, +.user-block:after { + content: " "; + display: table; +} +.user-block:after { + clear: both; +} +.user-block img { + width: 40px; + height: 40px; + float: left; +} +.user-block .username, +.user-block .description, +.user-block .comment { + display: block; + margin-left: 50px; +} +.user-block .username { + font-size: 16px; + font-weight: 600; +} +.user-block .description { + color: #999; + font-size: 13px; +} +.user-block.user-block-sm .username, +.user-block.user-block-sm .description, +.user-block.user-block-sm .comment { + margin-left: 40px; +} +.user-block.user-block-sm .username { + font-size: 14px; +} +.img-sm, +.img-md, +.img-lg, +.box-comments .box-comment img, +.user-block.user-block-sm img { + float: left; +} +.img-sm, +.box-comments .box-comment img, +.user-block.user-block-sm img { + width: 30px!important; + height: 30px!important; +} +.img-sm + .img-push { + margin-left: 40px; +} +.img-md { + width: 60px; + height: 60px; +} +.img-md + .img-push { + margin-left: 70px; +} +.img-lg { + width: 100px; + height: 100px; +} +.img-lg + .img-push { + margin-left: 110px; +} +.img-bordered { + border: 3px solid #d2d6de; + padding: 3px; +} +.img-bordered-sm { + border: 2px solid #d2d6de; + padding: 2px; +} +.attachment-block { + border: 1px solid #f4f4f4; + padding: 5px; + margin-bottom: 10px; + background: #f7f7f7; +} +.attachment-block .attachment-img { + max-width: 100px; + max-height: 100px; + height: auto; + float: left; +} +.attachment-block .attachment-pushed { + margin-left: 110px; +} +.attachment-block .attachment-heading { + margin: 0; +} +.attachment-block .attachment-text { + color: #555; +} +.connectedSortable { + min-height: 100px; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.sort-highlight { + background: #f4f4f4; + border: 1px dashed #ddd; + margin-bottom: 10px; +} +.full-opacity-hover { + opacity: 0.65; + filter: alpha(opacity=65); +} +.full-opacity-hover:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.chart { + position: relative; + overflow: hidden; + width: 100%; +} +.chart svg, +.chart canvas { + width: 100%!important; +} +/* + * Misc: print + * ----------- + */ +@media print { + .no-print, + .main-sidebar, + .left-side, + .main-header, + .content-header { + display: none!important; + } + .content-wrapper, + .right-side, + .main-footer { + margin-left: 0!important; + min-height: 0!important; + -webkit-transform: translate(0, 0) !important; + -ms-transform: translate(0, 0) !important; + -o-transform: translate(0, 0) !important; + transform: translate(0, 0) !important; + } + .fixed .content-wrapper, + .fixed .right-side { + padding-top: 0!important; + } + .invoice { + width: 100%; + border: 0; + margin: 0; + padding: 0; + } + .invoice-col { + float: left; + width: 33.3333333%; + } + .table-responsive { + overflow: auto; + } + .table-responsive > .table tr th, + .table-responsive > .table tr td { + white-space: normal!important; + } +} diff --git a/dist/css/AdminLTE.min.css b/dist/css/AdminLTE.min.css new file mode 100644 index 0000000..b5ec266 --- /dev/null +++ b/dist/css/AdminLTE.min.css @@ -0,0 +1,7 @@ +@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic);/*! + * AdminLTE v2.3.0 + * Author: Almsaeed Studio + * Website: Almsaeed Studio <http://almsaeedstudio.com> + * License: Open source - MIT + * Please visit http://opensource.org/licenses/MIT for more information +!*/html,body{min-height:100%}.layout-boxed html,.layout-boxed body{height:100%}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:'Source Sans Pro','Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;overflow-x:hidden;overflow-y:auto}.wrapper{min-height:100%;position:static;overflow:hidden}.wrapper:before,.wrapper:after{content:" ";display:table}.wrapper:after{clear:both}.layout-boxed .wrapper{max-width:1250px;margin:0 auto;min-height:100%;box-shadow:0 0 8px rgba(0,0,0,0.5);position:relative}.layout-boxed{background:url('../img/boxed-bg.jpg') repeat fixed}.content-wrapper,.right-side,.main-footer{-webkit-transition:-webkit-transform .3s ease-in-out,margin .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,margin .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,margin .3s ease-in-out;transition:transform .3s ease-in-out,margin .3s ease-in-out;margin-left:230px;z-index:820}.layout-top-nav .content-wrapper,.layout-top-nav .right-side,.layout-top-nav .main-footer{margin-left:0}@media (max-width:767px){.content-wrapper,.right-side,.main-footer{margin-left:0}}@media (min-width:768px){.sidebar-collapse .content-wrapper,.sidebar-collapse .right-side,.sidebar-collapse .main-footer{margin-left:0}}@media (max-width:767px){.sidebar-open .content-wrapper,.sidebar-open .right-side,.sidebar-open .main-footer{-webkit-transform:translate(230px, 0);-ms-transform:translate(230px, 0);-o-transform:translate(230px, 0);transform:translate(230px, 0)}}.content-wrapper,.right-side{min-height:100%;background-color:#ecf0f5;z-index:800}.main-footer{background:#fff;padding:15px;color:#444;border-top:1px solid #d2d6de}.fixed .main-header,.fixed .main-sidebar,.fixed .left-side{position:fixed}.fixed .main-header{top:0;right:0;left:0}.fixed .content-wrapper,.fixed .right-side{padding-top:50px}@media (max-width:767px){.fixed .content-wrapper,.fixed .right-side{padding-top:100px}}.fixed.layout-boxed .wrapper{max-width:100%}body.hold-transition .content-wrapper,body.hold-transition .right-side,body.hold-transition .main-footer,body.hold-transition .main-sidebar,body.hold-transition .left-side,body.hold-transition .main-header>.navbar,body.hold-transition .main-header .logo{-webkit-transition:none;-o-transition:none;transition:none}.content{min-height:250px;padding:15px;margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:'Source Sans Pro',sans-serif}a{color:#3c8dbc}a:hover,a:active,a:focus{outline:none;text-decoration:none;color:#72afd2}.page-header{margin:10px 0 20px 0;font-size:22px}.page-header>small{color:#666;display:block;margin-top:5px}.main-header{position:relative;max-height:100px;z-index:1030}.main-header>.navbar{-webkit-transition:margin-left .3s ease-in-out;-o-transition:margin-left .3s ease-in-out;transition:margin-left .3s ease-in-out;margin-bottom:0;margin-left:230px;border:none;min-height:50px;border-radius:0}.layout-top-nav .main-header>.navbar{margin-left:0}.main-header #navbar-search-input.form-control{background:rgba(255,255,255,0.2);border-color:transparent}.main-header #navbar-search-input.form-control:focus,.main-header #navbar-search-input.form-control:active{border-color:rgba(0,0,0,0.1);background:rgba(255,255,255,0.9)}.main-header #navbar-search-input.form-control::-moz-placeholder{color:#ccc;opacity:1}.main-header #navbar-search-input.form-control:-ms-input-placeholder{color:#ccc}.main-header #navbar-search-input.form-control::-webkit-input-placeholder{color:#ccc}.main-header .navbar-custom-menu,.main-header .navbar-right{float:right}@media (max-width:991px){.main-header .navbar-custom-menu a,.main-header .navbar-right a{color:inherit;background:transparent}}@media (max-width:767px){.main-header .navbar-right{float:none}.navbar-collapse .main-header .navbar-right{margin:7.5px -15px}.main-header .navbar-right>li{color:inherit;border:0}}.main-header .sidebar-toggle{float:left;background-color:transparent;background-image:none;padding:15px 15px;font-family:fontAwesome}.main-header .sidebar-toggle:before{content:"\f0c9"}.main-header .sidebar-toggle:hover{color:#fff}.main-header .sidebar-toggle:focus,.main-header .sidebar-toggle:active{background:transparent}.main-header .sidebar-toggle .icon-bar{display:none}.main-header .navbar .nav>li.user>a>.fa,.main-header .navbar .nav>li.user>a>.glyphicon,.main-header .navbar .nav>li.user>a>.ion{margin-right:5px}.main-header .navbar .nav>li>a>.label{position:absolute;top:9px;right:7px;text-align:center;font-size:9px;padding:2px 3px;line-height:.9}.main-header .logo{-webkit-transition:width .3s ease-in-out;-o-transition:width .3s ease-in-out;transition:width .3s ease-in-out;display:block;float:left;height:50px;font-size:20px;line-height:50px;text-align:center;width:230px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;padding:0 15px;font-weight:300;overflow:hidden}.main-header .logo .logo-lg{display:block}.main-header .logo .logo-mini{display:none}.main-header .navbar-brand{color:#fff}.content-header{position:relative;padding:15px 15px 0 15px}.content-header>h1{margin:0;font-size:24px}.content-header>h1>small{font-size:15px;display:inline-block;padding-left:4px;font-weight:300}.content-header>.breadcrumb{float:right;background:transparent;margin-top:0;margin-bottom:0;font-size:12px;padding:7px 5px;position:absolute;top:15px;right:10px;border-radius:2px}.content-header>.breadcrumb>li>a{color:#444;text-decoration:none;display:inline-block}.content-header>.breadcrumb>li>a>.fa,.content-header>.breadcrumb>li>a>.glyphicon,.content-header>.breadcrumb>li>a>.ion{margin-right:5px}.content-header>.breadcrumb>li+li:before{content:'>\00a0'}@media (max-width:991px){.content-header>.breadcrumb{position:relative;margin-top:5px;top:0;right:0;float:none;background:#d2d6de;padding-left:10px}.content-header>.breadcrumb li:before{color:#97a0b3}}.navbar-toggle{color:#fff;border:0;margin:0;padding:15px 15px}@media (max-width:991px){.navbar-custom-menu .navbar-nav>li{float:left}.navbar-custom-menu .navbar-nav{margin:0;float:left}.navbar-custom-menu .navbar-nav>li>a{padding-top:15px;padding-bottom:15px;line-height:20px}}@media (max-width:767px){.main-header{position:relative}.main-header .logo,.main-header .navbar{width:100%;float:none}.main-header .navbar{margin:0}.main-header .navbar-custom-menu{float:right}}@media (max-width:991px){.navbar-collapse.pull-left{float:none!important}.navbar-collapse.pull-left+.navbar-custom-menu{display:block;position:absolute;top:0;right:40px}}.main-sidebar,.left-side{position:absolute;top:0;left:0;padding-top:50px;min-height:100%;width:230px;z-index:810;-webkit-transition:-webkit-transform .3s ease-in-out,width .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,width .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,width .3s ease-in-out;transition:transform .3s ease-in-out,width .3s ease-in-out}@media (max-width:767px){.main-sidebar,.left-side{padding-top:100px}}@media (max-width:767px){.main-sidebar,.left-side{-webkit-transform:translate(-230px, 0);-ms-transform:translate(-230px, 0);-o-transform:translate(-230px, 0);transform:translate(-230px, 0)}}@media (min-width:768px){.sidebar-collapse .main-sidebar,.sidebar-collapse .left-side{-webkit-transform:translate(-230px, 0);-ms-transform:translate(-230px, 0);-o-transform:translate(-230px, 0);transform:translate(-230px, 0)}}@media (max-width:767px){.sidebar-open .main-sidebar,.sidebar-open .left-side{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}}.sidebar{padding-bottom:10px}.sidebar-form input:focus{border-color:transparent}.user-panel{position:relative;width:100%;padding:10px;overflow:hidden}.user-panel:before,.user-panel:after{content:" ";display:table}.user-panel:after{clear:both}.user-panel>.image>img{width:100%;max-width:45px;height:auto}.user-panel>.info{padding:5px 5px 5px 15px;line-height:1;position:absolute;left:55px}.user-panel>.info>p{font-weight:600;margin-bottom:9px}.user-panel>.info>a{text-decoration:none;padding-right:5px;margin-top:3px;font-size:11px}.user-panel>.info>a>.fa,.user-panel>.info>a>.ion,.user-panel>.info>a>.glyphicon{margin-right:3px}.sidebar-menu{list-style:none;margin:0;padding:0}.sidebar-menu>li{position:relative;margin:0;padding:0}.sidebar-menu>li>a{padding:12px 5px 12px 15px;display:block}.sidebar-menu>li>a>.fa,.sidebar-menu>li>a>.glyphicon,.sidebar-menu>li>a>.ion{width:20px}.sidebar-menu>li .label,.sidebar-menu>li .badge{margin-top:3px;margin-right:5px}.sidebar-menu li.header{padding:10px 25px 10px 15px;font-size:12px}.sidebar-menu li>a>.fa-angle-left{width:auto;height:auto;padding:0;margin-right:10px;margin-top:3px}.sidebar-menu li.active>a>.fa-angle-left{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.sidebar-menu li.active>.treeview-menu{display:block}.sidebar-menu .treeview-menu{display:none;list-style:none;padding:0;margin:0;padding-left:5px}.sidebar-menu .treeview-menu .treeview-menu{padding-left:20px}.sidebar-menu .treeview-menu>li{margin:0}.sidebar-menu .treeview-menu>li>a{padding:5px 5px 5px 15px;display:block;font-size:14px}.sidebar-menu .treeview-menu>li>a>.fa,.sidebar-menu .treeview-menu>li>a>.glyphicon,.sidebar-menu .treeview-menu>li>a>.ion{width:20px}.sidebar-menu .treeview-menu>li>a>.fa-angle-left,.sidebar-menu .treeview-menu>li>a>.fa-angle-down{width:auto}@media (min-width:768px){.sidebar-mini.sidebar-collapse .content-wrapper,.sidebar-mini.sidebar-collapse .right-side,.sidebar-mini.sidebar-collapse .main-footer{margin-left:50px!important;z-index:840}.sidebar-mini.sidebar-collapse .main-sidebar{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0);width:50px!important;z-index:850}.sidebar-mini.sidebar-collapse .sidebar-menu>li{position:relative}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a{margin-right:0}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span{border-top-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:not(.treeview)>a>span{border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{padding-top:5px;padding-bottom:5px;border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>span:not(.pull-right),.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{display:block!important;position:absolute;width:180px;left:50px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>span{top:0;margin-left:-3px;padding:12px 5px 12px 20px;background-color:inherit}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{top:44px;margin-left:0}.sidebar-mini.sidebar-collapse .main-sidebar .user-panel>.info,.sidebar-mini.sidebar-collapse .sidebar-form,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span,.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>.pull-right,.sidebar-mini.sidebar-collapse .sidebar-menu li.header{display:none!important;-webkit-transform:translateZ(0)}.sidebar-mini.sidebar-collapse .main-header .logo{width:50px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-mini{display:block;margin-left:-15px;margin-right:-15px;font-size:18px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-lg{display:none}.sidebar-mini.sidebar-collapse .main-header .navbar{margin-left:50px}}.sidebar-menu,.main-sidebar .user-panel,.sidebar-menu>li.header{white-space:nowrap;overflow:hidden}.sidebar-menu:hover{overflow:visible}.sidebar-form,.sidebar-menu>li.header{overflow:hidden;text-overflow:clip}.sidebar-menu li>a{position:relative}.sidebar-menu li>a>.pull-right{position:absolute;top:50%;right:10px;margin-top:-7px}.control-sidebar-bg{position:fixed;z-index:1000;bottom:0}.control-sidebar-bg,.control-sidebar{top:0;right:-230px;width:230px;-webkit-transition:right .3s ease-in-out;-o-transition:right .3s ease-in-out;transition:right .3s ease-in-out}.control-sidebar{position:absolute;padding-top:50px;z-index:1010}@media (max-width:768px){.control-sidebar{padding-top:100px}}.control-sidebar>.tab-content{padding:10px 15px}.control-sidebar.control-sidebar-open,.control-sidebar.control-sidebar-open+.control-sidebar-bg{right:0}.control-sidebar-open .control-sidebar-bg,.control-sidebar-open .control-sidebar{right:0}@media (min-width:768px){.control-sidebar-open .content-wrapper,.control-sidebar-open .right-side,.control-sidebar-open .main-footer{margin-right:230px}}.nav-tabs.control-sidebar-tabs>li:first-of-type>a,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:hover,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:focus{border-left-width:0}.nav-tabs.control-sidebar-tabs>li>a{border-radius:0}.nav-tabs.control-sidebar-tabs>li>a,.nav-tabs.control-sidebar-tabs>li>a:hover{border-top:none;border-right:none;border-left:1px solid transparent;border-bottom:1px solid transparent}.nav-tabs.control-sidebar-tabs>li>a .icon{font-size:16px}.nav-tabs.control-sidebar-tabs>li.active>a,.nav-tabs.control-sidebar-tabs>li.active>a:hover,.nav-tabs.control-sidebar-tabs>li.active>a:focus,.nav-tabs.control-sidebar-tabs>li.active>a:active{border-top:none;border-right:none;border-bottom:none}@media (max-width:768px){.nav-tabs.control-sidebar-tabs{display:table}.nav-tabs.control-sidebar-tabs>li{display:table-cell}}.control-sidebar-heading{font-weight:400;font-size:16px;padding:10px 0;margin-bottom:10px}.control-sidebar-subheading{display:block;font-weight:400;font-size:14px}.control-sidebar-menu{list-style:none;padding:0;margin:0 -15px}.control-sidebar-menu>li>a{display:block;padding:10px 15px}.control-sidebar-menu>li>a:before,.control-sidebar-menu>li>a:after{content:" ";display:table}.control-sidebar-menu>li>a:after{clear:both}.control-sidebar-menu>li>a>.control-sidebar-subheading{margin-top:0}.control-sidebar-menu .menu-icon{float:left;width:35px;height:35px;border-radius:50%;text-align:center;line-height:35px}.control-sidebar-menu .menu-info{margin-left:45px;margin-top:3px}.control-sidebar-menu .menu-info>.control-sidebar-subheading{margin:0}.control-sidebar-menu .menu-info>p{margin:0;font-size:11px}.control-sidebar-menu .progress{margin:0}.control-sidebar-dark{color:#b8c7ce}.control-sidebar-dark,.control-sidebar-dark+.control-sidebar-bg{background:#222d32}.control-sidebar-dark .nav-tabs.control-sidebar-tabs{border-bottom:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a{background:#181f23;color:#b8c7ce}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#141a1d;border-bottom-color:#141a1d}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:active{background:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{color:#fff}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#222d32;color:#fff}.control-sidebar-dark .control-sidebar-heading,.control-sidebar-dark .control-sidebar-subheading{color:#fff}.control-sidebar-dark .control-sidebar-menu>li>a:hover{background:#1e282c}.control-sidebar-dark .control-sidebar-menu>li>a .menu-info>p{color:#b8c7ce}.control-sidebar-light{color:#5e5e5e}.control-sidebar-light,.control-sidebar-light+.control-sidebar-bg{background:#f9fafc;border-left:1px solid #d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs{border-bottom:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a{background:#e8ecf4;color:#444}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#d2d6de;border-bottom-color:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:active{background:#eff1f7}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#f9fafc;color:#111}.control-sidebar-light .control-sidebar-heading,.control-sidebar-light .control-sidebar-subheading{color:#111}.control-sidebar-light .control-sidebar-menu{margin-left:-14px}.control-sidebar-light .control-sidebar-menu>li>a:hover{background:#f4f4f5}.control-sidebar-light .control-sidebar-menu>li>a .menu-info>p{color:#5e5e5e}.dropdown-menu{box-shadow:none;border-color:#eee}.dropdown-menu>li>a{color:#777}.dropdown-menu>li>a>.glyphicon,.dropdown-menu>li>a>.fa,.dropdown-menu>li>a>.ion{margin-right:10px}.dropdown-menu>li>a:hover{background-color:#e1e3e9;color:#333}.dropdown-menu>.divider{background-color:#eee}.navbar-nav>.notifications-menu>.dropdown-menu,.navbar-nav>.messages-menu>.dropdown-menu,.navbar-nav>.tasks-menu>.dropdown-menu{width:280px;padding:0 0 0 0;margin:0;top:100%}.navbar-nav>.notifications-menu>.dropdown-menu>li,.navbar-nav>.messages-menu>.dropdown-menu>li,.navbar-nav>.tasks-menu>.dropdown-menu>li{position:relative}.navbar-nav>.notifications-menu>.dropdown-menu>li.header,.navbar-nav>.messages-menu>.dropdown-menu>li.header,.navbar-nav>.tasks-menu>.dropdown-menu>li.header{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0;background-color:#ffffff;padding:7px 10px;border-bottom:1px solid #f4f4f4;color:#444444;font-size:14px}.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px;font-size:12px;background-color:#fff;padding:7px 10px;border-bottom:1px solid #eeeeee;color:#444!important;text-align:center}@media (max-width:991px){.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{background:#fff!important;color:#444!important}}.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a:hover{text-decoration:none;font-weight:normal}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu,.navbar-nav>.messages-menu>.dropdown-menu>li .menu,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu{max-height:200px;margin:0;padding:0;list-style:none;overflow-x:hidden}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{display:block;white-space:nowrap;border-bottom:1px solid #f4f4f4}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a:hover{background:#f4f4f4;text-decoration:none}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a{color:#444444;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:10px}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.glyphicon,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.fa,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.ion{width:20px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a{margin:0;padding:10px 10px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>div>img{margin:auto 10px auto auto;width:40px;height:40px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4{padding:0;margin:0 0 0 45px;color:#444444;font-size:15px;position:relative}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4>small{color:#999999;font-size:10px;position:absolute;top:0;right:0}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>p{margin:0 0 0 45px;font-size:12px;color:#888888}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:before,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{content:" ";display:table}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{clear:both}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{padding:10px}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>h3{font-size:14px;padding:0;margin:0 0 10px 0;color:#666666}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>.progress{padding:0;margin:0}.navbar-nav>.user-menu>.dropdown-menu{border-top-right-radius:0;border-top-left-radius:0;padding:1px 0 0 0;border-top-width:0;width:280px}.navbar-nav>.user-menu>.dropdown-menu,.navbar-nav>.user-menu>.dropdown-menu>.user-body{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header{height:175px;padding:10px;text-align:center}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>img{z-index:5;height:90px;width:90px;border:3px solid;border-color:transparent;border-color:rgba(255,255,255,0.2)}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p{z-index:5;color:#fff;color:rgba(255,255,255,0.8);font-size:17px;margin-top:10px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p>small{display:block;font-size:12px}.navbar-nav>.user-menu>.dropdown-menu>.user-body{padding:15px;border-bottom:1px solid #f4f4f4;border-top:1px solid #dddddd}.navbar-nav>.user-menu>.dropdown-menu>.user-body:before,.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-body a{color:#444 !important}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-body a{background:#fff !important;color:#444 !important}}.navbar-nav>.user-menu>.dropdown-menu>.user-footer{background-color:#f9f9f9;padding:10px}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:before,.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default{color:#666666}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default:hover{background-color:#f9f9f9}}.navbar-nav>.user-menu .user-image{float:left;width:25px;height:25px;border-radius:50%;margin-right:10px;margin-top:-2px}@media (max-width:767px){.navbar-nav>.user-menu .user-image{float:none;margin-right:0;margin-top:-8px;line-height:10px}}.open:not(.dropup)>.animated-dropdown-menu{backface-visibility:visible !important;-webkit-animation:flipInX .7s both;-o-animation:flipInX .7s both;animation:flipInX .7s both}@keyframes flipInX{0%{transform:perspective(400px) rotate3d(1, 0, 0, 90deg);transition-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotate3d(1, 0, 0, -20deg);transition-timing-function:ease-in}60%{transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{transform:perspective(400px)}}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 90deg);-webkit-transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -20deg);-webkit-transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{-webkit-transform:perspective(400px)}}.navbar-custom-menu>.navbar-nav>li{position:relative}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:0;left:auto}@media (max-width:991px){.navbar-custom-menu>.navbar-nav{float:right}.navbar-custom-menu>.navbar-nav>li{position:static}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:5%;left:auto;border:1px solid #ddd;background:#fff}}.form-control{border-radius:0;box-shadow:none;border-color:#d2d6de}.form-control:focus{border-color:#3c8dbc;box-shadow:none}.form-control::-moz-placeholder,.form-control:-ms-input-placeholder,.form-control::-webkit-input-placeholder{color:#bbb;opacity:1}.form-control:not(select){-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-group.has-success label{color:#00a65a}.form-group.has-success .form-control{border-color:#00a65a;box-shadow:none}.form-group.has-warning label{color:#f39c12}.form-group.has-warning .form-control{border-color:#f39c12;box-shadow:none}.form-group.has-error label{color:#dd4b39}.form-group.has-error .form-control{border-color:#dd4b39;box-shadow:none}.input-group .input-group-addon{border-radius:0;border-color:#d2d6de;background-color:#fff}.btn-group-vertical .btn.btn-flat:first-of-type,.btn-group-vertical .btn.btn-flat:last-of-type{border-radius:0}.icheck>label{padding-left:0}.form-control-feedback.fa{line-height:34px}.input-lg+.form-control-feedback.fa,.input-group-lg+.form-control-feedback.fa,.form-group-lg .form-control+.form-control-feedback.fa{line-height:46px}.input-sm+.form-control-feedback.fa,.input-group-sm+.form-control-feedback.fa,.form-group-sm .form-control+.form-control-feedback.fa{line-height:30px}.progress,.progress>.progress-bar{-webkit-box-shadow:none;box-shadow:none}.progress,.progress>.progress-bar,.progress .progress-bar,.progress>.progress-bar .progress-bar{border-radius:1px}.progress.sm,.progress-sm{height:10px}.progress.sm,.progress-sm,.progress.sm .progress-bar,.progress-sm .progress-bar{border-radius:1px}.progress.xs,.progress-xs{height:7px}.progress.xs,.progress-xs,.progress.xs .progress-bar,.progress-xs .progress-bar{border-radius:1px}.progress.xxs,.progress-xxs{height:3px}.progress.xxs,.progress-xxs,.progress.xxs .progress-bar,.progress-xxs .progress-bar{border-radius:1px}.progress.vertical{position:relative;width:30px;height:200px;display:inline-block;margin-right:10px}.progress.vertical>.progress-bar{width:100%;position:absolute;bottom:0}.progress.vertical.sm,.progress.vertical.progress-sm{width:20px}.progress.vertical.xs,.progress.vertical.progress-xs{width:10px}.progress.vertical.xxs,.progress.vertical.progress-xxs{width:3px}.progress-group .progress-text{font-weight:600}.progress-group .progress-number{float:right}.table tr>td .progress{margin:0}.progress-bar-light-blue,.progress-bar-primary{background-color:#3c8dbc}.progress-striped .progress-bar-light-blue,.progress-striped .progress-bar-primary{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-green,.progress-bar-success{background-color:#00a65a}.progress-striped .progress-bar-green,.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-aqua,.progress-bar-info{background-color:#00c0ef}.progress-striped .progress-bar-aqua,.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-yellow,.progress-bar-warning{background-color:#f39c12}.progress-striped .progress-bar-yellow,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-red,.progress-bar-danger{background-color:#dd4b39}.progress-striped .progress-bar-red,.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.small-box{border-radius:2px;position:relative;display:block;margin-bottom:20px;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.small-box>.inner{padding:10px}.small-box>.small-box-footer{position:relative;text-align:center;padding:3px 0;color:#fff;color:rgba(255,255,255,0.8);display:block;z-index:10;background:rgba(0,0,0,0.1);text-decoration:none}.small-box>.small-box-footer:hover{color:#fff;background:rgba(0,0,0,0.15)}.small-box h3{font-size:38px;font-weight:bold;margin:0 0 10px 0;white-space:nowrap;padding:0}.small-box p{font-size:15px}.small-box p>small{display:block;color:#f9f9f9;font-size:13px;margin-top:5px}.small-box h3,.small-box p{z-index:5px}.small-box .icon{-webkit-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;position:absolute;top:-10px;right:10px;z-index:0;font-size:90px;color:rgba(0,0,0,0.15)}.small-box:hover{text-decoration:none;color:#f9f9f9}.small-box:hover .icon{font-size:95px}@media (max-width:767px){.small-box{text-align:center}.small-box .icon{display:none}.small-box p{font-size:12px}}.box{position:relative;border-radius:3px;background:#ffffff;border-top:3px solid #d2d6de;margin-bottom:20px;width:100%;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.box.box-primary{border-top-color:#3c8dbc}.box.box-info{border-top-color:#00c0ef}.box.box-danger{border-top-color:#dd4b39}.box.box-warning{border-top-color:#f39c12}.box.box-success{border-top-color:#00a65a}.box.box-default{border-top-color:#d2d6de}.box.collapsed-box .box-body,.box.collapsed-box .box-footer{display:none}.box .nav-stacked>li{border-bottom:1px solid #f4f4f4;margin:0}.box .nav-stacked>li:last-of-type{border-bottom:none}.box.height-control .box-body{max-height:300px;overflow:auto}.box .border-right{border-right:1px solid #f4f4f4}.box .border-left{border-left:1px solid #f4f4f4}.box.box-solid{border-top:0}.box.box-solid>.box-header .btn.btn-default{background:transparent}.box.box-solid>.box-header .btn:hover,.box.box-solid>.box-header a:hover{background:rgba(0,0,0,0.1)}.box.box-solid.box-default{border:1px solid #d2d6de}.box.box-solid.box-default>.box-header{color:#444;background:#d2d6de;background-color:#d2d6de}.box.box-solid.box-default>.box-header a,.box.box-solid.box-default>.box-header .btn{color:#444}.box.box-solid.box-primary{border:1px solid #3c8dbc}.box.box-solid.box-primary>.box-header{color:#fff;background:#3c8dbc;background-color:#3c8dbc}.box.box-solid.box-primary>.box-header a,.box.box-solid.box-primary>.box-header .btn{color:#fff}.box.box-solid.box-info{border:1px solid #00c0ef}.box.box-solid.box-info>.box-header{color:#fff;background:#00c0ef;background-color:#00c0ef}.box.box-solid.box-info>.box-header a,.box.box-solid.box-info>.box-header .btn{color:#fff}.box.box-solid.box-danger{border:1px solid #dd4b39}.box.box-solid.box-danger>.box-header{color:#fff;background:#dd4b39;background-color:#dd4b39}.box.box-solid.box-danger>.box-header a,.box.box-solid.box-danger>.box-header .btn{color:#fff}.box.box-solid.box-warning{border:1px solid #f39c12}.box.box-solid.box-warning>.box-header{color:#fff;background:#f39c12;background-color:#f39c12}.box.box-solid.box-warning>.box-header a,.box.box-solid.box-warning>.box-header .btn{color:#fff}.box.box-solid.box-success{border:1px solid #00a65a}.box.box-solid.box-success>.box-header{color:#fff;background:#00a65a;background-color:#00a65a}.box.box-solid.box-success>.box-header a,.box.box-solid.box-success>.box-header .btn{color:#fff}.box.box-solid>.box-header>.box-tools .btn{border:0;box-shadow:none}.box.box-solid[class*='bg']>.box-header{color:#fff}.box .box-group>.box{margin-bottom:5px}.box .knob-label{text-align:center;color:#333;font-weight:100;font-size:12px;margin-bottom:0.3em}.box>.overlay,.overlay-wrapper>.overlay,.box>.loading-img,.overlay-wrapper>.loading-img{position:absolute;top:0;left:0;width:100%;height:100%}.box .overlay,.overlay-wrapper .overlay{z-index:50;background:rgba(255,255,255,0.7);border-radius:3px}.box .overlay>.fa,.overlay-wrapper .overlay>.fa{position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-15px;color:#000;font-size:30px}.box .overlay.dark,.overlay-wrapper .overlay.dark{background:rgba(0,0,0,0.5)}.box-header:before,.box-body:before,.box-footer:before,.box-header:after,.box-body:after,.box-footer:after{content:" ";display:table}.box-header:after,.box-body:after,.box-footer:after{clear:both}.box-header{color:#444;display:block;padding:10px;position:relative}.box-header.with-border{border-bottom:1px solid #f4f4f4}.collapsed-box .box-header.with-border{border-bottom:none}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion,.box-header .box-title{display:inline-block;font-size:18px;margin:0;line-height:1}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion{margin-right:5px}.box-header>.box-tools{position:absolute;right:10px;top:5px}.box-header>.box-tools [data-toggle="tooltip"]{position:relative}.box-header>.box-tools.pull-right .dropdown-menu{right:0;left:auto}.btn-box-tool{padding:5px;font-size:12px;background:transparent;color:#97a0b3}.open .btn-box-tool,.btn-box-tool:hover{color:#606c84}.btn-box-tool.btn:active{box-shadow:none}.box-body{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;padding:10px}.no-header .box-body{border-top-right-radius:3px;border-top-left-radius:3px}.box-body>.table{margin-bottom:0}.box-body .fc{margin-top:5px}.box-body .full-width-chart{margin:-19px}.box-body.no-padding .full-width-chart{margin:-9px}.box-body .box-pane{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:3px}.box-body .box-pane-right{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:0}.box-footer{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border-top:1px solid #f4f4f4;padding:10px;background-color:#fff}.chart-legend{margin:10px 0}@media (max-width:991px){.chart-legend>li{float:left;margin-right:10px}}.box-comments{background:#f7f7f7}.box-comments .box-comment{padding:8px 0;border-bottom:1px solid #eee}.box-comments .box-comment:before,.box-comments .box-comment:after{content:" ";display:table}.box-comments .box-comment:after{clear:both}.box-comments .box-comment:last-of-type{border-bottom:0}.box-comments .box-comment:first-of-type{padding-top:0}.box-comments .box-comment img{float:left}.box-comments .comment-text{margin-left:40px;color:#555}.box-comments .username{color:#444;display:block;font-weight:600}.box-comments .text-muted{font-weight:400;font-size:12px}.todo-list{margin:0;padding:0;list-style:none;overflow:auto}.todo-list>li{border-radius:2px;padding:10px;background:#f4f4f4;margin-bottom:2px;border-left:2px solid #e6e7e8;color:#444}.todo-list>li:last-of-type{margin-bottom:0}.todo-list>li>input[type='checkbox']{margin:0 10px 0 5px}.todo-list>li .text{display:inline-block;margin-left:5px;font-weight:600}.todo-list>li .label{margin-left:10px;font-size:9px}.todo-list>li .tools{display:none;float:right;color:#dd4b39}.todo-list>li .tools>.fa,.todo-list>li .tools>.glyphicon,.todo-list>li .tools>.ion{margin-right:5px;cursor:pointer}.todo-list>li:hover .tools{display:inline-block}.todo-list>li.done{color:#999}.todo-list>li.done .text{text-decoration:line-through;font-weight:500}.todo-list>li.done .label{background:#d2d6de !important}.todo-list .danger{border-left-color:#dd4b39}.todo-list .warning{border-left-color:#f39c12}.todo-list .info{border-left-color:#00c0ef}.todo-list .success{border-left-color:#00a65a}.todo-list .primary{border-left-color:#3c8dbc}.todo-list .handle{display:inline-block;cursor:move;margin:0 5px}.chat{padding:5px 20px 5px 10px}.chat .item{margin-bottom:10px}.chat .item:before,.chat .item:after{content:" ";display:table}.chat .item:after{clear:both}.chat .item>img{width:40px;height:40px;border:2px solid transparent;border-radius:50%}.chat .item>.online{border:2px solid #00a65a}.chat .item>.offline{border:2px solid #dd4b39}.chat .item>.message{margin-left:55px;margin-top:-40px}.chat .item>.message>.name{display:block;font-weight:600}.chat .item>.attachment{border-radius:3px;background:#f4f4f4;margin-left:65px;margin-right:15px;padding:10px}.chat .item>.attachment>h4{margin:0 0 5px 0;font-weight:600;font-size:14px}.chat .item>.attachment>p,.chat .item>.attachment>.filename{font-weight:600;font-size:13px;font-style:italic;margin:0}.chat .item>.attachment:before,.chat .item>.attachment:after{content:" ";display:table}.chat .item>.attachment:after{clear:both}.box-input{max-width:200px}.modal .panel-body{color:#444}.info-box{display:block;min-height:90px;background:#fff;width:100%;box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:2px;margin-bottom:15px}.info-box small{font-size:14px}.info-box .progress{background:rgba(0,0,0,0.2);margin:5px -10px 5px -10px;height:2px}.info-box .progress,.info-box .progress .progress-bar{border-radius:0}.info-box .progress .progress-bar{background:#fff}.info-box-icon{border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px;display:block;float:left;height:90px;width:90px;text-align:center;font-size:45px;line-height:90px;background:rgba(0,0,0,0.2)}.info-box-icon>img{max-width:100%}.info-box-content{padding:5px 10px;margin-left:90px}.info-box-number{display:block;font-weight:bold;font-size:18px}.progress-description,.info-box-text{display:block;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.info-box-text{text-transform:uppercase}.info-box-more{display:block}.progress-description{margin:0}.timeline{position:relative;margin:0 0 30px 0;padding:0;list-style:none}.timeline:before{content:'';position:absolute;top:0;bottom:0;width:4px;background:#ddd;left:31px;margin:0;border-radius:2px}.timeline>li{position:relative;margin-right:10px;margin-bottom:15px}.timeline>li:before,.timeline>li:after{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li>.timeline-item{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;margin-top:0;background:#fff;color:#444;margin-left:60px;margin-right:15px;padding:0;position:relative}.timeline>li>.timeline-item>.time{color:#999;float:right;padding:10px;font-size:12px}.timeline>li>.timeline-item>.timeline-header{margin:0;color:#555;border-bottom:1px solid #f4f4f4;padding:10px;font-size:16px;line-height:1.1}.timeline>li>.timeline-item>.timeline-header>a{font-weight:600}.timeline>li>.timeline-item>.timeline-body,.timeline>li>.timeline-item>.timeline-footer{padding:10px}.timeline>li>.fa,.timeline>li>.glyphicon,.timeline>li>.ion{width:30px;height:30px;font-size:15px;line-height:30px;position:absolute;color:#666;background:#d2d6de;border-radius:50%;text-align:center;left:18px;top:0}.timeline>.time-label>span{font-weight:600;padding:5px;display:inline-block;background-color:#fff;border-radius:4px}.timeline-inverse>li>.timeline-item{background:#f0f0f0;border:1px solid #ddd;-webkit-box-shadow:none;box-shadow:none}.timeline-inverse>li>.timeline-item>.timeline-header{border-bottom-color:#ddd}.btn{border-radius:3px;-webkit-box-shadow:none;box-shadow:none;border:1px solid transparent}.btn.uppercase{text-transform:uppercase}.btn.btn-flat{border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border-width:1px}.btn:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:focus{outline:none}.btn.btn-file{position:relative;overflow:hidden}.btn.btn-file>input[type='file']{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;opacity:0;filter:alpha(opacity=0);outline:none;background:white;cursor:inherit;display:block}.btn-default{background-color:#f4f4f4;color:#444;border-color:#ddd}.btn-default:hover,.btn-default:active,.btn-default.hover{background-color:#e7e7e7}.btn-primary{background-color:#3c8dbc;border-color:#367fa9}.btn-primary:hover,.btn-primary:active,.btn-primary.hover{background-color:#367fa9}.btn-success{background-color:#00a65a;border-color:#008d4c}.btn-success:hover,.btn-success:active,.btn-success.hover{background-color:#008d4c}.btn-info{background-color:#00c0ef;border-color:#00acd6}.btn-info:hover,.btn-info:active,.btn-info.hover{background-color:#00acd6}.btn-danger{background-color:#dd4b39;border-color:#d73925}.btn-danger:hover,.btn-danger:active,.btn-danger.hover{background-color:#d73925}.btn-warning{background-color:#f39c12;border-color:#e08e0b}.btn-warning:hover,.btn-warning:active,.btn-warning.hover{background-color:#e08e0b}.btn-outline{border:1px solid #fff;background:transparent;color:#fff}.btn-outline:hover,.btn-outline:focus,.btn-outline:active{color:rgba(255,255,255,0.7);border-color:rgba(255,255,255,0.7)}.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn[class*='bg-']:hover{-webkit-box-shadow:inset 0 0 100px rgba(0,0,0,0.2);box-shadow:inset 0 0 100px rgba(0,0,0,0.2)}.btn-app{border-radius:3px;position:relative;padding:15px 5px;margin:0 0 10px 10px;min-width:80px;height:60px;text-align:center;color:#666;border:1px solid #ddd;background-color:#f4f4f4;font-size:12px}.btn-app>.fa,.btn-app>.glyphicon,.btn-app>.ion{font-size:20px;display:block}.btn-app:hover{background:#f4f4f4;color:#444;border-color:#aaa}.btn-app:active,.btn-app:focus{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-app>.badge{position:absolute;top:-3px;right:-10px;font-size:10px;font-weight:400}.callout{border-radius:3px;margin:0 0 20px 0;padding:15px 30px 15px 15px;border-left:5px solid #eee}.callout a{color:#fff;text-decoration:underline}.callout a:hover{color:#eee}.callout h4{margin-top:0;font-weight:600}.callout p:last-child{margin-bottom:0}.callout code,.callout .highlight{background-color:#fff}.callout.callout-danger{border-color:#c23321}.callout.callout-warning{border-color:#c87f0a}.callout.callout-info{border-color:#0097bc}.callout.callout-success{border-color:#00733e}.alert{border-radius:3px}.alert h4{font-weight:600}.alert .icon{margin-right:10px}.alert .close{color:#000;opacity:.2;filter:alpha(opacity=20)}.alert .close:hover{opacity:.5;filter:alpha(opacity=50)}.alert a{color:#fff;text-decoration:underline}.alert-success{border-color:#008d4c}.alert-danger,.alert-error{border-color:#d73925}.alert-warning{border-color:#e08e0b}.alert-info{border-color:#00acd6}.nav>li>a:hover,.nav>li>a:active,.nav>li>a:focus{color:#444;background:#f7f7f7}.nav-pills>li>a{border-radius:0;border-top:3px solid transparent;color:#444}.nav-pills>li>a>.fa,.nav-pills>li>a>.glyphicon,.nav-pills>li>a>.ion{margin-right:5px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{border-top-color:#3c8dbc}.nav-pills>li.active>a{font-weight:600}.nav-stacked>li>a{border-radius:0;border-top:0;border-left:3px solid transparent;color:#444}.nav-stacked>li.active>a,.nav-stacked>li.active>a:hover{background:transparent;color:#444;border-top:0;border-left-color:#3c8dbc}.nav-stacked>li.header{border-bottom:1px solid #ddd;color:#777;margin-bottom:10px;padding:5px 10px;text-transform:uppercase}.nav-tabs-custom{margin-bottom:20px;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px}.nav-tabs-custom>.nav-tabs{margin:0;border-bottom-color:#f4f4f4;border-top-right-radius:3px;border-top-left-radius:3px}.nav-tabs-custom>.nav-tabs>li{border-top:3px solid transparent;margin-bottom:-2px;margin-right:5px}.nav-tabs-custom>.nav-tabs>li>a{color:#444;border-radius:0}.nav-tabs-custom>.nav-tabs>li>a.text-muted{color:#999}.nav-tabs-custom>.nav-tabs>li>a,.nav-tabs-custom>.nav-tabs>li>a:hover{background:transparent;margin:0}.nav-tabs-custom>.nav-tabs>li>a:hover{color:#999}.nav-tabs-custom>.nav-tabs>li:not(.active)>a:hover,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:focus,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:active{border-color:transparent}.nav-tabs-custom>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom>.nav-tabs>li.active>a,.nav-tabs-custom>.nav-tabs>li.active:hover>a{background-color:#fff;color:#444}.nav-tabs-custom>.nav-tabs>li.active>a{border-top-color:transparent;border-left-color:#f4f4f4;border-right-color:#f4f4f4}.nav-tabs-custom>.nav-tabs>li:first-of-type{margin-left:0}.nav-tabs-custom>.nav-tabs>li:first-of-type.active>a{border-left-color:transparent}.nav-tabs-custom>.nav-tabs.pull-right{float:none!important}.nav-tabs-custom>.nav-tabs.pull-right>li{float:right}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type{margin-right:0}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type>a{border-left-width:1px}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type.active>a{border-left-color:#f4f4f4;border-right-color:transparent}.nav-tabs-custom>.nav-tabs>li.header{line-height:35px;padding:0 10px;font-size:20px;color:#444}.nav-tabs-custom>.nav-tabs>li.header>.fa,.nav-tabs-custom>.nav-tabs>li.header>.glyphicon,.nav-tabs-custom>.nav-tabs>li.header>.ion{margin-right:5px}.nav-tabs-custom>.tab-content{background:#fff;padding:10px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.nav-tabs-custom .dropdown.open>a:active,.nav-tabs-custom .dropdown.open>a:focus{background:transparent;color:#999}.pagination>li>a{background:#fafafa;color:#666}.pagination.pagination-flat>li>a{border-radius:0 !important}.products-list{list-style:none;margin:0;padding:0}.products-list>.item{border-radius:3px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);padding:10px 0;background:#fff}.products-list>.item:before,.products-list>.item:after{content:" ";display:table}.products-list>.item:after{clear:both}.products-list .product-img{float:left}.products-list .product-img img{width:50px;height:50px}.products-list .product-info{margin-left:60px}.products-list .product-title{font-weight:600}.products-list .product-description{display:block;color:#999;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.product-list-in-box>.item{-webkit-box-shadow:none;box-shadow:none;border-radius:0;border-bottom:1px solid #f4f4f4}.product-list-in-box>.item:last-of-type{border-bottom-width:0}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{border-top:1px solid #f4f4f4}.table>thead>tr>th{border-bottom:2px solid #f4f4f4}.table tr td .progress{margin-top:5px}.table-bordered{border:1px solid #f4f4f4}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #f4f4f4}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table.no-border,.table.no-border td,.table.no-border th{border:0}table.text-center,table.text-center td,table.text-center th{text-align:center}.table.align th{text-align:left}.table.align td{text-align:right}.label-default{background-color:#d2d6de;color:#444}.direct-chat .box-body{border-bottom-right-radius:0;border-bottom-left-radius:0;position:relative;overflow-x:hidden;padding:0}.direct-chat.chat-pane-open .direct-chat-contacts{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.direct-chat-messages{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0);padding:10px;height:250px;overflow:auto}.direct-chat-msg,.direct-chat-text{display:block}.direct-chat-msg{margin-bottom:10px}.direct-chat-msg:before,.direct-chat-msg:after{content:" ";display:table}.direct-chat-msg:after{clear:both}.direct-chat-messages,.direct-chat-contacts{-webkit-transition:-webkit-transform .5s ease-in-out;-moz-transition:-moz-transform .5s ease-in-out;-o-transition:-o-transform .5s ease-in-out;transition:transform .5s ease-in-out}.direct-chat-text{border-radius:5px;position:relative;padding:5px 10px;background:#d2d6de;border:1px solid #d2d6de;margin:5px 0 0 50px;color:#444}.direct-chat-text:after,.direct-chat-text:before{position:absolute;right:100%;top:15px;border:solid transparent;border-right-color:#d2d6de;content:' ';height:0;width:0;pointer-events:none}.direct-chat-text:after{border-width:5px;margin-top:-5px}.direct-chat-text:before{border-width:6px;margin-top:-6px}.right .direct-chat-text{margin-right:50px;margin-left:0}.right .direct-chat-text:after,.right .direct-chat-text:before{right:auto;left:100%;border-right-color:transparent;border-left-color:#d2d6de}.direct-chat-img{border-radius:50%;float:left;width:40px;height:40px}.right .direct-chat-img{float:right}.direct-chat-info{display:block;margin-bottom:2px;font-size:12px}.direct-chat-name{font-weight:600}.direct-chat-timestamp{color:#999}.direct-chat-contacts-open .direct-chat-contacts{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.direct-chat-contacts{-webkit-transform:translate(101%, 0);-ms-transform:translate(101%, 0);-o-transform:translate(101%, 0);transform:translate(101%, 0);position:absolute;top:0;bottom:0;height:250px;width:100%;background:#222d32;color:#fff;overflow:auto}.contacts-list>li{border-bottom:1px solid rgba(0,0,0,0.2);padding:10px;margin:0}.contacts-list>li:before,.contacts-list>li:after{content:" ";display:table}.contacts-list>li:after{clear:both}.contacts-list>li:last-of-type{border-bottom:none}.contacts-list-img{border-radius:50%;width:40px;float:left}.contacts-list-info{margin-left:45px;color:#fff}.contacts-list-name,.contacts-list-status{display:block}.contacts-list-name{font-weight:600}.contacts-list-status{font-size:12px}.contacts-list-date{color:#aaa;font-weight:normal}.contacts-list-msg{color:#999}.direct-chat-danger .right>.direct-chat-text{background:#dd4b39;border-color:#dd4b39;color:#fff}.direct-chat-danger .right>.direct-chat-text:after,.direct-chat-danger .right>.direct-chat-text:before{border-left-color:#dd4b39}.direct-chat-primary .right>.direct-chat-text{background:#3c8dbc;border-color:#3c8dbc;color:#fff}.direct-chat-primary .right>.direct-chat-text:after,.direct-chat-primary .right>.direct-chat-text:before{border-left-color:#3c8dbc}.direct-chat-warning .right>.direct-chat-text{background:#f39c12;border-color:#f39c12;color:#fff}.direct-chat-warning .right>.direct-chat-text:after,.direct-chat-warning .right>.direct-chat-text:before{border-left-color:#f39c12}.direct-chat-info .right>.direct-chat-text{background:#00c0ef;border-color:#00c0ef;color:#fff}.direct-chat-info .right>.direct-chat-text:after,.direct-chat-info .right>.direct-chat-text:before{border-left-color:#00c0ef}.direct-chat-success .right>.direct-chat-text{background:#00a65a;border-color:#00a65a;color:#fff}.direct-chat-success .right>.direct-chat-text:after,.direct-chat-success .right>.direct-chat-text:before{border-left-color:#00a65a}.users-list>li{width:25%;float:left;padding:10px;text-align:center}.users-list>li img{border-radius:50%;max-width:100%;height:auto}.users-list>li>a:hover,.users-list>li>a:hover .users-list-name{color:#999}.users-list-name,.users-list-date{display:block}.users-list-name{font-weight:600;color:#444;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.users-list-date{color:#999;font-size:12px}.carousel-control.left,.carousel-control.right{background-image:none}.carousel-control>.fa{font-size:40px;position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-20px}.modal{background:rgba(0,0,0,0.3)}.modal-content{border-radius:0;-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125);border:0}@media (min-width:768px){.modal-content{-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125)}}.modal-header{border-bottom-color:#f4f4f4}.modal-footer{border-top-color:#f4f4f4}.modal-primary .modal-header,.modal-primary .modal-footer{border-color:#307095}.modal-warning .modal-header,.modal-warning .modal-footer{border-color:#c87f0a}.modal-info .modal-header,.modal-info .modal-footer{border-color:#0097bc}.modal-success .modal-header,.modal-success .modal-footer{border-color:#00733e}.modal-danger .modal-header,.modal-danger .modal-footer{border-color:#c23321}.box-widget{border:none;position:relative}.widget-user .widget-user-header{padding:20px;height:120px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user .widget-user-username{margin-top:0;margin-bottom:5px;font-size:25px;font-weight:300;text-shadow:0 1px 1px rgba(0,0,0,0.2)}.widget-user .widget-user-desc{margin-top:0}.widget-user .widget-user-image{position:absolute;top:65px;left:50%;margin-left:-45px}.widget-user .widget-user-image>img{width:90px;height:auto;border:3px solid #fff}.widget-user .box-footer{padding-top:30px}.widget-user-2 .widget-user-header{padding:20px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user-2 .widget-user-username{margin-top:5px;margin-bottom:5px;font-size:25px;font-weight:300}.widget-user-2 .widget-user-desc{margin-top:0}.widget-user-2 .widget-user-username,.widget-user-2 .widget-user-desc{margin-left:75px}.widget-user-2 .widget-user-image>img{width:65px;height:auto;float:left}.mailbox-messages>.table{margin:0}.mailbox-controls{padding:5px}.mailbox-controls.with-border{border-bottom:1px solid #f4f4f4}.mailbox-read-info{border-bottom:1px solid #f4f4f4;padding:10px}.mailbox-read-info h3{font-size:20px;margin:0}.mailbox-read-info h5{margin:0;padding:5px 0 0 0}.mailbox-read-time{color:#999;font-size:13px}.mailbox-read-message{padding:10px}.mailbox-attachments li{float:left;width:200px;border:1px solid #eee;margin-bottom:10px;margin-right:10px}.mailbox-attachment-name{font-weight:bold;color:#666}.mailbox-attachment-icon,.mailbox-attachment-info,.mailbox-attachment-size{display:block}.mailbox-attachment-info{padding:10px;background:#f4f4f4}.mailbox-attachment-size{color:#999;font-size:12px}.mailbox-attachment-icon{text-align:center;font-size:65px;color:#666;padding:20px 10px}.mailbox-attachment-icon.has-img{padding:0}.mailbox-attachment-icon.has-img>img{max-width:100%;height:auto}.lockscreen{background:#d2d6de}.lockscreen-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.lockscreen-logo a{color:#444}.lockscreen-wrapper{max-width:400px;margin:0 auto;margin-top:10%}.lockscreen .lockscreen-name{text-align:center;font-weight:600}.lockscreen-item{border-radius:4px;padding:0;background:#fff;position:relative;margin:10px auto 30px auto;width:290px}.lockscreen-image{border-radius:50%;position:absolute;left:-10px;top:-25px;background:#fff;padding:5px;z-index:10}.lockscreen-image>img{border-radius:50%;width:70px;height:70px}.lockscreen-credentials{margin-left:70px}.lockscreen-credentials .form-control{border:0}.lockscreen-credentials .btn{background-color:#fff;border:0;padding:0 10px}.lockscreen-footer{margin-top:10px}.login-logo,.register-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.login-logo a,.register-logo a{color:#444}.login-page,.register-page{background:#d2d6de}.login-box,.register-box{width:360px;margin:7% auto}@media (max-width:768px){.login-box,.register-box{width:90%;margin-top:20px}}.login-box-body,.register-box-body{background:#fff;padding:20px;border-top:0;color:#666}.login-box-body .form-control-feedback,.register-box-body .form-control-feedback{color:#777}.login-box-msg,.register-box-msg{margin:0;text-align:center;padding:0 20px 20px 20px}.social-auth-links{margin:10px 0}.error-page{width:600px;margin:20px auto 0 auto}@media (max-width:991px){.error-page{width:100%}}.error-page>.headline{float:left;font-size:100px;font-weight:300}@media (max-width:991px){.error-page>.headline{float:none;text-align:center}}.error-page>.error-content{margin-left:190px;display:block}@media (max-width:991px){.error-page>.error-content{margin-left:0}}.error-page>.error-content>h3{font-weight:300;font-size:25px}@media (max-width:991px){.error-page>.error-content>h3{text-align:center}}.invoice{position:relative;background:#fff;border:1px solid #f4f4f4;padding:20px;margin:10px 25px}.invoice-title{margin-top:0}.profile-user-img{margin:0 auto;width:100px;padding:3px;border:3px solid #d2d6de}.profile-username{font-size:21px;margin-top:5px}.post{border-bottom:1px solid #d2d6de;margin-bottom:15px;padding-bottom:15px;color:#666}.post:last-of-type{border-bottom:0;margin-bottom:0;padding-bottom:0}.post .user-block{margin-bottom:15px}.btn-social{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.btn-social>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social.btn-lg{padding-left:61px}.btn-social.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social.btn-sm{padding-left:38px}.btn-social.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social.btn-xs{padding-left:30px}.btn-social.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:34px;width:34px;padding:0}.btn-social-icon>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social-icon.btn-lg{padding-left:61px}.btn-social-icon.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social-icon.btn-sm{padding-left:38px}.btn-social-icon.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social-icon.btn-xs{padding-left:30px}.btn-social-icon.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon>:first-child{border:none;text-align:center;width:100%}.btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0}.btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0}.btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0}.btn-adn{color:#fff;background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn:hover,.btn-adn:focus,.btn-adn.focus,.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{background-image:none}.btn-adn .badge{color:#d87a68;background-color:#fff}.btn-bitbucket{color:#fff;background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:hover,.btn-bitbucket:focus,.btn-bitbucket.focus,.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{background-image:none}.btn-bitbucket .badge{color:#205081;background-color:#fff}.btn-dropbox{color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox:hover,.btn-dropbox:focus,.btn-dropbox.focus,.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{background-image:none}.btn-dropbox .badge{color:#1087dd;background-color:#fff}.btn-facebook{color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook:hover,.btn-facebook:focus,.btn-facebook.focus,.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{background-image:none}.btn-facebook .badge{color:#3b5998;background-color:#fff}.btn-flickr{color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr:hover,.btn-flickr:focus,.btn-flickr.focus,.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{background-image:none}.btn-flickr .badge{color:#ff0084;background-color:#fff}.btn-foursquare{color:#fff;background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare:hover,.btn-foursquare:focus,.btn-foursquare.focus,.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{background-image:none}.btn-foursquare .badge{color:#f94877;background-color:#fff}.btn-github{color:#fff;background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github:hover,.btn-github:focus,.btn-github.focus,.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{background-image:none}.btn-github .badge{color:#444;background-color:#fff}.btn-google{color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google:hover,.btn-google:focus,.btn-google.focus,.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{background-image:none}.btn-google .badge{color:#dd4b39;background-color:#fff}.btn-instagram{color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram:hover,.btn-instagram:focus,.btn-instagram.focus,.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{background-image:none}.btn-instagram .badge{color:#3f729b;background-color:#fff}.btn-linkedin{color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin:hover,.btn-linkedin:focus,.btn-linkedin.focus,.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{background-image:none}.btn-linkedin .badge{color:#007bb6;background-color:#fff}.btn-microsoft{color:#fff;background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft:hover,.btn-microsoft:focus,.btn-microsoft.focus,.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{background-image:none}.btn-microsoft .badge{color:#2672ec;background-color:#fff}.btn-openid{color:#fff;background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid:hover,.btn-openid:focus,.btn-openid.focus,.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{background-image:none}.btn-openid .badge{color:#f7931e;background-color:#fff}.btn-pinterest{color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest:hover,.btn-pinterest:focus,.btn-pinterest.focus,.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{background-image:none}.btn-pinterest .badge{color:#cb2027;background-color:#fff}.btn-reddit{color:#000;background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit:hover,.btn-reddit:focus,.btn-reddit.focus,.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{background-image:none}.btn-reddit .badge{color:#eff7ff;background-color:#000}.btn-soundcloud{color:#fff;background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:hover,.btn-soundcloud:focus,.btn-soundcloud.focus,.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{background-image:none}.btn-soundcloud .badge{color:#f50;background-color:#fff}.btn-tumblr{color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr:hover,.btn-tumblr:focus,.btn-tumblr.focus,.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{background-image:none}.btn-tumblr .badge{color:#2c4762;background-color:#fff}.btn-twitter{color:#fff;background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter:hover,.btn-twitter:focus,.btn-twitter.focus,.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{background-image:none}.btn-twitter .badge{color:#55acee;background-color:#fff}.btn-vimeo{color:#fff;background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo:hover,.btn-vimeo:focus,.btn-vimeo.focus,.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{background-image:none}.btn-vimeo .badge{color:#1ab7ea;background-color:#fff}.btn-vk{color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk:hover,.btn-vk:focus,.btn-vk.focus,.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{background-image:none}.btn-vk .badge{color:#587ea3;background-color:#fff}.btn-yahoo{color:#fff;background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:hover,.btn-yahoo:focus,.btn-yahoo.focus,.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{background-image:none}.btn-yahoo .badge{color:#720e9e;background-color:#fff}.fc-button{background:#f4f4f4;background-image:none;color:#444;border-color:#ddd;border-bottom-color:#ddd}.fc-button:hover,.fc-button:active,.fc-button.hover{background-color:#e9e9e9}.fc-header-title h2{font-size:15px;line-height:1.6em;color:#666;margin-left:10px}.fc-header-right{padding-right:10px}.fc-header-left{padding-left:10px}.fc-widget-header{background:#fafafa}.fc-grid{width:100%;border:0}.fc-widget-header:first-of-type,.fc-widget-content:first-of-type{border-left:0;border-right:0}.fc-widget-header:last-of-type,.fc-widget-content:last-of-type{border-right:0}.fc-toolbar{padding:10px;margin:0}.fc-day-number{font-size:20px;font-weight:300;padding-right:10px}.fc-color-picker{list-style:none;margin:0;padding:0}.fc-color-picker>li{float:left;font-size:30px;margin-right:5px;line-height:30px}.fc-color-picker>li .fa{-webkit-transition:-webkit-transform linear .3s;-moz-transition:-moz-transform linear .3s;-o-transition:-o-transform linear .3s;transition:transform linear .3s}.fc-color-picker>li .fa:hover{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);-o-transform:rotate(30deg);transform:rotate(30deg)}#add-new-event{-webkit-transition:all linear .3s;-o-transition:all linear .3s;transition:all linear .3s}.external-event{padding:5px 10px;font-weight:bold;margin-bottom:4px;box-shadow:0 1px 1px rgba(0,0,0,0.1);text-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;cursor:move}.external-event:hover{box-shadow:inset 0 0 90px rgba(0,0,0,0.2)}.select2-container--default.select2-container--focus,.select2-selection.select2-container--focus,.select2-container--default:focus,.select2-selection:focus,.select2-container--default:active,.select2-selection:active{outline:none}.select2-container--default .select2-selection--single,.select2-selection .select2-selection--single{border:1px solid #d2d6de;border-radius:0;padding:6px 12px;height:34px}.select2-container--default.select2-container--open{border-color:#3c8dbc}.select2-dropdown{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#3c8dbc;color:white}.select2-results__option{padding:6px 12px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{padding-left:0;padding-right:0;height:auto;margin-top:-4px}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:6px;padding-left:20px}.select2-container--default .select2-selection--single .select2-selection__arrow{height:28px;right:3px}.select2-container--default .select2-selection--single .select2-selection__arrow b{margin-top:0}.select2-dropdown .select2-search__field,.select2-search--inline .select2-search__field{border:1px solid #d2d6de}.select2-dropdown .select2-search__field:focus,.select2-search--inline .select2-search__field:focus{outline:none;border:1px solid #3c8dbc}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[aria-selected=true]:hover{color:#444}.select2-container--default .select2-selection--multiple{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-selection--multiple:focus{border-color:#3c8dbc}.select2-container--default.select2-container--focus .select2-selection--multiple{border-color:#d2d6de}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#3c8dbc;border-color:#367fa9;padding:1px 10px;color:#fff}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{margin-right:5px;color:rgba(255,255,255,0.7)}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#fff}.select2-container .select2-selection--single .select2-selection__rendered{padding-right:10px}.pad{padding:10px}.margin{margin:10px}.margin-bottom{margin-bottom:20px}.margin-bottom-none{margin-bottom:0}.margin-r-5{margin-right:5px}.inline{display:inline}.description-block{display:block;margin:10px 0;text-align:center}.description-block.margin-bottom{margin-bottom:25px}.description-block>.description-header{margin:0;padding:0;font-weight:600;font-size:16px}.description-block>.description-text{text-transform:uppercase}.bg-red,.bg-yellow,.bg-aqua,.bg-blue,.bg-light-blue,.bg-green,.bg-navy,.bg-teal,.bg-olive,.bg-lime,.bg-orange,.bg-fuchsia,.bg-purple,.bg-maroon,.bg-black,.bg-red-active,.bg-yellow-active,.bg-aqua-active,.bg-blue-active,.bg-light-blue-active,.bg-green-active,.bg-navy-active,.bg-teal-active,.bg-olive-active,.bg-lime-active,.bg-orange-active,.bg-fuchsia-active,.bg-purple-active,.bg-maroon-active,.bg-black-active,.callout.callout-danger,.callout.callout-warning,.callout.callout-info,.callout.callout-success,.alert-success,.alert-danger,.alert-error,.alert-warning,.alert-info,.label-danger,.label-info,.label-warning,.label-primary,.label-success,.modal-primary .modal-body,.modal-primary .modal-header,.modal-primary .modal-footer,.modal-warning .modal-body,.modal-warning .modal-header,.modal-warning .modal-footer,.modal-info .modal-body,.modal-info .modal-header,.modal-info .modal-footer,.modal-success .modal-body,.modal-success .modal-header,.modal-success .modal-footer,.modal-danger .modal-body,.modal-danger .modal-header,.modal-danger .modal-footer{color:#fff !important}.bg-gray{color:#000;background-color:#d2d6de !important}.bg-gray-light{background-color:#f7f7f7}.bg-black{background-color:#111 !important}.bg-red,.callout.callout-danger,.alert-danger,.alert-error,.label-danger,.modal-danger .modal-body{background-color:#dd4b39 !important}.bg-yellow,.callout.callout-warning,.alert-warning,.label-warning,.modal-warning .modal-body{background-color:#f39c12 !important}.bg-aqua,.callout.callout-info,.alert-info,.label-info,.modal-info .modal-body{background-color:#00c0ef !important}.bg-blue{background-color:#0073b7 !important}.bg-light-blue,.label-primary,.modal-primary .modal-body{background-color:#3c8dbc !important}.bg-green,.callout.callout-success,.alert-success,.label-success,.modal-success .modal-body{background-color:#00a65a !important}.bg-navy{background-color:#001f3f !important}.bg-teal{background-color:#39cccc !important}.bg-olive{background-color:#3d9970 !important}.bg-lime{background-color:#01ff70 !important}.bg-orange{background-color:#ff851b !important}.bg-fuchsia{background-color:#f012be !important}.bg-purple{background-color:#605ca8 !important}.bg-maroon{background-color:#d81b60 !important}.bg-gray-active{color:#000;background-color:#b5bbc8 !important}.bg-black-active{background-color:#000 !important}.bg-red-active,.modal-danger .modal-header,.modal-danger .modal-footer{background-color:#d33724 !important}.bg-yellow-active,.modal-warning .modal-header,.modal-warning .modal-footer{background-color:#db8b0b !important}.bg-aqua-active,.modal-info .modal-header,.modal-info .modal-footer{background-color:#00a7d0 !important}.bg-blue-active{background-color:#005384 !important}.bg-light-blue-active,.modal-primary .modal-header,.modal-primary .modal-footer{background-color:#357ca5 !important}.bg-green-active,.modal-success .modal-header,.modal-success .modal-footer{background-color:#008d4c !important}.bg-navy-active{background-color:#001a35 !important}.bg-teal-active{background-color:#30bbbb !important}.bg-olive-active{background-color:#368763 !important}.bg-lime-active{background-color:#00e765 !important}.bg-orange-active{background-color:#ff7701 !important}.bg-fuchsia-active{background-color:#db0ead !important}.bg-purple-active{background-color:#555299 !important}.bg-maroon-active{background-color:#ca195a !important}[class^="bg-"].disabled{opacity:.65;filter:alpha(opacity=65)}.text-red{color:#dd4b39 !important}.text-yellow{color:#f39c12 !important}.text-aqua{color:#00c0ef !important}.text-blue{color:#0073b7 !important}.text-black{color:#111 !important}.text-light-blue{color:#3c8dbc !important}.text-green{color:#00a65a !important}.text-gray{color:#d2d6de !important}.text-navy{color:#001f3f !important}.text-teal{color:#39cccc !important}.text-olive{color:#3d9970 !important}.text-lime{color:#01ff70 !important}.text-orange{color:#ff851b !important}.text-fuchsia{color:#f012be !important}.text-purple{color:#605ca8 !important}.text-maroon{color:#d81b60 !important}.link-muted{color:#7a869d}.link-muted:hover,.link-muted:focus{color:#606c84}.link-black{color:#666}.link-black:hover,.link-black:focus{color:#999}.hide{display:none !important}.no-border{border:0 !important}.no-padding{padding:0 !important}.no-margin{margin:0 !important}.no-shadow{box-shadow:none!important}.list-unstyled,.chart-legend,.contacts-list,.users-list,.mailbox-attachments{list-style:none;margin:0;padding:0}.list-group-unbordered>.list-group-item{border-left:0;border-right:0;border-radius:0;padding-left:0;padding-right:0}.flat{border-radius:0 !important}.text-bold,.text-bold.table td,.text-bold.table th{font-weight:700}.text-sm{font-size:12px}.jqstooltip{padding:5px!important;width:auto!important;height:auto!important}.bg-teal-gradient{background:#39cccc !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #39cccc), color-stop(1, #7adddd)) !important;background:-ms-linear-gradient(bottom, #39cccc, #7adddd) !important;background:-moz-linear-gradient(center bottom, #39cccc 0, #7adddd 100%) !important;background:-o-linear-gradient(#7adddd, #39cccc) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39cccc', GradientType=0) !important;color:#fff}.bg-light-blue-gradient{background:#3c8dbc !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #3c8dbc), color-stop(1, #67a8ce)) !important;background:-ms-linear-gradient(bottom, #3c8dbc, #67a8ce) !important;background:-moz-linear-gradient(center bottom, #3c8dbc 0, #67a8ce 100%) !important;background:-o-linear-gradient(#67a8ce, #3c8dbc) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important;color:#fff}.bg-blue-gradient{background:#0073b7 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #0073b7), color-stop(1, #0089db)) !important;background:-ms-linear-gradient(bottom, #0073b7, #0089db) !important;background:-moz-linear-gradient(center bottom, #0073b7 0, #0089db 100%) !important;background:-o-linear-gradient(#0089db, #0073b7) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important;color:#fff}.bg-aqua-gradient{background:#00c0ef !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #00c0ef), color-stop(1, #14d1ff)) !important;background:-ms-linear-gradient(bottom, #00c0ef, #14d1ff) !important;background:-moz-linear-gradient(center bottom, #00c0ef 0, #14d1ff 100%) !important;background:-o-linear-gradient(#14d1ff, #00c0ef) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important;color:#fff}.bg-yellow-gradient{background:#f39c12 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #f39c12), color-stop(1, #f7bc60)) !important;background:-ms-linear-gradient(bottom, #f39c12, #f7bc60) !important;background:-moz-linear-gradient(center bottom, #f39c12 0, #f7bc60 100%) !important;background:-o-linear-gradient(#f7bc60, #f39c12) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important;color:#fff}.bg-purple-gradient{background:#605ca8 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #605ca8), color-stop(1, #9491c4)) !important;background:-ms-linear-gradient(bottom, #605ca8, #9491c4) !important;background:-moz-linear-gradient(center bottom, #605ca8 0, #9491c4 100%) !important;background:-o-linear-gradient(#9491c4, #605ca8) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important;color:#fff}.bg-green-gradient{background:#00a65a !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #00a65a), color-stop(1, #00ca6d)) !important;background:-ms-linear-gradient(bottom, #00a65a, #00ca6d) !important;background:-moz-linear-gradient(center bottom, #00a65a 0, #00ca6d 100%) !important;background:-o-linear-gradient(#00ca6d, #00a65a) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important;color:#fff}.bg-red-gradient{background:#dd4b39 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #dd4b39), color-stop(1, #e47365)) !important;background:-ms-linear-gradient(bottom, #dd4b39, #e47365) !important;background:-moz-linear-gradient(center bottom, #dd4b39 0, #e47365 100%) !important;background:-o-linear-gradient(#e47365, #dd4b39) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important;color:#fff}.bg-black-gradient{background:#111 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #111), color-stop(1, #2b2b2b)) !important;background:-ms-linear-gradient(bottom, #111, #2b2b2b) !important;background:-moz-linear-gradient(center bottom, #111 0, #2b2b2b 100%) !important;background:-o-linear-gradient(#2b2b2b, #111) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111111', GradientType=0) !important;color:#fff}.bg-maroon-gradient{background:#d81b60 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #d81b60), color-stop(1, #e73f7c)) !important;background:-ms-linear-gradient(bottom, #d81b60, #e73f7c) !important;background:-moz-linear-gradient(center bottom, #d81b60 0, #e73f7c 100%) !important;background:-o-linear-gradient(#e73f7c, #d81b60) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#d81b60', GradientType=0) !important;color:#fff}.description-block .description-icon{font-size:16px}.no-pad-top{padding-top:0}.position-static{position:static!important}.list-header{font-size:15px;padding:10px 4px;font-weight:bold;color:#666}.list-seperator{height:1px;background:#f4f4f4;margin:15px 0 9px 0}.list-link>a{padding:4px;color:#777}.list-link>a:hover{color:#222}.font-light{font-weight:300}.user-block:before,.user-block:after{content:" ";display:table}.user-block:after{clear:both}.user-block img{width:40px;height:40px;float:left}.user-block .username,.user-block .description,.user-block .comment{display:block;margin-left:50px}.user-block .username{font-size:16px;font-weight:600}.user-block .description{color:#999;font-size:13px}.user-block.user-block-sm .username,.user-block.user-block-sm .description,.user-block.user-block-sm .comment{margin-left:40px}.user-block.user-block-sm .username{font-size:14px}.img-sm,.img-md,.img-lg,.box-comments .box-comment img,.user-block.user-block-sm img{float:left}.img-sm,.box-comments .box-comment img,.user-block.user-block-sm img{width:30px!important;height:30px!important}.img-sm+.img-push{margin-left:40px}.img-md{width:60px;height:60px}.img-md+.img-push{margin-left:70px}.img-lg{width:100px;height:100px}.img-lg+.img-push{margin-left:110px}.img-bordered{border:3px solid #d2d6de;padding:3px}.img-bordered-sm{border:2px solid #d2d6de;padding:2px}.attachment-block{border:1px solid #f4f4f4;padding:5px;margin-bottom:10px;background:#f7f7f7}.attachment-block .attachment-img{max-width:100px;max-height:100px;height:auto;float:left}.attachment-block .attachment-pushed{margin-left:110px}.attachment-block .attachment-heading{margin:0}.attachment-block .attachment-text{color:#555}.connectedSortable{min-height:100px}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sort-highlight{background:#f4f4f4;border:1px dashed #ddd;margin-bottom:10px}.full-opacity-hover{opacity:.65;filter:alpha(opacity=65)}.full-opacity-hover:hover{opacity:1;filter:alpha(opacity=100)}.chart{position:relative;overflow:hidden;width:100%}.chart svg,.chart canvas{width:100%!important}@media print{.no-print,.main-sidebar,.left-side,.main-header,.content-header{display:none!important}.content-wrapper,.right-side,.main-footer{margin-left:0!important;min-height:0!important;-webkit-transform:translate(0, 0) !important;-ms-transform:translate(0, 0) !important;-o-transform:translate(0, 0) !important;transform:translate(0, 0) !important}.fixed .content-wrapper,.fixed .right-side{padding-top:0!important}.invoice{width:100%;border:0;margin:0;padding:0}.invoice-col{float:left;width:33.3333333%}.table-responsive{overflow:auto}.table-responsive>.table tr th,.table-responsive>.table tr td{white-space:normal!important}} \ No newline at end of file diff --git a/dist/css/skins/_all-skins.css b/dist/css/skins/_all-skins.css new file mode 100644 index 0000000..9af6a45 --- /dev/null +++ b/dist/css/skins/_all-skins.css @@ -0,0 +1,1799 @@ +/* + * Skin: Blue + * ---------- + */ +.skin-blue .main-header .navbar { + background-color: #3c8dbc; +} +.skin-blue .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-blue .main-header .navbar .nav > li > a:hover, +.skin-blue .main-header .navbar .nav > li > a:active, +.skin-blue .main-header .navbar .nav > li > a:focus, +.skin-blue .main-header .navbar .nav .open > a, +.skin-blue .main-header .navbar .nav .open > a:hover, +.skin-blue .main-header .navbar .nav .open > a:focus, +.skin-blue .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-blue .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-blue .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-blue .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-blue .main-header .navbar .sidebar-toggle:hover { + background-color: #367fa9; +} +@media (max-width: 767px) { + .skin-blue .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-blue .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-blue .main-header .navbar .dropdown-menu li a:hover { + background: #367fa9; + } +} +.skin-blue .main-header .logo { + background-color: #367fa9; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue .main-header .logo:hover { + background-color: #357ca5; +} +.skin-blue .main-header li.user-header { + background-color: #3c8dbc; +} +.skin-blue .content-header { + background: transparent; +} +.skin-blue .wrapper, +.skin-blue .main-sidebar, +.skin-blue .left-side { + background-color: #222d32; +} +.skin-blue .user-panel > .info, +.skin-blue .user-panel > .info > a { + color: #fff; +} +.skin-blue .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-blue .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-blue .sidebar-menu > li:hover > a, +.skin-blue .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #3c8dbc; +} +.skin-blue .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-blue .sidebar a { + color: #b8c7ce; +} +.skin-blue .sidebar a:hover { + text-decoration: none; +} +.skin-blue .treeview-menu > li > a { + color: #8aa4af; +} +.skin-blue .treeview-menu > li.active > a, +.skin-blue .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-blue .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-blue .sidebar-form input[type="text"], +.skin-blue .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-blue .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-blue .sidebar-form input[type="text"]:focus, +.skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-blue .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +.skin-blue.layout-top-nav .main-header > .logo { + background-color: #3c8dbc; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue.layout-top-nav .main-header > .logo:hover { + background-color: #3b8ab8; +} +/* + * Skin: Blue + * ---------- + */ +.skin-blue-light .main-header .navbar { + background-color: #3c8dbc; +} +.skin-blue-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-blue-light .main-header .navbar .nav > li > a:hover, +.skin-blue-light .main-header .navbar .nav > li > a:active, +.skin-blue-light .main-header .navbar .nav > li > a:focus, +.skin-blue-light .main-header .navbar .nav .open > a, +.skin-blue-light .main-header .navbar .nav .open > a:hover, +.skin-blue-light .main-header .navbar .nav .open > a:focus, +.skin-blue-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-blue-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-blue-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-blue-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-blue-light .main-header .navbar .sidebar-toggle:hover { + background-color: #367fa9; +} +@media (max-width: 767px) { + .skin-blue-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-blue-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-blue-light .main-header .navbar .dropdown-menu li a:hover { + background: #367fa9; + } +} +.skin-blue-light .main-header .logo { + background-color: #3c8dbc; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue-light .main-header .logo:hover { + background-color: #3b8ab8; +} +.skin-blue-light .main-header li.user-header { + background-color: #3c8dbc; +} +.skin-blue-light .content-header { + background: transparent; +} +.skin-blue-light .wrapper, +.skin-blue-light .main-sidebar, +.skin-blue-light .left-side { + background-color: #f9fafc; +} +.skin-blue-light .content-wrapper, +.skin-blue-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-blue-light .user-panel > .info, +.skin-blue-light .user-panel > .info > a { + color: #444444; +} +.skin-blue-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-blue-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-blue-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-blue-light .sidebar-menu > li:hover > a, +.skin-blue-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-blue-light .sidebar-menu > li.active { + border-left-color: #3c8dbc; +} +.skin-blue-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-blue-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-blue-light .sidebar a { + color: #444444; +} +.skin-blue-light .sidebar a:hover { + text-decoration: none; +} +.skin-blue-light .treeview-menu > li > a { + color: #777777; +} +.skin-blue-light .treeview-menu > li.active > a, +.skin-blue-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-blue-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-blue-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-blue-light .sidebar-form input[type="text"], +.skin-blue-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-blue-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-blue-light .sidebar-form input[type="text"]:focus, +.skin-blue-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-blue-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-blue-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} +.skin-blue-light .main-footer { + border-top-color: #d2d6de; +} +.skin-blue.layout-top-nav .main-header > .logo { + background-color: #3c8dbc; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue.layout-top-nav .main-header > .logo:hover { + background-color: #3b8ab8; +} +/* + * Skin: Black + * ----------- + */ +/* skin-black navbar */ +.skin-black .main-header { + -webkit-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); +} +.skin-black .main-header .navbar-toggle { + color: #333; +} +.skin-black .main-header .navbar-brand { + color: #333; + border-right: 1px solid #eee; +} +.skin-black .main-header > .navbar { + background-color: #ffffff; +} +.skin-black .main-header > .navbar .nav > li > a { + color: #333333; +} +.skin-black .main-header > .navbar .nav > li > a:hover, +.skin-black .main-header > .navbar .nav > li > a:active, +.skin-black .main-header > .navbar .nav > li > a:focus, +.skin-black .main-header > .navbar .nav .open > a, +.skin-black .main-header > .navbar .nav .open > a:hover, +.skin-black .main-header > .navbar .nav .open > a:focus, +.skin-black .main-header > .navbar .nav > .active > a { + background: #ffffff; + color: #999999; +} +.skin-black .main-header > .navbar .sidebar-toggle { + color: #333333; +} +.skin-black .main-header > .navbar .sidebar-toggle:hover { + color: #999999; + background: #ffffff; +} +.skin-black .main-header > .navbar > .sidebar-toggle { + color: #333; + border-right: 1px solid #eee; +} +.skin-black .main-header > .navbar .navbar-nav > li > a { + border-right: 1px solid #eee; +} +.skin-black .main-header > .navbar .navbar-custom-menu .navbar-nav > li > a, +.skin-black .main-header > .navbar .navbar-right > li > a { + border-left: 1px solid #eee; + border-right-width: 0; +} +.skin-black .main-header > .logo { + background-color: #ffffff; + color: #333333; + border-bottom: 0 solid transparent; + border-right: 1px solid #eee; +} +.skin-black .main-header > .logo:hover { + background-color: #fcfcfc; +} +@media (max-width: 767px) { + .skin-black .main-header > .logo { + background-color: #222222; + color: #ffffff; + border-bottom: 0 solid transparent; + border-right: none; + } + .skin-black .main-header > .logo:hover { + background-color: #1f1f1f; + } +} +.skin-black .main-header li.user-header { + background-color: #222; +} +.skin-black .content-header { + background: transparent; + box-shadow: none; +} +.skin-black .wrapper, +.skin-black .main-sidebar, +.skin-black .left-side { + background-color: #222d32; +} +.skin-black .user-panel > .info, +.skin-black .user-panel > .info > a { + color: #fff; +} +.skin-black .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-black .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-black .sidebar-menu > li:hover > a, +.skin-black .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #ffffff; +} +.skin-black .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-black .sidebar a { + color: #b8c7ce; +} +.skin-black .sidebar a:hover { + text-decoration: none; +} +.skin-black .treeview-menu > li > a { + color: #8aa4af; +} +.skin-black .treeview-menu > li.active > a, +.skin-black .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-black .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-black .sidebar-form input[type="text"], +.skin-black .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-black .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-black .sidebar-form input[type="text"]:focus, +.skin-black .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-black .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-black .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +/* + * Skin: Black + * ----------- + */ +/* skin-black navbar */ +.skin-black-light .main-header { + -webkit-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); +} +.skin-black-light .main-header .navbar-toggle { + color: #333; +} +.skin-black-light .main-header .navbar-brand { + color: #333; + border-right: 1px solid #eee; +} +.skin-black-light .main-header > .navbar { + background-color: #ffffff; +} +.skin-black-light .main-header > .navbar .nav > li > a { + color: #333333; +} +.skin-black-light .main-header > .navbar .nav > li > a:hover, +.skin-black-light .main-header > .navbar .nav > li > a:active, +.skin-black-light .main-header > .navbar .nav > li > a:focus, +.skin-black-light .main-header > .navbar .nav .open > a, +.skin-black-light .main-header > .navbar .nav .open > a:hover, +.skin-black-light .main-header > .navbar .nav .open > a:focus, +.skin-black-light .main-header > .navbar .nav > .active > a { + background: #ffffff; + color: #999999; +} +.skin-black-light .main-header > .navbar .sidebar-toggle { + color: #333333; +} +.skin-black-light .main-header > .navbar .sidebar-toggle:hover { + color: #999999; + background: #ffffff; +} +.skin-black-light .main-header > .navbar > .sidebar-toggle { + color: #333; + border-right: 1px solid #eee; +} +.skin-black-light .main-header > .navbar .navbar-nav > li > a { + border-right: 1px solid #eee; +} +.skin-black-light .main-header > .navbar .navbar-custom-menu .navbar-nav > li > a, +.skin-black-light .main-header > .navbar .navbar-right > li > a { + border-left: 1px solid #eee; + border-right-width: 0; +} +.skin-black-light .main-header > .logo { + background-color: #ffffff; + color: #333333; + border-bottom: 0 solid transparent; + border-right: 1px solid #eee; +} +.skin-black-light .main-header > .logo:hover { + background-color: #fcfcfc; +} +@media (max-width: 767px) { + .skin-black-light .main-header > .logo { + background-color: #222222; + color: #ffffff; + border-bottom: 0 solid transparent; + border-right: none; + } + .skin-black-light .main-header > .logo:hover { + background-color: #1f1f1f; + } +} +.skin-black-light .main-header li.user-header { + background-color: #222; +} +.skin-black-light .content-header { + background: transparent; + box-shadow: none; +} +.skin-black-light .wrapper, +.skin-black-light .main-sidebar, +.skin-black-light .left-side { + background-color: #f9fafc; +} +.skin-black-light .content-wrapper, +.skin-black-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-black-light .user-panel > .info, +.skin-black-light .user-panel > .info > a { + color: #444444; +} +.skin-black-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-black-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-black-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-black-light .sidebar-menu > li:hover > a, +.skin-black-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-black-light .sidebar-menu > li.active { + border-left-color: #ffffff; +} +.skin-black-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-black-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-black-light .sidebar a { + color: #444444; +} +.skin-black-light .sidebar a:hover { + text-decoration: none; +} +.skin-black-light .treeview-menu > li > a { + color: #777777; +} +.skin-black-light .treeview-menu > li.active > a, +.skin-black-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-black-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-black-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-black-light .sidebar-form input[type="text"], +.skin-black-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-black-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-black-light .sidebar-form input[type="text"]:focus, +.skin-black-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-black-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-black-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} +/* + * Skin: Green + * ----------- + */ +.skin-green .main-header .navbar { + background-color: #00a65a; +} +.skin-green .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-green .main-header .navbar .nav > li > a:hover, +.skin-green .main-header .navbar .nav > li > a:active, +.skin-green .main-header .navbar .nav > li > a:focus, +.skin-green .main-header .navbar .nav .open > a, +.skin-green .main-header .navbar .nav .open > a:hover, +.skin-green .main-header .navbar .nav .open > a:focus, +.skin-green .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-green .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-green .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-green .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-green .main-header .navbar .sidebar-toggle:hover { + background-color: #008d4c; +} +@media (max-width: 767px) { + .skin-green .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-green .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-green .main-header .navbar .dropdown-menu li a:hover { + background: #008d4c; + } +} +.skin-green .main-header .logo { + background-color: #008d4c; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-green .main-header .logo:hover { + background-color: #008749; +} +.skin-green .main-header li.user-header { + background-color: #00a65a; +} +.skin-green .content-header { + background: transparent; +} +.skin-green .wrapper, +.skin-green .main-sidebar, +.skin-green .left-side { + background-color: #222d32; +} +.skin-green .user-panel > .info, +.skin-green .user-panel > .info > a { + color: #fff; +} +.skin-green .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-green .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-green .sidebar-menu > li:hover > a, +.skin-green .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #00a65a; +} +.skin-green .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-green .sidebar a { + color: #b8c7ce; +} +.skin-green .sidebar a:hover { + text-decoration: none; +} +.skin-green .treeview-menu > li > a { + color: #8aa4af; +} +.skin-green .treeview-menu > li.active > a, +.skin-green .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-green .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-green .sidebar-form input[type="text"], +.skin-green .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-green .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-green .sidebar-form input[type="text"]:focus, +.skin-green .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-green .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-green .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +/* + * Skin: Green + * ----------- + */ +.skin-green-light .main-header .navbar { + background-color: #00a65a; +} +.skin-green-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-green-light .main-header .navbar .nav > li > a:hover, +.skin-green-light .main-header .navbar .nav > li > a:active, +.skin-green-light .main-header .navbar .nav > li > a:focus, +.skin-green-light .main-header .navbar .nav .open > a, +.skin-green-light .main-header .navbar .nav .open > a:hover, +.skin-green-light .main-header .navbar .nav .open > a:focus, +.skin-green-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-green-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-green-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-green-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-green-light .main-header .navbar .sidebar-toggle:hover { + background-color: #008d4c; +} +@media (max-width: 767px) { + .skin-green-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-green-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-green-light .main-header .navbar .dropdown-menu li a:hover { + background: #008d4c; + } +} +.skin-green-light .main-header .logo { + background-color: #00a65a; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-green-light .main-header .logo:hover { + background-color: #00a157; +} +.skin-green-light .main-header li.user-header { + background-color: #00a65a; +} +.skin-green-light .content-header { + background: transparent; +} +.skin-green-light .wrapper, +.skin-green-light .main-sidebar, +.skin-green-light .left-side { + background-color: #f9fafc; +} +.skin-green-light .content-wrapper, +.skin-green-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-green-light .user-panel > .info, +.skin-green-light .user-panel > .info > a { + color: #444444; +} +.skin-green-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-green-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-green-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-green-light .sidebar-menu > li:hover > a, +.skin-green-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-green-light .sidebar-menu > li.active { + border-left-color: #00a65a; +} +.skin-green-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-green-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-green-light .sidebar a { + color: #444444; +} +.skin-green-light .sidebar a:hover { + text-decoration: none; +} +.skin-green-light .treeview-menu > li > a { + color: #777777; +} +.skin-green-light .treeview-menu > li.active > a, +.skin-green-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-green-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-green-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-green-light .sidebar-form input[type="text"], +.skin-green-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-green-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-green-light .sidebar-form input[type="text"]:focus, +.skin-green-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-green-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-green-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} +/* + * Skin: Red + * --------- + */ +.skin-red .main-header .navbar { + background-color: #dd4b39; +} +.skin-red .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-red .main-header .navbar .nav > li > a:hover, +.skin-red .main-header .navbar .nav > li > a:active, +.skin-red .main-header .navbar .nav > li > a:focus, +.skin-red .main-header .navbar .nav .open > a, +.skin-red .main-header .navbar .nav .open > a:hover, +.skin-red .main-header .navbar .nav .open > a:focus, +.skin-red .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-red .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-red .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-red .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-red .main-header .navbar .sidebar-toggle:hover { + background-color: #d73925; +} +@media (max-width: 767px) { + .skin-red .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-red .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-red .main-header .navbar .dropdown-menu li a:hover { + background: #d73925; + } +} +.skin-red .main-header .logo { + background-color: #d73925; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-red .main-header .logo:hover { + background-color: #d33724; +} +.skin-red .main-header li.user-header { + background-color: #dd4b39; +} +.skin-red .content-header { + background: transparent; +} +.skin-red .wrapper, +.skin-red .main-sidebar, +.skin-red .left-side { + background-color: #222d32; +} +.skin-red .user-panel > .info, +.skin-red .user-panel > .info > a { + color: #fff; +} +.skin-red .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-red .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-red .sidebar-menu > li:hover > a, +.skin-red .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #dd4b39; +} +.skin-red .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-red .sidebar a { + color: #b8c7ce; +} +.skin-red .sidebar a:hover { + text-decoration: none; +} +.skin-red .treeview-menu > li > a { + color: #8aa4af; +} +.skin-red .treeview-menu > li.active > a, +.skin-red .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-red .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-red .sidebar-form input[type="text"], +.skin-red .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-red .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-red .sidebar-form input[type="text"]:focus, +.skin-red .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-red .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-red .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +/* + * Skin: Red + * --------- + */ +.skin-red-light .main-header .navbar { + background-color: #dd4b39; +} +.skin-red-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-red-light .main-header .navbar .nav > li > a:hover, +.skin-red-light .main-header .navbar .nav > li > a:active, +.skin-red-light .main-header .navbar .nav > li > a:focus, +.skin-red-light .main-header .navbar .nav .open > a, +.skin-red-light .main-header .navbar .nav .open > a:hover, +.skin-red-light .main-header .navbar .nav .open > a:focus, +.skin-red-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-red-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-red-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-red-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-red-light .main-header .navbar .sidebar-toggle:hover { + background-color: #d73925; +} +@media (max-width: 767px) { + .skin-red-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-red-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-red-light .main-header .navbar .dropdown-menu li a:hover { + background: #d73925; + } +} +.skin-red-light .main-header .logo { + background-color: #dd4b39; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-red-light .main-header .logo:hover { + background-color: #dc4735; +} +.skin-red-light .main-header li.user-header { + background-color: #dd4b39; +} +.skin-red-light .content-header { + background: transparent; +} +.skin-red-light .wrapper, +.skin-red-light .main-sidebar, +.skin-red-light .left-side { + background-color: #f9fafc; +} +.skin-red-light .content-wrapper, +.skin-red-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-red-light .user-panel > .info, +.skin-red-light .user-panel > .info > a { + color: #444444; +} +.skin-red-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-red-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-red-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-red-light .sidebar-menu > li:hover > a, +.skin-red-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-red-light .sidebar-menu > li.active { + border-left-color: #dd4b39; +} +.skin-red-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-red-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-red-light .sidebar a { + color: #444444; +} +.skin-red-light .sidebar a:hover { + text-decoration: none; +} +.skin-red-light .treeview-menu > li > a { + color: #777777; +} +.skin-red-light .treeview-menu > li.active > a, +.skin-red-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-red-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-red-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-red-light .sidebar-form input[type="text"], +.skin-red-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-red-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-red-light .sidebar-form input[type="text"]:focus, +.skin-red-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-red-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-red-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} +/* + * Skin: Yellow + * ------------ + */ +.skin-yellow .main-header .navbar { + background-color: #f39c12; +} +.skin-yellow .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-yellow .main-header .navbar .nav > li > a:hover, +.skin-yellow .main-header .navbar .nav > li > a:active, +.skin-yellow .main-header .navbar .nav > li > a:focus, +.skin-yellow .main-header .navbar .nav .open > a, +.skin-yellow .main-header .navbar .nav .open > a:hover, +.skin-yellow .main-header .navbar .nav .open > a:focus, +.skin-yellow .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-yellow .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-yellow .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-yellow .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-yellow .main-header .navbar .sidebar-toggle:hover { + background-color: #e08e0b; +} +@media (max-width: 767px) { + .skin-yellow .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-yellow .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-yellow .main-header .navbar .dropdown-menu li a:hover { + background: #e08e0b; + } +} +.skin-yellow .main-header .logo { + background-color: #e08e0b; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-yellow .main-header .logo:hover { + background-color: #db8b0b; +} +.skin-yellow .main-header li.user-header { + background-color: #f39c12; +} +.skin-yellow .content-header { + background: transparent; +} +.skin-yellow .wrapper, +.skin-yellow .main-sidebar, +.skin-yellow .left-side { + background-color: #222d32; +} +.skin-yellow .user-panel > .info, +.skin-yellow .user-panel > .info > a { + color: #fff; +} +.skin-yellow .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-yellow .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-yellow .sidebar-menu > li:hover > a, +.skin-yellow .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #f39c12; +} +.skin-yellow .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-yellow .sidebar a { + color: #b8c7ce; +} +.skin-yellow .sidebar a:hover { + text-decoration: none; +} +.skin-yellow .treeview-menu > li > a { + color: #8aa4af; +} +.skin-yellow .treeview-menu > li.active > a, +.skin-yellow .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-yellow .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-yellow .sidebar-form input[type="text"], +.skin-yellow .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-yellow .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-yellow .sidebar-form input[type="text"]:focus, +.skin-yellow .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-yellow .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-yellow .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +/* + * Skin: Yellow + * ------------ + */ +.skin-yellow-light .main-header .navbar { + background-color: #f39c12; +} +.skin-yellow-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-yellow-light .main-header .navbar .nav > li > a:hover, +.skin-yellow-light .main-header .navbar .nav > li > a:active, +.skin-yellow-light .main-header .navbar .nav > li > a:focus, +.skin-yellow-light .main-header .navbar .nav .open > a, +.skin-yellow-light .main-header .navbar .nav .open > a:hover, +.skin-yellow-light .main-header .navbar .nav .open > a:focus, +.skin-yellow-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-yellow-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-yellow-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-yellow-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-yellow-light .main-header .navbar .sidebar-toggle:hover { + background-color: #e08e0b; +} +@media (max-width: 767px) { + .skin-yellow-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-yellow-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-yellow-light .main-header .navbar .dropdown-menu li a:hover { + background: #e08e0b; + } +} +.skin-yellow-light .main-header .logo { + background-color: #f39c12; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-yellow-light .main-header .logo:hover { + background-color: #f39a0d; +} +.skin-yellow-light .main-header li.user-header { + background-color: #f39c12; +} +.skin-yellow-light .content-header { + background: transparent; +} +.skin-yellow-light .wrapper, +.skin-yellow-light .main-sidebar, +.skin-yellow-light .left-side { + background-color: #f9fafc; +} +.skin-yellow-light .content-wrapper, +.skin-yellow-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-yellow-light .user-panel > .info, +.skin-yellow-light .user-panel > .info > a { + color: #444444; +} +.skin-yellow-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-yellow-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-yellow-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-yellow-light .sidebar-menu > li:hover > a, +.skin-yellow-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-yellow-light .sidebar-menu > li.active { + border-left-color: #f39c12; +} +.skin-yellow-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-yellow-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-yellow-light .sidebar a { + color: #444444; +} +.skin-yellow-light .sidebar a:hover { + text-decoration: none; +} +.skin-yellow-light .treeview-menu > li > a { + color: #777777; +} +.skin-yellow-light .treeview-menu > li.active > a, +.skin-yellow-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-yellow-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-yellow-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-yellow-light .sidebar-form input[type="text"], +.skin-yellow-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-yellow-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-yellow-light .sidebar-form input[type="text"]:focus, +.skin-yellow-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-yellow-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-yellow-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} +/* + * Skin: Purple + * ------------ + */ +.skin-purple .main-header .navbar { + background-color: #605ca8; +} +.skin-purple .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-purple .main-header .navbar .nav > li > a:hover, +.skin-purple .main-header .navbar .nav > li > a:active, +.skin-purple .main-header .navbar .nav > li > a:focus, +.skin-purple .main-header .navbar .nav .open > a, +.skin-purple .main-header .navbar .nav .open > a:hover, +.skin-purple .main-header .navbar .nav .open > a:focus, +.skin-purple .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-purple .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-purple .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-purple .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-purple .main-header .navbar .sidebar-toggle:hover { + background-color: #555299; +} +@media (max-width: 767px) { + .skin-purple .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-purple .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-purple .main-header .navbar .dropdown-menu li a:hover { + background: #555299; + } +} +.skin-purple .main-header .logo { + background-color: #555299; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-purple .main-header .logo:hover { + background-color: #545096; +} +.skin-purple .main-header li.user-header { + background-color: #605ca8; +} +.skin-purple .content-header { + background: transparent; +} +.skin-purple .wrapper, +.skin-purple .main-sidebar, +.skin-purple .left-side { + background-color: #222d32; +} +.skin-purple .user-panel > .info, +.skin-purple .user-panel > .info > a { + color: #fff; +} +.skin-purple .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-purple .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-purple .sidebar-menu > li:hover > a, +.skin-purple .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #605ca8; +} +.skin-purple .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-purple .sidebar a { + color: #b8c7ce; +} +.skin-purple .sidebar a:hover { + text-decoration: none; +} +.skin-purple .treeview-menu > li > a { + color: #8aa4af; +} +.skin-purple .treeview-menu > li.active > a, +.skin-purple .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-purple .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-purple .sidebar-form input[type="text"], +.skin-purple .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-purple .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-purple .sidebar-form input[type="text"]:focus, +.skin-purple .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-purple .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-purple .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +/* + * Skin: Purple + * ------------ + */ +.skin-purple-light .main-header .navbar { + background-color: #605ca8; +} +.skin-purple-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-purple-light .main-header .navbar .nav > li > a:hover, +.skin-purple-light .main-header .navbar .nav > li > a:active, +.skin-purple-light .main-header .navbar .nav > li > a:focus, +.skin-purple-light .main-header .navbar .nav .open > a, +.skin-purple-light .main-header .navbar .nav .open > a:hover, +.skin-purple-light .main-header .navbar .nav .open > a:focus, +.skin-purple-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-purple-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-purple-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-purple-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-purple-light .main-header .navbar .sidebar-toggle:hover { + background-color: #555299; +} +@media (max-width: 767px) { + .skin-purple-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-purple-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-purple-light .main-header .navbar .dropdown-menu li a:hover { + background: #555299; + } +} +.skin-purple-light .main-header .logo { + background-color: #605ca8; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-purple-light .main-header .logo:hover { + background-color: #5d59a6; +} +.skin-purple-light .main-header li.user-header { + background-color: #605ca8; +} +.skin-purple-light .content-header { + background: transparent; +} +.skin-purple-light .wrapper, +.skin-purple-light .main-sidebar, +.skin-purple-light .left-side { + background-color: #f9fafc; +} +.skin-purple-light .content-wrapper, +.skin-purple-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-purple-light .user-panel > .info, +.skin-purple-light .user-panel > .info > a { + color: #444444; +} +.skin-purple-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-purple-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-purple-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-purple-light .sidebar-menu > li:hover > a, +.skin-purple-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-purple-light .sidebar-menu > li.active { + border-left-color: #605ca8; +} +.skin-purple-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-purple-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-purple-light .sidebar a { + color: #444444; +} +.skin-purple-light .sidebar a:hover { + text-decoration: none; +} +.skin-purple-light .treeview-menu > li > a { + color: #777777; +} +.skin-purple-light .treeview-menu > li.active > a, +.skin-purple-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-purple-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-purple-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-purple-light .sidebar-form input[type="text"], +.skin-purple-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-purple-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-purple-light .sidebar-form input[type="text"]:focus, +.skin-purple-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-purple-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-purple-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} diff --git a/dist/css/skins/_all-skins.min.css b/dist/css/skins/_all-skins.min.css new file mode 100644 index 0000000..1710db5 --- /dev/null +++ b/dist/css/skins/_all-skins.min.css @@ -0,0 +1 @@ +.skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav>li>a:hover,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent}.skin-blue .main-header .logo:hover{background-color:#357ca5}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:transparent}.skin-blue .wrapper,.skin-blue .main-sidebar,.skin-blue .left-side{background-color:#222d32}.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li:hover>a,.skin-blue .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .sidebar a:hover{text-decoration:none}.skin-blue .treeview-menu>li>a{color:#8aa4af}.skin-blue .treeview-menu>li.active>a,.skin-blue .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-blue .sidebar-form input[type="text"],.skin-blue .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-blue .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue .sidebar-form input[type="text"]:focus,.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header .navbar{background-color:#3c8dbc}.skin-blue-light .main-header .navbar .nav>li>a{color:#fff}.skin-blue-light .main-header .navbar .nav>li>a:hover,.skin-blue-light .main-header .navbar .nav>li>a:active,.skin-blue-light .main-header .navbar .nav>li>a:focus,.skin-blue-light .main-header .navbar .nav .open>a,.skin-blue-light .main-header .navbar .nav .open>a:hover,.skin-blue-light .main-header .navbar .nav .open>a:focus,.skin-blue-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue-light .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue-light .main-header .logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue-light .main-header .logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header li.user-header{background-color:#3c8dbc}.skin-blue-light .content-header{background:transparent}.skin-blue-light .wrapper,.skin-blue-light .main-sidebar,.skin-blue-light .left-side{background-color:#f9fafc}.skin-blue-light .content-wrapper,.skin-blue-light .main-footer{border-left:1px solid #d2d6de}.skin-blue-light .user-panel>.info,.skin-blue-light .user-panel>.info>a{color:#444}.skin-blue-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-blue-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-blue-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-blue-light .sidebar-menu>li:hover>a,.skin-blue-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-blue-light .sidebar-menu>li.active{border-left-color:#3c8dbc}.skin-blue-light .sidebar-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-blue-light .sidebar a{color:#444}.skin-blue-light .sidebar a:hover{text-decoration:none}.skin-blue-light .treeview-menu>li>a{color:#777}.skin-blue-light .treeview-menu>li.active>a,.skin-blue-light .treeview-menu>li>a:hover{color:#000}.skin-blue-light .treeview-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-blue-light .sidebar-form input[type="text"],.skin-blue-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-blue-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue-light .sidebar-form input[type="text"]:focus,.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-blue-light .main-footer{border-top-color:#d2d6de}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8}.skin-black .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.skin-black .main-header .navbar-toggle{color:#333}.skin-black .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black .main-header>.navbar{background-color:#fff}.skin-black .main-header>.navbar .nav>li>a{color:#333}.skin-black .main-header>.navbar .nav>li>a:hover,.skin-black .main-header>.navbar .nav>li>a:active,.skin-black .main-header>.navbar .nav>li>a:focus,.skin-black .main-header>.navbar .nav .open>a,.skin-black .main-header>.navbar .nav .open>a:hover,.skin-black .main-header>.navbar .nav .open>a:focus,.skin-black .main-header>.navbar .nav>.active>a{background:#fff;color:#999}.skin-black .main-header>.navbar .sidebar-toggle{color:#333}.skin-black .main-header>.navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black .main-header>.navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black .main-header>.navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black .main-header>.navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black .main-header>.navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black .main-header li.user-header{background-color:#222}.skin-black .content-header{background:transparent;box-shadow:none}.skin-black .wrapper,.skin-black .main-sidebar,.skin-black .left-side{background-color:#222d32}.skin-black .user-panel>.info,.skin-black .user-panel>.info>a{color:#fff}.skin-black .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-black .sidebar-menu>li>a{border-left:3px solid transparent}.skin-black .sidebar-menu>li:hover>a,.skin-black .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#fff}.skin-black .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-black .sidebar a{color:#b8c7ce}.skin-black .sidebar a:hover{text-decoration:none}.skin-black .treeview-menu>li>a{color:#8aa4af}.skin-black .treeview-menu>li.active>a,.skin-black .treeview-menu>li>a:hover{color:#fff}.skin-black .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-black .sidebar-form input[type="text"],.skin-black .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-black .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black .sidebar-form input[type="text"]:focus,.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-black-light .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.skin-black-light .main-header .navbar-toggle{color:#333}.skin-black-light .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black-light .main-header>.navbar{background-color:#fff}.skin-black-light .main-header>.navbar .nav>li>a{color:#333}.skin-black-light .main-header>.navbar .nav>li>a:hover,.skin-black-light .main-header>.navbar .nav>li>a:active,.skin-black-light .main-header>.navbar .nav>li>a:focus,.skin-black-light .main-header>.navbar .nav .open>a,.skin-black-light .main-header>.navbar .nav .open>a:hover,.skin-black-light .main-header>.navbar .nav .open>a:focus,.skin-black-light .main-header>.navbar .nav>.active>a{background:#fff;color:#999}.skin-black-light .main-header>.navbar .sidebar-toggle{color:#333}.skin-black-light .main-header>.navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black-light .main-header>.navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black-light .main-header>.navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black-light .main-header>.navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black-light .main-header>.navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black-light .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black-light .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black-light .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black-light .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black-light .main-header li.user-header{background-color:#222}.skin-black-light .content-header{background:transparent;box-shadow:none}.skin-black-light .wrapper,.skin-black-light .main-sidebar,.skin-black-light .left-side{background-color:#f9fafc}.skin-black-light .content-wrapper,.skin-black-light .main-footer{border-left:1px solid #d2d6de}.skin-black-light .user-panel>.info,.skin-black-light .user-panel>.info>a{color:#444}.skin-black-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-black-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-black-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-black-light .sidebar-menu>li:hover>a,.skin-black-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-black-light .sidebar-menu>li.active{border-left-color:#fff}.skin-black-light .sidebar-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-black-light .sidebar a{color:#444}.skin-black-light .sidebar a:hover{text-decoration:none}.skin-black-light .treeview-menu>li>a{color:#777}.skin-black-light .treeview-menu>li.active>a,.skin-black-light .treeview-menu>li>a:hover{color:#000}.skin-black-light .treeview-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-black-light .sidebar-form input[type="text"],.skin-black-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-black-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black-light .sidebar-form input[type="text"]:focus,.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-green .main-header .navbar{background-color:#00a65a}.skin-green .main-header .navbar .nav>li>a{color:#fff}.skin-green .main-header .navbar .nav>li>a:hover,.skin-green .main-header .navbar .nav>li>a:active,.skin-green .main-header .navbar .nav>li>a:focus,.skin-green .main-header .navbar .nav .open>a,.skin-green .main-header .navbar .nav .open>a:hover,.skin-green .main-header .navbar .nav .open>a:focus,.skin-green .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green .main-header .logo{background-color:#008d4c;color:#fff;border-bottom:0 solid transparent}.skin-green .main-header .logo:hover{background-color:#008749}.skin-green .main-header li.user-header{background-color:#00a65a}.skin-green .content-header{background:transparent}.skin-green .wrapper,.skin-green .main-sidebar,.skin-green .left-side{background-color:#222d32}.skin-green .user-panel>.info,.skin-green .user-panel>.info>a{color:#fff}.skin-green .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-green .sidebar-menu>li>a{border-left:3px solid transparent}.skin-green .sidebar-menu>li:hover>a,.skin-green .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#00a65a}.skin-green .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-green .sidebar a{color:#b8c7ce}.skin-green .sidebar a:hover{text-decoration:none}.skin-green .treeview-menu>li>a{color:#8aa4af}.skin-green .treeview-menu>li.active>a,.skin-green .treeview-menu>li>a:hover{color:#fff}.skin-green .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-green .sidebar-form input[type="text"],.skin-green .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-green .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green .sidebar-form input[type="text"]:focus,.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-green-light .main-header .navbar{background-color:#00a65a}.skin-green-light .main-header .navbar .nav>li>a{color:#fff}.skin-green-light .main-header .navbar .nav>li>a:hover,.skin-green-light .main-header .navbar .nav>li>a:active,.skin-green-light .main-header .navbar .nav>li>a:focus,.skin-green-light .main-header .navbar .nav .open>a,.skin-green-light .main-header .navbar .nav .open>a:hover,.skin-green-light .main-header .navbar .nav .open>a:focus,.skin-green-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green-light .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green-light .main-header .logo{background-color:#00a65a;color:#fff;border-bottom:0 solid transparent}.skin-green-light .main-header .logo:hover{background-color:#00a157}.skin-green-light .main-header li.user-header{background-color:#00a65a}.skin-green-light .content-header{background:transparent}.skin-green-light .wrapper,.skin-green-light .main-sidebar,.skin-green-light .left-side{background-color:#f9fafc}.skin-green-light .content-wrapper,.skin-green-light .main-footer{border-left:1px solid #d2d6de}.skin-green-light .user-panel>.info,.skin-green-light .user-panel>.info>a{color:#444}.skin-green-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-green-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-green-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-green-light .sidebar-menu>li:hover>a,.skin-green-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-green-light .sidebar-menu>li.active{border-left-color:#00a65a}.skin-green-light .sidebar-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-green-light .sidebar a{color:#444}.skin-green-light .sidebar a:hover{text-decoration:none}.skin-green-light .treeview-menu>li>a{color:#777}.skin-green-light .treeview-menu>li.active>a,.skin-green-light .treeview-menu>li>a:hover{color:#000}.skin-green-light .treeview-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-green-light .sidebar-form input[type="text"],.skin-green-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-green-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green-light .sidebar-form input[type="text"]:focus,.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-red .main-header .navbar{background-color:#dd4b39}.skin-red .main-header .navbar .nav>li>a{color:#fff}.skin-red .main-header .navbar .nav>li>a:hover,.skin-red .main-header .navbar .nav>li>a:active,.skin-red .main-header .navbar .nav>li>a:focus,.skin-red .main-header .navbar .nav .open>a,.skin-red .main-header .navbar .nav .open>a:hover,.skin-red .main-header .navbar .nav .open>a:focus,.skin-red .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red .main-header .logo{background-color:#d73925;color:#fff;border-bottom:0 solid transparent}.skin-red .main-header .logo:hover{background-color:#d33724}.skin-red .main-header li.user-header{background-color:#dd4b39}.skin-red .content-header{background:transparent}.skin-red .wrapper,.skin-red .main-sidebar,.skin-red .left-side{background-color:#222d32}.skin-red .user-panel>.info,.skin-red .user-panel>.info>a{color:#fff}.skin-red .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-red .sidebar-menu>li>a{border-left:3px solid transparent}.skin-red .sidebar-menu>li:hover>a,.skin-red .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#dd4b39}.skin-red .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-red .sidebar a{color:#b8c7ce}.skin-red .sidebar a:hover{text-decoration:none}.skin-red .treeview-menu>li>a{color:#8aa4af}.skin-red .treeview-menu>li.active>a,.skin-red .treeview-menu>li>a:hover{color:#fff}.skin-red .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-red .sidebar-form input[type="text"],.skin-red .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-red .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red .sidebar-form input[type="text"]:focus,.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-red-light .main-header .navbar{background-color:#dd4b39}.skin-red-light .main-header .navbar .nav>li>a{color:#fff}.skin-red-light .main-header .navbar .nav>li>a:hover,.skin-red-light .main-header .navbar .nav>li>a:active,.skin-red-light .main-header .navbar .nav>li>a:focus,.skin-red-light .main-header .navbar .nav .open>a,.skin-red-light .main-header .navbar .nav .open>a:hover,.skin-red-light .main-header .navbar .nav .open>a:focus,.skin-red-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red-light .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red-light .main-header .logo{background-color:#dd4b39;color:#fff;border-bottom:0 solid transparent}.skin-red-light .main-header .logo:hover{background-color:#dc4735}.skin-red-light .main-header li.user-header{background-color:#dd4b39}.skin-red-light .content-header{background:transparent}.skin-red-light .wrapper,.skin-red-light .main-sidebar,.skin-red-light .left-side{background-color:#f9fafc}.skin-red-light .content-wrapper,.skin-red-light .main-footer{border-left:1px solid #d2d6de}.skin-red-light .user-panel>.info,.skin-red-light .user-panel>.info>a{color:#444}.skin-red-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-red-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-red-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-red-light .sidebar-menu>li:hover>a,.skin-red-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-red-light .sidebar-menu>li.active{border-left-color:#dd4b39}.skin-red-light .sidebar-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-red-light .sidebar a{color:#444}.skin-red-light .sidebar a:hover{text-decoration:none}.skin-red-light .treeview-menu>li>a{color:#777}.skin-red-light .treeview-menu>li.active>a,.skin-red-light .treeview-menu>li>a:hover{color:#000}.skin-red-light .treeview-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-red-light .sidebar-form input[type="text"],.skin-red-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-red-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red-light .sidebar-form input[type="text"]:focus,.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-yellow .main-header .navbar{background-color:#f39c12}.skin-yellow .main-header .navbar .nav>li>a{color:#fff}.skin-yellow .main-header .navbar .nav>li>a:hover,.skin-yellow .main-header .navbar .nav>li>a:active,.skin-yellow .main-header .navbar .nav>li>a:focus,.skin-yellow .main-header .navbar .nav .open>a,.skin-yellow .main-header .navbar .nav .open>a:hover,.skin-yellow .main-header .navbar .nav .open>a:focus,.skin-yellow .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow .main-header .logo{background-color:#e08e0b;color:#fff;border-bottom:0 solid transparent}.skin-yellow .main-header .logo:hover{background-color:#db8b0b}.skin-yellow .main-header li.user-header{background-color:#f39c12}.skin-yellow .content-header{background:transparent}.skin-yellow .wrapper,.skin-yellow .main-sidebar,.skin-yellow .left-side{background-color:#222d32}.skin-yellow .user-panel>.info,.skin-yellow .user-panel>.info>a{color:#fff}.skin-yellow .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-yellow .sidebar-menu>li>a{border-left:3px solid transparent}.skin-yellow .sidebar-menu>li:hover>a,.skin-yellow .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#f39c12}.skin-yellow .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-yellow .sidebar a{color:#b8c7ce}.skin-yellow .sidebar a:hover{text-decoration:none}.skin-yellow .treeview-menu>li>a{color:#8aa4af}.skin-yellow .treeview-menu>li.active>a,.skin-yellow .treeview-menu>li>a:hover{color:#fff}.skin-yellow .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-yellow .sidebar-form input[type="text"],.skin-yellow .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-yellow .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow .sidebar-form input[type="text"]:focus,.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-yellow-light .main-header .navbar{background-color:#f39c12}.skin-yellow-light .main-header .navbar .nav>li>a{color:#fff}.skin-yellow-light .main-header .navbar .nav>li>a:hover,.skin-yellow-light .main-header .navbar .nav>li>a:active,.skin-yellow-light .main-header .navbar .nav>li>a:focus,.skin-yellow-light .main-header .navbar .nav .open>a,.skin-yellow-light .main-header .navbar .nav .open>a:hover,.skin-yellow-light .main-header .navbar .nav .open>a:focus,.skin-yellow-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow-light .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow-light .main-header .logo{background-color:#f39c12;color:#fff;border-bottom:0 solid transparent}.skin-yellow-light .main-header .logo:hover{background-color:#f39a0d}.skin-yellow-light .main-header li.user-header{background-color:#f39c12}.skin-yellow-light .content-header{background:transparent}.skin-yellow-light .wrapper,.skin-yellow-light .main-sidebar,.skin-yellow-light .left-side{background-color:#f9fafc}.skin-yellow-light .content-wrapper,.skin-yellow-light .main-footer{border-left:1px solid #d2d6de}.skin-yellow-light .user-panel>.info,.skin-yellow-light .user-panel>.info>a{color:#444}.skin-yellow-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-yellow-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-yellow-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-yellow-light .sidebar-menu>li:hover>a,.skin-yellow-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-yellow-light .sidebar-menu>li.active{border-left-color:#f39c12}.skin-yellow-light .sidebar-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-yellow-light .sidebar a{color:#444}.skin-yellow-light .sidebar a:hover{text-decoration:none}.skin-yellow-light .treeview-menu>li>a{color:#777}.skin-yellow-light .treeview-menu>li.active>a,.skin-yellow-light .treeview-menu>li>a:hover{color:#000}.skin-yellow-light .treeview-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-yellow-light .sidebar-form input[type="text"],.skin-yellow-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-yellow-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow-light .sidebar-form input[type="text"]:focus,.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-purple .main-header .navbar{background-color:#605ca8}.skin-purple .main-header .navbar .nav>li>a{color:#fff}.skin-purple .main-header .navbar .nav>li>a:hover,.skin-purple .main-header .navbar .nav>li>a:active,.skin-purple .main-header .navbar .nav>li>a:focus,.skin-purple .main-header .navbar .nav .open>a,.skin-purple .main-header .navbar .nav .open>a:hover,.skin-purple .main-header .navbar .nav .open>a:focus,.skin-purple .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple .main-header .logo{background-color:#555299;color:#fff;border-bottom:0 solid transparent}.skin-purple .main-header .logo:hover{background-color:#545096}.skin-purple .main-header li.user-header{background-color:#605ca8}.skin-purple .content-header{background:transparent}.skin-purple .wrapper,.skin-purple .main-sidebar,.skin-purple .left-side{background-color:#222d32}.skin-purple .user-panel>.info,.skin-purple .user-panel>.info>a{color:#fff}.skin-purple .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-purple .sidebar-menu>li>a{border-left:3px solid transparent}.skin-purple .sidebar-menu>li:hover>a,.skin-purple .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#605ca8}.skin-purple .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-purple .sidebar a{color:#b8c7ce}.skin-purple .sidebar a:hover{text-decoration:none}.skin-purple .treeview-menu>li>a{color:#8aa4af}.skin-purple .treeview-menu>li.active>a,.skin-purple .treeview-menu>li>a:hover{color:#fff}.skin-purple .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-purple .sidebar-form input[type="text"],.skin-purple .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-purple .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple .sidebar-form input[type="text"]:focus,.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-purple-light .main-header .navbar{background-color:#605ca8}.skin-purple-light .main-header .navbar .nav>li>a{color:#fff}.skin-purple-light .main-header .navbar .nav>li>a:hover,.skin-purple-light .main-header .navbar .nav>li>a:active,.skin-purple-light .main-header .navbar .nav>li>a:focus,.skin-purple-light .main-header .navbar .nav .open>a,.skin-purple-light .main-header .navbar .nav .open>a:hover,.skin-purple-light .main-header .navbar .nav .open>a:focus,.skin-purple-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple-light .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple-light .main-header .logo{background-color:#605ca8;color:#fff;border-bottom:0 solid transparent}.skin-purple-light .main-header .logo:hover{background-color:#5d59a6}.skin-purple-light .main-header li.user-header{background-color:#605ca8}.skin-purple-light .content-header{background:transparent}.skin-purple-light .wrapper,.skin-purple-light .main-sidebar,.skin-purple-light .left-side{background-color:#f9fafc}.skin-purple-light .content-wrapper,.skin-purple-light .main-footer{border-left:1px solid #d2d6de}.skin-purple-light .user-panel>.info,.skin-purple-light .user-panel>.info>a{color:#444}.skin-purple-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-purple-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-purple-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-purple-light .sidebar-menu>li:hover>a,.skin-purple-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-purple-light .sidebar-menu>li.active{border-left-color:#605ca8}.skin-purple-light .sidebar-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-purple-light .sidebar a{color:#444}.skin-purple-light .sidebar a:hover{text-decoration:none}.skin-purple-light .treeview-menu>li>a{color:#777}.skin-purple-light .treeview-menu>li.active>a,.skin-purple-light .treeview-menu>li>a:hover{color:#000}.skin-purple-light .treeview-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-purple-light .sidebar-form input[type="text"],.skin-purple-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-purple-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple-light .sidebar-form input[type="text"]:focus,.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/dist/css/skins/skin-black-light.css b/dist/css/skins/skin-black-light.css new file mode 100644 index 0000000..f132dc8 --- /dev/null +++ b/dist/css/skins/skin-black-light.css @@ -0,0 +1,176 @@ +/* + * Skin: Black + * ----------- + */ +/* skin-black navbar */ +.skin-black-light .main-header { + -webkit-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); +} +.skin-black-light .main-header .navbar-toggle { + color: #333; +} +.skin-black-light .main-header .navbar-brand { + color: #333; + border-right: 1px solid #eee; +} +.skin-black-light .main-header > .navbar { + background-color: #ffffff; +} +.skin-black-light .main-header > .navbar .nav > li > a { + color: #333333; +} +.skin-black-light .main-header > .navbar .nav > li > a:hover, +.skin-black-light .main-header > .navbar .nav > li > a:active, +.skin-black-light .main-header > .navbar .nav > li > a:focus, +.skin-black-light .main-header > .navbar .nav .open > a, +.skin-black-light .main-header > .navbar .nav .open > a:hover, +.skin-black-light .main-header > .navbar .nav .open > a:focus, +.skin-black-light .main-header > .navbar .nav > .active > a { + background: #ffffff; + color: #999999; +} +.skin-black-light .main-header > .navbar .sidebar-toggle { + color: #333333; +} +.skin-black-light .main-header > .navbar .sidebar-toggle:hover { + color: #999999; + background: #ffffff; +} +.skin-black-light .main-header > .navbar > .sidebar-toggle { + color: #333; + border-right: 1px solid #eee; +} +.skin-black-light .main-header > .navbar .navbar-nav > li > a { + border-right: 1px solid #eee; +} +.skin-black-light .main-header > .navbar .navbar-custom-menu .navbar-nav > li > a, +.skin-black-light .main-header > .navbar .navbar-right > li > a { + border-left: 1px solid #eee; + border-right-width: 0; +} +.skin-black-light .main-header > .logo { + background-color: #ffffff; + color: #333333; + border-bottom: 0 solid transparent; + border-right: 1px solid #eee; +} +.skin-black-light .main-header > .logo:hover { + background-color: #fcfcfc; +} +@media (max-width: 767px) { + .skin-black-light .main-header > .logo { + background-color: #222222; + color: #ffffff; + border-bottom: 0 solid transparent; + border-right: none; + } + .skin-black-light .main-header > .logo:hover { + background-color: #1f1f1f; + } +} +.skin-black-light .main-header li.user-header { + background-color: #222; +} +.skin-black-light .content-header { + background: transparent; + box-shadow: none; +} +.skin-black-light .wrapper, +.skin-black-light .main-sidebar, +.skin-black-light .left-side { + background-color: #f9fafc; +} +.skin-black-light .content-wrapper, +.skin-black-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-black-light .user-panel > .info, +.skin-black-light .user-panel > .info > a { + color: #444444; +} +.skin-black-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-black-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-black-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-black-light .sidebar-menu > li:hover > a, +.skin-black-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-black-light .sidebar-menu > li.active { + border-left-color: #ffffff; +} +.skin-black-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-black-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-black-light .sidebar a { + color: #444444; +} +.skin-black-light .sidebar a:hover { + text-decoration: none; +} +.skin-black-light .treeview-menu > li > a { + color: #777777; +} +.skin-black-light .treeview-menu > li.active > a, +.skin-black-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-black-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-black-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-black-light .sidebar-form input[type="text"], +.skin-black-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-black-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-black-light .sidebar-form input[type="text"]:focus, +.skin-black-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-black-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-black-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} diff --git a/dist/css/skins/skin-black-light.min.css b/dist/css/skins/skin-black-light.min.css new file mode 100644 index 0000000..c631ec5 --- /dev/null +++ b/dist/css/skins/skin-black-light.min.css @@ -0,0 +1 @@ +.skin-black-light .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.skin-black-light .main-header .navbar-toggle{color:#333}.skin-black-light .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black-light .main-header>.navbar{background-color:#fff}.skin-black-light .main-header>.navbar .nav>li>a{color:#333}.skin-black-light .main-header>.navbar .nav>li>a:hover,.skin-black-light .main-header>.navbar .nav>li>a:active,.skin-black-light .main-header>.navbar .nav>li>a:focus,.skin-black-light .main-header>.navbar .nav .open>a,.skin-black-light .main-header>.navbar .nav .open>a:hover,.skin-black-light .main-header>.navbar .nav .open>a:focus,.skin-black-light .main-header>.navbar .nav>.active>a{background:#fff;color:#999}.skin-black-light .main-header>.navbar .sidebar-toggle{color:#333}.skin-black-light .main-header>.navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black-light .main-header>.navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black-light .main-header>.navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black-light .main-header>.navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black-light .main-header>.navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black-light .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black-light .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black-light .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black-light .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black-light .main-header li.user-header{background-color:#222}.skin-black-light .content-header{background:transparent;box-shadow:none}.skin-black-light .wrapper,.skin-black-light .main-sidebar,.skin-black-light .left-side{background-color:#f9fafc}.skin-black-light .content-wrapper,.skin-black-light .main-footer{border-left:1px solid #d2d6de}.skin-black-light .user-panel>.info,.skin-black-light .user-panel>.info>a{color:#444}.skin-black-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-black-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-black-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-black-light .sidebar-menu>li:hover>a,.skin-black-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-black-light .sidebar-menu>li.active{border-left-color:#fff}.skin-black-light .sidebar-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-black-light .sidebar a{color:#444}.skin-black-light .sidebar a:hover{text-decoration:none}.skin-black-light .treeview-menu>li>a{color:#777}.skin-black-light .treeview-menu>li.active>a,.skin-black-light .treeview-menu>li>a:hover{color:#000}.skin-black-light .treeview-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-black-light .sidebar-form input[type="text"],.skin-black-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-black-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black-light .sidebar-form input[type="text"]:focus,.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/dist/css/skins/skin-black.css b/dist/css/skins/skin-black.css new file mode 100644 index 0000000..d33b1f9 --- /dev/null +++ b/dist/css/skins/skin-black.css @@ -0,0 +1,154 @@ +/* + * Skin: Black + * ----------- + */ +/* skin-black navbar */ +.skin-black .main-header { + -webkit-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); +} +.skin-black .main-header .navbar-toggle { + color: #333; +} +.skin-black .main-header .navbar-brand { + color: #333; + border-right: 1px solid #eee; +} +.skin-black .main-header > .navbar { + background-color: #ffffff; +} +.skin-black .main-header > .navbar .nav > li > a { + color: #333333; +} +.skin-black .main-header > .navbar .nav > li > a:hover, +.skin-black .main-header > .navbar .nav > li > a:active, +.skin-black .main-header > .navbar .nav > li > a:focus, +.skin-black .main-header > .navbar .nav .open > a, +.skin-black .main-header > .navbar .nav .open > a:hover, +.skin-black .main-header > .navbar .nav .open > a:focus, +.skin-black .main-header > .navbar .nav > .active > a { + background: #ffffff; + color: #999999; +} +.skin-black .main-header > .navbar .sidebar-toggle { + color: #333333; +} +.skin-black .main-header > .navbar .sidebar-toggle:hover { + color: #999999; + background: #ffffff; +} +.skin-black .main-header > .navbar > .sidebar-toggle { + color: #333; + border-right: 1px solid #eee; +} +.skin-black .main-header > .navbar .navbar-nav > li > a { + border-right: 1px solid #eee; +} +.skin-black .main-header > .navbar .navbar-custom-menu .navbar-nav > li > a, +.skin-black .main-header > .navbar .navbar-right > li > a { + border-left: 1px solid #eee; + border-right-width: 0; +} +.skin-black .main-header > .logo { + background-color: #ffffff; + color: #333333; + border-bottom: 0 solid transparent; + border-right: 1px solid #eee; +} +.skin-black .main-header > .logo:hover { + background-color: #fcfcfc; +} +@media (max-width: 767px) { + .skin-black .main-header > .logo { + background-color: #222222; + color: #ffffff; + border-bottom: 0 solid transparent; + border-right: none; + } + .skin-black .main-header > .logo:hover { + background-color: #1f1f1f; + } +} +.skin-black .main-header li.user-header { + background-color: #222; +} +.skin-black .content-header { + background: transparent; + box-shadow: none; +} +.skin-black .wrapper, +.skin-black .main-sidebar, +.skin-black .left-side { + background-color: #222d32; +} +.skin-black .user-panel > .info, +.skin-black .user-panel > .info > a { + color: #fff; +} +.skin-black .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-black .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-black .sidebar-menu > li:hover > a, +.skin-black .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #ffffff; +} +.skin-black .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-black .sidebar a { + color: #b8c7ce; +} +.skin-black .sidebar a:hover { + text-decoration: none; +} +.skin-black .treeview-menu > li > a { + color: #8aa4af; +} +.skin-black .treeview-menu > li.active > a, +.skin-black .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-black .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-black .sidebar-form input[type="text"], +.skin-black .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-black .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-black .sidebar-form input[type="text"]:focus, +.skin-black .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-black .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-black .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} diff --git a/dist/css/skins/skin-black.min.css b/dist/css/skins/skin-black.min.css new file mode 100644 index 0000000..a7d1888 --- /dev/null +++ b/dist/css/skins/skin-black.min.css @@ -0,0 +1 @@ +.skin-black .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.skin-black .main-header .navbar-toggle{color:#333}.skin-black .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black .main-header>.navbar{background-color:#fff}.skin-black .main-header>.navbar .nav>li>a{color:#333}.skin-black .main-header>.navbar .nav>li>a:hover,.skin-black .main-header>.navbar .nav>li>a:active,.skin-black .main-header>.navbar .nav>li>a:focus,.skin-black .main-header>.navbar .nav .open>a,.skin-black .main-header>.navbar .nav .open>a:hover,.skin-black .main-header>.navbar .nav .open>a:focus,.skin-black .main-header>.navbar .nav>.active>a{background:#fff;color:#999}.skin-black .main-header>.navbar .sidebar-toggle{color:#333}.skin-black .main-header>.navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black .main-header>.navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black .main-header>.navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black .main-header>.navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black .main-header>.navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black .main-header li.user-header{background-color:#222}.skin-black .content-header{background:transparent;box-shadow:none}.skin-black .wrapper,.skin-black .main-sidebar,.skin-black .left-side{background-color:#222d32}.skin-black .user-panel>.info,.skin-black .user-panel>.info>a{color:#fff}.skin-black .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-black .sidebar-menu>li>a{border-left:3px solid transparent}.skin-black .sidebar-menu>li:hover>a,.skin-black .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#fff}.skin-black .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-black .sidebar a{color:#b8c7ce}.skin-black .sidebar a:hover{text-decoration:none}.skin-black .treeview-menu>li>a{color:#8aa4af}.skin-black .treeview-menu>li.active>a,.skin-black .treeview-menu>li>a:hover{color:#fff}.skin-black .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-black .sidebar-form input[type="text"],.skin-black .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-black .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black .sidebar-form input[type="text"]:focus,.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0} \ No newline at end of file diff --git a/dist/css/skins/skin-blue-light.css b/dist/css/skins/skin-blue-light.css new file mode 100644 index 0000000..7614d60 --- /dev/null +++ b/dist/css/skins/skin-blue-light.css @@ -0,0 +1,167 @@ +/* + * Skin: Blue + * ---------- + */ +.skin-blue-light .main-header .navbar { + background-color: #3c8dbc; +} +.skin-blue-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-blue-light .main-header .navbar .nav > li > a:hover, +.skin-blue-light .main-header .navbar .nav > li > a:active, +.skin-blue-light .main-header .navbar .nav > li > a:focus, +.skin-blue-light .main-header .navbar .nav .open > a, +.skin-blue-light .main-header .navbar .nav .open > a:hover, +.skin-blue-light .main-header .navbar .nav .open > a:focus, +.skin-blue-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-blue-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-blue-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-blue-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-blue-light .main-header .navbar .sidebar-toggle:hover { + background-color: #367fa9; +} +@media (max-width: 767px) { + .skin-blue-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-blue-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-blue-light .main-header .navbar .dropdown-menu li a:hover { + background: #367fa9; + } +} +.skin-blue-light .main-header .logo { + background-color: #3c8dbc; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue-light .main-header .logo:hover { + background-color: #3b8ab8; +} +.skin-blue-light .main-header li.user-header { + background-color: #3c8dbc; +} +.skin-blue-light .content-header { + background: transparent; +} +.skin-blue-light .wrapper, +.skin-blue-light .main-sidebar, +.skin-blue-light .left-side { + background-color: #f9fafc; +} +.skin-blue-light .content-wrapper, +.skin-blue-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-blue-light .user-panel > .info, +.skin-blue-light .user-panel > .info > a { + color: #444444; +} +.skin-blue-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-blue-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-blue-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-blue-light .sidebar-menu > li:hover > a, +.skin-blue-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-blue-light .sidebar-menu > li.active { + border-left-color: #3c8dbc; +} +.skin-blue-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-blue-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-blue-light .sidebar a { + color: #444444; +} +.skin-blue-light .sidebar a:hover { + text-decoration: none; +} +.skin-blue-light .treeview-menu > li > a { + color: #777777; +} +.skin-blue-light .treeview-menu > li.active > a, +.skin-blue-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-blue-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-blue-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-blue-light .sidebar-form input[type="text"], +.skin-blue-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-blue-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-blue-light .sidebar-form input[type="text"]:focus, +.skin-blue-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-blue-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-blue-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} +.skin-blue-light .main-footer { + border-top-color: #d2d6de; +} +.skin-blue.layout-top-nav .main-header > .logo { + background-color: #3c8dbc; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue.layout-top-nav .main-header > .logo:hover { + background-color: #3b8ab8; +} diff --git a/dist/css/skins/skin-blue-light.min.css b/dist/css/skins/skin-blue-light.min.css new file mode 100644 index 0000000..4fab22a --- /dev/null +++ b/dist/css/skins/skin-blue-light.min.css @@ -0,0 +1 @@ +.skin-blue-light .main-header .navbar{background-color:#3c8dbc}.skin-blue-light .main-header .navbar .nav>li>a{color:#fff}.skin-blue-light .main-header .navbar .nav>li>a:hover,.skin-blue-light .main-header .navbar .nav>li>a:active,.skin-blue-light .main-header .navbar .nav>li>a:focus,.skin-blue-light .main-header .navbar .nav .open>a,.skin-blue-light .main-header .navbar .nav .open>a:hover,.skin-blue-light .main-header .navbar .nav .open>a:focus,.skin-blue-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue-light .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue-light .main-header .logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue-light .main-header .logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header li.user-header{background-color:#3c8dbc}.skin-blue-light .content-header{background:transparent}.skin-blue-light .wrapper,.skin-blue-light .main-sidebar,.skin-blue-light .left-side{background-color:#f9fafc}.skin-blue-light .content-wrapper,.skin-blue-light .main-footer{border-left:1px solid #d2d6de}.skin-blue-light .user-panel>.info,.skin-blue-light .user-panel>.info>a{color:#444}.skin-blue-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-blue-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-blue-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-blue-light .sidebar-menu>li:hover>a,.skin-blue-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-blue-light .sidebar-menu>li.active{border-left-color:#3c8dbc}.skin-blue-light .sidebar-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-blue-light .sidebar a{color:#444}.skin-blue-light .sidebar a:hover{text-decoration:none}.skin-blue-light .treeview-menu>li>a{color:#777}.skin-blue-light .treeview-menu>li.active>a,.skin-blue-light .treeview-menu>li>a:hover{color:#000}.skin-blue-light .treeview-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-blue-light .sidebar-form input[type="text"],.skin-blue-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-blue-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue-light .sidebar-form input[type="text"]:focus,.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-blue-light .main-footer{border-top-color:#d2d6de}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8} \ No newline at end of file diff --git a/dist/css/skins/skin-blue.css b/dist/css/skins/skin-blue.css new file mode 100644 index 0000000..1bc543f --- /dev/null +++ b/dist/css/skins/skin-blue.css @@ -0,0 +1,142 @@ +/* + * Skin: Blue + * ---------- + */ +.skin-blue .main-header .navbar { + background-color: #3c8dbc; +} +.skin-blue .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-blue .main-header .navbar .nav > li > a:hover, +.skin-blue .main-header .navbar .nav > li > a:active, +.skin-blue .main-header .navbar .nav > li > a:focus, +.skin-blue .main-header .navbar .nav .open > a, +.skin-blue .main-header .navbar .nav .open > a:hover, +.skin-blue .main-header .navbar .nav .open > a:focus, +.skin-blue .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-blue .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-blue .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-blue .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-blue .main-header .navbar .sidebar-toggle:hover { + background-color: #367fa9; +} +@media (max-width: 767px) { + .skin-blue .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-blue .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-blue .main-header .navbar .dropdown-menu li a:hover { + background: #367fa9; + } +} +.skin-blue .main-header .logo { + background-color: #367fa9; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue .main-header .logo:hover { + background-color: #357ca5; +} +.skin-blue .main-header li.user-header { + background-color: #3c8dbc; +} +.skin-blue .content-header { + background: transparent; +} +.skin-blue .wrapper, +.skin-blue .main-sidebar, +.skin-blue .left-side { + background-color: #222d32; +} +.skin-blue .user-panel > .info, +.skin-blue .user-panel > .info > a { + color: #fff; +} +.skin-blue .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-blue .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-blue .sidebar-menu > li:hover > a, +.skin-blue .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #3c8dbc; +} +.skin-blue .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-blue .sidebar a { + color: #b8c7ce; +} +.skin-blue .sidebar a:hover { + text-decoration: none; +} +.skin-blue .treeview-menu > li > a { + color: #8aa4af; +} +.skin-blue .treeview-menu > li.active > a, +.skin-blue .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-blue .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-blue .sidebar-form input[type="text"], +.skin-blue .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-blue .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-blue .sidebar-form input[type="text"]:focus, +.skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-blue .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +.skin-blue.layout-top-nav .main-header > .logo { + background-color: #3c8dbc; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue.layout-top-nav .main-header > .logo:hover { + background-color: #3b8ab8; +} diff --git a/dist/css/skins/skin-blue.min.css b/dist/css/skins/skin-blue.min.css new file mode 100644 index 0000000..123c04f --- /dev/null +++ b/dist/css/skins/skin-blue.min.css @@ -0,0 +1 @@ +.skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav>li>a:hover,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent}.skin-blue .main-header .logo:hover{background-color:#357ca5}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:transparent}.skin-blue .wrapper,.skin-blue .main-sidebar,.skin-blue .left-side{background-color:#222d32}.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li:hover>a,.skin-blue .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .sidebar a:hover{text-decoration:none}.skin-blue .treeview-menu>li>a{color:#8aa4af}.skin-blue .treeview-menu>li.active>a,.skin-blue .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-blue .sidebar-form input[type="text"],.skin-blue .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-blue .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue .sidebar-form input[type="text"]:focus,.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8} \ No newline at end of file diff --git a/dist/css/skins/skin-green-light.css b/dist/css/skins/skin-green-light.css new file mode 100644 index 0000000..f6fc137 --- /dev/null +++ b/dist/css/skins/skin-green-light.css @@ -0,0 +1,156 @@ +/* + * Skin: Green + * ----------- + */ +.skin-green-light .main-header .navbar { + background-color: #00a65a; +} +.skin-green-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-green-light .main-header .navbar .nav > li > a:hover, +.skin-green-light .main-header .navbar .nav > li > a:active, +.skin-green-light .main-header .navbar .nav > li > a:focus, +.skin-green-light .main-header .navbar .nav .open > a, +.skin-green-light .main-header .navbar .nav .open > a:hover, +.skin-green-light .main-header .navbar .nav .open > a:focus, +.skin-green-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-green-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-green-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-green-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-green-light .main-header .navbar .sidebar-toggle:hover { + background-color: #008d4c; +} +@media (max-width: 767px) { + .skin-green-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-green-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-green-light .main-header .navbar .dropdown-menu li a:hover { + background: #008d4c; + } +} +.skin-green-light .main-header .logo { + background-color: #00a65a; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-green-light .main-header .logo:hover { + background-color: #00a157; +} +.skin-green-light .main-header li.user-header { + background-color: #00a65a; +} +.skin-green-light .content-header { + background: transparent; +} +.skin-green-light .wrapper, +.skin-green-light .main-sidebar, +.skin-green-light .left-side { + background-color: #f9fafc; +} +.skin-green-light .content-wrapper, +.skin-green-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-green-light .user-panel > .info, +.skin-green-light .user-panel > .info > a { + color: #444444; +} +.skin-green-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-green-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-green-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-green-light .sidebar-menu > li:hover > a, +.skin-green-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-green-light .sidebar-menu > li.active { + border-left-color: #00a65a; +} +.skin-green-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-green-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-green-light .sidebar a { + color: #444444; +} +.skin-green-light .sidebar a:hover { + text-decoration: none; +} +.skin-green-light .treeview-menu > li > a { + color: #777777; +} +.skin-green-light .treeview-menu > li.active > a, +.skin-green-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-green-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-green-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-green-light .sidebar-form input[type="text"], +.skin-green-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-green-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-green-light .sidebar-form input[type="text"]:focus, +.skin-green-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-green-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-green-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} diff --git a/dist/css/skins/skin-green-light.min.css b/dist/css/skins/skin-green-light.min.css new file mode 100644 index 0000000..43ceea4 --- /dev/null +++ b/dist/css/skins/skin-green-light.min.css @@ -0,0 +1 @@ +.skin-green-light .main-header .navbar{background-color:#00a65a}.skin-green-light .main-header .navbar .nav>li>a{color:#fff}.skin-green-light .main-header .navbar .nav>li>a:hover,.skin-green-light .main-header .navbar .nav>li>a:active,.skin-green-light .main-header .navbar .nav>li>a:focus,.skin-green-light .main-header .navbar .nav .open>a,.skin-green-light .main-header .navbar .nav .open>a:hover,.skin-green-light .main-header .navbar .nav .open>a:focus,.skin-green-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green-light .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green-light .main-header .logo{background-color:#00a65a;color:#fff;border-bottom:0 solid transparent}.skin-green-light .main-header .logo:hover{background-color:#00a157}.skin-green-light .main-header li.user-header{background-color:#00a65a}.skin-green-light .content-header{background:transparent}.skin-green-light .wrapper,.skin-green-light .main-sidebar,.skin-green-light .left-side{background-color:#f9fafc}.skin-green-light .content-wrapper,.skin-green-light .main-footer{border-left:1px solid #d2d6de}.skin-green-light .user-panel>.info,.skin-green-light .user-panel>.info>a{color:#444}.skin-green-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-green-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-green-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-green-light .sidebar-menu>li:hover>a,.skin-green-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-green-light .sidebar-menu>li.active{border-left-color:#00a65a}.skin-green-light .sidebar-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-green-light .sidebar a{color:#444}.skin-green-light .sidebar a:hover{text-decoration:none}.skin-green-light .treeview-menu>li>a{color:#777}.skin-green-light .treeview-menu>li.active>a,.skin-green-light .treeview-menu>li>a:hover{color:#000}.skin-green-light .treeview-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-green-light .sidebar-form input[type="text"],.skin-green-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-green-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green-light .sidebar-form input[type="text"]:focus,.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/dist/css/skins/skin-green.css b/dist/css/skins/skin-green.css new file mode 100644 index 0000000..3562493 --- /dev/null +++ b/dist/css/skins/skin-green.css @@ -0,0 +1,134 @@ +/* + * Skin: Green + * ----------- + */ +.skin-green .main-header .navbar { + background-color: #00a65a; +} +.skin-green .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-green .main-header .navbar .nav > li > a:hover, +.skin-green .main-header .navbar .nav > li > a:active, +.skin-green .main-header .navbar .nav > li > a:focus, +.skin-green .main-header .navbar .nav .open > a, +.skin-green .main-header .navbar .nav .open > a:hover, +.skin-green .main-header .navbar .nav .open > a:focus, +.skin-green .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-green .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-green .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-green .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-green .main-header .navbar .sidebar-toggle:hover { + background-color: #008d4c; +} +@media (max-width: 767px) { + .skin-green .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-green .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-green .main-header .navbar .dropdown-menu li a:hover { + background: #008d4c; + } +} +.skin-green .main-header .logo { + background-color: #008d4c; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-green .main-header .logo:hover { + background-color: #008749; +} +.skin-green .main-header li.user-header { + background-color: #00a65a; +} +.skin-green .content-header { + background: transparent; +} +.skin-green .wrapper, +.skin-green .main-sidebar, +.skin-green .left-side { + background-color: #222d32; +} +.skin-green .user-panel > .info, +.skin-green .user-panel > .info > a { + color: #fff; +} +.skin-green .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-green .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-green .sidebar-menu > li:hover > a, +.skin-green .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #00a65a; +} +.skin-green .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-green .sidebar a { + color: #b8c7ce; +} +.skin-green .sidebar a:hover { + text-decoration: none; +} +.skin-green .treeview-menu > li > a { + color: #8aa4af; +} +.skin-green .treeview-menu > li.active > a, +.skin-green .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-green .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-green .sidebar-form input[type="text"], +.skin-green .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-green .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-green .sidebar-form input[type="text"]:focus, +.skin-green .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-green .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-green .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} diff --git a/dist/css/skins/skin-green.min.css b/dist/css/skins/skin-green.min.css new file mode 100644 index 0000000..8f885ed --- /dev/null +++ b/dist/css/skins/skin-green.min.css @@ -0,0 +1 @@ +.skin-green .main-header .navbar{background-color:#00a65a}.skin-green .main-header .navbar .nav>li>a{color:#fff}.skin-green .main-header .navbar .nav>li>a:hover,.skin-green .main-header .navbar .nav>li>a:active,.skin-green .main-header .navbar .nav>li>a:focus,.skin-green .main-header .navbar .nav .open>a,.skin-green .main-header .navbar .nav .open>a:hover,.skin-green .main-header .navbar .nav .open>a:focus,.skin-green .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green .main-header .logo{background-color:#008d4c;color:#fff;border-bottom:0 solid transparent}.skin-green .main-header .logo:hover{background-color:#008749}.skin-green .main-header li.user-header{background-color:#00a65a}.skin-green .content-header{background:transparent}.skin-green .wrapper,.skin-green .main-sidebar,.skin-green .left-side{background-color:#222d32}.skin-green .user-panel>.info,.skin-green .user-panel>.info>a{color:#fff}.skin-green .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-green .sidebar-menu>li>a{border-left:3px solid transparent}.skin-green .sidebar-menu>li:hover>a,.skin-green .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#00a65a}.skin-green .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-green .sidebar a{color:#b8c7ce}.skin-green .sidebar a:hover{text-decoration:none}.skin-green .treeview-menu>li>a{color:#8aa4af}.skin-green .treeview-menu>li.active>a,.skin-green .treeview-menu>li>a:hover{color:#fff}.skin-green .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-green .sidebar-form input[type="text"],.skin-green .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-green .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green .sidebar-form input[type="text"]:focus,.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0} \ No newline at end of file diff --git a/dist/css/skins/skin-purple-light.css b/dist/css/skins/skin-purple-light.css new file mode 100644 index 0000000..551eacb --- /dev/null +++ b/dist/css/skins/skin-purple-light.css @@ -0,0 +1,156 @@ +/* + * Skin: Purple + * ------------ + */ +.skin-purple-light .main-header .navbar { + background-color: #605ca8; +} +.skin-purple-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-purple-light .main-header .navbar .nav > li > a:hover, +.skin-purple-light .main-header .navbar .nav > li > a:active, +.skin-purple-light .main-header .navbar .nav > li > a:focus, +.skin-purple-light .main-header .navbar .nav .open > a, +.skin-purple-light .main-header .navbar .nav .open > a:hover, +.skin-purple-light .main-header .navbar .nav .open > a:focus, +.skin-purple-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-purple-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-purple-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-purple-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-purple-light .main-header .navbar .sidebar-toggle:hover { + background-color: #555299; +} +@media (max-width: 767px) { + .skin-purple-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-purple-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-purple-light .main-header .navbar .dropdown-menu li a:hover { + background: #555299; + } +} +.skin-purple-light .main-header .logo { + background-color: #605ca8; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-purple-light .main-header .logo:hover { + background-color: #5d59a6; +} +.skin-purple-light .main-header li.user-header { + background-color: #605ca8; +} +.skin-purple-light .content-header { + background: transparent; +} +.skin-purple-light .wrapper, +.skin-purple-light .main-sidebar, +.skin-purple-light .left-side { + background-color: #f9fafc; +} +.skin-purple-light .content-wrapper, +.skin-purple-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-purple-light .user-panel > .info, +.skin-purple-light .user-panel > .info > a { + color: #444444; +} +.skin-purple-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-purple-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-purple-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-purple-light .sidebar-menu > li:hover > a, +.skin-purple-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-purple-light .sidebar-menu > li.active { + border-left-color: #605ca8; +} +.skin-purple-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-purple-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-purple-light .sidebar a { + color: #444444; +} +.skin-purple-light .sidebar a:hover { + text-decoration: none; +} +.skin-purple-light .treeview-menu > li > a { + color: #777777; +} +.skin-purple-light .treeview-menu > li.active > a, +.skin-purple-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-purple-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-purple-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-purple-light .sidebar-form input[type="text"], +.skin-purple-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-purple-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-purple-light .sidebar-form input[type="text"]:focus, +.skin-purple-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-purple-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-purple-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} diff --git a/dist/css/skins/skin-purple-light.min.css b/dist/css/skins/skin-purple-light.min.css new file mode 100644 index 0000000..53333c4 --- /dev/null +++ b/dist/css/skins/skin-purple-light.min.css @@ -0,0 +1 @@ +.skin-purple-light .main-header .navbar{background-color:#605ca8}.skin-purple-light .main-header .navbar .nav>li>a{color:#fff}.skin-purple-light .main-header .navbar .nav>li>a:hover,.skin-purple-light .main-header .navbar .nav>li>a:active,.skin-purple-light .main-header .navbar .nav>li>a:focus,.skin-purple-light .main-header .navbar .nav .open>a,.skin-purple-light .main-header .navbar .nav .open>a:hover,.skin-purple-light .main-header .navbar .nav .open>a:focus,.skin-purple-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple-light .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple-light .main-header .logo{background-color:#605ca8;color:#fff;border-bottom:0 solid transparent}.skin-purple-light .main-header .logo:hover{background-color:#5d59a6}.skin-purple-light .main-header li.user-header{background-color:#605ca8}.skin-purple-light .content-header{background:transparent}.skin-purple-light .wrapper,.skin-purple-light .main-sidebar,.skin-purple-light .left-side{background-color:#f9fafc}.skin-purple-light .content-wrapper,.skin-purple-light .main-footer{border-left:1px solid #d2d6de}.skin-purple-light .user-panel>.info,.skin-purple-light .user-panel>.info>a{color:#444}.skin-purple-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-purple-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-purple-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-purple-light .sidebar-menu>li:hover>a,.skin-purple-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-purple-light .sidebar-menu>li.active{border-left-color:#605ca8}.skin-purple-light .sidebar-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-purple-light .sidebar a{color:#444}.skin-purple-light .sidebar a:hover{text-decoration:none}.skin-purple-light .treeview-menu>li>a{color:#777}.skin-purple-light .treeview-menu>li.active>a,.skin-purple-light .treeview-menu>li>a:hover{color:#000}.skin-purple-light .treeview-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-purple-light .sidebar-form input[type="text"],.skin-purple-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-purple-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple-light .sidebar-form input[type="text"]:focus,.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/dist/css/skins/skin-purple.css b/dist/css/skins/skin-purple.css new file mode 100644 index 0000000..b1d6c8a --- /dev/null +++ b/dist/css/skins/skin-purple.css @@ -0,0 +1,134 @@ +/* + * Skin: Purple + * ------------ + */ +.skin-purple .main-header .navbar { + background-color: #605ca8; +} +.skin-purple .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-purple .main-header .navbar .nav > li > a:hover, +.skin-purple .main-header .navbar .nav > li > a:active, +.skin-purple .main-header .navbar .nav > li > a:focus, +.skin-purple .main-header .navbar .nav .open > a, +.skin-purple .main-header .navbar .nav .open > a:hover, +.skin-purple .main-header .navbar .nav .open > a:focus, +.skin-purple .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-purple .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-purple .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-purple .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-purple .main-header .navbar .sidebar-toggle:hover { + background-color: #555299; +} +@media (max-width: 767px) { + .skin-purple .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-purple .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-purple .main-header .navbar .dropdown-menu li a:hover { + background: #555299; + } +} +.skin-purple .main-header .logo { + background-color: #555299; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-purple .main-header .logo:hover { + background-color: #545096; +} +.skin-purple .main-header li.user-header { + background-color: #605ca8; +} +.skin-purple .content-header { + background: transparent; +} +.skin-purple .wrapper, +.skin-purple .main-sidebar, +.skin-purple .left-side { + background-color: #222d32; +} +.skin-purple .user-panel > .info, +.skin-purple .user-panel > .info > a { + color: #fff; +} +.skin-purple .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-purple .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-purple .sidebar-menu > li:hover > a, +.skin-purple .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #605ca8; +} +.skin-purple .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-purple .sidebar a { + color: #b8c7ce; +} +.skin-purple .sidebar a:hover { + text-decoration: none; +} +.skin-purple .treeview-menu > li > a { + color: #8aa4af; +} +.skin-purple .treeview-menu > li.active > a, +.skin-purple .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-purple .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-purple .sidebar-form input[type="text"], +.skin-purple .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-purple .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-purple .sidebar-form input[type="text"]:focus, +.skin-purple .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-purple .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-purple .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} diff --git a/dist/css/skins/skin-purple.min.css b/dist/css/skins/skin-purple.min.css new file mode 100644 index 0000000..1eff3d9 --- /dev/null +++ b/dist/css/skins/skin-purple.min.css @@ -0,0 +1 @@ +.skin-purple .main-header .navbar{background-color:#605ca8}.skin-purple .main-header .navbar .nav>li>a{color:#fff}.skin-purple .main-header .navbar .nav>li>a:hover,.skin-purple .main-header .navbar .nav>li>a:active,.skin-purple .main-header .navbar .nav>li>a:focus,.skin-purple .main-header .navbar .nav .open>a,.skin-purple .main-header .navbar .nav .open>a:hover,.skin-purple .main-header .navbar .nav .open>a:focus,.skin-purple .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple .main-header .logo{background-color:#555299;color:#fff;border-bottom:0 solid transparent}.skin-purple .main-header .logo:hover{background-color:#545096}.skin-purple .main-header li.user-header{background-color:#605ca8}.skin-purple .content-header{background:transparent}.skin-purple .wrapper,.skin-purple .main-sidebar,.skin-purple .left-side{background-color:#222d32}.skin-purple .user-panel>.info,.skin-purple .user-panel>.info>a{color:#fff}.skin-purple .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-purple .sidebar-menu>li>a{border-left:3px solid transparent}.skin-purple .sidebar-menu>li:hover>a,.skin-purple .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#605ca8}.skin-purple .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-purple .sidebar a{color:#b8c7ce}.skin-purple .sidebar a:hover{text-decoration:none}.skin-purple .treeview-menu>li>a{color:#8aa4af}.skin-purple .treeview-menu>li.active>a,.skin-purple .treeview-menu>li>a:hover{color:#fff}.skin-purple .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-purple .sidebar-form input[type="text"],.skin-purple .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-purple .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple .sidebar-form input[type="text"]:focus,.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0} \ No newline at end of file diff --git a/dist/css/skins/skin-red-light.css b/dist/css/skins/skin-red-light.css new file mode 100644 index 0000000..4ba687f --- /dev/null +++ b/dist/css/skins/skin-red-light.css @@ -0,0 +1,156 @@ +/* + * Skin: Red + * --------- + */ +.skin-red-light .main-header .navbar { + background-color: #dd4b39; +} +.skin-red-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-red-light .main-header .navbar .nav > li > a:hover, +.skin-red-light .main-header .navbar .nav > li > a:active, +.skin-red-light .main-header .navbar .nav > li > a:focus, +.skin-red-light .main-header .navbar .nav .open > a, +.skin-red-light .main-header .navbar .nav .open > a:hover, +.skin-red-light .main-header .navbar .nav .open > a:focus, +.skin-red-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-red-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-red-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-red-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-red-light .main-header .navbar .sidebar-toggle:hover { + background-color: #d73925; +} +@media (max-width: 767px) { + .skin-red-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-red-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-red-light .main-header .navbar .dropdown-menu li a:hover { + background: #d73925; + } +} +.skin-red-light .main-header .logo { + background-color: #dd4b39; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-red-light .main-header .logo:hover { + background-color: #dc4735; +} +.skin-red-light .main-header li.user-header { + background-color: #dd4b39; +} +.skin-red-light .content-header { + background: transparent; +} +.skin-red-light .wrapper, +.skin-red-light .main-sidebar, +.skin-red-light .left-side { + background-color: #f9fafc; +} +.skin-red-light .content-wrapper, +.skin-red-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-red-light .user-panel > .info, +.skin-red-light .user-panel > .info > a { + color: #444444; +} +.skin-red-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-red-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-red-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-red-light .sidebar-menu > li:hover > a, +.skin-red-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-red-light .sidebar-menu > li.active { + border-left-color: #dd4b39; +} +.skin-red-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-red-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-red-light .sidebar a { + color: #444444; +} +.skin-red-light .sidebar a:hover { + text-decoration: none; +} +.skin-red-light .treeview-menu > li > a { + color: #777777; +} +.skin-red-light .treeview-menu > li.active > a, +.skin-red-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-red-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-red-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-red-light .sidebar-form input[type="text"], +.skin-red-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-red-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-red-light .sidebar-form input[type="text"]:focus, +.skin-red-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-red-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-red-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} diff --git a/dist/css/skins/skin-red-light.min.css b/dist/css/skins/skin-red-light.min.css new file mode 100644 index 0000000..7ab4c1f --- /dev/null +++ b/dist/css/skins/skin-red-light.min.css @@ -0,0 +1 @@ +.skin-red-light .main-header .navbar{background-color:#dd4b39}.skin-red-light .main-header .navbar .nav>li>a{color:#fff}.skin-red-light .main-header .navbar .nav>li>a:hover,.skin-red-light .main-header .navbar .nav>li>a:active,.skin-red-light .main-header .navbar .nav>li>a:focus,.skin-red-light .main-header .navbar .nav .open>a,.skin-red-light .main-header .navbar .nav .open>a:hover,.skin-red-light .main-header .navbar .nav .open>a:focus,.skin-red-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red-light .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red-light .main-header .logo{background-color:#dd4b39;color:#fff;border-bottom:0 solid transparent}.skin-red-light .main-header .logo:hover{background-color:#dc4735}.skin-red-light .main-header li.user-header{background-color:#dd4b39}.skin-red-light .content-header{background:transparent}.skin-red-light .wrapper,.skin-red-light .main-sidebar,.skin-red-light .left-side{background-color:#f9fafc}.skin-red-light .content-wrapper,.skin-red-light .main-footer{border-left:1px solid #d2d6de}.skin-red-light .user-panel>.info,.skin-red-light .user-panel>.info>a{color:#444}.skin-red-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-red-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-red-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-red-light .sidebar-menu>li:hover>a,.skin-red-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-red-light .sidebar-menu>li.active{border-left-color:#dd4b39}.skin-red-light .sidebar-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-red-light .sidebar a{color:#444}.skin-red-light .sidebar a:hover{text-decoration:none}.skin-red-light .treeview-menu>li>a{color:#777}.skin-red-light .treeview-menu>li.active>a,.skin-red-light .treeview-menu>li>a:hover{color:#000}.skin-red-light .treeview-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-red-light .sidebar-form input[type="text"],.skin-red-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-red-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red-light .sidebar-form input[type="text"]:focus,.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/dist/css/skins/skin-red.css b/dist/css/skins/skin-red.css new file mode 100644 index 0000000..6071511 --- /dev/null +++ b/dist/css/skins/skin-red.css @@ -0,0 +1,134 @@ +/* + * Skin: Red + * --------- + */ +.skin-red .main-header .navbar { + background-color: #dd4b39; +} +.skin-red .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-red .main-header .navbar .nav > li > a:hover, +.skin-red .main-header .navbar .nav > li > a:active, +.skin-red .main-header .navbar .nav > li > a:focus, +.skin-red .main-header .navbar .nav .open > a, +.skin-red .main-header .navbar .nav .open > a:hover, +.skin-red .main-header .navbar .nav .open > a:focus, +.skin-red .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-red .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-red .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-red .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-red .main-header .navbar .sidebar-toggle:hover { + background-color: #d73925; +} +@media (max-width: 767px) { + .skin-red .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-red .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-red .main-header .navbar .dropdown-menu li a:hover { + background: #d73925; + } +} +.skin-red .main-header .logo { + background-color: #d73925; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-red .main-header .logo:hover { + background-color: #d33724; +} +.skin-red .main-header li.user-header { + background-color: #dd4b39; +} +.skin-red .content-header { + background: transparent; +} +.skin-red .wrapper, +.skin-red .main-sidebar, +.skin-red .left-side { + background-color: #222d32; +} +.skin-red .user-panel > .info, +.skin-red .user-panel > .info > a { + color: #fff; +} +.skin-red .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-red .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-red .sidebar-menu > li:hover > a, +.skin-red .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #dd4b39; +} +.skin-red .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-red .sidebar a { + color: #b8c7ce; +} +.skin-red .sidebar a:hover { + text-decoration: none; +} +.skin-red .treeview-menu > li > a { + color: #8aa4af; +} +.skin-red .treeview-menu > li.active > a, +.skin-red .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-red .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-red .sidebar-form input[type="text"], +.skin-red .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-red .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-red .sidebar-form input[type="text"]:focus, +.skin-red .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-red .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-red .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} diff --git a/dist/css/skins/skin-red.min.css b/dist/css/skins/skin-red.min.css new file mode 100644 index 0000000..3252b27 --- /dev/null +++ b/dist/css/skins/skin-red.min.css @@ -0,0 +1 @@ +.skin-red .main-header .navbar{background-color:#dd4b39}.skin-red .main-header .navbar .nav>li>a{color:#fff}.skin-red .main-header .navbar .nav>li>a:hover,.skin-red .main-header .navbar .nav>li>a:active,.skin-red .main-header .navbar .nav>li>a:focus,.skin-red .main-header .navbar .nav .open>a,.skin-red .main-header .navbar .nav .open>a:hover,.skin-red .main-header .navbar .nav .open>a:focus,.skin-red .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red .main-header .logo{background-color:#d73925;color:#fff;border-bottom:0 solid transparent}.skin-red .main-header .logo:hover{background-color:#d33724}.skin-red .main-header li.user-header{background-color:#dd4b39}.skin-red .content-header{background:transparent}.skin-red .wrapper,.skin-red .main-sidebar,.skin-red .left-side{background-color:#222d32}.skin-red .user-panel>.info,.skin-red .user-panel>.info>a{color:#fff}.skin-red .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-red .sidebar-menu>li>a{border-left:3px solid transparent}.skin-red .sidebar-menu>li:hover>a,.skin-red .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#dd4b39}.skin-red .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-red .sidebar a{color:#b8c7ce}.skin-red .sidebar a:hover{text-decoration:none}.skin-red .treeview-menu>li>a{color:#8aa4af}.skin-red .treeview-menu>li.active>a,.skin-red .treeview-menu>li>a:hover{color:#fff}.skin-red .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-red .sidebar-form input[type="text"],.skin-red .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-red .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red .sidebar-form input[type="text"]:focus,.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0} \ No newline at end of file diff --git a/dist/css/skins/skin-yellow-light.css b/dist/css/skins/skin-yellow-light.css new file mode 100644 index 0000000..1c977d4 --- /dev/null +++ b/dist/css/skins/skin-yellow-light.css @@ -0,0 +1,156 @@ +/* + * Skin: Yellow + * ------------ + */ +.skin-yellow-light .main-header .navbar { + background-color: #f39c12; +} +.skin-yellow-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-yellow-light .main-header .navbar .nav > li > a:hover, +.skin-yellow-light .main-header .navbar .nav > li > a:active, +.skin-yellow-light .main-header .navbar .nav > li > a:focus, +.skin-yellow-light .main-header .navbar .nav .open > a, +.skin-yellow-light .main-header .navbar .nav .open > a:hover, +.skin-yellow-light .main-header .navbar .nav .open > a:focus, +.skin-yellow-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-yellow-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-yellow-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-yellow-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-yellow-light .main-header .navbar .sidebar-toggle:hover { + background-color: #e08e0b; +} +@media (max-width: 767px) { + .skin-yellow-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-yellow-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-yellow-light .main-header .navbar .dropdown-menu li a:hover { + background: #e08e0b; + } +} +.skin-yellow-light .main-header .logo { + background-color: #f39c12; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-yellow-light .main-header .logo:hover { + background-color: #f39a0d; +} +.skin-yellow-light .main-header li.user-header { + background-color: #f39c12; +} +.skin-yellow-light .content-header { + background: transparent; +} +.skin-yellow-light .wrapper, +.skin-yellow-light .main-sidebar, +.skin-yellow-light .left-side { + background-color: #f9fafc; +} +.skin-yellow-light .content-wrapper, +.skin-yellow-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-yellow-light .user-panel > .info, +.skin-yellow-light .user-panel > .info > a { + color: #444444; +} +.skin-yellow-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-yellow-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-yellow-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-yellow-light .sidebar-menu > li:hover > a, +.skin-yellow-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-yellow-light .sidebar-menu > li.active { + border-left-color: #f39c12; +} +.skin-yellow-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-yellow-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-yellow-light .sidebar a { + color: #444444; +} +.skin-yellow-light .sidebar a:hover { + text-decoration: none; +} +.skin-yellow-light .treeview-menu > li > a { + color: #777777; +} +.skin-yellow-light .treeview-menu > li.active > a, +.skin-yellow-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-yellow-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-yellow-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-yellow-light .sidebar-form input[type="text"], +.skin-yellow-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-yellow-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-yellow-light .sidebar-form input[type="text"]:focus, +.skin-yellow-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-yellow-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-yellow-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} diff --git a/dist/css/skins/skin-yellow-light.min.css b/dist/css/skins/skin-yellow-light.min.css new file mode 100644 index 0000000..773b254 --- /dev/null +++ b/dist/css/skins/skin-yellow-light.min.css @@ -0,0 +1 @@ +.skin-yellow-light .main-header .navbar{background-color:#f39c12}.skin-yellow-light .main-header .navbar .nav>li>a{color:#fff}.skin-yellow-light .main-header .navbar .nav>li>a:hover,.skin-yellow-light .main-header .navbar .nav>li>a:active,.skin-yellow-light .main-header .navbar .nav>li>a:focus,.skin-yellow-light .main-header .navbar .nav .open>a,.skin-yellow-light .main-header .navbar .nav .open>a:hover,.skin-yellow-light .main-header .navbar .nav .open>a:focus,.skin-yellow-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow-light .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow-light .main-header .logo{background-color:#f39c12;color:#fff;border-bottom:0 solid transparent}.skin-yellow-light .main-header .logo:hover{background-color:#f39a0d}.skin-yellow-light .main-header li.user-header{background-color:#f39c12}.skin-yellow-light .content-header{background:transparent}.skin-yellow-light .wrapper,.skin-yellow-light .main-sidebar,.skin-yellow-light .left-side{background-color:#f9fafc}.skin-yellow-light .content-wrapper,.skin-yellow-light .main-footer{border-left:1px solid #d2d6de}.skin-yellow-light .user-panel>.info,.skin-yellow-light .user-panel>.info>a{color:#444}.skin-yellow-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-yellow-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-yellow-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-yellow-light .sidebar-menu>li:hover>a,.skin-yellow-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-yellow-light .sidebar-menu>li.active{border-left-color:#f39c12}.skin-yellow-light .sidebar-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-yellow-light .sidebar a{color:#444}.skin-yellow-light .sidebar a:hover{text-decoration:none}.skin-yellow-light .treeview-menu>li>a{color:#777}.skin-yellow-light .treeview-menu>li.active>a,.skin-yellow-light .treeview-menu>li>a:hover{color:#000}.skin-yellow-light .treeview-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-yellow-light .sidebar-form input[type="text"],.skin-yellow-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-yellow-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow-light .sidebar-form input[type="text"]:focus,.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/dist/css/skins/skin-yellow.css b/dist/css/skins/skin-yellow.css new file mode 100644 index 0000000..df00a41 --- /dev/null +++ b/dist/css/skins/skin-yellow.css @@ -0,0 +1,134 @@ +/* + * Skin: Yellow + * ------------ + */ +.skin-yellow .main-header .navbar { + background-color: #f39c12; +} +.skin-yellow .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-yellow .main-header .navbar .nav > li > a:hover, +.skin-yellow .main-header .navbar .nav > li > a:active, +.skin-yellow .main-header .navbar .nav > li > a:focus, +.skin-yellow .main-header .navbar .nav .open > a, +.skin-yellow .main-header .navbar .nav .open > a:hover, +.skin-yellow .main-header .navbar .nav .open > a:focus, +.skin-yellow .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-yellow .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-yellow .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-yellow .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-yellow .main-header .navbar .sidebar-toggle:hover { + background-color: #e08e0b; +} +@media (max-width: 767px) { + .skin-yellow .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-yellow .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-yellow .main-header .navbar .dropdown-menu li a:hover { + background: #e08e0b; + } +} +.skin-yellow .main-header .logo { + background-color: #e08e0b; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-yellow .main-header .logo:hover { + background-color: #db8b0b; +} +.skin-yellow .main-header li.user-header { + background-color: #f39c12; +} +.skin-yellow .content-header { + background: transparent; +} +.skin-yellow .wrapper, +.skin-yellow .main-sidebar, +.skin-yellow .left-side { + background-color: #222d32; +} +.skin-yellow .user-panel > .info, +.skin-yellow .user-panel > .info > a { + color: #fff; +} +.skin-yellow .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-yellow .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-yellow .sidebar-menu > li:hover > a, +.skin-yellow .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #f39c12; +} +.skin-yellow .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-yellow .sidebar a { + color: #b8c7ce; +} +.skin-yellow .sidebar a:hover { + text-decoration: none; +} +.skin-yellow .treeview-menu > li > a { + color: #8aa4af; +} +.skin-yellow .treeview-menu > li.active > a, +.skin-yellow .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-yellow .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-yellow .sidebar-form input[type="text"], +.skin-yellow .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-yellow .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-yellow .sidebar-form input[type="text"]:focus, +.skin-yellow .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-yellow .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-yellow .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} diff --git a/dist/css/skins/skin-yellow.min.css b/dist/css/skins/skin-yellow.min.css new file mode 100644 index 0000000..67fc2e2 --- /dev/null +++ b/dist/css/skins/skin-yellow.min.css @@ -0,0 +1 @@ +.skin-yellow .main-header .navbar{background-color:#f39c12}.skin-yellow .main-header .navbar .nav>li>a{color:#fff}.skin-yellow .main-header .navbar .nav>li>a:hover,.skin-yellow .main-header .navbar .nav>li>a:active,.skin-yellow .main-header .navbar .nav>li>a:focus,.skin-yellow .main-header .navbar .nav .open>a,.skin-yellow .main-header .navbar .nav .open>a:hover,.skin-yellow .main-header .navbar .nav .open>a:focus,.skin-yellow .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow .main-header .logo{background-color:#e08e0b;color:#fff;border-bottom:0 solid transparent}.skin-yellow .main-header .logo:hover{background-color:#db8b0b}.skin-yellow .main-header li.user-header{background-color:#f39c12}.skin-yellow .content-header{background:transparent}.skin-yellow .wrapper,.skin-yellow .main-sidebar,.skin-yellow .left-side{background-color:#222d32}.skin-yellow .user-panel>.info,.skin-yellow .user-panel>.info>a{color:#fff}.skin-yellow .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-yellow .sidebar-menu>li>a{border-left:3px solid transparent}.skin-yellow .sidebar-menu>li:hover>a,.skin-yellow .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#f39c12}.skin-yellow .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-yellow .sidebar a{color:#b8c7ce}.skin-yellow .sidebar a:hover{text-decoration:none}.skin-yellow .treeview-menu>li>a{color:#8aa4af}.skin-yellow .treeview-menu>li.active>a,.skin-yellow .treeview-menu>li>a:hover{color:#fff}.skin-yellow .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-yellow .sidebar-form input[type="text"],.skin-yellow .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-yellow .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow .sidebar-form input[type="text"]:focus,.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0} \ No newline at end of file diff --git a/dist/img/avatar.png b/dist/img/avatar.png new file mode 100644 index 0000000..309f882 Binary files /dev/null and b/dist/img/avatar.png differ diff --git a/dist/img/avatar04.png b/dist/img/avatar04.png new file mode 100644 index 0000000..28e0340 Binary files /dev/null and b/dist/img/avatar04.png differ diff --git a/dist/img/avatar2.png b/dist/img/avatar2.png new file mode 100644 index 0000000..9eaf548 Binary files /dev/null and b/dist/img/avatar2.png differ diff --git a/dist/img/avatar3.png b/dist/img/avatar3.png new file mode 100644 index 0000000..9ca2b3e Binary files /dev/null and b/dist/img/avatar3.png differ diff --git a/dist/img/avatar5.png b/dist/img/avatar5.png new file mode 100644 index 0000000..49d4b92 Binary files /dev/null and b/dist/img/avatar5.png differ diff --git a/dist/img/boxed-bg.jpg b/dist/img/boxed-bg.jpg new file mode 100644 index 0000000..e47586a Binary files /dev/null and b/dist/img/boxed-bg.jpg differ diff --git a/dist/img/boxed-bg.png b/dist/img/boxed-bg.png new file mode 100644 index 0000000..2f9f1ad Binary files /dev/null and b/dist/img/boxed-bg.png differ diff --git a/dist/img/credit/american-express.png b/dist/img/credit/american-express.png new file mode 100644 index 0000000..01f4741 Binary files /dev/null and b/dist/img/credit/american-express.png differ diff --git a/dist/img/credit/cirrus.png b/dist/img/credit/cirrus.png new file mode 100644 index 0000000..9675627 Binary files /dev/null and b/dist/img/credit/cirrus.png differ diff --git a/dist/img/credit/mastercard.png b/dist/img/credit/mastercard.png new file mode 100644 index 0000000..5a8beca Binary files /dev/null and b/dist/img/credit/mastercard.png differ diff --git a/dist/img/credit/mestro.png b/dist/img/credit/mestro.png new file mode 100644 index 0000000..8749b84 Binary files /dev/null and b/dist/img/credit/mestro.png differ diff --git a/dist/img/credit/paypal.png b/dist/img/credit/paypal.png new file mode 100644 index 0000000..a8421ca Binary files /dev/null and b/dist/img/credit/paypal.png differ diff --git a/dist/img/credit/paypal2.png b/dist/img/credit/paypal2.png new file mode 100644 index 0000000..2ccdde9 Binary files /dev/null and b/dist/img/credit/paypal2.png differ diff --git a/dist/img/credit/visa.png b/dist/img/credit/visa.png new file mode 100644 index 0000000..af20eff Binary files /dev/null and b/dist/img/credit/visa.png differ diff --git a/dist/img/default-50x50.gif b/dist/img/default-50x50.gif new file mode 100644 index 0000000..2f5a14a Binary files /dev/null and b/dist/img/default-50x50.gif differ diff --git a/dist/img/icons.png b/dist/img/icons.png new file mode 100644 index 0000000..048c8d2 Binary files /dev/null and b/dist/img/icons.png differ diff --git a/dist/img/photo1.png b/dist/img/photo1.png new file mode 100644 index 0000000..24bc2ed Binary files /dev/null and b/dist/img/photo1.png differ diff --git a/dist/img/photo2.png b/dist/img/photo2.png new file mode 100644 index 0000000..3071ee8 Binary files /dev/null and b/dist/img/photo2.png differ diff --git a/dist/img/photo3.jpg b/dist/img/photo3.jpg new file mode 100644 index 0000000..63daa81 Binary files /dev/null and b/dist/img/photo3.jpg differ diff --git a/dist/img/photo4.jpg b/dist/img/photo4.jpg new file mode 100644 index 0000000..c700ef3 Binary files /dev/null and b/dist/img/photo4.jpg differ diff --git a/dist/img/user1-128x128.jpg b/dist/img/user1-128x128.jpg new file mode 100644 index 0000000..b0ae99a Binary files /dev/null and b/dist/img/user1-128x128.jpg differ diff --git a/dist/img/user2-160x160.jpg b/dist/img/user2-160x160.jpg new file mode 100644 index 0000000..aec74cb Binary files /dev/null and b/dist/img/user2-160x160.jpg differ diff --git a/dist/img/user3-128x128.jpg b/dist/img/user3-128x128.jpg new file mode 100644 index 0000000..caf5f96 Binary files /dev/null and b/dist/img/user3-128x128.jpg differ diff --git a/dist/img/user4-128x128.jpg b/dist/img/user4-128x128.jpg new file mode 100644 index 0000000..eb8e2bb Binary files /dev/null and b/dist/img/user4-128x128.jpg differ diff --git a/dist/img/user5-128x128.jpg b/dist/img/user5-128x128.jpg new file mode 100644 index 0000000..b637aad Binary files /dev/null and b/dist/img/user5-128x128.jpg differ diff --git a/dist/img/user6-128x128.jpg b/dist/img/user6-128x128.jpg new file mode 100644 index 0000000..3ac2468 Binary files /dev/null and b/dist/img/user6-128x128.jpg differ diff --git a/dist/img/user7-128x128.jpg b/dist/img/user7-128x128.jpg new file mode 100644 index 0000000..97febc2 Binary files /dev/null and b/dist/img/user7-128x128.jpg differ diff --git a/dist/img/user8-128x128.jpg b/dist/img/user8-128x128.jpg new file mode 100644 index 0000000..6e717b4 Binary files /dev/null and b/dist/img/user8-128x128.jpg differ diff --git a/dist/js/app.js b/dist/js/app.js new file mode 100644 index 0000000..561d448 --- /dev/null +++ b/dist/js/app.js @@ -0,0 +1,746 @@ +/*! AdminLTE app.js + * ================ + * Main JS application file for AdminLTE v2. This file + * should be included in all pages. It controls some layout + * options and implements exclusive AdminLTE plugins. + * + * @Author Almsaeed Studio + * @Support <http://www.almsaeedstudio.com> + * @Email <support@almsaeedstudio.com> + * @version 2.3.0 + * @license MIT <http://opensource.org/licenses/MIT> + */ + +//Make sure jQuery has been loaded before app.js +if (typeof jQuery === "undefined") { + throw new Error("AdminLTE requires jQuery"); +} + +/* AdminLTE + * + * @type Object + * @description $.AdminLTE is the main object for the template's app. + * It's used for implementing functions and options related + * to the template. Keeping everything wrapped in an object + * prevents conflict with other plugins and is a better + * way to organize our code. + */ +$.AdminLTE = {}; + +/* -------------------- + * - AdminLTE Options - + * -------------------- + * Modify these options to suit your implementation + */ +$.AdminLTE.options = { + //Add slimscroll to navbar menus + //This requires you to load the slimscroll plugin + //in every page before app.js + navbarMenuSlimscroll: true, + navbarMenuSlimscrollWidth: "3px", //The width of the scroll bar + navbarMenuHeight: "200px", //The height of the inner menu + //General animation speed for JS animated elements such as box collapse/expand and + //sidebar treeview slide up/down. This options accepts an integer as milliseconds, + //'fast', 'normal', or 'slow' + animationSpeed: 500, + //Sidebar push menu toggle button selector + sidebarToggleSelector: "[data-toggle='offcanvas']", + //Activate sidebar push menu + sidebarPushMenu: true, + //Activate sidebar slimscroll if the fixed layout is set (requires SlimScroll Plugin) + sidebarSlimScroll: true, + //Enable sidebar expand on hover effect for sidebar mini + //This option is forced to true if both the fixed layout and sidebar mini + //are used together + sidebarExpandOnHover: false, + //BoxRefresh Plugin + enableBoxRefresh: true, + //Bootstrap.js tooltip + enableBSToppltip: true, + BSTooltipSelector: "[data-toggle='tooltip']", + //Enable Fast Click. Fastclick.js creates a more + //native touch experience with touch devices. If you + //choose to enable the plugin, make sure you load the script + //before AdminLTE's app.js + enableFastclick: true, + //Control Sidebar Options + enableControlSidebar: true, + controlSidebarOptions: { + //Which button should trigger the open/close event + toggleBtnSelector: "[data-toggle='control-sidebar']", + //The sidebar selector + selector: ".control-sidebar", + //Enable slide over content + slide: true + }, + //Box Widget Plugin. Enable this plugin + //to allow boxes to be collapsed and/or removed + enableBoxWidget: true, + //Box Widget plugin options + boxWidgetOptions: { + boxWidgetIcons: { + //Collapse icon + collapse: 'fa-minus', + //Open icon + open: 'fa-plus', + //Remove icon + remove: 'fa-times' + }, + boxWidgetSelectors: { + //Remove button selector + remove: '[data-widget="remove"]', + //Collapse button selector + collapse: '[data-widget="collapse"]' + } + }, + //Direct Chat plugin options + directChat: { + //Enable direct chat by default + enable: true, + //The button to open and close the chat contacts pane + contactToggleSelector: '[data-widget="chat-pane-toggle"]' + }, + //Define the set of colors to use globally around the website + colors: { + lightBlue: "#3c8dbc", + red: "#f56954", + green: "#00a65a", + aqua: "#00c0ef", + yellow: "#f39c12", + blue: "#0073b7", + navy: "#001F3F", + teal: "#39CCCC", + olive: "#3D9970", + lime: "#01FF70", + orange: "#FF851B", + fuchsia: "#F012BE", + purple: "#8E24AA", + maroon: "#D81B60", + black: "#222222", + gray: "#d2d6de" + }, + //The standard screen sizes that bootstrap uses. + //If you change these in the variables.less file, change + //them here too. + screenSizes: { + xs: 480, + sm: 768, + md: 992, + lg: 1200 + } +}; + +/* ------------------ + * - Implementation - + * ------------------ + * The next block of code implements AdminLTE's + * functions and plugins as specified by the + * options above. + */ +$(function () { + "use strict"; + + //Fix for IE page transitions + $("body").removeClass("hold-transition"); + + //Extend options if external options exist + if (typeof AdminLTEOptions !== "undefined") { + $.extend(true, + $.AdminLTE.options, + AdminLTEOptions); + } + + //Easy access to options + var o = $.AdminLTE.options; + + //Set up the object + _init(); + + //Activate the layout maker + $.AdminLTE.layout.activate(); + + //Enable sidebar tree view controls + $.AdminLTE.tree('.sidebar'); + + //Enable control sidebar + if (o.enableControlSidebar) { + $.AdminLTE.controlSidebar.activate(); + } + + //Add slimscroll to navbar dropdown + if (o.navbarMenuSlimscroll && typeof $.fn.slimscroll != 'undefined') { + $(".navbar .menu").slimscroll({ + height: o.navbarMenuHeight, + alwaysVisible: false, + size: o.navbarMenuSlimscrollWidth + }).css("width", "100%"); + } + + //Activate sidebar push menu + if (o.sidebarPushMenu) { + $.AdminLTE.pushMenu.activate(o.sidebarToggleSelector); + } + + //Activate Bootstrap tooltip + if (o.enableBSToppltip) { + $('body').tooltip({ + selector: o.BSTooltipSelector + }); + } + + //Activate box widget + if (o.enableBoxWidget) { + $.AdminLTE.boxWidget.activate(); + } + + //Activate fast click + if (o.enableFastclick && typeof FastClick != 'undefined') { + FastClick.attach(document.body); + } + + //Activate direct chat widget + if (o.directChat.enable) { + $(document).on('click', o.directChat.contactToggleSelector, function () { + var box = $(this).parents('.direct-chat').first(); + box.toggleClass('direct-chat-contacts-open'); + }); + } + + /* + * INITIALIZE BUTTON TOGGLE + * ------------------------ + */ + $('.btn-group[data-toggle="btn-toggle"]').each(function () { + var group = $(this); + $(this).find(".btn").on('click', function (e) { + group.find(".btn.active").removeClass("active"); + $(this).addClass("active"); + e.preventDefault(); + }); + + }); +}); + +/* ---------------------------------- + * - Initialize the AdminLTE Object - + * ---------------------------------- + * All AdminLTE functions are implemented below. + */ +function _init() { + 'use strict'; + /* Layout + * ====== + * Fixes the layout height in case min-height fails. + * + * @type Object + * @usage $.AdminLTE.layout.activate() + * $.AdminLTE.layout.fix() + * $.AdminLTE.layout.fixSidebar() + */ + $.AdminLTE.layout = { + activate: function () { + var _this = this; + _this.fix(); + _this.fixSidebar(); + $(window, ".wrapper").resize(function () { + _this.fix(); + _this.fixSidebar(); + }); + }, + fix: function () { + //Get window height and the wrapper height + var neg = $('.main-header').outerHeight() + $('.main-footer').outerHeight(); + var window_height = $(window).height(); + var sidebar_height = $(".sidebar").height(); + //Set the min-height of the content and sidebar based on the + //the height of the document. + if ($("body").hasClass("fixed")) { + $(".content-wrapper, .right-side").css('min-height', window_height - $('.main-footer').outerHeight()); + } else { + var postSetWidth; + if (window_height >= sidebar_height) { + $(".content-wrapper, .right-side").css('min-height', window_height - neg); + postSetWidth = window_height - neg; + } else { + $(".content-wrapper, .right-side").css('min-height', sidebar_height); + postSetWidth = sidebar_height; + } + + //Fix for the control sidebar height + var controlSidebar = $($.AdminLTE.options.controlSidebarOptions.selector); + if (typeof controlSidebar !== "undefined") { + if (controlSidebar.height() > postSetWidth) + $(".content-wrapper, .right-side").css('min-height', controlSidebar.height()); + } + + } + }, + fixSidebar: function () { + //Make sure the body tag has the .fixed class + if (!$("body").hasClass("fixed")) { + if (typeof $.fn.slimScroll != 'undefined') { + $(".sidebar").slimScroll({destroy: true}).height("auto"); + } + return; + } else if (typeof $.fn.slimScroll == 'undefined' && window.console) { + window.console.error("Error: the fixed layout requires the slimscroll plugin!"); + } + //Enable slimscroll for fixed layout + if ($.AdminLTE.options.sidebarSlimScroll) { + if (typeof $.fn.slimScroll != 'undefined') { + //Destroy if it exists + $(".sidebar").slimScroll({destroy: true}).height("auto"); + //Add slimscroll + $(".sidebar").slimscroll({ + height: ($(window).height() - $(".main-header").height()) + "px", + color: "rgba(0,0,0,0.2)", + size: "3px" + }); + } + } + } + }; + + /* PushMenu() + * ========== + * Adds the push menu functionality to the sidebar. + * + * @type Function + * @usage: $.AdminLTE.pushMenu("[data-toggle='offcanvas']") + */ + $.AdminLTE.pushMenu = { + activate: function (toggleBtn) { + //Get the screen sizes + var screenSizes = $.AdminLTE.options.screenSizes; + + //Enable sidebar toggle + $(toggleBtn).on('click', function (e) { + e.preventDefault(); + + //Enable sidebar push menu + if ($(window).width() > (screenSizes.sm - 1)) { + if ($("body").hasClass('sidebar-collapse')) { + $("body").removeClass('sidebar-collapse').trigger('expanded.pushMenu'); + } else { + $("body").addClass('sidebar-collapse').trigger('collapsed.pushMenu'); + } + } + //Handle sidebar push menu for small screens + else { + if ($("body").hasClass('sidebar-open')) { + $("body").removeClass('sidebar-open').removeClass('sidebar-collapse').trigger('collapsed.pushMenu'); + } else { + $("body").addClass('sidebar-open').trigger('expanded.pushMenu'); + } + } + }); + + $(".content-wrapper").click(function () { + //Enable hide menu when clicking on the content-wrapper on small screens + if ($(window).width() <= (screenSizes.sm - 1) && $("body").hasClass("sidebar-open")) { + $("body").removeClass('sidebar-open'); + } + }); + + //Enable expand on hover for sidebar mini + if ($.AdminLTE.options.sidebarExpandOnHover + || ($('body').hasClass('fixed') + && $('body').hasClass('sidebar-mini'))) { + this.expandOnHover(); + } + }, + expandOnHover: function () { + var _this = this; + var screenWidth = $.AdminLTE.options.screenSizes.sm - 1; + //Expand sidebar on hover + $('.main-sidebar').hover(function () { + if ($('body').hasClass('sidebar-mini') + && $("body").hasClass('sidebar-collapse') + && $(window).width() > screenWidth) { + _this.expand(); + } + }, function () { + if ($('body').hasClass('sidebar-mini') + && $('body').hasClass('sidebar-expanded-on-hover') + && $(window).width() > screenWidth) { + _this.collapse(); + } + }); + }, + expand: function () { + $("body").removeClass('sidebar-collapse').addClass('sidebar-expanded-on-hover'); + }, + collapse: function () { + if ($('body').hasClass('sidebar-expanded-on-hover')) { + $('body').removeClass('sidebar-expanded-on-hover').addClass('sidebar-collapse'); + } + } + }; + + /* Tree() + * ====== + * Converts the sidebar into a multilevel + * tree view menu. + * + * @type Function + * @Usage: $.AdminLTE.tree('.sidebar') + */ + $.AdminLTE.tree = function (menu) { + var _this = this; + var animationSpeed = $.AdminLTE.options.animationSpeed; + $(document).on('click', menu + ' li a', function (e) { + //Get the clicked link and the next element + var $this = $(this); + var checkElement = $this.next(); + + //Check if the next element is a menu and is visible + if ((checkElement.is('.treeview-menu')) && (checkElement.is(':visible'))) { + //Close the menu + checkElement.slideUp(animationSpeed, function () { + checkElement.removeClass('menu-open'); + //Fix the layout in case the sidebar stretches over the height of the window + //_this.layout.fix(); + }); + checkElement.parent("li").removeClass("active"); + } + //If the menu is not visible + else if ((checkElement.is('.treeview-menu')) && (!checkElement.is(':visible'))) { + //Get the parent menu + var parent = $this.parents('ul').first(); + //Close all open menus within the parent + var ul = parent.find('ul:visible').slideUp(animationSpeed); + //Remove the menu-open class from the parent + ul.removeClass('menu-open'); + //Get the parent li + var parent_li = $this.parent("li"); + + //Open the target menu and add the menu-open class + checkElement.slideDown(animationSpeed, function () { + //Add the class active to the parent li + checkElement.addClass('menu-open'); + parent.find('li.active').removeClass('active'); + parent_li.addClass('active'); + //Fix the layout in case the sidebar stretches over the height of the window + _this.layout.fix(); + }); + } + //if this isn't a link, prevent the page from being redirected + if (checkElement.is('.treeview-menu')) { + e.preventDefault(); + } + }); + }; + + /* ControlSidebar + * ============== + * Adds functionality to the right sidebar + * + * @type Object + * @usage $.AdminLTE.controlSidebar.activate(options) + */ + $.AdminLTE.controlSidebar = { + //instantiate the object + activate: function () { + //Get the object + var _this = this; + //Update options + var o = $.AdminLTE.options.controlSidebarOptions; + //Get the sidebar + var sidebar = $(o.selector); + //The toggle button + var btn = $(o.toggleBtnSelector); + + //Listen to the click event + btn.on('click', function (e) { + e.preventDefault(); + //If the sidebar is not open + if (!sidebar.hasClass('control-sidebar-open') + && !$('body').hasClass('control-sidebar-open')) { + //Open the sidebar + _this.open(sidebar, o.slide); + } else { + _this.close(sidebar, o.slide); + } + }); + + //If the body has a boxed layout, fix the sidebar bg position + var bg = $(".control-sidebar-bg"); + _this._fix(bg); + + //If the body has a fixed layout, make the control sidebar fixed + if ($('body').hasClass('fixed')) { + _this._fixForFixed(sidebar); + } else { + //If the content height is less than the sidebar's height, force max height + if ($('.content-wrapper, .right-side').height() < sidebar.height()) { + _this._fixForContent(sidebar); + } + } + }, + //Open the control sidebar + open: function (sidebar, slide) { + //Slide over content + if (slide) { + sidebar.addClass('control-sidebar-open'); + } else { + //Push the content by adding the open class to the body instead + //of the sidebar itself + $('body').addClass('control-sidebar-open'); + } + }, + //Close the control sidebar + close: function (sidebar, slide) { + if (slide) { + sidebar.removeClass('control-sidebar-open'); + } else { + $('body').removeClass('control-sidebar-open'); + } + }, + _fix: function (sidebar) { + var _this = this; + if ($("body").hasClass('layout-boxed')) { + sidebar.css('position', 'absolute'); + sidebar.height($(".wrapper").height()); + $(window).resize(function () { + _this._fix(sidebar); + }); + } else { + sidebar.css({ + 'position': 'fixed', + 'height': 'auto' + }); + } + }, + _fixForFixed: function (sidebar) { + sidebar.css({ + 'position': 'fixed', + 'max-height': '100%', + 'overflow': 'auto', + 'padding-bottom': '50px' + }); + }, + _fixForContent: function (sidebar) { + $(".content-wrapper, .right-side").css('min-height', sidebar.height()); + } + }; + + /* BoxWidget + * ========= + * BoxWidget is a plugin to handle collapsing and + * removing boxes from the screen. + * + * @type Object + * @usage $.AdminLTE.boxWidget.activate() + * Set all your options in the main $.AdminLTE.options object + */ + $.AdminLTE.boxWidget = { + selectors: $.AdminLTE.options.boxWidgetOptions.boxWidgetSelectors, + icons: $.AdminLTE.options.boxWidgetOptions.boxWidgetIcons, + animationSpeed: $.AdminLTE.options.animationSpeed, + activate: function (_box) { + var _this = this; + if (!_box) { + _box = document; // activate all boxes per default + } + //Listen for collapse event triggers + $(_box).on('click', _this.selectors.collapse, function (e) { + e.preventDefault(); + _this.collapse($(this)); + }); + + //Listen for remove event triggers + $(_box).on('click', _this.selectors.remove, function (e) { + e.preventDefault(); + _this.remove($(this)); + }); + }, + collapse: function (element) { + var _this = this; + //Find the box parent + var box = element.parents(".box").first(); + //Find the body and the footer + var box_content = box.find("> .box-body, > .box-footer, > form >.box-body, > form > .box-footer"); + if (!box.hasClass("collapsed-box")) { + //Convert minus into plus + element.children(":first") + .removeClass(_this.icons.collapse) + .addClass(_this.icons.open); + //Hide the content + box_content.slideUp(_this.animationSpeed, function () { + box.addClass("collapsed-box"); + }); + } else { + //Convert plus into minus + element.children(":first") + .removeClass(_this.icons.open) + .addClass(_this.icons.collapse); + //Show the content + box_content.slideDown(_this.animationSpeed, function () { + box.removeClass("collapsed-box"); + }); + } + }, + remove: function (element) { + //Find the box parent + var box = element.parents(".box").first(); + box.slideUp(this.animationSpeed); + } + }; +} + +/* ------------------ + * - Custom Plugins - + * ------------------ + * All custom plugins are defined below. + */ + +/* + * BOX REFRESH BUTTON + * ------------------ + * This is a custom plugin to use with the component BOX. It allows you to add + * a refresh button to the box. It converts the box's state to a loading state. + * + * @type plugin + * @usage $("#box-widget").boxRefresh( options ); + */ +(function ($) { + + "use strict"; + + $.fn.boxRefresh = function (options) { + + // Render options + var settings = $.extend({ + //Refresh button selector + trigger: ".refresh-btn", + //File source to be loaded (e.g: ajax/src.php) + source: "", + //Callbacks + onLoadStart: function (box) { + return box; + }, //Right after the button has been clicked + onLoadDone: function (box) { + return box; + } //When the source has been loaded + + }, options); + + //The overlay + var overlay = $('<div class="overlay"><div class="fa fa-refresh fa-spin"></div></div>'); + + return this.each(function () { + //if a source is specified + if (settings.source === "") { + if (window.console) { + window.console.log("Please specify a source first - boxRefresh()"); + } + return; + } + //the box + var box = $(this); + //the button + var rBtn = box.find(settings.trigger).first(); + + //On trigger click + rBtn.on('click', function (e) { + e.preventDefault(); + //Add loading overlay + start(box); + + //Perform ajax call + box.find(".box-body").load(settings.source, function () { + done(box); + }); + }); + }); + + function start(box) { + //Add overlay and loading img + box.append(overlay); + + settings.onLoadStart.call(box); + } + + function done(box) { + //Remove overlay and loading img + box.find(overlay).remove(); + + settings.onLoadDone.call(box); + } + + }; + +})(jQuery); + +/* + * EXPLICIT BOX ACTIVATION + * ----------------------- + * This is a custom plugin to use with the component BOX. It allows you to activate + * a box inserted in the DOM after the app.js was loaded. + * + * @type plugin + * @usage $("#box-widget").activateBox(); + */ +(function ($) { + + 'use strict'; + + $.fn.activateBox = function () { + $.AdminLTE.boxWidget.activate(this); + }; + +})(jQuery); + +/* + * TODO LIST CUSTOM PLUGIN + * ----------------------- + * This plugin depends on iCheck plugin for checkbox and radio inputs + * + * @type plugin + * @usage $("#todo-widget").todolist( options ); + */ +(function ($) { + + 'use strict'; + + $.fn.todolist = function (options) { + // Render options + var settings = $.extend({ + //When the user checks the input + onCheck: function (ele) { + return ele; + }, + //When the user unchecks the input + onUncheck: function (ele) { + return ele; + } + }, options); + + return this.each(function () { + + if (typeof $.fn.iCheck != 'undefined') { + $('input', this).on('ifChecked', function () { + var ele = $(this).parents("li").first(); + ele.toggleClass("done"); + settings.onCheck.call(ele); + }); + + $('input', this).on('ifUnchecked', function () { + var ele = $(this).parents("li").first(); + ele.toggleClass("done"); + settings.onUncheck.call(ele); + }); + } else { + $('input', this).on('change', function () { + var ele = $(this).parents("li").first(); + ele.toggleClass("done"); + if ($('input', ele).is(":checked")) { + settings.onCheck.call(ele); + } else { + settings.onUncheck.call(ele); + } + }); + } + }); + }; +}(jQuery)); \ No newline at end of file diff --git a/dist/js/app.min.js b/dist/js/app.min.js new file mode 100644 index 0000000..679f18f --- /dev/null +++ b/dist/js/app.min.js @@ -0,0 +1,13 @@ +/*! AdminLTE app.js + * ================ + * Main JS application file for AdminLTE v2. This file + * should be included in all pages. It controls some layout + * options and implements exclusive AdminLTE plugins. + * + * @Author Almsaeed Studio + * @Support <http://www.almsaeedstudio.com> + * @Email <support@almsaeedstudio.com> + * @version 2.3.0 + * @license MIT <http://opensource.org/licenses/MIT> + */ +function _init(){"use strict";$.AdminLTE.layout={activate:function(){var a=this;a.fix(),a.fixSidebar(),$(window,".wrapper").resize(function(){a.fix(),a.fixSidebar()})},fix:function(){var a=$(".main-header").outerHeight()+$(".main-footer").outerHeight(),b=$(window).height(),c=$(".sidebar").height();if($("body").hasClass("fixed"))$(".content-wrapper, .right-side").css("min-height",b-$(".main-footer").outerHeight());else{var d;b>=c?($(".content-wrapper, .right-side").css("min-height",b-a),d=b-a):($(".content-wrapper, .right-side").css("min-height",c),d=c);var e=$($.AdminLTE.options.controlSidebarOptions.selector);"undefined"!=typeof e&&e.height()>d&&$(".content-wrapper, .right-side").css("min-height",e.height())}},fixSidebar:function(){return $("body").hasClass("fixed")?("undefined"==typeof $.fn.slimScroll&&window.console&&window.console.error("Error: the fixed layout requires the slimscroll plugin!"),void($.AdminLTE.options.sidebarSlimScroll&&"undefined"!=typeof $.fn.slimScroll&&($(".sidebar").slimScroll({destroy:!0}).height("auto"),$(".sidebar").slimscroll({height:$(window).height()-$(".main-header").height()+"px",color:"rgba(0,0,0,0.2)",size:"3px"})))):void("undefined"!=typeof $.fn.slimScroll&&$(".sidebar").slimScroll({destroy:!0}).height("auto"))}},$.AdminLTE.pushMenu={activate:function(a){var b=$.AdminLTE.options.screenSizes;$(a).on("click",function(a){a.preventDefault(),$(window).width()>b.sm-1?$("body").hasClass("sidebar-collapse")?$("body").removeClass("sidebar-collapse").trigger("expanded.pushMenu"):$("body").addClass("sidebar-collapse").trigger("collapsed.pushMenu"):$("body").hasClass("sidebar-open")?$("body").removeClass("sidebar-open").removeClass("sidebar-collapse").trigger("collapsed.pushMenu"):$("body").addClass("sidebar-open").trigger("expanded.pushMenu")}),$(".content-wrapper").click(function(){$(window).width()<=b.sm-1&&$("body").hasClass("sidebar-open")&&$("body").removeClass("sidebar-open")}),($.AdminLTE.options.sidebarExpandOnHover||$("body").hasClass("fixed")&&$("body").hasClass("sidebar-mini"))&&this.expandOnHover()},expandOnHover:function(){var a=this,b=$.AdminLTE.options.screenSizes.sm-1;$(".main-sidebar").hover(function(){$("body").hasClass("sidebar-mini")&&$("body").hasClass("sidebar-collapse")&&$(window).width()>b&&a.expand()},function(){$("body").hasClass("sidebar-mini")&&$("body").hasClass("sidebar-expanded-on-hover")&&$(window).width()>b&&a.collapse()})},expand:function(){$("body").removeClass("sidebar-collapse").addClass("sidebar-expanded-on-hover")},collapse:function(){$("body").hasClass("sidebar-expanded-on-hover")&&$("body").removeClass("sidebar-expanded-on-hover").addClass("sidebar-collapse")}},$.AdminLTE.tree=function(a){var b=this,c=$.AdminLTE.options.animationSpeed;$(document).on("click",a+" li a",function(a){var d=$(this),e=d.next();if(e.is(".treeview-menu")&&e.is(":visible"))e.slideUp(c,function(){e.removeClass("menu-open")}),e.parent("li").removeClass("active");else if(e.is(".treeview-menu")&&!e.is(":visible")){var f=d.parents("ul").first(),g=f.find("ul:visible").slideUp(c);g.removeClass("menu-open");var h=d.parent("li");e.slideDown(c,function(){e.addClass("menu-open"),f.find("li.active").removeClass("active"),h.addClass("active"),b.layout.fix()})}e.is(".treeview-menu")&&a.preventDefault()})},$.AdminLTE.controlSidebar={activate:function(){var a=this,b=$.AdminLTE.options.controlSidebarOptions,c=$(b.selector),d=$(b.toggleBtnSelector);d.on("click",function(d){d.preventDefault(),c.hasClass("control-sidebar-open")||$("body").hasClass("control-sidebar-open")?a.close(c,b.slide):a.open(c,b.slide)});var e=$(".control-sidebar-bg");a._fix(e),$("body").hasClass("fixed")?a._fixForFixed(c):$(".content-wrapper, .right-side").height()<c.height()&&a._fixForContent(c)},open:function(a,b){b?a.addClass("control-sidebar-open"):$("body").addClass("control-sidebar-open")},close:function(a,b){b?a.removeClass("control-sidebar-open"):$("body").removeClass("control-sidebar-open")},_fix:function(a){var b=this;$("body").hasClass("layout-boxed")?(a.css("position","absolute"),a.height($(".wrapper").height()),$(window).resize(function(){b._fix(a)})):a.css({position:"fixed",height:"auto"})},_fixForFixed:function(a){a.css({position:"fixed","max-height":"100%",overflow:"auto","padding-bottom":"50px"})},_fixForContent:function(a){$(".content-wrapper, .right-side").css("min-height",a.height())}},$.AdminLTE.boxWidget={selectors:$.AdminLTE.options.boxWidgetOptions.boxWidgetSelectors,icons:$.AdminLTE.options.boxWidgetOptions.boxWidgetIcons,animationSpeed:$.AdminLTE.options.animationSpeed,activate:function(a){var b=this;a||(a=document),$(a).on("click",b.selectors.collapse,function(a){a.preventDefault(),b.collapse($(this))}),$(a).on("click",b.selectors.remove,function(a){a.preventDefault(),b.remove($(this))})},collapse:function(a){var b=this,c=a.parents(".box").first(),d=c.find("> .box-body, > .box-footer, > form >.box-body, > form > .box-footer");c.hasClass("collapsed-box")?(a.children(":first").removeClass(b.icons.open).addClass(b.icons.collapse),d.slideDown(b.animationSpeed,function(){c.removeClass("collapsed-box")})):(a.children(":first").removeClass(b.icons.collapse).addClass(b.icons.open),d.slideUp(b.animationSpeed,function(){c.addClass("collapsed-box")}))},remove:function(a){var b=a.parents(".box").first();b.slideUp(this.animationSpeed)}}}if("undefined"==typeof jQuery)throw new Error("AdminLTE requires jQuery");$.AdminLTE={},$.AdminLTE.options={navbarMenuSlimscroll:!0,navbarMenuSlimscrollWidth:"3px",navbarMenuHeight:"200px",animationSpeed:500,sidebarToggleSelector:"[data-toggle='offcanvas']",sidebarPushMenu:!0,sidebarSlimScroll:!0,sidebarExpandOnHover:!1,enableBoxRefresh:!0,enableBSToppltip:!0,BSTooltipSelector:"[data-toggle='tooltip']",enableFastclick:!0,enableControlSidebar:!0,controlSidebarOptions:{toggleBtnSelector:"[data-toggle='control-sidebar']",selector:".control-sidebar",slide:!0},enableBoxWidget:!0,boxWidgetOptions:{boxWidgetIcons:{collapse:"fa-minus",open:"fa-plus",remove:"fa-times"},boxWidgetSelectors:{remove:'[data-widget="remove"]',collapse:'[data-widget="collapse"]'}},directChat:{enable:!0,contactToggleSelector:'[data-widget="chat-pane-toggle"]'},colors:{lightBlue:"#3c8dbc",red:"#f56954",green:"#00a65a",aqua:"#00c0ef",yellow:"#f39c12",blue:"#0073b7",navy:"#001F3F",teal:"#39CCCC",olive:"#3D9970",lime:"#01FF70",orange:"#FF851B",fuchsia:"#F012BE",purple:"#8E24AA",maroon:"#D81B60",black:"#222222",gray:"#d2d6de"},screenSizes:{xs:480,sm:768,md:992,lg:1200}},$(function(){"use strict";$("body").removeClass("hold-transition"),"undefined"!=typeof AdminLTEOptions&&$.extend(!0,$.AdminLTE.options,AdminLTEOptions);var a=$.AdminLTE.options;_init(),$.AdminLTE.layout.activate(),$.AdminLTE.tree(".sidebar"),a.enableControlSidebar&&$.AdminLTE.controlSidebar.activate(),a.navbarMenuSlimscroll&&"undefined"!=typeof $.fn.slimscroll&&$(".navbar .menu").slimscroll({height:a.navbarMenuHeight,alwaysVisible:!1,size:a.navbarMenuSlimscrollWidth}).css("width","100%"),a.sidebarPushMenu&&$.AdminLTE.pushMenu.activate(a.sidebarToggleSelector),a.enableBSToppltip&&$("body").tooltip({selector:a.BSTooltipSelector}),a.enableBoxWidget&&$.AdminLTE.boxWidget.activate(),a.enableFastclick&&"undefined"!=typeof FastClick&&FastClick.attach(document.body),a.directChat.enable&&$(document).on("click",a.directChat.contactToggleSelector,function(){var a=$(this).parents(".direct-chat").first();a.toggleClass("direct-chat-contacts-open")}),$('.btn-group[data-toggle="btn-toggle"]').each(function(){var a=$(this);$(this).find(".btn").on("click",function(b){a.find(".btn.active").removeClass("active"),$(this).addClass("active"),b.preventDefault()})})}),function(a){"use strict";a.fn.boxRefresh=function(b){function c(a){a.append(f),e.onLoadStart.call(a)}function d(a){a.find(f).remove(),e.onLoadDone.call(a)}var e=a.extend({trigger:".refresh-btn",source:"",onLoadStart:function(a){return a},onLoadDone:function(a){return a}},b),f=a('<div class="overlay"><div class="fa fa-refresh fa-spin"></div></div>');return this.each(function(){if(""===e.source)return void(window.console&&window.console.log("Please specify a source first - boxRefresh()"));var b=a(this),f=b.find(e.trigger).first();f.on("click",function(a){a.preventDefault(),c(b),b.find(".box-body").load(e.source,function(){d(b)})})})}}(jQuery),function(a){"use strict";a.fn.activateBox=function(){a.AdminLTE.boxWidget.activate(this)}}(jQuery),function(a){"use strict";a.fn.todolist=function(b){var c=a.extend({onCheck:function(a){return a},onUncheck:function(a){return a}},b);return this.each(function(){"undefined"!=typeof a.fn.iCheck?(a("input",this).on("ifChecked",function(){var b=a(this).parents("li").first();b.toggleClass("done"),c.onCheck.call(b)}),a("input",this).on("ifUnchecked",function(){var b=a(this).parents("li").first();b.toggleClass("done"),c.onUncheck.call(b)})):a("input",this).on("change",function(){var b=a(this).parents("li").first();b.toggleClass("done"),a("input",b).is(":checked")?c.onCheck.call(b):c.onUncheck.call(b)})})}}(jQuery); \ No newline at end of file diff --git a/dist/js/demo.js b/dist/js/demo.js new file mode 100644 index 0000000..988ec45 --- /dev/null +++ b/dist/js/demo.js @@ -0,0 +1,338 @@ +/** + * AdminLTE Demo Menu + * ------------------ + * You should not use this file in production. + * This file is for demo purposes only. + */ +(function ($, AdminLTE) { + + "use strict"; + + /** + * List of all the available skins + * + * @type Array + */ + var my_skins = [ + "skin-blue", + "skin-black", + "skin-red", + "skin-yellow", + "skin-purple", + "skin-green", + "skin-blue-light", + "skin-black-light", + "skin-red-light", + "skin-yellow-light", + "skin-purple-light", + "skin-green-light" + ]; + + //Create the new tab + var tab_pane = $("<div />", { + "id": "control-sidebar-theme-demo-options-tab", + "class": "tab-pane active" + }); + + //Create the tab button + var tab_button = $("<li />", {"class": "active"}) + .html("<a href='#control-sidebar-theme-demo-options-tab' data-toggle='tab'>" + + "<i class='fa fa-wrench'></i>" + + "</a>"); + + //Add the tab button to the right sidebar tabs + $("[href='#control-sidebar-home-tab']") + .parent() + .before(tab_button); + + //Create the menu + var demo_settings = $("<div />"); + + //Layout options + demo_settings.append( + "<h4 class='control-sidebar-heading'>" + + "Layout Options" + + "</h4>" + //Fixed layout + + "<div class='form-group'>" + + "<label class='control-sidebar-subheading'>" + + "<input type='checkbox' data-layout='fixed' class='pull-right'/> " + + "Fixed layout" + + "</label>" + + "<p>Activate the fixed layout. You can't use fixed and boxed layouts together</p>" + + "</div>" + //Boxed layout + + "<div class='form-group'>" + + "<label class='control-sidebar-subheading'>" + + "<input type='checkbox' data-layout='layout-boxed'class='pull-right'/> " + + "Boxed Layout" + + "</label>" + + "<p>Activate the boxed layout</p>" + + "</div>" + //Sidebar Toggle + + "<div class='form-group'>" + + "<label class='control-sidebar-subheading'>" + + "<input type='checkbox' data-layout='sidebar-collapse' class='pull-right'/> " + + "Toggle Sidebar" + + "</label>" + + "<p>Toggle the left sidebar's state (open or collapse)</p>" + + "</div>" + //Sidebar mini expand on hover toggle + + "<div class='form-group'>" + + "<label class='control-sidebar-subheading'>" + + "<input type='checkbox' data-enable='expandOnHover' class='pull-right'/> " + + "Sidebar Expand on Hover" + + "</label>" + + "<p>Let the sidebar mini expand on hover</p>" + + "</div>" + //Control Sidebar Toggle + + "<div class='form-group'>" + + "<label class='control-sidebar-subheading'>" + + "<input type='checkbox' data-controlsidebar='control-sidebar-open' class='pull-right'/> " + + "Toggle Right Sidebar Slide" + + "</label>" + + "<p>Toggle between slide over content and push content effects</p>" + + "</div>" + //Control Sidebar Skin Toggle + + "<div class='form-group'>" + + "<label class='control-sidebar-subheading'>" + + "<input type='checkbox' data-sidebarskin='toggle' class='pull-right'/> " + + "Toggle Right Sidebar Skin" + + "</label>" + + "<p>Toggle between dark and light skins for the right sidebar</p>" + + "</div>" + ); + var skins_list = $("<ul />", {"class": 'list-unstyled clearfix'}); + + //Dark sidebar skins + var skin_blue = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-blue' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div><span style='display:block; width: 20%; float: left; height: 7px; background: #367fa9;'></span><span class='bg-light-blue' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #222d32;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin'>Blue</p>"); + skins_list.append(skin_blue); + var skin_black = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-black' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div style='box-shadow: 0 0 2px rgba(0,0,0,0.1)' class='clearfix'><span style='display:block; width: 20%; float: left; height: 7px; background: #fefefe;'></span><span style='display:block; width: 80%; float: left; height: 7px; background: #fefefe;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #222;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin'>Black</p>"); + skins_list.append(skin_black); + var skin_purple = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-purple' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-purple-active'></span><span class='bg-purple' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #222d32;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin'>Purple</p>"); + skins_list.append(skin_purple); + var skin_green = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-green' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-green-active'></span><span class='bg-green' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #222d32;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin'>Green</p>"); + skins_list.append(skin_green); + var skin_red = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-red' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-red-active'></span><span class='bg-red' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #222d32;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin'>Red</p>"); + skins_list.append(skin_red); + var skin_yellow = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-yellow' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-yellow-active'></span><span class='bg-yellow' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #222d32;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin'>Yellow</p>"); + skins_list.append(skin_yellow); + + //Light sidebar skins + var skin_blue_light = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-blue-light' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div><span style='display:block; width: 20%; float: left; height: 7px; background: #367fa9;'></span><span class='bg-light-blue' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #f9fafc;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin' style='font-size: 12px'>Blue Light</p>"); + skins_list.append(skin_blue_light); + var skin_black_light = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-black-light' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div style='box-shadow: 0 0 2px rgba(0,0,0,0.1)' class='clearfix'><span style='display:block; width: 20%; float: left; height: 7px; background: #fefefe;'></span><span style='display:block; width: 80%; float: left; height: 7px; background: #fefefe;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #f9fafc;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin' style='font-size: 12px'>Black Light</p>"); + skins_list.append(skin_black_light); + var skin_purple_light = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-purple-light' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-purple-active'></span><span class='bg-purple' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #f9fafc;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin' style='font-size: 12px'>Purple Light</p>"); + skins_list.append(skin_purple_light); + var skin_green_light = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-green-light' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-green-active'></span><span class='bg-green' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #f9fafc;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin' style='font-size: 12px'>Green Light</p>"); + skins_list.append(skin_green_light); + var skin_red_light = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-red-light' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-red-active'></span><span class='bg-red' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #f9fafc;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin' style='font-size: 12px'>Red Light</p>"); + skins_list.append(skin_red_light); + var skin_yellow_light = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-yellow-light' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-yellow-active'></span><span class='bg-yellow' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #f9fafc;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin' style='font-size: 12px;'>Yellow Light</p>"); + skins_list.append(skin_yellow_light); + + demo_settings.append("<h4 class='control-sidebar-heading'>Skins</h4>"); + demo_settings.append(skins_list); + + tab_pane.append(demo_settings); + $("#control-sidebar-home-tab").after(tab_pane); + + setup(); + + /** + * Toggles layout classes + * + * @param String cls the layout class to toggle + * @returns void + */ + function change_layout(cls) { + $("body").toggleClass(cls); + AdminLTE.layout.fixSidebar(); + //Fix the problem with right sidebar and layout boxed + if (cls == "layout-boxed") + AdminLTE.controlSidebar._fix($(".control-sidebar-bg")); + if ($('body').hasClass('fixed') && cls == 'fixed') { + AdminLTE.pushMenu.expandOnHover(); + AdminLTE.layout.activate(); + } + AdminLTE.controlSidebar._fix($(".control-sidebar-bg")); + AdminLTE.controlSidebar._fix($(".control-sidebar")); + } + + /** + * Replaces the old skin with the new skin + * @param String cls the new skin class + * @returns Boolean false to prevent link's default action + */ + function change_skin(cls) { + $.each(my_skins, function (i) { + $("body").removeClass(my_skins[i]); + }); + + $("body").addClass(cls); + store('skin', cls); + return false; + } + + /** + * Store a new settings in the browser + * + * @param String name Name of the setting + * @param String val Value of the setting + * @returns void + */ + function store(name, val) { + if (typeof (Storage) !== "undefined") { + localStorage.setItem(name, val); + } else { + window.alert('Please use a modern browser to properly view this template!'); + } + } + + /** + * Get a prestored setting + * + * @param String name Name of of the setting + * @returns String The value of the setting | null + */ + function get(name) { + if (typeof (Storage) !== "undefined") { + return localStorage.getItem(name); + } else { + window.alert('Please use a modern browser to properly view this template!'); + } + } + + /** + * Retrieve default settings and apply them to the template + * + * @returns void + */ + function setup() { + var tmp = get('skin'); + if (tmp && $.inArray(tmp, my_skins)) + change_skin(tmp); + + //Add the change skin listener + $("[data-skin]").on('click', function (e) { + e.preventDefault(); + change_skin($(this).data('skin')); + }); + + //Add the layout manager + $("[data-layout]").on('click', function () { + change_layout($(this).data('layout')); + }); + + $("[data-controlsidebar]").on('click', function () { + change_layout($(this).data('controlsidebar')); + var slide = !AdminLTE.options.controlSidebarOptions.slide; + AdminLTE.options.controlSidebarOptions.slide = slide; + if (!slide) + $('.control-sidebar').removeClass('control-sidebar-open'); + }); + + $("[data-sidebarskin='toggle']").on('click', function () { + var sidebar = $(".control-sidebar"); + if (sidebar.hasClass("control-sidebar-dark")) { + sidebar.removeClass("control-sidebar-dark") + sidebar.addClass("control-sidebar-light") + } else { + sidebar.removeClass("control-sidebar-light") + sidebar.addClass("control-sidebar-dark") + } + }); + + $("[data-enable='expandOnHover']").on('click', function () { + $(this).attr('disabled', true); + AdminLTE.pushMenu.expandOnHover(); + if (!$('body').hasClass('sidebar-collapse')) + $("[data-layout='sidebar-collapse']").click(); + }); + + // Reset options + if ($('body').hasClass('fixed')) { + $("[data-layout='fixed']").attr('checked', 'checked'); + } + if ($('body').hasClass('layout-boxed')) { + $("[data-layout='layout-boxed']").attr('checked', 'checked'); + } + if ($('body').hasClass('sidebar-collapse')) { + $("[data-layout='sidebar-collapse']").attr('checked', 'checked'); + } + + } +})(jQuery, $.AdminLTE); diff --git a/dist/js/pages/dashboard.js b/dist/js/pages/dashboard.js new file mode 100644 index 0000000..9c4ff7b --- /dev/null +++ b/dist/js/pages/dashboard.js @@ -0,0 +1,210 @@ +/* + * Author: Abdullah A Almsaeed + * Date: 4 Jan 2014 + * Description: + * This is a demo file used only for the main dashboard (index.html) + **/ + +$(function () { + + "use strict"; + + //Make the dashboard widgets sortable Using jquery UI + $(".connectedSortable").sortable({ + placeholder: "sort-highlight", + connectWith: ".connectedSortable", + handle: ".box-header, .nav-tabs", + forcePlaceholderSize: true, + zIndex: 999999 + }); + $(".connectedSortable .box-header, .connectedSortable .nav-tabs-custom").css("cursor", "move"); + + //jQuery UI sortable for the todo list + $(".todo-list").sortable({ + placeholder: "sort-highlight", + handle: ".handle", + forcePlaceholderSize: true, + zIndex: 999999 + }); + + //bootstrap WYSIHTML5 - text editor + $(".textarea").wysihtml5(); + + $('.daterange').daterangepicker({ + ranges: { + 'Today': [moment(), moment()], + 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], + 'Last 7 Days': [moment().subtract(6, 'days'), moment()], + 'Last 30 Days': [moment().subtract(29, 'days'), moment()], + 'This Month': [moment().startOf('month'), moment().endOf('month')], + 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')] + }, + startDate: moment().subtract(29, 'days'), + endDate: moment() + }, function (start, end) { + window.alert("You chose: " + start.format('MMMM D, YYYY') + ' - ' + end.format('MMMM D, YYYY')); + }); + + /* jQueryKnob */ + $(".knob").knob(); + + //jvectormap data + var visitorsData = { + "US": 398, //USA + "SA": 400, //Saudi Arabia + "CA": 1000, //Canada + "DE": 500, //Germany + "FR": 760, //France + "CN": 300, //China + "AU": 700, //Australia + "BR": 600, //Brazil + "IN": 800, //India + "GB": 320, //Great Britain + "RU": 3000 //Russia + }; + //World map by jvectormap + $('#world-map').vectorMap({ + map: 'world_mill_en', + backgroundColor: "transparent", + regionStyle: { + initial: { + fill: '#e4e4e4', + "fill-opacity": 1, + stroke: 'none', + "stroke-width": 0, + "stroke-opacity": 1 + } + }, + series: { + regions: [{ + values: visitorsData, + scale: ["#92c1dc", "#ebf4f9"], + normalizeFunction: 'polynomial' + }] + }, + onRegionLabelShow: function (e, el, code) { + if (typeof visitorsData[code] != "undefined") + el.html(el.html() + ': ' + visitorsData[code] + ' new visitors'); + } + }); + + //Sparkline charts + var myvalues = [1000, 1200, 920, 927, 931, 1027, 819, 930, 1021]; + $('#sparkline-1').sparkline(myvalues, { + type: 'line', + lineColor: '#92c1dc', + fillColor: "#ebf4f9", + height: '50', + width: '80' + }); + myvalues = [515, 519, 520, 522, 652, 810, 370, 627, 319, 630, 921]; + $('#sparkline-2').sparkline(myvalues, { + type: 'line', + lineColor: '#92c1dc', + fillColor: "#ebf4f9", + height: '50', + width: '80' + }); + myvalues = [15, 19, 20, 22, 33, 27, 31, 27, 19, 30, 21]; + $('#sparkline-3').sparkline(myvalues, { + type: 'line', + lineColor: '#92c1dc', + fillColor: "#ebf4f9", + height: '50', + width: '80' + }); + + //The Calender + $("#calendar").datepicker(); + + //SLIMSCROLL FOR CHAT WIDGET + $('#chat-box').slimScroll({ + height: '250px' + }); + + /* Morris.js Charts */ + // Sales chart + var area = new Morris.Area({ + element: 'revenue-chart', + resize: true, + data: [ + {y: '2011 Q1', item1: 2666, item2: 2666}, + {y: '2011 Q2', item1: 2778, item2: 2294}, + {y: '2011 Q3', item1: 4912, item2: 1969}, + {y: '2011 Q4', item1: 3767, item2: 3597}, + {y: '2012 Q1', item1: 6810, item2: 1914}, + {y: '2012 Q2', item1: 5670, item2: 4293}, + {y: '2012 Q3', item1: 4820, item2: 3795}, + {y: '2012 Q4', item1: 15073, item2: 5967}, + {y: '2013 Q1', item1: 10687, item2: 4460}, + {y: '2013 Q2', item1: 8432, item2: 5713} + ], + xkey: 'y', + ykeys: ['item1', 'item2'], + labels: ['Item 1', 'Item 2'], + lineColors: ['#a0d0e0', '#3c8dbc'], + hideHover: 'auto' + }); + var line = new Morris.Line({ + element: 'line-chart', + resize: true, + data: [ + {y: '2011 Q1', item1: 2666}, + {y: '2011 Q2', item1: 2778}, + {y: '2011 Q3', item1: 4912}, + {y: '2011 Q4', item1: 3767}, + {y: '2012 Q1', item1: 6810}, + {y: '2012 Q2', item1: 5670}, + {y: '2012 Q3', item1: 4820}, + {y: '2012 Q4', item1: 15073}, + {y: '2013 Q1', item1: 10687}, + {y: '2013 Q2', item1: 8432} + ], + xkey: 'y', + ykeys: ['item1'], + labels: ['Item 1'], + lineColors: ['#efefef'], + lineWidth: 2, + hideHover: 'auto', + gridTextColor: "#fff", + gridStrokeWidth: 0.4, + pointSize: 4, + pointStrokeColors: ["#efefef"], + gridLineColor: "#efefef", + gridTextFamily: "Open Sans", + gridTextSize: 10 + }); + + //Donut Chart + var donut = new Morris.Donut({ + element: 'sales-chart', + resize: true, + colors: ["#3c8dbc", "#f56954", "#00a65a"], + data: [ + {label: "Download Sales", value: 12}, + {label: "In-Store Sales", value: 30}, + {label: "Mail-Order Sales", value: 20} + ], + hideHover: 'auto' + }); + + //Fix for charts under tabs + $('.box ul.nav a').on('shown.bs.tab', function () { + area.redraw(); + donut.redraw(); + line.redraw(); + }); + + /* The todo list plugin */ + $(".todo-list").todolist({ + onCheck: function (ele) { + window.console.log("The element has been checked"); + return ele; + }, + onUncheck: function (ele) { + window.console.log("The element has been unchecked"); + return ele; + } + }); + +}); diff --git a/dist/js/pages/dashboard2.js b/dist/js/pages/dashboard2.js new file mode 100644 index 0000000..a892b5b --- /dev/null +++ b/dist/js/pages/dashboard2.js @@ -0,0 +1,275 @@ +$(function () { + + 'use strict'; + + /* ChartJS + * ------- + * Here we will create a few charts using ChartJS + */ + + //----------------------- + //- MONTHLY SALES CHART - + //----------------------- + + // Get context with jQuery - using jQuery's .get() method. + var salesChartCanvas = $("#salesChart").get(0).getContext("2d"); + // This will get the first returned node in the jQuery collection. + var salesChart = new Chart(salesChartCanvas); + + var salesChartData = { + labels: ["January", "February", "March", "April", "May", "June", "July"], + datasets: [ + { + label: "Electronics", + fillColor: "rgb(210, 214, 222)", + strokeColor: "rgb(210, 214, 222)", + pointColor: "rgb(210, 214, 222)", + pointStrokeColor: "#c1c7d1", + pointHighlightFill: "#fff", + pointHighlightStroke: "rgb(220,220,220)", + data: [65, 59, 80, 81, 56, 55, 40] + }, + { + label: "Digital Goods", + fillColor: "rgba(60,141,188,0.9)", + strokeColor: "rgba(60,141,188,0.8)", + pointColor: "#3b8bba", + pointStrokeColor: "rgba(60,141,188,1)", + pointHighlightFill: "#fff", + pointHighlightStroke: "rgba(60,141,188,1)", + data: [28, 48, 40, 19, 86, 27, 90] + } + ] + }; + + var salesChartOptions = { + //Boolean - If we should show the scale at all + showScale: true, + //Boolean - Whether grid lines are shown across the chart + scaleShowGridLines: false, + //String - Colour of the grid lines + scaleGridLineColor: "rgba(0,0,0,.05)", + //Number - Width of the grid lines + scaleGridLineWidth: 1, + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + //Boolean - Whether the line is curved between points + bezierCurve: true, + //Number - Tension of the bezier curve between points + bezierCurveTension: 0.3, + //Boolean - Whether to show a dot for each point + pointDot: false, + //Number - Radius of each point dot in pixels + pointDotRadius: 4, + //Number - Pixel width of point dot stroke + pointDotStrokeWidth: 1, + //Number - amount extra to add to the radius to cater for hit detection outside the drawn point + pointHitDetectionRadius: 20, + //Boolean - Whether to show a stroke for datasets + datasetStroke: true, + //Number - Pixel width of dataset stroke + datasetStrokeWidth: 2, + //Boolean - Whether to fill the dataset with a color + datasetFill: true, + //String - A legend template + legendTemplate: "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].lineColor%>\"></span><%=datasets[i].label%></li><%}%></ul>", + //Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container + maintainAspectRatio: true, + //Boolean - whether to make the chart responsive to window resizing + responsive: true + }; + + //Create the line chart + salesChart.Line(salesChartData, salesChartOptions); + + //--------------------------- + //- END MONTHLY SALES CHART - + //--------------------------- + + //------------- + //- PIE CHART - + //------------- + // Get context with jQuery - using jQuery's .get() method. + var pieChartCanvas = $("#pieChart").get(0).getContext("2d"); + var pieChart = new Chart(pieChartCanvas); + var PieData = [ + { + value: 700, + color: "#f56954", + highlight: "#f56954", + label: "Chrome" + }, + { + value: 500, + color: "#00a65a", + highlight: "#00a65a", + label: "IE" + }, + { + value: 400, + color: "#f39c12", + highlight: "#f39c12", + label: "FireFox" + }, + { + value: 600, + color: "#00c0ef", + highlight: "#00c0ef", + label: "Safari" + }, + { + value: 300, + color: "#3c8dbc", + highlight: "#3c8dbc", + label: "Opera" + }, + { + value: 100, + color: "#d2d6de", + highlight: "#d2d6de", + label: "Navigator" + } + ]; + var pieOptions = { + //Boolean - Whether we should show a stroke on each segment + segmentShowStroke: true, + //String - The colour of each segment stroke + segmentStrokeColor: "#fff", + //Number - The width of each segment stroke + segmentStrokeWidth: 1, + //Number - The percentage of the chart that we cut out of the middle + percentageInnerCutout: 50, // This is 0 for Pie charts + //Number - Amount of animation steps + animationSteps: 100, + //String - Animation easing effect + animationEasing: "easeOutBounce", + //Boolean - Whether we animate the rotation of the Doughnut + animateRotate: true, + //Boolean - Whether we animate scaling the Doughnut from the centre + animateScale: false, + //Boolean - whether to make the chart responsive to window resizing + responsive: true, + // Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container + maintainAspectRatio: false, + //String - A legend template + legendTemplate: "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>", + //String - A tooltip template + tooltipTemplate: "<%=value %> <%=label%> users" + }; + //Create pie or douhnut chart + // You can switch between pie and douhnut using the method below. + pieChart.Doughnut(PieData, pieOptions); + //----------------- + //- END PIE CHART - + //----------------- + + /* jVector Maps + * ------------ + * Create a world map with markers + */ + $('#world-map-markers').vectorMap({ + map: 'world_mill_en', + normalizeFunction: 'polynomial', + hoverOpacity: 0.7, + hoverColor: false, + backgroundColor: 'transparent', + regionStyle: { + initial: { + fill: 'rgba(210, 214, 222, 1)', + "fill-opacity": 1, + stroke: 'none', + "stroke-width": 0, + "stroke-opacity": 1 + }, + hover: { + "fill-opacity": 0.7, + cursor: 'pointer' + }, + selected: { + fill: 'yellow' + }, + selectedHover: { + } + }, + markerStyle: { + initial: { + fill: '#00a65a', + stroke: '#111' + } + }, + markers: [ + {latLng: [41.90, 12.45], name: 'Vatican City'}, + {latLng: [43.73, 7.41], name: 'Monaco'}, + {latLng: [-0.52, 166.93], name: 'Nauru'}, + {latLng: [-8.51, 179.21], name: 'Tuvalu'}, + {latLng: [43.93, 12.46], name: 'San Marino'}, + {latLng: [47.14, 9.52], name: 'Liechtenstein'}, + {latLng: [7.11, 171.06], name: 'Marshall Islands'}, + {latLng: [17.3, -62.73], name: 'Saint Kitts and Nevis'}, + {latLng: [3.2, 73.22], name: 'Maldives'}, + {latLng: [35.88, 14.5], name: 'Malta'}, + {latLng: [12.05, -61.75], name: 'Grenada'}, + {latLng: [13.16, -61.23], name: 'Saint Vincent and the Grenadines'}, + {latLng: [13.16, -59.55], name: 'Barbados'}, + {latLng: [17.11, -61.85], name: 'Antigua and Barbuda'}, + {latLng: [-4.61, 55.45], name: 'Seychelles'}, + {latLng: [7.35, 134.46], name: 'Palau'}, + {latLng: [42.5, 1.51], name: 'Andorra'}, + {latLng: [14.01, -60.98], name: 'Saint Lucia'}, + {latLng: [6.91, 158.18], name: 'Federated States of Micronesia'}, + {latLng: [1.3, 103.8], name: 'Singapore'}, + {latLng: [1.46, 173.03], name: 'Kiribati'}, + {latLng: [-21.13, -175.2], name: 'Tonga'}, + {latLng: [15.3, -61.38], name: 'Dominica'}, + {latLng: [-20.2, 57.5], name: 'Mauritius'}, + {latLng: [26.02, 50.55], name: 'Bahrain'}, + {latLng: [0.33, 6.73], name: 'São Tomé and Príncipe'} + ] + }); + + /* SPARKLINE CHARTS + * ---------------- + * Create a inline charts with spark line + */ + + //----------------- + //- SPARKLINE BAR - + //----------------- + $('.sparkbar').each(function () { + var $this = $(this); + $this.sparkline('html', { + type: 'bar', + height: $this.data('height') ? $this.data('height') : '30', + barColor: $this.data('color') + }); + }); + + //----------------- + //- SPARKLINE PIE - + //----------------- + $('.sparkpie').each(function () { + var $this = $(this); + $this.sparkline('html', { + type: 'pie', + height: $this.data('height') ? $this.data('height') : '90', + sliceColors: $this.data('color') + }); + }); + + //------------------ + //- SPARKLINE LINE - + //------------------ + $('.sparkline').each(function () { + var $this = $(this); + $this.sparkline('html', { + type: 'line', + height: $this.data('height') ? $this.data('height') : '90', + width: '100%', + lineColor: $this.data('linecolor'), + fillColor: $this.data('fillcolor'), + spotColor: $this.data('spotcolor') + }); + }); +}); diff --git a/imagebarcode/2020.png b/imagebarcode/2020.png new file mode 100644 index 0000000..c15c092 --- /dev/null +++ b/imagebarcode/2020.png @@ -0,0 +1,46 @@ +<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'> + <html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'> + + <head> + <meta charset="utf-8"/> + <meta http-equiv="X-UA-Compatible" content="IE=edge"/> + <title>RSSA | Log in</title> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"/> + <link rel="stylesheet" href="http://localhost/antrian_rssa//theme/bootstrap/bootstrap/css/bootstrap.min.css"/> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"/> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"/> + <link rel="stylesheet" href="http://localhost/antrian_rssa//theme/bootstrap/dist/css/AdminLTE.min.css"/> + <link rel="stylesheet" href="http://localhost/antrian_rssa//theme/bootstrap/plugins/iCheck/square/blue.css"/> + </head> + <!--body class="hold-transition" background="http://localhost/antrian_rssa/img/background2.jpg"--> + <body class="hold-transition"> + <div class="login-box"> + + <div class="login-box-body"> + <div class="login-logo"> + <a href="#"><b>Antrian</b> RSSA</a> + </div> + <p class="login-box-msg">Masukan Nama User dan Password</p> + <p></p> + <form action="http://localhost/antrian_rssa/index.php/login/process" name="process" method="post"> + <div class="form-group has-feedback"> + <input name="username" class="form-control" placeholder="Nama User"/> + <span class="glyphicon glyphicon-user form-control-feedback"></span> + </div> + <div class="form-group has-feedback"> + <input name="password" type="password" class="form-control" placeholder="Password"/> + <span class="glyphicon glyphicon-lock form-control-feedback"></span> + </div> + <div class="row"> + <div class="col-xs-12"> + <input type="submit" value="Login" class="btn btn-success btn-block btn-flat" /> + </div> + </div> + </form> + </div> + </div> + <script src="http://localhost/antrian_rssa//theme/bootstrap/plugins/jQuery/jQuery-2.1.4.min.js"></script> + <script src="http://localhost/antrian_rssa//theme/bootstrap/bootstrap/js/bootstrap.min.js"></script> + <script src="http://localhost/antrian_rssa//theme/bootstrap/plugins/iCheck/icheck.min.js"></script> + </body> + </html> \ No newline at end of file diff --git a/img/DJASMIATI.jpg b/img/DJASMIATI.jpg new file mode 100644 index 0000000..a2f12c3 Binary files /dev/null and b/img/DJASMIATI.jpg differ diff --git a/img/admin.jpg b/img/admin.jpg new file mode 100644 index 0000000..1b71b57 Binary files /dev/null and b/img/admin.jpg differ diff --git a/img/admin.png b/img/admin.png new file mode 100644 index 0000000..117d5f0 Binary files /dev/null and b/img/admin.png differ diff --git a/img/ari.jpg b/img/ari.jpg new file mode 100644 index 0000000..8fceae8 Binary files /dev/null and b/img/ari.jpg differ diff --git a/img/background.jpg b/img/background.jpg new file mode 100644 index 0000000..6cbd731 Binary files /dev/null and b/img/background.jpg differ diff --git a/img/background2.jpg b/img/background2.jpg new file mode 100644 index 0000000..2ff998d Binary files /dev/null and b/img/background2.jpg differ diff --git a/img/hamigaki.jpg b/img/hamigaki.jpg new file mode 100644 index 0000000..82b6c36 Binary files /dev/null and b/img/hamigaki.jpg differ diff --git a/img/loading.gif b/img/loading.gif new file mode 100644 index 0000000..5b33f7e Binary files /dev/null and b/img/loading.gif differ diff --git a/img/logo-rssa.png b/img/logo-rssa.png new file mode 100644 index 0000000..3c945d9 Binary files /dev/null and b/img/logo-rssa.png differ diff --git a/img/logoicon.ico b/img/logoicon.ico new file mode 100644 index 0000000..84ce8cc Binary files /dev/null and b/img/logoicon.ico differ diff --git a/img/logoicon.png b/img/logoicon.png new file mode 100644 index 0000000..041012c Binary files /dev/null and b/img/logoicon.png differ diff --git a/img/logoicon2.png b/img/logoicon2.png new file mode 100644 index 0000000..913f210 Binary files /dev/null and b/img/logoicon2.png differ diff --git a/img/qowi.jpg b/img/qowi.jpg new file mode 100644 index 0000000..de08f99 Binary files /dev/null and b/img/qowi.jpg differ diff --git a/img/qowi.png b/img/qowi.png new file mode 100644 index 0000000..041012c Binary files /dev/null and b/img/qowi.png differ diff --git a/img/superadmin.jpg b/img/superadmin.jpg new file mode 100644 index 0000000..6ca23cc Binary files /dev/null and b/img/superadmin.jpg differ diff --git a/img/user icon.jpg b/img/user icon.jpg new file mode 100644 index 0000000..4cef5f3 Binary files /dev/null and b/img/user icon.jpg differ diff --git a/img/user.jpg b/img/user.jpg new file mode 100644 index 0000000..82aaa10 Binary files /dev/null and b/img/user.jpg differ diff --git a/index.php b/index.php new file mode 100644 index 0000000..6132768 --- /dev/null +++ b/index.php @@ -0,0 +1,205 @@ +<?php + +/* + *--------------------------------------------------------------- + * APPLICATION ENVIRONMENT + *--------------------------------------------------------------- + * + * You can load different configurations depending on your + * current environment. Setting the environment also influences + * things like logging and error reporting. + * + * This can be set to anything, but default usage is: + * + * development + * testing + * production + * + * NOTE: If you change these, also change the error_reporting() code below + * + */ + define('ENVIRONMENT', 'development'); +/* + *--------------------------------------------------------------- + * ERROR REPORTING + *--------------------------------------------------------------- + * + * Different environments will require different levels of error reporting. + * By default development will show errors but testing and live will hide them. + */ + +if (defined('ENVIRONMENT')) +{ + switch (ENVIRONMENT) + { + case 'development': + error_reporting(E_ALL); + break; + + case 'testing': + case 'production': + error_reporting(0); + break; + + default: + exit('The application environment is not set correctly.'); + } +} + +/* + *--------------------------------------------------------------- + * SYSTEM FOLDER NAME + *--------------------------------------------------------------- + * + * This variable must contain the name of your "system" folder. + * Include the path if the folder is not in the same directory + * as this file. + * + */ + $system_path = 'system'; + +/* + *--------------------------------------------------------------- + * APPLICATION FOLDER NAME + *--------------------------------------------------------------- + * + * If you want this front controller to use a different "application" + * folder then the default one you can set its name here. The folder + * can also be renamed or relocated anywhere on your server. If + * you do, use a full server path. For more info please see the user guide: + * http://codeigniter.com/user_guide/general/managing_apps.html + * + * NO TRAILING SLASH! + * + */ + $application_folder = 'application'; + +/* + * -------------------------------------------------------------------- + * DEFAULT CONTROLLER + * -------------------------------------------------------------------- + * + * Normally you will set your default controller in the routes.php file. + * You can, however, force a custom routing by hard-coding a + * specific controller class/function here. For most applications, you + * WILL NOT set your routing here, but it's an option for those + * special instances where you might want to override the standard + * routing in a specific front controller that shares a common CI installation. + * + * IMPORTANT: If you set the routing here, NO OTHER controller will be + * callable. In essence, this preference limits your application to ONE + * specific controller. Leave the function name blank if you need + * to call functions dynamically via the URI. + * + * Un-comment the $routing array below to use this feature + * + */ + // The directory name, relative to the "controllers" folder. Leave blank + // if your controller is not in a sub-folder within the "controllers" folder + // $routing['directory'] = ''; + + // The controller class file name. Example: Mycontroller + // $routing['controller'] = ''; + + // The controller function you wish to be called. + // $routing['function'] = ''; + + +/* + * ------------------------------------------------------------------- + * CUSTOM CONFIG VALUES + * ------------------------------------------------------------------- + * + * The $assign_to_config array below will be passed dynamically to the + * config class when initialized. This allows you to set custom config + * items or override any default config values found in the config.php file. + * This can be handy as it permits you to share one application between + * multiple front controller files, with each file containing different + * config values. + * + * Un-comment the $assign_to_config array below to use this feature + * + */ + // $assign_to_config['name_of_config_item'] = 'value of config item'; + + + +// -------------------------------------------------------------------- +// END OF USER CONFIGURABLE SETTINGS. DO NOT EDIT BELOW THIS LINE +// -------------------------------------------------------------------- + +/* + * --------------------------------------------------------------- + * Resolve the system path for increased reliability + * --------------------------------------------------------------- + */ + + // Set the current directory correctly for CLI requests + if (defined('STDIN')) + { + chdir(dirname(__FILE__)); + } + + if (realpath($system_path) !== FALSE) + { + $system_path = realpath($system_path).'/'; + } + + // ensure there's a trailing slash + $system_path = rtrim($system_path, '/').'/'; + + // Is the system path correct? + if ( ! is_dir($system_path)) + { + exit("Your system folder path does not appear to be set correctly. Please open the following file and correct this: ".pathinfo(__FILE__, PATHINFO_BASENAME)); + } + +/* + * ------------------------------------------------------------------- + * Now that we know the path, set the main path constants + * ------------------------------------------------------------------- + */ + // The name of THIS file + define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME)); + + // The PHP file extension + // this global constant is deprecated. + define('EXT', '.php'); + + // Path to the system folder + define('BASEPATH', str_replace("\\", "/", $system_path)); + + // Path to the front controller (this file) + define('FCPATH', str_replace(SELF, '', __FILE__)); + + // Name of the "system folder" + define('SYSDIR', trim(strrchr(trim(BASEPATH, '/'), '/'), '/')); + + + // The path to the "application" folder + if (is_dir($application_folder)) + { + define('APPPATH', $application_folder.'/'); + } + else + { + if ( ! is_dir(BASEPATH.$application_folder.'/')) + { + exit("Your application folder path does not appear to be set correctly. Please open the following file and correct this: ".SELF); + } + + define('APPPATH', BASEPATH.$application_folder.'/'); + } + +/* + * -------------------------------------------------------------------- + * LOAD THE BOOTSTRAP FILE + * -------------------------------------------------------------------- + * + * And away we go... + * + */ +require_once BASEPATH.'core/CodeIgniter.php'; + +/* End of file index.php */ +/* Location: ./index.php */ \ No newline at end of file diff --git a/info.php b/info.php new file mode 100644 index 0000000..69c510a --- /dev/null +++ b/info.php @@ -0,0 +1,3 @@ +<?php + phpinfo(); +?> \ No newline at end of file diff --git a/js/jquery-3.3.1.js b/js/jquery-3.3.1.js new file mode 100644 index 0000000..9b5206b --- /dev/null +++ b/js/jquery-3.3.1.js @@ -0,0 +1,10364 @@ +/*! + * jQuery JavaScript Library v3.3.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2018-01-20T17:24Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var document = window.document; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var concat = arr.concat; + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML <object> elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + return typeof obj === "function" && typeof obj.nodeType !== "number"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + + + + var preservedScriptAttributes = { + type: true, + src: true, + noModule: true + }; + + function DOMEval( code, doc, node ) { + doc = doc || document; + + var i, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + if ( node[ i ] ) { + script[ i ] = node[ i ]; + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.3.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android <=4.0 only + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && Array.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + + /* eslint-disable no-unused-vars */ + // See https://github.com/eslint/eslint/issues/6125 + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + DOMEval( code ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android <=4.0 only + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.3 + * https://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-08-08 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + disabledAncestor = addCombinator( + function( elem ) { + return elem.disabled === true && ("form" in elem || "label" in elem); + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[i] = "#" + nid + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement("fieldset"); + + try { + return !!fn( el ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + disabledAncestor( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( preferredDoc !== document && + (subWindow = document.defaultView) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( el ) { + el.className = "i"; + return !el.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( el ) { + el.appendChild( document.createComment("") ); + return !el.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID filter and find + if ( support.getById ) { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( (elem = elems[i++]) ) { + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( el ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" + + "<select id='" + expando + "-\r\\' msallowcapture=''>" + + "<option selected=''></option></select>"; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( el ) { + el.innerHTML = "<a href='' disabled='disabled'></a>" + + "<select disabled='disabled'><option/></select>"; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll(":enabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll(":disabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( el ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return (sel + "").replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( (oldCache = uniqueCache[ key ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( el ) { + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( el ) { + el.innerHTML = "<a href='#'></a>"; + return el.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( el ) { + el.innerHTML = "<input/>"; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( el ) { + return el.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( nodeName( elem, "iframe" ) ) { + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + jQuery.contains( elem.ownerDocument, elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + +var swap = function( elem, options, callback, args ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE <=9 only + option: [ 1, "<select multiple='multiple'>", "</select>" ], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting <tbody> or other required elements. + thead: [ 1, "<table>", "</table>" ], + col: [ 2, "<table><colgroup>", "</colgroup></table>" ], + tr: [ 2, "<table><tbody>", "</tbody></table>" ], + td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], + + _default: [ 0, "", "" ] +}; + +// Support: IE <=9 only +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = "<textarea>x</textarea>"; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); +var documentElement = document.documentElement; + + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 only +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + // Make a writable jQuery.Event from the native event object + var event = jQuery.event.fix( nativeEvent ); + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG <use> instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + /* eslint-disable max-len */ + + // See https://github.com/eslint/eslint/issues/3229 + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, + + /* eslint-enable */ + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /<script|<style|<link/i, + + // checked="checked" or checked + rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, + rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), doc, node ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1></$2>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + div.style.position = "absolute"; + scrollboxSizeVal = div.offsetWidth === 36 || "absolute"; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }, + + cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style; + +// Return a css property mapped to a potentially vendor prefixed property +function vendorPropName( name ) { + + // Shortcut for names that are not vendor prefixed + if ( name in emptyStyle ) { + return name; + } + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a property mapped along what jQuery.cssProps suggests or to +// a vendor prefixed property. +function finalPropName( name ) { + var ret = jQuery.cssProps[ name ]; + if ( !ret ) { + ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; + } + return ret; +} + +function setPositiveNumber( elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + ) ); + } + + return delta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + val = curCSS( elem, dimension, styles ), + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox; + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + // Check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = valueIsBorderBox && + ( support.boxSizingReliable() || val === elem.style[ dimension ] ); + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + if ( val === "auto" || + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) { + + val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ]; + + // offsetWidth/offsetHeight provide border-box values + valueIsBorderBox = true; + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + if ( type === "number" ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra && boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ); + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && support.scrollboxSize() === styles.position ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && + ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || + jQuery.cssHooks[ tween.prop ] ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue && type !== false ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = Date.now(); + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match == null ? null : match; + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + + +jQuery._evalUrl = function( url ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + "throws": true + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( "<script>" ).prop( { + charset: s.scriptCharset, + src: s.url + } ).on( + "load error", + callback = function( evt ) { + script.remove(); + callback = null; + if ( evt ) { + complete( evt.type === "error" ? 404 : 200, evt.type ); + } + } + ); + + // Use native DOM manipulation to avoid our domManip AJAX trickery + document.head.appendChild( script[ 0 ] ); + }, + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +var oldCallbacks = [], + rjsonp = /(=)\?(?=&|$)|\?\?/; + +// Default jsonp settings +jQuery.ajaxSetup( { + jsonp: "callback", + jsonpCallback: function() { + var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) ); + this[ callback ] = true; + return callback; + } +} ); + +// Detect, normalize options and install callbacks for jsonp requests +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { + + var callbackName, overwritten, responseContainer, + jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? + "url" : + typeof s.data === "string" && + ( s.contentType || "" ) + .indexOf( "application/x-www-form-urlencoded" ) === 0 && + rjsonp.test( s.data ) && "data" + ); + + // Handle iff the expected data type is "jsonp" or we have a parameter to set + if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { + + // Get callback name, remembering preexisting value associated with it + callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ? + s.jsonpCallback() : + s.jsonpCallback; + + // Insert callback into url or form data + if ( jsonProp ) { + s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); + } else if ( s.jsonp !== false ) { + s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; + } + + // Use data converter to retrieve json after script execution + s.converters[ "script json" ] = function() { + if ( !responseContainer ) { + jQuery.error( callbackName + " was not called" ); + } + return responseContainer[ 0 ]; + }; + + // Force json dataType + s.dataTypes[ 0 ] = "json"; + + // Install callback + overwritten = window[ callbackName ]; + window[ callbackName ] = function() { + responseContainer = arguments; + }; + + // Clean-up function (fires after converters) + jqXHR.always( function() { + + // If previous value didn't exist - remove it + if ( overwritten === undefined ) { + jQuery( window ).removeProp( callbackName ); + + // Otherwise restore preexisting value + } else { + window[ callbackName ] = overwritten; + } + + // Save back as free + if ( s[ callbackName ] ) { + + // Make sure that re-using the options doesn't screw things around + s.jsonpCallback = originalSettings.jsonpCallback; + + // Save the callback name for future use + oldCallbacks.push( callbackName ); + } + + // Call if it was a function and we have a response + if ( responseContainer && isFunction( overwritten ) ) { + overwritten( responseContainer[ 0 ] ); + } + + responseContainer = overwritten = undefined; + } ); + + // Delegate to script + return "script"; + } +} ); + + + + +// Support: Safari 8 only +// In Safari 8 documents created via document.implementation.createHTMLDocument +// collapse sibling forms: the second one becomes a child of the first one. +// Because of that, this security measure has to be disabled in Safari 8. +// https://bugs.webkit.org/show_bug.cgi?id=137337 +support.createHTMLDocument = ( function() { + var body = document.implementation.createHTMLDocument( "" ).body; + body.innerHTML = "<form></form><form></form>"; + return body.childNodes.length === 2; +} )(); + + +// Argument "data" should be string of html +// context (optional): If specified, the fragment will be created in this context, +// defaults to document +// keepScripts (optional): If true, will include scripts passed in the html string +jQuery.parseHTML = function( data, context, keepScripts ) { + if ( typeof data !== "string" ) { + return []; + } + if ( typeof context === "boolean" ) { + keepScripts = context; + context = false; + } + + var base, parsed, scripts; + + if ( !context ) { + + // Stop scripts or inline event handlers from being executed immediately + // by using document.implementation + if ( support.createHTMLDocument ) { + context = document.implementation.createHTMLDocument( "" ); + + // Set the base href for the created document + // so any parsed elements with URLs + // are based on the document's URL (gh-2965) + base = context.createElement( "base" ); + base.href = document.location.href; + context.head.appendChild( base ); + } else { + context = document; + } + } + + parsed = rsingleTag.exec( data ); + scripts = !keepScripts && []; + + // Single tag + if ( parsed ) { + return [ context.createElement( parsed[ 1 ] ) ]; + } + + parsed = buildFragment( [ data ], context, scripts ); + + if ( scripts && scripts.length ) { + jQuery( scripts ).remove(); + } + + return jQuery.merge( [], parsed.childNodes ); +}; + + +/** + * Load a url into a page + */ +jQuery.fn.load = function( url, params, callback ) { + var selector, type, response, + self = this, + off = url.indexOf( " " ); + + if ( off > -1 ) { + selector = stripAndCollapse( url.slice( off ) ); + url = url.slice( 0, off ); + } + + // If it's a function + if ( isFunction( params ) ) { + + // We assume that it's the callback + callback = params; + params = undefined; + + // Otherwise, build a param string + } else if ( params && typeof params === "object" ) { + type = "POST"; + } + + // If we have elements to modify, make the request + if ( self.length > 0 ) { + jQuery.ajax( { + url: url, + + // If "type" variable is undefined, then "GET" method will be used. + // Make value of this field explicit since + // user can override it through ajaxSetup method + type: type || "GET", + dataType: "html", + data: params + } ).done( function( responseText ) { + + // Save response for use in complete callback + response = arguments; + + self.html( selector ? + + // If a selector was specified, locate the right elements in a dummy div + // Exclude scripts to avoid IE 'Permission Denied' errors + jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) : + + // Otherwise use the full result + responseText ); + + // If the request succeeds, this function gets "data", "status", "jqXHR" + // but they are ignored because response was set above. + // If it fails, this function gets "jqXHR", "status", "error" + } ).always( callback && function( jqXHR, status ) { + self.each( function() { + callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] ); + } ); + } ); + } + + return this; +}; + + + + +// Attach a bunch of functions for handling common AJAX events +jQuery.each( [ + "ajaxStart", + "ajaxStop", + "ajaxComplete", + "ajaxError", + "ajaxSuccess", + "ajaxSend" +], function( i, type ) { + jQuery.fn[ type ] = function( fn ) { + return this.on( type, fn ); + }; +} ); + + + + +jQuery.expr.pseudos.animated = function( elem ) { + return jQuery.grep( jQuery.timers, function( fn ) { + return elem === fn.elem; + } ).length; +}; + + + + +jQuery.offset = { + setOffset: function( elem, options, i ) { + var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, + position = jQuery.css( elem, "position" ), + curElem = jQuery( elem ), + props = {}; + + // Set position first, in-case top/left are set even on static elem + if ( position === "static" ) { + elem.style.position = "relative"; + } + + curOffset = curElem.offset(); + curCSSTop = jQuery.css( elem, "top" ); + curCSSLeft = jQuery.css( elem, "left" ); + calculatePosition = ( position === "absolute" || position === "fixed" ) && + ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1; + + // Need to be able to calculate position if either + // top or left is auto and position is either absolute or fixed + if ( calculatePosition ) { + curPosition = curElem.position(); + curTop = curPosition.top; + curLeft = curPosition.left; + + } else { + curTop = parseFloat( curCSSTop ) || 0; + curLeft = parseFloat( curCSSLeft ) || 0; + } + + if ( isFunction( options ) ) { + + // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) + options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); + } + + if ( options.top != null ) { + props.top = ( options.top - curOffset.top ) + curTop; + } + if ( options.left != null ) { + props.left = ( options.left - curOffset.left ) + curLeft; + } + + if ( "using" in options ) { + options.using.call( elem, props ); + + } else { + curElem.css( props ); + } + } +}; + +jQuery.fn.extend( { + + // offset() relates an element's border box to the document origin + offset: function( options ) { + + // Preserve chaining for setter + if ( arguments.length ) { + return options === undefined ? + this : + this.each( function( i ) { + jQuery.offset.setOffset( this, options, i ); + } ); + } + + var rect, win, + elem = this[ 0 ]; + + if ( !elem ) { + return; + } + + // Return zeros for disconnected and hidden (display: none) elements (gh-2310) + // Support: IE <=11 only + // Running getBoundingClientRect on a + // disconnected node in IE throws an error + if ( !elem.getClientRects().length ) { + return { top: 0, left: 0 }; + } + + // Get document-relative position by adding viewport scroll to viewport-relative gBCR + rect = elem.getBoundingClientRect(); + win = elem.ownerDocument.defaultView; + return { + top: rect.top + win.pageYOffset, + left: rect.left + win.pageXOffset + }; + }, + + // position() relates an element's margin box to its offset parent's padding box + // This corresponds to the behavior of CSS absolute positioning + position: function() { + if ( !this[ 0 ] ) { + return; + } + + var offsetParent, offset, doc, + elem = this[ 0 ], + parentOffset = { top: 0, left: 0 }; + + // position:fixed elements are offset from the viewport, which itself always has zero offset + if ( jQuery.css( elem, "position" ) === "fixed" ) { + + // Assume position:fixed implies availability of getBoundingClientRect + offset = elem.getBoundingClientRect(); + + } else { + offset = this.offset(); + + // Account for the *real* offset parent, which can be the document or its root element + // when a statically positioned element is identified + doc = elem.ownerDocument; + offsetParent = elem.offsetParent || doc.documentElement; + while ( offsetParent && + ( offsetParent === doc.body || offsetParent === doc.documentElement ) && + jQuery.css( offsetParent, "position" ) === "static" ) { + + offsetParent = offsetParent.parentNode; + } + if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) { + + // Incorporate borders into its offset, since they are outside its content origin + parentOffset = jQuery( offsetParent ).offset(); + parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true ); + parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true ); + } + } + + // Subtract parent offsets and element margins + return { + top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), + left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) + }; + }, + + // This method will return documentElement in the following cases: + // 1) For the element inside the iframe without offsetParent, this method will return + // documentElement of the parent window + // 2) For the hidden or detached element + // 3) For body or html element, i.e. in case of the html node - it will return itself + // + // but those exceptions were never presented as a real life use-cases + // and might be considered as more preferable results. + // + // This logic, however, is not guaranteed and can change at any point in the future + offsetParent: function() { + return this.map( function() { + var offsetParent = this.offsetParent; + + while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) { + offsetParent = offsetParent.offsetParent; + } + + return offsetParent || documentElement; + } ); + } +} ); + +// Create scrollLeft and scrollTop methods +jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { + var top = "pageYOffset" === prop; + + jQuery.fn[ method ] = function( val ) { + return access( this, function( elem, method, val ) { + + // Coalesce documents and windows + var win; + if ( isWindow( elem ) ) { + win = elem; + } else if ( elem.nodeType === 9 ) { + win = elem.defaultView; + } + + if ( val === undefined ) { + return win ? win[ prop ] : elem[ method ]; + } + + if ( win ) { + win.scrollTo( + !top ? val : win.pageXOffset, + top ? val : win.pageYOffset + ); + + } else { + elem[ method ] = val; + } + }, method, val, arguments.length ); + }; +} ); + +// Support: Safari <=7 - 9.1, Chrome <=37 - 49 +// Add the top/left cssHooks using jQuery.fn.position +// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 +// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347 +// getComputedStyle returns percent when specified for top/left/bottom/right; +// rather than make the css module depend on the offset module, just check for it here +jQuery.each( [ "top", "left" ], function( i, prop ) { + jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, + function( elem, computed ) { + if ( computed ) { + computed = curCSS( elem, prop ); + + // If curCSS returns percentage, fallback to offset + return rnumnonpx.test( computed ) ? + jQuery( elem ).position()[ prop ] + "px" : + computed; + } + } + ); +} ); + + +// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods +jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { + jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, + function( defaultExtra, funcName ) { + + // Margin is only for outerHeight, outerWidth + jQuery.fn[ funcName ] = function( margin, value ) { + var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), + extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); + + return access( this, function( elem, type, value ) { + var doc; + + if ( isWindow( elem ) ) { + + // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729) + return funcName.indexOf( "outer" ) === 0 ? + elem[ "inner" + name ] : + elem.document.documentElement[ "client" + name ]; + } + + // Get document width or height + if ( elem.nodeType === 9 ) { + doc = elem.documentElement; + + // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], + // whichever is greatest + return Math.max( + elem.body[ "scroll" + name ], doc[ "scroll" + name ], + elem.body[ "offset" + name ], doc[ "offset" + name ], + doc[ "client" + name ] + ); + } + + return value === undefined ? + + // Get width or height on the element, requesting but not forcing parseFloat + jQuery.css( elem, type, extra ) : + + // Set width or height on the element + jQuery.style( elem, type, value, extra ); + }, type, chainable ? margin : undefined, chainable ); + }; + } ); +} ); + + +jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup contextmenu" ).split( " " ), + function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; +} ); + +jQuery.fn.extend( { + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +} ); + + + + +jQuery.fn.extend( { + + bind: function( types, data, fn ) { + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + return this.off( types, null, fn ); + }, + + delegate: function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length === 1 ? + this.off( selector, "**" ) : + this.off( types, selector || "**", fn ); + } +} ); + +// Bind a function to a context, optionally partially applying any +// arguments. +// jQuery.proxy is deprecated to promote standards (specifically Function#bind) +// However, it is not slated for removal any time soon +jQuery.proxy = function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; +}; + +jQuery.holdReady = function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } +}; +jQuery.isArray = Array.isArray; +jQuery.parseJSON = JSON.parse; +jQuery.nodeName = nodeName; +jQuery.isFunction = isFunction; +jQuery.isWindow = isWindow; +jQuery.camelCase = camelCase; +jQuery.type = toType; + +jQuery.now = Date.now; + +jQuery.isNumeric = function( obj ) { + + // As of jQuery 3.0, isNumeric is limited to + // strings and numbers (primitives or objects) + // that can be coerced to finite numbers (gh-2662) + var type = jQuery.type( obj ); + return ( type === "number" || type === "string" ) && + + // parseFloat NaNs numeric-cast false positives ("") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + !isNaN( obj - parseFloat( obj ) ); +}; + + + + +// Register as a named AMD module, since jQuery can be concatenated with other +// files that may use define, but not via a proper concatenation script that +// understands anonymous AMD modules. A named AMD is safest and most robust +// way to register. Lowercase jquery is used because AMD module names are +// derived from file names, and jQuery is normally delivered in a lowercase +// file name. Do this after creating the global so that if an AMD module wants +// to call noConflict to hide this version of jQuery, it will work. + +// Note that for maximum portability, libraries that are not jQuery should +// declare themselves as anonymous modules, and avoid setting a global if an +// AMD loader is present. jQuery is a special case. For more information, see +// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon + +if ( typeof define === "function" && define.amd ) { + define( "jquery", [], function() { + return jQuery; + } ); +} + + + + +var + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$; + +jQuery.noConflict = function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; +}; + +// Expose jQuery and $ identifiers, even in AMD +// (#7102#comment:10, https://github.com/jquery/jquery/pull/557) +// and CommonJS for browser emulators (#13566) +if ( !noGlobal ) { + window.jQuery = window.$ = jQuery; +} + + + + +return jQuery; +} ); diff --git a/js/jquery.dataTables.min.css b/js/jquery.dataTables.min.css new file mode 100644 index 0000000..6565b40 --- /dev/null +++ b/js/jquery.dataTables.min.css @@ -0,0 +1 @@ +table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;*cursor:hand;background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("../images/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("../images/sort_asc.png")}table.dataTable thead .sorting_desc{background-image:url("../images/sort_desc.png")}table.dataTable thead .sorting_asc_disabled{background-image:url("../images/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("../images/sort_desc_disabled.png")}table.dataTable tbody tr{background-color:#ffffff}table.dataTable tbody tr.selected{background-color:#B0BED9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f6f6f6}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}} diff --git a/js/jquery.dataTables.min.js b/js/jquery.dataTables.min.js new file mode 100644 index 0000000..d297f25 --- /dev/null +++ b/js/jquery.dataTables.min.js @@ -0,0 +1,180 @@ +/*! + Copyright 2008-2019 SpryMedia Ltd. + + This source file is free software, available under the following license: + MIT license - http://datatables.net/license + + This source file is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. + + For details please refer to: http://www.datatables.net + DataTables 1.10.20 + ©2008-2019 SpryMedia Ltd - datatables.net/license +*/ +var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(f,z,y){f instanceof String&&(f=String(f));for(var p=f.length,H=0;H<p;H++){var L=f[H];if(z.call(y,L,H,f))return{i:H,v:L}}return{i:-1,v:void 0}};$jscomp.ASSUME_ES5=!1;$jscomp.ASSUME_NO_NATIVE_MAP=!1;$jscomp.ASSUME_NO_NATIVE_SET=!1;$jscomp.SIMPLE_FROUND_POLYFILL=!1; +$jscomp.defineProperty=$jscomp.ASSUME_ES5||"function"==typeof Object.defineProperties?Object.defineProperty:function(f,z,y){f!=Array.prototype&&f!=Object.prototype&&(f[z]=y.value)};$jscomp.getGlobal=function(f){return"undefined"!=typeof window&&window===f?f:"undefined"!=typeof global&&null!=global?global:f};$jscomp.global=$jscomp.getGlobal(this); +$jscomp.polyfill=function(f,z,y,p){if(z){y=$jscomp.global;f=f.split(".");for(p=0;p<f.length-1;p++){var H=f[p];H in y||(y[H]={});y=y[H]}f=f[f.length-1];p=y[f];z=z(p);z!=p&&null!=z&&$jscomp.defineProperty(y,f,{configurable:!0,writable:!0,value:z})}};$jscomp.polyfill("Array.prototype.find",function(f){return f?f:function(f,y){return $jscomp.findInternal(this,f,y).v}},"es6","es3"); +(function(f){"function"===typeof define&&define.amd?define(["jquery"],function(z){return f(z,window,document)}):"object"===typeof exports?module.exports=function(z,y){z||(z=window);y||(y="undefined"!==typeof window?require("jquery"):require("jquery")(z));return f(y,z,z.document)}:f(jQuery,window,document)})(function(f,z,y,p){function H(a){var b,c,d={};f.each(a,function(e,h){(b=e.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" ")&&(c=e.replace(b[0],b[2].toLowerCase()), +d[c]=e,"o"===b[1]&&H(a[e]))});a._hungarianMap=d}function L(a,b,c){a._hungarianMap||H(a);var d;f.each(b,function(e,h){d=a._hungarianMap[e];d===p||!c&&b[d]!==p||("o"===d.charAt(0)?(b[d]||(b[d]={}),f.extend(!0,b[d],b[e]),L(a[d],b[d],c)):b[d]=b[e])})}function Ga(a){var b=q.defaults.oLanguage,c=b.sDecimal;c&&Ha(c);if(a){var d=a.sZeroRecords;!a.sEmptyTable&&d&&"No data available in table"===b.sEmptyTable&&M(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&d&&"Loading..."===b.sLoadingRecords&&M(a,a, +"sZeroRecords","sLoadingRecords");a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&c!==a&&Ha(a)}}function jb(a){F(a,"ordering","bSort");F(a,"orderMulti","bSortMulti");F(a,"orderClasses","bSortClasses");F(a,"orderCellsTop","bSortCellsTop");F(a,"order","aaSorting");F(a,"orderFixed","aaSortingFixed");F(a,"paging","bPaginate");F(a,"pagingType","sPaginationType");F(a,"pageLength","iDisplayLength");F(a,"searching","bFilter");"boolean"===typeof a.sScrollX&&(a.sScrollX=a.sScrollX?"100%": +"");"boolean"===typeof a.scrollX&&(a.scrollX=a.scrollX?"100%":"");if(a=a.aoSearchCols)for(var b=0,c=a.length;b<c;b++)a[b]&&L(q.models.oSearch,a[b])}function kb(a){F(a,"orderable","bSortable");F(a,"orderData","aDataSort");F(a,"orderSequence","asSorting");F(a,"orderDataType","sortDataType");var b=a.aDataSort;"number"!==typeof b||f.isArray(b)||(a.aDataSort=[b])}function lb(a){if(!q.__browser){var b={};q.__browser=b;var c=f("<div/>").css({position:"fixed",top:0,left:-1*f(z).scrollLeft(),height:1,width:1, +overflow:"hidden"}).append(f("<div/>").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(f("<div/>").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}f.extend(a.oBrowser,q.__browser);a.oScroll.iBarWidth=q.__browser.barWidth} +function mb(a,b,c,d,e,h){var g=!1;if(c!==p){var k=c;g=!0}for(;d!==e;)a.hasOwnProperty(d)&&(k=g?b(k,a[d],d,a):a[d],g=!0,d+=h);return k}function Ia(a,b){var c=q.defaults.column,d=a.aoColumns.length;c=f.extend({},q.models.oColumn,c,{nTh:b?b:y.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=f.extend({},q.models.oSearch,c[d]);ma(a,d,f(b).data())}function ma(a,b,c){b=a.aoColumns[b]; +var d=a.oClasses,e=f(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=e.attr("width")||null;var h=(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);h&&(b.sWidthOrig=h[1])}c!==p&&null!==c&&(kb(c),L(q.defaults.column,c,!0),c.mDataProp===p||c.mData||(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),c.sClass&&e.addClass(c.sClass),f.extend(b,c),M(b,c,"sWidth","sWidthOrig"),c.iDataSort!==p&&(b.aDataSort=[c.iDataSort]),M(b,c,"aDataSort"));var g=b.mData,k=U(g), +l=b.mRender?U(b.mRender):null;c=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};b._bAttrSrc=f.isPlainObject(g)&&(c(g.sort)||c(g.type)||c(g.filter));b._setter=null;b.fnGetData=function(a,b,c){var d=k(a,b,p,c);return l&&b?l(d,b,a,c):d};b.fnSetData=function(a,b,c){return Q(g)(a,b,c)};"number"!==typeof g&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==f.inArray("asc",b.asSorting);c=-1!==f.inArray("desc",b.asSorting);b.bSortable&&(a||c)?a&&!c?(b.sSortingClass= +d.sSortableAsc,b.sSortingClassJUI=d.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI):(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI="")}function aa(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Ja(a);for(var c=0,d=b.length;c<d;c++)b[c].nTh.style.width=b[c].sWidth}b=a.oScroll;""===b.sY&&""===b.sX||na(a);A(a,null,"column-sizing",[a])}function ba(a,b){a=oa(a,"bVisible");return"number"=== +typeof a[b]?a[b]:null}function ca(a,b){a=oa(a,"bVisible");b=f.inArray(b,a);return-1!==b?b:null}function W(a){var b=0;f.each(a.aoColumns,function(a,d){d.bVisible&&"none"!==f(d.nTh).css("display")&&b++});return b}function oa(a,b){var c=[];f.map(a.aoColumns,function(a,e){a[b]&&c.push(e)});return c}function Ka(a){var b=a.aoColumns,c=a.aoData,d=q.ext.type.detect,e,h,g;var k=0;for(e=b.length;k<e;k++){var f=b[k];var n=[];if(!f.sType&&f._sManualType)f.sType=f._sManualType;else if(!f.sType){var m=0;for(h= +d.length;m<h;m++){var w=0;for(g=c.length;w<g;w++){n[w]===p&&(n[w]=I(a,w,k,"type"));var u=d[m](n[w],a);if(!u&&m!==d.length-1)break;if("html"===u)break}if(u){f.sType=u;break}}f.sType||(f.sType="string")}}}function nb(a,b,c,d){var e,h,g,k=a.aoColumns;if(b)for(e=b.length-1;0<=e;e--){var l=b[e];var n=l.targets!==p?l.targets:l.aTargets;f.isArray(n)||(n=[n]);var m=0;for(h=n.length;m<h;m++)if("number"===typeof n[m]&&0<=n[m]){for(;k.length<=n[m];)Ia(a);d(n[m],l)}else if("number"===typeof n[m]&&0>n[m])d(k.length+ +n[m],l);else if("string"===typeof n[m]){var w=0;for(g=k.length;w<g;w++)("_all"==n[m]||f(k[w].nTh).hasClass(n[m]))&&d(w,l)}}if(c)for(e=0,a=c.length;e<a;e++)d(e,c[e])}function R(a,b,c,d){var e=a.aoData.length,h=f.extend(!0,{},q.models.oRow,{src:c?"dom":"data",idx:e});h._aData=b;a.aoData.push(h);for(var g=a.aoColumns,k=0,l=g.length;k<l;k++)g[k].sType=null;a.aiDisplayMaster.push(e);b=a.rowIdFn(b);b!==p&&(a.aIds[b]=h);!c&&a.oFeatures.bDeferRender||La(a,e,c,d);return e}function pa(a,b){var c;b instanceof +f||(b=f(b));return b.map(function(b,e){c=Ma(a,e);return R(a,c.data,e,c.cells)})}function I(a,b,c,d){var e=a.iDraw,h=a.aoColumns[c],g=a.aoData[b]._aData,k=h.sDefaultContent,f=h.fnGetData(g,d,{settings:a,row:b,col:c});if(f===p)return a.iDrawError!=e&&null===k&&(O(a,0,"Requested unknown parameter "+("function"==typeof h.mData?"{function}":"'"+h.mData+"'")+" for row "+b+", column "+c,4),a.iDrawError=e),k;if((f===g||null===f)&&null!==k&&d!==p)f=k;else if("function"===typeof f)return f.call(g);return null=== +f&&"display"==d?"":f}function ob(a,b,c,d){a.aoColumns[c].fnSetData(a.aoData[b]._aData,d,{settings:a,row:b,col:c})}function Na(a){return f.map(a.match(/(\\.|[^\.])+/g)||[""],function(a){return a.replace(/\\\./g,".")})}function U(a){if(f.isPlainObject(a)){var b={};f.each(a,function(a,c){c&&(b[a]=U(c))});return function(a,c,h,g){var d=b[c]||b._;return d!==p?d(a,c,h,g):a}}if(null===a)return function(a){return a};if("function"===typeof a)return function(b,c,h,g){return a(b,c,h,g)};if("string"!==typeof a|| +-1===a.indexOf(".")&&-1===a.indexOf("[")&&-1===a.indexOf("("))return function(b,c){return b[a]};var c=function(a,b,h){if(""!==h){var d=Na(h);for(var e=0,l=d.length;e<l;e++){h=d[e].match(da);var n=d[e].match(X);if(h){d[e]=d[e].replace(da,"");""!==d[e]&&(a=a[d[e]]);n=[];d.splice(0,e+1);d=d.join(".");if(f.isArray(a))for(e=0,l=a.length;e<l;e++)n.push(c(a[e],b,d));a=h[0].substring(1,h[0].length-1);a=""===a?n:n.join(a);break}else if(n){d[e]=d[e].replace(X,"");a=a[d[e]]();continue}if(null===a||a[d[e]]=== +p)return p;a=a[d[e]]}}return a};return function(b,e){return c(b,e,a)}}function Q(a){if(f.isPlainObject(a))return Q(a._);if(null===a)return function(){};if("function"===typeof a)return function(b,d,e){a(b,"set",d,e)};if("string"!==typeof a||-1===a.indexOf(".")&&-1===a.indexOf("[")&&-1===a.indexOf("("))return function(b,d){b[a]=d};var b=function(a,d,e){e=Na(e);var c=e[e.length-1];for(var g,k,l=0,n=e.length-1;l<n;l++){g=e[l].match(da);k=e[l].match(X);if(g){e[l]=e[l].replace(da,"");a[e[l]]=[];c=e.slice(); +c.splice(0,l+1);g=c.join(".");if(f.isArray(d))for(k=0,n=d.length;k<n;k++)c={},b(c,d[k],g),a[e[l]].push(c);else a[e[l]]=d;return}k&&(e[l]=e[l].replace(X,""),a=a[e[l]](d));if(null===a[e[l]]||a[e[l]]===p)a[e[l]]={};a=a[e[l]]}if(c.match(X))a[c.replace(X,"")](d);else a[c.replace(da,"")]=d};return function(c,d){return b(c,d,a)}}function Oa(a){return J(a.aoData,"_aData")}function qa(a){a.aoData.length=0;a.aiDisplayMaster.length=0;a.aiDisplay.length=0;a.aIds={}}function ra(a,b,c){for(var d=-1,e=0,h=a.length;e< +h;e++)a[e]==b?d=e:a[e]>b&&a[e]--; -1!=d&&c===p&&a.splice(d,1)}function ea(a,b,c,d){var e=a.aoData[b],h,g=function(c,d){for(;c.childNodes.length;)c.removeChild(c.firstChild);c.innerHTML=I(a,b,d,"display")};if("dom"!==c&&(c&&"auto"!==c||"dom"!==e.src)){var k=e.anCells;if(k)if(d!==p)g(k[d],d);else for(c=0,h=k.length;c<h;c++)g(k[c],c)}else e._aData=Ma(a,e,d,d===p?p:e._aData).data;e._aSortData=null;e._aFilterData=null;g=a.aoColumns;if(d!==p)g[d].sType=null;else{c=0;for(h=g.length;c<h;c++)g[c].sType=null; +Pa(a,e)}}function Ma(a,b,c,d){var e=[],h=b.firstChild,g,k=0,l,n=a.aoColumns,m=a._rowReadObject;d=d!==p?d:m?{}:[];var w=function(a,b){if("string"===typeof a){var c=a.indexOf("@");-1!==c&&(c=a.substring(c+1),Q(a)(d,b.getAttribute(c)))}},u=function(a){if(c===p||c===k)g=n[k],l=f.trim(a.innerHTML),g&&g._bAttrSrc?(Q(g.mData._)(d,l),w(g.mData.sort,a),w(g.mData.type,a),w(g.mData.filter,a)):m?(g._setter||(g._setter=Q(g.mData)),g._setter(d,l)):d[k]=l;k++};if(h)for(;h;){var q=h.nodeName.toUpperCase();if("TD"== +q||"TH"==q)u(h),e.push(h);h=h.nextSibling}else for(e=b.anCells,h=0,q=e.length;h<q;h++)u(e[h]);(b=b.firstChild?b:b.nTr)&&(b=b.getAttribute("id"))&&Q(a.rowId)(d,b);return{data:d,cells:e}}function La(a,b,c,d){var e=a.aoData[b],h=e._aData,g=[],k,l;if(null===e.nTr){var n=c||y.createElement("tr");e.nTr=n;e.anCells=g;n._DT_RowIndex=b;Pa(a,e);var m=0;for(k=a.aoColumns.length;m<k;m++){var w=a.aoColumns[m];var p=(l=c?!1:!0)?y.createElement(w.sCellType):d[m];p._DT_CellIndex={row:b,column:m};g.push(p);if(l|| +!(c&&!w.mRender&&w.mData===m||f.isPlainObject(w.mData)&&w.mData._===m+".display"))p.innerHTML=I(a,b,m,"display");w.sClass&&(p.className+=" "+w.sClass);w.bVisible&&!c?n.appendChild(p):!w.bVisible&&c&&p.parentNode.removeChild(p);w.fnCreatedCell&&w.fnCreatedCell.call(a.oInstance,p,I(a,b,m),h,b,m)}A(a,"aoRowCreatedCallback",null,[n,h,b,g])}e.nTr.setAttribute("role","row")}function Pa(a,b){var c=b.nTr,d=b._aData;if(c){if(a=a.rowIdFn(d))c.id=a;d.DT_RowClass&&(a=d.DT_RowClass.split(" "),b.__rowc=b.__rowc? +ta(b.__rowc.concat(a)):a,f(c).removeClass(b.__rowc.join(" ")).addClass(d.DT_RowClass));d.DT_RowAttr&&f(c).attr(d.DT_RowAttr);d.DT_RowData&&f(c).data(d.DT_RowData)}}function pb(a){var b,c,d=a.nTHead,e=a.nTFoot,h=0===f("th, td",d).length,g=a.oClasses,k=a.aoColumns;h&&(c=f("<tr/>").appendTo(d));var l=0;for(b=k.length;l<b;l++){var n=k[l];var m=f(n.nTh).addClass(n.sClass);h&&m.appendTo(c);a.oFeatures.bSort&&(m.addClass(n.sSortingClass),!1!==n.bSortable&&(m.attr("tabindex",a.iTabIndex).attr("aria-controls", +a.sTableId),Qa(a,n.nTh,l)));n.sTitle!=m[0].innerHTML&&m.html(n.sTitle);Ra(a,"header")(a,m,n,g)}h&&fa(a.aoHeader,d);f(d).find(">tr").attr("role","row");f(d).find(">tr>th, >tr>td").addClass(g.sHeaderTH);f(e).find(">tr>th, >tr>td").addClass(g.sFooterTH);if(null!==e)for(a=a.aoFooter[0],l=0,b=a.length;l<b;l++)n=k[l],n.nTf=a[l].cell,n.sClass&&f(n.nTf).addClass(n.sClass)}function ha(a,b,c){var d,e,h=[],g=[],k=a.aoColumns.length;if(b){c===p&&(c=!1);var l=0;for(d=b.length;l<d;l++){h[l]=b[l].slice();h[l].nTr= +b[l].nTr;for(e=k-1;0<=e;e--)a.aoColumns[e].bVisible||c||h[l].splice(e,1);g.push([])}l=0;for(d=h.length;l<d;l++){if(a=h[l].nTr)for(;e=a.firstChild;)a.removeChild(e);e=0;for(b=h[l].length;e<b;e++){var n=k=1;if(g[l][e]===p){a.appendChild(h[l][e].cell);for(g[l][e]=1;h[l+k]!==p&&h[l][e].cell==h[l+k][e].cell;)g[l+k][e]=1,k++;for(;h[l][e+n]!==p&&h[l][e].cell==h[l][e+n].cell;){for(c=0;c<k;c++)g[l+c][e+n]=1;n++}f(h[l][e].cell).attr("rowspan",k).attr("colspan",n)}}}}}function S(a){var b=A(a,"aoPreDrawCallback", +"preDraw",[a]);if(-1!==f.inArray(!1,b))K(a,!1);else{b=[];var c=0,d=a.asStripeClasses,e=d.length,h=a.oLanguage,g=a.iInitDisplayStart,k="ssp"==D(a),l=a.aiDisplay;a.bDrawing=!0;g!==p&&-1!==g&&(a._iDisplayStart=k?g:g>=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=-1);g=a._iDisplayStart;var n=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,K(a,!1);else if(!k)a.iDraw++;else if(!a.bDestroying&&!qb(a))return;if(0!==l.length)for(h=k?a.aoData.length:n,k=k?0:g;k<h;k++){var m=l[k],w=a.aoData[m]; +null===w.nTr&&La(a,m);var u=w.nTr;if(0!==e){var q=d[c%e];w._sRowStripe!=q&&(f(u).removeClass(w._sRowStripe).addClass(q),w._sRowStripe=q)}A(a,"aoRowCallback",null,[u,w._aData,c,k,m]);b.push(u);c++}else c=h.sZeroRecords,1==a.iDraw&&"ajax"==D(a)?c=h.sLoadingRecords:h.sEmptyTable&&0===a.fnRecordsTotal()&&(c=h.sEmptyTable),b[0]=f("<tr/>",{"class":e?d[0]:""}).append(f("<td />",{valign:"top",colSpan:W(a),"class":a.oClasses.sRowEmpty}).html(c))[0];A(a,"aoHeaderCallback","header",[f(a.nTHead).children("tr")[0], +Oa(a),g,n,l]);A(a,"aoFooterCallback","footer",[f(a.nTFoot).children("tr")[0],Oa(a),g,n,l]);d=f(a.nTBody);d.children().detach();d.append(f(b));A(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function V(a,b){var c=a.oFeatures,d=c.bFilter;c.bSort&&rb(a);d?ia(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;S(a);a._drawHold=!1}function sb(a){var b=a.oClasses,c=f(a.nTable);c=f("<div/>").insertBefore(c);var d=a.oFeatures,e= +f("<div/>",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var h=a.sDom.split(""),g,k,l,n,m,p,u=0;u<h.length;u++){g=null;k=h[u];if("<"==k){l=f("<div/>")[0];n=h[u+1];if("'"==n||'"'==n){m="";for(p=2;h[u+p]!=n;)m+=h[u+p],p++;"H"==m?m=b.sJUIHeader:"F"==m&&(m=b.sJUIFooter);-1!=m.indexOf(".")?(n=m.split("."),l.id=n[0].substr(1,n[0].length-1),l.className=n[1]):"#"==m.charAt(0)?l.id=m.substr(1, +m.length-1):l.className=m;u+=p}e.append(l);e=f(l)}else if(">"==k)e=e.parent();else if("l"==k&&d.bPaginate&&d.bLengthChange)g=tb(a);else if("f"==k&&d.bFilter)g=ub(a);else if("r"==k&&d.bProcessing)g=vb(a);else if("t"==k)g=wb(a);else if("i"==k&&d.bInfo)g=xb(a);else if("p"==k&&d.bPaginate)g=yb(a);else if(0!==q.ext.feature.length)for(l=q.ext.feature,p=0,n=l.length;p<n;p++)if(k==l[p].cFeature){g=l[p].fnInit(a);break}g&&(l=a.aanFeatures,l[k]||(l[k]=[]),l[k].push(g),e.append(g))}c.replaceWith(e);a.nHolding= +null}function fa(a,b){b=f(b).children("tr");var c,d,e;a.splice(0,a.length);var h=0;for(e=b.length;h<e;h++)a.push([]);h=0;for(e=b.length;h<e;h++){var g=b[h];for(c=g.firstChild;c;){if("TD"==c.nodeName.toUpperCase()||"TH"==c.nodeName.toUpperCase()){var k=1*c.getAttribute("colspan");var l=1*c.getAttribute("rowspan");k=k&&0!==k&&1!==k?k:1;l=l&&0!==l&&1!==l?l:1;var n=0;for(d=a[h];d[n];)n++;var m=n;var p=1===k?!0:!1;for(d=0;d<k;d++)for(n=0;n<l;n++)a[h+n][m+d]={cell:c,unique:p},a[h+n].nTr=g}c=c.nextSibling}}} +function ua(a,b,c){var d=[];c||(c=a.aoHeader,b&&(c=[],fa(c,b)));b=0;for(var e=c.length;b<e;b++)for(var h=0,g=c[b].length;h<g;h++)!c[b][h].unique||d[h]&&a.bSortCellsTop||(d[h]=c[b][h].cell);return d}function va(a,b,c){A(a,"aoServerParams","serverParams",[b]);if(b&&f.isArray(b)){var d={},e=/(.*?)\[\]$/;f.each(b,function(a,b){(a=b.name.match(e))?(a=a[0],d[a]||(d[a]=[]),d[a].push(b.value)):d[b.name]=b.value});b=d}var h=a.ajax,g=a.oInstance,k=function(b){A(a,null,"xhr",[a,b,a.jqXHR]);c(b)};if(f.isPlainObject(h)&& +h.data){var l=h.data;var n="function"===typeof l?l(b,a):l;b="function"===typeof l&&n?n:f.extend(!0,b,n);delete h.data}n={data:b,success:function(b){var c=b.error||b.sError;c&&O(a,0,c);a.json=b;k(b)},dataType:"json",cache:!1,type:a.sServerMethod,error:function(b,c,d){d=A(a,null,"xhr",[a,null,a.jqXHR]);-1===f.inArray(!0,d)&&("parsererror"==c?O(a,0,"Invalid JSON response",1):4===b.readyState&&O(a,0,"Ajax error",7));K(a,!1)}};a.oAjaxData=b;A(a,null,"preXhr",[a,b]);a.fnServerData?a.fnServerData.call(g, +a.sAjaxSource,f.map(b,function(a,b){return{name:b,value:a}}),k,a):a.sAjaxSource||"string"===typeof h?a.jqXHR=f.ajax(f.extend(n,{url:h||a.sAjaxSource})):"function"===typeof h?a.jqXHR=h.call(g,b,k,a):(a.jqXHR=f.ajax(f.extend(n,h)),h.data=l)}function qb(a){return a.bAjaxDataGet?(a.iDraw++,K(a,!0),va(a,zb(a),function(b){Ab(a,b)}),!1):!0}function zb(a){var b=a.aoColumns,c=b.length,d=a.oFeatures,e=a.oPreviousSearch,h=a.aoPreSearchCols,g=[],k=Y(a);var l=a._iDisplayStart;var n=!1!==d.bPaginate?a._iDisplayLength: +-1;var m=function(a,b){g.push({name:a,value:b})};m("sEcho",a.iDraw);m("iColumns",c);m("sColumns",J(b,"sName").join(","));m("iDisplayStart",l);m("iDisplayLength",n);var p={draw:a.iDraw,columns:[],order:[],start:l,length:n,search:{value:e.sSearch,regex:e.bRegex}};for(l=0;l<c;l++){var u=b[l];var sa=h[l];n="function"==typeof u.mData?"function":u.mData;p.columns.push({data:n,name:u.sName,searchable:u.bSearchable,orderable:u.bSortable,search:{value:sa.sSearch,regex:sa.bRegex}});m("mDataProp_"+l,n);d.bFilter&& +(m("sSearch_"+l,sa.sSearch),m("bRegex_"+l,sa.bRegex),m("bSearchable_"+l,u.bSearchable));d.bSort&&m("bSortable_"+l,u.bSortable)}d.bFilter&&(m("sSearch",e.sSearch),m("bRegex",e.bRegex));d.bSort&&(f.each(k,function(a,b){p.order.push({column:b.col,dir:b.dir});m("iSortCol_"+a,b.col);m("sSortDir_"+a,b.dir)}),m("iSortingCols",k.length));b=q.ext.legacy.ajax;return null===b?a.sAjaxSource?g:p:b?g:p}function Ab(a,b){var c=function(a,c){return b[a]!==p?b[a]:b[c]},d=wa(a,b),e=c("sEcho","draw"),h=c("iTotalRecords", +"recordsTotal");c=c("iTotalDisplayRecords","recordsFiltered");if(e){if(1*e<a.iDraw)return;a.iDraw=1*e}qa(a);a._iRecordsTotal=parseInt(h,10);a._iRecordsDisplay=parseInt(c,10);e=0;for(h=d.length;e<h;e++)R(a,d[e]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=!1;S(a);a._bInitComplete||xa(a,b);a.bAjaxDataGet=!0;K(a,!1)}function wa(a,b){a=f.isPlainObject(a.ajax)&&a.ajax.dataSrc!==p?a.ajax.dataSrc:a.sAjaxDataProp;return"data"===a?b.aaData||b[a]:""!==a?U(a)(b):b}function ub(a){var b=a.oClasses,c= +a.sTableId,d=a.oLanguage,e=a.oPreviousSearch,h=a.aanFeatures,g='<input type="search" class="'+b.sFilterInput+'"/>',k=d.sSearch;k=k.match(/_INPUT_/)?k.replace("_INPUT_",g):k+g;b=f("<div/>",{id:h.f?null:c+"_filter","class":b.sFilter}).append(f("<label/>").append(k));h=function(){var b=this.value?this.value:"";b!=e.sSearch&&(ia(a,{sSearch:b,bRegex:e.bRegex,bSmart:e.bSmart,bCaseInsensitive:e.bCaseInsensitive}),a._iDisplayStart=0,S(a))};g=null!==a.searchDelay?a.searchDelay:"ssp"===D(a)?400:0;var l=f("input", +b).val(e.sSearch).attr("placeholder",d.sSearchPlaceholder).on("keyup.DT search.DT input.DT paste.DT cut.DT",g?Sa(h,g):h).on("keypress.DT",function(a){if(13==a.keyCode)return!1}).attr("aria-controls",c);f(a.nTable).on("search.dt.DT",function(b,c){if(a===c)try{l[0]!==y.activeElement&&l.val(e.sSearch)}catch(w){}});return b[0]}function ia(a,b,c){var d=a.oPreviousSearch,e=a.aoPreSearchCols,h=function(a){d.sSearch=a.sSearch;d.bRegex=a.bRegex;d.bSmart=a.bSmart;d.bCaseInsensitive=a.bCaseInsensitive},g=function(a){return a.bEscapeRegex!== +p?!a.bEscapeRegex:a.bRegex};Ka(a);if("ssp"!=D(a)){Bb(a,b.sSearch,c,g(b),b.bSmart,b.bCaseInsensitive);h(b);for(b=0;b<e.length;b++)Cb(a,e[b].sSearch,b,g(e[b]),e[b].bSmart,e[b].bCaseInsensitive);Db(a)}else h(b);a.bFiltered=!0;A(a,null,"search",[a])}function Db(a){for(var b=q.ext.search,c=a.aiDisplay,d,e,h=0,g=b.length;h<g;h++){for(var k=[],l=0,n=c.length;l<n;l++)e=c[l],d=a.aoData[e],b[h](a,d._aFilterData,e,d._aData,l)&&k.push(e);c.length=0;f.merge(c,k)}}function Cb(a,b,c,d,e,h){if(""!==b){var g=[],k= +a.aiDisplay;d=Ta(b,d,e,h);for(e=0;e<k.length;e++)b=a.aoData[k[e]]._aFilterData[c],d.test(b)&&g.push(k[e]);a.aiDisplay=g}}function Bb(a,b,c,d,e,h){e=Ta(b,d,e,h);var g=a.oPreviousSearch.sSearch,k=a.aiDisplayMaster;h=[];0!==q.ext.search.length&&(c=!0);var f=Eb(a);if(0>=b.length)a.aiDisplay=k.slice();else{if(f||c||d||g.length>b.length||0!==b.indexOf(g)||a.bSorted)a.aiDisplay=k.slice();b=a.aiDisplay;for(c=0;c<b.length;c++)e.test(a.aoData[b[c]]._sFilterRow)&&h.push(b[c]);a.aiDisplay=h}}function Ta(a,b, +c,d){a=b?a:Ua(a);c&&(a="^(?=.*?"+f.map(a.match(/"[^"]+"|[^ ]+/g)||[""],function(a){if('"'===a.charAt(0)){var b=a.match(/^"(.*)"$/);a=b?b[1]:a}return a.replace('"',"")}).join(")(?=.*?")+").*$");return new RegExp(a,d?"i":"")}function Eb(a){var b=a.aoColumns,c,d,e=q.ext.type.search;var h=!1;var g=0;for(c=a.aoData.length;g<c;g++){var k=a.aoData[g];if(!k._aFilterData){var f=[];var n=0;for(d=b.length;n<d;n++){h=b[n];if(h.bSearchable){var m=I(a,g,n,"filter");e[h.sType]&&(m=e[h.sType](m));null===m&&(m=""); +"string"!==typeof m&&m.toString&&(m=m.toString())}else m="";m.indexOf&&-1!==m.indexOf("&")&&(ya.innerHTML=m,m=$b?ya.textContent:ya.innerText);m.replace&&(m=m.replace(/[\r\n\u2028]/g,""));f.push(m)}k._aFilterData=f;k._sFilterRow=f.join(" ");h=!0}}return h}function Fb(a){return{search:a.sSearch,smart:a.bSmart,regex:a.bRegex,caseInsensitive:a.bCaseInsensitive}}function Gb(a){return{sSearch:a.search,bSmart:a.smart,bRegex:a.regex,bCaseInsensitive:a.caseInsensitive}}function xb(a){var b=a.sTableId,c=a.aanFeatures.i, +d=f("<div/>",{"class":a.oClasses.sInfo,id:c?null:b+"_info"});c||(a.aoDrawCallback.push({fn:Hb,sName:"information"}),d.attr("role","status").attr("aria-live","polite"),f(a.nTable).attr("aria-describedby",b+"_info"));return d[0]}function Hb(a){var b=a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage,d=a._iDisplayStart+1,e=a.fnDisplayEnd(),h=a.fnRecordsTotal(),g=a.fnRecordsDisplay(),k=g?c.sInfo:c.sInfoEmpty;g!==h&&(k+=" "+c.sInfoFiltered);k+=c.sInfoPostFix;k=Ib(a,k);c=c.fnInfoCallback;null!==c&&(k=c.call(a.oInstance, +a,d,e,h,g,k));f(b).html(k)}}function Ib(a,b){var c=a.fnFormatNumber,d=a._iDisplayStart+1,e=a._iDisplayLength,h=a.fnRecordsDisplay(),g=-1===e;return b.replace(/_START_/g,c.call(a,d)).replace(/_END_/g,c.call(a,a.fnDisplayEnd())).replace(/_MAX_/g,c.call(a,a.fnRecordsTotal())).replace(/_TOTAL_/g,c.call(a,h)).replace(/_PAGE_/g,c.call(a,g?1:Math.ceil(d/e))).replace(/_PAGES_/g,c.call(a,g?1:Math.ceil(h/e)))}function ja(a){var b=a.iInitDisplayStart,c=a.aoColumns;var d=a.oFeatures;var e=a.bDeferLoading;if(a.bInitialised){sb(a); +pb(a);ha(a,a.aoHeader);ha(a,a.aoFooter);K(a,!0);d.bAutoWidth&&Ja(a);var h=0;for(d=c.length;h<d;h++){var g=c[h];g.sWidth&&(g.nTh.style.width=B(g.sWidth))}A(a,null,"preInit",[a]);V(a);c=D(a);if("ssp"!=c||e)"ajax"==c?va(a,[],function(c){var d=wa(a,c);for(h=0;h<d.length;h++)R(a,d[h]);a.iInitDisplayStart=b;V(a);K(a,!1);xa(a,c)},a):(K(a,!1),xa(a))}else setTimeout(function(){ja(a)},200)}function xa(a,b){a._bInitComplete=!0;(b||a.oInit.aaData)&&aa(a);A(a,null,"plugin-init",[a,b]);A(a,"aoInitComplete","init", +[a,b])}function Va(a,b){b=parseInt(b,10);a._iDisplayLength=b;Wa(a);A(a,null,"length",[a,b])}function tb(a){var b=a.oClasses,c=a.sTableId,d=a.aLengthMenu,e=f.isArray(d[0]),h=e?d[0]:d;d=e?d[1]:d;e=f("<select/>",{name:c+"_length","aria-controls":c,"class":b.sLengthSelect});for(var g=0,k=h.length;g<k;g++)e[0][g]=new Option("number"===typeof d[g]?a.fnFormatNumber(d[g]):d[g],h[g]);var l=f("<div><label/></div>").addClass(b.sLength);a.aanFeatures.l||(l[0].id=c+"_length");l.children().append(a.oLanguage.sLengthMenu.replace("_MENU_", +e[0].outerHTML));f("select",l).val(a._iDisplayLength).on("change.DT",function(b){Va(a,f(this).val());S(a)});f(a.nTable).on("length.dt.DT",function(b,c,d){a===c&&f("select",l).val(d)});return l[0]}function yb(a){var b=a.sPaginationType,c=q.ext.pager[b],d="function"===typeof c,e=function(a){S(a)};b=f("<div/>").addClass(a.oClasses.sPaging+b)[0];var h=a.aanFeatures;d||c.fnInit(a,b,e);h.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(a){if(d){var b=a._iDisplayStart,g=a._iDisplayLength, +f=a.fnRecordsDisplay(),m=-1===g;b=m?0:Math.ceil(b/g);g=m?1:Math.ceil(f/g);f=c(b,g);var p;m=0;for(p=h.p.length;m<p;m++)Ra(a,"pageButton")(a,h.p[m],m,f,b,g)}else c.fnUpdate(a,e)},sName:"pagination"}));return b}function Xa(a,b,c){var d=a._iDisplayStart,e=a._iDisplayLength,h=a.fnRecordsDisplay();0===h||-1===e?d=0:"number"===typeof b?(d=b*e,d>h&&(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"==b?d+e<h&&(d+=e):"last"==b?d=Math.floor((h-1)/e)*e:O(a,0,"Unknown paging action: "+b,5);b= +a._iDisplayStart!==d;a._iDisplayStart=d;b&&(A(a,null,"page",[a]),c&&S(a));return b}function vb(a){return f("<div/>",{id:a.aanFeatures.r?null:a.sTableId+"_processing","class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function K(a,b){a.oFeatures.bProcessing&&f(a.aanFeatures.r).css("display",b?"block":"none");A(a,null,"processing",[a,b])}function wb(a){var b=f(a.nTable);b.attr("role","grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY, +h=a.oClasses,g=b.children("caption"),k=g.length?g[0]._captionSide:null,l=f(b[0].cloneNode(!1)),n=f(b[0].cloneNode(!1)),m=b.children("tfoot");m.length||(m=null);l=f("<div/>",{"class":h.sScrollWrapper}).append(f("<div/>",{"class":h.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?d?B(d):null:"100%"}).append(f("<div/>",{"class":h.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||"100%"}).append(l.removeAttr("id").css("margin-left",0).append("top"===k?g:null).append(b.children("thead"))))).append(f("<div/>", +{"class":h.sScrollBody}).css({position:"relative",overflow:"auto",width:d?B(d):null}).append(b));m&&l.append(f("<div/>",{"class":h.sScrollFoot}).css({overflow:"hidden",border:0,width:d?d?B(d):null:"100%"}).append(f("<div/>",{"class":h.sScrollFootInner}).append(n.removeAttr("id").css("margin-left",0).append("bottom"===k?g:null).append(b.children("tfoot")))));b=l.children();var p=b[0];h=b[1];var u=m?b[2]:null;if(d)f(h).on("scroll.DT",function(a){a=this.scrollLeft;p.scrollLeft=a;m&&(u.scrollLeft=a)}); +f(h).css(e&&c.bCollapse?"max-height":"height",e);a.nScrollHead=p;a.nScrollBody=h;a.nScrollFoot=u;a.aoDrawCallback.push({fn:na,sName:"scrolling"});return l[0]}function na(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY;b=b.iBarWidth;var h=f(a.nScrollHead),g=h[0].style,k=h.children("div"),l=k[0].style,n=k.children("table");k=a.nScrollBody;var m=f(k),w=k.style,u=f(a.nScrollFoot).children("div"),q=u.children("table"),t=f(a.nTHead),r=f(a.nTable),v=r[0],za=v.style,T=a.nTFoot?f(a.nTFoot):null,A=a.oBrowser, +x=A.bScrollOversize,ac=J(a.aoColumns,"nTh"),Ya=[],y=[],z=[],C=[],G,H=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};var D=k.scrollHeight>k.clientHeight;if(a.scrollBarVis!==D&&a.scrollBarVis!==p)a.scrollBarVis=D,aa(a);else{a.scrollBarVis=D;r.children("thead, tfoot").remove();if(T){var E=T.clone().prependTo(r);var F=T.find("tr");E=E.find("tr")}var I=t.clone().prependTo(r);t=t.find("tr");D=I.find("tr");I.find("th, td").removeAttr("tabindex"); +c||(w.width="100%",h[0].style.width="100%");f.each(ua(a,I),function(b,c){G=ba(a,b);c.style.width=a.aoColumns[G].sWidth});T&&N(function(a){a.style.width=""},E);h=r.outerWidth();""===c?(za.width="100%",x&&(r.find("tbody").height()>k.offsetHeight||"scroll"==m.css("overflow-y"))&&(za.width=B(r.outerWidth()-b)),h=r.outerWidth()):""!==d&&(za.width=B(d),h=r.outerWidth());N(H,D);N(function(a){z.push(a.innerHTML);Ya.push(B(f(a).css("width")))},D);N(function(a,b){-1!==f.inArray(a,ac)&&(a.style.width=Ya[b])}, +t);f(D).height(0);T&&(N(H,E),N(function(a){C.push(a.innerHTML);y.push(B(f(a).css("width")))},E),N(function(a,b){a.style.width=y[b]},F),f(E).height(0));N(function(a,b){a.innerHTML='<div class="dataTables_sizing">'+z[b]+"</div>";a.childNodes[0].style.height="0";a.childNodes[0].style.overflow="hidden";a.style.width=Ya[b]},D);T&&N(function(a,b){a.innerHTML='<div class="dataTables_sizing">'+C[b]+"</div>";a.childNodes[0].style.height="0";a.childNodes[0].style.overflow="hidden";a.style.width=y[b]},E);r.outerWidth()< +h?(F=k.scrollHeight>k.offsetHeight||"scroll"==m.css("overflow-y")?h+b:h,x&&(k.scrollHeight>k.offsetHeight||"scroll"==m.css("overflow-y"))&&(za.width=B(F-b)),""!==c&&""===d||O(a,1,"Possible column misalignment",6)):F="100%";w.width=B(F);g.width=B(F);T&&(a.nScrollFoot.style.width=B(F));!e&&x&&(w.height=B(v.offsetHeight+b));c=r.outerWidth();n[0].style.width=B(c);l.width=B(c);d=r.height()>k.clientHeight||"scroll"==m.css("overflow-y");e="padding"+(A.bScrollbarLeft?"Left":"Right");l[e]=d?b+"px":"0px";T&& +(q[0].style.width=B(c),u[0].style.width=B(c),u[0].style[e]=d?b+"px":"0px");r.children("colgroup").insertBefore(r.children("thead"));m.trigger("scroll");!a.bSorted&&!a.bFiltered||a._drawHold||(k.scrollTop=0)}}function N(a,b,c){for(var d=0,e=0,h=b.length,g,k;e<h;){g=b[e].firstChild;for(k=c?c[e].firstChild:null;g;)1===g.nodeType&&(c?a(g,k,d):a(g,d),d++),g=g.nextSibling,k=c?k.nextSibling:null;e++}}function Ja(a){var b=a.nTable,c=a.aoColumns,d=a.oScroll,e=d.sY,h=d.sX,g=d.sXInner,k=c.length,l=oa(a,"bVisible"), +n=f("th",a.nTHead),m=b.getAttribute("width"),p=b.parentNode,u=!1,q,t=a.oBrowser;d=t.bScrollOversize;(q=b.style.width)&&-1!==q.indexOf("%")&&(m=q);for(q=0;q<l.length;q++){var r=c[l[q]];null!==r.sWidth&&(r.sWidth=Jb(r.sWidthOrig,p),u=!0)}if(d||!u&&!h&&!e&&k==W(a)&&k==n.length)for(q=0;q<k;q++)l=ba(a,q),null!==l&&(c[l].sWidth=B(n.eq(q).width()));else{k=f(b).clone().css("visibility","hidden").removeAttr("id");k.find("tbody tr").remove();var v=f("<tr/>").appendTo(k.find("tbody"));k.find("thead, tfoot").remove(); +k.append(f(a.nTHead).clone()).append(f(a.nTFoot).clone());k.find("tfoot th, tfoot td").css("width","");n=ua(a,k.find("thead")[0]);for(q=0;q<l.length;q++)r=c[l[q]],n[q].style.width=null!==r.sWidthOrig&&""!==r.sWidthOrig?B(r.sWidthOrig):"",r.sWidthOrig&&h&&f(n[q]).append(f("<div/>").css({width:r.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(q=0;q<l.length;q++)u=l[q],r=c[u],f(Kb(a,u)).clone(!1).append(r.sContentPadding).appendTo(v);f("[name]",k).removeAttr("name");r=f("<div/>").css(h|| +e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(k).appendTo(p);h&&g?k.width(g):h?(k.css("width","auto"),k.removeAttr("width"),k.width()<p.clientWidth&&m&&k.width(p.clientWidth)):e?k.width(p.clientWidth):m&&k.width(m);for(q=e=0;q<l.length;q++)p=f(n[q]),g=p.outerWidth()-p.width(),p=t.bBounding?Math.ceil(n[q].getBoundingClientRect().width):p.outerWidth(),e+=p,c[l[q]].sWidth=B(p-g);b.style.width=B(e);r.remove()}m&&(b.style.width=B(m));!m&&!h||a._reszEvt||(b=function(){f(z).on("resize.DT-"+ +a.sInstance,Sa(function(){aa(a)}))},d?setTimeout(b,1E3):b(),a._reszEvt=!0)}function Jb(a,b){if(!a)return 0;a=f("<div/>").css("width",B(a)).appendTo(b||y.body);b=a[0].offsetWidth;a.remove();return b}function Kb(a,b){var c=Lb(a,b);if(0>c)return null;var d=a.aoData[c];return d.nTr?d.anCells[b]:f("<td/>").html(I(a,c,b,"display"))[0]}function Lb(a,b){for(var c,d=-1,e=-1,h=0,g=a.aoData.length;h<g;h++)c=I(a,h,b,"display")+"",c=c.replace(bc,""),c=c.replace(/&nbsp;/g," "),c.length>d&&(d=c.length,e=h);return e} +function B(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function Y(a){var b=[],c=a.aoColumns;var d=a.aaSortingFixed;var e=f.isPlainObject(d);var h=[];var g=function(a){a.length&&!f.isArray(a[0])?h.push(a):f.merge(h,a)};f.isArray(d)&&g(d);e&&d.pre&&g(d.pre);g(a.aaSorting);e&&d.post&&g(d.post);for(a=0;a<h.length;a++){var k=h[a][0];g=c[k].aDataSort;d=0;for(e=g.length;d<e;d++){var l=g[d];var n=c[l].sType||"string";h[a]._idx===p&&(h[a]._idx=f.inArray(h[a][1],c[l].asSorting)); +b.push({src:k,col:l,dir:h[a][1],index:h[a]._idx,type:n,formatter:q.ext.type.order[n+"-pre"]})}}return b}function rb(a){var b,c=[],d=q.ext.type.order,e=a.aoData,h=0,g=a.aiDisplayMaster;Ka(a);var k=Y(a);var f=0;for(b=k.length;f<b;f++){var n=k[f];n.formatter&&h++;Mb(a,n.col)}if("ssp"!=D(a)&&0!==k.length){f=0;for(b=g.length;f<b;f++)c[g[f]]=f;h===k.length?g.sort(function(a,b){var d,h=k.length,g=e[a]._aSortData,f=e[b]._aSortData;for(d=0;d<h;d++){var l=k[d];var m=g[l.col];var n=f[l.col];m=m<n?-1:m>n?1:0; +if(0!==m)return"asc"===l.dir?m:-m}m=c[a];n=c[b];return m<n?-1:m>n?1:0}):g.sort(function(a,b){var h,g=k.length,f=e[a]._aSortData,l=e[b]._aSortData;for(h=0;h<g;h++){var m=k[h];var n=f[m.col];var p=l[m.col];m=d[m.type+"-"+m.dir]||d["string-"+m.dir];n=m(n,p);if(0!==n)return n}n=c[a];p=c[b];return n<p?-1:n>p?1:0})}a.bSorted=!0}function Nb(a){var b=a.aoColumns,c=Y(a);a=a.oLanguage.oAria;for(var d=0,e=b.length;d<e;d++){var h=b[d];var g=h.asSorting;var k=h.sTitle.replace(/<.*?>/g,"");var f=h.nTh;f.removeAttribute("aria-sort"); +h.bSortable&&(0<c.length&&c[0].col==d?(f.setAttribute("aria-sort","asc"==c[0].dir?"ascending":"descending"),h=g[c[0].index+1]||g[0]):h=g[0],k+="asc"===h?a.sSortAscending:a.sSortDescending);f.setAttribute("aria-label",k)}}function Za(a,b,c,d){var e=a.aaSorting,h=a.aoColumns[b].asSorting,g=function(a,b){var c=a._idx;c===p&&(c=f.inArray(a[1],h));return c+1<h.length?c+1:b?null:0};"number"===typeof e[0]&&(e=a.aaSorting=[e]);c&&a.oFeatures.bSortMulti?(c=f.inArray(b,J(e,"0")),-1!==c?(b=g(e[c],!0),null=== +b&&1===e.length&&(b=0),null===b?e.splice(c,1):(e[c][1]=h[b],e[c]._idx=b)):(e.push([b,h[0],0]),e[e.length-1]._idx=0)):e.length&&e[0][0]==b?(b=g(e[0]),e.length=1,e[0][1]=h[b],e[0]._idx=b):(e.length=0,e.push([b,h[0]]),e[0]._idx=0);V(a);"function"==typeof d&&d(a)}function Qa(a,b,c,d){var e=a.aoColumns[c];$a(b,{},function(b){!1!==e.bSortable&&(a.oFeatures.bProcessing?(K(a,!0),setTimeout(function(){Za(a,c,b.shiftKey,d);"ssp"!==D(a)&&K(a,!1)},0)):Za(a,c,b.shiftKey,d))})}function Aa(a){var b=a.aLastSort, +c=a.oClasses.sSortColumn,d=Y(a),e=a.oFeatures,h;if(e.bSort&&e.bSortClasses){e=0;for(h=b.length;e<h;e++){var g=b[e].src;f(J(a.aoData,"anCells",g)).removeClass(c+(2>e?e+1:3))}e=0;for(h=d.length;e<h;e++)g=d[e].src,f(J(a.aoData,"anCells",g)).addClass(c+(2>e?e+1:3))}a.aLastSort=d}function Mb(a,b){var c=a.aoColumns[b],d=q.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,ca(a,b)));for(var h,g=q.ext.type.order[c.sType+"-pre"],k=0,f=a.aoData.length;k<f;k++)if(c=a.aoData[k],c._aSortData||(c._aSortData= +[]),!c._aSortData[b]||d)h=d?e[k]:I(a,k,b,"sort"),c._aSortData[b]=g?g(h):h}function Ba(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b={time:+new Date,start:a._iDisplayStart,length:a._iDisplayLength,order:f.extend(!0,[],a.aaSorting),search:Fb(a.oPreviousSearch),columns:f.map(a.aoColumns,function(b,d){return{visible:b.bVisible,search:Fb(a.aoPreSearchCols[d])}})};A(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=b;a.fnStateSaveCallback.call(a.oInstance,a,b)}}function Ob(a,b,c){var d, +e,h=a.aoColumns;b=function(b){if(b&&b.time){var g=A(a,"aoStateLoadParams","stateLoadParams",[a,b]);if(-1===f.inArray(!1,g)&&(g=a.iStateDuration,!(0<g&&b.time<+new Date-1E3*g||b.columns&&h.length!==b.columns.length))){a.oLoadedState=f.extend(!0,{},b);b.start!==p&&(a._iDisplayStart=b.start,a.iInitDisplayStart=b.start);b.length!==p&&(a._iDisplayLength=b.length);b.order!==p&&(a.aaSorting=[],f.each(b.order,function(b,c){a.aaSorting.push(c[0]>=h.length?[0,c[1]]:c)}));b.search!==p&&f.extend(a.oPreviousSearch, +Gb(b.search));if(b.columns)for(d=0,e=b.columns.length;d<e;d++)g=b.columns[d],g.visible!==p&&(h[d].bVisible=g.visible),g.search!==p&&f.extend(a.aoPreSearchCols[d],Gb(g.search));A(a,"aoStateLoaded","stateLoaded",[a,b])}}c()};if(a.oFeatures.bStateSave){var g=a.fnStateLoadCallback.call(a.oInstance,a,b);g!==p&&b(g)}else c()}function Ca(a){var b=q.settings;a=f.inArray(a,J(b,"nTable"));return-1!==a?b[a]:null}function O(a,b,c,d){c="DataTables warning: "+(a?"table id="+a.sTableId+" - ":"")+c;d&&(c+=". For more information about this error, please see http://datatables.net/tn/"+ +d);if(b)z.console&&console.log&&console.log(c);else if(b=q.ext,b=b.sErrMode||b.errMode,a&&A(a,null,"error",[a,d,c]),"alert"==b)alert(c);else{if("throw"==b)throw Error(c);"function"==typeof b&&b(a,d,c)}}function M(a,b,c,d){f.isArray(c)?f.each(c,function(c,d){f.isArray(d)?M(a,b,d[0],d[1]):M(a,b,d)}):(d===p&&(d=c),b[c]!==p&&(a[d]=b[c]))}function ab(a,b,c){var d;for(d in b)if(b.hasOwnProperty(d)){var e=b[d];f.isPlainObject(e)?(f.isPlainObject(a[d])||(a[d]={}),f.extend(!0,a[d],e)):c&&"data"!==d&&"aaData"!== +d&&f.isArray(e)?a[d]=e.slice():a[d]=e}return a}function $a(a,b,c){f(a).on("click.DT",b,function(b){f(a).blur();c(b)}).on("keypress.DT",b,function(a){13===a.which&&(a.preventDefault(),c(a))}).on("selectstart.DT",function(){return!1})}function E(a,b,c,d){c&&a[b].push({fn:c,sName:d})}function A(a,b,c,d){var e=[];b&&(e=f.map(a[b].slice().reverse(),function(b,c){return b.fn.apply(a.oInstance,d)}));null!==c&&(b=f.Event(c+".dt"),f(a.nTable).trigger(b,d),e.push(b.result));return e}function Wa(a){var b=a._iDisplayStart, +c=a.fnDisplayEnd(),d=a._iDisplayLength;b>=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function Ra(a,b){a=a.renderer;var c=q.ext.renderer[b];return f.isPlainObject(a)&&a[b]?c[a[b]]||c._:"string"===typeof a?c[a]||c._:c._}function D(a){return a.oFeatures.bServerSide?"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function ka(a,b){var c=Pb.numbers_length,d=Math.floor(c/2);b<=c?a=Z(0,b):a<=d?(a=Z(0,c-2),a.push("ellipsis"),a.push(b-1)):(a>=b-1-d?a=Z(b-(c-2),b):(a=Z(a-d+2,a+d-1),a.push("ellipsis"), +a.push(b-1)),a.splice(0,0,"ellipsis"),a.splice(0,0,0));a.DT_el="span";return a}function Ha(a){f.each({num:function(b){return Da(b,a)},"num-fmt":function(b){return Da(b,a,bb)},"html-num":function(b){return Da(b,a,Ea)},"html-num-fmt":function(b){return Da(b,a,Ea,bb)}},function(b,c){C.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(C.type.search[b+a]=C.type.search.html)})}function Qb(a){return function(){var b=[Ca(this[q.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return q.ext.internal[a].apply(this, +b)}}var q=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new v(Ca(this[C.iApiIndex])):new v(this)};this.fnAddData=function(a,b){var c=this.api(!0);a=f.isArray(a)&&(f.isArray(a[0])||f.isPlainObject(a[0]))?c.rows.add(a):c.row.add(a);(b===p||b)&&c.draw();return a.flatten().toArray()};this.fnAdjustColumnSizing=function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],d=c.oScroll;a===p||a?b.draw(!1): +(""!==d.sX||""!==d.sY)&&na(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===p||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,b,c){var d=this.api(!0);a=d.rows(a);var e=a.settings()[0],h=e.aoData[a[0][0]];a.remove();b&&b.call(this,e,h);(c===p||c)&&d.draw();return h};this.fnDestroy=function(a){this.api(!0).destroy(a)};this.fnDraw=function(a){this.api(!0).draw(a)};this.fnFilter=function(a,b,c,d,e,f){e=this.api(!0);null===b||b===p? +e.search(a,c,d,f):e.column(b).search(a,c,d,f);e.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==p){var d=a.nodeName?a.nodeName.toLowerCase():"";return b!==p||"td"==d||"th"==d?c.cell(a,b).data():c.row(a).data()||null}return c.data().toArray()};this.fnGetNodes=function(a){var b=this.api(!0);return a!==p?b.row(a).node():b.rows().nodes().flatten().toArray()};this.fnGetPosition=function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.cell(a).index(), +[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};this.fnPageChange=function(a,b){a=this.api(!0).page(a);(b===p||b)&&a.draw(!1)};this.fnSetColumnVis=function(a,b,c){a=this.api(!0).column(a).visible(b);(c===p||c)&&a.columns.adjust().draw()};this.fnSettings=function(){return Ca(this[C.iApiIndex])};this.fnSort=function(a){this.api(!0).order(a).draw()};this.fnSortListener= +function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,d,e){var h=this.api(!0);c===p||null===c?h.row(b).data(a):h.cell(b,c).data(a);(e===p||e)&&h.columns.adjust();(d===p||d)&&h.draw();return 0};this.fnVersionCheck=C.fnVersionCheck;var b=this,c=a===p,d=this.length;c&&(a={});this.oApi=this.internal=C.internal;for(var e in q.ext.internal)e&&(this[e]=Qb(e));this.each(function(){var e={},g=1<d?ab(e,a,!0):a,k=0,l;e=this.getAttribute("id");var n=!1,m=q.defaults,w=f(this);if("table"!= +this.nodeName.toLowerCase())O(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{jb(m);kb(m.column);L(m,m,!0);L(m.column,m.column,!0);L(m,f.extend(g,w.data()),!0);var u=q.settings;k=0;for(l=u.length;k<l;k++){var t=u[k];if(t.nTable==this||t.nTHead&&t.nTHead.parentNode==this||t.nTFoot&&t.nTFoot.parentNode==this){var v=g.bRetrieve!==p?g.bRetrieve:m.bRetrieve;if(c||v)return t.oInstance;if(g.bDestroy!==p?g.bDestroy:m.bDestroy){t.oInstance.fnDestroy();break}else{O(t,0,"Cannot reinitialise DataTable", +3);return}}if(t.sTableId==this.id){u.splice(k,1);break}}if(null===e||""===e)this.id=e="DataTables_Table_"+q.ext._unique++;var r=f.extend(!0,{},q.models.oSettings,{sDestroyWidth:w[0].style.width,sInstance:e,sTableId:e});r.nTable=this;r.oApi=b.internal;r.oInit=g;u.push(r);r.oInstance=1===b.length?b:w.dataTable();jb(g);Ga(g.oLanguage);g.aLengthMenu&&!g.iDisplayLength&&(g.iDisplayLength=f.isArray(g.aLengthMenu[0])?g.aLengthMenu[0][0]:g.aLengthMenu[0]);g=ab(f.extend(!0,{},m),g);M(r.oFeatures,g,"bPaginate bLengthChange bFilter bSort bSortMulti bInfo bProcessing bAutoWidth bSortClasses bServerSide bDeferRender".split(" ")); +M(r,g,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu","sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback","renderer","searchDelay","rowId",["iCookieDuration","iStateDuration"],["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"]]);M(r.oScroll,g,[["sScrollX","sX"],["sScrollXInner","sXInner"], +["sScrollY","sY"],["bScrollCollapse","bCollapse"]]);M(r.oLanguage,g,"fnInfoCallback");E(r,"aoDrawCallback",g.fnDrawCallback,"user");E(r,"aoServerParams",g.fnServerParams,"user");E(r,"aoStateSaveParams",g.fnStateSaveParams,"user");E(r,"aoStateLoadParams",g.fnStateLoadParams,"user");E(r,"aoStateLoaded",g.fnStateLoaded,"user");E(r,"aoRowCallback",g.fnRowCallback,"user");E(r,"aoRowCreatedCallback",g.fnCreatedRow,"user");E(r,"aoHeaderCallback",g.fnHeaderCallback,"user");E(r,"aoFooterCallback",g.fnFooterCallback, +"user");E(r,"aoInitComplete",g.fnInitComplete,"user");E(r,"aoPreDrawCallback",g.fnPreDrawCallback,"user");r.rowIdFn=U(g.rowId);lb(r);var x=r.oClasses;f.extend(x,q.ext.classes,g.oClasses);w.addClass(x.sTable);r.iInitDisplayStart===p&&(r.iInitDisplayStart=g.iDisplayStart,r._iDisplayStart=g.iDisplayStart);null!==g.iDeferLoading&&(r.bDeferLoading=!0,e=f.isArray(g.iDeferLoading),r._iRecordsDisplay=e?g.iDeferLoading[0]:g.iDeferLoading,r._iRecordsTotal=e?g.iDeferLoading[1]:g.iDeferLoading);var y=r.oLanguage; +f.extend(!0,y,g.oLanguage);y.sUrl&&(f.ajax({dataType:"json",url:y.sUrl,success:function(a){Ga(a);L(m.oLanguage,a);f.extend(!0,y,a);ja(r)},error:function(){ja(r)}}),n=!0);null===g.asStripeClasses&&(r.asStripeClasses=[x.sStripeOdd,x.sStripeEven]);e=r.asStripeClasses;var z=w.children("tbody").find("tr").eq(0);-1!==f.inArray(!0,f.map(e,function(a,b){return z.hasClass(a)}))&&(f("tbody tr",this).removeClass(e.join(" ")),r.asDestroyStripes=e.slice());e=[];u=this.getElementsByTagName("thead");0!==u.length&& +(fa(r.aoHeader,u[0]),e=ua(r));if(null===g.aoColumns)for(u=[],k=0,l=e.length;k<l;k++)u.push(null);else u=g.aoColumns;k=0;for(l=u.length;k<l;k++)Ia(r,e?e[k]:null);nb(r,g.aoColumnDefs,u,function(a,b){ma(r,a,b)});if(z.length){var B=function(a,b){return null!==a.getAttribute("data-"+b)?b:null};f(z[0]).children("th, td").each(function(a,b){var c=r.aoColumns[a];if(c.mData===a){var d=B(b,"sort")||B(b,"order");b=B(b,"filter")||B(b,"search");if(null!==d||null!==b)c.mData={_:a+".display",sort:null!==d?a+".@data-"+ +d:p,type:null!==d?a+".@data-"+d:p,filter:null!==b?a+".@data-"+b:p},ma(r,a)}})}var C=r.oFeatures;e=function(){if(g.aaSorting===p){var a=r.aaSorting;k=0;for(l=a.length;k<l;k++)a[k][1]=r.aoColumns[k].asSorting[0]}Aa(r);C.bSort&&E(r,"aoDrawCallback",function(){if(r.bSorted){var a=Y(r),b={};f.each(a,function(a,c){b[c.src]=c.dir});A(r,null,"order",[r,a,b]);Nb(r)}});E(r,"aoDrawCallback",function(){(r.bSorted||"ssp"===D(r)||C.bDeferRender)&&Aa(r)},"sc");a=w.children("caption").each(function(){this._captionSide= +f(this).css("caption-side")});var b=w.children("thead");0===b.length&&(b=f("<thead/>").appendTo(w));r.nTHead=b[0];b=w.children("tbody");0===b.length&&(b=f("<tbody/>").appendTo(w));r.nTBody=b[0];b=w.children("tfoot");0===b.length&&0<a.length&&(""!==r.oScroll.sX||""!==r.oScroll.sY)&&(b=f("<tfoot/>").appendTo(w));0===b.length||0===b.children().length?w.addClass(x.sNoFooter):0<b.length&&(r.nTFoot=b[0],fa(r.aoFooter,r.nTFoot));if(g.aaData)for(k=0;k<g.aaData.length;k++)R(r,g.aaData[k]);else(r.bDeferLoading|| +"dom"==D(r))&&pa(r,f(r.nTBody).children("tr"));r.aiDisplay=r.aiDisplayMaster.slice();r.bInitialised=!0;!1===n&&ja(r)};g.bStateSave?(C.bStateSave=!0,E(r,"aoDrawCallback",Ba,"state_save"),Ob(r,g,e)):e()}});b=null;return this},C,t,x,cb={},Rb=/[\r\n\u2028]/g,Ea=/<.*?>/g,cc=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,dc=/(\/|\.|\*|\+|\?|\||\(|\)|\[|\]|\{|\}|\\|\$|\^|\-)/g,bb=/[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi,P=function(a){return a&&!0!==a&&"-"!==a?!1: +!0},Sb=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},Tb=function(a,b){cb[b]||(cb[b]=new RegExp(Ua(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(cb[b],"."):a},db=function(a,b,c){var d="string"===typeof a;if(P(a))return!0;b&&d&&(a=Tb(a,b));c&&d&&(a=a.replace(bb,""));return!isNaN(parseFloat(a))&&isFinite(a)},Ub=function(a,b,c){return P(a)?!0:P(a)||"string"===typeof a?db(a.replace(Ea,""),b,c)?!0:null:null},J=function(a,b,c){var d=[],e=0,h=a.length;if(c!== +p)for(;e<h;e++)a[e]&&a[e][b]&&d.push(a[e][b][c]);else for(;e<h;e++)a[e]&&d.push(a[e][b]);return d},la=function(a,b,c,d){var e=[],h=0,g=b.length;if(d!==p)for(;h<g;h++)a[b[h]][c]&&e.push(a[b[h]][c][d]);else for(;h<g;h++)e.push(a[b[h]][c]);return e},Z=function(a,b){var c=[];if(b===p){b=0;var d=a}else d=b,b=a;for(a=b;a<d;a++)c.push(a);return c},Vb=function(a){for(var b=[],c=0,d=a.length;c<d;c++)a[c]&&b.push(a[c]);return b},ta=function(a){a:{if(!(2>a.length)){var b=a.slice().sort();for(var c=b[0],d=1, +e=b.length;d<e;d++){if(b[d]===c){b=!1;break a}c=b[d]}}b=!0}if(b)return a.slice();b=[];e=a.length;var h,g=0;d=0;a:for(;d<e;d++){c=a[d];for(h=0;h<g;h++)if(b[h]===c)continue a;b.push(c);g++}return b};q.util={throttle:function(a,b){var c=b!==p?b:200,d,e;return function(){var b=this,g=+new Date,f=arguments;d&&g<d+c?(clearTimeout(e),e=setTimeout(function(){d=p;a.apply(b,f)},c)):(d=g,a.apply(b,f))}},escapeRegex:function(a){return a.replace(dc,"\\$1")}};var F=function(a,b,c){a[b]!==p&&(a[c]=a[b])},da=/\[.*?\]$/, +X=/\(\)$/,Ua=q.util.escapeRegex,ya=f("<div>")[0],$b=ya.textContent!==p,bc=/<.*?>/g,Sa=q.util.throttle,Wb=[],G=Array.prototype,ec=function(a){var b,c=q.settings,d=f.map(c,function(a,b){return a.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase()){var e=f.inArray(a,d);return-1!==e?[c[e]]:null}if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?b=f(a):a instanceof f&&(b=a)}else return[];if(b)return b.map(function(a){e=f.inArray(this, +d);return-1!==e?c[e]:null}).toArray()};var v=function(a,b){if(!(this instanceof v))return new v(a,b);var c=[],d=function(a){(a=ec(a))&&c.push.apply(c,a)};if(f.isArray(a))for(var e=0,h=a.length;e<h;e++)d(a[e]);else d(a);this.context=ta(c);b&&f.merge(this,b);this.selector={rows:null,cols:null,opts:null};v.extend(this,this,Wb)};q.Api=v;f.extend(v.prototype,{any:function(){return 0!==this.count()},concat:G.concat,context:[],count:function(){return this.flatten().length},each:function(a){for(var b=0,c= +this.length;b<c;b++)a.call(this,this[b],b,this);return this},eq:function(a){var b=this.context;return b.length>a?new v(b[a],this[a]):null},filter:function(a){var b=[];if(G.filter)b=G.filter.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)a.call(this,this[c],c,this)&&b.push(this[c]);return new v(this.context,b)},flatten:function(){var a=[];return new v(this.context,a.concat.apply(a,this.toArray()))},join:G.join,indexOf:G.indexOf||function(a,b){b=b||0;for(var c=this.length;b<c;b++)if(this[b]=== +a)return b;return-1},iterator:function(a,b,c,d){var e=[],h,g,f=this.context,l,n=this.selector;"string"===typeof a&&(d=c,c=b,b=a,a=!1);var m=0;for(h=f.length;m<h;m++){var q=new v(f[m]);if("table"===b){var u=c.call(q,f[m],m);u!==p&&e.push(u)}else if("columns"===b||"rows"===b)u=c.call(q,f[m],this[m],m),u!==p&&e.push(u);else if("column"===b||"column-rows"===b||"row"===b||"cell"===b){var t=this[m];"column-rows"===b&&(l=Fa(f[m],n.opts));var x=0;for(g=t.length;x<g;x++)u=t[x],u="cell"===b?c.call(q,f[m],u.row, +u.column,m,x):c.call(q,f[m],u,m,x,l),u!==p&&e.push(u)}}return e.length||d?(a=new v(f,a?e.concat.apply([],e):e),b=a.selector,b.rows=n.rows,b.cols=n.cols,b.opts=n.opts,a):this},lastIndexOf:G.lastIndexOf||function(a,b){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(a){var b=[];if(G.map)b=G.map.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)b.push(a.call(this,this[c],c));return new v(this.context,b)},pluck:function(a){return this.map(function(b){return b[a]})}, +pop:G.pop,push:G.push,reduce:G.reduce||function(a,b){return mb(this,a,b,0,this.length,1)},reduceRight:G.reduceRight||function(a,b){return mb(this,a,b,this.length-1,-1,-1)},reverse:G.reverse,selector:null,shift:G.shift,slice:function(){return new v(this.context,this)},sort:G.sort,splice:G.splice,toArray:function(){return G.slice.call(this)},to$:function(){return f(this)},toJQuery:function(){return f(this)},unique:function(){return new v(this.context,ta(this))},unshift:G.unshift});v.extend=function(a, +b,c){if(c.length&&b&&(b instanceof v||b.__dt_wrapper)){var d,e=function(a,b,c){return function(){var d=b.apply(a,arguments);v.extend(d,d,c.methodExt);return d}};var h=0;for(d=c.length;h<d;h++){var g=c[h];b[g.name]="function"===g.type?e(a,g.val,g):"object"===g.type?{}:g.val;b[g.name].__dt_wrapper=!0;v.extend(a,b[g.name],g.propExt)}}};v.register=t=function(a,b){if(f.isArray(a))for(var c=0,d=a.length;c<d;c++)v.register(a[c],b);else{d=a.split(".");var e=Wb,h;a=0;for(c=d.length;a<c;a++){var g=(h=-1!== +d[a].indexOf("()"))?d[a].replace("()",""):d[a];a:{var k=0;for(var l=e.length;k<l;k++)if(e[k].name===g){k=e[k];break a}k=null}k||(k={name:g,val:{},methodExt:[],propExt:[],type:"object"},e.push(k));a===c-1?(k.val=b,k.type="function"===typeof b?"function":f.isPlainObject(b)?"object":"other"):e=h?k.methodExt:k.propExt}}};v.registerPlural=x=function(a,b,c){v.register(a,c);v.register(b,function(){var a=c.apply(this,arguments);return a===this?this:a instanceof v?a.length?f.isArray(a[0])?new v(a.context, +a[0]):a[0]:p:a})};var fc=function(a,b){if("number"===typeof a)return[b[a]];var c=f.map(b,function(a,b){return a.nTable});return f(c).filter(a).map(function(a){a=f.inArray(this,c);return b[a]}).toArray()};t("tables()",function(a){return a?new v(fc(a,this.context)):this});t("table()",function(a){a=this.tables(a);var b=a.context;return b.length?new v(b[0]):a});x("tables().nodes()","table().node()",function(){return this.iterator("table",function(a){return a.nTable},1)});x("tables().body()","table().body()", +function(){return this.iterator("table",function(a){return a.nTBody},1)});x("tables().header()","table().header()",function(){return this.iterator("table",function(a){return a.nTHead},1)});x("tables().footer()","table().footer()",function(){return this.iterator("table",function(a){return a.nTFoot},1)});x("tables().containers()","table().container()",function(){return this.iterator("table",function(a){return a.nTableWrapper},1)});t("draw()",function(a){return this.iterator("table",function(b){"page"=== +a?S(b):("string"===typeof a&&(a="full-hold"===a?!1:!0),V(b,!1===a))})});t("page()",function(a){return a===p?this.page.info().page:this.iterator("table",function(b){Xa(b,a)})});t("page.info()",function(a){if(0===this.context.length)return p;a=this.context[0];var b=a._iDisplayStart,c=a.oFeatures.bPaginate?a._iDisplayLength:-1,d=a.fnRecordsDisplay(),e=-1===c;return{page:e?0:Math.floor(b/c),pages:e?1:Math.ceil(d/c),start:b,end:a.fnDisplayEnd(),length:c,recordsTotal:a.fnRecordsTotal(),recordsDisplay:d, +serverSide:"ssp"===D(a)}});t("page.len()",function(a){return a===p?0!==this.context.length?this.context[0]._iDisplayLength:p:this.iterator("table",function(b){Va(b,a)})});var Xb=function(a,b,c){if(c){var d=new v(a);d.one("draw",function(){c(d.ajax.json())})}if("ssp"==D(a))V(a,b);else{K(a,!0);var e=a.jqXHR;e&&4!==e.readyState&&e.abort();va(a,[],function(c){qa(a);c=wa(a,c);for(var d=0,e=c.length;d<e;d++)R(a,c[d]);V(a,b);K(a,!1)})}};t("ajax.json()",function(){var a=this.context;if(0<a.length)return a[0].json}); +t("ajax.params()",function(){var a=this.context;if(0<a.length)return a[0].oAjaxData});t("ajax.reload()",function(a,b){return this.iterator("table",function(c){Xb(c,!1===b,a)})});t("ajax.url()",function(a){var b=this.context;if(a===p){if(0===b.length)return p;b=b[0];return b.ajax?f.isPlainObject(b.ajax)?b.ajax.url:b.ajax:b.sAjaxSource}return this.iterator("table",function(b){f.isPlainObject(b.ajax)?b.ajax.url=a:b.ajax=a})});t("ajax.url().load()",function(a,b){return this.iterator("table",function(c){Xb(c, +!1===b,a)})});var eb=function(a,b,c,d,e){var h=[],g,k,l;var n=typeof b;b&&"string"!==n&&"function"!==n&&b.length!==p||(b=[b]);n=0;for(k=b.length;n<k;n++){var m=b[n]&&b[n].split&&!b[n].match(/[\[\(:]/)?b[n].split(","):[b[n]];var q=0;for(l=m.length;q<l;q++)(g=c("string"===typeof m[q]?f.trim(m[q]):m[q]))&&g.length&&(h=h.concat(g))}a=C.selector[a];if(a.length)for(n=0,k=a.length;n<k;n++)h=a[n](d,e,h);return ta(h)},fb=function(a){a||(a={});a.filter&&a.search===p&&(a.search=a.filter);return f.extend({search:"none", +order:"current",page:"all"},a)},gb=function(a){for(var b=0,c=a.length;b<c;b++)if(0<a[b].length)return a[0]=a[b],a[0].length=1,a.length=1,a.context=[a.context[b]],a;a.length=0;return a},Fa=function(a,b){var c=[],d=a.aiDisplay;var e=a.aiDisplayMaster;var h=b.search;var g=b.order;b=b.page;if("ssp"==D(a))return"removed"===h?[]:Z(0,e.length);if("current"==b)for(g=a._iDisplayStart,a=a.fnDisplayEnd();g<a;g++)c.push(d[g]);else if("current"==g||"applied"==g)if("none"==h)c=e.slice();else if("applied"==h)c= +d.slice();else{if("removed"==h){var k={};g=0;for(a=d.length;g<a;g++)k[d[g]]=null;c=f.map(e,function(a){return k.hasOwnProperty(a)?null:a})}}else if("index"==g||"original"==g)for(g=0,a=a.aoData.length;g<a;g++)"none"==h?c.push(g):(e=f.inArray(g,d),(-1===e&&"removed"==h||0<=e&&"applied"==h)&&c.push(g));return c},gc=function(a,b,c){var d;return eb("row",b,function(b){var e=Sb(b),g=a.aoData;if(null!==e&&!c)return[e];d||(d=Fa(a,c));if(null!==e&&-1!==f.inArray(e,d))return[e];if(null===b||b===p||""===b)return d; +if("function"===typeof b)return f.map(d,function(a){var c=g[a];return b(a,c._aData,c.nTr)?a:null});if(b.nodeName){e=b._DT_RowIndex;var k=b._DT_CellIndex;if(e!==p)return g[e]&&g[e].nTr===b?[e]:[];if(k)return g[k.row]&&g[k.row].nTr===b.parentNode?[k.row]:[];e=f(b).closest("*[data-dt-row]");return e.length?[e.data("dt-row")]:[]}if("string"===typeof b&&"#"===b.charAt(0)&&(e=a.aIds[b.replace(/^#/,"")],e!==p))return[e.idx];e=Vb(la(a.aoData,d,"nTr"));return f(e).filter(b).map(function(){return this._DT_RowIndex}).toArray()}, +a,c)};t("rows()",function(a,b){a===p?a="":f.isPlainObject(a)&&(b=a,a="");b=fb(b);var c=this.iterator("table",function(c){return gc(c,a,b)},1);c.selector.rows=a;c.selector.opts=b;return c});t("rows().nodes()",function(){return this.iterator("row",function(a,b){return a.aoData[b].nTr||p},1)});t("rows().data()",function(){return this.iterator(!0,"rows",function(a,b){return la(a.aoData,b,"_aData")},1)});x("rows().cache()","row().cache()",function(a){return this.iterator("row",function(b,c){b=b.aoData[c]; +return"search"===a?b._aFilterData:b._aSortData},1)});x("rows().invalidate()","row().invalidate()",function(a){return this.iterator("row",function(b,c){ea(b,c,a)})});x("rows().indexes()","row().index()",function(){return this.iterator("row",function(a,b){return b},1)});x("rows().ids()","row().id()",function(a){for(var b=[],c=this.context,d=0,e=c.length;d<e;d++)for(var h=0,g=this[d].length;h<g;h++){var f=c[d].rowIdFn(c[d].aoData[this[d][h]]._aData);b.push((!0===a?"#":"")+f)}return new v(c,b)});x("rows().remove()", +"row().remove()",function(){var a=this;this.iterator("row",function(b,c,d){var e=b.aoData,h=e[c],g,f;e.splice(c,1);var l=0;for(g=e.length;l<g;l++){var n=e[l];var m=n.anCells;null!==n.nTr&&(n.nTr._DT_RowIndex=l);if(null!==m)for(n=0,f=m.length;n<f;n++)m[n]._DT_CellIndex.row=l}ra(b.aiDisplayMaster,c);ra(b.aiDisplay,c);ra(a[d],c,!1);0<b._iRecordsDisplay&&b._iRecordsDisplay--;Wa(b);c=b.rowIdFn(h._aData);c!==p&&delete b.aIds[c]});this.iterator("table",function(a){for(var b=0,d=a.aoData.length;b<d;b++)a.aoData[b].idx= +b});return this});t("rows.add()",function(a){var b=this.iterator("table",function(b){var c,d=[];var g=0;for(c=a.length;g<c;g++){var f=a[g];f.nodeName&&"TR"===f.nodeName.toUpperCase()?d.push(pa(b,f)[0]):d.push(R(b,f))}return d},1),c=this.rows(-1);c.pop();f.merge(c,b);return c});t("row()",function(a,b){return gb(this.rows(a,b))});t("row().data()",function(a){var b=this.context;if(a===p)return b.length&&this.length?b[0].aoData[this[0]]._aData:p;var c=b[0].aoData[this[0]];c._aData=a;f.isArray(a)&&c.nTr.id&& +Q(b[0].rowId)(a,c.nTr.id);ea(b[0],this[0],"data");return this});t("row().node()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]].nTr||null:null});t("row.add()",function(a){a instanceof f&&a.length&&(a=a[0]);var b=this.iterator("table",function(b){return a.nodeName&&"TR"===a.nodeName.toUpperCase()?pa(b,a)[0]:R(b,a)});return this.row(b[0])});var hc=function(a,b,c,d){var e=[],h=function(b,c){if(f.isArray(b)||b instanceof f)for(var d=0,g=b.length;d<g;d++)h(b[d],c);else b.nodeName&& +"tr"===b.nodeName.toLowerCase()?e.push(b):(d=f("<tr><td/></tr>").addClass(c),f("td",d).addClass(c).html(b)[0].colSpan=W(a),e.push(d[0]))};h(c,d);b._details&&b._details.detach();b._details=f(e);b._detailsShow&&b._details.insertAfter(b.nTr)},hb=function(a,b){var c=a.context;c.length&&(a=c[0].aoData[b!==p?b:a[0]])&&a._details&&(a._details.remove(),a._detailsShow=p,a._details=p)},Yb=function(a,b){var c=a.context;c.length&&a.length&&(a=c[0].aoData[a[0]],a._details&&((a._detailsShow=b)?a._details.insertAfter(a.nTr): +a._details.detach(),ic(c[0])))},ic=function(a){var b=new v(a),c=a.aoData;b.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");0<J(c,"_details").length&&(b.on("draw.dt.DT_details",function(d,e){a===e&&b.rows({page:"current"}).eq(0).each(function(a){a=c[a];a._detailsShow&&a._details.insertAfter(a.nTr)})}),b.on("column-visibility.dt.DT_details",function(b,e,f,g){if(a===e)for(e=W(e),f=0,g=c.length;f<g;f++)b=c[f],b._details&&b._details.children("td[colspan]").attr("colspan", +e)}),b.on("destroy.dt.DT_details",function(d,e){if(a===e)for(d=0,e=c.length;d<e;d++)c[d]._details&&hb(b,d)}))};t("row().child()",function(a,b){var c=this.context;if(a===p)return c.length&&this.length?c[0].aoData[this[0]]._details:p;!0===a?this.child.show():!1===a?hb(this):c.length&&this.length&&hc(c[0],c[0].aoData[this[0]],a,b);return this});t(["row().child.show()","row().child().show()"],function(a){Yb(this,!0);return this});t(["row().child.hide()","row().child().hide()"],function(){Yb(this,!1); +return this});t(["row().child.remove()","row().child().remove()"],function(){hb(this);return this});t("row().child.isShown()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var jc=/^([^:]+):(name|visIdx|visible)$/,Zb=function(a,b,c,d,e){c=[];d=0;for(var f=e.length;d<f;d++)c.push(I(a,e[d],b));return c},kc=function(a,b,c){var d=a.aoColumns,e=J(d,"sName"),h=J(d,"nTh");return eb("column",b,function(b){var g=Sb(b);if(""===b)return Z(d.length);if(null!== +g)return[0<=g?g:d.length+g];if("function"===typeof b){var l=Fa(a,c);return f.map(d,function(c,d){return b(d,Zb(a,d,0,0,l),h[d])?d:null})}var n="string"===typeof b?b.match(jc):"";if(n)switch(n[2]){case "visIdx":case "visible":g=parseInt(n[1],10);if(0>g){var m=f.map(d,function(a,b){return a.bVisible?b:null});return[m[m.length+g]]}return[ba(a,g)];case "name":return f.map(e,function(a,b){return a===n[1]?b:null});default:return[]}if(b.nodeName&&b._DT_CellIndex)return[b._DT_CellIndex.column];g=f(h).filter(b).map(function(){return f.inArray(this, +h)}).toArray();if(g.length||!b.nodeName)return g;g=f(b).closest("*[data-dt-column]");return g.length?[g.data("dt-column")]:[]},a,c)};t("columns()",function(a,b){a===p?a="":f.isPlainObject(a)&&(b=a,a="");b=fb(b);var c=this.iterator("table",function(c){return kc(c,a,b)},1);c.selector.cols=a;c.selector.opts=b;return c});x("columns().header()","column().header()",function(a,b){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh},1)});x("columns().footer()","column().footer()",function(a, +b){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf},1)});x("columns().data()","column().data()",function(){return this.iterator("column-rows",Zb,1)});x("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});x("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,c,d,e,f){return la(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});x("columns().nodes()", +"column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return la(a.aoData,e,"anCells",b)},1)});x("columns().visible()","column().visible()",function(a,b){var c=this,d=this.iterator("column",function(b,c){if(a===p)return b.aoColumns[c].bVisible;var d=b.aoColumns,e=d[c],h=b.aoData,n;if(a!==p&&e.bVisible!==a){if(a){var m=f.inArray(!0,J(d,"bVisible"),c+1);d=0;for(n=h.length;d<n;d++){var q=h[d].nTr;b=h[d].anCells;q&&q.insertBefore(b[c],b[m]||null)}}else f(J(b.aoData,"anCells", +c)).detach();e.bVisible=a}});a!==p&&this.iterator("table",function(d){ha(d,d.aoHeader);ha(d,d.aoFooter);d.aiDisplay.length||f(d.nTBody).find("td[colspan]").attr("colspan",W(d));Ba(d);c.iterator("column",function(c,d){A(c,null,"column-visibility",[c,d,a,b])});(b===p||b)&&c.columns.adjust()});return d});x("columns().indexes()","column().index()",function(a){return this.iterator("column",function(b,c){return"visible"===a?ca(b,c):c},1)});t("columns.adjust()",function(){return this.iterator("table",function(a){aa(a)}, +1)});t("column.index()",function(a,b){if(0!==this.context.length){var c=this.context[0];if("fromVisible"===a||"toData"===a)return ba(c,b);if("fromData"===a||"toVisible"===a)return ca(c,b)}});t("column()",function(a,b){return gb(this.columns(a,b))});var lc=function(a,b,c){var d=a.aoData,e=Fa(a,c),h=Vb(la(d,e,"anCells")),g=f([].concat.apply([],h)),k,l=a.aoColumns.length,n,m,q,u,t,v;return eb("cell",b,function(b){var c="function"===typeof b;if(null===b||b===p||c){n=[];m=0;for(q=e.length;m<q;m++)for(k= +e[m],u=0;u<l;u++)t={row:k,column:u},c?(v=d[k],b(t,I(a,k,u),v.anCells?v.anCells[u]:null)&&n.push(t)):n.push(t);return n}if(f.isPlainObject(b))return b.column!==p&&b.row!==p&&-1!==f.inArray(b.row,e)?[b]:[];c=g.filter(b).map(function(a,b){return{row:b._DT_CellIndex.row,column:b._DT_CellIndex.column}}).toArray();if(c.length||!b.nodeName)return c;v=f(b).closest("*[data-dt-row]");return v.length?[{row:v.data("dt-row"),column:v.data("dt-column")}]:[]},a,c)};t("cells()",function(a,b,c){f.isPlainObject(a)&& +(a.row===p?(c=a,a=null):(c=b,b=null));f.isPlainObject(b)&&(c=b,b=null);if(null===b||b===p)return this.iterator("table",function(b){return lc(b,a,fb(c))});var d=c?{page:c.page,order:c.order,search:c.search}:{},e=this.columns(b,d),h=this.rows(a,d),g,k,l,n;d=this.iterator("table",function(a,b){a=[];g=0;for(k=h[b].length;g<k;g++)for(l=0,n=e[b].length;l<n;l++)a.push({row:h[b][g],column:e[b][l]});return a},1);d=c&&c.selected?this.cells(d,c):d;f.extend(d.selector,{cols:b,rows:a,opts:c});return d});x("cells().nodes()", +"cell().node()",function(){return this.iterator("cell",function(a,b,c){return(a=a.aoData[b])&&a.anCells?a.anCells[c]:p},1)});t("cells().data()",function(){return this.iterator("cell",function(a,b,c){return I(a,b,c)},1)});x("cells().cache()","cell().cache()",function(a){a="search"===a?"_aFilterData":"_aSortData";return this.iterator("cell",function(b,c,d){return b.aoData[c][a][d]},1)});x("cells().render()","cell().render()",function(a){return this.iterator("cell",function(b,c,d){return I(b,c,d,a)}, +1)});x("cells().indexes()","cell().index()",function(){return this.iterator("cell",function(a,b,c){return{row:b,column:c,columnVisible:ca(a,c)}},1)});x("cells().invalidate()","cell().invalidate()",function(a){return this.iterator("cell",function(b,c,d){ea(b,c,a,d)})});t("cell()",function(a,b,c){return gb(this.cells(a,b,c))});t("cell().data()",function(a){var b=this.context,c=this[0];if(a===p)return b.length&&c.length?I(b[0],c[0].row,c[0].column):p;ob(b[0],c[0].row,c[0].column,a);ea(b[0],c[0].row, +"data",c[0].column);return this});t("order()",function(a,b){var c=this.context;if(a===p)return 0!==c.length?c[0].aaSorting:p;"number"===typeof a?a=[[a,b]]:a.length&&!f.isArray(a[0])&&(a=Array.prototype.slice.call(arguments));return this.iterator("table",function(b){b.aaSorting=a.slice()})});t("order.listener()",function(a,b,c){return this.iterator("table",function(d){Qa(d,a,b,c)})});t("order.fixed()",function(a){if(!a){var b=this.context;b=b.length?b[0].aaSortingFixed:p;return f.isArray(b)?{pre:b}: +b}return this.iterator("table",function(b){b.aaSortingFixed=f.extend(!0,{},a)})});t(["columns().order()","column().order()"],function(a){var b=this;return this.iterator("table",function(c,d){var e=[];f.each(b[d],function(b,c){e.push([c,a])});c.aaSorting=e})});t("search()",function(a,b,c,d){var e=this.context;return a===p?0!==e.length?e[0].oPreviousSearch.sSearch:p:this.iterator("table",function(e){e.oFeatures.bFilter&&ia(e,f.extend({},e.oPreviousSearch,{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null=== +c?!0:c,bCaseInsensitive:null===d?!0:d}),1)})});x("columns().search()","column().search()",function(a,b,c,d){return this.iterator("column",function(e,h){var g=e.aoPreSearchCols;if(a===p)return g[h].sSearch;e.oFeatures.bFilter&&(f.extend(g[h],{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),ia(e,e.oPreviousSearch,1))})});t("state()",function(){return this.context.length?this.context[0].oSavedState:null});t("state.clear()",function(){return this.iterator("table", +function(a){a.fnStateSaveCallback.call(a.oInstance,a,{})})});t("state.loaded()",function(){return this.context.length?this.context[0].oLoadedState:null});t("state.save()",function(){return this.iterator("table",function(a){Ba(a)})});q.versionCheck=q.fnVersionCheck=function(a){var b=q.version.split(".");a=a.split(".");for(var c,d,e=0,f=a.length;e<f;e++)if(c=parseInt(b[e],10)||0,d=parseInt(a[e],10)||0,c!==d)return c>d;return!0};q.isDataTable=q.fnIsDataTable=function(a){var b=f(a).get(0),c=!1;if(a instanceof +q.Api)return!0;f.each(q.settings,function(a,e){a=e.nScrollHead?f("table",e.nScrollHead)[0]:null;var d=e.nScrollFoot?f("table",e.nScrollFoot)[0]:null;if(e.nTable===b||a===b||d===b)c=!0});return c};q.tables=q.fnTables=function(a){var b=!1;f.isPlainObject(a)&&(b=a.api,a=a.visible);var c=f.map(q.settings,function(b){if(!a||a&&f(b.nTable).is(":visible"))return b.nTable});return b?new v(c):c};q.camelToHungarian=L;t("$()",function(a,b){b=this.rows(b).nodes();b=f(b);return f([].concat(b.filter(a).toArray(), +b.find(a).toArray()))});f.each(["on","one","off"],function(a,b){t(b+"()",function(){var a=Array.prototype.slice.call(arguments);a[0]=f.map(a[0].split(/\s/),function(a){return a.match(/\.dt\b/)?a:a+".dt"}).join(" ");var d=f(this.tables().nodes());d[b].apply(d,a);return this})});t("clear()",function(){return this.iterator("table",function(a){qa(a)})});t("settings()",function(){return new v(this.context,this.context)});t("init()",function(){var a=this.context;return a.length?a[0].oInit:null});t("data()", +function(){return this.iterator("table",function(a){return J(a.aoData,"_aData")}).flatten()});t("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,h=b.nTBody,g=b.nTHead,k=b.nTFoot,l=f(e);h=f(h);var n=f(b.nTableWrapper),m=f.map(b.aoData,function(a){return a.nTr}),p;b.bDestroying=!0;A(b,"aoDestroyCallback","destroy",[b]);a||(new v(b)).columns().visible(!0);n.off(".DT").find(":not(tbody *)").off(".DT");f(z).off(".DT-"+b.sInstance); +e!=g.parentNode&&(l.children("thead").detach(),l.append(g));k&&e!=k.parentNode&&(l.children("tfoot").detach(),l.append(k));b.aaSorting=[];b.aaSortingFixed=[];Aa(b);f(m).removeClass(b.asStripeClasses.join(" "));f("th, td",g).removeClass(d.sSortable+" "+d.sSortableAsc+" "+d.sSortableDesc+" "+d.sSortableNone);h.children().detach();h.append(m);g=a?"remove":"detach";l[g]();n[g]();!a&&c&&(c.insertBefore(e,b.nTableReinsertBefore),l.css("width",b.sDestroyWidth).removeClass(d.sTable),(p=b.asDestroyStripes.length)&& +h.children().each(function(a){f(this).addClass(b.asDestroyStripes[a%p])}));c=f.inArray(b,q.settings);-1!==c&&q.settings.splice(c,1)})});f.each(["column","row","cell"],function(a,b){t(b+"s().every()",function(a){var c=this.selector.opts,e=this;return this.iterator(b,function(d,f,k,l,n){a.call(e[b](f,"cell"===b?k:c,"cell"===b?c:p),f,k,l,n)})})});t("i18n()",function(a,b,c){var d=this.context[0];a=U(a)(d.oLanguage);a===p&&(a=b);c!==p&&f.isPlainObject(a)&&(a=a[c]!==p?a[c]:a._);return a.replace("%d",c)}); +q.version="1.10.20";q.settings=[];q.models={};q.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};q.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1};q.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null, +sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};q.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1, +bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){}}, +fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last", +sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:f.extend({},q.models.oSearch),sAjaxDataProp:"data", +sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"};H(q.defaults);q.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};H(q.defaults.column);q.models.oSettings= +{oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{}, +aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0, +aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:p,oAjaxData:p,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==D(this)?1*this._iRecordsTotal: +this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==D(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures,f=e.bPaginate;return e.bServerSide?!1===f||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!f||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null};q.ext=C={buttons:{}, +classes:{},builder:"-source-",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:q.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:q.version};f.extend(C,{afnFiltering:C.search,aTypes:C.type.detect,ofnSearch:C.type.search,oSort:C.type.order,afnSortData:C.order,aoFeatures:C.feature,oApi:C.internal,oStdClasses:C.classes,oPagination:C.pager}); +f.extend(q.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled", +sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"", +sJUIHeader:"",sJUIFooter:""});var Pb=q.ext.pager;f.extend(Pb,{simple:function(a,b){return["previous","next"]},full:function(a,b){return["first","previous","next","last"]},numbers:function(a,b){return[ka(a,b)]},simple_numbers:function(a,b){return["previous",ka(a,b),"next"]},full_numbers:function(a,b){return["first","previous",ka(a,b),"next","last"]},first_last_numbers:function(a,b){return["first",ka(a,b),"last"]},_numbers:ka,numbers_length:7});f.extend(!0,q.ext.renderer,{pageButton:{_:function(a,b, +c,d,e,h){var g=a.oClasses,k=a.oLanguage.oPaginate,l=a.oLanguage.oAria.paginate||{},n,m,q=0,t=function(b,d){var p,r=g.sPageButtonDisabled,u=function(b){Xa(a,b.data.action,!0)};var w=0;for(p=d.length;w<p;w++){var v=d[w];if(f.isArray(v)){var x=f("<"+(v.DT_el||"div")+"/>").appendTo(b);t(x,v)}else{n=null;m=v;x=a.iTabIndex;switch(v){case "ellipsis":b.append('<span class="ellipsis">&#x2026;</span>');break;case "first":n=k.sFirst;0===e&&(x=-1,m+=" "+r);break;case "previous":n=k.sPrevious;0===e&&(x=-1,m+= +" "+r);break;case "next":n=k.sNext;e===h-1&&(x=-1,m+=" "+r);break;case "last":n=k.sLast;e===h-1&&(x=-1,m+=" "+r);break;default:n=v+1,m=e===v?g.sPageButtonActive:""}null!==n&&(x=f("<a>",{"class":g.sPageButton+" "+m,"aria-controls":a.sTableId,"aria-label":l[v],"data-dt-idx":q,tabindex:x,id:0===c&&"string"===typeof v?a.sTableId+"_"+v:null}).html(n).appendTo(b),$a(x,{action:v},u),q++)}}};try{var v=f(b).find(y.activeElement).data("dt-idx")}catch(mc){}t(f(b).empty(),d);v!==p&&f(b).find("[data-dt-idx="+ +v+"]").focus()}}});f.extend(q.ext.type.detect,[function(a,b){b=b.oLanguage.sDecimal;return db(a,b)?"num"+b:null},function(a,b){if(a&&!(a instanceof Date)&&!cc.test(a))return null;b=Date.parse(a);return null!==b&&!isNaN(b)||P(a)?"date":null},function(a,b){b=b.oLanguage.sDecimal;return db(a,b,!0)?"num-fmt"+b:null},function(a,b){b=b.oLanguage.sDecimal;return Ub(a,b)?"html-num"+b:null},function(a,b){b=b.oLanguage.sDecimal;return Ub(a,b,!0)?"html-num-fmt"+b:null},function(a,b){return P(a)||"string"=== +typeof a&&-1!==a.indexOf("<")?"html":null}]);f.extend(q.ext.type.search,{html:function(a){return P(a)?a:"string"===typeof a?a.replace(Rb," ").replace(Ea,""):""},string:function(a){return P(a)?a:"string"===typeof a?a.replace(Rb," "):a}});var Da=function(a,b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Tb(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};f.extend(C.type.order,{"date-pre":function(a){a=Date.parse(a);return isNaN(a)?-Infinity:a},"html-pre":function(a){return P(a)? +"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return P(a)?"":"string"===typeof a?a.toLowerCase():a.toString?a.toString():""},"string-asc":function(a,b){return a<b?-1:a>b?1:0},"string-desc":function(a,b){return a<b?1:a>b?-1:0}});Ha("");f.extend(!0,q.ext.renderer,{header:{_:function(a,b,c,d){f(a.nTable).on("order.dt.DT",function(e,f,g,k){a===f&&(e=c.idx,b.removeClass(c.sSortingClass+" "+d.sSortAsc+" "+d.sSortDesc).addClass("asc"==k[e]?d.sSortAsc:"desc"==k[e]?d.sSortDesc: +c.sSortingClass))})},jqueryui:function(a,b,c,d){f("<div/>").addClass(d.sSortJUIWrapper).append(b.contents()).append(f("<span/>").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);f(a.nTable).on("order.dt.DT",function(e,f,g,k){a===f&&(e=c.idx,b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass("asc"==k[e]?d.sSortAsc:"desc"==k[e]?d.sSortDesc:c.sSortingClass),b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass("asc"== +k[e]?d.sSortJUIAsc:"desc"==k[e]?d.sSortJUIDesc:c.sSortingClassJUI))})}}});var ib=function(a){return"string"===typeof a?a.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"):a};q.render={number:function(a,b,c,d,e){return{display:function(f){if("number"!==typeof f&&"string"!==typeof f)return f;var g=0>f?"-":"",h=parseFloat(f);if(isNaN(h))return ib(f);h=h.toFixed(c);f=Math.abs(h);h=parseInt(f,10);f=c?b+(f-h).toFixed(c).substring(2):"";return g+(d||"")+h.toString().replace(/\B(?=(\d{3})+(?!\d))/g, +a)+f+(e||"")}}},text:function(){return{display:ib,filter:ib}}};f.extend(q.ext.internal,{_fnExternApiFunc:Qb,_fnBuildAjax:va,_fnAjaxUpdate:qb,_fnAjaxParameters:zb,_fnAjaxUpdateDraw:Ab,_fnAjaxDataSrc:wa,_fnAddColumn:Ia,_fnColumnOptions:ma,_fnAdjustColumnSizing:aa,_fnVisibleToColumnIndex:ba,_fnColumnIndexToVisible:ca,_fnVisbleColumns:W,_fnGetColumns:oa,_fnColumnTypes:Ka,_fnApplyColumnDefs:nb,_fnHungarianMap:H,_fnCamelToHungarian:L,_fnLanguageCompat:Ga,_fnBrowserDetect:lb,_fnAddData:R,_fnAddTr:pa,_fnNodeToDataIndex:function(a, +b){return b._DT_RowIndex!==p?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return f.inArray(c,a.aoData[b].anCells)},_fnGetCellData:I,_fnSetCellData:ob,_fnSplitObjNotation:Na,_fnGetObjectDataFn:U,_fnSetObjectDataFn:Q,_fnGetDataMaster:Oa,_fnClearTable:qa,_fnDeleteIndex:ra,_fnInvalidate:ea,_fnGetRowElements:Ma,_fnCreateTr:La,_fnBuildHead:pb,_fnDrawHead:ha,_fnDraw:S,_fnReDraw:V,_fnAddOptionsHtml:sb,_fnDetectHeader:fa,_fnGetUniqueThs:ua,_fnFeatureHtmlFilter:ub,_fnFilterComplete:ia,_fnFilterCustom:Db, +_fnFilterColumn:Cb,_fnFilter:Bb,_fnFilterCreateSearch:Ta,_fnEscapeRegex:Ua,_fnFilterData:Eb,_fnFeatureHtmlInfo:xb,_fnUpdateInfo:Hb,_fnInfoMacros:Ib,_fnInitialise:ja,_fnInitComplete:xa,_fnLengthChange:Va,_fnFeatureHtmlLength:tb,_fnFeatureHtmlPaginate:yb,_fnPageChange:Xa,_fnFeatureHtmlProcessing:vb,_fnProcessingDisplay:K,_fnFeatureHtmlTable:wb,_fnScrollDraw:na,_fnApplyToChildren:N,_fnCalculateColumnWidths:Ja,_fnThrottle:Sa,_fnConvertToWidth:Jb,_fnGetWidestNode:Kb,_fnGetMaxLenString:Lb,_fnStringToCss:B, +_fnSortFlatten:Y,_fnSort:rb,_fnSortAria:Nb,_fnSortListener:Za,_fnSortAttachListener:Qa,_fnSortingClasses:Aa,_fnSortData:Mb,_fnSaveState:Ba,_fnLoadState:Ob,_fnSettingsFromNode:Ca,_fnLog:O,_fnMap:M,_fnBindAction:$a,_fnCallbackReg:E,_fnCallbackFire:A,_fnLengthOverflow:Wa,_fnRenderer:Ra,_fnDataSource:D,_fnRowAttributes:Pa,_fnExtend:ab,_fnCalculateEnd:function(){}});f.fn.dataTable=q;q.$=f;f.fn.dataTableSettings=q.settings;f.fn.dataTableExt=q.ext;f.fn.DataTable=function(a){return f(this).dataTable(a).api()}; +f.each(q,function(a,b){f.fn.DataTable[a]=b});return f.fn.dataTable}); diff --git a/js/my.js b/js/my.js new file mode 100644 index 0000000..aec221a --- /dev/null +++ b/js/my.js @@ -0,0 +1,84 @@ +function tandaPemisahTitik(b){ + var _minus = false; + if (b<0) _minus = true; + b = b.toString(); + b=b.replace(".",""); + + c = ""; + panjang = b.length; + j = 0; + for (i = panjang; i > 0; i--){ + j = j + 1; + if (((j % 3) == 1) && (j != 1)){ + c = b.substr(i-1,1) + "." + c; + } else { + c = b.substr(i-1,1) + c; + } + } + if (_minus) c = "-" + c ; + return c; +} + +function numbersonly(ini, e){ + if (e.keyCode>=49){ + if(e.keyCode<=57){ + a = ini.value.toString().replace(".",""); + b = a.replace(/[^\d]/g,""); + b = (b=="0")?String.fromCharCode(e.keyCode):b + String.fromCharCode(e.keyCode); + ini.value = tandaPemisahTitik(b); + return false; + } + else if(e.keyCode<=105){ + if(e.keyCode>=96){ + //e.keycode = e.keycode - 47; + a = ini.value.toString().replace(".",""); + b = a.replace(/[^\d]/g,""); + b = (b=="0")?String.fromCharCode(e.keyCode-48):b + String.fromCharCode(e.keyCode-48); + ini.value = tandaPemisahTitik(b); + //alert(e.keycode); + return false; + } + else {return false;} + } + else { + return false; } + }else if (e.keyCode==48){ + a = ini.value.replace(".","") + String.fromCharCode(e.keyCode); + b = a.replace(/[^\d]/g,""); + if (parseFloat(b)!=0){ + ini.value = tandaPemisahTitik(b); + return false; + } else { + return false; + } + }else if (e.keyCode==95){ + a = ini.value.replace(".","") + String.fromCharCode(e.keyCode-48); + b = a.replace(/[^\d]/g,""); + if (parseFloat(b)!=0){ + ini.value = tandaPemisahTitik(b); + return false; + } else { + return false; + } + }else if (e.keyCode==8 || e.keycode==46){ + a = ini.value.replace(".",""); + b = a.replace(/[^\d]/g,""); + b = b.substr(0,b.length -1); + if (tandaPemisahTitik(b)!=""){ + ini.value = tandaPemisahTitik(b); + } else { + ini.value = ""; + } + + return false; + } else if (e.keyCode==9){ + return true; + } else if (e.keyCode==17){ + return true; + } else { + //alert (e.keyCode); + return false; + } + +} + diff --git a/js/terbilang.js b/js/terbilang.js new file mode 100644 index 0000000..fc84146 --- /dev/null +++ b/js/terbilang.js @@ -0,0 +1,174 @@ +/* +| @Author Kukuh Prabowo +| 2015 +| version 0.1 +| @return String +*/ + +(function( $ ) { + + $.fn.terbilang = function( options ) { + + var txtsrc; + + var setting = $.extend({ + lang: 'id', + output: $('#terbilang-output') + }, options); + + var IDreadThousand = function (n,dg,snum,thousandDesc) { + var s=''; + var d1=Math.floor(n/100); + var d2=Math.floor((n-(d1*100))/10); + var d3=n-(d1*100)-(d2*10); + + if (d1>0) { + if (d1==1) { + s=s+'seratus '; + } else { + s=s+snum[d1]+' ratus '; + } + } + + if (d2>0) { + if (d2==1) { + switch(d3) { + case 0: s=s+'sepuluh '; + break; + case 1: s=s+'sebelas '; + break; + default: s=s+snum[d3]+' belas '; + } + } else { + s=s+snum[d2]+' puluh '; + } + } + + if (d3>0) { + if ((d2>1)||(d2==0)) { + if ((dg==1)&(d3==1)) { + s=s+'se'; + } else { + s=s+snum[d3]+' '; + } + } + } + + return s; + } + + var ENreadThousand = function (n,snum,thousandDesc,steens,stens) { + var s=''; + var d1=Math.floor(n/100); + var d2=Math.floor((n-(d1*100))/10); + var d3=n-(d1*100)-(d2*10); + + if (d1>0) { + s=s+snum[d1]+' hundred '; + } + + if (d2>0) { + if (d2==1) { + s=s+steens[d3]+' '; + } else { + s=s+stens[d2]+' '; + } + } + + if (d3>0) { + if ((d2>1)||(d2==0)) { + s=s+snum[d3]+' '; + } + } + + return s; + } + + var readAll = function (x,lang) { + var s=''; + var i=0; + var isfailed=false; + + switch(lang) { + case 'id' : var snum=new Array('nol','satu','dua','tiga','empat','lima','enam','tujuh','delapan','sembilan'); + var thousandDesc=new Array('','ribu','juta','miliar','triliun'); + break; + case 'en' : var snum=new Array('zero','one','two','three','four','five','six','seven','eight','nine'); + var thousandDesc=new Array('','thousand','million','billion','trillion'); + var steens=new Array('ten','eleven','twelve','thirteen','fourteen','fifteen','sixteen','seventeen','eighteen','nineteen'); + var stens=new Array('','','twenty','thirty','forty','fifty','sixty','seventy','eighty','ninety'); + break; + default: alert('Unknown language'); + isfailed=true; + } + + if (isNaN(x)) { + isfailed=true; + alert('Not a number!'); + } else { + x=parseFloat(x); + } + + if (isfailed==false) { + do { + var groupNumbers = Math.round(((Math.floor(x)/1000)-Math.floor((Math.floor(x)/1000)))*1000); + if (lang=='id') { + s=IDreadThousand(groupNumbers,i,snum,thousandDesc)+thousandDesc[i]+' '+s; + if (x==0) {s='nol'}; + } + if (lang=='en') { + s=ENreadThousand(groupNumbers,snum,thousandDesc,steens,stens)+thousandDesc[i]+' '+s; + if (x==0) {s='zero'}; + } + x=Math.floor(Math.floor(x)/1000); + i++; + } while (x>0); + return s.replace(/^\s*|\s(?=\s)|\s*$/g, ''); + } else { + return 'NaN'; + } + } + + var readNumbers = function () { + var txtout = setting.output; + switch(setting.lang) { + case 'id' : var lang = setting.lang; + var cur='rupiah'; + var cen='sen'; + break; + case 'en' : var lang = setting.lang; + var cur='dollar'; + var cen='cent'; + break; + } + + var ssrc = txtsrc.val(); + // window.alert(ssrc); + var ssrc = txtsrc.val().split(/[.]|[,]/); + var sout=readAll(ssrc,lang)+' '+cur; + var sout1=''; + if (ssrc[1]!=undefined) { + sout1=readAll(ssrc[1].substr(0,2),lang)+' '+cen; + } + if ((sout.search('NaN')!=-1)||(sout1.search('NaN')!=-1)) { + txtsrc.val(''); + txtout.val(''); + } else { + txtout.val(sout+' '+sout1); + } + } + + return this.each(function() { + var idsrc = $(this); + $(document).on('keyup change', idsrc, function(e) { + txtsrc = idsrc; + if (txtsrc.val() != '') { + readNumbers(); + } else { + txtsrc.val(''); + } + }); + }); + }; + +} (jQuery)); \ No newline at end of file diff --git a/js/terbilang.min.js b/js/terbilang.min.js new file mode 100644 index 0000000..93f9d8a --- /dev/null +++ b/js/terbilang.min.js @@ -0,0 +1,7 @@ +/* +| @Author Kukuh Prabowo +| 2015 +| version 0.1 +| @return String +*/ +(function(e){e.fn.terbilang=function(t){var n;var r=e.extend({lang:"id",output:e("#terbilang-output")},t);var i=function(e,t,n,r){var i="";var s=Math.floor(e/100);var o=Math.floor((e-s*100)/10);var u=e-s*100-o*10;if(s>0){if(s==1){i=i+"seratus "}else{i=i+n[s]+" ratus "}}if(o>0){if(o==1){switch(u){case 0:i=i+"sepuluh ";break;case 1:i=i+"sebelas ";break;default:i=i+n[u]+" belas "}}else{i=i+n[o]+" puluh "}}if(u>0){if(o>1||o==0){if(t==1&u==1){i=i+"se"}else{i=i+n[u]+" "}}}return i};var s=function(e,t,n,r,i){var s="";var o=Math.floor(e/100);var u=Math.floor((e-o*100)/10);var a=e-o*100-u*10;if(o>0){s=s+t[o]+" hundred "}if(u>0){if(u==1){s=s+r[a]+" "}else{s=s+i[u]+" "}}if(a>0){if(u>1||u==0){s=s+t[a]+" "}}return s};var o=function(e,t){var n="";var r=0;var o=false;switch(t){case"id":var u=new Array("nol","satu","dua","tiga","empat","lima","enam","tujuh","delapan","sembilan");var a=new Array("","ribu","juta","miliar","triliun");break;case"en":var u=new Array("zero","one","two","three","four","five","six","seven","eight","nine");var a=new Array("","thousand","million","billion","trillion");var f=new Array("ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen");var l=new Array("","","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety");break;default:alert("Unknown language");o=true}if(isNaN(e)){o=true;alert("Not a number!")}else{e=parseFloat(e)}if(o==false){do{var c=Math.round((Math.floor(e)/1e3-Math.floor(Math.floor(e)/1e3))*1e3);if(t=="id"){n=i(c,r,u,a)+a[r]+" "+n;if(e==0){n="nol"}}if(t=="en"){n=s(c,u,a,f,l)+a[r]+" "+n;if(e==0){n="zero"}}e=Math.floor(Math.floor(e)/1e3);r++}while(e>0);return n.replace(/^\s*|\s(?=\s)|\s*$/g,"")}else{return"NaN"}};var u=function(){var e=r.output;switch(r.lang){case"id":var t=r.lang;var i="rupiah";var s="sen";break;case"en":var t=r.lang;var i="dollar";var s="cent";break}var u=n.val();var u=n.val().split(/[.]|[,]/);var a=o(u,t)+" "+i;var f="";if(u[1]!=undefined){f=o(u[1].substr(0,2),t)+" "+s}if(a.search("NaN")!=-1||f.search("NaN")!=-1){n.val("");e.val("")}else{e.val(a+" "+f)}};return this.each(function(){var t=e(this);e(document).on("keyup change",t,function(e){n=t;if(n.val()!=""){u()}else{n.val("")}})})}})(jQuery) diff --git a/license.txt b/license.txt new file mode 100644 index 0000000..ef6a730 --- /dev/null +++ b/license.txt @@ -0,0 +1,53 @@ +Copyright (c) 2008 - 2014, EllisLab, Inc. +Copyright (c) 2014 - 2015, British Columbia Institute of Technology +All rights reserved. + +This license is a legal agreement between you and the British Columbia +Institute of Technology for the use of CodeIgniter Software (the +"Software"). By obtaining the Software you agree to comply with the terms +and conditions of this license. + +PERMITTED USE +You are permitted to use, copy, modify, and distribute the Software and its +documentation, with or without modification, for any purpose, provided that +the following conditions are met: + +1. A copy of this license agreement must be included with the distribution. + +2. Redistributions of source code must retain the above copyright notice in + all source code files. + +3. Redistributions in binary form must reproduce the above copyright notice + in the documentation and/or other materials provided with the distribution. + +4. Any files that have been modified must carry notices stating the nature + of the change and the names of those who changed them. + +5. Products derived from the Software must include an acknowledgment that + they are derived from CodeIgniter in their documentation and/or other + materials provided with the distribution. + +6. Products derived from the Software may not be called "CodeIgniter", + nor may "CodeIgniter" appear in their name, without prior written + permission from British Columbia Institute of Technology. + +INDEMNITY +You agree to indemnify and hold harmless the authors of the Software and +any contributors for any direct, indirect, incidental, or consequential +third-party claims, actions or suits, as well as any related expenses, +liabilities, damages, settlements or fees arising from your use or misuse +of the Software, or a violation of any terms of this license. + +DISCLAIMER OF WARRANTY +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR +IMPLIED, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF QUALITY, PERFORMANCE, +NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. + +LIMITATIONS OF LIABILITY +YOU ASSUME ALL RISK ASSOCIATED WITH THE INSTALLATION AND USE OF THE SOFTWARE. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS OF THE SOFTWARE BE LIABLE +FOR CLAIMS, DAMAGES OR OTHER LIABILITY ARISING FROM, OUT OF, OR IN CONNECTION +WITH THE SOFTWARE. LICENSE HOLDERS ARE SOLELY RESPONSIBLE FOR DETERMINING THE +APPROPRIATENESS OF USE AND ASSUME ALL RISKS ASSOCIATED WITH ITS USE, INCLUDING +BUT NOT LIMITED TO THE RISKS OF PROGRAM ERRORS, DAMAGE TO EQUIPMENT, LOSS OF +DATA OR SOFTWARE PROGRAMS, OR UNAVAILABILITY OR INTERRUPTION OF OPERATIONS. diff --git a/pengamat_rssa.sql b/pengamat_rssa.sql new file mode 100644 index 0000000..5687d30 --- /dev/null +++ b/pengamat_rssa.sql @@ -0,0 +1,373 @@ +/* +SQLyog Enterprise - MySQL GUI v8.12 +MySQL - 5.5.5-10.1.37-MariaDB-0+deb9u1 : Database - pengamat_rssa +********************************************************************* +*/ + +/*!40101 SET NAMES utf8 */; + +/*!40101 SET SQL_MODE=''*/; + +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/`pengamat_rssa` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; + +USE `pengamat_rssa`; + +/*Table structure for table `ms_instalasi` */ + +DROP TABLE IF EXISTS `ms_instalasi`; + +CREATE TABLE `ms_instalasi` ( + `id_instalasi` bigint(20) NOT NULL AUTO_INCREMENT, + `kode_instalasi` varchar(10) DEFAULT NULL, + `nama_instalasi` varchar(50) DEFAULT NULL, + `ket_instalasi` text, + PRIMARY KEY (`id_instalasi`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4; + +/*Data for the table `ms_instalasi` */ + +insert into `ms_instalasi`(`id_instalasi`,`kode_instalasi`,`nama_instalasi`,`ket_instalasi`) values (1,'IGD','INSTALASI GAWAT DARURAT',NULL),(2,NULL,'INTSTALASI INTENSIF',NULL),(3,'IPU','INSTALASI PELAYANAN UTAMA',NULL),(4,'IPJT','INSTALASI PELAYANAN JANTUNG TERPADU',NULL),(5,NULL,'IRNA IV',NULL),(6,NULL,'IRNA III',NULL),(7,NULL,'IRNA II',NULL),(8,NULL,'IRNA I',NULL),(9,'IBS','INSTALASI BEDAH SENTRAL',NULL),(10,NULL,'INTSTALASI DIALISIS',NULL); + +/*Table structure for table `ms_menu` */ + +DROP TABLE IF EXISTS `ms_menu`; + +CREATE TABLE `ms_menu` ( + `id_menu` bigint(20) NOT NULL AUTO_INCREMENT, + `nama_menu` varchar(20) DEFAULT NULL, + `link_menu` varchar(20) DEFAULT NULL, + `icon_menu` varchar(20) DEFAULT NULL, + `parent_menu` smallint(6) DEFAULT NULL, + `level_menu` smallint(6) DEFAULT NULL, + `action_menu` varchar(20) DEFAULT NULL, + PRIMARY KEY (`id_menu`) +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=latin1; + +/*Data for the table `ms_menu` */ + +insert into `ms_menu`(`id_menu`,`nama_menu`,`link_menu`,`icon_menu`,`parent_menu`,`level_menu`,`action_menu`) values (1,'Home',NULL,'fa fa-home',NULL,1,NULL),(2,'Setting','#','fa fa-gears',NULL,1,NULL),(3,'Hak Akses','ps_hakakses',NULL,2,2,'true'),(4,'User Login','ps_userlogin',NULL,2,2,'true'),(5,'Input Pengamat','#','fa fa-heartbeat',NULL,1,NULL),(6,'Utama','ps_utama',NULL,5,2,'true'),(7,'Khusus IGD','ps_khususigd',NULL,5,2,'true'),(8,'Pasien Meninggal','ps_pasienmeninggal',NULL,5,2,'true'),(9,'Jumlah Pasien','ps_jumlahpasien',NULL,5,2,'true'),(10,'Jumlah Petugas','ps_jumlahpetugas',NULL,5,2,'true'),(11,'Pengkajian Awal','ps_pengkajianawal',NULL,5,2,'true'),(12,'Laporan','#','fa fa-book',NULL,1,NULL),(13,'Laporan Utama','lp_utama',NULL,12,2,'true'); + +/*Table structure for table `ms_ruang` */ + +DROP TABLE IF EXISTS `ms_ruang`; + +CREATE TABLE `ms_ruang` ( + `id_ruang` bigint(20) NOT NULL AUTO_INCREMENT, + `nama_ruang` varchar(50) NOT NULL, + `instalasi_ruang` varchar(50) DEFAULT NULL, + `jumlah_ruang` int(5) DEFAULT NULL, + `ket_ruang` text, + `fk_instalasi` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id_ruang`) +) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=latin1; + +/*Data for the table `ms_ruang` */ + +insert into `ms_ruang`(`id_ruang`,`nama_ruang`,`instalasi_ruang`,`jumlah_ruang`,`ket_ruang`,`fk_instalasi`) values (1,'06','IGD',18,NULL,1),(2,'ICU','INTSTALASI INTENSIF',15,NULL,2),(3,'PICU','INTSTALASI INTENSIF',5,NULL,2),(4,'Mawar','INSTALASI PELAYANAN UTAMA',18,NULL,3),(5,'Wijayakusuma','INSTALASI PELAYANAN UTAMA',5,NULL,3),(6,'Dahlia','INSTALASI PELAYANAN UTAMA',20,NULL,3),(7,'Bugenville','INSTALASI PELAYANAN UTAMA',15,NULL,3),(8,'Tulip','INSTALASI PELAYANAN UTAMA',1,NULL,3),(9,'Stroke Pav','INSTALASI PELAYANAN UTAMA',2,NULL,3),(10,'Melati','INSTALASI PELAYANAN UTAMA',16,NULL,3),(11,'05','IPJT',13,NULL,4),(12,'05 A','IPJT',14,NULL,4),(13,'05 B','IPJT',10,NULL,4),(14,'07 HCU','IRNA IV',11,NULL,5),(15,'07 A','IRNA IV',32,NULL,5),(16,'07 B','IRNA IV',50,NULL,5),(17,'11','IRNA IV',42,NULL,5),(18,'04 Bayi','IRNA III',4,NULL,6),(19,'04 Ibu','IRNA III',16,NULL,6),(20,'08 Bayi','IRNA III',4,NULL,6),(21,'08 Ibu','IRNA III',26,NULL,6),(22,'09','IRNA III',21,NULL,6),(23,'10','IRNA III',10,NULL,6),(24,'12 (HCU Bedah)','IRNA II',30,NULL,7),(25,'13 (Kemo)','IRNA II',26,NULL,7),(26,'14','IRNA II',11,NULL,7),(27,'15','IRNA II',22,NULL,7),(28,'16','IRNA II',11,NULL,7),(29,'17','IRNA II',32,NULL,7),(30,'18','IRNA II',15,NULL,7),(31,'19','IRNA II',42,NULL,7),(32,'20','IRNA II',24,NULL,7),(33,'21','IRNA II',14,NULL,7),(34,'22','IRNA I',35,NULL,8),(35,'23 Psikiatri','IRNA I',22,NULL,8),(36,'23 Umum','IRNA I',18,NULL,8),(37,'24 A','IRNA I',30,NULL,8),(38,'24 B','IRNA I',27,NULL,8),(39,'24 C','IRNA I',20,NULL,8),(40,'25','IRNA I',30,NULL,8),(41,'26 IPD','IRNA I',16,NULL,8),(42,'26 Stroke ','IRNA I',18,NULL,8),(43,'26 HCU','IRNA I',10,NULL,8),(44,'27','IRNA I',40,NULL,8),(45,'28','IRNA I',40,NULL,8),(46,'29','IRNA I',16,NULL,8),(47,'SARS','IRNA I',5,NULL,8),(48,'06 A ICU / PICU','INTSTALASI INTENSIF',0,NULL,2),(49,'PSG','IRNA I',0,NULL,8),(50,'KABER ','IRNA III',0,NULL,6),(51,'CATHLAB','IPJT',0,NULL,4),(52,'KAMAR TERIMA PAV','INSTALASI PELAYANAN UTAMA',0,NULL,3),(53,'AMBULANCE','IGD',0,NULL,1),(54,'TRIAGE','IGD',0,NULL,1),(55,'CRITICAL CARE','IGD',0,NULL,1),(56,'OK EMERGENCY','IBS',0,NULL,9),(57,'OK SENTRAL','IBS',0,NULL,9),(58,'ANASTHESI','IBS',0,NULL,9),(59,'DIALISIS A','INTSTALASI DIALISIS',0,NULL,10),(60,'DIALISIS B','INTSTALASI DIALISIS',0,NULL,10),(61,'DIALISIS C (IPU)','INTSTALASI DIALISIS',0,NULL,10),(62,'CAPD','INTSTALASI DIALISIS',0,NULL,10); + +/*Table structure for table `ms_smf` */ + +DROP TABLE IF EXISTS `ms_smf`; + +CREATE TABLE `ms_smf` ( + `id_smf` bigint(20) NOT NULL AUTO_INCREMENT, + `nama_smf` varchar(20) NOT NULL, + `showall_smf` varchar(10) DEFAULT NULL, + `ket_smf` text, + PRIMARY KEY (`id_smf`) +) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=latin1; + +/*Data for the table `ms_smf` */ + +insert into `ms_smf`(`id_smf`,`nama_smf`,`showall_smf`,`ket_smf`) values (1,'EM','1',NULL),(2,'BEDAH','2',NULL),(3,'IPD','2',NULL),(4,'PARU','2',NULL),(5,'NEURO','2',NULL),(6,'ORTHO','1',NULL),(7,'IKA','2',NULL),(8,'CARDIO','2',NULL),(9,'OBG','2',NULL),(10,'MATA','3',NULL),(11,'THT','3',NULL),(12,'KULIT','3',NULL),(13,'UROLOGI','3',NULL),(14,'PSIKIATRI','3',NULL); + +/*Table structure for table `ms_tipeuser` */ + +DROP TABLE IF EXISTS `ms_tipeuser`; + +CREATE TABLE `ms_tipeuser` ( + `id_tipeuser` bigint(20) NOT NULL AUTO_INCREMENT, + `nama_tipeuser` varchar(20) DEFAULT NULL, + PRIMARY KEY (`id_tipeuser`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4; + +/*Data for the table `ms_tipeuser` */ + +insert into `ms_tipeuser`(`id_tipeuser`,`nama_tipeuser`) values (1,'Super Admin'),(2,'Admin'),(3,'User'),(4,'Pengamat'),(5,'Guest'); + +/*Table structure for table `ms_user` */ + +DROP TABLE IF EXISTS `ms_user`; + +CREATE TABLE `ms_user` ( + `id_user` int(5) NOT NULL AUTO_INCREMENT, + `nama_user` varchar(20) NOT NULL, + `password_user` varchar(50) NOT NULL, + `fk_tipeuser` bigint(20) NOT NULL, + `namalengkap_user` varchar(100) DEFAULT NULL, + `nip_user` varchar(100) DEFAULT NULL, + PRIMARY KEY (`id_user`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1; + +/*Data for the table `ms_user` */ + +insert into `ms_user`(`id_user`,`nama_user`,`password_user`,`fk_tipeuser`,`namalengkap_user`,`nip_user`) values (1,'hamigaki','2b7e24bc8fc16ad84c847f3fd5dc0adb',1,'Ragil Bayu Nugroho','302-25061990-112014-6605'),(2,'itikom','afa7f6fb4dd3bb49e6960b6f4c74ce3d',1,'Team Itikom','0000000'),(3,'pengamat','afa7f6fb4dd3bb49e6960b6f4c74ce3d',4,'Pengamat RSSA','0000000'),(4,'dr.udin','afa7f6fb4dd3bb49e6960b6f4c74ce3d',1,'dr. MUCHAMMAD FAHRUL UDIN, Sp.A, M.Kes','197505242014121001'),(5,'aguseko','afa7f6fb4dd3bb49e6960b6f4c74ce3d',1,'AGUS EKO PURNOMO, SKP, MM','196508121989031018'); + +/*Table structure for table `ms_usermenu` */ + +DROP TABLE IF EXISTS `ms_usermenu`; + +CREATE TABLE `ms_usermenu` ( + `id_usermenu` bigint(20) NOT NULL AUTO_INCREMENT, + `tambah_usermenu` varchar(10) DEFAULT NULL, + `edit_usermenu` varchar(10) DEFAULT NULL, + `delete_usermenu` varchar(10) DEFAULT NULL, + `view_usermenu` varchar(10) DEFAULT NULL, + `fk_tipeuser` bigint(20) DEFAULT NULL, + `fk_menu` smallint(6) DEFAULT NULL, + PRIMARY KEY (`id_usermenu`) +) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=latin1; + +/*Data for the table `ms_usermenu` */ + +insert into `ms_usermenu`(`id_usermenu`,`tambah_usermenu`,`edit_usermenu`,`delete_usermenu`,`view_usermenu`,`fk_tipeuser`,`fk_menu`) values (36,NULL,NULL,NULL,NULL,1,1),(37,NULL,NULL,NULL,NULL,1,2),(38,'tambah','edit','delete','view',1,3),(39,'tambah','edit','delete','view',1,4),(40,NULL,NULL,NULL,'view',1,5),(41,'tambah','edit','delete','view',1,6),(42,'tambah','edit','delete','view',1,7),(43,'tambah','edit','delete','view',1,8),(44,'tambah','edit','delete','view',1,9),(45,'tambah','edit','delete','view',1,10),(46,'tambah','edit','delete','view',1,11),(47,NULL,NULL,NULL,'view',1,12),(48,'tambah','edit','delete','view',1,13),(49,NULL,NULL,NULL,NULL,4,1),(50,NULL,NULL,NULL,NULL,4,5),(51,'tambah','edit','delete','view',4,6),(52,'tambah','edit','delete','view',4,7),(53,'tambah','edit','delete','view',4,8),(54,'tambah','edit','delete','view',4,9),(55,'tambah','edit','delete','view',4,10),(56,'tambah','edit','delete','view',4,11),(57,NULL,NULL,NULL,'view',4,12),(58,'tambah','edit','delete','view',4,13); + +/*Table structure for table `ps_catatanobservasi` */ + +DROP TABLE IF EXISTS `ps_catatanobservasi`; + +CREATE TABLE `ps_catatanobservasi` ( + `id_catatanobservasi` bigint(20) NOT NULL AUTO_INCREMENT, + `kurang3jam_catatanobservasi` int(10) DEFAULT NULL, + `sd8jam_catatanobservasi` int(10) DEFAULT NULL, + `lebihdari8jam_catatanobservasi` int(10) DEFAULT NULL, + `quantity_catatanobservasi` int(10) DEFAULT NULL, + `fk_laporpengamat` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id_catatanobservasi`) +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=latin1; + +/*Data for the table `ps_catatanobservasi` */ + +insert into `ps_catatanobservasi`(`id_catatanobservasi`,`kurang3jam_catatanobservasi`,`sd8jam_catatanobservasi`,`lebihdari8jam_catatanobservasi`,`quantity_catatanobservasi`,`fk_laporpengamat`) values (1,1,2,3,NULL,4),(8,100,200,300,NULL,4),(9,1,2,3,NULL,5),(10,4,5,6,NULL,5),(11,NULL,NULL,NULL,NULL,6),(12,10,20,30,NULL,4),(13,5,5,2,NULL,9); + +/*Table structure for table `ps_catatanstagnasi` */ + +DROP TABLE IF EXISTS `ps_catatanstagnasi`; + +CREATE TABLE `ps_catatanstagnasi` ( + `id_catatanstagnasi` bigint(20) NOT NULL AUTO_INCREMENT, + `diagnosa_catatanstagnasi` varchar(50) DEFAULT NULL, + `quantity_catatanstagnasi` int(10) DEFAULT NULL, + `ket_catatanstagnasi` text, + `fk_ruang` bigint(20) DEFAULT NULL, + `fk_laporpengamat` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id_catatanstagnasi`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1; + +/*Data for the table `ps_catatanstagnasi` */ + +insert into `ps_catatanstagnasi`(`id_catatanstagnasi`,`diagnosa_catatanstagnasi`,`quantity_catatanstagnasi`,`ket_catatanstagnasi`,`fk_ruang`,`fk_laporpengamat`) values (1,'ckd edit',NULL,'penuh edit',2,4),(2,'hf edit',NULL,'penuh edit',3,4),(6,'1',NULL,'2',1,5),(7,'3',NULL,'4',2,5),(8,NULL,NULL,NULL,NULL,6),(9,'B24',NULL,'-',41,9),(10,'CKD',NULL,'-',41,9); + +/*Table structure for table `ps_dokterjagaigd` */ + +DROP TABLE IF EXISTS `ps_dokterjagaigd`; + +CREATE TABLE `ps_dokterjagaigd` ( + `id_dokterjagaigd` bigint(20) NOT NULL AUTO_INCREMENT, + `nama_doterjagaigd` varchar(50) DEFAULT NULL, + `fk_smf` bigint(20) DEFAULT NULL, + `fk_utamalaporan` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id_dokterjagaigd`) +) ENGINE=InnoDB AUTO_INCREMENT=84 DEFAULT CHARSET=latin1; + +/*Data for the table `ps_dokterjagaigd` */ + +insert into `ps_dokterjagaigd`(`id_dokterjagaigd`,`nama_doterjagaigd`,`fk_smf`,`fk_utamalaporan`) values (1,'dr. em',1,1),(2,'dr. bedah',2,1),(30,'1 dr BUDI',1,5),(31,'2 dr. HANIF',2,5),(32,'3 dr. ADIS',3,5),(33,'4 dr. ANDRI',4,5),(34,'5 dr. NYOMAN',5,5),(35,'6 dr.',6,5),(36,'7 dr. novi ',7,5),(37,'8 dr. FARIS',8,5),(38,'9 dr. DESTI',9,5),(39,'EM',1,6),(40,'BEDAH',2,6),(41,'IPD',3,6),(42,'PARU',4,6),(43,'NEURO',5,6),(44,'ORTHO',6,6),(45,'IKA',7,6),(46,'CARDIO',8,6),(47,'OBG',9,6),(48,'EM',1,7),(49,'BEDAH',2,7),(50,'IPD',3,7),(51,'PARU',4,7),(52,'NEURO',5,7),(53,'ORTHO',6,7),(54,'IKA',7,7),(55,'CARDIO',8,7),(56,'OBG',9,7),(57,'Dr EM',1,8),(58,'',2,8),(59,'',3,8),(60,'',4,8),(61,'',5,8),(62,'',6,8),(63,'',7,8),(64,'',8,8),(65,'',9,8),(66,'Em',1,9),(67,'Bedah',2,9),(68,'',3,9),(69,'',4,9),(70,'',5,9),(71,'',6,9),(72,'',7,9),(73,'',8,9),(74,'',9,9),(75,'EM',1,10),(76,'BEDAH',2,10),(77,'IPD',3,10),(78,'PARU',4,10),(79,'NEURO',5,10),(80,'ORTHO',6,10),(81,'',7,10),(82,'',8,10),(83,'',9,10); + +/*Table structure for table `ps_implementasiak` */ + +DROP TABLE IF EXISTS `ps_implementasiak`; + +CREATE TABLE `ps_implementasiak` ( + `id_implementasiak` int(11) NOT NULL AUTO_INCREMENT, + `element_implementasiak` varchar(50) DEFAULT NULL, + `responden_implementasiak` int(10) DEFAULT NULL, + `jumlah_implementasiak` int(10) DEFAULT NULL, + `prosentase_implementasiak` int(10) DEFAULT NULL, + `fk_utamalaporan` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id_implementasiak`) +) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=latin1; + +/*Data for the table `ps_implementasiak` */ + +insert into `ps_implementasiak`(`id_implementasiak`,`element_implementasiak`,`responden_implementasiak`,`jumlah_implementasiak`,`prosentase_implementasiak`,`fk_utamalaporan`) values (1,'element yang dinilai 1',20,20,100,1),(2,'element yang dinilai 2',30,0,50,1),(7,'1. APAR',4,4,100,5),(8,'1',2,3,4,6),(9,'20',20,20,20,7),(10,'1',2,3,4,8),(11,'12',12,3,2,9),(12,'10',10,10,10,10),(13,'2. 5 Momen cc tngn',4,4,100,5),(14,'3. batuk efektive',4,4,100,5),(15,'4. BHD',4,4,100,5); + +/*Table structure for table `ps_jumlahpasien` */ + +DROP TABLE IF EXISTS `ps_jumlahpasien`; + +CREATE TABLE `ps_jumlahpasien` ( + `id_jumlahpasien` bigint(20) NOT NULL AUTO_INCREMENT, + `umum_jumlahpasien` int(10) DEFAULT NULL, + `jkn_jumlahpasien` int(10) DEFAULT NULL, + `jamkesda_jumlahpasien` int(10) DEFAULT NULL, + `jamkesmas_jumlahpasien` int(10) DEFAULT NULL, + `mrx_jumlahpasien` int(10) DEFAULT NULL, + `fk_ruang` bigint(20) DEFAULT NULL, + `fk_laporpengamat` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id_jumlahpasien`) +) ENGINE=InnoDB AUTO_INCREMENT=112 DEFAULT CHARSET=latin1; + +/*Data for the table `ps_jumlahpasien` */ + +insert into `ps_jumlahpasien`(`id_jumlahpasien`,`umum_jumlahpasien`,`jkn_jumlahpasien`,`jamkesda_jumlahpasien`,`jamkesmas_jumlahpasien`,`mrx_jumlahpasien`,`fk_ruang`,`fk_laporpengamat`) values (69,1,0,0,10,0,1,15),(70,2,0,0,2,0,2,15),(71,3,0,0,2,0,3,15),(72,4,0,0,4,0,4,15),(73,5,0,0,0,0,5,15),(74,6,0,0,14,0,6,15),(75,7,0,0,8,0,7,15),(76,1,0,0,0,0,8,15),(77,2,0,0,0,0,9,15),(78,10,0,0,0,0,10,15),(79,1,0,0,0,0,14,15),(80,2,0,0,0,0,15,15),(81,3,0,0,0,0,16,15),(82,4,0,0,0,0,17,15),(83,0,1,0,0,0,34,15),(84,0,2,0,0,0,35,15),(85,0,3,0,0,0,36,15),(86,0,4,0,0,0,37,15),(87,0,5,0,0,0,38,15),(88,0,6,0,0,0,39,15),(89,0,7,0,0,0,40,15),(90,0,8,0,0,0,41,15),(91,0,9,0,0,0,42,15),(92,0,10,0,0,0,43,15),(93,0,11,0,0,0,44,15),(94,0,12,0,0,0,45,15),(95,0,13,0,0,0,46,15),(96,0,5,0,0,0,47,15),(107,18,0,0,0,0,1,17),(108,15,0,0,0,0,2,17),(109,5,0,0,0,0,3,17),(110,5,0,0,0,0,5,17),(111,20,0,0,0,0,6,17); + +/*Table structure for table `ps_jumlahpetugas` */ + +DROP TABLE IF EXISTS `ps_jumlahpetugas`; + +CREATE TABLE `ps_jumlahpetugas` ( + `id_jumlahpetugas` bigint(20) NOT NULL AUTO_INCREMENT, + `sorepwt_jumlahpetugas` int(10) DEFAULT NULL, + `sorepky_jumlahpetugas` int(10) DEFAULT NULL, + `malampwt_jumlahpetugas` int(10) DEFAULT NULL, + `malampky_jumlahpetugas` int(10) DEFAULT NULL, + `fk_ruang` bigint(20) DEFAULT NULL, + `fk_laporpengamat` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id_jumlahpetugas`) +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1; + +/*Data for the table `ps_jumlahpetugas` */ + +insert into `ps_jumlahpetugas`(`id_jumlahpetugas`,`sorepwt_jumlahpetugas`,`sorepky_jumlahpetugas`,`malampwt_jumlahpetugas`,`malampky_jumlahpetugas`,`fk_ruang`,`fk_laporpengamat`) values (5,2,3,4,5,1,19),(6,5,6,7,8,53,19),(7,9,10,11,12,54,19),(8,13,14,15,16,55,19),(9,1,2,3,4,2,19); + +/*Table structure for table `ps_laporanmeninggal` */ + +DROP TABLE IF EXISTS `ps_laporanmeninggal`; + +CREATE TABLE `ps_laporanmeninggal` ( + `id_laporanmeninggal` bigint(20) NOT NULL AUTO_INCREMENT, + `jumlah_laporanmeninggal` int(10) DEFAULT NULL, + `diagnosa_laporanmeninggal` varchar(50) DEFAULT NULL, + `penyebab_laporanmeninggal` text, + `fk_ruang` bigint(20) DEFAULT NULL, + `fk_laporpengamat` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id_laporanmeninggal`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1; + +/*Data for the table `ps_laporanmeninggal` */ + +insert into `ps_laporanmeninggal`(`id_laporanmeninggal`,`jumlah_laporanmeninggal`,`diagnosa_laporanmeninggal`,`penyebab_laporanmeninggal`,`fk_ruang`,`fk_laporpengamat`) values (5,5,'CKD','gagal nafas',1,8),(6,1,'COB','gagal nafas',2,8); + +/*Table structure for table `ps_laporanpasienigd` */ + +DROP TABLE IF EXISTS `ps_laporanpasienigd`; + +CREATE TABLE `ps_laporanpasienigd` ( + `id_laporanpasienigd` bigint(20) NOT NULL AUTO_INCREMENT, + `krs_laporanpasienigd` int(10) DEFAULT NULL, + `mrs_laporanpasienigd` int(10) DEFAULT NULL, + `aps_laporanpasienigd` int(10) DEFAULT NULL, + `meninggal_laporanpasienigd` int(10) DEFAULT NULL, + `sisastagnasi_laporanpasienigd` int(10) DEFAULT NULL, + `sisaobservasi_laporanpasienigd` int(10) DEFAULT NULL, + `oppagi_laporanpasienigd` int(10) DEFAULT NULL, + `opsiang_laporanpasienigd` int(10) DEFAULT NULL, + `opmalam_laporanpasienigd` int(10) DEFAULT NULL, + `ket_laporanpasienigd` text, + `fk_laporpengamat` bigint(20) DEFAULT NULL, + `fk_smf` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id_laporanpasienigd`) +) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=latin1; + +/*Data for the table `ps_laporanpasienigd` */ + +insert into `ps_laporanpasienigd`(`id_laporanpasienigd`,`krs_laporanpasienigd`,`mrs_laporanpasienigd`,`aps_laporanpasienigd`,`meninggal_laporanpasienigd`,`sisastagnasi_laporanpasienigd`,`sisaobservasi_laporanpasienigd`,`oppagi_laporanpasienigd`,`opsiang_laporanpasienigd`,`opmalam_laporanpasienigd`,`ket_laporanpasienigd`,`fk_laporpengamat`,`fk_smf`) values (1,21,22,23,24,25,26,27,28,29,'ket 30 edit',4,1),(2,1,2,3,4,5,6,7,8,9,'10',4,14),(3,1,2,3,4,5,6,7,8,9,'10',5,1),(4,11,12,13,14,15,16,17,18,19,'20',5,2),(5,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,6,NULL),(6,0,0,0,0,0,0,0,0,0,'',4,2),(7,0,0,0,0,0,0,0,0,0,'',4,3),(8,0,0,0,0,0,0,0,0,0,'',4,4),(9,5,6,7,8,9,10,11,12,13,'',4,5),(10,0,0,0,0,0,0,0,0,0,'',4,7),(11,0,0,0,0,0,0,0,0,0,'',4,8),(12,0,0,0,0,0,0,0,0,0,'',4,9),(13,0,0,0,0,0,0,0,0,0,'',4,10),(14,0,0,0,0,0,0,0,0,0,'',4,11),(15,0,0,0,0,0,0,0,0,0,'',4,12),(16,0,0,0,0,0,0,0,0,0,'',4,13),(30,7,8,9,10,11,12,13,14,15,'kuy',9,8),(31,11,12,13,14,15,16,17,18,19,'yeah',9,12); + +/*Table structure for table `ps_laporpengamat` */ + +DROP TABLE IF EXISTS `ps_laporpengamat`; + +CREATE TABLE `ps_laporpengamat` ( + `id_laporpengamat` bigint(20) NOT NULL AUTO_INCREMENT, + `date_laporpengamat` date DEFAULT NULL, + `time_laporpengamat` time DEFAULT NULL, + `jamjaga_laporpengamat` varchar(20) DEFAULT NULL, + `jampelaporan_laporpengamat` varchar(20) DEFAULT NULL, + `pengamat1_laporpengamat` varchar(50) DEFAULT NULL, + `pengamat2_laporpengamat` varchar(50) DEFAULT NULL, + `status_laporpengamat` int(2) DEFAULT NULL, + `fk_user` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id_laporpengamat`) +) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=latin1; + +/*Data for the table `ps_laporpengamat` */ + +insert into `ps_laporpengamat`(`id_laporpengamat`,`date_laporpengamat`,`time_laporpengamat`,`jamjaga_laporpengamat`,`jampelaporan_laporpengamat`,`pengamat1_laporpengamat`,`pengamat2_laporpengamat`,`status_laporpengamat`,`fk_user`) values (1,'2020-04-16',NULL,'malam','21:00','Maria','Samini',1,2),(4,'2020-02-25',NULL,'malam','09:30','mamat edit edit','sugeng edit edit',2,2),(8,'2020-02-25',NULL,'malam','16:10','yanto','maksum',3,2),(9,'2020-03-17',NULL,'pagi','07:56','Dwiki','Rahmat',2,2),(15,'2020-03-18',NULL,'sore','15:15','DWIKI','MAMAT',4,2),(17,'2020-03-20',NULL,'pagi','10:10','Agung','Kadek',4,2),(19,'2020-03-21',NULL,'sore','13:58','Yusuf','Samsul',5,2),(20,'2020-03-23',NULL,'sore','15:00','Yayuk Tes','Sri Tes',6,2),(24,'2020-04-17',NULL,'pagi','06:00','M. FAUZAN','PANDOYO',1,1),(25,'2020-04-01',NULL,'pagi','08:32','LISTIA','KANZI',1,1),(26,'2020-04-01',NULL,'sore','15:50','Tukijan','Wardo',1,1),(27,'2020-04-18',NULL,'malam','06:00','Suparno, S.Kep,NS','Mohammad Muchlas, SST',1,1),(28,'2020-05-31',NULL,'malam','18:20','Jito','Supri',1,1),(29,'2020-04-01',NULL,'malam','20:00','Supriadi','Sulistiyo',1,1); + +/*Table structure for table `ps_pengkajianawal` */ + +DROP TABLE IF EXISTS `ps_pengkajianawal`; + +CREATE TABLE `ps_pengkajianawal` ( + `id_pengkajianawal` bigint(20) NOT NULL AUTO_INCREMENT, + `jumlahpx_pengkajianawal` int(10) DEFAULT NULL, + `kurang24jam_pengkajianawal` int(10) DEFAULT NULL, + `lebih24jam_pengkajianawal` int(10) DEFAULT NULL, + `fk_ruang` bigint(20) DEFAULT NULL, + `fk_laporpengamat` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id_pengkajianawal`) +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1; + +/*Data for the table `ps_pengkajianawal` */ + +insert into `ps_pengkajianawal`(`id_pengkajianawal`,`jumlahpx_pengkajianawal`,`kurang24jam_pengkajianawal`,`lebih24jam_pengkajianawal`,`fk_ruang`,`fk_laporpengamat`) values (1,101,5,5,18,20),(2,201,10,10,19,20),(3,151,8,7,11,20),(4,31,2,1,12,20),(5,1,0,0,13,20),(6,2,0,0,1,20),(7,3,0,0,48,20),(8,4,0,0,15,20),(9,5,0,0,16,20); + +/*Table structure for table `ps_ruangpantau` */ + +DROP TABLE IF EXISTS `ps_ruangpantau`; + +CREATE TABLE `ps_ruangpantau` ( + `id_ruangpantau` bigint(20) NOT NULL AUTO_INCREMENT, + `jumlahpx_ruangpantau` int(10) DEFAULT NULL, + `askeptulis_ruangpantau` int(10) DEFAULT NULL, + `askeptidak_ruangpantau` int(10) DEFAULT NULL, + `cptulis_ruangpantau` int(10) DEFAULT NULL, + `cptidak_ruangpantau` int(10) DEFAULT NULL, + `fk_ruang` bigint(20) DEFAULT NULL, + `fk_utamalaporan` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id_ruangpantau`) +) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=latin1; + +/*Data for the table `ps_ruangpantau` */ + +insert into `ps_ruangpantau`(`id_ruangpantau`,`jumlahpx_ruangpantau`,`askeptulis_ruangpantau`,`askeptidak_ruangpantau`,`cptulis_ruangpantau`,`cptidak_ruangpantau`,`fk_ruang`,`fk_utamalaporan`) values (1,8,5,3,2,6,1,1),(2,15,5,5,8,2,2,1),(3,10,6,4,7,3,3,1),(17,14,14,0,14,0,41,5),(18,5,5,0,5,0,42,5),(19,1,2,3,4,5,19,6),(20,1,2,3,4,5,19,7),(21,1,2,3,4,5,20,8),(22,1,2,3,4,4,12,9),(23,10,8,2,7,3,14,10),(24,3,3,0,3,0,43,5); + +/*Table structure for table `ps_utamalaporan` */ + +DROP TABLE IF EXISTS `ps_utamalaporan`; + +CREATE TABLE `ps_utamalaporan` ( + `id_utamalaporan` bigint(20) NOT NULL AUTO_INCREMENT, + `supervisi_utamalaporan` text, + `p1_utamalaporan` int(5) DEFAULT NULL, + `p2_utamalaporan` int(5) DEFAULT NULL, + `p3_utamalaporan` int(5) DEFAULT NULL, + `ket_utamalaporan` text, + `pxkusus_utamalaporan` text, + `pxpenting_utamalaporan` text, + `ktd_utamalaporan` text, + `lainlain_utamalaporan` text, + `fk_laporpengamat` bigint(20) DEFAULT NULL, + PRIMARY KEY (`id_utamalaporan`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1; + +/*Data for the table `ps_utamalaporan` */ + +insert into `ps_utamalaporan`(`id_utamalaporan`,`supervisi_utamalaporan`,`p1_utamalaporan`,`p2_utamalaporan`,`p3_utamalaporan`,`ket_utamalaporan`,`pxkusus_utamalaporan`,`pxpenting_utamalaporan`,`ktd_utamalaporan`,`lainlain_utamalaporan`,`fk_laporpengamat`) values (1,'Mati air di R.18 i|',0,0,0,'keterangan ','catatan kusus 1 |catatan kusus 2|catatan kusus 3|','catatan pasien keluarga 1|catatan pasien keluarga 2|','laporan ktd 1|laporan ktd 2|laporan ktd 3|laporan ktd 4|','laporan lain lain coba 1',1),(5,'Petugas lengkap,tugas-tugas dapat diselesaikan dg baik,lingkungan aman dan sarpras tdk ada masalah|',0,0,0,'KET','','CAT PAS|','TIDAK ADA|','LAIN LAIN',24),(6,'LAPSU 1|TES 1|TES 2|TES 3|',0,0,0,'8','9|','10|','11|','12',25),(7,'Tes 1 SORE|Tes 2 SORE|Tes 3 SORE|',0,0,0,'KET 1','CAT KUS 1|CAT KUS 2|CAT KUS 3|','CAT PA 1\n|','KTD 1|KTD 2|','LAIN LAIN',26),(8,'laporan supervisi 1|laporan supervisi 2|laporan supervisi 3|',0,0,0,'SDASDASD','ASDAS|','DASDAS|','ASDA|','ASDASD',27),(9,'lap 1|',8,3,3,'sdfdsf','sdfs|','dfsdf|','sdfsd|','fsdfs',28),(10,'2 Pasien kabur|1 Pasien meninggal tidak ada keluarga |',10,20,15,'','','','','',29); + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; diff --git a/skema.odg b/skema.odg new file mode 100644 index 0000000..ee3cf20 Binary files /dev/null and b/skema.odg differ diff --git a/skema.schemaxml b/skema.schemaxml new file mode 100644 index 0000000..c1d36f4 --- /dev/null +++ b/skema.schemaxml @@ -0,0 +1,182 @@ +<?xml version="1.0" encoding="UTF-8"?> +<schemadesigner version="6.5"> +<source> +<database charset="utf8mb4" collation="utf8mb4_general_ci">antrian_rssa</database> +</source> +<canvas zoom="70"> +<tables> +<table name="master_klinik" view="colnames"> +<left>65</left> +<top>7</top> +<width>100</width> +<height>161</height> +<sql_create_table>CREATE TABLE `master_klinik` ( + `mk_id` int(11) NOT NULL AUTO_INCREMENT, + `mk_nama` varchar(50) DEFAULT NULL, + `mk_kode` varchar(50) DEFAULT NULL, + `mk_shift` int(5) DEFAULT NULL, + `mk_jam` int(5) DEFAULT NULL, + `mk_quota` int(5) DEFAULT NULL, + `mk_quota_bangku` int(5) DEFAULT NULL, + `mk_status_shift` int(5) DEFAULT NULL, + `mk_aktif` int(5) DEFAULT NULL, + PRIMARY KEY (`mk_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4</sql_create_table> +</table> +<table name="master_loket" view="colnames"> +<left>535</left> +<top>11</top> +<width>100</width> +<height>100</height> +<sql_create_table>CREATE TABLE `master_loket` ( + `ml_id` int(11) NOT NULL AUTO_INCREMENT, + `ml_nama` varchar(50) DEFAULT NULL, + `ml_pelayanan` text, + `ml_quota_bangku` int(5) DEFAULT NULL, + PRIMARY KEY (`ml_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4</sql_create_table> +</table> +<table name="master_menu" view="colnames"> +<left>64</left> +<top>260</top> +<width>101</width> +<height>154</height> +<sql_create_table>CREATE TABLE `master_menu` ( + `mm_id` int(11) NOT NULL AUTO_INCREMENT, + `mm_nama` varchar(50) DEFAULT NULL, + `mm_link` varchar(50) DEFAULT NULL, + `mm_icon` varchar(50) DEFAULT NULL, + `mm_parent` int(5) DEFAULT NULL, + `mm_level` int(5) DEFAULT NULL, + `mm_action` varchar(15) DEFAULT NULL, + PRIMARY KEY (`mm_id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4</sql_create_table> +</table> +<table name="master_tipeuser" view="colnames"> +<left>80</left> +<top>174</top> +<width>84</width> +<height>77</height> +<sql_create_table>CREATE TABLE `master_tipeuser` ( + `mt_id` int(11) NOT NULL AUTO_INCREMENT, + `mt_nama` varchar(20) DEFAULT NULL, + PRIMARY KEY (`mt_id`) +) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4</sql_create_table> +</table> +<table name="master_user" view="colnames"> +<left>317</left> +<top>9</top> +<width>126</width> +<height>133</height> +<sql_create_table>CREATE TABLE `master_user` ( + `mu_id` int(11) NOT NULL AUTO_INCREMENT, + `mu_nama_lengkap` varchar(50) DEFAULT NULL, + `mu_nama_user` varchar(50) DEFAULT NULL, + `mu_password` varchar(50) DEFAULT NULL, + `mu_klinik_id` int(11) DEFAULT NULL, + `mu_loket_id` int(11) DEFAULT NULL, + `mu_tipeuser_id` int(11) DEFAULT NULL, + PRIMARY KEY (`mu_id`), + KEY `user_loket_FK` (`mu_loket_id`), + KEY `user_tipeuser_FK` (`mu_tipeuser_id`), + KEY `user_kunjunganklinik_FK` (`mu_klinik_id`), + CONSTRAINT `user_kunjunganklinik_FK` FOREIGN KEY (`mu_klinik_id`) REFERENCES `master_klinik` (`mk_id`) ON DELETE SET NULL ON UPDATE SET NULL, + CONSTRAINT `user_loket_FK` FOREIGN KEY (`mu_loket_id`) REFERENCES `master_loket` (`ml_id`) ON DELETE SET NULL ON UPDATE SET NULL, + CONSTRAINT `user_tipeuser_FK` FOREIGN KEY (`mu_tipeuser_id`) REFERENCES `master_tipeuser` (`mt_id`) ON DELETE SET NULL ON UPDATE SET NULL +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4</sql_create_table> +</table> +<table name="proses_pengunjung" view="colnames"> +<left>500</left> +<top>122</top> +<width>154</width> +<height>210</height> +<sql_create_table>CREATE TABLE `proses_pengunjung` ( + `pp_id` int(11) NOT NULL AUTO_INCREMENT, + `pp_nomor_antrian` varchar(10) DEFAULT NULL, + `pp_shift` int(5) DEFAULT NULL, + `pp_tanggal_periksa` datetime DEFAULT NULL, + `pp_tanggal_datang` datetime DEFAULT NULL, + `pp_posisi_status` int(5) DEFAULT NULL, + `pp_pendaftaran_online` varchar(10) DEFAULT NULL, + `pp_rekamedik` int(10) DEFAULT NULL, + `pp_status` int(5) DEFAULT NULL, + `pp_aktif` int(5) DEFAULT NULL, + `pp_klinik_id` int(11) DEFAULT NULL, + PRIMARY KEY (`pp_id`), + KEY `pengunjung_klinik_FK` (`pp_klinik_id`), + CONSTRAINT `pengunjung_klinik_FK` FOREIGN KEY (`pp_klinik_id`) REFERENCES `master_klinik` (`mk_id`) ON DELETE SET NULL ON UPDATE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4</sql_create_table> +</table> +<table name="master_user_menu" view="colnames"> +<left>210</left> +<top>291</top> +<width>102</width> +<height>138</height> +<sql_create_table>CREATE TABLE `master_user_menu` ( + `mum_id` int(11) NOT NULL AUTO_INCREMENT, + `mum_tambah` varchar(10) DEFAULT NULL, + `mum_ubah` varchar(10) DEFAULT NULL, + `mum_hapus` varchar(10) DEFAULT NULL, + `mum_lihat` varchar(10) DEFAULT NULL, + `mum_tipeuser_id` int(11) DEFAULT NULL, + `mum_menu_id` int(11) DEFAULT NULL, + PRIMARY KEY (`mum_id`), + KEY `usermenu_tipeuser_FK` (`mum_tipeuser_id`), + KEY `usermenu_menu_FK` (`mum_menu_id`), + CONSTRAINT `usermenu_menu_FK` FOREIGN KEY (`mum_menu_id`) REFERENCES `master_menu` (`mm_id`) ON DELETE SET NULL ON UPDATE SET NULL, + CONSTRAINT `usermenu_tipeuser_FK` FOREIGN KEY (`mum_tipeuser_id`) REFERENCES `master_tipeuser` (`mt_id`) ON DELETE SET NULL ON UPDATE SET NULL +) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4</sql_create_table> +</table> +<table name="proses_kunjung_klinik" view="colnames"> +<left>334</left> +<top>245</top> +<width>113</width> +<height>114</height> +<sql_create_table>CREATE TABLE `proses_kunjung_klinik` ( + `pkk_id` int(11) NOT NULL AUTO_INCREMENT, + `pkk_tanggal_datang` datetime DEFAULT NULL, + `pkk_tanggal_selesai` datetime DEFAULT NULL, + `pkk_klinik_id` int(11) DEFAULT NULL, + `pkk_pengunjung_id` int(11) DEFAULT NULL, + PRIMARY KEY (`pkk_id`), + KEY `kunjunganklinik_pengunjung_FK` (`pkk_klinik_id`), + CONSTRAINT `kunjunganklinik_klinik_FK` FOREIGN KEY (`pkk_klinik_id`) REFERENCES `master_klinik` (`mk_id`) ON DELETE SET NULL ON UPDATE SET NULL, + CONSTRAINT `kunjunganklinik_pengunjung_FK` FOREIGN KEY (`pkk_klinik_id`) REFERENCES `proses_pengunjung` (`pp_id`) ON DELETE SET NULL ON UPDATE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4</sql_create_table> +</table> +<table name="proses_kunjung_loket" view="colnames"> +<left>669</left> +<top>8</top> +<width>111</width> +<height>114</height> +<sql_create_table>CREATE TABLE `proses_kunjung_loket` ( + `pkl_id` int(11) NOT NULL AUTO_INCREMENT, + `pkl_tanggal_datang` datetime DEFAULT NULL, + `pkl_tanggal_selesai` datetime DEFAULT NULL, + `pkl_loket_id` int(11) DEFAULT NULL, + `pkl_pengunjung_id` int(11) DEFAULT NULL, + PRIMARY KEY (`pkl_id`), + KEY `kunjunganloket_loket_FK` (`pkl_loket_id`), + KEY `kunjunganloket_pengunjung_FK` (`pkl_pengunjung_id`), + CONSTRAINT `kunjunganloket_loket_FK` FOREIGN KEY (`pkl_loket_id`) REFERENCES `master_loket` (`ml_id`) ON DELETE SET NULL ON UPDATE SET NULL, + CONSTRAINT `kunjunganloket_pengunjung_FK` FOREIGN KEY (`pkl_pengunjung_id`) REFERENCES `proses_pengunjung` (`pp_id`) ON DELETE SET NULL ON UPDATE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4</sql_create_table> +</table> +<table name="proses_ruang_tunggu" view="colnames"> +<left>709</left> +<top>139</top> +<width>107</width> +<height>114</height> +<sql_create_table>CREATE TABLE `proses_ruang_tunggu` ( + `prt_id` int(11) DEFAULT NULL, + `prt_status` int(5) DEFAULT NULL, + `prt_tanggal` datetime DEFAULT NULL, + `prt_aktif` int(5) DEFAULT NULL, + `prt_pengunjung_id` int(5) DEFAULT NULL, + KEY `ruangtunggu_pengunjung_FK` (`prt_pengunjung_id`), + CONSTRAINT `ruangtunggu_pengunjung_FK` FOREIGN KEY (`prt_pengunjung_id`) REFERENCES `proses_pengunjung` (`pp_id`) ON DELETE SET NULL ON UPDATE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4</sql_create_table> +</table> +</tables> +</canvas> +</schemadesigner> \ No newline at end of file diff --git a/system/core/Benchmark.php b/system/core/Benchmark.php new file mode 100644 index 0000000..daffa29 --- /dev/null +++ b/system/core/Benchmark.php @@ -0,0 +1,119 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Benchmark Class + * + * This class enables you to mark points and calculate the time difference + * between them. Memory consumption can also be displayed. + * + * @package CodeIgniter + * @subpackage Libraries + * @category Libraries + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/benchmark.html + */ +class CI_Benchmark { + + /** + * List of all benchmark markers and when they were added + * + * @var array + */ + var $marker = array(); + + // -------------------------------------------------------------------- + + /** + * Set a benchmark marker + * + * Multiple calls to this function can be made so that several + * execution points can be timed + * + * @access public + * @param string $name name of the marker + * @return void + */ + function mark($name) + { + $this->marker[$name] = microtime(); + } + + // -------------------------------------------------------------------- + + /** + * Calculates the time difference between two marked points. + * + * If the first parameter is empty this function instead returns the + * {elapsed_time} pseudo-variable. This permits the full system + * execution time to be shown in a template. The output class will + * swap the real value for this variable. + * + * @access public + * @param string a particular marked point + * @param string a particular marked point + * @param integer the number of decimal places + * @return mixed + */ + function elapsed_time($point1 = '', $point2 = '', $decimals = 4) + { + if ($point1 == '') + { + return '{elapsed_time}'; + } + + if ( ! isset($this->marker[$point1])) + { + return ''; + } + + if ( ! isset($this->marker[$point2])) + { + $this->marker[$point2] = microtime(); + } + + list($sm, $ss) = explode(' ', $this->marker[$point1]); + list($em, $es) = explode(' ', $this->marker[$point2]); + + return number_format(($em + $es) - ($sm + $ss), $decimals); + } + + // -------------------------------------------------------------------- + + /** + * Memory Usage + * + * This function returns the {memory_usage} pseudo-variable. + * This permits it to be put it anywhere in a template + * without the memory being calculated until the end. + * The output class will swap the real value for this variable. + * + * @access public + * @return string + */ + function memory_usage() + { + return '{memory_usage}'; + } + +} + +// END CI_Benchmark class + +/* End of file Benchmark.php */ +/* Location: ./system/core/Benchmark.php */ \ No newline at end of file diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php new file mode 100644 index 0000000..af3d743 --- /dev/null +++ b/system/core/CodeIgniter.php @@ -0,0 +1,403 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * System Initialization File + * + * Loads the base classes and executes the request. + * + * @package CodeIgniter + * @subpackage codeigniter + * @category Front-controller + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/ + */ + +/** + * CodeIgniter Version + * + * @var string + * + */ + define('CI_VERSION', '2.2.6'); + +/** + * CodeIgniter Branch (Core = TRUE, Reactor = FALSE) + * + * @var boolean + * + */ + define('CI_CORE', FALSE); + +/* + * ------------------------------------------------------ + * Load the global functions + * ------------------------------------------------------ + */ + require(BASEPATH.'core/Common.php'); + +/* + * ------------------------------------------------------ + * Load the framework constants + * ------------------------------------------------------ + */ + if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/constants.php')) + { + require(APPPATH.'config/'.ENVIRONMENT.'/constants.php'); + } + else + { + require(APPPATH.'config/constants.php'); + } + +/* + * ------------------------------------------------------ + * Define a custom error handler so we can log PHP errors + * ------------------------------------------------------ + */ + set_error_handler('_exception_handler'); + + if ( ! is_php('5.3')) + { + @set_magic_quotes_runtime(0); // Kill magic quotes + } + +/* + * ------------------------------------------------------ + * Set the subclass_prefix + * ------------------------------------------------------ + * + * Normally the "subclass_prefix" is set in the config file. + * The subclass prefix allows CI to know if a core class is + * being extended via a library in the local application + * "libraries" folder. Since CI allows config items to be + * overriden via data set in the main index. php file, + * before proceeding we need to know if a subclass_prefix + * override exists. If so, we will set this value now, + * before any classes are loaded + * Note: Since the config file data is cached it doesn't + * hurt to load it here. + */ + if (isset($assign_to_config['subclass_prefix']) AND $assign_to_config['subclass_prefix'] != '') + { + get_config(array('subclass_prefix' => $assign_to_config['subclass_prefix'])); + } + +/* + * ------------------------------------------------------ + * Set a liberal script execution time limit + * ------------------------------------------------------ + */ + if (function_exists("set_time_limit") == TRUE AND @ini_get("safe_mode") == 0) + { + @set_time_limit(300); + } + +/* + * ------------------------------------------------------ + * Start the timer... tick tock tick tock... + * ------------------------------------------------------ + */ + $BM =& load_class('Benchmark', 'core'); + $BM->mark('total_execution_time_start'); + $BM->mark('loading_time:_base_classes_start'); + +/* + * ------------------------------------------------------ + * Instantiate the hooks class + * ------------------------------------------------------ + */ + $EXT =& load_class('Hooks', 'core'); + +/* + * ------------------------------------------------------ + * Is there a "pre_system" hook? + * ------------------------------------------------------ + */ + $EXT->_call_hook('pre_system'); + +/* + * ------------------------------------------------------ + * Instantiate the config class + * ------------------------------------------------------ + */ + $CFG =& load_class('Config', 'core'); + + // Do we have any manually set config items in the index.php file? + if (isset($assign_to_config)) + { + $CFG->_assign_to_config($assign_to_config); + } + +/* + * ------------------------------------------------------ + * Instantiate the UTF-8 class + * ------------------------------------------------------ + * + * Note: Order here is rather important as the UTF-8 + * class needs to be used very early on, but it cannot + * properly determine if UTf-8 can be supported until + * after the Config class is instantiated. + * + */ + + $UNI =& load_class('Utf8', 'core'); + +/* + * ------------------------------------------------------ + * Instantiate the URI class + * ------------------------------------------------------ + */ + $URI =& load_class('URI', 'core'); + +/* + * ------------------------------------------------------ + * Instantiate the routing class and set the routing + * ------------------------------------------------------ + */ + $RTR =& load_class('Router', 'core'); + $RTR->_set_routing(); + + // Set any routing overrides that may exist in the main index file + if (isset($routing)) + { + $RTR->_set_overrides($routing); + } + +/* + * ------------------------------------------------------ + * Instantiate the output class + * ------------------------------------------------------ + */ + $OUT =& load_class('Output', 'core'); + +/* + * ------------------------------------------------------ + * Is there a valid cache file? If so, we're done... + * ------------------------------------------------------ + */ + if ($EXT->_call_hook('cache_override') === FALSE) + { + if ($OUT->_display_cache($CFG, $URI) == TRUE) + { + exit; + } + } + +/* + * ----------------------------------------------------- + * Load the security class for xss and csrf support + * ----------------------------------------------------- + */ + $SEC =& load_class('Security', 'core'); + +/* + * ------------------------------------------------------ + * Load the Input class and sanitize globals + * ------------------------------------------------------ + */ + $IN =& load_class('Input', 'core'); + +/* + * ------------------------------------------------------ + * Load the Language class + * ------------------------------------------------------ + */ + $LANG =& load_class('Lang', 'core'); + +/* + * ------------------------------------------------------ + * Load the app controller and local controller + * ------------------------------------------------------ + * + */ + // Load the base controller class + require BASEPATH.'core/Controller.php'; + + function &get_instance() + { + return CI_Controller::get_instance(); + } + + + if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php')) + { + require APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'; + } + + // Load the local application controller + // Note: The Router class automatically validates the controller path using the router->_validate_request(). + // If this include fails it means that the default controller in the Routes.php file is not resolving to something valid. + if ( ! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php')) + { + show_error('Unable to load your default controller. Please make sure the controller specified in your Routes.php file is valid.'); + } + + include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php'); + + // Set a mark point for benchmarking + $BM->mark('loading_time:_base_classes_end'); + +/* + * ------------------------------------------------------ + * Security check + * ------------------------------------------------------ + * + * None of the functions in the app controller or the + * loader class can be called via the URI, nor can + * controller functions that begin with an underscore + */ + $class = $RTR->fetch_class(); + $method = $RTR->fetch_method(); + + if ( ! class_exists($class) + OR strncmp($method, '_', 1) == 0 + OR in_array(strtolower($method), array_map('strtolower', get_class_methods('CI_Controller'))) + ) + { + if ( ! empty($RTR->routes['404_override'])) + { + $x = explode('/', $RTR->routes['404_override']); + $class = $x[0]; + $method = (isset($x[1]) ? $x[1] : 'index'); + if ( ! class_exists($class)) + { + if ( ! file_exists(APPPATH.'controllers/'.$class.'.php')) + { + show_404("{$class}/{$method}"); + } + + include_once(APPPATH.'controllers/'.$class.'.php'); + } + } + else + { + show_404("{$class}/{$method}"); + } + } + +/* + * ------------------------------------------------------ + * Is there a "pre_controller" hook? + * ------------------------------------------------------ + */ + $EXT->_call_hook('pre_controller'); + +/* + * ------------------------------------------------------ + * Instantiate the requested controller + * ------------------------------------------------------ + */ + // Mark a start point so we can benchmark the controller + $BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_start'); + + $CI = new $class(); + +/* + * ------------------------------------------------------ + * Is there a "post_controller_constructor" hook? + * ------------------------------------------------------ + */ + $EXT->_call_hook('post_controller_constructor'); + +/* + * ------------------------------------------------------ + * Call the requested method + * ------------------------------------------------------ + */ + // Is there a "remap" function? If so, we call it instead + if (method_exists($CI, '_remap')) + { + $CI->_remap($method, array_slice($URI->rsegments, 2)); + } + else + { + // is_callable() returns TRUE on some versions of PHP 5 for private and protected + // methods, so we'll use this workaround for consistent behavior + if ( ! in_array(strtolower($method), array_map('strtolower', get_class_methods($CI)))) + { + // Check and see if we are using a 404 override and use it. + if ( ! empty($RTR->routes['404_override'])) + { + $x = explode('/', $RTR->routes['404_override']); + $class = $x[0]; + $method = (isset($x[1]) ? $x[1] : 'index'); + if ( ! class_exists($class)) + { + if ( ! file_exists(APPPATH.'controllers/'.$class.'.php')) + { + show_404("{$class}/{$method}"); + } + + include_once(APPPATH.'controllers/'.$class.'.php'); + unset($CI); + $CI = new $class(); + } + } + else + { + show_404("{$class}/{$method}"); + } + } + + // Call the requested method. + // Any URI segments present (besides the class/function) will be passed to the method for convenience + call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2)); + } + + + // Mark a benchmark end point + $BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end'); + +/* + * ------------------------------------------------------ + * Is there a "post_controller" hook? + * ------------------------------------------------------ + */ + $EXT->_call_hook('post_controller'); + +/* + * ------------------------------------------------------ + * Send the final rendered output to the browser + * ------------------------------------------------------ + */ + if ($EXT->_call_hook('display_override') === FALSE) + { + $OUT->_display(); + } + +/* + * ------------------------------------------------------ + * Is there a "post_system" hook? + * ------------------------------------------------------ + */ + $EXT->_call_hook('post_system'); + +/* + * ------------------------------------------------------ + * Close the DB connection if one exists + * ------------------------------------------------------ + */ + if (class_exists('CI_DB') AND isset($CI->db)) + { + $CI->db->close(); + } + + +/* End of file CodeIgniter.php */ +/* Location: ./system/core/CodeIgniter.php */ \ No newline at end of file diff --git a/system/core/Common.php b/system/core/Common.php new file mode 100644 index 0000000..5e56aa0 --- /dev/null +++ b/system/core/Common.php @@ -0,0 +1,560 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Common Functions + * + * Loads the base classes and executes the request. + * + * @package CodeIgniter + * @subpackage codeigniter + * @category Common Functions + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/ + */ + +// ------------------------------------------------------------------------ + +/** +* Determines if the current version of PHP is greater then the supplied value +* +* @access public +* @param string +* @return bool TRUE if the current version is $version or higher +*/ +if ( ! function_exists('is_php')) +{ + function is_php($version = '5.0.0') + { + static $_is_php; + $version = (string)$version; + + if ( ! isset($_is_php[$version])) + { + $_is_php[$version] = (version_compare(PHP_VERSION, $version) < 0) ? FALSE : TRUE; + } + + return $_is_php[$version]; + } +} + +// ------------------------------------------------------------------------ + +/** + * Tests for file writability + * + * is_writable() returns TRUE on Windows servers when you really can't write to + * the file, based on the read-only attribute. is_writable() is also unreliable + * on Unix servers if safe_mode is on. + * + * @access private + * @return void + */ +if ( ! function_exists('is_really_writable')) +{ + function is_really_writable($file) + { + // If we're on a Unix server with safe_mode off we call is_writable + if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE) + { + return is_writable($file); + } + + // For windows servers and safe_mode "on" installations we'll actually + // write a file then read it. Bah... + if (is_dir($file)) + { + $file = rtrim($file, '/').'/'.md5(mt_rand(1,100).mt_rand(1,100)); + + if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) + { + return FALSE; + } + + fclose($fp); + @chmod($file, DIR_WRITE_MODE); + @unlink($file); + return TRUE; + } + elseif ( ! is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) + { + return FALSE; + } + + fclose($fp); + return TRUE; + } +} + +// ------------------------------------------------------------------------ + +/** +* Class registry +* +* This function acts as a singleton. If the requested class does not +* exist it is instantiated and set to a static variable. If it has +* previously been instantiated the variable is returned. +* +* @access public +* @param string the class name being requested +* @param string the directory where the class should be found +* @param string the class name prefix +* @return object +*/ +if ( ! function_exists('load_class')) +{ + function &load_class($class, $directory = 'libraries', $prefix = 'CI_') + { + static $_classes = array(); + + // Does the class exist? If so, we're done... + if (isset($_classes[$class])) + { + return $_classes[$class]; + } + + $name = FALSE; + + // Look for the class first in the local application/libraries folder + // then in the native system/libraries folder + foreach (array(APPPATH, BASEPATH) as $path) + { + if (file_exists($path.$directory.'/'.$class.'.php')) + { + $name = $prefix.$class; + + if (class_exists($name) === FALSE) + { + require($path.$directory.'/'.$class.'.php'); + } + + break; + } + } + + // Is the request a class extension? If so we load it too + if (file_exists(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php')) + { + $name = config_item('subclass_prefix').$class; + + if (class_exists($name) === FALSE) + { + require(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php'); + } + } + + // Did we find the class? + if ($name === FALSE) + { + // Note: We use exit() rather then show_error() in order to avoid a + // self-referencing loop with the Excptions class + exit('Unable to locate the specified class: '.$class.'.php'); + } + + // Keep track of what we just loaded + is_loaded($class); + + $_classes[$class] = new $name(); + return $_classes[$class]; + } +} + +// -------------------------------------------------------------------- + +/** +* Keeps track of which libraries have been loaded. This function is +* called by the load_class() function above +* +* @access public +* @return array +*/ +if ( ! function_exists('is_loaded')) +{ + function &is_loaded($class = '') + { + static $_is_loaded = array(); + + if ($class != '') + { + $_is_loaded[strtolower($class)] = $class; + } + + return $_is_loaded; + } +} + +// ------------------------------------------------------------------------ + +/** +* Loads the main config.php file +* +* This function lets us grab the config file even if the Config class +* hasn't been instantiated yet +* +* @access private +* @return array +*/ +if ( ! function_exists('get_config')) +{ + function &get_config($replace = array()) + { + static $_config; + + if (isset($_config)) + { + return $_config[0]; + } + + // Is the config file in the environment folder? + if ( ! defined('ENVIRONMENT') OR ! file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/config.php')) + { + $file_path = APPPATH.'config/config.php'; + } + + // Fetch the config file + if ( ! file_exists($file_path)) + { + exit('The configuration file does not exist.'); + } + + require($file_path); + + // Does the $config array exist in the file? + if ( ! isset($config) OR ! is_array($config)) + { + exit('Your config file does not appear to be formatted correctly.'); + } + + // Are any values being dynamically replaced? + if (count($replace) > 0) + { + foreach ($replace as $key => $val) + { + if (isset($config[$key])) + { + $config[$key] = $val; + } + } + } + + $_config[0] =& $config; + return $_config[0]; + } +} + +// ------------------------------------------------------------------------ + +/** +* Returns the specified config item +* +* @access public +* @return mixed +*/ +if ( ! function_exists('config_item')) +{ + function config_item($item) + { + static $_config_item = array(); + + if ( ! isset($_config_item[$item])) + { + $config =& get_config(); + + if ( ! isset($config[$item])) + { + return FALSE; + } + $_config_item[$item] = $config[$item]; + } + + return $_config_item[$item]; + } +} + +// ------------------------------------------------------------------------ + +/** +* Error Handler +* +* This function lets us invoke the exception class and +* display errors using the standard error template located +* in application/errors/errors.php +* This function will send the error page directly to the +* browser and exit. +* +* @access public +* @return void +*/ +if ( ! function_exists('show_error')) +{ + function show_error($message, $status_code = 500, $heading = 'An Error Was Encountered') + { + $_error =& load_class('Exceptions', 'core'); + echo $_error->show_error($heading, $message, 'error_general', $status_code); + exit; + } +} + +// ------------------------------------------------------------------------ + +/** +* 404 Page Handler +* +* This function is similar to the show_error() function above +* However, instead of the standard error template it displays +* 404 errors. +* +* @access public +* @return void +*/ +if ( ! function_exists('show_404')) +{ + function show_404($page = '', $log_error = TRUE) + { + $_error =& load_class('Exceptions', 'core'); + $_error->show_404($page, $log_error); + exit; + } +} + +// ------------------------------------------------------------------------ + +/** +* Error Logging Interface +* +* We use this as a simple mechanism to access the logging +* class and send messages to be logged. +* +* @access public +* @return void +*/ +if ( ! function_exists('log_message')) +{ + function log_message($level = 'error', $message, $php_error = FALSE) + { + static $_log; + + if (config_item('log_threshold') == 0) + { + return; + } + + $_log =& load_class('Log'); + $_log->write_log($level, $message, $php_error); + } +} + +// ------------------------------------------------------------------------ + +/** + * Set HTTP Status Header + * + * @access public + * @param int the status code + * @param string + * @return void + */ +if ( ! function_exists('set_status_header')) +{ + function set_status_header($code = 200, $text = '') + { + $stati = array( + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authoritative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', + 304 => 'Not Modified', + 305 => 'Use Proxy', + 307 => 'Temporary Redirect', + + 400 => 'Bad Request', + 401 => 'Unauthorized', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 406 => 'Not Acceptable', + 407 => 'Proxy Authentication Required', + 408 => 'Request Timeout', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Request Entity Too Large', + 414 => 'Request-URI Too Long', + 415 => 'Unsupported Media Type', + 416 => 'Requested Range Not Satisfiable', + 417 => 'Expectation Failed', + + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Timeout', + 505 => 'HTTP Version Not Supported' + ); + + if ($code == '' OR ! is_numeric($code)) + { + show_error('Status codes must be numeric', 500); + } + + if (isset($stati[$code]) AND $text == '') + { + $text = $stati[$code]; + } + + if ($text == '') + { + show_error('No status text available. Please check your status code number or supply your own message text.', 500); + } + + $server_protocol = (isset($_SERVER['SERVER_PROTOCOL'])) ? $_SERVER['SERVER_PROTOCOL'] : FALSE; + + if (substr(php_sapi_name(), 0, 3) == 'cgi') + { + header("Status: {$code} {$text}", TRUE); + } + elseif ($server_protocol == 'HTTP/1.1' OR $server_protocol == 'HTTP/1.0') + { + header($server_protocol." {$code} {$text}", TRUE, $code); + } + else + { + header("HTTP/1.1 {$code} {$text}", TRUE, $code); + } + } +} + +// -------------------------------------------------------------------- + +/** +* Exception Handler +* +* This is the custom exception handler that is declaired at the top +* of Codeigniter.php. The main reason we use this is to permit +* PHP errors to be logged in our own log files since the user may +* not have access to server logs. Since this function +* effectively intercepts PHP errors, however, we also need +* to display errors based on the current error_reporting level. +* We do that with the use of a PHP error template. +* +* @access private +* @return void +*/ +if ( ! function_exists('_exception_handler')) +{ + function _exception_handler($severity, $message, $filepath, $line) + { + // We don't bother with "strict" notices since they tend to fill up + // the log file with excess information that isn't normally very helpful. + if ($severity == E_STRICT) + { + return; + } + + $_error =& load_class('Exceptions', 'core'); + + // Should we display the error? We'll get the current error_reporting + // level and add its bits with the severity bits to find out. + if (($severity & error_reporting()) == $severity) + { + $_error->show_php_error($severity, $message, $filepath, $line); + } + + // Should we log the error? No? We're done... + if (config_item('log_threshold') == 0) + { + return; + } + + $_error->log_exception($severity, $message, $filepath, $line); + } +} + +// -------------------------------------------------------------------- + +/** + * Remove Invisible Characters + * + * This prevents sandwiching null characters + * between ascii characters, like Java\0script. + * + * @access public + * @param string + * @return string + */ +if ( ! function_exists('remove_invisible_characters')) +{ + function remove_invisible_characters($str, $url_encoded = TRUE) + { + $non_displayables = array(); + + // every control character except newline (dec 10) + // carriage return (dec 13), and horizontal tab (dec 09) + + if ($url_encoded) + { + $non_displayables[] = '/%0[0-8bcef]/'; // url encoded 00-08, 11, 12, 14, 15 + $non_displayables[] = '/%1[0-9a-f]/'; // url encoded 16-31 + } + + $non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127 + + do + { + $str = preg_replace($non_displayables, '', $str, -1, $count); + } + while ($count); + + return $str; + } +} + +// ------------------------------------------------------------------------ + +/** +* Returns HTML escaped variable +* +* @access public +* @param mixed +* @return mixed +*/ +if ( ! function_exists('html_escape')) +{ + function html_escape($var) + { + if (is_array($var)) + { + return array_map('html_escape', $var); + } + else + { + return htmlspecialchars($var, ENT_QUOTES, config_item('charset')); + } + } +} + +/* End of file Common.php */ +/* Location: ./system/core/Common.php */ \ No newline at end of file diff --git a/system/core/Config.php b/system/core/Config.php new file mode 100644 index 0000000..6051b1d --- /dev/null +++ b/system/core/Config.php @@ -0,0 +1,380 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Config Class + * + * This class contains functions that enable config files to be managed + * + * @package CodeIgniter + * @subpackage Libraries + * @category Libraries + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/config.html + */ +class CI_Config { + + /** + * List of all loaded config values + * + * @var array + */ + var $config = array(); + /** + * List of all loaded config files + * + * @var array + */ + var $is_loaded = array(); + /** + * List of paths to search when trying to load a config file + * + * @var array + */ + var $_config_paths = array(APPPATH); + + /** + * Constructor + * + * Sets the $config data from the primary config.php file as a class variable + * + * @access public + * @param string the config file name + * @param boolean if configuration values should be loaded into their own section + * @param boolean true if errors should just return false, false if an error message should be displayed + * @return boolean if the file was successfully loaded or not + */ + function __construct() + { + $this->config =& get_config(); + log_message('debug', "Config Class Initialized"); + + // Set the base_url automatically if none was provided + if ($this->config['base_url'] == '') + { + if (isset($_SERVER['SERVER_ADDR'])) + { + $base_url = (empty($_SERVER['HTTPS']) OR strtolower($_SERVER['HTTPS']) === 'off') ? 'http' : 'https'; + $base_url .= '://'.$_SERVER['SERVER_ADDR']; + $base_url .= substr($_SERVER['SCRIPT_NAME'], 0, strpos($_SERVER['SCRIPT_NAME'], basename($_SERVER['SCRIPT_FILENAME']))); + } + + else + { + $base_url = 'http://localhost/'; + } + + $this->set_item('base_url', $base_url); + } + } + + // -------------------------------------------------------------------- + + /** + * Load Config File + * + * @access public + * @param string the config file name + * @param boolean if configuration values should be loaded into their own section + * @param boolean true if errors should just return false, false if an error message should be displayed + * @return boolean if the file was loaded correctly + */ + function load($file = '', $use_sections = FALSE, $fail_gracefully = FALSE) + { + $file = ($file == '') ? 'config' : str_replace('.php', '', $file); + $found = FALSE; + $loaded = FALSE; + + $check_locations = defined('ENVIRONMENT') + ? array(ENVIRONMENT.'/'.$file, $file) + : array($file); + + foreach ($this->_config_paths as $path) + { + foreach ($check_locations as $location) + { + $file_path = $path.'config/'.$location.'.php'; + + if (in_array($file_path, $this->is_loaded, TRUE)) + { + $loaded = TRUE; + continue 2; + } + + if (file_exists($file_path)) + { + $found = TRUE; + break; + } + } + + if ($found === FALSE) + { + continue; + } + + include($file_path); + + if ( ! isset($config) OR ! is_array($config)) + { + if ($fail_gracefully === TRUE) + { + return FALSE; + } + show_error('Your '.$file_path.' file does not appear to contain a valid configuration array.'); + } + + if ($use_sections === TRUE) + { + if (isset($this->config[$file])) + { + $this->config[$file] = array_merge($this->config[$file], $config); + } + else + { + $this->config[$file] = $config; + } + } + else + { + $this->config = array_merge($this->config, $config); + } + + $this->is_loaded[] = $file_path; + unset($config); + + $loaded = TRUE; + log_message('debug', 'Config file loaded: '.$file_path); + break; + } + + if ($loaded === FALSE) + { + if ($fail_gracefully === TRUE) + { + return FALSE; + } + show_error('The configuration file '.$file.'.php does not exist.'); + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Fetch a config file item + * + * + * @access public + * @param string the config item name + * @param string the index name + * @param bool + * @return string + */ + function item($item, $index = '') + { + if ($index == '') + { + if ( ! isset($this->config[$item])) + { + return FALSE; + } + + $pref = $this->config[$item]; + } + else + { + if ( ! isset($this->config[$index])) + { + return FALSE; + } + + if ( ! isset($this->config[$index][$item])) + { + return FALSE; + } + + $pref = $this->config[$index][$item]; + } + + return $pref; + } + + // -------------------------------------------------------------------- + + /** + * Fetch a config file item - adds slash after item (if item is not empty) + * + * @access public + * @param string the config item name + * @param bool + * @return string + */ + function slash_item($item) + { + if ( ! isset($this->config[$item])) + { + return FALSE; + } + if( trim($this->config[$item]) == '') + { + return ''; + } + + return rtrim($this->config[$item], '/').'/'; + } + + // -------------------------------------------------------------------- + + /** + * Site URL + * Returns base_url . index_page [. uri_string] + * + * @access public + * @param string the URI string + * @return string + */ + function site_url($uri = '') + { + if ($uri == '') + { + return $this->slash_item('base_url').$this->item('index_page'); + } + + if ($this->item('enable_query_strings') == FALSE) + { + $suffix = ($this->item('url_suffix') == FALSE) ? '' : $this->item('url_suffix'); + return $this->slash_item('base_url').$this->slash_item('index_page').$this->_uri_string($uri).$suffix; + } + else + { + return $this->slash_item('base_url').$this->item('index_page').'?'.$this->_uri_string($uri); + } + } + + // ------------------------------------------------------------- + + /** + * Base URL + * Returns base_url [. uri_string] + * + * @access public + * @param string $uri + * @return string + */ + function base_url($uri = '') + { + return $this->slash_item('base_url').ltrim($this->_uri_string($uri), '/'); + } + + // ------------------------------------------------------------- + + /** + * Build URI string for use in Config::site_url() and Config::base_url() + * + * @access protected + * @param $uri + * @return string + */ + protected function _uri_string($uri) + { + if ($this->item('enable_query_strings') == FALSE) + { + if (is_array($uri)) + { + $uri = implode('/', $uri); + } + $uri = trim($uri, '/'); + } + else + { + if (is_array($uri)) + { + $i = 0; + $str = ''; + foreach ($uri as $key => $val) + { + $prefix = ($i == 0) ? '' : '&'; + $str .= $prefix.$key.'='.$val; + $i++; + } + $uri = $str; + } + } + return $uri; + } + + // -------------------------------------------------------------------- + + /** + * System URL + * + * @access public + * @return string + */ + function system_url() + { + $x = explode("/", preg_replace("|/*(.+?)/*$|", "\\1", BASEPATH)); + return $this->slash_item('base_url').end($x).'/'; + } + + // -------------------------------------------------------------------- + + /** + * Set a config file item + * + * @access public + * @param string the config item key + * @param string the config item value + * @return void + */ + function set_item($item, $value) + { + $this->config[$item] = $value; + } + + // -------------------------------------------------------------------- + + /** + * Assign to Config + * + * This function is called by the front controller (CodeIgniter.php) + * after the Config class is instantiated. It permits config items + * to be assigned or overriden by variables contained in the index.php file + * + * @access private + * @param array + * @return void + */ + function _assign_to_config($items = array()) + { + if (is_array($items)) + { + foreach ($items as $key => $val) + { + $this->set_item($key, $val); + } + } + } +} + +// END CI_Config class + +/* End of file Config.php */ +/* Location: ./system/core/Config.php */ diff --git a/system/core/Controller.php b/system/core/Controller.php new file mode 100644 index 0000000..e05362c --- /dev/null +++ b/system/core/Controller.php @@ -0,0 +1,65 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Application Controller Class + * + * This class object is the super class that every library in + * CodeIgniter will be assigned to. + * + * @package CodeIgniter + * @subpackage Libraries + * @category Libraries + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/general/controllers.html + */ +class CI_Controller { + + private static $instance; + + /** + * Constructor + */ + public function __construct() + { + self::$instance =& $this; + + // Assign all the class objects that were instantiated by the + // bootstrap file (CodeIgniter.php) to local class variables + // so that CI can run as one big super object. + foreach (is_loaded() as $var => $class) + { + $this->$var =& load_class($class); + } + + $this->load =& load_class('Loader', 'core'); + + $this->load->initialize(); + + log_message('debug', "Controller Class Initialized"); + } + + public static function &get_instance() + { + return self::$instance; + } +} +// END Controller class + +/* End of file Controller.php */ +/* Location: ./system/core/Controller.php */ \ No newline at end of file diff --git a/system/core/Exceptions.php b/system/core/Exceptions.php new file mode 100644 index 0000000..4ca2faf --- /dev/null +++ b/system/core/Exceptions.php @@ -0,0 +1,194 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Exceptions Class + * + * @package CodeIgniter + * @subpackage Libraries + * @category Exceptions + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/exceptions.html + */ +class CI_Exceptions { + var $action; + var $severity; + var $message; + var $filename; + var $line; + + /** + * Nesting level of the output buffering mechanism + * + * @var int + * @access public + */ + var $ob_level; + + /** + * List if available error levels + * + * @var array + * @access public + */ + var $levels = array( + E_ERROR => 'Error', + E_WARNING => 'Warning', + E_PARSE => 'Parsing Error', + E_NOTICE => 'Notice', + E_CORE_ERROR => 'Core Error', + E_CORE_WARNING => 'Core Warning', + E_COMPILE_ERROR => 'Compile Error', + E_COMPILE_WARNING => 'Compile Warning', + E_USER_ERROR => 'User Error', + E_USER_WARNING => 'User Warning', + E_USER_NOTICE => 'User Notice', + E_STRICT => 'Runtime Notice' + ); + + + /** + * Constructor + */ + public function __construct() + { + $this->ob_level = ob_get_level(); + // Note: Do not log messages from this constructor. + } + + // -------------------------------------------------------------------- + + /** + * Exception Logger + * + * This function logs PHP generated error messages + * + * @access private + * @param string the error severity + * @param string the error string + * @param string the error filepath + * @param string the error line number + * @return string + */ + function log_exception($severity, $message, $filepath, $line) + { + $severity = ( ! isset($this->levels[$severity])) ? $severity : $this->levels[$severity]; + + log_message('error', 'Severity: '.$severity.' --> '.$message. ' '.$filepath.' '.$line, TRUE); + } + + // -------------------------------------------------------------------- + + /** + * 404 Page Not Found Handler + * + * @access private + * @param string the page + * @param bool log error yes/no + * @return string + */ + function show_404($page = '', $log_error = TRUE) + { + $heading = "404 Page Not Found"; + $message = "The page you requested was not found."; + + // By default we log this, but allow a dev to skip it + if ($log_error) + { + log_message('error', '404 Page Not Found --> '.$page); + } + + echo $this->show_error($heading, $message, 'error_404', 404); + exit; + } + + // -------------------------------------------------------------------- + + /** + * General Error Page + * + * This function takes an error message as input + * (either as a string or an array) and displays + * it using the specified template. + * + * @access private + * @param string the heading + * @param string the message + * @param string the template name + * @param int the status code + * @return string + */ + function show_error($heading, $message, $template = 'error_general', $status_code = 500) + { + set_status_header($status_code); + + $message = '<p>'.implode('</p><p>', ( ! is_array($message)) ? array($message) : $message).'</p>'; + + if (ob_get_level() > $this->ob_level + 1) + { + ob_end_flush(); + } + ob_start(); + include(APPPATH.'errors/'.$template.'.php'); + $buffer = ob_get_contents(); + ob_end_clean(); + return $buffer; + } + + // -------------------------------------------------------------------- + + /** + * Native PHP error handler + * + * @access private + * @param string the error severity + * @param string the error string + * @param string the error filepath + * @param string the error line number + * @return string + */ + function show_php_error($severity, $message, $filepath, $line) + { + $severity = ( ! isset($this->levels[$severity])) ? $severity : $this->levels[$severity]; + + $filepath = str_replace("\\", "/", $filepath); + + // For safety reasons we do not show the full file path + if (FALSE !== strpos($filepath, '/')) + { + $x = explode('/', $filepath); + $filepath = $x[count($x)-2].'/'.end($x); + } + + if (ob_get_level() > $this->ob_level + 1) + { + ob_end_flush(); + } + ob_start(); + include(APPPATH.'errors/error_php.php'); + $buffer = ob_get_contents(); + ob_end_clean(); + echo $buffer; + } + + +} +// END Exceptions Class + +/* End of file Exceptions.php */ +/* Location: ./system/core/Exceptions.php */ \ No newline at end of file diff --git a/system/core/Hooks.php b/system/core/Hooks.php new file mode 100644 index 0000000..4dbabb8 --- /dev/null +++ b/system/core/Hooks.php @@ -0,0 +1,249 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Hooks Class + * + * Provides a mechanism to extend the base system without hacking. + * + * @package CodeIgniter + * @subpackage Libraries + * @category Libraries + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/encryption.html + */ +class CI_Hooks { + + /** + * Determines wether hooks are enabled + * + * @var bool + */ + var $enabled = FALSE; + /** + * List of all hooks set in config/hooks.php + * + * @var array + */ + var $hooks = array(); + /** + * Determines wether hook is in progress, used to prevent infinte loops + * + * @var bool + */ + var $in_progress = FALSE; + + /** + * Constructor + * + */ + function __construct() + { + $this->_initialize(); + log_message('debug', "Hooks Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * Initialize the Hooks Preferences + * + * @access private + * @return void + */ + function _initialize() + { + $CFG =& load_class('Config', 'core'); + + // If hooks are not enabled in the config file + // there is nothing else to do + + if ($CFG->item('enable_hooks') == FALSE) + { + return; + } + + // Grab the "hooks" definition file. + // If there are no hooks, we're done. + + if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/hooks.php')) + { + include(APPPATH.'config/'.ENVIRONMENT.'/hooks.php'); + } + elseif (is_file(APPPATH.'config/hooks.php')) + { + include(APPPATH.'config/hooks.php'); + } + + + if ( ! isset($hook) OR ! is_array($hook)) + { + return; + } + + $this->hooks =& $hook; + $this->enabled = TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Call Hook + * + * Calls a particular hook + * + * @access private + * @param string the hook name + * @return mixed + */ + function _call_hook($which = '') + { + if ( ! $this->enabled OR ! isset($this->hooks[$which])) + { + return FALSE; + } + + if (isset($this->hooks[$which][0]) AND is_array($this->hooks[$which][0])) + { + foreach ($this->hooks[$which] as $val) + { + $this->_run_hook($val); + } + } + else + { + $this->_run_hook($this->hooks[$which]); + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Run Hook + * + * Runs a particular hook + * + * @access private + * @param array the hook details + * @return bool + */ + function _run_hook($data) + { + if ( ! is_array($data)) + { + return FALSE; + } + + // ----------------------------------- + // Safety - Prevents run-away loops + // ----------------------------------- + + // If the script being called happens to have the same + // hook call within it a loop can happen + + if ($this->in_progress == TRUE) + { + return; + } + + // ----------------------------------- + // Set file path + // ----------------------------------- + + if ( ! isset($data['filepath']) OR ! isset($data['filename'])) + { + return FALSE; + } + + $filepath = APPPATH.$data['filepath'].'/'.$data['filename']; + + if ( ! file_exists($filepath)) + { + return FALSE; + } + + // ----------------------------------- + // Set class/function name + // ----------------------------------- + + $class = FALSE; + $function = FALSE; + $params = ''; + + if (isset($data['class']) AND $data['class'] != '') + { + $class = $data['class']; + } + + if (isset($data['function'])) + { + $function = $data['function']; + } + + if (isset($data['params'])) + { + $params = $data['params']; + } + + if ($class === FALSE AND $function === FALSE) + { + return FALSE; + } + + // ----------------------------------- + // Set the in_progress flag + // ----------------------------------- + + $this->in_progress = TRUE; + + // ----------------------------------- + // Call the requested class and/or function + // ----------------------------------- + + if ($class !== FALSE) + { + if ( ! class_exists($class)) + { + require($filepath); + } + + $HOOK = new $class; + $HOOK->$function($params); + } + else + { + if ( ! function_exists($function)) + { + require($filepath); + } + + $function($params); + } + + $this->in_progress = FALSE; + return TRUE; + } + +} + +// END CI_Hooks class + +/* End of file Hooks.php */ +/* Location: ./system/core/Hooks.php */ \ No newline at end of file diff --git a/system/core/Input.php b/system/core/Input.php new file mode 100644 index 0000000..4030574 --- /dev/null +++ b/system/core/Input.php @@ -0,0 +1,866 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Input Class + * + * Pre-processes global input data for security + * + * @package CodeIgniter + * @subpackage Libraries + * @category Input + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/input.html + */ +class CI_Input { + + /** + * IP address of the current user + * + * @var string + */ + var $ip_address = FALSE; + /** + * user agent (web browser) being used by the current user + * + * @var string + */ + var $user_agent = FALSE; + /** + * If FALSE, then $_GET will be set to an empty array + * + * @var bool + */ + var $_allow_get_array = TRUE; + /** + * If TRUE, then newlines are standardized + * + * @var bool + */ + var $_standardize_newlines = TRUE; + /** + * Determines whether the XSS filter is always active when GET, POST or COOKIE data is encountered + * Set automatically based on config setting + * + * @var bool + */ + var $_enable_xss = FALSE; + /** + * Enables a CSRF cookie token to be set. + * Set automatically based on config setting + * + * @var bool + */ + var $_enable_csrf = FALSE; + /** + * List of all HTTP request headers + * + * @var array + */ + protected $headers = array(); + + /** + * Constructor + * + * Sets whether to globally enable the XSS processing + * and whether to allow the $_GET array + * + * @return void + */ + public function __construct() + { + log_message('debug', "Input Class Initialized"); + + $this->_allow_get_array = (config_item('allow_get_array') === TRUE); + $this->_enable_xss = (config_item('global_xss_filtering') === TRUE); + $this->_enable_csrf = (config_item('csrf_protection') === TRUE); + + global $SEC; + $this->security =& $SEC; + + // Do we need the UTF-8 class? + if (UTF8_ENABLED === TRUE) + { + global $UNI; + $this->uni =& $UNI; + } + + // Sanitize global arrays + $this->_sanitize_globals(); + } + + // -------------------------------------------------------------------- + + /** + * Fetch from array + * + * This is a helper function to retrieve values from global arrays + * + * @access private + * @param array + * @param string + * @param bool + * @return string + */ + function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE) + { + if ( ! isset($array[$index])) + { + return FALSE; + } + + if ($xss_clean === TRUE) + { + return $this->security->xss_clean($array[$index]); + } + + return $array[$index]; + } + + // -------------------------------------------------------------------- + + /** + * Fetch an item from the GET array + * + * @access public + * @param string + * @param bool + * @return string + */ + function get($index = NULL, $xss_clean = FALSE) + { + // Check if a field has been provided + if ($index === NULL AND ! empty($_GET)) + { + $get = array(); + + // loop through the full _GET array + foreach (array_keys($_GET) as $key) + { + $get[$key] = $this->_fetch_from_array($_GET, $key, $xss_clean); + } + return $get; + } + + return $this->_fetch_from_array($_GET, $index, $xss_clean); + } + + // -------------------------------------------------------------------- + + /** + * Fetch an item from the POST array + * + * @access public + * @param string + * @param bool + * @return string + */ + function post($index = NULL, $xss_clean = FALSE) + { + // Check if a field has been provided + if ($index === NULL AND ! empty($_POST)) + { + $post = array(); + + // Loop through the full _POST array and return it + foreach (array_keys($_POST) as $key) + { + $post[$key] = $this->_fetch_from_array($_POST, $key, $xss_clean); + } + return $post; + } + + return $this->_fetch_from_array($_POST, $index, $xss_clean); + } + + + // -------------------------------------------------------------------- + + /** + * Fetch an item from either the GET array or the POST + * + * @access public + * @param string The index key + * @param bool XSS cleaning + * @return string + */ + function get_post($index = '', $xss_clean = FALSE) + { + if ( ! isset($_POST[$index]) ) + { + return $this->get($index, $xss_clean); + } + else + { + return $this->post($index, $xss_clean); + } + } + + // -------------------------------------------------------------------- + + /** + * Fetch an item from the COOKIE array + * + * @access public + * @param string + * @param bool + * @return string + */ + function cookie($index = '', $xss_clean = FALSE) + { + return $this->_fetch_from_array($_COOKIE, $index, $xss_clean); + } + + // ------------------------------------------------------------------------ + + /** + * Set cookie + * + * Accepts six parameter, or you can submit an associative + * array in the first parameter containing all the values. + * + * @access public + * @param mixed + * @param string the value of the cookie + * @param string the number of seconds until expiration + * @param string the cookie domain. Usually: .yourdomain.com + * @param string the cookie path + * @param string the cookie prefix + * @param bool true makes the cookie secure + * @return void + */ + function set_cookie($name = '', $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = FALSE) + { + if (is_array($name)) + { + // always leave 'name' in last place, as the loop will break otherwise, due to $$item + foreach (array('value', 'expire', 'domain', 'path', 'prefix', 'secure', 'name') as $item) + { + if (isset($name[$item])) + { + $$item = $name[$item]; + } + } + } + + if ($prefix == '' AND config_item('cookie_prefix') != '') + { + $prefix = config_item('cookie_prefix'); + } + if ($domain == '' AND config_item('cookie_domain') != '') + { + $domain = config_item('cookie_domain'); + } + if ($path == '/' AND config_item('cookie_path') != '/') + { + $path = config_item('cookie_path'); + } + if ($secure == FALSE AND config_item('cookie_secure') != FALSE) + { + $secure = config_item('cookie_secure'); + } + + if ( ! is_numeric($expire)) + { + $expire = time() - 86500; + } + else + { + $expire = ($expire > 0) ? time() + $expire : 0; + } + + setcookie($prefix.$name, $value, $expire, $path, $domain, $secure); + } + + // -------------------------------------------------------------------- + + /** + * Fetch an item from the SERVER array + * + * @access public + * @param string + * @param bool + * @return string + */ + function server($index = '', $xss_clean = FALSE) + { + return $this->_fetch_from_array($_SERVER, $index, $xss_clean); + } + + // -------------------------------------------------------------------- + + /** + * Fetch the IP Address + * + * @return string + */ + public function ip_address() + { + if ($this->ip_address !== FALSE) + { + return $this->ip_address; + } + + $proxy_ips = config_item('proxy_ips'); + if ( ! empty($proxy_ips)) + { + $proxy_ips = explode(',', str_replace(' ', '', $proxy_ips)); + foreach (array('HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'HTTP_X_CLIENT_IP', 'HTTP_X_CLUSTER_CLIENT_IP') as $header) + { + if (($spoof = $this->server($header)) !== FALSE) + { + // Some proxies typically list the whole chain of IP + // addresses through which the client has reached us. + // e.g. client_ip, proxy_ip1, proxy_ip2, etc. + if (strpos($spoof, ',') !== FALSE) + { + $spoof = explode(',', $spoof, 2); + $spoof = $spoof[0]; + } + + if ( ! $this->valid_ip($spoof)) + { + $spoof = FALSE; + } + else + { + break; + } + } + } + + $this->ip_address = ($spoof !== FALSE && in_array($_SERVER['REMOTE_ADDR'], $proxy_ips, TRUE)) + ? $spoof : $_SERVER['REMOTE_ADDR']; + } + else + { + $this->ip_address = $_SERVER['REMOTE_ADDR']; + } + + if ( ! $this->valid_ip($this->ip_address)) + { + $this->ip_address = '0.0.0.0'; + } + + return $this->ip_address; + } + + // -------------------------------------------------------------------- + + /** + * Validate IP Address + * + * @access public + * @param string + * @param string ipv4 or ipv6 + * @return bool + */ + public function valid_ip($ip, $which = '') + { + $which = strtolower($which); + + // First check if filter_var is available + if (is_callable('filter_var')) + { + switch ($which) { + case 'ipv4': + $flag = FILTER_FLAG_IPV4; + break; + case 'ipv6': + $flag = FILTER_FLAG_IPV6; + break; + default: + $flag = ''; + break; + } + + return (bool) filter_var($ip, FILTER_VALIDATE_IP, $flag); + } + + if ($which !== 'ipv6' && $which !== 'ipv4') + { + if (strpos($ip, ':') !== FALSE) + { + $which = 'ipv6'; + } + elseif (strpos($ip, '.') !== FALSE) + { + $which = 'ipv4'; + } + else + { + return FALSE; + } + } + + $func = '_valid_'.$which; + return $this->$func($ip); + } + + // -------------------------------------------------------------------- + + /** + * Validate IPv4 Address + * + * Updated version suggested by Geert De Deckere + * + * @access protected + * @param string + * @return bool + */ + protected function _valid_ipv4($ip) + { + $ip_segments = explode('.', $ip); + + // Always 4 segments needed + if (count($ip_segments) !== 4) + { + return FALSE; + } + // IP can not start with 0 + if ($ip_segments[0][0] == '0') + { + return FALSE; + } + + // Check each segment + foreach ($ip_segments as $segment) + { + // IP segments must be digits and can not be + // longer than 3 digits or greater then 255 + if ($segment == '' OR preg_match("/[^0-9]/", $segment) OR $segment > 255 OR strlen($segment) > 3) + { + return FALSE; + } + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Validate IPv6 Address + * + * @access protected + * @param string + * @return bool + */ + protected function _valid_ipv6($str) + { + // 8 groups, separated by : + // 0-ffff per group + // one set of consecutive 0 groups can be collapsed to :: + + $groups = 8; + $collapsed = FALSE; + + $chunks = array_filter( + preg_split('/(:{1,2})/', $str, NULL, PREG_SPLIT_DELIM_CAPTURE) + ); + + // Rule out easy nonsense + if (current($chunks) == ':' OR end($chunks) == ':') + { + return FALSE; + } + + // PHP supports IPv4-mapped IPv6 addresses, so we'll expect those as well + if (strpos(end($chunks), '.') !== FALSE) + { + $ipv4 = array_pop($chunks); + + if ( ! $this->_valid_ipv4($ipv4)) + { + return FALSE; + } + + $groups--; + } + + while ($seg = array_pop($chunks)) + { + if ($seg[0] == ':') + { + if (--$groups == 0) + { + return FALSE; // too many groups + } + + if (strlen($seg) > 2) + { + return FALSE; // long separator + } + + if ($seg == '::') + { + if ($collapsed) + { + return FALSE; // multiple collapsed + } + + $collapsed = TRUE; + } + } + elseif (preg_match("/[^0-9a-f]/i", $seg) OR strlen($seg) > 4) + { + return FALSE; // invalid segment + } + } + + return $collapsed OR $groups == 1; + } + + // -------------------------------------------------------------------- + + /** + * User Agent + * + * @access public + * @return string + */ + function user_agent() + { + if ($this->user_agent !== FALSE) + { + return $this->user_agent; + } + + $this->user_agent = ( ! isset($_SERVER['HTTP_USER_AGENT'])) ? FALSE : $_SERVER['HTTP_USER_AGENT']; + + return $this->user_agent; + } + + // -------------------------------------------------------------------- + + /** + * Sanitize Globals + * + * This function does the following: + * + * Unsets $_GET data (if query strings are not enabled) + * + * Unsets all globals if register_globals is enabled + * + * Standardizes newline characters to \n + * + * @access private + * @return void + */ + function _sanitize_globals() + { + // It would be "wrong" to unset any of these GLOBALS. + $protected = array('_SERVER', '_GET', '_POST', '_FILES', '_REQUEST', + '_SESSION', '_ENV', 'GLOBALS', 'HTTP_RAW_POST_DATA', + 'system_folder', 'application_folder', 'BM', 'EXT', + 'CFG', 'URI', 'RTR', 'OUT', 'IN'); + + // Unset globals for securiy. + // This is effectively the same as register_globals = off + foreach (array($_GET, $_POST, $_COOKIE) as $global) + { + if ( ! is_array($global)) + { + if ( ! in_array($global, $protected)) + { + global $$global; + $$global = NULL; + } + } + else + { + foreach ($global as $key => $val) + { + if ( ! in_array($key, $protected)) + { + global $$key; + $$key = NULL; + } + } + } + } + + // Is $_GET data allowed? If not we'll set the $_GET to an empty array + if ($this->_allow_get_array == FALSE) + { + $_GET = array(); + } + else + { + if (is_array($_GET) AND count($_GET) > 0) + { + foreach ($_GET as $key => $val) + { + $_GET[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); + } + } + } + + // Clean $_POST Data + if (is_array($_POST) AND count($_POST) > 0) + { + foreach ($_POST as $key => $val) + { + $_POST[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); + } + } + + // Clean $_COOKIE Data + if (is_array($_COOKIE) AND count($_COOKIE) > 0) + { + // Also get rid of specially treated cookies that might be set by a server + // or silly application, that are of no use to a CI application anyway + // but that when present will trip our 'Disallowed Key Characters' alarm + // http://www.ietf.org/rfc/rfc2109.txt + // note that the key names below are single quoted strings, and are not PHP variables + unset($_COOKIE['$Version']); + unset($_COOKIE['$Path']); + unset($_COOKIE['$Domain']); + + // Work-around for PHP bug #66827 (https://bugs.php.net/bug.php?id=66827) + // + // The session ID sanitizer doesn't check for the value type and blindly does + // an implicit cast to string, which triggers an 'Array to string' E_NOTICE. + $sess_cookie_name = config_item('cookie_prefix').config_item('sess_cookie_name'); + if (isset($_COOKIE[$sess_cookie_name]) && ! is_string($_COOKIE[$sess_cookie_name])) + { + unset($_COOKIE[$sess_cookie_name]); + } + + foreach ($_COOKIE as $key => $val) + { + // _clean_input_data() has been reported to break encrypted cookies + if ($key === $sess_cookie_name && config_item('sess_encrypt_cookie')) + { + continue; + } + + $_COOKIE[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); + } + } + + // Sanitize PHP_SELF + $_SERVER['PHP_SELF'] = strip_tags($_SERVER['PHP_SELF']); + + + // CSRF Protection check on HTTP requests + if ($this->_enable_csrf == TRUE && ! $this->is_cli_request()) + { + $this->security->csrf_verify(); + } + + log_message('debug', "Global POST and COOKIE data sanitized"); + } + + // -------------------------------------------------------------------- + + /** + * Clean Input Data + * + * This is a helper function. It escapes data and + * standardizes newline characters to \n + * + * @access private + * @param string + * @return string + */ + function _clean_input_data($str) + { + if (is_array($str)) + { + $new_array = array(); + foreach ($str as $key => $val) + { + $new_array[$this->_clean_input_keys($key)] = $this->_clean_input_data($val); + } + return $new_array; + } + + /* We strip slashes if magic quotes is on to keep things consistent + + NOTE: In PHP 5.4 get_magic_quotes_gpc() will always return 0 and + it will probably not exist in future versions at all. + */ + if ( ! is_php('5.4') && get_magic_quotes_gpc()) + { + $str = stripslashes($str); + } + + // Clean UTF-8 if supported + if (UTF8_ENABLED === TRUE) + { + $str = $this->uni->clean_string($str); + } + + // Remove control characters + $str = remove_invisible_characters($str); + + // Should we filter the input data? + if ($this->_enable_xss === TRUE) + { + $str = $this->security->xss_clean($str); + } + + // Standardize newlines if needed + if ($this->_standardize_newlines == TRUE) + { + if (strpos($str, "\r") !== FALSE) + { + $str = str_replace(array("\r\n", "\r", "\r\n\n"), PHP_EOL, $str); + } + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Clean Keys + * + * This is a helper function. To prevent malicious users + * from trying to exploit keys we make sure that keys are + * only named with alpha-numeric text and a few other items. + * + * @access private + * @param string + * @return string + */ + function _clean_input_keys($str) + { + if ( ! preg_match("/^[a-z0-9:_\/-]+$/i", $str)) + { + exit('Disallowed Key Characters.'); + } + + // Clean UTF-8 if supported + if (UTF8_ENABLED === TRUE) + { + $str = $this->uni->clean_string($str); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Request Headers + * + * In Apache, you can simply call apache_request_headers(), however for + * people running other webservers the function is undefined. + * + * @param bool XSS cleaning + * + * @return array + */ + public function request_headers($xss_clean = FALSE) + { + // Look at Apache go! + if (function_exists('apache_request_headers')) + { + $headers = apache_request_headers(); + } + else + { + $headers['Content-Type'] = (isset($_SERVER['CONTENT_TYPE'])) ? $_SERVER['CONTENT_TYPE'] : @getenv('CONTENT_TYPE'); + + foreach ($_SERVER as $key => $val) + { + if (strncmp($key, 'HTTP_', 5) === 0) + { + $headers[substr($key, 5)] = $this->_fetch_from_array($_SERVER, $key, $xss_clean); + } + } + } + + // take SOME_HEADER and turn it into Some-Header + foreach ($headers as $key => $val) + { + $key = str_replace('_', ' ', strtolower($key)); + $key = str_replace(' ', '-', ucwords($key)); + + $this->headers[$key] = $val; + } + + return $this->headers; + } + + // -------------------------------------------------------------------- + + /** + * Get Request Header + * + * Returns the value of a single member of the headers class member + * + * @param string array key for $this->headers + * @param boolean XSS Clean or not + * @return mixed FALSE on failure, string on success + */ + public function get_request_header($index, $xss_clean = FALSE) + { + if (empty($this->headers)) + { + $this->request_headers(); + } + + if ( ! isset($this->headers[$index])) + { + return FALSE; + } + + if ($xss_clean === TRUE) + { + return $this->security->xss_clean($this->headers[$index]); + } + + return $this->headers[$index]; + } + + // -------------------------------------------------------------------- + + /** + * Is ajax Request? + * + * Test to see if a request contains the HTTP_X_REQUESTED_WITH header + * + * @return boolean + */ + public function is_ajax_request() + { + return ($this->server('HTTP_X_REQUESTED_WITH') === 'XMLHttpRequest'); + } + + // -------------------------------------------------------------------- + + /** + * Is cli Request? + * + * Test to see if a request was made from the command line + * + * @return bool + */ + public function is_cli_request() + { + return (php_sapi_name() === 'cli' OR defined('STDIN')); + } + +} + +/* End of file Input.php */ +/* Location: ./system/core/Input.php */ \ No newline at end of file diff --git a/system/core/Lang.php b/system/core/Lang.php new file mode 100644 index 0000000..2849703 --- /dev/null +++ b/system/core/Lang.php @@ -0,0 +1,161 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Language Class + * + * @package CodeIgniter + * @subpackage Libraries + * @category Language + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/language.html + */ +class CI_Lang { + + /** + * List of translations + * + * @var array + */ + var $language = array(); + /** + * List of loaded language files + * + * @var array + */ + var $is_loaded = array(); + + /** + * Constructor + * + * @access public + */ + function __construct() + { + log_message('debug', "Language Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * Load a language file + * + * @access public + * @param mixed the name of the language file to be loaded. Can be an array + * @param string the language (english, etc.) + * @param bool return loaded array of translations + * @param bool add suffix to $langfile + * @param string alternative path to look for language file + * @return mixed + */ + function load($langfile = '', $idiom = '', $return = FALSE, $add_suffix = TRUE, $alt_path = '') + { + $langfile = str_replace('.php', '', $langfile); + + if ($add_suffix == TRUE) + { + $langfile = str_replace('_lang.', '', $langfile).'_lang'; + } + + $langfile .= '.php'; + + if (in_array($langfile, $this->is_loaded, TRUE)) + { + return; + } + + $config =& get_config(); + + if ($idiom == '') + { + $deft_lang = ( ! isset($config['language'])) ? 'english' : $config['language']; + $idiom = ($deft_lang == '') ? 'english' : $deft_lang; + } + + // Determine where the language file is and load it + if ($alt_path != '' && file_exists($alt_path.'language/'.$idiom.'/'.$langfile)) + { + include($alt_path.'language/'.$idiom.'/'.$langfile); + } + else + { + $found = FALSE; + + foreach (get_instance()->load->get_package_paths(TRUE) as $package_path) + { + if (file_exists($package_path.'language/'.$idiom.'/'.$langfile)) + { + include($package_path.'language/'.$idiom.'/'.$langfile); + $found = TRUE; + break; + } + } + + if ($found !== TRUE) + { + show_error('Unable to load the requested language file: language/'.$idiom.'/'.$langfile); + } + } + + + if ( ! isset($lang)) + { + log_message('error', 'Language file contains no data: language/'.$idiom.'/'.$langfile); + return; + } + + if ($return == TRUE) + { + return $lang; + } + + $this->is_loaded[] = $langfile; + $this->language = array_merge($this->language, $lang); + unset($lang); + + log_message('debug', 'Language file loaded: language/'.$idiom.'/'.$langfile); + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Fetch a single line of text from the language array + * + * @access public + * @param string $line the language line + * @return string + */ + function line($line = '') + { + $value = ($line == '' OR ! isset($this->language[$line])) ? FALSE : $this->language[$line]; + + // Because killer robots like unicorns! + if ($value === FALSE) + { + log_message('error', 'Could not find the language line "'.$line.'"'); + } + + return $value; + } + +} +// END Language Class + +/* End of file Lang.php */ +/* Location: ./system/core/Lang.php */ diff --git a/system/core/Loader.php b/system/core/Loader.php new file mode 100644 index 0000000..40090db --- /dev/null +++ b/system/core/Loader.php @@ -0,0 +1,1249 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Loader Class + * + * Loads views and files + * + * @package CodeIgniter + * @subpackage Libraries + * @author EllisLab Dev Team + * @category Loader + * @link http://codeigniter.com/user_guide/libraries/loader.html + */ +class CI_Loader { + + // All these are set automatically. Don't mess with them. + /** + * Nesting level of the output buffering mechanism + * + * @var int + * @access protected + */ + protected $_ci_ob_level; + /** + * List of paths to load views from + * + * @var array + * @access protected + */ + protected $_ci_view_paths = array(); + /** + * List of paths to load libraries from + * + * @var array + * @access protected + */ + protected $_ci_library_paths = array(); + /** + * List of paths to load models from + * + * @var array + * @access protected + */ + protected $_ci_model_paths = array(); + /** + * List of paths to load helpers from + * + * @var array + * @access protected + */ + protected $_ci_helper_paths = array(); + /** + * List of loaded base classes + * Set by the controller class + * + * @var array + * @access protected + */ + protected $_base_classes = array(); // Set by the controller class + /** + * List of cached variables + * + * @var array + * @access protected + */ + protected $_ci_cached_vars = array(); + /** + * List of loaded classes + * + * @var array + * @access protected + */ + protected $_ci_classes = array(); + /** + * List of loaded files + * + * @var array + * @access protected + */ + protected $_ci_loaded_files = array(); + /** + * List of loaded models + * + * @var array + * @access protected + */ + protected $_ci_models = array(); + /** + * List of loaded helpers + * + * @var array + * @access protected + */ + protected $_ci_helpers = array(); + /** + * List of class name mappings + * + * @var array + * @access protected + */ + protected $_ci_varmap = array('unit_test' => 'unit', + 'user_agent' => 'agent'); + + /** + * Constructor + * + * Sets the path to the view files and gets the initial output buffering level + */ + public function __construct() + { + $this->_ci_ob_level = ob_get_level(); + $this->_ci_library_paths = array(APPPATH, BASEPATH); + $this->_ci_helper_paths = array(APPPATH, BASEPATH); + $this->_ci_model_paths = array(APPPATH); + $this->_ci_view_paths = array(APPPATH.'views/' => TRUE); + + log_message('debug', "Loader Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * Initialize the Loader + * + * This method is called once in CI_Controller. + * + * @param array + * @return object + */ + public function initialize() + { + $this->_ci_classes = array(); + $this->_ci_loaded_files = array(); + $this->_ci_models = array(); + $this->_base_classes =& is_loaded(); + + $this->_ci_autoloader(); + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Is Loaded + * + * A utility function to test if a class is in the self::$_ci_classes array. + * This function returns the object name if the class tested for is loaded, + * and returns FALSE if it isn't. + * + * It is mainly used in the form_helper -> _get_validation_object() + * + * @param string class being checked for + * @return mixed class object name on the CI SuperObject or FALSE + */ + public function is_loaded($class) + { + if (isset($this->_ci_classes[$class])) + { + return $this->_ci_classes[$class]; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Class Loader + * + * This function lets users load and instantiate classes. + * It is designed to be called from a user's app controllers. + * + * @param string the name of the class + * @param mixed the optional parameters + * @param string an optional object name + * @return void + */ + public function library($library = '', $params = NULL, $object_name = NULL) + { + if (is_array($library)) + { + foreach ($library as $class) + { + $this->library($class, $params); + } + + return; + } + + if ($library == '' OR isset($this->_base_classes[$library])) + { + return FALSE; + } + + if ( ! is_null($params) && ! is_array($params)) + { + $params = NULL; + } + + $this->_ci_load_class($library, $params, $object_name); + } + + // -------------------------------------------------------------------- + + /** + * Model Loader + * + * This function lets users load and instantiate models. + * + * @param string the name of the class + * @param string name for the model + * @param bool database connection + * @return void + */ + public function model($model, $name = '', $db_conn = FALSE) + { + if (is_array($model)) + { + foreach ($model as $babe) + { + $this->model($babe); + } + return; + } + + if ($model == '') + { + return; + } + + $path = ''; + + // Is the model in a sub-folder? If so, parse out the filename and path. + if (($last_slash = strrpos($model, '/')) !== FALSE) + { + // The path is in front of the last slash + $path = substr($model, 0, $last_slash + 1); + + // And the model name behind it + $model = substr($model, $last_slash + 1); + } + + if ($name == '') + { + $name = $model; + } + + if (in_array($name, $this->_ci_models, TRUE)) + { + return; + } + + $CI =& get_instance(); + if (isset($CI->$name)) + { + show_error('The model name you are loading is the name of a resource that is already being used: '.$name); + } + + $model = strtolower($model); + + foreach ($this->_ci_model_paths as $mod_path) + { + if ( ! file_exists($mod_path.'models/'.$path.$model.'.php')) + { + continue; + } + + if ($db_conn !== FALSE AND ! class_exists('CI_DB')) + { + if ($db_conn === TRUE) + { + $db_conn = ''; + } + + $CI->load->database($db_conn, FALSE, TRUE); + } + + if ( ! class_exists('CI_Model')) + { + load_class('Model', 'core'); + } + + require_once($mod_path.'models/'.$path.$model.'.php'); + + $model = ucfirst($model); + + $CI->$name = new $model(); + + $this->_ci_models[] = $name; + return; + } + + // couldn't find the model + show_error('Unable to locate the model you have specified: '.$model); + } + + // -------------------------------------------------------------------- + + /** + * Database Loader + * + * @param string the DB credentials + * @param bool whether to return the DB object + * @param bool whether to enable active record (this allows us to override the config setting) + * @return object + */ + public function database($params = '', $return = FALSE, $active_record = NULL) + { + // Grab the super object + $CI =& get_instance(); + + // Do we even need to load the database class? + if (class_exists('CI_DB') AND $return == FALSE AND $active_record == NULL AND isset($CI->db) AND is_object($CI->db)) + { + return FALSE; + } + + require_once(BASEPATH.'database/DB.php'); + + if ($return === TRUE) + { + return DB($params, $active_record); + } + + // Initialize the db variable. Needed to prevent + // reference errors with some configurations + $CI->db = ''; + + // Load the DB class + $CI->db =& DB($params, $active_record); + } + + // -------------------------------------------------------------------- + + /** + * Load the Utilities Class + * + * @return string + */ + public function dbutil() + { + if ( ! class_exists('CI_DB')) + { + $this->database(); + } + + $CI =& get_instance(); + + // for backwards compatibility, load dbforge so we can extend dbutils off it + // this use is deprecated and strongly discouraged + $CI->load->dbforge(); + + require_once(BASEPATH.'database/DB_utility.php'); + require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_utility.php'); + $class = 'CI_DB_'.$CI->db->dbdriver.'_utility'; + + $CI->dbutil = new $class(); + } + + // -------------------------------------------------------------------- + + /** + * Load the Database Forge Class + * + * @return string + */ + public function dbforge() + { + if ( ! class_exists('CI_DB')) + { + $this->database(); + } + + $CI =& get_instance(); + + require_once(BASEPATH.'database/DB_forge.php'); + require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_forge.php'); + $class = 'CI_DB_'.$CI->db->dbdriver.'_forge'; + + $CI->dbforge = new $class(); + } + + // -------------------------------------------------------------------- + + /** + * Load View + * + * This function is used to load a "view" file. It has three parameters: + * + * 1. The name of the "view" file to be included. + * 2. An associative array of data to be extracted for use in the view. + * 3. TRUE/FALSE - whether to return the data or load it. In + * some cases it's advantageous to be able to return data so that + * a developer can process it in some way. + * + * @param string + * @param array + * @param bool + * @return void + */ + public function view($view, $vars = array(), $return = FALSE) + { + return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return)); + } + + // -------------------------------------------------------------------- + + /** + * Load File + * + * This is a generic file loader + * + * @param string + * @param bool + * @return string + */ + public function file($path, $return = FALSE) + { + return $this->_ci_load(array('_ci_path' => $path, '_ci_return' => $return)); + } + + // -------------------------------------------------------------------- + + /** + * Set Variables + * + * Once variables are set they become available within + * the controller class and its "view" files. + * + * @param array + * @param string + * @return void + */ + public function vars($vars = array(), $val = '') + { + if ($val != '' AND is_string($vars)) + { + $vars = array($vars => $val); + } + + $vars = $this->_ci_object_to_array($vars); + + if (is_array($vars) AND count($vars) > 0) + { + foreach ($vars as $key => $val) + { + $this->_ci_cached_vars[$key] = $val; + } + } + } + + // -------------------------------------------------------------------- + + /** + * Get Variable + * + * Check if a variable is set and retrieve it. + * + * @param array + * @return void + */ + public function get_var($key) + { + return isset($this->_ci_cached_vars[$key]) ? $this->_ci_cached_vars[$key] : NULL; + } + + // -------------------------------------------------------------------- + + /** + * Load Helper + * + * This function loads the specified helper file. + * + * @param mixed + * @return void + */ + public function helper($helpers = array()) + { + foreach ($this->_ci_prep_filename($helpers, '_helper') as $helper) + { + if (isset($this->_ci_helpers[$helper])) + { + continue; + } + + $ext_helper = APPPATH.'helpers/'.config_item('subclass_prefix').$helper.'.php'; + + // Is this a helper extension request? + if (file_exists($ext_helper)) + { + $base_helper = BASEPATH.'helpers/'.$helper.'.php'; + + if ( ! file_exists($base_helper)) + { + show_error('Unable to load the requested file: helpers/'.$helper.'.php'); + } + + include_once($ext_helper); + include_once($base_helper); + + $this->_ci_helpers[$helper] = TRUE; + log_message('debug', 'Helper loaded: '.$helper); + continue; + } + + // Try to load the helper + foreach ($this->_ci_helper_paths as $path) + { + if (file_exists($path.'helpers/'.$helper.'.php')) + { + include_once($path.'helpers/'.$helper.'.php'); + + $this->_ci_helpers[$helper] = TRUE; + log_message('debug', 'Helper loaded: '.$helper); + break; + } + } + + // unable to load the helper + if ( ! isset($this->_ci_helpers[$helper])) + { + show_error('Unable to load the requested file: helpers/'.$helper.'.php'); + } + } + } + + // -------------------------------------------------------------------- + + /** + * Load Helpers + * + * This is simply an alias to the above function in case the + * user has written the plural form of this function. + * + * @param array + * @return void + */ + public function helpers($helpers = array()) + { + $this->helper($helpers); + } + + // -------------------------------------------------------------------- + + /** + * Loads a language file + * + * @param array + * @param string + * @return void + */ + public function language($file = array(), $lang = '') + { + $CI =& get_instance(); + + if ( ! is_array($file)) + { + $file = array($file); + } + + foreach ($file as $langfile) + { + $CI->lang->load($langfile, $lang); + } + } + + // -------------------------------------------------------------------- + + /** + * Loads a config file + * + * @param string + * @param bool + * @param bool + * @return void + */ + public function config($file = '', $use_sections = FALSE, $fail_gracefully = FALSE) + { + $CI =& get_instance(); + $CI->config->load($file, $use_sections, $fail_gracefully); + } + + // -------------------------------------------------------------------- + + /** + * Driver + * + * Loads a driver library + * + * @param string the name of the class + * @param mixed the optional parameters + * @param string an optional object name + * @return void + */ + public function driver($library = '', $params = NULL, $object_name = NULL) + { + if ( ! class_exists('CI_Driver_Library')) + { + // we aren't instantiating an object here, that'll be done by the Library itself + require BASEPATH.'libraries/Driver.php'; + } + + if ($library == '') + { + return FALSE; + } + + // We can save the loader some time since Drivers will *always* be in a subfolder, + // and typically identically named to the library + if ( ! strpos($library, '/')) + { + $library = ucfirst($library).'/'.$library; + } + + return $this->library($library, $params, $object_name); + } + + // -------------------------------------------------------------------- + + /** + * Add Package Path + * + * Prepends a parent path to the library, model, helper, and config path arrays + * + * @param string + * @param boolean + * @return void + */ + public function add_package_path($path, $view_cascade=TRUE) + { + $path = rtrim($path, '/').'/'; + + array_unshift($this->_ci_library_paths, $path); + array_unshift($this->_ci_model_paths, $path); + array_unshift($this->_ci_helper_paths, $path); + + $this->_ci_view_paths = array($path.'views/' => $view_cascade) + $this->_ci_view_paths; + + // Add config file path + $config =& $this->_ci_get_component('config'); + array_unshift($config->_config_paths, $path); + } + + // -------------------------------------------------------------------- + + /** + * Get Package Paths + * + * Return a list of all package paths, by default it will ignore BASEPATH. + * + * @param string + * @return void + */ + public function get_package_paths($include_base = FALSE) + { + return $include_base === TRUE ? $this->_ci_library_paths : $this->_ci_model_paths; + } + + // -------------------------------------------------------------------- + + /** + * Remove Package Path + * + * Remove a path from the library, model, and helper path arrays if it exists + * If no path is provided, the most recently added path is removed. + * + * @param type + * @param bool + * @return type + */ + public function remove_package_path($path = '', $remove_config_path = TRUE) + { + $config =& $this->_ci_get_component('config'); + + if ($path == '') + { + $void = array_shift($this->_ci_library_paths); + $void = array_shift($this->_ci_model_paths); + $void = array_shift($this->_ci_helper_paths); + $void = array_shift($this->_ci_view_paths); + $void = array_shift($config->_config_paths); + } + else + { + $path = rtrim($path, '/').'/'; + foreach (array('_ci_library_paths', '_ci_model_paths', '_ci_helper_paths') as $var) + { + if (($key = array_search($path, $this->{$var})) !== FALSE) + { + unset($this->{$var}[$key]); + } + } + + if (isset($this->_ci_view_paths[$path.'views/'])) + { + unset($this->_ci_view_paths[$path.'views/']); + } + + if (($key = array_search($path, $config->_config_paths)) !== FALSE) + { + unset($config->_config_paths[$key]); + } + } + + // make sure the application default paths are still in the array + $this->_ci_library_paths = array_unique(array_merge($this->_ci_library_paths, array(APPPATH, BASEPATH))); + $this->_ci_helper_paths = array_unique(array_merge($this->_ci_helper_paths, array(APPPATH, BASEPATH))); + $this->_ci_model_paths = array_unique(array_merge($this->_ci_model_paths, array(APPPATH))); + $this->_ci_view_paths = array_merge($this->_ci_view_paths, array(APPPATH.'views/' => TRUE)); + $config->_config_paths = array_unique(array_merge($config->_config_paths, array(APPPATH))); + } + + // -------------------------------------------------------------------- + + /** + * Loader + * + * This function is used to load views and files. + * Variables are prefixed with _ci_ to avoid symbol collision with + * variables made available to view files + * + * @param array + * @return void + */ + protected function _ci_load($_ci_data) + { + // Set the default data variables + foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val) + { + $$_ci_val = ( ! isset($_ci_data[$_ci_val])) ? FALSE : $_ci_data[$_ci_val]; + } + + $file_exists = FALSE; + + // Set the path to the requested file + if ($_ci_path != '') + { + $_ci_x = explode('/', $_ci_path); + $_ci_file = end($_ci_x); + } + else + { + $_ci_ext = pathinfo($_ci_view, PATHINFO_EXTENSION); + $_ci_file = ($_ci_ext == '') ? $_ci_view.'.php' : $_ci_view; + + foreach ($this->_ci_view_paths as $view_file => $cascade) + { + if (file_exists($view_file.$_ci_file)) + { + $_ci_path = $view_file.$_ci_file; + $file_exists = TRUE; + break; + } + + if ( ! $cascade) + { + break; + } + } + } + + if ( ! $file_exists && ! file_exists($_ci_path)) + { + show_error('Unable to load the requested file: '.$_ci_file); + } + + // This allows anything loaded using $this->load (views, files, etc.) + // to become accessible from within the Controller and Model functions. + + $_ci_CI =& get_instance(); + foreach (get_object_vars($_ci_CI) as $_ci_key => $_ci_var) + { + if ( ! isset($this->$_ci_key)) + { + $this->$_ci_key =& $_ci_CI->$_ci_key; + } + } + + /* + * Extract and cache variables + * + * You can either set variables using the dedicated $this->load_vars() + * function or via the second parameter of this function. We'll merge + * the two types and cache them so that views that are embedded within + * other views can have access to these variables. + */ + if (is_array($_ci_vars)) + { + $this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars); + } + extract($this->_ci_cached_vars); + + /* + * Buffer the output + * + * We buffer the output for two reasons: + * 1. Speed. You get a significant speed boost. + * 2. So that the final rendered template can be + * post-processed by the output class. Why do we + * need post processing? For one thing, in order to + * show the elapsed page load time. Unless we + * can intercept the content right before it's sent to + * the browser and then stop the timer it won't be accurate. + */ + ob_start(); + + // If the PHP installation does not support short tags we'll + // do a little string replacement, changing the short tags + // to standard PHP echo statements. + + if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE) + { + echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace('<?=', '<?php echo ', file_get_contents($_ci_path)))); + } + else + { + include($_ci_path); // include() vs include_once() allows for multiple views with the same name + } + + log_message('debug', 'File loaded: '.$_ci_path); + + // Return the file data if requested + if ($_ci_return === TRUE) + { + $buffer = ob_get_contents(); + @ob_end_clean(); + return $buffer; + } + + /* + * Flush the buffer... or buff the flusher? + * + * In order to permit views to be nested within + * other views, we need to flush the content back out whenever + * we are beyond the first level of output buffering so that + * it can be seen and included properly by the first included + * template and any subsequent ones. Oy! + * + */ + if (ob_get_level() > $this->_ci_ob_level + 1) + { + ob_end_flush(); + } + else + { + $_ci_CI->output->append_output(ob_get_contents()); + @ob_end_clean(); + } + } + + // -------------------------------------------------------------------- + + /** + * Load class + * + * This function loads the requested class. + * + * @param string the item that is being loaded + * @param mixed any additional parameters + * @param string an optional object name + * @return void + */ + protected function _ci_load_class($class, $params = NULL, $object_name = NULL) + { + // Get the class name, and while we're at it trim any slashes. + // The directory path can be included as part of the class name, + // but we don't want a leading slash + $class = str_replace('.php', '', trim($class, '/')); + + // Was the path included with the class name? + // We look for a slash to determine this + $subdir = ''; + if (($last_slash = strrpos($class, '/')) !== FALSE) + { + // Extract the path + $subdir = substr($class, 0, $last_slash + 1); + + // Get the filename from the path + $class = substr($class, $last_slash + 1); + } + + // We'll test for both lowercase and capitalized versions of the file name + foreach (array(ucfirst($class), strtolower($class)) as $class) + { + $subclass = APPPATH.'libraries/'.$subdir.config_item('subclass_prefix').$class.'.php'; + + // Is this a class extension request? + if (file_exists($subclass)) + { + $baseclass = BASEPATH.'libraries/'.ucfirst($class).'.php'; + + if ( ! file_exists($baseclass)) + { + log_message('error', "Unable to load the requested class: ".$class); + show_error("Unable to load the requested class: ".$class); + } + + // Safety: Was the class already loaded by a previous call? + if (in_array($subclass, $this->_ci_loaded_files)) + { + // Before we deem this to be a duplicate request, let's see + // if a custom object name is being supplied. If so, we'll + // return a new instance of the object + if ( ! is_null($object_name)) + { + $CI =& get_instance(); + if ( ! isset($CI->$object_name)) + { + return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name); + } + } + + $is_duplicate = TRUE; + log_message('debug', $class." class already loaded. Second attempt ignored."); + return; + } + + include_once($baseclass); + include_once($subclass); + $this->_ci_loaded_files[] = $subclass; + + return $this->_ci_init_class($class, config_item('subclass_prefix'), $params, $object_name); + } + + // Lets search for the requested library file and load it. + $is_duplicate = FALSE; + foreach ($this->_ci_library_paths as $path) + { + $filepath = $path.'libraries/'.$subdir.$class.'.php'; + + // Does the file exist? No? Bummer... + if ( ! file_exists($filepath)) + { + continue; + } + + // Safety: Was the class already loaded by a previous call? + if (in_array($filepath, $this->_ci_loaded_files)) + { + // Before we deem this to be a duplicate request, let's see + // if a custom object name is being supplied. If so, we'll + // return a new instance of the object + if ( ! is_null($object_name)) + { + $CI =& get_instance(); + if ( ! isset($CI->$object_name)) + { + return $this->_ci_init_class($class, '', $params, $object_name); + } + } + + $is_duplicate = TRUE; + log_message('debug', $class." class already loaded. Second attempt ignored."); + return; + } + + include_once($filepath); + $this->_ci_loaded_files[] = $filepath; + return $this->_ci_init_class($class, '', $params, $object_name); + } + + } // END FOREACH + + // One last attempt. Maybe the library is in a subdirectory, but it wasn't specified? + if ($subdir == '') + { + $path = strtolower($class).'/'.$class; + return $this->_ci_load_class($path, $params); + } + + // If we got this far we were unable to find the requested class. + // We do not issue errors if the load call failed due to a duplicate request + if ($is_duplicate == FALSE) + { + log_message('error', "Unable to load the requested class: ".$class); + show_error("Unable to load the requested class: ".$class); + } + } + + // -------------------------------------------------------------------- + + /** + * Instantiates a class + * + * @param string + * @param string + * @param bool + * @param string an optional object name + * @return null + */ + protected function _ci_init_class($class, $prefix = '', $config = FALSE, $object_name = NULL) + { + // Is there an associated config file for this class? Note: these should always be lowercase + if ($config === NULL) + { + // Fetch the config paths containing any package paths + $config_component = $this->_ci_get_component('config'); + + if (is_array($config_component->_config_paths)) + { + // Break on the first found file, thus package files + // are not overridden by default paths + foreach ($config_component->_config_paths as $path) + { + // We test for both uppercase and lowercase, for servers that + // are case-sensitive with regard to file names. Check for environment + // first, global next + if (defined('ENVIRONMENT') AND file_exists($path .'config/'.ENVIRONMENT.'/'.strtolower($class).'.php')) + { + include($path .'config/'.ENVIRONMENT.'/'.strtolower($class).'.php'); + break; + } + elseif (defined('ENVIRONMENT') AND file_exists($path .'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php')) + { + include($path .'config/'.ENVIRONMENT.'/'.ucfirst(strtolower($class)).'.php'); + break; + } + elseif (file_exists($path .'config/'.strtolower($class).'.php')) + { + include($path .'config/'.strtolower($class).'.php'); + break; + } + elseif (file_exists($path .'config/'.ucfirst(strtolower($class)).'.php')) + { + include($path .'config/'.ucfirst(strtolower($class)).'.php'); + break; + } + } + } + } + + if ($prefix == '') + { + if (class_exists('CI_'.$class)) + { + $name = 'CI_'.$class; + } + elseif (class_exists(config_item('subclass_prefix').$class)) + { + $name = config_item('subclass_prefix').$class; + } + else + { + $name = $class; + } + } + else + { + $name = $prefix.$class; + } + + // Is the class name valid? + if ( ! class_exists($name)) + { + log_message('error', "Non-existent class: ".$name); + show_error("Non-existent class: ".$class); + } + + // Set the variable name we will assign the class to + // Was a custom class name supplied? If so we'll use it + $class = strtolower($class); + + if (is_null($object_name)) + { + $classvar = ( ! isset($this->_ci_varmap[$class])) ? $class : $this->_ci_varmap[$class]; + } + else + { + $classvar = $object_name; + } + + // Save the class name and object name + $this->_ci_classes[$class] = $classvar; + + // Instantiate the class + $CI =& get_instance(); + if ($config !== NULL) + { + $CI->$classvar = new $name($config); + } + else + { + $CI->$classvar = new $name; + } + } + + // -------------------------------------------------------------------- + + /** + * Autoloader + * + * The config/autoload.php file contains an array that permits sub-systems, + * libraries, and helpers to be loaded automatically. + * + * @param array + * @return void + */ + private function _ci_autoloader() + { + if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/autoload.php')) + { + include(APPPATH.'config/'.ENVIRONMENT.'/autoload.php'); + } + else + { + include(APPPATH.'config/autoload.php'); + } + + if ( ! isset($autoload)) + { + return FALSE; + } + + // Autoload packages + if (isset($autoload['packages'])) + { + foreach ($autoload['packages'] as $package_path) + { + $this->add_package_path($package_path); + } + } + + // Load any custom config file + if (count($autoload['config']) > 0) + { + $CI =& get_instance(); + foreach ($autoload['config'] as $key => $val) + { + $CI->config->load($val); + } + } + + // Autoload helpers and languages + foreach (array('helper', 'language') as $type) + { + if (isset($autoload[$type]) AND count($autoload[$type]) > 0) + { + $this->$type($autoload[$type]); + } + } + + // A little tweak to remain backward compatible + // The $autoload['core'] item was deprecated + if ( ! isset($autoload['libraries']) AND isset($autoload['core'])) + { + $autoload['libraries'] = $autoload['core']; + } + + // Load libraries + if (isset($autoload['libraries']) AND count($autoload['libraries']) > 0) + { + // Load the database driver. + if (in_array('database', $autoload['libraries'])) + { + $this->database(); + $autoload['libraries'] = array_diff($autoload['libraries'], array('database')); + } + + // Load all other libraries + foreach ($autoload['libraries'] as $item) + { + $this->library($item); + } + } + + // Autoload models + if (isset($autoload['model'])) + { + $this->model($autoload['model']); + } + } + + // -------------------------------------------------------------------- + + /** + * Object to Array + * + * Takes an object as input and converts the class variables to array key/vals + * + * @param object + * @return array + */ + protected function _ci_object_to_array($object) + { + return (is_object($object)) ? get_object_vars($object) : $object; + } + + // -------------------------------------------------------------------- + + /** + * Get a reference to a specific library or model + * + * @param string + * @return bool + */ + protected function &_ci_get_component($component) + { + $CI =& get_instance(); + return $CI->$component; + } + + // -------------------------------------------------------------------- + + /** + * Prep filename + * + * This function preps the name of various items to make loading them more reliable. + * + * @param mixed + * @param string + * @return array + */ + protected function _ci_prep_filename($filename, $extension) + { + if ( ! is_array($filename)) + { + return array(strtolower(str_replace('.php', '', str_replace($extension, '', $filename)).$extension)); + } + else + { + foreach ($filename as $key => $val) + { + $filename[$key] = strtolower(str_replace('.php', '', str_replace($extension, '', $val)).$extension); + } + + return $filename; + } + } +} + +/* End of file Loader.php */ +/* Location: ./system/core/Loader.php */ \ No newline at end of file diff --git a/system/core/Model.php b/system/core/Model.php new file mode 100644 index 0000000..9bbb1fc --- /dev/null +++ b/system/core/Model.php @@ -0,0 +1,58 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Model Class + * + * @package CodeIgniter + * @subpackage Libraries + * @category Libraries + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/config.html + */ +class CI_Model { + + /** + * Constructor + * + * @access public + */ + function __construct() + { + log_message('debug', "Model Class Initialized"); + } + + /** + * __get + * + * Allows models to access CI's loaded classes using the same + * syntax as controllers. + * + * @param string + * @access private + */ + function __get($key) + { + $CI =& get_instance(); + return $CI->$key; + } +} +// END Model Class + +/* End of file Model.php */ +/* Location: ./system/core/Model.php */ \ No newline at end of file diff --git a/system/core/Output.php b/system/core/Output.php new file mode 100644 index 0000000..fc88f6e --- /dev/null +++ b/system/core/Output.php @@ -0,0 +1,575 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Output Class + * + * Responsible for sending final output to browser + * + * @package CodeIgniter + * @subpackage Libraries + * @category Output + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/output.html + */ +class CI_Output { + + /** + * Current output string + * + * @var string + * @access protected + */ + protected $final_output; + /** + * Cache expiration time + * + * @var int + * @access protected + */ + protected $cache_expiration = 0; + /** + * List of server headers + * + * @var array + * @access protected + */ + protected $headers = array(); + /** + * List of mime types + * + * @var array + * @access protected + */ + protected $mime_types = array(); + /** + * Determines wether profiler is enabled + * + * @var book + * @access protected + */ + protected $enable_profiler = FALSE; + /** + * Determines if output compression is enabled + * + * @var bool + * @access protected + */ + protected $_zlib_oc = FALSE; + /** + * List of profiler sections + * + * @var array + * @access protected + */ + protected $_profiler_sections = array(); + /** + * Whether or not to parse variables like {elapsed_time} and {memory_usage} + * + * @var bool + * @access protected + */ + protected $parse_exec_vars = TRUE; + + /** + * Constructor + * + */ + function __construct() + { + $this->_zlib_oc = @ini_get('zlib.output_compression'); + + // Get mime types for later + if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) + { + include APPPATH.'config/'.ENVIRONMENT.'/mimes.php'; + } + else + { + include APPPATH.'config/mimes.php'; + } + + + $this->mime_types = $mimes; + + log_message('debug', "Output Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * Get Output + * + * Returns the current output string + * + * @access public + * @return string + */ + function get_output() + { + return $this->final_output; + } + + // -------------------------------------------------------------------- + + /** + * Set Output + * + * Sets the output string + * + * @access public + * @param string + * @return void + */ + function set_output($output) + { + $this->final_output = $output; + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Append Output + * + * Appends data onto the output string + * + * @access public + * @param string + * @return void + */ + function append_output($output) + { + if ($this->final_output == '') + { + $this->final_output = $output; + } + else + { + $this->final_output .= $output; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Header + * + * Lets you set a server header which will be outputted with the final display. + * + * Note: If a file is cached, headers will not be sent. We need to figure out + * how to permit header data to be saved with the cache data... + * + * @access public + * @param string + * @param bool + * @return void + */ + function set_header($header, $replace = TRUE) + { + // If zlib.output_compression is enabled it will compress the output, + // but it will not modify the content-length header to compensate for + // the reduction, causing the browser to hang waiting for more data. + // We'll just skip content-length in those cases. + + if ($this->_zlib_oc && strncasecmp($header, 'content-length', 14) == 0) + { + return; + } + + $this->headers[] = array($header, $replace); + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Content Type Header + * + * @access public + * @param string extension of the file we're outputting + * @return void + */ + function set_content_type($mime_type) + { + if (strpos($mime_type, '/') === FALSE) + { + $extension = ltrim($mime_type, '.'); + + // Is this extension supported? + if (isset($this->mime_types[$extension])) + { + $mime_type =& $this->mime_types[$extension]; + + if (is_array($mime_type)) + { + $mime_type = current($mime_type); + } + } + } + + $header = 'Content-Type: '.$mime_type; + + $this->headers[] = array($header, TRUE); + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set HTTP Status Header + * moved to Common procedural functions in 1.7.2 + * + * @access public + * @param int the status code + * @param string + * @return void + */ + function set_status_header($code = 200, $text = '') + { + set_status_header($code, $text); + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Enable/disable Profiler + * + * @access public + * @param bool + * @return void + */ + function enable_profiler($val = TRUE) + { + $this->enable_profiler = (is_bool($val)) ? $val : TRUE; + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Profiler Sections + * + * Allows override of default / config settings for Profiler section display + * + * @access public + * @param array + * @return void + */ + function set_profiler_sections($sections) + { + foreach ($sections as $section => $enable) + { + $this->_profiler_sections[$section] = ($enable !== FALSE) ? TRUE : FALSE; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Cache + * + * @access public + * @param integer + * @return void + */ + function cache($time) + { + $this->cache_expiration = ( ! is_numeric($time)) ? 0 : $time; + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Display Output + * + * All "view" data is automatically put into this variable by the controller class: + * + * $this->final_output + * + * This function sends the finalized output data to the browser along + * with any server headers and profile data. It also stops the + * benchmark timer so the page rendering speed and memory usage can be shown. + * + * @access public + * @param string + * @return mixed + */ + function _display($output = '') + { + // Note: We use globals because we can't use $CI =& get_instance() + // since this function is sometimes called by the caching mechanism, + // which happens before the CI super object is available. + global $BM, $CFG; + + // Grab the super object if we can. + if (class_exists('CI_Controller')) + { + $CI =& get_instance(); + } + + // -------------------------------------------------------------------- + + // Set the output data + if ($output == '') + { + $output =& $this->final_output; + } + + // -------------------------------------------------------------------- + + // Do we need to write a cache file? Only if the controller does not have its + // own _output() method and we are not dealing with a cache file, which we + // can determine by the existence of the $CI object above + if ($this->cache_expiration > 0 && isset($CI) && ! method_exists($CI, '_output')) + { + $this->_write_cache($output); + } + + // -------------------------------------------------------------------- + + // Parse out the elapsed time and memory usage, + // then swap the pseudo-variables with the data + + $elapsed = $BM->elapsed_time('total_execution_time_start', 'total_execution_time_end'); + + if ($this->parse_exec_vars === TRUE) + { + $memory = ( ! function_exists('memory_get_usage')) ? '0' : round(memory_get_usage()/1024/1024, 2).'MB'; + + $output = str_replace('{elapsed_time}', $elapsed, $output); + $output = str_replace('{memory_usage}', $memory, $output); + } + + // -------------------------------------------------------------------- + + // Is compression requested? + if ($CFG->item('compress_output') === TRUE && $this->_zlib_oc == FALSE) + { + if (extension_loaded('zlib')) + { + if (isset($_SERVER['HTTP_ACCEPT_ENCODING']) AND strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) + { + ob_start('ob_gzhandler'); + } + } + } + + // -------------------------------------------------------------------- + + // Are there any server headers to send? + if (count($this->headers) > 0) + { + foreach ($this->headers as $header) + { + @header($header[0], $header[1]); + } + } + + // -------------------------------------------------------------------- + + // Does the $CI object exist? + // If not we know we are dealing with a cache file so we'll + // simply echo out the data and exit. + if ( ! isset($CI)) + { + echo $output; + log_message('debug', "Final output sent to browser"); + log_message('debug', "Total execution time: ".$elapsed); + return TRUE; + } + + // -------------------------------------------------------------------- + + // Do we need to generate profile data? + // If so, load the Profile class and run it. + if ($this->enable_profiler == TRUE) + { + $CI->load->library('profiler'); + + if ( ! empty($this->_profiler_sections)) + { + $CI->profiler->set_sections($this->_profiler_sections); + } + + // If the output data contains closing </body> and </html> tags + // we will remove them and add them back after we insert the profile data + if (preg_match("|</body>.*?</html>|is", $output)) + { + $output = preg_replace("|</body>.*?</html>|is", '', $output); + $output .= $CI->profiler->run(); + $output .= '</body></html>'; + } + else + { + $output .= $CI->profiler->run(); + } + } + + // -------------------------------------------------------------------- + + // Does the controller contain a function named _output()? + // If so send the output there. Otherwise, echo it. + if (method_exists($CI, '_output')) + { + $CI->_output($output); + } + else + { + echo $output; // Send it to the browser! + } + + log_message('debug', "Final output sent to browser"); + log_message('debug', "Total execution time: ".$elapsed); + } + + // -------------------------------------------------------------------- + + /** + * Write a Cache File + * + * @access public + * @param string + * @return void + */ + function _write_cache($output) + { + $CI =& get_instance(); + $path = $CI->config->item('cache_path'); + + $cache_path = ($path == '') ? APPPATH.'cache/' : $path; + + if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path)) + { + log_message('error', "Unable to write cache file: ".$cache_path); + return; + } + + $uri = $CI->config->item('base_url'). + $CI->config->item('index_page'). + $CI->uri->uri_string(); + + $cache_path .= md5($uri); + + if ( ! $fp = @fopen($cache_path, FOPEN_WRITE_CREATE_DESTRUCTIVE)) + { + log_message('error', "Unable to write cache file: ".$cache_path); + return; + } + + $expire = time() + ($this->cache_expiration * 60); + + if (flock($fp, LOCK_EX)) + { + fwrite($fp, $expire.'TS--->'.$output); + flock($fp, LOCK_UN); + } + else + { + log_message('error', "Unable to secure a file lock for file at: ".$cache_path); + return; + } + fclose($fp); + @chmod($cache_path, FILE_WRITE_MODE); + + log_message('debug', "Cache file written: ".$cache_path); + } + + // -------------------------------------------------------------------- + + /** + * Update/serve a cached file + * + * @access public + * @param object config class + * @param object uri class + * @return void + */ + function _display_cache(&$CFG, &$URI) + { + $cache_path = ($CFG->item('cache_path') == '') ? APPPATH.'cache/' : $CFG->item('cache_path'); + + // Build the file path. The file name is an MD5 hash of the full URI + $uri = $CFG->item('base_url'). + $CFG->item('index_page'). + $URI->uri_string; + + $filepath = $cache_path.md5($uri); + + if ( ! @file_exists($filepath)) + { + return FALSE; + } + + if ( ! $fp = @fopen($filepath, FOPEN_READ)) + { + return FALSE; + } + + flock($fp, LOCK_SH); + + $cache = ''; + if (filesize($filepath) > 0) + { + $cache = fread($fp, filesize($filepath)); + } + + flock($fp, LOCK_UN); + fclose($fp); + + // Strip out the embedded timestamp + if ( ! preg_match("/(\d+TS--->)/", $cache, $match)) + { + return FALSE; + } + + // Has the file expired? If so we'll delete it. + if (time() >= trim(str_replace('TS--->', '', $match['1']))) + { + if (is_really_writable($cache_path)) + { + @unlink($filepath); + log_message('debug', "Cache file has expired. File deleted"); + return FALSE; + } + } + + // Display the cache + $this->_display(str_replace($match['0'], '', $cache)); + log_message('debug', "Cache file is current. Sending it to browser."); + return TRUE; + } + + +} +// END Output Class + +/* End of file Output.php */ +/* Location: ./system/core/Output.php */ \ No newline at end of file diff --git a/system/core/Router.php b/system/core/Router.php new file mode 100644 index 0000000..b39dc16 --- /dev/null +++ b/system/core/Router.php @@ -0,0 +1,523 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Router Class + * + * Parses URIs and determines routing + * + * @package CodeIgniter + * @subpackage Libraries + * @author EllisLab Dev Team + * @category Libraries + * @link http://codeigniter.com/user_guide/general/routing.html + */ +class CI_Router { + + /** + * Config class + * + * @var object + * @access public + */ + var $config; + /** + * List of routes + * + * @var array + * @access public + */ + var $routes = array(); + /** + * List of error routes + * + * @var array + * @access public + */ + var $error_routes = array(); + /** + * Current class name + * + * @var string + * @access public + */ + var $class = ''; + /** + * Current method name + * + * @var string + * @access public + */ + var $method = 'index'; + /** + * Sub-directory that contains the requested controller class + * + * @var string + * @access public + */ + var $directory = ''; + /** + * Default controller (and method if specific) + * + * @var string + * @access public + */ + var $default_controller; + + /** + * Constructor + * + * Runs the route mapping function. + */ + function __construct() + { + $this->config =& load_class('Config', 'core'); + $this->uri =& load_class('URI', 'core'); + log_message('debug', "Router Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * Set the route mapping + * + * This function determines what should be served based on the URI request, + * as well as any "routes" that have been set in the routing config file. + * + * @access private + * @return void + */ + function _set_routing() + { + // Are query strings enabled in the config file? Normally CI doesn't utilize query strings + // since URI segments are more search-engine friendly, but they can optionally be used. + // If this feature is enabled, we will gather the directory/class/method a little differently + $segments = array(); + if ($this->config->item('enable_query_strings') === TRUE AND isset($_GET[$this->config->item('controller_trigger')])) + { + if (isset($_GET[$this->config->item('directory_trigger')])) + { + $this->set_directory(trim($this->uri->_filter_uri($_GET[$this->config->item('directory_trigger')]))); + $segments[] = $this->fetch_directory(); + } + + if (isset($_GET[$this->config->item('controller_trigger')])) + { + $this->set_class(trim($this->uri->_filter_uri($_GET[$this->config->item('controller_trigger')]))); + $segments[] = $this->fetch_class(); + } + + if (isset($_GET[$this->config->item('function_trigger')])) + { + $this->set_method(trim($this->uri->_filter_uri($_GET[$this->config->item('function_trigger')]))); + $segments[] = $this->fetch_method(); + } + } + + // Load the routes.php file. + if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/routes.php')) + { + include(APPPATH.'config/'.ENVIRONMENT.'/routes.php'); + } + elseif (is_file(APPPATH.'config/routes.php')) + { + include(APPPATH.'config/routes.php'); + } + + $this->routes = ( ! isset($route) OR ! is_array($route)) ? array() : $route; + unset($route); + + // Set the default controller so we can display it in the event + // the URI doesn't correlated to a valid controller. + $this->default_controller = ( ! isset($this->routes['default_controller']) OR $this->routes['default_controller'] == '') ? FALSE : strtolower($this->routes['default_controller']); + + // Were there any query string segments? If so, we'll validate them and bail out since we're done. + if (count($segments) > 0) + { + return $this->_validate_request($segments); + } + + // Fetch the complete URI string + $this->uri->_fetch_uri_string(); + + // Is there a URI string? If not, the default controller specified in the "routes" file will be shown. + if ($this->uri->uri_string == '') + { + return $this->_set_default_controller(); + } + + // Do we need to remove the URL suffix? + $this->uri->_remove_url_suffix(); + + // Compile the segments into an array + $this->uri->_explode_segments(); + + // Parse any custom routing that may exist + $this->_parse_routes(); + + // Re-index the segment array so that it starts with 1 rather than 0 + $this->uri->_reindex_segments(); + } + + // -------------------------------------------------------------------- + + /** + * Set the default controller + * + * @access private + * @return void + */ + function _set_default_controller() + { + if ($this->default_controller === FALSE) + { + show_error("Unable to determine what should be displayed. A default route has not been specified in the routing file."); + } + // Is the method being specified? + if (strpos($this->default_controller, '/') !== FALSE) + { + $x = explode('/', $this->default_controller); + + $this->set_class($x[0]); + $this->set_method($x[1]); + $this->_set_request($x); + } + else + { + $this->set_class($this->default_controller); + $this->set_method('index'); + $this->_set_request(array($this->default_controller, 'index')); + } + + // re-index the routed segments array so it starts with 1 rather than 0 + $this->uri->_reindex_segments(); + + log_message('debug', "No URI present. Default controller set."); + } + + // -------------------------------------------------------------------- + + /** + * Set the Route + * + * This function takes an array of URI segments as + * input, and sets the current class/method + * + * @access private + * @param array + * @param bool + * @return void + */ + function _set_request($segments = array()) + { + $segments = $this->_validate_request($segments); + + if (count($segments) == 0) + { + return $this->_set_default_controller(); + } + + $this->set_class($segments[0]); + + if (isset($segments[1])) + { + // A standard method request + $this->set_method($segments[1]); + } + else + { + // This lets the "routed" segment array identify that the default + // index method is being used. + $segments[1] = 'index'; + } + + // Update our "routed" segment array to contain the segments. + // Note: If there is no custom routing, this array will be + // identical to $this->uri->segments + $this->uri->rsegments = $segments; + } + + // -------------------------------------------------------------------- + + /** + * Validates the supplied segments. Attempts to determine the path to + * the controller. + * + * @access private + * @param array + * @return array + */ + function _validate_request($segments) + { + if (count($segments) == 0) + { + return $segments; + } + + // Does the requested controller exist in the root folder? + if (file_exists(APPPATH.'controllers/'.$segments[0].'.php')) + { + return $segments; + } + + // Is the controller in a sub-folder? + if (is_dir(APPPATH.'controllers/'.$segments[0])) + { + // Set the directory and remove it from the segment array + $this->set_directory($segments[0]); + $segments = array_slice($segments, 1); + + if (count($segments) > 0) + { + // Does the requested controller exist in the sub-folder? + if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].'.php')) + { + if ( ! empty($this->routes['404_override'])) + { + $x = explode('/', $this->routes['404_override']); + + $this->set_directory(''); + $this->set_class($x[0]); + $this->set_method(isset($x[1]) ? $x[1] : 'index'); + + return $x; + } + else + { + show_404($this->fetch_directory().$segments[0]); + } + } + } + else + { + // Is the method being specified in the route? + if (strpos($this->default_controller, '/') !== FALSE) + { + $x = explode('/', $this->default_controller); + + $this->set_class($x[0]); + $this->set_method($x[1]); + } + else + { + $this->set_class($this->default_controller); + $this->set_method('index'); + } + + // Does the default controller exist in the sub-folder? + if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.'.php')) + { + $this->directory = ''; + return array(); + } + + } + + return $segments; + } + + + // If we've gotten this far it means that the URI does not correlate to a valid + // controller class. We will now see if there is an override + if ( ! empty($this->routes['404_override'])) + { + $x = explode('/', $this->routes['404_override']); + + $this->set_class($x[0]); + $this->set_method(isset($x[1]) ? $x[1] : 'index'); + + return $x; + } + + + // Nothing else to do at this point but show a 404 + show_404($segments[0]); + } + + // -------------------------------------------------------------------- + + /** + * Parse Routes + * + * This function matches any routes that may exist in + * the config/routes.php file against the URI to + * determine if the class/method need to be remapped. + * + * @access private + * @return void + */ + function _parse_routes() + { + // Turn the segment array into a URI string + $uri = implode('/', $this->uri->segments); + + // Is there a literal match? If so we're done + if (isset($this->routes[$uri])) + { + return $this->_set_request(explode('/', $this->routes[$uri])); + } + + // Loop through the route array looking for wild-cards + foreach ($this->routes as $key => $val) + { + // Convert wild-cards to RegEx + $key = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $key)); + + // Does the RegEx match? + if (preg_match('#^'.$key.'$#', $uri)) + { + // Do we have a back-reference? + if (strpos($val, '$') !== FALSE AND strpos($key, '(') !== FALSE) + { + $val = preg_replace('#^'.$key.'$#', $val, $uri); + } + + return $this->_set_request(explode('/', $val)); + } + } + + // If we got this far it means we didn't encounter a + // matching route so we'll set the site default route + $this->_set_request($this->uri->segments); + } + + // -------------------------------------------------------------------- + + /** + * Set the class name + * + * @access public + * @param string + * @return void + */ + function set_class($class) + { + $this->class = str_replace(array('/', '.'), '', $class); + } + + // -------------------------------------------------------------------- + + /** + * Fetch the current class + * + * @access public + * @return string + */ + function fetch_class() + { + return $this->class; + } + + // -------------------------------------------------------------------- + + /** + * Set the method name + * + * @access public + * @param string + * @return void + */ + function set_method($method) + { + $this->method = $method; + } + + // -------------------------------------------------------------------- + + /** + * Fetch the current method + * + * @access public + * @return string + */ + function fetch_method() + { + if ($this->method == $this->fetch_class()) + { + return 'index'; + } + + return $this->method; + } + + // -------------------------------------------------------------------- + + /** + * Set the directory name + * + * @access public + * @param string + * @return void + */ + function set_directory($dir) + { + $this->directory = str_replace(array('/', '.'), '', $dir).'/'; + } + + // -------------------------------------------------------------------- + + /** + * Fetch the sub-directory (if any) that contains the requested controller class + * + * @access public + * @return string + */ + function fetch_directory() + { + return $this->directory; + } + + // -------------------------------------------------------------------- + + /** + * Set the controller overrides + * + * @access public + * @param array + * @return null + */ + function _set_overrides($routing) + { + if ( ! is_array($routing)) + { + return; + } + + if (isset($routing['directory'])) + { + $this->set_directory($routing['directory']); + } + + if (isset($routing['controller']) AND $routing['controller'] != '') + { + $this->set_class($routing['controller']); + } + + if (isset($routing['function'])) + { + $routing['function'] = ($routing['function'] == '') ? 'index' : $routing['function']; + $this->set_method($routing['function']); + } + } + + +} +// END Router Class + +/* End of file Router.php */ +/* Location: ./system/core/Router.php */ \ No newline at end of file diff --git a/system/core/Security.php b/system/core/Security.php new file mode 100644 index 0000000..a30488f --- /dev/null +++ b/system/core/Security.php @@ -0,0 +1,902 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Security Class + * + * @package CodeIgniter + * @subpackage Libraries + * @category Security + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/security.html + */ +class CI_Security { + + /** + * Random Hash for protecting URLs + * + * @var string + * @access protected + */ + protected $_xss_hash = ''; + /** + * Random Hash for Cross Site Request Forgery Protection Cookie + * + * @var string + * @access protected + */ + protected $_csrf_hash = ''; + /** + * Expiration time for Cross Site Request Forgery Protection Cookie + * Defaults to two hours (in seconds) + * + * @var int + * @access protected + */ + protected $_csrf_expire = 7200; + /** + * Token name for Cross Site Request Forgery Protection Cookie + * + * @var string + * @access protected + */ + protected $_csrf_token_name = 'ci_csrf_token'; + /** + * Cookie name for Cross Site Request Forgery Protection Cookie + * + * @var string + * @access protected + */ + protected $_csrf_cookie_name = 'ci_csrf_token'; + /** + * List of never allowed strings + * + * @var array + * @access protected + */ + protected $_never_allowed_str = array( + 'document.cookie' => '[removed]', + 'document.write' => '[removed]', + '.parentNode' => '[removed]', + '.innerHTML' => '[removed]', + '-moz-binding' => '[removed]', + '<!--' => '&lt;!--', + '-->' => '--&gt;', + '<![CDATA[' => '&lt;![CDATA[', + '<comment>' => '&lt;comment&gt;' + ); + + /* never allowed, regex replacement */ + /** + * List of never allowed regex replacement + * + * @var array + * @access protected + */ + protected $_never_allowed_regex = array( + 'javascript\s*:', + '(document|(document\.)?window)\.(location|on\w*)', + 'expression\s*(\(|&\#40;)', // CSS and IE + 'vbscript\s*:', // IE, surprise! + 'wscript\s*:', // IE + 'jscript\s*:', // IE + 'vbs\s*:', // IE + 'Redirect\s+30\d:', + "([\"'])?data\s*:[^\\1]*?base64[^\\1]*?,[^\\1]*?\\1?" + ); + + /** + * Constructor + * + * @return void + */ + public function __construct() + { + // Is CSRF protection enabled? + if (config_item('csrf_protection') === TRUE) + { + // CSRF config + foreach (array('csrf_expire', 'csrf_token_name', 'csrf_cookie_name') as $key) + { + if (FALSE !== ($val = config_item($key))) + { + $this->{'_'.$key} = $val; + } + } + + // Append application specific cookie prefix + if (config_item('cookie_prefix')) + { + $this->_csrf_cookie_name = config_item('cookie_prefix').$this->_csrf_cookie_name; + } + + // Set the CSRF hash + $this->_csrf_set_hash(); + } + + log_message('debug', "Security Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * Verify Cross Site Request Forgery Protection + * + * @return object + */ + public function csrf_verify() + { + // If it's not a POST request we will set the CSRF cookie + if (strtoupper($_SERVER['REQUEST_METHOD']) !== 'POST') + { + return $this->csrf_set_cookie(); + } + + // Do the tokens exist in both the _POST and _COOKIE arrays? + if ( ! isset($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name])) + { + $this->csrf_show_error(); + } + + // Do the tokens match? + if ($_POST[$this->_csrf_token_name] != $_COOKIE[$this->_csrf_cookie_name]) + { + $this->csrf_show_error(); + } + + // We kill this since we're done and we don't want to + // polute the _POST array + unset($_POST[$this->_csrf_token_name]); + + // Nothing should last forever + unset($_COOKIE[$this->_csrf_cookie_name]); + $this->_csrf_set_hash(); + $this->csrf_set_cookie(); + + log_message('debug', 'CSRF token verified'); + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Cross Site Request Forgery Protection Cookie + * + * @return object + */ + public function csrf_set_cookie() + { + $expire = time() + $this->_csrf_expire; + $secure_cookie = (config_item('cookie_secure') === TRUE) ? 1 : 0; + + if ($secure_cookie && (empty($_SERVER['HTTPS']) OR strtolower($_SERVER['HTTPS']) === 'off')) + { + return FALSE; + } + + setcookie($this->_csrf_cookie_name, $this->_csrf_hash, $expire, config_item('cookie_path'), config_item('cookie_domain'), $secure_cookie); + + log_message('debug', "CRSF cookie Set"); + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Show CSRF Error + * + * @return void + */ + public function csrf_show_error() + { + show_error('The action you have requested is not allowed.'); + } + + // -------------------------------------------------------------------- + + /** + * Get CSRF Hash + * + * Getter Method + * + * @return string self::_csrf_hash + */ + public function get_csrf_hash() + { + return $this->_csrf_hash; + } + + // -------------------------------------------------------------------- + + /** + * Get CSRF Token Name + * + * Getter Method + * + * @return string self::csrf_token_name + */ + public function get_csrf_token_name() + { + return $this->_csrf_token_name; + } + + // -------------------------------------------------------------------- + + /** + * XSS Clean + * + * Sanitizes data so that Cross Site Scripting Hacks can be + * prevented. This function does a fair amount of work but + * it is extremely thorough, designed to prevent even the + * most obscure XSS attempts. Nothing is ever 100% foolproof, + * of course, but I haven't been able to get anything passed + * the filter. + * + * Note: This function should only be used to deal with data + * upon submission. It's not something that should + * be used for general runtime processing. + * + * This function was based in part on some code and ideas I + * got from Bitflux: http://channel.bitflux.ch/wiki/XSS_Prevention + * + * To help develop this script I used this great list of + * vulnerabilities along with a few other hacks I've + * harvested from examining vulnerabilities in other programs: + * http://ha.ckers.org/xss.html + * + * @param mixed string or array + * @param bool + * @return string + */ + public function xss_clean($str, $is_image = FALSE) + { + // Is the string an array? + if (is_array($str)) + { + while (list($key) = each($str)) + { + $str[$key] = $this->xss_clean($str[$key]); + } + + return $str; + } + + //Remove Invisible Characters + $str = remove_invisible_characters($str); + + /* + * URL Decode + * + * Just in case stuff like this is submitted: + * + * <a href="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">Google</a> + * + * Note: Use rawurldecode() so it does not remove plus signs + */ + do + { + $str = rawurldecode($str); + } + while (preg_match('/%[0-9a-f]{2,}/i', $str)); + + /* + * Convert character entities to ASCII + * + * This permits our tests below to work reliably. + * We only convert entities that are within tags since + * these are the ones that will pose security problems. + */ + $str = preg_replace_callback("/[^a-z0-9>]+[a-z0-9]+=([\'\"]).*?\\1/si", array($this, '_convert_attribute'), $str); + $str = preg_replace_callback('/<\w+.*/si', array($this, '_decode_entity'), $str); + + // Remove Invisible Characters Again! + $str = remove_invisible_characters($str); + + /* + * Convert all tabs to spaces + * + * This prevents strings like this: ja vascript + * NOTE: we deal with spaces between characters later. + * NOTE: preg_replace was found to be amazingly slow here on + * large blocks of data, so we use str_replace. + */ + $str = str_replace("\t", ' ', $str); + + // Capture converted string for later comparison + $converted_string = $str; + + // Remove Strings that are never allowed + $str = $this->_do_never_allowed($str); + + /* + * Makes PHP tags safe + * + * Note: XML tags are inadvertently replaced too: + * + * <?xml + * + * But it doesn't seem to pose a problem. + */ + if ($is_image === TRUE) + { + // Images have a tendency to have the PHP short opening and + // closing tags every so often so we skip those and only + // do the long opening tags. + $str = preg_replace('/<\?(php)/i', '&lt;?\\1', $str); + } + else + { + $str = str_replace(array('<?', '?'.'>'), array('&lt;?', '?&gt;'), $str); + } + + /* + * Compact any exploded words + * + * This corrects words like: j a v a s c r i p t + * These words are compacted back to their correct state. + */ + $words = array( + 'javascript', 'expression', 'vbscript', 'jscript', 'wscript', + 'vbs', 'script', 'base64', 'applet', 'alert', 'document', + 'write', 'cookie', 'window', 'confirm', 'prompt', 'eval' + ); + + foreach ($words as $word) + { + $word = implode('\s*', str_split($word)).'\s*'; + + // We only want to do this when it is followed by a non-word character + // That way valid stuff like "dealer to" does not become "dealerto" + $str = preg_replace_callback('#('.substr($word, 0, -3).')(\W)#is', array($this, '_compact_exploded_words'), $str); + } + + /* + * Remove disallowed Javascript in links or img tags + * We used to do some version comparisons and use of stripos(), + * but it is dog slow compared to these simplified non-capturing + * preg_match(), especially if the pattern exists in the string + * + * Note: It was reported that not only space characters, but all in + * the following pattern can be parsed as separators between a tag name + * and its attributes: [\d\s"\'`;,\/\=\(\x00\x0B\x09\x0C] + * ... however, remove_invisible_characters() above already strips the + * hex-encoded ones, so we'll skip them below. + */ + do + { + $original = $str; + + if (preg_match('/<a/i', $str)) + { + $str = preg_replace_callback('#<a[^a-z0-9>]+([^>]*?)(?:>|$)#si', array($this, '_js_link_removal'), $str); + } + + if (preg_match('/<img/i', $str)) + { + $str = preg_replace_callback('#<img[^a-z0-9]+([^>]*?)(?:\s?/?>|$)#si', array($this, '_js_img_removal'), $str); + } + + if (preg_match('/script|xss/i', $str)) + { + $str = preg_replace('#</*(?:script|xss).*?>#si', '[removed]', $str); + } + } + while($original !== $str); + unset($original); + + /* + * Sanitize naughty HTML elements + * + * If a tag containing any of the words in the list + * below is found, the tag gets converted to entities. + * + * So this: <blink> + * Becomes: &lt;blink&gt; + */ + $pattern = '#' + .'<((?<slash>/*\s*)(?<tagName>[a-z0-9]+)(?=[^a-z0-9]|$)' // tag start and name, followed by a non-tag character + .'[^\s\042\047a-z0-9>/=]*' // a valid attribute character immediately after the tag would count as a separator + // optional attributes + .'(?<attributes>(?:[\s\042\047/=]*' // non-attribute characters, excluding > (tag close) for obvious reasons + .'[^\s\042\047>/=]+' // attribute characters + // optional attribute-value + .'(?:\s*=' // attribute-value separator + .'(?:[^\s\042\047=><`]+|\s*\042[^\042]*\042|\s*\047[^\047]*\047|\s*(?U:[^\s\042\047=><`]*))' // single, double or non-quoted value + .')?' // end optional attribute-value group + .')*)' // end optional attributes group + .'[^>]*)(?<closeTag>\>)?#isS'; + + // Note: It would be nice to optimize this for speed, BUT + // only matching the naughty elements here results in + // false positives and in turn - vulnerabilities! + do + { + $old_str = $str; + $str = preg_replace_callback($pattern, array($this, '_sanitize_naughty_html'), $str); + } + while ($old_str !== $str); + unset($old_str); + + /* + * Sanitize naughty scripting elements + * + * Similar to above, only instead of looking for + * tags it looks for PHP and JavaScript commands + * that are disallowed. Rather than removing the + * code, it simply converts the parenthesis to entities + * rendering the code un-executable. + * + * For example: eval('some code') + * Becomes: eval&#40;'some code'&#41; + */ + $str = preg_replace( + '#(alert|prompt|confirm|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)\((.*?)\)#si', + '\\1\\2&#40;\\3&#41;', + $str + ); + + // Final clean up + // This adds a bit of extra precaution in case + // something got through the above filters + $str = $this->_do_never_allowed($str); + + /* + * Images are Handled in a Special Way + * - Essentially, we want to know that after all of the character + * conversion is done whether any unwanted, likely XSS, code was found. + * If not, we return TRUE, as the image is clean. + * However, if the string post-conversion does not matched the + * string post-removal of XSS, then it fails, as there was unwanted XSS + * code found and removed/changed during processing. + */ + + if ($is_image === TRUE) + { + return ($str === $converted_string); + } + + log_message('debug', "XSS Filtering completed"); + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Random Hash for protecting URLs + * + * @return string + */ + public function xss_hash() + { + if ($this->_xss_hash == '') + { + mt_srand(); + $this->_xss_hash = md5(time() + mt_rand(0, 1999999999)); + } + + return $this->_xss_hash; + } + + // -------------------------------------------------------------------- + + /** + * HTML Entities Decode + * + * This function is a replacement for html_entity_decode() + * + * The reason we are not using html_entity_decode() by itself is because + * while it is not technically correct to leave out the semicolon + * at the end of an entity most browsers will still interpret the entity + * correctly. html_entity_decode() does not convert entities without + * semicolons, so we are left with our own little solution here. Bummer. + * + * @param string + * @param string + * @return string + */ + public function entity_decode($str, $charset='UTF-8') + { + if (strpos($str, '&') === FALSE) + { + return $str; + } + + static $_entities; + + isset($charset) OR $charset = strtoupper(config_item('charset')); + $flag = is_php('5.4') + ? ENT_COMPAT | ENT_HTML5 + : ENT_COMPAT; + + do + { + $str_compare = $str; + + // Decode standard entities, avoiding false positives + if (preg_match_all('/\&[a-z]{2,}(?![a-z;])/i', $str, $matches)) + { + if ( ! isset($_entities)) + { + $_entities = array_map( + 'strtolower', + is_php('5.3.4') + ? get_html_translation_table(HTML_ENTITIES, $flag, $charset) + : get_html_translation_table(HTML_ENTITIES, $flag) + ); + + // If we're not on PHP 5.4+, add the possibly dangerous HTML 5 + // entities to the array manually + if ($flag === ENT_COMPAT) + { + $_entities[':'] = '&colon;'; + $_entities['('] = '&lpar;'; + $_entities[')'] = '&rpar;'; + $_entities["\n"] = '&newline;'; + $_entities["\t"] = '&tab;'; + } + } + + $replace = array(); + $matches = array_unique(array_map('strtolower', $matches[0])); + foreach ($matches as &$match) + { + if (($char = array_search($match.';', $_entities, TRUE)) !== FALSE) + { + $replace[$match] = $char; + } + } + + $str = str_ireplace(array_keys($replace), array_values($replace), $str); + } + + // Decode numeric & UTF16 two byte entities + $str = html_entity_decode( + preg_replace('/(&#(?:x0*[0-9a-f]{2,5}(?![0-9a-f;])|(?:0*\d{2,4}(?![0-9;]))))/iS', '$1;', $str), + $flag, + $charset + ); + } + while ($str_compare !== $str); + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Filename Security + * + * @param string + * @param bool + * @return string + */ + public function sanitize_filename($str, $relative_path = FALSE) + { + $bad = array( + '../', '<!--', '-->', '<', '>', + "'", '"', '&', '$', '#', + '{', '}', '[', ']', '=', + ';', '?', '%20', '%22', + '%3c', // < + '%253c', // < + '%3e', // > + '%0e', // > + '%28', // ( + '%29', // ) + '%2528', // ( + '%26', // & + '%24', // $ + '%3f', // ? + '%3b', // ; + '%3d' // = + ); + + if ( ! $relative_path) + { + $bad[] = './'; + $bad[] = '/'; + } + + $str = remove_invisible_characters($str, FALSE); + + do + { + $old = $str; + $str = str_replace($bad, '', $str); + } + while ($old !== $str); + + return stripslashes($str); + } + + // ---------------------------------------------------------------- + + /** + * Compact Exploded Words + * + * Callback function for xss_clean() to remove whitespace from + * things like j a v a s c r i p t + * + * @param type + * @return type + */ + protected function _compact_exploded_words($matches) + { + return preg_replace('/\s+/s', '', $matches[1]).$matches[2]; + } + + // -------------------------------------------------------------------- + + /** + * Sanitize Naughty HTML + * + * Callback function for xss_clean() to remove naughty HTML elements + * + * @param array + * @return string + */ + protected function _sanitize_naughty_html($matches) + { + static $naughty_tags = array( + 'alert', 'prompt', 'confirm', 'applet', 'audio', 'basefont', 'base', 'behavior', 'bgsound', + 'blink', 'body', 'embed', 'expression', 'form', 'frameset', 'frame', 'head', 'html', 'ilayer', + 'iframe', 'input', 'button', 'select', 'isindex', 'layer', 'link', 'meta', 'keygen', 'object', + 'plaintext', 'style', 'script', 'textarea', 'title', 'math', 'video', 'svg', 'xml', 'xss' + ); + + static $evil_attributes = array( + 'on\w+', 'style', 'xmlns', 'formaction', 'form', 'xlink:href', 'FSCommand', 'seekSegmentTime' + ); + + // First, escape unclosed tags + if (empty($matches['closeTag'])) + { + return '&lt;'.$matches[1]; + } + // Is the element that we caught naughty? If so, escape it + elseif (in_array(strtolower($matches['tagName']), $naughty_tags, TRUE)) + { + return '&lt;'.$matches[1].'&gt;'; + } + // For other tags, see if their attributes are "evil" and strip those + elseif (isset($matches['attributes'])) + { + // We'll store the already fitlered attributes here + $attributes = array(); + + // Attribute-catching pattern + $attributes_pattern = '#' + .'(?<name>[^\s\042\047>/=]+)' // attribute characters + // optional attribute-value + .'(?:\s*=(?<value>[^\s\042\047=><`]+|\s*\042[^\042]*\042|\s*\047[^\047]*\047|\s*(?U:[^\s\042\047=><`]*)))' // attribute-value separator + .'#i'; + + // Blacklist pattern for evil attribute names + $is_evil_pattern = '#^('.implode('|', $evil_attributes).')$#i'; + + // Each iteration filters a single attribute + do + { + // Strip any non-alpha characters that may preceed an attribute. + // Browsers often parse these incorrectly and that has been a + // of numerous XSS issues we've had. + $matches['attributes'] = preg_replace('#^[^a-z]+#i', '', $matches['attributes']); + + if ( ! preg_match($attributes_pattern, $matches['attributes'], $attribute, PREG_OFFSET_CAPTURE)) + { + // No (valid) attribute found? Discard everything else inside the tag + break; + } + + if ( + // Is it indeed an "evil" attribute? + preg_match($is_evil_pattern, $attribute['name'][0]) + // Or does it have an equals sign, but no value and not quoted? Strip that too! + OR (trim($attribute['value'][0]) === '') + ) + { + $attributes[] = 'xss=removed'; + } + else + { + $attributes[] = $attribute[0][0]; + } + + $matches['attributes'] = substr($matches['attributes'], $attribute[0][1] + strlen($attribute[0][0])); + } + while ($matches['attributes'] !== ''); + + $attributes = empty($attributes) + ? '' + : ' '.implode(' ', $attributes); + return '<'.$matches['slash'].$matches['tagName'].$attributes.'>'; + } + + return $matches[0]; + } + + // -------------------------------------------------------------------- + + /** + * JS Link Removal + * + * Callback function for xss_clean() to sanitize links + * This limits the PCRE backtracks, making it more performance friendly + * and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in + * PHP 5.2+ on link-heavy strings + * + * @param array + * @return string + */ + protected function _js_link_removal($match) + { + return str_replace( + $match[1], + preg_replace( + '#href=.*?(?:(?:alert|prompt|confirm)(?:\(|&\#40;)|javascript:|livescript:|mocha:|charset=|window\.|document\.|\.cookie|<script|<xss|data\s*:)#si', + '', + $this->_filter_attributes($match[1]) + ), + $match[0] + ); + } + + // -------------------------------------------------------------------- + + /** + * JS Image Removal + * + * Callback function for xss_clean() to sanitize image tags + * This limits the PCRE backtracks, making it more performance friendly + * and prevents PREG_BACKTRACK_LIMIT_ERROR from being triggered in + * PHP 5.2+ on image tag heavy strings + * + * @param array + * @return string + */ + protected function _js_img_removal($match) + { + return str_replace( + $match[1], + preg_replace( + '#src=.*?(?:(?:alert|prompt|confirm|eval)(?:\(|&\#40;)|javascript:|livescript:|mocha:|charset=|window\.|document\.|\.cookie|<script|<xss|base64\s*,)#si', + '', + $this->_filter_attributes($match[1]) + ), + $match[0] + ); + } + + // -------------------------------------------------------------------- + + /** + * Attribute Conversion + * + * Used as a callback for XSS Clean + * + * @param array + * @return string + */ + protected function _convert_attribute($match) + { + return str_replace(array('>', '<', '\\'), array('&gt;', '&lt;', '\\\\'), $match[0]); + } + + // -------------------------------------------------------------------- + + /** + * Filter Attributes + * + * Filters tag attributes for consistency and safety + * + * @param string + * @return string + */ + protected function _filter_attributes($str) + { + $out = ''; + + if (preg_match_all('#\s*[a-z\-]+\s*=\s*(\042|\047)([^\\1]*?)\\1#is', $str, $matches)) + { + foreach ($matches[0] as $match) + { + $out .= preg_replace("#/\*.*?\*/#s", '', $match); + } + } + + return $out; + } + + // -------------------------------------------------------------------- + + /** + * HTML Entity Decode Callback + * + * Used as a callback for XSS Clean + * + * @param array + * @return string + */ + protected function _decode_entity($match) + { + // Protect GET variables in URLs + // 901119URL5918AMP18930PROTECT8198 + $match = preg_replace('|\&([a-z\_0-9\-]+)\=([a-z\_0-9\-/]+)|i', $this->xss_hash().'\\1=\\2', $match[0]); + + // Decode, then un-protect URL GET vars + return str_replace( + $this->xss_hash(), + '&', + $this->entity_decode($match, strtoupper(config_item('charset'))) + ); + } + + // ---------------------------------------------------------------------- + + /** + * Do Never Allowed + * + * A utility function for xss_clean() + * + * @param string + * @return string + */ + protected function _do_never_allowed($str) + { + $str = str_replace(array_keys($this->_never_allowed_str), $this->_never_allowed_str, $str); + + foreach ($this->_never_allowed_regex as $regex) + { + $str = preg_replace('#'.$regex.'#is', '[removed]', $str); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Set Cross Site Request Forgery Protection Cookie + * + * @return string + */ + protected function _csrf_set_hash() + { + if ($this->_csrf_hash == '') + { + // If the cookie exists we will use it's value. + // We don't necessarily want to regenerate it with + // each page load since a page could contain embedded + // sub-pages causing this feature to fail + if (isset($_COOKIE[$this->_csrf_cookie_name]) && + preg_match('#^[0-9a-f]{32}$#iS', $_COOKIE[$this->_csrf_cookie_name]) === 1) + { + return $this->_csrf_hash = $_COOKIE[$this->_csrf_cookie_name]; + } + + return $this->_csrf_hash = md5(uniqid(rand(), TRUE)); + } + + return $this->_csrf_hash; + } + +} + +/* End of file Security.php */ +/* Location: ./system/core/Security.php */ diff --git a/system/core/URI.php b/system/core/URI.php new file mode 100644 index 0000000..a66cd71 --- /dev/null +++ b/system/core/URI.php @@ -0,0 +1,655 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * URI Class + * + * Parses URIs and determines routing + * + * @package CodeIgniter + * @subpackage Libraries + * @category URI + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/uri.html + */ +class CI_URI { + + /** + * List of cached uri segments + * + * @var array + * @access public + */ + var $keyval = array(); + /** + * Current uri string + * + * @var string + * @access public + */ + var $uri_string; + /** + * List of uri segments + * + * @var array + * @access public + */ + var $segments = array(); + /** + * Re-indexed list of uri segments + * Starts at 1 instead of 0 + * + * @var array + * @access public + */ + var $rsegments = array(); + + /** + * Constructor + * + * Simply globalizes the $RTR object. The front + * loads the Router class early on so it's not available + * normally as other classes are. + * + * @access public + */ + function __construct() + { + $this->config =& load_class('Config', 'core'); + log_message('debug', "URI Class Initialized"); + } + + + // -------------------------------------------------------------------- + + /** + * Get the URI String + * + * @access private + * @return string + */ + function _fetch_uri_string() + { + if (strtoupper($this->config->item('uri_protocol')) == 'AUTO') + { + // Is the request coming from the command line? + if (php_sapi_name() == 'cli' or defined('STDIN')) + { + $this->_set_uri_string($this->_parse_cli_args()); + return; + } + + // Let's try the REQUEST_URI first, this will work in most situations + if ($uri = $this->_detect_uri()) + { + $this->_set_uri_string($uri); + return; + } + + // Is there a PATH_INFO variable? + // Note: some servers seem to have trouble with getenv() so we'll test it two ways + $path = (isset($_SERVER['PATH_INFO'])) ? $_SERVER['PATH_INFO'] : @getenv('PATH_INFO'); + if (trim($path, '/') != '' && $path != "/".SELF) + { + $this->_set_uri_string($path); + return; + } + + // No PATH_INFO?... What about QUERY_STRING? + $path = (isset($_SERVER['QUERY_STRING'])) ? $_SERVER['QUERY_STRING'] : @getenv('QUERY_STRING'); + if (trim($path, '/') != '') + { + $this->_set_uri_string($path); + return; + } + + // As a last ditch effort lets try using the $_GET array + if (is_array($_GET) && count($_GET) == 1 && trim(key($_GET), '/') != '') + { + $this->_set_uri_string(key($_GET)); + return; + } + + // We've exhausted all our options... + $this->uri_string = ''; + return; + } + + $uri = strtoupper($this->config->item('uri_protocol')); + + if ($uri == 'REQUEST_URI') + { + $this->_set_uri_string($this->_detect_uri()); + return; + } + elseif ($uri == 'CLI') + { + $this->_set_uri_string($this->_parse_cli_args()); + return; + } + + $path = (isset($_SERVER[$uri])) ? $_SERVER[$uri] : @getenv($uri); + $this->_set_uri_string($path); + } + + // -------------------------------------------------------------------- + + /** + * Set the URI String + * + * @access public + * @param string + * @return string + */ + function _set_uri_string($str) + { + // Filter out control characters + $str = remove_invisible_characters($str, FALSE); + + // If the URI contains only a slash we'll kill it + $this->uri_string = ($str == '/') ? '' : $str; + } + + // -------------------------------------------------------------------- + + /** + * Detects the URI + * + * This function will detect the URI automatically and fix the query string + * if necessary. + * + * @access private + * @return string + */ + private function _detect_uri() + { + if ( ! isset($_SERVER['REQUEST_URI']) OR ! isset($_SERVER['SCRIPT_NAME'])) + { + return ''; + } + + $uri = $_SERVER['REQUEST_URI']; + if (strpos($uri, $_SERVER['SCRIPT_NAME']) === 0) + { + $uri = substr($uri, strlen($_SERVER['SCRIPT_NAME'])); + } + elseif (strpos($uri, dirname($_SERVER['SCRIPT_NAME'])) === 0) + { + $uri = substr($uri, strlen(dirname($_SERVER['SCRIPT_NAME']))); + } + + // This section ensures that even on servers that require the URI to be in the query string (Nginx) a correct + // URI is found, and also fixes the QUERY_STRING server var and $_GET array. + if (strncmp($uri, '?/', 2) === 0) + { + $uri = substr($uri, 2); + } + $parts = preg_split('#\?#i', $uri, 2); + $uri = $parts[0]; + if (isset($parts[1])) + { + $_SERVER['QUERY_STRING'] = $parts[1]; + parse_str($_SERVER['QUERY_STRING'], $_GET); + } + else + { + $_SERVER['QUERY_STRING'] = ''; + $_GET = array(); + } + + if ($uri == '/' || empty($uri)) + { + return '/'; + } + + $uri = parse_url($uri, PHP_URL_PATH); + + // Do some final cleaning of the URI and return it + return str_replace(array('//', '../'), '/', trim($uri, '/')); + } + + // -------------------------------------------------------------------- + + /** + * Parse cli arguments + * + * Take each command line argument and assume it is a URI segment. + * + * @access private + * @return string + */ + private function _parse_cli_args() + { + $args = array_slice($_SERVER['argv'], 1); + + return $args ? '/' . implode('/', $args) : ''; + } + + // -------------------------------------------------------------------- + + /** + * Filter segments for malicious characters + * + * @access private + * @param string + * @return string + */ + function _filter_uri($str) + { + if ($str != '' && $this->config->item('permitted_uri_chars') != '' && $this->config->item('enable_query_strings') == FALSE) + { + // preg_quote() in PHP 5.3 escapes -, so the str_replace() and addition of - to preg_quote() is to maintain backwards + // compatibility as many are unaware of how characters in the permitted_uri_chars will be parsed as a regex pattern + if ( ! preg_match("|^[".str_replace(array('\\-', '\-'), '-', preg_quote($this->config->item('permitted_uri_chars'), '-'))."]+$|i", $str)) + { + show_error('The URI you submitted has disallowed characters.', 400); + } + } + + // Convert programatic characters to entities + $bad = array('$', '(', ')', '%28', '%29'); + $good = array('&#36;', '&#40;', '&#41;', '&#40;', '&#41;'); + + return str_replace($bad, $good, $str); + } + + // -------------------------------------------------------------------- + + /** + * Remove the suffix from the URL if needed + * + * @access private + * @return void + */ + function _remove_url_suffix() + { + if ($this->config->item('url_suffix') != "") + { + $this->uri_string = preg_replace("|".preg_quote($this->config->item('url_suffix'))."$|", "", $this->uri_string); + } + } + + // -------------------------------------------------------------------- + + /** + * Explode the URI Segments. The individual segments will + * be stored in the $this->segments array. + * + * @access private + * @return void + */ + function _explode_segments() + { + foreach (explode("/", preg_replace("|/*(.+?)/*$|", "\\1", $this->uri_string)) as $val) + { + // Filter segments for security + $val = trim($this->_filter_uri($val)); + + if ($val != '') + { + $this->segments[] = $val; + } + } + } + + // -------------------------------------------------------------------- + /** + * Re-index Segments + * + * This function re-indexes the $this->segment array so that it + * starts at 1 rather than 0. Doing so makes it simpler to + * use functions like $this->uri->segment(n) since there is + * a 1:1 relationship between the segment array and the actual segments. + * + * @access private + * @return void + */ + function _reindex_segments() + { + array_unshift($this->segments, NULL); + array_unshift($this->rsegments, NULL); + unset($this->segments[0]); + unset($this->rsegments[0]); + } + + // -------------------------------------------------------------------- + + /** + * Fetch a URI Segment + * + * This function returns the URI segment based on the number provided. + * + * @access public + * @param integer + * @param bool + * @return string + */ + function segment($n, $no_result = FALSE) + { + return ( ! isset($this->segments[$n])) ? $no_result : $this->segments[$n]; + } + + // -------------------------------------------------------------------- + + /** + * Fetch a URI "routed" Segment + * + * This function returns the re-routed URI segment (assuming routing rules are used) + * based on the number provided. If there is no routing this function returns the + * same result as $this->segment() + * + * @access public + * @param integer + * @param bool + * @return string + */ + function rsegment($n, $no_result = FALSE) + { + return ( ! isset($this->rsegments[$n])) ? $no_result : $this->rsegments[$n]; + } + + // -------------------------------------------------------------------- + + /** + * Generate a key value pair from the URI string + * + * This function generates and associative array of URI data starting + * at the supplied segment. For example, if this is your URI: + * + * example.com/user/search/name/joe/location/UK/gender/male + * + * You can use this function to generate an array with this prototype: + * + * array ( + * name => joe + * location => UK + * gender => male + * ) + * + * @access public + * @param integer the starting segment number + * @param array an array of default values + * @return array + */ + function uri_to_assoc($n = 3, $default = array()) + { + return $this->_uri_to_assoc($n, $default, 'segment'); + } + /** + * Identical to above only it uses the re-routed segment array + * + * @access public + * @param integer the starting segment number + * @param array an array of default values + * @return array + * + */ + function ruri_to_assoc($n = 3, $default = array()) + { + return $this->_uri_to_assoc($n, $default, 'rsegment'); + } + + // -------------------------------------------------------------------- + + /** + * Generate a key value pair from the URI string or Re-routed URI string + * + * @access private + * @param integer the starting segment number + * @param array an array of default values + * @param string which array we should use + * @return array + */ + function _uri_to_assoc($n = 3, $default = array(), $which = 'segment') + { + if ($which == 'segment') + { + $total_segments = 'total_segments'; + $segment_array = 'segment_array'; + } + else + { + $total_segments = 'total_rsegments'; + $segment_array = 'rsegment_array'; + } + + if ( ! is_numeric($n)) + { + return $default; + } + + if (isset($this->keyval[$n])) + { + return $this->keyval[$n]; + } + + if ($this->$total_segments() < $n) + { + if (count($default) == 0) + { + return array(); + } + + $retval = array(); + foreach ($default as $val) + { + $retval[$val] = FALSE; + } + return $retval; + } + + $segments = array_slice($this->$segment_array(), ($n - 1)); + + $i = 0; + $lastval = ''; + $retval = array(); + foreach ($segments as $seg) + { + if ($i % 2) + { + $retval[$lastval] = $seg; + } + else + { + $retval[$seg] = FALSE; + $lastval = $seg; + } + + $i++; + } + + if (count($default) > 0) + { + foreach ($default as $val) + { + if ( ! array_key_exists($val, $retval)) + { + $retval[$val] = FALSE; + } + } + } + + // Cache the array for reuse + $this->keyval[$n] = $retval; + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Generate a URI string from an associative array + * + * + * @access public + * @param array an associative array of key/values + * @return array + */ + function assoc_to_uri($array) + { + $temp = array(); + foreach ((array)$array as $key => $val) + { + $temp[] = $key; + $temp[] = $val; + } + + return implode('/', $temp); + } + + // -------------------------------------------------------------------- + + /** + * Fetch a URI Segment and add a trailing slash + * + * @access public + * @param integer + * @param string + * @return string + */ + function slash_segment($n, $where = 'trailing') + { + return $this->_slash_segment($n, $where, 'segment'); + } + + // -------------------------------------------------------------------- + + /** + * Fetch a URI Segment and add a trailing slash + * + * @access public + * @param integer + * @param string + * @return string + */ + function slash_rsegment($n, $where = 'trailing') + { + return $this->_slash_segment($n, $where, 'rsegment'); + } + + // -------------------------------------------------------------------- + + /** + * Fetch a URI Segment and add a trailing slash - helper function + * + * @access private + * @param integer + * @param string + * @param string + * @return string + */ + function _slash_segment($n, $where = 'trailing', $which = 'segment') + { + $leading = '/'; + $trailing = '/'; + + if ($where == 'trailing') + { + $leading = ''; + } + elseif ($where == 'leading') + { + $trailing = ''; + } + + return $leading.$this->$which($n).$trailing; + } + + // -------------------------------------------------------------------- + + /** + * Segment Array + * + * @access public + * @return array + */ + function segment_array() + { + return $this->segments; + } + + // -------------------------------------------------------------------- + + /** + * Routed Segment Array + * + * @access public + * @return array + */ + function rsegment_array() + { + return $this->rsegments; + } + + // -------------------------------------------------------------------- + + /** + * Total number of segments + * + * @access public + * @return integer + */ + function total_segments() + { + return count($this->segments); + } + + // -------------------------------------------------------------------- + + /** + * Total number of routed segments + * + * @access public + * @return integer + */ + function total_rsegments() + { + return count($this->rsegments); + } + + // -------------------------------------------------------------------- + + /** + * Fetch the entire URI string + * + * @access public + * @return string + */ + function uri_string() + { + return $this->uri_string; + } + + + // -------------------------------------------------------------------- + + /** + * Fetch the entire Re-routed URI string + * + * @access public + * @return string + */ + function ruri_string() + { + return '/'.implode('/', $this->rsegment_array()); + } + +} +// END URI Class + +/* End of file URI.php */ +/* Location: ./system/core/URI.php */ \ No newline at end of file diff --git a/system/core/Utf8.php b/system/core/Utf8.php new file mode 100644 index 0000000..efb78ce --- /dev/null +++ b/system/core/Utf8.php @@ -0,0 +1,166 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 2.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Utf8 Class + * + * Provides support for UTF-8 environments + * + * @package CodeIgniter + * @subpackage Libraries + * @category UTF-8 + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/utf8.html + */ +class CI_Utf8 { + + /** + * Constructor + * + * Determines if UTF-8 support is to be enabled + * + */ + function __construct() + { + log_message('debug', "Utf8 Class Initialized"); + + global $CFG; + + if ( + preg_match('/./u', 'é') === 1 // PCRE must support UTF-8 + AND function_exists('iconv') // iconv must be installed + AND ini_get('mbstring.func_overload') != 1 // Multibyte string function overloading cannot be enabled + AND $CFG->item('charset') == 'UTF-8' // Application charset must be UTF-8 + ) + { + log_message('debug', "UTF-8 Support Enabled"); + + define('UTF8_ENABLED', TRUE); + + // set internal encoding for multibyte string functions if necessary + // and set a flag so we don't have to repeatedly use extension_loaded() + // or function_exists() + if (extension_loaded('mbstring')) + { + define('MB_ENABLED', TRUE); + mb_internal_encoding('UTF-8'); + } + else + { + define('MB_ENABLED', FALSE); + } + } + else + { + log_message('debug', "UTF-8 Support Disabled"); + define('UTF8_ENABLED', FALSE); + } + } + + // -------------------------------------------------------------------- + + /** + * Clean UTF-8 strings + * + * Ensures strings are UTF-8 + * + * @access public + * @param string + * @return string + */ + function clean_string($str) + { + if ($this->_is_ascii($str) === FALSE) + { + $str = @iconv('UTF-8', 'UTF-8//IGNORE', $str); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Remove ASCII control characters + * + * Removes all ASCII control characters except horizontal tabs, + * line feeds, and carriage returns, as all others can cause + * problems in XML + * + * @access public + * @param string + * @return string + */ + function safe_ascii_for_xml($str) + { + return remove_invisible_characters($str, FALSE); + } + + // -------------------------------------------------------------------- + + /** + * Convert to UTF-8 + * + * Attempts to convert a string to UTF-8 + * + * @access public + * @param string + * @param string - input encoding + * @return string + */ + function convert_to_utf8($str, $encoding) + { + if (function_exists('iconv')) + { + $str = @iconv($encoding, 'UTF-8', $str); + } + elseif (function_exists('mb_convert_encoding')) + { + $str = @mb_convert_encoding($str, 'UTF-8', $encoding); + } + else + { + return FALSE; + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Is ASCII? + * + * Tests if a string is standard 7-bit ASCII or not + * + * @access public + * @param string + * @return bool + */ + function _is_ascii($str) + { + return (preg_match('/[^\x00-\x7F]/S', $str) == 0); + } + + // -------------------------------------------------------------------- + +} +// End Utf8 Class + +/* End of file Utf8.php */ +/* Location: ./system/core/Utf8.php */ \ No newline at end of file diff --git a/system/core/index.html b/system/core/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/system/core/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/system/database/DB.php b/system/database/DB.php new file mode 100644 index 0000000..bb3db3d --- /dev/null +++ b/system/database/DB.php @@ -0,0 +1,163 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Initialize the database + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + * @param string + * @param bool Determines if active record should be used or not + */ +function &DB($params = '', $active_record_override = NULL) +{ + // Load the DB config file if a DSN string wasn't passed + if (is_string($params) AND strpos($params, '://') === FALSE) + { + // Is the config file in the environment folder? + if ( ! defined('ENVIRONMENT') OR ! file_exists($file_path = APPPATH.'config/'.ENVIRONMENT.'/database.php')) + { + if ( ! file_exists($file_path = APPPATH.'config/database.php')) + { + show_error('The configuration file database.php does not exist.'); + } + } + + include($file_path); + + if ( ! isset($db) OR count($db) == 0) + { + show_error('No database connection settings were found in the database config file.'); + } + + if ($params != '') + { + $active_group = $params; + } + + if ( ! isset($active_group) OR ! isset($db[$active_group])) + { + show_error('You have specified an invalid database connection group.'); + } + + $params = $db[$active_group]; + } + elseif (is_string($params)) + { + + /* parse the URL from the DSN string + * Database settings can be passed as discreet + * parameters or as a data source name in the first + * parameter. DSNs must have this prototype: + * $dsn = 'driver://username:password@hostname/database'; + */ + + if (($dns = @parse_url($params)) === FALSE) + { + show_error('Invalid DB Connection String'); + } + + $params = array( + 'dbdriver' => $dns['scheme'], + 'hostname' => (isset($dns['host'])) ? rawurldecode($dns['host']) : '', + 'username' => (isset($dns['user'])) ? rawurldecode($dns['user']) : '', + 'password' => (isset($dns['pass'])) ? rawurldecode($dns['pass']) : '', + 'database' => (isset($dns['path'])) ? rawurldecode(substr($dns['path'], 1)) : '' + ); + + // were additional config items set? + if (isset($dns['query'])) + { + parse_str($dns['query'], $extra); + + foreach ($extra as $key => $val) + { + // booleans please + if (strtoupper($val) == "TRUE") + { + $val = TRUE; + } + elseif (strtoupper($val) == "FALSE") + { + $val = FALSE; + } + + $params[$key] = $val; + } + } + } + + // No DB specified yet? Beat them senseless... + if ( ! isset($params['dbdriver']) OR $params['dbdriver'] == '') + { + show_error('You have not selected a database type to connect to.'); + } + + // Load the DB classes. Note: Since the active record class is optional + // we need to dynamically create a class that extends proper parent class + // based on whether we're using the active record class or not. + // Kudos to Paul for discovering this clever use of eval() + + if ($active_record_override !== NULL) + { + $active_record = $active_record_override; + } + + require_once(BASEPATH.'database/DB_driver.php'); + + if ( ! isset($active_record) OR $active_record == TRUE) + { + require_once(BASEPATH.'database/DB_active_rec.php'); + + if ( ! class_exists('CI_DB')) + { + eval('class CI_DB extends CI_DB_active_record { }'); + } + } + else + { + if ( ! class_exists('CI_DB')) + { + eval('class CI_DB extends CI_DB_driver { }'); + } + } + + require_once(BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver.php'); + + // Instantiate the DB adapter + $driver = 'CI_DB_'.$params['dbdriver'].'_driver'; + $DB = new $driver($params); + + if ($DB->autoinit == TRUE) + { + $DB->initialize(); + } + + if (isset($params['stricton']) && $params['stricton'] == TRUE) + { + $DB->query('SET SESSION sql_mode="STRICT_ALL_TABLES"'); + } + + return $DB; +} + + + +/* End of file DB.php */ +/* Location: ./system/database/DB.php */ \ No newline at end of file diff --git a/system/database/DB_active_rec.php b/system/database/DB_active_rec.php new file mode 100644 index 0000000..33e2ea2 --- /dev/null +++ b/system/database/DB_active_rec.php @@ -0,0 +1,2046 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Active Record Class + * + * This is the platform-independent base Active Record implementation class. + * + * @package CodeIgniter + * @subpackage Drivers + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_active_record extends CI_DB_driver { + + var $ar_select = array(); + var $ar_distinct = FALSE; + var $ar_from = array(); + var $ar_join = array(); + var $ar_where = array(); + var $ar_like = array(); + var $ar_groupby = array(); + var $ar_having = array(); + var $ar_keys = array(); + var $ar_limit = FALSE; + var $ar_offset = FALSE; + var $ar_order = FALSE; + var $ar_orderby = array(); + var $ar_set = array(); + var $ar_wherein = array(); + var $ar_aliased_tables = array(); + var $ar_store_array = array(); + + // Active Record Caching variables + var $ar_caching = FALSE; + var $ar_cache_exists = array(); + var $ar_cache_select = array(); + var $ar_cache_from = array(); + var $ar_cache_join = array(); + var $ar_cache_where = array(); + var $ar_cache_like = array(); + var $ar_cache_groupby = array(); + var $ar_cache_having = array(); + var $ar_cache_orderby = array(); + var $ar_cache_set = array(); + + var $ar_no_escape = array(); + var $ar_cache_no_escape = array(); + + // -------------------------------------------------------------------- + + /** + * Select + * + * Generates the SELECT portion of the query + * + * @param string + * @return object + */ + public function select($select = '*', $escape = NULL) + { + if (is_string($select)) + { + $select = explode(',', $select); + } + + foreach ($select as $val) + { + $val = trim($val); + + if ($val != '') + { + $this->ar_select[] = $val; + $this->ar_no_escape[] = $escape; + + if ($this->ar_caching === TRUE) + { + $this->ar_cache_select[] = $val; + $this->ar_cache_exists[] = 'select'; + $this->ar_cache_no_escape[] = $escape; + } + } + } + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Select Max + * + * Generates a SELECT MAX(field) portion of a query + * + * @param string the field + * @param string an alias + * @return object + */ + public function select_max($select = '', $alias = '') + { + return $this->_max_min_avg_sum($select, $alias, 'MAX'); + } + + // -------------------------------------------------------------------- + + /** + * Select Min + * + * Generates a SELECT MIN(field) portion of a query + * + * @param string the field + * @param string an alias + * @return object + */ + public function select_min($select = '', $alias = '') + { + return $this->_max_min_avg_sum($select, $alias, 'MIN'); + } + + // -------------------------------------------------------------------- + + /** + * Select Average + * + * Generates a SELECT AVG(field) portion of a query + * + * @param string the field + * @param string an alias + * @return object + */ + public function select_avg($select = '', $alias = '') + { + return $this->_max_min_avg_sum($select, $alias, 'AVG'); + } + + // -------------------------------------------------------------------- + + /** + * Select Sum + * + * Generates a SELECT SUM(field) portion of a query + * + * @param string the field + * @param string an alias + * @return object + */ + public function select_sum($select = '', $alias = '') + { + return $this->_max_min_avg_sum($select, $alias, 'SUM'); + } + + // -------------------------------------------------------------------- + + /** + * Processing Function for the four functions above: + * + * select_max() + * select_min() + * select_avg() + * select_sum() + * + * @param string the field + * @param string an alias + * @return object + */ + protected function _max_min_avg_sum($select = '', $alias = '', $type = 'MAX') + { + if ( ! is_string($select) OR $select == '') + { + $this->display_error('db_invalid_query'); + } + + $type = strtoupper($type); + + if ( ! in_array($type, array('MAX', 'MIN', 'AVG', 'SUM'))) + { + show_error('Invalid function type: '.$type); + } + + if ($alias == '') + { + $alias = $this->_create_alias_from_table(trim($select)); + } + + $sql = $type.'('.$this->_protect_identifiers(trim($select)).') AS '.$alias; + + $this->ar_select[] = $sql; + + if ($this->ar_caching === TRUE) + { + $this->ar_cache_select[] = $sql; + $this->ar_cache_exists[] = 'select'; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Determines the alias name based on the table + * + * @param string + * @return string + */ + protected function _create_alias_from_table($item) + { + if (strpos($item, '.') !== FALSE) + { + return end(explode('.', $item)); + } + + return $item; + } + + // -------------------------------------------------------------------- + + /** + * DISTINCT + * + * Sets a flag which tells the query string compiler to add DISTINCT + * + * @param bool + * @return object + */ + public function distinct($val = TRUE) + { + $this->ar_distinct = (is_bool($val)) ? $val : TRUE; + return $this; + } + + // -------------------------------------------------------------------- + + /** + * From + * + * Generates the FROM portion of the query + * + * @param mixed can be a string or array + * @return object + */ + public function from($from) + { + foreach ((array) $from as $val) + { + if (strpos($val, ',') !== FALSE) + { + foreach (explode(',', $val) as $v) + { + $v = trim($v); + $this->_track_aliases($v); + + $this->ar_from[] = $this->_protect_identifiers($v, TRUE, NULL, FALSE); + + if ($this->ar_caching === TRUE) + { + $this->ar_cache_from[] = $this->_protect_identifiers($v, TRUE, NULL, FALSE); + $this->ar_cache_exists[] = 'from'; + } + } + + } + else + { + $val = trim($val); + + // Extract any aliases that might exist. We use this information + // in the _protect_identifiers to know whether to add a table prefix + $this->_track_aliases($val); + + $this->ar_from[] = $this->_protect_identifiers($val, TRUE, NULL, FALSE); + + if ($this->ar_caching === TRUE) + { + $this->ar_cache_from[] = $this->_protect_identifiers($val, TRUE, NULL, FALSE); + $this->ar_cache_exists[] = 'from'; + } + } + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Join + * + * Generates the JOIN portion of the query + * + * @param string + * @param string the join condition + * @param string the type of join + * @return object + */ + public function join($table, $cond, $type = '') + { + if ($type != '') + { + $type = strtoupper(trim($type)); + + if ( ! in_array($type, array('LEFT', 'RIGHT', 'OUTER', 'INNER', 'LEFT OUTER', 'RIGHT OUTER'))) + { + $type = ''; + } + else + { + $type .= ' '; + } + } + + // Extract any aliases that might exist. We use this information + // in the _protect_identifiers to know whether to add a table prefix + $this->_track_aliases($table); + + // Strip apart the condition and protect the identifiers + if (preg_match('/([\w\.]+)([\W\s]+)(.+)/', $cond, $match)) + { + $match[1] = $this->_protect_identifiers($match[1]); + $match[3] = $this->_protect_identifiers($match[3]); + + $cond = $match[1].$match[2].$match[3]; + } + + // Assemble the JOIN statement + $join = $type.'JOIN '.$this->_protect_identifiers($table, TRUE, NULL, FALSE).' ON '.$cond; + + $this->ar_join[] = $join; + if ($this->ar_caching === TRUE) + { + $this->ar_cache_join[] = $join; + $this->ar_cache_exists[] = 'join'; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Where + * + * Generates the WHERE portion of the query. Separates + * multiple calls with AND + * + * @param mixed + * @param mixed + * @return object + */ + public function where($key, $value = NULL, $escape = TRUE) + { + return $this->_where($key, $value, 'AND ', $escape); + } + + // -------------------------------------------------------------------- + + /** + * OR Where + * + * Generates the WHERE portion of the query. Separates + * multiple calls with OR + * + * @param mixed + * @param mixed + * @return object + */ + public function or_where($key, $value = NULL, $escape = TRUE) + { + return $this->_where($key, $value, 'OR ', $escape); + } + + // -------------------------------------------------------------------- + + /** + * Where + * + * Called by where() or or_where() + * + * @param mixed + * @param mixed + * @param string + * @return object + */ + protected function _where($key, $value = NULL, $type = 'AND ', $escape = NULL) + { + if ( ! is_array($key)) + { + $key = array($key => $value); + } + + // If the escape value was not set will will base it on the global setting + if ( ! is_bool($escape)) + { + $escape = $this->_protect_identifiers; + } + + foreach ($key as $k => $v) + { + $prefix = (count($this->ar_where) == 0 AND count($this->ar_cache_where) == 0) ? '' : $type; + + if (is_null($v) && ! $this->_has_operator($k)) + { + // value appears not to have been set, assign the test to IS NULL + $k .= ' IS NULL'; + } + + if ( ! is_null($v)) + { + if ($escape === TRUE) + { + $k = $this->_protect_identifiers($k, FALSE, $escape); + + $v = ' '.$this->escape($v); + } + + if ( ! $this->_has_operator($k)) + { + $k .= ' = '; + } + } + else + { + $k = $this->_protect_identifiers($k, FALSE, $escape); + } + + $this->ar_where[] = $prefix.$k.$v; + + if ($this->ar_caching === TRUE) + { + $this->ar_cache_where[] = $prefix.$k.$v; + $this->ar_cache_exists[] = 'where'; + } + + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Where_in + * + * Generates a WHERE field IN ('item', 'item') SQL query joined with + * AND if appropriate + * + * @param string The field to search + * @param array The values searched on + * @return object + */ + public function where_in($key = NULL, $values = NULL) + { + return $this->_where_in($key, $values); + } + + // -------------------------------------------------------------------- + + /** + * Where_in_or + * + * Generates a WHERE field IN ('item', 'item') SQL query joined with + * OR if appropriate + * + * @param string The field to search + * @param array The values searched on + * @return object + */ + public function or_where_in($key = NULL, $values = NULL) + { + return $this->_where_in($key, $values, FALSE, 'OR '); + } + + // -------------------------------------------------------------------- + + /** + * Where_not_in + * + * Generates a WHERE field NOT IN ('item', 'item') SQL query joined + * with AND if appropriate + * + * @param string The field to search + * @param array The values searched on + * @return object + */ + public function where_not_in($key = NULL, $values = NULL) + { + return $this->_where_in($key, $values, TRUE); + } + + // -------------------------------------------------------------------- + + /** + * Where_not_in_or + * + * Generates a WHERE field NOT IN ('item', 'item') SQL query joined + * with OR if appropriate + * + * @param string The field to search + * @param array The values searched on + * @return object + */ + public function or_where_not_in($key = NULL, $values = NULL) + { + return $this->_where_in($key, $values, TRUE, 'OR '); + } + + // -------------------------------------------------------------------- + + /** + * Where_in + * + * Called by where_in, where_in_or, where_not_in, where_not_in_or + * + * @param string The field to search + * @param array The values searched on + * @param boolean If the statement would be IN or NOT IN + * @param string + * @return object + */ + protected function _where_in($key = NULL, $values = NULL, $not = FALSE, $type = 'AND ') + { + if ($key === NULL OR $values === NULL) + { + return; + } + + if ( ! is_array($values)) + { + $values = array($values); + } + + $not = ($not) ? ' NOT' : ''; + + foreach ($values as $value) + { + $this->ar_wherein[] = $this->escape($value); + } + + $prefix = (count($this->ar_where) == 0) ? '' : $type; + + $where_in = $prefix . $this->_protect_identifiers($key) . $not . " IN (" . implode(", ", $this->ar_wherein) . ") "; + + $this->ar_where[] = $where_in; + if ($this->ar_caching === TRUE) + { + $this->ar_cache_where[] = $where_in; + $this->ar_cache_exists[] = 'where'; + } + + // reset the array for multiple calls + $this->ar_wherein = array(); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Like + * + * Generates a %LIKE% portion of the query. Separates + * multiple calls with AND + * + * @param mixed + * @param mixed + * @return object + */ + public function like($field, $match = '', $side = 'both') + { + return $this->_like($field, $match, 'AND ', $side); + } + + // -------------------------------------------------------------------- + + /** + * Not Like + * + * Generates a NOT LIKE portion of the query. Separates + * multiple calls with AND + * + * @param mixed + * @param mixed + * @return object + */ + public function not_like($field, $match = '', $side = 'both') + { + return $this->_like($field, $match, 'AND ', $side, 'NOT'); + } + + // -------------------------------------------------------------------- + + /** + * OR Like + * + * Generates a %LIKE% portion of the query. Separates + * multiple calls with OR + * + * @param mixed + * @param mixed + * @return object + */ + public function or_like($field, $match = '', $side = 'both') + { + return $this->_like($field, $match, 'OR ', $side); + } + + // -------------------------------------------------------------------- + + /** + * OR Not Like + * + * Generates a NOT LIKE portion of the query. Separates + * multiple calls with OR + * + * @param mixed + * @param mixed + * @return object + */ + public function or_not_like($field, $match = '', $side = 'both') + { + return $this->_like($field, $match, 'OR ', $side, 'NOT'); + } + + // -------------------------------------------------------------------- + + /** + * Like + * + * Called by like() or orlike() + * + * @param mixed + * @param mixed + * @param string + * @return object + */ + protected function _like($field, $match = '', $type = 'AND ', $side = 'both', $not = '') + { + if ( ! is_array($field)) + { + $field = array($field => $match); + } + + foreach ($field as $k => $v) + { + $k = $this->_protect_identifiers($k); + + $prefix = (count($this->ar_like) == 0) ? '' : $type; + + $v = $this->escape_like_str($v); + + if ($side == 'none') + { + $like_statement = $prefix." $k $not LIKE '{$v}'"; + } + elseif ($side == 'before') + { + $like_statement = $prefix." $k $not LIKE '%{$v}'"; + } + elseif ($side == 'after') + { + $like_statement = $prefix." $k $not LIKE '{$v}%'"; + } + else + { + $like_statement = $prefix." $k $not LIKE '%{$v}%'"; + } + + // some platforms require an escape sequence definition for LIKE wildcards + if ($this->_like_escape_str != '') + { + $like_statement = $like_statement.sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + $this->ar_like[] = $like_statement; + if ($this->ar_caching === TRUE) + { + $this->ar_cache_like[] = $like_statement; + $this->ar_cache_exists[] = 'like'; + } + + } + return $this; + } + + // -------------------------------------------------------------------- + + /** + * GROUP BY + * + * @param string + * @return object + */ + public function group_by($by) + { + if (is_string($by)) + { + $by = explode(',', $by); + } + + foreach ($by as $val) + { + $val = trim($val); + + if ($val != '') + { + $this->ar_groupby[] = $this->_protect_identifiers($val); + + if ($this->ar_caching === TRUE) + { + $this->ar_cache_groupby[] = $this->_protect_identifiers($val); + $this->ar_cache_exists[] = 'groupby'; + } + } + } + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Sets the HAVING value + * + * Separates multiple calls with AND + * + * @param string + * @param string + * @return object + */ + public function having($key, $value = '', $escape = TRUE) + { + return $this->_having($key, $value, 'AND ', $escape); + } + + // -------------------------------------------------------------------- + + /** + * Sets the OR HAVING value + * + * Separates multiple calls with OR + * + * @param string + * @param string + * @return object + */ + public function or_having($key, $value = '', $escape = TRUE) + { + return $this->_having($key, $value, 'OR ', $escape); + } + + // -------------------------------------------------------------------- + + /** + * Sets the HAVING values + * + * Called by having() or or_having() + * + * @param string + * @param string + * @return object + */ + protected function _having($key, $value = '', $type = 'AND ', $escape = TRUE) + { + if ( ! is_array($key)) + { + $key = array($key => $value); + } + + foreach ($key as $k => $v) + { + $prefix = (count($this->ar_having) == 0) ? '' : $type; + + if ($escape === TRUE) + { + $k = $this->_protect_identifiers($k); + } + + if ( ! $this->_has_operator($k)) + { + $k .= ' = '; + } + + if ($v != '') + { + $v = ' '.$this->escape($v); + } + + $this->ar_having[] = $prefix.$k.$v; + if ($this->ar_caching === TRUE) + { + $this->ar_cache_having[] = $prefix.$k.$v; + $this->ar_cache_exists[] = 'having'; + } + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Sets the ORDER BY value + * + * @param string + * @param string direction: asc or desc + * @return object + */ + public function order_by($orderby, $direction = '') + { + if (strtolower($direction) == 'random') + { + $orderby = ''; // Random results want or don't need a field name + $direction = $this->_random_keyword; + } + elseif (trim($direction) != '') + { + $direction = (in_array(strtoupper(trim($direction)), array('ASC', 'DESC'), TRUE)) ? ' '.$direction : ' ASC'; + } + + + if (strpos($orderby, ',') !== FALSE) + { + $temp = array(); + foreach (explode(',', $orderby) as $part) + { + $part = trim($part); + if ( ! in_array($part, $this->ar_aliased_tables)) + { + $part = $this->_protect_identifiers(trim($part)); + } + + $temp[] = $part; + } + + $orderby = implode(', ', $temp); + } + else if ($direction != $this->_random_keyword) + { + $orderby = $this->_protect_identifiers($orderby); + } + + $orderby_statement = $orderby.$direction; + + $this->ar_orderby[] = $orderby_statement; + if ($this->ar_caching === TRUE) + { + $this->ar_cache_orderby[] = $orderby_statement; + $this->ar_cache_exists[] = 'orderby'; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Sets the LIMIT value + * + * @param integer the limit value + * @param integer the offset value + * @return object + */ + public function limit($value, $offset = '') + { + $this->ar_limit = (int) $value; + + if ($offset != '') + { + $this->ar_offset = (int) $offset; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Sets the OFFSET value + * + * @param integer the offset value + * @return object + */ + public function offset($offset) + { + $this->ar_offset = (int) $offset; + return $this; + } + + // -------------------------------------------------------------------- + + /** + * The "set" function. Allows key/value pairs to be set for inserting or updating + * + * @param mixed + * @param string + * @param boolean + * @return object + */ + public function set($key, $value = '', $escape = TRUE) + { + $key = $this->_object_to_array($key); + + if ( ! is_array($key)) + { + $key = array($key => $value); + } + + foreach ($key as $k => $v) + { + if ($escape === FALSE) + { + $this->ar_set[$this->_protect_identifiers($k)] = $v; + } + else + { + $this->ar_set[$this->_protect_identifiers($k, FALSE, TRUE)] = $this->escape($v); + } + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Get + * + * Compiles the select statement based on the other functions called + * and runs the query + * + * @param string the table + * @param string the limit clause + * @param string the offset clause + * @return object + */ + public function get($table = '', $limit = null, $offset = null) + { + if ($table != '') + { + $this->_track_aliases($table); + $this->from($table); + } + + if ( ! is_null($limit)) + { + $this->limit($limit, $offset); + } + + $sql = $this->_compile_select(); + + $result = $this->query($sql); + $this->_reset_select(); + return $result; + } + + /** + * "Count All Results" query + * + * Generates a platform-specific query string that counts all records + * returned by an Active Record query. + * + * @param string + * @return string + */ + public function count_all_results($table = '') + { + if ($table != '') + { + $this->_track_aliases($table); + $this->from($table); + } + + $sql = $this->_compile_select($this->_count_string . $this->_protect_identifiers('numrows')); + + $query = $this->query($sql); + $this->_reset_select(); + + if ($query->num_rows() == 0) + { + return 0; + } + + $row = $query->row(); + return (int) $row->numrows; + } + + // -------------------------------------------------------------------- + + /** + * Get_Where + * + * Allows the where clause, limit and offset to be added directly + * + * @param string the where clause + * @param string the limit clause + * @param string the offset clause + * @return object + */ + public function get_where($table = '', $where = null, $limit = null, $offset = null) + { + if ($table != '') + { + $this->from($table); + } + + if ( ! is_null($where)) + { + $this->where($where); + } + + if ( ! is_null($limit)) + { + $this->limit($limit, $offset); + } + + $sql = $this->_compile_select(); + + $result = $this->query($sql); + $this->_reset_select(); + return $result; + } + + // -------------------------------------------------------------------- + + /** + * Insert_Batch + * + * Compiles batch insert strings and runs the queries + * + * @param string the table to retrieve the results from + * @param array an associative array of insert values + * @return object + */ + public function insert_batch($table = '', $set = NULL) + { + if ( ! is_null($set)) + { + $this->set_insert_batch($set); + } + + if (count($this->ar_set) == 0) + { + if ($this->db_debug) + { + //No valid data array. Folds in cases where keys and values did not match up + return $this->display_error('db_must_use_set'); + } + return FALSE; + } + + if ($table == '') + { + if ( ! isset($this->ar_from[0])) + { + if ($this->db_debug) + { + return $this->display_error('db_must_set_table'); + } + return FALSE; + } + + $table = $this->ar_from[0]; + } + + // Batch this baby + for ($i = 0, $total = count($this->ar_set); $i < $total; $i = $i + 100) + { + + $sql = $this->_insert_batch($this->_protect_identifiers($table, TRUE, NULL, FALSE), $this->ar_keys, array_slice($this->ar_set, $i, 100)); + + //echo $sql; + + $this->query($sql); + } + + $this->_reset_write(); + + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * The "set_insert_batch" function. Allows key/value pairs to be set for batch inserts + * + * @param mixed + * @param string + * @param boolean + * @return object + */ + public function set_insert_batch($key, $value = '', $escape = TRUE) + { + $key = $this->_object_to_array_batch($key); + + if ( ! is_array($key)) + { + $key = array($key => $value); + } + + $keys = array_keys(current($key)); + sort($keys); + + foreach ($key as $row) + { + if (count(array_diff($keys, array_keys($row))) > 0 OR count(array_diff(array_keys($row), $keys)) > 0) + { + // batch function above returns an error on an empty array + $this->ar_set[] = array(); + return; + } + + ksort($row); // puts $row in the same order as our keys + + if ($escape === FALSE) + { + $this->ar_set[] = '('.implode(',', $row).')'; + } + else + { + $clean = array(); + + foreach ($row as $value) + { + $clean[] = $this->escape($value); + } + + $this->ar_set[] = '('.implode(',', $clean).')'; + } + } + + foreach ($keys as $k) + { + $this->ar_keys[] = $this->_protect_identifiers($k); + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Insert + * + * Compiles an insert string and runs the query + * + * @param string the table to insert data into + * @param array an associative array of insert values + * @return object + */ + function insert($table = '', $set = NULL) + { + if ( ! is_null($set)) + { + $this->set($set); + } + + if (count($this->ar_set) == 0) + { + if ($this->db_debug) + { + return $this->display_error('db_must_use_set'); + } + return FALSE; + } + + if ($table == '') + { + if ( ! isset($this->ar_from[0])) + { + if ($this->db_debug) + { + return $this->display_error('db_must_set_table'); + } + return FALSE; + } + + $table = $this->ar_from[0]; + } + + $sql = $this->_insert($this->_protect_identifiers($table, TRUE, NULL, FALSE), array_keys($this->ar_set), array_values($this->ar_set)); + + $this->_reset_write(); + return $this->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Replace + * + * Compiles an replace into string and runs the query + * + * @param string the table to replace data into + * @param array an associative array of insert values + * @return object + */ + public function replace($table = '', $set = NULL) + { + if ( ! is_null($set)) + { + $this->set($set); + } + + if (count($this->ar_set) == 0) + { + if ($this->db_debug) + { + return $this->display_error('db_must_use_set'); + } + return FALSE; + } + + if ($table == '') + { + if ( ! isset($this->ar_from[0])) + { + if ($this->db_debug) + { + return $this->display_error('db_must_set_table'); + } + return FALSE; + } + + $table = $this->ar_from[0]; + } + + $sql = $this->_replace($this->_protect_identifiers($table, TRUE, NULL, FALSE), array_keys($this->ar_set), array_values($this->ar_set)); + + $this->_reset_write(); + return $this->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Update + * + * Compiles an update string and runs the query + * + * @param string the table to retrieve the results from + * @param array an associative array of update values + * @param mixed the where clause + * @return object + */ + public function update($table = '', $set = NULL, $where = NULL, $limit = NULL) + { + // Combine any cached components with the current statements + $this->_merge_cache(); + + if ( ! is_null($set)) + { + $this->set($set); + } + + if (count($this->ar_set) == 0) + { + if ($this->db_debug) + { + return $this->display_error('db_must_use_set'); + } + return FALSE; + } + + if ($table == '') + { + if ( ! isset($this->ar_from[0])) + { + if ($this->db_debug) + { + return $this->display_error('db_must_set_table'); + } + return FALSE; + } + + $table = $this->ar_from[0]; + } + + if ($where != NULL) + { + $this->where($where); + } + + if ($limit != NULL) + { + $this->limit($limit); + } + + $sql = $this->_update($this->_protect_identifiers($table, TRUE, NULL, FALSE), $this->ar_set, $this->ar_where, $this->ar_orderby, $this->ar_limit); + + $this->_reset_write(); + return $this->query($sql); + } + + + // -------------------------------------------------------------------- + + /** + * Update_Batch + * + * Compiles an update string and runs the query + * + * @param string the table to retrieve the results from + * @param array an associative array of update values + * @param string the where key + * @return object + */ + public function update_batch($table = '', $set = NULL, $index = NULL) + { + // Combine any cached components with the current statements + $this->_merge_cache(); + + if (is_null($index)) + { + if ($this->db_debug) + { + return $this->display_error('db_must_use_index'); + } + + return FALSE; + } + + if ( ! is_null($set)) + { + $this->set_update_batch($set, $index); + } + + if (count($this->ar_set) == 0) + { + if ($this->db_debug) + { + return $this->display_error('db_must_use_set'); + } + + return FALSE; + } + + if ($table == '') + { + if ( ! isset($this->ar_from[0])) + { + if ($this->db_debug) + { + return $this->display_error('db_must_set_table'); + } + return FALSE; + } + + $table = $this->ar_from[0]; + } + + // Batch this baby + for ($i = 0, $total = count($this->ar_set); $i < $total; $i = $i + 100) + { + $sql = $this->_update_batch($this->_protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->ar_set, $i, 100), $this->_protect_identifiers($index), $this->ar_where); + + $this->query($sql); + } + + $this->_reset_write(); + } + + // -------------------------------------------------------------------- + + /** + * The "set_update_batch" function. Allows key/value pairs to be set for batch updating + * + * @param array + * @param string + * @param boolean + * @return object + */ + public function set_update_batch($key, $index = '', $escape = TRUE) + { + $key = $this->_object_to_array_batch($key); + + if ( ! is_array($key)) + { + // @todo error + } + + foreach ($key as $k => $v) + { + $index_set = FALSE; + $clean = array(); + + foreach ($v as $k2 => $v2) + { + if ($k2 == $index) + { + $index_set = TRUE; + } + else + { + $not[] = $k2.'-'.$v2; + } + + if ($escape === FALSE) + { + $clean[$this->_protect_identifiers($k2)] = $v2; + } + else + { + $clean[$this->_protect_identifiers($k2)] = $this->escape($v2); + } + } + + if ($index_set == FALSE) + { + return $this->display_error('db_batch_missing_index'); + } + + $this->ar_set[] = $clean; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Empty Table + * + * Compiles a delete string and runs "DELETE FROM table" + * + * @param string the table to empty + * @return object + */ + public function empty_table($table = '') + { + if ($table == '') + { + if ( ! isset($this->ar_from[0])) + { + if ($this->db_debug) + { + return $this->display_error('db_must_set_table'); + } + return FALSE; + } + + $table = $this->ar_from[0]; + } + else + { + $table = $this->_protect_identifiers($table, TRUE, NULL, FALSE); + } + + $sql = $this->_delete($table); + + $this->_reset_write(); + + return $this->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Truncate + * + * Compiles a truncate string and runs the query + * If the database does not support the truncate() command + * This function maps to "DELETE FROM table" + * + * @param string the table to truncate + * @return object + */ + public function truncate($table = '') + { + if ($table == '') + { + if ( ! isset($this->ar_from[0])) + { + if ($this->db_debug) + { + return $this->display_error('db_must_set_table'); + } + return FALSE; + } + + $table = $this->ar_from[0]; + } + else + { + $table = $this->_protect_identifiers($table, TRUE, NULL, FALSE); + } + + $sql = $this->_truncate($table); + + $this->_reset_write(); + + return $this->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Delete + * + * Compiles a delete string and runs the query + * + * @param mixed the table(s) to delete from. String or array + * @param mixed the where clause + * @param mixed the limit clause + * @param boolean + * @return object + */ + public function delete($table = '', $where = '', $limit = NULL, $reset_data = TRUE) + { + // Combine any cached components with the current statements + $this->_merge_cache(); + + if ($table == '') + { + if ( ! isset($this->ar_from[0])) + { + if ($this->db_debug) + { + return $this->display_error('db_must_set_table'); + } + return FALSE; + } + + $table = $this->ar_from[0]; + } + elseif (is_array($table)) + { + foreach ($table as $single_table) + { + $this->delete($single_table, $where, $limit, FALSE); + } + + $this->_reset_write(); + return; + } + else + { + $table = $this->_protect_identifiers($table, TRUE, NULL, FALSE); + } + + if ($where != '') + { + $this->where($where); + } + + if ($limit != NULL) + { + $this->limit($limit); + } + + if (count($this->ar_where) == 0 && count($this->ar_wherein) == 0 && count($this->ar_like) == 0) + { + if ($this->db_debug) + { + return $this->display_error('db_del_must_use_where'); + } + + return FALSE; + } + + $sql = $this->_delete($table, $this->ar_where, $this->ar_like, $this->ar_limit); + + if ($reset_data) + { + $this->_reset_write(); + } + + return $this->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * DB Prefix + * + * Prepends a database prefix if one exists in configuration + * + * @param string the table + * @return string + */ + public function dbprefix($table = '') + { + if ($table == '') + { + $this->display_error('db_table_name_required'); + } + + return $this->dbprefix.$table; + } + + // -------------------------------------------------------------------- + + /** + * Set DB Prefix + * + * Set's the DB Prefix to something new without needing to reconnect + * + * @param string the prefix + * @return string + */ + public function set_dbprefix($prefix = '') + { + return $this->dbprefix = $prefix; + } + + // -------------------------------------------------------------------- + + /** + * Track Aliases + * + * Used to track SQL statements written with aliased tables. + * + * @param string The table to inspect + * @return string + */ + protected function _track_aliases($table) + { + if (is_array($table)) + { + foreach ($table as $t) + { + $this->_track_aliases($t); + } + return; + } + + // Does the string contain a comma? If so, we need to separate + // the string into discreet statements + if (strpos($table, ',') !== FALSE) + { + return $this->_track_aliases(explode(',', $table)); + } + + // if a table alias is used we can recognize it by a space + if (strpos($table, " ") !== FALSE) + { + // if the alias is written with the AS keyword, remove it + $table = preg_replace('/\s+AS\s+/i', ' ', $table); + + // Grab the alias + $table = trim(strrchr($table, " ")); + + // Store the alias, if it doesn't already exist + if ( ! in_array($table, $this->ar_aliased_tables)) + { + $this->ar_aliased_tables[] = $table; + } + } + } + + // -------------------------------------------------------------------- + + /** + * Compile the SELECT statement + * + * Generates a query string based on which functions were used. + * Should not be called directly. The get() function calls it. + * + * @return string + */ + protected function _compile_select($select_override = FALSE) + { + // Combine any cached components with the current statements + $this->_merge_cache(); + + // ---------------------------------------------------------------- + + // Write the "select" portion of the query + + if ($select_override !== FALSE) + { + $sql = $select_override; + } + else + { + $sql = ( ! $this->ar_distinct) ? 'SELECT ' : 'SELECT DISTINCT '; + + if (count($this->ar_select) == 0) + { + $sql .= '*'; + } + else + { + // Cycle through the "select" portion of the query and prep each column name. + // The reason we protect identifiers here rather then in the select() function + // is because until the user calls the from() function we don't know if there are aliases + foreach ($this->ar_select as $key => $val) + { + $no_escape = isset($this->ar_no_escape[$key]) ? $this->ar_no_escape[$key] : NULL; + $this->ar_select[$key] = $this->_protect_identifiers($val, FALSE, $no_escape); + } + + $sql .= implode(', ', $this->ar_select); + } + } + + // ---------------------------------------------------------------- + + // Write the "FROM" portion of the query + + if (count($this->ar_from) > 0) + { + $sql .= "\nFROM "; + + $sql .= $this->_from_tables($this->ar_from); + } + + // ---------------------------------------------------------------- + + // Write the "JOIN" portion of the query + + if (count($this->ar_join) > 0) + { + $sql .= "\n"; + + $sql .= implode("\n", $this->ar_join); + } + + // ---------------------------------------------------------------- + + // Write the "WHERE" portion of the query + + if (count($this->ar_where) > 0 OR count($this->ar_like) > 0) + { + $sql .= "\nWHERE "; + } + + $sql .= implode("\n", $this->ar_where); + + // ---------------------------------------------------------------- + + // Write the "LIKE" portion of the query + + if (count($this->ar_like) > 0) + { + if (count($this->ar_where) > 0) + { + $sql .= "\nAND "; + } + + $sql .= implode("\n", $this->ar_like); + } + + // ---------------------------------------------------------------- + + // Write the "GROUP BY" portion of the query + + if (count($this->ar_groupby) > 0) + { + $sql .= "\nGROUP BY "; + + $sql .= implode(', ', $this->ar_groupby); + } + + // ---------------------------------------------------------------- + + // Write the "HAVING" portion of the query + + if (count($this->ar_having) > 0) + { + $sql .= "\nHAVING "; + $sql .= implode("\n", $this->ar_having); + } + + // ---------------------------------------------------------------- + + // Write the "ORDER BY" portion of the query + + if (count($this->ar_orderby) > 0) + { + $sql .= "\nORDER BY "; + $sql .= implode(', ', $this->ar_orderby); + + if ($this->ar_order !== FALSE) + { + $sql .= ($this->ar_order == 'desc') ? ' DESC' : ' ASC'; + } + } + + // ---------------------------------------------------------------- + + // Write the "LIMIT" portion of the query + + if (is_numeric($this->ar_limit)) + { + $sql .= "\n"; + $sql = $this->_limit($sql, $this->ar_limit, $this->ar_offset); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Object to Array + * + * Takes an object as input and converts the class variables to array key/vals + * + * @param object + * @return array + */ + public function _object_to_array($object) + { + if ( ! is_object($object)) + { + return $object; + } + + $array = array(); + foreach (get_object_vars($object) as $key => $val) + { + // There are some built in keys we need to ignore for this conversion + if ( ! is_object($val) && ! is_array($val) && $key != '_parent_name') + { + $array[$key] = $val; + } + } + + return $array; + } + + // -------------------------------------------------------------------- + + /** + * Object to Array + * + * Takes an object as input and converts the class variables to array key/vals + * + * @param object + * @return array + */ + public function _object_to_array_batch($object) + { + if ( ! is_object($object)) + { + return $object; + } + + $array = array(); + $out = get_object_vars($object); + $fields = array_keys($out); + + foreach ($fields as $val) + { + // There are some built in keys we need to ignore for this conversion + if ($val != '_parent_name') + { + + $i = 0; + foreach ($out[$val] as $data) + { + $array[$i][$val] = $data; + $i++; + } + } + } + + return $array; + } + + // -------------------------------------------------------------------- + + /** + * Start Cache + * + * Starts AR caching + * + * @return void + */ + public function start_cache() + { + $this->ar_caching = TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Stop Cache + * + * Stops AR caching + * + * @return void + */ + public function stop_cache() + { + $this->ar_caching = FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Flush Cache + * + * Empties the AR cache + * + * @access public + * @return void + */ + public function flush_cache() + { + $this->_reset_run(array( + 'ar_cache_select' => array(), + 'ar_cache_from' => array(), + 'ar_cache_join' => array(), + 'ar_cache_where' => array(), + 'ar_cache_like' => array(), + 'ar_cache_groupby' => array(), + 'ar_cache_having' => array(), + 'ar_cache_orderby' => array(), + 'ar_cache_set' => array(), + 'ar_cache_exists' => array(), + 'ar_cache_no_escape' => array() + )); + } + + // -------------------------------------------------------------------- + + /** + * Merge Cache + * + * When called, this function merges any cached AR arrays with + * locally called ones. + * + * @return void + */ + protected function _merge_cache() + { + if (count($this->ar_cache_exists) == 0) + { + return; + } + + foreach ($this->ar_cache_exists as $val) + { + $ar_variable = 'ar_'.$val; + $ar_cache_var = 'ar_cache_'.$val; + + if (count($this->$ar_cache_var) == 0) + { + continue; + } + + $this->$ar_variable = array_unique(array_merge($this->$ar_cache_var, $this->$ar_variable)); + } + + // If we are "protecting identifiers" we need to examine the "from" + // portion of the query to determine if there are any aliases + if ($this->_protect_identifiers === TRUE AND count($this->ar_cache_from) > 0) + { + $this->_track_aliases($this->ar_from); + } + + $this->ar_no_escape = $this->ar_cache_no_escape; + } + + // -------------------------------------------------------------------- + + /** + * Resets the active record values. Called by the get() function + * + * @param array An array of fields to reset + * @return void + */ + protected function _reset_run($ar_reset_items) + { + foreach ($ar_reset_items as $item => $default_value) + { + if ( ! in_array($item, $this->ar_store_array)) + { + $this->$item = $default_value; + } + } + } + + // -------------------------------------------------------------------- + + /** + * Resets the active record values. Called by the get() function + * + * @return void + */ + protected function _reset_select() + { + $ar_reset_items = array( + 'ar_select' => array(), + 'ar_from' => array(), + 'ar_join' => array(), + 'ar_where' => array(), + 'ar_like' => array(), + 'ar_groupby' => array(), + 'ar_having' => array(), + 'ar_orderby' => array(), + 'ar_wherein' => array(), + 'ar_aliased_tables' => array(), + 'ar_no_escape' => array(), + 'ar_distinct' => FALSE, + 'ar_limit' => FALSE, + 'ar_offset' => FALSE, + 'ar_order' => FALSE, + ); + + $this->_reset_run($ar_reset_items); + } + + // -------------------------------------------------------------------- + + /** + * Resets the active record "write" values. + * + * Called by the insert() update() insert_batch() update_batch() and delete() functions + * + * @return void + */ + protected function _reset_write() + { + $ar_reset_items = array( + 'ar_set' => array(), + 'ar_from' => array(), + 'ar_where' => array(), + 'ar_like' => array(), + 'ar_orderby' => array(), + 'ar_keys' => array(), + 'ar_limit' => FALSE, + 'ar_order' => FALSE + ); + + $this->_reset_run($ar_reset_items); + } +} + +/* End of file DB_active_rec.php */ +/* Location: ./system/database/DB_active_rec.php */ \ No newline at end of file diff --git a/system/database/DB_cache.php b/system/database/DB_cache.php new file mode 100644 index 0000000..4551c1e --- /dev/null +++ b/system/database/DB_cache.php @@ -0,0 +1,196 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Database Cache Class + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_Cache { + + var $CI; + var $db; // allows passing of db object so that multiple database connections and returned db objects can be supported + + /** + * Constructor + * + * Grabs the CI super object instance so we can access it. + * + */ + function __construct(&$db) + { + // Assign the main CI object to $this->CI + // and load the file helper since we use it a lot + $this->CI =& get_instance(); + $this->db =& $db; + $this->CI->load->helper('file'); + } + + // -------------------------------------------------------------------- + + /** + * Set Cache Directory Path + * + * @access public + * @param string the path to the cache directory + * @return bool + */ + function check_path($path = '') + { + if ($path == '') + { + if ($this->db->cachedir == '') + { + return $this->db->cache_off(); + } + + $path = $this->db->cachedir; + } + + // Add a trailing slash to the path if needed + $path = preg_replace("/(.+?)\/*$/", "\\1/", $path); + + if ( ! is_dir($path) OR ! is_really_writable($path)) + { + // If the path is wrong we'll turn off caching + return $this->db->cache_off(); + } + + $this->db->cachedir = $path; + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Retrieve a cached query + * + * The URI being requested will become the name of the cache sub-folder. + * An MD5 hash of the SQL statement will become the cache file name + * + * @access public + * @return string + */ + function read($sql) + { + if ( ! $this->check_path()) + { + return $this->db->cache_off(); + } + + $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); + + $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); + + $filepath = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'.md5($sql); + + if (FALSE === ($cachedata = read_file($filepath))) + { + return FALSE; + } + + return unserialize($cachedata); + } + + // -------------------------------------------------------------------- + + /** + * Write a query to a cache file + * + * @access public + * @return bool + */ + function write($sql, $object) + { + if ( ! $this->check_path()) + { + return $this->db->cache_off(); + } + + $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); + + $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); + + $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'; + + $filename = md5($sql); + + if ( ! @is_dir($dir_path)) + { + if ( ! @mkdir($dir_path, DIR_WRITE_MODE)) + { + return FALSE; + } + + @chmod($dir_path, DIR_WRITE_MODE); + } + + if (write_file($dir_path.$filename, serialize($object)) === FALSE) + { + return FALSE; + } + + @chmod($dir_path.$filename, FILE_WRITE_MODE); + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Delete cache files within a particular directory + * + * @access public + * @return bool + */ + function delete($segment_one = '', $segment_two = '') + { + if ($segment_one == '') + { + $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1); + } + + if ($segment_two == '') + { + $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2); + } + + $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'; + + delete_files($dir_path, TRUE); + } + + // -------------------------------------------------------------------- + + /** + * Delete all existing cache files + * + * @access public + * @return bool + */ + function delete_all() + { + delete_files($this->db->cachedir, TRUE); + } + +} + + +/* End of file DB_cache.php */ +/* Location: ./system/database/DB_cache.php */ \ No newline at end of file diff --git a/system/database/DB_driver.php b/system/database/DB_driver.php new file mode 100644 index 0000000..b6c1e34 --- /dev/null +++ b/system/database/DB_driver.php @@ -0,0 +1,1411 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Database Driver Class + * + * This is the platform-independent base DB implementation class. + * This class will not be called directly. Rather, the adapter + * class for the specific database will extend and instantiate it. + * + * @package CodeIgniter + * @subpackage Drivers + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_driver { + + var $username; + var $password; + var $hostname; + var $database; + var $dbdriver = 'mysql'; + var $dbprefix = ''; + var $char_set = 'utf8'; + var $dbcollat = 'utf8_general_ci'; + var $autoinit = TRUE; // Whether to automatically initialize the DB + var $swap_pre = ''; + var $port = ''; + var $pconnect = FALSE; + var $conn_id = FALSE; + var $result_id = FALSE; + var $db_debug = FALSE; + var $benchmark = 0; + var $query_count = 0; + var $bind_marker = '?'; + var $save_queries = TRUE; + var $queries = array(); + var $query_times = array(); + var $data_cache = array(); + var $trans_enabled = TRUE; + var $trans_strict = TRUE; + var $_trans_depth = 0; + var $_trans_status = TRUE; // Used with transactions to determine if a rollback should occur + var $cache_on = FALSE; + var $cachedir = ''; + var $cache_autodel = FALSE; + var $CACHE; // The cache class object + + // Private variables + var $_protect_identifiers = TRUE; + var $_reserved_identifiers = array('*'); // Identifiers that should NOT be escaped + + // These are use with Oracle + var $stmt_id; + var $curs_id; + var $limit_used; + + + + /** + * Constructor. Accepts one parameter containing the database + * connection settings. + * + * @param array + */ + function __construct($params) + { + if (is_array($params)) + { + foreach ($params as $key => $val) + { + $this->$key = $val; + } + } + + log_message('debug', 'Database Driver Class Initialized'); + } + + // -------------------------------------------------------------------- + + /** + * Initialize Database Settings + * + * @access private Called by the constructor + * @param mixed + * @return void + */ + function initialize() + { + // If an existing connection resource is available + // there is no need to connect and select the database + if (is_resource($this->conn_id) OR is_object($this->conn_id)) + { + return TRUE; + } + + // ---------------------------------------------------------------- + + // Connect to the database and set the connection ID + $this->conn_id = ($this->pconnect == FALSE) ? $this->db_connect() : $this->db_pconnect(); + + // No connection resource? Throw an error + if ( ! $this->conn_id) + { + log_message('error', 'Unable to connect to the database'); + + if ($this->db_debug) + { + $this->display_error('db_unable_to_connect'); + } + return FALSE; + } + + // ---------------------------------------------------------------- + + // Select the DB... assuming a database name is specified in the config file + if ($this->database != '') + { + if ( ! $this->db_select()) + { + log_message('error', 'Unable to select database: '.$this->database); + + if ($this->db_debug) + { + $this->display_error('db_unable_to_select', $this->database); + } + return FALSE; + } + else + { + // We've selected the DB. Now we set the character set + if ( ! $this->db_set_charset($this->char_set, $this->dbcollat)) + { + return FALSE; + } + + return TRUE; + } + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Set client character set + * + * @access public + * @param string + * @param string + * @return resource + */ + function db_set_charset($charset, $collation) + { + if ( ! $this->_db_set_charset($this->char_set, $this->dbcollat)) + { + log_message('error', 'Unable to set database connection charset: '.$this->char_set); + + if ($this->db_debug) + { + $this->display_error('db_unable_to_set_charset', $this->char_set); + } + + return FALSE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * The name of the platform in use (mysql, mssql, etc...) + * + * @access public + * @return string + */ + function platform() + { + return $this->dbdriver; + } + + // -------------------------------------------------------------------- + + /** + * Database Version Number. Returns a string containing the + * version of the database being used + * + * @access public + * @return string + */ + function version() + { + if (FALSE === ($sql = $this->_version())) + { + if ($this->db_debug) + { + return $this->display_error('db_unsupported_function'); + } + return FALSE; + } + + // Some DBs have functions that return the version, and don't run special + // SQL queries per se. In these instances, just return the result. + $driver_version_exceptions = array('oci8', 'sqlite', 'cubrid'); + + if (in_array($this->dbdriver, $driver_version_exceptions)) + { + return $sql; + } + else + { + $query = $this->query($sql); + return $query->row('ver'); + } + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * Accepts an SQL string as input and returns a result object upon + * successful execution of a "read" type query. Returns boolean TRUE + * upon successful execution of a "write" type query. Returns boolean + * FALSE upon failure, and if the $db_debug variable is set to TRUE + * will raise an error. + * + * @access public + * @param string An SQL query string + * @param array An array of binding data + * @return mixed + */ + function query($sql, $binds = FALSE, $return_object = TRUE) + { + if ($sql == '') + { + if ($this->db_debug) + { + log_message('error', 'Invalid query: '.$sql); + return $this->display_error('db_invalid_query'); + } + return FALSE; + } + + // Verify table prefix and replace if necessary + if ( ($this->dbprefix != '' AND $this->swap_pre != '') AND ($this->dbprefix != $this->swap_pre) ) + { + $sql = preg_replace("/(\W)".$this->swap_pre."(\S+?)/", "\\1".$this->dbprefix."\\2", $sql); + } + + // Compile binds if needed + if ($binds !== FALSE) + { + $sql = $this->compile_binds($sql, $binds); + } + + // Is query caching enabled? If the query is a "read type" + // we will load the caching class and return the previously + // cached query if it exists + if ($this->cache_on == TRUE AND stristr($sql, 'SELECT')) + { + if ($this->_cache_init()) + { + $this->load_rdriver(); + if (FALSE !== ($cache = $this->CACHE->read($sql))) + { + return $cache; + } + } + } + + // Save the query for debugging + if ($this->save_queries == TRUE) + { + $this->queries[] = $sql; + } + + // Start the Query Timer + $time_start = list($sm, $ss) = explode(' ', microtime()); + + // Run the Query + if (FALSE === ($this->result_id = $this->simple_query($sql))) + { + if ($this->save_queries == TRUE) + { + $this->query_times[] = 0; + } + + // This will trigger a rollback if transactions are being used + $this->_trans_status = FALSE; + + if ($this->db_debug) + { + // grab the error number and message now, as we might run some + // additional queries before displaying the error + $error_no = $this->_error_number(); + $error_msg = $this->_error_message(); + + // We call this function in order to roll-back queries + // if transactions are enabled. If we don't call this here + // the error message will trigger an exit, causing the + // transactions to remain in limbo. + $this->trans_complete(); + + // Log and display errors + log_message('error', 'Query error: '.$error_msg); + return $this->display_error( + array( + 'Error Number: '.$error_no, + $error_msg, + $sql + ) + ); + } + + return FALSE; + } + + // Stop and aggregate the query time results + $time_end = list($em, $es) = explode(' ', microtime()); + $this->benchmark += ($em + $es) - ($sm + $ss); + + if ($this->save_queries == TRUE) + { + $this->query_times[] = ($em + $es) - ($sm + $ss); + } + + // Increment the query counter + $this->query_count++; + + // Was the query a "write" type? + // If so we'll simply return true + if ($this->is_write_type($sql) === TRUE) + { + // If caching is enabled we'll auto-cleanup any + // existing files related to this particular URI + if ($this->cache_on == TRUE AND $this->cache_autodel == TRUE AND $this->_cache_init()) + { + $this->CACHE->delete(); + } + + return TRUE; + } + + // Return TRUE if we don't need to create a result object + // Currently only the Oracle driver uses this when stored + // procedures are used + if ($return_object !== TRUE) + { + return TRUE; + } + + // Load and instantiate the result driver + + $driver = $this->load_rdriver(); + $RES = new $driver(); + $RES->conn_id = $this->conn_id; + $RES->result_id = $this->result_id; + + if ($this->dbdriver == 'oci8') + { + $RES->stmt_id = $this->stmt_id; + $RES->curs_id = NULL; + $RES->limit_used = $this->limit_used; + $this->stmt_id = FALSE; + } + + // oci8 vars must be set before calling this + $RES->num_rows = $RES->num_rows(); + + // Is query caching enabled? If so, we'll serialize the + // result object and save it to a cache file. + if ($this->cache_on == TRUE AND $this->_cache_init()) + { + // We'll create a new instance of the result object + // only without the platform specific driver since + // we can't use it with cached data (the query result + // resource ID won't be any good once we've cached the + // result object, so we'll have to compile the data + // and save it) + $CR = new CI_DB_result(); + $CR->num_rows = $RES->num_rows(); + $CR->result_object = $RES->result_object(); + $CR->result_array = $RES->result_array(); + + // Reset these since cached objects can not utilize resource IDs. + $CR->conn_id = NULL; + $CR->result_id = NULL; + + $this->CACHE->write($sql, $CR); + } + + return $RES; + } + + // -------------------------------------------------------------------- + + /** + * Load the result drivers + * + * @access public + * @return string the name of the result class + */ + function load_rdriver() + { + $driver = 'CI_DB_'.$this->dbdriver.'_result'; + + if ( ! class_exists($driver)) + { + include_once(BASEPATH.'database/DB_result.php'); + include_once(BASEPATH.'database/drivers/'.$this->dbdriver.'/'.$this->dbdriver.'_result.php'); + } + + return $driver; + } + + // -------------------------------------------------------------------- + + /** + * Simple Query + * This is a simplified version of the query() function. Internally + * we only use it when running transaction commands since they do + * not require all the features of the main query() function. + * + * @access public + * @param string the sql query + * @return mixed + */ + function simple_query($sql) + { + if ( ! $this->conn_id) + { + $this->initialize(); + } + + return $this->_execute($sql); + } + + // -------------------------------------------------------------------- + + /** + * Disable Transactions + * This permits transactions to be disabled at run-time. + * + * @access public + * @return void + */ + function trans_off() + { + $this->trans_enabled = FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Enable/disable Transaction Strict Mode + * When strict mode is enabled, if you are running multiple groups of + * transactions, if one group fails all groups will be rolled back. + * If strict mode is disabled, each group is treated autonomously, meaning + * a failure of one group will not affect any others + * + * @access public + * @return void + */ + function trans_strict($mode = TRUE) + { + $this->trans_strict = is_bool($mode) ? $mode : TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Start Transaction + * + * @access public + * @return void + */ + function trans_start($test_mode = FALSE) + { + if ( ! $this->trans_enabled) + { + return FALSE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + $this->_trans_depth += 1; + return; + } + + $this->trans_begin($test_mode); + } + + // -------------------------------------------------------------------- + + /** + * Complete Transaction + * + * @access public + * @return bool + */ + function trans_complete() + { + if ( ! $this->trans_enabled) + { + return FALSE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 1) + { + $this->_trans_depth -= 1; + return TRUE; + } + + // The query() function will set this flag to FALSE in the event that a query failed + if ($this->_trans_status === FALSE) + { + $this->trans_rollback(); + + // If we are NOT running in strict mode, we will reset + // the _trans_status flag so that subsequent groups of transactions + // will be permitted. + if ($this->trans_strict === FALSE) + { + $this->_trans_status = TRUE; + } + + log_message('debug', 'DB Transaction Failure'); + return FALSE; + } + + $this->trans_commit(); + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Lets you retrieve the transaction flag to determine if it has failed + * + * @access public + * @return bool + */ + function trans_status() + { + return $this->_trans_status; + } + + // -------------------------------------------------------------------- + + /** + * Compile Bindings + * + * @access public + * @param string the sql statement + * @param array an array of bind data + * @return string + */ + function compile_binds($sql, $binds) + { + if (strpos($sql, $this->bind_marker) === FALSE) + { + return $sql; + } + + if ( ! is_array($binds)) + { + $binds = array($binds); + } + + // Get the sql segments around the bind markers + $segments = explode($this->bind_marker, $sql); + + // The count of bind should be 1 less then the count of segments + // If there are more bind arguments trim it down + if (count($binds) >= count($segments)) { + $binds = array_slice($binds, 0, count($segments)-1); + } + + // Construct the binded query + $result = $segments[0]; + $i = 0; + foreach ($binds as $bind) + { + $result .= $this->escape($bind); + $result .= $segments[++$i]; + } + + return $result; + } + + // -------------------------------------------------------------------- + + /** + * Determines if a query is a "write" type. + * + * @access public + * @param string An SQL query string + * @return boolean + */ + function is_write_type($sql) + { + if ( ! preg_match('/^\s*"?(SET|INSERT|UPDATE|DELETE|REPLACE|CREATE|DROP|TRUNCATE|LOAD DATA|COPY|ALTER|GRANT|REVOKE|LOCK|UNLOCK)\s+/i', $sql)) + { + return FALSE; + } + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Calculate the aggregate query elapsed time + * + * @access public + * @param integer The number of decimal places + * @return integer + */ + function elapsed_time($decimals = 6) + { + return number_format($this->benchmark, $decimals); + } + + // -------------------------------------------------------------------- + + /** + * Returns the total number of queries + * + * @access public + * @return integer + */ + function total_queries() + { + return $this->query_count; + } + + // -------------------------------------------------------------------- + + /** + * Returns the last query that was executed + * + * @access public + * @return void + */ + function last_query() + { + return end($this->queries); + } + + // -------------------------------------------------------------------- + + /** + * "Smart" Escape String + * + * Escapes data based on type + * Sets boolean and null types + * + * @access public + * @param string + * @return mixed + */ + function escape($str) + { + if (is_string($str)) + { + $str = "'".$this->escape_str($str)."'"; + } + elseif (is_bool($str)) + { + $str = ($str === FALSE) ? 0 : 1; + } + elseif (is_null($str)) + { + $str = 'NULL'; + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Escape LIKE String + * + * Calls the individual driver for platform + * specific escaping for LIKE conditions + * + * @access public + * @param string + * @return mixed + */ + function escape_like_str($str) + { + return $this->escape_str($str, TRUE); + } + + // -------------------------------------------------------------------- + + /** + * Primary + * + * Retrieves the primary key. It assumes that the row in the first + * position is the primary key + * + * @access public + * @param string the table name + * @return string + */ + function primary($table = '') + { + $fields = $this->list_fields($table); + + if ( ! is_array($fields)) + { + return FALSE; + } + + return current($fields); + } + + // -------------------------------------------------------------------- + + /** + * Returns an array of table names + * + * @access public + * @return array + */ + function list_tables($constrain_by_prefix = FALSE) + { + // Is there a cached result? + if (isset($this->data_cache['table_names'])) + { + return $this->data_cache['table_names']; + } + + if (FALSE === ($sql = $this->_list_tables($constrain_by_prefix))) + { + if ($this->db_debug) + { + return $this->display_error('db_unsupported_function'); + } + return FALSE; + } + + $retval = array(); + $query = $this->query($sql); + + if ($query->num_rows() > 0) + { + foreach ($query->result_array() as $row) + { + if (isset($row['TABLE_NAME'])) + { + $retval[] = $row['TABLE_NAME']; + } + else + { + $retval[] = array_shift($row); + } + } + } + + $this->data_cache['table_names'] = $retval; + return $this->data_cache['table_names']; + } + + // -------------------------------------------------------------------- + + /** + * Determine if a particular table exists + * @access public + * @return boolean + */ + function table_exists($table_name) + { + return ( ! in_array($this->_protect_identifiers($table_name, TRUE, FALSE, FALSE), $this->list_tables())) ? FALSE : TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Fetch MySQL Field Names + * + * @access public + * @param string the table name + * @return array + */ + function list_fields($table = '') + { + // Is there a cached result? + if (isset($this->data_cache['field_names'][$table])) + { + return $this->data_cache['field_names'][$table]; + } + + if ($table == '') + { + if ($this->db_debug) + { + return $this->display_error('db_field_param_missing'); + } + return FALSE; + } + + if (FALSE === ($sql = $this->_list_columns($table))) + { + if ($this->db_debug) + { + return $this->display_error('db_unsupported_function'); + } + return FALSE; + } + + $query = $this->query($sql); + + $retval = array(); + foreach ($query->result_array() as $row) + { + if (isset($row['COLUMN_NAME'])) + { + $retval[] = $row['COLUMN_NAME']; + } + else + { + $retval[] = current($row); + } + } + + $this->data_cache['field_names'][$table] = $retval; + return $this->data_cache['field_names'][$table]; + } + + // -------------------------------------------------------------------- + + /** + * Determine if a particular field exists + * @access public + * @param string + * @param string + * @return boolean + */ + function field_exists($field_name, $table_name) + { + return ( ! in_array($field_name, $this->list_fields($table_name))) ? FALSE : TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Returns an object with field data + * + * @access public + * @param string the table name + * @return object + */ + function field_data($table = '') + { + if ($table == '') + { + if ($this->db_debug) + { + return $this->display_error('db_field_param_missing'); + } + return FALSE; + } + + $query = $this->query($this->_field_data($this->_protect_identifiers($table, TRUE, NULL, FALSE))); + + return $query->field_data(); + } + + // -------------------------------------------------------------------- + + /** + * Generate an insert string + * + * @access public + * @param string the table upon which the query will be performed + * @param array an associative array data of key/values + * @return string + */ + function insert_string($table, $data) + { + $fields = array(); + $values = array(); + + foreach ($data as $key => $val) + { + $fields[] = $this->_escape_identifiers($key); + $values[] = $this->escape($val); + } + + return $this->_insert($this->_protect_identifiers($table, TRUE, NULL, FALSE), $fields, $values); + } + + // -------------------------------------------------------------------- + + /** + * Generate an update string + * + * @access public + * @param string the table upon which the query will be performed + * @param array an associative array data of key/values + * @param mixed the "where" statement + * @return string + */ + function update_string($table, $data, $where) + { + if ($where == '') + { + return false; + } + + $fields = array(); + foreach ($data as $key => $val) + { + $fields[$this->_protect_identifiers($key)] = $this->escape($val); + } + + if ( ! is_array($where)) + { + $dest = array($where); + } + else + { + $dest = array(); + foreach ($where as $key => $val) + { + $prefix = (count($dest) == 0) ? '' : ' AND '; + + if ($val !== '') + { + if ( ! $this->_has_operator($key)) + { + $key .= ' ='; + } + + $val = ' '.$this->escape($val); + } + + $dest[] = $prefix.$key.$val; + } + } + + return $this->_update($this->_protect_identifiers($table, TRUE, NULL, FALSE), $fields, $dest); + } + + // -------------------------------------------------------------------- + + /** + * Tests whether the string has an SQL operator + * + * @access private + * @param string + * @return bool + */ + function _has_operator($str) + { + $str = trim($str); + if ( ! preg_match("/(\s|<|>|!|=|is null|is not null)/i", $str)) + { + return FALSE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Enables a native PHP function to be run, using a platform agnostic wrapper. + * + * @access public + * @param string the function name + * @param mixed any parameters needed by the function + * @return mixed + */ + function call_function($function) + { + $driver = ($this->dbdriver == 'postgre') ? 'pg_' : $this->dbdriver.'_'; + + if (FALSE === strpos($driver, $function)) + { + $function = $driver.$function; + } + + if ( ! function_exists($function)) + { + if ($this->db_debug) + { + return $this->display_error('db_unsupported_function'); + } + return FALSE; + } + else + { + $args = (func_num_args() > 1) ? array_splice(func_get_args(), 1) : null; + if (is_null($args)) + { + return call_user_func($function); + } + else + { + return call_user_func_array($function, $args); + } + } + } + + // -------------------------------------------------------------------- + + /** + * Set Cache Directory Path + * + * @access public + * @param string the path to the cache directory + * @return void + */ + function cache_set_path($path = '') + { + $this->cachedir = $path; + } + + // -------------------------------------------------------------------- + + /** + * Enable Query Caching + * + * @access public + * @return void + */ + function cache_on() + { + $this->cache_on = TRUE; + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Disable Query Caching + * + * @access public + * @return void + */ + function cache_off() + { + $this->cache_on = FALSE; + return FALSE; + } + + + // -------------------------------------------------------------------- + + /** + * Delete the cache files associated with a particular URI + * + * @access public + * @return void + */ + function cache_delete($segment_one = '', $segment_two = '') + { + if ( ! $this->_cache_init()) + { + return FALSE; + } + return $this->CACHE->delete($segment_one, $segment_two); + } + + // -------------------------------------------------------------------- + + /** + * Delete All cache files + * + * @access public + * @return void + */ + function cache_delete_all() + { + if ( ! $this->_cache_init()) + { + return FALSE; + } + + return $this->CACHE->delete_all(); + } + + // -------------------------------------------------------------------- + + /** + * Initialize the Cache Class + * + * @access private + * @return void + */ + function _cache_init() + { + if (is_object($this->CACHE) AND class_exists('CI_DB_Cache')) + { + return TRUE; + } + + if ( ! class_exists('CI_DB_Cache')) + { + if ( ! @include(BASEPATH.'database/DB_cache.php')) + { + return $this->cache_off(); + } + } + + $this->CACHE = new CI_DB_Cache($this); // pass db object to support multiple db connections and returned db objects + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @access public + * @return void + */ + function close() + { + if (is_resource($this->conn_id) OR is_object($this->conn_id)) + { + $this->_close($this->conn_id); + } + $this->conn_id = FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Display an error message + * + * @access public + * @param string the error message + * @param string any "swap" values + * @param boolean whether to localize the message + * @return string sends the application/error_db.php template + */ + function display_error($error = '', $swap = '', $native = FALSE) + { + $LANG =& load_class('Lang', 'core'); + $LANG->load('db'); + + $heading = $LANG->line('db_error_heading'); + + if ($native == TRUE) + { + $message = $error; + } + else + { + $message = ( ! is_array($error)) ? array(str_replace('%s', $swap, $LANG->line($error))) : $error; + } + + // Find the most likely culprit of the error by going through + // the backtrace until the source file is no longer in the + // database folder. + + $trace = debug_backtrace(); + + foreach ($trace as $call) + { + if (isset($call['file']) && strpos($call['file'], BASEPATH.'database') === FALSE) + { + // Found it - use a relative path for safety + $message[] = 'Filename: '.str_replace(array(BASEPATH, APPPATH), '', $call['file']); + $message[] = 'Line Number: '.$call['line']; + + break; + } + } + + $error =& load_class('Exceptions', 'core'); + echo $error->show_error($heading, $message, 'error_db'); + exit; + } + + // -------------------------------------------------------------------- + + /** + * Protect Identifiers + * + * This function adds backticks if appropriate based on db type + * + * @access private + * @param mixed the item to escape + * @return mixed the item with backticks + */ + function protect_identifiers($item, $prefix_single = FALSE) + { + return $this->_protect_identifiers($item, $prefix_single); + } + + // -------------------------------------------------------------------- + + /** + * Protect Identifiers + * + * This function is used extensively by the Active Record class, and by + * a couple functions in this class. + * It takes a column or table name (optionally with an alias) and inserts + * the table prefix onto it. Some logic is necessary in order to deal with + * column names that include the path. Consider a query like this: + * + * SELECT * FROM hostname.database.table.column AS c FROM hostname.database.table + * + * Or a query with aliasing: + * + * SELECT m.member_id, m.member_name FROM members AS m + * + * Since the column name can include up to four segments (host, DB, table, column) + * or also have an alias prefix, we need to do a bit of work to figure this out and + * insert the table prefix (if it exists) in the proper position, and escape only + * the correct identifiers. + * + * @access private + * @param string + * @param bool + * @param mixed + * @param bool + * @return string + */ + function _protect_identifiers($item, $prefix_single = FALSE, $protect_identifiers = NULL, $field_exists = TRUE) + { + if ( ! is_bool($protect_identifiers)) + { + $protect_identifiers = $this->_protect_identifiers; + } + + if (is_array($item)) + { + $escaped_array = array(); + + foreach ($item as $k => $v) + { + $escaped_array[$this->_protect_identifiers($k)] = $this->_protect_identifiers($v); + } + + return $escaped_array; + } + + // Convert tabs or multiple spaces into single spaces + $item = preg_replace('/[\t ]+/', ' ', $item); + + // If the item has an alias declaration we remove it and set it aside. + // Basically we remove everything to the right of the first space + if (strpos($item, ' ') !== FALSE) + { + $alias = strstr($item, ' '); + $item = substr($item, 0, - strlen($alias)); + } + else + { + $alias = ''; + } + + // This is basically a bug fix for queries that use MAX, MIN, etc. + // If a parenthesis is found we know that we do not need to + // escape the data or add a prefix. There's probably a more graceful + // way to deal with this, but I'm not thinking of it -- Rick + if (strpos($item, '(') !== FALSE) + { + return $item.$alias; + } + + // Break the string apart if it contains periods, then insert the table prefix + // in the correct location, assuming the period doesn't indicate that we're dealing + // with an alias. While we're at it, we will escape the components + if (strpos($item, '.') !== FALSE) + { + $parts = explode('.', $item); + + // Does the first segment of the exploded item match + // one of the aliases previously identified? If so, + // we have nothing more to do other than escape the item + if (in_array($parts[0], $this->ar_aliased_tables)) + { + if ($protect_identifiers === TRUE) + { + foreach ($parts as $key => $val) + { + if ( ! in_array($val, $this->_reserved_identifiers)) + { + $parts[$key] = $this->_escape_identifiers($val); + } + } + + $item = implode('.', $parts); + } + return $item.$alias; + } + + // Is there a table prefix defined in the config file? If not, no need to do anything + if ($this->dbprefix != '') + { + // We now add the table prefix based on some logic. + // Do we have 4 segments (hostname.database.table.column)? + // If so, we add the table prefix to the column name in the 3rd segment. + if (isset($parts[3])) + { + $i = 2; + } + // Do we have 3 segments (database.table.column)? + // If so, we add the table prefix to the column name in 2nd position + elseif (isset($parts[2])) + { + $i = 1; + } + // Do we have 2 segments (table.column)? + // If so, we add the table prefix to the column name in 1st segment + else + { + $i = 0; + } + + // This flag is set when the supplied $item does not contain a field name. + // This can happen when this function is being called from a JOIN. + if ($field_exists == FALSE) + { + $i++; + } + + // Verify table prefix and replace if necessary + if ($this->swap_pre != '' && strncmp($parts[$i], $this->swap_pre, strlen($this->swap_pre)) === 0) + { + $parts[$i] = preg_replace("/^".$this->swap_pre."(\S+?)/", $this->dbprefix."\\1", $parts[$i]); + } + + // We only add the table prefix if it does not already exist + if (substr($parts[$i], 0, strlen($this->dbprefix)) != $this->dbprefix) + { + $parts[$i] = $this->dbprefix.$parts[$i]; + } + + // Put the parts back together + $item = implode('.', $parts); + } + + if ($protect_identifiers === TRUE) + { + $item = $this->_escape_identifiers($item); + } + + return $item.$alias; + } + + // Is there a table prefix? If not, no need to insert it + if ($this->dbprefix != '') + { + // Verify table prefix and replace if necessary + if ($this->swap_pre != '' && strncmp($item, $this->swap_pre, strlen($this->swap_pre)) === 0) + { + $item = preg_replace("/^".$this->swap_pre."(\S+?)/", $this->dbprefix."\\1", $item); + } + + // Do we prefix an item with no segments? + if ($prefix_single == TRUE AND substr($item, 0, strlen($this->dbprefix)) != $this->dbprefix) + { + $item = $this->dbprefix.$item; + } + } + + if ($protect_identifiers === TRUE AND ! in_array($item, $this->_reserved_identifiers)) + { + $item = $this->_escape_identifiers($item); + } + + return $item.$alias; + } + + // -------------------------------------------------------------------- + + /** + * Dummy method that allows Active Record class to be disabled + * + * This function is used extensively by every db driver. + * + * @return void + */ + protected function _reset_select() + { + } + +} + +/* End of file DB_driver.php */ +/* Location: ./system/database/DB_driver.php */ \ No newline at end of file diff --git a/system/database/DB_forge.php b/system/database/DB_forge.php new file mode 100644 index 0000000..cf63ee1 --- /dev/null +++ b/system/database/DB_forge.php @@ -0,0 +1,383 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Database Utility Class + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_forge { + + var $fields = array(); + var $keys = array(); + var $primary_keys = array(); + var $db_char_set = ''; + + /** + * Constructor + * + * Grabs the CI super object instance so we can access it. + * + */ + function __construct() + { + // Assign the main database object to $this->db + $CI =& get_instance(); + $this->db =& $CI->db; + log_message('debug', "Database Forge Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * Create database + * + * @access public + * @param string the database name + * @return bool + */ + function create_database($db_name) + { + $sql = $this->_create_database($db_name); + + if (is_bool($sql)) + { + return $sql; + } + + return $this->db->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Drop database + * + * @access public + * @param string the database name + * @return bool + */ + function drop_database($db_name) + { + $sql = $this->_drop_database($db_name); + + if (is_bool($sql)) + { + return $sql; + } + + return $this->db->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Add Key + * + * @access public + * @param string key + * @param string type + * @return void + */ + function add_key($key = '', $primary = FALSE) + { + if (is_array($key)) + { + foreach ($key as $one) + { + $this->add_key($one, $primary); + } + + return; + } + + if ($key == '') + { + show_error('Key information is required for that operation.'); + } + + if ($primary === TRUE) + { + $this->primary_keys[] = $key; + } + else + { + $this->keys[] = $key; + } + } + + // -------------------------------------------------------------------- + + /** + * Add Field + * + * @access public + * @param string collation + * @return void + */ + function add_field($field = '') + { + if ($field == '') + { + show_error('Field information is required.'); + } + + if (is_string($field)) + { + if ($field == 'id') + { + $this->add_field(array( + 'id' => array( + 'type' => 'INT', + 'constraint' => 9, + 'auto_increment' => TRUE + ) + )); + $this->add_key('id', TRUE); + } + else + { + if (strpos($field, ' ') === FALSE) + { + show_error('Field information is required for that operation.'); + } + + $this->fields[] = $field; + } + } + + if (is_array($field)) + { + $this->fields = array_merge($this->fields, $field); + } + + } + + // -------------------------------------------------------------------- + + /** + * Create Table + * + * @access public + * @param string the table name + * @return bool + */ + function create_table($table = '', $if_not_exists = FALSE) + { + if ($table == '') + { + show_error('A table name is required for that operation.'); + } + + if (count($this->fields) == 0) + { + show_error('Field information is required.'); + } + + $sql = $this->_create_table($this->db->dbprefix.$table, $this->fields, $this->primary_keys, $this->keys, $if_not_exists); + + $this->_reset(); + return $this->db->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Drop Table + * + * @access public + * @param string the table name + * @return bool + */ + function drop_table($table_name) + { + $sql = $this->_drop_table($this->db->dbprefix.$table_name); + + if (is_bool($sql)) + { + return $sql; + } + + return $this->db->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Rename Table + * + * @access public + * @param string the old table name + * @param string the new table name + * @return bool + */ + function rename_table($table_name, $new_table_name) + { + if ($table_name == '' OR $new_table_name == '') + { + show_error('A table name is required for that operation.'); + } + + $sql = $this->_rename_table($this->db->dbprefix.$table_name, $this->db->dbprefix.$new_table_name); + return $this->db->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Column Add + * + * @access public + * @param string the table name + * @param string the column name + * @param string the column definition + * @return bool + */ + function add_column($table = '', $field = array(), $after_field = '') + { + if ($table == '') + { + show_error('A table name is required for that operation.'); + } + + // add field info into field array, but we can only do one at a time + // so we cycle through + + foreach ($field as $k => $v) + { + $this->add_field(array($k => $field[$k])); + + if (count($this->fields) == 0) + { + show_error('Field information is required.'); + } + + $sql = $this->_alter_table('ADD', $this->db->dbprefix.$table, $this->fields, $after_field); + + $this->_reset(); + + if ($this->db->query($sql) === FALSE) + { + return FALSE; + } + } + + return TRUE; + + } + + // -------------------------------------------------------------------- + + /** + * Column Drop + * + * @access public + * @param string the table name + * @param string the column name + * @return bool + */ + function drop_column($table = '', $column_name = '') + { + + if ($table == '') + { + show_error('A table name is required for that operation.'); + } + + if ($column_name == '') + { + show_error('A column name is required for that operation.'); + } + + $sql = $this->_alter_table('DROP', $this->db->dbprefix.$table, $column_name); + + return $this->db->query($sql); + } + + // -------------------------------------------------------------------- + + /** + * Column Modify + * + * @access public + * @param string the table name + * @param string the column name + * @param string the column definition + * @return bool + */ + function modify_column($table = '', $field = array()) + { + if ($table == '') + { + show_error('A table name is required for that operation.'); + } + + // add field info into field array, but we can only do one at a time + // so we cycle through + + foreach ($field as $k => $v) + { + // If no name provided, use the current name + if ( ! isset($field[$k]['name'])) + { + $field[$k]['name'] = $k; + } + + $this->add_field(array($k => $field[$k])); + + if (count($this->fields) == 0) + { + show_error('Field information is required.'); + } + + $sql = $this->_alter_table('CHANGE', $this->db->dbprefix.$table, $this->fields); + + $this->_reset(); + + if ($this->db->query($sql) === FALSE) + { + return FALSE; + } + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Reset + * + * Resets table creation vars + * + * @access private + * @return void + */ + function _reset() + { + $this->fields = array(); + $this->keys = array(); + $this->primary_keys = array(); + } + +} + +/* End of file DB_forge.php */ +/* Location: ./system/database/DB_forge.php */ \ No newline at end of file diff --git a/system/database/DB_result.php b/system/database/DB_result.php new file mode 100644 index 0000000..d397fb4 --- /dev/null +++ b/system/database/DB_result.php @@ -0,0 +1,411 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Database Result Class + * + * This is the platform-independent result class. + * This class will not be called directly. Rather, the adapter + * class for the specific database will extend and instantiate it. + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_result { + + var $conn_id = NULL; + var $result_id = NULL; + var $result_array = array(); + var $result_object = array(); + var $custom_result_object = array(); + var $current_row = 0; + var $num_rows = 0; + var $row_data = NULL; + + + /** + * Query result. Acts as a wrapper function for the following functions. + * + * @access public + * @param string can be "object" or "array" + * @return mixed either a result object or array + */ + public function result($type = 'object') + { + if ($type == 'array') return $this->result_array(); + else if ($type == 'object') return $this->result_object(); + else return $this->custom_result_object($type); + } + + // -------------------------------------------------------------------- + + /** + * Custom query result. + * + * @param class_name A string that represents the type of object you want back + * @return array of objects + */ + public function custom_result_object($class_name) + { + if (array_key_exists($class_name, $this->custom_result_object)) + { + return $this->custom_result_object[$class_name]; + } + + if ($this->result_id === FALSE OR $this->num_rows() == 0) + { + return array(); + } + + // add the data to the object + $this->_data_seek(0); + $result_object = array(); + + while ($row = $this->_fetch_object()) + { + $object = new $class_name(); + + foreach ($row as $key => $value) + { + $object->$key = $value; + } + + $result_object[] = $object; + } + + // return the array + return $this->custom_result_object[$class_name] = $result_object; + } + + // -------------------------------------------------------------------- + + /** + * Query result. "object" version. + * + * @access public + * @return object + */ + public function result_object() + { + if (count($this->result_object) > 0) + { + return $this->result_object; + } + + // In the event that query caching is on the result_id variable + // will return FALSE since there isn't a valid SQL resource so + // we'll simply return an empty array. + if ($this->result_id === FALSE OR $this->num_rows() == 0) + { + return array(); + } + + $this->_data_seek(0); + while ($row = $this->_fetch_object()) + { + $this->result_object[] = $row; + } + + return $this->result_object; + } + + // -------------------------------------------------------------------- + + /** + * Query result. "array" version. + * + * @access public + * @return array + */ + public function result_array() + { + if (count($this->result_array) > 0) + { + return $this->result_array; + } + + // In the event that query caching is on the result_id variable + // will return FALSE since there isn't a valid SQL resource so + // we'll simply return an empty array. + if ($this->result_id === FALSE OR $this->num_rows() == 0) + { + return array(); + } + + $this->_data_seek(0); + while ($row = $this->_fetch_assoc()) + { + $this->result_array[] = $row; + } + + return $this->result_array; + } + + // -------------------------------------------------------------------- + + /** + * Query result. Acts as a wrapper function for the following functions. + * + * @access public + * @param string + * @param string can be "object" or "array" + * @return mixed either a result object or array + */ + public function row($n = 0, $type = 'object') + { + if ( ! is_numeric($n)) + { + // We cache the row data for subsequent uses + if ( ! is_array($this->row_data)) + { + $this->row_data = $this->row_array(0); + } + + // array_key_exists() instead of isset() to allow for MySQL NULL values + if (array_key_exists($n, $this->row_data)) + { + return $this->row_data[$n]; + } + // reset the $n variable if the result was not achieved + $n = 0; + } + + if ($type == 'object') return $this->row_object($n); + else if ($type == 'array') return $this->row_array($n); + else return $this->custom_row_object($n, $type); + } + + // -------------------------------------------------------------------- + + /** + * Assigns an item into a particular column slot + * + * @access public + * @return object + */ + public function set_row($key, $value = NULL) + { + // We cache the row data for subsequent uses + if ( ! is_array($this->row_data)) + { + $this->row_data = $this->row_array(0); + } + + if (is_array($key)) + { + foreach ($key as $k => $v) + { + $this->row_data[$k] = $v; + } + + return; + } + + if ($key != '' AND ! is_null($value)) + { + $this->row_data[$key] = $value; + } + } + + // -------------------------------------------------------------------- + + /** + * Returns a single result row - custom object version + * + * @access public + * @return object + */ + public function custom_row_object($n, $type) + { + $result = $this->custom_result_object($type); + + if (count($result) == 0) + { + return $result; + } + + if ($n != $this->current_row AND isset($result[$n])) + { + $this->current_row = $n; + } + + return $result[$this->current_row]; + } + + /** + * Returns a single result row - object version + * + * @access public + * @return object + */ + public function row_object($n = 0) + { + $result = $this->result_object(); + + if (count($result) == 0) + { + return $result; + } + + if ($n != $this->current_row AND isset($result[$n])) + { + $this->current_row = $n; + } + + return $result[$this->current_row]; + } + + // -------------------------------------------------------------------- + + /** + * Returns a single result row - array version + * + * @access public + * @return array + */ + public function row_array($n = 0) + { + $result = $this->result_array(); + + if (count($result) == 0) + { + return $result; + } + + if ($n != $this->current_row AND isset($result[$n])) + { + $this->current_row = $n; + } + + return $result[$this->current_row]; + } + + + // -------------------------------------------------------------------- + + /** + * Returns the "first" row + * + * @access public + * @return object + */ + public function first_row($type = 'object') + { + $result = $this->result($type); + + if (count($result) == 0) + { + return $result; + } + return $result[0]; + } + + // -------------------------------------------------------------------- + + /** + * Returns the "last" row + * + * @access public + * @return object + */ + public function last_row($type = 'object') + { + $result = $this->result($type); + + if (count($result) == 0) + { + return $result; + } + return $result[count($result) -1]; + } + + // -------------------------------------------------------------------- + + /** + * Returns the "next" row + * + * @access public + * @return object + */ + public function next_row($type = 'object') + { + $result = $this->result($type); + + if (count($result) == 0) + { + return $result; + } + + if (isset($result[$this->current_row + 1])) + { + ++$this->current_row; + } + + return $result[$this->current_row]; + } + + // -------------------------------------------------------------------- + + /** + * Returns the "previous" row + * + * @access public + * @return object + */ + public function previous_row($type = 'object') + { + $result = $this->result($type); + + if (count($result) == 0) + { + return $result; + } + + if (isset($result[$this->current_row - 1])) + { + --$this->current_row; + } + return $result[$this->current_row]; + } + + // -------------------------------------------------------------------- + + /** + * The following functions are normally overloaded by the identically named + * methods in the platform-specific driver -- except when query caching + * is used. When caching is enabled we do not load the other driver. + * These functions are primarily here to prevent undefined function errors + * when a cached result object is in use. They are not otherwise fully + * operational due to the unavailability of the database resource IDs with + * cached results. + */ + public function num_rows() { return $this->num_rows; } + public function num_fields() { return 0; } + public function list_fields() { return array(); } + public function field_data() { return array(); } + public function free_result() { return TRUE; } + protected function _data_seek() { return TRUE; } + protected function _fetch_assoc() { return array(); } + protected function _fetch_object() { return array(); } + +} +// END DB_result class + +/* End of file DB_result.php */ +/* Location: ./system/database/DB_result.php */ diff --git a/system/database/DB_utility.php b/system/database/DB_utility.php new file mode 100644 index 0000000..3032d9e --- /dev/null +++ b/system/database/DB_utility.php @@ -0,0 +1,415 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Database Utility Class + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_utility extends CI_DB_forge { + + var $db; + var $data_cache = array(); + + /** + * Constructor + * + * Grabs the CI super object instance so we can access it. + * + */ + function __construct() + { + // Assign the main database object to $this->db + $CI =& get_instance(); + $this->db =& $CI->db; + + log_message('debug', "Database Utility Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * List databases + * + * @access public + * @return bool + */ + function list_databases() + { + // Is there a cached result? + if (isset($this->data_cache['db_names'])) + { + return $this->data_cache['db_names']; + } + + $query = $this->db->query($this->_list_databases()); + $dbs = array(); + if ($query->num_rows() > 0) + { + foreach ($query->result_array() as $row) + { + $dbs[] = current($row); + } + } + + $this->data_cache['db_names'] = $dbs; + return $this->data_cache['db_names']; + } + + // -------------------------------------------------------------------- + + /** + * Determine if a particular database exists + * + * @access public + * @param string + * @return boolean + */ + function database_exists($database_name) + { + // Some databases won't have access to the list_databases() function, so + // this is intended to allow them to override with their own functions as + // defined in $driver_utility.php + if (method_exists($this, '_database_exists')) + { + return $this->_database_exists($database_name); + } + else + { + return ( ! in_array($database_name, $this->list_databases())) ? FALSE : TRUE; + } + } + + + // -------------------------------------------------------------------- + + /** + * Optimize Table + * + * @access public + * @param string the table name + * @return bool + */ + function optimize_table($table_name) + { + $sql = $this->_optimize_table($table_name); + + if (is_bool($sql)) + { + show_error('db_must_use_set'); + } + + $query = $this->db->query($sql); + $res = $query->result_array(); + + // Note: Due to a bug in current() that affects some versions + // of PHP we can not pass function call directly into it + return current($res); + } + + // -------------------------------------------------------------------- + + /** + * Optimize Database + * + * @access public + * @return array + */ + function optimize_database() + { + $result = array(); + foreach ($this->db->list_tables() as $table_name) + { + $sql = $this->_optimize_table($table_name); + + if (is_bool($sql)) + { + return $sql; + } + + $query = $this->db->query($sql); + + // Build the result array... + // Note: Due to a bug in current() that affects some versions + // of PHP we can not pass function call directly into it + $res = $query->result_array(); + $res = current($res); + $key = str_replace($this->db->database.'.', '', current($res)); + $keys = array_keys($res); + unset($res[$keys[0]]); + + $result[$key] = $res; + } + + return $result; + } + + // -------------------------------------------------------------------- + + /** + * Repair Table + * + * @access public + * @param string the table name + * @return bool + */ + function repair_table($table_name) + { + $sql = $this->_repair_table($table_name); + + if (is_bool($sql)) + { + return $sql; + } + + $query = $this->db->query($sql); + + // Note: Due to a bug in current() that affects some versions + // of PHP we can not pass function call directly into it + $res = $query->result_array(); + return current($res); + } + + // -------------------------------------------------------------------- + + /** + * Generate CSV from a query result object + * + * @access public + * @param object The query result object + * @param string The delimiter - comma by default + * @param string The newline character - \n by default + * @param string The enclosure - double quote by default + * @return string + */ + function csv_from_result($query, $delim = ",", $newline = "\n", $enclosure = '"') + { + if ( ! is_object($query) OR ! method_exists($query, 'list_fields')) + { + show_error('You must submit a valid result object'); + } + + $out = ''; + + // First generate the headings from the table column names + foreach ($query->list_fields() as $name) + { + $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $name).$enclosure.$delim; + } + + $out = rtrim($out); + $out .= $newline; + + // Next blast through the result array and build out the rows + foreach ($query->result_array() as $row) + { + foreach ($row as $item) + { + $out .= $enclosure.str_replace($enclosure, $enclosure.$enclosure, $item).$enclosure.$delim; + } + $out = rtrim($out); + $out .= $newline; + } + + return $out; + } + + // -------------------------------------------------------------------- + + /** + * Generate XML data from a query result object + * + * @access public + * @param object The query result object + * @param array Any preferences + * @return string + */ + function xml_from_result($query, $params = array()) + { + if ( ! is_object($query) OR ! method_exists($query, 'list_fields')) + { + show_error('You must submit a valid result object'); + } + + // Set our default values + foreach (array('root' => 'root', 'element' => 'element', 'newline' => "\n", 'tab' => "\t") as $key => $val) + { + if ( ! isset($params[$key])) + { + $params[$key] = $val; + } + } + + // Create variables for convenience + extract($params); + + // Load the xml helper + $CI =& get_instance(); + $CI->load->helper('xml'); + + // Generate the result + $xml = "<{$root}>".$newline; + foreach ($query->result_array() as $row) + { + $xml .= $tab."<{$element}>".$newline; + + foreach ($row as $key => $val) + { + $xml .= $tab.$tab."<{$key}>".xml_convert($val)."</{$key}>".$newline; + } + $xml .= $tab."</{$element}>".$newline; + } + $xml .= "</$root>".$newline; + + return $xml; + } + + // -------------------------------------------------------------------- + + /** + * Database Backup + * + * @access public + * @return void + */ + function backup($params = array()) + { + // If the parameters have not been submitted as an + // array then we know that it is simply the table + // name, which is a valid short cut. + if (is_string($params)) + { + $params = array('tables' => $params); + } + + // ------------------------------------------------------ + + // Set up our default preferences + $prefs = array( + 'tables' => array(), + 'ignore' => array(), + 'filename' => '', + 'format' => 'gzip', // gzip, zip, txt + 'add_drop' => TRUE, + 'add_insert' => TRUE, + 'newline' => "\n" + ); + + // Did the user submit any preferences? If so set them.... + if (count($params) > 0) + { + foreach ($prefs as $key => $val) + { + if (isset($params[$key])) + { + $prefs[$key] = $params[$key]; + } + } + } + + // ------------------------------------------------------ + + // Are we backing up a complete database or individual tables? + // If no table names were submitted we'll fetch the entire table list + if (count($prefs['tables']) == 0) + { + $prefs['tables'] = $this->db->list_tables(); + } + + // ------------------------------------------------------ + + // Validate the format + if ( ! in_array($prefs['format'], array('gzip', 'zip', 'txt'), TRUE)) + { + $prefs['format'] = 'txt'; + } + + // ------------------------------------------------------ + + // Is the encoder supported? If not, we'll either issue an + // error or use plain text depending on the debug settings + if (($prefs['format'] == 'gzip' AND ! @function_exists('gzencode')) + OR ($prefs['format'] == 'zip' AND ! @function_exists('gzcompress'))) + { + if ($this->db->db_debug) + { + return $this->db->display_error('db_unsuported_compression'); + } + + $prefs['format'] = 'txt'; + } + + // ------------------------------------------------------ + + // Set the filename if not provided - Only needed with Zip files + if ($prefs['filename'] == '' AND $prefs['format'] == 'zip') + { + $prefs['filename'] = (count($prefs['tables']) == 1) ? $prefs['tables'] : $this->db->database; + $prefs['filename'] .= '_'.date('Y-m-d_H-i', time()); + } + + // ------------------------------------------------------ + + // Was a Gzip file requested? + if ($prefs['format'] == 'gzip') + { + return gzencode($this->_backup($prefs)); + } + + // ------------------------------------------------------ + + // Was a text file requested? + if ($prefs['format'] == 'txt') + { + return $this->_backup($prefs); + } + + // ------------------------------------------------------ + + // Was a Zip file requested? + if ($prefs['format'] == 'zip') + { + // If they included the .zip file extension we'll remove it + if (preg_match("|.+?\.zip$|", $prefs['filename'])) + { + $prefs['filename'] = str_replace('.zip', '', $prefs['filename']); + } + + // Tack on the ".sql" file extension if needed + if ( ! preg_match("|.+?\.sql$|", $prefs['filename'])) + { + $prefs['filename'] .= '.sql'; + } + + // Load the Zip class and output it + + $CI =& get_instance(); + $CI->load->library('zip'); + $CI->zip->add_data($prefs['filename'], $this->_backup($prefs)); + return $CI->zip->get_zip(); + } + + } + +} + + +/* End of file DB_utility.php */ +/* Location: ./system/database/DB_utility.php */ \ No newline at end of file diff --git a/system/database/drivers/cubrid/cubrid_driver.php b/system/database/drivers/cubrid/cubrid_driver.php new file mode 100644 index 0000000..08aa429 --- /dev/null +++ b/system/database/drivers/cubrid/cubrid_driver.php @@ -0,0 +1,793 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 2.0.2 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CUBRID Database Adapter Class + * + * Note: _DB is an extender class that the app controller + * creates dynamically based on whether the active record + * class is being used or not. + * + * @package CodeIgniter + * @subpackage Drivers + * @category Database + * @author Esen Sagynov + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_cubrid_driver extends CI_DB { + + // Default CUBRID Broker port. Will be used unless user + // explicitly specifies another one. + const DEFAULT_PORT = 33000; + + var $dbdriver = 'cubrid'; + + // The character used for escaping - no need in CUBRID + var $_escape_char = ''; + + // clause and character used for LIKE escape sequences - not used in CUBRID + var $_like_escape_str = ''; + var $_like_escape_chr = ''; + + /** + * The syntax to count rows is slightly different across different + * database engines, so this string appears in each driver and is + * used for the count_all() and count_all_results() functions. + */ + var $_count_string = 'SELECT COUNT(*) AS '; + var $_random_keyword = ' RAND()'; // database specific random keyword + + /** + * Non-persistent database connection + * + * @access private called by the base class + * @return resource + */ + function db_connect() + { + // If no port is defined by the user, use the default value + if ($this->port == '') + { + $this->port = self::DEFAULT_PORT; + } + + $conn = cubrid_connect($this->hostname, $this->port, $this->database, $this->username, $this->password); + + if ($conn) + { + // Check if a user wants to run queries in dry, i.e. run the + // queries but not commit them. + if (isset($this->auto_commit) && ! $this->auto_commit) + { + cubrid_set_autocommit($conn, CUBRID_AUTOCOMMIT_FALSE); + } + else + { + cubrid_set_autocommit($conn, CUBRID_AUTOCOMMIT_TRUE); + $this->auto_commit = TRUE; + } + } + + return $conn; + } + + // -------------------------------------------------------------------- + + /** + * Persistent database connection + * In CUBRID persistent DB connection is supported natively in CUBRID + * engine which can be configured in the CUBRID Broker configuration + * file by setting the CCI_PCONNECT parameter to ON. In that case, all + * connections established between the client application and the + * server will become persistent. This is calling the same + * @cubrid_connect function will establish persisten connection + * considering that the CCI_PCONNECT is ON. + * + * @access private called by the base class + * @return resource + */ + function db_pconnect() + { + return $this->db_connect(); + } + + // -------------------------------------------------------------------- + + /** + * Reconnect + * + * Keep / reestablish the db connection if no queries have been + * sent for a length of time exceeding the server's idle timeout + * + * @access public + * @return void + */ + function reconnect() + { + if (cubrid_ping($this->conn_id) === FALSE) + { + $this->conn_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Select the database + * + * @access private called by the base class + * @return resource + */ + function db_select() + { + // In CUBRID there is no need to select a database as the database + // is chosen at the connection time. + // So, to determine if the database is "selected", all we have to + // do is ping the server and return that value. + return cubrid_ping($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Set client character set + * + * @access public + * @param string + * @param string + * @return resource + */ + function db_set_charset($charset, $collation) + { + // In CUBRID, there is no need to set charset or collation. + // This is why returning true will allow the application continue + // its normal process. + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Version number query string + * + * @access public + * @return string + */ + function _version() + { + // To obtain the CUBRID Server version, no need to run the SQL query. + // CUBRID PHP API provides a function to determin this value. + // This is why we also need to add 'cubrid' value to the list of + // $driver_version_exceptions array in DB_driver class in + // version() function. + return cubrid_get_server_info($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @access private called by the base class + * @param string an SQL query + * @return resource + */ + function _execute($sql) + { + $sql = $this->_prep_query($sql); + return @cubrid_query($sql, $this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Prep the query + * + * If needed, each database adapter can prep the query string + * + * @access private called by execute() + * @param string an SQL query + * @return string + */ + function _prep_query($sql) + { + // No need to prepare + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @access public + * @return bool + */ + function trans_begin($test_mode = FALSE) + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + // Reset the transaction failure flag. + // If the $test_mode flag is set to TRUE transactions will be rolled back + // even if the queries produce a successful result. + $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; + + if (cubrid_get_autocommit($this->conn_id)) + { + cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_FALSE); + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @access public + * @return bool + */ + function trans_commit() + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + cubrid_commit($this->conn_id); + + if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id)) + { + cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE); + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @access public + * @return bool + */ + function trans_rollback() + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + cubrid_rollback($this->conn_id); + + if ($this->auto_commit && ! cubrid_get_autocommit($this->conn_id)) + { + cubrid_set_autocommit($this->conn_id, CUBRID_AUTOCOMMIT_TRUE); + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Escape String + * + * @access public + * @param string + * @param bool whether or not the string will be used in a LIKE condition + * @return string + */ + function escape_str($str, $like = FALSE) + { + if (is_array($str)) + { + foreach ($str as $key => $val) + { + $str[$key] = $this->escape_str($val, $like); + } + + return $str; + } + + if (function_exists('cubrid_real_escape_string') AND is_resource($this->conn_id)) + { + $str = cubrid_real_escape_string($str, $this->conn_id); + } + else + { + $str = addslashes($str); + } + + // escape LIKE condition wildcards + if ($like === TRUE) + { + $str = str_replace(array('%', '_'), array('\\%', '\\_'), $str); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @access public + * @return integer + */ + function affected_rows() + { + return @cubrid_affected_rows($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @access public + * @return integer + */ + function insert_id() + { + return @cubrid_insert_id($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * "Count All" query + * + * Generates a platform-specific query string that counts all records in + * the specified table + * + * @access public + * @param string + * @return string + */ + function count_all($table = '') + { + if ($table == '') + { + return 0; + } + + $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); + + if ($query->num_rows() == 0) + { + return 0; + } + + $row = $query->row(); + $this->_reset_select(); + return (int) $row->numrows; + } + + // -------------------------------------------------------------------- + + /** + * List table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @access private + * @param boolean + * @return string + */ + function _list_tables($prefix_limit = FALSE) + { + $sql = "SHOW TABLES"; + + if ($prefix_limit !== FALSE AND $this->dbprefix != '') + { + $sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%'"; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @access public + * @param string the table name + * @return string + */ + function _list_columns($table = '') + { + return "SHOW COLUMNS FROM ".$this->_protect_identifiers($table, TRUE, NULL, FALSE); + } + + // -------------------------------------------------------------------- + + /** + * Field data query + * + * Generates a platform-specific query so that the column data can be retrieved + * + * @access public + * @param string the table name + * @return object + */ + function _field_data($table) + { + return "SELECT * FROM ".$table." LIMIT 1"; + } + + // -------------------------------------------------------------------- + + /** + * The error message string + * + * @access private + * @return string + */ + function _error_message() + { + return cubrid_error($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * The error message number + * + * @access private + * @return integer + */ + function _error_number() + { + return cubrid_errno($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Escape the SQL Identifiers + * + * This function escapes column and table names + * + * @access private + * @param string + * @return string + */ + function _escape_identifiers($item) + { + if ($this->_escape_char == '') + { + return $item; + } + + foreach ($this->_reserved_identifiers as $id) + { + if (strpos($item, '.'.$id) !== FALSE) + { + $str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); + + // remove duplicates if the user already included the escape + return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); + } + } + + if (strpos($item, '.') !== FALSE) + { + $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; + } + else + { + $str = $this->_escape_char.$item.$this->_escape_char; + } + + // remove duplicates if the user already included the escape + return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); + } + + // -------------------------------------------------------------------- + + /** + * From Tables + * + * This function implicitly groups FROM tables so there is no confusion + * about operator precedence in harmony with SQL standards + * + * @access public + * @param type + * @return type + */ + function _from_tables($tables) + { + if ( ! is_array($tables)) + { + $tables = array($tables); + } + + return '('.implode(', ', $tables).')'; + } + + // -------------------------------------------------------------------- + + /** + * Insert statement + * + * Generates a platform-specific insert string from the supplied data + * + * @access public + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + function _insert($table, $keys, $values) + { + return "INSERT INTO ".$table." (\"".implode('", "', $keys)."\") VALUES (".implode(', ', $values).")"; + } + + // -------------------------------------------------------------------- + + + /** + * Replace statement + * + * Generates a platform-specific replace string from the supplied data + * + * @access public + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + function _replace($table, $keys, $values) + { + return "REPLACE INTO ".$table." (\"".implode('", "', $keys)."\") VALUES (".implode(', ', $values).")"; + } + + // -------------------------------------------------------------------- + + /** + * Insert_batch statement + * + * Generates a platform-specific insert string from the supplied data + * + * @access public + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + function _insert_batch($table, $keys, $values) + { + return "INSERT INTO ".$table." (\"".implode('", "', $keys)."\") VALUES ".implode(', ', $values); + } + + // -------------------------------------------------------------------- + + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @access public + * @param string the table name + * @param array the update data + * @param array the where clause + * @param array the orderby clause + * @param array the limit clause + * @return string + */ + function _update($table, $values, $where, $orderby = array(), $limit = FALSE) + { + foreach ($values as $key => $val) + { + $valstr[] = sprintf('"%s" = %s', $key, $val); + } + + $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; + + $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; + + $sql = "UPDATE ".$table." SET ".implode(', ', $valstr); + + $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; + + $sql .= $orderby.$limit; + + return $sql; + } + + // -------------------------------------------------------------------- + + + /** + * Update_Batch statement + * + * Generates a platform-specific batch update string from the supplied data + * + * @access public + * @param string the table name + * @param array the update data + * @param array the where clause + * @return string + */ + function _update_batch($table, $values, $index, $where = NULL) + { + $ids = array(); + $where = ($where != '' AND count($where) >=1) ? implode(" ", $where).' AND ' : ''; + + foreach ($values as $key => $val) + { + $ids[] = $val[$index]; + + foreach (array_keys($val) as $field) + { + if ($field != $index) + { + $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; + } + } + } + + $sql = "UPDATE ".$table." SET "; + $cases = ''; + + foreach ($final as $k => $v) + { + $cases .= $k.' = CASE '."\n"; + foreach ($v as $row) + { + $cases .= $row."\n"; + } + + $cases .= 'ELSE '.$k.' END, '; + } + + $sql .= substr($cases, 0, -2); + + $sql .= ' WHERE '.$where.$index.' IN ('.implode(',', $ids).')'; + + return $sql; + } + + // -------------------------------------------------------------------- + + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * If the database does not support the truncate() command + * This function maps to "DELETE FROM table" + * + * @access public + * @param string the table name + * @return string + */ + function _truncate($table) + { + return "TRUNCATE ".$table; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @access public + * @param string the table name + * @param array the where clause + * @param string the limit clause + * @return string + */ + function _delete($table, $where = array(), $like = array(), $limit = FALSE) + { + $conditions = ''; + + if (count($where) > 0 OR count($like) > 0) + { + $conditions = "\nWHERE "; + $conditions .= implode("\n", $this->ar_where); + + if (count($where) > 0 && count($like) > 0) + { + $conditions .= " AND "; + } + $conditions .= implode("\n", $like); + } + + $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; + + return "DELETE FROM ".$table.$conditions.$limit; + } + + // -------------------------------------------------------------------- + + /** + * Limit string + * + * Generates a platform-specific LIMIT clause + * + * @access public + * @param string the sql query string + * @param integer the number of rows to limit the query to + * @param integer the offset value + * @return string + */ + function _limit($sql, $limit, $offset) + { + if ($offset == 0) + { + $offset = ''; + } + else + { + $offset .= ", "; + } + + return $sql."LIMIT ".$offset.$limit; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @access public + * @param resource + * @return void + */ + function _close($conn_id) + { + @cubrid_close($conn_id); + } + +} + + +/* End of file cubrid_driver.php */ +/* Location: ./system/database/drivers/cubrid/cubrid_driver.php */ \ No newline at end of file diff --git a/system/database/drivers/cubrid/cubrid_forge.php b/system/database/drivers/cubrid/cubrid_forge.php new file mode 100644 index 0000000..73bfafe --- /dev/null +++ b/system/database/drivers/cubrid/cubrid_forge.php @@ -0,0 +1,289 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CUBRID Forge Class + * + * @category Database + * @author Esen Sagynov + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_cubrid_forge extends CI_DB_forge { + + /** + * Create database + * + * @access private + * @param string the database name + * @return bool + */ + function _create_database($name) + { + // CUBRID does not allow to create a database in SQL. The GUI tools + // have to be used for this purpose. + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Drop database + * + * @access private + * @param string the database name + * @return bool + */ + function _drop_database($name) + { + // CUBRID does not allow to drop a database in SQL. The GUI tools + // have to be used for this purpose. + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Process Fields + * + * @access private + * @param mixed the fields + * @return string + */ + function _process_fields($fields) + { + $current_field_count = 0; + $sql = ''; + + foreach ($fields as $field=>$attributes) + { + // Numeric field names aren't allowed in databases, so if the key is + // numeric, we know it was assigned by PHP and the developer manually + // entered the field information, so we'll simply add it to the list + if (is_numeric($field)) + { + $sql .= "\n\t$attributes"; + } + else + { + $attributes = array_change_key_case($attributes, CASE_UPPER); + + $sql .= "\n\t\"" . $this->db->_protect_identifiers($field) . "\""; + + if (array_key_exists('NAME', $attributes)) + { + $sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' '; + } + + if (array_key_exists('TYPE', $attributes)) + { + $sql .= ' '.$attributes['TYPE']; + + if (array_key_exists('CONSTRAINT', $attributes)) + { + switch ($attributes['TYPE']) + { + case 'decimal': + case 'float': + case 'numeric': + $sql .= '('.implode(',', $attributes['CONSTRAINT']).')'; + break; + case 'enum': // As of version 8.4.0 CUBRID does not support + // enum data type. + break; + case 'set': + $sql .= '("'.implode('","', $attributes['CONSTRAINT']).'")'; + break; + default: + $sql .= '('.$attributes['CONSTRAINT'].')'; + } + } + } + + if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) + { + //$sql .= ' UNSIGNED'; + // As of version 8.4.0 CUBRID does not support UNSIGNED INTEGER data type. + // Will be supported in the next release as a part of MySQL Compatibility. + } + + if (array_key_exists('DEFAULT', $attributes)) + { + $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; + } + + if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) + { + $sql .= ' NULL'; + } + else + { + $sql .= ' NOT NULL'; + } + + if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) + { + $sql .= ' AUTO_INCREMENT'; + } + + if (array_key_exists('UNIQUE', $attributes) && $attributes['UNIQUE'] === TRUE) + { + $sql .= ' UNIQUE'; + } + } + + // don't add a comma on the end of the last field + if (++$current_field_count < count($fields)) + { + $sql .= ','; + } + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Create Table + * + * @access private + * @param string the table name + * @param mixed the fields + * @param mixed primary key(s) + * @param mixed key(s) + * @param boolean should 'IF NOT EXISTS' be added to the SQL + * @return bool + */ + function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) + { + $sql = 'CREATE TABLE '; + + if ($if_not_exists === TRUE) + { + //$sql .= 'IF NOT EXISTS '; + // As of version 8.4.0 CUBRID does not support this SQL syntax. + } + + $sql .= $this->db->_escape_identifiers($table)." ("; + + $sql .= $this->_process_fields($fields); + + // If there is a PK defined + if (count($primary_keys) > 0) + { + $key_name = "pk_" . $table . "_" . + $this->db->_protect_identifiers(implode('_', $primary_keys)); + + $primary_keys = $this->db->_protect_identifiers($primary_keys); + $sql .= ",\n\tCONSTRAINT " . $key_name . " PRIMARY KEY(" . implode(', ', $primary_keys) . ")"; + } + + if (is_array($keys) && count($keys) > 0) + { + foreach ($keys as $key) + { + if (is_array($key)) + { + $key_name = $this->db->_protect_identifiers(implode('_', $key)); + $key = $this->db->_protect_identifiers($key); + } + else + { + $key_name = $this->db->_protect_identifiers($key); + $key = array($key_name); + } + + $sql .= ",\n\tKEY \"{$key_name}\" (" . implode(', ', $key) . ")"; + } + } + + $sql .= "\n);"; + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Drop Table + * + * @access private + * @return string + */ + function _drop_table($table) + { + return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table); + } + + // -------------------------------------------------------------------- + + /** + * Alter table query + * + * Generates a platform-specific query so that a table can be altered + * Called by add_column(), drop_column(), and column_alter(), + * + * @access private + * @param string the ALTER type (ADD, DROP, CHANGE) + * @param string the column name + * @param array fields + * @param string the field after which we should add the new field + * @return object + */ + function _alter_table($alter_type, $table, $fields, $after_field = '') + { + $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type "; + + // DROP has everything it needs now. + if ($alter_type == 'DROP') + { + return $sql.$this->db->_protect_identifiers($fields); + } + + $sql .= $this->_process_fields($fields); + + if ($after_field != '') + { + $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Rename a table + * + * Generates a platform-specific query so that a table can be renamed + * + * @access private + * @param string the old table name + * @param string the new table name + * @return string + */ + function _rename_table($table_name, $new_table_name) + { + $sql = 'RENAME TABLE '.$this->db->_protect_identifiers($table_name)." AS ".$this->db->_protect_identifiers($new_table_name); + return $sql; + } + +} + +/* End of file cubrid_forge.php */ +/* Location: ./system/database/drivers/cubrid/cubrid_forge.php */ \ No newline at end of file diff --git a/system/database/drivers/cubrid/cubrid_result.php b/system/database/drivers/cubrid/cubrid_result.php new file mode 100644 index 0000000..244e6b4 --- /dev/null +++ b/system/database/drivers/cubrid/cubrid_result.php @@ -0,0 +1,203 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 2.0.2 + * @filesource + */ + +// -------------------------------------------------------------------- + +/** + * CUBRID Result Class + * + * This class extends the parent result class: CI_DB_result + * + * @category Database + * @author Esen Sagynov + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_cubrid_result extends CI_DB_result { + + /** + * Number of rows in the result set + * + * @access public + * @return integer + */ + function num_rows() + { + return @cubrid_num_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @access public + * @return integer + */ + function num_fields() + { + return @cubrid_num_fields($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @access public + * @return array + */ + function list_fields() + { + return cubrid_column_names($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @access public + * @return array + */ + function field_data() + { + $retval = array(); + + $tablePrimaryKeys = array(); + + while ($field = cubrid_fetch_field($this->result_id)) + { + $F = new stdClass(); + $F->name = $field->name; + $F->type = $field->type; + $F->default = $field->def; + $F->max_length = $field->max_length; + + // At this moment primary_key property is not returned when + // cubrid_fetch_field is called. The following code will + // provide a patch for it. primary_key property will be added + // in the next release. + + // TODO: later version of CUBRID will provide primary_key + // property. + // When PK is defined in CUBRID, an index is automatically + // created in the db_index system table in the form of + // pk_tblname_fieldname. So the following will count how many + // columns are there which satisfy this format. + // The query will search for exact single columns, thus + // compound PK is not supported. + $res = cubrid_query($this->conn_id, + "SELECT COUNT(*) FROM db_index WHERE class_name = '" . $field->table . + "' AND is_primary_key = 'YES' AND index_name = 'pk_" . + $field->table . "_" . $field->name . "'" + ); + + if ($res) + { + $row = cubrid_fetch_array($res, CUBRID_NUM); + $F->primary_key = ($row[0] > 0 ? 1 : null); + } + else + { + $F->primary_key = null; + } + + if (is_resource($res)) + { + cubrid_close_request($res); + $this->result_id = FALSE; + } + + $retval[] = $F; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return null + */ + function free_result() + { + if(is_resource($this->result_id) || + get_resource_type($this->result_id) == "Unknown" && + preg_match('/Resource id #/', strval($this->result_id))) + { + cubrid_close_request($this->result_id); + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero + * + * @access private + * @return array + */ + function _data_seek($n = 0) + { + return cubrid_data_seek($this->result_id, $n); + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @access private + * @return array + */ + function _fetch_assoc() + { + return cubrid_fetch_assoc($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @access private + * @return object + */ + function _fetch_object() + { + return cubrid_fetch_object($this->result_id); + } + +} + + +/* End of file cubrid_result.php */ +/* Location: ./system/database/drivers/cubrid/cubrid_result.php */ \ No newline at end of file diff --git a/system/database/drivers/cubrid/cubrid_utility.php b/system/database/drivers/cubrid/cubrid_utility.php new file mode 100644 index 0000000..4cd7bb5 --- /dev/null +++ b/system/database/drivers/cubrid/cubrid_utility.php @@ -0,0 +1,109 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CUBRID Utility Class + * + * @category Database + * @author Esen Sagynov + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_cubrid_utility extends CI_DB_utility { + + /** + * List databases + * + * @access private + * @return array + */ + function _list_databases() + { + // CUBRID does not allow to see the list of all databases on the + // server. It is the way its architecture is designed. Every + // database is independent and isolated. + // For this reason we can return only the name of the currect + // connected database. + if ($this->conn_id) + { + return "SELECT '" . $this->database . "'"; + } + else + { + return FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Optimize table query + * + * Generates a platform-specific query so that a table can be optimized + * + * @access private + * @param string the table name + * @return object + * @link http://www.cubrid.org/manual/840/en/Optimize%20Database + */ + function _optimize_table($table) + { + // No SQL based support in CUBRID as of version 8.4.0. Database or + // table optimization can be performed using CUBRID Manager + // database administration tool. See the link above for more info. + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Repair table query + * + * Generates a platform-specific query so that a table can be repaired + * + * @access private + * @param string the table name + * @return object + * @link http://www.cubrid.org/manual/840/en/Checking%20Database%20Consistency + */ + function _repair_table($table) + { + // Not supported in CUBRID as of version 8.4.0. Database or + // table consistency can be checked using CUBRID Manager + // database administration tool. See the link above for more info. + return FALSE; + } + + // -------------------------------------------------------------------- + /** + * CUBRID Export + * + * @access private + * @param array Preferences + * @return mixed + */ + function _backup($params = array()) + { + // No SQL based support in CUBRID as of version 8.4.0. Database or + // table backup can be performed using CUBRID Manager + // database administration tool. + return $this->db->display_error('db_unsuported_feature'); + } +} + +/* End of file cubrid_utility.php */ +/* Location: ./system/database/drivers/cubrid/cubrid_utility.php */ \ No newline at end of file diff --git a/system/database/drivers/cubrid/index.html b/system/database/drivers/cubrid/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/system/database/drivers/cubrid/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/system/database/drivers/index.html b/system/database/drivers/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/system/database/drivers/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/system/database/drivers/mssql/index.html b/system/database/drivers/mssql/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/system/database/drivers/mssql/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/system/database/drivers/mssql/mssql_driver.php b/system/database/drivers/mssql/mssql_driver.php new file mode 100644 index 0000000..f3d633c --- /dev/null +++ b/system/database/drivers/mssql/mssql_driver.php @@ -0,0 +1,668 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * MS SQL Database Adapter Class + * + * Note: _DB is an extender class that the app controller + * creates dynamically based on whether the active record + * class is being used or not. + * + * @package CodeIgniter + * @subpackage Drivers + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_mssql_driver extends CI_DB { + + var $dbdriver = 'mssql'; + + // The character used for escaping + var $_escape_char = ''; + + // clause and character used for LIKE escape sequences + var $_like_escape_str = " ESCAPE '%s' "; + var $_like_escape_chr = '!'; + + /** + * The syntax to count rows is slightly different across different + * database engines, so this string appears in each driver and is + * used for the count_all() and count_all_results() functions. + */ + var $_count_string = "SELECT COUNT(*) AS "; + var $_random_keyword = ' ASC'; // not currently supported + + /** + * Non-persistent database connection + * + * @access private called by the base class + * @return resource + */ + function db_connect() + { + if ($this->port != '') + { + $this->hostname .= ','.$this->port; + } + + return @mssql_connect($this->hostname, $this->username, $this->password); + } + + // -------------------------------------------------------------------- + + /** + * Persistent database connection + * + * @access private called by the base class + * @return resource + */ + function db_pconnect() + { + if ($this->port != '') + { + $this->hostname .= ','.$this->port; + } + + return @mssql_pconnect($this->hostname, $this->username, $this->password); + } + + // -------------------------------------------------------------------- + + /** + * Reconnect + * + * Keep / reestablish the db connection if no queries have been + * sent for a length of time exceeding the server's idle timeout + * + * @access public + * @return void + */ + function reconnect() + { + // not implemented in MSSQL + } + + // -------------------------------------------------------------------- + + /** + * Select the database + * + * @access private called by the base class + * @return resource + */ + function db_select() + { + // Note: The brackets are required in the event that the DB name + // contains reserved characters + return @mssql_select_db('['.$this->database.']', $this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Set client character set + * + * @access public + * @param string + * @param string + * @return resource + */ + function db_set_charset($charset, $collation) + { + // @todo - add support if needed + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @access private called by the base class + * @param string an SQL query + * @return resource + */ + function _execute($sql) + { + $sql = $this->_prep_query($sql); + return @mssql_query($sql, $this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Prep the query + * + * If needed, each database adapter can prep the query string + * + * @access private called by execute() + * @param string an SQL query + * @return string + */ + function _prep_query($sql) + { + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @access public + * @return bool + */ + function trans_begin($test_mode = FALSE) + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + // Reset the transaction failure flag. + // If the $test_mode flag is set to TRUE transactions will be rolled back + // even if the queries produce a successful result. + $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; + + $this->simple_query('BEGIN TRAN'); + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @access public + * @return bool + */ + function trans_commit() + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + $this->simple_query('COMMIT TRAN'); + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @access public + * @return bool + */ + function trans_rollback() + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + $this->simple_query('ROLLBACK TRAN'); + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Escape String + * + * @access public + * @param string + * @param bool whether or not the string will be used in a LIKE condition + * @return string + */ + function escape_str($str, $like = FALSE) + { + if (is_array($str)) + { + foreach ($str as $key => $val) + { + $str[$key] = $this->escape_str($val, $like); + } + + return $str; + } + + // Escape single quotes + $str = str_replace("'", "''", remove_invisible_characters($str)); + + // escape LIKE condition wildcards + if ($like === TRUE) + { + $str = str_replace( + array($this->_like_escape_chr, '%', '_'), + array($this->_like_escape_chr.$this->_like_escape_chr, $this->_like_escape_chr.'%', $this->_like_escape_chr.'_'), + $str + ); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @access public + * @return integer + */ + function affected_rows() + { + return @mssql_rows_affected($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * Returns the last id created in the Identity column. + * + * @access public + * @return integer + */ + function insert_id() + { + $ver = self::_parse_major_version($this->version()); + $sql = ($ver >= 8 ? "SELECT SCOPE_IDENTITY() AS last_id" : "SELECT @@IDENTITY AS last_id"); + $query = $this->query($sql); + $row = $query->row(); + return $row->last_id; + } + + // -------------------------------------------------------------------- + + /** + * Parse major version + * + * Grabs the major version number from the + * database server version string passed in. + * + * @access private + * @param string $version + * @return int16 major version number + */ + function _parse_major_version($version) + { + preg_match('/([0-9]+)\.([0-9]+)\.([0-9]+)/', $version, $ver_info); + return $ver_info[1]; // return the major version b/c that's all we're interested in. + } + + // -------------------------------------------------------------------- + + /** + * Version number query string + * + * @access public + * @return string + */ + function _version() + { + return "SELECT @@VERSION AS ver"; + } + + // -------------------------------------------------------------------- + + /** + * "Count All" query + * + * Generates a platform-specific query string that counts all records in + * the specified database + * + * @access public + * @param string + * @return string + */ + function count_all($table = '') + { + if ($table == '') + { + return 0; + } + + $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); + + if ($query->num_rows() == 0) + { + return 0; + } + + $row = $query->row(); + $this->_reset_select(); + return (int) $row->numrows; + } + + // -------------------------------------------------------------------- + + /** + * List table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @access private + * @param boolean + * @return string + */ + function _list_tables($prefix_limit = FALSE) + { + $sql = "SELECT name FROM sysobjects WHERE type = 'U' ORDER BY name"; + + // for future compatibility + if ($prefix_limit !== FALSE AND $this->dbprefix != '') + { + //$sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); + return FALSE; // not currently supported + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * List column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @access private + * @param string the table name + * @return string + */ + function _list_columns($table = '') + { + return "SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = '".$table."'"; + } + + // -------------------------------------------------------------------- + + /** + * Field data query + * + * Generates a platform-specific query so that the column data can be retrieved + * + * @access public + * @param string the table name + * @return object + */ + function _field_data($table) + { + return "SELECT TOP 1 * FROM ".$table; + } + + // -------------------------------------------------------------------- + + /** + * The error message string + * + * @access private + * @return string + */ + function _error_message() + { + return mssql_get_last_message(); + } + + // -------------------------------------------------------------------- + + /** + * The error message number + * + * @access private + * @return integer + */ + function _error_number() + { + // Are error numbers supported? + return ''; + } + + // -------------------------------------------------------------------- + + /** + * Escape the SQL Identifiers + * + * This function escapes column and table names + * + * @access private + * @param string + * @return string + */ + function _escape_identifiers($item) + { + if ($this->_escape_char == '') + { + return $item; + } + + foreach ($this->_reserved_identifiers as $id) + { + if (strpos($item, '.'.$id) !== FALSE) + { + $str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); + + // remove duplicates if the user already included the escape + return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); + } + } + + if (strpos($item, '.') !== FALSE) + { + $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; + } + else + { + $str = $this->_escape_char.$item.$this->_escape_char; + } + + // remove duplicates if the user already included the escape + return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); + } + + // -------------------------------------------------------------------- + + /** + * From Tables + * + * This function implicitly groups FROM tables so there is no confusion + * about operator precedence in harmony with SQL standards + * + * @access public + * @param type + * @return type + */ + function _from_tables($tables) + { + if ( ! is_array($tables)) + { + $tables = array($tables); + } + + return implode(', ', $tables); + } + + // -------------------------------------------------------------------- + + /** + * Insert statement + * + * Generates a platform-specific insert string from the supplied data + * + * @access public + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + function _insert($table, $keys, $values) + { + return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @access public + * @param string the table name + * @param array the update data + * @param array the where clause + * @param array the orderby clause + * @param array the limit clause + * @return string + */ + function _update($table, $values, $where, $orderby = array(), $limit = FALSE) + { + foreach ($values as $key => $val) + { + $valstr[] = $key." = ".$val; + } + + $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; + + $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; + + $sql = "UPDATE ".$table." SET ".implode(', ', $valstr); + + $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; + + $sql .= $orderby.$limit; + + return $sql; + } + + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * If the database does not support the truncate() command + * This function maps to "DELETE FROM table" + * + * @access public + * @param string the table name + * @return string + */ + function _truncate($table) + { + return "TRUNCATE ".$table; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @access public + * @param string the table name + * @param array the where clause + * @param string the limit clause + * @return string + */ + function _delete($table, $where = array(), $like = array(), $limit = FALSE) + { + $conditions = ''; + + if (count($where) > 0 OR count($like) > 0) + { + $conditions = "\nWHERE "; + $conditions .= implode("\n", $this->ar_where); + + if (count($where) > 0 && count($like) > 0) + { + $conditions .= " AND "; + } + $conditions .= implode("\n", $like); + } + + $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; + + return "DELETE FROM ".$table.$conditions.$limit; + } + + // -------------------------------------------------------------------- + + /** + * Limit string + * + * Generates a platform-specific LIMIT clause + * + * @access public + * @param string the sql query string + * @param integer the number of rows to limit the query to + * @param integer the offset value + * @return string + */ + function _limit($sql, $limit, $offset) + { + $i = $limit + $offset; + + return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$i.' ', $sql); + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @access public + * @param resource + * @return void + */ + function _close($conn_id) + { + @mssql_close($conn_id); + } + +} + + + +/* End of file mssql_driver.php */ +/* Location: ./system/database/drivers/mssql/mssql_driver.php */ \ No newline at end of file diff --git a/system/database/drivers/mssql/mssql_forge.php b/system/database/drivers/mssql/mssql_forge.php new file mode 100644 index 0000000..579a8ee --- /dev/null +++ b/system/database/drivers/mssql/mssql_forge.php @@ -0,0 +1,249 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * MS SQL Forge Class + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_mssql_forge extends CI_DB_forge { + + /** + * Create database + * + * @access private + * @param string the database name + * @return bool + */ + function _create_database($name) + { + return "CREATE DATABASE ".$name; + } + + // -------------------------------------------------------------------- + + /** + * Drop database + * + * @access private + * @param string the database name + * @return bool + */ + function _drop_database($name) + { + return "DROP DATABASE ".$name; + } + + // -------------------------------------------------------------------- + + /** + * Drop Table + * + * @access private + * @return bool + */ + function _drop_table($table) + { + return "DROP TABLE ".$this->db->_escape_identifiers($table); + } + + // -------------------------------------------------------------------- + + /** + * Create Table + * + * @access private + * @param string the table name + * @param array the fields + * @param mixed primary key(s) + * @param mixed key(s) + * @param boolean should 'IF NOT EXISTS' be added to the SQL + * @return bool + */ + function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) + { + $sql = 'CREATE TABLE '; + + if ($if_not_exists === TRUE) + { + $sql .= 'IF NOT EXISTS '; + } + + $sql .= $this->db->_escape_identifiers($table)." ("; + $current_field_count = 0; + + foreach ($fields as $field=>$attributes) + { + // Numeric field names aren't allowed in databases, so if the key is + // numeric, we know it was assigned by PHP and the developer manually + // entered the field information, so we'll simply add it to the list + if (is_numeric($field)) + { + $sql .= "\n\t$attributes"; + } + else + { + $attributes = array_change_key_case($attributes, CASE_UPPER); + + $sql .= "\n\t".$this->db->_protect_identifiers($field); + + $sql .= ' '.$attributes['TYPE']; + + if (array_key_exists('CONSTRAINT', $attributes)) + { + $sql .= '('.$attributes['CONSTRAINT'].')'; + } + + if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) + { + $sql .= ' UNSIGNED'; + } + + if (array_key_exists('DEFAULT', $attributes)) + { + $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; + } + + if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) + { + $sql .= ' NULL'; + } + else + { + $sql .= ' NOT NULL'; + } + + if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) + { + $sql .= ' AUTO_INCREMENT'; + } + } + + // don't add a comma on the end of the last field + if (++$current_field_count < count($fields)) + { + $sql .= ','; + } + } + + if (count($primary_keys) > 0) + { + $primary_keys = $this->db->_protect_identifiers($primary_keys); + $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; + } + + if (is_array($keys) && count($keys) > 0) + { + foreach ($keys as $key) + { + if (is_array($key)) + { + $key = $this->db->_protect_identifiers($key); + } + else + { + $key = array($this->db->_protect_identifiers($key)); + } + + $sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")"; + } + } + + $sql .= "\n)"; + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Alter table query + * + * Generates a platform-specific query so that a table can be altered + * Called by add_column(), drop_column(), and column_alter(), + * + * @access private + * @param string the ALTER type (ADD, DROP, CHANGE) + * @param string the column name + * @param string the table name + * @param string the column definition + * @param string the default value + * @param boolean should 'NOT NULL' be added + * @param string the field after which we should add the new field + * @return object + */ + function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '') + { + $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name); + + // DROP has everything it needs now. + if ($alter_type == 'DROP') + { + return $sql; + } + + $sql .= " $column_definition"; + + if ($default_value != '') + { + $sql .= " DEFAULT \"$default_value\""; + } + + if ($null === NULL) + { + $sql .= ' NULL'; + } + else + { + $sql .= ' NOT NULL'; + } + + if ($after_field != '') + { + $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); + } + + return $sql; + + } + + // -------------------------------------------------------------------- + + /** + * Rename a table + * + * Generates a platform-specific query so that a table can be renamed + * + * @access private + * @param string the old table name + * @param string the new table name + * @return string + */ + function _rename_table($table_name, $new_table_name) + { + // I think this syntax will work, but can find little documentation on renaming tables in MSSQL + $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); + return $sql; + } + +} + +/* End of file mssql_forge.php */ +/* Location: ./system/database/drivers/mssql/mssql_forge.php */ \ No newline at end of file diff --git a/system/database/drivers/mssql/mssql_result.php b/system/database/drivers/mssql/mssql_result.php new file mode 100644 index 0000000..6ad24e4 --- /dev/null +++ b/system/database/drivers/mssql/mssql_result.php @@ -0,0 +1,170 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * MS SQL Result Class + * + * This class extends the parent result class: CI_DB_result + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_mssql_result extends CI_DB_result { + + /** + * Number of rows in the result set + * + * @access public + * @return integer + */ + function num_rows() + { + return @mssql_num_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @access public + * @return integer + */ + function num_fields() + { + return @mssql_num_fields($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @access public + * @return array + */ + function list_fields() + { + $field_names = array(); + while ($field = mssql_fetch_field($this->result_id)) + { + $field_names[] = $field->name; + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @access public + * @return array + */ + function field_data() + { + $retval = array(); + while ($field = mssql_fetch_field($this->result_id)) + { + $F = new stdClass(); + $F->name = $field->name; + $F->type = $field->type; + $F->max_length = $field->max_length; + $F->primary_key = 0; + $F->default = ''; + + $retval[] = $F; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return null + */ + function free_result() + { + if (is_resource($this->result_id)) + { + mssql_free_result($this->result_id); + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero + * + * @access private + * @return array + */ + function _data_seek($n = 0) + { + return mssql_data_seek($this->result_id, $n); + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @access private + * @return array + */ + function _fetch_assoc() + { + return mssql_fetch_assoc($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @access private + * @return object + */ + function _fetch_object() + { + return mssql_fetch_object($this->result_id); + } + +} + + +/* End of file mssql_result.php */ +/* Location: ./system/database/drivers/mssql/mssql_result.php */ \ No newline at end of file diff --git a/system/database/drivers/mssql/mssql_utility.php b/system/database/drivers/mssql/mssql_utility.php new file mode 100644 index 0000000..96014b9 --- /dev/null +++ b/system/database/drivers/mssql/mssql_utility.php @@ -0,0 +1,89 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * MS SQL Utility Class + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_mssql_utility extends CI_DB_utility { + + /** + * List databases + * + * @access private + * @return bool + */ + function _list_databases() + { + return "EXEC sp_helpdb"; // Can also be: EXEC sp_databases + } + + // -------------------------------------------------------------------- + + /** + * Optimize table query + * + * Generates a platform-specific query so that a table can be optimized + * + * @access private + * @param string the table name + * @return object + */ + function _optimize_table($table) + { + return FALSE; // Is this supported in MS SQL? + } + + // -------------------------------------------------------------------- + + /** + * Repair table query + * + * Generates a platform-specific query so that a table can be repaired + * + * @access private + * @param string the table name + * @return object + */ + function _repair_table($table) + { + return FALSE; // Is this supported in MS SQL? + } + + // -------------------------------------------------------------------- + + /** + * MSSQL Export + * + * @access private + * @param array Preferences + * @return mixed + */ + function _backup($params = array()) + { + // Currently unsupported + return $this->db->display_error('db_unsuported_feature'); + } + +} + +/* End of file mssql_utility.php */ +/* Location: ./system/database/drivers/mssql/mssql_utility.php */ \ No newline at end of file diff --git a/system/database/drivers/mysql/index.html b/system/database/drivers/mysql/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/system/database/drivers/mysql/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/system/database/drivers/mysql/mysql_driver.php b/system/database/drivers/mysql/mysql_driver.php new file mode 100644 index 0000000..3f2a9a0 --- /dev/null +++ b/system/database/drivers/mysql/mysql_driver.php @@ -0,0 +1,769 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * MySQL Database Adapter Class + * + * Note: _DB is an extender class that the app controller + * creates dynamically based on whether the active record + * class is being used or not. + * + * @package CodeIgniter + * @subpackage Drivers + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_mysql_driver extends CI_DB { + + var $dbdriver = 'mysql'; + + // The character used for escaping + var $_escape_char = '`'; + + // clause and character used for LIKE escape sequences - not used in MySQL + var $_like_escape_str = ''; + var $_like_escape_chr = ''; + + /** + * Whether to use the MySQL "delete hack" which allows the number + * of affected rows to be shown. Uses a preg_replace when enabled, + * adding a bit more processing to all queries. + */ + var $delete_hack = TRUE; + + /** + * The syntax to count rows is slightly different across different + * database engines, so this string appears in each driver and is + * used for the count_all() and count_all_results() functions. + */ + var $_count_string = 'SELECT COUNT(*) AS '; + var $_random_keyword = ' RAND()'; // database specific random keyword + + // whether SET NAMES must be used to set the character set + var $use_set_names; + + /** + * Non-persistent database connection + * + * @access private called by the base class + * @return resource + */ + function db_connect() + { + if ($this->port != '') + { + $this->hostname .= ':'.$this->port; + } + + return @mysql_connect($this->hostname, $this->username, $this->password, TRUE); + } + + // -------------------------------------------------------------------- + + /** + * Persistent database connection + * + * @access private called by the base class + * @return resource + */ + function db_pconnect() + { + if ($this->port != '') + { + $this->hostname .= ':'.$this->port; + } + + return @mysql_pconnect($this->hostname, $this->username, $this->password); + } + + // -------------------------------------------------------------------- + + /** + * Reconnect + * + * Keep / reestablish the db connection if no queries have been + * sent for a length of time exceeding the server's idle timeout + * + * @access public + * @return void + */ + function reconnect() + { + if (mysql_ping($this->conn_id) === FALSE) + { + $this->conn_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Select the database + * + * @access private called by the base class + * @return resource + */ + function db_select() + { + return @mysql_select_db($this->database, $this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Set client character set + * + * @access public + * @param string + * @param string + * @return resource + */ + function db_set_charset($charset, $collation) + { + if ( ! isset($this->use_set_names)) + { + // mysql_set_charset() requires PHP >= 5.2.3 and MySQL >= 5.0.7, use SET NAMES as fallback + $this->use_set_names = (version_compare(PHP_VERSION, '5.2.3', '>=') && version_compare(mysql_get_server_info(), '5.0.7', '>=')) ? FALSE : TRUE; + } + + if ($this->use_set_names === TRUE) + { + return @mysql_query("SET NAMES '".$this->escape_str($charset)."' COLLATE '".$this->escape_str($collation)."'", $this->conn_id); + } + else + { + return @mysql_set_charset($charset, $this->conn_id); + } + } + + // -------------------------------------------------------------------- + + /** + * Version number query string + * + * @access public + * @return string + */ + function _version() + { + return "SELECT version() AS ver"; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @access private called by the base class + * @param string an SQL query + * @return resource + */ + function _execute($sql) + { + $sql = $this->_prep_query($sql); + return @mysql_query($sql, $this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Prep the query + * + * If needed, each database adapter can prep the query string + * + * @access private called by execute() + * @param string an SQL query + * @return string + */ + function _prep_query($sql) + { + // "DELETE FROM TABLE" returns 0 affected rows This hack modifies + // the query so that it returns the number of affected rows + if ($this->delete_hack === TRUE) + { + if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql)) + { + $sql = preg_replace("/^\s*DELETE\s+FROM\s+(\S+)\s*$/", "DELETE FROM \\1 WHERE 1=1", $sql); + } + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @access public + * @return bool + */ + function trans_begin($test_mode = FALSE) + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + // Reset the transaction failure flag. + // If the $test_mode flag is set to TRUE transactions will be rolled back + // even if the queries produce a successful result. + $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; + + $this->simple_query('SET AUTOCOMMIT=0'); + $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @access public + * @return bool + */ + function trans_commit() + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + $this->simple_query('COMMIT'); + $this->simple_query('SET AUTOCOMMIT=1'); + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @access public + * @return bool + */ + function trans_rollback() + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + $this->simple_query('ROLLBACK'); + $this->simple_query('SET AUTOCOMMIT=1'); + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Escape String + * + * @access public + * @param string + * @param bool whether or not the string will be used in a LIKE condition + * @return string + */ + function escape_str($str, $like = FALSE) + { + if (is_array($str)) + { + foreach ($str as $key => $val) + { + $str[$key] = $this->escape_str($val, $like); + } + + return $str; + } + + $str = mysql_real_escape_string($str, $this->conn_id); + + // escape LIKE condition wildcards + if ($like === TRUE) + { + $str = str_replace(array('%', '_'), array('\\%', '\\_'), $str); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @access public + * @return integer + */ + function affected_rows() + { + return @mysql_affected_rows($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @access public + * @return integer + */ + function insert_id() + { + return @mysql_insert_id($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * "Count All" query + * + * Generates a platform-specific query string that counts all records in + * the specified database + * + * @access public + * @param string + * @return string + */ + function count_all($table = '') + { + if ($table == '') + { + return 0; + } + + $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); + + if ($query->num_rows() == 0) + { + return 0; + } + + $row = $query->row(); + $this->_reset_select(); + return (int) $row->numrows; + } + + // -------------------------------------------------------------------- + + /** + * List table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @access private + * @param boolean + * @return string + */ + function _list_tables($prefix_limit = FALSE) + { + $sql = "SHOW TABLES FROM ".$this->_escape_char.$this->database.$this->_escape_char; + + if ($prefix_limit !== FALSE AND $this->dbprefix != '') + { + $sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%'"; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @access public + * @param string the table name + * @return string + */ + function _list_columns($table = '') + { + return "SHOW COLUMNS FROM ".$this->_protect_identifiers($table, TRUE, NULL, FALSE); + } + + // -------------------------------------------------------------------- + + /** + * Field data query + * + * Generates a platform-specific query so that the column data can be retrieved + * + * @access public + * @param string the table name + * @return object + */ + function _field_data($table) + { + return "DESCRIBE ".$table; + } + + // -------------------------------------------------------------------- + + /** + * The error message string + * + * @access private + * @return string + */ + function _error_message() + { + return mysql_error($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * The error message number + * + * @access private + * @return integer + */ + function _error_number() + { + return mysql_errno($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Escape the SQL Identifiers + * + * This function escapes column and table names + * + * @access private + * @param string + * @return string + */ + function _escape_identifiers($item) + { + if ($this->_escape_char == '') + { + return $item; + } + + foreach ($this->_reserved_identifiers as $id) + { + if (strpos($item, '.'.$id) !== FALSE) + { + $str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); + + // remove duplicates if the user already included the escape + return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); + } + } + + if (strpos($item, '.') !== FALSE) + { + $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; + } + else + { + $str = $this->_escape_char.$item.$this->_escape_char; + } + + // remove duplicates if the user already included the escape + return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); + } + + // -------------------------------------------------------------------- + + /** + * From Tables + * + * This function implicitly groups FROM tables so there is no confusion + * about operator precedence in harmony with SQL standards + * + * @access public + * @param type + * @return type + */ + function _from_tables($tables) + { + if ( ! is_array($tables)) + { + $tables = array($tables); + } + + return '('.implode(', ', $tables).')'; + } + + // -------------------------------------------------------------------- + + /** + * Insert statement + * + * Generates a platform-specific insert string from the supplied data + * + * @access public + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + function _insert($table, $keys, $values) + { + return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; + } + + // -------------------------------------------------------------------- + + + /** + * Replace statement + * + * Generates a platform-specific replace string from the supplied data + * + * @access public + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + function _replace($table, $keys, $values) + { + return "REPLACE INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; + } + + // -------------------------------------------------------------------- + + /** + * Insert_batch statement + * + * Generates a platform-specific insert string from the supplied data + * + * @access public + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + function _insert_batch($table, $keys, $values) + { + return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES ".implode(', ', $values); + } + + // -------------------------------------------------------------------- + + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @access public + * @param string the table name + * @param array the update data + * @param array the where clause + * @param array the orderby clause + * @param array the limit clause + * @return string + */ + function _update($table, $values, $where, $orderby = array(), $limit = FALSE) + { + foreach ($values as $key => $val) + { + $valstr[] = $key . ' = ' . $val; + } + + $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; + + $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; + + $sql = "UPDATE ".$table." SET ".implode(', ', $valstr); + + $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; + + $sql .= $orderby.$limit; + + return $sql; + } + + // -------------------------------------------------------------------- + + + /** + * Update_Batch statement + * + * Generates a platform-specific batch update string from the supplied data + * + * @access public + * @param string the table name + * @param array the update data + * @param array the where clause + * @return string + */ + function _update_batch($table, $values, $index, $where = NULL) + { + $ids = array(); + $where = ($where != '' AND count($where) >=1) ? implode(" ", $where).' AND ' : ''; + + foreach ($values as $key => $val) + { + $ids[] = $val[$index]; + + foreach (array_keys($val) as $field) + { + if ($field != $index) + { + $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; + } + } + } + + $sql = "UPDATE ".$table." SET "; + $cases = ''; + + foreach ($final as $k => $v) + { + $cases .= $k.' = CASE '."\n"; + foreach ($v as $row) + { + $cases .= $row."\n"; + } + + $cases .= 'ELSE '.$k.' END, '; + } + + $sql .= substr($cases, 0, -2); + + $sql .= ' WHERE '.$where.$index.' IN ('.implode(',', $ids).')'; + + return $sql; + } + + // -------------------------------------------------------------------- + + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * If the database does not support the truncate() command + * This function maps to "DELETE FROM table" + * + * @access public + * @param string the table name + * @return string + */ + function _truncate($table) + { + return "TRUNCATE ".$table; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @access public + * @param string the table name + * @param array the where clause + * @param string the limit clause + * @return string + */ + function _delete($table, $where = array(), $like = array(), $limit = FALSE) + { + $conditions = ''; + + if (count($where) > 0 OR count($like) > 0) + { + $conditions = "\nWHERE "; + $conditions .= implode("\n", $this->ar_where); + + if (count($where) > 0 && count($like) > 0) + { + $conditions .= " AND "; + } + $conditions .= implode("\n", $like); + } + + $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; + + return "DELETE FROM ".$table.$conditions.$limit; + } + + // -------------------------------------------------------------------- + + /** + * Limit string + * + * Generates a platform-specific LIMIT clause + * + * @access public + * @param string the sql query string + * @param integer the number of rows to limit the query to + * @param integer the offset value + * @return string + */ + function _limit($sql, $limit, $offset) + { + if ($offset == 0) + { + $offset = ''; + } + else + { + $offset .= ", "; + } + + return $sql."LIMIT ".$offset.$limit; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @access public + * @param resource + * @return void + */ + function _close($conn_id) + { + @mysql_close($conn_id); + } + +} + + +/* End of file mysql_driver.php */ +/* Location: ./system/database/drivers/mysql/mysql_driver.php */ \ No newline at end of file diff --git a/system/database/drivers/mysql/mysql_forge.php b/system/database/drivers/mysql/mysql_forge.php new file mode 100644 index 0000000..5bb9ccd --- /dev/null +++ b/system/database/drivers/mysql/mysql_forge.php @@ -0,0 +1,274 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * MySQL Forge Class + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_mysql_forge extends CI_DB_forge { + + /** + * Create database + * + * @access private + * @param string the database name + * @return bool + */ + function _create_database($name) + { + return "CREATE DATABASE ".$name; + } + + // -------------------------------------------------------------------- + + /** + * Drop database + * + * @access private + * @param string the database name + * @return bool + */ + function _drop_database($name) + { + return "DROP DATABASE ".$name; + } + + // -------------------------------------------------------------------- + + /** + * Process Fields + * + * @access private + * @param mixed the fields + * @return string + */ + function _process_fields($fields) + { + $current_field_count = 0; + $sql = ''; + + foreach ($fields as $field=>$attributes) + { + // Numeric field names aren't allowed in databases, so if the key is + // numeric, we know it was assigned by PHP and the developer manually + // entered the field information, so we'll simply add it to the list + if (is_numeric($field)) + { + $sql .= "\n\t$attributes"; + } + else + { + $attributes = array_change_key_case($attributes, CASE_UPPER); + + $sql .= "\n\t".$this->db->_protect_identifiers($field); + + if (array_key_exists('NAME', $attributes)) + { + $sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' '; + } + + if (array_key_exists('TYPE', $attributes)) + { + $sql .= ' '.$attributes['TYPE']; + + if (array_key_exists('CONSTRAINT', $attributes)) + { + switch ($attributes['TYPE']) + { + case 'decimal': + case 'float': + case 'numeric': + $sql .= '('.implode(',', $attributes['CONSTRAINT']).')'; + break; + + case 'enum': + case 'set': + $sql .= '("'.implode('","', $attributes['CONSTRAINT']).'")'; + break; + + default: + $sql .= '('.$attributes['CONSTRAINT'].')'; + } + } + } + + if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) + { + $sql .= ' UNSIGNED'; + } + + if (array_key_exists('DEFAULT', $attributes)) + { + $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; + } + + if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) + { + $sql .= ' NULL'; + } + else + { + $sql .= ' NOT NULL'; + } + + if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) + { + $sql .= ' AUTO_INCREMENT'; + } + } + + // don't add a comma on the end of the last field + if (++$current_field_count < count($fields)) + { + $sql .= ','; + } + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Create Table + * + * @access private + * @param string the table name + * @param mixed the fields + * @param mixed primary key(s) + * @param mixed key(s) + * @param boolean should 'IF NOT EXISTS' be added to the SQL + * @return bool + */ + function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) + { + $sql = 'CREATE TABLE '; + + if ($if_not_exists === TRUE) + { + $sql .= 'IF NOT EXISTS '; + } + + $sql .= $this->db->_escape_identifiers($table)." ("; + + $sql .= $this->_process_fields($fields); + + if (count($primary_keys) > 0) + { + $key_name = $this->db->_protect_identifiers(implode('_', $primary_keys)); + $primary_keys = $this->db->_protect_identifiers($primary_keys); + $sql .= ",\n\tPRIMARY KEY ".$key_name." (" . implode(', ', $primary_keys) . ")"; + } + + if (is_array($keys) && count($keys) > 0) + { + foreach ($keys as $key) + { + if (is_array($key)) + { + $key_name = $this->db->_protect_identifiers(implode('_', $key)); + $key = $this->db->_protect_identifiers($key); + } + else + { + $key_name = $this->db->_protect_identifiers($key); + $key = array($key_name); + } + + $sql .= ",\n\tKEY {$key_name} (" . implode(', ', $key) . ")"; + } + } + + $sql .= "\n) DEFAULT CHARACTER SET {$this->db->char_set} COLLATE {$this->db->dbcollat};"; + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Drop Table + * + * @access private + * @return string + */ + function _drop_table($table) + { + return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table); + } + + // -------------------------------------------------------------------- + + /** + * Alter table query + * + * Generates a platform-specific query so that a table can be altered + * Called by add_column(), drop_column(), and column_alter(), + * + * @access private + * @param string the ALTER type (ADD, DROP, CHANGE) + * @param string the column name + * @param array fields + * @param string the field after which we should add the new field + * @return object + */ + function _alter_table($alter_type, $table, $fields, $after_field = '') + { + $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type "; + + // DROP has everything it needs now. + if ($alter_type == 'DROP') + { + return $sql.$this->db->_protect_identifiers($fields); + } + + $sql .= $this->_process_fields($fields); + + if ($after_field != '') + { + $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Rename a table + * + * Generates a platform-specific query so that a table can be renamed + * + * @access private + * @param string the old table name + * @param string the new table name + * @return string + */ + function _rename_table($table_name, $new_table_name) + { + $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); + return $sql; + } + +} + +/* End of file mysql_forge.php */ +/* Location: ./system/database/drivers/mysql/mysql_forge.php */ \ No newline at end of file diff --git a/system/database/drivers/mysql/mysql_result.php b/system/database/drivers/mysql/mysql_result.php new file mode 100644 index 0000000..1ea5418 --- /dev/null +++ b/system/database/drivers/mysql/mysql_result.php @@ -0,0 +1,175 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// -------------------------------------------------------------------- + +/** + * MySQL Result Class + * + * This class extends the parent result class: CI_DB_result + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_mysql_result extends CI_DB_result { + + /** + * Number of rows in the result set + * + * @access public + * @return integer + */ + function num_rows() + { + return @mysql_num_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @access public + * @return integer + */ + function num_fields() + { + return @mysql_num_fields($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @access public + * @return array + */ + function list_fields() + { + $field_names = array(); + while ($field = mysql_fetch_field($this->result_id)) + { + $field_names[] = $field->name; + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @access public + * @return array + */ + function field_data() + { + $retval = array(); + while ($field = mysql_fetch_object($this->result_id)) + { + preg_match('/([a-zA-Z]+)(\(\d+\))?/', $field->Type, $matches); + + $type = (array_key_exists(1, $matches)) ? $matches[1] : NULL; + $length = (array_key_exists(2, $matches)) ? preg_replace('/[^\d]/', '', $matches[2]) : NULL; + + $F = new stdClass(); + $F->name = $field->Field; + $F->type = $type; + $F->default = $field->Default; + $F->max_length = $length; + $F->primary_key = ( $field->Key == 'PRI' ? 1 : 0 ); + + $retval[] = $F; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return null + */ + function free_result() + { + if (is_resource($this->result_id)) + { + mysql_free_result($this->result_id); + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero + * + * @access private + * @return array + */ + function _data_seek($n = 0) + { + return mysql_data_seek($this->result_id, $n); + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @access private + * @return array + */ + function _fetch_assoc() + { + return mysql_fetch_assoc($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @access private + * @return object + */ + function _fetch_object() + { + return mysql_fetch_object($this->result_id); + } + +} + + +/* End of file mysql_result.php */ +/* Location: ./system/database/drivers/mysql/mysql_result.php */ \ No newline at end of file diff --git a/system/database/drivers/mysql/mysql_utility.php b/system/database/drivers/mysql/mysql_utility.php new file mode 100644 index 0000000..c3cea62 --- /dev/null +++ b/system/database/drivers/mysql/mysql_utility.php @@ -0,0 +1,211 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * MySQL Utility Class + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_mysql_utility extends CI_DB_utility { + + /** + * List databases + * + * @access private + * @return bool + */ + function _list_databases() + { + return "SHOW DATABASES"; + } + + // -------------------------------------------------------------------- + + /** + * Optimize table query + * + * Generates a platform-specific query so that a table can be optimized + * + * @access private + * @param string the table name + * @return object + */ + function _optimize_table($table) + { + return "OPTIMIZE TABLE ".$this->db->_escape_identifiers($table); + } + + // -------------------------------------------------------------------- + + /** + * Repair table query + * + * Generates a platform-specific query so that a table can be repaired + * + * @access private + * @param string the table name + * @return object + */ + function _repair_table($table) + { + return "REPAIR TABLE ".$this->db->_escape_identifiers($table); + } + + // -------------------------------------------------------------------- + /** + * MySQL Export + * + * @access private + * @param array Preferences + * @return mixed + */ + function _backup($params = array()) + { + if (count($params) == 0) + { + return FALSE; + } + + // Extract the prefs for simplicity + extract($params); + + // Build the output + $output = ''; + foreach ((array)$tables as $table) + { + // Is the table in the "ignore" list? + if (in_array($table, (array)$ignore, TRUE)) + { + continue; + } + + // Get the table schema + $query = $this->db->query("SHOW CREATE TABLE `".$this->db->database.'`.`'.$table.'`'); + + // No result means the table name was invalid + if ($query === FALSE) + { + continue; + } + + // Write out the table schema + $output .= '#'.$newline.'# TABLE STRUCTURE FOR: '.$table.$newline.'#'.$newline.$newline; + + if ($add_drop == TRUE) + { + $output .= 'DROP TABLE IF EXISTS '.$table.';'.$newline.$newline; + } + + $i = 0; + $result = $query->result_array(); + foreach ($result[0] as $val) + { + if ($i++ % 2) + { + $output .= $val.';'.$newline.$newline; + } + } + + // If inserts are not needed we're done... + if ($add_insert == FALSE) + { + continue; + } + + // Grab all the data from the current table + $query = $this->db->query("SELECT * FROM $table"); + + if ($query->num_rows() == 0) + { + continue; + } + + // Fetch the field names and determine if the field is an + // integer type. We use this info to decide whether to + // surround the data with quotes or not + + $i = 0; + $field_str = ''; + $is_int = array(); + while ($field = mysql_fetch_field($query->result_id)) + { + // Most versions of MySQL store timestamp as a string + $is_int[$i] = (in_array( + strtolower(mysql_field_type($query->result_id, $i)), + array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'), //, 'timestamp'), + TRUE) + ) ? TRUE : FALSE; + + // Create a string of field names + $field_str .= '`'.$field->name.'`, '; + $i++; + } + + // Trim off the end comma + $field_str = preg_replace( "/, $/" , "" , $field_str); + + + // Build the insert string + foreach ($query->result_array() as $row) + { + $val_str = ''; + + $i = 0; + foreach ($row as $v) + { + // Is the value NULL? + if ($v === NULL) + { + $val_str .= 'NULL'; + } + else + { + // Escape the data if it's not an integer + if ($is_int[$i] == FALSE) + { + $val_str .= $this->db->escape($v); + } + else + { + $val_str .= $v; + } + } + + // Append a comma + $val_str .= ', '; + $i++; + } + + // Remove the comma at the end of the string + $val_str = preg_replace( "/, $/" , "" , $val_str); + + // Build the INSERT string + $output .= 'INSERT INTO '.$table.' ('.$field_str.') VALUES ('.$val_str.');'.$newline; + } + + $output .= $newline.$newline; + } + + return $output; + } +} + +/* End of file mysql_utility.php */ +/* Location: ./system/database/drivers/mysql/mysql_utility.php */ \ No newline at end of file diff --git a/system/database/drivers/mysqli/index.html b/system/database/drivers/mysqli/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/system/database/drivers/mysqli/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php new file mode 100644 index 0000000..fb5003e --- /dev/null +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -0,0 +1,767 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * MySQLi Database Adapter Class - MySQLi only works with PHP 5 + * + * Note: _DB is an extender class that the app controller + * creates dynamically based on whether the active record + * class is being used or not. + * + * @package CodeIgniter + * @subpackage Drivers + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_mysqli_driver extends CI_DB { + + var $dbdriver = 'mysqli'; + + // The character used for escaping + var $_escape_char = '`'; + + // clause and character used for LIKE escape sequences - not used in MySQL + var $_like_escape_str = ''; + var $_like_escape_chr = ''; + + /** + * The syntax to count rows is slightly different across different + * database engines, so this string appears in each driver and is + * used for the count_all() and count_all_results() functions. + */ + var $_count_string = "SELECT COUNT(*) AS "; + var $_random_keyword = ' RAND()'; // database specific random keyword + + /** + * Whether to use the MySQL "delete hack" which allows the number + * of affected rows to be shown. Uses a preg_replace when enabled, + * adding a bit more processing to all queries. + */ + var $delete_hack = TRUE; + + // whether SET NAMES must be used to set the character set + var $use_set_names; + + // -------------------------------------------------------------------- + + /** + * Non-persistent database connection + * + * @access private called by the base class + * @return resource + */ + function db_connect() + { + if ($this->port != '') + { + return @mysqli_connect($this->hostname, $this->username, $this->password, $this->database, $this->port); + } + else + { + return @mysqli_connect($this->hostname, $this->username, $this->password, $this->database); + } + + } + + // -------------------------------------------------------------------- + + /** + * Persistent database connection + * + * @access private called by the base class + * @return resource + */ + function db_pconnect() + { + return $this->db_connect(); + } + + // -------------------------------------------------------------------- + + /** + * Reconnect + * + * Keep / reestablish the db connection if no queries have been + * sent for a length of time exceeding the server's idle timeout + * + * @access public + * @return void + */ + function reconnect() + { + if (mysqli_ping($this->conn_id) === FALSE) + { + $this->conn_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Select the database + * + * @access private called by the base class + * @return resource + */ + function db_select() + { + return @mysqli_select_db($this->conn_id, $this->database); + } + + // -------------------------------------------------------------------- + + /** + * Set client character set + * + * @access private + * @param string + * @param string + * @return resource + */ + function _db_set_charset($charset, $collation) + { + if ( ! isset($this->use_set_names)) + { + // mysqli_set_charset() requires MySQL >= 5.0.7, use SET NAMES as fallback + $this->use_set_names = (version_compare(mysqli_get_server_info($this->conn_id), '5.0.7', '>=')) ? FALSE : TRUE; + } + + if ($this->use_set_names === TRUE) + { + return @mysqli_query($this->conn_id, "SET NAMES '".$this->escape_str($charset)."' COLLATE '".$this->escape_str($collation)."'"); + } + else + { + return @mysqli_set_charset($this->conn_id, $charset); + } + } + + // -------------------------------------------------------------------- + + /** + * Version number query string + * + * @access public + * @return string + */ + function _version() + { + return "SELECT version() AS ver"; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @access private called by the base class + * @param string an SQL query + * @return resource + */ + function _execute($sql) + { + $sql = $this->_prep_query($sql); + $result = @mysqli_query($this->conn_id, $sql); + return $result; + } + + // -------------------------------------------------------------------- + + /** + * Prep the query + * + * If needed, each database adapter can prep the query string + * + * @access private called by execute() + * @param string an SQL query + * @return string + */ + function _prep_query($sql) + { + // "DELETE FROM TABLE" returns 0 affected rows This hack modifies + // the query so that it returns the number of affected rows + if ($this->delete_hack === TRUE) + { + if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $sql)) + { + $sql = preg_replace("/^\s*DELETE\s+FROM\s+(\S+)\s*$/", "DELETE FROM \\1 WHERE 1=1", $sql); + } + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @access public + * @return bool + */ + function trans_begin($test_mode = FALSE) + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + // Reset the transaction failure flag. + // If the $test_mode flag is set to TRUE transactions will be rolled back + // even if the queries produce a successful result. + $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; + + $this->simple_query('SET AUTOCOMMIT=0'); + $this->simple_query('START TRANSACTION'); // can also be BEGIN or BEGIN WORK + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @access public + * @return bool + */ + function trans_commit() + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + $this->simple_query('COMMIT'); + $this->simple_query('SET AUTOCOMMIT=1'); + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @access public + * @return bool + */ + function trans_rollback() + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + $this->simple_query('ROLLBACK'); + $this->simple_query('SET AUTOCOMMIT=1'); + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Escape String + * + * @access public + * @param string + * @param bool whether or not the string will be used in a LIKE condition + * @return string + */ + function escape_str($str, $like = FALSE) + { + if (is_array($str)) + { + foreach ($str as $key => $val) + { + $str[$key] = $this->escape_str($val, $like); + } + + return $str; + } + + + $str = mysqli_real_escape_string($this->conn_id, $str); + + // escape LIKE condition wildcards + if ($like === TRUE) + { + $str = str_replace(array('%', '_'), array('\\%', '\\_'), $str); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @access public + * @return integer + */ + function affected_rows() + { + return @mysqli_affected_rows($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @access public + * @return integer + */ + function insert_id() + { + return @mysqli_insert_id($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * "Count All" query + * + * Generates a platform-specific query string that counts all records in + * the specified database + * + * @access public + * @param string + * @return string + */ + function count_all($table = '') + { + if ($table == '') + { + return 0; + } + + $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); + + if ($query->num_rows() == 0) + { + return 0; + } + + $row = $query->row(); + $this->_reset_select(); + return (int) $row->numrows; + } + + // -------------------------------------------------------------------- + + /** + * List table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @access private + * @param boolean + * @return string + */ + function _list_tables($prefix_limit = FALSE) + { + $sql = "SHOW TABLES FROM ".$this->_escape_char.$this->database.$this->_escape_char; + + if ($prefix_limit !== FALSE AND $this->dbprefix != '') + { + $sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%'"; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @access public + * @param string the table name + * @return string + */ + function _list_columns($table = '') + { + return "SHOW COLUMNS FROM ".$this->_protect_identifiers($table, TRUE, NULL, FALSE); + } + + // -------------------------------------------------------------------- + + /** + * Field data query + * + * Generates a platform-specific query so that the column data can be retrieved + * + * @access public + * @param string the table name + * @return object + */ + function _field_data($table) + { + return "DESCRIBE ".$table; + } + + // -------------------------------------------------------------------- + + /** + * The error message string + * + * @access private + * @return string + */ + function _error_message() + { + return mysqli_error($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * The error message number + * + * @access private + * @return integer + */ + function _error_number() + { + return mysqli_errno($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Escape the SQL Identifiers + * + * This function escapes column and table names + * + * @access private + * @param string + * @return string + */ + function _escape_identifiers($item) + { + if ($this->_escape_char == '') + { + return $item; + } + + foreach ($this->_reserved_identifiers as $id) + { + if (strpos($item, '.'.$id) !== FALSE) + { + $str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); + + // remove duplicates if the user already included the escape + return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); + } + } + + if (strpos($item, '.') !== FALSE) + { + $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; + } + else + { + $str = $this->_escape_char.$item.$this->_escape_char; + } + + // remove duplicates if the user already included the escape + return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); + } + + // -------------------------------------------------------------------- + + /** + * From Tables + * + * This function implicitly groups FROM tables so there is no confusion + * about operator precedence in harmony with SQL standards + * + * @access public + * @param type + * @return type + */ + function _from_tables($tables) + { + if ( ! is_array($tables)) + { + $tables = array($tables); + } + + return '('.implode(', ', $tables).')'; + } + + // -------------------------------------------------------------------- + + /** + * Insert statement + * + * Generates a platform-specific insert string from the supplied data + * + * @access public + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + function _insert($table, $keys, $values) + { + return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; + } + + // -------------------------------------------------------------------- + + /** + * Insert_batch statement + * + * Generates a platform-specific insert string from the supplied data + * + * @access public + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + function _insert_batch($table, $keys, $values) + { + return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES ".implode(', ', $values); + } + + // -------------------------------------------------------------------- + + + /** + * Replace statement + * + * Generates a platform-specific replace string from the supplied data + * + * @access public + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + function _replace($table, $keys, $values) + { + return "REPLACE INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @access public + * @param string the table name + * @param array the update data + * @param array the where clause + * @param array the orderby clause + * @param array the limit clause + * @return string + */ + function _update($table, $values, $where, $orderby = array(), $limit = FALSE) + { + foreach ($values as $key => $val) + { + $valstr[] = $key." = ".$val; + } + + $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; + + $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; + + $sql = "UPDATE ".$table." SET ".implode(', ', $valstr); + + $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; + + $sql .= $orderby.$limit; + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Update_Batch statement + * + * Generates a platform-specific batch update string from the supplied data + * + * @access public + * @param string the table name + * @param array the update data + * @param array the where clause + * @return string + */ + function _update_batch($table, $values, $index, $where = NULL) + { + $ids = array(); + $where = ($where != '' AND count($where) >=1) ? implode(" ", $where).' AND ' : ''; + + foreach ($values as $key => $val) + { + $ids[] = $val[$index]; + + foreach (array_keys($val) as $field) + { + if ($field != $index) + { + $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; + } + } + } + + $sql = "UPDATE ".$table." SET "; + $cases = ''; + + foreach ($final as $k => $v) + { + $cases .= $k.' = CASE '."\n"; + foreach ($v as $row) + { + $cases .= $row."\n"; + } + + $cases .= 'ELSE '.$k.' END, '; + } + + $sql .= substr($cases, 0, -2); + + $sql .= ' WHERE '.$where.$index.' IN ('.implode(',', $ids).')'; + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * If the database does not support the truncate() command + * This function maps to "DELETE FROM table" + * + * @access public + * @param string the table name + * @return string + */ + function _truncate($table) + { + return "TRUNCATE ".$table; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @access public + * @param string the table name + * @param array the where clause + * @param string the limit clause + * @return string + */ + function _delete($table, $where = array(), $like = array(), $limit = FALSE) + { + $conditions = ''; + + if (count($where) > 0 OR count($like) > 0) + { + $conditions = "\nWHERE "; + $conditions .= implode("\n", $this->ar_where); + + if (count($where) > 0 && count($like) > 0) + { + $conditions .= " AND "; + } + $conditions .= implode("\n", $like); + } + + $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; + + return "DELETE FROM ".$table.$conditions.$limit; + } + + // -------------------------------------------------------------------- + + /** + * Limit string + * + * Generates a platform-specific LIMIT clause + * + * @access public + * @param string the sql query string + * @param integer the number of rows to limit the query to + * @param integer the offset value + * @return string + */ + function _limit($sql, $limit, $offset) + { + $sql .= "LIMIT ".$limit; + + if ($offset > 0) + { + $sql .= " OFFSET ".$offset; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @access public + * @param resource + * @return void + */ + function _close($conn_id) + { + @mysqli_close($conn_id); + } + + +} + + +/* End of file mysqli_driver.php */ +/* Location: ./system/database/drivers/mysqli/mysqli_driver.php */ \ No newline at end of file diff --git a/system/database/drivers/mysqli/mysqli_forge.php b/system/database/drivers/mysqli/mysqli_forge.php new file mode 100644 index 0000000..cc400d4 --- /dev/null +++ b/system/database/drivers/mysqli/mysqli_forge.php @@ -0,0 +1,259 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * MySQLi Forge Class + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_mysqli_forge extends CI_DB_forge { + + /** + * Create database + * + * @access private + * @param string the database name + * @return bool + */ + function _create_database($name) + { + return "CREATE DATABASE ".$name; + } + + // -------------------------------------------------------------------- + + /** + * Drop database + * + * @access private + * @param string the database name + * @return bool + */ + function _drop_database($name) + { + return "DROP DATABASE ".$name; + } + + // -------------------------------------------------------------------- + + /** + * Process Fields + * + * @access private + * @param mixed the fields + * @return string + */ + function _process_fields($fields) + { + $current_field_count = 0; + $sql = ''; + + foreach ($fields as $field=>$attributes) + { + // Numeric field names aren't allowed in databases, so if the key is + // numeric, we know it was assigned by PHP and the developer manually + // entered the field information, so we'll simply add it to the list + if (is_numeric($field)) + { + $sql .= "\n\t$attributes"; + } + else + { + $attributes = array_change_key_case($attributes, CASE_UPPER); + + $sql .= "\n\t".$this->db->_protect_identifiers($field); + + if (array_key_exists('NAME', $attributes)) + { + $sql .= ' '.$this->db->_protect_identifiers($attributes['NAME']).' '; + } + + if (array_key_exists('TYPE', $attributes)) + { + $sql .= ' '.$attributes['TYPE']; + } + + if (array_key_exists('CONSTRAINT', $attributes)) + { + $sql .= '('.$attributes['CONSTRAINT'].')'; + } + + if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) + { + $sql .= ' UNSIGNED'; + } + + if (array_key_exists('DEFAULT', $attributes)) + { + $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; + } + + if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) + { + $sql .= ' NULL'; + } + else + { + $sql .= ' NOT NULL'; + } + + if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) + { + $sql .= ' AUTO_INCREMENT'; + } + } + + // don't add a comma on the end of the last field + if (++$current_field_count < count($fields)) + { + $sql .= ','; + } + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Create Table + * + * @access private + * @param string the table name + * @param mixed the fields + * @param mixed primary key(s) + * @param mixed key(s) + * @param boolean should 'IF NOT EXISTS' be added to the SQL + * @return bool + */ + function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) + { + $sql = 'CREATE TABLE '; + + if ($if_not_exists === TRUE) + { + $sql .= 'IF NOT EXISTS '; + } + + $sql .= $this->db->_escape_identifiers($table)." ("; + + $sql .= $this->_process_fields($fields); + + if (count($primary_keys) > 0) + { + $key_name = $this->db->_protect_identifiers(implode('_', $primary_keys)); + $primary_keys = $this->db->_protect_identifiers($primary_keys); + $sql .= ",\n\tPRIMARY KEY ".$key_name." (" . implode(', ', $primary_keys) . ")"; + } + + if (is_array($keys) && count($keys) > 0) + { + foreach ($keys as $key) + { + if (is_array($key)) + { + $key_name = $this->db->_protect_identifiers(implode('_', $key)); + $key = $this->db->_protect_identifiers($key); + } + else + { + $key_name = $this->db->_protect_identifiers($key); + $key = array($key_name); + } + + $sql .= ",\n\tKEY {$key_name} (" . implode(', ', $key) . ")"; + } + } + + $sql .= "\n) DEFAULT CHARACTER SET {$this->db->char_set} COLLATE {$this->db->dbcollat};"; + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Drop Table + * + * @access private + * @return string + */ + function _drop_table($table) + { + return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table); + } + + // -------------------------------------------------------------------- + + /** + * Alter table query + * + * Generates a platform-specific query so that a table can be altered + * Called by add_column(), drop_column(), and column_alter(), + * + * @access private + * @param string the ALTER type (ADD, DROP, CHANGE) + * @param string the column name + * @param array fields + * @param string the field after which we should add the new field + * @return object + */ + function _alter_table($alter_type, $table, $fields, $after_field = '') + { + $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type "; + + // DROP has everything it needs now. + if ($alter_type == 'DROP') + { + return $sql.$this->db->_protect_identifiers($fields); + } + + $sql .= $this->_process_fields($fields); + + if ($after_field != '') + { + $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Rename a table + * + * Generates a platform-specific query so that a table can be renamed + * + * @access private + * @param string the old table name + * @param string the new table name + * @return string + */ + function _rename_table($table_name, $new_table_name) + { + $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); + return $sql; + } + +} + +/* End of file mysqli_forge.php */ +/* Location: ./system/database/drivers/mysqli/mysqli_forge.php */ \ No newline at end of file diff --git a/system/database/drivers/mysqli/mysqli_result.php b/system/database/drivers/mysqli/mysqli_result.php new file mode 100644 index 0000000..4b6bcfb --- /dev/null +++ b/system/database/drivers/mysqli/mysqli_result.php @@ -0,0 +1,175 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * MySQLi Result Class + * + * This class extends the parent result class: CI_DB_result + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_mysqli_result extends CI_DB_result { + + /** + * Number of rows in the result set + * + * @access public + * @return integer + */ + function num_rows() + { + return @mysqli_num_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @access public + * @return integer + */ + function num_fields() + { + return @mysqli_num_fields($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @access public + * @return array + */ + function list_fields() + { + $field_names = array(); + while ($field = mysqli_fetch_field($this->result_id)) + { + $field_names[] = $field->name; + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @access public + * @return array + */ + function field_data() + { + $retval = array(); + while ($field = mysqli_fetch_object($this->result_id)) + { + preg_match('/([a-zA-Z]+)(\(\d+\))?/', $field->Type, $matches); + + $type = (array_key_exists(1, $matches)) ? $matches[1] : NULL; + $length = (array_key_exists(2, $matches)) ? preg_replace('/[^\d]/', '', $matches[2]) : NULL; + + $F = new stdClass(); + $F->name = $field->Field; + $F->type = $type; + $F->default = $field->Default; + $F->max_length = $length; + $F->primary_key = ( $field->Key == 'PRI' ? 1 : 0 ); + + $retval[] = $F; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return null + */ + function free_result() + { + if (is_object($this->result_id)) + { + mysqli_free_result($this->result_id); + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero + * + * @access private + * @return array + */ + function _data_seek($n = 0) + { + return mysqli_data_seek($this->result_id, $n); + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @access private + * @return array + */ + function _fetch_assoc() + { + return mysqli_fetch_assoc($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @access private + * @return object + */ + function _fetch_object() + { + return mysqli_fetch_object($this->result_id); + } + +} + + +/* End of file mysqli_result.php */ +/* Location: ./system/database/drivers/mysqli/mysqli_result.php */ \ No newline at end of file diff --git a/system/database/drivers/mysqli/mysqli_utility.php b/system/database/drivers/mysqli/mysqli_utility.php new file mode 100644 index 0000000..93b0da0 --- /dev/null +++ b/system/database/drivers/mysqli/mysqli_utility.php @@ -0,0 +1,88 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * MySQLi Utility Class + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_mysqli_utility extends CI_DB_utility { + + /** + * List databases + * + * @access private + * @return bool + */ + function _list_databases() + { + return "SHOW DATABASES"; + } + + // -------------------------------------------------------------------- + + /** + * Optimize table query + * + * Generates a platform-specific query so that a table can be optimized + * + * @access private + * @param string the table name + * @return object + */ + function _optimize_table($table) + { + return "OPTIMIZE TABLE ".$this->db->_escape_identifiers($table); + } + + // -------------------------------------------------------------------- + + /** + * Repair table query + * + * Generates a platform-specific query so that a table can be repaired + * + * @access private + * @param string the table name + * @return object + */ + function _repair_table($table) + { + return "REPAIR TABLE ".$this->db->_escape_identifiers($table); + } + + // -------------------------------------------------------------------- + + /** + * MySQLi Export + * + * @access private + * @param array Preferences + * @return mixed + */ + function _backup($params = array()) + { + // Currently unsupported + return $this->db->display_error('db_unsuported_feature'); + } +} + +/* End of file mysqli_utility.php */ +/* Location: ./system/database/drivers/mysqli/mysqli_utility.php */ \ No newline at end of file diff --git a/system/database/drivers/oci8/index.html b/system/database/drivers/oci8/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/system/database/drivers/oci8/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php new file mode 100644 index 0000000..0728a77 --- /dev/null +++ b/system/database/drivers/oci8/oci8_driver.php @@ -0,0 +1,809 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * oci8 Database Adapter Class + * + * Note: _DB is an extender class that the app controller + * creates dynamically based on whether the active record + * class is being used or not. + * + * @package CodeIgniter + * @subpackage Drivers + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ + +/** + * oci8 Database Adapter Class + * + * This is a modification of the DB_driver class to + * permit access to oracle databases + * + * @author Kelly McArdle + * + */ + +class CI_DB_oci8_driver extends CI_DB { + + var $dbdriver = 'oci8'; + + // The character used for excaping + var $_escape_char = '"'; + + // clause and character used for LIKE escape sequences + var $_like_escape_str = " escape '%s' "; + var $_like_escape_chr = '!'; + + /** + * The syntax to count rows is slightly different across different + * database engines, so this string appears in each driver and is + * used for the count_all() and count_all_results() functions. + */ + var $_count_string = "SELECT COUNT(1) AS "; + var $_random_keyword = ' ASC'; // not currently supported + + // Set "auto commit" by default + var $_commit = OCI_COMMIT_ON_SUCCESS; + + // need to track statement id and cursor id + var $stmt_id; + var $curs_id; + + // if we use a limit, we will add a field that will + // throw off num_fields later + var $limit_used; + + /** + * Non-persistent database connection + * + * @access private called by the base class + * @return resource + */ + public function db_connect() + { + return @oci_connect($this->username, $this->password, $this->hostname, $this->char_set); + } + + // -------------------------------------------------------------------- + + /** + * Persistent database connection + * + * @access private called by the base class + * @return resource + */ + public function db_pconnect() + { + return @oci_pconnect($this->username, $this->password, $this->hostname, $this->char_set); + } + + // -------------------------------------------------------------------- + + /** + * Reconnect + * + * Keep / reestablish the db connection if no queries have been + * sent for a length of time exceeding the server's idle timeout + * + * @access public + * @return void + */ + public function reconnect() + { + // not implemented in oracle + return; + } + + // -------------------------------------------------------------------- + + /** + * Select the database + * + * @access private called by the base class + * @return resource + */ + public function db_select() + { + // Not in Oracle - schemas are actually usernames + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Set client character set + * + * @access public + * @param string + * @param string + * @return resource + */ + public function db_set_charset($charset, $collation) + { + // @todo - add support if needed + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Version number query string + * + * @access protected + * @return string + */ + protected function _version() + { + return oci_server_version($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @access protected called by the base class + * @param string an SQL query + * @return resource + */ + protected function _execute($sql) + { + // oracle must parse the query before it is run. All of the actions with + // the query are based on the statement id returned by ociparse + $this->stmt_id = FALSE; + $this->_set_stmt_id($sql); + oci_set_prefetch($this->stmt_id, 1000); + return @oci_execute($this->stmt_id, $this->_commit); + } + + /** + * Generate a statement ID + * + * @access private + * @param string an SQL query + * @return none + */ + private function _set_stmt_id($sql) + { + if ( ! is_resource($this->stmt_id)) + { + $this->stmt_id = oci_parse($this->conn_id, $this->_prep_query($sql)); + } + } + + // -------------------------------------------------------------------- + + /** + * Prep the query + * + * If needed, each database adapter can prep the query string + * + * @access private called by execute() + * @param string an SQL query + * @return string + */ + private function _prep_query($sql) + { + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * getCursor. Returns a cursor from the datbase + * + * @access public + * @return cursor id + */ + public function get_cursor() + { + $this->curs_id = oci_new_cursor($this->conn_id); + return $this->curs_id; + } + + // -------------------------------------------------------------------- + + /** + * Stored Procedure. Executes a stored procedure + * + * @access public + * @param package package stored procedure is in + * @param procedure stored procedure to execute + * @param params array of parameters + * @return array + * + * params array keys + * + * KEY OPTIONAL NOTES + * name no the name of the parameter should be in :<param_name> format + * value no the value of the parameter. If this is an OUT or IN OUT parameter, + * this should be a reference to a variable + * type yes the type of the parameter + * length yes the max size of the parameter + */ + public function stored_procedure($package, $procedure, $params) + { + if ($package == '' OR $procedure == '' OR ! is_array($params)) + { + if ($this->db_debug) + { + log_message('error', 'Invalid query: '.$package.'.'.$procedure); + return $this->display_error('db_invalid_query'); + } + return FALSE; + } + + // build the query string + $sql = "begin $package.$procedure("; + + $have_cursor = FALSE; + foreach ($params as $param) + { + $sql .= $param['name'] . ","; + + if (array_key_exists('type', $param) && ($param['type'] === OCI_B_CURSOR)) + { + $have_cursor = TRUE; + } + } + $sql = trim($sql, ",") . "); end;"; + + $this->stmt_id = FALSE; + $this->_set_stmt_id($sql); + $this->_bind_params($params); + $this->query($sql, FALSE, $have_cursor); + } + + // -------------------------------------------------------------------- + + /** + * Bind parameters + * + * @access private + * @return none + */ + private function _bind_params($params) + { + if ( ! is_array($params) OR ! is_resource($this->stmt_id)) + { + return; + } + + foreach ($params as $param) + { + foreach (array('name', 'value', 'type', 'length') as $val) + { + if ( ! isset($param[$val])) + { + $param[$val] = ''; + } + } + + oci_bind_by_name($this->stmt_id, $param['name'], $param['value'], $param['length'], $param['type']); + } + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @access public + * @return bool + */ + public function trans_begin($test_mode = FALSE) + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + // Reset the transaction failure flag. + // If the $test_mode flag is set to TRUE transactions will be rolled back + // even if the queries produce a successful result. + $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; + + $this->_commit = OCI_DEFAULT; + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @access public + * @return bool + */ + public function trans_commit() + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + $ret = oci_commit($this->conn_id); + $this->_commit = OCI_COMMIT_ON_SUCCESS; + return $ret; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @access public + * @return bool + */ + public function trans_rollback() + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + $ret = oci_rollback($this->conn_id); + $this->_commit = OCI_COMMIT_ON_SUCCESS; + return $ret; + } + + // -------------------------------------------------------------------- + + /** + * Escape String + * + * @access public + * @param string + * @param bool whether or not the string will be used in a LIKE condition + * @return string + */ + public function escape_str($str, $like = FALSE) + { + if (is_array($str)) + { + foreach ($str as $key => $val) + { + $str[$key] = $this->escape_str($val, $like); + } + + return $str; + } + + $str = remove_invisible_characters($str); + + // escape LIKE condition wildcards + if ($like === TRUE) + { + $str = str_replace( array('%', '_', $this->_like_escape_chr), + array($this->_like_escape_chr.'%', $this->_like_escape_chr.'_', $this->_like_escape_chr.$this->_like_escape_chr), + $str); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @access public + * @return integer + */ + public function affected_rows() + { + return @oci_num_rows($this->stmt_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @access public + * @return integer + */ + public function insert_id() + { + // not supported in oracle + return $this->display_error('db_unsupported_function'); + } + + // -------------------------------------------------------------------- + + /** + * "Count All" query + * + * Generates a platform-specific query string that counts all records in + * the specified database + * + * @access public + * @param string + * @return string + */ + public function count_all($table = '') + { + if ($table == '') + { + return 0; + } + + $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); + + if ($query == FALSE) + { + return 0; + } + + $row = $query->row(); + $this->_reset_select(); + return (int) $row->numrows; + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @access protected + * @param boolean + * @return string + */ + protected function _list_tables($prefix_limit = FALSE) + { + $sql = "SELECT TABLE_NAME FROM ALL_TABLES"; + + if ($prefix_limit !== FALSE AND $this->dbprefix != '') + { + $sql .= " WHERE TABLE_NAME LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @access protected + * @param string the table name + * @return string + */ + protected function _list_columns($table = '') + { + return "SELECT COLUMN_NAME FROM all_tab_columns WHERE table_name = '$table'"; + } + + // -------------------------------------------------------------------- + + /** + * Field data query + * + * Generates a platform-specific query so that the column data can be retrieved + * + * @access public + * @param string the table name + * @return object + */ + protected function _field_data($table) + { + return "SELECT * FROM ".$table." where rownum = 1"; + } + + // -------------------------------------------------------------------- + + /** + * The error message string + * + * @access protected + * @return string + */ + protected function _error_message() + { + // If the error was during connection, no conn_id should be passed + $error = is_resource($this->conn_id) ? oci_error($this->conn_id) : oci_error(); + return $error['message']; + } + + // -------------------------------------------------------------------- + + /** + * The error message number + * + * @access protected + * @return integer + */ + protected function _error_number() + { + // Same as _error_message() + $error = is_resource($this->conn_id) ? oci_error($this->conn_id) : oci_error(); + return $error['code']; + } + + // -------------------------------------------------------------------- + + /** + * Escape the SQL Identifiers + * + * This function escapes column and table names + * + * @access protected + * @param string + * @return string + */ + protected function _escape_identifiers($item) + { + if ($this->_escape_char == '') + { + return $item; + } + + foreach ($this->_reserved_identifiers as $id) + { + if (strpos($item, '.'.$id) !== FALSE) + { + $str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); + + // remove duplicates if the user already included the escape + return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); + } + } + + if (strpos($item, '.') !== FALSE) + { + $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; + } + else + { + $str = $this->_escape_char.$item.$this->_escape_char; + } + + // remove duplicates if the user already included the escape + return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); + } + + // -------------------------------------------------------------------- + + /** + * From Tables + * + * This function implicitly groups FROM tables so there is no confusion + * about operator precedence in harmony with SQL standards + * + * @access protected + * @param type + * @return type + */ + protected function _from_tables($tables) + { + if ( ! is_array($tables)) + { + $tables = array($tables); + } + + return implode(', ', $tables); + } + + // -------------------------------------------------------------------- + + /** + * Insert statement + * + * Generates a platform-specific insert string from the supplied data + * + * @access public + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + protected function _insert($table, $keys, $values) + { + return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; + } + + // -------------------------------------------------------------------- + + /** + * Insert_batch statement + * + * Generates a platform-specific insert string from the supplied data + * + * @access protected + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + protected function _insert_batch($table, $keys, $values) + { + $keys = implode(', ', $keys); + $sql = "INSERT ALL\n"; + + for ($i = 0, $c = count($values); $i < $c; $i++) + { + $sql .= ' INTO ' . $table . ' (' . $keys . ') VALUES ' . $values[$i] . "\n"; + } + + $sql .= 'SELECT * FROM dual'; + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @access protected + * @param string the table name + * @param array the update data + * @param array the where clause + * @param array the orderby clause + * @param array the limit clause + * @return string + */ + protected function _update($table, $values, $where, $orderby = array(), $limit = FALSE) + { + foreach ($values as $key => $val) + { + $valstr[] = $key." = ".$val; + } + + $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; + + $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; + + $sql = "UPDATE ".$table." SET ".implode(', ', $valstr); + + $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; + + $sql .= $orderby.$limit; + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * If the database does not support the truncate() command + * This function maps to "DELETE FROM table" + * + * @access protected + * @param string the table name + * @return string + */ + protected function _truncate($table) + { + return "TRUNCATE TABLE ".$table; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @access protected + * @param string the table name + * @param array the where clause + * @param string the limit clause + * @return string + */ + protected function _delete($table, $where = array(), $like = array(), $limit = FALSE) + { + $conditions = ''; + + if (count($where) > 0 OR count($like) > 0) + { + $conditions = "\nWHERE "; + $conditions .= implode("\n", $this->ar_where); + + if (count($where) > 0 && count($like) > 0) + { + $conditions .= " AND "; + } + $conditions .= implode("\n", $like); + } + + $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; + + return "DELETE FROM ".$table.$conditions.$limit; + } + + // -------------------------------------------------------------------- + + /** + * Limit string + * + * Generates a platform-specific LIMIT clause + * + * @access protected + * @param string the sql query string + * @param integer the number of rows to limit the query to + * @param integer the offset value + * @return string + */ + protected function _limit($sql, $limit, $offset) + { + $limit = $offset + $limit; + $newsql = "SELECT * FROM (select inner_query.*, rownum rnum FROM ($sql) inner_query WHERE rownum < $limit)"; + + if ($offset != 0) + { + $newsql .= " WHERE rnum >= $offset"; + } + + // remember that we used limits + $this->limit_used = TRUE; + + return $newsql; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @access protected + * @param resource + * @return void + */ + protected function _close($conn_id) + { + @oci_close($conn_id); + } + + +} + + + +/* End of file oci8_driver.php */ +/* Location: ./system/database/drivers/oci8/oci8_driver.php */ diff --git a/system/database/drivers/oci8/oci8_forge.php b/system/database/drivers/oci8/oci8_forge.php new file mode 100644 index 0000000..1191801 --- /dev/null +++ b/system/database/drivers/oci8/oci8_forge.php @@ -0,0 +1,249 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Oracle Forge Class + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_oci8_forge extends CI_DB_forge { + + /** + * Create database + * + * @access public + * @param string the database name + * @return bool + */ + function _create_database($name) + { + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Drop database + * + * @access private + * @param string the database name + * @return bool + */ + function _drop_database($name) + { + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Create Table + * + * @access private + * @param string the table name + * @param array the fields + * @param mixed primary key(s) + * @param mixed key(s) + * @param boolean should 'IF NOT EXISTS' be added to the SQL + * @return bool + */ + function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) + { + $sql = 'CREATE TABLE '; + + if ($if_not_exists === TRUE) + { + $sql .= 'IF NOT EXISTS '; + } + + $sql .= $this->db->_escape_identifiers($table)." ("; + $current_field_count = 0; + + foreach ($fields as $field=>$attributes) + { + // Numeric field names aren't allowed in databases, so if the key is + // numeric, we know it was assigned by PHP and the developer manually + // entered the field information, so we'll simply add it to the list + if (is_numeric($field)) + { + $sql .= "\n\t$attributes"; + } + else + { + $attributes = array_change_key_case($attributes, CASE_UPPER); + + $sql .= "\n\t".$this->db->_protect_identifiers($field); + + $sql .= ' '.$attributes['TYPE']; + + if (array_key_exists('CONSTRAINT', $attributes)) + { + $sql .= '('.$attributes['CONSTRAINT'].')'; + } + + if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) + { + $sql .= ' UNSIGNED'; + } + + if (array_key_exists('DEFAULT', $attributes)) + { + $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; + } + + if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) + { + $sql .= ' NULL'; + } + else + { + $sql .= ' NOT NULL'; + } + + if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) + { + $sql .= ' AUTO_INCREMENT'; + } + } + + // don't add a comma on the end of the last field + if (++$current_field_count < count($fields)) + { + $sql .= ','; + } + } + + if (count($primary_keys) > 0) + { + $primary_keys = $this->db->_protect_identifiers($primary_keys); + $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; + } + + if (is_array($keys) && count($keys) > 0) + { + foreach ($keys as $key) + { + if (is_array($key)) + { + $key = $this->db->_protect_identifiers($key); + } + else + { + $key = array($this->db->_protect_identifiers($key)); + } + + $sql .= ",\n\tUNIQUE COLUMNS (" . implode(', ', $key) . ")"; + } + } + + $sql .= "\n)"; + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Drop Table + * + * @access private + * @return bool + */ + function _drop_table($table) + { + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Alter table query + * + * Generates a platform-specific query so that a table can be altered + * Called by add_column(), drop_column(), and column_alter(), + * + * @access private + * @param string the ALTER type (ADD, DROP, CHANGE) + * @param string the column name + * @param string the table name + * @param string the column definition + * @param string the default value + * @param boolean should 'NOT NULL' be added + * @param string the field after which we should add the new field + * @return object + */ + function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '') + { + $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name); + + // DROP has everything it needs now. + if ($alter_type == 'DROP') + { + return $sql; + } + + $sql .= " $column_definition"; + + if ($default_value != '') + { + $sql .= " DEFAULT \"$default_value\""; + } + + if ($null === NULL) + { + $sql .= ' NULL'; + } + else + { + $sql .= ' NOT NULL'; + } + + if ($after_field != '') + { + $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); + } + + return $sql; + + } + + // -------------------------------------------------------------------- + + /** + * Rename a table + * + * Generates a platform-specific query so that a table can be renamed + * + * @access private + * @param string the old table name + * @param string the new table name + * @return string + */ + function _rename_table($table_name, $new_table_name) + { + $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); + return $sql; + } + + +} + +/* End of file oci8_forge.php */ +/* Location: ./system/database/drivers/oci8/oci8_forge.php */ \ No newline at end of file diff --git a/system/database/drivers/oci8/oci8_result.php b/system/database/drivers/oci8/oci8_result.php new file mode 100644 index 0000000..2696421 --- /dev/null +++ b/system/database/drivers/oci8/oci8_result.php @@ -0,0 +1,218 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * oci8 Result Class + * + * This class extends the parent result class: CI_DB_result + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_oci8_result extends CI_DB_result { + + public $stmt_id; + public $curs_id; + public $limit_used; + + /** + * Number of rows in the result set. + * + * Oracle doesn't have a graceful way to retun the number of rows + * so we have to use what amounts to a hack. + * + * @return integer + */ + public function num_rows() + { + if ($this->num_rows === 0 && count($this->result_array()) > 0) + { + $this->num_rows = count($this->result_array()); + @oci_execute($this->stmt_id, OCI_DEFAULT); + + if ($this->curs_id) + { + @oci_execute($this->curs_id, OCI_DEFAULT); + } + } + + return $this->num_rows; + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @access public + * @return integer + */ + public function num_fields() + { + $count = @oci_num_fields($this->stmt_id); + + // if we used a limit we subtract it + if ($this->limit_used) + { + $count = $count - 1; + } + + return $count; + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @access public + * @return array + */ + public function list_fields() + { + $field_names = array(); + for ($c = 1, $fieldCount = $this->num_fields(); $c <= $fieldCount; $c++) + { + $field_names[] = oci_field_name($this->stmt_id, $c); + } + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @access public + * @return array + */ + public function field_data() + { + $retval = array(); + for ($c = 1, $fieldCount = $this->num_fields(); $c <= $fieldCount; $c++) + { + $F = new stdClass(); + $F->name = oci_field_name($this->stmt_id, $c); + $F->type = oci_field_type($this->stmt_id, $c); + $F->max_length = oci_field_size($this->stmt_id, $c); + + $retval[] = $F; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return null + */ + public function free_result() + { + if (is_resource($this->result_id)) + { + oci_free_statement($this->result_id); + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @access protected + * @return array + */ + protected function _fetch_assoc() + { + $id = ($this->curs_id) ? $this->curs_id : $this->stmt_id; + return oci_fetch_assoc($id); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @access protected + * @return object + */ + protected function _fetch_object() + { + $id = ($this->curs_id) ? $this->curs_id : $this->stmt_id; + return @oci_fetch_object($id); + } + + // -------------------------------------------------------------------- + + /** + * Query result. "array" version. + * + * @access public + * @return array + */ + public function result_array() + { + if (count($this->result_array) > 0) + { + return $this->result_array; + } + + $row = NULL; + while ($row = $this->_fetch_assoc()) + { + $this->result_array[] = $row; + } + + return $this->result_array; + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero + * + * @access protected + * @return array + */ + protected function _data_seek($n = 0) + { + return FALSE; // Not needed + } + +} + + +/* End of file oci8_result.php */ +/* Location: ./system/database/drivers/oci8/oci8_result.php */ diff --git a/system/database/drivers/oci8/oci8_utility.php b/system/database/drivers/oci8/oci8_utility.php new file mode 100644 index 0000000..06821c9 --- /dev/null +++ b/system/database/drivers/oci8/oci8_utility.php @@ -0,0 +1,88 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Oracle Utility Class + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_oci8_utility extends CI_DB_utility { + + /** + * List databases + * + * @access private + * @return bool + */ + function _list_databases() + { + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Optimize table query + * + * Generates a platform-specific query so that a table can be optimized + * + * @access private + * @param string the table name + * @return object + */ + function _optimize_table($table) + { + return FALSE; // Is this supported in Oracle? + } + + // -------------------------------------------------------------------- + + /** + * Repair table query + * + * Generates a platform-specific query so that a table can be repaired + * + * @access private + * @param string the table name + * @return object + */ + function _repair_table($table) + { + return FALSE; // Is this supported in Oracle? + } + + // -------------------------------------------------------------------- + + /** + * Oracle Export + * + * @access private + * @param array Preferences + * @return mixed + */ + function _backup($params = array()) + { + // Currently unsupported + return $this->db->display_error('db_unsuported_feature'); + } +} + +/* End of file oci8_utility.php */ +/* Location: ./system/database/drivers/oci8/oci8_utility.php */ \ No newline at end of file diff --git a/system/database/drivers/odbc/index.html b/system/database/drivers/odbc/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/system/database/drivers/odbc/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/system/database/drivers/odbc/odbc_driver.php b/system/database/drivers/odbc/odbc_driver.php new file mode 100644 index 0000000..0613199 --- /dev/null +++ b/system/database/drivers/odbc/odbc_driver.php @@ -0,0 +1,638 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * ODBC Database Adapter Class + * + * Note: _DB is an extender class that the app controller + * creates dynamically based on whether the active record + * class is being used or not. + * + * @package CodeIgniter + * @subpackage Drivers + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_odbc_driver extends CI_DB { + + var $dbdriver = 'odbc'; + + // the character used to excape - not necessary for ODBC + var $_escape_char = ''; + + // clause and character used for LIKE escape sequences + var $_like_escape_str = " {escape '%s'} "; + var $_like_escape_chr = '!'; + + /** + * The syntax to count rows is slightly different across different + * database engines, so this string appears in each driver and is + * used for the count_all() and count_all_results() functions. + */ + var $_count_string = "SELECT COUNT(*) AS "; + var $_random_keyword; + + + function __construct($params) + { + parent::__construct($params); + + $this->_random_keyword = ' RND('.time().')'; // database specific random keyword + } + + /** + * Non-persistent database connection + * + * @access private called by the base class + * @return resource + */ + function db_connect() + { + return @odbc_connect($this->hostname, $this->username, $this->password); + } + + // -------------------------------------------------------------------- + + /** + * Persistent database connection + * + * @access private called by the base class + * @return resource + */ + function db_pconnect() + { + return @odbc_pconnect($this->hostname, $this->username, $this->password); + } + + // -------------------------------------------------------------------- + + /** + * Reconnect + * + * Keep / reestablish the db connection if no queries have been + * sent for a length of time exceeding the server's idle timeout + * + * @access public + * @return void + */ + function reconnect() + { + // not implemented in odbc + } + + // -------------------------------------------------------------------- + + /** + * Select the database + * + * @access private called by the base class + * @return resource + */ + function db_select() + { + // Not needed for ODBC + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Set client character set + * + * @access public + * @param string + * @param string + * @return resource + */ + function db_set_charset($charset, $collation) + { + // @todo - add support if needed + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Version number query string + * + * @access public + * @return string + */ + function _version() + { + return "SELECT version() AS ver"; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @access private called by the base class + * @param string an SQL query + * @return resource + */ + function _execute($sql) + { + $sql = $this->_prep_query($sql); + return @odbc_exec($this->conn_id, $sql); + } + + // -------------------------------------------------------------------- + + /** + * Prep the query + * + * If needed, each database adapter can prep the query string + * + * @access private called by execute() + * @param string an SQL query + * @return string + */ + function _prep_query($sql) + { + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @access public + * @return bool + */ + function trans_begin($test_mode = FALSE) + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + // Reset the transaction failure flag. + // If the $test_mode flag is set to TRUE transactions will be rolled back + // even if the queries produce a successful result. + $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; + + return odbc_autocommit($this->conn_id, FALSE); + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @access public + * @return bool + */ + function trans_commit() + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + $ret = odbc_commit($this->conn_id); + odbc_autocommit($this->conn_id, TRUE); + return $ret; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @access public + * @return bool + */ + function trans_rollback() + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + $ret = odbc_rollback($this->conn_id); + odbc_autocommit($this->conn_id, TRUE); + return $ret; + } + + // -------------------------------------------------------------------- + + /** + * Escape String + * + * @access public + * @param string + * @param bool whether or not the string will be used in a LIKE condition + * @return string + */ + function escape_str($str, $like = FALSE) + { + if (is_array($str)) + { + foreach ($str as $key => $val) + { + $str[$key] = $this->escape_str($val, $like); + } + + return $str; + } + + // ODBC doesn't require escaping + $str = remove_invisible_characters($str); + + // escape LIKE condition wildcards + if ($like === TRUE) + { + $str = str_replace( array('%', '_', $this->_like_escape_chr), + array($this->_like_escape_chr.'%', $this->_like_escape_chr.'_', $this->_like_escape_chr.$this->_like_escape_chr), + $str); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @access public + * @return integer + */ + function affected_rows() + { + return @odbc_num_rows($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @access public + * @return integer + */ + function insert_id() + { + return @odbc_insert_id($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * "Count All" query + * + * Generates a platform-specific query string that counts all records in + * the specified database + * + * @access public + * @param string + * @return string + */ + function count_all($table = '') + { + if ($table == '') + { + return 0; + } + + $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); + + if ($query->num_rows() == 0) + { + return 0; + } + + $row = $query->row(); + $this->_reset_select(); + return (int) $row->numrows; + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @access private + * @param boolean + * @return string + */ + function _list_tables($prefix_limit = FALSE) + { + $sql = "SHOW TABLES FROM `".$this->database."`"; + + if ($prefix_limit !== FALSE AND $this->dbprefix != '') + { + //$sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); + return FALSE; // not currently supported + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @access public + * @param string the table name + * @return string + */ + function _list_columns($table = '') + { + return "SHOW COLUMNS FROM ".$table; + } + + // -------------------------------------------------------------------- + + /** + * Field data query + * + * Generates a platform-specific query so that the column data can be retrieved + * + * @access public + * @param string the table name + * @return object + */ + function _field_data($table) + { + return "SELECT TOP 1 FROM ".$table; + } + + // -------------------------------------------------------------------- + + /** + * The error message string + * + * @access private + * @return string + */ + function _error_message() + { + return odbc_errormsg($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * The error message number + * + * @access private + * @return integer + */ + function _error_number() + { + return odbc_error($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Escape the SQL Identifiers + * + * This function escapes column and table names + * + * @access private + * @param string + * @return string + */ + function _escape_identifiers($item) + { + if ($this->_escape_char == '') + { + return $item; + } + + foreach ($this->_reserved_identifiers as $id) + { + if (strpos($item, '.'.$id) !== FALSE) + { + $str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); + + // remove duplicates if the user already included the escape + return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); + } + } + + if (strpos($item, '.') !== FALSE) + { + $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; + } + else + { + $str = $this->_escape_char.$item.$this->_escape_char; + } + + // remove duplicates if the user already included the escape + return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); + } + + // -------------------------------------------------------------------- + + /** + * From Tables + * + * This function implicitly groups FROM tables so there is no confusion + * about operator precedence in harmony with SQL standards + * + * @access public + * @param type + * @return type + */ + function _from_tables($tables) + { + if ( ! is_array($tables)) + { + $tables = array($tables); + } + + return '('.implode(', ', $tables).')'; + } + + // -------------------------------------------------------------------- + + /** + * Insert statement + * + * Generates a platform-specific insert string from the supplied data + * + * @access public + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + function _insert($table, $keys, $values) + { + return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @access public + * @param string the table name + * @param array the update data + * @param array the where clause + * @param array the orderby clause + * @param array the limit clause + * @return string + */ + function _update($table, $values, $where, $orderby = array(), $limit = FALSE) + { + foreach ($values as $key => $val) + { + $valstr[] = $key." = ".$val; + } + + $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; + + $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; + + $sql = "UPDATE ".$table." SET ".implode(', ', $valstr); + + $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; + + $sql .= $orderby.$limit; + + return $sql; + } + + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * If the database does not support the truncate() command + * This function maps to "DELETE FROM table" + * + * @access public + * @param string the table name + * @return string + */ + function _truncate($table) + { + return $this->_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @access public + * @param string the table name + * @param array the where clause + * @param string the limit clause + * @return string + */ + function _delete($table, $where = array(), $like = array(), $limit = FALSE) + { + $conditions = ''; + + if (count($where) > 0 OR count($like) > 0) + { + $conditions = "\nWHERE "; + $conditions .= implode("\n", $this->ar_where); + + if (count($where) > 0 && count($like) > 0) + { + $conditions .= " AND "; + } + $conditions .= implode("\n", $like); + } + + $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; + + return "DELETE FROM ".$table.$conditions.$limit; + } + + // -------------------------------------------------------------------- + + /** + * Limit string + * + * Generates a platform-specific LIMIT clause + * + * @access public + * @param string the sql query string + * @param integer the number of rows to limit the query to + * @param integer the offset value + * @return string + */ + function _limit($sql, $limit, $offset) + { + // Does ODBC doesn't use the LIMIT clause? + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @access public + * @param resource + * @return void + */ + function _close($conn_id) + { + @odbc_close($conn_id); + } + + +} + + + +/* End of file odbc_driver.php */ +/* Location: ./system/database/drivers/odbc/odbc_driver.php */ \ No newline at end of file diff --git a/system/database/drivers/odbc/odbc_forge.php b/system/database/drivers/odbc/odbc_forge.php new file mode 100644 index 0000000..ed8d9d7 --- /dev/null +++ b/system/database/drivers/odbc/odbc_forge.php @@ -0,0 +1,267 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * ODBC Forge Class + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/database/ + */ +class CI_DB_odbc_forge extends CI_DB_forge { + + /** + * Create database + * + * @access private + * @param string the database name + * @return bool + */ + function _create_database() + { + // ODBC has no "create database" command since it's + // designed to connect to an existing database + if ($this->db->db_debug) + { + return $this->db->display_error('db_unsuported_feature'); + } + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Drop database + * + * @access private + * @param string the database name + * @return bool + */ + function _drop_database($name) + { + // ODBC has no "drop database" command since it's + // designed to connect to an existing database + if ($this->db->db_debug) + { + return $this->db->display_error('db_unsuported_feature'); + } + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Create Table + * + * @access private + * @param string the table name + * @param array the fields + * @param mixed primary key(s) + * @param mixed key(s) + * @param boolean should 'IF NOT EXISTS' be added to the SQL + * @return bool + */ + function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) + { + $sql = 'CREATE TABLE '; + + if ($if_not_exists === TRUE) + { + $sql .= 'IF NOT EXISTS '; + } + + $sql .= $this->db->_escape_identifiers($table)." ("; + $current_field_count = 0; + + foreach ($fields as $field=>$attributes) + { + // Numeric field names aren't allowed in databases, so if the key is + // numeric, we know it was assigned by PHP and the developer manually + // entered the field information, so we'll simply add it to the list + if (is_numeric($field)) + { + $sql .= "\n\t$attributes"; + } + else + { + $attributes = array_change_key_case($attributes, CASE_UPPER); + + $sql .= "\n\t".$this->db->_protect_identifiers($field); + + $sql .= ' '.$attributes['TYPE']; + + if (array_key_exists('CONSTRAINT', $attributes)) + { + $sql .= '('.$attributes['CONSTRAINT'].')'; + } + + if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) + { + $sql .= ' UNSIGNED'; + } + + if (array_key_exists('DEFAULT', $attributes)) + { + $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; + } + + if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) + { + $sql .= ' NULL'; + } + else + { + $sql .= ' NOT NULL'; + } + + if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) + { + $sql .= ' AUTO_INCREMENT'; + } + } + + // don't add a comma on the end of the last field + if (++$current_field_count < count($fields)) + { + $sql .= ','; + } + } + + if (count($primary_keys) > 0) + { + $primary_keys = $this->db->_protect_identifiers($primary_keys); + $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; + } + + if (is_array($keys) && count($keys) > 0) + { + foreach ($keys as $key) + { + if (is_array($key)) + { + $key = $this->db->_protect_identifiers($key); + } + else + { + $key = array($this->db->_protect_identifiers($key)); + } + + $sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")"; + } + } + + $sql .= "\n)"; + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Drop Table + * + * @access private + * @return bool + */ + function _drop_table($table) + { + // Not a supported ODBC feature + if ($this->db->db_debug) + { + return $this->db->display_error('db_unsuported_feature'); + } + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Alter table query + * + * Generates a platform-specific query so that a table can be altered + * Called by add_column(), drop_column(), and column_alter(), + * + * @access private + * @param string the ALTER type (ADD, DROP, CHANGE) + * @param string the column name + * @param string the table name + * @param string the column definition + * @param string the default value + * @param boolean should 'NOT NULL' be added + * @param string the field after which we should add the new field + * @return object + */ + function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '') + { + $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name); + + // DROP has everything it needs now. + if ($alter_type == 'DROP') + { + return $sql; + } + + $sql .= " $column_definition"; + + if ($default_value != '') + { + $sql .= " DEFAULT \"$default_value\""; + } + + if ($null === NULL) + { + $sql .= ' NULL'; + } + else + { + $sql .= ' NOT NULL'; + } + + if ($after_field != '') + { + $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); + } + + return $sql; + + } + + + // -------------------------------------------------------------------- + + /** + * Rename a table + * + * Generates a platform-specific query so that a table can be renamed + * + * @access private + * @param string the old table name + * @param string the new table name + * @return string + */ + function _rename_table($table_name, $new_table_name) + { + $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); + return $sql; + } + + +} + +/* End of file odbc_forge.php */ +/* Location: ./system/database/drivers/odbc/odbc_forge.php */ \ No newline at end of file diff --git a/system/database/drivers/odbc/odbc_result.php b/system/database/drivers/odbc/odbc_result.php new file mode 100644 index 0000000..2f70e0a --- /dev/null +++ b/system/database/drivers/odbc/odbc_result.php @@ -0,0 +1,229 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * ODBC Result Class + * + * This class extends the parent result class: CI_DB_result + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_odbc_result extends CI_DB_result { + + /** + * Number of rows in the result set + * + * @access public + * @return integer + */ + function num_rows() + { + return @odbc_num_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @access public + * @return integer + */ + function num_fields() + { + return @odbc_num_fields($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @access public + * @return array + */ + function list_fields() + { + $field_names = array(); + for ($i = 0; $i < $this->num_fields(); $i++) + { + $field_names[] = odbc_field_name($this->result_id, $i); + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @access public + * @return array + */ + function field_data() + { + $retval = array(); + for ($i = 0; $i < $this->num_fields(); $i++) + { + $F = new stdClass(); + $F->name = odbc_field_name($this->result_id, $i); + $F->type = odbc_field_type($this->result_id, $i); + $F->max_length = odbc_field_len($this->result_id, $i); + $F->primary_key = 0; + $F->default = ''; + + $retval[] = $F; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return null + */ + function free_result() + { + if (is_resource($this->result_id)) + { + odbc_free_result($this->result_id); + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero + * + * @access private + * @return array + */ + function _data_seek($n = 0) + { + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @access private + * @return array + */ + function _fetch_assoc() + { + if (function_exists('odbc_fetch_object')) + { + return odbc_fetch_array($this->result_id); + } + else + { + return $this->_odbc_fetch_array($this->result_id); + } + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @access private + * @return object + */ + function _fetch_object() + { + if (function_exists('odbc_fetch_object')) + { + return odbc_fetch_object($this->result_id); + } + else + { + return $this->_odbc_fetch_object($this->result_id); + } + } + + + /** + * Result - object + * + * subsititutes the odbc_fetch_object function when + * not available (odbc_fetch_object requires unixODBC) + * + * @access private + * @return object + */ + function _odbc_fetch_object(& $odbc_result) { + $rs = array(); + $rs_obj = FALSE; + if (odbc_fetch_into($odbc_result, $rs)) { + foreach ($rs as $k=>$v) { + $field_name= odbc_field_name($odbc_result, $k+1); + $rs_obj->$field_name = $v; + } + } + return $rs_obj; + } + + + /** + * Result - array + * + * subsititutes the odbc_fetch_array function when + * not available (odbc_fetch_array requires unixODBC) + * + * @access private + * @return array + */ + function _odbc_fetch_array(& $odbc_result) { + $rs = array(); + $rs_assoc = FALSE; + if (odbc_fetch_into($odbc_result, $rs)) { + $rs_assoc=array(); + foreach ($rs as $k=>$v) { + $field_name= odbc_field_name($odbc_result, $k+1); + $rs_assoc[$field_name] = $v; + } + } + return $rs_assoc; + } + +} + + +/* End of file odbc_result.php */ +/* Location: ./system/database/drivers/odbc/odbc_result.php */ \ No newline at end of file diff --git a/system/database/drivers/odbc/odbc_utility.php b/system/database/drivers/odbc/odbc_utility.php new file mode 100644 index 0000000..ae099c1 --- /dev/null +++ b/system/database/drivers/odbc/odbc_utility.php @@ -0,0 +1,104 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * ODBC Utility Class + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/database/ + */ +class CI_DB_odbc_utility extends CI_DB_utility { + + /** + * List databases + * + * @access private + * @return bool + */ + function _list_databases() + { + // Not sure if ODBC lets you list all databases... + if ($this->db->db_debug) + { + return $this->db->display_error('db_unsuported_feature'); + } + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Optimize table query + * + * Generates a platform-specific query so that a table can be optimized + * + * @access private + * @param string the table name + * @return object + */ + function _optimize_table($table) + { + // Not a supported ODBC feature + if ($this->db->db_debug) + { + return $this->db->display_error('db_unsuported_feature'); + } + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Repair table query + * + * Generates a platform-specific query so that a table can be repaired + * + * @access private + * @param string the table name + * @return object + */ + function _repair_table($table) + { + // Not a supported ODBC feature + if ($this->db->db_debug) + { + return $this->db->display_error('db_unsuported_feature'); + } + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * ODBC Export + * + * @access private + * @param array Preferences + * @return mixed + */ + function _backup($params = array()) + { + // Currently unsupported + return $this->db->display_error('db_unsuported_feature'); + } + +} + +/* End of file odbc_utility.php */ +/* Location: ./system/database/drivers/odbc/odbc_utility.php */ \ No newline at end of file diff --git a/system/database/drivers/pdo/index.html b/system/database/drivers/pdo/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/system/database/drivers/pdo/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/system/database/drivers/pdo/pdo_driver.php b/system/database/drivers/pdo/pdo_driver.php new file mode 100644 index 0000000..3c2d08b --- /dev/null +++ b/system/database/drivers/pdo/pdo_driver.php @@ -0,0 +1,812 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 2.1.2 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * PDO Database Adapter Class + * + * Note: _DB is an extender class that the app controller + * creates dynamically based on whether the active record + * class is being used or not. + * + * @package CodeIgniter + * @subpackage Drivers + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_pdo_driver extends CI_DB { + + var $dbdriver = 'pdo'; + + // the character used to excape - not necessary for PDO + var $_escape_char = ''; + var $_like_escape_str; + var $_like_escape_chr; + + + /** + * The syntax to count rows is slightly different across different + * database engines, so this string appears in each driver and is + * used for the count_all() and count_all_results() functions. + */ + var $_count_string = "SELECT COUNT(*) AS "; + var $_random_keyword; + + var $options = array(); + + function __construct($params) + { + parent::__construct($params); + + // clause and character used for LIKE escape sequences + if (strpos($this->hostname, 'mysql') !== FALSE) + { + $this->_like_escape_str = ''; + $this->_like_escape_chr = ''; + + //Prior to this version, the charset can't be set in the dsn + if(is_php('5.3.6')) + { + $this->hostname .= ";charset={$this->char_set}"; + } + + //Set the charset with the connection options + $this->options['PDO::MYSQL_ATTR_INIT_COMMAND'] = "SET NAMES {$this->char_set}"; + } + elseif (strpos($this->hostname, 'odbc') !== FALSE) + { + $this->_like_escape_str = " {escape '%s'} "; + $this->_like_escape_chr = '!'; + } + else + { + $this->_like_escape_str = " ESCAPE '%s' "; + $this->_like_escape_chr = '!'; + } + + empty($this->database) OR $this->hostname .= ';dbname='.$this->database; + + $this->trans_enabled = FALSE; + + $this->_random_keyword = ' RND('.time().')'; // database specific random keyword + } + + /** + * Non-persistent database connection + * + * @access private called by the base class + * @return resource + */ + function db_connect() + { + $this->options['PDO::ATTR_ERRMODE'] = PDO::ERRMODE_SILENT; + + return new PDO($this->hostname, $this->username, $this->password, $this->options); + } + + // -------------------------------------------------------------------- + + /** + * Persistent database connection + * + * @access private called by the base class + * @return resource + */ + function db_pconnect() + { + $this->options['PDO::ATTR_ERRMODE'] = PDO::ERRMODE_SILENT; + $this->options['PDO::ATTR_PERSISTENT'] = TRUE; + + return new PDO($this->hostname, $this->username, $this->password, $this->options); + } + + // -------------------------------------------------------------------- + + /** + * Reconnect + * + * Keep / reestablish the db connection if no queries have been + * sent for a length of time exceeding the server's idle timeout + * + * @access public + * @return void + */ + function reconnect() + { + if ($this->db->db_debug) + { + return $this->db->display_error('db_unsuported_feature'); + } + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Select the database + * + * @access private called by the base class + * @return resource + */ + function db_select() + { + // Not needed for PDO + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Set client character set + * + * @access public + * @param string + * @param string + * @return resource + */ + function db_set_charset($charset, $collation) + { + // @todo - add support if needed + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Version number query string + * + * @access public + * @return string + */ + function _version() + { + return $this->conn_id->getAttribute(PDO::ATTR_CLIENT_VERSION); + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @access private called by the base class + * @param string an SQL query + * @return object + */ + function _execute($sql) + { + $sql = $this->_prep_query($sql); + $result_id = $this->conn_id->prepare($sql); + + if (is_object($result_id) && $result_id->execute()) + { + if (is_numeric(stripos($sql, 'SELECT'))) + { + $this->affect_rows = count($result_id->fetchAll()); + } + else + { + $this->affect_rows = $result_id->rowCount(); + } + } + else + { + $this->affect_rows = 0; + return FALSE; + } + + return $result_id; + } + + // -------------------------------------------------------------------- + + /** + * Prep the query + * + * If needed, each database adapter can prep the query string + * + * @access private called by execute() + * @param string an SQL query + * @return string + */ + function _prep_query($sql) + { + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @access public + * @return bool + */ + function trans_begin($test_mode = FALSE) + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + // Reset the transaction failure flag. + // If the $test_mode flag is set to TRUE transactions will be rolled back + // even if the queries produce a successful result. + $this->_trans_failure = (bool) ($test_mode === TRUE); + + return $this->conn_id->beginTransaction(); + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @access public + * @return bool + */ + function trans_commit() + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + $ret = $this->conn->commit(); + return $ret; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @access public + * @return bool + */ + function trans_rollback() + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + $ret = $this->conn_id->rollBack(); + return $ret; + } + + // -------------------------------------------------------------------- + + /** + * Escape String + * + * @access public + * @param string + * @param bool whether or not the string will be used in a LIKE condition + * @return string + */ + function escape_str($str, $like = FALSE) + { + if (is_array($str)) + { + foreach ($str as $key => $val) + { + $str[$key] = $this->escape_str($val, $like); + } + + return $str; + } + + //Escape the string + $str = $this->conn_id->quote($str); + + //If there are duplicated quotes, trim them away + if (strpos($str, "'") === 0) + { + $str = substr($str, 1, -1); + } + + // escape LIKE condition wildcards + if ($like === TRUE) + { + $str = str_replace( array('%', '_', $this->_like_escape_chr), + array($this->_like_escape_chr.'%', $this->_like_escape_chr.'_', $this->_like_escape_chr.$this->_like_escape_chr), + $str); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @access public + * @return integer + */ + function affected_rows() + { + return $this->affect_rows; + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @access public + * @return integer + */ + function insert_id($name=NULL) + { + //Convenience method for postgres insertid + if (strpos($this->hostname, 'pgsql') !== FALSE) + { + $v = $this->_version(); + + $table = func_num_args() > 0 ? func_get_arg(0) : NULL; + + if ($table == NULL && $v >= '8.1') + { + $sql='SELECT LASTVAL() as ins_id'; + } + $query = $this->query($sql); + $row = $query->row(); + return $row->ins_id; + } + else + { + return $this->conn_id->lastInsertId($name); + } + } + + // -------------------------------------------------------------------- + + /** + * "Count All" query + * + * Generates a platform-specific query string that counts all records in + * the specified database + * + * @access public + * @param string + * @return string + */ + function count_all($table = '') + { + if ($table == '') + { + return 0; + } + + $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); + + if ($query->num_rows() == 0) + { + return 0; + } + + $row = $query->row(); + $this->_reset_select(); + return (int) $row->numrows; + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @access private + * @param boolean + * @return string + */ + function _list_tables($prefix_limit = FALSE) + { + $sql = "SHOW TABLES FROM `".$this->database."`"; + + if ($prefix_limit !== FALSE AND $this->dbprefix != '') + { + //$sql .= " LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); + return FALSE; // not currently supported + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @access public + * @param string the table name + * @return string + */ + function _list_columns($table = '') + { + return "SHOW COLUMNS FROM ".$table; + } + + // -------------------------------------------------------------------- + + /** + * Field data query + * + * Generates a platform-specific query so that the column data can be retrieved + * + * @access public + * @param string the table name + * @return object + */ + function _field_data($table) + { + return "SELECT TOP 1 FROM ".$table; + } + + // -------------------------------------------------------------------- + + /** + * The error message string + * + * @access private + * @return string + */ + function _error_message() + { + $error_array = $this->conn_id->errorInfo(); + return $error_array[2]; + } + + // -------------------------------------------------------------------- + + /** + * The error message number + * + * @access private + * @return integer + */ + function _error_number() + { + return $this->conn_id->errorCode(); + } + + // -------------------------------------------------------------------- + + /** + * Escape the SQL Identifiers + * + * This function escapes column and table names + * + * @access private + * @param string + * @return string + */ + function _escape_identifiers($item) + { + if ($this->_escape_char == '') + { + return $item; + } + + foreach ($this->_reserved_identifiers as $id) + { + if (strpos($item, '.'.$id) !== FALSE) + { + $str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); + + // remove duplicates if the user already included the escape + return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); + } + } + + if (strpos($item, '.') !== FALSE) + { + $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; + + } + else + { + $str = $this->_escape_char.$item.$this->_escape_char; + } + + // remove duplicates if the user already included the escape + return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); + } + + // -------------------------------------------------------------------- + + /** + * From Tables + * + * This function implicitly groups FROM tables so there is no confusion + * about operator precedence in harmony with SQL standards + * + * @access public + * @param type + * @return type + */ + function _from_tables($tables) + { + if ( ! is_array($tables)) + { + $tables = array($tables); + } + + return (count($tables) == 1) ? $tables[0] : '('.implode(', ', $tables).')'; + } + + // -------------------------------------------------------------------- + + /** + * Insert statement + * + * Generates a platform-specific insert string from the supplied data + * + * @access public + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + function _insert($table, $keys, $values) + { + return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; + } + + // -------------------------------------------------------------------- + + /** + * Insert_batch statement + * + * Generates a platform-specific insert string from the supplied data + * + * @access public + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + function _insert_batch($table, $keys, $values) + { + return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES ".implode(', ', $values); + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @access public + * @param string the table name + * @param array the update data + * @param array the where clause + * @param array the orderby clause + * @param array the limit clause + * @return string + */ + function _update($table, $values, $where, $orderby = array(), $limit = FALSE) + { + foreach ($values as $key => $val) + { + $valstr[] = $key." = ".$val; + } + + $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; + + $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; + + $sql = "UPDATE ".$table." SET ".implode(', ', $valstr); + + $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; + + $sql .= $orderby.$limit; + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Update_Batch statement + * + * Generates a platform-specific batch update string from the supplied data + * + * @access public + * @param string the table name + * @param array the update data + * @param array the where clause + * @return string + */ + function _update_batch($table, $values, $index, $where = NULL) + { + $ids = array(); + $where = ($where != '' AND count($where) >=1) ? implode(" ", $where).' AND ' : ''; + + foreach ($values as $key => $val) + { + $ids[] = $val[$index]; + + foreach (array_keys($val) as $field) + { + if ($field != $index) + { + $final[$field][] = 'WHEN '.$index.' = '.$val[$index].' THEN '.$val[$field]; + } + } + } + + $sql = "UPDATE ".$table." SET "; + $cases = ''; + + foreach ($final as $k => $v) + { + $cases .= $k.' = CASE '."\n"; + foreach ($v as $row) + { + $cases .= $row."\n"; + } + + $cases .= 'ELSE '.$k.' END, '; + } + + $sql .= substr($cases, 0, -2); + + $sql .= ' WHERE '.$where.$index.' IN ('.implode(',', $ids).')'; + + return $sql; + } + + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * If the database does not support the truncate() command + * This function maps to "DELETE FROM table" + * + * @access public + * @param string the table name + * @return string + */ + function _truncate($table) + { + return $this->_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @access public + * @param string the table name + * @param array the where clause + * @param string the limit clause + * @return string + */ + function _delete($table, $where = array(), $like = array(), $limit = FALSE) + { + $conditions = ''; + + if (count($where) > 0 OR count($like) > 0) + { + $conditions = "\nWHERE "; + $conditions .= implode("\n", $this->ar_where); + + if (count($where) > 0 && count($like) > 0) + { + $conditions .= " AND "; + } + $conditions .= implode("\n", $like); + } + + $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; + + return "DELETE FROM ".$table.$conditions.$limit; + } + + // -------------------------------------------------------------------- + + /** + * Limit string + * + * Generates a platform-specific LIMIT clause + * + * @access public + * @param string the sql query string + * @param integer the number of rows to limit the query to + * @param integer the offset value + * @return string + */ + function _limit($sql, $limit, $offset) + { + if (strpos($this->hostname, 'cubrid') !== FALSE || strpos($this->hostname, 'sqlite') !== FALSE) + { + if ($offset == 0) + { + $offset = ''; + } + else + { + $offset .= ", "; + } + + return $sql."LIMIT ".$offset.$limit; + } + else + { + $sql .= "LIMIT ".$limit; + + if ($offset > 0) + { + $sql .= " OFFSET ".$offset; + } + + return $sql; + } + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @access public + * @param resource + * @return void + */ + function _close($conn_id) + { + $this->conn_id = null; + } + + +} + + + +/* End of file pdo_driver.php */ +/* Location: ./system/database/drivers/pdo/pdo_driver.php */ \ No newline at end of file diff --git a/system/database/drivers/pdo/pdo_forge.php b/system/database/drivers/pdo/pdo_forge.php new file mode 100644 index 0000000..86e8293 --- /dev/null +++ b/system/database/drivers/pdo/pdo_forge.php @@ -0,0 +1,267 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 2.1.2 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * PDO Forge Class + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/database/ + */ +class CI_DB_pdo_forge extends CI_DB_forge { + + /** + * Create database + * + * @access private + * @param string the database name + * @return bool + */ + function _create_database() + { + // PDO has no "create database" command since it's + // designed to connect to an existing database + if ($this->db->db_debug) + { + return $this->db->display_error('db_unsuported_feature'); + } + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Drop database + * + * @access private + * @param string the database name + * @return bool + */ + function _drop_database($name) + { + // PDO has no "drop database" command since it's + // designed to connect to an existing database + if ($this->db->db_debug) + { + return $this->db->display_error('db_unsuported_feature'); + } + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Create Table + * + * @access private + * @param string the table name + * @param array the fields + * @param mixed primary key(s) + * @param mixed key(s) + * @param boolean should 'IF NOT EXISTS' be added to the SQL + * @return bool + */ + function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) + { + $sql = 'CREATE TABLE '; + + if ($if_not_exists === TRUE) + { + $sql .= 'IF NOT EXISTS '; + } + + $sql .= $this->db->_escape_identifiers($table)." ("; + $current_field_count = 0; + + foreach ($fields as $field=>$attributes) + { + // Numeric field names aren't allowed in databases, so if the key is + // numeric, we know it was assigned by PHP and the developer manually + // entered the field information, so we'll simply add it to the list + if (is_numeric($field)) + { + $sql .= "\n\t$attributes"; + } + else + { + $attributes = array_change_key_case($attributes, CASE_UPPER); + + $sql .= "\n\t".$this->db->_protect_identifiers($field); + + $sql .= ' '.$attributes['TYPE']; + + if (array_key_exists('CONSTRAINT', $attributes)) + { + $sql .= '('.$attributes['CONSTRAINT'].')'; + } + + if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) + { + $sql .= ' UNSIGNED'; + } + + if (array_key_exists('DEFAULT', $attributes)) + { + $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; + } + + if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) + { + $sql .= ' NULL'; + } + else + { + $sql .= ' NOT NULL'; + } + + if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) + { + $sql .= ' AUTO_INCREMENT'; + } + } + + // don't add a comma on the end of the last field + if (++$current_field_count < count($fields)) + { + $sql .= ','; + } + } + + if (count($primary_keys) > 0) + { + $primary_keys = $this->db->_protect_identifiers($primary_keys); + $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; + } + + if (is_array($keys) && count($keys) > 0) + { + foreach ($keys as $key) + { + if (is_array($key)) + { + $key = $this->db->_protect_identifiers($key); + } + else + { + $key = array($this->db->_protect_identifiers($key)); + } + + $sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")"; + } + } + + $sql .= "\n)"; + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Drop Table + * + * @access private + * @return bool + */ + function _drop_table($table) + { + // Not a supported PDO feature + if ($this->db->db_debug) + { + return $this->db->display_error('db_unsuported_feature'); + } + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Alter table query + * + * Generates a platform-specific query so that a table can be altered + * Called by add_column(), drop_column(), and column_alter(), + * + * @access private + * @param string the ALTER type (ADD, DROP, CHANGE) + * @param string the column name + * @param string the table name + * @param string the column definition + * @param string the default value + * @param boolean should 'NOT NULL' be added + * @param string the field after which we should add the new field + * @return object + */ + function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '') + { + $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name); + + // DROP has everything it needs now. + if ($alter_type == 'DROP') + { + return $sql; + } + + $sql .= " $column_definition"; + + if ($default_value != '') + { + $sql .= " DEFAULT \"$default_value\""; + } + + if ($null === NULL) + { + $sql .= ' NULL'; + } + else + { + $sql .= ' NOT NULL'; + } + + if ($after_field != '') + { + $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); + } + + return $sql; + + } + + + // -------------------------------------------------------------------- + + /** + * Rename a table + * + * Generates a platform-specific query so that a table can be renamed + * + * @access private + * @param string the old table name + * @param string the new table name + * @return string + */ + function _rename_table($table_name, $new_table_name) + { + $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); + return $sql; + } + + +} + +/* End of file pdo_forge.php */ +/* Location: ./system/database/drivers/pdo/pdo_forge.php */ \ No newline at end of file diff --git a/system/database/drivers/pdo/pdo_result.php b/system/database/drivers/pdo/pdo_result.php new file mode 100644 index 0000000..705a66c --- /dev/null +++ b/system/database/drivers/pdo/pdo_result.php @@ -0,0 +1,184 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 2.1.2 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * PDO Result Class + * + * This class extends the parent result class: CI_DB_result + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_pdo_result extends CI_DB_result { + + public $num_rows; + + /** + * Number of rows in the result set + * + * @return int + */ + public function num_rows() + { + if (is_int($this->num_rows)) + { + return $this->num_rows; + } + elseif (($this->num_rows = $this->result_id->rowCount()) > 0) + { + return $this->num_rows; + } + + $this->num_rows = count($this->result_id->fetchAll()); + $this->result_id->execute(); + return $this->num_rows; + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @access public + * @return integer + */ + function num_fields() + { + return $this->result_id->columnCount(); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @access public + * @return array + */ + function list_fields() + { + if ($this->db->db_debug) + { + return $this->db->display_error('db_unsuported_feature'); + } + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @access public + * @return array + */ + function field_data() + { + $data = array(); + + try + { + for($i = 0; $i < $this->num_fields(); $i++) + { + $data[] = $this->result_id->getColumnMeta($i); + } + + return $data; + } + catch (Exception $e) + { + if ($this->db->db_debug) + { + return $this->db->display_error('db_unsuported_feature'); + } + return FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return null + */ + function free_result() + { + if (is_object($this->result_id)) + { + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero + * + * @access private + * @return array + */ + function _data_seek($n = 0) + { + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @access private + * @return array + */ + function _fetch_assoc() + { + return $this->result_id->fetch(PDO::FETCH_ASSOC); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @access private + * @return object + */ + function _fetch_object() + { + return $this->result_id->fetchObject(); + } + +} + + +/* End of file pdo_result.php */ +/* Location: ./system/database/drivers/pdo/pdo_result.php */ \ No newline at end of file diff --git a/system/database/drivers/pdo/pdo_utility.php b/system/database/drivers/pdo/pdo_utility.php new file mode 100644 index 0000000..da70c34 --- /dev/null +++ b/system/database/drivers/pdo/pdo_utility.php @@ -0,0 +1,104 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 2.1.2 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * PDO Utility Class + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/database/ + */ +class CI_DB_pdo_utility extends CI_DB_utility { + + /** + * List databases + * + * @access private + * @return bool + */ + function _list_databases() + { + // Not sure if PDO lets you list all databases... + if ($this->db->db_debug) + { + return $this->db->display_error('db_unsuported_feature'); + } + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Optimize table query + * + * Generates a platform-specific query so that a table can be optimized + * + * @access private + * @param string the table name + * @return object + */ + function _optimize_table($table) + { + // Not a supported PDO feature + if ($this->db->db_debug) + { + return $this->db->display_error('db_unsuported_feature'); + } + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Repair table query + * + * Generates a platform-specific query so that a table can be repaired + * + * @access private + * @param string the table name + * @return object + */ + function _repair_table($table) + { + // Not a supported PDO feature + if ($this->db->db_debug) + { + return $this->db->display_error('db_unsuported_feature'); + } + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * PDO Export + * + * @access private + * @param array Preferences + * @return mixed + */ + function _backup($params = array()) + { + // Currently unsupported + return $this->db->display_error('db_unsuported_feature'); + } + +} + +/* End of file pdo_utility.php */ +/* Location: ./system/database/drivers/pdo/pdo_utility.php */ \ No newline at end of file diff --git a/system/database/drivers/postgre/index.html b/system/database/drivers/postgre/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/system/database/drivers/postgre/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/system/database/drivers/postgre/postgre_driver.php b/system/database/drivers/postgre/postgre_driver.php new file mode 100644 index 0000000..9e4843f --- /dev/null +++ b/system/database/drivers/postgre/postgre_driver.php @@ -0,0 +1,704 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Postgre Database Adapter Class + * + * Note: _DB is an extender class that the app controller + * creates dynamically based on whether the active record + * class is being used or not. + * + * @package CodeIgniter + * @subpackage Drivers + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_postgre_driver extends CI_DB { + + var $dbdriver = 'postgre'; + + var $_escape_char = '"'; + + // clause and character used for LIKE escape sequences + var $_like_escape_str = " ESCAPE '%s' "; + var $_like_escape_chr = '!'; + + /** + * The syntax to count rows is slightly different across different + * database engines, so this string appears in each driver and is + * used for the count_all() and count_all_results() functions. + */ + var $_count_string = "SELECT COUNT(*) AS "; + var $_random_keyword = ' RANDOM()'; // database specific random keyword + + /** + * Connection String + * + * @access private + * @return string + */ + function _connect_string() + { + $components = array( + 'hostname' => 'host', + 'port' => 'port', + 'database' => 'dbname', + 'username' => 'user', + 'password' => 'password' + ); + + $connect_string = ""; + foreach ($components as $key => $val) + { + if (isset($this->$key) && $this->$key != '') + { + $connect_string .= " $val=".$this->$key; + } + } + return trim($connect_string); + } + + // -------------------------------------------------------------------- + + /** + * Non-persistent database connection + * + * @access private called by the base class + * @return resource + */ + function db_connect() + { + return @pg_connect($this->_connect_string()); + } + + // -------------------------------------------------------------------- + + /** + * Persistent database connection + * + * @access private called by the base class + * @return resource + */ + function db_pconnect() + { + return @pg_pconnect($this->_connect_string()); + } + + // -------------------------------------------------------------------- + + /** + * Reconnect + * + * Keep / reestablish the db connection if no queries have been + * sent for a length of time exceeding the server's idle timeout + * + * @access public + * @return void + */ + function reconnect() + { + if (pg_ping($this->conn_id) === FALSE) + { + $this->conn_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Select the database + * + * @access private called by the base class + * @return resource + */ + function db_select() + { + // Not needed for Postgre so we'll return TRUE + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Set client character set + * + * @access public + * @param string + * @param string + * @return resource + */ + function db_set_charset($charset, $collation) + { + // @todo - add support if needed + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Version number query string + * + * @access public + * @return string + */ + function _version() + { + return "SELECT version() AS ver"; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @access private called by the base class + * @param string an SQL query + * @return resource + */ + function _execute($sql) + { + $sql = $this->_prep_query($sql); + return @pg_query($this->conn_id, $sql); + } + + // -------------------------------------------------------------------- + + /** + * Prep the query + * + * If needed, each database adapter can prep the query string + * + * @access private called by execute() + * @param string an SQL query + * @return string + */ + function _prep_query($sql) + { + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @access public + * @return bool + */ + function trans_begin($test_mode = FALSE) + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + // Reset the transaction failure flag. + // If the $test_mode flag is set to TRUE transactions will be rolled back + // even if the queries produce a successful result. + $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; + + return @pg_exec($this->conn_id, "begin"); + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @access public + * @return bool + */ + function trans_commit() + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + return @pg_exec($this->conn_id, "commit"); + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @access public + * @return bool + */ + function trans_rollback() + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + return @pg_exec($this->conn_id, "rollback"); + } + + // -------------------------------------------------------------------- + + /** + * Escape String + * + * @access public + * @param string + * @param bool whether or not the string will be used in a LIKE condition + * @return string + */ + function escape_str($str, $like = FALSE) + { + if (is_array($str)) + { + foreach ($str as $key => $val) + { + $str[$key] = $this->escape_str($val, $like); + } + + return $str; + } + + $str = pg_escape_string($str); + + // escape LIKE condition wildcards + if ($like === TRUE) + { + $str = str_replace( array('%', '_', $this->_like_escape_chr), + array($this->_like_escape_chr.'%', $this->_like_escape_chr.'_', $this->_like_escape_chr.$this->_like_escape_chr), + $str); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @access public + * @return integer + */ + function affected_rows() + { + return @pg_affected_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @access public + * @return integer + */ + function insert_id() + { + $v = $this->_version(); + $v = $v['server']; + + $table = func_num_args() > 0 ? func_get_arg(0) : NULL; + $column = func_num_args() > 1 ? func_get_arg(1) : NULL; + + if ($table == NULL && $v >= '8.1') + { + $sql='SELECT LASTVAL() as ins_id'; + } + elseif ($table != NULL && $column != NULL && $v >= '8.0') + { + $sql = sprintf("SELECT pg_get_serial_sequence('%s','%s') as seq", $table, $column); + $query = $this->query($sql); + $row = $query->row(); + $sql = sprintf("SELECT CURRVAL('%s') as ins_id", $row->seq); + } + elseif ($table != NULL) + { + // seq_name passed in table parameter + $sql = sprintf("SELECT CURRVAL('%s') as ins_id", $table); + } + else + { + return pg_last_oid($this->result_id); + } + $query = $this->query($sql); + $row = $query->row(); + return $row->ins_id; + } + + // -------------------------------------------------------------------- + + /** + * "Count All" query + * + * Generates a platform-specific query string that counts all records in + * the specified database + * + * @access public + * @param string + * @return string + */ + function count_all($table = '') + { + if ($table == '') + { + return 0; + } + + $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); + + if ($query->num_rows() == 0) + { + return 0; + } + + $row = $query->row(); + $this->_reset_select(); + return (int) $row->numrows; + } + + // -------------------------------------------------------------------- + + /** + * Show table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @access private + * @param boolean + * @return string + */ + function _list_tables($prefix_limit = FALSE) + { + $sql = "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'"; + + if ($prefix_limit !== FALSE AND $this->dbprefix != '') + { + $sql .= " AND table_name LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @access public + * @param string the table name + * @return string + */ + function _list_columns($table = '') + { + return "SELECT column_name FROM information_schema.columns WHERE table_name ='".$table."'"; + } + + // -------------------------------------------------------------------- + + /** + * Field data query + * + * Generates a platform-specific query so that the column data can be retrieved + * + * @access public + * @param string the table name + * @return object + */ + function _field_data($table) + { + return "SELECT * FROM ".$table." LIMIT 1"; + } + + // -------------------------------------------------------------------- + + /** + * The error message string + * + * @access private + * @return string + */ + function _error_message() + { + return pg_last_error($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * The error message number + * + * @access private + * @return integer + */ + function _error_number() + { + return ''; + } + + // -------------------------------------------------------------------- + + /** + * Escape the SQL Identifiers + * + * This function escapes column and table names + * + * @access private + * @param string + * @return string + */ + function _escape_identifiers($item) + { + if ($this->_escape_char == '') + { + return $item; + } + + foreach ($this->_reserved_identifiers as $id) + { + if (strpos($item, '.'.$id) !== FALSE) + { + $str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); + + // remove duplicates if the user already included the escape + return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); + } + } + + if (strpos($item, '.') !== FALSE) + { + $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; + } + else + { + $str = $this->_escape_char.$item.$this->_escape_char; + } + + // remove duplicates if the user already included the escape + return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); + } + + // -------------------------------------------------------------------- + + /** + * From Tables + * + * This function implicitly groups FROM tables so there is no confusion + * about operator precedence in harmony with SQL standards + * + * @access public + * @param type + * @return type + */ + function _from_tables($tables) + { + if ( ! is_array($tables)) + { + $tables = array($tables); + } + + return implode(', ', $tables); + } + + // -------------------------------------------------------------------- + + /** + * Insert statement + * + * Generates a platform-specific insert string from the supplied data + * + * @access public + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + function _insert($table, $keys, $values) + { + return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; + } + + // -------------------------------------------------------------------- + + /** + * Insert_batch statement + * + * Generates a platform-specific insert string from the supplied data + * + * @access public + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + function _insert_batch($table, $keys, $values) + { + return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES ".implode(', ', $values); + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @access public + * @param string the table name + * @param array the update data + * @param array the where clause + * @param array the orderby clause + * @param array the limit clause + * @return string + */ + function _update($table, $values, $where, $orderby = array(), $limit = FALSE) + { + foreach ($values as $key => $val) + { + $valstr[] = $key." = ".$val; + } + + $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; + + $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; + + $sql = "UPDATE ".$table." SET ".implode(', ', $valstr); + + $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; + + $sql .= $orderby.$limit; + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * If the database does not support the truncate() command + * This function maps to "DELETE FROM table" + * + * @access public + * @param string the table name + * @return string + */ + function _truncate($table) + { + return "TRUNCATE ".$table; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @access public + * @param string the table name + * @param array the where clause + * @param string the limit clause + * @return string + */ + function _delete($table, $where = array(), $like = array(), $limit = FALSE) + { + $conditions = ''; + + if (count($where) > 0 OR count($like) > 0) + { + $conditions = "\nWHERE "; + $conditions .= implode("\n", $this->ar_where); + + if (count($where) > 0 && count($like) > 0) + { + $conditions .= " AND "; + } + $conditions .= implode("\n", $like); + } + + $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; + + return "DELETE FROM ".$table.$conditions.$limit; + } + + // -------------------------------------------------------------------- + /** + * Limit string + * + * Generates a platform-specific LIMIT clause + * + * @access public + * @param string the sql query string + * @param integer the number of rows to limit the query to + * @param integer the offset value + * @return string + */ + function _limit($sql, $limit, $offset) + { + $sql .= "LIMIT ".$limit; + + if ($offset > 0) + { + $sql .= " OFFSET ".$offset; + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @access public + * @param resource + * @return void + */ + function _close($conn_id) + { + @pg_close($conn_id); + } + + +} + + +/* End of file postgre_driver.php */ +/* Location: ./system/database/drivers/postgre/postgre_driver.php */ \ No newline at end of file diff --git a/system/database/drivers/postgre/postgre_forge.php b/system/database/drivers/postgre/postgre_forge.php new file mode 100644 index 0000000..9b72ed5 --- /dev/null +++ b/system/database/drivers/postgre/postgre_forge.php @@ -0,0 +1,300 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Postgre Forge Class + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_postgre_forge extends CI_DB_forge { + + /** + * Create database + * + * @access private + * @param string the database name + * @return bool + */ + function _create_database($name) + { + return "CREATE DATABASE ".$name; + } + + // -------------------------------------------------------------------- + + /** + * Drop database + * + * @access private + * @param string the database name + * @return bool + */ + function _drop_database($name) + { + return "DROP DATABASE ".$name; + } + + // -------------------------------------------------------------------- + + /** + * Create Table + * + * @access private + * @param string the table name + * @param array the fields + * @param mixed primary key(s) + * @param mixed key(s) + * @param boolean should 'IF NOT EXISTS' be added to the SQL + * @return bool + */ + function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) + { + $sql = 'CREATE TABLE '; + + if ($if_not_exists === TRUE) + { + if ($this->db->table_exists($table)) + { + return "SELECT * FROM $table"; // Needs to return innocous but valid SQL statement + } + } + + $sql .= $this->db->_escape_identifiers($table)." ("; + $current_field_count = 0; + + foreach ($fields as $field=>$attributes) + { + // Numeric field names aren't allowed in databases, so if the key is + // numeric, we know it was assigned by PHP and the developer manually + // entered the field information, so we'll simply add it to the list + if (is_numeric($field)) + { + $sql .= "\n\t$attributes"; + } + else + { + $attributes = array_change_key_case($attributes, CASE_UPPER); + + $sql .= "\n\t".$this->db->_protect_identifiers($field); + + $is_unsigned = (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE); + + // Convert datatypes to be PostgreSQL-compatible + switch (strtoupper($attributes['TYPE'])) + { + case 'TINYINT': + $attributes['TYPE'] = 'SMALLINT'; + break; + case 'SMALLINT': + $attributes['TYPE'] = ($is_unsigned) ? 'INTEGER' : 'SMALLINT'; + break; + case 'MEDIUMINT': + $attributes['TYPE'] = 'INTEGER'; + break; + case 'INT': + $attributes['TYPE'] = ($is_unsigned) ? 'BIGINT' : 'INTEGER'; + break; + case 'BIGINT': + $attributes['TYPE'] = ($is_unsigned) ? 'NUMERIC' : 'BIGINT'; + break; + case 'DOUBLE': + $attributes['TYPE'] = 'DOUBLE PRECISION'; + break; + case 'DATETIME': + $attributes['TYPE'] = 'TIMESTAMP'; + break; + case 'LONGTEXT': + $attributes['TYPE'] = 'TEXT'; + break; + case 'BLOB': + $attributes['TYPE'] = 'BYTEA'; + break; + } + + // If this is an auto-incrementing primary key, use the serial data type instead + if (in_array($field, $primary_keys) && array_key_exists('AUTO_INCREMENT', $attributes) + && $attributes['AUTO_INCREMENT'] === TRUE) + { + $sql .= ' SERIAL'; + } + else + { + $sql .= ' '.$attributes['TYPE']; + } + + // Modified to prevent constraints with integer data types + if (array_key_exists('CONSTRAINT', $attributes) && strpos($attributes['TYPE'], 'INT') === false) + { + $sql .= '('.$attributes['CONSTRAINT'].')'; + } + + if (array_key_exists('DEFAULT', $attributes)) + { + $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; + } + + if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) + { + $sql .= ' NULL'; + } + else + { + $sql .= ' NOT NULL'; + } + + // Added new attribute to create unqite fields. Also works with MySQL + if (array_key_exists('UNIQUE', $attributes) && $attributes['UNIQUE'] === TRUE) + { + $sql .= ' UNIQUE'; + } + } + + // don't add a comma on the end of the last field + if (++$current_field_count < count($fields)) + { + $sql .= ','; + } + } + + if (count($primary_keys) > 0) + { + // Something seems to break when passing an array to _protect_identifiers() + foreach ($primary_keys as $index => $key) + { + $primary_keys[$index] = $this->db->_protect_identifiers($key); + } + + $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; + } + + $sql .= "\n);"; + + if (is_array($keys) && count($keys) > 0) + { + foreach ($keys as $key) + { + if (is_array($key)) + { + $key = $this->db->_protect_identifiers($key); + } + else + { + $key = array($this->db->_protect_identifiers($key)); + } + + foreach ($key as $field) + { + $sql .= "CREATE INDEX " . $table . "_" . str_replace(array('"', "'"), '', $field) . "_index ON $table ($field); "; + } + } + } + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Drop Table + * + * @access private + * @return bool + */ + function _drop_table($table) + { + return "DROP TABLE IF EXISTS ".$this->db->_escape_identifiers($table)." CASCADE"; + } + + // -------------------------------------------------------------------- + + /** + * Alter table query + * + * Generates a platform-specific query so that a table can be altered + * Called by add_column(), drop_column(), and column_alter(), + * + * @access private + * @param string the ALTER type (ADD, DROP, CHANGE) + * @param string the column name + * @param string the table name + * @param string the column definition + * @param string the default value + * @param boolean should 'NOT NULL' be added + * @param string the field after which we should add the new field + * @return object + */ + function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '') + { + $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name); + + // DROP has everything it needs now. + if ($alter_type == 'DROP') + { + return $sql; + } + + $sql .= " $column_definition"; + + if ($default_value != '') + { + $sql .= " DEFAULT \"$default_value\""; + } + + if ($null === NULL) + { + $sql .= ' NULL'; + } + else + { + $sql .= ' NOT NULL'; + } + + if ($after_field != '') + { + $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); + } + + return $sql; + + } + + // -------------------------------------------------------------------- + + /** + * Rename a table + * + * Generates a platform-specific query so that a table can be renamed + * + * @access private + * @param string the old table name + * @param string the new table name + * @return string + */ + function _rename_table($table_name, $new_table_name) + { + $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); + return $sql; + } + + +} + +/* End of file postgre_forge.php */ +/* Location: ./system/database/drivers/postgre/postgre_forge.php */ \ No newline at end of file diff --git a/system/database/drivers/postgre/postgre_result.php b/system/database/drivers/postgre/postgre_result.php new file mode 100644 index 0000000..8e1680d --- /dev/null +++ b/system/database/drivers/postgre/postgre_result.php @@ -0,0 +1,170 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Postgres Result Class + * + * This class extends the parent result class: CI_DB_result + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_postgre_result extends CI_DB_result { + + /** + * Number of rows in the result set + * + * @access public + * @return integer + */ + function num_rows() + { + return @pg_num_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @access public + * @return integer + */ + function num_fields() + { + return @pg_num_fields($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @access public + * @return array + */ + function list_fields() + { + $field_names = array(); + for ($i = 0; $i < $this->num_fields(); $i++) + { + $field_names[] = pg_field_name($this->result_id, $i); + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @access public + * @return array + */ + function field_data() + { + $retval = array(); + for ($i = 0; $i < $this->num_fields(); $i++) + { + $F = new stdClass(); + $F->name = pg_field_name($this->result_id, $i); + $F->type = pg_field_type($this->result_id, $i); + $F->max_length = pg_field_size($this->result_id, $i); + $F->primary_key = 0; + $F->default = ''; + + $retval[] = $F; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return null + */ + function free_result() + { + if (is_resource($this->result_id)) + { + pg_free_result($this->result_id); + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero + * + * @access private + * @return array + */ + function _data_seek($n = 0) + { + return pg_result_seek($this->result_id, $n); + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @access private + * @return array + */ + function _fetch_assoc() + { + return pg_fetch_assoc($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @access private + * @return object + */ + function _fetch_object() + { + return pg_fetch_object($this->result_id); + } + +} + + +/* End of file postgre_result.php */ +/* Location: ./system/database/drivers/postgre/postgre_result.php */ \ No newline at end of file diff --git a/system/database/drivers/postgre/postgre_utility.php b/system/database/drivers/postgre/postgre_utility.php new file mode 100644 index 0000000..e84333f --- /dev/null +++ b/system/database/drivers/postgre/postgre_utility.php @@ -0,0 +1,89 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Postgre Utility Class + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_postgre_utility extends CI_DB_utility { + + /** + * List databases + * + * @access private + * @return bool + */ + function _list_databases() + { + return "SELECT datname FROM pg_database"; + } + + // -------------------------------------------------------------------- + + /** + * Optimize table query + * + * Is table optimization supported in Postgre? + * + * @access private + * @param string the table name + * @return object + */ + function _optimize_table($table) + { + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Repair table query + * + * Are table repairs supported in Postgre? + * + * @access private + * @param string the table name + * @return object + */ + function _repair_table($table) + { + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Postgre Export + * + * @access private + * @param array Preferences + * @return mixed + */ + function _backup($params = array()) + { + // Currently unsupported + return $this->db->display_error('db_unsuported_feature'); + } +} + + +/* End of file postgre_utility.php */ +/* Location: ./system/database/drivers/postgre/postgre_utility.php */ \ No newline at end of file diff --git a/system/database/drivers/sqlite/index.html b/system/database/drivers/sqlite/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/system/database/drivers/sqlite/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/system/database/drivers/sqlite/sqlite_driver.php b/system/database/drivers/sqlite/sqlite_driver.php new file mode 100644 index 0000000..2623013 --- /dev/null +++ b/system/database/drivers/sqlite/sqlite_driver.php @@ -0,0 +1,659 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + + + +/** + * SQLite Database Adapter Class + * + * Note: _DB is an extender class that the app controller + * creates dynamically based on whether the active record + * class is being used or not. + * + * @package CodeIgniter + * @subpackage Drivers + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_sqlite_driver extends CI_DB { + + var $dbdriver = 'sqlite'; + + // The character used to escape with - not needed for SQLite + var $_escape_char = ''; + + // clause and character used for LIKE escape sequences + var $_like_escape_str = " ESCAPE '%s' "; + var $_like_escape_chr = '!'; + + /** + * The syntax to count rows is slightly different across different + * database engines, so this string appears in each driver and is + * used for the count_all() and count_all_results() functions. + */ + var $_count_string = "SELECT COUNT(*) AS "; + var $_random_keyword = ' Random()'; // database specific random keyword + + /** + * Non-persistent database connection + * + * @access private called by the base class + * @return resource + */ + function db_connect() + { + if ( ! $conn_id = @sqlite_open($this->database, FILE_WRITE_MODE, $error)) + { + log_message('error', $error); + + if ($this->db_debug) + { + $this->display_error($error, '', TRUE); + } + + return FALSE; + } + + return $conn_id; + } + + // -------------------------------------------------------------------- + + /** + * Persistent database connection + * + * @access private called by the base class + * @return resource + */ + function db_pconnect() + { + if ( ! $conn_id = @sqlite_popen($this->database, FILE_WRITE_MODE, $error)) + { + log_message('error', $error); + + if ($this->db_debug) + { + $this->display_error($error, '', TRUE); + } + + return FALSE; + } + + return $conn_id; + } + + // -------------------------------------------------------------------- + + /** + * Reconnect + * + * Keep / reestablish the db connection if no queries have been + * sent for a length of time exceeding the server's idle timeout + * + * @access public + * @return void + */ + function reconnect() + { + // not implemented in SQLite + } + + // -------------------------------------------------------------------- + + /** + * Select the database + * + * @access private called by the base class + * @return resource + */ + function db_select() + { + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Set client character set + * + * @access public + * @param string + * @param string + * @return resource + */ + function db_set_charset($charset, $collation) + { + // @todo - add support if needed + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Version number query string + * + * @access public + * @return string + */ + function _version() + { + return sqlite_libversion(); + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @access private called by the base class + * @param string an SQL query + * @return resource + */ + function _execute($sql) + { + $sql = $this->_prep_query($sql); + return @sqlite_query($this->conn_id, $sql); + } + + // -------------------------------------------------------------------- + + /** + * Prep the query + * + * If needed, each database adapter can prep the query string + * + * @access private called by execute() + * @param string an SQL query + * @return string + */ + function _prep_query($sql) + { + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @access public + * @return bool + */ + function trans_begin($test_mode = FALSE) + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + // Reset the transaction failure flag. + // If the $test_mode flag is set to TRUE transactions will be rolled back + // even if the queries produce a successful result. + $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; + + $this->simple_query('BEGIN TRANSACTION'); + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @access public + * @return bool + */ + function trans_commit() + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + $this->simple_query('COMMIT'); + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @access public + * @return bool + */ + function trans_rollback() + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + $this->simple_query('ROLLBACK'); + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Escape String + * + * @access public + * @param string + * @param bool whether or not the string will be used in a LIKE condition + * @return string + */ + function escape_str($str, $like = FALSE) + { + if (is_array($str)) + { + foreach ($str as $key => $val) + { + $str[$key] = $this->escape_str($val, $like); + } + + return $str; + } + + $str = sqlite_escape_string($str); + + // escape LIKE condition wildcards + if ($like === TRUE) + { + $str = str_replace( array('%', '_', $this->_like_escape_chr), + array($this->_like_escape_chr.'%', $this->_like_escape_chr.'_', $this->_like_escape_chr.$this->_like_escape_chr), + $str); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @access public + * @return integer + */ + function affected_rows() + { + return sqlite_changes($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * @access public + * @return integer + */ + function insert_id() + { + return @sqlite_last_insert_rowid($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * "Count All" query + * + * Generates a platform-specific query string that counts all records in + * the specified database + * + * @access public + * @param string + * @return string + */ + function count_all($table = '') + { + if ($table == '') + { + return 0; + } + + $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); + + if ($query->num_rows() == 0) + { + return 0; + } + + $row = $query->row(); + $this->_reset_select(); + return (int) $row->numrows; + } + + // -------------------------------------------------------------------- + + /** + * List table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @access private + * @param boolean + * @return string + */ + function _list_tables($prefix_limit = FALSE) + { + $sql = "SELECT name from sqlite_master WHERE type='table'"; + + if ($prefix_limit !== FALSE AND $this->dbprefix != '') + { + $sql .= " AND 'name' LIKE '".$this->escape_like_str($this->dbprefix)."%' ".sprintf($this->_like_escape_str, $this->_like_escape_chr); + } + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Show column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @access public + * @param string the table name + * @return string + */ + function _list_columns($table = '') + { + // Not supported + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Field data query + * + * Generates a platform-specific query so that the column data can be retrieved + * + * @access public + * @param string the table name + * @return object + */ + function _field_data($table) + { + return "SELECT * FROM ".$table." LIMIT 1"; + } + + // -------------------------------------------------------------------- + + /** + * The error message string + * + * @access private + * @return string + */ + function _error_message() + { + return sqlite_error_string(sqlite_last_error($this->conn_id)); + } + + // -------------------------------------------------------------------- + + /** + * The error message number + * + * @access private + * @return integer + */ + function _error_number() + { + return sqlite_last_error($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Escape the SQL Identifiers + * + * This function escapes column and table names + * + * @access private + * @param string + * @return string + */ + function _escape_identifiers($item) + { + if ($this->_escape_char == '') + { + return $item; + } + + foreach ($this->_reserved_identifiers as $id) + { + if (strpos($item, '.'.$id) !== FALSE) + { + $str = $this->_escape_char. str_replace('.', $this->_escape_char.'.', $item); + + // remove duplicates if the user already included the escape + return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); + } + } + + if (strpos($item, '.') !== FALSE) + { + $str = $this->_escape_char.str_replace('.', $this->_escape_char.'.'.$this->_escape_char, $item).$this->_escape_char; + } + else + { + $str = $this->_escape_char.$item.$this->_escape_char; + } + + // remove duplicates if the user already included the escape + return preg_replace('/['.$this->_escape_char.']+/', $this->_escape_char, $str); + } + + // -------------------------------------------------------------------- + + /** + * From Tables + * + * This function implicitly groups FROM tables so there is no confusion + * about operator precedence in harmony with SQL standards + * + * @access public + * @param type + * @return type + */ + function _from_tables($tables) + { + if ( ! is_array($tables)) + { + $tables = array($tables); + } + + return '('.implode(', ', $tables).')'; + } + + // -------------------------------------------------------------------- + + /** + * Insert statement + * + * Generates a platform-specific insert string from the supplied data + * + * @access public + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + function _insert($table, $keys, $values) + { + return "INSERT INTO ".$table." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @access public + * @param string the table name + * @param array the update data + * @param array the where clause + * @param array the orderby clause + * @param array the limit clause + * @return string + */ + function _update($table, $values, $where, $orderby = array(), $limit = FALSE) + { + foreach ($values as $key => $val) + { + $valstr[] = $key." = ".$val; + } + + $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; + + $orderby = (count($orderby) >= 1)?' ORDER BY '.implode(", ", $orderby):''; + + $sql = "UPDATE ".$table." SET ".implode(', ', $valstr); + + $sql .= ($where != '' AND count($where) >=1) ? " WHERE ".implode(" ", $where) : ''; + + $sql .= $orderby.$limit; + + return $sql; + } + + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * If the database does not support the truncate() command + * This function maps to "DELETE FROM table" + * + * @access public + * @param string the table name + * @return string + */ + function _truncate($table) + { + return $this->_delete($table); + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @access public + * @param string the table name + * @param array the where clause + * @param string the limit clause + * @return string + */ + function _delete($table, $where = array(), $like = array(), $limit = FALSE) + { + $conditions = ''; + + if (count($where) > 0 OR count($like) > 0) + { + $conditions = "\nWHERE "; + $conditions .= implode("\n", $this->ar_where); + + if (count($where) > 0 && count($like) > 0) + { + $conditions .= " AND "; + } + $conditions .= implode("\n", $like); + } + + $limit = ( ! $limit) ? '' : ' LIMIT '.$limit; + + return "DELETE FROM ".$table.$conditions.$limit; + } + + // -------------------------------------------------------------------- + + /** + * Limit string + * + * Generates a platform-specific LIMIT clause + * + * @access public + * @param string the sql query string + * @param integer the number of rows to limit the query to + * @param integer the offset value + * @return string + */ + function _limit($sql, $limit, $offset) + { + if ($offset == 0) + { + $offset = ''; + } + else + { + $offset .= ", "; + } + + return $sql."LIMIT ".$offset.$limit; + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @access public + * @param resource + * @return void + */ + function _close($conn_id) + { + @sqlite_close($conn_id); + } + + +} + + +/* End of file sqlite_driver.php */ +/* Location: ./system/database/drivers/sqlite/sqlite_driver.php */ \ No newline at end of file diff --git a/system/database/drivers/sqlite/sqlite_forge.php b/system/database/drivers/sqlite/sqlite_forge.php new file mode 100644 index 0000000..67f7246 --- /dev/null +++ b/system/database/drivers/sqlite/sqlite_forge.php @@ -0,0 +1,266 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * SQLite Forge Class + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_sqlite_forge extends CI_DB_forge { + + /** + * Create database + * + * @access public + * @param string the database name + * @return bool + */ + function _create_database() + { + // In SQLite, a database is created when you connect to the database. + // We'll return TRUE so that an error isn't generated + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Drop database + * + * @access private + * @param string the database name + * @return bool + */ + function _drop_database($name) + { + if ( ! @file_exists($this->db->database) OR ! @unlink($this->db->database)) + { + if ($this->db->db_debug) + { + return $this->db->display_error('db_unable_to_drop'); + } + return FALSE; + } + return TRUE; + } + // -------------------------------------------------------------------- + + /** + * Create Table + * + * @access private + * @param string the table name + * @param array the fields + * @param mixed primary key(s) + * @param mixed key(s) + * @param boolean should 'IF NOT EXISTS' be added to the SQL + * @return bool + */ + function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) + { + $sql = 'CREATE TABLE '; + + // IF NOT EXISTS added to SQLite in 3.3.0 + if ($if_not_exists === TRUE && version_compare($this->db->_version(), '3.3.0', '>=') === TRUE) + { + $sql .= 'IF NOT EXISTS '; + } + + $sql .= $this->db->_escape_identifiers($table)."("; + $current_field_count = 0; + + foreach ($fields as $field=>$attributes) + { + // Numeric field names aren't allowed in databases, so if the key is + // numeric, we know it was assigned by PHP and the developer manually + // entered the field information, so we'll simply add it to the list + if (is_numeric($field)) + { + $sql .= "\n\t$attributes"; + } + else + { + $attributes = array_change_key_case($attributes, CASE_UPPER); + + $sql .= "\n\t".$this->db->_protect_identifiers($field); + + $sql .= ' '.$attributes['TYPE']; + + if (array_key_exists('CONSTRAINT', $attributes)) + { + $sql .= '('.$attributes['CONSTRAINT'].')'; + } + + if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) + { + $sql .= ' UNSIGNED'; + } + + if (array_key_exists('DEFAULT', $attributes)) + { + $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; + } + + if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) + { + $sql .= ' NULL'; + } + else + { + $sql .= ' NOT NULL'; + } + + if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) + { + $sql .= ' AUTO_INCREMENT'; + } + } + + // don't add a comma on the end of the last field + if (++$current_field_count < count($fields)) + { + $sql .= ','; + } + } + + if (count($primary_keys) > 0) + { + $primary_keys = $this->db->_protect_identifiers($primary_keys); + $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; + } + + if (is_array($keys) && count($keys) > 0) + { + foreach ($keys as $key) + { + if (is_array($key)) + { + $key = $this->db->_protect_identifiers($key); + } + else + { + $key = array($this->db->_protect_identifiers($key)); + } + + $sql .= ",\n\tUNIQUE (" . implode(', ', $key) . ")"; + } + } + + $sql .= "\n)"; + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Drop Table + * + * Unsupported feature in SQLite + * + * @access private + * @return bool + */ + function _drop_table($table) + { + if ($this->db->db_debug) + { + return $this->db->display_error('db_unsuported_feature'); + } + return array(); + } + + // -------------------------------------------------------------------- + + /** + * Alter table query + * + * Generates a platform-specific query so that a table can be altered + * Called by add_column(), drop_column(), and column_alter(), + * + * @access private + * @param string the ALTER type (ADD, DROP, CHANGE) + * @param string the column name + * @param string the table name + * @param string the column definition + * @param string the default value + * @param boolean should 'NOT NULL' be added + * @param string the field after which we should add the new field + * @return object + */ + function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '') + { + $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name); + + // DROP has everything it needs now. + if ($alter_type == 'DROP') + { + // SQLite does not support dropping columns + // http://www.sqlite.org/omitted.html + // http://www.sqlite.org/faq.html#q11 + return FALSE; + } + + $sql .= " $column_definition"; + + if ($default_value != '') + { + $sql .= " DEFAULT \"$default_value\""; + } + + if ($null === NULL) + { + $sql .= ' NULL'; + } + else + { + $sql .= ' NOT NULL'; + } + + if ($after_field != '') + { + $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); + } + + return $sql; + + } + + // -------------------------------------------------------------------- + + /** + * Rename a table + * + * Generates a platform-specific query so that a table can be renamed + * + * @access private + * @param string the old table name + * @param string the new table name + * @return string + */ + function _rename_table($table_name, $new_table_name) + { + $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table_name)." RENAME TO ".$this->db->_protect_identifiers($new_table_name); + return $sql; + } +} + +/* End of file sqlite_forge.php */ +/* Location: ./system/database/drivers/sqlite/sqlite_forge.php */ \ No newline at end of file diff --git a/system/database/drivers/sqlite/sqlite_result.php b/system/database/drivers/sqlite/sqlite_result.php new file mode 100644 index 0000000..a6e8852 --- /dev/null +++ b/system/database/drivers/sqlite/sqlite_result.php @@ -0,0 +1,180 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * SQLite Result Class + * + * This class extends the parent result class: CI_DB_result + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_sqlite_result extends CI_DB_result { + + /** + * Number of rows in the result set + * + * @access public + * @return integer + */ + function num_rows() + { + return @sqlite_num_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @access public + * @return integer + */ + function num_fields() + { + return @sqlite_num_fields($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @access public + * @return array + */ + function list_fields() + { + $field_names = array(); + for ($i = 0; $i < $this->num_fields(); $i++) + { + $field_names[] = sqlite_field_name($this->result_id, $i); + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @access public + * @return array + */ + function field_data() + { + $retval = array(); + for ($i = 0; $i < $this->num_fields(); $i++) + { + $F = new stdClass(); + $F->name = sqlite_field_name($this->result_id, $i); + $F->type = 'varchar'; + $F->max_length = 0; + $F->primary_key = 0; + $F->default = ''; + + $retval[] = $F; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return null + */ + function free_result() + { + // Not implemented in SQLite + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero + * + * @access private + * @return array + */ + function _data_seek($n = 0) + { + return sqlite_seek($this->result_id, $n); + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @access private + * @return array + */ + function _fetch_assoc() + { + return sqlite_fetch_array($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @access private + * @return object + */ + function _fetch_object() + { + if (function_exists('sqlite_fetch_object')) + { + return sqlite_fetch_object($this->result_id); + } + else + { + $arr = sqlite_fetch_array($this->result_id, SQLITE_ASSOC); + if (is_array($arr)) + { + $obj = (object) $arr; + return $obj; + } else { + return NULL; + } + } + } + +} + + +/* End of file sqlite_result.php */ +/* Location: ./system/database/drivers/sqlite/sqlite_result.php */ \ No newline at end of file diff --git a/system/database/drivers/sqlite/sqlite_utility.php b/system/database/drivers/sqlite/sqlite_utility.php new file mode 100644 index 0000000..5c8a9de --- /dev/null +++ b/system/database/drivers/sqlite/sqlite_utility.php @@ -0,0 +1,97 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * SQLite Utility Class + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_sqlite_utility extends CI_DB_utility { + + /** + * List databases + * + * I don't believe you can do a database listing with SQLite + * since each database is its own file. I suppose we could + * try reading a directory looking for SQLite files, but + * that doesn't seem like a terribly good idea + * + * @access private + * @return bool + */ + function _list_databases() + { + if ($this->db_debug) + { + return $this->db->display_error('db_unsuported_feature'); + } + return array(); + } + + // -------------------------------------------------------------------- + + /** + * Optimize table query + * + * Is optimization even supported in SQLite? + * + * @access private + * @param string the table name + * @return object + */ + function _optimize_table($table) + { + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Repair table query + * + * Are table repairs even supported in SQLite? + * + * @access private + * @param string the table name + * @return object + */ + function _repair_table($table) + { + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * SQLite Export + * + * @access private + * @param array Preferences + * @return mixed + */ + function _backup($params = array()) + { + // Currently unsupported + return $this->db->display_error('db_unsuported_feature'); + } +} + +/* End of file sqlite_utility.php */ +/* Location: ./system/database/drivers/sqlite/sqlite_utility.php */ \ No newline at end of file diff --git a/system/database/drivers/sqlsrv/index.html b/system/database/drivers/sqlsrv/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/system/database/drivers/sqlsrv/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/system/database/drivers/sqlsrv/sqlsrv_driver.php b/system/database/drivers/sqlsrv/sqlsrv_driver.php new file mode 100644 index 0000000..a06f504 --- /dev/null +++ b/system/database/drivers/sqlsrv/sqlsrv_driver.php @@ -0,0 +1,604 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * SQLSRV Database Adapter Class + * + * Note: _DB is an extender class that the app controller + * creates dynamically based on whether the active record + * class is being used or not. + * + * @package CodeIgniter + * @subpackage Drivers + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_sqlsrv_driver extends CI_DB { + + var $dbdriver = 'sqlsrv'; + + // The character used for escaping + var $_escape_char = ''; + + // clause and character used for LIKE escape sequences + var $_like_escape_str = " ESCAPE '%s' "; + var $_like_escape_chr = '!'; + + /** + * The syntax to count rows is slightly different across different + * database engines, so this string appears in each driver and is + * used for the count_all() and count_all_results() functions. + */ + var $_count_string = "SELECT COUNT(*) AS "; + var $_random_keyword = ' ASC'; // not currently supported + + /** + * Non-persistent database connection + * + * @access private called by the base class + * @return resource + */ + function db_connect($pooling = false) + { + // Check for a UTF-8 charset being passed as CI's default 'utf8'. + $character_set = (0 === strcasecmp('utf8', $this->char_set)) ? 'UTF-8' : $this->char_set; + + $connection = array( + 'UID' => empty($this->username) ? '' : $this->username, + 'PWD' => empty($this->password) ? '' : $this->password, + 'Database' => $this->database, + 'ConnectionPooling' => $pooling ? 1 : 0, + 'CharacterSet' => $character_set, + 'ReturnDatesAsStrings' => 1 + ); + + // If the username and password are both empty, assume this is a + // 'Windows Authentication Mode' connection. + if(empty($connection['UID']) && empty($connection['PWD'])) { + unset($connection['UID'], $connection['PWD']); + } + + return sqlsrv_connect($this->hostname, $connection); + } + + // -------------------------------------------------------------------- + + /** + * Persistent database connection + * + * @access private called by the base class + * @return resource + */ + function db_pconnect() + { + $this->db_connect(TRUE); + } + + // -------------------------------------------------------------------- + + /** + * Reconnect + * + * Keep / reestablish the db connection if no queries have been + * sent for a length of time exceeding the server's idle timeout + * + * @access public + * @return void + */ + function reconnect() + { + // not implemented in MSSQL + } + + // -------------------------------------------------------------------- + + /** + * Select the database + * + * @access private called by the base class + * @return resource + */ + function db_select() + { + return $this->_execute('USE ' . $this->database); + } + + // -------------------------------------------------------------------- + + /** + * Set client character set + * + * @access public + * @param string + * @param string + * @return resource + */ + function db_set_charset($charset, $collation) + { + // @todo - add support if needed + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Execute the query + * + * @access private called by the base class + * @param string an SQL query + * @return resource + */ + function _execute($sql) + { + $sql = $this->_prep_query($sql); + return sqlsrv_query($this->conn_id, $sql, null, array( + 'Scrollable' => SQLSRV_CURSOR_STATIC, + 'SendStreamParamsAtExec' => true + )); + } + + // -------------------------------------------------------------------- + + /** + * Prep the query + * + * If needed, each database adapter can prep the query string + * + * @access private called by execute() + * @param string an SQL query + * @return string + */ + function _prep_query($sql) + { + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Begin Transaction + * + * @access public + * @return bool + */ + function trans_begin($test_mode = FALSE) + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + // Reset the transaction failure flag. + // If the $test_mode flag is set to TRUE transactions will be rolled back + // even if the queries produce a successful result. + $this->_trans_failure = ($test_mode === TRUE) ? TRUE : FALSE; + + return sqlsrv_begin_transaction($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Commit Transaction + * + * @access public + * @return bool + */ + function trans_commit() + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + return sqlsrv_commit($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Rollback Transaction + * + * @access public + * @return bool + */ + function trans_rollback() + { + if ( ! $this->trans_enabled) + { + return TRUE; + } + + // When transactions are nested we only begin/commit/rollback the outermost ones + if ($this->_trans_depth > 0) + { + return TRUE; + } + + return sqlsrv_rollback($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Escape String + * + * @access public + * @param string + * @param bool whether or not the string will be used in a LIKE condition + * @return string + */ + function escape_str($str, $like = FALSE) + { + // Escape single quotes + return str_replace("'", "''", $str); + } + + // -------------------------------------------------------------------- + + /** + * Affected Rows + * + * @access public + * @return integer + */ + function affected_rows() + { + return @sqlrv_rows_affected($this->conn_id); + } + + // -------------------------------------------------------------------- + + /** + * Insert ID + * + * Returns the last id created in the Identity column. + * + * @access public + * @return integer + */ + function insert_id() + { + return $this->query('select @@IDENTITY as insert_id')->row('insert_id'); + } + + // -------------------------------------------------------------------- + + /** + * Parse major version + * + * Grabs the major version number from the + * database server version string passed in. + * + * @access private + * @param string $version + * @return int16 major version number + */ + function _parse_major_version($version) + { + preg_match('/([0-9]+)\.([0-9]+)\.([0-9]+)/', $version, $ver_info); + return $ver_info[1]; // return the major version b/c that's all we're interested in. + } + + // -------------------------------------------------------------------- + + /** + * Version number query string + * + * @access public + * @return string + */ + function _version() + { + $info = sqlsrv_server_info($this->conn_id); + return sprintf("select '%s' as ver", $info['SQLServerVersion']); + } + + // -------------------------------------------------------------------- + + /** + * "Count All" query + * + * Generates a platform-specific query string that counts all records in + * the specified database + * + * @access public + * @param string + * @return string + */ + function count_all($table = '') + { + if ($table == '') + { + return 0; + } + + $query = $this->query($this->_count_string . $this->_protect_identifiers('numrows') . " FROM " . $this->_protect_identifiers($table, TRUE, NULL, FALSE)); + + if ($query->num_rows() == 0) + { + return 0; + } + + $row = $query->row(); + $this->_reset_select(); + return (int) $row->numrows; + } + + // -------------------------------------------------------------------- + + /** + * List table query + * + * Generates a platform-specific query string so that the table names can be fetched + * + * @access private + * @param boolean + * @return string + */ + function _list_tables($prefix_limit = FALSE) + { + return "SELECT name FROM sysobjects WHERE type = 'U' ORDER BY name"; + } + + // -------------------------------------------------------------------- + + /** + * List column query + * + * Generates a platform-specific query string so that the column names can be fetched + * + * @access private + * @param string the table name + * @return string + */ + function _list_columns($table = '') + { + return "SELECT * FROM INFORMATION_SCHEMA.Columns WHERE TABLE_NAME = '".$this->_escape_table($table)."'"; + } + + // -------------------------------------------------------------------- + + /** + * Field data query + * + * Generates a platform-specific query so that the column data can be retrieved + * + * @access public + * @param string the table name + * @return object + */ + function _field_data($table) + { + return "SELECT TOP 1 * FROM " . $this->_escape_table($table); + } + + // -------------------------------------------------------------------- + + /** + * The error message string + * + * @access private + * @return string + */ + function _error_message() + { + $error = array_shift(sqlsrv_errors()); + return !empty($error['message']) ? $error['message'] : null; + } + + // -------------------------------------------------------------------- + + /** + * The error message number + * + * @access private + * @return integer + */ + function _error_number() + { + $error = array_shift(sqlsrv_errors()); + return isset($error['SQLSTATE']) ? $error['SQLSTATE'] : null; + } + + // -------------------------------------------------------------------- + + /** + * Escape Table Name + * + * This function adds backticks if the table name has a period + * in it. Some DBs will get cranky unless periods are escaped + * + * @access private + * @param string the table name + * @return string + */ + function _escape_table($table) + { + return $table; + } + + + /** + * Escape the SQL Identifiers + * + * This function escapes column and table names + * + * @access private + * @param string + * @return string + */ + function _escape_identifiers($item) + { + return $item; + } + + // -------------------------------------------------------------------- + + /** + * From Tables + * + * This function implicitly groups FROM tables so there is no confusion + * about operator precedence in harmony with SQL standards + * + * @access public + * @param type + * @return type + */ + function _from_tables($tables) + { + if ( ! is_array($tables)) + { + $tables = array($tables); + } + + return implode(', ', $tables); + } + + // -------------------------------------------------------------------- + + /** + * Insert statement + * + * Generates a platform-specific insert string from the supplied data + * + * @access public + * @param string the table name + * @param array the insert keys + * @param array the insert values + * @return string + */ + function _insert($table, $keys, $values) + { + return "INSERT INTO ".$this->_escape_table($table)." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; + } + + // -------------------------------------------------------------------- + + /** + * Update statement + * + * Generates a platform-specific update string from the supplied data + * + * @access public + * @param string the table name + * @param array the update data + * @param array the where clause + * @param array the orderby clause + * @param array the limit clause + * @return string + */ + function _update($table, $values, $where) + { + foreach($values as $key => $val) + { + $valstr[] = $key." = ".$val; + } + + return "UPDATE ".$this->_escape_table($table)." SET ".implode(', ', $valstr)." WHERE ".implode(" ", $where); + } + + // -------------------------------------------------------------------- + + /** + * Truncate statement + * + * Generates a platform-specific truncate string from the supplied data + * If the database does not support the truncate() command + * This function maps to "DELETE FROM table" + * + * @access public + * @param string the table name + * @return string + */ + function _truncate($table) + { + return "TRUNCATE TABLE ".$table; + } + + // -------------------------------------------------------------------- + + /** + * Delete statement + * + * Generates a platform-specific delete string from the supplied data + * + * @access public + * @param string the table name + * @param array the where clause + * @param string the limit clause + * @return string + */ + function _delete($table, $where) + { + return "DELETE FROM ".$this->_escape_table($table)." WHERE ".implode(" ", $where); + } + + // -------------------------------------------------------------------- + + /** + * Limit string + * + * Generates a platform-specific LIMIT clause + * + * @access public + * @param string the sql query string + * @param integer the number of rows to limit the query to + * @param integer the offset value + * @return string + */ + function _limit($sql, $limit, $offset) + { + $i = $limit + $offset; + + return preg_replace('/(^\SELECT (DISTINCT)?)/i','\\1 TOP '.$i.' ', $sql); + } + + // -------------------------------------------------------------------- + + /** + * Close DB Connection + * + * @access public + * @param resource + * @return void + */ + function _close($conn_id) + { + @sqlsrv_close($conn_id); + } + +} + + + +/* End of file sqlsrv_driver.php */ +/* Location: ./system/database/drivers/sqlsrv/sqlsrv_driver.php */ \ No newline at end of file diff --git a/system/database/drivers/sqlsrv/sqlsrv_forge.php b/system/database/drivers/sqlsrv/sqlsrv_forge.php new file mode 100644 index 0000000..d3a5549 --- /dev/null +++ b/system/database/drivers/sqlsrv/sqlsrv_forge.php @@ -0,0 +1,246 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * SQLSRV Forge Class + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_sqlsrv_forge extends CI_DB_forge { + + /** + * Create database + * + * @access private + * @param string the database name + * @return bool + */ + function _create_database($name) + { + return "CREATE DATABASE ".$name; + } + + // -------------------------------------------------------------------- + + /** + * Drop database + * + * @access private + * @param string the database name + * @return bool + */ + function _drop_database($name) + { + return "DROP DATABASE ".$name; + } + + // -------------------------------------------------------------------- + + /** + * Drop Table + * + * @access private + * @return bool + */ + function _drop_table($table) + { + return "IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = '" + .$table."')) DROP TABLE [dbo].[".$table."]"; + } + + // -------------------------------------------------------------------- + + /** + * Create Table + * + * @access private + * @param string the table name + * @param array the fields + * @param mixed primary key(s) + * @param mixed key(s) + * @param boolean should 'IF NOT EXISTS' be added to the SQL + * @return bool + */ + function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists) + { + $sql = ''; + if ($if_not_exists === TRUE) + { + $sql = "IF (NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = "; + } + $sql .= $this->db->_escape_identifiers($table).")) CREATE TABLE ".$this->db->_escape_identifiers($table)." ("; + $current_field_count = 0; + + foreach ($fields as $field=>$attributes) + { + // Numeric field names aren't allowed in databases, so if the key is + // numeric, we know it was assigned by PHP and the developer manually + // entered the field information, so we'll simply add it to the list + if (is_numeric($field)) + { + $sql .= "\n\t$attributes"; + } + else + { + $attributes = array_change_key_case($attributes, CASE_UPPER); + + $sql .= "\n\t".$this->db->_protect_identifiers($field); + + $sql .= ' '.$attributes['TYPE']; + + if (array_key_exists('CONSTRAINT', $attributes)) + { + $sql .= '('.$attributes['CONSTRAINT'].')'; + } + + if (array_key_exists('UNSIGNED', $attributes) && $attributes['UNSIGNED'] === TRUE) + { + $sql .= ' UNSIGNED'; + } + + if (array_key_exists('DEFAULT', $attributes)) + { + $sql .= ' DEFAULT \''.$attributes['DEFAULT'].'\''; + } + + if (array_key_exists('NULL', $attributes) && $attributes['NULL'] === TRUE) + { + $sql .= ' NULL'; + } + else + { + $sql .= ' NOT NULL'; + } + + if (array_key_exists('AUTO_INCREMENT', $attributes) && $attributes['AUTO_INCREMENT'] === TRUE) + { + $sql .= ' IDENTITY(1,1)'; + } + } + + // don't add a comma on the end of the last field + if (++$current_field_count < count($fields)) + { + $sql .= ','; + } + } + + if (count($primary_keys) > 0) + { + $primary_keys = $this->db->_protect_identifiers($primary_keys); + $sql .= ",\n\tPRIMARY KEY (" . implode(', ', $primary_keys) . ")"; + } + + if (is_array($keys) && count($keys) > 0) + { + foreach ($keys as $key) + { + if (is_array($key)) + { + $key = $this->db->_protect_identifiers($key); + } + else + { + $key = array($this->db->_protect_identifiers($key)); + } + + $sql .= ",\n\tFOREIGN KEY (" . implode(', ', $key) . ")"; + } + } + + $sql .= "\n)"; + + return $sql; + } + + // -------------------------------------------------------------------- + + /** + * Alter table query + * + * Generates a platform-specific query so that a table can be altered + * Called by add_column(), drop_column(), and column_alter(), + * + * @access private + * @param string the ALTER type (ADD, DROP, CHANGE) + * @param string the column name + * @param string the table name + * @param string the column definition + * @param string the default value + * @param boolean should 'NOT NULL' be added + * @param string the field after which we should add the new field + * @return object + */ + function _alter_table($alter_type, $table, $column_name, $column_definition = '', $default_value = '', $null = '', $after_field = '') + { + $sql = 'ALTER TABLE '.$this->db->_protect_identifiers($table)." $alter_type ".$this->db->_protect_identifiers($column_name); + + // DROP has everything it needs now. + if ($alter_type == 'DROP') + { + return $sql; + } + + $sql .= " $column_definition"; + + if ($default_value != '') + { + $sql .= " DEFAULT \"$default_value\""; + } + + if ($null === NULL) + { + $sql .= ' NULL'; + } + else + { + $sql .= ' NOT NULL'; + } + + if ($after_field != '') + { + $sql .= ' AFTER ' . $this->db->_protect_identifiers($after_field); + } + + return $sql; + + } + + // -------------------------------------------------------------------- + + /** + * Rename a table + * + * Generates a platform-specific query so that a table can be renamed + * + * @access private + * @param string the old table name + * @param string the new table name + * @return string + */ + function _rename_table($table_name, $new_table_name) + { + return 'EXEC sp_rename '.$this->db->_protect_identifiers($table_name).", ".$this->db->_protect_identifiers($new_table_name); + } + +} + +/* End of file sqlsrv_forge.php */ +/* Location: ./system/database/drivers/sqlsrv/sqlsrv_forge.php */ \ No newline at end of file diff --git a/system/database/drivers/sqlsrv/sqlsrv_result.php b/system/database/drivers/sqlsrv/sqlsrv_result.php new file mode 100644 index 0000000..0d2dbf5 --- /dev/null +++ b/system/database/drivers/sqlsrv/sqlsrv_result.php @@ -0,0 +1,170 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * SQLSRV Result Class + * + * This class extends the parent result class: CI_DB_result + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_sqlsrv_result extends CI_DB_result { + + /** + * Number of rows in the result set + * + * @access public + * @return integer + */ + function num_rows() + { + return @sqlsrv_num_rows($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Number of fields in the result set + * + * @access public + * @return integer + */ + function num_fields() + { + return @sqlsrv_num_fields($this->result_id); + } + + // -------------------------------------------------------------------- + + /** + * Fetch Field Names + * + * Generates an array of column names + * + * @access public + * @return array + */ + function list_fields() + { + $field_names = array(); + foreach(sqlsrv_field_metadata($this->result_id) as $offset => $field) + { + $field_names[] = $field['Name']; + } + + return $field_names; + } + + // -------------------------------------------------------------------- + + /** + * Field data + * + * Generates an array of objects containing field meta-data + * + * @access public + * @return array + */ + function field_data() + { + $retval = array(); + foreach(sqlsrv_field_metadata($this->result_id) as $offset => $field) + { + $F = new stdClass(); + $F->name = $field['Name']; + $F->type = $field['Type']; + $F->max_length = $field['Size']; + $F->primary_key = 0; + $F->default = ''; + + $retval[] = $F; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Free the result + * + * @return null + */ + function free_result() + { + if (is_resource($this->result_id)) + { + sqlsrv_free_stmt($this->result_id); + $this->result_id = FALSE; + } + } + + // -------------------------------------------------------------------- + + /** + * Data Seek + * + * Moves the internal pointer to the desired offset. We call + * this internally before fetching results to make sure the + * result set starts at zero + * + * @access private + * @return array + */ + function _data_seek($n = 0) + { + // Not implemented + } + + // -------------------------------------------------------------------- + + /** + * Result - associative array + * + * Returns the result set as an array + * + * @access private + * @return array + */ + function _fetch_assoc() + { + return sqlsrv_fetch_array($this->result_id, SQLSRV_FETCH_ASSOC); + } + + // -------------------------------------------------------------------- + + /** + * Result - object + * + * Returns the result set as an object + * + * @access private + * @return object + */ + function _fetch_object() + { + return sqlsrv_fetch_object($this->result_id); + } + +} + + +/* End of file mssql_result.php */ +/* Location: ./system/database/drivers/mssql/mssql_result.php */ \ No newline at end of file diff --git a/system/database/drivers/sqlsrv/sqlsrv_utility.php b/system/database/drivers/sqlsrv/sqlsrv_utility.php new file mode 100644 index 0000000..3975e85 --- /dev/null +++ b/system/database/drivers/sqlsrv/sqlsrv_utility.php @@ -0,0 +1,89 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * SQLSRV Utility Class + * + * @category Database + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/database/ + */ +class CI_DB_sqlsrv_utility extends CI_DB_utility { + + /** + * List databases + * + * @access private + * @return bool + */ + function _list_databases() + { + return "EXEC sp_helpdb"; // Can also be: EXEC sp_databases + } + + // -------------------------------------------------------------------- + + /** + * Optimize table query + * + * Generates a platform-specific query so that a table can be optimized + * + * @access private + * @param string the table name + * @return object + */ + function _optimize_table($table) + { + return FALSE; // Is this supported in MS SQL? + } + + // -------------------------------------------------------------------- + + /** + * Repair table query + * + * Generates a platform-specific query so that a table can be repaired + * + * @access private + * @param string the table name + * @return object + */ + function _repair_table($table) + { + return FALSE; // Is this supported in MS SQL? + } + + // -------------------------------------------------------------------- + + /** + * MSSQL Export + * + * @access private + * @param array Preferences + * @return mixed + */ + function _backup($params = array()) + { + // Currently unsupported + return $this->db->display_error('db_unsuported_feature'); + } + +} + +/* End of file mssql_utility.php */ +/* Location: ./system/database/drivers/mssql/mssql_utility.php */ \ No newline at end of file diff --git a/system/database/index.html b/system/database/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/system/database/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/system/fonts/index.html b/system/fonts/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/system/fonts/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/system/fonts/texb.ttf b/system/fonts/texb.ttf new file mode 100644 index 0000000..383c88b Binary files /dev/null and b/system/fonts/texb.ttf differ diff --git a/system/helpers/array_helper.php b/system/helpers/array_helper.php new file mode 100644 index 0000000..04c6873 --- /dev/null +++ b/system/helpers/array_helper.php @@ -0,0 +1,120 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Array Helpers + * + * @package CodeIgniter + * @subpackage Helpers + * @category Helpers + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/helpers/array_helper.html + */ + +// ------------------------------------------------------------------------ + +/** + * Element + * + * Lets you determine whether an array index is set and whether it has a value. + * If the element is empty it returns FALSE (or whatever you specify as the default value.) + * + * @access public + * @param string + * @param array + * @param mixed + * @return mixed depends on what the array contains + */ +if ( ! function_exists('element')) +{ + function element($item, $array, $default = FALSE) + { + if ( ! isset($array[$item]) OR $array[$item] == "") + { + return $default; + } + + return $array[$item]; + } +} + +// ------------------------------------------------------------------------ + +/** + * Random Element - Takes an array as input and returns a random element + * + * @access public + * @param array + * @return mixed depends on what the array contains + */ +if ( ! function_exists('random_element')) +{ + function random_element($array) + { + if ( ! is_array($array)) + { + return $array; + } + + return $array[array_rand($array)]; + } +} + +// -------------------------------------------------------------------- + +/** + * Elements + * + * Returns only the array items specified. Will return a default value if + * it is not set. + * + * @access public + * @param array + * @param array + * @param mixed + * @return mixed depends on what the array contains + */ +if ( ! function_exists('elements')) +{ + function elements($items, $array, $default = FALSE) + { + $return = array(); + + if ( ! is_array($items)) + { + $items = array($items); + } + + foreach ($items as $item) + { + if (isset($array[$item])) + { + $return[$item] = $array[$item]; + } + else + { + $return[$item] = $default; + } + } + + return $return; + } +} + +/* End of file array_helper.php */ +/* Location: ./system/helpers/array_helper.php */ \ No newline at end of file diff --git a/system/helpers/captcha_helper.php b/system/helpers/captcha_helper.php new file mode 100644 index 0000000..831b460 --- /dev/null +++ b/system/helpers/captcha_helper.php @@ -0,0 +1,336 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter CAPTCHA Helper + * + * @package CodeIgniter + * @subpackage Helpers + * @category Helpers + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/helpers/xml_helper.html + */ + +// ------------------------------------------------------------------------ + +/** + * Create CAPTCHA + * + * @access public + * @param array array of data for the CAPTCHA + * @param string path to create the image in + * @param string URL to the CAPTCHA image folder + * @param string server path to font + * @return string + */ +if ( ! function_exists('create_captcha')) +{ + function create_captcha($data = '', $img_path = '', $img_url = '', $font_path = '') + { + $defaults = array('word' => '', 'img_path' => '', 'img_url' => '', 'img_width' => '150', 'img_height' => '30', 'font_path' => '', 'expiration' => 7200); + + foreach ($defaults as $key => $val) + { + if ( ! is_array($data)) + { + if ( ! isset($$key) OR $$key == '') + { + $$key = $val; + } + } + else + { + $$key = ( ! isset($data[$key])) ? $val : $data[$key]; + } + } + + if ($img_path == '' OR $img_url == '') + { + return FALSE; + } + + if ( ! @is_dir($img_path)) + { + return FALSE; + } + + if ( ! is_writable($img_path)) + { + return FALSE; + } + + if ( ! extension_loaded('gd')) + { + return FALSE; + } + + // ----------------------------------- + // Remove old images + // ----------------------------------- + + list($usec, $sec) = explode(" ", microtime()); + $now = ((float)$usec + (float)$sec); + + $current_dir = @opendir($img_path); + + while ($filename = @readdir($current_dir)) + { + if ($filename != "." and $filename != ".." and $filename != "index.html") + { + $name = str_replace(".jpg", "", $filename); + + if (($name + $expiration) < $now) + { + @unlink($img_path.$filename); + } + } + } + + @closedir($current_dir); + + // ----------------------------------- + // Do we have a "word" yet? + // ----------------------------------- + + // ----------------------------------- + // Do we have a "word" yet? + // ----------------------------------- + + if (empty($word)) + { + $word = ''; + $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + $pool_length = strlen($pool); + $rand_max = $pool_length - 1; + + // PHP7 or a suitable polyfill + if (function_exists('random_int')) + { + try + { + for ($i = 0; $i < $word_length; $i++) + { + $word .= $pool[random_int(0, $rand_max)]; + } + } + catch (Exception $e) + { + // This means fallback to the next possible + // alternative to random_int() + $word = ''; + } + } + } + + if (empty($word)) + { + // To avoid numerous get_random_bytes() calls, we'll + // just try fetching as much bytes as we need at once. + if (($bytes = _ci_captcha_get_random_bytes($pool_length)) !== FALSE) + { + $byte_index = $word_index = 0; + while ($word_index < $word_length) + { + if (($rand_index = unpack('C', $bytes[$byte_index++])) > $rand_max) + { + // Was this the last byte we have? + // If so, try to fetch more. + if ($byte_index === $pool_length) + { + // No failures should be possible if + // the first get_random_bytes() call + // didn't return FALSE, but still ... + for ($i = 0; $i < 5; $i++) + { + if (($bytes = _ci_captcha_get_random_bytes($pool_length)) === FALSE) + { + continue; + } + + $byte_index = 0; + break; + } + + if ($bytes === FALSE) + { + // Sadly, this means fallback to mt_rand() + $word = ''; + break; + } + } + + continue; + } + + $word .= $pool[$rand_index]; + $word_index++; + } + } + } + + if (empty($word)) + { + for ($i = 0; $i < $word_length; $i++) + { + $word .= $pool[mt_rand(0, $rand_max)]; + } + } + elseif ( ! is_string($word)) + { + $word = (string) $word; + } + + // ----------------------------------- + // Determine angle and position + // ----------------------------------- + + $length = strlen($word); + $angle = ($length >= 6) ? rand(-($length-6), ($length-6)) : 0; + $x_axis = rand(6, (360/$length)-16); + $y_axis = ($angle >= 0 ) ? rand($img_height, $img_width) : rand(6, $img_height); + + // ----------------------------------- + // Create image + // ----------------------------------- + + // PHP.net recommends imagecreatetruecolor(), but it isn't always available + if (function_exists('imagecreatetruecolor')) + { + $im = imagecreatetruecolor($img_width, $img_height); + } + else + { + $im = imagecreate($img_width, $img_height); + } + + // ----------------------------------- + // Assign colors + // ----------------------------------- + + $bg_color = imagecolorallocate ($im, 255, 255, 255); + $border_color = imagecolorallocate ($im, 153, 102, 102); + $text_color = imagecolorallocate ($im, 204, 153, 153); + $grid_color = imagecolorallocate($im, 255, 182, 182); + $shadow_color = imagecolorallocate($im, 255, 240, 240); + + // ----------------------------------- + // Create the rectangle + // ----------------------------------- + + ImageFilledRectangle($im, 0, 0, $img_width, $img_height, $bg_color); + + // ----------------------------------- + // Create the spiral pattern + // ----------------------------------- + + $theta = 1; + $thetac = 7; + $radius = 16; + $circles = 20; + $points = 32; + + for ($i = 0; $i < ($circles * $points) - 1; $i++) + { + $theta = $theta + $thetac; + $rad = $radius * ($i / $points ); + $x = ($rad * cos($theta)) + $x_axis; + $y = ($rad * sin($theta)) + $y_axis; + $theta = $theta + $thetac; + $rad1 = $radius * (($i + 1) / $points); + $x1 = ($rad1 * cos($theta)) + $x_axis; + $y1 = ($rad1 * sin($theta )) + $y_axis; + imageline($im, $x, $y, $x1, $y1, $grid_color); + $theta = $theta - $thetac; + } + + // ----------------------------------- + // Write the text + // ----------------------------------- + + $use_font = ($font_path != '' AND file_exists($font_path) AND function_exists('imagettftext')) ? TRUE : FALSE; + + if ($use_font == FALSE) + { + $font_size = 5; + $x = rand(0, $img_width/($length/3)); + $y = 0; + } + else + { + $font_size = 16; + $x = rand(0, $img_width/($length/1.5)); + $y = $font_size+2; + } + + for ($i = 0; $i < strlen($word); $i++) + { + if ($use_font == FALSE) + { + $y = rand(0 , $img_height/2); + imagestring($im, $font_size, $x, $y, substr($word, $i, 1), $text_color); + $x += ($font_size*2); + } + else + { + $y = rand($img_height/2, $img_height-3); + imagettftext($im, $font_size, $angle, $x, $y, $text_color, $font_path, substr($word, $i, 1)); + $x += $font_size; + } + } + + + // ----------------------------------- + // Create the border + // ----------------------------------- + + imagerectangle($im, 0, 0, $img_width-1, $img_height-1, $border_color); + + // ----------------------------------- + // Generate the image + // ----------------------------------- + + $img_name = $now.'.jpg'; + + ImageJPEG($im, $img_path.$img_name); + + $img = "<img src=\"$img_url$img_name\" width=\"$img_width\" height=\"$img_height\" style=\"border:0;\" alt=\" \" />"; + + ImageDestroy($im); + + return array('word' => $word, 'time' => $now, 'image' => $img); + } + + function _ci_captcha_get_random_bytes($length) + { + if (defined('MCRYPT_DEV_URANDOM')) + { + return mcrypt_create_iv($length, MCRYPT_DEV_URANDOM); + } + elseif (function_exists('openssl_random_pseudo_bytes')) + { + return openssl_random_pseudo_bytes($length); + } + + return FALSE; + } +} + +// ------------------------------------------------------------------------ + +/* End of file captcha_helper.php */ +/* Location: ./system/heleprs/captcha_helper.php */ \ No newline at end of file diff --git a/system/helpers/cookie_helper.php b/system/helpers/cookie_helper.php new file mode 100644 index 0000000..e8f5d08 --- /dev/null +++ b/system/helpers/cookie_helper.php @@ -0,0 +1,104 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Cookie Helpers + * + * @package CodeIgniter + * @subpackage Helpers + * @category Helpers + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/helpers/cookie_helper.html + */ + +// ------------------------------------------------------------------------ + +/** + * Set cookie + * + * Accepts six parameter, or you can submit an associative + * array in the first parameter containing all the values. + * + * @access public + * @param mixed + * @param string the value of the cookie + * @param string the number of seconds until expiration + * @param string the cookie domain. Usually: .yourdomain.com + * @param string the cookie path + * @param string the cookie prefix + * @return void + */ +if ( ! function_exists('set_cookie')) +{ + function set_cookie($name = '', $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = FALSE) + { + // Set the config file options + $CI =& get_instance(); + $CI->input->set_cookie($name, $value, $expire, $domain, $path, $prefix, $secure); + } +} + +// -------------------------------------------------------------------- + +/** + * Fetch an item from the COOKIE array + * + * @access public + * @param string + * @param bool + * @return mixed + */ +if ( ! function_exists('get_cookie')) +{ + function get_cookie($index = '', $xss_clean = FALSE) + { + $CI =& get_instance(); + + $prefix = ''; + + if ( ! isset($_COOKIE[$index]) && config_item('cookie_prefix') != '') + { + $prefix = config_item('cookie_prefix'); + } + + return $CI->input->cookie($prefix.$index, $xss_clean); + } +} + +// -------------------------------------------------------------------- + +/** + * Delete a COOKIE + * + * @param mixed + * @param string the cookie domain. Usually: .yourdomain.com + * @param string the cookie path + * @param string the cookie prefix + * @return void + */ +if ( ! function_exists('delete_cookie')) +{ + function delete_cookie($name = '', $domain = '', $path = '/', $prefix = '') + { + set_cookie($name, '', '', $domain, $path, $prefix); + } +} + + +/* End of file cookie_helper.php */ +/* Location: ./system/helpers/cookie_helper.php */ \ No newline at end of file diff --git a/system/helpers/date_helper.php b/system/helpers/date_helper.php new file mode 100644 index 0000000..1de0132 --- /dev/null +++ b/system/helpers/date_helper.php @@ -0,0 +1,612 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Date Helpers + * + * @package CodeIgniter + * @subpackage Helpers + * @category Helpers + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/helpers/date_helper.html + */ + +// ------------------------------------------------------------------------ + +/** + * Get "now" time + * + * Returns time() or its GMT equivalent based on the config file preference + * + * @access public + * @return integer + */ +if ( ! function_exists('now')) +{ + function now() + { + $CI =& get_instance(); + + if (strtolower($CI->config->item('time_reference')) == 'gmt') + { + $now = time(); + $system_time = mktime(gmdate("H", $now), gmdate("i", $now), gmdate("s", $now), gmdate("m", $now), gmdate("d", $now), gmdate("Y", $now)); + + if (strlen($system_time) < 10) + { + $system_time = time(); + log_message('error', 'The Date class could not set a proper GMT timestamp so the local time() value was used.'); + } + + return $system_time; + } + else + { + return time(); + } + } +} + +// ------------------------------------------------------------------------ + +/** + * Convert MySQL Style Datecodes + * + * This function is identical to PHPs date() function, + * except that it allows date codes to be formatted using + * the MySQL style, where each code letter is preceded + * with a percent sign: %Y %m %d etc... + * + * The benefit of doing dates this way is that you don't + * have to worry about escaping your text letters that + * match the date codes. + * + * @access public + * @param string + * @param integer + * @return integer + */ +if ( ! function_exists('mdate')) +{ + function mdate($datestr = '', $time = '') + { + if ($datestr == '') + return ''; + + if ($time == '') + $time = now(); + + $datestr = str_replace('%\\', '', preg_replace("/([a-z]+?){1}/i", "\\\\\\1", $datestr)); + return date($datestr, $time); + } +} + +// ------------------------------------------------------------------------ + +/** + * Standard Date + * + * Returns a date formatted according to the submitted standard. + * + * @access public + * @param string the chosen format + * @param integer Unix timestamp + * @return string + */ +if ( ! function_exists('standard_date')) +{ + function standard_date($fmt = 'DATE_RFC822', $time = '') + { + $formats = array( + 'DATE_ATOM' => '%Y-%m-%dT%H:%i:%s%Q', + 'DATE_COOKIE' => '%l, %d-%M-%y %H:%i:%s UTC', + 'DATE_ISO8601' => '%Y-%m-%dT%H:%i:%s%Q', + 'DATE_RFC822' => '%D, %d %M %y %H:%i:%s %O', + 'DATE_RFC850' => '%l, %d-%M-%y %H:%i:%s UTC', + 'DATE_RFC1036' => '%D, %d %M %y %H:%i:%s %O', + 'DATE_RFC1123' => '%D, %d %M %Y %H:%i:%s %O', + 'DATE_RSS' => '%D, %d %M %Y %H:%i:%s %O', + 'DATE_W3C' => '%Y-%m-%dT%H:%i:%s%Q' + ); + + if ( ! isset($formats[$fmt])) + { + return FALSE; + } + + return mdate($formats[$fmt], $time); + } +} + +// ------------------------------------------------------------------------ + +/** + * Timespan + * + * Returns a span of seconds in this format: + * 10 days 14 hours 36 minutes 47 seconds + * + * @access public + * @param integer a number of seconds + * @param integer Unix timestamp + * @return integer + */ +if ( ! function_exists('timespan')) +{ + function timespan($seconds = 1, $time = '') + { + $CI =& get_instance(); + $CI->lang->load('date'); + + if ( ! is_numeric($seconds)) + { + $seconds = 1; + } + + if ( ! is_numeric($time)) + { + $time = time(); + } + + if ($time <= $seconds) + { + $seconds = 1; + } + else + { + $seconds = $time - $seconds; + } + + $str = ''; + $years = floor($seconds / 31536000); + + if ($years > 0) + { + $str .= $years.' '.$CI->lang->line((($years > 1) ? 'date_years' : 'date_year')).', '; + } + + $seconds -= $years * 31536000; + $months = floor($seconds / 2628000); + + if ($years > 0 OR $months > 0) + { + if ($months > 0) + { + $str .= $months.' '.$CI->lang->line((($months > 1) ? 'date_months' : 'date_month')).', '; + } + + $seconds -= $months * 2628000; + } + + $weeks = floor($seconds / 604800); + + if ($years > 0 OR $months > 0 OR $weeks > 0) + { + if ($weeks > 0) + { + $str .= $weeks.' '.$CI->lang->line((($weeks > 1) ? 'date_weeks' : 'date_week')).', '; + } + + $seconds -= $weeks * 604800; + } + + $days = floor($seconds / 86400); + + if ($months > 0 OR $weeks > 0 OR $days > 0) + { + if ($days > 0) + { + $str .= $days.' '.$CI->lang->line((($days > 1) ? 'date_days' : 'date_day')).', '; + } + + $seconds -= $days * 86400; + } + + $hours = floor($seconds / 3600); + + if ($days > 0 OR $hours > 0) + { + if ($hours > 0) + { + $str .= $hours.' '.$CI->lang->line((($hours > 1) ? 'date_hours' : 'date_hour')).', '; + } + + $seconds -= $hours * 3600; + } + + $minutes = floor($seconds / 60); + + if ($days > 0 OR $hours > 0 OR $minutes > 0) + { + if ($minutes > 0) + { + $str .= $minutes.' '.$CI->lang->line((($minutes > 1) ? 'date_minutes' : 'date_minute')).', '; + } + + $seconds -= $minutes * 60; + } + + if ($str == '') + { + $str .= $seconds.' '.$CI->lang->line((($seconds > 1) ? 'date_seconds' : 'date_second')).', '; + } + + return substr(trim($str), 0, -1); + } +} + +// ------------------------------------------------------------------------ + +/** + * Number of days in a month + * + * Takes a month/year as input and returns the number of days + * for the given month/year. Takes leap years into consideration. + * + * @access public + * @param integer a numeric month + * @param integer a numeric year + * @return integer + */ +if ( ! function_exists('days_in_month')) +{ + function days_in_month($month = 0, $year = '') + { + if ($month < 1 OR $month > 12) + { + return 0; + } + + if ( ! is_numeric($year) OR strlen($year) != 4) + { + $year = date('Y'); + } + + if ($month == 2) + { + if ($year % 400 == 0 OR ($year % 4 == 0 AND $year % 100 != 0)) + { + return 29; + } + } + + $days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); + return $days_in_month[$month - 1]; + } +} + +// ------------------------------------------------------------------------ + +/** + * Converts a local Unix timestamp to GMT + * + * @access public + * @param integer Unix timestamp + * @return integer + */ +if ( ! function_exists('local_to_gmt')) +{ + function local_to_gmt($time = '') + { + if ($time == '') + $time = time(); + + return mktime( gmdate("H", $time), gmdate("i", $time), gmdate("s", $time), gmdate("m", $time), gmdate("d", $time), gmdate("Y", $time)); + } +} + +// ------------------------------------------------------------------------ + +/** + * Converts GMT time to a localized value + * + * Takes a Unix timestamp (in GMT) as input, and returns + * at the local value based on the timezone and DST setting + * submitted + * + * @access public + * @param integer Unix timestamp + * @param string timezone + * @param bool whether DST is active + * @return integer + */ +if ( ! function_exists('gmt_to_local')) +{ + function gmt_to_local($time = '', $timezone = 'UTC', $dst = FALSE) + { + if ($time == '') + { + return now(); + } + + $time += timezones($timezone) * 3600; + + if ($dst == TRUE) + { + $time += 3600; + } + + return $time; + } +} + +// ------------------------------------------------------------------------ + +/** + * Converts a MySQL Timestamp to Unix + * + * @access public + * @param integer Unix timestamp + * @return integer + */ +if ( ! function_exists('mysql_to_unix')) +{ + function mysql_to_unix($time = '') + { + // We'll remove certain characters for backward compatibility + // since the formatting changed with MySQL 4.1 + // YYYY-MM-DD HH:MM:SS + + $time = str_replace('-', '', $time); + $time = str_replace(':', '', $time); + $time = str_replace(' ', '', $time); + + // YYYYMMDDHHMMSS + return mktime( + substr($time, 8, 2), + substr($time, 10, 2), + substr($time, 12, 2), + substr($time, 4, 2), + substr($time, 6, 2), + substr($time, 0, 4) + ); + } +} + +// ------------------------------------------------------------------------ + +/** + * Unix to "Human" + * + * Formats Unix timestamp to the following prototype: 2006-08-21 11:35 PM + * + * @access public + * @param integer Unix timestamp + * @param bool whether to show seconds + * @param string format: us or euro + * @return string + */ +if ( ! function_exists('unix_to_human')) +{ + function unix_to_human($time = '', $seconds = FALSE, $fmt = 'us') + { + $r = date('Y', $time).'-'.date('m', $time).'-'.date('d', $time).' '; + + if ($fmt == 'us') + { + $r .= date('h', $time).':'.date('i', $time); + } + else + { + $r .= date('H', $time).':'.date('i', $time); + } + + if ($seconds) + { + $r .= ':'.date('s', $time); + } + + if ($fmt == 'us') + { + $r .= ' '.date('A', $time); + } + + return $r; + } +} + +// ------------------------------------------------------------------------ + +/** + * Convert "human" date to GMT + * + * Reverses the above process + * + * @access public + * @param string format: us or euro + * @return integer + */ +if ( ! function_exists('human_to_unix')) +{ + function human_to_unix($datestr = '') + { + if ($datestr == '') + { + return FALSE; + } + + $datestr = trim($datestr); + $datestr = preg_replace("/\040+/", ' ', $datestr); + + if ( ! preg_match('/^[0-9]{2,4}\-[0-9]{1,2}\-[0-9]{1,2}\s[0-9]{1,2}:[0-9]{1,2}(?::[0-9]{1,2})?(?:\s[AP]M)?$/i', $datestr)) + { + return FALSE; + } + + $split = explode(' ', $datestr); + + $ex = explode("-", $split['0']); + + $year = (strlen($ex['0']) == 2) ? '20'.$ex['0'] : $ex['0']; + $month = (strlen($ex['1']) == 1) ? '0'.$ex['1'] : $ex['1']; + $day = (strlen($ex['2']) == 1) ? '0'.$ex['2'] : $ex['2']; + + $ex = explode(":", $split['1']); + + $hour = (strlen($ex['0']) == 1) ? '0'.$ex['0'] : $ex['0']; + $min = (strlen($ex['1']) == 1) ? '0'.$ex['1'] : $ex['1']; + + if (isset($ex['2']) && preg_match('/[0-9]{1,2}/', $ex['2'])) + { + $sec = (strlen($ex['2']) == 1) ? '0'.$ex['2'] : $ex['2']; + } + else + { + // Unless specified, seconds get set to zero. + $sec = '00'; + } + + if (isset($split['2'])) + { + $ampm = strtolower($split['2']); + + if (substr($ampm, 0, 1) == 'p' AND $hour < 12) + $hour = $hour + 12; + + if (substr($ampm, 0, 1) == 'a' AND $hour == 12) + $hour = '00'; + + if (strlen($hour) == 1) + $hour = '0'.$hour; + } + + return mktime($hour, $min, $sec, $month, $day, $year); + } +} + +// ------------------------------------------------------------------------ + +/** + * Timezone Menu + * + * Generates a drop-down menu of timezones. + * + * @access public + * @param string timezone + * @param string classname + * @param string menu name + * @return string + */ +if ( ! function_exists('timezone_menu')) +{ + function timezone_menu($default = 'UTC', $class = "", $name = 'timezones') + { + $CI =& get_instance(); + $CI->lang->load('date'); + + if ($default == 'GMT') + $default = 'UTC'; + + $menu = '<select name="'.$name.'"'; + + if ($class != '') + { + $menu .= ' class="'.$class.'"'; + } + + $menu .= ">\n"; + + foreach (timezones() as $key => $val) + { + $selected = ($default == $key) ? " selected='selected'" : ''; + $menu .= "<option value='{$key}'{$selected}>".$CI->lang->line($key)."</option>\n"; + } + + $menu .= "</select>"; + + return $menu; + } +} + +// ------------------------------------------------------------------------ + +/** + * Timezones + * + * Returns an array of timezones. This is a helper function + * for various other ones in this library + * + * @access public + * @param string timezone + * @return string + */ +if ( ! function_exists('timezones')) +{ + function timezones($tz = '') + { + // Note: Don't change the order of these even though + // some items appear to be in the wrong order + + $zones = array( + 'UM12' => -12, + 'UM11' => -11, + 'UM10' => -10, + 'UM95' => -9.5, + 'UM9' => -9, + 'UM8' => -8, + 'UM7' => -7, + 'UM6' => -6, + 'UM5' => -5, + 'UM45' => -4.5, + 'UM4' => -4, + 'UM35' => -3.5, + 'UM3' => -3, + 'UM2' => -2, + 'UM1' => -1, + 'UTC' => 0, + 'UP1' => +1, + 'UP2' => +2, + 'UP3' => +3, + 'UP35' => +3.5, + 'UP4' => +4, + 'UP45' => +4.5, + 'UP5' => +5, + 'UP55' => +5.5, + 'UP575' => +5.75, + 'UP6' => +6, + 'UP65' => +6.5, + 'UP7' => +7, + 'UP8' => +8, + 'UP875' => +8.75, + 'UP9' => +9, + 'UP95' => +9.5, + 'UP10' => +10, + 'UP105' => +10.5, + 'UP11' => +11, + 'UP115' => +11.5, + 'UP12' => +12, + 'UP1275' => +12.75, + 'UP13' => +13, + 'UP14' => +14 + ); + + if ($tz == '') + { + return $zones; + } + + if ($tz == 'GMT') + $tz = 'UTC'; + + return ( ! isset($zones[$tz])) ? 0 : $zones[$tz]; + } +} + + +/* End of file date_helper.php */ +/* Location: ./system/helpers/date_helper.php */ \ No newline at end of file diff --git a/system/helpers/directory_helper.php b/system/helpers/directory_helper.php new file mode 100644 index 0000000..1f04eec --- /dev/null +++ b/system/helpers/directory_helper.php @@ -0,0 +1,81 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Directory Helpers + * + * @package CodeIgniter + * @subpackage Helpers + * @category Helpers + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/helpers/directory_helper.html + */ + +// ------------------------------------------------------------------------ + +/** + * Create a Directory Map + * + * Reads the specified directory and builds an array + * representation of it. Sub-folders contained with the + * directory will be mapped as well. + * + * @access public + * @param string path to source + * @param int depth of directories to traverse (0 = fully recursive, 1 = current dir, etc) + * @return array + */ +if ( ! function_exists('directory_map')) +{ + function directory_map($source_dir, $directory_depth = 0, $hidden = FALSE) + { + if ($fp = @opendir($source_dir)) + { + $filedata = array(); + $new_depth = $directory_depth - 1; + $source_dir = rtrim($source_dir, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; + + while (FALSE !== ($file = readdir($fp))) + { + // Remove '.', '..', and hidden files [optional] + if ( ! trim($file, '.') OR ($hidden == FALSE && $file[0] == '.')) + { + continue; + } + + if (($directory_depth < 1 OR $new_depth > 0) && @is_dir($source_dir.$file)) + { + $filedata[$file] = directory_map($source_dir.$file.DIRECTORY_SEPARATOR, $new_depth, $hidden); + } + else + { + $filedata[] = $file; + } + } + + closedir($fp); + return $filedata; + } + + return FALSE; + } +} + + +/* End of file directory_helper.php */ +/* Location: ./system/helpers/directory_helper.php */ \ No newline at end of file diff --git a/system/helpers/download_helper.php b/system/helpers/download_helper.php new file mode 100644 index 0000000..4739d5c --- /dev/null +++ b/system/helpers/download_helper.php @@ -0,0 +1,107 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Download Helpers + * + * @package CodeIgniter + * @subpackage Helpers + * @category Helpers + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/helpers/download_helper.html + */ + +// ------------------------------------------------------------------------ + +/** + * Force Download + * + * Generates headers that force a download to happen + * + * @access public + * @param string filename + * @param mixed the data to be downloaded + * @return void + */ +if ( ! function_exists('force_download')) +{ + function force_download($filename = '', $data = '') + { + if ($filename == '' OR $data == '') + { + return FALSE; + } + + // Try to determine if the filename includes a file extension. + // We need it in order to set the MIME type + if (FALSE === strpos($filename, '.')) + { + return FALSE; + } + + // Grab the file extension + $x = explode('.', $filename); + $extension = end($x); + + // Load the mime types + if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) + { + include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'); + } + elseif (is_file(APPPATH.'config/mimes.php')) + { + include(APPPATH.'config/mimes.php'); + } + + // Set a default mime if we can't find it + if ( ! isset($mimes[$extension])) + { + $mime = 'application/octet-stream'; + } + else + { + $mime = (is_array($mimes[$extension])) ? $mimes[$extension][0] : $mimes[$extension]; + } + + // Generate the server headers + if (strpos($_SERVER['HTTP_USER_AGENT'], "MSIE") !== FALSE) + { + header('Content-Type: '.$mime); + header('Content-Disposition: attachment; filename="'.$filename.'"'); + header('Expires: 0'); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header("Content-Transfer-Encoding: binary"); + header('Pragma: public'); + header("Content-Length: ".strlen($data)); + } + else + { + header('Content-Type: '.$mime); + header('Content-Disposition: attachment; filename="'.$filename.'"'); + header("Content-Transfer-Encoding: binary"); + header('Expires: 0'); + header('Pragma: no-cache'); + header("Content-Length: ".strlen($data)); + } + + exit($data); + } +} + +/* End of file download_helper.php */ +/* Location: ./system/helpers/download_helper.php */ \ No newline at end of file diff --git a/system/helpers/email_helper.php b/system/helpers/email_helper.php new file mode 100644 index 0000000..7c679f0 --- /dev/null +++ b/system/helpers/email_helper.php @@ -0,0 +1,63 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Email Helpers + * + * @package CodeIgniter + * @subpackage Helpers + * @category Helpers + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/helpers/email_helper.html + */ + +// ------------------------------------------------------------------------ + +/** + * Validate email address + * + * @access public + * @return bool + */ +if ( ! function_exists('valid_email')) +{ + function valid_email($address) + { + return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $address)) ? FALSE : TRUE; + } +} + +// ------------------------------------------------------------------------ + +/** + * Send an email + * + * @access public + * @return bool + */ +if ( ! function_exists('send_email')) +{ + function send_email($recipient, $subject = 'Test email', $message = 'Hello World') + { + return mail($recipient, $subject, $message); + } +} + + +/* End of file email_helper.php */ +/* Location: ./system/helpers/email_helper.php */ \ No newline at end of file diff --git a/system/helpers/file_helper.php b/system/helpers/file_helper.php new file mode 100644 index 0000000..573adc8 --- /dev/null +++ b/system/helpers/file_helper.php @@ -0,0 +1,480 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter File Helpers + * + * @package CodeIgniter + * @subpackage Helpers + * @category Helpers + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/helpers/file_helpers.html + */ + +// ------------------------------------------------------------------------ + +/** + * Read File + * + * Opens the file specfied in the path and returns it as a string. + * + * @access public + * @param string path to file + * @return string + */ +if ( ! function_exists('read_file')) +{ + function read_file($file) + { + if ( ! file_exists($file)) + { + return FALSE; + } + + if (function_exists('file_get_contents')) + { + return file_get_contents($file); + } + + if ( ! $fp = @fopen($file, FOPEN_READ)) + { + return FALSE; + } + + flock($fp, LOCK_SH); + + $data = ''; + if (filesize($file) > 0) + { + $data =& fread($fp, filesize($file)); + } + + flock($fp, LOCK_UN); + fclose($fp); + + return $data; + } +} + +// ------------------------------------------------------------------------ + +/** + * Write File + * + * Writes data to the file specified in the path. + * Creates a new file if non-existent. + * + * @access public + * @param string path to file + * @param string file data + * @return bool + */ +if ( ! function_exists('write_file')) +{ + function write_file($path, $data, $mode = FOPEN_WRITE_CREATE_DESTRUCTIVE) + { + if ( ! $fp = @fopen($path, $mode)) + { + return FALSE; + } + + flock($fp, LOCK_EX); + fwrite($fp, $data); + flock($fp, LOCK_UN); + fclose($fp); + + return TRUE; + } +} + +// ------------------------------------------------------------------------ + +/** + * Delete Files + * + * Deletes all files contained in the supplied directory path. + * Files must be writable or owned by the system in order to be deleted. + * If the second parameter is set to TRUE, any directories contained + * within the supplied base directory will be nuked as well. + * + * @access public + * @param string path to file + * @param bool whether to delete any directories found in the path + * @return bool + */ +if ( ! function_exists('delete_files')) +{ + function delete_files($path, $del_dir = FALSE, $level = 0) + { + // Trim the trailing slash + $path = rtrim($path, DIRECTORY_SEPARATOR); + + if ( ! $current_dir = @opendir($path)) + { + return FALSE; + } + + while (FALSE !== ($filename = @readdir($current_dir))) + { + if ($filename != "." and $filename != "..") + { + if (is_dir($path.DIRECTORY_SEPARATOR.$filename)) + { + // Ignore empty folders + if (substr($filename, 0, 1) != '.') + { + delete_files($path.DIRECTORY_SEPARATOR.$filename, $del_dir, $level + 1); + } + } + else + { + unlink($path.DIRECTORY_SEPARATOR.$filename); + } + } + } + @closedir($current_dir); + + if ($del_dir == TRUE AND $level > 0) + { + return @rmdir($path); + } + + return TRUE; + } +} + +// ------------------------------------------------------------------------ + +/** + * Get Filenames + * + * Reads the specified directory and builds an array containing the filenames. + * Any sub-folders contained within the specified path are read as well. + * + * @access public + * @param string path to source + * @param bool whether to include the path as part of the filename + * @param bool internal variable to determine recursion status - do not use in calls + * @return array + */ +if ( ! function_exists('get_filenames')) +{ + function get_filenames($source_dir, $include_path = FALSE, $_recursion = FALSE) + { + static $_filedata = array(); + + if ($fp = @opendir($source_dir)) + { + // reset the array and make sure $source_dir has a trailing slash on the initial call + if ($_recursion === FALSE) + { + $_filedata = array(); + $source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; + } + + while (FALSE !== ($file = readdir($fp))) + { + if (@is_dir($source_dir.$file) && strncmp($file, '.', 1) !== 0) + { + get_filenames($source_dir.$file.DIRECTORY_SEPARATOR, $include_path, TRUE); + } + elseif (strncmp($file, '.', 1) !== 0) + { + $_filedata[] = ($include_path == TRUE) ? $source_dir.$file : $file; + } + } + return $_filedata; + } + else + { + return FALSE; + } + } +} + +// -------------------------------------------------------------------- + +/** + * Get Directory File Information + * + * Reads the specified directory and builds an array containing the filenames, + * filesize, dates, and permissions + * + * Any sub-folders contained within the specified path are read as well. + * + * @access public + * @param string path to source + * @param bool Look only at the top level directory specified? + * @param bool internal variable to determine recursion status - do not use in calls + * @return array + */ +if ( ! function_exists('get_dir_file_info')) +{ + function get_dir_file_info($source_dir, $top_level_only = TRUE, $_recursion = FALSE) + { + static $_filedata = array(); + $relative_path = $source_dir; + + if ($fp = @opendir($source_dir)) + { + // reset the array and make sure $source_dir has a trailing slash on the initial call + if ($_recursion === FALSE) + { + $_filedata = array(); + $source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; + } + + // Used to be foreach (scandir($source_dir, 1) as $file), but scandir() is simply not as fast + while (FALSE !== ($file = readdir($fp))) + { + if (@is_dir($source_dir.$file) AND strncmp($file, '.', 1) !== 0 AND $top_level_only === FALSE) + { + get_dir_file_info($source_dir.$file.DIRECTORY_SEPARATOR, $top_level_only, TRUE); + } + elseif (strncmp($file, '.', 1) !== 0) + { + $_filedata[$file] = get_file_info($source_dir.$file); + $_filedata[$file]['relative_path'] = $relative_path; + } + } + + return $_filedata; + } + else + { + return FALSE; + } + } +} + +// -------------------------------------------------------------------- + +/** +* Get File Info +* +* Given a file and path, returns the name, path, size, date modified +* Second parameter allows you to explicitly declare what information you want returned +* Options are: name, server_path, size, date, readable, writable, executable, fileperms +* Returns FALSE if the file cannot be found. +* +* @access public +* @param string path to file +* @param mixed array or comma separated string of information returned +* @return array +*/ +if ( ! function_exists('get_file_info')) +{ + function get_file_info($file, $returned_values = array('name', 'server_path', 'size', 'date')) + { + + if ( ! file_exists($file)) + { + return FALSE; + } + + if (is_string($returned_values)) + { + $returned_values = explode(',', $returned_values); + } + + foreach ($returned_values as $key) + { + switch ($key) + { + case 'name': + $fileinfo['name'] = substr(strrchr($file, DIRECTORY_SEPARATOR), 1); + break; + case 'server_path': + $fileinfo['server_path'] = $file; + break; + case 'size': + $fileinfo['size'] = filesize($file); + break; + case 'date': + $fileinfo['date'] = filemtime($file); + break; + case 'readable': + $fileinfo['readable'] = is_readable($file); + break; + case 'writable': + // There are known problems using is_weritable on IIS. It may not be reliable - consider fileperms() + $fileinfo['writable'] = is_writable($file); + break; + case 'executable': + $fileinfo['executable'] = is_executable($file); + break; + case 'fileperms': + $fileinfo['fileperms'] = fileperms($file); + break; + } + } + + return $fileinfo; + } +} + +// -------------------------------------------------------------------- + +/** + * Get Mime by Extension + * + * Translates a file extension into a mime type based on config/mimes.php. + * Returns FALSE if it can't determine the type, or open the mime config file + * + * Note: this is NOT an accurate way of determining file mime types, and is here strictly as a convenience + * It should NOT be trusted, and should certainly NOT be used for security + * + * @access public + * @param string path to file + * @return mixed + */ +if ( ! function_exists('get_mime_by_extension')) +{ + function get_mime_by_extension($file) + { + $extension = strtolower(substr(strrchr($file, '.'), 1)); + + global $mimes; + + if ( ! is_array($mimes)) + { + if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) + { + include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'); + } + elseif (is_file(APPPATH.'config/mimes.php')) + { + include(APPPATH.'config/mimes.php'); + } + + if ( ! is_array($mimes)) + { + return FALSE; + } + } + + if (array_key_exists($extension, $mimes)) + { + if (is_array($mimes[$extension])) + { + // Multiple mime types, just give the first one + return current($mimes[$extension]); + } + else + { + return $mimes[$extension]; + } + } + else + { + return FALSE; + } + } +} + +// -------------------------------------------------------------------- + +/** + * Symbolic Permissions + * + * Takes a numeric value representing a file's permissions and returns + * standard symbolic notation representing that value + * + * @access public + * @param int + * @return string + */ +if ( ! function_exists('symbolic_permissions')) +{ + function symbolic_permissions($perms) + { + if (($perms & 0xC000) == 0xC000) + { + $symbolic = 's'; // Socket + } + elseif (($perms & 0xA000) == 0xA000) + { + $symbolic = 'l'; // Symbolic Link + } + elseif (($perms & 0x8000) == 0x8000) + { + $symbolic = '-'; // Regular + } + elseif (($perms & 0x6000) == 0x6000) + { + $symbolic = 'b'; // Block special + } + elseif (($perms & 0x4000) == 0x4000) + { + $symbolic = 'd'; // Directory + } + elseif (($perms & 0x2000) == 0x2000) + { + $symbolic = 'c'; // Character special + } + elseif (($perms & 0x1000) == 0x1000) + { + $symbolic = 'p'; // FIFO pipe + } + else + { + $symbolic = 'u'; // Unknown + } + + // Owner + $symbolic .= (($perms & 0x0100) ? 'r' : '-'); + $symbolic .= (($perms & 0x0080) ? 'w' : '-'); + $symbolic .= (($perms & 0x0040) ? (($perms & 0x0800) ? 's' : 'x' ) : (($perms & 0x0800) ? 'S' : '-')); + + // Group + $symbolic .= (($perms & 0x0020) ? 'r' : '-'); + $symbolic .= (($perms & 0x0010) ? 'w' : '-'); + $symbolic .= (($perms & 0x0008) ? (($perms & 0x0400) ? 's' : 'x' ) : (($perms & 0x0400) ? 'S' : '-')); + + // World + $symbolic .= (($perms & 0x0004) ? 'r' : '-'); + $symbolic .= (($perms & 0x0002) ? 'w' : '-'); + $symbolic .= (($perms & 0x0001) ? (($perms & 0x0200) ? 't' : 'x' ) : (($perms & 0x0200) ? 'T' : '-')); + + return $symbolic; + } +} + +// -------------------------------------------------------------------- + +/** + * Octal Permissions + * + * Takes a numeric value representing a file's permissions and returns + * a three character string representing the file's octal permissions + * + * @access public + * @param int + * @return string + */ +if ( ! function_exists('octal_permissions')) +{ + function octal_permissions($perms) + { + return substr(sprintf('%o', $perms), -3); + } +} + + +/* End of file file_helper.php */ +/* Location: ./system/helpers/file_helper.php */ \ No newline at end of file diff --git a/system/helpers/form_helper.php b/system/helpers/form_helper.php new file mode 100644 index 0000000..f07c45c --- /dev/null +++ b/system/helpers/form_helper.php @@ -0,0 +1,1055 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Form Helpers + * + * @package CodeIgniter + * @subpackage Helpers + * @category Helpers + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/helpers/form_helper.html + */ + +// ------------------------------------------------------------------------ + +/** + * Form Declaration + * + * Creates the opening portion of the form. + * + * @access public + * @param string the URI segments of the form destination + * @param array a key/value pair of attributes + * @param array a key/value pair hidden data + * @return string + */ +if ( ! function_exists('form_open')) +{ + function form_open($action = '', $attributes = '', $hidden = array()) + { + $CI =& get_instance(); + + if ($attributes == '') + { + $attributes = 'method="post"'; + } + + // If an action is not a full URL then turn it into one + if ($action && strpos($action, '://') === FALSE) + { + $action = $CI->config->site_url($action); + } + + // If no action is provided then set to the current url + $action OR $action = $CI->config->site_url($CI->uri->uri_string()); + + $form = '<form action="'.$action.'"'; + + $form .= _attributes_to_string($attributes, TRUE); + + $form .= '>'; + + // Add CSRF field if enabled, but leave it out for GET requests and requests to external websites + if ($CI->config->item('csrf_protection') === TRUE AND ! (strpos($action, $CI->config->base_url()) === FALSE OR strpos($form, 'method="get"'))) + { + $hidden[$CI->security->get_csrf_token_name()] = $CI->security->get_csrf_hash(); + } + + if (is_array($hidden) AND count($hidden) > 0) + { + $form .= sprintf("<div style=\"display:none\">%s</div>", form_hidden($hidden)); + } + + return $form; + } +} + +// ------------------------------------------------------------------------ + +/** + * Form Declaration - Multipart type + * + * Creates the opening portion of the form, but with "multipart/form-data". + * + * @access public + * @param string the URI segments of the form destination + * @param array a key/value pair of attributes + * @param array a key/value pair hidden data + * @return string + */ +if ( ! function_exists('form_open_multipart')) +{ + function form_open_multipart($action = '', $attributes = array(), $hidden = array()) + { + if (is_string($attributes)) + { + $attributes .= ' enctype="multipart/form-data"'; + } + else + { + $attributes['enctype'] = 'multipart/form-data'; + } + + return form_open($action, $attributes, $hidden); + } +} + +// ------------------------------------------------------------------------ + +/** + * Hidden Input Field + * + * Generates hidden fields. You can pass a simple key/value string or an associative + * array with multiple values. + * + * @access public + * @param mixed + * @param string + * @return string + */ +if ( ! function_exists('form_hidden')) +{ + function form_hidden($name, $value = '', $recursing = FALSE) + { + static $form; + + if ($recursing === FALSE) + { + $form = "\n"; + } + + if (is_array($name)) + { + foreach ($name as $key => $val) + { + form_hidden($key, $val, TRUE); + } + return $form; + } + + if ( ! is_array($value)) + { + $form .= '<input type="hidden" name="'.$name.'" value="'.form_prep($value, $name).'" />'."\n"; + } + else + { + foreach ($value as $k => $v) + { + $k = (is_int($k)) ? '' : $k; + form_hidden($name.'['.$k.']', $v, TRUE); + } + } + + return $form; + } +} + +// ------------------------------------------------------------------------ + +/** + * Text Input Field + * + * @access public + * @param mixed + * @param string + * @param string + * @return string + */ +if ( ! function_exists('form_input')) +{ + function form_input($data = '', $value = '', $extra = '') + { + $defaults = array('type' => 'text', 'name' => (( ! is_array($data)) ? $data : ''), 'value' => $value); + + return "<input "._parse_form_attributes($data, $defaults).$extra." />"; + } +} + +// ------------------------------------------------------------------------ + +/** + * Password Field + * + * Identical to the input function but adds the "password" type + * + * @access public + * @param mixed + * @param string + * @param string + * @return string + */ +if ( ! function_exists('form_password')) +{ + function form_password($data = '', $value = '', $extra = '') + { + if ( ! is_array($data)) + { + $data = array('name' => $data); + } + + $data['type'] = 'password'; + return form_input($data, $value, $extra); + } +} + +// ------------------------------------------------------------------------ + +/** + * Upload Field + * + * Identical to the input function but adds the "file" type + * + * @access public + * @param mixed + * @param string + * @param string + * @return string + */ +if ( ! function_exists('form_upload')) +{ + function form_upload($data = '', $value = '', $extra = '') + { + if ( ! is_array($data)) + { + $data = array('name' => $data); + } + + $data['type'] = 'file'; + return form_input($data, $value, $extra); + } +} + +// ------------------------------------------------------------------------ + +/** + * Textarea field + * + * @access public + * @param mixed + * @param string + * @param string + * @return string + */ +if ( ! function_exists('form_textarea')) +{ + function form_textarea($data = '', $value = '', $extra = '') + { + $defaults = array('name' => (( ! is_array($data)) ? $data : ''), 'cols' => '40', 'rows' => '10'); + + if ( ! is_array($data) OR ! isset($data['value'])) + { + $val = $value; + } + else + { + $val = $data['value']; + unset($data['value']); // textareas don't use the value attribute + } + + $name = (is_array($data)) ? $data['name'] : $data; + return "<textarea "._parse_form_attributes($data, $defaults).$extra.">".form_prep($val, $name)."</textarea>"; + } +} + +// ------------------------------------------------------------------------ + +/** + * Multi-select menu + * + * @access public + * @param string + * @param array + * @param mixed + * @param string + * @return type + */ +if ( ! function_exists('form_multiselect')) +{ + function form_multiselect($name = '', $options = array(), $selected = array(), $extra = '') + { + if ( ! strpos($extra, 'multiple')) + { + $extra .= ' multiple="multiple"'; + } + + return form_dropdown($name, $options, $selected, $extra); + } +} + +// -------------------------------------------------------------------- + +/** + * Drop-down Menu + * + * @access public + * @param string + * @param array + * @param string + * @param string + * @return string + */ +if ( ! function_exists('form_dropdown')) +{ + function form_dropdown($name = '', $options = array(), $selected = array(), $extra = '') + { + if ( ! is_array($selected)) + { + $selected = array($selected); + } + + // If no selected state was submitted we will attempt to set it automatically + if (count($selected) === 0) + { + // If the form name appears in the $_POST array we have a winner! + if (isset($_POST[$name])) + { + $selected = array($_POST[$name]); + } + } + + if ($extra != '') $extra = ' '.$extra; + + $multiple = (count($selected) > 1 && strpos($extra, 'multiple') === FALSE) ? ' multiple="multiple"' : ''; + + $form = '<select name="'.$name.'"'.$extra.$multiple.">\n"; + + foreach ($options as $key => $val) + { + $key = (string) $key; + + if (is_array($val) && ! empty($val)) + { + $form .= '<optgroup label="'.$key.'">'."\n"; + + foreach ($val as $optgroup_key => $optgroup_val) + { + $sel = (in_array($optgroup_key, $selected)) ? ' selected="selected"' : ''; + + $form .= '<option value="'.$optgroup_key.'"'.$sel.'>'.(string) $optgroup_val."</option>\n"; + } + + $form .= '</optgroup>'."\n"; + } + else + { + $sel = (in_array($key, $selected)) ? ' selected="selected"' : ''; + + $form .= '<option value="'.$key.'"'.$sel.'>'.(string) $val."</option>\n"; + } + } + + $form .= '</select>'; + + return $form; + } +} + +// ------------------------------------------------------------------------ + +/** + * Checkbox Field + * + * @access public + * @param mixed + * @param string + * @param bool + * @param string + * @return string + */ +if ( ! function_exists('form_checkbox')) +{ + function form_checkbox($data = '', $value = '', $checked = FALSE, $extra = '') + { + $defaults = array('type' => 'checkbox', 'name' => (( ! is_array($data)) ? $data : ''), 'value' => $value); + + if (is_array($data) AND array_key_exists('checked', $data)) + { + $checked = $data['checked']; + + if ($checked == FALSE) + { + unset($data['checked']); + } + else + { + $data['checked'] = 'checked'; + } + } + + if ($checked == TRUE) + { + $defaults['checked'] = 'checked'; + } + else + { + unset($defaults['checked']); + } + + return "<input "._parse_form_attributes($data, $defaults).$extra." />"; + } +} + +// ------------------------------------------------------------------------ + +/** + * Radio Button + * + * @access public + * @param mixed + * @param string + * @param bool + * @param string + * @return string + */ +if ( ! function_exists('form_radio')) +{ + function form_radio($data = '', $value = '', $checked = FALSE, $extra = '') + { + if ( ! is_array($data)) + { + $data = array('name' => $data); + } + + $data['type'] = 'radio'; + return form_checkbox($data, $value, $checked, $extra); + } +} + +// ------------------------------------------------------------------------ + +/** + * Submit Button + * + * @access public + * @param mixed + * @param string + * @param string + * @return string + */ +if ( ! function_exists('form_submit')) +{ + function form_submit($data = '', $value = '', $extra = '') + { + $defaults = array('type' => 'submit', 'name' => (( ! is_array($data)) ? $data : ''), 'value' => $value); + + return "<input "._parse_form_attributes($data, $defaults).$extra." />"; + } +} + +// ------------------------------------------------------------------------ + +/** + * Reset Button + * + * @access public + * @param mixed + * @param string + * @param string + * @return string + */ +if ( ! function_exists('form_reset')) +{ + function form_reset($data = '', $value = '', $extra = '') + { + $defaults = array('type' => 'reset', 'name' => (( ! is_array($data)) ? $data : ''), 'value' => $value); + + return "<input "._parse_form_attributes($data, $defaults).$extra." />"; + } +} + +// ------------------------------------------------------------------------ + +/** + * Form Button + * + * @access public + * @param mixed + * @param string + * @param string + * @return string + */ +if ( ! function_exists('form_button')) +{ + function form_button($data = '', $content = '', $extra = '') + { + $defaults = array('name' => (( ! is_array($data)) ? $data : ''), 'type' => 'button'); + + if ( is_array($data) AND isset($data['content'])) + { + $content = $data['content']; + unset($data['content']); // content is not an attribute + } + + return "<button "._parse_form_attributes($data, $defaults).$extra.">".$content."</button>"; + } +} + +// ------------------------------------------------------------------------ + +/** + * Form Label Tag + * + * @access public + * @param string The text to appear onscreen + * @param string The id the label applies to + * @param string Additional attributes + * @return string + */ +if ( ! function_exists('form_label')) +{ + function form_label($label_text = '', $id = '', $attributes = array()) + { + + $label = '<label'; + + if ($id != '') + { + $label .= " for=\"$id\""; + } + + if (is_array($attributes) AND count($attributes) > 0) + { + foreach ($attributes as $key => $val) + { + $label .= ' '.$key.'="'.$val.'"'; + } + } + + $label .= ">$label_text</label>"; + + return $label; + } +} + +// ------------------------------------------------------------------------ +/** + * Fieldset Tag + * + * Used to produce <fieldset><legend>text</legend>. To close fieldset + * use form_fieldset_close() + * + * @access public + * @param string The legend text + * @param string Additional attributes + * @return string + */ +if ( ! function_exists('form_fieldset')) +{ + function form_fieldset($legend_text = '', $attributes = array()) + { + $fieldset = "<fieldset"; + + $fieldset .= _attributes_to_string($attributes, FALSE); + + $fieldset .= ">\n"; + + if ($legend_text != '') + { + $fieldset .= "<legend>$legend_text</legend>\n"; + } + + return $fieldset; + } +} + +// ------------------------------------------------------------------------ + +/** + * Fieldset Close Tag + * + * @access public + * @param string + * @return string + */ +if ( ! function_exists('form_fieldset_close')) +{ + function form_fieldset_close($extra = '') + { + return "</fieldset>".$extra; + } +} + +// ------------------------------------------------------------------------ + +/** + * Form Close Tag + * + * @access public + * @param string + * @return string + */ +if ( ! function_exists('form_close')) +{ + function form_close($extra = '') + { + return "</form>".$extra; + } +} + +// ------------------------------------------------------------------------ + +/** + * Form Prep + * + * Formats text so that it can be safely placed in a form field in the event it has HTML tags. + * + * @access public + * @param string + * @return string + */ +if ( ! function_exists('form_prep')) +{ + function form_prep($str = '', $field_name = '') + { + static $prepped_fields = array(); + + // if the field name is an array we do this recursively + if (is_array($str)) + { + foreach ($str as $key => $val) + { + $str[$key] = form_prep($val); + } + + return $str; + } + + if ($str === '') + { + return ''; + } + + // we've already prepped a field with this name + // @todo need to figure out a way to namespace this so + // that we know the *exact* field and not just one with + // the same name + if (isset($prepped_fields[$field_name])) + { + return $str; + } + + $str = htmlspecialchars($str); + + // In case htmlspecialchars misses these. + $str = str_replace(array("'", '"'), array("&#39;", "&quot;"), $str); + + if ($field_name != '') + { + $prepped_fields[$field_name] = $field_name; + } + + return $str; + } +} + +// ------------------------------------------------------------------------ + +/** + * Form Value + * + * Grabs a value from the POST array for the specified field so you can + * re-populate an input field or textarea. If Form Validation + * is active it retrieves the info from the validation class + * + * @access public + * @param string + * @return mixed + */ +if ( ! function_exists('set_value')) +{ + function set_value($field = '', $default = '') + { + if (FALSE === ($OBJ =& _get_validation_object())) + { + if ( ! isset($_POST[$field])) + { + return $default; + } + + return form_prep($_POST[$field], $field); + } + + return form_prep($OBJ->set_value($field, $default), $field); + } +} + +// ------------------------------------------------------------------------ + +/** + * Set Select + * + * Let's you set the selected value of a <select> menu via data in the POST array. + * If Form Validation is active it retrieves the info from the validation class + * + * @access public + * @param string + * @param string + * @param bool + * @return string + */ +if ( ! function_exists('set_select')) +{ + function set_select($field = '', $value = '', $default = FALSE) + { + $OBJ =& _get_validation_object(); + + if ($OBJ === FALSE) + { + if ( ! isset($_POST[$field])) + { + if (count($_POST) === 0 AND $default == TRUE) + { + return ' selected="selected"'; + } + return ''; + } + + $field = $_POST[$field]; + + if (is_array($field)) + { + if ( ! in_array($value, $field)) + { + return ''; + } + } + else + { + if (($field == '' OR $value == '') OR ($field != $value)) + { + return ''; + } + } + + return ' selected="selected"'; + } + + return $OBJ->set_select($field, $value, $default); + } +} + +// ------------------------------------------------------------------------ + +/** + * Set Checkbox + * + * Let's you set the selected value of a checkbox via the value in the POST array. + * If Form Validation is active it retrieves the info from the validation class + * + * @access public + * @param string + * @param string + * @param bool + * @return string + */ +if ( ! function_exists('set_checkbox')) +{ + function set_checkbox($field = '', $value = '', $default = FALSE) + { + $OBJ =& _get_validation_object(); + + if ($OBJ === FALSE) + { + if ( ! isset($_POST[$field])) + { + if (count($_POST) === 0 AND $default == TRUE) + { + return ' checked="checked"'; + } + return ''; + } + + $field = $_POST[$field]; + + if (is_array($field)) + { + if ( ! in_array($value, $field)) + { + return ''; + } + } + else + { + if (($field == '' OR $value == '') OR ($field != $value)) + { + return ''; + } + } + + return ' checked="checked"'; + } + + return $OBJ->set_checkbox($field, $value, $default); + } +} + +// ------------------------------------------------------------------------ + +/** + * Set Radio + * + * Let's you set the selected value of a radio field via info in the POST array. + * If Form Validation is active it retrieves the info from the validation class + * + * @access public + * @param string + * @param string + * @param bool + * @return string + */ +if ( ! function_exists('set_radio')) +{ + function set_radio($field = '', $value = '', $default = FALSE) + { + $OBJ =& _get_validation_object(); + + if ($OBJ === FALSE) + { + if ( ! isset($_POST[$field])) + { + if (count($_POST) === 0 AND $default == TRUE) + { + return ' checked="checked"'; + } + return ''; + } + + $field = $_POST[$field]; + + if (is_array($field)) + { + if ( ! in_array($value, $field)) + { + return ''; + } + } + else + { + if (($field == '' OR $value == '') OR ($field != $value)) + { + return ''; + } + } + + return ' checked="checked"'; + } + + return $OBJ->set_radio($field, $value, $default); + } +} + +// ------------------------------------------------------------------------ + +/** + * Form Error + * + * Returns the error for a specific form field. This is a helper for the + * form validation class. + * + * @access public + * @param string + * @param string + * @param string + * @return string + */ +if ( ! function_exists('form_error')) +{ + function form_error($field = '', $prefix = '', $suffix = '') + { + if (FALSE === ($OBJ =& _get_validation_object())) + { + return ''; + } + + return $OBJ->error($field, $prefix, $suffix); + } +} + +// ------------------------------------------------------------------------ + +/** + * Validation Error String + * + * Returns all the errors associated with a form submission. This is a helper + * function for the form validation class. + * + * @access public + * @param string + * @param string + * @return string + */ +if ( ! function_exists('validation_errors')) +{ + function validation_errors($prefix = '', $suffix = '') + { + if (FALSE === ($OBJ =& _get_validation_object())) + { + return ''; + } + + return $OBJ->error_string($prefix, $suffix); + } +} + +// ------------------------------------------------------------------------ + +/** + * Parse the form attributes + * + * Helper function used by some of the form helpers + * + * @access private + * @param array + * @param array + * @return string + */ +if ( ! function_exists('_parse_form_attributes')) +{ + function _parse_form_attributes($attributes, $default) + { + if (is_array($attributes)) + { + foreach ($default as $key => $val) + { + if (isset($attributes[$key])) + { + $default[$key] = $attributes[$key]; + unset($attributes[$key]); + } + } + + if (count($attributes) > 0) + { + $default = array_merge($default, $attributes); + } + } + + $att = ''; + + foreach ($default as $key => $val) + { + if ($key == 'value') + { + $val = form_prep($val, $default['name']); + } + + $att .= $key . '="' . $val . '" '; + } + + return $att; + } +} + +// ------------------------------------------------------------------------ + +/** + * Attributes To String + * + * Helper function used by some of the form helpers + * + * @access private + * @param mixed + * @param bool + * @return string + */ +if ( ! function_exists('_attributes_to_string')) +{ + function _attributes_to_string($attributes, $formtag = FALSE) + { + if (is_string($attributes) AND strlen($attributes) > 0) + { + if ($formtag == TRUE AND strpos($attributes, 'method=') === FALSE) + { + $attributes .= ' method="post"'; + } + + if ($formtag == TRUE AND strpos($attributes, 'accept-charset=') === FALSE) + { + $attributes .= ' accept-charset="'.strtolower(config_item('charset')).'"'; + } + + return ' '.$attributes; + } + + if (is_object($attributes) AND count($attributes) > 0) + { + $attributes = (array)$attributes; + } + + if (is_array($attributes) AND count($attributes) > 0) + { + $atts = ''; + + if ( ! isset($attributes['method']) AND $formtag === TRUE) + { + $atts .= ' method="post"'; + } + + if ( ! isset($attributes['accept-charset']) AND $formtag === TRUE) + { + $atts .= ' accept-charset="'.strtolower(config_item('charset')).'"'; + } + + foreach ($attributes as $key => $val) + { + $atts .= ' '.$key.'="'.$val.'"'; + } + + return $atts; + } + } +} + +// ------------------------------------------------------------------------ + +/** + * Validation Object + * + * Determines what the form validation class was instantiated as, fetches + * the object and returns it. + * + * @access private + * @return mixed + */ +if ( ! function_exists('_get_validation_object')) +{ + function &_get_validation_object() + { + $CI =& get_instance(); + + // We set this as a variable since we're returning by reference. + $return = FALSE; + + if (FALSE !== ($object = $CI->load->is_loaded('form_validation'))) + { + if ( ! isset($CI->$object) OR ! is_object($CI->$object)) + { + return $return; + } + + return $CI->$object; + } + + return $return; + } +} + + +/* End of file form_helper.php */ +/* Location: ./system/helpers/form_helper.php */ diff --git a/system/helpers/html_helper.php b/system/helpers/html_helper.php new file mode 100644 index 0000000..aef8ae7 --- /dev/null +++ b/system/helpers/html_helper.php @@ -0,0 +1,437 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter HTML Helpers + * + * @package CodeIgniter + * @subpackage Helpers + * @category Helpers + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/helpers/html_helper.html + */ + +// ------------------------------------------------------------------------ + +/** + * Heading + * + * Generates an HTML heading tag. First param is the data. + * Second param is the size of the heading tag. + * + * @access public + * @param string + * @param integer + * @return string + */ +if ( ! function_exists('heading')) +{ + function heading($data = '', $h = '1', $attributes = '') + { + $attributes = ($attributes != '') ? ' '.$attributes : $attributes; + return "<h".$h.$attributes.">".$data."</h".$h.">"; + } +} + +// ------------------------------------------------------------------------ + +/** + * Unordered List + * + * Generates an HTML unordered list from an single or multi-dimensional array. + * + * @access public + * @param array + * @param mixed + * @return string + */ +if ( ! function_exists('ul')) +{ + function ul($list, $attributes = '') + { + return _list('ul', $list, $attributes); + } +} + +// ------------------------------------------------------------------------ + +/** + * Ordered List + * + * Generates an HTML ordered list from an single or multi-dimensional array. + * + * @access public + * @param array + * @param mixed + * @return string + */ +if ( ! function_exists('ol')) +{ + function ol($list, $attributes = '') + { + return _list('ol', $list, $attributes); + } +} + +// ------------------------------------------------------------------------ + +/** + * Generates the list + * + * Generates an HTML ordered list from an single or multi-dimensional array. + * + * @access private + * @param string + * @param mixed + * @param mixed + * @param integer + * @return string + */ +if ( ! function_exists('_list')) +{ + function _list($type = 'ul', $list, $attributes = '', $depth = 0) + { + // If an array wasn't submitted there's nothing to do... + if ( ! is_array($list)) + { + return $list; + } + + // Set the indentation based on the depth + $out = str_repeat(" ", $depth); + + // Were any attributes submitted? If so generate a string + if (is_array($attributes)) + { + $atts = ''; + foreach ($attributes as $key => $val) + { + $atts .= ' ' . $key . '="' . $val . '"'; + } + $attributes = $atts; + } + elseif (is_string($attributes) AND strlen($attributes) > 0) + { + $attributes = ' '. $attributes; + } + + // Write the opening list tag + $out .= "<".$type.$attributes.">\n"; + + // Cycle through the list elements. If an array is + // encountered we will recursively call _list() + + static $_last_list_item = ''; + foreach ($list as $key => $val) + { + $_last_list_item = $key; + + $out .= str_repeat(" ", $depth + 2); + $out .= "<li>"; + + if ( ! is_array($val)) + { + $out .= $val; + } + else + { + $out .= $_last_list_item."\n"; + $out .= _list($type, $val, '', $depth + 4); + $out .= str_repeat(" ", $depth + 2); + } + + $out .= "</li>\n"; + } + + // Set the indentation for the closing tag + $out .= str_repeat(" ", $depth); + + // Write the closing list tag + $out .= "</".$type.">\n"; + + return $out; + } +} + +// ------------------------------------------------------------------------ + +/** + * Generates HTML BR tags based on number supplied + * + * @access public + * @param integer + * @return string + */ +if ( ! function_exists('br')) +{ + function br($num = 1) + { + return str_repeat("<br />", $num); + } +} + +// ------------------------------------------------------------------------ + +/** + * Image + * + * Generates an <img /> element + * + * @access public + * @param mixed + * @return string + */ +if ( ! function_exists('img')) +{ + function img($src = '', $index_page = FALSE) + { + if ( ! is_array($src) ) + { + $src = array('src' => $src); + } + + // If there is no alt attribute defined, set it to an empty string + if ( ! isset($src['alt'])) + { + $src['alt'] = ''; + } + + $img = '<img'; + + foreach ($src as $k=>$v) + { + + if ($k == 'src' AND strpos($v, '://') === FALSE) + { + $CI =& get_instance(); + + if ($index_page === TRUE) + { + $img .= ' src="'.$CI->config->site_url($v).'"'; + } + else + { + $img .= ' src="'.$CI->config->slash_item('base_url').$v.'"'; + } + } + else + { + $img .= " $k=\"$v\""; + } + } + + $img .= '/>'; + + return $img; + } +} + +// ------------------------------------------------------------------------ + +/** + * Doctype + * + * Generates a page document type declaration + * + * Valid options are xhtml-11, xhtml-strict, xhtml-trans, xhtml-frame, + * html4-strict, html4-trans, and html4-frame. Values are saved in the + * doctypes config file. + * + * @access public + * @param string type The doctype to be generated + * @return string + */ +if ( ! function_exists('doctype')) +{ + function doctype($type = 'xhtml1-strict') + { + global $_doctypes; + + if ( ! is_array($_doctypes)) + { + if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/doctypes.php')) + { + include(APPPATH.'config/'.ENVIRONMENT.'/doctypes.php'); + } + elseif (is_file(APPPATH.'config/doctypes.php')) + { + include(APPPATH.'config/doctypes.php'); + } + + if ( ! is_array($_doctypes)) + { + return FALSE; + } + } + + if (isset($_doctypes[$type])) + { + return $_doctypes[$type]; + } + else + { + return FALSE; + } + } +} + +// ------------------------------------------------------------------------ + +/** + * Link + * + * Generates link to a CSS file + * + * @access public + * @param mixed stylesheet hrefs or an array + * @param string rel + * @param string type + * @param string title + * @param string media + * @param boolean should index_page be added to the css path + * @return string + */ +if ( ! function_exists('link_tag')) +{ + function link_tag($href = '', $rel = 'stylesheet', $type = 'text/css', $title = '', $media = '', $index_page = FALSE) + { + $CI =& get_instance(); + + $link = '<link '; + + if (is_array($href)) + { + foreach ($href as $k=>$v) + { + if ($k == 'href' AND strpos($v, '://') === FALSE) + { + if ($index_page === TRUE) + { + $link .= 'href="'.$CI->config->site_url($v).'" '; + } + else + { + $link .= 'href="'.$CI->config->slash_item('base_url').$v.'" '; + } + } + else + { + $link .= "$k=\"$v\" "; + } + } + + $link .= "/>"; + } + else + { + if ( strpos($href, '://') !== FALSE) + { + $link .= 'href="'.$href.'" '; + } + elseif ($index_page === TRUE) + { + $link .= 'href="'.$CI->config->site_url($href).'" '; + } + else + { + $link .= 'href="'.$CI->config->slash_item('base_url').$href.'" '; + } + + $link .= 'rel="'.$rel.'" type="'.$type.'" '; + + if ($media != '') + { + $link .= 'media="'.$media.'" '; + } + + if ($title != '') + { + $link .= 'title="'.$title.'" '; + } + + $link .= '/>'; + } + + + return $link; + } +} + +// ------------------------------------------------------------------------ + +/** + * Generates meta tags from an array of key/values + * + * @access public + * @param array + * @return string + */ +if ( ! function_exists('meta')) +{ + function meta($name = '', $content = '', $type = 'name', $newline = "\n") + { + // Since we allow the data to be passes as a string, a simple array + // or a multidimensional one, we need to do a little prepping. + if ( ! is_array($name)) + { + $name = array(array('name' => $name, 'content' => $content, 'type' => $type, 'newline' => $newline)); + } + else + { + // Turn single array into multidimensional + if (isset($name['name'])) + { + $name = array($name); + } + } + + $str = ''; + foreach ($name as $meta) + { + $type = ( ! isset($meta['type']) OR $meta['type'] == 'name') ? 'name' : 'http-equiv'; + $name = ( ! isset($meta['name'])) ? '' : $meta['name']; + $content = ( ! isset($meta['content'])) ? '' : $meta['content']; + $newline = ( ! isset($meta['newline'])) ? "\n" : $meta['newline']; + + $str .= '<meta '.$type.'="'.$name.'" content="'.$content.'" />'.$newline; + } + + return $str; + } +} + +// ------------------------------------------------------------------------ + +/** + * Generates non-breaking space entities based on number supplied + * + * @access public + * @param integer + * @return string + */ +if ( ! function_exists('nbs')) +{ + function nbs($num = 1) + { + return str_repeat("&nbsp;", $num); + } +} + + +/* End of file html_helper.php */ +/* Location: ./system/helpers/html_helper.php */ \ No newline at end of file diff --git a/system/helpers/index.html b/system/helpers/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/system/helpers/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/system/helpers/inflector_helper.php b/system/helpers/inflector_helper.php new file mode 100644 index 0000000..dd01c0e --- /dev/null +++ b/system/helpers/inflector_helper.php @@ -0,0 +1,204 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Inflector Helpers + * + * @package CodeIgniter + * @subpackage Helpers + * @category Helpers + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/helpers/directory_helper.html + */ + + +// -------------------------------------------------------------------- + +/** + * Singular + * + * Takes a plural word and makes it singular + * + * @access public + * @param string + * @return str + */ +if ( ! function_exists('singular')) +{ + function singular($str) + { + $result = strval($str); + + $singular_rules = array( + '/(matr)ices$/' => '\1ix', + '/(vert|ind)ices$/' => '\1ex', + '/^(ox)en/' => '\1', + '/(alias)es$/' => '\1', + '/([octop|vir])i$/' => '\1us', + '/(cris|ax|test)es$/' => '\1is', + '/(shoe)s$/' => '\1', + '/(o)es$/' => '\1', + '/(bus|campus)es$/' => '\1', + '/([m|l])ice$/' => '\1ouse', + '/(x|ch|ss|sh)es$/' => '\1', + '/(m)ovies$/' => '\1\2ovie', + '/(s)eries$/' => '\1\2eries', + '/([^aeiouy]|qu)ies$/' => '\1y', + '/([lr])ves$/' => '\1f', + '/(tive)s$/' => '\1', + '/(hive)s$/' => '\1', + '/([^f])ves$/' => '\1fe', + '/(^analy)ses$/' => '\1sis', + '/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/' => '\1\2sis', + '/([ti])a$/' => '\1um', + '/(p)eople$/' => '\1\2erson', + '/(m)en$/' => '\1an', + '/(s)tatuses$/' => '\1\2tatus', + '/(c)hildren$/' => '\1\2hild', + '/(n)ews$/' => '\1\2ews', + '/([^u])s$/' => '\1', + ); + + foreach ($singular_rules as $rule => $replacement) + { + if (preg_match($rule, $result)) + { + $result = preg_replace($rule, $replacement, $result); + break; + } + } + + return $result; + } +} + +// -------------------------------------------------------------------- + +/** + * Plural + * + * Takes a singular word and makes it plural + * + * @access public + * @param string + * @param bool + * @return str + */ +if ( ! function_exists('plural')) +{ + function plural($str, $force = FALSE) + { + $result = strval($str); + + $plural_rules = array( + '/^(ox)$/' => '\1\2en', // ox + '/([m|l])ouse$/' => '\1ice', // mouse, louse + '/(matr|vert|ind)ix|ex$/' => '\1ices', // matrix, vertex, index + '/(x|ch|ss|sh)$/' => '\1es', // search, switch, fix, box, process, address + '/([^aeiouy]|qu)y$/' => '\1ies', // query, ability, agency + '/(hive)$/' => '\1s', // archive, hive + '/(?:([^f])fe|([lr])f)$/' => '\1\2ves', // half, safe, wife + '/sis$/' => 'ses', // basis, diagnosis + '/([ti])um$/' => '\1a', // datum, medium + '/(p)erson$/' => '\1eople', // person, salesperson + '/(m)an$/' => '\1en', // man, woman, spokesman + '/(c)hild$/' => '\1hildren', // child + '/(buffal|tomat)o$/' => '\1\2oes', // buffalo, tomato + '/(bu|campu)s$/' => '\1\2ses', // bus, campus + '/(alias|status|virus)/' => '\1es', // alias + '/(octop)us$/' => '\1i', // octopus + '/(ax|cris|test)is$/' => '\1es', // axis, crisis + '/s$/' => 's', // no change (compatibility) + '/$/' => 's', + ); + + foreach ($plural_rules as $rule => $replacement) + { + if (preg_match($rule, $result)) + { + $result = preg_replace($rule, $replacement, $result); + break; + } + } + + return $result; + } +} + +// -------------------------------------------------------------------- + +/** + * Camelize + * + * Takes multiple words separated by spaces or underscores and camelizes them + * + * @access public + * @param string + * @return str + */ +if ( ! function_exists('camelize')) +{ + function camelize($str) + { + $str = 'x'.strtolower(trim($str)); + $str = ucwords(preg_replace('/[\s_]+/', ' ', $str)); + return substr(str_replace(' ', '', $str), 1); + } +} + +// -------------------------------------------------------------------- + +/** + * Underscore + * + * Takes multiple words separated by spaces and underscores them + * + * @access public + * @param string + * @return str + */ +if ( ! function_exists('underscore')) +{ + function underscore($str) + { + return preg_replace('/[\s]+/', '_', strtolower(trim($str))); + } +} + +// -------------------------------------------------------------------- + +/** + * Humanize + * + * Takes multiple words separated by underscores and changes them to spaces + * + * @access public + * @param string + * @return str + */ +if ( ! function_exists('humanize')) +{ + function humanize($str) + { + return ucwords(preg_replace('/[_]+/', ' ', strtolower(trim($str)))); + } +} + + +/* End of file inflector_helper.php */ +/* Location: ./system/helpers/inflector_helper.php */ \ No newline at end of file diff --git a/system/helpers/language_helper.php b/system/helpers/language_helper.php new file mode 100644 index 0000000..d8abb0e --- /dev/null +++ b/system/helpers/language_helper.php @@ -0,0 +1,59 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Language Helpers + * + * @package CodeIgniter + * @subpackage Helpers + * @category Helpers + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/helpers/language_helper.html + */ + +// ------------------------------------------------------------------------ + +/** + * Lang + * + * Fetches a language variable and optionally outputs a form label + * + * @access public + * @param string the language line + * @param string the id of the form element + * @return string + */ +if ( ! function_exists('lang')) +{ + function lang($line, $id = '') + { + $CI =& get_instance(); + $line = $CI->lang->line($line); + + if ($id != '') + { + $line = '<label for="'.$id.'">'.$line."</label>"; + } + + return $line; + } +} + +// ------------------------------------------------------------------------ +/* End of file language_helper.php */ +/* Location: ./system/helpers/language_helper.php */ \ No newline at end of file diff --git a/system/helpers/number_helper.php b/system/helpers/number_helper.php new file mode 100644 index 0000000..b04b104 --- /dev/null +++ b/system/helpers/number_helper.php @@ -0,0 +1,77 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Number Helpers + * + * @package CodeIgniter + * @subpackage Helpers + * @category Helpers + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/helpers/number_helper.html + */ + +// ------------------------------------------------------------------------ + +/** + * Formats a numbers as bytes, based on size, and adds the appropriate suffix + * + * @access public + * @param mixed // will be cast as int + * @return string + */ +if ( ! function_exists('byte_format')) +{ + function byte_format($num, $precision = 1) + { + $CI =& get_instance(); + $CI->lang->load('number'); + + if ($num >= 1000000000000) + { + $num = round($num / 1099511627776, $precision); + $unit = $CI->lang->line('terabyte_abbr'); + } + elseif ($num >= 1000000000) + { + $num = round($num / 1073741824, $precision); + $unit = $CI->lang->line('gigabyte_abbr'); + } + elseif ($num >= 1000000) + { + $num = round($num / 1048576, $precision); + $unit = $CI->lang->line('megabyte_abbr'); + } + elseif ($num >= 1000) + { + $num = round($num / 1024, $precision); + $unit = $CI->lang->line('kilobyte_abbr'); + } + else + { + $unit = $CI->lang->line('bytes'); + return number_format($num).' '.$unit; + } + + return number_format($num, $precision).' '.$unit; + } +} + + +/* End of file number_helper.php */ +/* Location: ./system/helpers/number_helper.php */ \ No newline at end of file diff --git a/system/helpers/path_helper.php b/system/helpers/path_helper.php new file mode 100644 index 0000000..a4b955b --- /dev/null +++ b/system/helpers/path_helper.php @@ -0,0 +1,73 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Path Helpers + * + * @package CodeIgniter + * @subpackage Helpers + * @category Helpers + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/helpers/xml_helper.html + */ + +// ------------------------------------------------------------------------ + +/** + * Set Realpath + * + * @access public + * @param string + * @param bool checks to see if the path exists + * @return string + */ +if ( ! function_exists('set_realpath')) +{ + function set_realpath($path, $check_existance = FALSE) + { + // Security check to make sure the path is NOT a URL. No remote file inclusion! + if (preg_match("#^(http:\/\/|https:\/\/|www\.|ftp|[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})#i", $path)) + { + show_error('The path you submitted must be a local server path, not a URL'); + } + + // Resolve the path + if (function_exists('realpath') AND @realpath($path) !== FALSE) + { + $path = realpath($path).'/'; + } + + // Add a trailing slash + $path = preg_replace("#([^/])/*$#", "\\1/", $path); + + // Make sure the path exists + if ($check_existance == TRUE) + { + if ( ! is_dir($path)) + { + show_error('Not a valid path: '.$path); + } + } + + return $path; + } +} + + +/* End of file path_helper.php */ +/* Location: ./system/helpers/path_helper.php */ \ No newline at end of file diff --git a/system/helpers/security_helper.php b/system/helpers/security_helper.php new file mode 100644 index 0000000..a820eb0 --- /dev/null +++ b/system/helpers/security_helper.php @@ -0,0 +1,129 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Security Helpers + * + * @package CodeIgniter + * @subpackage Helpers + * @category Helpers + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/helpers/security_helper.html + */ + +// ------------------------------------------------------------------------ + +/** + * XSS Filtering + * + * @access public + * @param string + * @param bool whether or not the content is an image file + * @return string + */ +if ( ! function_exists('xss_clean')) +{ + function xss_clean($str, $is_image = FALSE) + { + $CI =& get_instance(); + return $CI->security->xss_clean($str, $is_image); + } +} + +// ------------------------------------------------------------------------ + +/** + * Sanitize Filename + * + * @access public + * @param string + * @return string + */ +if ( ! function_exists('sanitize_filename')) +{ + function sanitize_filename($filename) + { + $CI =& get_instance(); + return $CI->security->sanitize_filename($filename); + } +} + +// -------------------------------------------------------------------- + +/** + * Hash encode a string + * + * @access public + * @param string + * @return string + */ +if ( ! function_exists('do_hash')) +{ + function do_hash($str, $type = 'sha1') + { + if ($type == 'sha1') + { + return sha1($str); + } + else + { + return md5($str); + } + } +} + +// ------------------------------------------------------------------------ + +/** + * Strip Image Tags + * + * @access public + * @param string + * @return string + */ +if ( ! function_exists('strip_image_tags')) +{ + function strip_image_tags($str) + { + $str = preg_replace("#<img\s+.*?src\s*=\s*[\"'](.+?)[\"'].*?\>#", "\\1", $str); + $str = preg_replace("#<img\s+.*?src\s*=\s*(.+?).*?\>#", "\\1", $str); + + return $str; + } +} + +// ------------------------------------------------------------------------ + +/** + * Convert PHP tags to entities + * + * @access public + * @param string + * @return string + */ +if ( ! function_exists('encode_php_tags')) +{ + function encode_php_tags($str) + { + return str_replace(array('<?php', '<?PHP', '<?', '?>'), array('&lt;?php', '&lt;?PHP', '&lt;?', '?&gt;'), $str); + } +} + + +/* End of file security_helper.php */ +/* Location: ./system/helpers/security_helper.php */ \ No newline at end of file diff --git a/system/helpers/smiley_helper.php b/system/helpers/smiley_helper.php new file mode 100644 index 0000000..b05d9dc --- /dev/null +++ b/system/helpers/smiley_helper.php @@ -0,0 +1,282 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Smiley Helpers + * + * @package CodeIgniter + * @subpackage Helpers + * @category Helpers + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/helpers/smiley_helper.html + */ + +// ------------------------------------------------------------------------ + +/** + * Smiley Javascript + * + * Returns the javascript required for the smiley insertion. Optionally takes + * an array of aliases to loosely couple the smiley array to the view. + * + * @access public + * @param mixed alias name or array of alias->field_id pairs + * @param string field_id if alias name was passed in + * @return array + */ +if ( ! function_exists('smiley_js')) +{ + function smiley_js($alias = '', $field_id = '', $inline = TRUE) + { + static $do_setup = TRUE; + + $r = ''; + + if ($alias != '' && ! is_array($alias)) + { + $alias = array($alias => $field_id); + } + + if ($do_setup === TRUE) + { + $do_setup = FALSE; + + $m = array(); + + if (is_array($alias)) + { + foreach ($alias as $name => $id) + { + $m[] = '"'.$name.'" : "'.$id.'"'; + } + } + + $m = '{'.implode(',', $m).'}'; + + $r .= <<<EOF + var smiley_map = {$m}; + + function insert_smiley(smiley, field_id) { + var el = document.getElementById(field_id), newStart; + + if ( ! el && smiley_map[field_id]) { + el = document.getElementById(smiley_map[field_id]); + + if ( ! el) + return false; + } + + el.focus(); + smiley = " " + smiley; + + if ('selectionStart' in el) { + newStart = el.selectionStart + smiley.length; + + el.value = el.value.substr(0, el.selectionStart) + + smiley + + el.value.substr(el.selectionEnd, el.value.length); + el.setSelectionRange(newStart, newStart); + } + else if (document.selection) { + document.selection.createRange().text = smiley; + } + } +EOF; + } + else + { + if (is_array($alias)) + { + foreach ($alias as $name => $id) + { + $r .= 'smiley_map["'.$name.'"] = "'.$id.'";'."\n"; + } + } + } + + if ($inline) + { + return '<script type="text/javascript" charset="utf-8">/*<![CDATA[ */'.$r.'// ]]></script>'; + } + else + { + return $r; + } + } +} + +// ------------------------------------------------------------------------ + +/** + * Get Clickable Smileys + * + * Returns an array of image tag links that can be clicked to be inserted + * into a form field. + * + * @access public + * @param string the URL to the folder containing the smiley images + * @return array + */ +if ( ! function_exists('get_clickable_smileys')) +{ + function get_clickable_smileys($image_url, $alias = '', $smileys = NULL) + { + // For backward compatibility with js_insert_smiley + + if (is_array($alias)) + { + $smileys = $alias; + } + + if ( ! is_array($smileys)) + { + if (FALSE === ($smileys = _get_smiley_array())) + { + return $smileys; + } + } + + // Add a trailing slash to the file path if needed + $image_url = rtrim($image_url, '/').'/'; + + $used = array(); + foreach ($smileys as $key => $val) + { + // Keep duplicates from being used, which can happen if the + // mapping array contains multiple identical replacements. For example: + // :-) and :) might be replaced with the same image so both smileys + // will be in the array. + if (isset($used[$smileys[$key][0]])) + { + continue; + } + + $link[] = "<a href=\"javascript:void(0);\" onclick=\"insert_smiley('".$key."', '".$alias."')\"><img src=\"".$image_url.$smileys[$key][0]."\" width=\"".$smileys[$key][1]."\" height=\"".$smileys[$key][2]."\" alt=\"".$smileys[$key][3]."\" style=\"border:0;\" /></a>"; + + $used[$smileys[$key][0]] = TRUE; + } + + return $link; + } +} + +// ------------------------------------------------------------------------ + +/** + * Parse Smileys + * + * Takes a string as input and swaps any contained smileys for the actual image + * + * @access public + * @param string the text to be parsed + * @param string the URL to the folder containing the smiley images + * @return string + */ +if ( ! function_exists('parse_smileys')) +{ + function parse_smileys($str = '', $image_url = '', $smileys = NULL) + { + if ($image_url == '') + { + return $str; + } + + if ( ! is_array($smileys)) + { + if (FALSE === ($smileys = _get_smiley_array())) + { + return $str; + } + } + + // Add a trailing slash to the file path if needed + $image_url = preg_replace("/(.+?)\/*$/", "\\1/", $image_url); + + foreach ($smileys as $key => $val) + { + $str = str_replace($key, "<img src=\"".$image_url.$smileys[$key][0]."\" width=\"".$smileys[$key][1]."\" height=\"".$smileys[$key][2]."\" alt=\"".$smileys[$key][3]."\" style=\"border:0;\" />", $str); + } + + return $str; + } +} + +// ------------------------------------------------------------------------ + +/** + * Get Smiley Array + * + * Fetches the config/smiley.php file + * + * @access private + * @return mixed + */ +if ( ! function_exists('_get_smiley_array')) +{ + function _get_smiley_array() + { + if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/smileys.php')) + { + include(APPPATH.'config/'.ENVIRONMENT.'/smileys.php'); + } + elseif (file_exists(APPPATH.'config/smileys.php')) + { + include(APPPATH.'config/smileys.php'); + } + + if (isset($smileys) AND is_array($smileys)) + { + return $smileys; + } + + return FALSE; + } +} + +// ------------------------------------------------------------------------ + +/** + * JS Insert Smiley + * + * Generates the javascript function needed to insert smileys into a form field + * + * DEPRECATED as of version 1.7.2, use smiley_js instead + * + * @access public + * @param string form name + * @param string field name + * @return string + */ +if ( ! function_exists('js_insert_smiley')) +{ + function js_insert_smiley($form_name = '', $form_field = '') + { + return <<<EOF +<script type="text/javascript"> + function insert_smiley(smiley) + { + document.{$form_name}.{$form_field}.value += " " + smiley; + } +</script> +EOF; + } +} + + +/* End of file smiley_helper.php */ +/* Location: ./system/helpers/smiley_helper.php */ \ No newline at end of file diff --git a/system/helpers/string_helper.php b/system/helpers/string_helper.php new file mode 100644 index 0000000..aeeba99 --- /dev/null +++ b/system/helpers/string_helper.php @@ -0,0 +1,308 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter String Helpers + * + * @package CodeIgniter + * @subpackage Helpers + * @category Helpers + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/helpers/string_helper.html + */ + +// ------------------------------------------------------------------------ + +/** + * Trim Slashes + * + * Removes any leading/trailing slashes from a string: + * + * /this/that/theother/ + * + * becomes: + * + * this/that/theother + * + * @access public + * @param string + * @return string + */ +if ( ! function_exists('trim_slashes')) +{ + function trim_slashes($str) + { + return trim($str, '/'); + } +} + +// ------------------------------------------------------------------------ + +/** + * Strip Slashes + * + * Removes slashes contained in a string or in an array + * + * @access public + * @param mixed string or array + * @return mixed string or array + */ +if ( ! function_exists('strip_slashes')) +{ + function strip_slashes($str) + { + if (is_array($str)) + { + foreach ($str as $key => $val) + { + $str[$key] = strip_slashes($val); + } + } + else + { + $str = stripslashes($str); + } + + return $str; + } +} + +// ------------------------------------------------------------------------ + +/** + * Strip Quotes + * + * Removes single and double quotes from a string + * + * @access public + * @param string + * @return string + */ +if ( ! function_exists('strip_quotes')) +{ + function strip_quotes($str) + { + return str_replace(array('"', "'"), '', $str); + } +} + +// ------------------------------------------------------------------------ + +/** + * Quotes to Entities + * + * Converts single and double quotes to entities + * + * @access public + * @param string + * @return string + */ +if ( ! function_exists('quotes_to_entities')) +{ + function quotes_to_entities($str) + { + return str_replace(array("\'","\"","'",'"'), array("&#39;","&quot;","&#39;","&quot;"), $str); + } +} + +// ------------------------------------------------------------------------ + +/** + * Reduce Double Slashes + * + * Converts double slashes in a string to a single slash, + * except those found in http:// + * + * http://www.some-site.com//index.php + * + * becomes: + * + * http://www.some-site.com/index.php + * + * @access public + * @param string + * @return string + */ +if ( ! function_exists('reduce_double_slashes')) +{ + function reduce_double_slashes($str) + { + return preg_replace("#(^|[^:])//+#", "\\1/", $str); + } +} + +// ------------------------------------------------------------------------ + +/** + * Reduce Multiples + * + * Reduces multiple instances of a particular character. Example: + * + * Fred, Bill,, Joe, Jimmy + * + * becomes: + * + * Fred, Bill, Joe, Jimmy + * + * @access public + * @param string + * @param string the character you wish to reduce + * @param bool TRUE/FALSE - whether to trim the character from the beginning/end + * @return string + */ +if ( ! function_exists('reduce_multiples')) +{ + function reduce_multiples($str, $character = ',', $trim = FALSE) + { + $str = preg_replace('#'.preg_quote($character, '#').'{2,}#', $character, $str); + + if ($trim === TRUE) + { + $str = trim($str, $character); + } + + return $str; + } +} + +// ------------------------------------------------------------------------ + +/** + * Create a Random String + * + * Useful for generating passwords or hashes. + * + * @access public + * @param string type of random string. basic, alpha, alunum, numeric, nozero, unique, md5, encrypt and sha1 + * @param integer number of characters + * @return string + */ +if ( ! function_exists('random_string')) +{ + function random_string($type = 'alnum', $len = 8) + { + switch($type) + { + case 'basic' : return mt_rand(); + break; + case 'alnum' : + case 'numeric' : + case 'nozero' : + case 'alpha' : + + switch ($type) + { + case 'alpha' : $pool = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + break; + case 'alnum' : $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + break; + case 'numeric' : $pool = '0123456789'; + break; + case 'nozero' : $pool = '123456789'; + break; + } + + $str = ''; + for ($i=0; $i < $len; $i++) + { + $str .= substr($pool, mt_rand(0, strlen($pool) -1), 1); + } + return $str; + break; + case 'unique' : + case 'md5' : + + return md5(uniqid(mt_rand())); + break; + case 'encrypt' : + case 'sha1' : + + $CI =& get_instance(); + $CI->load->helper('security'); + + return do_hash(uniqid(mt_rand(), TRUE), 'sha1'); + break; + } + } +} + +// ------------------------------------------------------------------------ + +/** + * Add's _1 to a string or increment the ending number to allow _2, _3, etc + * + * @param string $str required + * @param string $separator What should the duplicate number be appended with + * @param string $first Which number should be used for the first dupe increment + * @return string + */ +function increment_string($str, $separator = '_', $first = 1) +{ + preg_match('/(.+)'.$separator.'([0-9]+)$/', $str, $match); + + return isset($match[2]) ? $match[1].$separator.($match[2] + 1) : $str.$separator.$first; +} + +// ------------------------------------------------------------------------ + +/** + * Alternator + * + * Allows strings to be alternated. See docs... + * + * @access public + * @param string (as many parameters as needed) + * @return string + */ +if ( ! function_exists('alternator')) +{ + function alternator() + { + static $i; + + if (func_num_args() == 0) + { + $i = 0; + return ''; + } + $args = func_get_args(); + return $args[($i++ % count($args))]; + } +} + +// ------------------------------------------------------------------------ + +/** + * Repeater function + * + * @access public + * @param string + * @param integer number of repeats + * @return string + */ +if ( ! function_exists('repeater')) +{ + function repeater($data, $num = 1) + { + return (($num > 0) ? str_repeat($data, $num) : ''); + } +} + + +/* End of file string_helper.php */ +/* Location: ./system/helpers/string_helper.php */ \ No newline at end of file diff --git a/system/helpers/text_helper.php b/system/helpers/text_helper.php new file mode 100644 index 0000000..85c3091 --- /dev/null +++ b/system/helpers/text_helper.php @@ -0,0 +1,527 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Text Helpers + * + * @package CodeIgniter + * @subpackage Helpers + * @category Helpers + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/helpers/text_helper.html + */ + +// ------------------------------------------------------------------------ + +/** + * Word Limiter + * + * Limits a string to X number of words. + * + * @access public + * @param string + * @param integer + * @param string the end character. Usually an ellipsis + * @return string + */ +if ( ! function_exists('word_limiter')) +{ + function word_limiter($str, $limit = 100, $end_char = '&#8230;') + { + if (trim($str) == '') + { + return $str; + } + + preg_match('/^\s*+(?:\S++\s*+){1,'.(int) $limit.'}/', $str, $matches); + + if (strlen($str) == strlen($matches[0])) + { + $end_char = ''; + } + + return rtrim($matches[0]).$end_char; + } +} + +// ------------------------------------------------------------------------ + +/** + * Character Limiter + * + * Limits the string based on the character count. Preserves complete words + * so the character count may not be exactly as specified. + * + * @access public + * @param string + * @param integer + * @param string the end character. Usually an ellipsis + * @return string + */ +if ( ! function_exists('character_limiter')) +{ + function character_limiter($str, $n = 500, $end_char = '&#8230;') + { + if (strlen($str) < $n) + { + return $str; + } + + $str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str)); + + if (strlen($str) <= $n) + { + return $str; + } + + $out = ""; + foreach (explode(' ', trim($str)) as $val) + { + $out .= $val.' '; + + if (strlen($out) >= $n) + { + $out = trim($out); + return (strlen($out) == strlen($str)) ? $out : $out.$end_char; + } + } + } +} + +// ------------------------------------------------------------------------ + +/** + * High ASCII to Entities + * + * Converts High ascii text and MS Word special characters to character entities + * + * @access public + * @param string + * @return string + */ +if ( ! function_exists('ascii_to_entities')) +{ + function ascii_to_entities($str) + { + $count = 1; + $out = ''; + $temp = array(); + + for ($i = 0, $s = strlen($str); $i < $s; $i++) + { + $ordinal = ord($str[$i]); + + if ($ordinal < 128) + { + /* + If the $temp array has a value but we have moved on, then it seems only + fair that we output that entity and restart $temp before continuing. -Paul + */ + if (count($temp) == 1) + { + $out .= '&#'.array_shift($temp).';'; + $count = 1; + } + + $out .= $str[$i]; + } + else + { + if (count($temp) == 0) + { + $count = ($ordinal < 224) ? 2 : 3; + } + + $temp[] = $ordinal; + + if (count($temp) == $count) + { + $number = ($count == 3) ? (($temp['0'] % 16) * 4096) + (($temp['1'] % 64) * 64) + ($temp['2'] % 64) : (($temp['0'] % 32) * 64) + ($temp['1'] % 64); + + $out .= '&#'.$number.';'; + $count = 1; + $temp = array(); + } + } + } + + return $out; + } +} + +// ------------------------------------------------------------------------ + +/** + * Entities to ASCII + * + * Converts character entities back to ASCII + * + * @access public + * @param string + * @param bool + * @return string + */ +if ( ! function_exists('entities_to_ascii')) +{ + function entities_to_ascii($str, $all = TRUE) + { + if (preg_match_all('/\&#(\d+)\;/', $str, $matches)) + { + for ($i = 0, $s = count($matches['0']); $i < $s; $i++) + { + $digits = $matches['1'][$i]; + + $out = ''; + + if ($digits < 128) + { + $out .= chr($digits); + + } + elseif ($digits < 2048) + { + $out .= chr(192 + (($digits - ($digits % 64)) / 64)); + $out .= chr(128 + ($digits % 64)); + } + else + { + $out .= chr(224 + (($digits - ($digits % 4096)) / 4096)); + $out .= chr(128 + ((($digits % 4096) - ($digits % 64)) / 64)); + $out .= chr(128 + ($digits % 64)); + } + + $str = str_replace($matches['0'][$i], $out, $str); + } + } + + if ($all) + { + $str = str_replace(array("&amp;", "&lt;", "&gt;", "&quot;", "&apos;", "&#45;"), + array("&","<",">","\"", "'", "-"), + $str); + } + + return $str; + } +} + +// ------------------------------------------------------------------------ + +/** + * Word Censoring Function + * + * Supply a string and an array of disallowed words and any + * matched words will be converted to #### or to the replacement + * word you've submitted. + * + * @access public + * @param string the text string + * @param string the array of censoered words + * @param string the optional replacement value + * @return string + */ +if ( ! function_exists('word_censor')) +{ + function word_censor($str, $censored, $replacement = '') + { + if ( ! is_array($censored)) + { + return $str; + } + + $str = ' '.$str.' '; + + // \w, \b and a few others do not match on a unicode character + // set for performance reasons. As a result words like über + // will not match on a word boundary. Instead, we'll assume that + // a bad word will be bookeneded by any of these characters. + $delim = '[-_\'\"`(){}<>\[\]|!?@#%&,.:;^~*+=\/ 0-9\n\r\t]'; + + foreach ($censored as $badword) + { + if ($replacement != '') + { + $str = preg_replace("/({$delim})(".str_replace('\*', '\w*?', preg_quote($badword, '/')).")({$delim})/i", "\\1{$replacement}\\3", $str); + } + else + { + $str = preg_replace("/({$delim})(".str_replace('\*', '\w*?', preg_quote($badword, '/')).")({$delim})/ie", "'\\1'.str_repeat('#', strlen('\\2')).'\\3'", $str); + } + } + + return trim($str); + } +} + +// ------------------------------------------------------------------------ + +/** + * Code Highlighter + * + * Colorizes code strings + * + * @access public + * @param string the text string + * @return string + */ +if ( ! function_exists('highlight_code')) +{ + function highlight_code($str) + { + // The highlight string function encodes and highlights + // brackets so we need them to start raw + $str = str_replace(array('&lt;', '&gt;'), array('<', '>'), $str); + + // Replace any existing PHP tags to temporary markers so they don't accidentally + // break the string out of PHP, and thus, thwart the highlighting. + + $str = str_replace(array('<?', '?>', '<%', '%>', '\\', '</script>'), + array('phptagopen', 'phptagclose', 'asptagopen', 'asptagclose', 'backslashtmp', 'scriptclose'), $str); + + // The highlight_string function requires that the text be surrounded + // by PHP tags, which we will remove later + $str = '<?php '.$str.' ?>'; // <? + + // All the magic happens here, baby! + $str = highlight_string($str, TRUE); + + // Remove our artificially added PHP, and the syntax highlighting that came with it + $str = preg_replace('/<span style="color: #([A-Z0-9]+)">&lt;\?php(&nbsp;| )/i', '<span style="color: #$1">', $str); + $str = preg_replace('/(<span style="color: #[A-Z0-9]+">.*?)\?&gt;<\/span>\n<\/span>\n<\/code>/is', "$1</span>\n</span>\n</code>", $str); + $str = preg_replace('/<span style="color: #[A-Z0-9]+"\><\/span>/i', '', $str); + + // Replace our markers back to PHP tags. + $str = str_replace(array('phptagopen', 'phptagclose', 'asptagopen', 'asptagclose', 'backslashtmp', 'scriptclose'), + array('&lt;?', '?&gt;', '&lt;%', '%&gt;', '\\', '&lt;/script&gt;'), $str); + + return $str; + } +} + +// ------------------------------------------------------------------------ + +/** + * Phrase Highlighter + * + * Highlights a phrase within a text string + * + * @access public + * @param string the text string + * @param string the phrase you'd like to highlight + * @param string the openging tag to precede the phrase with + * @param string the closing tag to end the phrase with + * @return string + */ +if ( ! function_exists('highlight_phrase')) +{ + function highlight_phrase($str, $phrase, $tag_open = '<strong>', $tag_close = '</strong>') + { + if ($str == '') + { + return ''; + } + + if ($phrase != '') + { + return preg_replace('/('.preg_quote($phrase, '/').')/i', $tag_open."\\1".$tag_close, $str); + } + + return $str; + } +} + +// ------------------------------------------------------------------------ + +/** + * Convert Accented Foreign Characters to ASCII + * + * @access public + * @param string the text string + * @return string + */ +if ( ! function_exists('convert_accented_characters')) +{ + function convert_accented_characters($str) + { + if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/foreign_chars.php')) + { + include(APPPATH.'config/'.ENVIRONMENT.'/foreign_chars.php'); + } + elseif (is_file(APPPATH.'config/foreign_chars.php')) + { + include(APPPATH.'config/foreign_chars.php'); + } + + if ( ! isset($foreign_characters)) + { + return $str; + } + + return preg_replace(array_keys($foreign_characters), array_values($foreign_characters), $str); + } +} + +// ------------------------------------------------------------------------ + +/** + * Word Wrap + * + * Wraps text at the specified character. Maintains the integrity of words. + * Anything placed between {unwrap}{/unwrap} will not be word wrapped, nor + * will URLs. + * + * @access public + * @param string the text string + * @param integer the number of characters to wrap at + * @return string + */ +if ( ! function_exists('word_wrap')) +{ + function word_wrap($str, $charlim = '76') + { + // Se the character limit + if ( ! is_numeric($charlim)) + $charlim = 76; + + // Reduce multiple spaces + $str = preg_replace("| +|", " ", $str); + + // Standardize newlines + if (strpos($str, "\r") !== FALSE) + { + $str = str_replace(array("\r\n", "\r"), "\n", $str); + } + + // If the current word is surrounded by {unwrap} tags we'll + // strip the entire chunk and replace it with a marker. + $unwrap = array(); + if (preg_match_all("|(\{unwrap\}.+?\{/unwrap\})|s", $str, $matches)) + { + for ($i = 0; $i < count($matches['0']); $i++) + { + $unwrap[] = $matches['1'][$i]; + $str = str_replace($matches['1'][$i], "{{unwrapped".$i."}}", $str); + } + } + + // Use PHP's native function to do the initial wordwrap. + // We set the cut flag to FALSE so that any individual words that are + // too long get left alone. In the next step we'll deal with them. + $str = wordwrap($str, $charlim, "\n", FALSE); + + // Split the string into individual lines of text and cycle through them + $output = ""; + foreach (explode("\n", $str) as $line) + { + // Is the line within the allowed character count? + // If so we'll join it to the output and continue + if (strlen($line) <= $charlim) + { + $output .= $line."\n"; + continue; + } + + $temp = ''; + while ((strlen($line)) > $charlim) + { + // If the over-length word is a URL we won't wrap it + if (preg_match("!\[url.+\]|://|wwww.!", $line)) + { + break; + } + + // Trim the word down + $temp .= substr($line, 0, $charlim-1); + $line = substr($line, $charlim-1); + } + + // If $temp contains data it means we had to split up an over-length + // word into smaller chunks so we'll add it back to our current line + if ($temp != '') + { + $output .= $temp."\n".$line; + } + else + { + $output .= $line; + } + + $output .= "\n"; + } + + // Put our markers back + if (count($unwrap) > 0) + { + foreach ($unwrap as $key => $val) + { + $output = str_replace("{{unwrapped".$key."}}", $val, $output); + } + } + + // Remove the unwrap tags + $output = str_replace(array('{unwrap}', '{/unwrap}'), '', $output); + + return $output; + } +} + +// ------------------------------------------------------------------------ + +/** + * Ellipsize String + * + * This function will strip tags from a string, split it at its max_length and ellipsize + * + * @param string string to ellipsize + * @param integer max length of string + * @param mixed int (1|0) or float, .5, .2, etc for position to split + * @param string ellipsis ; Default '...' + * @return string ellipsized string + */ +if ( ! function_exists('ellipsize')) +{ + function ellipsize($str, $max_length, $position = 1, $ellipsis = '&hellip;') + { + // Strip tags + $str = trim(strip_tags($str)); + + // Is the string long enough to ellipsize? + if (strlen($str) <= $max_length) + { + return $str; + } + + $beg = substr($str, 0, floor($max_length * $position)); + + $position = ($position > 1) ? 1 : $position; + + if ($position === 1) + { + $end = substr($str, 0, -($max_length - strlen($beg))); + } + else + { + $end = substr($str, -($max_length - strlen($beg))); + } + + return $beg.$ellipsis.$end; + } +} + +/* End of file text_helper.php */ +/* Location: ./system/helpers/text_helper.php */ \ No newline at end of file diff --git a/system/helpers/typography_helper.php b/system/helpers/typography_helper.php new file mode 100644 index 0000000..1e7a6ab --- /dev/null +++ b/system/helpers/typography_helper.php @@ -0,0 +1,94 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Typography Helpers + * + * @package CodeIgniter + * @subpackage Helpers + * @category Helpers + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/helpers/typography_helper.html + */ + +// ------------------------------------------------------------------------ + +/** + * Convert newlines to HTML line breaks except within PRE tags + * + * @access public + * @param string + * @return string + */ +if ( ! function_exists('nl2br_except_pre')) +{ + function nl2br_except_pre($str) + { + $CI =& get_instance(); + + $CI->load->library('typography'); + + return $CI->typography->nl2br_except_pre($str); + } +} + +// ------------------------------------------------------------------------ + +/** + * Auto Typography Wrapper Function + * + * + * @access public + * @param string + * @param bool whether to allow javascript event handlers + * @param bool whether to reduce multiple instances of double newlines to two + * @return string + */ +if ( ! function_exists('auto_typography')) +{ + function auto_typography($str, $strip_js_event_handlers = TRUE, $reduce_linebreaks = FALSE) + { + $CI =& get_instance(); + $CI->load->library('typography'); + return $CI->typography->auto_typography($str, $strip_js_event_handlers, $reduce_linebreaks); + } +} + + +// -------------------------------------------------------------------- + +/** + * HTML Entities Decode + * + * This function is a replacement for html_entity_decode() + * + * @access public + * @param string + * @return string + */ +if ( ! function_exists('entity_decode')) +{ + function entity_decode($str, $charset='UTF-8') + { + global $SEC; + return $SEC->entity_decode($str, $charset); + } +} + +/* End of file typography_helper.php */ +/* Location: ./system/helpers/typography_helper.php */ \ No newline at end of file diff --git a/system/helpers/url_helper.php b/system/helpers/url_helper.php new file mode 100644 index 0000000..4bdf067 --- /dev/null +++ b/system/helpers/url_helper.php @@ -0,0 +1,595 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter URL Helpers + * + * @package CodeIgniter + * @subpackage Helpers + * @category Helpers + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/helpers/url_helper.html + */ + +// ------------------------------------------------------------------------ + +/** + * Site URL + * + * Create a local URL based on your basepath. Segments can be passed via the + * first parameter either as a string or an array. + * + * @access public + * @param string + * @return string + */ +if ( ! function_exists('site_url')) +{ + function site_url($uri = '') + { + $CI =& get_instance(); + return $CI->config->site_url($uri); + } +} + +// ------------------------------------------------------------------------ + +/** + * Base URL + * + * Create a local URL based on your basepath. + * Segments can be passed in as a string or an array, same as site_url + * or a URL to a file can be passed in, e.g. to an image file. + * + * @access public + * @param string + * @return string + */ +if ( ! function_exists('base_url')) +{ + function base_url($uri = '') + { + $CI =& get_instance(); + return $CI->config->base_url($uri); + } +} + +// ------------------------------------------------------------------------ + +/** + * Current URL + * + * Returns the full URL (including segments) of the page where this + * function is placed + * + * @access public + * @return string + */ +if ( ! function_exists('current_url')) +{ + function current_url() + { + $CI =& get_instance(); + return $CI->config->site_url($CI->uri->uri_string()); + } +} + +// ------------------------------------------------------------------------ +/** + * URL String + * + * Returns the URI segments. + * + * @access public + * @return string + */ +if ( ! function_exists('uri_string')) +{ + function uri_string() + { + $CI =& get_instance(); + return $CI->uri->uri_string(); + } +} + +// ------------------------------------------------------------------------ + +/** + * Index page + * + * Returns the "index_page" from your config file + * + * @access public + * @return string + */ +if ( ! function_exists('index_page')) +{ + function index_page() + { + $CI =& get_instance(); + return $CI->config->item('index_page'); + } +} + +// ------------------------------------------------------------------------ + +/** + * Anchor Link + * + * Creates an anchor based on the local URL. + * + * @access public + * @param string the URL + * @param string the link title + * @param mixed any attributes + * @return string + */ +if ( ! function_exists('anchor')) +{ + function anchor($uri = '', $title = '', $attributes = '') + { + $title = (string) $title; + + if ( ! is_array($uri)) + { + $site_url = ( ! preg_match('!^\w+://! i', $uri)) ? site_url($uri) : $uri; + } + else + { + $site_url = site_url($uri); + } + + if ($title == '') + { + $title = $site_url; + } + + if ($attributes != '') + { + $attributes = _parse_attributes($attributes); + } + + return '<a href="'.$site_url.'"'.$attributes.'>'.$title.'</a>'; + } +} + +// ------------------------------------------------------------------------ + +/** + * Anchor Link - Pop-up version + * + * Creates an anchor based on the local URL. The link + * opens a new window based on the attributes specified. + * + * @access public + * @param string the URL + * @param string the link title + * @param mixed any attributes + * @return string + */ +if ( ! function_exists('anchor_popup')) +{ + function anchor_popup($uri = '', $title = '', $attributes = FALSE) + { + $title = (string) $title; + + $site_url = ( ! preg_match('!^\w+://! i', $uri)) ? site_url($uri) : $uri; + + if ($title == '') + { + $title = $site_url; + } + + if ($attributes === FALSE) + { + return "<a href='javascript:void(0);' onclick=\"window.open('".$site_url."', '_blank');\">".$title."</a>"; + } + + if ( ! is_array($attributes)) + { + $attributes = array(); + } + + foreach (array('width' => '800', 'height' => '600', 'scrollbars' => 'yes', 'status' => 'yes', 'resizable' => 'yes', 'screenx' => '0', 'screeny' => '0', ) as $key => $val) + { + $atts[$key] = ( ! isset($attributes[$key])) ? $val : $attributes[$key]; + unset($attributes[$key]); + } + + if ($attributes != '') + { + $attributes = _parse_attributes($attributes); + } + + return "<a href='javascript:void(0);' onclick=\"window.open('".$site_url."', '_blank', '"._parse_attributes($atts, TRUE)."');\"$attributes>".$title."</a>"; + } +} + +// ------------------------------------------------------------------------ + +/** + * Mailto Link + * + * @access public + * @param string the email address + * @param string the link title + * @param mixed any attributes + * @return string + */ +if ( ! function_exists('mailto')) +{ + function mailto($email, $title = '', $attributes = '') + { + $title = (string) $title; + + if ($title == "") + { + $title = $email; + } + + $attributes = _parse_attributes($attributes); + + return '<a href="mailto:'.$email.'"'.$attributes.'>'.$title.'</a>'; + } +} + +// ------------------------------------------------------------------------ + +/** + * Encoded Mailto Link + * + * Create a spam-protected mailto link written in Javascript + * + * @access public + * @param string the email address + * @param string the link title + * @param mixed any attributes + * @return string + */ +if ( ! function_exists('safe_mailto')) +{ + function safe_mailto($email, $title = '', $attributes = '') + { + $title = (string) $title; + + if ($title == "") + { + $title = $email; + } + + for ($i = 0; $i < 16; $i++) + { + $x[] = substr('<a href="mailto:', $i, 1); + } + + for ($i = 0; $i < strlen($email); $i++) + { + $x[] = "|".ord(substr($email, $i, 1)); + } + + $x[] = '"'; + + if ($attributes != '') + { + if (is_array($attributes)) + { + foreach ($attributes as $key => $val) + { + $x[] = ' '.$key.'="'; + for ($i = 0; $i < strlen($val); $i++) + { + $x[] = "|".ord(substr($val, $i, 1)); + } + $x[] = '"'; + } + } + else + { + for ($i = 0; $i < strlen($attributes); $i++) + { + $x[] = substr($attributes, $i, 1); + } + } + } + + $x[] = '>'; + + $temp = array(); + for ($i = 0; $i < strlen($title); $i++) + { + $ordinal = ord($title[$i]); + + if ($ordinal < 128) + { + $x[] = "|".$ordinal; + } + else + { + if (count($temp) == 0) + { + $count = ($ordinal < 224) ? 2 : 3; + } + + $temp[] = $ordinal; + if (count($temp) == $count) + { + $number = ($count == 3) ? (($temp['0'] % 16) * 4096) + (($temp['1'] % 64) * 64) + ($temp['2'] % 64) : (($temp['0'] % 32) * 64) + ($temp['1'] % 64); + $x[] = "|".$number; + $count = 1; + $temp = array(); + } + } + } + + $x[] = '<'; $x[] = '/'; $x[] = 'a'; $x[] = '>'; + + $x = array_reverse($x); + ob_start(); + + ?><script type="text/javascript"> + //<![CDATA[ + var l=new Array(); + <?php + $i = 0; + foreach ($x as $val){ ?>l[<?php echo $i++; ?>]='<?php echo $val; ?>';<?php } ?> + + for (var i = l.length-1; i >= 0; i=i-1){ + if (l[i].substring(0, 1) == '|') document.write("&#"+unescape(l[i].substring(1))+";"); + else document.write(unescape(l[i]));} + //]]> + </script><?php + + $buffer = ob_get_contents(); + ob_end_clean(); + return $buffer; + } +} + +// ------------------------------------------------------------------------ + +/** + * Auto-linker + * + * Automatically links URL and Email addresses. + * Note: There's a bit of extra code here to deal with + * URLs or emails that end in a period. We'll strip these + * off and add them after the link. + * + * @access public + * @param string the string + * @param string the type: email, url, or both + * @param bool whether to create pop-up links + * @return string + */ +if ( ! function_exists('auto_link')) +{ + function auto_link($str, $type = 'both', $popup = FALSE) + { + if ($type != 'email') + { + if (preg_match_all("#(^|\s|\()((http(s?)://)|(www\.))(\w+[^\s\)\<]+)#i", $str, $matches)) + { + $pop = ($popup == TRUE) ? " target=\"_blank\" " : ""; + + for ($i = 0; $i < count($matches['0']); $i++) + { + $period = ''; + if (preg_match("|\.$|", $matches['6'][$i])) + { + $period = '.'; + $matches['6'][$i] = substr($matches['6'][$i], 0, -1); + } + + $str = str_replace($matches['0'][$i], + $matches['1'][$i].'<a href="http'. + $matches['4'][$i].'://'. + $matches['5'][$i]. + $matches['6'][$i].'"'.$pop.'>http'. + $matches['4'][$i].'://'. + $matches['5'][$i]. + $matches['6'][$i].'</a>'. + $period, $str); + } + } + } + + if ($type != 'url') + { + if (preg_match_all("/([a-zA-Z0-9_\.\-\+]+)@([a-zA-Z0-9\-]+)\.([a-zA-Z0-9\-\.]*)/i", $str, $matches)) + { + for ($i = 0; $i < count($matches['0']); $i++) + { + $period = ''; + if (preg_match("|\.$|", $matches['3'][$i])) + { + $period = '.'; + $matches['3'][$i] = substr($matches['3'][$i], 0, -1); + } + + $str = str_replace($matches['0'][$i], safe_mailto($matches['1'][$i].'@'.$matches['2'][$i].'.'.$matches['3'][$i]).$period, $str); + } + } + } + + return $str; + } +} + +// ------------------------------------------------------------------------ + +/** + * Prep URL + * + * Simply adds the http:// part if no scheme is included + * + * @access public + * @param string the URL + * @return string + */ +if ( ! function_exists('prep_url')) +{ + function prep_url($str = '') + { + if ($str == 'http://' OR $str == '') + { + return ''; + } + + $url = parse_url($str); + + if ( ! $url OR ! isset($url['scheme'])) + { + $str = 'http://'.$str; + } + + return $str; + } +} + +// ------------------------------------------------------------------------ + +/** + * Create URL Title + * + * Takes a "title" string as input and creates a + * human-friendly URL string with a "separator" string + * as the word separator. + * + * @access public + * @param string the string + * @param string the separator + * @return string + */ +if ( ! function_exists('url_title')) +{ + function url_title($str, $separator = '-', $lowercase = FALSE) + { + if ($separator == 'dash') + { + $separator = '-'; + } + else if ($separator == 'underscore') + { + $separator = '_'; + } + + $q_separator = preg_quote($separator); + + $trans = array( + '&.+?;' => '', + '[^a-z0-9 _-]' => '', + '\s+' => $separator, + '('.$q_separator.')+' => $separator + ); + + $str = strip_tags($str); + + foreach ($trans as $key => $val) + { + $str = preg_replace("#".$key."#i", $val, $str); + } + + if ($lowercase === TRUE) + { + $str = strtolower($str); + } + + return trim($str, $separator); + } +} + +// ------------------------------------------------------------------------ + +/** + * Header Redirect + * + * Header redirect in two flavors + * For very fine grained control over headers, you could use the Output + * Library's set_header() function. + * + * @access public + * @param string the URL + * @param string the method: location or redirect + * @return string + */ +if ( ! function_exists('redirect')) +{ + function redirect($uri = '', $method = 'location', $http_response_code = 302) + { + if ( ! preg_match('#^https?://#i', $uri)) + { + $uri = site_url($uri); + } + + switch($method) + { + case 'refresh' : header("Refresh:0;url=".$uri); + break; + default : header("Location: ".$uri, TRUE, $http_response_code); + break; + } + exit; + } +} + +// ------------------------------------------------------------------------ + +/** + * Parse out the attributes + * + * Some of the functions use this + * + * @access private + * @param array + * @param bool + * @return string + */ +if ( ! function_exists('_parse_attributes')) +{ + function _parse_attributes($attributes, $javascript = FALSE) + { + if (is_string($attributes)) + { + return ($attributes != '') ? ' '.$attributes : ''; + } + + $att = ''; + foreach ($attributes as $key => $val) + { + if ($javascript == TRUE) + { + $att .= $key . '=' . $val . ','; + } + else + { + $att .= ' ' . $key . '="' . $val . '"'; + } + } + + if ($javascript == TRUE AND $att != '') + { + $att = substr($att, 0, -1); + } + + return $att; + } +} + + +/* End of file url_helper.php */ +/* Location: ./system/helpers/url_helper.php */ \ No newline at end of file diff --git a/system/helpers/xml_helper.php b/system/helpers/xml_helper.php new file mode 100644 index 0000000..9c1fadb --- /dev/null +++ b/system/helpers/xml_helper.php @@ -0,0 +1,72 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter XML Helpers + * + * @package CodeIgniter + * @subpackage Helpers + * @category Helpers + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/helpers/xml_helper.html + */ + +// ------------------------------------------------------------------------ + +/** + * Convert Reserved XML characters to Entities + * + * @access public + * @param string + * @return string + */ +if ( ! function_exists('xml_convert')) +{ + function xml_convert($str, $protect_all = FALSE) + { + $temp = '__TEMP_AMPERSANDS__'; + + // Replace entities to temporary markers so that + // ampersands won't get messed up + $str = preg_replace("/&#(\d+);/", "$temp\\1;", $str); + + if ($protect_all === TRUE) + { + $str = preg_replace("/&(\w+);/", "$temp\\1;", $str); + } + + $str = str_replace(array("&","<",">","\"", "'", "-"), + array("&amp;", "&lt;", "&gt;", "&quot;", "&apos;", "&#45;"), + $str); + + // Decode the temp markers back to entities + $str = preg_replace("/$temp(\d+);/","&#\\1;",$str); + + if ($protect_all === TRUE) + { + $str = preg_replace("/$temp(\w+);/","&\\1;", $str); + } + + return $str; + } +} + +// ------------------------------------------------------------------------ + +/* End of file xml_helper.php */ +/* Location: ./system/helpers/xml_helper.php */ \ No newline at end of file diff --git a/system/index.html b/system/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/system/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/system/language/english/calendar_lang.php b/system/language/english/calendar_lang.php new file mode 100644 index 0000000..3e63123 --- /dev/null +++ b/system/language/english/calendar_lang.php @@ -0,0 +1,51 @@ +<?php + +$lang['cal_su'] = "Su"; +$lang['cal_mo'] = "Mo"; +$lang['cal_tu'] = "Tu"; +$lang['cal_we'] = "We"; +$lang['cal_th'] = "Th"; +$lang['cal_fr'] = "Fr"; +$lang['cal_sa'] = "Sa"; +$lang['cal_sun'] = "Sun"; +$lang['cal_mon'] = "Mon"; +$lang['cal_tue'] = "Tue"; +$lang['cal_wed'] = "Wed"; +$lang['cal_thu'] = "Thu"; +$lang['cal_fri'] = "Fri"; +$lang['cal_sat'] = "Sat"; +$lang['cal_sunday'] = "Sunday"; +$lang['cal_monday'] = "Monday"; +$lang['cal_tuesday'] = "Tuesday"; +$lang['cal_wednesday'] = "Wednesday"; +$lang['cal_thursday'] = "Thursday"; +$lang['cal_friday'] = "Friday"; +$lang['cal_saturday'] = "Saturday"; +$lang['cal_jan'] = "Jan"; +$lang['cal_feb'] = "Feb"; +$lang['cal_mar'] = "Mar"; +$lang['cal_apr'] = "Apr"; +$lang['cal_may'] = "May"; +$lang['cal_jun'] = "Jun"; +$lang['cal_jul'] = "Jul"; +$lang['cal_aug'] = "Aug"; +$lang['cal_sep'] = "Sep"; +$lang['cal_oct'] = "Oct"; +$lang['cal_nov'] = "Nov"; +$lang['cal_dec'] = "Dec"; +$lang['cal_january'] = "January"; +$lang['cal_february'] = "February"; +$lang['cal_march'] = "March"; +$lang['cal_april'] = "April"; +$lang['cal_mayl'] = "May"; +$lang['cal_june'] = "June"; +$lang['cal_july'] = "July"; +$lang['cal_august'] = "August"; +$lang['cal_september'] = "September"; +$lang['cal_october'] = "October"; +$lang['cal_november'] = "November"; +$lang['cal_december'] = "December"; + + +/* End of file calendar_lang.php */ +/* Location: ./system/language/english/calendar_lang.php */ \ No newline at end of file diff --git a/system/language/english/date_lang.php b/system/language/english/date_lang.php new file mode 100644 index 0000000..0a85476 --- /dev/null +++ b/system/language/english/date_lang.php @@ -0,0 +1,61 @@ +<?php + +$lang['date_year'] = "Year"; +$lang['date_years'] = "Years"; +$lang['date_month'] = "Month"; +$lang['date_months'] = "Months"; +$lang['date_week'] = "Week"; +$lang['date_weeks'] = "Weeks"; +$lang['date_day'] = "Day"; +$lang['date_days'] = "Days"; +$lang['date_hour'] = "Hour"; +$lang['date_hours'] = "Hours"; +$lang['date_minute'] = "Minute"; +$lang['date_minutes'] = "Minutes"; +$lang['date_second'] = "Second"; +$lang['date_seconds'] = "Seconds"; + +$lang['UM12'] = '(UTC -12:00) Baker/Howland Island'; +$lang['UM11'] = '(UTC -11:00) Samoa Time Zone, Niue'; +$lang['UM10'] = '(UTC -10:00) Hawaii-Aleutian Standard Time, Cook Islands, Tahiti'; +$lang['UM95'] = '(UTC -9:30) Marquesas Islands'; +$lang['UM9'] = '(UTC -9:00) Alaska Standard Time, Gambier Islands'; +$lang['UM8'] = '(UTC -8:00) Pacific Standard Time, Clipperton Island'; +$lang['UM7'] = '(UTC -7:00) Mountain Standard Time'; +$lang['UM6'] = '(UTC -6:00) Central Standard Time'; +$lang['UM5'] = '(UTC -5:00) Eastern Standard Time, Western Caribbean Standard Time'; +$lang['UM45'] = '(UTC -4:30) Venezuelan Standard Time'; +$lang['UM4'] = '(UTC -4:00) Atlantic Standard Time, Eastern Caribbean Standard Time'; +$lang['UM35'] = '(UTC -3:30) Newfoundland Standard Time'; +$lang['UM3'] = '(UTC -3:00) Argentina, Brazil, French Guiana, Uruguay'; +$lang['UM2'] = '(UTC -2:00) South Georgia/South Sandwich Islands'; +$lang['UM1'] = '(UTC -1:00) Azores, Cape Verde Islands'; +$lang['UTC'] = '(UTC) Greenwich Mean Time, Western European Time'; +$lang['UP1'] = '(UTC +1:00) Central European Time, West Africa Time'; +$lang['UP2'] = '(UTC +2:00) Central Africa Time, Eastern European Time, Kaliningrad Time'; +$lang['UP3'] = '(UTC +3:00) Moscow Time, East Africa Time'; +$lang['UP35'] = '(UTC +3:30) Iran Standard Time'; +$lang['UP4'] = '(UTC +4:00) Azerbaijan Standard Time, Samara Time'; +$lang['UP45'] = '(UTC +4:30) Afghanistan'; +$lang['UP5'] = '(UTC +5:00) Pakistan Standard Time, Yekaterinburg Time'; +$lang['UP55'] = '(UTC +5:30) Indian Standard Time, Sri Lanka Time'; +$lang['UP575'] = '(UTC +5:45) Nepal Time'; +$lang['UP6'] = '(UTC +6:00) Bangladesh Standard Time, Bhutan Time, Omsk Time'; +$lang['UP65'] = '(UTC +6:30) Cocos Islands, Myanmar'; +$lang['UP7'] = '(UTC +7:00) Krasnoyarsk Time, Cambodia, Laos, Thailand, Vietnam'; +$lang['UP8'] = '(UTC +8:00) Australian Western Standard Time, Beijing Time, Irkutsk Time'; +$lang['UP875'] = '(UTC +8:45) Australian Central Western Standard Time'; +$lang['UP9'] = '(UTC +9:00) Japan Standard Time, Korea Standard Time, Yakutsk Time'; +$lang['UP95'] = '(UTC +9:30) Australian Central Standard Time'; +$lang['UP10'] = '(UTC +10:00) Australian Eastern Standard Time, Vladivostok Time'; +$lang['UP105'] = '(UTC +10:30) Lord Howe Island'; +$lang['UP11'] = '(UTC +11:00) Srednekolymsk Time, Solomon Islands, Vanuatu'; +$lang['UP115'] = '(UTC +11:30) Norfolk Island'; +$lang['UP12'] = '(UTC +12:00) Fiji, Gilbert Islands, Kamchatka Time, New Zealand Standard Time'; +$lang['UP1275'] = '(UTC +12:45) Chatham Islands Standard Time'; +$lang['UP13'] = '(UTC +13:00) Phoenix Islands Time, Tonga'; +$lang['UP14'] = '(UTC +14:00) Line Islands'; + + +/* End of file date_lang.php */ +/* Location: ./system/language/english/date_lang.php */ \ No newline at end of file diff --git a/system/language/english/db_lang.php b/system/language/english/db_lang.php new file mode 100644 index 0000000..79b82c7 --- /dev/null +++ b/system/language/english/db_lang.php @@ -0,0 +1,29 @@ +<?php + +$lang['db_invalid_connection_str'] = 'Unable to determine the database settings based on the connection string you submitted.'; +$lang['db_unable_to_connect'] = 'Unable to connect to your database server using the provided settings.'; +$lang['db_unable_to_select'] = 'Unable to select the specified database: %s'; +$lang['db_unable_to_create'] = 'Unable to create the specified database: %s'; +$lang['db_invalid_query'] = 'The query you submitted is not valid.'; +$lang['db_must_set_table'] = 'You must set the database table to be used with your query.'; +$lang['db_must_use_set'] = 'You must use the "set" method to update an entry.'; +$lang['db_must_use_index'] = 'You must specify an index to match on for batch updates.'; +$lang['db_batch_missing_index'] = 'One or more rows submitted for batch updating is missing the specified index.'; +$lang['db_must_use_where'] = 'Updates are not allowed unless they contain a "where" clause.'; +$lang['db_del_must_use_where'] = 'Deletes are not allowed unless they contain a "where" or "like" clause.'; +$lang['db_field_param_missing'] = 'To fetch fields requires the name of the table as a parameter.'; +$lang['db_unsupported_function'] = 'This feature is not available for the database you are using.'; +$lang['db_transaction_failure'] = 'Transaction failure: Rollback performed.'; +$lang['db_unable_to_drop'] = 'Unable to drop the specified database.'; +$lang['db_unsuported_feature'] = 'Unsupported feature of the database platform you are using.'; +$lang['db_unsuported_compression'] = 'The file compression format you chose is not supported by your server.'; +$lang['db_filepath_error'] = 'Unable to write data to the file path you have submitted.'; +$lang['db_invalid_cache_path'] = 'The cache path you submitted is not valid or writable.'; +$lang['db_table_name_required'] = 'A table name is required for that operation.'; +$lang['db_column_name_required'] = 'A column name is required for that operation.'; +$lang['db_column_definition_required'] = 'A column definition is required for that operation.'; +$lang['db_unable_to_set_charset'] = 'Unable to set client connection character set: %s'; +$lang['db_error_heading'] = 'A Database Error Occurred'; + +/* End of file db_lang.php */ +/* Location: ./system/language/english/db_lang.php */ \ No newline at end of file diff --git a/system/language/english/email_lang.php b/system/language/english/email_lang.php new file mode 100644 index 0000000..e3bd113 --- /dev/null +++ b/system/language/english/email_lang.php @@ -0,0 +1,24 @@ +<?php + +$lang['email_must_be_array'] = "The email validation method must be passed an array."; +$lang['email_invalid_address'] = "Invalid email address: %s"; +$lang['email_attachment_missing'] = "Unable to locate the following email attachment: %s"; +$lang['email_attachment_unreadable'] = "Unable to open this attachment: %s"; +$lang['email_no_recipients'] = "You must include recipients: To, Cc, or Bcc"; +$lang['email_send_failure_phpmail'] = "Unable to send email using PHP mail(). Your server might not be configured to send mail using this method."; +$lang['email_send_failure_sendmail'] = "Unable to send email using PHP Sendmail. Your server might not be configured to send mail using this method."; +$lang['email_send_failure_smtp'] = "Unable to send email using PHP SMTP. Your server might not be configured to send mail using this method."; +$lang['email_sent'] = "Your message has been successfully sent using the following protocol: %s"; +$lang['email_no_socket'] = "Unable to open a socket to Sendmail. Please check settings."; +$lang['email_no_hostname'] = "You did not specify a SMTP hostname."; +$lang['email_smtp_error'] = "The following SMTP error was encountered: %s"; +$lang['email_no_smtp_unpw'] = "Error: You must assign a SMTP username and password."; +$lang['email_failed_smtp_login'] = "Failed to send AUTH LOGIN command. Error: %s"; +$lang['email_smtp_auth_un'] = "Failed to authenticate username. Error: %s"; +$lang['email_smtp_auth_pw'] = "Failed to authenticate password. Error: %s"; +$lang['email_smtp_data_failure'] = "Unable to send data: %s"; +$lang['email_exit_status'] = "Exit status code: %s"; + + +/* End of file email_lang.php */ +/* Location: ./system/language/english/email_lang.php */ \ No newline at end of file diff --git a/system/language/english/form_validation_lang.php b/system/language/english/form_validation_lang.php new file mode 100644 index 0000000..3418f29 --- /dev/null +++ b/system/language/english/form_validation_lang.php @@ -0,0 +1,29 @@ +<?php + +$lang['required'] = "The %s field is required."; +$lang['isset'] = "The %s field must have a value."; +$lang['valid_email'] = "The %s field must contain a valid email address."; +$lang['valid_emails'] = "The %s field must contain all valid email addresses."; +$lang['valid_url'] = "The %s field must contain a valid URL."; +$lang['valid_ip'] = "The %s field must contain a valid IP."; +$lang['min_length'] = "The %s field must be at least %s characters in length."; +$lang['max_length'] = "The %s field can not exceed %s characters in length."; +$lang['exact_length'] = "The %s field must be exactly %s characters in length."; +$lang['alpha'] = "The %s field may only contain alphabetical characters."; +$lang['alpha_numeric'] = "The %s field may only contain alpha-numeric characters."; +$lang['alpha_dash'] = "The %s field may only contain alpha-numeric characters, underscores, and dashes."; +$lang['numeric'] = "The %s field must contain only numbers."; +$lang['is_numeric'] = "The %s field must contain only numeric characters."; +$lang['integer'] = "The %s field must contain an integer."; +$lang['regex_match'] = "The %s field is not in the correct format."; +$lang['matches'] = "The %s field does not match the %s field."; +$lang['is_unique'] = "The %s field must contain a unique value."; +$lang['is_natural'] = "The %s field must contain only positive numbers."; +$lang['is_natural_no_zero'] = "The %s field must contain a number greater than zero."; +$lang['decimal'] = "The %s field must contain a decimal number."; +$lang['less_than'] = "The %s field must contain a number less than %s."; +$lang['greater_than'] = "The %s field must contain a number greater than %s."; + + +/* End of file form_validation_lang.php */ +/* Location: ./system/language/english/form_validation_lang.php */ \ No newline at end of file diff --git a/system/language/english/ftp_lang.php b/system/language/english/ftp_lang.php new file mode 100644 index 0000000..7a8896f --- /dev/null +++ b/system/language/english/ftp_lang.php @@ -0,0 +1,18 @@ +<?php + +$lang['ftp_no_connection'] = "Unable to locate a valid connection ID. Please make sure you are connected before peforming any file routines."; +$lang['ftp_unable_to_connect'] = "Unable to connect to your FTP server using the supplied hostname."; +$lang['ftp_unable_to_login'] = "Unable to login to your FTP server. Please check your username and password."; +$lang['ftp_unable_to_makdir'] = "Unable to create the directory you have specified."; +$lang['ftp_unable_to_changedir'] = "Unable to change directories."; +$lang['ftp_unable_to_chmod'] = "Unable to set file permissions. Please check your path."; +$lang['ftp_unable_to_upload'] = "Unable to upload the specified file. Please check your path."; +$lang['ftp_unable_to_download'] = "Unable to download the specified file. Please check your path."; +$lang['ftp_no_source_file'] = "Unable to locate the source file. Please check your path."; +$lang['ftp_unable_to_rename'] = "Unable to rename the file."; +$lang['ftp_unable_to_delete'] = "Unable to delete the file."; +$lang['ftp_unable_to_move'] = "Unable to move the file. Please make sure the destination directory exists."; + + +/* End of file ftp_lang.php */ +/* Location: ./system/language/english/ftp_lang.php */ \ No newline at end of file diff --git a/system/language/english/imglib_lang.php b/system/language/english/imglib_lang.php new file mode 100644 index 0000000..66505da --- /dev/null +++ b/system/language/english/imglib_lang.php @@ -0,0 +1,24 @@ +<?php + +$lang['imglib_source_image_required'] = "You must specify a source image in your preferences."; +$lang['imglib_gd_required'] = "The GD image library is required for this feature."; +$lang['imglib_gd_required_for_props'] = "Your server must support the GD image library in order to determine the image properties."; +$lang['imglib_unsupported_imagecreate'] = "Your server does not support the GD function required to process this type of image."; +$lang['imglib_gif_not_supported'] = "GIF images are often not supported due to licensing restrictions. You may have to use JPG or PNG images instead."; +$lang['imglib_jpg_not_supported'] = "JPG images are not supported."; +$lang['imglib_png_not_supported'] = "PNG images are not supported."; +$lang['imglib_jpg_or_png_required'] = "The image resize protocol specified in your preferences only works with JPEG or PNG image types."; +$lang['imglib_copy_error'] = "An error was encountered while attempting to replace the file. Please make sure your file directory is writable."; +$lang['imglib_rotate_unsupported'] = "Image rotation does not appear to be supported by your server."; +$lang['imglib_libpath_invalid'] = "The path to your image library is not correct. Please set the correct path in your image preferences."; +$lang['imglib_image_process_failed'] = "Image processing failed. Please verify that your server supports the chosen protocol and that the path to your image library is correct."; +$lang['imglib_rotation_angle_required'] = "An angle of rotation is required to rotate the image."; +$lang['imglib_writing_failed_gif'] = "GIF image."; +$lang['imglib_invalid_path'] = "The path to the image is not correct."; +$lang['imglib_copy_failed'] = "The image copy routine failed."; +$lang['imglib_missing_font'] = "Unable to find a font to use."; +$lang['imglib_save_failed'] = "Unable to save the image. Please make sure the image and file directory are writable."; + + +/* End of file imglib_lang.php */ +/* Location: ./system/language/english/imglib_lang.php */ \ No newline at end of file diff --git a/system/language/english/index.html b/system/language/english/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/system/language/english/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/system/language/english/migration_lang.php b/system/language/english/migration_lang.php new file mode 100644 index 0000000..f17530f --- /dev/null +++ b/system/language/english/migration_lang.php @@ -0,0 +1,13 @@ +<?php + +$lang['migration_none_found'] = "No migrations were found."; +$lang['migration_not_found'] = "This migration could not be found."; +$lang['migration_multiple_version'] = "This are multiple migrations with the same version number: %d."; +$lang['migration_class_doesnt_exist'] = "The migration class \"%s\" could not be found."; +$lang['migration_missing_up_method'] = "The migration class \"%s\" is missing an 'up' method."; +$lang['migration_missing_down_method'] = "The migration class \"%s\" is missing an 'down' method."; +$lang['migration_invalid_filename'] = "Migration \"%s\" has an invalid filename."; + + +/* End of file migration_lang.php */ +/* Location: ./system/language/english/migration_lang.php */ \ No newline at end of file diff --git a/system/language/english/number_lang.php b/system/language/english/number_lang.php new file mode 100644 index 0000000..9085809 --- /dev/null +++ b/system/language/english/number_lang.php @@ -0,0 +1,10 @@ +<?php + +$lang['terabyte_abbr'] = "TB"; +$lang['gigabyte_abbr'] = "GB"; +$lang['megabyte_abbr'] = "MB"; +$lang['kilobyte_abbr'] = "KB"; +$lang['bytes'] = "Bytes"; + +/* End of file number_lang.php */ +/* Location: ./system/language/english/number_lang.php */ \ No newline at end of file diff --git a/system/language/english/profiler_lang.php b/system/language/english/profiler_lang.php new file mode 100644 index 0000000..1111158 --- /dev/null +++ b/system/language/english/profiler_lang.php @@ -0,0 +1,25 @@ +<?php + +$lang['profiler_database'] = 'DATABASE'; +$lang['profiler_controller_info'] = 'CLASS/METHOD'; +$lang['profiler_benchmarks'] = 'BENCHMARKS'; +$lang['profiler_queries'] = 'QUERIES'; +$lang['profiler_get_data'] = 'GET DATA'; +$lang['profiler_post_data'] = 'POST DATA'; +$lang['profiler_uri_string'] = 'URI STRING'; +$lang['profiler_memory_usage'] = 'MEMORY USAGE'; +$lang['profiler_config'] = 'CONFIG VARIABLES'; +$lang['profiler_session_data'] = 'SESSION DATA'; +$lang['profiler_headers'] = 'HTTP HEADERS'; +$lang['profiler_no_db'] = 'Database driver is not currently loaded'; +$lang['profiler_no_queries'] = 'No queries were run'; +$lang['profiler_no_post'] = 'No POST data exists'; +$lang['profiler_no_get'] = 'No GET data exists'; +$lang['profiler_no_uri'] = 'No URI data exists'; +$lang['profiler_no_memory'] = 'Memory Usage Unavailable'; +$lang['profiler_no_profiles'] = 'No Profile data - all Profiler sections have been disabled.'; +$lang['profiler_section_hide'] = 'Hide'; +$lang['profiler_section_show'] = 'Show'; + +/* End of file profiler_lang.php */ +/* Location: ./system/language/english/profiler_lang.php */ \ No newline at end of file diff --git a/system/language/english/unit_test_lang.php b/system/language/english/unit_test_lang.php new file mode 100644 index 0000000..070bcd1 --- /dev/null +++ b/system/language/english/unit_test_lang.php @@ -0,0 +1,25 @@ +<?php + +$lang['ut_test_name'] = 'Test Name'; +$lang['ut_test_datatype'] = 'Test Datatype'; +$lang['ut_res_datatype'] = 'Expected Datatype'; +$lang['ut_result'] = 'Result'; +$lang['ut_undefined'] = 'Undefined Test Name'; +$lang['ut_file'] = 'File Name'; +$lang['ut_line'] = 'Line Number'; +$lang['ut_passed'] = 'Passed'; +$lang['ut_failed'] = 'Failed'; +$lang['ut_boolean'] = 'Boolean'; +$lang['ut_integer'] = 'Integer'; +$lang['ut_float'] = 'Float'; +$lang['ut_double'] = 'Float'; // can be the same as float +$lang['ut_string'] = 'String'; +$lang['ut_array'] = 'Array'; +$lang['ut_object'] = 'Object'; +$lang['ut_resource'] = 'Resource'; +$lang['ut_null'] = 'Null'; +$lang['ut_notes'] = 'Notes'; + + +/* End of file unit_test_lang.php */ +/* Location: ./system/language/english/unit_test_lang.php */ \ No newline at end of file diff --git a/system/language/english/upload_lang.php b/system/language/english/upload_lang.php new file mode 100644 index 0000000..4de9e9e --- /dev/null +++ b/system/language/english/upload_lang.php @@ -0,0 +1,22 @@ +<?php + +$lang['upload_userfile_not_set'] = "Unable to find a post variable called userfile."; +$lang['upload_file_exceeds_limit'] = "The uploaded file exceeds the maximum allowed size in your PHP configuration file."; +$lang['upload_file_exceeds_form_limit'] = "The uploaded file exceeds the maximum size allowed by the submission form."; +$lang['upload_file_partial'] = "The file was only partially uploaded."; +$lang['upload_no_temp_directory'] = "The temporary folder is missing."; +$lang['upload_unable_to_write_file'] = "The file could not be written to disk."; +$lang['upload_stopped_by_extension'] = "The file upload was stopped by extension."; +$lang['upload_no_file_selected'] = "You did not select a file to upload."; +$lang['upload_invalid_filetype'] = "The filetype you are attempting to upload is not allowed."; +$lang['upload_invalid_filesize'] = "The file you are attempting to upload is larger than the permitted size."; +$lang['upload_invalid_dimensions'] = "The image you are attempting to upload exceedes the maximum height or width."; +$lang['upload_destination_error'] = "A problem was encountered while attempting to move the uploaded file to the final destination."; +$lang['upload_no_filepath'] = "The upload path does not appear to be valid."; +$lang['upload_no_file_types'] = "You have not specified any allowed file types."; +$lang['upload_bad_filename'] = "The file name you submitted already exists on the server."; +$lang['upload_not_writable'] = "The upload destination folder does not appear to be writable."; + + +/* End of file upload_lang.php */ +/* Location: ./system/language/english/upload_lang.php */ \ No newline at end of file diff --git a/system/language/index.html b/system/language/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/system/language/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/system/libraries/Cache/Cache.php b/system/libraries/Cache/Cache.php new file mode 100644 index 0000000..b1453e7 --- /dev/null +++ b/system/libraries/Cache/Cache.php @@ -0,0 +1,216 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2006 - 2014 EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 2.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Caching Class + * + * @package CodeIgniter + * @subpackage Libraries + * @category Core + * @author EllisLab Dev Team + * @link + */ +class CI_Cache extends CI_Driver_Library { + + protected $valid_drivers = array( + 'cache_apc', 'cache_file', 'cache_memcached', 'cache_dummy' + ); + + protected $_cache_path = NULL; // Path of cache files (if file-based cache) + protected $_adapter = 'dummy'; + protected $_backup_driver; + + // ------------------------------------------------------------------------ + + /** + * Constructor + * + * @param array + */ + public function __construct($config = array()) + { + if ( ! empty($config)) + { + $this->_initialize($config); + } + } + + // ------------------------------------------------------------------------ + + /** + * Get + * + * Look for a value in the cache. If it exists, return the data + * if not, return FALSE + * + * @param string + * @return mixed value that is stored/FALSE on failure + */ + public function get($id) + { + return $this->{$this->_adapter}->get($id); + } + + // ------------------------------------------------------------------------ + + /** + * Cache Save + * + * @param string Unique Key + * @param mixed Data to store + * @param int Length of time (in seconds) to cache the data + * + * @return boolean true on success/false on failure + */ + public function save($id, $data, $ttl = 60) + { + return $this->{$this->_adapter}->save($id, $data, $ttl); + } + + // ------------------------------------------------------------------------ + + /** + * Delete from Cache + * + * @param mixed unique identifier of the item in the cache + * @return boolean true on success/false on failure + */ + public function delete($id) + { + return $this->{$this->_adapter}->delete($id); + } + + // ------------------------------------------------------------------------ + + /** + * Clean the cache + * + * @return boolean false on failure/true on success + */ + public function clean() + { + return $this->{$this->_adapter}->clean(); + } + + // ------------------------------------------------------------------------ + + /** + * Cache Info + * + * @param string user/filehits + * @return mixed array on success, false on failure + */ + public function cache_info($type = 'user') + { + return $this->{$this->_adapter}->cache_info($type); + } + + // ------------------------------------------------------------------------ + + /** + * Get Cache Metadata + * + * @param mixed key to get cache metadata on + * @return mixed return value from child method + */ + public function get_metadata($id) + { + return $this->{$this->_adapter}->get_metadata($id); + } + + // ------------------------------------------------------------------------ + + /** + * Initialize + * + * Initialize class properties based on the configuration array. + * + * @param array + * @return void + */ + private function _initialize($config) + { + $default_config = array( + 'adapter', + 'memcached' + ); + + foreach ($default_config as $key) + { + if (isset($config[$key])) + { + $param = '_'.$key; + + $this->{$param} = $config[$key]; + } + } + + if (isset($config['backup'])) + { + if (in_array('cache_'.$config['backup'], $this->valid_drivers)) + { + $this->_backup_driver = $config['backup']; + } + } + } + + // ------------------------------------------------------------------------ + + /** + * Is the requested driver supported in this environment? + * + * @param string The driver to test. + * @return array + */ + public function is_supported($driver) + { + static $support = array(); + + if ( ! isset($support[$driver])) + { + $support[$driver] = $this->{$driver}->is_supported(); + } + + return $support[$driver]; + } + + // ------------------------------------------------------------------------ + + /** + * __get() + * + * @param child + * @return object + */ + public function __get($child) + { + $obj = parent::__get($child); + + if ( ! $this->is_supported($child)) + { + $this->_adapter = $this->_backup_driver; + $obj = parent::__get($this->_adapter); + } + + return $obj; + } + +} + +/* End of file Cache.php */ +/* Location: ./system/libraries/Cache/Cache.php */ diff --git a/system/libraries/Cache/drivers/Cache_apc.php b/system/libraries/Cache/drivers/Cache_apc.php new file mode 100644 index 0000000..5fe717f --- /dev/null +++ b/system/libraries/Cache/drivers/Cache_apc.php @@ -0,0 +1,147 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2006 - 2014 EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 2.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter APC Caching Class + * + * @package CodeIgniter + * @subpackage Libraries + * @category Core + * @author EllisLab Dev Team + * @link + */ +class CI_Cache_apc extends CI_Driver { + + /** + * Get + * + * Look for a value in the cache. If it exists, return the data + * if not, return FALSE + * + * @param string + * @return mixed value that is stored/FALSE on failure + */ + public function get($id) + { + $data = apc_fetch($id); + + return (is_array($data)) ? $data[0] : FALSE; + } + + // ------------------------------------------------------------------------ + + /** + * Cache Save + * + * @param string Unique Key + * @param mixed Data to store + * @param int Length of time (in seconds) to cache the data + * + * @return boolean true on success/false on failure + */ + public function save($id, $data, $ttl = 60) + { + return apc_store($id, array($data, time(), $ttl), $ttl); + } + + // ------------------------------------------------------------------------ + + /** + * Delete from Cache + * + * @param mixed unique identifier of the item in the cache + * @param boolean true on success/false on failure + */ + public function delete($id) + { + return apc_delete($id); + } + + // ------------------------------------------------------------------------ + + /** + * Clean the cache + * + * @return boolean false on failure/true on success + */ + public function clean() + { + return apc_clear_cache('user'); + } + + // ------------------------------------------------------------------------ + + /** + * Cache Info + * + * @param string user/filehits + * @return mixed array on success, false on failure + */ + public function cache_info($type = NULL) + { + return apc_cache_info($type); + } + + // ------------------------------------------------------------------------ + + /** + * Get Cache Metadata + * + * @param mixed key to get cache metadata on + * @return mixed array on success/false on failure + */ + public function get_metadata($id) + { + $stored = apc_fetch($id); + + if (count($stored) !== 3) + { + return FALSE; + } + + list($data, $time, $ttl) = $stored; + + return array( + 'expire' => $time + $ttl, + 'mtime' => $time, + 'data' => $data + ); + } + + // ------------------------------------------------------------------------ + + /** + * is_supported() + * + * Check to see if APC is available on this system, bail if it isn't. + */ + public function is_supported() + { + if ( ! extension_loaded('apc') OR ini_get('apc.enabled') != "1") + { + log_message('error', 'The APC PHP extension must be loaded to use APC Cache.'); + return FALSE; + } + + return TRUE; + } + +} + +/* End of file Cache_apc.php */ +/* Location: ./system/libraries/Cache/drivers/Cache_apc.php */ \ No newline at end of file diff --git a/system/libraries/Cache/drivers/Cache_dummy.php b/system/libraries/Cache/drivers/Cache_dummy.php new file mode 100644 index 0000000..2546253 --- /dev/null +++ b/system/libraries/Cache/drivers/Cache_dummy.php @@ -0,0 +1,126 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2006 - 2014 EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 2.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Dummy Caching Class + * + * @package CodeIgniter + * @subpackage Libraries + * @category Core + * @author EllisLab Dev Team + * @link + */ +class CI_Cache_dummy extends CI_Driver { + + /** + * Get + * + * Since this is the dummy class, it's always going to return FALSE. + * + * @param string + * @return Boolean FALSE + */ + public function get($id) + { + return FALSE; + } + + // ------------------------------------------------------------------------ + + /** + * Cache Save + * + * @param string Unique Key + * @param mixed Data to store + * @param int Length of time (in seconds) to cache the data + * + * @return boolean TRUE, Simulating success + */ + public function save($id, $data, $ttl = 60) + { + return TRUE; + } + + // ------------------------------------------------------------------------ + + /** + * Delete from Cache + * + * @param mixed unique identifier of the item in the cache + * @param boolean TRUE, simulating success + */ + public function delete($id) + { + return TRUE; + } + + // ------------------------------------------------------------------------ + + /** + * Clean the cache + * + * @return boolean TRUE, simulating success + */ + public function clean() + { + return TRUE; + } + + // ------------------------------------------------------------------------ + + /** + * Cache Info + * + * @param string user/filehits + * @return boolean FALSE + */ + public function cache_info($type = NULL) + { + return FALSE; + } + + // ------------------------------------------------------------------------ + + /** + * Get Cache Metadata + * + * @param mixed key to get cache metadata on + * @return boolean FALSE + */ + public function get_metadata($id) + { + return FALSE; + } + + // ------------------------------------------------------------------------ + + /** + * Is this caching driver supported on the system? + * Of course this one is. + * + * @return TRUE; + */ + public function is_supported() + { + return TRUE; + } + +} + +/* End of file Cache_dummy.php */ +/* Location: ./system/libraries/Cache/drivers/Cache_dummy.php */ \ No newline at end of file diff --git a/system/libraries/Cache/drivers/Cache_file.php b/system/libraries/Cache/drivers/Cache_file.php new file mode 100644 index 0000000..2fe8f38 --- /dev/null +++ b/system/libraries/Cache/drivers/Cache_file.php @@ -0,0 +1,193 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2006 - 2014 EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 2.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Memcached Caching Class + * + * @package CodeIgniter + * @subpackage Libraries + * @category Core + * @author EllisLab Dev Team + * @link + */ +class CI_Cache_file extends CI_Driver { + + protected $_cache_path; + + /** + * Constructor + */ + public function __construct() + { + $CI =& get_instance(); + $CI->load->helper('file'); + + $path = $CI->config->item('cache_path'); + + $this->_cache_path = ($path == '') ? APPPATH.'cache/' : $path; + } + + // ------------------------------------------------------------------------ + + /** + * Fetch from cache + * + * @param mixed unique key id + * @return mixed data on success/false on failure + */ + public function get($id) + { + if ( ! file_exists($this->_cache_path.$id)) + { + return FALSE; + } + + $data = read_file($this->_cache_path.$id); + $data = unserialize($data); + + if (time() > $data['time'] + $data['ttl']) + { + unlink($this->_cache_path.$id); + return FALSE; + } + + return $data['data']; + } + + // ------------------------------------------------------------------------ + + /** + * Save into cache + * + * @param string unique key + * @param mixed data to store + * @param int length of time (in seconds) the cache is valid + * - Default is 60 seconds + * @return boolean true on success/false on failure + */ + public function save($id, $data, $ttl = 60) + { + $contents = array( + 'time' => time(), + 'ttl' => $ttl, + 'data' => $data + ); + + if (write_file($this->_cache_path.$id, serialize($contents))) + { + @chmod($this->_cache_path.$id, 0777); + return TRUE; + } + + return FALSE; + } + + // ------------------------------------------------------------------------ + + /** + * Delete from Cache + * + * @param mixed unique identifier of item in cache + * @return boolean true on success/false on failure + */ + public function delete($id) + { + return unlink($this->_cache_path.$id); + } + + // ------------------------------------------------------------------------ + + /** + * Clean the Cache + * + * @return boolean false on failure/true on success + */ + public function clean() + { + return delete_files($this->_cache_path); + } + + // ------------------------------------------------------------------------ + + /** + * Cache Info + * + * Not supported by file-based caching + * + * @param string user/filehits + * @return mixed FALSE + */ + public function cache_info($type = NULL) + { + return get_dir_file_info($this->_cache_path); + } + + // ------------------------------------------------------------------------ + + /** + * Get Cache Metadata + * + * @param mixed key to get cache metadata on + * @return mixed FALSE on failure, array on success. + */ + public function get_metadata($id) + { + if ( ! file_exists($this->_cache_path.$id)) + { + return FALSE; + } + + $data = read_file($this->_cache_path.$id); + $data = unserialize($data); + + if (is_array($data)) + { + $mtime = filemtime($this->_cache_path.$id); + + if ( ! isset($data['ttl'])) + { + return FALSE; + } + + return array( + 'expire' => $mtime + $data['ttl'], + 'mtime' => $mtime + ); + } + + return FALSE; + } + + // ------------------------------------------------------------------------ + + /** + * Is supported + * + * In the file driver, check to see that the cache directory is indeed writable + * + * @return boolean + */ + public function is_supported() + { + return is_really_writable($this->_cache_path); + } + +} + +/* End of file Cache_file.php */ +/* Location: ./system/libraries/Cache/drivers/Cache_file.php */ \ No newline at end of file diff --git a/system/libraries/Cache/drivers/Cache_memcached.php b/system/libraries/Cache/drivers/Cache_memcached.php new file mode 100644 index 0000000..cf6242c --- /dev/null +++ b/system/libraries/Cache/drivers/Cache_memcached.php @@ -0,0 +1,214 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2006 - 2014 EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 2.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Memcached Caching Class + * + * @package CodeIgniter + * @subpackage Libraries + * @category Core + * @author EllisLab Dev Team + * @link + */ +class CI_Cache_memcached extends CI_Driver { + + private $_memcached; // Holds the memcached object + + protected $_memcache_conf = array( + 'default' => array( + 'default_host' => '127.0.0.1', + 'default_port' => 11211, + 'default_weight' => 1 + ) + ); + + // ------------------------------------------------------------------------ + + /** + * Fetch from cache + * + * @param mixed unique key id + * @return mixed data on success/false on failure + */ + public function get($id) + { + $data = $this->_memcached->get($id); + + return (is_array($data)) ? $data[0] : FALSE; + } + + // ------------------------------------------------------------------------ + + /** + * Save + * + * @param string unique identifier + * @param mixed data being cached + * @param int time to live + * @return boolean true on success, false on failure + */ + public function save($id, $data, $ttl = 60) + { + if (get_class($this->_memcached) == 'Memcached') + { + return $this->_memcached->set($id, array($data, time(), $ttl), $ttl); + } + else if (get_class($this->_memcached) == 'Memcache') + { + return $this->_memcached->set($id, array($data, time(), $ttl), 0, $ttl); + } + + return FALSE; + } + + // ------------------------------------------------------------------------ + + /** + * Delete from Cache + * + * @param mixed key to be deleted. + * @return boolean true on success, false on failure + */ + public function delete($id) + { + return $this->_memcached->delete($id); + } + + // ------------------------------------------------------------------------ + + /** + * Clean the Cache + * + * @return boolean false on failure/true on success + */ + public function clean() + { + return $this->_memcached->flush(); + } + + // ------------------------------------------------------------------------ + + /** + * Cache Info + * + * @param null type not supported in memcached + * @return mixed array on success, false on failure + */ + public function cache_info($type = NULL) + { + return $this->_memcached->getStats(); + } + + // ------------------------------------------------------------------------ + + /** + * Get Cache Metadata + * + * @param mixed key to get cache metadata on + * @return mixed FALSE on failure, array on success. + */ + public function get_metadata($id) + { + $stored = $this->_memcached->get($id); + + if (count($stored) !== 3) + { + return FALSE; + } + + list($data, $time, $ttl) = $stored; + + return array( + 'expire' => $time + $ttl, + 'mtime' => $time, + 'data' => $data + ); + } + + // ------------------------------------------------------------------------ + + /** + * Setup memcached. + */ + private function _setup_memcached() + { + // Try to load memcached server info from the config file. + $CI =& get_instance(); + if ($CI->config->load('memcached', TRUE, TRUE)) + { + if (is_array($CI->config->config['memcached'])) + { + $this->_memcache_conf = NULL; + + foreach ($CI->config->config['memcached'] as $name => $conf) + { + $this->_memcache_conf[$name] = $conf; + } + } + } + + $this->_memcached = new Memcached(); + + foreach ($this->_memcache_conf as $name => $cache_server) + { + if ( ! array_key_exists('hostname', $cache_server)) + { + $cache_server['hostname'] = $this->_default_options['default_host']; + } + + if ( ! array_key_exists('port', $cache_server)) + { + $cache_server['port'] = $this->_default_options['default_port']; + } + + if ( ! array_key_exists('weight', $cache_server)) + { + $cache_server['weight'] = $this->_default_options['default_weight']; + } + + $this->_memcached->addServer( + $cache_server['hostname'], $cache_server['port'], $cache_server['weight'] + ); + } + } + + // ------------------------------------------------------------------------ + + + /** + * Is supported + * + * Returns FALSE if memcached is not supported on the system. + * If it is, we setup the memcached object & return TRUE + */ + public function is_supported() + { + if ( ! extension_loaded('memcached')) + { + log_message('error', 'The Memcached Extension must be loaded to use Memcached Cache.'); + return FALSE; + } + + $this->_setup_memcached(); + return TRUE; + } + +} + +/* End of file Cache_memcached.php */ +/* Location: ./system/libraries/Cache/drivers/Cache_memcached.php */ \ No newline at end of file diff --git a/system/libraries/Cache/drivers/index.html b/system/libraries/Cache/drivers/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/system/libraries/Cache/drivers/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/system/libraries/Cache/index.html b/system/libraries/Cache/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/system/libraries/Cache/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/system/libraries/Calendar.php b/system/libraries/Calendar.php new file mode 100644 index 0000000..6c7af07 --- /dev/null +++ b/system/libraries/Calendar.php @@ -0,0 +1,476 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Calendar Class + * + * This class enables the creation of calendars + * + * @package CodeIgniter + * @subpackage Libraries + * @category Libraries + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/calendar.html + */ +class CI_Calendar { + + var $CI; + var $lang; + var $local_time; + var $template = ''; + var $start_day = 'sunday'; + var $month_type = 'long'; + var $day_type = 'abr'; + var $show_next_prev = FALSE; + var $next_prev_url = ''; + + /** + * Constructor + * + * Loads the calendar language file and sets the default time reference + */ + public function __construct($config = array()) + { + $this->CI =& get_instance(); + + if ( ! in_array('calendar_lang.php', $this->CI->lang->is_loaded, TRUE)) + { + $this->CI->lang->load('calendar'); + } + + $this->local_time = time(); + + if (count($config) > 0) + { + $this->initialize($config); + } + + log_message('debug', "Calendar Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * Initialize the user preferences + * + * Accepts an associative array as input, containing display preferences + * + * @access public + * @param array config preferences + * @return void + */ + function initialize($config = array()) + { + foreach ($config as $key => $val) + { + if (isset($this->$key)) + { + $this->$key = $val; + } + } + } + + // -------------------------------------------------------------------- + + /** + * Generate the calendar + * + * @access public + * @param integer the year + * @param integer the month + * @param array the data to be shown in the calendar cells + * @return string + */ + function generate($year = '', $month = '', $data = array()) + { + // Set and validate the supplied month/year + if ($year == '') + $year = date("Y", $this->local_time); + + if ($month == '') + $month = date("m", $this->local_time); + + if (strlen($year) == 1) + $year = '200'.$year; + + if (strlen($year) == 2) + $year = '20'.$year; + + if (strlen($month) == 1) + $month = '0'.$month; + + $adjusted_date = $this->adjust_date($month, $year); + + $month = $adjusted_date['month']; + $year = $adjusted_date['year']; + + // Determine the total days in the month + $total_days = $this->get_total_days($month, $year); + + // Set the starting day of the week + $start_days = array('sunday' => 0, 'monday' => 1, 'tuesday' => 2, 'wednesday' => 3, 'thursday' => 4, 'friday' => 5, 'saturday' => 6); + $start_day = ( ! isset($start_days[$this->start_day])) ? 0 : $start_days[$this->start_day]; + + // Set the starting day number + $local_date = mktime(12, 0, 0, $month, 1, $year); + $date = getdate($local_date); + $day = $start_day + 1 - $date["wday"]; + + while ($day > 1) + { + $day -= 7; + } + + // Set the current month/year/day + // We use this to determine the "today" date + $cur_year = date("Y", $this->local_time); + $cur_month = date("m", $this->local_time); + $cur_day = date("j", $this->local_time); + + $is_current_month = ($cur_year == $year AND $cur_month == $month) ? TRUE : FALSE; + + // Generate the template data array + $this->parse_template(); + + // Begin building the calendar output + $out = $this->temp['table_open']; + $out .= "\n"; + + $out .= "\n"; + $out .= $this->temp['heading_row_start']; + $out .= "\n"; + + // "previous" month link + if ($this->show_next_prev == TRUE) + { + // Add a trailing slash to the URL if needed + $this->next_prev_url = preg_replace("/(.+?)\/*$/", "\\1/", $this->next_prev_url); + + $adjusted_date = $this->adjust_date($month - 1, $year); + $out .= str_replace('{previous_url}', $this->next_prev_url.$adjusted_date['year'].'/'.$adjusted_date['month'], $this->temp['heading_previous_cell']); + $out .= "\n"; + } + + // Heading containing the month/year + $colspan = ($this->show_next_prev == TRUE) ? 5 : 7; + + $this->temp['heading_title_cell'] = str_replace('{colspan}', $colspan, $this->temp['heading_title_cell']); + $this->temp['heading_title_cell'] = str_replace('{heading}', $this->get_month_name($month)."&nbsp;".$year, $this->temp['heading_title_cell']); + + $out .= $this->temp['heading_title_cell']; + $out .= "\n"; + + // "next" month link + if ($this->show_next_prev == TRUE) + { + $adjusted_date = $this->adjust_date($month + 1, $year); + $out .= str_replace('{next_url}', $this->next_prev_url.$adjusted_date['year'].'/'.$adjusted_date['month'], $this->temp['heading_next_cell']); + } + + $out .= "\n"; + $out .= $this->temp['heading_row_end']; + $out .= "\n"; + + // Write the cells containing the days of the week + $out .= "\n"; + $out .= $this->temp['week_row_start']; + $out .= "\n"; + + $day_names = $this->get_day_names(); + + for ($i = 0; $i < 7; $i ++) + { + $out .= str_replace('{week_day}', $day_names[($start_day + $i) %7], $this->temp['week_day_cell']); + } + + $out .= "\n"; + $out .= $this->temp['week_row_end']; + $out .= "\n"; + + // Build the main body of the calendar + while ($day <= $total_days) + { + $out .= "\n"; + $out .= $this->temp['cal_row_start']; + $out .= "\n"; + + for ($i = 0; $i < 7; $i++) + { + $out .= ($is_current_month == TRUE AND $day == $cur_day) ? $this->temp['cal_cell_start_today'] : $this->temp['cal_cell_start']; + + if ($day > 0 AND $day <= $total_days) + { + if (isset($data[$day])) + { + // Cells with content + $temp = ($is_current_month == TRUE AND $day == $cur_day) ? $this->temp['cal_cell_content_today'] : $this->temp['cal_cell_content']; + $out .= str_replace('{day}', $day, str_replace('{content}', $data[$day], $temp)); + } + else + { + // Cells with no content + $temp = ($is_current_month == TRUE AND $day == $cur_day) ? $this->temp['cal_cell_no_content_today'] : $this->temp['cal_cell_no_content']; + $out .= str_replace('{day}', $day, $temp); + } + } + else + { + // Blank cells + $out .= $this->temp['cal_cell_blank']; + } + + $out .= ($is_current_month == TRUE AND $day == $cur_day) ? $this->temp['cal_cell_end_today'] : $this->temp['cal_cell_end']; + $day++; + } + + $out .= "\n"; + $out .= $this->temp['cal_row_end']; + $out .= "\n"; + } + + $out .= "\n"; + $out .= $this->temp['table_close']; + + return $out; + } + + // -------------------------------------------------------------------- + + /** + * Get Month Name + * + * Generates a textual month name based on the numeric + * month provided. + * + * @access public + * @param integer the month + * @return string + */ + function get_month_name($month) + { + if ($this->month_type == 'short') + { + $month_names = array('01' => 'cal_jan', '02' => 'cal_feb', '03' => 'cal_mar', '04' => 'cal_apr', '05' => 'cal_may', '06' => 'cal_jun', '07' => 'cal_jul', '08' => 'cal_aug', '09' => 'cal_sep', '10' => 'cal_oct', '11' => 'cal_nov', '12' => 'cal_dec'); + } + else + { + $month_names = array('01' => 'cal_january', '02' => 'cal_february', '03' => 'cal_march', '04' => 'cal_april', '05' => 'cal_mayl', '06' => 'cal_june', '07' => 'cal_july', '08' => 'cal_august', '09' => 'cal_september', '10' => 'cal_october', '11' => 'cal_november', '12' => 'cal_december'); + } + + $month = $month_names[$month]; + + if ($this->CI->lang->line($month) === FALSE) + { + return ucfirst(str_replace('cal_', '', $month)); + } + + return $this->CI->lang->line($month); + } + + // -------------------------------------------------------------------- + + /** + * Get Day Names + * + * Returns an array of day names (Sunday, Monday, etc.) based + * on the type. Options: long, short, abrev + * + * @access public + * @param string + * @return array + */ + function get_day_names($day_type = '') + { + if ($day_type != '') + $this->day_type = $day_type; + + if ($this->day_type == 'long') + { + $day_names = array('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'); + } + elseif ($this->day_type == 'short') + { + $day_names = array('sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'); + } + else + { + $day_names = array('su', 'mo', 'tu', 'we', 'th', 'fr', 'sa'); + } + + $days = array(); + foreach ($day_names as $val) + { + $days[] = ($this->CI->lang->line('cal_'.$val) === FALSE) ? ucfirst($val) : $this->CI->lang->line('cal_'.$val); + } + + return $days; + } + + // -------------------------------------------------------------------- + + /** + * Adjust Date + * + * This function makes sure that we have a valid month/year. + * For example, if you submit 13 as the month, the year will + * increment and the month will become January. + * + * @access public + * @param integer the month + * @param integer the year + * @return array + */ + function adjust_date($month, $year) + { + $date = array(); + + $date['month'] = $month; + $date['year'] = $year; + + while ($date['month'] > 12) + { + $date['month'] -= 12; + $date['year']++; + } + + while ($date['month'] <= 0) + { + $date['month'] += 12; + $date['year']--; + } + + if (strlen($date['month']) == 1) + { + $date['month'] = '0'.$date['month']; + } + + return $date; + } + + // -------------------------------------------------------------------- + + /** + * Total days in a given month + * + * @access public + * @param integer the month + * @param integer the year + * @return integer + */ + function get_total_days($month, $year) + { + $days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); + + if ($month < 1 OR $month > 12) + { + return 0; + } + + // Is the year a leap year? + if ($month == 2) + { + if ($year % 400 == 0 OR ($year % 4 == 0 AND $year % 100 != 0)) + { + return 29; + } + } + + return $days_in_month[$month - 1]; + } + + // -------------------------------------------------------------------- + + /** + * Set Default Template Data + * + * This is used in the event that the user has not created their own template + * + * @access public + * @return array + */ + function default_template() + { + return array ( + 'table_open' => '<table border="0" cellpadding="4" cellspacing="0">', + 'heading_row_start' => '<tr>', + 'heading_previous_cell' => '<th><a href="{previous_url}">&lt;&lt;</a></th>', + 'heading_title_cell' => '<th colspan="{colspan}">{heading}</th>', + 'heading_next_cell' => '<th><a href="{next_url}">&gt;&gt;</a></th>', + 'heading_row_end' => '</tr>', + 'week_row_start' => '<tr>', + 'week_day_cell' => '<td>{week_day}</td>', + 'week_row_end' => '</tr>', + 'cal_row_start' => '<tr>', + 'cal_cell_start' => '<td>', + 'cal_cell_start_today' => '<td>', + 'cal_cell_content' => '<a href="{content}">{day}</a>', + 'cal_cell_content_today' => '<a href="{content}"><strong>{day}</strong></a>', + 'cal_cell_no_content' => '{day}', + 'cal_cell_no_content_today' => '<strong>{day}</strong>', + 'cal_cell_blank' => '&nbsp;', + 'cal_cell_end' => '</td>', + 'cal_cell_end_today' => '</td>', + 'cal_row_end' => '</tr>', + 'table_close' => '</table>' + ); + } + + // -------------------------------------------------------------------- + + /** + * Parse Template + * + * Harvests the data within the template {pseudo-variables} + * used to display the calendar + * + * @access public + * @return void + */ + function parse_template() + { + $this->temp = $this->default_template(); + + if ($this->template == '') + { + return; + } + + $today = array('cal_cell_start_today', 'cal_cell_content_today', 'cal_cell_no_content_today', 'cal_cell_end_today'); + + foreach (array('table_open', 'table_close', 'heading_row_start', 'heading_previous_cell', 'heading_title_cell', 'heading_next_cell', 'heading_row_end', 'week_row_start', 'week_day_cell', 'week_row_end', 'cal_row_start', 'cal_cell_start', 'cal_cell_content', 'cal_cell_no_content', 'cal_cell_blank', 'cal_cell_end', 'cal_row_end', 'cal_cell_start_today', 'cal_cell_content_today', 'cal_cell_no_content_today', 'cal_cell_end_today') as $val) + { + if (preg_match("/\{".$val."\}(.*?)\{\/".$val."\}/si", $this->template, $match)) + { + $this->temp[$val] = $match['1']; + } + else + { + if (in_array($val, $today, TRUE)) + { + $this->temp[$val] = $this->temp[str_replace('_today', '', $val)]; + } + } + } + } + +} + +// END CI_Calendar class + +/* End of file Calendar.php */ +/* Location: ./system/libraries/Calendar.php */ \ No newline at end of file diff --git a/system/libraries/Cart.php b/system/libraries/Cart.php new file mode 100644 index 0000000..33c067f --- /dev/null +++ b/system/libraries/Cart.php @@ -0,0 +1,552 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2006 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Shopping Cart Class + * + * @package CodeIgniter + * @subpackage Libraries + * @category Shopping Cart + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/cart.html + */ +class CI_Cart { + + // These are the regular expression rules that we use to validate the product ID and product name + var $product_id_rules = '\.a-z0-9_-'; // alpha-numeric, dashes, underscores, or periods + var $product_name_rules = '\.\:\-_ a-z0-9'; // alpha-numeric, dashes, underscores, colons or periods + + // Private variables. Do not change! + var $CI; + var $_cart_contents = array(); + + + /** + * Shopping Class Constructor + * + * The constructor loads the Session class, used to store the shopping cart contents. + */ + public function __construct($params = array()) + { + // Set the super object to a local variable for use later + $this->CI =& get_instance(); + + // Are any config settings being passed manually? If so, set them + $config = array(); + if (count($params) > 0) + { + foreach ($params as $key => $val) + { + $config[$key] = $val; + } + } + + // Load the Sessions class + $this->CI->load->library('session', $config); + + // Grab the shopping cart array from the session table, if it exists + if ($this->CI->session->userdata('cart_contents') !== FALSE) + { + $this->_cart_contents = $this->CI->session->userdata('cart_contents'); + } + else + { + // No cart exists so we'll set some base values + $this->_cart_contents['cart_total'] = 0; + $this->_cart_contents['total_items'] = 0; + } + + log_message('debug', "Cart Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * Insert items into the cart and save it to the session table + * + * @access public + * @param array + * @return bool + */ + function insert($items = array()) + { + // Was any cart data passed? No? Bah... + if ( ! is_array($items) OR count($items) == 0) + { + log_message('error', 'The insert method must be passed an array containing data.'); + return FALSE; + } + + // You can either insert a single product using a one-dimensional array, + // or multiple products using a multi-dimensional one. The way we + // determine the array type is by looking for a required array key named "id" + // at the top level. If it's not found, we will assume it's a multi-dimensional array. + + $save_cart = FALSE; + if (isset($items['id'])) + { + if (($rowid = $this->_insert($items))) + { + $save_cart = TRUE; + } + } + else + { + foreach ($items as $val) + { + if (is_array($val) AND isset($val['id'])) + { + if ($this->_insert($val)) + { + $save_cart = TRUE; + } + } + } + } + + // Save the cart data if the insert was successful + if ($save_cart == TRUE) + { + $this->_save_cart(); + return isset($rowid) ? $rowid : TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Insert + * + * @access private + * @param array + * @return bool + */ + function _insert($items = array()) + { + // Was any cart data passed? No? Bah... + if ( ! is_array($items) OR count($items) == 0) + { + log_message('error', 'The insert method must be passed an array containing data.'); + return FALSE; + } + + // -------------------------------------------------------------------- + + // Does the $items array contain an id, quantity, price, and name? These are required + if ( ! isset($items['id']) OR ! isset($items['qty']) OR ! isset($items['price']) OR ! isset($items['name'])) + { + log_message('error', 'The cart array must contain a product ID, quantity, price, and name.'); + return FALSE; + } + + // -------------------------------------------------------------------- + + // Prep the quantity. It can only be a number. Duh... + $items['qty'] = trim(preg_replace('/([^0-9])/i', '', $items['qty'])); + // Trim any leading zeros + $items['qty'] = trim(preg_replace('/(^[0]+)/i', '', $items['qty'])); + + // If the quantity is zero or blank there's nothing for us to do + if ( ! is_numeric($items['qty']) OR $items['qty'] == 0) + { + return FALSE; + } + + // -------------------------------------------------------------------- + + // Validate the product ID. It can only be alpha-numeric, dashes, underscores or periods + // Not totally sure we should impose this rule, but it seems prudent to standardize IDs. + // Note: These can be user-specified by setting the $this->product_id_rules variable. + if ( ! preg_match("/^[".$this->product_id_rules."]+$/i", $items['id'])) + { + log_message('error', 'Invalid product ID. The product ID can only contain alpha-numeric characters, dashes, and underscores'); + return FALSE; + } + + // -------------------------------------------------------------------- + + // Validate the product name. It can only be alpha-numeric, dashes, underscores, colons or periods. + // Note: These can be user-specified by setting the $this->product_name_rules variable. + if ( ! preg_match("/^[".$this->product_name_rules."]+$/i", $items['name'])) + { + log_message('error', 'An invalid name was submitted as the product name: '.$items['name'].' The name can only contain alpha-numeric characters, dashes, underscores, colons, and spaces'); + return FALSE; + } + + // -------------------------------------------------------------------- + + // Prep the price. Remove anything that isn't a number or decimal point. + $items['price'] = trim(preg_replace('/([^0-9\.])/i', '', $items['price'])); + // Trim any leading zeros + $items['price'] = trim(preg_replace('/(^[0]+)/i', '', $items['price'])); + + // Is the price a valid number? + if ( ! is_numeric($items['price'])) + { + log_message('error', 'An invalid price was submitted for product ID: '.$items['id']); + return FALSE; + } + + // -------------------------------------------------------------------- + + // We now need to create a unique identifier for the item being inserted into the cart. + // Every time something is added to the cart it is stored in the master cart array. + // Each row in the cart array, however, must have a unique index that identifies not only + // a particular product, but makes it possible to store identical products with different options. + // For example, what if someone buys two identical t-shirts (same product ID), but in + // different sizes? The product ID (and other attributes, like the name) will be identical for + // both sizes because it's the same shirt. The only difference will be the size. + // Internally, we need to treat identical submissions, but with different options, as a unique product. + // Our solution is to convert the options array to a string and MD5 it along with the product ID. + // This becomes the unique "row ID" + if (isset($items['options']) AND count($items['options']) > 0) + { + $rowid = md5($items['id'].implode('', $items['options'])); + } + else + { + // No options were submitted so we simply MD5 the product ID. + // Technically, we don't need to MD5 the ID in this case, but it makes + // sense to standardize the format of array indexes for both conditions + $rowid = md5($items['id']); + } + + // -------------------------------------------------------------------- + + // Now that we have our unique "row ID", we'll add our cart items to the master array + + // let's unset this first, just to make sure our index contains only the data from this submission + unset($this->_cart_contents[$rowid]); + + // Create a new index with our new row ID + $this->_cart_contents[$rowid]['rowid'] = $rowid; + + // And add the new items to the cart array + foreach ($items as $key => $val) + { + $this->_cart_contents[$rowid][$key] = $val; + } + + // Woot! + return $rowid; + } + + // -------------------------------------------------------------------- + + /** + * Update the cart + * + * This function permits the quantity of a given item to be changed. + * Typically it is called from the "view cart" page if a user makes + * changes to the quantity before checkout. That array must contain the + * product ID and quantity for each item. + * + * @access public + * @param array + * @param string + * @return bool + */ + function update($items = array()) + { + // Was any cart data passed? + if ( ! is_array($items) OR count($items) == 0) + { + return FALSE; + } + + // You can either update a single product using a one-dimensional array, + // or multiple products using a multi-dimensional one. The way we + // determine the array type is by looking for a required array key named "id". + // If it's not found we assume it's a multi-dimensional array + $save_cart = FALSE; + if (isset($items['rowid']) AND isset($items['qty'])) + { + if ($this->_update($items) == TRUE) + { + $save_cart = TRUE; + } + } + else + { + foreach ($items as $val) + { + if (is_array($val) AND isset($val['rowid']) AND isset($val['qty'])) + { + if ($this->_update($val) == TRUE) + { + $save_cart = TRUE; + } + } + } + } + + // Save the cart data if the insert was successful + if ($save_cart == TRUE) + { + $this->_save_cart(); + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Update the cart + * + * This function permits the quantity of a given item to be changed. + * Typically it is called from the "view cart" page if a user makes + * changes to the quantity before checkout. That array must contain the + * product ID and quantity for each item. + * + * @access private + * @param array + * @return bool + */ + function _update($items = array()) + { + // Without these array indexes there is nothing we can do + if ( ! isset($items['qty']) OR ! isset($items['rowid']) OR ! isset($this->_cart_contents[$items['rowid']])) + { + return FALSE; + } + + // Prep the quantity + $items['qty'] = preg_replace('/([^0-9])/i', '', $items['qty']); + + // Is the quantity a number? + if ( ! is_numeric($items['qty'])) + { + return FALSE; + } + + // Is the new quantity different than what is already saved in the cart? + // If it's the same there's nothing to do + if ($this->_cart_contents[$items['rowid']]['qty'] == $items['qty']) + { + return FALSE; + } + + // Is the quantity zero? If so we will remove the item from the cart. + // If the quantity is greater than zero we are updating + if ($items['qty'] == 0) + { + unset($this->_cart_contents[$items['rowid']]); + } + else + { + $this->_cart_contents[$items['rowid']]['qty'] = $items['qty']; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Save the cart array to the session DB + * + * @access private + * @return bool + */ + function _save_cart() + { + // Unset these so our total can be calculated correctly below + unset($this->_cart_contents['total_items']); + unset($this->_cart_contents['cart_total']); + + // Lets add up the individual prices and set the cart sub-total + $total = 0; + $items = 0; + foreach ($this->_cart_contents as $key => $val) + { + // We make sure the array contains the proper indexes + if ( ! is_array($val) OR ! isset($val['price']) OR ! isset($val['qty'])) + { + continue; + } + + $total += ($val['price'] * $val['qty']); + $items += $val['qty']; + + // Set the subtotal + $this->_cart_contents[$key]['subtotal'] = ($this->_cart_contents[$key]['price'] * $this->_cart_contents[$key]['qty']); + } + + // Set the cart total and total items. + $this->_cart_contents['total_items'] = $items; + $this->_cart_contents['cart_total'] = $total; + + // Is our cart empty? If so we delete it from the session + if (count($this->_cart_contents) <= 2) + { + $this->CI->session->unset_userdata('cart_contents'); + + // Nothing more to do... coffee time! + return FALSE; + } + + // If we made it this far it means that our cart has data. + // Let's pass it to the Session class so it can be stored + $this->CI->session->set_userdata(array('cart_contents' => $this->_cart_contents)); + + // Woot! + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Cart Total + * + * @access public + * @return integer + */ + function total() + { + return $this->_cart_contents['cart_total']; + } + + // -------------------------------------------------------------------- + + /** + * Total Items + * + * Returns the total item count + * + * @access public + * @return integer + */ + function total_items() + { + return $this->_cart_contents['total_items']; + } + + // -------------------------------------------------------------------- + + /** + * Cart Contents + * + * Returns the entire cart array + * + * @access public + * @return array + */ + function contents() + { + $cart = $this->_cart_contents; + + // Remove these so they don't create a problem when showing the cart table + unset($cart['total_items']); + unset($cart['cart_total']); + + return $cart; + } + + // -------------------------------------------------------------------- + + /** + * Has options + * + * Returns TRUE if the rowid passed to this function correlates to an item + * that has options associated with it. + * + * @access public + * @return array + */ + function has_options($rowid = '') + { + if ( ! isset($this->_cart_contents[$rowid]['options']) OR count($this->_cart_contents[$rowid]['options']) === 0) + { + return FALSE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Product options + * + * Returns the an array of options, for a particular product row ID + * + * @access public + * @return array + */ + function product_options($rowid = '') + { + if ( ! isset($this->_cart_contents[$rowid]['options'])) + { + return array(); + } + + return $this->_cart_contents[$rowid]['options']; + } + + // -------------------------------------------------------------------- + + /** + * Format Number + * + * Returns the supplied number with commas and a decimal point. + * + * @access public + * @return integer + */ + function format_number($n = '') + { + if ($n == '') + { + return ''; + } + + // Remove anything that isn't a number or decimal point. + $n = trim(preg_replace('/([^0-9\.])/i', '', $n)); + + return number_format($n, 2, '.', ','); + } + + // -------------------------------------------------------------------- + + /** + * Destroy the cart + * + * Empties the cart and kills the session + * + * @access public + * @return null + */ + function destroy() + { + unset($this->_cart_contents); + + $this->_cart_contents['cart_total'] = 0; + $this->_cart_contents['total_items'] = 0; + + $this->CI->session->unset_userdata('cart_contents'); + } + + +} + +/* End of file Cart.php */ +/* Location: ./system/libraries/Cart.php */ \ No newline at end of file diff --git a/system/libraries/Driver.php b/system/libraries/Driver.php new file mode 100644 index 0000000..086fcb3 --- /dev/null +++ b/system/libraries/Driver.php @@ -0,0 +1,228 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2006 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Driver Library Class + * + * This class enables you to create "Driver" libraries that add runtime ability + * to extend the capabilities of a class via additional driver objects + * + * @package CodeIgniter + * @subpackage Libraries + * @category Libraries + * @author EllisLab Dev Team + * @link + */ +class CI_Driver_Library { + + protected $valid_drivers = array(); + protected $lib_name; + + // The first time a child is used it won't exist, so we instantiate it + // subsequents calls will go straight to the proper child. + function __get($child) + { + if ( ! isset($this->lib_name)) + { + $this->lib_name = get_class($this); + } + + // The class will be prefixed with the parent lib + $child_class = $this->lib_name.'_'.$child; + + // Remove the CI_ prefix and lowercase + $lib_name = ucfirst(strtolower(str_replace('CI_', '', $this->lib_name))); + $driver_name = strtolower(str_replace('CI_', '', $child_class)); + + if (in_array($driver_name, array_map('strtolower', $this->valid_drivers))) + { + // check and see if the driver is in a separate file + if ( ! class_exists($child_class)) + { + // check application path first + foreach (get_instance()->load->get_package_paths(TRUE) as $path) + { + // loves me some nesting! + foreach (array(ucfirst($driver_name), $driver_name) as $class) + { + $filepath = $path.'libraries/'.$lib_name.'/drivers/'.$class.'.php'; + + if (file_exists($filepath)) + { + include_once $filepath; + break; + } + } + } + + // it's a valid driver, but the file simply can't be found + if ( ! class_exists($child_class)) + { + log_message('error', "Unable to load the requested driver: ".$child_class); + show_error("Unable to load the requested driver: ".$child_class); + } + } + + $obj = new $child_class; + $obj->decorate($this); + $this->$child = $obj; + return $this->$child; + } + + // The requested driver isn't valid! + log_message('error', "Invalid driver requested: ".$child_class); + show_error("Invalid driver requested: ".$child_class); + } + + // -------------------------------------------------------------------- + +} +// END CI_Driver_Library CLASS + + +/** + * CodeIgniter Driver Class + * + * This class enables you to create drivers for a Library based on the Driver Library. + * It handles the drivers' access to the parent library + * + * @package CodeIgniter + * @subpackage Libraries + * @category Libraries + * @author EllisLab Dev Team + * @link + */ +class CI_Driver { + protected $parent; + + private $methods = array(); + private $properties = array(); + + private static $reflections = array(); + + /** + * Decorate + * + * Decorates the child with the parent driver lib's methods and properties + * + * @param object + * @return void + */ + public function decorate($parent) + { + $this->parent = $parent; + + // Lock down attributes to what is defined in the class + // and speed up references in magic methods + + $class_name = get_class($parent); + + if ( ! isset(self::$reflections[$class_name])) + { + $r = new ReflectionObject($parent); + + foreach ($r->getMethods() as $method) + { + if ($method->isPublic()) + { + $this->methods[] = $method->getName(); + } + } + + foreach ($r->getProperties() as $prop) + { + if ($prop->isPublic()) + { + $this->properties[] = $prop->getName(); + } + } + + self::$reflections[$class_name] = array($this->methods, $this->properties); + } + else + { + list($this->methods, $this->properties) = self::$reflections[$class_name]; + } + } + + // -------------------------------------------------------------------- + + /** + * __call magic method + * + * Handles access to the parent driver library's methods + * + * @access public + * @param string + * @param array + * @return mixed + */ + public function __call($method, $args = array()) + { + if (in_array($method, $this->methods)) + { + return call_user_func_array(array($this->parent, $method), $args); + } + + $trace = debug_backtrace(); + _exception_handler(E_ERROR, "No such method '{$method}'", $trace[1]['file'], $trace[1]['line']); + exit; + } + + // -------------------------------------------------------------------- + + /** + * __get magic method + * + * Handles reading of the parent driver library's properties + * + * @param string + * @return mixed + */ + public function __get($var) + { + if (in_array($var, $this->properties)) + { + return $this->parent->$var; + } + } + + // -------------------------------------------------------------------- + + /** + * __set magic method + * + * Handles writing to the parent driver library's properties + * + * @param string + * @param array + * @return mixed + */ + public function __set($var, $val) + { + if (in_array($var, $this->properties)) + { + $this->parent->$var = $val; + } + } + +} +// END CI_Driver CLASS + +/* End of file Driver.php */ +/* Location: ./system/libraries/Driver.php */ \ No newline at end of file diff --git a/system/libraries/Email.php b/system/libraries/Email.php new file mode 100644 index 0000000..ca9cd1e --- /dev/null +++ b/system/libraries/Email.php @@ -0,0 +1,2093 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Email Class + * + * Permits email to be sent using Mail, Sendmail, or SMTP. + * + * @package CodeIgniter + * @subpackage Libraries + * @category Libraries + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/email.html + */ +class CI_Email { + + var $useragent = "CodeIgniter"; + var $mailpath = "/usr/sbin/sendmail"; // Sendmail path + var $protocol = "mail"; // mail/sendmail/smtp + var $smtp_host = ""; // SMTP Server. Example: mail.earthlink.net + var $smtp_user = ""; // SMTP Username + var $smtp_pass = ""; // SMTP Password + var $smtp_port = "25"; // SMTP Port + var $smtp_timeout = 5; // SMTP Timeout in seconds + var $smtp_crypto = ""; // SMTP Encryption. Can be null, tls or ssl. + var $wordwrap = TRUE; // TRUE/FALSE Turns word-wrap on/off + var $wrapchars = "76"; // Number of characters to wrap at. + var $mailtype = "text"; // text/html Defines email formatting + var $charset = "utf-8"; // Default char set: iso-8859-1 or us-ascii + var $multipart = "mixed"; // "mixed" (in the body) or "related" (separate) + var $alt_message = ''; // Alternative message for HTML emails + var $validate = FALSE; // TRUE/FALSE. Enables email validation + var $priority = "3"; // Default priority (1 - 5) + var $newline = "\n"; // Default newline. "\r\n" or "\n" (Use "\r\n" to comply with RFC 822) + var $crlf = "\n"; // The RFC 2045 compliant CRLF for quoted-printable is "\r\n". Apparently some servers, + // even on the receiving end think they need to muck with CRLFs, so using "\n", while + // distasteful, is the only thing that seems to work for all environments. + var $send_multipart = TRUE; // TRUE/FALSE - Yahoo does not like multipart alternative, so this is an override. Set to FALSE for Yahoo. + var $bcc_batch_mode = FALSE; // TRUE/FALSE Turns on/off Bcc batch feature + var $bcc_batch_size = 200; // If bcc_batch_mode = TRUE, sets max number of Bccs in each batch + var $_safe_mode = FALSE; + var $_subject = ""; + var $_body = ""; + var $_finalbody = ""; + var $_alt_boundary = ""; + var $_atc_boundary = ""; + var $_header_str = ""; + var $_smtp_connect = ""; + var $_encoding = "8bit"; + var $_IP = FALSE; + var $_smtp_auth = FALSE; + var $_replyto_flag = FALSE; + var $_debug_msg = array(); + var $_recipients = array(); + var $_cc_array = array(); + var $_bcc_array = array(); + var $_headers = array(); + var $_attach_name = array(); + var $_attach_type = array(); + var $_attach_disp = array(); + var $_protocols = array('mail', 'sendmail', 'smtp'); + var $_base_charsets = array('us-ascii', 'iso-2022-'); // 7-bit charsets (excluding language suffix) + var $_bit_depths = array('7bit', '8bit'); + var $_priorities = array('1 (Highest)', '2 (High)', '3 (Normal)', '4 (Low)', '5 (Lowest)'); + + + /** + * Constructor - Sets Email Preferences + * + * The constructor can be passed an array of config values + */ + public function __construct($config = array()) + { + if (count($config) > 0) + { + $this->initialize($config); + } + else + { + $this->_smtp_auth = ($this->smtp_user == '' AND $this->smtp_pass == '') ? FALSE : TRUE; + $this->_safe_mode = ((boolean)@ini_get("safe_mode") === FALSE) ? FALSE : TRUE; + } + + log_message('debug', "Email Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * Initialize preferences + * + * @access public + * @param array + * @return void + */ + public function initialize($config = array()) + { + foreach ($config as $key => $val) + { + if (isset($this->$key)) + { + $method = 'set_'.$key; + + if (method_exists($this, $method)) + { + $this->$method($val); + } + else + { + $this->$key = $val; + } + } + } + $this->clear(); + + $this->_smtp_auth = ($this->smtp_user == '' AND $this->smtp_pass == '') ? FALSE : TRUE; + $this->_safe_mode = ((boolean)@ini_get("safe_mode") === FALSE) ? FALSE : TRUE; + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Initialize the Email Data + * + * @access public + * @return void + */ + public function clear($clear_attachments = FALSE) + { + $this->_subject = ""; + $this->_body = ""; + $this->_finalbody = ""; + $this->_header_str = ""; + $this->_replyto_flag = FALSE; + $this->_recipients = array(); + $this->_cc_array = array(); + $this->_bcc_array = array(); + $this->_headers = array(); + $this->_debug_msg = array(); + + $this->_set_header('User-Agent', $this->useragent); + $this->_set_header('Date', $this->_set_date()); + + if ($clear_attachments !== FALSE) + { + $this->_attach_name = array(); + $this->_attach_type = array(); + $this->_attach_disp = array(); + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set FROM + * + * @access public + * @param string + * @param string + * @return void + */ + public function from($from, $name = '') + { + if (preg_match( '/\<(.*)\>/', $from, $match)) + { + $from = $match['1']; + } + + if ($this->validate) + { + $this->validate_email($this->_str_to_array($from)); + } + + // prepare the display name + if ($name != '') + { + // only use Q encoding if there are characters that would require it + if ( ! preg_match('/[\200-\377]/', $name)) + { + // add slashes for non-printing characters, slashes, and double quotes, and surround it in double quotes + $name = '"'.addcslashes($name, "\0..\37\177'\"\\").'"'; + } + else + { + $name = $this->_prep_q_encoding($name, TRUE); + } + } + + $this->_set_header('From', $name.' <'.$from.'>'); + $this->_set_header('Return-Path', '<'.$from.'>'); + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Reply-to + * + * @access public + * @param string + * @param string + * @return void + */ + public function reply_to($replyto, $name = '') + { + if (preg_match( '/\<(.*)\>/', $replyto, $match)) + { + $replyto = $match['1']; + } + + if ($this->validate) + { + $this->validate_email($this->_str_to_array($replyto)); + } + + if ($name == '') + { + $name = $replyto; + } + + if (strncmp($name, '"', 1) != 0) + { + $name = '"'.$name.'"'; + } + + $this->_set_header('Reply-To', $name.' <'.$replyto.'>'); + $this->_replyto_flag = TRUE; + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Recipients + * + * @access public + * @param string + * @return void + */ + public function to($to) + { + $to = $this->_str_to_array($to); + $to = $this->clean_email($to); + + if ($this->validate) + { + $this->validate_email($to); + } + + if ($this->_get_protocol() != 'mail') + { + $this->_set_header('To', implode(", ", $to)); + } + + switch ($this->_get_protocol()) + { + case 'smtp' : + $this->_recipients = $to; + break; + case 'sendmail' : + case 'mail' : + $this->_recipients = implode(", ", $to); + break; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set CC + * + * @access public + * @param string + * @return void + */ + public function cc($cc) + { + $cc = $this->_str_to_array($cc); + $cc = $this->clean_email($cc); + + if ($this->validate) + { + $this->validate_email($cc); + } + + $this->_set_header('Cc', implode(", ", $cc)); + + if ($this->_get_protocol() == "smtp") + { + $this->_cc_array = $cc; + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set BCC + * + * @access public + * @param string + * @param string + * @return void + */ + public function bcc($bcc, $limit = '') + { + if ($limit != '' && is_numeric($limit)) + { + $this->bcc_batch_mode = TRUE; + $this->bcc_batch_size = $limit; + } + + $bcc = $this->_str_to_array($bcc); + $bcc = $this->clean_email($bcc); + + if ($this->validate) + { + $this->validate_email($bcc); + } + + if (($this->_get_protocol() == "smtp") OR ($this->bcc_batch_mode && count($bcc) > $this->bcc_batch_size)) + { + $this->_bcc_array = $bcc; + } + else + { + $this->_set_header('Bcc', implode(", ", $bcc)); + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Email Subject + * + * @access public + * @param string + * @return void + */ + public function subject($subject) + { + $subject = $this->_prep_q_encoding($subject); + $this->_set_header('Subject', $subject); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Body + * + * @access public + * @param string + * @return void + */ + public function message($body) + { + $this->_body = rtrim(str_replace("\r", "", $body)); + + /* strip slashes only if magic quotes is ON + if we do it with magic quotes OFF, it strips real, user-inputted chars. + + NOTE: In PHP 5.4 get_magic_quotes_gpc() will always return 0 and + it will probably not exist in future versions at all. + */ + if ( ! is_php('5.4') && get_magic_quotes_gpc()) + { + $this->_body = stripslashes($this->_body); + } + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Assign file attachments + * + * @access public + * @param string + * @return void + */ + public function attach($filename, $disposition = 'attachment') + { + $this->_attach_name[] = $filename; + $this->_attach_type[] = $this->_mime_types(pathinfo($filename, PATHINFO_EXTENSION)); + $this->_attach_disp[] = $disposition; // Can also be 'inline' Not sure if it matters + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Add a Header Item + * + * @access protected + * @param string + * @param string + * @return void + */ + protected function _set_header($header, $value) + { + $this->_headers[$header] = $value; + } + + // -------------------------------------------------------------------- + + /** + * Convert a String to an Array + * + * @access protected + * @param string + * @return array + */ + protected function _str_to_array($email) + { + if ( ! is_array($email)) + { + if (strpos($email, ',') !== FALSE) + { + $email = preg_split('/[\s,]/', $email, -1, PREG_SPLIT_NO_EMPTY); + } + else + { + $email = trim($email); + settype($email, "array"); + } + } + return $email; + } + + // -------------------------------------------------------------------- + + /** + * Set Multipart Value + * + * @access public + * @param string + * @return void + */ + public function set_alt_message($str = '') + { + $this->alt_message = $str; + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Mailtype + * + * @access public + * @param string + * @return void + */ + public function set_mailtype($type = 'text') + { + $this->mailtype = ($type == 'html') ? 'html' : 'text'; + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Wordwrap + * + * @access public + * @param string + * @return void + */ + public function set_wordwrap($wordwrap = TRUE) + { + $this->wordwrap = ($wordwrap === FALSE) ? FALSE : TRUE; + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Protocol + * + * @access public + * @param string + * @return void + */ + public function set_protocol($protocol = 'mail') + { + $this->protocol = ( ! in_array($protocol, $this->_protocols, TRUE)) ? 'mail' : strtolower($protocol); + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Priority + * + * @access public + * @param integer + * @return void + */ + public function set_priority($n = 3) + { + if ( ! is_numeric($n)) + { + $this->priority = 3; + return; + } + + if ($n < 1 OR $n > 5) + { + $this->priority = 3; + return; + } + + $this->priority = $n; + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Newline Character + * + * @access public + * @param string + * @return void + */ + public function set_newline($newline = "\n") + { + if ($newline != "\n" AND $newline != "\r\n" AND $newline != "\r") + { + $this->newline = "\n"; + return; + } + + $this->newline = $newline; + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set CRLF + * + * @access public + * @param string + * @return void + */ + public function set_crlf($crlf = "\n") + { + if ($crlf != "\n" AND $crlf != "\r\n" AND $crlf != "\r") + { + $this->crlf = "\n"; + return; + } + + $this->crlf = $crlf; + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Message Boundary + * + * @access protected + * @return void + */ + protected function _set_boundaries() + { + $this->_alt_boundary = "B_ALT_".uniqid(''); // multipart/alternative + $this->_atc_boundary = "B_ATC_".uniqid(''); // attachment boundary + } + + // -------------------------------------------------------------------- + + /** + * Get the Message ID + * + * @access protected + * @return string + */ + protected function _get_message_id() + { + $from = $this->_headers['Return-Path']; + $from = str_replace(">", "", $from); + $from = str_replace("<", "", $from); + + return "<".uniqid('').strstr($from, '@').">"; + } + + // -------------------------------------------------------------------- + + /** + * Get Mail Protocol + * + * @access protected + * @param bool + * @return string + */ + protected function _get_protocol($return = TRUE) + { + $this->protocol = strtolower($this->protocol); + $this->protocol = ( ! in_array($this->protocol, $this->_protocols, TRUE)) ? 'mail' : $this->protocol; + + if ($return == TRUE) + { + return $this->protocol; + } + } + + // -------------------------------------------------------------------- + + /** + * Get Mail Encoding + * + * @access protected + * @param bool + * @return string + */ + protected function _get_encoding($return = TRUE) + { + $this->_encoding = ( ! in_array($this->_encoding, $this->_bit_depths)) ? '8bit' : $this->_encoding; + + foreach ($this->_base_charsets as $charset) + { + if (strncmp($charset, $this->charset, strlen($charset)) == 0) + { + $this->_encoding = '7bit'; + } + } + + if ($return == TRUE) + { + return $this->_encoding; + } + } + + // -------------------------------------------------------------------- + + /** + * Get content type (text/html/attachment) + * + * @access protected + * @return string + */ + protected function _get_content_type() + { + if ($this->mailtype == 'html' && count($this->_attach_name) == 0) + { + return 'html'; + } + elseif ($this->mailtype == 'html' && count($this->_attach_name) > 0) + { + return 'html-attach'; + } + elseif ($this->mailtype == 'text' && count($this->_attach_name) > 0) + { + return 'plain-attach'; + } + else + { + return 'plain'; + } + } + + // -------------------------------------------------------------------- + + /** + * Set RFC 822 Date + * + * @access protected + * @return string + */ + protected function _set_date() + { + $timezone = date("Z"); + $operator = (strncmp($timezone, '-', 1) == 0) ? '-' : '+'; + $timezone = abs($timezone); + $timezone = floor($timezone/3600) * 100 + ($timezone % 3600 ) / 60; + + return sprintf("%s %s%04d", date("D, j M Y H:i:s"), $operator, $timezone); + } + + // -------------------------------------------------------------------- + + /** + * Mime message + * + * @access protected + * @return string + */ + protected function _get_mime_message() + { + return "This is a multi-part message in MIME format.".$this->newline."Your email application may not support this format."; + } + + // -------------------------------------------------------------------- + + /** + * Validate Email Address + * + * @access public + * @param string + * @return bool + */ + public function validate_email($email) + { + if ( ! is_array($email)) + { + $this->_set_error_message('lang:email_must_be_array'); + return FALSE; + } + + foreach ($email as $val) + { + if ( ! $this->valid_email($val)) + { + $this->_set_error_message('lang:email_invalid_address', $val); + return FALSE; + } + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Email Validation + * + * @access public + * @param string + * @return bool + */ + public function valid_email($address) + { + return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $address)) ? FALSE : TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Clean Extended Email Address: Joe Smith <joe@smith.com> + * + * @access public + * @param string + * @return string + */ + public function clean_email($email) + { + if ( ! is_array($email)) + { + if (preg_match('/\<(.*)\>/', $email, $match)) + { + return $match['1']; + } + else + { + return $email; + } + } + + $clean_email = array(); + + foreach ($email as $addy) + { + if (preg_match( '/\<(.*)\>/', $addy, $match)) + { + $clean_email[] = $match['1']; + } + else + { + $clean_email[] = $addy; + } + } + + return $clean_email; + } + + // -------------------------------------------------------------------- + + /** + * Build alternative plain text message + * + * This public function provides the raw message for use + * in plain-text headers of HTML-formatted emails. + * If the user hasn't specified his own alternative message + * it creates one by stripping the HTML + * + * @access protected + * @return string + */ + protected function _get_alt_message() + { + if ($this->alt_message != "") + { + return $this->word_wrap($this->alt_message, '76'); + } + + if (preg_match('/\<body.*?\>(.*)\<\/body\>/si', $this->_body, $match)) + { + $body = $match['1']; + } + else + { + $body = $this->_body; + } + + $body = trim(strip_tags($body)); + $body = preg_replace( '#<!--(.*)--\>#', "", $body); + $body = str_replace("\t", "", $body); + + for ($i = 20; $i >= 3; $i--) + { + $n = ""; + + for ($x = 1; $x <= $i; $x ++) + { + $n .= "\n"; + } + + $body = str_replace($n, "\n\n", $body); + } + + return $this->word_wrap($body, '76'); + } + + // -------------------------------------------------------------------- + + /** + * Word Wrap + * + * @access public + * @param string + * @param integer + * @return string + */ + public function word_wrap($str, $charlim = '') + { + // Se the character limit + if ($charlim == '') + { + $charlim = ($this->wrapchars == "") ? "76" : $this->wrapchars; + } + + // Reduce multiple spaces + $str = preg_replace("| +|", " ", $str); + + // Standardize newlines + if (strpos($str, "\r") !== FALSE) + { + $str = str_replace(array("\r\n", "\r"), "\n", $str); + } + + // If the current word is surrounded by {unwrap} tags we'll + // strip the entire chunk and replace it with a marker. + $unwrap = array(); + if (preg_match_all("|(\{unwrap\}.+?\{/unwrap\})|s", $str, $matches)) + { + for ($i = 0; $i < count($matches['0']); $i++) + { + $unwrap[] = $matches['1'][$i]; + $str = str_replace($matches['1'][$i], "{{unwrapped".$i."}}", $str); + } + } + + // Use PHP's native public function to do the initial wordwrap. + // We set the cut flag to FALSE so that any individual words that are + // too long get left alone. In the next step we'll deal with them. + $str = wordwrap($str, $charlim, "\n", FALSE); + + // Split the string into individual lines of text and cycle through them + $output = ""; + foreach (explode("\n", $str) as $line) + { + // Is the line within the allowed character count? + // If so we'll join it to the output and continue + if (strlen($line) <= $charlim) + { + $output .= $line.$this->newline; + continue; + } + + $temp = ''; + while ((strlen($line)) > $charlim) + { + // If the over-length word is a URL we won't wrap it + if (preg_match("!\[url.+\]|://|wwww.!", $line)) + { + break; + } + + // Trim the word down + $temp .= substr($line, 0, $charlim-1); + $line = substr($line, $charlim-1); + } + + // If $temp contains data it means we had to split up an over-length + // word into smaller chunks so we'll add it back to our current line + if ($temp != '') + { + $output .= $temp.$this->newline.$line; + } + else + { + $output .= $line; + } + + $output .= $this->newline; + } + + // Put our markers back + if (count($unwrap) > 0) + { + foreach ($unwrap as $key => $val) + { + $output = str_replace("{{unwrapped".$key."}}", $val, $output); + } + } + + return $output; + } + + // -------------------------------------------------------------------- + + /** + * Build final headers + * + * @access protected + * @param string + * @return string + */ + protected function _build_headers() + { + $this->_set_header('X-Sender', $this->clean_email($this->_headers['From'])); + $this->_set_header('X-Mailer', $this->useragent); + $this->_set_header('X-Priority', $this->_priorities[$this->priority - 1]); + $this->_set_header('Message-ID', $this->_get_message_id()); + $this->_set_header('Mime-Version', '1.0'); + } + + // -------------------------------------------------------------------- + + /** + * Write Headers as a string + * + * @access protected + * @return void + */ + protected function _write_headers() + { + if ($this->protocol == 'mail') + { + $this->_subject = $this->_headers['Subject']; + unset($this->_headers['Subject']); + } + + reset($this->_headers); + $this->_header_str = ""; + + foreach ($this->_headers as $key => $val) + { + $val = trim($val); + + if ($val != "") + { + $this->_header_str .= $key.": ".$val.$this->newline; + } + } + + if ($this->_get_protocol() == 'mail') + { + $this->_header_str = rtrim($this->_header_str); + } + } + + // -------------------------------------------------------------------- + + /** + * Build Final Body and attachments + * + * @access protected + * @return void + */ + protected function _build_message() + { + if ($this->wordwrap === TRUE AND $this->mailtype != 'html') + { + $this->_body = $this->word_wrap($this->_body); + } + + $this->_set_boundaries(); + $this->_write_headers(); + + $hdr = ($this->_get_protocol() == 'mail') ? $this->newline : ''; + $body = ''; + + switch ($this->_get_content_type()) + { + case 'plain' : + + $hdr .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline; + $hdr .= "Content-Transfer-Encoding: " . $this->_get_encoding(); + + if ($this->_get_protocol() == 'mail') + { + $this->_header_str .= rtrim($hdr); + $this->_finalbody = $this->_body; + } + else + { + $this->_finalbody = $hdr . $this->newline . $this->newline . $this->_body; + } + + return; + + break; + case 'html' : + + if ($this->send_multipart === FALSE) + { + $hdr .= "Content-Type: text/html; charset=" . $this->charset . $this->newline; + $hdr .= "Content-Transfer-Encoding: quoted-printable"; + } + else + { + $hdr .= "Content-Type: multipart/alternative; boundary=\"" . $this->_alt_boundary . "\"" . $this->newline . $this->newline; + + $body .= $this->_get_mime_message() . $this->newline . $this->newline; + $body .= "--" . $this->_alt_boundary . $this->newline; + + $body .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline; + $body .= "Content-Transfer-Encoding: " . $this->_get_encoding() . $this->newline . $this->newline; + $body .= $this->_get_alt_message() . $this->newline . $this->newline . "--" . $this->_alt_boundary . $this->newline; + + $body .= "Content-Type: text/html; charset=" . $this->charset . $this->newline; + $body .= "Content-Transfer-Encoding: quoted-printable" . $this->newline . $this->newline; + } + + $this->_finalbody = $body . $this->_prep_quoted_printable($this->_body) . $this->newline . $this->newline; + + + if ($this->_get_protocol() == 'mail') + { + $this->_header_str .= rtrim($hdr); + } + else + { + $this->_finalbody = $hdr . $this->_finalbody; + } + + + if ($this->send_multipart !== FALSE) + { + $this->_finalbody .= "--" . $this->_alt_boundary . "--"; + } + + return; + + break; + case 'plain-attach' : + + $hdr .= "Content-Type: multipart/".$this->multipart."; boundary=\"" . $this->_atc_boundary."\"" . $this->newline . $this->newline; + + if ($this->_get_protocol() == 'mail') + { + $this->_header_str .= rtrim($hdr); + } + + $body .= $this->_get_mime_message() . $this->newline . $this->newline; + $body .= "--" . $this->_atc_boundary . $this->newline; + + $body .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline; + $body .= "Content-Transfer-Encoding: " . $this->_get_encoding() . $this->newline . $this->newline; + + $body .= $this->_body . $this->newline . $this->newline; + + break; + case 'html-attach' : + + $hdr .= "Content-Type: multipart/".$this->multipart."; boundary=\"" . $this->_atc_boundary."\"" . $this->newline . $this->newline; + + if ($this->_get_protocol() == 'mail') + { + $this->_header_str .= rtrim($hdr); + } + + $body .= $this->_get_mime_message() . $this->newline . $this->newline; + $body .= "--" . $this->_atc_boundary . $this->newline; + + $body .= "Content-Type: multipart/alternative; boundary=\"" . $this->_alt_boundary . "\"" . $this->newline .$this->newline; + $body .= "--" . $this->_alt_boundary . $this->newline; + + $body .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline; + $body .= "Content-Transfer-Encoding: " . $this->_get_encoding() . $this->newline . $this->newline; + $body .= $this->_get_alt_message() . $this->newline . $this->newline . "--" . $this->_alt_boundary . $this->newline; + + $body .= "Content-Type: text/html; charset=" . $this->charset . $this->newline; + $body .= "Content-Transfer-Encoding: quoted-printable" . $this->newline . $this->newline; + + $body .= $this->_prep_quoted_printable($this->_body) . $this->newline . $this->newline; + $body .= "--" . $this->_alt_boundary . "--" . $this->newline . $this->newline; + + break; + } + + $attachment = array(); + + $z = 0; + + for ($i=0; $i < count($this->_attach_name); $i++) + { + $filename = $this->_attach_name[$i]; + $basename = basename($filename); + $ctype = $this->_attach_type[$i]; + + if ( ! file_exists($filename)) + { + $this->_set_error_message('lang:email_attachment_missing', $filename); + return FALSE; + } + + $h = "--".$this->_atc_boundary.$this->newline; + $h .= "Content-type: ".$ctype."; "; + $h .= "name=\"".$basename."\"".$this->newline; + $h .= "Content-Disposition: ".$this->_attach_disp[$i].";".$this->newline; + $h .= "Content-Transfer-Encoding: base64".$this->newline; + + $attachment[$z++] = $h; + $file = filesize($filename) +1; + + if ( ! $fp = fopen($filename, FOPEN_READ)) + { + $this->_set_error_message('lang:email_attachment_unreadable', $filename); + return FALSE; + } + + $attachment[$z++] = chunk_split(base64_encode(fread($fp, $file))); + fclose($fp); + } + + $body .= implode($this->newline, $attachment).$this->newline."--".$this->_atc_boundary."--"; + + + if ($this->_get_protocol() == 'mail') + { + $this->_finalbody = $body; + } + else + { + $this->_finalbody = $hdr . $body; + } + + return; + } + + // -------------------------------------------------------------------- + + /** + * Prep Quoted Printable + * + * Prepares string for Quoted-Printable Content-Transfer-Encoding + * Refer to RFC 2045 http://www.ietf.org/rfc/rfc2045.txt + * + * @access protected + * @param string + * @param integer + * @return string + */ + protected function _prep_quoted_printable($str, $charlim = '') + { + // Set the character limit + // Don't allow over 76, as that will make servers and MUAs barf + // all over quoted-printable data + if ($charlim == '' OR $charlim > '76') + { + $charlim = '76'; + } + + // Reduce multiple spaces + $str = preg_replace("| +|", " ", $str); + + // kill nulls + $str = preg_replace('/\x00+/', '', $str); + + // Standardize newlines + if (strpos($str, "\r") !== FALSE) + { + $str = str_replace(array("\r\n", "\r"), "\n", $str); + } + + // We are intentionally wrapping so mail servers will encode characters + // properly and MUAs will behave, so {unwrap} must go! + $str = str_replace(array('{unwrap}', '{/unwrap}'), '', $str); + + // Break into an array of lines + $lines = explode("\n", $str); + + $escape = '='; + $output = ''; + + foreach ($lines as $line) + { + $length = strlen($line); + $temp = ''; + + // Loop through each character in the line to add soft-wrap + // characters at the end of a line " =\r\n" and add the newly + // processed line(s) to the output (see comment on $crlf class property) + for ($i = 0; $i < $length; $i++) + { + // Grab the next character + $char = substr($line, $i, 1); + $ascii = ord($char); + + // Convert spaces and tabs but only if it's the end of the line + if ($i == ($length - 1)) + { + $char = ($ascii == '32' OR $ascii == '9') ? $escape.sprintf('%02s', dechex($ascii)) : $char; + } + + // encode = signs + if ($ascii == '61') + { + $char = $escape.strtoupper(sprintf('%02s', dechex($ascii))); // =3D + } + + // If we're at the character limit, add the line to the output, + // reset our temp variable, and keep on chuggin' + if ((strlen($temp) + strlen($char)) >= $charlim) + { + $output .= $temp.$escape.$this->crlf; + $temp = ''; + } + + // Add the character to our temporary line + $temp .= $char; + } + + // Add our completed line to the output + $output .= $temp.$this->crlf; + } + + // get rid of extra CRLF tacked onto the end + $output = substr($output, 0, strlen($this->crlf) * -1); + + return $output; + } + + // -------------------------------------------------------------------- + + /** + * Prep Q Encoding + * + * Performs "Q Encoding" on a string for use in email headers. It's related + * but not identical to quoted-printable, so it has its own method + * + * @access public + * @param str + * @param bool // set to TRUE for processing From: headers + * @return str + */ + protected function _prep_q_encoding($str, $from = FALSE) + { + $str = str_replace(array("\r", "\n"), array('', ''), $str); + + // Line length must not exceed 76 characters, so we adjust for + // a space, 7 extra characters =??Q??=, and the charset that we will add to each line + $limit = 75 - 7 - strlen($this->charset); + + // these special characters must be converted too + $convert = array('_', '=', '?'); + + if ($from === TRUE) + { + $convert[] = ','; + $convert[] = ';'; + } + + $output = ''; + $temp = ''; + + for ($i = 0, $length = strlen($str); $i < $length; $i++) + { + // Grab the next character + $char = substr($str, $i, 1); + $ascii = ord($char); + + // convert ALL non-printable ASCII characters and our specials + if ($ascii < 32 OR $ascii > 126 OR in_array($char, $convert)) + { + $char = '='.dechex($ascii); + } + + // handle regular spaces a bit more compactly than =20 + if ($ascii == 32) + { + $char = '_'; + } + + // If we're at the character limit, add the line to the output, + // reset our temp variable, and keep on chuggin' + if ((strlen($temp) + strlen($char)) >= $limit) + { + $output .= $temp.$this->crlf; + $temp = ''; + } + + // Add the character to our temporary line + $temp .= $char; + } + + $str = $output.$temp; + + // wrap each line with the shebang, charset, and transfer encoding + // the preceding space on successive lines is required for header "folding" + $str = trim(preg_replace('/^(.*)$/m', ' =?'.$this->charset.'?Q?$1?=', $str)); + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Send Email + * + * @access public + * @return bool + */ + public function send() + { + if ($this->_replyto_flag == FALSE) + { + $this->reply_to($this->_headers['From']); + } + + if (( ! isset($this->_recipients) AND ! isset($this->_headers['To'])) AND + ( ! isset($this->_bcc_array) AND ! isset($this->_headers['Bcc'])) AND + ( ! isset($this->_headers['Cc']))) + { + $this->_set_error_message('lang:email_no_recipients'); + return FALSE; + } + + $this->_build_headers(); + + if ($this->bcc_batch_mode AND count($this->_bcc_array) > 0) + { + if (count($this->_bcc_array) > $this->bcc_batch_size) + return $this->batch_bcc_send(); + } + + $this->_build_message(); + + if ( ! $this->_spool_email()) + { + return FALSE; + } + else + { + return TRUE; + } + } + + // -------------------------------------------------------------------- + + /** + * Batch Bcc Send. Sends groups of BCCs in batches + * + * @access public + * @return bool + */ + public function batch_bcc_send() + { + $float = $this->bcc_batch_size -1; + + $set = ""; + + $chunk = array(); + + for ($i = 0; $i < count($this->_bcc_array); $i++) + { + if (isset($this->_bcc_array[$i])) + { + $set .= ", ".$this->_bcc_array[$i]; + } + + if ($i == $float) + { + $chunk[] = substr($set, 1); + $float = $float + $this->bcc_batch_size; + $set = ""; + } + + if ($i == count($this->_bcc_array)-1) + { + $chunk[] = substr($set, 1); + } + } + + for ($i = 0; $i < count($chunk); $i++) + { + unset($this->_headers['Bcc']); + unset($bcc); + + $bcc = $this->_str_to_array($chunk[$i]); + $bcc = $this->clean_email($bcc); + + if ($this->protocol != 'smtp') + { + $this->_set_header('Bcc', implode(", ", $bcc)); + } + else + { + $this->_bcc_array = $bcc; + } + + $this->_build_message(); + $this->_spool_email(); + } + } + + // -------------------------------------------------------------------- + + /** + * Unwrap special elements + * + * @access protected + * @return void + */ + protected function _unwrap_specials() + { + $this->_finalbody = preg_replace_callback("/\{unwrap\}(.*?)\{\/unwrap\}/si", array($this, '_remove_nl_callback'), $this->_finalbody); + } + + // -------------------------------------------------------------------- + + /** + * Strip line-breaks via callback + * + * @access protected + * @return string + */ + protected function _remove_nl_callback($matches) + { + if (strpos($matches[1], "\r") !== FALSE OR strpos($matches[1], "\n") !== FALSE) + { + $matches[1] = str_replace(array("\r\n", "\r", "\n"), '', $matches[1]); + } + + return $matches[1]; + } + + // -------------------------------------------------------------------- + + /** + * Spool mail to the mail server + * + * @access protected + * @return bool + */ + protected function _spool_email() + { + $this->_unwrap_specials(); + + switch ($this->_get_protocol()) + { + case 'mail' : + + if ( ! $this->_send_with_mail()) + { + $this->_set_error_message('lang:email_send_failure_phpmail'); + return FALSE; + } + break; + case 'sendmail' : + + if ( ! $this->_send_with_sendmail()) + { + $this->_set_error_message('lang:email_send_failure_sendmail'); + return FALSE; + } + break; + case 'smtp' : + + if ( ! $this->_send_with_smtp()) + { + $this->_set_error_message('lang:email_send_failure_smtp'); + return FALSE; + } + break; + + } + + $this->_set_error_message('lang:email_sent', $this->_get_protocol()); + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Send using mail() + * + * @access protected + * @return bool + */ + protected function _send_with_mail() + { + if ($this->_safe_mode == TRUE) + { + if ( ! mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str)) + { + return FALSE; + } + else + { + return TRUE; + } + } + else + { + // most documentation of sendmail using the "-f" flag lacks a space after it, however + // we've encountered servers that seem to require it to be in place. + + if ( ! mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str, "-f ".$this->clean_email($this->_headers['From']))) + { + return FALSE; + } + else + { + return TRUE; + } + } + } + + // -------------------------------------------------------------------- + + /** + * Send using Sendmail + * + * @access protected + * @return bool + */ + protected function _send_with_sendmail() + { + $fp = @popen($this->mailpath . " -oi -f ".$this->clean_email($this->_headers['From'])." -t", 'w'); + + if ($fp === FALSE OR $fp === NULL) + { + // server probably has popen disabled, so nothing we can do to get a verbose error. + return FALSE; + } + + fputs($fp, $this->_header_str); + fputs($fp, $this->_finalbody); + + $status = pclose($fp); + + if (version_compare(PHP_VERSION, '4.2.3') == -1) + { + $status = $status >> 8 & 0xFF; + } + + if ($status != 0) + { + $this->_set_error_message('lang:email_exit_status', $status); + $this->_set_error_message('lang:email_no_socket'); + return FALSE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Send using SMTP + * + * @access protected + * @return bool + */ + protected function _send_with_smtp() + { + if ($this->smtp_host == '') + { + $this->_set_error_message('lang:email_no_hostname'); + return FALSE; + } + + $this->_smtp_connect(); + $this->_smtp_authenticate(); + + $this->_send_command('from', $this->clean_email($this->_headers['From'])); + + foreach ($this->_recipients as $val) + { + $this->_send_command('to', $val); + } + + if (count($this->_cc_array) > 0) + { + foreach ($this->_cc_array as $val) + { + if ($val != "") + { + $this->_send_command('to', $val); + } + } + } + + if (count($this->_bcc_array) > 0) + { + foreach ($this->_bcc_array as $val) + { + if ($val != "") + { + $this->_send_command('to', $val); + } + } + } + + $this->_send_command('data'); + + // perform dot transformation on any lines that begin with a dot + $this->_send_data($this->_header_str . preg_replace('/^\./m', '..$1', $this->_finalbody)); + + $this->_send_data('.'); + + $reply = $this->_get_smtp_data(); + + $this->_set_error_message($reply); + + if (strncmp($reply, '250', 3) != 0) + { + $this->_set_error_message('lang:email_smtp_error', $reply); + return FALSE; + } + + $this->_send_command('quit'); + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * SMTP Connect + * + * @access protected + * @param string + * @return string + */ + protected function _smtp_connect() + { + $ssl = NULL; + if ($this->smtp_crypto == 'ssl') + $ssl = 'ssl://'; + $this->_smtp_connect = fsockopen($ssl.$this->smtp_host, + $this->smtp_port, + $errno, + $errstr, + $this->smtp_timeout); + + if ( ! is_resource($this->_smtp_connect)) + { + $this->_set_error_message('lang:email_smtp_error', $errno." ".$errstr); + return FALSE; + } + + $this->_set_error_message($this->_get_smtp_data()); + + if ($this->smtp_crypto == 'tls') + { + $this->_send_command('hello'); + $this->_send_command('starttls'); + stream_socket_enable_crypto($this->_smtp_connect, TRUE, STREAM_CRYPTO_METHOD_TLS_CLIENT); + } + + return $this->_send_command('hello'); + } + + // -------------------------------------------------------------------- + + /** + * Send SMTP command + * + * @access protected + * @param string + * @param string + * @return string + */ + protected function _send_command($cmd, $data = '') + { + switch ($cmd) + { + case 'hello' : + + if ($this->_smtp_auth OR $this->_get_encoding() == '8bit') + $this->_send_data('EHLO '.$this->_get_hostname()); + else + $this->_send_data('HELO '.$this->_get_hostname()); + + $resp = 250; + break; + case 'starttls' : + + $this->_send_data('STARTTLS'); + + $resp = 220; + break; + case 'from' : + + $this->_send_data('MAIL FROM:<'.$data.'>'); + + $resp = 250; + break; + case 'to' : + + $this->_send_data('RCPT TO:<'.$data.'>'); + + $resp = 250; + break; + case 'data' : + + $this->_send_data('DATA'); + + $resp = 354; + break; + case 'quit' : + + $this->_send_data('QUIT'); + + $resp = 221; + break; + } + + $reply = $this->_get_smtp_data(); + + $this->_debug_msg[] = "<pre>".$cmd.": ".$reply."</pre>"; + + if (substr($reply, 0, 3) != $resp) + { + $this->_set_error_message('lang:email_smtp_error', $reply); + return FALSE; + } + + if ($cmd == 'quit') + { + fclose($this->_smtp_connect); + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * SMTP Authenticate + * + * @access protected + * @return bool + */ + protected function _smtp_authenticate() + { + if ( ! $this->_smtp_auth) + { + return TRUE; + } + + if ($this->smtp_user == "" AND $this->smtp_pass == "") + { + $this->_set_error_message('lang:email_no_smtp_unpw'); + return FALSE; + } + + $this->_send_data('AUTH LOGIN'); + + $reply = $this->_get_smtp_data(); + + if (strncmp($reply, '334', 3) != 0) + { + $this->_set_error_message('lang:email_failed_smtp_login', $reply); + return FALSE; + } + + $this->_send_data(base64_encode($this->smtp_user)); + + $reply = $this->_get_smtp_data(); + + if (strncmp($reply, '334', 3) != 0) + { + $this->_set_error_message('lang:email_smtp_auth_un', $reply); + return FALSE; + } + + $this->_send_data(base64_encode($this->smtp_pass)); + + $reply = $this->_get_smtp_data(); + + if (strncmp($reply, '235', 3) != 0) + { + $this->_set_error_message('lang:email_smtp_auth_pw', $reply); + return FALSE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Send SMTP data + * + * @access protected + * @return bool + */ + protected function _send_data($data) + { + if ( ! fwrite($this->_smtp_connect, $data . $this->newline)) + { + $this->_set_error_message('lang:email_smtp_data_failure', $data); + return FALSE; + } + else + { + return TRUE; + } + } + + // -------------------------------------------------------------------- + + /** + * Get SMTP data + * + * @access protected + * @return string + */ + protected function _get_smtp_data() + { + $data = ""; + + while ($str = fgets($this->_smtp_connect, 512)) + { + $data .= $str; + + if (substr($str, 3, 1) == " ") + { + break; + } + } + + return $data; + } + + // -------------------------------------------------------------------- + + /** + * Get Hostname + * + * @access protected + * @return string + */ + protected function _get_hostname() + { + return (isset($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : 'localhost.localdomain'; + } + + // -------------------------------------------------------------------- + + /** + * Get IP + * + * @access protected + * @return string + */ + protected function _get_ip() + { + if ($this->_IP !== FALSE) + { + return $this->_IP; + } + + $cip = (isset($_SERVER['HTTP_CLIENT_IP']) AND $_SERVER['HTTP_CLIENT_IP'] != "") ? $_SERVER['HTTP_CLIENT_IP'] : FALSE; + $rip = (isset($_SERVER['REMOTE_ADDR']) AND $_SERVER['REMOTE_ADDR'] != "") ? $_SERVER['REMOTE_ADDR'] : FALSE; + $fip = (isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND $_SERVER['HTTP_X_FORWARDED_FOR'] != "") ? $_SERVER['HTTP_X_FORWARDED_FOR'] : FALSE; + + if ($cip && $rip) $this->_IP = $cip; + elseif ($rip) $this->_IP = $rip; + elseif ($cip) $this->_IP = $cip; + elseif ($fip) $this->_IP = $fip; + + if (strpos($this->_IP, ',') !== FALSE) + { + $x = explode(',', $this->_IP); + $this->_IP = end($x); + } + + if ( ! preg_match( "/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/", $this->_IP)) + { + $this->_IP = '0.0.0.0'; + } + + unset($cip); + unset($rip); + unset($fip); + + return $this->_IP; + } + + // -------------------------------------------------------------------- + + /** + * Get Debug Message + * + * @access public + * @return string + */ + public function print_debugger() + { + $msg = ''; + + if (count($this->_debug_msg) > 0) + { + foreach ($this->_debug_msg as $val) + { + $msg .= $val; + } + } + + $msg .= "<pre>".htmlspecialchars($this->_header_str)."\n".htmlspecialchars($this->_subject)."\n".htmlspecialchars($this->_finalbody).'</pre>'; + return $msg; + } + + // -------------------------------------------------------------------- + + /** + * Set Message + * + * @access protected + * @param string + * @return string + */ + protected function _set_error_message($msg, $val = '') + { + $CI =& get_instance(); + $CI->lang->load('email'); + + if (substr($msg, 0, 5) != 'lang:' || FALSE === ($line = $CI->lang->line(substr($msg, 5)))) + { + $this->_debug_msg[] = str_replace('%s', $val, $msg)."<br />"; + } + else + { + $this->_debug_msg[] = str_replace('%s', $val, $line)."<br />"; + } + } + + // -------------------------------------------------------------------- + + /** + * Mime Types + * + * @access protected + * @param string + * @return string + */ + protected function _mime_types($ext = "") + { + $mimes = array( 'hqx' => 'application/mac-binhex40', + 'cpt' => 'application/mac-compactpro', + 'doc' => 'application/msword', + 'bin' => 'application/macbinary', + 'dms' => 'application/octet-stream', + 'lha' => 'application/octet-stream', + 'lzh' => 'application/octet-stream', + 'exe' => 'application/octet-stream', + 'class' => 'application/octet-stream', + 'psd' => 'application/octet-stream', + 'so' => 'application/octet-stream', + 'sea' => 'application/octet-stream', + 'dll' => 'application/octet-stream', + 'oda' => 'application/oda', + 'pdf' => 'application/pdf', + 'ai' => 'application/postscript', + 'eps' => 'application/postscript', + 'ps' => 'application/postscript', + 'smi' => 'application/smil', + 'smil' => 'application/smil', + 'mif' => 'application/vnd.mif', + 'xls' => 'application/vnd.ms-excel', + 'ppt' => 'application/vnd.ms-powerpoint', + 'wbxml' => 'application/vnd.wap.wbxml', + 'wmlc' => 'application/vnd.wap.wmlc', + 'dcr' => 'application/x-director', + 'dir' => 'application/x-director', + 'dxr' => 'application/x-director', + 'dvi' => 'application/x-dvi', + 'gtar' => 'application/x-gtar', + 'php' => 'application/x-httpd-php', + 'php4' => 'application/x-httpd-php', + 'php3' => 'application/x-httpd-php', + 'phtml' => 'application/x-httpd-php', + 'phps' => 'application/x-httpd-php-source', + 'js' => 'application/x-javascript', + 'swf' => 'application/x-shockwave-flash', + 'sit' => 'application/x-stuffit', + 'tar' => 'application/x-tar', + 'tgz' => 'application/x-tar', + 'xhtml' => 'application/xhtml+xml', + 'xht' => 'application/xhtml+xml', + 'zip' => 'application/zip', + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mpga' => 'audio/mpeg', + 'mp2' => 'audio/mpeg', + 'mp3' => 'audio/mpeg', + 'aif' => 'audio/x-aiff', + 'aiff' => 'audio/x-aiff', + 'aifc' => 'audio/x-aiff', + 'ram' => 'audio/x-pn-realaudio', + 'rm' => 'audio/x-pn-realaudio', + 'rpm' => 'audio/x-pn-realaudio-plugin', + 'ra' => 'audio/x-realaudio', + 'rv' => 'video/vnd.rn-realvideo', + 'wav' => 'audio/x-wav', + 'bmp' => 'image/bmp', + 'gif' => 'image/gif', + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'jpe' => 'image/jpeg', + 'png' => 'image/png', + 'tiff' => 'image/tiff', + 'tif' => 'image/tiff', + 'css' => 'text/css', + 'html' => 'text/html', + 'htm' => 'text/html', + 'shtml' => 'text/html', + 'txt' => 'text/plain', + 'text' => 'text/plain', + 'log' => 'text/plain', + 'rtx' => 'text/richtext', + 'rtf' => 'text/rtf', + 'xml' => 'text/xml', + 'xsl' => 'text/xml', + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mpe' => 'video/mpeg', + 'qt' => 'video/quicktime', + 'mov' => 'video/quicktime', + 'avi' => 'video/x-msvideo', + 'movie' => 'video/x-sgi-movie', + 'doc' => 'application/msword', + 'word' => 'application/msword', + 'xl' => 'application/excel', + 'eml' => 'message/rfc822' + ); + + return ( ! isset($mimes[strtolower($ext)])) ? "application/x-unknown-content-type" : $mimes[strtolower($ext)]; + } + +} +// END CI_Email class + +/* End of file Email.php */ +/* Location: ./system/libraries/Email.php */ diff --git a/system/libraries/Encrypt.php b/system/libraries/Encrypt.php new file mode 100644 index 0000000..e70caa3 --- /dev/null +++ b/system/libraries/Encrypt.php @@ -0,0 +1,501 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Encryption Class + * + * Provides two-way keyed encoding using Mcrypt + * + * @package CodeIgniter + * @subpackage Libraries + * @category Libraries + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/encryption.html + */ +class CI_Encrypt { + + var $CI; + var $encryption_key = ''; + var $_hash_type = 'sha1'; + var $_mcrypt_exists = FALSE; + var $_mcrypt_cipher; + var $_mcrypt_mode; + + /** + * Constructor + * + * Simply determines whether the mcrypt library exists. + * + */ + public function __construct() + { + $this->CI =& get_instance(); + $this->_mcrypt_exists = ( ! function_exists('mcrypt_encrypt')) ? FALSE : TRUE; + + if ($this->_mcrypt_exists === FALSE) + { + show_error('The Encrypt library requires the Mcrypt extension.'); + } + + log_message('debug', "Encrypt Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * Fetch the encryption key + * + * Returns it as MD5 in order to have an exact-length 128 bit key. + * Mcrypt is sensitive to keys that are not the correct length + * + * @access public + * @param string + * @return string + */ + function get_key($key = '') + { + if ($key == '') + { + if ($this->encryption_key != '') + { + return $this->encryption_key; + } + + $CI =& get_instance(); + $key = $CI->config->item('encryption_key'); + + if ($key == FALSE) + { + show_error('In order to use the encryption class requires that you set an encryption key in your config file.'); + } + } + + return md5($key); + } + + // -------------------------------------------------------------------- + + /** + * Set the encryption key + * + * @access public + * @param string + * @return void + */ + function set_key($key = '') + { + $this->encryption_key = $key; + } + + // -------------------------------------------------------------------- + + /** + * Encode + * + * Encodes the message string using bitwise XOR encoding. + * The key is combined with a random hash, and then it + * too gets converted using XOR. The whole thing is then run + * through mcrypt using the randomized key. The end result + * is a double-encrypted message string that is randomized + * with each call to this function, even if the supplied + * message and key are the same. + * + * @access public + * @param string the string to encode + * @param string the key + * @return string + */ + function encode($string, $key = '') + { + $key = $this->get_key($key); + $enc = $this->mcrypt_encode($string, $key); + + return base64_encode($enc); + } + + // -------------------------------------------------------------------- + + /** + * Decode + * + * Reverses the above process + * + * @access public + * @param string + * @param string + * @return string + */ + function decode($string, $key = '') + { + $key = $this->get_key($key); + + if (preg_match('/[^a-zA-Z0-9\/\+=]/', $string)) + { + return FALSE; + } + + $dec = base64_decode($string); + + if (($dec = $this->mcrypt_decode($dec, $key)) === FALSE) + { + return FALSE; + } + + return $dec; + } + + // -------------------------------------------------------------------- + + /** + * Encode from Legacy + * + * Takes an encoded string from the original Encryption class algorithms and + * returns a newly encoded string using the improved method added in 2.0.0 + * This allows for backwards compatibility and a method to transition to the + * new encryption algorithms. + * + * For more details, see http://codeigniter.com/user_guide/installation/upgrade_200.html#encryption + * + * @access public + * @param string + * @param int (mcrypt mode constant) + * @param string + * @return string + */ + function encode_from_legacy($string, $legacy_mode = MCRYPT_MODE_ECB, $key = '') + { + // decode it first + // set mode temporarily to what it was when string was encoded with the legacy + // algorithm - typically MCRYPT_MODE_ECB + $current_mode = $this->_get_mode(); + $this->set_mode($legacy_mode); + + $key = $this->get_key($key); + + if (preg_match('/[^a-zA-Z0-9\/\+=]/', $string)) + { + return FALSE; + } + + $dec = base64_decode($string); + + if (($dec = $this->mcrypt_decode($dec, $key)) === FALSE) + { + return FALSE; + } + + $dec = $this->_xor_decode($dec, $key); + + // set the mcrypt mode back to what it should be, typically MCRYPT_MODE_CBC + $this->set_mode($current_mode); + + // and re-encode + return base64_encode($this->mcrypt_encode($dec, $key)); + } + + // -------------------------------------------------------------------- + + /** + * XOR Decode + * + * Takes an encoded string and key as input and generates the + * plain-text original message + * + * @access private + * @param string + * @param string + * @return string + */ + function _xor_decode($string, $key) + { + $string = $this->_xor_merge($string, $key); + + $dec = ''; + for ($i = 0; $i < strlen($string); $i++) + { + $dec .= (substr($string, $i++, 1) ^ substr($string, $i, 1)); + } + + return $dec; + } + + // -------------------------------------------------------------------- + + /** + * XOR key + string Combiner + * + * Takes a string and key as input and computes the difference using XOR + * + * @access private + * @param string + * @param string + * @return string + */ + function _xor_merge($string, $key) + { + $hash = $this->hash($key); + $str = ''; + for ($i = 0; $i < strlen($string); $i++) + { + $str .= substr($string, $i, 1) ^ substr($hash, ($i % strlen($hash)), 1); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Encrypt using Mcrypt + * + * @access public + * @param string + * @param string + * @return string + */ + function mcrypt_encode($data, $key) + { + $init_size = mcrypt_get_iv_size($this->_get_cipher(), $this->_get_mode()); + $init_vect = mcrypt_create_iv($init_size, MCRYPT_RAND); + return $this->_add_cipher_noise($init_vect.mcrypt_encrypt($this->_get_cipher(), $key, $data, $this->_get_mode(), $init_vect), $key); + } + + // -------------------------------------------------------------------- + + /** + * Decrypt using Mcrypt + * + * @access public + * @param string + * @param string + * @return string + */ + function mcrypt_decode($data, $key) + { + $data = $this->_remove_cipher_noise($data, $key); + $init_size = mcrypt_get_iv_size($this->_get_cipher(), $this->_get_mode()); + + if ($init_size > strlen($data)) + { + return FALSE; + } + + $init_vect = substr($data, 0, $init_size); + $data = substr($data, $init_size); + return rtrim(mcrypt_decrypt($this->_get_cipher(), $key, $data, $this->_get_mode(), $init_vect), "\0"); + } + + // -------------------------------------------------------------------- + + /** + * Adds permuted noise to the IV + encrypted data to protect + * against Man-in-the-middle attacks on CBC mode ciphers + * http://www.ciphersbyritter.com/GLOSSARY.HTM#IV + * + * Function description + * + * @access private + * @param string + * @param string + * @return string + */ + function _add_cipher_noise($data, $key) + { + $keyhash = $this->hash($key); + $keylen = strlen($keyhash); + $str = ''; + + for ($i = 0, $j = 0, $len = strlen($data); $i < $len; ++$i, ++$j) + { + if ($j >= $keylen) + { + $j = 0; + } + + $str .= chr((ord($data[$i]) + ord($keyhash[$j])) % 256); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Removes permuted noise from the IV + encrypted data, reversing + * _add_cipher_noise() + * + * Function description + * + * @access public + * @param type + * @return type + */ + function _remove_cipher_noise($data, $key) + { + $keyhash = $this->hash($key); + $keylen = strlen($keyhash); + $str = ''; + + for ($i = 0, $j = 0, $len = strlen($data); $i < $len; ++$i, ++$j) + { + if ($j >= $keylen) + { + $j = 0; + } + + $temp = ord($data[$i]) - ord($keyhash[$j]); + + if ($temp < 0) + { + $temp = $temp + 256; + } + + $str .= chr($temp); + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Set the Mcrypt Cipher + * + * @access public + * @param constant + * @return string + */ + function set_cipher($cipher) + { + $this->_mcrypt_cipher = $cipher; + } + + // -------------------------------------------------------------------- + + /** + * Set the Mcrypt Mode + * + * @access public + * @param constant + * @return string + */ + function set_mode($mode) + { + $this->_mcrypt_mode = $mode; + } + + // -------------------------------------------------------------------- + + /** + * Get Mcrypt cipher Value + * + * @access private + * @return string + */ + function _get_cipher() + { + if ($this->_mcrypt_cipher == '') + { + $this->_mcrypt_cipher = MCRYPT_RIJNDAEL_256; + } + + return $this->_mcrypt_cipher; + } + + // -------------------------------------------------------------------- + + /** + * Get Mcrypt Mode Value + * + * @access private + * @return string + */ + function _get_mode() + { + if ($this->_mcrypt_mode == '') + { + $this->_mcrypt_mode = MCRYPT_MODE_CBC; + } + + return $this->_mcrypt_mode; + } + + // -------------------------------------------------------------------- + + /** + * Set the Hash type + * + * @access public + * @param string + * @return string + */ + function set_hash($type = 'sha1') + { + $this->_hash_type = ($type != 'sha1' AND $type != 'md5') ? 'sha1' : $type; + } + + // -------------------------------------------------------------------- + + /** + * Hash encode a string + * + * @access public + * @param string + * @return string + */ + function hash($str) + { + return ($this->_hash_type == 'sha1') ? $this->sha1($str) : md5($str); + } + + // -------------------------------------------------------------------- + + /** + * Generate an SHA1 Hash + * + * @access public + * @param string + * @return string + */ + function sha1($str) + { + if ( ! function_exists('sha1')) + { + if ( ! function_exists('mhash')) + { + require_once(BASEPATH.'libraries/Sha1.php'); + $SH = new CI_SHA; + return $SH->generate($str); + } + else + { + return bin2hex(mhash(MHASH_SHA1, $str)); + } + } + else + { + return sha1($str); + } + } + +} + +// END CI_Encrypt class + +/* End of file Encrypt.php */ +/* Location: ./system/libraries/Encrypt.php */ diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php new file mode 100644 index 0000000..893f7f1 --- /dev/null +++ b/system/libraries/Form_validation.php @@ -0,0 +1,1383 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Form Validation Class + * + * @package CodeIgniter + * @subpackage Libraries + * @category Validation + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/form_validation.html + */ +class CI_Form_validation { + + protected $CI; + protected $_field_data = array(); + protected $_config_rules = array(); + protected $_error_array = array(); + protected $_error_messages = array(); + protected $_error_prefix = '<p>'; + protected $_error_suffix = '</p>'; + protected $error_string = ''; + protected $_safe_form_data = FALSE; + + /** + * Constructor + */ + public function __construct($rules = array()) + { + $this->CI =& get_instance(); + + // Validation rules can be stored in a config file. + $this->_config_rules = $rules; + + // Automatically load the form helper + $this->CI->load->helper('form'); + + // Set the character encoding in MB. + if (function_exists('mb_internal_encoding')) + { + mb_internal_encoding($this->CI->config->item('charset')); + } + + log_message('debug', "Form Validation Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * Set Rules + * + * This function takes an array of field names and validation + * rules as input, validates the info, and stores it + * + * @access public + * @param mixed + * @param string + * @return void + */ + public function set_rules($field, $label = '', $rules = '') + { + // No reason to set rules if we have no POST data + if (count($_POST) == 0) + { + return $this; + } + + // If an array was passed via the first parameter instead of indidual string + // values we cycle through it and recursively call this function. + if (is_array($field)) + { + foreach ($field as $row) + { + // Houston, we have a problem... + if ( ! isset($row['field']) OR ! isset($row['rules'])) + { + continue; + } + + // If the field label wasn't passed we use the field name + $label = ( ! isset($row['label'])) ? $row['field'] : $row['label']; + + // Here we go! + $this->set_rules($row['field'], $label, $row['rules']); + } + return $this; + } + + // No fields? Nothing to do... + if ( ! is_string($field) OR ! is_string($rules) OR $field == '') + { + return $this; + } + + // If the field label wasn't passed we use the field name + $label = ($label == '') ? $field : $label; + + // Is the field name an array? We test for the existence of a bracket "[" in + // the field name to determine this. If it is an array, we break it apart + // into its components so that we can fetch the corresponding POST data later + if (strpos($field, '[') !== FALSE AND preg_match_all('/\[(.*?)\]/', $field, $matches)) + { + // Note: Due to a bug in current() that affects some versions + // of PHP we can not pass function call directly into it + $x = explode('[', $field); + $indexes[] = current($x); + + for ($i = 0; $i < count($matches['0']); $i++) + { + if ($matches['1'][$i] != '') + { + $indexes[] = $matches['1'][$i]; + } + } + + $is_array = TRUE; + } + else + { + $indexes = array(); + $is_array = FALSE; + } + + // Build our master array + $this->_field_data[$field] = array( + 'field' => $field, + 'label' => $label, + 'rules' => $rules, + 'is_array' => $is_array, + 'keys' => $indexes, + 'postdata' => NULL, + 'error' => '' + ); + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set Error Message + * + * Lets users set their own error messages on the fly. Note: The key + * name has to match the function name that it corresponds to. + * + * @access public + * @param string + * @param string + * @return string + */ + public function set_message($lang, $val = '') + { + if ( ! is_array($lang)) + { + $lang = array($lang => $val); + } + + $this->_error_messages = array_merge($this->_error_messages, $lang); + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Set The Error Delimiter + * + * Permits a prefix/suffix to be added to each error message + * + * @access public + * @param string + * @param string + * @return void + */ + public function set_error_delimiters($prefix = '<p>', $suffix = '</p>') + { + $this->_error_prefix = $prefix; + $this->_error_suffix = $suffix; + + return $this; + } + + // -------------------------------------------------------------------- + + /** + * Get Error Message + * + * Gets the error message associated with a particular field + * + * @access public + * @param string the field name + * @return void + */ + public function error($field = '', $prefix = '', $suffix = '') + { + if ( ! isset($this->_field_data[$field]['error']) OR $this->_field_data[$field]['error'] == '') + { + return ''; + } + + if ($prefix == '') + { + $prefix = $this->_error_prefix; + } + + if ($suffix == '') + { + $suffix = $this->_error_suffix; + } + + return $prefix.$this->_field_data[$field]['error'].$suffix; + } + + // -------------------------------------------------------------------- + + /** + * Error String + * + * Returns the error messages as a string, wrapped in the error delimiters + * + * @access public + * @param string + * @param string + * @return str + */ + public function error_string($prefix = '', $suffix = '') + { + // No errrors, validation passes! + if (count($this->_error_array) === 0) + { + return ''; + } + + if ($prefix == '') + { + $prefix = $this->_error_prefix; + } + + if ($suffix == '') + { + $suffix = $this->_error_suffix; + } + + // Generate the error string + $str = ''; + foreach ($this->_error_array as $val) + { + if ($val != '') + { + $str .= $prefix.$val.$suffix."\n"; + } + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Run the Validator + * + * This function does all the work. + * + * @access public + * @return bool + */ + public function run($group = '') + { + // Do we even have any data to process? Mm? + if (count($_POST) == 0) + { + return FALSE; + } + + // Does the _field_data array containing the validation rules exist? + // If not, we look to see if they were assigned via a config file + if (count($this->_field_data) == 0) + { + // No validation rules? We're done... + if (count($this->_config_rules) == 0) + { + return FALSE; + } + + // Is there a validation rule for the particular URI being accessed? + $uri = ($group == '') ? trim($this->CI->uri->ruri_string(), '/') : $group; + + if ($uri != '' AND isset($this->_config_rules[$uri])) + { + $this->set_rules($this->_config_rules[$uri]); + } + else + { + $this->set_rules($this->_config_rules); + } + + // We're we able to set the rules correctly? + if (count($this->_field_data) == 0) + { + log_message('debug', "Unable to find validation rules"); + return FALSE; + } + } + + // Load the language file containing error messages + $this->CI->lang->load('form_validation'); + + // Cycle through the rules for each field, match the + // corresponding $_POST item and test for errors + foreach ($this->_field_data as $field => $row) + { + // Fetch the data from the corresponding $_POST array and cache it in the _field_data array. + // Depending on whether the field name is an array or a string will determine where we get it from. + + if ($row['is_array'] == TRUE) + { + $this->_field_data[$field]['postdata'] = $this->_reduce_array($_POST, $row['keys']); + } + else + { + if (isset($_POST[$field]) AND $_POST[$field] != "") + { + $this->_field_data[$field]['postdata'] = $_POST[$field]; + } + } + + $this->_execute($row, explode('|', $row['rules']), $this->_field_data[$field]['postdata']); + } + + // Did we end up with any errors? + $total_errors = count($this->_error_array); + + if ($total_errors > 0) + { + $this->_safe_form_data = TRUE; + } + + // Now we need to re-set the POST data with the new, processed data + $this->_reset_post_array(); + + // No errors, validation passes! + if ($total_errors == 0) + { + return TRUE; + } + + // Validation fails + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Traverse a multidimensional $_POST array index until the data is found + * + * @access private + * @param array + * @param array + * @param integer + * @return mixed + */ + protected function _reduce_array($array, $keys, $i = 0) + { + if (is_array($array)) + { + if (isset($keys[$i])) + { + if (isset($array[$keys[$i]])) + { + $array = $this->_reduce_array($array[$keys[$i]], $keys, ($i+1)); + } + else + { + return NULL; + } + } + else + { + return $array; + } + } + + return $array; + } + + // -------------------------------------------------------------------- + + /** + * Re-populate the _POST array with our finalized and processed data + * + * @access private + * @return null + */ + protected function _reset_post_array() + { + foreach ($this->_field_data as $field => $row) + { + if ( ! is_null($row['postdata'])) + { + if ($row['is_array'] == FALSE) + { + if (isset($_POST[$row['field']])) + { + $_POST[$row['field']] = $this->prep_for_form($row['postdata']); + } + } + else + { + // start with a reference + $post_ref =& $_POST; + + // before we assign values, make a reference to the right POST key + if (count($row['keys']) == 1) + { + $post_ref =& $post_ref[current($row['keys'])]; + } + else + { + foreach ($row['keys'] as $val) + { + $post_ref =& $post_ref[$val]; + } + } + + if (is_array($row['postdata'])) + { + $array = array(); + foreach ($row['postdata'] as $k => $v) + { + $array[$k] = $this->prep_for_form($v); + } + + $post_ref = $array; + } + else + { + $post_ref = $this->prep_for_form($row['postdata']); + } + } + } + } + } + + // -------------------------------------------------------------------- + + /** + * Executes the Validation routines + * + * @access private + * @param array + * @param array + * @param mixed + * @param integer + * @return mixed + */ + protected function _execute($row, $rules, $postdata = NULL, $cycles = 0) + { + // If the $_POST data is an array we will run a recursive call + if (is_array($postdata)) + { + foreach ($postdata as $key => $val) + { + $this->_execute($row, $rules, $val, $cycles); + $cycles++; + } + + return; + } + + // -------------------------------------------------------------------- + + // If the field is blank, but NOT required, no further tests are necessary + $callback = FALSE; + if ( ! in_array('required', $rules) AND is_null($postdata)) + { + // Before we bail out, does the rule contain a callback? + if (preg_match("/(callback_\w+(\[.*?\])?)/", implode(' ', $rules), $match)) + { + $callback = TRUE; + $rules = (array('1' => $match[1])); + } + else + { + return; + } + } + + // -------------------------------------------------------------------- + + // Isset Test. Typically this rule will only apply to checkboxes. + if (is_null($postdata) AND $callback == FALSE) + { + if (in_array('isset', $rules, TRUE) OR in_array('required', $rules)) + { + // Set the message type + $type = (in_array('required', $rules)) ? 'required' : 'isset'; + + if ( ! isset($this->_error_messages[$type])) + { + if (FALSE === ($line = $this->CI->lang->line($type))) + { + $line = 'The field was not set'; + } + } + else + { + $line = $this->_error_messages[$type]; + } + + // Build the error message + $message = sprintf($line, $this->_translate_fieldname($row['label'])); + + // Save the error message + $this->_field_data[$row['field']]['error'] = $message; + + if ( ! isset($this->_error_array[$row['field']])) + { + $this->_error_array[$row['field']] = $message; + } + } + + return; + } + + // -------------------------------------------------------------------- + + // Cycle through each rule and run it + foreach ($rules As $rule) + { + $_in_array = FALSE; + + // We set the $postdata variable with the current data in our master array so that + // each cycle of the loop is dealing with the processed data from the last cycle + if ($row['is_array'] == TRUE AND is_array($this->_field_data[$row['field']]['postdata'])) + { + // We shouldn't need this safety, but just in case there isn't an array index + // associated with this cycle we'll bail out + if ( ! isset($this->_field_data[$row['field']]['postdata'][$cycles])) + { + continue; + } + + $postdata = $this->_field_data[$row['field']]['postdata'][$cycles]; + $_in_array = TRUE; + } + else + { + $postdata = $this->_field_data[$row['field']]['postdata']; + } + + // -------------------------------------------------------------------- + + // Is the rule a callback? + $callback = FALSE; + if (substr($rule, 0, 9) == 'callback_') + { + $rule = substr($rule, 9); + $callback = TRUE; + } + + // Strip the parameter (if exists) from the rule + // Rules can contain a parameter: max_length[5] + $param = FALSE; + if (preg_match("/(.*?)\[(.*)\]/", $rule, $match)) + { + $rule = $match[1]; + $param = $match[2]; + } + + // Call the function that corresponds to the rule + if ($callback === TRUE) + { + if ( ! method_exists($this->CI, $rule)) + { + continue; + } + + // Run the function and grab the result + $result = $this->CI->$rule($postdata, $param); + + // Re-assign the result to the master data array + if ($_in_array == TRUE) + { + $this->_field_data[$row['field']]['postdata'][$cycles] = (is_bool($result)) ? $postdata : $result; + } + else + { + $this->_field_data[$row['field']]['postdata'] = (is_bool($result)) ? $postdata : $result; + } + + // If the field isn't required and we just processed a callback we'll move on... + if ( ! in_array('required', $rules, TRUE) AND $result !== FALSE) + { + continue; + } + } + else + { + if ( ! method_exists($this, $rule)) + { + // If our own wrapper function doesn't exist we see if a native PHP function does. + // Users can use any native PHP function call that has one param. + if (function_exists($rule)) + { + $result = $rule($postdata); + + if ($_in_array == TRUE) + { + $this->_field_data[$row['field']]['postdata'][$cycles] = (is_bool($result)) ? $postdata : $result; + } + else + { + $this->_field_data[$row['field']]['postdata'] = (is_bool($result)) ? $postdata : $result; + } + } + else + { + log_message('debug', "Unable to find validation rule: ".$rule); + } + + continue; + } + + $result = $this->$rule($postdata, $param); + + if ($_in_array == TRUE) + { + $this->_field_data[$row['field']]['postdata'][$cycles] = (is_bool($result)) ? $postdata : $result; + } + else + { + $this->_field_data[$row['field']]['postdata'] = (is_bool($result)) ? $postdata : $result; + } + } + + // Did the rule test negatively? If so, grab the error. + if ($result === FALSE) + { + if ( ! isset($this->_error_messages[$rule])) + { + if (FALSE === ($line = $this->CI->lang->line($rule))) + { + $line = 'Unable to access an error message corresponding to your field name.'; + } + } + else + { + $line = $this->_error_messages[$rule]; + } + + // Is the parameter we are inserting into the error message the name + // of another field? If so we need to grab its "field label" + if (isset($this->_field_data[$param]) AND isset($this->_field_data[$param]['label'])) + { + $param = $this->_translate_fieldname($this->_field_data[$param]['label']); + } + + // Build the error message + $message = sprintf($line, $this->_translate_fieldname($row['label']), $param); + + // Save the error message + $this->_field_data[$row['field']]['error'] = $message; + + if ( ! isset($this->_error_array[$row['field']])) + { + $this->_error_array[$row['field']] = $message; + } + + return; + } + } + } + + // -------------------------------------------------------------------- + + /** + * Translate a field name + * + * @access private + * @param string the field name + * @return string + */ + protected function _translate_fieldname($fieldname) + { + // Do we need to translate the field name? + // We look for the prefix lang: to determine this + if (substr($fieldname, 0, 5) == 'lang:') + { + // Grab the variable + $line = substr($fieldname, 5); + + // Were we able to translate the field name? If not we use $line + if (FALSE === ($fieldname = $this->CI->lang->line($line))) + { + return $line; + } + } + + return $fieldname; + } + + // -------------------------------------------------------------------- + + /** + * Get the value from a form + * + * Permits you to repopulate a form field with the value it was submitted + * with, or, if that value doesn't exist, with the default + * + * @access public + * @param string the field name + * @param string + * @return void + */ + public function set_value($field = '', $default = '') + { + if ( ! isset($this->_field_data[$field])) + { + return $default; + } + + // If the data is an array output them one at a time. + // E.g: form_input('name[]', set_value('name[]'); + if (is_array($this->_field_data[$field]['postdata'])) + { + return array_shift($this->_field_data[$field]['postdata']); + } + + return $this->_field_data[$field]['postdata']; + } + + // -------------------------------------------------------------------- + + /** + * Set Select + * + * Enables pull-down lists to be set to the value the user + * selected in the event of an error + * + * @access public + * @param string + * @param string + * @return string + */ + public function set_select($field = '', $value = '', $default = FALSE) + { + if ( ! isset($this->_field_data[$field]) OR ! isset($this->_field_data[$field]['postdata'])) + { + if ($default === TRUE AND count($this->_field_data) === 0) + { + return ' selected="selected"'; + } + return ''; + } + + $field = $this->_field_data[$field]['postdata']; + + if (is_array($field)) + { + if ( ! in_array($value, $field)) + { + return ''; + } + } + else + { + if (($field == '' OR $value == '') OR ($field != $value)) + { + return ''; + } + } + + return ' selected="selected"'; + } + + // -------------------------------------------------------------------- + + /** + * Set Radio + * + * Enables radio buttons to be set to the value the user + * selected in the event of an error + * + * @access public + * @param string + * @param string + * @return string + */ + public function set_radio($field = '', $value = '', $default = FALSE) + { + if ( ! isset($this->_field_data[$field]) OR ! isset($this->_field_data[$field]['postdata'])) + { + if ($default === TRUE AND count($this->_field_data) === 0) + { + return ' checked="checked"'; + } + return ''; + } + + $field = $this->_field_data[$field]['postdata']; + + if (is_array($field)) + { + if ( ! in_array($value, $field)) + { + return ''; + } + } + else + { + if (($field == '' OR $value == '') OR ($field != $value)) + { + return ''; + } + } + + return ' checked="checked"'; + } + + // -------------------------------------------------------------------- + + /** + * Set Checkbox + * + * Enables checkboxes to be set to the value the user + * selected in the event of an error + * + * @access public + * @param string + * @param string + * @return string + */ + public function set_checkbox($field = '', $value = '', $default = FALSE) + { + if ( ! isset($this->_field_data[$field]) OR ! isset($this->_field_data[$field]['postdata'])) + { + if ($default === TRUE AND count($this->_field_data) === 0) + { + return ' checked="checked"'; + } + return ''; + } + + $field = $this->_field_data[$field]['postdata']; + + if (is_array($field)) + { + if ( ! in_array($value, $field)) + { + return ''; + } + } + else + { + if (($field == '' OR $value == '') OR ($field != $value)) + { + return ''; + } + } + + return ' checked="checked"'; + } + + // -------------------------------------------------------------------- + + /** + * Required + * + * @access public + * @param string + * @return bool + */ + public function required($str) + { + if ( ! is_array($str)) + { + return (trim($str) == '') ? FALSE : TRUE; + } + else + { + return ( ! empty($str)); + } + } + + // -------------------------------------------------------------------- + + /** + * Performs a Regular Expression match test. + * + * @access public + * @param string + * @param regex + * @return bool + */ + public function regex_match($str, $regex) + { + if ( ! preg_match($regex, $str)) + { + return FALSE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Match one field to another + * + * @access public + * @param string + * @param field + * @return bool + */ + public function matches($str, $field) + { + if ( ! isset($_POST[$field])) + { + return FALSE; + } + + $field = $_POST[$field]; + + return ($str !== $field) ? FALSE : TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Match one field to another + * + * @access public + * @param string + * @param field + * @return bool + */ + public function is_unique($str, $field) + { + list($table, $field)=explode('.', $field); + $query = $this->CI->db->limit(1)->get_where($table, array($field => $str)); + + return $query->num_rows() === 0; + } + + // -------------------------------------------------------------------- + + /** + * Minimum Length + * + * @access public + * @param string + * @param value + * @return bool + */ + public function min_length($str, $val) + { + if (preg_match("/[^0-9]/", $val)) + { + return FALSE; + } + + if (function_exists('mb_strlen')) + { + return (mb_strlen($str) < $val) ? FALSE : TRUE; + } + + return (strlen($str) < $val) ? FALSE : TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Max Length + * + * @access public + * @param string + * @param value + * @return bool + */ + public function max_length($str, $val) + { + if (preg_match("/[^0-9]/", $val)) + { + return FALSE; + } + + if (function_exists('mb_strlen')) + { + return (mb_strlen($str) > $val) ? FALSE : TRUE; + } + + return (strlen($str) > $val) ? FALSE : TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Exact Length + * + * @access public + * @param string + * @param value + * @return bool + */ + public function exact_length($str, $val) + { + if (preg_match("/[^0-9]/", $val)) + { + return FALSE; + } + + if (function_exists('mb_strlen')) + { + return (mb_strlen($str) != $val) ? FALSE : TRUE; + } + + return (strlen($str) != $val) ? FALSE : TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Valid Email + * + * @access public + * @param string + * @return bool + */ + public function valid_email($str) + { + return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Valid Emails + * + * @access public + * @param string + * @return bool + */ + public function valid_emails($str) + { + if (strpos($str, ',') === FALSE) + { + return $this->valid_email(trim($str)); + } + + foreach (explode(',', $str) as $email) + { + if (trim($email) != '' && $this->valid_email(trim($email)) === FALSE) + { + return FALSE; + } + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Validate IP Address + * + * @access public + * @param string + * @param string "ipv4" or "ipv6" to validate a specific ip format + * @return string + */ + public function valid_ip($ip, $which = '') + { + return $this->CI->input->valid_ip($ip, $which); + } + + // -------------------------------------------------------------------- + + /** + * Alpha + * + * @access public + * @param string + * @return bool + */ + public function alpha($str) + { + return ( ! preg_match("/^([a-z])+$/i", $str)) ? FALSE : TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Alpha-numeric + * + * @access public + * @param string + * @return bool + */ + public function alpha_numeric($str) + { + return ( ! preg_match("/^([a-z0-9])+$/i", $str)) ? FALSE : TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Alpha-numeric with underscores and dashes + * + * @access public + * @param string + * @return bool + */ + public function alpha_dash($str) + { + return ( ! preg_match("/^([-a-z0-9_-])+$/i", $str)) ? FALSE : TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Numeric + * + * @access public + * @param string + * @return bool + */ + public function numeric($str) + { + return (bool)preg_match( '/^[\-+]?[0-9]*\.?[0-9]+$/', $str); + + } + + // -------------------------------------------------------------------- + + /** + * Is Numeric + * + * @access public + * @param string + * @return bool + */ + public function is_numeric($str) + { + return ( ! is_numeric($str)) ? FALSE : TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Integer + * + * @access public + * @param string + * @return bool + */ + public function integer($str) + { + return (bool) preg_match('/^[\-+]?[0-9]+$/', $str); + } + + // -------------------------------------------------------------------- + + /** + * Decimal number + * + * @access public + * @param string + * @return bool + */ + public function decimal($str) + { + return (bool) preg_match('/^[\-+]?[0-9]+\.[0-9]+$/', $str); + } + + // -------------------------------------------------------------------- + + /** + * Greather than + * + * @access public + * @param string + * @return bool + */ + public function greater_than($str, $min) + { + if ( ! is_numeric($str)) + { + return FALSE; + } + return $str > $min; + } + + // -------------------------------------------------------------------- + + /** + * Less than + * + * @access public + * @param string + * @return bool + */ + public function less_than($str, $max) + { + if ( ! is_numeric($str)) + { + return FALSE; + } + return $str < $max; + } + + // -------------------------------------------------------------------- + + /** + * Is a Natural number (0,1,2,3, etc.) + * + * @access public + * @param string + * @return bool + */ + public function is_natural($str) + { + return (bool) preg_match( '/^[0-9]+$/', $str); + } + + // -------------------------------------------------------------------- + + /** + * Is a Natural number, but not a zero (1,2,3, etc.) + * + * @access public + * @param string + * @return bool + */ + public function is_natural_no_zero($str) + { + if ( ! preg_match( '/^[0-9]+$/', $str)) + { + return FALSE; + } + + if ($str == 0) + { + return FALSE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Valid Base64 + * + * Tests a string for characters outside of the Base64 alphabet + * as defined by RFC 2045 http://www.faqs.org/rfcs/rfc2045 + * + * @access public + * @param string + * @return bool + */ + public function valid_base64($str) + { + return (bool) ! preg_match('/[^a-zA-Z0-9\/\+=]/', $str); + } + + // -------------------------------------------------------------------- + + /** + * Prep data for form + * + * This function allows HTML to be safely shown in a form. + * Special characters are converted. + * + * @access public + * @param string + * @return string + */ + public function prep_for_form($data = '') + { + if (is_array($data)) + { + foreach ($data as $key => $val) + { + $data[$key] = $this->prep_for_form($val); + } + + return $data; + } + + if ($this->_safe_form_data == FALSE OR $data === '') + { + return $data; + } + + return str_replace(array("'", '"', '<', '>'), array("&#39;", "&quot;", '&lt;', '&gt;'), stripslashes($data)); + } + + // -------------------------------------------------------------------- + + /** + * Prep URL + * + * @access public + * @param string + * @return string + */ + public function prep_url($str = '') + { + if ($str == 'http://' OR $str == '') + { + return ''; + } + + if (substr($str, 0, 7) != 'http://' && substr($str, 0, 8) != 'https://') + { + $str = 'http://'.$str; + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Strip Image Tags + * + * @access public + * @param string + * @return string + */ + public function strip_image_tags($str) + { + return $this->CI->input->strip_image_tags($str); + } + + // -------------------------------------------------------------------- + + /** + * XSS Clean + * + * @access public + * @param string + * @return string + */ + public function xss_clean($str) + { + return $this->CI->security->xss_clean($str); + } + + // -------------------------------------------------------------------- + + /** + * Convert PHP tags to entities + * + * @access public + * @param string + * @return string + */ + public function encode_php_tags($str) + { + return str_replace(array('<?php', '<?PHP', '<?', '?>'), array('&lt;?php', '&lt;?PHP', '&lt;?', '?&gt;'), $str); + } + +} +// END Form Validation Class + +/* End of file Form_validation.php */ +/* Location: ./system/libraries/Form_validation.php */ diff --git a/system/libraries/Ftp.php b/system/libraries/Ftp.php new file mode 100644 index 0000000..ed3466c --- /dev/null +++ b/system/libraries/Ftp.php @@ -0,0 +1,660 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * FTP Class + * + * @package CodeIgniter + * @subpackage Libraries + * @category Libraries + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/ftp.html + */ +class CI_FTP { + + var $hostname = ''; + var $username = ''; + var $password = ''; + var $port = 21; + var $passive = TRUE; + var $debug = FALSE; + var $conn_id = FALSE; + + + /** + * Constructor - Sets Preferences + * + * The constructor can be passed an array of config values + */ + public function __construct($config = array()) + { + if (count($config) > 0) + { + $this->initialize($config); + } + + log_message('debug', "FTP Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * Initialize preferences + * + * @access public + * @param array + * @return void + */ + function initialize($config = array()) + { + foreach ($config as $key => $val) + { + if (isset($this->$key)) + { + $this->$key = $val; + } + } + + // Prep the hostname + $this->hostname = preg_replace('|.+?://|', '', $this->hostname); + } + + // -------------------------------------------------------------------- + + /** + * FTP Connect + * + * @access public + * @param array the connection values + * @return bool + */ + function connect($config = array()) + { + if (count($config) > 0) + { + $this->initialize($config); + } + + if (FALSE === ($this->conn_id = @ftp_connect($this->hostname, $this->port))) + { + if ($this->debug == TRUE) + { + $this->_error('ftp_unable_to_connect'); + } + return FALSE; + } + + if ( ! $this->_login()) + { + if ($this->debug == TRUE) + { + $this->_error('ftp_unable_to_login'); + } + return FALSE; + } + + // Set passive mode if needed + if ($this->passive == TRUE) + { + ftp_pasv($this->conn_id, TRUE); + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * FTP Login + * + * @access private + * @return bool + */ + function _login() + { + return @ftp_login($this->conn_id, $this->username, $this->password); + } + + // -------------------------------------------------------------------- + + /** + * Validates the connection ID + * + * @access private + * @return bool + */ + function _is_conn() + { + if ( ! is_resource($this->conn_id)) + { + if ($this->debug == TRUE) + { + $this->_error('ftp_no_connection'); + } + return FALSE; + } + return TRUE; + } + + // -------------------------------------------------------------------- + + + /** + * Change directory + * + * The second parameter lets us momentarily turn off debugging so that + * this function can be used to test for the existence of a folder + * without throwing an error. There's no FTP equivalent to is_dir() + * so we do it by trying to change to a particular directory. + * Internally, this parameter is only used by the "mirror" function below. + * + * @access public + * @param string + * @param bool + * @return bool + */ + function changedir($path = '', $supress_debug = FALSE) + { + if ($path == '' OR ! $this->_is_conn()) + { + return FALSE; + } + + $result = @ftp_chdir($this->conn_id, $path); + + if ($result === FALSE) + { + if ($this->debug == TRUE AND $supress_debug == FALSE) + { + $this->_error('ftp_unable_to_changedir'); + } + return FALSE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Create a directory + * + * @access public + * @param string + * @return bool + */ + function mkdir($path = '', $permissions = NULL) + { + if ($path == '' OR ! $this->_is_conn()) + { + return FALSE; + } + + $result = @ftp_mkdir($this->conn_id, $path); + + if ($result === FALSE) + { + if ($this->debug == TRUE) + { + $this->_error('ftp_unable_to_makdir'); + } + return FALSE; + } + + // Set file permissions if needed + if ( ! is_null($permissions)) + { + $this->chmod($path, (int)$permissions); + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Upload a file to the server + * + * @access public + * @param string + * @param string + * @param string + * @return bool + */ + function upload($locpath, $rempath, $mode = 'auto', $permissions = NULL) + { + if ( ! $this->_is_conn()) + { + return FALSE; + } + + if ( ! file_exists($locpath)) + { + $this->_error('ftp_no_source_file'); + return FALSE; + } + + // Set the mode if not specified + if ($mode == 'auto') + { + // Get the file extension so we can set the upload type + $ext = $this->_getext($locpath); + $mode = $this->_settype($ext); + } + + $mode = ($mode == 'ascii') ? FTP_ASCII : FTP_BINARY; + + $result = @ftp_put($this->conn_id, $rempath, $locpath, $mode); + + if ($result === FALSE) + { + if ($this->debug == TRUE) + { + $this->_error('ftp_unable_to_upload'); + } + return FALSE; + } + + // Set file permissions if needed + if ( ! is_null($permissions)) + { + $this->chmod($rempath, (int)$permissions); + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Download a file from a remote server to the local server + * + * @access public + * @param string + * @param string + * @param string + * @return bool + */ + function download($rempath, $locpath, $mode = 'auto') + { + if ( ! $this->_is_conn()) + { + return FALSE; + } + + // Set the mode if not specified + if ($mode == 'auto') + { + // Get the file extension so we can set the upload type + $ext = $this->_getext($rempath); + $mode = $this->_settype($ext); + } + + $mode = ($mode == 'ascii') ? FTP_ASCII : FTP_BINARY; + + $result = @ftp_get($this->conn_id, $locpath, $rempath, $mode); + + if ($result === FALSE) + { + if ($this->debug == TRUE) + { + $this->_error('ftp_unable_to_download'); + } + return FALSE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Rename (or move) a file + * + * @access public + * @param string + * @param string + * @param bool + * @return bool + */ + function rename($old_file, $new_file, $move = FALSE) + { + if ( ! $this->_is_conn()) + { + return FALSE; + } + + $result = @ftp_rename($this->conn_id, $old_file, $new_file); + + if ($result === FALSE) + { + if ($this->debug == TRUE) + { + $msg = ($move == FALSE) ? 'ftp_unable_to_rename' : 'ftp_unable_to_move'; + + $this->_error($msg); + } + return FALSE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Move a file + * + * @access public + * @param string + * @param string + * @return bool + */ + function move($old_file, $new_file) + { + return $this->rename($old_file, $new_file, TRUE); + } + + // -------------------------------------------------------------------- + + /** + * Rename (or move) a file + * + * @access public + * @param string + * @return bool + */ + function delete_file($filepath) + { + if ( ! $this->_is_conn()) + { + return FALSE; + } + + $result = @ftp_delete($this->conn_id, $filepath); + + if ($result === FALSE) + { + if ($this->debug == TRUE) + { + $this->_error('ftp_unable_to_delete'); + } + return FALSE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Delete a folder and recursively delete everything (including sub-folders) + * containted within it. + * + * @access public + * @param string + * @return bool + */ + function delete_dir($filepath) + { + if ( ! $this->_is_conn()) + { + return FALSE; + } + + // Add a trailing slash to the file path if needed + $filepath = preg_replace("/(.+?)\/*$/", "\\1/", $filepath); + + $list = $this->list_files($filepath); + + if ($list !== FALSE AND count($list) > 0) + { + foreach ($list as $item) + { + // If we can't delete the item it's probaly a folder so + // we'll recursively call delete_dir() + if ( ! @ftp_delete($this->conn_id, $item)) + { + $this->delete_dir($item); + } + } + } + + $result = @ftp_rmdir($this->conn_id, $filepath); + + if ($result === FALSE) + { + if ($this->debug == TRUE) + { + $this->_error('ftp_unable_to_delete'); + } + return FALSE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Set file permissions + * + * @access public + * @param string the file path + * @param string the permissions + * @return bool + */ + function chmod($path, $perm) + { + if ( ! $this->_is_conn()) + { + return FALSE; + } + + if ( ! function_exists('ftp_chmod')) + { + if ($this->debug == TRUE) + { + $this->_error('ftp_unable_to_chmod'); + } + return FALSE; + } + + $result = @ftp_chmod($this->conn_id, $perm, $path); + + if ($result === FALSE) + { + if ($this->debug == TRUE) + { + $this->_error('ftp_unable_to_chmod'); + } + return FALSE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * FTP List files in the specified directory + * + * @access public + * @return array + */ + function list_files($path = '.') + { + if ( ! $this->_is_conn()) + { + return FALSE; + } + + return ftp_nlist($this->conn_id, $path); + } + + // ------------------------------------------------------------------------ + + /** + * Read a directory and recreate it remotely + * + * This function recursively reads a folder and everything it contains (including + * sub-folders) and creates a mirror via FTP based on it. Whatever the directory structure + * of the original file path will be recreated on the server. + * + * @access public + * @param string path to source with trailing slash + * @param string path to destination - include the base folder with trailing slash + * @return bool + */ + function mirror($locpath, $rempath) + { + if ( ! $this->_is_conn()) + { + return FALSE; + } + + // Open the local file path + if ($fp = @opendir($locpath)) + { + // Attempt to open the remote file path. + if ( ! $this->changedir($rempath, TRUE)) + { + // If it doesn't exist we'll attempt to create the direcotory + if ( ! $this->mkdir($rempath) OR ! $this->changedir($rempath)) + { + return FALSE; + } + } + + // Recursively read the local directory + while (FALSE !== ($file = readdir($fp))) + { + if (@is_dir($locpath.$file) && substr($file, 0, 1) != '.') + { + $this->mirror($locpath.$file."/", $rempath.$file."/"); + } + elseif (substr($file, 0, 1) != ".") + { + // Get the file extension so we can se the upload type + $ext = $this->_getext($file); + $mode = $this->_settype($ext); + + $this->upload($locpath.$file, $rempath.$file, $mode); + } + } + return TRUE; + } + + return FALSE; + } + + + // -------------------------------------------------------------------- + + /** + * Extract the file extension + * + * @access private + * @param string + * @return string + */ + function _getext($filename) + { + if (FALSE === strpos($filename, '.')) + { + return 'txt'; + } + + $x = explode('.', $filename); + return end($x); + } + + + // -------------------------------------------------------------------- + + /** + * Set the upload type + * + * @access private + * @param string + * @return string + */ + function _settype($ext) + { + $text_types = array( + 'txt', + 'text', + 'php', + 'phps', + 'php4', + 'js', + 'css', + 'htm', + 'html', + 'phtml', + 'shtml', + 'log', + 'xml' + ); + + + return (in_array($ext, $text_types)) ? 'ascii' : 'binary'; + } + + // ------------------------------------------------------------------------ + + /** + * Close the connection + * + * @access public + * @param string path to source + * @param string path to destination + * @return bool + */ + function close() + { + if ( ! $this->_is_conn()) + { + return FALSE; + } + + @ftp_close($this->conn_id); + } + + // ------------------------------------------------------------------------ + + /** + * Display error message + * + * @access private + * @param string + * @return bool + */ + function _error($line) + { + $CI =& get_instance(); + $CI->lang->load('ftp'); + show_error($CI->lang->line($line)); + } + + +} +// END FTP Class + +/* End of file Ftp.php */ +/* Location: ./system/libraries/Ftp.php */ \ No newline at end of file diff --git a/system/libraries/Image_lib.php b/system/libraries/Image_lib.php new file mode 100644 index 0000000..29348e9 --- /dev/null +++ b/system/libraries/Image_lib.php @@ -0,0 +1,1538 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Image Manipulation class + * + * @package CodeIgniter + * @subpackage Libraries + * @category Image_lib + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/image_lib.html + */ +class CI_Image_lib { + + var $image_library = 'gd2'; // Can be: imagemagick, netpbm, gd, gd2 + var $library_path = ''; + var $dynamic_output = FALSE; // Whether to send to browser or write to disk + var $source_image = ''; + var $new_image = ''; + var $width = ''; + var $height = ''; + var $quality = '90'; + var $create_thumb = FALSE; + var $thumb_marker = '_thumb'; + var $maintain_ratio = TRUE; // Whether to maintain aspect ratio when resizing or use hard values + var $master_dim = 'auto'; // auto, height, or width. Determines what to use as the master dimension + var $rotation_angle = ''; + var $x_axis = ''; + var $y_axis = ''; + + // Watermark Vars + var $wm_text = ''; // Watermark text if graphic is not used + var $wm_type = 'text'; // Type of watermarking. Options: text/overlay + var $wm_x_transp = 4; + var $wm_y_transp = 4; + var $wm_overlay_path = ''; // Watermark image path + var $wm_font_path = ''; // TT font + var $wm_font_size = 17; // Font size (different versions of GD will either use points or pixels) + var $wm_vrt_alignment = 'B'; // Vertical alignment: T M B + var $wm_hor_alignment = 'C'; // Horizontal alignment: L R C + var $wm_padding = 0; // Padding around text + var $wm_hor_offset = 0; // Lets you push text to the right + var $wm_vrt_offset = 0; // Lets you push text down + var $wm_font_color = '#ffffff'; // Text color + var $wm_shadow_color = ''; // Dropshadow color + var $wm_shadow_distance = 2; // Dropshadow distance + var $wm_opacity = 50; // Image opacity: 1 - 100 Only works with image + + // Private Vars + var $source_folder = ''; + var $dest_folder = ''; + var $mime_type = ''; + var $orig_width = ''; + var $orig_height = ''; + var $image_type = ''; + var $size_str = ''; + var $full_src_path = ''; + var $full_dst_path = ''; + var $create_fnc = 'imagecreatetruecolor'; + var $copy_fnc = 'imagecopyresampled'; + var $error_msg = array(); + var $wm_use_drop_shadow = FALSE; + var $wm_use_truetype = FALSE; + + /** + * Constructor + * + * @param string + * @return void + */ + public function __construct($props = array()) + { + if (count($props) > 0) + { + $this->initialize($props); + } + + log_message('debug', "Image Lib Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * Initialize image properties + * + * Resets values in case this class is used in a loop + * + * @access public + * @return void + */ + function clear() + { + $props = array('source_folder', 'dest_folder', 'source_image', 'full_src_path', 'full_dst_path', 'new_image', 'image_type', 'size_str', 'quality', 'orig_width', 'orig_height', 'width', 'height', 'rotation_angle', 'x_axis', 'y_axis', 'create_fnc', 'copy_fnc', 'wm_overlay_path', 'wm_use_truetype', 'dynamic_output', 'wm_font_size', 'wm_text', 'wm_vrt_alignment', 'wm_hor_alignment', 'wm_padding', 'wm_hor_offset', 'wm_vrt_offset', 'wm_font_color', 'wm_use_drop_shadow', 'wm_shadow_color', 'wm_shadow_distance', 'wm_opacity'); + + foreach ($props as $val) + { + $this->$val = ''; + } + + // special consideration for master_dim + $this->master_dim = 'auto'; + } + + // -------------------------------------------------------------------- + + /** + * initialize image preferences + * + * @access public + * @param array + * @return bool + */ + function initialize($props = array()) + { + /* + * Convert array elements into class variables + */ + if (count($props) > 0) + { + foreach ($props as $key => $val) + { + $this->$key = $val; + } + } + + /* + * Is there a source image? + * + * If not, there's no reason to continue + * + */ + if ($this->source_image == '') + { + $this->set_error('imglib_source_image_required'); + return FALSE; + } + + /* + * Is getimagesize() Available? + * + * We use it to determine the image properties (width/height). + * Note: We need to figure out how to determine image + * properties using ImageMagick and NetPBM + * + */ + if ( ! function_exists('getimagesize')) + { + $this->set_error('imglib_gd_required_for_props'); + return FALSE; + } + + $this->image_library = strtolower($this->image_library); + + /* + * Set the full server path + * + * The source image may or may not contain a path. + * Either way, we'll try use realpath to generate the + * full server path in order to more reliably read it. + * + */ + if (function_exists('realpath') AND @realpath($this->source_image) !== FALSE) + { + $full_source_path = str_replace("\\", "/", realpath($this->source_image)); + } + else + { + $full_source_path = $this->source_image; + } + + $x = explode('/', $full_source_path); + $this->source_image = end($x); + $this->source_folder = str_replace($this->source_image, '', $full_source_path); + + // Set the Image Properties + if ( ! $this->get_image_properties($this->source_folder.$this->source_image)) + { + return FALSE; + } + + /* + * Assign the "new" image name/path + * + * If the user has set a "new_image" name it means + * we are making a copy of the source image. If not + * it means we are altering the original. We'll + * set the destination filename and path accordingly. + * + */ + if ($this->new_image == '') + { + $this->dest_image = $this->source_image; + $this->dest_folder = $this->source_folder; + } + else + { + if (strpos($this->new_image, '/') === FALSE AND strpos($this->new_image, '\\') === FALSE) + { + $this->dest_folder = $this->source_folder; + $this->dest_image = $this->new_image; + } + else + { + if (function_exists('realpath') AND @realpath($this->new_image) !== FALSE) + { + $full_dest_path = str_replace("\\", "/", realpath($this->new_image)); + } + else + { + $full_dest_path = $this->new_image; + } + + // Is there a file name? + if ( ! preg_match("#\.(jpg|jpeg|gif|png)$#i", $full_dest_path)) + { + $this->dest_folder = $full_dest_path.'/'; + $this->dest_image = $this->source_image; + } + else + { + $x = explode('/', $full_dest_path); + $this->dest_image = end($x); + $this->dest_folder = str_replace($this->dest_image, '', $full_dest_path); + } + } + } + + /* + * Compile the finalized filenames/paths + * + * We'll create two master strings containing the + * full server path to the source image and the + * full server path to the destination image. + * We'll also split the destination image name + * so we can insert the thumbnail marker if needed. + * + */ + if ($this->create_thumb === FALSE OR $this->thumb_marker == '') + { + $this->thumb_marker = ''; + } + + $xp = $this->explode_name($this->dest_image); + + $filename = $xp['name']; + $file_ext = $xp['ext']; + + $this->full_src_path = $this->source_folder.$this->source_image; + $this->full_dst_path = $this->dest_folder.$filename.$this->thumb_marker.$file_ext; + + /* + * Should we maintain image proportions? + * + * When creating thumbs or copies, the target width/height + * might not be in correct proportion with the source + * image's width/height. We'll recalculate it here. + * + */ + if ($this->maintain_ratio === TRUE && ($this->width != '' AND $this->height != '')) + { + $this->image_reproportion(); + } + + /* + * Was a width and height specified? + * + * If the destination width/height was + * not submitted we will use the values + * from the actual file + * + */ + if ($this->width == '') + $this->width = $this->orig_width; + + if ($this->height == '') + $this->height = $this->orig_height; + + // Set the quality + $this->quality = trim(str_replace("%", "", $this->quality)); + + if ($this->quality == '' OR $this->quality == 0 OR ! is_numeric($this->quality)) + $this->quality = 90; + + // Set the x/y coordinates + $this->x_axis = ($this->x_axis == '' OR ! is_numeric($this->x_axis)) ? 0 : $this->x_axis; + $this->y_axis = ($this->y_axis == '' OR ! is_numeric($this->y_axis)) ? 0 : $this->y_axis; + + // Watermark-related Stuff... + if ($this->wm_font_color != '') + { + if (strlen($this->wm_font_color) == 6) + { + $this->wm_font_color = '#'.$this->wm_font_color; + } + } + + if ($this->wm_shadow_color != '') + { + if (strlen($this->wm_shadow_color) == 6) + { + $this->wm_shadow_color = '#'.$this->wm_shadow_color; + } + } + + if ($this->wm_overlay_path != '') + { + $this->wm_overlay_path = str_replace("\\", "/", realpath($this->wm_overlay_path)); + } + + if ($this->wm_shadow_color != '') + { + $this->wm_use_drop_shadow = TRUE; + } + + if ($this->wm_font_path != '') + { + $this->wm_use_truetype = TRUE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Image Resize + * + * This is a wrapper function that chooses the proper + * resize function based on the protocol specified + * + * @access public + * @return bool + */ + function resize() + { + $protocol = 'image_process_'.$this->image_library; + + if (preg_match('/gd2$/i', $protocol)) + { + $protocol = 'image_process_gd'; + } + + return $this->$protocol('resize'); + } + + // -------------------------------------------------------------------- + + /** + * Image Crop + * + * This is a wrapper function that chooses the proper + * cropping function based on the protocol specified + * + * @access public + * @return bool + */ + function crop() + { + $protocol = 'image_process_'.$this->image_library; + + if (preg_match('/gd2$/i', $protocol)) + { + $protocol = 'image_process_gd'; + } + + return $this->$protocol('crop'); + } + + // -------------------------------------------------------------------- + + /** + * Image Rotate + * + * This is a wrapper function that chooses the proper + * rotation function based on the protocol specified + * + * @access public + * @return bool + */ + function rotate() + { + // Allowed rotation values + $degs = array(90, 180, 270, 'vrt', 'hor'); + + if ($this->rotation_angle == '' OR ! in_array($this->rotation_angle, $degs)) + { + $this->set_error('imglib_rotation_angle_required'); + return FALSE; + } + + // Reassign the width and height + if ($this->rotation_angle == 90 OR $this->rotation_angle == 270) + { + $this->width = $this->orig_height; + $this->height = $this->orig_width; + } + else + { + $this->width = $this->orig_width; + $this->height = $this->orig_height; + } + + + // Choose resizing function + if ($this->image_library == 'imagemagick' OR $this->image_library == 'netpbm') + { + $protocol = 'image_process_'.$this->image_library; + + return $this->$protocol('rotate'); + } + + if ($this->rotation_angle == 'hor' OR $this->rotation_angle == 'vrt') + { + return $this->image_mirror_gd(); + } + else + { + return $this->image_rotate_gd(); + } + } + + // -------------------------------------------------------------------- + + /** + * Image Process Using GD/GD2 + * + * This function will resize or crop + * + * @access public + * @param string + * @return bool + */ + function image_process_gd($action = 'resize') + { + $v2_override = FALSE; + + // If the target width/height match the source, AND if the new file name is not equal to the old file name + // we'll simply make a copy of the original with the new name... assuming dynamic rendering is off. + if ($this->dynamic_output === FALSE) + { + if ($this->orig_width == $this->width AND $this->orig_height == $this->height) + { + if ($this->source_image != $this->new_image) + { + if (@copy($this->full_src_path, $this->full_dst_path)) + { + @chmod($this->full_dst_path, FILE_WRITE_MODE); + } + } + + return TRUE; + } + } + + // Let's set up our values based on the action + if ($action == 'crop') + { + // Reassign the source width/height if cropping + $this->orig_width = $this->width; + $this->orig_height = $this->height; + + // GD 2.0 has a cropping bug so we'll test for it + if ($this->gd_version() !== FALSE) + { + $gd_version = str_replace('0', '', $this->gd_version()); + $v2_override = ($gd_version == 2) ? TRUE : FALSE; + } + } + else + { + // If resizing the x/y axis must be zero + $this->x_axis = 0; + $this->y_axis = 0; + } + + // Create the image handle + if ( ! ($src_img = $this->image_create_gd())) + { + return FALSE; + } + + // Create The Image + // + // old conditional which users report cause problems with shared GD libs who report themselves as "2.0 or greater" + // it appears that this is no longer the issue that it was in 2004, so we've removed it, retaining it in the comment + // below should that ever prove inaccurate. + // + // if ($this->image_library == 'gd2' AND function_exists('imagecreatetruecolor') AND $v2_override == FALSE) + if ($this->image_library == 'gd2' AND function_exists('imagecreatetruecolor')) + { + $create = 'imagecreatetruecolor'; + $copy = 'imagecopyresampled'; + } + else + { + $create = 'imagecreate'; + $copy = 'imagecopyresized'; + } + + $dst_img = $create($this->width, $this->height); + + if ($this->image_type == 3) // png we can actually preserve transparency + { + imagealphablending($dst_img, FALSE); + imagesavealpha($dst_img, TRUE); + } + + $copy($dst_img, $src_img, 0, 0, $this->x_axis, $this->y_axis, $this->width, $this->height, $this->orig_width, $this->orig_height); + + // Show the image + if ($this->dynamic_output == TRUE) + { + $this->image_display_gd($dst_img); + } + else + { + // Or save it + if ( ! $this->image_save_gd($dst_img)) + { + return FALSE; + } + } + + // Kill the file handles + imagedestroy($dst_img); + imagedestroy($src_img); + + // Set the file to 777 + @chmod($this->full_dst_path, FILE_WRITE_MODE); + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Image Process Using ImageMagick + * + * This function will resize, crop or rotate + * + * @access public + * @param string + * @return bool + */ + function image_process_imagemagick($action = 'resize') + { + // Do we have a vaild library path? + if ($this->library_path == '') + { + $this->set_error('imglib_libpath_invalid'); + return FALSE; + } + + if ( ! preg_match("/convert$/i", $this->library_path)) + { + $this->library_path = rtrim($this->library_path, '/').'/'; + + $this->library_path .= 'convert'; + } + + // Execute the command + $cmd = $this->library_path." -quality ".$this->quality; + + if ($action == 'crop') + { + $cmd .= " -crop ".$this->width."x".$this->height."+".$this->x_axis."+".$this->y_axis." \"$this->full_src_path\" \"$this->full_dst_path\" 2>&1"; + } + elseif ($action == 'rotate') + { + switch ($this->rotation_angle) + { + case 'hor' : $angle = '-flop'; + break; + case 'vrt' : $angle = '-flip'; + break; + default : $angle = '-rotate '.$this->rotation_angle; + break; + } + + $cmd .= " ".$angle." \"$this->full_src_path\" \"$this->full_dst_path\" 2>&1"; + } + else // Resize + { + $cmd .= " -resize ".$this->width."x".$this->height." \"$this->full_src_path\" \"$this->full_dst_path\" 2>&1"; + } + + $retval = 1; + + @exec($cmd, $output, $retval); + + // Did it work? + if ($retval > 0) + { + $this->set_error('imglib_image_process_failed'); + return FALSE; + } + + // Set the file to 777 + @chmod($this->full_dst_path, FILE_WRITE_MODE); + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Image Process Using NetPBM + * + * This function will resize, crop or rotate + * + * @access public + * @param string + * @return bool + */ + function image_process_netpbm($action = 'resize') + { + if ($this->library_path == '') + { + $this->set_error('imglib_libpath_invalid'); + return FALSE; + } + + // Build the resizing command + switch ($this->image_type) + { + case 1 : + $cmd_in = 'giftopnm'; + $cmd_out = 'ppmtogif'; + break; + case 2 : + $cmd_in = 'jpegtopnm'; + $cmd_out = 'ppmtojpeg'; + break; + case 3 : + $cmd_in = 'pngtopnm'; + $cmd_out = 'ppmtopng'; + break; + } + + if ($action == 'crop') + { + $cmd_inner = 'pnmcut -left '.$this->x_axis.' -top '.$this->y_axis.' -width '.$this->width.' -height '.$this->height; + } + elseif ($action == 'rotate') + { + switch ($this->rotation_angle) + { + case 90 : $angle = 'r270'; + break; + case 180 : $angle = 'r180'; + break; + case 270 : $angle = 'r90'; + break; + case 'vrt' : $angle = 'tb'; + break; + case 'hor' : $angle = 'lr'; + break; + } + + $cmd_inner = 'pnmflip -'.$angle.' '; + } + else // Resize + { + $cmd_inner = 'pnmscale -xysize '.$this->width.' '.$this->height; + } + + $cmd = $this->library_path.$cmd_in.' '.$this->full_src_path.' | '.$cmd_inner.' | '.$cmd_out.' > '.$this->dest_folder.'netpbm.tmp'; + + $retval = 1; + + @exec($cmd, $output, $retval); + + // Did it work? + if ($retval > 0) + { + $this->set_error('imglib_image_process_failed'); + return FALSE; + } + + // With NetPBM we have to create a temporary image. + // If you try manipulating the original it fails so + // we have to rename the temp file. + copy ($this->dest_folder.'netpbm.tmp', $this->full_dst_path); + unlink ($this->dest_folder.'netpbm.tmp'); + @chmod($this->full_dst_path, FILE_WRITE_MODE); + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Image Rotate Using GD + * + * @access public + * @return bool + */ + function image_rotate_gd() + { + // Create the image handle + if ( ! ($src_img = $this->image_create_gd())) + { + return FALSE; + } + + // Set the background color + // This won't work with transparent PNG files so we are + // going to have to figure out how to determine the color + // of the alpha channel in a future release. + + $white = imagecolorallocate($src_img, 255, 255, 255); + + // Rotate it! + $dst_img = imagerotate($src_img, $this->rotation_angle, $white); + + // Save the Image + if ($this->dynamic_output == TRUE) + { + $this->image_display_gd($dst_img); + } + else + { + // Or save it + if ( ! $this->image_save_gd($dst_img)) + { + return FALSE; + } + } + + // Kill the file handles + imagedestroy($dst_img); + imagedestroy($src_img); + + // Set the file to 777 + + @chmod($this->full_dst_path, FILE_WRITE_MODE); + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Create Mirror Image using GD + * + * This function will flip horizontal or vertical + * + * @access public + * @return bool + */ + function image_mirror_gd() + { + if ( ! $src_img = $this->image_create_gd()) + { + return FALSE; + } + + $width = $this->orig_width; + $height = $this->orig_height; + + if ($this->rotation_angle == 'hor') + { + for ($i = 0; $i < $height; $i++) + { + $left = 0; + $right = $width-1; + + while ($left < $right) + { + $cl = imagecolorat($src_img, $left, $i); + $cr = imagecolorat($src_img, $right, $i); + + imagesetpixel($src_img, $left, $i, $cr); + imagesetpixel($src_img, $right, $i, $cl); + + $left++; + $right--; + } + } + } + else + { + for ($i = 0; $i < $width; $i++) + { + $top = 0; + $bot = $height-1; + + while ($top < $bot) + { + $ct = imagecolorat($src_img, $i, $top); + $cb = imagecolorat($src_img, $i, $bot); + + imagesetpixel($src_img, $i, $top, $cb); + imagesetpixel($src_img, $i, $bot, $ct); + + $top++; + $bot--; + } + } + } + + // Show the image + if ($this->dynamic_output == TRUE) + { + $this->image_display_gd($src_img); + } + else + { + // Or save it + if ( ! $this->image_save_gd($src_img)) + { + return FALSE; + } + } + + // Kill the file handles + imagedestroy($src_img); + + // Set the file to 777 + @chmod($this->full_dst_path, FILE_WRITE_MODE); + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Image Watermark + * + * This is a wrapper function that chooses the type + * of watermarking based on the specified preference. + * + * @access public + * @param string + * @return bool + */ + function watermark() + { + if ($this->wm_type == 'overlay') + { + return $this->overlay_watermark(); + } + else + { + return $this->text_watermark(); + } + } + + // -------------------------------------------------------------------- + + /** + * Watermark - Graphic Version + * + * @access public + * @return bool + */ + function overlay_watermark() + { + if ( ! function_exists('imagecolortransparent')) + { + $this->set_error('imglib_gd_required'); + return FALSE; + } + + // Fetch source image properties + $this->get_image_properties(); + + // Fetch watermark image properties + $props = $this->get_image_properties($this->wm_overlay_path, TRUE); + $wm_img_type = $props['image_type']; + $wm_width = $props['width']; + $wm_height = $props['height']; + + // Create two image resources + $wm_img = $this->image_create_gd($this->wm_overlay_path, $wm_img_type); + $src_img = $this->image_create_gd($this->full_src_path); + + // Reverse the offset if necessary + // When the image is positioned at the bottom + // we don't want the vertical offset to push it + // further down. We want the reverse, so we'll + // invert the offset. Same with the horizontal + // offset when the image is at the right + + $this->wm_vrt_alignment = strtoupper(substr($this->wm_vrt_alignment, 0, 1)); + $this->wm_hor_alignment = strtoupper(substr($this->wm_hor_alignment, 0, 1)); + + if ($this->wm_vrt_alignment == 'B') + $this->wm_vrt_offset = $this->wm_vrt_offset * -1; + + if ($this->wm_hor_alignment == 'R') + $this->wm_hor_offset = $this->wm_hor_offset * -1; + + // Set the base x and y axis values + $x_axis = $this->wm_hor_offset + $this->wm_padding; + $y_axis = $this->wm_vrt_offset + $this->wm_padding; + + // Set the vertical position + switch ($this->wm_vrt_alignment) + { + case 'T': + break; + case 'M': $y_axis += ($this->orig_height / 2) - ($wm_height / 2); + break; + case 'B': $y_axis += $this->orig_height - $wm_height; + break; + } + + // Set the horizontal position + switch ($this->wm_hor_alignment) + { + case 'L': + break; + case 'C': $x_axis += ($this->orig_width / 2) - ($wm_width / 2); + break; + case 'R': $x_axis += $this->orig_width - $wm_width; + break; + } + + // Build the finalized image + if ($wm_img_type == 3 AND function_exists('imagealphablending')) + { + @imagealphablending($src_img, TRUE); + } + + // Set RGB values for text and shadow + $rgba = imagecolorat($wm_img, $this->wm_x_transp, $this->wm_y_transp); + $alpha = ($rgba & 0x7F000000) >> 24; + + // make a best guess as to whether we're dealing with an image with alpha transparency or no/binary transparency + if ($alpha > 0) + { + // copy the image directly, the image's alpha transparency being the sole determinant of blending + imagecopy($src_img, $wm_img, $x_axis, $y_axis, 0, 0, $wm_width, $wm_height); + } + else + { + // set our RGB value from above to be transparent and merge the images with the specified opacity + imagecolortransparent($wm_img, imagecolorat($wm_img, $this->wm_x_transp, $this->wm_y_transp)); + imagecopymerge($src_img, $wm_img, $x_axis, $y_axis, 0, 0, $wm_width, $wm_height, $this->wm_opacity); + } + + // Output the image + if ($this->dynamic_output == TRUE) + { + $this->image_display_gd($src_img); + } + else + { + if ( ! $this->image_save_gd($src_img)) + { + return FALSE; + } + } + + imagedestroy($src_img); + imagedestroy($wm_img); + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Watermark - Text Version + * + * @access public + * @return bool + */ + function text_watermark() + { + if ( ! ($src_img = $this->image_create_gd())) + { + return FALSE; + } + + if ($this->wm_use_truetype == TRUE AND ! file_exists($this->wm_font_path)) + { + $this->set_error('imglib_missing_font'); + return FALSE; + } + + // Fetch source image properties + $this->get_image_properties(); + + // Set RGB values for text and shadow + $this->wm_font_color = str_replace('#', '', $this->wm_font_color); + $this->wm_shadow_color = str_replace('#', '', $this->wm_shadow_color); + + $R1 = hexdec(substr($this->wm_font_color, 0, 2)); + $G1 = hexdec(substr($this->wm_font_color, 2, 2)); + $B1 = hexdec(substr($this->wm_font_color, 4, 2)); + + $R2 = hexdec(substr($this->wm_shadow_color, 0, 2)); + $G2 = hexdec(substr($this->wm_shadow_color, 2, 2)); + $B2 = hexdec(substr($this->wm_shadow_color, 4, 2)); + + $txt_color = imagecolorclosest($src_img, $R1, $G1, $B1); + $drp_color = imagecolorclosest($src_img, $R2, $G2, $B2); + + // Reverse the vertical offset + // When the image is positioned at the bottom + // we don't want the vertical offset to push it + // further down. We want the reverse, so we'll + // invert the offset. Note: The horizontal + // offset flips itself automatically + + if ($this->wm_vrt_alignment == 'B') + $this->wm_vrt_offset = $this->wm_vrt_offset * -1; + + if ($this->wm_hor_alignment == 'R') + $this->wm_hor_offset = $this->wm_hor_offset * -1; + + // Set font width and height + // These are calculated differently depending on + // whether we are using the true type font or not + if ($this->wm_use_truetype == TRUE) + { + if ($this->wm_font_size == '') + $this->wm_font_size = '17'; + + $fontwidth = $this->wm_font_size-($this->wm_font_size/4); + $fontheight = $this->wm_font_size; + $this->wm_vrt_offset += $this->wm_font_size; + } + else + { + $fontwidth = imagefontwidth($this->wm_font_size); + $fontheight = imagefontheight($this->wm_font_size); + } + + // Set base X and Y axis values + $x_axis = $this->wm_hor_offset + $this->wm_padding; + $y_axis = $this->wm_vrt_offset + $this->wm_padding; + + // Set verticle alignment + if ($this->wm_use_drop_shadow == FALSE) + $this->wm_shadow_distance = 0; + + $this->wm_vrt_alignment = strtoupper(substr($this->wm_vrt_alignment, 0, 1)); + $this->wm_hor_alignment = strtoupper(substr($this->wm_hor_alignment, 0, 1)); + + switch ($this->wm_vrt_alignment) + { + case "T" : + break; + case "M": $y_axis += ($this->orig_height/2)+($fontheight/2); + break; + case "B": $y_axis += ($this->orig_height - $fontheight - $this->wm_shadow_distance - ($fontheight/2)); + break; + } + + $x_shad = $x_axis + $this->wm_shadow_distance; + $y_shad = $y_axis + $this->wm_shadow_distance; + + // Set horizontal alignment + switch ($this->wm_hor_alignment) + { + case "L": + break; + case "R": + if ($this->wm_use_drop_shadow) + $x_shad += ($this->orig_width - $fontwidth*strlen($this->wm_text)); + $x_axis += ($this->orig_width - $fontwidth*strlen($this->wm_text)); + break; + case "C": + if ($this->wm_use_drop_shadow) + $x_shad += floor(($this->orig_width - $fontwidth*strlen($this->wm_text))/2); + $x_axis += floor(($this->orig_width -$fontwidth*strlen($this->wm_text))/2); + break; + } + + // Add the text to the source image + if ($this->wm_use_truetype) + { + if ($this->wm_use_drop_shadow) + imagettftext($src_img, $this->wm_font_size, 0, $x_shad, $y_shad, $drp_color, $this->wm_font_path, $this->wm_text); + imagettftext($src_img, $this->wm_font_size, 0, $x_axis, $y_axis, $txt_color, $this->wm_font_path, $this->wm_text); + } + else + { + if ($this->wm_use_drop_shadow) + imagestring($src_img, $this->wm_font_size, $x_shad, $y_shad, $this->wm_text, $drp_color); + imagestring($src_img, $this->wm_font_size, $x_axis, $y_axis, $this->wm_text, $txt_color); + } + + // Output the final image + if ($this->dynamic_output == TRUE) + { + $this->image_display_gd($src_img); + } + else + { + $this->image_save_gd($src_img); + } + + imagedestroy($src_img); + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Create Image - GD + * + * This simply creates an image resource handle + * based on the type of image being processed + * + * @access public + * @param string + * @return resource + */ + function image_create_gd($path = '', $image_type = '') + { + if ($path == '') + $path = $this->full_src_path; + + if ($image_type == '') + $image_type = $this->image_type; + + + switch ($image_type) + { + case 1 : + if ( ! function_exists('imagecreatefromgif')) + { + $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_gif_not_supported')); + return FALSE; + } + + return imagecreatefromgif($path); + break; + case 2 : + if ( ! function_exists('imagecreatefromjpeg')) + { + $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_jpg_not_supported')); + return FALSE; + } + + return imagecreatefromjpeg($path); + break; + case 3 : + if ( ! function_exists('imagecreatefrompng')) + { + $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_png_not_supported')); + return FALSE; + } + + return imagecreatefrompng($path); + break; + + } + + $this->set_error(array('imglib_unsupported_imagecreate')); + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Write image file to disk - GD + * + * Takes an image resource as input and writes the file + * to the specified destination + * + * @access public + * @param resource + * @return bool + */ + function image_save_gd($resource) + { + switch ($this->image_type) + { + case 1 : + if ( ! function_exists('imagegif')) + { + $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_gif_not_supported')); + return FALSE; + } + + if ( ! @imagegif($resource, $this->full_dst_path)) + { + $this->set_error('imglib_save_failed'); + return FALSE; + } + break; + case 2 : + if ( ! function_exists('imagejpeg')) + { + $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_jpg_not_supported')); + return FALSE; + } + + if ( ! @imagejpeg($resource, $this->full_dst_path, $this->quality)) + { + $this->set_error('imglib_save_failed'); + return FALSE; + } + break; + case 3 : + if ( ! function_exists('imagepng')) + { + $this->set_error(array('imglib_unsupported_imagecreate', 'imglib_png_not_supported')); + return FALSE; + } + + if ( ! @imagepng($resource, $this->full_dst_path)) + { + $this->set_error('imglib_save_failed'); + return FALSE; + } + break; + default : + $this->set_error(array('imglib_unsupported_imagecreate')); + return FALSE; + break; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Dynamically outputs an image + * + * @access public + * @param resource + * @return void + */ + function image_display_gd($resource) + { + header("Content-Disposition: filename={$this->source_image};"); + header("Content-Type: {$this->mime_type}"); + header('Content-Transfer-Encoding: binary'); + header('Last-Modified: '.gmdate('D, d M Y H:i:s', time()).' GMT'); + + switch ($this->image_type) + { + case 1 : imagegif($resource); + break; + case 2 : imagejpeg($resource, '', $this->quality); + break; + case 3 : imagepng($resource); + break; + default : echo 'Unable to display the image'; + break; + } + } + + // -------------------------------------------------------------------- + + /** + * Re-proportion Image Width/Height + * + * When creating thumbs, the desired width/height + * can end up warping the image due to an incorrect + * ratio between the full-sized image and the thumb. + * + * This function lets us re-proportion the width/height + * if users choose to maintain the aspect ratio when resizing. + * + * @access public + * @return void + */ + function image_reproportion() + { + if ( ! is_numeric($this->width) OR ! is_numeric($this->height) OR $this->width == 0 OR $this->height == 0) + return; + + if ( ! is_numeric($this->orig_width) OR ! is_numeric($this->orig_height) OR $this->orig_width == 0 OR $this->orig_height == 0) + return; + + $new_width = ceil($this->orig_width*$this->height/$this->orig_height); + $new_height = ceil($this->width*$this->orig_height/$this->orig_width); + + $ratio = (($this->orig_height/$this->orig_width) - ($this->height/$this->width)); + + if ($this->master_dim != 'width' AND $this->master_dim != 'height') + { + $this->master_dim = ($ratio < 0) ? 'width' : 'height'; + } + + if (($this->width != $new_width) AND ($this->height != $new_height)) + { + if ($this->master_dim == 'height') + { + $this->width = $new_width; + } + else + { + $this->height = $new_height; + } + } + } + + // -------------------------------------------------------------------- + + /** + * Get image properties + * + * A helper function that gets info about the file + * + * @access public + * @param string + * @return mixed + */ + function get_image_properties($path = '', $return = FALSE) + { + // For now we require GD but we should + // find a way to determine this using IM or NetPBM + + if ($path == '') + $path = $this->full_src_path; + + if ( ! file_exists($path)) + { + $this->set_error('imglib_invalid_path'); + return FALSE; + } + + $vals = @getimagesize($path); + + $types = array(1 => 'gif', 2 => 'jpeg', 3 => 'png'); + + $mime = (isset($types[$vals['2']])) ? 'image/'.$types[$vals['2']] : 'image/jpg'; + + if ($return == TRUE) + { + $v['width'] = $vals['0']; + $v['height'] = $vals['1']; + $v['image_type'] = $vals['2']; + $v['size_str'] = $vals['3']; + $v['mime_type'] = $mime; + + return $v; + } + + $this->orig_width = $vals['0']; + $this->orig_height = $vals['1']; + $this->image_type = $vals['2']; + $this->size_str = $vals['3']; + $this->mime_type = $mime; + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Size calculator + * + * This function takes a known width x height and + * recalculates it to a new size. Only one + * new variable needs to be known + * + * $props = array( + * 'width' => $width, + * 'height' => $height, + * 'new_width' => 40, + * 'new_height' => '' + * ); + * + * @access public + * @param array + * @return array + */ + function size_calculator($vals) + { + if ( ! is_array($vals)) + { + return; + } + + $allowed = array('new_width', 'new_height', 'width', 'height'); + + foreach ($allowed as $item) + { + if ( ! isset($vals[$item]) OR $vals[$item] == '') + $vals[$item] = 0; + } + + if ($vals['width'] == 0 OR $vals['height'] == 0) + { + return $vals; + } + + if ($vals['new_width'] == 0) + { + $vals['new_width'] = ceil($vals['width']*$vals['new_height']/$vals['height']); + } + elseif ($vals['new_height'] == 0) + { + $vals['new_height'] = ceil($vals['new_width']*$vals['height']/$vals['width']); + } + + return $vals; + } + + // -------------------------------------------------------------------- + + /** + * Explode source_image + * + * This is a helper function that extracts the extension + * from the source_image. This function lets us deal with + * source_images with multiple periods, like: my.cool.jpg + * It returns an associative array with two elements: + * $array['ext'] = '.jpg'; + * $array['name'] = 'my.cool'; + * + * @access public + * @param array + * @return array + */ + function explode_name($source_image) + { + $ext = strrchr($source_image, '.'); + $name = ($ext === FALSE) ? $source_image : substr($source_image, 0, -strlen($ext)); + + return array('ext' => $ext, 'name' => $name); + } + + // -------------------------------------------------------------------- + + /** + * Is GD Installed? + * + * @access public + * @return bool + */ + function gd_loaded() + { + if ( ! extension_loaded('gd')) + { + if ( ! dl('gd.so')) + { + return FALSE; + } + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Get GD version + * + * @access public + * @return mixed + */ + function gd_version() + { + if (function_exists('gd_info')) + { + $gd_version = @gd_info(); + $gd_version = preg_replace("/\D/", "", $gd_version['GD Version']); + + return $gd_version; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Set error message + * + * @access public + * @param string + * @return void + */ + function set_error($msg) + { + $CI =& get_instance(); + $CI->lang->load('imglib'); + + if (is_array($msg)) + { + foreach ($msg as $val) + { + + $msg = ($CI->lang->line($val) == FALSE) ? $val : $CI->lang->line($val); + $this->error_msg[] = $msg; + log_message('error', $msg); + } + } + else + { + $msg = ($CI->lang->line($msg) == FALSE) ? $msg : $CI->lang->line($msg); + $this->error_msg[] = $msg; + log_message('error', $msg); + } + } + + // -------------------------------------------------------------------- + + /** + * Show error messages + * + * @access public + * @param string + * @return string + */ + function display_errors($open = '<p>', $close = '</p>') + { + $str = ''; + foreach ($this->error_msg as $val) + { + $str .= $open.$val.$close; + } + + return $str; + } + +} +// END Image_lib Class + +/* End of file Image_lib.php */ +/* Location: ./system/libraries/Image_lib.php */ \ No newline at end of file diff --git a/system/libraries/Javascript.php b/system/libraries/Javascript.php new file mode 100644 index 0000000..8511d0a --- /dev/null +++ b/system/libraries/Javascript.php @@ -0,0 +1,872 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Javascript Class + * + * @package CodeIgniter + * @subpackage Libraries + * @category Javascript + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/javascript.html + */ +class CI_Javascript { + + var $_javascript_location = 'js'; + + public function __construct($params = array()) + { + $defaults = array('js_library_driver' => 'jquery', 'autoload' => TRUE); + + foreach ($defaults as $key => $val) + { + if (isset($params[$key]) && $params[$key] !== "") + { + $defaults[$key] = $params[$key]; + } + } + + extract($defaults); + + $this->CI =& get_instance(); + + // load the requested js library + $this->CI->load->library('javascript/'.$js_library_driver, array('autoload' => $autoload)); + // make js to refer to current library + $this->js =& $this->CI->$js_library_driver; + + log_message('debug', "Javascript Class Initialized and loaded. Driver used: $js_library_driver"); + } + + // -------------------------------------------------------------------- + // Event Code + // -------------------------------------------------------------------- + + /** + * Blur + * + * Outputs a javascript library blur event + * + * @access public + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function blur($element = 'this', $js = '') + { + return $this->js->_blur($element, $js); + } + + // -------------------------------------------------------------------- + + /** + * Change + * + * Outputs a javascript library change event + * + * @access public + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function change($element = 'this', $js = '') + { + return $this->js->_change($element, $js); + } + + // -------------------------------------------------------------------- + + /** + * Click + * + * Outputs a javascript library click event + * + * @access public + * @param string The element to attach the event to + * @param string The code to execute + * @param boolean whether or not to return false + * @return string + */ + function click($element = 'this', $js = '', $ret_false = TRUE) + { + return $this->js->_click($element, $js, $ret_false); + } + + // -------------------------------------------------------------------- + + /** + * Double Click + * + * Outputs a javascript library dblclick event + * + * @access public + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function dblclick($element = 'this', $js = '') + { + return $this->js->_dblclick($element, $js); + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Outputs a javascript library error event + * + * @access public + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function error($element = 'this', $js = '') + { + return $this->js->_error($element, $js); + } + + // -------------------------------------------------------------------- + + /** + * Focus + * + * Outputs a javascript library focus event + * + * @access public + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function focus($element = 'this', $js = '') + { + return $this->js->__add_event($focus, $js); + } + + // -------------------------------------------------------------------- + + /** + * Hover + * + * Outputs a javascript library hover event + * + * @access public + * @param string - element + * @param string - Javascript code for mouse over + * @param string - Javascript code for mouse out + * @return string + */ + function hover($element = 'this', $over, $out) + { + return $this->js->__hover($element, $over, $out); + } + + // -------------------------------------------------------------------- + + /** + * Keydown + * + * Outputs a javascript library keydown event + * + * @access public + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function keydown($element = 'this', $js = '') + { + return $this->js->_keydown($element, $js); + } + + // -------------------------------------------------------------------- + + /** + * Keyup + * + * Outputs a javascript library keydown event + * + * @access public + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function keyup($element = 'this', $js = '') + { + return $this->js->_keyup($element, $js); + } + + // -------------------------------------------------------------------- + + /** + * Load + * + * Outputs a javascript library load event + * + * @access public + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function load($element = 'this', $js = '') + { + return $this->js->_load($element, $js); + } + + // -------------------------------------------------------------------- + + /** + * Mousedown + * + * Outputs a javascript library mousedown event + * + * @access public + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function mousedown($element = 'this', $js = '') + { + return $this->js->_mousedown($element, $js); + } + + // -------------------------------------------------------------------- + + /** + * Mouse Out + * + * Outputs a javascript library mouseout event + * + * @access public + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function mouseout($element = 'this', $js = '') + { + return $this->js->_mouseout($element, $js); + } + + // -------------------------------------------------------------------- + + /** + * Mouse Over + * + * Outputs a javascript library mouseover event + * + * @access public + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function mouseover($element = 'this', $js = '') + { + return $this->js->_mouseover($element, $js); + } + + // -------------------------------------------------------------------- + + /** + * Mouseup + * + * Outputs a javascript library mouseup event + * + * @access public + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function mouseup($element = 'this', $js = '') + { + return $this->js->_mouseup($element, $js); + } + + // -------------------------------------------------------------------- + + /** + * Output + * + * Outputs the called javascript to the screen + * + * @access public + * @param string The code to output + * @return string + */ + function output($js) + { + return $this->js->_output($js); + } + + // -------------------------------------------------------------------- + + /** + * Ready + * + * Outputs a javascript library mouseup event + * + * @access public + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function ready($js) + { + return $this->js->_document_ready($js); + } + + // -------------------------------------------------------------------- + + /** + * Resize + * + * Outputs a javascript library resize event + * + * @access public + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function resize($element = 'this', $js = '') + { + return $this->js->_resize($element, $js); + } + + // -------------------------------------------------------------------- + + /** + * Scroll + * + * Outputs a javascript library scroll event + * + * @access public + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function scroll($element = 'this', $js = '') + { + return $this->js->_scroll($element, $js); + } + + // -------------------------------------------------------------------- + + /** + * Unload + * + * Outputs a javascript library unload event + * + * @access public + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function unload($element = 'this', $js = '') + { + return $this->js->_unload($element, $js); + } + + // -------------------------------------------------------------------- + // Effects + // -------------------------------------------------------------------- + + + /** + * Add Class + * + * Outputs a javascript library addClass event + * + * @access public + * @param string - element + * @param string - Class to add + * @return string + */ + function addClass($element = 'this', $class = '') + { + return $this->js->_addClass($element, $class); + } + + // -------------------------------------------------------------------- + + /** + * Animate + * + * Outputs a javascript library animate event + * + * @access public + * @param string - element + * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds + * @param string - Javascript callback function + * @return string + */ + function animate($element = 'this', $params = array(), $speed = '', $extra = '') + { + return $this->js->_animate($element, $params, $speed, $extra); + } + + // -------------------------------------------------------------------- + + /** + * Fade In + * + * Outputs a javascript library hide event + * + * @access public + * @param string - element + * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds + * @param string - Javascript callback function + * @return string + */ + function fadeIn($element = 'this', $speed = '', $callback = '') + { + return $this->js->_fadeIn($element, $speed, $callback); + } + + // -------------------------------------------------------------------- + + /** + * Fade Out + * + * Outputs a javascript library hide event + * + * @access public + * @param string - element + * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds + * @param string - Javascript callback function + * @return string + */ + function fadeOut($element = 'this', $speed = '', $callback = '') + { + return $this->js->_fadeOut($element, $speed, $callback); + } + // -------------------------------------------------------------------- + + /** + * Slide Up + * + * Outputs a javascript library slideUp event + * + * @access public + * @param string - element + * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds + * @param string - Javascript callback function + * @return string + */ + function slideUp($element = 'this', $speed = '', $callback = '') + { + return $this->js->_slideUp($element, $speed, $callback); + + } + + // -------------------------------------------------------------------- + + /** + * Remove Class + * + * Outputs a javascript library removeClass event + * + * @access public + * @param string - element + * @param string - Class to add + * @return string + */ + function removeClass($element = 'this', $class = '') + { + return $this->js->_removeClass($element, $class); + } + + // -------------------------------------------------------------------- + + /** + * Slide Down + * + * Outputs a javascript library slideDown event + * + * @access public + * @param string - element + * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds + * @param string - Javascript callback function + * @return string + */ + function slideDown($element = 'this', $speed = '', $callback = '') + { + return $this->js->_slideDown($element, $speed, $callback); + } + + // -------------------------------------------------------------------- + + /** + * Slide Toggle + * + * Outputs a javascript library slideToggle event + * + * @access public + * @param string - element + * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds + * @param string - Javascript callback function + * @return string + */ + function slideToggle($element = 'this', $speed = '', $callback = '') + { + return $this->js->_slideToggle($element, $speed, $callback); + + } + + // -------------------------------------------------------------------- + + /** + * Hide + * + * Outputs a javascript library hide action + * + * @access public + * @param string - element + * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds + * @param string - Javascript callback function + * @return string + */ + function hide($element = 'this', $speed = '', $callback = '') + { + return $this->js->_hide($element, $speed, $callback); + } + + // -------------------------------------------------------------------- + + /** + * Toggle + * + * Outputs a javascript library toggle event + * + * @access public + * @param string - element + * @return string + */ + function toggle($element = 'this') + { + return $this->js->_toggle($element); + + } + + // -------------------------------------------------------------------- + + /** + * Toggle Class + * + * Outputs a javascript library toggle class event + * + * @access public + * @param string - element + * @return string + */ + function toggleClass($element = 'this', $class='') + { + return $this->js->_toggleClass($element, $class); + } + + // -------------------------------------------------------------------- + + /** + * Show + * + * Outputs a javascript library show event + * + * @access public + * @param string - element + * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds + * @param string - Javascript callback function + * @return string + */ + function show($element = 'this', $speed = '', $callback = '') + { + return $this->js->_show($element, $speed, $callback); + } + + + // -------------------------------------------------------------------- + + /** + * Compile + * + * gather together all script needing to be output + * + * @access public + * @param string The element to attach the event to + * @return string + */ + function compile($view_var = 'script_foot', $script_tags = TRUE) + { + $this->js->_compile($view_var, $script_tags); + } + + /** + * Clear Compile + * + * Clears any previous javascript collected for output + * + * @access public + * @return void + */ + function clear_compile() + { + $this->js->_clear_compile(); + } + + // -------------------------------------------------------------------- + + /** + * External + * + * Outputs a <script> tag with the source as an external js file + * + * @access public + * @param string The element to attach the event to + * @return string + */ + function external($external_file = '', $relative = FALSE) + { + if ($external_file !== '') + { + $this->_javascript_location = $external_file; + } + else + { + if ($this->CI->config->item('javascript_location') != '') + { + $this->_javascript_location = $this->CI->config->item('javascript_location'); + } + } + + if ($relative === TRUE OR strncmp($external_file, 'http://', 7) == 0 OR strncmp($external_file, 'https://', 8) == 0) + { + $str = $this->_open_script($external_file); + } + elseif (strpos($this->_javascript_location, 'http://') !== FALSE) + { + $str = $this->_open_script($this->_javascript_location.$external_file); + } + else + { + $str = $this->_open_script($this->CI->config->slash_item('base_url').$this->_javascript_location.$external_file); + } + + $str .= $this->_close_script(); + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Inline + * + * Outputs a <script> tag + * + * @access public + * @param string The element to attach the event to + * @param boolean If a CDATA section should be added + * @return string + */ + function inline($script, $cdata = TRUE) + { + $str = $this->_open_script(); + $str .= ($cdata) ? "\n// <![CDATA[\n{$script}\n// ]]>\n" : "\n{$script}\n"; + $str .= $this->_close_script(); + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Open Script + * + * Outputs an opening <script> + * + * @access private + * @param string + * @return string + */ + function _open_script($src = '') + { + $str = '<script type="text/javascript" charset="'.strtolower($this->CI->config->item('charset')).'"'; + $str .= ($src == '') ? '>' : ' src="'.$src.'">'; + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Close Script + * + * Outputs an closing </script> + * + * @access private + * @param string + * @return string + */ + function _close_script($extra = "\n") + { + return "</script>$extra"; + } + + + // -------------------------------------------------------------------- + // -------------------------------------------------------------------- + // AJAX-Y STUFF - still a testbed + // -------------------------------------------------------------------- + // -------------------------------------------------------------------- + + /** + * Update + * + * Outputs a javascript library slideDown event + * + * @access public + * @param string - element + * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds + * @param string - Javascript callback function + * @return string + */ + function update($element = 'this', $speed = '', $callback = '') + { + return $this->js->_updater($element, $speed, $callback); + } + + // -------------------------------------------------------------------- + + /** + * Generate JSON + * + * Can be passed a database result or associative array and returns a JSON formatted string + * + * @param mixed result set or array + * @param bool match array types (defaults to objects) + * @return string a json formatted string + */ + function generate_json($result = NULL, $match_array_type = FALSE) + { + // JSON data can optionally be passed to this function + // either as a database result object or an array, or a user supplied array + if ( ! is_null($result)) + { + if (is_object($result)) + { + $json_result = $result->result_array(); + } + elseif (is_array($result)) + { + $json_result = $result; + } + else + { + return $this->_prep_args($result); + } + } + else + { + return 'null'; + } + + $json = array(); + $_is_assoc = TRUE; + + if ( ! is_array($json_result) AND empty($json_result)) + { + show_error("Generate JSON Failed - Illegal key, value pair."); + } + elseif ($match_array_type) + { + $_is_assoc = $this->_is_associative_array($json_result); + } + + foreach ($json_result as $k => $v) + { + if ($_is_assoc) + { + $json[] = $this->_prep_args($k, TRUE).':'.$this->generate_json($v, $match_array_type); + } + else + { + $json[] = $this->generate_json($v, $match_array_type); + } + } + + $json = implode(',', $json); + + return $_is_assoc ? "{".$json."}" : "[".$json."]"; + + } + + // -------------------------------------------------------------------- + + /** + * Is associative array + * + * Checks for an associative array + * + * @access public + * @param type + * @return type + */ + function _is_associative_array($arr) + { + foreach (array_keys($arr) as $key => $val) + { + if ($key !== $val) + { + return TRUE; + } + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Prep Args + * + * Ensures a standard json value and escapes values + * + * @access public + * @param type + * @return type + */ + function _prep_args($result, $is_key = FALSE) + { + if (is_null($result)) + { + return 'null'; + } + elseif (is_bool($result)) + { + return ($result === TRUE) ? 'true' : 'false'; + } + elseif (is_string($result) OR $is_key) + { + return '"'.str_replace(array('\\', "\t", "\n", "\r", '"', '/'), array('\\\\', '\\t', '\\n', "\\r", '\"', '\/'), $result).'"'; + } + elseif (is_scalar($result)) + { + return $result; + } + } + + // -------------------------------------------------------------------- +} +// END Javascript Class + +/* End of file Javascript.php */ +/* Location: ./system/libraries/Javascript.php */ \ No newline at end of file diff --git a/system/libraries/Log.php b/system/libraries/Log.php new file mode 100644 index 0000000..0ce9a42 --- /dev/null +++ b/system/libraries/Log.php @@ -0,0 +1,115 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Logging Class + * + * @package CodeIgniter + * @subpackage Libraries + * @category Logging + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/general/errors.html + */ +class CI_Log { + + protected $_log_path; + protected $_threshold = 1; + protected $_date_fmt = 'Y-m-d H:i:s'; + protected $_enabled = TRUE; + protected $_levels = array('ERROR' => '1', 'DEBUG' => '2', 'INFO' => '3', 'ALL' => '4'); + + /** + * Constructor + */ + public function __construct() + { + $config =& get_config(); + + $this->_log_path = ($config['log_path'] != '') ? $config['log_path'] : APPPATH.'logs/'; + + if ( ! is_dir($this->_log_path) OR ! is_really_writable($this->_log_path)) + { + $this->_enabled = FALSE; + } + + if (is_numeric($config['log_threshold'])) + { + $this->_threshold = $config['log_threshold']; + } + + if ($config['log_date_format'] != '') + { + $this->_date_fmt = $config['log_date_format']; + } + } + + // -------------------------------------------------------------------- + + /** + * Write Log File + * + * Generally this function will be called using the global log_message() function + * + * @param string the error level + * @param string the error message + * @param bool whether the error is a native PHP error + * @return bool + */ + public function write_log($level = 'error', $msg, $php_error = FALSE) + { + if ($this->_enabled === FALSE) + { + return FALSE; + } + + $level = strtoupper($level); + + if ( ! isset($this->_levels[$level]) OR ($this->_levels[$level] > $this->_threshold)) + { + return FALSE; + } + + $filepath = $this->_log_path.'log-'.date('Y-m-d').'.php'; + $message = ''; + + if ( ! file_exists($filepath)) + { + $message .= "<"."?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); ?".">\n\n"; + } + + if ( ! $fp = @fopen($filepath, FOPEN_WRITE_CREATE)) + { + return FALSE; + } + + $message .= $level.' '.(($level == 'INFO') ? ' -' : '-').' '.date($this->_date_fmt). ' --> '.$msg."\n"; + + flock($fp, LOCK_EX); + fwrite($fp, $message); + flock($fp, LOCK_UN); + fclose($fp); + + @chmod($filepath, FILE_WRITE_MODE); + return TRUE; + } + +} +// END Log Class + +/* End of file Log.php */ +/* Location: ./system/libraries/Log.php */ \ No newline at end of file diff --git a/system/libraries/Migration.php b/system/libraries/Migration.php new file mode 100644 index 0000000..c70a8b2 --- /dev/null +++ b/system/libraries/Migration.php @@ -0,0 +1,330 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2006 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Migration Class + * + * All migrations should implement this, forces up() and down() and gives + * access to the CI super-global. + * + * @package CodeIgniter + * @subpackage Libraries + * @category Libraries + * @author Reactor Engineers + * @link + */ +class CI_Migration { + + protected $_migration_enabled = FALSE; + protected $_migration_path = NULL; + protected $_migration_version = 0; + + protected $_error_string = ''; + + public function __construct($config = array()) + { + # Only run this constructor on main library load + if (get_parent_class($this) !== FALSE) + { + return; + } + + foreach ($config as $key => $val) + { + $this->{'_' . $key} = $val; + } + + log_message('debug', 'Migrations class initialized'); + + // Are they trying to use migrations while it is disabled? + if ($this->_migration_enabled !== TRUE) + { + show_error('Migrations has been loaded but is disabled or set up incorrectly.'); + } + + // If not set, set it + $this->_migration_path == '' AND $this->_migration_path = APPPATH . 'migrations/'; + + // Add trailing slash if not set + $this->_migration_path = rtrim($this->_migration_path, '/').'/'; + + // Load migration language + $this->lang->load('migration'); + + // They'll probably be using dbforge + $this->load->dbforge(); + + // If the migrations table is missing, make it + if ( ! $this->db->table_exists('migrations')) + { + $this->dbforge->add_field(array( + 'version' => array('type' => 'INT', 'constraint' => 3), + )); + + $this->dbforge->create_table('migrations', TRUE); + + $this->db->insert('migrations', array('version' => 0)); + } + } + + // -------------------------------------------------------------------- + + /** + * Migrate to a schema version + * + * Calls each migration step required to get to the schema version of + * choice + * + * @param int Target schema version + * @return mixed TRUE if already latest, FALSE if failed, int if upgraded + */ + public function version($target_version) + { + $start = $current_version = $this->_get_version(); + $stop = $target_version; + + if ($target_version > $current_version) + { + // Moving Up + ++$start; + ++$stop; + $step = 1; + } + else + { + // Moving Down + $step = -1; + } + + $method = ($step === 1) ? 'up' : 'down'; + $migrations = array(); + + // We now prepare to actually DO the migrations + // But first let's make sure that everything is the way it should be + for ($i = $start; $i != $stop; $i += $step) + { + $f = glob(sprintf($this->_migration_path . '%03d_*.php', $i)); + + // Only one migration per step is permitted + if (count($f) > 1) + { + $this->_error_string = sprintf($this->lang->line('migration_multiple_version'), $i); + return FALSE; + } + + // Migration step not found + if (count($f) == 0) + { + // If trying to migrate up to a version greater than the last + // existing one, migrate to the last one. + if ($step == 1) + { + break; + } + + // If trying to migrate down but we're missing a step, + // something must definitely be wrong. + $this->_error_string = sprintf($this->lang->line('migration_not_found'), $i); + return FALSE; + } + + $file = basename($f[0]); + $name = basename($f[0], '.php'); + + // Filename validations + if (preg_match('/^\d{3}_(\w+)$/', $name, $match)) + { + $match[1] = strtolower($match[1]); + + // Cannot repeat a migration at different steps + if (in_array($match[1], $migrations)) + { + $this->_error_string = sprintf($this->lang->line('migration_multiple_version'), $match[1]); + return FALSE; + } + + include $f[0]; + $class = 'Migration_' . ucfirst($match[1]); + + if ( ! class_exists($class)) + { + $this->_error_string = sprintf($this->lang->line('migration_class_doesnt_exist'), $class); + return FALSE; + } + + if ( ! is_callable(array($class, $method))) + { + $this->_error_string = sprintf($this->lang->line('migration_missing_'.$method.'_method'), $class); + return FALSE; + } + + $migrations[] = $match[1]; + } + else + { + $this->_error_string = sprintf($this->lang->line('migration_invalid_filename'), $file); + return FALSE; + } + } + + log_message('debug', 'Current migration: ' . $current_version); + + $version = $i + ($step == 1 ? -1 : 0); + + // If there is nothing to do so quit + if ($migrations === array()) + { + return TRUE; + } + + log_message('debug', 'Migrating from ' . $method . ' to version ' . $version); + + // Loop through the migrations + foreach ($migrations AS $migration) + { + // Run the migration class + $class = 'Migration_' . ucfirst(strtolower($migration)); + call_user_func(array(new $class, $method)); + + $current_version += $step; + $this->_update_version($current_version); + } + + log_message('debug', 'Finished migrating to '.$current_version); + + return $current_version; + } + + // -------------------------------------------------------------------- + + /** + * Set's the schema to the latest migration + * + * @return mixed true if already latest, false if failed, int if upgraded + */ + public function latest() + { + if ( ! $migrations = $this->find_migrations()) + { + $this->_error_string = $this->lang->line('migration_none_found'); + return false; + } + + $last_migration = basename(end($migrations)); + + // Calculate the last migration step from existing migration + // filenames and procceed to the standard version migration + return $this->version((int) substr($last_migration, 0, 3)); + } + + // -------------------------------------------------------------------- + + /** + * Set's the schema to the migration version set in config + * + * @return mixed true if already current, false if failed, int if upgraded + */ + public function current() + { + return $this->version($this->_migration_version); + } + + // -------------------------------------------------------------------- + + /** + * Error string + * + * @return string Error message returned as a string + */ + public function error_string() + { + return $this->_error_string; + } + + // -------------------------------------------------------------------- + + /** + * Set's the schema to the latest migration + * + * @return mixed true if already latest, false if failed, int if upgraded + */ + protected function find_migrations() + { + // Load all *_*.php files in the migrations path + $files = glob($this->_migration_path . '*_*.php'); + $file_count = count($files); + + for ($i = 0; $i < $file_count; $i++) + { + // Mark wrongly formatted files as false for later filtering + $name = basename($files[$i], '.php'); + if ( ! preg_match('/^\d{3}_(\w+)$/', $name)) + { + $files[$i] = FALSE; + } + } + + sort($files); + return $files; + } + + // -------------------------------------------------------------------- + + /** + * Retrieves current schema version + * + * @return int Current Migration + */ + protected function _get_version() + { + $row = $this->db->get('migrations')->row(); + return $row ? $row->version : 0; + } + + // -------------------------------------------------------------------- + + /** + * Stores the current schema version + * + * @param int Migration reached + * @return bool + */ + protected function _update_version($migrations) + { + return $this->db->update('migrations', array( + 'version' => $migrations + )); + } + + // -------------------------------------------------------------------- + + /** + * Enable the use of CI super-global + * + * @param mixed $var + * @return mixed + */ + public function __get($var) + { + return get_instance()->$var; + } + +} + +/* End of file Migration.php */ +/* Location: ./system/libraries/Migration.php */ \ No newline at end of file diff --git a/system/libraries/Pagination.php b/system/libraries/Pagination.php new file mode 100644 index 0000000..25af5d6 --- /dev/null +++ b/system/libraries/Pagination.php @@ -0,0 +1,341 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Pagination Class + * + * @package CodeIgniter + * @subpackage Libraries + * @category Pagination + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/pagination.html + */ +class CI_Pagination { + + var $base_url = ''; // The page we are linking to + var $prefix = ''; // A custom prefix added to the path. + var $suffix = ''; // A custom suffix added to the path. + + var $total_rows = 0; // Total number of items (database results) + var $per_page = 10; // Max number of items you want shown per page + var $num_links = 2; // Number of "digit" links to show before/after the currently viewed page + var $cur_page = 0; // The current page being viewed + var $use_page_numbers = FALSE; // Use page number for segment instead of offset + var $first_link = '&lsaquo; First'; + var $next_link = '&gt;'; + var $prev_link = '&lt;'; + var $last_link = 'Last &rsaquo;'; + var $uri_segment = 3; + var $full_tag_open = ''; + var $full_tag_close = ''; + var $first_tag_open = ''; + var $first_tag_close = '&nbsp;'; + var $last_tag_open = '&nbsp;'; + var $last_tag_close = ''; + var $first_url = ''; // Alternative URL for the First Page. + var $cur_tag_open = '&nbsp;<strong>'; + var $cur_tag_close = '</strong>'; + var $next_tag_open = '&nbsp;'; + var $next_tag_close = '&nbsp;'; + var $prev_tag_open = '&nbsp;'; + var $prev_tag_close = ''; + var $num_tag_open = '&nbsp;'; + var $num_tag_close = ''; + var $page_query_string = FALSE; + var $query_string_segment = 'per_page'; + var $display_pages = TRUE; + var $anchor_class = ''; + + /** + * Constructor + * + * @access public + * @param array initialization parameters + */ + public function __construct($params = array()) + { + if (count($params) > 0) + { + $this->initialize($params); + } + + if ($this->anchor_class != '') + { + $this->anchor_class = 'class="'.$this->anchor_class.'" '; + } + + log_message('debug', "Pagination Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * Initialize Preferences + * + * @access public + * @param array initialization parameters + * @return void + */ + function initialize($params = array()) + { + if (count($params) > 0) + { + foreach ($params as $key => $val) + { + if (isset($this->$key)) + { + $this->$key = $val; + } + } + } + } + + // -------------------------------------------------------------------- + + /** + * Generate the pagination links + * + * @access public + * @return string + */ + function create_links() + { + // If our item count or per-page total is zero there is no need to continue. + if ($this->total_rows == 0 OR $this->per_page == 0) + { + return ''; + } + + // Calculate the total number of pages + $num_pages = ceil($this->total_rows / $this->per_page); + + // Is there only one page? Hm... nothing more to do here then. + if ($num_pages == 1) + { + return ''; + } + + // Set the base page index for starting page number + if ($this->use_page_numbers) + { + $base_page = 1; + } + else + { + $base_page = 0; + } + + // Determine the current page number. + $CI =& get_instance(); + + if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE) + { + if ($CI->input->get($this->query_string_segment) != $base_page) + { + $this->cur_page = $CI->input->get($this->query_string_segment); + + // Prep the current page - no funny business! + $this->cur_page = (int) $this->cur_page; + } + } + else + { + if ($CI->uri->segment($this->uri_segment) != $base_page) + { + $this->cur_page = $CI->uri->segment($this->uri_segment); + + // Prep the current page - no funny business! + $this->cur_page = (int) $this->cur_page; + } + } + + // Set current page to 1 if using page numbers instead of offset + if ($this->use_page_numbers AND $this->cur_page == 0) + { + $this->cur_page = $base_page; + } + + $this->num_links = (int)$this->num_links; + + if ($this->num_links < 1) + { + show_error('Your number of links must be a positive number.'); + } + + if ( ! is_numeric($this->cur_page)) + { + $this->cur_page = $base_page; + } + + // Is the page number beyond the result range? + // If so we show the last page + if ($this->use_page_numbers) + { + if ($this->cur_page > $num_pages) + { + $this->cur_page = $num_pages; + } + } + else + { + if ($this->cur_page > $this->total_rows) + { + $this->cur_page = ($num_pages - 1) * $this->per_page; + } + } + + $uri_page_number = $this->cur_page; + + if ( ! $this->use_page_numbers) + { + $this->cur_page = floor(($this->cur_page/$this->per_page) + 1); + } + + // Calculate the start and end numbers. These determine + // which number to start and end the digit links with + $start = (($this->cur_page - $this->num_links) > 0) ? $this->cur_page - ($this->num_links - 1) : 1; + $end = (($this->cur_page + $this->num_links) < $num_pages) ? $this->cur_page + $this->num_links : $num_pages; + + // Is pagination being used over GET or POST? If get, add a per_page query + // string. If post, add a trailing slash to the base URL if needed + if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE) + { + $this->base_url = rtrim($this->base_url).'&amp;'.$this->query_string_segment.'='; + } + else + { + $this->base_url = rtrim($this->base_url, '/') .'/'; + } + + // And here we go... + $output = ''; + + // Render the "First" link + if ($this->first_link !== FALSE AND $this->cur_page > ($this->num_links + 1)) + { + $first_url = ($this->first_url == '') ? $this->base_url : $this->first_url; + $output .= $this->first_tag_open.'<a '.$this->anchor_class.'href="'.$first_url.'">'.$this->first_link.'</a>'.$this->first_tag_close; + } + + // Render the "previous" link + if ($this->prev_link !== FALSE AND $this->cur_page != 1) + { + if ($this->use_page_numbers) + { + $i = $uri_page_number - 1; + } + else + { + $i = $uri_page_number - $this->per_page; + } + + if ($i == 0 && $this->first_url != '') + { + $output .= $this->prev_tag_open.'<a '.$this->anchor_class.'href="'.$this->first_url.'">'.$this->prev_link.'</a>'.$this->prev_tag_close; + } + else + { + $i = ($i == 0) ? '' : $this->prefix.$i.$this->suffix; + $output .= $this->prev_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$i.'">'.$this->prev_link.'</a>'.$this->prev_tag_close; + } + + } + + // Render the pages + if ($this->display_pages !== FALSE) + { + // Write the digit links + for ($loop = $start -1; $loop <= $end; $loop++) + { + if ($this->use_page_numbers) + { + $i = $loop; + } + else + { + $i = ($loop * $this->per_page) - $this->per_page; + } + + if ($i >= $base_page) + { + if ($this->cur_page == $loop) + { + $output .= $this->cur_tag_open.$loop.$this->cur_tag_close; // Current page + } + else + { + $n = ($i == $base_page) ? '' : $i; + + if ($n == '' && $this->first_url != '') + { + $output .= $this->num_tag_open.'<a '.$this->anchor_class.'href="'.$this->first_url.'">'.$loop.'</a>'.$this->num_tag_close; + } + else + { + $n = ($n == '') ? '' : $this->prefix.$n.$this->suffix; + + $output .= $this->num_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$n.'">'.$loop.'</a>'.$this->num_tag_close; + } + } + } + } + } + + // Render the "next" link + if ($this->next_link !== FALSE AND $this->cur_page < $num_pages) + { + if ($this->use_page_numbers) + { + $i = $this->cur_page + 1; + } + else + { + $i = ($this->cur_page * $this->per_page); + } + + $output .= $this->next_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$this->prefix.$i.$this->suffix.'">'.$this->next_link.'</a>'.$this->next_tag_close; + } + + // Render the "Last" link + if ($this->last_link !== FALSE AND ($this->cur_page + $this->num_links) < $num_pages) + { + if ($this->use_page_numbers) + { + $i = $num_pages; + } + else + { + $i = (($num_pages * $this->per_page) - $this->per_page); + } + $output .= $this->last_tag_open.'<a '.$this->anchor_class.'href="'.$this->base_url.$this->prefix.$i.$this->suffix.'">'.$this->last_link.'</a>'.$this->last_tag_close; + } + + // Kill double slashes. Note: Sometimes we can end up with a double slash + // in the penultimate link so we'll kill all double slashes. + $output = preg_replace("#([^:])//+#", "\\1/", $output); + + // Add the wrapper HTML if exists + $output = $this->full_tag_open.$output.$this->full_tag_close; + + return $output; + } +} +// END Pagination Class + +/* End of file Pagination.php */ +/* Location: ./system/libraries/Pagination.php */ \ No newline at end of file diff --git a/system/libraries/Parser.php b/system/libraries/Parser.php new file mode 100644 index 0000000..a94d626 --- /dev/null +++ b/system/libraries/Parser.php @@ -0,0 +1,213 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Parser Class + * + * @package CodeIgniter + * @subpackage Libraries + * @category Parser + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/parser.html + */ +class CI_Parser { + + var $l_delim = '{'; + var $r_delim = '}'; + var $object; + + /** + * Parse a template + * + * Parses pseudo-variables contained in the specified template view, + * replacing them with the data in the second param + * + * @access public + * @param string + * @param array + * @param bool + * @return string + */ + public function parse($template, $data, $return = FALSE) + { + $CI =& get_instance(); + $template = $CI->load->view($template, $data, TRUE); + + return $this->_parse($template, $data, $return); + } + + // -------------------------------------------------------------------- + + /** + * Parse a String + * + * Parses pseudo-variables contained in the specified string, + * replacing them with the data in the second param + * + * @access public + * @param string + * @param array + * @param bool + * @return string + */ + function parse_string($template, $data, $return = FALSE) + { + return $this->_parse($template, $data, $return); + } + + // -------------------------------------------------------------------- + + /** + * Parse a template + * + * Parses pseudo-variables contained in the specified template, + * replacing them with the data in the second param + * + * @access public + * @param string + * @param array + * @param bool + * @return string + */ + function _parse($template, $data, $return = FALSE) + { + if ($template == '') + { + return FALSE; + } + + foreach ($data as $key => $val) + { + if (is_array($val)) + { + $template = $this->_parse_pair($key, $val, $template); + } + else + { + $template = $this->_parse_single($key, (string)$val, $template); + } + } + + if ($return == FALSE) + { + $CI =& get_instance(); + $CI->output->append_output($template); + } + + return $template; + } + + // -------------------------------------------------------------------- + + /** + * Set the left/right variable delimiters + * + * @access public + * @param string + * @param string + * @return void + */ + function set_delimiters($l = '{', $r = '}') + { + $this->l_delim = $l; + $this->r_delim = $r; + } + + // -------------------------------------------------------------------- + + /** + * Parse a single key/value + * + * @access private + * @param string + * @param string + * @param string + * @return string + */ + function _parse_single($key, $val, $string) + { + return str_replace($this->l_delim.$key.$this->r_delim, $val, $string); + } + + // -------------------------------------------------------------------- + + /** + * Parse a tag pair + * + * Parses tag pairs: {some_tag} string... {/some_tag} + * + * @access private + * @param string + * @param array + * @param string + * @return string + */ + function _parse_pair($variable, $data, $string) + { + if (FALSE === ($match = $this->_match_pair($string, $variable))) + { + return $string; + } + + $str = ''; + foreach ($data as $row) + { + $temp = $match['1']; + foreach ($row as $key => $val) + { + if ( ! is_array($val)) + { + $temp = $this->_parse_single($key, $val, $temp); + } + else + { + $temp = $this->_parse_pair($key, $val, $temp); + } + } + + $str .= $temp; + } + + return str_replace($match['0'], $str, $string); + } + + // -------------------------------------------------------------------- + + /** + * Matches a variable pair + * + * @access private + * @param string + * @param string + * @return mixed + */ + function _match_pair($string, $variable) + { + if ( ! preg_match("|" . preg_quote($this->l_delim) . $variable . preg_quote($this->r_delim) . "(.+?)". preg_quote($this->l_delim) . '/' . $variable . preg_quote($this->r_delim) . "|s", $string, $match)) + { + return FALSE; + } + + return $match; + } + +} +// END Parser Class + +/* End of file Parser.php */ +/* Location: ./system/libraries/Parser.php */ diff --git a/system/libraries/Profiler.php b/system/libraries/Profiler.php new file mode 100644 index 0000000..7b376d2 --- /dev/null +++ b/system/libraries/Profiler.php @@ -0,0 +1,559 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * CodeIgniter Profiler Class + * + * This class enables you to display benchmark, query, and other data + * in order to help with debugging and optimization. + * + * Note: At some point it would be good to move all the HTML in this class + * into a set of template files in order to allow customization. + * + * @package CodeIgniter + * @subpackage Libraries + * @category Libraries + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/general/profiling.html + */ +class CI_Profiler { + + protected $_available_sections = array( + 'benchmarks', + 'get', + 'memory_usage', + 'post', + 'uri_string', + 'controller_info', + 'queries', + 'http_headers', + 'session_data', + 'config' + ); + + protected $_query_toggle_count = 25; + + protected $CI; + + // -------------------------------------------------------------------- + + public function __construct($config = array()) + { + $this->CI =& get_instance(); + $this->CI->load->language('profiler'); + + if (isset($config['query_toggle_count'])) + { + $this->_query_toggle_count = (int) $config['query_toggle_count']; + unset($config['query_toggle_count']); + } + + // default all sections to display + foreach ($this->_available_sections as $section) + { + if ( ! isset($config[$section])) + { + $this->_compile_{$section} = TRUE; + } + } + + $this->set_sections($config); + } + + // -------------------------------------------------------------------- + + /** + * Set Sections + * + * Sets the private _compile_* properties to enable/disable Profiler sections + * + * @param mixed + * @return void + */ + public function set_sections($config) + { + foreach ($config as $method => $enable) + { + if (in_array($method, $this->_available_sections)) + { + $this->_compile_{$method} = ($enable !== FALSE) ? TRUE : FALSE; + } + } + } + + // -------------------------------------------------------------------- + + /** + * Auto Profiler + * + * This function cycles through the entire array of mark points and + * matches any two points that are named identically (ending in "_start" + * and "_end" respectively). It then compiles the execution times for + * all points and returns it as an array + * + * @return array + */ + protected function _compile_benchmarks() + { + $profile = array(); + foreach ($this->CI->benchmark->marker as $key => $val) + { + // We match the "end" marker so that the list ends + // up in the order that it was defined + if (preg_match("/(.+?)_end/i", $key, $match)) + { + if (isset($this->CI->benchmark->marker[$match[1].'_end']) AND isset($this->CI->benchmark->marker[$match[1].'_start'])) + { + $profile[$match[1]] = $this->CI->benchmark->elapsed_time($match[1].'_start', $key); + } + } + } + + // Build a table containing the profile data. + // Note: At some point we should turn this into a template that can + // be modified. We also might want to make this data available to be logged + + $output = "\n\n"; + $output .= '<fieldset id="ci_profiler_benchmarks" style="border:1px solid #900;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">'; + $output .= "\n"; + $output .= '<legend style="color:#900;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_benchmarks').'&nbsp;&nbsp;</legend>'; + $output .= "\n"; + $output .= "\n\n<table style='width:100%'>\n"; + + foreach ($profile as $key => $val) + { + $key = ucwords(str_replace(array('_', '-'), ' ', $key)); + $output .= "<tr><td style='padding:5px;width:50%;color:#000;font-weight:bold;background-color:#ddd;'>".$key."&nbsp;&nbsp;</td><td style='padding:5px;width:50%;color:#900;font-weight:normal;background-color:#ddd;'>".$val."</td></tr>\n"; + } + + $output .= "</table>\n"; + $output .= "</fieldset>"; + + return $output; + } + + // -------------------------------------------------------------------- + + /** + * Compile Queries + * + * @return string + */ + protected function _compile_queries() + { + $dbs = array(); + + // Let's determine which databases are currently connected to + foreach (get_object_vars($this->CI) as $CI_object) + { + if (is_object($CI_object) && is_subclass_of(get_class($CI_object), 'CI_DB') ) + { + $dbs[] = $CI_object; + } + } + + if (count($dbs) == 0) + { + $output = "\n\n"; + $output .= '<fieldset id="ci_profiler_queries" style="border:1px solid #0000FF;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">'; + $output .= "\n"; + $output .= '<legend style="color:#0000FF;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_queries').'&nbsp;&nbsp;</legend>'; + $output .= "\n"; + $output .= "\n\n<table style='border:none; width:100%;'>\n"; + $output .="<tr><td style='width:100%;color:#0000FF;font-weight:normal;background-color:#eee;padding:5px'>".$this->CI->lang->line('profiler_no_db')."</td></tr>\n"; + $output .= "</table>\n"; + $output .= "</fieldset>"; + + return $output; + } + + // Load the text helper so we can highlight the SQL + $this->CI->load->helper('text'); + + // Key words we want bolded + $highlight = array('SELECT', 'DISTINCT', 'FROM', 'WHERE', 'AND', 'LEFT&nbsp;JOIN', 'ORDER&nbsp;BY', 'GROUP&nbsp;BY', 'LIMIT', 'INSERT', 'INTO', 'VALUES', 'UPDATE', 'OR&nbsp;', 'HAVING', 'OFFSET', 'NOT&nbsp;IN', 'IN', 'LIKE', 'NOT&nbsp;LIKE', 'COUNT', 'MAX', 'MIN', 'ON', 'AS', 'AVG', 'SUM', '(', ')'); + + $output = "\n\n"; + + $count = 0; + + foreach ($dbs as $db) + { + $count++; + + $hide_queries = (count($db->queries) > $this->_query_toggle_count) ? ' display:none' : ''; + + $show_hide_js = '(<span style="cursor: pointer;" onclick="var s=document.getElementById(\'ci_profiler_queries_db_'.$count.'\').style;s.display=s.display==\'none\'?\'\':\'none\';this.innerHTML=this.innerHTML==\''.$this->CI->lang->line('profiler_section_hide').'\'?\''.$this->CI->lang->line('profiler_section_show').'\':\''.$this->CI->lang->line('profiler_section_hide').'\';">'.$this->CI->lang->line('profiler_section_hide').'</span>)'; + + if ($hide_queries != '') + { + $show_hide_js = '(<span style="cursor: pointer;" onclick="var s=document.getElementById(\'ci_profiler_queries_db_'.$count.'\').style;s.display=s.display==\'none\'?\'\':\'none\';this.innerHTML=this.innerHTML==\''.$this->CI->lang->line('profiler_section_show').'\'?\''.$this->CI->lang->line('profiler_section_hide').'\':\''.$this->CI->lang->line('profiler_section_show').'\';">'.$this->CI->lang->line('profiler_section_show').'</span>)'; + } + + $output .= '<fieldset style="border:1px solid #0000FF;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">'; + $output .= "\n"; + $output .= '<legend style="color:#0000FF;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_database').':&nbsp; '.$db->database.'&nbsp;&nbsp;&nbsp;'.$this->CI->lang->line('profiler_queries').': '.count($db->queries).'&nbsp;&nbsp;'.$show_hide_js.'</legend>'; + $output .= "\n"; + $output .= "\n\n<table style='width:100%;{$hide_queries}' id='ci_profiler_queries_db_{$count}'>\n"; + + if (count($db->queries) == 0) + { + $output .= "<tr><td style='width:100%;color:#0000FF;font-weight:normal;background-color:#eee;padding:5px;'>".$this->CI->lang->line('profiler_no_queries')."</td></tr>\n"; + } + else + { + foreach ($db->queries as $key => $val) + { + $time = number_format($db->query_times[$key], 4); + + $val = highlight_code($val, ENT_QUOTES); + + foreach ($highlight as $bold) + { + $val = str_replace($bold, '<strong>'.$bold.'</strong>', $val); + } + + $output .= "<tr><td style='padding:5px; vertical-align: top;width:1%;color:#900;font-weight:normal;background-color:#ddd;'>".$time."&nbsp;&nbsp;</td><td style='padding:5px; color:#000;font-weight:normal;background-color:#ddd;'>".$val."</td></tr>\n"; + } + } + + $output .= "</table>\n"; + $output .= "</fieldset>"; + + } + + return $output; + } + + + // -------------------------------------------------------------------- + + /** + * Compile $_GET Data + * + * @return string + */ + protected function _compile_get() + { + $output = "\n\n"; + $output .= '<fieldset id="ci_profiler_get" style="border:1px solid #cd6e00;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">'; + $output .= "\n"; + $output .= '<legend style="color:#cd6e00;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_get_data').'&nbsp;&nbsp;</legend>'; + $output .= "\n"; + + if (count($_GET) == 0) + { + $output .= "<div style='color:#cd6e00;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_get')."</div>"; + } + else + { + $output .= "\n\n<table style='width:100%; border:none'>\n"; + + foreach ($_GET as $key => $val) + { + if ( ! is_numeric($key)) + { + $key = "'".$key."'"; + } + + $output .= "<tr><td style='width:50%;color:#000;background-color:#ddd;padding:5px'>&#36;_GET[".$key."]&nbsp;&nbsp; </td><td style='width:50%;padding:5px;color:#cd6e00;font-weight:normal;background-color:#ddd;'>"; + if (is_array($val)) + { + $output .= "<pre>" . htmlspecialchars(stripslashes(print_r($val, true))) . "</pre>"; + } + else + { + $output .= htmlspecialchars(stripslashes($val)); + } + $output .= "</td></tr>\n"; + } + + $output .= "</table>\n"; + } + $output .= "</fieldset>"; + + return $output; + } + + // -------------------------------------------------------------------- + + /** + * Compile $_POST Data + * + * @return string + */ + protected function _compile_post() + { + $output = "\n\n"; + $output .= '<fieldset id="ci_profiler_post" style="border:1px solid #009900;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">'; + $output .= "\n"; + $output .= '<legend style="color:#009900;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_post_data').'&nbsp;&nbsp;</legend>'; + $output .= "\n"; + + if (count($_POST) == 0) + { + $output .= "<div style='color:#009900;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_post')."</div>"; + } + else + { + $output .= "\n\n<table style='width:100%'>\n"; + + foreach ($_POST as $key => $val) + { + if ( ! is_numeric($key)) + { + $key = "'".$key."'"; + } + + $output .= "<tr><td style='width:50%;padding:5px;color:#000;background-color:#ddd;'>&#36;_POST[".$key."]&nbsp;&nbsp; </td><td style='width:50%;padding:5px;color:#009900;font-weight:normal;background-color:#ddd;'>"; + if (is_array($val)) + { + $output .= "<pre>" . htmlspecialchars(stripslashes(print_r($val, TRUE))) . "</pre>"; + } + else + { + $output .= htmlspecialchars(stripslashes($val)); + } + $output .= "</td></tr>\n"; + } + + $output .= "</table>\n"; + } + $output .= "</fieldset>"; + + return $output; + } + + // -------------------------------------------------------------------- + + /** + * Show query string + * + * @return string + */ + protected function _compile_uri_string() + { + $output = "\n\n"; + $output .= '<fieldset id="ci_profiler_uri_string" style="border:1px solid #000;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">'; + $output .= "\n"; + $output .= '<legend style="color:#000;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_uri_string').'&nbsp;&nbsp;</legend>'; + $output .= "\n"; + + if ($this->CI->uri->uri_string == '') + { + $output .= "<div style='color:#000;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_uri')."</div>"; + } + else + { + $output .= "<div style='color:#000;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->uri->uri_string."</div>"; + } + + $output .= "</fieldset>"; + + return $output; + } + + // -------------------------------------------------------------------- + + /** + * Show the controller and function that were called + * + * @return string + */ + protected function _compile_controller_info() + { + $output = "\n\n"; + $output .= '<fieldset id="ci_profiler_controller_info" style="border:1px solid #995300;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">'; + $output .= "\n"; + $output .= '<legend style="color:#995300;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_controller_info').'&nbsp;&nbsp;</legend>'; + $output .= "\n"; + + $output .= "<div style='color:#995300;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->router->fetch_class()."/".$this->CI->router->fetch_method()."</div>"; + + $output .= "</fieldset>"; + + return $output; + } + + // -------------------------------------------------------------------- + + /** + * Compile memory usage + * + * Display total used memory + * + * @return string + */ + protected function _compile_memory_usage() + { + $output = "\n\n"; + $output .= '<fieldset id="ci_profiler_memory_usage" style="border:1px solid #5a0099;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">'; + $output .= "\n"; + $output .= '<legend style="color:#5a0099;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_memory_usage').'&nbsp;&nbsp;</legend>'; + $output .= "\n"; + + if (function_exists('memory_get_usage') && ($usage = memory_get_usage()) != '') + { + $output .= "<div style='color:#5a0099;font-weight:normal;padding:4px 0 4px 0'>".number_format($usage).' bytes</div>'; + } + else + { + $output .= "<div style='color:#5a0099;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_memory')."</div>"; + } + + $output .= "</fieldset>"; + + return $output; + } + + // -------------------------------------------------------------------- + + /** + * Compile header information + * + * Lists HTTP headers + * + * @return string + */ + protected function _compile_http_headers() + { + $output = "\n\n"; + $output .= '<fieldset id="ci_profiler_http_headers" style="border:1px solid #000;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">'; + $output .= "\n"; + $output .= '<legend style="color:#000;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_headers').'&nbsp;&nbsp;(<span style="cursor: pointer;" onclick="var s=document.getElementById(\'ci_profiler_httpheaders_table\').style;s.display=s.display==\'none\'?\'\':\'none\';this.innerHTML=this.innerHTML==\''.$this->CI->lang->line('profiler_section_show').'\'?\''.$this->CI->lang->line('profiler_section_hide').'\':\''.$this->CI->lang->line('profiler_section_show').'\';">'.$this->CI->lang->line('profiler_section_show').'</span>)</legend>'; + $output .= "\n"; + + $output .= "\n\n<table style='width:100%;display:none' id='ci_profiler_httpheaders_table'>\n"; + + foreach (array('HTTP_ACCEPT', 'HTTP_USER_AGENT', 'HTTP_CONNECTION', 'SERVER_PORT', 'SERVER_NAME', 'REMOTE_ADDR', 'SERVER_SOFTWARE', 'HTTP_ACCEPT_LANGUAGE', 'SCRIPT_NAME', 'REQUEST_METHOD',' HTTP_HOST', 'REMOTE_HOST', 'CONTENT_TYPE', 'SERVER_PROTOCOL', 'QUERY_STRING', 'HTTP_ACCEPT_ENCODING', 'HTTP_X_FORWARDED_FOR') as $header) + { + $val = (isset($_SERVER[$header])) ? $_SERVER[$header] : ''; + $output .= "<tr><td style='vertical-align: top;width:50%;padding:5px;color:#900;background-color:#ddd;'>".$header."&nbsp;&nbsp;</td><td style='width:50%;padding:5px;color:#000;background-color:#ddd;'>".$val."</td></tr>\n"; + } + + $output .= "</table>\n"; + $output .= "</fieldset>"; + + return $output; + } + + // -------------------------------------------------------------------- + + /** + * Compile config information + * + * Lists developer config variables + * + * @return string + */ + protected function _compile_config() + { + $output = "\n\n"; + $output .= '<fieldset id="ci_profiler_config" style="border:1px solid #000;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">'; + $output .= "\n"; + $output .= '<legend style="color:#000;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_config').'&nbsp;&nbsp;(<span style="cursor: pointer;" onclick="var s=document.getElementById(\'ci_profiler_config_table\').style;s.display=s.display==\'none\'?\'\':\'none\';this.innerHTML=this.innerHTML==\''.$this->CI->lang->line('profiler_section_show').'\'?\''.$this->CI->lang->line('profiler_section_hide').'\':\''.$this->CI->lang->line('profiler_section_show').'\';">'.$this->CI->lang->line('profiler_section_show').'</span>)</legend>'; + $output .= "\n"; + + $output .= "\n\n<table style='width:100%; display:none' id='ci_profiler_config_table'>\n"; + + foreach ($this->CI->config->config as $config=>$val) + { + if (is_array($val)) + { + $val = print_r($val, TRUE); + } + + $output .= "<tr><td style='padding:5px; vertical-align: top;color:#900;background-color:#ddd;'>".$config."&nbsp;&nbsp;</td><td style='padding:5px; color:#000;background-color:#ddd;'>".htmlspecialchars($val)."</td></tr>\n"; + } + + $output .= "</table>\n"; + $output .= "</fieldset>"; + + return $output; + } + + // -------------------------------------------------------------------- + + /** + * Compile session userdata + * + * @return string + */ + private function _compile_session_data() + { + if ( ! isset($this->CI->session)) + { + return; + } + + $output = '<fieldset id="ci_profiler_csession" style="border:1px solid #000;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">'; + $output .= '<legend style="color:#000;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_session_data').'&nbsp;&nbsp;(<span style="cursor: pointer;" onclick="var s=document.getElementById(\'ci_profiler_session_data\').style;s.display=s.display==\'none\'?\'\':\'none\';this.innerHTML=this.innerHTML==\''.$this->CI->lang->line('profiler_section_show').'\'?\''.$this->CI->lang->line('profiler_section_hide').'\':\''.$this->CI->lang->line('profiler_section_show').'\';">'.$this->CI->lang->line('profiler_section_show').'</span>)</legend>'; + $output .= "<table style='width:100%;display:none' id='ci_profiler_session_data'>"; + + foreach ($this->CI->session->all_userdata() as $key => $val) + { + if (is_array($val) OR is_object($val)) + { + $val = print_r($val, TRUE); + } + + $output .= "<tr><td style='padding:5px; vertical-align: top;color:#900;background-color:#ddd;'>".$key."&nbsp;&nbsp;</td><td style='padding:5px; color:#000;background-color:#ddd;'>".htmlspecialchars($val)."</td></tr>\n"; + } + + $output .= '</table>'; + $output .= "</fieldset>"; + return $output; + } + + // -------------------------------------------------------------------- + + /** + * Run the Profiler + * + * @return string + */ + public function run() + { + $output = "<div id='codeigniter_profiler' style='clear:both;background-color:#fff;padding:10px;'>"; + $fields_displayed = 0; + + foreach ($this->_available_sections as $section) + { + if ($this->_compile_{$section} !== FALSE) + { + $func = "_compile_{$section}"; + $output .= $this->{$func}(); + $fields_displayed++; + } + } + + if ($fields_displayed == 0) + { + $output .= '<p style="border:1px solid #5a0099;padding:10px;margin:20px 0;background-color:#eee">'.$this->CI->lang->line('profiler_no_profiles').'</p>'; + } + + $output .= '</div>'; + + return $output; + } +} + +// END CI_Profiler class + +/* End of file Profiler.php */ +/* Location: ./system/libraries/Profiler.php */ \ No newline at end of file diff --git a/system/libraries/Session.php b/system/libraries/Session.php new file mode 100644 index 0000000..2bf879e --- /dev/null +++ b/system/libraries/Session.php @@ -0,0 +1,794 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Session Class + * + * @package CodeIgniter + * @subpackage Libraries + * @category Sessions + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/sessions.html + */ +class CI_Session { + + var $sess_encrypt_cookie = FALSE; + var $sess_use_database = FALSE; + var $sess_table_name = ''; + var $sess_expiration = 7200; + var $sess_expire_on_close = FALSE; + var $sess_match_ip = FALSE; + var $sess_match_useragent = TRUE; + var $sess_cookie_name = 'ci_session'; + var $cookie_prefix = ''; + var $cookie_path = ''; + var $cookie_domain = ''; + var $cookie_secure = FALSE; + var $sess_time_to_update = 300; + var $encryption_key = ''; + var $flashdata_key = 'flash'; + var $time_reference = 'time'; + var $gc_probability = 5; + var $userdata = array(); + var $CI; + var $now; + + /** + * Session Constructor + * + * The constructor runs the session routines automatically + * whenever the class is instantiated. + */ + public function __construct($params = array()) + { + log_message('debug', "Session Class Initialized"); + + // Set the super object to a local variable for use throughout the class + $this->CI =& get_instance(); + + // Set all the session preferences, which can either be set + // manually via the $params array above or via the config file + foreach (array('sess_encrypt_cookie', 'sess_use_database', 'sess_table_name', 'sess_expiration', 'sess_expire_on_close', 'sess_match_ip', 'sess_match_useragent', 'sess_cookie_name', 'cookie_path', 'cookie_domain', 'cookie_secure', 'sess_time_to_update', 'time_reference', 'cookie_prefix', 'encryption_key') as $key) + { + $this->$key = (isset($params[$key])) ? $params[$key] : $this->CI->config->item($key); + } + + if ($this->encryption_key == '') + { + show_error('In order to use the Session class you are required to set an encryption key in your config file.'); + } + + // Load the string helper so we can use the strip_slashes() function + $this->CI->load->helper('string'); + + // Do we need encryption? If so, load the encryption class + if ($this->sess_encrypt_cookie == TRUE) + { + $this->CI->load->library('encrypt'); + } + + // Are we using a database? If so, load it + if ($this->sess_use_database === TRUE AND $this->sess_table_name != '') + { + $this->CI->load->database(); + } + + // Set the "now" time. Can either be GMT or server time, based on the + // config prefs. We use this to set the "last activity" time + $this->now = $this->_get_time(); + + // Set the session length. If the session expiration is + // set to zero we'll set the expiration two years from now. + if ($this->sess_expiration == 0) + { + $this->sess_expiration = (60*60*24*365*2); + } + + // Set the cookie name + $this->sess_cookie_name = $this->cookie_prefix.$this->sess_cookie_name; + + // Run the Session routine. If a session doesn't exist we'll + // create a new one. If it does, we'll update it. + if ( ! $this->sess_read()) + { + $this->sess_create(); + } + else + { + $this->sess_update(); + } + + // Delete 'old' flashdata (from last request) + $this->_flashdata_sweep(); + + // Mark all new flashdata as old (data will be deleted before next request) + $this->_flashdata_mark(); + + // Delete expired sessions if necessary + $this->_sess_gc(); + + log_message('debug', "Session routines successfully run"); + } + + // -------------------------------------------------------------------- + + /** + * Fetch the current session data if it exists + * + * @access public + * @return bool + */ + function sess_read() + { + // Fetch the cookie + $session = $this->CI->input->cookie($this->sess_cookie_name); + + // No cookie? Goodbye cruel world!... + if ($session === FALSE) + { + log_message('debug', 'A session cookie was not found.'); + return FALSE; + } + + // HMAC authentication + $len = strlen($session) - 40; + + if ($len <= 0) + { + log_message('error', 'Session: The session cookie was not signed.'); + return FALSE; + } + + // Check cookie authentication + $hmac = substr($session, $len); + $session = substr($session, 0, $len); + + // Time-attack-safe comparison + $hmac_check = hash_hmac('sha1', $session, $this->encryption_key); + $diff = 0; + + for ($i = 0; $i < 40; $i++) + { + $xor = ord($hmac[$i]) ^ ord($hmac_check[$i]); + $diff |= $xor; + } + + if ($diff !== 0) + { + log_message('error', 'Session: HMAC mismatch. The session cookie data did not match what was expected.'); + $this->sess_destroy(); + return FALSE; + } + + // Decrypt the cookie data + if ($this->sess_encrypt_cookie == TRUE) + { + $session = $this->CI->encrypt->decode($session); + } + + // Unserialize the session array + $session = $this->_unserialize($session); + + // Is the session data we unserialized an array with the correct format? + if ( ! is_array($session) OR ! isset($session['session_id']) OR ! isset($session['ip_address']) OR ! isset($session['user_agent']) OR ! isset($session['last_activity'])) + { + $this->sess_destroy(); + return FALSE; + } + + // Is the session current? + if (($session['last_activity'] + $this->sess_expiration) < $this->now) + { + $this->sess_destroy(); + return FALSE; + } + + // Does the IP Match? + if ($this->sess_match_ip == TRUE AND $session['ip_address'] != $this->CI->input->ip_address()) + { + $this->sess_destroy(); + return FALSE; + } + + // Does the User Agent Match? + if ($this->sess_match_useragent == TRUE AND trim($session['user_agent']) != trim(substr($this->CI->input->user_agent(), 0, 120))) + { + $this->sess_destroy(); + return FALSE; + } + + // Is there a corresponding session in the DB? + if ($this->sess_use_database === TRUE) + { + $this->CI->db->where('session_id', $session['session_id']); + + if ($this->sess_match_ip == TRUE) + { + $this->CI->db->where('ip_address', $session['ip_address']); + } + + if ($this->sess_match_useragent == TRUE) + { + $this->CI->db->where('user_agent', $session['user_agent']); + } + + $query = $this->CI->db->get($this->sess_table_name); + + // No result? Kill it! + if ($query->num_rows() == 0) + { + $this->sess_destroy(); + return FALSE; + } + + // Is there custom data? If so, add it to the main session array + $row = $query->row(); + if (isset($row->user_data) AND $row->user_data != '') + { + $custom_data = $this->_unserialize($row->user_data); + + if (is_array($custom_data)) + { + foreach ($custom_data as $key => $val) + { + $session[$key] = $val; + } + } + } + } + + // Session is valid! + $this->userdata = $session; + unset($session); + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Write the session data + * + * @access public + * @return void + */ + function sess_write() + { + // Are we saving custom data to the DB? If not, all we do is update the cookie + if ($this->sess_use_database === FALSE) + { + $this->_set_cookie(); + return; + } + + // set the custom userdata, the session data we will set in a second + $custom_userdata = $this->userdata; + $cookie_userdata = array(); + + // Before continuing, we need to determine if there is any custom data to deal with. + // Let's determine this by removing the default indexes to see if there's anything left in the array + // and set the session data while we're at it + foreach (array('session_id','ip_address','user_agent','last_activity') as $val) + { + unset($custom_userdata[$val]); + $cookie_userdata[$val] = $this->userdata[$val]; + } + + // Did we find any custom data? If not, we turn the empty array into a string + // since there's no reason to serialize and store an empty array in the DB + if (count($custom_userdata) === 0) + { + $custom_userdata = ''; + } + else + { + // Serialize the custom data array so we can store it + $custom_userdata = $this->_serialize($custom_userdata); + } + + // Run the update query + $this->CI->db->where('session_id', $this->userdata['session_id']); + $this->CI->db->update($this->sess_table_name, array('last_activity' => $this->userdata['last_activity'], 'user_data' => $custom_userdata)); + + // Write the cookie. Notice that we manually pass the cookie data array to the + // _set_cookie() function. Normally that function will store $this->userdata, but + // in this case that array contains custom data, which we do not want in the cookie. + $this->_set_cookie($cookie_userdata); + } + + // -------------------------------------------------------------------- + + /** + * Create a new session + * + * @access public + * @return void + */ + function sess_create() + { + $sessid = ''; + while (strlen($sessid) < 32) + { + $sessid .= mt_rand(0, mt_getrandmax()); + } + + // To make the session ID even more secure we'll combine it with the user's IP + $sessid .= $this->CI->input->ip_address(); + + $this->userdata = array( + 'session_id' => md5(uniqid($sessid, TRUE)), + 'ip_address' => $this->CI->input->ip_address(), + 'user_agent' => substr($this->CI->input->user_agent(), 0, 120), + 'last_activity' => $this->now, + 'user_data' => '' + ); + + + // Save the data to the DB if needed + if ($this->sess_use_database === TRUE) + { + $this->CI->db->query($this->CI->db->insert_string($this->sess_table_name, $this->userdata)); + } + + // Write the cookie + $this->_set_cookie(); + } + + // -------------------------------------------------------------------- + + /** + * Update an existing session + * + * @access public + * @return void + */ + function sess_update() + { + // We only update the session every five minutes by default + if ($this->CI->input->is_ajax_request() OR ($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now) + { + return; + } + + // Save the old session id so we know which record to + // update in the database if we need it + $old_sessid = $this->userdata['session_id']; + $new_sessid = ''; + while (strlen($new_sessid) < 32) + { + $new_sessid .= mt_rand(0, mt_getrandmax()); + } + + // To make the session ID even more secure we'll combine it with the user's IP + $new_sessid .= $this->CI->input->ip_address(); + + // Turn it into a hash + $new_sessid = md5(uniqid($new_sessid, TRUE)); + + // Update the session data in the session data array + $this->userdata['session_id'] = $new_sessid; + $this->userdata['last_activity'] = $this->now; + + // _set_cookie() will handle this for us if we aren't using database sessions + // by pushing all userdata to the cookie. + $cookie_data = NULL; + + // Update the session ID and last_activity field in the DB if needed + if ($this->sess_use_database === TRUE) + { + // set cookie explicitly to only have our session data + $cookie_data = array(); + foreach (array('session_id','ip_address','user_agent','last_activity') as $val) + { + $cookie_data[$val] = $this->userdata[$val]; + } + + $this->CI->db->query($this->CI->db->update_string($this->sess_table_name, array('last_activity' => $this->now, 'session_id' => $new_sessid), array('session_id' => $old_sessid))); + } + + // Write the cookie + $this->_set_cookie($cookie_data); + } + + // -------------------------------------------------------------------- + + /** + * Destroy the current session + * + * @access public + * @return void + */ + function sess_destroy() + { + // Kill the session DB row + if ($this->sess_use_database === TRUE && isset($this->userdata['session_id'])) + { + $this->CI->db->where('session_id', $this->userdata['session_id']); + $this->CI->db->delete($this->sess_table_name); + } + + // Kill the cookie + setcookie( + $this->sess_cookie_name, + addslashes(serialize(array())), + ($this->now - 31500000), + $this->cookie_path, + $this->cookie_domain, + 0 + ); + + // Kill session data + $this->userdata = array(); + } + + // -------------------------------------------------------------------- + + /** + * Fetch a specific item from the session array + * + * @access public + * @param string + * @return string + */ + function userdata($item) + { + return ( ! isset($this->userdata[$item])) ? FALSE : $this->userdata[$item]; + } + + // -------------------------------------------------------------------- + + /** + * Fetch all session data + * + * @access public + * @return array + */ + function all_userdata() + { + return $this->userdata; + } + + // -------------------------------------------------------------------- + + /** + * Add or change data in the "userdata" array + * + * @access public + * @param mixed + * @param string + * @return void + */ + function set_userdata($newdata = array(), $newval = '') + { + if (is_string($newdata)) + { + $newdata = array($newdata => $newval); + } + + if (count($newdata) > 0) + { + foreach ($newdata as $key => $val) + { + $this->userdata[$key] = $val; + } + } + + $this->sess_write(); + } + + // -------------------------------------------------------------------- + + /** + * Delete a session variable from the "userdata" array + * + * @access array + * @return void + */ + function unset_userdata($newdata = array()) + { + if (is_string($newdata)) + { + $newdata = array($newdata => ''); + } + + if (count($newdata) > 0) + { + foreach ($newdata as $key => $val) + { + unset($this->userdata[$key]); + } + } + + $this->sess_write(); + } + + // ------------------------------------------------------------------------ + + /** + * Add or change flashdata, only available + * until the next request + * + * @access public + * @param mixed + * @param string + * @return void + */ + function set_flashdata($newdata = array(), $newval = '') + { + if (is_string($newdata)) + { + $newdata = array($newdata => $newval); + } + + if (count($newdata) > 0) + { + foreach ($newdata as $key => $val) + { + $flashdata_key = $this->flashdata_key.':new:'.$key; + $this->set_userdata($flashdata_key, $val); + } + } + } + + // ------------------------------------------------------------------------ + + /** + * Keeps existing flashdata available to next request. + * + * @access public + * @param string + * @return void + */ + function keep_flashdata($key) + { + // 'old' flashdata gets removed. Here we mark all + // flashdata as 'new' to preserve it from _flashdata_sweep() + // Note the function will return FALSE if the $key + // provided cannot be found + $old_flashdata_key = $this->flashdata_key.':old:'.$key; + $value = $this->userdata($old_flashdata_key); + + $new_flashdata_key = $this->flashdata_key.':new:'.$key; + $this->set_userdata($new_flashdata_key, $value); + } + + // ------------------------------------------------------------------------ + + /** + * Fetch a specific flashdata item from the session array + * + * @access public + * @param string + * @return string + */ + function flashdata($key) + { + $flashdata_key = $this->flashdata_key.':old:'.$key; + return $this->userdata($flashdata_key); + } + + // ------------------------------------------------------------------------ + + /** + * Identifies flashdata as 'old' for removal + * when _flashdata_sweep() runs. + * + * @access private + * @return void + */ + function _flashdata_mark() + { + $userdata = $this->all_userdata(); + foreach ($userdata as $name => $value) + { + $parts = explode(':new:', $name); + if (is_array($parts) && count($parts) === 2) + { + $new_name = $this->flashdata_key.':old:'.$parts[1]; + $this->set_userdata($new_name, $value); + $this->unset_userdata($name); + } + } + } + + // ------------------------------------------------------------------------ + + /** + * Removes all flashdata marked as 'old' + * + * @access private + * @return void + */ + + function _flashdata_sweep() + { + $userdata = $this->all_userdata(); + foreach ($userdata as $key => $value) + { + if (strpos($key, ':old:')) + { + $this->unset_userdata($key); + } + } + + } + + // -------------------------------------------------------------------- + + /** + * Get the "now" time + * + * @access private + * @return string + */ + function _get_time() + { + if (strtolower($this->time_reference) == 'gmt') + { + $now = time(); + $time = mktime(gmdate("H", $now), gmdate("i", $now), gmdate("s", $now), gmdate("m", $now), gmdate("d", $now), gmdate("Y", $now)); + } + else + { + $time = time(); + } + + return $time; + } + + // -------------------------------------------------------------------- + + /** + * Write the session cookie + * + * @access public + * @return void + */ + function _set_cookie($cookie_data = NULL) + { + if (is_null($cookie_data)) + { + $cookie_data = $this->userdata; + } + + // Serialize the userdata for the cookie + $cookie_data = $this->_serialize($cookie_data); + + if ($this->sess_encrypt_cookie == TRUE) + { + $cookie_data = $this->CI->encrypt->encode($cookie_data); + } + + $cookie_data .= hash_hmac('sha1', $cookie_data, $this->encryption_key); + + $expire = ($this->sess_expire_on_close === TRUE) ? 0 : $this->sess_expiration + time(); + + // Set the cookie + setcookie( + $this->sess_cookie_name, + $cookie_data, + $expire, + $this->cookie_path, + $this->cookie_domain, + $this->cookie_secure + ); + } + + // -------------------------------------------------------------------- + + /** + * Serialize an array + * + * This function first converts any slashes found in the array to a temporary + * marker, so when it gets unserialized the slashes will be preserved + * + * @access private + * @param array + * @return string + */ + function _serialize($data) + { + if (is_array($data)) + { + foreach ($data as $key => $val) + { + if (is_string($val)) + { + $data[$key] = str_replace('\\', '{{slash}}', $val); + } + } + } + else + { + if (is_string($data)) + { + $data = str_replace('\\', '{{slash}}', $data); + } + } + + return serialize($data); + } + + // -------------------------------------------------------------------- + + /** + * Unserialize + * + * This function unserializes a data string, then converts any + * temporary slash markers back to actual slashes + * + * @access private + * @param array + * @return string + */ + function _unserialize($data) + { + $data = @unserialize(strip_slashes($data)); + + if (is_array($data)) + { + foreach ($data as $key => $val) + { + if (is_string($val)) + { + $data[$key] = str_replace('{{slash}}', '\\', $val); + } + } + + return $data; + } + + return (is_string($data)) ? str_replace('{{slash}}', '\\', $data) : $data; + } + + // -------------------------------------------------------------------- + + /** + * Garbage collection + * + * This deletes expired session rows from database + * if the probability percentage is met + * + * @access public + * @return void + */ + function _sess_gc() + { + if ($this->sess_use_database != TRUE) + { + return; + } + + srand(time()); + if ((rand() % 100) < $this->gc_probability) + { + $expire = $this->now - $this->sess_expiration; + + $this->CI->db->where("last_activity < {$expire}"); + $this->CI->db->delete($this->sess_table_name); + + log_message('debug', 'Session garbage collection performed.'); + } + } + + +} +// END Session Class + +/* End of file Session.php */ +/* Location: ./system/libraries/Session.php */ diff --git a/system/libraries/Sha1.php b/system/libraries/Sha1.php new file mode 100644 index 0000000..2aedbf3 --- /dev/null +++ b/system/libraries/Sha1.php @@ -0,0 +1,252 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * SHA1 Encoding Class + * + * Purpose: Provides 160 bit hashing using The Secure Hash Algorithm + * developed at the National Institute of Standards and Technology. The 40 + * character SHA1 message hash is computationally infeasible to crack. + * + * This class is a fallback for servers that are not running PHP greater than + * 4.3, or do not have the MHASH library. + * + * This class is based on two scripts: + * + * Marcus Campbell's PHP implementation (GNU license) + * http://www.tecknik.net/sha-1/ + * + * ...which is based on Paul Johnston's JavaScript version + * (BSD license). http://pajhome.org.uk/ + * + * I encapsulated the functions and wrote one additional method to fix + * a hex conversion bug. - Rick Ellis + * + * @package CodeIgniter + * @subpackage Libraries + * @category Encryption + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/general/encryption.html + */ +class CI_SHA1 { + + public function __construct() + { + log_message('debug', "SHA1 Class Initialized"); + } + + /** + * Generate the Hash + * + * @access public + * @param string + * @return string + */ + function generate($str) + { + $n = ((strlen($str) + 8) >> 6) + 1; + + for ($i = 0; $i < $n * 16; $i++) + { + $x[$i] = 0; + } + + for ($i = 0; $i < strlen($str); $i++) + { + $x[$i >> 2] |= ord(substr($str, $i, 1)) << (24 - ($i % 4) * 8); + } + + $x[$i >> 2] |= 0x80 << (24 - ($i % 4) * 8); + + $x[$n * 16 - 1] = strlen($str) * 8; + + $a = 1732584193; + $b = -271733879; + $c = -1732584194; + $d = 271733878; + $e = -1009589776; + + for ($i = 0; $i < count($x); $i += 16) + { + $olda = $a; + $oldb = $b; + $oldc = $c; + $oldd = $d; + $olde = $e; + + for ($j = 0; $j < 80; $j++) + { + if ($j < 16) + { + $w[$j] = $x[$i + $j]; + } + else + { + $w[$j] = $this->_rol($w[$j - 3] ^ $w[$j - 8] ^ $w[$j - 14] ^ $w[$j - 16], 1); + } + + $t = $this->_safe_add($this->_safe_add($this->_rol($a, 5), $this->_ft($j, $b, $c, $d)), $this->_safe_add($this->_safe_add($e, $w[$j]), $this->_kt($j))); + + $e = $d; + $d = $c; + $c = $this->_rol($b, 30); + $b = $a; + $a = $t; + } + + $a = $this->_safe_add($a, $olda); + $b = $this->_safe_add($b, $oldb); + $c = $this->_safe_add($c, $oldc); + $d = $this->_safe_add($d, $oldd); + $e = $this->_safe_add($e, $olde); + } + + return $this->_hex($a).$this->_hex($b).$this->_hex($c).$this->_hex($d).$this->_hex($e); + } + + // -------------------------------------------------------------------- + + /** + * Convert a decimal to hex + * + * @access private + * @param string + * @return string + */ + function _hex($str) + { + $str = dechex($str); + + if (strlen($str) == 7) + { + $str = '0'.$str; + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Return result based on iteration + * + * @access private + * @return string + */ + function _ft($t, $b, $c, $d) + { + if ($t < 20) + return ($b & $c) | ((~$b) & $d); + if ($t < 40) + return $b ^ $c ^ $d; + if ($t < 60) + return ($b & $c) | ($b & $d) | ($c & $d); + + return $b ^ $c ^ $d; + } + + // -------------------------------------------------------------------- + + /** + * Determine the additive constant + * + * @access private + * @return string + */ + function _kt($t) + { + if ($t < 20) + { + return 1518500249; + } + else if ($t < 40) + { + return 1859775393; + } + else if ($t < 60) + { + return -1894007588; + } + else + { + return -899497514; + } + } + + // -------------------------------------------------------------------- + + /** + * Add integers, wrapping at 2^32 + * + * @access private + * @return string + */ + function _safe_add($x, $y) + { + $lsw = ($x & 0xFFFF) + ($y & 0xFFFF); + $msw = ($x >> 16) + ($y >> 16) + ($lsw >> 16); + + return ($msw << 16) | ($lsw & 0xFFFF); + } + + // -------------------------------------------------------------------- + + /** + * Bitwise rotate a 32-bit number + * + * @access private + * @return integer + */ + function _rol($num, $cnt) + { + return ($num << $cnt) | $this->_zero_fill($num, 32 - $cnt); + } + + // -------------------------------------------------------------------- + + /** + * Pad string with zero + * + * @access private + * @return string + */ + function _zero_fill($a, $b) + { + $bin = decbin($a); + + if (strlen($bin) < $b) + { + $bin = 0; + } + else + { + $bin = substr($bin, 0, strlen($bin) - $b); + } + + for ($i=0; $i < $b; $i++) + { + $bin = "0".$bin; + } + + return bindec($bin); + } +} +// END CI_SHA + +/* End of file Sha1.php */ +/* Location: ./system/libraries/Sha1.php */ \ No newline at end of file diff --git a/system/libraries/Table.php b/system/libraries/Table.php new file mode 100644 index 0000000..e980d62 --- /dev/null +++ b/system/libraries/Table.php @@ -0,0 +1,532 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.3.1 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * HTML Table Generating Class + * + * Lets you create tables manually or from database result objects, or arrays. + * + * @package CodeIgniter + * @subpackage Libraries + * @category HTML Tables + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/uri.html + */ +class CI_Table { + + var $rows = array(); + var $heading = array(); + var $auto_heading = TRUE; + var $caption = NULL; + var $template = NULL; + var $newline = "\n"; + var $empty_cells = ""; + var $function = FALSE; + + public function __construct() + { + log_message('debug', "Table Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * Set the template + * + * @access public + * @param array + * @return void + */ + function set_template($template) + { + if ( ! is_array($template)) + { + return FALSE; + } + + $this->template = $template; + } + + // -------------------------------------------------------------------- + + /** + * Set the table heading + * + * Can be passed as an array or discreet params + * + * @access public + * @param mixed + * @return void + */ + function set_heading() + { + $args = func_get_args(); + $this->heading = $this->_prep_args($args); + } + + // -------------------------------------------------------------------- + + /** + * Set columns. Takes a one-dimensional array as input and creates + * a multi-dimensional array with a depth equal to the number of + * columns. This allows a single array with many elements to be + * displayed in a table that has a fixed column count. + * + * @access public + * @param array + * @param int + * @return void + */ + function make_columns($array = array(), $col_limit = 0) + { + if ( ! is_array($array) OR count($array) == 0) + { + return FALSE; + } + + // Turn off the auto-heading feature since it's doubtful we + // will want headings from a one-dimensional array + $this->auto_heading = FALSE; + + if ($col_limit == 0) + { + return $array; + } + + $new = array(); + while (count($array) > 0) + { + $temp = array_splice($array, 0, $col_limit); + + if (count($temp) < $col_limit) + { + for ($i = count($temp); $i < $col_limit; $i++) + { + $temp[] = '&nbsp;'; + } + } + + $new[] = $temp; + } + + return $new; + } + + // -------------------------------------------------------------------- + + /** + * Set "empty" cells + * + * Can be passed as an array or discreet params + * + * @access public + * @param mixed + * @return void + */ + function set_empty($value) + { + $this->empty_cells = $value; + } + + // -------------------------------------------------------------------- + + /** + * Add a table row + * + * Can be passed as an array or discreet params + * + * @access public + * @param mixed + * @return void + */ + function add_row() + { + $args = func_get_args(); + $this->rows[] = $this->_prep_args($args); + } + + // -------------------------------------------------------------------- + + /** + * Prep Args + * + * Ensures a standard associative array format for all cell data + * + * @access public + * @param type + * @return type + */ + function _prep_args($args) + { + // If there is no $args[0], skip this and treat as an associative array + // This can happen if there is only a single key, for example this is passed to table->generate + // array(array('foo'=>'bar')) + if (isset($args[0]) AND (count($args) == 1 && is_array($args[0]))) + { + // args sent as indexed array + if ( ! isset($args[0]['data'])) + { + foreach ($args[0] as $key => $val) + { + if (is_array($val) && isset($val['data'])) + { + $args[$key] = $val; + } + else + { + $args[$key] = array('data' => $val); + } + } + } + } + else + { + foreach ($args as $key => $val) + { + if ( ! is_array($val)) + { + $args[$key] = array('data' => $val); + } + } + } + + return $args; + } + + // -------------------------------------------------------------------- + + /** + * Add a table caption + * + * @access public + * @param string + * @return void + */ + function set_caption($caption) + { + $this->caption = $caption; + } + + // -------------------------------------------------------------------- + + /** + * Generate the table + * + * @access public + * @param mixed + * @return string + */ + function generate($table_data = NULL) + { + // The table data can optionally be passed to this function + // either as a database result object or an array + if ( ! is_null($table_data)) + { + if (is_object($table_data)) + { + $this->_set_from_object($table_data); + } + elseif (is_array($table_data)) + { + $set_heading = (count($this->heading) == 0 AND $this->auto_heading == FALSE) ? FALSE : TRUE; + $this->_set_from_array($table_data, $set_heading); + } + } + + // Is there anything to display? No? Smite them! + if (count($this->heading) == 0 AND count($this->rows) == 0) + { + return 'Undefined table data'; + } + + // Compile and validate the template date + $this->_compile_template(); + + // set a custom cell manipulation function to a locally scoped variable so its callable + $function = $this->function; + + // Build the table! + + $out = $this->template['table_open']; + $out .= $this->newline; + + // Add any caption here + if ($this->caption) + { + $out .= $this->newline; + $out .= '<caption>' . $this->caption . '</caption>'; + $out .= $this->newline; + } + + // Is there a table heading to display? + if (count($this->heading) > 0) + { + $out .= $this->template['thead_open']; + $out .= $this->newline; + $out .= $this->template['heading_row_start']; + $out .= $this->newline; + + foreach ($this->heading as $heading) + { + $temp = $this->template['heading_cell_start']; + + foreach ($heading as $key => $val) + { + if ($key != 'data') + { + $temp = str_replace('<th', "<th $key='$val'", $temp); + } + } + + $out .= $temp; + $out .= isset($heading['data']) ? $heading['data'] : ''; + $out .= $this->template['heading_cell_end']; + } + + $out .= $this->template['heading_row_end']; + $out .= $this->newline; + $out .= $this->template['thead_close']; + $out .= $this->newline; + } + + // Build the table rows + if (count($this->rows) > 0) + { + $out .= $this->template['tbody_open']; + $out .= $this->newline; + + $i = 1; + foreach ($this->rows as $row) + { + if ( ! is_array($row)) + { + break; + } + + // We use modulus to alternate the row colors + $name = (fmod($i++, 2)) ? '' : 'alt_'; + + $out .= $this->template['row_'.$name.'start']; + $out .= $this->newline; + + foreach ($row as $cell) + { + $temp = $this->template['cell_'.$name.'start']; + + foreach ($cell as $key => $val) + { + if ($key != 'data') + { + $temp = str_replace('<td', "<td $key='$val'", $temp); + } + } + + $cell = isset($cell['data']) ? $cell['data'] : ''; + $out .= $temp; + + if ($cell === "" OR $cell === NULL) + { + $out .= $this->empty_cells; + } + else + { + if ($function !== FALSE && is_callable($function)) + { + $out .= call_user_func($function, $cell); + } + else + { + $out .= $cell; + } + } + + $out .= $this->template['cell_'.$name.'end']; + } + + $out .= $this->template['row_'.$name.'end']; + $out .= $this->newline; + } + + $out .= $this->template['tbody_close']; + $out .= $this->newline; + } + + $out .= $this->template['table_close']; + + // Clear table class properties before generating the table + $this->clear(); + + return $out; + } + + // -------------------------------------------------------------------- + + /** + * Clears the table arrays. Useful if multiple tables are being generated + * + * @access public + * @return void + */ + function clear() + { + $this->rows = array(); + $this->heading = array(); + $this->auto_heading = TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Set table data from a database result object + * + * @access public + * @param object + * @return void + */ + function _set_from_object($query) + { + if ( ! is_object($query)) + { + return FALSE; + } + + // First generate the headings from the table column names + if (count($this->heading) == 0) + { + if ( ! method_exists($query, 'list_fields')) + { + return FALSE; + } + + $this->heading = $this->_prep_args($query->list_fields()); + } + + // Next blast through the result array and build out the rows + + if ($query->num_rows() > 0) + { + foreach ($query->result_array() as $row) + { + $this->rows[] = $this->_prep_args($row); + } + } + } + + // -------------------------------------------------------------------- + + /** + * Set table data from an array + * + * @access public + * @param array + * @return void + */ + function _set_from_array($data, $set_heading = TRUE) + { + if ( ! is_array($data) OR count($data) == 0) + { + return FALSE; + } + + $i = 0; + foreach ($data as $row) + { + // If a heading hasn't already been set we'll use the first row of the array as the heading + if ($i == 0 AND count($data) > 1 AND count($this->heading) == 0 AND $set_heading == TRUE) + { + $this->heading = $this->_prep_args($row); + } + else + { + $this->rows[] = $this->_prep_args($row); + } + + $i++; + } + } + + // -------------------------------------------------------------------- + + /** + * Compile Template + * + * @access private + * @return void + */ + function _compile_template() + { + if ($this->template == NULL) + { + $this->template = $this->_default_template(); + return; + } + + $this->temp = $this->_default_template(); + foreach (array('table_open', 'thead_open', 'thead_close', 'heading_row_start', 'heading_row_end', 'heading_cell_start', 'heading_cell_end', 'tbody_open', 'tbody_close', 'row_start', 'row_end', 'cell_start', 'cell_end', 'row_alt_start', 'row_alt_end', 'cell_alt_start', 'cell_alt_end', 'table_close') as $val) + { + if ( ! isset($this->template[$val])) + { + $this->template[$val] = $this->temp[$val]; + } + } + } + + // -------------------------------------------------------------------- + + /** + * Default Template + * + * @access private + * @return void + */ + function _default_template() + { + return array ( + 'table_open' => '<table border="0" cellpadding="4" cellspacing="0">', + + 'thead_open' => '<thead>', + 'thead_close' => '</thead>', + + 'heading_row_start' => '<tr>', + 'heading_row_end' => '</tr>', + 'heading_cell_start' => '<th>', + 'heading_cell_end' => '</th>', + + 'tbody_open' => '<tbody>', + 'tbody_close' => '</tbody>', + + 'row_start' => '<tr>', + 'row_end' => '</tr>', + 'cell_start' => '<td>', + 'cell_end' => '</td>', + + 'row_alt_start' => '<tr>', + 'row_alt_end' => '</tr>', + 'cell_alt_start' => '<td>', + 'cell_alt_end' => '</td>', + + 'table_close' => '</table>' + ); + } + + +} + + +/* End of file Table.php */ +/* Location: ./system/libraries/Table.php */ \ No newline at end of file diff --git a/system/libraries/Trackback.php b/system/libraries/Trackback.php new file mode 100644 index 0000000..2e01581 --- /dev/null +++ b/system/libraries/Trackback.php @@ -0,0 +1,549 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Trackback Class + * + * Trackback Sending/Receiving Class + * + * @package CodeIgniter + * @subpackage Libraries + * @category Trackbacks + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/trackback.html + */ +class CI_Trackback { + + var $time_format = 'local'; + var $charset = 'UTF-8'; + var $data = array('url' => '', 'title' => '', 'excerpt' => '', 'blog_name' => '', 'charset' => ''); + var $convert_ascii = TRUE; + var $response = ''; + var $error_msg = array(); + + /** + * Constructor + * + * @access public + */ + public function __construct() + { + log_message('debug', "Trackback Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * Send Trackback + * + * @access public + * @param array + * @return bool + */ + function send($tb_data) + { + if ( ! is_array($tb_data)) + { + $this->set_error('The send() method must be passed an array'); + return FALSE; + } + + // Pre-process the Trackback Data + foreach (array('url', 'title', 'excerpt', 'blog_name', 'ping_url') as $item) + { + if ( ! isset($tb_data[$item])) + { + $this->set_error('Required item missing: '.$item); + return FALSE; + } + + switch ($item) + { + case 'ping_url' : $$item = $this->extract_urls($tb_data[$item]); + break; + case 'excerpt' : $$item = $this->limit_characters($this->convert_xml(strip_tags(stripslashes($tb_data[$item])))); + break; + case 'url' : $$item = str_replace('&#45;', '-', $this->convert_xml(strip_tags(stripslashes($tb_data[$item])))); + break; + default : $$item = $this->convert_xml(strip_tags(stripslashes($tb_data[$item]))); + break; + } + + // Convert High ASCII Characters + if ($this->convert_ascii == TRUE) + { + if ($item == 'excerpt') + { + $$item = $this->convert_ascii($$item); + } + elseif ($item == 'title') + { + $$item = $this->convert_ascii($$item); + } + elseif ($item == 'blog_name') + { + $$item = $this->convert_ascii($$item); + } + } + } + + // Build the Trackback data string + $charset = ( ! isset($tb_data['charset'])) ? $this->charset : $tb_data['charset']; + + $data = "url=".rawurlencode($url)."&title=".rawurlencode($title)."&blog_name=".rawurlencode($blog_name)."&excerpt=".rawurlencode($excerpt)."&charset=".rawurlencode($charset); + + // Send Trackback(s) + $return = TRUE; + if (count($ping_url) > 0) + { + foreach ($ping_url as $url) + { + if ($this->process($url, $data) == FALSE) + { + $return = FALSE; + } + } + } + + return $return; + } + + // -------------------------------------------------------------------- + + /** + * Receive Trackback Data + * + * This function simply validates the incoming TB data. + * It returns FALSE on failure and TRUE on success. + * If the data is valid it is set to the $this->data array + * so that it can be inserted into a database. + * + * @access public + * @return bool + */ + function receive() + { + foreach (array('url', 'title', 'blog_name', 'excerpt') as $val) + { + if ( ! isset($_POST[$val]) OR $_POST[$val] == '') + { + $this->set_error('The following required POST variable is missing: '.$val); + return FALSE; + } + + $this->data['charset'] = ( ! isset($_POST['charset'])) ? 'auto' : strtoupper(trim($_POST['charset'])); + + if ($val != 'url' && function_exists('mb_convert_encoding')) + { + $_POST[$val] = mb_convert_encoding($_POST[$val], $this->charset, $this->data['charset']); + } + + $_POST[$val] = ($val != 'url') ? $this->convert_xml(strip_tags($_POST[$val])) : strip_tags($_POST[$val]); + + if ($val == 'excerpt') + { + $_POST['excerpt'] = $this->limit_characters($_POST['excerpt']); + } + + $this->data[$val] = $_POST[$val]; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Send Trackback Error Message + * + * Allows custom errors to be set. By default it + * sends the "incomplete information" error, as that's + * the most common one. + * + * @access public + * @param string + * @return void + */ + function send_error($message = 'Incomplete Information') + { + echo "<?xml version=\"1.0\" encoding=\"utf-8\"?".">\n<response>\n<error>1</error>\n<message>".$message."</message>\n</response>"; + exit; + } + + // -------------------------------------------------------------------- + + /** + * Send Trackback Success Message + * + * This should be called when a trackback has been + * successfully received and inserted. + * + * @access public + * @return void + */ + function send_success() + { + echo "<?xml version=\"1.0\" encoding=\"utf-8\"?".">\n<response>\n<error>0</error>\n</response>"; + exit; + } + + // -------------------------------------------------------------------- + + /** + * Fetch a particular item + * + * @access public + * @param string + * @return string + */ + function data($item) + { + return ( ! isset($this->data[$item])) ? '' : $this->data[$item]; + } + + // -------------------------------------------------------------------- + + /** + * Process Trackback + * + * Opens a socket connection and passes the data to + * the server. Returns TRUE on success, FALSE on failure + * + * @access public + * @param string + * @param string + * @return bool + */ + function process($url, $data) + { + $target = parse_url($url); + + // Open the socket + if ( ! $fp = @fsockopen($target['host'], 80)) + { + $this->set_error('Invalid Connection: '.$url); + return FALSE; + } + + // Build the path + $ppath = ( ! isset($target['path'])) ? $url : $target['path']; + + $path = (isset($target['query']) && $target['query'] != "") ? $ppath.'?'.$target['query'] : $ppath; + + // Add the Trackback ID to the data string + if ($id = $this->get_id($url)) + { + $data = "tb_id=".$id."&".$data; + } + + // Transfer the data + fputs ($fp, "POST " . $path . " HTTP/1.0\r\n" ); + fputs ($fp, "Host: " . $target['host'] . "\r\n" ); + fputs ($fp, "Content-type: application/x-www-form-urlencoded\r\n" ); + fputs ($fp, "Content-length: " . strlen($data) . "\r\n" ); + fputs ($fp, "Connection: close\r\n\r\n" ); + fputs ($fp, $data); + + // Was it successful? + $this->response = ""; + + while ( ! feof($fp)) + { + $this->response .= fgets($fp, 128); + } + @fclose($fp); + + + if (stristr($this->response, '<error>0</error>') === FALSE) + { + $message = 'An unknown error was encountered'; + + if (preg_match("/<message>(.*?)<\/message>/is", $this->response, $match)) + { + $message = trim($match['1']); + } + + $this->set_error($message); + return FALSE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Extract Trackback URLs + * + * This function lets multiple trackbacks be sent. + * It takes a string of URLs (separated by comma or + * space) and puts each URL into an array + * + * @access public + * @param string + * @return string + */ + function extract_urls($urls) + { + // Remove the pesky white space and replace with a comma. + $urls = preg_replace("/\s*(\S+)\s*/", "\\1,", $urls); + + // If they use commas get rid of the doubles. + $urls = str_replace(",,", ",", $urls); + + // Remove any comma that might be at the end + if (substr($urls, -1) == ",") + { + $urls = substr($urls, 0, -1); + } + + // Break into an array via commas + $urls = preg_split('/[,]/', $urls); + + // Removes duplicates + $urls = array_unique($urls); + + array_walk($urls, array($this, 'validate_url')); + + return $urls; + } + + // -------------------------------------------------------------------- + + /** + * Validate URL + * + * Simply adds "http://" if missing + * + * @access public + * @param string + * @return string + */ + function validate_url($url) + { + $url = trim($url); + + if (substr($url, 0, 4) != "http") + { + $url = "http://".$url; + } + } + + // -------------------------------------------------------------------- + + /** + * Find the Trackback URL's ID + * + * @access public + * @param string + * @return string + */ + function get_id($url) + { + $tb_id = ""; + + if (strpos($url, '?') !== FALSE) + { + $tb_array = explode('/', $url); + $tb_end = $tb_array[count($tb_array)-1]; + + if ( ! is_numeric($tb_end)) + { + $tb_end = $tb_array[count($tb_array)-2]; + } + + $tb_array = explode('=', $tb_end); + $tb_id = $tb_array[count($tb_array)-1]; + } + else + { + $url = rtrim($url, '/'); + + $tb_array = explode('/', $url); + $tb_id = $tb_array[count($tb_array)-1]; + + if ( ! is_numeric($tb_id)) + { + $tb_id = $tb_array[count($tb_array)-2]; + } + } + + if ( ! preg_match ("/^([0-9]+)$/", $tb_id)) + { + return FALSE; + } + else + { + return $tb_id; + } + } + + // -------------------------------------------------------------------- + + /** + * Convert Reserved XML characters to Entities + * + * @access public + * @param string + * @return string + */ + function convert_xml($str) + { + $temp = '__TEMP_AMPERSANDS__'; + + $str = preg_replace("/&#(\d+);/", "$temp\\1;", $str); + $str = preg_replace("/&(\w+);/", "$temp\\1;", $str); + + $str = str_replace(array("&","<",">","\"", "'", "-"), + array("&amp;", "&lt;", "&gt;", "&quot;", "&#39;", "&#45;"), + $str); + + $str = preg_replace("/$temp(\d+);/","&#\\1;",$str); + $str = preg_replace("/$temp(\w+);/","&\\1;", $str); + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Character limiter + * + * Limits the string based on the character count. Will preserve complete words. + * + * @access public + * @param string + * @param integer + * @param string + * @return string + */ + function limit_characters($str, $n = 500, $end_char = '&#8230;') + { + if (strlen($str) < $n) + { + return $str; + } + + $str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str)); + + if (strlen($str) <= $n) + { + return $str; + } + + $out = ""; + foreach (explode(' ', trim($str)) as $val) + { + $out .= $val.' '; + if (strlen($out) >= $n) + { + return trim($out).$end_char; + } + } + } + + // -------------------------------------------------------------------- + + /** + * High ASCII to Entities + * + * Converts Hight ascii text and MS Word special chars + * to character entities + * + * @access public + * @param string + * @return string + */ + function convert_ascii($str) + { + $count = 1; + $out = ''; + $temp = array(); + + for ($i = 0, $s = strlen($str); $i < $s; $i++) + { + $ordinal = ord($str[$i]); + + if ($ordinal < 128) + { + $out .= $str[$i]; + } + else + { + if (count($temp) == 0) + { + $count = ($ordinal < 224) ? 2 : 3; + } + + $temp[] = $ordinal; + + if (count($temp) == $count) + { + $number = ($count == 3) ? (($temp['0'] % 16) * 4096) + (($temp['1'] % 64) * 64) + ($temp['2'] % 64) : (($temp['0'] % 32) * 64) + ($temp['1'] % 64); + + $out .= '&#'.$number.';'; + $count = 1; + $temp = array(); + } + } + } + + return $out; + } + + // -------------------------------------------------------------------- + + /** + * Set error message + * + * @access public + * @param string + * @return void + */ + function set_error($msg) + { + log_message('error', $msg); + $this->error_msg[] = $msg; + } + + // -------------------------------------------------------------------- + + /** + * Show error messages + * + * @access public + * @param string + * @param string + * @return string + */ + function display_errors($open = '<p>', $close = '</p>') + { + $str = ''; + foreach ($this->error_msg as $val) + { + $str .= $open.$val.$close; + } + + return $str; + } + +} +// END Trackback Class + +/* End of file Trackback.php */ +/* Location: ./system/libraries/Trackback.php */ \ No newline at end of file diff --git a/system/libraries/Typography.php b/system/libraries/Typography.php new file mode 100644 index 0000000..cdac5c9 --- /dev/null +++ b/system/libraries/Typography.php @@ -0,0 +1,409 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Typography Class + * + * @category Helpers + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/helpers/ + */ +class CI_Typography { + + // Block level elements that should not be wrapped inside <p> tags + var $block_elements = 'address|blockquote|div|dl|fieldset|form|h\d|hr|noscript|object|ol|p|pre|script|table|ul'; + + // Elements that should not have <p> and <br /> tags within them. + var $skip_elements = 'p|pre|ol|ul|dl|object|table|h\d'; + + // Tags we want the parser to completely ignore when splitting the string. + var $inline_elements = 'a|abbr|acronym|b|bdo|big|br|button|cite|code|del|dfn|em|i|img|ins|input|label|map|kbd|q|samp|select|small|span|strong|sub|sup|textarea|tt|var'; + + // array of block level elements that require inner content to be within another block level element + var $inner_block_required = array('blockquote'); + + // the last block element parsed + var $last_block_element = ''; + + // whether or not to protect quotes within { curly braces } + var $protect_braced_quotes = FALSE; + + /** + * Auto Typography + * + * This function converts text, making it typographically correct: + * - Converts double spaces into paragraphs. + * - Converts single line breaks into <br /> tags + * - Converts single and double quotes into correctly facing curly quote entities. + * - Converts three dots into ellipsis. + * - Converts double dashes into em-dashes. + * - Converts two spaces into entities + * + * @access public + * @param string + * @param bool whether to reduce more then two consecutive newlines to two + * @return string + */ + function auto_typography($str, $reduce_linebreaks = FALSE) + { + if ($str == '') + { + return ''; + } + + // Standardize Newlines to make matching easier + if (strpos($str, "\r") !== FALSE) + { + $str = str_replace(array("\r\n", "\r"), "\n", $str); + } + + // Reduce line breaks. If there are more than two consecutive linebreaks + // we'll compress them down to a maximum of two since there's no benefit to more. + if ($reduce_linebreaks === TRUE) + { + $str = preg_replace("/\n\n+/", "\n\n", $str); + } + + // HTML comment tags don't conform to patterns of normal tags, so pull them out separately, only if needed + $html_comments = array(); + if (strpos($str, '<!--') !== FALSE) + { + if (preg_match_all("#(<!\-\-.*?\-\->)#s", $str, $matches)) + { + for ($i = 0, $total = count($matches[0]); $i < $total; $i++) + { + $html_comments[] = $matches[0][$i]; + $str = str_replace($matches[0][$i], '{@HC'.$i.'}', $str); + } + } + } + + // match and yank <pre> tags if they exist. It's cheaper to do this separately since most content will + // not contain <pre> tags, and it keeps the PCRE patterns below simpler and faster + if (strpos($str, '<pre') !== FALSE) + { + $str = preg_replace_callback("#<pre.*?>.*?</pre>#si", array($this, '_protect_characters'), $str); + } + + // Convert quotes within tags to temporary markers. + $str = preg_replace_callback("#<.+?>#si", array($this, '_protect_characters'), $str); + + // Do the same with braces if necessary + if ($this->protect_braced_quotes === TRUE) + { + $str = preg_replace_callback("#\{.+?\}#si", array($this, '_protect_characters'), $str); + } + + // Convert "ignore" tags to temporary marker. The parser splits out the string at every tag + // it encounters. Certain inline tags, like image tags, links, span tags, etc. will be + // adversely affected if they are split out so we'll convert the opening bracket < temporarily to: {@TAG} + $str = preg_replace("#<(/*)(".$this->inline_elements.")([ >])#i", "{@TAG}\\1\\2\\3", $str); + + // Split the string at every tag. This expression creates an array with this prototype: + // + // [array] + // { + // [0] = <opening tag> + // [1] = Content... + // [2] = <closing tag> + // Etc... + // } + $chunks = preg_split('/(<(?:[^<>]+(?:"[^"]*"|\'[^\']*\')?)+>)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); + + // Build our finalized string. We cycle through the array, skipping tags, and processing the contained text + $str = ''; + $process = TRUE; + $paragraph = FALSE; + $current_chunk = 0; + $total_chunks = count($chunks); + + foreach ($chunks as $chunk) + { + $current_chunk++; + + // Are we dealing with a tag? If so, we'll skip the processing for this cycle. + // Well also set the "process" flag which allows us to skip <pre> tags and a few other things. + if (preg_match("#<(/*)(".$this->block_elements.").*?>#", $chunk, $match)) + { + if (preg_match("#".$this->skip_elements."#", $match[2])) + { + $process = ($match[1] == '/') ? TRUE : FALSE; + } + + if ($match[1] == '') + { + $this->last_block_element = $match[2]; + } + + $str .= $chunk; + continue; + } + + if ($process == FALSE) + { + $str .= $chunk; + continue; + } + + // Force a newline to make sure end tags get processed by _format_newlines() + if ($current_chunk == $total_chunks) + { + $chunk .= "\n"; + } + + // Convert Newlines into <p> and <br /> tags + $str .= $this->_format_newlines($chunk); + } + + // No opening block level tag? Add it if needed. + if ( ! preg_match("/^\s*<(?:".$this->block_elements.")/i", $str)) + { + $str = preg_replace("/^(.*?)<(".$this->block_elements.")/i", '<p>$1</p><$2', $str); + } + + // Convert quotes, elipsis, em-dashes, non-breaking spaces, and ampersands + $str = $this->format_characters($str); + + // restore HTML comments + for ($i = 0, $total = count($html_comments); $i < $total; $i++) + { + // remove surrounding paragraph tags, but only if there's an opening paragraph tag + // otherwise HTML comments at the ends of paragraphs will have the closing tag removed + // if '<p>{@HC1}' then replace <p>{@HC1}</p> with the comment, else replace only {@HC1} with the comment + $str = preg_replace('#(?(?=<p>\{@HC'.$i.'\})<p>\{@HC'.$i.'\}(\s*</p>)|\{@HC'.$i.'\})#s', $html_comments[$i], $str); + } + + // Final clean up + $table = array( + + // If the user submitted their own paragraph tags within the text + // we will retain them instead of using our tags. + '/(<p[^>*?]>)<p>/' => '$1', // <?php BBEdit syntax coloring bug fix + + // Reduce multiple instances of opening/closing paragraph tags to a single one + '#(</p>)+#' => '</p>', + '/(<p>\W*<p>)+/' => '<p>', + + // Clean up stray paragraph tags that appear before block level elements + '#<p></p><('.$this->block_elements.')#' => '<$1', + + // Clean up stray non-breaking spaces preceeding block elements + '#(&nbsp;\s*)+<('.$this->block_elements.')#' => ' <$2', + + // Replace the temporary markers we added earlier + '/\{@TAG\}/' => '<', + '/\{@DQ\}/' => '"', + '/\{@SQ\}/' => "'", + '/\{@DD\}/' => '--', + '/\{@NBS\}/' => ' ', + + // An unintended consequence of the _format_newlines function is that + // some of the newlines get truncated, resulting in <p> tags + // starting immediately after <block> tags on the same line. + // This forces a newline after such occurrences, which looks much nicer. + "/><p>\n/" => ">\n<p>", + + // Similarly, there might be cases where a closing </block> will follow + // a closing </p> tag, so we'll correct it by adding a newline in between + "#</p></#" => "</p>\n</" + ); + + // Do we need to reduce empty lines? + if ($reduce_linebreaks === TRUE) + { + $table['#<p>\n*</p>#'] = ''; + } + else + { + // If we have empty paragraph tags we add a non-breaking space + // otherwise most browsers won't treat them as true paragraphs + $table['#<p></p>#'] = '<p>&nbsp;</p>'; + } + + return preg_replace(array_keys($table), $table, $str); + + } + + // -------------------------------------------------------------------- + + /** + * Format Characters + * + * This function mainly converts double and single quotes + * to curly entities, but it also converts em-dashes, + * double spaces, and ampersands + * + * @access public + * @param string + * @return string + */ + function format_characters($str) + { + static $table; + + if ( ! isset($table)) + { + $table = array( + // nested smart quotes, opening and closing + // note that rules for grammar (English) allow only for two levels deep + // and that single quotes are _supposed_ to always be on the outside + // but we'll accommodate both + // Note that in all cases, whitespace is the primary determining factor + // on which direction to curl, with non-word characters like punctuation + // being a secondary factor only after whitespace is addressed. + '/\'"(\s|$)/' => '&#8217;&#8221;$1', + '/(^|\s|<p>)\'"/' => '$1&#8216;&#8220;', + '/\'"(\W)/' => '&#8217;&#8221;$1', + '/(\W)\'"/' => '$1&#8216;&#8220;', + '/"\'(\s|$)/' => '&#8221;&#8217;$1', + '/(^|\s|<p>)"\'/' => '$1&#8220;&#8216;', + '/"\'(\W)/' => '&#8221;&#8217;$1', + '/(\W)"\'/' => '$1&#8220;&#8216;', + + // single quote smart quotes + '/\'(\s|$)/' => '&#8217;$1', + '/(^|\s|<p>)\'/' => '$1&#8216;', + '/\'(\W)/' => '&#8217;$1', + '/(\W)\'/' => '$1&#8216;', + + // double quote smart quotes + '/"(\s|$)/' => '&#8221;$1', + '/(^|\s|<p>)"/' => '$1&#8220;', + '/"(\W)/' => '&#8221;$1', + '/(\W)"/' => '$1&#8220;', + + // apostrophes + "/(\w)'(\w)/" => '$1&#8217;$2', + + // Em dash and ellipses dots + '/\s?\-\-\s?/' => '&#8212;', + '/(\w)\.{3}/' => '$1&#8230;', + + // double space after sentences + '/(\W) /' => '$1&nbsp; ', + + // ampersands, if not a character entity + '/&(?!#?[a-zA-Z0-9]{2,};)/' => '&amp;' + ); + } + + return preg_replace(array_keys($table), $table, $str); + } + + // -------------------------------------------------------------------- + + /** + * Format Newlines + * + * Converts newline characters into either <p> tags or <br /> + * + * @access public + * @param string + * @return string + */ + function _format_newlines($str) + { + if ($str == '') + { + return $str; + } + + if (strpos($str, "\n") === FALSE && ! in_array($this->last_block_element, $this->inner_block_required)) + { + return $str; + } + + // Convert two consecutive newlines to paragraphs + $str = str_replace("\n\n", "</p>\n\n<p>", $str); + + // Convert single spaces to <br /> tags + $str = preg_replace("/([^\n])(\n)([^\n])/", "\\1<br />\\2\\3", $str); + + // Wrap the whole enchilada in enclosing paragraphs + if ($str != "\n") + { + // We trim off the right-side new line so that the closing </p> tag + // will be positioned immediately following the string, matching + // the behavior of the opening <p> tag + $str = '<p>'.rtrim($str).'</p>'; + } + + // Remove empty paragraphs if they are on the first line, as this + // is a potential unintended consequence of the previous code + $str = preg_replace("/<p><\/p>(.*)/", "\\1", $str, 1); + + return $str; + } + + // ------------------------------------------------------------------------ + + /** + * Protect Characters + * + * Protects special characters from being formatted later + * We don't want quotes converted within tags so we'll temporarily convert them to {@DQ} and {@SQ} + * and we don't want double dashes converted to emdash entities, so they are marked with {@DD} + * likewise double spaces are converted to {@NBS} to prevent entity conversion + * + * @access public + * @param array + * @return string + */ + function _protect_characters($match) + { + return str_replace(array("'",'"','--',' '), array('{@SQ}', '{@DQ}', '{@DD}', '{@NBS}'), $match[0]); + } + + // -------------------------------------------------------------------- + + /** + * Convert newlines to HTML line breaks except within PRE tags + * + * @access public + * @param string + * @return string + */ + function nl2br_except_pre($str) + { + $ex = explode("pre>",$str); + $ct = count($ex); + + $newstr = ""; + for ($i = 0; $i < $ct; $i++) + { + if (($i % 2) == 0) + { + $newstr .= nl2br($ex[$i]); + } + else + { + $newstr .= $ex[$i]; + } + + if ($ct - 1 != $i) + $newstr .= "pre>"; + } + + return $newstr; + } + +} +// END Typography Class + +/* End of file Typography.php */ +/* Location: ./system/libraries/Typography.php */ \ No newline at end of file diff --git a/system/libraries/Unit_test.php b/system/libraries/Unit_test.php new file mode 100644 index 0000000..07dc508 --- /dev/null +++ b/system/libraries/Unit_test.php @@ -0,0 +1,384 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.3.1 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Unit Testing Class + * + * Simple testing class + * + * @package CodeIgniter + * @subpackage Libraries + * @category UnitTesting + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/uri.html + */ +class CI_Unit_test { + + var $active = TRUE; + var $results = array(); + var $strict = FALSE; + var $_template = NULL; + var $_template_rows = NULL; + var $_test_items_visible = array(); + + public function __construct() + { + // These are the default items visible when a test is run. + $this->_test_items_visible = array ( + 'test_name', + 'test_datatype', + 'res_datatype', + 'result', + 'file', + 'line', + 'notes' + ); + + log_message('debug', "Unit Testing Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * Run the tests + * + * Runs the supplied tests + * + * @access public + * @param array + * @return void + */ + function set_test_items($items = array()) + { + if ( ! empty($items) AND is_array($items)) + { + $this->_test_items_visible = $items; + } + } + + // -------------------------------------------------------------------- + + /** + * Run the tests + * + * Runs the supplied tests + * + * @access public + * @param mixed + * @param mixed + * @param string + * @return string + */ + function run($test, $expected = TRUE, $test_name = 'undefined', $notes = '') + { + if ($this->active == FALSE) + { + return FALSE; + } + + if (in_array($expected, array('is_object', 'is_string', 'is_bool', 'is_true', 'is_false', 'is_int', 'is_numeric', 'is_float', 'is_double', 'is_array', 'is_null'), TRUE)) + { + $expected = str_replace('is_float', 'is_double', $expected); + $result = ($expected($test)) ? TRUE : FALSE; + $extype = str_replace(array('true', 'false'), 'bool', str_replace('is_', '', $expected)); + } + else + { + if ($this->strict == TRUE) + $result = ($test === $expected) ? TRUE : FALSE; + else + $result = ($test == $expected) ? TRUE : FALSE; + + $extype = gettype($expected); + } + + $back = $this->_backtrace(); + + $report[] = array ( + 'test_name' => $test_name, + 'test_datatype' => gettype($test), + 'res_datatype' => $extype, + 'result' => ($result === TRUE) ? 'passed' : 'failed', + 'file' => $back['file'], + 'line' => $back['line'], + 'notes' => $notes + ); + + $this->results[] = $report; + + return($this->report($this->result($report))); + } + + // -------------------------------------------------------------------- + + /** + * Generate a report + * + * Displays a table with the test data + * + * @access public + * @return string + */ + function report($result = array()) + { + if (count($result) == 0) + { + $result = $this->result(); + } + + $CI =& get_instance(); + $CI->load->language('unit_test'); + + $this->_parse_template(); + + $r = ''; + foreach ($result as $res) + { + $table = ''; + + foreach ($res as $key => $val) + { + if ($key == $CI->lang->line('ut_result')) + { + if ($val == $CI->lang->line('ut_passed')) + { + $val = '<span style="color: #0C0;">'.$val.'</span>'; + } + elseif ($val == $CI->lang->line('ut_failed')) + { + $val = '<span style="color: #C00;">'.$val.'</span>'; + } + } + + $temp = $this->_template_rows; + $temp = str_replace('{item}', $key, $temp); + $temp = str_replace('{result}', $val, $temp); + $table .= $temp; + } + + $r .= str_replace('{rows}', $table, $this->_template); + } + + return $r; + } + + // -------------------------------------------------------------------- + + /** + * Use strict comparison + * + * Causes the evaluation to use === rather than == + * + * @access public + * @param bool + * @return null + */ + function use_strict($state = TRUE) + { + $this->strict = ($state == FALSE) ? FALSE : TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Make Unit testing active + * + * Enables/disables unit testing + * + * @access public + * @param bool + * @return null + */ + function active($state = TRUE) + { + $this->active = ($state == FALSE) ? FALSE : TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Result Array + * + * Returns the raw result data + * + * @access public + * @return array + */ + function result($results = array()) + { + $CI =& get_instance(); + $CI->load->language('unit_test'); + + if (count($results) == 0) + { + $results = $this->results; + } + + $retval = array(); + foreach ($results as $result) + { + $temp = array(); + foreach ($result as $key => $val) + { + if ( ! in_array($key, $this->_test_items_visible)) + { + continue; + } + + if (is_array($val)) + { + foreach ($val as $k => $v) + { + if (FALSE !== ($line = $CI->lang->line(strtolower('ut_'.$v)))) + { + $v = $line; + } + $temp[$CI->lang->line('ut_'.$k)] = $v; + } + } + else + { + if (FALSE !== ($line = $CI->lang->line(strtolower('ut_'.$val)))) + { + $val = $line; + } + $temp[$CI->lang->line('ut_'.$key)] = $val; + } + } + + $retval[] = $temp; + } + + return $retval; + } + + // -------------------------------------------------------------------- + + /** + * Set the template + * + * This lets us set the template to be used to display results + * + * @access public + * @param string + * @return void + */ + function set_template($template) + { + $this->_template = $template; + } + + // -------------------------------------------------------------------- + + /** + * Generate a backtrace + * + * This lets us show file names and line numbers + * + * @access private + * @return array + */ + function _backtrace() + { + if (function_exists('debug_backtrace')) + { + $back = debug_backtrace(); + + $file = ( ! isset($back['1']['file'])) ? '' : $back['1']['file']; + $line = ( ! isset($back['1']['line'])) ? '' : $back['1']['line']; + + return array('file' => $file, 'line' => $line); + } + return array('file' => 'Unknown', 'line' => 'Unknown'); + } + + // -------------------------------------------------------------------- + + /** + * Get Default Template + * + * @access private + * @return string + */ + function _default_template() + { + $this->_template = "\n".'<table style="width:100%; font-size:small; margin:10px 0; border-collapse:collapse; border:1px solid #CCC;">'; + $this->_template .= '{rows}'; + $this->_template .= "\n".'</table>'; + + $this->_template_rows = "\n\t".'<tr>'; + $this->_template_rows .= "\n\t\t".'<th style="text-align: left; border-bottom:1px solid #CCC;">{item}</th>'; + $this->_template_rows .= "\n\t\t".'<td style="border-bottom:1px solid #CCC;">{result}</td>'; + $this->_template_rows .= "\n\t".'</tr>'; + } + + // -------------------------------------------------------------------- + + /** + * Parse Template + * + * Harvests the data within the template {pseudo-variables} + * + * @access private + * @return void + */ + function _parse_template() + { + if ( ! is_null($this->_template_rows)) + { + return; + } + + if (is_null($this->_template)) + { + $this->_default_template(); + return; + } + + if ( ! preg_match("/\{rows\}(.*?)\{\/rows\}/si", $this->_template, $match)) + { + $this->_default_template(); + return; + } + + $this->_template_rows = $match['1']; + $this->_template = str_replace($match['0'], '{rows}', $this->_template); + } + +} +// END Unit_test Class + +/** + * Helper functions to test boolean true/false + * + * + * @access private + * @return bool + */ +function is_true($test) +{ + return (is_bool($test) AND $test === TRUE) ? TRUE : FALSE; +} +function is_false($test) +{ + return (is_bool($test) AND $test === FALSE) ? TRUE : FALSE; +} + + +/* End of file Unit_test.php */ +/* Location: ./system/libraries/Unit_test.php */ \ No newline at end of file diff --git a/system/libraries/Upload.php b/system/libraries/Upload.php new file mode 100644 index 0000000..02abe2a --- /dev/null +++ b/system/libraries/Upload.php @@ -0,0 +1,1109 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * File Uploading Class + * + * @package CodeIgniter + * @subpackage Libraries + * @category Uploads + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/file_uploading.html + */ +class CI_Upload { + + public $max_size = 0; + public $max_width = 0; + public $max_height = 0; + public $max_filename = 0; + public $allowed_types = ""; + public $file_temp = ""; + public $file_name = ""; + public $orig_name = ""; + public $file_type = ""; + public $file_size = ""; + public $file_ext = ""; + public $upload_path = ""; + public $overwrite = FALSE; + public $encrypt_name = FALSE; + public $is_image = FALSE; + public $image_width = ''; + public $image_height = ''; + public $image_type = ''; + public $image_size_str = ''; + public $error_msg = array(); + public $mimes = array(); + public $remove_spaces = TRUE; + public $xss_clean = FALSE; + public $temp_prefix = "temp_file_"; + public $client_name = ''; + + protected $_file_name_override = ''; + + /** + * Constructor + * + * @access public + */ + public function __construct($props = array()) + { + if (count($props) > 0) + { + $this->initialize($props); + } + + log_message('debug', "Upload Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * Initialize preferences + * + * @param array + * @return void + */ + public function initialize($config = array()) + { + $defaults = array( + 'max_size' => 0, + 'max_width' => 0, + 'max_height' => 0, + 'max_filename' => 0, + 'allowed_types' => "", + 'file_temp' => "", + 'file_name' => "", + 'orig_name' => "", + 'file_type' => "", + 'file_size' => "", + 'file_ext' => "", + 'upload_path' => "", + 'overwrite' => FALSE, + 'encrypt_name' => FALSE, + 'is_image' => FALSE, + 'image_width' => '', + 'image_height' => '', + 'image_type' => '', + 'image_size_str' => '', + 'error_msg' => array(), + 'mimes' => array(), + 'remove_spaces' => TRUE, + 'xss_clean' => FALSE, + 'temp_prefix' => "temp_file_", + 'client_name' => '' + ); + + + foreach ($defaults as $key => $val) + { + if (isset($config[$key])) + { + $method = 'set_'.$key; + if (method_exists($this, $method)) + { + $this->$method($config[$key]); + } + else + { + $this->$key = $config[$key]; + } + } + else + { + $this->$key = $val; + } + } + + // if a file_name was provided in the config, use it instead of the user input + // supplied file name for all uploads until initialized again + $this->_file_name_override = $this->file_name; + } + + // -------------------------------------------------------------------- + + /** + * Perform the file upload + * + * @return bool + */ + public function do_upload($field = 'userfile') + { + + // Is $_FILES[$field] set? If not, no reason to continue. + if ( ! isset($_FILES[$field])) + { + $this->set_error('upload_no_file_selected'); + return FALSE; + } + + // Is the upload path valid? + if ( ! $this->validate_upload_path()) + { + // errors will already be set by validate_upload_path() so just return FALSE + return FALSE; + } + + // Was the file able to be uploaded? If not, determine the reason why. + if ( ! is_uploaded_file($_FILES[$field]['tmp_name'])) + { + $error = ( ! isset($_FILES[$field]['error'])) ? 4 : $_FILES[$field]['error']; + + switch($error) + { + case 1: // UPLOAD_ERR_INI_SIZE + $this->set_error('upload_file_exceeds_limit'); + break; + case 2: // UPLOAD_ERR_FORM_SIZE + $this->set_error('upload_file_exceeds_form_limit'); + break; + case 3: // UPLOAD_ERR_PARTIAL + $this->set_error('upload_file_partial'); + break; + case 4: // UPLOAD_ERR_NO_FILE + $this->set_error('upload_no_file_selected'); + break; + case 6: // UPLOAD_ERR_NO_TMP_DIR + $this->set_error('upload_no_temp_directory'); + break; + case 7: // UPLOAD_ERR_CANT_WRITE + $this->set_error('upload_unable_to_write_file'); + break; + case 8: // UPLOAD_ERR_EXTENSION + $this->set_error('upload_stopped_by_extension'); + break; + default : $this->set_error('upload_no_file_selected'); + break; + } + + return FALSE; + } + + + // Set the uploaded data as class variables + $this->file_temp = $_FILES[$field]['tmp_name']; + $this->file_size = $_FILES[$field]['size']; + $this->_file_mime_type($_FILES[$field]); + $this->file_type = preg_replace("/^(.+?);.*$/", "\\1", $this->file_type); + $this->file_type = strtolower(trim(stripslashes($this->file_type), '"')); + $this->file_name = $this->_prep_filename($_FILES[$field]['name']); + $this->file_ext = $this->get_extension($this->file_name); + $this->client_name = $this->file_name; + + // Is the file type allowed to be uploaded? + if ( ! $this->is_allowed_filetype()) + { + $this->set_error('upload_invalid_filetype'); + return FALSE; + } + + // if we're overriding, let's now make sure the new name and type is allowed + if ($this->_file_name_override != '') + { + $this->file_name = $this->_prep_filename($this->_file_name_override); + + // If no extension was provided in the file_name config item, use the uploaded one + if (strpos($this->_file_name_override, '.') === FALSE) + { + $this->file_name .= $this->file_ext; + } + + // An extension was provided, lets have it! + else + { + $this->file_ext = $this->get_extension($this->_file_name_override); + } + + if ( ! $this->is_allowed_filetype(TRUE)) + { + $this->set_error('upload_invalid_filetype'); + return FALSE; + } + } + + // Convert the file size to kilobytes + if ($this->file_size > 0) + { + $this->file_size = round($this->file_size/1024, 2); + } + + // Is the file size within the allowed maximum? + if ( ! $this->is_allowed_filesize()) + { + $this->set_error('upload_invalid_filesize'); + return FALSE; + } + + // Are the image dimensions within the allowed size? + // Note: This can fail if the server has an open_basdir restriction. + if ( ! $this->is_allowed_dimensions()) + { + $this->set_error('upload_invalid_dimensions'); + return FALSE; + } + + // Sanitize the file name for security + $CI =& get_instance(); + $this->file_name = $CI->security->sanitize_filename($this->file_name); + + // Truncate the file name if it's too long + if ($this->max_filename > 0) + { + $this->file_name = $this->limit_filename_length($this->file_name, $this->max_filename); + } + + // Remove white spaces in the name + if ($this->remove_spaces == TRUE) + { + $this->file_name = preg_replace("/\s+/", "_", $this->file_name); + } + + /* + * Validate the file name + * This function appends an number onto the end of + * the file if one with the same name already exists. + * If it returns false there was a problem. + */ + $this->orig_name = $this->file_name; + + if ($this->overwrite == FALSE) + { + $this->file_name = $this->set_filename($this->upload_path, $this->file_name); + + if ($this->file_name === FALSE) + { + return FALSE; + } + } + + /* + * Run the file through the XSS hacking filter + * This helps prevent malicious code from being + * embedded within a file. Scripts can easily + * be disguised as images or other file types. + */ + if ($this->xss_clean) + { + if ($this->do_xss_clean() === FALSE) + { + $this->set_error('upload_unable_to_write_file'); + return FALSE; + } + } + + /* + * Move the file to the final destination + * To deal with different server configurations + * we'll attempt to use copy() first. If that fails + * we'll use move_uploaded_file(). One of the two should + * reliably work in most environments + */ + if ( ! @copy($this->file_temp, $this->upload_path.$this->file_name)) + { + if ( ! @move_uploaded_file($this->file_temp, $this->upload_path.$this->file_name)) + { + $this->set_error('upload_destination_error'); + return FALSE; + } + } + + /* + * Set the finalized image dimensions + * This sets the image width/height (assuming the + * file was an image). We use this information + * in the "data" function. + */ + $this->set_image_properties($this->upload_path.$this->file_name); + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Finalized Data Array + * + * Returns an associative array containing all of the information + * related to the upload, allowing the developer easy access in one array. + * + * @return array + */ + public function data() + { + return array ( + 'file_name' => $this->file_name, + 'file_type' => $this->file_type, + 'file_path' => $this->upload_path, + 'full_path' => $this->upload_path.$this->file_name, + 'raw_name' => str_replace($this->file_ext, '', $this->file_name), + 'orig_name' => $this->orig_name, + 'client_name' => $this->client_name, + 'file_ext' => $this->file_ext, + 'file_size' => $this->file_size, + 'is_image' => $this->is_image(), + 'image_width' => $this->image_width, + 'image_height' => $this->image_height, + 'image_type' => $this->image_type, + 'image_size_str' => $this->image_size_str, + ); + } + + // -------------------------------------------------------------------- + + /** + * Set Upload Path + * + * @param string + * @return void + */ + public function set_upload_path($path) + { + // Make sure it has a trailing slash + $this->upload_path = rtrim($path, '/').'/'; + } + + // -------------------------------------------------------------------- + + /** + * Set the file name + * + * This function takes a filename/path as input and looks for the + * existence of a file with the same name. If found, it will append a + * number to the end of the filename to avoid overwriting a pre-existing file. + * + * @param string + * @param string + * @return string + */ + public function set_filename($path, $filename) + { + if ($this->encrypt_name == TRUE) + { + mt_srand(); + $filename = md5(uniqid(mt_rand())).$this->file_ext; + } + + if ( ! file_exists($path.$filename)) + { + return $filename; + } + + $filename = str_replace($this->file_ext, '', $filename); + + $new_filename = ''; + for ($i = 1; $i < 100; $i++) + { + if ( ! file_exists($path.$filename.$i.$this->file_ext)) + { + $new_filename = $filename.$i.$this->file_ext; + break; + } + } + + if ($new_filename == '') + { + $this->set_error('upload_bad_filename'); + return FALSE; + } + else + { + return $new_filename; + } + } + + // -------------------------------------------------------------------- + + /** + * Set Maximum File Size + * + * @param integer + * @return void + */ + public function set_max_filesize($n) + { + $this->max_size = ((int) $n < 0) ? 0: (int) $n; + } + + // -------------------------------------------------------------------- + + /** + * Set Maximum File Name Length + * + * @param integer + * @return void + */ + public function set_max_filename($n) + { + $this->max_filename = ((int) $n < 0) ? 0: (int) $n; + } + + // -------------------------------------------------------------------- + + /** + * Set Maximum Image Width + * + * @param integer + * @return void + */ + public function set_max_width($n) + { + $this->max_width = ((int) $n < 0) ? 0: (int) $n; + } + + // -------------------------------------------------------------------- + + /** + * Set Maximum Image Height + * + * @param integer + * @return void + */ + public function set_max_height($n) + { + $this->max_height = ((int) $n < 0) ? 0: (int) $n; + } + + // -------------------------------------------------------------------- + + /** + * Set Allowed File Types + * + * @param string + * @return void + */ + public function set_allowed_types($types) + { + if ( ! is_array($types) && $types == '*') + { + $this->allowed_types = '*'; + return; + } + $this->allowed_types = explode('|', $types); + } + + // -------------------------------------------------------------------- + + /** + * Set Image Properties + * + * Uses GD to determine the width/height/type of image + * + * @param string + * @return void + */ + public function set_image_properties($path = '') + { + if ( ! $this->is_image()) + { + return; + } + + if (function_exists('getimagesize')) + { + if (FALSE !== ($D = @getimagesize($path))) + { + $types = array(1 => 'gif', 2 => 'jpeg', 3 => 'png'); + + $this->image_width = $D['0']; + $this->image_height = $D['1']; + $this->image_type = ( ! isset($types[$D['2']])) ? 'unknown' : $types[$D['2']]; + $this->image_size_str = $D['3']; // string containing height and width + } + } + } + + // -------------------------------------------------------------------- + + /** + * Set XSS Clean + * + * Enables the XSS flag so that the file that was uploaded + * will be run through the XSS filter. + * + * @param bool + * @return void + */ + public function set_xss_clean($flag = FALSE) + { + $this->xss_clean = ($flag == TRUE) ? TRUE : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Validate the image + * + * @return bool + */ + public function is_image() + { + // IE will sometimes return odd mime-types during upload, so here we just standardize all + // jpegs or pngs to the same file type. + + $png_mimes = array('image/x-png'); + $jpeg_mimes = array('image/jpg', 'image/jpe', 'image/jpeg', 'image/pjpeg'); + + if (in_array($this->file_type, $png_mimes)) + { + $this->file_type = 'image/png'; + } + + if (in_array($this->file_type, $jpeg_mimes)) + { + $this->file_type = 'image/jpeg'; + } + + $img_mimes = array( + 'image/gif', + 'image/jpeg', + 'image/png', + ); + + return (in_array($this->file_type, $img_mimes, TRUE)) ? TRUE : FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Verify that the filetype is allowed + * + * @return bool + */ + public function is_allowed_filetype($ignore_mime = FALSE) + { + if ($this->allowed_types == '*') + { + return TRUE; + } + + if (count($this->allowed_types) == 0 OR ! is_array($this->allowed_types)) + { + $this->set_error('upload_no_file_types'); + return FALSE; + } + + $ext = strtolower(ltrim($this->file_ext, '.')); + + if ( ! in_array($ext, $this->allowed_types)) + { + return FALSE; + } + + // Images get some additional checks + $image_types = array('gif', 'jpg', 'jpeg', 'png', 'jpe'); + + if (in_array($ext, $image_types)) + { + if (getimagesize($this->file_temp) === FALSE) + { + return FALSE; + } + } + + if ($ignore_mime === TRUE) + { + return TRUE; + } + + $mime = $this->mimes_types($ext); + + if (is_array($mime)) + { + if (in_array($this->file_type, $mime, TRUE)) + { + return TRUE; + } + } + elseif ($mime == $this->file_type) + { + return TRUE; + } + + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Verify that the file is within the allowed size + * + * @return bool + */ + public function is_allowed_filesize() + { + if ($this->max_size != 0 AND $this->file_size > $this->max_size) + { + return FALSE; + } + else + { + return TRUE; + } + } + + // -------------------------------------------------------------------- + + /** + * Verify that the image is within the allowed width/height + * + * @return bool + */ + public function is_allowed_dimensions() + { + if ( ! $this->is_image()) + { + return TRUE; + } + + if (function_exists('getimagesize')) + { + $D = @getimagesize($this->file_temp); + + if ($this->max_width > 0 AND $D['0'] > $this->max_width) + { + return FALSE; + } + + if ($this->max_height > 0 AND $D['1'] > $this->max_height) + { + return FALSE; + } + + return TRUE; + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Validate Upload Path + * + * Verifies that it is a valid upload path with proper permissions. + * + * + * @return bool + */ + public function validate_upload_path() + { + if ($this->upload_path == '') + { + $this->set_error('upload_no_filepath'); + return FALSE; + } + + if (function_exists('realpath') AND @realpath($this->upload_path) !== FALSE) + { + $this->upload_path = str_replace("\\", "/", realpath($this->upload_path)); + } + + if ( ! @is_dir($this->upload_path)) + { + $this->set_error('upload_no_filepath'); + return FALSE; + } + + if ( ! is_really_writable($this->upload_path)) + { + $this->set_error('upload_not_writable'); + return FALSE; + } + + $this->upload_path = preg_replace("/(.+?)\/*$/", "\\1/", $this->upload_path); + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Extract the file extension + * + * @param string + * @return string + */ + public function get_extension($filename) + { + $x = explode('.', $filename); + return '.'.end($x); + } + + // -------------------------------------------------------------------- + + /** + * Clean the file name for security + * + * @deprecated 2.2.1 Alias for CI_Security::sanitize_filename() + * @param string $filename + * @return string + */ + public function clean_file_name($filename) + { + $CI =& get_instance(); + return $CI->security->sanitize_filename($filename); + } + + // -------------------------------------------------------------------- + + /** + * Limit the File Name Length + * + * @param string + * @return string + */ + public function limit_filename_length($filename, $length) + { + if (strlen($filename) < $length) + { + return $filename; + } + + $ext = ''; + if (strpos($filename, '.') !== FALSE) + { + $parts = explode('.', $filename); + $ext = '.'.array_pop($parts); + $filename = implode('.', $parts); + } + + return substr($filename, 0, ($length - strlen($ext))).$ext; + } + + // -------------------------------------------------------------------- + + /** + * Runs the file through the XSS clean function + * + * This prevents people from embedding malicious code in their files. + * I'm not sure that it won't negatively affect certain files in unexpected ways, + * but so far I haven't found that it causes trouble. + * + * @return void + */ + public function do_xss_clean() + { + $file = $this->file_temp; + + if (filesize($file) == 0) + { + return FALSE; + } + + if (function_exists('memory_get_usage') && memory_get_usage() && ini_get('memory_limit') != '') + { + $current = ini_get('memory_limit') * 1024 * 1024; + + // There was a bug/behavioural change in PHP 5.2, where numbers over one million get output + // into scientific notation. number_format() ensures this number is an integer + // http://bugs.php.net/bug.php?id=43053 + + $new_memory = number_format(ceil(filesize($file) + $current), 0, '.', ''); + + ini_set('memory_limit', $new_memory); // When an integer is used, the value is measured in bytes. - PHP.net + } + + // If the file being uploaded is an image, then we should have no problem with XSS attacks (in theory), but + // IE can be fooled into mime-type detecting a malformed image as an html file, thus executing an XSS attack on anyone + // using IE who looks at the image. It does this by inspecting the first 255 bytes of an image. To get around this + // CI will itself look at the first 255 bytes of an image to determine its relative safety. This can save a lot of + // processor power and time if it is actually a clean image, as it will be in nearly all instances _except_ an + // attempted XSS attack. + + if (function_exists('getimagesize') && @getimagesize($file) !== FALSE) + { + if (($file = @fopen($file, 'rb')) === FALSE) // "b" to force binary + { + return FALSE; // Couldn't open the file, return FALSE + } + + $opening_bytes = fread($file, 256); + fclose($file); + + // These are known to throw IE into mime-type detection chaos + // <a, <body, <head, <html, <img, <plaintext, <pre, <script, <table, <title + // title is basically just in SVG, but we filter it anyhow + + if ( ! preg_match('/<(a|body|head|html|img|plaintext|pre|script|table|title)[\s>]/i', $opening_bytes)) + { + return TRUE; // its an image, no "triggers" detected in the first 256 bytes, we're good + } + else + { + return FALSE; + } + } + + if (($data = @file_get_contents($file)) === FALSE) + { + return FALSE; + } + + $CI =& get_instance(); + return $CI->security->xss_clean($data, TRUE); + } + + // -------------------------------------------------------------------- + + /** + * Set an error message + * + * @param string + * @return void + */ + public function set_error($msg) + { + $CI =& get_instance(); + $CI->lang->load('upload'); + + if (is_array($msg)) + { + foreach ($msg as $val) + { + $msg = ($CI->lang->line($val) == FALSE) ? $val : $CI->lang->line($val); + $this->error_msg[] = $msg; + log_message('error', $msg); + } + } + else + { + $msg = ($CI->lang->line($msg) == FALSE) ? $msg : $CI->lang->line($msg); + $this->error_msg[] = $msg; + log_message('error', $msg); + } + } + + // -------------------------------------------------------------------- + + /** + * Display the error message + * + * @param string + * @param string + * @return string + */ + public function display_errors($open = '<p>', $close = '</p>') + { + $str = ''; + foreach ($this->error_msg as $val) + { + $str .= $open.$val.$close; + } + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * List of Mime Types + * + * This is a list of mime types. We use it to validate + * the "allowed types" set by the developer + * + * @param string + * @return string + */ + public function mimes_types($mime) + { + global $mimes; + + if (count($this->mimes) == 0) + { + if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/mimes.php')) + { + include(APPPATH.'config/'.ENVIRONMENT.'/mimes.php'); + } + elseif (is_file(APPPATH.'config/mimes.php')) + { + include(APPPATH.'config//mimes.php'); + } + else + { + return FALSE; + } + + $this->mimes = $mimes; + unset($mimes); + } + + return ( ! isset($this->mimes[$mime])) ? FALSE : $this->mimes[$mime]; + } + + // -------------------------------------------------------------------- + + /** + * Prep Filename + * + * Prevents possible script execution from Apache's handling of files multiple extensions + * http://httpd.apache.org/docs/1.3/mod/mod_mime.html#multipleext + * + * @param string + * @return string + */ + protected function _prep_filename($filename) + { + if (strpos($filename, '.') === FALSE OR $this->allowed_types == '*') + { + return $filename; + } + + $parts = explode('.', $filename); + $ext = array_pop($parts); + $filename = array_shift($parts); + + foreach ($parts as $part) + { + if ( ! in_array(strtolower($part), $this->allowed_types) OR $this->mimes_types(strtolower($part)) === FALSE) + { + $filename .= '.'.$part.'_'; + } + else + { + $filename .= '.'.$part; + } + } + + $filename .= '.'.$ext; + + return $filename; + } + + // -------------------------------------------------------------------- + + /** + * File MIME type + * + * Detects the (actual) MIME type of the uploaded file, if possible. + * The input array is expected to be $_FILES[$field] + * + * @param array + * @return void + */ + protected function _file_mime_type($file) + { + // We'll need this to validate the MIME info string (e.g. text/plain; charset=us-ascii) + $regexp = '/^([a-z\-]+\/[a-z0-9\-\.\+]+)(;\s.+)?$/'; + + /* Fileinfo extension - most reliable method + * + * Unfortunately, prior to PHP 5.3 - it's only available as a PECL extension and the + * more convenient FILEINFO_MIME_TYPE flag doesn't exist. + */ + if (function_exists('finfo_file')) + { + $finfo = finfo_open(FILEINFO_MIME); + if (is_resource($finfo)) // It is possible that a FALSE value is returned, if there is no magic MIME database file found on the system + { + $mime = @finfo_file($finfo, $file['tmp_name']); + finfo_close($finfo); + + /* According to the comments section of the PHP manual page, + * it is possible that this function returns an empty string + * for some files (e.g. if they don't exist in the magic MIME database) + */ + if (is_string($mime) && preg_match($regexp, $mime, $matches)) + { + $this->file_type = $matches[1]; + return; + } + } + } + + /* This is an ugly hack, but UNIX-type systems provide a "native" way to detect the file type, + * which is still more secure than depending on the value of $_FILES[$field]['type'], and as it + * was reported in issue #750 (https://github.com/bcit-ci/CodeIgniter/issues/750) - it's better + * than mime_content_type() as well, hence the attempts to try calling the command line with + * three different functions. + * + * Notes: + * - the DIRECTORY_SEPARATOR comparison ensures that we're not on a Windows system + * - many system admins would disable the exec(), shell_exec(), popen() and similar functions + * due to security concerns, hence the function_exists() checks + */ + if (DIRECTORY_SEPARATOR !== '\\') + { + $cmd = 'file --brief --mime ' . escapeshellarg($file['tmp_name']) . ' 2>&1'; + + if (function_exists('exec')) + { + /* This might look confusing, as $mime is being populated with all of the output when set in the second parameter. + * However, we only neeed the last line, which is the actual return value of exec(), and as such - it overwrites + * anything that could already be set for $mime previously. This effectively makes the second parameter a dummy + * value, which is only put to allow us to get the return status code. + */ + $mime = @exec($cmd, $mime, $return_status); + if ($return_status === 0 && is_string($mime) && preg_match($regexp, $mime, $matches)) + { + $this->file_type = $matches[1]; + return; + } + } + + if ( (bool) @ini_get('safe_mode') === FALSE && function_exists('shell_exec')) + { + $mime = @shell_exec($cmd); + if (strlen($mime) > 0) + { + $mime = explode("\n", trim($mime)); + if (preg_match($regexp, $mime[(count($mime) - 1)], $matches)) + { + $this->file_type = $matches[1]; + return; + } + } + } + + if (function_exists('popen')) + { + $proc = @popen($cmd, 'r'); + if (is_resource($proc)) + { + $mime = @fread($proc, 512); + @pclose($proc); + if ($mime !== FALSE) + { + $mime = explode("\n", trim($mime)); + if (preg_match($regexp, $mime[(count($mime) - 1)], $matches)) + { + $this->file_type = $matches[1]; + return; + } + } + } + } + } + + // Fall back to the deprecated mime_content_type(), if available (still better than $_FILES[$field]['type']) + if (function_exists('mime_content_type')) + { + $this->file_type = @mime_content_type($file['tmp_name']); + if (strlen($this->file_type) > 0) // It's possible that mime_content_type() returns FALSE or an empty string + { + return; + } + } + + $this->file_type = $file['type']; + } + + // -------------------------------------------------------------------- + +} +// END Upload Class + +/* End of file Upload.php */ +/* Location: ./system/libraries/Upload.php */ diff --git a/system/libraries/User_agent.php b/system/libraries/User_agent.php new file mode 100644 index 0000000..6d5001f --- /dev/null +++ b/system/libraries/User_agent.php @@ -0,0 +1,550 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * User Agent Class + * + * Identifies the platform, browser, robot, or mobile devise of the browsing agent + * + * @package CodeIgniter + * @subpackage Libraries + * @category User Agent + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/user_agent.html + */ +class CI_User_agent { + + var $agent = NULL; + + var $is_browser = FALSE; + var $is_robot = FALSE; + var $is_mobile = FALSE; + + var $languages = array(); + var $charsets = array(); + + var $platforms = array(); + var $browsers = array(); + var $mobiles = array(); + var $robots = array(); + + var $platform = ''; + var $browser = ''; + var $version = ''; + var $mobile = ''; + var $robot = ''; + + /** + * Constructor + * + * Sets the User Agent and runs the compilation routine + * + * @access public + * @return void + */ + public function __construct() + { + if (isset($_SERVER['HTTP_USER_AGENT'])) + { + $this->agent = trim($_SERVER['HTTP_USER_AGENT']); + } + + if ( ! is_null($this->agent)) + { + if ($this->_load_agent_file()) + { + $this->_compile_data(); + } + } + + log_message('debug', "User Agent Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * Compile the User Agent Data + * + * @access private + * @return bool + */ + private function _load_agent_file() + { + if (defined('ENVIRONMENT') AND is_file(APPPATH.'config/'.ENVIRONMENT.'/user_agents.php')) + { + include(APPPATH.'config/'.ENVIRONMENT.'/user_agents.php'); + } + elseif (is_file(APPPATH.'config/user_agents.php')) + { + include(APPPATH.'config/user_agents.php'); + } + else + { + return FALSE; + } + + $return = FALSE; + + if (isset($platforms)) + { + $this->platforms = $platforms; + unset($platforms); + $return = TRUE; + } + + if (isset($browsers)) + { + $this->browsers = $browsers; + unset($browsers); + $return = TRUE; + } + + if (isset($mobiles)) + { + $this->mobiles = $mobiles; + unset($mobiles); + $return = TRUE; + } + + if (isset($robots)) + { + $this->robots = $robots; + unset($robots); + $return = TRUE; + } + + return $return; + } + + // -------------------------------------------------------------------- + + /** + * Compile the User Agent Data + * + * @access private + * @return bool + */ + private function _compile_data() + { + $this->_set_platform(); + + foreach (array('_set_robot', '_set_browser', '_set_mobile') as $function) + { + if ($this->$function() === TRUE) + { + break; + } + } + } + + // -------------------------------------------------------------------- + + /** + * Set the Platform + * + * @access private + * @return mixed + */ + private function _set_platform() + { + if (is_array($this->platforms) AND count($this->platforms) > 0) + { + foreach ($this->platforms as $key => $val) + { + if (preg_match("|".preg_quote($key)."|i", $this->agent)) + { + $this->platform = $val; + return TRUE; + } + } + } + $this->platform = 'Unknown Platform'; + } + + // -------------------------------------------------------------------- + + /** + * Set the Browser + * + * @access private + * @return bool + */ + private function _set_browser() + { + if (is_array($this->browsers) AND count($this->browsers) > 0) + { + foreach ($this->browsers as $key => $val) + { + if (preg_match("|".preg_quote($key).".*?([0-9\.]+)|i", $this->agent, $match)) + { + $this->is_browser = TRUE; + $this->version = $match[1]; + $this->browser = $val; + $this->_set_mobile(); + return TRUE; + } + } + } + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Set the Robot + * + * @access private + * @return bool + */ + private function _set_robot() + { + if (is_array($this->robots) AND count($this->robots) > 0) + { + foreach ($this->robots as $key => $val) + { + if (preg_match("|".preg_quote($key)."|i", $this->agent)) + { + $this->is_robot = TRUE; + $this->robot = $val; + return TRUE; + } + } + } + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Set the Mobile Device + * + * @access private + * @return bool + */ + private function _set_mobile() + { + if (is_array($this->mobiles) AND count($this->mobiles) > 0) + { + foreach ($this->mobiles as $key => $val) + { + if (FALSE !== (strpos(strtolower($this->agent), $key))) + { + $this->is_mobile = TRUE; + $this->mobile = $val; + return TRUE; + } + } + } + return FALSE; + } + + // -------------------------------------------------------------------- + + /** + * Set the accepted languages + * + * @access private + * @return void + */ + private function _set_languages() + { + if ((count($this->languages) == 0) AND isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) AND $_SERVER['HTTP_ACCEPT_LANGUAGE'] != '') + { + $languages = preg_replace('/(;q=[0-9\.]+)/i', '', strtolower(trim($_SERVER['HTTP_ACCEPT_LANGUAGE']))); + + $this->languages = explode(',', $languages); + } + + if (count($this->languages) == 0) + { + $this->languages = array('Undefined'); + } + } + + // -------------------------------------------------------------------- + + /** + * Set the accepted character sets + * + * @access private + * @return void + */ + private function _set_charsets() + { + if ((count($this->charsets) == 0) AND isset($_SERVER['HTTP_ACCEPT_CHARSET']) AND $_SERVER['HTTP_ACCEPT_CHARSET'] != '') + { + $charsets = preg_replace('/(;q=.+)/i', '', strtolower(trim($_SERVER['HTTP_ACCEPT_CHARSET']))); + + $this->charsets = explode(',', $charsets); + } + + if (count($this->charsets) == 0) + { + $this->charsets = array('Undefined'); + } + } + + // -------------------------------------------------------------------- + + /** + * Is Browser + * + * @access public + * @return bool + */ + public function is_browser($key = NULL) + { + if ( ! $this->is_browser) + { + return FALSE; + } + + // No need to be specific, it's a browser + if ($key === NULL) + { + return TRUE; + } + + // Check for a specific browser + return array_key_exists($key, $this->browsers) AND $this->browser === $this->browsers[$key]; + } + + // -------------------------------------------------------------------- + + /** + * Is Robot + * + * @access public + * @return bool + */ + public function is_robot($key = NULL) + { + if ( ! $this->is_robot) + { + return FALSE; + } + + // No need to be specific, it's a robot + if ($key === NULL) + { + return TRUE; + } + + // Check for a specific robot + return array_key_exists($key, $this->robots) AND $this->robot === $this->robots[$key]; + } + + // -------------------------------------------------------------------- + + /** + * Is Mobile + * + * @access public + * @return bool + */ + public function is_mobile($key = NULL) + { + if ( ! $this->is_mobile) + { + return FALSE; + } + + // No need to be specific, it's a mobile + if ($key === NULL) + { + return TRUE; + } + + // Check for a specific robot + return array_key_exists($key, $this->mobiles) AND $this->mobile === $this->mobiles[$key]; + } + + // -------------------------------------------------------------------- + + /** + * Is this a referral from another site? + * + * @access public + * @return bool + */ + public function is_referral() + { + if ( ! isset($_SERVER['HTTP_REFERER']) OR $_SERVER['HTTP_REFERER'] == '') + { + return FALSE; + } + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Agent String + * + * @access public + * @return string + */ + public function agent_string() + { + return $this->agent; + } + + // -------------------------------------------------------------------- + + /** + * Get Platform + * + * @access public + * @return string + */ + public function platform() + { + return $this->platform; + } + + // -------------------------------------------------------------------- + + /** + * Get Browser Name + * + * @access public + * @return string + */ + public function browser() + { + return $this->browser; + } + + // -------------------------------------------------------------------- + + /** + * Get the Browser Version + * + * @access public + * @return string + */ + public function version() + { + return $this->version; + } + + // -------------------------------------------------------------------- + + /** + * Get The Robot Name + * + * @access public + * @return string + */ + public function robot() + { + return $this->robot; + } + // -------------------------------------------------------------------- + + /** + * Get the Mobile Device + * + * @access public + * @return string + */ + public function mobile() + { + return $this->mobile; + } + + // -------------------------------------------------------------------- + + /** + * Get the referrer + * + * @access public + * @return bool + */ + public function referrer() + { + return ( ! isset($_SERVER['HTTP_REFERER']) OR $_SERVER['HTTP_REFERER'] == '') ? '' : trim($_SERVER['HTTP_REFERER']); + } + + // -------------------------------------------------------------------- + + /** + * Get the accepted languages + * + * @access public + * @return array + */ + public function languages() + { + if (count($this->languages) == 0) + { + $this->_set_languages(); + } + + return $this->languages; + } + + // -------------------------------------------------------------------- + + /** + * Get the accepted Character Sets + * + * @access public + * @return array + */ + public function charsets() + { + if (count($this->charsets) == 0) + { + $this->_set_charsets(); + } + + return $this->charsets; + } + + // -------------------------------------------------------------------- + + /** + * Test for a particular language + * + * @access public + * @return bool + */ + public function accept_lang($lang = 'en') + { + return (in_array(strtolower($lang), $this->languages(), TRUE)); + } + + // -------------------------------------------------------------------- + + /** + * Test for a particular character set + * + * @access public + * @return bool + */ + public function accept_charset($charset = 'utf-8') + { + return (in_array(strtolower($charset), $this->charsets(), TRUE)); + } + +} + + +/* End of file User_agent.php */ +/* Location: ./system/libraries/User_agent.php */ \ No newline at end of file diff --git a/system/libraries/Xmlrpc.php b/system/libraries/Xmlrpc.php new file mode 100644 index 0000000..08ef690 --- /dev/null +++ b/system/libraries/Xmlrpc.php @@ -0,0 +1,1424 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +if ( ! function_exists('xml_parser_create')) +{ + show_error('Your PHP installation does not support XML'); +} + + +// ------------------------------------------------------------------------ + +/** + * XML-RPC request handler class + * + * @package CodeIgniter + * @subpackage Libraries + * @category XML-RPC + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html + */ +class CI_Xmlrpc { + + var $debug = FALSE; // Debugging on or off + var $xmlrpcI4 = 'i4'; + var $xmlrpcInt = 'int'; + var $xmlrpcBoolean = 'boolean'; + var $xmlrpcDouble = 'double'; + var $xmlrpcString = 'string'; + var $xmlrpcDateTime = 'dateTime.iso8601'; + var $xmlrpcBase64 = 'base64'; + var $xmlrpcArray = 'array'; + var $xmlrpcStruct = 'struct'; + + var $xmlrpcTypes = array(); + var $valid_parents = array(); + var $xmlrpcerr = array(); // Response numbers + var $xmlrpcstr = array(); // Response strings + + var $xmlrpc_defencoding = 'UTF-8'; + var $xmlrpcName = 'XML-RPC for CodeIgniter'; + var $xmlrpcVersion = '1.1'; + var $xmlrpcerruser = 800; // Start of user errors + var $xmlrpcerrxml = 100; // Start of XML Parse errors + var $xmlrpc_backslash = ''; // formulate backslashes for escaping regexp + + var $client; + var $method; + var $data; + var $message = ''; + var $error = ''; // Error string for request + var $result; + var $response = array(); // Response from remote server + + var $xss_clean = TRUE; + + //------------------------------------- + // VALUES THAT MULTIPLE CLASSES NEED + //------------------------------------- + + public function __construct($config = array()) + { + $this->xmlrpcName = $this->xmlrpcName; + $this->xmlrpc_backslash = chr(92).chr(92); + + // Types for info sent back and forth + $this->xmlrpcTypes = array( + $this->xmlrpcI4 => '1', + $this->xmlrpcInt => '1', + $this->xmlrpcBoolean => '1', + $this->xmlrpcString => '1', + $this->xmlrpcDouble => '1', + $this->xmlrpcDateTime => '1', + $this->xmlrpcBase64 => '1', + $this->xmlrpcArray => '2', + $this->xmlrpcStruct => '3' + ); + + // Array of Valid Parents for Various XML-RPC elements + $this->valid_parents = array('BOOLEAN' => array('VALUE'), + 'I4' => array('VALUE'), + 'INT' => array('VALUE'), + 'STRING' => array('VALUE'), + 'DOUBLE' => array('VALUE'), + 'DATETIME.ISO8601' => array('VALUE'), + 'BASE64' => array('VALUE'), + 'ARRAY' => array('VALUE'), + 'STRUCT' => array('VALUE'), + 'PARAM' => array('PARAMS'), + 'METHODNAME' => array('METHODCALL'), + 'PARAMS' => array('METHODCALL', 'METHODRESPONSE'), + 'MEMBER' => array('STRUCT'), + 'NAME' => array('MEMBER'), + 'DATA' => array('ARRAY'), + 'FAULT' => array('METHODRESPONSE'), + 'VALUE' => array('MEMBER', 'DATA', 'PARAM', 'FAULT') + ); + + + // XML-RPC Responses + $this->xmlrpcerr['unknown_method'] = '1'; + $this->xmlrpcstr['unknown_method'] = 'This is not a known method for this XML-RPC Server'; + $this->xmlrpcerr['invalid_return'] = '2'; + $this->xmlrpcstr['invalid_return'] = 'The XML data received was either invalid or not in the correct form for XML-RPC. Turn on debugging to examine the XML data further.'; + $this->xmlrpcerr['incorrect_params'] = '3'; + $this->xmlrpcstr['incorrect_params'] = 'Incorrect parameters were passed to method'; + $this->xmlrpcerr['introspect_unknown'] = '4'; + $this->xmlrpcstr['introspect_unknown'] = "Cannot inspect signature for request: method unknown"; + $this->xmlrpcerr['http_error'] = '5'; + $this->xmlrpcstr['http_error'] = "Did not receive a '200 OK' response from remote server."; + $this->xmlrpcerr['no_data'] = '6'; + $this->xmlrpcstr['no_data'] ='No data received from server.'; + + $this->initialize($config); + + log_message('debug', "XML-RPC Class Initialized"); + } + + + //------------------------------------- + // Initialize Prefs + //------------------------------------- + + function initialize($config = array()) + { + if (count($config) > 0) + { + foreach ($config as $key => $val) + { + if (isset($this->$key)) + { + $this->$key = $val; + } + } + } + } + // END + + //------------------------------------- + // Take URL and parse it + //------------------------------------- + + function server($url, $port=80) + { + if (substr($url, 0, 4) != "http") + { + $url = "http://".$url; + } + + $parts = parse_url($url); + + $path = ( ! isset($parts['path'])) ? '/' : $parts['path']; + + if (isset($parts['query']) && $parts['query'] != '') + { + $path .= '?'.$parts['query']; + } + + $this->client = new XML_RPC_Client($path, $parts['host'], $port); + } + // END + + //------------------------------------- + // Set Timeout + //------------------------------------- + + function timeout($seconds=5) + { + if ( ! is_null($this->client) && is_int($seconds)) + { + $this->client->timeout = $seconds; + } + } + // END + + //------------------------------------- + // Set Methods + //------------------------------------- + + function method($function) + { + $this->method = $function; + } + // END + + //------------------------------------- + // Take Array of Data and Create Objects + //------------------------------------- + + function request($incoming) + { + if ( ! is_array($incoming)) + { + // Send Error + } + + $this->data = array(); + + foreach ($incoming as $key => $value) + { + $this->data[$key] = $this->values_parsing($value); + } + } + // END + + + //------------------------------------- + // Set Debug + //------------------------------------- + + function set_debug($flag = TRUE) + { + $this->debug = ($flag == TRUE) ? TRUE : FALSE; + } + + //------------------------------------- + // Values Parsing + //------------------------------------- + + function values_parsing($value, $return = FALSE) + { + if (is_array($value) && array_key_exists(0, $value)) + { + if ( ! isset($value['1']) OR ( ! isset($this->xmlrpcTypes[$value['1']]))) + { + if (is_array($value[0])) + { + $temp = new XML_RPC_Values($value['0'], 'array'); + } + else + { + $temp = new XML_RPC_Values($value['0'], 'string'); + } + } + elseif (is_array($value['0']) && ($value['1'] == 'struct' OR $value['1'] == 'array')) + { + while (list($k) = each($value['0'])) + { + $value['0'][$k] = $this->values_parsing($value['0'][$k], TRUE); + } + + $temp = new XML_RPC_Values($value['0'], $value['1']); + } + else + { + $temp = new XML_RPC_Values($value['0'], $value['1']); + } + } + else + { + $temp = new XML_RPC_Values($value, 'string'); + } + + return $temp; + } + // END + + + //------------------------------------- + // Sends XML-RPC Request + //------------------------------------- + + function send_request() + { + $this->message = new XML_RPC_Message($this->method,$this->data); + $this->message->debug = $this->debug; + + if ( ! $this->result = $this->client->send($this->message)) + { + $this->error = $this->result->errstr; + return FALSE; + } + elseif ( ! is_object($this->result->val)) + { + $this->error = $this->result->errstr; + return FALSE; + } + + $this->response = $this->result->decode(); + + return TRUE; + } + // END + + //------------------------------------- + // Returns Error + //------------------------------------- + + function display_error() + { + return $this->error; + } + // END + + //------------------------------------- + // Returns Remote Server Response + //------------------------------------- + + function display_response() + { + return $this->response; + } + // END + + //------------------------------------- + // Sends an Error Message for Server Request + //------------------------------------- + + function send_error_message($number, $message) + { + return new XML_RPC_Response('0',$number, $message); + } + // END + + + //------------------------------------- + // Send Response for Server Request + //------------------------------------- + + function send_response($response) + { + // $response should be array of values, which will be parsed + // based on their data and type into a valid group of XML-RPC values + + $response = $this->values_parsing($response); + + return new XML_RPC_Response($response); + } + // END + +} // END XML_RPC Class + + + +/** + * XML-RPC Client class + * + * @category XML-RPC + * @author ExpressionEngine Dev Team + * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html + */ +class XML_RPC_Client extends CI_Xmlrpc +{ + var $path = ''; + var $server = ''; + var $port = 80; + var $errno = ''; + var $errstring = ''; + var $timeout = 5; + var $no_multicall = FALSE; + + public function __construct($path, $server, $port=80) + { + parent::__construct(); + + $this->port = $port; + $this->server = $server; + $this->path = $path; + } + + function send($msg) + { + if (is_array($msg)) + { + // Multi-call disabled + $r = new XML_RPC_Response(0, $this->xmlrpcerr['multicall_recursion'],$this->xmlrpcstr['multicall_recursion']); + return $r; + } + + return $this->sendPayload($msg); + } + + function sendPayload($msg) + { + $fp = @fsockopen($this->server, $this->port,$this->errno, $this->errstr, $this->timeout); + + if ( ! is_resource($fp)) + { + error_log($this->xmlrpcstr['http_error']); + $r = new XML_RPC_Response(0, $this->xmlrpcerr['http_error'],$this->xmlrpcstr['http_error']); + return $r; + } + + if (empty($msg->payload)) + { + // $msg = XML_RPC_Messages + $msg->createPayload(); + } + + $r = "\r\n"; + $op = "POST {$this->path} HTTP/1.0$r"; + $op .= "Host: {$this->server}$r"; + $op .= "Content-Type: text/xml$r"; + $op .= "User-Agent: {$this->xmlrpcName}$r"; + $op .= "Content-Length: ".strlen($msg->payload). "$r$r"; + $op .= $msg->payload; + + + if ( ! fputs($fp, $op, strlen($op))) + { + error_log($this->xmlrpcstr['http_error']); + $r = new XML_RPC_Response(0, $this->xmlrpcerr['http_error'], $this->xmlrpcstr['http_error']); + return $r; + } + $resp = $msg->parseResponse($fp); + fclose($fp); + return $resp; + } + +} // end class XML_RPC_Client + + +/** + * XML-RPC Response class + * + * @category XML-RPC + * @author ExpressionEngine Dev Team + * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html + */ +class XML_RPC_Response +{ + var $val = 0; + var $errno = 0; + var $errstr = ''; + var $headers = array(); + var $xss_clean = TRUE; + + public function __construct($val, $code = 0, $fstr = '') + { + if ($code != 0) + { + // error + $this->errno = $code; + $this->errstr = htmlentities($fstr); + } + else if ( ! is_object($val)) + { + // programmer error, not an object + error_log("Invalid type '" . gettype($val) . "' (value: $val) passed to XML_RPC_Response. Defaulting to empty value."); + $this->val = new XML_RPC_Values(); + } + else + { + $this->val = $val; + } + } + + function faultCode() + { + return $this->errno; + } + + function faultString() + { + return $this->errstr; + } + + function value() + { + return $this->val; + } + + function prepare_response() + { + $result = "<methodResponse>\n"; + if ($this->errno) + { + $result .= '<fault> + <value> + <struct> + <member> + <name>faultCode</name> + <value><int>' . $this->errno . '</int></value> + </member> + <member> + <name>faultString</name> + <value><string>' . $this->errstr . '</string></value> + </member> + </struct> + </value> +</fault>'; + } + else + { + $result .= "<params>\n<param>\n" . + $this->val->serialize_class() . + "</param>\n</params>"; + } + $result .= "\n</methodResponse>"; + return $result; + } + + function decode($array=FALSE) + { + $CI =& get_instance(); + + if ($array !== FALSE && is_array($array)) + { + while (list($key) = each($array)) + { + if (is_array($array[$key])) + { + $array[$key] = $this->decode($array[$key]); + } + else + { + $array[$key] = ($this->xss_clean) ? $CI->security->xss_clean($array[$key]) : $array[$key]; + } + } + + $result = $array; + } + else + { + $result = $this->xmlrpc_decoder($this->val); + + if (is_array($result)) + { + $result = $this->decode($result); + } + else + { + $result = ($this->xss_clean) ? $CI->security->xss_clean($result) : $result; + } + } + + return $result; + } + + + + //------------------------------------- + // XML-RPC Object to PHP Types + //------------------------------------- + + function xmlrpc_decoder($xmlrpc_val) + { + $kind = $xmlrpc_val->kindOf(); + + if ($kind == 'scalar') + { + return $xmlrpc_val->scalarval(); + } + elseif ($kind == 'array') + { + reset($xmlrpc_val->me); + list($a,$b) = each($xmlrpc_val->me); + $size = count($b); + + $arr = array(); + + for ($i = 0; $i < $size; $i++) + { + $arr[] = $this->xmlrpc_decoder($xmlrpc_val->me['array'][$i]); + } + return $arr; + } + elseif ($kind == 'struct') + { + reset($xmlrpc_val->me['struct']); + $arr = array(); + + while (list($key,$value) = each($xmlrpc_val->me['struct'])) + { + $arr[$key] = $this->xmlrpc_decoder($value); + } + return $arr; + } + } + + + //------------------------------------- + // ISO-8601 time to server or UTC time + //------------------------------------- + + function iso8601_decode($time, $utc=0) + { + // return a timet in the localtime, or UTC + $t = 0; + if (preg_match('/([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})/', $time, $regs)) + { + $fnc = ($utc == 1) ? 'gmmktime' : 'mktime'; + $t = $fnc($regs[4], $regs[5], $regs[6], $regs[2], $regs[3], $regs[1]); + } + return $t; + } + +} // End Response Class + + + +/** + * XML-RPC Message class + * + * @category XML-RPC + * @author ExpressionEngine Dev Team + * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html + */ +class XML_RPC_Message extends CI_Xmlrpc +{ + var $payload; + var $method_name; + var $params = array(); + var $xh = array(); + + public function __construct($method, $pars=0) + { + parent::__construct(); + + $this->method_name = $method; + if (is_array($pars) && count($pars) > 0) + { + for ($i=0; $i<count($pars); $i++) + { + // $pars[$i] = XML_RPC_Values + $this->params[] = $pars[$i]; + } + } + } + + //------------------------------------- + // Create Payload to Send + //------------------------------------- + + function createPayload() + { + $this->payload = "<?xml version=\"1.0\"?".">\r\n<methodCall>\r\n"; + $this->payload .= '<methodName>' . $this->method_name . "</methodName>\r\n"; + $this->payload .= "<params>\r\n"; + + for ($i=0; $i<count($this->params); $i++) + { + // $p = XML_RPC_Values + $p = $this->params[$i]; + $this->payload .= "<param>\r\n".$p->serialize_class()."</param>\r\n"; + } + + $this->payload .= "</params>\r\n</methodCall>\r\n"; + } + + //------------------------------------- + // Parse External XML-RPC Server's Response + //------------------------------------- + + function parseResponse($fp) + { + $data = ''; + + while ($datum = fread($fp, 4096)) + { + $data .= $datum; + } + + //------------------------------------- + // DISPLAY HTTP CONTENT for DEBUGGING + //------------------------------------- + + if ($this->debug === TRUE) + { + echo "<pre>"; + echo "---DATA---\n" . htmlspecialchars($data) . "\n---END DATA---\n\n"; + echo "</pre>"; + } + + //------------------------------------- + // Check for data + //------------------------------------- + + if ($data == "") + { + error_log($this->xmlrpcstr['no_data']); + $r = new XML_RPC_Response(0, $this->xmlrpcerr['no_data'], $this->xmlrpcstr['no_data']); + return $r; + } + + + //------------------------------------- + // Check for HTTP 200 Response + //------------------------------------- + + if (strncmp($data, 'HTTP', 4) == 0 && ! preg_match('/^HTTP\/[0-9\.]+ 200 /', $data)) + { + $errstr= substr($data, 0, strpos($data, "\n")-1); + $r = new XML_RPC_Response(0, $this->xmlrpcerr['http_error'], $this->xmlrpcstr['http_error']. ' (' . $errstr . ')'); + return $r; + } + + //------------------------------------- + // Create and Set Up XML Parser + //------------------------------------- + + $parser = xml_parser_create($this->xmlrpc_defencoding); + + $this->xh[$parser] = array(); + $this->xh[$parser]['isf'] = 0; + $this->xh[$parser]['ac'] = ''; + $this->xh[$parser]['headers'] = array(); + $this->xh[$parser]['stack'] = array(); + $this->xh[$parser]['valuestack'] = array(); + $this->xh[$parser]['isf_reason'] = 0; + + xml_set_object($parser, $this); + xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true); + xml_set_element_handler($parser, 'open_tag', 'closing_tag'); + xml_set_character_data_handler($parser, 'character_data'); + //xml_set_default_handler($parser, 'default_handler'); + + + //------------------------------------- + // GET HEADERS + //------------------------------------- + + $lines = explode("\r\n", $data); + while (($line = array_shift($lines))) + { + if (strlen($line) < 1) + { + break; + } + $this->xh[$parser]['headers'][] = $line; + } + $data = implode("\r\n", $lines); + + + //------------------------------------- + // PARSE XML DATA + //------------------------------------- + + if ( ! xml_parse($parser, $data, count($data))) + { + $errstr = sprintf('XML error: %s at line %d', + xml_error_string(xml_get_error_code($parser)), + xml_get_current_line_number($parser)); + //error_log($errstr); + $r = new XML_RPC_Response(0, $this->xmlrpcerr['invalid_return'], $this->xmlrpcstr['invalid_return']); + xml_parser_free($parser); + return $r; + } + xml_parser_free($parser); + + // --------------------------------------- + // Got Ourselves Some Badness, It Seems + // --------------------------------------- + + if ($this->xh[$parser]['isf'] > 1) + { + if ($this->debug === TRUE) + { + echo "---Invalid Return---\n"; + echo $this->xh[$parser]['isf_reason']; + echo "---Invalid Return---\n\n"; + } + + $r = new XML_RPC_Response(0, $this->xmlrpcerr['invalid_return'],$this->xmlrpcstr['invalid_return'].' '.$this->xh[$parser]['isf_reason']); + return $r; + } + elseif ( ! is_object($this->xh[$parser]['value'])) + { + $r = new XML_RPC_Response(0, $this->xmlrpcerr['invalid_return'],$this->xmlrpcstr['invalid_return'].' '.$this->xh[$parser]['isf_reason']); + return $r; + } + + //------------------------------------- + // DISPLAY XML CONTENT for DEBUGGING + //------------------------------------- + + if ($this->debug === TRUE) + { + echo "<pre>"; + + if (count($this->xh[$parser]['headers'] > 0)) + { + echo "---HEADERS---\n"; + foreach ($this->xh[$parser]['headers'] as $header) + { + echo "$header\n"; + } + echo "---END HEADERS---\n\n"; + } + + echo "---DATA---\n" . htmlspecialchars($data) . "\n---END DATA---\n\n"; + + echo "---PARSED---\n" ; + var_dump($this->xh[$parser]['value']); + echo "\n---END PARSED---</pre>"; + } + + //------------------------------------- + // SEND RESPONSE + //------------------------------------- + + $v = $this->xh[$parser]['value']; + + if ($this->xh[$parser]['isf']) + { + $errno_v = $v->me['struct']['faultCode']; + $errstr_v = $v->me['struct']['faultString']; + $errno = $errno_v->scalarval(); + + if ($errno == 0) + { + // FAULT returned, errno needs to reflect that + $errno = -1; + } + + $r = new XML_RPC_Response($v, $errno, $errstr_v->scalarval()); + } + else + { + $r = new XML_RPC_Response($v); + } + + $r->headers = $this->xh[$parser]['headers']; + return $r; + } + + // ------------------------------------ + // Begin Return Message Parsing section + // ------------------------------------ + + // quick explanation of components: + // ac - used to accumulate values + // isf - used to indicate a fault + // lv - used to indicate "looking for a value": implements + // the logic to allow values with no types to be strings + // params - used to store parameters in method calls + // method - used to store method name + // stack - array with parent tree of the xml element, + // used to validate the nesting of elements + + //------------------------------------- + // Start Element Handler + //------------------------------------- + + function open_tag($the_parser, $name, $attrs) + { + // If invalid nesting, then return + if ($this->xh[$the_parser]['isf'] > 1) return; + + // Evaluate and check for correct nesting of XML elements + + if (count($this->xh[$the_parser]['stack']) == 0) + { + if ($name != 'METHODRESPONSE' && $name != 'METHODCALL') + { + $this->xh[$the_parser]['isf'] = 2; + $this->xh[$the_parser]['isf_reason'] = 'Top level XML-RPC element is missing'; + return; + } + } + else + { + // not top level element: see if parent is OK + if ( ! in_array($this->xh[$the_parser]['stack'][0], $this->valid_parents[$name], TRUE)) + { + $this->xh[$the_parser]['isf'] = 2; + $this->xh[$the_parser]['isf_reason'] = "XML-RPC element $name cannot be child of ".$this->xh[$the_parser]['stack'][0]; + return; + } + } + + switch($name) + { + case 'STRUCT': + case 'ARRAY': + // Creates array for child elements + + $cur_val = array('value' => array(), + 'type' => $name); + + array_unshift($this->xh[$the_parser]['valuestack'], $cur_val); + break; + case 'METHODNAME': + case 'NAME': + $this->xh[$the_parser]['ac'] = ''; + break; + case 'FAULT': + $this->xh[$the_parser]['isf'] = 1; + break; + case 'PARAM': + $this->xh[$the_parser]['value'] = NULL; + break; + case 'VALUE': + $this->xh[$the_parser]['vt'] = 'value'; + $this->xh[$the_parser]['ac'] = ''; + $this->xh[$the_parser]['lv'] = 1; + break; + case 'I4': + case 'INT': + case 'STRING': + case 'BOOLEAN': + case 'DOUBLE': + case 'DATETIME.ISO8601': + case 'BASE64': + if ($this->xh[$the_parser]['vt'] != 'value') + { + //two data elements inside a value: an error occurred! + $this->xh[$the_parser]['isf'] = 2; + $this->xh[$the_parser]['isf_reason'] = "'Twas a $name element following a ".$this->xh[$the_parser]['vt']." element inside a single value"; + return; + } + + $this->xh[$the_parser]['ac'] = ''; + break; + case 'MEMBER': + // Set name of <member> to nothing to prevent errors later if no <name> is found + $this->xh[$the_parser]['valuestack'][0]['name'] = ''; + + // Set NULL value to check to see if value passed for this param/member + $this->xh[$the_parser]['value'] = NULL; + break; + case 'DATA': + case 'METHODCALL': + case 'METHODRESPONSE': + case 'PARAMS': + // valid elements that add little to processing + break; + default: + /// An Invalid Element is Found, so we have trouble + $this->xh[$the_parser]['isf'] = 2; + $this->xh[$the_parser]['isf_reason'] = "Invalid XML-RPC element found: $name"; + break; + } + + // Add current element name to stack, to allow validation of nesting + array_unshift($this->xh[$the_parser]['stack'], $name); + + if ($name != 'VALUE') $this->xh[$the_parser]['lv'] = 0; + } + // END + + + //------------------------------------- + // End Element Handler + //------------------------------------- + + function closing_tag($the_parser, $name) + { + if ($this->xh[$the_parser]['isf'] > 1) return; + + // Remove current element from stack and set variable + // NOTE: If the XML validates, then we do not have to worry about + // the opening and closing of elements. Nesting is checked on the opening + // tag so we be safe there as well. + + $curr_elem = array_shift($this->xh[$the_parser]['stack']); + + switch($name) + { + case 'STRUCT': + case 'ARRAY': + $cur_val = array_shift($this->xh[$the_parser]['valuestack']); + $this->xh[$the_parser]['value'] = ( ! isset($cur_val['values'])) ? array() : $cur_val['values']; + $this->xh[$the_parser]['vt'] = strtolower($name); + break; + case 'NAME': + $this->xh[$the_parser]['valuestack'][0]['name'] = $this->xh[$the_parser]['ac']; + break; + case 'BOOLEAN': + case 'I4': + case 'INT': + case 'STRING': + case 'DOUBLE': + case 'DATETIME.ISO8601': + case 'BASE64': + $this->xh[$the_parser]['vt'] = strtolower($name); + + if ($name == 'STRING') + { + $this->xh[$the_parser]['value'] = $this->xh[$the_parser]['ac']; + } + elseif ($name=='DATETIME.ISO8601') + { + $this->xh[$the_parser]['vt'] = $this->xmlrpcDateTime; + $this->xh[$the_parser]['value'] = $this->xh[$the_parser]['ac']; + } + elseif ($name=='BASE64') + { + $this->xh[$the_parser]['value'] = base64_decode($this->xh[$the_parser]['ac']); + } + elseif ($name=='BOOLEAN') + { + // Translated BOOLEAN values to TRUE AND FALSE + if ($this->xh[$the_parser]['ac'] == '1') + { + $this->xh[$the_parser]['value'] = TRUE; + } + else + { + $this->xh[$the_parser]['value'] = FALSE; + } + } + elseif ($name=='DOUBLE') + { + // we have a DOUBLE + // we must check that only 0123456789-.<space> are characters here + if ( ! preg_match('/^[+-]?[eE0-9\t \.]+$/', $this->xh[$the_parser]['ac'])) + { + $this->xh[$the_parser]['value'] = 'ERROR_NON_NUMERIC_FOUND'; + } + else + { + $this->xh[$the_parser]['value'] = (double)$this->xh[$the_parser]['ac']; + } + } + else + { + // we have an I4/INT + // we must check that only 0123456789-<space> are characters here + if ( ! preg_match('/^[+-]?[0-9\t ]+$/', $this->xh[$the_parser]['ac'])) + { + $this->xh[$the_parser]['value'] = 'ERROR_NON_NUMERIC_FOUND'; + } + else + { + $this->xh[$the_parser]['value'] = (int)$this->xh[$the_parser]['ac']; + } + } + $this->xh[$the_parser]['ac'] = ''; + $this->xh[$the_parser]['lv'] = 3; // indicate we've found a value + break; + case 'VALUE': + // This if() detects if no scalar was inside <VALUE></VALUE> + if ($this->xh[$the_parser]['vt']=='value') + { + $this->xh[$the_parser]['value'] = $this->xh[$the_parser]['ac']; + $this->xh[$the_parser]['vt'] = $this->xmlrpcString; + } + + // build the XML-RPC value out of the data received, and substitute it + $temp = new XML_RPC_Values($this->xh[$the_parser]['value'], $this->xh[$the_parser]['vt']); + + if (count($this->xh[$the_parser]['valuestack']) && $this->xh[$the_parser]['valuestack'][0]['type'] == 'ARRAY') + { + // Array + $this->xh[$the_parser]['valuestack'][0]['values'][] = $temp; + } + else + { + // Struct + $this->xh[$the_parser]['value'] = $temp; + } + break; + case 'MEMBER': + $this->xh[$the_parser]['ac']=''; + + // If value add to array in the stack for the last element built + if ($this->xh[$the_parser]['value']) + { + $this->xh[$the_parser]['valuestack'][0]['values'][$this->xh[$the_parser]['valuestack'][0]['name']] = $this->xh[$the_parser]['value']; + } + break; + case 'DATA': + $this->xh[$the_parser]['ac']=''; + break; + case 'PARAM': + if ($this->xh[$the_parser]['value']) + { + $this->xh[$the_parser]['params'][] = $this->xh[$the_parser]['value']; + } + break; + case 'METHODNAME': + $this->xh[$the_parser]['method'] = ltrim($this->xh[$the_parser]['ac']); + break; + case 'PARAMS': + case 'FAULT': + case 'METHODCALL': + case 'METHORESPONSE': + // We're all good kids with nuthin' to do + break; + default: + // End of an Invalid Element. Taken care of during the opening tag though + break; + } + } + + //------------------------------------- + // Parses Character Data + //------------------------------------- + + function character_data($the_parser, $data) + { + if ($this->xh[$the_parser]['isf'] > 1) return; // XML Fault found already + + // If a value has not been found + if ($this->xh[$the_parser]['lv'] != 3) + { + if ($this->xh[$the_parser]['lv'] == 1) + { + $this->xh[$the_parser]['lv'] = 2; // Found a value + } + + if ( ! @isset($this->xh[$the_parser]['ac'])) + { + $this->xh[$the_parser]['ac'] = ''; + } + + $this->xh[$the_parser]['ac'] .= $data; + } + } + + + function addParam($par) { $this->params[]=$par; } + + function output_parameters($array=FALSE) + { + $CI =& get_instance(); + + if ($array !== FALSE && is_array($array)) + { + while (list($key) = each($array)) + { + if (is_array($array[$key])) + { + $array[$key] = $this->output_parameters($array[$key]); + } + else + { + // 'bits' is for the MetaWeblog API image bits + // @todo - this needs to be made more general purpose + $array[$key] = ($key == 'bits' OR $this->xss_clean == FALSE) ? $array[$key] : $CI->security->xss_clean($array[$key]); + } + } + + $parameters = $array; + } + else + { + $parameters = array(); + + for ($i = 0; $i < count($this->params); $i++) + { + $a_param = $this->decode_message($this->params[$i]); + + if (is_array($a_param)) + { + $parameters[] = $this->output_parameters($a_param); + } + else + { + $parameters[] = ($this->xss_clean) ? $CI->security->xss_clean($a_param) : $a_param; + } + } + } + + return $parameters; + } + + + function decode_message($param) + { + $kind = $param->kindOf(); + + if ($kind == 'scalar') + { + return $param->scalarval(); + } + elseif ($kind == 'array') + { + reset($param->me); + list($a,$b) = each($param->me); + + $arr = array(); + + for($i = 0; $i < count($b); $i++) + { + $arr[] = $this->decode_message($param->me['array'][$i]); + } + + return $arr; + } + elseif ($kind == 'struct') + { + reset($param->me['struct']); + + $arr = array(); + + while (list($key,$value) = each($param->me['struct'])) + { + $arr[$key] = $this->decode_message($value); + } + + return $arr; + } + } + +} // End XML_RPC_Messages class + + + +/** + * XML-RPC Values class + * + * @category XML-RPC + * @author ExpressionEngine Dev Team + * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html + */ +class XML_RPC_Values extends CI_Xmlrpc +{ + var $me = array(); + var $mytype = 0; + + public function __construct($val=-1, $type='') + { + parent::__construct(); + + if ($val != -1 OR $type != '') + { + $type = $type == '' ? 'string' : $type; + + if ($this->xmlrpcTypes[$type] == 1) + { + $this->addScalar($val,$type); + } + elseif ($this->xmlrpcTypes[$type] == 2) + { + $this->addArray($val); + } + elseif ($this->xmlrpcTypes[$type] == 3) + { + $this->addStruct($val); + } + } + } + + function addScalar($val, $type='string') + { + $typeof = $this->xmlrpcTypes[$type]; + + if ($this->mytype==1) + { + echo '<strong>XML_RPC_Values</strong>: scalar can have only one value<br />'; + return 0; + } + + if ($typeof != 1) + { + echo '<strong>XML_RPC_Values</strong>: not a scalar type (${typeof})<br />'; + return 0; + } + + if ($type == $this->xmlrpcBoolean) + { + if (strcasecmp($val,'true')==0 OR $val==1 OR ($val==true && strcasecmp($val,'false'))) + { + $val = 1; + } + else + { + $val=0; + } + } + + if ($this->mytype == 2) + { + // adding to an array here + $ar = $this->me['array']; + $ar[] = new XML_RPC_Values($val, $type); + $this->me['array'] = $ar; + } + else + { + // a scalar, so set the value and remember we're scalar + $this->me[$type] = $val; + $this->mytype = $typeof; + } + return 1; + } + + function addArray($vals) + { + if ($this->mytype != 0) + { + echo '<strong>XML_RPC_Values</strong>: already initialized as a [' . $this->kindOf() . ']<br />'; + return 0; + } + + $this->mytype = $this->xmlrpcTypes['array']; + $this->me['array'] = $vals; + return 1; + } + + function addStruct($vals) + { + if ($this->mytype != 0) + { + echo '<strong>XML_RPC_Values</strong>: already initialized as a [' . $this->kindOf() . ']<br />'; + return 0; + } + $this->mytype = $this->xmlrpcTypes['struct']; + $this->me['struct'] = $vals; + return 1; + } + + function kindOf() + { + switch($this->mytype) + { + case 3: + return 'struct'; + break; + case 2: + return 'array'; + break; + case 1: + return 'scalar'; + break; + default: + return 'undef'; + } + } + + function serializedata($typ, $val) + { + $rs = ''; + + switch($this->xmlrpcTypes[$typ]) + { + case 3: + // struct + $rs .= "<struct>\n"; + reset($val); + while (list($key2, $val2) = each($val)) + { + $rs .= "<member>\n<name>{$key2}</name>\n"; + $rs .= $this->serializeval($val2); + $rs .= "</member>\n"; + } + $rs .= '</struct>'; + break; + case 2: + // array + $rs .= "<array>\n<data>\n"; + for($i=0; $i < count($val); $i++) + { + $rs .= $this->serializeval($val[$i]); + } + $rs.="</data>\n</array>\n"; + break; + case 1: + // others + switch ($typ) + { + case $this->xmlrpcBase64: + $rs .= "<{$typ}>" . base64_encode((string)$val) . "</{$typ}>\n"; + break; + case $this->xmlrpcBoolean: + $rs .= "<{$typ}>" . ((bool)$val ? '1' : '0') . "</{$typ}>\n"; + break; + case $this->xmlrpcString: + $rs .= "<{$typ}>" . htmlspecialchars((string)$val). "</{$typ}>\n"; + break; + default: + $rs .= "<{$typ}>{$val}</{$typ}>\n"; + break; + } + default: + break; + } + return $rs; + } + + function serialize_class() + { + return $this->serializeval($this); + } + + function serializeval($o) + { + $ar = $o->me; + reset($ar); + + list($typ, $val) = each($ar); + $rs = "<value>\n".$this->serializedata($typ, $val)."</value>\n"; + return $rs; + } + + function scalarval() + { + reset($this->me); + list($a,$b) = each($this->me); + return $b; + } + + + //------------------------------------- + // Encode time in ISO-8601 form. + //------------------------------------- + + // Useful for sending time in XML-RPC + + function iso8601_encode($time, $utc=0) + { + if ($utc == 1) + { + $t = strftime("%Y%m%dT%H:%i:%s", $time); + } + else + { + if (function_exists('gmstrftime')) + $t = gmstrftime("%Y%m%dT%H:%i:%s", $time); + else + $t = strftime("%Y%m%dT%H:%i:%s", $time - date('Z')); + } + return $t; + } + +} +// END XML_RPC_Values Class + +/* End of file Xmlrpc.php */ +/* Location: ./system/libraries/Xmlrpc.php */ \ No newline at end of file diff --git a/system/libraries/Xmlrpcs.php b/system/libraries/Xmlrpcs.php new file mode 100644 index 0000000..23a9045 --- /dev/null +++ b/system/libraries/Xmlrpcs.php @@ -0,0 +1,613 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +if ( ! function_exists('xml_parser_create')) +{ + show_error('Your PHP installation does not support XML'); +} + +if ( ! class_exists('CI_Xmlrpc')) +{ + show_error('You must load the Xmlrpc class before loading the Xmlrpcs class in order to create a server.'); +} + +// ------------------------------------------------------------------------ + +/** + * XML-RPC server class + * + * @package CodeIgniter + * @subpackage Libraries + * @category XML-RPC + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/xmlrpc.html + */ +class CI_Xmlrpcs extends CI_Xmlrpc +{ + var $methods = array(); //array of methods mapped to function names and signatures + var $debug_msg = ''; // Debug Message + var $system_methods = array(); // XML RPC Server methods + var $controller_obj; + + var $object = FALSE; + + /** + * Constructor + */ + public function __construct($config=array()) + { + parent::__construct(); + $this->set_system_methods(); + + if (isset($config['functions']) && is_array($config['functions'])) + { + $this->methods = array_merge($this->methods, $config['functions']); + } + + log_message('debug', "XML-RPC Server Class Initialized"); + } + + // -------------------------------------------------------------------- + + /** + * Initialize Prefs and Serve + * + * @access public + * @param mixed + * @return void + */ + function initialize($config=array()) + { + if (isset($config['functions']) && is_array($config['functions'])) + { + $this->methods = array_merge($this->methods, $config['functions']); + } + + if (isset($config['debug'])) + { + $this->debug = $config['debug']; + } + + if (isset($config['object']) && is_object($config['object'])) + { + $this->object = $config['object']; + } + + if (isset($config['xss_clean'])) + { + $this->xss_clean = $config['xss_clean']; + } + } + + // -------------------------------------------------------------------- + + /** + * Setting of System Methods + * + * @access public + * @return void + */ + function set_system_methods() + { + $this->methods = array( + 'system.listMethods' => array( + 'function' => 'this.listMethods', + 'signature' => array(array($this->xmlrpcArray, $this->xmlrpcString), array($this->xmlrpcArray)), + 'docstring' => 'Returns an array of available methods on this server'), + 'system.methodHelp' => array( + 'function' => 'this.methodHelp', + 'signature' => array(array($this->xmlrpcString, $this->xmlrpcString)), + 'docstring' => 'Returns a documentation string for the specified method'), + 'system.methodSignature' => array( + 'function' => 'this.methodSignature', + 'signature' => array(array($this->xmlrpcArray, $this->xmlrpcString)), + 'docstring' => 'Returns an array describing the return type and required parameters of a method'), + 'system.multicall' => array( + 'function' => 'this.multicall', + 'signature' => array(array($this->xmlrpcArray, $this->xmlrpcArray)), + 'docstring' => 'Combine multiple RPC calls in one request. See http://www.xmlrpc.com/discuss/msgReader$1208 for details') + ); + } + + // -------------------------------------------------------------------- + + /** + * Main Server Function + * + * @access public + * @return void + */ + function serve() + { + $r = $this->parseRequest(); + $payload = '<?xml version="1.0" encoding="'.$this->xmlrpc_defencoding.'"?'.'>'."\n"; + $payload .= $this->debug_msg; + $payload .= $r->prepare_response(); + + header("Content-Type: text/xml"); + header("Content-Length: ".strlen($payload)); + exit($payload); + } + + // -------------------------------------------------------------------- + + /** + * Add Method to Class + * + * @access public + * @param string method name + * @param string function + * @param string signature + * @param string docstring + * @return void + */ + function add_to_map($methodname, $function, $sig, $doc) + { + $this->methods[$methodname] = array( + 'function' => $function, + 'signature' => $sig, + 'docstring' => $doc + ); + } + + // -------------------------------------------------------------------- + + /** + * Parse Server Request + * + * @access public + * @param string data + * @return object xmlrpc response + */ + function parseRequest($data='') + { + global $HTTP_RAW_POST_DATA; + + //------------------------------------- + // Get Data + //------------------------------------- + + if ($data == '') + { + $data = $HTTP_RAW_POST_DATA; + } + + //------------------------------------- + // Set up XML Parser + //------------------------------------- + + $parser = xml_parser_create($this->xmlrpc_defencoding); + $parser_object = new XML_RPC_Message("filler"); + + $parser_object->xh[$parser] = array(); + $parser_object->xh[$parser]['isf'] = 0; + $parser_object->xh[$parser]['isf_reason'] = ''; + $parser_object->xh[$parser]['params'] = array(); + $parser_object->xh[$parser]['stack'] = array(); + $parser_object->xh[$parser]['valuestack'] = array(); + $parser_object->xh[$parser]['method'] = ''; + + xml_set_object($parser, $parser_object); + xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, true); + xml_set_element_handler($parser, 'open_tag', 'closing_tag'); + xml_set_character_data_handler($parser, 'character_data'); + //xml_set_default_handler($parser, 'default_handler'); + + + //------------------------------------- + // PARSE + PROCESS XML DATA + //------------------------------------- + + if ( ! xml_parse($parser, $data, 1)) + { + // return XML error as a faultCode + $r = new XML_RPC_Response(0, + $this->xmlrpcerrxml + xml_get_error_code($parser), + sprintf('XML error: %s at line %d', + xml_error_string(xml_get_error_code($parser)), + xml_get_current_line_number($parser))); + xml_parser_free($parser); + } + elseif ($parser_object->xh[$parser]['isf']) + { + return new XML_RPC_Response(0, $this->xmlrpcerr['invalid_return'], $this->xmlrpcstr['invalid_return']); + } + else + { + xml_parser_free($parser); + + $m = new XML_RPC_Message($parser_object->xh[$parser]['method']); + $plist=''; + + for ($i=0; $i < count($parser_object->xh[$parser]['params']); $i++) + { + if ($this->debug === TRUE) + { + $plist .= "$i - " . print_r(get_object_vars($parser_object->xh[$parser]['params'][$i]), TRUE). ";\n"; + } + + $m->addParam($parser_object->xh[$parser]['params'][$i]); + } + + if ($this->debug === TRUE) + { + echo "<pre>"; + echo "---PLIST---\n" . $plist . "\n---PLIST END---\n\n"; + echo "</pre>"; + } + + $r = $this->_execute($m); + } + + //------------------------------------- + // SET DEBUGGING MESSAGE + //------------------------------------- + + if ($this->debug === TRUE) + { + $this->debug_msg = "<!-- DEBUG INFO:\n\n".$plist."\n END DEBUG-->\n"; + } + + return $r; + } + + // -------------------------------------------------------------------- + + /** + * Executes the Method + * + * @access protected + * @param object + * @return mixed + */ + function _execute($m) + { + $methName = $m->method_name; + + // Check to see if it is a system call + $system_call = (strncmp($methName, 'system', 5) == 0) ? TRUE : FALSE; + + if ($this->xss_clean == FALSE) + { + $m->xss_clean = FALSE; + } + + //------------------------------------- + // Valid Method + //------------------------------------- + + if ( ! isset($this->methods[$methName]['function'])) + { + return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']); + } + + //------------------------------------- + // Check for Method (and Object) + //------------------------------------- + + $method_parts = explode(".", $this->methods[$methName]['function']); + $objectCall = (isset($method_parts['1']) && $method_parts['1'] != "") ? TRUE : FALSE; + + if ($system_call === TRUE) + { + if ( ! is_callable(array($this,$method_parts['1']))) + { + return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']); + } + } + else + { + if ($objectCall && ! is_callable(array($method_parts['0'],$method_parts['1']))) + { + return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']); + } + elseif ( ! $objectCall && ! is_callable($this->methods[$methName]['function'])) + { + return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']); + } + } + + //------------------------------------- + // Checking Methods Signature + //------------------------------------- + + if (isset($this->methods[$methName]['signature'])) + { + $sig = $this->methods[$methName]['signature']; + for ($i=0; $i<count($sig); $i++) + { + $current_sig = $sig[$i]; + + if (count($current_sig) == count($m->params)+1) + { + for ($n=0; $n < count($m->params); $n++) + { + $p = $m->params[$n]; + $pt = ($p->kindOf() == 'scalar') ? $p->scalarval() : $p->kindOf(); + + if ($pt != $current_sig[$n+1]) + { + $pno = $n+1; + $wanted = $current_sig[$n+1]; + + return new XML_RPC_Response(0, + $this->xmlrpcerr['incorrect_params'], + $this->xmlrpcstr['incorrect_params'] . + ": Wanted {$wanted}, got {$pt} at param {$pno})"); + } + } + } + } + } + + //------------------------------------- + // Calls the Function + //------------------------------------- + + if ($objectCall === TRUE) + { + if ($method_parts[0] == "this" && $system_call == TRUE) + { + return call_user_func(array($this, $method_parts[1]), $m); + } + else + { + if ($this->object === FALSE) + { + $CI =& get_instance(); + return $CI->$method_parts['1']($m); + } + else + { + return $this->object->$method_parts['1']($m); + //return call_user_func(array(&$method_parts['0'],$method_parts['1']), $m); + } + } + } + else + { + return call_user_func($this->methods[$methName]['function'], $m); + } + } + + // -------------------------------------------------------------------- + + /** + * Server Function: List Methods + * + * @access public + * @param mixed + * @return object + */ + function listMethods($m) + { + $v = new XML_RPC_Values(); + $output = array(); + + foreach ($this->methods as $key => $value) + { + $output[] = new XML_RPC_Values($key, 'string'); + } + + foreach ($this->system_methods as $key => $value) + { + $output[]= new XML_RPC_Values($key, 'string'); + } + + $v->addArray($output); + return new XML_RPC_Response($v); + } + + // -------------------------------------------------------------------- + + /** + * Server Function: Return Signature for Method + * + * @access public + * @param mixed + * @return object + */ + function methodSignature($m) + { + $parameters = $m->output_parameters(); + $method_name = $parameters[0]; + + if (isset($this->methods[$method_name])) + { + if ($this->methods[$method_name]['signature']) + { + $sigs = array(); + $signature = $this->methods[$method_name]['signature']; + + for ($i=0; $i < count($signature); $i++) + { + $cursig = array(); + $inSig = $signature[$i]; + for ($j=0; $j<count($inSig); $j++) + { + $cursig[]= new XML_RPC_Values($inSig[$j], 'string'); + } + $sigs[]= new XML_RPC_Values($cursig, 'array'); + } + $r = new XML_RPC_Response(new XML_RPC_Values($sigs, 'array')); + } + else + { + $r = new XML_RPC_Response(new XML_RPC_Values('undef', 'string')); + } + } + else + { + $r = new XML_RPC_Response(0,$this->xmlrpcerr['introspect_unknown'], $this->xmlrpcstr['introspect_unknown']); + } + return $r; + } + + // -------------------------------------------------------------------- + + /** + * Server Function: Doc String for Method + * + * @access public + * @param mixed + * @return object + */ + function methodHelp($m) + { + $parameters = $m->output_parameters(); + $method_name = $parameters[0]; + + if (isset($this->methods[$method_name])) + { + $docstring = isset($this->methods[$method_name]['docstring']) ? $this->methods[$method_name]['docstring'] : ''; + + return new XML_RPC_Response(new XML_RPC_Values($docstring, 'string')); + } + else + { + return new XML_RPC_Response(0, $this->xmlrpcerr['introspect_unknown'], $this->xmlrpcstr['introspect_unknown']); + } + } + + // -------------------------------------------------------------------- + + /** + * Server Function: Multi-call + * + * @access public + * @param mixed + * @return object + */ + function multicall($m) + { + // Disabled + return new XML_RPC_Response(0, $this->xmlrpcerr['unknown_method'], $this->xmlrpcstr['unknown_method']); + + $parameters = $m->output_parameters(); + $calls = $parameters[0]; + + $result = array(); + + foreach ($calls as $value) + { + //$attempt = $this->_execute(new XML_RPC_Message($value[0], $value[1])); + + $m = new XML_RPC_Message($value[0]); + $plist=''; + + for ($i=0; $i < count($value[1]); $i++) + { + $m->addParam(new XML_RPC_Values($value[1][$i], 'string')); + } + + $attempt = $this->_execute($m); + + if ($attempt->faultCode() != 0) + { + return $attempt; + } + + $result[] = new XML_RPC_Values(array($attempt->value()), 'array'); + } + + return new XML_RPC_Response(new XML_RPC_Values($result, 'array')); + } + + // -------------------------------------------------------------------- + + /** + * Multi-call Function: Error Handling + * + * @access public + * @param mixed + * @return object + */ + function multicall_error($err) + { + $str = is_string($err) ? $this->xmlrpcstr["multicall_${err}"] : $err->faultString(); + $code = is_string($err) ? $this->xmlrpcerr["multicall_${err}"] : $err->faultCode(); + + $struct['faultCode'] = new XML_RPC_Values($code, 'int'); + $struct['faultString'] = new XML_RPC_Values($str, 'string'); + + return new XML_RPC_Values($struct, 'struct'); + } + + // -------------------------------------------------------------------- + + /** + * Multi-call Function: Processes method + * + * @access public + * @param mixed + * @return object + */ + function do_multicall($call) + { + if ($call->kindOf() != 'struct') + { + return $this->multicall_error('notstruct'); + } + elseif ( ! $methName = $call->me['struct']['methodName']) + { + return $this->multicall_error('nomethod'); + } + + list($scalar_type,$scalar_value)=each($methName->me); + $scalar_type = $scalar_type == $this->xmlrpcI4 ? $this->xmlrpcInt : $scalar_type; + + if ($methName->kindOf() != 'scalar' OR $scalar_type != 'string') + { + return $this->multicall_error('notstring'); + } + elseif ($scalar_value == 'system.multicall') + { + return $this->multicall_error('recursion'); + } + elseif ( ! $params = $call->me['struct']['params']) + { + return $this->multicall_error('noparams'); + } + elseif ($params->kindOf() != 'array') + { + return $this->multicall_error('notarray'); + } + + list($a,$b)=each($params->me); + $numParams = count($b); + + $msg = new XML_RPC_Message($scalar_value); + for ($i = 0; $i < $numParams; $i++) + { + $msg->params[] = $params->me['array'][$i]; + } + + $result = $this->_execute($msg); + + if ($result->faultCode() != 0) + { + return $this->multicall_error($result); + } + + return new XML_RPC_Values(array($result->value()), 'array'); + } + +} +// END XML_RPC_Server class + + +/* End of file Xmlrpcs.php */ +/* Location: ./system/libraries/Xmlrpcs.php */ \ No newline at end of file diff --git a/system/libraries/Zip.php b/system/libraries/Zip.php new file mode 100644 index 0000000..a1bb2e8 --- /dev/null +++ b/system/libraries/Zip.php @@ -0,0 +1,424 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://codeigniter.com/user_guide/license.html + * @link http://codeigniter.com + * @since Version 1.0 + * @filesource + */ + +// ------------------------------------------------------------------------ + +/** + * Zip Compression Class + * + * This class is based on a library I found at Zend: + * http://www.zend.com/codex.php?id=696&single=1 + * + * The original library is a little rough around the edges so I + * refactored it and added several additional methods -- Rick Ellis + * + * @package CodeIgniter + * @subpackage Libraries + * @category Encryption + * @author EllisLab Dev Team + * @link http://codeigniter.com/user_guide/libraries/zip.html + */ +class CI_Zip { + + var $zipdata = ''; + var $directory = ''; + var $entries = 0; + var $file_num = 0; + var $offset = 0; + var $now; + + /** + * Constructor + */ + public function __construct() + { + log_message('debug', "Zip Compression Class Initialized"); + + $this->now = time(); + } + + // -------------------------------------------------------------------- + + /** + * Add Directory + * + * Lets you add a virtual directory into which you can place files. + * + * @access public + * @param mixed the directory name. Can be string or array + * @return void + */ + function add_dir($directory) + { + foreach ((array)$directory as $dir) + { + if ( ! preg_match("|.+/$|", $dir)) + { + $dir .= '/'; + } + + $dir_time = $this->_get_mod_time($dir); + + $this->_add_dir($dir, $dir_time['file_mtime'], $dir_time['file_mdate']); + } + } + + // -------------------------------------------------------------------- + + /** + * Get file/directory modification time + * + * If this is a newly created file/dir, we will set the time to 'now' + * + * @param string path to file + * @return array filemtime/filemdate + */ + function _get_mod_time($dir) + { + // filemtime() will return false, but it does raise an error. + $date = (@filemtime($dir)) ? filemtime($dir) : getdate($this->now); + + $time['file_mtime'] = ($date['hours'] << 11) + ($date['minutes'] << 5) + $date['seconds'] / 2; + $time['file_mdate'] = (($date['year'] - 1980) << 9) + ($date['mon'] << 5) + $date['mday']; + + return $time; + } + + // -------------------------------------------------------------------- + + /** + * Add Directory + * + * @access private + * @param string the directory name + * @return void + */ + function _add_dir($dir, $file_mtime, $file_mdate) + { + $dir = str_replace("\\", "/", $dir); + + $this->zipdata .= + "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00" + .pack('v', $file_mtime) + .pack('v', $file_mdate) + .pack('V', 0) // crc32 + .pack('V', 0) // compressed filesize + .pack('V', 0) // uncompressed filesize + .pack('v', strlen($dir)) // length of pathname + .pack('v', 0) // extra field length + .$dir + // below is "data descriptor" segment + .pack('V', 0) // crc32 + .pack('V', 0) // compressed filesize + .pack('V', 0); // uncompressed filesize + + $this->directory .= + "\x50\x4b\x01\x02\x00\x00\x0a\x00\x00\x00\x00\x00" + .pack('v', $file_mtime) + .pack('v', $file_mdate) + .pack('V',0) // crc32 + .pack('V',0) // compressed filesize + .pack('V',0) // uncompressed filesize + .pack('v', strlen($dir)) // length of pathname + .pack('v', 0) // extra field length + .pack('v', 0) // file comment length + .pack('v', 0) // disk number start + .pack('v', 0) // internal file attributes + .pack('V', 16) // external file attributes - 'directory' bit set + .pack('V', $this->offset) // relative offset of local header + .$dir; + + $this->offset = strlen($this->zipdata); + $this->entries++; + } + + // -------------------------------------------------------------------- + + /** + * Add Data to Zip + * + * Lets you add files to the archive. If the path is included + * in the filename it will be placed within a directory. Make + * sure you use add_dir() first to create the folder. + * + * @access public + * @param mixed + * @param string + * @return void + */ + function add_data($filepath, $data = NULL) + { + if (is_array($filepath)) + { + foreach ($filepath as $path => $data) + { + $file_data = $this->_get_mod_time($path); + + $this->_add_data($path, $data, $file_data['file_mtime'], $file_data['file_mdate']); + } + } + else + { + $file_data = $this->_get_mod_time($filepath); + + $this->_add_data($filepath, $data, $file_data['file_mtime'], $file_data['file_mdate']); + } + } + + // -------------------------------------------------------------------- + + /** + * Add Data to Zip + * + * @access private + * @param string the file name/path + * @param string the data to be encoded + * @return void + */ + function _add_data($filepath, $data, $file_mtime, $file_mdate) + { + $filepath = str_replace("\\", "/", $filepath); + + $uncompressed_size = strlen($data); + $crc32 = crc32($data); + + $gzdata = gzcompress($data); + $gzdata = substr($gzdata, 2, -4); + $compressed_size = strlen($gzdata); + + $this->zipdata .= + "\x50\x4b\x03\x04\x14\x00\x00\x00\x08\x00" + .pack('v', $file_mtime) + .pack('v', $file_mdate) + .pack('V', $crc32) + .pack('V', $compressed_size) + .pack('V', $uncompressed_size) + .pack('v', strlen($filepath)) // length of filename + .pack('v', 0) // extra field length + .$filepath + .$gzdata; // "file data" segment + + $this->directory .= + "\x50\x4b\x01\x02\x00\x00\x14\x00\x00\x00\x08\x00" + .pack('v', $file_mtime) + .pack('v', $file_mdate) + .pack('V', $crc32) + .pack('V', $compressed_size) + .pack('V', $uncompressed_size) + .pack('v', strlen($filepath)) // length of filename + .pack('v', 0) // extra field length + .pack('v', 0) // file comment length + .pack('v', 0) // disk number start + .pack('v', 0) // internal file attributes + .pack('V', 32) // external file attributes - 'archive' bit set + .pack('V', $this->offset) // relative offset of local header + .$filepath; + + $this->offset = strlen($this->zipdata); + $this->entries++; + $this->file_num++; + } + + // -------------------------------------------------------------------- + + /** + * Read the contents of a file and add it to the zip + * + * @access public + * @return bool + */ + function read_file($path, $preserve_filepath = FALSE) + { + if ( ! file_exists($path)) + { + return FALSE; + } + + if (FALSE !== ($data = file_get_contents($path))) + { + $name = str_replace("\\", "/", $path); + + if ($preserve_filepath === FALSE) + { + $name = preg_replace("|.*/(.+)|", "\\1", $name); + } + + $this->add_data($name, $data); + return TRUE; + } + return FALSE; + } + + // ------------------------------------------------------------------------ + + /** + * Read a directory and add it to the zip. + * + * This function recursively reads a folder and everything it contains (including + * sub-folders) and creates a zip based on it. Whatever directory structure + * is in the original file path will be recreated in the zip file. + * + * @access public + * @param string path to source + * @return bool + */ + function read_dir($path, $preserve_filepath = TRUE, $root_path = NULL) + { + if ( ! $fp = @opendir($path)) + { + return FALSE; + } + + // Set the original directory root for child dir's to use as relative + if ($root_path === NULL) + { + $root_path = dirname($path).'/'; + } + + while (FALSE !== ($file = readdir($fp))) + { + if (substr($file, 0, 1) == '.') + { + continue; + } + + if (@is_dir($path.$file)) + { + $this->read_dir($path.$file."/", $preserve_filepath, $root_path); + } + else + { + if (FALSE !== ($data = file_get_contents($path.$file))) + { + $name = str_replace("\\", "/", $path); + + if ($preserve_filepath === FALSE) + { + $name = str_replace($root_path, '', $name); + } + + $this->add_data($name.$file, $data); + } + } + } + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Get the Zip file + * + * @access public + * @return binary string + */ + function get_zip() + { + // Is there any data to return? + if ($this->entries == 0) + { + return FALSE; + } + + $zip_data = $this->zipdata; + $zip_data .= $this->directory."\x50\x4b\x05\x06\x00\x00\x00\x00"; + $zip_data .= pack('v', $this->entries); // total # of entries "on this disk" + $zip_data .= pack('v', $this->entries); // total # of entries overall + $zip_data .= pack('V', strlen($this->directory)); // size of central dir + $zip_data .= pack('V', strlen($this->zipdata)); // offset to start of central dir + $zip_data .= "\x00\x00"; // .zip file comment length + + return $zip_data; + } + + // -------------------------------------------------------------------- + + /** + * Write File to the specified directory + * + * Lets you write a file + * + * @access public + * @param string the file name + * @return bool + */ + function archive($filepath) + { + if ( ! ($fp = @fopen($filepath, FOPEN_WRITE_CREATE_DESTRUCTIVE))) + { + return FALSE; + } + + flock($fp, LOCK_EX); + fwrite($fp, $this->get_zip()); + flock($fp, LOCK_UN); + fclose($fp); + + return TRUE; + } + + // -------------------------------------------------------------------- + + /** + * Download + * + * @access public + * @param string the file name + * @param string the data to be encoded + * @return bool + */ + function download($filename = 'backup.zip') + { + if ( ! preg_match("|.+?\.zip$|", $filename)) + { + $filename .= '.zip'; + } + + $CI =& get_instance(); + $CI->load->helper('download'); + + $get_zip = $this->get_zip(); + + $zip_content =& $get_zip; + + force_download($filename, $zip_content); + } + + // -------------------------------------------------------------------- + + /** + * Initialize Data + * + * Lets you clear current zip data. Useful if you need to create + * multiple zips with different data. + * + * @access public + * @return void + */ + function clear_data() + { + $this->zipdata = ''; + $this->directory = ''; + $this->entries = 0; + $this->file_num = 0; + $this->offset = 0; + } + +} + +/* End of file Zip.php */ +/* Location: ./system/libraries/Zip.php */ \ No newline at end of file diff --git a/system/libraries/index.html b/system/libraries/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/system/libraries/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/system/libraries/javascript/Jquery.php b/system/libraries/javascript/Jquery.php new file mode 100644 index 0000000..af53603 --- /dev/null +++ b/system/libraries/javascript/Jquery.php @@ -0,0 +1,1072 @@ +<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); + +/** + * CodeIgniter + * + * An open source application development framework for PHP 5.1.6 or newer + * + * @package CodeIgniter + * @author EllisLab Dev Team + * @copyright Copyright (c) 2008 - 2011, EllisLab, Inc. + * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/) + * @license http://www.codeigniter.com/user_guide/license.html + * @link http://www.codeigniter.com + * @since Version 1.0 + * @filesource + */ + +/** + * Jquery Class + * + * @package CodeIgniter + * @subpackage Libraries + * @author EllisLab Dev Team + * @category Loader + * @link http://www.codeigniter.com/user_guide/libraries/javascript.html + */ + +class CI_Jquery extends CI_Javascript { + + var $_javascript_folder = 'js'; + var $jquery_code_for_load = array(); + var $jquery_code_for_compile = array(); + var $jquery_corner_active = FALSE; + var $jquery_table_sorter_active = FALSE; + var $jquery_table_sorter_pager_active = FALSE; + var $jquery_ajax_img = ''; + + public function __construct($params) + { + $this->CI =& get_instance(); + extract($params); + + if ($autoload === TRUE) + { + $this->script(); + } + + log_message('debug', "Jquery Class Initialized"); + } + + // -------------------------------------------------------------------- + // Event Code + // -------------------------------------------------------------------- + + /** + * Blur + * + * Outputs a jQuery blur event + * + * @access private + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function _blur($element = 'this', $js = '') + { + return $this->_add_event($element, $js, 'blur'); + } + + // -------------------------------------------------------------------- + + /** + * Change + * + * Outputs a jQuery change event + * + * @access private + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function _change($element = 'this', $js = '') + { + return $this->_add_event($element, $js, 'change'); + } + + // -------------------------------------------------------------------- + + /** + * Click + * + * Outputs a jQuery click event + * + * @access private + * @param string The element to attach the event to + * @param string The code to execute + * @param boolean whether or not to return false + * @return string + */ + function _click($element = 'this', $js = '', $ret_false = TRUE) + { + if ( ! is_array($js)) + { + $js = array($js); + } + + if ($ret_false) + { + $js[] = "return false;"; + } + + return $this->_add_event($element, $js, 'click'); + } + + // -------------------------------------------------------------------- + + /** + * Double Click + * + * Outputs a jQuery dblclick event + * + * @access private + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function _dblclick($element = 'this', $js = '') + { + return $this->_add_event($element, $js, 'dblclick'); + } + + // -------------------------------------------------------------------- + + /** + * Error + * + * Outputs a jQuery error event + * + * @access private + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function _error($element = 'this', $js = '') + { + return $this->_add_event($element, $js, 'error'); + } + + // -------------------------------------------------------------------- + + /** + * Focus + * + * Outputs a jQuery focus event + * + * @access private + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function _focus($element = 'this', $js = '') + { + return $this->_add_event($element, $js, 'focus'); + } + + // -------------------------------------------------------------------- + + /** + * Hover + * + * Outputs a jQuery hover event + * + * @access private + * @param string - element + * @param string - Javascript code for mouse over + * @param string - Javascript code for mouse out + * @return string + */ + function _hover($element = 'this', $over, $out) + { + $event = "\n\t$(" . $this->_prep_element($element) . ").hover(\n\t\tfunction()\n\t\t{\n\t\t\t{$over}\n\t\t}, \n\t\tfunction()\n\t\t{\n\t\t\t{$out}\n\t\t});\n"; + + $this->jquery_code_for_compile[] = $event; + + return $event; + } + + // -------------------------------------------------------------------- + + /** + * Keydown + * + * Outputs a jQuery keydown event + * + * @access private + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function _keydown($element = 'this', $js = '') + { + return $this->_add_event($element, $js, 'keydown'); + } + + // -------------------------------------------------------------------- + + /** + * Keyup + * + * Outputs a jQuery keydown event + * + * @access private + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function _keyup($element = 'this', $js = '') + { + return $this->_add_event($element, $js, 'keyup'); + } + + // -------------------------------------------------------------------- + + /** + * Load + * + * Outputs a jQuery load event + * + * @access private + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function _load($element = 'this', $js = '') + { + return $this->_add_event($element, $js, 'load'); + } + + // -------------------------------------------------------------------- + + /** + * Mousedown + * + * Outputs a jQuery mousedown event + * + * @access private + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function _mousedown($element = 'this', $js = '') + { + return $this->_add_event($element, $js, 'mousedown'); + } + + // -------------------------------------------------------------------- + + /** + * Mouse Out + * + * Outputs a jQuery mouseout event + * + * @access private + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function _mouseout($element = 'this', $js = '') + { + return $this->_add_event($element, $js, 'mouseout'); + } + + // -------------------------------------------------------------------- + + /** + * Mouse Over + * + * Outputs a jQuery mouseover event + * + * @access private + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function _mouseover($element = 'this', $js = '') + { + return $this->_add_event($element, $js, 'mouseover'); + } + + // -------------------------------------------------------------------- + + /** + * Mouseup + * + * Outputs a jQuery mouseup event + * + * @access private + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function _mouseup($element = 'this', $js = '') + { + return $this->_add_event($element, $js, 'mouseup'); + } + + // -------------------------------------------------------------------- + + /** + * Output + * + * Outputs script directly + * + * @access private + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function _output($array_js = '') + { + if ( ! is_array($array_js)) + { + $array_js = array($array_js); + } + + foreach ($array_js as $js) + { + $this->jquery_code_for_compile[] = "\t$js\n"; + } + } + + // -------------------------------------------------------------------- + + /** + * Resize + * + * Outputs a jQuery resize event + * + * @access private + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function _resize($element = 'this', $js = '') + { + return $this->_add_event($element, $js, 'resize'); + } + + // -------------------------------------------------------------------- + + /** + * Scroll + * + * Outputs a jQuery scroll event + * + * @access private + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function _scroll($element = 'this', $js = '') + { + return $this->_add_event($element, $js, 'scroll'); + } + + // -------------------------------------------------------------------- + + /** + * Unload + * + * Outputs a jQuery unload event + * + * @access private + * @param string The element to attach the event to + * @param string The code to execute + * @return string + */ + function _unload($element = 'this', $js = '') + { + return $this->_add_event($element, $js, 'unload'); + } + + // -------------------------------------------------------------------- + // Effects + // -------------------------------------------------------------------- + + /** + * Add Class + * + * Outputs a jQuery addClass event + * + * @access private + * @param string - element + * @return string + */ + function _addClass($element = 'this', $class='') + { + $element = $this->_prep_element($element); + $str = "$({$element}).addClass(\"$class\");"; + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Animate + * + * Outputs a jQuery animate event + * + * @access private + * @param string - element + * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds + * @param string - Javascript callback function + * @return string + */ + function _animate($element = 'this', $params = array(), $speed = '', $extra = '') + { + $element = $this->_prep_element($element); + $speed = $this->_validate_speed($speed); + + $animations = "\t\t\t"; + + foreach ($params as $param=>$value) + { + $animations .= $param.': \''.$value.'\', '; + } + + $animations = substr($animations, 0, -2); // remove the last ", " + + if ($speed != '') + { + $speed = ', '.$speed; + } + + if ($extra != '') + { + $extra = ', '.$extra; + } + + $str = "$({$element}).animate({\n$animations\n\t\t}".$speed.$extra.");"; + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Fade In + * + * Outputs a jQuery hide event + * + * @access private + * @param string - element + * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds + * @param string - Javascript callback function + * @return string + */ + function _fadeIn($element = 'this', $speed = '', $callback = '') + { + $element = $this->_prep_element($element); + $speed = $this->_validate_speed($speed); + + if ($callback != '') + { + $callback = ", function(){\n{$callback}\n}"; + } + + $str = "$({$element}).fadeIn({$speed}{$callback});"; + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Fade Out + * + * Outputs a jQuery hide event + * + * @access private + * @param string - element + * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds + * @param string - Javascript callback function + * @return string + */ + function _fadeOut($element = 'this', $speed = '', $callback = '') + { + $element = $this->_prep_element($element); + $speed = $this->_validate_speed($speed); + + if ($callback != '') + { + $callback = ", function(){\n{$callback}\n}"; + } + + $str = "$({$element}).fadeOut({$speed}{$callback});"; + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Hide + * + * Outputs a jQuery hide action + * + * @access private + * @param string - element + * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds + * @param string - Javascript callback function + * @return string + */ + function _hide($element = 'this', $speed = '', $callback = '') + { + $element = $this->_prep_element($element); + $speed = $this->_validate_speed($speed); + + if ($callback != '') + { + $callback = ", function(){\n{$callback}\n}"; + } + + $str = "$({$element}).hide({$speed}{$callback});"; + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Remove Class + * + * Outputs a jQuery remove class event + * + * @access private + * @param string - element + * @return string + */ + function _removeClass($element = 'this', $class='') + { + $element = $this->_prep_element($element); + $str = "$({$element}).removeClass(\"$class\");"; + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Slide Up + * + * Outputs a jQuery slideUp event + * + * @access private + * @param string - element + * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds + * @param string - Javascript callback function + * @return string + */ + function _slideUp($element = 'this', $speed = '', $callback = '') + { + $element = $this->_prep_element($element); + $speed = $this->_validate_speed($speed); + + if ($callback != '') + { + $callback = ", function(){\n{$callback}\n}"; + } + + $str = "$({$element}).slideUp({$speed}{$callback});"; + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Slide Down + * + * Outputs a jQuery slideDown event + * + * @access private + * @param string - element + * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds + * @param string - Javascript callback function + * @return string + */ + function _slideDown($element = 'this', $speed = '', $callback = '') + { + $element = $this->_prep_element($element); + $speed = $this->_validate_speed($speed); + + if ($callback != '') + { + $callback = ", function(){\n{$callback}\n}"; + } + + $str = "$({$element}).slideDown({$speed}{$callback});"; + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Slide Toggle + * + * Outputs a jQuery slideToggle event + * + * @access public + * @param string - element + * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds + * @param string - Javascript callback function + * @return string + */ + function _slideToggle($element = 'this', $speed = '', $callback = '') + { + $element = $this->_prep_element($element); + $speed = $this->_validate_speed($speed); + + if ($callback != '') + { + $callback = ", function(){\n{$callback}\n}"; + } + + $str = "$({$element}).slideToggle({$speed}{$callback});"; + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Toggle + * + * Outputs a jQuery toggle event + * + * @access private + * @param string - element + * @return string + */ + function _toggle($element = 'this') + { + $element = $this->_prep_element($element); + $str = "$({$element}).toggle();"; + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Toggle Class + * + * Outputs a jQuery toggle class event + * + * @access private + * @param string - element + * @return string + */ + function _toggleClass($element = 'this', $class='') + { + $element = $this->_prep_element($element); + $str = "$({$element}).toggleClass(\"$class\");"; + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Show + * + * Outputs a jQuery show event + * + * @access private + * @param string - element + * @param string - One of 'slow', 'normal', 'fast', or time in milliseconds + * @param string - Javascript callback function + * @return string + */ + function _show($element = 'this', $speed = '', $callback = '') + { + $element = $this->_prep_element($element); + $speed = $this->_validate_speed($speed); + + if ($callback != '') + { + $callback = ", function(){\n{$callback}\n}"; + } + + $str = "$({$element}).show({$speed}{$callback});"; + + return $str; + } + + // -------------------------------------------------------------------- + + /** + * Updater + * + * An Ajax call that populates the designated DOM node with + * returned content + * + * @access private + * @param string The element to attach the event to + * @param string the controller to run the call against + * @param string optional parameters + * @return string + */ + + function _updater($container = 'this', $controller, $options = '') + { + $container = $this->_prep_element($container); + + $controller = (strpos('://', $controller) === FALSE) ? $controller : $this->CI->config->site_url($controller); + + // ajaxStart and ajaxStop are better choices here... but this is a stop gap + if ($this->CI->config->item('javascript_ajax_img') == '') + { + $loading_notifier = "Loading..."; + } + else + { + $loading_notifier = '<img src=\'' . $this->CI->config->slash_item('base_url') . $this->CI->config->item('javascript_ajax_img') . '\' alt=\'Loading\' />'; + } + + $updater = "$($container).empty();\n"; // anything that was in... get it out + $updater .= "\t\t$($container).prepend(\"$loading_notifier\");\n"; // to replace with an image + + $request_options = ''; + if ($options != '') + { + $request_options .= ", {"; + $request_options .= (is_array($options)) ? "'".implode("', '", $options)."'" : "'".str_replace(":", "':'", $options)."'"; + $request_options .= "}"; + } + + $updater .= "\t\t$($container).load('$controller'$request_options);"; + return $updater; + } + + + // -------------------------------------------------------------------- + // Pre-written handy stuff + // -------------------------------------------------------------------- + + /** + * Zebra tables + * + * @access private + * @param string table name + * @param string plugin location + * @return string + */ + function _zebraTables($class = '', $odd = 'odd', $hover = '') + { + $class = ($class != '') ? '.'.$class : ''; + + $zebra = "\t\$(\"table{$class} tbody tr:nth-child(even)\").addClass(\"{$odd}\");"; + + $this->jquery_code_for_compile[] = $zebra; + + if ($hover != '') + { + $hover = $this->hover("table{$class} tbody tr", "$(this).addClass('hover');", "$(this).removeClass('hover');"); + } + + return $zebra; + } + + + + // -------------------------------------------------------------------- + // Plugins + // -------------------------------------------------------------------- + + /** + * Corner Plugin + * + * http://www.malsup.com/jquery/corner/ + * + * @access public + * @param string target + * @return string + */ + function corner($element = '', $corner_style = '') + { + // may want to make this configurable down the road + $corner_location = '/plugins/jquery.corner.js'; + + if ($corner_style != '') + { + $corner_style = '"'.$corner_style.'"'; + } + + return "$(" . $this->_prep_element($element) . ").corner(".$corner_style.");"; + } + + // -------------------------------------------------------------------- + + /** + * modal window + * + * Load a thickbox modal window + * + * @access public + * @return void + */ + function modal($src, $relative = FALSE) + { + $this->jquery_code_for_load[] = $this->external($src, $relative); + } + + // -------------------------------------------------------------------- + + /** + * Effect + * + * Load an Effect library + * + * @access public + * @return void + */ + function effect($src, $relative = FALSE) + { + $this->jquery_code_for_load[] = $this->external($src, $relative); + } + + // -------------------------------------------------------------------- + + /** + * Plugin + * + * Load a plugin library + * + * @access public + * @return void + */ + function plugin($src, $relative = FALSE) + { + $this->jquery_code_for_load[] = $this->external($src, $relative); + } + + // -------------------------------------------------------------------- + + /** + * UI + * + * Load a user interface library + * + * @access public + * @return void + */ + function ui($src, $relative = FALSE) + { + $this->jquery_code_for_load[] = $this->external($src, $relative); + } + // -------------------------------------------------------------------- + + /** + * Sortable + * + * Creates a jQuery sortable + * + * @access public + * @return void + */ + function sortable($element, $options = array()) + { + + if (count($options) > 0) + { + $sort_options = array(); + foreach ($options as $k=>$v) + { + $sort_options[] = "\n\t\t".$k.': '.$v.""; + } + $sort_options = implode(",", $sort_options); + } + else + { + $sort_options = ''; + } + + return "$(" . $this->_prep_element($element) . ").sortable({".$sort_options."\n\t});"; + } + + // -------------------------------------------------------------------- + + /** + * Table Sorter Plugin + * + * @access public + * @param string table name + * @param string plugin location + * @return string + */ + function tablesorter($table = '', $options = '') + { + $this->jquery_code_for_compile[] = "\t$(" . $this->_prep_element($table) . ").tablesorter($options);\n"; + } + + // -------------------------------------------------------------------- + // Class functions + // -------------------------------------------------------------------- + + /** + * Add Event + * + * Constructs the syntax for an event, and adds to into the array for compilation + * + * @access private + * @param string The element to attach the event to + * @param string The code to execute + * @param string The event to pass + * @return string + */ + function _add_event($element, $js, $event) + { + if (is_array($js)) + { + $js = implode("\n\t\t", $js); + + } + + $event = "\n\t$(" . $this->_prep_element($element) . ").{$event}(function(){\n\t\t{$js}\n\t});\n"; + $this->jquery_code_for_compile[] = $event; + return $event; + } + + // -------------------------------------------------------------------- + + /** + * Compile + * + * As events are specified, they are stored in an array + * This funciton compiles them all for output on a page + * + * @access private + * @return string + */ + function _compile($view_var = 'script_foot', $script_tags = TRUE) + { + // External references + $external_scripts = implode('', $this->jquery_code_for_load); + $this->CI->load->vars(array('library_src' => $external_scripts)); + + if (count($this->jquery_code_for_compile) == 0 ) + { + // no inline references, let's just return + return; + } + + // Inline references + $script = '$(document).ready(function() {' . "\n"; + $script .= implode('', $this->jquery_code_for_compile); + $script .= '});'; + + $output = ($script_tags === FALSE) ? $script : $this->inline($script); + + $this->CI->load->vars(array($view_var => $output)); + + } + + // -------------------------------------------------------------------- + + /** + * Clear Compile + * + * Clears the array of script events collected for output + * + * @access public + * @return void + */ + function _clear_compile() + { + $this->jquery_code_for_compile = array(); + } + + // -------------------------------------------------------------------- + + /** + * Document Ready + * + * A wrapper for writing document.ready() + * + * @access private + * @return string + */ + function _document_ready($js) + { + if ( ! is_array($js)) + { + $js = array ($js); + + } + + foreach ($js as $script) + { + $this->jquery_code_for_compile[] = $script; + } + } + + // -------------------------------------------------------------------- + + /** + * Script Tag + * + * Outputs the script tag that loads the jquery.js file into an HTML document + * + * @access public + * @param string + * @return string + */ + function script($library_src = '', $relative = FALSE) + { + $library_src = $this->external($library_src, $relative); + $this->jquery_code_for_load[] = $library_src; + return $library_src; + } + + // -------------------------------------------------------------------- + + /** + * Prep Element + * + * Puts HTML element in quotes for use in jQuery code + * unless the supplied element is the Javascript 'this' + * object, in which case no quotes are added + * + * @access public + * @param string + * @return string + */ + function _prep_element($element) + { + if ($element != 'this') + { + $element = '"'.$element.'"'; + } + + return $element; + } + + // -------------------------------------------------------------------- + + /** + * Validate Speed + * + * Ensures the speed parameter is valid for jQuery + * + * @access private + * @param string + * @return string + */ + function _validate_speed($speed) + { + if (in_array($speed, array('slow', 'normal', 'fast'))) + { + $speed = '"'.$speed.'"'; + } + elseif (preg_match("/[^0-9]/", $speed)) + { + $speed = ''; + } + + return $speed; + } + +} + +/* End of file Jquery.php */ +/* Location: ./system/libraries/Jquery.php */ \ No newline at end of file diff --git a/system/libraries/javascript/index.html b/system/libraries/javascript/index.html new file mode 100644 index 0000000..c942a79 --- /dev/null +++ b/system/libraries/javascript/index.html @@ -0,0 +1,10 @@ +<html> +<head> + <title>403 Forbidden</title> +</head> +<body> + +<p>Directory access is forbidden.</p> + +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/Gruntfile.js b/theme/bootstrap/Gruntfile.js new file mode 100644 index 0000000..eade011 --- /dev/null +++ b/theme/bootstrap/Gruntfile.js @@ -0,0 +1,165 @@ +/*! + * Bootstrap's Gruntfile + * http://getbootstrap.com + * Copyright 2013-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + + +module.exports = function (grunt) { + + 'use strict'; + + grunt.initConfig({ + watch: { + // If any .less file changes in directory "build/less/" run the "less"-task. + files: ["build/less/*.less", "build/less/skins/*.less", "dist/js/app.js"], + tasks: ["less", "uglify"] + }, + // "less"-task configuration + // This task will compile all less files upon saving to create both AdminLTE.css and AdminLTE.min.css + less: { + // Development not compressed + development: { + options: { + // Whether to compress or not + compress: false + }, + files: { + // compilation.css : source.less + "dist/css/AdminLTE.css": "build/less/AdminLTE.less", + //Non minified skin files + "dist/css/skins/skin-blue.css": "build/less/skins/skin-blue.less", + "dist/css/skins/skin-black.css": "build/less/skins/skin-black.less", + "dist/css/skins/skin-yellow.css": "build/less/skins/skin-yellow.less", + "dist/css/skins/skin-green.css": "build/less/skins/skin-green.less", + "dist/css/skins/skin-red.css": "build/less/skins/skin-red.less", + "dist/css/skins/skin-purple.css": "build/less/skins/skin-purple.less", + "dist/css/skins/skin-blue-light.css": "build/less/skins/skin-blue-light.less", + "dist/css/skins/skin-black-light.css": "build/less/skins/skin-black-light.less", + "dist/css/skins/skin-yellow-light.css": "build/less/skins/skin-yellow-light.less", + "dist/css/skins/skin-green-light.css": "build/less/skins/skin-green-light.less", + "dist/css/skins/skin-red-light.css": "build/less/skins/skin-red-light.less", + "dist/css/skins/skin-purple-light.css": "build/less/skins/skin-purple-light.less", + "dist/css/skins/_all-skins.css": "build/less/skins/_all-skins.less" + } + }, + // Production compresses version + production: { + options: { + // Whether to compress or not + compress: true + }, + files: { + // compilation.css : source.less + "dist/css/AdminLTE.min.css": "build/less/AdminLTE.less", + // Skins minified + "dist/css/skins/skin-blue.min.css": "build/less/skins/skin-blue.less", + "dist/css/skins/skin-black.min.css": "build/less/skins/skin-black.less", + "dist/css/skins/skin-yellow.min.css": "build/less/skins/skin-yellow.less", + "dist/css/skins/skin-green.min.css": "build/less/skins/skin-green.less", + "dist/css/skins/skin-red.min.css": "build/less/skins/skin-red.less", + "dist/css/skins/skin-purple.min.css": "build/less/skins/skin-purple.less", + "dist/css/skins/skin-blue-light.min.css": "build/less/skins/skin-blue-light.less", + "dist/css/skins/skin-black-light.min.css": "build/less/skins/skin-black-light.less", + "dist/css/skins/skin-yellow-light.min.css": "build/less/skins/skin-yellow-light.less", + "dist/css/skins/skin-green-light.min.css": "build/less/skins/skin-green-light.less", + "dist/css/skins/skin-red-light.min.css": "build/less/skins/skin-red-light.less", + "dist/css/skins/skin-purple-light.min.css": "build/less/skins/skin-purple-light.less", + "dist/css/skins/_all-skins.min.css": "build/less/skins/_all-skins.less" + } + } + }, + // Uglify task info. Compress the js files. + uglify: { + options: { + mangle: true, + preserveComments: 'some' + }, + my_target: { + files: { + 'dist/js/app.min.js': ['dist/js/app.js'] + } + } + }, + // Build the documentation files + includes: { + build: { + src: ['*.html'], // Source files + dest: 'documentation/', // Destination directory + flatten: true, + cwd: 'documentation/build', + options: { + silent: true, + includePath: 'documentation/build/include' + } + } + }, + + // Optimize images + image: { + dynamic: { + files: [{ + expand: true, + cwd: 'build/img/', + src: ['**/*.{png,jpg,gif,svg,jpeg}'], + dest: 'dist/img/' + }] + } + }, + + // Validate JS code + jshint: { + options: { + jshintrc: '.jshintrc' + }, + core: { + src: 'dist/js/app.js' + }, + demo: { + src: 'dist/js/demo.js' + }, + pages: { + src: 'dist/js/pages/*.js' + } + }, + + csslint: { + options: { + csslintrc: 'build/less/.csslintrc' + }, + dist: [ + 'dist/css/AdminLTE.css', + ] + }, + + // Delete images in build directory + // After compressing the images in the build/img dir, there is no need + // for them + clean: { + build: ["build/img/*"] + } + }); + + // Load all grunt tasks + + // LESS Compiler + grunt.loadNpmTasks('grunt-contrib-less'); + // Watch File Changes + grunt.loadNpmTasks('grunt-contrib-watch'); + // Compress JS Files + grunt.loadNpmTasks('grunt-contrib-uglify'); + // Include Files Within HTML + grunt.loadNpmTasks('grunt-includes'); + // Optimize images + grunt.loadNpmTasks('grunt-image'); + // Validate JS code + grunt.loadNpmTasks('grunt-contrib-jshint'); + // Delete not needed files + grunt.loadNpmTasks('grunt-contrib-clean'); + // Lint CSS + grunt.loadNpmTasks('grunt-contrib-csslint'); + + // The default task (running "grunt" in console) is "watch" + grunt.registerTask('default', ['watch']); +}; diff --git a/theme/bootstrap/LICENSE b/theme/bootstrap/LICENSE new file mode 100644 index 0000000..e1854e8 --- /dev/null +++ b/theme/bootstrap/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2014-2015 almasaeed2010 + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/theme/bootstrap/README.md b/theme/bootstrap/README.md new file mode 100644 index 0000000..79707ae --- /dev/null +++ b/theme/bootstrap/README.md @@ -0,0 +1,222 @@ +Introduction +============ + +**AdminLTE** -- is a fully responsive admin template. Based on **[Bootstrap 3](https://github.com/twbs/bootstrap)** framework. Highly customizable and easy to use. Fits many screen resolutions from small mobile devices to large desktops. Check out the live preview now and see for yourself. + +**Download & Preview on [Almsaeed Studio](https://almsaeedstudio.com)** + +Looking for Premium Templates? +------------------------------ +**Almsaeed studio just opened a new premium templates page. Hand picked to insure the best quality and the most affordable prices. Visit https://almsaeedstudio.com/premium for more information.** + + +!["AdminLTE Presentation"] (https://almsaeedstudio.com/AdminLTE2.png "AdminLTE Presentation") + +**AdminLTE** has been carefully coded with clear comments in all of its JS, LESS and HTML files. LESS has been used to increase code customizability. + +Installation +------------ +There are multiple ways to install AdminLTE. + +####Download: + +Download from Github or [visit Almsaeed Studio](https://almsaeedstudio.com) and download the latest release. + +####Using The Command Line: + +**Github** + +- Fork the repository ([here is the guide](https://help.github.com/articles/fork-a-repo/)). +- Clone to your machine +``` +git clone https://github.com/YOUR_USERNAME/AdminLTE.git +``` + +**Bower** + +``` +bower install admin-lte +``` + +**Composer** + +``` +composer require "almasaeed2010/adminlte=~2.0" +``` + +Documentation +------------- +Visit the [online documentation](https://almsaeedstudio.com/themes/AdminLTE/documentation/index.html) for the most +updated guide. Information will be added on a weekly basis. + +Browser Support +--------------- +- IE 9+ +- Firefox (latest) +- Chrome (latest) +- Safari (latest) +- Opera (latest) + +Contribution +------------ +Contribution are always **welcome and recommended**! Here is how: + +- Fork the repository ([here is the guide](https://help.github.com/articles/fork-a-repo/)). +- Clone to your machine ```git clone https://github.com/YOUR_USERNAME/AdminLTE.git``` +- Make your changes +- Create a pull request + +#### Contribution Requirements: + +- When you contribute, you agree to give a non-exclusive license to Almsaeed Studio to use that contribution in any context as we (Almsaeed Studio) see appropriate. +- If you use content provided by another party, it must be appropriately licensed using an [open source](http://opensource.org/licenses) license. +- Contributions are only accepted through Github pull requests. +- Finally, contributed code must work in all supported browsers (see above for browser support). + +License +------- +AdminLTE is an open source project by [Almsaeed Studio](https://almsaeedstudio.com) that is licensed under [MIT](http://opensource.org/licenses/MIT). Almsaeed Studio +reserves the right to change the license of future releases. + +Todo List +--------- +- ~~Light sidebar colors~~ (Done v2.1.0) +- ~~Right sidebar~~ (Done v2.1.0) +- ~~Minified main-sidebar~~ (Done v2.1.0) +- Right to left support +- Custom pace style + +Legacy Realeases +---------------- +AdminLTE 1.x can be easily upgraded to 2.x using [this guide](https://almsaeedstudio.com/themes/AdminLTE/documentation/index.html#upgrade), but if you intend to keep using AdminLTE 1.x, you can download the latest release from the [releases](https://github.com/almasaeed2010/AdminLTE/releases) section above. + +Change log +---------- +**v2.3.0:** +- Added social widgets (found in the widgets page) +- Added profile page +- Fix issue #430 (requires ```.hold-transition``` to be added to ```<body>```) +- Fix issue #578 +- Fix issue #579 + +**v2.2.1:** +- Bug Fixes +- Removed many ```!important``` statements in css +- Activate boxWidget automatically when created after the page has loaded +- Activate sidebar menu treeview links automatically when created after the page has loaded +- Updated Font Awesome thanks to @Dennis14e +- Added JSHint to Grunt tasks (Find JS errors) +- Added CSSLint to Grunt tasks (Find CSS errors) +- Added Image to Grunt tasks (compress images) +- Added Clean to Grunt tasks (remove unwanted files like uncompressed images) +- Updated Bootstrap to 3.3.5 + +**v2.2.0:** +- Bug fixes +- Added support for [Select2](https://select2.github.io/) +- Updated ChartJS + +**v2.1.2:** +- Added explicit BoxWidget activation function issue #450 +- Crushed some bugs + +**v2.1.1:** +- Fix version error + +**v2.1.0:** +- Update Ion Icons +- Added right sidebar ```.control-sidebar``` +- Control sidebar has 2 open effects: slide over content and push content +- Control sidebar converts to always slide over content on small screens +- Added 6 new light sidebar skins +- Updated demo menu +- Added ChartJS preview page +- Fixed some minor bugs +- Added light control sidebar skin +- Added expand on hover option for sidebar mini +- Added fixed control sidebar layout + +**v2.0.5:** +- Fixed issue #288 + +**v2.0.4:** +- Fixed bower.json to pick up newest release. + +**v2.0.3** +- Bug fixes +- Fixed extra page when printing issue #264 +- Updated documentation and fixed links scrolling issue +- Created print.less file (this makes it easier if you want to create a seperate CSS file for printing) +- Fixed sidebar stretching issue #275 +- Fixed checkbox out of bounds issue in WYSIHTML5 editor. + +**v2.0.2:** +- Solved issue with hidden arrow in select inputs. + +**v2.0.1:** +- Updated README.md +- Fixed versioning issue in CSS, LESS, and JS +- Updated box-shadow for boxes +- Updated docs + +**v2.0.0:** + +- Major layout bug fixes +- Change in layout mark up +- Added transitions to the sidebar +- New skins and modified previous skins +- Change in color scheme to a more complementing scheme +- Added footer support +- Removed pace.js from the main app.js +- Added support for collapsed sidebar as an initial state (add .sidebar-collapse to the body tag) +- Added boxed layout (.layout-boxed) +- Enhanced consistency in padding and margining +- Updated Bootstrap to 3.3.2 +- Fixed navbar dropdown menu on small screens positioning issues. +- Updated Ion Icons to 2.0.0 +- Updated FontAwesome to 4.3.0 +- Added ChartJS 1.0.1 +- Removed iCheck dependency +- Created Dashboard 2.0 +- Created new Chat widget (DirectChat) +- Added transitions to DirectChat +- Added contacts pane to DirectChat +- Changed .right-side to .content-wrapper +- Changed .navbar-right to .navbar-custom-menu +- Removed unused files +- Updated lockscreen style (HTML markup changed!) +- Updated Login & Registration pages (HTML markup changed!) +- Updated buttons style. +- Enhanced border-radius consistency +- Added mailbox: inbox, read, and compose pages +- Bootstrap & jQuery are now hosted locally +- Created documentation. + +**ver 1.2.0:** + +- Fixed the sidebar scroll issue when using the fixed layout. +- Added [Bootstrap Social Buttons](http://lipis.github.io/bootstrap-social/ "Bootstrap Social") plugin. +- Fixed RequireJS bug. Thanks to [StaticSphere](https://github.com/StaticSphere "github user"). + +**ver 1.1.0:** + +- Added new skin. class: .skin-black +- Added [pace](http://github.hubspot.com/pace/docs/welcome/ "pace") plugin. + +Image Credits +------------- +[Pixeden](http://www.pixeden.com/psd-web-elements/flat-responsive-showcase-psd) + +[Graphicsfuel](http://www.graphicsfuel.com/2013/02/13-high-resolution-blur-backgrounds/) + +[Pickaface](http://pickaface.net/) + +[Unsplash](https://unsplash.com/) + +[Uifaces](http://uifaces.com/) + +Donations +--------- +Donations are **greatly appreciated!** + +[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif "AdminLTE Presentation")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=629XCUSXBHCBC "Donate") diff --git a/theme/bootstrap/bootstrap/css/bootstrap.css b/theme/bootstrap/bootstrap/css/bootstrap.css new file mode 100644 index 0000000..680e768 --- /dev/null +++ b/theme/bootstrap/bootstrap/css/bootstrap.css @@ -0,0 +1,6800 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +mark { + color: #000; + background: #ff0; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -.5em; +} +sub { + bottom: -.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\2a"; +} +.glyphicon-plus:before { + content: "\2b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover, +a.text-primary:focus { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover, +a.text-success:focus { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover, +a.text-info:focus { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover, +a.text-danger:focus { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: .01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 14.333333px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:focus, +.btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:focus, +.btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:focus, +.btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:focus, +.btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:focus, +.btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eee; +} +.nav > li.disabled > a { + color: #777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 3; + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 2; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item, +button.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +button.list-group-item { + width: 100%; + text-align: left; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +.modal-header { + min-height: 16.42857143px; + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + filter: alpha(opacity=0); + opacity: 0; + + line-break: auto; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + + line-break: auto; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + filter: alpha(opacity=50); + opacity: .5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -10px; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -15px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/theme/bootstrap/bootstrap/css/bootstrap.css.map b/theme/bootstrap/bootstrap/css/bootstrap.css.map new file mode 100644 index 0000000..9f60ed2 --- /dev/null +++ b/theme/bootstrap/bootstrap/css/bootstrap.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,4EAA4E;ACG5E;EACE,wBAAA;EACA,2BAAA;EACA,+BAAA;CDDD;ACQD;EACE,UAAA;CDND;ACmBD;;;;;;;;;;;;;EAaE,eAAA;CDjBD;ACyBD;;;;EAIE,sBAAA;EACA,yBAAA;CDvBD;AC+BD;EACE,cAAA;EACA,UAAA;CD7BD;ACqCD;;EAEE,cAAA;CDnCD;AC6CD;EACE,8BAAA;CD3CD;ACmDD;;EAEE,WAAA;CDjDD;AC2DD;EACE,0BAAA;CDzDD;ACgED;;EAEE,kBAAA;CD9DD;ACqED;EACE,mBAAA;CDnED;AC2ED;EACE,eAAA;EACA,iBAAA;CDzED;ACgFD;EACE,iBAAA;EACA,YAAA;CD9ED;ACqFD;EACE,eAAA;CDnFD;AC0FD;;EAEE,eAAA;EACA,eAAA;EACA,mBAAA;EACA,yBAAA;CDxFD;AC2FD;EACE,YAAA;CDzFD;AC4FD;EACE,gBAAA;CD1FD;ACoGD;EACE,UAAA;CDlGD;ACyGD;EACE,iBAAA;CDvGD;ACiHD;EACE,iBAAA;CD/GD;ACsHD;EACE,gCAAA;KAAA,6BAAA;UAAA,wBAAA;EACA,UAAA;CDpHD;AC2HD;EACE,eAAA;CDzHD;ACgID;;;;EAIE,kCAAA;EACA,eAAA;CD9HD;ACgJD;;;;;EAKE,eAAA;EACA,cAAA;EACA,UAAA;CD9ID;ACqJD;EACE,kBAAA;CDnJD;AC6JD;;EAEE,qBAAA;CD3JD;ACsKD;;;;EAIE,2BAAA;EACA,gBAAA;CDpKD;AC2KD;;EAEE,gBAAA;CDzKD;ACgLD;;EAEE,UAAA;EACA,WAAA;CD9KD;ACsLD;EACE,oBAAA;CDpLD;AC+LD;;EAEE,+BAAA;KAAA,4BAAA;UAAA,uBAAA;EACA,WAAA;CD7LD;ACsMD;;EAEE,aAAA;CDpMD;AC4MD;EACE,8BAAA;EACA,gCAAA;KAAA,6BAAA;UAAA,wBAAA;CD1MD;ACmND;;EAEE,yBAAA;CDjND;ACwND;EACE,0BAAA;EACA,cAAA;EACA,+BAAA;CDtND;AC8ND;EACE,UAAA;EACA,WAAA;CD5ND;ACmOD;EACE,eAAA;CDjOD;ACyOD;EACE,kBAAA;CDvOD;ACiPD;EACE,0BAAA;EACA,kBAAA;CD/OD;ACkPD;;EAEE,WAAA;CDhPD;AACD,qFAAqF;AElFrF;EA7FI;;;IAGI,mCAAA;IACA,uBAAA;IACA,oCAAA;YAAA,4BAAA;IACA,6BAAA;GFkLL;EE/KC;;IAEI,2BAAA;GFiLL;EE9KC;IACI,6BAAA;GFgLL;EE7KC;IACI,8BAAA;GF+KL;EE1KC;;IAEI,YAAA;GF4KL;EEzKC;;IAEI,uBAAA;IACA,yBAAA;GF2KL;EExKC;IACI,4BAAA;GF0KL;EEvKC;;IAEI,yBAAA;GFyKL;EEtKC;IACI,2BAAA;GFwKL;EErKC;;;IAGI,WAAA;IACA,UAAA;GFuKL;EEpKC;;IAEI,wBAAA;GFsKL;EEhKC;IACI,cAAA;GFkKL;EEhKC;;IAGQ,kCAAA;GFiKT;EE9JC;IACI,uBAAA;GFgKL;EE7JC;IACI,qCAAA;GF+JL;EEhKC;;IAKQ,kCAAA;GF+JT;EE5JC;;IAGQ,kCAAA;GF6JT;CACF;AGnPD;EACE,oCAAA;EACA,sDAAA;EACA,gYAAA;CHqPD;AG7OD;EACE,mBAAA;EACA,SAAA;EACA,sBAAA;EACA,oCAAA;EACA,mBAAA;EACA,oBAAA;EACA,eAAA;EACA,oCAAA;EACA,mCAAA;CH+OD;AG3OmC;EAAW,eAAA;CH8O9C;AG7OmC;EAAW,eAAA;CHgP9C;AG9OmC;;EAAW,iBAAA;CHkP9C;AGjPmC;EAAW,iBAAA;CHoP9C;AGnPmC;EAAW,iBAAA;CHsP9C;AGrPmC;EAAW,iBAAA;CHwP9C;AGvPmC;EAAW,iBAAA;CH0P9C;AGzPmC;EAAW,iBAAA;CH4P9C;AG3PmC;EAAW,iBAAA;CH8P9C;AG7PmC;EAAW,iBAAA;CHgQ9C;AG/PmC;EAAW,iBAAA;CHkQ9C;AGjQmC;EAAW,iBAAA;CHoQ9C;AGnQmC;EAAW,iBAAA;CHsQ9C;AGrQmC;EAAW,iBAAA;CHwQ9C;AGvQmC;EAAW,iBAAA;CH0Q9C;AGzQmC;EAAW,iBAAA;CH4Q9C;AG3QmC;EAAW,iBAAA;CH8Q9C;AG7QmC;EAAW,iBAAA;CHgR9C;AG/QmC;EAAW,iBAAA;CHkR9C;AGjRmC;EAAW,iBAAA;CHoR9C;AGnRmC;EAAW,iBAAA;CHsR9C;AGrRmC;EAAW,iBAAA;CHwR9C;AGvRmC;EAAW,iBAAA;CH0R9C;AGzRmC;EAAW,iBAAA;CH4R9C;AG3RmC;EAAW,iBAAA;CH8R9C;AG7RmC;EAAW,iBAAA;CHgS9C;AG/RmC;EAAW,iBAAA;CHkS9C;AGjSmC;EAAW,iBAAA;CHoS9C;AGnSmC;EAAW,iBAAA;CHsS9C;AGrSmC;EAAW,iBAAA;CHwS9C;AGvSmC;EAAW,iBAAA;CH0S9C;AGzSmC;EAAW,iBAAA;CH4S9C;AG3SmC;EAAW,iBAAA;CH8S9C;AG7SmC;EAAW,iBAAA;CHgT9C;AG/SmC;EAAW,iBAAA;CHkT9C;AGjTmC;EAAW,iBAAA;CHoT9C;AGnTmC;EAAW,iBAAA;CHsT9C;AGrTmC;EAAW,iBAAA;CHwT9C;AGvTmC;EAAW,iBAAA;CH0T9C;AGzTmC;EAAW,iBAAA;CH4T9C;AG3TmC;EAAW,iBAAA;CH8T9C;AG7TmC;EAAW,iBAAA;CHgU9C;AG/TmC;EAAW,iBAAA;CHkU9C;AGjUmC;EAAW,iBAAA;CHoU9C;AGnUmC;EAAW,iBAAA;CHsU9C;AGrUmC;EAAW,iBAAA;CHwU9C;AGvUmC;EAAW,iBAAA;CH0U9C;AGzUmC;EAAW,iBAAA;CH4U9C;AG3UmC;EAAW,iBAAA;CH8U9C;AG7UmC;EAAW,iBAAA;CHgV9C;AG/UmC;EAAW,iBAAA;CHkV9C;AGjVmC;EAAW,iBAAA;CHoV9C;AGnVmC;EAAW,iBAAA;CHsV9C;AGrVmC;EAAW,iBAAA;CHwV9C;AGvVmC;EAAW,iBAAA;CH0V9C;AGzVmC;EAAW,iBAAA;CH4V9C;AG3VmC;EAAW,iBAAA;CH8V9C;AG7VmC;EAAW,iBAAA;CHgW9C;AG/VmC;EAAW,iBAAA;CHkW9C;AGjWmC;EAAW,iBAAA;CHoW9C;AGnWmC;EAAW,iBAAA;CHsW9C;AGrWmC;EAAW,iBAAA;CHwW9C;AGvWmC;EAAW,iBAAA;CH0W9C;AGzWmC;EAAW,iBAAA;CH4W9C;AG3WmC;EAAW,iBAAA;CH8W9C;AG7WmC;EAAW,iBAAA;CHgX9C;AG/WmC;EAAW,iBAAA;CHkX9C;AGjXmC;EAAW,iBAAA;CHoX9C;AGnXmC;EAAW,iBAAA;CHsX9C;AGrXmC;EAAW,iBAAA;CHwX9C;AGvXmC;EAAW,iBAAA;CH0X9C;AGzXmC;EAAW,iBAAA;CH4X9C;AG3XmC;EAAW,iBAAA;CH8X9C;AG7XmC;EAAW,iBAAA;CHgY9C;AG/XmC;EAAW,iBAAA;CHkY9C;AGjYmC;EAAW,iBAAA;CHoY9C;AGnYmC;EAAW,iBAAA;CHsY9C;AGrYmC;EAAW,iBAAA;CHwY9C;AGvYmC;EAAW,iBAAA;CH0Y9C;AGzYmC;EAAW,iBAAA;CH4Y9C;AG3YmC;EAAW,iBAAA;CH8Y9C;AG7YmC;EAAW,iBAAA;CHgZ9C;AG/YmC;EAAW,iBAAA;CHkZ9C;AGjZmC;EAAW,iBAAA;CHoZ9C;AGnZmC;EAAW,iBAAA;CHsZ9C;AGrZmC;EAAW,iBAAA;CHwZ9C;AGvZmC;EAAW,iBAAA;CH0Z9C;AGzZmC;EAAW,iBAAA;CH4Z9C;AG3ZmC;EAAW,iBAAA;CH8Z9C;AG7ZmC;EAAW,iBAAA;CHga9C;AG/ZmC;EAAW,iBAAA;CHka9C;AGjamC;EAAW,iBAAA;CHoa9C;AGnamC;EAAW,iBAAA;CHsa9C;AGramC;EAAW,iBAAA;CHwa9C;AGvamC;EAAW,iBAAA;CH0a9C;AGzamC;EAAW,iBAAA;CH4a9C;AG3amC;EAAW,iBAAA;CH8a9C;AG7amC;EAAW,iBAAA;CHgb9C;AG/amC;EAAW,iBAAA;CHkb9C;AGjbmC;EAAW,iBAAA;CHob9C;AGnbmC;EAAW,iBAAA;CHsb9C;AGrbmC;EAAW,iBAAA;CHwb9C;AGvbmC;EAAW,iBAAA;CH0b9C;AGzbmC;EAAW,iBAAA;CH4b9C;AG3bmC;EAAW,iBAAA;CH8b9C;AG7bmC;EAAW,iBAAA;CHgc9C;AG/bmC;EAAW,iBAAA;CHkc9C;AGjcmC;EAAW,iBAAA;CHoc9C;AGncmC;EAAW,iBAAA;CHsc9C;AGrcmC;EAAW,iBAAA;CHwc9C;AGvcmC;EAAW,iBAAA;CH0c9C;AGzcmC;EAAW,iBAAA;CH4c9C;AG3cmC;EAAW,iBAAA;CH8c9C;AG7cmC;EAAW,iBAAA;CHgd9C;AG/cmC;EAAW,iBAAA;CHkd9C;AGjdmC;EAAW,iBAAA;CHod9C;AGndmC;EAAW,iBAAA;CHsd9C;AGrdmC;EAAW,iBAAA;CHwd9C;AGvdmC;EAAW,iBAAA;CH0d9C;AGzdmC;EAAW,iBAAA;CH4d9C;AG3dmC;EAAW,iBAAA;CH8d9C;AG7dmC;EAAW,iBAAA;CHge9C;AG/dmC;EAAW,iBAAA;CHke9C;AGjemC;EAAW,iBAAA;CHoe9C;AGnemC;EAAW,iBAAA;CHse9C;AGremC;EAAW,iBAAA;CHwe9C;AGvemC;EAAW,iBAAA;CH0e9C;AGzemC;EAAW,iBAAA;CH4e9C;AG3emC;EAAW,iBAAA;CH8e9C;AG7emC;EAAW,iBAAA;CHgf9C;AG/emC;EAAW,iBAAA;CHkf9C;AGjfmC;EAAW,iBAAA;CHof9C;AGnfmC;EAAW,iBAAA;CHsf9C;AGrfmC;EAAW,iBAAA;CHwf9C;AGvfmC;EAAW,iBAAA;CH0f9C;AGzfmC;EAAW,iBAAA;CH4f9C;AG3fmC;EAAW,iBAAA;CH8f9C;AG7fmC;EAAW,iBAAA;CHggB9C;AG/fmC;EAAW,iBAAA;CHkgB9C;AGjgBmC;EAAW,iBAAA;CHogB9C;AGngBmC;EAAW,iBAAA;CHsgB9C;AGrgBmC;EAAW,iBAAA;CHwgB9C;AGvgBmC;EAAW,iBAAA;CH0gB9C;AGzgBmC;EAAW,iBAAA;CH4gB9C;AG3gBmC;EAAW,iBAAA;CH8gB9C;AG7gBmC;EAAW,iBAAA;CHghB9C;AG/gBmC;EAAW,iBAAA;CHkhB9C;AGjhBmC;EAAW,iBAAA;CHohB9C;AGnhBmC;EAAW,iBAAA;CHshB9C;AGrhBmC;EAAW,iBAAA;CHwhB9C;AGvhBmC;EAAW,iBAAA;CH0hB9C;AGzhBmC;EAAW,iBAAA;CH4hB9C;AG3hBmC;EAAW,iBAAA;CH8hB9C;AG7hBmC;EAAW,iBAAA;CHgiB9C;AG/hBmC;EAAW,iBAAA;CHkiB9C;AGjiBmC;EAAW,iBAAA;CHoiB9C;AGniBmC;EAAW,iBAAA;CHsiB9C;AGriBmC;EAAW,iBAAA;CHwiB9C;AGviBmC;EAAW,iBAAA;CH0iB9C;AGziBmC;EAAW,iBAAA;CH4iB9C;AG3iBmC;EAAW,iBAAA;CH8iB9C;AG7iBmC;EAAW,iBAAA;CHgjB9C;AG/iBmC;EAAW,iBAAA;CHkjB9C;AGjjBmC;EAAW,iBAAA;CHojB9C;AGnjBmC;EAAW,iBAAA;CHsjB9C;AGrjBmC;EAAW,iBAAA;CHwjB9C;AGvjBmC;EAAW,iBAAA;CH0jB9C;AGzjBmC;EAAW,iBAAA;CH4jB9C;AG3jBmC;EAAW,iBAAA;CH8jB9C;AG7jBmC;EAAW,iBAAA;CHgkB9C;AG/jBmC;EAAW,iBAAA;CHkkB9C;AGjkBmC;EAAW,iBAAA;CHokB9C;AGnkBmC;EAAW,iBAAA;CHskB9C;AGrkBmC;EAAW,iBAAA;CHwkB9C;AGvkBmC;EAAW,iBAAA;CH0kB9C;AGzkBmC;EAAW,iBAAA;CH4kB9C;AG3kBmC;EAAW,iBAAA;CH8kB9C;AG7kBmC;EAAW,iBAAA;CHglB9C;AG/kBmC;EAAW,iBAAA;CHklB9C;AGjlBmC;EAAW,iBAAA;CHolB9C;AGnlBmC;EAAW,iBAAA;CHslB9C;AGrlBmC;EAAW,iBAAA;CHwlB9C;AGvlBmC;EAAW,iBAAA;CH0lB9C;AGzlBmC;EAAW,iBAAA;CH4lB9C;AG3lBmC;EAAW,iBAAA;CH8lB9C;AG7lBmC;EAAW,iBAAA;CHgmB9C;AG/lBmC;EAAW,iBAAA;CHkmB9C;AGjmBmC;EAAW,iBAAA;CHomB9C;AGnmBmC;EAAW,iBAAA;CHsmB9C;AGrmBmC;EAAW,iBAAA;CHwmB9C;AGvmBmC;EAAW,iBAAA;CH0mB9C;AGzmBmC;EAAW,iBAAA;CH4mB9C;AG3mBmC;EAAW,iBAAA;CH8mB9C;AG7mBmC;EAAW,iBAAA;CHgnB9C;AG/mBmC;EAAW,iBAAA;CHknB9C;AGjnBmC;EAAW,iBAAA;CHonB9C;AGnnBmC;EAAW,iBAAA;CHsnB9C;AGrnBmC;EAAW,iBAAA;CHwnB9C;AGvnBmC;EAAW,iBAAA;CH0nB9C;AGznBmC;EAAW,iBAAA;CH4nB9C;AG3nBmC;EAAW,iBAAA;CH8nB9C;AG7nBmC;EAAW,iBAAA;CHgoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AGvoBmC;EAAW,iBAAA;CH0oB9C;AGzoBmC;EAAW,iBAAA;CH4oB9C;AG3oBmC;EAAW,iBAAA;CH8oB9C;AG7oBmC;EAAW,iBAAA;CHgpB9C;AG/oBmC;EAAW,iBAAA;CHkpB9C;AGjpBmC;EAAW,iBAAA;CHopB9C;AGnpBmC;EAAW,iBAAA;CHspB9C;AGrpBmC;EAAW,iBAAA;CHwpB9C;AGvpBmC;EAAW,iBAAA;CH0pB9C;AGzpBmC;EAAW,iBAAA;CH4pB9C;AG3pBmC;EAAW,iBAAA;CH8pB9C;AG7pBmC;EAAW,iBAAA;CHgqB9C;AG/pBmC;EAAW,iBAAA;CHkqB9C;AGjqBmC;EAAW,iBAAA;CHoqB9C;AGnqBmC;EAAW,iBAAA;CHsqB9C;AGrqBmC;EAAW,iBAAA;CHwqB9C;AGvqBmC;EAAW,iBAAA;CH0qB9C;AGzqBmC;EAAW,iBAAA;CH4qB9C;AG3qBmC;EAAW,iBAAA;CH8qB9C;AG7qBmC;EAAW,iBAAA;CHgrB9C;AG/qBmC;EAAW,iBAAA;CHkrB9C;AGjrBmC;EAAW,iBAAA;CHorB9C;AGnrBmC;EAAW,iBAAA;CHsrB9C;AGrrBmC;EAAW,iBAAA;CHwrB9C;AGvrBmC;EAAW,iBAAA;CH0rB9C;AGzrBmC;EAAW,iBAAA;CH4rB9C;AG3rBmC;EAAW,iBAAA;CH8rB9C;AG7rBmC;EAAW,iBAAA;CHgsB9C;AG/rBmC;EAAW,iBAAA;CHksB9C;AGjsBmC;EAAW,iBAAA;CHosB9C;AGnsBmC;EAAW,iBAAA;CHssB9C;AGrsBmC;EAAW,iBAAA;CHwsB9C;AGvsBmC;EAAW,iBAAA;CH0sB9C;AGzsBmC;EAAW,iBAAA;CH4sB9C;AG3sBmC;EAAW,iBAAA;CH8sB9C;AG7sBmC;EAAW,iBAAA;CHgtB9C;AG/sBmC;EAAW,iBAAA;CHktB9C;AGjtBmC;EAAW,iBAAA;CHotB9C;AGntBmC;EAAW,iBAAA;CHstB9C;AGrtBmC;EAAW,iBAAA;CHwtB9C;AGvtBmC;EAAW,iBAAA;CH0tB9C;AGztBmC;EAAW,iBAAA;CH4tB9C;AG3tBmC;EAAW,iBAAA;CH8tB9C;AG7tBmC;EAAW,iBAAA;CHguB9C;AG/tBmC;EAAW,iBAAA;CHkuB9C;AGjuBmC;EAAW,iBAAA;CHouB9C;AGnuBmC;EAAW,iBAAA;CHsuB9C;AGruBmC;EAAW,iBAAA;CHwuB9C;AGvuBmC;EAAW,iBAAA;CH0uB9C;AGzuBmC;EAAW,iBAAA;CH4uB9C;AG3uBmC;EAAW,iBAAA;CH8uB9C;AG7uBmC;EAAW,iBAAA;CHgvB9C;AIthCD;ECgEE,+BAAA;EACG,4BAAA;EACK,uBAAA;CLy9BT;AIxhCD;;EC6DE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL+9BT;AIthCD;EACE,gBAAA;EACA,8CAAA;CJwhCD;AIrhCD;EACE,4DAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,0BAAA;CJuhCD;AInhCD;;;;EAIE,qBAAA;EACA,mBAAA;EACA,qBAAA;CJqhCD;AI/gCD;EACE,eAAA;EACA,sBAAA;CJihCD;AI/gCC;;EAEE,eAAA;EACA,2BAAA;CJihCH;AI9gCC;EErDA,qBAAA;EAEA,2CAAA;EACA,qBAAA;CNqkCD;AIxgCD;EACE,UAAA;CJ0gCD;AIpgCD;EACE,uBAAA;CJsgCD;AIlgCD;;;;;EGvEE,eAAA;EACA,gBAAA;EACA,aAAA;CPglCD;AItgCD;EACE,mBAAA;CJwgCD;AIlgCD;EACE,aAAA;EACA,wBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;EC6FA,yCAAA;EACK,oCAAA;EACG,iCAAA;EEvLR,sBAAA;EACA,gBAAA;EACA,aAAA;CPgmCD;AIlgCD;EACE,mBAAA;CJogCD;AI9/BD;EACE,iBAAA;EACA,oBAAA;EACA,UAAA;EACA,8BAAA;CJggCD;AIx/BD;EACE,mBAAA;EACA,WAAA;EACA,YAAA;EACA,aAAA;EACA,WAAA;EACA,iBAAA;EACA,uBAAA;EACA,UAAA;CJ0/BD;AIl/BC;;EAEE,iBAAA;EACA,YAAA;EACA,aAAA;EACA,UAAA;EACA,kBAAA;EACA,WAAA;CJo/BH;AIz+BD;EACE,gBAAA;CJ2+BD;AQloCD;;;;;;;;;;;;EAEE,qBAAA;EACA,iBAAA;EACA,iBAAA;EACA,eAAA;CR8oCD;AQnpCD;;;;;;;;;;;;;;;;;;;;;;;;EASI,oBAAA;EACA,eAAA;EACA,eAAA;CRoqCH;AQhqCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRqqCD;AQzqCD;;;;;;;;;;;;EAQI,eAAA;CR+qCH;AQ5qCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRirCD;AQrrCD;;;;;;;;;;;;EAQI,eAAA;CR2rCH;AQvrCD;;EAAU,gBAAA;CR2rCT;AQ1rCD;;EAAU,gBAAA;CR8rCT;AQ7rCD;;EAAU,gBAAA;CRisCT;AQhsCD;;EAAU,gBAAA;CRosCT;AQnsCD;;EAAU,gBAAA;CRusCT;AQtsCD;;EAAU,gBAAA;CR0sCT;AQpsCD;EACE,iBAAA;CRssCD;AQnsCD;EACE,oBAAA;EACA,gBAAA;EACA,iBAAA;EACA,iBAAA;CRqsCD;AQhsCD;EAAA;IAFI,gBAAA;GRssCD;CACF;AQ9rCD;;EAEE,eAAA;CRgsCD;AQ7rCD;;EAEE,0BAAA;EACA,cAAA;CR+rCD;AQ3rCD;EAAuB,iBAAA;CR8rCtB;AQ7rCD;EAAuB,kBAAA;CRgsCtB;AQ/rCD;EAAuB,mBAAA;CRksCtB;AQjsCD;EAAuB,oBAAA;CRosCtB;AQnsCD;EAAuB,oBAAA;CRssCtB;AQnsCD;EAAuB,0BAAA;CRssCtB;AQrsCD;EAAuB,0BAAA;CRwsCtB;AQvsCD;EAAuB,2BAAA;CR0sCtB;AQvsCD;EACE,eAAA;CRysCD;AQvsCD;ECrGE,eAAA;CT+yCD;AS9yCC;;EAEE,eAAA;CTgzCH;AQ3sCD;ECxGE,eAAA;CTszCD;ASrzCC;;EAEE,eAAA;CTuzCH;AQ/sCD;EC3GE,eAAA;CT6zCD;AS5zCC;;EAEE,eAAA;CT8zCH;AQntCD;EC9GE,eAAA;CTo0CD;ASn0CC;;EAEE,eAAA;CTq0CH;AQvtCD;ECjHE,eAAA;CT20CD;AS10CC;;EAEE,eAAA;CT40CH;AQvtCD;EAGE,YAAA;EE3HA,0BAAA;CVm1CD;AUl1CC;;EAEE,0BAAA;CVo1CH;AQztCD;EE9HE,0BAAA;CV01CD;AUz1CC;;EAEE,0BAAA;CV21CH;AQ7tCD;EEjIE,0BAAA;CVi2CD;AUh2CC;;EAEE,0BAAA;CVk2CH;AQjuCD;EEpIE,0BAAA;CVw2CD;AUv2CC;;EAEE,0BAAA;CVy2CH;AQruCD;EEvIE,0BAAA;CV+2CD;AU92CC;;EAEE,0BAAA;CVg3CH;AQpuCD;EACE,oBAAA;EACA,oBAAA;EACA,iCAAA;CRsuCD;AQ9tCD;;EAEE,cAAA;EACA,oBAAA;CRguCD;AQnuCD;;;;EAMI,iBAAA;CRmuCH;AQ5tCD;EACE,gBAAA;EACA,iBAAA;CR8tCD;AQ1tCD;EALE,gBAAA;EACA,iBAAA;EAMA,kBAAA;CR6tCD;AQ/tCD;EAKI,sBAAA;EACA,kBAAA;EACA,mBAAA;CR6tCH;AQxtCD;EACE,cAAA;EACA,oBAAA;CR0tCD;AQxtCD;;EAEE,wBAAA;CR0tCD;AQxtCD;EACE,kBAAA;CR0tCD;AQxtCD;EACE,eAAA;CR0tCD;AQjsCD;EAAA;IAVM,YAAA;IACA,aAAA;IACA,YAAA;IACA,kBAAA;IGtNJ,iBAAA;IACA,wBAAA;IACA,oBAAA;GXs6CC;EQ3sCH;IAHM,mBAAA;GRitCH;CACF;AQxsCD;;EAGE,aAAA;EACA,kCAAA;CRysCD;AQvsCD;EACE,eAAA;EA9IqB,0BAAA;CRw1CtB;AQrsCD;EACE,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,+BAAA;CRusCD;AQlsCG;;;EACE,iBAAA;CRssCL;AQhtCD;;;EAmBI,eAAA;EACA,eAAA;EACA,wBAAA;EACA,eAAA;CRksCH;AQhsCG;;;EACE,uBAAA;CRosCL;AQ5rCD;;EAEE,oBAAA;EACA,gBAAA;EACA,gCAAA;EACA,eAAA;EACA,kBAAA;CR8rCD;AQxrCG;;;;;;EAAW,YAAA;CRgsCd;AQ/rCG;;;;;;EACE,uBAAA;CRssCL;AQhsCD;EACE,oBAAA;EACA,mBAAA;EACA,wBAAA;CRksCD;AYx+CD;;;;EAIE,+DAAA;CZ0+CD;AYt+CD;EACE,iBAAA;EACA,eAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;CZw+CD;AYp+CD;EACE,iBAAA;EACA,eAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;EACA,uDAAA;UAAA,+CAAA;CZs+CD;AY5+CD;EASI,WAAA;EACA,gBAAA;EACA,kBAAA;EACA,yBAAA;UAAA,iBAAA;CZs+CH;AYj+CD;EACE,eAAA;EACA,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,sBAAA;EACA,sBAAA;EACA,eAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;CZm+CD;AY9+CD;EAeI,WAAA;EACA,mBAAA;EACA,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,iBAAA;CZk+CH;AY79CD;EACE,kBAAA;EACA,mBAAA;CZ+9CD;AazhDD;ECHE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;Cd+hDD;AazhDC;EAAA;IAFE,aAAA;Gb+hDD;CACF;Aa3hDC;EAAA;IAFE,aAAA;GbiiDD;CACF;Aa7hDD;EAAA;IAFI,cAAA;GbmiDD;CACF;Aa1hDD;ECvBE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;CdojDD;AavhDD;ECvBE,mBAAA;EACA,oBAAA;CdijDD;AejjDG;EACE,mBAAA;EAEA,gBAAA;EAEA,mBAAA;EACA,oBAAA;CfijDL;AejiDG;EACE,YAAA;CfmiDL;Ae5hDC;EACE,YAAA;Cf8hDH;Ae/hDC;EACE,oBAAA;CfiiDH;AeliDC;EACE,oBAAA;CfoiDH;AeriDC;EACE,WAAA;CfuiDH;AexiDC;EACE,oBAAA;Cf0iDH;Ae3iDC;EACE,oBAAA;Cf6iDH;Ae9iDC;EACE,WAAA;CfgjDH;AejjDC;EACE,oBAAA;CfmjDH;AepjDC;EACE,oBAAA;CfsjDH;AevjDC;EACE,WAAA;CfyjDH;Ae1jDC;EACE,oBAAA;Cf4jDH;Ae7jDC;EACE,mBAAA;Cf+jDH;AejjDC;EACE,YAAA;CfmjDH;AepjDC;EACE,oBAAA;CfsjDH;AevjDC;EACE,oBAAA;CfyjDH;Ae1jDC;EACE,WAAA;Cf4jDH;Ae7jDC;EACE,oBAAA;Cf+jDH;AehkDC;EACE,oBAAA;CfkkDH;AenkDC;EACE,WAAA;CfqkDH;AetkDC;EACE,oBAAA;CfwkDH;AezkDC;EACE,oBAAA;Cf2kDH;Ae5kDC;EACE,WAAA;Cf8kDH;Ae/kDC;EACE,oBAAA;CfilDH;AellDC;EACE,mBAAA;CfolDH;AehlDC;EACE,YAAA;CfklDH;AelmDC;EACE,WAAA;CfomDH;AermDC;EACE,mBAAA;CfumDH;AexmDC;EACE,mBAAA;Cf0mDH;Ae3mDC;EACE,UAAA;Cf6mDH;Ae9mDC;EACE,mBAAA;CfgnDH;AejnDC;EACE,mBAAA;CfmnDH;AepnDC;EACE,UAAA;CfsnDH;AevnDC;EACE,mBAAA;CfynDH;Ae1nDC;EACE,mBAAA;Cf4nDH;Ae7nDC;EACE,UAAA;Cf+nDH;AehoDC;EACE,mBAAA;CfkoDH;AenoDC;EACE,kBAAA;CfqoDH;AejoDC;EACE,WAAA;CfmoDH;AernDC;EACE,kBAAA;CfunDH;AexnDC;EACE,0BAAA;Cf0nDH;Ae3nDC;EACE,0BAAA;Cf6nDH;Ae9nDC;EACE,iBAAA;CfgoDH;AejoDC;EACE,0BAAA;CfmoDH;AepoDC;EACE,0BAAA;CfsoDH;AevoDC;EACE,iBAAA;CfyoDH;Ae1oDC;EACE,0BAAA;Cf4oDH;Ae7oDC;EACE,0BAAA;Cf+oDH;AehpDC;EACE,iBAAA;CfkpDH;AenpDC;EACE,0BAAA;CfqpDH;AetpDC;EACE,yBAAA;CfwpDH;AezpDC;EACE,gBAAA;Cf2pDH;Aa3pDD;EElCI;IACE,YAAA;GfgsDH;EezrDD;IACE,YAAA;Gf2rDD;Ee5rDD;IACE,oBAAA;Gf8rDD;Ee/rDD;IACE,oBAAA;GfisDD;EelsDD;IACE,WAAA;GfosDD;EersDD;IACE,oBAAA;GfusDD;EexsDD;IACE,oBAAA;Gf0sDD;Ee3sDD;IACE,WAAA;Gf6sDD;Ee9sDD;IACE,oBAAA;GfgtDD;EejtDD;IACE,oBAAA;GfmtDD;EeptDD;IACE,WAAA;GfstDD;EevtDD;IACE,oBAAA;GfytDD;Ee1tDD;IACE,mBAAA;Gf4tDD;Ee9sDD;IACE,YAAA;GfgtDD;EejtDD;IACE,oBAAA;GfmtDD;EeptDD;IACE,oBAAA;GfstDD;EevtDD;IACE,WAAA;GfytDD;Ee1tDD;IACE,oBAAA;Gf4tDD;Ee7tDD;IACE,oBAAA;Gf+tDD;EehuDD;IACE,WAAA;GfkuDD;EenuDD;IACE,oBAAA;GfquDD;EetuDD;IACE,oBAAA;GfwuDD;EezuDD;IACE,WAAA;Gf2uDD;Ee5uDD;IACE,oBAAA;Gf8uDD;Ee/uDD;IACE,mBAAA;GfivDD;Ee7uDD;IACE,YAAA;Gf+uDD;Ee/vDD;IACE,WAAA;GfiwDD;EelwDD;IACE,mBAAA;GfowDD;EerwDD;IACE,mBAAA;GfuwDD;EexwDD;IACE,UAAA;Gf0wDD;Ee3wDD;IACE,mBAAA;Gf6wDD;Ee9wDD;IACE,mBAAA;GfgxDD;EejxDD;IACE,UAAA;GfmxDD;EepxDD;IACE,mBAAA;GfsxDD;EevxDD;IACE,mBAAA;GfyxDD;Ee1xDD;IACE,UAAA;Gf4xDD;Ee7xDD;IACE,mBAAA;Gf+xDD;EehyDD;IACE,kBAAA;GfkyDD;Ee9xDD;IACE,WAAA;GfgyDD;EelxDD;IACE,kBAAA;GfoxDD;EerxDD;IACE,0BAAA;GfuxDD;EexxDD;IACE,0BAAA;Gf0xDD;Ee3xDD;IACE,iBAAA;Gf6xDD;Ee9xDD;IACE,0BAAA;GfgyDD;EejyDD;IACE,0BAAA;GfmyDD;EepyDD;IACE,iBAAA;GfsyDD;EevyDD;IACE,0BAAA;GfyyDD;Ee1yDD;IACE,0BAAA;Gf4yDD;Ee7yDD;IACE,iBAAA;Gf+yDD;EehzDD;IACE,0BAAA;GfkzDD;EenzDD;IACE,yBAAA;GfqzDD;EetzDD;IACE,gBAAA;GfwzDD;CACF;AahzDD;EE3CI;IACE,YAAA;Gf81DH;Eev1DD;IACE,YAAA;Gfy1DD;Ee11DD;IACE,oBAAA;Gf41DD;Ee71DD;IACE,oBAAA;Gf+1DD;Eeh2DD;IACE,WAAA;Gfk2DD;Een2DD;IACE,oBAAA;Gfq2DD;Eet2DD;IACE,oBAAA;Gfw2DD;Eez2DD;IACE,WAAA;Gf22DD;Ee52DD;IACE,oBAAA;Gf82DD;Ee/2DD;IACE,oBAAA;Gfi3DD;Eel3DD;IACE,WAAA;Gfo3DD;Eer3DD;IACE,oBAAA;Gfu3DD;Eex3DD;IACE,mBAAA;Gf03DD;Ee52DD;IACE,YAAA;Gf82DD;Ee/2DD;IACE,oBAAA;Gfi3DD;Eel3DD;IACE,oBAAA;Gfo3DD;Eer3DD;IACE,WAAA;Gfu3DD;Eex3DD;IACE,oBAAA;Gf03DD;Ee33DD;IACE,oBAAA;Gf63DD;Ee93DD;IACE,WAAA;Gfg4DD;Eej4DD;IACE,oBAAA;Gfm4DD;Eep4DD;IACE,oBAAA;Gfs4DD;Eev4DD;IACE,WAAA;Gfy4DD;Ee14DD;IACE,oBAAA;Gf44DD;Ee74DD;IACE,mBAAA;Gf+4DD;Ee34DD;IACE,YAAA;Gf64DD;Ee75DD;IACE,WAAA;Gf+5DD;Eeh6DD;IACE,mBAAA;Gfk6DD;Een6DD;IACE,mBAAA;Gfq6DD;Eet6DD;IACE,UAAA;Gfw6DD;Eez6DD;IACE,mBAAA;Gf26DD;Ee56DD;IACE,mBAAA;Gf86DD;Ee/6DD;IACE,UAAA;Gfi7DD;Eel7DD;IACE,mBAAA;Gfo7DD;Eer7DD;IACE,mBAAA;Gfu7DD;Eex7DD;IACE,UAAA;Gf07DD;Ee37DD;IACE,mBAAA;Gf67DD;Ee97DD;IACE,kBAAA;Gfg8DD;Ee57DD;IACE,WAAA;Gf87DD;Eeh7DD;IACE,kBAAA;Gfk7DD;Een7DD;IACE,0BAAA;Gfq7DD;Eet7DD;IACE,0BAAA;Gfw7DD;Eez7DD;IACE,iBAAA;Gf27DD;Ee57DD;IACE,0BAAA;Gf87DD;Ee/7DD;IACE,0BAAA;Gfi8DD;Eel8DD;IACE,iBAAA;Gfo8DD;Eer8DD;IACE,0BAAA;Gfu8DD;Eex8DD;IACE,0BAAA;Gf08DD;Ee38DD;IACE,iBAAA;Gf68DD;Ee98DD;IACE,0BAAA;Gfg9DD;Eej9DD;IACE,yBAAA;Gfm9DD;Eep9DD;IACE,gBAAA;Gfs9DD;CACF;Aa38DD;EE9CI;IACE,YAAA;Gf4/DH;Eer/DD;IACE,YAAA;Gfu/DD;Eex/DD;IACE,oBAAA;Gf0/DD;Ee3/DD;IACE,oBAAA;Gf6/DD;Ee9/DD;IACE,WAAA;GfggED;EejgED;IACE,oBAAA;GfmgED;EepgED;IACE,oBAAA;GfsgED;EevgED;IACE,WAAA;GfygED;Ee1gED;IACE,oBAAA;Gf4gED;Ee7gED;IACE,oBAAA;Gf+gED;EehhED;IACE,WAAA;GfkhED;EenhED;IACE,oBAAA;GfqhED;EethED;IACE,mBAAA;GfwhED;Ee1gED;IACE,YAAA;Gf4gED;Ee7gED;IACE,oBAAA;Gf+gED;EehhED;IACE,oBAAA;GfkhED;EenhED;IACE,WAAA;GfqhED;EethED;IACE,oBAAA;GfwhED;EezhED;IACE,oBAAA;Gf2hED;Ee5hED;IACE,WAAA;Gf8hED;Ee/hED;IACE,oBAAA;GfiiED;EeliED;IACE,oBAAA;GfoiED;EeriED;IACE,WAAA;GfuiED;EexiED;IACE,oBAAA;Gf0iED;Ee3iED;IACE,mBAAA;Gf6iED;EeziED;IACE,YAAA;Gf2iED;Ee3jED;IACE,WAAA;Gf6jED;Ee9jED;IACE,mBAAA;GfgkED;EejkED;IACE,mBAAA;GfmkED;EepkED;IACE,UAAA;GfskED;EevkED;IACE,mBAAA;GfykED;Ee1kED;IACE,mBAAA;Gf4kED;Ee7kED;IACE,UAAA;Gf+kED;EehlED;IACE,mBAAA;GfklED;EenlED;IACE,mBAAA;GfqlED;EetlED;IACE,UAAA;GfwlED;EezlED;IACE,mBAAA;Gf2lED;Ee5lED;IACE,kBAAA;Gf8lED;Ee1lED;IACE,WAAA;Gf4lED;Ee9kED;IACE,kBAAA;GfglED;EejlED;IACE,0BAAA;GfmlED;EeplED;IACE,0BAAA;GfslED;EevlED;IACE,iBAAA;GfylED;Ee1lED;IACE,0BAAA;Gf4lED;Ee7lED;IACE,0BAAA;Gf+lED;EehmED;IACE,iBAAA;GfkmED;EenmED;IACE,0BAAA;GfqmED;EetmED;IACE,0BAAA;GfwmED;EezmED;IACE,iBAAA;Gf2mED;Ee5mED;IACE,0BAAA;Gf8mED;Ee/mED;IACE,yBAAA;GfinED;EelnED;IACE,gBAAA;GfonED;CACF;AgBxrED;EACE,8BAAA;ChB0rED;AgBxrED;EACE,iBAAA;EACA,oBAAA;EACA,eAAA;EACA,iBAAA;ChB0rED;AgBxrED;EACE,iBAAA;ChB0rED;AgBprED;EACE,YAAA;EACA,gBAAA;EACA,oBAAA;ChBsrED;AgBzrED;;;;;;EAWQ,aAAA;EACA,wBAAA;EACA,oBAAA;EACA,8BAAA;ChBsrEP;AgBpsED;EAoBI,uBAAA;EACA,iCAAA;ChBmrEH;AgBxsED;;;;;;EA8BQ,cAAA;ChBkrEP;AgBhtED;EAoCI,8BAAA;ChB+qEH;AgBntED;EAyCI,0BAAA;ChB6qEH;AgBtqED;;;;;;EAOQ,aAAA;ChBuqEP;AgB5pED;EACE,0BAAA;ChB8pED;AgB/pED;;;;;;EAQQ,0BAAA;ChB+pEP;AgBvqED;;EAeM,yBAAA;ChB4pEL;AgBlpED;EAEI,0BAAA;ChBmpEH;AgB1oED;EAEI,0BAAA;ChB2oEH;AgBloED;EACE,iBAAA;EACA,YAAA;EACA,sBAAA;ChBooED;AgB/nEG;;EACE,iBAAA;EACA,YAAA;EACA,oBAAA;ChBkoEL;AiB9wEC;;;;;;;;;;;;EAOI,0BAAA;CjBqxEL;AiB/wEC;;;;;EAMI,0BAAA;CjBgxEL;AiBnyEC;;;;;;;;;;;;EAOI,0BAAA;CjB0yEL;AiBpyEC;;;;;EAMI,0BAAA;CjBqyEL;AiBxzEC;;;;;;;;;;;;EAOI,0BAAA;CjB+zEL;AiBzzEC;;;;;EAMI,0BAAA;CjB0zEL;AiB70EC;;;;;;;;;;;;EAOI,0BAAA;CjBo1EL;AiB90EC;;;;;EAMI,0BAAA;CjB+0EL;AiBl2EC;;;;;;;;;;;;EAOI,0BAAA;CjBy2EL;AiBn2EC;;;;;EAMI,0BAAA;CjBo2EL;AgBltED;EACE,iBAAA;EACA,kBAAA;ChBotED;AgBvpED;EAAA;IA1DI,YAAA;IACA,oBAAA;IACA,mBAAA;IACA,6CAAA;IACA,0BAAA;GhBqtED;EgB/pEH;IAlDM,iBAAA;GhBotEH;EgBlqEH;;;;;;IAzCY,oBAAA;GhBmtET;EgB1qEH;IAjCM,UAAA;GhB8sEH;EgB7qEH;;;;;;IAxBY,eAAA;GhB6sET;EgBrrEH;;;;;;IApBY,gBAAA;GhBitET;EgB7rEH;;;;IAPY,iBAAA;GhB0sET;CACF;AkBp6ED;EACE,WAAA;EACA,UAAA;EACA,UAAA;EAIA,aAAA;ClBm6ED;AkBh6ED;EACE,eAAA;EACA,YAAA;EACA,WAAA;EACA,oBAAA;EACA,gBAAA;EACA,qBAAA;EACA,eAAA;EACA,UAAA;EACA,iCAAA;ClBk6ED;AkB/5ED;EACE,sBAAA;EACA,gBAAA;EACA,mBAAA;EACA,kBAAA;ClBi6ED;AkBt5ED;Eb4BE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL63ET;AkBt5ED;;EAEE,gBAAA;EACA,mBAAA;EACA,oBAAA;ClBw5ED;AkBr5ED;EACE,eAAA;ClBu5ED;AkBn5ED;EACE,eAAA;EACA,YAAA;ClBq5ED;AkBj5ED;;EAEE,aAAA;ClBm5ED;AkB/4ED;;;EZvEE,qBAAA;EAEA,2CAAA;EACA,qBAAA;CN09ED;AkB/4ED;EACE,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;ClBi5ED;AkBv3ED;EACE,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,0BAAA;EACA,uBAAA;EACA,0BAAA;EACA,mBAAA;EbxDA,yDAAA;EACQ,iDAAA;EAyHR,uFAAA;EACK,0EAAA;EACG,uEAAA;CL0zET;AmBl8EC;EACE,sBAAA;EACA,WAAA;EdUF,uFAAA;EACQ,+EAAA;CL27ET;AK15EC;EACE,eAAA;EACA,WAAA;CL45EH;AK15EC;EAA0B,eAAA;CL65E3B;AK55EC;EAAgC,eAAA;CL+5EjC;AkB/3EC;;;EAGE,0BAAA;EACA,WAAA;ClBi4EH;AkB93EC;;EAEE,oBAAA;ClBg4EH;AkB53EC;EACE,aAAA;ClB83EH;AkBl3ED;EACE,yBAAA;ClBo3ED;AkB50ED;EAtBI;;;;IACE,kBAAA;GlBw2EH;EkBr2EC;;;;;;;;IAEE,kBAAA;GlB62EH;EkB12EC;;;;;;;;IAEE,kBAAA;GlBk3EH;CACF;AkBx2ED;EACE,oBAAA;ClB02ED;AkBl2ED;;EAEE,mBAAA;EACA,eAAA;EACA,iBAAA;EACA,oBAAA;ClBo2ED;AkBz2ED;;EAQI,iBAAA;EACA,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,gBAAA;ClBq2EH;AkBl2ED;;;;EAIE,mBAAA;EACA,mBAAA;EACA,mBAAA;ClBo2ED;AkBj2ED;;EAEE,iBAAA;ClBm2ED;AkB/1ED;;EAEE,mBAAA;EACA,sBAAA;EACA,mBAAA;EACA,iBAAA;EACA,uBAAA;EACA,oBAAA;EACA,gBAAA;ClBi2ED;AkB/1ED;;EAEE,cAAA;EACA,kBAAA;ClBi2ED;AkBx1EC;;;;;;EAGE,oBAAA;ClB61EH;AkBv1EC;;;;EAEE,oBAAA;ClB21EH;AkBr1EC;;;;EAGI,oBAAA;ClBw1EL;AkB70ED;EAEE,iBAAA;EACA,oBAAA;EAEA,iBAAA;EACA,iBAAA;ClB60ED;AkB30EC;;EAEE,gBAAA;EACA,iBAAA;ClB60EH;AkBh0ED;EC7PE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnBgkFD;AmB9jFC;EACE,aAAA;EACA,kBAAA;CnBgkFH;AmB7jFC;;EAEE,aAAA;CnB+jFH;AkB50ED;EAEI,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;ClB60EH;AkBn1ED;EASI,aAAA;EACA,kBAAA;ClB60EH;AkBv1ED;;EAcI,aAAA;ClB60EH;AkB31ED;EAiBI,aAAA;EACA,iBAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;ClB60EH;AkBz0ED;ECzRE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnBqmFD;AmBnmFC;EACE,aAAA;EACA,kBAAA;CnBqmFH;AmBlmFC;;EAEE,aAAA;CnBomFH;AkBr1ED;EAEI,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;ClBs1EH;AkB51ED;EASI,aAAA;EACA,kBAAA;ClBs1EH;AkBh2ED;;EAcI,aAAA;ClBs1EH;AkBp2ED;EAiBI,aAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;ClBs1EH;AkB70ED;EAEE,mBAAA;ClB80ED;AkBh1ED;EAMI,sBAAA;ClB60EH;AkBz0ED;EACE,mBAAA;EACA,OAAA;EACA,SAAA;EACA,WAAA;EACA,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,mBAAA;EACA,qBAAA;ClB20ED;AkBz0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClB20ED;AkBz0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClB20ED;AkBv0ED;;;;;;;;;;ECpZI,eAAA;CnBuuFH;AkBn1ED;EChZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLwrFT;AmBtuFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL6rFT;AkB71ED;ECtYI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBsuFH;AkBl2ED;EChYI,eAAA;CnBquFH;AkBl2ED;;;;;;;;;;ECvZI,eAAA;CnBqwFH;AkB92ED;ECnZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLstFT;AmBpwFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL2tFT;AkBx3ED;ECzYI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBowFH;AkB73ED;ECnYI,eAAA;CnBmwFH;AkB73ED;;;;;;;;;;EC1ZI,eAAA;CnBmyFH;AkBz4ED;ECtZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLovFT;AmBlyFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CLyvFT;AkBn5ED;EC5YI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBkyFH;AkBx5ED;ECtYI,eAAA;CnBiyFH;AkBp5EC;EACG,UAAA;ClBs5EJ;AkBp5EC;EACG,OAAA;ClBs5EJ;AkB54ED;EACE,eAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;ClB84ED;AkB3zED;EAAA;IA9DM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlB63EH;EkBj0EH;IAvDM,sBAAA;IACA,YAAA;IACA,uBAAA;GlB23EH;EkBt0EH;IAhDM,sBAAA;GlBy3EH;EkBz0EH;IA5CM,sBAAA;IACA,uBAAA;GlBw3EH;EkB70EH;;;IAtCQ,YAAA;GlBw3EL;EkBl1EH;IAhCM,YAAA;GlBq3EH;EkBr1EH;IA5BM,iBAAA;IACA,uBAAA;GlBo3EH;EkBz1EH;;IApBM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlBi3EH;EkBh2EH;;IAdQ,gBAAA;GlBk3EL;EkBp2EH;;IATM,mBAAA;IACA,eAAA;GlBi3EH;EkBz2EH;IAHM,OAAA;GlB+2EH;CACF;AkBr2ED;;;;EASI,cAAA;EACA,iBAAA;EACA,iBAAA;ClBk2EH;AkB72ED;;EAiBI,iBAAA;ClBg2EH;AkBj3ED;EJhhBE,mBAAA;EACA,oBAAA;Cdo4FD;AkB90EC;EAAA;IAVI,kBAAA;IACA,iBAAA;IACA,iBAAA;GlB41EH;CACF;AkB53ED;EAwCI,YAAA;ClBu1EH;AkBz0EC;EAAA;IAJM,yBAAA;IACA,gBAAA;GlBi1EL;CACF;AkBv0EC;EAAA;IAJM,iBAAA;IACA,gBAAA;GlB+0EL;CACF;AoBl6FD;EACE,sBAAA;EACA,iBAAA;EACA,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,+BAAA;MAAA,2BAAA;EACA,gBAAA;EACA,uBAAA;EACA,8BAAA;EACA,oBAAA;EC6CA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,mBAAA;EhB4JA,0BAAA;EACG,uBAAA;EACC,sBAAA;EACI,kBAAA;CL6tFT;AoBr6FG;;;;;;EdrBF,qBAAA;EAEA,2CAAA;EACA,qBAAA;CNi8FD;AoBz6FC;;;EAGE,eAAA;EACA,sBAAA;CpB26FH;AoBx6FC;;EAEE,WAAA;EACA,uBAAA;Ef2BF,yDAAA;EACQ,iDAAA;CLg5FT;AoBx6FC;;;EAGE,oBAAA;EE7CF,cAAA;EAGA,0BAAA;EjB8DA,yBAAA;EACQ,iBAAA;CLy5FT;AoBx6FG;;EAEE,qBAAA;CpB06FL;AoBj6FD;EC3DE,eAAA;EACA,0BAAA;EACA,sBAAA;CrB+9FD;AqB79FC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB+9FP;AqB79FC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB+9FP;AqB79FC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB+9FP;AqB79FG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBq+FT;AqBl+FC;;;EAGE,uBAAA;CrBo+FH;AqB/9FG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrB6+FT;AoB/9FD;ECTI,eAAA;EACA,0BAAA;CrB2+FH;AoBh+FD;EC9DE,eAAA;EACA,0BAAA;EACA,sBAAA;CrBiiGD;AqB/hGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBiiGP;AqB/hGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBiiGP;AqB/hGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBiiGP;AqB/hGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBuiGT;AqBpiGC;;;EAGE,uBAAA;CrBsiGH;AqBjiGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrB+iGT;AoB9hGD;ECZI,eAAA;EACA,0BAAA;CrB6iGH;AoB9hGD;EClEE,eAAA;EACA,0BAAA;EACA,sBAAA;CrBmmGD;AqBjmGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBmmGP;AqBjmGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBmmGP;AqBjmGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBmmGP;AqBjmGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBymGT;AqBtmGC;;;EAGE,uBAAA;CrBwmGH;AqBnmGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrBinGT;AoB5lGD;EChBI,eAAA;EACA,0BAAA;CrB+mGH;AoB5lGD;ECtEE,eAAA;EACA,0BAAA;EACA,sBAAA;CrBqqGD;AqBnqGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBqqGP;AqBnqGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBqqGP;AqBnqGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBqqGP;AqBnqGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB2qGT;AqBxqGC;;;EAGE,uBAAA;CrB0qGH;AqBrqGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrBmrGT;AoB1pGD;ECpBI,eAAA;EACA,0BAAA;CrBirGH;AoB1pGD;EC1EE,eAAA;EACA,0BAAA;EACA,sBAAA;CrBuuGD;AqBruGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBuuGP;AqBruGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBuuGP;AqBruGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBuuGP;AqBruGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB6uGT;AqB1uGC;;;EAGE,uBAAA;CrB4uGH;AqBvuGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrBqvGT;AoBxtGD;ECxBI,eAAA;EACA,0BAAA;CrBmvGH;AoBxtGD;EC9EE,eAAA;EACA,0BAAA;EACA,sBAAA;CrByyGD;AqBvyGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrByyGP;AqBvyGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrByyGP;AqBvyGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrByyGP;AqBvyGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB+yGT;AqB5yGC;;;EAGE,uBAAA;CrB8yGH;AqBzyGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrBuzGT;AoBtxGD;EC5BI,eAAA;EACA,0BAAA;CrBqzGH;AoBjxGD;EACE,eAAA;EACA,oBAAA;EACA,iBAAA;CpBmxGD;AoBjxGC;;;;;EAKE,8BAAA;EfnCF,yBAAA;EACQ,iBAAA;CLuzGT;AoBlxGC;;;;EAIE,0BAAA;CpBoxGH;AoBlxGC;;EAEE,eAAA;EACA,2BAAA;EACA,8BAAA;CpBoxGH;AoBhxGG;;;;EAEE,eAAA;EACA,sBAAA;CpBoxGL;AoB3wGD;;ECrEE,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CrBo1GD;AoB9wGD;;ECzEE,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrB21GD;AoBjxGD;;EC7EE,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrBk2GD;AoBhxGD;EACE,eAAA;EACA,YAAA;CpBkxGD;AoB9wGD;EACE,gBAAA;CpBgxGD;AoBzwGC;;;EACE,YAAA;CpB6wGH;AuBv6GD;EACE,WAAA;ElBoLA,yCAAA;EACK,oCAAA;EACG,iCAAA;CLsvGT;AuB16GC;EACE,WAAA;CvB46GH;AuBx6GD;EACE,cAAA;CvB06GD;AuBx6GC;EAAY,eAAA;CvB26Gb;AuB16GC;EAAY,mBAAA;CvB66Gb;AuB56GC;EAAY,yBAAA;CvB+6Gb;AuB56GD;EACE,mBAAA;EACA,UAAA;EACA,iBAAA;ElBuKA,gDAAA;EACQ,2CAAA;KAAA,wCAAA;EAOR,mCAAA;EACQ,8BAAA;KAAA,2BAAA;EAGR,yCAAA;EACQ,oCAAA;KAAA,iCAAA;CLgwGT;AwB18GD;EACE,sBAAA;EACA,SAAA;EACA,UAAA;EACA,iBAAA;EACA,uBAAA;EACA,uBAAA;EACA,yBAAA;EACA,oCAAA;EACA,mCAAA;CxB48GD;AwBx8GD;;EAEE,mBAAA;CxB08GD;AwBt8GD;EACE,WAAA;CxBw8GD;AwBp8GD;EACE,mBAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,YAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,0BAAA;EACA,0BAAA;EACA,sCAAA;EACA,mBAAA;EnBsBA,oDAAA;EACQ,4CAAA;EmBrBR,qCAAA;UAAA,6BAAA;CxBu8GD;AwBl8GC;EACE,SAAA;EACA,WAAA;CxBo8GH;AwB79GD;ECzBE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBy/GD;AwBn+GD;EAmCI,eAAA;EACA,kBAAA;EACA,YAAA;EACA,oBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxBm8GH;AwB77GC;;EAEE,sBAAA;EACA,eAAA;EACA,0BAAA;CxB+7GH;AwBz7GC;;;EAGE,eAAA;EACA,sBAAA;EACA,WAAA;EACA,0BAAA;CxB27GH;AwBl7GC;;;EAGE,eAAA;CxBo7GH;AwBh7GC;;EAEE,sBAAA;EACA,8BAAA;EACA,uBAAA;EE3GF,oEAAA;EF6GE,oBAAA;CxBk7GH;AwB76GD;EAGI,eAAA;CxB66GH;AwBh7GD;EAQI,WAAA;CxB26GH;AwBn6GD;EACE,WAAA;EACA,SAAA;CxBq6GD;AwB75GD;EACE,QAAA;EACA,YAAA;CxB+5GD;AwB35GD;EACE,eAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxB65GD;AwBz5GD;EACE,gBAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,OAAA;EACA,aAAA;CxB25GD;AwBv5GD;EACE,SAAA;EACA,WAAA;CxBy5GD;AwBj5GD;;EAII,cAAA;EACA,0BAAA;EACA,4BAAA;EACA,YAAA;CxBi5GH;AwBx5GD;;EAWI,UAAA;EACA,aAAA;EACA,mBAAA;CxBi5GH;AwB53GD;EAXE;IApEA,WAAA;IACA,SAAA;GxB+8GC;EwB54GD;IA1DA,QAAA;IACA,YAAA;GxBy8GC;CACF;A2BzlHD;;EAEE,mBAAA;EACA,sBAAA;EACA,uBAAA;C3B2lHD;A2B/lHD;;EAMI,mBAAA;EACA,YAAA;C3B6lHH;A2B3lHG;;;;;;;;EAIE,WAAA;C3BimHL;A2B3lHD;;;;EAKI,kBAAA;C3B4lHH;A2BvlHD;EACE,kBAAA;C3BylHD;A2B1lHD;;;EAOI,YAAA;C3BwlHH;A2B/lHD;;;EAYI,iBAAA;C3BwlHH;A2BplHD;EACE,iBAAA;C3BslHD;A2BllHD;EACE,eAAA;C3BolHD;A2BnlHC;EClDA,8BAAA;EACG,2BAAA;C5BwoHJ;A2BllHD;;EC/CE,6BAAA;EACG,0BAAA;C5BqoHJ;A2BjlHD;EACE,YAAA;C3BmlHD;A2BjlHD;EACE,iBAAA;C3BmlHD;A2BjlHD;;ECnEE,8BAAA;EACG,2BAAA;C5BwpHJ;A2BhlHD;ECjEE,6BAAA;EACG,0BAAA;C5BopHJ;A2B/kHD;;EAEE,WAAA;C3BilHD;A2BhkHD;EACE,kBAAA;EACA,mBAAA;C3BkkHD;A2BhkHD;EACE,mBAAA;EACA,oBAAA;C3BkkHD;A2B7jHD;EtB/CE,yDAAA;EACQ,iDAAA;CL+mHT;A2B7jHC;EtBnDA,yBAAA;EACQ,iBAAA;CLmnHT;A2B1jHD;EACE,eAAA;C3B4jHD;A2BzjHD;EACE,wBAAA;EACA,uBAAA;C3B2jHD;A2BxjHD;EACE,wBAAA;C3B0jHD;A2BnjHD;;;EAII,eAAA;EACA,YAAA;EACA,YAAA;EACA,gBAAA;C3BojHH;A2B3jHD;EAcM,YAAA;C3BgjHL;A2B9jHD;;;;EAsBI,iBAAA;EACA,eAAA;C3B8iHH;A2BziHC;EACE,iBAAA;C3B2iHH;A2BziHC;EACE,6BAAA;ECpKF,8BAAA;EACC,6BAAA;C5BgtHF;A2B1iHC;EACE,+BAAA;EChLF,2BAAA;EACC,0BAAA;C5B6tHF;A2B1iHD;EACE,iBAAA;C3B4iHD;A2B1iHD;;EC/KE,8BAAA;EACC,6BAAA;C5B6tHF;A2BziHD;EC7LE,2BAAA;EACC,0BAAA;C5ByuHF;A2BriHD;EACE,eAAA;EACA,YAAA;EACA,oBAAA;EACA,0BAAA;C3BuiHD;A2B3iHD;;EAOI,YAAA;EACA,oBAAA;EACA,UAAA;C3BwiHH;A2BjjHD;EAYI,YAAA;C3BwiHH;A2BpjHD;EAgBI,WAAA;C3BuiHH;A2BthHD;;;;EAKM,mBAAA;EACA,uBAAA;EACA,qBAAA;C3BuhHL;A6BjwHD;EACE,mBAAA;EACA,eAAA;EACA,0BAAA;C7BmwHD;A6BhwHC;EACE,YAAA;EACA,gBAAA;EACA,iBAAA;C7BkwHH;A6B3wHD;EAeI,mBAAA;EACA,WAAA;EAKA,YAAA;EAEA,YAAA;EACA,iBAAA;C7B0vHH;A6BjvHD;;;EV8BE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnBwtHD;AmBttHC;;;EACE,aAAA;EACA,kBAAA;CnB0tHH;AmBvtHC;;;;;;EAEE,aAAA;CnB6tHH;A6BnwHD;;;EVyBE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnB+uHD;AmB7uHC;;;EACE,aAAA;EACA,kBAAA;CnBivHH;AmB9uHC;;;;;;EAEE,aAAA;CnBovHH;A6BjxHD;;;EAGE,oBAAA;C7BmxHD;A6BjxHC;;;EACE,iBAAA;C7BqxHH;A6BjxHD;;EAEE,UAAA;EACA,oBAAA;EACA,uBAAA;C7BmxHD;A6B9wHD;EACE,kBAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;EACA,eAAA;EACA,mBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;C7BgxHD;A6B7wHC;EACE,kBAAA;EACA,gBAAA;EACA,mBAAA;C7B+wHH;A6B7wHC;EACE,mBAAA;EACA,gBAAA;EACA,mBAAA;C7B+wHH;A6BnyHD;;EA0BI,cAAA;C7B6wHH;A6BxwHD;;;;;;;EDhGE,8BAAA;EACG,2BAAA;C5Bi3HJ;A6BzwHD;EACE,gBAAA;C7B2wHD;A6BzwHD;;;;;;;EDpGE,6BAAA;EACG,0BAAA;C5Bs3HJ;A6B1wHD;EACE,eAAA;C7B4wHD;A6BvwHD;EACE,mBAAA;EAGA,aAAA;EACA,oBAAA;C7BuwHD;A6B5wHD;EAUI,mBAAA;C7BqwHH;A6B/wHD;EAYM,kBAAA;C7BswHL;A6BnwHG;;;EAGE,WAAA;C7BqwHL;A6BhwHC;;EAGI,mBAAA;C7BiwHL;A6B9vHC;;EAGI,WAAA;EACA,kBAAA;C7B+vHL;A8B15HD;EACE,iBAAA;EACA,gBAAA;EACA,iBAAA;C9B45HD;A8B/5HD;EAOI,mBAAA;EACA,eAAA;C9B25HH;A8Bn6HD;EAWM,mBAAA;EACA,eAAA;EACA,mBAAA;C9B25HL;A8B15HK;;EAEE,sBAAA;EACA,0BAAA;C9B45HP;A8Bv5HG;EACE,eAAA;C9By5HL;A8Bv5HK;;EAEE,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,oBAAA;C9By5HP;A8Bl5HG;;;EAGE,0BAAA;EACA,sBAAA;C9Bo5HL;A8B77HD;ELHE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBm8HD;A8Bn8HD;EA0DI,gBAAA;C9B44HH;A8Bn4HD;EACE,iCAAA;C9Bq4HD;A8Bt4HD;EAGI,YAAA;EAEA,oBAAA;C9Bq4HH;A8B14HD;EASM,kBAAA;EACA,wBAAA;EACA,8BAAA;EACA,2BAAA;C9Bo4HL;A8Bn4HK;EACE,sCAAA;C9Bq4HP;A8B/3HK;;;EAGE,eAAA;EACA,0BAAA;EACA,0BAAA;EACA,iCAAA;EACA,gBAAA;C9Bi4HP;A8B53HC;EAqDA,YAAA;EA8BA,iBAAA;C9B6yHD;A8Bh4HC;EAwDE,YAAA;C9B20HH;A8Bn4HC;EA0DI,mBAAA;EACA,mBAAA;C9B40HL;A8Bv4HC;EAgEE,UAAA;EACA,WAAA;C9B00HH;A8B9zHD;EAAA;IAPM,oBAAA;IACA,UAAA;G9By0HH;E8Bn0HH;IAJQ,iBAAA;G9B00HL;CACF;A8Bp5HC;EAuFE,gBAAA;EACA,mBAAA;C9Bg0HH;A8Bx5HC;;;EA8FE,0BAAA;C9B+zHH;A8BjzHD;EAAA;IATM,iCAAA;IACA,2BAAA;G9B8zHH;E8BtzHH;;;IAHM,6BAAA;G9B8zHH;CACF;A8B/5HD;EAEI,YAAA;C9Bg6HH;A8Bl6HD;EAMM,mBAAA;C9B+5HL;A8Br6HD;EASM,iBAAA;C9B+5HL;A8B15HK;;;EAGE,eAAA;EACA,0BAAA;C9B45HP;A8Bp5HD;EAEI,YAAA;C9Bq5HH;A8Bv5HD;EAIM,gBAAA;EACA,eAAA;C9Bs5HL;A8B14HD;EACE,YAAA;C9B44HD;A8B74HD;EAII,YAAA;C9B44HH;A8Bh5HD;EAMM,mBAAA;EACA,mBAAA;C9B64HL;A8Bp5HD;EAYI,UAAA;EACA,WAAA;C9B24HH;A8B/3HD;EAAA;IAPM,oBAAA;IACA,UAAA;G9B04HH;E8Bp4HH;IAJQ,iBAAA;G9B24HL;CACF;A8Bn4HD;EACE,iBAAA;C9Bq4HD;A8Bt4HD;EAKI,gBAAA;EACA,mBAAA;C9Bo4HH;A8B14HD;;;EAYI,0BAAA;C9Bm4HH;A8Br3HD;EAAA;IATM,iCAAA;IACA,2BAAA;G9Bk4HH;E8B13HH;;;IAHM,6BAAA;G9Bk4HH;CACF;A8Bz3HD;EAEI,cAAA;C9B03HH;A8B53HD;EAKI,eAAA;C9B03HH;A8Bj3HD;EAEE,iBAAA;EF3OA,2BAAA;EACC,0BAAA;C5B8lIF;A+BxlID;EACE,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,8BAAA;C/B0lID;A+BllID;EAAA;IAFI,mBAAA;G/BwlID;CACF;A+BzkID;EAAA;IAFI,YAAA;G/B+kID;CACF;A+BjkID;EACE,oBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,2DAAA;UAAA,mDAAA;EAEA,kCAAA;C/BkkID;A+BhkIC;EACE,iBAAA;C/BkkIH;A+BtiID;EAAA;IAxBI,YAAA;IACA,cAAA;IACA,yBAAA;YAAA,iBAAA;G/BkkID;E+BhkIC;IACE,0BAAA;IACA,wBAAA;IACA,kBAAA;IACA,6BAAA;G/BkkIH;E+B/jIC;IACE,oBAAA;G/BikIH;E+B5jIC;;;IAGE,gBAAA;IACA,iBAAA;G/B8jIH;CACF;A+B1jID;;EAGI,kBAAA;C/B2jIH;A+BtjIC;EAAA;;IAFI,kBAAA;G/B6jIH;CACF;A+BpjID;;;;EAII,oBAAA;EACA,mBAAA;C/BsjIH;A+BhjIC;EAAA;;;;IAHI,gBAAA;IACA,eAAA;G/B0jIH;CACF;A+B9iID;EACE,cAAA;EACA,sBAAA;C/BgjID;A+B3iID;EAAA;IAFI,iBAAA;G/BijID;CACF;A+B7iID;;EAEE,gBAAA;EACA,SAAA;EACA,QAAA;EACA,cAAA;C/B+iID;A+BziID;EAAA;;IAFI,iBAAA;G/BgjID;CACF;A+B9iID;EACE,OAAA;EACA,sBAAA;C/BgjID;A+B9iID;EACE,UAAA;EACA,iBAAA;EACA,sBAAA;C/BgjID;A+B1iID;EACE,YAAA;EACA,mBAAA;EACA,gBAAA;EACA,kBAAA;EACA,aAAA;C/B4iID;A+B1iIC;;EAEE,sBAAA;C/B4iIH;A+BrjID;EAaI,eAAA;C/B2iIH;A+BliID;EALI;;IAEE,mBAAA;G/B0iIH;CACF;A+BhiID;EACE,mBAAA;EACA,aAAA;EACA,mBAAA;EACA,kBAAA;EC9LA,gBAAA;EACA,mBAAA;ED+LA,8BAAA;EACA,uBAAA;EACA,8BAAA;EACA,mBAAA;C/BmiID;A+B/hIC;EACE,WAAA;C/BiiIH;A+B/iID;EAmBI,eAAA;EACA,YAAA;EACA,YAAA;EACA,mBAAA;C/B+hIH;A+BrjID;EAyBI,gBAAA;C/B+hIH;A+BzhID;EAAA;IAFI,cAAA;G/B+hID;CACF;A+BthID;EACE,oBAAA;C/BwhID;A+BzhID;EAII,kBAAA;EACA,qBAAA;EACA,kBAAA;C/BwhIH;A+B5/HC;EAAA;IAtBI,iBAAA;IACA,YAAA;IACA,YAAA;IACA,cAAA;IACA,8BAAA;IACA,UAAA;IACA,yBAAA;YAAA,iBAAA;G/BshIH;E+BtgID;;IAbM,2BAAA;G/BuhIL;E+B1gID;IAVM,kBAAA;G/BuhIL;E+BthIK;;IAEE,uBAAA;G/BwhIP;CACF;A+BtgID;EAAA;IAXI,YAAA;IACA,UAAA;G/BqhID;E+B3gIH;IAPM,YAAA;G/BqhIH;E+B9gIH;IALQ,kBAAA;IACA,qBAAA;G/BshIL;CACF;A+B3gID;EACE,mBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,qCAAA;E1B9NA,6FAAA;EACQ,qFAAA;E2B/DR,gBAAA;EACA,mBAAA;ChC4yID;AkB5xHD;EAAA;IA9DM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlB81HH;EkBlyHH;IAvDM,sBAAA;IACA,YAAA;IACA,uBAAA;GlB41HH;EkBvyHH;IAhDM,sBAAA;GlB01HH;EkB1yHH;IA5CM,sBAAA;IACA,uBAAA;GlBy1HH;EkB9yHH;;;IAtCQ,YAAA;GlBy1HL;EkBnzHH;IAhCM,YAAA;GlBs1HH;EkBtzHH;IA5BM,iBAAA;IACA,uBAAA;GlBq1HH;EkB1zHH;;IApBM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlBk1HH;EkBj0HH;;IAdQ,gBAAA;GlBm1HL;EkBr0HH;;IATM,mBAAA;IACA,eAAA;GlBk1HH;EkB10HH;IAHM,OAAA;GlBg1HH;CACF;A+BpjIC;EAAA;IANI,mBAAA;G/B8jIH;E+B5jIG;IACE,iBAAA;G/B8jIL;CACF;A+B7iID;EAAA;IARI,YAAA;IACA,UAAA;IACA,eAAA;IACA,gBAAA;IACA,eAAA;IACA,kBAAA;I1BzPF,yBAAA;IACQ,iBAAA;GLmzIP;CACF;A+BnjID;EACE,cAAA;EHpUA,2BAAA;EACC,0BAAA;C5B03IF;A+BnjID;EACE,iBAAA;EHzUA,6BAAA;EACC,4BAAA;EAOD,8BAAA;EACC,6BAAA;C5By3IF;A+B/iID;EChVE,gBAAA;EACA,mBAAA;ChCk4ID;A+BhjIC;ECnVA,iBAAA;EACA,oBAAA;ChCs4ID;A+BjjIC;ECtVA,iBAAA;EACA,oBAAA;ChC04ID;A+B3iID;EChWE,iBAAA;EACA,oBAAA;ChC84ID;A+BviID;EAAA;IAJI,YAAA;IACA,kBAAA;IACA,mBAAA;G/B+iID;CACF;A+BlhID;EAhBE;IExWA,uBAAA;GjC84IC;E+BriID;IE5WA,wBAAA;IF8WE,oBAAA;G/BuiID;E+BziID;IAKI,gBAAA;G/BuiIH;CACF;A+B9hID;EACE,0BAAA;EACA,sBAAA;C/BgiID;A+BliID;EAKI,eAAA;C/BgiIH;A+B/hIG;;EAEE,eAAA;EACA,8BAAA;C/BiiIL;A+B1iID;EAcI,eAAA;C/B+hIH;A+B7iID;EAmBM,eAAA;C/B6hIL;A+B3hIK;;EAEE,eAAA;EACA,8BAAA;C/B6hIP;A+BzhIK;;;EAGE,eAAA;EACA,0BAAA;C/B2hIP;A+BvhIK;;;EAGE,eAAA;EACA,8BAAA;C/ByhIP;A+BjkID;EA8CI,sBAAA;C/BshIH;A+BrhIG;;EAEE,0BAAA;C/BuhIL;A+BxkID;EAoDM,0BAAA;C/BuhIL;A+B3kID;;EA0DI,sBAAA;C/BqhIH;A+B9gIK;;;EAGE,0BAAA;EACA,eAAA;C/BghIP;A+B/+HC;EAAA;IAzBQ,eAAA;G/B4gIP;E+B3gIO;;IAEE,eAAA;IACA,8BAAA;G/B6gIT;E+BzgIO;;;IAGE,eAAA;IACA,0BAAA;G/B2gIT;E+BvgIO;;;IAGE,eAAA;IACA,8BAAA;G/BygIT;CACF;A+B3mID;EA8GI,eAAA;C/BggIH;A+B//HG;EACE,eAAA;C/BigIL;A+BjnID;EAqHI,eAAA;C/B+/HH;A+B9/HG;;EAEE,eAAA;C/BggIL;A+B5/HK;;;;EAEE,eAAA;C/BggIP;A+Bx/HD;EACE,0BAAA;EACA,sBAAA;C/B0/HD;A+B5/HD;EAKI,eAAA;C/B0/HH;A+Bz/HG;;EAEE,eAAA;EACA,8BAAA;C/B2/HL;A+BpgID;EAcI,eAAA;C/By/HH;A+BvgID;EAmBM,eAAA;C/Bu/HL;A+Br/HK;;EAEE,eAAA;EACA,8BAAA;C/Bu/HP;A+Bn/HK;;;EAGE,eAAA;EACA,0BAAA;C/Bq/HP;A+Bj/HK;;;EAGE,eAAA;EACA,8BAAA;C/Bm/HP;A+B3hID;EA+CI,sBAAA;C/B++HH;A+B9+HG;;EAEE,0BAAA;C/Bg/HL;A+BliID;EAqDM,0BAAA;C/Bg/HL;A+BriID;;EA2DI,sBAAA;C/B8+HH;A+Bx+HK;;;EAGE,0BAAA;EACA,eAAA;C/B0+HP;A+Bn8HC;EAAA;IA/BQ,sBAAA;G/Bs+HP;E+Bv8HD;IA5BQ,0BAAA;G/Bs+HP;E+B18HD;IAzBQ,eAAA;G/Bs+HP;E+Br+HO;;IAEE,eAAA;IACA,8BAAA;G/Bu+HT;E+Bn+HO;;;IAGE,eAAA;IACA,0BAAA;G/Bq+HT;E+Bj+HO;;;IAGE,eAAA;IACA,8BAAA;G/Bm+HT;CACF;A+B3kID;EA+GI,eAAA;C/B+9HH;A+B99HG;EACE,eAAA;C/Bg+HL;A+BjlID;EAsHI,eAAA;C/B89HH;A+B79HG;;EAEE,eAAA;C/B+9HL;A+B39HK;;;;EAEE,eAAA;C/B+9HP;AkCzmJD;EACE,kBAAA;EACA,oBAAA;EACA,iBAAA;EACA,0BAAA;EACA,mBAAA;ClC2mJD;AkChnJD;EAQI,sBAAA;ClC2mJH;AkCnnJD;EAWM,kBAAA;EACA,eAAA;EACA,eAAA;ClC2mJL;AkCxnJD;EAkBI,eAAA;ClCymJH;AmC7nJD;EACE,sBAAA;EACA,gBAAA;EACA,eAAA;EACA,mBAAA;CnC+nJD;AmCnoJD;EAOI,gBAAA;CnC+nJH;AmCtoJD;;EAUM,mBAAA;EACA,YAAA;EACA,kBAAA;EACA,wBAAA;EACA,sBAAA;EACA,eAAA;EACA,0BAAA;EACA,0BAAA;EACA,kBAAA;CnCgoJL;AmC9nJG;;EAGI,eAAA;EPXN,+BAAA;EACG,4BAAA;C5B2oJJ;AmC7nJG;;EPvBF,gCAAA;EACG,6BAAA;C5BwpJJ;AmCxnJG;;;;EAEE,WAAA;EACA,eAAA;EACA,0BAAA;EACA,sBAAA;CnC4nJL;AmCtnJG;;;;;;EAGE,WAAA;EACA,eAAA;EACA,0BAAA;EACA,sBAAA;EACA,gBAAA;CnC2nJL;AmClrJD;;;;;;EAkEM,eAAA;EACA,0BAAA;EACA,sBAAA;EACA,oBAAA;CnCwnJL;AmC/mJD;;EC3EM,mBAAA;EACA,gBAAA;EACA,uBAAA;CpC8rJL;AoC5rJG;;ERKF,+BAAA;EACG,4BAAA;C5B2rJJ;AoC3rJG;;ERTF,gCAAA;EACG,6BAAA;C5BwsJJ;AmC1nJD;;EChFM,kBAAA;EACA,gBAAA;EACA,iBAAA;CpC8sJL;AoC5sJG;;ERKF,+BAAA;EACG,4BAAA;C5B2sJJ;AoC3sJG;;ERTF,gCAAA;EACG,6BAAA;C5BwtJJ;AqC3tJD;EACE,gBAAA;EACA,eAAA;EACA,iBAAA;EACA,mBAAA;CrC6tJD;AqCjuJD;EAOI,gBAAA;CrC6tJH;AqCpuJD;;EAUM,sBAAA;EACA,kBAAA;EACA,0BAAA;EACA,0BAAA;EACA,oBAAA;CrC8tJL;AqC5uJD;;EAmBM,sBAAA;EACA,0BAAA;CrC6tJL;AqCjvJD;;EA2BM,aAAA;CrC0tJL;AqCrvJD;;EAkCM,YAAA;CrCutJL;AqCzvJD;;;;EA2CM,eAAA;EACA,0BAAA;EACA,oBAAA;CrCotJL;AsClwJD;EACE,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,kBAAA;EACA,eAAA;EACA,eAAA;EACA,mBAAA;EACA,oBAAA;EACA,yBAAA;EACA,qBAAA;CtCowJD;AsChwJG;;EAEE,eAAA;EACA,sBAAA;EACA,gBAAA;CtCkwJL;AsC7vJC;EACE,cAAA;CtC+vJH;AsC3vJC;EACE,mBAAA;EACA,UAAA;CtC6vJH;AsCtvJD;ECtCE,0BAAA;CvC+xJD;AuC5xJG;;EAEE,0BAAA;CvC8xJL;AsCzvJD;EC1CE,0BAAA;CvCsyJD;AuCnyJG;;EAEE,0BAAA;CvCqyJL;AsC5vJD;EC9CE,0BAAA;CvC6yJD;AuC1yJG;;EAEE,0BAAA;CvC4yJL;AsC/vJD;EClDE,0BAAA;CvCozJD;AuCjzJG;;EAEE,0BAAA;CvCmzJL;AsClwJD;ECtDE,0BAAA;CvC2zJD;AuCxzJG;;EAEE,0BAAA;CvC0zJL;AsCrwJD;EC1DE,0BAAA;CvCk0JD;AuC/zJG;;EAEE,0BAAA;CvCi0JL;AwCn0JD;EACE,sBAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,kBAAA;EACA,eAAA;EACA,eAAA;EACA,uBAAA;EACA,oBAAA;EACA,mBAAA;EACA,0BAAA;EACA,oBAAA;CxCq0JD;AwCl0JC;EACE,cAAA;CxCo0JH;AwCh0JC;EACE,mBAAA;EACA,UAAA;CxCk0JH;AwC/zJC;;EAEE,OAAA;EACA,iBAAA;CxCi0JH;AwC5zJG;;EAEE,eAAA;EACA,sBAAA;EACA,gBAAA;CxC8zJL;AwCzzJC;;EAEE,eAAA;EACA,0BAAA;CxC2zJH;AwCxzJC;EACE,aAAA;CxC0zJH;AwCvzJC;EACE,kBAAA;CxCyzJH;AwCtzJC;EACE,iBAAA;CxCwzJH;AyCl3JD;EACE,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,eAAA;EACA,0BAAA;CzCo3JD;AyCz3JD;;EASI,eAAA;CzCo3JH;AyC73JD;EAaI,oBAAA;EACA,gBAAA;EACA,iBAAA;CzCm3JH;AyCl4JD;EAmBI,0BAAA;CzCk3JH;AyC/2JC;;EAEE,mBAAA;CzCi3JH;AyCz4JD;EA4BI,gBAAA;CzCg3JH;AyC91JD;EAAA;IAdI,kBAAA;IACA,qBAAA;GzCg3JD;EyC92JC;;IAEE,mBAAA;IACA,oBAAA;GzCg3JH;EyCx2JH;;IAHM,gBAAA;GzC+2JH;CACF;A0C15JD;EACE,eAAA;EACA,aAAA;EACA,oBAAA;EACA,wBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;ErCiLA,4CAAA;EACK,uCAAA;EACG,oCAAA;CL4uJT;A0Ct6JD;;EAaI,kBAAA;EACA,mBAAA;C1C65JH;A0Cz5JC;;;EAGE,sBAAA;C1C25JH;A0Ch7JD;EA0BI,aAAA;EACA,eAAA;C1Cy5JH;A2Cl7JD;EACE,cAAA;EACA,oBAAA;EACA,8BAAA;EACA,mBAAA;C3Co7JD;A2Cx7JD;EAQI,cAAA;EAEA,eAAA;C3Ck7JH;A2C57JD;EAeI,kBAAA;C3Cg7JH;A2C/7JD;;EAqBI,iBAAA;C3C86JH;A2Cn8JD;EAyBI,gBAAA;C3C66JH;A2Cr6JD;;EAEE,oBAAA;C3Cu6JD;A2Cz6JD;;EAMI,mBAAA;EACA,UAAA;EACA,aAAA;EACA,eAAA;C3Cu6JH;A2C/5JD;ECvDE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Cy9JD;A2Cp6JD;EClDI,0BAAA;C5Cy9JH;A2Cv6JD;EC/CI,eAAA;C5Cy9JH;A2Ct6JD;EC3DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Co+JD;A2C36JD;ECtDI,0BAAA;C5Co+JH;A2C96JD;ECnDI,eAAA;C5Co+JH;A2C76JD;EC/DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C++JD;A2Cl7JD;EC1DI,0BAAA;C5C++JH;A2Cr7JD;ECvDI,eAAA;C5C++JH;A2Cp7JD;ECnEE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C0/JD;A2Cz7JD;EC9DI,0BAAA;C5C0/JH;A2C57JD;EC3DI,eAAA;C5C0/JH;A6C5/JD;EACE;IAAQ,4BAAA;G7C+/JP;E6C9/JD;IAAQ,yBAAA;G7CigKP;CACF;A6C9/JD;EACE;IAAQ,4BAAA;G7CigKP;E6ChgKD;IAAQ,yBAAA;G7CmgKP;CACF;A6CtgKD;EACE;IAAQ,4BAAA;G7CigKP;E6ChgKD;IAAQ,yBAAA;G7CmgKP;CACF;A6C5/JD;EACE,iBAAA;EACA,aAAA;EACA,oBAAA;EACA,0BAAA;EACA,mBAAA;ExCsCA,uDAAA;EACQ,+CAAA;CLy9JT;A6C3/JD;EACE,YAAA;EACA,UAAA;EACA,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,eAAA;EACA,mBAAA;EACA,0BAAA;ExCyBA,uDAAA;EACQ,+CAAA;EAyHR,oCAAA;EACK,+BAAA;EACG,4BAAA;CL62JT;A6Cx/JD;;ECCI,8MAAA;EACA,yMAAA;EACA,sMAAA;EDAF,mCAAA;UAAA,2BAAA;C7C4/JD;A6Cr/JD;;ExC5CE,2DAAA;EACK,sDAAA;EACG,mDAAA;CLqiKT;A6Cl/JD;EErEE,0BAAA;C/C0jKD;A+CvjKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C0gKH;A6Ct/JD;EEzEE,0BAAA;C/CkkKD;A+C/jKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9CkhKH;A6C1/JD;EE7EE,0BAAA;C/C0kKD;A+CvkKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C0hKH;A6C9/JD;EEjFE,0BAAA;C/CklKD;A+C/kKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9CkiKH;AgD1lKD;EAEE,iBAAA;ChD2lKD;AgDzlKC;EACE,cAAA;ChD2lKH;AgDvlKD;;EAEE,QAAA;EACA,iBAAA;ChDylKD;AgDtlKD;EACE,eAAA;ChDwlKD;AgDrlKD;EACE,eAAA;ChDulKD;AgDplKC;EACE,gBAAA;ChDslKH;AgDllKD;;EAEE,mBAAA;ChDolKD;AgDjlKD;;EAEE,oBAAA;ChDmlKD;AgDhlKD;;;EAGE,oBAAA;EACA,oBAAA;ChDklKD;AgD/kKD;EACE,uBAAA;ChDilKD;AgD9kKD;EACE,uBAAA;ChDglKD;AgD5kKD;EACE,cAAA;EACA,mBAAA;ChD8kKD;AgDxkKD;EACE,gBAAA;EACA,iBAAA;ChD0kKD;AiDjoKD;EAEE,oBAAA;EACA,gBAAA;CjDkoKD;AiD1nKD;EACE,mBAAA;EACA,eAAA;EACA,mBAAA;EAEA,oBAAA;EACA,0BAAA;EACA,0BAAA;CjD2nKD;AiDxnKC;ErB3BA,6BAAA;EACC,4BAAA;C5BspKF;AiDznKC;EACE,iBAAA;ErBvBF,gCAAA;EACC,+BAAA;C5BmpKF;AiDlnKD;;EAEE,eAAA;CjDonKD;AiDtnKD;;EAKI,eAAA;CjDqnKH;AiDjnKC;;;;EAEE,sBAAA;EACA,eAAA;EACA,0BAAA;CjDqnKH;AiDjnKD;EACE,YAAA;EACA,iBAAA;CjDmnKD;AiD9mKC;;;EAGE,0BAAA;EACA,eAAA;EACA,oBAAA;CjDgnKH;AiDrnKC;;;EASI,eAAA;CjDinKL;AiD1nKC;;;EAYI,eAAA;CjDmnKL;AiD9mKC;;;EAGE,WAAA;EACA,eAAA;EACA,0BAAA;EACA,sBAAA;CjDgnKH;AiDtnKC;;;;;;;;;EAYI,eAAA;CjDqnKL;AiDjoKC;;;EAeI,eAAA;CjDunKL;AkDztKC;EACE,eAAA;EACA,0BAAA;ClD2tKH;AkDztKG;;EAEE,eAAA;ClD2tKL;AkD7tKG;;EAKI,eAAA;ClD4tKP;AkDztKK;;;;EAEE,eAAA;EACA,0BAAA;ClD6tKP;AkD3tKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDguKP;AkDtvKC;EACE,eAAA;EACA,0BAAA;ClDwvKH;AkDtvKG;;EAEE,eAAA;ClDwvKL;AkD1vKG;;EAKI,eAAA;ClDyvKP;AkDtvKK;;;;EAEE,eAAA;EACA,0BAAA;ClD0vKP;AkDxvKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD6vKP;AkDnxKC;EACE,eAAA;EACA,0BAAA;ClDqxKH;AkDnxKG;;EAEE,eAAA;ClDqxKL;AkDvxKG;;EAKI,eAAA;ClDsxKP;AkDnxKK;;;;EAEE,eAAA;EACA,0BAAA;ClDuxKP;AkDrxKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD0xKP;AkDhzKC;EACE,eAAA;EACA,0BAAA;ClDkzKH;AkDhzKG;;EAEE,eAAA;ClDkzKL;AkDpzKG;;EAKI,eAAA;ClDmzKP;AkDhzKK;;;;EAEE,eAAA;EACA,0BAAA;ClDozKP;AkDlzKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDuzKP;AiDttKD;EACE,cAAA;EACA,mBAAA;CjDwtKD;AiDttKD;EACE,iBAAA;EACA,iBAAA;CjDwtKD;AmDl1KD;EACE,oBAAA;EACA,0BAAA;EACA,8BAAA;EACA,mBAAA;E9C0DA,kDAAA;EACQ,0CAAA;CL2xKT;AmDj1KD;EACE,cAAA;CnDm1KD;AmD90KD;EACE,mBAAA;EACA,qCAAA;EvBpBA,6BAAA;EACC,4BAAA;C5Bq2KF;AmDp1KD;EAMI,eAAA;CnDi1KH;AmD50KD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,eAAA;CnD80KD;AmDl1KD;;;;;EAWI,eAAA;CnD80KH;AmDz0KD;EACE,mBAAA;EACA,0BAAA;EACA,8BAAA;EvBxCA,gCAAA;EACC,+BAAA;C5Bo3KF;AmDn0KD;;EAGI,iBAAA;CnDo0KH;AmDv0KD;;EAMM,oBAAA;EACA,iBAAA;CnDq0KL;AmDj0KG;;EAEI,cAAA;EvBvEN,6BAAA;EACC,4BAAA;C5B24KF;AmD/zKG;;EAEI,iBAAA;EvBvEN,gCAAA;EACC,+BAAA;C5By4KF;AmDx1KD;EvB1DE,2BAAA;EACC,0BAAA;C5Bq5KF;AmD3zKD;EAEI,oBAAA;CnD4zKH;AmDzzKD;EACE,oBAAA;CnD2zKD;AmDnzKD;;;EAII,iBAAA;CnDozKH;AmDxzKD;;;EAOM,mBAAA;EACA,oBAAA;CnDszKL;AmD9zKD;;EvBzGE,6BAAA;EACC,4BAAA;C5B26KF;AmDn0KD;;;;EAmBQ,4BAAA;EACA,6BAAA;CnDszKP;AmD10KD;;;;;;;;EAwBU,4BAAA;CnD4zKT;AmDp1KD;;;;;;;;EA4BU,6BAAA;CnDk0KT;AmD91KD;;EvBjGE,gCAAA;EACC,+BAAA;C5Bm8KF;AmDn2KD;;;;EAyCQ,+BAAA;EACA,gCAAA;CnDg0KP;AmD12KD;;;;;;;;EA8CU,+BAAA;CnDs0KT;AmDp3KD;;;;;;;;EAkDU,gCAAA;CnD40KT;AmD93KD;;;;EA2DI,8BAAA;CnDy0KH;AmDp4KD;;EA+DI,cAAA;CnDy0KH;AmDx4KD;;EAmEI,UAAA;CnDy0KH;AmD54KD;;;;;;;;;;;;EA0EU,eAAA;CnDg1KT;AmD15KD;;;;;;;;;;;;EA8EU,gBAAA;CnD01KT;AmDx6KD;;;;;;;;EAuFU,iBAAA;CnD21KT;AmDl7KD;;;;;;;;EAgGU,iBAAA;CnD41KT;AmD57KD;EAsGI,UAAA;EACA,iBAAA;CnDy1KH;AmD/0KD;EACE,oBAAA;CnDi1KD;AmDl1KD;EAKI,iBAAA;EACA,mBAAA;CnDg1KH;AmDt1KD;EASM,gBAAA;CnDg1KL;AmDz1KD;EAcI,iBAAA;CnD80KH;AmD51KD;;EAkBM,8BAAA;CnD80KL;AmDh2KD;EAuBI,cAAA;CnD40KH;AmDn2KD;EAyBM,iCAAA;CnD60KL;AmDt0KD;EC1PE,sBAAA;CpDmkLD;AoDjkLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDmkLH;AoDtkLC;EAMI,0BAAA;CpDmkLL;AoDzkLC;EASI,eAAA;EACA,0BAAA;CpDmkLL;AoDhkLC;EAEI,6BAAA;CpDikLL;AmDr1KD;EC7PE,sBAAA;CpDqlLD;AoDnlLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDqlLH;AoDxlLC;EAMI,0BAAA;CpDqlLL;AoD3lLC;EASI,eAAA;EACA,0BAAA;CpDqlLL;AoDllLC;EAEI,6BAAA;CpDmlLL;AmDp2KD;EChQE,sBAAA;CpDumLD;AoDrmLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDumLH;AoD1mLC;EAMI,0BAAA;CpDumLL;AoD7mLC;EASI,eAAA;EACA,0BAAA;CpDumLL;AoDpmLC;EAEI,6BAAA;CpDqmLL;AmDn3KD;ECnQE,sBAAA;CpDynLD;AoDvnLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDynLH;AoD5nLC;EAMI,0BAAA;CpDynLL;AoD/nLC;EASI,eAAA;EACA,0BAAA;CpDynLL;AoDtnLC;EAEI,6BAAA;CpDunLL;AmDl4KD;ECtQE,sBAAA;CpD2oLD;AoDzoLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD2oLH;AoD9oLC;EAMI,0BAAA;CpD2oLL;AoDjpLC;EASI,eAAA;EACA,0BAAA;CpD2oLL;AoDxoLC;EAEI,6BAAA;CpDyoLL;AmDj5KD;ECzQE,sBAAA;CpD6pLD;AoD3pLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD6pLH;AoDhqLC;EAMI,0BAAA;CpD6pLL;AoDnqLC;EASI,eAAA;EACA,0BAAA;CpD6pLL;AoD1pLC;EAEI,6BAAA;CpD2pLL;AqD3qLD;EACE,mBAAA;EACA,eAAA;EACA,UAAA;EACA,WAAA;EACA,iBAAA;CrD6qLD;AqDlrLD;;;;;EAYI,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,aAAA;EACA,YAAA;EACA,UAAA;CrD6qLH;AqDxqLD;EACE,uBAAA;CrD0qLD;AqDtqLD;EACE,oBAAA;CrDwqLD;AsDnsLD;EACE,iBAAA;EACA,cAAA;EACA,oBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;EjDwDA,wDAAA;EACQ,gDAAA;CL8oLT;AsD7sLD;EASI,mBAAA;EACA,kCAAA;CtDusLH;AsDlsLD;EACE,cAAA;EACA,mBAAA;CtDosLD;AsDlsLD;EACE,aAAA;EACA,mBAAA;CtDosLD;AuD1tLD;EACE,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,eAAA;EACA,eAAA;EACA,6BAAA;EjCRA,aAAA;EAGA,0BAAA;CtBmuLD;AuD3tLC;;EAEE,eAAA;EACA,sBAAA;EACA,gBAAA;EjCfF,aAAA;EAGA,0BAAA;CtB2uLD;AuDvtLC;EACE,WAAA;EACA,gBAAA;EACA,wBAAA;EACA,UAAA;EACA,yBAAA;CvDytLH;AwD9uLD;EACE,iBAAA;CxDgvLD;AwD5uLD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,kCAAA;EAIA,WAAA;CxD2uLD;AwDxuLC;EnD+GA,sCAAA;EACI,kCAAA;EACC,iCAAA;EACG,8BAAA;EAkER,oDAAA;EAEK,0CAAA;EACG,oCAAA;CL2jLT;AwD9uLC;EnD2GA,mCAAA;EACI,+BAAA;EACC,8BAAA;EACG,2BAAA;CLsoLT;AwDlvLD;EACE,mBAAA;EACA,iBAAA;CxDovLD;AwDhvLD;EACE,mBAAA;EACA,YAAA;EACA,aAAA;CxDkvLD;AwD9uLD;EACE,mBAAA;EACA,0BAAA;EACA,0BAAA;EACA,qCAAA;EACA,mBAAA;EnDaA,iDAAA;EACQ,yCAAA;EmDZR,qCAAA;UAAA,6BAAA;EAEA,WAAA;CxDgvLD;AwD5uLD;EACE,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,0BAAA;CxD8uLD;AwD5uLC;ElCrEA,WAAA;EAGA,yBAAA;CtBkzLD;AwD/uLC;ElCtEA,aAAA;EAGA,0BAAA;CtBszLD;AwD9uLD;EACE,cAAA;EACA,iCAAA;EACA,0BAAA;CxDgvLD;AwD7uLD;EACE,iBAAA;CxD+uLD;AwD3uLD;EACE,UAAA;EACA,wBAAA;CxD6uLD;AwDxuLD;EACE,mBAAA;EACA,cAAA;CxD0uLD;AwDtuLD;EACE,cAAA;EACA,kBAAA;EACA,8BAAA;CxDwuLD;AwD3uLD;EAQI,iBAAA;EACA,iBAAA;CxDsuLH;AwD/uLD;EAaI,kBAAA;CxDquLH;AwDlvLD;EAiBI,eAAA;CxDouLH;AwD/tLD;EACE,mBAAA;EACA,aAAA;EACA,YAAA;EACA,aAAA;EACA,iBAAA;CxDiuLD;AwD/sLD;EAZE;IACE,aAAA;IACA,kBAAA;GxD8tLD;EwD5tLD;InDvEA,kDAAA;IACQ,0CAAA;GLsyLP;EwD3tLD;IAAY,aAAA;GxD8tLX;CACF;AwDztLD;EAFE;IAAY,aAAA;GxD+tLX;CACF;AyD92LD;EACE,mBAAA;EACA,cAAA;EACA,eAAA;ECRA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;EDHA,gBAAA;EnCVA,WAAA;EAGA,yBAAA;CtBq4LD;AyD13LC;EnCdA,aAAA;EAGA,0BAAA;CtBy4LD;AyD73LC;EAAW,iBAAA;EAAmB,eAAA;CzDi4L/B;AyDh4LC;EAAW,iBAAA;EAAmB,eAAA;CzDo4L/B;AyDn4LC;EAAW,gBAAA;EAAmB,eAAA;CzDu4L/B;AyDt4LC;EAAW,kBAAA;EAAmB,eAAA;CzD04L/B;AyDt4LD;EACE,iBAAA;EACA,iBAAA;EACA,eAAA;EACA,mBAAA;EACA,0BAAA;EACA,mBAAA;CzDw4LD;AyDp4LD;EACE,mBAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;CzDs4LD;AyDl4LC;EACE,UAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,0BAAA;CzDo4LH;AyDl4LC;EACE,UAAA;EACA,WAAA;EACA,oBAAA;EACA,wBAAA;EACA,0BAAA;CzDo4LH;AyDl4LC;EACE,UAAA;EACA,UAAA;EACA,oBAAA;EACA,wBAAA;EACA,0BAAA;CzDo4LH;AyDl4LC;EACE,SAAA;EACA,QAAA;EACA,iBAAA;EACA,4BAAA;EACA,4BAAA;CzDo4LH;AyDl4LC;EACE,SAAA;EACA,SAAA;EACA,iBAAA;EACA,4BAAA;EACA,2BAAA;CzDo4LH;AyDl4LC;EACE,OAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,6BAAA;CzDo4LH;AyDl4LC;EACE,OAAA;EACA,WAAA;EACA,iBAAA;EACA,wBAAA;EACA,6BAAA;CzDo4LH;AyDl4LC;EACE,OAAA;EACA,UAAA;EACA,iBAAA;EACA,wBAAA;EACA,6BAAA;CzDo4LH;A2Dj+LD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,iBAAA;EACA,aAAA;EDXA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;ECAA,gBAAA;EAEA,0BAAA;EACA,qCAAA;UAAA,6BAAA;EACA,0BAAA;EACA,qCAAA;EACA,mBAAA;EtD8CA,kDAAA;EACQ,0CAAA;CLi8LT;A2D5+LC;EAAY,kBAAA;C3D++Lb;A2D9+LC;EAAY,kBAAA;C3Di/Lb;A2Dh/LC;EAAY,iBAAA;C3Dm/Lb;A2Dl/LC;EAAY,mBAAA;C3Dq/Lb;A2Dl/LD;EACE,UAAA;EACA,kBAAA;EACA,gBAAA;EACA,0BAAA;EACA,iCAAA;EACA,2BAAA;C3Do/LD;A2Dj/LD;EACE,kBAAA;C3Dm/LD;A2D3+LC;;EAEE,mBAAA;EACA,eAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;C3D6+LH;A2D1+LD;EACE,mBAAA;C3D4+LD;A2D1+LD;EACE,mBAAA;EACA,YAAA;C3D4+LD;A2Dx+LC;EACE,UAAA;EACA,mBAAA;EACA,uBAAA;EACA,0BAAA;EACA,sCAAA;EACA,cAAA;C3D0+LH;A2Dz+LG;EACE,aAAA;EACA,YAAA;EACA,mBAAA;EACA,uBAAA;EACA,0BAAA;C3D2+LL;A2Dx+LC;EACE,SAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,4BAAA;EACA,wCAAA;C3D0+LH;A2Dz+LG;EACE,aAAA;EACA,UAAA;EACA,cAAA;EACA,qBAAA;EACA,4BAAA;C3D2+LL;A2Dx+LC;EACE,UAAA;EACA,mBAAA;EACA,oBAAA;EACA,6BAAA;EACA,yCAAA;EACA,WAAA;C3D0+LH;A2Dz+LG;EACE,aAAA;EACA,SAAA;EACA,mBAAA;EACA,oBAAA;EACA,6BAAA;C3D2+LL;A2Dv+LC;EACE,SAAA;EACA,aAAA;EACA,kBAAA;EACA,sBAAA;EACA,2BAAA;EACA,uCAAA;C3Dy+LH;A2Dx+LG;EACE,aAAA;EACA,WAAA;EACA,sBAAA;EACA,2BAAA;EACA,cAAA;C3D0+LL;A4DnmMD;EACE,mBAAA;C5DqmMD;A4DlmMD;EACE,mBAAA;EACA,iBAAA;EACA,YAAA;C5DomMD;A4DvmMD;EAMI,cAAA;EACA,mBAAA;EvD6KF,0CAAA;EACK,qCAAA;EACG,kCAAA;CLw7LT;A4D9mMD;;EAcM,eAAA;C5DomML;A4D1kMC;EAAA;IvDiKA,uDAAA;IAEK,6CAAA;IACG,uCAAA;IA7JR,oCAAA;IAEQ,4BAAA;IA+GR,4BAAA;IAEQ,oBAAA;GL69LP;E4DxmMG;;IvDmHJ,2CAAA;IACQ,mCAAA;IuDjHF,QAAA;G5D2mML;E4DzmMG;;IvD8GJ,4CAAA;IACQ,oCAAA;IuD5GF,QAAA;G5D4mML;E4D1mMG;;;IvDyGJ,wCAAA;IACQ,gCAAA;IuDtGF,QAAA;G5D6mML;CACF;A4DnpMD;;;EA6CI,eAAA;C5D2mMH;A4DxpMD;EAiDI,QAAA;C5D0mMH;A4D3pMD;;EAsDI,mBAAA;EACA,OAAA;EACA,YAAA;C5DymMH;A4DjqMD;EA4DI,WAAA;C5DwmMH;A4DpqMD;EA+DI,YAAA;C5DwmMH;A4DvqMD;;EAmEI,QAAA;C5DwmMH;A4D3qMD;EAuEI,YAAA;C5DumMH;A4D9qMD;EA0EI,WAAA;C5DumMH;A4D/lMD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EtC9FA,aAAA;EAGA,0BAAA;EsC6FA,gBAAA;EACA,eAAA;EACA,mBAAA;EACA,0CAAA;C5DkmMD;A4D7lMC;EdlGE,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9CksMH;A4DjmMC;EACE,WAAA;EACA,SAAA;EdvGA,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9C2sMH;A4DnmMC;;EAEE,WAAA;EACA,eAAA;EACA,sBAAA;EtCtHF,aAAA;EAGA,0BAAA;CtB0tMD;A4DpoMD;;;;EAsCI,mBAAA;EACA,SAAA;EACA,kBAAA;EACA,WAAA;EACA,sBAAA;C5DomMH;A4D9oMD;;EA8CI,UAAA;EACA,mBAAA;C5DomMH;A4DnpMD;;EAmDI,WAAA;EACA,oBAAA;C5DomMH;A4DxpMD;;EAwDI,YAAA;EACA,aAAA;EACA,eAAA;EACA,mBAAA;C5DomMH;A4D/lMG;EACE,iBAAA;C5DimML;A4D7lMG;EACE,iBAAA;C5D+lML;A4DrlMD;EACE,mBAAA;EACA,aAAA;EACA,UAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;C5DulMD;A4DhmMD;EAYI,sBAAA;EACA,YAAA;EACA,aAAA;EACA,YAAA;EACA,oBAAA;EACA,0BAAA;EACA,oBAAA;EACA,gBAAA;EAWA,0BAAA;EACA,mCAAA;C5D6kMH;A4D5mMD;EAkCI,UAAA;EACA,YAAA;EACA,aAAA;EACA,0BAAA;C5D6kMH;A4DtkMD;EACE,mBAAA;EACA,UAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,eAAA;EACA,mBAAA;EACA,0CAAA;C5DwkMD;A4DvkMC;EACE,kBAAA;C5DykMH;A4DhiMD;EAhCE;;;;IAKI,YAAA;IACA,aAAA;IACA,kBAAA;IACA,gBAAA;G5DkkMH;E4D1kMD;;IAYI,mBAAA;G5DkkMH;E4D9kMD;;IAgBI,oBAAA;G5DkkMH;E4D7jMD;IACE,UAAA;IACA,WAAA;IACA,qBAAA;G5D+jMD;E4D3jMD;IACE,aAAA;G5D6jMD;CACF;A6D3zMC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE,aAAA;EACA,eAAA;C7Dy1MH;A6Dv1MC;;;;;;;;;;;;;;;EACE,YAAA;C7Du2MH;AiC/2MD;E6BRE,eAAA;EACA,kBAAA;EACA,mBAAA;C9D03MD;AiCj3MD;EACE,wBAAA;CjCm3MD;AiCj3MD;EACE,uBAAA;CjCm3MD;AiC32MD;EACE,yBAAA;CjC62MD;AiC32MD;EACE,0BAAA;CjC62MD;AiC32MD;EACE,mBAAA;CjC62MD;AiC32MD;E8BzBE,YAAA;EACA,mBAAA;EACA,kBAAA;EACA,8BAAA;EACA,UAAA;C/Du4MD;AiCz2MD;EACE,yBAAA;CjC22MD;AiCp2MD;EACE,gBAAA;CjCs2MD;AgEv4MD;EACE,oBAAA;ChEy4MD;AgEn4MD;;;;ECdE,yBAAA;CjEu5MD;AgEl4MD;;;;;;;;;;;;EAYE,yBAAA;ChEo4MD;AgE73MD;EAAA;IChDE,0BAAA;GjEi7MC;EiEh7MD;IAAU,0BAAA;GjEm7MT;EiEl7MD;IAAU,8BAAA;GjEq7MT;EiEp7MD;;IACU,+BAAA;GjEu7MT;CACF;AgEv4MD;EAAA;IAFI,0BAAA;GhE64MD;CACF;AgEv4MD;EAAA;IAFI,2BAAA;GhE64MD;CACF;AgEv4MD;EAAA;IAFI,iCAAA;GhE64MD;CACF;AgEt4MD;EAAA;ICrEE,0BAAA;GjE+8MC;EiE98MD;IAAU,0BAAA;GjEi9MT;EiEh9MD;IAAU,8BAAA;GjEm9MT;EiEl9MD;;IACU,+BAAA;GjEq9MT;CACF;AgEh5MD;EAAA;IAFI,0BAAA;GhEs5MD;CACF;AgEh5MD;EAAA;IAFI,2BAAA;GhEs5MD;CACF;AgEh5MD;EAAA;IAFI,iCAAA;GhEs5MD;CACF;AgE/4MD;EAAA;IC1FE,0BAAA;GjE6+MC;EiE5+MD;IAAU,0BAAA;GjE++MT;EiE9+MD;IAAU,8BAAA;GjEi/MT;EiEh/MD;;IACU,+BAAA;GjEm/MT;CACF;AgEz5MD;EAAA;IAFI,0BAAA;GhE+5MD;CACF;AgEz5MD;EAAA;IAFI,2BAAA;GhE+5MD;CACF;AgEz5MD;EAAA;IAFI,iCAAA;GhE+5MD;CACF;AgEx5MD;EAAA;IC/GE,0BAAA;GjE2gNC;EiE1gND;IAAU,0BAAA;GjE6gNT;EiE5gND;IAAU,8BAAA;GjE+gNT;EiE9gND;;IACU,+BAAA;GjEihNT;CACF;AgEl6MD;EAAA;IAFI,0BAAA;GhEw6MD;CACF;AgEl6MD;EAAA;IAFI,2BAAA;GhEw6MD;CACF;AgEl6MD;EAAA;IAFI,iCAAA;GhEw6MD;CACF;AgEj6MD;EAAA;IC5HE,yBAAA;GjEiiNC;CACF;AgEj6MD;EAAA;ICjIE,yBAAA;GjEsiNC;CACF;AgEj6MD;EAAA;ICtIE,yBAAA;GjE2iNC;CACF;AgEj6MD;EAAA;IC3IE,yBAAA;GjEgjNC;CACF;AgE95MD;ECnJE,yBAAA;CjEojND;AgE35MD;EAAA;ICjKE,0BAAA;GjEgkNC;EiE/jND;IAAU,0BAAA;GjEkkNT;EiEjkND;IAAU,8BAAA;GjEokNT;EiEnkND;;IACU,+BAAA;GjEskNT;CACF;AgEz6MD;EACE,yBAAA;ChE26MD;AgEt6MD;EAAA;IAFI,0BAAA;GhE46MD;CACF;AgE16MD;EACE,yBAAA;ChE46MD;AgEv6MD;EAAA;IAFI,2BAAA;GhE66MD;CACF;AgE36MD;EACE,yBAAA;ChE66MD;AgEx6MD;EAAA;IAFI,iCAAA;GhE86MD;CACF;AgEv6MD;EAAA;ICpLE,yBAAA;GjE+lNC;CACF","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\2a\";\n}\n.glyphicon-plus:before {\n content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #ffffff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #ffffff;\n background-color: #333333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #dddddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #dddddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #dddddd;\n}\n.table .table {\n background-color: #ffffff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #dddddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #ffffff;\n background-image: none;\n border: 1px solid #cccccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 14.333333px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333333;\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default .badge {\n color: #ffffff;\n background-color: #333333;\n}\n.btn-primary {\n color: #ffffff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #ffffff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #ffffff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #ffffff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #ffffff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.btn-success {\n color: #ffffff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #ffffff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #ffffff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #ffffff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #ffffff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #ffffff;\n}\n.btn-info {\n color: #ffffff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #ffffff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #ffffff;\n}\n.btn-warning {\n color: #ffffff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #ffffff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #ffffff;\n}\n.btn-danger {\n color: #ffffff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #ffffff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #ffffff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #ffffff;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #ffffff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-bottom-left-radius: 4px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #dddddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #dddddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #ffffff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #dddddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #dddddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777777;\n}\n.navbar-default .navbar-link:hover {\n color: #333333;\n}\n.navbar-default .btn-link {\n color: #777777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #cccccc;\n}\n.navbar-inverse {\n background-color: #222222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #ffffff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #ffffff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #ffffff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #ffffff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #cccccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 3;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #dddddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #ffffff;\n border-color: #dddddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #ffffff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #ffffff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #ffffff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #ffffff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #ffffff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #dddddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #dddddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #dddddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #dddddd;\n}\n.panel-default {\n border-color: #dddddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #dddddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #dddddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #dddddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000000;\n text-shadow: 0 1px 0 #ffffff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #ffffff;\n border: 1px solid #999999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n min-height: 16.42857143px;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #ffffff;\n text-align: center;\n background-color: #000000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #ffffff;\n background-clip: padding-box;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #ffffff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #ffffff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #ffffff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #ffffff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #ffffff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #ffffff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #ffffff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -15px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -15px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\2a\"; } }\n.glyphicon-plus { &:before { content: \"\\2b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @grid-float-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n }\n\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848\n//\n// Note that as of 8.3, iOS doesn't support `datetime` or `week`.\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"],\n input[type=\"time\"],\n input[type=\"datetime-local\"],\n input[type=\"month\"] {\n &.form-control {\n line-height: @input-height-base;\n }\n\n &.input-sm,\n .input-group-sm & {\n line-height: @input-height-small;\n }\n\n &.input-lg,\n .input-group-lg & {\n line-height: @input-height-large;\n }\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: @form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n &[disabled],\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n &.disabled,\n fieldset[disabled] & {\n label {\n cursor: @cursor-disabled;\n }\n }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n // Size it appropriately next to real form controls\n padding-top: (@padding-base-vertical + 1);\n padding-bottom: (@padding-base-vertical + 1);\n // Remove default margin from `p`\n margin-bottom: 0;\n min-height: (@line-height-computed + @font-size-base);\n\n &.input-lg,\n &.input-sm {\n padding-left: 0;\n padding-right: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n.input-sm {\n .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n}\n.form-group-sm {\n .form-control {\n height: @input-height-small;\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n border-radius: @input-border-radius-small;\n }\n select.form-control {\n height: @input-height-small;\n line-height: @input-height-small;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: @input-height-small;\n min-height: (@line-height-computed + @font-size-small);\n padding: (@padding-small-vertical + 1) @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n }\n}\n\n.input-lg {\n .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n}\n.form-group-lg {\n .form-control {\n height: @input-height-large;\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n border-radius: @input-border-radius-large;\n }\n select.form-control {\n height: @input-height-large;\n line-height: @input-height-large;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: @input-height-large;\n min-height: (@line-height-computed + @font-size-large);\n padding: (@padding-large-vertical + 1) @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n }\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n // Enable absolute positioning\n position: relative;\n\n // Ensure icons don't overlap text\n .form-control {\n padding-right: (@input-height-base * 1.25);\n }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2; // Ensure icon is above input groups\n display: block;\n width: @input-height-base;\n height: @input-height-base;\n line-height: @input-height-base;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: @input-height-large;\n height: @input-height-large;\n line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: @input-height-small;\n height: @input-height-small;\n line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n & ~ .form-control-feedback {\n top: (@line-height-computed + 5); // Height of the `label` and its margin\n }\n &.sr-only ~ .form-control-feedback {\n top: 0;\n }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n display: block; // account for any element using help-block\n margin-top: 5px;\n margin-bottom: 10px;\n color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n // Kick in the inline\n @media (min-width: @screen-sm-min) {\n // Inline-block all the things for \"inline\"\n .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // In navbar-form, allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-static {\n display: inline-block;\n }\n\n .input-group {\n display: inline-table;\n vertical-align: middle;\n\n .input-group-addon,\n .input-group-btn,\n .form-control {\n width: auto;\n }\n }\n\n // Input groups need that 100% width though\n .input-group > .form-control {\n width: 100%;\n }\n\n .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .radio,\n .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n\n label {\n padding-left: 0;\n }\n }\n .radio input[type=\"radio\"],\n .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n\n // Re-override the feedback icon.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n // Consistent vertical alignment of radios and checkboxes\n //\n // Labels also get some reset styles, but that is scoped to a media query below.\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n // Account for padding we're adding to ensure the alignment and of help text\n // and other content below items\n .radio,\n .checkbox {\n min-height: (@line-height-computed + (@padding-base-vertical + 1));\n }\n\n // Make form groups behave like rows\n .form-group {\n .make-row();\n }\n\n // Reset spacing and right align labels, but scope to media queries so that\n // labels on narrow viewports stack the same as a default form example.\n @media (min-width: @screen-sm-min) {\n .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n right: floor((@grid-gutter-width / 2));\n }\n\n // Form group sizes\n //\n // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n // inputs and labels within a `.form-group`.\n .form-group-lg {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: ((@padding-large-vertical * @line-height-large) + 1);\n font-size: @font-size-large;\n }\n }\n }\n .form-group-sm {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-small-vertical + 1);\n font-size: @font-size-small;\n }\n }\n }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline,\n &.radio label,\n &.checkbox label,\n &.radio-inline label,\n &.checkbox-inline label {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n .opacity(.65);\n .box-shadow(none);\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `<a>` elements\n }\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 25%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n border-color: darken(@border, 25%);\n }\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base dashed;\n border-top: @caret-width-base solid ~\"\\9\"; // IE8\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base dashed;\n border-bottom: @caret-width-base solid ~\"\\9\"; // IE8\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n border-top-right-radius: @btn-border-radius-base;\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n border-bottom-left-radius: @btn-border-radius-base;\n .border-top-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @border-radius-base;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 3;\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding-top: @jumbotron-padding;\n padding-bottom: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: @jumbotron-heading-font-size;\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n\n // Fix collapse in webkit from max-width: 100% and display: table-cell.\n &.img-thumbnail {\n max-width: none;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a&,\n button& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n > .panel-heading + .panel-collapse > .list-group {\n .list-group-item:first-child {\n .border-top-radius(0);\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: @panel-body-padding;\n padding-right: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n border-bottom-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-small;\n\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n",".reset-text() {\n font-family: @font-family-base;\n // We deliberately do NOT reset font-size.\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: @line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-base;\n\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n .transition-transform(~'0.6s ease-in-out');\n .backface-visibility(~'hidden');\n .perspective(1000px);\n\n &.next,\n &.active.right {\n .translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n .translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n .translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: -15px;\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: -15px;\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table !important; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]} \ No newline at end of file diff --git a/theme/bootstrap/bootstrap/css/bootstrap.min.css b/theme/bootstrap/bootstrap/css/bootstrap.min.css new file mode 100644 index 0000000..d65c66b --- /dev/null +++ b/theme/bootstrap/bootstrap/css/bootstrap.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:3;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/theme/bootstrap/bootstrap/fonts/glyphicons-halflings-regular.eot b/theme/bootstrap/bootstrap/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000..b93a495 Binary files /dev/null and b/theme/bootstrap/bootstrap/fonts/glyphicons-halflings-regular.eot differ diff --git a/theme/bootstrap/bootstrap/fonts/glyphicons-halflings-regular.svg b/theme/bootstrap/bootstrap/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000..94fb549 --- /dev/null +++ b/theme/bootstrap/bootstrap/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,288 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata></metadata> +<defs> +<font id="glyphicons_halflingsregular" horiz-adv-x="1200" > +<font-face units-per-em="1200" ascent="960" descent="-240" /> +<missing-glyph horiz-adv-x="500" /> +<glyph horiz-adv-x="0" /> +<glyph horiz-adv-x="400" /> +<glyph unicode=" " /> +<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" /> +<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xa0;" /> +<glyph unicode="&#xa5;" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" /> +<glyph unicode="&#x2000;" horiz-adv-x="650" /> +<glyph unicode="&#x2001;" horiz-adv-x="1300" /> +<glyph unicode="&#x2002;" horiz-adv-x="650" /> +<glyph unicode="&#x2003;" horiz-adv-x="1300" /> +<glyph unicode="&#x2004;" horiz-adv-x="433" /> +<glyph unicode="&#x2005;" horiz-adv-x="325" /> +<glyph unicode="&#x2006;" horiz-adv-x="216" /> +<glyph unicode="&#x2007;" horiz-adv-x="216" /> +<glyph unicode="&#x2008;" horiz-adv-x="162" /> +<glyph unicode="&#x2009;" horiz-adv-x="260" /> +<glyph unicode="&#x200a;" horiz-adv-x="72" /> +<glyph unicode="&#x202f;" horiz-adv-x="260" /> +<glyph unicode="&#x205f;" horiz-adv-x="325" /> +<glyph unicode="&#x20ac;" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" /> +<glyph unicode="&#x20bd;" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" /> +<glyph unicode="&#x2212;" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#x231b;" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" /> +<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" /> +<glyph unicode="&#x2601;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" /> +<glyph unicode="&#x26fa;" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " /> +<glyph unicode="&#x2709;" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" /> +<glyph unicode="&#x270f;" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" /> +<glyph unicode="&#xe001;" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" /> +<glyph unicode="&#xe002;" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" /> +<glyph unicode="&#xe003;" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" /> +<glyph unicode="&#xe005;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" /> +<glyph unicode="&#xe006;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" /> +<glyph unicode="&#xe007;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" /> +<glyph unicode="&#xe008;" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" /> +<glyph unicode="&#xe009;" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" /> +<glyph unicode="&#xe010;" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe011;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" /> +<glyph unicode="&#xe012;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe013;" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" /> +<glyph unicode="&#xe014;" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" /> +<glyph unicode="&#xe015;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe016;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe017;" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" /> +<glyph unicode="&#xe018;" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe019;" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" /> +<glyph unicode="&#xe020;" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" /> +<glyph unicode="&#xe021;" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" /> +<glyph unicode="&#xe022;" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" /> +<glyph unicode="&#xe023;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe024;" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" /> +<glyph unicode="&#xe025;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe026;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " /> +<glyph unicode="&#xe027;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" /> +<glyph unicode="&#xe028;" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" /> +<glyph unicode="&#xe029;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" /> +<glyph unicode="&#xe030;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" /> +<glyph unicode="&#xe031;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" /> +<glyph unicode="&#xe032;" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe033;" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" /> +<glyph unicode="&#xe034;" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" /> +<glyph unicode="&#xe035;" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" /> +<glyph unicode="&#xe036;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" /> +<glyph unicode="&#xe037;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" /> +<glyph unicode="&#xe038;" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" /> +<glyph unicode="&#xe039;" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" /> +<glyph unicode="&#xe040;" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" /> +<glyph unicode="&#xe041;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" /> +<glyph unicode="&#xe042;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" /> +<glyph unicode="&#xe043;" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" /> +<glyph unicode="&#xe044;" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe045;" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" /> +<glyph unicode="&#xe046;" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" /> +<glyph unicode="&#xe047;" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" /> +<glyph unicode="&#xe048;" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" /> +<glyph unicode="&#xe049;" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" /> +<glyph unicode="&#xe050;" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" /> +<glyph unicode="&#xe051;" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" /> +<glyph unicode="&#xe052;" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe053;" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe054;" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" /> +<glyph unicode="&#xe055;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe056;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe057;" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe058;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe059;" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" /> +<glyph unicode="&#xe060;" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" /> +<glyph unicode="&#xe062;" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" /> +<glyph unicode="&#xe063;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" /> +<glyph unicode="&#xe064;" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" /> +<glyph unicode="&#xe065;" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" /> +<glyph unicode="&#xe066;" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" /> +<glyph unicode="&#xe067;" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" /> +<glyph unicode="&#xe068;" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" /> +<glyph unicode="&#xe069;" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe070;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe071;" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" /> +<glyph unicode="&#xe072;" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" /> +<glyph unicode="&#xe073;" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe074;" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" /> +<glyph unicode="&#xe075;" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" /> +<glyph unicode="&#xe076;" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe077;" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe078;" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe079;" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" /> +<glyph unicode="&#xe080;" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" /> +<glyph unicode="&#xe081;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" /> +<glyph unicode="&#xe082;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" /> +<glyph unicode="&#xe083;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" /> +<glyph unicode="&#xe084;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" /> +<glyph unicode="&#xe085;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" /> +<glyph unicode="&#xe086;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" /> +<glyph unicode="&#xe087;" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" /> +<glyph unicode="&#xe088;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" /> +<glyph unicode="&#xe089;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" /> +<glyph unicode="&#xe090;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" /> +<glyph unicode="&#xe091;" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" /> +<glyph unicode="&#xe092;" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" /> +<glyph unicode="&#xe093;" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" /> +<glyph unicode="&#xe094;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe095;" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" /> +<glyph unicode="&#xe096;" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" /> +<glyph unicode="&#xe097;" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" /> +<glyph unicode="&#xe101;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" /> +<glyph unicode="&#xe102;" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" /> +<glyph unicode="&#xe103;" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" /> +<glyph unicode="&#xe104;" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" /> +<glyph unicode="&#xe105;" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" /> +<glyph unicode="&#xe106;" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" /> +<glyph unicode="&#xe107;" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" /> +<glyph unicode="&#xe108;" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" /> +<glyph unicode="&#xe109;" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" /> +<glyph unicode="&#xe110;" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" /> +<glyph unicode="&#xe111;" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" /> +<glyph unicode="&#xe112;" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" /> +<glyph unicode="&#xe113;" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" /> +<glyph unicode="&#xe114;" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" /> +<glyph unicode="&#xe115;" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> +<glyph unicode="&#xe116;" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" /> +<glyph unicode="&#xe117;" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" /> +<glyph unicode="&#xe118;" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" /> +<glyph unicode="&#xe119;" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> +<glyph unicode="&#xe120;" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" /> +<glyph unicode="&#xe121;" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" /> +<glyph unicode="&#xe122;" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" /> +<glyph unicode="&#xe123;" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" /> +<glyph unicode="&#xe124;" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" /> +<glyph unicode="&#xe125;" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe126;" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" /> +<glyph unicode="&#xe127;" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe128;" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe129;" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe130;" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" /> +<glyph unicode="&#xe131;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" /> +<glyph unicode="&#xe132;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" /> +<glyph unicode="&#xe133;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" /> +<glyph unicode="&#xe134;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" /> +<glyph unicode="&#xe135;" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" /> +<glyph unicode="&#xe136;" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" /> +<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " /> +<glyph unicode="&#xe138;" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" /> +<glyph unicode="&#xe139;" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" /> +<glyph unicode="&#xe140;" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" /> +<glyph unicode="&#xe141;" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" /> +<glyph unicode="&#xe142;" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" /> +<glyph unicode="&#xe143;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" /> +<glyph unicode="&#xe144;" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" /> +<glyph unicode="&#xe145;" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" /> +<glyph unicode="&#xe146;" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" /> +<glyph unicode="&#xe148;" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" /> +<glyph unicode="&#xe149;" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" /> +<glyph unicode="&#xe150;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> +<glyph unicode="&#xe151;" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " /> +<glyph unicode="&#xe152;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " /> +<glyph unicode="&#xe153;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" /> +<glyph unicode="&#xe154;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" /> +<glyph unicode="&#xe155;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" /> +<glyph unicode="&#xe156;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" /> +<glyph unicode="&#xe157;" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" /> +<glyph unicode="&#xe158;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" /> +<glyph unicode="&#xe159;" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" /> +<glyph unicode="&#xe160;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" /> +<glyph unicode="&#xe161;" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" /> +<glyph unicode="&#xe162;" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" /> +<glyph unicode="&#xe163;" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" /> +<glyph unicode="&#xe164;" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" /> +<glyph unicode="&#xe165;" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" /> +<glyph unicode="&#xe166;" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" /> +<glyph unicode="&#xe167;" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" /> +<glyph unicode="&#xe168;" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" /> +<glyph unicode="&#xe169;" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" /> +<glyph unicode="&#xe170;" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" /> +<glyph unicode="&#xe171;" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" /> +<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" /> +<glyph unicode="&#xe173;" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" /> +<glyph unicode="&#xe174;" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" /> +<glyph unicode="&#xe175;" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe176;" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" /> +<glyph unicode="&#xe177;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" /> +<glyph unicode="&#xe178;" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" /> +<glyph unicode="&#xe179;" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" /> +<glyph unicode="&#xe180;" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" /> +<glyph unicode="&#xe181;" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" /> +<glyph unicode="&#xe182;" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" /> +<glyph unicode="&#xe183;" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" /> +<glyph unicode="&#xe184;" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe185;" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " /> +<glyph unicode="&#xe186;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" /> +<glyph unicode="&#xe187;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" /> +<glyph unicode="&#xe188;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" /> +<glyph unicode="&#xe189;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" /> +<glyph unicode="&#xe190;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" /> +<glyph unicode="&#xe191;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" /> +<glyph unicode="&#xe192;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" /> +<glyph unicode="&#xe193;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" /> +<glyph unicode="&#xe194;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" /> +<glyph unicode="&#xe195;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" /> +<glyph unicode="&#xe197;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe198;" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" /> +<glyph unicode="&#xe199;" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" /> +<glyph unicode="&#xe200;" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" /> +<glyph unicode="&#xe201;" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" /> +<glyph unicode="&#xe202;" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" /> +<glyph unicode="&#xe203;" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" /> +<glyph unicode="&#xe204;" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" /> +<glyph unicode="&#xe205;" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" /> +<glyph unicode="&#xe206;" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" /> +<glyph unicode="&#xe209;" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" /> +<glyph unicode="&#xe210;" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe211;" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe212;" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe213;" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe214;" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe215;" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe216;" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" /> +<glyph unicode="&#xe218;" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" /> +<glyph unicode="&#xe219;" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" /> +<glyph unicode="&#xe221;" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe223;" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" /> +<glyph unicode="&#xe224;" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " /> +<glyph unicode="&#xe225;" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" /> +<glyph unicode="&#xe226;" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" /> +<glyph unicode="&#xe227;" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" /> +<glyph unicode="&#xe230;" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" /> +<glyph unicode="&#xe231;" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" /> +<glyph unicode="&#xe232;" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" /> +<glyph unicode="&#xe233;" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" /> +<glyph unicode="&#xe234;" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" /> +<glyph unicode="&#xe235;" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" /> +<glyph unicode="&#xe236;" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe237;" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" /> +<glyph unicode="&#xe238;" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe239;" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" /> +<glyph unicode="&#xe240;" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" /> +<glyph unicode="&#xe241;" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" /> +<glyph unicode="&#xe242;" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" /> +<glyph unicode="&#xe243;" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" /> +<glyph unicode="&#xe244;" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" /> +<glyph unicode="&#xe245;" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" /> +<glyph unicode="&#xe246;" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" /> +<glyph unicode="&#xe247;" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe248;" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" /> +<glyph unicode="&#xe249;" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe250;" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" /> +<glyph unicode="&#xe251;" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" /> +<glyph unicode="&#xe252;" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" /> +<glyph unicode="&#xe253;" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" /> +<glyph unicode="&#xe254;" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" /> +<glyph unicode="&#xe255;" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" /> +<glyph unicode="&#xe256;" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" /> +<glyph unicode="&#xe257;" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" /> +<glyph unicode="&#xe258;" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" /> +<glyph unicode="&#xe259;" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" /> +<glyph unicode="&#xe260;" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" /> +<glyph unicode="&#xf8ff;" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" /> +<glyph unicode="&#x1f511;" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" /> +<glyph unicode="&#x1f6aa;" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/theme/bootstrap/bootstrap/fonts/glyphicons-halflings-regular.ttf b/theme/bootstrap/bootstrap/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000..1413fc6 Binary files /dev/null and b/theme/bootstrap/bootstrap/fonts/glyphicons-halflings-regular.ttf differ diff --git a/theme/bootstrap/bootstrap/fonts/glyphicons-halflings-regular.woff b/theme/bootstrap/bootstrap/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000..9e61285 Binary files /dev/null and b/theme/bootstrap/bootstrap/fonts/glyphicons-halflings-regular.woff differ diff --git a/theme/bootstrap/bootstrap/fonts/glyphicons-halflings-regular.woff2 b/theme/bootstrap/bootstrap/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000..64539b5 Binary files /dev/null and b/theme/bootstrap/bootstrap/fonts/glyphicons-halflings-regular.woff2 differ diff --git a/theme/bootstrap/bootstrap/js/bootstrap.js b/theme/bootstrap/bootstrap/js/bootstrap.js new file mode 100644 index 0000000..1c88b71 --- /dev/null +++ b/theme/bootstrap/bootstrap/js/bootstrap.js @@ -0,0 +1,2317 @@ +/*! + * Bootstrap v3.3.4 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +if (typeof jQuery === 'undefined') { + throw new Error('Bootstrap\'s JavaScript requires jQuery') +} + ++function ($) { + 'use strict'; + var version = $.fn.jquery.split(' ')[0].split('.') + if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) { + throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher') + } +}(jQuery); + +/* ======================================================================== + * Bootstrap: transition.js v3.3.4 + * http://getbootstrap.com/javascript/#transitions + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + WebkitTransition : 'webkitTransitionEnd', + MozTransition : 'transitionend', + OTransition : 'oTransitionEnd otransitionend', + transition : 'transitionend' + } + + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return { end: transEndEventNames[name] } + } + } + + return false // explicit for ie8 ( ._.) + } + + // http://blog.alexmaccaw.com/css-transitions + $.fn.emulateTransitionEnd = function (duration) { + var called = false + var $el = this + $(this).one('bsTransitionEnd', function () { called = true }) + var callback = function () { if (!called) $($el).trigger($.support.transition.end) } + setTimeout(callback, duration) + return this + } + + $(function () { + $.support.transition = transitionEnd() + + if (!$.support.transition) return + + $.event.special.bsTransitionEnd = { + bindType: $.support.transition.end, + delegateType: $.support.transition.end, + handle: function (e) { + if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) + } + } + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: alert.js v3.3.4 + * http://getbootstrap.com/javascript/#alerts + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.VERSION = '3.3.4' + + Alert.TRANSITION_DURATION = 150 + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.closest('.alert') + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + // detach from parent, fire event then clean up data + $parent.detach().trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one('bsTransitionEnd', removeElement) + .emulateTransitionEnd(Alert.TRANSITION_DURATION) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.alert + + $.fn.alert = Plugin + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: button.js v3.3.4 + * http://getbootstrap.com/javascript/#buttons + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + this.isLoading = false + } + + Button.VERSION = '3.3.4' + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state = state + 'Text' + + if (data.resetText == null) $el.data('resetText', $el[val]()) + + // push to event loop to allow forms to submit + setTimeout($.proxy(function () { + $el[val](data[state] == null ? this.options[state] : data[state]) + + if (state == 'loadingText') { + this.isLoading = true + $el.addClass(d).attr(d, d) + } else if (this.isLoading) { + this.isLoading = false + $el.removeClass(d).removeAttr(d) + } + }, this), 0) + } + + Button.prototype.toggle = function () { + var changed = true + var $parent = this.$element.closest('[data-toggle="buttons"]') + + if ($parent.length) { + var $input = this.$element.find('input') + if ($input.prop('type') == 'radio') { + if ($input.prop('checked') && this.$element.hasClass('active')) changed = false + else $parent.find('.active').removeClass('active') + } + if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') + } else { + this.$element.attr('aria-pressed', !this.$element.hasClass('active')) + } + + if (changed) this.$element.toggleClass('active') + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + var old = $.fn.button + + $.fn.button = Plugin + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document) + .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + Plugin.call($btn, 'toggle') + e.preventDefault() + }) + .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: carousel.js v3.3.4 + * http://getbootstrap.com/javascript/#carousel + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = null + this.sliding = null + this.interval = null + this.$active = null + this.$items = null + + this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) + + this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element + .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) + .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) + } + + Carousel.VERSION = '3.3.4' + + Carousel.TRANSITION_DURATION = 600 + + Carousel.DEFAULTS = { + interval: 5000, + pause: 'hover', + wrap: true, + keyboard: true + } + + Carousel.prototype.keydown = function (e) { + if (/input|textarea/i.test(e.target.tagName)) return + switch (e.which) { + case 37: this.prev(); break + case 39: this.next(); break + default: return + } + + e.preventDefault() + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getItemIndex = function (item) { + this.$items = item.parent().children('.item') + return this.$items.index(item || this.$active) + } + + Carousel.prototype.getItemForDirection = function (direction, active) { + var activeIndex = this.getItemIndex(active) + var willWrap = (direction == 'prev' && activeIndex === 0) + || (direction == 'next' && activeIndex == (this.$items.length - 1)) + if (willWrap && !this.options.wrap) return active + var delta = direction == 'prev' ? -1 : 1 + var itemIndex = (activeIndex + delta) % this.$items.length + return this.$items.eq(itemIndex) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || this.getItemForDirection(type, $active) + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var that = this + + if ($next.hasClass('active')) return (this.sliding = false) + + var relatedTarget = $next[0] + var slideEvent = $.Event('slide.bs.carousel', { + relatedTarget: relatedTarget, + direction: direction + }) + this.$element.trigger(slideEvent) + if (slideEvent.isDefaultPrevented()) return + + this.sliding = true + + isCycling && this.pause() + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) + $nextIndicator && $nextIndicator.addClass('active') + } + + var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" + if ($.support.transition && this.$element.hasClass('slide')) { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one('bsTransitionEnd', function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { + that.$element.trigger(slidEvent) + }, 0) + }) + .emulateTransitionEnd(Carousel.TRANSITION_DURATION) + } else { + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger(slidEvent) + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + var old = $.fn.carousel + + $.fn.carousel = Plugin + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + var clickHandler = function (e) { + var href + var $this = $(this) + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 + if (!$target.hasClass('carousel')) return + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + Plugin.call($target, options) + + if (slideIndex) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + } + + $(document) + .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) + .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + Plugin.call($carousel, $carousel.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: collapse.js v3.3.4 + * http://getbootstrap.com/javascript/#collapse + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + + '[data-toggle="collapse"][data-target="#' + element.id + '"]') + this.transitioning = null + + if (this.options.parent) { + this.$parent = this.getParent() + } else { + this.addAriaAndCollapsedClass(this.$element, this.$trigger) + } + + if (this.options.toggle) this.toggle() + } + + Collapse.VERSION = '3.3.4' + + Collapse.TRANSITION_DURATION = 350 + + Collapse.DEFAULTS = { + toggle: true + } + + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var activesData + var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') + + if (actives && actives.length) { + activesData = actives.data('bs.collapse') + if (activesData && activesData.transitioning) return + } + + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + if (actives && actives.length) { + Plugin.call(actives, 'hide') + activesData || actives.data('bs.collapse', null) + } + + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + .addClass('collapsing')[dimension](0) + .attr('aria-expanded', true) + + this.$trigger + .removeClass('collapsed') + .attr('aria-expanded', true) + + this.transitioning = 1 + + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('collapse in')[dimension]('') + this.transitioning = 0 + this.$element + .trigger('shown.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + var scrollSize = $.camelCase(['scroll', dimension].join('-')) + + this.$element + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) + } + + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var dimension = this.dimension() + + this.$element[dimension](this.$element[dimension]())[0].offsetHeight + + this.$element + .addClass('collapsing') + .removeClass('collapse in') + .attr('aria-expanded', false) + + this.$trigger + .addClass('collapsed') + .attr('aria-expanded', false) + + this.transitioning = 1 + + var complete = function () { + this.transitioning = 0 + this.$element + .removeClass('collapsing') + .addClass('collapse') + .trigger('hidden.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + this.$element + [dimension](0) + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION) + } + + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + Collapse.prototype.getParent = function () { + return $(this.options.parent) + .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') + .each($.proxy(function (i, element) { + var $element = $(element) + this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) + }, this)) + .end() + } + + Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { + var isOpen = $element.hasClass('in') + + $element.attr('aria-expanded', isOpen) + $trigger + .toggleClass('collapsed', !isOpen) + .attr('aria-expanded', isOpen) + } + + function getTargetFromTrigger($trigger) { + var href + var target = $trigger.attr('data-target') + || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 + + return $(target) + } + + + // COLLAPSE PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.collapse + + $.fn.collapse = Plugin + $.fn.collapse.Constructor = Collapse + + + // COLLAPSE NO CONFLICT + // ==================== + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + // COLLAPSE DATA-API + // ================= + + $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { + var $this = $(this) + + if (!$this.attr('data-target')) e.preventDefault() + + var $target = getTargetFromTrigger($this) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + + Plugin.call($target, option) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.3.4 + * http://getbootstrap.com/javascript/#dropdowns + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle="dropdown"]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.VERSION = '3.3.4' + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we use a backdrop because click events don't delegate + $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus) + } + + var relatedTarget = { relatedTarget: this } + $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this + .trigger('focus') + .attr('aria-expanded', 'true') + + $parent + .toggleClass('open') + .trigger('shown.bs.dropdown', relatedTarget) + } + + return false + } + + Dropdown.prototype.keydown = function (e) { + if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return + + var $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + if ((!isActive && e.which != 27) || (isActive && e.which == 27)) { + if (e.which == 27) $parent.find(toggle).trigger('focus') + return $this.trigger('click') + } + + var desc = ' li:not(.disabled):visible a' + var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc) + + if (!$items.length) return + + var index = $items.index(e.target) + + if (e.which == 38 && index > 0) index-- // up + if (e.which == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items.eq(index).trigger('focus') + } + + function clearMenus(e) { + if (e && e.which === 3) return + $(backdrop).remove() + $(toggle).each(function () { + var $this = $(this) + var $parent = getParent($this) + var relatedTarget = { relatedTarget: this } + + if (!$parent.hasClass('open')) return + + $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this.attr('aria-expanded', 'false') + $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget) + }) + } + + function getParent($this) { + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = selector && $(selector) + + return $parent && $parent.length ? $parent : $this.parent() + } + + + // DROPDOWN PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.dropdown') + + if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.dropdown + + $.fn.dropdown = Plugin + $.fn.dropdown.Constructor = Dropdown + + + // DROPDOWN NO CONFLICT + // ==================== + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + // APPLY TO STANDARD DROPDOWN ELEMENTS + // =================================== + + $(document) + .on('click.bs.dropdown.data-api', clearMenus) + .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) + .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '[role="menu"]', Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '[role="listbox"]', Dropdown.prototype.keydown) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: modal.js v3.3.4 + * http://getbootstrap.com/javascript/#modals + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // MODAL CLASS DEFINITION + // ====================== + + var Modal = function (element, options) { + this.options = options + this.$body = $(document.body) + this.$element = $(element) + this.$dialog = this.$element.find('.modal-dialog') + this.$backdrop = null + this.isShown = null + this.originalBodyPad = null + this.scrollbarWidth = 0 + this.ignoreBackdropClick = false + + if (this.options.remote) { + this.$element + .find('.modal-content') + .load(this.options.remote, $.proxy(function () { + this.$element.trigger('loaded.bs.modal') + }, this)) + } + } + + Modal.VERSION = '3.3.4' + + Modal.TRANSITION_DURATION = 300 + Modal.BACKDROP_TRANSITION_DURATION = 150 + + Modal.DEFAULTS = { + backdrop: true, + keyboard: true, + show: true + } + + Modal.prototype.toggle = function (_relatedTarget) { + return this.isShown ? this.hide() : this.show(_relatedTarget) + } + + Modal.prototype.show = function (_relatedTarget) { + var that = this + var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.checkScrollbar() + this.setScrollbar() + this.$body.addClass('modal-open') + + this.escape() + this.resize() + + this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) + + this.$dialog.on('mousedown.dismiss.bs.modal', function () { + that.$element.one('mouseup.dismiss.bs.modal', function (e) { + if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true + }) + }) + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(that.$body) // don't move modals dom position + } + + that.$element + .show() + .scrollTop(0) + + that.adjustDialog() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element + .addClass('in') + .attr('aria-hidden', false) + + that.enforceFocus() + + var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) + + transition ? + that.$dialog // wait for modal to slide in + .one('bsTransitionEnd', function () { + that.$element.trigger('focus').trigger(e) + }) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + that.$element.trigger('focus').trigger(e) + }) + } + + Modal.prototype.hide = function (e) { + if (e) e.preventDefault() + + e = $.Event('hide.bs.modal') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + this.resize() + + $(document).off('focusin.bs.modal') + + this.$element + .removeClass('in') + .attr('aria-hidden', true) + .off('click.dismiss.bs.modal') + .off('mouseup.dismiss.bs.modal') + + this.$dialog.off('mousedown.dismiss.bs.modal') + + $.support.transition && this.$element.hasClass('fade') ? + this.$element + .one('bsTransitionEnd', $.proxy(this.hideModal, this)) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + this.hideModal() + } + + Modal.prototype.enforceFocus = function () { + $(document) + .off('focusin.bs.modal') // guard against infinite focus loop + .on('focusin.bs.modal', $.proxy(function (e) { + if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { + this.$element.trigger('focus') + } + }, this)) + } + + Modal.prototype.escape = function () { + if (this.isShown && this.options.keyboard) { + this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { + e.which == 27 && this.hide() + }, this)) + } else if (!this.isShown) { + this.$element.off('keydown.dismiss.bs.modal') + } + } + + Modal.prototype.resize = function () { + if (this.isShown) { + $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) + } else { + $(window).off('resize.bs.modal') + } + } + + Modal.prototype.hideModal = function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.$body.removeClass('modal-open') + that.resetAdjustments() + that.resetScrollbar() + that.$element.trigger('hidden.bs.modal') + }) + } + + Modal.prototype.removeBackdrop = function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + Modal.prototype.backdrop = function (callback) { + var that = this + var animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') + .appendTo(this.$body) + + this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { + if (this.ignoreBackdropClick) { + this.ignoreBackdropClick = false + return + } + if (e.target !== e.currentTarget) return + this.options.backdrop == 'static' + ? this.$element[0].focus() + : this.hide() + }, this)) + + if (doAnimate) this.$backdrop[0].offsetWidth // force reflow + + this.$backdrop.addClass('in') + + if (!callback) return + + doAnimate ? + this.$backdrop + .one('bsTransitionEnd', callback) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callback() + + } else if (!this.isShown && this.$backdrop) { + this.$backdrop.removeClass('in') + + var callbackRemove = function () { + that.removeBackdrop() + callback && callback() + } + $.support.transition && this.$element.hasClass('fade') ? + this.$backdrop + .one('bsTransitionEnd', callbackRemove) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callbackRemove() + + } else if (callback) { + callback() + } + } + + // these following methods are used to handle overflowing modals + + Modal.prototype.handleUpdate = function () { + this.adjustDialog() + } + + Modal.prototype.adjustDialog = function () { + var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight + + this.$element.css({ + paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', + paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' + }) + } + + Modal.prototype.resetAdjustments = function () { + this.$element.css({ + paddingLeft: '', + paddingRight: '' + }) + } + + Modal.prototype.checkScrollbar = function () { + var fullWindowWidth = window.innerWidth + if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 + var documentElementRect = document.documentElement.getBoundingClientRect() + fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) + } + this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth + this.scrollbarWidth = this.measureScrollbar() + } + + Modal.prototype.setScrollbar = function () { + var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) + this.originalBodyPad = document.body.style.paddingRight || '' + if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) + } + + Modal.prototype.resetScrollbar = function () { + this.$body.css('padding-right', this.originalBodyPad) + } + + Modal.prototype.measureScrollbar = function () { // thx walsh + var scrollDiv = document.createElement('div') + scrollDiv.className = 'modal-scrollbar-measure' + this.$body.append(scrollDiv) + var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth + this.$body[0].removeChild(scrollDiv) + return scrollbarWidth + } + + + // MODAL PLUGIN DEFINITION + // ======================= + + function Plugin(option, _relatedTarget) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.modal') + var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('bs.modal', (data = new Modal(this, options))) + if (typeof option == 'string') data[option](_relatedTarget) + else if (options.show) data.show(_relatedTarget) + }) + } + + var old = $.fn.modal + + $.fn.modal = Plugin + $.fn.modal.Constructor = Modal + + + // MODAL NO CONFLICT + // ================= + + $.fn.modal.noConflict = function () { + $.fn.modal = old + return this + } + + + // MODAL DATA-API + // ============== + + $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { + var $this = $(this) + var href = $this.attr('href') + var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 + var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) + + if ($this.is('a')) e.preventDefault() + + $target.one('show.bs.modal', function (showEvent) { + if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown + $target.one('hidden.bs.modal', function () { + $this.is(':visible') && $this.trigger('focus') + }) + }) + Plugin.call($target, option, this) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tooltip.js v3.3.4 + * http://getbootstrap.com/javascript/#tooltip + * Inspired by the original jQuery.tipsy by Jason Frame + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TOOLTIP PUBLIC CLASS DEFINITION + // =============================== + + var Tooltip = function (element, options) { + this.type = null + this.options = null + this.enabled = null + this.timeout = null + this.hoverState = null + this.$element = null + + this.init('tooltip', element, options) + } + + Tooltip.VERSION = '3.3.4' + + Tooltip.TRANSITION_DURATION = 150 + + Tooltip.DEFAULTS = { + animation: true, + placement: 'top', + selector: false, + template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + container: false, + viewport: { + selector: 'body', + padding: 0 + } + } + + Tooltip.prototype.init = function (type, element, options) { + this.enabled = true + this.type = type + this.$element = $(element) + this.options = this.getOptions(options) + this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport) + + if (this.$element[0] instanceof document.constructor && !this.options.selector) { + throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') + } + + var triggers = this.options.trigger.split(' ') + + for (var i = triggers.length; i--;) { + var trigger = triggers[i] + + if (trigger == 'click') { + this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) + } else if (trigger != 'manual') { + var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' + var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' + + this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) + this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) + } + } + + this.options.selector ? + (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : + this.fixTitle() + } + + Tooltip.prototype.getDefaults = function () { + return Tooltip.DEFAULTS + } + + Tooltip.prototype.getOptions = function (options) { + options = $.extend({}, this.getDefaults(), this.$element.data(), options) + + if (options.delay && typeof options.delay == 'number') { + options.delay = { + show: options.delay, + hide: options.delay + } + } + + return options + } + + Tooltip.prototype.getDelegateOptions = function () { + var options = {} + var defaults = this.getDefaults() + + this._options && $.each(this._options, function (key, value) { + if (defaults[key] != value) options[key] = value + }) + + return options + } + + Tooltip.prototype.enter = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (self && self.$tip && self.$tip.is(':visible')) { + self.hoverState = 'in' + return + } + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + clearTimeout(self.timeout) + + self.hoverState = 'in' + + if (!self.options.delay || !self.options.delay.show) return self.show() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'in') self.show() + }, self.options.delay.show) + } + + Tooltip.prototype.leave = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + clearTimeout(self.timeout) + + self.hoverState = 'out' + + if (!self.options.delay || !self.options.delay.hide) return self.hide() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'out') self.hide() + }, self.options.delay.hide) + } + + Tooltip.prototype.show = function () { + var e = $.Event('show.bs.' + this.type) + + if (this.hasContent() && this.enabled) { + this.$element.trigger(e) + + var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) + if (e.isDefaultPrevented() || !inDom) return + var that = this + + var $tip = this.tip() + + var tipId = this.getUID(this.type) + + this.setContent() + $tip.attr('id', tipId) + this.$element.attr('aria-describedby', tipId) + + if (this.options.animation) $tip.addClass('fade') + + var placement = typeof this.options.placement == 'function' ? + this.options.placement.call(this, $tip[0], this.$element[0]) : + this.options.placement + + var autoToken = /\s?auto?\s?/i + var autoPlace = autoToken.test(placement) + if (autoPlace) placement = placement.replace(autoToken, '') || 'top' + + $tip + .detach() + .css({ top: 0, left: 0, display: 'block' }) + .addClass(placement) + .data('bs.' + this.type, this) + + this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) + + var pos = this.getPosition() + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (autoPlace) { + var orgPlacement = placement + var $container = this.options.container ? $(this.options.container) : this.$element.parent() + var containerDim = this.getPosition($container) + + placement = placement == 'bottom' && pos.bottom + actualHeight > containerDim.bottom ? 'top' : + placement == 'top' && pos.top - actualHeight < containerDim.top ? 'bottom' : + placement == 'right' && pos.right + actualWidth > containerDim.width ? 'left' : + placement == 'left' && pos.left - actualWidth < containerDim.left ? 'right' : + placement + + $tip + .removeClass(orgPlacement) + .addClass(placement) + } + + var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) + + this.applyPlacement(calculatedOffset, placement) + + var complete = function () { + var prevHoverState = that.hoverState + that.$element.trigger('shown.bs.' + that.type) + that.hoverState = null + + if (prevHoverState == 'out') that.leave(that) + } + + $.support.transition && this.$tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + } + } + + Tooltip.prototype.applyPlacement = function (offset, placement) { + var $tip = this.tip() + var width = $tip[0].offsetWidth + var height = $tip[0].offsetHeight + + // manually read margins because getBoundingClientRect includes difference + var marginTop = parseInt($tip.css('margin-top'), 10) + var marginLeft = parseInt($tip.css('margin-left'), 10) + + // we must check for NaN for ie 8/9 + if (isNaN(marginTop)) marginTop = 0 + if (isNaN(marginLeft)) marginLeft = 0 + + offset.top = offset.top + marginTop + offset.left = offset.left + marginLeft + + // $.fn.offset doesn't round pixel values + // so we use setOffset directly with our own function B-0 + $.offset.setOffset($tip[0], $.extend({ + using: function (props) { + $tip.css({ + top: Math.round(props.top), + left: Math.round(props.left) + }) + } + }, offset), 0) + + $tip.addClass('in') + + // check to see if placing tip in new offset caused the tip to resize itself + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (placement == 'top' && actualHeight != height) { + offset.top = offset.top + height - actualHeight + } + + var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) + + if (delta.left) offset.left += delta.left + else offset.top += delta.top + + var isVertical = /top|bottom/.test(placement) + var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight + var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' + + $tip.offset(offset) + this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) + } + + Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { + this.arrow() + .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') + .css(isVertical ? 'top' : 'left', '') + } + + Tooltip.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + + $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) + $tip.removeClass('fade in top bottom left right') + } + + Tooltip.prototype.hide = function (callback) { + var that = this + var $tip = $(this.$tip) + var e = $.Event('hide.bs.' + this.type) + + function complete() { + if (that.hoverState != 'in') $tip.detach() + that.$element + .removeAttr('aria-describedby') + .trigger('hidden.bs.' + that.type) + callback && callback() + } + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + $tip.removeClass('in') + + $.support.transition && $tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + + this.hoverState = null + + return this + } + + Tooltip.prototype.fixTitle = function () { + var $e = this.$element + if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') { + $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') + } + } + + Tooltip.prototype.hasContent = function () { + return this.getTitle() + } + + Tooltip.prototype.getPosition = function ($element) { + $element = $element || this.$element + + var el = $element[0] + var isBody = el.tagName == 'BODY' + + var elRect = el.getBoundingClientRect() + if (elRect.width == null) { + // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 + elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) + } + var elOffset = isBody ? { top: 0, left: 0 } : $element.offset() + var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } + var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null + + return $.extend({}, elRect, scroll, outerDims, elOffset) + } + + Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { + return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : + /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } + + } + + Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { + var delta = { top: 0, left: 0 } + if (!this.$viewport) return delta + + var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 + var viewportDimensions = this.getPosition(this.$viewport) + + if (/right|left/.test(placement)) { + var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll + var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight + if (topEdgeOffset < viewportDimensions.top) { // top overflow + delta.top = viewportDimensions.top - topEdgeOffset + } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow + delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset + } + } else { + var leftEdgeOffset = pos.left - viewportPadding + var rightEdgeOffset = pos.left + viewportPadding + actualWidth + if (leftEdgeOffset < viewportDimensions.left) { // left overflow + delta.left = viewportDimensions.left - leftEdgeOffset + } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow + delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset + } + } + + return delta + } + + Tooltip.prototype.getTitle = function () { + var title + var $e = this.$element + var o = this.options + + title = $e.attr('data-original-title') + || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) + + return title + } + + Tooltip.prototype.getUID = function (prefix) { + do prefix += ~~(Math.random() * 1000000) + while (document.getElementById(prefix)) + return prefix + } + + Tooltip.prototype.tip = function () { + return (this.$tip = this.$tip || $(this.options.template)) + } + + Tooltip.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) + } + + Tooltip.prototype.enable = function () { + this.enabled = true + } + + Tooltip.prototype.disable = function () { + this.enabled = false + } + + Tooltip.prototype.toggleEnabled = function () { + this.enabled = !this.enabled + } + + Tooltip.prototype.toggle = function (e) { + var self = this + if (e) { + self = $(e.currentTarget).data('bs.' + this.type) + if (!self) { + self = new this.constructor(e.currentTarget, this.getDelegateOptions()) + $(e.currentTarget).data('bs.' + this.type, self) + } + } + + self.tip().hasClass('in') ? self.leave(self) : self.enter(self) + } + + Tooltip.prototype.destroy = function () { + var that = this + clearTimeout(this.timeout) + this.hide(function () { + that.$element.off('.' + that.type).removeData('bs.' + that.type) + }) + } + + + // TOOLTIP PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tooltip') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tooltip + + $.fn.tooltip = Plugin + $.fn.tooltip.Constructor = Tooltip + + + // TOOLTIP NO CONFLICT + // =================== + + $.fn.tooltip.noConflict = function () { + $.fn.tooltip = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: popover.js v3.3.4 + * http://getbootstrap.com/javascript/#popovers + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // POPOVER PUBLIC CLASS DEFINITION + // =============================== + + var Popover = function (element, options) { + this.init('popover', element, options) + } + + if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') + + Popover.VERSION = '3.3.4' + + Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { + placement: 'right', + trigger: 'click', + content: '', + template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>' + }) + + + // NOTE: POPOVER EXTENDS tooltip.js + // ================================ + + Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) + + Popover.prototype.constructor = Popover + + Popover.prototype.getDefaults = function () { + return Popover.DEFAULTS + } + + Popover.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + var content = this.getContent() + + $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) + $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events + this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' + ](content) + + $tip.removeClass('fade top bottom left right in') + + // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do + // this manually by checking the contents. + if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() + } + + Popover.prototype.hasContent = function () { + return this.getTitle() || this.getContent() + } + + Popover.prototype.getContent = function () { + var $e = this.$element + var o = this.options + + return $e.attr('data-content') + || (typeof o.content == 'function' ? + o.content.call($e[0]) : + o.content) + } + + Popover.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.arrow')) + } + + + // POPOVER PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.popover') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.popover', (data = new Popover(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.popover + + $.fn.popover = Plugin + $.fn.popover.Constructor = Popover + + + // POPOVER NO CONFLICT + // =================== + + $.fn.popover.noConflict = function () { + $.fn.popover = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: scrollspy.js v3.3.4 + * http://getbootstrap.com/javascript/#scrollspy + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // SCROLLSPY CLASS DEFINITION + // ========================== + + function ScrollSpy(element, options) { + this.$body = $(document.body) + this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) + this.options = $.extend({}, ScrollSpy.DEFAULTS, options) + this.selector = (this.options.target || '') + ' .nav li > a' + this.offsets = [] + this.targets = [] + this.activeTarget = null + this.scrollHeight = 0 + + this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) + this.refresh() + this.process() + } + + ScrollSpy.VERSION = '3.3.4' + + ScrollSpy.DEFAULTS = { + offset: 10 + } + + ScrollSpy.prototype.getScrollHeight = function () { + return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) + } + + ScrollSpy.prototype.refresh = function () { + var that = this + var offsetMethod = 'offset' + var offsetBase = 0 + + this.offsets = [] + this.targets = [] + this.scrollHeight = this.getScrollHeight() + + if (!$.isWindow(this.$scrollElement[0])) { + offsetMethod = 'position' + offsetBase = this.$scrollElement.scrollTop() + } + + this.$body + .find(this.selector) + .map(function () { + var $el = $(this) + var href = $el.data('target') || $el.attr('href') + var $href = /^#./.test(href) && $(href) + + return ($href + && $href.length + && $href.is(':visible') + && [[$href[offsetMethod]().top + offsetBase, href]]) || null + }) + .sort(function (a, b) { return a[0] - b[0] }) + .each(function () { + that.offsets.push(this[0]) + that.targets.push(this[1]) + }) + } + + ScrollSpy.prototype.process = function () { + var scrollTop = this.$scrollElement.scrollTop() + this.options.offset + var scrollHeight = this.getScrollHeight() + var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() + var offsets = this.offsets + var targets = this.targets + var activeTarget = this.activeTarget + var i + + if (this.scrollHeight != scrollHeight) { + this.refresh() + } + + if (scrollTop >= maxScroll) { + return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) + } + + if (activeTarget && scrollTop < offsets[0]) { + this.activeTarget = null + return this.clear() + } + + for (i = offsets.length; i--;) { + activeTarget != targets[i] + && scrollTop >= offsets[i] + && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) + && this.activate(targets[i]) + } + } + + ScrollSpy.prototype.activate = function (target) { + this.activeTarget = target + + this.clear() + + var selector = this.selector + + '[data-target="' + target + '"],' + + this.selector + '[href="' + target + '"]' + + var active = $(selector) + .parents('li') + .addClass('active') + + if (active.parent('.dropdown-menu').length) { + active = active + .closest('li.dropdown') + .addClass('active') + } + + active.trigger('activate.bs.scrollspy') + } + + ScrollSpy.prototype.clear = function () { + $(this.selector) + .parentsUntil(this.options.target, '.active') + .removeClass('active') + } + + + // SCROLLSPY PLUGIN DEFINITION + // =========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.scrollspy') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.scrollspy + + $.fn.scrollspy = Plugin + $.fn.scrollspy.Constructor = ScrollSpy + + + // SCROLLSPY NO CONFLICT + // ===================== + + $.fn.scrollspy.noConflict = function () { + $.fn.scrollspy = old + return this + } + + + // SCROLLSPY DATA-API + // ================== + + $(window).on('load.bs.scrollspy.data-api', function () { + $('[data-spy="scroll"]').each(function () { + var $spy = $(this) + Plugin.call($spy, $spy.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tab.js v3.3.4 + * http://getbootstrap.com/javascript/#tabs + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TAB CLASS DEFINITION + // ==================== + + var Tab = function (element) { + this.element = $(element) + } + + Tab.VERSION = '3.3.4' + + Tab.TRANSITION_DURATION = 150 + + Tab.prototype.show = function () { + var $this = this.element + var $ul = $this.closest('ul:not(.dropdown-menu)') + var selector = $this.data('target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + if ($this.parent('li').hasClass('active')) return + + var $previous = $ul.find('.active:last a') + var hideEvent = $.Event('hide.bs.tab', { + relatedTarget: $this[0] + }) + var showEvent = $.Event('show.bs.tab', { + relatedTarget: $previous[0] + }) + + $previous.trigger(hideEvent) + $this.trigger(showEvent) + + if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return + + var $target = $(selector) + + this.activate($this.closest('li'), $ul) + this.activate($target, $target.parent(), function () { + $previous.trigger({ + type: 'hidden.bs.tab', + relatedTarget: $this[0] + }) + $this.trigger({ + type: 'shown.bs.tab', + relatedTarget: $previous[0] + }) + }) + } + + Tab.prototype.activate = function (element, container, callback) { + var $active = container.find('> .active') + var transition = callback + && $.support.transition + && (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length) + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', false) + + element + .addClass('active') + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + + if (transition) { + element[0].offsetWidth // reflow for transition + element.addClass('in') + } else { + element.removeClass('fade') + } + + if (element.parent('.dropdown-menu').length) { + element + .closest('li.dropdown') + .addClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + } + + callback && callback() + } + + $active.length && transition ? + $active + .one('bsTransitionEnd', next) + .emulateTransitionEnd(Tab.TRANSITION_DURATION) : + next() + + $active.removeClass('in') + } + + + // TAB PLUGIN DEFINITION + // ===================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tab') + + if (!data) $this.data('bs.tab', (data = new Tab(this))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tab + + $.fn.tab = Plugin + $.fn.tab.Constructor = Tab + + + // TAB NO CONFLICT + // =============== + + $.fn.tab.noConflict = function () { + $.fn.tab = old + return this + } + + + // TAB DATA-API + // ============ + + var clickHandler = function (e) { + e.preventDefault() + Plugin.call($(this), 'show') + } + + $(document) + .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) + .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: affix.js v3.3.4 + * http://getbootstrap.com/javascript/#affix + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // AFFIX CLASS DEFINITION + // ====================== + + var Affix = function (element, options) { + this.options = $.extend({}, Affix.DEFAULTS, options) + + this.$target = $(this.options.target) + .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) + .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) + + this.$element = $(element) + this.affixed = null + this.unpin = null + this.pinnedOffset = null + + this.checkPosition() + } + + Affix.VERSION = '3.3.4' + + Affix.RESET = 'affix affix-top affix-bottom' + + Affix.DEFAULTS = { + offset: 0, + target: window + } + + Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + var targetHeight = this.$target.height() + + if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false + + if (this.affixed == 'bottom') { + if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' + return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' + } + + var initializing = this.affixed == null + var colliderTop = initializing ? scrollTop : position.top + var colliderHeight = initializing ? targetHeight : height + + if (offsetTop != null && scrollTop <= offsetTop) return 'top' + if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' + + return false + } + + Affix.prototype.getPinnedOffset = function () { + if (this.pinnedOffset) return this.pinnedOffset + this.$element.removeClass(Affix.RESET).addClass('affix') + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + return (this.pinnedOffset = position.top - scrollTop) + } + + Affix.prototype.checkPositionWithEventLoop = function () { + setTimeout($.proxy(this.checkPosition, this), 1) + } + + Affix.prototype.checkPosition = function () { + if (!this.$element.is(':visible')) return + + var height = this.$element.height() + var offset = this.options.offset + var offsetTop = offset.top + var offsetBottom = offset.bottom + var scrollHeight = $(document.body).height() + + if (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) + + var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) + + if (this.affixed != affix) { + if (this.unpin != null) this.$element.css('top', '') + + var affixType = 'affix' + (affix ? '-' + affix : '') + var e = $.Event(affixType + '.bs.affix') + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + this.affixed = affix + this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null + + this.$element + .removeClass(Affix.RESET) + .addClass(affixType) + .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') + } + + if (affix == 'bottom') { + this.$element.offset({ + top: scrollHeight - height - offsetBottom + }) + } + } + + + // AFFIX PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.affix') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.affix', (data = new Affix(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.affix + + $.fn.affix = Plugin + $.fn.affix.Constructor = Affix + + + // AFFIX NO CONFLICT + // ================= + + $.fn.affix.noConflict = function () { + $.fn.affix = old + return this + } + + + // AFFIX DATA-API + // ============== + + $(window).on('load', function () { + $('[data-spy="affix"]').each(function () { + var $spy = $(this) + var data = $spy.data() + + data.offset = data.offset || {} + + if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom + if (data.offsetTop != null) data.offset.top = data.offsetTop + + Plugin.call($spy, data) + }) + }) + +}(jQuery); diff --git a/theme/bootstrap/bootstrap/js/bootstrap.min.js b/theme/bootstrap/bootstrap/js/bootstrap.min.js new file mode 100644 index 0000000..c8f1c68 --- /dev/null +++ b/theme/bootstrap/bootstrap/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.4 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.4",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.4",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.4",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.4",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27|32)/.test(b.which)&&!/input|textarea/i.test(b.target.tagName)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g&&27!=b.which||g&&27==b.which)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(b.target);38==b.which&&j>0&&j--,40==b.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="menu"]',g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in").attr("aria-hidden",!1),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a('<div class="modal-backdrop '+e+'" />').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.3.4",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport),this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-m<p.top?"bottom":"right"==h&&k.right+l>p.width?"left":"left"==h&&k.left-l<p.left?"right":h,f.removeClass(n).addClass(h)}var q=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(q,h);var r=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",r).emulateTransitionEnd(c.TRANSITION_DURATION):r()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.4",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.4",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.4",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]}); +if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.4",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a(document.body).height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/bootstrap/js/npm.js b/theme/bootstrap/bootstrap/js/npm.js new file mode 100644 index 0000000..bf6aa80 --- /dev/null +++ b/theme/bootstrap/bootstrap/js/npm.js @@ -0,0 +1,13 @@ +// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. +require('../../js/transition.js') +require('../../js/alert.js') +require('../../js/button.js') +require('../../js/carousel.js') +require('../../js/collapse.js') +require('../../js/dropdown.js') +require('../../js/modal.js') +require('../../js/tooltip.js') +require('../../js/popover.js') +require('../../js/scrollspy.js') +require('../../js/tab.js') +require('../../js/affix.js') \ No newline at end of file diff --git a/theme/bootstrap/bower.json b/theme/bootstrap/bower.json new file mode 100644 index 0000000..8ea15a0 --- /dev/null +++ b/theme/bootstrap/bower.json @@ -0,0 +1,33 @@ +{ + "name": "AdminLTE", + "homepage": "http://almsaeedstudio.com", + "authors": [ + "Abdullah Almsaeed <support@almsaeedstudio.com>" + ], + "description": "Admin dashboard and control panel template", + "main": [ + "index2.html", + "dist/css/AdminLTE.css", + "dist/js/app.js", + "build/less/AdminLTE.less" + ], + "keywords": [ + "css", + "js", + "html", + "template", + "admin", + "bootstrap", + "theme", + "backend", + "responsive" + ], + "license": "MIT", + "ignore": [ + "/.*", + "node_modules", + "bower_components", + "composer.json", + "documentation" + ] +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins.less b/theme/bootstrap/build/bootstrap-less/mixins.less new file mode 100644 index 0000000..af4408f --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins.less @@ -0,0 +1,39 @@ +// Mixins +// -------------------------------------------------- + +// Utilities +@import "mixins/hide-text.less"; +@import "mixins/opacity.less"; +@import "mixins/image.less"; +@import "mixins/labels.less"; +@import "mixins/reset-filter.less"; +@import "mixins/resize.less"; +@import "mixins/responsive-visibility.less"; +@import "mixins/size.less"; +@import "mixins/tab-focus.less"; +@import "mixins/text-emphasis.less"; +@import "mixins/text-overflow.less"; +@import "mixins/vendor-prefixes.less"; + +// Components +@import "mixins/alerts.less"; +@import "mixins/buttons.less"; +@import "mixins/panels.less"; +@import "mixins/pagination.less"; +@import "mixins/list-group.less"; +@import "mixins/nav-divider.less"; +@import "mixins/forms.less"; +@import "mixins/progress-bar.less"; +@import "mixins/table-row.less"; + +// Skins +@import "mixins/background-variant.less"; +@import "mixins/border-radius.less"; +@import "mixins/gradients.less"; + +// Layout +@import "mixins/clearfix.less"; +@import "mixins/center-block.less"; +@import "mixins/nav-vertical-align.less"; +@import "mixins/grid-framework.less"; +@import "mixins/grid.less"; diff --git a/theme/bootstrap/build/bootstrap-less/mixins/alerts.less b/theme/bootstrap/build/bootstrap-less/mixins/alerts.less new file mode 100644 index 0000000..396196f --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/alerts.less @@ -0,0 +1,14 @@ +// Alerts + +.alert-variant(@background; @border; @text-color) { + background-color: @background; + border-color: @border; + color: @text-color; + + hr { + border-top-color: darken(@border, 5%); + } + .alert-link { + color: darken(@text-color, 10%); + } +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/background-variant.less b/theme/bootstrap/build/bootstrap-less/mixins/background-variant.less new file mode 100644 index 0000000..556e490 --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/background-variant.less @@ -0,0 +1,8 @@ +// Contextual backgrounds + +.bg-variant(@color) { + background-color: @color; + a&:hover { + background-color: darken(@color, 10%); + } +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/border-radius.less b/theme/bootstrap/build/bootstrap-less/mixins/border-radius.less new file mode 100644 index 0000000..ca05dbf --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/border-radius.less @@ -0,0 +1,18 @@ +// Single side border-radius + +.border-top-radius(@radius) { + border-top-right-radius: @radius; + border-top-left-radius: @radius; +} +.border-right-radius(@radius) { + border-bottom-right-radius: @radius; + border-top-right-radius: @radius; +} +.border-bottom-radius(@radius) { + border-bottom-right-radius: @radius; + border-bottom-left-radius: @radius; +} +.border-left-radius(@radius) { + border-bottom-left-radius: @radius; + border-top-left-radius: @radius; +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/buttons.less b/theme/bootstrap/build/bootstrap-less/mixins/buttons.less new file mode 100644 index 0000000..92d8a05 --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/buttons.less @@ -0,0 +1,52 @@ +// Button variants +// +// Easily pump out default styles, as well as :hover, :focus, :active, +// and disabled options for all buttons + +.button-variant(@color; @background; @border) { + color: @color; + background-color: @background; + border-color: @border; + + &:hover, + &:focus, + &.focus, + &:active, + &.active, + .open > .dropdown-toggle& { + color: @color; + background-color: darken(@background, 10%); + border-color: darken(@border, 12%); + } + &:active, + &.active, + .open > .dropdown-toggle& { + background-image: none; + } + &.disabled, + &[disabled], + fieldset[disabled] & { + &, + &:hover, + &:focus, + &.focus, + &:active, + &.active { + background-color: @background; + border-color: @border; + } + } + + .badge { + color: @background; + background-color: @color; + } +} + +// Button sizes +.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) { + padding: @padding-vertical @padding-horizontal; + font-size: @font-size; + line-height: @line-height; + border-radius: @border-radius; +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/center-block.less b/theme/bootstrap/build/bootstrap-less/mixins/center-block.less new file mode 100644 index 0000000..d18d6de --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/center-block.less @@ -0,0 +1,7 @@ +// Center-align a block level element + +.center-block() { + display: block; + margin-left: auto; + margin-right: auto; +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/clearfix.less b/theme/bootstrap/build/bootstrap-less/mixins/clearfix.less new file mode 100644 index 0000000..3f7a382 --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/clearfix.less @@ -0,0 +1,22 @@ +// Clearfix +// +// For modern browsers +// 1. The space content is one way to avoid an Opera bug when the +// contenteditable attribute is included anywhere else in the document. +// Otherwise it causes space to appear at the top and bottom of elements +// that are clearfixed. +// 2. The use of `table` rather than `block` is only necessary if using +// `:before` to contain the top-margins of child elements. +// +// Source: http://nicolasgallagher.com/micro-clearfix-hack/ + +.clearfix() { + &:before, + &:after { + content: " "; // 1 + display: table; // 2 + } + &:after { + clear: both; + } +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/forms.less b/theme/bootstrap/build/bootstrap-less/mixins/forms.less new file mode 100644 index 0000000..6f55ed9 --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/forms.less @@ -0,0 +1,85 @@ +// Form validation states +// +// Used in forms.less to generate the form validation CSS for warnings, errors, +// and successes. + +.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) { + // Color the label and help text + .help-block, + .control-label, + .radio, + .checkbox, + .radio-inline, + .checkbox-inline, + &.radio label, + &.checkbox label, + &.radio-inline label, + &.checkbox-inline label { + color: @text-color; + } + // Set the border and box shadow on specific inputs to match + .form-control { + border-color: @border-color; + .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work + &:focus { + border-color: darken(@border-color, 10%); + @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%); + .box-shadow(@shadow); + } + } + // Set validation states also for addons + .input-group-addon { + color: @text-color; + border-color: @border-color; + background-color: @background-color; + } + // Optional feedback icon + .form-control-feedback { + color: @text-color; + } +} + + +// Form control focus state +// +// Generate a customized focus state and for any input with the specified color, +// which defaults to the `@input-border-focus` variable. +// +// We highly encourage you to not customize the default value, but instead use +// this to tweak colors on an as-needed basis. This aesthetic change is based on +// WebKit's default styles, but applicable to a wider range of browsers. Its +// usability and accessibility should be taken into account with any change. +// +// Example usage: change the default blue border and shadow to white for better +// contrast against a dark gray background. +.form-control-focus(@color: @input-border-focus) { + @color-rgba: rgba(red(@color), green(@color), blue(@color), .6); + &:focus { + border-color: @color; + outline: 0; + .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}"); + } +} + +// Form control sizing +// +// Relative text size, padding, and border-radii changes for form controls. For +// horizontal sizing, wrap controls in the predefined grid classes. `<select>` +// element gets special love because it's special, and that's a fact! +.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) { + height: @input-height; + padding: @padding-vertical @padding-horizontal; + font-size: @font-size; + line-height: @line-height; + border-radius: @border-radius; + + select& { + height: @input-height; + line-height: @input-height; + } + + textarea&, + select[multiple]& { + height: auto; + } +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/gradients.less b/theme/bootstrap/build/bootstrap-less/mixins/gradients.less new file mode 100644 index 0000000..0b88a89 --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/gradients.less @@ -0,0 +1,59 @@ +// Gradients + +#gradient { + + // Horizontal gradient, from left to right + // + // Creates two color stops, start and end, by specifying a color and position for each color stop. + // Color stops are not available in IE9 and below. + .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) { + background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+ + background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12 + background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+ + background-repeat: repeat-x; + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down + } + + // Vertical gradient, from top to bottom + // + // Creates two color stops, start and end, by specifying a color and position for each color stop. + // Color stops are not available in IE9 and below. + .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) { + background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+ + background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12 + background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+ + background-repeat: repeat-x; + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down + } + + .directional(@start-color: #555; @end-color: #333; @deg: 45deg) { + background-repeat: repeat-x; + background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+ + background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12 + background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+ + } + .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) { + background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color); + background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color); + background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color); + background-repeat: no-repeat; + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback + } + .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) { + background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color); + background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color); + background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color); + background-repeat: no-repeat; + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback + } + .radial(@inner-color: #555; @outer-color: #333) { + background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color); + background-image: radial-gradient(circle, @inner-color, @outer-color); + background-repeat: no-repeat; + } + .striped(@color: rgba(255,255,255,.15); @angle: 45deg) { + background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent); + background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent); + } +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/grid-framework.less b/theme/bootstrap/build/bootstrap-less/mixins/grid-framework.less new file mode 100644 index 0000000..f3b3929 --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/grid-framework.less @@ -0,0 +1,91 @@ +// Framework grid generation +// +// Used only by Bootstrap to generate the correct number of grid classes given +// any value of `@grid-columns`. + +.make-grid-columns() { + // Common styles for all sizes of grid columns, widths 1-12 + .col(@index) { // initial + @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}"; + .col((@index + 1), @item); + } + .col(@index, @list) when (@index =< @grid-columns) { // general; "=<" isn't a typo + @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}"; + .col((@index + 1), ~"@{list}, @{item}"); + } + .col(@index, @list) when (@index > @grid-columns) { // terminal + @{list} { + position: relative; + // Prevent columns from collapsing when empty + min-height: 1px; + // Inner gutter via padding + padding-left: (@grid-gutter-width / 2); + padding-right: (@grid-gutter-width / 2); + } + } + .col(1); // kickstart it +} + +.float-grid-columns(@class) { + .col(@index) { // initial + @item: ~".col-@{class}-@{index}"; + .col((@index + 1), @item); + } + .col(@index, @list) when (@index =< @grid-columns) { // general + @item: ~".col-@{class}-@{index}"; + .col((@index + 1), ~"@{list}, @{item}"); + } + .col(@index, @list) when (@index > @grid-columns) { // terminal + @{list} { + float: left; + } + } + .col(1); // kickstart it +} + +.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) { + .col-@{class}-@{index} { + width: percentage((@index / @grid-columns)); + } +} +.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) { + .col-@{class}-push-@{index} { + left: percentage((@index / @grid-columns)); + } +} +.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) { + .col-@{class}-push-0 { + left: auto; + } +} +.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) { + .col-@{class}-pull-@{index} { + right: percentage((@index / @grid-columns)); + } +} +.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) { + .col-@{class}-pull-0 { + right: auto; + } +} +.calc-grid-column(@index, @class, @type) when (@type = offset) { + .col-@{class}-offset-@{index} { + margin-left: percentage((@index / @grid-columns)); + } +} + +// Basic looping in LESS +.loop-grid-columns(@index, @class, @type) when (@index >= 0) { + .calc-grid-column(@index, @class, @type); + // next iteration + .loop-grid-columns((@index - 1), @class, @type); +} + +// Create grid for specific class +.make-grid(@class) { + .float-grid-columns(@class); + .loop-grid-columns(@grid-columns, @class, width); + .loop-grid-columns(@grid-columns, @class, pull); + .loop-grid-columns(@grid-columns, @class, push); + .loop-grid-columns(@grid-columns, @class, offset); +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/grid.less b/theme/bootstrap/build/bootstrap-less/mixins/grid.less new file mode 100644 index 0000000..cae5eaf --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/grid.less @@ -0,0 +1,122 @@ +// Grid system +// +// Generate semantic grid columns with these mixins. + +// Centered container element +.container-fixed(@gutter: @grid-gutter-width) { + margin-right: auto; + margin-left: auto; + padding-left: (@gutter / 2); + padding-right: (@gutter / 2); + &:extend(.clearfix all); +} + +// Creates a wrapper for a series of columns +.make-row(@gutter: @grid-gutter-width) { + margin-left: (@gutter / -2); + margin-right: (@gutter / -2); + &:extend(.clearfix all); +} + +// Generate the extra small columns +.make-xs-column(@columns; @gutter: @grid-gutter-width) { + position: relative; + float: left; + width: percentage((@columns / @grid-columns)); + min-height: 1px; + padding-left: (@gutter / 2); + padding-right: (@gutter / 2); +} +.make-xs-column-offset(@columns) { + margin-left: percentage((@columns / @grid-columns)); +} +.make-xs-column-push(@columns) { + left: percentage((@columns / @grid-columns)); +} +.make-xs-column-pull(@columns) { + right: percentage((@columns / @grid-columns)); +} + +// Generate the small columns +.make-sm-column(@columns; @gutter: @grid-gutter-width) { + position: relative; + min-height: 1px; + padding-left: (@gutter / 2); + padding-right: (@gutter / 2); + + @media (min-width: @screen-sm-min) { + float: left; + width: percentage((@columns / @grid-columns)); + } +} +.make-sm-column-offset(@columns) { + @media (min-width: @screen-sm-min) { + margin-left: percentage((@columns / @grid-columns)); + } +} +.make-sm-column-push(@columns) { + @media (min-width: @screen-sm-min) { + left: percentage((@columns / @grid-columns)); + } +} +.make-sm-column-pull(@columns) { + @media (min-width: @screen-sm-min) { + right: percentage((@columns / @grid-columns)); + } +} + +// Generate the medium columns +.make-md-column(@columns; @gutter: @grid-gutter-width) { + position: relative; + min-height: 1px; + padding-left: (@gutter / 2); + padding-right: (@gutter / 2); + + @media (min-width: @screen-md-min) { + float: left; + width: percentage((@columns / @grid-columns)); + } +} +.make-md-column-offset(@columns) { + @media (min-width: @screen-md-min) { + margin-left: percentage((@columns / @grid-columns)); + } +} +.make-md-column-push(@columns) { + @media (min-width: @screen-md-min) { + left: percentage((@columns / @grid-columns)); + } +} +.make-md-column-pull(@columns) { + @media (min-width: @screen-md-min) { + right: percentage((@columns / @grid-columns)); + } +} + +// Generate the large columns +.make-lg-column(@columns; @gutter: @grid-gutter-width) { + position: relative; + min-height: 1px; + padding-left: (@gutter / 2); + padding-right: (@gutter / 2); + + @media (min-width: @screen-lg-min) { + float: left; + width: percentage((@columns / @grid-columns)); + } +} +.make-lg-column-offset(@columns) { + @media (min-width: @screen-lg-min) { + margin-left: percentage((@columns / @grid-columns)); + } +} +.make-lg-column-push(@columns) { + @media (min-width: @screen-lg-min) { + left: percentage((@columns / @grid-columns)); + } +} +.make-lg-column-pull(@columns) { + @media (min-width: @screen-lg-min) { + right: percentage((@columns / @grid-columns)); + } +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/hide-text.less b/theme/bootstrap/build/bootstrap-less/mixins/hide-text.less new file mode 100644 index 0000000..c2315e5 --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/hide-text.less @@ -0,0 +1,21 @@ +// CSS image replacement +// +// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for +// mixins being reused as classes with the same name, this doesn't hold up. As +// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. +// +// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757 + +// Deprecated as of v3.0.1 (will be removed in v4) +.hide-text() { + font: ~"0/0" a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +// New mixin to use as of v3.0.1 +.text-hide() { + .hide-text(); +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/image.less b/theme/bootstrap/build/bootstrap-less/mixins/image.less new file mode 100644 index 0000000..f233cb3 --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/image.less @@ -0,0 +1,33 @@ +// Image Mixins +// - Responsive image +// - Retina image + + +// Responsive image +// +// Keep images from scaling beyond the width of their parents. +.img-responsive(@display: block) { + display: @display; + max-width: 100%; // Part 1: Set a maximum relative to the parent + height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching +} + + +// Retina image +// +// Short retina mixin for setting background-image and -size. Note that the +// spelling of `min--moz-device-pixel-ratio` is intentional. +.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) { + background-image: url("@{file-1x}"); + + @media + only screen and (-webkit-min-device-pixel-ratio: 2), + only screen and ( min--moz-device-pixel-ratio: 2), + only screen and ( -o-min-device-pixel-ratio: 2/1), + only screen and ( min-device-pixel-ratio: 2), + only screen and ( min-resolution: 192dpi), + only screen and ( min-resolution: 2dppx) { + background-image: url("@{file-2x}"); + background-size: @width-1x @height-1x; + } +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/labels.less b/theme/bootstrap/build/bootstrap-less/mixins/labels.less new file mode 100644 index 0000000..9f7a67e --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/labels.less @@ -0,0 +1,12 @@ +// Labels + +.label-variant(@color) { + background-color: @color; + + &[href] { + &:hover, + &:focus { + background-color: darken(@color, 10%); + } + } +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/list-group.less b/theme/bootstrap/build/bootstrap-less/mixins/list-group.less new file mode 100644 index 0000000..8b5b065 --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/list-group.less @@ -0,0 +1,29 @@ +// List Groups + +.list-group-item-variant(@state; @background; @color) { + .list-group-item-@{state} { + color: @color; + background-color: @background; + + a& { + color: @color; + + .list-group-item-heading { + color: inherit; + } + + &:hover, + &:focus { + color: @color; + background-color: darken(@background, 5%); + } + &.active, + &.active:hover, + &.active:focus { + color: #fff; + background-color: @color; + border-color: @color; + } + } + } +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/nav-divider.less b/theme/bootstrap/build/bootstrap-less/mixins/nav-divider.less new file mode 100644 index 0000000..feb1e9e --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/nav-divider.less @@ -0,0 +1,10 @@ +// Horizontal dividers +// +// Dividers (basically an hr) within dropdowns and nav lists + +.nav-divider(@color: #e5e5e5) { + height: 1px; + margin: ((@line-height-computed / 2) - 1) 0; + overflow: hidden; + background-color: @color; +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/nav-vertical-align.less b/theme/bootstrap/build/bootstrap-less/mixins/nav-vertical-align.less new file mode 100644 index 0000000..d458c78 --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/nav-vertical-align.less @@ -0,0 +1,9 @@ +// Navbar vertical align +// +// Vertically center elements in the navbar. +// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin. + +.navbar-vertical-align(@element-height) { + margin-top: ((@navbar-height - @element-height) / 2); + margin-bottom: ((@navbar-height - @element-height) / 2); +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/opacity.less b/theme/bootstrap/build/bootstrap-less/mixins/opacity.less new file mode 100644 index 0000000..33ed25c --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/opacity.less @@ -0,0 +1,8 @@ +// Opacity + +.opacity(@opacity) { + opacity: @opacity; + // IE8 filter + @opacity-ie: (@opacity * 100); + filter: ~"alpha(opacity=@{opacity-ie})"; +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/pagination.less b/theme/bootstrap/build/bootstrap-less/mixins/pagination.less new file mode 100644 index 0000000..7deb505 --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/pagination.less @@ -0,0 +1,23 @@ +// Pagination + +.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) { + > li { + > a, + > span { + padding: @padding-vertical @padding-horizontal; + font-size: @font-size; + } + &:first-child { + > a, + > span { + .border-left-radius(@border-radius); + } + } + &:last-child { + > a, + > span { + .border-right-radius(@border-radius); + } + } + } +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/panels.less b/theme/bootstrap/build/bootstrap-less/mixins/panels.less new file mode 100644 index 0000000..49ee10d --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/panels.less @@ -0,0 +1,24 @@ +// Panels + +.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) { + border-color: @border; + + & > .panel-heading { + color: @heading-text-color; + background-color: @heading-bg-color; + border-color: @heading-border; + + + .panel-collapse > .panel-body { + border-top-color: @border; + } + .badge { + color: @heading-bg-color; + background-color: @heading-text-color; + } + } + & > .panel-footer { + + .panel-collapse > .panel-body { + border-bottom-color: @border; + } + } +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/progress-bar.less b/theme/bootstrap/build/bootstrap-less/mixins/progress-bar.less new file mode 100644 index 0000000..f07996a --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/progress-bar.less @@ -0,0 +1,10 @@ +// Progress bars + +.progress-bar-variant(@color) { + background-color: @color; + + // Deprecated parent class requirement as of v3.2.0 + .progress-striped & { + #gradient > .striped(); + } +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/reset-filter.less b/theme/bootstrap/build/bootstrap-less/mixins/reset-filter.less new file mode 100644 index 0000000..68cdb5e --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/reset-filter.less @@ -0,0 +1,8 @@ +// Reset filters for IE +// +// When you need to remove a gradient background, do not forget to use this to reset +// the IE filter for IE9 and below. + +.reset-filter() { + filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)")); +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/resize.less b/theme/bootstrap/build/bootstrap-less/mixins/resize.less new file mode 100644 index 0000000..3acd3af --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/resize.less @@ -0,0 +1,6 @@ +// Resize anything + +.resizable(@direction) { + resize: @direction; // Options: horizontal, vertical, both + overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible` +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/responsive-visibility.less b/theme/bootstrap/build/bootstrap-less/mixins/responsive-visibility.less new file mode 100644 index 0000000..f7951c3 --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/responsive-visibility.less @@ -0,0 +1,15 @@ +// Responsive utilities + +// +// More easily include all the states for responsive-utilities.less. +.responsive-visibility() { + display: block !important; + table& { display: table; } + tr& { display: table-row !important; } + th&, + td& { display: table-cell !important; } +} + +.responsive-invisibility() { + display: none !important; +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/size.less b/theme/bootstrap/build/bootstrap-less/mixins/size.less new file mode 100644 index 0000000..a8be650 --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/size.less @@ -0,0 +1,10 @@ +// Sizing shortcuts + +.size(@width; @height) { + width: @width; + height: @height; +} + +.square(@size) { + .size(@size; @size); +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/tab-focus.less b/theme/bootstrap/build/bootstrap-less/mixins/tab-focus.less new file mode 100644 index 0000000..1f1f05a --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/tab-focus.less @@ -0,0 +1,9 @@ +// WebKit-style focus + +.tab-focus() { + // Default + outline: thin dotted; + // WebKit + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/table-row.less b/theme/bootstrap/build/bootstrap-less/mixins/table-row.less new file mode 100644 index 0000000..0f287f1 --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/table-row.less @@ -0,0 +1,28 @@ +// Tables + +.table-row-variant(@state; @background) { + // Exact selectors below required to override `.table-striped` and prevent + // inheritance to nested tables. + .table > thead > tr, + .table > tbody > tr, + .table > tfoot > tr { + > td.@{state}, + > th.@{state}, + &.@{state} > td, + &.@{state} > th { + background-color: @background; + } + } + + // Hover states for `.table-hover` + // Note: this is not available for cells or rows within `thead` or `tfoot`. + .table-hover > tbody > tr { + > td.@{state}:hover, + > th.@{state}:hover, + &.@{state}:hover > td, + &:hover > .@{state}, + &.@{state}:hover > th { + background-color: darken(@background, 5%); + } + } +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/text-emphasis.less b/theme/bootstrap/build/bootstrap-less/mixins/text-emphasis.less new file mode 100644 index 0000000..0868ef9 --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/text-emphasis.less @@ -0,0 +1,8 @@ +// Typography + +.text-emphasis-variant(@color) { + color: @color; + a&:hover { + color: darken(@color, 10%); + } +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/text-overflow.less b/theme/bootstrap/build/bootstrap-less/mixins/text-overflow.less new file mode 100644 index 0000000..c11ad2f --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/text-overflow.less @@ -0,0 +1,8 @@ +// Text overflow +// Requires inline-block or block for proper styling + +.text-overflow() { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} diff --git a/theme/bootstrap/build/bootstrap-less/mixins/vendor-prefixes.less b/theme/bootstrap/build/bootstrap-less/mixins/vendor-prefixes.less new file mode 100644 index 0000000..afd3331 --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/mixins/vendor-prefixes.less @@ -0,0 +1,227 @@ +// Vendor Prefixes +// +// All vendor mixins are deprecated as of v3.2.0 due to the introduction of +// Autoprefixer in our Gruntfile. They will be removed in v4. + +// - Animations +// - Backface visibility +// - Box shadow +// - Box sizing +// - Content columns +// - Hyphens +// - Placeholder text +// - Transformations +// - Transitions +// - User Select + + +// Animations +.animation(@animation) { + -webkit-animation: @animation; + -o-animation: @animation; + animation: @animation; +} +.animation-name(@name) { + -webkit-animation-name: @name; + animation-name: @name; +} +.animation-duration(@duration) { + -webkit-animation-duration: @duration; + animation-duration: @duration; +} +.animation-timing-function(@timing-function) { + -webkit-animation-timing-function: @timing-function; + animation-timing-function: @timing-function; +} +.animation-delay(@delay) { + -webkit-animation-delay: @delay; + animation-delay: @delay; +} +.animation-iteration-count(@iteration-count) { + -webkit-animation-iteration-count: @iteration-count; + animation-iteration-count: @iteration-count; +} +.animation-direction(@direction) { + -webkit-animation-direction: @direction; + animation-direction: @direction; +} +.animation-fill-mode(@fill-mode) { + -webkit-animation-fill-mode: @fill-mode; + animation-fill-mode: @fill-mode; +} + +// Backface visibility +// Prevent browsers from flickering when using CSS 3D transforms. +// Default value is `visible`, but can be changed to `hidden` + +.backface-visibility(@visibility){ + -webkit-backface-visibility: @visibility; + -moz-backface-visibility: @visibility; + backface-visibility: @visibility; +} + +// Drop shadows +// +// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's +// supported browsers that have box shadow capabilities now support it. + +.box-shadow(@shadow) { + -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1 + box-shadow: @shadow; +} + +// Box sizing +.box-sizing(@boxmodel) { + -webkit-box-sizing: @boxmodel; + -moz-box-sizing: @boxmodel; + box-sizing: @boxmodel; +} + +// CSS3 Content Columns +.content-columns(@column-count; @column-gap: @grid-gutter-width) { + -webkit-column-count: @column-count; + -moz-column-count: @column-count; + column-count: @column-count; + -webkit-column-gap: @column-gap; + -moz-column-gap: @column-gap; + column-gap: @column-gap; +} + +// Optional hyphenation +.hyphens(@mode: auto) { + word-wrap: break-word; + -webkit-hyphens: @mode; + -moz-hyphens: @mode; + -ms-hyphens: @mode; // IE10+ + -o-hyphens: @mode; + hyphens: @mode; +} + +// Placeholder text +.placeholder(@color: @input-color-placeholder) { + // Firefox + &::-moz-placeholder { + color: @color; + opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526 + } + &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+ + &::-webkit-input-placeholder { color: @color; } // Safari and Chrome +} + +// Transformations +.scale(@ratio) { + -webkit-transform: scale(@ratio); + -ms-transform: scale(@ratio); // IE9 only + -o-transform: scale(@ratio); + transform: scale(@ratio); +} +.scale(@ratioX; @ratioY) { + -webkit-transform: scale(@ratioX, @ratioY); + -ms-transform: scale(@ratioX, @ratioY); // IE9 only + -o-transform: scale(@ratioX, @ratioY); + transform: scale(@ratioX, @ratioY); +} +.scaleX(@ratio) { + -webkit-transform: scaleX(@ratio); + -ms-transform: scaleX(@ratio); // IE9 only + -o-transform: scaleX(@ratio); + transform: scaleX(@ratio); +} +.scaleY(@ratio) { + -webkit-transform: scaleY(@ratio); + -ms-transform: scaleY(@ratio); // IE9 only + -o-transform: scaleY(@ratio); + transform: scaleY(@ratio); +} +.skew(@x; @y) { + -webkit-transform: skewX(@x) skewY(@y); + -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+ + -o-transform: skewX(@x) skewY(@y); + transform: skewX(@x) skewY(@y); +} +.translate(@x; @y) { + -webkit-transform: translate(@x, @y); + -ms-transform: translate(@x, @y); // IE9 only + -o-transform: translate(@x, @y); + transform: translate(@x, @y); +} +.translate3d(@x; @y; @z) { + -webkit-transform: translate3d(@x, @y, @z); + transform: translate3d(@x, @y, @z); +} +.rotate(@degrees) { + -webkit-transform: rotate(@degrees); + -ms-transform: rotate(@degrees); // IE9 only + -o-transform: rotate(@degrees); + transform: rotate(@degrees); +} +.rotateX(@degrees) { + -webkit-transform: rotateX(@degrees); + -ms-transform: rotateX(@degrees); // IE9 only + -o-transform: rotateX(@degrees); + transform: rotateX(@degrees); +} +.rotateY(@degrees) { + -webkit-transform: rotateY(@degrees); + -ms-transform: rotateY(@degrees); // IE9 only + -o-transform: rotateY(@degrees); + transform: rotateY(@degrees); +} +.perspective(@perspective) { + -webkit-perspective: @perspective; + -moz-perspective: @perspective; + perspective: @perspective; +} +.perspective-origin(@perspective) { + -webkit-perspective-origin: @perspective; + -moz-perspective-origin: @perspective; + perspective-origin: @perspective; +} +.transform-origin(@origin) { + -webkit-transform-origin: @origin; + -moz-transform-origin: @origin; + -ms-transform-origin: @origin; // IE9 only + transform-origin: @origin; +} + + +// Transitions + +.transition(@transition) { + -webkit-transition: @transition; + -o-transition: @transition; + transition: @transition; +} +.transition-property(@transition-property) { + -webkit-transition-property: @transition-property; + transition-property: @transition-property; +} +.transition-delay(@transition-delay) { + -webkit-transition-delay: @transition-delay; + transition-delay: @transition-delay; +} +.transition-duration(@transition-duration) { + -webkit-transition-duration: @transition-duration; + transition-duration: @transition-duration; +} +.transition-timing-function(@timing-function) { + -webkit-transition-timing-function: @timing-function; + transition-timing-function: @timing-function; +} +.transition-transform(@transition) { + -webkit-transition: -webkit-transform @transition; + -moz-transition: -moz-transform @transition; + -o-transition: -o-transform @transition; + transition: transform @transition; +} + + +// User select +// For selecting text on the page + +.user-select(@select) { + -webkit-user-select: @select; + -moz-user-select: @select; + -ms-user-select: @select; // IE10+ + user-select: @select; +} diff --git a/theme/bootstrap/build/bootstrap-less/variables.less b/theme/bootstrap/build/bootstrap-less/variables.less new file mode 100644 index 0000000..b5fb9d0 --- /dev/null +++ b/theme/bootstrap/build/bootstrap-less/variables.less @@ -0,0 +1,861 @@ +// +// Variables +// -------------------------------------------------- + + +//== Colors +// +//## Gray and brand colors for use across Bootstrap. + +@gray-base: #000; +@gray-darker: lighten(@gray-base, 13.5%); // #222 +@gray-dark: lighten(@gray-base, 20%); // #333 +@gray: lighten(@gray-base, 33.5%); // #555 +@gray-light: lighten(@gray-base, 46.7%); // #777 +@gray-lighter: lighten(@gray-base, 93.5%); // #eee + +@brand-primary: darken(#428bca, 6.5%); // #337ab7 +@brand-success: #5cb85c; +@brand-info: #5bc0de; +@brand-warning: #f0ad4e; +@brand-danger: #d9534f; + + +//== Scaffolding +// +//## Settings for some of the most global styles. + +//** Background color for `<body>`. +@body-bg: #fff; +//** Global text color on `<body>`. +@text-color: @gray-dark; + +//** Global textual link color. +@link-color: @brand-primary; +//** Link hover color set via `darken()` function. +@link-hover-color: darken(@link-color, 15%); +//** Link hover decoration. +@link-hover-decoration: underline; + + +//== Typography +// +//## Font, line-height, and color for body text, headings, and more. + +@font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif; +@font-family-serif: Georgia, "Times New Roman", Times, serif; +//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`. +@font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace; +@font-family-base: @font-family-sans-serif; + +@font-size-base: 14px; +@font-size-large: ceil((@font-size-base * 1.25)); // ~18px +@font-size-small: ceil((@font-size-base * 0.85)); // ~12px + +@font-size-h1: floor((@font-size-base * 2.6)); // ~36px +@font-size-h2: floor((@font-size-base * 2.15)); // ~30px +@font-size-h3: ceil((@font-size-base * 1.7)); // ~24px +@font-size-h4: ceil((@font-size-base * 1.25)); // ~18px +@font-size-h5: @font-size-base; +@font-size-h6: ceil((@font-size-base * 0.85)); // ~12px + +//** Unit-less `line-height` for use in components like buttons. +@line-height-base: 1.428571429; // 20/14 +//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc. +@line-height-computed: floor((@font-size-base * @line-height-base)); // ~20px + +//** By default, this inherits from the `<body>`. +@headings-font-family: inherit; +@headings-font-weight: 500; +@headings-line-height: 1.1; +@headings-color: inherit; + + +//== Iconography +// +//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower. + +//** Load fonts from this directory. +@icon-font-path: "../fonts/"; +//** File name for all font files. +@icon-font-name: "glyphicons-halflings-regular"; +//** Element ID within SVG icon file. +@icon-font-svg-id: "glyphicons_halflingsregular"; + + +//== Components +// +//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start). + +@padding-base-vertical: 6px; +@padding-base-horizontal: 12px; + +@padding-large-vertical: 10px; +@padding-large-horizontal: 16px; + +@padding-small-vertical: 5px; +@padding-small-horizontal: 10px; + +@padding-xs-vertical: 1px; +@padding-xs-horizontal: 5px; + +@line-height-large: 1.3333333; // extra decimals for Win 8.1 Chrome +@line-height-small: 1.5; + +@border-radius-base: 4px; +@border-radius-large: 6px; +@border-radius-small: 3px; + +//** Global color for active items (e.g., navs or dropdowns). +@component-active-color: #fff; +//** Global background color for active items (e.g., navs or dropdowns). +@component-active-bg: @brand-primary; + +//** Width of the `border` for generating carets that indicator dropdowns. +@caret-width-base: 4px; +//** Carets increase slightly in size for larger components. +@caret-width-large: 5px; + + +//== Tables +// +//## Customizes the `.table` component with basic values, each used across all table variations. + +//** Padding for `<th>`s and `<td>`s. +@table-cell-padding: 8px; +//** Padding for cells in `.table-condensed`. +@table-condensed-cell-padding: 5px; + +//** Default background color used for all tables. +@table-bg: transparent; +//** Background color used for `.table-striped`. +@table-bg-accent: #f9f9f9; +//** Background color used for `.table-hover`. +@table-bg-hover: #f5f5f5; +@table-bg-active: @table-bg-hover; + +//** Border color for table and cell borders. +@table-border-color: #ddd; + + +//== Buttons +// +//## For each of Bootstrap's buttons, define text, background and border color. + +@btn-font-weight: normal; + +@btn-default-color: #333; +@btn-default-bg: #fff; +@btn-default-border: #ccc; + +@btn-primary-color: #fff; +@btn-primary-bg: @brand-primary; +@btn-primary-border: darken(@btn-primary-bg, 5%); + +@btn-success-color: #fff; +@btn-success-bg: @brand-success; +@btn-success-border: darken(@btn-success-bg, 5%); + +@btn-info-color: #fff; +@btn-info-bg: @brand-info; +@btn-info-border: darken(@btn-info-bg, 5%); + +@btn-warning-color: #fff; +@btn-warning-bg: @brand-warning; +@btn-warning-border: darken(@btn-warning-bg, 5%); + +@btn-danger-color: #fff; +@btn-danger-bg: @brand-danger; +@btn-danger-border: darken(@btn-danger-bg, 5%); + +@btn-link-disabled-color: @gray-light; + + +//== Forms +// +//## + +//** `<input>` background color +@input-bg: #fff; +//** `<input disabled>` background color +@input-bg-disabled: @gray-lighter; + +//** Text color for `<input>`s +@input-color: @gray; +//** `<input>` border color +@input-border: #ccc; + +// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4 +//** Default `.form-control` border radius +// This has no effect on `<select>`s in some browsers, due to the limited stylability of `<select>`s in CSS. +@input-border-radius: @border-radius-base; +//** Large `.form-control` border radius +@input-border-radius-large: @border-radius-large; +//** Small `.form-control` border radius +@input-border-radius-small: @border-radius-small; + +//** Border color for inputs on focus +@input-border-focus: #66afe9; + +//** Placeholder text color +@input-color-placeholder: #999; + +//** Default `.form-control` height +@input-height-base: (@line-height-computed + (@padding-base-vertical * 2) + 2); +//** Large `.form-control` height +@input-height-large: (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2); +//** Small `.form-control` height +@input-height-small: (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2); + +//** `.form-group` margin +@form-group-margin-bottom: 15px; + +@legend-color: @gray-dark; +@legend-border-color: #e5e5e5; + +//** Background color for textual input addons +@input-group-addon-bg: @gray-lighter; +//** Border color for textual input addons +@input-group-addon-border-color: @input-border; + +//** Disabled cursor for form controls and buttons. +@cursor-disabled: not-allowed; + + +//== Dropdowns +// +//## Dropdown menu container and contents. + +//** Background for the dropdown menu. +@dropdown-bg: #fff; +//** Dropdown menu `border-color`. +@dropdown-border: rgba(0,0,0,.15); +//** Dropdown menu `border-color` **for IE8**. +@dropdown-fallback-border: #ccc; +//** Divider color for between dropdown items. +@dropdown-divider-bg: #e5e5e5; + +//** Dropdown link text color. +@dropdown-link-color: @gray-dark; +//** Hover color for dropdown links. +@dropdown-link-hover-color: darken(@gray-dark, 5%); +//** Hover background for dropdown links. +@dropdown-link-hover-bg: #f5f5f5; + +//** Active dropdown menu item text color. +@dropdown-link-active-color: @component-active-color; +//** Active dropdown menu item background color. +@dropdown-link-active-bg: @component-active-bg; + +//** Disabled dropdown menu item background color. +@dropdown-link-disabled-color: @gray-light; + +//** Text color for headers within dropdown menus. +@dropdown-header-color: @gray-light; + +//** Deprecated `@dropdown-caret-color` as of v3.1.0 +@dropdown-caret-color: #000; + + +//-- Z-index master list +// +// Warning: Avoid customizing these values. They're used for a bird's eye view +// of components dependent on the z-axis and are designed to all work together. +// +// Note: These variables are not generated into the Customizer. + +@zindex-navbar: 1000; +@zindex-dropdown: 1000; +@zindex-popover: 1060; +@zindex-tooltip: 1070; +@zindex-navbar-fixed: 1030; +@zindex-modal-background: 1040; +@zindex-modal: 1050; + + +//== Media queries breakpoints +// +//## Define the breakpoints at which your layout will change, adapting to different screen sizes. + +// Extra small screen / phone +//** Deprecated `@screen-xs` as of v3.0.1 +@screen-xs: 480px; +//** Deprecated `@screen-xs-min` as of v3.2.0 +@screen-xs-min: @screen-xs; +//** Deprecated `@screen-phone` as of v3.0.1 +@screen-phone: @screen-xs-min; + +// Small screen / tablet +//** Deprecated `@screen-sm` as of v3.0.1 +@screen-sm: 768px; +@screen-sm-min: @screen-sm; +//** Deprecated `@screen-tablet` as of v3.0.1 +@screen-tablet: @screen-sm-min; + +// Medium screen / desktop +//** Deprecated `@screen-md` as of v3.0.1 +@screen-md: 992px; +@screen-md-min: @screen-md; +//** Deprecated `@screen-desktop` as of v3.0.1 +@screen-desktop: @screen-md-min; + +// Large screen / wide desktop +//** Deprecated `@screen-lg` as of v3.0.1 +@screen-lg: 1200px; +@screen-lg-min: @screen-lg; +//** Deprecated `@screen-lg-desktop` as of v3.0.1 +@screen-lg-desktop: @screen-lg-min; + +// So media queries don't overlap when required, provide a maximum +@screen-xs-max: (@screen-sm-min - 1); +@screen-sm-max: (@screen-md-min - 1); +@screen-md-max: (@screen-lg-min - 1); + + +//== Grid system +// +//## Define your custom responsive grid. + +//** Number of columns in the grid. +@grid-columns: 12; +//** Padding between columns. Gets divided in half for the left and right. +@grid-gutter-width: 30px; +// Navbar collapse +//** Point at which the navbar becomes uncollapsed. +@grid-float-breakpoint: @screen-sm-min; +//** Point at which the navbar begins collapsing. +@grid-float-breakpoint-max: (@grid-float-breakpoint - 1); + + +//== Container sizes +// +//## Define the maximum width of `.container` for different screen sizes. + +// Small screen / tablet +@container-tablet: (720px + @grid-gutter-width); +//** For `@screen-sm-min` and up. +@container-sm: @container-tablet; + +// Medium screen / desktop +@container-desktop: (940px + @grid-gutter-width); +//** For `@screen-md-min` and up. +@container-md: @container-desktop; + +// Large screen / wide desktop +@container-large-desktop: (1140px + @grid-gutter-width); +//** For `@screen-lg-min` and up. +@container-lg: @container-large-desktop; + + +//== Navbar +// +//## + +// Basics of a navbar +@navbar-height: 50px; +@navbar-margin-bottom: @line-height-computed; +@navbar-border-radius: @border-radius-base; +@navbar-padding-horizontal: floor((@grid-gutter-width / 2)); +@navbar-padding-vertical: ((@navbar-height - @line-height-computed) / 2); +@navbar-collapse-max-height: 340px; + +@navbar-default-color: #777; +@navbar-default-bg: #f8f8f8; +@navbar-default-border: darken(@navbar-default-bg, 6.5%); + +// Navbar links +@navbar-default-link-color: #777; +@navbar-default-link-hover-color: #333; +@navbar-default-link-hover-bg: transparent; +@navbar-default-link-active-color: #555; +@navbar-default-link-active-bg: darken(@navbar-default-bg, 6.5%); +@navbar-default-link-disabled-color: #ccc; +@navbar-default-link-disabled-bg: transparent; + +// Navbar brand label +@navbar-default-brand-color: @navbar-default-link-color; +@navbar-default-brand-hover-color: darken(@navbar-default-brand-color, 10%); +@navbar-default-brand-hover-bg: transparent; + +// Navbar toggle +@navbar-default-toggle-hover-bg: #ddd; +@navbar-default-toggle-icon-bar-bg: #888; +@navbar-default-toggle-border-color: #ddd; + + +// Inverted navbar +// Reset inverted navbar basics +@navbar-inverse-color: lighten(@gray-light, 15%); +@navbar-inverse-bg: #222; +@navbar-inverse-border: darken(@navbar-inverse-bg, 10%); + +// Inverted navbar links +@navbar-inverse-link-color: lighten(@gray-light, 15%); +@navbar-inverse-link-hover-color: #fff; +@navbar-inverse-link-hover-bg: transparent; +@navbar-inverse-link-active-color: @navbar-inverse-link-hover-color; +@navbar-inverse-link-active-bg: darken(@navbar-inverse-bg, 10%); +@navbar-inverse-link-disabled-color: #444; +@navbar-inverse-link-disabled-bg: transparent; + +// Inverted navbar brand label +@navbar-inverse-brand-color: @navbar-inverse-link-color; +@navbar-inverse-brand-hover-color: #fff; +@navbar-inverse-brand-hover-bg: transparent; + +// Inverted navbar toggle +@navbar-inverse-toggle-hover-bg: #333; +@navbar-inverse-toggle-icon-bar-bg: #fff; +@navbar-inverse-toggle-border-color: #333; + + +//== Navs +// +//## + +//=== Shared nav styles +@nav-link-padding: 10px 15px; +@nav-link-hover-bg: @gray-lighter; + +@nav-disabled-link-color: @gray-light; +@nav-disabled-link-hover-color: @gray-light; + +//== Tabs +@nav-tabs-border-color: #ddd; + +@nav-tabs-link-hover-border-color: @gray-lighter; + +@nav-tabs-active-link-hover-bg: @body-bg; +@nav-tabs-active-link-hover-color: @gray; +@nav-tabs-active-link-hover-border-color: #ddd; + +@nav-tabs-justified-link-border-color: #ddd; +@nav-tabs-justified-active-link-border-color: @body-bg; + +//== Pills +@nav-pills-border-radius: @border-radius-base; +@nav-pills-active-link-hover-bg: @component-active-bg; +@nav-pills-active-link-hover-color: @component-active-color; + + +//== Pagination +// +//## + +@pagination-color: @link-color; +@pagination-bg: #fff; +@pagination-border: #ddd; + +@pagination-hover-color: @link-hover-color; +@pagination-hover-bg: @gray-lighter; +@pagination-hover-border: #ddd; + +@pagination-active-color: #fff; +@pagination-active-bg: @brand-primary; +@pagination-active-border: @brand-primary; + +@pagination-disabled-color: @gray-light; +@pagination-disabled-bg: #fff; +@pagination-disabled-border: #ddd; + + +//== Pager +// +//## + +@pager-bg: @pagination-bg; +@pager-border: @pagination-border; +@pager-border-radius: 15px; + +@pager-hover-bg: @pagination-hover-bg; + +@pager-active-bg: @pagination-active-bg; +@pager-active-color: @pagination-active-color; + +@pager-disabled-color: @pagination-disabled-color; + + +//== Jumbotron +// +//## + +@jumbotron-padding: 30px; +@jumbotron-color: inherit; +@jumbotron-bg: @gray-lighter; +@jumbotron-heading-color: inherit; +@jumbotron-font-size: ceil((@font-size-base * 1.5)); + + +//== Form states and alerts +// +//## Define colors for form feedback states and, by default, alerts. + +@state-success-text: #3c763d; +@state-success-bg: #dff0d8; +@state-success-border: darken(spin(@state-success-bg, -10), 5%); + +@state-info-text: #31708f; +@state-info-bg: #d9edf7; +@state-info-border: darken(spin(@state-info-bg, -10), 7%); + +@state-warning-text: #8a6d3b; +@state-warning-bg: #fcf8e3; +@state-warning-border: darken(spin(@state-warning-bg, -10), 5%); + +@state-danger-text: #a94442; +@state-danger-bg: #f2dede; +@state-danger-border: darken(spin(@state-danger-bg, -10), 5%); + + +//== Tooltips +// +//## + +//** Tooltip max width +@tooltip-max-width: 200px; +//** Tooltip text color +@tooltip-color: #fff; +//** Tooltip background color +@tooltip-bg: #000; +@tooltip-opacity: .9; + +//** Tooltip arrow width +@tooltip-arrow-width: 5px; +//** Tooltip arrow color +@tooltip-arrow-color: @tooltip-bg; + + +//== Popovers +// +//## + +//** Popover body background color +@popover-bg: #fff; +//** Popover maximum width +@popover-max-width: 276px; +//** Popover border color +@popover-border-color: rgba(0,0,0,.2); +//** Popover fallback border color +@popover-fallback-border-color: #ccc; + +//** Popover title background color +@popover-title-bg: darken(@popover-bg, 3%); + +//** Popover arrow width +@popover-arrow-width: 10px; +//** Popover arrow color +@popover-arrow-color: @popover-bg; + +//** Popover outer arrow width +@popover-arrow-outer-width: (@popover-arrow-width + 1); +//** Popover outer arrow color +@popover-arrow-outer-color: fadein(@popover-border-color, 5%); +//** Popover outer arrow fallback color +@popover-arrow-outer-fallback-color: darken(@popover-fallback-border-color, 20%); + + +//== Labels +// +//## + +//** Default label background color +@label-default-bg: @gray-light; +//** Primary label background color +@label-primary-bg: @brand-primary; +//** Success label background color +@label-success-bg: @brand-success; +//** Info label background color +@label-info-bg: @brand-info; +//** Warning label background color +@label-warning-bg: @brand-warning; +//** Danger label background color +@label-danger-bg: @brand-danger; + +//** Default label text color +@label-color: #fff; +//** Default text color of a linked label +@label-link-hover-color: #fff; + + +//== Modals +// +//## + +//** Padding applied to the modal body +@modal-inner-padding: 15px; + +//** Padding applied to the modal title +@modal-title-padding: 15px; +//** Modal title line-height +@modal-title-line-height: @line-height-base; + +//** Background color of modal content area +@modal-content-bg: #fff; +//** Modal content border color +@modal-content-border-color: rgba(0,0,0,.2); +//** Modal content border color **for IE8** +@modal-content-fallback-border-color: #999; + +//** Modal backdrop background color +@modal-backdrop-bg: #000; +//** Modal backdrop opacity +@modal-backdrop-opacity: .5; +//** Modal header border color +@modal-header-border-color: #e5e5e5; +//** Modal footer border color +@modal-footer-border-color: @modal-header-border-color; + +@modal-lg: 900px; +@modal-md: 600px; +@modal-sm: 300px; + + +//== Alerts +// +//## Define alert colors, border radius, and padding. + +@alert-padding: 15px; +@alert-border-radius: @border-radius-base; +@alert-link-font-weight: bold; + +@alert-success-bg: @state-success-bg; +@alert-success-text: @state-success-text; +@alert-success-border: @state-success-border; + +@alert-info-bg: @state-info-bg; +@alert-info-text: @state-info-text; +@alert-info-border: @state-info-border; + +@alert-warning-bg: @state-warning-bg; +@alert-warning-text: @state-warning-text; +@alert-warning-border: @state-warning-border; + +@alert-danger-bg: @state-danger-bg; +@alert-danger-text: @state-danger-text; +@alert-danger-border: @state-danger-border; + + +//== Progress bars +// +//## + +//** Background color of the whole progress component +@progress-bg: #f5f5f5; +//** Progress bar text color +@progress-bar-color: #fff; +//** Variable for setting rounded corners on progress bar. +@progress-border-radius: @border-radius-base; + +//** Default progress bar color +@progress-bar-bg: @brand-primary; +//** Success progress bar color +@progress-bar-success-bg: @brand-success; +//** Warning progress bar color +@progress-bar-warning-bg: @brand-warning; +//** Danger progress bar color +@progress-bar-danger-bg: @brand-danger; +//** Info progress bar color +@progress-bar-info-bg: @brand-info; + + +//== List group +// +//## + +//** Background color on `.list-group-item` +@list-group-bg: #fff; +//** `.list-group-item` border color +@list-group-border: #ddd; +//** List group border radius +@list-group-border-radius: @border-radius-base; + +//** Background color of single list items on hover +@list-group-hover-bg: #f5f5f5; +//** Text color of active list items +@list-group-active-color: @component-active-color; +//** Background color of active list items +@list-group-active-bg: @component-active-bg; +//** Border color of active list elements +@list-group-active-border: @list-group-active-bg; +//** Text color for content within active list items +@list-group-active-text-color: lighten(@list-group-active-bg, 40%); + +//** Text color of disabled list items +@list-group-disabled-color: @gray-light; +//** Background color of disabled list items +@list-group-disabled-bg: @gray-lighter; +//** Text color for content within disabled list items +@list-group-disabled-text-color: @list-group-disabled-color; + +@list-group-link-color: #555; +@list-group-link-hover-color: @list-group-link-color; +@list-group-link-heading-color: #333; + + +//== Panels +// +//## + +@panel-bg: #fff; +@panel-body-padding: 15px; +@panel-heading-padding: 10px 15px; +@panel-footer-padding: @panel-heading-padding; +@panel-border-radius: @border-radius-base; + +//** Border color for elements within panels +@panel-inner-border: #ddd; +@panel-footer-bg: #f5f5f5; + +@panel-default-text: @gray-dark; +@panel-default-border: #ddd; +@panel-default-heading-bg: #f5f5f5; + +@panel-primary-text: #fff; +@panel-primary-border: @brand-primary; +@panel-primary-heading-bg: @brand-primary; + +@panel-success-text: @state-success-text; +@panel-success-border: @state-success-border; +@panel-success-heading-bg: @state-success-bg; + +@panel-info-text: @state-info-text; +@panel-info-border: @state-info-border; +@panel-info-heading-bg: @state-info-bg; + +@panel-warning-text: @state-warning-text; +@panel-warning-border: @state-warning-border; +@panel-warning-heading-bg: @state-warning-bg; + +@panel-danger-text: @state-danger-text; +@panel-danger-border: @state-danger-border; +@panel-danger-heading-bg: @state-danger-bg; + + +//== Thumbnails +// +//## + +//** Padding around the thumbnail image +@thumbnail-padding: 4px; +//** Thumbnail background color +@thumbnail-bg: @body-bg; +//** Thumbnail border color +@thumbnail-border: #ddd; +//** Thumbnail border radius +@thumbnail-border-radius: @border-radius-base; + +//** Custom text color for thumbnail captions +@thumbnail-caption-color: @text-color; +//** Padding around the thumbnail caption +@thumbnail-caption-padding: 9px; + + +//== Wells +// +//## + +@well-bg: #f5f5f5; +@well-border: darken(@well-bg, 7%); + + +//== Badges +// +//## + +@badge-color: #fff; +//** Linked badge text color on hover +@badge-link-hover-color: #fff; +@badge-bg: @gray-light; + +//** Badge text color in active nav link +@badge-active-color: @link-color; +//** Badge background color in active nav link +@badge-active-bg: #fff; + +@badge-font-weight: bold; +@badge-line-height: 1; +@badge-border-radius: 10px; + + +//== Breadcrumbs +// +//## + +@breadcrumb-padding-vertical: 8px; +@breadcrumb-padding-horizontal: 15px; +//** Breadcrumb background color +@breadcrumb-bg: #f5f5f5; +//** Breadcrumb text color +@breadcrumb-color: #ccc; +//** Text color of current page in the breadcrumb +@breadcrumb-active-color: @gray-light; +//** Textual separator for between breadcrumb elements +@breadcrumb-separator: "/"; + + +//== Carousel +// +//## + +@carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6); + +@carousel-control-color: #fff; +@carousel-control-width: 15%; +@carousel-control-opacity: .5; +@carousel-control-font-size: 20px; + +@carousel-indicator-active-bg: #fff; +@carousel-indicator-border-color: #fff; + +@carousel-caption-color: #fff; + + +//== Close +// +//## + +@close-font-weight: bold; +@close-color: #000; +@close-text-shadow: 0 1px 0 #fff; + + +//== Code +// +//## + +@code-color: #c7254e; +@code-bg: #f9f2f4; + +@kbd-color: #fff; +@kbd-bg: #333; + +@pre-bg: #f5f5f5; +@pre-color: @gray-dark; +@pre-border-color: #ccc; +@pre-scrollable-max-height: 340px; + + +//== Type +// +//## + +//** Horizontal offset for forms and lists. +@component-offset-horizontal: 180px; +//** Text muted color +@text-muted: @gray-light; +//** Abbreviations and acronyms border color +@abbr-border-color: @gray-light; +//** Headings small color +@headings-small-color: @gray-light; +//** Blockquote small color +@blockquote-small-color: @gray-light; +//** Blockquote font size +@blockquote-font-size: (@font-size-base * 1.25); +//** Blockquote border color +@blockquote-border-color: @gray-lighter; +//** Page header border color +@page-header-border-color: @gray-lighter; +//** Width of horizontal description list titles +@dl-horizontal-offset: @component-offset-horizontal; +//** Horizontal line color. +@hr-border: @gray-lighter; diff --git a/theme/bootstrap/build/less/404_500_errors.less b/theme/bootstrap/build/less/404_500_errors.less new file mode 100644 index 0000000..13adae8 --- /dev/null +++ b/theme/bootstrap/build/less/404_500_errors.less @@ -0,0 +1,36 @@ +/* + * Page: 400 and 500 error pages + * ------------------------------ + */ +.error-page { + width: 600px; + margin: 20px auto 0 auto; + @media (max-width: @screen-sm-max) { + width: 100%; + } + //For the error number e.g: 404 + > .headline { + float: left; + font-size: 100px; + font-weight: 300; + @media (max-width: @screen-sm-max) { + float: none; + text-align: center; + } + } + //For the message + > .error-content { + margin-left: 190px; + @media (max-width: @screen-sm-max) { + margin-left: 0; + } + > h3 { + font-weight: 300; + font-size: 25px; + @media(max-width: @screen-sm-max) { + text-align: center; + } + } + display: block; + } +} diff --git a/theme/bootstrap/build/less/AdminLTE.less b/theme/bootstrap/build/less/AdminLTE.less new file mode 100644 index 0000000..7ae24df --- /dev/null +++ b/theme/bootstrap/build/less/AdminLTE.less @@ -0,0 +1,68 @@ +/*! + * AdminLTE v2.3.0 + * Author: Almsaeed Studio + * Website: Almsaeed Studio <http://almsaeedstudio.com> + * License: Open source - MIT + * Please visit http://opensource.org/licenses/MIT for more information +!*/ + +//google fonts +@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic); + +//Bootstrap Variables & Mixins +//The core bootstrap code have not been modified. These files +//are included only for reference. +@import (reference) "../bootstrap-less/mixins.less"; +@import (reference) "../bootstrap-less/variables.less"; + +//MISC +//---- +@import "core.less"; +@import "variables.less"; +@import "mixins.less"; + +//COMPONENTS +//----------- +@import "header.less"; +@import "sidebar.less"; +@import "sidebar-mini.less"; +@import "control-sidebar.less"; +@import "dropdown.less"; +@import "forms.less"; +@import "progress-bars.less"; +@import "small-box.less"; +@import "boxes.less"; +@import "info-box.less"; +@import "timeline.less"; +@import "buttons.less"; +@import "callout.less"; +@import "alerts.less"; +@import "navs.less"; +@import "products.less"; +@import "table.less"; +@import "labels.less"; +@import "direct-chat.less"; +@import "users-list.less"; +@import "carousel.less"; +@import "modal.less"; +@import "social-widgets.less"; + +//PAGES +//------ +@import "mailbox.less"; +@import "lockscreen.less"; +@import "login_and_register.less"; +@import "404_500_errors.less"; +@import "invoice.less"; +@import "profile"; + +//Plugins +//-------- +@import "bootstrap-social.less"; +@import "fullcalendar.less"; +@import "select2.less"; + +//Miscellaneous +//------------- +@import "miscellaneous.less"; +@import "print.less"; diff --git a/theme/bootstrap/build/less/alerts.less b/theme/bootstrap/build/less/alerts.less new file mode 100644 index 0000000..88eceeb --- /dev/null +++ b/theme/bootstrap/build/less/alerts.less @@ -0,0 +1,44 @@ +/* + * Component: alert + * ---------------- + */ + +.alert { + .border-radius(3px); + h4 { + font-weight: 600; + } + .icon { + margin-right: 10px; + } + .close { + color: #000; + .opacity(.2); + &:hover { + .opacity(.5); + } + } + a { + color: #fff; + text-decoration: underline; + } +} + +//Alert Variants +.alert-success { + &:extend(.bg-green); + border-color: darken(@green, 5%); +} +.alert-danger, +.alert-error { + &:extend(.bg-red); + border-color: darken(@red, 5%); +} +.alert-warning { + &:extend(.bg-yellow); + border-color: darken(@yellow, 5%); +} +.alert-info { + &:extend(.bg-aqua); + border-color: darken(@aqua, 5%); +} diff --git a/theme/bootstrap/build/less/bootstrap-social.less b/theme/bootstrap/build/less/bootstrap-social.less new file mode 100644 index 0000000..78cf2dc --- /dev/null +++ b/theme/bootstrap/build/less/bootstrap-social.less @@ -0,0 +1,114 @@ +/* + * Social Buttons for Bootstrap + * + * Copyright 2013-2015 Panayiotis Lipiridis + * Licensed under the MIT License + * + * https://github.com/lipis/bootstrap-social + */ + +@bs-height-base: (@line-height-computed + @padding-base-vertical * 2); +@bs-height-lg: (floor(@font-size-large * @line-height-base) + @padding-large-vertical * 2); +@bs-height-sm: (floor(@font-size-small * 1.5) + @padding-small-vertical * 2); +@bs-height-xs: (floor(@font-size-small * 1.2) + @padding-small-vertical + 1); + +.btn-social { + position: relative; + padding-left: (@bs-height-base + @padding-base-horizontal); + text-align: left; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + > :first-child { + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: @bs-height-base; + line-height: (@bs-height-base + 2); + font-size: 1.6em; + text-align: center; + border-right: 1px solid rgba(0, 0, 0, 0.2); + } + &.btn-lg { + padding-left: (@bs-height-lg + @padding-large-horizontal); + > :first-child { + line-height: @bs-height-lg; + width: @bs-height-lg; + font-size: 1.8em; + } + } + &.btn-sm { + padding-left: (@bs-height-sm + @padding-small-horizontal); + > :first-child { + line-height: @bs-height-sm; + width: @bs-height-sm; + font-size: 1.4em; + } + } + &.btn-xs { + padding-left: (@bs-height-xs + @padding-small-horizontal); + > :first-child { + line-height: @bs-height-xs; + width: @bs-height-xs; + font-size: 1.2em; + } + } +} + +.btn-social-icon { + .btn-social; + height: (@bs-height-base + 2); + width: (@bs-height-base + 2); + padding: 0; + > :first-child { + border: none; + text-align: center; + width: 100%; + } + &.btn-lg { + height: @bs-height-lg; + width: @bs-height-lg; + padding-left: 0; + padding-right: 0; + } + &.btn-sm { + height: (@bs-height-sm + 2); + width: (@bs-height-sm + 2); + padding-left: 0; + padding-right: 0; + } + &.btn-xs { + height: (@bs-height-xs + 2); + width: (@bs-height-xs + 2); + padding-left: 0; + padding-right: 0; + } +} + +.btn-social(@color-bg, @color: #fff) { + background-color: @color-bg; + .button-variant(@color, @color-bg, rgba(0,0,0,.2)); +} + + +.btn-adn { .btn-social(#d87a68); } +.btn-bitbucket { .btn-social(#205081); } +.btn-dropbox { .btn-social(#1087dd); } +.btn-facebook { .btn-social(#3b5998); } +.btn-flickr { .btn-social(#ff0084); } +.btn-foursquare { .btn-social(#f94877); } +.btn-github { .btn-social(#444444); } +.btn-google { .btn-social(#dd4b39); } +.btn-instagram { .btn-social(#3f729b); } +.btn-linkedin { .btn-social(#007bb6); } +.btn-microsoft { .btn-social(#2672ec); } +.btn-openid { .btn-social(#f7931e); } +.btn-pinterest { .btn-social(#cb2027); } +.btn-reddit { .btn-social(#eff7ff, #000); } +.btn-soundcloud { .btn-social(#ff5500); } +.btn-tumblr { .btn-social(#2c4762); } +.btn-twitter { .btn-social(#55acee); } +.btn-vimeo { .btn-social(#1ab7ea); } +.btn-vk { .btn-social(#587ea3); } +.btn-yahoo { .btn-social(#720e9e); } diff --git a/theme/bootstrap/build/less/boxes.less b/theme/bootstrap/build/less/boxes.less new file mode 100644 index 0000000..98a4e96 --- /dev/null +++ b/theme/bootstrap/build/less/boxes.less @@ -0,0 +1,483 @@ +/* + * Component: Box + * -------------- + */ +.box { + position: relative; + .border-radius(@box-border-radius); + background: #ffffff; + border-top: 3px solid @box-default-border-top-color; + margin-bottom: 20px; + width: 100%; + box-shadow: @box-boxshadow; + + // Box color variations + &.box-primary { + border-top-color: @light-blue; + } + &.box-info { + border-top-color: @aqua; + } + &.box-danger { + border-top-color: @red; + } + &.box-warning { + border-top-color: @yellow; + } + &.box-success { + border-top-color: @green; + } + &.box-default { + border-top-color: @gray; + } + + // collapsed mode + &.collapsed-box { + .box-body, + .box-footer { + display: none; + } + } + + .nav-stacked { + > li { + border-bottom: 1px solid @box-border-color; + margin: 0; + &:last-of-type { + border-bottom: none; + } + } + } + + // fixed height to 300px + &.height-control { + .box-body { + max-height: 300px; + overflow: auto; + } + } + + .border-right { + border-right: 1px solid @box-border-color; + } + .border-left { + border-left: 1px solid @box-border-color; + } + + //SOLID BOX + //--------- + //use this class to get a colored header and borders + + &.box-solid { + border-top: 0; + > .box-header { + .btn.btn-default { + background: transparent; + } + .btn, + a { + &:hover { + background: rgba(0,0,0,0.1); + } + } + } + + // Box color variations + &.box-default { + .box-solid-variant(@gray, #444); + } + &.box-primary { + .box-solid-variant(@light-blue); + } + &.box-info { + .box-solid-variant(@aqua); + } + &.box-danger { + .box-solid-variant(@red); + } + &.box-warning { + .box-solid-variant(@yellow); + } + &.box-success { + .box-solid-variant(@green); + } + + > .box-header > .box-tools .btn { + border: 0; + box-shadow: none; + } + + // Fix font color for tiles + &[class*='bg'] { + > .box-header { + color: #fff; + } + } + + } + + //BOX GROUP + .box-group { + > .box { + margin-bottom: 5px; + } + } + + + // jQuery Knob in a box + .knob-label { + text-align: center; + color: #333; + font-weight: 100; + font-size: 12px; + margin-bottom: 0.3em; + } +} + +.box, +.overlay-wrapper { + // Box overlay for LOADING STATE effect + > .overlay, + > .loading-img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } + + .overlay { + z-index: 50; + background: rgba(255, 255, 255, 0.7); + .border-radius(@box-border-radius); + > .fa { + position: absolute; + top: 50%; + left: 50%; + margin-left: -15px; + margin-top: -15px; + color: #000; + font-size: 30px; + } + } + + .overlay.dark { + background: rgba(0, 0, 0, 0.5); + } +} + +//Add clearfix to header, body and footer +.box-header, +.box-body, +.box-footer { + .clearfix(); +} + +//Box header +.box-header { + color: #444; + display: block; + padding: @box-padding; + position: relative; + + //Add bottom border + &.with-border { + border-bottom: 1px solid @box-border-color; + .collapsed-box & { + border-bottom: none; + } + } + + //Icons and box title + > .fa, + > .glyphicon, + > .ion, + .box-title { + display: inline-block; + font-size: 18px; + margin: 0; + line-height: 1; + } + > .fa, + > .glyphicon, + > .ion { + margin-right: 5px; + } + > .box-tools { + position: absolute; + right: 10px; + top: 5px; + [data-toggle="tooltip"] { + position: relative; + } + + &.pull-right { + .dropdown-menu { + right: 0; + left: auto; + } + } + } +} + +//Box Tools Buttons +.btn-box-tool { + padding: 5px; + font-size: 12px; + background: transparent; + color: darken(@box-default-border-top-color, 20%); + .open &, + &:hover { + color: darken(@box-default-border-top-color, 40%); + } + &.btn:active { + box-shadow: none; + } +} + +//Box Body +.box-body { + .border-radius(0; 0; @box-border-radius; @box-border-radius); + padding: @box-padding; + .no-header & { + .border-top-radius(@box-border-radius); + } + // Tables within the box body + > .table { + margin-bottom: 0; + } + + // Calendar within the box body + .fc { + margin-top: 5px; + } + + .full-width-chart { + margin: -19px; + } + &.no-padding .full-width-chart { + margin: -9px; + } + + .box-pane { + .border-radius(0; 0; @box-border-radius; 0); + } + .box-pane-right { + .border-radius(0; 0; 0; @box-border-radius); + } +} + +//Box footer +.box-footer { + .border-radius(0; 0; @box-border-radius; @box-border-radius); + border-top: 1px solid @box-border-color; + padding: @box-padding; + background-color: @box-footer-bg; +} +.chart-legend { + &:extend(.list-unstyled); + margin: 10px 0; + > li { + @media (max-width: @screen-sm-max) { + float: left; + margin-right: 10px; + } + } +} + +//Comment Box +.box-comments { + background: #f7f7f7; + .box-comment { + .clearfix(); + padding: 8px 0; + border-bottom: 1px solid #eee; + &:last-of-type { + border-bottom: 0; + } + &:first-of-type { + padding-top: 0; + } + img { + &:extend(.img-sm); + float: left; + } + } + .comment-text { + margin-left: 40px; + color: #555; + } + .username { + color: #444; + display: block; + font-weight: 600; + } + .text-muted { + font-weight: 400; + font-size: 12px; + } +} + +//Widgets +//----------- + +/* Widget: TODO LIST */ + +.todo-list { + margin: 0; + padding: 0; + list-style: none; + overflow: auto; + // Todo list element + > li { + .border-radius(2px); + padding: 10px; + background: #f4f4f4; + margin-bottom: 2px; + border-left: 2px solid #e6e7e8; + color: #444; + &:last-of-type { + margin-bottom: 0; + } + + > input[type='checkbox'] { + margin: 0 10px 0 5px; + } + + .text { + display: inline-block; + margin-left: 5px; + font-weight: 600; + } + + // Time labels + .label { + margin-left: 10px; + font-size: 9px; + } + + // Tools and options box + .tools { + display: none; + float: right; + color: @red; + // icons + > .fa, > .glyphicon, > .ion { + margin-right: 5px; + cursor: pointer; + } + + } + &:hover .tools { + display: inline-block; + } + + &.done { + color: #999; + .text { + text-decoration: line-through; + font-weight: 500; + } + + .label { + background: @gray!important; + } + } + } + + // Color varaity + .danger { + border-left-color: @red; + } + .warning { + border-left-color: @yellow; + } + .info { + border-left-color: @aqua; + } + .success { + border-left-color: @green; + } + .primary { + border-left-color: @light-blue; + } + + .handle { + display: inline-block; + cursor: move; + margin: 0 5px; + } + +} +// END TODO WIDGET + +/* Chat widget (DEPRECATED - this will be removed in the next major release. Use Direct Chat instead)*/ +.chat { + padding: 5px 20px 5px 10px; + + .item { + .clearfix(); + margin-bottom: 10px; + // The image + > img { + width: 40px; + height: 40px; + border: 2px solid transparent; + .border-radius(50%); + } + + > .online { + border: 2px solid @green; + } + > .offline { + border: 2px solid @red; + } + + // The message body + > .message { + margin-left: 55px; + margin-top: -40px; + > .name { + display: block; + font-weight: 600; + } + } + + // The attachment + > .attachment { + .border-radius(@attachment-border-radius); + background: #f4f4f4; + margin-left: 65px; + margin-right: 15px; + padding: 10px; + > h4 { + margin: 0 0 5px 0; + font-weight: 600; + font-size: 14px; + } + > p, > .filename { + font-weight: 600; + font-size: 13px; + font-style: italic; + margin: 0; + + } + .clearfix(); + } + } + +} +//END CHAT WIDGET + +//Input in box +.box-input { + max-width: 200px; +} + +//A fix for panels body text color when placed within +// a modal +.modal { + .panel-body { + color: #444; + } +} diff --git a/theme/bootstrap/build/less/buttons.less b/theme/bootstrap/build/less/buttons.less new file mode 100644 index 0000000..0d66b1b --- /dev/null +++ b/theme/bootstrap/build/less/buttons.less @@ -0,0 +1,159 @@ +/* + * Component: Button + * ----------------- + */ + +.btn { + .border-radius(@btn-border-radius); + .box-shadow(@btn-boxshadow); + border: 1px solid transparent; + + &.uppercase { + text-transform: uppercase + } + + // Flat buttons + &.btn-flat { + .border-radius(0); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + border-width: 1px; + } + + // Active state + &:active { + -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,.125); + -moz-box-shadow: inset 0 3px 5px rgba(0,0,0,.125); + box-shadow: inset 0 3px 5px rgba(0,0,0,.125); + } + + &:focus { + outline: none; + } + + // input file btn + &.btn-file { + position: relative; + overflow: hidden; + > input[type='file'] { + position: absolute; + top: 0; + right: 0; + min-width: 100%; + min-height: 100%; + font-size: 100px; + text-align: right; + .opacity(0); + outline: none; + background: white; + cursor: inherit; + display: block; + } + } +} + +//Button color variations +.btn-default { + background-color: #f4f4f4; + color: #444; + border-color: #ddd; + &:hover, + &:active, + &.hover { + background-color:darken(#f4f4f4, 5%); + } +} +.btn-primary { + background-color: @light-blue; + border-color: darken(@light-blue, 5%); + &:hover, &:active, &.hover { + background-color: darken(@light-blue, 5%); + } +} +.btn-success { + background-color: @green; + border-color: darken(@green, 5%); + &:hover, &:active, &.hover { + background-color: darken(@green, 5%); + } +} +.btn-info { + background-color: @aqua; + border-color: darken(@aqua, 5%); + &:hover, &:active, &.hover { + background-color: darken(@aqua, 5%); + } +} +.btn-danger { + background-color: @red; + border-color: darken(@red, 5%); + &:hover, &:active, &.hover { + background-color: darken(@red, 5%); + } +} +.btn-warning { + background-color: @yellow; + border-color: darken(@yellow, 5%); + &:hover, &:active, &.hover { + background-color: darken(@yellow, 5%); + } +} +.btn-outline { + border: 1px solid #fff; + background: transparent; + color: #fff; + &:hover, + &:focus, + &:active { + color: rgba(255,255,255,.7); + border-color: rgba(255,255,255,.7); + } +} +.btn-link { + .box-shadow(none); +} +//General .btn with bg class +.btn[class*='bg-']:hover { + .box-shadow(inset 0 0 100px rgba(0,0,0,0.2)); +} +// Application buttons +.btn-app { + .border-radius(3px); + position: relative; + padding: 15px 5px; + margin: 0 0 10px 10px; + min-width: 80px; + height: 60px; + text-align: center; + color: #666; + border: 1px solid #ddd; + background-color: #f4f4f4; + font-size: 12px; + //Icons within the btn + > .fa, > .glyphicon, > .ion { + font-size: 20px; + display: block; + } + + &:hover { + background: #f4f4f4; + color: #444; + border-color: #aaa; + } + + &:active, &:focus { + -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,.125); + -moz-box-shadow: inset 0 3px 5px rgba(0,0,0,.125); + box-shadow: inset 0 3px 5px rgba(0,0,0,.125); + } + + //The badge + > .badge { + position: absolute; + top: -3px; + right: -10px; + font-size: 10px; + font-weight: 400; + } +} diff --git a/theme/bootstrap/build/less/callout.less b/theme/bootstrap/build/less/callout.less new file mode 100644 index 0000000..9f6aaa1 --- /dev/null +++ b/theme/bootstrap/build/less/callout.less @@ -0,0 +1,48 @@ +/* + * Component: Callout + * ------------------ + */ + +// Base styles (regardless of theme) +.callout { + .border-radius(3px); + margin: 0 0 20px 0; + padding: 15px 30px 15px 15px; + border-left: 5px solid #eee; + a { + color: #fff; + text-decoration: underline; + &:hover { + color: #eee; + } + } + h4 { + margin-top: 0; + font-weight: 600; + } + p:last-child { + margin-bottom: 0; + } + code, + .highlight { + background-color: #fff; + } + + // Themes for different contexts + &.callout-danger { + &:extend(.bg-red); + border-color: darken(@red, 10%); + } + &.callout-warning { + &:extend(.bg-yellow); + border-color: darken(@yellow, 10%); + } + &.callout-info { + &:extend(.bg-aqua); + border-color: darken(@aqua, 10%); + } + &.callout-success { + &:extend(.bg-green); + border-color: darken(@green, 10%); + } +} diff --git a/theme/bootstrap/build/less/carousel.less b/theme/bootstrap/build/less/carousel.less new file mode 100644 index 0000000..f069109 --- /dev/null +++ b/theme/bootstrap/build/less/carousel.less @@ -0,0 +1,18 @@ +/* + * Component: Carousel + * ------------------- + */ +.carousel-control { + &.left, + &.right { + background-image: none; + } + > .fa { + font-size: 40px; + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -20px; + } +} diff --git a/theme/bootstrap/build/less/control-sidebar.less b/theme/bootstrap/build/less/control-sidebar.less new file mode 100644 index 0000000..f1d419f --- /dev/null +++ b/theme/bootstrap/build/less/control-sidebar.less @@ -0,0 +1,280 @@ +/* + * Component: Control sidebar. By default, this is the right sidebar. + */ +//The sidebar's background control class +//This is a hack to make the background visible while scrolling +.control-sidebar-bg { + position: fixed; + z-index: 1000; + bottom: 0; +} +//Transitions +.control-sidebar-bg, +.control-sidebar { + top: 0; + right: -@control-sidebar-width; + width: @control-sidebar-width; + .transition(right @transition-speed ease-in-out); +} +//The sidebar +.control-sidebar { + position: absolute; + padding-top: @navbar-height; + z-index: 1010; + //Fix position after header collapse + @media (max-width: @screen-sm) { + padding-top: @navbar-height + 50; + } + //Tab panes + > .tab-content { + padding: 10px 15px; + } + //Open state with slide over content effect + &.control-sidebar-open { + &, + + .control-sidebar-bg { + right: 0; + } + } +} +//Open without slide over content +.control-sidebar-open { + .control-sidebar-bg, + .control-sidebar { + right: 0; + } + @media(min-width: @screen-sm) { + .content-wrapper, + .right-side, + .main-footer { + margin-right: @control-sidebar-width; + } + } +} +//Control sidebar tabs +.nav-tabs.control-sidebar-tabs { + > li { + &:first-of-type > a { + &, + &:hover, + &:focus { + border-left-width: 0; + } + } + > a { + .border-radius(0); + + //Hover and active states + &, + &:hover { + border-top: none; + border-right: none; + border-left: 1px solid transparent; + border-bottom: 1px solid transparent; + } + .icon { + font-size: 16px; + } + } + //Active state + &.active { + > a { + &, + &:hover, + &:focus, + &:active { + border-top: none; + border-right: none; + border-bottom: none; + } + } + } + } + //Remove responsiveness on small screens + @media(max-width: @screen-sm) { + display: table; + >li { + display: table-cell; + } + } +} +//Headings in the sidebar content +.control-sidebar-heading { + font-weight: 400; + font-size: 16px; + padding: 10px 0; + margin-bottom: 10px; +} +//Subheadings +.control-sidebar-subheading { + display: block; + font-weight: 400; + font-size: 14px; +} +//Control Sidebar Menu +.control-sidebar-menu { + list-style: none; + padding: 0; + margin: 0 -15px; + > li > a { + .clearfix(); + display: block; + padding: 10px 15px; + > .control-sidebar-subheading { + margin-top: 0; + } + } + .menu-icon { + float: left; + width: 35px; + height: 35px; + border-radius: 50%; + text-align: center; + line-height: 35px; + } + .menu-info { + margin-left: 45px; + margin-top: 3px; + > .control-sidebar-subheading { + margin: 0; + } + > p { + margin: 0; + font-size: 11px; + } + } + .progress { + margin: 0; + } +} +//Dark skin +.control-sidebar-dark { + color: @sidebar-dark-color; + // Background + &, + + .control-sidebar-bg { + background: @sidebar-dark-bg; + } + // Sidebar tabs + .nav-tabs.control-sidebar-tabs { + border-bottom: darken(@sidebar-dark-bg, 3%); + > li { + > a { + background: darken(@sidebar-dark-bg, 5%); + color: @sidebar-dark-color; + //Hover and active states + &, + &:hover, + &:focus { + border-left-color: darken(@sidebar-dark-bg, 7%); + border-bottom-color: darken(@sidebar-dark-bg, 7%); + } + &:hover, + &:focus, + &:active { + background: darken(@sidebar-dark-bg, 3%); + } + &:hover { + color: #fff; + } + } + //Active state + &.active { + > a { + &, + &:hover, + &:focus, + &:active { + background: @sidebar-dark-bg; + color: #fff; + } + } + } + } + } + //Heading & subheading + .control-sidebar-heading, + .control-sidebar-subheading { + color: #fff; + } + //Sidebar list + .control-sidebar-menu { + > li { + > a { + &:hover { + background: @sidebar-dark-hover-bg; + } + .menu-info { + > p { + color: @sidebar-dark-color; + } + } + } + } + } +} +//Light skin +.control-sidebar-light { + color: lighten(@sidebar-light-color, 10%); + // Background + &, + + .control-sidebar-bg { + background: @sidebar-light-bg; + border-left: 1px solid @gray; + } + // Sidebar tabs + .nav-tabs.control-sidebar-tabs { + border-bottom: @gray; + > li { + > a { + background: darken(@sidebar-light-bg, 5%); + color: @sidebar-light-color; + //Hover and active states + &, + &:hover, + &:focus { + border-left-color: @gray; + border-bottom-color: @gray; + } + &:hover, + &:focus, + &:active { + background: darken(@sidebar-light-bg, 3%); + } + } + //Active state + &.active { + > a { + &, + &:hover, + &:focus, + &:active { + background: @sidebar-light-bg; + color: #111; + } + } + } + } + } + //Heading & subheading + .control-sidebar-heading, + .control-sidebar-subheading { + color: #111; + } + //Sidebar list + .control-sidebar-menu { + margin-left: -14px; + > li { + > a { + &:hover { + background: @sidebar-light-hover-bg; + } + .menu-info { + > p { + color: lighten(@sidebar-light-color, 10%); + } + } + } + } + } +} diff --git a/theme/bootstrap/build/less/core.less b/theme/bootstrap/build/less/core.less new file mode 100644 index 0000000..e4c6115 --- /dev/null +++ b/theme/bootstrap/build/less/core.less @@ -0,0 +1,171 @@ +/* + * Core: General Layout Style + * ------------------------- + */ +html, +body { + min-height: 100%; + .layout-boxed & { + height: 100%; + } +} + +body { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-weight: 400; + overflow-x: hidden; + overflow-y: auto; +} + +/* Layout */ +.wrapper { + .clearfix(); + min-height: 100%; + position: static; + overflow: hidden; + .layout-boxed & { + max-width: 1250px; + margin: 0 auto; + min-height: 100%; + box-shadow: 0 0 8px rgba(0,0,0,0.5); + position: relative; + } +} + +.layout-boxed { + background: url('@{boxed-layout-bg-image-path}') repeat fixed; +} + +/* + * Content Wrapper - contains the main content + * ```.right-side has been deprecated as of v2.0.0 in favor of .content-wrapper ``` + */ +.content-wrapper, +.right-side, +.main-footer { + //Using disposable variable to join statements with a comma + @transition-rule: @transition-speed @transition-fn, + margin @transition-speed @transition-fn; + .transition-transform(@transition-rule); + margin-left: @sidebar-width; + z-index: 820; + //Top nav layout + .layout-top-nav & { + margin-left: 0; + } + @media (max-width: @screen-xs-max) { + margin-left: 0; + } + //When opening the sidebar on large screens + .sidebar-collapse & { + @media (min-width: @screen-sm) { + margin-left: 0; + } + } + //When opening the sidebar on small screens + .sidebar-open & { + @media (max-width: @screen-xs-max) { + .translate(@sidebar-width, 0); + } + } +} + +.content-wrapper, +.right-side { + min-height: 100%; + background-color: @body-bg; + z-index: 800; +} +.main-footer { + background: #fff; + padding: 15px; + color: #444; + border-top: 1px solid @gray; +} + +/* Fixed layout */ +.fixed { + .main-header, + .main-sidebar, + .left-side { + position: fixed; + } + .main-header { + top: 0; + right: 0; + left: 0; + } + .content-wrapper, + .right-side { + padding-top: 50px; + @media (max-width: @screen-header-collapse) { + padding-top: 100px; + } + } + &.layout-boxed { + .wrapper { + max-width: 100%; + } + } +} + +body.hold-transition { + .content-wrapper, + .right-side, + .main-footer, + .main-sidebar, + .left-side, + .main-header > .navbar, + .main-header .logo { + /* Fix for IE */ + .transition(none); + } +} + +/* Content */ +.content { + min-height: 250px; + padding: 15px; + .container-fixed(@grid-gutter-width); +} + +/* H1 - H6 font */ +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: 'Source Sans Pro', sans-serif; +} +/* General Links */ +a { + color: @link-color; +} +a:hover, +a:active, +a:focus { + outline: none; + text-decoration: none; + color: @link-hover-color; +} + +/* Page Header */ +.page-header { + margin: 10px 0 20px 0; + font-size: 22px; + + > small { + color: #666; + display: block; + margin-top: 5px; + } +} diff --git a/theme/bootstrap/build/less/direct-chat.less b/theme/bootstrap/build/less/direct-chat.less new file mode 100644 index 0000000..bbcf37c --- /dev/null +++ b/theme/bootstrap/build/less/direct-chat.less @@ -0,0 +1,172 @@ +/* + * Component: Direct Chat + * ---------------------- + */ +.direct-chat { + .box-body { + .border-bottom-radius(0); + position: relative; + overflow-x: hidden; + padding: 0; + } + &.chat-pane-open { + .direct-chat-contacts { + .translate(0, 0); + } + } +} +.direct-chat-messages { + .translate(0, 0); + padding: 10px; + height: 250px; + overflow: auto; +} +.direct-chat-msg, +.direct-chat-text { + display: block; +} +.direct-chat-msg { + .clearfix(); + margin-bottom: 10px; +} +.direct-chat-messages, +.direct-chat-contacts { + .transition-transform(.5s ease-in-out); +} +.direct-chat-text { + .border-radius(5px); + position: relative; + padding: 5px 10px; + background: @direct-chat-default-msg-bg; + border: 1px solid @direct-chat-default-msg-border-color; + margin: 5px 0 0 50px; + color: @direct-chat-default-font-color; + + //Create the arrow + &:after, + &:before { + position: absolute; + right: 100%; + top: 15px; + border: solid transparent; + border-right-color: @direct-chat-default-msg-border-color; + content: ' '; + height: 0; + width: 0; + pointer-events: none; + } + + &:after { + border-width: 5px; + margin-top: -5px; + } + &:before { + border-width: 6px; + margin-top: -6px; + } + .right & { + margin-right: 50px; + margin-left: 0; + &:after, + &:before { + right: auto; + left: 100%; + border-right-color: transparent; + border-left-color: @direct-chat-default-msg-border-color; + } + } +} +.direct-chat-img { + .border-radius(50%); + float: left; + width: 40px; + height: 40px; + .right & { + float: right; + } +} +.direct-chat-info { + display: block; + margin-bottom: 2px; + font-size: 12px; +} +.direct-chat-name { + font-weight: 600; +} +.direct-chat-timestamp { + color: #999; +} +//Direct chat contacts pane +.direct-chat-contacts-open { + .direct-chat-contacts { + .translate(0, 0); + } +} +.direct-chat-contacts { + .translate(101%, 0); + position: absolute; + top: 0; + bottom: 0; + height: 250px; + width: 100%; + background: #222d32; + color: #fff; + overflow: auto; +} + +//Contacts list -- for displaying contacts in direct chat contacts pane +.contacts-list { + &:extend(.list-unstyled); + > li { + .clearfix(); + border-bottom: 1px solid rgba(0,0,0,0.2); + padding: 10px; + margin: 0; + &:last-of-type { + border-bottom: none; + } + } +} +.contacts-list-img { + .border-radius(50%); + width: 40px; + float: left; +} +.contacts-list-info { + margin-left: 45px; + color: #fff; +} +.contacts-list-name, +.contacts-list-status { + display: block; +} +.contacts-list-name { + font-weight: 600; +} +.contacts-list-status { + font-size: 12px; +} +.contacts-list-date { + color: #aaa; + font-weight: normal; +} +.contacts-list-msg { + color: #999; +} + +//Direct Chat Variants +.direct-chat-danger { + .direct-chat-variant(@red); +} +.direct-chat-primary { + .direct-chat-variant(@light-blue); +} +.direct-chat-warning { + .direct-chat-variant(@yellow); +} +.direct-chat-info { + .direct-chat-variant(@aqua); +} +.direct-chat-success { + .direct-chat-variant(@green); +} diff --git a/theme/bootstrap/build/less/dropdown.less b/theme/bootstrap/build/less/dropdown.less new file mode 100644 index 0000000..8f1f4b1 --- /dev/null +++ b/theme/bootstrap/build/less/dropdown.less @@ -0,0 +1,347 @@ +/* + * Component: Dropdown menus + * ------------------------- + */ + +/*Dropdowns in general*/ +.dropdown-menu { + box-shadow: none; + border-color: #eee; + > li > a { + color: #777; + } + > li > a > .glyphicon, + > li > a > .fa, + > li > a > .ion{ + margin-right: 10px; + } + > li > a:hover { + background-color: lighten(@gray, 5%); + color: #333; + } + > .divider { + background-color: #eee; + } +} + +//Navbar custom dropdown menu +.navbar-nav > .notifications-menu, +.navbar-nav > .messages-menu, +.navbar-nav > .tasks-menu { + //fix width and padding + > .dropdown-menu { + > li { + position: relative; + } + width: 280px; + //Remove padding and margins + padding: 0 0 0 0; + margin: 0; + top: 100%; + } + //Define header class + > .dropdown-menu > li.header { + .border-radius(4px; 4px; 0; 0); + background-color: #ffffff; + padding: 7px 10px; + border-bottom: 1px solid #f4f4f4; + color: #444444; + font-size: 14px; + } + + + //Define footer class + > .dropdown-menu > li.footer > a { + .border-radius(0; 0; 4px; 4px); + font-size: 12px; + background-color: #fff; + padding: 7px 10px; + border-bottom: 1px solid #eeeeee; + color: #444!important; + @media (max-width: @screen-sm-max) { + background: #fff!important; + color: #444!important; + } + text-align: center; + //Hover state + &:hover { + text-decoration: none; + font-weight: normal; + } + } + + //Clear inner menu padding and margins + > .dropdown-menu > li .menu { + max-height: 200px; + margin: 0; + padding: 0; + list-style: none; + overflow-x: hidden; + > li > a { + display: block; + white-space: nowrap; /* Prevent text from breaking */ + border-bottom: 1px solid #f4f4f4; + // Hove state + &:hover { + background: #f4f4f4; + text-decoration: none; + } + } + } +} + +//Notifications menu +.navbar-nav > .notifications-menu { + > .dropdown-menu > li .menu { + // Links inside the menu + > li > a { + color: #444444; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + padding: 10px; + // Icons inside the menu + > .glyphicon, + > .fa, + > .ion { + width: 20px; + } + } + + } +} + +//Messages menu +.navbar-nav > .messages-menu { + //Inner menu + > .dropdown-menu > li .menu { + // Messages menu item + > li > a { + margin: 0; + //line-height: 20px; + padding: 10px 10px; + // User image + > div > img { + margin: auto 10px auto auto; + width: 40px; + height: 40px; + } + // Message heading + > h4 { + padding: 0; + margin: 0 0 0 45px; + color: #444444; + font-size: 15px; + position: relative; + // Small for message time display + > small { + color: #999999; + font-size: 10px; + position: absolute; + top: 0; + right: 0; + } + } + + > p { + margin: 0 0 0 45px; + font-size: 12px; + color: #888888; + } + + .clearfix(); + + } + + } +} +//Tasks menu +.navbar-nav > .tasks-menu { + > .dropdown-menu > li .menu { + > li > a { + padding: 10px; + + > h3 { + font-size: 14px; + padding: 0; + margin: 0 0 10px 0; + color: #666666; + } + + > .progress { + padding: 0; + margin: 0; + } + } + } +} +//User menu +.navbar-nav > .user-menu { + > .dropdown-menu { + .border-top-radius(0); + padding: 1px 0 0 0; + border-top-width: 0; + width: 280px; + + &, + > .user-body { + .border-bottom-radius(4px); + } + // Header menu + > li.user-header { + height: 175px; + padding: 10px; + text-align: center; + // User image + > img { + z-index: 5; + height: 90px; + width: 90px; + border: 3px solid; + border-color: transparent; + border-color: rgba(255, 255, 255, 0.2); + } + > p { + z-index: 5; + color: #fff; + color: rgba(255, 255, 255, 0.8); + font-size: 17px; + //text-shadow: 2px 2px 3px #333333; + margin-top: 10px; + > small { + display: block; + font-size: 12px; + } + } + } + + // Menu Body + > .user-body { + padding: 15px; + border-bottom: 1px solid #f4f4f4; + border-top: 1px solid #dddddd; + .clearfix(); + a { + color: #444 !important; + @media (max-width: @screen-sm-max) { + background: #fff !important; + color: #444 !important; + } + } + } + + // Menu Footer + > .user-footer { + background-color: #f9f9f9; + padding: 10px; + .clearfix(); + .btn-default { + color: #666666; + &:hover { + @media (max-width: @screen-sm-max) { + background-color: #f9f9f9; + } + } + } + } + } + .user-image { + float: left; + width: 25px; + height: 25px; + border-radius: 50%; + margin-right: 10px; + margin-top: -2px; + @media (max-width: @screen-xs-max) { + float: none; + margin-right: 0; + margin-top: -8px; + line-height: 10px; + } + } +} + +/* Add fade animation to dropdown menus by appending + the class .animated-dropdown-menu to the .dropdown-menu ul (or ol)*/ +.open:not(.dropup) > .animated-dropdown-menu { + backface-visibility: visible !important; + .animation(flipInX .7s both); + +} +@keyframes flipInX { + 0% { + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transition-timing-function: ease-in; + opacity: 0; + } + + 40% { + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transition-timing-function: ease-in; + } + + 60% { + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + 100% { + transform: perspective(400px); + } +} +@-webkit-keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-transition-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-transition-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + 100% { + -webkit-transform: perspective(400px); + } +} + +/* Fix dropdown menu in navbars */ +.navbar-custom-menu > .navbar-nav { + > li { + position: relative; + > .dropdown-menu { + position: absolute; + right: 0; + left: auto; + } + } +} +@media (max-width: @screen-sm-max) { + .navbar-custom-menu > .navbar-nav { + float: right; + > li { + position: static; + > .dropdown-menu { + position: absolute; + right: 5%; + left: auto; + border: 1px solid #ddd; + background: #fff; + } + } + } +} diff --git a/theme/bootstrap/build/less/forms.less b/theme/bootstrap/build/less/forms.less new file mode 100644 index 0000000..cdb30d1 --- /dev/null +++ b/theme/bootstrap/build/less/forms.less @@ -0,0 +1,94 @@ +/* + * Component: Form + * --------------- + */ +.form-control { + .border-radius(@input-radius); + box-shadow: none; + border-color: @gray; + &:focus { + border-color: @light-blue; + box-shadow: none; + } + &::-moz-placeholder, + &:-ms-input-placeholder, + &::-webkit-input-placeholder { + color: #bbb; + opacity: 1; + } + + &:not(select) { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + } +} + +.form-group { + &.has-success { + label { + color: @green; + } + .form-control { + border-color: @green; + box-shadow: none; + } + } + + &.has-warning { + label { + color: @yellow; + } + .form-control { + border-color: @yellow; + box-shadow: none; + } + } + + &.has-error { + label { + color: @red; + } + .form-control { + border-color: @red; + box-shadow: none; + } + } +} + +/* Input group */ +.input-group { + .input-group-addon { + .border-radius(@input-radius); + border-color: @gray; + background-color: #fff; + } +} +/* button groups */ +.btn-group-vertical { + .btn { + &.btn-flat:first-of-type, &.btn-flat:last-of-type { + .border-radius(0); + } + } +} + +.icheck > label { + padding-left: 0; +} + +/* support Font Awesome icons in form-control */ +.form-control-feedback.fa { + line-height: @input-height-base; +} + +.input-lg + .form-control-feedback.fa, +.input-group-lg + .form-control-feedback.fa, +.form-group-lg .form-control + .form-control-feedback.fa { + line-height: @input-height-large; +} +.input-sm + .form-control-feedback.fa, +.input-group-sm + .form-control-feedback.fa, +.form-group-sm .form-control + .form-control-feedback.fa { + line-height: @input-height-small; +} diff --git a/theme/bootstrap/build/less/fullcalendar.less b/theme/bootstrap/build/less/fullcalendar.less new file mode 100644 index 0000000..73a1ddc --- /dev/null +++ b/theme/bootstrap/build/less/fullcalendar.less @@ -0,0 +1,88 @@ +/* + * Plugin: Full Calendar + * --------------------- + */ +//Fullcalendar buttons +.fc-button { + background: #f4f4f4; + background-image: none; + color: #444; + border-color: #ddd; + border-bottom-color: #ddd; + &:hover, + &:active, + &.hover { + background-color: #e9e9e9; + } +} +// Calendar title +.fc-header-title h2 { + font-size: 15px; + line-height: 1.6em; + color: #666; + margin-left: 10px; +} +.fc-header-right { + padding-right: 10px; +} +.fc-header-left { + padding-left: 10px; +} +// Calendar table header cells +.fc-widget-header { + background: #fafafa; +} +.fc-grid { + width: 100%; + border: 0; +} +.fc-widget-header:first-of-type, +.fc-widget-content:first-of-type { + border-left: 0; + border-right: 0; +} +.fc-widget-header:last-of-type, +.fc-widget-content:last-of-type { + border-right: 0; +} +.fc-toolbar { + padding: @box-padding; + margin: 0; +} +.fc-day-number { + font-size: 20px; + font-weight: 300; + padding-right: 10px; +} +.fc-color-picker { + list-style: none; + margin: 0; + padding: 0; + > li { + float: left; + font-size: 30px; + margin-right: 5px; + line-height: 30px; + .fa { + .transition-transform(linear .3s); + &:hover { + .rotate(30deg); + } + } + } +} +#add-new-event { + .transition(all linear .3s); +} +.external-event { + padding: 5px 10px; + font-weight: bold; + margin-bottom: 4px; + box-shadow: @box-boxshadow; + text-shadow: @box-boxshadow; + border-radius: @box-border-radius; + cursor: move; + &:hover { + box-shadow: inset 0 0 90px rgba(0,0,0,0.2); + } +} diff --git a/theme/bootstrap/build/less/header.less b/theme/bootstrap/build/less/header.less new file mode 100644 index 0000000..1727efb --- /dev/null +++ b/theme/bootstrap/build/less/header.less @@ -0,0 +1,244 @@ +/* + * Component: Main Header + * ---------------------- + */ + +.main-header { + position: relative; + max-height: 100px; + z-index: 1030; + //Navbar + > .navbar { + .transition(margin-left @transition-speed @transition-fn); + margin-bottom: 0; + margin-left: @sidebar-width; + border: none; + min-height: @navbar-height; + border-radius: 0; + .layout-top-nav & { + margin-left: 0; + } + } + //Navbar search text input + #navbar-search-input.form-control { + background: rgba(255,255,255,.2); + border-color: transparent; + &:focus, + &:active { + border-color: rgba(0,0,0,.1); + background: rgba(255,255,255,.9); + } + &::-moz-placeholder { + color: #ccc; + opacity: 1; + } + &:-ms-input-placeholder { + color: #ccc; + } + &::-webkit-input-placeholder { + color: #ccc; + } + } + //Navbar Right Menu + .navbar-custom-menu, + .navbar-right { + float: right; + @media (max-width: @screen-sm-max) { + a { + color: inherit; + background: transparent; + } + } + } + .navbar-right { + @media (max-width: @screen-header-collapse) { + float: none; + .navbar-collapse & { + margin: 7.5px -15px; + } + > li { + color: inherit; + border: 0; + } + } + } + //Navbar toggle button + .sidebar-toggle { + float: left; + background-color: transparent; + background-image: none; + padding: @navbar-padding-vertical @navbar-padding-horizontal; + //Add the fontawesome bars icon + font-family: fontAwesome; + &:before { + content: "\f0c9"; + } + &:hover { + color: #fff; + } + &:focus, + &:active { + background: transparent; + } + } + .sidebar-toggle .icon-bar { + display: none; + } + //Navbar User Menu + .navbar .nav > li.user > a { + > .fa, + > .glyphicon, + > .ion { + margin-right: 5px; + } + } + + //Labels in navbar + .navbar .nav > li > a > .label { + position: absolute; + top: 9px; + right: 7px; + text-align: center; + font-size: 9px; + padding: 2px 3px; + line-height: .9; + } + + //Logo bar + .logo { + .transition(width @transition-speed @transition-fn); + display: block; + float: left; + height: @navbar-height; + font-size: 20px; + line-height: 50px; + text-align: center; + width: @sidebar-width; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + padding: 0 15px; + font-weight: 300; + overflow: hidden; + //Add support to sidebar mini by allowing the user to create + //2 logo designs. mini and lg + .logo-lg { + //should be visibile when sidebar isn't collapsed + display: block; + } + .logo-mini { + display: none; + } + } + //Navbar Brand. Alternative logo with layout-top-nav + .navbar-brand { + color: #fff; + } +} + +// Content Header +.content-header { + position: relative; + padding: 15px 15px 0 15px; + // Header Text + > h1 { + margin: 0; + font-size: 24px; + > small { + font-size: 15px; + display: inline-block; + padding-left: 4px; + font-weight: 300; + } + } + + > .breadcrumb { + float: right; + background: transparent; + margin-top: 0; + margin-bottom: 0; + font-size: 12px; + padding: 7px 5px; + position: absolute; + top: 15px; + right: 10px; + .border-radius(2px); + > li > a { + color: #444; + text-decoration: none; + display: inline-block; + > .fa, > .glyphicon, > .ion { + margin-right: 5px; + } + } + > li + li:before { + content: '>\00a0'; + } + } + + @media (max-width: @screen-sm-max) { + > .breadcrumb { + position: relative; + margin-top: 5px; + top: 0; + right: 0; + float: none; + background: @gray; + padding-left: 10px; + li:before { + color: darken(@gray, 20%); + } + } + } +} +.navbar-toggle { + color: #fff; + border: 0; + margin: 0; + padding: @navbar-padding-vertical @navbar-padding-horizontal; +} +//Control navbar scaffolding on x-small screens +@media (max-width: @screen-sm-max) { + .navbar-custom-menu .navbar-nav > li { + float: left; + } + //Dont't let links get full width + .navbar-custom-menu .navbar-nav { + margin: 0; + float: left; + } + + .navbar-custom-menu .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + line-height: 20px; + } +} + +// Collapse header +@media (max-width: @screen-header-collapse) { + .main-header { + position: relative; + .logo, + .navbar { + width: 100%; + float: none; + } + .navbar { + margin: 0; + } + .navbar-custom-menu { + float: right; + } + } +} + +.navbar-collapse.pull-left { + @media(max-width: @screen-sm-max) { + float: none!important; + + .navbar-custom-menu { + display: block; + position: absolute; + top: 0; + right: 40px; + } + } +} diff --git a/theme/bootstrap/build/less/info-box.less b/theme/bootstrap/build/less/info-box.less new file mode 100644 index 0000000..0abfd3d --- /dev/null +++ b/theme/bootstrap/build/less/info-box.less @@ -0,0 +1,69 @@ +/* + * Component: Info Box + * ------------------- + */ +.info-box { + display: block; + min-height: 90px; + background: #fff; + width: 100%; + box-shadow: @box-boxshadow; + .border-radius(2px); + margin-bottom: 15px; + small { + font-size: 14px; + } + .progress { + background: rgba(0,0,0,.2); + margin: 5px -10px 5px -10px; + height: 2px; + &, + & .progress-bar { + .border-radius(0); + } + .progress-bar { + background: #fff; + } + } +} +.info-box-icon { + .border-radius(2px; 0; 2px; 0); + display: block; + float: left; + height: 90px; + width: 90px; + text-align: center; + font-size: 45px; + line-height: 90px; + background: rgba(0,0,0,0.2); + > img { + max-width: 100%; + } +} +.info-box-content { + padding: 5px 10px; + margin-left: 90px; +} +.info-box-number { + display: block; + font-weight: bold; + font-size: 18px; +} +.progress-description, +.info-box-text { + display: block; + font-size: 14px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.info-box-text { + text-transform: uppercase; +} +.info-box-more { + display: block; +} + +.progress-description { + margin: 0; +} diff --git a/theme/bootstrap/build/less/invoice.less b/theme/bootstrap/build/less/invoice.less new file mode 100644 index 0000000..3d2fcf8 --- /dev/null +++ b/theme/bootstrap/build/less/invoice.less @@ -0,0 +1,16 @@ +/* + * Page: Invoice + * ------------- + */ + +.invoice { + position: relative; + background: #fff; + border: 1px solid #f4f4f4; + padding: 20px; + margin: 10px 25px; +} + +.invoice-title { + margin-top: 0; +} diff --git a/theme/bootstrap/build/less/labels.less b/theme/bootstrap/build/less/labels.less new file mode 100644 index 0000000..b21bc9b --- /dev/null +++ b/theme/bootstrap/build/less/labels.less @@ -0,0 +1,23 @@ +/* + * Component: Label + * ---------------- + */ +.label-default { + background-color: @gray; + color: #444; +} +.label-danger { + &:extend(.bg-red); +} +.label-info { + &:extend(.bg-aqua); +} +.label-warning { + &:extend(.bg-yellow); +} +.label-primary { + &:extend(.bg-light-blue); +} +.label-success { + &:extend(.bg-green); +} diff --git a/theme/bootstrap/build/less/lockscreen.less b/theme/bootstrap/build/less/lockscreen.less new file mode 100644 index 0000000..a0acb89 --- /dev/null +++ b/theme/bootstrap/build/less/lockscreen.less @@ -0,0 +1,68 @@ +/* + * Page: Lock Screen + * ----------------- + */ +/* ADD THIS CLASS TO THE <BODY> TAG */ +.lockscreen { + background: @gray; +} +.lockscreen-logo { + font-size: 35px; + text-align: center; + margin-bottom: 25px; + font-weight: 300; + a { + color: #444; + } +} +.lockscreen-wrapper { + max-width: 400px; + margin: 0 auto; + margin-top: 10%; +} +/* User name [optional] */ +.lockscreen .lockscreen-name { + text-align: center; + font-weight: 600; +} +/* Will contain the image and the sign in form */ +.lockscreen-item { + .border-radius(4px); + padding: 0; + background: #fff; + position: relative; + margin: 10px auto 30px auto; + width: 290px; +} +/* User image */ +.lockscreen-image { + .border-radius(50%); + position: absolute; + left: -10px; + top: -25px; + background: #fff; + padding: 5px; + z-index: 10; + > img { + .border-radius(50%); + width: 70px; + height: 70px; + } +} + +/* Contains the password input and the login button */ +.lockscreen-credentials { + margin-left: 70px; + .form-control { + border: 0; + } + .btn { + background-color: #fff; + border: 0; + padding: 0 10px; + } +} + +.lockscreen-footer { + margin-top: 10px; +} diff --git a/theme/bootstrap/build/less/login_and_register.less b/theme/bootstrap/build/less/login_and_register.less new file mode 100644 index 0000000..ea6c0b8 --- /dev/null +++ b/theme/bootstrap/build/less/login_and_register.less @@ -0,0 +1,50 @@ +/* + * Page: Login & Register + * ---------------------- + */ + +.login-logo, +.register-logo { + font-size: 35px; + text-align: center; + margin-bottom: 25px; + font-weight: 300; + a { + color: #444; + } +} + +.login-page, +.register-page { + background: @gray; +} + +.login-box, +.register-box { + width: 360px; + margin: 7% auto; + @media (max-width: @screen-sm) { + width: 90%; + margin-top: 20px; + } +} + +.login-box-body, +.register-box-body { + background: #fff; + padding: 20px; + border-top: 0; + color: #666; + .form-control-feedback { + color: #777; + } +} +.login-box-msg, +.register-box-msg { + margin: 0; + text-align: center; + padding: 0 20px 20px 20px; +} +.social-auth-links { + margin: 10px 0; +} diff --git a/theme/bootstrap/build/less/mailbox.less b/theme/bootstrap/build/less/mailbox.less new file mode 100644 index 0000000..7575301 --- /dev/null +++ b/theme/bootstrap/build/less/mailbox.less @@ -0,0 +1,77 @@ +/* + * Page: Mailbox + * ------------- + */ +.mailbox-messages { + > .table { + margin: 0; + } +} +.mailbox-controls { + padding: 5px; + &.with-border { + border-bottom: 1px solid @box-border-color; + } +} +.mailbox-read-info { + border-bottom: 1px solid @box-border-color; + padding: 10px; + h3 { + font-size: 20px; + margin: 0; + } + h5 { + margin: 0; + padding: 5px 0 0 0; + } +} +.mailbox-read-time { + color: #999; + font-size: 13px; +} +.mailbox-read-message { + padding: 10px; +} +.mailbox-attachments { + &:extend(.list-unstyled); + li { + float: left; + width: 200px; + border: 1px solid #eee; + margin-bottom: 10px; + margin-right: 10px; + } +} +.mailbox-attachment-name { + font-weight: bold; + color: #666; +} +.mailbox-attachment-icon, +.mailbox-attachment-info, +.mailbox-attachment-size { + display: block; +} +.mailbox-attachment-info { + padding: 10px; + background: #f4f4f4; +} +.mailbox-attachment-size { + color: #999; + font-size: 12px; +} +.mailbox-attachment-icon { + text-align: center; + font-size: 65px; + color: #666; + padding: 20px 10px; + &.has-img { + padding: 0; + > img { + max-width: 100%; + height: auto; + } + } +} +.mailbox-attachment-close { + &:extend(.close); +} diff --git a/theme/bootstrap/build/less/miscellaneous.less b/theme/bootstrap/build/less/miscellaneous.less new file mode 100644 index 0000000..72f96f9 --- /dev/null +++ b/theme/bootstrap/build/less/miscellaneous.less @@ -0,0 +1,529 @@ +/* + * General: Miscellaneous + * ---------------------- + */ +// 10px padding and margins +.pad { + padding: 10px; +} +.margin { + margin: 10px; +} +.margin-bottom { + margin-bottom: 20px; +} +.margin-bottom-none { + margin-bottom: 0; +} +.margin-r-5 { + margin-right: 5px; +} +// Display inline +.inline { + display: inline; +} + +// Description Blocks +.description-block { + display: block; + margin: 10px 0; + text-align: center; + &.margin-bottom { + margin-bottom: 25px; + } + > .description-header { + margin: 0; + padding: 0; + font-weight: 600; + font-size: 16px; + } + > .description-text { + text-transform: uppercase; + } +} + +// Background colors +.bg-red, +.bg-yellow, +.bg-aqua, +.bg-blue, +.bg-light-blue, +.bg-green, +.bg-navy, +.bg-teal, +.bg-olive, +.bg-lime, +.bg-orange , +.bg-fuchsia, +.bg-purple, +.bg-maroon, +.bg-black, +.bg-red-active, +.bg-yellow-active, +.bg-aqua-active, +.bg-blue-active, +.bg-light-blue-active, +.bg-green-active, +.bg-navy-active, +.bg-teal-active, +.bg-olive-active, +.bg-lime-active, +.bg-orange-active, +.bg-fuchsia-active, +.bg-purple-active, +.bg-maroon-active, +.bg-black-active { + color: #fff !important; +} +.bg-gray { + color: #000; + background-color: @gray!important; +} +.bg-gray-light { + background-color: #f7f7f7; +} +.bg-black { + background-color: @black!important; +} +.bg-red { + background-color: @red !important; +} +.bg-yellow { + background-color: @yellow !important; +} +.bg-aqua { + background-color: @aqua !important; +} +.bg-blue { + background-color: @blue !important; +} +.bg-light-blue { + background-color: @light-blue !important; +} +.bg-green { + background-color: @green !important; +} +.bg-navy { + background-color: @navy !important; +} +.bg-teal { + background-color: @teal !important; +} +.bg-olive { + background-color: @olive !important; +} +.bg-lime { + background-color: @lime !important; +} +.bg-orange { + background-color: @orange !important; +} +.bg-fuchsia { + background-color: @fuchsia !important; +} +.bg-purple { + background-color: @purple !important; +} +.bg-maroon { + background-color: @maroon !important; +} + +//Set of Active Background Colors +.bg-gray-active { + color: #000; + background-color: darken(@gray,10%)!important; +} +.bg-black-active { + background-color: darken(@black, 10%)!important; +} +.bg-red-active { + background-color: darken(@red , 6%)!important; +} +.bg-yellow-active { + background-color: darken(@yellow , 6%)!important; +} +.bg-aqua-active { + background-color: darken(@aqua , 6%)!important; +} +.bg-blue-active { + background-color: darken(@blue , 10%)!important; +} +.bg-light-blue-active { + background-color: darken(@light-blue , 6%)!important; +} +.bg-green-active { + background-color: darken(@green , 5%)!important; +} +.bg-navy-active { + background-color: darken(@navy , 2%)!important; +} +.bg-teal-active { + background-color: darken(@teal , 5%)!important; +} +.bg-olive-active { + background-color: darken(@olive , 5%)!important; +} +.bg-lime-active { + background-color: darken(@lime , 5%)!important; +} +.bg-orange-active { + background-color: darken(@orange , 5%)!important; +} +.bg-fuchsia-active { + background-color: darken(@fuchsia , 5%)!important; +} +.bg-purple-active { + background-color: darken(@purple , 5%)!important; +} +.bg-maroon-active { + background-color: darken(@maroon , 3%)!important; +} + +//Disabled! +[class^="bg-"].disabled { + .opacity(.65); +} + +// Text colors +.text-red { + color: @red !important; +} +.text-yellow { + color: @yellow !important; +} +.text-aqua { + color: @aqua !important; +} +.text-blue { + color: @blue !important; +} +.text-black { + color: @black!important; +} +.text-light-blue { + color: @light-blue !important; +} +.text-green { + color: @green !important; +} +.text-gray { + color: @gray !important; +} +.text-navy { + color: @navy !important; +} +.text-teal { + color: @teal !important; +} +.text-olive { + color: @olive !important; +} +.text-lime { + color: @lime !important; +} +.text-orange { + color: @orange !important; +} +.text-fuchsia { + color: @fuchsia !important; +} +.text-purple { + color: @purple !important; +} +.text-maroon { + color: @maroon !important; +} +.link-muted { + color: darken(@gray, 30%); + &:hover, + &:focus { + color: darken(@gray, 40%); + } +} +.link-black { + color: #666; + &:hover, + &:focus { + color: #999; + } +} + +// Hide elements by display none only +.hide { + display: none !important; +} + +// Remove borders +.no-border { + border: 0 !important; +} +// Remove padding +.no-padding { + padding: 0 !important; +} +// Remove margins +.no-margin { + margin: 0 !important; +} + +// Remove box shadow +.no-shadow { + box-shadow: none!important; +} + +// Unstyled List +.list-unstyled { + list-style: none; + margin: 0; + padding: 0; +} + +.list-group-unbordered { + > .list-group-item { + border-left: 0; + border-right: 0; + border-radius: 0; + padding-left: 0; + padding-right: 0; + } +} + +// Remove border radius +.flat { + .border-radius(0)!important; +} + +.text-bold { + &, &.table td, &.table th { + font-weight: 700; + } +} +.text-sm { + font-size: 12px; +} + +// _fix for sparkline tooltip +.jqstooltip{ + padding: 5px!important; + width:auto!important; + height:auto!important; +} + + +// Gradient Background colors +.bg-teal-gradient { + .gradient(@teal; @teal; lighten(@teal, 16%))!important; + color: #fff; +} +.bg-light-blue-gradient { + .gradient(@light-blue; @light-blue; lighten(@light-blue, 12%))!important; + color: #fff; +} +.bg-blue-gradient { + .gradient(@blue; @blue; lighten(@blue, 7%))!important; + color: #fff; +} +.bg-aqua-gradient { + .gradient(@aqua; @aqua; lighten(@aqua, 7%))!important; + color: #fff; +} +.bg-yellow-gradient { + .gradient(@yellow; @yellow; lighten(@yellow, 16%))!important; + color: #fff; +} +.bg-purple-gradient { + .gradient(@purple; @purple; lighten(@purple, 16%))!important; + color: #fff; +} +.bg-green-gradient { + .gradient(@green; @green; lighten(@green, 7%))!important; + color: #fff; +} +.bg-red-gradient { + .gradient(@red; @red; lighten(@red, 10%))!important; + color: #fff; +} +.bg-black-gradient { + .gradient(@black; @black; lighten(@black, 10%))!important; + color: #fff; +} +.bg-maroon-gradient { + .gradient(@maroon; @maroon; lighten(@maroon, 10%))!important; + color: #fff; +} + +//Description Block Extension +.description-block { + .description-icon { + font-size: 16px; + } +} + +//Remove top padding +.no-pad-top { + padding-top: 0; +} + +//Make position static +.position-static { + position: static!important; +} + +//List utility classes +.list-header { + font-size: 15px; + padding: 10px 4px; + font-weight: bold; + color: #666; +} +.list-seperator { + height: 1px; + background: @box-border-color; + margin: 15px 0 9px 0; +} +.list-link { + > a { + padding: 4px; + color: #777; + &:hover { + color: #222; + } + } +} + +//Light font weight +.font-light { + font-weight: 300; +} + +//User block +.user-block { + .clearfix(); + img { + width: 40px; + height: 40px; + float: left; + } + .username, + .description, + .comment { + display: block; + margin-left: 50px; + } + .username { + font-size: 16px; + font-weight: 600; + } + .description { + color: #999; + font-size: 13px; + } + &.user-block-sm { + img { + &:extend(.img-sm); + } + .username, + .description, + .comment { + margin-left: 40px; + } + .username { + font-size: 14px; + } + } +} + +//Image sizes +.img-sm, +.img-md, +.img-lg { + float: left; +} +.img-sm { + width: 30px!important; + height: 30px!important; + + .img-push { + margin-left: 40px; + } +} +.img-md { + width: 60px; + height: 60px; + + .img-push { + margin-left: 70px; + } +} +.img-lg { + width: 100px; + height: 100px; + + .img-push { + margin-left: 110px; + } +} +// Image bordered +.img-bordered { + border: 3px solid @gray; + padding: 3px; +} +.img-bordered-sm { + border: 2px solid @gray; + padding: 2px; +} +//General attachemnt block +.attachment-block { + border: 1px solid @box-border-color; + padding: 5px; + margin-bottom: 10px; + background: #f7f7f7; + + .attachment-img { + max-width: 100px; + max-height: 100px; + height: auto; + float: left; + } + .attachment-pushed { + margin-left: 110px; + } + .attachment-heading { + margin: 0; + } + .attachment-text { + color: #555; + } +} + +.connectedSortable { + min-height: 100px; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.sort-highlight { + background: #f4f4f4; + border: 1px dashed #ddd; + margin-bottom: 10px; +} +.full-opacity-hover { + .opacity(.65); + &:hover { + .opacity(1); + } +} +// Charts +.chart { + position: relative; + overflow: hidden; + width: 100%; + svg, + canvas { + width: 100%!important; + } +} diff --git a/theme/bootstrap/build/less/mixins.less b/theme/bootstrap/build/less/mixins.less new file mode 100644 index 0000000..ff801d4 --- /dev/null +++ b/theme/bootstrap/build/less/mixins.less @@ -0,0 +1,302 @@ +//AdminLTE mixins +//=============== + + +//Changes the color and the hovering properties of the navbar +.navbar-variant(@color; @font-color: rgba(255, 255, 255, 0.8); @hover-color: #f6f6f6; @hover-bg: rgba(0, 0, 0, 0.1)) { + background-color: @color; + //Navbar links + .nav > li > a { + color: @font-color; + } + + .nav > li > a:hover, + .nav > li > a:active, + .nav > li > a:focus, + .nav .open > a, + .nav .open > a:hover, + .nav .open > a:focus, + .nav > .active > a { + background: @hover-bg; + color: @hover-color; + } + + //Add color to the sidebar toggle button + .sidebar-toggle { + color: @font-color; + &:hover { + color: @hover-color; + background: @hover-bg; + } + } +} + +//Logo color variation +.logo-variant(@bg-color; @color: #fff; @border-bottom-color: transparent; @border-bottom-width: 0) { + background-color: @bg-color; + color: @color; + border-bottom: @border-bottom-width solid @border-bottom-color; + + &:hover { + background-color: darken(@bg-color, 1%); + } +} + +//Box solid color variantion creator +.box-solid-variant(@color; @text-color: #fff) { + border: 1px solid @color; + > .box-header { + color: @text-color; + background: @color; + background-color: @color; + a, + .btn { + color: @text-color; + } + } +} + +//Direct Chat Variant +.direct-chat-variant(@bg-color; @color: #fff) { + .right > .direct-chat-text { + background: @bg-color; + border-color: @bg-color; + color: @color; + &:after, + &:before { + border-left-color: @bg-color; + } + } +} + +//border radius creator +.border-radius(@radius) { + border-radius: @radius; +} +//Different radius each side +.border-radius(@top-left; @top-right; @bottom-left; @bottom-right) { + border-top-left-radius: @top-left; + border-top-right-radius: @top-right; + border-bottom-right-radius: @bottom-right; + border-bottom-left-radius: @bottom-left; +} + +//Gradient background +.gradient(@color: #F5F5F5, @start: #EEE, @stop: #FFF) { + background: @color; + background: -webkit-gradient(linear, + left bottom, + left top, + color-stop(0, @start), + color-stop(1, @stop)); + background: -ms-linear-gradient(bottom, + @start, + @stop); + background: -moz-linear-gradient(center bottom, + @start 0%, + @stop 100%); + background: -o-linear-gradient(@stop, + @start); + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",@stop,@start)); +} + +//Added 2.1.0 +//Skins Mixins + +//Dark Sidebar Mixin +.skin-dark-sidebar(@link-hover-border-color) { + // Sidebar background color (Both .wrapper and .left-side are responsible for sidebar bg color) + .wrapper, + .main-sidebar, + .left-side { + background-color: @sidebar-dark-bg; + } + //User Panel (resides in the sidebar) + .user-panel { + > .info, > .info > a { + color: #fff; + } + } + //Sidebar Menu. First level links + .sidebar-menu > li { + //Section Headning + &.header { + color: lighten(@sidebar-dark-bg, 20%); + background: darken(@sidebar-dark-bg, 4%); + } + //links + > a { + border-left: 3px solid transparent; + } + //Hover and active states + &:hover > a, &.active > a { + color: @sidebar-dark-hover-color; + background: @sidebar-dark-hover-bg; + border-left-color: @link-hover-border-color; + } + //First Level Submenu + > .treeview-menu { + margin: 0 1px; + background: @sidebar-dark-submenu-bg; + } + } + //All links within the sidebar menu + .sidebar a { + color: @sidebar-dark-color; + &:hover { + text-decoration: none; + } + } + //All submenus + .treeview-menu { + > li { + > a { + color: @sidebar-dark-submenu-color; + } + &.active > a, > a:hover { + color: @sidebar-dark-submenu-hover-color; + } + } + } + //The sidebar search form + .sidebar-form { + .border-radius(3px); + border: 1px solid lighten(@sidebar-dark-bg, 10%); + margin: 10px 10px; + input[type="text"], .btn { + box-shadow: none; + background-color: lighten(@sidebar-dark-bg, 10%); + border: 1px solid transparent; + height: 35px; + .transition(all @transition-speed @transition-fn); + } + input[type="text"] { + color: #666; + .border-radius(2px, 0, 2px, 0); + &:focus, &:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; + } + &:focus + .input-group-btn .btn { + border-left-color: #fff; + } + } + .btn { + color: #999; + .border-radius(0, 2px, 0, 2px); + } + } +} + +//Light Sidebar Mixin +.skin-light-sidebar(@icon-active-color) { + // Sidebar background color (Both .wrapper and .left-side are responsible for sidebar bg color) + .wrapper, + .main-sidebar, + .left-side { + background-color: @sidebar-light-bg; + } + .content-wrapper, + .main-footer { + border-left: 1px solid @gray; + } + //User Panel (resides in the sidebar) + .user-panel { + > .info, > .info > a { + color: @sidebar-light-color; + } + } + //Sidebar Menu. First level links + .sidebar-menu > li { + .transition(border-left-color .3s ease); + //border-left: 3px solid transparent; + //Section Headning + &.header { + color: lighten(@sidebar-light-color, 25%); + background: @sidebar-light-bg; + } + //links + > a { + border-left: 3px solid transparent; + font-weight: 600; + } + //Hover and active states + &:hover > a, + &.active > a { + color: @sidebar-light-hover-color; + background: @sidebar-light-hover-bg; + } + &:hover > a { + + } + &.active { + border-left-color: @icon-active-color; + > a { + font-weight: 600; + } + } + //First Level Submenu + > .treeview-menu { + background: @sidebar-light-submenu-bg; + } + } + //All links within the sidebar menu + .sidebar a { + color: @sidebar-light-color; + &:hover { + text-decoration: none; + } + } + //All submenus + .treeview-menu { + > li { + > a { + color: @sidebar-light-submenu-color; + } + &.active > a, + > a:hover { + color: @sidebar-light-submenu-hover-color; + } + &.active > a { + font-weight: 600; + } + } + } + //The sidebar search form + .sidebar-form { + .border-radius(3px); + border: 1px solid @gray;//darken(@sidebar-light-bg, 5%); + margin: 10px 10px; + input[type="text"], + .btn { + box-shadow: none; + background-color: #fff;//darken(@sidebar-light-bg, 3%); + border: 1px solid transparent; + height: 35px; + .transition(all @transition-speed @transition-fn); + } + input[type="text"] { + color: #666; + .border-radius(2px, 0, 2px, 0); + &:focus, + &:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; + } + &:focus + .input-group-btn .btn { + border-left-color: #fff; + } + } + .btn { + color: #999; + .border-radius(0, 2px, 0, 2px); + } + } + @media(min-width: @screen-sm-min) { + &.sidebar-mini.sidebar-collapse { + .sidebar-menu > li > .treeview-menu { + border-left: 1px solid @gray; + } + } + } +} diff --git a/theme/bootstrap/build/less/modal.less b/theme/bootstrap/build/less/modal.less new file mode 100644 index 0000000..dd67b4a --- /dev/null +++ b/theme/bootstrap/build/less/modal.less @@ -0,0 +1,73 @@ +/* + * Component: modal + * ---------------- + */ +.modal { + background: rgba(0,0,0,.3); +} +.modal-content { + .border-radius(0); + .box-shadow(0 2px 3px rgba(0,0,0,.125)); + border: 0; + @media (min-width: @screen-sm-min) { + .box-shadow(0 2px 3px rgba(0,0,0,.125)); + } +} +.modal-header { + border-bottom-color: @box-border-color; +} +.modal-footer { + border-top-color: @box-border-color; +} + +//Modal variants +.modal-primary { + .modal-body { + &:extend(.bg-light-blue); + } + .modal-header, + .modal-footer { + &:extend(.bg-light-blue-active); + border-color: darken(@light-blue, 10%); + } +} +.modal-warning { + .modal-body { + &:extend(.bg-yellow); + } + .modal-header, + .modal-footer { + &:extend(.bg-yellow-active); + border-color: darken(@yellow, 10%); + } +} +.modal-info { + .modal-body { + &:extend(.bg-aqua); + } + .modal-header, + .modal-footer { + &:extend(.bg-aqua-active); + border-color: darken(@aqua, 10%); + } +} +.modal-success { + .modal-body { + &:extend(.bg-green); + } + .modal-header, + .modal-footer { + &:extend(.bg-green-active); + border-color: darken(@green, 10%); + } +} +.modal-danger { + .modal-body { + &:extend(.bg-red); + } + .modal-header, + .modal-footer { + &:extend(.bg-red-active); + border-color: darken(@red, 10%); + } +} diff --git a/theme/bootstrap/build/less/navs.less b/theme/bootstrap/build/less/navs.less new file mode 100644 index 0000000..45eb851 --- /dev/null +++ b/theme/bootstrap/build/less/navs.less @@ -0,0 +1,182 @@ +/* + * Component: Nav + * -------------- + */ + +.nav { + > li > a:hover, + > li > a:active, + > li > a:focus { + color: #444; + background: #f7f7f7; + } +} + +/* NAV PILLS */ +.nav-pills { + > li > a { + .border-radius(0); + border-top: 3px solid transparent; + color: #444; + > .fa, + > .glyphicon, + > .ion { + margin-right: 5px; + } + } + > li.active > a, + > li.active > a:hover, + > li.active > a:focus { + border-top-color: @light-blue; + } + > li.active > a { + font-weight: 600; + } +} +/* NAV STACKED */ +.nav-stacked { + > li > a { + .border-radius(0); + border-top: 0; + border-left: 3px solid transparent; + color: #444; + } + > li.active > a, + > li.active > a:hover { + background: transparent; + color: #444; + border-top: 0; + border-left-color: @light-blue; + } + + > li.header { + border-bottom: 1px solid #ddd; + color: #777; + margin-bottom: 10px; + padding: 5px 10px; + text-transform: uppercase; + } +} + +/* NAV TABS */ +.nav-tabs-custom { + margin-bottom: 20px; + background: #fff; + box-shadow: @box-boxshadow; + border-radius: @box-border-radius; + > .nav-tabs { + margin: 0; + border-bottom-color: #f4f4f4; + .border-top-radius(@box-border-radius); + > li { + border-top: 3px solid transparent; + margin-bottom: -2px; + > a { + color: #444; + .border-radius(0); + &.text-muted { + color: #999; + } + &, + &:hover { + background: transparent; + margin: 0; + } + &:hover { + color: #999; + } + } + &:not(.active) { + > a:hover, + > a:focus, + > a:active { + border-color: transparent; + } + } + margin-right: 5px; + } + + > li.active { + border-top-color: @light-blue; + & > a, + &:hover > a { + background-color: #fff; + color: #444; + } + > a { + border-top-color: transparent; + border-left-color: #f4f4f4; + border-right-color: #f4f4f4; + } + + } + + > li:first-of-type { + margin-left: 0; + &.active { + > a { + border-left-color: transparent; + } + } + } + + //Pulled to the right + &.pull-right { + float: none!important; + > li { + float: right; + } + > li:first-of-type { + margin-right: 0; + > a { + border-left-width: 1px; + } + &.active { + > a { + border-left-color: #f4f4f4; + border-right-color: transparent; + } + } + } + } + + > li.header { + line-height: 35px; + padding: 0 10px; + font-size: 20px; + color: #444; + > .fa, + > .glyphicon, + > .ion { + margin-right: 5px; + } + } + } + + > .tab-content { + background: #fff; + padding: 10px; + .border-bottom-radius(@box-border-radius); + } + + .dropdown.open > a { + &:active, + &:focus { + background: transparent; + color: #999; + } + } +} + +/* PAGINATION */ +.pagination { + > li > a { + background: #fafafa; + color: #666; + } + &.pagination-flat { + > li > a { + .border-radius(0)!important; + } + } +} \ No newline at end of file diff --git a/theme/bootstrap/build/less/print.less b/theme/bootstrap/build/less/print.less new file mode 100644 index 0000000..9cd4623 --- /dev/null +++ b/theme/bootstrap/build/less/print.less @@ -0,0 +1,48 @@ +/* + * Misc: print + * ----------- + */ +@media print { + //Add to elements that you do not want to show when printing + .no-print { + display: none!important; + } + //Elements that we want to hide when printing + .main-sidebar, + .left-side, + .main-header, + .content-header { + &:extend(.no-print); + } + //This is the only element that should appear, so let's remove the margins + .content-wrapper, + .right-side, + .main-footer { + margin-left: 0!important; + min-height: 0!important; + .translate(0,0)!important; + } + .fixed .content-wrapper, + .fixed .right-side { + padding-top: 0!important; + } + //Invoice printing + .invoice { + width: 100%; + border: 0; + margin: 0; + padding: 0; + } + .invoice-col { + float: left; + width: 33.3333333%; + } + //Make sure table content displays properly + .table-responsive { + overflow: auto; + > .table tr th, + > .table tr td { + white-space: normal!important; + } + } +} diff --git a/theme/bootstrap/build/less/products.less b/theme/bootstrap/build/less/products.less new file mode 100644 index 0000000..f2f79e4 --- /dev/null +++ b/theme/bootstrap/build/less/products.less @@ -0,0 +1,44 @@ +/* + * Component: Products List + * ------------------------ + */ +.products-list { + list-style: none; + margin: 0; + padding: 0; + > .item { + .border-radius(@box-border-radius); + .box-shadow(@box-boxshadow); + .clearfix(); + padding: 10px 0; + background: #fff; + } + .product-img { + float: left; + img { + width: 50px; + height: 50px; + } + } + .product-info { + margin-left: 60px; + } + .product-title { + font-weight: 600; + } + .product-description { + display: block; + color: #999; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } +} +.product-list-in-box > .item { + .box-shadow(none); + .border-radius(0); + border-bottom: 1px solid @box-border-color; + &:last-of-type { + border-bottom-width: 0; + } +} diff --git a/theme/bootstrap/build/less/profile.less b/theme/bootstrap/build/less/profile.less new file mode 100644 index 0000000..8fd1a83 --- /dev/null +++ b/theme/bootstrap/build/less/profile.less @@ -0,0 +1,29 @@ +/* + * Page: Profile + * ------------- + */ + +.profile-user-img { + margin: 0 auto; + width: 100px; + padding: 3px; + border: 3px solid @gray; +} +.profile-username { + font-size: 21px; + margin-top: 5px; +} +.post { + border-bottom: 1px solid @gray; + margin-bottom: 15px; + padding-bottom: 15px; + color: #666; + &:last-of-type { + border-bottom: 0; + margin-bottom: 0; + padding-bottom: 0; + } + .user-block { + margin-bottom: 15px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/build/less/progress-bars.less b/theme/bootstrap/build/less/progress-bars.less new file mode 100644 index 0000000..0aafb56 --- /dev/null +++ b/theme/bootstrap/build/less/progress-bars.less @@ -0,0 +1,107 @@ +/* + * Component: Progress Bar + * ----------------------- + */ + +//General CSS +.progress, +.progress > .progress-bar { + .box-shadow(none); + &, .progress-bar { + .border-radius(@progress-bar-border-radius); + } +} + +/* size variation */ +.progress.sm, +.progress-sm { + height: 10px; + &, .progress-bar { + .border-radius(@progress-bar-sm-border-radius); + } +} +.progress.xs, +.progress-xs { + height: 7px; + &, .progress-bar { + .border-radius(@progress-bar-xs-border-radius); + } +} +.progress.xxs, +.progress-xxs { + height: 3px; + &, .progress-bar { + .border-radius(@progress-bar-xs-border-radius); + } +} +/* Vertical bars */ +.progress.vertical { + position: relative; + width: 30px; + height: 200px; + display: inline-block; + margin-right: 10px; + > .progress-bar { + width: 100%; + position: absolute; + bottom: 0; + } + + //Sizes + &.sm, + &.progress-sm{ + width: 20px; + } + + &.xs, + &.progress-xs{ + width: 10px; + } + &.xxs, + &.progress-xxs{ + width: 3px; + } +} + +//Progress Groups +.progress-group { + .progress-text { + font-weight: 600; + } + .progress-number { + float: right; + } +} + +/* Remove margins from progress bars when put in a table */ +.table { + tr > td .progress { + margin: 0; + } +} + +// Variations +// ------------------------- +.progress-bar-light-blue, +.progress-bar-primary { + .progress-bar-variant(@light-blue); +} +.progress-bar-green, +.progress-bar-success { + .progress-bar-variant(@green); +} + +.progress-bar-aqua, +.progress-bar-info { + .progress-bar-variant(@aqua); +} + +.progress-bar-yellow, +.progress-bar-warning { + .progress-bar-variant(@yellow); +} + +.progress-bar-red, +.progress-bar-danger { + .progress-bar-variant(@red); +} diff --git a/theme/bootstrap/build/less/select2.less b/theme/bootstrap/build/less/select2.less new file mode 100644 index 0000000..596eef8 --- /dev/null +++ b/theme/bootstrap/build/less/select2.less @@ -0,0 +1,102 @@ +/* + * Plugin: Select2 + * --------------- + */ + +//Signle select +.select2-container--default, +.select2-selection { + &.select2-container--focus, + &:focus, + &:active { + outline: none; + } + .select2-selection--single { + border: 1px solid @gray; + border-radius: @input-radius; + padding: 6px 12px; + height: 34px; + } +} +.select2-container--default.select2-container--open { + border-color: @light-blue; +} +.select2-dropdown { + border: 1px solid @gray; + border-radius: @input-radius; +} +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: @light-blue; + color: white; +} +.select2-results__option { + padding: 6px 12px; + user-select: none; + -webkit-user-select: none; } +.select2-container .select2-selection--single .select2-selection__rendered { + padding-left: 0; + padding-right: 0; + height: auto; + margin-top: -4px; +} +.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { + padding-right: 6px; + padding-left: 20px; +} +.select2-container--default .select2-selection--single .select2-selection__arrow { + height: 28px; + right: 3px; +} +.select2-container--default .select2-selection--single .select2-selection__arrow b { + margin-top: 0; +} +.select2-dropdown, +.select2-search--inline { + .select2-search__field { + border: 1px solid @gray; + &:focus { + outline: none; + border: 1px solid @light-blue; + } + } +} +.select2-container--default .select2-results__option[aria-disabled=true] { + color: #999; +} +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #ddd; + &, + &:hover { + color: #444; + } +} + +//Multiple select +.select2-container--default { + .select2-selection--multiple { + border: 1px solid @gray; + border-radius: @input-radius; + &:focus { + border-color: @light-blue; + } + } + &.select2-container--focus .select2-selection--multiple { + border-color: @gray; + } +} +.select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: @light-blue; + border-color: darken(@light-blue, 5%); + padding: 1px 10px; + color: #fff; +} +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + margin-right: 5px; + color: rgba(255,255,255,.7); + &:hover { + color: #fff; + } +} +.select2-container .select2-selection--single .select2-selection__rendered { + padding-right: 10px; +} diff --git a/theme/bootstrap/build/less/sidebar-mini.less b/theme/bootstrap/build/less/sidebar-mini.less new file mode 100644 index 0000000..edc94c9 --- /dev/null +++ b/theme/bootstrap/build/less/sidebar-mini.less @@ -0,0 +1,138 @@ +/* + * Component: Sidebar Mini + */ + +//Add sidebar-mini class to the body tag to activate this feature +.sidebar-mini { + //Sidebar mini should work only on devices larger than @screen-sm + @media (min-width: @screen-sm) { + //When the sidebar is collapsed... + &.sidebar-collapse { + + //Apply the new margining to the main content and footer + .content-wrapper, + .right-side, + .main-footer { + margin-left: 50px!important; + z-index: 840; + } + + //Modify the sidebar to shrink instead of disappearing + .main-sidebar { + //Don't go away! Just shrink + .translate(0, 0); + width: 50px!important; + z-index: 850; + } + + .sidebar-menu { + > li { + position: relative; + > a { + margin-right: 0; + } + > a > span { + border-top-right-radius: 4px; + } + + &:not(.treeview) { + > a > span { + border-bottom-right-radius: 4px; + } + } + + > .treeview-menu { + //Add some padding to the treeview menu + padding-top: 5px; + padding-bottom: 5px; + border-bottom-right-radius: 4px; + } + + //Show menu items on hover + &:hover { + > a { + //overflow: visible; + } + > a > span:not(.pull-right), + > .treeview-menu { + display: block!important; + position: absolute; + width: @sidebar-width - 50; + left: 50px; + } + + //position the header & treeview menus + > a > span { + top: 0; + margin-left: -3px; + padding: 12px 5px 12px 20px; + background-color: inherit; + } + > .treeview-menu { + top: 44px; + margin-left: 0; + } + } + } + } + + //Make the sidebar links, menus, labels, badges + //and angle icons disappear + .main-sidebar .user-panel > .info, + .sidebar-form, + .sidebar-menu > li > a > span, + .sidebar-menu > li > .treeview-menu, + .sidebar-menu >li > a > .pull-right, + .sidebar-menu li.header { + display: none!important; + -webkit-transform: translateZ(0); + } + + .main-header { + //Let's make the logo also shrink and the mini logo to appear + .logo { + width: 50px; + > .logo-mini { + display: block; + margin-left: -15px; + margin-right: -15px; + font-size: 18px; + } + > .logo-lg { + display: none; + } + } + + //Since the logo got smaller, we need to fix the navbar's position + .navbar { + margin-left: 50px; + } + } + } + } +} + +//A fix for text overflow while transitioning from sidebar mini to full sidebar +.sidebar-menu, +.main-sidebar .user-panel, +.sidebar-menu > li.header { + white-space: nowrap; + overflow: hidden; +} +.sidebar-menu:hover { + overflow: visible; +} +.sidebar-form, +.sidebar-menu > li.header { + overflow: hidden; + text-overflow: clip; +} +.sidebar-menu li > a { + position: relative; + > .pull-right { + position: absolute; + top: 50%; + right: 10px; + margin-top: -7px; + } +} diff --git a/theme/bootstrap/build/less/sidebar.less b/theme/bootstrap/build/less/sidebar.less new file mode 100644 index 0000000..3ca8868 --- /dev/null +++ b/theme/bootstrap/build/less/sidebar.less @@ -0,0 +1,157 @@ +/* + * Component: Sidebar + * ------------------ + */ +//Main Sidebar +// ``` .left-side has been deprecated as of 2.0.0 in favor of .main-sidebar ``` + +.main-sidebar, +.left-side { + position: absolute; + top: 0; + left: 0; + padding-top: 50px; + min-height: 100%; + width: @sidebar-width; + z-index: 810; + //Using disposable variable to join statements with a comma + @transition-rule: @transition-speed @transition-fn, + width @transition-speed @transition-fn; + .transition-transform(@transition-rule); + @media (max-width: @screen-header-collapse) { + padding-top: 100px; + } + @media (max-width: @screen-xs-max) { + .translate(-@sidebar-width, 0); + } + .sidebar-collapse & { + @media (min-width: @screen-sm) { + .translate(-@sidebar-width, 0); + } + } + .sidebar-open & { + @media (max-width: @screen-xs-max) { + .translate(0, 0); + } + } +} + +.sidebar { + padding-bottom: 10px; +} +// remove border from form +.sidebar-form { + input:focus { + border-color: transparent; + } +} + +//Sidebar user panel +.user-panel { + position: relative; + width: 100%; + padding: 10px; + overflow: hidden; + .clearfix(); + > .image > img { + width: 100%; + max-width: 45px; + height: auto; + } + > .info { + padding: 5px 5px 5px 15px; + line-height: 1; + position: absolute; + left: 55px; + > p { + font-weight: 600; + margin-bottom: 9px; + } + > a { + text-decoration: none; + padding-right: 5px; + margin-top: 3px; + font-size: 11px; + > .fa, + > .ion, + > .glyphicon { + margin-right: 3px; + } + } + } +} + +// Sidebar menu +.sidebar-menu { + list-style: none; + margin: 0; + padding: 0; + //First Level + > li { + position: relative; + margin: 0; + padding: 0; + > a { + padding: 12px 5px 12px 15px; + display: block; + > .fa, + > .glyphicon, + > .ion { + width: 20px; + } + } + .label, + .badge { + margin-top: 3px; + margin-right: 5px; + } + } + li.header { + padding: 10px 25px 10px 15px; + font-size: 12px; + } + li > a > .fa-angle-left { + width: auto; + height: auto; + padding: 0; + margin-right: 10px; + margin-top: 3px; + } + li.active { + > a > .fa-angle-left { + .rotate(-90deg); + } + > .treeview-menu { + display: block; + } + } + + // Tree view menu + .treeview-menu { + display: none; + list-style: none; + padding:0; + margin:0; + padding-left: 5px; + .treeview-menu { + padding-left: 20px; + } + > li { + margin: 0; + > a { + padding: 5px 5px 5px 15px; + display: block; + font-size: 14px; + > .fa, + > .glyphicon, + > .ion { + width: 20px; + } + > .fa-angle-left, + > .fa-angle-down { + width: auto; + } + } + } + } +} diff --git a/theme/bootstrap/build/less/skins/_all-skins.less b/theme/bootstrap/build/less/skins/_all-skins.less new file mode 100644 index 0000000..ec07547 --- /dev/null +++ b/theme/bootstrap/build/less/skins/_all-skins.less @@ -0,0 +1,13 @@ +//All skins in one file +@import "skin-blue.less"; +@import "skin-blue-light.less"; +@import "skin-black.less"; +@import "skin-black-light.less"; +@import "skin-green.less"; +@import "skin-green-light.less"; +@import "skin-red.less"; +@import "skin-red-light.less"; +@import "skin-yellow.less"; +@import "skin-yellow-light.less"; +@import "skin-purple.less"; +@import "skin-purple-light.less"; diff --git a/theme/bootstrap/build/less/skins/skin-black-light.less b/theme/bootstrap/build/less/skins/skin-black-light.less new file mode 100644 index 0000000..b3fe67f --- /dev/null +++ b/theme/bootstrap/build/less/skins/skin-black-light.less @@ -0,0 +1,64 @@ +/* + * Skin: Black + * ----------- + */ +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +/* skin-black navbar */ +.skin-black-light { + //Navbar & Logo + .main-header { + .box-shadow(0px 1px 1px rgba(0, 0, 0, 0.05)); + .navbar-toggle { + color: #333; + } + .navbar-brand { + color: #333; + border-right: 1px solid #eee; + } + > .navbar { + .navbar-variant(#fff; #333; #999; #fff); + > .sidebar-toggle { + color: #333; + border-right: 1px solid #eee; + } + .navbar-nav { + > li > a { + border-right: 1px solid #eee; + } + } + .navbar-custom-menu .navbar-nav, + .navbar-right { + > li { + > a { + border-left: 1px solid #eee; + border-right-width: 0; + } + } + } + } + > .logo { + .logo-variant(#fff; #333); + border-right: 1px solid #eee; + @media (max-width: @screen-header-collapse) { + .logo-variant(#222; #fff); + border-right: none; + } + } + + li.user-header { + background-color: #222; + } + } + + //Content Header + .content-header { + background: transparent; + box-shadow: none; + } + //Create the sidebar skin + .skin-light-sidebar(#fff); +} diff --git a/theme/bootstrap/build/less/skins/skin-black.less b/theme/bootstrap/build/less/skins/skin-black.less new file mode 100644 index 0000000..6b0f789 --- /dev/null +++ b/theme/bootstrap/build/less/skins/skin-black.less @@ -0,0 +1,64 @@ +/* + * Skin: Black + * ----------- + */ +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +/* skin-black navbar */ +.skin-black { + //Navbar & Logo + .main-header { + .box-shadow(0px 1px 1px rgba(0, 0, 0, 0.05)); + .navbar-toggle { + color: #333; + } + .navbar-brand { + color: #333; + border-right: 1px solid #eee; + } + > .navbar { + .navbar-variant(#fff; #333; #999; #fff); + > .sidebar-toggle { + color: #333; + border-right: 1px solid #eee; + } + .navbar-nav { + > li > a { + border-right: 1px solid #eee; + } + } + .navbar-custom-menu .navbar-nav, + .navbar-right { + > li { + > a { + border-left: 1px solid #eee; + border-right-width: 0; + } + } + } + } + > .logo { + .logo-variant(#fff; #333); + border-right: 1px solid #eee; + @media (max-width: @screen-header-collapse) { + .logo-variant(#222; #fff); + border-right: none; + } + } + + li.user-header { + background-color: #222; + } + } + + //Content Header + .content-header { + background: transparent; + box-shadow: none; + } + //Create the sidebar skin + .skin-dark-sidebar(#fff); +} diff --git a/theme/bootstrap/build/less/skins/skin-blue-light.less b/theme/bootstrap/build/less/skins/skin-blue-light.less new file mode 100644 index 0000000..cd7341c --- /dev/null +++ b/theme/bootstrap/build/less/skins/skin-blue-light.less @@ -0,0 +1,61 @@ +/* + * Skin: Blue + * ---------- + */ +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +.skin-blue-light { + //Navbar + .main-header { + .navbar { + .navbar-variant(@light-blue; #fff); + .sidebar-toggle { + color: #fff; + &:hover { + background-color: darken(@light-blue, 5%); + } + } + @media (max-width: @screen-header-collapse) { + .dropdown-menu { + li { + &.divider { + background-color: rgba(255, 255, 255, 0.1); + } + a { + color: #fff; + &:hover { + background: darken(@light-blue, 5%); + } + } + } + } + } + } + //Logo + .logo { + .logo-variant(@light-blue); + } + + li.user-header { + background-color: @light-blue; + } + } + + //Content Header + .content-header { + background: transparent; + } + + //Create the sidebar skin + .skin-light-sidebar(@light-blue); + .main-footer { + border-top-color: @gray; + } +} + +.skin-blue.layout-top-nav .main-header > .logo { + .logo-variant(@light-blue); +} diff --git a/theme/bootstrap/build/less/skins/skin-blue.less b/theme/bootstrap/build/less/skins/skin-blue.less new file mode 100644 index 0000000..63fb32f --- /dev/null +++ b/theme/bootstrap/build/less/skins/skin-blue.less @@ -0,0 +1,58 @@ +/* + * Skin: Blue + * ---------- + */ +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +.skin-blue { + //Navbar + .main-header { + .navbar { + .navbar-variant(@light-blue; #fff); + .sidebar-toggle { + color: #fff; + &:hover { + background-color: darken(@light-blue, 5%); + } + } + @media (max-width: @screen-header-collapse) { + .dropdown-menu { + li { + &.divider { + background-color: rgba(255, 255, 255, 0.1); + } + a { + color: #fff; + &:hover { + background: darken(@light-blue, 5%); + } + } + } + } + } + } + //Logo + .logo { + .logo-variant(darken(@light-blue, 5%)); + } + + li.user-header { + background-color: @light-blue; + } + } + + //Content Header + .content-header { + background: transparent; + } + + //Create the sidebar skin + .skin-dark-sidebar(@light-blue); +} + +.skin-blue.layout-top-nav .main-header > .logo { + .logo-variant(@light-blue); +} diff --git a/theme/bootstrap/build/less/skins/skin-green-light.less b/theme/bootstrap/build/less/skins/skin-green-light.less new file mode 100644 index 0000000..5c1261d --- /dev/null +++ b/theme/bootstrap/build/less/skins/skin-green-light.less @@ -0,0 +1,56 @@ +/* + * Skin: Green + * ----------- + */ + +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +.skin-green-light { + //Navbar + .main-header { + .navbar { + .navbar-variant(@green; #fff); + .sidebar-toggle { + color: #fff; + &:hover { + background-color: darken(@green, 5%); + } + } + @media(max-width: @screen-header-collapse) { + .dropdown-menu { + li { + &.divider { + background-color: rgba(255,255,255,0.1); + } + a { + color: #fff; + &:hover { + background: darken(@green, 5%); + } + } + } + } + } + } + //Logo + .logo { + .logo-variant(@green); + } + + li.user-header { + background-color: @green; + } + } + + //Content Header + .content-header { + background: transparent; + } + + //Create the sidebar skin + .skin-light-sidebar(@green); + +} diff --git a/theme/bootstrap/build/less/skins/skin-green.less b/theme/bootstrap/build/less/skins/skin-green.less new file mode 100644 index 0000000..a9b7898 --- /dev/null +++ b/theme/bootstrap/build/less/skins/skin-green.less @@ -0,0 +1,56 @@ +/* + * Skin: Green + * ----------- + */ + +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +.skin-green { + //Navbar + .main-header { + .navbar { + .navbar-variant(@green; #fff); + .sidebar-toggle { + color: #fff; + &:hover { + background-color: darken(@green, 5%); + } + } + @media(max-width: @screen-header-collapse) { + .dropdown-menu { + li { + &.divider { + background-color: rgba(255,255,255,0.1); + } + a { + color: #fff; + &:hover { + background: darken(@green, 5%); + } + } + } + } + } + } + //Logo + .logo { + .logo-variant(darken(@green, 5%)); + } + + li.user-header { + background-color: @green; + } + } + + //Content Header + .content-header { + background: transparent; + } + + //Create the sidebar skin + .skin-dark-sidebar(@green); + +} diff --git a/theme/bootstrap/build/less/skins/skin-purple-light.less b/theme/bootstrap/build/less/skins/skin-purple-light.less new file mode 100644 index 0000000..885fb05 --- /dev/null +++ b/theme/bootstrap/build/less/skins/skin-purple-light.less @@ -0,0 +1,55 @@ +/* + * Skin: Purple + * ------------ + */ + +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +.skin-purple-light { + //Navbar + .main-header { + .navbar { + .navbar-variant(@purple; #fff); + .sidebar-toggle { + color: #fff; + &:hover { + background-color: darken(@purple, 5%); + } + } + @media(max-width: @screen-header-collapse) { + .dropdown-menu { + li { + &.divider { + background-color: rgba(255,255,255,0.1); + } + a { + color: #fff; + &:hover { + background: darken(@purple, 5%); + } + } + } + } + } + } + //Logo + .logo { + .logo-variant(@purple); + } + + li.user-header { + background-color: @purple; + } + } + + //Content Header + .content-header { + background: transparent; + } + + //Create the sidebar skin + .skin-light-sidebar(@purple); +} diff --git a/theme/bootstrap/build/less/skins/skin-purple.less b/theme/bootstrap/build/less/skins/skin-purple.less new file mode 100644 index 0000000..f2ffaff --- /dev/null +++ b/theme/bootstrap/build/less/skins/skin-purple.less @@ -0,0 +1,55 @@ +/* + * Skin: Purple + * ------------ + */ + +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +.skin-purple { + //Navbar + .main-header { + .navbar { + .navbar-variant(@purple; #fff); + .sidebar-toggle { + color: #fff; + &:hover { + background-color: darken(@purple, 5%); + } + } + @media(max-width: @screen-header-collapse) { + .dropdown-menu { + li { + &.divider { + background-color: rgba(255,255,255,0.1); + } + a { + color: #fff; + &:hover { + background: darken(@purple, 5%); + } + } + } + } + } + } + //Logo + .logo { + .logo-variant(darken(@purple, 5%)); + } + + li.user-header { + background-color: @purple; + } + } + + //Content Header + .content-header { + background: transparent; + } + + //Create the sidebar skin + .skin-dark-sidebar(@purple); +} diff --git a/theme/bootstrap/build/less/skins/skin-red-light.less b/theme/bootstrap/build/less/skins/skin-red-light.less new file mode 100644 index 0000000..b13f516 --- /dev/null +++ b/theme/bootstrap/build/less/skins/skin-red-light.less @@ -0,0 +1,55 @@ +/* + * Skin: Red + * --------- + */ + +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +.skin-red-light { + //Navbar + .main-header { + .navbar { + .navbar-variant(@red; #fff); + .sidebar-toggle { + color: #fff; + &:hover { + background-color: darken(@red, 5%); + } + } + @media(max-width: @screen-header-collapse) { + .dropdown-menu { + li { + &.divider { + background-color: rgba(255,255,255,0.1); + } + a { + color: #fff; + &:hover { + background: darken(@red, 5%); + } + } + } + } + } + } + //Logo + .logo { + .logo-variant(@red); + } + + li.user-header { + background-color: @red; + } + } + + //Content Header + .content-header { + background: transparent; + } + + //Create the sidebar skin + .skin-light-sidebar(@red); +} diff --git a/theme/bootstrap/build/less/skins/skin-red.less b/theme/bootstrap/build/less/skins/skin-red.less new file mode 100644 index 0000000..573ad0e --- /dev/null +++ b/theme/bootstrap/build/less/skins/skin-red.less @@ -0,0 +1,55 @@ +/* + * Skin: Red + * --------- + */ + +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +.skin-red { + //Navbar + .main-header { + .navbar { + .navbar-variant(@red; #fff); + .sidebar-toggle { + color: #fff; + &:hover { + background-color: darken(@red, 5%); + } + } + @media(max-width: @screen-header-collapse) { + .dropdown-menu { + li { + &.divider { + background-color: rgba(255,255,255,0.1); + } + a { + color: #fff; + &:hover { + background: darken(@red, 5%); + } + } + } + } + } + } + //Logo + .logo { + .logo-variant(darken(@red, 5%)); + } + + li.user-header { + background-color: @red; + } + } + + //Content Header + .content-header { + background: transparent; + } + + //Create the sidebar skin + .skin-dark-sidebar(@red); +} diff --git a/theme/bootstrap/build/less/skins/skin-yellow-light.less b/theme/bootstrap/build/less/skins/skin-yellow-light.less new file mode 100644 index 0000000..ef745eb --- /dev/null +++ b/theme/bootstrap/build/less/skins/skin-yellow-light.less @@ -0,0 +1,55 @@ +/* + * Skin: Yellow + * ------------ + */ + +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +.skin-yellow-light { + //Navbar + .main-header { + .navbar { + .navbar-variant(@yellow; #fff); + .sidebar-toggle { + color: #fff; + &:hover { + background-color: darken(@yellow, 5%); + } + } + @media(max-width: @screen-header-collapse) { + .dropdown-menu { + li { + &.divider { + background-color: rgba(255,255,255,0.1); + } + a { + color: #fff; + &:hover { + background: darken(@yellow, 5%); + } + } + } + } + } + } + //Logo + .logo { + .logo-variant(@yellow); + } + + li.user-header { + background-color: @yellow; + } + } + + //Content Header + .content-header { + background: transparent; + } + + //Create the sidebar skin + .skin-light-sidebar(@yellow); +} diff --git a/theme/bootstrap/build/less/skins/skin-yellow.less b/theme/bootstrap/build/less/skins/skin-yellow.less new file mode 100644 index 0000000..1ba7499 --- /dev/null +++ b/theme/bootstrap/build/less/skins/skin-yellow.less @@ -0,0 +1,55 @@ +/* + * Skin: Yellow + * ------------ + */ + +@import "../../bootstrap-less/mixins.less"; +@import "../../bootstrap-less/variables.less"; +@import "../variables.less"; +@import "../mixins.less"; + +.skin-yellow { + //Navbar + .main-header { + .navbar { + .navbar-variant(@yellow; #fff); + .sidebar-toggle { + color: #fff; + &:hover { + background-color: darken(@yellow, 5%); + } + } + @media(max-width: @screen-header-collapse) { + .dropdown-menu { + li { + &.divider { + background-color: rgba(255,255,255,0.1); + } + a { + color: #fff; + &:hover { + background: darken(@yellow, 5%); + } + } + } + } + } + } + //Logo + .logo { + .logo-variant(darken(@yellow, 5%)); + } + + li.user-header { + background-color: @yellow; + } + } + + //Content Header + .content-header { + background: transparent; + } + + //Create the sidebar skin + .skin-dark-sidebar(@yellow); +} diff --git a/theme/bootstrap/build/less/small-box.less b/theme/bootstrap/build/less/small-box.less new file mode 100644 index 0000000..1ef81b4 --- /dev/null +++ b/theme/bootstrap/build/less/small-box.less @@ -0,0 +1,89 @@ +/* + * Component: Small Box + * -------------------- + */ + +.small-box { + .border-radius(2px); + position: relative; + display: block; + margin-bottom: 20px; + box-shadow: @box-boxshadow; + // content wrapper + > .inner { + padding: 10px; + } + + > .small-box-footer { + position: relative; + text-align: center; + padding: 3px 0; + color: #fff; + color: rgba(255, 255, 255, 0.8); + display: block; + z-index: 10; + background: rgba(0,0,0,0.1); + text-decoration: none; + &:hover { + color: #fff; + background: rgba(0,0,0,0.15); + } + } + + h3 { + font-size: 38px; + font-weight: bold; + margin: 0 0 10px 0; + white-space: nowrap; + padding: 0; + + } + + p { + font-size: 15px; + > small { + display: block; + color: #f9f9f9; + font-size: 13px; + margin-top: 5px; + } + } + + h3, p { + z-index: 5px; + } + + // the icon + .icon { + .transition(all @transition-speed linear); + position: absolute; + top: -10px; + right: 10px; + z-index: 0; + font-size: 90px; + color: rgba(0, 0, 0, 0.15); + } + + // Small box hover state + &:hover { + text-decoration: none; + color: #f9f9f9; + // Animate icons on small box hover + .icon { + font-size: 95px; + } + } +} + +@media (max-width: @screen-xs-max) { + // No need for icons on very small devices + .small-box { + text-align: center; + .icon { + display: none; + } + p { + font-size: 12px; + } + } +} diff --git a/theme/bootstrap/build/less/social-widgets.less b/theme/bootstrap/build/less/social-widgets.less new file mode 100644 index 0000000..61f1fef --- /dev/null +++ b/theme/bootstrap/build/less/social-widgets.less @@ -0,0 +1,78 @@ +/* + * Component: Social Widgets + * ------------------------- + */ +//General widget style +.box-widget { + border: none; + position: relative; +} + +//User Widget Style 1 +.widget-user { + //User name container + .widget-user-header { + padding: 20px; + height: 120px; + .border-top-radius(@box-border-radius); + } + //User name + .widget-user-username { + margin-top: 0; + margin-bottom: 5px; + font-size: 25px; + font-weight: 300; + text-shadow: 0 1px 1px rgba(0,0,0,0.2); + } + //User single line description + .widget-user-desc { + margin-top: 0; + } + //User image container + .widget-user-image { + position: absolute; + top: 65px; + left: 50%; + margin-left: -45px; + > img { + width: 90px; + height: auto; + border: 3px solid #fff; + } + } + .box-footer { + padding-top: 30px; + } +} + +//User Widget Style 2 +.widget-user-2 { + //User name container + .widget-user-header { + padding: 20px; + .border-top-radius(@box-border-radius); + } + //User name + .widget-user-username { + margin-top: 5px; + margin-bottom: 5px; + font-size: 25px; + font-weight: 300; + } + //User single line description + .widget-user-desc { + margin-top: 0; + } + .widget-user-username, + .widget-user-desc { + margin-left: 75px; + } + //User image container + .widget-user-image { + > img { + width: 65px; + height: auto; + float: left; + } + } +} \ No newline at end of file diff --git a/theme/bootstrap/build/less/table.less b/theme/bootstrap/build/less/table.less new file mode 100644 index 0000000..4aa06a4 --- /dev/null +++ b/theme/bootstrap/build/less/table.less @@ -0,0 +1,71 @@ +/* + * Component: Table + * ---------------- + */ + +.table { + //Cells + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + border-top: 1px solid @box-border-color; + } + } + } + //thead cells + > thead > tr > th { + border-bottom: 2px solid @box-border-color; + } + //progress bars in tables + tr td .progress { + margin-top: 5px; + } +} + +//Bordered Table +.table-bordered { + border: 1px solid @box-border-color; + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + border: 1px solid @box-border-color; + } + } + } + > thead > tr { + > th, + > td { + border-bottom-width: 2px; + } + } +} + +.table.no-border { + &, + td, + th { + border: 0; + } +} + +/* .text-center in tables */ +table.text-center { + &, td, th { + text-align: center; + } +} + +.table.align { + th { + text-align: left; + } + td { + text-align: right; + } +} diff --git a/theme/bootstrap/build/less/timeline.less b/theme/bootstrap/build/less/timeline.less new file mode 100644 index 0000000..2109280 --- /dev/null +++ b/theme/bootstrap/build/less/timeline.less @@ -0,0 +1,111 @@ +/* + * Component: Timeline + * ------------------- + */ + +.timeline{ + position: relative; + margin: 0 0 30px 0; + padding: 0; + list-style: none; + + // The line + &:before { + content: ''; + position: absolute; + top: 0; + bottom: 0; + width: 4px; + background: #ddd; + left: 31px; + margin: 0; + .border-radius(2px); + } + + + > li { + position: relative; + margin-right: 10px; + margin-bottom: 15px; + .clearfix(); + + // The content + > .timeline-item { + .box-shadow(@box-boxshadow); + .border-radius(@box-border-radius); + margin-top: 0; + background: #fff; + color: #444; + margin-left: 60px; + margin-right: 15px; + padding: 0; + position: relative; + + // The time and header + > .time { + color: #999; + float: right; + padding: 10px; + font-size: 12px; + } + > .timeline-header { + margin: 0; + color: #555; + border-bottom: 1px solid @box-border-color; + padding: 10px; + font-size: 16px; + line-height: 1.1; + > a { + font-weight: 600; + } + } + // Item body and footer + > .timeline-body, > .timeline-footer { + padding: 10px; + } + + } + + // The icons + > .fa, + > .glyphicon, + > .ion { + width: 30px; + height: 30px; + font-size: 15px; + line-height: 30px; + position: absolute; + color: #666; + background: @gray; + border-radius: 50%; + text-align: center; + left: 18px; + top: 0; + } + } + + // Time label + > .time-label { + > span { + font-weight: 600; + padding: 5px; + display: inline-block; + background-color: #fff; + + .border-radius(4px); + } + } +} + +.timeline-inverse { + > li { + > .timeline-item { + background: #f0f0f0; + border: 1px solid #ddd; + .box-shadow(none); + > .timeline-header { + border-bottom-color: #ddd; + } + } + } +} \ No newline at end of file diff --git a/theme/bootstrap/build/less/users-list.less b/theme/bootstrap/build/less/users-list.less new file mode 100644 index 0000000..898bbd1 --- /dev/null +++ b/theme/bootstrap/build/less/users-list.less @@ -0,0 +1,39 @@ +/* + * Component: Users List + * --------------------- + */ +.users-list { + &:extend(.list-unstyled); + > li { + width: 25%; + float: left; + padding: 10px; + text-align: center; + img { + .border-radius(50%); + max-width: 100%; + height: auto; + } + > a:hover { + &, + .users-list-name { + color: #999; + } + } + } +} +.users-list-name, +.users-list-date { + display: block; +} +.users-list-name { + font-weight: 600; + color: #444; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.users-list-date { + color: #999; + font-size: 12px; +} diff --git a/theme/bootstrap/build/less/variables.less b/theme/bootstrap/build/less/variables.less new file mode 100644 index 0000000..17e6e14 --- /dev/null +++ b/theme/bootstrap/build/less/variables.less @@ -0,0 +1,120 @@ +//AdminLTE 2 Variables.less +//========================= + +//PATHS +//-------------------------------------------------------- + +@boxed-layout-bg-image-path: "../img/boxed-bg.jpg"; + +//COLORS +//-------------------------------------------------------- + +@light-blue: #3c8dbc; //Primary +@red: #dd4b39; //Danger +@green: #00a65a; //Success +@aqua: #00c0ef; //Info +@yellow: #f39c12; //Warning +@blue: #0073b7; +@navy: #001F3F; +@teal: #39CCCC; +@olive: #3D9970; +@lime: #01FF70; +@orange: #FF851B; +@fuchsia: #F012BE; +@purple: #605ca8; +@maroon: #D81B60; +@black: #111; +@gray: #d2d6de; + +//LAYOUT +//-------------------------------------------------------- + +//Side bar and logo width +@sidebar-width: 230px; +//Boxed layout maximum width +@boxed-layout-max-width: 1024px; +//When the logo should go to the top of the screen +@screen-header-collapse: @screen-xs-max; + +//Link colors (Aka: <a> tags) +@link-color: @light-blue; +@link-hover-color: lighten(@link-color, 15%); + +//Body background (Affects main content background only) +@body-bg: #ecf0f5; + +//SIDEBAR SKINS +//-------------------------------------------------------- + +//Dark sidebar +@sidebar-dark-bg: #222d32; +@sidebar-dark-hover-bg: darken(@sidebar-dark-bg, 2%); +@sidebar-dark-color: lighten(@sidebar-dark-bg, 60%); +@sidebar-dark-hover-color: #fff; +@sidebar-dark-submenu-bg: lighten(@sidebar-dark-bg, 5%); +@sidebar-dark-submenu-color: lighten(@sidebar-dark-submenu-bg, 40%); +@sidebar-dark-submenu-hover-color: #fff; + +//Light sidebar +@sidebar-light-bg: #f9fafc; +@sidebar-light-hover-bg: lighten(#f0f0f1, 1.5%); +@sidebar-light-color: #444; +@sidebar-light-hover-color: #000; +@sidebar-light-submenu-bg: @sidebar-light-hover-bg; +@sidebar-light-submenu-color: #777; +@sidebar-light-submenu-hover-color: #000; + +//CONTROL SIDEBAR +//-------------------------------------------------------- +@control-sidebar-width: @sidebar-width; + + +//BOXES +//-------------------------------------------------------- +@box-border-color: #f4f4f4; +@box-border-radius: 3px; +@box-footer-bg: #fff; +@box-boxshadow: 0 1px 1px rgba(0, 0, 0, .1); +@box-padding: 10px; + +//Box variants +@box-default-border-top-color: #d2d6de; + +//BUTTONS +//-------------------------------------------------------- +@btn-boxshadow: none; + +//PROGRESS BARS +//-------------------------------------------------------- +@progress-bar-border-radius: 1px; +@progress-bar-sm-border-radius: 1px; +@progress-bar-xs-border-radius: 1px; + +//FORMS +//-------------------------------------------------------- +@input-radius: 0; + +//BUTTONS +//-------------------------------------------------------- + +//Border radius for non flat buttons +@btn-border-radius: 3px; + +//DIRECT CHAT +//-------------------------------------------------------- +@direct-chat-height: 250px; +@direct-chat-default-msg-bg: @gray; +@direct-chat-default-font-color: #444; +@direct-chat-default-msg-border-color: @gray; + + +//CHAT WIDGET +//-------------------------------------------------------- +@attachment-border-radius: 3px; + +//TRANSITIONS SETTINGS +//-------------------------------------------------------- + +//Transition global options +@transition-speed: .3s; +@transition-fn: ease-in-out;//cubic-bezier(0.32,1.25,0.375,1.15); diff --git a/theme/bootstrap/changelog b/theme/bootstrap/changelog new file mode 100644 index 0000000..3bbe228 --- /dev/null +++ b/theme/bootstrap/changelog @@ -0,0 +1,99 @@ +CHANGE LOG: +v2.3.0: +- Added social widgets (found in the widgets page) +- Added profile page +- Fix issue #430 (requires ```.hold-transition``` to be added to ```<body>```) +- Fix issue #578 +- Fix issue #579 + +v2.2.1: +- Bug Fixes +- Removed many ```!important``` statements in css +- Activate boxWidget automatically when created after the page has loaded +- Activate sidebar menu treeview links automatically when created after the page has loaded +- Updated Font Awesome thanks to @Dennis14e +- Added JSHint to Grunt tasks (Find JS errors) +- Added CSSLint to Grunt tasks (Find CSS errors) +- Added Image to Grunt tasks (compress images) +- Added Clean to Grunt tasks (remove unwanted files like uncompressed images) +- Updated Bootstrap to 3.3.5 + +v2.2.0: +- Bug fixes +- Added support for [Select2](https://select2.github.io/) +- Updated ChartJS + +v2.1.2: +- Added explicit BoxWidget activation function issue #450 +- Crushed some bugs + +v2.1.1: +- Fix version error + +v2.1.0: +- Update Ion Icons +- Added right sidebar ```.control-sidebar``` +- Control sidebar has 2 open effects: slide over content and push content +- Control sidebar converts to always slide over content on small screens +- Added 6 new light sidebar skins +- Updated demo menu +- Added ChartJS preview page +- Fixed some minor bugs +- Added light control sidebar skin +- Added expand on hover option for sidebar mini +- Added fixed control sidebar layout + +v2.0.5: +- Fixed issue #288 + +v2.0.4: +- Fixed bower.json to pick up newest release. + +v2.0.3: +- Bug fixes +- Fixed extra page when printing issue #264 +- Updated documentation and fixed links scrolling issue +- Created print.less file (this makes it easier if you want to create a seperate CSS file for printing) +- Fixed sidebar stretching issue #275 +- Fixed checkbox out of bounds issue in WYSIHTML5 editor. + +v2.0.2: +- Solved issue with hidden arrow in select inputs. + +v2.0.1: +- Updated README.md +- Fixed versioning issue in CSS, LESS, and JS +- Updated box-shadow for boxes +- Updated docs + +v2.0.0 +- Major layout bug fixes +- Change in layout mark up +- Added transitions to the sidebar +- New skins and modified previous skins +- Change in color scheme to a more complementing scheme +- Added footer support +- Removed pace.js from the main app.js +- Added support for collapsed sidebar as an initial state (add .sidebar-collapse to the body tag) +- Added boxed layout (.layout-boxed) +- Enhanced consistency in padding and margining +- Updated Bootstrap to 3.3.2 +- Fixed navbar dropdown menu on small screens positioning issues. +- Updated Ion Icons to 2.0.0 +- Updated FontAwesome to 4.3.0 +- Added ChartJS 1.0.1 +- Removed iCheck dependency +- Created Dashboard 2.0 +- Created new Chat widget (DirectChat) +- Added transitions to DirectChat +- Added contacts pane to DirectChat +- Changed .right-side to .content-wrapper +- Changed .navbar-right to .navbar-custom-menu +- Removed unused files +- Updated lockscreen style (HTML markup changed!) +- Updated Login & Registration pages (HTML markup changed!) +- Updated buttons style. +- Enhanced border-radius consistency +- Added mailbox: inbox, read, and compose pages +- Bootstrap & jQuery are now hosted locally +- Created documentation. \ No newline at end of file diff --git a/theme/bootstrap/composer.json b/theme/bootstrap/composer.json new file mode 100644 index 0000000..e178dd5 --- /dev/null +++ b/theme/bootstrap/composer.json @@ -0,0 +1,26 @@ +{ + "name": "almasaeed2010/adminlte", + "description": "AdminLTE - admin control panel and dashboard that's based on Bootstrap 3", + "homepage": "http://almsaeedstudio.com/", + "keywords": [ + "css", + "js", + "less", + "responsive", + "back-end", + "template", + "theme", + "web", + "admin" + ], + "authors": [ + { + "name": "Abdullah Almsaeed", + "email": "support@almsaeedstudio.com" + } + ], + "license": "MIT", + "support": { + "issues": "https://github.com/almasaeed2010/AdminLTE/issues" + } +} diff --git a/theme/bootstrap/css/bootstrap-rtl.css b/theme/bootstrap/css/bootstrap-rtl.css new file mode 100644 index 0000000..33095b1 --- /dev/null +++ b/theme/bootstrap/css/bootstrap-rtl.css @@ -0,0 +1,1536 @@ +/******************************************************************************* + * bootstrap-rtl (Version 3.2.0-rc1) + * Author: Morteza Ansarinia <ansarinia@me.com> (http://github.com/morteza) + * Created on: June 13,2014 + * Project: bootstrap-rtl + * Copyright: See the file "LICENSE.md" for the full license governing this code. + *******************************************************************************/ + +html { + direction: rtl; +} +body { + direction: rtl; +} +.list-unstyled { + padding-right: 0; + padding-left: none; +} +.list-inline { + padding-right: 0; + padding-left: none; + margin-right: -5px; + margin-left: 0; +} +dd { + margin-right: 0; + margin-left: none; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: right; + clear: right; + text-align: left; + } + .dl-horizontal dd { + margin-right: 180px; + margin-left: 0; + } +} +blockquote { + border-right: 5px solid #eeeeee; + border-left: 0; +} +.blockquote-reverse, +blockquote.pull-left { + padding-left: 15px; + padding-right: 0; + border-left: 5px solid #eeeeee; + border-right: 0; + text-align: left; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: right; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + left: 100%; + right: auto; +} +.col-xs-pull-11 { + left: 91.66666667%; + right: auto; +} +.col-xs-pull-10 { + left: 83.33333333%; + right: auto; +} +.col-xs-pull-9 { + left: 75%; + right: auto; +} +.col-xs-pull-8 { + left: 66.66666667%; + right: auto; +} +.col-xs-pull-7 { + left: 58.33333333%; + right: auto; +} +.col-xs-pull-6 { + left: 50%; + right: auto; +} +.col-xs-pull-5 { + left: 41.66666667%; + right: auto; +} +.col-xs-pull-4 { + left: 33.33333333%; + right: auto; +} +.col-xs-pull-3 { + left: 25%; + right: auto; +} +.col-xs-pull-2 { + left: 16.66666667%; + right: auto; +} +.col-xs-pull-1 { + left: 8.33333333%; + right: auto; +} +.col-xs-pull-0 { + left: auto; + right: auto; +} +.col-xs-push-12 { + right: 100%; + left: 0; +} +.col-xs-push-11 { + right: 91.66666667%; + left: 0; +} +.col-xs-push-10 { + right: 83.33333333%; + left: 0; +} +.col-xs-push-9 { + right: 75%; + left: 0; +} +.col-xs-push-8 { + right: 66.66666667%; + left: 0; +} +.col-xs-push-7 { + right: 58.33333333%; + left: 0; +} +.col-xs-push-6 { + right: 50%; + left: 0; +} +.col-xs-push-5 { + right: 41.66666667%; + left: 0; +} +.col-xs-push-4 { + right: 33.33333333%; + left: 0; +} +.col-xs-push-3 { + right: 25%; + left: 0; +} +.col-xs-push-2 { + right: 16.66666667%; + left: 0; +} +.col-xs-push-1 { + right: 8.33333333%; + left: 0; +} +.col-xs-push-0 { + right: auto; + left: 0; +} +.col-xs-offset-12 { + margin-right: 100%; + margin-left: 0; +} +.col-xs-offset-11 { + margin-right: 91.66666667%; + margin-left: 0; +} +.col-xs-offset-10 { + margin-right: 83.33333333%; + margin-left: 0; +} +.col-xs-offset-9 { + margin-right: 75%; + margin-left: 0; +} +.col-xs-offset-8 { + margin-right: 66.66666667%; + margin-left: 0; +} +.col-xs-offset-7 { + margin-right: 58.33333333%; + margin-left: 0; +} +.col-xs-offset-6 { + margin-right: 50%; + margin-left: 0; +} +.col-xs-offset-5 { + margin-right: 41.66666667%; + margin-left: 0; +} +.col-xs-offset-4 { + margin-right: 33.33333333%; + margin-left: 0; +} +.col-xs-offset-3 { + margin-right: 25%; + margin-left: 0; +} +.col-xs-offset-2 { + margin-right: 16.66666667%; + margin-left: 0; +} +.col-xs-offset-1 { + margin-right: 8.33333333%; + margin-left: 0; +} +.col-xs-offset-0 { + margin-right: 0%; + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: right; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + left: 100%; + right: auto; + } + .col-sm-pull-11 { + left: 91.66666667%; + right: auto; + } + .col-sm-pull-10 { + left: 83.33333333%; + right: auto; + } + .col-sm-pull-9 { + left: 75%; + right: auto; + } + .col-sm-pull-8 { + left: 66.66666667%; + right: auto; + } + .col-sm-pull-7 { + left: 58.33333333%; + right: auto; + } + .col-sm-pull-6 { + left: 50%; + right: auto; + } + .col-sm-pull-5 { + left: 41.66666667%; + right: auto; + } + .col-sm-pull-4 { + left: 33.33333333%; + right: auto; + } + .col-sm-pull-3 { + left: 25%; + right: auto; + } + .col-sm-pull-2 { + left: 16.66666667%; + right: auto; + } + .col-sm-pull-1 { + left: 8.33333333%; + right: auto; + } + .col-sm-pull-0 { + left: auto; + right: auto; + } + .col-sm-push-12 { + right: 100%; + left: 0; + } + .col-sm-push-11 { + right: 91.66666667%; + left: 0; + } + .col-sm-push-10 { + right: 83.33333333%; + left: 0; + } + .col-sm-push-9 { + right: 75%; + left: 0; + } + .col-sm-push-8 { + right: 66.66666667%; + left: 0; + } + .col-sm-push-7 { + right: 58.33333333%; + left: 0; + } + .col-sm-push-6 { + right: 50%; + left: 0; + } + .col-sm-push-5 { + right: 41.66666667%; + left: 0; + } + .col-sm-push-4 { + right: 33.33333333%; + left: 0; + } + .col-sm-push-3 { + right: 25%; + left: 0; + } + .col-sm-push-2 { + right: 16.66666667%; + left: 0; + } + .col-sm-push-1 { + right: 8.33333333%; + left: 0; + } + .col-sm-push-0 { + right: auto; + left: 0; + } + .col-sm-offset-12 { + margin-right: 100%; + margin-left: 0; + } + .col-sm-offset-11 { + margin-right: 91.66666667%; + margin-left: 0; + } + .col-sm-offset-10 { + margin-right: 83.33333333%; + margin-left: 0; + } + .col-sm-offset-9 { + margin-right: 75%; + margin-left: 0; + } + .col-sm-offset-8 { + margin-right: 66.66666667%; + margin-left: 0; + } + .col-sm-offset-7 { + margin-right: 58.33333333%; + margin-left: 0; + } + .col-sm-offset-6 { + margin-right: 50%; + margin-left: 0; + } + .col-sm-offset-5 { + margin-right: 41.66666667%; + margin-left: 0; + } + .col-sm-offset-4 { + margin-right: 33.33333333%; + margin-left: 0; + } + .col-sm-offset-3 { + margin-right: 25%; + margin-left: 0; + } + .col-sm-offset-2 { + margin-right: 16.66666667%; + margin-left: 0; + } + .col-sm-offset-1 { + margin-right: 8.33333333%; + margin-left: 0; + } + .col-sm-offset-0 { + margin-right: 0%; + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: right; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + left: 100%; + right: auto; + } + .col-md-pull-11 { + left: 91.66666667%; + right: auto; + } + .col-md-pull-10 { + left: 83.33333333%; + right: auto; + } + .col-md-pull-9 { + left: 75%; + right: auto; + } + .col-md-pull-8 { + left: 66.66666667%; + right: auto; + } + .col-md-pull-7 { + left: 58.33333333%; + right: auto; + } + .col-md-pull-6 { + left: 50%; + right: auto; + } + .col-md-pull-5 { + left: 41.66666667%; + right: auto; + } + .col-md-pull-4 { + left: 33.33333333%; + right: auto; + } + .col-md-pull-3 { + left: 25%; + right: auto; + } + .col-md-pull-2 { + left: 16.66666667%; + right: auto; + } + .col-md-pull-1 { + left: 8.33333333%; + right: auto; + } + .col-md-pull-0 { + left: auto; + right: auto; + } + .col-md-push-12 { + right: 100%; + left: 0; + } + .col-md-push-11 { + right: 91.66666667%; + left: 0; + } + .col-md-push-10 { + right: 83.33333333%; + left: 0; + } + .col-md-push-9 { + right: 75%; + left: 0; + } + .col-md-push-8 { + right: 66.66666667%; + left: 0; + } + .col-md-push-7 { + right: 58.33333333%; + left: 0; + } + .col-md-push-6 { + right: 50%; + left: 0; + } + .col-md-push-5 { + right: 41.66666667%; + left: 0; + } + .col-md-push-4 { + right: 33.33333333%; + left: 0; + } + .col-md-push-3 { + right: 25%; + left: 0; + } + .col-md-push-2 { + right: 16.66666667%; + left: 0; + } + .col-md-push-1 { + right: 8.33333333%; + left: 0; + } + .col-md-push-0 { + right: auto; + left: 0; + } + .col-md-offset-12 { + margin-right: 100%; + margin-left: 0; + } + .col-md-offset-11 { + margin-right: 91.66666667%; + margin-left: 0; + } + .col-md-offset-10 { + margin-right: 83.33333333%; + margin-left: 0; + } + .col-md-offset-9 { + margin-right: 75%; + margin-left: 0; + } + .col-md-offset-8 { + margin-right: 66.66666667%; + margin-left: 0; + } + .col-md-offset-7 { + margin-right: 58.33333333%; + margin-left: 0; + } + .col-md-offset-6 { + margin-right: 50%; + margin-left: 0; + } + .col-md-offset-5 { + margin-right: 41.66666667%; + margin-left: 0; + } + .col-md-offset-4 { + margin-right: 33.33333333%; + margin-left: 0; + } + .col-md-offset-3 { + margin-right: 25%; + margin-left: 0; + } + .col-md-offset-2 { + margin-right: 16.66666667%; + margin-left: 0; + } + .col-md-offset-1 { + margin-right: 8.33333333%; + margin-left: 0; + } + .col-md-offset-0 { + margin-right: 0%; + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: right; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + left: 100%; + right: auto; + } + .col-lg-pull-11 { + left: 91.66666667%; + right: auto; + } + .col-lg-pull-10 { + left: 83.33333333%; + right: auto; + } + .col-lg-pull-9 { + left: 75%; + right: auto; + } + .col-lg-pull-8 { + left: 66.66666667%; + right: auto; + } + .col-lg-pull-7 { + left: 58.33333333%; + right: auto; + } + .col-lg-pull-6 { + left: 50%; + right: auto; + } + .col-lg-pull-5 { + left: 41.66666667%; + right: auto; + } + .col-lg-pull-4 { + left: 33.33333333%; + right: auto; + } + .col-lg-pull-3 { + left: 25%; + right: auto; + } + .col-lg-pull-2 { + left: 16.66666667%; + right: auto; + } + .col-lg-pull-1 { + left: 8.33333333%; + right: auto; + } + .col-lg-pull-0 { + left: auto; + right: auto; + } + .col-lg-push-12 { + right: 100%; + left: 0; + } + .col-lg-push-11 { + right: 91.66666667%; + left: 0; + } + .col-lg-push-10 { + right: 83.33333333%; + left: 0; + } + .col-lg-push-9 { + right: 75%; + left: 0; + } + .col-lg-push-8 { + right: 66.66666667%; + left: 0; + } + .col-lg-push-7 { + right: 58.33333333%; + left: 0; + } + .col-lg-push-6 { + right: 50%; + left: 0; + } + .col-lg-push-5 { + right: 41.66666667%; + left: 0; + } + .col-lg-push-4 { + right: 33.33333333%; + left: 0; + } + .col-lg-push-3 { + right: 25%; + left: 0; + } + .col-lg-push-2 { + right: 16.66666667%; + left: 0; + } + .col-lg-push-1 { + right: 8.33333333%; + left: 0; + } + .col-lg-push-0 { + right: auto; + left: 0; + } + .col-lg-offset-12 { + margin-right: 100%; + margin-left: 0; + } + .col-lg-offset-11 { + margin-right: 91.66666667%; + margin-left: 0; + } + .col-lg-offset-10 { + margin-right: 83.33333333%; + margin-left: 0; + } + .col-lg-offset-9 { + margin-right: 75%; + margin-left: 0; + } + .col-lg-offset-8 { + margin-right: 66.66666667%; + margin-left: 0; + } + .col-lg-offset-7 { + margin-right: 58.33333333%; + margin-left: 0; + } + .col-lg-offset-6 { + margin-right: 50%; + margin-left: 0; + } + .col-lg-offset-5 { + margin-right: 41.66666667%; + margin-left: 0; + } + .col-lg-offset-4 { + margin-right: 33.33333333%; + margin-left: 0; + } + .col-lg-offset-3 { + margin-right: 25%; + margin-left: 0; + } + .col-lg-offset-2 { + margin-right: 16.66666667%; + margin-left: 0; + } + .col-lg-offset-1 { + margin-right: 8.33333333%; + margin-left: 0; + } + .col-lg-offset-0 { + margin-right: 0%; + margin-left: 0; + } +} +th { + text-align: right; +} +@media screen and (max-width: 767px) { + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-right: 0; + border-left: auto; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-left: 0; + border-right: auto; + } +} +.radio label, +.checkbox label { + padding-right: 20px; + padding-left: auto; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + float: right; + margin-right: 20px; + margin-left: 0; +} +.radio-inline, +.checkbox-inline { + padding-right: 20px; + padding-left: 0; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-right: 10px; + margin-left: 0; +} +.has-feedback .form-control { + padding-left: 42.5px; + padding-right: auto; +} +.form-control-feedback { + left: 0; + right: auto; +} +@media (min-width: 768px) { + .form-inline .radio, + .form-inline .checkbox { + padding-right: 0; + padding-left: auto; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + margin-right: 0; + margin-left: auto; + } +} +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: left; + } +} +.form-horizontal .has-feedback .form-control-feedback { + left: 15px; + right: auto; +} +.caret { + margin-right: 2px; + margin-left: 0; +} +.dropdown-menu { + right: 0; + left: auto; + float: left; + text-align: right; +} +.dropdown-menu.pull-left { + left: 0; + float: right; + right: auto; +} +.pull-left > .dropdown-menu { + left: 0; + float: right; + right: auto; +} +.navbar-nav.pull-left > li > .dropdown-menu, +.navbar-nav > li > .dropdown-menu.pull-left { + right: auto; + left: 0; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + float: right; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-right: -1px; + margin-left: 0px; +} +.btn-toolbar { + margin-right: -5px; + margin-left: 0px; +} +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: right; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-right: 5px; + margin-left: 0px; +} +.btn-group > .btn:first-child { + margin-right: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn-group { + float: right; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child > .btn:last-child, +.btn-group > .btn-group:first-child > .dropdown-toggle { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group > .btn-group:last-child > .btn:first-child { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn .caret { + margin-right: 0; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-right: 0; +} +.input-group .form-control { + float: right; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.input-group-addon:first-child { + border-right: 1px solid #cccccc; + border-left: 0px; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.input-group-addon:last-child { + border-left: 1px solid #cccccc; + border-right: 0px; +} +.input-group-btn > .btn + .btn { + margin-right: -1px; + margin-left: auto; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-left: -1px; + margin-right: auto; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + margin-right: -1px; + margin-left: auto; +} +.nav { + padding-right: 0; + padding-left: auto; +} +.nav-tabs > li { + float: right; +} +.nav-tabs > li > a { + margin-left: auto; + margin-right: -2px; + border-radius: 4px 4px 0 0; +} +.nav-pills > li { + float: right; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-right: 2px; + margin-left: auto; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-right: 0; + margin-left: auto; +} +.nav-justified > .dropdown .dropdown-menu { + right: auto; +} +.nav-tabs-justified > li > a { + margin-left: 0; + margin-right: auto; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-radius: 4px 4px 0 0; + } +} +@media (min-width: 768px) { + .navbar-header { + float: right; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; +} +.navbar-brand { + float: right; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-right: -15px; + margin-left: auto; + } +} +.navbar-toggle { + float: left; + margin-left: 15px; + margin-right: auto; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 25px 5px 15px; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: right; + } + .navbar-nav > li { + float: right; + } + .navbar-nav.navbar-right:last-child { + margin-left: -15px; + margin-right: auto; + } + .navbar-nav.navbar-right.flip { + float: left !important; + } + .navbar-nav.navbar-right .dropdown-menu { + left: 0; + right: auto; + } +} +@media (min-width: 768px) { + .navbar-text { + float: right; + } + .navbar-text.navbar-right:last-child { + margin-left: 0; + margin-right: auto; + } +} +.pagination { + padding-right: 0; +} +.pagination > li > a, +.pagination > li > span { + float: right; + margin-right: -1px; + margin-left: 0px; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + margin-right: -1px; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.pager { + padding-right: 0; + padding-left: none; +} +.pager .next > a, +.pager .next > span { + float: left; +} +.pager .previous > a, +.pager .previous > span { + float: right; +} +.nav-pills > li > a > .badge { + margin-left: 0px; + margin-right: 3px; +} +.alert-dismissable { + padding-left: 35px; + padding-right: 15px; +} +.alert-dismissable .close { + top: -2px; + right: 0; + left: 21; +} +.progress-bar { + float: right; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media > .pull-left { + margin-right: 10px; +} +.media > .pull-left.flip { + margin-right: 0; + margin-left: 10px; +} +.media > .pull-right { + margin-left: 10px; +} +.media > .pull-right.flip { + margin-left: 0; + margin-right: 10px; +} +.media-list { + padding-right: 0; + padding-left: auto; + list-style: none; +} +.list-group { + padding-right: 0; + padding-left: none; +} +.list-group-item > .badge { + float: left; +} +.list-group-item > .badge + .badge { + margin-ight: 5px; + margin-left: 0; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-right-radius: 3px; + border-top-left-radius: 0; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-left-radius: 3px; + border-top-right-radius: 0; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; + border-top-right-radius: 0; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; + border-top-left-radius: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-right: 0; + border-left: none; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: none; + border-left: 0; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object { + right: 0; + left: none; +} +.close { + float: left; +} +.modal-footer { + text-align: left; +} +.modal-footer .btn + .btn { + margin-left: 0; + margin-right: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-right: -1px; + margin-left: 0; +} +.modal-footer .btn-block + .btn-block { + margin-right: 0; + margin-left: none; +} +.popover { + right: 0; + left: none; + text-align: right; +} +.popover.top > .arrow { + right: 50%; + left: none; + margin-right: -11px; + margin-left: 0; +} +.popover.top > .arrow:after { + margin-right: -10px; + margin-left: 0; +} +.carousel-inner > .item { + -webkit-transition: 0.6s ease-in-out right; + -o-transition: 0.6s ease-in-out right; + transition: 0.6s ease-in-out right; +} +.carousel-inner > .active { + right: 0; +} +.carousel-inner > .next { + right: 100%; + left: 0; +} +.carousel-inner > .prev { + right: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + right: 0; +} +.carousel-inner > .active.right { + left: -100%; +} +.carousel-inner > .active.left { + right: 100%; +} +.carousel-control { + right: 0; + bottom: 0; +} +.carousel-control.left { + right: auto; + left: 0; + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0%), color-stop(rgba(0, 0, 0, 0.0001) 100%)); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} +.carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0%), color-stop(rgba(0, 0, 0, 0.5) 100%)); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + right: auto; + margin-right: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + left: auto; + margin-left: -10px; +} +.carousel-indicators { + right: 50%; + left: 0; + margin-right: -30%; + margin-left: 0; + padding-left: 0; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: 0; + margin-right: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-left: 0; + margin-right: -15px; + } + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } +} +.pull-right.flip { + float: left !important; +} +.pull-left.flip { + float: right !important; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +/*# sourceMappingURL=bootstrap-rtl.css.map */ \ No newline at end of file diff --git a/theme/bootstrap/css/bootstrap-rtl.min.css b/theme/bootstrap/css/bootstrap-rtl.min.css new file mode 100644 index 0000000..04e881e --- /dev/null +++ b/theme/bootstrap/css/bootstrap-rtl.min.css @@ -0,0 +1,9 @@ +/******************************************************************************* + * bootstrap-rtl (Version 3.2.0-rc1) + * Author: Morteza Ansarinia <ansarinia@me.com> (http://github.com/morteza) + * Created on: June 13,2014 + * Project: bootstrap-rtl + * Copyright: See the file "LICENSE.md" for the full license governing this code. + *******************************************************************************/ + +html{direction:rtl}body{direction:rtl}.list-unstyled{padding-right:0;padding-left:none}.list-inline{padding-right:0;padding-left:none;margin-right:-5px;margin-left:0}dd{margin-right:0;margin-left:none}@media (min-width:768px){.dl-horizontal dt{float:right;clear:right;text-align:left}.dl-horizontal dd{margin-right:180px;margin-left:0}}blockquote{border-right:5px solid #eee;border-left:0}.blockquote-reverse,blockquote.pull-left{padding-left:15px;padding-right:0;border-left:5px solid #eee;border-right:0;text-align:left}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:right}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{left:100%;right:auto}.col-xs-pull-11{left:91.66666667%;right:auto}.col-xs-pull-10{left:83.33333333%;right:auto}.col-xs-pull-9{left:75%;right:auto}.col-xs-pull-8{left:66.66666667%;right:auto}.col-xs-pull-7{left:58.33333333%;right:auto}.col-xs-pull-6{left:50%;right:auto}.col-xs-pull-5{left:41.66666667%;right:auto}.col-xs-pull-4{left:33.33333333%;right:auto}.col-xs-pull-3{left:25%;right:auto}.col-xs-pull-2{left:16.66666667%;right:auto}.col-xs-pull-1{left:8.33333333%;right:auto}.col-xs-pull-0{left:auto;right:auto}.col-xs-push-12{right:100%;left:0}.col-xs-push-11{right:91.66666667%;left:0}.col-xs-push-10{right:83.33333333%;left:0}.col-xs-push-9{right:75%;left:0}.col-xs-push-8{right:66.66666667%;left:0}.col-xs-push-7{right:58.33333333%;left:0}.col-xs-push-6{right:50%;left:0}.col-xs-push-5{right:41.66666667%;left:0}.col-xs-push-4{right:33.33333333%;left:0}.col-xs-push-3{right:25%;left:0}.col-xs-push-2{right:16.66666667%;left:0}.col-xs-push-1{right:8.33333333%;left:0}.col-xs-push-0{right:auto;left:0}.col-xs-offset-12{margin-right:100%;margin-left:0}.col-xs-offset-11{margin-right:91.66666667%;margin-left:0}.col-xs-offset-10{margin-right:83.33333333%;margin-left:0}.col-xs-offset-9{margin-right:75%;margin-left:0}.col-xs-offset-8{margin-right:66.66666667%;margin-left:0}.col-xs-offset-7{margin-right:58.33333333%;margin-left:0}.col-xs-offset-6{margin-right:50%;margin-left:0}.col-xs-offset-5{margin-right:41.66666667%;margin-left:0}.col-xs-offset-4{margin-right:33.33333333%;margin-left:0}.col-xs-offset-3{margin-right:25%;margin-left:0}.col-xs-offset-2{margin-right:16.66666667%;margin-left:0}.col-xs-offset-1{margin-right:8.33333333%;margin-left:0}.col-xs-offset-0{margin-right:0;margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:right}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{left:100%;right:auto}.col-sm-pull-11{left:91.66666667%;right:auto}.col-sm-pull-10{left:83.33333333%;right:auto}.col-sm-pull-9{left:75%;right:auto}.col-sm-pull-8{left:66.66666667%;right:auto}.col-sm-pull-7{left:58.33333333%;right:auto}.col-sm-pull-6{left:50%;right:auto}.col-sm-pull-5{left:41.66666667%;right:auto}.col-sm-pull-4{left:33.33333333%;right:auto}.col-sm-pull-3{left:25%;right:auto}.col-sm-pull-2{left:16.66666667%;right:auto}.col-sm-pull-1{left:8.33333333%;right:auto}.col-sm-pull-0{left:auto;right:auto}.col-sm-push-12{right:100%;left:0}.col-sm-push-11{right:91.66666667%;left:0}.col-sm-push-10{right:83.33333333%;left:0}.col-sm-push-9{right:75%;left:0}.col-sm-push-8{right:66.66666667%;left:0}.col-sm-push-7{right:58.33333333%;left:0}.col-sm-push-6{right:50%;left:0}.col-sm-push-5{right:41.66666667%;left:0}.col-sm-push-4{right:33.33333333%;left:0}.col-sm-push-3{right:25%;left:0}.col-sm-push-2{right:16.66666667%;left:0}.col-sm-push-1{right:8.33333333%;left:0}.col-sm-push-0{right:auto;left:0}.col-sm-offset-12{margin-right:100%;margin-left:0}.col-sm-offset-11{margin-right:91.66666667%;margin-left:0}.col-sm-offset-10{margin-right:83.33333333%;margin-left:0}.col-sm-offset-9{margin-right:75%;margin-left:0}.col-sm-offset-8{margin-right:66.66666667%;margin-left:0}.col-sm-offset-7{margin-right:58.33333333%;margin-left:0}.col-sm-offset-6{margin-right:50%;margin-left:0}.col-sm-offset-5{margin-right:41.66666667%;margin-left:0}.col-sm-offset-4{margin-right:33.33333333%;margin-left:0}.col-sm-offset-3{margin-right:25%;margin-left:0}.col-sm-offset-2{margin-right:16.66666667%;margin-left:0}.col-sm-offset-1{margin-right:8.33333333%;margin-left:0}.col-sm-offset-0{margin-right:0;margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:right}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{left:100%;right:auto}.col-md-pull-11{left:91.66666667%;right:auto}.col-md-pull-10{left:83.33333333%;right:auto}.col-md-pull-9{left:75%;right:auto}.col-md-pull-8{left:66.66666667%;right:auto}.col-md-pull-7{left:58.33333333%;right:auto}.col-md-pull-6{left:50%;right:auto}.col-md-pull-5{left:41.66666667%;right:auto}.col-md-pull-4{left:33.33333333%;right:auto}.col-md-pull-3{left:25%;right:auto}.col-md-pull-2{left:16.66666667%;right:auto}.col-md-pull-1{left:8.33333333%;right:auto}.col-md-pull-0{left:auto;right:auto}.col-md-push-12{right:100%;left:0}.col-md-push-11{right:91.66666667%;left:0}.col-md-push-10{right:83.33333333%;left:0}.col-md-push-9{right:75%;left:0}.col-md-push-8{right:66.66666667%;left:0}.col-md-push-7{right:58.33333333%;left:0}.col-md-push-6{right:50%;left:0}.col-md-push-5{right:41.66666667%;left:0}.col-md-push-4{right:33.33333333%;left:0}.col-md-push-3{right:25%;left:0}.col-md-push-2{right:16.66666667%;left:0}.col-md-push-1{right:8.33333333%;left:0}.col-md-push-0{right:auto;left:0}.col-md-offset-12{margin-right:100%;margin-left:0}.col-md-offset-11{margin-right:91.66666667%;margin-left:0}.col-md-offset-10{margin-right:83.33333333%;margin-left:0}.col-md-offset-9{margin-right:75%;margin-left:0}.col-md-offset-8{margin-right:66.66666667%;margin-left:0}.col-md-offset-7{margin-right:58.33333333%;margin-left:0}.col-md-offset-6{margin-right:50%;margin-left:0}.col-md-offset-5{margin-right:41.66666667%;margin-left:0}.col-md-offset-4{margin-right:33.33333333%;margin-left:0}.col-md-offset-3{margin-right:25%;margin-left:0}.col-md-offset-2{margin-right:16.66666667%;margin-left:0}.col-md-offset-1{margin-right:8.33333333%;margin-left:0}.col-md-offset-0{margin-right:0;margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:right}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{left:100%;right:auto}.col-lg-pull-11{left:91.66666667%;right:auto}.col-lg-pull-10{left:83.33333333%;right:auto}.col-lg-pull-9{left:75%;right:auto}.col-lg-pull-8{left:66.66666667%;right:auto}.col-lg-pull-7{left:58.33333333%;right:auto}.col-lg-pull-6{left:50%;right:auto}.col-lg-pull-5{left:41.66666667%;right:auto}.col-lg-pull-4{left:33.33333333%;right:auto}.col-lg-pull-3{left:25%;right:auto}.col-lg-pull-2{left:16.66666667%;right:auto}.col-lg-pull-1{left:8.33333333%;right:auto}.col-lg-pull-0{left:auto;right:auto}.col-lg-push-12{right:100%;left:0}.col-lg-push-11{right:91.66666667%;left:0}.col-lg-push-10{right:83.33333333%;left:0}.col-lg-push-9{right:75%;left:0}.col-lg-push-8{right:66.66666667%;left:0}.col-lg-push-7{right:58.33333333%;left:0}.col-lg-push-6{right:50%;left:0}.col-lg-push-5{right:41.66666667%;left:0}.col-lg-push-4{right:33.33333333%;left:0}.col-lg-push-3{right:25%;left:0}.col-lg-push-2{right:16.66666667%;left:0}.col-lg-push-1{right:8.33333333%;left:0}.col-lg-push-0{right:auto;left:0}.col-lg-offset-12{margin-right:100%;margin-left:0}.col-lg-offset-11{margin-right:91.66666667%;margin-left:0}.col-lg-offset-10{margin-right:83.33333333%;margin-left:0}.col-lg-offset-9{margin-right:75%;margin-left:0}.col-lg-offset-8{margin-right:66.66666667%;margin-left:0}.col-lg-offset-7{margin-right:58.33333333%;margin-left:0}.col-lg-offset-6{margin-right:50%;margin-left:0}.col-lg-offset-5{margin-right:41.66666667%;margin-left:0}.col-lg-offset-4{margin-right:33.33333333%;margin-left:0}.col-lg-offset-3{margin-right:25%;margin-left:0}.col-lg-offset-2{margin-right:16.66666667%;margin-left:0}.col-lg-offset-1{margin-right:8.33333333%;margin-left:0}.col-lg-offset-0{margin-right:0;margin-left:0}}th{text-align:right}@media screen and (max-width:767px){.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-right:0;border-left:auto}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-left:0;border-right:auto}}.radio label,.checkbox label{padding-right:20px;padding-left:auto}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:right;margin-right:20px;margin-left:0}.radio-inline,.checkbox-inline{padding-right:20px;padding-left:0}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-right:10px;margin-left:0}.has-feedback .form-control{padding-left:42.5px;padding-right:auto}.form-control-feedback{left:0;right:auto}@media (min-width:768px){.form-inline .radio,.form-inline .checkbox{padding-right:0;padding-left:auto}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{margin-right:0;margin-left:auto}}@media (min-width:768px){.form-horizontal .control-label{text-align:left}}.form-horizontal .has-feedback .form-control-feedback{left:15px;right:auto}.caret{margin-right:2px;margin-left:0}.dropdown-menu{right:0;left:auto;float:left;text-align:right}.dropdown-menu.pull-left{left:0;float:right;right:auto}.pull-left>.dropdown-menu{left:0;float:right;right:auto}.navbar-nav.pull-left>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-left{right:auto;left:0}.btn-group>.btn,.btn-group-vertical>.btn{float:right}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-right:-1px;margin-left:0}.btn-toolbar{margin-right:-5px;margin-left:0}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:right}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-right:5px;margin-left:0}.btn-group>.btn:first-child{margin-right:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group{float:right}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-right-radius:0;border-top-right-radius:0}.btn .caret{margin-right:0}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-right:0}.input-group .form-control{float:right}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:first-child{border-right:1px solid #ccc;border-left:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:last-child{border-left:1px solid #ccc;border-right:0}.input-group-btn>.btn+.btn{margin-right:-1px;margin-left:auto}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-left:-1px;margin-right:auto}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-right:-1px;margin-left:auto}.nav{padding-right:0;padding-left:auto}.nav-tabs>li{float:right}.nav-tabs>li>a{margin-left:auto;margin-right:-2px;border-radius:4px 4px 0 0}.nav-pills>li{float:right}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-right:2px;margin-left:auto}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-right:0;margin-left:auto}.nav-justified>.dropdown .dropdown-menu{right:auto}.nav-tabs-justified>li>a{margin-left:0;margin-right:auto}@media (min-width:768px){.nav-tabs-justified>li>a{border-radius:4px 4px 0 0}}@media (min-width:768px){.navbar-header{float:right}}.navbar-collapse{padding-right:15px;padding-left:15px}.navbar-brand{float:right}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-right:-15px;margin-left:auto}}.navbar-toggle{float:left;margin-left:15px;margin-right:auto}@media (max-width:767px){.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 25px 5px 15px}}@media (min-width:768px){.navbar-nav{float:right}.navbar-nav>li{float:right}.navbar-nav.navbar-right:last-child{margin-left:-15px;margin-right:auto}.navbar-nav.navbar-right.flip{float:left!important}.navbar-nav.navbar-right .dropdown-menu{left:0;right:auto}}@media (min-width:768px){.navbar-text{float:right}.navbar-text.navbar-right:last-child{margin-left:0;margin-right:auto}}.pagination{padding-right:0}.pagination>li>a,.pagination>li>span{float:right;margin-right:-1px;margin-left:0}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-left-radius:0;border-top-left-radius:0}.pagination>li:last-child>a,.pagination>li:last-child>span{margin-right:-1px;border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-top-right-radius:0}.pager{padding-right:0;padding-left:none}.pager .next>a,.pager .next>span{float:left}.pager .previous>a,.pager .previous>span{float:right}.nav-pills>li>a>.badge{margin-left:0;margin-right:3px}.alert-dismissable{padding-left:35px;padding-right:15px}.alert-dismissable .close{top:-2px;right:0;left:21}.progress-bar{float:right}.media,.media-body{overflow:hidden;zoom:1}.media>.pull-left{margin-right:10px}.media>.pull-left.flip{margin-right:0;margin-left:10px}.media>.pull-right{margin-left:10px}.media>.pull-right.flip{margin-left:0;margin-right:10px}.media-list{padding-right:0;padding-left:auto;list-style:none}.list-group{padding-right:0;padding-left:none}.list-group-item>.badge{float:left}.list-group-item>.badge+.badge{margin-ight:5px;margin-left:0}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-right-radius:3px;border-top-left-radius:0}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-left-radius:3px;border-top-right-radius:0}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px;border-top-right-radius:0}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px;border-top-left-radius:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-right:0;border-left:none}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:none;border-left:0}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object{right:0;left:none}.close{float:left}.modal-footer{text-align:left}.modal-footer .btn+.btn{margin-left:0;margin-right:5px}.modal-footer .btn-group .btn+.btn{margin-right:-1px;margin-left:0}.modal-footer .btn-block+.btn-block{margin-right:0;margin-left:none}.popover{right:0;left:none;text-align:right}.popover.top>.arrow{right:50%;left:none;margin-right:-11px;margin-left:0}.popover.top>.arrow:after{margin-right:-10px;margin-left:0}.carousel-inner>.item{-webkit-transition:.6s ease-in-out right;-o-transition:.6s ease-in-out right;transition:.6s ease-in-out right}.carousel-inner>.active{right:0}.carousel-inner>.next{right:100%;left:0}.carousel-inner>.prev{right:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{right:0}.carousel-inner>.active.right{left:-100%}.carousel-inner>.active.left{right:100%}.carousel-control{right:0;bottom:0}.carousel-control.left{right:auto;left:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5)0),color-stop(rgba(0,0,0,.0001)100%));background-image:-o-linear-gradient(left,rgba(0,0,0,.5)0,rgba(0,0,0,.0001)100%);background-image:linear-gradient(to right,rgba(0,0,0,.5)0,rgba(0,0,0,.0001)100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001)0),color-stop(rgba(0,0,0,.5)100%));background-image:-o-linear-gradient(left,rgba(0,0,0,.0001)0,rgba(0,0,0,.5)100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001)0,rgba(0,0,0,.5)100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;right:auto;margin-right:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;left:auto;margin-left:-10px}.carousel-indicators{right:50%;left:0;margin-right:-30%;margin-left:0;padding-left:0}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:0;margin-right:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-left:0;margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}}.pull-right.flip{float:left!important}.pull-left.flip{float:right!important}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442} \ No newline at end of file diff --git a/theme/bootstrap/css/bootstrap-theme.css b/theme/bootstrap/css/bootstrap-theme.css new file mode 100644 index 0000000..c19cd5c --- /dev/null +++ b/theme/bootstrap/css/bootstrap-theme.css @@ -0,0 +1,587 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +.btn-default, +.btn-primary, +.btn-success, +.btn-info, +.btn-warning, +.btn-danger { + text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); +} +.btn-default:active, +.btn-primary:active, +.btn-success:active, +.btn-info:active, +.btn-warning:active, +.btn-danger:active, +.btn-default.active, +.btn-primary.active, +.btn-success.active, +.btn-info.active, +.btn-warning.active, +.btn-danger.active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-default.disabled, +.btn-primary.disabled, +.btn-success.disabled, +.btn-info.disabled, +.btn-warning.disabled, +.btn-danger.disabled, +.btn-default[disabled], +.btn-primary[disabled], +.btn-success[disabled], +.btn-info[disabled], +.btn-warning[disabled], +.btn-danger[disabled], +fieldset[disabled] .btn-default, +fieldset[disabled] .btn-primary, +fieldset[disabled] .btn-success, +fieldset[disabled] .btn-info, +fieldset[disabled] .btn-warning, +fieldset[disabled] .btn-danger { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default .badge, +.btn-primary .badge, +.btn-success .badge, +.btn-info .badge, +.btn-warning .badge, +.btn-danger .badge { + text-shadow: none; +} +.btn:active, +.btn.active { + background-image: none; +} +.btn-default { + text-shadow: 0 1px 0 #fff; + background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); + background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #dbdbdb; + border-color: #ccc; +} +.btn-default:hover, +.btn-default:focus { + background-color: #e0e0e0; + background-position: 0 -15px; +} +.btn-default:active, +.btn-default.active { + background-color: #e0e0e0; + border-color: #dbdbdb; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #e0e0e0; + background-image: none; +} +.btn-primary { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); + background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #245580; +} +.btn-primary:hover, +.btn-primary:focus { + background-color: #265a88; + background-position: 0 -15px; +} +.btn-primary:active, +.btn-primary.active { + background-color: #265a88; + border-color: #245580; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #265a88; + background-image: none; +} +.btn-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #3e8f3e; +} +.btn-success:hover, +.btn-success:focus { + background-color: #419641; + background-position: 0 -15px; +} +.btn-success:active, +.btn-success.active { + background-color: #419641; + border-color: #3e8f3e; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #419641; + background-image: none; +} +.btn-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #28a4c9; +} +.btn-info:hover, +.btn-info:focus { + background-color: #2aabd2; + background-position: 0 -15px; +} +.btn-info:active, +.btn-info.active { + background-color: #2aabd2; + border-color: #28a4c9; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #2aabd2; + background-image: none; +} +.btn-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #e38d13; +} +.btn-warning:hover, +.btn-warning:focus { + background-color: #eb9316; + background-position: 0 -15px; +} +.btn-warning:active, +.btn-warning.active { + background-color: #eb9316; + border-color: #e38d13; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #eb9316; + background-image: none; +} +.btn-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #b92c28; +} +.btn-danger:hover, +.btn-danger:focus { + background-color: #c12e2a; + background-position: 0 -15px; +} +.btn-danger:active, +.btn-danger.active { + background-color: #c12e2a; + border-color: #b92c28; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #c12e2a; + background-image: none; +} +.thumbnail, +.img-thumbnail { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + background-color: #e8e8e8; + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + background-color: #2e6da4; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; +} +.navbar-default { + background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); + background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); + background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); +} +.navbar-brand, +.navbar-nav > li > a { + text-shadow: 0 1px 0 rgba(255, 255, 255, .25); +} +.navbar-inverse { + background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); + background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-radius: 4px; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); + background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); +} +.navbar-inverse .navbar-brand, +.navbar-inverse .navbar-nav > li > a { + text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); +} +.navbar-static-top, +.navbar-fixed-top, +.navbar-fixed-bottom { + border-radius: 0; +} +@media (max-width: 767px) { + .navbar .navbar-nav .open .dropdown-menu > .active > a, + .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; + } +} +.alert { + text-shadow: 0 1px 0 rgba(255, 255, 255, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); +} +.alert-success { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); + background-repeat: repeat-x; + border-color: #b2dba1; +} +.alert-info { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); + background-repeat: repeat-x; + border-color: #9acfea; +} +.alert-warning { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); + background-repeat: repeat-x; + border-color: #f5e79e; +} +.alert-danger { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); + background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); + background-repeat: repeat-x; + border-color: #dca7a7; +} +.progress { + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); + background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.list-group { + border-radius: 4px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + text-shadow: 0 -1px 0 #286090; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); + background-repeat: repeat-x; + border-color: #2b669a; +} +.list-group-item.active .badge, +.list-group-item.active:hover .badge, +.list-group-item.active:focus .badge { + text-shadow: none; +} +.panel { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: 0 1px 2px rgba(0, 0, 0, .05); +} +.panel-default > .panel-heading { + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.panel-primary > .panel-heading { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; +} +.panel-success > .panel-heading { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); + background-repeat: repeat-x; +} +.panel-info > .panel-heading { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); + background-repeat: repeat-x; +} +.panel-warning > .panel-heading { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); + background-repeat: repeat-x; +} +.panel-danger > .panel-heading { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); + background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); + background-repeat: repeat-x; +} +.well { + background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; + border-color: #dcdcdc; + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); +} +/*# sourceMappingURL=bootstrap-theme.css.map */ diff --git a/theme/bootstrap/css/bootstrap-theme.css.map b/theme/bootstrap/css/bootstrap-theme.css.map new file mode 100644 index 0000000..7535311 --- /dev/null +++ b/theme/bootstrap/css/bootstrap-theme.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAAA;;;;GAIG;ACeH;;;;;;EAME,yCAAA;EC2CA,4FAAA;EACQ,oFAAA;CFvDT;ACgBC;;;;;;;;;;;;ECsCA,yDAAA;EACQ,iDAAA;CFxCT;ACMC;;;;;;;;;;;;;;;;;;ECiCA,yBAAA;EACQ,iBAAA;CFnBT;AC/BD;;;;;;EAuBI,kBAAA;CDgBH;ACyBC;;EAEE,uBAAA;CDvBH;AC4BD;EErEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;EAuC2C,0BAAA;EAA2B,mBAAA;CDjBvE;ACpBC;;EAEE,0BAAA;EACA,6BAAA;CDsBH;ACnBC;;EAEE,0BAAA;EACA,sBAAA;CDqBH;ACfG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6BL;ACbD;EEtEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8DD;AC5DC;;EAEE,0BAAA;EACA,6BAAA;CD8DH;AC3DC;;EAEE,0BAAA;EACA,sBAAA;CD6DH;ACvDG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqEL;ACpDD;EEvEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CDsGD;ACpGC;;EAEE,0BAAA;EACA,6BAAA;CDsGH;ACnGC;;EAEE,0BAAA;EACA,sBAAA;CDqGH;AC/FG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6GL;AC3FD;EExEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8ID;AC5IC;;EAEE,0BAAA;EACA,6BAAA;CD8IH;AC3IC;;EAEE,0BAAA;EACA,sBAAA;CD6IH;ACvIG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqJL;AClID;EEzEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CDsLD;ACpLC;;EAEE,0BAAA;EACA,6BAAA;CDsLH;ACnLC;;EAEE,0BAAA;EACA,sBAAA;CDqLH;AC/KG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6LL;ACzKD;EE1EI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8ND;AC5NC;;EAEE,0BAAA;EACA,6BAAA;CD8NH;AC3NC;;EAEE,0BAAA;EACA,sBAAA;CD6NH;ACvNG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqOL;AC1MD;;EClCE,mDAAA;EACQ,2CAAA;CFgPT;ACrMD;;EE3FI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF0FF,0BAAA;CD2MD;ACzMD;;;EEhGI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFgGF,0BAAA;CD+MD;ACtMD;EE7GI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ECnBF,oEAAA;EH+HA,mBAAA;ECjEA,4FAAA;EACQ,oFAAA;CF8QT;ACjND;;EE7GI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ED2CF,yDAAA;EACQ,iDAAA;CFwRT;AC9MD;;EAEE,+CAAA;CDgND;AC5MD;EEhII,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ECnBF,oEAAA;EHkJA,mBAAA;CDkND;ACrND;;EEhII,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ED2CF,wDAAA;EACQ,gDAAA;CF+ST;AC/ND;;EAYI,0CAAA;CDuNH;AClND;;;EAGE,iBAAA;CDoND;AC/LD;EAfI;;;IAGE,YAAA;IE7JF,yEAAA;IACA,oEAAA;IACA,8FAAA;IAAA,uEAAA;IACA,4BAAA;IACA,uHAAA;GH+WD;CACF;AC3MD;EACE,8CAAA;EC3HA,2FAAA;EACQ,mFAAA;CFyUT;ACnMD;EEtLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CD+MD;AC1MD;EEvLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CDuND;ACjND;EExLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CD+ND;ACxND;EEzLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CDuOD;ACxND;EEjMI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH4ZH;ACrND;EE3MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHmaH;AC3ND;EE5MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH0aH;ACjOD;EE7MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHibH;ACvOD;EE9MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHwbH;AC7OD;EE/MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH+bH;AChPD;EElLI,8MAAA;EACA,yMAAA;EACA,sMAAA;CHqaH;AC5OD;EACE,mBAAA;EC9KA,mDAAA;EACQ,2CAAA;CF6ZT;AC7OD;;;EAGE,8BAAA;EEnOE,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFiOF,sBAAA;CDmPD;ACxPD;;;EAQI,kBAAA;CDqPH;AC3OD;ECnME,kDAAA;EACQ,0CAAA;CFibT;ACrOD;EE5PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHoeH;AC3OD;EE7PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH2eH;ACjPD;EE9PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHkfH;ACvPD;EE/PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHyfH;AC7PD;EEhQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHggBH;ACnQD;EEjQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHugBH;ACnQD;EExQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFsQF,sBAAA;EC3NA,0FAAA;EACQ,kFAAA;CFqeT","file":"bootstrap-theme.css","sourcesContent":["/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/theme/bootstrap/css/bootstrap-theme.min.css b/theme/bootstrap/css/bootstrap-theme.min.css new file mode 100644 index 0000000..61358b1 --- /dev/null +++ b/theme/bootstrap/css/bootstrap-theme.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} \ No newline at end of file diff --git a/theme/bootstrap/css/bootstrap.css b/theme/bootstrap/css/bootstrap.css new file mode 100644 index 0000000..fb15e3d --- /dev/null +++ b/theme/bootstrap/css/bootstrap.css @@ -0,0 +1,6584 @@ +/*! + * Bootstrap v3.3.4 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +mark { + color: #000; + background: #ff0; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -.5em; +} +sub { + bottom: -.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + select { + background: #fff !important; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\2a"; +} +.glyphicon-plus:before { + content: "\2b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: .01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"], + input[type="time"], + input[type="datetime-local"], + input[type="month"] { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.form-group-sm .form-control { + height: 30px; + line-height: 30px; +} +textarea.form-group-sm .form-control, +select[multiple].form-group-sm .form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.form-group-lg .form-control { + height: 46px; + line-height: 46px; +} +textarea.form-group-lg .form-control, +select[multiple].form-group-lg .form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 14.333333px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + pointer-events: none; + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:hover, +.btn-default:focus, +.btn-default.focus, +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary.focus, +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:hover, +.btn-success:focus, +.btn-success.focus, +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:hover, +.btn-info:focus, +.btn-info.focus, +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:hover, +.btn-warning:focus, +.btn-warning.focus, +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:hover, +.btn-danger:focus, +.btn-danger.focus, +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px solid; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eee; +} +.nav > li.disabled > a { + color: #777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 2; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + background-color: #777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding: 30px 15px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding: 48px 0; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +a.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +a.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +a.list-group-item-success.active:hover, +a.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +a.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +a.list-group-item-info.active:hover, +a.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +a.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +a.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +.modal-header { + min-height: 16.42857143px; + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-weight: normal; + line-height: 1.4; + filter: alpha(opacity=0); + opacity: 0; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + text-decoration: none; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000; + perspective: 1000; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + filter: alpha(opacity=50); + opacity: .5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -15px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/theme/bootstrap/css/bootstrap.css.map b/theme/bootstrap/css/bootstrap.css.map new file mode 100644 index 0000000..9f60ed2 --- /dev/null +++ b/theme/bootstrap/css/bootstrap.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,4EAA4E;ACG5E;EACE,wBAAA;EACA,2BAAA;EACA,+BAAA;CDDD;ACQD;EACE,UAAA;CDND;ACmBD;;;;;;;;;;;;;EAaE,eAAA;CDjBD;ACyBD;;;;EAIE,sBAAA;EACA,yBAAA;CDvBD;AC+BD;EACE,cAAA;EACA,UAAA;CD7BD;ACqCD;;EAEE,cAAA;CDnCD;AC6CD;EACE,8BAAA;CD3CD;ACmDD;;EAEE,WAAA;CDjDD;AC2DD;EACE,0BAAA;CDzDD;ACgED;;EAEE,kBAAA;CD9DD;ACqED;EACE,mBAAA;CDnED;AC2ED;EACE,eAAA;EACA,iBAAA;CDzED;ACgFD;EACE,iBAAA;EACA,YAAA;CD9ED;ACqFD;EACE,eAAA;CDnFD;AC0FD;;EAEE,eAAA;EACA,eAAA;EACA,mBAAA;EACA,yBAAA;CDxFD;AC2FD;EACE,YAAA;CDzFD;AC4FD;EACE,gBAAA;CD1FD;ACoGD;EACE,UAAA;CDlGD;ACyGD;EACE,iBAAA;CDvGD;ACiHD;EACE,iBAAA;CD/GD;ACsHD;EACE,gCAAA;KAAA,6BAAA;UAAA,wBAAA;EACA,UAAA;CDpHD;AC2HD;EACE,eAAA;CDzHD;ACgID;;;;EAIE,kCAAA;EACA,eAAA;CD9HD;ACgJD;;;;;EAKE,eAAA;EACA,cAAA;EACA,UAAA;CD9ID;ACqJD;EACE,kBAAA;CDnJD;AC6JD;;EAEE,qBAAA;CD3JD;ACsKD;;;;EAIE,2BAAA;EACA,gBAAA;CDpKD;AC2KD;;EAEE,gBAAA;CDzKD;ACgLD;;EAEE,UAAA;EACA,WAAA;CD9KD;ACsLD;EACE,oBAAA;CDpLD;AC+LD;;EAEE,+BAAA;KAAA,4BAAA;UAAA,uBAAA;EACA,WAAA;CD7LD;ACsMD;;EAEE,aAAA;CDpMD;AC4MD;EACE,8BAAA;EACA,gCAAA;KAAA,6BAAA;UAAA,wBAAA;CD1MD;ACmND;;EAEE,yBAAA;CDjND;ACwND;EACE,0BAAA;EACA,cAAA;EACA,+BAAA;CDtND;AC8ND;EACE,UAAA;EACA,WAAA;CD5ND;ACmOD;EACE,eAAA;CDjOD;ACyOD;EACE,kBAAA;CDvOD;ACiPD;EACE,0BAAA;EACA,kBAAA;CD/OD;ACkPD;;EAEE,WAAA;CDhPD;AACD,qFAAqF;AElFrF;EA7FI;;;IAGI,mCAAA;IACA,uBAAA;IACA,oCAAA;YAAA,4BAAA;IACA,6BAAA;GFkLL;EE/KC;;IAEI,2BAAA;GFiLL;EE9KC;IACI,6BAAA;GFgLL;EE7KC;IACI,8BAAA;GF+KL;EE1KC;;IAEI,YAAA;GF4KL;EEzKC;;IAEI,uBAAA;IACA,yBAAA;GF2KL;EExKC;IACI,4BAAA;GF0KL;EEvKC;;IAEI,yBAAA;GFyKL;EEtKC;IACI,2BAAA;GFwKL;EErKC;;;IAGI,WAAA;IACA,UAAA;GFuKL;EEpKC;;IAEI,wBAAA;GFsKL;EEhKC;IACI,cAAA;GFkKL;EEhKC;;IAGQ,kCAAA;GFiKT;EE9JC;IACI,uBAAA;GFgKL;EE7JC;IACI,qCAAA;GF+JL;EEhKC;;IAKQ,kCAAA;GF+JT;EE5JC;;IAGQ,kCAAA;GF6JT;CACF;AGnPD;EACE,oCAAA;EACA,sDAAA;EACA,gYAAA;CHqPD;AG7OD;EACE,mBAAA;EACA,SAAA;EACA,sBAAA;EACA,oCAAA;EACA,mBAAA;EACA,oBAAA;EACA,eAAA;EACA,oCAAA;EACA,mCAAA;CH+OD;AG3OmC;EAAW,eAAA;CH8O9C;AG7OmC;EAAW,eAAA;CHgP9C;AG9OmC;;EAAW,iBAAA;CHkP9C;AGjPmC;EAAW,iBAAA;CHoP9C;AGnPmC;EAAW,iBAAA;CHsP9C;AGrPmC;EAAW,iBAAA;CHwP9C;AGvPmC;EAAW,iBAAA;CH0P9C;AGzPmC;EAAW,iBAAA;CH4P9C;AG3PmC;EAAW,iBAAA;CH8P9C;AG7PmC;EAAW,iBAAA;CHgQ9C;AG/PmC;EAAW,iBAAA;CHkQ9C;AGjQmC;EAAW,iBAAA;CHoQ9C;AGnQmC;EAAW,iBAAA;CHsQ9C;AGrQmC;EAAW,iBAAA;CHwQ9C;AGvQmC;EAAW,iBAAA;CH0Q9C;AGzQmC;EAAW,iBAAA;CH4Q9C;AG3QmC;EAAW,iBAAA;CH8Q9C;AG7QmC;EAAW,iBAAA;CHgR9C;AG/QmC;EAAW,iBAAA;CHkR9C;AGjRmC;EAAW,iBAAA;CHoR9C;AGnRmC;EAAW,iBAAA;CHsR9C;AGrRmC;EAAW,iBAAA;CHwR9C;AGvRmC;EAAW,iBAAA;CH0R9C;AGzRmC;EAAW,iBAAA;CH4R9C;AG3RmC;EAAW,iBAAA;CH8R9C;AG7RmC;EAAW,iBAAA;CHgS9C;AG/RmC;EAAW,iBAAA;CHkS9C;AGjSmC;EAAW,iBAAA;CHoS9C;AGnSmC;EAAW,iBAAA;CHsS9C;AGrSmC;EAAW,iBAAA;CHwS9C;AGvSmC;EAAW,iBAAA;CH0S9C;AGzSmC;EAAW,iBAAA;CH4S9C;AG3SmC;EAAW,iBAAA;CH8S9C;AG7SmC;EAAW,iBAAA;CHgT9C;AG/SmC;EAAW,iBAAA;CHkT9C;AGjTmC;EAAW,iBAAA;CHoT9C;AGnTmC;EAAW,iBAAA;CHsT9C;AGrTmC;EAAW,iBAAA;CHwT9C;AGvTmC;EAAW,iBAAA;CH0T9C;AGzTmC;EAAW,iBAAA;CH4T9C;AG3TmC;EAAW,iBAAA;CH8T9C;AG7TmC;EAAW,iBAAA;CHgU9C;AG/TmC;EAAW,iBAAA;CHkU9C;AGjUmC;EAAW,iBAAA;CHoU9C;AGnUmC;EAAW,iBAAA;CHsU9C;AGrUmC;EAAW,iBAAA;CHwU9C;AGvUmC;EAAW,iBAAA;CH0U9C;AGzUmC;EAAW,iBAAA;CH4U9C;AG3UmC;EAAW,iBAAA;CH8U9C;AG7UmC;EAAW,iBAAA;CHgV9C;AG/UmC;EAAW,iBAAA;CHkV9C;AGjVmC;EAAW,iBAAA;CHoV9C;AGnVmC;EAAW,iBAAA;CHsV9C;AGrVmC;EAAW,iBAAA;CHwV9C;AGvVmC;EAAW,iBAAA;CH0V9C;AGzVmC;EAAW,iBAAA;CH4V9C;AG3VmC;EAAW,iBAAA;CH8V9C;AG7VmC;EAAW,iBAAA;CHgW9C;AG/VmC;EAAW,iBAAA;CHkW9C;AGjWmC;EAAW,iBAAA;CHoW9C;AGnWmC;EAAW,iBAAA;CHsW9C;AGrWmC;EAAW,iBAAA;CHwW9C;AGvWmC;EAAW,iBAAA;CH0W9C;AGzWmC;EAAW,iBAAA;CH4W9C;AG3WmC;EAAW,iBAAA;CH8W9C;AG7WmC;EAAW,iBAAA;CHgX9C;AG/WmC;EAAW,iBAAA;CHkX9C;AGjXmC;EAAW,iBAAA;CHoX9C;AGnXmC;EAAW,iBAAA;CHsX9C;AGrXmC;EAAW,iBAAA;CHwX9C;AGvXmC;EAAW,iBAAA;CH0X9C;AGzXmC;EAAW,iBAAA;CH4X9C;AG3XmC;EAAW,iBAAA;CH8X9C;AG7XmC;EAAW,iBAAA;CHgY9C;AG/XmC;EAAW,iBAAA;CHkY9C;AGjYmC;EAAW,iBAAA;CHoY9C;AGnYmC;EAAW,iBAAA;CHsY9C;AGrYmC;EAAW,iBAAA;CHwY9C;AGvYmC;EAAW,iBAAA;CH0Y9C;AGzYmC;EAAW,iBAAA;CH4Y9C;AG3YmC;EAAW,iBAAA;CH8Y9C;AG7YmC;EAAW,iBAAA;CHgZ9C;AG/YmC;EAAW,iBAAA;CHkZ9C;AGjZmC;EAAW,iBAAA;CHoZ9C;AGnZmC;EAAW,iBAAA;CHsZ9C;AGrZmC;EAAW,iBAAA;CHwZ9C;AGvZmC;EAAW,iBAAA;CH0Z9C;AGzZmC;EAAW,iBAAA;CH4Z9C;AG3ZmC;EAAW,iBAAA;CH8Z9C;AG7ZmC;EAAW,iBAAA;CHga9C;AG/ZmC;EAAW,iBAAA;CHka9C;AGjamC;EAAW,iBAAA;CHoa9C;AGnamC;EAAW,iBAAA;CHsa9C;AGramC;EAAW,iBAAA;CHwa9C;AGvamC;EAAW,iBAAA;CH0a9C;AGzamC;EAAW,iBAAA;CH4a9C;AG3amC;EAAW,iBAAA;CH8a9C;AG7amC;EAAW,iBAAA;CHgb9C;AG/amC;EAAW,iBAAA;CHkb9C;AGjbmC;EAAW,iBAAA;CHob9C;AGnbmC;EAAW,iBAAA;CHsb9C;AGrbmC;EAAW,iBAAA;CHwb9C;AGvbmC;EAAW,iBAAA;CH0b9C;AGzbmC;EAAW,iBAAA;CH4b9C;AG3bmC;EAAW,iBAAA;CH8b9C;AG7bmC;EAAW,iBAAA;CHgc9C;AG/bmC;EAAW,iBAAA;CHkc9C;AGjcmC;EAAW,iBAAA;CHoc9C;AGncmC;EAAW,iBAAA;CHsc9C;AGrcmC;EAAW,iBAAA;CHwc9C;AGvcmC;EAAW,iBAAA;CH0c9C;AGzcmC;EAAW,iBAAA;CH4c9C;AG3cmC;EAAW,iBAAA;CH8c9C;AG7cmC;EAAW,iBAAA;CHgd9C;AG/cmC;EAAW,iBAAA;CHkd9C;AGjdmC;EAAW,iBAAA;CHod9C;AGndmC;EAAW,iBAAA;CHsd9C;AGrdmC;EAAW,iBAAA;CHwd9C;AGvdmC;EAAW,iBAAA;CH0d9C;AGzdmC;EAAW,iBAAA;CH4d9C;AG3dmC;EAAW,iBAAA;CH8d9C;AG7dmC;EAAW,iBAAA;CHge9C;AG/dmC;EAAW,iBAAA;CHke9C;AGjemC;EAAW,iBAAA;CHoe9C;AGnemC;EAAW,iBAAA;CHse9C;AGremC;EAAW,iBAAA;CHwe9C;AGvemC;EAAW,iBAAA;CH0e9C;AGzemC;EAAW,iBAAA;CH4e9C;AG3emC;EAAW,iBAAA;CH8e9C;AG7emC;EAAW,iBAAA;CHgf9C;AG/emC;EAAW,iBAAA;CHkf9C;AGjfmC;EAAW,iBAAA;CHof9C;AGnfmC;EAAW,iBAAA;CHsf9C;AGrfmC;EAAW,iBAAA;CHwf9C;AGvfmC;EAAW,iBAAA;CH0f9C;AGzfmC;EAAW,iBAAA;CH4f9C;AG3fmC;EAAW,iBAAA;CH8f9C;AG7fmC;EAAW,iBAAA;CHggB9C;AG/fmC;EAAW,iBAAA;CHkgB9C;AGjgBmC;EAAW,iBAAA;CHogB9C;AGngBmC;EAAW,iBAAA;CHsgB9C;AGrgBmC;EAAW,iBAAA;CHwgB9C;AGvgBmC;EAAW,iBAAA;CH0gB9C;AGzgBmC;EAAW,iBAAA;CH4gB9C;AG3gBmC;EAAW,iBAAA;CH8gB9C;AG7gBmC;EAAW,iBAAA;CHghB9C;AG/gBmC;EAAW,iBAAA;CHkhB9C;AGjhBmC;EAAW,iBAAA;CHohB9C;AGnhBmC;EAAW,iBAAA;CHshB9C;AGrhBmC;EAAW,iBAAA;CHwhB9C;AGvhBmC;EAAW,iBAAA;CH0hB9C;AGzhBmC;EAAW,iBAAA;CH4hB9C;AG3hBmC;EAAW,iBAAA;CH8hB9C;AG7hBmC;EAAW,iBAAA;CHgiB9C;AG/hBmC;EAAW,iBAAA;CHkiB9C;AGjiBmC;EAAW,iBAAA;CHoiB9C;AGniBmC;EAAW,iBAAA;CHsiB9C;AGriBmC;EAAW,iBAAA;CHwiB9C;AGviBmC;EAAW,iBAAA;CH0iB9C;AGziBmC;EAAW,iBAAA;CH4iB9C;AG3iBmC;EAAW,iBAAA;CH8iB9C;AG7iBmC;EAAW,iBAAA;CHgjB9C;AG/iBmC;EAAW,iBAAA;CHkjB9C;AGjjBmC;EAAW,iBAAA;CHojB9C;AGnjBmC;EAAW,iBAAA;CHsjB9C;AGrjBmC;EAAW,iBAAA;CHwjB9C;AGvjBmC;EAAW,iBAAA;CH0jB9C;AGzjBmC;EAAW,iBAAA;CH4jB9C;AG3jBmC;EAAW,iBAAA;CH8jB9C;AG7jBmC;EAAW,iBAAA;CHgkB9C;AG/jBmC;EAAW,iBAAA;CHkkB9C;AGjkBmC;EAAW,iBAAA;CHokB9C;AGnkBmC;EAAW,iBAAA;CHskB9C;AGrkBmC;EAAW,iBAAA;CHwkB9C;AGvkBmC;EAAW,iBAAA;CH0kB9C;AGzkBmC;EAAW,iBAAA;CH4kB9C;AG3kBmC;EAAW,iBAAA;CH8kB9C;AG7kBmC;EAAW,iBAAA;CHglB9C;AG/kBmC;EAAW,iBAAA;CHklB9C;AGjlBmC;EAAW,iBAAA;CHolB9C;AGnlBmC;EAAW,iBAAA;CHslB9C;AGrlBmC;EAAW,iBAAA;CHwlB9C;AGvlBmC;EAAW,iBAAA;CH0lB9C;AGzlBmC;EAAW,iBAAA;CH4lB9C;AG3lBmC;EAAW,iBAAA;CH8lB9C;AG7lBmC;EAAW,iBAAA;CHgmB9C;AG/lBmC;EAAW,iBAAA;CHkmB9C;AGjmBmC;EAAW,iBAAA;CHomB9C;AGnmBmC;EAAW,iBAAA;CHsmB9C;AGrmBmC;EAAW,iBAAA;CHwmB9C;AGvmBmC;EAAW,iBAAA;CH0mB9C;AGzmBmC;EAAW,iBAAA;CH4mB9C;AG3mBmC;EAAW,iBAAA;CH8mB9C;AG7mBmC;EAAW,iBAAA;CHgnB9C;AG/mBmC;EAAW,iBAAA;CHknB9C;AGjnBmC;EAAW,iBAAA;CHonB9C;AGnnBmC;EAAW,iBAAA;CHsnB9C;AGrnBmC;EAAW,iBAAA;CHwnB9C;AGvnBmC;EAAW,iBAAA;CH0nB9C;AGznBmC;EAAW,iBAAA;CH4nB9C;AG3nBmC;EAAW,iBAAA;CH8nB9C;AG7nBmC;EAAW,iBAAA;CHgoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AGvoBmC;EAAW,iBAAA;CH0oB9C;AGzoBmC;EAAW,iBAAA;CH4oB9C;AG3oBmC;EAAW,iBAAA;CH8oB9C;AG7oBmC;EAAW,iBAAA;CHgpB9C;AG/oBmC;EAAW,iBAAA;CHkpB9C;AGjpBmC;EAAW,iBAAA;CHopB9C;AGnpBmC;EAAW,iBAAA;CHspB9C;AGrpBmC;EAAW,iBAAA;CHwpB9C;AGvpBmC;EAAW,iBAAA;CH0pB9C;AGzpBmC;EAAW,iBAAA;CH4pB9C;AG3pBmC;EAAW,iBAAA;CH8pB9C;AG7pBmC;EAAW,iBAAA;CHgqB9C;AG/pBmC;EAAW,iBAAA;CHkqB9C;AGjqBmC;EAAW,iBAAA;CHoqB9C;AGnqBmC;EAAW,iBAAA;CHsqB9C;AGrqBmC;EAAW,iBAAA;CHwqB9C;AGvqBmC;EAAW,iBAAA;CH0qB9C;AGzqBmC;EAAW,iBAAA;CH4qB9C;AG3qBmC;EAAW,iBAAA;CH8qB9C;AG7qBmC;EAAW,iBAAA;CHgrB9C;AG/qBmC;EAAW,iBAAA;CHkrB9C;AGjrBmC;EAAW,iBAAA;CHorB9C;AGnrBmC;EAAW,iBAAA;CHsrB9C;AGrrBmC;EAAW,iBAAA;CHwrB9C;AGvrBmC;EAAW,iBAAA;CH0rB9C;AGzrBmC;EAAW,iBAAA;CH4rB9C;AG3rBmC;EAAW,iBAAA;CH8rB9C;AG7rBmC;EAAW,iBAAA;CHgsB9C;AG/rBmC;EAAW,iBAAA;CHksB9C;AGjsBmC;EAAW,iBAAA;CHosB9C;AGnsBmC;EAAW,iBAAA;CHssB9C;AGrsBmC;EAAW,iBAAA;CHwsB9C;AGvsBmC;EAAW,iBAAA;CH0sB9C;AGzsBmC;EAAW,iBAAA;CH4sB9C;AG3sBmC;EAAW,iBAAA;CH8sB9C;AG7sBmC;EAAW,iBAAA;CHgtB9C;AG/sBmC;EAAW,iBAAA;CHktB9C;AGjtBmC;EAAW,iBAAA;CHotB9C;AGntBmC;EAAW,iBAAA;CHstB9C;AGrtBmC;EAAW,iBAAA;CHwtB9C;AGvtBmC;EAAW,iBAAA;CH0tB9C;AGztBmC;EAAW,iBAAA;CH4tB9C;AG3tBmC;EAAW,iBAAA;CH8tB9C;AG7tBmC;EAAW,iBAAA;CHguB9C;AG/tBmC;EAAW,iBAAA;CHkuB9C;AGjuBmC;EAAW,iBAAA;CHouB9C;AGnuBmC;EAAW,iBAAA;CHsuB9C;AGruBmC;EAAW,iBAAA;CHwuB9C;AGvuBmC;EAAW,iBAAA;CH0uB9C;AGzuBmC;EAAW,iBAAA;CH4uB9C;AG3uBmC;EAAW,iBAAA;CH8uB9C;AG7uBmC;EAAW,iBAAA;CHgvB9C;AIthCD;ECgEE,+BAAA;EACG,4BAAA;EACK,uBAAA;CLy9BT;AIxhCD;;EC6DE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL+9BT;AIthCD;EACE,gBAAA;EACA,8CAAA;CJwhCD;AIrhCD;EACE,4DAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,0BAAA;CJuhCD;AInhCD;;;;EAIE,qBAAA;EACA,mBAAA;EACA,qBAAA;CJqhCD;AI/gCD;EACE,eAAA;EACA,sBAAA;CJihCD;AI/gCC;;EAEE,eAAA;EACA,2BAAA;CJihCH;AI9gCC;EErDA,qBAAA;EAEA,2CAAA;EACA,qBAAA;CNqkCD;AIxgCD;EACE,UAAA;CJ0gCD;AIpgCD;EACE,uBAAA;CJsgCD;AIlgCD;;;;;EGvEE,eAAA;EACA,gBAAA;EACA,aAAA;CPglCD;AItgCD;EACE,mBAAA;CJwgCD;AIlgCD;EACE,aAAA;EACA,wBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;EC6FA,yCAAA;EACK,oCAAA;EACG,iCAAA;EEvLR,sBAAA;EACA,gBAAA;EACA,aAAA;CPgmCD;AIlgCD;EACE,mBAAA;CJogCD;AI9/BD;EACE,iBAAA;EACA,oBAAA;EACA,UAAA;EACA,8BAAA;CJggCD;AIx/BD;EACE,mBAAA;EACA,WAAA;EACA,YAAA;EACA,aAAA;EACA,WAAA;EACA,iBAAA;EACA,uBAAA;EACA,UAAA;CJ0/BD;AIl/BC;;EAEE,iBAAA;EACA,YAAA;EACA,aAAA;EACA,UAAA;EACA,kBAAA;EACA,WAAA;CJo/BH;AIz+BD;EACE,gBAAA;CJ2+BD;AQloCD;;;;;;;;;;;;EAEE,qBAAA;EACA,iBAAA;EACA,iBAAA;EACA,eAAA;CR8oCD;AQnpCD;;;;;;;;;;;;;;;;;;;;;;;;EASI,oBAAA;EACA,eAAA;EACA,eAAA;CRoqCH;AQhqCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRqqCD;AQzqCD;;;;;;;;;;;;EAQI,eAAA;CR+qCH;AQ5qCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRirCD;AQrrCD;;;;;;;;;;;;EAQI,eAAA;CR2rCH;AQvrCD;;EAAU,gBAAA;CR2rCT;AQ1rCD;;EAAU,gBAAA;CR8rCT;AQ7rCD;;EAAU,gBAAA;CRisCT;AQhsCD;;EAAU,gBAAA;CRosCT;AQnsCD;;EAAU,gBAAA;CRusCT;AQtsCD;;EAAU,gBAAA;CR0sCT;AQpsCD;EACE,iBAAA;CRssCD;AQnsCD;EACE,oBAAA;EACA,gBAAA;EACA,iBAAA;EACA,iBAAA;CRqsCD;AQhsCD;EAAA;IAFI,gBAAA;GRssCD;CACF;AQ9rCD;;EAEE,eAAA;CRgsCD;AQ7rCD;;EAEE,0BAAA;EACA,cAAA;CR+rCD;AQ3rCD;EAAuB,iBAAA;CR8rCtB;AQ7rCD;EAAuB,kBAAA;CRgsCtB;AQ/rCD;EAAuB,mBAAA;CRksCtB;AQjsCD;EAAuB,oBAAA;CRosCtB;AQnsCD;EAAuB,oBAAA;CRssCtB;AQnsCD;EAAuB,0BAAA;CRssCtB;AQrsCD;EAAuB,0BAAA;CRwsCtB;AQvsCD;EAAuB,2BAAA;CR0sCtB;AQvsCD;EACE,eAAA;CRysCD;AQvsCD;ECrGE,eAAA;CT+yCD;AS9yCC;;EAEE,eAAA;CTgzCH;AQ3sCD;ECxGE,eAAA;CTszCD;ASrzCC;;EAEE,eAAA;CTuzCH;AQ/sCD;EC3GE,eAAA;CT6zCD;AS5zCC;;EAEE,eAAA;CT8zCH;AQntCD;EC9GE,eAAA;CTo0CD;ASn0CC;;EAEE,eAAA;CTq0CH;AQvtCD;ECjHE,eAAA;CT20CD;AS10CC;;EAEE,eAAA;CT40CH;AQvtCD;EAGE,YAAA;EE3HA,0BAAA;CVm1CD;AUl1CC;;EAEE,0BAAA;CVo1CH;AQztCD;EE9HE,0BAAA;CV01CD;AUz1CC;;EAEE,0BAAA;CV21CH;AQ7tCD;EEjIE,0BAAA;CVi2CD;AUh2CC;;EAEE,0BAAA;CVk2CH;AQjuCD;EEpIE,0BAAA;CVw2CD;AUv2CC;;EAEE,0BAAA;CVy2CH;AQruCD;EEvIE,0BAAA;CV+2CD;AU92CC;;EAEE,0BAAA;CVg3CH;AQpuCD;EACE,oBAAA;EACA,oBAAA;EACA,iCAAA;CRsuCD;AQ9tCD;;EAEE,cAAA;EACA,oBAAA;CRguCD;AQnuCD;;;;EAMI,iBAAA;CRmuCH;AQ5tCD;EACE,gBAAA;EACA,iBAAA;CR8tCD;AQ1tCD;EALE,gBAAA;EACA,iBAAA;EAMA,kBAAA;CR6tCD;AQ/tCD;EAKI,sBAAA;EACA,kBAAA;EACA,mBAAA;CR6tCH;AQxtCD;EACE,cAAA;EACA,oBAAA;CR0tCD;AQxtCD;;EAEE,wBAAA;CR0tCD;AQxtCD;EACE,kBAAA;CR0tCD;AQxtCD;EACE,eAAA;CR0tCD;AQjsCD;EAAA;IAVM,YAAA;IACA,aAAA;IACA,YAAA;IACA,kBAAA;IGtNJ,iBAAA;IACA,wBAAA;IACA,oBAAA;GXs6CC;EQ3sCH;IAHM,mBAAA;GRitCH;CACF;AQxsCD;;EAGE,aAAA;EACA,kCAAA;CRysCD;AQvsCD;EACE,eAAA;EA9IqB,0BAAA;CRw1CtB;AQrsCD;EACE,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,+BAAA;CRusCD;AQlsCG;;;EACE,iBAAA;CRssCL;AQhtCD;;;EAmBI,eAAA;EACA,eAAA;EACA,wBAAA;EACA,eAAA;CRksCH;AQhsCG;;;EACE,uBAAA;CRosCL;AQ5rCD;;EAEE,oBAAA;EACA,gBAAA;EACA,gCAAA;EACA,eAAA;EACA,kBAAA;CR8rCD;AQxrCG;;;;;;EAAW,YAAA;CRgsCd;AQ/rCG;;;;;;EACE,uBAAA;CRssCL;AQhsCD;EACE,oBAAA;EACA,mBAAA;EACA,wBAAA;CRksCD;AYx+CD;;;;EAIE,+DAAA;CZ0+CD;AYt+CD;EACE,iBAAA;EACA,eAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;CZw+CD;AYp+CD;EACE,iBAAA;EACA,eAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;EACA,uDAAA;UAAA,+CAAA;CZs+CD;AY5+CD;EASI,WAAA;EACA,gBAAA;EACA,kBAAA;EACA,yBAAA;UAAA,iBAAA;CZs+CH;AYj+CD;EACE,eAAA;EACA,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,sBAAA;EACA,sBAAA;EACA,eAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;CZm+CD;AY9+CD;EAeI,WAAA;EACA,mBAAA;EACA,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,iBAAA;CZk+CH;AY79CD;EACE,kBAAA;EACA,mBAAA;CZ+9CD;AazhDD;ECHE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;Cd+hDD;AazhDC;EAAA;IAFE,aAAA;Gb+hDD;CACF;Aa3hDC;EAAA;IAFE,aAAA;GbiiDD;CACF;Aa7hDD;EAAA;IAFI,cAAA;GbmiDD;CACF;Aa1hDD;ECvBE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;CdojDD;AavhDD;ECvBE,mBAAA;EACA,oBAAA;CdijDD;AejjDG;EACE,mBAAA;EAEA,gBAAA;EAEA,mBAAA;EACA,oBAAA;CfijDL;AejiDG;EACE,YAAA;CfmiDL;Ae5hDC;EACE,YAAA;Cf8hDH;Ae/hDC;EACE,oBAAA;CfiiDH;AeliDC;EACE,oBAAA;CfoiDH;AeriDC;EACE,WAAA;CfuiDH;AexiDC;EACE,oBAAA;Cf0iDH;Ae3iDC;EACE,oBAAA;Cf6iDH;Ae9iDC;EACE,WAAA;CfgjDH;AejjDC;EACE,oBAAA;CfmjDH;AepjDC;EACE,oBAAA;CfsjDH;AevjDC;EACE,WAAA;CfyjDH;Ae1jDC;EACE,oBAAA;Cf4jDH;Ae7jDC;EACE,mBAAA;Cf+jDH;AejjDC;EACE,YAAA;CfmjDH;AepjDC;EACE,oBAAA;CfsjDH;AevjDC;EACE,oBAAA;CfyjDH;Ae1jDC;EACE,WAAA;Cf4jDH;Ae7jDC;EACE,oBAAA;Cf+jDH;AehkDC;EACE,oBAAA;CfkkDH;AenkDC;EACE,WAAA;CfqkDH;AetkDC;EACE,oBAAA;CfwkDH;AezkDC;EACE,oBAAA;Cf2kDH;Ae5kDC;EACE,WAAA;Cf8kDH;Ae/kDC;EACE,oBAAA;CfilDH;AellDC;EACE,mBAAA;CfolDH;AehlDC;EACE,YAAA;CfklDH;AelmDC;EACE,WAAA;CfomDH;AermDC;EACE,mBAAA;CfumDH;AexmDC;EACE,mBAAA;Cf0mDH;Ae3mDC;EACE,UAAA;Cf6mDH;Ae9mDC;EACE,mBAAA;CfgnDH;AejnDC;EACE,mBAAA;CfmnDH;AepnDC;EACE,UAAA;CfsnDH;AevnDC;EACE,mBAAA;CfynDH;Ae1nDC;EACE,mBAAA;Cf4nDH;Ae7nDC;EACE,UAAA;Cf+nDH;AehoDC;EACE,mBAAA;CfkoDH;AenoDC;EACE,kBAAA;CfqoDH;AejoDC;EACE,WAAA;CfmoDH;AernDC;EACE,kBAAA;CfunDH;AexnDC;EACE,0BAAA;Cf0nDH;Ae3nDC;EACE,0BAAA;Cf6nDH;Ae9nDC;EACE,iBAAA;CfgoDH;AejoDC;EACE,0BAAA;CfmoDH;AepoDC;EACE,0BAAA;CfsoDH;AevoDC;EACE,iBAAA;CfyoDH;Ae1oDC;EACE,0BAAA;Cf4oDH;Ae7oDC;EACE,0BAAA;Cf+oDH;AehpDC;EACE,iBAAA;CfkpDH;AenpDC;EACE,0BAAA;CfqpDH;AetpDC;EACE,yBAAA;CfwpDH;AezpDC;EACE,gBAAA;Cf2pDH;Aa3pDD;EElCI;IACE,YAAA;GfgsDH;EezrDD;IACE,YAAA;Gf2rDD;Ee5rDD;IACE,oBAAA;Gf8rDD;Ee/rDD;IACE,oBAAA;GfisDD;EelsDD;IACE,WAAA;GfosDD;EersDD;IACE,oBAAA;GfusDD;EexsDD;IACE,oBAAA;Gf0sDD;Ee3sDD;IACE,WAAA;Gf6sDD;Ee9sDD;IACE,oBAAA;GfgtDD;EejtDD;IACE,oBAAA;GfmtDD;EeptDD;IACE,WAAA;GfstDD;EevtDD;IACE,oBAAA;GfytDD;Ee1tDD;IACE,mBAAA;Gf4tDD;Ee9sDD;IACE,YAAA;GfgtDD;EejtDD;IACE,oBAAA;GfmtDD;EeptDD;IACE,oBAAA;GfstDD;EevtDD;IACE,WAAA;GfytDD;Ee1tDD;IACE,oBAAA;Gf4tDD;Ee7tDD;IACE,oBAAA;Gf+tDD;EehuDD;IACE,WAAA;GfkuDD;EenuDD;IACE,oBAAA;GfquDD;EetuDD;IACE,oBAAA;GfwuDD;EezuDD;IACE,WAAA;Gf2uDD;Ee5uDD;IACE,oBAAA;Gf8uDD;Ee/uDD;IACE,mBAAA;GfivDD;Ee7uDD;IACE,YAAA;Gf+uDD;Ee/vDD;IACE,WAAA;GfiwDD;EelwDD;IACE,mBAAA;GfowDD;EerwDD;IACE,mBAAA;GfuwDD;EexwDD;IACE,UAAA;Gf0wDD;Ee3wDD;IACE,mBAAA;Gf6wDD;Ee9wDD;IACE,mBAAA;GfgxDD;EejxDD;IACE,UAAA;GfmxDD;EepxDD;IACE,mBAAA;GfsxDD;EevxDD;IACE,mBAAA;GfyxDD;Ee1xDD;IACE,UAAA;Gf4xDD;Ee7xDD;IACE,mBAAA;Gf+xDD;EehyDD;IACE,kBAAA;GfkyDD;Ee9xDD;IACE,WAAA;GfgyDD;EelxDD;IACE,kBAAA;GfoxDD;EerxDD;IACE,0BAAA;GfuxDD;EexxDD;IACE,0BAAA;Gf0xDD;Ee3xDD;IACE,iBAAA;Gf6xDD;Ee9xDD;IACE,0BAAA;GfgyDD;EejyDD;IACE,0BAAA;GfmyDD;EepyDD;IACE,iBAAA;GfsyDD;EevyDD;IACE,0BAAA;GfyyDD;Ee1yDD;IACE,0BAAA;Gf4yDD;Ee7yDD;IACE,iBAAA;Gf+yDD;EehzDD;IACE,0BAAA;GfkzDD;EenzDD;IACE,yBAAA;GfqzDD;EetzDD;IACE,gBAAA;GfwzDD;CACF;AahzDD;EE3CI;IACE,YAAA;Gf81DH;Eev1DD;IACE,YAAA;Gfy1DD;Ee11DD;IACE,oBAAA;Gf41DD;Ee71DD;IACE,oBAAA;Gf+1DD;Eeh2DD;IACE,WAAA;Gfk2DD;Een2DD;IACE,oBAAA;Gfq2DD;Eet2DD;IACE,oBAAA;Gfw2DD;Eez2DD;IACE,WAAA;Gf22DD;Ee52DD;IACE,oBAAA;Gf82DD;Ee/2DD;IACE,oBAAA;Gfi3DD;Eel3DD;IACE,WAAA;Gfo3DD;Eer3DD;IACE,oBAAA;Gfu3DD;Eex3DD;IACE,mBAAA;Gf03DD;Ee52DD;IACE,YAAA;Gf82DD;Ee/2DD;IACE,oBAAA;Gfi3DD;Eel3DD;IACE,oBAAA;Gfo3DD;Eer3DD;IACE,WAAA;Gfu3DD;Eex3DD;IACE,oBAAA;Gf03DD;Ee33DD;IACE,oBAAA;Gf63DD;Ee93DD;IACE,WAAA;Gfg4DD;Eej4DD;IACE,oBAAA;Gfm4DD;Eep4DD;IACE,oBAAA;Gfs4DD;Eev4DD;IACE,WAAA;Gfy4DD;Ee14DD;IACE,oBAAA;Gf44DD;Ee74DD;IACE,mBAAA;Gf+4DD;Ee34DD;IACE,YAAA;Gf64DD;Ee75DD;IACE,WAAA;Gf+5DD;Eeh6DD;IACE,mBAAA;Gfk6DD;Een6DD;IACE,mBAAA;Gfq6DD;Eet6DD;IACE,UAAA;Gfw6DD;Eez6DD;IACE,mBAAA;Gf26DD;Ee56DD;IACE,mBAAA;Gf86DD;Ee/6DD;IACE,UAAA;Gfi7DD;Eel7DD;IACE,mBAAA;Gfo7DD;Eer7DD;IACE,mBAAA;Gfu7DD;Eex7DD;IACE,UAAA;Gf07DD;Ee37DD;IACE,mBAAA;Gf67DD;Ee97DD;IACE,kBAAA;Gfg8DD;Ee57DD;IACE,WAAA;Gf87DD;Eeh7DD;IACE,kBAAA;Gfk7DD;Een7DD;IACE,0BAAA;Gfq7DD;Eet7DD;IACE,0BAAA;Gfw7DD;Eez7DD;IACE,iBAAA;Gf27DD;Ee57DD;IACE,0BAAA;Gf87DD;Ee/7DD;IACE,0BAAA;Gfi8DD;Eel8DD;IACE,iBAAA;Gfo8DD;Eer8DD;IACE,0BAAA;Gfu8DD;Eex8DD;IACE,0BAAA;Gf08DD;Ee38DD;IACE,iBAAA;Gf68DD;Ee98DD;IACE,0BAAA;Gfg9DD;Eej9DD;IACE,yBAAA;Gfm9DD;Eep9DD;IACE,gBAAA;Gfs9DD;CACF;Aa38DD;EE9CI;IACE,YAAA;Gf4/DH;Eer/DD;IACE,YAAA;Gfu/DD;Eex/DD;IACE,oBAAA;Gf0/DD;Ee3/DD;IACE,oBAAA;Gf6/DD;Ee9/DD;IACE,WAAA;GfggED;EejgED;IACE,oBAAA;GfmgED;EepgED;IACE,oBAAA;GfsgED;EevgED;IACE,WAAA;GfygED;Ee1gED;IACE,oBAAA;Gf4gED;Ee7gED;IACE,oBAAA;Gf+gED;EehhED;IACE,WAAA;GfkhED;EenhED;IACE,oBAAA;GfqhED;EethED;IACE,mBAAA;GfwhED;Ee1gED;IACE,YAAA;Gf4gED;Ee7gED;IACE,oBAAA;Gf+gED;EehhED;IACE,oBAAA;GfkhED;EenhED;IACE,WAAA;GfqhED;EethED;IACE,oBAAA;GfwhED;EezhED;IACE,oBAAA;Gf2hED;Ee5hED;IACE,WAAA;Gf8hED;Ee/hED;IACE,oBAAA;GfiiED;EeliED;IACE,oBAAA;GfoiED;EeriED;IACE,WAAA;GfuiED;EexiED;IACE,oBAAA;Gf0iED;Ee3iED;IACE,mBAAA;Gf6iED;EeziED;IACE,YAAA;Gf2iED;Ee3jED;IACE,WAAA;Gf6jED;Ee9jED;IACE,mBAAA;GfgkED;EejkED;IACE,mBAAA;GfmkED;EepkED;IACE,UAAA;GfskED;EevkED;IACE,mBAAA;GfykED;Ee1kED;IACE,mBAAA;Gf4kED;Ee7kED;IACE,UAAA;Gf+kED;EehlED;IACE,mBAAA;GfklED;EenlED;IACE,mBAAA;GfqlED;EetlED;IACE,UAAA;GfwlED;EezlED;IACE,mBAAA;Gf2lED;Ee5lED;IACE,kBAAA;Gf8lED;Ee1lED;IACE,WAAA;Gf4lED;Ee9kED;IACE,kBAAA;GfglED;EejlED;IACE,0BAAA;GfmlED;EeplED;IACE,0BAAA;GfslED;EevlED;IACE,iBAAA;GfylED;Ee1lED;IACE,0BAAA;Gf4lED;Ee7lED;IACE,0BAAA;Gf+lED;EehmED;IACE,iBAAA;GfkmED;EenmED;IACE,0BAAA;GfqmED;EetmED;IACE,0BAAA;GfwmED;EezmED;IACE,iBAAA;Gf2mED;Ee5mED;IACE,0BAAA;Gf8mED;Ee/mED;IACE,yBAAA;GfinED;EelnED;IACE,gBAAA;GfonED;CACF;AgBxrED;EACE,8BAAA;ChB0rED;AgBxrED;EACE,iBAAA;EACA,oBAAA;EACA,eAAA;EACA,iBAAA;ChB0rED;AgBxrED;EACE,iBAAA;ChB0rED;AgBprED;EACE,YAAA;EACA,gBAAA;EACA,oBAAA;ChBsrED;AgBzrED;;;;;;EAWQ,aAAA;EACA,wBAAA;EACA,oBAAA;EACA,8BAAA;ChBsrEP;AgBpsED;EAoBI,uBAAA;EACA,iCAAA;ChBmrEH;AgBxsED;;;;;;EA8BQ,cAAA;ChBkrEP;AgBhtED;EAoCI,8BAAA;ChB+qEH;AgBntED;EAyCI,0BAAA;ChB6qEH;AgBtqED;;;;;;EAOQ,aAAA;ChBuqEP;AgB5pED;EACE,0BAAA;ChB8pED;AgB/pED;;;;;;EAQQ,0BAAA;ChB+pEP;AgBvqED;;EAeM,yBAAA;ChB4pEL;AgBlpED;EAEI,0BAAA;ChBmpEH;AgB1oED;EAEI,0BAAA;ChB2oEH;AgBloED;EACE,iBAAA;EACA,YAAA;EACA,sBAAA;ChBooED;AgB/nEG;;EACE,iBAAA;EACA,YAAA;EACA,oBAAA;ChBkoEL;AiB9wEC;;;;;;;;;;;;EAOI,0BAAA;CjBqxEL;AiB/wEC;;;;;EAMI,0BAAA;CjBgxEL;AiBnyEC;;;;;;;;;;;;EAOI,0BAAA;CjB0yEL;AiBpyEC;;;;;EAMI,0BAAA;CjBqyEL;AiBxzEC;;;;;;;;;;;;EAOI,0BAAA;CjB+zEL;AiBzzEC;;;;;EAMI,0BAAA;CjB0zEL;AiB70EC;;;;;;;;;;;;EAOI,0BAAA;CjBo1EL;AiB90EC;;;;;EAMI,0BAAA;CjB+0EL;AiBl2EC;;;;;;;;;;;;EAOI,0BAAA;CjBy2EL;AiBn2EC;;;;;EAMI,0BAAA;CjBo2EL;AgBltED;EACE,iBAAA;EACA,kBAAA;ChBotED;AgBvpED;EAAA;IA1DI,YAAA;IACA,oBAAA;IACA,mBAAA;IACA,6CAAA;IACA,0BAAA;GhBqtED;EgB/pEH;IAlDM,iBAAA;GhBotEH;EgBlqEH;;;;;;IAzCY,oBAAA;GhBmtET;EgB1qEH;IAjCM,UAAA;GhB8sEH;EgB7qEH;;;;;;IAxBY,eAAA;GhB6sET;EgBrrEH;;;;;;IApBY,gBAAA;GhBitET;EgB7rEH;;;;IAPY,iBAAA;GhB0sET;CACF;AkBp6ED;EACE,WAAA;EACA,UAAA;EACA,UAAA;EAIA,aAAA;ClBm6ED;AkBh6ED;EACE,eAAA;EACA,YAAA;EACA,WAAA;EACA,oBAAA;EACA,gBAAA;EACA,qBAAA;EACA,eAAA;EACA,UAAA;EACA,iCAAA;ClBk6ED;AkB/5ED;EACE,sBAAA;EACA,gBAAA;EACA,mBAAA;EACA,kBAAA;ClBi6ED;AkBt5ED;Eb4BE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL63ET;AkBt5ED;;EAEE,gBAAA;EACA,mBAAA;EACA,oBAAA;ClBw5ED;AkBr5ED;EACE,eAAA;ClBu5ED;AkBn5ED;EACE,eAAA;EACA,YAAA;ClBq5ED;AkBj5ED;;EAEE,aAAA;ClBm5ED;AkB/4ED;;;EZvEE,qBAAA;EAEA,2CAAA;EACA,qBAAA;CN09ED;AkB/4ED;EACE,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;ClBi5ED;AkBv3ED;EACE,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,0BAAA;EACA,uBAAA;EACA,0BAAA;EACA,mBAAA;EbxDA,yDAAA;EACQ,iDAAA;EAyHR,uFAAA;EACK,0EAAA;EACG,uEAAA;CL0zET;AmBl8EC;EACE,sBAAA;EACA,WAAA;EdUF,uFAAA;EACQ,+EAAA;CL27ET;AK15EC;EACE,eAAA;EACA,WAAA;CL45EH;AK15EC;EAA0B,eAAA;CL65E3B;AK55EC;EAAgC,eAAA;CL+5EjC;AkB/3EC;;;EAGE,0BAAA;EACA,WAAA;ClBi4EH;AkB93EC;;EAEE,oBAAA;ClBg4EH;AkB53EC;EACE,aAAA;ClB83EH;AkBl3ED;EACE,yBAAA;ClBo3ED;AkB50ED;EAtBI;;;;IACE,kBAAA;GlBw2EH;EkBr2EC;;;;;;;;IAEE,kBAAA;GlB62EH;EkB12EC;;;;;;;;IAEE,kBAAA;GlBk3EH;CACF;AkBx2ED;EACE,oBAAA;ClB02ED;AkBl2ED;;EAEE,mBAAA;EACA,eAAA;EACA,iBAAA;EACA,oBAAA;ClBo2ED;AkBz2ED;;EAQI,iBAAA;EACA,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,gBAAA;ClBq2EH;AkBl2ED;;;;EAIE,mBAAA;EACA,mBAAA;EACA,mBAAA;ClBo2ED;AkBj2ED;;EAEE,iBAAA;ClBm2ED;AkB/1ED;;EAEE,mBAAA;EACA,sBAAA;EACA,mBAAA;EACA,iBAAA;EACA,uBAAA;EACA,oBAAA;EACA,gBAAA;ClBi2ED;AkB/1ED;;EAEE,cAAA;EACA,kBAAA;ClBi2ED;AkBx1EC;;;;;;EAGE,oBAAA;ClB61EH;AkBv1EC;;;;EAEE,oBAAA;ClB21EH;AkBr1EC;;;;EAGI,oBAAA;ClBw1EL;AkB70ED;EAEE,iBAAA;EACA,oBAAA;EAEA,iBAAA;EACA,iBAAA;ClB60ED;AkB30EC;;EAEE,gBAAA;EACA,iBAAA;ClB60EH;AkBh0ED;EC7PE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnBgkFD;AmB9jFC;EACE,aAAA;EACA,kBAAA;CnBgkFH;AmB7jFC;;EAEE,aAAA;CnB+jFH;AkB50ED;EAEI,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;ClB60EH;AkBn1ED;EASI,aAAA;EACA,kBAAA;ClB60EH;AkBv1ED;;EAcI,aAAA;ClB60EH;AkB31ED;EAiBI,aAAA;EACA,iBAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;ClB60EH;AkBz0ED;ECzRE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnBqmFD;AmBnmFC;EACE,aAAA;EACA,kBAAA;CnBqmFH;AmBlmFC;;EAEE,aAAA;CnBomFH;AkBr1ED;EAEI,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;ClBs1EH;AkB51ED;EASI,aAAA;EACA,kBAAA;ClBs1EH;AkBh2ED;;EAcI,aAAA;ClBs1EH;AkBp2ED;EAiBI,aAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;ClBs1EH;AkB70ED;EAEE,mBAAA;ClB80ED;AkBh1ED;EAMI,sBAAA;ClB60EH;AkBz0ED;EACE,mBAAA;EACA,OAAA;EACA,SAAA;EACA,WAAA;EACA,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,mBAAA;EACA,qBAAA;ClB20ED;AkBz0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClB20ED;AkBz0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClB20ED;AkBv0ED;;;;;;;;;;ECpZI,eAAA;CnBuuFH;AkBn1ED;EChZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLwrFT;AmBtuFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL6rFT;AkB71ED;ECtYI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBsuFH;AkBl2ED;EChYI,eAAA;CnBquFH;AkBl2ED;;;;;;;;;;ECvZI,eAAA;CnBqwFH;AkB92ED;ECnZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLstFT;AmBpwFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL2tFT;AkBx3ED;ECzYI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBowFH;AkB73ED;ECnYI,eAAA;CnBmwFH;AkB73ED;;;;;;;;;;EC1ZI,eAAA;CnBmyFH;AkBz4ED;ECtZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLovFT;AmBlyFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CLyvFT;AkBn5ED;EC5YI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBkyFH;AkBx5ED;ECtYI,eAAA;CnBiyFH;AkBp5EC;EACG,UAAA;ClBs5EJ;AkBp5EC;EACG,OAAA;ClBs5EJ;AkB54ED;EACE,eAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;ClB84ED;AkB3zED;EAAA;IA9DM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlB63EH;EkBj0EH;IAvDM,sBAAA;IACA,YAAA;IACA,uBAAA;GlB23EH;EkBt0EH;IAhDM,sBAAA;GlBy3EH;EkBz0EH;IA5CM,sBAAA;IACA,uBAAA;GlBw3EH;EkB70EH;;;IAtCQ,YAAA;GlBw3EL;EkBl1EH;IAhCM,YAAA;GlBq3EH;EkBr1EH;IA5BM,iBAAA;IACA,uBAAA;GlBo3EH;EkBz1EH;;IApBM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlBi3EH;EkBh2EH;;IAdQ,gBAAA;GlBk3EL;EkBp2EH;;IATM,mBAAA;IACA,eAAA;GlBi3EH;EkBz2EH;IAHM,OAAA;GlB+2EH;CACF;AkBr2ED;;;;EASI,cAAA;EACA,iBAAA;EACA,iBAAA;ClBk2EH;AkB72ED;;EAiBI,iBAAA;ClBg2EH;AkBj3ED;EJhhBE,mBAAA;EACA,oBAAA;Cdo4FD;AkB90EC;EAAA;IAVI,kBAAA;IACA,iBAAA;IACA,iBAAA;GlB41EH;CACF;AkB53ED;EAwCI,YAAA;ClBu1EH;AkBz0EC;EAAA;IAJM,yBAAA;IACA,gBAAA;GlBi1EL;CACF;AkBv0EC;EAAA;IAJM,iBAAA;IACA,gBAAA;GlB+0EL;CACF;AoBl6FD;EACE,sBAAA;EACA,iBAAA;EACA,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,+BAAA;MAAA,2BAAA;EACA,gBAAA;EACA,uBAAA;EACA,8BAAA;EACA,oBAAA;EC6CA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,mBAAA;EhB4JA,0BAAA;EACG,uBAAA;EACC,sBAAA;EACI,kBAAA;CL6tFT;AoBr6FG;;;;;;EdrBF,qBAAA;EAEA,2CAAA;EACA,qBAAA;CNi8FD;AoBz6FC;;;EAGE,eAAA;EACA,sBAAA;CpB26FH;AoBx6FC;;EAEE,WAAA;EACA,uBAAA;Ef2BF,yDAAA;EACQ,iDAAA;CLg5FT;AoBx6FC;;;EAGE,oBAAA;EE7CF,cAAA;EAGA,0BAAA;EjB8DA,yBAAA;EACQ,iBAAA;CLy5FT;AoBx6FG;;EAEE,qBAAA;CpB06FL;AoBj6FD;EC3DE,eAAA;EACA,0BAAA;EACA,sBAAA;CrB+9FD;AqB79FC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB+9FP;AqB79FC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB+9FP;AqB79FC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB+9FP;AqB79FG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBq+FT;AqBl+FC;;;EAGE,uBAAA;CrBo+FH;AqB/9FG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrB6+FT;AoB/9FD;ECTI,eAAA;EACA,0BAAA;CrB2+FH;AoBh+FD;EC9DE,eAAA;EACA,0BAAA;EACA,sBAAA;CrBiiGD;AqB/hGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBiiGP;AqB/hGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBiiGP;AqB/hGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBiiGP;AqB/hGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBuiGT;AqBpiGC;;;EAGE,uBAAA;CrBsiGH;AqBjiGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrB+iGT;AoB9hGD;ECZI,eAAA;EACA,0BAAA;CrB6iGH;AoB9hGD;EClEE,eAAA;EACA,0BAAA;EACA,sBAAA;CrBmmGD;AqBjmGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBmmGP;AqBjmGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBmmGP;AqBjmGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBmmGP;AqBjmGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBymGT;AqBtmGC;;;EAGE,uBAAA;CrBwmGH;AqBnmGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrBinGT;AoB5lGD;EChBI,eAAA;EACA,0BAAA;CrB+mGH;AoB5lGD;ECtEE,eAAA;EACA,0BAAA;EACA,sBAAA;CrBqqGD;AqBnqGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBqqGP;AqBnqGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBqqGP;AqBnqGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBqqGP;AqBnqGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB2qGT;AqBxqGC;;;EAGE,uBAAA;CrB0qGH;AqBrqGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrBmrGT;AoB1pGD;ECpBI,eAAA;EACA,0BAAA;CrBirGH;AoB1pGD;EC1EE,eAAA;EACA,0BAAA;EACA,sBAAA;CrBuuGD;AqBruGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBuuGP;AqBruGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBuuGP;AqBruGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBuuGP;AqBruGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB6uGT;AqB1uGC;;;EAGE,uBAAA;CrB4uGH;AqBvuGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrBqvGT;AoBxtGD;ECxBI,eAAA;EACA,0BAAA;CrBmvGH;AoBxtGD;EC9EE,eAAA;EACA,0BAAA;EACA,sBAAA;CrByyGD;AqBvyGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrByyGP;AqBvyGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrByyGP;AqBvyGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrByyGP;AqBvyGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB+yGT;AqB5yGC;;;EAGE,uBAAA;CrB8yGH;AqBzyGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrBuzGT;AoBtxGD;EC5BI,eAAA;EACA,0BAAA;CrBqzGH;AoBjxGD;EACE,eAAA;EACA,oBAAA;EACA,iBAAA;CpBmxGD;AoBjxGC;;;;;EAKE,8BAAA;EfnCF,yBAAA;EACQ,iBAAA;CLuzGT;AoBlxGC;;;;EAIE,0BAAA;CpBoxGH;AoBlxGC;;EAEE,eAAA;EACA,2BAAA;EACA,8BAAA;CpBoxGH;AoBhxGG;;;;EAEE,eAAA;EACA,sBAAA;CpBoxGL;AoB3wGD;;ECrEE,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CrBo1GD;AoB9wGD;;ECzEE,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrB21GD;AoBjxGD;;EC7EE,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrBk2GD;AoBhxGD;EACE,eAAA;EACA,YAAA;CpBkxGD;AoB9wGD;EACE,gBAAA;CpBgxGD;AoBzwGC;;;EACE,YAAA;CpB6wGH;AuBv6GD;EACE,WAAA;ElBoLA,yCAAA;EACK,oCAAA;EACG,iCAAA;CLsvGT;AuB16GC;EACE,WAAA;CvB46GH;AuBx6GD;EACE,cAAA;CvB06GD;AuBx6GC;EAAY,eAAA;CvB26Gb;AuB16GC;EAAY,mBAAA;CvB66Gb;AuB56GC;EAAY,yBAAA;CvB+6Gb;AuB56GD;EACE,mBAAA;EACA,UAAA;EACA,iBAAA;ElBuKA,gDAAA;EACQ,2CAAA;KAAA,wCAAA;EAOR,mCAAA;EACQ,8BAAA;KAAA,2BAAA;EAGR,yCAAA;EACQ,oCAAA;KAAA,iCAAA;CLgwGT;AwB18GD;EACE,sBAAA;EACA,SAAA;EACA,UAAA;EACA,iBAAA;EACA,uBAAA;EACA,uBAAA;EACA,yBAAA;EACA,oCAAA;EACA,mCAAA;CxB48GD;AwBx8GD;;EAEE,mBAAA;CxB08GD;AwBt8GD;EACE,WAAA;CxBw8GD;AwBp8GD;EACE,mBAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,YAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,0BAAA;EACA,0BAAA;EACA,sCAAA;EACA,mBAAA;EnBsBA,oDAAA;EACQ,4CAAA;EmBrBR,qCAAA;UAAA,6BAAA;CxBu8GD;AwBl8GC;EACE,SAAA;EACA,WAAA;CxBo8GH;AwB79GD;ECzBE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBy/GD;AwBn+GD;EAmCI,eAAA;EACA,kBAAA;EACA,YAAA;EACA,oBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxBm8GH;AwB77GC;;EAEE,sBAAA;EACA,eAAA;EACA,0BAAA;CxB+7GH;AwBz7GC;;;EAGE,eAAA;EACA,sBAAA;EACA,WAAA;EACA,0BAAA;CxB27GH;AwBl7GC;;;EAGE,eAAA;CxBo7GH;AwBh7GC;;EAEE,sBAAA;EACA,8BAAA;EACA,uBAAA;EE3GF,oEAAA;EF6GE,oBAAA;CxBk7GH;AwB76GD;EAGI,eAAA;CxB66GH;AwBh7GD;EAQI,WAAA;CxB26GH;AwBn6GD;EACE,WAAA;EACA,SAAA;CxBq6GD;AwB75GD;EACE,QAAA;EACA,YAAA;CxB+5GD;AwB35GD;EACE,eAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxB65GD;AwBz5GD;EACE,gBAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,OAAA;EACA,aAAA;CxB25GD;AwBv5GD;EACE,SAAA;EACA,WAAA;CxBy5GD;AwBj5GD;;EAII,cAAA;EACA,0BAAA;EACA,4BAAA;EACA,YAAA;CxBi5GH;AwBx5GD;;EAWI,UAAA;EACA,aAAA;EACA,mBAAA;CxBi5GH;AwB53GD;EAXE;IApEA,WAAA;IACA,SAAA;GxB+8GC;EwB54GD;IA1DA,QAAA;IACA,YAAA;GxBy8GC;CACF;A2BzlHD;;EAEE,mBAAA;EACA,sBAAA;EACA,uBAAA;C3B2lHD;A2B/lHD;;EAMI,mBAAA;EACA,YAAA;C3B6lHH;A2B3lHG;;;;;;;;EAIE,WAAA;C3BimHL;A2B3lHD;;;;EAKI,kBAAA;C3B4lHH;A2BvlHD;EACE,kBAAA;C3BylHD;A2B1lHD;;;EAOI,YAAA;C3BwlHH;A2B/lHD;;;EAYI,iBAAA;C3BwlHH;A2BplHD;EACE,iBAAA;C3BslHD;A2BllHD;EACE,eAAA;C3BolHD;A2BnlHC;EClDA,8BAAA;EACG,2BAAA;C5BwoHJ;A2BllHD;;EC/CE,6BAAA;EACG,0BAAA;C5BqoHJ;A2BjlHD;EACE,YAAA;C3BmlHD;A2BjlHD;EACE,iBAAA;C3BmlHD;A2BjlHD;;ECnEE,8BAAA;EACG,2BAAA;C5BwpHJ;A2BhlHD;ECjEE,6BAAA;EACG,0BAAA;C5BopHJ;A2B/kHD;;EAEE,WAAA;C3BilHD;A2BhkHD;EACE,kBAAA;EACA,mBAAA;C3BkkHD;A2BhkHD;EACE,mBAAA;EACA,oBAAA;C3BkkHD;A2B7jHD;EtB/CE,yDAAA;EACQ,iDAAA;CL+mHT;A2B7jHC;EtBnDA,yBAAA;EACQ,iBAAA;CLmnHT;A2B1jHD;EACE,eAAA;C3B4jHD;A2BzjHD;EACE,wBAAA;EACA,uBAAA;C3B2jHD;A2BxjHD;EACE,wBAAA;C3B0jHD;A2BnjHD;;;EAII,eAAA;EACA,YAAA;EACA,YAAA;EACA,gBAAA;C3BojHH;A2B3jHD;EAcM,YAAA;C3BgjHL;A2B9jHD;;;;EAsBI,iBAAA;EACA,eAAA;C3B8iHH;A2BziHC;EACE,iBAAA;C3B2iHH;A2BziHC;EACE,6BAAA;ECpKF,8BAAA;EACC,6BAAA;C5BgtHF;A2B1iHC;EACE,+BAAA;EChLF,2BAAA;EACC,0BAAA;C5B6tHF;A2B1iHD;EACE,iBAAA;C3B4iHD;A2B1iHD;;EC/KE,8BAAA;EACC,6BAAA;C5B6tHF;A2BziHD;EC7LE,2BAAA;EACC,0BAAA;C5ByuHF;A2BriHD;EACE,eAAA;EACA,YAAA;EACA,oBAAA;EACA,0BAAA;C3BuiHD;A2B3iHD;;EAOI,YAAA;EACA,oBAAA;EACA,UAAA;C3BwiHH;A2BjjHD;EAYI,YAAA;C3BwiHH;A2BpjHD;EAgBI,WAAA;C3BuiHH;A2BthHD;;;;EAKM,mBAAA;EACA,uBAAA;EACA,qBAAA;C3BuhHL;A6BjwHD;EACE,mBAAA;EACA,eAAA;EACA,0BAAA;C7BmwHD;A6BhwHC;EACE,YAAA;EACA,gBAAA;EACA,iBAAA;C7BkwHH;A6B3wHD;EAeI,mBAAA;EACA,WAAA;EAKA,YAAA;EAEA,YAAA;EACA,iBAAA;C7B0vHH;A6BjvHD;;;EV8BE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnBwtHD;AmBttHC;;;EACE,aAAA;EACA,kBAAA;CnB0tHH;AmBvtHC;;;;;;EAEE,aAAA;CnB6tHH;A6BnwHD;;;EVyBE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnB+uHD;AmB7uHC;;;EACE,aAAA;EACA,kBAAA;CnBivHH;AmB9uHC;;;;;;EAEE,aAAA;CnBovHH;A6BjxHD;;;EAGE,oBAAA;C7BmxHD;A6BjxHC;;;EACE,iBAAA;C7BqxHH;A6BjxHD;;EAEE,UAAA;EACA,oBAAA;EACA,uBAAA;C7BmxHD;A6B9wHD;EACE,kBAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;EACA,eAAA;EACA,mBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;C7BgxHD;A6B7wHC;EACE,kBAAA;EACA,gBAAA;EACA,mBAAA;C7B+wHH;A6B7wHC;EACE,mBAAA;EACA,gBAAA;EACA,mBAAA;C7B+wHH;A6BnyHD;;EA0BI,cAAA;C7B6wHH;A6BxwHD;;;;;;;EDhGE,8BAAA;EACG,2BAAA;C5Bi3HJ;A6BzwHD;EACE,gBAAA;C7B2wHD;A6BzwHD;;;;;;;EDpGE,6BAAA;EACG,0BAAA;C5Bs3HJ;A6B1wHD;EACE,eAAA;C7B4wHD;A6BvwHD;EACE,mBAAA;EAGA,aAAA;EACA,oBAAA;C7BuwHD;A6B5wHD;EAUI,mBAAA;C7BqwHH;A6B/wHD;EAYM,kBAAA;C7BswHL;A6BnwHG;;;EAGE,WAAA;C7BqwHL;A6BhwHC;;EAGI,mBAAA;C7BiwHL;A6B9vHC;;EAGI,WAAA;EACA,kBAAA;C7B+vHL;A8B15HD;EACE,iBAAA;EACA,gBAAA;EACA,iBAAA;C9B45HD;A8B/5HD;EAOI,mBAAA;EACA,eAAA;C9B25HH;A8Bn6HD;EAWM,mBAAA;EACA,eAAA;EACA,mBAAA;C9B25HL;A8B15HK;;EAEE,sBAAA;EACA,0BAAA;C9B45HP;A8Bv5HG;EACE,eAAA;C9By5HL;A8Bv5HK;;EAEE,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,oBAAA;C9By5HP;A8Bl5HG;;;EAGE,0BAAA;EACA,sBAAA;C9Bo5HL;A8B77HD;ELHE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBm8HD;A8Bn8HD;EA0DI,gBAAA;C9B44HH;A8Bn4HD;EACE,iCAAA;C9Bq4HD;A8Bt4HD;EAGI,YAAA;EAEA,oBAAA;C9Bq4HH;A8B14HD;EASM,kBAAA;EACA,wBAAA;EACA,8BAAA;EACA,2BAAA;C9Bo4HL;A8Bn4HK;EACE,sCAAA;C9Bq4HP;A8B/3HK;;;EAGE,eAAA;EACA,0BAAA;EACA,0BAAA;EACA,iCAAA;EACA,gBAAA;C9Bi4HP;A8B53HC;EAqDA,YAAA;EA8BA,iBAAA;C9B6yHD;A8Bh4HC;EAwDE,YAAA;C9B20HH;A8Bn4HC;EA0DI,mBAAA;EACA,mBAAA;C9B40HL;A8Bv4HC;EAgEE,UAAA;EACA,WAAA;C9B00HH;A8B9zHD;EAAA;IAPM,oBAAA;IACA,UAAA;G9By0HH;E8Bn0HH;IAJQ,iBAAA;G9B00HL;CACF;A8Bp5HC;EAuFE,gBAAA;EACA,mBAAA;C9Bg0HH;A8Bx5HC;;;EA8FE,0BAAA;C9B+zHH;A8BjzHD;EAAA;IATM,iCAAA;IACA,2BAAA;G9B8zHH;E8BtzHH;;;IAHM,6BAAA;G9B8zHH;CACF;A8B/5HD;EAEI,YAAA;C9Bg6HH;A8Bl6HD;EAMM,mBAAA;C9B+5HL;A8Br6HD;EASM,iBAAA;C9B+5HL;A8B15HK;;;EAGE,eAAA;EACA,0BAAA;C9B45HP;A8Bp5HD;EAEI,YAAA;C9Bq5HH;A8Bv5HD;EAIM,gBAAA;EACA,eAAA;C9Bs5HL;A8B14HD;EACE,YAAA;C9B44HD;A8B74HD;EAII,YAAA;C9B44HH;A8Bh5HD;EAMM,mBAAA;EACA,mBAAA;C9B64HL;A8Bp5HD;EAYI,UAAA;EACA,WAAA;C9B24HH;A8B/3HD;EAAA;IAPM,oBAAA;IACA,UAAA;G9B04HH;E8Bp4HH;IAJQ,iBAAA;G9B24HL;CACF;A8Bn4HD;EACE,iBAAA;C9Bq4HD;A8Bt4HD;EAKI,gBAAA;EACA,mBAAA;C9Bo4HH;A8B14HD;;;EAYI,0BAAA;C9Bm4HH;A8Br3HD;EAAA;IATM,iCAAA;IACA,2BAAA;G9Bk4HH;E8B13HH;;;IAHM,6BAAA;G9Bk4HH;CACF;A8Bz3HD;EAEI,cAAA;C9B03HH;A8B53HD;EAKI,eAAA;C9B03HH;A8Bj3HD;EAEE,iBAAA;EF3OA,2BAAA;EACC,0BAAA;C5B8lIF;A+BxlID;EACE,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,8BAAA;C/B0lID;A+BllID;EAAA;IAFI,mBAAA;G/BwlID;CACF;A+BzkID;EAAA;IAFI,YAAA;G/B+kID;CACF;A+BjkID;EACE,oBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,2DAAA;UAAA,mDAAA;EAEA,kCAAA;C/BkkID;A+BhkIC;EACE,iBAAA;C/BkkIH;A+BtiID;EAAA;IAxBI,YAAA;IACA,cAAA;IACA,yBAAA;YAAA,iBAAA;G/BkkID;E+BhkIC;IACE,0BAAA;IACA,wBAAA;IACA,kBAAA;IACA,6BAAA;G/BkkIH;E+B/jIC;IACE,oBAAA;G/BikIH;E+B5jIC;;;IAGE,gBAAA;IACA,iBAAA;G/B8jIH;CACF;A+B1jID;;EAGI,kBAAA;C/B2jIH;A+BtjIC;EAAA;;IAFI,kBAAA;G/B6jIH;CACF;A+BpjID;;;;EAII,oBAAA;EACA,mBAAA;C/BsjIH;A+BhjIC;EAAA;;;;IAHI,gBAAA;IACA,eAAA;G/B0jIH;CACF;A+B9iID;EACE,cAAA;EACA,sBAAA;C/BgjID;A+B3iID;EAAA;IAFI,iBAAA;G/BijID;CACF;A+B7iID;;EAEE,gBAAA;EACA,SAAA;EACA,QAAA;EACA,cAAA;C/B+iID;A+BziID;EAAA;;IAFI,iBAAA;G/BgjID;CACF;A+B9iID;EACE,OAAA;EACA,sBAAA;C/BgjID;A+B9iID;EACE,UAAA;EACA,iBAAA;EACA,sBAAA;C/BgjID;A+B1iID;EACE,YAAA;EACA,mBAAA;EACA,gBAAA;EACA,kBAAA;EACA,aAAA;C/B4iID;A+B1iIC;;EAEE,sBAAA;C/B4iIH;A+BrjID;EAaI,eAAA;C/B2iIH;A+BliID;EALI;;IAEE,mBAAA;G/B0iIH;CACF;A+BhiID;EACE,mBAAA;EACA,aAAA;EACA,mBAAA;EACA,kBAAA;EC9LA,gBAAA;EACA,mBAAA;ED+LA,8BAAA;EACA,uBAAA;EACA,8BAAA;EACA,mBAAA;C/BmiID;A+B/hIC;EACE,WAAA;C/BiiIH;A+B/iID;EAmBI,eAAA;EACA,YAAA;EACA,YAAA;EACA,mBAAA;C/B+hIH;A+BrjID;EAyBI,gBAAA;C/B+hIH;A+BzhID;EAAA;IAFI,cAAA;G/B+hID;CACF;A+BthID;EACE,oBAAA;C/BwhID;A+BzhID;EAII,kBAAA;EACA,qBAAA;EACA,kBAAA;C/BwhIH;A+B5/HC;EAAA;IAtBI,iBAAA;IACA,YAAA;IACA,YAAA;IACA,cAAA;IACA,8BAAA;IACA,UAAA;IACA,yBAAA;YAAA,iBAAA;G/BshIH;E+BtgID;;IAbM,2BAAA;G/BuhIL;E+B1gID;IAVM,kBAAA;G/BuhIL;E+BthIK;;IAEE,uBAAA;G/BwhIP;CACF;A+BtgID;EAAA;IAXI,YAAA;IACA,UAAA;G/BqhID;E+B3gIH;IAPM,YAAA;G/BqhIH;E+B9gIH;IALQ,kBAAA;IACA,qBAAA;G/BshIL;CACF;A+B3gID;EACE,mBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,qCAAA;E1B9NA,6FAAA;EACQ,qFAAA;E2B/DR,gBAAA;EACA,mBAAA;ChC4yID;AkB5xHD;EAAA;IA9DM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlB81HH;EkBlyHH;IAvDM,sBAAA;IACA,YAAA;IACA,uBAAA;GlB41HH;EkBvyHH;IAhDM,sBAAA;GlB01HH;EkB1yHH;IA5CM,sBAAA;IACA,uBAAA;GlBy1HH;EkB9yHH;;;IAtCQ,YAAA;GlBy1HL;EkBnzHH;IAhCM,YAAA;GlBs1HH;EkBtzHH;IA5BM,iBAAA;IACA,uBAAA;GlBq1HH;EkB1zHH;;IApBM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlBk1HH;EkBj0HH;;IAdQ,gBAAA;GlBm1HL;EkBr0HH;;IATM,mBAAA;IACA,eAAA;GlBk1HH;EkB10HH;IAHM,OAAA;GlBg1HH;CACF;A+BpjIC;EAAA;IANI,mBAAA;G/B8jIH;E+B5jIG;IACE,iBAAA;G/B8jIL;CACF;A+B7iID;EAAA;IARI,YAAA;IACA,UAAA;IACA,eAAA;IACA,gBAAA;IACA,eAAA;IACA,kBAAA;I1BzPF,yBAAA;IACQ,iBAAA;GLmzIP;CACF;A+BnjID;EACE,cAAA;EHpUA,2BAAA;EACC,0BAAA;C5B03IF;A+BnjID;EACE,iBAAA;EHzUA,6BAAA;EACC,4BAAA;EAOD,8BAAA;EACC,6BAAA;C5By3IF;A+B/iID;EChVE,gBAAA;EACA,mBAAA;ChCk4ID;A+BhjIC;ECnVA,iBAAA;EACA,oBAAA;ChCs4ID;A+BjjIC;ECtVA,iBAAA;EACA,oBAAA;ChC04ID;A+B3iID;EChWE,iBAAA;EACA,oBAAA;ChC84ID;A+BviID;EAAA;IAJI,YAAA;IACA,kBAAA;IACA,mBAAA;G/B+iID;CACF;A+BlhID;EAhBE;IExWA,uBAAA;GjC84IC;E+BriID;IE5WA,wBAAA;IF8WE,oBAAA;G/BuiID;E+BziID;IAKI,gBAAA;G/BuiIH;CACF;A+B9hID;EACE,0BAAA;EACA,sBAAA;C/BgiID;A+BliID;EAKI,eAAA;C/BgiIH;A+B/hIG;;EAEE,eAAA;EACA,8BAAA;C/BiiIL;A+B1iID;EAcI,eAAA;C/B+hIH;A+B7iID;EAmBM,eAAA;C/B6hIL;A+B3hIK;;EAEE,eAAA;EACA,8BAAA;C/B6hIP;A+BzhIK;;;EAGE,eAAA;EACA,0BAAA;C/B2hIP;A+BvhIK;;;EAGE,eAAA;EACA,8BAAA;C/ByhIP;A+BjkID;EA8CI,sBAAA;C/BshIH;A+BrhIG;;EAEE,0BAAA;C/BuhIL;A+BxkID;EAoDM,0BAAA;C/BuhIL;A+B3kID;;EA0DI,sBAAA;C/BqhIH;A+B9gIK;;;EAGE,0BAAA;EACA,eAAA;C/BghIP;A+B/+HC;EAAA;IAzBQ,eAAA;G/B4gIP;E+B3gIO;;IAEE,eAAA;IACA,8BAAA;G/B6gIT;E+BzgIO;;;IAGE,eAAA;IACA,0BAAA;G/B2gIT;E+BvgIO;;;IAGE,eAAA;IACA,8BAAA;G/BygIT;CACF;A+B3mID;EA8GI,eAAA;C/BggIH;A+B//HG;EACE,eAAA;C/BigIL;A+BjnID;EAqHI,eAAA;C/B+/HH;A+B9/HG;;EAEE,eAAA;C/BggIL;A+B5/HK;;;;EAEE,eAAA;C/BggIP;A+Bx/HD;EACE,0BAAA;EACA,sBAAA;C/B0/HD;A+B5/HD;EAKI,eAAA;C/B0/HH;A+Bz/HG;;EAEE,eAAA;EACA,8BAAA;C/B2/HL;A+BpgID;EAcI,eAAA;C/By/HH;A+BvgID;EAmBM,eAAA;C/Bu/HL;A+Br/HK;;EAEE,eAAA;EACA,8BAAA;C/Bu/HP;A+Bn/HK;;;EAGE,eAAA;EACA,0BAAA;C/Bq/HP;A+Bj/HK;;;EAGE,eAAA;EACA,8BAAA;C/Bm/HP;A+B3hID;EA+CI,sBAAA;C/B++HH;A+B9+HG;;EAEE,0BAAA;C/Bg/HL;A+BliID;EAqDM,0BAAA;C/Bg/HL;A+BriID;;EA2DI,sBAAA;C/B8+HH;A+Bx+HK;;;EAGE,0BAAA;EACA,eAAA;C/B0+HP;A+Bn8HC;EAAA;IA/BQ,sBAAA;G/Bs+HP;E+Bv8HD;IA5BQ,0BAAA;G/Bs+HP;E+B18HD;IAzBQ,eAAA;G/Bs+HP;E+Br+HO;;IAEE,eAAA;IACA,8BAAA;G/Bu+HT;E+Bn+HO;;;IAGE,eAAA;IACA,0BAAA;G/Bq+HT;E+Bj+HO;;;IAGE,eAAA;IACA,8BAAA;G/Bm+HT;CACF;A+B3kID;EA+GI,eAAA;C/B+9HH;A+B99HG;EACE,eAAA;C/Bg+HL;A+BjlID;EAsHI,eAAA;C/B89HH;A+B79HG;;EAEE,eAAA;C/B+9HL;A+B39HK;;;;EAEE,eAAA;C/B+9HP;AkCzmJD;EACE,kBAAA;EACA,oBAAA;EACA,iBAAA;EACA,0BAAA;EACA,mBAAA;ClC2mJD;AkChnJD;EAQI,sBAAA;ClC2mJH;AkCnnJD;EAWM,kBAAA;EACA,eAAA;EACA,eAAA;ClC2mJL;AkCxnJD;EAkBI,eAAA;ClCymJH;AmC7nJD;EACE,sBAAA;EACA,gBAAA;EACA,eAAA;EACA,mBAAA;CnC+nJD;AmCnoJD;EAOI,gBAAA;CnC+nJH;AmCtoJD;;EAUM,mBAAA;EACA,YAAA;EACA,kBAAA;EACA,wBAAA;EACA,sBAAA;EACA,eAAA;EACA,0BAAA;EACA,0BAAA;EACA,kBAAA;CnCgoJL;AmC9nJG;;EAGI,eAAA;EPXN,+BAAA;EACG,4BAAA;C5B2oJJ;AmC7nJG;;EPvBF,gCAAA;EACG,6BAAA;C5BwpJJ;AmCxnJG;;;;EAEE,WAAA;EACA,eAAA;EACA,0BAAA;EACA,sBAAA;CnC4nJL;AmCtnJG;;;;;;EAGE,WAAA;EACA,eAAA;EACA,0BAAA;EACA,sBAAA;EACA,gBAAA;CnC2nJL;AmClrJD;;;;;;EAkEM,eAAA;EACA,0BAAA;EACA,sBAAA;EACA,oBAAA;CnCwnJL;AmC/mJD;;EC3EM,mBAAA;EACA,gBAAA;EACA,uBAAA;CpC8rJL;AoC5rJG;;ERKF,+BAAA;EACG,4BAAA;C5B2rJJ;AoC3rJG;;ERTF,gCAAA;EACG,6BAAA;C5BwsJJ;AmC1nJD;;EChFM,kBAAA;EACA,gBAAA;EACA,iBAAA;CpC8sJL;AoC5sJG;;ERKF,+BAAA;EACG,4BAAA;C5B2sJJ;AoC3sJG;;ERTF,gCAAA;EACG,6BAAA;C5BwtJJ;AqC3tJD;EACE,gBAAA;EACA,eAAA;EACA,iBAAA;EACA,mBAAA;CrC6tJD;AqCjuJD;EAOI,gBAAA;CrC6tJH;AqCpuJD;;EAUM,sBAAA;EACA,kBAAA;EACA,0BAAA;EACA,0BAAA;EACA,oBAAA;CrC8tJL;AqC5uJD;;EAmBM,sBAAA;EACA,0BAAA;CrC6tJL;AqCjvJD;;EA2BM,aAAA;CrC0tJL;AqCrvJD;;EAkCM,YAAA;CrCutJL;AqCzvJD;;;;EA2CM,eAAA;EACA,0BAAA;EACA,oBAAA;CrCotJL;AsClwJD;EACE,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,kBAAA;EACA,eAAA;EACA,eAAA;EACA,mBAAA;EACA,oBAAA;EACA,yBAAA;EACA,qBAAA;CtCowJD;AsChwJG;;EAEE,eAAA;EACA,sBAAA;EACA,gBAAA;CtCkwJL;AsC7vJC;EACE,cAAA;CtC+vJH;AsC3vJC;EACE,mBAAA;EACA,UAAA;CtC6vJH;AsCtvJD;ECtCE,0BAAA;CvC+xJD;AuC5xJG;;EAEE,0BAAA;CvC8xJL;AsCzvJD;EC1CE,0BAAA;CvCsyJD;AuCnyJG;;EAEE,0BAAA;CvCqyJL;AsC5vJD;EC9CE,0BAAA;CvC6yJD;AuC1yJG;;EAEE,0BAAA;CvC4yJL;AsC/vJD;EClDE,0BAAA;CvCozJD;AuCjzJG;;EAEE,0BAAA;CvCmzJL;AsClwJD;ECtDE,0BAAA;CvC2zJD;AuCxzJG;;EAEE,0BAAA;CvC0zJL;AsCrwJD;EC1DE,0BAAA;CvCk0JD;AuC/zJG;;EAEE,0BAAA;CvCi0JL;AwCn0JD;EACE,sBAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,kBAAA;EACA,eAAA;EACA,eAAA;EACA,uBAAA;EACA,oBAAA;EACA,mBAAA;EACA,0BAAA;EACA,oBAAA;CxCq0JD;AwCl0JC;EACE,cAAA;CxCo0JH;AwCh0JC;EACE,mBAAA;EACA,UAAA;CxCk0JH;AwC/zJC;;EAEE,OAAA;EACA,iBAAA;CxCi0JH;AwC5zJG;;EAEE,eAAA;EACA,sBAAA;EACA,gBAAA;CxC8zJL;AwCzzJC;;EAEE,eAAA;EACA,0BAAA;CxC2zJH;AwCxzJC;EACE,aAAA;CxC0zJH;AwCvzJC;EACE,kBAAA;CxCyzJH;AwCtzJC;EACE,iBAAA;CxCwzJH;AyCl3JD;EACE,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,eAAA;EACA,0BAAA;CzCo3JD;AyCz3JD;;EASI,eAAA;CzCo3JH;AyC73JD;EAaI,oBAAA;EACA,gBAAA;EACA,iBAAA;CzCm3JH;AyCl4JD;EAmBI,0BAAA;CzCk3JH;AyC/2JC;;EAEE,mBAAA;CzCi3JH;AyCz4JD;EA4BI,gBAAA;CzCg3JH;AyC91JD;EAAA;IAdI,kBAAA;IACA,qBAAA;GzCg3JD;EyC92JC;;IAEE,mBAAA;IACA,oBAAA;GzCg3JH;EyCx2JH;;IAHM,gBAAA;GzC+2JH;CACF;A0C15JD;EACE,eAAA;EACA,aAAA;EACA,oBAAA;EACA,wBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;ErCiLA,4CAAA;EACK,uCAAA;EACG,oCAAA;CL4uJT;A0Ct6JD;;EAaI,kBAAA;EACA,mBAAA;C1C65JH;A0Cz5JC;;;EAGE,sBAAA;C1C25JH;A0Ch7JD;EA0BI,aAAA;EACA,eAAA;C1Cy5JH;A2Cl7JD;EACE,cAAA;EACA,oBAAA;EACA,8BAAA;EACA,mBAAA;C3Co7JD;A2Cx7JD;EAQI,cAAA;EAEA,eAAA;C3Ck7JH;A2C57JD;EAeI,kBAAA;C3Cg7JH;A2C/7JD;;EAqBI,iBAAA;C3C86JH;A2Cn8JD;EAyBI,gBAAA;C3C66JH;A2Cr6JD;;EAEE,oBAAA;C3Cu6JD;A2Cz6JD;;EAMI,mBAAA;EACA,UAAA;EACA,aAAA;EACA,eAAA;C3Cu6JH;A2C/5JD;ECvDE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Cy9JD;A2Cp6JD;EClDI,0BAAA;C5Cy9JH;A2Cv6JD;EC/CI,eAAA;C5Cy9JH;A2Ct6JD;EC3DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Co+JD;A2C36JD;ECtDI,0BAAA;C5Co+JH;A2C96JD;ECnDI,eAAA;C5Co+JH;A2C76JD;EC/DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C++JD;A2Cl7JD;EC1DI,0BAAA;C5C++JH;A2Cr7JD;ECvDI,eAAA;C5C++JH;A2Cp7JD;ECnEE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C0/JD;A2Cz7JD;EC9DI,0BAAA;C5C0/JH;A2C57JD;EC3DI,eAAA;C5C0/JH;A6C5/JD;EACE;IAAQ,4BAAA;G7C+/JP;E6C9/JD;IAAQ,yBAAA;G7CigKP;CACF;A6C9/JD;EACE;IAAQ,4BAAA;G7CigKP;E6ChgKD;IAAQ,yBAAA;G7CmgKP;CACF;A6CtgKD;EACE;IAAQ,4BAAA;G7CigKP;E6ChgKD;IAAQ,yBAAA;G7CmgKP;CACF;A6C5/JD;EACE,iBAAA;EACA,aAAA;EACA,oBAAA;EACA,0BAAA;EACA,mBAAA;ExCsCA,uDAAA;EACQ,+CAAA;CLy9JT;A6C3/JD;EACE,YAAA;EACA,UAAA;EACA,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,eAAA;EACA,mBAAA;EACA,0BAAA;ExCyBA,uDAAA;EACQ,+CAAA;EAyHR,oCAAA;EACK,+BAAA;EACG,4BAAA;CL62JT;A6Cx/JD;;ECCI,8MAAA;EACA,yMAAA;EACA,sMAAA;EDAF,mCAAA;UAAA,2BAAA;C7C4/JD;A6Cr/JD;;ExC5CE,2DAAA;EACK,sDAAA;EACG,mDAAA;CLqiKT;A6Cl/JD;EErEE,0BAAA;C/C0jKD;A+CvjKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C0gKH;A6Ct/JD;EEzEE,0BAAA;C/CkkKD;A+C/jKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9CkhKH;A6C1/JD;EE7EE,0BAAA;C/C0kKD;A+CvkKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C0hKH;A6C9/JD;EEjFE,0BAAA;C/CklKD;A+C/kKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9CkiKH;AgD1lKD;EAEE,iBAAA;ChD2lKD;AgDzlKC;EACE,cAAA;ChD2lKH;AgDvlKD;;EAEE,QAAA;EACA,iBAAA;ChDylKD;AgDtlKD;EACE,eAAA;ChDwlKD;AgDrlKD;EACE,eAAA;ChDulKD;AgDplKC;EACE,gBAAA;ChDslKH;AgDllKD;;EAEE,mBAAA;ChDolKD;AgDjlKD;;EAEE,oBAAA;ChDmlKD;AgDhlKD;;;EAGE,oBAAA;EACA,oBAAA;ChDklKD;AgD/kKD;EACE,uBAAA;ChDilKD;AgD9kKD;EACE,uBAAA;ChDglKD;AgD5kKD;EACE,cAAA;EACA,mBAAA;ChD8kKD;AgDxkKD;EACE,gBAAA;EACA,iBAAA;ChD0kKD;AiDjoKD;EAEE,oBAAA;EACA,gBAAA;CjDkoKD;AiD1nKD;EACE,mBAAA;EACA,eAAA;EACA,mBAAA;EAEA,oBAAA;EACA,0BAAA;EACA,0BAAA;CjD2nKD;AiDxnKC;ErB3BA,6BAAA;EACC,4BAAA;C5BspKF;AiDznKC;EACE,iBAAA;ErBvBF,gCAAA;EACC,+BAAA;C5BmpKF;AiDlnKD;;EAEE,eAAA;CjDonKD;AiDtnKD;;EAKI,eAAA;CjDqnKH;AiDjnKC;;;;EAEE,sBAAA;EACA,eAAA;EACA,0BAAA;CjDqnKH;AiDjnKD;EACE,YAAA;EACA,iBAAA;CjDmnKD;AiD9mKC;;;EAGE,0BAAA;EACA,eAAA;EACA,oBAAA;CjDgnKH;AiDrnKC;;;EASI,eAAA;CjDinKL;AiD1nKC;;;EAYI,eAAA;CjDmnKL;AiD9mKC;;;EAGE,WAAA;EACA,eAAA;EACA,0BAAA;EACA,sBAAA;CjDgnKH;AiDtnKC;;;;;;;;;EAYI,eAAA;CjDqnKL;AiDjoKC;;;EAeI,eAAA;CjDunKL;AkDztKC;EACE,eAAA;EACA,0BAAA;ClD2tKH;AkDztKG;;EAEE,eAAA;ClD2tKL;AkD7tKG;;EAKI,eAAA;ClD4tKP;AkDztKK;;;;EAEE,eAAA;EACA,0BAAA;ClD6tKP;AkD3tKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDguKP;AkDtvKC;EACE,eAAA;EACA,0BAAA;ClDwvKH;AkDtvKG;;EAEE,eAAA;ClDwvKL;AkD1vKG;;EAKI,eAAA;ClDyvKP;AkDtvKK;;;;EAEE,eAAA;EACA,0BAAA;ClD0vKP;AkDxvKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD6vKP;AkDnxKC;EACE,eAAA;EACA,0BAAA;ClDqxKH;AkDnxKG;;EAEE,eAAA;ClDqxKL;AkDvxKG;;EAKI,eAAA;ClDsxKP;AkDnxKK;;;;EAEE,eAAA;EACA,0BAAA;ClDuxKP;AkDrxKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD0xKP;AkDhzKC;EACE,eAAA;EACA,0BAAA;ClDkzKH;AkDhzKG;;EAEE,eAAA;ClDkzKL;AkDpzKG;;EAKI,eAAA;ClDmzKP;AkDhzKK;;;;EAEE,eAAA;EACA,0BAAA;ClDozKP;AkDlzKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDuzKP;AiDttKD;EACE,cAAA;EACA,mBAAA;CjDwtKD;AiDttKD;EACE,iBAAA;EACA,iBAAA;CjDwtKD;AmDl1KD;EACE,oBAAA;EACA,0BAAA;EACA,8BAAA;EACA,mBAAA;E9C0DA,kDAAA;EACQ,0CAAA;CL2xKT;AmDj1KD;EACE,cAAA;CnDm1KD;AmD90KD;EACE,mBAAA;EACA,qCAAA;EvBpBA,6BAAA;EACC,4BAAA;C5Bq2KF;AmDp1KD;EAMI,eAAA;CnDi1KH;AmD50KD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,eAAA;CnD80KD;AmDl1KD;;;;;EAWI,eAAA;CnD80KH;AmDz0KD;EACE,mBAAA;EACA,0BAAA;EACA,8BAAA;EvBxCA,gCAAA;EACC,+BAAA;C5Bo3KF;AmDn0KD;;EAGI,iBAAA;CnDo0KH;AmDv0KD;;EAMM,oBAAA;EACA,iBAAA;CnDq0KL;AmDj0KG;;EAEI,cAAA;EvBvEN,6BAAA;EACC,4BAAA;C5B24KF;AmD/zKG;;EAEI,iBAAA;EvBvEN,gCAAA;EACC,+BAAA;C5By4KF;AmDx1KD;EvB1DE,2BAAA;EACC,0BAAA;C5Bq5KF;AmD3zKD;EAEI,oBAAA;CnD4zKH;AmDzzKD;EACE,oBAAA;CnD2zKD;AmDnzKD;;;EAII,iBAAA;CnDozKH;AmDxzKD;;;EAOM,mBAAA;EACA,oBAAA;CnDszKL;AmD9zKD;;EvBzGE,6BAAA;EACC,4BAAA;C5B26KF;AmDn0KD;;;;EAmBQ,4BAAA;EACA,6BAAA;CnDszKP;AmD10KD;;;;;;;;EAwBU,4BAAA;CnD4zKT;AmDp1KD;;;;;;;;EA4BU,6BAAA;CnDk0KT;AmD91KD;;EvBjGE,gCAAA;EACC,+BAAA;C5Bm8KF;AmDn2KD;;;;EAyCQ,+BAAA;EACA,gCAAA;CnDg0KP;AmD12KD;;;;;;;;EA8CU,+BAAA;CnDs0KT;AmDp3KD;;;;;;;;EAkDU,gCAAA;CnD40KT;AmD93KD;;;;EA2DI,8BAAA;CnDy0KH;AmDp4KD;;EA+DI,cAAA;CnDy0KH;AmDx4KD;;EAmEI,UAAA;CnDy0KH;AmD54KD;;;;;;;;;;;;EA0EU,eAAA;CnDg1KT;AmD15KD;;;;;;;;;;;;EA8EU,gBAAA;CnD01KT;AmDx6KD;;;;;;;;EAuFU,iBAAA;CnD21KT;AmDl7KD;;;;;;;;EAgGU,iBAAA;CnD41KT;AmD57KD;EAsGI,UAAA;EACA,iBAAA;CnDy1KH;AmD/0KD;EACE,oBAAA;CnDi1KD;AmDl1KD;EAKI,iBAAA;EACA,mBAAA;CnDg1KH;AmDt1KD;EASM,gBAAA;CnDg1KL;AmDz1KD;EAcI,iBAAA;CnD80KH;AmD51KD;;EAkBM,8BAAA;CnD80KL;AmDh2KD;EAuBI,cAAA;CnD40KH;AmDn2KD;EAyBM,iCAAA;CnD60KL;AmDt0KD;EC1PE,sBAAA;CpDmkLD;AoDjkLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDmkLH;AoDtkLC;EAMI,0BAAA;CpDmkLL;AoDzkLC;EASI,eAAA;EACA,0BAAA;CpDmkLL;AoDhkLC;EAEI,6BAAA;CpDikLL;AmDr1KD;EC7PE,sBAAA;CpDqlLD;AoDnlLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDqlLH;AoDxlLC;EAMI,0BAAA;CpDqlLL;AoD3lLC;EASI,eAAA;EACA,0BAAA;CpDqlLL;AoDllLC;EAEI,6BAAA;CpDmlLL;AmDp2KD;EChQE,sBAAA;CpDumLD;AoDrmLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDumLH;AoD1mLC;EAMI,0BAAA;CpDumLL;AoD7mLC;EASI,eAAA;EACA,0BAAA;CpDumLL;AoDpmLC;EAEI,6BAAA;CpDqmLL;AmDn3KD;ECnQE,sBAAA;CpDynLD;AoDvnLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDynLH;AoD5nLC;EAMI,0BAAA;CpDynLL;AoD/nLC;EASI,eAAA;EACA,0BAAA;CpDynLL;AoDtnLC;EAEI,6BAAA;CpDunLL;AmDl4KD;ECtQE,sBAAA;CpD2oLD;AoDzoLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD2oLH;AoD9oLC;EAMI,0BAAA;CpD2oLL;AoDjpLC;EASI,eAAA;EACA,0BAAA;CpD2oLL;AoDxoLC;EAEI,6BAAA;CpDyoLL;AmDj5KD;ECzQE,sBAAA;CpD6pLD;AoD3pLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD6pLH;AoDhqLC;EAMI,0BAAA;CpD6pLL;AoDnqLC;EASI,eAAA;EACA,0BAAA;CpD6pLL;AoD1pLC;EAEI,6BAAA;CpD2pLL;AqD3qLD;EACE,mBAAA;EACA,eAAA;EACA,UAAA;EACA,WAAA;EACA,iBAAA;CrD6qLD;AqDlrLD;;;;;EAYI,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,aAAA;EACA,YAAA;EACA,UAAA;CrD6qLH;AqDxqLD;EACE,uBAAA;CrD0qLD;AqDtqLD;EACE,oBAAA;CrDwqLD;AsDnsLD;EACE,iBAAA;EACA,cAAA;EACA,oBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;EjDwDA,wDAAA;EACQ,gDAAA;CL8oLT;AsD7sLD;EASI,mBAAA;EACA,kCAAA;CtDusLH;AsDlsLD;EACE,cAAA;EACA,mBAAA;CtDosLD;AsDlsLD;EACE,aAAA;EACA,mBAAA;CtDosLD;AuD1tLD;EACE,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,eAAA;EACA,eAAA;EACA,6BAAA;EjCRA,aAAA;EAGA,0BAAA;CtBmuLD;AuD3tLC;;EAEE,eAAA;EACA,sBAAA;EACA,gBAAA;EjCfF,aAAA;EAGA,0BAAA;CtB2uLD;AuDvtLC;EACE,WAAA;EACA,gBAAA;EACA,wBAAA;EACA,UAAA;EACA,yBAAA;CvDytLH;AwD9uLD;EACE,iBAAA;CxDgvLD;AwD5uLD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,kCAAA;EAIA,WAAA;CxD2uLD;AwDxuLC;EnD+GA,sCAAA;EACI,kCAAA;EACC,iCAAA;EACG,8BAAA;EAkER,oDAAA;EAEK,0CAAA;EACG,oCAAA;CL2jLT;AwD9uLC;EnD2GA,mCAAA;EACI,+BAAA;EACC,8BAAA;EACG,2BAAA;CLsoLT;AwDlvLD;EACE,mBAAA;EACA,iBAAA;CxDovLD;AwDhvLD;EACE,mBAAA;EACA,YAAA;EACA,aAAA;CxDkvLD;AwD9uLD;EACE,mBAAA;EACA,0BAAA;EACA,0BAAA;EACA,qCAAA;EACA,mBAAA;EnDaA,iDAAA;EACQ,yCAAA;EmDZR,qCAAA;UAAA,6BAAA;EAEA,WAAA;CxDgvLD;AwD5uLD;EACE,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,0BAAA;CxD8uLD;AwD5uLC;ElCrEA,WAAA;EAGA,yBAAA;CtBkzLD;AwD/uLC;ElCtEA,aAAA;EAGA,0BAAA;CtBszLD;AwD9uLD;EACE,cAAA;EACA,iCAAA;EACA,0BAAA;CxDgvLD;AwD7uLD;EACE,iBAAA;CxD+uLD;AwD3uLD;EACE,UAAA;EACA,wBAAA;CxD6uLD;AwDxuLD;EACE,mBAAA;EACA,cAAA;CxD0uLD;AwDtuLD;EACE,cAAA;EACA,kBAAA;EACA,8BAAA;CxDwuLD;AwD3uLD;EAQI,iBAAA;EACA,iBAAA;CxDsuLH;AwD/uLD;EAaI,kBAAA;CxDquLH;AwDlvLD;EAiBI,eAAA;CxDouLH;AwD/tLD;EACE,mBAAA;EACA,aAAA;EACA,YAAA;EACA,aAAA;EACA,iBAAA;CxDiuLD;AwD/sLD;EAZE;IACE,aAAA;IACA,kBAAA;GxD8tLD;EwD5tLD;InDvEA,kDAAA;IACQ,0CAAA;GLsyLP;EwD3tLD;IAAY,aAAA;GxD8tLX;CACF;AwDztLD;EAFE;IAAY,aAAA;GxD+tLX;CACF;AyD92LD;EACE,mBAAA;EACA,cAAA;EACA,eAAA;ECRA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;EDHA,gBAAA;EnCVA,WAAA;EAGA,yBAAA;CtBq4LD;AyD13LC;EnCdA,aAAA;EAGA,0BAAA;CtBy4LD;AyD73LC;EAAW,iBAAA;EAAmB,eAAA;CzDi4L/B;AyDh4LC;EAAW,iBAAA;EAAmB,eAAA;CzDo4L/B;AyDn4LC;EAAW,gBAAA;EAAmB,eAAA;CzDu4L/B;AyDt4LC;EAAW,kBAAA;EAAmB,eAAA;CzD04L/B;AyDt4LD;EACE,iBAAA;EACA,iBAAA;EACA,eAAA;EACA,mBAAA;EACA,0BAAA;EACA,mBAAA;CzDw4LD;AyDp4LD;EACE,mBAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;CzDs4LD;AyDl4LC;EACE,UAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,0BAAA;CzDo4LH;AyDl4LC;EACE,UAAA;EACA,WAAA;EACA,oBAAA;EACA,wBAAA;EACA,0BAAA;CzDo4LH;AyDl4LC;EACE,UAAA;EACA,UAAA;EACA,oBAAA;EACA,wBAAA;EACA,0BAAA;CzDo4LH;AyDl4LC;EACE,SAAA;EACA,QAAA;EACA,iBAAA;EACA,4BAAA;EACA,4BAAA;CzDo4LH;AyDl4LC;EACE,SAAA;EACA,SAAA;EACA,iBAAA;EACA,4BAAA;EACA,2BAAA;CzDo4LH;AyDl4LC;EACE,OAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,6BAAA;CzDo4LH;AyDl4LC;EACE,OAAA;EACA,WAAA;EACA,iBAAA;EACA,wBAAA;EACA,6BAAA;CzDo4LH;AyDl4LC;EACE,OAAA;EACA,UAAA;EACA,iBAAA;EACA,wBAAA;EACA,6BAAA;CzDo4LH;A2Dj+LD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,iBAAA;EACA,aAAA;EDXA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;ECAA,gBAAA;EAEA,0BAAA;EACA,qCAAA;UAAA,6BAAA;EACA,0BAAA;EACA,qCAAA;EACA,mBAAA;EtD8CA,kDAAA;EACQ,0CAAA;CLi8LT;A2D5+LC;EAAY,kBAAA;C3D++Lb;A2D9+LC;EAAY,kBAAA;C3Di/Lb;A2Dh/LC;EAAY,iBAAA;C3Dm/Lb;A2Dl/LC;EAAY,mBAAA;C3Dq/Lb;A2Dl/LD;EACE,UAAA;EACA,kBAAA;EACA,gBAAA;EACA,0BAAA;EACA,iCAAA;EACA,2BAAA;C3Do/LD;A2Dj/LD;EACE,kBAAA;C3Dm/LD;A2D3+LC;;EAEE,mBAAA;EACA,eAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;C3D6+LH;A2D1+LD;EACE,mBAAA;C3D4+LD;A2D1+LD;EACE,mBAAA;EACA,YAAA;C3D4+LD;A2Dx+LC;EACE,UAAA;EACA,mBAAA;EACA,uBAAA;EACA,0BAAA;EACA,sCAAA;EACA,cAAA;C3D0+LH;A2Dz+LG;EACE,aAAA;EACA,YAAA;EACA,mBAAA;EACA,uBAAA;EACA,0BAAA;C3D2+LL;A2Dx+LC;EACE,SAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,4BAAA;EACA,wCAAA;C3D0+LH;A2Dz+LG;EACE,aAAA;EACA,UAAA;EACA,cAAA;EACA,qBAAA;EACA,4BAAA;C3D2+LL;A2Dx+LC;EACE,UAAA;EACA,mBAAA;EACA,oBAAA;EACA,6BAAA;EACA,yCAAA;EACA,WAAA;C3D0+LH;A2Dz+LG;EACE,aAAA;EACA,SAAA;EACA,mBAAA;EACA,oBAAA;EACA,6BAAA;C3D2+LL;A2Dv+LC;EACE,SAAA;EACA,aAAA;EACA,kBAAA;EACA,sBAAA;EACA,2BAAA;EACA,uCAAA;C3Dy+LH;A2Dx+LG;EACE,aAAA;EACA,WAAA;EACA,sBAAA;EACA,2BAAA;EACA,cAAA;C3D0+LL;A4DnmMD;EACE,mBAAA;C5DqmMD;A4DlmMD;EACE,mBAAA;EACA,iBAAA;EACA,YAAA;C5DomMD;A4DvmMD;EAMI,cAAA;EACA,mBAAA;EvD6KF,0CAAA;EACK,qCAAA;EACG,kCAAA;CLw7LT;A4D9mMD;;EAcM,eAAA;C5DomML;A4D1kMC;EAAA;IvDiKA,uDAAA;IAEK,6CAAA;IACG,uCAAA;IA7JR,oCAAA;IAEQ,4BAAA;IA+GR,4BAAA;IAEQ,oBAAA;GL69LP;E4DxmMG;;IvDmHJ,2CAAA;IACQ,mCAAA;IuDjHF,QAAA;G5D2mML;E4DzmMG;;IvD8GJ,4CAAA;IACQ,oCAAA;IuD5GF,QAAA;G5D4mML;E4D1mMG;;;IvDyGJ,wCAAA;IACQ,gCAAA;IuDtGF,QAAA;G5D6mML;CACF;A4DnpMD;;;EA6CI,eAAA;C5D2mMH;A4DxpMD;EAiDI,QAAA;C5D0mMH;A4D3pMD;;EAsDI,mBAAA;EACA,OAAA;EACA,YAAA;C5DymMH;A4DjqMD;EA4DI,WAAA;C5DwmMH;A4DpqMD;EA+DI,YAAA;C5DwmMH;A4DvqMD;;EAmEI,QAAA;C5DwmMH;A4D3qMD;EAuEI,YAAA;C5DumMH;A4D9qMD;EA0EI,WAAA;C5DumMH;A4D/lMD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EtC9FA,aAAA;EAGA,0BAAA;EsC6FA,gBAAA;EACA,eAAA;EACA,mBAAA;EACA,0CAAA;C5DkmMD;A4D7lMC;EdlGE,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9CksMH;A4DjmMC;EACE,WAAA;EACA,SAAA;EdvGA,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9C2sMH;A4DnmMC;;EAEE,WAAA;EACA,eAAA;EACA,sBAAA;EtCtHF,aAAA;EAGA,0BAAA;CtB0tMD;A4DpoMD;;;;EAsCI,mBAAA;EACA,SAAA;EACA,kBAAA;EACA,WAAA;EACA,sBAAA;C5DomMH;A4D9oMD;;EA8CI,UAAA;EACA,mBAAA;C5DomMH;A4DnpMD;;EAmDI,WAAA;EACA,oBAAA;C5DomMH;A4DxpMD;;EAwDI,YAAA;EACA,aAAA;EACA,eAAA;EACA,mBAAA;C5DomMH;A4D/lMG;EACE,iBAAA;C5DimML;A4D7lMG;EACE,iBAAA;C5D+lML;A4DrlMD;EACE,mBAAA;EACA,aAAA;EACA,UAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;C5DulMD;A4DhmMD;EAYI,sBAAA;EACA,YAAA;EACA,aAAA;EACA,YAAA;EACA,oBAAA;EACA,0BAAA;EACA,oBAAA;EACA,gBAAA;EAWA,0BAAA;EACA,mCAAA;C5D6kMH;A4D5mMD;EAkCI,UAAA;EACA,YAAA;EACA,aAAA;EACA,0BAAA;C5D6kMH;A4DtkMD;EACE,mBAAA;EACA,UAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,eAAA;EACA,mBAAA;EACA,0CAAA;C5DwkMD;A4DvkMC;EACE,kBAAA;C5DykMH;A4DhiMD;EAhCE;;;;IAKI,YAAA;IACA,aAAA;IACA,kBAAA;IACA,gBAAA;G5DkkMH;E4D1kMD;;IAYI,mBAAA;G5DkkMH;E4D9kMD;;IAgBI,oBAAA;G5DkkMH;E4D7jMD;IACE,UAAA;IACA,WAAA;IACA,qBAAA;G5D+jMD;E4D3jMD;IACE,aAAA;G5D6jMD;CACF;A6D3zMC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE,aAAA;EACA,eAAA;C7Dy1MH;A6Dv1MC;;;;;;;;;;;;;;;EACE,YAAA;C7Du2MH;AiC/2MD;E6BRE,eAAA;EACA,kBAAA;EACA,mBAAA;C9D03MD;AiCj3MD;EACE,wBAAA;CjCm3MD;AiCj3MD;EACE,uBAAA;CjCm3MD;AiC32MD;EACE,yBAAA;CjC62MD;AiC32MD;EACE,0BAAA;CjC62MD;AiC32MD;EACE,mBAAA;CjC62MD;AiC32MD;E8BzBE,YAAA;EACA,mBAAA;EACA,kBAAA;EACA,8BAAA;EACA,UAAA;C/Du4MD;AiCz2MD;EACE,yBAAA;CjC22MD;AiCp2MD;EACE,gBAAA;CjCs2MD;AgEv4MD;EACE,oBAAA;ChEy4MD;AgEn4MD;;;;ECdE,yBAAA;CjEu5MD;AgEl4MD;;;;;;;;;;;;EAYE,yBAAA;ChEo4MD;AgE73MD;EAAA;IChDE,0BAAA;GjEi7MC;EiEh7MD;IAAU,0BAAA;GjEm7MT;EiEl7MD;IAAU,8BAAA;GjEq7MT;EiEp7MD;;IACU,+BAAA;GjEu7MT;CACF;AgEv4MD;EAAA;IAFI,0BAAA;GhE64MD;CACF;AgEv4MD;EAAA;IAFI,2BAAA;GhE64MD;CACF;AgEv4MD;EAAA;IAFI,iCAAA;GhE64MD;CACF;AgEt4MD;EAAA;ICrEE,0BAAA;GjE+8MC;EiE98MD;IAAU,0BAAA;GjEi9MT;EiEh9MD;IAAU,8BAAA;GjEm9MT;EiEl9MD;;IACU,+BAAA;GjEq9MT;CACF;AgEh5MD;EAAA;IAFI,0BAAA;GhEs5MD;CACF;AgEh5MD;EAAA;IAFI,2BAAA;GhEs5MD;CACF;AgEh5MD;EAAA;IAFI,iCAAA;GhEs5MD;CACF;AgE/4MD;EAAA;IC1FE,0BAAA;GjE6+MC;EiE5+MD;IAAU,0BAAA;GjE++MT;EiE9+MD;IAAU,8BAAA;GjEi/MT;EiEh/MD;;IACU,+BAAA;GjEm/MT;CACF;AgEz5MD;EAAA;IAFI,0BAAA;GhE+5MD;CACF;AgEz5MD;EAAA;IAFI,2BAAA;GhE+5MD;CACF;AgEz5MD;EAAA;IAFI,iCAAA;GhE+5MD;CACF;AgEx5MD;EAAA;IC/GE,0BAAA;GjE2gNC;EiE1gND;IAAU,0BAAA;GjE6gNT;EiE5gND;IAAU,8BAAA;GjE+gNT;EiE9gND;;IACU,+BAAA;GjEihNT;CACF;AgEl6MD;EAAA;IAFI,0BAAA;GhEw6MD;CACF;AgEl6MD;EAAA;IAFI,2BAAA;GhEw6MD;CACF;AgEl6MD;EAAA;IAFI,iCAAA;GhEw6MD;CACF;AgEj6MD;EAAA;IC5HE,yBAAA;GjEiiNC;CACF;AgEj6MD;EAAA;ICjIE,yBAAA;GjEsiNC;CACF;AgEj6MD;EAAA;ICtIE,yBAAA;GjE2iNC;CACF;AgEj6MD;EAAA;IC3IE,yBAAA;GjEgjNC;CACF;AgE95MD;ECnJE,yBAAA;CjEojND;AgE35MD;EAAA;ICjKE,0BAAA;GjEgkNC;EiE/jND;IAAU,0BAAA;GjEkkNT;EiEjkND;IAAU,8BAAA;GjEokNT;EiEnkND;;IACU,+BAAA;GjEskNT;CACF;AgEz6MD;EACE,yBAAA;ChE26MD;AgEt6MD;EAAA;IAFI,0BAAA;GhE46MD;CACF;AgE16MD;EACE,yBAAA;ChE46MD;AgEv6MD;EAAA;IAFI,2BAAA;GhE66MD;CACF;AgE36MD;EACE,yBAAA;ChE66MD;AgEx6MD;EAAA;IAFI,iCAAA;GhE86MD;CACF;AgEv6MD;EAAA;ICpLE,yBAAA;GjE+lNC;CACF","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\2a\";\n}\n.glyphicon-plus:before {\n content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #ffffff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #ffffff;\n background-color: #333333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #dddddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #dddddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #dddddd;\n}\n.table .table {\n background-color: #ffffff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #dddddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #ffffff;\n background-image: none;\n border: 1px solid #cccccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 14.333333px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333333;\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default .badge {\n color: #ffffff;\n background-color: #333333;\n}\n.btn-primary {\n color: #ffffff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #ffffff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #ffffff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #ffffff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #ffffff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.btn-success {\n color: #ffffff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #ffffff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #ffffff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #ffffff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #ffffff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #ffffff;\n}\n.btn-info {\n color: #ffffff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #ffffff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #ffffff;\n}\n.btn-warning {\n color: #ffffff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #ffffff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #ffffff;\n}\n.btn-danger {\n color: #ffffff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #ffffff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #ffffff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #ffffff;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #ffffff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-bottom-left-radius: 4px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #dddddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #dddddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #ffffff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #dddddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #dddddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777777;\n}\n.navbar-default .navbar-link:hover {\n color: #333333;\n}\n.navbar-default .btn-link {\n color: #777777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #cccccc;\n}\n.navbar-inverse {\n background-color: #222222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #ffffff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #ffffff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #ffffff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #ffffff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #cccccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 3;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #dddddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #ffffff;\n border-color: #dddddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #ffffff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #ffffff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #ffffff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #ffffff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #ffffff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #dddddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #dddddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #dddddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #dddddd;\n}\n.panel-default {\n border-color: #dddddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #dddddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #dddddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #dddddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000000;\n text-shadow: 0 1px 0 #ffffff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #ffffff;\n border: 1px solid #999999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n min-height: 16.42857143px;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #ffffff;\n text-align: center;\n background-color: #000000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #ffffff;\n background-clip: padding-box;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #ffffff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #ffffff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #ffffff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #ffffff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #ffffff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #ffffff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #ffffff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -15px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -15px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\2a\"; } }\n.glyphicon-plus { &:before { content: \"\\2b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @grid-float-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n }\n\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848\n//\n// Note that as of 8.3, iOS doesn't support `datetime` or `week`.\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"],\n input[type=\"time\"],\n input[type=\"datetime-local\"],\n input[type=\"month\"] {\n &.form-control {\n line-height: @input-height-base;\n }\n\n &.input-sm,\n .input-group-sm & {\n line-height: @input-height-small;\n }\n\n &.input-lg,\n .input-group-lg & {\n line-height: @input-height-large;\n }\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: @form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n &[disabled],\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n &.disabled,\n fieldset[disabled] & {\n label {\n cursor: @cursor-disabled;\n }\n }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n // Size it appropriately next to real form controls\n padding-top: (@padding-base-vertical + 1);\n padding-bottom: (@padding-base-vertical + 1);\n // Remove default margin from `p`\n margin-bottom: 0;\n min-height: (@line-height-computed + @font-size-base);\n\n &.input-lg,\n &.input-sm {\n padding-left: 0;\n padding-right: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n.input-sm {\n .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n}\n.form-group-sm {\n .form-control {\n height: @input-height-small;\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n border-radius: @input-border-radius-small;\n }\n select.form-control {\n height: @input-height-small;\n line-height: @input-height-small;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: @input-height-small;\n min-height: (@line-height-computed + @font-size-small);\n padding: (@padding-small-vertical + 1) @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n }\n}\n\n.input-lg {\n .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n}\n.form-group-lg {\n .form-control {\n height: @input-height-large;\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n border-radius: @input-border-radius-large;\n }\n select.form-control {\n height: @input-height-large;\n line-height: @input-height-large;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: @input-height-large;\n min-height: (@line-height-computed + @font-size-large);\n padding: (@padding-large-vertical + 1) @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n }\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n // Enable absolute positioning\n position: relative;\n\n // Ensure icons don't overlap text\n .form-control {\n padding-right: (@input-height-base * 1.25);\n }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2; // Ensure icon is above input groups\n display: block;\n width: @input-height-base;\n height: @input-height-base;\n line-height: @input-height-base;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: @input-height-large;\n height: @input-height-large;\n line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: @input-height-small;\n height: @input-height-small;\n line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n & ~ .form-control-feedback {\n top: (@line-height-computed + 5); // Height of the `label` and its margin\n }\n &.sr-only ~ .form-control-feedback {\n top: 0;\n }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n display: block; // account for any element using help-block\n margin-top: 5px;\n margin-bottom: 10px;\n color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n // Kick in the inline\n @media (min-width: @screen-sm-min) {\n // Inline-block all the things for \"inline\"\n .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // In navbar-form, allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-static {\n display: inline-block;\n }\n\n .input-group {\n display: inline-table;\n vertical-align: middle;\n\n .input-group-addon,\n .input-group-btn,\n .form-control {\n width: auto;\n }\n }\n\n // Input groups need that 100% width though\n .input-group > .form-control {\n width: 100%;\n }\n\n .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .radio,\n .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n\n label {\n padding-left: 0;\n }\n }\n .radio input[type=\"radio\"],\n .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n\n // Re-override the feedback icon.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n // Consistent vertical alignment of radios and checkboxes\n //\n // Labels also get some reset styles, but that is scoped to a media query below.\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n // Account for padding we're adding to ensure the alignment and of help text\n // and other content below items\n .radio,\n .checkbox {\n min-height: (@line-height-computed + (@padding-base-vertical + 1));\n }\n\n // Make form groups behave like rows\n .form-group {\n .make-row();\n }\n\n // Reset spacing and right align labels, but scope to media queries so that\n // labels on narrow viewports stack the same as a default form example.\n @media (min-width: @screen-sm-min) {\n .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n right: floor((@grid-gutter-width / 2));\n }\n\n // Form group sizes\n //\n // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n // inputs and labels within a `.form-group`.\n .form-group-lg {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: ((@padding-large-vertical * @line-height-large) + 1);\n font-size: @font-size-large;\n }\n }\n }\n .form-group-sm {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-small-vertical + 1);\n font-size: @font-size-small;\n }\n }\n }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline,\n &.radio label,\n &.checkbox label,\n &.radio-inline label,\n &.checkbox-inline label {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n .opacity(.65);\n .box-shadow(none);\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `<a>` elements\n }\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 25%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n border-color: darken(@border, 25%);\n }\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base dashed;\n border-top: @caret-width-base solid ~\"\\9\"; // IE8\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base dashed;\n border-bottom: @caret-width-base solid ~\"\\9\"; // IE8\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n border-top-right-radius: @btn-border-radius-base;\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n border-bottom-left-radius: @btn-border-radius-base;\n .border-top-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @border-radius-base;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 3;\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding-top: @jumbotron-padding;\n padding-bottom: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: @jumbotron-heading-font-size;\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n\n // Fix collapse in webkit from max-width: 100% and display: table-cell.\n &.img-thumbnail {\n max-width: none;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a&,\n button& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n > .panel-heading + .panel-collapse > .list-group {\n .list-group-item:first-child {\n .border-top-radius(0);\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: @panel-body-padding;\n padding-right: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n border-bottom-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-small;\n\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n",".reset-text() {\n font-family: @font-family-base;\n // We deliberately do NOT reset font-size.\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: @line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-base;\n\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n .transition-transform(~'0.6s ease-in-out');\n .backface-visibility(~'hidden');\n .perspective(1000px);\n\n &.next,\n &.active.right {\n .translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n .translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n .translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: -15px;\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: -15px;\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table !important; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]} \ No newline at end of file diff --git a/theme/bootstrap/css/bootstrap.min.css b/theme/bootstrap/css/bootstrap.min.css new file mode 100644 index 0000000..cd1c616 --- /dev/null +++ b/theme/bootstrap/css/bootstrap.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.4 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px \9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.form-group-sm .form-control{height:30px;line-height:30px}select[multiple].form-group-sm .form-control,textarea.form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:5px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.form-group-lg .form-control{height:46px;line-height:46px}select[multiple].form-group-lg .form-control,textarea.form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:10px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success.focus,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info.focus,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning.focus,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger.focus,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px)and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px)and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px)and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/theme/bootstrap/css/plugins/morris.css b/theme/bootstrap/css/plugins/morris.css new file mode 100644 index 0000000..209f091 --- /dev/null +++ b/theme/bootstrap/css/plugins/morris.css @@ -0,0 +1,2 @@ +.morris-hover{position:absolute;z-index:1000}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#666;background:rgba(255,255,255,0.8);border:solid 2px rgba(230,230,230,0.8);font-family:sans-serif;font-size:12px;text-align:center}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:0.25em 0} +.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:0.1em 0} diff --git a/theme/bootstrap/css/sb-admin-rtl.css b/theme/bootstrap/css/sb-admin-rtl.css new file mode 100644 index 0000000..50119bd --- /dev/null +++ b/theme/bootstrap/css/sb-admin-rtl.css @@ -0,0 +1,5 @@ + +@media (min-width: 768px){ + #wrapper {padding-right: 225px; padding-left: 0;} + .side-nav{right: 0;left: auto;} +} \ No newline at end of file diff --git a/theme/bootstrap/css/sb-admin.css b/theme/bootstrap/css/sb-admin.css new file mode 100644 index 0000000..0df3b3f --- /dev/null +++ b/theme/bootstrap/css/sb-admin.css @@ -0,0 +1,227 @@ +/*! + * Start Bootstrap - SB Admin Bootstrap Admin Template (http://startbootstrap.com) + * Code licensed under the Apache License v2.0. + * For details, see http://www.apache.org/licenses/LICENSE-2.0. + */ + +/* Global Styles */ + +body { + margin-top: 100px; + background-color: #222; +} + +@media(min-width:768px) { + body { + margin-top: 50px; + } +} + +#wrapper { + padding-left: 0; +} + +#page-wrapper { + width: 100%; + padding: 0; + background-color: #fff; +} + +.huge { + font-size: 50px; + line-height: normal; +} + +@media(min-width:768px) { + #wrapper { + padding-left: 225px; + } + + #page-wrapper { + padding: 10px; + } +} + +/* Top Navigation */ + +.top-nav { + padding: 0 15px; +} + +.top-nav>li { + display: inline-block; + float: left; +} + +.top-nav>li>a { + padding-top: 15px; + padding-bottom: 15px; + line-height: 20px; + color: #999; +} + +.top-nav>li>a:hover, +.top-nav>li>a:focus, +.top-nav>.open>a, +.top-nav>.open>a:hover, +.top-nav>.open>a:focus { + color: #fff; + background-color: #000; +} + +.top-nav>.open>.dropdown-menu { + float: left; + position: absolute; + margin-top: 0; + border: 1px solid rgba(0,0,0,.15); + border-top-left-radius: 0; + border-top-right-radius: 0; + background-color: #fff; + -webkit-box-shadow: 0 6px 12px rgba(0,0,0,.175); + box-shadow: 0 6px 12px rgba(0,0,0,.175); +} + +.top-nav>.open>.dropdown-menu>li>a { + white-space: normal; +} + +ul.message-dropdown { + padding: 0; + max-height: 250px; + overflow-x: hidden; + overflow-y: auto; +} + +li.message-preview { + width: 275px; + border-bottom: 1px solid rgba(0,0,0,.15); +} + +li.message-preview>a { + padding-top: 15px; + padding-bottom: 15px; +} + +li.message-footer { + margin: 5px 0; +} + +ul.alert-dropdown { + width: 200px; +} + +/* Side Navigation */ + +@media(min-width:768px) { + .side-nav { + position: fixed; + top: 51px; + left: 225px; + width: 225px; + margin-left: -225px; + border: none; + border-radius: 0; + overflow-y: auto; + background-color: #222; + bottom: 0; + overflow-x: hidden; + padding-bottom: 40px; + } + + .side-nav>li>a { + width: 225px; + } + + .side-nav li a:hover, + .side-nav li a:focus { + outline: none; + background-color: #000 !important; + } +} + +.side-nav>li>ul { + padding: 0; +} + +.side-nav>li>ul>li>a { + display: block; + padding: 10px 15px 10px 38px; + text-decoration: none; + color: #999; +} + +.side-nav>li>ul>li>a:hover { + color: #fff; +} + +/* Flot Chart Containers */ + +.flot-chart { + display: block; + height: 400px; +} + +.flot-chart-content { + width: 100%; + height: 100%; +} + +/* Custom Colored Panels */ + +.huge { + font-size: 40px; +} + +.panel-green { + border-color: #5cb85c; +} + +.panel-green > .panel-heading { + border-color: #5cb85c; + color: #fff; + background-color: #5cb85c; +} + +.panel-green > a { + color: #5cb85c; +} + +.panel-green > a:hover { + color: #3d8b3d; +} + +.panel-red { + border-color: #d9534f; +} + +.panel-red > .panel-heading { + border-color: #d9534f; + color: #fff; + background-color: #d9534f; +} + +.panel-red > a { + color: #d9534f; +} + +.panel-red > a:hover { + color: #b52b27; +} + +.panel-yellow { + border-color: #f0ad4e; +} + +.panel-yellow > .panel-heading { + border-color: #f0ad4e; + color: #fff; + background-color: #f0ad4e; +} + +.panel-yellow > a { + color: #f0ad4e; +} + +.panel-yellow > a:hover { + color: #df8a13; +} \ No newline at end of file diff --git a/theme/bootstrap/css/simple-sidebar.css b/theme/bootstrap/css/simple-sidebar.css new file mode 100644 index 0000000..f3a2505 --- /dev/null +++ b/theme/bootstrap/css/simple-sidebar.css @@ -0,0 +1,125 @@ +/*! + * Start Bootstrap - Simple Sidebar HTML Template (http://startbootstrap.com) + * Code licensed under the Apache License v2.0. + * For details, see http://www.apache.org/licenses/LICENSE-2.0. + */ + +/* Toggle Styles */ + +#wrapper { + padding-left: 0; + -webkit-transition: all 0.5s ease; + -moz-transition: all 0.5s ease; + -o-transition: all 0.5s ease; + transition: all 0.5s ease; +} + +#wrapper.toggled { + padding-left: 250px; +} + +#sidebar-wrapper { + z-index: 1000; + position: fixed; + left: 250px; + width: 0; + height: 100%; + margin-left: -250px; + overflow-y: auto; + background: #000; + -webkit-transition: all 0.5s ease; + -moz-transition: all 0.5s ease; + -o-transition: all 0.5s ease; + transition: all 0.5s ease; +} + +#wrapper.toggled #sidebar-wrapper { + width: 250px; +} + +#page-content-wrapper { + width: 100%; + position: absolute; + padding: 15px; +} + +#wrapper.toggled #page-content-wrapper { + position: absolute; + margin-right: -250px; +} + +/* Sidebar Styles */ + +.sidebar-nav { + position: absolute; + top: 0; + width: 250px; + margin: 0; + padding: 0; + list-style: none; +} + +.sidebar-nav li { + text-indent: 20px; + line-height: 40px; +} + +.sidebar-nav li a { + display: block; + text-decoration: none; + color: #999999; +} + +.sidebar-nav li a:hover { + text-decoration: none; + color: #fff; + background: rgba(255,255,255,0.2); +} + +.sidebar-nav li a:active, +.sidebar-nav li a:focus { + text-decoration: none; +} + +.sidebar-nav > .sidebar-brand { + height: 65px; + font-size: 18px; + line-height: 60px; +} + +.sidebar-nav > .sidebar-brand a { + color: #999999; +} + +.sidebar-nav > .sidebar-brand a:hover { + color: #fff; + background: none; +} + +@media(min-width:768px) { + #wrapper { + padding-left: 250px; + } + + #wrapper.toggled { + padding-left: 0; + } + + #sidebar-wrapper { + width: 250px; + } + + #wrapper.toggled #sidebar-wrapper { + width: 0; + } + + #page-content-wrapper { + padding: 20px; + position: relative; + } + + #wrapper.toggled #page-content-wrapper { + position: relative; + margin-right: 0; + } +} \ No newline at end of file diff --git a/theme/bootstrap/css/styles.css b/theme/bootstrap/css/styles.css new file mode 100644 index 0000000..f6a42d2 --- /dev/null +++ b/theme/bootstrap/css/styles.css @@ -0,0 +1,3 @@ +#page { + padding-top: 60px; +} \ No newline at end of file diff --git a/theme/bootstrap/dist/css/AdminLTE.css b/theme/bootstrap/dist/css/AdminLTE.css new file mode 100644 index 0000000..2b6b9ee --- /dev/null +++ b/theme/bootstrap/dist/css/AdminLTE.css @@ -0,0 +1,4729 @@ +@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic); +/*! + * AdminLTE v2.3.0 + * Author: Almsaeed Studio + * Website: Almsaeed Studio <http://almsaeedstudio.com> + * License: Open source - MIT + * Please visit http://opensource.org/licenses/MIT for more information +!*/ +/* + * Core: General Layout Style + * ------------------------- + */ +html, +body { + min-height: 100%; +} +.layout-boxed html, +.layout-boxed body { + height: 100%; +} +body { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-weight: 400; + overflow-x: hidden; + overflow-y: auto; +} +/* Layout */ +.wrapper { + min-height: 100%; + position: static; + overflow: hidden; +} +.wrapper:before, +.wrapper:after { + content: " "; + display: table; +} +.wrapper:after { + clear: both; +} +.layout-boxed .wrapper { + max-width: 1250px; + margin: 0 auto; + min-height: 100%; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.5); + position: relative; +} +.layout-boxed { + background: url('../img/boxed-bg.jpg') repeat fixed; +} +/* + * Content Wrapper - contains the main content + * ```.right-side has been deprecated as of v2.0.0 in favor of .content-wrapper ``` + */ +.content-wrapper, +.right-side, +.main-footer { + -webkit-transition: -webkit-transform 0.3s ease-in-out, margin 0.3s ease-in-out; + -moz-transition: -moz-transform 0.3s ease-in-out, margin 0.3s ease-in-out; + -o-transition: -o-transform 0.3s ease-in-out, margin 0.3s ease-in-out; + transition: transform 0.3s ease-in-out, margin 0.3s ease-in-out; + margin-left: 230px; + z-index: 820; +} +.layout-top-nav .content-wrapper, +.layout-top-nav .right-side, +.layout-top-nav .main-footer { + margin-left: 0; +} +@media (max-width: 767px) { + .content-wrapper, + .right-side, + .main-footer { + margin-left: 0; + } +} +@media (min-width: 768px) { + .sidebar-collapse .content-wrapper, + .sidebar-collapse .right-side, + .sidebar-collapse .main-footer { + margin-left: 0; + } +} +@media (max-width: 767px) { + .sidebar-open .content-wrapper, + .sidebar-open .right-side, + .sidebar-open .main-footer { + -webkit-transform: translate(230px, 0); + -ms-transform: translate(230px, 0); + -o-transform: translate(230px, 0); + transform: translate(230px, 0); + } +} +.content-wrapper, +.right-side { + min-height: 100%; + background-color: #ecf0f5; + z-index: 800; +} +.main-footer { + background: #fff; + padding: 15px; + color: #444; + border-top: 1px solid #d2d6de; +} +/* Fixed layout */ +.fixed .main-header, +.fixed .main-sidebar, +.fixed .left-side { + position: fixed; +} +.fixed .main-header { + top: 0; + right: 0; + left: 0; +} +.fixed .content-wrapper, +.fixed .right-side { + padding-top: 50px; +} +@media (max-width: 767px) { + .fixed .content-wrapper, + .fixed .right-side { + padding-top: 100px; + } +} +.fixed.layout-boxed .wrapper { + max-width: 100%; +} +body.hold-transition .content-wrapper, +body.hold-transition .right-side, +body.hold-transition .main-footer, +body.hold-transition .main-sidebar, +body.hold-transition .left-side, +body.hold-transition .main-header > .navbar, +body.hold-transition .main-header .logo { + /* Fix for IE */ + -webkit-transition: none; + -o-transition: none; + transition: none; +} +/* Content */ +.content { + min-height: 250px; + padding: 15px; + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +/* H1 - H6 font */ +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: 'Source Sans Pro', sans-serif; +} +/* General Links */ +a { + color: #3c8dbc; +} +a:hover, +a:active, +a:focus { + outline: none; + text-decoration: none; + color: #72afd2; +} +/* Page Header */ +.page-header { + margin: 10px 0 20px 0; + font-size: 22px; +} +.page-header > small { + color: #666; + display: block; + margin-top: 5px; +} +/* + * Component: Main Header + * ---------------------- + */ +.main-header { + position: relative; + max-height: 100px; + z-index: 1030; +} +.main-header > .navbar { + -webkit-transition: margin-left 0.3s ease-in-out; + -o-transition: margin-left 0.3s ease-in-out; + transition: margin-left 0.3s ease-in-out; + margin-bottom: 0; + margin-left: 230px; + border: none; + min-height: 50px; + border-radius: 0; +} +.layout-top-nav .main-header > .navbar { + margin-left: 0; +} +.main-header #navbar-search-input.form-control { + background: rgba(255, 255, 255, 0.2); + border-color: transparent; +} +.main-header #navbar-search-input.form-control:focus, +.main-header #navbar-search-input.form-control:active { + border-color: rgba(0, 0, 0, 0.1); + background: rgba(255, 255, 255, 0.9); +} +.main-header #navbar-search-input.form-control::-moz-placeholder { + color: #ccc; + opacity: 1; +} +.main-header #navbar-search-input.form-control:-ms-input-placeholder { + color: #ccc; +} +.main-header #navbar-search-input.form-control::-webkit-input-placeholder { + color: #ccc; +} +.main-header .navbar-custom-menu, +.main-header .navbar-right { + float: right; +} +@media (max-width: 991px) { + .main-header .navbar-custom-menu a, + .main-header .navbar-right a { + color: inherit; + background: transparent; + } +} +@media (max-width: 767px) { + .main-header .navbar-right { + float: none; + } + .navbar-collapse .main-header .navbar-right { + margin: 7.5px -15px; + } + .main-header .navbar-right > li { + color: inherit; + border: 0; + } +} +.main-header .sidebar-toggle { + float: left; + background-color: transparent; + background-image: none; + padding: 15px 15px; + font-family: fontAwesome; +} +.main-header .sidebar-toggle:before { + content: "\f0c9"; +} +.main-header .sidebar-toggle:hover { + color: #fff; +} +.main-header .sidebar-toggle:focus, +.main-header .sidebar-toggle:active { + background: transparent; +} +.main-header .sidebar-toggle .icon-bar { + display: none; +} +.main-header .navbar .nav > li.user > a > .fa, +.main-header .navbar .nav > li.user > a > .glyphicon, +.main-header .navbar .nav > li.user > a > .ion { + margin-right: 5px; +} +.main-header .navbar .nav > li > a > .label { + position: absolute; + top: 9px; + right: 7px; + text-align: center; + font-size: 9px; + padding: 2px 3px; + line-height: .9; +} +.main-header .logo { + -webkit-transition: width 0.3s ease-in-out; + -o-transition: width 0.3s ease-in-out; + transition: width 0.3s ease-in-out; + display: block; + float: left; + height: 50px; + font-size: 20px; + line-height: 50px; + text-align: center; + width: 230px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + padding: 0 15px; + font-weight: 300; + overflow: hidden; +} +.main-header .logo .logo-lg { + display: block; +} +.main-header .logo .logo-mini { + display: none; +} +.main-header .navbar-brand { + color: #fff; +} +.content-header { + position: relative; + padding: 15px 15px 0 15px; +} +.content-header > h1 { + margin: 0; + font-size: 24px; +} +.content-header > h1 > small { + font-size: 15px; + display: inline-block; + padding-left: 4px; + font-weight: 300; +} +.content-header > .breadcrumb { + float: right; + background: transparent; + margin-top: 0; + margin-bottom: 0; + font-size: 12px; + padding: 7px 5px; + position: absolute; + top: 15px; + right: 10px; + border-radius: 2px; +} +.content-header > .breadcrumb > li > a { + color: #444; + text-decoration: none; + display: inline-block; +} +.content-header > .breadcrumb > li > a > .fa, +.content-header > .breadcrumb > li > a > .glyphicon, +.content-header > .breadcrumb > li > a > .ion { + margin-right: 5px; +} +.content-header > .breadcrumb > li + li:before { + content: '>\00a0'; +} +@media (max-width: 991px) { + .content-header > .breadcrumb { + position: relative; + margin-top: 5px; + top: 0; + right: 0; + float: none; + background: #d2d6de; + padding-left: 10px; + } + .content-header > .breadcrumb li:before { + color: #97a0b3; + } +} +.navbar-toggle { + color: #fff; + border: 0; + margin: 0; + padding: 15px 15px; +} +@media (max-width: 991px) { + .navbar-custom-menu .navbar-nav > li { + float: left; + } + .navbar-custom-menu .navbar-nav { + margin: 0; + float: left; + } + .navbar-custom-menu .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + line-height: 20px; + } +} +@media (max-width: 767px) { + .main-header { + position: relative; + } + .main-header .logo, + .main-header .navbar { + width: 100%; + float: none; + } + .main-header .navbar { + margin: 0; + } + .main-header .navbar-custom-menu { + float: right; + } +} +@media (max-width: 991px) { + .navbar-collapse.pull-left { + float: none!important; + } + .navbar-collapse.pull-left + .navbar-custom-menu { + display: block; + position: absolute; + top: 0; + right: 40px; + } +} +/* + * Component: Sidebar + * ------------------ + */ +.main-sidebar, +.left-side { + position: absolute; + top: 0; + left: 0; + padding-top: 50px; + min-height: 100%; + width: 230px; + z-index: 810; + -webkit-transition: -webkit-transform 0.3s ease-in-out, width 0.3s ease-in-out; + -moz-transition: -moz-transform 0.3s ease-in-out, width 0.3s ease-in-out; + -o-transition: -o-transform 0.3s ease-in-out, width 0.3s ease-in-out; + transition: transform 0.3s ease-in-out, width 0.3s ease-in-out; +} +@media (max-width: 767px) { + .main-sidebar, + .left-side { + padding-top: 100px; + } +} +@media (max-width: 767px) { + .main-sidebar, + .left-side { + -webkit-transform: translate(-230px, 0); + -ms-transform: translate(-230px, 0); + -o-transform: translate(-230px, 0); + transform: translate(-230px, 0); + } +} +@media (min-width: 768px) { + .sidebar-collapse .main-sidebar, + .sidebar-collapse .left-side { + -webkit-transform: translate(-230px, 0); + -ms-transform: translate(-230px, 0); + -o-transform: translate(-230px, 0); + transform: translate(-230px, 0); + } +} +@media (max-width: 767px) { + .sidebar-open .main-sidebar, + .sidebar-open .left-side { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); + } +} +.sidebar { + padding-bottom: 10px; +} +.sidebar-form input:focus { + border-color: transparent; +} +.user-panel { + position: relative; + width: 100%; + padding: 10px; + overflow: hidden; +} +.user-panel:before, +.user-panel:after { + content: " "; + display: table; +} +.user-panel:after { + clear: both; +} +.user-panel > .image > img { + width: 100%; + max-width: 45px; + height: auto; +} +.user-panel > .info { + padding: 5px 5px 5px 15px; + line-height: 1; + position: absolute; + left: 55px; +} +.user-panel > .info > p { + font-weight: 600; + margin-bottom: 9px; +} +.user-panel > .info > a { + text-decoration: none; + padding-right: 5px; + margin-top: 3px; + font-size: 11px; +} +.user-panel > .info > a > .fa, +.user-panel > .info > a > .ion, +.user-panel > .info > a > .glyphicon { + margin-right: 3px; +} +.sidebar-menu { + list-style: none; + margin: 0; + padding: 0; +} +.sidebar-menu > li { + position: relative; + margin: 0; + padding: 0; +} +.sidebar-menu > li > a { + padding: 12px 5px 12px 15px; + display: block; +} +.sidebar-menu > li > a > .fa, +.sidebar-menu > li > a > .glyphicon, +.sidebar-menu > li > a > .ion { + width: 20px; +} +.sidebar-menu > li .label, +.sidebar-menu > li .badge { + margin-top: 3px; + margin-right: 5px; +} +.sidebar-menu li.header { + padding: 10px 25px 10px 15px; + font-size: 12px; +} +.sidebar-menu li > a > .fa-angle-left { + width: auto; + height: auto; + padding: 0; + margin-right: 10px; + margin-top: 3px; +} +.sidebar-menu li.active > a > .fa-angle-left { + -webkit-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + transform: rotate(-90deg); +} +.sidebar-menu li.active > .treeview-menu { + display: block; +} +.sidebar-menu .treeview-menu { + display: none; + list-style: none; + padding: 0; + margin: 0; + padding-left: 5px; +} +.sidebar-menu .treeview-menu .treeview-menu { + padding-left: 20px; +} +.sidebar-menu .treeview-menu > li { + margin: 0; +} +.sidebar-menu .treeview-menu > li > a { + padding: 5px 5px 5px 15px; + display: block; + font-size: 14px; +} +.sidebar-menu .treeview-menu > li > a > .fa, +.sidebar-menu .treeview-menu > li > a > .glyphicon, +.sidebar-menu .treeview-menu > li > a > .ion { + width: 20px; +} +.sidebar-menu .treeview-menu > li > a > .fa-angle-left, +.sidebar-menu .treeview-menu > li > a > .fa-angle-down { + width: auto; +} +/* + * Component: Sidebar Mini + */ +@media (min-width: 768px) { + .sidebar-mini.sidebar-collapse .content-wrapper, + .sidebar-mini.sidebar-collapse .right-side, + .sidebar-mini.sidebar-collapse .main-footer { + margin-left: 50px!important; + z-index: 840; + } + .sidebar-mini.sidebar-collapse .main-sidebar { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); + width: 50px!important; + z-index: 850; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li { + position: relative; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li > a { + margin-right: 0; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span { + border-top-right-radius: 4px; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li:not(.treeview) > a > span { + border-bottom-right-radius: 4px; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + padding-top: 5px; + padding-bottom: 5px; + border-bottom-right-radius: 4px; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > a > span:not(.pull-right), + .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > .treeview-menu { + display: block!important; + position: absolute; + width: 180px; + left: 50px; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > a > span { + top: 0; + margin-left: -3px; + padding: 12px 5px 12px 20px; + background-color: inherit; + } + .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > .treeview-menu { + top: 44px; + margin-left: 0; + } + .sidebar-mini.sidebar-collapse .main-sidebar .user-panel > .info, + .sidebar-mini.sidebar-collapse .sidebar-form, + .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span, + .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu, + .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > .pull-right, + .sidebar-mini.sidebar-collapse .sidebar-menu li.header { + display: none!important; + -webkit-transform: translateZ(0); + } + .sidebar-mini.sidebar-collapse .main-header .logo { + width: 50px; + } + .sidebar-mini.sidebar-collapse .main-header .logo > .logo-mini { + display: block; + margin-left: -15px; + margin-right: -15px; + font-size: 18px; + } + .sidebar-mini.sidebar-collapse .main-header .logo > .logo-lg { + display: none; + } + .sidebar-mini.sidebar-collapse .main-header .navbar { + margin-left: 50px; + } +} +.sidebar-menu, +.main-sidebar .user-panel, +.sidebar-menu > li.header { + white-space: nowrap; + overflow: hidden; +} +.sidebar-menu:hover { + overflow: visible; +} +.sidebar-form, +.sidebar-menu > li.header { + overflow: hidden; + text-overflow: clip; +} +.sidebar-menu li > a { + position: relative; +} +.sidebar-menu li > a > .pull-right { + position: absolute; + top: 50%; + right: 10px; + margin-top: -7px; +} +/* + * Component: Control sidebar. By default, this is the right sidebar. + */ +.control-sidebar-bg { + position: fixed; + z-index: 1000; + bottom: 0; +} +.control-sidebar-bg, +.control-sidebar { + top: 0; + right: -230px; + width: 230px; + -webkit-transition: right 0.3s ease-in-out; + -o-transition: right 0.3s ease-in-out; + transition: right 0.3s ease-in-out; +} +.control-sidebar { + position: absolute; + padding-top: 50px; + z-index: 1010; +} +@media (max-width: 768px) { + .control-sidebar { + padding-top: 100px; + } +} +.control-sidebar > .tab-content { + padding: 10px 15px; +} +.control-sidebar.control-sidebar-open, +.control-sidebar.control-sidebar-open + .control-sidebar-bg { + right: 0; +} +.control-sidebar-open .control-sidebar-bg, +.control-sidebar-open .control-sidebar { + right: 0; +} +@media (min-width: 768px) { + .control-sidebar-open .content-wrapper, + .control-sidebar-open .right-side, + .control-sidebar-open .main-footer { + margin-right: 230px; + } +} +.nav-tabs.control-sidebar-tabs > li:first-of-type > a, +.nav-tabs.control-sidebar-tabs > li:first-of-type > a:hover, +.nav-tabs.control-sidebar-tabs > li:first-of-type > a:focus { + border-left-width: 0; +} +.nav-tabs.control-sidebar-tabs > li > a { + border-radius: 0; +} +.nav-tabs.control-sidebar-tabs > li > a, +.nav-tabs.control-sidebar-tabs > li > a:hover { + border-top: none; + border-right: none; + border-left: 1px solid transparent; + border-bottom: 1px solid transparent; +} +.nav-tabs.control-sidebar-tabs > li > a .icon { + font-size: 16px; +} +.nav-tabs.control-sidebar-tabs > li.active > a, +.nav-tabs.control-sidebar-tabs > li.active > a:hover, +.nav-tabs.control-sidebar-tabs > li.active > a:focus, +.nav-tabs.control-sidebar-tabs > li.active > a:active { + border-top: none; + border-right: none; + border-bottom: none; +} +@media (max-width: 768px) { + .nav-tabs.control-sidebar-tabs { + display: table; + } + .nav-tabs.control-sidebar-tabs > li { + display: table-cell; + } +} +.control-sidebar-heading { + font-weight: 400; + font-size: 16px; + padding: 10px 0; + margin-bottom: 10px; +} +.control-sidebar-subheading { + display: block; + font-weight: 400; + font-size: 14px; +} +.control-sidebar-menu { + list-style: none; + padding: 0; + margin: 0 -15px; +} +.control-sidebar-menu > li > a { + display: block; + padding: 10px 15px; +} +.control-sidebar-menu > li > a:before, +.control-sidebar-menu > li > a:after { + content: " "; + display: table; +} +.control-sidebar-menu > li > a:after { + clear: both; +} +.control-sidebar-menu > li > a > .control-sidebar-subheading { + margin-top: 0; +} +.control-sidebar-menu .menu-icon { + float: left; + width: 35px; + height: 35px; + border-radius: 50%; + text-align: center; + line-height: 35px; +} +.control-sidebar-menu .menu-info { + margin-left: 45px; + margin-top: 3px; +} +.control-sidebar-menu .menu-info > .control-sidebar-subheading { + margin: 0; +} +.control-sidebar-menu .menu-info > p { + margin: 0; + font-size: 11px; +} +.control-sidebar-menu .progress { + margin: 0; +} +.control-sidebar-dark { + color: #b8c7ce; +} +.control-sidebar-dark, +.control-sidebar-dark + .control-sidebar-bg { + background: #222d32; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs { + border-bottom: #1c2529; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a { + background: #181f23; + color: #b8c7ce; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus { + border-left-color: #141a1d; + border-bottom-color: #141a1d; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:focus, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:active { + background: #1c2529; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li > a:hover { + color: #fff; +} +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:hover, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:focus, +.control-sidebar-dark .nav-tabs.control-sidebar-tabs > li.active > a:active { + background: #222d32; + color: #fff; +} +.control-sidebar-dark .control-sidebar-heading, +.control-sidebar-dark .control-sidebar-subheading { + color: #fff; +} +.control-sidebar-dark .control-sidebar-menu > li > a:hover { + background: #1e282c; +} +.control-sidebar-dark .control-sidebar-menu > li > a .menu-info > p { + color: #b8c7ce; +} +.control-sidebar-light { + color: #5e5e5e; +} +.control-sidebar-light, +.control-sidebar-light + .control-sidebar-bg { + background: #f9fafc; + border-left: 1px solid #d2d6de; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs { + border-bottom: #d2d6de; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a { + background: #e8ecf4; + color: #444444; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus { + border-left-color: #d2d6de; + border-bottom-color: #d2d6de; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:hover, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:focus, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li > a:active { + background: #eff1f7; +} +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:hover, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:focus, +.control-sidebar-light .nav-tabs.control-sidebar-tabs > li.active > a:active { + background: #f9fafc; + color: #111; +} +.control-sidebar-light .control-sidebar-heading, +.control-sidebar-light .control-sidebar-subheading { + color: #111; +} +.control-sidebar-light .control-sidebar-menu { + margin-left: -14px; +} +.control-sidebar-light .control-sidebar-menu > li > a:hover { + background: #f4f4f5; +} +.control-sidebar-light .control-sidebar-menu > li > a .menu-info > p { + color: #5e5e5e; +} +/* + * Component: Dropdown menus + * ------------------------- + */ +/*Dropdowns in general*/ +.dropdown-menu { + box-shadow: none; + border-color: #eee; +} +.dropdown-menu > li > a { + color: #777; +} +.dropdown-menu > li > a > .glyphicon, +.dropdown-menu > li > a > .fa, +.dropdown-menu > li > a > .ion { + margin-right: 10px; +} +.dropdown-menu > li > a:hover { + background-color: #e1e3e9; + color: #333; +} +.dropdown-menu > .divider { + background-color: #eee; +} +.navbar-nav > .notifications-menu > .dropdown-menu, +.navbar-nav > .messages-menu > .dropdown-menu, +.navbar-nav > .tasks-menu > .dropdown-menu { + width: 280px; + padding: 0 0 0 0; + margin: 0; + top: 100%; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li, +.navbar-nav > .messages-menu > .dropdown-menu > li, +.navbar-nav > .tasks-menu > .dropdown-menu > li { + position: relative; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li.header, +.navbar-nav > .messages-menu > .dropdown-menu > li.header, +.navbar-nav > .tasks-menu > .dropdown-menu > li.header { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + background-color: #ffffff; + padding: 7px 10px; + border-bottom: 1px solid #f4f4f4; + color: #444444; + font-size: 14px; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a, +.navbar-nav > .messages-menu > .dropdown-menu > li.footer > a, +.navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; + font-size: 12px; + background-color: #fff; + padding: 7px 10px; + border-bottom: 1px solid #eeeeee; + color: #444!important; + text-align: center; +} +@media (max-width: 991px) { + .navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a, + .navbar-nav > .messages-menu > .dropdown-menu > li.footer > a, + .navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a { + background: #fff!important; + color: #444!important; + } +} +.navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a:hover, +.navbar-nav > .messages-menu > .dropdown-menu > li.footer > a:hover, +.navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a:hover { + text-decoration: none; + font-weight: normal; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu, +.navbar-nav > .messages-menu > .dropdown-menu > li .menu, +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu { + max-height: 200px; + margin: 0; + padding: 0; + list-style: none; + overflow-x: hidden; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a, +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a, +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a { + display: block; + white-space: nowrap; + /* Prevent text from breaking */ + border-bottom: 1px solid #f4f4f4; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a:hover, +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:hover, +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a:hover { + background: #f4f4f4; + text-decoration: none; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a { + color: #444444; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + padding: 10px; +} +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .glyphicon, +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .fa, +.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .ion { + width: 20px; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a { + margin: 0; + padding: 10px 10px; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > div > img { + margin: auto 10px auto auto; + width: 40px; + height: 40px; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 { + padding: 0; + margin: 0 0 0 45px; + color: #444444; + font-size: 15px; + position: relative; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 > small { + color: #999999; + font-size: 10px; + position: absolute; + top: 0; + right: 0; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > p { + margin: 0 0 0 45px; + font-size: 12px; + color: #888888; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:before, +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after { + content: " "; + display: table; +} +.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after { + clear: both; +} +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a { + padding: 10px; +} +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > h3 { + font-size: 14px; + padding: 0; + margin: 0 0 10px 0; + color: #666666; +} +.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > .progress { + padding: 0; + margin: 0; +} +.navbar-nav > .user-menu > .dropdown-menu { + border-top-right-radius: 0; + border-top-left-radius: 0; + padding: 1px 0 0 0; + border-top-width: 0; + width: 280px; +} +.navbar-nav > .user-menu > .dropdown-menu, +.navbar-nav > .user-menu > .dropdown-menu > .user-body { + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.navbar-nav > .user-menu > .dropdown-menu > li.user-header { + height: 175px; + padding: 10px; + text-align: center; +} +.navbar-nav > .user-menu > .dropdown-menu > li.user-header > img { + z-index: 5; + height: 90px; + width: 90px; + border: 3px solid; + border-color: transparent; + border-color: rgba(255, 255, 255, 0.2); +} +.navbar-nav > .user-menu > .dropdown-menu > li.user-header > p { + z-index: 5; + color: #fff; + color: rgba(255, 255, 255, 0.8); + font-size: 17px; + margin-top: 10px; +} +.navbar-nav > .user-menu > .dropdown-menu > li.user-header > p > small { + display: block; + font-size: 12px; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-body { + padding: 15px; + border-bottom: 1px solid #f4f4f4; + border-top: 1px solid #dddddd; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-body:before, +.navbar-nav > .user-menu > .dropdown-menu > .user-body:after { + content: " "; + display: table; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-body:after { + clear: both; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-body a { + color: #444 !important; +} +@media (max-width: 991px) { + .navbar-nav > .user-menu > .dropdown-menu > .user-body a { + background: #fff !important; + color: #444 !important; + } +} +.navbar-nav > .user-menu > .dropdown-menu > .user-footer { + background-color: #f9f9f9; + padding: 10px; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-footer:before, +.navbar-nav > .user-menu > .dropdown-menu > .user-footer:after { + content: " "; + display: table; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-footer:after { + clear: both; +} +.navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default { + color: #666666; +} +@media (max-width: 991px) { + .navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default:hover { + background-color: #f9f9f9; + } +} +.navbar-nav > .user-menu .user-image { + float: left; + width: 25px; + height: 25px; + border-radius: 50%; + margin-right: 10px; + margin-top: -2px; +} +@media (max-width: 767px) { + .navbar-nav > .user-menu .user-image { + float: none; + margin-right: 0; + margin-top: -8px; + line-height: 10px; + } +} +/* Add fade animation to dropdown menus by appending + the class .animated-dropdown-menu to the .dropdown-menu ul (or ol)*/ +.open:not(.dropup) > .animated-dropdown-menu { + backface-visibility: visible !important; + -webkit-animation: flipInX 0.7s both; + -o-animation: flipInX 0.7s both; + animation: flipInX 0.7s both; +} +@keyframes flipInX { + 0% { + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transition-timing-function: ease-in; + opacity: 0; + } + 40% { + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transition-timing-function: ease-in; + } + 60% { + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + 80% { + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + 100% { + transform: perspective(400px); + } +} +@-webkit-keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-transition-timing-function: ease-in; + opacity: 0; + } + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-transition-timing-function: ease-in; + } + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + 100% { + -webkit-transform: perspective(400px); + } +} +/* Fix dropdown menu in navbars */ +.navbar-custom-menu > .navbar-nav > li { + position: relative; +} +.navbar-custom-menu > .navbar-nav > li > .dropdown-menu { + position: absolute; + right: 0; + left: auto; +} +@media (max-width: 991px) { + .navbar-custom-menu > .navbar-nav { + float: right; + } + .navbar-custom-menu > .navbar-nav > li { + position: static; + } + .navbar-custom-menu > .navbar-nav > li > .dropdown-menu { + position: absolute; + right: 5%; + left: auto; + border: 1px solid #ddd; + background: #fff; + } +} +/* + * Component: Form + * --------------- + */ +.form-control { + border-radius: 0; + box-shadow: none; + border-color: #d2d6de; +} +.form-control:focus { + border-color: #3c8dbc; + box-shadow: none; +} +.form-control::-moz-placeholder, +.form-control:-ms-input-placeholder, +.form-control::-webkit-input-placeholder { + color: #bbb; + opacity: 1; +} +.form-control:not(select) { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +.form-group.has-success label { + color: #00a65a; +} +.form-group.has-success .form-control { + border-color: #00a65a; + box-shadow: none; +} +.form-group.has-warning label { + color: #f39c12; +} +.form-group.has-warning .form-control { + border-color: #f39c12; + box-shadow: none; +} +.form-group.has-error label { + color: #dd4b39; +} +.form-group.has-error .form-control { + border-color: #dd4b39; + box-shadow: none; +} +/* Input group */ +.input-group .input-group-addon { + border-radius: 0; + border-color: #d2d6de; + background-color: #fff; +} +/* button groups */ +.btn-group-vertical .btn.btn-flat:first-of-type, +.btn-group-vertical .btn.btn-flat:last-of-type { + border-radius: 0; +} +.icheck > label { + padding-left: 0; +} +/* support Font Awesome icons in form-control */ +.form-control-feedback.fa { + line-height: 34px; +} +.input-lg + .form-control-feedback.fa, +.input-group-lg + .form-control-feedback.fa, +.form-group-lg .form-control + .form-control-feedback.fa { + line-height: 46px; +} +.input-sm + .form-control-feedback.fa, +.input-group-sm + .form-control-feedback.fa, +.form-group-sm .form-control + .form-control-feedback.fa { + line-height: 30px; +} +/* + * Component: Progress Bar + * ----------------------- + */ +.progress, +.progress > .progress-bar { + -webkit-box-shadow: none; + box-shadow: none; +} +.progress, +.progress > .progress-bar, +.progress .progress-bar, +.progress > .progress-bar .progress-bar { + border-radius: 1px; +} +/* size variation */ +.progress.sm, +.progress-sm { + height: 10px; +} +.progress.sm, +.progress-sm, +.progress.sm .progress-bar, +.progress-sm .progress-bar { + border-radius: 1px; +} +.progress.xs, +.progress-xs { + height: 7px; +} +.progress.xs, +.progress-xs, +.progress.xs .progress-bar, +.progress-xs .progress-bar { + border-radius: 1px; +} +.progress.xxs, +.progress-xxs { + height: 3px; +} +.progress.xxs, +.progress-xxs, +.progress.xxs .progress-bar, +.progress-xxs .progress-bar { + border-radius: 1px; +} +/* Vertical bars */ +.progress.vertical { + position: relative; + width: 30px; + height: 200px; + display: inline-block; + margin-right: 10px; +} +.progress.vertical > .progress-bar { + width: 100%; + position: absolute; + bottom: 0; +} +.progress.vertical.sm, +.progress.vertical.progress-sm { + width: 20px; +} +.progress.vertical.xs, +.progress.vertical.progress-xs { + width: 10px; +} +.progress.vertical.xxs, +.progress.vertical.progress-xxs { + width: 3px; +} +.progress-group .progress-text { + font-weight: 600; +} +.progress-group .progress-number { + float: right; +} +/* Remove margins from progress bars when put in a table */ +.table tr > td .progress { + margin: 0; +} +.progress-bar-light-blue, +.progress-bar-primary { + background-color: #3c8dbc; +} +.progress-striped .progress-bar-light-blue, +.progress-striped .progress-bar-primary { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-green, +.progress-bar-success { + background-color: #00a65a; +} +.progress-striped .progress-bar-green, +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-aqua, +.progress-bar-info { + background-color: #00c0ef; +} +.progress-striped .progress-bar-aqua, +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-yellow, +.progress-bar-warning { + background-color: #f39c12; +} +.progress-striped .progress-bar-yellow, +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-bar-red, +.progress-bar-danger { + background-color: #dd4b39; +} +.progress-striped .progress-bar-red, +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +/* + * Component: Small Box + * -------------------- + */ +.small-box { + border-radius: 2px; + position: relative; + display: block; + margin-bottom: 20px; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} +.small-box > .inner { + padding: 10px; +} +.small-box > .small-box-footer { + position: relative; + text-align: center; + padding: 3px 0; + color: #fff; + color: rgba(255, 255, 255, 0.8); + display: block; + z-index: 10; + background: rgba(0, 0, 0, 0.1); + text-decoration: none; +} +.small-box > .small-box-footer:hover { + color: #fff; + background: rgba(0, 0, 0, 0.15); +} +.small-box h3 { + font-size: 38px; + font-weight: bold; + margin: 0 0 10px 0; + white-space: nowrap; + padding: 0; +} +.small-box p { + font-size: 15px; +} +.small-box p > small { + display: block; + color: #f9f9f9; + font-size: 13px; + margin-top: 5px; +} +.small-box h3, +.small-box p { + z-index: 5px; +} +.small-box .icon { + -webkit-transition: all 0.3s linear; + -o-transition: all 0.3s linear; + transition: all 0.3s linear; + position: absolute; + top: -10px; + right: 10px; + z-index: 0; + font-size: 90px; + color: rgba(0, 0, 0, 0.15); +} +.small-box:hover { + text-decoration: none; + color: #f9f9f9; +} +.small-box:hover .icon { + font-size: 95px; +} +@media (max-width: 767px) { + .small-box { + text-align: center; + } + .small-box .icon { + display: none; + } + .small-box p { + font-size: 12px; + } +} +/* + * Component: Box + * -------------- + */ +.box { + position: relative; + border-radius: 3px; + background: #ffffff; + border-top: 3px solid #d2d6de; + margin-bottom: 20px; + width: 100%; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); +} +.box.box-primary { + border-top-color: #3c8dbc; +} +.box.box-info { + border-top-color: #00c0ef; +} +.box.box-danger { + border-top-color: #dd4b39; +} +.box.box-warning { + border-top-color: #f39c12; +} +.box.box-success { + border-top-color: #00a65a; +} +.box.box-default { + border-top-color: #d2d6de; +} +.box.collapsed-box .box-body, +.box.collapsed-box .box-footer { + display: none; +} +.box .nav-stacked > li { + border-bottom: 1px solid #f4f4f4; + margin: 0; +} +.box .nav-stacked > li:last-of-type { + border-bottom: none; +} +.box.height-control .box-body { + max-height: 300px; + overflow: auto; +} +.box .border-right { + border-right: 1px solid #f4f4f4; +} +.box .border-left { + border-left: 1px solid #f4f4f4; +} +.box.box-solid { + border-top: 0; +} +.box.box-solid > .box-header .btn.btn-default { + background: transparent; +} +.box.box-solid > .box-header .btn:hover, +.box.box-solid > .box-header a:hover { + background: rgba(0, 0, 0, 0.1); +} +.box.box-solid.box-default { + border: 1px solid #d2d6de; +} +.box.box-solid.box-default > .box-header { + color: #444444; + background: #d2d6de; + background-color: #d2d6de; +} +.box.box-solid.box-default > .box-header a, +.box.box-solid.box-default > .box-header .btn { + color: #444444; +} +.box.box-solid.box-primary { + border: 1px solid #3c8dbc; +} +.box.box-solid.box-primary > .box-header { + color: #ffffff; + background: #3c8dbc; + background-color: #3c8dbc; +} +.box.box-solid.box-primary > .box-header a, +.box.box-solid.box-primary > .box-header .btn { + color: #ffffff; +} +.box.box-solid.box-info { + border: 1px solid #00c0ef; +} +.box.box-solid.box-info > .box-header { + color: #ffffff; + background: #00c0ef; + background-color: #00c0ef; +} +.box.box-solid.box-info > .box-header a, +.box.box-solid.box-info > .box-header .btn { + color: #ffffff; +} +.box.box-solid.box-danger { + border: 1px solid #dd4b39; +} +.box.box-solid.box-danger > .box-header { + color: #ffffff; + background: #dd4b39; + background-color: #dd4b39; +} +.box.box-solid.box-danger > .box-header a, +.box.box-solid.box-danger > .box-header .btn { + color: #ffffff; +} +.box.box-solid.box-warning { + border: 1px solid #f39c12; +} +.box.box-solid.box-warning > .box-header { + color: #ffffff; + background: #f39c12; + background-color: #f39c12; +} +.box.box-solid.box-warning > .box-header a, +.box.box-solid.box-warning > .box-header .btn { + color: #ffffff; +} +.box.box-solid.box-success { + border: 1px solid #00a65a; +} +.box.box-solid.box-success > .box-header { + color: #ffffff; + background: #00a65a; + background-color: #00a65a; +} +.box.box-solid.box-success > .box-header a, +.box.box-solid.box-success > .box-header .btn { + color: #ffffff; +} +.box.box-solid > .box-header > .box-tools .btn { + border: 0; + box-shadow: none; +} +.box.box-solid[class*='bg'] > .box-header { + color: #fff; +} +.box .box-group > .box { + margin-bottom: 5px; +} +.box .knob-label { + text-align: center; + color: #333; + font-weight: 100; + font-size: 12px; + margin-bottom: 0.3em; +} +.box > .overlay, +.overlay-wrapper > .overlay, +.box > .loading-img, +.overlay-wrapper > .loading-img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.box .overlay, +.overlay-wrapper .overlay { + z-index: 50; + background: rgba(255, 255, 255, 0.7); + border-radius: 3px; +} +.box .overlay > .fa, +.overlay-wrapper .overlay > .fa { + position: absolute; + top: 50%; + left: 50%; + margin-left: -15px; + margin-top: -15px; + color: #000; + font-size: 30px; +} +.box .overlay.dark, +.overlay-wrapper .overlay.dark { + background: rgba(0, 0, 0, 0.5); +} +.box-header:before, +.box-body:before, +.box-footer:before, +.box-header:after, +.box-body:after, +.box-footer:after { + content: " "; + display: table; +} +.box-header:after, +.box-body:after, +.box-footer:after { + clear: both; +} +.box-header { + color: #444; + display: block; + padding: 10px; + position: relative; +} +.box-header.with-border { + border-bottom: 1px solid #f4f4f4; +} +.collapsed-box .box-header.with-border { + border-bottom: none; +} +.box-header > .fa, +.box-header > .glyphicon, +.box-header > .ion, +.box-header .box-title { + display: inline-block; + font-size: 18px; + margin: 0; + line-height: 1; +} +.box-header > .fa, +.box-header > .glyphicon, +.box-header > .ion { + margin-right: 5px; +} +.box-header > .box-tools { + position: absolute; + right: 10px; + top: 5px; +} +.box-header > .box-tools [data-toggle="tooltip"] { + position: relative; +} +.box-header > .box-tools.pull-right .dropdown-menu { + right: 0; + left: auto; +} +.btn-box-tool { + padding: 5px; + font-size: 12px; + background: transparent; + color: #97a0b3; +} +.open .btn-box-tool, +.btn-box-tool:hover { + color: #606c84; +} +.btn-box-tool.btn:active { + box-shadow: none; +} +.box-body { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + padding: 10px; +} +.no-header .box-body { + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.box-body > .table { + margin-bottom: 0; +} +.box-body .fc { + margin-top: 5px; +} +.box-body .full-width-chart { + margin: -19px; +} +.box-body.no-padding .full-width-chart { + margin: -9px; +} +.box-body .box-pane { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 3px; +} +.box-body .box-pane-right { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 0; +} +.box-footer { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + border-top: 1px solid #f4f4f4; + padding: 10px; + background-color: #ffffff; +} +.chart-legend { + margin: 10px 0; +} +@media (max-width: 991px) { + .chart-legend > li { + float: left; + margin-right: 10px; + } +} +.box-comments { + background: #f7f7f7; +} +.box-comments .box-comment { + padding: 8px 0; + border-bottom: 1px solid #eee; +} +.box-comments .box-comment:before, +.box-comments .box-comment:after { + content: " "; + display: table; +} +.box-comments .box-comment:after { + clear: both; +} +.box-comments .box-comment:last-of-type { + border-bottom: 0; +} +.box-comments .box-comment:first-of-type { + padding-top: 0; +} +.box-comments .box-comment img { + float: left; +} +.box-comments .comment-text { + margin-left: 40px; + color: #555; +} +.box-comments .username { + color: #444; + display: block; + font-weight: 600; +} +.box-comments .text-muted { + font-weight: 400; + font-size: 12px; +} +/* Widget: TODO LIST */ +.todo-list { + margin: 0; + padding: 0; + list-style: none; + overflow: auto; +} +.todo-list > li { + border-radius: 2px; + padding: 10px; + background: #f4f4f4; + margin-bottom: 2px; + border-left: 2px solid #e6e7e8; + color: #444; +} +.todo-list > li:last-of-type { + margin-bottom: 0; +} +.todo-list > li > input[type='checkbox'] { + margin: 0 10px 0 5px; +} +.todo-list > li .text { + display: inline-block; + margin-left: 5px; + font-weight: 600; +} +.todo-list > li .label { + margin-left: 10px; + font-size: 9px; +} +.todo-list > li .tools { + display: none; + float: right; + color: #dd4b39; +} +.todo-list > li .tools > .fa, +.todo-list > li .tools > .glyphicon, +.todo-list > li .tools > .ion { + margin-right: 5px; + cursor: pointer; +} +.todo-list > li:hover .tools { + display: inline-block; +} +.todo-list > li.done { + color: #999; +} +.todo-list > li.done .text { + text-decoration: line-through; + font-weight: 500; +} +.todo-list > li.done .label { + background: #d2d6de !important; +} +.todo-list .danger { + border-left-color: #dd4b39; +} +.todo-list .warning { + border-left-color: #f39c12; +} +.todo-list .info { + border-left-color: #00c0ef; +} +.todo-list .success { + border-left-color: #00a65a; +} +.todo-list .primary { + border-left-color: #3c8dbc; +} +.todo-list .handle { + display: inline-block; + cursor: move; + margin: 0 5px; +} +/* Chat widget (DEPRECATED - this will be removed in the next major release. Use Direct Chat instead)*/ +.chat { + padding: 5px 20px 5px 10px; +} +.chat .item { + margin-bottom: 10px; +} +.chat .item:before, +.chat .item:after { + content: " "; + display: table; +} +.chat .item:after { + clear: both; +} +.chat .item > img { + width: 40px; + height: 40px; + border: 2px solid transparent; + border-radius: 50%; +} +.chat .item > .online { + border: 2px solid #00a65a; +} +.chat .item > .offline { + border: 2px solid #dd4b39; +} +.chat .item > .message { + margin-left: 55px; + margin-top: -40px; +} +.chat .item > .message > .name { + display: block; + font-weight: 600; +} +.chat .item > .attachment { + border-radius: 3px; + background: #f4f4f4; + margin-left: 65px; + margin-right: 15px; + padding: 10px; +} +.chat .item > .attachment > h4 { + margin: 0 0 5px 0; + font-weight: 600; + font-size: 14px; +} +.chat .item > .attachment > p, +.chat .item > .attachment > .filename { + font-weight: 600; + font-size: 13px; + font-style: italic; + margin: 0; +} +.chat .item > .attachment:before, +.chat .item > .attachment:after { + content: " "; + display: table; +} +.chat .item > .attachment:after { + clear: both; +} +.box-input { + max-width: 200px; +} +.modal .panel-body { + color: #444; +} +/* + * Component: Info Box + * ------------------- + */ +.info-box { + display: block; + min-height: 90px; + background: #fff; + width: 100%; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + border-radius: 2px; + margin-bottom: 15px; +} +.info-box small { + font-size: 14px; +} +.info-box .progress { + background: rgba(0, 0, 0, 0.2); + margin: 5px -10px 5px -10px; + height: 2px; +} +.info-box .progress, +.info-box .progress .progress-bar { + border-radius: 0; +} +.info-box .progress .progress-bar { + background: #fff; +} +.info-box-icon { + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; + display: block; + float: left; + height: 90px; + width: 90px; + text-align: center; + font-size: 45px; + line-height: 90px; + background: rgba(0, 0, 0, 0.2); +} +.info-box-icon > img { + max-width: 100%; +} +.info-box-content { + padding: 5px 10px; + margin-left: 90px; +} +.info-box-number { + display: block; + font-weight: bold; + font-size: 18px; +} +.progress-description, +.info-box-text { + display: block; + font-size: 14px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.info-box-text { + text-transform: uppercase; +} +.info-box-more { + display: block; +} +.progress-description { + margin: 0; +} +/* + * Component: Timeline + * ------------------- + */ +.timeline { + position: relative; + margin: 0 0 30px 0; + padding: 0; + list-style: none; +} +.timeline:before { + content: ''; + position: absolute; + top: 0; + bottom: 0; + width: 4px; + background: #ddd; + left: 31px; + margin: 0; + border-radius: 2px; +} +.timeline > li { + position: relative; + margin-right: 10px; + margin-bottom: 15px; +} +.timeline > li:before, +.timeline > li:after { + content: " "; + display: table; +} +.timeline > li:after { + clear: both; +} +.timeline > li > .timeline-item { + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + border-radius: 3px; + margin-top: 0; + background: #fff; + color: #444; + margin-left: 60px; + margin-right: 15px; + padding: 0; + position: relative; +} +.timeline > li > .timeline-item > .time { + color: #999; + float: right; + padding: 10px; + font-size: 12px; +} +.timeline > li > .timeline-item > .timeline-header { + margin: 0; + color: #555; + border-bottom: 1px solid #f4f4f4; + padding: 10px; + font-size: 16px; + line-height: 1.1; +} +.timeline > li > .timeline-item > .timeline-header > a { + font-weight: 600; +} +.timeline > li > .timeline-item > .timeline-body, +.timeline > li > .timeline-item > .timeline-footer { + padding: 10px; +} +.timeline > li > .fa, +.timeline > li > .glyphicon, +.timeline > li > .ion { + width: 30px; + height: 30px; + font-size: 15px; + line-height: 30px; + position: absolute; + color: #666; + background: #d2d6de; + border-radius: 50%; + text-align: center; + left: 18px; + top: 0; +} +.timeline > .time-label > span { + font-weight: 600; + padding: 5px; + display: inline-block; + background-color: #fff; + border-radius: 4px; +} +.timeline-inverse > li > .timeline-item { + background: #f0f0f0; + border: 1px solid #ddd; + -webkit-box-shadow: none; + box-shadow: none; +} +.timeline-inverse > li > .timeline-item > .timeline-header { + border-bottom-color: #ddd; +} +/* + * Component: Button + * ----------------- + */ +.btn { + border-radius: 3px; + -webkit-box-shadow: none; + box-shadow: none; + border: 1px solid transparent; +} +.btn.uppercase { + text-transform: uppercase; +} +.btn.btn-flat { + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + border-width: 1px; +} +.btn:active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn:focus { + outline: none; +} +.btn.btn-file { + position: relative; + overflow: hidden; +} +.btn.btn-file > input[type='file'] { + position: absolute; + top: 0; + right: 0; + min-width: 100%; + min-height: 100%; + font-size: 100px; + text-align: right; + opacity: 0; + filter: alpha(opacity=0); + outline: none; + background: white; + cursor: inherit; + display: block; +} +.btn-default { + background-color: #f4f4f4; + color: #444; + border-color: #ddd; +} +.btn-default:hover, +.btn-default:active, +.btn-default.hover { + background-color: #e7e7e7; +} +.btn-primary { + background-color: #3c8dbc; + border-color: #367fa9; +} +.btn-primary:hover, +.btn-primary:active, +.btn-primary.hover { + background-color: #367fa9; +} +.btn-success { + background-color: #00a65a; + border-color: #008d4c; +} +.btn-success:hover, +.btn-success:active, +.btn-success.hover { + background-color: #008d4c; +} +.btn-info { + background-color: #00c0ef; + border-color: #00acd6; +} +.btn-info:hover, +.btn-info:active, +.btn-info.hover { + background-color: #00acd6; +} +.btn-danger { + background-color: #dd4b39; + border-color: #d73925; +} +.btn-danger:hover, +.btn-danger:active, +.btn-danger.hover { + background-color: #d73925; +} +.btn-warning { + background-color: #f39c12; + border-color: #e08e0b; +} +.btn-warning:hover, +.btn-warning:active, +.btn-warning.hover { + background-color: #e08e0b; +} +.btn-outline { + border: 1px solid #fff; + background: transparent; + color: #fff; +} +.btn-outline:hover, +.btn-outline:focus, +.btn-outline:active { + color: rgba(255, 255, 255, 0.7); + border-color: rgba(255, 255, 255, 0.7); +} +.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn[class*='bg-']:hover { + -webkit-box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2); + box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2); +} +.btn-app { + border-radius: 3px; + position: relative; + padding: 15px 5px; + margin: 0 0 10px 10px; + min-width: 80px; + height: 60px; + text-align: center; + color: #666; + border: 1px solid #ddd; + background-color: #f4f4f4; + font-size: 12px; +} +.btn-app > .fa, +.btn-app > .glyphicon, +.btn-app > .ion { + font-size: 20px; + display: block; +} +.btn-app:hover { + background: #f4f4f4; + color: #444; + border-color: #aaa; +} +.btn-app:active, +.btn-app:focus { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-app > .badge { + position: absolute; + top: -3px; + right: -10px; + font-size: 10px; + font-weight: 400; +} +/* + * Component: Callout + * ------------------ + */ +.callout { + border-radius: 3px; + margin: 0 0 20px 0; + padding: 15px 30px 15px 15px; + border-left: 5px solid #eee; +} +.callout a { + color: #fff; + text-decoration: underline; +} +.callout a:hover { + color: #eee; +} +.callout h4 { + margin-top: 0; + font-weight: 600; +} +.callout p:last-child { + margin-bottom: 0; +} +.callout code, +.callout .highlight { + background-color: #fff; +} +.callout.callout-danger { + border-color: #c23321; +} +.callout.callout-warning { + border-color: #c87f0a; +} +.callout.callout-info { + border-color: #0097bc; +} +.callout.callout-success { + border-color: #00733e; +} +/* + * Component: alert + * ---------------- + */ +.alert { + border-radius: 3px; +} +.alert h4 { + font-weight: 600; +} +.alert .icon { + margin-right: 10px; +} +.alert .close { + color: #000; + opacity: 0.2; + filter: alpha(opacity=20); +} +.alert .close:hover { + opacity: 0.5; + filter: alpha(opacity=50); +} +.alert a { + color: #fff; + text-decoration: underline; +} +.alert-success { + border-color: #008d4c; +} +.alert-danger, +.alert-error { + border-color: #d73925; +} +.alert-warning { + border-color: #e08e0b; +} +.alert-info { + border-color: #00acd6; +} +/* + * Component: Nav + * -------------- + */ +.nav > li > a:hover, +.nav > li > a:active, +.nav > li > a:focus { + color: #444; + background: #f7f7f7; +} +/* NAV PILLS */ +.nav-pills > li > a { + border-radius: 0; + border-top: 3px solid transparent; + color: #444; +} +.nav-pills > li > a > .fa, +.nav-pills > li > a > .glyphicon, +.nav-pills > li > a > .ion { + margin-right: 5px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + border-top-color: #3c8dbc; +} +.nav-pills > li.active > a { + font-weight: 600; +} +/* NAV STACKED */ +.nav-stacked > li > a { + border-radius: 0; + border-top: 0; + border-left: 3px solid transparent; + color: #444; +} +.nav-stacked > li.active > a, +.nav-stacked > li.active > a:hover { + background: transparent; + color: #444; + border-top: 0; + border-left-color: #3c8dbc; +} +.nav-stacked > li.header { + border-bottom: 1px solid #ddd; + color: #777; + margin-bottom: 10px; + padding: 5px 10px; + text-transform: uppercase; +} +/* NAV TABS */ +.nav-tabs-custom { + margin-bottom: 20px; + background: #fff; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + border-radius: 3px; +} +.nav-tabs-custom > .nav-tabs { + margin: 0; + border-bottom-color: #f4f4f4; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.nav-tabs-custom > .nav-tabs > li { + border-top: 3px solid transparent; + margin-bottom: -2px; + margin-right: 5px; +} +.nav-tabs-custom > .nav-tabs > li > a { + color: #444; + border-radius: 0; +} +.nav-tabs-custom > .nav-tabs > li > a.text-muted { + color: #999; +} +.nav-tabs-custom > .nav-tabs > li > a, +.nav-tabs-custom > .nav-tabs > li > a:hover { + background: transparent; + margin: 0; +} +.nav-tabs-custom > .nav-tabs > li > a:hover { + color: #999; +} +.nav-tabs-custom > .nav-tabs > li:not(.active) > a:hover, +.nav-tabs-custom > .nav-tabs > li:not(.active) > a:focus, +.nav-tabs-custom > .nav-tabs > li:not(.active) > a:active { + border-color: transparent; +} +.nav-tabs-custom > .nav-tabs > li.active { + border-top-color: #3c8dbc; +} +.nav-tabs-custom > .nav-tabs > li.active > a, +.nav-tabs-custom > .nav-tabs > li.active:hover > a { + background-color: #fff; + color: #444; +} +.nav-tabs-custom > .nav-tabs > li.active > a { + border-top-color: transparent; + border-left-color: #f4f4f4; + border-right-color: #f4f4f4; +} +.nav-tabs-custom > .nav-tabs > li:first-of-type { + margin-left: 0; +} +.nav-tabs-custom > .nav-tabs > li:first-of-type.active > a { + border-left-color: transparent; +} +.nav-tabs-custom > .nav-tabs.pull-right { + float: none!important; +} +.nav-tabs-custom > .nav-tabs.pull-right > li { + float: right; +} +.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type { + margin-right: 0; +} +.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type > a { + border-left-width: 1px; +} +.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type.active > a { + border-left-color: #f4f4f4; + border-right-color: transparent; +} +.nav-tabs-custom > .nav-tabs > li.header { + line-height: 35px; + padding: 0 10px; + font-size: 20px; + color: #444; +} +.nav-tabs-custom > .nav-tabs > li.header > .fa, +.nav-tabs-custom > .nav-tabs > li.header > .glyphicon, +.nav-tabs-custom > .nav-tabs > li.header > .ion { + margin-right: 5px; +} +.nav-tabs-custom > .tab-content { + background: #fff; + padding: 10px; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.nav-tabs-custom .dropdown.open > a:active, +.nav-tabs-custom .dropdown.open > a:focus { + background: transparent; + color: #999; +} +/* PAGINATION */ +.pagination > li > a { + background: #fafafa; + color: #666; +} +.pagination.pagination-flat > li > a { + border-radius: 0 !important; +} +/* + * Component: Products List + * ------------------------ + */ +.products-list { + list-style: none; + margin: 0; + padding: 0; +} +.products-list > .item { + border-radius: 3px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + padding: 10px 0; + background: #fff; +} +.products-list > .item:before, +.products-list > .item:after { + content: " "; + display: table; +} +.products-list > .item:after { + clear: both; +} +.products-list .product-img { + float: left; +} +.products-list .product-img img { + width: 50px; + height: 50px; +} +.products-list .product-info { + margin-left: 60px; +} +.products-list .product-title { + font-weight: 600; +} +.products-list .product-description { + display: block; + color: #999; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.product-list-in-box > .item { + -webkit-box-shadow: none; + box-shadow: none; + border-radius: 0; + border-bottom: 1px solid #f4f4f4; +} +.product-list-in-box > .item:last-of-type { + border-bottom-width: 0; +} +/* + * Component: Table + * ---------------- + */ +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + border-top: 1px solid #f4f4f4; +} +.table > thead > tr > th { + border-bottom: 2px solid #f4f4f4; +} +.table tr td .progress { + margin-top: 5px; +} +.table-bordered { + border: 1px solid #f4f4f4; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #f4f4f4; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table.no-border, +.table.no-border td, +.table.no-border th { + border: 0; +} +/* .text-center in tables */ +table.text-center, +table.text-center td, +table.text-center th { + text-align: center; +} +.table.align th { + text-align: left; +} +.table.align td { + text-align: right; +} +/* + * Component: Label + * ---------------- + */ +.label-default { + background-color: #d2d6de; + color: #444; +} +/* + * Component: Direct Chat + * ---------------------- + */ +.direct-chat .box-body { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + position: relative; + overflow-x: hidden; + padding: 0; +} +.direct-chat.chat-pane-open .direct-chat-contacts { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.direct-chat-messages { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); + padding: 10px; + height: 250px; + overflow: auto; +} +.direct-chat-msg, +.direct-chat-text { + display: block; +} +.direct-chat-msg { + margin-bottom: 10px; +} +.direct-chat-msg:before, +.direct-chat-msg:after { + content: " "; + display: table; +} +.direct-chat-msg:after { + clear: both; +} +.direct-chat-messages, +.direct-chat-contacts { + -webkit-transition: -webkit-transform 0.5s ease-in-out; + -moz-transition: -moz-transform 0.5s ease-in-out; + -o-transition: -o-transform 0.5s ease-in-out; + transition: transform 0.5s ease-in-out; +} +.direct-chat-text { + border-radius: 5px; + position: relative; + padding: 5px 10px; + background: #d2d6de; + border: 1px solid #d2d6de; + margin: 5px 0 0 50px; + color: #444444; +} +.direct-chat-text:after, +.direct-chat-text:before { + position: absolute; + right: 100%; + top: 15px; + border: solid transparent; + border-right-color: #d2d6de; + content: ' '; + height: 0; + width: 0; + pointer-events: none; +} +.direct-chat-text:after { + border-width: 5px; + margin-top: -5px; +} +.direct-chat-text:before { + border-width: 6px; + margin-top: -6px; +} +.right .direct-chat-text { + margin-right: 50px; + margin-left: 0; +} +.right .direct-chat-text:after, +.right .direct-chat-text:before { + right: auto; + left: 100%; + border-right-color: transparent; + border-left-color: #d2d6de; +} +.direct-chat-img { + border-radius: 50%; + float: left; + width: 40px; + height: 40px; +} +.right .direct-chat-img { + float: right; +} +.direct-chat-info { + display: block; + margin-bottom: 2px; + font-size: 12px; +} +.direct-chat-name { + font-weight: 600; +} +.direct-chat-timestamp { + color: #999; +} +.direct-chat-contacts-open .direct-chat-contacts { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.direct-chat-contacts { + -webkit-transform: translate(101%, 0); + -ms-transform: translate(101%, 0); + -o-transform: translate(101%, 0); + transform: translate(101%, 0); + position: absolute; + top: 0; + bottom: 0; + height: 250px; + width: 100%; + background: #222d32; + color: #fff; + overflow: auto; +} +.contacts-list > li { + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + padding: 10px; + margin: 0; +} +.contacts-list > li:before, +.contacts-list > li:after { + content: " "; + display: table; +} +.contacts-list > li:after { + clear: both; +} +.contacts-list > li:last-of-type { + border-bottom: none; +} +.contacts-list-img { + border-radius: 50%; + width: 40px; + float: left; +} +.contacts-list-info { + margin-left: 45px; + color: #fff; +} +.contacts-list-name, +.contacts-list-status { + display: block; +} +.contacts-list-name { + font-weight: 600; +} +.contacts-list-status { + font-size: 12px; +} +.contacts-list-date { + color: #aaa; + font-weight: normal; +} +.contacts-list-msg { + color: #999; +} +.direct-chat-danger .right > .direct-chat-text { + background: #dd4b39; + border-color: #dd4b39; + color: #ffffff; +} +.direct-chat-danger .right > .direct-chat-text:after, +.direct-chat-danger .right > .direct-chat-text:before { + border-left-color: #dd4b39; +} +.direct-chat-primary .right > .direct-chat-text { + background: #3c8dbc; + border-color: #3c8dbc; + color: #ffffff; +} +.direct-chat-primary .right > .direct-chat-text:after, +.direct-chat-primary .right > .direct-chat-text:before { + border-left-color: #3c8dbc; +} +.direct-chat-warning .right > .direct-chat-text { + background: #f39c12; + border-color: #f39c12; + color: #ffffff; +} +.direct-chat-warning .right > .direct-chat-text:after, +.direct-chat-warning .right > .direct-chat-text:before { + border-left-color: #f39c12; +} +.direct-chat-info .right > .direct-chat-text { + background: #00c0ef; + border-color: #00c0ef; + color: #ffffff; +} +.direct-chat-info .right > .direct-chat-text:after, +.direct-chat-info .right > .direct-chat-text:before { + border-left-color: #00c0ef; +} +.direct-chat-success .right > .direct-chat-text { + background: #00a65a; + border-color: #00a65a; + color: #ffffff; +} +.direct-chat-success .right > .direct-chat-text:after, +.direct-chat-success .right > .direct-chat-text:before { + border-left-color: #00a65a; +} +/* + * Component: Users List + * --------------------- + */ +.users-list > li { + width: 25%; + float: left; + padding: 10px; + text-align: center; +} +.users-list > li img { + border-radius: 50%; + max-width: 100%; + height: auto; +} +.users-list > li > a:hover, +.users-list > li > a:hover .users-list-name { + color: #999; +} +.users-list-name, +.users-list-date { + display: block; +} +.users-list-name { + font-weight: 600; + color: #444; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.users-list-date { + color: #999; + font-size: 12px; +} +/* + * Component: Carousel + * ------------------- + */ +.carousel-control.left, +.carousel-control.right { + background-image: none; +} +.carousel-control > .fa { + font-size: 40px; + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -20px; +} +/* + * Component: modal + * ---------------- + */ +.modal { + background: rgba(0, 0, 0, 0.3); +} +.modal-content { + border-radius: 0; + -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); + border: 0; +} +@media (min-width: 768px) { + .modal-content { + -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125); + } +} +.modal-header { + border-bottom-color: #f4f4f4; +} +.modal-footer { + border-top-color: #f4f4f4; +} +.modal-primary .modal-header, +.modal-primary .modal-footer { + border-color: #307095; +} +.modal-warning .modal-header, +.modal-warning .modal-footer { + border-color: #c87f0a; +} +.modal-info .modal-header, +.modal-info .modal-footer { + border-color: #0097bc; +} +.modal-success .modal-header, +.modal-success .modal-footer { + border-color: #00733e; +} +.modal-danger .modal-header, +.modal-danger .modal-footer { + border-color: #c23321; +} +/* + * Component: Social Widgets + * ------------------------- + */ +.box-widget { + border: none; + position: relative; +} +.widget-user .widget-user-header { + padding: 20px; + height: 120px; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.widget-user .widget-user-username { + margin-top: 0; + margin-bottom: 5px; + font-size: 25px; + font-weight: 300; + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2); +} +.widget-user .widget-user-desc { + margin-top: 0; +} +.widget-user .widget-user-image { + position: absolute; + top: 65px; + left: 50%; + margin-left: -45px; +} +.widget-user .widget-user-image > img { + width: 90px; + height: auto; + border: 3px solid #fff; +} +.widget-user .box-footer { + padding-top: 30px; +} +.widget-user-2 .widget-user-header { + padding: 20px; + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.widget-user-2 .widget-user-username { + margin-top: 5px; + margin-bottom: 5px; + font-size: 25px; + font-weight: 300; +} +.widget-user-2 .widget-user-desc { + margin-top: 0; +} +.widget-user-2 .widget-user-username, +.widget-user-2 .widget-user-desc { + margin-left: 75px; +} +.widget-user-2 .widget-user-image > img { + width: 65px; + height: auto; + float: left; +} +/* + * Page: Mailbox + * ------------- + */ +.mailbox-messages > .table { + margin: 0; +} +.mailbox-controls { + padding: 5px; +} +.mailbox-controls.with-border { + border-bottom: 1px solid #f4f4f4; +} +.mailbox-read-info { + border-bottom: 1px solid #f4f4f4; + padding: 10px; +} +.mailbox-read-info h3 { + font-size: 20px; + margin: 0; +} +.mailbox-read-info h5 { + margin: 0; + padding: 5px 0 0 0; +} +.mailbox-read-time { + color: #999; + font-size: 13px; +} +.mailbox-read-message { + padding: 10px; +} +.mailbox-attachments li { + float: left; + width: 200px; + border: 1px solid #eee; + margin-bottom: 10px; + margin-right: 10px; +} +.mailbox-attachment-name { + font-weight: bold; + color: #666; +} +.mailbox-attachment-icon, +.mailbox-attachment-info, +.mailbox-attachment-size { + display: block; +} +.mailbox-attachment-info { + padding: 10px; + background: #f4f4f4; +} +.mailbox-attachment-size { + color: #999; + font-size: 12px; +} +.mailbox-attachment-icon { + text-align: center; + font-size: 65px; + color: #666; + padding: 20px 10px; +} +.mailbox-attachment-icon.has-img { + padding: 0; +} +.mailbox-attachment-icon.has-img > img { + max-width: 100%; + height: auto; +} +/* + * Page: Lock Screen + * ----------------- + */ +/* ADD THIS CLASS TO THE <BODY> TAG */ +.lockscreen { + background: #d2d6de; +} +.lockscreen-logo { + font-size: 35px; + text-align: center; + margin-bottom: 25px; + font-weight: 300; +} +.lockscreen-logo a { + color: #444; +} +.lockscreen-wrapper { + max-width: 400px; + margin: 0 auto; + margin-top: 10%; +} +/* User name [optional] */ +.lockscreen .lockscreen-name { + text-align: center; + font-weight: 600; +} +/* Will contain the image and the sign in form */ +.lockscreen-item { + border-radius: 4px; + padding: 0; + background: #fff; + position: relative; + margin: 10px auto 30px auto; + width: 290px; +} +/* User image */ +.lockscreen-image { + border-radius: 50%; + position: absolute; + left: -10px; + top: -25px; + background: #fff; + padding: 5px; + z-index: 10; +} +.lockscreen-image > img { + border-radius: 50%; + width: 70px; + height: 70px; +} +/* Contains the password input and the login button */ +.lockscreen-credentials { + margin-left: 70px; +} +.lockscreen-credentials .form-control { + border: 0; +} +.lockscreen-credentials .btn { + background-color: #fff; + border: 0; + padding: 0 10px; +} +.lockscreen-footer { + margin-top: 10px; +} +/* + * Page: Login & Register + * ---------------------- + */ +.login-logo, +.register-logo { + font-size: 35px; + text-align: center; + margin-bottom: 25px; + font-weight: 300; +} +.login-logo a, +.register-logo a { + color: #444; +} +.login-page, +.register-page { + background: #d2d6de; +} +.login-box, +.register-box { + width: 360px; + margin: 7% auto; +} +@media (max-width: 768px) { + .login-box, + .register-box { + width: 90%; + margin-top: 20px; + } +} +.login-box-body, +.register-box-body { + background: #fff; + padding: 20px; + border-top: 0; + color: #666; +} +.login-box-body .form-control-feedback, +.register-box-body .form-control-feedback { + color: #777; +} +.login-box-msg, +.register-box-msg { + margin: 0; + text-align: center; + padding: 0 20px 20px 20px; +} +.social-auth-links { + margin: 10px 0; +} +/* + * Page: 400 and 500 error pages + * ------------------------------ + */ +.error-page { + width: 600px; + margin: 20px auto 0 auto; +} +@media (max-width: 991px) { + .error-page { + width: 100%; + } +} +.error-page > .headline { + float: left; + font-size: 100px; + font-weight: 300; +} +@media (max-width: 991px) { + .error-page > .headline { + float: none; + text-align: center; + } +} +.error-page > .error-content { + margin-left: 190px; + display: block; +} +@media (max-width: 991px) { + .error-page > .error-content { + margin-left: 0; + } +} +.error-page > .error-content > h3 { + font-weight: 300; + font-size: 25px; +} +@media (max-width: 991px) { + .error-page > .error-content > h3 { + text-align: center; + } +} +/* + * Page: Invoice + * ------------- + */ +.invoice { + position: relative; + background: #fff; + border: 1px solid #f4f4f4; + padding: 20px; + margin: 10px 25px; +} +.invoice-title { + margin-top: 0; +} +/* + * Page: Profile + * ------------- + */ +.profile-user-img { + margin: 0 auto; + width: 100px; + padding: 3px; + border: 3px solid #d2d6de; +} +.profile-username { + font-size: 21px; + margin-top: 5px; +} +.post { + border-bottom: 1px solid #d2d6de; + margin-bottom: 15px; + padding-bottom: 15px; + color: #666; +} +.post:last-of-type { + border-bottom: 0; + margin-bottom: 0; + padding-bottom: 0; +} +.post .user-block { + margin-bottom: 15px; +} +/* + * Social Buttons for Bootstrap + * + * Copyright 2013-2015 Panayiotis Lipiridis + * Licensed under the MIT License + * + * https://github.com/lipis/bootstrap-social + */ +.btn-social { + position: relative; + padding-left: 44px; + text-align: left; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.btn-social > :first-child { + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 32px; + line-height: 34px; + font-size: 1.6em; + text-align: center; + border-right: 1px solid rgba(0, 0, 0, 0.2); +} +.btn-social.btn-lg { + padding-left: 61px; +} +.btn-social.btn-lg > :first-child { + line-height: 45px; + width: 45px; + font-size: 1.8em; +} +.btn-social.btn-sm { + padding-left: 38px; +} +.btn-social.btn-sm > :first-child { + line-height: 28px; + width: 28px; + font-size: 1.4em; +} +.btn-social.btn-xs { + padding-left: 30px; +} +.btn-social.btn-xs > :first-child { + line-height: 20px; + width: 20px; + font-size: 1.2em; +} +.btn-social-icon { + position: relative; + padding-left: 44px; + text-align: left; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + height: 34px; + width: 34px; + padding: 0; +} +.btn-social-icon > :first-child { + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 32px; + line-height: 34px; + font-size: 1.6em; + text-align: center; + border-right: 1px solid rgba(0, 0, 0, 0.2); +} +.btn-social-icon.btn-lg { + padding-left: 61px; +} +.btn-social-icon.btn-lg > :first-child { + line-height: 45px; + width: 45px; + font-size: 1.8em; +} +.btn-social-icon.btn-sm { + padding-left: 38px; +} +.btn-social-icon.btn-sm > :first-child { + line-height: 28px; + width: 28px; + font-size: 1.4em; +} +.btn-social-icon.btn-xs { + padding-left: 30px; +} +.btn-social-icon.btn-xs > :first-child { + line-height: 20px; + width: 20px; + font-size: 1.2em; +} +.btn-social-icon > :first-child { + border: none; + text-align: center; + width: 100%; +} +.btn-social-icon.btn-lg { + height: 45px; + width: 45px; + padding-left: 0; + padding-right: 0; +} +.btn-social-icon.btn-sm { + height: 30px; + width: 30px; + padding-left: 0; + padding-right: 0; +} +.btn-social-icon.btn-xs { + height: 22px; + width: 22px; + padding-left: 0; + padding-right: 0; +} +.btn-adn { + color: #ffffff; + background-color: #d87a68; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-adn:hover, +.btn-adn:focus, +.btn-adn.focus, +.btn-adn:active, +.btn-adn.active, +.open > .dropdown-toggle.btn-adn { + color: #ffffff; + background-color: #ce563f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-adn:active, +.btn-adn.active, +.open > .dropdown-toggle.btn-adn { + background-image: none; +} +.btn-adn .badge { + color: #d87a68; + background-color: #ffffff; +} +.btn-bitbucket { + color: #ffffff; + background-color: #205081; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-bitbucket:hover, +.btn-bitbucket:focus, +.btn-bitbucket.focus, +.btn-bitbucket:active, +.btn-bitbucket.active, +.open > .dropdown-toggle.btn-bitbucket { + color: #ffffff; + background-color: #163758; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-bitbucket:active, +.btn-bitbucket.active, +.open > .dropdown-toggle.btn-bitbucket { + background-image: none; +} +.btn-bitbucket .badge { + color: #205081; + background-color: #ffffff; +} +.btn-dropbox { + color: #ffffff; + background-color: #1087dd; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-dropbox:hover, +.btn-dropbox:focus, +.btn-dropbox.focus, +.btn-dropbox:active, +.btn-dropbox.active, +.open > .dropdown-toggle.btn-dropbox { + color: #ffffff; + background-color: #0d6aad; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-dropbox:active, +.btn-dropbox.active, +.open > .dropdown-toggle.btn-dropbox { + background-image: none; +} +.btn-dropbox .badge { + color: #1087dd; + background-color: #ffffff; +} +.btn-facebook { + color: #ffffff; + background-color: #3b5998; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-facebook:hover, +.btn-facebook:focus, +.btn-facebook.focus, +.btn-facebook:active, +.btn-facebook.active, +.open > .dropdown-toggle.btn-facebook { + color: #ffffff; + background-color: #2d4373; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-facebook:active, +.btn-facebook.active, +.open > .dropdown-toggle.btn-facebook { + background-image: none; +} +.btn-facebook .badge { + color: #3b5998; + background-color: #ffffff; +} +.btn-flickr { + color: #ffffff; + background-color: #ff0084; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-flickr:hover, +.btn-flickr:focus, +.btn-flickr.focus, +.btn-flickr:active, +.btn-flickr.active, +.open > .dropdown-toggle.btn-flickr { + color: #ffffff; + background-color: #cc006a; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-flickr:active, +.btn-flickr.active, +.open > .dropdown-toggle.btn-flickr { + background-image: none; +} +.btn-flickr .badge { + color: #ff0084; + background-color: #ffffff; +} +.btn-foursquare { + color: #ffffff; + background-color: #f94877; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-foursquare:hover, +.btn-foursquare:focus, +.btn-foursquare.focus, +.btn-foursquare:active, +.btn-foursquare.active, +.open > .dropdown-toggle.btn-foursquare { + color: #ffffff; + background-color: #f71752; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-foursquare:active, +.btn-foursquare.active, +.open > .dropdown-toggle.btn-foursquare { + background-image: none; +} +.btn-foursquare .badge { + color: #f94877; + background-color: #ffffff; +} +.btn-github { + color: #ffffff; + background-color: #444444; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-github:hover, +.btn-github:focus, +.btn-github.focus, +.btn-github:active, +.btn-github.active, +.open > .dropdown-toggle.btn-github { + color: #ffffff; + background-color: #2b2b2b; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-github:active, +.btn-github.active, +.open > .dropdown-toggle.btn-github { + background-image: none; +} +.btn-github .badge { + color: #444444; + background-color: #ffffff; +} +.btn-google { + color: #ffffff; + background-color: #dd4b39; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-google:hover, +.btn-google:focus, +.btn-google.focus, +.btn-google:active, +.btn-google.active, +.open > .dropdown-toggle.btn-google { + color: #ffffff; + background-color: #c23321; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-google:active, +.btn-google.active, +.open > .dropdown-toggle.btn-google { + background-image: none; +} +.btn-google .badge { + color: #dd4b39; + background-color: #ffffff; +} +.btn-instagram { + color: #ffffff; + background-color: #3f729b; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-instagram:hover, +.btn-instagram:focus, +.btn-instagram.focus, +.btn-instagram:active, +.btn-instagram.active, +.open > .dropdown-toggle.btn-instagram { + color: #ffffff; + background-color: #305777; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-instagram:active, +.btn-instagram.active, +.open > .dropdown-toggle.btn-instagram { + background-image: none; +} +.btn-instagram .badge { + color: #3f729b; + background-color: #ffffff; +} +.btn-linkedin { + color: #ffffff; + background-color: #007bb6; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-linkedin:hover, +.btn-linkedin:focus, +.btn-linkedin.focus, +.btn-linkedin:active, +.btn-linkedin.active, +.open > .dropdown-toggle.btn-linkedin { + color: #ffffff; + background-color: #005983; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-linkedin:active, +.btn-linkedin.active, +.open > .dropdown-toggle.btn-linkedin { + background-image: none; +} +.btn-linkedin .badge { + color: #007bb6; + background-color: #ffffff; +} +.btn-microsoft { + color: #ffffff; + background-color: #2672ec; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-microsoft:hover, +.btn-microsoft:focus, +.btn-microsoft.focus, +.btn-microsoft:active, +.btn-microsoft.active, +.open > .dropdown-toggle.btn-microsoft { + color: #ffffff; + background-color: #125acd; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-microsoft:active, +.btn-microsoft.active, +.open > .dropdown-toggle.btn-microsoft { + background-image: none; +} +.btn-microsoft .badge { + color: #2672ec; + background-color: #ffffff; +} +.btn-openid { + color: #ffffff; + background-color: #f7931e; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-openid:hover, +.btn-openid:focus, +.btn-openid.focus, +.btn-openid:active, +.btn-openid.active, +.open > .dropdown-toggle.btn-openid { + color: #ffffff; + background-color: #da7908; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-openid:active, +.btn-openid.active, +.open > .dropdown-toggle.btn-openid { + background-image: none; +} +.btn-openid .badge { + color: #f7931e; + background-color: #ffffff; +} +.btn-pinterest { + color: #ffffff; + background-color: #cb2027; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-pinterest:hover, +.btn-pinterest:focus, +.btn-pinterest.focus, +.btn-pinterest:active, +.btn-pinterest.active, +.open > .dropdown-toggle.btn-pinterest { + color: #ffffff; + background-color: #9f191f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-pinterest:active, +.btn-pinterest.active, +.open > .dropdown-toggle.btn-pinterest { + background-image: none; +} +.btn-pinterest .badge { + color: #cb2027; + background-color: #ffffff; +} +.btn-reddit { + color: #000000; + background-color: #eff7ff; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-reddit:hover, +.btn-reddit:focus, +.btn-reddit.focus, +.btn-reddit:active, +.btn-reddit.active, +.open > .dropdown-toggle.btn-reddit { + color: #000000; + background-color: #bcddff; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-reddit:active, +.btn-reddit.active, +.open > .dropdown-toggle.btn-reddit { + background-image: none; +} +.btn-reddit .badge { + color: #eff7ff; + background-color: #000000; +} +.btn-soundcloud { + color: #ffffff; + background-color: #ff5500; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-soundcloud:hover, +.btn-soundcloud:focus, +.btn-soundcloud.focus, +.btn-soundcloud:active, +.btn-soundcloud.active, +.open > .dropdown-toggle.btn-soundcloud { + color: #ffffff; + background-color: #cc4400; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-soundcloud:active, +.btn-soundcloud.active, +.open > .dropdown-toggle.btn-soundcloud { + background-image: none; +} +.btn-soundcloud .badge { + color: #ff5500; + background-color: #ffffff; +} +.btn-tumblr { + color: #ffffff; + background-color: #2c4762; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-tumblr:hover, +.btn-tumblr:focus, +.btn-tumblr.focus, +.btn-tumblr:active, +.btn-tumblr.active, +.open > .dropdown-toggle.btn-tumblr { + color: #ffffff; + background-color: #1c2d3f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-tumblr:active, +.btn-tumblr.active, +.open > .dropdown-toggle.btn-tumblr { + background-image: none; +} +.btn-tumblr .badge { + color: #2c4762; + background-color: #ffffff; +} +.btn-twitter { + color: #ffffff; + background-color: #55acee; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-twitter:hover, +.btn-twitter:focus, +.btn-twitter.focus, +.btn-twitter:active, +.btn-twitter.active, +.open > .dropdown-toggle.btn-twitter { + color: #ffffff; + background-color: #2795e9; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-twitter:active, +.btn-twitter.active, +.open > .dropdown-toggle.btn-twitter { + background-image: none; +} +.btn-twitter .badge { + color: #55acee; + background-color: #ffffff; +} +.btn-vimeo { + color: #ffffff; + background-color: #1ab7ea; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vimeo:hover, +.btn-vimeo:focus, +.btn-vimeo.focus, +.btn-vimeo:active, +.btn-vimeo.active, +.open > .dropdown-toggle.btn-vimeo { + color: #ffffff; + background-color: #1295bf; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vimeo:active, +.btn-vimeo.active, +.open > .dropdown-toggle.btn-vimeo { + background-image: none; +} +.btn-vimeo .badge { + color: #1ab7ea; + background-color: #ffffff; +} +.btn-vk { + color: #ffffff; + background-color: #587ea3; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vk:hover, +.btn-vk:focus, +.btn-vk.focus, +.btn-vk:active, +.btn-vk.active, +.open > .dropdown-toggle.btn-vk { + color: #ffffff; + background-color: #466482; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-vk:active, +.btn-vk.active, +.open > .dropdown-toggle.btn-vk { + background-image: none; +} +.btn-vk .badge { + color: #587ea3; + background-color: #ffffff; +} +.btn-yahoo { + color: #ffffff; + background-color: #720e9e; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-yahoo:hover, +.btn-yahoo:focus, +.btn-yahoo.focus, +.btn-yahoo:active, +.btn-yahoo.active, +.open > .dropdown-toggle.btn-yahoo { + color: #ffffff; + background-color: #500a6f; + border-color: rgba(0, 0, 0, 0.2); +} +.btn-yahoo:active, +.btn-yahoo.active, +.open > .dropdown-toggle.btn-yahoo { + background-image: none; +} +.btn-yahoo .badge { + color: #720e9e; + background-color: #ffffff; +} +/* + * Plugin: Full Calendar + * --------------------- + */ +.fc-button { + background: #f4f4f4; + background-image: none; + color: #444; + border-color: #ddd; + border-bottom-color: #ddd; +} +.fc-button:hover, +.fc-button:active, +.fc-button.hover { + background-color: #e9e9e9; +} +.fc-header-title h2 { + font-size: 15px; + line-height: 1.6em; + color: #666; + margin-left: 10px; +} +.fc-header-right { + padding-right: 10px; +} +.fc-header-left { + padding-left: 10px; +} +.fc-widget-header { + background: #fafafa; +} +.fc-grid { + width: 100%; + border: 0; +} +.fc-widget-header:first-of-type, +.fc-widget-content:first-of-type { + border-left: 0; + border-right: 0; +} +.fc-widget-header:last-of-type, +.fc-widget-content:last-of-type { + border-right: 0; +} +.fc-toolbar { + padding: 10px; + margin: 0; +} +.fc-day-number { + font-size: 20px; + font-weight: 300; + padding-right: 10px; +} +.fc-color-picker { + list-style: none; + margin: 0; + padding: 0; +} +.fc-color-picker > li { + float: left; + font-size: 30px; + margin-right: 5px; + line-height: 30px; +} +.fc-color-picker > li .fa { + -webkit-transition: -webkit-transform linear 0.3s; + -moz-transition: -moz-transform linear 0.3s; + -o-transition: -o-transform linear 0.3s; + transition: transform linear 0.3s; +} +.fc-color-picker > li .fa:hover { + -webkit-transform: rotate(30deg); + -ms-transform: rotate(30deg); + -o-transform: rotate(30deg); + transform: rotate(30deg); +} +#add-new-event { + -webkit-transition: all linear 0.3s; + -o-transition: all linear 0.3s; + transition: all linear 0.3s; +} +.external-event { + padding: 5px 10px; + font-weight: bold; + margin-bottom: 4px; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); + border-radius: 3px; + cursor: move; +} +.external-event:hover { + box-shadow: inset 0 0 90px rgba(0, 0, 0, 0.2); +} +/* + * Plugin: Select2 + * --------------- + */ +.select2-container--default.select2-container--focus, +.select2-selection.select2-container--focus, +.select2-container--default:focus, +.select2-selection:focus, +.select2-container--default:active, +.select2-selection:active { + outline: none; +} +.select2-container--default .select2-selection--single, +.select2-selection .select2-selection--single { + border: 1px solid #d2d6de; + border-radius: 0; + padding: 6px 12px; + height: 34px; +} +.select2-container--default.select2-container--open { + border-color: #3c8dbc; +} +.select2-dropdown { + border: 1px solid #d2d6de; + border-radius: 0; +} +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #3c8dbc; + color: white; +} +.select2-results__option { + padding: 6px 12px; + user-select: none; + -webkit-user-select: none; +} +.select2-container .select2-selection--single .select2-selection__rendered { + padding-left: 0; + padding-right: 0; + height: auto; + margin-top: -4px; +} +.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { + padding-right: 6px; + padding-left: 20px; +} +.select2-container--default .select2-selection--single .select2-selection__arrow { + height: 28px; + right: 3px; +} +.select2-container--default .select2-selection--single .select2-selection__arrow b { + margin-top: 0; +} +.select2-dropdown .select2-search__field, +.select2-search--inline .select2-search__field { + border: 1px solid #d2d6de; +} +.select2-dropdown .select2-search__field:focus, +.select2-search--inline .select2-search__field:focus { + outline: none; + border: 1px solid #3c8dbc; +} +.select2-container--default .select2-results__option[aria-disabled=true] { + color: #999; +} +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #ddd; +} +.select2-container--default .select2-results__option[aria-selected=true], +.select2-container--default .select2-results__option[aria-selected=true]:hover { + color: #444; +} +.select2-container--default .select2-selection--multiple { + border: 1px solid #d2d6de; + border-radius: 0; +} +.select2-container--default .select2-selection--multiple:focus { + border-color: #3c8dbc; +} +.select2-container--default.select2-container--focus .select2-selection--multiple { + border-color: #d2d6de; +} +.select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: #3c8dbc; + border-color: #367fa9; + padding: 1px 10px; + color: #fff; +} +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + margin-right: 5px; + color: rgba(255, 255, 255, 0.7); +} +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #fff; +} +.select2-container .select2-selection--single .select2-selection__rendered { + padding-right: 10px; +} +/* + * General: Miscellaneous + * ---------------------- + */ +.pad { + padding: 10px; +} +.margin { + margin: 10px; +} +.margin-bottom { + margin-bottom: 20px; +} +.margin-bottom-none { + margin-bottom: 0; +} +.margin-r-5 { + margin-right: 5px; +} +.inline { + display: inline; +} +.description-block { + display: block; + margin: 10px 0; + text-align: center; +} +.description-block.margin-bottom { + margin-bottom: 25px; +} +.description-block > .description-header { + margin: 0; + padding: 0; + font-weight: 600; + font-size: 16px; +} +.description-block > .description-text { + text-transform: uppercase; +} +.bg-red, +.bg-yellow, +.bg-aqua, +.bg-blue, +.bg-light-blue, +.bg-green, +.bg-navy, +.bg-teal, +.bg-olive, +.bg-lime, +.bg-orange, +.bg-fuchsia, +.bg-purple, +.bg-maroon, +.bg-black, +.bg-red-active, +.bg-yellow-active, +.bg-aqua-active, +.bg-blue-active, +.bg-light-blue-active, +.bg-green-active, +.bg-navy-active, +.bg-teal-active, +.bg-olive-active, +.bg-lime-active, +.bg-orange-active, +.bg-fuchsia-active, +.bg-purple-active, +.bg-maroon-active, +.bg-black-active, +.callout.callout-danger, +.callout.callout-warning, +.callout.callout-info, +.callout.callout-success, +.alert-success, +.alert-danger, +.alert-error, +.alert-warning, +.alert-info, +.label-danger, +.label-info, +.label-warning, +.label-primary, +.label-success, +.modal-primary .modal-body, +.modal-primary .modal-header, +.modal-primary .modal-footer, +.modal-warning .modal-body, +.modal-warning .modal-header, +.modal-warning .modal-footer, +.modal-info .modal-body, +.modal-info .modal-header, +.modal-info .modal-footer, +.modal-success .modal-body, +.modal-success .modal-header, +.modal-success .modal-footer, +.modal-danger .modal-body, +.modal-danger .modal-header, +.modal-danger .modal-footer { + color: #fff !important; +} +.bg-gray { + color: #000; + background-color: #d2d6de !important; +} +.bg-gray-light { + background-color: #f7f7f7; +} +.bg-black { + background-color: #111111 !important; +} +.bg-red, +.callout.callout-danger, +.alert-danger, +.alert-error, +.label-danger, +.modal-danger .modal-body { + background-color: #dd4b39 !important; +} +.bg-yellow, +.callout.callout-warning, +.alert-warning, +.label-warning, +.modal-warning .modal-body { + background-color: #f39c12 !important; +} +.bg-aqua, +.callout.callout-info, +.alert-info, +.label-info, +.modal-info .modal-body { + background-color: #00c0ef !important; +} +.bg-blue { + background-color: #0073b7 !important; +} +.bg-light-blue, +.label-primary, +.modal-primary .modal-body { + background-color: #3c8dbc !important; +} +.bg-green, +.callout.callout-success, +.alert-success, +.label-success, +.modal-success .modal-body { + background-color: #00a65a !important; +} +.bg-navy { + background-color: #001f3f !important; +} +.bg-teal { + background-color: #39cccc !important; +} +.bg-olive { + background-color: #3d9970 !important; +} +.bg-lime { + background-color: #01ff70 !important; +} +.bg-orange { + background-color: #ff851b !important; +} +.bg-fuchsia { + background-color: #f012be !important; +} +.bg-purple { + background-color: #605ca8 !important; +} +.bg-maroon { + background-color: #d81b60 !important; +} +.bg-gray-active { + color: #000; + background-color: #b5bbc8 !important; +} +.bg-black-active { + background-color: #000000 !important; +} +.bg-red-active, +.modal-danger .modal-header, +.modal-danger .modal-footer { + background-color: #d33724 !important; +} +.bg-yellow-active, +.modal-warning .modal-header, +.modal-warning .modal-footer { + background-color: #db8b0b !important; +} +.bg-aqua-active, +.modal-info .modal-header, +.modal-info .modal-footer { + background-color: #00a7d0 !important; +} +.bg-blue-active { + background-color: #005384 !important; +} +.bg-light-blue-active, +.modal-primary .modal-header, +.modal-primary .modal-footer { + background-color: #357ca5 !important; +} +.bg-green-active, +.modal-success .modal-header, +.modal-success .modal-footer { + background-color: #008d4c !important; +} +.bg-navy-active { + background-color: #001a35 !important; +} +.bg-teal-active { + background-color: #30bbbb !important; +} +.bg-olive-active { + background-color: #368763 !important; +} +.bg-lime-active { + background-color: #00e765 !important; +} +.bg-orange-active { + background-color: #ff7701 !important; +} +.bg-fuchsia-active { + background-color: #db0ead !important; +} +.bg-purple-active { + background-color: #555299 !important; +} +.bg-maroon-active { + background-color: #ca195a !important; +} +[class^="bg-"].disabled { + opacity: 0.65; + filter: alpha(opacity=65); +} +.text-red { + color: #dd4b39 !important; +} +.text-yellow { + color: #f39c12 !important; +} +.text-aqua { + color: #00c0ef !important; +} +.text-blue { + color: #0073b7 !important; +} +.text-black { + color: #111111 !important; +} +.text-light-blue { + color: #3c8dbc !important; +} +.text-green { + color: #00a65a !important; +} +.text-gray { + color: #d2d6de !important; +} +.text-navy { + color: #001f3f !important; +} +.text-teal { + color: #39cccc !important; +} +.text-olive { + color: #3d9970 !important; +} +.text-lime { + color: #01ff70 !important; +} +.text-orange { + color: #ff851b !important; +} +.text-fuchsia { + color: #f012be !important; +} +.text-purple { + color: #605ca8 !important; +} +.text-maroon { + color: #d81b60 !important; +} +.link-muted { + color: #7a869d; +} +.link-muted:hover, +.link-muted:focus { + color: #606c84; +} +.link-black { + color: #666; +} +.link-black:hover, +.link-black:focus { + color: #999; +} +.hide { + display: none !important; +} +.no-border { + border: 0 !important; +} +.no-padding { + padding: 0 !important; +} +.no-margin { + margin: 0 !important; +} +.no-shadow { + box-shadow: none!important; +} +.list-unstyled, +.chart-legend, +.contacts-list, +.users-list, +.mailbox-attachments { + list-style: none; + margin: 0; + padding: 0; +} +.list-group-unbordered > .list-group-item { + border-left: 0; + border-right: 0; + border-radius: 0; + padding-left: 0; + padding-right: 0; +} +.flat { + border-radius: 0 !important; +} +.text-bold, +.text-bold.table td, +.text-bold.table th { + font-weight: 700; +} +.text-sm { + font-size: 12px; +} +.jqstooltip { + padding: 5px!important; + width: auto!important; + height: auto!important; +} +.bg-teal-gradient { + background: #39cccc !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #39cccc), color-stop(1, #7adddd)) !important; + background: -ms-linear-gradient(bottom, #39cccc, #7adddd) !important; + background: -moz-linear-gradient(center bottom, #39cccc 0%, #7adddd 100%) !important; + background: -o-linear-gradient(#7adddd, #39cccc) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39cccc', GradientType=0) !important; + color: #fff; +} +.bg-light-blue-gradient { + background: #3c8dbc !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #3c8dbc), color-stop(1, #67a8ce)) !important; + background: -ms-linear-gradient(bottom, #3c8dbc, #67a8ce) !important; + background: -moz-linear-gradient(center bottom, #3c8dbc 0%, #67a8ce 100%) !important; + background: -o-linear-gradient(#67a8ce, #3c8dbc) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important; + color: #fff; +} +.bg-blue-gradient { + background: #0073b7 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #0073b7), color-stop(1, #0089db)) !important; + background: -ms-linear-gradient(bottom, #0073b7, #0089db) !important; + background: -moz-linear-gradient(center bottom, #0073b7 0%, #0089db 100%) !important; + background: -o-linear-gradient(#0089db, #0073b7) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important; + color: #fff; +} +.bg-aqua-gradient { + background: #00c0ef !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #00c0ef), color-stop(1, #14d1ff)) !important; + background: -ms-linear-gradient(bottom, #00c0ef, #14d1ff) !important; + background: -moz-linear-gradient(center bottom, #00c0ef 0%, #14d1ff 100%) !important; + background: -o-linear-gradient(#14d1ff, #00c0ef) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important; + color: #fff; +} +.bg-yellow-gradient { + background: #f39c12 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #f39c12), color-stop(1, #f7bc60)) !important; + background: -ms-linear-gradient(bottom, #f39c12, #f7bc60) !important; + background: -moz-linear-gradient(center bottom, #f39c12 0%, #f7bc60 100%) !important; + background: -o-linear-gradient(#f7bc60, #f39c12) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important; + color: #fff; +} +.bg-purple-gradient { + background: #605ca8 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #605ca8), color-stop(1, #9491c4)) !important; + background: -ms-linear-gradient(bottom, #605ca8, #9491c4) !important; + background: -moz-linear-gradient(center bottom, #605ca8 0%, #9491c4 100%) !important; + background: -o-linear-gradient(#9491c4, #605ca8) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important; + color: #fff; +} +.bg-green-gradient { + background: #00a65a !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #00a65a), color-stop(1, #00ca6d)) !important; + background: -ms-linear-gradient(bottom, #00a65a, #00ca6d) !important; + background: -moz-linear-gradient(center bottom, #00a65a 0%, #00ca6d 100%) !important; + background: -o-linear-gradient(#00ca6d, #00a65a) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important; + color: #fff; +} +.bg-red-gradient { + background: #dd4b39 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #dd4b39), color-stop(1, #e47365)) !important; + background: -ms-linear-gradient(bottom, #dd4b39, #e47365) !important; + background: -moz-linear-gradient(center bottom, #dd4b39 0%, #e47365 100%) !important; + background: -o-linear-gradient(#e47365, #dd4b39) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important; + color: #fff; +} +.bg-black-gradient { + background: #111111 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #111111), color-stop(1, #2b2b2b)) !important; + background: -ms-linear-gradient(bottom, #111111, #2b2b2b) !important; + background: -moz-linear-gradient(center bottom, #111111 0%, #2b2b2b 100%) !important; + background: -o-linear-gradient(#2b2b2b, #111111) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111111', GradientType=0) !important; + color: #fff; +} +.bg-maroon-gradient { + background: #d81b60 !important; + background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #d81b60), color-stop(1, #e73f7c)) !important; + background: -ms-linear-gradient(bottom, #d81b60, #e73f7c) !important; + background: -moz-linear-gradient(center bottom, #d81b60 0%, #e73f7c 100%) !important; + background: -o-linear-gradient(#e73f7c, #d81b60) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#d81b60', GradientType=0) !important; + color: #fff; +} +.description-block .description-icon { + font-size: 16px; +} +.no-pad-top { + padding-top: 0; +} +.position-static { + position: static!important; +} +.list-header { + font-size: 15px; + padding: 10px 4px; + font-weight: bold; + color: #666; +} +.list-seperator { + height: 1px; + background: #f4f4f4; + margin: 15px 0 9px 0; +} +.list-link > a { + padding: 4px; + color: #777; +} +.list-link > a:hover { + color: #222; +} +.font-light { + font-weight: 300; +} +.user-block:before, +.user-block:after { + content: " "; + display: table; +} +.user-block:after { + clear: both; +} +.user-block img { + width: 40px; + height: 40px; + float: left; +} +.user-block .username, +.user-block .description, +.user-block .comment { + display: block; + margin-left: 50px; +} +.user-block .username { + font-size: 16px; + font-weight: 600; +} +.user-block .description { + color: #999; + font-size: 13px; +} +.user-block.user-block-sm .username, +.user-block.user-block-sm .description, +.user-block.user-block-sm .comment { + margin-left: 40px; +} +.user-block.user-block-sm .username { + font-size: 14px; +} +.img-sm, +.img-md, +.img-lg, +.box-comments .box-comment img, +.user-block.user-block-sm img { + float: left; +} +.img-sm, +.box-comments .box-comment img, +.user-block.user-block-sm img { + width: 30px!important; + height: 30px!important; +} +.img-sm + .img-push { + margin-left: 40px; +} +.img-md { + width: 60px; + height: 60px; +} +.img-md + .img-push { + margin-left: 70px; +} +.img-lg { + width: 100px; + height: 100px; +} +.img-lg + .img-push { + margin-left: 110px; +} +.img-bordered { + border: 3px solid #d2d6de; + padding: 3px; +} +.img-bordered-sm { + border: 2px solid #d2d6de; + padding: 2px; +} +.attachment-block { + border: 1px solid #f4f4f4; + padding: 5px; + margin-bottom: 10px; + background: #f7f7f7; +} +.attachment-block .attachment-img { + max-width: 100px; + max-height: 100px; + height: auto; + float: left; +} +.attachment-block .attachment-pushed { + margin-left: 110px; +} +.attachment-block .attachment-heading { + margin: 0; +} +.attachment-block .attachment-text { + color: #555; +} +.connectedSortable { + min-height: 100px; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.sort-highlight { + background: #f4f4f4; + border: 1px dashed #ddd; + margin-bottom: 10px; +} +.full-opacity-hover { + opacity: 0.65; + filter: alpha(opacity=65); +} +.full-opacity-hover:hover { + opacity: 1; + filter: alpha(opacity=100); +} +.chart { + position: relative; + overflow: hidden; + width: 100%; +} +.chart svg, +.chart canvas { + width: 100%!important; +} +/* + * Misc: print + * ----------- + */ +@media print { + .no-print, + .main-sidebar, + .left-side, + .main-header, + .content-header { + display: none!important; + } + .content-wrapper, + .right-side, + .main-footer { + margin-left: 0!important; + min-height: 0!important; + -webkit-transform: translate(0, 0) !important; + -ms-transform: translate(0, 0) !important; + -o-transform: translate(0, 0) !important; + transform: translate(0, 0) !important; + } + .fixed .content-wrapper, + .fixed .right-side { + padding-top: 0!important; + } + .invoice { + width: 100%; + border: 0; + margin: 0; + padding: 0; + } + .invoice-col { + float: left; + width: 33.3333333%; + } + .table-responsive { + overflow: auto; + } + .table-responsive > .table tr th, + .table-responsive > .table tr td { + white-space: normal!important; + } +} diff --git a/theme/bootstrap/dist/css/AdminLTE.min.css b/theme/bootstrap/dist/css/AdminLTE.min.css new file mode 100644 index 0000000..067a51a --- /dev/null +++ b/theme/bootstrap/dist/css/AdminLTE.min.css @@ -0,0 +1,7 @@ +/*!@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic); + * AdminLTE v2.3.0 + * Author: Almsaeed Studio + * Website: Almsaeed Studio <http://almsaeedstudio.com> + * License: Open source - MIT + * Please visit http://opensource.org/licenses/MIT for more information +!*/html,body{min-height:100%}.layout-boxed html,.layout-boxed body{height:100%}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:'Source Sans Pro','Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;overflow-x:hidden;overflow-y:auto}.wrapper{min-height:100%;position:static;overflow:hidden}.wrapper:before,.wrapper:after{content:" ";display:table}.wrapper:after{clear:both}.layout-boxed .wrapper{max-width:1250px;margin:0 auto;min-height:100%;box-shadow:0 0 8px rgba(0,0,0,0.5);position:relative}.layout-boxed{background:url('../img/boxed-bg.jpg') repeat fixed}.content-wrapper,.right-side,.main-footer{-webkit-transition:-webkit-transform .3s ease-in-out,margin .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,margin .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,margin .3s ease-in-out;transition:transform .3s ease-in-out,margin .3s ease-in-out;margin-left:230px;z-index:820}.layout-top-nav .content-wrapper,.layout-top-nav .right-side,.layout-top-nav .main-footer{margin-left:0}@media (max-width:767px){.content-wrapper,.right-side,.main-footer{margin-left:0}}@media (min-width:768px){.sidebar-collapse .content-wrapper,.sidebar-collapse .right-side,.sidebar-collapse .main-footer{margin-left:0}}@media (max-width:767px){.sidebar-open .content-wrapper,.sidebar-open .right-side,.sidebar-open .main-footer{-webkit-transform:translate(230px, 0);-ms-transform:translate(230px, 0);-o-transform:translate(230px, 0);transform:translate(230px, 0)}}.content-wrapper,.right-side{min-height:100%;background-color:#ecf0f5;z-index:800}.main-footer{background:#fff;padding:15px;color:#444;border-top:1px solid #d2d6de}.fixed .main-header,.fixed .main-sidebar,.fixed .left-side{position:fixed}.fixed .main-header{top:0;right:0;left:0}.fixed .content-wrapper,.fixed .right-side{padding-top:50px}@media (max-width:767px){.fixed .content-wrapper,.fixed .right-side{padding-top:100px}}.fixed.layout-boxed .wrapper{max-width:100%}body.hold-transition .content-wrapper,body.hold-transition .right-side,body.hold-transition .main-footer,body.hold-transition .main-sidebar,body.hold-transition .left-side,body.hold-transition .main-header>.navbar,body.hold-transition .main-header .logo{-webkit-transition:none;-o-transition:none;transition:none}.content{min-height:250px;padding:15px;margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:'Source Sans Pro',sans-serif}a{color:#3c8dbc}a:hover,a:active,a:focus{outline:none;text-decoration:none;color:#72afd2}.page-header{margin:10px 0 20px 0;font-size:22px}.page-header>small{color:#666;display:block;margin-top:5px}.main-header{position:relative;max-height:100px;z-index:1030}.main-header>.navbar{-webkit-transition:margin-left .3s ease-in-out;-o-transition:margin-left .3s ease-in-out;transition:margin-left .3s ease-in-out;margin-bottom:0;margin-left:230px;border:none;min-height:50px;border-radius:0}.layout-top-nav .main-header>.navbar{margin-left:0}.main-header #navbar-search-input.form-control{background:rgba(255,255,255,0.2);border-color:transparent}.main-header #navbar-search-input.form-control:focus,.main-header #navbar-search-input.form-control:active{border-color:rgba(0,0,0,0.1);background:rgba(255,255,255,0.9)}.main-header #navbar-search-input.form-control::-moz-placeholder{color:#ccc;opacity:1}.main-header #navbar-search-input.form-control:-ms-input-placeholder{color:#ccc}.main-header #navbar-search-input.form-control::-webkit-input-placeholder{color:#ccc}.main-header .navbar-custom-menu,.main-header .navbar-right{float:right}@media (max-width:991px){.main-header .navbar-custom-menu a,.main-header .navbar-right a{color:inherit;background:transparent}}@media (max-width:767px){.main-header .navbar-right{float:none}.navbar-collapse .main-header .navbar-right{margin:7.5px -15px}.main-header .navbar-right>li{color:inherit;border:0}}.main-header .sidebar-toggle{float:left;background-color:transparent;background-image:none;padding:15px 15px;font-family:fontAwesome}.main-header .sidebar-toggle:before{content:"\f0c9"}.main-header .sidebar-toggle:hover{color:#fff}.main-header .sidebar-toggle:focus,.main-header .sidebar-toggle:active{background:transparent}.main-header .sidebar-toggle .icon-bar{display:none}.main-header .navbar .nav>li.user>a>.fa,.main-header .navbar .nav>li.user>a>.glyphicon,.main-header .navbar .nav>li.user>a>.ion{margin-right:5px}.main-header .navbar .nav>li>a>.label{position:absolute;top:9px;right:7px;text-align:center;font-size:9px;padding:2px 3px;line-height:.9}.main-header .logo{-webkit-transition:width .3s ease-in-out;-o-transition:width .3s ease-in-out;transition:width .3s ease-in-out;display:block;float:left;height:50px;font-size:20px;line-height:50px;text-align:center;width:230px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;padding:0 15px;font-weight:300;overflow:hidden}.main-header .logo .logo-lg{display:block}.main-header .logo .logo-mini{display:none}.main-header .navbar-brand{color:#fff}.content-header{position:relative;padding:15px 15px 0 15px}.content-header>h1{margin:0;font-size:24px}.content-header>h1>small{font-size:15px;display:inline-block;padding-left:4px;font-weight:300}.content-header>.breadcrumb{float:right;background:transparent;margin-top:0;margin-bottom:0;font-size:12px;padding:7px 5px;position:absolute;top:15px;right:10px;border-radius:2px}.content-header>.breadcrumb>li>a{color:#444;text-decoration:none;display:inline-block}.content-header>.breadcrumb>li>a>.fa,.content-header>.breadcrumb>li>a>.glyphicon,.content-header>.breadcrumb>li>a>.ion{margin-right:5px}.content-header>.breadcrumb>li+li:before{content:'>\00a0'}@media (max-width:991px){.content-header>.breadcrumb{position:relative;margin-top:5px;top:0;right:0;float:none;background:#d2d6de;padding-left:10px}.content-header>.breadcrumb li:before{color:#97a0b3}}.navbar-toggle{color:#fff;border:0;margin:0;padding:15px 15px}@media (max-width:991px){.navbar-custom-menu .navbar-nav>li{float:left}.navbar-custom-menu .navbar-nav{margin:0;float:left}.navbar-custom-menu .navbar-nav>li>a{padding-top:15px;padding-bottom:15px;line-height:20px}}@media (max-width:767px){.main-header{position:relative}.main-header .logo,.main-header .navbar{width:100%;float:none}.main-header .navbar{margin:0}.main-header .navbar-custom-menu{float:right}}@media (max-width:991px){.navbar-collapse.pull-left{float:none!important}.navbar-collapse.pull-left+.navbar-custom-menu{display:block;position:absolute;top:0;right:40px}}.main-sidebar,.left-side{position:absolute;top:0;left:0;padding-top:50px;min-height:100%;width:230px;z-index:810;-webkit-transition:-webkit-transform .3s ease-in-out,width .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,width .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,width .3s ease-in-out;transition:transform .3s ease-in-out,width .3s ease-in-out}@media (max-width:767px){.main-sidebar,.left-side{padding-top:100px}}@media (max-width:767px){.main-sidebar,.left-side{-webkit-transform:translate(-230px, 0);-ms-transform:translate(-230px, 0);-o-transform:translate(-230px, 0);transform:translate(-230px, 0)}}@media (min-width:768px){.sidebar-collapse .main-sidebar,.sidebar-collapse .left-side{-webkit-transform:translate(-230px, 0);-ms-transform:translate(-230px, 0);-o-transform:translate(-230px, 0);transform:translate(-230px, 0)}}@media (max-width:767px){.sidebar-open .main-sidebar,.sidebar-open .left-side{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}}.sidebar{padding-bottom:10px}.sidebar-form input:focus{border-color:transparent}.user-panel{position:relative;width:100%;padding:10px;overflow:hidden}.user-panel:before,.user-panel:after{content:" ";display:table}.user-panel:after{clear:both}.user-panel>.image>img{width:100%;max-width:45px;height:auto}.user-panel>.info{padding:5px 5px 5px 15px;line-height:1;position:absolute;left:55px}.user-panel>.info>p{font-weight:600;margin-bottom:9px}.user-panel>.info>a{text-decoration:none;padding-right:5px;margin-top:3px;font-size:11px}.user-panel>.info>a>.fa,.user-panel>.info>a>.ion,.user-panel>.info>a>.glyphicon{margin-right:3px}.sidebar-menu{list-style:none;margin:0;padding:0}.sidebar-menu>li{position:relative;margin:0;padding:0}.sidebar-menu>li>a{padding:12px 5px 12px 15px;display:block}.sidebar-menu>li>a>.fa,.sidebar-menu>li>a>.glyphicon,.sidebar-menu>li>a>.ion{width:20px}.sidebar-menu>li .label,.sidebar-menu>li .badge{margin-top:3px;margin-right:5px}.sidebar-menu li.header{padding:10px 25px 10px 15px;font-size:12px}.sidebar-menu li>a>.fa-angle-left{width:auto;height:auto;padding:0;margin-right:10px;margin-top:3px}.sidebar-menu li.active>a>.fa-angle-left{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.sidebar-menu li.active>.treeview-menu{display:block}.sidebar-menu .treeview-menu{display:none;list-style:none;padding:0;margin:0;padding-left:5px}.sidebar-menu .treeview-menu .treeview-menu{padding-left:20px}.sidebar-menu .treeview-menu>li{margin:0}.sidebar-menu .treeview-menu>li>a{padding:5px 5px 5px 15px;display:block;font-size:14px}.sidebar-menu .treeview-menu>li>a>.fa,.sidebar-menu .treeview-menu>li>a>.glyphicon,.sidebar-menu .treeview-menu>li>a>.ion{width:20px}.sidebar-menu .treeview-menu>li>a>.fa-angle-left,.sidebar-menu .treeview-menu>li>a>.fa-angle-down{width:auto}@media (min-width:768px){.sidebar-mini.sidebar-collapse .content-wrapper,.sidebar-mini.sidebar-collapse .right-side,.sidebar-mini.sidebar-collapse .main-footer{margin-left:50px!important;z-index:840}.sidebar-mini.sidebar-collapse .main-sidebar{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0);width:50px!important;z-index:850}.sidebar-mini.sidebar-collapse .sidebar-menu>li{position:relative}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a{margin-right:0}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span{border-top-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:not(.treeview)>a>span{border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{padding-top:5px;padding-bottom:5px;border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>span:not(.pull-right),.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{display:block!important;position:absolute;width:180px;left:50px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>span{top:0;margin-left:-3px;padding:12px 5px 12px 20px;background-color:inherit}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{top:44px;margin-left:0}.sidebar-mini.sidebar-collapse .main-sidebar .user-panel>.info,.sidebar-mini.sidebar-collapse .sidebar-form,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span,.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>.pull-right,.sidebar-mini.sidebar-collapse .sidebar-menu li.header{display:none!important;-webkit-transform:translateZ(0)}.sidebar-mini.sidebar-collapse .main-header .logo{width:50px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-mini{display:block;margin-left:-15px;margin-right:-15px;font-size:18px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-lg{display:none}.sidebar-mini.sidebar-collapse .main-header .navbar{margin-left:50px}}.sidebar-menu,.main-sidebar .user-panel,.sidebar-menu>li.header{white-space:nowrap;overflow:hidden}.sidebar-menu:hover{overflow:visible}.sidebar-form,.sidebar-menu>li.header{overflow:hidden;text-overflow:clip}.sidebar-menu li>a{position:relative}.sidebar-menu li>a>.pull-right{position:absolute;top:50%;right:10px;margin-top:-7px}.control-sidebar-bg{position:fixed;z-index:1000;bottom:0}.control-sidebar-bg,.control-sidebar{top:0;right:-230px;width:230px;-webkit-transition:right .3s ease-in-out;-o-transition:right .3s ease-in-out;transition:right .3s ease-in-out}.control-sidebar{position:absolute;padding-top:50px;z-index:1010}@media (max-width:768px){.control-sidebar{padding-top:100px}}.control-sidebar>.tab-content{padding:10px 15px}.control-sidebar.control-sidebar-open,.control-sidebar.control-sidebar-open+.control-sidebar-bg{right:0}.control-sidebar-open .control-sidebar-bg,.control-sidebar-open .control-sidebar{right:0}@media (min-width:768px){.control-sidebar-open .content-wrapper,.control-sidebar-open .right-side,.control-sidebar-open .main-footer{margin-right:230px}}.nav-tabs.control-sidebar-tabs>li:first-of-type>a,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:hover,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:focus{border-left-width:0}.nav-tabs.control-sidebar-tabs>li>a{border-radius:0}.nav-tabs.control-sidebar-tabs>li>a,.nav-tabs.control-sidebar-tabs>li>a:hover{border-top:none;border-right:none;border-left:1px solid transparent;border-bottom:1px solid transparent}.nav-tabs.control-sidebar-tabs>li>a .icon{font-size:16px}.nav-tabs.control-sidebar-tabs>li.active>a,.nav-tabs.control-sidebar-tabs>li.active>a:hover,.nav-tabs.control-sidebar-tabs>li.active>a:focus,.nav-tabs.control-sidebar-tabs>li.active>a:active{border-top:none;border-right:none;border-bottom:none}@media (max-width:768px){.nav-tabs.control-sidebar-tabs{display:table}.nav-tabs.control-sidebar-tabs>li{display:table-cell}}.control-sidebar-heading{font-weight:400;font-size:16px;padding:10px 0;margin-bottom:10px}.control-sidebar-subheading{display:block;font-weight:400;font-size:14px}.control-sidebar-menu{list-style:none;padding:0;margin:0 -15px}.control-sidebar-menu>li>a{display:block;padding:10px 15px}.control-sidebar-menu>li>a:before,.control-sidebar-menu>li>a:after{content:" ";display:table}.control-sidebar-menu>li>a:after{clear:both}.control-sidebar-menu>li>a>.control-sidebar-subheading{margin-top:0}.control-sidebar-menu .menu-icon{float:left;width:35px;height:35px;border-radius:50%;text-align:center;line-height:35px}.control-sidebar-menu .menu-info{margin-left:45px;margin-top:3px}.control-sidebar-menu .menu-info>.control-sidebar-subheading{margin:0}.control-sidebar-menu .menu-info>p{margin:0;font-size:11px}.control-sidebar-menu .progress{margin:0}.control-sidebar-dark{color:#b8c7ce}.control-sidebar-dark,.control-sidebar-dark+.control-sidebar-bg{background:#222d32}.control-sidebar-dark .nav-tabs.control-sidebar-tabs{border-bottom:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a{background:#181f23;color:#b8c7ce}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#141a1d;border-bottom-color:#141a1d}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:active{background:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{color:#fff}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#222d32;color:#fff}.control-sidebar-dark .control-sidebar-heading,.control-sidebar-dark .control-sidebar-subheading{color:#fff}.control-sidebar-dark .control-sidebar-menu>li>a:hover{background:#1e282c}.control-sidebar-dark .control-sidebar-menu>li>a .menu-info>p{color:#b8c7ce}.control-sidebar-light{color:#5e5e5e}.control-sidebar-light,.control-sidebar-light+.control-sidebar-bg{background:#f9fafc;border-left:1px solid #d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs{border-bottom:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a{background:#e8ecf4;color:#444}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus{border-left-color:#d2d6de;border-bottom-color:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:active{background:#eff1f7}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:hover,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:active{background:#f9fafc;color:#111}.control-sidebar-light .control-sidebar-heading,.control-sidebar-light .control-sidebar-subheading{color:#111}.control-sidebar-light .control-sidebar-menu{margin-left:-14px}.control-sidebar-light .control-sidebar-menu>li>a:hover{background:#f4f4f5}.control-sidebar-light .control-sidebar-menu>li>a .menu-info>p{color:#5e5e5e}.dropdown-menu{box-shadow:none;border-color:#eee}.dropdown-menu>li>a{color:#777}.dropdown-menu>li>a>.glyphicon,.dropdown-menu>li>a>.fa,.dropdown-menu>li>a>.ion{margin-right:10px}.dropdown-menu>li>a:hover{background-color:#e1e3e9;color:#333}.dropdown-menu>.divider{background-color:#eee}.navbar-nav>.notifications-menu>.dropdown-menu,.navbar-nav>.messages-menu>.dropdown-menu,.navbar-nav>.tasks-menu>.dropdown-menu{width:280px;padding:0 0 0 0;margin:0;top:100%}.navbar-nav>.notifications-menu>.dropdown-menu>li,.navbar-nav>.messages-menu>.dropdown-menu>li,.navbar-nav>.tasks-menu>.dropdown-menu>li{position:relative}.navbar-nav>.notifications-menu>.dropdown-menu>li.header,.navbar-nav>.messages-menu>.dropdown-menu>li.header,.navbar-nav>.tasks-menu>.dropdown-menu>li.header{border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0;background-color:#ffffff;padding:7px 10px;border-bottom:1px solid #f4f4f4;color:#444444;font-size:14px}.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px;font-size:12px;background-color:#fff;padding:7px 10px;border-bottom:1px solid #eeeeee;color:#444!important;text-align:center}@media (max-width:991px){.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{background:#fff!important;color:#444!important}}.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a:hover{text-decoration:none;font-weight:normal}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu,.navbar-nav>.messages-menu>.dropdown-menu>li .menu,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu{max-height:200px;margin:0;padding:0;list-style:none;overflow-x:hidden}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{display:block;white-space:nowrap;border-bottom:1px solid #f4f4f4}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a:hover{background:#f4f4f4;text-decoration:none}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a{color:#444444;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:10px}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.glyphicon,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.fa,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.ion{width:20px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a{margin:0;padding:10px 10px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>div>img{margin:auto 10px auto auto;width:40px;height:40px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4{padding:0;margin:0 0 0 45px;color:#444444;font-size:15px;position:relative}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4>small{color:#999999;font-size:10px;position:absolute;top:0;right:0}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>p{margin:0 0 0 45px;font-size:12px;color:#888888}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:before,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{content:" ";display:table}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after{clear:both}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{padding:10px}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>h3{font-size:14px;padding:0;margin:0 0 10px 0;color:#666666}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>.progress{padding:0;margin:0}.navbar-nav>.user-menu>.dropdown-menu{border-top-right-radius:0;border-top-left-radius:0;padding:1px 0 0 0;border-top-width:0;width:280px}.navbar-nav>.user-menu>.dropdown-menu,.navbar-nav>.user-menu>.dropdown-menu>.user-body{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header{height:175px;padding:10px;text-align:center}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>img{z-index:5;height:90px;width:90px;border:3px solid;border-color:transparent;border-color:rgba(255,255,255,0.2)}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p{z-index:5;color:#fff;color:rgba(255,255,255,0.8);font-size:17px;margin-top:10px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p>small{display:block;font-size:12px}.navbar-nav>.user-menu>.dropdown-menu>.user-body{padding:15px;border-bottom:1px solid #f4f4f4;border-top:1px solid #dddddd}.navbar-nav>.user-menu>.dropdown-menu>.user-body:before,.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-body:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-body a{color:#444 !important}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-body a{background:#fff !important;color:#444 !important}}.navbar-nav>.user-menu>.dropdown-menu>.user-footer{background-color:#f9f9f9;padding:10px}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:before,.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{content:" ";display:table}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default{color:#666666}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default:hover{background-color:#f9f9f9}}.navbar-nav>.user-menu .user-image{float:left;width:25px;height:25px;border-radius:50%;margin-right:10px;margin-top:-2px}@media (max-width:767px){.navbar-nav>.user-menu .user-image{float:none;margin-right:0;margin-top:-8px;line-height:10px}}.open:not(.dropup)>.animated-dropdown-menu{backface-visibility:visible !important;-webkit-animation:flipInX .7s both;-o-animation:flipInX .7s both;animation:flipInX .7s both}@keyframes flipInX{0%{transform:perspective(400px) rotate3d(1, 0, 0, 90deg);transition-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotate3d(1, 0, 0, -20deg);transition-timing-function:ease-in}60%{transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{transform:perspective(400px)}}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 90deg);-webkit-transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -20deg);-webkit-transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, 10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1, 0, 0, -5deg)}100%{-webkit-transform:perspective(400px)}}.navbar-custom-menu>.navbar-nav>li{position:relative}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:0;left:auto}@media (max-width:991px){.navbar-custom-menu>.navbar-nav{float:right}.navbar-custom-menu>.navbar-nav>li{position:static}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:5%;left:auto;border:1px solid #ddd;background:#fff}}.form-control{border-radius:0;box-shadow:none;border-color:#d2d6de}.form-control:focus{border-color:#3c8dbc;box-shadow:none}.form-control::-moz-placeholder,.form-control:-ms-input-placeholder,.form-control::-webkit-input-placeholder{color:#bbb;opacity:1}.form-control:not(select){-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-group.has-success label{color:#00a65a}.form-group.has-success .form-control{border-color:#00a65a;box-shadow:none}.form-group.has-warning label{color:#f39c12}.form-group.has-warning .form-control{border-color:#f39c12;box-shadow:none}.form-group.has-error label{color:#dd4b39}.form-group.has-error .form-control{border-color:#dd4b39;box-shadow:none}.input-group .input-group-addon{border-radius:0;border-color:#d2d6de;background-color:#fff}.btn-group-vertical .btn.btn-flat:first-of-type,.btn-group-vertical .btn.btn-flat:last-of-type{border-radius:0}.icheck>label{padding-left:0}.form-control-feedback.fa{line-height:34px}.input-lg+.form-control-feedback.fa,.input-group-lg+.form-control-feedback.fa,.form-group-lg .form-control+.form-control-feedback.fa{line-height:46px}.input-sm+.form-control-feedback.fa,.input-group-sm+.form-control-feedback.fa,.form-group-sm .form-control+.form-control-feedback.fa{line-height:30px}.progress,.progress>.progress-bar{-webkit-box-shadow:none;box-shadow:none}.progress,.progress>.progress-bar,.progress .progress-bar,.progress>.progress-bar .progress-bar{border-radius:1px}.progress.sm,.progress-sm{height:10px}.progress.sm,.progress-sm,.progress.sm .progress-bar,.progress-sm .progress-bar{border-radius:1px}.progress.xs,.progress-xs{height:7px}.progress.xs,.progress-xs,.progress.xs .progress-bar,.progress-xs .progress-bar{border-radius:1px}.progress.xxs,.progress-xxs{height:3px}.progress.xxs,.progress-xxs,.progress.xxs .progress-bar,.progress-xxs .progress-bar{border-radius:1px}.progress.vertical{position:relative;width:30px;height:200px;display:inline-block;margin-right:10px}.progress.vertical>.progress-bar{width:100%;position:absolute;bottom:0}.progress.vertical.sm,.progress.vertical.progress-sm{width:20px}.progress.vertical.xs,.progress.vertical.progress-xs{width:10px}.progress.vertical.xxs,.progress.vertical.progress-xxs{width:3px}.progress-group .progress-text{font-weight:600}.progress-group .progress-number{float:right}.table tr>td .progress{margin:0}.progress-bar-light-blue,.progress-bar-primary{background-color:#3c8dbc}.progress-striped .progress-bar-light-blue,.progress-striped .progress-bar-primary{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-green,.progress-bar-success{background-color:#00a65a}.progress-striped .progress-bar-green,.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-aqua,.progress-bar-info{background-color:#00c0ef}.progress-striped .progress-bar-aqua,.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-yellow,.progress-bar-warning{background-color:#f39c12}.progress-striped .progress-bar-yellow,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-red,.progress-bar-danger{background-color:#dd4b39}.progress-striped .progress-bar-red,.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.small-box{border-radius:2px;position:relative;display:block;margin-bottom:20px;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.small-box>.inner{padding:10px}.small-box>.small-box-footer{position:relative;text-align:center;padding:3px 0;color:#fff;color:rgba(255,255,255,0.8);display:block;z-index:10;background:rgba(0,0,0,0.1);text-decoration:none}.small-box>.small-box-footer:hover{color:#fff;background:rgba(0,0,0,0.15)}.small-box h3{font-size:38px;font-weight:bold;margin:0 0 10px 0;white-space:nowrap;padding:0}.small-box p{font-size:15px}.small-box p>small{display:block;color:#f9f9f9;font-size:13px;margin-top:5px}.small-box h3,.small-box p{z-index:5px}.small-box .icon{-webkit-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;position:absolute;top:-10px;right:10px;z-index:0;font-size:90px;color:rgba(0,0,0,0.15)}.small-box:hover{text-decoration:none;color:#f9f9f9}.small-box:hover .icon{font-size:95px}@media (max-width:767px){.small-box{text-align:center}.small-box .icon{display:none}.small-box p{font-size:12px}}.box{position:relative;border-radius:3px;background:#ffffff;border-top:3px solid #d2d6de;margin-bottom:20px;width:100%;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.box.box-primary{border-top-color:#3c8dbc}.box.box-info{border-top-color:#00c0ef}.box.box-danger{border-top-color:#dd4b39}.box.box-warning{border-top-color:#f39c12}.box.box-success{border-top-color:#00a65a}.box.box-default{border-top-color:#d2d6de}.box.collapsed-box .box-body,.box.collapsed-box .box-footer{display:none}.box .nav-stacked>li{border-bottom:1px solid #f4f4f4;margin:0}.box .nav-stacked>li:last-of-type{border-bottom:none}.box.height-control .box-body{max-height:300px;overflow:auto}.box .border-right{border-right:1px solid #f4f4f4}.box .border-left{border-left:1px solid #f4f4f4}.box.box-solid{border-top:0}.box.box-solid>.box-header .btn.btn-default{background:transparent}.box.box-solid>.box-header .btn:hover,.box.box-solid>.box-header a:hover{background:rgba(0,0,0,0.1)}.box.box-solid.box-default{border:1px solid #d2d6de}.box.box-solid.box-default>.box-header{color:#444;background:#d2d6de;background-color:#d2d6de}.box.box-solid.box-default>.box-header a,.box.box-solid.box-default>.box-header .btn{color:#444}.box.box-solid.box-primary{border:1px solid #3c8dbc}.box.box-solid.box-primary>.box-header{color:#fff;background:#3c8dbc;background-color:#3c8dbc}.box.box-solid.box-primary>.box-header a,.box.box-solid.box-primary>.box-header .btn{color:#fff}.box.box-solid.box-info{border:1px solid #00c0ef}.box.box-solid.box-info>.box-header{color:#fff;background:#00c0ef;background-color:#00c0ef}.box.box-solid.box-info>.box-header a,.box.box-solid.box-info>.box-header .btn{color:#fff}.box.box-solid.box-danger{border:1px solid #dd4b39}.box.box-solid.box-danger>.box-header{color:#fff;background:#dd4b39;background-color:#dd4b39}.box.box-solid.box-danger>.box-header a,.box.box-solid.box-danger>.box-header .btn{color:#fff}.box.box-solid.box-warning{border:1px solid #f39c12}.box.box-solid.box-warning>.box-header{color:#fff;background:#f39c12;background-color:#f39c12}.box.box-solid.box-warning>.box-header a,.box.box-solid.box-warning>.box-header .btn{color:#fff}.box.box-solid.box-success{border:1px solid #00a65a}.box.box-solid.box-success>.box-header{color:#fff;background:#00a65a;background-color:#00a65a}.box.box-solid.box-success>.box-header a,.box.box-solid.box-success>.box-header .btn{color:#fff}.box.box-solid>.box-header>.box-tools .btn{border:0;box-shadow:none}.box.box-solid[class*='bg']>.box-header{color:#fff}.box .box-group>.box{margin-bottom:5px}.box .knob-label{text-align:center;color:#333;font-weight:100;font-size:12px;margin-bottom:0.3em}.box>.overlay,.overlay-wrapper>.overlay,.box>.loading-img,.overlay-wrapper>.loading-img{position:absolute;top:0;left:0;width:100%;height:100%}.box .overlay,.overlay-wrapper .overlay{z-index:50;background:rgba(255,255,255,0.7);border-radius:3px}.box .overlay>.fa,.overlay-wrapper .overlay>.fa{position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-15px;color:#000;font-size:30px}.box .overlay.dark,.overlay-wrapper .overlay.dark{background:rgba(0,0,0,0.5)}.box-header:before,.box-body:before,.box-footer:before,.box-header:after,.box-body:after,.box-footer:after{content:" ";display:table}.box-header:after,.box-body:after,.box-footer:after{clear:both}.box-header{color:#444;display:block;padding:10px;position:relative}.box-header.with-border{border-bottom:1px solid #f4f4f4}.collapsed-box .box-header.with-border{border-bottom:none}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion,.box-header .box-title{display:inline-block;font-size:18px;margin:0;line-height:1}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion{margin-right:5px}.box-header>.box-tools{position:absolute;right:10px;top:5px}.box-header>.box-tools [data-toggle="tooltip"]{position:relative}.box-header>.box-tools.pull-right .dropdown-menu{right:0;left:auto}.btn-box-tool{padding:5px;font-size:12px;background:transparent;color:#97a0b3}.open .btn-box-tool,.btn-box-tool:hover{color:#606c84}.btn-box-tool.btn:active{box-shadow:none}.box-body{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;padding:10px}.no-header .box-body{border-top-right-radius:3px;border-top-left-radius:3px}.box-body>.table{margin-bottom:0}.box-body .fc{margin-top:5px}.box-body .full-width-chart{margin:-19px}.box-body.no-padding .full-width-chart{margin:-9px}.box-body .box-pane{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:3px}.box-body .box-pane-right{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:0}.box-footer{border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border-top:1px solid #f4f4f4;padding:10px;background-color:#fff}.chart-legend{margin:10px 0}@media (max-width:991px){.chart-legend>li{float:left;margin-right:10px}}.box-comments{background:#f7f7f7}.box-comments .box-comment{padding:8px 0;border-bottom:1px solid #eee}.box-comments .box-comment:before,.box-comments .box-comment:after{content:" ";display:table}.box-comments .box-comment:after{clear:both}.box-comments .box-comment:last-of-type{border-bottom:0}.box-comments .box-comment:first-of-type{padding-top:0}.box-comments .box-comment img{float:left}.box-comments .comment-text{margin-left:40px;color:#555}.box-comments .username{color:#444;display:block;font-weight:600}.box-comments .text-muted{font-weight:400;font-size:12px}.todo-list{margin:0;padding:0;list-style:none;overflow:auto}.todo-list>li{border-radius:2px;padding:10px;background:#f4f4f4;margin-bottom:2px;border-left:2px solid #e6e7e8;color:#444}.todo-list>li:last-of-type{margin-bottom:0}.todo-list>li>input[type='checkbox']{margin:0 10px 0 5px}.todo-list>li .text{display:inline-block;margin-left:5px;font-weight:600}.todo-list>li .label{margin-left:10px;font-size:9px}.todo-list>li .tools{display:none;float:right;color:#dd4b39}.todo-list>li .tools>.fa,.todo-list>li .tools>.glyphicon,.todo-list>li .tools>.ion{margin-right:5px;cursor:pointer}.todo-list>li:hover .tools{display:inline-block}.todo-list>li.done{color:#999}.todo-list>li.done .text{text-decoration:line-through;font-weight:500}.todo-list>li.done .label{background:#d2d6de !important}.todo-list .danger{border-left-color:#dd4b39}.todo-list .warning{border-left-color:#f39c12}.todo-list .info{border-left-color:#00c0ef}.todo-list .success{border-left-color:#00a65a}.todo-list .primary{border-left-color:#3c8dbc}.todo-list .handle{display:inline-block;cursor:move;margin:0 5px}.chat{padding:5px 20px 5px 10px}.chat .item{margin-bottom:10px}.chat .item:before,.chat .item:after{content:" ";display:table}.chat .item:after{clear:both}.chat .item>img{width:40px;height:40px;border:2px solid transparent;border-radius:50%}.chat .item>.online{border:2px solid #00a65a}.chat .item>.offline{border:2px solid #dd4b39}.chat .item>.message{margin-left:55px;margin-top:-40px}.chat .item>.message>.name{display:block;font-weight:600}.chat .item>.attachment{border-radius:3px;background:#f4f4f4;margin-left:65px;margin-right:15px;padding:10px}.chat .item>.attachment>h4{margin:0 0 5px 0;font-weight:600;font-size:14px}.chat .item>.attachment>p,.chat .item>.attachment>.filename{font-weight:600;font-size:13px;font-style:italic;margin:0}.chat .item>.attachment:before,.chat .item>.attachment:after{content:" ";display:table}.chat .item>.attachment:after{clear:both}.box-input{max-width:200px}.modal .panel-body{color:#444}.info-box{display:block;min-height:90px;background:#fff;width:100%;box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:2px;margin-bottom:15px}.info-box small{font-size:14px}.info-box .progress{background:rgba(0,0,0,0.2);margin:5px -10px 5px -10px;height:2px}.info-box .progress,.info-box .progress .progress-bar{border-radius:0}.info-box .progress .progress-bar{background:#fff}.info-box-icon{border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px;display:block;float:left;height:90px;width:90px;text-align:center;font-size:45px;line-height:90px;background:rgba(0,0,0,0.2)}.info-box-icon>img{max-width:100%}.info-box-content{padding:5px 10px;margin-left:90px}.info-box-number{display:block;font-weight:bold;font-size:18px}.progress-description,.info-box-text{display:block;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.info-box-text{text-transform:uppercase}.info-box-more{display:block}.progress-description{margin:0}.timeline{position:relative;margin:0 0 30px 0;padding:0;list-style:none}.timeline:before{content:'';position:absolute;top:0;bottom:0;width:4px;background:#ddd;left:31px;margin:0;border-radius:2px}.timeline>li{position:relative;margin-right:10px;margin-bottom:15px}.timeline>li:before,.timeline>li:after{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li>.timeline-item{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;margin-top:0;background:#fff;color:#444;margin-left:60px;margin-right:15px;padding:0;position:relative}.timeline>li>.timeline-item>.time{color:#999;float:right;padding:10px;font-size:12px}.timeline>li>.timeline-item>.timeline-header{margin:0;color:#555;border-bottom:1px solid #f4f4f4;padding:10px;font-size:16px;line-height:1.1}.timeline>li>.timeline-item>.timeline-header>a{font-weight:600}.timeline>li>.timeline-item>.timeline-body,.timeline>li>.timeline-item>.timeline-footer{padding:10px}.timeline>li>.fa,.timeline>li>.glyphicon,.timeline>li>.ion{width:30px;height:30px;font-size:15px;line-height:30px;position:absolute;color:#666;background:#d2d6de;border-radius:50%;text-align:center;left:18px;top:0}.timeline>.time-label>span{font-weight:600;padding:5px;display:inline-block;background-color:#fff;border-radius:4px}.timeline-inverse>li>.timeline-item{background:#f0f0f0;border:1px solid #ddd;-webkit-box-shadow:none;box-shadow:none}.timeline-inverse>li>.timeline-item>.timeline-header{border-bottom-color:#ddd}.btn{border-radius:3px;-webkit-box-shadow:none;box-shadow:none;border:1px solid transparent}.btn.uppercase{text-transform:uppercase}.btn.btn-flat{border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border-width:1px}.btn:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:focus{outline:none}.btn.btn-file{position:relative;overflow:hidden}.btn.btn-file>input[type='file']{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;opacity:0;filter:alpha(opacity=0);outline:none;background:white;cursor:inherit;display:block}.btn-default{background-color:#f4f4f4;color:#444;border-color:#ddd}.btn-default:hover,.btn-default:active,.btn-default.hover{background-color:#e7e7e7}.btn-primary{background-color:#3c8dbc;border-color:#367fa9}.btn-primary:hover,.btn-primary:active,.btn-primary.hover{background-color:#367fa9}.btn-success{background-color:#00a65a;border-color:#008d4c}.btn-success:hover,.btn-success:active,.btn-success.hover{background-color:#008d4c}.btn-info{background-color:#00c0ef;border-color:#00acd6}.btn-info:hover,.btn-info:active,.btn-info.hover{background-color:#00acd6}.btn-danger{background-color:#dd4b39;border-color:#d73925}.btn-danger:hover,.btn-danger:active,.btn-danger.hover{background-color:#d73925}.btn-warning{background-color:#f39c12;border-color:#e08e0b}.btn-warning:hover,.btn-warning:active,.btn-warning.hover{background-color:#e08e0b}.btn-outline{border:1px solid #fff;background:transparent;color:#fff}.btn-outline:hover,.btn-outline:focus,.btn-outline:active{color:rgba(255,255,255,0.7);border-color:rgba(255,255,255,0.7)}.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn[class*='bg-']:hover{-webkit-box-shadow:inset 0 0 100px rgba(0,0,0,0.2);box-shadow:inset 0 0 100px rgba(0,0,0,0.2)}.btn-app{border-radius:3px;position:relative;padding:15px 5px;margin:0 0 10px 10px;min-width:80px;height:60px;text-align:center;color:#666;border:1px solid #ddd;background-color:#f4f4f4;font-size:12px}.btn-app>.fa,.btn-app>.glyphicon,.btn-app>.ion{font-size:20px;display:block}.btn-app:hover{background:#f4f4f4;color:#444;border-color:#aaa}.btn-app:active,.btn-app:focus{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-app>.badge{position:absolute;top:-3px;right:-10px;font-size:10px;font-weight:400}.callout{border-radius:3px;margin:0 0 20px 0;padding:15px 30px 15px 15px;border-left:5px solid #eee}.callout a{color:#fff;text-decoration:underline}.callout a:hover{color:#eee}.callout h4{margin-top:0;font-weight:600}.callout p:last-child{margin-bottom:0}.callout code,.callout .highlight{background-color:#fff}.callout.callout-danger{border-color:#c23321}.callout.callout-warning{border-color:#c87f0a}.callout.callout-info{border-color:#0097bc}.callout.callout-success{border-color:#00733e}.alert{border-radius:3px}.alert h4{font-weight:600}.alert .icon{margin-right:10px}.alert .close{color:#000;opacity:.2;filter:alpha(opacity=20)}.alert .close:hover{opacity:.5;filter:alpha(opacity=50)}.alert a{color:#fff;text-decoration:underline}.alert-success{border-color:#008d4c}.alert-danger,.alert-error{border-color:#d73925}.alert-warning{border-color:#e08e0b}.alert-info{border-color:#00acd6}.nav>li>a:hover,.nav>li>a:active,.nav>li>a:focus{color:#444;background:#f7f7f7}.nav-pills>li>a{border-radius:0;border-top:3px solid transparent;color:#444}.nav-pills>li>a>.fa,.nav-pills>li>a>.glyphicon,.nav-pills>li>a>.ion{margin-right:5px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{border-top-color:#3c8dbc}.nav-pills>li.active>a{font-weight:600}.nav-stacked>li>a{border-radius:0;border-top:0;border-left:3px solid transparent;color:#444}.nav-stacked>li.active>a,.nav-stacked>li.active>a:hover{background:transparent;color:#444;border-top:0;border-left-color:#3c8dbc}.nav-stacked>li.header{border-bottom:1px solid #ddd;color:#777;margin-bottom:10px;padding:5px 10px;text-transform:uppercase}.nav-tabs-custom{margin-bottom:20px;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px}.nav-tabs-custom>.nav-tabs{margin:0;border-bottom-color:#f4f4f4;border-top-right-radius:3px;border-top-left-radius:3px}.nav-tabs-custom>.nav-tabs>li{border-top:3px solid transparent;margin-bottom:-2px;margin-right:5px}.nav-tabs-custom>.nav-tabs>li>a{color:#444;border-radius:0}.nav-tabs-custom>.nav-tabs>li>a.text-muted{color:#999}.nav-tabs-custom>.nav-tabs>li>a,.nav-tabs-custom>.nav-tabs>li>a:hover{background:transparent;margin:0}.nav-tabs-custom>.nav-tabs>li>a:hover{color:#999}.nav-tabs-custom>.nav-tabs>li:not(.active)>a:hover,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:focus,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:active{border-color:transparent}.nav-tabs-custom>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom>.nav-tabs>li.active>a,.nav-tabs-custom>.nav-tabs>li.active:hover>a{background-color:#fff;color:#444}.nav-tabs-custom>.nav-tabs>li.active>a{border-top-color:transparent;border-left-color:#f4f4f4;border-right-color:#f4f4f4}.nav-tabs-custom>.nav-tabs>li:first-of-type{margin-left:0}.nav-tabs-custom>.nav-tabs>li:first-of-type.active>a{border-left-color:transparent}.nav-tabs-custom>.nav-tabs.pull-right{float:none!important}.nav-tabs-custom>.nav-tabs.pull-right>li{float:right}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type{margin-right:0}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type>a{border-left-width:1px}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type.active>a{border-left-color:#f4f4f4;border-right-color:transparent}.nav-tabs-custom>.nav-tabs>li.header{line-height:35px;padding:0 10px;font-size:20px;color:#444}.nav-tabs-custom>.nav-tabs>li.header>.fa,.nav-tabs-custom>.nav-tabs>li.header>.glyphicon,.nav-tabs-custom>.nav-tabs>li.header>.ion{margin-right:5px}.nav-tabs-custom>.tab-content{background:#fff;padding:10px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.nav-tabs-custom .dropdown.open>a:active,.nav-tabs-custom .dropdown.open>a:focus{background:transparent;color:#999}.pagination>li>a{background:#fafafa;color:#666}.pagination.pagination-flat>li>a{border-radius:0 !important}.products-list{list-style:none;margin:0;padding:0}.products-list>.item{border-radius:3px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1);padding:10px 0;background:#fff}.products-list>.item:before,.products-list>.item:after{content:" ";display:table}.products-list>.item:after{clear:both}.products-list .product-img{float:left}.products-list .product-img img{width:50px;height:50px}.products-list .product-info{margin-left:60px}.products-list .product-title{font-weight:600}.products-list .product-description{display:block;color:#999;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.product-list-in-box>.item{-webkit-box-shadow:none;box-shadow:none;border-radius:0;border-bottom:1px solid #f4f4f4}.product-list-in-box>.item:last-of-type{border-bottom-width:0}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{border-top:1px solid #f4f4f4}.table>thead>tr>th{border-bottom:2px solid #f4f4f4}.table tr td .progress{margin-top:5px}.table-bordered{border:1px solid #f4f4f4}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #f4f4f4}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table.no-border,.table.no-border td,.table.no-border th{border:0}table.text-center,table.text-center td,table.text-center th{text-align:center}.table.align th{text-align:left}.table.align td{text-align:right}.label-default{background-color:#d2d6de;color:#444}.direct-chat .box-body{border-bottom-right-radius:0;border-bottom-left-radius:0;position:relative;overflow-x:hidden;padding:0}.direct-chat.chat-pane-open .direct-chat-contacts{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.direct-chat-messages{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0);padding:10px;height:250px;overflow:auto}.direct-chat-msg,.direct-chat-text{display:block}.direct-chat-msg{margin-bottom:10px}.direct-chat-msg:before,.direct-chat-msg:after{content:" ";display:table}.direct-chat-msg:after{clear:both}.direct-chat-messages,.direct-chat-contacts{-webkit-transition:-webkit-transform .5s ease-in-out;-moz-transition:-moz-transform .5s ease-in-out;-o-transition:-o-transform .5s ease-in-out;transition:transform .5s ease-in-out}.direct-chat-text{border-radius:5px;position:relative;padding:5px 10px;background:#d2d6de;border:1px solid #d2d6de;margin:5px 0 0 50px;color:#444}.direct-chat-text:after,.direct-chat-text:before{position:absolute;right:100%;top:15px;border:solid transparent;border-right-color:#d2d6de;content:' ';height:0;width:0;pointer-events:none}.direct-chat-text:after{border-width:5px;margin-top:-5px}.direct-chat-text:before{border-width:6px;margin-top:-6px}.right .direct-chat-text{margin-right:50px;margin-left:0}.right .direct-chat-text:after,.right .direct-chat-text:before{right:auto;left:100%;border-right-color:transparent;border-left-color:#d2d6de}.direct-chat-img{border-radius:50%;float:left;width:40px;height:40px}.right .direct-chat-img{float:right}.direct-chat-info{display:block;margin-bottom:2px;font-size:12px}.direct-chat-name{font-weight:600}.direct-chat-timestamp{color:#999}.direct-chat-contacts-open .direct-chat-contacts{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.direct-chat-contacts{-webkit-transform:translate(101%, 0);-ms-transform:translate(101%, 0);-o-transform:translate(101%, 0);transform:translate(101%, 0);position:absolute;top:0;bottom:0;height:250px;width:100%;background:#222d32;color:#fff;overflow:auto}.contacts-list>li{border-bottom:1px solid rgba(0,0,0,0.2);padding:10px;margin:0}.contacts-list>li:before,.contacts-list>li:after{content:" ";display:table}.contacts-list>li:after{clear:both}.contacts-list>li:last-of-type{border-bottom:none}.contacts-list-img{border-radius:50%;width:40px;float:left}.contacts-list-info{margin-left:45px;color:#fff}.contacts-list-name,.contacts-list-status{display:block}.contacts-list-name{font-weight:600}.contacts-list-status{font-size:12px}.contacts-list-date{color:#aaa;font-weight:normal}.contacts-list-msg{color:#999}.direct-chat-danger .right>.direct-chat-text{background:#dd4b39;border-color:#dd4b39;color:#fff}.direct-chat-danger .right>.direct-chat-text:after,.direct-chat-danger .right>.direct-chat-text:before{border-left-color:#dd4b39}.direct-chat-primary .right>.direct-chat-text{background:#3c8dbc;border-color:#3c8dbc;color:#fff}.direct-chat-primary .right>.direct-chat-text:after,.direct-chat-primary .right>.direct-chat-text:before{border-left-color:#3c8dbc}.direct-chat-warning .right>.direct-chat-text{background:#f39c12;border-color:#f39c12;color:#fff}.direct-chat-warning .right>.direct-chat-text:after,.direct-chat-warning .right>.direct-chat-text:before{border-left-color:#f39c12}.direct-chat-info .right>.direct-chat-text{background:#00c0ef;border-color:#00c0ef;color:#fff}.direct-chat-info .right>.direct-chat-text:after,.direct-chat-info .right>.direct-chat-text:before{border-left-color:#00c0ef}.direct-chat-success .right>.direct-chat-text{background:#00a65a;border-color:#00a65a;color:#fff}.direct-chat-success .right>.direct-chat-text:after,.direct-chat-success .right>.direct-chat-text:before{border-left-color:#00a65a}.users-list>li{width:25%;float:left;padding:10px;text-align:center}.users-list>li img{border-radius:50%;max-width:100%;height:auto}.users-list>li>a:hover,.users-list>li>a:hover .users-list-name{color:#999}.users-list-name,.users-list-date{display:block}.users-list-name{font-weight:600;color:#444;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.users-list-date{color:#999;font-size:12px}.carousel-control.left,.carousel-control.right{background-image:none}.carousel-control>.fa{font-size:40px;position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-20px}.modal{background:rgba(0,0,0,0.3)}.modal-content{border-radius:0;-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125);border:0}@media (min-width:768px){.modal-content{-webkit-box-shadow:0 2px 3px rgba(0,0,0,0.125);box-shadow:0 2px 3px rgba(0,0,0,0.125)}}.modal-header{border-bottom-color:#f4f4f4}.modal-footer{border-top-color:#f4f4f4}.modal-primary .modal-header,.modal-primary .modal-footer{border-color:#307095}.modal-warning .modal-header,.modal-warning .modal-footer{border-color:#c87f0a}.modal-info .modal-header,.modal-info .modal-footer{border-color:#0097bc}.modal-success .modal-header,.modal-success .modal-footer{border-color:#00733e}.modal-danger .modal-header,.modal-danger .modal-footer{border-color:#c23321}.box-widget{border:none;position:relative}.widget-user .widget-user-header{padding:20px;height:120px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user .widget-user-username{margin-top:0;margin-bottom:5px;font-size:25px;font-weight:300;text-shadow:0 1px 1px rgba(0,0,0,0.2)}.widget-user .widget-user-desc{margin-top:0}.widget-user .widget-user-image{position:absolute;top:65px;left:50%;margin-left:-45px}.widget-user .widget-user-image>img{width:90px;height:auto;border:3px solid #fff}.widget-user .box-footer{padding-top:30px}.widget-user-2 .widget-user-header{padding:20px;border-top-right-radius:3px;border-top-left-radius:3px}.widget-user-2 .widget-user-username{margin-top:5px;margin-bottom:5px;font-size:25px;font-weight:300}.widget-user-2 .widget-user-desc{margin-top:0}.widget-user-2 .widget-user-username,.widget-user-2 .widget-user-desc{margin-left:75px}.widget-user-2 .widget-user-image>img{width:65px;height:auto;float:left}.mailbox-messages>.table{margin:0}.mailbox-controls{padding:5px}.mailbox-controls.with-border{border-bottom:1px solid #f4f4f4}.mailbox-read-info{border-bottom:1px solid #f4f4f4;padding:10px}.mailbox-read-info h3{font-size:20px;margin:0}.mailbox-read-info h5{margin:0;padding:5px 0 0 0}.mailbox-read-time{color:#999;font-size:13px}.mailbox-read-message{padding:10px}.mailbox-attachments li{float:left;width:200px;border:1px solid #eee;margin-bottom:10px;margin-right:10px}.mailbox-attachment-name{font-weight:bold;color:#666}.mailbox-attachment-icon,.mailbox-attachment-info,.mailbox-attachment-size{display:block}.mailbox-attachment-info{padding:10px;background:#f4f4f4}.mailbox-attachment-size{color:#999;font-size:12px}.mailbox-attachment-icon{text-align:center;font-size:65px;color:#666;padding:20px 10px}.mailbox-attachment-icon.has-img{padding:0}.mailbox-attachment-icon.has-img>img{max-width:100%;height:auto}.lockscreen{background:#d2d6de}.lockscreen-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.lockscreen-logo a{color:#444}.lockscreen-wrapper{max-width:400px;margin:0 auto;margin-top:10%}.lockscreen .lockscreen-name{text-align:center;font-weight:600}.lockscreen-item{border-radius:4px;padding:0;background:#fff;position:relative;margin:10px auto 30px auto;width:290px}.lockscreen-image{border-radius:50%;position:absolute;left:-10px;top:-25px;background:#fff;padding:5px;z-index:10}.lockscreen-image>img{border-radius:50%;width:70px;height:70px}.lockscreen-credentials{margin-left:70px}.lockscreen-credentials .form-control{border:0}.lockscreen-credentials .btn{background-color:#fff;border:0;padding:0 10px}.lockscreen-footer{margin-top:10px}.login-logo,.register-logo{font-size:35px;text-align:center;margin-bottom:25px;font-weight:300}.login-logo a,.register-logo a{color:#444}.login-page,.register-page{background:#d2d6de}.login-box,.register-box{width:360px;margin:7% auto}@media (max-width:768px){.login-box,.register-box{width:90%;margin-top:20px}}.login-box-body,.register-box-body{background:#fff;padding:20px;border-top:0;color:#666}.login-box-body .form-control-feedback,.register-box-body .form-control-feedback{color:#777}.login-box-msg,.register-box-msg{margin:0;text-align:center;padding:0 20px 20px 20px}.social-auth-links{margin:10px 0}.error-page{width:600px;margin:20px auto 0 auto}@media (max-width:991px){.error-page{width:100%}}.error-page>.headline{float:left;font-size:100px;font-weight:300}@media (max-width:991px){.error-page>.headline{float:none;text-align:center}}.error-page>.error-content{margin-left:190px;display:block}@media (max-width:991px){.error-page>.error-content{margin-left:0}}.error-page>.error-content>h3{font-weight:300;font-size:25px}@media (max-width:991px){.error-page>.error-content>h3{text-align:center}}.invoice{position:relative;background:#fff;border:1px solid #f4f4f4;padding:20px;margin:10px 25px}.invoice-title{margin-top:0}.profile-user-img{margin:0 auto;width:100px;padding:3px;border:3px solid #d2d6de}.profile-username{font-size:21px;margin-top:5px}.post{border-bottom:1px solid #d2d6de;margin-bottom:15px;padding-bottom:15px;color:#666}.post:last-of-type{border-bottom:0;margin-bottom:0;padding-bottom:0}.post .user-block{margin-bottom:15px}.btn-social{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.btn-social>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social.btn-lg{padding-left:61px}.btn-social.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social.btn-sm{padding-left:38px}.btn-social.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social.btn-xs{padding-left:30px}.btn-social.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:34px;width:34px;padding:0}.btn-social-icon>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}.btn-social-icon.btn-lg{padding-left:61px}.btn-social-icon.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}.btn-social-icon.btn-sm{padding-left:38px}.btn-social-icon.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}.btn-social-icon.btn-xs{padding-left:30px}.btn-social-icon.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}.btn-social-icon>:first-child{border:none;text-align:center;width:100%}.btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0}.btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0}.btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0}.btn-adn{color:#fff;background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn:hover,.btn-adn:focus,.btn-adn.focus,.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{background-image:none}.btn-adn .badge{color:#d87a68;background-color:#fff}.btn-bitbucket{color:#fff;background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:hover,.btn-bitbucket:focus,.btn-bitbucket.focus,.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{background-image:none}.btn-bitbucket .badge{color:#205081;background-color:#fff}.btn-dropbox{color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox:hover,.btn-dropbox:focus,.btn-dropbox.focus,.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{background-image:none}.btn-dropbox .badge{color:#1087dd;background-color:#fff}.btn-facebook{color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook:hover,.btn-facebook:focus,.btn-facebook.focus,.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{background-image:none}.btn-facebook .badge{color:#3b5998;background-color:#fff}.btn-flickr{color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr:hover,.btn-flickr:focus,.btn-flickr.focus,.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{background-image:none}.btn-flickr .badge{color:#ff0084;background-color:#fff}.btn-foursquare{color:#fff;background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare:hover,.btn-foursquare:focus,.btn-foursquare.focus,.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{background-image:none}.btn-foursquare .badge{color:#f94877;background-color:#fff}.btn-github{color:#fff;background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github:hover,.btn-github:focus,.btn-github.focus,.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{background-image:none}.btn-github .badge{color:#444;background-color:#fff}.btn-google{color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google:hover,.btn-google:focus,.btn-google.focus,.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{background-image:none}.btn-google .badge{color:#dd4b39;background-color:#fff}.btn-instagram{color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram:hover,.btn-instagram:focus,.btn-instagram.focus,.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{background-image:none}.btn-instagram .badge{color:#3f729b;background-color:#fff}.btn-linkedin{color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin:hover,.btn-linkedin:focus,.btn-linkedin.focus,.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{background-image:none}.btn-linkedin .badge{color:#007bb6;background-color:#fff}.btn-microsoft{color:#fff;background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft:hover,.btn-microsoft:focus,.btn-microsoft.focus,.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{background-image:none}.btn-microsoft .badge{color:#2672ec;background-color:#fff}.btn-openid{color:#fff;background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid:hover,.btn-openid:focus,.btn-openid.focus,.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{background-image:none}.btn-openid .badge{color:#f7931e;background-color:#fff}.btn-pinterest{color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest:hover,.btn-pinterest:focus,.btn-pinterest.focus,.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{background-image:none}.btn-pinterest .badge{color:#cb2027;background-color:#fff}.btn-reddit{color:#000;background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit:hover,.btn-reddit:focus,.btn-reddit.focus,.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{background-image:none}.btn-reddit .badge{color:#eff7ff;background-color:#000}.btn-soundcloud{color:#fff;background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:hover,.btn-soundcloud:focus,.btn-soundcloud.focus,.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{background-image:none}.btn-soundcloud .badge{color:#f50;background-color:#fff}.btn-tumblr{color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr:hover,.btn-tumblr:focus,.btn-tumblr.focus,.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{background-image:none}.btn-tumblr .badge{color:#2c4762;background-color:#fff}.btn-twitter{color:#fff;background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter:hover,.btn-twitter:focus,.btn-twitter.focus,.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{background-image:none}.btn-twitter .badge{color:#55acee;background-color:#fff}.btn-vimeo{color:#fff;background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo:hover,.btn-vimeo:focus,.btn-vimeo.focus,.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{background-image:none}.btn-vimeo .badge{color:#1ab7ea;background-color:#fff}.btn-vk{color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk:hover,.btn-vk:focus,.btn-vk.focus,.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{background-image:none}.btn-vk .badge{color:#587ea3;background-color:#fff}.btn-yahoo{color:#fff;background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:hover,.btn-yahoo:focus,.btn-yahoo.focus,.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{background-image:none}.btn-yahoo .badge{color:#720e9e;background-color:#fff}.fc-button{background:#f4f4f4;background-image:none;color:#444;border-color:#ddd;border-bottom-color:#ddd}.fc-button:hover,.fc-button:active,.fc-button.hover{background-color:#e9e9e9}.fc-header-title h2{font-size:15px;line-height:1.6em;color:#666;margin-left:10px}.fc-header-right{padding-right:10px}.fc-header-left{padding-left:10px}.fc-widget-header{background:#fafafa}.fc-grid{width:100%;border:0}.fc-widget-header:first-of-type,.fc-widget-content:first-of-type{border-left:0;border-right:0}.fc-widget-header:last-of-type,.fc-widget-content:last-of-type{border-right:0}.fc-toolbar{padding:10px;margin:0}.fc-day-number{font-size:20px;font-weight:300;padding-right:10px}.fc-color-picker{list-style:none;margin:0;padding:0}.fc-color-picker>li{float:left;font-size:30px;margin-right:5px;line-height:30px}.fc-color-picker>li .fa{-webkit-transition:-webkit-transform linear .3s;-moz-transition:-moz-transform linear .3s;-o-transition:-o-transform linear .3s;transition:transform linear .3s}.fc-color-picker>li .fa:hover{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);-o-transform:rotate(30deg);transform:rotate(30deg)}#add-new-event{-webkit-transition:all linear .3s;-o-transition:all linear .3s;transition:all linear .3s}.external-event{padding:5px 10px;font-weight:bold;margin-bottom:4px;box-shadow:0 1px 1px rgba(0,0,0,0.1);text-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;cursor:move}.external-event:hover{box-shadow:inset 0 0 90px rgba(0,0,0,0.2)}.select2-container--default.select2-container--focus,.select2-selection.select2-container--focus,.select2-container--default:focus,.select2-selection:focus,.select2-container--default:active,.select2-selection:active{outline:none}.select2-container--default .select2-selection--single,.select2-selection .select2-selection--single{border:1px solid #d2d6de;border-radius:0;padding:6px 12px;height:34px}.select2-container--default.select2-container--open{border-color:#3c8dbc}.select2-dropdown{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#3c8dbc;color:white}.select2-results__option{padding:6px 12px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{padding-left:0;padding-right:0;height:auto;margin-top:-4px}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:6px;padding-left:20px}.select2-container--default .select2-selection--single .select2-selection__arrow{height:28px;right:3px}.select2-container--default .select2-selection--single .select2-selection__arrow b{margin-top:0}.select2-dropdown .select2-search__field,.select2-search--inline .select2-search__field{border:1px solid #d2d6de}.select2-dropdown .select2-search__field:focus,.select2-search--inline .select2-search__field:focus{outline:none;border:1px solid #3c8dbc}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[aria-selected=true]:hover{color:#444}.select2-container--default .select2-selection--multiple{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-selection--multiple:focus{border-color:#3c8dbc}.select2-container--default.select2-container--focus .select2-selection--multiple{border-color:#d2d6de}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#3c8dbc;border-color:#367fa9;padding:1px 10px;color:#fff}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{margin-right:5px;color:rgba(255,255,255,0.7)}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#fff}.select2-container .select2-selection--single .select2-selection__rendered{padding-right:10px}.pad{padding:10px}.margin{margin:10px}.margin-bottom{margin-bottom:20px}.margin-bottom-none{margin-bottom:0}.margin-r-5{margin-right:5px}.inline{display:inline}.description-block{display:block;margin:10px 0;text-align:center}.description-block.margin-bottom{margin-bottom:25px}.description-block>.description-header{margin:0;padding:0;font-weight:600;font-size:16px}.description-block>.description-text{text-transform:uppercase}.bg-red,.bg-yellow,.bg-aqua,.bg-blue,.bg-light-blue,.bg-green,.bg-navy,.bg-teal,.bg-olive,.bg-lime,.bg-orange,.bg-fuchsia,.bg-purple,.bg-maroon,.bg-black,.bg-red-active,.bg-yellow-active,.bg-aqua-active,.bg-blue-active,.bg-light-blue-active,.bg-green-active,.bg-navy-active,.bg-teal-active,.bg-olive-active,.bg-lime-active,.bg-orange-active,.bg-fuchsia-active,.bg-purple-active,.bg-maroon-active,.bg-black-active,.callout.callout-danger,.callout.callout-warning,.callout.callout-info,.callout.callout-success,.alert-success,.alert-danger,.alert-error,.alert-warning,.alert-info,.label-danger,.label-info,.label-warning,.label-primary,.label-success,.modal-primary .modal-body,.modal-primary .modal-header,.modal-primary .modal-footer,.modal-warning .modal-body,.modal-warning .modal-header,.modal-warning .modal-footer,.modal-info .modal-body,.modal-info .modal-header,.modal-info .modal-footer,.modal-success .modal-body,.modal-success .modal-header,.modal-success .modal-footer,.modal-danger .modal-body,.modal-danger .modal-header,.modal-danger .modal-footer{color:#fff !important}.bg-gray{color:#000;background-color:#d2d6de !important}.bg-gray-light{background-color:#f7f7f7}.bg-black{background-color:#111 !important}.bg-red,.callout.callout-danger,.alert-danger,.alert-error,.label-danger,.modal-danger .modal-body{background-color:#dd4b39 !important}.bg-yellow,.callout.callout-warning,.alert-warning,.label-warning,.modal-warning .modal-body{background-color:#f39c12 !important}.bg-aqua,.callout.callout-info,.alert-info,.label-info,.modal-info .modal-body{background-color:#00c0ef !important}.bg-blue{background-color:#0073b7 !important}.bg-light-blue,.label-primary,.modal-primary .modal-body{background-color:#3c8dbc !important}.bg-green,.callout.callout-success,.alert-success,.label-success,.modal-success .modal-body{background-color:#00a65a !important}.bg-navy{background-color:#001f3f !important}.bg-teal{background-color:#39cccc !important}.bg-olive{background-color:#3d9970 !important}.bg-lime{background-color:#01ff70 !important}.bg-orange{background-color:#ff851b !important}.bg-fuchsia{background-color:#f012be !important}.bg-purple{background-color:#605ca8 !important}.bg-maroon{background-color:#d81b60 !important}.bg-gray-active{color:#000;background-color:#b5bbc8 !important}.bg-black-active{background-color:#000 !important}.bg-red-active,.modal-danger .modal-header,.modal-danger .modal-footer{background-color:#d33724 !important}.bg-yellow-active,.modal-warning .modal-header,.modal-warning .modal-footer{background-color:#db8b0b !important}.bg-aqua-active,.modal-info .modal-header,.modal-info .modal-footer{background-color:#00a7d0 !important}.bg-blue-active{background-color:#005384 !important}.bg-light-blue-active,.modal-primary .modal-header,.modal-primary .modal-footer{background-color:#357ca5 !important}.bg-green-active,.modal-success .modal-header,.modal-success .modal-footer{background-color:#008d4c !important}.bg-navy-active{background-color:#001a35 !important}.bg-teal-active{background-color:#30bbbb !important}.bg-olive-active{background-color:#368763 !important}.bg-lime-active{background-color:#00e765 !important}.bg-orange-active{background-color:#ff7701 !important}.bg-fuchsia-active{background-color:#db0ead !important}.bg-purple-active{background-color:#555299 !important}.bg-maroon-active{background-color:#ca195a !important}[class^="bg-"].disabled{opacity:.65;filter:alpha(opacity=65)}.text-red{color:#dd4b39 !important}.text-yellow{color:#f39c12 !important}.text-aqua{color:#00c0ef !important}.text-blue{color:#0073b7 !important}.text-black{color:#111 !important}.text-light-blue{color:#3c8dbc !important}.text-green{color:#00a65a !important}.text-gray{color:#d2d6de !important}.text-navy{color:#001f3f !important}.text-teal{color:#39cccc !important}.text-olive{color:#3d9970 !important}.text-lime{color:#01ff70 !important}.text-orange{color:#ff851b !important}.text-fuchsia{color:#f012be !important}.text-purple{color:#605ca8 !important}.text-maroon{color:#d81b60 !important}.link-muted{color:#7a869d}.link-muted:hover,.link-muted:focus{color:#606c84}.link-black{color:#666}.link-black:hover,.link-black:focus{color:#999}.hide{display:none !important}.no-border{border:0 !important}.no-padding{padding:0 !important}.no-margin{margin:0 !important}.no-shadow{box-shadow:none!important}.list-unstyled,.chart-legend,.contacts-list,.users-list,.mailbox-attachments{list-style:none;margin:0;padding:0}.list-group-unbordered>.list-group-item{border-left:0;border-right:0;border-radius:0;padding-left:0;padding-right:0}.flat{border-radius:0 !important}.text-bold,.text-bold.table td,.text-bold.table th{font-weight:700}.text-sm{font-size:12px}.jqstooltip{padding:5px!important;width:auto!important;height:auto!important}.bg-teal-gradient{background:#39cccc !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #39cccc), color-stop(1, #7adddd)) !important;background:-ms-linear-gradient(bottom, #39cccc, #7adddd) !important;background:-moz-linear-gradient(center bottom, #39cccc 0, #7adddd 100%) !important;background:-o-linear-gradient(#7adddd, #39cccc) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39cccc', GradientType=0) !important;color:#fff}.bg-light-blue-gradient{background:#3c8dbc !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #3c8dbc), color-stop(1, #67a8ce)) !important;background:-ms-linear-gradient(bottom, #3c8dbc, #67a8ce) !important;background:-moz-linear-gradient(center bottom, #3c8dbc 0, #67a8ce 100%) !important;background:-o-linear-gradient(#67a8ce, #3c8dbc) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0) !important;color:#fff}.bg-blue-gradient{background:#0073b7 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #0073b7), color-stop(1, #0089db)) !important;background:-ms-linear-gradient(bottom, #0073b7, #0089db) !important;background:-moz-linear-gradient(center bottom, #0073b7 0, #0089db 100%) !important;background:-o-linear-gradient(#0089db, #0073b7) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0) !important;color:#fff}.bg-aqua-gradient{background:#00c0ef !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #00c0ef), color-stop(1, #14d1ff)) !important;background:-ms-linear-gradient(bottom, #00c0ef, #14d1ff) !important;background:-moz-linear-gradient(center bottom, #00c0ef 0, #14d1ff 100%) !important;background:-o-linear-gradient(#14d1ff, #00c0ef) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0) !important;color:#fff}.bg-yellow-gradient{background:#f39c12 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #f39c12), color-stop(1, #f7bc60)) !important;background:-ms-linear-gradient(bottom, #f39c12, #f7bc60) !important;background:-moz-linear-gradient(center bottom, #f39c12 0, #f7bc60 100%) !important;background:-o-linear-gradient(#f7bc60, #f39c12) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f7bc60', endColorstr='#f39c12', GradientType=0) !important;color:#fff}.bg-purple-gradient{background:#605ca8 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #605ca8), color-stop(1, #9491c4)) !important;background:-ms-linear-gradient(bottom, #605ca8, #9491c4) !important;background:-moz-linear-gradient(center bottom, #605ca8 0, #9491c4 100%) !important;background:-o-linear-gradient(#9491c4, #605ca8) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0) !important;color:#fff}.bg-green-gradient{background:#00a65a !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #00a65a), color-stop(1, #00ca6d)) !important;background:-ms-linear-gradient(bottom, #00a65a, #00ca6d) !important;background:-moz-linear-gradient(center bottom, #00a65a 0, #00ca6d 100%) !important;background:-o-linear-gradient(#00ca6d, #00a65a) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0) !important;color:#fff}.bg-red-gradient{background:#dd4b39 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #dd4b39), color-stop(1, #e47365)) !important;background:-ms-linear-gradient(bottom, #dd4b39, #e47365) !important;background:-moz-linear-gradient(center bottom, #dd4b39 0, #e47365 100%) !important;background:-o-linear-gradient(#e47365, #dd4b39) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0) !important;color:#fff}.bg-black-gradient{background:#111 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #111), color-stop(1, #2b2b2b)) !important;background:-ms-linear-gradient(bottom, #111, #2b2b2b) !important;background:-moz-linear-gradient(center bottom, #111 0, #2b2b2b 100%) !important;background:-o-linear-gradient(#2b2b2b, #111) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111111', GradientType=0) !important;color:#fff}.bg-maroon-gradient{background:#d81b60 !important;background:-webkit-gradient(linear, left bottom, left top, color-stop(0, #d81b60), color-stop(1, #e73f7c)) !important;background:-ms-linear-gradient(bottom, #d81b60, #e73f7c) !important;background:-moz-linear-gradient(center bottom, #d81b60 0, #e73f7c 100%) !important;background:-o-linear-gradient(#e73f7c, #d81b60) !important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#d81b60', GradientType=0) !important;color:#fff}.description-block .description-icon{font-size:16px}.no-pad-top{padding-top:0}.position-static{position:static!important}.list-header{font-size:15px;padding:10px 4px;font-weight:bold;color:#666}.list-seperator{height:1px;background:#f4f4f4;margin:15px 0 9px 0}.list-link>a{padding:4px;color:#777}.list-link>a:hover{color:#222}.font-light{font-weight:300}.user-block:before,.user-block:after{content:" ";display:table}.user-block:after{clear:both}.user-block img{width:40px;height:40px;float:left}.user-block .username,.user-block .description,.user-block .comment{display:block;margin-left:50px}.user-block .username{font-size:16px;font-weight:600}.user-block .description{color:#999;font-size:13px}.user-block.user-block-sm .username,.user-block.user-block-sm .description,.user-block.user-block-sm .comment{margin-left:40px}.user-block.user-block-sm .username{font-size:14px}.img-sm,.img-md,.img-lg,.box-comments .box-comment img,.user-block.user-block-sm img{float:left}.img-sm,.box-comments .box-comment img,.user-block.user-block-sm img{width:30px!important;height:30px!important}.img-sm+.img-push{margin-left:40px}.img-md{width:60px;height:60px}.img-md+.img-push{margin-left:70px}.img-lg{width:100px;height:100px}.img-lg+.img-push{margin-left:110px}.img-bordered{border:3px solid #d2d6de;padding:3px}.img-bordered-sm{border:2px solid #d2d6de;padding:2px}.attachment-block{border:1px solid #f4f4f4;padding:5px;margin-bottom:10px;background:#f7f7f7}.attachment-block .attachment-img{max-width:100px;max-height:100px;height:auto;float:left}.attachment-block .attachment-pushed{margin-left:110px}.attachment-block .attachment-heading{margin:0}.attachment-block .attachment-text{color:#555}.connectedSortable{min-height:100px}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sort-highlight{background:#f4f4f4;border:1px dashed #ddd;margin-bottom:10px}.full-opacity-hover{opacity:.65;filter:alpha(opacity=65)}.full-opacity-hover:hover{opacity:1;filter:alpha(opacity=100)}.chart{position:relative;overflow:hidden;width:100%}.chart svg,.chart canvas{width:100%!important}@media print{.no-print,.main-sidebar,.left-side,.main-header,.content-header{display:none!important}.content-wrapper,.right-side,.main-footer{margin-left:0!important;min-height:0!important;-webkit-transform:translate(0, 0) !important;-ms-transform:translate(0, 0) !important;-o-transform:translate(0, 0) !important;transform:translate(0, 0) !important}.fixed .content-wrapper,.fixed .right-side{padding-top:0!important}.invoice{width:100%;border:0;margin:0;padding:0}.invoice-col{float:left;width:33.3333333%}.table-responsive{overflow:auto}.table-responsive>.table tr th,.table-responsive>.table tr td{white-space:normal!important}} \ No newline at end of file diff --git a/theme/bootstrap/dist/css/skins/_all-skins.css b/theme/bootstrap/dist/css/skins/_all-skins.css new file mode 100644 index 0000000..9af6a45 --- /dev/null +++ b/theme/bootstrap/dist/css/skins/_all-skins.css @@ -0,0 +1,1799 @@ +/* + * Skin: Blue + * ---------- + */ +.skin-blue .main-header .navbar { + background-color: #3c8dbc; +} +.skin-blue .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-blue .main-header .navbar .nav > li > a:hover, +.skin-blue .main-header .navbar .nav > li > a:active, +.skin-blue .main-header .navbar .nav > li > a:focus, +.skin-blue .main-header .navbar .nav .open > a, +.skin-blue .main-header .navbar .nav .open > a:hover, +.skin-blue .main-header .navbar .nav .open > a:focus, +.skin-blue .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-blue .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-blue .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-blue .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-blue .main-header .navbar .sidebar-toggle:hover { + background-color: #367fa9; +} +@media (max-width: 767px) { + .skin-blue .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-blue .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-blue .main-header .navbar .dropdown-menu li a:hover { + background: #367fa9; + } +} +.skin-blue .main-header .logo { + background-color: #367fa9; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue .main-header .logo:hover { + background-color: #357ca5; +} +.skin-blue .main-header li.user-header { + background-color: #3c8dbc; +} +.skin-blue .content-header { + background: transparent; +} +.skin-blue .wrapper, +.skin-blue .main-sidebar, +.skin-blue .left-side { + background-color: #222d32; +} +.skin-blue .user-panel > .info, +.skin-blue .user-panel > .info > a { + color: #fff; +} +.skin-blue .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-blue .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-blue .sidebar-menu > li:hover > a, +.skin-blue .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #3c8dbc; +} +.skin-blue .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-blue .sidebar a { + color: #b8c7ce; +} +.skin-blue .sidebar a:hover { + text-decoration: none; +} +.skin-blue .treeview-menu > li > a { + color: #8aa4af; +} +.skin-blue .treeview-menu > li.active > a, +.skin-blue .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-blue .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-blue .sidebar-form input[type="text"], +.skin-blue .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-blue .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-blue .sidebar-form input[type="text"]:focus, +.skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-blue .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +.skin-blue.layout-top-nav .main-header > .logo { + background-color: #3c8dbc; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue.layout-top-nav .main-header > .logo:hover { + background-color: #3b8ab8; +} +/* + * Skin: Blue + * ---------- + */ +.skin-blue-light .main-header .navbar { + background-color: #3c8dbc; +} +.skin-blue-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-blue-light .main-header .navbar .nav > li > a:hover, +.skin-blue-light .main-header .navbar .nav > li > a:active, +.skin-blue-light .main-header .navbar .nav > li > a:focus, +.skin-blue-light .main-header .navbar .nav .open > a, +.skin-blue-light .main-header .navbar .nav .open > a:hover, +.skin-blue-light .main-header .navbar .nav .open > a:focus, +.skin-blue-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-blue-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-blue-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-blue-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-blue-light .main-header .navbar .sidebar-toggle:hover { + background-color: #367fa9; +} +@media (max-width: 767px) { + .skin-blue-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-blue-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-blue-light .main-header .navbar .dropdown-menu li a:hover { + background: #367fa9; + } +} +.skin-blue-light .main-header .logo { + background-color: #3c8dbc; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue-light .main-header .logo:hover { + background-color: #3b8ab8; +} +.skin-blue-light .main-header li.user-header { + background-color: #3c8dbc; +} +.skin-blue-light .content-header { + background: transparent; +} +.skin-blue-light .wrapper, +.skin-blue-light .main-sidebar, +.skin-blue-light .left-side { + background-color: #f9fafc; +} +.skin-blue-light .content-wrapper, +.skin-blue-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-blue-light .user-panel > .info, +.skin-blue-light .user-panel > .info > a { + color: #444444; +} +.skin-blue-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-blue-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-blue-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-blue-light .sidebar-menu > li:hover > a, +.skin-blue-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-blue-light .sidebar-menu > li.active { + border-left-color: #3c8dbc; +} +.skin-blue-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-blue-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-blue-light .sidebar a { + color: #444444; +} +.skin-blue-light .sidebar a:hover { + text-decoration: none; +} +.skin-blue-light .treeview-menu > li > a { + color: #777777; +} +.skin-blue-light .treeview-menu > li.active > a, +.skin-blue-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-blue-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-blue-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-blue-light .sidebar-form input[type="text"], +.skin-blue-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-blue-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-blue-light .sidebar-form input[type="text"]:focus, +.skin-blue-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-blue-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-blue-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} +.skin-blue-light .main-footer { + border-top-color: #d2d6de; +} +.skin-blue.layout-top-nav .main-header > .logo { + background-color: #3c8dbc; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue.layout-top-nav .main-header > .logo:hover { + background-color: #3b8ab8; +} +/* + * Skin: Black + * ----------- + */ +/* skin-black navbar */ +.skin-black .main-header { + -webkit-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); +} +.skin-black .main-header .navbar-toggle { + color: #333; +} +.skin-black .main-header .navbar-brand { + color: #333; + border-right: 1px solid #eee; +} +.skin-black .main-header > .navbar { + background-color: #ffffff; +} +.skin-black .main-header > .navbar .nav > li > a { + color: #333333; +} +.skin-black .main-header > .navbar .nav > li > a:hover, +.skin-black .main-header > .navbar .nav > li > a:active, +.skin-black .main-header > .navbar .nav > li > a:focus, +.skin-black .main-header > .navbar .nav .open > a, +.skin-black .main-header > .navbar .nav .open > a:hover, +.skin-black .main-header > .navbar .nav .open > a:focus, +.skin-black .main-header > .navbar .nav > .active > a { + background: #ffffff; + color: #999999; +} +.skin-black .main-header > .navbar .sidebar-toggle { + color: #333333; +} +.skin-black .main-header > .navbar .sidebar-toggle:hover { + color: #999999; + background: #ffffff; +} +.skin-black .main-header > .navbar > .sidebar-toggle { + color: #333; + border-right: 1px solid #eee; +} +.skin-black .main-header > .navbar .navbar-nav > li > a { + border-right: 1px solid #eee; +} +.skin-black .main-header > .navbar .navbar-custom-menu .navbar-nav > li > a, +.skin-black .main-header > .navbar .navbar-right > li > a { + border-left: 1px solid #eee; + border-right-width: 0; +} +.skin-black .main-header > .logo { + background-color: #ffffff; + color: #333333; + border-bottom: 0 solid transparent; + border-right: 1px solid #eee; +} +.skin-black .main-header > .logo:hover { + background-color: #fcfcfc; +} +@media (max-width: 767px) { + .skin-black .main-header > .logo { + background-color: #222222; + color: #ffffff; + border-bottom: 0 solid transparent; + border-right: none; + } + .skin-black .main-header > .logo:hover { + background-color: #1f1f1f; + } +} +.skin-black .main-header li.user-header { + background-color: #222; +} +.skin-black .content-header { + background: transparent; + box-shadow: none; +} +.skin-black .wrapper, +.skin-black .main-sidebar, +.skin-black .left-side { + background-color: #222d32; +} +.skin-black .user-panel > .info, +.skin-black .user-panel > .info > a { + color: #fff; +} +.skin-black .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-black .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-black .sidebar-menu > li:hover > a, +.skin-black .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #ffffff; +} +.skin-black .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-black .sidebar a { + color: #b8c7ce; +} +.skin-black .sidebar a:hover { + text-decoration: none; +} +.skin-black .treeview-menu > li > a { + color: #8aa4af; +} +.skin-black .treeview-menu > li.active > a, +.skin-black .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-black .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-black .sidebar-form input[type="text"], +.skin-black .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-black .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-black .sidebar-form input[type="text"]:focus, +.skin-black .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-black .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-black .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +/* + * Skin: Black + * ----------- + */ +/* skin-black navbar */ +.skin-black-light .main-header { + -webkit-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); +} +.skin-black-light .main-header .navbar-toggle { + color: #333; +} +.skin-black-light .main-header .navbar-brand { + color: #333; + border-right: 1px solid #eee; +} +.skin-black-light .main-header > .navbar { + background-color: #ffffff; +} +.skin-black-light .main-header > .navbar .nav > li > a { + color: #333333; +} +.skin-black-light .main-header > .navbar .nav > li > a:hover, +.skin-black-light .main-header > .navbar .nav > li > a:active, +.skin-black-light .main-header > .navbar .nav > li > a:focus, +.skin-black-light .main-header > .navbar .nav .open > a, +.skin-black-light .main-header > .navbar .nav .open > a:hover, +.skin-black-light .main-header > .navbar .nav .open > a:focus, +.skin-black-light .main-header > .navbar .nav > .active > a { + background: #ffffff; + color: #999999; +} +.skin-black-light .main-header > .navbar .sidebar-toggle { + color: #333333; +} +.skin-black-light .main-header > .navbar .sidebar-toggle:hover { + color: #999999; + background: #ffffff; +} +.skin-black-light .main-header > .navbar > .sidebar-toggle { + color: #333; + border-right: 1px solid #eee; +} +.skin-black-light .main-header > .navbar .navbar-nav > li > a { + border-right: 1px solid #eee; +} +.skin-black-light .main-header > .navbar .navbar-custom-menu .navbar-nav > li > a, +.skin-black-light .main-header > .navbar .navbar-right > li > a { + border-left: 1px solid #eee; + border-right-width: 0; +} +.skin-black-light .main-header > .logo { + background-color: #ffffff; + color: #333333; + border-bottom: 0 solid transparent; + border-right: 1px solid #eee; +} +.skin-black-light .main-header > .logo:hover { + background-color: #fcfcfc; +} +@media (max-width: 767px) { + .skin-black-light .main-header > .logo { + background-color: #222222; + color: #ffffff; + border-bottom: 0 solid transparent; + border-right: none; + } + .skin-black-light .main-header > .logo:hover { + background-color: #1f1f1f; + } +} +.skin-black-light .main-header li.user-header { + background-color: #222; +} +.skin-black-light .content-header { + background: transparent; + box-shadow: none; +} +.skin-black-light .wrapper, +.skin-black-light .main-sidebar, +.skin-black-light .left-side { + background-color: #f9fafc; +} +.skin-black-light .content-wrapper, +.skin-black-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-black-light .user-panel > .info, +.skin-black-light .user-panel > .info > a { + color: #444444; +} +.skin-black-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-black-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-black-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-black-light .sidebar-menu > li:hover > a, +.skin-black-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-black-light .sidebar-menu > li.active { + border-left-color: #ffffff; +} +.skin-black-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-black-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-black-light .sidebar a { + color: #444444; +} +.skin-black-light .sidebar a:hover { + text-decoration: none; +} +.skin-black-light .treeview-menu > li > a { + color: #777777; +} +.skin-black-light .treeview-menu > li.active > a, +.skin-black-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-black-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-black-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-black-light .sidebar-form input[type="text"], +.skin-black-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-black-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-black-light .sidebar-form input[type="text"]:focus, +.skin-black-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-black-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-black-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} +/* + * Skin: Green + * ----------- + */ +.skin-green .main-header .navbar { + background-color: #00a65a; +} +.skin-green .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-green .main-header .navbar .nav > li > a:hover, +.skin-green .main-header .navbar .nav > li > a:active, +.skin-green .main-header .navbar .nav > li > a:focus, +.skin-green .main-header .navbar .nav .open > a, +.skin-green .main-header .navbar .nav .open > a:hover, +.skin-green .main-header .navbar .nav .open > a:focus, +.skin-green .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-green .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-green .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-green .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-green .main-header .navbar .sidebar-toggle:hover { + background-color: #008d4c; +} +@media (max-width: 767px) { + .skin-green .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-green .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-green .main-header .navbar .dropdown-menu li a:hover { + background: #008d4c; + } +} +.skin-green .main-header .logo { + background-color: #008d4c; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-green .main-header .logo:hover { + background-color: #008749; +} +.skin-green .main-header li.user-header { + background-color: #00a65a; +} +.skin-green .content-header { + background: transparent; +} +.skin-green .wrapper, +.skin-green .main-sidebar, +.skin-green .left-side { + background-color: #222d32; +} +.skin-green .user-panel > .info, +.skin-green .user-panel > .info > a { + color: #fff; +} +.skin-green .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-green .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-green .sidebar-menu > li:hover > a, +.skin-green .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #00a65a; +} +.skin-green .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-green .sidebar a { + color: #b8c7ce; +} +.skin-green .sidebar a:hover { + text-decoration: none; +} +.skin-green .treeview-menu > li > a { + color: #8aa4af; +} +.skin-green .treeview-menu > li.active > a, +.skin-green .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-green .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-green .sidebar-form input[type="text"], +.skin-green .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-green .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-green .sidebar-form input[type="text"]:focus, +.skin-green .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-green .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-green .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +/* + * Skin: Green + * ----------- + */ +.skin-green-light .main-header .navbar { + background-color: #00a65a; +} +.skin-green-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-green-light .main-header .navbar .nav > li > a:hover, +.skin-green-light .main-header .navbar .nav > li > a:active, +.skin-green-light .main-header .navbar .nav > li > a:focus, +.skin-green-light .main-header .navbar .nav .open > a, +.skin-green-light .main-header .navbar .nav .open > a:hover, +.skin-green-light .main-header .navbar .nav .open > a:focus, +.skin-green-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-green-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-green-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-green-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-green-light .main-header .navbar .sidebar-toggle:hover { + background-color: #008d4c; +} +@media (max-width: 767px) { + .skin-green-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-green-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-green-light .main-header .navbar .dropdown-menu li a:hover { + background: #008d4c; + } +} +.skin-green-light .main-header .logo { + background-color: #00a65a; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-green-light .main-header .logo:hover { + background-color: #00a157; +} +.skin-green-light .main-header li.user-header { + background-color: #00a65a; +} +.skin-green-light .content-header { + background: transparent; +} +.skin-green-light .wrapper, +.skin-green-light .main-sidebar, +.skin-green-light .left-side { + background-color: #f9fafc; +} +.skin-green-light .content-wrapper, +.skin-green-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-green-light .user-panel > .info, +.skin-green-light .user-panel > .info > a { + color: #444444; +} +.skin-green-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-green-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-green-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-green-light .sidebar-menu > li:hover > a, +.skin-green-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-green-light .sidebar-menu > li.active { + border-left-color: #00a65a; +} +.skin-green-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-green-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-green-light .sidebar a { + color: #444444; +} +.skin-green-light .sidebar a:hover { + text-decoration: none; +} +.skin-green-light .treeview-menu > li > a { + color: #777777; +} +.skin-green-light .treeview-menu > li.active > a, +.skin-green-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-green-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-green-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-green-light .sidebar-form input[type="text"], +.skin-green-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-green-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-green-light .sidebar-form input[type="text"]:focus, +.skin-green-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-green-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-green-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} +/* + * Skin: Red + * --------- + */ +.skin-red .main-header .navbar { + background-color: #dd4b39; +} +.skin-red .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-red .main-header .navbar .nav > li > a:hover, +.skin-red .main-header .navbar .nav > li > a:active, +.skin-red .main-header .navbar .nav > li > a:focus, +.skin-red .main-header .navbar .nav .open > a, +.skin-red .main-header .navbar .nav .open > a:hover, +.skin-red .main-header .navbar .nav .open > a:focus, +.skin-red .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-red .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-red .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-red .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-red .main-header .navbar .sidebar-toggle:hover { + background-color: #d73925; +} +@media (max-width: 767px) { + .skin-red .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-red .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-red .main-header .navbar .dropdown-menu li a:hover { + background: #d73925; + } +} +.skin-red .main-header .logo { + background-color: #d73925; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-red .main-header .logo:hover { + background-color: #d33724; +} +.skin-red .main-header li.user-header { + background-color: #dd4b39; +} +.skin-red .content-header { + background: transparent; +} +.skin-red .wrapper, +.skin-red .main-sidebar, +.skin-red .left-side { + background-color: #222d32; +} +.skin-red .user-panel > .info, +.skin-red .user-panel > .info > a { + color: #fff; +} +.skin-red .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-red .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-red .sidebar-menu > li:hover > a, +.skin-red .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #dd4b39; +} +.skin-red .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-red .sidebar a { + color: #b8c7ce; +} +.skin-red .sidebar a:hover { + text-decoration: none; +} +.skin-red .treeview-menu > li > a { + color: #8aa4af; +} +.skin-red .treeview-menu > li.active > a, +.skin-red .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-red .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-red .sidebar-form input[type="text"], +.skin-red .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-red .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-red .sidebar-form input[type="text"]:focus, +.skin-red .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-red .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-red .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +/* + * Skin: Red + * --------- + */ +.skin-red-light .main-header .navbar { + background-color: #dd4b39; +} +.skin-red-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-red-light .main-header .navbar .nav > li > a:hover, +.skin-red-light .main-header .navbar .nav > li > a:active, +.skin-red-light .main-header .navbar .nav > li > a:focus, +.skin-red-light .main-header .navbar .nav .open > a, +.skin-red-light .main-header .navbar .nav .open > a:hover, +.skin-red-light .main-header .navbar .nav .open > a:focus, +.skin-red-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-red-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-red-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-red-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-red-light .main-header .navbar .sidebar-toggle:hover { + background-color: #d73925; +} +@media (max-width: 767px) { + .skin-red-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-red-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-red-light .main-header .navbar .dropdown-menu li a:hover { + background: #d73925; + } +} +.skin-red-light .main-header .logo { + background-color: #dd4b39; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-red-light .main-header .logo:hover { + background-color: #dc4735; +} +.skin-red-light .main-header li.user-header { + background-color: #dd4b39; +} +.skin-red-light .content-header { + background: transparent; +} +.skin-red-light .wrapper, +.skin-red-light .main-sidebar, +.skin-red-light .left-side { + background-color: #f9fafc; +} +.skin-red-light .content-wrapper, +.skin-red-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-red-light .user-panel > .info, +.skin-red-light .user-panel > .info > a { + color: #444444; +} +.skin-red-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-red-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-red-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-red-light .sidebar-menu > li:hover > a, +.skin-red-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-red-light .sidebar-menu > li.active { + border-left-color: #dd4b39; +} +.skin-red-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-red-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-red-light .sidebar a { + color: #444444; +} +.skin-red-light .sidebar a:hover { + text-decoration: none; +} +.skin-red-light .treeview-menu > li > a { + color: #777777; +} +.skin-red-light .treeview-menu > li.active > a, +.skin-red-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-red-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-red-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-red-light .sidebar-form input[type="text"], +.skin-red-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-red-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-red-light .sidebar-form input[type="text"]:focus, +.skin-red-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-red-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-red-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} +/* + * Skin: Yellow + * ------------ + */ +.skin-yellow .main-header .navbar { + background-color: #f39c12; +} +.skin-yellow .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-yellow .main-header .navbar .nav > li > a:hover, +.skin-yellow .main-header .navbar .nav > li > a:active, +.skin-yellow .main-header .navbar .nav > li > a:focus, +.skin-yellow .main-header .navbar .nav .open > a, +.skin-yellow .main-header .navbar .nav .open > a:hover, +.skin-yellow .main-header .navbar .nav .open > a:focus, +.skin-yellow .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-yellow .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-yellow .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-yellow .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-yellow .main-header .navbar .sidebar-toggle:hover { + background-color: #e08e0b; +} +@media (max-width: 767px) { + .skin-yellow .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-yellow .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-yellow .main-header .navbar .dropdown-menu li a:hover { + background: #e08e0b; + } +} +.skin-yellow .main-header .logo { + background-color: #e08e0b; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-yellow .main-header .logo:hover { + background-color: #db8b0b; +} +.skin-yellow .main-header li.user-header { + background-color: #f39c12; +} +.skin-yellow .content-header { + background: transparent; +} +.skin-yellow .wrapper, +.skin-yellow .main-sidebar, +.skin-yellow .left-side { + background-color: #222d32; +} +.skin-yellow .user-panel > .info, +.skin-yellow .user-panel > .info > a { + color: #fff; +} +.skin-yellow .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-yellow .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-yellow .sidebar-menu > li:hover > a, +.skin-yellow .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #f39c12; +} +.skin-yellow .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-yellow .sidebar a { + color: #b8c7ce; +} +.skin-yellow .sidebar a:hover { + text-decoration: none; +} +.skin-yellow .treeview-menu > li > a { + color: #8aa4af; +} +.skin-yellow .treeview-menu > li.active > a, +.skin-yellow .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-yellow .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-yellow .sidebar-form input[type="text"], +.skin-yellow .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-yellow .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-yellow .sidebar-form input[type="text"]:focus, +.skin-yellow .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-yellow .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-yellow .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +/* + * Skin: Yellow + * ------------ + */ +.skin-yellow-light .main-header .navbar { + background-color: #f39c12; +} +.skin-yellow-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-yellow-light .main-header .navbar .nav > li > a:hover, +.skin-yellow-light .main-header .navbar .nav > li > a:active, +.skin-yellow-light .main-header .navbar .nav > li > a:focus, +.skin-yellow-light .main-header .navbar .nav .open > a, +.skin-yellow-light .main-header .navbar .nav .open > a:hover, +.skin-yellow-light .main-header .navbar .nav .open > a:focus, +.skin-yellow-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-yellow-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-yellow-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-yellow-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-yellow-light .main-header .navbar .sidebar-toggle:hover { + background-color: #e08e0b; +} +@media (max-width: 767px) { + .skin-yellow-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-yellow-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-yellow-light .main-header .navbar .dropdown-menu li a:hover { + background: #e08e0b; + } +} +.skin-yellow-light .main-header .logo { + background-color: #f39c12; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-yellow-light .main-header .logo:hover { + background-color: #f39a0d; +} +.skin-yellow-light .main-header li.user-header { + background-color: #f39c12; +} +.skin-yellow-light .content-header { + background: transparent; +} +.skin-yellow-light .wrapper, +.skin-yellow-light .main-sidebar, +.skin-yellow-light .left-side { + background-color: #f9fafc; +} +.skin-yellow-light .content-wrapper, +.skin-yellow-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-yellow-light .user-panel > .info, +.skin-yellow-light .user-panel > .info > a { + color: #444444; +} +.skin-yellow-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-yellow-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-yellow-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-yellow-light .sidebar-menu > li:hover > a, +.skin-yellow-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-yellow-light .sidebar-menu > li.active { + border-left-color: #f39c12; +} +.skin-yellow-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-yellow-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-yellow-light .sidebar a { + color: #444444; +} +.skin-yellow-light .sidebar a:hover { + text-decoration: none; +} +.skin-yellow-light .treeview-menu > li > a { + color: #777777; +} +.skin-yellow-light .treeview-menu > li.active > a, +.skin-yellow-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-yellow-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-yellow-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-yellow-light .sidebar-form input[type="text"], +.skin-yellow-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-yellow-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-yellow-light .sidebar-form input[type="text"]:focus, +.skin-yellow-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-yellow-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-yellow-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} +/* + * Skin: Purple + * ------------ + */ +.skin-purple .main-header .navbar { + background-color: #605ca8; +} +.skin-purple .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-purple .main-header .navbar .nav > li > a:hover, +.skin-purple .main-header .navbar .nav > li > a:active, +.skin-purple .main-header .navbar .nav > li > a:focus, +.skin-purple .main-header .navbar .nav .open > a, +.skin-purple .main-header .navbar .nav .open > a:hover, +.skin-purple .main-header .navbar .nav .open > a:focus, +.skin-purple .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-purple .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-purple .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-purple .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-purple .main-header .navbar .sidebar-toggle:hover { + background-color: #555299; +} +@media (max-width: 767px) { + .skin-purple .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-purple .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-purple .main-header .navbar .dropdown-menu li a:hover { + background: #555299; + } +} +.skin-purple .main-header .logo { + background-color: #555299; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-purple .main-header .logo:hover { + background-color: #545096; +} +.skin-purple .main-header li.user-header { + background-color: #605ca8; +} +.skin-purple .content-header { + background: transparent; +} +.skin-purple .wrapper, +.skin-purple .main-sidebar, +.skin-purple .left-side { + background-color: #222d32; +} +.skin-purple .user-panel > .info, +.skin-purple .user-panel > .info > a { + color: #fff; +} +.skin-purple .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-purple .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-purple .sidebar-menu > li:hover > a, +.skin-purple .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #605ca8; +} +.skin-purple .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-purple .sidebar a { + color: #b8c7ce; +} +.skin-purple .sidebar a:hover { + text-decoration: none; +} +.skin-purple .treeview-menu > li > a { + color: #8aa4af; +} +.skin-purple .treeview-menu > li.active > a, +.skin-purple .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-purple .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-purple .sidebar-form input[type="text"], +.skin-purple .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-purple .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-purple .sidebar-form input[type="text"]:focus, +.skin-purple .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-purple .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-purple .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +/* + * Skin: Purple + * ------------ + */ +.skin-purple-light .main-header .navbar { + background-color: #605ca8; +} +.skin-purple-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-purple-light .main-header .navbar .nav > li > a:hover, +.skin-purple-light .main-header .navbar .nav > li > a:active, +.skin-purple-light .main-header .navbar .nav > li > a:focus, +.skin-purple-light .main-header .navbar .nav .open > a, +.skin-purple-light .main-header .navbar .nav .open > a:hover, +.skin-purple-light .main-header .navbar .nav .open > a:focus, +.skin-purple-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-purple-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-purple-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-purple-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-purple-light .main-header .navbar .sidebar-toggle:hover { + background-color: #555299; +} +@media (max-width: 767px) { + .skin-purple-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-purple-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-purple-light .main-header .navbar .dropdown-menu li a:hover { + background: #555299; + } +} +.skin-purple-light .main-header .logo { + background-color: #605ca8; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-purple-light .main-header .logo:hover { + background-color: #5d59a6; +} +.skin-purple-light .main-header li.user-header { + background-color: #605ca8; +} +.skin-purple-light .content-header { + background: transparent; +} +.skin-purple-light .wrapper, +.skin-purple-light .main-sidebar, +.skin-purple-light .left-side { + background-color: #f9fafc; +} +.skin-purple-light .content-wrapper, +.skin-purple-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-purple-light .user-panel > .info, +.skin-purple-light .user-panel > .info > a { + color: #444444; +} +.skin-purple-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-purple-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-purple-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-purple-light .sidebar-menu > li:hover > a, +.skin-purple-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-purple-light .sidebar-menu > li.active { + border-left-color: #605ca8; +} +.skin-purple-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-purple-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-purple-light .sidebar a { + color: #444444; +} +.skin-purple-light .sidebar a:hover { + text-decoration: none; +} +.skin-purple-light .treeview-menu > li > a { + color: #777777; +} +.skin-purple-light .treeview-menu > li.active > a, +.skin-purple-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-purple-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-purple-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-purple-light .sidebar-form input[type="text"], +.skin-purple-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-purple-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-purple-light .sidebar-form input[type="text"]:focus, +.skin-purple-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-purple-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-purple-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} diff --git a/theme/bootstrap/dist/css/skins/_all-skins.min.css b/theme/bootstrap/dist/css/skins/_all-skins.min.css new file mode 100644 index 0000000..1710db5 --- /dev/null +++ b/theme/bootstrap/dist/css/skins/_all-skins.min.css @@ -0,0 +1 @@ +.skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav>li>a:hover,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent}.skin-blue .main-header .logo:hover{background-color:#357ca5}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:transparent}.skin-blue .wrapper,.skin-blue .main-sidebar,.skin-blue .left-side{background-color:#222d32}.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li:hover>a,.skin-blue .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .sidebar a:hover{text-decoration:none}.skin-blue .treeview-menu>li>a{color:#8aa4af}.skin-blue .treeview-menu>li.active>a,.skin-blue .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-blue .sidebar-form input[type="text"],.skin-blue .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-blue .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue .sidebar-form input[type="text"]:focus,.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header .navbar{background-color:#3c8dbc}.skin-blue-light .main-header .navbar .nav>li>a{color:#fff}.skin-blue-light .main-header .navbar .nav>li>a:hover,.skin-blue-light .main-header .navbar .nav>li>a:active,.skin-blue-light .main-header .navbar .nav>li>a:focus,.skin-blue-light .main-header .navbar .nav .open>a,.skin-blue-light .main-header .navbar .nav .open>a:hover,.skin-blue-light .main-header .navbar .nav .open>a:focus,.skin-blue-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue-light .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue-light .main-header .logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue-light .main-header .logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header li.user-header{background-color:#3c8dbc}.skin-blue-light .content-header{background:transparent}.skin-blue-light .wrapper,.skin-blue-light .main-sidebar,.skin-blue-light .left-side{background-color:#f9fafc}.skin-blue-light .content-wrapper,.skin-blue-light .main-footer{border-left:1px solid #d2d6de}.skin-blue-light .user-panel>.info,.skin-blue-light .user-panel>.info>a{color:#444}.skin-blue-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-blue-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-blue-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-blue-light .sidebar-menu>li:hover>a,.skin-blue-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-blue-light .sidebar-menu>li.active{border-left-color:#3c8dbc}.skin-blue-light .sidebar-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-blue-light .sidebar a{color:#444}.skin-blue-light .sidebar a:hover{text-decoration:none}.skin-blue-light .treeview-menu>li>a{color:#777}.skin-blue-light .treeview-menu>li.active>a,.skin-blue-light .treeview-menu>li>a:hover{color:#000}.skin-blue-light .treeview-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-blue-light .sidebar-form input[type="text"],.skin-blue-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-blue-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue-light .sidebar-form input[type="text"]:focus,.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-blue-light .main-footer{border-top-color:#d2d6de}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8}.skin-black .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.skin-black .main-header .navbar-toggle{color:#333}.skin-black .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black .main-header>.navbar{background-color:#fff}.skin-black .main-header>.navbar .nav>li>a{color:#333}.skin-black .main-header>.navbar .nav>li>a:hover,.skin-black .main-header>.navbar .nav>li>a:active,.skin-black .main-header>.navbar .nav>li>a:focus,.skin-black .main-header>.navbar .nav .open>a,.skin-black .main-header>.navbar .nav .open>a:hover,.skin-black .main-header>.navbar .nav .open>a:focus,.skin-black .main-header>.navbar .nav>.active>a{background:#fff;color:#999}.skin-black .main-header>.navbar .sidebar-toggle{color:#333}.skin-black .main-header>.navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black .main-header>.navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black .main-header>.navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black .main-header>.navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black .main-header>.navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black .main-header li.user-header{background-color:#222}.skin-black .content-header{background:transparent;box-shadow:none}.skin-black .wrapper,.skin-black .main-sidebar,.skin-black .left-side{background-color:#222d32}.skin-black .user-panel>.info,.skin-black .user-panel>.info>a{color:#fff}.skin-black .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-black .sidebar-menu>li>a{border-left:3px solid transparent}.skin-black .sidebar-menu>li:hover>a,.skin-black .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#fff}.skin-black .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-black .sidebar a{color:#b8c7ce}.skin-black .sidebar a:hover{text-decoration:none}.skin-black .treeview-menu>li>a{color:#8aa4af}.skin-black .treeview-menu>li.active>a,.skin-black .treeview-menu>li>a:hover{color:#fff}.skin-black .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-black .sidebar-form input[type="text"],.skin-black .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-black .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black .sidebar-form input[type="text"]:focus,.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-black-light .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.skin-black-light .main-header .navbar-toggle{color:#333}.skin-black-light .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black-light .main-header>.navbar{background-color:#fff}.skin-black-light .main-header>.navbar .nav>li>a{color:#333}.skin-black-light .main-header>.navbar .nav>li>a:hover,.skin-black-light .main-header>.navbar .nav>li>a:active,.skin-black-light .main-header>.navbar .nav>li>a:focus,.skin-black-light .main-header>.navbar .nav .open>a,.skin-black-light .main-header>.navbar .nav .open>a:hover,.skin-black-light .main-header>.navbar .nav .open>a:focus,.skin-black-light .main-header>.navbar .nav>.active>a{background:#fff;color:#999}.skin-black-light .main-header>.navbar .sidebar-toggle{color:#333}.skin-black-light .main-header>.navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black-light .main-header>.navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black-light .main-header>.navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black-light .main-header>.navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black-light .main-header>.navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black-light .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black-light .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black-light .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black-light .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black-light .main-header li.user-header{background-color:#222}.skin-black-light .content-header{background:transparent;box-shadow:none}.skin-black-light .wrapper,.skin-black-light .main-sidebar,.skin-black-light .left-side{background-color:#f9fafc}.skin-black-light .content-wrapper,.skin-black-light .main-footer{border-left:1px solid #d2d6de}.skin-black-light .user-panel>.info,.skin-black-light .user-panel>.info>a{color:#444}.skin-black-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-black-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-black-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-black-light .sidebar-menu>li:hover>a,.skin-black-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-black-light .sidebar-menu>li.active{border-left-color:#fff}.skin-black-light .sidebar-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-black-light .sidebar a{color:#444}.skin-black-light .sidebar a:hover{text-decoration:none}.skin-black-light .treeview-menu>li>a{color:#777}.skin-black-light .treeview-menu>li.active>a,.skin-black-light .treeview-menu>li>a:hover{color:#000}.skin-black-light .treeview-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-black-light .sidebar-form input[type="text"],.skin-black-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-black-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black-light .sidebar-form input[type="text"]:focus,.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-green .main-header .navbar{background-color:#00a65a}.skin-green .main-header .navbar .nav>li>a{color:#fff}.skin-green .main-header .navbar .nav>li>a:hover,.skin-green .main-header .navbar .nav>li>a:active,.skin-green .main-header .navbar .nav>li>a:focus,.skin-green .main-header .navbar .nav .open>a,.skin-green .main-header .navbar .nav .open>a:hover,.skin-green .main-header .navbar .nav .open>a:focus,.skin-green .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green .main-header .logo{background-color:#008d4c;color:#fff;border-bottom:0 solid transparent}.skin-green .main-header .logo:hover{background-color:#008749}.skin-green .main-header li.user-header{background-color:#00a65a}.skin-green .content-header{background:transparent}.skin-green .wrapper,.skin-green .main-sidebar,.skin-green .left-side{background-color:#222d32}.skin-green .user-panel>.info,.skin-green .user-panel>.info>a{color:#fff}.skin-green .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-green .sidebar-menu>li>a{border-left:3px solid transparent}.skin-green .sidebar-menu>li:hover>a,.skin-green .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#00a65a}.skin-green .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-green .sidebar a{color:#b8c7ce}.skin-green .sidebar a:hover{text-decoration:none}.skin-green .treeview-menu>li>a{color:#8aa4af}.skin-green .treeview-menu>li.active>a,.skin-green .treeview-menu>li>a:hover{color:#fff}.skin-green .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-green .sidebar-form input[type="text"],.skin-green .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-green .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green .sidebar-form input[type="text"]:focus,.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-green-light .main-header .navbar{background-color:#00a65a}.skin-green-light .main-header .navbar .nav>li>a{color:#fff}.skin-green-light .main-header .navbar .nav>li>a:hover,.skin-green-light .main-header .navbar .nav>li>a:active,.skin-green-light .main-header .navbar .nav>li>a:focus,.skin-green-light .main-header .navbar .nav .open>a,.skin-green-light .main-header .navbar .nav .open>a:hover,.skin-green-light .main-header .navbar .nav .open>a:focus,.skin-green-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green-light .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green-light .main-header .logo{background-color:#00a65a;color:#fff;border-bottom:0 solid transparent}.skin-green-light .main-header .logo:hover{background-color:#00a157}.skin-green-light .main-header li.user-header{background-color:#00a65a}.skin-green-light .content-header{background:transparent}.skin-green-light .wrapper,.skin-green-light .main-sidebar,.skin-green-light .left-side{background-color:#f9fafc}.skin-green-light .content-wrapper,.skin-green-light .main-footer{border-left:1px solid #d2d6de}.skin-green-light .user-panel>.info,.skin-green-light .user-panel>.info>a{color:#444}.skin-green-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-green-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-green-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-green-light .sidebar-menu>li:hover>a,.skin-green-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-green-light .sidebar-menu>li.active{border-left-color:#00a65a}.skin-green-light .sidebar-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-green-light .sidebar a{color:#444}.skin-green-light .sidebar a:hover{text-decoration:none}.skin-green-light .treeview-menu>li>a{color:#777}.skin-green-light .treeview-menu>li.active>a,.skin-green-light .treeview-menu>li>a:hover{color:#000}.skin-green-light .treeview-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-green-light .sidebar-form input[type="text"],.skin-green-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-green-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green-light .sidebar-form input[type="text"]:focus,.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-red .main-header .navbar{background-color:#dd4b39}.skin-red .main-header .navbar .nav>li>a{color:#fff}.skin-red .main-header .navbar .nav>li>a:hover,.skin-red .main-header .navbar .nav>li>a:active,.skin-red .main-header .navbar .nav>li>a:focus,.skin-red .main-header .navbar .nav .open>a,.skin-red .main-header .navbar .nav .open>a:hover,.skin-red .main-header .navbar .nav .open>a:focus,.skin-red .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red .main-header .logo{background-color:#d73925;color:#fff;border-bottom:0 solid transparent}.skin-red .main-header .logo:hover{background-color:#d33724}.skin-red .main-header li.user-header{background-color:#dd4b39}.skin-red .content-header{background:transparent}.skin-red .wrapper,.skin-red .main-sidebar,.skin-red .left-side{background-color:#222d32}.skin-red .user-panel>.info,.skin-red .user-panel>.info>a{color:#fff}.skin-red .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-red .sidebar-menu>li>a{border-left:3px solid transparent}.skin-red .sidebar-menu>li:hover>a,.skin-red .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#dd4b39}.skin-red .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-red .sidebar a{color:#b8c7ce}.skin-red .sidebar a:hover{text-decoration:none}.skin-red .treeview-menu>li>a{color:#8aa4af}.skin-red .treeview-menu>li.active>a,.skin-red .treeview-menu>li>a:hover{color:#fff}.skin-red .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-red .sidebar-form input[type="text"],.skin-red .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-red .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red .sidebar-form input[type="text"]:focus,.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-red-light .main-header .navbar{background-color:#dd4b39}.skin-red-light .main-header .navbar .nav>li>a{color:#fff}.skin-red-light .main-header .navbar .nav>li>a:hover,.skin-red-light .main-header .navbar .nav>li>a:active,.skin-red-light .main-header .navbar .nav>li>a:focus,.skin-red-light .main-header .navbar .nav .open>a,.skin-red-light .main-header .navbar .nav .open>a:hover,.skin-red-light .main-header .navbar .nav .open>a:focus,.skin-red-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red-light .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red-light .main-header .logo{background-color:#dd4b39;color:#fff;border-bottom:0 solid transparent}.skin-red-light .main-header .logo:hover{background-color:#dc4735}.skin-red-light .main-header li.user-header{background-color:#dd4b39}.skin-red-light .content-header{background:transparent}.skin-red-light .wrapper,.skin-red-light .main-sidebar,.skin-red-light .left-side{background-color:#f9fafc}.skin-red-light .content-wrapper,.skin-red-light .main-footer{border-left:1px solid #d2d6de}.skin-red-light .user-panel>.info,.skin-red-light .user-panel>.info>a{color:#444}.skin-red-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-red-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-red-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-red-light .sidebar-menu>li:hover>a,.skin-red-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-red-light .sidebar-menu>li.active{border-left-color:#dd4b39}.skin-red-light .sidebar-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-red-light .sidebar a{color:#444}.skin-red-light .sidebar a:hover{text-decoration:none}.skin-red-light .treeview-menu>li>a{color:#777}.skin-red-light .treeview-menu>li.active>a,.skin-red-light .treeview-menu>li>a:hover{color:#000}.skin-red-light .treeview-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-red-light .sidebar-form input[type="text"],.skin-red-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-red-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red-light .sidebar-form input[type="text"]:focus,.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-yellow .main-header .navbar{background-color:#f39c12}.skin-yellow .main-header .navbar .nav>li>a{color:#fff}.skin-yellow .main-header .navbar .nav>li>a:hover,.skin-yellow .main-header .navbar .nav>li>a:active,.skin-yellow .main-header .navbar .nav>li>a:focus,.skin-yellow .main-header .navbar .nav .open>a,.skin-yellow .main-header .navbar .nav .open>a:hover,.skin-yellow .main-header .navbar .nav .open>a:focus,.skin-yellow .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow .main-header .logo{background-color:#e08e0b;color:#fff;border-bottom:0 solid transparent}.skin-yellow .main-header .logo:hover{background-color:#db8b0b}.skin-yellow .main-header li.user-header{background-color:#f39c12}.skin-yellow .content-header{background:transparent}.skin-yellow .wrapper,.skin-yellow .main-sidebar,.skin-yellow .left-side{background-color:#222d32}.skin-yellow .user-panel>.info,.skin-yellow .user-panel>.info>a{color:#fff}.skin-yellow .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-yellow .sidebar-menu>li>a{border-left:3px solid transparent}.skin-yellow .sidebar-menu>li:hover>a,.skin-yellow .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#f39c12}.skin-yellow .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-yellow .sidebar a{color:#b8c7ce}.skin-yellow .sidebar a:hover{text-decoration:none}.skin-yellow .treeview-menu>li>a{color:#8aa4af}.skin-yellow .treeview-menu>li.active>a,.skin-yellow .treeview-menu>li>a:hover{color:#fff}.skin-yellow .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-yellow .sidebar-form input[type="text"],.skin-yellow .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-yellow .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow .sidebar-form input[type="text"]:focus,.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-yellow-light .main-header .navbar{background-color:#f39c12}.skin-yellow-light .main-header .navbar .nav>li>a{color:#fff}.skin-yellow-light .main-header .navbar .nav>li>a:hover,.skin-yellow-light .main-header .navbar .nav>li>a:active,.skin-yellow-light .main-header .navbar .nav>li>a:focus,.skin-yellow-light .main-header .navbar .nav .open>a,.skin-yellow-light .main-header .navbar .nav .open>a:hover,.skin-yellow-light .main-header .navbar .nav .open>a:focus,.skin-yellow-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow-light .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow-light .main-header .logo{background-color:#f39c12;color:#fff;border-bottom:0 solid transparent}.skin-yellow-light .main-header .logo:hover{background-color:#f39a0d}.skin-yellow-light .main-header li.user-header{background-color:#f39c12}.skin-yellow-light .content-header{background:transparent}.skin-yellow-light .wrapper,.skin-yellow-light .main-sidebar,.skin-yellow-light .left-side{background-color:#f9fafc}.skin-yellow-light .content-wrapper,.skin-yellow-light .main-footer{border-left:1px solid #d2d6de}.skin-yellow-light .user-panel>.info,.skin-yellow-light .user-panel>.info>a{color:#444}.skin-yellow-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-yellow-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-yellow-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-yellow-light .sidebar-menu>li:hover>a,.skin-yellow-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-yellow-light .sidebar-menu>li.active{border-left-color:#f39c12}.skin-yellow-light .sidebar-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-yellow-light .sidebar a{color:#444}.skin-yellow-light .sidebar a:hover{text-decoration:none}.skin-yellow-light .treeview-menu>li>a{color:#777}.skin-yellow-light .treeview-menu>li.active>a,.skin-yellow-light .treeview-menu>li>a:hover{color:#000}.skin-yellow-light .treeview-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-yellow-light .sidebar-form input[type="text"],.skin-yellow-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-yellow-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow-light .sidebar-form input[type="text"]:focus,.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-purple .main-header .navbar{background-color:#605ca8}.skin-purple .main-header .navbar .nav>li>a{color:#fff}.skin-purple .main-header .navbar .nav>li>a:hover,.skin-purple .main-header .navbar .nav>li>a:active,.skin-purple .main-header .navbar .nav>li>a:focus,.skin-purple .main-header .navbar .nav .open>a,.skin-purple .main-header .navbar .nav .open>a:hover,.skin-purple .main-header .navbar .nav .open>a:focus,.skin-purple .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple .main-header .logo{background-color:#555299;color:#fff;border-bottom:0 solid transparent}.skin-purple .main-header .logo:hover{background-color:#545096}.skin-purple .main-header li.user-header{background-color:#605ca8}.skin-purple .content-header{background:transparent}.skin-purple .wrapper,.skin-purple .main-sidebar,.skin-purple .left-side{background-color:#222d32}.skin-purple .user-panel>.info,.skin-purple .user-panel>.info>a{color:#fff}.skin-purple .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-purple .sidebar-menu>li>a{border-left:3px solid transparent}.skin-purple .sidebar-menu>li:hover>a,.skin-purple .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#605ca8}.skin-purple .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-purple .sidebar a{color:#b8c7ce}.skin-purple .sidebar a:hover{text-decoration:none}.skin-purple .treeview-menu>li>a{color:#8aa4af}.skin-purple .treeview-menu>li.active>a,.skin-purple .treeview-menu>li>a:hover{color:#fff}.skin-purple .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-purple .sidebar-form input[type="text"],.skin-purple .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-purple .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple .sidebar-form input[type="text"]:focus,.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-purple-light .main-header .navbar{background-color:#605ca8}.skin-purple-light .main-header .navbar .nav>li>a{color:#fff}.skin-purple-light .main-header .navbar .nav>li>a:hover,.skin-purple-light .main-header .navbar .nav>li>a:active,.skin-purple-light .main-header .navbar .nav>li>a:focus,.skin-purple-light .main-header .navbar .nav .open>a,.skin-purple-light .main-header .navbar .nav .open>a:hover,.skin-purple-light .main-header .navbar .nav .open>a:focus,.skin-purple-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple-light .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple-light .main-header .logo{background-color:#605ca8;color:#fff;border-bottom:0 solid transparent}.skin-purple-light .main-header .logo:hover{background-color:#5d59a6}.skin-purple-light .main-header li.user-header{background-color:#605ca8}.skin-purple-light .content-header{background:transparent}.skin-purple-light .wrapper,.skin-purple-light .main-sidebar,.skin-purple-light .left-side{background-color:#f9fafc}.skin-purple-light .content-wrapper,.skin-purple-light .main-footer{border-left:1px solid #d2d6de}.skin-purple-light .user-panel>.info,.skin-purple-light .user-panel>.info>a{color:#444}.skin-purple-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-purple-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-purple-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-purple-light .sidebar-menu>li:hover>a,.skin-purple-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-purple-light .sidebar-menu>li.active{border-left-color:#605ca8}.skin-purple-light .sidebar-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-purple-light .sidebar a{color:#444}.skin-purple-light .sidebar a:hover{text-decoration:none}.skin-purple-light .treeview-menu>li>a{color:#777}.skin-purple-light .treeview-menu>li.active>a,.skin-purple-light .treeview-menu>li>a:hover{color:#000}.skin-purple-light .treeview-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-purple-light .sidebar-form input[type="text"],.skin-purple-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-purple-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple-light .sidebar-form input[type="text"]:focus,.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/theme/bootstrap/dist/css/skins/skin-black-light.css b/theme/bootstrap/dist/css/skins/skin-black-light.css new file mode 100644 index 0000000..f132dc8 --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-black-light.css @@ -0,0 +1,176 @@ +/* + * Skin: Black + * ----------- + */ +/* skin-black navbar */ +.skin-black-light .main-header { + -webkit-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); +} +.skin-black-light .main-header .navbar-toggle { + color: #333; +} +.skin-black-light .main-header .navbar-brand { + color: #333; + border-right: 1px solid #eee; +} +.skin-black-light .main-header > .navbar { + background-color: #ffffff; +} +.skin-black-light .main-header > .navbar .nav > li > a { + color: #333333; +} +.skin-black-light .main-header > .navbar .nav > li > a:hover, +.skin-black-light .main-header > .navbar .nav > li > a:active, +.skin-black-light .main-header > .navbar .nav > li > a:focus, +.skin-black-light .main-header > .navbar .nav .open > a, +.skin-black-light .main-header > .navbar .nav .open > a:hover, +.skin-black-light .main-header > .navbar .nav .open > a:focus, +.skin-black-light .main-header > .navbar .nav > .active > a { + background: #ffffff; + color: #999999; +} +.skin-black-light .main-header > .navbar .sidebar-toggle { + color: #333333; +} +.skin-black-light .main-header > .navbar .sidebar-toggle:hover { + color: #999999; + background: #ffffff; +} +.skin-black-light .main-header > .navbar > .sidebar-toggle { + color: #333; + border-right: 1px solid #eee; +} +.skin-black-light .main-header > .navbar .navbar-nav > li > a { + border-right: 1px solid #eee; +} +.skin-black-light .main-header > .navbar .navbar-custom-menu .navbar-nav > li > a, +.skin-black-light .main-header > .navbar .navbar-right > li > a { + border-left: 1px solid #eee; + border-right-width: 0; +} +.skin-black-light .main-header > .logo { + background-color: #ffffff; + color: #333333; + border-bottom: 0 solid transparent; + border-right: 1px solid #eee; +} +.skin-black-light .main-header > .logo:hover { + background-color: #fcfcfc; +} +@media (max-width: 767px) { + .skin-black-light .main-header > .logo { + background-color: #222222; + color: #ffffff; + border-bottom: 0 solid transparent; + border-right: none; + } + .skin-black-light .main-header > .logo:hover { + background-color: #1f1f1f; + } +} +.skin-black-light .main-header li.user-header { + background-color: #222; +} +.skin-black-light .content-header { + background: transparent; + box-shadow: none; +} +.skin-black-light .wrapper, +.skin-black-light .main-sidebar, +.skin-black-light .left-side { + background-color: #f9fafc; +} +.skin-black-light .content-wrapper, +.skin-black-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-black-light .user-panel > .info, +.skin-black-light .user-panel > .info > a { + color: #444444; +} +.skin-black-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-black-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-black-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-black-light .sidebar-menu > li:hover > a, +.skin-black-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-black-light .sidebar-menu > li.active { + border-left-color: #ffffff; +} +.skin-black-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-black-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-black-light .sidebar a { + color: #444444; +} +.skin-black-light .sidebar a:hover { + text-decoration: none; +} +.skin-black-light .treeview-menu > li > a { + color: #777777; +} +.skin-black-light .treeview-menu > li.active > a, +.skin-black-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-black-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-black-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-black-light .sidebar-form input[type="text"], +.skin-black-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-black-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-black-light .sidebar-form input[type="text"]:focus, +.skin-black-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-black-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-black-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} diff --git a/theme/bootstrap/dist/css/skins/skin-black-light.min.css b/theme/bootstrap/dist/css/skins/skin-black-light.min.css new file mode 100644 index 0000000..c631ec5 --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-black-light.min.css @@ -0,0 +1 @@ +.skin-black-light .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.skin-black-light .main-header .navbar-toggle{color:#333}.skin-black-light .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black-light .main-header>.navbar{background-color:#fff}.skin-black-light .main-header>.navbar .nav>li>a{color:#333}.skin-black-light .main-header>.navbar .nav>li>a:hover,.skin-black-light .main-header>.navbar .nav>li>a:active,.skin-black-light .main-header>.navbar .nav>li>a:focus,.skin-black-light .main-header>.navbar .nav .open>a,.skin-black-light .main-header>.navbar .nav .open>a:hover,.skin-black-light .main-header>.navbar .nav .open>a:focus,.skin-black-light .main-header>.navbar .nav>.active>a{background:#fff;color:#999}.skin-black-light .main-header>.navbar .sidebar-toggle{color:#333}.skin-black-light .main-header>.navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black-light .main-header>.navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black-light .main-header>.navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black-light .main-header>.navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black-light .main-header>.navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black-light .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black-light .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black-light .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black-light .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black-light .main-header li.user-header{background-color:#222}.skin-black-light .content-header{background:transparent;box-shadow:none}.skin-black-light .wrapper,.skin-black-light .main-sidebar,.skin-black-light .left-side{background-color:#f9fafc}.skin-black-light .content-wrapper,.skin-black-light .main-footer{border-left:1px solid #d2d6de}.skin-black-light .user-panel>.info,.skin-black-light .user-panel>.info>a{color:#444}.skin-black-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-black-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-black-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-black-light .sidebar-menu>li:hover>a,.skin-black-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-black-light .sidebar-menu>li.active{border-left-color:#fff}.skin-black-light .sidebar-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-black-light .sidebar a{color:#444}.skin-black-light .sidebar a:hover{text-decoration:none}.skin-black-light .treeview-menu>li>a{color:#777}.skin-black-light .treeview-menu>li.active>a,.skin-black-light .treeview-menu>li>a:hover{color:#000}.skin-black-light .treeview-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-black-light .sidebar-form input[type="text"],.skin-black-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-black-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black-light .sidebar-form input[type="text"]:focus,.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/theme/bootstrap/dist/css/skins/skin-black.css b/theme/bootstrap/dist/css/skins/skin-black.css new file mode 100644 index 0000000..d33b1f9 --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-black.css @@ -0,0 +1,154 @@ +/* + * Skin: Black + * ----------- + */ +/* skin-black navbar */ +.skin-black .main-header { + -webkit-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05); +} +.skin-black .main-header .navbar-toggle { + color: #333; +} +.skin-black .main-header .navbar-brand { + color: #333; + border-right: 1px solid #eee; +} +.skin-black .main-header > .navbar { + background-color: #ffffff; +} +.skin-black .main-header > .navbar .nav > li > a { + color: #333333; +} +.skin-black .main-header > .navbar .nav > li > a:hover, +.skin-black .main-header > .navbar .nav > li > a:active, +.skin-black .main-header > .navbar .nav > li > a:focus, +.skin-black .main-header > .navbar .nav .open > a, +.skin-black .main-header > .navbar .nav .open > a:hover, +.skin-black .main-header > .navbar .nav .open > a:focus, +.skin-black .main-header > .navbar .nav > .active > a { + background: #ffffff; + color: #999999; +} +.skin-black .main-header > .navbar .sidebar-toggle { + color: #333333; +} +.skin-black .main-header > .navbar .sidebar-toggle:hover { + color: #999999; + background: #ffffff; +} +.skin-black .main-header > .navbar > .sidebar-toggle { + color: #333; + border-right: 1px solid #eee; +} +.skin-black .main-header > .navbar .navbar-nav > li > a { + border-right: 1px solid #eee; +} +.skin-black .main-header > .navbar .navbar-custom-menu .navbar-nav > li > a, +.skin-black .main-header > .navbar .navbar-right > li > a { + border-left: 1px solid #eee; + border-right-width: 0; +} +.skin-black .main-header > .logo { + background-color: #ffffff; + color: #333333; + border-bottom: 0 solid transparent; + border-right: 1px solid #eee; +} +.skin-black .main-header > .logo:hover { + background-color: #fcfcfc; +} +@media (max-width: 767px) { + .skin-black .main-header > .logo { + background-color: #222222; + color: #ffffff; + border-bottom: 0 solid transparent; + border-right: none; + } + .skin-black .main-header > .logo:hover { + background-color: #1f1f1f; + } +} +.skin-black .main-header li.user-header { + background-color: #222; +} +.skin-black .content-header { + background: transparent; + box-shadow: none; +} +.skin-black .wrapper, +.skin-black .main-sidebar, +.skin-black .left-side { + background-color: #222d32; +} +.skin-black .user-panel > .info, +.skin-black .user-panel > .info > a { + color: #fff; +} +.skin-black .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-black .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-black .sidebar-menu > li:hover > a, +.skin-black .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #ffffff; +} +.skin-black .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-black .sidebar a { + color: #b8c7ce; +} +.skin-black .sidebar a:hover { + text-decoration: none; +} +.skin-black .treeview-menu > li > a { + color: #8aa4af; +} +.skin-black .treeview-menu > li.active > a, +.skin-black .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-black .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-black .sidebar-form input[type="text"], +.skin-black .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-black .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-black .sidebar-form input[type="text"]:focus, +.skin-black .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-black .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-black .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} diff --git a/theme/bootstrap/dist/css/skins/skin-black.min.css b/theme/bootstrap/dist/css/skins/skin-black.min.css new file mode 100644 index 0000000..a7d1888 --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-black.min.css @@ -0,0 +1 @@ +.skin-black .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.skin-black .main-header .navbar-toggle{color:#333}.skin-black .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black .main-header>.navbar{background-color:#fff}.skin-black .main-header>.navbar .nav>li>a{color:#333}.skin-black .main-header>.navbar .nav>li>a:hover,.skin-black .main-header>.navbar .nav>li>a:active,.skin-black .main-header>.navbar .nav>li>a:focus,.skin-black .main-header>.navbar .nav .open>a,.skin-black .main-header>.navbar .nav .open>a:hover,.skin-black .main-header>.navbar .nav .open>a:focus,.skin-black .main-header>.navbar .nav>.active>a{background:#fff;color:#999}.skin-black .main-header>.navbar .sidebar-toggle{color:#333}.skin-black .main-header>.navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black .main-header>.navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black .main-header>.navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black .main-header>.navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black .main-header>.navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black .main-header>.logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black .main-header>.logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black .main-header>.logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black .main-header>.logo:hover{background-color:#1f1f1f}}.skin-black .main-header li.user-header{background-color:#222}.skin-black .content-header{background:transparent;box-shadow:none}.skin-black .wrapper,.skin-black .main-sidebar,.skin-black .left-side{background-color:#222d32}.skin-black .user-panel>.info,.skin-black .user-panel>.info>a{color:#fff}.skin-black .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-black .sidebar-menu>li>a{border-left:3px solid transparent}.skin-black .sidebar-menu>li:hover>a,.skin-black .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#fff}.skin-black .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-black .sidebar a{color:#b8c7ce}.skin-black .sidebar a:hover{text-decoration:none}.skin-black .treeview-menu>li>a{color:#8aa4af}.skin-black .treeview-menu>li.active>a,.skin-black .treeview-menu>li>a:hover{color:#fff}.skin-black .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-black .sidebar-form input[type="text"],.skin-black .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-black .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black .sidebar-form input[type="text"]:focus,.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0} \ No newline at end of file diff --git a/theme/bootstrap/dist/css/skins/skin-blue-light.css b/theme/bootstrap/dist/css/skins/skin-blue-light.css new file mode 100644 index 0000000..7614d60 --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-blue-light.css @@ -0,0 +1,167 @@ +/* + * Skin: Blue + * ---------- + */ +.skin-blue-light .main-header .navbar { + background-color: #3c8dbc; +} +.skin-blue-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-blue-light .main-header .navbar .nav > li > a:hover, +.skin-blue-light .main-header .navbar .nav > li > a:active, +.skin-blue-light .main-header .navbar .nav > li > a:focus, +.skin-blue-light .main-header .navbar .nav .open > a, +.skin-blue-light .main-header .navbar .nav .open > a:hover, +.skin-blue-light .main-header .navbar .nav .open > a:focus, +.skin-blue-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-blue-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-blue-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-blue-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-blue-light .main-header .navbar .sidebar-toggle:hover { + background-color: #367fa9; +} +@media (max-width: 767px) { + .skin-blue-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-blue-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-blue-light .main-header .navbar .dropdown-menu li a:hover { + background: #367fa9; + } +} +.skin-blue-light .main-header .logo { + background-color: #3c8dbc; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue-light .main-header .logo:hover { + background-color: #3b8ab8; +} +.skin-blue-light .main-header li.user-header { + background-color: #3c8dbc; +} +.skin-blue-light .content-header { + background: transparent; +} +.skin-blue-light .wrapper, +.skin-blue-light .main-sidebar, +.skin-blue-light .left-side { + background-color: #f9fafc; +} +.skin-blue-light .content-wrapper, +.skin-blue-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-blue-light .user-panel > .info, +.skin-blue-light .user-panel > .info > a { + color: #444444; +} +.skin-blue-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-blue-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-blue-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-blue-light .sidebar-menu > li:hover > a, +.skin-blue-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-blue-light .sidebar-menu > li.active { + border-left-color: #3c8dbc; +} +.skin-blue-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-blue-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-blue-light .sidebar a { + color: #444444; +} +.skin-blue-light .sidebar a:hover { + text-decoration: none; +} +.skin-blue-light .treeview-menu > li > a { + color: #777777; +} +.skin-blue-light .treeview-menu > li.active > a, +.skin-blue-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-blue-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-blue-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-blue-light .sidebar-form input[type="text"], +.skin-blue-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-blue-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-blue-light .sidebar-form input[type="text"]:focus, +.skin-blue-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-blue-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-blue-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} +.skin-blue-light .main-footer { + border-top-color: #d2d6de; +} +.skin-blue.layout-top-nav .main-header > .logo { + background-color: #3c8dbc; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue.layout-top-nav .main-header > .logo:hover { + background-color: #3b8ab8; +} diff --git a/theme/bootstrap/dist/css/skins/skin-blue-light.min.css b/theme/bootstrap/dist/css/skins/skin-blue-light.min.css new file mode 100644 index 0000000..4fab22a --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-blue-light.min.css @@ -0,0 +1 @@ +.skin-blue-light .main-header .navbar{background-color:#3c8dbc}.skin-blue-light .main-header .navbar .nav>li>a{color:#fff}.skin-blue-light .main-header .navbar .nav>li>a:hover,.skin-blue-light .main-header .navbar .nav>li>a:active,.skin-blue-light .main-header .navbar .nav>li>a:focus,.skin-blue-light .main-header .navbar .nav .open>a,.skin-blue-light .main-header .navbar .nav .open>a:hover,.skin-blue-light .main-header .navbar .nav .open>a:focus,.skin-blue-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue-light .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue-light .main-header .logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue-light .main-header .logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header li.user-header{background-color:#3c8dbc}.skin-blue-light .content-header{background:transparent}.skin-blue-light .wrapper,.skin-blue-light .main-sidebar,.skin-blue-light .left-side{background-color:#f9fafc}.skin-blue-light .content-wrapper,.skin-blue-light .main-footer{border-left:1px solid #d2d6de}.skin-blue-light .user-panel>.info,.skin-blue-light .user-panel>.info>a{color:#444}.skin-blue-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-blue-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-blue-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-blue-light .sidebar-menu>li:hover>a,.skin-blue-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-blue-light .sidebar-menu>li.active{border-left-color:#3c8dbc}.skin-blue-light .sidebar-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-blue-light .sidebar a{color:#444}.skin-blue-light .sidebar a:hover{text-decoration:none}.skin-blue-light .treeview-menu>li>a{color:#777}.skin-blue-light .treeview-menu>li.active>a,.skin-blue-light .treeview-menu>li>a:hover{color:#000}.skin-blue-light .treeview-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-blue-light .sidebar-form input[type="text"],.skin-blue-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-blue-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue-light .sidebar-form input[type="text"]:focus,.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-blue-light .main-footer{border-top-color:#d2d6de}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8} \ No newline at end of file diff --git a/theme/bootstrap/dist/css/skins/skin-blue.css b/theme/bootstrap/dist/css/skins/skin-blue.css new file mode 100644 index 0000000..1bc543f --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-blue.css @@ -0,0 +1,142 @@ +/* + * Skin: Blue + * ---------- + */ +.skin-blue .main-header .navbar { + background-color: #3c8dbc; +} +.skin-blue .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-blue .main-header .navbar .nav > li > a:hover, +.skin-blue .main-header .navbar .nav > li > a:active, +.skin-blue .main-header .navbar .nav > li > a:focus, +.skin-blue .main-header .navbar .nav .open > a, +.skin-blue .main-header .navbar .nav .open > a:hover, +.skin-blue .main-header .navbar .nav .open > a:focus, +.skin-blue .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-blue .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-blue .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-blue .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-blue .main-header .navbar .sidebar-toggle:hover { + background-color: #367fa9; +} +@media (max-width: 767px) { + .skin-blue .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-blue .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-blue .main-header .navbar .dropdown-menu li a:hover { + background: #367fa9; + } +} +.skin-blue .main-header .logo { + background-color: #367fa9; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue .main-header .logo:hover { + background-color: #357ca5; +} +.skin-blue .main-header li.user-header { + background-color: #3c8dbc; +} +.skin-blue .content-header { + background: transparent; +} +.skin-blue .wrapper, +.skin-blue .main-sidebar, +.skin-blue .left-side { + background-color: #222d32; +} +.skin-blue .user-panel > .info, +.skin-blue .user-panel > .info > a { + color: #fff; +} +.skin-blue .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-blue .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-blue .sidebar-menu > li:hover > a, +.skin-blue .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #3c8dbc; +} +.skin-blue .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-blue .sidebar a { + color: #b8c7ce; +} +.skin-blue .sidebar a:hover { + text-decoration: none; +} +.skin-blue .treeview-menu > li > a { + color: #8aa4af; +} +.skin-blue .treeview-menu > li.active > a, +.skin-blue .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-blue .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-blue .sidebar-form input[type="text"], +.skin-blue .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-blue .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-blue .sidebar-form input[type="text"]:focus, +.skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-blue .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +.skin-blue.layout-top-nav .main-header > .logo { + background-color: #3c8dbc; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-blue.layout-top-nav .main-header > .logo:hover { + background-color: #3b8ab8; +} diff --git a/theme/bootstrap/dist/css/skins/skin-blue.min.css b/theme/bootstrap/dist/css/skins/skin-blue.min.css new file mode 100644 index 0000000..123c04f --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-blue.min.css @@ -0,0 +1 @@ +.skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav>li>a:hover,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent}.skin-blue .main-header .logo:hover{background-color:#357ca5}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:transparent}.skin-blue .wrapper,.skin-blue .main-sidebar,.skin-blue .left-side{background-color:#222d32}.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li:hover>a,.skin-blue .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .sidebar a:hover{text-decoration:none}.skin-blue .treeview-menu>li>a{color:#8aa4af}.skin-blue .treeview-menu>li.active>a,.skin-blue .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-blue .sidebar-form input[type="text"],.skin-blue .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-blue .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue .sidebar-form input[type="text"]:focus,.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8} \ No newline at end of file diff --git a/theme/bootstrap/dist/css/skins/skin-green-light.css b/theme/bootstrap/dist/css/skins/skin-green-light.css new file mode 100644 index 0000000..f6fc137 --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-green-light.css @@ -0,0 +1,156 @@ +/* + * Skin: Green + * ----------- + */ +.skin-green-light .main-header .navbar { + background-color: #00a65a; +} +.skin-green-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-green-light .main-header .navbar .nav > li > a:hover, +.skin-green-light .main-header .navbar .nav > li > a:active, +.skin-green-light .main-header .navbar .nav > li > a:focus, +.skin-green-light .main-header .navbar .nav .open > a, +.skin-green-light .main-header .navbar .nav .open > a:hover, +.skin-green-light .main-header .navbar .nav .open > a:focus, +.skin-green-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-green-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-green-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-green-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-green-light .main-header .navbar .sidebar-toggle:hover { + background-color: #008d4c; +} +@media (max-width: 767px) { + .skin-green-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-green-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-green-light .main-header .navbar .dropdown-menu li a:hover { + background: #008d4c; + } +} +.skin-green-light .main-header .logo { + background-color: #00a65a; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-green-light .main-header .logo:hover { + background-color: #00a157; +} +.skin-green-light .main-header li.user-header { + background-color: #00a65a; +} +.skin-green-light .content-header { + background: transparent; +} +.skin-green-light .wrapper, +.skin-green-light .main-sidebar, +.skin-green-light .left-side { + background-color: #f9fafc; +} +.skin-green-light .content-wrapper, +.skin-green-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-green-light .user-panel > .info, +.skin-green-light .user-panel > .info > a { + color: #444444; +} +.skin-green-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-green-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-green-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-green-light .sidebar-menu > li:hover > a, +.skin-green-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-green-light .sidebar-menu > li.active { + border-left-color: #00a65a; +} +.skin-green-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-green-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-green-light .sidebar a { + color: #444444; +} +.skin-green-light .sidebar a:hover { + text-decoration: none; +} +.skin-green-light .treeview-menu > li > a { + color: #777777; +} +.skin-green-light .treeview-menu > li.active > a, +.skin-green-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-green-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-green-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-green-light .sidebar-form input[type="text"], +.skin-green-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-green-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-green-light .sidebar-form input[type="text"]:focus, +.skin-green-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-green-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-green-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} diff --git a/theme/bootstrap/dist/css/skins/skin-green-light.min.css b/theme/bootstrap/dist/css/skins/skin-green-light.min.css new file mode 100644 index 0000000..43ceea4 --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-green-light.min.css @@ -0,0 +1 @@ +.skin-green-light .main-header .navbar{background-color:#00a65a}.skin-green-light .main-header .navbar .nav>li>a{color:#fff}.skin-green-light .main-header .navbar .nav>li>a:hover,.skin-green-light .main-header .navbar .nav>li>a:active,.skin-green-light .main-header .navbar .nav>li>a:focus,.skin-green-light .main-header .navbar .nav .open>a,.skin-green-light .main-header .navbar .nav .open>a:hover,.skin-green-light .main-header .navbar .nav .open>a:focus,.skin-green-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green-light .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green-light .main-header .logo{background-color:#00a65a;color:#fff;border-bottom:0 solid transparent}.skin-green-light .main-header .logo:hover{background-color:#00a157}.skin-green-light .main-header li.user-header{background-color:#00a65a}.skin-green-light .content-header{background:transparent}.skin-green-light .wrapper,.skin-green-light .main-sidebar,.skin-green-light .left-side{background-color:#f9fafc}.skin-green-light .content-wrapper,.skin-green-light .main-footer{border-left:1px solid #d2d6de}.skin-green-light .user-panel>.info,.skin-green-light .user-panel>.info>a{color:#444}.skin-green-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-green-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-green-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-green-light .sidebar-menu>li:hover>a,.skin-green-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-green-light .sidebar-menu>li.active{border-left-color:#00a65a}.skin-green-light .sidebar-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-green-light .sidebar a{color:#444}.skin-green-light .sidebar a:hover{text-decoration:none}.skin-green-light .treeview-menu>li>a{color:#777}.skin-green-light .treeview-menu>li.active>a,.skin-green-light .treeview-menu>li>a:hover{color:#000}.skin-green-light .treeview-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-green-light .sidebar-form input[type="text"],.skin-green-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-green-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green-light .sidebar-form input[type="text"]:focus,.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/theme/bootstrap/dist/css/skins/skin-green.css b/theme/bootstrap/dist/css/skins/skin-green.css new file mode 100644 index 0000000..3562493 --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-green.css @@ -0,0 +1,134 @@ +/* + * Skin: Green + * ----------- + */ +.skin-green .main-header .navbar { + background-color: #00a65a; +} +.skin-green .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-green .main-header .navbar .nav > li > a:hover, +.skin-green .main-header .navbar .nav > li > a:active, +.skin-green .main-header .navbar .nav > li > a:focus, +.skin-green .main-header .navbar .nav .open > a, +.skin-green .main-header .navbar .nav .open > a:hover, +.skin-green .main-header .navbar .nav .open > a:focus, +.skin-green .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-green .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-green .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-green .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-green .main-header .navbar .sidebar-toggle:hover { + background-color: #008d4c; +} +@media (max-width: 767px) { + .skin-green .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-green .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-green .main-header .navbar .dropdown-menu li a:hover { + background: #008d4c; + } +} +.skin-green .main-header .logo { + background-color: #008d4c; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-green .main-header .logo:hover { + background-color: #008749; +} +.skin-green .main-header li.user-header { + background-color: #00a65a; +} +.skin-green .content-header { + background: transparent; +} +.skin-green .wrapper, +.skin-green .main-sidebar, +.skin-green .left-side { + background-color: #222d32; +} +.skin-green .user-panel > .info, +.skin-green .user-panel > .info > a { + color: #fff; +} +.skin-green .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-green .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-green .sidebar-menu > li:hover > a, +.skin-green .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #00a65a; +} +.skin-green .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-green .sidebar a { + color: #b8c7ce; +} +.skin-green .sidebar a:hover { + text-decoration: none; +} +.skin-green .treeview-menu > li > a { + color: #8aa4af; +} +.skin-green .treeview-menu > li.active > a, +.skin-green .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-green .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-green .sidebar-form input[type="text"], +.skin-green .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-green .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-green .sidebar-form input[type="text"]:focus, +.skin-green .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-green .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-green .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} diff --git a/theme/bootstrap/dist/css/skins/skin-green.min.css b/theme/bootstrap/dist/css/skins/skin-green.min.css new file mode 100644 index 0000000..8f885ed --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-green.min.css @@ -0,0 +1 @@ +.skin-green .main-header .navbar{background-color:#00a65a}.skin-green .main-header .navbar .nav>li>a{color:#fff}.skin-green .main-header .navbar .nav>li>a:hover,.skin-green .main-header .navbar .nav>li>a:active,.skin-green .main-header .navbar .nav>li>a:focus,.skin-green .main-header .navbar .nav .open>a,.skin-green .main-header .navbar .nav .open>a:hover,.skin-green .main-header .navbar .nav .open>a:focus,.skin-green .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green .main-header .logo{background-color:#008d4c;color:#fff;border-bottom:0 solid transparent}.skin-green .main-header .logo:hover{background-color:#008749}.skin-green .main-header li.user-header{background-color:#00a65a}.skin-green .content-header{background:transparent}.skin-green .wrapper,.skin-green .main-sidebar,.skin-green .left-side{background-color:#222d32}.skin-green .user-panel>.info,.skin-green .user-panel>.info>a{color:#fff}.skin-green .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-green .sidebar-menu>li>a{border-left:3px solid transparent}.skin-green .sidebar-menu>li:hover>a,.skin-green .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#00a65a}.skin-green .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-green .sidebar a{color:#b8c7ce}.skin-green .sidebar a:hover{text-decoration:none}.skin-green .treeview-menu>li>a{color:#8aa4af}.skin-green .treeview-menu>li.active>a,.skin-green .treeview-menu>li>a:hover{color:#fff}.skin-green .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-green .sidebar-form input[type="text"],.skin-green .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-green .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green .sidebar-form input[type="text"]:focus,.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0} \ No newline at end of file diff --git a/theme/bootstrap/dist/css/skins/skin-purple-light.css b/theme/bootstrap/dist/css/skins/skin-purple-light.css new file mode 100644 index 0000000..551eacb --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-purple-light.css @@ -0,0 +1,156 @@ +/* + * Skin: Purple + * ------------ + */ +.skin-purple-light .main-header .navbar { + background-color: #605ca8; +} +.skin-purple-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-purple-light .main-header .navbar .nav > li > a:hover, +.skin-purple-light .main-header .navbar .nav > li > a:active, +.skin-purple-light .main-header .navbar .nav > li > a:focus, +.skin-purple-light .main-header .navbar .nav .open > a, +.skin-purple-light .main-header .navbar .nav .open > a:hover, +.skin-purple-light .main-header .navbar .nav .open > a:focus, +.skin-purple-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-purple-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-purple-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-purple-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-purple-light .main-header .navbar .sidebar-toggle:hover { + background-color: #555299; +} +@media (max-width: 767px) { + .skin-purple-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-purple-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-purple-light .main-header .navbar .dropdown-menu li a:hover { + background: #555299; + } +} +.skin-purple-light .main-header .logo { + background-color: #605ca8; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-purple-light .main-header .logo:hover { + background-color: #5d59a6; +} +.skin-purple-light .main-header li.user-header { + background-color: #605ca8; +} +.skin-purple-light .content-header { + background: transparent; +} +.skin-purple-light .wrapper, +.skin-purple-light .main-sidebar, +.skin-purple-light .left-side { + background-color: #f9fafc; +} +.skin-purple-light .content-wrapper, +.skin-purple-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-purple-light .user-panel > .info, +.skin-purple-light .user-panel > .info > a { + color: #444444; +} +.skin-purple-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-purple-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-purple-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-purple-light .sidebar-menu > li:hover > a, +.skin-purple-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-purple-light .sidebar-menu > li.active { + border-left-color: #605ca8; +} +.skin-purple-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-purple-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-purple-light .sidebar a { + color: #444444; +} +.skin-purple-light .sidebar a:hover { + text-decoration: none; +} +.skin-purple-light .treeview-menu > li > a { + color: #777777; +} +.skin-purple-light .treeview-menu > li.active > a, +.skin-purple-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-purple-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-purple-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-purple-light .sidebar-form input[type="text"], +.skin-purple-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-purple-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-purple-light .sidebar-form input[type="text"]:focus, +.skin-purple-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-purple-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-purple-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} diff --git a/theme/bootstrap/dist/css/skins/skin-purple-light.min.css b/theme/bootstrap/dist/css/skins/skin-purple-light.min.css new file mode 100644 index 0000000..53333c4 --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-purple-light.min.css @@ -0,0 +1 @@ +.skin-purple-light .main-header .navbar{background-color:#605ca8}.skin-purple-light .main-header .navbar .nav>li>a{color:#fff}.skin-purple-light .main-header .navbar .nav>li>a:hover,.skin-purple-light .main-header .navbar .nav>li>a:active,.skin-purple-light .main-header .navbar .nav>li>a:focus,.skin-purple-light .main-header .navbar .nav .open>a,.skin-purple-light .main-header .navbar .nav .open>a:hover,.skin-purple-light .main-header .navbar .nav .open>a:focus,.skin-purple-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple-light .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple-light .main-header .logo{background-color:#605ca8;color:#fff;border-bottom:0 solid transparent}.skin-purple-light .main-header .logo:hover{background-color:#5d59a6}.skin-purple-light .main-header li.user-header{background-color:#605ca8}.skin-purple-light .content-header{background:transparent}.skin-purple-light .wrapper,.skin-purple-light .main-sidebar,.skin-purple-light .left-side{background-color:#f9fafc}.skin-purple-light .content-wrapper,.skin-purple-light .main-footer{border-left:1px solid #d2d6de}.skin-purple-light .user-panel>.info,.skin-purple-light .user-panel>.info>a{color:#444}.skin-purple-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-purple-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-purple-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-purple-light .sidebar-menu>li:hover>a,.skin-purple-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-purple-light .sidebar-menu>li.active{border-left-color:#605ca8}.skin-purple-light .sidebar-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-purple-light .sidebar a{color:#444}.skin-purple-light .sidebar a:hover{text-decoration:none}.skin-purple-light .treeview-menu>li>a{color:#777}.skin-purple-light .treeview-menu>li.active>a,.skin-purple-light .treeview-menu>li>a:hover{color:#000}.skin-purple-light .treeview-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-purple-light .sidebar-form input[type="text"],.skin-purple-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-purple-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple-light .sidebar-form input[type="text"]:focus,.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/theme/bootstrap/dist/css/skins/skin-purple.css b/theme/bootstrap/dist/css/skins/skin-purple.css new file mode 100644 index 0000000..b1d6c8a --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-purple.css @@ -0,0 +1,134 @@ +/* + * Skin: Purple + * ------------ + */ +.skin-purple .main-header .navbar { + background-color: #605ca8; +} +.skin-purple .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-purple .main-header .navbar .nav > li > a:hover, +.skin-purple .main-header .navbar .nav > li > a:active, +.skin-purple .main-header .navbar .nav > li > a:focus, +.skin-purple .main-header .navbar .nav .open > a, +.skin-purple .main-header .navbar .nav .open > a:hover, +.skin-purple .main-header .navbar .nav .open > a:focus, +.skin-purple .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-purple .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-purple .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-purple .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-purple .main-header .navbar .sidebar-toggle:hover { + background-color: #555299; +} +@media (max-width: 767px) { + .skin-purple .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-purple .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-purple .main-header .navbar .dropdown-menu li a:hover { + background: #555299; + } +} +.skin-purple .main-header .logo { + background-color: #555299; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-purple .main-header .logo:hover { + background-color: #545096; +} +.skin-purple .main-header li.user-header { + background-color: #605ca8; +} +.skin-purple .content-header { + background: transparent; +} +.skin-purple .wrapper, +.skin-purple .main-sidebar, +.skin-purple .left-side { + background-color: #222d32; +} +.skin-purple .user-panel > .info, +.skin-purple .user-panel > .info > a { + color: #fff; +} +.skin-purple .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-purple .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-purple .sidebar-menu > li:hover > a, +.skin-purple .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #605ca8; +} +.skin-purple .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-purple .sidebar a { + color: #b8c7ce; +} +.skin-purple .sidebar a:hover { + text-decoration: none; +} +.skin-purple .treeview-menu > li > a { + color: #8aa4af; +} +.skin-purple .treeview-menu > li.active > a, +.skin-purple .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-purple .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-purple .sidebar-form input[type="text"], +.skin-purple .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-purple .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-purple .sidebar-form input[type="text"]:focus, +.skin-purple .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-purple .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-purple .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} diff --git a/theme/bootstrap/dist/css/skins/skin-purple.min.css b/theme/bootstrap/dist/css/skins/skin-purple.min.css new file mode 100644 index 0000000..1eff3d9 --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-purple.min.css @@ -0,0 +1 @@ +.skin-purple .main-header .navbar{background-color:#605ca8}.skin-purple .main-header .navbar .nav>li>a{color:#fff}.skin-purple .main-header .navbar .nav>li>a:hover,.skin-purple .main-header .navbar .nav>li>a:active,.skin-purple .main-header .navbar .nav>li>a:focus,.skin-purple .main-header .navbar .nav .open>a,.skin-purple .main-header .navbar .nav .open>a:hover,.skin-purple .main-header .navbar .nav .open>a:focus,.skin-purple .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple .main-header .logo{background-color:#555299;color:#fff;border-bottom:0 solid transparent}.skin-purple .main-header .logo:hover{background-color:#545096}.skin-purple .main-header li.user-header{background-color:#605ca8}.skin-purple .content-header{background:transparent}.skin-purple .wrapper,.skin-purple .main-sidebar,.skin-purple .left-side{background-color:#222d32}.skin-purple .user-panel>.info,.skin-purple .user-panel>.info>a{color:#fff}.skin-purple .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-purple .sidebar-menu>li>a{border-left:3px solid transparent}.skin-purple .sidebar-menu>li:hover>a,.skin-purple .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#605ca8}.skin-purple .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-purple .sidebar a{color:#b8c7ce}.skin-purple .sidebar a:hover{text-decoration:none}.skin-purple .treeview-menu>li>a{color:#8aa4af}.skin-purple .treeview-menu>li.active>a,.skin-purple .treeview-menu>li>a:hover{color:#fff}.skin-purple .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-purple .sidebar-form input[type="text"],.skin-purple .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-purple .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple .sidebar-form input[type="text"]:focus,.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0} \ No newline at end of file diff --git a/theme/bootstrap/dist/css/skins/skin-red-light.css b/theme/bootstrap/dist/css/skins/skin-red-light.css new file mode 100644 index 0000000..4ba687f --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-red-light.css @@ -0,0 +1,156 @@ +/* + * Skin: Red + * --------- + */ +.skin-red-light .main-header .navbar { + background-color: #dd4b39; +} +.skin-red-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-red-light .main-header .navbar .nav > li > a:hover, +.skin-red-light .main-header .navbar .nav > li > a:active, +.skin-red-light .main-header .navbar .nav > li > a:focus, +.skin-red-light .main-header .navbar .nav .open > a, +.skin-red-light .main-header .navbar .nav .open > a:hover, +.skin-red-light .main-header .navbar .nav .open > a:focus, +.skin-red-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-red-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-red-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-red-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-red-light .main-header .navbar .sidebar-toggle:hover { + background-color: #d73925; +} +@media (max-width: 767px) { + .skin-red-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-red-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-red-light .main-header .navbar .dropdown-menu li a:hover { + background: #d73925; + } +} +.skin-red-light .main-header .logo { + background-color: #dd4b39; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-red-light .main-header .logo:hover { + background-color: #dc4735; +} +.skin-red-light .main-header li.user-header { + background-color: #dd4b39; +} +.skin-red-light .content-header { + background: transparent; +} +.skin-red-light .wrapper, +.skin-red-light .main-sidebar, +.skin-red-light .left-side { + background-color: #f9fafc; +} +.skin-red-light .content-wrapper, +.skin-red-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-red-light .user-panel > .info, +.skin-red-light .user-panel > .info > a { + color: #444444; +} +.skin-red-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-red-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-red-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-red-light .sidebar-menu > li:hover > a, +.skin-red-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-red-light .sidebar-menu > li.active { + border-left-color: #dd4b39; +} +.skin-red-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-red-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-red-light .sidebar a { + color: #444444; +} +.skin-red-light .sidebar a:hover { + text-decoration: none; +} +.skin-red-light .treeview-menu > li > a { + color: #777777; +} +.skin-red-light .treeview-menu > li.active > a, +.skin-red-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-red-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-red-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-red-light .sidebar-form input[type="text"], +.skin-red-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-red-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-red-light .sidebar-form input[type="text"]:focus, +.skin-red-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-red-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-red-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} diff --git a/theme/bootstrap/dist/css/skins/skin-red-light.min.css b/theme/bootstrap/dist/css/skins/skin-red-light.min.css new file mode 100644 index 0000000..7ab4c1f --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-red-light.min.css @@ -0,0 +1 @@ +.skin-red-light .main-header .navbar{background-color:#dd4b39}.skin-red-light .main-header .navbar .nav>li>a{color:#fff}.skin-red-light .main-header .navbar .nav>li>a:hover,.skin-red-light .main-header .navbar .nav>li>a:active,.skin-red-light .main-header .navbar .nav>li>a:focus,.skin-red-light .main-header .navbar .nav .open>a,.skin-red-light .main-header .navbar .nav .open>a:hover,.skin-red-light .main-header .navbar .nav .open>a:focus,.skin-red-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red-light .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red-light .main-header .logo{background-color:#dd4b39;color:#fff;border-bottom:0 solid transparent}.skin-red-light .main-header .logo:hover{background-color:#dc4735}.skin-red-light .main-header li.user-header{background-color:#dd4b39}.skin-red-light .content-header{background:transparent}.skin-red-light .wrapper,.skin-red-light .main-sidebar,.skin-red-light .left-side{background-color:#f9fafc}.skin-red-light .content-wrapper,.skin-red-light .main-footer{border-left:1px solid #d2d6de}.skin-red-light .user-panel>.info,.skin-red-light .user-panel>.info>a{color:#444}.skin-red-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-red-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-red-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-red-light .sidebar-menu>li:hover>a,.skin-red-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-red-light .sidebar-menu>li.active{border-left-color:#dd4b39}.skin-red-light .sidebar-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-red-light .sidebar a{color:#444}.skin-red-light .sidebar a:hover{text-decoration:none}.skin-red-light .treeview-menu>li>a{color:#777}.skin-red-light .treeview-menu>li.active>a,.skin-red-light .treeview-menu>li>a:hover{color:#000}.skin-red-light .treeview-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-red-light .sidebar-form input[type="text"],.skin-red-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-red-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red-light .sidebar-form input[type="text"]:focus,.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/theme/bootstrap/dist/css/skins/skin-red.css b/theme/bootstrap/dist/css/skins/skin-red.css new file mode 100644 index 0000000..6071511 --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-red.css @@ -0,0 +1,134 @@ +/* + * Skin: Red + * --------- + */ +.skin-red .main-header .navbar { + background-color: #dd4b39; +} +.skin-red .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-red .main-header .navbar .nav > li > a:hover, +.skin-red .main-header .navbar .nav > li > a:active, +.skin-red .main-header .navbar .nav > li > a:focus, +.skin-red .main-header .navbar .nav .open > a, +.skin-red .main-header .navbar .nav .open > a:hover, +.skin-red .main-header .navbar .nav .open > a:focus, +.skin-red .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-red .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-red .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-red .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-red .main-header .navbar .sidebar-toggle:hover { + background-color: #d73925; +} +@media (max-width: 767px) { + .skin-red .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-red .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-red .main-header .navbar .dropdown-menu li a:hover { + background: #d73925; + } +} +.skin-red .main-header .logo { + background-color: #d73925; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-red .main-header .logo:hover { + background-color: #d33724; +} +.skin-red .main-header li.user-header { + background-color: #dd4b39; +} +.skin-red .content-header { + background: transparent; +} +.skin-red .wrapper, +.skin-red .main-sidebar, +.skin-red .left-side { + background-color: #222d32; +} +.skin-red .user-panel > .info, +.skin-red .user-panel > .info > a { + color: #fff; +} +.skin-red .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-red .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-red .sidebar-menu > li:hover > a, +.skin-red .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #dd4b39; +} +.skin-red .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-red .sidebar a { + color: #b8c7ce; +} +.skin-red .sidebar a:hover { + text-decoration: none; +} +.skin-red .treeview-menu > li > a { + color: #8aa4af; +} +.skin-red .treeview-menu > li.active > a, +.skin-red .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-red .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-red .sidebar-form input[type="text"], +.skin-red .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-red .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-red .sidebar-form input[type="text"]:focus, +.skin-red .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-red .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-red .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} diff --git a/theme/bootstrap/dist/css/skins/skin-red.min.css b/theme/bootstrap/dist/css/skins/skin-red.min.css new file mode 100644 index 0000000..3252b27 --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-red.min.css @@ -0,0 +1 @@ +.skin-red .main-header .navbar{background-color:#dd4b39}.skin-red .main-header .navbar .nav>li>a{color:#fff}.skin-red .main-header .navbar .nav>li>a:hover,.skin-red .main-header .navbar .nav>li>a:active,.skin-red .main-header .navbar .nav>li>a:focus,.skin-red .main-header .navbar .nav .open>a,.skin-red .main-header .navbar .nav .open>a:hover,.skin-red .main-header .navbar .nav .open>a:focus,.skin-red .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red .main-header .logo{background-color:#d73925;color:#fff;border-bottom:0 solid transparent}.skin-red .main-header .logo:hover{background-color:#d33724}.skin-red .main-header li.user-header{background-color:#dd4b39}.skin-red .content-header{background:transparent}.skin-red .wrapper,.skin-red .main-sidebar,.skin-red .left-side{background-color:#222d32}.skin-red .user-panel>.info,.skin-red .user-panel>.info>a{color:#fff}.skin-red .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-red .sidebar-menu>li>a{border-left:3px solid transparent}.skin-red .sidebar-menu>li:hover>a,.skin-red .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#dd4b39}.skin-red .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-red .sidebar a{color:#b8c7ce}.skin-red .sidebar a:hover{text-decoration:none}.skin-red .treeview-menu>li>a{color:#8aa4af}.skin-red .treeview-menu>li.active>a,.skin-red .treeview-menu>li>a:hover{color:#fff}.skin-red .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-red .sidebar-form input[type="text"],.skin-red .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-red .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red .sidebar-form input[type="text"]:focus,.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0} \ No newline at end of file diff --git a/theme/bootstrap/dist/css/skins/skin-yellow-light.css b/theme/bootstrap/dist/css/skins/skin-yellow-light.css new file mode 100644 index 0000000..1c977d4 --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-yellow-light.css @@ -0,0 +1,156 @@ +/* + * Skin: Yellow + * ------------ + */ +.skin-yellow-light .main-header .navbar { + background-color: #f39c12; +} +.skin-yellow-light .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-yellow-light .main-header .navbar .nav > li > a:hover, +.skin-yellow-light .main-header .navbar .nav > li > a:active, +.skin-yellow-light .main-header .navbar .nav > li > a:focus, +.skin-yellow-light .main-header .navbar .nav .open > a, +.skin-yellow-light .main-header .navbar .nav .open > a:hover, +.skin-yellow-light .main-header .navbar .nav .open > a:focus, +.skin-yellow-light .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-yellow-light .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-yellow-light .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-yellow-light .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-yellow-light .main-header .navbar .sidebar-toggle:hover { + background-color: #e08e0b; +} +@media (max-width: 767px) { + .skin-yellow-light .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-yellow-light .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-yellow-light .main-header .navbar .dropdown-menu li a:hover { + background: #e08e0b; + } +} +.skin-yellow-light .main-header .logo { + background-color: #f39c12; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-yellow-light .main-header .logo:hover { + background-color: #f39a0d; +} +.skin-yellow-light .main-header li.user-header { + background-color: #f39c12; +} +.skin-yellow-light .content-header { + background: transparent; +} +.skin-yellow-light .wrapper, +.skin-yellow-light .main-sidebar, +.skin-yellow-light .left-side { + background-color: #f9fafc; +} +.skin-yellow-light .content-wrapper, +.skin-yellow-light .main-footer { + border-left: 1px solid #d2d6de; +} +.skin-yellow-light .user-panel > .info, +.skin-yellow-light .user-panel > .info > a { + color: #444444; +} +.skin-yellow-light .sidebar-menu > li { + -webkit-transition: border-left-color 0.3s ease; + -o-transition: border-left-color 0.3s ease; + transition: border-left-color 0.3s ease; +} +.skin-yellow-light .sidebar-menu > li.header { + color: #848484; + background: #f9fafc; +} +.skin-yellow-light .sidebar-menu > li > a { + border-left: 3px solid transparent; + font-weight: 600; +} +.skin-yellow-light .sidebar-menu > li:hover > a, +.skin-yellow-light .sidebar-menu > li.active > a { + color: #000000; + background: #f4f4f5; +} +.skin-yellow-light .sidebar-menu > li.active { + border-left-color: #f39c12; +} +.skin-yellow-light .sidebar-menu > li.active > a { + font-weight: 600; +} +.skin-yellow-light .sidebar-menu > li > .treeview-menu { + background: #f4f4f5; +} +.skin-yellow-light .sidebar a { + color: #444444; +} +.skin-yellow-light .sidebar a:hover { + text-decoration: none; +} +.skin-yellow-light .treeview-menu > li > a { + color: #777777; +} +.skin-yellow-light .treeview-menu > li.active > a, +.skin-yellow-light .treeview-menu > li > a:hover { + color: #000000; +} +.skin-yellow-light .treeview-menu > li.active > a { + font-weight: 600; +} +.skin-yellow-light .sidebar-form { + border-radius: 3px; + border: 1px solid #d2d6de; + margin: 10px 10px; +} +.skin-yellow-light .sidebar-form input[type="text"], +.skin-yellow-light .sidebar-form .btn { + box-shadow: none; + background-color: #fff; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-yellow-light .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-yellow-light .sidebar-form input[type="text"]:focus, +.skin-yellow-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-yellow-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-yellow-light .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} +@media (min-width: 768px) { + .skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu { + border-left: 1px solid #d2d6de; + } +} diff --git a/theme/bootstrap/dist/css/skins/skin-yellow-light.min.css b/theme/bootstrap/dist/css/skins/skin-yellow-light.min.css new file mode 100644 index 0000000..773b254 --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-yellow-light.min.css @@ -0,0 +1 @@ +.skin-yellow-light .main-header .navbar{background-color:#f39c12}.skin-yellow-light .main-header .navbar .nav>li>a{color:#fff}.skin-yellow-light .main-header .navbar .nav>li>a:hover,.skin-yellow-light .main-header .navbar .nav>li>a:active,.skin-yellow-light .main-header .navbar .nav>li>a:focus,.skin-yellow-light .main-header .navbar .nav .open>a,.skin-yellow-light .main-header .navbar .nav .open>a:hover,.skin-yellow-light .main-header .navbar .nav .open>a:focus,.skin-yellow-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow-light .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow-light .main-header .logo{background-color:#f39c12;color:#fff;border-bottom:0 solid transparent}.skin-yellow-light .main-header .logo:hover{background-color:#f39a0d}.skin-yellow-light .main-header li.user-header{background-color:#f39c12}.skin-yellow-light .content-header{background:transparent}.skin-yellow-light .wrapper,.skin-yellow-light .main-sidebar,.skin-yellow-light .left-side{background-color:#f9fafc}.skin-yellow-light .content-wrapper,.skin-yellow-light .main-footer{border-left:1px solid #d2d6de}.skin-yellow-light .user-panel>.info,.skin-yellow-light .user-panel>.info>a{color:#444}.skin-yellow-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-yellow-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-yellow-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-yellow-light .sidebar-menu>li:hover>a,.skin-yellow-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-yellow-light .sidebar-menu>li.active{border-left-color:#f39c12}.skin-yellow-light .sidebar-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-yellow-light .sidebar a{color:#444}.skin-yellow-light .sidebar a:hover{text-decoration:none}.skin-yellow-light .treeview-menu>li>a{color:#777}.skin-yellow-light .treeview-menu>li.active>a,.skin-yellow-light .treeview-menu>li>a:hover{color:#000}.skin-yellow-light .treeview-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-yellow-light .sidebar-form input[type="text"],.skin-yellow-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-yellow-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow-light .sidebar-form input[type="text"]:focus,.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}} \ No newline at end of file diff --git a/theme/bootstrap/dist/css/skins/skin-yellow.css b/theme/bootstrap/dist/css/skins/skin-yellow.css new file mode 100644 index 0000000..df00a41 --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-yellow.css @@ -0,0 +1,134 @@ +/* + * Skin: Yellow + * ------------ + */ +.skin-yellow .main-header .navbar { + background-color: #f39c12; +} +.skin-yellow .main-header .navbar .nav > li > a { + color: #ffffff; +} +.skin-yellow .main-header .navbar .nav > li > a:hover, +.skin-yellow .main-header .navbar .nav > li > a:active, +.skin-yellow .main-header .navbar .nav > li > a:focus, +.skin-yellow .main-header .navbar .nav .open > a, +.skin-yellow .main-header .navbar .nav .open > a:hover, +.skin-yellow .main-header .navbar .nav .open > a:focus, +.skin-yellow .main-header .navbar .nav > .active > a { + background: rgba(0, 0, 0, 0.1); + color: #f6f6f6; +} +.skin-yellow .main-header .navbar .sidebar-toggle { + color: #ffffff; +} +.skin-yellow .main-header .navbar .sidebar-toggle:hover { + color: #f6f6f6; + background: rgba(0, 0, 0, 0.1); +} +.skin-yellow .main-header .navbar .sidebar-toggle { + color: #fff; +} +.skin-yellow .main-header .navbar .sidebar-toggle:hover { + background-color: #e08e0b; +} +@media (max-width: 767px) { + .skin-yellow .main-header .navbar .dropdown-menu li.divider { + background-color: rgba(255, 255, 255, 0.1); + } + .skin-yellow .main-header .navbar .dropdown-menu li a { + color: #fff; + } + .skin-yellow .main-header .navbar .dropdown-menu li a:hover { + background: #e08e0b; + } +} +.skin-yellow .main-header .logo { + background-color: #e08e0b; + color: #ffffff; + border-bottom: 0 solid transparent; +} +.skin-yellow .main-header .logo:hover { + background-color: #db8b0b; +} +.skin-yellow .main-header li.user-header { + background-color: #f39c12; +} +.skin-yellow .content-header { + background: transparent; +} +.skin-yellow .wrapper, +.skin-yellow .main-sidebar, +.skin-yellow .left-side { + background-color: #222d32; +} +.skin-yellow .user-panel > .info, +.skin-yellow .user-panel > .info > a { + color: #fff; +} +.skin-yellow .sidebar-menu > li.header { + color: #4b646f; + background: #1a2226; +} +.skin-yellow .sidebar-menu > li > a { + border-left: 3px solid transparent; +} +.skin-yellow .sidebar-menu > li:hover > a, +.skin-yellow .sidebar-menu > li.active > a { + color: #ffffff; + background: #1e282c; + border-left-color: #f39c12; +} +.skin-yellow .sidebar-menu > li > .treeview-menu { + margin: 0 1px; + background: #2c3b41; +} +.skin-yellow .sidebar a { + color: #b8c7ce; +} +.skin-yellow .sidebar a:hover { + text-decoration: none; +} +.skin-yellow .treeview-menu > li > a { + color: #8aa4af; +} +.skin-yellow .treeview-menu > li.active > a, +.skin-yellow .treeview-menu > li > a:hover { + color: #ffffff; +} +.skin-yellow .sidebar-form { + border-radius: 3px; + border: 1px solid #374850; + margin: 10px 10px; +} +.skin-yellow .sidebar-form input[type="text"], +.skin-yellow .sidebar-form .btn { + box-shadow: none; + background-color: #374850; + border: 1px solid transparent; + height: 35px; + -webkit-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.skin-yellow .sidebar-form input[type="text"] { + color: #666; + border-top-left-radius: 2px; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-bottom-left-radius: 2px; +} +.skin-yellow .sidebar-form input[type="text"]:focus, +.skin-yellow .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + background-color: #fff; + color: #666; +} +.skin-yellow .sidebar-form input[type="text"]:focus + .input-group-btn .btn { + border-left-color: #fff; +} +.skin-yellow .sidebar-form .btn { + color: #999; + border-top-left-radius: 0; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 0; +} diff --git a/theme/bootstrap/dist/css/skins/skin-yellow.min.css b/theme/bootstrap/dist/css/skins/skin-yellow.min.css new file mode 100644 index 0000000..67fc2e2 --- /dev/null +++ b/theme/bootstrap/dist/css/skins/skin-yellow.min.css @@ -0,0 +1 @@ +.skin-yellow .main-header .navbar{background-color:#f39c12}.skin-yellow .main-header .navbar .nav>li>a{color:#fff}.skin-yellow .main-header .navbar .nav>li>a:hover,.skin-yellow .main-header .navbar .nav>li>a:active,.skin-yellow .main-header .navbar .nav>li>a:focus,.skin-yellow .main-header .navbar .nav .open>a,.skin-yellow .main-header .navbar .nav .open>a:hover,.skin-yellow .main-header .navbar .nav .open>a:focus,.skin-yellow .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow .main-header .logo{background-color:#e08e0b;color:#fff;border-bottom:0 solid transparent}.skin-yellow .main-header .logo:hover{background-color:#db8b0b}.skin-yellow .main-header li.user-header{background-color:#f39c12}.skin-yellow .content-header{background:transparent}.skin-yellow .wrapper,.skin-yellow .main-sidebar,.skin-yellow .left-side{background-color:#222d32}.skin-yellow .user-panel>.info,.skin-yellow .user-panel>.info>a{color:#fff}.skin-yellow .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-yellow .sidebar-menu>li>a{border-left:3px solid transparent}.skin-yellow .sidebar-menu>li:hover>a,.skin-yellow .sidebar-menu>li.active>a{color:#fff;background:#1e282c;border-left-color:#f39c12}.skin-yellow .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-yellow .sidebar a{color:#b8c7ce}.skin-yellow .sidebar a:hover{text-decoration:none}.skin-yellow .treeview-menu>li>a{color:#8aa4af}.skin-yellow .treeview-menu>li.active>a,.skin-yellow .treeview-menu>li>a:hover{color:#fff}.skin-yellow .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-yellow .sidebar-form input[type="text"],.skin-yellow .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px;-webkit-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.skin-yellow .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow .sidebar-form input[type="text"]:focus,.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0} \ No newline at end of file diff --git a/theme/bootstrap/dist/img/avatar.png b/theme/bootstrap/dist/img/avatar.png new file mode 100644 index 0000000..309f882 Binary files /dev/null and b/theme/bootstrap/dist/img/avatar.png differ diff --git a/theme/bootstrap/dist/img/avatar04.png b/theme/bootstrap/dist/img/avatar04.png new file mode 100644 index 0000000..28e0340 Binary files /dev/null and b/theme/bootstrap/dist/img/avatar04.png differ diff --git a/theme/bootstrap/dist/img/avatar2.png b/theme/bootstrap/dist/img/avatar2.png new file mode 100644 index 0000000..9eaf548 Binary files /dev/null and b/theme/bootstrap/dist/img/avatar2.png differ diff --git a/theme/bootstrap/dist/img/avatar3.png b/theme/bootstrap/dist/img/avatar3.png new file mode 100644 index 0000000..9ca2b3e Binary files /dev/null and b/theme/bootstrap/dist/img/avatar3.png differ diff --git a/theme/bootstrap/dist/img/avatar5.png b/theme/bootstrap/dist/img/avatar5.png new file mode 100644 index 0000000..49d4b92 Binary files /dev/null and b/theme/bootstrap/dist/img/avatar5.png differ diff --git a/theme/bootstrap/dist/img/boxed-bg.jpg b/theme/bootstrap/dist/img/boxed-bg.jpg new file mode 100644 index 0000000..e47586a Binary files /dev/null and b/theme/bootstrap/dist/img/boxed-bg.jpg differ diff --git a/theme/bootstrap/dist/img/boxed-bg.png b/theme/bootstrap/dist/img/boxed-bg.png new file mode 100644 index 0000000..2f9f1ad Binary files /dev/null and b/theme/bootstrap/dist/img/boxed-bg.png differ diff --git a/theme/bootstrap/dist/img/credit/american-express.png b/theme/bootstrap/dist/img/credit/american-express.png new file mode 100644 index 0000000..01f4741 Binary files /dev/null and b/theme/bootstrap/dist/img/credit/american-express.png differ diff --git a/theme/bootstrap/dist/img/credit/cirrus.png b/theme/bootstrap/dist/img/credit/cirrus.png new file mode 100644 index 0000000..9675627 Binary files /dev/null and b/theme/bootstrap/dist/img/credit/cirrus.png differ diff --git a/theme/bootstrap/dist/img/credit/mastercard.png b/theme/bootstrap/dist/img/credit/mastercard.png new file mode 100644 index 0000000..5a8beca Binary files /dev/null and b/theme/bootstrap/dist/img/credit/mastercard.png differ diff --git a/theme/bootstrap/dist/img/credit/mestro.png b/theme/bootstrap/dist/img/credit/mestro.png new file mode 100644 index 0000000..8749b84 Binary files /dev/null and b/theme/bootstrap/dist/img/credit/mestro.png differ diff --git a/theme/bootstrap/dist/img/credit/paypal.png b/theme/bootstrap/dist/img/credit/paypal.png new file mode 100644 index 0000000..a8421ca Binary files /dev/null and b/theme/bootstrap/dist/img/credit/paypal.png differ diff --git a/theme/bootstrap/dist/img/credit/paypal2.png b/theme/bootstrap/dist/img/credit/paypal2.png new file mode 100644 index 0000000..2ccdde9 Binary files /dev/null and b/theme/bootstrap/dist/img/credit/paypal2.png differ diff --git a/theme/bootstrap/dist/img/credit/visa.png b/theme/bootstrap/dist/img/credit/visa.png new file mode 100644 index 0000000..af20eff Binary files /dev/null and b/theme/bootstrap/dist/img/credit/visa.png differ diff --git a/theme/bootstrap/dist/img/default-50x50.gif b/theme/bootstrap/dist/img/default-50x50.gif new file mode 100644 index 0000000..2f5a14a Binary files /dev/null and b/theme/bootstrap/dist/img/default-50x50.gif differ diff --git a/theme/bootstrap/dist/img/icons.png b/theme/bootstrap/dist/img/icons.png new file mode 100644 index 0000000..048c8d2 Binary files /dev/null and b/theme/bootstrap/dist/img/icons.png differ diff --git a/theme/bootstrap/dist/img/photo1.png b/theme/bootstrap/dist/img/photo1.png new file mode 100644 index 0000000..24bc2ed Binary files /dev/null and b/theme/bootstrap/dist/img/photo1.png differ diff --git a/theme/bootstrap/dist/img/photo2.png b/theme/bootstrap/dist/img/photo2.png new file mode 100644 index 0000000..3071ee8 Binary files /dev/null and b/theme/bootstrap/dist/img/photo2.png differ diff --git a/theme/bootstrap/dist/img/photo3.jpg b/theme/bootstrap/dist/img/photo3.jpg new file mode 100644 index 0000000..63daa81 Binary files /dev/null and b/theme/bootstrap/dist/img/photo3.jpg differ diff --git a/theme/bootstrap/dist/img/photo4.jpg b/theme/bootstrap/dist/img/photo4.jpg new file mode 100644 index 0000000..c700ef3 Binary files /dev/null and b/theme/bootstrap/dist/img/photo4.jpg differ diff --git a/theme/bootstrap/dist/img/user1-128x128.jpg b/theme/bootstrap/dist/img/user1-128x128.jpg new file mode 100644 index 0000000..b0ae99a Binary files /dev/null and b/theme/bootstrap/dist/img/user1-128x128.jpg differ diff --git a/theme/bootstrap/dist/img/user2-160x160.jpg b/theme/bootstrap/dist/img/user2-160x160.jpg new file mode 100644 index 0000000..aec74cb Binary files /dev/null and b/theme/bootstrap/dist/img/user2-160x160.jpg differ diff --git a/theme/bootstrap/dist/img/user3-128x128.jpg b/theme/bootstrap/dist/img/user3-128x128.jpg new file mode 100644 index 0000000..caf5f96 Binary files /dev/null and b/theme/bootstrap/dist/img/user3-128x128.jpg differ diff --git a/theme/bootstrap/dist/img/user4-128x128.jpg b/theme/bootstrap/dist/img/user4-128x128.jpg new file mode 100644 index 0000000..eb8e2bb Binary files /dev/null and b/theme/bootstrap/dist/img/user4-128x128.jpg differ diff --git a/theme/bootstrap/dist/img/user5-128x128.jpg b/theme/bootstrap/dist/img/user5-128x128.jpg new file mode 100644 index 0000000..b637aad Binary files /dev/null and b/theme/bootstrap/dist/img/user5-128x128.jpg differ diff --git a/theme/bootstrap/dist/img/user6-128x128.jpg b/theme/bootstrap/dist/img/user6-128x128.jpg new file mode 100644 index 0000000..3ac2468 Binary files /dev/null and b/theme/bootstrap/dist/img/user6-128x128.jpg differ diff --git a/theme/bootstrap/dist/img/user7-128x128.jpg b/theme/bootstrap/dist/img/user7-128x128.jpg new file mode 100644 index 0000000..97febc2 Binary files /dev/null and b/theme/bootstrap/dist/img/user7-128x128.jpg differ diff --git a/theme/bootstrap/dist/img/user8-128x128.jpg b/theme/bootstrap/dist/img/user8-128x128.jpg new file mode 100644 index 0000000..6e717b4 Binary files /dev/null and b/theme/bootstrap/dist/img/user8-128x128.jpg differ diff --git a/theme/bootstrap/dist/js/app.js b/theme/bootstrap/dist/js/app.js new file mode 100644 index 0000000..561d448 --- /dev/null +++ b/theme/bootstrap/dist/js/app.js @@ -0,0 +1,746 @@ +/*! AdminLTE app.js + * ================ + * Main JS application file for AdminLTE v2. This file + * should be included in all pages. It controls some layout + * options and implements exclusive AdminLTE plugins. + * + * @Author Almsaeed Studio + * @Support <http://www.almsaeedstudio.com> + * @Email <support@almsaeedstudio.com> + * @version 2.3.0 + * @license MIT <http://opensource.org/licenses/MIT> + */ + +//Make sure jQuery has been loaded before app.js +if (typeof jQuery === "undefined") { + throw new Error("AdminLTE requires jQuery"); +} + +/* AdminLTE + * + * @type Object + * @description $.AdminLTE is the main object for the template's app. + * It's used for implementing functions and options related + * to the template. Keeping everything wrapped in an object + * prevents conflict with other plugins and is a better + * way to organize our code. + */ +$.AdminLTE = {}; + +/* -------------------- + * - AdminLTE Options - + * -------------------- + * Modify these options to suit your implementation + */ +$.AdminLTE.options = { + //Add slimscroll to navbar menus + //This requires you to load the slimscroll plugin + //in every page before app.js + navbarMenuSlimscroll: true, + navbarMenuSlimscrollWidth: "3px", //The width of the scroll bar + navbarMenuHeight: "200px", //The height of the inner menu + //General animation speed for JS animated elements such as box collapse/expand and + //sidebar treeview slide up/down. This options accepts an integer as milliseconds, + //'fast', 'normal', or 'slow' + animationSpeed: 500, + //Sidebar push menu toggle button selector + sidebarToggleSelector: "[data-toggle='offcanvas']", + //Activate sidebar push menu + sidebarPushMenu: true, + //Activate sidebar slimscroll if the fixed layout is set (requires SlimScroll Plugin) + sidebarSlimScroll: true, + //Enable sidebar expand on hover effect for sidebar mini + //This option is forced to true if both the fixed layout and sidebar mini + //are used together + sidebarExpandOnHover: false, + //BoxRefresh Plugin + enableBoxRefresh: true, + //Bootstrap.js tooltip + enableBSToppltip: true, + BSTooltipSelector: "[data-toggle='tooltip']", + //Enable Fast Click. Fastclick.js creates a more + //native touch experience with touch devices. If you + //choose to enable the plugin, make sure you load the script + //before AdminLTE's app.js + enableFastclick: true, + //Control Sidebar Options + enableControlSidebar: true, + controlSidebarOptions: { + //Which button should trigger the open/close event + toggleBtnSelector: "[data-toggle='control-sidebar']", + //The sidebar selector + selector: ".control-sidebar", + //Enable slide over content + slide: true + }, + //Box Widget Plugin. Enable this plugin + //to allow boxes to be collapsed and/or removed + enableBoxWidget: true, + //Box Widget plugin options + boxWidgetOptions: { + boxWidgetIcons: { + //Collapse icon + collapse: 'fa-minus', + //Open icon + open: 'fa-plus', + //Remove icon + remove: 'fa-times' + }, + boxWidgetSelectors: { + //Remove button selector + remove: '[data-widget="remove"]', + //Collapse button selector + collapse: '[data-widget="collapse"]' + } + }, + //Direct Chat plugin options + directChat: { + //Enable direct chat by default + enable: true, + //The button to open and close the chat contacts pane + contactToggleSelector: '[data-widget="chat-pane-toggle"]' + }, + //Define the set of colors to use globally around the website + colors: { + lightBlue: "#3c8dbc", + red: "#f56954", + green: "#00a65a", + aqua: "#00c0ef", + yellow: "#f39c12", + blue: "#0073b7", + navy: "#001F3F", + teal: "#39CCCC", + olive: "#3D9970", + lime: "#01FF70", + orange: "#FF851B", + fuchsia: "#F012BE", + purple: "#8E24AA", + maroon: "#D81B60", + black: "#222222", + gray: "#d2d6de" + }, + //The standard screen sizes that bootstrap uses. + //If you change these in the variables.less file, change + //them here too. + screenSizes: { + xs: 480, + sm: 768, + md: 992, + lg: 1200 + } +}; + +/* ------------------ + * - Implementation - + * ------------------ + * The next block of code implements AdminLTE's + * functions and plugins as specified by the + * options above. + */ +$(function () { + "use strict"; + + //Fix for IE page transitions + $("body").removeClass("hold-transition"); + + //Extend options if external options exist + if (typeof AdminLTEOptions !== "undefined") { + $.extend(true, + $.AdminLTE.options, + AdminLTEOptions); + } + + //Easy access to options + var o = $.AdminLTE.options; + + //Set up the object + _init(); + + //Activate the layout maker + $.AdminLTE.layout.activate(); + + //Enable sidebar tree view controls + $.AdminLTE.tree('.sidebar'); + + //Enable control sidebar + if (o.enableControlSidebar) { + $.AdminLTE.controlSidebar.activate(); + } + + //Add slimscroll to navbar dropdown + if (o.navbarMenuSlimscroll && typeof $.fn.slimscroll != 'undefined') { + $(".navbar .menu").slimscroll({ + height: o.navbarMenuHeight, + alwaysVisible: false, + size: o.navbarMenuSlimscrollWidth + }).css("width", "100%"); + } + + //Activate sidebar push menu + if (o.sidebarPushMenu) { + $.AdminLTE.pushMenu.activate(o.sidebarToggleSelector); + } + + //Activate Bootstrap tooltip + if (o.enableBSToppltip) { + $('body').tooltip({ + selector: o.BSTooltipSelector + }); + } + + //Activate box widget + if (o.enableBoxWidget) { + $.AdminLTE.boxWidget.activate(); + } + + //Activate fast click + if (o.enableFastclick && typeof FastClick != 'undefined') { + FastClick.attach(document.body); + } + + //Activate direct chat widget + if (o.directChat.enable) { + $(document).on('click', o.directChat.contactToggleSelector, function () { + var box = $(this).parents('.direct-chat').first(); + box.toggleClass('direct-chat-contacts-open'); + }); + } + + /* + * INITIALIZE BUTTON TOGGLE + * ------------------------ + */ + $('.btn-group[data-toggle="btn-toggle"]').each(function () { + var group = $(this); + $(this).find(".btn").on('click', function (e) { + group.find(".btn.active").removeClass("active"); + $(this).addClass("active"); + e.preventDefault(); + }); + + }); +}); + +/* ---------------------------------- + * - Initialize the AdminLTE Object - + * ---------------------------------- + * All AdminLTE functions are implemented below. + */ +function _init() { + 'use strict'; + /* Layout + * ====== + * Fixes the layout height in case min-height fails. + * + * @type Object + * @usage $.AdminLTE.layout.activate() + * $.AdminLTE.layout.fix() + * $.AdminLTE.layout.fixSidebar() + */ + $.AdminLTE.layout = { + activate: function () { + var _this = this; + _this.fix(); + _this.fixSidebar(); + $(window, ".wrapper").resize(function () { + _this.fix(); + _this.fixSidebar(); + }); + }, + fix: function () { + //Get window height and the wrapper height + var neg = $('.main-header').outerHeight() + $('.main-footer').outerHeight(); + var window_height = $(window).height(); + var sidebar_height = $(".sidebar").height(); + //Set the min-height of the content and sidebar based on the + //the height of the document. + if ($("body").hasClass("fixed")) { + $(".content-wrapper, .right-side").css('min-height', window_height - $('.main-footer').outerHeight()); + } else { + var postSetWidth; + if (window_height >= sidebar_height) { + $(".content-wrapper, .right-side").css('min-height', window_height - neg); + postSetWidth = window_height - neg; + } else { + $(".content-wrapper, .right-side").css('min-height', sidebar_height); + postSetWidth = sidebar_height; + } + + //Fix for the control sidebar height + var controlSidebar = $($.AdminLTE.options.controlSidebarOptions.selector); + if (typeof controlSidebar !== "undefined") { + if (controlSidebar.height() > postSetWidth) + $(".content-wrapper, .right-side").css('min-height', controlSidebar.height()); + } + + } + }, + fixSidebar: function () { + //Make sure the body tag has the .fixed class + if (!$("body").hasClass("fixed")) { + if (typeof $.fn.slimScroll != 'undefined') { + $(".sidebar").slimScroll({destroy: true}).height("auto"); + } + return; + } else if (typeof $.fn.slimScroll == 'undefined' && window.console) { + window.console.error("Error: the fixed layout requires the slimscroll plugin!"); + } + //Enable slimscroll for fixed layout + if ($.AdminLTE.options.sidebarSlimScroll) { + if (typeof $.fn.slimScroll != 'undefined') { + //Destroy if it exists + $(".sidebar").slimScroll({destroy: true}).height("auto"); + //Add slimscroll + $(".sidebar").slimscroll({ + height: ($(window).height() - $(".main-header").height()) + "px", + color: "rgba(0,0,0,0.2)", + size: "3px" + }); + } + } + } + }; + + /* PushMenu() + * ========== + * Adds the push menu functionality to the sidebar. + * + * @type Function + * @usage: $.AdminLTE.pushMenu("[data-toggle='offcanvas']") + */ + $.AdminLTE.pushMenu = { + activate: function (toggleBtn) { + //Get the screen sizes + var screenSizes = $.AdminLTE.options.screenSizes; + + //Enable sidebar toggle + $(toggleBtn).on('click', function (e) { + e.preventDefault(); + + //Enable sidebar push menu + if ($(window).width() > (screenSizes.sm - 1)) { + if ($("body").hasClass('sidebar-collapse')) { + $("body").removeClass('sidebar-collapse').trigger('expanded.pushMenu'); + } else { + $("body").addClass('sidebar-collapse').trigger('collapsed.pushMenu'); + } + } + //Handle sidebar push menu for small screens + else { + if ($("body").hasClass('sidebar-open')) { + $("body").removeClass('sidebar-open').removeClass('sidebar-collapse').trigger('collapsed.pushMenu'); + } else { + $("body").addClass('sidebar-open').trigger('expanded.pushMenu'); + } + } + }); + + $(".content-wrapper").click(function () { + //Enable hide menu when clicking on the content-wrapper on small screens + if ($(window).width() <= (screenSizes.sm - 1) && $("body").hasClass("sidebar-open")) { + $("body").removeClass('sidebar-open'); + } + }); + + //Enable expand on hover for sidebar mini + if ($.AdminLTE.options.sidebarExpandOnHover + || ($('body').hasClass('fixed') + && $('body').hasClass('sidebar-mini'))) { + this.expandOnHover(); + } + }, + expandOnHover: function () { + var _this = this; + var screenWidth = $.AdminLTE.options.screenSizes.sm - 1; + //Expand sidebar on hover + $('.main-sidebar').hover(function () { + if ($('body').hasClass('sidebar-mini') + && $("body").hasClass('sidebar-collapse') + && $(window).width() > screenWidth) { + _this.expand(); + } + }, function () { + if ($('body').hasClass('sidebar-mini') + && $('body').hasClass('sidebar-expanded-on-hover') + && $(window).width() > screenWidth) { + _this.collapse(); + } + }); + }, + expand: function () { + $("body").removeClass('sidebar-collapse').addClass('sidebar-expanded-on-hover'); + }, + collapse: function () { + if ($('body').hasClass('sidebar-expanded-on-hover')) { + $('body').removeClass('sidebar-expanded-on-hover').addClass('sidebar-collapse'); + } + } + }; + + /* Tree() + * ====== + * Converts the sidebar into a multilevel + * tree view menu. + * + * @type Function + * @Usage: $.AdminLTE.tree('.sidebar') + */ + $.AdminLTE.tree = function (menu) { + var _this = this; + var animationSpeed = $.AdminLTE.options.animationSpeed; + $(document).on('click', menu + ' li a', function (e) { + //Get the clicked link and the next element + var $this = $(this); + var checkElement = $this.next(); + + //Check if the next element is a menu and is visible + if ((checkElement.is('.treeview-menu')) && (checkElement.is(':visible'))) { + //Close the menu + checkElement.slideUp(animationSpeed, function () { + checkElement.removeClass('menu-open'); + //Fix the layout in case the sidebar stretches over the height of the window + //_this.layout.fix(); + }); + checkElement.parent("li").removeClass("active"); + } + //If the menu is not visible + else if ((checkElement.is('.treeview-menu')) && (!checkElement.is(':visible'))) { + //Get the parent menu + var parent = $this.parents('ul').first(); + //Close all open menus within the parent + var ul = parent.find('ul:visible').slideUp(animationSpeed); + //Remove the menu-open class from the parent + ul.removeClass('menu-open'); + //Get the parent li + var parent_li = $this.parent("li"); + + //Open the target menu and add the menu-open class + checkElement.slideDown(animationSpeed, function () { + //Add the class active to the parent li + checkElement.addClass('menu-open'); + parent.find('li.active').removeClass('active'); + parent_li.addClass('active'); + //Fix the layout in case the sidebar stretches over the height of the window + _this.layout.fix(); + }); + } + //if this isn't a link, prevent the page from being redirected + if (checkElement.is('.treeview-menu')) { + e.preventDefault(); + } + }); + }; + + /* ControlSidebar + * ============== + * Adds functionality to the right sidebar + * + * @type Object + * @usage $.AdminLTE.controlSidebar.activate(options) + */ + $.AdminLTE.controlSidebar = { + //instantiate the object + activate: function () { + //Get the object + var _this = this; + //Update options + var o = $.AdminLTE.options.controlSidebarOptions; + //Get the sidebar + var sidebar = $(o.selector); + //The toggle button + var btn = $(o.toggleBtnSelector); + + //Listen to the click event + btn.on('click', function (e) { + e.preventDefault(); + //If the sidebar is not open + if (!sidebar.hasClass('control-sidebar-open') + && !$('body').hasClass('control-sidebar-open')) { + //Open the sidebar + _this.open(sidebar, o.slide); + } else { + _this.close(sidebar, o.slide); + } + }); + + //If the body has a boxed layout, fix the sidebar bg position + var bg = $(".control-sidebar-bg"); + _this._fix(bg); + + //If the body has a fixed layout, make the control sidebar fixed + if ($('body').hasClass('fixed')) { + _this._fixForFixed(sidebar); + } else { + //If the content height is less than the sidebar's height, force max height + if ($('.content-wrapper, .right-side').height() < sidebar.height()) { + _this._fixForContent(sidebar); + } + } + }, + //Open the control sidebar + open: function (sidebar, slide) { + //Slide over content + if (slide) { + sidebar.addClass('control-sidebar-open'); + } else { + //Push the content by adding the open class to the body instead + //of the sidebar itself + $('body').addClass('control-sidebar-open'); + } + }, + //Close the control sidebar + close: function (sidebar, slide) { + if (slide) { + sidebar.removeClass('control-sidebar-open'); + } else { + $('body').removeClass('control-sidebar-open'); + } + }, + _fix: function (sidebar) { + var _this = this; + if ($("body").hasClass('layout-boxed')) { + sidebar.css('position', 'absolute'); + sidebar.height($(".wrapper").height()); + $(window).resize(function () { + _this._fix(sidebar); + }); + } else { + sidebar.css({ + 'position': 'fixed', + 'height': 'auto' + }); + } + }, + _fixForFixed: function (sidebar) { + sidebar.css({ + 'position': 'fixed', + 'max-height': '100%', + 'overflow': 'auto', + 'padding-bottom': '50px' + }); + }, + _fixForContent: function (sidebar) { + $(".content-wrapper, .right-side").css('min-height', sidebar.height()); + } + }; + + /* BoxWidget + * ========= + * BoxWidget is a plugin to handle collapsing and + * removing boxes from the screen. + * + * @type Object + * @usage $.AdminLTE.boxWidget.activate() + * Set all your options in the main $.AdminLTE.options object + */ + $.AdminLTE.boxWidget = { + selectors: $.AdminLTE.options.boxWidgetOptions.boxWidgetSelectors, + icons: $.AdminLTE.options.boxWidgetOptions.boxWidgetIcons, + animationSpeed: $.AdminLTE.options.animationSpeed, + activate: function (_box) { + var _this = this; + if (!_box) { + _box = document; // activate all boxes per default + } + //Listen for collapse event triggers + $(_box).on('click', _this.selectors.collapse, function (e) { + e.preventDefault(); + _this.collapse($(this)); + }); + + //Listen for remove event triggers + $(_box).on('click', _this.selectors.remove, function (e) { + e.preventDefault(); + _this.remove($(this)); + }); + }, + collapse: function (element) { + var _this = this; + //Find the box parent + var box = element.parents(".box").first(); + //Find the body and the footer + var box_content = box.find("> .box-body, > .box-footer, > form >.box-body, > form > .box-footer"); + if (!box.hasClass("collapsed-box")) { + //Convert minus into plus + element.children(":first") + .removeClass(_this.icons.collapse) + .addClass(_this.icons.open); + //Hide the content + box_content.slideUp(_this.animationSpeed, function () { + box.addClass("collapsed-box"); + }); + } else { + //Convert plus into minus + element.children(":first") + .removeClass(_this.icons.open) + .addClass(_this.icons.collapse); + //Show the content + box_content.slideDown(_this.animationSpeed, function () { + box.removeClass("collapsed-box"); + }); + } + }, + remove: function (element) { + //Find the box parent + var box = element.parents(".box").first(); + box.slideUp(this.animationSpeed); + } + }; +} + +/* ------------------ + * - Custom Plugins - + * ------------------ + * All custom plugins are defined below. + */ + +/* + * BOX REFRESH BUTTON + * ------------------ + * This is a custom plugin to use with the component BOX. It allows you to add + * a refresh button to the box. It converts the box's state to a loading state. + * + * @type plugin + * @usage $("#box-widget").boxRefresh( options ); + */ +(function ($) { + + "use strict"; + + $.fn.boxRefresh = function (options) { + + // Render options + var settings = $.extend({ + //Refresh button selector + trigger: ".refresh-btn", + //File source to be loaded (e.g: ajax/src.php) + source: "", + //Callbacks + onLoadStart: function (box) { + return box; + }, //Right after the button has been clicked + onLoadDone: function (box) { + return box; + } //When the source has been loaded + + }, options); + + //The overlay + var overlay = $('<div class="overlay"><div class="fa fa-refresh fa-spin"></div></div>'); + + return this.each(function () { + //if a source is specified + if (settings.source === "") { + if (window.console) { + window.console.log("Please specify a source first - boxRefresh()"); + } + return; + } + //the box + var box = $(this); + //the button + var rBtn = box.find(settings.trigger).first(); + + //On trigger click + rBtn.on('click', function (e) { + e.preventDefault(); + //Add loading overlay + start(box); + + //Perform ajax call + box.find(".box-body").load(settings.source, function () { + done(box); + }); + }); + }); + + function start(box) { + //Add overlay and loading img + box.append(overlay); + + settings.onLoadStart.call(box); + } + + function done(box) { + //Remove overlay and loading img + box.find(overlay).remove(); + + settings.onLoadDone.call(box); + } + + }; + +})(jQuery); + +/* + * EXPLICIT BOX ACTIVATION + * ----------------------- + * This is a custom plugin to use with the component BOX. It allows you to activate + * a box inserted in the DOM after the app.js was loaded. + * + * @type plugin + * @usage $("#box-widget").activateBox(); + */ +(function ($) { + + 'use strict'; + + $.fn.activateBox = function () { + $.AdminLTE.boxWidget.activate(this); + }; + +})(jQuery); + +/* + * TODO LIST CUSTOM PLUGIN + * ----------------------- + * This plugin depends on iCheck plugin for checkbox and radio inputs + * + * @type plugin + * @usage $("#todo-widget").todolist( options ); + */ +(function ($) { + + 'use strict'; + + $.fn.todolist = function (options) { + // Render options + var settings = $.extend({ + //When the user checks the input + onCheck: function (ele) { + return ele; + }, + //When the user unchecks the input + onUncheck: function (ele) { + return ele; + } + }, options); + + return this.each(function () { + + if (typeof $.fn.iCheck != 'undefined') { + $('input', this).on('ifChecked', function () { + var ele = $(this).parents("li").first(); + ele.toggleClass("done"); + settings.onCheck.call(ele); + }); + + $('input', this).on('ifUnchecked', function () { + var ele = $(this).parents("li").first(); + ele.toggleClass("done"); + settings.onUncheck.call(ele); + }); + } else { + $('input', this).on('change', function () { + var ele = $(this).parents("li").first(); + ele.toggleClass("done"); + if ($('input', ele).is(":checked")) { + settings.onCheck.call(ele); + } else { + settings.onUncheck.call(ele); + } + }); + } + }); + }; +}(jQuery)); \ No newline at end of file diff --git a/theme/bootstrap/dist/js/app.min.js b/theme/bootstrap/dist/js/app.min.js new file mode 100644 index 0000000..679f18f --- /dev/null +++ b/theme/bootstrap/dist/js/app.min.js @@ -0,0 +1,13 @@ +/*! AdminLTE app.js + * ================ + * Main JS application file for AdminLTE v2. This file + * should be included in all pages. It controls some layout + * options and implements exclusive AdminLTE plugins. + * + * @Author Almsaeed Studio + * @Support <http://www.almsaeedstudio.com> + * @Email <support@almsaeedstudio.com> + * @version 2.3.0 + * @license MIT <http://opensource.org/licenses/MIT> + */ +function _init(){"use strict";$.AdminLTE.layout={activate:function(){var a=this;a.fix(),a.fixSidebar(),$(window,".wrapper").resize(function(){a.fix(),a.fixSidebar()})},fix:function(){var a=$(".main-header").outerHeight()+$(".main-footer").outerHeight(),b=$(window).height(),c=$(".sidebar").height();if($("body").hasClass("fixed"))$(".content-wrapper, .right-side").css("min-height",b-$(".main-footer").outerHeight());else{var d;b>=c?($(".content-wrapper, .right-side").css("min-height",b-a),d=b-a):($(".content-wrapper, .right-side").css("min-height",c),d=c);var e=$($.AdminLTE.options.controlSidebarOptions.selector);"undefined"!=typeof e&&e.height()>d&&$(".content-wrapper, .right-side").css("min-height",e.height())}},fixSidebar:function(){return $("body").hasClass("fixed")?("undefined"==typeof $.fn.slimScroll&&window.console&&window.console.error("Error: the fixed layout requires the slimscroll plugin!"),void($.AdminLTE.options.sidebarSlimScroll&&"undefined"!=typeof $.fn.slimScroll&&($(".sidebar").slimScroll({destroy:!0}).height("auto"),$(".sidebar").slimscroll({height:$(window).height()-$(".main-header").height()+"px",color:"rgba(0,0,0,0.2)",size:"3px"})))):void("undefined"!=typeof $.fn.slimScroll&&$(".sidebar").slimScroll({destroy:!0}).height("auto"))}},$.AdminLTE.pushMenu={activate:function(a){var b=$.AdminLTE.options.screenSizes;$(a).on("click",function(a){a.preventDefault(),$(window).width()>b.sm-1?$("body").hasClass("sidebar-collapse")?$("body").removeClass("sidebar-collapse").trigger("expanded.pushMenu"):$("body").addClass("sidebar-collapse").trigger("collapsed.pushMenu"):$("body").hasClass("sidebar-open")?$("body").removeClass("sidebar-open").removeClass("sidebar-collapse").trigger("collapsed.pushMenu"):$("body").addClass("sidebar-open").trigger("expanded.pushMenu")}),$(".content-wrapper").click(function(){$(window).width()<=b.sm-1&&$("body").hasClass("sidebar-open")&&$("body").removeClass("sidebar-open")}),($.AdminLTE.options.sidebarExpandOnHover||$("body").hasClass("fixed")&&$("body").hasClass("sidebar-mini"))&&this.expandOnHover()},expandOnHover:function(){var a=this,b=$.AdminLTE.options.screenSizes.sm-1;$(".main-sidebar").hover(function(){$("body").hasClass("sidebar-mini")&&$("body").hasClass("sidebar-collapse")&&$(window).width()>b&&a.expand()},function(){$("body").hasClass("sidebar-mini")&&$("body").hasClass("sidebar-expanded-on-hover")&&$(window).width()>b&&a.collapse()})},expand:function(){$("body").removeClass("sidebar-collapse").addClass("sidebar-expanded-on-hover")},collapse:function(){$("body").hasClass("sidebar-expanded-on-hover")&&$("body").removeClass("sidebar-expanded-on-hover").addClass("sidebar-collapse")}},$.AdminLTE.tree=function(a){var b=this,c=$.AdminLTE.options.animationSpeed;$(document).on("click",a+" li a",function(a){var d=$(this),e=d.next();if(e.is(".treeview-menu")&&e.is(":visible"))e.slideUp(c,function(){e.removeClass("menu-open")}),e.parent("li").removeClass("active");else if(e.is(".treeview-menu")&&!e.is(":visible")){var f=d.parents("ul").first(),g=f.find("ul:visible").slideUp(c);g.removeClass("menu-open");var h=d.parent("li");e.slideDown(c,function(){e.addClass("menu-open"),f.find("li.active").removeClass("active"),h.addClass("active"),b.layout.fix()})}e.is(".treeview-menu")&&a.preventDefault()})},$.AdminLTE.controlSidebar={activate:function(){var a=this,b=$.AdminLTE.options.controlSidebarOptions,c=$(b.selector),d=$(b.toggleBtnSelector);d.on("click",function(d){d.preventDefault(),c.hasClass("control-sidebar-open")||$("body").hasClass("control-sidebar-open")?a.close(c,b.slide):a.open(c,b.slide)});var e=$(".control-sidebar-bg");a._fix(e),$("body").hasClass("fixed")?a._fixForFixed(c):$(".content-wrapper, .right-side").height()<c.height()&&a._fixForContent(c)},open:function(a,b){b?a.addClass("control-sidebar-open"):$("body").addClass("control-sidebar-open")},close:function(a,b){b?a.removeClass("control-sidebar-open"):$("body").removeClass("control-sidebar-open")},_fix:function(a){var b=this;$("body").hasClass("layout-boxed")?(a.css("position","absolute"),a.height($(".wrapper").height()),$(window).resize(function(){b._fix(a)})):a.css({position:"fixed",height:"auto"})},_fixForFixed:function(a){a.css({position:"fixed","max-height":"100%",overflow:"auto","padding-bottom":"50px"})},_fixForContent:function(a){$(".content-wrapper, .right-side").css("min-height",a.height())}},$.AdminLTE.boxWidget={selectors:$.AdminLTE.options.boxWidgetOptions.boxWidgetSelectors,icons:$.AdminLTE.options.boxWidgetOptions.boxWidgetIcons,animationSpeed:$.AdminLTE.options.animationSpeed,activate:function(a){var b=this;a||(a=document),$(a).on("click",b.selectors.collapse,function(a){a.preventDefault(),b.collapse($(this))}),$(a).on("click",b.selectors.remove,function(a){a.preventDefault(),b.remove($(this))})},collapse:function(a){var b=this,c=a.parents(".box").first(),d=c.find("> .box-body, > .box-footer, > form >.box-body, > form > .box-footer");c.hasClass("collapsed-box")?(a.children(":first").removeClass(b.icons.open).addClass(b.icons.collapse),d.slideDown(b.animationSpeed,function(){c.removeClass("collapsed-box")})):(a.children(":first").removeClass(b.icons.collapse).addClass(b.icons.open),d.slideUp(b.animationSpeed,function(){c.addClass("collapsed-box")}))},remove:function(a){var b=a.parents(".box").first();b.slideUp(this.animationSpeed)}}}if("undefined"==typeof jQuery)throw new Error("AdminLTE requires jQuery");$.AdminLTE={},$.AdminLTE.options={navbarMenuSlimscroll:!0,navbarMenuSlimscrollWidth:"3px",navbarMenuHeight:"200px",animationSpeed:500,sidebarToggleSelector:"[data-toggle='offcanvas']",sidebarPushMenu:!0,sidebarSlimScroll:!0,sidebarExpandOnHover:!1,enableBoxRefresh:!0,enableBSToppltip:!0,BSTooltipSelector:"[data-toggle='tooltip']",enableFastclick:!0,enableControlSidebar:!0,controlSidebarOptions:{toggleBtnSelector:"[data-toggle='control-sidebar']",selector:".control-sidebar",slide:!0},enableBoxWidget:!0,boxWidgetOptions:{boxWidgetIcons:{collapse:"fa-minus",open:"fa-plus",remove:"fa-times"},boxWidgetSelectors:{remove:'[data-widget="remove"]',collapse:'[data-widget="collapse"]'}},directChat:{enable:!0,contactToggleSelector:'[data-widget="chat-pane-toggle"]'},colors:{lightBlue:"#3c8dbc",red:"#f56954",green:"#00a65a",aqua:"#00c0ef",yellow:"#f39c12",blue:"#0073b7",navy:"#001F3F",teal:"#39CCCC",olive:"#3D9970",lime:"#01FF70",orange:"#FF851B",fuchsia:"#F012BE",purple:"#8E24AA",maroon:"#D81B60",black:"#222222",gray:"#d2d6de"},screenSizes:{xs:480,sm:768,md:992,lg:1200}},$(function(){"use strict";$("body").removeClass("hold-transition"),"undefined"!=typeof AdminLTEOptions&&$.extend(!0,$.AdminLTE.options,AdminLTEOptions);var a=$.AdminLTE.options;_init(),$.AdminLTE.layout.activate(),$.AdminLTE.tree(".sidebar"),a.enableControlSidebar&&$.AdminLTE.controlSidebar.activate(),a.navbarMenuSlimscroll&&"undefined"!=typeof $.fn.slimscroll&&$(".navbar .menu").slimscroll({height:a.navbarMenuHeight,alwaysVisible:!1,size:a.navbarMenuSlimscrollWidth}).css("width","100%"),a.sidebarPushMenu&&$.AdminLTE.pushMenu.activate(a.sidebarToggleSelector),a.enableBSToppltip&&$("body").tooltip({selector:a.BSTooltipSelector}),a.enableBoxWidget&&$.AdminLTE.boxWidget.activate(),a.enableFastclick&&"undefined"!=typeof FastClick&&FastClick.attach(document.body),a.directChat.enable&&$(document).on("click",a.directChat.contactToggleSelector,function(){var a=$(this).parents(".direct-chat").first();a.toggleClass("direct-chat-contacts-open")}),$('.btn-group[data-toggle="btn-toggle"]').each(function(){var a=$(this);$(this).find(".btn").on("click",function(b){a.find(".btn.active").removeClass("active"),$(this).addClass("active"),b.preventDefault()})})}),function(a){"use strict";a.fn.boxRefresh=function(b){function c(a){a.append(f),e.onLoadStart.call(a)}function d(a){a.find(f).remove(),e.onLoadDone.call(a)}var e=a.extend({trigger:".refresh-btn",source:"",onLoadStart:function(a){return a},onLoadDone:function(a){return a}},b),f=a('<div class="overlay"><div class="fa fa-refresh fa-spin"></div></div>');return this.each(function(){if(""===e.source)return void(window.console&&window.console.log("Please specify a source first - boxRefresh()"));var b=a(this),f=b.find(e.trigger).first();f.on("click",function(a){a.preventDefault(),c(b),b.find(".box-body").load(e.source,function(){d(b)})})})}}(jQuery),function(a){"use strict";a.fn.activateBox=function(){a.AdminLTE.boxWidget.activate(this)}}(jQuery),function(a){"use strict";a.fn.todolist=function(b){var c=a.extend({onCheck:function(a){return a},onUncheck:function(a){return a}},b);return this.each(function(){"undefined"!=typeof a.fn.iCheck?(a("input",this).on("ifChecked",function(){var b=a(this).parents("li").first();b.toggleClass("done"),c.onCheck.call(b)}),a("input",this).on("ifUnchecked",function(){var b=a(this).parents("li").first();b.toggleClass("done"),c.onUncheck.call(b)})):a("input",this).on("change",function(){var b=a(this).parents("li").first();b.toggleClass("done"),a("input",b).is(":checked")?c.onCheck.call(b):c.onUncheck.call(b)})})}}(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/dist/js/demo.js b/theme/bootstrap/dist/js/demo.js new file mode 100644 index 0000000..988ec45 --- /dev/null +++ b/theme/bootstrap/dist/js/demo.js @@ -0,0 +1,338 @@ +/** + * AdminLTE Demo Menu + * ------------------ + * You should not use this file in production. + * This file is for demo purposes only. + */ +(function ($, AdminLTE) { + + "use strict"; + + /** + * List of all the available skins + * + * @type Array + */ + var my_skins = [ + "skin-blue", + "skin-black", + "skin-red", + "skin-yellow", + "skin-purple", + "skin-green", + "skin-blue-light", + "skin-black-light", + "skin-red-light", + "skin-yellow-light", + "skin-purple-light", + "skin-green-light" + ]; + + //Create the new tab + var tab_pane = $("<div />", { + "id": "control-sidebar-theme-demo-options-tab", + "class": "tab-pane active" + }); + + //Create the tab button + var tab_button = $("<li />", {"class": "active"}) + .html("<a href='#control-sidebar-theme-demo-options-tab' data-toggle='tab'>" + + "<i class='fa fa-wrench'></i>" + + "</a>"); + + //Add the tab button to the right sidebar tabs + $("[href='#control-sidebar-home-tab']") + .parent() + .before(tab_button); + + //Create the menu + var demo_settings = $("<div />"); + + //Layout options + demo_settings.append( + "<h4 class='control-sidebar-heading'>" + + "Layout Options" + + "</h4>" + //Fixed layout + + "<div class='form-group'>" + + "<label class='control-sidebar-subheading'>" + + "<input type='checkbox' data-layout='fixed' class='pull-right'/> " + + "Fixed layout" + + "</label>" + + "<p>Activate the fixed layout. You can't use fixed and boxed layouts together</p>" + + "</div>" + //Boxed layout + + "<div class='form-group'>" + + "<label class='control-sidebar-subheading'>" + + "<input type='checkbox' data-layout='layout-boxed'class='pull-right'/> " + + "Boxed Layout" + + "</label>" + + "<p>Activate the boxed layout</p>" + + "</div>" + //Sidebar Toggle + + "<div class='form-group'>" + + "<label class='control-sidebar-subheading'>" + + "<input type='checkbox' data-layout='sidebar-collapse' class='pull-right'/> " + + "Toggle Sidebar" + + "</label>" + + "<p>Toggle the left sidebar's state (open or collapse)</p>" + + "</div>" + //Sidebar mini expand on hover toggle + + "<div class='form-group'>" + + "<label class='control-sidebar-subheading'>" + + "<input type='checkbox' data-enable='expandOnHover' class='pull-right'/> " + + "Sidebar Expand on Hover" + + "</label>" + + "<p>Let the sidebar mini expand on hover</p>" + + "</div>" + //Control Sidebar Toggle + + "<div class='form-group'>" + + "<label class='control-sidebar-subheading'>" + + "<input type='checkbox' data-controlsidebar='control-sidebar-open' class='pull-right'/> " + + "Toggle Right Sidebar Slide" + + "</label>" + + "<p>Toggle between slide over content and push content effects</p>" + + "</div>" + //Control Sidebar Skin Toggle + + "<div class='form-group'>" + + "<label class='control-sidebar-subheading'>" + + "<input type='checkbox' data-sidebarskin='toggle' class='pull-right'/> " + + "Toggle Right Sidebar Skin" + + "</label>" + + "<p>Toggle between dark and light skins for the right sidebar</p>" + + "</div>" + ); + var skins_list = $("<ul />", {"class": 'list-unstyled clearfix'}); + + //Dark sidebar skins + var skin_blue = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-blue' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div><span style='display:block; width: 20%; float: left; height: 7px; background: #367fa9;'></span><span class='bg-light-blue' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #222d32;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin'>Blue</p>"); + skins_list.append(skin_blue); + var skin_black = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-black' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div style='box-shadow: 0 0 2px rgba(0,0,0,0.1)' class='clearfix'><span style='display:block; width: 20%; float: left; height: 7px; background: #fefefe;'></span><span style='display:block; width: 80%; float: left; height: 7px; background: #fefefe;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #222;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin'>Black</p>"); + skins_list.append(skin_black); + var skin_purple = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-purple' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-purple-active'></span><span class='bg-purple' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #222d32;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin'>Purple</p>"); + skins_list.append(skin_purple); + var skin_green = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-green' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-green-active'></span><span class='bg-green' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #222d32;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin'>Green</p>"); + skins_list.append(skin_green); + var skin_red = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-red' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-red-active'></span><span class='bg-red' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #222d32;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin'>Red</p>"); + skins_list.append(skin_red); + var skin_yellow = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-yellow' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-yellow-active'></span><span class='bg-yellow' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #222d32;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin'>Yellow</p>"); + skins_list.append(skin_yellow); + + //Light sidebar skins + var skin_blue_light = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-blue-light' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div><span style='display:block; width: 20%; float: left; height: 7px; background: #367fa9;'></span><span class='bg-light-blue' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #f9fafc;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin' style='font-size: 12px'>Blue Light</p>"); + skins_list.append(skin_blue_light); + var skin_black_light = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-black-light' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div style='box-shadow: 0 0 2px rgba(0,0,0,0.1)' class='clearfix'><span style='display:block; width: 20%; float: left; height: 7px; background: #fefefe;'></span><span style='display:block; width: 80%; float: left; height: 7px; background: #fefefe;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #f9fafc;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin' style='font-size: 12px'>Black Light</p>"); + skins_list.append(skin_black_light); + var skin_purple_light = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-purple-light' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-purple-active'></span><span class='bg-purple' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #f9fafc;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin' style='font-size: 12px'>Purple Light</p>"); + skins_list.append(skin_purple_light); + var skin_green_light = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-green-light' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-green-active'></span><span class='bg-green' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #f9fafc;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin' style='font-size: 12px'>Green Light</p>"); + skins_list.append(skin_green_light); + var skin_red_light = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-red-light' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-red-active'></span><span class='bg-red' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #f9fafc;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin' style='font-size: 12px'>Red Light</p>"); + skins_list.append(skin_red_light); + var skin_yellow_light = + $("<li />", {style: "float:left; width: 33.33333%; padding: 5px;"}) + .append("<a href='javascript:void(0);' data-skin='skin-yellow-light' style='display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)' class='clearfix full-opacity-hover'>" + + "<div><span style='display:block; width: 20%; float: left; height: 7px;' class='bg-yellow-active'></span><span class='bg-yellow' style='display:block; width: 80%; float: left; height: 7px;'></span></div>" + + "<div><span style='display:block; width: 20%; float: left; height: 20px; background: #f9fafc;'></span><span style='display:block; width: 80%; float: left; height: 20px; background: #f4f5f7;'></span></div>" + + "</a>" + + "<p class='text-center no-margin' style='font-size: 12px;'>Yellow Light</p>"); + skins_list.append(skin_yellow_light); + + demo_settings.append("<h4 class='control-sidebar-heading'>Skins</h4>"); + demo_settings.append(skins_list); + + tab_pane.append(demo_settings); + $("#control-sidebar-home-tab").after(tab_pane); + + setup(); + + /** + * Toggles layout classes + * + * @param String cls the layout class to toggle + * @returns void + */ + function change_layout(cls) { + $("body").toggleClass(cls); + AdminLTE.layout.fixSidebar(); + //Fix the problem with right sidebar and layout boxed + if (cls == "layout-boxed") + AdminLTE.controlSidebar._fix($(".control-sidebar-bg")); + if ($('body').hasClass('fixed') && cls == 'fixed') { + AdminLTE.pushMenu.expandOnHover(); + AdminLTE.layout.activate(); + } + AdminLTE.controlSidebar._fix($(".control-sidebar-bg")); + AdminLTE.controlSidebar._fix($(".control-sidebar")); + } + + /** + * Replaces the old skin with the new skin + * @param String cls the new skin class + * @returns Boolean false to prevent link's default action + */ + function change_skin(cls) { + $.each(my_skins, function (i) { + $("body").removeClass(my_skins[i]); + }); + + $("body").addClass(cls); + store('skin', cls); + return false; + } + + /** + * Store a new settings in the browser + * + * @param String name Name of the setting + * @param String val Value of the setting + * @returns void + */ + function store(name, val) { + if (typeof (Storage) !== "undefined") { + localStorage.setItem(name, val); + } else { + window.alert('Please use a modern browser to properly view this template!'); + } + } + + /** + * Get a prestored setting + * + * @param String name Name of of the setting + * @returns String The value of the setting | null + */ + function get(name) { + if (typeof (Storage) !== "undefined") { + return localStorage.getItem(name); + } else { + window.alert('Please use a modern browser to properly view this template!'); + } + } + + /** + * Retrieve default settings and apply them to the template + * + * @returns void + */ + function setup() { + var tmp = get('skin'); + if (tmp && $.inArray(tmp, my_skins)) + change_skin(tmp); + + //Add the change skin listener + $("[data-skin]").on('click', function (e) { + e.preventDefault(); + change_skin($(this).data('skin')); + }); + + //Add the layout manager + $("[data-layout]").on('click', function () { + change_layout($(this).data('layout')); + }); + + $("[data-controlsidebar]").on('click', function () { + change_layout($(this).data('controlsidebar')); + var slide = !AdminLTE.options.controlSidebarOptions.slide; + AdminLTE.options.controlSidebarOptions.slide = slide; + if (!slide) + $('.control-sidebar').removeClass('control-sidebar-open'); + }); + + $("[data-sidebarskin='toggle']").on('click', function () { + var sidebar = $(".control-sidebar"); + if (sidebar.hasClass("control-sidebar-dark")) { + sidebar.removeClass("control-sidebar-dark") + sidebar.addClass("control-sidebar-light") + } else { + sidebar.removeClass("control-sidebar-light") + sidebar.addClass("control-sidebar-dark") + } + }); + + $("[data-enable='expandOnHover']").on('click', function () { + $(this).attr('disabled', true); + AdminLTE.pushMenu.expandOnHover(); + if (!$('body').hasClass('sidebar-collapse')) + $("[data-layout='sidebar-collapse']").click(); + }); + + // Reset options + if ($('body').hasClass('fixed')) { + $("[data-layout='fixed']").attr('checked', 'checked'); + } + if ($('body').hasClass('layout-boxed')) { + $("[data-layout='layout-boxed']").attr('checked', 'checked'); + } + if ($('body').hasClass('sidebar-collapse')) { + $("[data-layout='sidebar-collapse']").attr('checked', 'checked'); + } + + } +})(jQuery, $.AdminLTE); diff --git a/theme/bootstrap/dist/js/pages/dashboard.js b/theme/bootstrap/dist/js/pages/dashboard.js new file mode 100644 index 0000000..9c4ff7b --- /dev/null +++ b/theme/bootstrap/dist/js/pages/dashboard.js @@ -0,0 +1,210 @@ +/* + * Author: Abdullah A Almsaeed + * Date: 4 Jan 2014 + * Description: + * This is a demo file used only for the main dashboard (index.html) + **/ + +$(function () { + + "use strict"; + + //Make the dashboard widgets sortable Using jquery UI + $(".connectedSortable").sortable({ + placeholder: "sort-highlight", + connectWith: ".connectedSortable", + handle: ".box-header, .nav-tabs", + forcePlaceholderSize: true, + zIndex: 999999 + }); + $(".connectedSortable .box-header, .connectedSortable .nav-tabs-custom").css("cursor", "move"); + + //jQuery UI sortable for the todo list + $(".todo-list").sortable({ + placeholder: "sort-highlight", + handle: ".handle", + forcePlaceholderSize: true, + zIndex: 999999 + }); + + //bootstrap WYSIHTML5 - text editor + $(".textarea").wysihtml5(); + + $('.daterange').daterangepicker({ + ranges: { + 'Today': [moment(), moment()], + 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], + 'Last 7 Days': [moment().subtract(6, 'days'), moment()], + 'Last 30 Days': [moment().subtract(29, 'days'), moment()], + 'This Month': [moment().startOf('month'), moment().endOf('month')], + 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')] + }, + startDate: moment().subtract(29, 'days'), + endDate: moment() + }, function (start, end) { + window.alert("You chose: " + start.format('MMMM D, YYYY') + ' - ' + end.format('MMMM D, YYYY')); + }); + + /* jQueryKnob */ + $(".knob").knob(); + + //jvectormap data + var visitorsData = { + "US": 398, //USA + "SA": 400, //Saudi Arabia + "CA": 1000, //Canada + "DE": 500, //Germany + "FR": 760, //France + "CN": 300, //China + "AU": 700, //Australia + "BR": 600, //Brazil + "IN": 800, //India + "GB": 320, //Great Britain + "RU": 3000 //Russia + }; + //World map by jvectormap + $('#world-map').vectorMap({ + map: 'world_mill_en', + backgroundColor: "transparent", + regionStyle: { + initial: { + fill: '#e4e4e4', + "fill-opacity": 1, + stroke: 'none', + "stroke-width": 0, + "stroke-opacity": 1 + } + }, + series: { + regions: [{ + values: visitorsData, + scale: ["#92c1dc", "#ebf4f9"], + normalizeFunction: 'polynomial' + }] + }, + onRegionLabelShow: function (e, el, code) { + if (typeof visitorsData[code] != "undefined") + el.html(el.html() + ': ' + visitorsData[code] + ' new visitors'); + } + }); + + //Sparkline charts + var myvalues = [1000, 1200, 920, 927, 931, 1027, 819, 930, 1021]; + $('#sparkline-1').sparkline(myvalues, { + type: 'line', + lineColor: '#92c1dc', + fillColor: "#ebf4f9", + height: '50', + width: '80' + }); + myvalues = [515, 519, 520, 522, 652, 810, 370, 627, 319, 630, 921]; + $('#sparkline-2').sparkline(myvalues, { + type: 'line', + lineColor: '#92c1dc', + fillColor: "#ebf4f9", + height: '50', + width: '80' + }); + myvalues = [15, 19, 20, 22, 33, 27, 31, 27, 19, 30, 21]; + $('#sparkline-3').sparkline(myvalues, { + type: 'line', + lineColor: '#92c1dc', + fillColor: "#ebf4f9", + height: '50', + width: '80' + }); + + //The Calender + $("#calendar").datepicker(); + + //SLIMSCROLL FOR CHAT WIDGET + $('#chat-box').slimScroll({ + height: '250px' + }); + + /* Morris.js Charts */ + // Sales chart + var area = new Morris.Area({ + element: 'revenue-chart', + resize: true, + data: [ + {y: '2011 Q1', item1: 2666, item2: 2666}, + {y: '2011 Q2', item1: 2778, item2: 2294}, + {y: '2011 Q3', item1: 4912, item2: 1969}, + {y: '2011 Q4', item1: 3767, item2: 3597}, + {y: '2012 Q1', item1: 6810, item2: 1914}, + {y: '2012 Q2', item1: 5670, item2: 4293}, + {y: '2012 Q3', item1: 4820, item2: 3795}, + {y: '2012 Q4', item1: 15073, item2: 5967}, + {y: '2013 Q1', item1: 10687, item2: 4460}, + {y: '2013 Q2', item1: 8432, item2: 5713} + ], + xkey: 'y', + ykeys: ['item1', 'item2'], + labels: ['Item 1', 'Item 2'], + lineColors: ['#a0d0e0', '#3c8dbc'], + hideHover: 'auto' + }); + var line = new Morris.Line({ + element: 'line-chart', + resize: true, + data: [ + {y: '2011 Q1', item1: 2666}, + {y: '2011 Q2', item1: 2778}, + {y: '2011 Q3', item1: 4912}, + {y: '2011 Q4', item1: 3767}, + {y: '2012 Q1', item1: 6810}, + {y: '2012 Q2', item1: 5670}, + {y: '2012 Q3', item1: 4820}, + {y: '2012 Q4', item1: 15073}, + {y: '2013 Q1', item1: 10687}, + {y: '2013 Q2', item1: 8432} + ], + xkey: 'y', + ykeys: ['item1'], + labels: ['Item 1'], + lineColors: ['#efefef'], + lineWidth: 2, + hideHover: 'auto', + gridTextColor: "#fff", + gridStrokeWidth: 0.4, + pointSize: 4, + pointStrokeColors: ["#efefef"], + gridLineColor: "#efefef", + gridTextFamily: "Open Sans", + gridTextSize: 10 + }); + + //Donut Chart + var donut = new Morris.Donut({ + element: 'sales-chart', + resize: true, + colors: ["#3c8dbc", "#f56954", "#00a65a"], + data: [ + {label: "Download Sales", value: 12}, + {label: "In-Store Sales", value: 30}, + {label: "Mail-Order Sales", value: 20} + ], + hideHover: 'auto' + }); + + //Fix for charts under tabs + $('.box ul.nav a').on('shown.bs.tab', function () { + area.redraw(); + donut.redraw(); + line.redraw(); + }); + + /* The todo list plugin */ + $(".todo-list").todolist({ + onCheck: function (ele) { + window.console.log("The element has been checked"); + return ele; + }, + onUncheck: function (ele) { + window.console.log("The element has been unchecked"); + return ele; + } + }); + +}); diff --git a/theme/bootstrap/dist/js/pages/dashboard2.js b/theme/bootstrap/dist/js/pages/dashboard2.js new file mode 100644 index 0000000..a892b5b --- /dev/null +++ b/theme/bootstrap/dist/js/pages/dashboard2.js @@ -0,0 +1,275 @@ +$(function () { + + 'use strict'; + + /* ChartJS + * ------- + * Here we will create a few charts using ChartJS + */ + + //----------------------- + //- MONTHLY SALES CHART - + //----------------------- + + // Get context with jQuery - using jQuery's .get() method. + var salesChartCanvas = $("#salesChart").get(0).getContext("2d"); + // This will get the first returned node in the jQuery collection. + var salesChart = new Chart(salesChartCanvas); + + var salesChartData = { + labels: ["January", "February", "March", "April", "May", "June", "July"], + datasets: [ + { + label: "Electronics", + fillColor: "rgb(210, 214, 222)", + strokeColor: "rgb(210, 214, 222)", + pointColor: "rgb(210, 214, 222)", + pointStrokeColor: "#c1c7d1", + pointHighlightFill: "#fff", + pointHighlightStroke: "rgb(220,220,220)", + data: [65, 59, 80, 81, 56, 55, 40] + }, + { + label: "Digital Goods", + fillColor: "rgba(60,141,188,0.9)", + strokeColor: "rgba(60,141,188,0.8)", + pointColor: "#3b8bba", + pointStrokeColor: "rgba(60,141,188,1)", + pointHighlightFill: "#fff", + pointHighlightStroke: "rgba(60,141,188,1)", + data: [28, 48, 40, 19, 86, 27, 90] + } + ] + }; + + var salesChartOptions = { + //Boolean - If we should show the scale at all + showScale: true, + //Boolean - Whether grid lines are shown across the chart + scaleShowGridLines: false, + //String - Colour of the grid lines + scaleGridLineColor: "rgba(0,0,0,.05)", + //Number - Width of the grid lines + scaleGridLineWidth: 1, + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + //Boolean - Whether the line is curved between points + bezierCurve: true, + //Number - Tension of the bezier curve between points + bezierCurveTension: 0.3, + //Boolean - Whether to show a dot for each point + pointDot: false, + //Number - Radius of each point dot in pixels + pointDotRadius: 4, + //Number - Pixel width of point dot stroke + pointDotStrokeWidth: 1, + //Number - amount extra to add to the radius to cater for hit detection outside the drawn point + pointHitDetectionRadius: 20, + //Boolean - Whether to show a stroke for datasets + datasetStroke: true, + //Number - Pixel width of dataset stroke + datasetStrokeWidth: 2, + //Boolean - Whether to fill the dataset with a color + datasetFill: true, + //String - A legend template + legendTemplate: "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].lineColor%>\"></span><%=datasets[i].label%></li><%}%></ul>", + //Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container + maintainAspectRatio: true, + //Boolean - whether to make the chart responsive to window resizing + responsive: true + }; + + //Create the line chart + salesChart.Line(salesChartData, salesChartOptions); + + //--------------------------- + //- END MONTHLY SALES CHART - + //--------------------------- + + //------------- + //- PIE CHART - + //------------- + // Get context with jQuery - using jQuery's .get() method. + var pieChartCanvas = $("#pieChart").get(0).getContext("2d"); + var pieChart = new Chart(pieChartCanvas); + var PieData = [ + { + value: 700, + color: "#f56954", + highlight: "#f56954", + label: "Chrome" + }, + { + value: 500, + color: "#00a65a", + highlight: "#00a65a", + label: "IE" + }, + { + value: 400, + color: "#f39c12", + highlight: "#f39c12", + label: "FireFox" + }, + { + value: 600, + color: "#00c0ef", + highlight: "#00c0ef", + label: "Safari" + }, + { + value: 300, + color: "#3c8dbc", + highlight: "#3c8dbc", + label: "Opera" + }, + { + value: 100, + color: "#d2d6de", + highlight: "#d2d6de", + label: "Navigator" + } + ]; + var pieOptions = { + //Boolean - Whether we should show a stroke on each segment + segmentShowStroke: true, + //String - The colour of each segment stroke + segmentStrokeColor: "#fff", + //Number - The width of each segment stroke + segmentStrokeWidth: 1, + //Number - The percentage of the chart that we cut out of the middle + percentageInnerCutout: 50, // This is 0 for Pie charts + //Number - Amount of animation steps + animationSteps: 100, + //String - Animation easing effect + animationEasing: "easeOutBounce", + //Boolean - Whether we animate the rotation of the Doughnut + animateRotate: true, + //Boolean - Whether we animate scaling the Doughnut from the centre + animateScale: false, + //Boolean - whether to make the chart responsive to window resizing + responsive: true, + // Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container + maintainAspectRatio: false, + //String - A legend template + legendTemplate: "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>", + //String - A tooltip template + tooltipTemplate: "<%=value %> <%=label%> users" + }; + //Create pie or douhnut chart + // You can switch between pie and douhnut using the method below. + pieChart.Doughnut(PieData, pieOptions); + //----------------- + //- END PIE CHART - + //----------------- + + /* jVector Maps + * ------------ + * Create a world map with markers + */ + $('#world-map-markers').vectorMap({ + map: 'world_mill_en', + normalizeFunction: 'polynomial', + hoverOpacity: 0.7, + hoverColor: false, + backgroundColor: 'transparent', + regionStyle: { + initial: { + fill: 'rgba(210, 214, 222, 1)', + "fill-opacity": 1, + stroke: 'none', + "stroke-width": 0, + "stroke-opacity": 1 + }, + hover: { + "fill-opacity": 0.7, + cursor: 'pointer' + }, + selected: { + fill: 'yellow' + }, + selectedHover: { + } + }, + markerStyle: { + initial: { + fill: '#00a65a', + stroke: '#111' + } + }, + markers: [ + {latLng: [41.90, 12.45], name: 'Vatican City'}, + {latLng: [43.73, 7.41], name: 'Monaco'}, + {latLng: [-0.52, 166.93], name: 'Nauru'}, + {latLng: [-8.51, 179.21], name: 'Tuvalu'}, + {latLng: [43.93, 12.46], name: 'San Marino'}, + {latLng: [47.14, 9.52], name: 'Liechtenstein'}, + {latLng: [7.11, 171.06], name: 'Marshall Islands'}, + {latLng: [17.3, -62.73], name: 'Saint Kitts and Nevis'}, + {latLng: [3.2, 73.22], name: 'Maldives'}, + {latLng: [35.88, 14.5], name: 'Malta'}, + {latLng: [12.05, -61.75], name: 'Grenada'}, + {latLng: [13.16, -61.23], name: 'Saint Vincent and the Grenadines'}, + {latLng: [13.16, -59.55], name: 'Barbados'}, + {latLng: [17.11, -61.85], name: 'Antigua and Barbuda'}, + {latLng: [-4.61, 55.45], name: 'Seychelles'}, + {latLng: [7.35, 134.46], name: 'Palau'}, + {latLng: [42.5, 1.51], name: 'Andorra'}, + {latLng: [14.01, -60.98], name: 'Saint Lucia'}, + {latLng: [6.91, 158.18], name: 'Federated States of Micronesia'}, + {latLng: [1.3, 103.8], name: 'Singapore'}, + {latLng: [1.46, 173.03], name: 'Kiribati'}, + {latLng: [-21.13, -175.2], name: 'Tonga'}, + {latLng: [15.3, -61.38], name: 'Dominica'}, + {latLng: [-20.2, 57.5], name: 'Mauritius'}, + {latLng: [26.02, 50.55], name: 'Bahrain'}, + {latLng: [0.33, 6.73], name: 'São Tomé and Príncipe'} + ] + }); + + /* SPARKLINE CHARTS + * ---------------- + * Create a inline charts with spark line + */ + + //----------------- + //- SPARKLINE BAR - + //----------------- + $('.sparkbar').each(function () { + var $this = $(this); + $this.sparkline('html', { + type: 'bar', + height: $this.data('height') ? $this.data('height') : '30', + barColor: $this.data('color') + }); + }); + + //----------------- + //- SPARKLINE PIE - + //----------------- + $('.sparkpie').each(function () { + var $this = $(this); + $this.sparkline('html', { + type: 'pie', + height: $this.data('height') ? $this.data('height') : '90', + sliceColors: $this.data('color') + }); + }); + + //------------------ + //- SPARKLINE LINE - + //------------------ + $('.sparkline').each(function () { + var $this = $(this); + $this.sparkline('html', { + type: 'line', + height: $this.data('height') ? $this.data('height') : '90', + width: '100%', + lineColor: $this.data('linecolor'), + fillColor: $this.data('fillcolor'), + spotColor: $this.data('spotcolor') + }); + }); +}); diff --git a/theme/bootstrap/documentation/build/include/adminlte-options.html b/theme/bootstrap/documentation/build/include/adminlte-options.html new file mode 100644 index 0000000..69b4da6 --- /dev/null +++ b/theme/bootstrap/documentation/build/include/adminlte-options.html @@ -0,0 +1,123 @@ +<section id="adminlte-options"> + <h2 class="page-header"><a href="#adminlte-options">AdminLTE Javascript Options</a></h2> + <p class="lead">Modifying the options of AdminLTE's app.js can be done using one of the following ways.</p> + + <h3>Editing app.js</h3> + <p>Within the main Javascript file, modify the <code>$.AdminLTE.options</code> object to suit your use case.</p> + + <h3>Defining AdminLTEOptions</h3> + <p>Alternatively, you can define a global options variable named <code>AdminLTEOptions</code> and initialize it before loading app.js.</p> + <p>Example</p> + <pre class="prettyprint"><code class="html">&LT;script> + var AdminLTEOptions = { + //Enable sidebar expand on hover effect for sidebar mini + //This option is forced to true if both the fixed layout and sidebar mini + //are used together + sidebarExpandOnHover: true, + //BoxRefresh Plugin + enableBoxRefresh: true, + //Bootstrap.js tooltip + enableBSToppltip: true + }; +&LT;/script> +&LT;script src="dist/js/app.js" type="text/javascript">&LT;/script></code></pre> + + <h3>Available AdminLTE Options</h3> + <pre class="prettyprint"><code class="javascript">{ + //Add slimscroll to navbar menus + //This requires you to load the slimscroll plugin + //in every page before app.js + navbarMenuSlimscroll: true, + navbarMenuSlimscrollWidth: "3px", //The width of the scroll bar + navbarMenuHeight: "200px", //The height of the inner menu + //General animation speed for JS animated elements such as box collapse/expand and + //sidebar treeview slide up/down. This options accepts an integer as milliseconds, + //'fast', 'normal', or 'slow' + animationSpeed: 500, + //Sidebar push menu toggle button selector + sidebarToggleSelector: "[data-toggle='offcanvas']", + //Activate sidebar push menu + sidebarPushMenu: true, + //Activate sidebar slimscroll if the fixed layout is set (requires SlimScroll Plugin) + sidebarSlimScroll: true, + //Enable sidebar expand on hover effect for sidebar mini + //This option is forced to true if both the fixed layout and sidebar mini + //are used together + sidebarExpandOnHover: false, + //BoxRefresh Plugin + enableBoxRefresh: true, + //Bootstrap.js tooltip + enableBSToppltip: true, + BSTooltipSelector: "[data-toggle='tooltip']", + //Enable Fast Click. Fastclick.js creates a more + //native touch experience with touch devices. If you + //choose to enable the plugin, make sure you load the script + //before AdminLTE's app.js + enableFastclick: true, + //Control Sidebar Options + enableControlSidebar: true, + controlSidebarOptions: { + //Which button should trigger the open/close event + toggleBtnSelector: "[data-toggle='control-sidebar']", + //The sidebar selector + selector: ".control-sidebar", + //Enable slide over content + slide: true + }, + //Box Widget Plugin. Enable this plugin + //to allow boxes to be collapsed and/or removed + enableBoxWidget: true, + //Box Widget plugin options + boxWidgetOptions: { + boxWidgetIcons: { + //Collapse icon + collapse: 'fa-minus', + //Open icon + open: 'fa-plus', + //Remove icon + remove: 'fa-times' + }, + boxWidgetSelectors: { + //Remove button selector + remove: '[data-widget="remove"]', + //Collapse button selector + collapse: '[data-widget="collapse"]' + } + }, + //Direct Chat plugin options + directChat: { + //Enable direct chat by default + enable: true, + //The button to open and close the chat contacts pane + contactToggleSelector: '[data-widget="chat-pane-toggle"]' + }, + //Define the set of colors to use globally around the website + colors: { + lightBlue: "#3c8dbc", + red: "#f56954", + green: "#00a65a", + aqua: "#00c0ef", + yellow: "#f39c12", + blue: "#0073b7", + navy: "#001F3F", + teal: "#39CCCC", + olive: "#3D9970", + lime: "#01FF70", + orange: "#FF851B", + fuchsia: "#F012BE", + purple: "#8E24AA", + maroon: "#D81B60", + black: "#222222", + gray: "#d2d6de" + }, + //The standard screen sizes that bootstrap uses. + //If you change these in the variables.less file, change + //them here too. + screenSizes: { + xs: 480, + sm: 768, + md: 992, + lg: 1200 + } +}</code></pre> +</section> diff --git a/theme/bootstrap/documentation/build/include/advice.html b/theme/bootstrap/documentation/build/include/advice.html new file mode 100644 index 0000000..260a190 --- /dev/null +++ b/theme/bootstrap/documentation/build/include/advice.html @@ -0,0 +1,17 @@ +<section id="advice"> + <h2 class="page-header"><a href="#advice">A Word of Advice</a></h2> + <p class="lead"> + Before you go to see your new awesome theme, here are few tips on how to familiarize yourself with it: + </p> + + <ul> + <li><b>AdminLTE is based on <a href="http://getbootstrap.com/" target="_blank">Bootstrap 3</a>.</b> If you are unfamiliar with Bootstrap, visit their website and read through the documentation. All of Bootstrap components have been modified to fit the style of AdminLTE and provide a consistent look throughout the template. This way, we guarantee you will get the best of AdminLTE.</li> + <li><b>Go through the pages that are bundled with the theme.</b> Most of the template example pages contain quick tips on how to create or use a component which can be really helpful when you need to create something on the fly.</li> + <li><b>Documentation.</b> We are trying our best to make your experience with AdminLTE be smooth. One way to achieve that is to provide documentation and support. If you think that something is missing from the documentation, please do not hesitate to create an issue to tell us about it. Also, if you would like to contribute, email the support team at <a href="mailto:support@almsaeedstudio.com">support@almsaeedstudio.com</a>.</li> + <li><b>Built with <a href="http://lesscss.org/" target="_blank">LESS</a>.</b> This theme uses the LESS compiler to make it easier to customize and use. LESS is easy to learn if you know CSS or SASS. It is not necessary to learn LESS but it will benefit you a lot in the future.</li> + <li><b>Hosted on <a href="https://github.com/almasaeed2010/AdminLTE/" target="_blank">GitHub</a>.</b> Visit our GitHub repository to view issues, make requests, or contribute to the project.</li> + </ul> + <p> + <b>Note:</b> LESS files are better commented than the compiled CSS file. + </p> +</section> diff --git a/theme/bootstrap/documentation/build/include/browsers.html b/theme/bootstrap/documentation/build/include/browsers.html new file mode 100644 index 0000000..cb84121 --- /dev/null +++ b/theme/bootstrap/documentation/build/include/browsers.html @@ -0,0 +1,12 @@ +<section id="browsers"> + <h2 class="page-header"><a href="#browsers">Browser Support</a></h2> + <p class="lead">AdminLTE supports the following browsers:</p> + <ul> + <li>IE9+</li> + <li>Firefox (latest)</li> + <li>Safari (latest)</li> + <li>Chrome (latest)</li> + <li>Opera (latest)</li> + </ul> + <p><b>Note:</b> IE9 does not support transitions or animations. The template will function properly but it won't use animations/transitions on IE9.</p> +</section> diff --git a/theme/bootstrap/documentation/build/include/components.html b/theme/bootstrap/documentation/build/include/components.html new file mode 100644 index 0000000..5606575 --- /dev/null +++ b/theme/bootstrap/documentation/build/include/components.html @@ -0,0 +1,1545 @@ +<section id="components" data-spy="scroll" data-target="#scrollspy-components"> + <h2 class="page-header"><a href="#components">Components</a></h2> + <div class="callout callout-info lead"> + <h4>Reminder!</h4> + <p> + AdminLTE uses all of Bootstrap 3 components. It's a good start to review + the <a href="http://getbootstrap.com">Bootstrap documentation</a> to get an idea of the various components + that this documentation <b>does not</b> cover. + </p> + </div> + <div class="callout callout-danger lead"> + <h4>Tip!</h4> + <p> + If you go through the example pages and would like to copy a component, right-click on + the component and choose "inspect element" to get to the HTML quicker than scanning + the HTML page. + </p> + </div> + <h3 id="component-main-header">Main Header</h3> + <p class="lead">The main header contains the logo and navbar. Construction of the + navbar differs slightly from Bootstrap because it has components that Bootstrap doesn't provide. + The navbar can be constructed in two way. This an example for the normal navbar and next we will provide an example for + the top nav layout.</p> + <div class="box box-solid"> + <div class="box-body" style="position: relative;"> + <span class="eg">Main Header Example</span> + <header class="main-header" style="position: relative;"> + <!-- Logo --> + <a href="index2.html" class="logo" style="position: relative;"><b>Admin</b>LTE</a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar" role="navigation" style="border: 0;max-height: 50px;"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" role="button"> + <span class="sr-only">Toggle navigation</span> + </a> + <!-- Navbar Right Menu --> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + </ul> + </div> + </nav> + </header> + </div> + </div> + <pre class="prettyprint">&LT;header class="main-header"> + &LT;a href="../../index2.html" class="logo"> + &LT;!-- LOGO --> + AdminLTE + &LT;/a> + &LT;!-- Header Navbar: style can be found in header.less --> + &LT;nav class="navbar navbar-static-top" role="navigation"> + &LT;!-- Navbar Right Menu --> + &LT;div class="navbar-custom-menu"> + &LT;ul class="nav navbar-nav"> + &LT;!-- Messages: style can be found in dropdown.less--> + &LT;li class="dropdown messages-menu"> + &LT;a href="#" class="dropdown-toggle" data-toggle="dropdown"> + &LT;i class="fa fa-envelope-o">&LT;/i> + &LT;span class="label label-success">4&LT;/span> + &LT;/a> + &LT;ul class="dropdown-menu"> + &LT;li class="header">You have 4 messages&LT;/li> + &LT;li> + &LT;!-- inner menu: contains the actual data --> + &LT;ul class="menu"> + &LT;li>&LT;!-- start message --> + &LT;a href="#"> + &LT;div class="pull-left"> + &LT;img src="dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + &LT;/div> + &LT;h4> + Sender Name + &LT;small>&LT;i class="fa fa-clock-o">&LT;/i> 5 mins&LT;/small> + &LT;/h4> + &LT;p>Message Excerpt&LT;/p> + &LT;/a> + &LT;/li>&LT;!-- end message --> + ... + &LT;/ul> + &LT;/li> + &LT;li class="footer">&LT;a href="#">See All Messages&LT;/a>&LT;/li> + &LT;/ul> + &LT;/li> + &LT;!-- Notifications: style can be found in dropdown.less --> + &LT;li class="dropdown notifications-menu"> + &LT;a href="#" class="dropdown-toggle" data-toggle="dropdown"> + &LT;i class="fa fa-bell-o">&LT;/i> + &LT;span class="label label-warning">10&LT;/span> + &LT;/a> + &LT;ul class="dropdown-menu"> + &LT;li class="header">You have 10 notifications&LT;/li> + &LT;li> + &LT;!-- inner menu: contains the actual data --> + &LT;ul class="menu"> + &LT;li> + &LT;a href="#"> + &LT;i class="ion ion-ios-people info">&LT;/i> Notification title + &LT;/a> + &LT;/li> + ... + &LT;/ul> + &LT;/li> + &LT;li class="footer">&LT;a href="#">View all&LT;/a>&LT;/li> + &LT;/ul> + &LT;/li> + &LT;!-- Tasks: style can be found in dropdown.less --> + &LT;li class="dropdown tasks-menu"> + &LT;a href="#" class="dropdown-toggle" data-toggle="dropdown"> + &LT;i class="fa fa-flag-o">&LT;/i> + &LT;span class="label label-danger">9&LT;/span> + &LT;/a> + &LT;ul class="dropdown-menu"> + &LT;li class="header">You have 9 tasks&LT;/li> + &LT;li> + &LT;!-- inner menu: contains the actual data --> + &LT;ul class="menu"> + &LT;li>&LT;!-- Task item --> + &LT;a href="#"> + &LT;h3> + Design some buttons + &LT;small class="pull-right">20%&LT;/small> + &LT;/h3> + &LT;div class="progress xs"> + &LT;div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + &LT;span class="sr-only">20% Complete&LT;/span> + &LT;/div> + &LT;/div> + &LT;/a> + &LT;/li>&LT;!-- end task item --> + ... + &LT;/ul> + &LT;/li> + &LT;li class="footer"> + &LT;a href="#">View all tasks&LT;/a> + &LT;/li> + &LT;/ul> + &LT;/li> + &LT;!-- User Account: style can be found in dropdown.less --> + &LT;li class="dropdown user user-menu"> + &LT;a href="#" class="dropdown-toggle" data-toggle="dropdown"> + &LT;img src="dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + &LT;span class="hidden-xs">Alexander Pierce&LT;/span> + &LT;/a> + &LT;ul class="dropdown-menu"> + &LT;!-- User image --> + &LT;li class="user-header"> + &LT;img src="dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + &LT;p> + Alexander Pierce - Web Developer + &LT;small>Member since Nov. 2012&LT;/small> + &LT;/p> + &LT;/li> + &LT;!-- Menu Body --> + &LT;li class="user-body"> + &LT;div class="col-xs-4 text-center"> + &LT;a href="#">Followers&LT;/a> + &LT;/div> + &LT;div class="col-xs-4 text-center"> + &LT;a href="#">Sales&LT;/a> + &LT;/div> + &LT;div class="col-xs-4 text-center"> + &LT;a href="#">Friends&LT;/a> + &LT;/div> + &LT;/li> + &LT;!-- Menu Footer--> + &LT;li class="user-footer"> + &LT;div class="pull-left"> + &LT;a href="#" class="btn btn-default btn-flat">Profile&LT;/a> + &LT;/div> + &LT;div class="pull-right"> + &LT;a href="#" class="btn btn-default btn-flat">Sign out&LT;/a> + &LT;/div> + &LT;/li> + &LT;/ul> + &LT;/li> + &LT;/ul> + &LT;/div> + &LT;/nav> +&LT;/header></pre> + <h4>Top Nav Layout. Main Header Example.</h4> + <div class="callout callout-info lead"> + <h4>Reminder!</h4> + <p>To use this main header instead of the regular one, you must add the <code>layout-top-nav</code> class to the body tag.</p> + </div> + <div class="box box-solid"> + <div class="box-body layout-top-nav"> + <span class="eg">Top Nav Example</span> + <header class="main-header"> + <nav class="navbar navbar-static-top"> + <div class="container-fluid"> + <div class="navbar-header"> + <a href="../../index2.html" class="navbar-brand"><b>Admin</b>LTE</a> + <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-collapse"> + <i class="fa fa-bars"></i> + </button> + </div> + + <!-- Collect the nav links, forms, and other content for toggling --> + <div class="collapse navbar-collapse" id="navbar-collapse"> + <ul class="nav navbar-nav"> + <li class="active"><a href="#">Link <span class="sr-only">(current)</span></a></li> + <li><a href="#">Link</a></li> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <span class="caret"></span></a> + <ul class="dropdown-menu" role="menu"> + <li><a href="#">Action</a></li> + <li><a href="#">Another action</a></li> + <li><a href="#">Something else here</a></li> + <li class="divider"></li> + <li><a href="#">Separated link</a></li> + <li class="divider"></li> + <li><a href="#">One more separated link</a></li> + </ul> + </li> + </ul> + <form class="navbar-form navbar-left" role="search"> + <div class="form-group"> + <input type="text" class="form-control" id="navbar-search-input" placeholder="Search"> + </div> + </form> + <ul class="nav navbar-nav navbar-right"> + <li><a href="#">Link</a></li> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <span class="caret"></span></a> + <ul class="dropdown-menu" role="menu"> + <li><a href="#">Action</a></li> + <li><a href="#">Another action</a></li> + <li><a href="#">Something else here</a></li> + <li class="divider"></li> + <li><a href="#">Separated link</a></li> + </ul> + </li> + </ul> + </div><!-- /.navbar-collapse --> + </div><!-- /.container-fluid --> + </nav> + </header> + </div> + </div> + <pre class="prettyprint"> +&LT;header class="main-header"> + &LT;nav class="navbar navbar-static-top"> + &LT;div class="container-fluid"> + &LT;div class="navbar-header"> + &LT;a href="../../index2.html" class="navbar-brand">&LT;b>Admin&LT;/b>LTE&LT;/a> + &LT;button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-collapse"> + &LT;i class="fa fa-bars">&LT;/i> + &LT;/button> + &LT;/div> + + &LT;!-- Collect the nav links, forms, and other content for toggling --> + &LT;div class="collapse navbar-collapse" id="navbar-collapse"> + &LT;ul class="nav navbar-nav"> + &LT;li class="active">&LT;a href="#">Link &LT;span class="sr-only">(current)&LT;/span>&LT;/a>&LT;/li> + &LT;li>&LT;a href="#">Link&LT;/a>&LT;/li> + &LT;li class="dropdown"> + &LT;a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown &LT;span class="caret">&LT;/span>&LT;/a> + &LT;ul class="dropdown-menu" role="menu"> + &LT;li>&LT;a href="#">Action&LT;/a>&LT;/li> + &LT;li>&LT;a href="#">Another action&LT;/a>&LT;/li> + &LT;li>&LT;a href="#">Something else here&LT;/a>&LT;/li> + &LT;li class="divider">&LT;/li> + &LT;li>&LT;a href="#">Separated link&LT;/a>&LT;/li> + &LT;li class="divider">&LT;/li> + &LT;li>&LT;a href="#">One more separated link&LT;/a>&LT;/li> + &LT;/ul> + &LT;/li> + &LT;/ul> + &LT;form class="navbar-form navbar-left" role="search"> + &LT;div class="form-group"> + &LT;input type="text" class="form-control" id="navbar-search-input" placeholder="Search"> + &LT;/div> + &LT;/form> + &LT;ul class="nav navbar-nav navbar-right"> + &LT;li>&LT;a href="#">Link&LT;/a>&LT;/li> + &LT;li class="dropdown"> + &LT;a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown &LT;span class="caret">&LT;/span>&LT;/a> + &LT;ul class="dropdown-menu" role="menu"> + &LT;li>&LT;a href="#">Action&LT;/a>&LT;/li> + &LT;li>&LT;a href="#">Another action&LT;/a>&LT;/li> + &LT;li>&LT;a href="#">Something else here&LT;/a>&LT;/li> + &LT;li class="divider">&LT;/li> + &LT;li>&LT;a href="#">Separated link&LT;/a>&LT;/li> + &LT;/ul> + &LT;/li> + &LT;/ul> + &LT;/div>&LT;!-- /.navbar-collapse --> + &LT;/div>&LT;!-- /.container-fluid --> + &LT;/nav> +&LT;/header></pre> + + <!-- ===================================================================== --> + + <h3 id="component-sidebar">Sidebar</h3> + <p class="lead"> + The sidebar used in this page to the left provides an example of what your sidebar should like. + Construction of a sidebar: + </p> + <pre class="prettyprint"> +&LT;div class="main-sidebar"> + &LT;!-- Inner sidebar --> + &LT;div class="sidebar"> + &LT;!-- user panel (Optional) --> + &LT;div class="user-panel"> + &LT;div class="pull-left image"> + &LT;img src="dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + &LT;/div> + &LT;div class="pull-left info"> + &LT;p>User Name&LT;/p> + + &LT;a href="#">&LT;i class="fa fa-circle text-success">&LT;/i> Online&LT;/a> + &LT;/div> + &LT;/div>&LT;!-- /.user-panel --> + + &LT;!-- Search Form (Optional) --> + &LT;form action="#" method="get" class="sidebar-form"> + &LT;div class="input-group"> + &LT;input type="text" name="q" class="form-control" placeholder="Search..."> + &LT;span class="input-group-btn"> + &LT;button type="submit" name="search" id="search-btn" class="btn btn-flat">&LT;i class="fa fa-search">&LT;/i>&LT;/button> + &LT;/span> + &LT;/div> + &LT;/form>&LT;!-- /.sidebar-form --> + + &LT;!-- Sidebar Menu --> + &LT;ul class="sidebar-menu"> + &LT;li class="header">HEADER&LT;/li> + &LT;!-- Optionally, you can add icons to the links --> + &LT;li class="active">&LT;a href="#">&LT;span>Link&LT;/span>&LT;/a>&LT;&LT;/li> + &LT;li>&LT;a href="#">&LT;span>Another Link&LT;/span>&LT;/a>&LT;/li> + &LT;li class="treeview"> + &LT;a href="#">&LT;span>Multilevel&LT;/span> &LT;i class="fa fa-angle-left pull-right">&LT;/i>&LT;/a> + &LT;ul class="treeview-menu"> + &LT;li>&LT;a href="#">Link in level 2&LT;/a>&LT;/li> + &LT;li>&LT;a href="#">Link in level 2&LT;/a>&LT;/li> + &LT;/ul> + &LT;/li> + &LT;/ul>&LT;!-- /.sidebar-menu --> + + &LT;/div>&LT;!-- /.sidebar --> +&LT;/div>&LT;!-- /.main-sidebar --></pre> + + <h3 id="component-control-sidebar">Control Sidebar</h3> + <p class="lead">Control sidebar is the right side bar. It can be used for many purposes and is extremely easy + to create. The sidebar ships with two different show/hide styles. The first allows the sidebar to + slide over the content. The second pushes the content to make space for the sidebar. Either of + these methods can be set through the <a href="#adminlte-options">Javascript options</a>.</p> + <p class="lead">The following code should be placed within the <code>.wrapper</code> div. I prefer + to place it right after the footer.</p> + <p class="lead">Dark Sidebar Markup</p> +<pre class="prettyprint"><code class="lang-html">&LT;!-- The Right Sidebar --> +&LT;aside class="control-sidebar control-sidebar-dark"> + &LT;!-- Content of the sidebar goes here --> +&LT;/aside> +&LT;!-- The sidebar's background --> +&LT;!-- This div must placed right after the sidebar for it to work--> +&LT;div class="control-sidebar-bg">&LT;/div></code></pre> + + <p class="lead">Light Sidebar Markup</p> +<pre class="prettyprint"><code class="lang-html">&LT;!-- The Right Sidebar --> +&LT;aside class="control-sidebar control-sidebar-light"> + &LT;!-- Content of the sidebar goes here --> +&LT;/aside> +&LT;!-- The sidebar's background --> +&LT;!-- This div must placed right after the sidebar for it to work--> +&LT;div class="control-sidebar-bg">&LT;/div></code></pre> + + <p class="lead">Once you create the sidebar, you will need a toggle button to open/close it. + By adding the attribute <code>data-toggle="control-sidebar"</code> to any button, it will + automatically act as the toggle button.</p> + + <p class="lead">Toggle Button Example</p> + <button class="btn btn-primary" data-toggle="control-sidebar">Toggle Right Sidebar</button><br><br> + + <p class="lead">Sidebar Toggle Markup</p> + <pre class="prettyprint"><code class="lang-html">&LT;button class="btn btn-default" data-toggle="control-sidebar">Toggle Right Sidebar&LT;/button></code></pre> + <!-- ===================================================================== --> + + <h3 id="component-info-box">Info Box</h3> + <p class="lead">Info boxes are used to display statistical snippets. There are two types of info boxes.</p> + <h4>First Type of Info Boxes</h4> + <!-- Info Boxes --> + <div class="row"> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box"> + <span class="info-box-icon bg-aqua"><i class="fa fa-envelope-o"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Messages</span> + <span class="info-box-number">1,410</span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box"> + <span class="info-box-icon bg-green"><i class="fa fa-flag-o"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Bookmarks</span> + <span class="info-box-number">410</span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box"> + <span class="info-box-icon bg-yellow"><i class="fa fa-files-o"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Uploads</span> + <span class="info-box-number">13,648</span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box"> + <span class="info-box-icon bg-red"><i class="fa fa-star-o"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Likes</span> + <span class="info-box-number">93,139</span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + </div><!-- /.row --> + <p class="lead">Markup</p> + <pre class="prettyprint"><code class="lang-html">&LT;div class="info-box"> + &LT;!-- Apply any bg-* class to to the icon to color it --> + &LT;span class="info-box-icon bg-red">&LT;i class="fa fa-star-o">&LT;/i>&LT;/span> + &LT;div class="info-box-content"> + &LT;span class="info-box-text">Likes&LT;/span> + &LT;span class="info-box-number">93,139&LT;/span> + &LT;/div>&LT;!-- /.info-box-content --> +&LT;/div>&LT;!-- /.info-box --></code></pre> + + <h4>Second Type of Info Boxes</h4> + <div class="row"> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box bg-aqua"> + <span class="info-box-icon"><i class="fa fa-bookmark-o"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Bookmarks</span> + <span class="info-box-number">41,410</span> + <div class="progress"> + <div class="progress-bar" style="width: 70%"></div> + </div> + <span class="progress-description"> + 70% Increase in 30 Days + </span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box bg-green"> + <span class="info-box-icon"><i class="fa fa-thumbs-o-up"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Likes</span> + <span class="info-box-number">41,410</span> + <div class="progress"> + <div class="progress-bar" style="width: 70%"></div> + </div> + <span class="progress-description"> + 70% Increase in 30 Days + </span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box bg-yellow"> + <span class="info-box-icon"><i class="fa fa-calendar"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Events</span> + <span class="info-box-number">41,410</span> + <div class="progress"> + <div class="progress-bar" style="width: 70%"></div> + </div> + <span class="progress-description"> + 70% Increase in 30 Days + </span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box bg-red"> + <span class="info-box-icon"><i class="fa fa-comments-o"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Comments</span> + <span class="info-box-number">41,410</span> + <div class="progress"> + <div class="progress-bar" style="width: 70%"></div> + </div> + <span class="progress-description"> + 70% Increase in 30 Days + </span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + </div><!-- /.row --> + <p class="lead">Markup</p> + <pre class="prettyprint"><code class="lang-html">&LT;!-- Apply any bg-* class to to the info-box to color it --> +&LT;div class="info-box bg-red"> + &LT;span class="info-box-icon">&LT;i class="fa fa-comments-o">&LT;/i>&LT;/span> + &LT;div class="info-box-content"> + &LT;span class="info-box-text">Likes&LT;/span> + &LT;span class="info-box-number">41,410&LT;/span> + &LT;!-- The progress section is optional --> + &LT;div class="progress"> + &LT;div class="progress-bar" style="width: 70%">&LT;/div> + &LT;/div> + &LT;span class="progress-description"> + 70% Increase in 30 Days + &LT;/span> + &LT;/div>&LT;!-- /.info-box-content --> +&LT;/div>&LT;!-- /.info-box --></code></pre> + <p class="lead">The only thing you need to change to alternate between these style is change the placement of the bg-* class. For the + first style apply any bg-* class to the icon itself. For the other style, apply the bg-* class to the info-box div.</p> + <!-- ===================================================================== --> + + <h3 id="component-box">Box</h3> + <p class="lead">The box component is the most widely used component through out this template. You can + use it for anything from displaying charts to just blocks of text. It comes in many different + styles that we will explore below.</p> + <h4>Default Box Markup</h4> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title">Default Box Example</h3> + <div class="box-tools pull-right"> + <!-- Buttons, labels, and many other things can be placed here! --> + <!-- Here is a label for example --> + <span class="label label-primary">Label</span> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + <div class="box-footer"> + The footer of the box + </div><!-- box-footer --> + </div><!-- /.box --> + <pre class="prettyprint">&LT;div class="box"> + &LT;div class="box-header with-border"> + &LT;h3 class="box-title">Default Box Example&LT;/h3> + &LT;div class="box-tools pull-right"> + &LT;!-- Buttons, labels, and many other things can be placed here! --> + &LT;!-- Here is a label for example --> + &LT;span class="label label-primary">Label&LT;/span> + &LT;/div>&LT;!-- /.box-tools --> + &LT;/div>&LT;!-- /.box-header --> + &LT;div class="box-body"> + The body of the box + &LT;/div>&LT;!-- /.box-body --> + &LT;div class="box-footer"> + The footer of the box + &LT;/div>&LT;!-- box-footer --> +&LT;/div>&LT;!-- /.box --></pre> + <h4>Box Variants</h4> + <p class="lead">You can change the style of the box by adding any of the contextual classes.</p> + <div class="row"> + <div class="col-md-4"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title">Default Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + <div class="col-md-4"> + <div class="box box-primary"> + <div class="box-header with-border"> + <h3 class="box-title">Primary Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + <div class="col-md-4"> + <div class="box box-info"> + <div class="box-header with-border"> + <h3 class="box-title">Info Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + <div class="clearfix"></div> + <div class="col-md-4"> + <div class="box box-warning"> + <div class="box-header with-border"> + <h3 class="box-title">Warning Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + <div class="col-md-4"> + <div class="box box-success"> + <div class="box-header with-border"> + <h3 class="box-title">Success Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + <div class="col-md-4"> + <div class="box box-danger"> + <div class="box-header with-border"> + <h3 class="box-title">Danger Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + </div><!-- /.row --> + <pre class="prettyprint">&LT;div class="box box-default">...&LT;/div> +&LT;div class="box box-primary">...&LT;/div> +&LT;div class="box box-info">...&LT;/div> +&LT;div class="box box-warning">...&LT;/div> +&LT;div class="box box-success">...&LT;/div> +&LT;div class="box box-danger">...&LT;/div></pre> + + <h4>Solid Box</h4> + <p class="lead">Solid Boxes are alternative ways to display boxes. + They can be created by simply adding the box-solid class to the box component. + You may also use contextual classes with you solid boxes.</p> + <div class="row"> + <div class="col-md-4"> + <div class="box box-solid box-default"> + <div class="box-header"> + <h3 class="box-title">Default Solid Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + <div class="col-md-4"> + <div class="box box-solid box-primary"> + <div class="box-header"> + <h3 class="box-title">Primary Solid Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + <div class="col-md-4"> + <div class="box box-solid box-info"> + <div class="box-header"> + <h3 class="box-title">Info Solid Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + <div class="clearfix"></div> + <div class="col-md-4"> + <div class="box box-solid box-warning"> + <div class="box-header"> + <h3 class="box-title">Warning Solid Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + <div class="col-md-4"> + <div class="box box-solid box-success"> + <div class="box-header"> + <h3 class="box-title">Success Solid Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + <div class="col-md-4"> + <div class="box box-solid box-danger"> + <div class="box-header"> + <h3 class="box-title">Danger Solid Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + </div><!-- /.row --> + <pre class="prettyprint"> +&LT;div class="box box-solid box-default">...&LT;/div> +&LT;div class="box box-solid box-primary">...&LT;/div> +&LT;div class="box box-solid box-info">...&LT;/div> +&LT;div class="box box-solid box-warning">...&LT;/div> +&LT;div class="box box-solid box-success">...&LT;/div> +&LT;div class="box box-solid box-danger">...&LT;/div></pre> + <h4>Box Tools</h4> + <p class="lead">Boxes can contain tools to deploy a specific event or provide simple info. The following examples makes use + of multiple AdminLTE components within the header of the box.</p> + <p>AdminLTE data-widget attribute provides boxes with the ability to collapse or be removed. The buttons + are placed in the box-tools which is placed in the box-header.</p> + <pre class="prettyprint"> +&LT;!-- This will cause the box to be removed when clicked --> +&LT;button class="btn btn-box-tool" data-widget="remove" data-toggle="tooltip" title="Remove">&LT;i class="fa fa-times">&LT;/i>&LT;/button> +&LT;!-- This will cause the box to collapse when clicked --> +&LT;button class="btn btn-box-tool" data-widget="collapse" data-toggle="tooltip" title="Collapse">&LT;i class="fa fa-minus">&LT;/i>&LT;/button></pre> + <div class="row"> + <div class="col-md-4"> + <div class="box box-default"> + <div class="box-header with-border"> + <h3 class="box-title">Collapsable</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + <pre class="prettyprint"> +&LT;div class="box box-default"> + &LT;div class="box-header with-border"> + &LT;h3 class="box-title">Collapsable&LT;/h3> + &LT;div class="box-tools pull-right"> + &LT;button class="btn btn-box-tool" data-widget="collapse">&LT;i class="fa fa-minus">&LT;/i>&LT;/button> + &LT;/div>&LT;!-- /.box-tools --> + &LT;/div>&LT;!-- /.box-header --> + &LT;div class="box-body"> + The body of the box + &LT;/div>&LT;!-- /.box-body --> +&LT;/div>&LT;!-- /.box --></pre> + </div> + <div class="col-md-4"> + <div class="box box-default"> + <div class="box-header with-border"> + <h3 class="box-title">Removable</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + <pre class="prettyprint"> +&LT;div class="box box-default"> + &LT;div class="box-header with-border"> + &LT;h3 class="box-title">Removable&LT;/h3> + &LT;div class="box-tools pull-right"> + &LT;button class="btn btn-box-tool" data-widget="remove">&LT;i class="fa fa-times">&LT;/i>&LT;/button> + &LT;/div>&LT;!-- /.box-tools --> + &LT;/div>&LT;!-- /.box-header --> + &LT;div class="box-body"> + The body of the box + &LT;/div>&LT;!-- /.box-body --> +&LT;/div>&LT;!-- /.box --></pre> + </div> + <div class="col-md-4"> + <div class="box box-default collapsed-box"> + <div class="box-header with-border"> + <h3 class="box-title">Expandable</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-plus"></i></button> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + <pre class="prettyprint"> +&LT;div class="box box-default collapsed-box"> + &LT;div class="box-header with-border"> + &LT;h3 class="box-title">Expandable&LT;/h3> + &LT;div class="box-tools pull-right"> + &LT;button class="btn btn-box-tool" data-widget="collapse">&LT;i class="fa fa-plus">&LT;/i>&LT;/button> + &LT;/div>&LT;!-- /.box-tools --> + &LT;/div>&LT;!-- /.box-header --> + &LT;div class="box-body"> + The body of the box + &LT;/div>&LT;!-- /.box-body --> +&LT;/div>&LT;!-- /.box --></pre> + </div> + </div><!-- /.row --> + <p>We can also add labels, badges, pagination, tooltips, inputs and many more in the box tools. A few examples:</p> + <div class="row"> + <div class="col-md-4"> + <div class="box box-default"> + <div class="box-header with-border"> + <h3 class="box-title">Labels</h3> + <div class="box-tools pull-right"> + <span class="label label-default">Some Label</span> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + <pre class="prettyprint"> +&LT;div class="box box-default"> + &LT;div class="box-header with-border"> + &LT;h3 class="box-title">Labels&LT;/h3> + &LT;div class="box-tools pull-right"> + &LT;span class="label label-default">8 New Messages&LT;/span> + &LT;/div>&LT;!-- /.box-tools --> + &LT;/div>&LT;!-- /.box-header --> + &LT;div class="box-body"> + The body of the box + &LT;/div>&LT;!-- /.box-body --> +&LT;/div>&LT;!-- /.box --></pre> + </div> + <div class="col-md-4"> + <div class="box box-default"> + <div class="box-header with-border"> + <h3 class="box-title">Input</h3> + <div class="box-tools pull-right"> + <div class="has-feedback"> + <input type="text" class="form-control input-sm" placeholder="Search..."> + <span class="glyphicon glyphicon-search form-control-feedback text-muted"></span> + </div> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + <pre class="prettyprint"> +&LT;div class="box box-default"> + &LT;div class="box-header with-border"> + &LT;h3 class="box-title">Input&LT;/h3> + &LT;div class="box-tools pull-right"> + &LT;div class="has-feedback"> + &LT;input type="text" class="form-control input-sm" placeholder="Search..."> + &LT;span class="glyphicon glyphicon-search form-control-feedback">&LT;/span> + &LT;/div> + &LT;/div>&LT;!-- /.box-tools --> + &LT;/div>&LT;!-- /.box-header --> + &LT;div class="box-body"> + The body of the box + &LT;/div>&LT;!-- /.box-body --> +&LT;/div>&LT;!-- /.box --></pre> + </div> + <div class="col-md-4"> + <div class="box box-default"> + <div class="box-header with-border"> + <h3 class="box-title">Tootips on buttons</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse" data-toggle="tooltip" title="Collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove" data-toggle="tooltip" title="Remove"><i class="fa fa-times"></i></button> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + <pre class="prettyprint"> +&LT;div class="box box-default"> + &LT;div class="box-header with-border"> + &LT;h3 class="box-title">Tooltips on buttons&LT;/h3> + &LT;div class="box-tools pull-right"> + &LT;button class="btn btn-box-tool" data-widget="collapse" data-toggle="tooltip" title="Collapse">&LT;i class="fa fa-minus">&LT;/i>&LT;/button> + &LT;button class="btn btn-box-tool" data-widget="remove" data-toggle="tooltip" title="Remove">&LT;i class="fa fa-times">&LT;/i>&LT;/button> + &LT;/div>&LT;!-- /.box-tools --> + &LT;/div>&LT;!-- /.box-header --> + &LT;div class="box-body"> + The body of the box + &LT;/div>&LT;!-- /.box-body --> +&LT;/div>&LT;!-- /.box --></pre> + </div><!-- /.col --> + </div><!-- /.row --> + <p> + If you inserted a box into the document after <code>app.js</code> was loaded, you have to activate + the collapse/remove buttons explicitly by calling <code>.activateBox()</code>: + </p> + <pre class="prettyprint"><code class="html">&LT;script> + $("#box-widget").activateBox(); +&LT;/script></code></pre> + + <h4>Loading States</h4> + <div class="row"> + <div class="col-md-6"> + <div class="box box-default"> + <div class="box-header with-border"> + <h3 class="box-title">Loading state</h3> + </div> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + <!-- Loading (remove the following to stop the loading)--> + <div class="overlay"> + <i class="fa fa-refresh fa-spin"></i> + </div> + <!-- end loading --> + </div><!-- /.box --> + </div><!-- /.col --> + + <div class="col-md-6"> + <div class="box box-default box-solid"> + <div class="box-header with-border"> + <h3 class="box-title">Loading state (.box-solid)</h3> + </div> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + <!-- Loading (remove the following to stop the loading)--> + <div class="overlay"> + <i class="fa fa-refresh fa-spin"></i> + </div> + <!-- end loading --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + <p class="lead"> + To simulate a loading state, simply place this code before the <code>.box</code> closing tag. + </p> + <pre class="prettyprint"><code class="html">&LT;div class="overlay"> + &LT;i class="fa fa-refresh fa-spin">&LT;/i> +&LT;/div> +</code></pre> + <h3 id="component-direct-chat">Direct Chat</h3> + <p class="lead">The direct chat widget extends the box component to create a beautiful chat interface. This widget + consists of a required messages pane and an <b>optional</b> contacts pane. Examples:</p> + <!-- Direct Chat --> + <div class="row"> + <div class="col-md-3"> + <!-- DIRECT CHAT PRIMARY --> + <div class="box box-primary direct-chat direct-chat-primary"> + <div class="box-header with-border"> + <h3 class="box-title">Direct Chat</h3> + <div class="box-tools pull-right"> + <span data-toggle="tooltip" title="3 New Messages" class="badge bg-light-blue">3</span> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-toggle="tooltip" title="Contacts" data-widget="chat-pane-toggle"><i class="fa fa-comments"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <!-- Conversations are loaded here --> + <div class="direct-chat-messages"> + <!-- Message. Default to the left --> + <div class="direct-chat-msg"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-left">Alexander Pierce</span> + <span class="direct-chat-timestamp pull-right">23 Jan 2:00 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user1-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + Is this template really for free? That's unbelievable! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + + <!-- Message to the right --> + <div class="direct-chat-msg right"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-right">Sarah Bullock</span> + <span class="direct-chat-timestamp pull-left">23 Jan 2:05 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user3-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + You better believe it! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + </div><!--/.direct-chat-messages--> + + <!-- Contacts are loaded here --> + <div class="direct-chat-contacts"> + <ul class="contacts-list"> + <li> + <a href="#"> + <img class="contacts-list-img" src="../dist/img/user1-128x128.jpg" alt="Contact Avatar"> + <div class="contacts-list-info"> + <span class="contacts-list-name"> + Count Dracula + <small class="contacts-list-date pull-right">2/28/2015</small> + </span> + <span class="contacts-list-msg">How have you been? I was...</span> + </div><!-- /.contacts-list-info --> + </a> + </li><!-- End Contact Item --> + </ul><!-- /.contatcts-list --> + </div><!-- /.direct-chat-pane --> + </div><!-- /.box-body --> + <div class="box-footer"> + <form action="#" method="post"> + <div class="input-group"> + <input type="text" name="message" placeholder="Type Message ..." class="form-control"> + <span class="input-group-btn"> + <button type="button" class="btn btn-primary btn-flat">Send</button> + </span> + </div> + </form> + </div><!-- /.box-footer--> + </div><!--/.direct-chat --> + </div><!-- /.col --> + + <div class="col-md-3"> + <!-- DIRECT CHAT SUCCESS --> + <div class="box box-success direct-chat direct-chat-success"> + <div class="box-header with-border"> + <h3 class="box-title">Direct Chat</h3> + <div class="box-tools pull-right"> + <span data-toggle="tooltip" title="3 New Messages" class="badge bg-green">3</span> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-toggle="tooltip" title="Contacts" data-widget="chat-pane-toggle"><i class="fa fa-comments"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <!-- Conversations are loaded here --> + <div class="direct-chat-messages"> + <!-- Message. Default to the left --> + <div class="direct-chat-msg"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-left">Alexander Pierce</span> + <span class="direct-chat-timestamp pull-right">23 Jan 2:00 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user1-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + Is this template really for free? That's unbelievable! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + + <!-- Message to the right --> + <div class="direct-chat-msg right"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-right">Sarah Bullock</span> + <span class="direct-chat-timestamp pull-left">23 Jan 2:05 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user3-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + You better believe it! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + </div><!--/.direct-chat-messages--> + + <!-- Contacts are loaded here --> + <div class="direct-chat-contacts"> + <ul class="contacts-list"> + <li> + <a href="#"> + <img class="contacts-list-img" src="../dist/img/user1-128x128.jpg" alt="Contact Avatar"> + <div class="contacts-list-info"> + <span class="contacts-list-name"> + Count Dracula + <small class="contacts-list-date pull-right">2/28/2015</small> + </span> + <span class="contacts-list-msg">How have you been? I was...</span> + </div><!-- /.contacts-list-info --> + </a> + </li><!-- End Contact Item --> + </ul><!-- /.contatcts-list --> + </div><!-- /.direct-chat-pane --> + </div><!-- /.box-body --> + <div class="box-footer"> + <form action="#" method="post"> + <div class="input-group"> + <input type="text" name="message" placeholder="Type Message ..." class="form-control"> + <span class="input-group-btn"> + <button type="button" class="btn btn-success btn-flat">Send</button> + </span> + </div> + </form> + </div><!-- /.box-footer--> + </div><!--/.direct-chat --> + </div><!-- /.col --> + + <div class="col-md-3"> + <!-- DIRECT CHAT WARNING --> + <div class="box box-warning direct-chat direct-chat-warning"> + <div class="box-header with-border"> + <h3 class="box-title">Direct Chat</h3> + <div class="box-tools pull-right"> + <span data-toggle="tooltip" title="3 New Messages" class="badge bg-yellow">3</span> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-toggle="tooltip" title="Contacts" data-widget="chat-pane-toggle"><i class="fa fa-comments"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <!-- Conversations are loaded here --> + <div class="direct-chat-messages"> + <!-- Message. Default to the left --> + <div class="direct-chat-msg"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-left">Alexander Pierce</span> + <span class="direct-chat-timestamp pull-right">23 Jan 2:00 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user1-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + Is this template really for free? That's unbelievable! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + + <!-- Message to the right --> + <div class="direct-chat-msg right"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-right">Sarah Bullock</span> + <span class="direct-chat-timestamp pull-left">23 Jan 2:05 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user3-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + You better believe it! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + </div><!--/.direct-chat-messages--> + + <!-- Contacts are loaded here --> + <div class="direct-chat-contacts"> + <ul class="contacts-list"> + <li> + <a href="#"> + <img class="contacts-list-img" src="../dist/img/user1-128x128.jpg" alt="Contact Avatar"> + <div class="contacts-list-info"> + <span class="contacts-list-name"> + Count Dracula + <small class="contacts-list-date pull-right">2/28/2015</small> + </span> + <span class="contacts-list-msg">How have you been? I was...</span> + </div><!-- /.contacts-list-info --> + </a> + </li><!-- End Contact Item --> + </ul><!-- /.contatcts-list --> + </div><!-- /.direct-chat-pane --> + </div><!-- /.box-body --> + <div class="box-footer"> + <form action="#" method="post"> + <div class="input-group"> + <input type="text" name="message" placeholder="Type Message ..." class="form-control"> + <span class="input-group-btn"> + <button type="button" class="btn btn-warning btn-flat">Send</button> + </span> + </div> + </form> + </div><!-- /.box-footer--> + </div><!--/.direct-chat --> + </div><!-- /.col --> + + <div class="col-md-3"> + <!-- DIRECT CHAT DANGER --> + <div class="box box-danger direct-chat direct-chat-danger"> + <div class="box-header with-border"> + <h3 class="box-title">Direct Chat</h3> + <div class="box-tools pull-right"> + <span data-toggle="tooltip" title="3 New Messages" class="badge bg-red">3</span> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-toggle="tooltip" title="Contacts" data-widget="chat-pane-toggle"><i class="fa fa-comments"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <!-- Conversations are loaded here --> + <div class="direct-chat-messages"> + <!-- Message. Default to the left --> + <div class="direct-chat-msg"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-left">Alexander Pierce</span> + <span class="direct-chat-timestamp pull-right">23 Jan 2:00 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user1-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + Is this template really for free? That's unbelievable! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + + <!-- Message to the right --> + <div class="direct-chat-msg right"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-right">Sarah Bullock</span> + <span class="direct-chat-timestamp pull-left">23 Jan 2:05 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user3-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + You better believe it! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + </div><!--/.direct-chat-messages--> + + <!-- Contacts are loaded here --> + <div class="direct-chat-contacts"> + <ul class="contacts-list"> + <li> + <a href="#"> + <img class="contacts-list-img" src="../dist/img/user1-128x128.jpg" alt="Contact Avatar"> + <div class="contacts-list-info"> + <span class="contacts-list-name"> + Count Dracula + <small class="contacts-list-date pull-right">2/28/2015</small> + </span> + <span class="contacts-list-msg">How have you been? I was...</span> + </div><!-- /.contacts-list-info --> + </a> + </li><!-- End Contact Item --> + </ul><!-- /.contatcts-list --> + </div><!-- /.direct-chat-pane --> + </div><!-- /.box-body --> + <div class="box-footer"> + <form action="#" method="post"> + <div class="input-group"> + <input type="text" name="message" placeholder="Type Message ..." class="form-control"> + <span class="input-group-btn"> + <button type="button" class="btn btn-danger btn-flat">Send</button> + </span> + </div> + </form> + </div><!-- /.box-footer--> + </div><!--/.direct-chat --> + </div><!-- /.col --> + </div><!-- /.row --> + <p class="lead">Direct Chat Markup</p> + <pre class="prettyprint"><code class="html"> +&LT;!-- Construct the box with style you want. Here we are using box-danger --> +&LT;!-- Then add the class direct-chat and choose the direct-chat-* contexual class --> +&LT;!-- The contextual class should match the box, so we are using direct-chat-danger --> +&LT;div class="box box-danger direct-chat direct-chat-danger"> + &LT;div class="box-header with-border"> + &LT;h3 class="box-title">Direct Chat&LT;/h3> + &LT;div class="box-tools pull-right"> + &LT;span data-toggle="tooltip" title="3 New Messages" class="badge bg-red">3&LT;/span> + &LT;button class="btn btn-box-tool" data-widget="collapse">&LT;i class="fa fa-minus">&LT;/i>&LT;/button> + &LT;!-- In box-tools add this button if you intend to use the contacts pane --> + &LT;button class="btn btn-box-tool" data-toggle="tooltip" title="Contacts" data-widget="chat-pane-toggle">&LT;i class="fa fa-comments">&LT;/i>&LT;/button> + &LT;button class="btn btn-box-tool" data-widget="remove">&LT;i class="fa fa-times">&LT;/i>&LT;/button> + &LT;/div> + &LT;/div>&LT;!-- /.box-header --> + &LT;div class="box-body"> + &LT;!-- Conversations are loaded here --> + &LT;div class="direct-chat-messages"> + &LT;!-- Message. Default to the left --> + &LT;div class="direct-chat-msg"> + &LT;div class="direct-chat-info clearfix"> + &LT;span class="direct-chat-name pull-left">Alexander Pierce&LT;/span> + &LT;span class="direct-chat-timestamp pull-right">23 Jan 2:00 pm&LT;/span> + &LT;/div>&LT;!-- /.direct-chat-info --> + &LT;img class="direct-chat-img" src="../dist/img/user1-128x128.jpg" alt="message user image">&LT;!-- /.direct-chat-img --> + &LT;div class="direct-chat-text"> + Is this template really for free? That's unbelievable! + &LT;/div>&LT;!-- /.direct-chat-text --> + &LT;/div>&LT;!-- /.direct-chat-msg --> + + &LT;!-- Message to the right --> + &LT;div class="direct-chat-msg right"> + &LT;div class="direct-chat-info clearfix"> + &LT;span class="direct-chat-name pull-right">Sarah Bullock&LT;/span> + &LT;span class="direct-chat-timestamp pull-left">23 Jan 2:05 pm&LT;/span> + &LT;/div>&LT;!-- /.direct-chat-info --> + &LT;img class="direct-chat-img" src="../dist/img/user3-128x128.jpg" alt="message user image">&LT;!-- /.direct-chat-img --> + &LT;div class="direct-chat-text"> + You better believe it! + &LT;/div>&LT;!-- /.direct-chat-text --> + &LT;/div>&LT;!-- /.direct-chat-msg --> + &LT;/div>&LT;!--/.direct-chat-messages--> + + &LT;!-- Contacts are loaded here --> + &LT;div class="direct-chat-contacts"> + &LT;ul class="contacts-list"> + &LT;li> + &LT;a href="#"> + &LT;img class="contacts-list-img" src="../dist/img/user1-128x128.jpg" alt="Contact Avatar"> + &LT;div class="contacts-list-info"> + &LT;span class="contacts-list-name"> + Count Dracula + &LT;small class="contacts-list-date pull-right">2/28/2015&LT;/small> + &LT;/span> + &LT;span class="contacts-list-msg">How have you been? I was...&LT;/span> + &LT;/div>&LT;!-- /.contacts-list-info --> + &LT;/a> + &LT;/li>&LT;!-- End Contact Item --> + &LT;/ul>&LT;!-- /.contatcts-list --> + &LT;/div>&LT;!-- /.direct-chat-pane --> + &LT;/div>&LT;!-- /.box-body --> + &LT;div class="box-footer"> + &LT;div class="input-group"> + &LT;input type="text" name="message" placeholder="Type Message ..." class="form-control"> + &LT;span class="input-group-btn"> + &LT;button type="button" class="btn btn-danger btn-flat">Send&LT;/button> + &LT;/span> + &LT;/div> + &LT;/div>&LT;!-- /.box-footer--> +&LT;/div>&LT;!--/.direct-chat --> +</code></pre> + + <p>Of course you can use direct chat with a solid box by adding the class <code>solid-box</code> to the box. Here are a couple of examples:</p> + + <!-- Direct Chat With Solid Boxes --> + <div class="row"> + <div class="col-md-6"> + <!-- DIRECT CHAT WARNING --> + <div class="box box-primary box-solid direct-chat direct-chat-primary"> + <div class="box-header"> + <h3 class="box-title">Direct Chat in a Solid Box</h3> + <div class="box-tools pull-right"> + <span data-toggle="tooltip" title="3 New Messages" class="badge bg-light-blue">3</span> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-toggle="tooltip" title="Contacts" data-widget="chat-pane-toggle"><i class="fa fa-comments"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <!-- Conversations are loaded here --> + <div class="direct-chat-messages"> + <!-- Message. Default to the left --> + <div class="direct-chat-msg"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-left">Alexander Pierce</span> + <span class="direct-chat-timestamp pull-right">23 Jan 2:00 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user1-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + Is this template really for free? That's unbelievable! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + + <!-- Message to the right --> + <div class="direct-chat-msg right"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-right">Sarah Bullock</span> + <span class="direct-chat-timestamp pull-left">23 Jan 2:05 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user3-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + You better believe it! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + </div><!--/.direct-chat-messages--> + + <!-- Contacts are loaded here --> + <div class="direct-chat-contacts"> + <ul class="contacts-list"> + <li> + <a href="#"> + <img class="contacts-list-img" src="../dist/img/user1-128x128.jpg" alt="Contact Avatar"> + <div class="contacts-list-info"> + <span class="contacts-list-name"> + Count Dracula + <small class="contacts-list-date pull-right">2/28/2015</small> + </span> + <span class="contacts-list-msg">How have you been? I was...</span> + </div><!-- /.contacts-list-info --> + </a> + </li><!-- End Contact Item --> + </ul><!-- /.contatcts-list --> + </div><!-- /.direct-chat-pane --> + </div><!-- /.box-body --> + <div class="box-footer"> + <form action="#" method="post"> + <div class="input-group"> + <input type="text" name="message" placeholder="Type Message ..." class="form-control"> + <span class="input-group-btn"> + <button type="button" class="btn btn-primary btn-flat">Send</button> + </span> + </div> + </form> + </div><!-- /.box-footer--> + </div><!--/.direct-chat --> + </div><!-- /.col --> + + <div class="col-md-6"> + <!-- DIRECT CHAT DANGER --> + <div class="box box-info box-solid direct-chat direct-chat-info"> + <div class="box-header"> + <h3 class="box-title">Direct Chat in a Solid Box</h3> + <div class="box-tools pull-right"> + <span data-toggle="tooltip" title="3 New Messages" class="badge bg-aqua">3</span> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-toggle="tooltip" title="Contacts" data-widget="chat-pane-toggle"><i class="fa fa-comments"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <!-- Conversations are loaded here --> + <div class="direct-chat-messages"> + <!-- Message. Default to the left --> + <div class="direct-chat-msg"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-left">Alexander Pierce</span> + <span class="direct-chat-timestamp pull-right">23 Jan 2:00 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user1-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + Is this template really for free? That's unbelievable! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + + <!-- Message to the right --> + <div class="direct-chat-msg right"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-right">Sarah Bullock</span> + <span class="direct-chat-timestamp pull-left">23 Jan 2:05 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user3-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + You better believe it! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + </div><!--/.direct-chat-messages--> + + <!-- Contacts are loaded here --> + <div class="direct-chat-contacts"> + <ul class="contacts-list"> + <li> + <a href="#"> + <img class="contacts-list-img" src="../dist/img/user1-128x128.jpg" alt="Contact Avatar"> + <div class="contacts-list-info"> + <span class="contacts-list-name"> + Count Dracula + <small class="contacts-list-date pull-right">2/28/2015</small> + </span> + <span class="contacts-list-msg">How have you been? I was...</span> + </div><!-- /.contacts-list-info --> + </a> + </li><!-- End Contact Item --> + </ul><!-- /.contatcts-list --> + </div><!-- /.direct-chat-pane --> + </div><!-- /.box-body --> + <div class="box-footer"> + <form action="#" method="post"> + <div class="input-group"> + <input type="text" name="message" placeholder="Type Message ..." class="form-control"> + <span class="input-group-btn"> + <button type="button" class="btn btn-info btn-flat">Send</button> + </span> + </div> + </form> + </div><!-- /.box-footer--> + </div><!--/.direct-chat --> + </div><!-- /.col --> + </div><!-- /.row --> +</section> diff --git a/theme/bootstrap/documentation/build/include/dependencies.html b/theme/bootstrap/documentation/build/include/dependencies.html new file mode 100644 index 0000000..8889eb5 --- /dev/null +++ b/theme/bootstrap/documentation/build/include/dependencies.html @@ -0,0 +1,10 @@ +<section id="dependencies"> + <h2 class="page-header"><a href="#dependencies">Dependencies</a></h2> + <p class="lead">AdminLTE depends on two main frameworks. + The downloadable package contains both of these libraries, so you don't have to manually download them.</p> + <ul class="bring-up"> + <li><a href="http://getbootstrap.com" target="_blank">Bootstrap 3</a></li> + <li><a href="http://jquery.com/" target="_blank">jQuery 1.11+</a></li> + <li><a href="#plugins">All other plugins are listed below</a></li> + </ul> +</section> \ No newline at end of file diff --git a/theme/bootstrap/documentation/build/include/download.html b/theme/bootstrap/documentation/build/include/download.html new file mode 100644 index 0000000..b8f0b47 --- /dev/null +++ b/theme/bootstrap/documentation/build/include/download.html @@ -0,0 +1,48 @@ +<section id="download"> + <h2 class="page-header"><a href="#download">Download</a></h2> + <p class="lead"> + AdminLTE can be downloaded in two different versions, each appealing to different skill levels and use case. + </p> + <div class="row"> + <div class="col-sm-6"> + <div class="box box-primary"> + <div class="box-header with-border"> + <h3 class="box-title">Ready</h3> + <span class="label label-primary pull-right"><i class="fa fa-html5"></i></span> + </div><!-- /.box-header --> + <div class="box-body"> + <p>Compiled and ready to use in production. Download this version if you don't want to customize AdminLTE's LESS files.</p> + <a href="http://almsaeedstudio.com/download/AdminLTE-dist" class="btn btn-primary"><i class="fa fa-download"></i> Download</a> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + <div class="col-sm-6"> + <div class="box box-danger"> + <div class="box-header with-border"> + <h3 class="box-title">Source Code</h3> + <span class="label label-danger pull-right"><i class="fa fa-database"></i></span> + </div><!-- /.box-header --> + <div class="box-body"> + <p>All files including the compiled CSS. Download this version if you plan on customizing the template. <b>Requires a LESS compiler.</b></p> + <a href="http://almsaeedstudio.com/download/AdminLTE" class="btn btn-danger"><i class="fa fa-download"></i> Download</a> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + <pre class="hierarchy bring-up"><code class="language-bash" data-lang="bash">File Hierarchy of the Source Code Package + +AdminLTE/ +├── dist/ +│ ├── CSS/ +│ ├── JS +│ ├── img +├── build/ +│ ├── less/ +│ │ ├── AdminLTE's Less files +│ └── Bootstrap-less/ (Only for reference. No modifications have been made) +│ ├── mixins/ +│ ├── variables.less +│ ├── mixins.less +└── plugins/ + ├── All the customized plugins CSS and JS files</code></pre> +</section> diff --git a/theme/bootstrap/documentation/build/include/faq.html b/theme/bootstrap/documentation/build/include/faq.html new file mode 100644 index 0000000..9c4bae6 --- /dev/null +++ b/theme/bootstrap/documentation/build/include/faq.html @@ -0,0 +1,12 @@ +<section id="faq"> + <h2 class="page-header"><a href="#faq">FAQ</a></h2> + <h3>Can AdminLTE be used with Wordpress?</h3> + <p class="lead">AdminLTE is an HTML template that can be used for any purpose. However, it is not made to be easily installed on Wordpress. It will require some effort and enough knowledge of the Wordpress script to do so.</p> + + <h3>Is there an integration guide for PHP frameworks such as Yii or Symfony?</h3> + <p class="lead">Short answer, no. However, there are forks and tutorials around the web that provide info on how to integrate with many different frameworks. There are even versions of AdminLTE that are integrated with jQuery ajax, AngularJS and/or MVC5 ASP .NET.</p> + + <h3>How do I get notified of new AdminLTE versions?</h3> + <p class="lead">The best option is to subscribe to our mailing list using the <a href="http://almsaeedstudio.com/#subscribe">subscription form on Almsaeed Studio</a>. + If that's not appealing to you, you may watch the <a href="https://github.com/almasaeed2010/AdminLTE">repository on Github</a> or visit <a href="http://almsaeedstudio.com">Almsaeed Studio</a> every now and then for updates and announcements.</p> +</section> diff --git a/theme/bootstrap/documentation/build/include/implementations.html b/theme/bootstrap/documentation/build/include/implementations.html new file mode 100644 index 0000000..a84386d --- /dev/null +++ b/theme/bootstrap/documentation/build/include/implementations.html @@ -0,0 +1,16 @@ +<section id="implementations"> + <h2 class="page-header"><a href="#implementations">Implementations</a></h2> + <p class="lead">Thanks to many of AdminLTE users, there are multiple implementations of the template + for easy integration with back-end frameworks. The following are some of them:</p> + + <ul> + <li><a href="https://github.com/dmstr/yii2-adminlte-asset" target="_blank">Yii 2</a> by <a href="https://github.com/schmunk42" target="_blank">Tobias Munk</a></li> + <li><a href="https://github.com/yajra/laravel-admin-template" target="_blank">Laravel</a> by <a href="https://github.com/yajra" target="_blank">Arjay Angeles</a></li> + <li><a href="https://github.com/avanzu/AdminThemeBundle" target="_blank">Symfony</a> by <a href="https://github.com/avanzu" target="_blank">Marc Bach</a></li> + <li><a href="https://github.com/nicolas-besnard/adminlte2-rails" target="_blank">Rails Gem</a> by <a href="https://github.com/nicolas-besnard" target="_blank">Nicolas Besnard</a></li> + </ul> + + <p><b class="text-red">Note:</b> these implementations are not supported by Almsaeed Studio. However, + they do provide a good example of how to integrate AdminLTE into different frameworks. For the latest release + of AdminLTE, please visit our <a href="https://github.com/almasaeed2010/AdminLTE">repository</a> or <a href="https://almsaeedstudio.com">website</a></p> +</section> diff --git a/theme/bootstrap/documentation/build/include/introduction.html b/theme/bootstrap/documentation/build/include/introduction.html new file mode 100644 index 0000000..3a88850 --- /dev/null +++ b/theme/bootstrap/documentation/build/include/introduction.html @@ -0,0 +1,12 @@ +<section id="introduction"> + <h2 class="page-header"><a href="#introduction">Introduction</a></h2> + <p class="lead"> + <b>AdminLTE</b> is a popular open source WebApp template for admin dashboards and control panels. + It is a responsive HTML template that is based on the CSS framework Bootstrap 3. + It utilizes all of the Bootstrap components in its design and re-styles many + commonly used plugins to create a consistent design that can be used as a user + interface for backend applications. AdminLTE is based on a modular design, which + allows it to be easily customized and built upon. This documentation will guide you through + installing the template and exploring the various components that are bundled with the template. + </p> +</section><!-- /#introduction --> diff --git a/theme/bootstrap/documentation/build/include/layout.html b/theme/bootstrap/documentation/build/include/layout.html new file mode 100644 index 0000000..8e04626 --- /dev/null +++ b/theme/bootstrap/documentation/build/include/layout.html @@ -0,0 +1,92 @@ +<section id="layout"> + <h2 class="page-header"><a href="#layout">Layout</a></h2> + <p class="lead">The layout consists of four major parts:</p> + <ul> + <li>Wrapper <code>.wrapper</code>. A div that wraps the whole site.</li> + <li>Main Header <code>.main-header</code>. Contains the logo and navbar.</li> + <li>Sidebar <code>.sidebar-wrapper</code>. Contains the user panel and sidebar menu.</li> + <li>Content <code>.content-wrapper</code>. Contains the page header and content.</li> + </ul> + <div class="callout callout-danger lead"> + <h4>Tip!</h4> + <p>The <a href="../starter.html">starter page</a> is a good place to start building your app if you'd like to start from scratch.</p> + </div> + + <h3>Layout Options</h3> + <p class="lead">AdminLTE 2.0 provides a set of options to apply to your main layout. Each on of these classes can be added + to the body tag to get the desired goal.</p> + <ul> + <li><b>Fixed:</b> use the class <code>.fixed</code> to get a fixed header and sidebar.</li> + <li><b>Collapsed Sidebar:</b> use the class <code>.sidebar-collapse</code> to have a collapsed sidebar upon loading.</li> + <li><b>Boxed Layout:</b> use the class <code>.layout-boxed</code> to get a boxed layout that stretches only to 1250px.</li> + <li><b>Top Navigation</b> use the class <code>.layout-top-nav</code> to remove the sidebar and have your links at the top navbar.</li> + </ul> + <p><b>Note:</b> you cannot use both layout-boxed and fixed at the same time. Anything else can be mixed together.</p> + + <h3>Skins</h3> + <p class="lead">Skins can be found in the dist/css/skins folder. + Choose and the skin file that you want then add the appropriate + class to the body tag to change the template's appearance. Here is the list of available skins:</p> + <div class="box box-solid" style="max-width: 300px;"> + <div class="box-body no-padding"> + <table id="layout-skins-list" class="table table-striped bring-up nth-2-center"> + <thead> + <tr> + <th style="width: 210px;">Skin Class</th> + <th>Preview</th> + </tr> + </thead> + <tbody> + <tr> + <td><code>skin-blue</code></td> + <td><a href="#" data-skin="skin-blue" class="btn btn-primary btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + <tr> + <td><code>skin-blue-light</code></td> + <td><a href="#" data-skin="skin-blue-light" class="btn btn-primary btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + <tr> + <td><code>skin-yellow</code></td> + <td><a href="#" data-skin="skin-yellow" class="btn btn-warning btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + <tr> + <td><code>skin-yellow-light</code></td> + <td><a href="#" data-skin="skin-yellow-light" class="btn btn-warning btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + <tr> + <td><code>skin-green</code></td> + <td><a href="#" data-skin="skin-green" class="btn btn-success btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + <tr> + <td><code>skin-green-light</code></td> + <td><a href="#" data-skin="skin-green-light" class="btn btn-success btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + <tr> + <td><code>skin-purple</code></td> + <td><a href="#" data-skin="skin-purple" class="btn bg-purple btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + <tr> + <td><code>skin-purple-light</code></td> + <td><a href="#" data-skin="skin-purple-light" class="btn bg-purple btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + <tr> + <td><code>skin-red</code></td> + <td><a href="#" data-skin="skin-red" class="btn btn-danger btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + <tr> + <td><code>skin-red-light</code></td> + <td><a href="#" data-skin="skin-red-light" class="btn btn-danger btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + <tr> + <td><code>skin-black</code></td> + <td><a href="#" data-skin="skin-black" class="btn bg-black btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + <tr> + <td><code>skin-black-light</code></td> + <td><a href="#" data-skin="skin-black-light" class="btn bg-black btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + </tbody> + </table> + </div><!-- /.box-body --> + </div><!-- /.box --> +</section> diff --git a/theme/bootstrap/documentation/build/include/license.html b/theme/bootstrap/documentation/build/include/license.html new file mode 100644 index 0000000..b326240 --- /dev/null +++ b/theme/bootstrap/documentation/build/include/license.html @@ -0,0 +1,10 @@ +<section id="license"> + <h2 class="page-header"><a href="#license">License</a></h2> + <h3>AdminLTE</h3> + <p class="lead"> + AdminLTE is an open source project that is licensed under the <a href="http://opensource.org/licenses/MIT">MIT license</a>. + This allows you to do pretty much anything you want as long as you include + the copyright in "all copies or substantial portions of the Software." + Attribution is not required (though very much appreciated). + </p> +</section> diff --git a/theme/bootstrap/documentation/build/include/plugins.html b/theme/bootstrap/documentation/build/include/plugins.html new file mode 100644 index 0000000..e3a8779 --- /dev/null +++ b/theme/bootstrap/documentation/build/include/plugins.html @@ -0,0 +1,47 @@ +<section id="plugins"> + <h2 class="page-header"><a href="#plugins">Plugins</a></h2> + <p class="lead">AdminLTE makes use of the following plugins. For documentation, updates or license information, please visit the provided links.</p> + <div class="row bring-up"> + <div class="col-sm-3"> + <ul class="list-unstyled"> + <li><h4>Charts</h4></li> + <li><a href="http://www.chartjs.org/" target="_blank">ChartJS</a></li> + <li><a href="http://www.flotcharts.org/" target="_blank">Flot</a></li> + <li><a href="http://morrisjs.github.io/morris.js/" target="_blank">Morris.js</a></li> + <li><a href="http://omnipotent.net/jquery.sparkline/" target="_blank">Sparkline</a></li> + </ul> + </div><!-- /.col --> + <div class="col-sm-3"> + <ul class="list-unstyled"> + <li><h4>Form Elements</h4></li> + <li><a href="https://github.com/seiyria/bootstrap-slider/">Bootstrap Slider</a></li> + <li><a href="http://ionden.com/a/plugins/ion.rangeSlider/en.html" target="_blank">Ion Slider</a></li> + <li><a href="http://bootstrap-datepicker.readthedocs.org/" target="_blank">Date Picker</a></li> + <li><a href="http://www.daterangepicker.com/" target="_blank">Date Range Picker</a></li> + <li><a href="http://mjolnic.com/bootstrap-colorpicker/" target="_blank">Color Picker</a></li> + <li><a href="https://github.com/jdewit/bootstrap-timepicker/" target="_blank">Time Picker</a></li> + <li><a href="http://fronteed.com/iCheck/" target="_blank">iCheck</a></li> + <li><a href="https://github.com/RobinHerbots/jquery.inputmask/" target="_blank">Input Mask</a></li> + </ul> + </div><!-- /.col --> + <div class="col-sm-3"> + <ul class="list-unstyled"> + <li><h4>Editors</h4></li> + <li><a href="https://github.com/bootstrap-wysiwyg/bootstrap3-wysiwyg/" target="_blank">Bootstrap WYSIHTML5</a></li> + <li><a href="http://ckeditor.com/" target="_blank">CK Editor</a></li> + </ul> + </div><!-- /. col --> + <div class="col-sm-3"> + <ul class="list-unstyled"> + <li><h4>Other</h4></li> + <li><a href="https://datatables.net/examples/styling/bootstrap.html" target="_blank">DataTables</a></li> + <li><a href="http://fullcalendar.io/" target="_blank">Full Calendar</a></li> + <li><a href="http://jqueryui.com/" target="_blank">jQuery UI</a></li> + <li><a href="http://anthonyterrien.com/knob/" target="_blank">jQuery Knob</a></li> + <li><a href="http://jvectormap.com/" target="_blank">jVector Map</a></li> + <li><a href="http://rocha.la/jQuery-slimScroll/" target="_blank">Slim Scroll</a></li> + <li><a href="http://github.hubspot.com/pace/docs/welcome/" target="_blank">Pace</a></li> + </ul> + </div><!-- /.col --> + </div><!-- /.row --> +</section> diff --git a/theme/bootstrap/documentation/build/include/upgrade.html b/theme/bootstrap/documentation/build/include/upgrade.html new file mode 100644 index 0000000..d339bc6 --- /dev/null +++ b/theme/bootstrap/documentation/build/include/upgrade.html @@ -0,0 +1,26 @@ +<section id="upgrade"> + <h2 class="page-header"><a href="#upgrade">Upgrade Guide</a></h2> + <p class="lead">To upgrade from version 1.x to the lateset version, follow this guide.</p> + <h3>New Files</h3> + <p>Make sure you update all CSS and JS files that are related to AdminLTE. Otherwise, the layout will not + function properly. Most important files are AdminLTE.css, skins CSS files, and app.js.</p> + <h3>Layout Changes</h3> + <ol> + <li>The .wrapper div must be placed immediately after the body tag rather than after the header</li> + <li>Change the .header div to .main-header <code>&LT;div class="main-header"></code></li> + <li>Change the .right-side class to .content-wrapper <code>&LT;div class="content-wrapper"></code></li> + <li>Change the .left-side class to .main-sidebar <code>&LT;div class="main-sidebar"></code></li> + <li>In the navbar, change .navbar-right to .navbar-custom-menu <code>&LT;div class="navbar-custom-menu"></code></li> + </ol> + <h3>Navbar Custom Dropdown Menus</h3> + <ol> + <li>The icons in the notification menu do not need bg-* classes. They should be replaced with contextual text color class such as text-aqua or text-red.</li> + </ol> + <h3>Login, Registration and Lockscreen Pages</h3> + <p>There are major changes to the HTML markup and style to these pages. The best way is to copy the page's code and customize it.</p> + <p>And you should be set to go!</p> + <h3>Mailbox</h3> + <p>Mailbox got an upgrade to include three different views. The views are inbox, read mail, and compose new email. To use these views, + you should use the provided HTML files in the pages/mailbox folder.</p> + <p><b class="text-red">Note:</b> the old mailbox layout has been deprecated in favor of the new one and will be removed by the next release.</p> +</section> diff --git a/theme/bootstrap/documentation/build/index.html b/theme/bootstrap/documentation/build/index.html new file mode 100644 index 0000000..31d9510 --- /dev/null +++ b/theme/bootstrap/documentation/build/index.html @@ -0,0 +1,192 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Documentation</title> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../dist/css/AdminLTE.min.css"> + <link rel="stylesheet" href="../dist/css/skins/_all-skins.min.css"> + <link rel="stylesheet" href="style.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="skin-blue fixed" data-spy="scroll" data-target="#scrollspy"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <!-- Logo --> + <a href="../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + </a> + <!-- Navbar Right Menu --> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <li><a href="http://almsaeedstudio.com">Almsaeed Studio</a></li> + <li><a href="http://almsaeedstudio.com/premium">Premium Templates</a></li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <div class="sidebar" id="scrollspy"> + + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="nav sidebar-menu"> + <li class="header">TABLE OF CONTENTS</li> + <li class="active"><a href="#introduction"><i class="fa fa-circle-o"></i> Introduction</a></li> + <li><a href="#download"><i class="fa fa-circle-o"></i> Download</a></li> + <li><a href="#dependencies"><i class="fa fa-circle-o"></i> Dependencies</a></li> + <li><a href="#advice"><i class="fa fa-circle-o"></i> Advice</a></li> + <li><a href="#layout"><i class="fa fa-circle-o"></i> Layout</a></li> + <li><a href="#adminlte-options"><i class="fa fa-circle-o"></i> Javascript Options</a></li> + <li class="treeview" id="scrollspy-components"> + <a href="javascript::;"><i class="fa fa-circle-o"></i> Components</a> + <ul class="nav treeview-menu"> + <li><a href="#component-main-header">Main Header</a></li> + <li><a href="#component-sidebar">Sidebar</a></li> + <li><a href="#component-control-sidebar">Control Sidebar</a></li> + <li><a href="#component-info-box">Info Box</a></li> + <li><a href="#component-box">Boxes</a></li> + <li><a href="#component-direct-chat">Direct Chat</a></li> + </ul> + </li> + <li><a href="#plugins"><i class="fa fa-circle-o"></i> Plugins</a></li> + <li><a href="#browsers"><i class="fa fa-circle-o"></i> Browser Support</a></li> + <li><a href="#upgrade"><i class="fa fa-circle-o"></i> Upgrade Guide</a></li> + <li><a href="#implementations"><i class="fa fa-circle-o"></i> Implementations</a></li> + <li><a href="#faq"><i class="fa fa-circle-o"></i> FAQ</a></li> + <li><a href="#license"><i class="fa fa-circle-o"></i> License</a></li> + </ul> + </div> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <div class="content-header"> + <h1> + AdminLTE Documentation + <small>Current version 2.3.0</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li class="active">Documentation</li> + </ol> + </div> + + <!-- Main content --> + <div class="content body"> + +include "introduction.html" + +<!-- ============================================================= --> + +include "download.html" + +<!-- ============================================================= --> + +include "dependencies.html" + +<!-- ============================================================= --> + +include "advice.html" + +<!-- ============================================================= --> + +include "layout.html" + +<!-- ============================================================= --> + +include "adminlte-options.html" + +<!-- ============================================================= --> + +include "components.html" + +<!-- ============================================================= --> + +include "plugins.html" + +<!-- ============================================================= --> + +include "browsers.html" + +<!-- ============================================================= --> + +include "upgrade.html" + +<!-- ============================================================= --> + +include "implementations.html" + +<!-- ============================================================= --> + +include "faq.html" + +<!-- ============================================================= --> + +include "license.html" + + </div><!-- /.content --> + </div><!-- /.content-wrapper --> + + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <div class="pad"> + This is an example of the control sidebar. + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../bootstrap/js/bootstrap.min.js"></script> + <!-- FastClick --> + <script src="../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../dist/js/app.min.js"></script> + <!-- SlimScroll 1.3.0 --> + <script src="../plugins/slimScroll/jquery.slimscroll.min.js"></script> + <script src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script> + <script src="docs.js"></script> + </body> +</html> diff --git a/theme/bootstrap/documentation/docs.js b/theme/bootstrap/documentation/docs.js new file mode 100644 index 0000000..c89ae54 --- /dev/null +++ b/theme/bootstrap/documentation/docs.js @@ -0,0 +1,63 @@ +/* + * Documentation JS script + */ +$(function () { + var slideToTop = $("<div />"); + slideToTop.html('<i class="fa fa-chevron-up"></i>'); + slideToTop.css({ + position: 'fixed', + bottom: '20px', + right: '25px', + width: '40px', + height: '40px', + color: '#eee', + 'font-size': '', + 'line-height': '40px', + 'text-align': 'center', + 'background-color': '#222d32', + cursor: 'pointer', + 'border-radius': '5px', + 'z-index': '99999', + opacity: '.7', + 'display': 'none' + }); + slideToTop.on('mouseenter', function () { + $(this).css('opacity', '1'); + }); + slideToTop.on('mouseout', function () { + $(this).css('opacity', '.7'); + }); + $('.wrapper').append(slideToTop); + $(window).scroll(function () { + if ($(window).scrollTop() >= 150) { + if (!$(slideToTop).is(':visible')) { + $(slideToTop).fadeIn(500); + } + } else { + $(slideToTop).fadeOut(500); + } + }); + $(slideToTop).click(function () { + $("body").animate({ + scrollTop: 0 + }, 500); + }); + $(".sidebar-menu li:not(.treeview) a").click(function () { + var $this = $(this); + var target = $this.attr("href"); + if (typeof target === 'string') { + $("body").animate({ + scrollTop: ($(target).offset().top) + "px" + }, 500); + } + }); + //Skin switcher + var current_skin = "skin-blue"; + $('#layout-skins-list [data-skin]').click(function(e) { + e.preventDefault(); + var skinName = $(this).data('skin'); + $('body').removeClass(current_skin); + $('body').addClass(skinName); + current_skin = skinName; + }); +}); diff --git a/theme/bootstrap/documentation/index.html b/theme/bootstrap/documentation/index.html new file mode 100644 index 0000000..d8841dd --- /dev/null +++ b/theme/bootstrap/documentation/index.html @@ -0,0 +1,2161 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Documentation</title> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../dist/css/AdminLTE.min.css"> + <link rel="stylesheet" href="../dist/css/skins/_all-skins.min.css"> + <link rel="stylesheet" href="style.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="skin-blue fixed" data-spy="scroll" data-target="#scrollspy"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <!-- Logo --> + <a href="../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + </a> + <!-- Navbar Right Menu --> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <li><a href="http://almsaeedstudio.com">Almsaeed Studio</a></li> + <li><a href="http://almsaeedstudio.com/premium">Premium Templates</a></li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <div class="sidebar" id="scrollspy"> + + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="nav sidebar-menu"> + <li class="header">TABLE OF CONTENTS</li> + <li class="active"><a href="#introduction"><i class="fa fa-circle-o"></i> Introduction</a></li> + <li><a href="#download"><i class="fa fa-circle-o"></i> Download</a></li> + <li><a href="#dependencies"><i class="fa fa-circle-o"></i> Dependencies</a></li> + <li><a href="#advice"><i class="fa fa-circle-o"></i> Advice</a></li> + <li><a href="#layout"><i class="fa fa-circle-o"></i> Layout</a></li> + <li><a href="#adminlte-options"><i class="fa fa-circle-o"></i> Javascript Options</a></li> + <li class="treeview" id="scrollspy-components"> + <a href="javascript::;"><i class="fa fa-circle-o"></i> Components</a> + <ul class="nav treeview-menu"> + <li><a href="#component-main-header">Main Header</a></li> + <li><a href="#component-sidebar">Sidebar</a></li> + <li><a href="#component-control-sidebar">Control Sidebar</a></li> + <li><a href="#component-info-box">Info Box</a></li> + <li><a href="#component-box">Boxes</a></li> + <li><a href="#component-direct-chat">Direct Chat</a></li> + </ul> + </li> + <li><a href="#plugins"><i class="fa fa-circle-o"></i> Plugins</a></li> + <li><a href="#browsers"><i class="fa fa-circle-o"></i> Browser Support</a></li> + <li><a href="#upgrade"><i class="fa fa-circle-o"></i> Upgrade Guide</a></li> + <li><a href="#implementations"><i class="fa fa-circle-o"></i> Implementations</a></li> + <li><a href="#faq"><i class="fa fa-circle-o"></i> FAQ</a></li> + <li><a href="#license"><i class="fa fa-circle-o"></i> License</a></li> + </ul> + </div> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <div class="content-header"> + <h1> + AdminLTE Documentation + <small>Current version 2.3.0</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li class="active">Documentation</li> + </ol> + </div> + + <!-- Main content --> + <div class="content body"> + +<section id="introduction"> + <h2 class="page-header"><a href="#introduction">Introduction</a></h2> + <p class="lead"> + <b>AdminLTE</b> is a popular open source WebApp template for admin dashboards and control panels. + It is a responsive HTML template that is based on the CSS framework Bootstrap 3. + It utilizes all of the Bootstrap components in its design and re-styles many + commonly used plugins to create a consistent design that can be used as a user + interface for backend applications. AdminLTE is based on a modular design, which + allows it to be easily customized and built upon. This documentation will guide you through + installing the template and exploring the various components that are bundled with the template. + </p> +</section><!-- /#introduction --> + + +<!-- ============================================================= --> + +<section id="download"> + <h2 class="page-header"><a href="#download">Download</a></h2> + <p class="lead"> + AdminLTE can be downloaded in two different versions, each appealing to different skill levels and use case. + </p> + <div class="row"> + <div class="col-sm-6"> + <div class="box box-primary"> + <div class="box-header with-border"> + <h3 class="box-title">Ready</h3> + <span class="label label-primary pull-right"><i class="fa fa-html5"></i></span> + </div><!-- /.box-header --> + <div class="box-body"> + <p>Compiled and ready to use in production. Download this version if you don't want to customize AdminLTE's LESS files.</p> + <a href="http://almsaeedstudio.com/download/AdminLTE-dist" class="btn btn-primary"><i class="fa fa-download"></i> Download</a> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + <div class="col-sm-6"> + <div class="box box-danger"> + <div class="box-header with-border"> + <h3 class="box-title">Source Code</h3> + <span class="label label-danger pull-right"><i class="fa fa-database"></i></span> + </div><!-- /.box-header --> + <div class="box-body"> + <p>All files including the compiled CSS. Download this version if you plan on customizing the template. <b>Requires a LESS compiler.</b></p> + <a href="http://almsaeedstudio.com/download/AdminLTE" class="btn btn-danger"><i class="fa fa-download"></i> Download</a> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + <pre class="hierarchy bring-up"><code class="language-bash" data-lang="bash">File Hierarchy of the Source Code Package + +AdminLTE/ +├── dist/ +│ ├── CSS/ +│ ├── JS +│ ├── img +├── build/ +│ ├── less/ +│ │ ├── AdminLTE's Less files +│ └── Bootstrap-less/ (Only for reference. No modifications have been made) +│ ├── mixins/ +│ ├── variables.less +│ ├── mixins.less +└── plugins/ + ├── All the customized plugins CSS and JS files</code></pre> +</section> + + +<!-- ============================================================= --> + +<section id="dependencies"> + <h2 class="page-header"><a href="#dependencies">Dependencies</a></h2> + <p class="lead">AdminLTE depends on two main frameworks. + The downloadable package contains both of these libraries, so you don't have to manually download them.</p> + <ul class="bring-up"> + <li><a href="http://getbootstrap.com" target="_blank">Bootstrap 3</a></li> + <li><a href="http://jquery.com/" target="_blank">jQuery 1.11+</a></li> + <li><a href="#plugins">All other plugins are listed below</a></li> + </ul> +</section> + +<!-- ============================================================= --> + +<section id="advice"> + <h2 class="page-header"><a href="#advice">A Word of Advice</a></h2> + <p class="lead"> + Before you go to see your new awesome theme, here are few tips on how to familiarize yourself with it: + </p> + + <ul> + <li><b>AdminLTE is based on <a href="http://getbootstrap.com/" target="_blank">Bootstrap 3</a>.</b> If you are unfamiliar with Bootstrap, visit their website and read through the documentation. All of Bootstrap components have been modified to fit the style of AdminLTE and provide a consistent look throughout the template. This way, we guarantee you will get the best of AdminLTE.</li> + <li><b>Go through the pages that are bundled with the theme.</b> Most of the template example pages contain quick tips on how to create or use a component which can be really helpful when you need to create something on the fly.</li> + <li><b>Documentation.</b> We are trying our best to make your experience with AdminLTE be smooth. One way to achieve that is to provide documentation and support. If you think that something is missing from the documentation, please do not hesitate to create an issue to tell us about it. Also, if you would like to contribute, email the support team at <a href="mailto:support@almsaeedstudio.com">support@almsaeedstudio.com</a>.</li> + <li><b>Built with <a href="http://lesscss.org/" target="_blank">LESS</a>.</b> This theme uses the LESS compiler to make it easier to customize and use. LESS is easy to learn if you know CSS or SASS. It is not necessary to learn LESS but it will benefit you a lot in the future.</li> + <li><b>Hosted on <a href="https://github.com/almasaeed2010/AdminLTE/" target="_blank">GitHub</a>.</b> Visit our GitHub repository to view issues, make requests, or contribute to the project.</li> + </ul> + <p> + <b>Note:</b> LESS files are better commented than the compiled CSS file. + </p> +</section> + + +<!-- ============================================================= --> + +<section id="layout"> + <h2 class="page-header"><a href="#layout">Layout</a></h2> + <p class="lead">The layout consists of four major parts:</p> + <ul> + <li>Wrapper <code>.wrapper</code>. A div that wraps the whole site.</li> + <li>Main Header <code>.main-header</code>. Contains the logo and navbar.</li> + <li>Sidebar <code>.sidebar-wrapper</code>. Contains the user panel and sidebar menu.</li> + <li>Content <code>.content-wrapper</code>. Contains the page header and content.</li> + </ul> + <div class="callout callout-danger lead"> + <h4>Tip!</h4> + <p>The <a href="../starter.html">starter page</a> is a good place to start building your app if you'd like to start from scratch.</p> + </div> + + <h3>Layout Options</h3> + <p class="lead">AdminLTE 2.0 provides a set of options to apply to your main layout. Each on of these classes can be added + to the body tag to get the desired goal.</p> + <ul> + <li><b>Fixed:</b> use the class <code>.fixed</code> to get a fixed header and sidebar.</li> + <li><b>Collapsed Sidebar:</b> use the class <code>.sidebar-collapse</code> to have a collapsed sidebar upon loading.</li> + <li><b>Boxed Layout:</b> use the class <code>.layout-boxed</code> to get a boxed layout that stretches only to 1250px.</li> + <li><b>Top Navigation</b> use the class <code>.layout-top-nav</code> to remove the sidebar and have your links at the top navbar.</li> + </ul> + <p><b>Note:</b> you cannot use both layout-boxed and fixed at the same time. Anything else can be mixed together.</p> + + <h3>Skins</h3> + <p class="lead">Skins can be found in the dist/css/skins folder. + Choose and the skin file that you want then add the appropriate + class to the body tag to change the template's appearance. Here is the list of available skins:</p> + <div class="box box-solid" style="max-width: 300px;"> + <div class="box-body no-padding"> + <table id="layout-skins-list" class="table table-striped bring-up nth-2-center"> + <thead> + <tr> + <th style="width: 210px;">Skin Class</th> + <th>Preview</th> + </tr> + </thead> + <tbody> + <tr> + <td><code>skin-blue</code></td> + <td><a href="#" data-skin="skin-blue" class="btn btn-primary btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + <tr> + <td><code>skin-blue-light</code></td> + <td><a href="#" data-skin="skin-blue-light" class="btn btn-primary btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + <tr> + <td><code>skin-yellow</code></td> + <td><a href="#" data-skin="skin-yellow" class="btn btn-warning btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + <tr> + <td><code>skin-yellow-light</code></td> + <td><a href="#" data-skin="skin-yellow-light" class="btn btn-warning btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + <tr> + <td><code>skin-green</code></td> + <td><a href="#" data-skin="skin-green" class="btn btn-success btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + <tr> + <td><code>skin-green-light</code></td> + <td><a href="#" data-skin="skin-green-light" class="btn btn-success btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + <tr> + <td><code>skin-purple</code></td> + <td><a href="#" data-skin="skin-purple" class="btn bg-purple btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + <tr> + <td><code>skin-purple-light</code></td> + <td><a href="#" data-skin="skin-purple-light" class="btn bg-purple btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + <tr> + <td><code>skin-red</code></td> + <td><a href="#" data-skin="skin-red" class="btn btn-danger btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + <tr> + <td><code>skin-red-light</code></td> + <td><a href="#" data-skin="skin-red-light" class="btn btn-danger btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + <tr> + <td><code>skin-black</code></td> + <td><a href="#" data-skin="skin-black" class="btn bg-black btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + <tr> + <td><code>skin-black-light</code></td> + <td><a href="#" data-skin="skin-black-light" class="btn bg-black btn-xs"><i class="fa fa-eye"></i></a></td> + </tr> + </tbody> + </table> + </div><!-- /.box-body --> + </div><!-- /.box --> +</section> + + +<!-- ============================================================= --> + +<section id="adminlte-options"> + <h2 class="page-header"><a href="#adminlte-options">AdminLTE Javascript Options</a></h2> + <p class="lead">Modifying the options of AdminLTE's app.js can be done using one of the following ways.</p> + + <h3>Editing app.js</h3> + <p>Within the main Javascript file, modify the <code>$.AdminLTE.options</code> object to suit your use case.</p> + + <h3>Defining AdminLTEOptions</h3> + <p>Alternatively, you can define a global options variable named <code>AdminLTEOptions</code> and initialize it before loading app.js.</p> + <p>Example</p> + <pre class="prettyprint"><code class="html">&LT;script> + var AdminLTEOptions = { + //Enable sidebar expand on hover effect for sidebar mini + //This option is forced to true if both the fixed layout and sidebar mini + //are used together + sidebarExpandOnHover: true, + //BoxRefresh Plugin + enableBoxRefresh: true, + //Bootstrap.js tooltip + enableBSToppltip: true + }; +&LT;/script> +&LT;script src="dist/js/app.js" type="text/javascript">&LT;/script></code></pre> + + <h3>Available AdminLTE Options</h3> + <pre class="prettyprint"><code class="javascript">{ + //Add slimscroll to navbar menus + //This requires you to load the slimscroll plugin + //in every page before app.js + navbarMenuSlimscroll: true, + navbarMenuSlimscrollWidth: "3px", //The width of the scroll bar + navbarMenuHeight: "200px", //The height of the inner menu + //General animation speed for JS animated elements such as box collapse/expand and + //sidebar treeview slide up/down. This options accepts an integer as milliseconds, + //'fast', 'normal', or 'slow' + animationSpeed: 500, + //Sidebar push menu toggle button selector + sidebarToggleSelector: "[data-toggle='offcanvas']", + //Activate sidebar push menu + sidebarPushMenu: true, + //Activate sidebar slimscroll if the fixed layout is set (requires SlimScroll Plugin) + sidebarSlimScroll: true, + //Enable sidebar expand on hover effect for sidebar mini + //This option is forced to true if both the fixed layout and sidebar mini + //are used together + sidebarExpandOnHover: false, + //BoxRefresh Plugin + enableBoxRefresh: true, + //Bootstrap.js tooltip + enableBSToppltip: true, + BSTooltipSelector: "[data-toggle='tooltip']", + //Enable Fast Click. Fastclick.js creates a more + //native touch experience with touch devices. If you + //choose to enable the plugin, make sure you load the script + //before AdminLTE's app.js + enableFastclick: true, + //Control Sidebar Options + enableControlSidebar: true, + controlSidebarOptions: { + //Which button should trigger the open/close event + toggleBtnSelector: "[data-toggle='control-sidebar']", + //The sidebar selector + selector: ".control-sidebar", + //Enable slide over content + slide: true + }, + //Box Widget Plugin. Enable this plugin + //to allow boxes to be collapsed and/or removed + enableBoxWidget: true, + //Box Widget plugin options + boxWidgetOptions: { + boxWidgetIcons: { + //Collapse icon + collapse: 'fa-minus', + //Open icon + open: 'fa-plus', + //Remove icon + remove: 'fa-times' + }, + boxWidgetSelectors: { + //Remove button selector + remove: '[data-widget="remove"]', + //Collapse button selector + collapse: '[data-widget="collapse"]' + } + }, + //Direct Chat plugin options + directChat: { + //Enable direct chat by default + enable: true, + //The button to open and close the chat contacts pane + contactToggleSelector: '[data-widget="chat-pane-toggle"]' + }, + //Define the set of colors to use globally around the website + colors: { + lightBlue: "#3c8dbc", + red: "#f56954", + green: "#00a65a", + aqua: "#00c0ef", + yellow: "#f39c12", + blue: "#0073b7", + navy: "#001F3F", + teal: "#39CCCC", + olive: "#3D9970", + lime: "#01FF70", + orange: "#FF851B", + fuchsia: "#F012BE", + purple: "#8E24AA", + maroon: "#D81B60", + black: "#222222", + gray: "#d2d6de" + }, + //The standard screen sizes that bootstrap uses. + //If you change these in the variables.less file, change + //them here too. + screenSizes: { + xs: 480, + sm: 768, + md: 992, + lg: 1200 + } +}</code></pre> +</section> + + +<!-- ============================================================= --> + +<section id="components" data-spy="scroll" data-target="#scrollspy-components"> + <h2 class="page-header"><a href="#components">Components</a></h2> + <div class="callout callout-info lead"> + <h4>Reminder!</h4> + <p> + AdminLTE uses all of Bootstrap 3 components. It's a good start to review + the <a href="http://getbootstrap.com">Bootstrap documentation</a> to get an idea of the various components + that this documentation <b>does not</b> cover. + </p> + </div> + <div class="callout callout-danger lead"> + <h4>Tip!</h4> + <p> + If you go through the example pages and would like to copy a component, right-click on + the component and choose "inspect element" to get to the HTML quicker than scanning + the HTML page. + </p> + </div> + <h3 id="component-main-header">Main Header</h3> + <p class="lead">The main header contains the logo and navbar. Construction of the + navbar differs slightly from Bootstrap because it has components that Bootstrap doesn't provide. + The navbar can be constructed in two way. This an example for the normal navbar and next we will provide an example for + the top nav layout.</p> + <div class="box box-solid"> + <div class="box-body" style="position: relative;"> + <span class="eg">Main Header Example</span> + <header class="main-header" style="position: relative;"> + <!-- Logo --> + <a href="index2.html" class="logo" style="position: relative;"><b>Admin</b>LTE</a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar" role="navigation" style="border: 0;max-height: 50px;"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" role="button"> + <span class="sr-only">Toggle navigation</span> + </a> + <!-- Navbar Right Menu --> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + </ul> + </div> + </nav> + </header> + </div> + </div> + <pre class="prettyprint">&LT;header class="main-header"> + &LT;a href="../../index2.html" class="logo"> + &LT;!-- LOGO --> + AdminLTE + &LT;/a> + &LT;!-- Header Navbar: style can be found in header.less --> + &LT;nav class="navbar navbar-static-top" role="navigation"> + &LT;!-- Navbar Right Menu --> + &LT;div class="navbar-custom-menu"> + &LT;ul class="nav navbar-nav"> + &LT;!-- Messages: style can be found in dropdown.less--> + &LT;li class="dropdown messages-menu"> + &LT;a href="#" class="dropdown-toggle" data-toggle="dropdown"> + &LT;i class="fa fa-envelope-o">&LT;/i> + &LT;span class="label label-success">4&LT;/span> + &LT;/a> + &LT;ul class="dropdown-menu"> + &LT;li class="header">You have 4 messages&LT;/li> + &LT;li> + &LT;!-- inner menu: contains the actual data --> + &LT;ul class="menu"> + &LT;li>&LT;!-- start message --> + &LT;a href="#"> + &LT;div class="pull-left"> + &LT;img src="dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + &LT;/div> + &LT;h4> + Sender Name + &LT;small>&LT;i class="fa fa-clock-o">&LT;/i> 5 mins&LT;/small> + &LT;/h4> + &LT;p>Message Excerpt&LT;/p> + &LT;/a> + &LT;/li>&LT;!-- end message --> + ... + &LT;/ul> + &LT;/li> + &LT;li class="footer">&LT;a href="#">See All Messages&LT;/a>&LT;/li> + &LT;/ul> + &LT;/li> + &LT;!-- Notifications: style can be found in dropdown.less --> + &LT;li class="dropdown notifications-menu"> + &LT;a href="#" class="dropdown-toggle" data-toggle="dropdown"> + &LT;i class="fa fa-bell-o">&LT;/i> + &LT;span class="label label-warning">10&LT;/span> + &LT;/a> + &LT;ul class="dropdown-menu"> + &LT;li class="header">You have 10 notifications&LT;/li> + &LT;li> + &LT;!-- inner menu: contains the actual data --> + &LT;ul class="menu"> + &LT;li> + &LT;a href="#"> + &LT;i class="ion ion-ios-people info">&LT;/i> Notification title + &LT;/a> + &LT;/li> + ... + &LT;/ul> + &LT;/li> + &LT;li class="footer">&LT;a href="#">View all&LT;/a>&LT;/li> + &LT;/ul> + &LT;/li> + &LT;!-- Tasks: style can be found in dropdown.less --> + &LT;li class="dropdown tasks-menu"> + &LT;a href="#" class="dropdown-toggle" data-toggle="dropdown"> + &LT;i class="fa fa-flag-o">&LT;/i> + &LT;span class="label label-danger">9&LT;/span> + &LT;/a> + &LT;ul class="dropdown-menu"> + &LT;li class="header">You have 9 tasks&LT;/li> + &LT;li> + &LT;!-- inner menu: contains the actual data --> + &LT;ul class="menu"> + &LT;li>&LT;!-- Task item --> + &LT;a href="#"> + &LT;h3> + Design some buttons + &LT;small class="pull-right">20%&LT;/small> + &LT;/h3> + &LT;div class="progress xs"> + &LT;div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + &LT;span class="sr-only">20% Complete&LT;/span> + &LT;/div> + &LT;/div> + &LT;/a> + &LT;/li>&LT;!-- end task item --> + ... + &LT;/ul> + &LT;/li> + &LT;li class="footer"> + &LT;a href="#">View all tasks&LT;/a> + &LT;/li> + &LT;/ul> + &LT;/li> + &LT;!-- User Account: style can be found in dropdown.less --> + &LT;li class="dropdown user user-menu"> + &LT;a href="#" class="dropdown-toggle" data-toggle="dropdown"> + &LT;img src="dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + &LT;span class="hidden-xs">Alexander Pierce&LT;/span> + &LT;/a> + &LT;ul class="dropdown-menu"> + &LT;!-- User image --> + &LT;li class="user-header"> + &LT;img src="dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + &LT;p> + Alexander Pierce - Web Developer + &LT;small>Member since Nov. 2012&LT;/small> + &LT;/p> + &LT;/li> + &LT;!-- Menu Body --> + &LT;li class="user-body"> + &LT;div class="col-xs-4 text-center"> + &LT;a href="#">Followers&LT;/a> + &LT;/div> + &LT;div class="col-xs-4 text-center"> + &LT;a href="#">Sales&LT;/a> + &LT;/div> + &LT;div class="col-xs-4 text-center"> + &LT;a href="#">Friends&LT;/a> + &LT;/div> + &LT;/li> + &LT;!-- Menu Footer--> + &LT;li class="user-footer"> + &LT;div class="pull-left"> + &LT;a href="#" class="btn btn-default btn-flat">Profile&LT;/a> + &LT;/div> + &LT;div class="pull-right"> + &LT;a href="#" class="btn btn-default btn-flat">Sign out&LT;/a> + &LT;/div> + &LT;/li> + &LT;/ul> + &LT;/li> + &LT;/ul> + &LT;/div> + &LT;/nav> +&LT;/header></pre> + <h4>Top Nav Layout. Main Header Example.</h4> + <div class="callout callout-info lead"> + <h4>Reminder!</h4> + <p>To use this main header instead of the regular one, you must add the <code>layout-top-nav</code> class to the body tag.</p> + </div> + <div class="box box-solid"> + <div class="box-body layout-top-nav"> + <span class="eg">Top Nav Example</span> + <header class="main-header"> + <nav class="navbar navbar-static-top"> + <div class="container-fluid"> + <div class="navbar-header"> + <a href="../../index2.html" class="navbar-brand"><b>Admin</b>LTE</a> + <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-collapse"> + <i class="fa fa-bars"></i> + </button> + </div> + + <!-- Collect the nav links, forms, and other content for toggling --> + <div class="collapse navbar-collapse" id="navbar-collapse"> + <ul class="nav navbar-nav"> + <li class="active"><a href="#">Link <span class="sr-only">(current)</span></a></li> + <li><a href="#">Link</a></li> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <span class="caret"></span></a> + <ul class="dropdown-menu" role="menu"> + <li><a href="#">Action</a></li> + <li><a href="#">Another action</a></li> + <li><a href="#">Something else here</a></li> + <li class="divider"></li> + <li><a href="#">Separated link</a></li> + <li class="divider"></li> + <li><a href="#">One more separated link</a></li> + </ul> + </li> + </ul> + <form class="navbar-form navbar-left" role="search"> + <div class="form-group"> + <input type="text" class="form-control" id="navbar-search-input" placeholder="Search"> + </div> + </form> + <ul class="nav navbar-nav navbar-right"> + <li><a href="#">Link</a></li> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <span class="caret"></span></a> + <ul class="dropdown-menu" role="menu"> + <li><a href="#">Action</a></li> + <li><a href="#">Another action</a></li> + <li><a href="#">Something else here</a></li> + <li class="divider"></li> + <li><a href="#">Separated link</a></li> + </ul> + </li> + </ul> + </div><!-- /.navbar-collapse --> + </div><!-- /.container-fluid --> + </nav> + </header> + </div> + </div> + <pre class="prettyprint"> +&LT;header class="main-header"> + &LT;nav class="navbar navbar-static-top"> + &LT;div class="container-fluid"> + &LT;div class="navbar-header"> + &LT;a href="../../index2.html" class="navbar-brand">&LT;b>Admin&LT;/b>LTE&LT;/a> + &LT;button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-collapse"> + &LT;i class="fa fa-bars">&LT;/i> + &LT;/button> + &LT;/div> + + &LT;!-- Collect the nav links, forms, and other content for toggling --> + &LT;div class="collapse navbar-collapse" id="navbar-collapse"> + &LT;ul class="nav navbar-nav"> + &LT;li class="active">&LT;a href="#">Link &LT;span class="sr-only">(current)&LT;/span>&LT;/a>&LT;/li> + &LT;li>&LT;a href="#">Link&LT;/a>&LT;/li> + &LT;li class="dropdown"> + &LT;a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown &LT;span class="caret">&LT;/span>&LT;/a> + &LT;ul class="dropdown-menu" role="menu"> + &LT;li>&LT;a href="#">Action&LT;/a>&LT;/li> + &LT;li>&LT;a href="#">Another action&LT;/a>&LT;/li> + &LT;li>&LT;a href="#">Something else here&LT;/a>&LT;/li> + &LT;li class="divider">&LT;/li> + &LT;li>&LT;a href="#">Separated link&LT;/a>&LT;/li> + &LT;li class="divider">&LT;/li> + &LT;li>&LT;a href="#">One more separated link&LT;/a>&LT;/li> + &LT;/ul> + &LT;/li> + &LT;/ul> + &LT;form class="navbar-form navbar-left" role="search"> + &LT;div class="form-group"> + &LT;input type="text" class="form-control" id="navbar-search-input" placeholder="Search"> + &LT;/div> + &LT;/form> + &LT;ul class="nav navbar-nav navbar-right"> + &LT;li>&LT;a href="#">Link&LT;/a>&LT;/li> + &LT;li class="dropdown"> + &LT;a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown &LT;span class="caret">&LT;/span>&LT;/a> + &LT;ul class="dropdown-menu" role="menu"> + &LT;li>&LT;a href="#">Action&LT;/a>&LT;/li> + &LT;li>&LT;a href="#">Another action&LT;/a>&LT;/li> + &LT;li>&LT;a href="#">Something else here&LT;/a>&LT;/li> + &LT;li class="divider">&LT;/li> + &LT;li>&LT;a href="#">Separated link&LT;/a>&LT;/li> + &LT;/ul> + &LT;/li> + &LT;/ul> + &LT;/div>&LT;!-- /.navbar-collapse --> + &LT;/div>&LT;!-- /.container-fluid --> + &LT;/nav> +&LT;/header></pre> + + <!-- ===================================================================== --> + + <h3 id="component-sidebar">Sidebar</h3> + <p class="lead"> + The sidebar used in this page to the left provides an example of what your sidebar should like. + Construction of a sidebar: + </p> + <pre class="prettyprint"> +&LT;div class="main-sidebar"> + &LT;!-- Inner sidebar --> + &LT;div class="sidebar"> + &LT;!-- user panel (Optional) --> + &LT;div class="user-panel"> + &LT;div class="pull-left image"> + &LT;img src="dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + &LT;/div> + &LT;div class="pull-left info"> + &LT;p>User Name&LT;/p> + + &LT;a href="#">&LT;i class="fa fa-circle text-success">&LT;/i> Online&LT;/a> + &LT;/div> + &LT;/div>&LT;!-- /.user-panel --> + + &LT;!-- Search Form (Optional) --> + &LT;form action="#" method="get" class="sidebar-form"> + &LT;div class="input-group"> + &LT;input type="text" name="q" class="form-control" placeholder="Search..."> + &LT;span class="input-group-btn"> + &LT;button type="submit" name="search" id="search-btn" class="btn btn-flat">&LT;i class="fa fa-search">&LT;/i>&LT;/button> + &LT;/span> + &LT;/div> + &LT;/form>&LT;!-- /.sidebar-form --> + + &LT;!-- Sidebar Menu --> + &LT;ul class="sidebar-menu"> + &LT;li class="header">HEADER&LT;/li> + &LT;!-- Optionally, you can add icons to the links --> + &LT;li class="active">&LT;a href="#">&LT;span>Link&LT;/span>&LT;/a>&LT;&LT;/li> + &LT;li>&LT;a href="#">&LT;span>Another Link&LT;/span>&LT;/a>&LT;/li> + &LT;li class="treeview"> + &LT;a href="#">&LT;span>Multilevel&LT;/span> &LT;i class="fa fa-angle-left pull-right">&LT;/i>&LT;/a> + &LT;ul class="treeview-menu"> + &LT;li>&LT;a href="#">Link in level 2&LT;/a>&LT;/li> + &LT;li>&LT;a href="#">Link in level 2&LT;/a>&LT;/li> + &LT;/ul> + &LT;/li> + &LT;/ul>&LT;!-- /.sidebar-menu --> + + &LT;/div>&LT;!-- /.sidebar --> +&LT;/div>&LT;!-- /.main-sidebar --></pre> + + <h3 id="component-control-sidebar">Control Sidebar</h3> + <p class="lead">Control sidebar is the right side bar. It can be used for many purposes and is extremely easy + to create. The sidebar ships with two different show/hide styles. The first allows the sidebar to + slide over the content. The second pushes the content to make space for the sidebar. Either of + these methods can be set through the <a href="#adminlte-options">Javascript options</a>.</p> + <p class="lead">The following code should be placed within the <code>.wrapper</code> div. I prefer + to place it right after the footer.</p> + <p class="lead">Dark Sidebar Markup</p> +<pre class="prettyprint"><code class="lang-html">&LT;!-- The Right Sidebar --> +&LT;aside class="control-sidebar control-sidebar-dark"> + &LT;!-- Content of the sidebar goes here --> +&LT;/aside> +&LT;!-- The sidebar's background --> +&LT;!-- This div must placed right after the sidebar for it to work--> +&LT;div class="control-sidebar-bg">&LT;/div></code></pre> + + <p class="lead">Light Sidebar Markup</p> +<pre class="prettyprint"><code class="lang-html">&LT;!-- The Right Sidebar --> +&LT;aside class="control-sidebar control-sidebar-light"> + &LT;!-- Content of the sidebar goes here --> +&LT;/aside> +&LT;!-- The sidebar's background --> +&LT;!-- This div must placed right after the sidebar for it to work--> +&LT;div class="control-sidebar-bg">&LT;/div></code></pre> + + <p class="lead">Once you create the sidebar, you will need a toggle button to open/close it. + By adding the attribute <code>data-toggle="control-sidebar"</code> to any button, it will + automatically act as the toggle button.</p> + + <p class="lead">Toggle Button Example</p> + <button class="btn btn-primary" data-toggle="control-sidebar">Toggle Right Sidebar</button><br><br> + + <p class="lead">Sidebar Toggle Markup</p> + <pre class="prettyprint"><code class="lang-html">&LT;button class="btn btn-default" data-toggle="control-sidebar">Toggle Right Sidebar&LT;/button></code></pre> + <!-- ===================================================================== --> + + <h3 id="component-info-box">Info Box</h3> + <p class="lead">Info boxes are used to display statistical snippets. There are two types of info boxes.</p> + <h4>First Type of Info Boxes</h4> + <!-- Info Boxes --> + <div class="row"> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box"> + <span class="info-box-icon bg-aqua"><i class="fa fa-envelope-o"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Messages</span> + <span class="info-box-number">1,410</span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box"> + <span class="info-box-icon bg-green"><i class="fa fa-flag-o"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Bookmarks</span> + <span class="info-box-number">410</span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box"> + <span class="info-box-icon bg-yellow"><i class="fa fa-files-o"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Uploads</span> + <span class="info-box-number">13,648</span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box"> + <span class="info-box-icon bg-red"><i class="fa fa-star-o"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Likes</span> + <span class="info-box-number">93,139</span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + </div><!-- /.row --> + <p class="lead">Markup</p> + <pre class="prettyprint"><code class="lang-html">&LT;div class="info-box"> + &LT;!-- Apply any bg-* class to to the icon to color it --> + &LT;span class="info-box-icon bg-red">&LT;i class="fa fa-star-o">&LT;/i>&LT;/span> + &LT;div class="info-box-content"> + &LT;span class="info-box-text">Likes&LT;/span> + &LT;span class="info-box-number">93,139&LT;/span> + &LT;/div>&LT;!-- /.info-box-content --> +&LT;/div>&LT;!-- /.info-box --></code></pre> + + <h4>Second Type of Info Boxes</h4> + <div class="row"> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box bg-aqua"> + <span class="info-box-icon"><i class="fa fa-bookmark-o"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Bookmarks</span> + <span class="info-box-number">41,410</span> + <div class="progress"> + <div class="progress-bar" style="width: 70%"></div> + </div> + <span class="progress-description"> + 70% Increase in 30 Days + </span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box bg-green"> + <span class="info-box-icon"><i class="fa fa-thumbs-o-up"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Likes</span> + <span class="info-box-number">41,410</span> + <div class="progress"> + <div class="progress-bar" style="width: 70%"></div> + </div> + <span class="progress-description"> + 70% Increase in 30 Days + </span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box bg-yellow"> + <span class="info-box-icon"><i class="fa fa-calendar"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Events</span> + <span class="info-box-number">41,410</span> + <div class="progress"> + <div class="progress-bar" style="width: 70%"></div> + </div> + <span class="progress-description"> + 70% Increase in 30 Days + </span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box bg-red"> + <span class="info-box-icon"><i class="fa fa-comments-o"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Comments</span> + <span class="info-box-number">41,410</span> + <div class="progress"> + <div class="progress-bar" style="width: 70%"></div> + </div> + <span class="progress-description"> + 70% Increase in 30 Days + </span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + </div><!-- /.row --> + <p class="lead">Markup</p> + <pre class="prettyprint"><code class="lang-html">&LT;!-- Apply any bg-* class to to the info-box to color it --> +&LT;div class="info-box bg-red"> + &LT;span class="info-box-icon">&LT;i class="fa fa-comments-o">&LT;/i>&LT;/span> + &LT;div class="info-box-content"> + &LT;span class="info-box-text">Likes&LT;/span> + &LT;span class="info-box-number">41,410&LT;/span> + &LT;!-- The progress section is optional --> + &LT;div class="progress"> + &LT;div class="progress-bar" style="width: 70%">&LT;/div> + &LT;/div> + &LT;span class="progress-description"> + 70% Increase in 30 Days + &LT;/span> + &LT;/div>&LT;!-- /.info-box-content --> +&LT;/div>&LT;!-- /.info-box --></code></pre> + <p class="lead">The only thing you need to change to alternate between these style is change the placement of the bg-* class. For the + first style apply any bg-* class to the icon itself. For the other style, apply the bg-* class to the info-box div.</p> + <!-- ===================================================================== --> + + <h3 id="component-box">Box</h3> + <p class="lead">The box component is the most widely used component through out this template. You can + use it for anything from displaying charts to just blocks of text. It comes in many different + styles that we will explore below.</p> + <h4>Default Box Markup</h4> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title">Default Box Example</h3> + <div class="box-tools pull-right"> + <!-- Buttons, labels, and many other things can be placed here! --> + <!-- Here is a label for example --> + <span class="label label-primary">Label</span> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + <div class="box-footer"> + The footer of the box + </div><!-- box-footer --> + </div><!-- /.box --> + <pre class="prettyprint">&LT;div class="box"> + &LT;div class="box-header with-border"> + &LT;h3 class="box-title">Default Box Example&LT;/h3> + &LT;div class="box-tools pull-right"> + &LT;!-- Buttons, labels, and many other things can be placed here! --> + &LT;!-- Here is a label for example --> + &LT;span class="label label-primary">Label&LT;/span> + &LT;/div>&LT;!-- /.box-tools --> + &LT;/div>&LT;!-- /.box-header --> + &LT;div class="box-body"> + The body of the box + &LT;/div>&LT;!-- /.box-body --> + &LT;div class="box-footer"> + The footer of the box + &LT;/div>&LT;!-- box-footer --> +&LT;/div>&LT;!-- /.box --></pre> + <h4>Box Variants</h4> + <p class="lead">You can change the style of the box by adding any of the contextual classes.</p> + <div class="row"> + <div class="col-md-4"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title">Default Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + <div class="col-md-4"> + <div class="box box-primary"> + <div class="box-header with-border"> + <h3 class="box-title">Primary Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + <div class="col-md-4"> + <div class="box box-info"> + <div class="box-header with-border"> + <h3 class="box-title">Info Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + <div class="clearfix"></div> + <div class="col-md-4"> + <div class="box box-warning"> + <div class="box-header with-border"> + <h3 class="box-title">Warning Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + <div class="col-md-4"> + <div class="box box-success"> + <div class="box-header with-border"> + <h3 class="box-title">Success Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + <div class="col-md-4"> + <div class="box box-danger"> + <div class="box-header with-border"> + <h3 class="box-title">Danger Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + </div><!-- /.row --> + <pre class="prettyprint">&LT;div class="box box-default">...&LT;/div> +&LT;div class="box box-primary">...&LT;/div> +&LT;div class="box box-info">...&LT;/div> +&LT;div class="box box-warning">...&LT;/div> +&LT;div class="box box-success">...&LT;/div> +&LT;div class="box box-danger">...&LT;/div></pre> + + <h4>Solid Box</h4> + <p class="lead">Solid Boxes are alternative ways to display boxes. + They can be created by simply adding the box-solid class to the box component. + You may also use contextual classes with you solid boxes.</p> + <div class="row"> + <div class="col-md-4"> + <div class="box box-solid box-default"> + <div class="box-header"> + <h3 class="box-title">Default Solid Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + <div class="col-md-4"> + <div class="box box-solid box-primary"> + <div class="box-header"> + <h3 class="box-title">Primary Solid Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + <div class="col-md-4"> + <div class="box box-solid box-info"> + <div class="box-header"> + <h3 class="box-title">Info Solid Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + <div class="clearfix"></div> + <div class="col-md-4"> + <div class="box box-solid box-warning"> + <div class="box-header"> + <h3 class="box-title">Warning Solid Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + <div class="col-md-4"> + <div class="box box-solid box-success"> + <div class="box-header"> + <h3 class="box-title">Success Solid Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + <div class="col-md-4"> + <div class="box box-solid box-danger"> + <div class="box-header"> + <h3 class="box-title">Danger Solid Box Example</h3> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + </div><!-- /.row --> + <pre class="prettyprint"> +&LT;div class="box box-solid box-default">...&LT;/div> +&LT;div class="box box-solid box-primary">...&LT;/div> +&LT;div class="box box-solid box-info">...&LT;/div> +&LT;div class="box box-solid box-warning">...&LT;/div> +&LT;div class="box box-solid box-success">...&LT;/div> +&LT;div class="box box-solid box-danger">...&LT;/div></pre> + <h4>Box Tools</h4> + <p class="lead">Boxes can contain tools to deploy a specific event or provide simple info. The following examples makes use + of multiple AdminLTE components within the header of the box.</p> + <p>AdminLTE data-widget attribute provides boxes with the ability to collapse or be removed. The buttons + are placed in the box-tools which is placed in the box-header.</p> + <pre class="prettyprint"> +&LT;!-- This will cause the box to be removed when clicked --> +&LT;button class="btn btn-box-tool" data-widget="remove" data-toggle="tooltip" title="Remove">&LT;i class="fa fa-times">&LT;/i>&LT;/button> +&LT;!-- This will cause the box to collapse when clicked --> +&LT;button class="btn btn-box-tool" data-widget="collapse" data-toggle="tooltip" title="Collapse">&LT;i class="fa fa-minus">&LT;/i>&LT;/button></pre> + <div class="row"> + <div class="col-md-4"> + <div class="box box-default"> + <div class="box-header with-border"> + <h3 class="box-title">Collapsable</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + <pre class="prettyprint"> +&LT;div class="box box-default"> + &LT;div class="box-header with-border"> + &LT;h3 class="box-title">Collapsable&LT;/h3> + &LT;div class="box-tools pull-right"> + &LT;button class="btn btn-box-tool" data-widget="collapse">&LT;i class="fa fa-minus">&LT;/i>&LT;/button> + &LT;/div>&LT;!-- /.box-tools --> + &LT;/div>&LT;!-- /.box-header --> + &LT;div class="box-body"> + The body of the box + &LT;/div>&LT;!-- /.box-body --> +&LT;/div>&LT;!-- /.box --></pre> + </div> + <div class="col-md-4"> + <div class="box box-default"> + <div class="box-header with-border"> + <h3 class="box-title">Removable</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + <pre class="prettyprint"> +&LT;div class="box box-default"> + &LT;div class="box-header with-border"> + &LT;h3 class="box-title">Removable&LT;/h3> + &LT;div class="box-tools pull-right"> + &LT;button class="btn btn-box-tool" data-widget="remove">&LT;i class="fa fa-times">&LT;/i>&LT;/button> + &LT;/div>&LT;!-- /.box-tools --> + &LT;/div>&LT;!-- /.box-header --> + &LT;div class="box-body"> + The body of the box + &LT;/div>&LT;!-- /.box-body --> +&LT;/div>&LT;!-- /.box --></pre> + </div> + <div class="col-md-4"> + <div class="box box-default collapsed-box"> + <div class="box-header with-border"> + <h3 class="box-title">Expandable</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-plus"></i></button> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + <pre class="prettyprint"> +&LT;div class="box box-default collapsed-box"> + &LT;div class="box-header with-border"> + &LT;h3 class="box-title">Expandable&LT;/h3> + &LT;div class="box-tools pull-right"> + &LT;button class="btn btn-box-tool" data-widget="collapse">&LT;i class="fa fa-plus">&LT;/i>&LT;/button> + &LT;/div>&LT;!-- /.box-tools --> + &LT;/div>&LT;!-- /.box-header --> + &LT;div class="box-body"> + The body of the box + &LT;/div>&LT;!-- /.box-body --> +&LT;/div>&LT;!-- /.box --></pre> + </div> + </div><!-- /.row --> + <p>We can also add labels, badges, pagination, tooltips, inputs and many more in the box tools. A few examples:</p> + <div class="row"> + <div class="col-md-4"> + <div class="box box-default"> + <div class="box-header with-border"> + <h3 class="box-title">Labels</h3> + <div class="box-tools pull-right"> + <span class="label label-default">Some Label</span> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + <pre class="prettyprint"> +&LT;div class="box box-default"> + &LT;div class="box-header with-border"> + &LT;h3 class="box-title">Labels&LT;/h3> + &LT;div class="box-tools pull-right"> + &LT;span class="label label-default">8 New Messages&LT;/span> + &LT;/div>&LT;!-- /.box-tools --> + &LT;/div>&LT;!-- /.box-header --> + &LT;div class="box-body"> + The body of the box + &LT;/div>&LT;!-- /.box-body --> +&LT;/div>&LT;!-- /.box --></pre> + </div> + <div class="col-md-4"> + <div class="box box-default"> + <div class="box-header with-border"> + <h3 class="box-title">Input</h3> + <div class="box-tools pull-right"> + <div class="has-feedback"> + <input type="text" class="form-control input-sm" placeholder="Search..."> + <span class="glyphicon glyphicon-search form-control-feedback text-muted"></span> + </div> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + <pre class="prettyprint"> +&LT;div class="box box-default"> + &LT;div class="box-header with-border"> + &LT;h3 class="box-title">Input&LT;/h3> + &LT;div class="box-tools pull-right"> + &LT;div class="has-feedback"> + &LT;input type="text" class="form-control input-sm" placeholder="Search..."> + &LT;span class="glyphicon glyphicon-search form-control-feedback">&LT;/span> + &LT;/div> + &LT;/div>&LT;!-- /.box-tools --> + &LT;/div>&LT;!-- /.box-header --> + &LT;div class="box-body"> + The body of the box + &LT;/div>&LT;!-- /.box-body --> +&LT;/div>&LT;!-- /.box --></pre> + </div> + <div class="col-md-4"> + <div class="box box-default"> + <div class="box-header with-border"> + <h3 class="box-title">Tootips on buttons</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse" data-toggle="tooltip" title="Collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove" data-toggle="tooltip" title="Remove"><i class="fa fa-times"></i></button> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + <pre class="prettyprint"> +&LT;div class="box box-default"> + &LT;div class="box-header with-border"> + &LT;h3 class="box-title">Tooltips on buttons&LT;/h3> + &LT;div class="box-tools pull-right"> + &LT;button class="btn btn-box-tool" data-widget="collapse" data-toggle="tooltip" title="Collapse">&LT;i class="fa fa-minus">&LT;/i>&LT;/button> + &LT;button class="btn btn-box-tool" data-widget="remove" data-toggle="tooltip" title="Remove">&LT;i class="fa fa-times">&LT;/i>&LT;/button> + &LT;/div>&LT;!-- /.box-tools --> + &LT;/div>&LT;!-- /.box-header --> + &LT;div class="box-body"> + The body of the box + &LT;/div>&LT;!-- /.box-body --> +&LT;/div>&LT;!-- /.box --></pre> + </div><!-- /.col --> + </div><!-- /.row --> + <p> + If you inserted a box into the document after <code>app.js</code> was loaded, you have to activate + the collapse/remove buttons explicitly by calling <code>.activateBox()</code>: + </p> + <pre class="prettyprint"><code class="html">&LT;script> + $("#box-widget").activateBox(); +&LT;/script></code></pre> + + <h4>Loading States</h4> + <div class="row"> + <div class="col-md-6"> + <div class="box box-default"> + <div class="box-header with-border"> + <h3 class="box-title">Loading state</h3> + </div> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + <!-- Loading (remove the following to stop the loading)--> + <div class="overlay"> + <i class="fa fa-refresh fa-spin"></i> + </div> + <!-- end loading --> + </div><!-- /.box --> + </div><!-- /.col --> + + <div class="col-md-6"> + <div class="box box-default box-solid"> + <div class="box-header with-border"> + <h3 class="box-title">Loading state (.box-solid)</h3> + </div> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + <!-- Loading (remove the following to stop the loading)--> + <div class="overlay"> + <i class="fa fa-refresh fa-spin"></i> + </div> + <!-- end loading --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + <p class="lead"> + To simulate a loading state, simply place this code before the <code>.box</code> closing tag. + </p> + <pre class="prettyprint"><code class="html">&LT;div class="overlay"> + &LT;i class="fa fa-refresh fa-spin">&LT;/i> +&LT;/div> +</code></pre> + <h3 id="component-direct-chat">Direct Chat</h3> + <p class="lead">The direct chat widget extends the box component to create a beautiful chat interface. This widget + consists of a required messages pane and an <b>optional</b> contacts pane. Examples:</p> + <!-- Direct Chat --> + <div class="row"> + <div class="col-md-3"> + <!-- DIRECT CHAT PRIMARY --> + <div class="box box-primary direct-chat direct-chat-primary"> + <div class="box-header with-border"> + <h3 class="box-title">Direct Chat</h3> + <div class="box-tools pull-right"> + <span data-toggle="tooltip" title="3 New Messages" class="badge bg-light-blue">3</span> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-toggle="tooltip" title="Contacts" data-widget="chat-pane-toggle"><i class="fa fa-comments"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <!-- Conversations are loaded here --> + <div class="direct-chat-messages"> + <!-- Message. Default to the left --> + <div class="direct-chat-msg"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-left">Alexander Pierce</span> + <span class="direct-chat-timestamp pull-right">23 Jan 2:00 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user1-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + Is this template really for free? That's unbelievable! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + + <!-- Message to the right --> + <div class="direct-chat-msg right"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-right">Sarah Bullock</span> + <span class="direct-chat-timestamp pull-left">23 Jan 2:05 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user3-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + You better believe it! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + </div><!--/.direct-chat-messages--> + + <!-- Contacts are loaded here --> + <div class="direct-chat-contacts"> + <ul class="contacts-list"> + <li> + <a href="#"> + <img class="contacts-list-img" src="../dist/img/user1-128x128.jpg" alt="Contact Avatar"> + <div class="contacts-list-info"> + <span class="contacts-list-name"> + Count Dracula + <small class="contacts-list-date pull-right">2/28/2015</small> + </span> + <span class="contacts-list-msg">How have you been? I was...</span> + </div><!-- /.contacts-list-info --> + </a> + </li><!-- End Contact Item --> + </ul><!-- /.contatcts-list --> + </div><!-- /.direct-chat-pane --> + </div><!-- /.box-body --> + <div class="box-footer"> + <form action="#" method="post"> + <div class="input-group"> + <input type="text" name="message" placeholder="Type Message ..." class="form-control"> + <span class="input-group-btn"> + <button type="button" class="btn btn-primary btn-flat">Send</button> + </span> + </div> + </form> + </div><!-- /.box-footer--> + </div><!--/.direct-chat --> + </div><!-- /.col --> + + <div class="col-md-3"> + <!-- DIRECT CHAT SUCCESS --> + <div class="box box-success direct-chat direct-chat-success"> + <div class="box-header with-border"> + <h3 class="box-title">Direct Chat</h3> + <div class="box-tools pull-right"> + <span data-toggle="tooltip" title="3 New Messages" class="badge bg-green">3</span> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-toggle="tooltip" title="Contacts" data-widget="chat-pane-toggle"><i class="fa fa-comments"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <!-- Conversations are loaded here --> + <div class="direct-chat-messages"> + <!-- Message. Default to the left --> + <div class="direct-chat-msg"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-left">Alexander Pierce</span> + <span class="direct-chat-timestamp pull-right">23 Jan 2:00 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user1-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + Is this template really for free? That's unbelievable! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + + <!-- Message to the right --> + <div class="direct-chat-msg right"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-right">Sarah Bullock</span> + <span class="direct-chat-timestamp pull-left">23 Jan 2:05 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user3-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + You better believe it! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + </div><!--/.direct-chat-messages--> + + <!-- Contacts are loaded here --> + <div class="direct-chat-contacts"> + <ul class="contacts-list"> + <li> + <a href="#"> + <img class="contacts-list-img" src="../dist/img/user1-128x128.jpg" alt="Contact Avatar"> + <div class="contacts-list-info"> + <span class="contacts-list-name"> + Count Dracula + <small class="contacts-list-date pull-right">2/28/2015</small> + </span> + <span class="contacts-list-msg">How have you been? I was...</span> + </div><!-- /.contacts-list-info --> + </a> + </li><!-- End Contact Item --> + </ul><!-- /.contatcts-list --> + </div><!-- /.direct-chat-pane --> + </div><!-- /.box-body --> + <div class="box-footer"> + <form action="#" method="post"> + <div class="input-group"> + <input type="text" name="message" placeholder="Type Message ..." class="form-control"> + <span class="input-group-btn"> + <button type="button" class="btn btn-success btn-flat">Send</button> + </span> + </div> + </form> + </div><!-- /.box-footer--> + </div><!--/.direct-chat --> + </div><!-- /.col --> + + <div class="col-md-3"> + <!-- DIRECT CHAT WARNING --> + <div class="box box-warning direct-chat direct-chat-warning"> + <div class="box-header with-border"> + <h3 class="box-title">Direct Chat</h3> + <div class="box-tools pull-right"> + <span data-toggle="tooltip" title="3 New Messages" class="badge bg-yellow">3</span> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-toggle="tooltip" title="Contacts" data-widget="chat-pane-toggle"><i class="fa fa-comments"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <!-- Conversations are loaded here --> + <div class="direct-chat-messages"> + <!-- Message. Default to the left --> + <div class="direct-chat-msg"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-left">Alexander Pierce</span> + <span class="direct-chat-timestamp pull-right">23 Jan 2:00 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user1-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + Is this template really for free? That's unbelievable! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + + <!-- Message to the right --> + <div class="direct-chat-msg right"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-right">Sarah Bullock</span> + <span class="direct-chat-timestamp pull-left">23 Jan 2:05 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user3-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + You better believe it! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + </div><!--/.direct-chat-messages--> + + <!-- Contacts are loaded here --> + <div class="direct-chat-contacts"> + <ul class="contacts-list"> + <li> + <a href="#"> + <img class="contacts-list-img" src="../dist/img/user1-128x128.jpg" alt="Contact Avatar"> + <div class="contacts-list-info"> + <span class="contacts-list-name"> + Count Dracula + <small class="contacts-list-date pull-right">2/28/2015</small> + </span> + <span class="contacts-list-msg">How have you been? I was...</span> + </div><!-- /.contacts-list-info --> + </a> + </li><!-- End Contact Item --> + </ul><!-- /.contatcts-list --> + </div><!-- /.direct-chat-pane --> + </div><!-- /.box-body --> + <div class="box-footer"> + <form action="#" method="post"> + <div class="input-group"> + <input type="text" name="message" placeholder="Type Message ..." class="form-control"> + <span class="input-group-btn"> + <button type="button" class="btn btn-warning btn-flat">Send</button> + </span> + </div> + </form> + </div><!-- /.box-footer--> + </div><!--/.direct-chat --> + </div><!-- /.col --> + + <div class="col-md-3"> + <!-- DIRECT CHAT DANGER --> + <div class="box box-danger direct-chat direct-chat-danger"> + <div class="box-header with-border"> + <h3 class="box-title">Direct Chat</h3> + <div class="box-tools pull-right"> + <span data-toggle="tooltip" title="3 New Messages" class="badge bg-red">3</span> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-toggle="tooltip" title="Contacts" data-widget="chat-pane-toggle"><i class="fa fa-comments"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <!-- Conversations are loaded here --> + <div class="direct-chat-messages"> + <!-- Message. Default to the left --> + <div class="direct-chat-msg"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-left">Alexander Pierce</span> + <span class="direct-chat-timestamp pull-right">23 Jan 2:00 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user1-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + Is this template really for free? That's unbelievable! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + + <!-- Message to the right --> + <div class="direct-chat-msg right"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-right">Sarah Bullock</span> + <span class="direct-chat-timestamp pull-left">23 Jan 2:05 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user3-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + You better believe it! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + </div><!--/.direct-chat-messages--> + + <!-- Contacts are loaded here --> + <div class="direct-chat-contacts"> + <ul class="contacts-list"> + <li> + <a href="#"> + <img class="contacts-list-img" src="../dist/img/user1-128x128.jpg" alt="Contact Avatar"> + <div class="contacts-list-info"> + <span class="contacts-list-name"> + Count Dracula + <small class="contacts-list-date pull-right">2/28/2015</small> + </span> + <span class="contacts-list-msg">How have you been? I was...</span> + </div><!-- /.contacts-list-info --> + </a> + </li><!-- End Contact Item --> + </ul><!-- /.contatcts-list --> + </div><!-- /.direct-chat-pane --> + </div><!-- /.box-body --> + <div class="box-footer"> + <form action="#" method="post"> + <div class="input-group"> + <input type="text" name="message" placeholder="Type Message ..." class="form-control"> + <span class="input-group-btn"> + <button type="button" class="btn btn-danger btn-flat">Send</button> + </span> + </div> + </form> + </div><!-- /.box-footer--> + </div><!--/.direct-chat --> + </div><!-- /.col --> + </div><!-- /.row --> + <p class="lead">Direct Chat Markup</p> + <pre class="prettyprint"><code class="html"> +&LT;!-- Construct the box with style you want. Here we are using box-danger --> +&LT;!-- Then add the class direct-chat and choose the direct-chat-* contexual class --> +&LT;!-- The contextual class should match the box, so we are using direct-chat-danger --> +&LT;div class="box box-danger direct-chat direct-chat-danger"> + &LT;div class="box-header with-border"> + &LT;h3 class="box-title">Direct Chat&LT;/h3> + &LT;div class="box-tools pull-right"> + &LT;span data-toggle="tooltip" title="3 New Messages" class="badge bg-red">3&LT;/span> + &LT;button class="btn btn-box-tool" data-widget="collapse">&LT;i class="fa fa-minus">&LT;/i>&LT;/button> + &LT;!-- In box-tools add this button if you intend to use the contacts pane --> + &LT;button class="btn btn-box-tool" data-toggle="tooltip" title="Contacts" data-widget="chat-pane-toggle">&LT;i class="fa fa-comments">&LT;/i>&LT;/button> + &LT;button class="btn btn-box-tool" data-widget="remove">&LT;i class="fa fa-times">&LT;/i>&LT;/button> + &LT;/div> + &LT;/div>&LT;!-- /.box-header --> + &LT;div class="box-body"> + &LT;!-- Conversations are loaded here --> + &LT;div class="direct-chat-messages"> + &LT;!-- Message. Default to the left --> + &LT;div class="direct-chat-msg"> + &LT;div class="direct-chat-info clearfix"> + &LT;span class="direct-chat-name pull-left">Alexander Pierce&LT;/span> + &LT;span class="direct-chat-timestamp pull-right">23 Jan 2:00 pm&LT;/span> + &LT;/div>&LT;!-- /.direct-chat-info --> + &LT;img class="direct-chat-img" src="../dist/img/user1-128x128.jpg" alt="message user image">&LT;!-- /.direct-chat-img --> + &LT;div class="direct-chat-text"> + Is this template really for free? That's unbelievable! + &LT;/div>&LT;!-- /.direct-chat-text --> + &LT;/div>&LT;!-- /.direct-chat-msg --> + + &LT;!-- Message to the right --> + &LT;div class="direct-chat-msg right"> + &LT;div class="direct-chat-info clearfix"> + &LT;span class="direct-chat-name pull-right">Sarah Bullock&LT;/span> + &LT;span class="direct-chat-timestamp pull-left">23 Jan 2:05 pm&LT;/span> + &LT;/div>&LT;!-- /.direct-chat-info --> + &LT;img class="direct-chat-img" src="../dist/img/user3-128x128.jpg" alt="message user image">&LT;!-- /.direct-chat-img --> + &LT;div class="direct-chat-text"> + You better believe it! + &LT;/div>&LT;!-- /.direct-chat-text --> + &LT;/div>&LT;!-- /.direct-chat-msg --> + &LT;/div>&LT;!--/.direct-chat-messages--> + + &LT;!-- Contacts are loaded here --> + &LT;div class="direct-chat-contacts"> + &LT;ul class="contacts-list"> + &LT;li> + &LT;a href="#"> + &LT;img class="contacts-list-img" src="../dist/img/user1-128x128.jpg" alt="Contact Avatar"> + &LT;div class="contacts-list-info"> + &LT;span class="contacts-list-name"> + Count Dracula + &LT;small class="contacts-list-date pull-right">2/28/2015&LT;/small> + &LT;/span> + &LT;span class="contacts-list-msg">How have you been? I was...&LT;/span> + &LT;/div>&LT;!-- /.contacts-list-info --> + &LT;/a> + &LT;/li>&LT;!-- End Contact Item --> + &LT;/ul>&LT;!-- /.contatcts-list --> + &LT;/div>&LT;!-- /.direct-chat-pane --> + &LT;/div>&LT;!-- /.box-body --> + &LT;div class="box-footer"> + &LT;div class="input-group"> + &LT;input type="text" name="message" placeholder="Type Message ..." class="form-control"> + &LT;span class="input-group-btn"> + &LT;button type="button" class="btn btn-danger btn-flat">Send&LT;/button> + &LT;/span> + &LT;/div> + &LT;/div>&LT;!-- /.box-footer--> +&LT;/div>&LT;!--/.direct-chat --> +</code></pre> + + <p>Of course you can use direct chat with a solid box by adding the class <code>solid-box</code> to the box. Here are a couple of examples:</p> + + <!-- Direct Chat With Solid Boxes --> + <div class="row"> + <div class="col-md-6"> + <!-- DIRECT CHAT WARNING --> + <div class="box box-primary box-solid direct-chat direct-chat-primary"> + <div class="box-header"> + <h3 class="box-title">Direct Chat in a Solid Box</h3> + <div class="box-tools pull-right"> + <span data-toggle="tooltip" title="3 New Messages" class="badge bg-light-blue">3</span> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-toggle="tooltip" title="Contacts" data-widget="chat-pane-toggle"><i class="fa fa-comments"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <!-- Conversations are loaded here --> + <div class="direct-chat-messages"> + <!-- Message. Default to the left --> + <div class="direct-chat-msg"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-left">Alexander Pierce</span> + <span class="direct-chat-timestamp pull-right">23 Jan 2:00 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user1-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + Is this template really for free? That's unbelievable! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + + <!-- Message to the right --> + <div class="direct-chat-msg right"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-right">Sarah Bullock</span> + <span class="direct-chat-timestamp pull-left">23 Jan 2:05 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user3-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + You better believe it! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + </div><!--/.direct-chat-messages--> + + <!-- Contacts are loaded here --> + <div class="direct-chat-contacts"> + <ul class="contacts-list"> + <li> + <a href="#"> + <img class="contacts-list-img" src="../dist/img/user1-128x128.jpg" alt="Contact Avatar"> + <div class="contacts-list-info"> + <span class="contacts-list-name"> + Count Dracula + <small class="contacts-list-date pull-right">2/28/2015</small> + </span> + <span class="contacts-list-msg">How have you been? I was...</span> + </div><!-- /.contacts-list-info --> + </a> + </li><!-- End Contact Item --> + </ul><!-- /.contatcts-list --> + </div><!-- /.direct-chat-pane --> + </div><!-- /.box-body --> + <div class="box-footer"> + <form action="#" method="post"> + <div class="input-group"> + <input type="text" name="message" placeholder="Type Message ..." class="form-control"> + <span class="input-group-btn"> + <button type="button" class="btn btn-primary btn-flat">Send</button> + </span> + </div> + </form> + </div><!-- /.box-footer--> + </div><!--/.direct-chat --> + </div><!-- /.col --> + + <div class="col-md-6"> + <!-- DIRECT CHAT DANGER --> + <div class="box box-info box-solid direct-chat direct-chat-info"> + <div class="box-header"> + <h3 class="box-title">Direct Chat in a Solid Box</h3> + <div class="box-tools pull-right"> + <span data-toggle="tooltip" title="3 New Messages" class="badge bg-aqua">3</span> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-toggle="tooltip" title="Contacts" data-widget="chat-pane-toggle"><i class="fa fa-comments"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <!-- Conversations are loaded here --> + <div class="direct-chat-messages"> + <!-- Message. Default to the left --> + <div class="direct-chat-msg"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-left">Alexander Pierce</span> + <span class="direct-chat-timestamp pull-right">23 Jan 2:00 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user1-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + Is this template really for free? That's unbelievable! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + + <!-- Message to the right --> + <div class="direct-chat-msg right"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-right">Sarah Bullock</span> + <span class="direct-chat-timestamp pull-left">23 Jan 2:05 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user3-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + You better believe it! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + </div><!--/.direct-chat-messages--> + + <!-- Contacts are loaded here --> + <div class="direct-chat-contacts"> + <ul class="contacts-list"> + <li> + <a href="#"> + <img class="contacts-list-img" src="../dist/img/user1-128x128.jpg" alt="Contact Avatar"> + <div class="contacts-list-info"> + <span class="contacts-list-name"> + Count Dracula + <small class="contacts-list-date pull-right">2/28/2015</small> + </span> + <span class="contacts-list-msg">How have you been? I was...</span> + </div><!-- /.contacts-list-info --> + </a> + </li><!-- End Contact Item --> + </ul><!-- /.contatcts-list --> + </div><!-- /.direct-chat-pane --> + </div><!-- /.box-body --> + <div class="box-footer"> + <form action="#" method="post"> + <div class="input-group"> + <input type="text" name="message" placeholder="Type Message ..." class="form-control"> + <span class="input-group-btn"> + <button type="button" class="btn btn-info btn-flat">Send</button> + </span> + </div> + </form> + </div><!-- /.box-footer--> + </div><!--/.direct-chat --> + </div><!-- /.col --> + </div><!-- /.row --> +</section> + + +<!-- ============================================================= --> + +<section id="plugins"> + <h2 class="page-header"><a href="#plugins">Plugins</a></h2> + <p class="lead">AdminLTE makes use of the following plugins. For documentation, updates or license information, please visit the provided links.</p> + <div class="row bring-up"> + <div class="col-sm-3"> + <ul class="list-unstyled"> + <li><h4>Charts</h4></li> + <li><a href="http://www.chartjs.org/" target="_blank">ChartJS</a></li> + <li><a href="http://www.flotcharts.org/" target="_blank">Flot</a></li> + <li><a href="http://morrisjs.github.io/morris.js/" target="_blank">Morris.js</a></li> + <li><a href="http://omnipotent.net/jquery.sparkline/" target="_blank">Sparkline</a></li> + </ul> + </div><!-- /.col --> + <div class="col-sm-3"> + <ul class="list-unstyled"> + <li><h4>Form Elements</h4></li> + <li><a href="https://github.com/seiyria/bootstrap-slider/">Bootstrap Slider</a></li> + <li><a href="http://ionden.com/a/plugins/ion.rangeSlider/en.html" target="_blank">Ion Slider</a></li> + <li><a href="http://bootstrap-datepicker.readthedocs.org/" target="_blank">Date Picker</a></li> + <li><a href="http://www.daterangepicker.com/" target="_blank">Date Range Picker</a></li> + <li><a href="http://mjolnic.com/bootstrap-colorpicker/" target="_blank">Color Picker</a></li> + <li><a href="https://github.com/jdewit/bootstrap-timepicker/" target="_blank">Time Picker</a></li> + <li><a href="http://fronteed.com/iCheck/" target="_blank">iCheck</a></li> + <li><a href="https://github.com/RobinHerbots/jquery.inputmask/" target="_blank">Input Mask</a></li> + </ul> + </div><!-- /.col --> + <div class="col-sm-3"> + <ul class="list-unstyled"> + <li><h4>Editors</h4></li> + <li><a href="https://github.com/bootstrap-wysiwyg/bootstrap3-wysiwyg/" target="_blank">Bootstrap WYSIHTML5</a></li> + <li><a href="http://ckeditor.com/" target="_blank">CK Editor</a></li> + </ul> + </div><!-- /. col --> + <div class="col-sm-3"> + <ul class="list-unstyled"> + <li><h4>Other</h4></li> + <li><a href="https://datatables.net/examples/styling/bootstrap.html" target="_blank">DataTables</a></li> + <li><a href="http://fullcalendar.io/" target="_blank">Full Calendar</a></li> + <li><a href="http://jqueryui.com/" target="_blank">jQuery UI</a></li> + <li><a href="http://anthonyterrien.com/knob/" target="_blank">jQuery Knob</a></li> + <li><a href="http://jvectormap.com/" target="_blank">jVector Map</a></li> + <li><a href="http://rocha.la/jQuery-slimScroll/" target="_blank">Slim Scroll</a></li> + <li><a href="http://github.hubspot.com/pace/docs/welcome/" target="_blank">Pace</a></li> + </ul> + </div><!-- /.col --> + </div><!-- /.row --> +</section> + + +<!-- ============================================================= --> + +<section id="browsers"> + <h2 class="page-header"><a href="#browsers">Browser Support</a></h2> + <p class="lead">AdminLTE supports the following browsers:</p> + <ul> + <li>IE9+</li> + <li>Firefox (latest)</li> + <li>Safari (latest)</li> + <li>Chrome (latest)</li> + <li>Opera (latest)</li> + </ul> + <p><b>Note:</b> IE9 does not support transitions or animations. The template will function properly but it won't use animations/transitions on IE9.</p> +</section> + + +<!-- ============================================================= --> + +<section id="upgrade"> + <h2 class="page-header"><a href="#upgrade">Upgrade Guide</a></h2> + <p class="lead">To upgrade from version 1.x to the lateset version, follow this guide.</p> + <h3>New Files</h3> + <p>Make sure you update all CSS and JS files that are related to AdminLTE. Otherwise, the layout will not + function properly. Most important files are AdminLTE.css, skins CSS files, and app.js.</p> + <h3>Layout Changes</h3> + <ol> + <li>The .wrapper div must be placed immediately after the body tag rather than after the header</li> + <li>Change the .header div to .main-header <code>&LT;div class="main-header"></code></li> + <li>Change the .right-side class to .content-wrapper <code>&LT;div class="content-wrapper"></code></li> + <li>Change the .left-side class to .main-sidebar <code>&LT;div class="main-sidebar"></code></li> + <li>In the navbar, change .navbar-right to .navbar-custom-menu <code>&LT;div class="navbar-custom-menu"></code></li> + </ol> + <h3>Navbar Custom Dropdown Menus</h3> + <ol> + <li>The icons in the notification menu do not need bg-* classes. They should be replaced with contextual text color class such as text-aqua or text-red.</li> + </ol> + <h3>Login, Registration and Lockscreen Pages</h3> + <p>There are major changes to the HTML markup and style to these pages. The best way is to copy the page's code and customize it.</p> + <p>And you should be set to go!</p> + <h3>Mailbox</h3> + <p>Mailbox got an upgrade to include three different views. The views are inbox, read mail, and compose new email. To use these views, + you should use the provided HTML files in the pages/mailbox folder.</p> + <p><b class="text-red">Note:</b> the old mailbox layout has been deprecated in favor of the new one and will be removed by the next release.</p> +</section> + + +<!-- ============================================================= --> + +<section id="implementations"> + <h2 class="page-header"><a href="#implementations">Implementations</a></h2> + <p class="lead">Thanks to many of AdminLTE users, there are multiple implementations of the template + for easy integration with back-end frameworks. The following are some of them:</p> + + <ul> + <li><a href="https://github.com/dmstr/yii2-adminlte-asset" target="_blank">Yii 2</a> by <a href="https://github.com/schmunk42" target="_blank">Tobias Munk</a></li> + <li><a href="https://github.com/yajra/laravel-admin-template" target="_blank">Laravel</a> by <a href="https://github.com/yajra" target="_blank">Arjay Angeles</a></li> + <li><a href="https://github.com/avanzu/AdminThemeBundle" target="_blank">Symfony</a> by <a href="https://github.com/avanzu" target="_blank">Marc Bach</a></li> + <li><a href="https://github.com/nicolas-besnard/adminlte2-rails" target="_blank">Rails Gem</a> by <a href="https://github.com/nicolas-besnard" target="_blank">Nicolas Besnard</a></li> + </ul> + + <p><b class="text-red">Note:</b> these implementations are not supported by Almsaeed Studio. However, + they do provide a good example of how to integrate AdminLTE into different frameworks. For the latest release + of AdminLTE, please visit our <a href="https://github.com/almasaeed2010/AdminLTE">repository</a> or <a href="https://almsaeedstudio.com">website</a></p> +</section> + + +<!-- ============================================================= --> + +<section id="faq"> + <h2 class="page-header"><a href="#faq">FAQ</a></h2> + <h3>Can AdminLTE be used with Wordpress?</h3> + <p class="lead">AdminLTE is an HTML template that can be used for any purpose. However, it is not made to be easily installed on Wordpress. It will require some effort and enough knowledge of the Wordpress script to do so.</p> + + <h3>Is there an integration guide for PHP frameworks such as Yii or Symfony?</h3> + <p class="lead">Short answer, no. However, there are forks and tutorials around the web that provide info on how to integrate with many different frameworks. There are even versions of AdminLTE that are integrated with jQuery ajax, AngularJS and/or MVC5 ASP .NET.</p> + + <h3>How do I get notified of new AdminLTE versions?</h3> + <p class="lead">The best option is to subscribe to our mailing list using the <a href="http://almsaeedstudio.com/#subscribe">subscription form on Almsaeed Studio</a>. + If that's not appealing to you, you may watch the <a href="https://github.com/almasaeed2010/AdminLTE">repository on Github</a> or visit <a href="http://almsaeedstudio.com">Almsaeed Studio</a> every now and then for updates and announcements.</p> +</section> + + +<!-- ============================================================= --> + +<section id="license"> + <h2 class="page-header"><a href="#license">License</a></h2> + <h3>AdminLTE</h3> + <p class="lead"> + AdminLTE is an open source project that is licensed under the <a href="http://opensource.org/licenses/MIT">MIT license</a>. + This allows you to do pretty much anything you want as long as you include + the copyright in "all copies or substantial portions of the Software." + Attribution is not required (though very much appreciated). + </p> +</section> + + + </div><!-- /.content --> + </div><!-- /.content-wrapper --> + + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <div class="pad"> + This is an example of the control sidebar. + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../bootstrap/js/bootstrap.min.js"></script> + <!-- FastClick --> + <script src="../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../dist/js/app.min.js"></script> + <!-- SlimScroll 1.3.0 --> + <script src="../plugins/slimScroll/jquery.slimscroll.min.js"></script> + <script src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script> + <script src="docs.js"></script> + </body> +</html> diff --git a/theme/bootstrap/documentation/style.css b/theme/bootstrap/documentation/style.css new file mode 100644 index 0000000..c68a50b --- /dev/null +++ b/theme/bootstrap/documentation/style.css @@ -0,0 +1,261 @@ +/* + * Documentation specific stylesheet + */ +.content-wrapper p { + padding: 0 10px; + font-size: 16px; + position: relative; + z-index: 30; +} +.bring-up { + position: relative; + z-index: 30; +} +.nth-2-center > tbody > tr > td:last-of-type { + text-align: center!important; +} +.content { + font-size: 16px; + z-index: 500; +} + +#components > h3 { + font-size: 25px; + color: #000; +} + +#components > h4 { + font-size: 20px; + color: #000; +} +ul { + margin-bottom: 20px; +} +.page-header { + /*border-bottom: 1px solid #ddd; */ + margin: 20px 0 10px 0!important; + position: relative; + z-index: 1; + font-size: 30px; +} +.page-header span, +.page-header a { + z-index: 5; + display: block; + background-color: #ecf0f5; + color: #000; +} +.page-header span::before, +.page-header a::before { + content: '#'; + font-size: 25px; + margin-right: 10px; + color: #3c8dbc; +} +.page-header:before, +#components > h3:before { + display: block; + content: " "; + margin-top: -60px; + height: 60px; + visibility: hidden; + z-index: -10; +} + +.lead { + font-size: 18px; + font-weight: 400; +} +.eg{ + position: absolute; + top: 0; + left: 0; + display: inline-block; + background: #d2d6de; + padding: 5px; + border-bottom-right-radius: 3px; + border-top-left-radius: 3px; + border-bottom: 1px solid #d2d6dc; + border-right: 1px solid #d2d6dc; +} +.eg + * { + margin-top: 30px; +} +.content { + padding: 10px 25px; +} +.hierarchy { + background: #333; + color: #fff; +} +.plugins-list li { + width: 50%; + float: left; +} +pre { + border: none; +} + +.sidebar { + margin-top: 0; + padding-top: 0!important; +} +.box .main-header { + z-index: 1000; + position: relative; +} +.treeview .nav li a:hover, +.treeview .nav li a:active { + background: transparent; +} +p { + padding: 0!important; +} +/* Hemisu Light */ +/* Original theme - http://noahfrederick.com/vim-color-scheme-hemisu/ */ +pre.prettyprint { + background: white; + font-family: Menlo, 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', Monaco, Consolas, monospace; + font-size: 12px; + line-height: 1.5; + border: 1px solid #dedede!important; + padding: 10px; + max-height: 300px; + width: auto; + overflow: auto!important; +} +pre.prettyprint > code { + width: auto; + overflow: auto!important; +} + +.pln { + color: #111111; +} + +@media screen { + .str { + color: #739200; + } + + .kwd { + color: #739200; + } + + .com { + color: #999999; + } + + .typ { + color: #ff0055; + } + + .lit { + color: #538192; + } + + .pun { + color: #111111; + } + + .opn { + color: #111111; + } + + .clo { + color: #111111; + } + + .tag { + color: #111111; + } + + .atn { + color: #739200; + } + + .atv { + color: #ff0055; + } + + .dec { + color: #111111; + } + + .var { + color: #111111; + } + + .fun { + color: #538192; + } +} +@media print, projection { + .str { + color: #006600; + } + + .kwd { + color: #006; + font-weight: bold; + } + + .com { + color: #600; + font-style: italic; + } + + .typ { + color: #404; + font-weight: bold; + } + + .lit { + color: #004444; + } + + .pun, .opn, .clo { + color: #444400; + } + + .tag { + color: #006; + font-weight: bold; + } + + .atn { + color: #440044; + } + + .atv { + color: #006600; + } +} +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { + margin-top: 0; + margin-bottom: 0; +} + +/* IE indents via margin-left */ +li.L0, +li.L1, +li.L2, +li.L3, +li.L4, +li.L5, +li.L6, +li.L7, +li.L8, +li.L9 { + /* */ +} + +/* Alternate shading for lines */ +li.L1, +li.L3, +li.L5, +li.L7, +li.L9 { + /* */ +} diff --git a/theme/bootstrap/download/font-awesome.min.css b/theme/bootstrap/download/font-awesome.min.css new file mode 100644 index 0000000..fccf84d --- /dev/null +++ b/theme/bootstrap/download/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.4.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"} \ No newline at end of file diff --git a/theme/bootstrap/download/ionicons.min.css b/theme/bootstrap/download/ionicons.min.css new file mode 100644 index 0000000..0900e63 --- /dev/null +++ b/theme/bootstrap/download/ionicons.min.css @@ -0,0 +1,11 @@ +@charset "UTF-8";/*! + Ionicons, v2.0.1 + Created by Ben Sperry for the Ionic Framework, http://ionicons.com/ + https://twitter.com/benjsperry https://twitter.com/ionicframework + MIT License: https://github.com/driftyco/ionicons + + Android-style icons originally built by Googles + Material Design Icons: https://github.com/google/material-design-icons + used under CC BY http://creativecommons.org/licenses/by/4.0/ + Modified icons to fit ionicons grid from original. +*/@font-face{font-family:"Ionicons";src:url("../fonts/ionicons.eot?v=2.0.1");src:url("../fonts/ionicons.eot?v=2.0.1#iefix") format("embedded-opentype"),url("../fonts/ionicons.ttf?v=2.0.1") format("truetype"),url("../fonts/ionicons.woff?v=2.0.1") format("woff"),url("../fonts/ionicons.svg?v=2.0.1#Ionicons") format("svg");font-weight:normal;font-style:normal}.ion,.ionicons,.ion-alert:before,.ion-alert-circled:before,.ion-android-add:before,.ion-android-add-circle:before,.ion-android-alarm-clock:before,.ion-android-alert:before,.ion-android-apps:before,.ion-android-archive:before,.ion-android-arrow-back:before,.ion-android-arrow-down:before,.ion-android-arrow-dropdown:before,.ion-android-arrow-dropdown-circle:before,.ion-android-arrow-dropleft:before,.ion-android-arrow-dropleft-circle:before,.ion-android-arrow-dropright:before,.ion-android-arrow-dropright-circle:before,.ion-android-arrow-dropup:before,.ion-android-arrow-dropup-circle:before,.ion-android-arrow-forward:before,.ion-android-arrow-up:before,.ion-android-attach:before,.ion-android-bar:before,.ion-android-bicycle:before,.ion-android-boat:before,.ion-android-bookmark:before,.ion-android-bulb:before,.ion-android-bus:before,.ion-android-calendar:before,.ion-android-call:before,.ion-android-camera:before,.ion-android-cancel:before,.ion-android-car:before,.ion-android-cart:before,.ion-android-chat:before,.ion-android-checkbox:before,.ion-android-checkbox-blank:before,.ion-android-checkbox-outline:before,.ion-android-checkbox-outline-blank:before,.ion-android-checkmark-circle:before,.ion-android-clipboard:before,.ion-android-close:before,.ion-android-cloud:before,.ion-android-cloud-circle:before,.ion-android-cloud-done:before,.ion-android-cloud-outline:before,.ion-android-color-palette:before,.ion-android-compass:before,.ion-android-contact:before,.ion-android-contacts:before,.ion-android-contract:before,.ion-android-create:before,.ion-android-delete:before,.ion-android-desktop:before,.ion-android-document:before,.ion-android-done:before,.ion-android-done-all:before,.ion-android-download:before,.ion-android-drafts:before,.ion-android-exit:before,.ion-android-expand:before,.ion-android-favorite:before,.ion-android-favorite-outline:before,.ion-android-film:before,.ion-android-folder:before,.ion-android-folder-open:before,.ion-android-funnel:before,.ion-android-globe:before,.ion-android-hand:before,.ion-android-hangout:before,.ion-android-happy:before,.ion-android-home:before,.ion-android-image:before,.ion-android-laptop:before,.ion-android-list:before,.ion-android-locate:before,.ion-android-lock:before,.ion-android-mail:before,.ion-android-map:before,.ion-android-menu:before,.ion-android-microphone:before,.ion-android-microphone-off:before,.ion-android-more-horizontal:before,.ion-android-more-vertical:before,.ion-android-navigate:before,.ion-android-notifications:before,.ion-android-notifications-none:before,.ion-android-notifications-off:before,.ion-android-open:before,.ion-android-options:before,.ion-android-people:before,.ion-android-person:before,.ion-android-person-add:before,.ion-android-phone-landscape:before,.ion-android-phone-portrait:before,.ion-android-pin:before,.ion-android-plane:before,.ion-android-playstore:before,.ion-android-print:before,.ion-android-radio-button-off:before,.ion-android-radio-button-on:before,.ion-android-refresh:before,.ion-android-remove:before,.ion-android-remove-circle:before,.ion-android-restaurant:before,.ion-android-sad:before,.ion-android-search:before,.ion-android-send:before,.ion-android-settings:before,.ion-android-share:before,.ion-android-share-alt:before,.ion-android-star:before,.ion-android-star-half:before,.ion-android-star-outline:before,.ion-android-stopwatch:before,.ion-android-subway:before,.ion-android-sunny:before,.ion-android-sync:before,.ion-android-textsms:before,.ion-android-time:before,.ion-android-train:before,.ion-android-unlock:before,.ion-android-upload:before,.ion-android-volume-down:before,.ion-android-volume-mute:before,.ion-android-volume-off:before,.ion-android-volume-up:before,.ion-android-walk:before,.ion-android-warning:before,.ion-android-watch:before,.ion-android-wifi:before,.ion-aperture:before,.ion-archive:before,.ion-arrow-down-a:before,.ion-arrow-down-b:before,.ion-arrow-down-c:before,.ion-arrow-expand:before,.ion-arrow-graph-down-left:before,.ion-arrow-graph-down-right:before,.ion-arrow-graph-up-left:before,.ion-arrow-graph-up-right:before,.ion-arrow-left-a:before,.ion-arrow-left-b:before,.ion-arrow-left-c:before,.ion-arrow-move:before,.ion-arrow-resize:before,.ion-arrow-return-left:before,.ion-arrow-return-right:before,.ion-arrow-right-a:before,.ion-arrow-right-b:before,.ion-arrow-right-c:before,.ion-arrow-shrink:before,.ion-arrow-swap:before,.ion-arrow-up-a:before,.ion-arrow-up-b:before,.ion-arrow-up-c:before,.ion-asterisk:before,.ion-at:before,.ion-backspace:before,.ion-backspace-outline:before,.ion-bag:before,.ion-battery-charging:before,.ion-battery-empty:before,.ion-battery-full:before,.ion-battery-half:before,.ion-battery-low:before,.ion-beaker:before,.ion-beer:before,.ion-bluetooth:before,.ion-bonfire:before,.ion-bookmark:before,.ion-bowtie:before,.ion-briefcase:before,.ion-bug:before,.ion-calculator:before,.ion-calendar:before,.ion-camera:before,.ion-card:before,.ion-cash:before,.ion-chatbox:before,.ion-chatbox-working:before,.ion-chatboxes:before,.ion-chatbubble:before,.ion-chatbubble-working:before,.ion-chatbubbles:before,.ion-checkmark:before,.ion-checkmark-circled:before,.ion-checkmark-round:before,.ion-chevron-down:before,.ion-chevron-left:before,.ion-chevron-right:before,.ion-chevron-up:before,.ion-clipboard:before,.ion-clock:before,.ion-close:before,.ion-close-circled:before,.ion-close-round:before,.ion-closed-captioning:before,.ion-cloud:before,.ion-code:before,.ion-code-download:before,.ion-code-working:before,.ion-coffee:before,.ion-compass:before,.ion-compose:before,.ion-connection-bars:before,.ion-contrast:before,.ion-crop:before,.ion-cube:before,.ion-disc:before,.ion-document:before,.ion-document-text:before,.ion-drag:before,.ion-earth:before,.ion-easel:before,.ion-edit:before,.ion-egg:before,.ion-eject:before,.ion-email:before,.ion-email-unread:before,.ion-erlenmeyer-flask:before,.ion-erlenmeyer-flask-bubbles:before,.ion-eye:before,.ion-eye-disabled:before,.ion-female:before,.ion-filing:before,.ion-film-marker:before,.ion-fireball:before,.ion-flag:before,.ion-flame:before,.ion-flash:before,.ion-flash-off:before,.ion-folder:before,.ion-fork:before,.ion-fork-repo:before,.ion-forward:before,.ion-funnel:before,.ion-gear-a:before,.ion-gear-b:before,.ion-grid:before,.ion-hammer:before,.ion-happy:before,.ion-happy-outline:before,.ion-headphone:before,.ion-heart:before,.ion-heart-broken:before,.ion-help:before,.ion-help-buoy:before,.ion-help-circled:before,.ion-home:before,.ion-icecream:before,.ion-image:before,.ion-images:before,.ion-information:before,.ion-information-circled:before,.ion-ionic:before,.ion-ios-alarm:before,.ion-ios-alarm-outline:before,.ion-ios-albums:before,.ion-ios-albums-outline:before,.ion-ios-americanfootball:before,.ion-ios-americanfootball-outline:before,.ion-ios-analytics:before,.ion-ios-analytics-outline:before,.ion-ios-arrow-back:before,.ion-ios-arrow-down:before,.ion-ios-arrow-forward:before,.ion-ios-arrow-left:before,.ion-ios-arrow-right:before,.ion-ios-arrow-thin-down:before,.ion-ios-arrow-thin-left:before,.ion-ios-arrow-thin-right:before,.ion-ios-arrow-thin-up:before,.ion-ios-arrow-up:before,.ion-ios-at:before,.ion-ios-at-outline:before,.ion-ios-barcode:before,.ion-ios-barcode-outline:before,.ion-ios-baseball:before,.ion-ios-baseball-outline:before,.ion-ios-basketball:before,.ion-ios-basketball-outline:before,.ion-ios-bell:before,.ion-ios-bell-outline:before,.ion-ios-body:before,.ion-ios-body-outline:before,.ion-ios-bolt:before,.ion-ios-bolt-outline:before,.ion-ios-book:before,.ion-ios-book-outline:before,.ion-ios-bookmarks:before,.ion-ios-bookmarks-outline:before,.ion-ios-box:before,.ion-ios-box-outline:before,.ion-ios-briefcase:before,.ion-ios-briefcase-outline:before,.ion-ios-browsers:before,.ion-ios-browsers-outline:before,.ion-ios-calculator:before,.ion-ios-calculator-outline:before,.ion-ios-calendar:before,.ion-ios-calendar-outline:before,.ion-ios-camera:before,.ion-ios-camera-outline:before,.ion-ios-cart:before,.ion-ios-cart-outline:before,.ion-ios-chatboxes:before,.ion-ios-chatboxes-outline:before,.ion-ios-chatbubble:before,.ion-ios-chatbubble-outline:before,.ion-ios-checkmark:before,.ion-ios-checkmark-empty:before,.ion-ios-checkmark-outline:before,.ion-ios-circle-filled:before,.ion-ios-circle-outline:before,.ion-ios-clock:before,.ion-ios-clock-outline:before,.ion-ios-close:before,.ion-ios-close-empty:before,.ion-ios-close-outline:before,.ion-ios-cloud:before,.ion-ios-cloud-download:before,.ion-ios-cloud-download-outline:before,.ion-ios-cloud-outline:before,.ion-ios-cloud-upload:before,.ion-ios-cloud-upload-outline:before,.ion-ios-cloudy:before,.ion-ios-cloudy-night:before,.ion-ios-cloudy-night-outline:before,.ion-ios-cloudy-outline:before,.ion-ios-cog:before,.ion-ios-cog-outline:before,.ion-ios-color-filter:before,.ion-ios-color-filter-outline:before,.ion-ios-color-wand:before,.ion-ios-color-wand-outline:before,.ion-ios-compose:before,.ion-ios-compose-outline:before,.ion-ios-contact:before,.ion-ios-contact-outline:before,.ion-ios-copy:before,.ion-ios-copy-outline:before,.ion-ios-crop:before,.ion-ios-crop-strong:before,.ion-ios-download:before,.ion-ios-download-outline:before,.ion-ios-drag:before,.ion-ios-email:before,.ion-ios-email-outline:before,.ion-ios-eye:before,.ion-ios-eye-outline:before,.ion-ios-fastforward:before,.ion-ios-fastforward-outline:before,.ion-ios-filing:before,.ion-ios-filing-outline:before,.ion-ios-film:before,.ion-ios-film-outline:before,.ion-ios-flag:before,.ion-ios-flag-outline:before,.ion-ios-flame:before,.ion-ios-flame-outline:before,.ion-ios-flask:before,.ion-ios-flask-outline:before,.ion-ios-flower:before,.ion-ios-flower-outline:before,.ion-ios-folder:before,.ion-ios-folder-outline:before,.ion-ios-football:before,.ion-ios-football-outline:before,.ion-ios-game-controller-a:before,.ion-ios-game-controller-a-outline:before,.ion-ios-game-controller-b:before,.ion-ios-game-controller-b-outline:before,.ion-ios-gear:before,.ion-ios-gear-outline:before,.ion-ios-glasses:before,.ion-ios-glasses-outline:before,.ion-ios-grid-view:before,.ion-ios-grid-view-outline:before,.ion-ios-heart:before,.ion-ios-heart-outline:before,.ion-ios-help:before,.ion-ios-help-empty:before,.ion-ios-help-outline:before,.ion-ios-home:before,.ion-ios-home-outline:before,.ion-ios-infinite:before,.ion-ios-infinite-outline:before,.ion-ios-information:before,.ion-ios-information-empty:before,.ion-ios-information-outline:before,.ion-ios-ionic-outline:before,.ion-ios-keypad:before,.ion-ios-keypad-outline:before,.ion-ios-lightbulb:before,.ion-ios-lightbulb-outline:before,.ion-ios-list:before,.ion-ios-list-outline:before,.ion-ios-location:before,.ion-ios-location-outline:before,.ion-ios-locked:before,.ion-ios-locked-outline:before,.ion-ios-loop:before,.ion-ios-loop-strong:before,.ion-ios-medical:before,.ion-ios-medical-outline:before,.ion-ios-medkit:before,.ion-ios-medkit-outline:before,.ion-ios-mic:before,.ion-ios-mic-off:before,.ion-ios-mic-outline:before,.ion-ios-minus:before,.ion-ios-minus-empty:before,.ion-ios-minus-outline:before,.ion-ios-monitor:before,.ion-ios-monitor-outline:before,.ion-ios-moon:before,.ion-ios-moon-outline:before,.ion-ios-more:before,.ion-ios-more-outline:before,.ion-ios-musical-note:before,.ion-ios-musical-notes:before,.ion-ios-navigate:before,.ion-ios-navigate-outline:before,.ion-ios-nutrition:before,.ion-ios-nutrition-outline:before,.ion-ios-paper:before,.ion-ios-paper-outline:before,.ion-ios-paperplane:before,.ion-ios-paperplane-outline:before,.ion-ios-partlysunny:before,.ion-ios-partlysunny-outline:before,.ion-ios-pause:before,.ion-ios-pause-outline:before,.ion-ios-paw:before,.ion-ios-paw-outline:before,.ion-ios-people:before,.ion-ios-people-outline:before,.ion-ios-person:before,.ion-ios-person-outline:before,.ion-ios-personadd:before,.ion-ios-personadd-outline:before,.ion-ios-photos:before,.ion-ios-photos-outline:before,.ion-ios-pie:before,.ion-ios-pie-outline:before,.ion-ios-pint:before,.ion-ios-pint-outline:before,.ion-ios-play:before,.ion-ios-play-outline:before,.ion-ios-plus:before,.ion-ios-plus-empty:before,.ion-ios-plus-outline:before,.ion-ios-pricetag:before,.ion-ios-pricetag-outline:before,.ion-ios-pricetags:before,.ion-ios-pricetags-outline:before,.ion-ios-printer:before,.ion-ios-printer-outline:before,.ion-ios-pulse:before,.ion-ios-pulse-strong:before,.ion-ios-rainy:before,.ion-ios-rainy-outline:before,.ion-ios-recording:before,.ion-ios-recording-outline:before,.ion-ios-redo:before,.ion-ios-redo-outline:before,.ion-ios-refresh:before,.ion-ios-refresh-empty:before,.ion-ios-refresh-outline:before,.ion-ios-reload:before,.ion-ios-reverse-camera:before,.ion-ios-reverse-camera-outline:before,.ion-ios-rewind:before,.ion-ios-rewind-outline:before,.ion-ios-rose:before,.ion-ios-rose-outline:before,.ion-ios-search:before,.ion-ios-search-strong:before,.ion-ios-settings:before,.ion-ios-settings-strong:before,.ion-ios-shuffle:before,.ion-ios-shuffle-strong:before,.ion-ios-skipbackward:before,.ion-ios-skipbackward-outline:before,.ion-ios-skipforward:before,.ion-ios-skipforward-outline:before,.ion-ios-snowy:before,.ion-ios-speedometer:before,.ion-ios-speedometer-outline:before,.ion-ios-star:before,.ion-ios-star-half:before,.ion-ios-star-outline:before,.ion-ios-stopwatch:before,.ion-ios-stopwatch-outline:before,.ion-ios-sunny:before,.ion-ios-sunny-outline:before,.ion-ios-telephone:before,.ion-ios-telephone-outline:before,.ion-ios-tennisball:before,.ion-ios-tennisball-outline:before,.ion-ios-thunderstorm:before,.ion-ios-thunderstorm-outline:before,.ion-ios-time:before,.ion-ios-time-outline:before,.ion-ios-timer:before,.ion-ios-timer-outline:before,.ion-ios-toggle:before,.ion-ios-toggle-outline:before,.ion-ios-trash:before,.ion-ios-trash-outline:before,.ion-ios-undo:before,.ion-ios-undo-outline:before,.ion-ios-unlocked:before,.ion-ios-unlocked-outline:before,.ion-ios-upload:before,.ion-ios-upload-outline:before,.ion-ios-videocam:before,.ion-ios-videocam-outline:before,.ion-ios-volume-high:before,.ion-ios-volume-low:before,.ion-ios-wineglass:before,.ion-ios-wineglass-outline:before,.ion-ios-world:before,.ion-ios-world-outline:before,.ion-ipad:before,.ion-iphone:before,.ion-ipod:before,.ion-jet:before,.ion-key:before,.ion-knife:before,.ion-laptop:before,.ion-leaf:before,.ion-levels:before,.ion-lightbulb:before,.ion-link:before,.ion-load-a:before,.ion-load-b:before,.ion-load-c:before,.ion-load-d:before,.ion-location:before,.ion-lock-combination:before,.ion-locked:before,.ion-log-in:before,.ion-log-out:before,.ion-loop:before,.ion-magnet:before,.ion-male:before,.ion-man:before,.ion-map:before,.ion-medkit:before,.ion-merge:before,.ion-mic-a:before,.ion-mic-b:before,.ion-mic-c:before,.ion-minus:before,.ion-minus-circled:before,.ion-minus-round:before,.ion-model-s:before,.ion-monitor:before,.ion-more:before,.ion-mouse:before,.ion-music-note:before,.ion-navicon:before,.ion-navicon-round:before,.ion-navigate:before,.ion-network:before,.ion-no-smoking:before,.ion-nuclear:before,.ion-outlet:before,.ion-paintbrush:before,.ion-paintbucket:before,.ion-paper-airplane:before,.ion-paperclip:before,.ion-pause:before,.ion-person:before,.ion-person-add:before,.ion-person-stalker:before,.ion-pie-graph:before,.ion-pin:before,.ion-pinpoint:before,.ion-pizza:before,.ion-plane:before,.ion-planet:before,.ion-play:before,.ion-playstation:before,.ion-plus:before,.ion-plus-circled:before,.ion-plus-round:before,.ion-podium:before,.ion-pound:before,.ion-power:before,.ion-pricetag:before,.ion-pricetags:before,.ion-printer:before,.ion-pull-request:before,.ion-qr-scanner:before,.ion-quote:before,.ion-radio-waves:before,.ion-record:before,.ion-refresh:before,.ion-reply:before,.ion-reply-all:before,.ion-ribbon-a:before,.ion-ribbon-b:before,.ion-sad:before,.ion-sad-outline:before,.ion-scissors:before,.ion-search:before,.ion-settings:before,.ion-share:before,.ion-shuffle:before,.ion-skip-backward:before,.ion-skip-forward:before,.ion-social-android:before,.ion-social-android-outline:before,.ion-social-angular:before,.ion-social-angular-outline:before,.ion-social-apple:before,.ion-social-apple-outline:before,.ion-social-bitcoin:before,.ion-social-bitcoin-outline:before,.ion-social-buffer:before,.ion-social-buffer-outline:before,.ion-social-chrome:before,.ion-social-chrome-outline:before,.ion-social-codepen:before,.ion-social-codepen-outline:before,.ion-social-css3:before,.ion-social-css3-outline:before,.ion-social-designernews:before,.ion-social-designernews-outline:before,.ion-social-dribbble:before,.ion-social-dribbble-outline:before,.ion-social-dropbox:before,.ion-social-dropbox-outline:before,.ion-social-euro:before,.ion-social-euro-outline:before,.ion-social-facebook:before,.ion-social-facebook-outline:before,.ion-social-foursquare:before,.ion-social-foursquare-outline:before,.ion-social-freebsd-devil:before,.ion-social-github:before,.ion-social-github-outline:before,.ion-social-google:before,.ion-social-google-outline:before,.ion-social-googleplus:before,.ion-social-googleplus-outline:before,.ion-social-hackernews:before,.ion-social-hackernews-outline:before,.ion-social-html5:before,.ion-social-html5-outline:before,.ion-social-instagram:before,.ion-social-instagram-outline:before,.ion-social-javascript:before,.ion-social-javascript-outline:before,.ion-social-linkedin:before,.ion-social-linkedin-outline:before,.ion-social-markdown:before,.ion-social-nodejs:before,.ion-social-octocat:before,.ion-social-pinterest:before,.ion-social-pinterest-outline:before,.ion-social-python:before,.ion-social-reddit:before,.ion-social-reddit-outline:before,.ion-social-rss:before,.ion-social-rss-outline:before,.ion-social-sass:before,.ion-social-skype:before,.ion-social-skype-outline:before,.ion-social-snapchat:before,.ion-social-snapchat-outline:before,.ion-social-tumblr:before,.ion-social-tumblr-outline:before,.ion-social-tux:before,.ion-social-twitch:before,.ion-social-twitch-outline:before,.ion-social-twitter:before,.ion-social-twitter-outline:before,.ion-social-usd:before,.ion-social-usd-outline:before,.ion-social-vimeo:before,.ion-social-vimeo-outline:before,.ion-social-whatsapp:before,.ion-social-whatsapp-outline:before,.ion-social-windows:before,.ion-social-windows-outline:before,.ion-social-wordpress:before,.ion-social-wordpress-outline:before,.ion-social-yahoo:before,.ion-social-yahoo-outline:before,.ion-social-yen:before,.ion-social-yen-outline:before,.ion-social-youtube:before,.ion-social-youtube-outline:before,.ion-soup-can:before,.ion-soup-can-outline:before,.ion-speakerphone:before,.ion-speedometer:before,.ion-spoon:before,.ion-star:before,.ion-stats-bars:before,.ion-steam:before,.ion-stop:before,.ion-thermometer:before,.ion-thumbsdown:before,.ion-thumbsup:before,.ion-toggle:before,.ion-toggle-filled:before,.ion-transgender:before,.ion-trash-a:before,.ion-trash-b:before,.ion-trophy:before,.ion-tshirt:before,.ion-tshirt-outline:before,.ion-umbrella:before,.ion-university:before,.ion-unlocked:before,.ion-upload:before,.ion-usb:before,.ion-videocamera:before,.ion-volume-high:before,.ion-volume-low:before,.ion-volume-medium:before,.ion-volume-mute:before,.ion-wand:before,.ion-waterdrop:before,.ion-wifi:before,.ion-wineglass:before,.ion-woman:before,.ion-wrench:before,.ion-xbox:before{display:inline-block;font-family:"Ionicons";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ion-alert:before{content:"\f101"}.ion-alert-circled:before{content:"\f100"}.ion-android-add:before{content:"\f2c7"}.ion-android-add-circle:before{content:"\f359"}.ion-android-alarm-clock:before{content:"\f35a"}.ion-android-alert:before{content:"\f35b"}.ion-android-apps:before{content:"\f35c"}.ion-android-archive:before{content:"\f2c9"}.ion-android-arrow-back:before{content:"\f2ca"}.ion-android-arrow-down:before{content:"\f35d"}.ion-android-arrow-dropdown:before{content:"\f35f"}.ion-android-arrow-dropdown-circle:before{content:"\f35e"}.ion-android-arrow-dropleft:before{content:"\f361"}.ion-android-arrow-dropleft-circle:before{content:"\f360"}.ion-android-arrow-dropright:before{content:"\f363"}.ion-android-arrow-dropright-circle:before{content:"\f362"}.ion-android-arrow-dropup:before{content:"\f365"}.ion-android-arrow-dropup-circle:before{content:"\f364"}.ion-android-arrow-forward:before{content:"\f30f"}.ion-android-arrow-up:before{content:"\f366"}.ion-android-attach:before{content:"\f367"}.ion-android-bar:before{content:"\f368"}.ion-android-bicycle:before{content:"\f369"}.ion-android-boat:before{content:"\f36a"}.ion-android-bookmark:before{content:"\f36b"}.ion-android-bulb:before{content:"\f36c"}.ion-android-bus:before{content:"\f36d"}.ion-android-calendar:before{content:"\f2d1"}.ion-android-call:before{content:"\f2d2"}.ion-android-camera:before{content:"\f2d3"}.ion-android-cancel:before{content:"\f36e"}.ion-android-car:before{content:"\f36f"}.ion-android-cart:before{content:"\f370"}.ion-android-chat:before{content:"\f2d4"}.ion-android-checkbox:before{content:"\f374"}.ion-android-checkbox-blank:before{content:"\f371"}.ion-android-checkbox-outline:before{content:"\f373"}.ion-android-checkbox-outline-blank:before{content:"\f372"}.ion-android-checkmark-circle:before{content:"\f375"}.ion-android-clipboard:before{content:"\f376"}.ion-android-close:before{content:"\f2d7"}.ion-android-cloud:before{content:"\f37a"}.ion-android-cloud-circle:before{content:"\f377"}.ion-android-cloud-done:before{content:"\f378"}.ion-android-cloud-outline:before{content:"\f379"}.ion-android-color-palette:before{content:"\f37b"}.ion-android-compass:before{content:"\f37c"}.ion-android-contact:before{content:"\f2d8"}.ion-android-contacts:before{content:"\f2d9"}.ion-android-contract:before{content:"\f37d"}.ion-android-create:before{content:"\f37e"}.ion-android-delete:before{content:"\f37f"}.ion-android-desktop:before{content:"\f380"}.ion-android-document:before{content:"\f381"}.ion-android-done:before{content:"\f383"}.ion-android-done-all:before{content:"\f382"}.ion-android-download:before{content:"\f2dd"}.ion-android-drafts:before{content:"\f384"}.ion-android-exit:before{content:"\f385"}.ion-android-expand:before{content:"\f386"}.ion-android-favorite:before{content:"\f388"}.ion-android-favorite-outline:before{content:"\f387"}.ion-android-film:before{content:"\f389"}.ion-android-folder:before{content:"\f2e0"}.ion-android-folder-open:before{content:"\f38a"}.ion-android-funnel:before{content:"\f38b"}.ion-android-globe:before{content:"\f38c"}.ion-android-hand:before{content:"\f2e3"}.ion-android-hangout:before{content:"\f38d"}.ion-android-happy:before{content:"\f38e"}.ion-android-home:before{content:"\f38f"}.ion-android-image:before{content:"\f2e4"}.ion-android-laptop:before{content:"\f390"}.ion-android-list:before{content:"\f391"}.ion-android-locate:before{content:"\f2e9"}.ion-android-lock:before{content:"\f392"}.ion-android-mail:before{content:"\f2eb"}.ion-android-map:before{content:"\f393"}.ion-android-menu:before{content:"\f394"}.ion-android-microphone:before{content:"\f2ec"}.ion-android-microphone-off:before{content:"\f395"}.ion-android-more-horizontal:before{content:"\f396"}.ion-android-more-vertical:before{content:"\f397"}.ion-android-navigate:before{content:"\f398"}.ion-android-notifications:before{content:"\f39b"}.ion-android-notifications-none:before{content:"\f399"}.ion-android-notifications-off:before{content:"\f39a"}.ion-android-open:before{content:"\f39c"}.ion-android-options:before{content:"\f39d"}.ion-android-people:before{content:"\f39e"}.ion-android-person:before{content:"\f3a0"}.ion-android-person-add:before{content:"\f39f"}.ion-android-phone-landscape:before{content:"\f3a1"}.ion-android-phone-portrait:before{content:"\f3a2"}.ion-android-pin:before{content:"\f3a3"}.ion-android-plane:before{content:"\f3a4"}.ion-android-playstore:before{content:"\f2f0"}.ion-android-print:before{content:"\f3a5"}.ion-android-radio-button-off:before{content:"\f3a6"}.ion-android-radio-button-on:before{content:"\f3a7"}.ion-android-refresh:before{content:"\f3a8"}.ion-android-remove:before{content:"\f2f4"}.ion-android-remove-circle:before{content:"\f3a9"}.ion-android-restaurant:before{content:"\f3aa"}.ion-android-sad:before{content:"\f3ab"}.ion-android-search:before{content:"\f2f5"}.ion-android-send:before{content:"\f2f6"}.ion-android-settings:before{content:"\f2f7"}.ion-android-share:before{content:"\f2f8"}.ion-android-share-alt:before{content:"\f3ac"}.ion-android-star:before{content:"\f2fc"}.ion-android-star-half:before{content:"\f3ad"}.ion-android-star-outline:before{content:"\f3ae"}.ion-android-stopwatch:before{content:"\f2fd"}.ion-android-subway:before{content:"\f3af"}.ion-android-sunny:before{content:"\f3b0"}.ion-android-sync:before{content:"\f3b1"}.ion-android-textsms:before{content:"\f3b2"}.ion-android-time:before{content:"\f3b3"}.ion-android-train:before{content:"\f3b4"}.ion-android-unlock:before{content:"\f3b5"}.ion-android-upload:before{content:"\f3b6"}.ion-android-volume-down:before{content:"\f3b7"}.ion-android-volume-mute:before{content:"\f3b8"}.ion-android-volume-off:before{content:"\f3b9"}.ion-android-volume-up:before{content:"\f3ba"}.ion-android-walk:before{content:"\f3bb"}.ion-android-warning:before{content:"\f3bc"}.ion-android-watch:before{content:"\f3bd"}.ion-android-wifi:before{content:"\f305"}.ion-aperture:before{content:"\f313"}.ion-archive:before{content:"\f102"}.ion-arrow-down-a:before{content:"\f103"}.ion-arrow-down-b:before{content:"\f104"}.ion-arrow-down-c:before{content:"\f105"}.ion-arrow-expand:before{content:"\f25e"}.ion-arrow-graph-down-left:before{content:"\f25f"}.ion-arrow-graph-down-right:before{content:"\f260"}.ion-arrow-graph-up-left:before{content:"\f261"}.ion-arrow-graph-up-right:before{content:"\f262"}.ion-arrow-left-a:before{content:"\f106"}.ion-arrow-left-b:before{content:"\f107"}.ion-arrow-left-c:before{content:"\f108"}.ion-arrow-move:before{content:"\f263"}.ion-arrow-resize:before{content:"\f264"}.ion-arrow-return-left:before{content:"\f265"}.ion-arrow-return-right:before{content:"\f266"}.ion-arrow-right-a:before{content:"\f109"}.ion-arrow-right-b:before{content:"\f10a"}.ion-arrow-right-c:before{content:"\f10b"}.ion-arrow-shrink:before{content:"\f267"}.ion-arrow-swap:before{content:"\f268"}.ion-arrow-up-a:before{content:"\f10c"}.ion-arrow-up-b:before{content:"\f10d"}.ion-arrow-up-c:before{content:"\f10e"}.ion-asterisk:before{content:"\f314"}.ion-at:before{content:"\f10f"}.ion-backspace:before{content:"\f3bf"}.ion-backspace-outline:before{content:"\f3be"}.ion-bag:before{content:"\f110"}.ion-battery-charging:before{content:"\f111"}.ion-battery-empty:before{content:"\f112"}.ion-battery-full:before{content:"\f113"}.ion-battery-half:before{content:"\f114"}.ion-battery-low:before{content:"\f115"}.ion-beaker:before{content:"\f269"}.ion-beer:before{content:"\f26a"}.ion-bluetooth:before{content:"\f116"}.ion-bonfire:before{content:"\f315"}.ion-bookmark:before{content:"\f26b"}.ion-bowtie:before{content:"\f3c0"}.ion-briefcase:before{content:"\f26c"}.ion-bug:before{content:"\f2be"}.ion-calculator:before{content:"\f26d"}.ion-calendar:before{content:"\f117"}.ion-camera:before{content:"\f118"}.ion-card:before{content:"\f119"}.ion-cash:before{content:"\f316"}.ion-chatbox:before{content:"\f11b"}.ion-chatbox-working:before{content:"\f11a"}.ion-chatboxes:before{content:"\f11c"}.ion-chatbubble:before{content:"\f11e"}.ion-chatbubble-working:before{content:"\f11d"}.ion-chatbubbles:before{content:"\f11f"}.ion-checkmark:before{content:"\f122"}.ion-checkmark-circled:before{content:"\f120"}.ion-checkmark-round:before{content:"\f121"}.ion-chevron-down:before{content:"\f123"}.ion-chevron-left:before{content:"\f124"}.ion-chevron-right:before{content:"\f125"}.ion-chevron-up:before{content:"\f126"}.ion-clipboard:before{content:"\f127"}.ion-clock:before{content:"\f26e"}.ion-close:before{content:"\f12a"}.ion-close-circled:before{content:"\f128"}.ion-close-round:before{content:"\f129"}.ion-closed-captioning:before{content:"\f317"}.ion-cloud:before{content:"\f12b"}.ion-code:before{content:"\f271"}.ion-code-download:before{content:"\f26f"}.ion-code-working:before{content:"\f270"}.ion-coffee:before{content:"\f272"}.ion-compass:before{content:"\f273"}.ion-compose:before{content:"\f12c"}.ion-connection-bars:before{content:"\f274"}.ion-contrast:before{content:"\f275"}.ion-crop:before{content:"\f3c1"}.ion-cube:before{content:"\f318"}.ion-disc:before{content:"\f12d"}.ion-document:before{content:"\f12f"}.ion-document-text:before{content:"\f12e"}.ion-drag:before{content:"\f130"}.ion-earth:before{content:"\f276"}.ion-easel:before{content:"\f3c2"}.ion-edit:before{content:"\f2bf"}.ion-egg:before{content:"\f277"}.ion-eject:before{content:"\f131"}.ion-email:before{content:"\f132"}.ion-email-unread:before{content:"\f3c3"}.ion-erlenmeyer-flask:before{content:"\f3c5"}.ion-erlenmeyer-flask-bubbles:before{content:"\f3c4"}.ion-eye:before{content:"\f133"}.ion-eye-disabled:before{content:"\f306"}.ion-female:before{content:"\f278"}.ion-filing:before{content:"\f134"}.ion-film-marker:before{content:"\f135"}.ion-fireball:before{content:"\f319"}.ion-flag:before{content:"\f279"}.ion-flame:before{content:"\f31a"}.ion-flash:before{content:"\f137"}.ion-flash-off:before{content:"\f136"}.ion-folder:before{content:"\f139"}.ion-fork:before{content:"\f27a"}.ion-fork-repo:before{content:"\f2c0"}.ion-forward:before{content:"\f13a"}.ion-funnel:before{content:"\f31b"}.ion-gear-a:before{content:"\f13d"}.ion-gear-b:before{content:"\f13e"}.ion-grid:before{content:"\f13f"}.ion-hammer:before{content:"\f27b"}.ion-happy:before{content:"\f31c"}.ion-happy-outline:before{content:"\f3c6"}.ion-headphone:before{content:"\f140"}.ion-heart:before{content:"\f141"}.ion-heart-broken:before{content:"\f31d"}.ion-help:before{content:"\f143"}.ion-help-buoy:before{content:"\f27c"}.ion-help-circled:before{content:"\f142"}.ion-home:before{content:"\f144"}.ion-icecream:before{content:"\f27d"}.ion-image:before{content:"\f147"}.ion-images:before{content:"\f148"}.ion-information:before{content:"\f14a"}.ion-information-circled:before{content:"\f149"}.ion-ionic:before{content:"\f14b"}.ion-ios-alarm:before{content:"\f3c8"}.ion-ios-alarm-outline:before{content:"\f3c7"}.ion-ios-albums:before{content:"\f3ca"}.ion-ios-albums-outline:before{content:"\f3c9"}.ion-ios-americanfootball:before{content:"\f3cc"}.ion-ios-americanfootball-outline:before{content:"\f3cb"}.ion-ios-analytics:before{content:"\f3ce"}.ion-ios-analytics-outline:before{content:"\f3cd"}.ion-ios-arrow-back:before{content:"\f3cf"}.ion-ios-arrow-down:before{content:"\f3d0"}.ion-ios-arrow-forward:before{content:"\f3d1"}.ion-ios-arrow-left:before{content:"\f3d2"}.ion-ios-arrow-right:before{content:"\f3d3"}.ion-ios-arrow-thin-down:before{content:"\f3d4"}.ion-ios-arrow-thin-left:before{content:"\f3d5"}.ion-ios-arrow-thin-right:before{content:"\f3d6"}.ion-ios-arrow-thin-up:before{content:"\f3d7"}.ion-ios-arrow-up:before{content:"\f3d8"}.ion-ios-at:before{content:"\f3da"}.ion-ios-at-outline:before{content:"\f3d9"}.ion-ios-barcode:before{content:"\f3dc"}.ion-ios-barcode-outline:before{content:"\f3db"}.ion-ios-baseball:before{content:"\f3de"}.ion-ios-baseball-outline:before{content:"\f3dd"}.ion-ios-basketball:before{content:"\f3e0"}.ion-ios-basketball-outline:before{content:"\f3df"}.ion-ios-bell:before{content:"\f3e2"}.ion-ios-bell-outline:before{content:"\f3e1"}.ion-ios-body:before{content:"\f3e4"}.ion-ios-body-outline:before{content:"\f3e3"}.ion-ios-bolt:before{content:"\f3e6"}.ion-ios-bolt-outline:before{content:"\f3e5"}.ion-ios-book:before{content:"\f3e8"}.ion-ios-book-outline:before{content:"\f3e7"}.ion-ios-bookmarks:before{content:"\f3ea"}.ion-ios-bookmarks-outline:before{content:"\f3e9"}.ion-ios-box:before{content:"\f3ec"}.ion-ios-box-outline:before{content:"\f3eb"}.ion-ios-briefcase:before{content:"\f3ee"}.ion-ios-briefcase-outline:before{content:"\f3ed"}.ion-ios-browsers:before{content:"\f3f0"}.ion-ios-browsers-outline:before{content:"\f3ef"}.ion-ios-calculator:before{content:"\f3f2"}.ion-ios-calculator-outline:before{content:"\f3f1"}.ion-ios-calendar:before{content:"\f3f4"}.ion-ios-calendar-outline:before{content:"\f3f3"}.ion-ios-camera:before{content:"\f3f6"}.ion-ios-camera-outline:before{content:"\f3f5"}.ion-ios-cart:before{content:"\f3f8"}.ion-ios-cart-outline:before{content:"\f3f7"}.ion-ios-chatboxes:before{content:"\f3fa"}.ion-ios-chatboxes-outline:before{content:"\f3f9"}.ion-ios-chatbubble:before{content:"\f3fc"}.ion-ios-chatbubble-outline:before{content:"\f3fb"}.ion-ios-checkmark:before{content:"\f3ff"}.ion-ios-checkmark-empty:before{content:"\f3fd"}.ion-ios-checkmark-outline:before{content:"\f3fe"}.ion-ios-circle-filled:before{content:"\f400"}.ion-ios-circle-outline:before{content:"\f401"}.ion-ios-clock:before{content:"\f403"}.ion-ios-clock-outline:before{content:"\f402"}.ion-ios-close:before{content:"\f406"}.ion-ios-close-empty:before{content:"\f404"}.ion-ios-close-outline:before{content:"\f405"}.ion-ios-cloud:before{content:"\f40c"}.ion-ios-cloud-download:before{content:"\f408"}.ion-ios-cloud-download-outline:before{content:"\f407"}.ion-ios-cloud-outline:before{content:"\f409"}.ion-ios-cloud-upload:before{content:"\f40b"}.ion-ios-cloud-upload-outline:before{content:"\f40a"}.ion-ios-cloudy:before{content:"\f410"}.ion-ios-cloudy-night:before{content:"\f40e"}.ion-ios-cloudy-night-outline:before{content:"\f40d"}.ion-ios-cloudy-outline:before{content:"\f40f"}.ion-ios-cog:before{content:"\f412"}.ion-ios-cog-outline:before{content:"\f411"}.ion-ios-color-filter:before{content:"\f414"}.ion-ios-color-filter-outline:before{content:"\f413"}.ion-ios-color-wand:before{content:"\f416"}.ion-ios-color-wand-outline:before{content:"\f415"}.ion-ios-compose:before{content:"\f418"}.ion-ios-compose-outline:before{content:"\f417"}.ion-ios-contact:before{content:"\f41a"}.ion-ios-contact-outline:before{content:"\f419"}.ion-ios-copy:before{content:"\f41c"}.ion-ios-copy-outline:before{content:"\f41b"}.ion-ios-crop:before{content:"\f41e"}.ion-ios-crop-strong:before{content:"\f41d"}.ion-ios-download:before{content:"\f420"}.ion-ios-download-outline:before{content:"\f41f"}.ion-ios-drag:before{content:"\f421"}.ion-ios-email:before{content:"\f423"}.ion-ios-email-outline:before{content:"\f422"}.ion-ios-eye:before{content:"\f425"}.ion-ios-eye-outline:before{content:"\f424"}.ion-ios-fastforward:before{content:"\f427"}.ion-ios-fastforward-outline:before{content:"\f426"}.ion-ios-filing:before{content:"\f429"}.ion-ios-filing-outline:before{content:"\f428"}.ion-ios-film:before{content:"\f42b"}.ion-ios-film-outline:before{content:"\f42a"}.ion-ios-flag:before{content:"\f42d"}.ion-ios-flag-outline:before{content:"\f42c"}.ion-ios-flame:before{content:"\f42f"}.ion-ios-flame-outline:before{content:"\f42e"}.ion-ios-flask:before{content:"\f431"}.ion-ios-flask-outline:before{content:"\f430"}.ion-ios-flower:before{content:"\f433"}.ion-ios-flower-outline:before{content:"\f432"}.ion-ios-folder:before{content:"\f435"}.ion-ios-folder-outline:before{content:"\f434"}.ion-ios-football:before{content:"\f437"}.ion-ios-football-outline:before{content:"\f436"}.ion-ios-game-controller-a:before{content:"\f439"}.ion-ios-game-controller-a-outline:before{content:"\f438"}.ion-ios-game-controller-b:before{content:"\f43b"}.ion-ios-game-controller-b-outline:before{content:"\f43a"}.ion-ios-gear:before{content:"\f43d"}.ion-ios-gear-outline:before{content:"\f43c"}.ion-ios-glasses:before{content:"\f43f"}.ion-ios-glasses-outline:before{content:"\f43e"}.ion-ios-grid-view:before{content:"\f441"}.ion-ios-grid-view-outline:before{content:"\f440"}.ion-ios-heart:before{content:"\f443"}.ion-ios-heart-outline:before{content:"\f442"}.ion-ios-help:before{content:"\f446"}.ion-ios-help-empty:before{content:"\f444"}.ion-ios-help-outline:before{content:"\f445"}.ion-ios-home:before{content:"\f448"}.ion-ios-home-outline:before{content:"\f447"}.ion-ios-infinite:before{content:"\f44a"}.ion-ios-infinite-outline:before{content:"\f449"}.ion-ios-information:before{content:"\f44d"}.ion-ios-information-empty:before{content:"\f44b"}.ion-ios-information-outline:before{content:"\f44c"}.ion-ios-ionic-outline:before{content:"\f44e"}.ion-ios-keypad:before{content:"\f450"}.ion-ios-keypad-outline:before{content:"\f44f"}.ion-ios-lightbulb:before{content:"\f452"}.ion-ios-lightbulb-outline:before{content:"\f451"}.ion-ios-list:before{content:"\f454"}.ion-ios-list-outline:before{content:"\f453"}.ion-ios-location:before{content:"\f456"}.ion-ios-location-outline:before{content:"\f455"}.ion-ios-locked:before{content:"\f458"}.ion-ios-locked-outline:before{content:"\f457"}.ion-ios-loop:before{content:"\f45a"}.ion-ios-loop-strong:before{content:"\f459"}.ion-ios-medical:before{content:"\f45c"}.ion-ios-medical-outline:before{content:"\f45b"}.ion-ios-medkit:before{content:"\f45e"}.ion-ios-medkit-outline:before{content:"\f45d"}.ion-ios-mic:before{content:"\f461"}.ion-ios-mic-off:before{content:"\f45f"}.ion-ios-mic-outline:before{content:"\f460"}.ion-ios-minus:before{content:"\f464"}.ion-ios-minus-empty:before{content:"\f462"}.ion-ios-minus-outline:before{content:"\f463"}.ion-ios-monitor:before{content:"\f466"}.ion-ios-monitor-outline:before{content:"\f465"}.ion-ios-moon:before{content:"\f468"}.ion-ios-moon-outline:before{content:"\f467"}.ion-ios-more:before{content:"\f46a"}.ion-ios-more-outline:before{content:"\f469"}.ion-ios-musical-note:before{content:"\f46b"}.ion-ios-musical-notes:before{content:"\f46c"}.ion-ios-navigate:before{content:"\f46e"}.ion-ios-navigate-outline:before{content:"\f46d"}.ion-ios-nutrition:before{content:"\f470"}.ion-ios-nutrition-outline:before{content:"\f46f"}.ion-ios-paper:before{content:"\f472"}.ion-ios-paper-outline:before{content:"\f471"}.ion-ios-paperplane:before{content:"\f474"}.ion-ios-paperplane-outline:before{content:"\f473"}.ion-ios-partlysunny:before{content:"\f476"}.ion-ios-partlysunny-outline:before{content:"\f475"}.ion-ios-pause:before{content:"\f478"}.ion-ios-pause-outline:before{content:"\f477"}.ion-ios-paw:before{content:"\f47a"}.ion-ios-paw-outline:before{content:"\f479"}.ion-ios-people:before{content:"\f47c"}.ion-ios-people-outline:before{content:"\f47b"}.ion-ios-person:before{content:"\f47e"}.ion-ios-person-outline:before{content:"\f47d"}.ion-ios-personadd:before{content:"\f480"}.ion-ios-personadd-outline:before{content:"\f47f"}.ion-ios-photos:before{content:"\f482"}.ion-ios-photos-outline:before{content:"\f481"}.ion-ios-pie:before{content:"\f484"}.ion-ios-pie-outline:before{content:"\f483"}.ion-ios-pint:before{content:"\f486"}.ion-ios-pint-outline:before{content:"\f485"}.ion-ios-play:before{content:"\f488"}.ion-ios-play-outline:before{content:"\f487"}.ion-ios-plus:before{content:"\f48b"}.ion-ios-plus-empty:before{content:"\f489"}.ion-ios-plus-outline:before{content:"\f48a"}.ion-ios-pricetag:before{content:"\f48d"}.ion-ios-pricetag-outline:before{content:"\f48c"}.ion-ios-pricetags:before{content:"\f48f"}.ion-ios-pricetags-outline:before{content:"\f48e"}.ion-ios-printer:before{content:"\f491"}.ion-ios-printer-outline:before{content:"\f490"}.ion-ios-pulse:before{content:"\f493"}.ion-ios-pulse-strong:before{content:"\f492"}.ion-ios-rainy:before{content:"\f495"}.ion-ios-rainy-outline:before{content:"\f494"}.ion-ios-recording:before{content:"\f497"}.ion-ios-recording-outline:before{content:"\f496"}.ion-ios-redo:before{content:"\f499"}.ion-ios-redo-outline:before{content:"\f498"}.ion-ios-refresh:before{content:"\f49c"}.ion-ios-refresh-empty:before{content:"\f49a"}.ion-ios-refresh-outline:before{content:"\f49b"}.ion-ios-reload:before{content:"\f49d"}.ion-ios-reverse-camera:before{content:"\f49f"}.ion-ios-reverse-camera-outline:before{content:"\f49e"}.ion-ios-rewind:before{content:"\f4a1"}.ion-ios-rewind-outline:before{content:"\f4a0"}.ion-ios-rose:before{content:"\f4a3"}.ion-ios-rose-outline:before{content:"\f4a2"}.ion-ios-search:before{content:"\f4a5"}.ion-ios-search-strong:before{content:"\f4a4"}.ion-ios-settings:before{content:"\f4a7"}.ion-ios-settings-strong:before{content:"\f4a6"}.ion-ios-shuffle:before{content:"\f4a9"}.ion-ios-shuffle-strong:before{content:"\f4a8"}.ion-ios-skipbackward:before{content:"\f4ab"}.ion-ios-skipbackward-outline:before{content:"\f4aa"}.ion-ios-skipforward:before{content:"\f4ad"}.ion-ios-skipforward-outline:before{content:"\f4ac"}.ion-ios-snowy:before{content:"\f4ae"}.ion-ios-speedometer:before{content:"\f4b0"}.ion-ios-speedometer-outline:before{content:"\f4af"}.ion-ios-star:before{content:"\f4b3"}.ion-ios-star-half:before{content:"\f4b1"}.ion-ios-star-outline:before{content:"\f4b2"}.ion-ios-stopwatch:before{content:"\f4b5"}.ion-ios-stopwatch-outline:before{content:"\f4b4"}.ion-ios-sunny:before{content:"\f4b7"}.ion-ios-sunny-outline:before{content:"\f4b6"}.ion-ios-telephone:before{content:"\f4b9"}.ion-ios-telephone-outline:before{content:"\f4b8"}.ion-ios-tennisball:before{content:"\f4bb"}.ion-ios-tennisball-outline:before{content:"\f4ba"}.ion-ios-thunderstorm:before{content:"\f4bd"}.ion-ios-thunderstorm-outline:before{content:"\f4bc"}.ion-ios-time:before{content:"\f4bf"}.ion-ios-time-outline:before{content:"\f4be"}.ion-ios-timer:before{content:"\f4c1"}.ion-ios-timer-outline:before{content:"\f4c0"}.ion-ios-toggle:before{content:"\f4c3"}.ion-ios-toggle-outline:before{content:"\f4c2"}.ion-ios-trash:before{content:"\f4c5"}.ion-ios-trash-outline:before{content:"\f4c4"}.ion-ios-undo:before{content:"\f4c7"}.ion-ios-undo-outline:before{content:"\f4c6"}.ion-ios-unlocked:before{content:"\f4c9"}.ion-ios-unlocked-outline:before{content:"\f4c8"}.ion-ios-upload:before{content:"\f4cb"}.ion-ios-upload-outline:before{content:"\f4ca"}.ion-ios-videocam:before{content:"\f4cd"}.ion-ios-videocam-outline:before{content:"\f4cc"}.ion-ios-volume-high:before{content:"\f4ce"}.ion-ios-volume-low:before{content:"\f4cf"}.ion-ios-wineglass:before{content:"\f4d1"}.ion-ios-wineglass-outline:before{content:"\f4d0"}.ion-ios-world:before{content:"\f4d3"}.ion-ios-world-outline:before{content:"\f4d2"}.ion-ipad:before{content:"\f1f9"}.ion-iphone:before{content:"\f1fa"}.ion-ipod:before{content:"\f1fb"}.ion-jet:before{content:"\f295"}.ion-key:before{content:"\f296"}.ion-knife:before{content:"\f297"}.ion-laptop:before{content:"\f1fc"}.ion-leaf:before{content:"\f1fd"}.ion-levels:before{content:"\f298"}.ion-lightbulb:before{content:"\f299"}.ion-link:before{content:"\f1fe"}.ion-load-a:before{content:"\f29a"}.ion-load-b:before{content:"\f29b"}.ion-load-c:before{content:"\f29c"}.ion-load-d:before{content:"\f29d"}.ion-location:before{content:"\f1ff"}.ion-lock-combination:before{content:"\f4d4"}.ion-locked:before{content:"\f200"}.ion-log-in:before{content:"\f29e"}.ion-log-out:before{content:"\f29f"}.ion-loop:before{content:"\f201"}.ion-magnet:before{content:"\f2a0"}.ion-male:before{content:"\f2a1"}.ion-man:before{content:"\f202"}.ion-map:before{content:"\f203"}.ion-medkit:before{content:"\f2a2"}.ion-merge:before{content:"\f33f"}.ion-mic-a:before{content:"\f204"}.ion-mic-b:before{content:"\f205"}.ion-mic-c:before{content:"\f206"}.ion-minus:before{content:"\f209"}.ion-minus-circled:before{content:"\f207"}.ion-minus-round:before{content:"\f208"}.ion-model-s:before{content:"\f2c1"}.ion-monitor:before{content:"\f20a"}.ion-more:before{content:"\f20b"}.ion-mouse:before{content:"\f340"}.ion-music-note:before{content:"\f20c"}.ion-navicon:before{content:"\f20e"}.ion-navicon-round:before{content:"\f20d"}.ion-navigate:before{content:"\f2a3"}.ion-network:before{content:"\f341"}.ion-no-smoking:before{content:"\f2c2"}.ion-nuclear:before{content:"\f2a4"}.ion-outlet:before{content:"\f342"}.ion-paintbrush:before{content:"\f4d5"}.ion-paintbucket:before{content:"\f4d6"}.ion-paper-airplane:before{content:"\f2c3"}.ion-paperclip:before{content:"\f20f"}.ion-pause:before{content:"\f210"}.ion-person:before{content:"\f213"}.ion-person-add:before{content:"\f211"}.ion-person-stalker:before{content:"\f212"}.ion-pie-graph:before{content:"\f2a5"}.ion-pin:before{content:"\f2a6"}.ion-pinpoint:before{content:"\f2a7"}.ion-pizza:before{content:"\f2a8"}.ion-plane:before{content:"\f214"}.ion-planet:before{content:"\f343"}.ion-play:before{content:"\f215"}.ion-playstation:before{content:"\f30a"}.ion-plus:before{content:"\f218"}.ion-plus-circled:before{content:"\f216"}.ion-plus-round:before{content:"\f217"}.ion-podium:before{content:"\f344"}.ion-pound:before{content:"\f219"}.ion-power:before{content:"\f2a9"}.ion-pricetag:before{content:"\f2aa"}.ion-pricetags:before{content:"\f2ab"}.ion-printer:before{content:"\f21a"}.ion-pull-request:before{content:"\f345"}.ion-qr-scanner:before{content:"\f346"}.ion-quote:before{content:"\f347"}.ion-radio-waves:before{content:"\f2ac"}.ion-record:before{content:"\f21b"}.ion-refresh:before{content:"\f21c"}.ion-reply:before{content:"\f21e"}.ion-reply-all:before{content:"\f21d"}.ion-ribbon-a:before{content:"\f348"}.ion-ribbon-b:before{content:"\f349"}.ion-sad:before{content:"\f34a"}.ion-sad-outline:before{content:"\f4d7"}.ion-scissors:before{content:"\f34b"}.ion-search:before{content:"\f21f"}.ion-settings:before{content:"\f2ad"}.ion-share:before{content:"\f220"}.ion-shuffle:before{content:"\f221"}.ion-skip-backward:before{content:"\f222"}.ion-skip-forward:before{content:"\f223"}.ion-social-android:before{content:"\f225"}.ion-social-android-outline:before{content:"\f224"}.ion-social-angular:before{content:"\f4d9"}.ion-social-angular-outline:before{content:"\f4d8"}.ion-social-apple:before{content:"\f227"}.ion-social-apple-outline:before{content:"\f226"}.ion-social-bitcoin:before{content:"\f2af"}.ion-social-bitcoin-outline:before{content:"\f2ae"}.ion-social-buffer:before{content:"\f229"}.ion-social-buffer-outline:before{content:"\f228"}.ion-social-chrome:before{content:"\f4db"}.ion-social-chrome-outline:before{content:"\f4da"}.ion-social-codepen:before{content:"\f4dd"}.ion-social-codepen-outline:before{content:"\f4dc"}.ion-social-css3:before{content:"\f4df"}.ion-social-css3-outline:before{content:"\f4de"}.ion-social-designernews:before{content:"\f22b"}.ion-social-designernews-outline:before{content:"\f22a"}.ion-social-dribbble:before{content:"\f22d"}.ion-social-dribbble-outline:before{content:"\f22c"}.ion-social-dropbox:before{content:"\f22f"}.ion-social-dropbox-outline:before{content:"\f22e"}.ion-social-euro:before{content:"\f4e1"}.ion-social-euro-outline:before{content:"\f4e0"}.ion-social-facebook:before{content:"\f231"}.ion-social-facebook-outline:before{content:"\f230"}.ion-social-foursquare:before{content:"\f34d"}.ion-social-foursquare-outline:before{content:"\f34c"}.ion-social-freebsd-devil:before{content:"\f2c4"}.ion-social-github:before{content:"\f233"}.ion-social-github-outline:before{content:"\f232"}.ion-social-google:before{content:"\f34f"}.ion-social-google-outline:before{content:"\f34e"}.ion-social-googleplus:before{content:"\f235"}.ion-social-googleplus-outline:before{content:"\f234"}.ion-social-hackernews:before{content:"\f237"}.ion-social-hackernews-outline:before{content:"\f236"}.ion-social-html5:before{content:"\f4e3"}.ion-social-html5-outline:before{content:"\f4e2"}.ion-social-instagram:before{content:"\f351"}.ion-social-instagram-outline:before{content:"\f350"}.ion-social-javascript:before{content:"\f4e5"}.ion-social-javascript-outline:before{content:"\f4e4"}.ion-social-linkedin:before{content:"\f239"}.ion-social-linkedin-outline:before{content:"\f238"}.ion-social-markdown:before{content:"\f4e6"}.ion-social-nodejs:before{content:"\f4e7"}.ion-social-octocat:before{content:"\f4e8"}.ion-social-pinterest:before{content:"\f2b1"}.ion-social-pinterest-outline:before{content:"\f2b0"}.ion-social-python:before{content:"\f4e9"}.ion-social-reddit:before{content:"\f23b"}.ion-social-reddit-outline:before{content:"\f23a"}.ion-social-rss:before{content:"\f23d"}.ion-social-rss-outline:before{content:"\f23c"}.ion-social-sass:before{content:"\f4ea"}.ion-social-skype:before{content:"\f23f"}.ion-social-skype-outline:before{content:"\f23e"}.ion-social-snapchat:before{content:"\f4ec"}.ion-social-snapchat-outline:before{content:"\f4eb"}.ion-social-tumblr:before{content:"\f241"}.ion-social-tumblr-outline:before{content:"\f240"}.ion-social-tux:before{content:"\f2c5"}.ion-social-twitch:before{content:"\f4ee"}.ion-social-twitch-outline:before{content:"\f4ed"}.ion-social-twitter:before{content:"\f243"}.ion-social-twitter-outline:before{content:"\f242"}.ion-social-usd:before{content:"\f353"}.ion-social-usd-outline:before{content:"\f352"}.ion-social-vimeo:before{content:"\f245"}.ion-social-vimeo-outline:before{content:"\f244"}.ion-social-whatsapp:before{content:"\f4f0"}.ion-social-whatsapp-outline:before{content:"\f4ef"}.ion-social-windows:before{content:"\f247"}.ion-social-windows-outline:before{content:"\f246"}.ion-social-wordpress:before{content:"\f249"}.ion-social-wordpress-outline:before{content:"\f248"}.ion-social-yahoo:before{content:"\f24b"}.ion-social-yahoo-outline:before{content:"\f24a"}.ion-social-yen:before{content:"\f4f2"}.ion-social-yen-outline:before{content:"\f4f1"}.ion-social-youtube:before{content:"\f24d"}.ion-social-youtube-outline:before{content:"\f24c"}.ion-soup-can:before{content:"\f4f4"}.ion-soup-can-outline:before{content:"\f4f3"}.ion-speakerphone:before{content:"\f2b2"}.ion-speedometer:before{content:"\f2b3"}.ion-spoon:before{content:"\f2b4"}.ion-star:before{content:"\f24e"}.ion-stats-bars:before{content:"\f2b5"}.ion-steam:before{content:"\f30b"}.ion-stop:before{content:"\f24f"}.ion-thermometer:before{content:"\f2b6"}.ion-thumbsdown:before{content:"\f250"}.ion-thumbsup:before{content:"\f251"}.ion-toggle:before{content:"\f355"}.ion-toggle-filled:before{content:"\f354"}.ion-transgender:before{content:"\f4f5"}.ion-trash-a:before{content:"\f252"}.ion-trash-b:before{content:"\f253"}.ion-trophy:before{content:"\f356"}.ion-tshirt:before{content:"\f4f7"}.ion-tshirt-outline:before{content:"\f4f6"}.ion-umbrella:before{content:"\f2b7"}.ion-university:before{content:"\f357"}.ion-unlocked:before{content:"\f254"}.ion-upload:before{content:"\f255"}.ion-usb:before{content:"\f2b8"}.ion-videocamera:before{content:"\f256"}.ion-volume-high:before{content:"\f257"}.ion-volume-low:before{content:"\f258"}.ion-volume-medium:before{content:"\f259"}.ion-volume-mute:before{content:"\f25a"}.ion-wand:before{content:"\f358"}.ion-waterdrop:before{content:"\f25b"}.ion-wifi:before{content:"\f25c"}.ion-wineglass:before{content:"\f2b9"}.ion-woman:before{content:"\f25d"}.ion-wrench:before{content:"\f2ba"}.ion-xbox:before{content:"\f30c"} \ No newline at end of file diff --git a/theme/bootstrap/download/jquery-ui.min.js b/theme/bootstrap/download/jquery-ui.min.js new file mode 100644 index 0000000..7525e71 --- /dev/null +++ b/theme/bootstrap/download/jquery-ui.min.js @@ -0,0 +1,13 @@ +/*! jQuery UI - v1.11.4 - 2015-03-11 +* http://jqueryui.com +* Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js, menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js, sortable.js, spinner.js, tabs.js, tooltip.js +* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */ + +(function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap='#"+a+"']")[0],!!o&&i(o)):!1):(/^(input|select|textarea|button|object)$/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}function s(e){for(var t,i;e.length&&e[0]!==document;){if(t=e.css("position"),("absolute"===t||"relative"===t||"fixed"===t)&&(i=parseInt(e.css("zIndex"),10),!isNaN(i)&&0!==i))return i;e=e.parent()}return 0}function n(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},e.extend(this._defaults,this.regional[""]),this.regional.en=e.extend(!0,{},this.regional[""]),this.regional["en-US"]=e.extend(!0,{},this.regional.en),this.dpDiv=a(e("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function a(t){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return t.delegate(i,"mouseout",function(){e(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).removeClass("ui-datepicker-next-hover")}).delegate(i,"mouseover",o)}function o(){e.datepicker._isDisabledDatepicker(v.inline?v.dpDiv.parent()[0]:v.input[0])||(e(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),e(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).addClass("ui-datepicker-next-hover"))}function r(t,i){e.extend(t,i);for(var s in i)null==i[s]&&(t[s]=i[s]);return t}function h(e){return function(){var t=this.element.val();e.apply(this,arguments),this._refresh(),t!==this.element.val()&&this._trigger("change")}}e.ui=e.ui||{},e.extend(e.ui,{version:"1.11.4",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({scrollParent:function(t){var i=this.css("position"),s="absolute"===i,n=t?/(auto|scroll|hidden)/:/(auto|scroll)/,a=this.parents().filter(function(){var t=e(this);return s&&"static"===t.css("position")?!1:n.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==i&&a.length?a:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,"tabindex")))},tabbable:function(i){var s=e.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+"px")})},e.fn["outer"+i]=function(t,n){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(e+".ui-disableSelection",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(t){if(void 0!==t)return this.css("zIndex",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var l=0,u=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,"events"),s&&s.remove&&e(n).triggerHandler("remove")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,n=u.call(arguments,1),a=0,o=n.length;o>a;a++)for(i in n[a])s=n[a][i],n[a].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(n){var a="string"==typeof n,o=u.call(arguments,1),r=this;return a?this.each(function(){var i,a=e.data(this,s);return"instance"===n?(r=a,!1):a?e.isFunction(a[n])&&"_"!==n.charAt(0)?(i=a[n].apply(a,o),i!==a&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+n+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+n+"'")}):(o.length&&(n=e.widget.extend.apply(null,[n].concat(o))),this.each(function(){var t=e.data(this,s);t?(t.option(n||{}),t._init&&t._init()):e.data(this,s,new i(n,this))})),r}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=l++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(t,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(i).undelegate(i),this.bindings=e(this.bindings.not(t).get()),this.focusable=e(this.focusable.not(t).get()),this.hoverable=e(this.hoverable.not(t).get())},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget;var d=!1;e(document).mouseup(function(){d=!1}),e.widget("ui.mouse",{version:"1.11.4",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!d){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var i=this,s=1===t.which,n="string"==typeof this.options.cancel&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(t)!==!1,!this._mouseStarted)?(t.preventDefault(),!0):(!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return i._mouseMove(e)},this._mouseUpDelegate=function(e){return i._mouseUp(e)},this.document.bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),d=!0,!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button)return this._mouseUp(t);if(!t.which)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){return this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),d=!1,!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),function(){function t(e,t,i){return[parseFloat(e[0])*(p.test(e[0])?t/100:1),parseFloat(e[1])*(p.test(e[1])?i/100:1)]}function i(t,i){return parseInt(e.css(t,i),10)||0}function s(t){var i=t[0];return 9===i.nodeType?{width:t.width(),height:t.height(),offset:{top:0,left:0}}:e.isWindow(i)?{width:t.width(),height:t.height(),offset:{top:t.scrollTop(),left:t.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:t.outerWidth(),height:t.outerHeight(),offset:t.offset()}}e.ui=e.ui||{};var n,a,o=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,u=/top|center|bottom/,d=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,p=/%$/,f=e.fn.position;e.position={scrollbarWidth:function(){if(void 0!==n)return n;var t,i,s=e("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),a=s.children()[0];return e("body").append(s),t=a.offsetWidth,s.css("overflow","scroll"),i=a.offsetWidth,t===i&&(i=s[0].clientWidth),s.remove(),n=t-i},getScrollInfo:function(t){var i=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),s=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),n="scroll"===i||"auto"===i&&t.width<t.element[0].scrollWidth,a="scroll"===s||"auto"===s&&t.height<t.element[0].scrollHeight;return{width:a?e.position.scrollbarWidth():0,height:n?e.position.scrollbarWidth():0}},getWithinInfo:function(t){var i=e(t||window),s=e.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType;return{element:i,isWindow:s,isDocument:n,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s||n?i.width():i.outerWidth(),height:s||n?i.height():i.outerHeight()}}},e.fn.position=function(n){if(!n||!n.of)return f.apply(this,arguments);n=e.extend({},n);var p,m,g,v,y,b,_=e(n.of),x=e.position.getWithinInfo(n.within),w=e.position.getScrollInfo(x),k=(n.collision||"flip").split(" "),T={};return b=s(_),_[0].preventDefault&&(n.at="left top"),m=b.width,g=b.height,v=b.offset,y=e.extend({},v),e.each(["my","at"],function(){var e,t,i=(n[this]||"").split(" ");1===i.length&&(i=l.test(i[0])?i.concat(["center"]):u.test(i[0])?["center"].concat(i):["center","center"]),i[0]=l.test(i[0])?i[0]:"center",i[1]=u.test(i[1])?i[1]:"center",e=d.exec(i[0]),t=d.exec(i[1]),T[this]=[e?e[0]:0,t?t[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===k.length&&(k[1]=k[0]),"right"===n.at[0]?y.left+=m:"center"===n.at[0]&&(y.left+=m/2),"bottom"===n.at[1]?y.top+=g:"center"===n.at[1]&&(y.top+=g/2),p=t(T.at,m,g),y.left+=p[0],y.top+=p[1],this.each(function(){var s,l,u=e(this),d=u.outerWidth(),c=u.outerHeight(),f=i(this,"marginLeft"),b=i(this,"marginTop"),D=d+f+i(this,"marginRight")+w.width,S=c+b+i(this,"marginBottom")+w.height,M=e.extend({},y),C=t(T.my,u.outerWidth(),u.outerHeight());"right"===n.my[0]?M.left-=d:"center"===n.my[0]&&(M.left-=d/2),"bottom"===n.my[1]?M.top-=c:"center"===n.my[1]&&(M.top-=c/2),M.left+=C[0],M.top+=C[1],a||(M.left=h(M.left),M.top=h(M.top)),s={marginLeft:f,marginTop:b},e.each(["left","top"],function(t,i){e.ui.position[k[t]]&&e.ui.position[k[t]][i](M,{targetWidth:m,targetHeight:g,elemWidth:d,elemHeight:c,collisionPosition:s,collisionWidth:D,collisionHeight:S,offset:[p[0]+C[0],p[1]+C[1]],my:n.my,at:n.at,within:x,elem:u})}),n.using&&(l=function(e){var t=v.left-M.left,i=t+m-d,s=v.top-M.top,a=s+g-c,h={target:{element:_,left:v.left,top:v.top,width:m,height:g},element:{element:u,left:M.left,top:M.top,width:d,height:c},horizontal:0>i?"left":t>0?"right":"center",vertical:0>a?"top":s>0?"bottom":"middle"};d>m&&m>r(t+i)&&(h.horizontal="center"),c>g&&g>r(s+a)&&(h.vertical="middle"),h.important=o(r(t),r(i))>o(r(s),r(a))?"horizontal":"vertical",n.using.call(this,e,h)}),u.offset(e.extend(M,{using:l}))})},e.ui.position={fit:{left:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=e.left-t.collisionPosition.marginLeft,h=n-r,l=r+t.collisionWidth-a-n;t.collisionWidth>a?h>0&&0>=l?(i=e.left+h+t.collisionWidth-a-n,e.left+=h-i):e.left=l>0&&0>=h?n:h>l?n+a-t.collisionWidth:n:h>0?e.left+=h:l>0?e.left-=l:e.left=o(e.left-r,e.left)},top:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollTop:s.offset.top,a=t.within.height,r=e.top-t.collisionPosition.marginTop,h=n-r,l=r+t.collisionHeight-a-n;t.collisionHeight>a?h>0&&0>=l?(i=e.top+h+t.collisionHeight-a-n,e.top+=h-i):e.top=l>0&&0>=h?n:h>l?n+a-t.collisionHeight:n:h>0?e.top+=h:l>0?e.top-=l:e.top=o(e.top-r,e.top)}},flip:{left:function(e,t){var i,s,n=t.within,a=n.offset.left+n.scrollLeft,o=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=e.left-t.collisionPosition.marginLeft,u=l-h,d=l+t.collisionWidth-o-h,c="left"===t.my[0]?-t.elemWidth:"right"===t.my[0]?t.elemWidth:0,p="left"===t.at[0]?t.targetWidth:"right"===t.at[0]?-t.targetWidth:0,f=-2*t.offset[0];0>u?(i=e.left+c+p+f+t.collisionWidth-o-a,(0>i||r(u)>i)&&(e.left+=c+p+f)):d>0&&(s=e.left-t.collisionPosition.marginLeft+c+p+f-h,(s>0||d>r(s))&&(e.left+=c+p+f))},top:function(e,t){var i,s,n=t.within,a=n.offset.top+n.scrollTop,o=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=e.top-t.collisionPosition.marginTop,u=l-h,d=l+t.collisionHeight-o-h,c="top"===t.my[1],p=c?-t.elemHeight:"bottom"===t.my[1]?t.elemHeight:0,f="top"===t.at[1]?t.targetHeight:"bottom"===t.at[1]?-t.targetHeight:0,m=-2*t.offset[1];0>u?(s=e.top+p+f+m+t.collisionHeight-o-a,(0>s||r(u)>s)&&(e.top+=p+f+m)):d>0&&(i=e.top-t.collisionPosition.marginTop+p+f+m-h,(i>0||d>r(i))&&(e.top+=p+f+m))}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments),e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments),e.ui.position.fit.top.apply(this,arguments)}}},function(){var t,i,s,n,o,r=document.getElementsByTagName("body")[0],h=document.createElement("div");t=document.createElement(r?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},r&&e.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)t.style[o]=s[o];t.appendChild(h),i=r||document.documentElement,i.insertBefore(t,i.firstChild),h.style.cssText="position: absolute; left: 10.7432222px;",n=e(h).offset().left,a=n>10&&11>n,t.innerHTML="",i.removeChild(t)}()}(),e.ui.position,e.widget("ui.accordion",{version:"1.11.4",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var t=this.options;this.prevShow=this.prevHide=e(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),t.collapsible||t.active!==!1&&null!=t.active||(t.active=0),this._processPanels(),0>t.active&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():e()}},_createIcons:function(){var t=this.options.icons;t&&(e("<span>").addClass("ui-accordion-header-icon ui-icon "+t.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(t.header).addClass(t.activeHeader),this.headers.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").removeUniqueId(),this._destroyIcons(),e=this.headers.next().removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").css("display","").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&e.css("height","")},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):("event"===e&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(t)),this._super(e,t),"collapsible"!==e||t||this.options.active!==!1||this._activate(0),"icons"===e&&(this._destroyIcons(),t&&this._createIcons()),"disabled"===e&&(this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!t)),void 0)},_keydown:function(t){if(!t.altKey&&!t.ctrlKey){var i=e.ui.keyCode,s=this.headers.length,n=this.headers.index(t.target),a=!1;switch(t.keyCode){case i.RIGHT:case i.DOWN:a=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:a=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(t);break;case i.HOME:a=this.headers[0];break;case i.END:a=this.headers[s-1]}a&&(e(t.target).attr("tabIndex",-1),e(a).attr("tabIndex",0),a.focus(),t.preventDefault())}},_panelKeyDown:function(t){t.keyCode===e.ui.keyCode.UP&&t.ctrlKey&&e(t.currentTarget).prev().focus()},refresh:function(){var t=this.options;this._processPanels(),t.active===!1&&t.collapsible===!0||!this.headers.length?(t.active=!1,this.active=e()):t.active===!1?this._activate(0):this.active.length&&!e.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(t.active=!1,this.active=e()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var e=this.headers,t=this.panels;this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-state-default ui-corner-all"),this.panels=this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide(),t&&(this._off(e.not(this.headers)),this._off(t.not(this.panels)))},_refresh:function(){var t,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(){var t=e(this),i=t.uniqueId().attr("id"),s=t.next(),n=s.uniqueId().attr("id");t.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(t=n.height(),this.element.siblings(":visible").each(function(){var i=e(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(t-=i.outerHeight(!0))}),this.headers.each(function(){t-=e(this).outerHeight(!0)}),this.headers.next().each(function(){e(this).height(Math.max(0,t-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===s&&(t=0,this.headers.next().each(function(){t=Math.max(t,e(this).css("height","").height())}).height(t))},_activate:function(t){var i=this._findActive(t)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return"number"==typeof t?this.headers.eq(t):e()},_setupEvents:function(t){var i={keydown:"_keydown"};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n[0]===s[0],o=a&&i.collapsible,r=o?e():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:o?e():n,newPanel:r};t.preventDefault(),a&&!i.collapsible||this._trigger("beforeActivate",t,l)===!1||(i.active=o?!1:this.headers.index(n),this.active=a?e():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),a||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))},_toggle:function(t){var i=t.newPanel,s=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,t):(s.hide(),i.show(),this._toggleComplete(t)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(e(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(e,t,i){var s,n,a,o=this,r=0,h=e.css("box-sizing"),l=e.length&&(!t.length||e.index()<t.index()),u=this.options.animate||{},d=l&&u.down||u,c=function(){o._toggleComplete(i)};return"number"==typeof d&&(a=d),"string"==typeof d&&(n=d),n=n||d.easing||u.easing,a=a||d.duration||u.duration,t.length?e.length?(s=e.show().outerHeight(),t.animate(this.hideProps,{duration:a,easing:n,step:function(e,t){t.now=Math.round(e)}}),e.hide().animate(this.showProps,{duration:a,easing:n,complete:c,step:function(e,i){i.now=Math.round(e),"height"!==i.prop?"content-box"===h&&(r+=i.now):"content"!==o.options.heightStyle&&(i.now=Math.round(s-t.outerHeight()-r),r=0)}}),void 0):t.animate(this.hideProps,a,n,c):e.animate(this.showProps,a,n,c)},_toggleComplete:function(e){var t=e.oldPanel;t.removeClass("ui-accordion-content-active").prev().removeClass("ui-corner-top").addClass("ui-corner-all"),t.length&&(t.parent()[0].className=t.parent()[0].className),this._trigger("activate",null,e)}}),e.widget("ui.menu",{version:"1.11.4",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},items:"> *",menus:"ul",position:{my:"left-1 top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item":function(e){e.preventDefault()},"click .ui-menu-item":function(t){var i=e(t.target);!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&e(this.document[0].activeElement).closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(t){if(!this.previousFilter){var i=e(t.currentTarget); +i.siblings(".ui-state-active").removeClass("ui-state-active"),this.focus(t,i)}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var i=this.active||this.element.find(this.options.items).eq(0);t||this.focus(e,i)},blur:function(t){this._delay(function(){e.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){this._closeOnDocumentClick(e)&&this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-menu-icons ui-front").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").removeUniqueId().removeClass("ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var t=e(this);t.data("ui-menu-submenu-carat")&&t.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(t){var i,s,n,a,o=!0;switch(t.keyCode){case e.ui.keyCode.PAGE_UP:this.previousPage(t);break;case e.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case e.ui.keyCode.HOME:this._move("first","first",t);break;case e.ui.keyCode.END:this._move("last","last",t);break;case e.ui.keyCode.UP:this.previous(t);break;case e.ui.keyCode.DOWN:this.next(t);break;case e.ui.keyCode.LEFT:this.collapse(t);break;case e.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case e.ui.keyCode.ENTER:case e.ui.keyCode.SPACE:this._activate(t);break;case e.ui.keyCode.ESCAPE:this.collapse(t);break;default:o=!1,s=this.previousFilter||"",n=String.fromCharCode(t.keyCode),a=!1,clearTimeout(this.filterTimer),n===s?a=!0:n=s+n,i=this._filterMenuItems(n),i=a&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(t.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(t,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}o&&t.preventDefault()},_activate:function(e){this.active.is(".ui-state-disabled")||(this.active.is("[aria-haspopup='true']")?this.expand(e):this.select(e))},refresh:function(){var t,i,s=this,n=this.options.icons.submenu,a=this.element.find(this.options.menus);this.element.toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length),a.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-front").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=e(this),i=t.parent(),s=e("<span>").addClass("ui-menu-icon ui-icon "+n).data("ui-menu-submenu-carat",!0);i.attr("aria-haspopup","true").prepend(s),t.attr("aria-labelledby",i.attr("id"))}),t=a.add(this.element),i=t.find(this.options.items),i.not(".ui-menu-item").each(function(){var t=e(this);s._isDivider(t)&&t.addClass("ui-widget-content ui-menu-divider")}),i.not(".ui-menu-item, .ui-menu-divider").addClass("ui-menu-item").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!e.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(e,t){"icons"===e&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(t.submenu),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},focus:function(e,t){var i,s;this.blur(e,e&&"focus"===e.type),this._scrollIntoView(t),this.active=t.first(),s=this.active.addClass("ui-state-focus").removeClass("ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").addClass("ui-state-active"),e&&"keydown"===e.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=t.children(".ui-menu"),i.length&&e&&/^mouse/.test(e.type)&&this._startOpening(i),this.activeMenu=t.parent(),this._trigger("focus",e,{item:t})},_scrollIntoView:function(t){var i,s,n,a,o,r;this._hasScroll()&&(i=parseFloat(e.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(e.css(this.activeMenu[0],"paddingTop"))||0,n=t.offset().top-this.activeMenu.offset().top-i-s,a=this.activeMenu.scrollTop(),o=this.activeMenu.height(),r=t.outerHeight(),0>n?this.activeMenu.scrollTop(a+n):n+r>o&&this.activeMenu.scrollTop(a+n-o+r))},blur:function(e,t){t||clearTimeout(this.timer),this.active&&(this.active.removeClass("ui-state-focus"),this.active=null,this._trigger("blur",e,{item:this.active}))},_startOpening:function(e){clearTimeout(this.timer),"true"===e.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(e)},this.delay))},_open:function(t){var i=e.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(t,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:e(t&&t.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(t),this.activeMenu=s},this.delay)},_close:function(e){e||(e=this.active?this.active.parent():this.element),e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find(".ui-state-active").not(".ui-state-focus").removeClass("ui-state-active")},_closeOnDocumentClick:function(t){return!e(t.target).closest(".ui-menu").length},_isDivider:function(e){return!/[^\-\u2014\u2013\s]/.test(e.text())},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);t&&t.length&&(this._close(),this.focus(e,t))},expand:function(e){var t=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();t&&t.length&&(this._open(t.parent()),this._delay(function(){this.focus(e,t)}))},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(e,t,i){var s;this.active&&(s="first"===e||"last"===e?this.active["first"===e?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[e+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[t]()),this.focus(i,s)},nextPage:function(t){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=e(this),0>i.offset().top-s-n}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(t),void 0)},previousPage:function(t){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=e(this),i.offset().top-s+n>0}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items).first())),void 0):(this.next(t),void 0)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(t){this.active=this.active||e(t.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(t,!0),this._trigger("select",t,i)},_filterMenuItems:function(t){var i=t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&"),s=RegExp("^"+i,"i");return this.activeMenu.find(this.options.items).filter(".ui-menu-item").filter(function(){return s.test(e.trim(e(this).text()))})}}),e.widget("ui.autocomplete",{version:"1.11.4",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var t,i,s,n=this.element[0].nodeName.toLowerCase(),a="textarea"===n,o="input"===n;this.isMultiLine=a?!0:o?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[a||o?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return t=!0,s=!0,i=!0,void 0;t=!1,s=!1,i=!1;var a=e.ui.keyCode;switch(n.keyCode){case a.PAGE_UP:t=!0,this._move("previousPage",n);break;case a.PAGE_DOWN:t=!0,this._move("nextPage",n);break;case a.UP:t=!0,this._keyEvent("previous",n);break;case a.DOWN:t=!0,this._keyEvent("next",n);break;case a.ENTER:this.menu.active&&(t=!0,n.preventDefault(),this.menu.select(n));break;case a.TAB:this.menu.active&&this.menu.select(n);break;case a.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(t)return t=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=e.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(e){return s?(s=!1,e.preventDefault(),void 0):(this._searchTimeout(e),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(e),this._change(e),void 0)}}),this._initSource(),this.menu=e("<ul>").addClass("ui-autocomplete ui-front").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var i=this.menu.element[0];e(t.target).closest(".ui-menu-item").length||this._delay(function(){var t=this;this.document.one("mousedown",function(s){s.target===t.element[0]||s.target===i||e.contains(i,s.target)||t.close()})})},menufocus:function(t,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){e(t.target).trigger(t.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:n})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&e.trim(s).length&&(this.liveRegion.children().hide(),e("<div>").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,t){var i=t.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",e,{item:i})&&this._value(i.value),this.term=this._value(),this.close(e),this.selectedItem=i}}),this.liveRegion=e("<span>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),"source"===e&&this._initSource(),"appendTo"===e&&this.menu.element.appendTo(this._appendTo()),"disabled"===e&&t&&this.xhr&&this.xhr.abort()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_initSource:function(){var t,i,s=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(i,s){s(e.ui.autocomplete.filter(t,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(t,n){s.xhr&&s.xhr.abort(),s.xhr=e.ajax({url:i,data:t,dataType:"json",success:function(e){n(e)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),i=this.menu.element.is(":visible"),s=e.altKey||e.ctrlKey||e.metaKey||e.shiftKey;(!t||t&&!i&&!s)&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){return e=null!=e?e:this._value(),this.term=this._value(),e.length<this.options.minLength?this.close(t):this._trigger("search",t)!==!1?this._search(e):void 0},_search:function(e){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:e},this._response())},_response:function(){var t=++this.requestIndex;return e.proxy(function(e){t===this.requestIndex&&this.__response(e),this.pending--,this.pending||this.element.removeClass("ui-autocomplete-loading")},this)},__response:function(e){e&&(e=this._normalize(e)),this._trigger("response",null,{content:e}),!this.options.disabled&&e&&e.length&&!this.cancelSearch?(this._suggest(e),this._trigger("open")):this._close()},close:function(e){this.cancelSearch=!0,this._close(e)},_close:function(e){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",e))},_change:function(e){this.previous!==this._value()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(t){return t.length&&t[0].label&&t[0].value?t:e.map(t,function(t){return"string"==typeof t?{label:t,value:t}:e.extend({},t,{label:t.label||t.value,value:t.value||t.label})})},_suggest:function(t){var i=this.menu.element.empty();this._renderMenu(i,t),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(e.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(t,i){var s=this;e.each(i,function(e,i){s._renderItemData(t,i)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-autocomplete-item",t)},_renderItem:function(t,i){return e("<li>").text(i.label).appendTo(t)},_move:function(e,t){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[e](t),void 0):(this.search(null,t),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(e,t),t.preventDefault())}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,i){var s=RegExp(e.ui.autocomplete.escapeRegex(i),"i");return e.grep(t,function(e){return s.test(e.label||e.value||e)})}}),e.widget("ui.autocomplete",e.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(e){return e+(e>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(t){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=t&&t.length?this.options.messages.results(t.length):this.options.messages.noResults,this.liveRegion.children().hide(),e("<div>").text(i).appendTo(this.liveRegion))}}),e.ui.autocomplete;var c,p="ui-button ui-widget ui-state-default ui-corner-all",f="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",m=function(){var t=e(this);setTimeout(function(){t.find(":ui-button").button("refresh")},1)},g=function(t){var i=t.name,s=t.form,n=e([]);return i&&(i=i.replace(/'/g,"\\'"),n=s?e(s).find("[name='"+i+"'][type=radio]"):e("[name='"+i+"'][type=radio]",t.ownerDocument).filter(function(){return!this.form})),n};e.widget("ui.button",{version:"1.11.4",defaultElement:"<button>",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset"+this.eventNamespace).bind("reset"+this.eventNamespace,m),"boolean"!=typeof this.options.disabled?this.options.disabled=!!this.element.prop("disabled"):this.element.prop("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var t=this,i=this.options,s="checkbox"===this.type||"radio"===this.type,n=s?"":"ui-state-active";null===i.label&&(i.label="input"===this.type?this.buttonElement.val():this.buttonElement.html()),this._hoverable(this.buttonElement),this.buttonElement.addClass(p).attr("role","button").bind("mouseenter"+this.eventNamespace,function(){i.disabled||this===c&&e(this).addClass("ui-state-active")}).bind("mouseleave"+this.eventNamespace,function(){i.disabled||e(this).removeClass(n)}).bind("click"+this.eventNamespace,function(e){i.disabled&&(e.preventDefault(),e.stopImmediatePropagation())}),this._on({focus:function(){this.buttonElement.addClass("ui-state-focus")},blur:function(){this.buttonElement.removeClass("ui-state-focus")}}),s&&this.element.bind("change"+this.eventNamespace,function(){t.refresh()}),"checkbox"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){return i.disabled?!1:void 0}):"radio"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){if(i.disabled)return!1;e(this).addClass("ui-state-active"),t.buttonElement.attr("aria-pressed","true");var s=t.element[0];g(s).not(s).map(function(){return e(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown"+this.eventNamespace,function(){return i.disabled?!1:(e(this).addClass("ui-state-active"),c=this,t.document.one("mouseup",function(){c=null}),void 0)}).bind("mouseup"+this.eventNamespace,function(){return i.disabled?!1:(e(this).removeClass("ui-state-active"),void 0)}).bind("keydown"+this.eventNamespace,function(t){return i.disabled?!1:((t.keyCode===e.ui.keyCode.SPACE||t.keyCode===e.ui.keyCode.ENTER)&&e(this).addClass("ui-state-active"),void 0)}).bind("keyup"+this.eventNamespace+" blur"+this.eventNamespace,function(){e(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(t){t.keyCode===e.ui.keyCode.SPACE&&e(this).click()})),this._setOption("disabled",i.disabled),this._resetButton()},_determineButtonType:function(){var e,t,i;this.type=this.element.is("[type=checkbox]")?"checkbox":this.element.is("[type=radio]")?"radio":this.element.is("input")?"input":"button","checkbox"===this.type||"radio"===this.type?(e=this.element.parents().last(),t="label[for='"+this.element.attr("id")+"']",this.buttonElement=e.find(t),this.buttonElement.length||(e=e.length?e.siblings():this.element.siblings(),this.buttonElement=e.filter(t),this.buttonElement.length||(this.buttonElement=e.find(t))),this.element.addClass("ui-helper-hidden-accessible"),i=this.element.is(":checked"),i&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.prop("aria-pressed",i)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(p+" ui-state-active "+f).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title")},_setOption:function(e,t){return this._super(e,t),"disabled"===e?(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),t&&("checkbox"===this.type||"radio"===this.type?this.buttonElement.removeClass("ui-state-focus"):this.buttonElement.removeClass("ui-state-focus ui-state-active")),void 0):(this._resetButton(),void 0)},refresh:function(){var t=this.element.is("input, button")?this.element.is(":disabled"):this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOption("disabled",t),"radio"===this.type?g(this.element[0]).each(function(){e(this).is(":checked")?e(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):e(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):"checkbox"===this.type&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if("input"===this.type)return this.options.label&&this.element.val(this.options.label),void 0;var t=this.buttonElement.removeClass(f),i=e("<span></span>",this.document[0]).addClass("ui-button-text").html(this.options.label).appendTo(t.empty()).text(),s=this.options.icons,n=s.primary&&s.secondary,a=[];s.primary||s.secondary?(this.options.text&&a.push("ui-button-text-icon"+(n?"s":s.primary?"-primary":"-secondary")),s.primary&&t.prepend("<span class='ui-button-icon-primary ui-icon "+s.primary+"'></span>"),s.secondary&&t.append("<span class='ui-button-icon-secondary ui-icon "+s.secondary+"'></span>"),this.options.text||(a.push(n?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||t.attr("title",e.trim(i)))):a.push("ui-button-text-only"),t.addClass(a.join(" "))}}),e.widget("ui.buttonset",{version:"1.11.4",options:{items:"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(e,t){"disabled"===e&&this.buttons.button("option",e,t),this._super(e,t)},refresh:function(){var t="rtl"===this.element.css("direction"),i=this.element.find(this.options.items),s=i.filter(":ui-button");i.not(":ui-button").button(),s.button("refresh"),this.buttons=i.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(t?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(t?"ui-corner-left":"ui-corner-right").end().end()},_destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy")}}),e.ui.button,e.extend(e.ui,{datepicker:{version:"1.11.4"}});var v;e.extend(n.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(e){return r(this._defaults,e||{}),this},_attachDatepicker:function(t,i){var s,n,a;s=t.nodeName.toLowerCase(),n="div"===s||"span"===s,t.id||(this.uuid+=1,t.id="dp"+this.uuid),a=this._newInst(e(t),n),a.settings=e.extend({},i||{}),"input"===s?this._connectDatepicker(t,a):n&&this._inlineDatepicker(t,a)},_newInst:function(t,i){var s=t[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:s,input:t,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?a(e("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(t,i){var s=e(t);i.append=e([]),i.trigger=e([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp),this._autoSize(i),e.data(t,"datepicker",i),i.settings.disabled&&this._disableDatepicker(t))},_attachments:function(t,i){var s,n,a,o=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),o&&(i.append=e("<span class='"+this._appendClass+"'>"+o+"</span>"),t[r?"before":"after"](i.append)),t.unbind("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&t.focus(this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),a=this._get(i,"buttonImage"),i.trigger=e(this._get(i,"buttonImageOnly")?e("<img/>").addClass(this._triggerClass).attr({src:a,alt:n,title:n}):e("<button type='button'></button>").addClass(this._triggerClass).html(a?e("<img/>").attr({src:a,alt:n,title:n}):n)),t[r?"before":"after"](i.trigger),i.trigger.click(function(){return e.datepicker._datepickerShowing&&e.datepicker._lastInput===t[0]?e.datepicker._hideDatepicker():e.datepicker._datepickerShowing&&e.datepicker._lastInput!==t[0]?(e.datepicker._hideDatepicker(),e.datepicker._showDatepicker(t[0])):e.datepicker._showDatepicker(t[0]),!1}))},_autoSize:function(e){if(this._get(e,"autoSize")&&!e.inline){var t,i,s,n,a=new Date(2009,11,20),o=this._get(e,"dateFormat");o.match(/[DM]/)&&(t=function(e){for(i=0,s=0,n=0;e.length>n;n++)e[n].length>i&&(i=e[n].length,s=n);return s},a.setMonth(t(this._get(e,o.match(/MM/)?"monthNames":"monthNamesShort"))),a.setDate(t(this._get(e,o.match(/DD/)?"dayNames":"dayNamesShort"))+20-a.getDay())),e.input.attr("size",this._formatDate(e,a).length)}},_inlineDatepicker:function(t,i){var s=e(t);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),e.data(t,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(t),i.dpDiv.css("display","block"))},_dialogDatepicker:function(t,i,s,n,a){var o,h,l,u,d,c=this._dialogInst;return c||(this.uuid+=1,o="dp"+this.uuid,this._dialogInput=e("<input type='text' id='"+o+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.keydown(this._doKeyDown),e("body").append(this._dialogInput),c=this._dialogInst=this._newInst(this._dialogInput,!1),c.settings={},e.data(this._dialogInput[0],"datepicker",c)),r(c.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(c,i):i,this._dialogInput.val(i),this._pos=a?a.length?a:[a.pageX,a.pageY]:null,this._pos||(h=document.documentElement.clientWidth,l=document.documentElement.clientHeight,u=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[h/2-100+u,l/2-150+d]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),c.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),e.blockUI&&e.blockUI(this.dpDiv),e.data(this._dialogInput[0],"datepicker",c),this},_destroyDatepicker:function(t){var i,s=e(t),n=e.data(t,"datepicker");s.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),e.removeData(t,"datepicker"),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty(),v===n&&(v=null))},_enableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!1,a.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}))},_disableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!0,a.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}),this._disabledInputs[this._disabledInputs.length]=t)},_isDisabledDatepicker:function(e){if(!e)return!1;for(var t=0;this._disabledInputs.length>t;t++)if(this._disabledInputs[t]===e)return!0;return!1},_getInst:function(t){try{return e.data(t,"datepicker")}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(t,i,s){var n,a,o,h,l=this._getInst(t);return 2===arguments.length&&"string"==typeof i?"defaults"===i?e.extend({},e.datepicker._defaults):l?"all"===i?e.extend({},l.settings):this._get(l,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),l&&(this._curInst===l&&this._hideDatepicker(),a=this._getDateDatepicker(t,!0),o=this._getMinMaxDate(l,"min"),h=this._getMinMaxDate(l,"max"),r(l.settings,n),null!==o&&void 0!==n.dateFormat&&void 0===n.minDate&&(l.settings.minDate=this._formatDate(l,o)),null!==h&&void 0!==n.dateFormat&&void 0===n.maxDate&&(l.settings.maxDate=this._formatDate(l,h)),"disabled"in n&&(n.disabled?this._disableDatepicker(t):this._enableDatepicker(t)),this._attachments(e(t),l),this._autoSize(l),this._setDate(l,a),this._updateAlternate(l),this._updateDatepicker(l)),void 0)},_changeDatepicker:function(e,t,i){this._optionDatepicker(e,t,i)},_refreshDatepicker:function(e){var t=this._getInst(e);t&&this._updateDatepicker(t)},_setDateDatepicker:function(e,t){var i=this._getInst(e);i&&(this._setDate(i,t),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(e,t){var i=this._getInst(e);return i&&!i.inline&&this._setDateFromField(i,t),i?this._getDate(i):null},_doKeyDown:function(t){var i,s,n,a=e.datepicker._getInst(t.target),o=!0,r=a.dpDiv.is(".ui-datepicker-rtl");if(a._keyEvent=!0,e.datepicker._datepickerShowing)switch(t.keyCode){case 9:e.datepicker._hideDatepicker(),o=!1;break;case 13:return n=e("td."+e.datepicker._dayOverClass+":not(."+e.datepicker._currentClass+")",a.dpDiv),n[0]&&e.datepicker._selectDay(t.target,a.selectedMonth,a.selectedYear,n[0]),i=e.datepicker._get(a,"onSelect"),i?(s=e.datepicker._formatDate(a),i.apply(a.input?a.input[0]:null,[s,a])):e.datepicker._hideDatepicker(),!1;case 27:e.datepicker._hideDatepicker();break;case 33:e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 34:e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 35:(t.ctrlKey||t.metaKey)&&e.datepicker._clearDate(t.target),o=t.ctrlKey||t.metaKey;break;case 36:(t.ctrlKey||t.metaKey)&&e.datepicker._gotoToday(t.target),o=t.ctrlKey||t.metaKey;break;case 37:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?1:-1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 38:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,-7,"D"),o=t.ctrlKey||t.metaKey;break;case 39:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?-1:1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 40:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,7,"D"),o=t.ctrlKey||t.metaKey;break;default:o=!1}else 36===t.keyCode&&t.ctrlKey?e.datepicker._showDatepicker(this):o=!1;o&&(t.preventDefault(),t.stopPropagation())},_doKeyPress:function(t){var i,s,n=e.datepicker._getInst(t.target); +return e.datepicker._get(n,"constrainInput")?(i=e.datepicker._possibleChars(e.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==t.charCode?t.keyCode:t.charCode),t.ctrlKey||t.metaKey||" ">s||!i||i.indexOf(s)>-1):void 0},_doKeyUp:function(t){var i,s=e.datepicker._getInst(t.target);if(s.input.val()!==s.lastVal)try{i=e.datepicker.parseDate(e.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,e.datepicker._getFormatConfig(s)),i&&(e.datepicker._setDateFromField(s),e.datepicker._updateAlternate(s),e.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(t){if(t=t.target||t,"input"!==t.nodeName.toLowerCase()&&(t=e("input",t.parentNode)[0]),!e.datepicker._isDisabledDatepicker(t)&&e.datepicker._lastInput!==t){var i,n,a,o,h,l,u;i=e.datepicker._getInst(t),e.datepicker._curInst&&e.datepicker._curInst!==i&&(e.datepicker._curInst.dpDiv.stop(!0,!0),i&&e.datepicker._datepickerShowing&&e.datepicker._hideDatepicker(e.datepicker._curInst.input[0])),n=e.datepicker._get(i,"beforeShow"),a=n?n.apply(t,[t,i]):{},a!==!1&&(r(i.settings,a),i.lastVal=null,e.datepicker._lastInput=t,e.datepicker._setDateFromField(i),e.datepicker._inDialog&&(t.value=""),e.datepicker._pos||(e.datepicker._pos=e.datepicker._findPos(t),e.datepicker._pos[1]+=t.offsetHeight),o=!1,e(t).parents().each(function(){return o|="fixed"===e(this).css("position"),!o}),h={left:e.datepicker._pos[0],top:e.datepicker._pos[1]},e.datepicker._pos=null,i.dpDiv.empty(),i.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),e.datepicker._updateDatepicker(i),h=e.datepicker._checkOffset(i,h,o),i.dpDiv.css({position:e.datepicker._inDialog&&e.blockUI?"static":o?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"}),i.inline||(l=e.datepicker._get(i,"showAnim"),u=e.datepicker._get(i,"duration"),i.dpDiv.css("z-index",s(e(t))+1),e.datepicker._datepickerShowing=!0,e.effects&&e.effects.effect[l]?i.dpDiv.show(l,e.datepicker._get(i,"showOptions"),u):i.dpDiv[l||"show"](l?u:null),e.datepicker._shouldFocusInput(i)&&i.input.focus(),e.datepicker._curInst=i))}},_updateDatepicker:function(t){this.maxRows=4,v=t,t.dpDiv.empty().append(this._generateHTML(t)),this._attachHandlers(t);var i,s=this._getNumberOfMonths(t),n=s[1],a=17,r=t.dpDiv.find("."+this._dayOverClass+" a");r.length>0&&o.apply(r.get(0)),t.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&t.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),t.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),t.dpDiv[(this._get(t,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),t===e.datepicker._curInst&&e.datepicker._datepickerShowing&&e.datepicker._shouldFocusInput(t)&&t.input.focus(),t.yearshtml&&(i=t.yearshtml,setTimeout(function(){i===t.yearshtml&&t.yearshtml&&t.dpDiv.find("select.ui-datepicker-year:first").replaceWith(t.yearshtml),i=t.yearshtml=null},0))},_shouldFocusInput:function(e){return e.input&&e.input.is(":visible")&&!e.input.is(":disabled")&&!e.input.is(":focus")},_checkOffset:function(t,i,s){var n=t.dpDiv.outerWidth(),a=t.dpDiv.outerHeight(),o=t.input?t.input.outerWidth():0,r=t.input?t.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:e(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:e(document).scrollTop());return i.left-=this._get(t,"isRTL")?n-o:0,i.left-=s&&i.left===t.input.offset().left?e(document).scrollLeft():0,i.top-=s&&i.top===t.input.offset().top+r?e(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+a>l&&l>a?Math.abs(a+r):0),i},_findPos:function(t){for(var i,s=this._getInst(t),n=this._get(s,"isRTL");t&&("hidden"===t.type||1!==t.nodeType||e.expr.filters.hidden(t));)t=t[n?"previousSibling":"nextSibling"];return i=e(t).offset(),[i.left,i.top]},_hideDatepicker:function(t){var i,s,n,a,o=this._curInst;!o||t&&o!==e.data(t,"datepicker")||this._datepickerShowing&&(i=this._get(o,"showAnim"),s=this._get(o,"duration"),n=function(){e.datepicker._tidyDialog(o)},e.effects&&(e.effects.effect[i]||e.effects[i])?o.dpDiv.hide(i,e.datepicker._get(o,"showOptions"),s,n):o.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,a=this._get(o,"onClose"),a&&a.apply(o.input?o.input[0]:null,[o.input?o.input.val():"",o]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),e.blockUI&&(e.unblockUI(),e("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(e){e.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(t){if(e.datepicker._curInst){var i=e(t.target),s=e.datepicker._getInst(i[0]);(i[0].id!==e.datepicker._mainDivId&&0===i.parents("#"+e.datepicker._mainDivId).length&&!i.hasClass(e.datepicker.markerClassName)&&!i.closest("."+e.datepicker._triggerClass).length&&e.datepicker._datepickerShowing&&(!e.datepicker._inDialog||!e.blockUI)||i.hasClass(e.datepicker.markerClassName)&&e.datepicker._curInst!==s)&&e.datepicker._hideDatepicker()}},_adjustDate:function(t,i,s){var n=e(t),a=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(a,i+("M"===s?this._get(a,"showCurrentAtPos"):0),s),this._updateDatepicker(a))},_gotoToday:function(t){var i,s=e(t),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(t,i,s){var n=e(t),a=this._getInst(n[0]);a["selected"+("M"===s?"Month":"Year")]=a["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(a),this._adjustDate(n)},_selectDay:function(t,i,s,n){var a,o=e(t);e(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(o[0])||(a=this._getInst(o[0]),a.selectedDay=a.currentDay=e("a",n).html(),a.selectedMonth=a.currentMonth=i,a.selectedYear=a.currentYear=s,this._selectDate(t,this._formatDate(a,a.currentDay,a.currentMonth,a.currentYear)))},_clearDate:function(t){var i=e(t);this._selectDate(i,"")},_selectDate:function(t,i){var s,n=e(t),a=this._getInst(n[0]);i=null!=i?i:this._formatDate(a),a.input&&a.input.val(i),this._updateAlternate(a),s=this._get(a,"onSelect"),s?s.apply(a.input?a.input[0]:null,[i,a]):a.input&&a.input.trigger("change"),a.inline?this._updateDatepicker(a):(this._hideDatepicker(),this._lastInput=a.input[0],"object"!=typeof a.input[0]&&a.input.focus(),this._lastInput=null)},_updateAlternate:function(t){var i,s,n,a=this._get(t,"altField");a&&(i=this._get(t,"altFormat")||this._get(t,"dateFormat"),s=this._getDate(t),n=this.formatDate(i,s,this._getFormatConfig(t)),e(a).each(function(){e(this).val(n)}))},noWeekends:function(e){var t=e.getDay();return[t>0&&6>t,""]},iso8601Week:function(e){var t,i=new Date(e.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),t=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((t-i)/864e5)/7)+1},parseDate:function(t,i,s){if(null==t||null==i)throw"Invalid arguments";if(i="object"==typeof i?""+i:i+"",""===i)return null;var n,a,o,r,h=0,l=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,u="string"!=typeof l?l:(new Date).getFullYear()%100+parseInt(l,10),d=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,c=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,m=-1,g=-1,v=-1,y=-1,b=!1,_=function(e){var i=t.length>n+1&&t.charAt(n+1)===e;return i&&n++,i},x=function(e){var t=_(e),s="@"===e?14:"!"===e?20:"y"===e&&t?4:"o"===e?3:2,n="y"===e?s:1,a=RegExp("^\\d{"+n+","+s+"}"),o=i.substring(h).match(a);if(!o)throw"Missing number at position "+h;return h+=o[0].length,parseInt(o[0],10)},w=function(t,s,n){var a=-1,o=e.map(_(t)?n:s,function(e,t){return[[t,e]]}).sort(function(e,t){return-(e[1].length-t[1].length)});if(e.each(o,function(e,t){var s=t[1];return i.substr(h,s.length).toLowerCase()===s.toLowerCase()?(a=t[0],h+=s.length,!1):void 0}),-1!==a)return a+1;throw"Unknown name at position "+h},k=function(){if(i.charAt(h)!==t.charAt(n))throw"Unexpected literal at position "+h;h++};for(n=0;t.length>n;n++)if(b)"'"!==t.charAt(n)||_("'")?k():b=!1;else switch(t.charAt(n)){case"d":v=x("d");break;case"D":w("D",d,c);break;case"o":y=x("o");break;case"m":g=x("m");break;case"M":g=w("M",p,f);break;case"y":m=x("y");break;case"@":r=new Date(x("@")),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"!":r=new Date((x("!")-this._ticksTo1970)/1e4),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"'":_("'")?k():b=!0;break;default:k()}if(i.length>h&&(o=i.substr(h),!/^\s+/.test(o)))throw"Extra/unparsed characters found in date: "+o;if(-1===m?m=(new Date).getFullYear():100>m&&(m+=(new Date).getFullYear()-(new Date).getFullYear()%100+(u>=m?0:-100)),y>-1)for(g=1,v=y;;){if(a=this._getDaysInMonth(m,g-1),a>=v)break;g++,v-=a}if(r=this._daylightSavingAdjust(new Date(m,g-1,v)),r.getFullYear()!==m||r.getMonth()+1!==g||r.getDate()!==v)throw"Invalid date";return r},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(e,t,i){if(!t)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,a=(i?i.dayNames:null)||this._defaults.dayNames,o=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(t){var i=e.length>s+1&&e.charAt(s+1)===t;return i&&s++,i},l=function(e,t,i){var s=""+t;if(h(e))for(;i>s.length;)s="0"+s;return s},u=function(e,t,i,s){return h(e)?s[t]:i[t]},d="",c=!1;if(t)for(s=0;e.length>s;s++)if(c)"'"!==e.charAt(s)||h("'")?d+=e.charAt(s):c=!1;else switch(e.charAt(s)){case"d":d+=l("d",t.getDate(),2);break;case"D":d+=u("D",t.getDay(),n,a);break;case"o":d+=l("o",Math.round((new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()-new Date(t.getFullYear(),0,0).getTime())/864e5),3);break;case"m":d+=l("m",t.getMonth()+1,2);break;case"M":d+=u("M",t.getMonth(),o,r);break;case"y":d+=h("y")?t.getFullYear():(10>t.getYear()%100?"0":"")+t.getYear()%100;break;case"@":d+=t.getTime();break;case"!":d+=1e4*t.getTime()+this._ticksTo1970;break;case"'":h("'")?d+="'":c=!0;break;default:d+=e.charAt(s)}return d},_possibleChars:function(e){var t,i="",s=!1,n=function(i){var s=e.length>t+1&&e.charAt(t+1)===i;return s&&t++,s};for(t=0;e.length>t;t++)if(s)"'"!==e.charAt(t)||n("'")?i+=e.charAt(t):s=!1;else switch(e.charAt(t)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=e.charAt(t)}return i},_get:function(e,t){return void 0!==e.settings[t]?e.settings[t]:this._defaults[t]},_setDateFromField:function(e,t){if(e.input.val()!==e.lastVal){var i=this._get(e,"dateFormat"),s=e.lastVal=e.input?e.input.val():null,n=this._getDefaultDate(e),a=n,o=this._getFormatConfig(e);try{a=this.parseDate(i,s,o)||n}catch(r){s=t?"":s}e.selectedDay=a.getDate(),e.drawMonth=e.selectedMonth=a.getMonth(),e.drawYear=e.selectedYear=a.getFullYear(),e.currentDay=s?a.getDate():0,e.currentMonth=s?a.getMonth():0,e.currentYear=s?a.getFullYear():0,this._adjustInstDate(e)}},_getDefaultDate:function(e){return this._restrictMinMax(e,this._determineDate(e,this._get(e,"defaultDate"),new Date))},_determineDate:function(t,i,s){var n=function(e){var t=new Date;return t.setDate(t.getDate()+e),t},a=function(i){try{return e.datepicker.parseDate(e.datepicker._get(t,"dateFormat"),i,e.datepicker._getFormatConfig(t))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?e.datepicker._getDate(t):null)||new Date,a=n.getFullYear(),o=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":o+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o));break;case"y":case"Y":a+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o))}l=h.exec(i)}return new Date(a,o,r)},o=null==i||""===i?s:"string"==typeof i?a(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return o=o&&"Invalid Date"==""+o?s:o,o&&(o.setHours(0),o.setMinutes(0),o.setSeconds(0),o.setMilliseconds(0)),this._daylightSavingAdjust(o)},_daylightSavingAdjust:function(e){return e?(e.setHours(e.getHours()>12?e.getHours()+2:0),e):null},_setDate:function(e,t,i){var s=!t,n=e.selectedMonth,a=e.selectedYear,o=this._restrictMinMax(e,this._determineDate(e,t,new Date));e.selectedDay=e.currentDay=o.getDate(),e.drawMonth=e.selectedMonth=e.currentMonth=o.getMonth(),e.drawYear=e.selectedYear=e.currentYear=o.getFullYear(),n===e.selectedMonth&&a===e.selectedYear||i||this._notifyChange(e),this._adjustInstDate(e),e.input&&e.input.val(s?"":this._formatDate(e))},_getDate:function(e){var t=!e.currentYear||e.input&&""===e.input.val()?null:this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return t},_attachHandlers:function(t){var i=this._get(t,"stepMonths"),s="#"+t.id.replace(/\\\\/g,"\\");t.dpDiv.find("[data-handler]").map(function(){var t={prev:function(){e.datepicker._adjustDate(s,-i,"M")},next:function(){e.datepicker._adjustDate(s,+i,"M")},hide:function(){e.datepicker._hideDatepicker()},today:function(){e.datepicker._gotoToday(s)},selectDay:function(){return e.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return e.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return e.datepicker._selectMonthYear(s,this,"Y"),!1}};e(this).bind(this.getAttribute("data-event"),t[this.getAttribute("data-handler")])})},_generateHTML:function(e){var t,i,s,n,a,o,r,h,l,u,d,c,p,f,m,g,v,y,b,_,x,w,k,T,D,S,M,C,N,A,P,I,H,z,F,E,O,j,W,L=new Date,R=this._daylightSavingAdjust(new Date(L.getFullYear(),L.getMonth(),L.getDate())),Y=this._get(e,"isRTL"),B=this._get(e,"showButtonPanel"),J=this._get(e,"hideIfNoPrevNext"),q=this._get(e,"navigationAsDateFormat"),K=this._getNumberOfMonths(e),V=this._get(e,"showCurrentAtPos"),U=this._get(e,"stepMonths"),Q=1!==K[0]||1!==K[1],G=this._daylightSavingAdjust(e.currentDay?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(9999,9,9)),X=this._getMinMaxDate(e,"min"),$=this._getMinMaxDate(e,"max"),Z=e.drawMonth-V,et=e.drawYear;if(0>Z&&(Z+=12,et--),$)for(t=this._daylightSavingAdjust(new Date($.getFullYear(),$.getMonth()-K[0]*K[1]+1,$.getDate())),t=X&&X>t?X:t;this._daylightSavingAdjust(new Date(et,Z,1))>t;)Z--,0>Z&&(Z=11,et--);for(e.drawMonth=Z,e.drawYear=et,i=this._get(e,"prevText"),i=q?this.formatDate(i,this._daylightSavingAdjust(new Date(et,Z-U,1)),this._getFormatConfig(e)):i,s=this._canAdjustMonth(e,-1,et,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>":J?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(e,"nextText"),n=q?this.formatDate(n,this._daylightSavingAdjust(new Date(et,Z+U,1)),this._getFormatConfig(e)):n,a=this._canAdjustMonth(e,1,et,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>":J?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>",o=this._get(e,"currentText"),r=this._get(e,"gotoCurrent")&&e.currentDay?G:R,o=q?this.formatDate(o,r,this._getFormatConfig(e)):o,h=e.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(e,"closeText")+"</button>",l=B?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(this._isInRange(e,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+o+"</button>":"")+(Y?"":h)+"</div>":"",u=parseInt(this._get(e,"firstDay"),10),u=isNaN(u)?0:u,d=this._get(e,"showWeek"),c=this._get(e,"dayNames"),p=this._get(e,"dayNamesMin"),f=this._get(e,"monthNames"),m=this._get(e,"monthNamesShort"),g=this._get(e,"beforeShowDay"),v=this._get(e,"showOtherMonths"),y=this._get(e,"selectOtherMonths"),b=this._getDefaultDate(e),_="",w=0;K[0]>w;w++){for(k="",this.maxRows=4,T=0;K[1]>T;T++){if(D=this._daylightSavingAdjust(new Date(et,Z,e.selectedDay)),S=" ui-corner-all",M="",Q){if(M+="<div class='ui-datepicker-group",K[1]>1)switch(T){case 0:M+=" ui-datepicker-group-first",S=" ui-corner-"+(Y?"right":"left");break;case K[1]-1:M+=" ui-datepicker-group-last",S=" ui-corner-"+(Y?"left":"right");break;default:M+=" ui-datepicker-group-middle",S=""}M+="'>"}for(M+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+S+"'>"+(/all|left/.test(S)&&0===w?Y?a:s:"")+(/all|right/.test(S)&&0===w?Y?s:a:"")+this._generateMonthYearHeader(e,Z,et,X,$,w>0||T>0,f,m)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",C=d?"<th class='ui-datepicker-week-col'>"+this._get(e,"weekHeader")+"</th>":"",x=0;7>x;x++)N=(x+u)%7,C+="<th scope='col'"+((x+u+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+c[N]+"'>"+p[N]+"</span></th>";for(M+=C+"</tr></thead><tbody>",A=this._getDaysInMonth(et,Z),et===e.selectedYear&&Z===e.selectedMonth&&(e.selectedDay=Math.min(e.selectedDay,A)),P=(this._getFirstDayOfMonth(et,Z)-u+7)%7,I=Math.ceil((P+A)/7),H=Q?this.maxRows>I?this.maxRows:I:I,this.maxRows=H,z=this._daylightSavingAdjust(new Date(et,Z,1-P)),F=0;H>F;F++){for(M+="<tr>",E=d?"<td class='ui-datepicker-week-col'>"+this._get(e,"calculateWeek")(z)+"</td>":"",x=0;7>x;x++)O=g?g.apply(e.input?e.input[0]:null,[z]):[!0,""],j=z.getMonth()!==Z,W=j&&!y||!O[0]||X&&X>z||$&&z>$,E+="<td class='"+((x+u+6)%7>=5?" ui-datepicker-week-end":"")+(j?" ui-datepicker-other-month":"")+(z.getTime()===D.getTime()&&Z===e.selectedMonth&&e._keyEvent||b.getTime()===z.getTime()&&b.getTime()===D.getTime()?" "+this._dayOverClass:"")+(W?" "+this._unselectableClass+" ui-state-disabled":"")+(j&&!v?"":" "+O[1]+(z.getTime()===G.getTime()?" "+this._currentClass:"")+(z.getTime()===R.getTime()?" ui-datepicker-today":""))+"'"+(j&&!v||!O[2]?"":" title='"+O[2].replace(/'/g,"&#39;")+"'")+(W?"":" data-handler='selectDay' data-event='click' data-month='"+z.getMonth()+"' data-year='"+z.getFullYear()+"'")+">"+(j&&!v?"&#xa0;":W?"<span class='ui-state-default'>"+z.getDate()+"</span>":"<a class='ui-state-default"+(z.getTime()===R.getTime()?" ui-state-highlight":"")+(z.getTime()===G.getTime()?" ui-state-active":"")+(j?" ui-priority-secondary":"")+"' href='#'>"+z.getDate()+"</a>")+"</td>",z.setDate(z.getDate()+1),z=this._daylightSavingAdjust(z);M+=E+"</tr>"}Z++,Z>11&&(Z=0,et++),M+="</tbody></table>"+(Q?"</div>"+(K[0]>0&&T===K[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),k+=M}_+=k}return _+=l,e._keyEvent=!1,_},_generateMonthYearHeader:function(e,t,i,s,n,a,o,r){var h,l,u,d,c,p,f,m,g=this._get(e,"changeMonth"),v=this._get(e,"changeYear"),y=this._get(e,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",_="";if(a||!g)_+="<span class='ui-datepicker-month'>"+o[t]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,_+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",u=0;12>u;u++)(!h||u>=s.getMonth())&&(!l||n.getMonth()>=u)&&(_+="<option value='"+u+"'"+(u===t?" selected='selected'":"")+">"+r[u]+"</option>");_+="</select>"}if(y||(b+=_+(!a&&g&&v?"":"&#xa0;")),!e.yearshtml)if(e.yearshtml="",a||!v)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(d=this._get(e,"yearRange").split(":"),c=(new Date).getFullYear(),p=function(e){var t=e.match(/c[+\-].*/)?i+parseInt(e.substring(1),10):e.match(/[+\-].*/)?c+parseInt(e,10):parseInt(e,10);return isNaN(t)?c:t},f=p(d[0]),m=Math.max(f,p(d[1]||"")),f=s?Math.max(f,s.getFullYear()):f,m=n?Math.min(m,n.getFullYear()):m,e.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";m>=f;f++)e.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";e.yearshtml+="</select>",b+=e.yearshtml,e.yearshtml=null}return b+=this._get(e,"yearSuffix"),y&&(b+=(!a&&g&&v?"":"&#xa0;")+_),b+="</div>"},_adjustInstDate:function(e,t,i){var s=e.drawYear+("Y"===i?t:0),n=e.drawMonth+("M"===i?t:0),a=Math.min(e.selectedDay,this._getDaysInMonth(s,n))+("D"===i?t:0),o=this._restrictMinMax(e,this._daylightSavingAdjust(new Date(s,n,a)));e.selectedDay=o.getDate(),e.drawMonth=e.selectedMonth=o.getMonth(),e.drawYear=e.selectedYear=o.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(e)},_restrictMinMax:function(e,t){var i=this._getMinMaxDate(e,"min"),s=this._getMinMaxDate(e,"max"),n=i&&i>t?i:t;return s&&n>s?s:n},_notifyChange:function(e){var t=this._get(e,"onChangeMonthYear");t&&t.apply(e.input?e.input[0]:null,[e.selectedYear,e.selectedMonth+1,e])},_getNumberOfMonths:function(e){var t=this._get(e,"numberOfMonths");return null==t?[1,1]:"number"==typeof t?[1,t]:t},_getMinMaxDate:function(e,t){return this._determineDate(e,this._get(e,t+"Date"),null)},_getDaysInMonth:function(e,t){return 32-this._daylightSavingAdjust(new Date(e,t,32)).getDate()},_getFirstDayOfMonth:function(e,t){return new Date(e,t,1).getDay()},_canAdjustMonth:function(e,t,i,s){var n=this._getNumberOfMonths(e),a=this._daylightSavingAdjust(new Date(i,s+(0>t?t:n[0]*n[1]),1));return 0>t&&a.setDate(this._getDaysInMonth(a.getFullYear(),a.getMonth())),this._isInRange(e,a)},_isInRange:function(e,t){var i,s,n=this._getMinMaxDate(e,"min"),a=this._getMinMaxDate(e,"max"),o=null,r=null,h=this._get(e,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),o=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(o+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||t.getTime()>=n.getTime())&&(!a||t.getTime()<=a.getTime())&&(!o||t.getFullYear()>=o)&&(!r||r>=t.getFullYear())},_getFormatConfig:function(e){var t=this._get(e,"shortYearCutoff");return t="string"!=typeof t?t:(new Date).getFullYear()%100+parseInt(t,10),{shortYearCutoff:t,dayNamesShort:this._get(e,"dayNamesShort"),dayNames:this._get(e,"dayNames"),monthNamesShort:this._get(e,"monthNamesShort"),monthNames:this._get(e,"monthNames")}},_formatDate:function(e,t,i,s){t||(e.currentDay=e.selectedDay,e.currentMonth=e.selectedMonth,e.currentYear=e.selectedYear);var n=t?"object"==typeof t?t:this._daylightSavingAdjust(new Date(s,i,t)):this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return this.formatDate(this._get(e,"dateFormat"),n,this._getFormatConfig(e))}}),e.fn.datepicker=function(t){if(!this.length)return this;e.datepicker.initialized||(e(document).mousedown(e.datepicker._checkExternalClick),e.datepicker.initialized=!0),0===e("#"+e.datepicker._mainDivId).length&&e("body").append(e.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof t||"isDisabled"!==t&&"getDate"!==t&&"widget"!==t?"option"===t&&2===arguments.length&&"string"==typeof arguments[1]?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof t?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this].concat(i)):e.datepicker._attachDatepicker(this,t)}):e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i))},e.datepicker=new n,e.datepicker.initialized=!1,e.datepicker.uuid=(new Date).getTime(),e.datepicker.version="1.11.4",e.datepicker,e.widget("ui.draggable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._setHandleClassName(),this._mouseInit()},_setOption:function(e,t){this._super(e,t),"handle"===e&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(t){var i=this.options;return this._blurActiveElement(t),this.helper||i.disabled||e(t.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(t),this.handle?(this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(t){this.iframeBlocks=this.document.find(t).map(function(){var t=e(this);return e("<div>").css("position","absolute").appendTo(t.parent()).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(t){var i=this.document[0];if(this.handleElement.is(t.target))try{i.activeElement&&"body"!==i.activeElement.nodeName.toLowerCase()&&e(i.activeElement).blur()}catch(s){}},_mouseStart:function(t){var i=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===e(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(t),this.originalPosition=this.position=this._generatePosition(t,!1),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._normalizeRightBottom(),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_refreshOffsets:function(e){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:e.pageX-this.offset.left,top:e.pageY-this.offset.top}},_mouseDrag:function(t,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(t,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",t,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var i=this,s=!1;return e.ui.ddmanager&&!this.options.dropBehaviour&&(s=e.ui.ddmanager.drop(this,t)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",t)!==!1&&i._clear()}):this._trigger("stop",t)!==!1&&this._clear(),!1},_mouseUp:function(t){return this._unblockFrames(),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),this.handleElement.is(t.target)&&this.element.focus(),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){return this.options.handle?!!e(t.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this.handleElement.addClass("ui-draggable-handle")},_removeHandleClassName:function(){this.handleElement.removeClass("ui-draggable-handle")},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper),n=s?e(i.helper.apply(this.element[0],[t])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return n.parents("body").length||n.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css("position"))||n.css("position","absolute"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_isRootNode:function(e){return/(html|body)/i.test(e.tagName)||e===this.document[0]},_getParentOffset:function(){var t=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var e=this.element.position(),t=this._isRootNode(this.scrollParent[0]);return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+(t?0:this.scrollParent.scrollTop()),left:e.left-(parseInt(this.helper.css("left"),10)||0)+(t?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options,a=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,e(window).scrollLeft()+e(window).width()-this.helperProportions.width-this.margins.left,e(window).scrollTop()+(e(window).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,e(a).width()-this.helperProportions.width-this.margins.left,(e(a).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=e(n.containment),s=i[0],s&&(t=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(t?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(t?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0) +},_convertPositionTo:function(e,t){t||(t=this.position);var i="absolute"===e?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:t.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:t.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(e,t){var i,s,n,a,o=this.options,r=this._isRootNode(this.scrollParent[0]),h=e.pageX,l=e.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),t&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,e.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),e.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),e.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),o.grid&&(n=o.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-o.grid[1]:n+o.grid[1]:n,a=o.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,h=i?a-this.offset.click.left>=i[0]||a-this.offset.click.left>i[2]?a:a-this.offset.click.left>=i[0]?a-o.grid[0]:a+o.grid[0]:a),"y"===o.axis&&(h=this.originalPageX),"x"===o.axis&&(l=this.originalPageY)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_normalizeRightBottom:function(){"y"!==this.options.axis&&"auto"!==this.helper.css("right")&&(this.helper.width(this.helper.width()),this.helper.css("right","auto")),"x"!==this.options.axis&&"auto"!==this.helper.css("bottom")&&(this.helper.height(this.helper.height()),this.helper.css("bottom","auto"))},_trigger:function(t,i,s){return s=s||this._uiHash(),e.ui.plugin.call(this,t,[i,s,this],!0),/^(drag|start|stop)/.test(t)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),e.Widget.prototype._trigger.call(this,t,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add("draggable","connectToSortable",{start:function(t,i,s){var n=e.extend({},i,{item:s.element});s.sortables=[],e(s.options.connectToSortable).each(function(){var i=e(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",t,n))})},stop:function(t,i,s){var n=e.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,e.each(s.sortables,function(){var e=this;e.isOver?(e.isOver=0,s.cancelHelperRemoval=!0,e.cancelHelperRemoval=!1,e._storedCSS={position:e.placeholder.css("position"),top:e.placeholder.css("top"),left:e.placeholder.css("left")},e._mouseStop(t),e.options.helper=e.options._helper):(e.cancelHelperRemoval=!0,e._trigger("deactivate",t,n))})},drag:function(t,i,s){e.each(s.sortables,function(){var n=!1,a=this;a.positionAbs=s.positionAbs,a.helperProportions=s.helperProportions,a.offset.click=s.offset.click,a._intersectsWith(a.containerCache)&&(n=!0,e.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==a&&this._intersectsWith(this.containerCache)&&e.contains(a.element[0],this.element[0])&&(n=!1),n})),n?(a.isOver||(a.isOver=1,s._parent=i.helper.parent(),a.currentItem=i.helper.appendTo(a.element).data("ui-sortable-item",!0),a.options._helper=a.options.helper,a.options.helper=function(){return i.helper[0]},t.target=a.currentItem[0],a._mouseCapture(t,!0),a._mouseStart(t,!0,!0),a.offset.click.top=s.offset.click.top,a.offset.click.left=s.offset.click.left,a.offset.parent.left-=s.offset.parent.left-a.offset.parent.left,a.offset.parent.top-=s.offset.parent.top-a.offset.parent.top,s._trigger("toSortable",t),s.dropped=a.element,e.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,a.fromOutside=s),a.currentItem&&(a._mouseDrag(t),i.position=a.position)):a.isOver&&(a.isOver=0,a.cancelHelperRemoval=!0,a.options._revert=a.options.revert,a.options.revert=!1,a._trigger("out",t,a._uiHash(a)),a._mouseStop(t,!0),a.options.revert=a.options._revert,a.options.helper=a.options._helper,a.placeholder&&a.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(t),i.position=s._generatePosition(t,!0),s._trigger("fromSortable",t),s.dropped=!1,e.each(s.sortables,function(){this.refreshPositions()}))})}}),e.ui.plugin.add("draggable","cursor",{start:function(t,i,s){var n=e("body"),a=s.options;n.css("cursor")&&(a._cursor=n.css("cursor")),n.css("cursor",a.cursor)},stop:function(t,i,s){var n=s.options;n._cursor&&e("body").css("cursor",n._cursor)}}),e.ui.plugin.add("draggable","opacity",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("opacity")&&(a._opacity=n.css("opacity")),n.css("opacity",a.opacity)},stop:function(t,i,s){var n=s.options;n._opacity&&e(i.helper).css("opacity",n._opacity)}}),e.ui.plugin.add("draggable","scroll",{start:function(e,t,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(t,i,s){var n=s.options,a=!1,o=s.scrollParentNotHidden[0],r=s.document[0];o!==r&&"HTML"!==o.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+o.offsetHeight-t.pageY<n.scrollSensitivity?o.scrollTop=a=o.scrollTop+n.scrollSpeed:t.pageY-s.overflowOffset.top<n.scrollSensitivity&&(o.scrollTop=a=o.scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+o.offsetWidth-t.pageX<n.scrollSensitivity?o.scrollLeft=a=o.scrollLeft+n.scrollSpeed:t.pageX-s.overflowOffset.left<n.scrollSensitivity&&(o.scrollLeft=a=o.scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(t.pageY-e(r).scrollTop()<n.scrollSensitivity?a=e(r).scrollTop(e(r).scrollTop()-n.scrollSpeed):e(window).height()-(t.pageY-e(r).scrollTop())<n.scrollSensitivity&&(a=e(r).scrollTop(e(r).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(t.pageX-e(r).scrollLeft()<n.scrollSensitivity?a=e(r).scrollLeft(e(r).scrollLeft()-n.scrollSpeed):e(window).width()-(t.pageX-e(r).scrollLeft())<n.scrollSensitivity&&(a=e(r).scrollLeft(e(r).scrollLeft()+n.scrollSpeed)))),a!==!1&&e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(s,t)}}),e.ui.plugin.add("draggable","snap",{start:function(t,i,s){var n=s.options;s.snapElements=[],e(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var t=e(this),i=t.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:t.outerWidth(),height:t.outerHeight(),top:i.top,left:i.left})})},drag:function(t,i,s){var n,a,o,r,h,l,u,d,c,p,f=s.options,m=f.snapTolerance,g=i.offset.left,v=g+s.helperProportions.width,y=i.offset.top,b=y+s.helperProportions.height;for(c=s.snapElements.length-1;c>=0;c--)h=s.snapElements[c].left-s.margins.left,l=h+s.snapElements[c].width,u=s.snapElements[c].top-s.margins.top,d=u+s.snapElements[c].height,h-m>v||g>l+m||u-m>b||y>d+m||!e.contains(s.snapElements[c].item.ownerDocument,s.snapElements[c].item)?(s.snapElements[c].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=!1):("inner"!==f.snapMode&&(n=m>=Math.abs(u-b),a=m>=Math.abs(d-y),o=m>=Math.abs(h-v),r=m>=Math.abs(l-g),n&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left)),p=n||a||o||r,"outer"!==f.snapMode&&(n=m>=Math.abs(u-y),a=m>=Math.abs(d-b),o=m>=Math.abs(h-g),r=m>=Math.abs(l-v),n&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d-s.helperProportions.height,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left)),!s.snapElements[c].snapping&&(n||a||o||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=n||a||o||r||p)}}),e.ui.plugin.add("draggable","stack",{start:function(t,i,s){var n,a=s.options,o=e.makeArray(e(a.stack)).sort(function(t,i){return(parseInt(e(t).css("zIndex"),10)||0)-(parseInt(e(i).css("zIndex"),10)||0)});o.length&&(n=parseInt(e(o[0]).css("zIndex"),10)||0,e(o).each(function(t){e(this).css("zIndex",n+t)}),this.css("zIndex",n+o.length))}}),e.ui.plugin.add("draggable","zIndex",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("zIndex")&&(a._zIndex=n.css("zIndex")),n.css("zIndex",a.zIndex)},stop:function(t,i,s){var n=s.options;n._zIndex&&e(i.helper).css("zIndex",n._zIndex)}}),e.ui.draggable,e.widget("ui.resizable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(e){return parseInt(e,10)||0},_isNumber:function(e){return!isNaN(parseInt(e,10))},_hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return t[s]>0?!0:(t[s]=1,n=t[s]>0,t[s]=0,n)},_create:function(){var t,i,s,n,a,o=this,r=this.options;if(this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(e("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=e(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),t=this.handles.split(","),this.handles={},i=0;t.length>i;i++)s=e.trim(t[i]),a="ui-resizable-"+s,n=e("<div class='ui-resizable-handle "+a+"'></div>"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(t){var i,s,n,a;t=t||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=e(this.handles[i]),this._on(this.handles[i],{mousedown:o._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=e(this.handles[i],this.element),a=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),t.css(n,a),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.mouseover(function(){o.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),o.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(e(this).removeClass("ui-resizable-autohide"),o._handles.show())}).mouseleave(function(){r.disabled||o.resizing||(e(this).addClass("ui-resizable-autohide"),o._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t,i=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),t=this.element,this.originalElement.css({position:t.css("position"),width:t.outerWidth(),height:t.outerHeight(),top:t.css("top"),left:t.css("left")}).insertAfter(t),t.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(t){var i,s,n=!1;for(i in this.handles)s=e(this.handles[i])[0],(s===t.target||e.contains(s,t.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(t){var i,s,n,a=this.options,o=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),a.containment&&(i+=e(a.containment).scrollLeft()||0,s+=e(a.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:o.width(),height:o.height()},this.originalSize=this._helper?{width:o.outerWidth(),height:o.outerHeight()}:{width:o.width(),height:o.height()},this.sizeDiff={width:o.outerWidth()-o.width(),height:o.outerHeight()-o.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof a.aspectRatio?a.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=e(".ui-resizable-"+this.axis).css("cursor"),e("body").css("cursor","auto"===n?this.axis+"-resize":n),o.addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var i,s,n=this.originalMousePosition,a=this.axis,o=t.pageX-n.left||0,r=t.pageY-n.top||0,h=this._change[a];return this._updatePrevProperties(),h?(i=h.apply(this,[t,o,r]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(i=this._updateRatio(i,t)),i=this._respectSize(i,t),this._updateCache(i),this._propagate("resize",t),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),e.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(t){this.resizing=!1;var i,s,n,a,o,r,h,l=this.options,u=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:u.sizeDiff.height,a=s?0:u.sizeDiff.width,o={width:u.helper.width()-a,height:u.helper.height()-n},r=parseInt(u.element.css("left"),10)+(u.position.left-u.originalPosition.left)||null,h=parseInt(u.element.css("top"),10)+(u.position.top-u.originalPosition.top)||null,l.animate||this.element.css(e.extend(o,{top:h,left:r})),u.helper.height(u.size.height),u.helper.width(u.size.width),this._helper&&!l.animate&&this._proportionallyResize()),e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var e={};return this.position.top!==this.prevPosition.top&&(e.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(e.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(e.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(e.height=this.size.height+"px"),this.helper.css(e),e},_updateVirtualBoundaries:function(e){var t,i,s,n,a,o=this.options;a={minWidth:this._isNumber(o.minWidth)?o.minWidth:0,maxWidth:this._isNumber(o.maxWidth)?o.maxWidth:1/0,minHeight:this._isNumber(o.minHeight)?o.minHeight:0,maxHeight:this._isNumber(o.maxHeight)?o.maxHeight:1/0},(this._aspectRatio||e)&&(t=a.minHeight*this.aspectRatio,s=a.minWidth/this.aspectRatio,i=a.maxHeight*this.aspectRatio,n=a.maxWidth/this.aspectRatio,t>a.minWidth&&(a.minWidth=t),s>a.minHeight&&(a.minHeight=s),a.maxWidth>i&&(a.maxWidth=i),a.maxHeight>n&&(a.maxHeight=n)),this._vBoundaries=a},_updateCache:function(e){this.offset=this.helper.offset(),this._isNumber(e.left)&&(this.position.left=e.left),this._isNumber(e.top)&&(this.position.top=e.top),this._isNumber(e.height)&&(this.size.height=e.height),this._isNumber(e.width)&&(this.size.width=e.width)},_updateRatio:function(e){var t=this.position,i=this.size,s=this.axis;return this._isNumber(e.height)?e.width=e.height*this.aspectRatio:this._isNumber(e.width)&&(e.height=e.width/this.aspectRatio),"sw"===s&&(e.left=t.left+(i.width-e.width),e.top=null),"nw"===s&&(e.top=t.top+(i.height-e.height),e.left=t.left+(i.width-e.width)),e},_respectSize:function(e){var t=this._vBoundaries,i=this.axis,s=this._isNumber(e.width)&&t.maxWidth&&t.maxWidth<e.width,n=this._isNumber(e.height)&&t.maxHeight&&t.maxHeight<e.height,a=this._isNumber(e.width)&&t.minWidth&&t.minWidth>e.width,o=this._isNumber(e.height)&&t.minHeight&&t.minHeight>e.height,r=this.originalPosition.left+this.originalSize.width,h=this.position.top+this.size.height,l=/sw|nw|w/.test(i),u=/nw|ne|n/.test(i);return a&&(e.width=t.minWidth),o&&(e.height=t.minHeight),s&&(e.width=t.maxWidth),n&&(e.height=t.maxHeight),a&&l&&(e.left=r-t.minWidth),s&&l&&(e.left=r-t.maxWidth),o&&u&&(e.top=h-t.minHeight),n&&u&&(e.top=h-t.maxHeight),e.width||e.height||e.left||!e.top?e.width||e.height||e.top||!e.left||(e.left=null):e.top=null,e},_getPaddingPlusBorderDimensions:function(e){for(var t=0,i=[],s=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],n=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];4>t;t++)i[t]=parseInt(s[t],10)||0,i[t]+=parseInt(n[t],10)||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var e,t=0,i=this.helper||this.element;this._proportionallyResizeElements.length>t;t++)e=this._proportionallyResizeElements[t],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(e)),e.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var t=this.element,i=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||e("<div style='overflow:hidden;'></div>"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(e,t){return{width:this.originalSize.width+t}},w:function(e,t){var i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(e,t,i){return{height:this.originalSize.height+i}},se:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},sw:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,i,s]))},ne:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},nw:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,i,s]))}},_propagate:function(t,i){e.ui.plugin.call(this,t,[i,this.ui()]),"resize"!==t&&this._trigger(t,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add("resizable","animate",{stop:function(t){var i=e(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,a=n.length&&/textarea/i.test(n[0].nodeName),o=a&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=a?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-o},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,u=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(e.extend(h,u&&l?{top:u,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&e(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(){var t,i,s,n,a,o,r,h=e(this).resizable("instance"),l=h.options,u=h.element,d=l.containment,c=d instanceof e?d.get(0):/parent/.test(d)?u.parent().get(0):d;c&&(h.containerElement=e(c),/document/.test(d)||d===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}):(t=e(c),i=[],e(["Top","Right","Left","Bottom"]).each(function(e,s){i[e]=h._num(t.css("padding"+s))}),h.containerOffset=t.offset(),h.containerPosition=t.position(),h.containerSize={height:t.innerHeight()-i[3],width:t.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,a=h.containerSize.width,o=h._hasScroll(c,"left")?c.scrollWidth:a,r=h._hasScroll(c)?c.scrollHeight:n,h.parentData={element:c,left:s.left,top:s.top,width:o,height:r}))},resize:function(t){var i,s,n,a,o=e(this).resizable("instance"),r=o.options,h=o.containerOffset,l=o.position,u=o._aspectRatio||t.shiftKey,d={top:0,left:0},c=o.containerElement,p=!0;c[0]!==document&&/static/.test(c.css("position"))&&(d=h),l.left<(o._helper?h.left:0)&&(o.size.width=o.size.width+(o._helper?o.position.left-h.left:o.position.left-d.left),u&&(o.size.height=o.size.width/o.aspectRatio,p=!1),o.position.left=r.helper?h.left:0),l.top<(o._helper?h.top:0)&&(o.size.height=o.size.height+(o._helper?o.position.top-h.top:o.position.top),u&&(o.size.width=o.size.height*o.aspectRatio,p=!1),o.position.top=o._helper?h.top:0),n=o.containerElement.get(0)===o.element.parent().get(0),a=/relative|absolute/.test(o.containerElement.css("position")),n&&a?(o.offset.left=o.parentData.left+o.position.left,o.offset.top=o.parentData.top+o.position.top):(o.offset.left=o.element.offset().left,o.offset.top=o.element.offset().top),i=Math.abs(o.sizeDiff.width+(o._helper?o.offset.left-d.left:o.offset.left-h.left)),s=Math.abs(o.sizeDiff.height+(o._helper?o.offset.top-d.top:o.offset.top-h.top)),i+o.size.width>=o.parentData.width&&(o.size.width=o.parentData.width-i,u&&(o.size.height=o.size.width/o.aspectRatio,p=!1)),s+o.size.height>=o.parentData.height&&(o.size.height=o.parentData.height-s,u&&(o.size.width=o.size.height*o.aspectRatio,p=!1)),p||(o.position.left=o.prevPosition.left,o.position.top=o.prevPosition.top,o.size.width=o.prevSize.width,o.size.height=o.prevSize.height)},stop:function(){var t=e(this).resizable("instance"),i=t.options,s=t.containerOffset,n=t.containerPosition,a=t.containerElement,o=e(t.helper),r=o.offset(),h=o.outerWidth()-t.sizeDiff.width,l=o.outerHeight()-t.sizeDiff.height;t._helper&&!i.animate&&/relative/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l}),t._helper&&!i.animate&&/static/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),e.ui.plugin.add("resizable","alsoResize",{start:function(){var t=e(this).resizable("instance"),i=t.options;e(i.alsoResize).each(function(){var t=e(this);t.data("ui-resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})},resize:function(t,i){var s=e(this).resizable("instance"),n=s.options,a=s.originalSize,o=s.originalPosition,r={height:s.size.height-a.height||0,width:s.size.width-a.width||0,top:s.position.top-o.top||0,left:s.position.left-o.left||0};e(n.alsoResize).each(function(){var t=e(this),s=e(this).data("ui-resizable-alsoresize"),n={},a=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(a,function(e,t){var i=(s[t]||0)+(r[t]||0);i&&i>=0&&(n[t]=i||null)}),t.css(n)})},stop:function(){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","ghost",{start:function(){var t=e(this).resizable("instance"),i=t.options,s=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),t.ghost.appendTo(t.helper)},resize:function(){var t=e(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=e(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(){var t,i=e(this).resizable("instance"),s=i.options,n=i.size,a=i.originalSize,o=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,u=h[1]||1,d=Math.round((n.width-a.width)/l)*l,c=Math.round((n.height-a.height)/u)*u,p=a.width+d,f=a.height+c,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,v=s.minWidth&&s.minWidth>p,y=s.minHeight&&s.minHeight>f;s.grid=h,v&&(p+=l),y&&(f+=u),m&&(p-=l),g&&(f-=u),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=o.top-c):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=o.left-d):((0>=f-u||0>=p-l)&&(t=i._getPaddingPlusBorderDimensions(this)),f-u>0?(i.size.height=f,i.position.top=o.top-c):(f=u-t.height,i.size.height=f,i.position.top=o.top+a.height-f),p-l>0?(i.size.width=p,i.position.left=o.left-d):(p=l-t.width,i.size.width=p,i.position.left=o.left+a.width-p))}}),e.ui.resizable,e.widget("ui.dialog",{version:"1.11.4",options:{appendTo:"body",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:"Close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(t){var i=e(this).css(t).offset().top;0>i&&e(this).css("top",t.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),this.options.title=this.options.title||this.originalTitle,this._createWrapper(),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(this.uiDialog),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&e.fn.draggable&&this._makeDraggable(),this.options.resizable&&e.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var t=this.options.appendTo;return t&&(t.jquery||t.nodeType)?e(t):this.document.find(t||"body").eq(0)},_destroy:function(){var e,t=this.originalPosition;this._untrackInstance(),this._destroyOverlay(),this.element.removeUniqueId().removeClass("ui-dialog-content ui-widget-content").css(this.originalCss).detach(),this.uiDialog.stop(!0,!0).remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),e=t.parent.children().eq(t.index),e.length&&e[0]!==this.element[0]?e.before(this.element):t.parent.append(this.element)},widget:function(){return this.uiDialog},disable:e.noop,enable:e.noop,close:function(t){var i,s=this;if(this._isOpen&&this._trigger("beforeClose",t)!==!1){if(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),!this.opener.filter(":focusable").focus().length)try{i=this.document[0].activeElement,i&&"body"!==i.nodeName.toLowerCase()&&e(i).blur()}catch(n){}this._hide(this.uiDialog,this.options.hide,function(){s._trigger("close",t)})}},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(t,i){var s=!1,n=this.uiDialog.siblings(".ui-front:visible").map(function(){return+e(this).css("z-index")}).get(),a=Math.max.apply(null,n);return a>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",a+1),s=!0),s&&!i&&this._trigger("focus",t),s},open:function(){var t=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=e(this.document[0].activeElement),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){t._focusTabbable(),t._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"),void 0)},_focusTabbable:function(){var e=this._focusedElement;e||(e=this.element.find("[autofocus]")),e.length||(e=this.element.find(":tabbable")),e.length||(e=this.uiDialogButtonPane.find(":tabbable")),e.length||(e=this.uiDialogTitlebarClose.filter(":tabbable")),e.length||(e=this.uiDialog),e.eq(0).focus()},_keepFocus:function(t){function i(){var t=this.document[0].activeElement,i=this.uiDialog[0]===t||e.contains(this.uiDialog[0],t);i||this._focusTabbable()}t.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=e("<div>").addClass("ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "+this.options.dialogClass).hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._on(this.uiDialog,{keydown:function(t){if(this.options.closeOnEscape&&!t.isDefaultPrevented()&&t.keyCode&&t.keyCode===e.ui.keyCode.ESCAPE)return t.preventDefault(),this.close(t),void 0; +if(t.keyCode===e.ui.keyCode.TAB&&!t.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");t.target!==n[0]&&t.target!==this.uiDialog[0]||t.shiftKey?t.target!==s[0]&&t.target!==this.uiDialog[0]||!t.shiftKey||(this._delay(function(){n.focus()}),t.preventDefault()):(this._delay(function(){s.focus()}),t.preventDefault())}},mousedown:function(e){this._moveToTop(e)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var t;this.uiDialogTitlebar=e("<div>").addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(this.uiDialog),this._on(this.uiDialogTitlebar,{mousedown:function(t){e(t.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.focus()}}),this.uiDialogTitlebarClose=e("<button type='button'></button>").button({label:this.options.closeText,icons:{primary:"ui-icon-closethick"},text:!1}).addClass("ui-dialog-titlebar-close").appendTo(this.uiDialogTitlebar),this._on(this.uiDialogTitlebarClose,{click:function(e){e.preventDefault(),this.close(e)}}),t=e("<span>").uniqueId().addClass("ui-dialog-title").prependTo(this.uiDialogTitlebar),this._title(t),this.uiDialog.attr({"aria-labelledby":t.attr("id")})},_title:function(e){this.options.title||e.html("&#160;"),e.text(this.options.title)},_createButtonPane:function(){this.uiDialogButtonPane=e("<div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),this.uiButtonSet=e("<div>").addClass("ui-dialog-buttonset").appendTo(this.uiDialogButtonPane),this._createButtons()},_createButtons:function(){var t=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),e.isEmptyObject(i)||e.isArray(i)&&!i.length?(this.uiDialog.removeClass("ui-dialog-buttons"),void 0):(e.each(i,function(i,s){var n,a;s=e.isFunction(s)?{click:s,text:i}:s,s=e.extend({type:"button"},s),n=s.click,s.click=function(){n.apply(t.element[0],arguments)},a={icons:s.icons,text:s.showText},delete s.icons,delete s.showText,e("<button></button>",s).button(a).appendTo(t.uiButtonSet)}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function t(e){return{position:e.position,offset:e.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){e(this).addClass("ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,t(n))},drag:function(e,s){i._trigger("drag",e,t(s))},stop:function(n,a){var o=a.offset.left-i.document.scrollLeft(),r=a.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(o>=0?"+":"")+o+" "+"top"+(r>=0?"+":"")+r,of:i.window},e(this).removeClass("ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,t(a))}})},_makeResizable:function(){function t(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}var i=this,s=this.options,n=s.resizable,a=this.uiDialog.css("position"),o="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:o,start:function(s,n){e(this).addClass("ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,t(n))},resize:function(e,s){i._trigger("resize",e,t(s))},stop:function(n,a){var o=i.uiDialog.offset(),r=o.left-i.document.scrollLeft(),h=o.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(h>=0?"+":"")+h,of:i.window},e(this).removeClass("ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,t(a))}}).css("position",a)},_trackFocus:function(){this._on(this.widget(),{focusin:function(t){this._makeFocusTarget(),this._focusedElement=e(t.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var t=this._trackingInstances(),i=e.inArray(this,t);-1!==i&&t.splice(i,1)},_trackingInstances:function(){var e=this.document.data("ui-dialog-instances");return e||(e=[],this.document.data("ui-dialog-instances",e)),e},_minHeight:function(){var e=this.options;return"auto"===e.height?e.minHeight:Math.min(e.minHeight,e.height)},_position:function(){var e=this.uiDialog.is(":visible");e||this.uiDialog.show(),this.uiDialog.position(this.options.position),e||this.uiDialog.hide()},_setOptions:function(t){var i=this,s=!1,n={};e.each(t,function(e,t){i._setOption(e,t),e in i.sizeRelatedOptions&&(s=!0),e in i.resizableRelatedOptions&&(n[e]=t)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(e,t){var i,s,n=this.uiDialog;"dialogClass"===e&&n.removeClass(this.options.dialogClass).addClass(t),"disabled"!==e&&(this._super(e,t),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:""+t}),"draggable"===e&&(i=n.is(":data(ui-draggable)"),i&&!t&&n.draggable("destroy"),!i&&t&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(s=n.is(":data(ui-resizable)"),s&&!t&&n.resizable("destroy"),s&&"string"==typeof t&&n.resizable("option","handles",t),s||t===!1||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var e,t,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),e=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),t=Math.max(0,s.minHeight-e),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-e):"none","auto"===s.height?this.element.css({minHeight:t,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-e)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var t=e(this);return e("<div>").css({position:"absolute",width:t.outerWidth(),height:t.outerHeight()}).appendTo(t.parent()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(t){return e(t.target).closest(".ui-dialog").length?!0:!!e(t.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var t=!0;this._delay(function(){t=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(e){t||this._allowInteraction(e)||(e.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=e("<div>").addClass("ui-widget-overlay ui-front").appendTo(this._appendTo()),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var e=this.document.data("ui-dialog-overlays")-1;e?this.document.data("ui-dialog-overlays",e):this.document.unbind("focusin").removeData("ui-dialog-overlays"),this.overlay.remove(),this.overlay=null}}}),e.widget("ui.droppable",{version:"1.11.4",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var t,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=e.isFunction(s)?s:function(e){return e.is(s)},this.proportions=function(){return arguments.length?(t=arguments[0],void 0):t?t:t={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this.element.addClass("ui-droppable")},_addToManager:function(t){e.ui.ddmanager.droppables[t]=e.ui.ddmanager.droppables[t]||[],e.ui.ddmanager.droppables[t].push(this)},_splice:function(e){for(var t=0;e.length>t;t++)e[t]===this&&e.splice(t,1)},_destroy:function(){var t=e.ui.ddmanager.droppables[this.options.scope];this._splice(t),this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(t,i){if("accept"===t)this.accept=e.isFunction(i)?i:function(e){return e.is(i)};else if("scope"===t){var s=e.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(t,i)},_activate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger("activate",t,this.ui(i))},_deactivate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger("deactivate",t,this.ui(i))},_over:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",t,this.ui(i)))},_out:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",t,this.ui(i)))},_drop:function(t,i){var s=i||e.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=e(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&e.ui.intersect(s,e.extend(i,{offset:i.element.offset()}),i.options.tolerance,t)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",t,this.ui(s)),this.element):!1):!1},ui:function(e){return{draggable:e.currentItem||e.element,helper:e.helper,position:e.position,offset:e.positionAbs}}}),e.ui.intersect=function(){function e(e,t,i){return e>=t&&t+i>e}return function(t,i,s,n){if(!i.offset)return!1;var a=(t.positionAbs||t.position.absolute).left+t.margins.left,o=(t.positionAbs||t.position.absolute).top+t.margins.top,r=a+t.helperProportions.width,h=o+t.helperProportions.height,l=i.offset.left,u=i.offset.top,d=l+i.proportions().width,c=u+i.proportions().height;switch(s){case"fit":return a>=l&&d>=r&&o>=u&&c>=h;case"intersect":return a+t.helperProportions.width/2>l&&d>r-t.helperProportions.width/2&&o+t.helperProportions.height/2>u&&c>h-t.helperProportions.height/2;case"pointer":return e(n.pageY,u,i.proportions().height)&&e(n.pageX,l,i.proportions().width);case"touch":return(o>=u&&c>=o||h>=u&&c>=h||u>o&&h>c)&&(a>=l&&d>=a||r>=l&&d>=r||l>a&&r>d);default:return!1}}}(),e.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(t,i){var s,n,a=e.ui.ddmanager.droppables[t.options.scope]||[],o=i?i.type:null,r=(t.currentItem||t.element).find(":data(ui-droppable)").addBack();e:for(s=0;a.length>s;s++)if(!(a[s].options.disabled||t&&!a[s].accept.call(a[s].element[0],t.currentItem||t.element))){for(n=0;r.length>n;n++)if(r[n]===a[s].element[0]){a[s].proportions().height=0;continue e}a[s].visible="none"!==a[s].element.css("display"),a[s].visible&&("mousedown"===o&&a[s]._activate.call(a[s],i),a[s].offset=a[s].element.offset(),a[s].proportions({width:a[s].element[0].offsetWidth,height:a[s].element[0].offsetHeight}))}},drop:function(t,i){var s=!1;return e.each((e.ui.ddmanager.droppables[t.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&e.ui.intersect(t,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],t.currentItem||t.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(t,i){t.element.parentsUntil("body").bind("scroll.droppable",function(){t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)})},drag:function(t,i){t.options.refreshPositions&&e.ui.ddmanager.prepareOffsets(t,i),e.each(e.ui.ddmanager.droppables[t.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,a,o=e.ui.intersect(t,this,this.options.tolerance,i),r=!o&&this.isover?"isout":o&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,a=this.element.parents(":data(ui-droppable)").filter(function(){return e(this).droppable("instance").options.scope===n}),a.length&&(s=e(a[0]).droppable("instance"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(t,i){t.element.parentsUntil("body").unbind("scroll.droppable"),t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)}},e.ui.droppable;var y="ui-effects-",b=e;e.effects={effect:{}},function(e,t){function i(e,t,i){var s=d[t.type]||{};return null==e?i||!t.def?null:t.def:(e=s.floor?~~e:parseFloat(e),isNaN(e)?t.def:s.mod?(e+s.mod)%s.mod:0>e?0:e>s.max?s.max:e)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(e,a){var o,r=a.re.exec(i),h=r&&a.parse(r),l=a.space||"rgba";return h?(o=s[l](h),s[u[l].cache]=o[u[l].cache],n=s._rgba=o._rgba,!1):t}),n.length?("0,0,0,0"===n.join()&&e.extend(n,a.transparent),s):a[i]}function n(e,t,i){return i=(i+1)%1,1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+6*(t-e)*(2/3-i):e}var a,o="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[e[1],e[2],e[3],e[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[2.55*e[1],2.55*e[2],2.55*e[3],e[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(e){return[e[1],e[2]/100,e[3]/100,e[4]]}}],l=e.Color=function(t,i,s,n){return new e.Color.fn.parse(t,i,s,n)},u={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},d={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},c=l.support={},p=e("<p>")[0],f=e.each;p.style.cssText="background-color:rgba(1,1,1,.5)",c.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(u,function(e,t){t.cache="_"+e,t.props.alpha={idx:3,type:"percent",def:1}}),l.fn=e.extend(l.prototype,{parse:function(n,o,r,h){if(n===t)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=e(n).css(o),o=t);var d=this,c=e.type(n),p=this._rgba=[];return o!==t&&(n=[n,o,r,h],c="array"),"string"===c?this.parse(s(n)||a._default):"array"===c?(f(u.rgba.props,function(e,t){p[t.idx]=i(n[t.idx],t)}),this):"object"===c?(n instanceof l?f(u,function(e,t){n[t.cache]&&(d[t.cache]=n[t.cache].slice())}):f(u,function(t,s){var a=s.cache;f(s.props,function(e,t){if(!d[a]&&s.to){if("alpha"===e||null==n[e])return;d[a]=s.to(d._rgba)}d[a][t.idx]=i(n[e],t,!0)}),d[a]&&0>e.inArray(null,d[a].slice(0,3))&&(d[a][3]=1,s.from&&(d._rgba=s.from(d[a])))}),this):t},is:function(e){var i=l(e),s=!0,n=this;return f(u,function(e,a){var o,r=i[a.cache];return r&&(o=n[a.cache]||a.to&&a.to(n._rgba)||[],f(a.props,function(e,i){return null!=r[i.idx]?s=r[i.idx]===o[i.idx]:t})),s}),s},_space:function(){var e=[],t=this;return f(u,function(i,s){t[s.cache]&&e.push(i)}),e.pop()},transition:function(e,t){var s=l(e),n=s._space(),a=u[n],o=0===this.alpha()?l("transparent"):this,r=o[a.cache]||a.to(o._rgba),h=r.slice();return s=s[a.cache],f(a.props,function(e,n){var a=n.idx,o=r[a],l=s[a],u=d[n.type]||{};null!==l&&(null===o?h[a]=l:(u.mod&&(l-o>u.mod/2?o+=u.mod:o-l>u.mod/2&&(o-=u.mod)),h[a]=i((l-o)*t+o,n)))}),this[n](h)},blend:function(t){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(t)._rgba;return l(e.map(i,function(e,t){return(1-s)*n[t]+s*e}))},toRgbaString:function(){var t="rgba(",i=e.map(this._rgba,function(e,t){return null==e?t>2?1:0:e});return 1===i[3]&&(i.pop(),t="rgb("),t+i.join()+")"},toHslaString:function(){var t="hsla(",i=e.map(this.hsla(),function(e,t){return null==e&&(e=t>2?1:0),t&&3>t&&(e=Math.round(100*e)+"%"),e});return 1===i[3]&&(i.pop(),t="hsl("),t+i.join()+")"},toHexString:function(t){var i=this._rgba.slice(),s=i.pop();return t&&i.push(~~(255*s)),"#"+e.map(i,function(e){return e=(e||0).toString(16),1===e.length?"0"+e:e}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,u.hsla.to=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t,i,s=e[0]/255,n=e[1]/255,a=e[2]/255,o=e[3],r=Math.max(s,n,a),h=Math.min(s,n,a),l=r-h,u=r+h,d=.5*u;return t=h===r?0:s===r?60*(n-a)/l+360:n===r?60*(a-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=d?l/u:l/(2-u),[Math.round(t)%360,i,d,null==o?1:o]},u.hsla.from=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t=e[0]/360,i=e[1],s=e[2],a=e[3],o=.5>=s?s*(1+i):s+i-s*i,r=2*s-o;return[Math.round(255*n(r,o,t+1/3)),Math.round(255*n(r,o,t)),Math.round(255*n(r,o,t-1/3)),a]},f(u,function(s,n){var a=n.props,o=n.cache,h=n.to,u=n.from;l.fn[s]=function(s){if(h&&!this[o]&&(this[o]=h(this._rgba)),s===t)return this[o].slice();var n,r=e.type(s),d="array"===r||"object"===r?s:arguments,c=this[o].slice();return f(a,function(e,t){var s=d["object"===r?e:t.idx];null==s&&(s=c[t.idx]),c[t.idx]=i(s,t)}),u?(n=l(u(c)),n[o]=c,n):l(c)},f(a,function(t,i){l.fn[t]||(l.fn[t]=function(n){var a,o=e.type(n),h="alpha"===t?this._hsla?"hsla":"rgba":s,l=this[h](),u=l[i.idx];return"undefined"===o?u:("function"===o&&(n=n.call(this,u),o=e.type(n)),null==n&&i.empty?this:("string"===o&&(a=r.exec(n),a&&(n=u+parseFloat(a[2])*("+"===a[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(t){var i=t.split(" ");f(i,function(t,i){e.cssHooks[i]={set:function(t,n){var a,o,r="";if("transparent"!==n&&("string"!==e.type(n)||(a=s(n)))){if(n=l(a||n),!c.rgba&&1!==n._rgba[3]){for(o="backgroundColor"===i?t.parentNode:t;(""===r||"transparent"===r)&&o&&o.style;)try{r=e.css(o,"backgroundColor"),o=o.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{t.style[i]=n}catch(h){}}},e.fx.step[i]=function(t){t.colorInit||(t.start=l(t.elem,i),t.end=l(t.end),t.colorInit=!0),e.cssHooks[i].set(t.elem,t.start.transition(t.end,t.pos))}})},l.hook(o),e.cssHooks.borderColor={expand:function(e){var t={};return f(["Top","Right","Bottom","Left"],function(i,s){t["border"+s+"Color"]=e}),t}},a=e.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(b),function(){function t(t){var i,s,n=t.ownerDocument.defaultView?t.ownerDocument.defaultView.getComputedStyle(t,null):t.currentStyle,a={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(a[e.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(a[i]=n[i]);return a}function i(t,i){var s,a,o={};for(s in i)a=i[s],t[s]!==a&&(n[s]||(e.fx.step[s]||!isNaN(parseFloat(a)))&&(o[s]=a));return o}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};e.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(t,i){e.fx.step[i]=function(e){("none"!==e.end&&!e.setAttr||1===e.pos&&!e.setAttr)&&(b.style(e.elem,i,e.end),e.setAttr=!0)}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e.effects.animateClass=function(n,a,o,r){var h=e.speed(a,o,r);return this.queue(function(){var a,o=e(this),r=o.attr("class")||"",l=h.children?o.find("*").addBack():o;l=l.map(function(){var i=e(this);return{el:i,start:t(this)}}),a=function(){e.each(s,function(e,t){n[t]&&o[t+"Class"](n[t])})},a(),l=l.map(function(){return this.end=t(this.el[0]),this.diff=i(this.start,this.end),this}),o.attr("class",r),l=l.map(function(){var t=this,i=e.Deferred(),s=e.extend({},h,{queue:!1,complete:function(){i.resolve(t)}});return this.el.animate(this.diff,s),i.promise()}),e.when.apply(e,l.get()).done(function(){a(),e.each(arguments,function(){var t=this.el;e.each(this.diff,function(e){t.css(e,"")})}),h.complete.call(o[0])})})},e.fn.extend({addClass:function(t){return function(i,s,n,a){return s?e.effects.animateClass.call(this,{add:i},s,n,a):t.apply(this,arguments)}}(e.fn.addClass),removeClass:function(t){return function(i,s,n,a){return arguments.length>1?e.effects.animateClass.call(this,{remove:i},s,n,a):t.apply(this,arguments)}}(e.fn.removeClass),toggleClass:function(t){return function(i,s,n,a,o){return"boolean"==typeof s||void 0===s?n?e.effects.animateClass.call(this,s?{add:i}:{remove:i},n,a,o):t.apply(this,arguments):e.effects.animateClass.call(this,{toggle:i},s,n,a)}}(e.fn.toggleClass),switchClass:function(t,i,s,n,a){return e.effects.animateClass.call(this,{add:i,remove:t},s,n,a)}})}(),function(){function t(t,i,s,n){return e.isPlainObject(t)&&(i=t,t=t.effect),t={effect:t},null==i&&(i={}),e.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||e.fx.speeds[i])&&(n=s,s=i,i={}),e.isFunction(s)&&(n=s,s=null),i&&e.extend(t,i),s=s||i.duration,t.duration=e.fx.off?0:"number"==typeof s?s:s in e.fx.speeds?e.fx.speeds[s]:e.fx.speeds._default,t.complete=n||i.complete,t}function i(t){return!t||"number"==typeof t||e.fx.speeds[t]?!0:"string"!=typeof t||e.effects.effect[t]?e.isFunction(t)?!0:"object"!=typeof t||t.effect?!1:!0:!0}e.extend(e.effects,{version:"1.11.4",save:function(e,t){for(var i=0;t.length>i;i++)null!==t[i]&&e.data(y+t[i],e[0].style[t[i]])},restore:function(e,t){var i,s;for(s=0;t.length>s;s++)null!==t[s]&&(i=e.data(y+t[s]),void 0===i&&(i=""),e.css(t[s],i))},setMode:function(e,t){return"toggle"===t&&(t=e.is(":hidden")?"show":"hide"),t},getBaseline:function(e,t){var i,s;switch(e[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=e[0]/t.height}switch(e[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=e[1]/t.width}return{x:s,y:i}},createWrapper:function(t){if(t.parent().is(".ui-effects-wrapper"))return t.parent();var i={width:t.outerWidth(!0),height:t.outerHeight(!0),"float":t.css("float")},s=e("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:t.width(),height:t.height()},a=document.activeElement;try{a.id}catch(o){a=document.body}return t.wrap(s),(t[0]===a||e.contains(t[0],a))&&e(a).focus(),s=t.parent(),"static"===t.css("position")?(s.css({position:"relative"}),t.css({position:"relative"})):(e.extend(i,{position:t.css("position"),zIndex:t.css("z-index")}),e.each(["top","left","bottom","right"],function(e,s){i[s]=t.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),t.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),t.css(n),s.css(i).show()},removeWrapper:function(t){var i=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),(t[0]===i||e.contains(t[0],i))&&e(i).focus()),t},setTransition:function(t,i,s,n){return n=n||{},e.each(i,function(e,i){var a=t.cssUnit(i);a[0]>0&&(n[i]=a[0]*s+a[1])}),n}}),e.fn.extend({effect:function(){function i(t){function i(){e.isFunction(a)&&a.call(n[0]),e.isFunction(t)&&t()}var n=e(this),a=s.complete,r=s.mode;(n.is(":hidden")?"hide"===r:"show"===r)?(n[r](),i()):o.call(n[0],s,i)}var s=t.apply(this,arguments),n=s.mode,a=s.queue,o=e.effects.effect[s.effect];return e.fx.off||!o?n?this[n](s.duration,s.complete):this.each(function(){s.complete&&s.complete.call(this)}):a===!1?this.each(i):this.queue(a||"fx",i)},show:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="show",this.effect.call(this,n)}}(e.fn.show),hide:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(e.fn.hide),toggle:function(e){return function(s){if(i(s)||"boolean"==typeof s)return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(e.fn.toggle),cssUnit:function(t){var i=this.css(t),s=[];return e.each(["em","px","%","pt"],function(e,t){i.indexOf(t)>0&&(s=[parseFloat(i),t])}),s}})}(),function(){var t={};e.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,i){t[i]=function(t){return Math.pow(t,e+2)}}),e.extend(t,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)},Elastic:function(e){return 0===e||1===e?e:-Math.pow(2,8*(e-1))*Math.sin((80*(e-1)-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){for(var t,i=4;((t=Math.pow(2,--i))-1)/11>e;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*t-2)/22-e,2)}}),e.each(t,function(t,i){e.easing["easeIn"+t]=i,e.easing["easeOut"+t]=function(e){return 1-i(1-e)},e.easing["easeInOut"+t]=function(e){return.5>e?i(2*e)/2:1-i(-2*e+2)/2}})}(),e.effects,e.effects.effect.blind=function(t,i){var s,n,a,o=e(this),r=/up|down|vertical/,h=/up|left|vertical|horizontal/,l=["position","top","bottom","left","right","height","width"],u=e.effects.setMode(o,t.mode||"hide"),d=t.direction||"up",c=r.test(d),p=c?"height":"width",f=c?"top":"left",m=h.test(d),g={},v="show"===u;o.parent().is(".ui-effects-wrapper")?e.effects.save(o.parent(),l):e.effects.save(o,l),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n=s[p](),a=parseFloat(s.css(f))||0,g[p]=v?n:0,m||(o.css(c?"bottom":"right",0).css(c?"top":"left","auto").css({position:"absolute"}),g[f]=v?a:n+a),v&&(s.css(p,0),m||s.css(f,a+n)),s.animate(g,{duration:t.duration,easing:t.easing,queue:!1,complete:function(){"hide"===u&&o.hide(),e.effects.restore(o,l),e.effects.removeWrapper(o),i()}})},e.effects.effect.bounce=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"effect"),l="hide"===h,u="show"===h,d=t.direction||"up",c=t.distance,p=t.times||5,f=2*p+(u||l?1:0),m=t.duration/f,g=t.easing,v="up"===d||"down"===d?"top":"left",y="up"===d||"left"===d,b=o.queue(),_=b.length;for((u||l)&&r.push("opacity"),e.effects.save(o,r),o.show(),e.effects.createWrapper(o),c||(c=o["top"===v?"outerHeight":"outerWidth"]()/3),u&&(a={opacity:1},a[v]=0,o.css("opacity",0).css(v,y?2*-c:2*c).animate(a,m,g)),l&&(c/=Math.pow(2,p-1)),a={},a[v]=0,s=0;p>s;s++)n={},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g).animate(a,m,g),c=l?2*c:c/2;l&&(n={opacity:0},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g)),o.queue(function(){l&&o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}),_>1&&b.splice.apply(b,[1,0].concat(b.splice(_,f+1))),o.dequeue()},e.effects.effect.clip=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"hide"),l="show"===h,u=t.direction||"vertical",d="vertical"===u,c=d?"height":"width",p=d?"top":"left",f={};e.effects.save(o,r),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n="IMG"===o[0].tagName?s:o,a=n[c](),l&&(n.css(c,0),n.css(p,a/2)),f[c]=l?a:0,f[p]=l?0:a/2,n.animate(f,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){l||o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}})},e.effects.effect.drop=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","opacity","height","width"],o=e.effects.setMode(n,t.mode||"hide"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h?"pos":"neg",d={opacity:r?1:0};e.effects.save(n,a),n.show(),e.effects.createWrapper(n),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0)/2,r&&n.css("opacity",0).css(l,"pos"===u?-s:s),d[l]=(r?"pos"===u?"+=":"-=":"pos"===u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.explode=function(t,i){function s(){b.push(this),b.length===d*c&&n()}function n(){p.css({visibility:"visible"}),e(b).remove(),m||p.hide(),i()}var a,o,r,h,l,u,d=t.pieces?Math.round(Math.sqrt(t.pieces)):3,c=d,p=e(this),f=e.effects.setMode(p,t.mode||"hide"),m="show"===f,g=p.show().css("visibility","hidden").offset(),v=Math.ceil(p.outerWidth()/c),y=Math.ceil(p.outerHeight()/d),b=[];for(a=0;d>a;a++)for(h=g.top+a*y,u=a-(d-1)/2,o=0;c>o;o++)r=g.left+o*v,l=o-(c-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-o*v,top:-a*y}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:v,height:y,left:r+(m?l*v:0),top:h+(m?u*y:0),opacity:m?0:1}).animate({left:r+(m?0:l*v),top:h+(m?0:u*y),opacity:m?1:0},t.duration||500,t.easing,s)},e.effects.effect.fade=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"toggle");s.animate({opacity:n},{queue:!1,duration:t.duration,easing:t.easing,complete:i})},e.effects.effect.fold=function(t,i){var s,n,a=e(this),o=["position","top","bottom","left","right","height","width"],r=e.effects.setMode(a,t.mode||"hide"),h="show"===r,l="hide"===r,u=t.size||15,d=/([0-9]+)%/.exec(u),c=!!t.horizFirst,p=h!==c,f=p?["width","height"]:["height","width"],m=t.duration/2,g={},v={};e.effects.save(a,o),a.show(),s=e.effects.createWrapper(a).css({overflow:"hidden"}),n=p?[s.width(),s.height()]:[s.height(),s.width()],d&&(u=parseInt(d[1],10)/100*n[l?0:1]),h&&s.css(c?{height:0,width:u}:{height:u,width:0}),g[f[0]]=h?n[0]:u,v[f[1]]=h?n[1]:0,s.animate(g,m,t.easing).animate(v,m,t.easing,function(){l&&a.hide(),e.effects.restore(a,o),e.effects.removeWrapper(a),i()})},e.effects.effect.highlight=function(t,i){var s=e(this),n=["backgroundImage","backgroundColor","opacity"],a=e.effects.setMode(s,t.mode||"show"),o={backgroundColor:s.css("backgroundColor")};"hide"===a&&(o.opacity=0),e.effects.save(s,n),s.show().css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(o,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===a&&s.hide(),e.effects.restore(s,n),i()}})},e.effects.effect.size=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","width","height","overflow","opacity"],h=["position","top","bottom","left","right","overflow","opacity"],l=["width","height","overflow"],u=["fontSize"],d=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],c=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=e.effects.setMode(o,t.mode||"effect"),f=t.restore||"effect"!==p,m=t.scale||"both",g=t.origin||["middle","center"],v=o.css("position"),y=f?r:h,b={height:0,width:0,outerHeight:0,outerWidth:0};"show"===p&&o.show(),s={height:o.height(),width:o.width(),outerHeight:o.outerHeight(),outerWidth:o.outerWidth()},"toggle"===t.mode&&"show"===p?(o.from=t.to||b,o.to=t.from||s):(o.from=t.from||("show"===p?b:s),o.to=t.to||("hide"===p?b:s)),a={from:{y:o.from.height/s.height,x:o.from.width/s.width},to:{y:o.to.height/s.height,x:o.to.width/s.width}},("box"===m||"both"===m)&&(a.from.y!==a.to.y&&(y=y.concat(d),o.from=e.effects.setTransition(o,d,a.from.y,o.from),o.to=e.effects.setTransition(o,d,a.to.y,o.to)),a.from.x!==a.to.x&&(y=y.concat(c),o.from=e.effects.setTransition(o,c,a.from.x,o.from),o.to=e.effects.setTransition(o,c,a.to.x,o.to))),("content"===m||"both"===m)&&a.from.y!==a.to.y&&(y=y.concat(u).concat(l),o.from=e.effects.setTransition(o,u,a.from.y,o.from),o.to=e.effects.setTransition(o,u,a.to.y,o.to)),e.effects.save(o,y),o.show(),e.effects.createWrapper(o),o.css("overflow","hidden").css(o.from),g&&(n=e.effects.getBaseline(g,s),o.from.top=(s.outerHeight-o.outerHeight())*n.y,o.from.left=(s.outerWidth-o.outerWidth())*n.x,o.to.top=(s.outerHeight-o.to.outerHeight)*n.y,o.to.left=(s.outerWidth-o.to.outerWidth)*n.x),o.css(o.from),("content"===m||"both"===m)&&(d=d.concat(["marginTop","marginBottom"]).concat(u),c=c.concat(["marginLeft","marginRight"]),l=r.concat(d).concat(c),o.find("*[width]").each(function(){var i=e(this),s={height:i.height(),width:i.width(),outerHeight:i.outerHeight(),outerWidth:i.outerWidth()}; +f&&e.effects.save(i,l),i.from={height:s.height*a.from.y,width:s.width*a.from.x,outerHeight:s.outerHeight*a.from.y,outerWidth:s.outerWidth*a.from.x},i.to={height:s.height*a.to.y,width:s.width*a.to.x,outerHeight:s.height*a.to.y,outerWidth:s.width*a.to.x},a.from.y!==a.to.y&&(i.from=e.effects.setTransition(i,d,a.from.y,i.from),i.to=e.effects.setTransition(i,d,a.to.y,i.to)),a.from.x!==a.to.x&&(i.from=e.effects.setTransition(i,c,a.from.x,i.from),i.to=e.effects.setTransition(i,c,a.to.x,i.to)),i.css(i.from),i.animate(i.to,t.duration,t.easing,function(){f&&e.effects.restore(i,l)})})),o.animate(o.to,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){0===o.to.opacity&&o.css("opacity",o.from.opacity),"hide"===p&&o.hide(),e.effects.restore(o,y),f||("static"===v?o.css({position:"relative",top:o.to.top,left:o.to.left}):e.each(["top","left"],function(e,t){o.css(t,function(t,i){var s=parseInt(i,10),n=e?o.to.left:o.to.top;return"auto"===i?n+"px":s+n+"px"})})),e.effects.removeWrapper(o),i()}})},e.effects.effect.scale=function(t,i){var s=e(this),n=e.extend(!0,{},t),a=e.effects.setMode(s,t.mode||"effect"),o=parseInt(t.percent,10)||(0===parseInt(t.percent,10)?0:"hide"===a?0:100),r=t.direction||"both",h=t.origin,l={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()},u={y:"horizontal"!==r?o/100:1,x:"vertical"!==r?o/100:1};n.effect="size",n.queue=!1,n.complete=i,"effect"!==a&&(n.origin=h||["middle","center"],n.restore=!0),n.from=t.from||("show"===a?{height:0,width:0,outerHeight:0,outerWidth:0}:l),n.to={height:l.height*u.y,width:l.width*u.x,outerHeight:l.outerHeight*u.y,outerWidth:l.outerWidth*u.x},n.fade&&("show"===a&&(n.from.opacity=0,n.to.opacity=1),"hide"===a&&(n.from.opacity=1,n.to.opacity=0)),s.effect(n)},e.effects.effect.puff=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"hide"),a="hide"===n,o=parseInt(t.percent,10)||150,r=o/100,h={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()};e.extend(t,{effect:"scale",queue:!1,fade:!0,mode:n,complete:i,percent:a?o:100,from:a?h:{height:h.height*r,width:h.width*r,outerHeight:h.outerHeight*r,outerWidth:h.outerWidth*r}}),s.effect(t)},e.effects.effect.pulsate=function(t,i){var s,n=e(this),a=e.effects.setMode(n,t.mode||"show"),o="show"===a,r="hide"===a,h=o||"hide"===a,l=2*(t.times||5)+(h?1:0),u=t.duration/l,d=0,c=n.queue(),p=c.length;for((o||!n.is(":visible"))&&(n.css("opacity",0).show(),d=1),s=1;l>s;s++)n.animate({opacity:d},u,t.easing),d=1-d;n.animate({opacity:d},u,t.easing),n.queue(function(){r&&n.hide(),i()}),p>1&&c.splice.apply(c,[1,0].concat(c.splice(p,l+1))),n.dequeue()},e.effects.effect.shake=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","height","width"],o=e.effects.setMode(n,t.mode||"effect"),r=t.direction||"left",h=t.distance||20,l=t.times||3,u=2*l+1,d=Math.round(t.duration/u),c="up"===r||"down"===r?"top":"left",p="up"===r||"left"===r,f={},m={},g={},v=n.queue(),y=v.length;for(e.effects.save(n,a),n.show(),e.effects.createWrapper(n),f[c]=(p?"-=":"+=")+h,m[c]=(p?"+=":"-=")+2*h,g[c]=(p?"-=":"+=")+2*h,n.animate(f,d,t.easing),s=1;l>s;s++)n.animate(m,d,t.easing).animate(g,d,t.easing);n.animate(m,d,t.easing).animate(f,d/2,t.easing).queue(function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}),y>1&&v.splice.apply(v,[1,0].concat(v.splice(y,u+1))),n.dequeue()},e.effects.effect.slide=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","width","height"],o=e.effects.setMode(n,t.mode||"show"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h,d={};e.effects.save(n,a),n.show(),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0),e.effects.createWrapper(n).css({overflow:"hidden"}),r&&n.css(l,u?isNaN(s)?"-"+s:-s:s),d[l]=(r?u?"+=":"-=":u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.transfer=function(t,i){var s=e(this),n=e(t.to),a="fixed"===n.css("position"),o=e("body"),r=a?o.scrollTop():0,h=a?o.scrollLeft():0,l=n.offset(),u={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},d=s.offset(),c=e("<div class='ui-effects-transfer'></div>").appendTo(document.body).addClass(t.className).css({top:d.top-r,left:d.left-h,height:s.innerHeight(),width:s.innerWidth(),position:a?"fixed":"absolute"}).animate(u,t.duration,t.easing,function(){c.remove(),i()})},e.widget("ui.progressbar",{version:"1.11.4",options:{max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min}),this.valueDiv=e("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove()},value:function(e){return void 0===e?this.options.value:(this.options.value=this._constrainedValue(e),this._refreshValue(),void 0)},_constrainedValue:function(e){return void 0===e&&(e=this.options.value),this.indeterminate=e===!1,"number"!=typeof e&&(e=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,e))},_setOptions:function(e){var t=e.value;delete e.value,this._super(e),this.options.value=this._constrainedValue(t),this._refreshValue()},_setOption:function(e,t){"max"===e&&(t=Math.max(this.min,t)),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var t=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||t>this.min).toggleClass("ui-corner-right",t===this.options.max).width(i.toFixed(0)+"%"),this.element.toggleClass("ui-progressbar-indeterminate",this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=e("<div class='ui-progressbar-overlay'></div>").appendTo(this.valueDiv))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":t}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==t&&(this.oldValue=t,this._trigger("change")),t===this.options.max&&this._trigger("complete")}}),e.widget("ui.selectable",e.ui.mouse,{version:"1.11.4",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var t,i=this;this.element.addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){t=e(i.options.filter,i.element[0]),t.addClass("ui-selectee"),t.each(function(){var t=e(this),i=t.offset();e.data(this,"selectable-item",{element:this,$element:t,left:i.left,top:i.top,right:i.left+t.outerWidth(),bottom:i.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=t.addClass("ui-selectee"),this._mouseInit(),this.helper=e("<div class='ui-selectable-helper'></div>")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(t){var i=this,s=this.options;this.opos=[t.pageX,t.pageY],this.options.disabled||(this.selectees=e(s.filter,this.element[0]),this._trigger("start",t),e(s.appendTo).append(this.helper),this.helper.css({left:t.pageX,top:t.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=e.data(this,"selectable-item");s.startselected=!0,t.metaKey||t.ctrlKey||(s.$element.removeClass("ui-selected"),s.selected=!1,s.$element.addClass("ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",t,{unselecting:s.element}))}),e(t.target).parents().addBack().each(function(){var s,n=e.data(this,"selectable-item");return n?(s=!t.metaKey&&!t.ctrlKey||!n.$element.hasClass("ui-selected"),n.$element.removeClass(s?"ui-unselecting":"ui-selected").addClass(s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",t,{selecting:n.element}):i._trigger("unselecting",t,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(t){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,a=this.opos[0],o=this.opos[1],r=t.pageX,h=t.pageY;return a>r&&(i=r,r=a,a=i),o>h&&(i=h,h=o,o=i),this.helper.css({left:a,top:o,width:r-a,height:h-o}),this.selectees.each(function(){var i=e.data(this,"selectable-item"),l=!1;i&&i.element!==s.element[0]&&("touch"===n.tolerance?l=!(i.left>r||a>i.right||i.top>h||o>i.bottom):"fit"===n.tolerance&&(l=i.left>a&&r>i.right&&i.top>o&&h>i.bottom),l?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,s._trigger("selecting",t,{selecting:i.element}))):(i.selecting&&((t.metaKey||t.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",t,{unselecting:i.element}))),i.selected&&(t.metaKey||t.ctrlKey||i.startselected||(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",t,{unselecting:i.element})))))}),!1}},_mouseStop:function(t){var i=this;return this.dragged=!1,e(".ui-unselecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",t,{unselected:s.element})}),e(".ui-selecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-selecting").addClass("ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",t,{selected:s.element})}),this._trigger("stop",t),this.helper.remove(),!1}}),e.widget("ui.selectmenu",{version:"1.11.4",defaultElement:"<select>",options:{appendTo:null,disabled:null,icons:{button:"ui-icon-triangle-1-s"},position:{my:"left top",at:"left bottom",collision:"none"},width:null,change:null,close:null,focus:null,open:null,select:null},_create:function(){var e=this.element.uniqueId().attr("id");this.ids={element:e,button:e+"-button",menu:e+"-menu"},this._drawButton(),this._drawMenu(),this.options.disabled&&this.disable()},_drawButton:function(){var t=this;this.label=e("label[for='"+this.ids.element+"']").attr("for",this.ids.button),this._on(this.label,{click:function(e){this.button.focus(),e.preventDefault()}}),this.element.hide(),this.button=e("<span>",{"class":"ui-selectmenu-button ui-widget ui-state-default ui-corner-all",tabindex:this.options.disabled?-1:0,id:this.ids.button,role:"combobox","aria-expanded":"false","aria-autocomplete":"list","aria-owns":this.ids.menu,"aria-haspopup":"true"}).insertAfter(this.element),e("<span>",{"class":"ui-icon "+this.options.icons.button}).prependTo(this.button),this.buttonText=e("<span>",{"class":"ui-selectmenu-text"}).appendTo(this.button),this._setText(this.buttonText,this.element.find("option:selected").text()),this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one("focusin",function(){t.menuItems||t._refreshMenu()}),this._hoverable(this.button),this._focusable(this.button)},_drawMenu:function(){var t=this;this.menu=e("<ul>",{"aria-hidden":"true","aria-labelledby":this.ids.button,id:this.ids.menu}),this.menuWrap=e("<div>",{"class":"ui-selectmenu-menu ui-front"}).append(this.menu).appendTo(this._appendTo()),this.menuInstance=this.menu.menu({role:"listbox",select:function(e,i){e.preventDefault(),t._setSelection(),t._select(i.item.data("ui-selectmenu-item"),e)},focus:function(e,i){var s=i.item.data("ui-selectmenu-item");null!=t.focusIndex&&s.index!==t.focusIndex&&(t._trigger("focus",e,{item:s}),t.isOpen||t._select(s,e)),t.focusIndex=s.index,t.button.attr("aria-activedescendant",t.menuItems.eq(s.index).attr("id"))}}).menu("instance"),this.menu.addClass("ui-corner-bottom").removeClass("ui-corner-all"),this.menuInstance._off(this.menu,"mouseleave"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this._setText(this.buttonText,this._getSelectedItem().text()),this.options.width||this._resizeButton()},_refreshMenu:function(){this.menu.empty();var e,t=this.element.find("option");t.length&&(this._parseOptions(t),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find("li").not(".ui-selectmenu-optgroup"),e=this._getSelectedItem(),this.menuInstance.focus(null,e),this._setAria(e.data("ui-selectmenu-item")),this._setOption("disabled",this.element.prop("disabled")))},open:function(e){this.options.disabled||(this.menuItems?(this.menu.find(".ui-state-focus").removeClass("ui-state-focus"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger("open",e))},_position:function(){this.menuWrap.position(e.extend({of:this.button},this.options.position))},close:function(e){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this.range=null,this._off(this.document),this._trigger("close",e))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderMenu:function(t,i){var s=this,n="";e.each(i,function(i,a){a.optgroup!==n&&(e("<li>",{"class":"ui-selectmenu-optgroup ui-menu-divider"+(a.element.parent("optgroup").prop("disabled")?" ui-state-disabled":""),text:a.optgroup}).appendTo(t),n=a.optgroup),s._renderItemData(t,a)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-selectmenu-item",t)},_renderItem:function(t,i){var s=e("<li>");return i.disabled&&s.addClass("ui-state-disabled"),this._setText(s,i.label),s.appendTo(t)},_setText:function(e,t){t?e.text(t):e.html("&#160;")},_move:function(e,t){var i,s,n=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex):(i=this.menuItems.eq(this.element[0].selectedIndex),n+=":not(.ui-state-disabled)"),s="first"===e||"last"===e?i["first"===e?"prevAll":"nextAll"](n).eq(-1):i[e+"All"](n).eq(0),s.length&&this.menuInstance.focus(t,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex)},_toggle:function(e){this[this.isOpen?"close":"open"](e)},_setSelection:function(){var e;this.range&&(window.getSelection?(e=window.getSelection(),e.removeAllRanges(),e.addRange(this.range)):this.range.select(),this.button.focus())},_documentClick:{mousedown:function(t){this.isOpen&&(e(t.target).closest(".ui-selectmenu-menu, #"+this.ids.button).length||this.close(t))}},_buttonEvents:{mousedown:function(){var e;window.getSelection?(e=window.getSelection(),e.rangeCount&&(this.range=e.getRangeAt(0))):this.range=document.selection.createRange()},click:function(e){this._setSelection(),this._toggle(e)},keydown:function(t){var i=!0;switch(t.keyCode){case e.ui.keyCode.TAB:case e.ui.keyCode.ESCAPE:this.close(t),i=!1;break;case e.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(t);break;case e.ui.keyCode.UP:t.altKey?this._toggle(t):this._move("prev",t);break;case e.ui.keyCode.DOWN:t.altKey?this._toggle(t):this._move("next",t);break;case e.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(t):this._toggle(t);break;case e.ui.keyCode.LEFT:this._move("prev",t);break;case e.ui.keyCode.RIGHT:this._move("next",t);break;case e.ui.keyCode.HOME:case e.ui.keyCode.PAGE_UP:this._move("first",t);break;case e.ui.keyCode.END:case e.ui.keyCode.PAGE_DOWN:this._move("last",t);break;default:this.menu.trigger(t),i=!1}i&&t.preventDefault()}},_selectFocusedItem:function(e){var t=this.menuItems.eq(this.focusIndex);t.hasClass("ui-state-disabled")||this._select(t.data("ui-selectmenu-item"),e)},_select:function(e,t){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=e.index,this._setText(this.buttonText,e.label),this._setAria(e),this._trigger("select",t,{item:e}),e.index!==i&&this._trigger("change",t,{item:e}),this.close(t)},_setAria:function(e){var t=this.menuItems.eq(e.index).attr("id");this.button.attr({"aria-labelledby":t,"aria-activedescendant":t}),this.menu.attr("aria-activedescendant",t)},_setOption:function(e,t){"icons"===e&&this.button.find("span.ui-icon").removeClass(this.options.icons.button).addClass(t.button),this._super(e,t),"appendTo"===e&&this.menuWrap.appendTo(this._appendTo()),"disabled"===e&&(this.menuInstance.option("disabled",t),this.button.toggleClass("ui-state-disabled",t).attr("aria-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)),"width"===e&&this._resizeButton()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_toggleAttr:function(){this.button.toggleClass("ui-corner-top",this.isOpen).toggleClass("ui-corner-all",!this.isOpen).attr("aria-expanded",this.isOpen),this.menuWrap.toggleClass("ui-selectmenu-open",this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var e=this.options.width;e||(e=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(e)},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){return{disabled:this.element.prop("disabled")}},_parseOptions:function(t){var i=[];t.each(function(t,s){var n=e(s),a=n.parent("optgroup");i.push({element:n,index:t,value:n.val(),label:n.text(),optgroup:a.attr("label")||"",disabled:a.prop("disabled")||n.prop("disabled")})}),this.items=i},_destroy:function(){this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.label.attr("for",this.ids.element)}}),e.widget("ui.slider",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"),this._refresh(),this._setOption("disabled",this.options.disabled),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var t,i,s=this.options,n=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),a="<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>",o=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),t=n.length;i>t;t++)o.push(a);this.handles=n.add(e(o.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.each(function(t){e(this).data("ui-slider-handle-index",t)})},_createRange:function(){var t=this.options,i="";t.range?(t.range===!0&&(t.values?t.values.length&&2!==t.values.length?t.values=[t.values[0],t.values[0]]:e.isArray(t.values)&&(t.values=t.values.slice(0)):t.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?this.range.removeClass("ui-slider-range-min ui-slider-range-max").css({left:"",bottom:""}):(this.range=e("<div></div>").appendTo(this.element),i="ui-slider-range ui-widget-header ui-corner-all"),this.range.addClass(i+("min"===t.range||"max"===t.range?" ui-slider-range-"+t.range:""))):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(t){var i,s,n,a,o,r,h,l,u=this,d=this.options;return d.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:t.pageX,y:t.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var i=Math.abs(s-u.values(t));(n>i||n===i&&(t===u._lastChangedValue||u.values(t)===d.min))&&(n=i,a=e(this),o=t)}),r=this._start(t,o),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=o,a.addClass("ui-state-active").focus(),h=a.offset(),l=!e(t.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:t.pageX-h.left-a.width()/2,top:t.pageY-h.top-a.height()/2-(parseInt(a.css("borderTopWidth"),10)||0)-(parseInt(a.css("borderBottomWidth"),10)||0)+(parseInt(a.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,o,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(e){var t={x:e.pageX,y:e.pageY},i=this._normValueFromMouse(t);return this._slide(e,this._handleIndex,i),!1},_mouseStop:function(e){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(e,this._handleIndex),this._change(e,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(e){var t,i,s,n,a;return"horizontal"===this.orientation?(t=this.elementSize.width,i=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(t=this.elementSize.height,i=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/t,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),a=this._valueMin()+s*n,this._trimAlignValue(a)},_start:function(e,t){var i={handle:this.handles[t],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("start",e,i)},_slide:function(e,t,i){var s,n,a;this.options.values&&this.options.values.length?(s=this.values(t?0:1),2===this.options.values.length&&this.options.range===!0&&(0===t&&i>s||1===t&&s>i)&&(i=s),i!==this.values(t)&&(n=this.values(),n[t]=i,a=this._trigger("slide",e,{handle:this.handles[t],value:i,values:n}),s=this.values(t?0:1),a!==!1&&this.values(t,i))):i!==this.value()&&(a=this._trigger("slide",e,{handle:this.handles[t],value:i}),a!==!1&&this.value(i))},_stop:function(e,t){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("stop",e,i)},_change:function(e,t){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._lastChangedValue=t,this._trigger("change",e,i)}},value:function(e){return arguments.length?(this.options.value=this._trimAlignValue(e),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(t,i){var s,n,a;if(arguments.length>1)return this.options.values[t]=this._trimAlignValue(i),this._refreshValue(),this._change(null,t),void 0;if(!arguments.length)return this._values();if(!e.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(t):this.value();for(s=this.options.values,n=arguments[0],a=0;s.length>a;a+=1)s[a]=this._trimAlignValue(n[a]),this._change(null,a);this._refreshValue()},_setOption:function(t,i){var s,n=0;switch("range"===t&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),e.isArray(this.options.values)&&(n=this.options.values.length),"disabled"===t&&this.element.toggleClass("ui-state-disabled",!!i),this._super(t,i),t){case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue(),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case"step":case"min":case"max":this._animateOff=!0,this._calculateNewMax(),this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_value:function(){var e=this.options.value;return e=this._trimAlignValue(e)},_values:function(e){var t,i,s;if(arguments.length)return t=this.options.values[e],t=this._trimAlignValue(t);if(this.options.values&&this.options.values.length){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(e){if(this._valueMin()>=e)return this._valueMin();if(e>=this._valueMax())return this._valueMax();var t=this.options.step>0?this.options.step:1,i=(e-this._valueMin())%t,s=e-i;return 2*Math.abs(i)>=t&&(s+=i>0?t:-t),parseFloat(s.toFixed(5))},_calculateNewMax:function(){var e=this.options.max,t=this._valueMin(),i=this.options.step,s=Math.floor(+(e-t).toFixed(this._precision())/i)*i;e=s+t,this.max=parseFloat(e.toFixed(this._precision()))},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshValue:function(){var t,i,s,n,a,o=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,u={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),u["horizontal"===h.orientation?"left":"bottom"]=i+"%",e(this).stop(1,1)[l?"animate":"css"](u,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-t+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-t+"%"},{queue:!1,duration:r.animate}))),t=i}):(s=this.value(),n=this._valueMin(),a=this._valueMax(),i=a!==n?100*((s-n)/(a-n)):0,u["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](u,r.animate),"min"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===o&&"horizontal"===this.orientation&&this.range[l?"animate":"css"]({width:100-i+"%"},{queue:!1,duration:r.animate}),"min"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===o&&"vertical"===this.orientation&&this.range[l?"animate":"css"]({height:100-i+"%"},{queue:!1,duration:r.animate}))},_handleEvents:{keydown:function(t){var i,s,n,a,o=e(t.target).data("ui-slider-handle-index");switch(t.keyCode){case e.ui.keyCode.HOME:case e.ui.keyCode.END:case e.ui.keyCode.PAGE_UP:case e.ui.keyCode.PAGE_DOWN:case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(t.preventDefault(),!this._keySliding&&(this._keySliding=!0,e(t.target).addClass("ui-state-active"),i=this._start(t,o),i===!1))return}switch(a=this.options.step,s=n=this.options.values&&this.options.values.length?this.values(o):this.value(),t.keyCode){case e.ui.keyCode.HOME:n=this._valueMin();break;case e.ui.keyCode.END:n=this._valueMax();break;case e.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+a);break;case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-a)}this._slide(t,o,n)},keyup:function(t){var i=e(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,i),this._change(t,i),e(t.target).removeClass("ui-state-active"))}}}),e.widget("ui.sortable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(e,t,i){return e>=t&&t+i>e},_isFloating:function(e){return/left|right/.test(e.css("float"))||/inline|table-cell/.test(e.css("display"))},_create:function(){this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(e,t){this._super(e,t),"handle"===e&&this._setHandleClassName()},_setHandleClassName:function(){this.element.find(".ui-sortable-handle").removeClass("ui-sortable-handle"),e.each(this.items,function(){(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item).addClass("ui-sortable-handle")})},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").find(".ui-sortable-handle").removeClass("ui-sortable-handle"),this._mouseDestroy();for(var e=this.items.length-1;e>=0;e--)this.items[e].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(t,i){var s=null,n=!1,a=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(t),e(t.target).parents().each(function(){return e.data(this,a.widgetName+"-item")===a?(s=e(this),!1):void 0}),e.data(t.target,a.widgetName+"-item")===a&&(s=e(t.target)),s?!this.options.handle||i||(e(this.options.handle,s).find("*").addBack().each(function(){this===t.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(t,i,s){var n,a,o=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(t),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,o.cursorAt&&this._adjustOffsetFromHelper(o.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),o.containment&&this._setContainment(),o.cursor&&"auto"!==o.cursor&&(a=this.document.find("body"),this.storedCursor=a.css("cursor"),a.css("cursor",o.cursor),this.storedStylesheet=e("<style>*{ cursor: "+o.cursor+" !important; }</style>").appendTo(a)),o.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",o.opacity)),o.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",o.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",t,this._uiHash(this)); +return e.ui.ddmanager&&(e.ui.ddmanager.current=this),e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(t),!0},_mouseDrag:function(t){var i,s,n,a,o=this.options,r=!1;for(this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY<o.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+o.scrollSpeed:t.pageY-this.overflowOffset.top<o.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-o.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-t.pageX<o.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+o.scrollSpeed:t.pageX-this.overflowOffset.left<o.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-o.scrollSpeed)):(t.pageY-this.document.scrollTop()<o.scrollSensitivity?r=this.document.scrollTop(this.document.scrollTop()-o.scrollSpeed):this.window.height()-(t.pageY-this.document.scrollTop())<o.scrollSensitivity&&(r=this.document.scrollTop(this.document.scrollTop()+o.scrollSpeed)),t.pageX-this.document.scrollLeft()<o.scrollSensitivity?r=this.document.scrollLeft(this.document.scrollLeft()-o.scrollSpeed):this.window.width()-(t.pageX-this.document.scrollLeft())<o.scrollSensitivity&&(r=this.document.scrollLeft(this.document.scrollLeft()+o.scrollSpeed))),r!==!1&&e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],a=this._intersectsWithPointer(s),a&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===a?"next":"prev"]()[0]!==n&&!e.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!e.contains(this.element[0],n):!0)){if(this.direction=1===a?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(t,s),this._trigger("change",t,this._uiHash());break}return this._contactContainers(t),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),this._trigger("sort",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,i){if(t){if(e.ui.ddmanager&&!this.options.dropBehaviour&&e.ui.ddmanager.drop(this,t),this.options.revert){var s=this,n=this.placeholder.offset(),a=this.options.axis,o={};a&&"x"!==a||(o.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),a&&"y"!==a||(o.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,e(this.helper).animate(o,parseInt(this.options.revert,10)||500,function(){s._clear(t)})}else this._clear(t,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var t=this.containers.length-1;t>=0;t--)this.containers[t]._trigger("deactivate",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger("out",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),e.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?e(this.domPosition.prev).after(this.currentItem):e(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},e(i).each(function(){var i=(e(t.item||this).attr(t.attribute||"id")||"").match(t.expression||/(.+)[\-=_](.+)/);i&&s.push((t.key||i[1]+"[]")+"="+(t.key&&t.expression?i[1]:i[2]))}),!s.length&&t.key&&s.push(t.key+"="),s.join("&")},toArray:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},i.each(function(){s.push(e(t.item||this).attr(t.attribute||"id")||"")}),s},_intersectsWith:function(e){var t=this.positionAbs.left,i=t+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,a=e.left,o=a+e.width,r=e.top,h=r+e.height,l=this.offset.click.top,u=this.offset.click.left,d="x"===this.options.axis||s+l>r&&h>s+l,c="y"===this.options.axis||t+u>a&&o>t+u,p=d&&c;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>e[this.floating?"width":"height"]?p:t+this.helperProportions.width/2>a&&o>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(e){var t="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top,e.height),i="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left,e.width),s=t&&i,n=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return s?this.floating?a&&"right"===a||"down"===n?2:1:n&&("down"===n?2:1):!1},_intersectsWithSides:function(e){var t=this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top+e.height/2,e.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left+e.width/2,e.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&t||"up"===s&&!t)},_getDragVerticalDirection:function(){var e=this.positionAbs.top-this.lastPositionAbs.top;return 0!==e&&(e>0?"down":"up")},_getDragHorizontalDirection:function(){var e=this.positionAbs.left-this.lastPositionAbs.left;return 0!==e&&(e>0?"right":"left")},refresh:function(e){return this._refreshItems(e),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var e=this.options;return e.connectWith.constructor===String?[e.connectWith]:e.connectWith},_getItemsAsjQuery:function(t){function i(){r.push(this)}var s,n,a,o,r=[],h=[],l=this._connectWith();if(l&&t)for(s=l.length-1;s>=0;s--)for(a=e(l[s],this.document[0]),n=a.length-1;n>=0;n--)o=e.data(a[n],this.widgetFullName),o&&o!==this&&!o.options.disabled&&h.push([e.isFunction(o.options.items)?o.options.items.call(o.element):e(o.options.items,o.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),o]);for(h.push([e.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):e(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return e(r)},_removeCurrentsFromItems:function(){var t=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=e.grep(this.items,function(e){for(var i=0;t.length>i;i++)if(t[i]===e.item[0])return!1;return!0})},_refreshItems:function(t){this.items=[],this.containers=[this];var i,s,n,a,o,r,h,l,u=this.items,d=[[e.isFunction(this.options.items)?this.options.items.call(this.element[0],t,{item:this.currentItem}):e(this.options.items,this.element),this]],c=this._connectWith();if(c&&this.ready)for(i=c.length-1;i>=0;i--)for(n=e(c[i],this.document[0]),s=n.length-1;s>=0;s--)a=e.data(n[s],this.widgetFullName),a&&a!==this&&!a.options.disabled&&(d.push([e.isFunction(a.options.items)?a.options.items.call(a.element[0],t,{item:this.currentItem}):e(a.options.items,a.element),a]),this.containers.push(a));for(i=d.length-1;i>=0;i--)for(o=d[i][1],r=d[i][0],s=0,l=r.length;l>s;s++)h=e(r[s]),h.data(this.widgetName+"-item",o),u.push({item:h,instance:o,width:0,height:0,left:0,top:0})},refreshPositions:function(t){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,a;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?e(this.options.toleranceElement,s.item):s.item,t||(s.width=n.outerWidth(),s.height=n.outerHeight()),a=n.offset(),s.left=a.left,s.top=a.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)a=this.containers[i].element.offset(),this.containers[i].containerCache.left=a.left,this.containers[i].containerCache.top=a.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(t){t=t||this;var i,s=t.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=t.currentItem[0].nodeName.toLowerCase(),n=e("<"+s+">",t.document[0]).addClass(i||t.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tbody"===s?t._createTrPlaceholder(t.currentItem.find("tr").eq(0),e("<tr>",t.document[0]).appendTo(n)):"tr"===s?t._createTrPlaceholder(t.currentItem,n):"img"===s&&n.attr("src",t.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(e,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(t.currentItem.innerHeight()-parseInt(t.currentItem.css("paddingTop")||0,10)-parseInt(t.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(t.currentItem.innerWidth()-parseInt(t.currentItem.css("paddingLeft")||0,10)-parseInt(t.currentItem.css("paddingRight")||0,10)))}}),t.placeholder=e(s.placeholder.element.call(t.element,t.currentItem)),t.currentItem.after(t.placeholder),s.placeholder.update(t,t.placeholder)},_createTrPlaceholder:function(t,i){var s=this;t.children().each(function(){e("<td>&#160;</td>",s.document[0]).attr("colspan",e(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(t){var i,s,n,a,o,r,h,l,u,d,c=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!e.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(c&&e.contains(this.containers[i].element[0],c.element[0]))continue;c=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",t,this._uiHash(this)),this.containers[i].containerCache.over=0);if(c)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,a=null,u=c.floating||this._isFloating(this.currentItem),o=u?"left":"top",r=u?"width":"height",d=u?"clientX":"clientY",s=this.items.length-1;s>=0;s--)e.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(h=this.items[s].item.offset()[o],l=!1,t[d]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(t[d]-h)&&(n=Math.abs(t[d]-h),a=this.items[s],this.direction=l?"up":"down"));if(!a&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;a?this._rearrange(t,a,null,!0):this._rearrange(t,null,this.containers[p].element,!0),this._trigger("change",t,this._uiHash()),this.containers[p]._trigger("change",t,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||e("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&e.ui.ie)&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var e=this.currentItem.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.width():this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(t=e(n.containment)[0],i=e(n.containment).offset(),s="hidden"!==e(t).css("overflow"),this.containment=[i.left+(parseInt(e(t).css("borderLeftWidth"),10)||0)+(parseInt(e(t).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(e(t).css("borderTopWidth"),10)||0)+(parseInt(e(t).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(t.scrollWidth,t.offsetWidth):t.offsetWidth)-(parseInt(e(t).css("borderLeftWidth"),10)||0)-(parseInt(e(t).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(t.scrollHeight,t.offsetHeight):t.offsetHeight)-(parseInt(e(t).css("borderTopWidth"),10)||0)-(parseInt(e(t).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(t,i){i||(i=this.position);var s="absolute"===t?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,a=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():a?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():a?0:n.scrollLeft())*s}},_generatePosition:function(t){var i,s,n=this.options,a=t.pageX,o=t.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(t.pageX-this.offset.click.left<this.containment[0]&&(a=this.containment[0]+this.offset.click.left),t.pageY-this.offset.click.top<this.containment[1]&&(o=this.containment[1]+this.offset.click.top),t.pageX-this.offset.click.left>this.containment[2]&&(a=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1],o=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((a-this.originalPageX)/n.grid[0])*n.grid[0],a=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(e,t,i,s){i?i[0].appendChild(this.placeholder[0]):t.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?t.item[0]:t.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(e,t){function i(e,t,i){return function(s){i._trigger(e,s,t._uiHash(t))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!t&&n.push(function(e){this._trigger("receive",e,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||t||n.push(function(e){this._trigger("update",e,this._uiHash())}),this!==this.currentContainer&&(t||(n.push(function(e){this._trigger("remove",e,this._uiHash())}),n.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)t||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,t||this._trigger("beforeStop",e,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!t){for(s=0;n.length>s;s++)n[s].call(this,e);this._trigger("stop",e,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){e.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(t){var i=t||this;return{helper:i.helper,placeholder:i.placeholder||e([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:t?t.element:null}}}),e.widget("ui.spinner",{version:"1.11.4",defaultElement:"<input>",widgetEventPrefix:"spin",options:{culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var t={},i=this.element;return e.each(["min","max","step"],function(e,s){var n=i.attr(s);void 0!==n&&n.length&&(t[s]=n)}),t},_events:{keydown:function(e){this._start(e)&&this._keydown(e)&&e.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",e),void 0)},mousewheel:function(e,t){if(t){if(!this.spinning&&!this._start(e))return!1;this._spin((t>0?1:-1)*this.options.step,e),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(e)},100),e.preventDefault()}},"mousedown .ui-spinner-button":function(t){function i(){var e=this.element[0]===this.document[0].activeElement;e||(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),t.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(t)!==!1&&this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(t){return e(t.currentTarget).hasClass("ui-state-active")?this._start(t)===!1?!1:(this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var e=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this.element.attr("role","spinbutton"),this.buttons=e.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all"),this.buttons.height()>Math.ceil(.5*e.height())&&e.height()>0&&e.height(e.height()),this.options.disabled&&this.disable()},_keydown:function(t){var i=this.options,s=e.ui.keyCode;switch(t.keyCode){case s.UP:return this._repeat(null,1,t),!0;case s.DOWN:return this._repeat(null,-1,t),!0;case s.PAGE_UP:return this._repeat(null,i.page,t),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,t),!0}return!1},_uiSpinnerHtml:function(){return"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>"},_buttonHtml:function(){return"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'><span class='ui-icon "+this.options.icons.up+"'>&#9650;</span>"+"</a>"+"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>"+"<span class='ui-icon "+this.options.icons.down+"'>&#9660;</span>"+"</a>"},_start:function(e){return this.spinning||this._trigger("start",e)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(e,t,i){e=e||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,t,i)},e),this._spin(t*this.options.step,i)},_spin:function(e,t){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+e*this._increment(this.counter)),this.spinning&&this._trigger("spin",t,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(t){var i=this.options.incremental;return i?e.isFunction(i)?i(t):Math.floor(t*t*t/5e4-t*t/500+17*t/200+1):1},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_adjustValue:function(e){var t,i,s=this.options;return t=null!==s.min?s.min:0,i=e-t,i=Math.round(i/s.step)*s.step,e=t+i,e=parseFloat(e.toFixed(this._precision())),null!==s.max&&e>s.max?s.max:null!==s.min&&s.min>e?s.min:e},_stop:function(e){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",e))},_setOption:function(e,t){if("culture"===e||"numberFormat"===e){var i=this._parse(this.element.val());return this.options[e]=t,this.element.val(this._format(i)),void 0}("max"===e||"min"===e||"step"===e)&&"string"==typeof t&&(t=this._parse(t)),"icons"===e&&(this.buttons.first().find(".ui-icon").removeClass(this.options.icons.up).addClass(t.up),this.buttons.last().find(".ui-icon").removeClass(this.options.icons.down).addClass(t.down)),this._super(e,t),"disabled"===e&&(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable"))},_setOptions:h(function(e){this._super(e)}),_parse:function(e){return"string"==typeof e&&""!==e&&(e=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(e,10,this.options.culture):+e),""===e||isNaN(e)?null:e},_format:function(e){return""===e?"":window.Globalize&&this.options.numberFormat?Globalize.format(e,this.options.numberFormat,this.options.culture):e},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var e=this.value();return null===e?!1:e===this._adjustValue(e)},_value:function(e,t){var i;""!==e&&(i=this._parse(e),null!==i&&(t||(i=this._adjustValue(i)),e=this._format(i))),this.element.val(e),this._refresh()},_destroy:function(){this.element.removeClass("ui-spinner-input").prop("disabled",!1).removeAttr("autocomplete").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:h(function(e){this._stepUp(e)}),_stepUp:function(e){this._start()&&(this._spin((e||1)*this.options.step),this._stop())},stepDown:h(function(e){this._stepDown(e)}),_stepDown:function(e){this._start()&&(this._spin((e||1)*-this.options.step),this._stop())},pageUp:h(function(e){this._stepUp((e||1)*this.options.page)}),pageDown:h(function(e){this._stepDown((e||1)*this.options.page)}),value:function(e){return arguments.length?(h(this._value).call(this,e),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),e.widget("ui.tabs",{version:"1.11.4",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var e=/#.*$/;return function(t){var i,s;t=t.cloneNode(!1),i=t.href.replace(e,""),s=location.href.replace(e,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return t.hash.length>1&&i===s}}(),_create:function(){var t=this,i=this.options;this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",i.collapsible),this._processTabs(),i.active=this._initialActive(),e.isArray(i.disabled)&&(i.disabled=e.unique(i.disabled.concat(e.map(this.tabs.filter(".ui-state-disabled"),function(e){return t.tabs.index(e)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):e(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var t=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===t&&(s&&this.tabs.each(function(i,n){return e(n).attr("aria-controls")===s?(t=i,!1):void 0}),null===t&&(t=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===t||-1===t)&&(t=this.tabs.length?0:!1)),t!==!1&&(t=this.tabs.index(this.tabs.eq(t)),-1===t&&(t=i?!1:0)),!i&&t===!1&&this.anchors.length&&(t=0),t},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):e()}},_tabKeydown:function(t){var i=e(this.document[0].activeElement).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(t)){switch(t.keyCode){case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:s++;break;case e.ui.keyCode.UP:case e.ui.keyCode.LEFT:n=!1,s--;break;case e.ui.keyCode.END:s=this.anchors.length-1;break;case e.ui.keyCode.HOME:s=0;break;case e.ui.keyCode.SPACE:return t.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case e.ui.keyCode.ENTER:return t.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}t.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),t.ctrlKey||t.metaKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(t){this._handlePageNav(t)||t.ctrlKey&&t.keyCode===e.ui.keyCode.UP&&(t.preventDefault(),this.active.focus())},_handlePageNav:function(t){return t.altKey&&t.keyCode===e.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):t.altKey&&t.keyCode===e.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(t,i){function s(){return t>n&&(t=0),0>t&&(t=n),t}for(var n=this.tabs.length-1;-1!==e.inArray(s(),this.options.disabled);)t=i?t+1:t-1;return t},_focusNextTab:function(e,t){return e=this._findNextTab(e,t),this.tabs.eq(e).focus(),e},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):"disabled"===e?(this._setupDisabled(t),void 0):(this._super(e,t),"collapsible"===e&&(this.element.toggleClass("ui-tabs-collapsible",t),t||this.options.active!==!1||this._activate(0)),"event"===e&&this._setupEvents(t),"heightStyle"===e&&this._setupHeightStyle(t),void 0)},_sanitizeSelector:function(e){return e?e.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var t=this.options,i=this.tablist.children(":has(a[href])");t.disabled=e.map(i.filter(".ui-state-disabled"),function(e){return i.index(e)}),this._processTabs(),t.active!==!1&&this.anchors.length?this.active.length&&!e.contains(this.tablist[0],this.active[0])?this.tabs.length===t.disabled.length?(t.active=!1,this.active=e()):this._activate(this._findNextTab(Math.max(0,t.active-1),!1)):t.active=this.tabs.index(this.active):(t.active=!1,this.active=e()),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var t=this,i=this.tabs,s=this.anchors,n=this.panels; +this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist").delegate("> li","mousedown"+this.eventNamespace,function(t){e(this).is(".ui-state-disabled")&&t.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){e(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return e("a",this)[0]}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=e(),this.anchors.each(function(i,s){var n,a,o,r=e(s).uniqueId().attr("id"),h=e(s).closest("li"),l=h.attr("aria-controls");t._isLocal(s)?(n=s.hash,o=n.substring(1),a=t.element.find(t._sanitizeSelector(n))):(o=h.attr("aria-controls")||e({}).uniqueId()[0].id,n="#"+o,a=t.element.find(n),a.length||(a=t._createPanel(o),a.insertAfter(t.panels[i-1]||t.tablist)),a.attr("aria-live","polite")),a.length&&(t.panels=t.panels.add(a)),l&&h.data("ui-tabs-aria-controls",l),h.attr({"aria-controls":o,"aria-labelledby":r}),a.attr("aria-labelledby",r)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel"),i&&(this._off(i.not(this.tabs)),this._off(s.not(this.anchors)),this._off(n.not(this.panels)))},_getList:function(){return this.tablist||this.element.find("ol,ul").eq(0)},_createPanel:function(t){return e("<div>").attr("id",t).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(t){e.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1);for(var i,s=0;i=this.tabs[s];s++)t===!0||-1!==e.inArray(s,t)?e(i).addClass("ui-state-disabled").attr("aria-disabled","true"):e(i).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=t},_setupEvents:function(t){var i={};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(e){e.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var i,s=this.element.parent();"fill"===t?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var t=e(this),s=t.css("position");"absolute"!==s&&"fixed"!==s&&(i-=t.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=e(this).outerHeight(!0)}),this.panels.each(function(){e(this).height(Math.max(0,i-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===t&&(i=0,this.panels.each(function(){i=Math.max(i,e(this).height("").height())}).height(i))},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n.closest("li"),o=a[0]===s[0],r=o&&i.collapsible,h=r?e():this._getPanelForTab(a),l=s.length?this._getPanelForTab(s):e(),u={oldTab:s,oldPanel:l,newTab:r?e():a,newPanel:h};t.preventDefault(),a.hasClass("ui-state-disabled")||a.hasClass("ui-tabs-loading")||this.running||o&&!i.collapsible||this._trigger("beforeActivate",t,u)===!1||(i.active=r?!1:this.tabs.index(a),this.active=o?e():a,this.xhr&&this.xhr.abort(),l.length||h.length||e.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(a),t),this._toggle(t,u))},_toggle:function(t,i){function s(){a.running=!1,a._trigger("activate",t,i)}function n(){i.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),o.length&&a.options.show?a._show(o,a.options.show,s):(o.show(),s())}var a=this,o=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),n()}):(i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),o.length&&r.length?i.oldTab.attr("tabIndex",-1):o.length&&this.tabs.filter(function(){return 0===e(this).attr("tabIndex")}).attr("tabIndex",-1),o.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(t){var i,s=this._findActive(t);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return t===!1?e():this.tabs.eq(t)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+e+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeUniqueId(),this.tablist.unbind(this.eventNamespace),this.tabs.add(this.panels).each(function(){e.data(this,"ui-tabs-destroy")?e(this).remove():e(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),this.tabs.each(function(){var t=e(this),i=t.data("ui-tabs-aria-controls");i?t.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):t.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(t){var i=this.options.disabled;i!==!1&&(void 0===t?i=!1:(t=this._getIndex(t),i=e.isArray(i)?e.map(i,function(e){return e!==t?e:null}):e.map(this.tabs,function(e,i){return i!==t?i:null})),this._setupDisabled(i))},disable:function(t){var i=this.options.disabled;if(i!==!0){if(void 0===t)i=!0;else{if(t=this._getIndex(t),-1!==e.inArray(t,i))return;i=e.isArray(i)?e.merge([t],i).sort():[t]}this._setupDisabled(i)}},load:function(t,i){t=this._getIndex(t);var s=this,n=this.tabs.eq(t),a=n.find(".ui-tabs-anchor"),o=this._getPanelForTab(n),r={tab:n,panel:o},h=function(e,t){"abort"===t&&s.panels.stop(!1,!0),n.removeClass("ui-tabs-loading"),o.removeAttr("aria-busy"),e===s.xhr&&delete s.xhr};this._isLocal(a[0])||(this.xhr=e.ajax(this._ajaxSettings(a,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(n.addClass("ui-tabs-loading"),o.attr("aria-busy","true"),this.xhr.done(function(e,t,n){setTimeout(function(){o.html(e),s._trigger("load",i,r),h(n,t)},1)}).fail(function(e,t){setTimeout(function(){h(e,t)},1)})))},_ajaxSettings:function(t,i,s){var n=this;return{url:t.attr("href"),beforeSend:function(t,a){return n._trigger("beforeLoad",i,e.extend({jqXHR:t,ajaxSettings:a},s))}}},_getPanelForTab:function(t){var i=e(t).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),e.widget("ui.tooltip",{version:"1.11.4",options:{content:function(){var t=e(this).attr("title")||"";return e("<a>").text(t).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_addDescribedBy:function(t,i){var s=(t.attr("aria-describedby")||"").split(/\s+/);s.push(i),t.data("ui-tooltip-id",i).attr("aria-describedby",e.trim(s.join(" ")))},_removeDescribedBy:function(t){var i=t.data("ui-tooltip-id"),s=(t.attr("aria-describedby")||"").split(/\s+/),n=e.inArray(i,s);-1!==n&&s.splice(n,1),t.removeData("ui-tooltip-id"),s=e.trim(s.join(" ")),s?t.attr("aria-describedby",s):t.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable(),this.liveRegion=e("<div>").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body)},_setOption:function(t,i){var s=this;return"disabled"===t?(this[i?"_disable":"_enable"](),this.options[t]=i,void 0):(this._super(t,i),"content"===t&&e.each(this.tooltips,function(e,t){s._updateContent(t.element)}),void 0)},_disable:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur");n.target=n.currentTarget=s.element[0],t.close(n,!0)}),this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.is("[title]")&&t.data("ui-tooltip-title",t.attr("title")).removeAttr("title")})},_enable:function(){this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.data("ui-tooltip-title")&&t.attr("title",t.data("ui-tooltip-title"))})},open:function(t){var i=this,s=e(t?t.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),t&&"mouseover"===t.type&&s.parents().each(function(){var t,s=e(this);s.data("ui-tooltip-open")&&(t=e.Event("blur"),t.target=t.currentTarget=this,i.close(t,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._registerCloseHandlers(t,s),this._updateContent(s,t))},_updateContent:function(e,t){var i,s=this.options.content,n=this,a=t?t.type:null;return"string"==typeof s?this._open(t,e,s):(i=s.call(e[0],function(i){n._delay(function(){e.data("ui-tooltip-open")&&(t&&(t.type=a),this._open(t,e,i))})}),i&&this._open(t,e,i),void 0)},_open:function(t,i,s){function n(e){l.of=e,o.is(":hidden")||o.position(l)}var a,o,r,h,l=e.extend({},this.options.position);if(s){if(a=this._find(i))return a.tooltip.find(".ui-tooltip-content").html(s),void 0;i.is("[title]")&&(t&&"mouseover"===t.type?i.attr("title",""):i.removeAttr("title")),a=this._tooltip(i),o=a.tooltip,this._addDescribedBy(i,o.attr("id")),o.find(".ui-tooltip-content").html(s),this.liveRegion.children().hide(),s.clone?(h=s.clone(),h.removeAttr("id").find("[id]").removeAttr("id")):h=s,e("<div>").html(h).appendTo(this.liveRegion),this.options.track&&t&&/^mouse/.test(t.type)?(this._on(this.document,{mousemove:n}),n(t)):o.position(e.extend({of:i},this.options.position)),o.hide(),this._show(o,this.options.show),this.options.show&&this.options.show.delay&&(r=this.delayedShow=setInterval(function(){o.is(":visible")&&(n(l.of),clearInterval(r))},e.fx.interval)),this._trigger("open",t,{tooltip:o})}},_registerCloseHandlers:function(t,i){var s={keyup:function(t){if(t.keyCode===e.ui.keyCode.ESCAPE){var s=e.Event(t);s.currentTarget=i[0],this.close(s,!0)}}};i[0]!==this.element[0]&&(s.remove=function(){this._removeTooltip(this._find(i).tooltip)}),t&&"mouseover"!==t.type||(s.mouseleave="close"),t&&"focusin"!==t.type||(s.focusout="close"),this._on(!0,i,s)},close:function(t){var i,s=this,n=e(t?t.currentTarget:this.element),a=this._find(n);return a?(i=a.tooltip,a.closing||(clearInterval(this.delayedShow),n.data("ui-tooltip-title")&&!n.attr("title")&&n.attr("title",n.data("ui-tooltip-title")),this._removeDescribedBy(n),a.hiding=!0,i.stop(!0),this._hide(i,this.options.hide,function(){s._removeTooltip(e(this))}),n.removeData("ui-tooltip-open"),this._off(n,"mouseleave focusout keyup"),n[0]!==this.element[0]&&this._off(n,"remove"),this._off(this.document,"mousemove"),t&&"mouseleave"===t.type&&e.each(this.parents,function(t,i){e(i.element).attr("title",i.title),delete s.parents[t]}),a.closing=!0,this._trigger("close",t,{tooltip:i}),a.hiding||(a.closing=!1)),void 0):(n.removeData("ui-tooltip-open"),void 0)},_tooltip:function(t){var i=e("<div>").attr("role","tooltip").addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||"")),s=i.uniqueId().attr("id");return e("<div>").addClass("ui-tooltip-content").appendTo(i),i.appendTo(this.document[0].body),this.tooltips[s]={element:t,tooltip:i}},_find:function(e){var t=e.data("ui-tooltip-id");return t?this.tooltips[t]:null},_removeTooltip:function(e){e.remove(),delete this.tooltips[e.attr("id")]},_destroy:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur"),a=s.element;n.target=n.currentTarget=a[0],t.close(n,!0),e("#"+i).remove(),a.data("ui-tooltip-title")&&(a.attr("title")||a.attr("title",a.data("ui-tooltip-title")),a.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}})}); \ No newline at end of file diff --git a/theme/bootstrap/download/moment.min.js b/theme/bootstrap/download/moment.min.js new file mode 100644 index 0000000..a54ef2f --- /dev/null +++ b/theme/bootstrap/download/moment.min.js @@ -0,0 +1,7 @@ +//! moment.js +//! version : 2.10.2 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com +!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.moment=b()}(this,function(){"use strict";function a(){return Ac.apply(null,arguments)}function b(a){Ac=a}function c(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function d(a){return"[object Array]"===Object.prototype.toString.call(a)}function e(a){return"[object Date]"===Object.prototype.toString.call(a)||a instanceof Date}function f(a,b){var c,d=[];for(c=0;c<a.length;++c)d.push(b(a[c],c));return d}function g(a,b){return Object.prototype.hasOwnProperty.call(a,b)}function h(a,b){for(var c in b)g(b,c)&&(a[c]=b[c]);return g(b,"toString")&&(a.toString=b.toString),g(b,"valueOf")&&(a.valueOf=b.valueOf),a}function i(a,b,c,d){return ya(a,b,c,d,!0).utc()}function j(a){return null==a._isValid&&(a._isValid=!isNaN(a._d.getTime())&&a._pf.overflow<0&&!a._pf.empty&&!a._pf.invalidMonth&&!a._pf.nullInput&&!a._pf.invalidFormat&&!a._pf.userInvalidated,a._strict&&(a._isValid=a._isValid&&0===a._pf.charsLeftOver&&0===a._pf.unusedTokens.length&&void 0===a._pf.bigHour)),a._isValid}function k(a){var b=i(0/0);return null!=a?h(b._pf,a):b._pf.userInvalidated=!0,b}function l(a,b){var c,d,e;if("undefined"!=typeof b._isAMomentObject&&(a._isAMomentObject=b._isAMomentObject),"undefined"!=typeof b._i&&(a._i=b._i),"undefined"!=typeof b._f&&(a._f=b._f),"undefined"!=typeof b._l&&(a._l=b._l),"undefined"!=typeof b._strict&&(a._strict=b._strict),"undefined"!=typeof b._tzm&&(a._tzm=b._tzm),"undefined"!=typeof b._isUTC&&(a._isUTC=b._isUTC),"undefined"!=typeof b._offset&&(a._offset=b._offset),"undefined"!=typeof b._pf&&(a._pf=b._pf),"undefined"!=typeof b._locale&&(a._locale=b._locale),Cc.length>0)for(c in Cc)d=Cc[c],e=b[d],"undefined"!=typeof e&&(a[d]=e);return a}function m(b){l(this,b),this._d=new Date(+b._d),Dc===!1&&(Dc=!0,a.updateOffset(this),Dc=!1)}function n(a){return a instanceof m||null!=a&&g(a,"_isAMomentObject")}function o(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function p(a,b,c){var d,e=Math.min(a.length,b.length),f=Math.abs(a.length-b.length),g=0;for(d=0;e>d;d++)(c&&a[d]!==b[d]||!c&&o(a[d])!==o(b[d]))&&g++;return g+f}function q(){}function r(a){return a?a.toLowerCase().replace("_","-"):a}function s(a){for(var b,c,d,e,f=0;f<a.length;){for(e=r(a[f]).split("-"),b=e.length,c=r(a[f+1]),c=c?c.split("-"):null;b>0;){if(d=t(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&p(e,c,!0)>=b-1)break;b--}f++}return null}function t(a){var b=null;if(!Ec[a]&&"undefined"!=typeof module&&module&&module.exports)try{b=Bc._abbr,require("./locale/"+a),u(b)}catch(c){}return Ec[a]}function u(a,b){var c;return a&&(c="undefined"==typeof b?w(a):v(a,b),c&&(Bc=c)),Bc._abbr}function v(a,b){return null!==b?(b.abbr=a,Ec[a]||(Ec[a]=new q),Ec[a].set(b),u(a),Ec[a]):(delete Ec[a],null)}function w(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return Bc;if(!d(a)){if(b=t(a))return b;a=[a]}return s(a)}function x(a,b){var c=a.toLowerCase();Fc[c]=Fc[c+"s"]=Fc[b]=a}function y(a){return"string"==typeof a?Fc[a]||Fc[a.toLowerCase()]:void 0}function z(a){var b,c,d={};for(c in a)g(a,c)&&(b=y(c),b&&(d[b]=a[c]));return d}function A(b,c){return function(d){return null!=d?(C(this,b,d),a.updateOffset(this,c),this):B(this,b)}}function B(a,b){return a._d["get"+(a._isUTC?"UTC":"")+b]()}function C(a,b,c){return a._d["set"+(a._isUTC?"UTC":"")+b](c)}function D(a,b){var c;if("object"==typeof a)for(c in a)this.set(c,a[c]);else if(a=y(a),"function"==typeof this[a])return this[a](b);return this}function E(a,b,c){for(var d=""+Math.abs(a),e=a>=0;d.length<b;)d="0"+d;return(e?c?"+":"":"-")+d}function F(a,b,c,d){var e=d;"string"==typeof d&&(e=function(){return this[d]()}),a&&(Jc[a]=e),b&&(Jc[b[0]]=function(){return E(e.apply(this,arguments),b[1],b[2])}),c&&(Jc[c]=function(){return this.localeData().ordinal(e.apply(this,arguments),a)})}function G(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function H(a){var b,c,d=a.match(Gc);for(b=0,c=d.length;c>b;b++)d[b]=Jc[d[b]]?Jc[d[b]]:G(d[b]);return function(e){var f="";for(b=0;c>b;b++)f+=d[b]instanceof Function?d[b].call(e,a):d[b];return f}}function I(a,b){return a.isValid()?(b=J(b,a.localeData()),Ic[b]||(Ic[b]=H(b)),Ic[b](a)):a.localeData().invalidDate()}function J(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(Hc.lastIndex=0;d>=0&&Hc.test(a);)a=a.replace(Hc,c),Hc.lastIndex=0,d-=1;return a}function K(a,b,c){Yc[a]="function"==typeof b?b:function(a){return a&&c?c:b}}function L(a,b){return g(Yc,a)?Yc[a](b._strict,b._locale):new RegExp(M(a))}function M(a){return a.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e}).replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function N(a,b){var c,d=b;for("string"==typeof a&&(a=[a]),"number"==typeof b&&(d=function(a,c){c[b]=o(a)}),c=0;c<a.length;c++)Zc[a[c]]=d}function O(a,b){N(a,function(a,c,d,e){d._w=d._w||{},b(a,d._w,d,e)})}function P(a,b,c){null!=b&&g(Zc,a)&&Zc[a](b,c._a,c,a)}function Q(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function R(a){return this._months[a.month()]}function S(a){return this._monthsShort[a.month()]}function T(a,b,c){var d,e,f;for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),d=0;12>d;d++){if(e=i([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}}function U(a,b){var c;return"string"==typeof b&&(b=a.localeData().monthsParse(b),"number"!=typeof b)?a:(c=Math.min(a.date(),Q(a.year(),b)),a._d["set"+(a._isUTC?"UTC":"")+"Month"](b,c),a)}function V(b){return null!=b?(U(this,b),a.updateOffset(this,!0),this):B(this,"Month")}function W(){return Q(this.year(),this.month())}function X(a){var b,c=a._a;return c&&-2===a._pf.overflow&&(b=c[_c]<0||c[_c]>11?_c:c[ad]<1||c[ad]>Q(c[$c],c[_c])?ad:c[bd]<0||c[bd]>24||24===c[bd]&&(0!==c[cd]||0!==c[dd]||0!==c[ed])?bd:c[cd]<0||c[cd]>59?cd:c[dd]<0||c[dd]>59?dd:c[ed]<0||c[ed]>999?ed:-1,a._pf._overflowDayOfYear&&($c>b||b>ad)&&(b=ad),a._pf.overflow=b),a}function Y(b){a.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+b)}function Z(a,b){var c=!0;return h(function(){return c&&(Y(a),c=!1),b.apply(this,arguments)},b)}function $(a,b){hd[a]||(Y(b),hd[a]=!0)}function _(a){var b,c,d=a._i,e=id.exec(d);if(e){for(a._pf.iso=!0,b=0,c=jd.length;c>b;b++)if(jd[b][1].exec(d)){a._f=jd[b][0]+(e[6]||" ");break}for(b=0,c=kd.length;c>b;b++)if(kd[b][1].exec(d)){a._f+=kd[b][0];break}d.match(Vc)&&(a._f+="Z"),sa(a)}else a._isValid=!1}function aa(b){var c=ld.exec(b._i);return null!==c?void(b._d=new Date(+c[1])):(_(b),void(b._isValid===!1&&(delete b._isValid,a.createFromInputFallback(b))))}function ba(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return 1970>a&&h.setFullYear(a),h}function ca(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function da(a){return ea(a)?366:365}function ea(a){return a%4===0&&a%100!==0||a%400===0}function fa(){return ea(this.year())}function ga(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=za(a).add(f,"d"),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function ha(a){return ga(a,this._week.dow,this._week.doy).week}function ia(){return this._week.dow}function ja(){return this._week.doy}function ka(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")}function la(a){var b=ga(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")}function ma(a,b,c,d,e){var f,g,h=ca(a,0,1).getUTCDay();return h=0===h?7:h,c=null!=c?c:e,f=e-h+(h>d?7:0)-(e>h?7:0),g=7*(b-1)+(c-e)+f+1,{year:g>0?a:a-1,dayOfYear:g>0?g:da(a-1)+g}}function na(a){var b=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")}function oa(a,b,c){return null!=a?a:null!=b?b:c}function pa(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function qa(a){var b,c,d,e,f=[];if(!a._d){for(d=pa(a),a._w&&null==a._a[ad]&&null==a._a[_c]&&ra(a),a._dayOfYear&&(e=oa(a._a[$c],d[$c]),a._dayOfYear>da(e)&&(a._pf._overflowDayOfYear=!0),c=ca(e,0,a._dayOfYear),a._a[_c]=c.getUTCMonth(),a._a[ad]=c.getUTCDate()),b=0;3>b&&null==a._a[b];++b)a._a[b]=f[b]=d[b];for(;7>b;b++)a._a[b]=f[b]=null==a._a[b]?2===b?1:0:a._a[b];24===a._a[bd]&&0===a._a[cd]&&0===a._a[dd]&&0===a._a[ed]&&(a._nextDay=!0,a._a[bd]=0),a._d=(a._useUTC?ca:ba).apply(null,f),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[bd]=24)}}function ra(a){var b,c,d,e,f,g,h;b=a._w,null!=b.GG||null!=b.W||null!=b.E?(f=1,g=4,c=oa(b.GG,a._a[$c],ga(za(),1,4).year),d=oa(b.W,1),e=oa(b.E,1)):(f=a._locale._week.dow,g=a._locale._week.doy,c=oa(b.gg,a._a[$c],ga(za(),f,g).year),d=oa(b.w,1),null!=b.d?(e=b.d,f>e&&++d):e=null!=b.e?b.e+f:f),h=ma(c,d,e,g,f),a._a[$c]=h.year,a._dayOfYear=h.dayOfYear}function sa(b){if(b._f===a.ISO_8601)return void _(b);b._a=[],b._pf.empty=!0;var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=J(b._f,b._locale).match(Gc)||[],c=0;c<e.length;c++)f=e[c],d=(h.match(L(f,b))||[])[0],d&&(g=h.substr(0,h.indexOf(d)),g.length>0&&b._pf.unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length),Jc[f]?(d?b._pf.empty=!1:b._pf.unusedTokens.push(f),P(f,d,b)):b._strict&&!d&&b._pf.unusedTokens.push(f);b._pf.charsLeftOver=i-j,h.length>0&&b._pf.unusedInput.push(h),b._pf.bigHour===!0&&b._a[bd]<=12&&(b._pf.bigHour=void 0),b._a[bd]=ta(b._locale,b._a[bd],b._meridiem),qa(b),X(b)}function ta(a,b,c){var d;return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&12>b&&(b+=12),d||12!==b||(b=0),b):b}function ua(a){var b,d,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,void(a._d=new Date(0/0));for(f=0;f<a._f.length;f++)g=0,b=l({},a),null!=a._useUTC&&(b._useUTC=a._useUTC),b._pf=c(),b._f=a._f[f],sa(b),j(b)&&(g+=b._pf.charsLeftOver,g+=10*b._pf.unusedTokens.length,b._pf.score=g,(null==e||e>g)&&(e=g,d=b));h(a,d||b)}function va(a){if(!a._d){var b=z(a._i);a._a=[b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],qa(a)}}function wa(a){var b,c=a._i,e=a._f;return a._locale=a._locale||w(a._l),null===c||void 0===e&&""===c?k({nullInput:!0}):("string"==typeof c&&(a._i=c=a._locale.preparse(c)),n(c)?new m(X(c)):(d(e)?ua(a):e?sa(a):xa(a),b=new m(X(a)),b._nextDay&&(b.add(1,"d"),b._nextDay=void 0),b))}function xa(b){var c=b._i;void 0===c?b._d=new Date:e(c)?b._d=new Date(+c):"string"==typeof c?aa(b):d(c)?(b._a=f(c.slice(0),function(a){return parseInt(a,10)}),qa(b)):"object"==typeof c?va(b):"number"==typeof c?b._d=new Date(c):a.createFromInputFallback(b)}function ya(a,b,d,e,f){var g={};return"boolean"==typeof d&&(e=d,d=void 0),g._isAMomentObject=!0,g._useUTC=g._isUTC=f,g._l=d,g._i=a,g._f=b,g._strict=e,g._pf=c(),wa(g)}function za(a,b,c,d){return ya(a,b,c,d,!1)}function Aa(a,b){var c,e;if(1===b.length&&d(b[0])&&(b=b[0]),!b.length)return za();for(c=b[0],e=1;e<b.length;++e)b[e][a](c)&&(c=b[e]);return c}function Ba(){var a=[].slice.call(arguments,0);return Aa("isBefore",a)}function Ca(){var a=[].slice.call(arguments,0);return Aa("isAfter",a)}function Da(a){var b=z(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0;this._milliseconds=+k+1e3*j+6e4*i+36e5*h,this._days=+g+7*f,this._months=+e+3*d+12*c,this._data={},this._locale=w(),this._bubble()}function Ea(a){return a instanceof Da}function Fa(a,b){F(a,0,0,function(){var a=this.utcOffset(),c="+";return 0>a&&(a=-a,c="-"),c+E(~~(a/60),2)+b+E(~~a%60,2)})}function Ga(a){var b=(a||"").match(Vc)||[],c=b[b.length-1]||[],d=(c+"").match(qd)||["-",0,0],e=+(60*d[1])+o(d[2]);return"+"===d[0]?e:-e}function Ha(b,c){var d,f;return c._isUTC?(d=c.clone(),f=(n(b)||e(b)?+b:+za(b))-+d,d._d.setTime(+d._d+f),a.updateOffset(d,!1),d):za(b).local();return c._isUTC?za(b).zone(c._offset||0):za(b).local()}function Ia(a){return 15*-Math.round(a._d.getTimezoneOffset()/15)}function Ja(b,c){var d,e=this._offset||0;return null!=b?("string"==typeof b&&(b=Ga(b)),Math.abs(b)<16&&(b=60*b),!this._isUTC&&c&&(d=Ia(this)),this._offset=b,this._isUTC=!0,null!=d&&this.add(d,"m"),e!==b&&(!c||this._changeInProgress?Za(this,Ua(b-e,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?e:Ia(this)}function Ka(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}function La(a){return this.utcOffset(0,a)}function Ma(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(Ia(this),"m")),this}function Na(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(Ga(this._i)),this}function Oa(a){return a=a?za(a).utcOffset():0,(this.utcOffset()-a)%60===0}function Pa(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Qa(){if(this._a){var a=this._isUTC?i(this._a):za(this._a);return this.isValid()&&p(this._a,a.toArray())>0}return!1}function Ra(){return!this._isUTC}function Sa(){return this._isUTC}function Ta(){return this._isUTC&&0===this._offset}function Ua(a,b){var c,d,e,f=a,h=null;return Ea(a)?f={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(f={},b?f[b]=a:f.milliseconds=a):(h=rd.exec(a))?(c="-"===h[1]?-1:1,f={y:0,d:o(h[ad])*c,h:o(h[bd])*c,m:o(h[cd])*c,s:o(h[dd])*c,ms:o(h[ed])*c}):(h=sd.exec(a))?(c="-"===h[1]?-1:1,f={y:Va(h[2],c),M:Va(h[3],c),d:Va(h[4],c),h:Va(h[5],c),m:Va(h[6],c),s:Va(h[7],c),w:Va(h[8],c)}):null==f?f={}:"object"==typeof f&&("from"in f||"to"in f)&&(e=Xa(za(f.from),za(f.to)),f={},f.ms=e.milliseconds,f.M=e.months),d=new Da(f),Ea(a)&&g(a,"_locale")&&(d._locale=a._locale),d}function Va(a,b){var c=a&&parseFloat(a.replace(",","."));return(isNaN(c)?0:c)*b}function Wa(a,b){var c={milliseconds:0,months:0};return c.months=b.month()-a.month()+12*(b.year()-a.year()),a.clone().add(c.months,"M").isAfter(b)&&--c.months,c.milliseconds=+b-+a.clone().add(c.months,"M"),c}function Xa(a,b){var c;return b=Ha(b,a),a.isBefore(b)?c=Wa(a,b):(c=Wa(b,a),c.milliseconds=-c.milliseconds,c.months=-c.months),c}function Ya(a,b){return function(c,d){var e,f;return null===d||isNaN(+d)||($(b,"moment()."+b+"(period, number) is deprecated. Please use moment()."+b+"(number, period)."),f=c,c=d,d=f),c="string"==typeof c?+c:c,e=Ua(c,d),Za(this,e,a),this}}function Za(b,c,d,e){var f=c._milliseconds,g=c._days,h=c._months;e=null==e?!0:e,f&&b._d.setTime(+b._d+f*d),g&&C(b,"Date",B(b,"Date")+g*d),h&&U(b,B(b,"Month")+h*d),e&&a.updateOffset(b,g||h)}function $a(a){var b=a||za(),c=Ha(b,this).startOf("day"),d=this.diff(c,"days",!0),e=-6>d?"sameElse":-1>d?"lastWeek":0>d?"lastDay":1>d?"sameDay":2>d?"nextDay":7>d?"nextWeek":"sameElse";return this.format(this.localeData().calendar(e,this,za(b)))}function _a(){return new m(this)}function ab(a,b){var c;return b=y("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=n(a)?a:za(a),+this>+a):(c=n(a)?+a:+za(a),c<+this.clone().startOf(b))}function bb(a,b){var c;return b=y("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=n(a)?a:za(a),+a>+this):(c=n(a)?+a:+za(a),+this.clone().endOf(b)<c)}function cb(a,b,c){return this.isAfter(a,c)&&this.isBefore(b,c)}function db(a,b){var c;return b=y(b||"millisecond"),"millisecond"===b?(a=n(a)?a:za(a),+this===+a):(c=+za(a),+this.clone().startOf(b)<=c&&c<=+this.clone().endOf(b))}function eb(a){return 0>a?Math.ceil(a):Math.floor(a)}function fb(a,b,c){var d,e,f=Ha(a,this),g=6e4*(f.utcOffset()-this.utcOffset());return b=y(b),"year"===b||"month"===b||"quarter"===b?(e=gb(this,f),"quarter"===b?e/=3:"year"===b&&(e/=12)):(d=this-f,e="second"===b?d/1e3:"minute"===b?d/6e4:"hour"===b?d/36e5:"day"===b?(d-g)/864e5:"week"===b?(d-g)/6048e5:d),c?e:eb(e)}function gb(a,b){var c,d,e=12*(b.year()-a.year())+(b.month()-a.month()),f=a.clone().add(e,"months");return 0>b-f?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)}function hb(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function ib(){var a=this.clone().utc();return 0<a.year()&&a.year()<=9999?"function"==typeof Date.prototype.toISOString?this.toDate().toISOString():I(a,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):I(a,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]")}function jb(b){var c=I(this,b||a.defaultFormat);return this.localeData().postformat(c)}function kb(a,b){return Ua({to:this,from:a}).locale(this.locale()).humanize(!b)}function lb(a){return this.from(za(),a)}function mb(a){var b;return void 0===a?this._locale._abbr:(b=w(a),null!=b&&(this._locale=b),this)}function nb(){return this._locale}function ob(a){switch(a=y(a)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===a&&this.weekday(0),"isoWeek"===a&&this.isoWeekday(1),"quarter"===a&&this.month(3*Math.floor(this.month()/3)),this}function pb(a){return a=y(a),void 0===a||"millisecond"===a?this:this.startOf(a).add(1,"isoWeek"===a?"week":a).subtract(1,"ms")}function qb(){return+this._d-6e4*(this._offset||0)}function rb(){return Math.floor(+this/1e3)}function sb(){return this._offset?new Date(+this):this._d}function tb(){var a=this;return[a.year(),a.month(),a.date(),a.hour(),a.minute(),a.second(),a.millisecond()]}function ub(){return j(this)}function vb(){return h({},this._pf)}function wb(){return this._pf.overflow}function xb(a,b){F(0,[a,a.length],0,b)}function yb(a,b,c){return ga(za([a,11,31+b-c]),b,c).week}function zb(a){var b=ga(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return null==a?b:this.add(a-b,"y")}function Ab(a){var b=ga(this,1,4).year;return null==a?b:this.add(a-b,"y")}function Bb(){return yb(this.year(),1,4)}function Cb(){var a=this.localeData()._week;return yb(this.year(),a.dow,a.doy)}function Db(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)}function Eb(a,b){if("string"==typeof a)if(isNaN(a)){if(a=b.weekdaysParse(a),"number"!=typeof a)return null}else a=parseInt(a,10);return a}function Fb(a){return this._weekdays[a.day()]}function Gb(a){return this._weekdaysShort[a.day()]}function Hb(a){return this._weekdaysMin[a.day()]}function Ib(a){var b,c,d;for(this._weekdaysParse||(this._weekdaysParse=[]),b=0;7>b;b++)if(this._weekdaysParse[b]||(c=za([2e3,1]).day(b),d="^"+this.weekdays(c,"")+"|^"+this.weekdaysShort(c,"")+"|^"+this.weekdaysMin(c,""),this._weekdaysParse[b]=new RegExp(d.replace(".",""),"i")),this._weekdaysParse[b].test(a))return b}function Jb(a){var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=Eb(a,this.localeData()),this.add(a-b,"d")):b}function Kb(a){var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")}function Lb(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)}function Mb(a,b){F(a,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),b)})}function Nb(a,b){return b._meridiemParse}function Ob(a){return"p"===(a+"").toLowerCase().charAt(0)}function Pb(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"}function Qb(a){F(0,[a,3],0,"millisecond")}function Rb(){return this._isUTC?"UTC":""}function Sb(){return this._isUTC?"Coordinated Universal Time":""}function Tb(a){return za(1e3*a)}function Ub(){return za.apply(null,arguments).parseZone()}function Vb(a,b,c){var d=this._calendar[a];return"function"==typeof d?d.call(b,c):d}function Wb(a){var b=this._longDateFormat[a];return!b&&this._longDateFormat[a.toUpperCase()]&&(b=this._longDateFormat[a.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a]=b),b}function Xb(){return this._invalidDate}function Yb(a){return this._ordinal.replace("%d",a)}function Zb(a){return a}function $b(a,b,c,d){var e=this._relativeTime[c];return"function"==typeof e?e(a,b,c,d):e.replace(/%d/i,a)}function _b(a,b){var c=this._relativeTime[a>0?"future":"past"];return"function"==typeof c?c(b):c.replace(/%s/i,b)}function ac(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)}function bc(a,b,c,d){var e=w(),f=i().set(d,b);return e[c](f,a)}function cc(a,b,c,d,e){if("number"==typeof a&&(b=a,a=void 0),a=a||"",null!=b)return bc(a,b,c,e);var f,g=[];for(f=0;d>f;f++)g[f]=bc(a,f,c,e);return g}function dc(a,b){return cc(a,b,"months",12,"month")}function ec(a,b){return cc(a,b,"monthsShort",12,"month")}function fc(a,b){return cc(a,b,"weekdays",7,"day")}function gc(a,b){return cc(a,b,"weekdaysShort",7,"day")}function hc(a,b){return cc(a,b,"weekdaysMin",7,"day")}function ic(){var a=this._data;return this._milliseconds=Od(this._milliseconds),this._days=Od(this._days),this._months=Od(this._months),a.milliseconds=Od(a.milliseconds),a.seconds=Od(a.seconds),a.minutes=Od(a.minutes),a.hours=Od(a.hours),a.months=Od(a.months),a.years=Od(a.years),this}function jc(a,b,c,d){var e=Ua(b,c);return a._milliseconds+=d*e._milliseconds,a._days+=d*e._days,a._months+=d*e._months,a._bubble()}function kc(a,b){return jc(this,a,b,1)}function lc(a,b){return jc(this,a,b,-1)}function mc(){var a,b,c,d=this._milliseconds,e=this._days,f=this._months,g=this._data,h=0;return g.milliseconds=d%1e3,a=eb(d/1e3),g.seconds=a%60,b=eb(a/60),g.minutes=b%60,c=eb(b/60),g.hours=c%24,e+=eb(c/24),h=eb(nc(e)),e-=eb(oc(h)),f+=eb(e/30),e%=30,h+=eb(f/12),f%=12,g.days=e,g.months=f,g.years=h,this}function nc(a){return 400*a/146097}function oc(a){return 146097*a/400}function pc(a){var b,c,d=this._milliseconds;if(a=y(a),"month"===a||"year"===a)return b=this._days+d/864e5,c=this._months+12*nc(b),"month"===a?c:c/12;switch(b=this._days+Math.round(oc(this._months/12)),a){case"week":return b/7+d/6048e5;case"day":return b+d/864e5;case"hour":return 24*b+d/36e5;case"minute":return 24*b*60+d/6e4;case"second":return 24*b*60*60+d/1e3;case"millisecond":return Math.floor(24*b*60*60*1e3)+d;default:throw new Error("Unknown unit "+a)}}function qc(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*o(this._months/12)}function rc(a){return function(){return this.as(a)}}function sc(a){return a=y(a),this[a+"s"]()}function tc(a){return function(){return this._data[a]}}function uc(){return eb(this.days()/7)}function vc(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function wc(a,b,c){var d=Ua(a).abs(),e=ce(d.as("s")),f=ce(d.as("m")),g=ce(d.as("h")),h=ce(d.as("d")),i=ce(d.as("M")),j=ce(d.as("y")),k=e<de.s&&["s",e]||1===f&&["m"]||f<de.m&&["mm",f]||1===g&&["h"]||g<de.h&&["hh",g]||1===h&&["d"]||h<de.d&&["dd",h]||1===i&&["M"]||i<de.M&&["MM",i]||1===j&&["y"]||["yy",j];return k[2]=b,k[3]=+a>0,k[4]=c,vc.apply(null,k)}function xc(a,b){return void 0===de[a]?!1:void 0===b?de[a]:(de[a]=b,!0)}function yc(a){var b=this.localeData(),c=wc(this,!a,b);return a&&(c=b.pastFuture(+this,c)),b.postformat(c)}function zc(){var a=ee(this.years()),b=ee(this.months()),c=ee(this.days()),d=ee(this.hours()),e=ee(this.minutes()),f=ee(this.seconds()+this.milliseconds()/1e3),g=this.asSeconds();return g?(0>g?"-":"")+"P"+(a?a+"Y":"")+(b?b+"M":"")+(c?c+"D":"")+(d||e||f?"T":"")+(d?d+"H":"")+(e?e+"M":"")+(f?f+"S":""):"P0D"}var Ac,Bc,Cc=a.momentProperties=[],Dc=!1,Ec={},Fc={},Gc=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g,Hc=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,Ic={},Jc={},Kc=/\d/,Lc=/\d\d/,Mc=/\d{3}/,Nc=/\d{4}/,Oc=/[+-]?\d{6}/,Pc=/\d\d?/,Qc=/\d{1,3}/,Rc=/\d{1,4}/,Sc=/[+-]?\d{1,6}/,Tc=/\d+/,Uc=/[+-]?\d+/,Vc=/Z|[+-]\d\d:?\d\d/gi,Wc=/[+-]?\d+(\.\d{1,3})?/,Xc=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Yc={},Zc={},$c=0,_c=1,ad=2,bd=3,cd=4,dd=5,ed=6;F("M",["MM",2],"Mo",function(){return this.month()+1}),F("MMM",0,0,function(a){return this.localeData().monthsShort(this,a)}),F("MMMM",0,0,function(a){return this.localeData().months(this,a)}),x("month","M"),K("M",Pc),K("MM",Pc,Lc),K("MMM",Xc),K("MMMM",Xc),N(["M","MM"],function(a,b){b[_c]=o(a)-1}),N(["MMM","MMMM"],function(a,b,c,d){var e=c._locale.monthsParse(a,d,c._strict);null!=e?b[_c]=e:c._pf.invalidMonth=a});var fd="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),gd="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),hd={};a.suppressDeprecationWarnings=!1;var id=/^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,jd=[["YYYYYY-MM-DD",/[+-]\d{6}-\d{2}-\d{2}/],["YYYY-MM-DD",/\d{4}-\d{2}-\d{2}/],["GGGG-[W]WW-E",/\d{4}-W\d{2}-\d/],["GGGG-[W]WW",/\d{4}-W\d{2}/],["YYYY-DDD",/\d{4}-\d{3}/]],kd=[["HH:mm:ss.SSSS",/(T| )\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],ld=/^\/?Date\((\-?\d+)/i;a.createFromInputFallback=Z("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),F(0,["YY",2],0,function(){return this.year()%100}),F(0,["YYYY",4],0,"year"),F(0,["YYYYY",5],0,"year"),F(0,["YYYYYY",6,!0],0,"year"),x("year","y"),K("Y",Uc),K("YY",Pc,Lc),K("YYYY",Rc,Nc),K("YYYYY",Sc,Oc),K("YYYYYY",Sc,Oc),N(["YYYY","YYYYY","YYYYYY"],$c),N("YY",function(b,c){c[$c]=a.parseTwoDigitYear(b)}),a.parseTwoDigitYear=function(a){return o(a)+(o(a)>68?1900:2e3)};var md=A("FullYear",!1);F("w",["ww",2],"wo","week"),F("W",["WW",2],"Wo","isoWeek"),x("week","w"),x("isoWeek","W"),K("w",Pc),K("ww",Pc,Lc),K("W",Pc),K("WW",Pc,Lc),O(["w","ww","W","WW"],function(a,b,c,d){b[d.substr(0,1)]=o(a)});var nd={dow:0,doy:6};F("DDD",["DDDD",3],"DDDo","dayOfYear"),x("dayOfYear","DDD"),K("DDD",Qc),K("DDDD",Mc),N(["DDD","DDDD"],function(a,b,c){c._dayOfYear=o(a)}),a.ISO_8601=function(){};var od=Z("moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(){var a=za.apply(null,arguments);return this>a?this:a}),pd=Z("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(){var a=za.apply(null,arguments);return a>this?this:a});Fa("Z",":"),Fa("ZZ",""),K("Z",Vc),K("ZZ",Vc),N(["Z","ZZ"],function(a,b,c){c._useUTC=!0,c._tzm=Ga(a)});var qd=/([\+\-]|\d\d)/gi;a.updateOffset=function(){};var rd=/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,sd=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/;Ua.fn=Da.prototype;var td=Ya(1,"add"),ud=Ya(-1,"subtract");a.defaultFormat="YYYY-MM-DDTHH:mm:ssZ";var vd=Z("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(a){return void 0===a?this.localeData():this.locale(a)});F(0,["gg",2],0,function(){return this.weekYear()%100}),F(0,["GG",2],0,function(){return this.isoWeekYear()%100}),xb("gggg","weekYear"),xb("ggggg","weekYear"),xb("GGGG","isoWeekYear"),xb("GGGGG","isoWeekYear"),x("weekYear","gg"),x("isoWeekYear","GG"),K("G",Uc),K("g",Uc),K("GG",Pc,Lc),K("gg",Pc,Lc),K("GGGG",Rc,Nc),K("gggg",Rc,Nc),K("GGGGG",Sc,Oc),K("ggggg",Sc,Oc),O(["gggg","ggggg","GGGG","GGGGG"],function(a,b,c,d){b[d.substr(0,2)]=o(a)}),O(["gg","GG"],function(b,c,d,e){c[e]=a.parseTwoDigitYear(b)}),F("Q",0,0,"quarter"),x("quarter","Q"),K("Q",Kc),N("Q",function(a,b){b[_c]=3*(o(a)-1)}),F("D",["DD",2],"Do","date"),x("date","D"),K("D",Pc),K("DD",Pc,Lc),K("Do",function(a,b){return a?b._ordinalParse:b._ordinalParseLenient}),N(["D","DD"],ad),N("Do",function(a,b){b[ad]=o(a.match(Pc)[0],10)});var wd=A("Date",!0);F("d",0,"do","day"),F("dd",0,0,function(a){return this.localeData().weekdaysMin(this,a)}),F("ddd",0,0,function(a){return this.localeData().weekdaysShort(this,a)}),F("dddd",0,0,function(a){return this.localeData().weekdays(this,a)}),F("e",0,0,"weekday"),F("E",0,0,"isoWeekday"),x("day","d"),x("weekday","e"),x("isoWeekday","E"),K("d",Pc),K("e",Pc),K("E",Pc),K("dd",Xc),K("ddd",Xc),K("dddd",Xc),O(["dd","ddd","dddd"],function(a,b,c){var d=c._locale.weekdaysParse(a);null!=d?b.d=d:c._pf.invalidWeekday=a}),O(["d","e","E"],function(a,b,c,d){b[d]=o(a)});var xd="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),yd="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),zd="Su_Mo_Tu_We_Th_Fr_Sa".split("_");F("H",["HH",2],0,"hour"),F("h",["hh",2],0,function(){return this.hours()%12||12}),Mb("a",!0),Mb("A",!1),x("hour","h"),K("a",Nb),K("A",Nb),K("H",Pc),K("h",Pc),K("HH",Pc,Lc),K("hh",Pc,Lc),N(["H","HH"],bd),N(["a","A"],function(a,b,c){c._isPm=c._locale.isPM(a),c._meridiem=a}),N(["h","hh"],function(a,b,c){b[bd]=o(a),c._pf.bigHour=!0});var Ad=/[ap]\.?m?\.?/i,Bd=A("Hours",!0);F("m",["mm",2],0,"minute"),x("minute","m"),K("m",Pc),K("mm",Pc,Lc),N(["m","mm"],cd);var Cd=A("Minutes",!1);F("s",["ss",2],0,"second"),x("second","s"),K("s",Pc),K("ss",Pc,Lc),N(["s","ss"],dd);var Dd=A("Seconds",!1);F("S",0,0,function(){return~~(this.millisecond()/100)}),F(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),Qb("SSS"),Qb("SSSS"),x("millisecond","ms"),K("S",Qc,Kc),K("SS",Qc,Lc),K("SSS",Qc,Mc),K("SSSS",Tc),N(["S","SS","SSS","SSSS"],function(a,b){b[ed]=o(1e3*("0."+a))});var Ed=A("Milliseconds",!1);F("z",0,0,"zoneAbbr"),F("zz",0,0,"zoneName");var Fd=m.prototype;Fd.add=td,Fd.calendar=$a,Fd.clone=_a,Fd.diff=fb,Fd.endOf=pb,Fd.format=jb,Fd.from=kb,Fd.fromNow=lb,Fd.get=D,Fd.invalidAt=wb,Fd.isAfter=ab,Fd.isBefore=bb,Fd.isBetween=cb,Fd.isSame=db,Fd.isValid=ub,Fd.lang=vd,Fd.locale=mb,Fd.localeData=nb,Fd.max=pd,Fd.min=od,Fd.parsingFlags=vb,Fd.set=D,Fd.startOf=ob,Fd.subtract=ud,Fd.toArray=tb,Fd.toDate=sb,Fd.toISOString=ib,Fd.toJSON=ib,Fd.toString=hb,Fd.unix=rb,Fd.valueOf=qb,Fd.year=md,Fd.isLeapYear=fa,Fd.weekYear=zb,Fd.isoWeekYear=Ab,Fd.quarter=Fd.quarters=Db,Fd.month=V,Fd.daysInMonth=W,Fd.week=Fd.weeks=ka,Fd.isoWeek=Fd.isoWeeks=la,Fd.weeksInYear=Cb,Fd.isoWeeksInYear=Bb,Fd.date=wd,Fd.day=Fd.days=Jb,Fd.weekday=Kb,Fd.isoWeekday=Lb,Fd.dayOfYear=na,Fd.hour=Fd.hours=Bd,Fd.minute=Fd.minutes=Cd,Fd.second=Fd.seconds=Dd,Fd.millisecond=Fd.milliseconds=Ed,Fd.utcOffset=Ja,Fd.utc=La,Fd.local=Ma,Fd.parseZone=Na,Fd.hasAlignedHourOffset=Oa,Fd.isDST=Pa,Fd.isDSTShifted=Qa,Fd.isLocal=Ra,Fd.isUtcOffset=Sa,Fd.isUtc=Ta,Fd.isUTC=Ta,Fd.zoneAbbr=Rb,Fd.zoneName=Sb,Fd.dates=Z("dates accessor is deprecated. Use date instead.",wd),Fd.months=Z("months accessor is deprecated. Use month instead",V),Fd.years=Z("years accessor is deprecated. Use year instead",md),Fd.zone=Z("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",Ka);var Gd=Fd,Hd={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},Id={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM D, YYYY LT"},Jd="Invalid date",Kd="%d",Ld=/\d{1,2}/,Md={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},Nd=q.prototype;Nd._calendar=Hd,Nd.calendar=Vb,Nd._longDateFormat=Id,Nd.longDateFormat=Wb,Nd._invalidDate=Jd,Nd.invalidDate=Xb,Nd._ordinal=Kd,Nd.ordinal=Yb,Nd._ordinalParse=Ld, +Nd.preparse=Zb,Nd.postformat=Zb,Nd._relativeTime=Md,Nd.relativeTime=$b,Nd.pastFuture=_b,Nd.set=ac,Nd.months=R,Nd._months=fd,Nd.monthsShort=S,Nd._monthsShort=gd,Nd.monthsParse=T,Nd.week=ha,Nd._week=nd,Nd.firstDayOfYear=ja,Nd.firstDayOfWeek=ia,Nd.weekdays=Fb,Nd._weekdays=xd,Nd.weekdaysMin=Hb,Nd._weekdaysMin=zd,Nd.weekdaysShort=Gb,Nd._weekdaysShort=yd,Nd.weekdaysParse=Ib,Nd.isPM=Ob,Nd._meridiemParse=Ad,Nd.meridiem=Pb,u("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===o(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),a.lang=Z("moment.lang is deprecated. Use moment.locale instead.",u),a.langData=Z("moment.langData is deprecated. Use moment.localeData instead.",w);var Od=Math.abs,Pd=rc("ms"),Qd=rc("s"),Rd=rc("m"),Sd=rc("h"),Td=rc("d"),Ud=rc("w"),Vd=rc("M"),Wd=rc("y"),Xd=tc("milliseconds"),Yd=tc("seconds"),Zd=tc("minutes"),$d=tc("hours"),_d=tc("days"),ae=tc("months"),be=tc("years"),ce=Math.round,de={s:45,m:45,h:22,d:26,M:11},ee=Math.abs,fe=Da.prototype;fe.abs=ic,fe.add=kc,fe.subtract=lc,fe.as=pc,fe.asMilliseconds=Pd,fe.asSeconds=Qd,fe.asMinutes=Rd,fe.asHours=Sd,fe.asDays=Td,fe.asWeeks=Ud,fe.asMonths=Vd,fe.asYears=Wd,fe.valueOf=qc,fe._bubble=mc,fe.get=sc,fe.milliseconds=Xd,fe.seconds=Yd,fe.minutes=Zd,fe.hours=$d,fe.days=_d,fe.weeks=uc,fe.months=ae,fe.years=be,fe.humanize=yc,fe.toISOString=zc,fe.toString=zc,fe.toJSON=zc,fe.locale=mb,fe.localeData=nb,fe.toIsoString=Z("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",zc),fe.lang=vd,F("X",0,0,"unix"),F("x",0,0,"valueOf"),K("x",Uc),K("X",Wc),N("X",function(a,b,c){c._d=new Date(1e3*parseFloat(a,10))}),N("x",function(a,b,c){c._d=new Date(o(a))}),a.version="2.10.2",b(za),a.fn=Gd,a.min=Ba,a.max=Ca,a.utc=i,a.unix=Tb,a.months=dc,a.isDate=e,a.locale=u,a.invalid=k,a.duration=Ua,a.isMoment=n,a.weekdays=fc,a.parseZone=Ub,a.localeData=w,a.isDuration=Ea,a.monthsShort=ec,a.weekdaysMin=hc,a.defineLocale=v,a.weekdaysShort=gc,a.normalizeUnits=y,a.relativeTimeThreshold=xc;var ge=a;return ge}); \ No newline at end of file diff --git a/theme/bootstrap/download/raphael-min.js b/theme/bootstrap/download/raphael-min.js new file mode 100644 index 0000000..ed99de2 --- /dev/null +++ b/theme/bootstrap/download/raphael-min.js @@ -0,0 +1,10 @@ +// ┌────────────────────────────────────────────────────────────────────┐ \\ +// │ Raphaël 2.1.0 - JavaScript Vector Library │ \\ +// ├────────────────────────────────────────────────────────────────────┤ \\ +// │ Copyright © 2008-2012 Dmitry Baranovskiy (http://raphaeljs.com) │ \\ +// │ Copyright © 2008-2012 Sencha Labs (http://sencha.com) │ \\ +// ├────────────────────────────────────────────────────────────────────┤ \\ +// │ Licensed under the MIT (http://raphaeljs.com/license.html) license.│ \\ +// └────────────────────────────────────────────────────────────────────┘ \\ + +(function(a){var b="0.3.4",c="hasOwnProperty",d=/[\.\/]/,e="*",f=function(){},g=function(a,b){return a-b},h,i,j={n:{}},k=function(a,b){var c=j,d=i,e=Array.prototype.slice.call(arguments,2),f=k.listeners(a),l=0,m=!1,n,o=[],p={},q=[],r=h,s=[];h=a,i=0;for(var t=0,u=f.length;t<u;t++)"zIndex"in f[t]&&(o.push(f[t].zIndex),f[t].zIndex<0&&(p[f[t].zIndex]=f[t]));o.sort(g);while(o[l]<0){n=p[o[l++]],q.push(n.apply(b,e));if(i){i=d;return q}}for(t=0;t<u;t++){n=f[t];if("zIndex"in n)if(n.zIndex==o[l]){q.push(n.apply(b,e));if(i)break;do{l++,n=p[o[l]],n&&q.push(n.apply(b,e));if(i)break}while(n)}else p[n.zIndex]=n;else{q.push(n.apply(b,e));if(i)break}}i=d,h=r;return q.length?q:null};k.listeners=function(a){var b=a.split(d),c=j,f,g,h,i,k,l,m,n,o=[c],p=[];for(i=0,k=b.length;i<k;i++){n=[];for(l=0,m=o.length;l<m;l++){c=o[l].n,g=[c[b[i]],c[e]],h=2;while(h--)f=g[h],f&&(n.push(f),p=p.concat(f.f||[]))}o=n}return p},k.on=function(a,b){var c=a.split(d),e=j;for(var g=0,h=c.length;g<h;g++)e=e.n,!e[c[g]]&&(e[c[g]]={n:{}}),e=e[c[g]];e.f=e.f||[];for(g=0,h=e.f.length;g<h;g++)if(e.f[g]==b)return f;e.f.push(b);return function(a){+a==+a&&(b.zIndex=+a)}},k.stop=function(){i=1},k.nt=function(a){if(a)return(new RegExp("(?:\\.|\\/|^)"+a+"(?:\\.|\\/|$)")).test(h);return h},k.off=k.unbind=function(a,b){var f=a.split(d),g,h,i,k,l,m,n,o=[j];for(k=0,l=f.length;k<l;k++)for(m=0;m<o.length;m+=i.length-2){i=[m,1],g=o[m].n;if(f[k]!=e)g[f[k]]&&i.push(g[f[k]]);else for(h in g)g[c](h)&&i.push(g[h]);o.splice.apply(o,i)}for(k=0,l=o.length;k<l;k++){g=o[k];while(g.n){if(b){if(g.f){for(m=0,n=g.f.length;m<n;m++)if(g.f[m]==b){g.f.splice(m,1);break}!g.f.length&&delete g.f}for(h in g.n)if(g.n[c](h)&&g.n[h].f){var p=g.n[h].f;for(m=0,n=p.length;m<n;m++)if(p[m]==b){p.splice(m,1);break}!p.length&&delete g.n[h].f}}else{delete g.f;for(h in g.n)g.n[c](h)&&g.n[h].f&&delete g.n[h].f}g=g.n}}},k.once=function(a,b){var c=function(){var d=b.apply(this,arguments);k.unbind(a,c);return d};return k.on(a,c)},k.version=b,k.toString=function(){return"You are running Eve "+b},typeof module!="undefined"&&module.exports?module.exports=k:typeof define!="undefined"?define("eve",[],function(){return k}):a.eve=k})(this),function(){function cF(a){for(var b=0;b<cy.length;b++)cy[b].el.paper==a&&cy.splice(b--,1)}function cE(b,d,e,f,h,i){e=Q(e);var j,k,l,m=[],o,p,q,t=b.ms,u={},v={},w={};if(f)for(y=0,z=cy.length;y<z;y++){var x=cy[y];if(x.el.id==d.id&&x.anim==b){x.percent!=e?(cy.splice(y,1),l=1):k=x,d.attr(x.totalOrigin);break}}else f=+v;for(var y=0,z=b.percents.length;y<z;y++){if(b.percents[y]==e||b.percents[y]>f*b.top){e=b.percents[y],p=b.percents[y-1]||0,t=t/b.top*(e-p),o=b.percents[y+1],j=b.anim[e];break}f&&d.attr(b.anim[b.percents[y]])}if(!!j){if(!k){for(var A in j)if(j[g](A))if(U[g](A)||d.paper.customAttributes[g](A)){u[A]=d.attr(A),u[A]==null&&(u[A]=T[A]),v[A]=j[A];switch(U[A]){case C:w[A]=(v[A]-u[A])/t;break;case"colour":u[A]=a.getRGB(u[A]);var B=a.getRGB(v[A]);w[A]={r:(B.r-u[A].r)/t,g:(B.g-u[A].g)/t,b:(B.b-u[A].b)/t};break;case"path":var D=bR(u[A],v[A]),E=D[1];u[A]=D[0],w[A]=[];for(y=0,z=u[A].length;y<z;y++){w[A][y]=[0];for(var F=1,G=u[A][y].length;F<G;F++)w[A][y][F]=(E[y][F]-u[A][y][F])/t}break;case"transform":var H=d._,I=ca(H[A],v[A]);if(I){u[A]=I.from,v[A]=I.to,w[A]=[],w[A].real=!0;for(y=0,z=u[A].length;y<z;y++){w[A][y]=[u[A][y][0]];for(F=1,G=u[A][y].length;F<G;F++)w[A][y][F]=(v[A][y][F]-u[A][y][F])/t}}else{var J=d.matrix||new cb,K={_:{transform:H.transform},getBBox:function(){return d.getBBox(1)}};u[A]=[J.a,J.b,J.c,J.d,J.e,J.f],b$(K,v[A]),v[A]=K._.transform,w[A]=[(K.matrix.a-J.a)/t,(K.matrix.b-J.b)/t,(K.matrix.c-J.c)/t,(K.matrix.d-J.d)/t,(K.matrix.e-J.e)/t,(K.matrix.f-J.f)/t]}break;case"csv":var L=r(j[A])[s](c),M=r(u[A])[s](c);if(A=="clip-rect"){u[A]=M,w[A]=[],y=M.length;while(y--)w[A][y]=(L[y]-u[A][y])/t}v[A]=L;break;default:L=[][n](j[A]),M=[][n](u[A]),w[A]=[],y=d.paper.customAttributes[A].length;while(y--)w[A][y]=((L[y]||0)-(M[y]||0))/t}}var O=j.easing,P=a.easing_formulas[O];if(!P){P=r(O).match(N);if(P&&P.length==5){var R=P;P=function(a){return cC(a,+R[1],+R[2],+R[3],+R[4],t)}}else P=bf}q=j.start||b.start||+(new Date),x={anim:b,percent:e,timestamp:q,start:q+(b.del||0),status:0,initstatus:f||0,stop:!1,ms:t,easing:P,from:u,diff:w,to:v,el:d,callback:j.callback,prev:p,next:o,repeat:i||b.times,origin:d.attr(),totalOrigin:h},cy.push(x);if(f&&!k&&!l){x.stop=!0,x.start=new Date-t*f;if(cy.length==1)return cA()}l&&(x.start=new Date-x.ms*f),cy.length==1&&cz(cA)}else k.initstatus=f,k.start=new Date-k.ms*f;eve("raphael.anim.start."+d.id,d,b)}}function cD(a,b){var c=[],d={};this.ms=b,this.times=1;if(a){for(var e in a)a[g](e)&&(d[Q(e)]=a[e],c.push(Q(e)));c.sort(bd)}this.anim=d,this.top=c[c.length-1],this.percents=c}function cC(a,b,c,d,e,f){function o(a,b){var c,d,e,f,j,k;for(e=a,k=0;k<8;k++){f=m(e)-a;if(z(f)<b)return e;j=(3*i*e+2*h)*e+g;if(z(j)<1e-6)break;e=e-f/j}c=0,d=1,e=a;if(e<c)return c;if(e>d)return d;while(c<d){f=m(e);if(z(f-a)<b)return e;a>f?c=e:d=e,e=(d-c)/2+c}return e}function n(a,b){var c=o(a,b);return((l*c+k)*c+j)*c}function m(a){return((i*a+h)*a+g)*a}var g=3*b,h=3*(d-b)-g,i=1-g-h,j=3*c,k=3*(e-c)-j,l=1-j-k;return n(a,1/(200*f))}function cq(){return this.x+q+this.y+q+this.width+" × "+this.height}function cp(){return this.x+q+this.y}function cb(a,b,c,d,e,f){a!=null?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function bH(b,c,d){b=a._path2curve(b),c=a._path2curve(c);var e,f,g,h,i,j,k,l,m,n,o=d?0:[];for(var p=0,q=b.length;p<q;p++){var r=b[p];if(r[0]=="M")e=i=r[1],f=j=r[2];else{r[0]=="C"?(m=[e,f].concat(r.slice(1)),e=m[6],f=m[7]):(m=[e,f,e,f,i,j,i,j],e=i,f=j);for(var s=0,t=c.length;s<t;s++){var u=c[s];if(u[0]=="M")g=k=u[1],h=l=u[2];else{u[0]=="C"?(n=[g,h].concat(u.slice(1)),g=n[6],h=n[7]):(n=[g,h,g,h,k,l,k,l],g=k,h=l);var v=bG(m,n,d);if(d)o+=v;else{for(var w=0,x=v.length;w<x;w++)v[w].segment1=p,v[w].segment2=s,v[w].bez1=m,v[w].bez2=n;o=o.concat(v)}}}}}return o}function bG(b,c,d){var e=a.bezierBBox(b),f=a.bezierBBox(c);if(!a.isBBoxIntersect(e,f))return d?0:[];var g=bB.apply(0,b),h=bB.apply(0,c),i=~~(g/5),j=~~(h/5),k=[],l=[],m={},n=d?0:[];for(var o=0;o<i+1;o++){var p=a.findDotsAtSegment.apply(a,b.concat(o/i));k.push({x:p.x,y:p.y,t:o/i})}for(o=0;o<j+1;o++)p=a.findDotsAtSegment.apply(a,c.concat(o/j)),l.push({x:p.x,y:p.y,t:o/j});for(o=0;o<i;o++)for(var q=0;q<j;q++){var r=k[o],s=k[o+1],t=l[q],u=l[q+1],v=z(s.x-r.x)<.001?"y":"x",w=z(u.x-t.x)<.001?"y":"x",x=bD(r.x,r.y,s.x,s.y,t.x,t.y,u.x,u.y);if(x){if(m[x.x.toFixed(4)]==x.y.toFixed(4))continue;m[x.x.toFixed(4)]=x.y.toFixed(4);var y=r.t+z((x[v]-r[v])/(s[v]-r[v]))*(s.t-r.t),A=t.t+z((x[w]-t[w])/(u[w]-t[w]))*(u.t-t.t);y>=0&&y<=1&&A>=0&&A<=1&&(d?n++:n.push({x:x.x,y:x.y,t1:y,t2:A}))}}return n}function bF(a,b){return bG(a,b,1)}function bE(a,b){return bG(a,b)}function bD(a,b,c,d,e,f,g,h){if(!(x(a,c)<y(e,g)||y(a,c)>x(e,g)||x(b,d)<y(f,h)||y(b,d)>x(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(!k)return;var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(n<+y(a,c).toFixed(2)||n>+x(a,c).toFixed(2)||n<+y(e,g).toFixed(2)||n>+x(e,g).toFixed(2)||o<+y(b,d).toFixed(2)||o>+x(b,d).toFixed(2)||o<+y(f,h).toFixed(2)||o>+x(f,h).toFixed(2))return;return{x:l,y:m}}}function bC(a,b,c,d,e,f,g,h,i){if(!(i<0||bB(a,b,c,d,e,f,g,h)<i)){var j=1,k=j/2,l=j-k,m,n=.01;m=bB(a,b,c,d,e,f,g,h,l);while(z(m-i)>n)k/=2,l+=(m<i?1:-1)*k,m=bB(a,b,c,d,e,f,g,h,l);return l}}function bB(a,b,c,d,e,f,g,h,i){i==null&&(i=1),i=i>1?1:i<0?0:i;var j=i/2,k=12,l=[-0.1252,.1252,-0.3678,.3678,-0.5873,.5873,-0.7699,.7699,-0.9041,.9041,-0.9816,.9816],m=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],n=0;for(var o=0;o<k;o++){var p=j*l[o]+j,q=bA(p,a,c,e,g),r=bA(p,b,d,f,h),s=q*q+r*r;n+=m[o]*w.sqrt(s)}return j*n}function bA(a,b,c,d,e){var f=-3*b+9*c-9*d+3*e,g=a*f+6*b-12*c+6*d;return a*g-3*b+3*c}function by(a,b){var c=[];for(var d=0,e=a.length;e-2*!b>d;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push(["C",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])}return c}function bx(){return this.hex}function bv(a,b,c){function d(){var e=Array.prototype.slice.call(arguments,0),f=e.join("␀"),h=d.cache=d.cache||{},i=d.count=d.count||[];if(h[g](f)){bu(i,f);return c?c(h[f]):h[f]}i.length>=1e3&&delete h[i.shift()],i.push(f),h[f]=a[m](b,e);return c?c(h[f]):h[f]}return d}function bu(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return a.push(a.splice(c,1)[0])}function bm(a){if(Object(a)!==a)return a;var b=new a.constructor;for(var c in a)a[g](c)&&(b[c]=bm(a[c]));return b}function a(c){if(a.is(c,"function"))return b?c():eve.on("raphael.DOMload",c);if(a.is(c,E))return a._engine.create[m](a,c.splice(0,3+a.is(c[0],C))).add(c);var d=Array.prototype.slice.call(arguments,0);if(a.is(d[d.length-1],"function")){var e=d.pop();return b?e.call(a._engine.create[m](a,d)):eve.on("raphael.DOMload",function(){e.call(a._engine.create[m](a,d))})}return a._engine.create[m](a,arguments)}a.version="2.1.0",a.eve=eve;var b,c=/[, ]+/,d={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},e=/\{(\d+)\}/g,f="prototype",g="hasOwnProperty",h={doc:document,win:window},i={was:Object.prototype[g].call(h.win,"Raphael"),is:h.win.Raphael},j=function(){this.ca=this.customAttributes={}},k,l="appendChild",m="apply",n="concat",o="createTouch"in h.doc,p="",q=" ",r=String,s="split",t="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[s](q),u={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},v=r.prototype.toLowerCase,w=Math,x=w.max,y=w.min,z=w.abs,A=w.pow,B=w.PI,C="number",D="string",E="array",F="toString",G="fill",H=Object.prototype.toString,I={},J="push",K=a._ISURL=/^url\(['"]?([^\)]+?)['"]?\)$/i,L=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,M={NaN:1,Infinity:1,"-Infinity":1},N=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,O=w.round,P="setAttribute",Q=parseFloat,R=parseInt,S=r.prototype.toUpperCase,T=a._availableAttrs={"arrow-end":"none","arrow-start":"none",blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/","letter-spacing":0,opacity:1,path:"M0,0",r:0,rx:0,ry:0,src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",transform:"",width:0,x:0,y:0},U=a._availableAnimAttrs={blur:C,"clip-rect":"csv",cx:C,cy:C,fill:"colour","fill-opacity":C,"font-size":C,height:C,opacity:C,path:"path",r:C,rx:C,ry:C,stroke:"colour","stroke-opacity":C,"stroke-width":C,transform:"transform",width:C,x:C,y:C},V=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]/g,W=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/,X={hs:1,rg:1},Y=/,?([achlmqrstvxz]),?/gi,Z=/([achlmrqstvz])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/ig,$=/([rstm])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/ig,_=/(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/ig,ba=a._radial_gradient=/^r(?:\(([^,]+?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*([^\)]+?)\))?/,bb={},bc=function(a,b){return a.key-b.key},bd=function(a,b){return Q(a)-Q(b)},be=function(){},bf=function(a){return a},bg=a._rectPath=function(a,b,c,d,e){if(e)return[["M",a+e,b],["l",c-e*2,0],["a",e,e,0,0,1,e,e],["l",0,d-e*2],["a",e,e,0,0,1,-e,e],["l",e*2-c,0],["a",e,e,0,0,1,-e,-e],["l",0,e*2-d],["a",e,e,0,0,1,e,-e],["z"]];return[["M",a,b],["l",c,0],["l",0,d],["l",-c,0],["z"]]},bh=function(a,b,c,d){d==null&&(d=c);return[["M",a,b],["m",0,-d],["a",c,d,0,1,1,0,2*d],["a",c,d,0,1,1,0,-2*d],["z"]]},bi=a._getPath={path:function(a){return a.attr("path")},circle:function(a){var b=a.attrs;return bh(b.cx,b.cy,b.r)},ellipse:function(a){var b=a.attrs;return bh(b.cx,b.cy,b.rx,b.ry)},rect:function(a){var b=a.attrs;return bg(b.x,b.y,b.width,b.height,b.r)},image:function(a){var b=a.attrs;return bg(b.x,b.y,b.width,b.height)},text:function(a){var b=a._getBBox();return bg(b.x,b.y,b.width,b.height)}},bj=a.mapPath=function(a,b){if(!b)return a;var c,d,e,f,g,h,i;a=bR(a);for(e=0,g=a.length;e<g;e++){i=a[e];for(f=1,h=i.length;f<h;f+=2)c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d}return a};a._g=h,a.type=h.win.SVGAngle||h.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML";if(a.type=="VML"){var bk=h.doc.createElement("div"),bl;bk.innerHTML='<v:shape adj="1"/>',bl=bk.firstChild,bl.style.behavior="url(#default#VML)";if(!bl||typeof bl.adj!="object")return a.type=p;bk=null}a.svg=!(a.vml=a.type=="VML"),a._Paper=j,a.fn=k=j.prototype=a.prototype,a._id=0,a._oid=0,a.is=function(a,b){b=v.call(b);if(b=="finite")return!M[g](+a);if(b=="array")return a instanceof Array;return b=="null"&&a===null||b==typeof a&&a!==null||b=="object"&&a===Object(a)||b=="array"&&Array.isArray&&Array.isArray(a)||H.call(a).slice(8,-1).toLowerCase()==b},a.angle=function(b,c,d,e,f,g){if(f==null){var h=b-d,i=c-e;if(!h&&!i)return 0;return(180+w.atan2(-i,-h)*180/B+360)%360}return a.angle(b,c,f,g)-a.angle(d,e,f,g)},a.rad=function(a){return a%360*B/180},a.deg=function(a){return a*180/B%360},a.snapTo=function(b,c,d){d=a.is(d,"finite")?d:10;if(a.is(b,E)){var e=b.length;while(e--)if(z(b[e]-c)<=d)return b[e]}else{b=+b;var f=c%b;if(f<d)return c-f;if(f>b-d)return c-f+b}return c};var bn=a.createUUID=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=w.random()*16|0,c=a=="x"?b:b&3|8;return c.toString(16)});a.setWindow=function(b){eve("raphael.setWindow",a,h.win,b),h.win=b,h.doc=h.win.document,a._engine.initWin&&a._engine.initWin(h.win)};var bo=function(b){if(a.vml){var c=/^\s+|\s+$/g,d;try{var e=new ActiveXObject("htmlfile");e.write("<body>"),e.close(),d=e.body}catch(f){d=createPopup().document.body}var g=d.createTextRange();bo=bv(function(a){try{d.style.color=r(a).replace(c,p);var b=g.queryCommandValue("ForeColor");b=(b&255)<<16|b&65280|(b&16711680)>>>16;return"#"+("000000"+b.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=h.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",h.doc.body.appendChild(i),bo=bv(function(a){i.style.color=a;return h.doc.defaultView.getComputedStyle(i,p).getPropertyValue("color")})}return bo(b)},bp=function(){return"hsb("+[this.h,this.s,this.b]+")"},bq=function(){return"hsl("+[this.h,this.s,this.l]+")"},br=function(){return this.hex},bs=function(b,c,d){c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b&&(d=b.b,c=b.g,b=b.r);if(c==null&&a.is(b,D)){var e=a.getRGB(b);b=e.r,c=e.g,d=e.b}if(b>1||c>1||d>1)b/=255,c/=255,d/=255;return[b,c,d]},bt=function(b,c,d,e){b*=255,c*=255,d*=255;var f={r:b,g:c,b:d,hex:a.rgb(b,c,d),toString:br};a.is(e,"finite")&&(f.opacity=e);return f};a.color=function(b){var c;a.is(b,"object")&&"h"in b&&"s"in b&&"b"in b?(c=a.hsb2rgb(b),b.r=c.r,b.g=c.g,b.b=c.b,b.hex=c.hex):a.is(b,"object")&&"h"in b&&"s"in b&&"l"in b?(c=a.hsl2rgb(b),b.r=c.r,b.g=c.g,b.b=c.b,b.hex=c.hex):(a.is(b,"string")&&(b=a.getRGB(b)),a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b?(c=a.rgb2hsl(b),b.h=c.h,b.s=c.s,b.l=c.l,c=a.rgb2hsb(b),b.v=c.b):(b={hex:"none"},b.r=b.g=b.b=b.h=b.s=b.v=b.l=-1)),b.toString=br;return b},a.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,a=a.h,d=a.o),a*=360;var e,f,g,h,i;a=a%360/60,i=c*b,h=i*(1-z(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bt(e,f,g,d)},a.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h);if(a>1||b>1||c>1)a/=360,b/=100,c/=100;a*=360;var e,f,g,h,i;a=a%360/60,i=2*b*(c<.5?c:1-c),h=i*(1-z(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bt(e,f,g,d)},a.rgb2hsb=function(a,b,c){c=bs(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;f=x(a,b,c),g=f-y(a,b,c),d=g==0?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=g==0?0:g/f;return{h:d,s:e,b:f,toString:bp}},a.rgb2hsl=function(a,b,c){c=bs(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;g=x(a,b,c),h=y(a,b,c),i=g-h,d=i==0?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=i==0?0:f<.5?i/(2*f):i/(2-2*f);return{h:d,s:e,l:f,toString:bq}},a._path2string=function(){return this.join(",").replace(Y,"$1")};var bw=a._preload=function(a,b){var c=h.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top:-9999em",c.onload=function(){b.call(this),this.onload=null,h.doc.body.removeChild(this)},c.onerror=function(){h.doc.body.removeChild(this)},h.doc.body.appendChild(c),c.src=a};a.getRGB=bv(function(b){if(!b||!!((b=r(b)).indexOf("-")+1))return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:bx};if(b=="none")return{r:-1,g:-1,b:-1,hex:"none",toString:bx};!X[g](b.toLowerCase().substring(0,2))&&b.charAt()!="#"&&(b=bo(b));var c,d,e,f,h,i,j,k=b.match(L);if(k){k[2]&&(f=R(k[2].substring(5),16),e=R(k[2].substring(3,5),16),d=R(k[2].substring(1,3),16)),k[3]&&(f=R((i=k[3].charAt(3))+i,16),e=R((i=k[3].charAt(2))+i,16),d=R((i=k[3].charAt(1))+i,16)),k[4]&&(j=k[4][s](W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),k[1].toLowerCase().slice(0,4)=="rgba"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100));if(k[5]){j=k[5][s](W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsba"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsb2rgb(d,e,f,h)}if(k[6]){j=k[6][s](W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsla"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsl2rgb(d,e,f,h)}k={r:d,g:e,b:f,toString:bx},k.hex="#"+(16777216|f|e<<8|d<<16).toString(16).slice(1),a.is(h,"finite")&&(k.opacity=h);return k}return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:bx}},a),a.hsb=bv(function(b,c,d){return a.hsb2rgb(b,c,d).hex}),a.hsl=bv(function(b,c,d){return a.hsl2rgb(b,c,d).hex}),a.rgb=bv(function(a,b,c){return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),a.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b}));return c.hex},a.getColor.reset=function(){delete this.start},a.parsePathString=function(b){if(!b)return null;var c=bz(b);if(c.arr)return bJ(c.arr);var d={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},e=[];a.is(b,E)&&a.is(b[0],E)&&(e=bJ(b)),e.length||r(b).replace(Z,function(a,b,c){var f=[],g=b.toLowerCase();c.replace(_,function(a,b){b&&f.push(+b)}),g=="m"&&f.length>2&&(e.push([b][n](f.splice(0,2))),g="l",b=b=="m"?"l":"L");if(g=="r")e.push([b][n](f));else while(f.length>=d[g]){e.push([b][n](f.splice(0,d[g])));if(!d[g])break}}),e.toString=a._path2string,c.arr=bJ(e);return e},a.parseTransformString=bv(function(b){if(!b)return null;var c={r:3,s:4,t:2,m:6},d=[];a.is(b,E)&&a.is(b[0],E)&&(d=bJ(b)),d.length||r(b).replace($,function(a,b,c){var e=[],f=v.call(b);c.replace(_,function(a,b){b&&e.push(+b)}),d.push([b][n](e))}),d.toString=a._path2string;return d});var bz=function(a){var b=bz.ps=bz.ps||{};b[a]?b[a].sleep=100:b[a]={sleep:100},setTimeout(function(){for(var c in b)b[g](c)&&c!=a&&(b[c].sleep--,!b[c].sleep&&delete b[c])});return b[a]};a.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=A(j,3),l=A(j,2),m=i*i,n=m*i,o=k*a+l*3*i*c+j*3*i*i*e+n*g,p=k*b+l*3*i*d+j*3*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,x=j*e+i*g,y=j*f+i*h,z=90-w.atan2(q-s,r-t)*180/B;(q>s||r<t)&&(z+=180);return{x:o,y:p,m:{x:q,y:r},n:{x:s,y:t},start:{x:u,y:v},end:{x:x,y:y},alpha:z}},a.bezierBBox=function(b,c,d,e,f,g,h,i){a.is(b,"array")||(b=[b,c,d,e,f,g,h,i]);var j=bQ.apply(null,b);return{x:j.min.x,y:j.min.y,x2:j.max.x,y2:j.max.y,width:j.max.x-j.min.x,height:j.max.y-j.min.y}},a.isPointInsideBBox=function(a,b,c){return b>=a.x&&b<=a.x2&&c>=a.y&&c<=a.y2},a.isBBoxIntersect=function(b,c){var d=a.isPointInsideBBox;return d(c,b.x,b.y)||d(c,b.x2,b.y)||d(c,b.x,b.y2)||d(c,b.x2,b.y2)||d(b,c.x,c.y)||d(b,c.x2,c.y)||d(b,c.x,c.y2)||d(b,c.x2,c.y2)||(b.x<c.x2&&b.x>c.x||c.x<b.x2&&c.x>b.x)&&(b.y<c.y2&&b.y>c.y||c.y<b.y2&&c.y>b.y)},a.pathIntersection=function(a,b){return bH(a,b)},a.pathIntersectionNumber=function(a,b){return bH(a,b,1)},a.isPointInsidePath=function(b,c,d){var e=a.pathBBox(b);return a.isPointInsideBBox(e,c,d)&&bH(b,[["M",c,d],["H",e.x2+10]],1)%2==1},a._removedFactory=function(a){return function(){eve("raphael.log",null,"Raphaël: you are calling to method “"+a+"” of removed object",a)}};var bI=a.pathBBox=function(a){var b=bz(a);if(b.bbox)return b.bbox;if(!a)return{x:0,y:0,width:0,height:0,x2:0,y2:0};a=bR(a);var c=0,d=0,e=[],f=[],g;for(var h=0,i=a.length;h<i;h++){g=a[h];if(g[0]=="M")c=g[1],d=g[2],e.push(c),f.push(d);else{var j=bQ(c,d,g[1],g[2],g[3],g[4],g[5],g[6]);e=e[n](j.min.x,j.max.x),f=f[n](j.min.y,j.max.y),c=g[5],d=g[6]}}var k=y[m](0,e),l=y[m](0,f),o=x[m](0,e),p=x[m](0,f),q={x:k,y:l,x2:o,y2:p,width:o-k,height:p-l};b.bbox=bm(q);return q},bJ=function(b){var c=bm(b);c.toString=a._path2string;return c},bK=a._pathToRelative=function(b){var c=bz(b);if(c.rel)return bJ(c.rel);if(!a.is(b,E)||!a.is(b&&b[0],E))b=a.parsePathString(b);var d=[],e=0,f=0,g=0,h=0,i=0;b[0][0]=="M"&&(e=b[0][1],f=b[0][2],g=e,h=f,i++,d.push(["M",e,f]));for(var j=i,k=b.length;j<k;j++){var l=d[j]=[],m=b[j];if(m[0]!=v.call(m[0])){l[0]=v.call(m[0]);switch(l[0]){case"a":l[1]=m[1],l[2]=m[2],l[3]=m[3],l[4]=m[4],l[5]=m[5],l[6]=+(m[6]-e).toFixed(3),l[7]=+(m[7]-f).toFixed(3);break;case"v":l[1]=+(m[1]-f).toFixed(3);break;case"m":g=m[1],h=m[2];default:for(var n=1,o=m.length;n<o;n++)l[n]=+(m[n]-(n%2?e:f)).toFixed(3)}}else{l=d[j]=[],m[0]=="m"&&(g=m[1]+e,h=m[2]+f);for(var p=0,q=m.length;p<q;p++)d[j][p]=m[p]}var r=d[j].length;switch(d[j][0]){case"z":e=g,f=h;break;case"h":e+=+d[j][r-1];break;case"v":f+=+d[j][r-1];break;default:e+=+d[j][r-2],f+=+d[j][r-1]}}d.toString=a._path2string,c.rel=bJ(d);return d},bL=a._pathToAbsolute=function(b){var c=bz(b);if(c.abs)return bJ(c.abs);if(!a.is(b,E)||!a.is(b&&b[0],E))b=a.parsePathString(b);if(!b||!b.length)return[["M",0,0]];var d=[],e=0,f=0,g=0,h=0,i=0;b[0][0]=="M"&&(e=+b[0][1],f=+b[0][2],g=e,h=f,i++,d[0]=["M",e,f]);var j=b.length==3&&b[0][0]=="M"&&b[1][0].toUpperCase()=="R"&&b[2][0].toUpperCase()=="Z";for(var k,l,m=i,o=b.length;m<o;m++){d.push(k=[]),l=b[m];if(l[0]!=S.call(l[0])){k[0]=S.call(l[0]);switch(k[0]){case"A":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]+e),k[7]=+(l[7]+f);break;case"V":k[1]=+l[1]+f;break;case"H":k[1]=+l[1]+e;break;case"R":var p=[e,f][n](l.slice(1));for(var q=2,r=p.length;q<r;q++)p[q]=+p[q]+e,p[++q]=+p[q]+f;d.pop(),d=d[n](by(p,j));break;case"M":g=+l[1]+e,h=+l[2]+f;default:for(q=1,r=l.length;q<r;q++)k[q]=+l[q]+(q%2?e:f)}}else if(l[0]=="R")p=[e,f][n](l.slice(1)),d.pop(),d=d[n](by(p,j)),k=["R"][n](l.slice(-2));else for(var s=0,t=l.length;s<t;s++)k[s]=l[s];switch(k[0]){case"Z":e=g,f=h;break;case"H":e=k[1];break;case"V":f=k[1];break;case"M":g=k[k.length-2],h=k[k.length-1];default:e=k[k.length-2],f=k[k.length-1]}}d.toString=a._path2string,c.abs=bJ(d);return d},bM=function(a,b,c,d){return[a,b,c,d,c,d]},bN=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},bO=function(a,b,c,d,e,f,g,h,i,j){var k=B*120/180,l=B/180*(+e||0),m=[],o,p=bv(function(a,b,c){var d=a*w.cos(c)-b*w.sin(c),e=a*w.sin(c)+b*w.cos(c);return{x:d,y:e}});if(!j){o=p(a,b,-l),a=o.x,b=o.y,o=p(h,i,-l),h=o.x,i=o.y;var q=w.cos(B/180*e),r=w.sin(B/180*e),t=(a-h)/2,u=(b-i)/2,v=t*t/(c*c)+u*u/(d*d);v>1&&(v=w.sqrt(v),c=v*c,d=v*d);var x=c*c,y=d*d,A=(f==g?-1:1)*w.sqrt(z((x*y-x*u*u-y*t*t)/(x*u*u+y*t*t))),C=A*c*u/d+(a+h)/2,D=A*-d*t/c+(b+i)/2,E=w.asin(((b-D)/d).toFixed(9)),F=w.asin(((i-D)/d).toFixed(9));E=a<C?B-E:E,F=h<C?B-F:F,E<0&&(E=B*2+E),F<0&&(F=B*2+F),g&&E>F&&(E=E-B*2),!g&&F>E&&(F=F-B*2)}else E=j[0],F=j[1],C=j[2],D=j[3];var G=F-E;if(z(G)>k){var H=F,I=h,J=i;F=E+k*(g&&F>E?1:-1),h=C+c*w.cos(F),i=D+d*w.sin(F),m=bO(h,i,c,d,e,0,g,I,J,[F,H,C,D])}G=F-E;var K=w.cos(E),L=w.sin(E),M=w.cos(F),N=w.sin(F),O=w.tan(G/4),P=4/3*c*O,Q=4/3*d*O,R=[a,b],S=[a+P*L,b-Q*K],T=[h+P*N,i-Q*M],U=[h,i];S[0]=2*R[0]-S[0],S[1]=2*R[1]-S[1];if(j)return[S,T,U][n](m);m=[S,T,U][n](m).join()[s](",");var V=[];for(var W=0,X=m.length;W<X;W++)V[W]=W%2?p(m[W-1],m[W],l).y:p(m[W],m[W+1],l).x;return V},bP=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:A(j,3)*a+A(j,2)*3*i*c+j*3*i*i*e+A(i,3)*g,y:A(j,3)*b+A(j,2)*3*i*d+j*3*i*i*f+A(i,3)*h}},bQ=bv(function(a,b,c,d,e,f,g,h){var i=e-2*c+a-(g-2*e+c),j=2*(c-a)-2*(e-c),k=a-c,l=(-j+w.sqrt(j*j-4*i*k))/2/i,n=(-j-w.sqrt(j*j-4*i*k))/2/i,o=[b,h],p=[a,g],q;z(l)>"1e12"&&(l=.5),z(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bP(a,b,c,d,e,f,g,h,l),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bP(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y)),i=f-2*d+b-(h-2*f+d),j=2*(d-b)-2*(f-d),k=b-d,l=(-j+w.sqrt(j*j-4*i*k))/2/i,n=(-j-w.sqrt(j*j-4*i*k))/2/i,z(l)>"1e12"&&(l=.5),z(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bP(a,b,c,d,e,f,g,h,l),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bP(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y));return{min:{x:y[m](0,p),y:y[m](0,o)},max:{x:x[m](0,p),y:x[m](0,o)}}}),bR=a._path2curve=bv(function(a,b){var c=!b&&bz(a);if(!b&&c.curve)return bJ(c.curve);var d=bL(a),e=b&&bL(b),f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},h=function(a,b){var c,d;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null);switch(a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][n](bO[m](0,[b.x,b.y][n](a.slice(1))));break;case"S":c=b.x+(b.x-(b.bx||b.x)),d=b.y+(b.y-(b.by||b.y)),a=["C",c,d][n](a.slice(1));break;case"T":b.qx=b.x+(b.x-(b.qx||b.x)),b.qy=b.y+(b.y-(b.qy||b.y)),a=["C"][n](bN(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][n](bN(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][n](bM(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][n](bM(b.x,b.y,a[1],b.y));break;case"V":a=["C"][n](bM(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][n](bM(b.x,b.y,b.X,b.Y))}return a},i=function(a,b){if(a[b].length>7){a[b].shift();var c=a[b];while(c.length)a.splice(b++,0,["C"][n](c.splice(0,6)));a.splice(b,1),l=x(d.length,e&&e.length||0)}},j=function(a,b,c,f,g){a&&b&&a[g][0]=="M"&&b[g][0]!="M"&&(b.splice(g,0,["M",f.x,f.y]),c.bx=0,c.by=0,c.x=a[g][1],c.y=a[g][2],l=x(d.length,e&&e.length||0))};for(var k=0,l=x(d.length,e&&e.length||0);k<l;k++){d[k]=h(d[k],f),i(d,k),e&&(e[k]=h(e[k],g)),e&&i(e,k),j(d,e,f,g,k),j(e,d,g,f,k);var o=d[k],p=e&&e[k],q=o.length,r=e&&p.length;f.x=o[q-2],f.y=o[q-1],f.bx=Q(o[q-4])||f.x,f.by=Q(o[q-3])||f.y,g.bx=e&&(Q(p[r-4])||g.x),g.by=e&&(Q(p[r-3])||g.y),g.x=e&&p[r-2],g.y=e&&p[r-1]}e||(c.curve=bJ(d));return e?[d,e]:d},null,bJ),bS=a._parseDots=bv(function(b){var c=[];for(var d=0,e=b.length;d<e;d++){var f={},g=b[d].match(/^([^:]*):?([\d\.]*)/);f.color=a.getRGB(g[1]);if(f.color.error)return null;f.color=f.color.hex,g[2]&&(f.offset=g[2]+"%"),c.push(f)}for(d=1,e=c.length-1;d<e;d++)if(!c[d].offset){var h=Q(c[d-1].offset||0),i=0;for(var j=d+1;j<e;j++)if(c[j].offset){i=c[j].offset;break}i||(i=100,j=e),i=Q(i);var k=(i-h)/(j-d+1);for(;d<j;d++)h+=k,c[d].offset=h+"%"}return c}),bT=a._tear=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)},bU=a._tofront=function(a,b){b.top!==a&&(bT(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},bV=a._toback=function(a,b){b.bottom!==a&&(bT(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},bW=a._insertafter=function(a,b,c){bT(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},bX=a._insertbefore=function(a,b,c){bT(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},bY=a.toMatrix=function(a,b){var c=bI(a),d={_:{transform:p},getBBox:function(){return c}};b$(d,b);return d.matrix},bZ=a.transformPath=function(a,b){return bj(a,bY(a,b))},b$=a._extractTransform=function(b,c){if(c==null)return b._.transform;c=r(c).replace(/\.{3}|\u2026/g,b._.transform||p);var d=a.parseTransformString(c),e=0,f=0,g=0,h=1,i=1,j=b._,k=new cb;j.transform=d||[];if(d)for(var l=0,m=d.length;l<m;l++){var n=d[l],o=n.length,q=r(n[0]).toLowerCase(),s=n[0]!=q,t=s?k.invert():0,u,v,w,x,y;q=="t"&&o==3?s?(u=t.x(0,0),v=t.y(0,0),w=t.x(n[1],n[2]),x=t.y(n[1],n[2]),k.translate(w-u,x-v)):k.translate(n[1],n[2]):q=="r"?o==2?(y=y||b.getBBox(1),k.rotate(n[1],y.x+y.width/2,y.y+y.height/2),e+=n[1]):o==4&&(s?(w=t.x(n[2],n[3]),x=t.y(n[2],n[3]),k.rotate(n[1],w,x)):k.rotate(n[1],n[2],n[3]),e+=n[1]):q=="s"?o==2||o==3?(y=y||b.getBBox(1),k.scale(n[1],n[o-1],y.x+y.width/2,y.y+y.height/2),h*=n[1],i*=n[o-1]):o==5&&(s?(w=t.x(n[3],n[4]),x=t.y(n[3],n[4]),k.scale(n[1],n[2],w,x)):k.scale(n[1],n[2],n[3],n[4]),h*=n[1],i*=n[2]):q=="m"&&o==7&&k.add(n[1],n[2],n[3],n[4],n[5],n[6]),j.dirtyT=1,b.matrix=k}b.matrix=k,j.sx=h,j.sy=i,j.deg=e,j.dx=f=k.e,j.dy=g=k.f,h==1&&i==1&&!e&&j.bbox?(j.bbox.x+=+f,j.bbox.y+=+g):j.dirtyT=1},b_=function(a){var b=a[0];switch(b.toLowerCase()){case"t":return[b,0,0];case"m":return[b,1,0,0,1,0,0];case"r":return a.length==4?[b,0,a[2],a[3]]:[b,0];case"s":return a.length==5?[b,1,1,a[3],a[4]]:a.length==3?[b,1,1]:[b,1]}},ca=a._equaliseTransform=function(b,c){c=r(c).replace(/\.{3}|\u2026/g,b),b=a.parseTransformString(b)||[],c=a.parseTransformString(c)||[];var d=x(b.length,c.length),e=[],f=[],g=0,h,i,j,k;for(;g<d;g++){j=b[g]||b_(c[g]),k=c[g]||b_(j);if(j[0]!=k[0]||j[0].toLowerCase()=="r"&&(j[2]!=k[2]||j[3]!=k[3])||j[0].toLowerCase()=="s"&&(j[3]!=k[3]||j[4]!=k[4]))return;e[g]=[],f[g]=[];for(h=0,i=x(j.length,k.length);h<i;h++)h in j&&(e[g][h]=j[h]),h in k&&(f[g][h]=k[h])}return{from:e,to:f}};a._getContainer=function(b,c,d,e){var f;f=e==null&&!a.is(b,"object")?h.doc.getElementById(b):b;if(f!=null){if(f.tagName)return c==null?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:c,height:d};return{container:1,x:b,y:c,width:d,height:e}}},a.pathToRelative=bK,a._engine={},a.path2curve=bR,a.matrix=function(a,b,c,d,e,f){return new cb(a,b,c,d,e,f)},function(b){function d(a){var b=w.sqrt(c(a));a[0]&&(a[0]/=b),a[1]&&(a[1]/=b)}function c(a){return a[0]*a[0]+a[1]*a[1]}b.add=function(a,b,c,d,e,f){var g=[[],[],[]],h=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],i=[[a,c,e],[b,d,f],[0,0,1]],j,k,l,m;a&&a instanceof cb&&(i=[[a.a,a.c,a.e],[a.b,a.d,a.f],[0,0,1]]);for(j=0;j<3;j++)for(k=0;k<3;k++){m=0;for(l=0;l<3;l++)m+=h[j][l]*i[l][k];g[j][k]=m}this.a=g[0][0],this.b=g[1][0],this.c=g[0][1],this.d=g[1][1],this.e=g[0][2],this.f=g[1][2]},b.invert=function(){var a=this,b=a.a*a.d-a.b*a.c;return new cb(a.d/b,-a.b/b,-a.c/b,a.a/b,(a.c*a.f-a.d*a.e)/b,(a.b*a.e-a.a*a.f)/b)},b.clone=function(){return new cb(this.a,this.b,this.c,this.d,this.e,this.f)},b.translate=function(a,b){this.add(1,0,0,1,a,b)},b.scale=function(a,b,c,d){b==null&&(b=a),(c||d)&&this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),(c||d)&&this.add(1,0,0,1,-c,-d)},b.rotate=function(b,c,d){b=a.rad(b),c=c||0,d=d||0;var e=+w.cos(b).toFixed(9),f=+w.sin(b).toFixed(9);this.add(e,f,-f,e,c,d),this.add(1,0,0,1,-c,-d)},b.x=function(a,b){return a*this.a+b*this.c+this.e},b.y=function(a,b){return a*this.b+b*this.d+this.f},b.get=function(a){return+this[r.fromCharCode(97+a)].toFixed(4)},b.toString=function(){return a.svg?"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},b.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0)+", M12="+this.get(2)+", M21="+this.get(1)+", M22="+this.get(3)+", Dx="+this.get(4)+", Dy="+this.get(5)+", sizingmethod='auto expand')"},b.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},b.split=function(){var b={};b.dx=this.e,b.dy=this.f;var e=[[this.a,this.c],[this.b,this.d]];b.scalex=w.sqrt(c(e[0])),d(e[0]),b.shear=e[0][0]*e[1][0]+e[0][1]*e[1][1],e[1]=[e[1][0]-e[0][0]*b.shear,e[1][1]-e[0][1]*b.shear],b.scaley=w.sqrt(c(e[1])),d(e[1]),b.shear/=b.scaley;var f=-e[0][1],g=e[1][1];g<0?(b.rotate=a.deg(w.acos(g)),f<0&&(b.rotate=360-b.rotate)):b.rotate=a.deg(w.asin(f)),b.isSimple=!+b.shear.toFixed(9)&&(b.scalex.toFixed(9)==b.scaley.toFixed(9)||!b.rotate),b.isSuperSimple=!+b.shear.toFixed(9)&&b.scalex.toFixed(9)==b.scaley.toFixed(9)&&!b.rotate,b.noRotation=!+b.shear.toFixed(9)&&!b.rotate;return b},b.toTransformString=function(a){var b=a||this[s]();if(b.isSimple){b.scalex=+b.scalex.toFixed(4),b.scaley=+b.scaley.toFixed(4),b.rotate=+b.rotate.toFixed(4);return(b.dx||b.dy?"t"+[b.dx,b.dy]:p)+(b.scalex!=1||b.scaley!=1?"s"+[b.scalex,b.scaley,0,0]:p)+(b.rotate?"r"+[b.rotate,0,0]:p)}return"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(cb.prototype);var cc=navigator.userAgent.match(/Version\/(.*?)\s/)||navigator.userAgent.match(/Chrome\/(\d+)/);navigator.vendor=="Apple Computer, Inc."&&(cc&&cc[1]<4||navigator.platform.slice(0,2)=="iP")||navigator.vendor=="Google Inc."&&cc&&cc[1]<8?k.safari=function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});setTimeout(function(){a.remove()})}:k.safari=be;var cd=function(){this.returnValue=!1},ce=function(){return this.originalEvent.preventDefault()},cf=function(){this.cancelBubble=!0},cg=function(){return this.originalEvent.stopPropagation()},ch=function(){if(h.doc.addEventListener)return function(a,b,c,d){var e=o&&u[b]?u[b]:b,f=function(e){var f=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,i=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft,j=e.clientX+i,k=e.clientY+f;if(o&&u[g](b))for(var l=0,m=e.targetTouches&&e.targetTouches.length;l<m;l++)if(e.targetTouches[l].target==a){var n=e;e=e.targetTouches[l],e.originalEvent=n,e.preventDefault=ce,e.stopPropagation=cg;break}return c.call(d,e,j,k)};a.addEventListener(e,f,!1);return function(){a.removeEventListener(e,f,!1);return!0}};if(h.doc.attachEvent)return function(a,b,c,d){var e=function(a){a=a||h.win.event;var b=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,e=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft,f=a.clientX+e,g=a.clientY+b;a.preventDefault=a.preventDefault||cd,a.stopPropagation=a.stopPropagation||cf;return c.call(d,a,f,g)};a.attachEvent("on"+b,e);var f=function(){a.detachEvent("on"+b,e);return!0};return f}}(),ci=[],cj=function(a){var b=a.clientX,c=a.clientY,d=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,e=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft,f,g=ci.length;while(g--){f=ci[g];if(o){var i=a.touches.length,j;while(i--){j=a.touches[i];if(j.identifier==f.el._drag.id){b=j.clientX,c=j.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}}else a.preventDefault();var k=f.el.node,l,m=k.nextSibling,n=k.parentNode,p=k.style.display;h.win.opera&&n.removeChild(k),k.style.display="none",l=f.el.paper.getElementByPoint(b,c),k.style.display=p,h.win.opera&&(m?n.insertBefore(k,m):n.appendChild(k)),l&&eve("raphael.drag.over."+f.el.id,f.el,l),b+=e,c+=d,eve("raphael.drag.move."+f.el.id,f.move_scope||f.el,b-f.el._drag.x,c-f.el._drag.y,b,c,a)}},ck=function(b){a.unmousemove(cj).unmouseup(ck);var c=ci.length,d;while(c--)d=ci[c],d.el._drag={},eve("raphael.drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,b);ci=[]},cl=a.el={};for(var cm=t.length;cm--;)(function(b){a[b]=cl[b]=function(c,d){a.is(c,"function")&&(this.events=this.events||[],this.events.push({name:b,f:c,unbind:ch(this.shape||this.node||h.doc,b,c,d||this)}));return this},a["un"+b]=cl["un"+b]=function(a){var c=this.events||[],d=c.length;while(d--)if(c[d].name==b&&c[d].f==a){c[d].unbind(),c.splice(d,1),!c.length&&delete this.events;return this}return this}})(t[cm]);cl.data=function(b,c){var d=bb[this.id]=bb[this.id]||{};if(arguments.length==1){if(a.is(b,"object")){for(var e in b)b[g](e)&&this.data(e,b[e]);return this}eve("raphael.data.get."+this.id,this,d[b],b);return d[b]}d[b]=c,eve("raphael.data.set."+this.id,this,c,b);return this},cl.removeData=function(a){a==null?bb[this.id]={}:bb[this.id]&&delete bb[this.id][a];return this},cl.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},cl.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var cn=[];cl.drag=function(b,c,d,e,f,g){function i(i){(i.originalEvent||i).preventDefault();var j=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,k=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft;this._drag.x=i.clientX+k,this._drag.y=i.clientY+j,this._drag.id=i.identifier,!ci.length&&a.mousemove(cj).mouseup(ck),ci.push({el:this,move_scope:e,start_scope:f,end_scope:g}),c&&eve.on("raphael.drag.start."+this.id,c),b&&eve.on("raphael.drag.move."+this.id,b),d&&eve.on("raphael.drag.end."+this.id,d),eve("raphael.drag.start."+this.id,f||e||this,i.clientX+k,i.clientY+j,i)}this._drag={},cn.push({el:this,start:i}),this.mousedown(i);return this},cl.onDragOver=function(a){a?eve.on("raphael.drag.over."+this.id,a):eve.unbind("raphael.drag.over."+this.id)},cl.undrag=function(){var b=cn.length;while(b--)cn[b].el==this&&(this.unmousedown(cn[b].start),cn.splice(b,1),eve.unbind("raphael.drag.*."+this.id));!cn.length&&a.unmousemove(cj).unmouseup(ck)},k.circle=function(b,c,d){var e=a._engine.circle(this,b||0,c||0,d||0);this.__set__&&this.__set__.push(e);return e},k.rect=function(b,c,d,e,f){var g=a._engine.rect(this,b||0,c||0,d||0,e||0,f||0);this.__set__&&this.__set__.push(g);return g},k.ellipse=function(b,c,d,e){var f=a._engine.ellipse(this,b||0,c||0,d||0,e||0);this.__set__&&this.__set__.push(f);return f},k.path=function(b){b&&!a.is(b,D)&&!a.is(b[0],E)&&(b+=p);var c=a._engine.path(a.format[m](a,arguments),this);this.__set__&&this.__set__.push(c);return c},k.image=function(b,c,d,e,f){var g=a._engine.image(this,b||"about:blank",c||0,d||0,e||0,f||0);this.__set__&&this.__set__.push(g);return g},k.text=function(b,c,d){var e=a._engine.text(this,b||0,c||0,r(d));this.__set__&&this.__set__.push(e);return e},k.set=function(b){!a.is(b,"array")&&(b=Array.prototype.splice.call(arguments,0,arguments.length));var c=new cG(b);this.__set__&&this.__set__.push(c);return c},k.setStart=function(a){this.__set__=a||this.set()},k.setFinish=function(a){var b=this.__set__;delete this.__set__;return b},k.setSize=function(b,c){return a._engine.setSize.call(this,b,c)},k.setViewBox=function(b,c,d,e,f){return a._engine.setViewBox.call(this,b,c,d,e,f)},k.top=k.bottom=null,k.raphael=a;var co=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,g=e.clientLeft||d.clientLeft||0,i=b.top+(h.win.pageYOffset||e.scrollTop||d.scrollTop)-f,j=b.left+(h.win.pageXOffset||e.scrollLeft||d.scrollLeft)-g;return{y:i,x:j}};k.getElementByPoint=function(a,b){var c=this,d=c.canvas,e=h.doc.elementFromPoint(a,b);if(h.win.opera&&e.tagName=="svg"){var f=co(d),g=d.createSVGRect();g.x=a-f.x,g.y=b-f.y,g.width=g.height=1;var i=d.getIntersectionList(g,null);i.length&&(e=i[i.length-1])}if(!e)return null;while(e.parentNode&&e!=d.parentNode&&!e.raphael)e=e.parentNode;e==c.canvas.parentNode&&(e=d),e=e&&e.raphael?c.getById(e.raphaelid):null;return e},k.getById=function(a){var b=this.bottom;while(b){if(b.id==a)return b;b=b.next}return null},k.forEach=function(a,b){var c=this.bottom;while(c){if(a.call(b,c)===!1)return this;c=c.next}return this},k.getElementsByPoint=function(a,b){var c=this.set();this.forEach(function(d){d.isPointInside(a,b)&&c.push(d)});return c},cl.isPointInside=function(b,c){var d=this.realPath=this.realPath||bi[this.type](this);return a.isPointInsidePath(d,b,c)},cl.getBBox=function(a){if(this.removed)return{};var b=this._;if(a){if(b.dirty||!b.bboxwt)this.realPath=bi[this.type](this),b.bboxwt=bI(this.realPath),b.bboxwt.toString=cq,b.dirty=0;return b.bboxwt}if(b.dirty||b.dirtyT||!b.bbox){if(b.dirty||!this.realPath)b.bboxwt=0,this.realPath=bi[this.type](this);b.bbox=bI(bj(this.realPath,this.matrix)),b.bbox.toString=cq,b.dirty=b.dirtyT=0}return b.bbox},cl.clone=function(){if(this.removed)return null;var a=this.paper[this.type]().attr(this.attr());this.__set__&&this.__set__.push(a);return a},cl.glow=function(a){if(this.type=="text")return null;a=a||{};var b={width:(a.width||10)+(+this.attr("stroke-width")||1),fill:a.fill||!1,opacity:a.opacity||.5,offsetx:a.offsetx||0,offsety:a.offsety||0,color:a.color||"#000"},c=b.width/2,d=this.paper,e=d.set(),f=this.realPath||bi[this.type](this);f=this.matrix?bj(f,this.matrix):f;for(var g=1;g<c+1;g++)e.push(d.path(f).attr({stroke:b.color,fill:b.fill?b.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(b.width/c*g).toFixed(3),opacity:+(b.opacity/c).toFixed(3)}));return e.insertBefore(this).translate(b.offsetx,b.offsety)};var cr={},cs=function(b,c,d,e,f,g,h,i,j){return j==null?bB(b,c,d,e,f,g,h,i):a.findDotsAtSegment(b,c,d,e,f,g,h,i,bC(b,c,d,e,f,g,h,i,j))},ct=function(b,c){return function(d,e,f){d=bR(d);var g,h,i,j,k="",l={},m,n=0;for(var o=0,p=d.length;o<p;o++){i=d[o];if(i[0]=="M")g=+i[1],h=+i[2];else{j=cs(g,h,i[1],i[2],i[3],i[4],i[5],i[6]);if(n+j>e){if(c&&!l.start){m=cs(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),k+=["C"+m.start.x,m.start.y,m.m.x,m.m.y,m.x,m.y];if(f)return k;l.start=k,k=["M"+m.x,m.y+"C"+m.n.x,m.n.y,m.end.x,m.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!b&&!c){m=cs(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);return{x:m.x,y:m.y,alpha:m.alpha}}}n+=j,g=+i[5],h=+i[6]}k+=i.shift()+i}l.end=k,m=b?n:c?l:a.findDotsAtSegment(g,h,i[0],i[1],i[2],i[3],i[4],i[5],1),m.alpha&&(m={x:m.x,y:m.y,alpha:m.alpha});return m}},cu=ct(1),cv=ct(),cw=ct(0,1);a.getTotalLength=cu,a.getPointAtLength=cv,a.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return cw(a,b).end;var d=cw(a,c,1);return b?cw(d,b).end:d},cl.getTotalLength=function(){if(this.type=="path"){if(this.node.getTotalLength)return this.node.getTotalLength();return cu(this.attrs.path)}},cl.getPointAtLength=function(a){if(this.type=="path")return cv(this.attrs.path,a)},cl.getSubpath=function(b,c){if(this.type=="path")return a.getSubpath(this.attrs.path,b,c)};var cx=a.easing_formulas={linear:function(a){return a},"<":function(a){return A(a,1.7)},">":function(a){return A(a,.48)},"<>":function(a){var b=.48-a/1.04,c=w.sqrt(.1734+b*b),d=c-b,e=A(z(d),1/3)*(d<0?-1:1),f=-c-b,g=A(z(f),1/3)*(f<0?-1:1),h=e+g+.5;return(1-h)*3*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a=a-1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){if(a==!!a)return a;return A(2,-10*a)*w.sin((a-.075)*2*B/.3)+1},bounce:function(a){var b=7.5625,c=2.75,d;a<1/c?d=b*a*a:a<2/c?(a-=1.5/c,d=b*a*a+.75):a<2.5/c?(a-=2.25/c,d=b*a*a+.9375):(a-=2.625/c,d=b*a*a+.984375);return d}};cx.easeIn=cx["ease-in"]=cx["<"],cx.easeOut=cx["ease-out"]=cx[">"],cx.easeInOut=cx["ease-in-out"]=cx["<>"],cx["back-in"]=cx.backIn,cx["back-out"]=cx.backOut;var cy=[],cz=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){setTimeout(a,16)},cA=function(){var b=+(new Date),c=0;for(;c<cy.length;c++){var d=cy[c];if(d.el.removed||d.paused)continue;var e=b-d.start,f=d.ms,h=d.easing,i=d.from,j=d.diff,k=d.to,l=d.t,m=d.el,o={},p,r={},s;d.initstatus?(e=(d.initstatus*d.anim.top-d.prev)/(d.percent-d.prev)*f,d.status=d.initstatus,delete d.initstatus,d.stop&&cy.splice(c--,1)):d.status=(d.prev+(d.percent-d.prev)*(e/f))/d.anim.top;if(e<0)continue;if(e<f){var t=h(e/f);for(var u in i)if(i[g](u)){switch(U[u]){case C:p=+i[u]+t*f*j[u];break;case"colour":p="rgb("+[cB(O(i[u].r+t*f*j[u].r)),cB(O(i[u].g+t*f*j[u].g)),cB(O(i[u].b+t*f*j[u].b))].join(",")+")";break;case"path":p=[];for(var v=0,w=i[u].length;v<w;v++){p[v]=[i[u][v][0]];for(var x=1,y=i[u][v].length;x<y;x++)p[v][x]=+i[u][v][x]+t*f*j[u][v][x];p[v]=p[v].join(q)}p=p.join(q);break;case"transform":if(j[u].real){p=[];for(v=0,w=i[u].length;v<w;v++){p[v]=[i[u][v][0]];for(x=1,y=i[u][v].length;x<y;x++)p[v][x]=i[u][v][x]+t*f*j[u][v][x]}}else{var z=function(a){return+i[u][a]+t*f*j[u][a]};p=[["m",z(0),z(1),z(2),z(3),z(4),z(5)]]}break;case"csv":if(u=="clip-rect"){p=[],v=4;while(v--)p[v]=+i[u][v]+t*f*j[u][v]}break;default:var A=[][n](i[u]);p=[],v=m.paper.customAttributes[u].length;while(v--)p[v]=+A[v]+t*f*j[u][v]}o[u]=p}m.attr(o),function(a,b,c){setTimeout(function(){eve("raphael.anim.frame."+a,b,c)})}(m.id,m,d.anim)}else{(function(b,c,d){setTimeout(function(){eve("raphael.anim.frame."+c.id,c,d),eve("raphael.anim.finish."+c.id,c,d),a.is(b,"function")&&b.call(c)})})(d.callback,m,d.anim),m.attr(k),cy.splice(c--,1);if(d.repeat>1&&!d.next){for(s in k)k[g](s)&&(r[s]=d.totalOrigin[s]);d.el.attr(r),cE(d.anim,d.el,d.anim.percents[0],null,d.totalOrigin,d.repeat-1)}d.next&&!d.stop&&cE(d.anim,d.el,d.next,null,d.totalOrigin,d.repeat)}}a.svg&&m&&m.paper&&m.paper.safari(),cy.length&&cz(cA)},cB=function(a){return a>255?255:a<0?0:a};cl.animateWith=function(b,c,d,e,f,g){var h=this;if(h.removed){g&&g.call(h);return h}var i=d instanceof cD?d:a.animation(d,e,f,g),j,k;cE(i,h,i.percents[0],null,h.attr());for(var l=0,m=cy.length;l<m;l++)if(cy[l].anim==c&&cy[l].el==b){cy[m-1].start=cy[l].start;break}return h},cl.onAnimation=function(a){a?eve.on("raphael.anim.frame."+this.id,a):eve.unbind("raphael.anim.frame."+this.id);return this},cD.prototype.delay=function(a){var b=new cD(this.anim,this.ms);b.times=this.times,b.del=+a||0;return b},cD.prototype.repeat=function(a){var b=new cD(this.anim,this.ms);b.del=this.del,b.times=w.floor(x(a,0))||1;return b},a.animation=function(b,c,d,e){if(b instanceof cD)return b;if(a.is(d,"function")||!d)e=e||d||null,d=null;b=Object(b),c=+c||0;var f={},h,i;for(i in b)b[g](i)&&Q(i)!=i&&Q(i)+"%"!=i&&(h=!0,f[i]=b[i]);if(!h)return new cD(b,c);d&&(f.easing=d),e&&(f.callback=e);return new cD({100:f},c)},cl.animate=function(b,c,d,e){var f=this;if(f.removed){e&&e.call(f);return f}var g=b instanceof cD?b:a.animation(b,c,d,e);cE(g,f,g.percents[0],null,f.attr());return f},cl.setTime=function(a,b){a&&b!=null&&this.status(a,y(b,a.ms)/a.ms);return this},cl.status=function(a,b){var c=[],d=0,e,f;if(b!=null){cE(a,this,-1,y(b,1));return this}e=cy.length;for(;d<e;d++){f=cy[d];if(f.el.id==this.id&&(!a||f.anim==a)){if(a)return f.status;c.push({anim:f.anim,status:f.status})}}if(a)return 0;return c},cl.pause=function(a){for(var b=0;b<cy.length;b++)cy[b].el.id==this.id&&(!a||cy[b].anim==a)&&eve("raphael.anim.pause."+this.id,this,cy[b].anim)!==!1&&(cy[b].paused=!0);return this},cl.resume=function(a){for(var b=0;b<cy.length;b++)if(cy[b].el.id==this.id&&(!a||cy[b].anim==a)){var c=cy[b];eve("raphael.anim.resume."+this.id,this,c.anim)!==!1&&(delete c.paused,this.status(c.anim,c.status))}return this},cl.stop=function(a){for(var b=0;b<cy.length;b++)cy[b].el.id==this.id&&(!a||cy[b].anim==a)&&eve("raphael.anim.stop."+this.id,this,cy[b].anim)!==!1&&cy.splice(b--,1);return this},eve.on("raphael.remove",cF),eve.on("raphael.clear",cF),cl.toString=function(){return"Raphaël’s object"};var cG=function(a){this.items=[],this.length=0,this.type="set";if(a)for(var b=0,c=a.length;b<c;b++)a[b]&&(a[b].constructor==cl.constructor||a[b].constructor==cG)&&(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},cH=cG.prototype;cH.push=function(){var a,b;for(var c=0,d=arguments.length;c<d;c++)a=arguments[c],a&&(a.constructor==cl.constructor||a.constructor==cG)&&(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},cH.pop=function(){this.length&&delete this[this.length--];return this.items.pop()},cH.forEach=function(a,b){for(var c=0,d=this.items.length;c<d;c++)if(a.call(b,this.items[c],c)===!1)return this;return this};for(var cI in cl)cl[g](cI)&&(cH[cI]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a][m](c,b)})}}(cI));cH.attr=function(b,c){if(b&&a.is(b,E)&&a.is(b[0],"object"))for(var d=0,e=b.length;d<e;d++)this.items[d].attr(b[d]);else for(var f=0,g=this.items.length;f<g;f++)this.items[f].attr(b,c);return this},cH.clear=function(){while(this.length)this.pop()},cH.splice=function(a,b,c){a=a<0?x(this.length+a,0):a,b=x(0,y(this.length-a,b));var d=[],e=[],f=[],g;for(g=2;g<arguments.length;g++)f.push(arguments[g]);for(g=0;g<b;g++)e.push(this[a+g]);for(;g<this.length-a;g++)d.push(this[a+g]);var h=f.length;for(g=0;g<h+d.length;g++)this.items[a+g]=this[a+g]=g<h?f[g]:d[g-h];g=this.items.length=this.length-=b-h;while(this[g])delete this[g++];return new cG(e)},cH.exclude=function(a){for(var b=0,c=this.length;b<c;b++)if(this[b]==a){this.splice(b,1);return!0}},cH.animate=function(b,c,d,e){(a.is(d,"function")||!d)&&(e=d||null);var f=this.items.length,g=f,h,i=this,j;if(!f)return this;e&&(j=function(){!--f&&e.call(i)}),d=a.is(d,D)?d:j;var k=a.animation(b,c,d,j);h=this.items[--g].animate(k);while(g--)this.items[g]&&!this.items[g].removed&&this.items[g].animateWith(h,k,k);return this},cH.insertAfter=function(a){var b=this.items.length;while(b--)this.items[b].insertAfter(a);return this},cH.getBBox=function(){var a=[],b=[],c=[],d=[];for(var e=this.items.length;e--;)if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)}a=y[m](0,a),b=y[m](0,b),c=x[m](0,c),d=x[m](0,d);return{x:a,y:b,x2:c,y2:d,width:c-a,height:d-b}},cH.clone=function(a){a=new cG;for(var b=0,c=this.items.length;b<c;b++)a.push(this.items[b].clone());return a},cH.toString=function(){return"Raphaël‘s set"},a.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[g](d)&&(b.face[d]=a.face[d]);this.fonts[c]?this.fonts[c].push(b):this.fonts[c]=[b];if(!a.svg){b.face["units-per-em"]=R(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[g](e)){var f=a.glyphs[e];b.glyphs[e]={w:f.w,k:{},d:f.d&&"M"+f.d.replace(/[mlcxtrv]/g,function(a){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[a]||"M"})+"z"};if(f.k)for(var h in f.k)f[g](h)&&(b.glyphs[e].k[h]=f.k[h])}}return a},k.getFont=function(b,c,d,e){e=e||"normal",d=d||"normal",c=+c||{normal:400,bold:700,lighter:300,bolder:800}[c]||400;if(!!a.fonts){var f=a.fonts[b];if(!f){var h=new RegExp("(^|\\s)"+b.replace(/[^\w\d\s+!~.:_-]/g,p)+"(\\s|$)","i");for(var i in a.fonts)if(a.fonts[g](i)&&h.test(i)){f=a.fonts[i];break}}var j;if(f)for(var k=0,l=f.length;k<l;k++){j=f[k];if(j.face["font-weight"]==c&&(j.face["font-style"]==d||!j.face["font-style"])&&j.face["font-stretch"]==e)break}return j}},k.print=function(b,d,e,f,g,h,i){h=h||"middle",i=x(y(i||0,1),-1);var j=r(e)[s](p),k=0,l=0,m=p,n;a.is(f,e)&&(f=this.getFont(f));if(f){n=(g||16)/f.face["units-per-em"];var o=f.face.bbox[s](c),q=+o[0],t=o[3]-o[1],u=0,v=+o[1]+(h=="baseline"?t+ +f.face.descent:t/2);for(var w=0,z=j.length;w<z;w++){if(j[w]=="\n")k=0,B=0,l=0,u+=t;else{var A=l&&f.glyphs[j[w-1]]||{},B=f.glyphs[j[w]];k+=l?(A.w||f.w)+(A.k&&A.k[j[w]]||0)+f.w*i:0,l=1}B&&B.d&&(m+=a.transformPath(B.d,["t",k*n,u*n,"s",n,n,q,v,"t",(b-q)/n,(d-v)/n]))}}return this.path(m).attr({fill:"#000",stroke:"none"})},k.add=function(b){if(a.is(b,"array")){var c=this.set(),e=0,f=b.length,h;for(;e<f;e++)h=b[e]||{},d[g](h.type)&&c.push(this[h.type]().attr(h))}return c},a.format=function(b,c){var d=a.is(c,E)?[0][n](c):arguments;b&&a.is(b,D)&&d.length-1&&(b=b.replace(e,function(a,b){return d[++b]==null?p:d[b]}));return b||p},a.fullfill=function(){var a=/\{([^\}]+)\}/g,b=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,c=function(a,c,d){var e=d;c.replace(b,function(a,b,c,d,f){b=b||d,e&&(b in e&&(e=e[b]),typeof e=="function"&&f&&(e=e()))}),e=(e==null||e==d?a:e)+"";return e};return function(b,d){return String(b).replace(a,function(a,b){return c(a,b,d)})}}(),a.ninja=function(){i.was?h.win.Raphael=i.is:delete Raphael;return a},a.st=cH,function(b,c,d){function e(){/in/.test(b.readyState)?setTimeout(e,9):a.eve("raphael.DOMload")}b.readyState==null&&b.addEventListener&&(b.addEventListener(c,d=function(){b.removeEventListener(c,d,!1),b.readyState="complete"},!1),b.readyState="loading"),e()}(document,"DOMContentLoaded"),i.was?h.win.Raphael=a:Raphael=a,eve.on("raphael.DOMload",function(){b=!0})}(),window.Raphael.svg&&function(a){var b="hasOwnProperty",c=String,d=parseFloat,e=parseInt,f=Math,g=f.max,h=f.abs,i=f.pow,j=/[, ]+/,k=a.eve,l="",m=" ",n="http://www.w3.org/1999/xlink",o={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},p={};a.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var q=function(d,e){if(e){typeof d=="string"&&(d=q(d));for(var f in e)e[b](f)&&(f.substring(0,6)=="xlink:"?d.setAttributeNS(n,f.substring(6),c(e[f])):d.setAttribute(f,c(e[f])))}else d=a._g.doc.createElementNS("http://www.w3.org/2000/svg",d),d.style&&(d.style.webkitTapHighlightColor="rgba(0,0,0,0)");return d},r=function(b,e){var j="linear",k=b.id+e,m=.5,n=.5,o=b.node,p=b.paper,r=o.style,s=a._g.doc.getElementById(k);if(!s){e=c(e).replace(a._radial_gradient,function(a,b,c){j="radial";if(b&&c){m=d(b),n=d(c);var e=(n>.5)*2-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&n!=.5&&(n=n.toFixed(5)-1e-5*e)}return l}),e=e.split(/\s*\-\s*/);if(j=="linear"){var t=e.shift();t=-d(t);if(isNaN(t))return null;var u=[0,0,f.cos(a.rad(t)),f.sin(a.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)}var w=a._parseDots(e);if(!w)return null;k=k.replace(/[\(\)\s,\xb0#]/g,"_"),b.gradient&&k!=b.gradient.id&&(p.defs.removeChild(b.gradient),delete b.gradient);if(!b.gradient){s=q(j+"Gradient",{id:k}),b.gradient=s,q(s,j=="radial"?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:b.matrix.invert()}),p.defs.appendChild(s);for(var x=0,y=w.length;x<y;x++)s.appendChild(q("stop",{offset:w[x].offset?w[x].offset:x?"100%":"0%","stop-color":w[x].color||"#fff"}))}}q(o,{fill:"url(#"+k+")",opacity:1,"fill-opacity":1}),r.fill=l,r.opacity=1,r.fillOpacity=1;return 1},s=function(a){var b=a.getBBox(1);q(a.pattern,{patternTransform:a.matrix.invert()+" translate("+b.x+","+b.y+")"})},t=function(d,e,f){if(d.type=="path"){var g=c(e).toLowerCase().split("-"),h=d.paper,i=f?"end":"start",j=d.node,k=d.attrs,m=k["stroke-width"],n=g.length,r="classic",s,t,u,v,w,x=3,y=3,z=5;while(n--)switch(g[n]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":r=g[n];break;case"wide":y=5;break;case"narrow":y=2;break;case"long":x=5;break;case"short":x=2}r=="open"?(x+=2,y+=2,z+=2,u=1,v=f?4:1,w={fill:"none",stroke:k.stroke}):(v=u=x/2,w={fill:k.stroke,stroke:"none"}),d._.arrows?f?(d._.arrows.endPath&&p[d._.arrows.endPath]--,d._.arrows.endMarker&&p[d._.arrows.endMarker]--):(d._.arrows.startPath&&p[d._.arrows.startPath]--,d._.arrows.startMarker&&p[d._.arrows.startMarker]--):d._.arrows={};if(r!="none"){var A="raphael-marker-"+r,B="raphael-marker-"+i+r+x+y;a._g.doc.getElementById(A)?p[A]++:(h.defs.appendChild(q(q("path"),{"stroke-linecap":"round",d:o[r],id:A})),p[A]=1);var C=a._g.doc.getElementById(B),D;C?(p[B]++,D=C.getElementsByTagName("use")[0]):(C=q(q("marker"),{id:B,markerHeight:y,markerWidth:x,orient:"auto",refX:v,refY:y/2}),D=q(q("use"),{"xlink:href":"#"+A,transform:(f?"rotate(180 "+x/2+" "+y/2+") ":l)+"scale("+x/z+","+y/z+")","stroke-width":(1/((x/z+y/z)/2)).toFixed(4)}),C.appendChild(D),h.defs.appendChild(C),p[B]=1),q(D,w);var F=u*(r!="diamond"&&r!="oval");f?(s=d._.arrows.startdx*m||0,t=a.getTotalLength(k.path)-F*m):(s=F*m,t=a.getTotalLength(k.path)-(d._.arrows.enddx*m||0)),w={},w["marker-"+i]="url(#"+B+")";if(t||s)w.d=Raphael.getSubpath(k.path,s,t);q(j,w),d._.arrows[i+"Path"]=A,d._.arrows[i+"Marker"]=B,d._.arrows[i+"dx"]=F,d._.arrows[i+"Type"]=r,d._.arrows[i+"String"]=e}else f?(s=d._.arrows.startdx*m||0,t=a.getTotalLength(k.path)-s):(s=0,t=a.getTotalLength(k.path)-(d._.arrows.enddx*m||0)),d._.arrows[i+"Path"]&&q(j,{d:Raphael.getSubpath(k.path,s,t)}),delete d._.arrows[i+"Path"],delete d._.arrows[i+"Marker"],delete d._.arrows[i+"dx"],delete d._.arrows[i+"Type"],delete d._.arrows[i+"String"];for(w in p)if(p[b](w)&&!p[w]){var G=a._g.doc.getElementById(w);G&&G.parentNode.removeChild(G)}}},u={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},v=function(a,b,d){b=u[c(b).toLowerCase()];if(b){var e=a.attrs["stroke-width"]||"1",f={round:e,square:e,butt:0}[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],h=b.length;while(h--)g[h]=b[h]*e+(h%2?1:-1)*f;q(a.node,{"stroke-dasharray":g.join(",")})}},w=function(d,f){var i=d.node,k=d.attrs,m=i.style.visibility;i.style.visibility="hidden";for(var o in f)if(f[b](o)){if(!a._availableAttrs[b](o))continue;var p=f[o];k[o]=p;switch(o){case"blur":d.blur(p);break;case"href":case"title":case"target":var u=i.parentNode;if(u.tagName.toLowerCase()!="a"){var w=q("a");u.insertBefore(w,i),w.appendChild(i),u=w}o=="target"?u.setAttributeNS(n,"show",p=="blank"?"new":p):u.setAttributeNS(n,o,p);break;case"cursor":i.style.cursor=p;break;case"transform":d.transform(p);break;case"arrow-start":t(d,p);break;case"arrow-end":t(d,p,1);break;case"clip-rect":var x=c(p).split(j);if(x.length==4){d.clip&&d.clip.parentNode.parentNode.removeChild(d.clip.parentNode);var z=q("clipPath"),A=q("rect");z.id=a.createUUID(),q(A,{x:x[0],y:x[1],width:x[2],height:x[3]}),z.appendChild(A),d.paper.defs.appendChild(z),q(i,{"clip-path":"url(#"+z.id+")"}),d.clip=A}if(!p){var B=i.getAttribute("clip-path");if(B){var C=a._g.doc.getElementById(B.replace(/(^url\(#|\)$)/g,l));C&&C.parentNode.removeChild(C),q(i,{"clip-path":l}),delete d.clip}}break;case"path":d.type=="path"&&(q(i,{d:p?k.path=a._pathToAbsolute(p):"M0,0"}),d._.dirty=1,d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1)));break;case"width":i.setAttribute(o,p),d._.dirty=1;if(k.fx)o="x",p=k.x;else break;case"x":k.fx&&(p=-k.x-(k.width||0));case"rx":if(o=="rx"&&d.type=="rect")break;case"cx":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"height":i.setAttribute(o,p),d._.dirty=1;if(k.fy)o="y",p=k.y;else break;case"y":k.fy&&(p=-k.y-(k.height||0));case"ry":if(o=="ry"&&d.type=="rect")break;case"cy":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"r":d.type=="rect"?q(i,{rx:p,ry:p}):i.setAttribute(o,p),d._.dirty=1;break;case"src":d.type=="image"&&i.setAttributeNS(n,"href",p);break;case"stroke-width":if(d._.sx!=1||d._.sy!=1)p/=g(h(d._.sx),h(d._.sy))||1;d.paper._vbSize&&(p*=d.paper._vbSize),i.setAttribute(o,p),k["stroke-dasharray"]&&v(d,k["stroke-dasharray"],f),d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"stroke-dasharray":v(d,p,f);break;case"fill":var D=c(p).match(a._ISURL);if(D){z=q("pattern");var F=q("image");z.id=a.createUUID(),q(z,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),q(F,{x:0,y:0,"xlink:href":D[1]}),z.appendChild(F),function(b){a._preload(D[1],function(){var a=this.offsetWidth,c=this.offsetHeight;q(b,{width:a,height:c}),q(F,{width:a,height:c}),d.paper.safari()})}(z),d.paper.defs.appendChild(z),q(i,{fill:"url(#"+z.id+")"}),d.pattern=z,d.pattern&&s(d);break}var G=a.getRGB(p);if(!G.error)delete f.gradient,delete k.gradient,!a.is(k.opacity,"undefined")&&a.is(f.opacity,"undefined")&&q(i,{opacity:k.opacity}),!a.is(k["fill-opacity"],"undefined")&&a.is(f["fill-opacity"],"undefined")&&q(i,{"fill-opacity":k["fill-opacity"]});else if((d.type=="circle"||d.type=="ellipse"||c(p).charAt()!="r")&&r(d,p)){if("opacity"in k||"fill-opacity"in k){var H=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l));if(H){var I=H.getElementsByTagName("stop");q(I[I.length-1],{"stop-opacity":("opacity"in k?k.opacity:1)*("fill-opacity"in k?k["fill-opacity"]:1)})}}k.gradient=p,k.fill="none";break}G[b]("opacity")&&q(i,{"fill-opacity":G.opacity>1?G.opacity/100:G.opacity});case"stroke":G=a.getRGB(p),i.setAttribute(o,G.hex),o=="stroke"&&G[b]("opacity")&&q(i,{"stroke-opacity":G.opacity>1?G.opacity/100:G.opacity}),o=="stroke"&&d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"gradient":(d.type=="circle"||d.type=="ellipse"||c(p).charAt()!="r")&&r(d,p);break;case"opacity":k.gradient&&!k[b]("stroke-opacity")&&q(i,{"stroke-opacity":p>1?p/100:p});case"fill-opacity":if(k.gradient){H=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l)),H&&(I=H.getElementsByTagName("stop"),q(I[I.length-1],{"stop-opacity":p}));break};default:o=="font-size"&&(p=e(p,10)+"px");var J=o.replace(/(\-.)/g,function(a){return a.substring(1).toUpperCase()});i.style[J]=p,d._.dirty=1,i.setAttribute(o,p)}}y(d,f),i.style.visibility=m},x=1.2,y=function(d,f){if(d.type=="text"&&!!(f[b]("text")||f[b]("font")||f[b]("font-size")||f[b]("x")||f[b]("y"))){var g=d.attrs,h=d.node,i=h.firstChild?e(a._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue("font-size"),10):10;if(f[b]("text")){g.text=f.text;while(h.firstChild)h.removeChild(h.firstChild);var j=c(f.text).split("\n"),k=[],m;for(var n=0,o=j.length;n<o;n++)m=q("tspan"),n&&q(m,{dy:i*x,x:g.x}),m.appendChild(a._g.doc.createTextNode(j[n])),h.appendChild(m),k[n]=m}else{k=h.getElementsByTagName("tspan");for(n=0,o=k.length;n<o;n++)n?q(k[n],{dy:i*x,x:g.x}):q(k[0],{dy:0})}q(h,{x:g.x,y:g.y}),d._.dirty=1;var p=d._getBBox(),r=g.y-(p.y+p.height/2);r&&a.is(r,"finite")&&q(k[0],{dy:r})}},z=function(b,c){var d=0,e=0;this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.matrix=a.matrix(),this.realPath=null,this.paper=c,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},A=a.el;z.prototype=A,A.constructor=z,a._engine.path=function(a,b){var c=q("path");b.canvas&&b.canvas.appendChild(c);var d=new z(c,b);d.type="path",w(d,{fill:"none",stroke:"#000",path:a});return d},A.rotate=function(a,b,e){if(this.removed)return this;a=c(a).split(j),a.length-1&&(b=d(a[1]),e=d(a[2])),a=d(a[0]),e==null&&(b=e);if(b==null||e==null){var f=this.getBBox(1);b=f.x+f.width/2,e=f.y+f.height/2}this.transform(this._.transform.concat([["r",a,b,e]]));return this},A.scale=function(a,b,e,f){if(this.removed)return this;a=c(a).split(j),a.length-1&&(b=d(a[1]),e=d(a[2]),f=d(a[3])),a=d(a[0]),b==null&&(b=a),f==null&&(e=f);if(e==null||f==null)var g=this.getBBox(1);e=e==null?g.x+g.width/2:e,f=f==null?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,b,e,f]]));return this},A.translate=function(a,b){if(this.removed)return this;a=c(a).split(j),a.length-1&&(b=d(a[1])),a=d(a[0])||0,b=+b||0,this.transform(this._.transform.concat([["t",a,b]]));return this},A.transform=function(c){var d=this._;if(c==null)return d.transform;a._extractTransform(this,c),this.clip&&q(this.clip,{transform:this.matrix.invert()}),this.pattern&&s(this),this.node&&q(this.node,{transform:this.matrix});if(d.sx!=1||d.sy!=1){var e=this.attrs[b]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":e})}return this},A.hide=function(){!this.removed&&this.paper.safari(this.node.style.display="none");return this},A.show=function(){!this.removed&&this.paper.safari(this.node.style.display="");return this},A.remove=function(){if(!this.removed&&!!this.node.parentNode){var b=this.paper;b.__set__&&b.__set__.exclude(this),k.unbind("raphael.*.*."+this.id),this.gradient&&b.defs.removeChild(this.gradient),a._tear(this,b),this.node.parentNode.tagName.toLowerCase()=="a"?this.node.parentNode.parentNode.removeChild(this.node.parentNode):this.node.parentNode.removeChild(this.node);for(var c in this)this[c]=typeof this[c]=="function"?a._removedFactory(c):null;this.removed=!0}},A._getBBox=function(){if(this.node.style.display=="none"){this.show();var a=!0}var b={};try{b=this.node.getBBox()}catch(c){}finally{b=b||{}}a&&this.hide();return b},A.attr=function(c,d){if(this.removed)return this;if(c==null){var e={};for(var f in this.attrs)this.attrs[b](f)&&(e[f]=this.attrs[f]);e.gradient&&e.fill=="none"&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform;return e}if(d==null&&a.is(c,"string")){if(c=="fill"&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;if(c=="transform")return this._.transform;var g=c.split(j),h={};for(var i=0,l=g.length;i<l;i++)c=g[i],c in this.attrs?h[c]=this.attrs[c]:a.is(this.paper.customAttributes[c],"function")?h[c]=this.paper.customAttributes[c].def:h[c]=a._availableAttrs[c];return l-1?h:h[g[0]]}if(d==null&&a.is(c,"array")){h={};for(i=0,l=c.length;i<l;i++)h[c[i]]=this.attr(c[i]);return h}if(d!=null){var m={};m[c]=d}else c!=null&&a.is(c,"object")&&(m=c);for(var n in m)k("raphael.attr."+n+"."+this.id,this,m[n]);for(n in this.paper.customAttributes)if(this.paper.customAttributes[b](n)&&m[b](n)&&a.is(this.paper.customAttributes[n],"function")){var o=this.paper.customAttributes[n].apply(this,[].concat(m[n]));this.attrs[n]=m[n];for(var p in o)o[b](p)&&(m[p]=o[p])}w(this,m);return this},A.toFront=function(){if(this.removed)return this;this.node.parentNode.tagName.toLowerCase()=="a"?this.node.parentNode.parentNode.appendChild(this.node.parentNode):this.node.parentNode.appendChild(this.node);var b=this.paper;b.top!=this&&a._tofront(this,b);return this},A.toBack=function(){if(this.removed)return this;var b=this.node.parentNode;b.tagName.toLowerCase()=="a"?b.parentNode.insertBefore(this.node.parentNode,this.node.parentNode.parentNode.firstChild):b.firstChild!=this.node&&b.insertBefore(this.node,this.node.parentNode.firstChild),a._toback(this,this.paper);var c=this.paper;return this},A.insertAfter=function(b){if(this.removed)return this;var c=b.node||b[b.length-1].node;c.nextSibling?c.parentNode.insertBefore(this.node,c.nextSibling):c.parentNode.appendChild(this.node),a._insertafter(this,b,this.paper);return this},A.insertBefore=function(b){if(this.removed)return this;var c=b.node||b[0].node;c.parentNode.insertBefore(this.node,c),a._insertbefore(this,b,this.paper);return this},A.blur=function(b){var c=this;if(+b!==0){var d=q("filter"),e=q("feGaussianBlur");c.attrs.blur=b,d.id=a.createUUID(),q(e,{stdDeviation:+b||1.5}),d.appendChild(e),c.paper.defs.appendChild(d),c._blur=d,q(c.node,{filter:"url(#"+d.id+")"})}else c._blur&&(c._blur.parentNode.removeChild(c._blur),delete c._blur,delete c.attrs.blur),c.node.removeAttribute("filter")},a._engine.circle=function(a,b,c,d){var e=q("circle");a.canvas&&a.canvas.appendChild(e);var f=new z(e,a);f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"},f.type="circle",q(e,f.attrs);return f},a._engine.rect=function(a,b,c,d,e,f){var g=q("rect");a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);h.attrs={x:b,y:c,width:d,height:e,r:f||0,rx:f||0,ry:f||0,fill:"none",stroke:"#000"},h.type="rect",q(g,h.attrs);return h},a._engine.ellipse=function(a,b,c,d,e){var f=q("ellipse");a.canvas&&a.canvas.appendChild(f);var g=new z(f,a);g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"},g.type="ellipse",q(f,g.attrs);return g},a._engine.image=function(a,b,c,d,e,f){var g=q("image");q(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"}),g.setAttributeNS(n,"href",b),a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);h.attrs={x:c,y:d,width:e,height:f,src:b},h.type="image";return h},a._engine.text=function(b,c,d,e){var f=q("text");b.canvas&&b.canvas.appendChild(f);var g=new z(f,b);g.attrs={x:c,y:d,"text-anchor":"middle",text:e,font:a._availableAttrs.font,stroke:"none",fill:"#000"},g.type="text",w(g,g.attrs);return g},a._engine.setSize=function(a,b){this.width=a||this.width,this.height=b||this.height,this.canvas.setAttribute("width",this.width),this.canvas.setAttribute("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox);return this},a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b&&b.container,d=b.x,e=b.y,f=b.width,g=b.height;if(!c)throw new Error("SVG container not found.");var h=q("svg"),i="overflow:hidden;",j;d=d||0,e=e||0,f=f||512,g=g||342,q(h,{height:g,version:1.1,width:f,xmlns:"http://www.w3.org/2000/svg"}),c==1?(h.style.cssText=i+"position:absolute;left:"+d+"px;top:"+e+"px",a._g.doc.body.appendChild(h),j=1):(h.style.cssText=i+"position:relative",c.firstChild?c.insertBefore(h,c.firstChild):c.appendChild(h)),c=new a._Paper,c.width=f,c.height=g,c.canvas=h,c.clear(),c._left=c._top=0,j&&(c.renderfix=function(){}),c.renderfix();return c},a._engine.setViewBox=function(a,b,c,d,e){k("raphael.setViewBox",this,this._viewBox,[a,b,c,d,e]);var f=g(c/this.width,d/this.height),h=this.top,i=e?"meet":"xMinYMin",j,l;a==null?(this._vbSize&&(f=1),delete this._vbSize,j="0 0 "+this.width+m+this.height):(this._vbSize=f,j=a+m+b+m+c+m+d),q(this.canvas,{viewBox:j,preserveAspectRatio:i});while(f&&h)l="stroke-width"in h.attrs?h.attrs["stroke-width"]:1,h.attr({"stroke-width":l}),h._.dirty=1,h._.dirtyT=1,h=h.prev;this._viewBox=[a,b,c,d,!!e];return this},a.prototype.renderfix=function(){var a=this.canvas,b=a.style,c;try{c=a.getScreenCTM()||a.createSVGMatrix()}catch(d){c=a.createSVGMatrix()}var e=-c.e%1,f=-c.f%1;if(e||f)e&&(this._left=(this._left+e)%1,b.left=this._left+"px"),f&&(this._top=(this._top+f)%1,b.top=this._top+"px")},a.prototype.clear=function(){a.eve("raphael.clear",this);var b=this.canvas;while(b.firstChild)b.removeChild(b.firstChild);this.bottom=this.top=null,(this.desc=q("desc")).appendChild(a._g.doc.createTextNode("Created with Raphaël "+a.version)),b.appendChild(this.desc),b.appendChild(this.defs=q("defs"))},a.prototype.remove=function(){k("raphael.remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]=typeof this[b]=="function"?a._removedFactory(b):null};var B=a.st;for(var C in A)A[b](C)&&!B[b](C)&&(B[C]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(C))}(window.Raphael),window.Raphael.vml&&function(a){var b="hasOwnProperty",c=String,d=parseFloat,e=Math,f=e.round,g=e.max,h=e.min,i=e.abs,j="fill",k=/[, ]+/,l=a.eve,m=" progid:DXImageTransform.Microsoft",n=" ",o="",p={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},q=/([clmz]),?([^clmz]*)/gi,r=/ progid:\S+Blur\([^\)]+\)/g,s=/-?[^,\s-]+/g,t="position:absolute;left:0;top:0;width:1px;height:1px",u=21600,v={path:1,rect:1,image:1},w={circle:1,ellipse:1},x=function(b){var d=/[ahqstv]/ig,e=a._pathToAbsolute;c(b).match(d)&&(e=a._path2curve),d=/[clmz]/g;if(e==a._pathToAbsolute&&!c(b).match(d)){var g=c(b).replace(q,function(a,b,c){var d=[],e=b.toLowerCase()=="m",g=p[b];c.replace(s,function(a){e&&d.length==2&&(g+=d+p[b=="m"?"l":"L"],d=[]),d.push(f(a*u))});return g+d});return g}var h=e(b),i,j;g=[];for(var k=0,l=h.length;k<l;k++){i=h[k],j=h[k][0].toLowerCase(),j=="z"&&(j="x");for(var m=1,r=i.length;m<r;m++)j+=f(i[m]*u)+(m!=r-1?",":o);g.push(j)}return g.join(n)},y=function(b,c,d){var e=a.matrix();e.rotate(-b,.5,.5);return{dx:e.x(c,d),dy:e.y(c,d)}},z=function(a,b,c,d,e,f){var g=a._,h=a.matrix,k=g.fillpos,l=a.node,m=l.style,o=1,p="",q,r=u/b,s=u/c;m.visibility="hidden";if(!!b&&!!c){l.coordsize=i(r)+n+i(s),m.rotation=f*(b*c<0?-1:1);if(f){var t=y(f,d,e);d=t.dx,e=t.dy}b<0&&(p+="x"),c<0&&(p+=" y")&&(o=-1),m.flip=p,l.coordorigin=d*-r+n+e*-s;if(k||g.fillsize){var v=l.getElementsByTagName(j);v=v&&v[0],l.removeChild(v),k&&(t=y(f,h.x(k[0],k[1]),h.y(k[0],k[1])),v.position=t.dx*o+n+t.dy*o),g.fillsize&&(v.size=g.fillsize[0]*i(b)+n+g.fillsize[1]*i(c)),l.appendChild(v)}m.visibility="visible"}};a.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};var A=function(a,b,d){var e=c(b).toLowerCase().split("-"),f=d?"end":"start",g=e.length,h="classic",i="medium",j="medium";while(g--)switch(e[g]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":h=e[g];break;case"wide":case"narrow":j=e[g];break;case"long":case"short":i=e[g]}var k=a.node.getElementsByTagName("stroke")[0];k[f+"arrow"]=h,k[f+"arrowlength"]=i,k[f+"arrowwidth"]=j},B=function(e,i){e.attrs=e.attrs||{};var l=e.node,m=e.attrs,p=l.style,q,r=v[e.type]&&(i.x!=m.x||i.y!=m.y||i.width!=m.width||i.height!=m.height||i.cx!=m.cx||i.cy!=m.cy||i.rx!=m.rx||i.ry!=m.ry||i.r!=m.r),s=w[e.type]&&(m.cx!=i.cx||m.cy!=i.cy||m.r!=i.r||m.rx!=i.rx||m.ry!=i.ry),t=e;for(var y in i)i[b](y)&&(m[y]=i[y]);r&&(m.path=a._getPath[e.type](e),e._.dirty=1),i.href&&(l.href=i.href),i.title&&(l.title=i.title),i.target&&(l.target=i.target),i.cursor&&(p.cursor=i.cursor),"blur"in i&&e.blur(i.blur);if(i.path&&e.type=="path"||r)l.path=x(~c(m.path).toLowerCase().indexOf("r")?a._pathToAbsolute(m.path):m.path),e.type=="image"&&(e._.fillpos=[m.x,m.y],e._.fillsize=[m.width,m.height],z(e,1,1,0,0,0));"transform"in i&&e.transform(i.transform);if(s){var B=+m.cx,D=+m.cy,E=+m.rx||+m.r||0,G=+m.ry||+m.r||0;l.path=a.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",f((B-E)*u),f((D-G)*u),f((B+E)*u),f((D+G)*u),f(B*u))}if("clip-rect"in i){var H=c(i["clip-rect"]).split(k);if(H.length==4){H[2]=+H[2]+ +H[0],H[3]=+H[3]+ +H[1];var I=l.clipRect||a._g.doc.createElement("div"),J=I.style;J.clip=a.format("rect({1}px {2}px {3}px {0}px)",H),l.clipRect||(J.position="absolute",J.top=0,J.left=0,J.width=e.paper.width+"px",J.height=e.paper.height+"px",l.parentNode.insertBefore(I,l),I.appendChild(l),l.clipRect=I)}i["clip-rect"]||l.clipRect&&(l.clipRect.style.clip="auto")}if(e.textpath){var K=e.textpath.style;i.font&&(K.font=i.font),i["font-family"]&&(K.fontFamily='"'+i["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,o)+'"'),i["font-size"]&&(K.fontSize=i["font-size"]),i["font-weight"]&&(K.fontWeight=i["font-weight"]),i["font-style"]&&(K.fontStyle=i["font-style"])}"arrow-start"in i&&A(t,i["arrow-start"]),"arrow-end"in i&&A(t,i["arrow-end"],1);if(i.opacity!=null||i["stroke-width"]!=null||i.fill!=null||i.src!=null||i.stroke!=null||i["stroke-width"]!=null||i["stroke-opacity"]!=null||i["fill-opacity"]!=null||i["stroke-dasharray"]!=null||i["stroke-miterlimit"]!=null||i["stroke-linejoin"]!=null||i["stroke-linecap"]!=null){var L=l.getElementsByTagName(j),M=!1;L=L&&L[0],!L&&(M=L=F(j)),e.type=="image"&&i.src&&(L.src=i.src),i.fill&&(L.on=!0);if(L.on==null||i.fill=="none"||i.fill===null)L.on=!1;if(L.on&&i.fill){var N=c(i.fill).match(a._ISURL);if(N){L.parentNode==l&&l.removeChild(L),L.rotate=!0,L.src=N[1],L.type="tile";var O=e.getBBox(1);L.position=O.x+n+O.y,e._.fillpos=[O.x,O.y],a._preload(N[1],function(){e._.fillsize=[this.offsetWidth,this.offsetHeight]})}else L.color=a.getRGB(i.fill).hex,L.src=o,L.type="solid",a.getRGB(i.fill).error&&(t.type in{circle:1,ellipse:1}||c(i.fill).charAt()!="r")&&C(t,i.fill,L)&&(m.fill="none",m.gradient=i.fill,L.rotate=!1)}if("fill-opacity"in i||"opacity"in i){var P=((+m["fill-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+a.getRGB(i.fill).o+1||2)-1);P=h(g(P,0),1),L.opacity=P,L.src&&(L.color="none")}l.appendChild(L);var Q=l.getElementsByTagName("stroke")&&l.getElementsByTagName("stroke")[0],T=!1;!Q&&(T=Q=F("stroke"));if(i.stroke&&i.stroke!="none"||i["stroke-width"]||i["stroke-opacity"]!=null||i["stroke-dasharray"]||i["stroke-miterlimit"]||i["stroke-linejoin"]||i["stroke-linecap"])Q.on=!0;(i.stroke=="none"||i.stroke===null||Q.on==null||i.stroke==0||i["stroke-width"]==0)&&(Q.on=!1);var U=a.getRGB(i.stroke);Q.on&&i.stroke&&(Q.color=U.hex),P=((+m["stroke-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+U.o+1||2)-1);var V=(d(i["stroke-width"])||1)*.75;P=h(g(P,0),1),i["stroke-width"]==null&&(V=m["stroke-width"]),i["stroke-width"]&&(Q.weight=V),V&&V<1&&(P*=V)&&(Q.weight=1),Q.opacity=P,i["stroke-linejoin"]&&(Q.joinstyle=i["stroke-linejoin"]||"miter"),Q.miterlimit=i["stroke-miterlimit"]||8,i["stroke-linecap"]&&(Q.endcap=i["stroke-linecap"]=="butt"?"flat":i["stroke-linecap"]=="square"?"square":"round");if(i["stroke-dasharray"]){var W={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};Q.dashstyle=W[b](i["stroke-dasharray"])?W[i["stroke-dasharray"]]:o}T&&l.appendChild(Q)}if(t.type=="text"){t.paper.canvas.style.display=o;var X=t.paper.span,Y=100,Z=m.font&&m.font.match(/\d+(?:\.\d*)?(?=px)/);p=X.style,m.font&&(p.font=m.font),m["font-family"]&&(p.fontFamily=m["font-family"]),m["font-weight"]&&(p.fontWeight=m["font-weight"]),m["font-style"]&&(p.fontStyle=m["font-style"]),Z=d(m["font-size"]||Z&&Z[0])||10,p.fontSize=Z*Y+"px",t.textpath.string&&(X.innerHTML=c(t.textpath.string).replace(/</g,"&#60;").replace(/&/g,"&#38;").replace(/\n/g,"<br>"));var $=X.getBoundingClientRect();t.W=m.w=($.right-$.left)/Y,t.H=m.h=($.bottom-$.top)/Y,t.X=m.x,t.Y=m.y+t.H/2,("x"in i||"y"in i)&&(t.path.v=a.format("m{0},{1}l{2},{1}",f(m.x*u),f(m.y*u),f(m.x*u)+1));var _=["x","y","text","font","font-family","font-weight","font-style","font-size"];for(var ba=0,bb=_.length;ba<bb;ba++)if(_[ba]in i){t._.dirty=1;break}switch(m["text-anchor"]){case"start":t.textpath.style["v-text-align"]="left",t.bbx=t.W/2;break;case"end":t.textpath.style["v-text-align"]="right",t.bbx=-t.W/2;break;default:t.textpath.style["v-text-align"]="center",t.bbx=0}t.textpath.style["v-text-kern"]=!0}},C=function(b,f,g){b.attrs=b.attrs||{};var h=b.attrs,i=Math.pow,j,k,l="linear",m=".5 .5";b.attrs.gradient=f,f=c(f).replace(a._radial_gradient,function(a,b,c){l="radial",b&&c&&(b=d(b),c=d(c),i(b-.5,2)+i(c-.5,2)>.25&&(c=e.sqrt(.25-i(b-.5,2))*((c>.5)*2-1)+.5),m=b+n+c);return o}),f=f.split(/\s*\-\s*/);if(l=="linear"){var p=f.shift();p=-d(p);if(isNaN(p))return null}var q=a._parseDots(f);if(!q)return null;b=b.shape||b.node;if(q.length){b.removeChild(g),g.on=!0,g.method="none",g.color=q[0].color,g.color2=q[q.length-1].color;var r=[];for(var s=0,t=q.length;s<t;s++)q[s].offset&&r.push(q[s].offset+n+q[s].color);g.colors=r.length?r.join():"0% "+g.color,l=="radial"?(g.type="gradientTitle",g.focus="100%",g.focussize="0 0",g.focusposition=m,g.angle=0):(g.type="gradient",g.angle=(270-p)%360),b.appendChild(g)}return 1},D=function(b,c){this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=c,this.matrix=a.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},E=a.el;D.prototype=E,E.constructor=D,E.transform=function(b){if(b==null)return this._.transform;var d=this.paper._viewBoxShift,e=d?"s"+[d.scale,d.scale]+"-1-1t"+[d.dx,d.dy]:o,f;d&&(f=b=c(b).replace(/\.{3}|\u2026/g,this._.transform||o)),a._extractTransform(this,e+b);var g=this.matrix.clone(),h=this.skew,i=this.node,j,k=~c(this.attrs.fill).indexOf("-"),l=!c(this.attrs.fill).indexOf("url(");g.translate(-0.5,-0.5);if(l||k||this.type=="image"){h.matrix="1 0 0 1",h.offset="0 0",j=g.split();if(k&&j.noRotation||!j.isSimple){i.style.filter=g.toFilter();var m=this.getBBox(),p=this.getBBox(1),q=m.x-p.x,r=m.y-p.y;i.coordorigin=q*-u+n+r*-u,z(this,1,1,q,r,0)}else i.style.filter=o,z(this,j.scalex,j.scaley,j.dx,j.dy,j.rotate)}else i.style.filter=o,h.matrix=c(g),h.offset=g.offset();f&&(this._.transform=f);return this},E.rotate=function(a,b,e){if(this.removed)return this;if(a!=null){a=c(a).split(k),a.length-1&&(b=d(a[1]),e=d(a[2])),a=d(a[0]),e==null&&(b=e);if(b==null||e==null){var f=this.getBBox(1);b=f.x+f.width/2,e=f.y+f.height/2}this._.dirtyT=1,this.transform(this._.transform.concat([["r",a,b,e]]));return this}},E.translate=function(a,b){if(this.removed)return this;a=c(a).split(k),a.length-1&&(b=d(a[1])),a=d(a[0])||0,b=+b||0,this._.bbox&&(this._.bbox.x+=a,this._.bbox.y+=b),this.transform(this._.transform.concat([["t",a,b]]));return this},E.scale=function(a,b,e,f){if(this.removed)return this;a=c(a).split(k),a.length-1&&(b=d(a[1]),e=d(a[2]),f=d(a[3]),isNaN(e)&&(e=null),isNaN(f)&&(f=null)),a=d(a[0]),b==null&&(b=a),f==null&&(e=f);if(e==null||f==null)var g=this.getBBox(1);e=e==null?g.x+g.width/2:e,f=f==null?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,b,e,f]])),this._.dirtyT=1;return this},E.hide=function(){!this.removed&&(this.node.style.display="none");return this},E.show=function(){!this.removed&&(this.node.style.display=o);return this},E._getBBox=function(){if(this.removed)return{};return{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},E.remove=function(){if(!this.removed&&!!this.node.parentNode){this.paper.__set__&&this.paper.__set__.exclude(this),a.eve.unbind("raphael.*.*."+this.id),a._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var b in this)this[b]=typeof this[b]=="function"?a._removedFactory(b):null;this.removed=!0}},E.attr=function(c,d){if(this.removed)return this;if(c==null){var e={};for(var f in this.attrs)this.attrs[b](f)&&(e[f]=this.attrs[f]);e.gradient&&e.fill=="none"&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform;return e}if(d==null&&a.is(c,"string")){if(c==j&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;var g=c.split(k),h={};for(var i=0,m=g.length;i<m;i++)c=g[i],c in this.attrs?h[c]=this.attrs[c]:a.is(this.paper.customAttributes[c],"function")?h[c]=this.paper.customAttributes[c].def:h[c]=a._availableAttrs[c];return m-1?h:h[g[0]]}if(this.attrs&&d==null&&a.is(c,"array")){h={};for(i=0,m=c.length;i<m;i++)h[c[i]]=this.attr(c[i]);return h}var n;d!=null&&(n={},n[c]=d),d==null&&a.is(c,"object")&&(n=c);for(var o in n)l("raphael.attr."+o+"."+this.id,this,n[o]);if(n){for(o in this.paper.customAttributes)if(this.paper.customAttributes[b](o)&&n[b](o)&&a.is(this.paper.customAttributes[o],"function")){var p=this.paper.customAttributes[o].apply(this,[].concat(n[o]));this.attrs[o]=n[o];for(var q in p)p[b](q)&&(n[q]=p[q])}n.text&&this.type=="text"&&(this.textpath.string=n.text),B(this,n)}return this},E.toFront=function(){!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&a._tofront(this,this.paper);return this},E.toBack=function(){if(this.removed)return this;this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),a._toback(this,this.paper));return this},E.insertAfter=function(b){if(this.removed)return this;b.constructor==a.st.constructor&&(b=b[b.length-1]),b.node.nextSibling?b.node.parentNode.insertBefore(this.node,b.node.nextSibling):b.node.parentNode.appendChild(this.node),a._insertafter(this,b,this.paper);return this},E.insertBefore=function(b){if(this.removed)return this;b.constructor==a.st.constructor&&(b=b[0]),b.node.parentNode.insertBefore(this.node,b.node),a._insertbefore(this,b,this.paper);return this},E.blur=function(b){var c=this.node.runtimeStyle,d=c.filter;d=d.replace(r,o),+b!==0?(this.attrs.blur=b,c.filter=d+n+m+".Blur(pixelradius="+(+b||1.5)+")",c.margin=a.format("-{0}px 0 0 -{0}px",f(+b||1.5))):(c.filter=d,c.margin=0,delete this.attrs.blur)},a._engine.path=function(a,b){var c=F("shape");c.style.cssText=t,c.coordsize=u+n+u,c.coordorigin=b.coordorigin;var d=new D(c,b),e={fill:"none",stroke:"#000"};a&&(e.path=a),d.type="path",d.path=[],d.Path=o,B(d,e),b.canvas.appendChild(c);var f=F("skew");f.on=!0,c.appendChild(f),d.skew=f,d.transform(o);return d},a._engine.rect=function(b,c,d,e,f,g){var h=a._rectPath(c,d,e,f,g),i=b.path(h),j=i.attrs;i.X=j.x=c,i.Y=j.y=d,i.W=j.width=e,i.H=j.height=f,j.r=g,j.path=h,i.type="rect";return i},a._engine.ellipse=function(a,b,c,d,e){var f=a.path(),g=f.attrs;f.X=b-d,f.Y=c-e,f.W=d*2,f.H=e*2,f.type="ellipse",B(f,{cx:b,cy:c,rx:d,ry:e});return f},a._engine.circle=function(a,b,c,d){var e=a.path(),f=e.attrs;e.X=b-d,e.Y=c-d,e.W=e.H=d*2,e.type="circle",B(e,{cx:b,cy:c,r:d});return e},a._engine.image=function(b,c,d,e,f,g){var h=a._rectPath(d,e,f,g),i=b.path(h).attr({stroke:"none"}),k=i.attrs,l=i.node,m=l.getElementsByTagName(j)[0];k.src=c,i.X=k.x=d,i.Y=k.y=e,i.W=k.width=f,i.H=k.height=g,k.path=h,i.type="image",m.parentNode==l&&l.removeChild(m),m.rotate=!0,m.src=c,m.type="tile",i._.fillpos=[d,e],i._.fillsize=[f,g],l.appendChild(m),z(i,1,1,0,0,0);return i},a._engine.text=function(b,d,e,g){var h=F("shape"),i=F("path"),j=F("textpath");d=d||0,e=e||0,g=g||"",i.v=a.format("m{0},{1}l{2},{1}",f(d*u),f(e*u),f(d*u)+1),i.textpathok=!0,j.string=c(g),j.on=!0,h.style.cssText=t,h.coordsize=u+n+u,h.coordorigin="0 0";var k=new D(h,b),l={fill:"#000",stroke:"none",font:a._availableAttrs.font,text:g};k.shape=h,k.path=i,k.textpath=j,k.type="text",k.attrs.text=c(g),k.attrs.x=d,k.attrs.y=e,k.attrs.w=1,k.attrs.h=1,B(k,l),h.appendChild(j),h.appendChild(i),b.canvas.appendChild(h);var m=F("skew");m.on=!0,h.appendChild(m),k.skew=m,k.transform(o);return k},a._engine.setSize=function(b,c){var d=this.canvas.style;this.width=b,this.height=c,b==+b&&(b+="px"),c==+c&&(c+="px"),d.width=b,d.height=c,d.clip="rect(0 "+b+" "+c+" 0)",this._viewBox&&a._engine.setViewBox.apply(this,this._viewBox);return this},a._engine.setViewBox=function(b,c,d,e,f){a.eve("raphael.setViewBox",this,this._viewBox,[b,c,d,e,f]);var h=this.width,i=this.height,j=1/g(d/h,e/i),k,l;f&&(k=i/e,l=h/d,d*k<h&&(b-=(h-d*k)/2/k),e*l<i&&(c-=(i-e*l)/2/l)),this._viewBox=[b,c,d,e,!!f],this._viewBoxShift={dx:-b,dy:-c,scale:j},this.forEach(function(a){a.transform("...")});return this};var F;a._engine.initWin=function(a){var b=a.document;b.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!b.namespaces.rvml&&b.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),F=function(a){return b.createElement("<rvml:"+a+' class="rvml">')}}catch(c){F=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},a._engine.initWin(a._g.win),a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b.container,d=b.height,e,f=b.width,g=b.x,h=b.y;if(!c)throw new Error("VML container not found.");var i=new a._Paper,j=i.canvas=a._g.doc.createElement("div"),k=j.style;g=g||0,h=h||0,f=f||512,d=d||342,i.width=f,i.height=d,f==+f&&(f+="px"),d==+d&&(d+="px"),i.coordsize=u*1e3+n+u*1e3,i.coordorigin="0 0",i.span=a._g.doc.createElement("span"),i.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",j.appendChild(i.span),k.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",f,d),c==1?(a._g.doc.body.appendChild(j),k.left=g+"px",k.top=h+"px",k.position="absolute"):c.firstChild?c.insertBefore(j,c.firstChild):c.appendChild(j),i.renderfix=function(){};return i},a.prototype.clear=function(){a.eve("raphael.clear",this),this.canvas.innerHTML=o,this.span=a._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},a.prototype.remove=function(){a.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]=typeof this[b]=="function"?a._removedFactory(b):null;return!0};var G=a.st;for(var H in E)E[b](H)&&!G[b](H)&&(G[H]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(H))}(window.Raphael) \ No newline at end of file diff --git a/theme/bootstrap/font-awesome/css/font-awesome.css b/theme/bootstrap/font-awesome/css/font-awesome.css new file mode 100644 index 0000000..4040b3c --- /dev/null +++ b/theme/bootstrap/font-awesome/css/font-awesome.css @@ -0,0 +1,1672 @@ +/*! + * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.2.0'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.28571429em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.85714286em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fa-rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-desc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-asc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} +.fa-space-shuttle:before { + content: "\f197"; +} +.fa-slack:before { + content: "\f198"; +} +.fa-envelope-square:before { + content: "\f199"; +} +.fa-wordpress:before { + content: "\f19a"; +} +.fa-openid:before { + content: "\f19b"; +} +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: "\f19c"; +} +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: "\f19d"; +} +.fa-yahoo:before { + content: "\f19e"; +} +.fa-google:before { + content: "\f1a0"; +} +.fa-reddit:before { + content: "\f1a1"; +} +.fa-reddit-square:before { + content: "\f1a2"; +} +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} +.fa-stumbleupon:before { + content: "\f1a4"; +} +.fa-delicious:before { + content: "\f1a5"; +} +.fa-digg:before { + content: "\f1a6"; +} +.fa-pied-piper:before { + content: "\f1a7"; +} +.fa-pied-piper-alt:before { + content: "\f1a8"; +} +.fa-drupal:before { + content: "\f1a9"; +} +.fa-joomla:before { + content: "\f1aa"; +} +.fa-language:before { + content: "\f1ab"; +} +.fa-fax:before { + content: "\f1ac"; +} +.fa-building:before { + content: "\f1ad"; +} +.fa-child:before { + content: "\f1ae"; +} +.fa-paw:before { + content: "\f1b0"; +} +.fa-spoon:before { + content: "\f1b1"; +} +.fa-cube:before { + content: "\f1b2"; +} +.fa-cubes:before { + content: "\f1b3"; +} +.fa-behance:before { + content: "\f1b4"; +} +.fa-behance-square:before { + content: "\f1b5"; +} +.fa-steam:before { + content: "\f1b6"; +} +.fa-steam-square:before { + content: "\f1b7"; +} +.fa-recycle:before { + content: "\f1b8"; +} +.fa-automobile:before, +.fa-car:before { + content: "\f1b9"; +} +.fa-cab:before, +.fa-taxi:before { + content: "\f1ba"; +} +.fa-tree:before { + content: "\f1bb"; +} +.fa-spotify:before { + content: "\f1bc"; +} +.fa-deviantart:before { + content: "\f1bd"; +} +.fa-soundcloud:before { + content: "\f1be"; +} +.fa-database:before { + content: "\f1c0"; +} +.fa-file-pdf-o:before { + content: "\f1c1"; +} +.fa-file-word-o:before { + content: "\f1c2"; +} +.fa-file-excel-o:before { + content: "\f1c3"; +} +.fa-file-powerpoint-o:before { + content: "\f1c4"; +} +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: "\f1c5"; +} +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: "\f1c6"; +} +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: "\f1c7"; +} +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: "\f1c8"; +} +.fa-file-code-o:before { + content: "\f1c9"; +} +.fa-vine:before { + content: "\f1ca"; +} +.fa-codepen:before { + content: "\f1cb"; +} +.fa-jsfiddle:before { + content: "\f1cc"; +} +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: "\f1cd"; +} +.fa-circle-o-notch:before { + content: "\f1ce"; +} +.fa-ra:before, +.fa-rebel:before { + content: "\f1d0"; +} +.fa-ge:before, +.fa-empire:before { + content: "\f1d1"; +} +.fa-git-square:before { + content: "\f1d2"; +} +.fa-git:before { + content: "\f1d3"; +} +.fa-hacker-news:before { + content: "\f1d4"; +} +.fa-tencent-weibo:before { + content: "\f1d5"; +} +.fa-qq:before { + content: "\f1d6"; +} +.fa-wechat:before, +.fa-weixin:before { + content: "\f1d7"; +} +.fa-send:before, +.fa-paper-plane:before { + content: "\f1d8"; +} +.fa-send-o:before, +.fa-paper-plane-o:before { + content: "\f1d9"; +} +.fa-history:before { + content: "\f1da"; +} +.fa-circle-thin:before { + content: "\f1db"; +} +.fa-header:before { + content: "\f1dc"; +} +.fa-paragraph:before { + content: "\f1dd"; +} +.fa-sliders:before { + content: "\f1de"; +} +.fa-share-alt:before { + content: "\f1e0"; +} +.fa-share-alt-square:before { + content: "\f1e1"; +} +.fa-bomb:before { + content: "\f1e2"; +} +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: "\f1e3"; +} +.fa-tty:before { + content: "\f1e4"; +} +.fa-binoculars:before { + content: "\f1e5"; +} +.fa-plug:before { + content: "\f1e6"; +} +.fa-slideshare:before { + content: "\f1e7"; +} +.fa-twitch:before { + content: "\f1e8"; +} +.fa-yelp:before { + content: "\f1e9"; +} +.fa-newspaper-o:before { + content: "\f1ea"; +} +.fa-wifi:before { + content: "\f1eb"; +} +.fa-calculator:before { + content: "\f1ec"; +} +.fa-paypal:before { + content: "\f1ed"; +} +.fa-google-wallet:before { + content: "\f1ee"; +} +.fa-cc-visa:before { + content: "\f1f0"; +} +.fa-cc-mastercard:before { + content: "\f1f1"; +} +.fa-cc-discover:before { + content: "\f1f2"; +} +.fa-cc-amex:before { + content: "\f1f3"; +} +.fa-cc-paypal:before { + content: "\f1f4"; +} +.fa-cc-stripe:before { + content: "\f1f5"; +} +.fa-bell-slash:before { + content: "\f1f6"; +} +.fa-bell-slash-o:before { + content: "\f1f7"; +} +.fa-trash:before { + content: "\f1f8"; +} +.fa-copyright:before { + content: "\f1f9"; +} +.fa-at:before { + content: "\f1fa"; +} +.fa-eyedropper:before { + content: "\f1fb"; +} +.fa-paint-brush:before { + content: "\f1fc"; +} +.fa-birthday-cake:before { + content: "\f1fd"; +} +.fa-area-chart:before { + content: "\f1fe"; +} +.fa-pie-chart:before { + content: "\f200"; +} +.fa-line-chart:before { + content: "\f201"; +} +.fa-lastfm:before { + content: "\f202"; +} +.fa-lastfm-square:before { + content: "\f203"; +} +.fa-toggle-off:before { + content: "\f204"; +} +.fa-toggle-on:before { + content: "\f205"; +} +.fa-bicycle:before { + content: "\f206"; +} +.fa-bus:before { + content: "\f207"; +} +.fa-ioxhost:before { + content: "\f208"; +} +.fa-angellist:before { + content: "\f209"; +} +.fa-cc:before { + content: "\f20a"; +} +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: "\f20b"; +} +.fa-meanpath:before { + content: "\f20c"; +} diff --git a/theme/bootstrap/font-awesome/css/font-awesome.min.css b/theme/bootstrap/font-awesome/css/font-awesome.min.css new file mode 100644 index 0000000..ec53d4d --- /dev/null +++ b/theme/bootstrap/font-awesome/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"} \ No newline at end of file diff --git a/theme/bootstrap/font-awesome/fonts/FontAwesome.otf b/theme/bootstrap/font-awesome/fonts/FontAwesome.otf new file mode 100644 index 0000000..81c9ad9 Binary files /dev/null and b/theme/bootstrap/font-awesome/fonts/FontAwesome.otf differ diff --git a/theme/bootstrap/font-awesome/fonts/fontawesome-webfont.eot b/theme/bootstrap/font-awesome/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..84677bc Binary files /dev/null and b/theme/bootstrap/font-awesome/fonts/fontawesome-webfont.eot differ diff --git a/theme/bootstrap/font-awesome/fonts/fontawesome-webfont.svg b/theme/bootstrap/font-awesome/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..d907b25 --- /dev/null +++ b/theme/bootstrap/font-awesome/fonts/fontawesome-webfont.svg @@ -0,0 +1,520 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata></metadata> +<defs> +<font id="fontawesomeregular" horiz-adv-x="1536" > +<font-face units-per-em="1792" ascent="1536" descent="-256" /> +<missing-glyph horiz-adv-x="448" /> +<glyph unicode=" " horiz-adv-x="448" /> +<glyph unicode="&#x09;" horiz-adv-x="448" /> +<glyph unicode="&#xa0;" horiz-adv-x="448" /> +<glyph unicode="&#xa8;" horiz-adv-x="1792" /> +<glyph unicode="&#xa9;" horiz-adv-x="1792" /> +<glyph unicode="&#xae;" horiz-adv-x="1792" /> +<glyph unicode="&#xb4;" horiz-adv-x="1792" /> +<glyph unicode="&#xc6;" horiz-adv-x="1792" /> +<glyph unicode="&#xd8;" horiz-adv-x="1792" /> +<glyph unicode="&#x2000;" horiz-adv-x="768" /> +<glyph unicode="&#x2001;" horiz-adv-x="1537" /> +<glyph unicode="&#x2002;" horiz-adv-x="768" /> +<glyph unicode="&#x2003;" horiz-adv-x="1537" /> +<glyph unicode="&#x2004;" horiz-adv-x="512" /> +<glyph unicode="&#x2005;" horiz-adv-x="384" /> +<glyph unicode="&#x2006;" horiz-adv-x="256" /> +<glyph unicode="&#x2007;" horiz-adv-x="256" /> +<glyph unicode="&#x2008;" horiz-adv-x="192" /> +<glyph unicode="&#x2009;" horiz-adv-x="307" /> +<glyph unicode="&#x200a;" horiz-adv-x="85" /> +<glyph unicode="&#x202f;" horiz-adv-x="307" /> +<glyph unicode="&#x205f;" horiz-adv-x="384" /> +<glyph unicode="&#x2122;" horiz-adv-x="1792" /> +<glyph unicode="&#x221e;" horiz-adv-x="1792" /> +<glyph unicode="&#x2260;" horiz-adv-x="1792" /> +<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" /> +<glyph unicode="&#xf000;" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" /> +<glyph unicode="&#xf001;" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" /> +<glyph unicode="&#xf002;" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> +<glyph unicode="&#xf003;" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> +<glyph unicode="&#xf004;" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" /> +<glyph unicode="&#xf005;" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" /> +<glyph unicode="&#xf006;" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" /> +<glyph unicode="&#xf007;" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" /> +<glyph unicode="&#xf008;" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> +<glyph unicode="&#xf009;" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> +<glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" /> +<glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" /> +<glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" /> +<glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" /> +<glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> +<glyph unicode="&#xf010;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " /> +<glyph unicode="&#xf011;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" /> +<glyph unicode="&#xf012;" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf013;" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" /> +<glyph unicode="&#xf014;" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf015;" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" /> +<glyph unicode="&#xf016;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z " /> +<glyph unicode="&#xf017;" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf018;" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" /> +<glyph unicode="&#xf019;" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" /> +<glyph unicode="&#xf01a;" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf01b;" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf01c;" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" /> +<glyph unicode="&#xf01d;" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf01e;" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" /> +<glyph unicode="&#xf021;" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" /> +<glyph unicode="&#xf022;" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" /> +<glyph unicode="&#xf023;" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" /> +<glyph unicode="&#xf024;" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf025;" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" /> +<glyph unicode="&#xf026;" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" /> +<glyph unicode="&#xf027;" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" /> +<glyph unicode="&#xf028;" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" /> +<glyph unicode="&#xf029;" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" /> +<glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" /> +<glyph unicode="&#xf02b;" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" /> +<glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" /> +<glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" /> +<glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" /> +<glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" /> +<glyph unicode="&#xf030;" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> +<glyph unicode="&#xf031;" horiz-adv-x="1664" d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57 q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5 q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" /> +<glyph unicode="&#xf032;" horiz-adv-x="1408" d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142 q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5 t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68.5 -0.5t67.5 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5 t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" /> +<glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q6 2 81.5 21.5t111.5 37.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" /> +<glyph unicode="&#xf034;" horiz-adv-x="1792" d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2 t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5 q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" /> +<glyph unicode="&#xf035;" d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1 t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5 t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49 t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" /> +<glyph unicode="&#xf036;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf037;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf038;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf039;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" /> +<glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> +<glyph unicode="&#xf040;" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" /> +<glyph unicode="&#xf041;" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" /> +<glyph unicode="&#xf042;" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf043;" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" /> +<glyph unicode="&#xf044;" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" /> +<glyph unicode="&#xf045;" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" /> +<glyph unicode="&#xf046;" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" /> +<glyph unicode="&#xf047;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" /> +<glyph unicode="&#xf048;" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" /> +<glyph unicode="&#xf049;" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" /> +<glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" /> +<glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" /> +<glyph unicode="&#xf04c;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf04d;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" /> +<glyph unicode="&#xf050;" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" /> +<glyph unicode="&#xf051;" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" /> +<glyph unicode="&#xf052;" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" /> +<glyph unicode="&#xf053;" horiz-adv-x="1280" d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" /> +<glyph unicode="&#xf054;" horiz-adv-x="1280" d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" /> +<glyph unicode="&#xf055;" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf056;" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" /> +<glyph unicode="&#xf057;" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf058;" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf059;" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf05a;" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf05b;" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf05c;" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf05d;" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf05e;" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" /> +<glyph unicode="&#xf060;" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" /> +<glyph unicode="&#xf061;" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" /> +<glyph unicode="&#xf062;" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" /> +<glyph unicode="&#xf063;" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" /> +<glyph unicode="&#xf064;" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" /> +<glyph unicode="&#xf065;" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf066;" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" /> +<glyph unicode="&#xf067;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" /> +<glyph unicode="&#xf068;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" /> +<glyph unicode="&#xf069;" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" /> +<glyph unicode="&#xf06a;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" /> +<glyph unicode="&#xf06b;" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" /> +<glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" /> +<glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" /> +<glyph unicode="&#xf070;" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " /> +<glyph unicode="&#xf071;" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" /> +<glyph unicode="&#xf072;" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" /> +<glyph unicode="&#xf073;" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> +<glyph unicode="&#xf074;" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" /> +<glyph unicode="&#xf075;" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" /> +<glyph unicode="&#xf076;" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf077;" horiz-adv-x="1792" d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" /> +<glyph unicode="&#xf078;" horiz-adv-x="1792" d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" /> +<glyph unicode="&#xf079;" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " /> +<glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5 l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5 t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> +<glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" /> +<glyph unicode="&#xf07d;" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" /> +<glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" /> +<glyph unicode="&#xf080;" horiz-adv-x="2048" d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" /> +<glyph unicode="&#xf081;" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf082;" d="M1536 160q0 -119 -84.5 -203.5t-203.5 -84.5h-192v608h203l30 224h-233v143q0 54 28 83t96 29l132 1v207q-96 9 -180 9q-136 0 -218 -80.5t-82 -225.5v-166h-224v-224h224v-608h-544q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 q119 0 203.5 -84.5t84.5 -203.5v-960z" /> +<glyph unicode="&#xf083;" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" /> +<glyph unicode="&#xf084;" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" /> +<glyph unicode="&#xf085;" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" /> +<glyph unicode="&#xf086;" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" /> +<glyph unicode="&#xf087;" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" /> +<glyph unicode="&#xf088;" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" /> +<glyph unicode="&#xf089;" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" /> +<glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" /> +<glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" /> +<glyph unicode="&#xf08c;" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" /> +<glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf090;" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf091;" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" /> +<glyph unicode="&#xf092;" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf093;" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" /> +<glyph unicode="&#xf094;" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" /> +<glyph unicode="&#xf095;" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" /> +<glyph unicode="&#xf096;" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf097;" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" /> +<glyph unicode="&#xf098;" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf099;" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" /> +<glyph unicode="&#xf09a;" horiz-adv-x="1024" d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" /> +<glyph unicode="&#xf09b;" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" /> +<glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" /> +<glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" /> +<glyph unicode="&#xf0a0;" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" /> +<glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" /> +<glyph unicode="&#xf0a2;" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5 t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" /> +<glyph unicode="&#xf0a3;" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" /> +<glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" /> +<glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" /> +<glyph unicode="&#xf0a6;" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" /> +<glyph unicode="&#xf0a7;" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" /> +<glyph unicode="&#xf0a8;" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf0a9;" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf0aa;" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf0ab;" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf0ac;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" /> +<glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" /> +<glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" /> +<glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" /> +<glyph unicode="&#xf0b2;" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " /> +<glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" /> +<glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" /> +<glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " /> +<glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" /> +<glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" /> +<glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" /> +<glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" /> +<glyph unicode="&#xf0c7;" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" /> +<glyph unicode="&#xf0c8;" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf0c9;" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" /> +<glyph unicode="&#xf0cd;" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" /> +<glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" /> +<glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" /> +<glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf0d2;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf0d3;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" /> +<glyph unicode="&#xf0d4;" d="M829 318q0 -76 -58.5 -112.5t-139.5 -36.5q-41 0 -80.5 9.5t-75.5 28.5t-58 53t-22 78q0 46 25 80t65.5 51.5t82 25t84.5 7.5q20 0 31 -2q2 -1 23 -16.5t26 -19t23 -18t24.5 -22t19 -22.5t17 -26t9 -26.5t4.5 -31.5zM755 863q0 -60 -33 -99.5t-92 -39.5q-53 0 -93 42.5 t-57.5 96.5t-17.5 106q0 61 32 104t92 43q53 0 93.5 -45t58 -101t17.5 -107zM861 1120l88 64h-265q-85 0 -161 -32t-127.5 -98t-51.5 -153q0 -93 64.5 -154.5t158.5 -61.5q22 0 43 3q-13 -29 -13 -54q0 -44 40 -94q-175 -12 -257 -63q-47 -29 -75.5 -73t-28.5 -95 q0 -43 18.5 -77.5t48.5 -56.5t69 -37t77.5 -21t76.5 -6q60 0 120.5 15.5t113.5 46t86 82.5t33 117q0 49 -20 89.5t-49 66.5t-58 47.5t-49 44t-20 44.5t15.5 42.5t37.5 39.5t44 42t37.5 59.5t15.5 82.5q0 60 -22.5 99.5t-72.5 90.5h83zM1152 672h128v64h-128v128h-64v-128 h-128v-64h128v-160h64v160zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M735 740q0 -36 32 -70.5t77.5 -68t90.5 -73.5t77 -104t32 -142q0 -90 -48 -173q-72 -122 -211 -179.5t-298 -57.5q-132 0 -246.5 41.5t-171.5 137.5q-37 60 -37 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 42 -47.5 74t-15.5 73q0 36 21 85q-46 -4 -68 -4 q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q77 66 182.5 98t217.5 32h418l-138 -88h-131q74 -63 112 -133t38 -160q0 -72 -24.5 -129.5t-59 -93t-69.5 -65t-59.5 -61.5t-24.5 -66zM589 836q38 0 78 16.5t66 43.5q53 57 53 159q0 58 -17 125t-48.5 129.5 t-84.5 103.5t-117 41q-42 0 -82.5 -19.5t-65.5 -52.5q-47 -59 -47 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26zM591 -37q58 0 111.5 13t99 39t73 73t27.5 109q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -48 2 q-53 0 -105 -7t-107.5 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -70 35 -123.5t91.5 -83t119 -44t127.5 -14.5zM1401 839h213v-108h-213v-219h-105v219h-212v108h212v217h105v-217z" /> +<glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> +<glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" /> +<glyph unicode="&#xf0da;" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" /> +<glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" /> +<glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> +<glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> +<glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" /> +<glyph unicode="&#xf0e1;" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" /> +<glyph unicode="&#xf0e2;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" /> +<glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" /> +<glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> +<glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" /> +<glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" /> +<glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" /> +<glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" /> +<glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" /> +<glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" /> +<glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" /> +<glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" /> +<glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" /> +<glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" /> +<glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" /> +<glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" /> +<glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" /> +<glyph unicode="&#xf0f3;" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5 t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" /> +<glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" /> +<glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf0f6;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704 q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" /> +<glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" /> +<glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" /> +<glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" /> +<glyph unicode="&#xf0fd;" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf0fe;" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf100;" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" /> +<glyph unicode="&#xf101;" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> +<glyph unicode="&#xf102;" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> +<glyph unicode="&#xf103;" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> +<glyph unicode="&#xf104;" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> +<glyph unicode="&#xf105;" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> +<glyph unicode="&#xf106;" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> +<glyph unicode="&#xf107;" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> +<glyph unicode="&#xf108;" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> +<glyph unicode="&#xf109;" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" /> +<glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" /> +<glyph unicode="&#xf10b;" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> +<glyph unicode="&#xf10c;" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" /> +<glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" /> +<glyph unicode="&#xf110;" horiz-adv-x="1568" d="M496 192q0 -60 -42.5 -102t-101.5 -42q-60 0 -102 42t-42 102t42 102t102 42q59 0 101.5 -42t42.5 -102zM928 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -66 -47 -113t-113 -47t-113 47t-47 113 t47 113t113 47t113 -47t47 -113zM1360 192q0 -46 -33 -79t-79 -33t-79 33t-33 79t33 79t79 33t79 -33t33 -79zM528 1088q0 -73 -51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5t51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5zM992 1280q0 -80 -56 -136t-136 -56 t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1536 640q0 -40 -28 -68t-68 -28t-68 28t-28 68t28 68t68 28t68 -28t28 -68zM1328 1088q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5z" /> +<glyph unicode="&#xf111;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf112;" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" /> +<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" /> +<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> +<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " /> +<glyph unicode="&#xf116;" horiz-adv-x="1792" /> +<glyph unicode="&#xf117;" horiz-adv-x="1792" /> +<glyph unicode="&#xf118;" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf119;" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf11a;" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" /> +<glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" /> +<glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" /> +<glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" /> +<glyph unicode="&#xf120;" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" /> +<glyph unicode="&#xf121;" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" /> +<glyph unicode="&#xf122;" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" /> +<glyph unicode="&#xf123;" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" /> +<glyph unicode="&#xf124;" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" /> +<glyph unicode="&#xf125;" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf126;" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" /> +<glyph unicode="&#xf127;" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" /> +<glyph unicode="&#xf128;" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" /> +<glyph unicode="&#xf129;" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf12a;" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" /> +<glyph unicode="&#xf12b;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" /> +<glyph unicode="&#xf12c;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" /> +<glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" /> +<glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" /> +<glyph unicode="&#xf130;" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" /> +<glyph unicode="&#xf131;" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" /> +<glyph unicode="&#xf132;" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf133;" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> +<glyph unicode="&#xf134;" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" /> +<glyph unicode="&#xf135;" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" /> +<glyph unicode="&#xf136;" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" /> +<glyph unicode="&#xf137;" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf138;" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf139;" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf13a;" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" /> +<glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" /> +<glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" /> +<glyph unicode="&#xf140;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf141;" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" /> +<glyph unicode="&#xf142;" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" /> +<glyph unicode="&#xf143;" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf144;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" /> +<glyph unicode="&#xf145;" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" /> +<glyph unicode="&#xf146;" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" /> +<glyph unicode="&#xf147;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf148;" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" /> +<glyph unicode="&#xf149;" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" /> +<glyph unicode="&#xf14a;" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf14b;" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf14c;" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf14d;" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf14e;" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf150;" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf151;" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf152;" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf153;" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" /> +<glyph unicode="&#xf154;" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" /> +<glyph unicode="&#xf155;" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" /> +<glyph unicode="&#xf156;" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf157;" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" /> +<glyph unicode="&#xf158;" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" /> +<glyph unicode="&#xf159;" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" /> +<glyph unicode="&#xf15b;" d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" /> +<glyph unicode="&#xf15c;" d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" /> +<glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" /> +<glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" /> +<glyph unicode="&#xf160;" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf161;" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf162;" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" /> +<glyph unicode="&#xf163;" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" /> +<glyph unicode="&#xf164;" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" /> +<glyph unicode="&#xf165;" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" /> +<glyph unicode="&#xf166;" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf167;" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" /> +<glyph unicode="&#xf168;" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" /> +<glyph unicode="&#xf169;" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" /> +<glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" /> +<glyph unicode="&#xf16c;" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" /> +<glyph unicode="&#xf16d;" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" /> +<glyph unicode="&#xf16e;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" /> +<glyph unicode="&#xf170;" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf171;" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" /> +<glyph unicode="&#xf172;" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf173;" horiz-adv-x="1024" d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14 q78 2 134 29z" /> +<glyph unicode="&#xf174;" d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf175;" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" /> +<glyph unicode="&#xf176;" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" /> +<glyph unicode="&#xf177;" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf178;" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" /> +<glyph unicode="&#xf179;" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" /> +<glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" /> +<glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" /> +<glyph unicode="&#xf17c;" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" /> +<glyph unicode="&#xf17d;" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf17e;" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" /> +<glyph unicode="&#xf180;" horiz-adv-x="1280" d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324 l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" /> +<glyph unicode="&#xf181;" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf182;" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> +<glyph unicode="&#xf183;" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> +<glyph unicode="&#xf184;" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf185;" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" /> +<glyph unicode="&#xf186;" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" /> +<glyph unicode="&#xf187;" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf188;" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" /> +<glyph unicode="&#xf189;" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" /> +<glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" /> +<glyph unicode="&#xf18b;" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" /> +<glyph unicode="&#xf18c;" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" /> +<glyph unicode="&#xf18d;" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " /> +<glyph unicode="&#xf18e;" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf190;" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf191;" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf192;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf193;" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 16 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" /> +<glyph unicode="&#xf194;" d="M1254 899q16 85 -21 132q-52 65 -187 45q-17 -3 -41 -12.5t-57.5 -30.5t-64.5 -48.5t-59.5 -70t-44.5 -91.5q80 7 113.5 -16t26.5 -99q-5 -52 -52 -143q-43 -78 -71 -99q-44 -32 -87 14q-23 24 -37.5 64.5t-19 73t-10 84t-8.5 71.5q-23 129 -34 164q-12 37 -35.5 69 t-50.5 40q-57 16 -127 -25q-54 -32 -136.5 -106t-122.5 -102v-7q16 -8 25.5 -26t21.5 -20q21 -3 54.5 8.5t58 10.5t41.5 -30q11 -18 18.5 -38.5t15 -48t12.5 -40.5q17 -46 53 -187q36 -146 57 -197q42 -99 103 -125q43 -12 85 -1.5t76 31.5q131 77 250 237 q104 139 172.5 292.5t82.5 226.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf195;" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf196;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf197;" horiz-adv-x="2176" d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40 t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29 q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" /> +<glyph unicode="&#xf198;" horiz-adv-x="1664" d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9 q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102 t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" /> +<glyph unicode="&#xf199;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69 q-46 32 -141.5 92.5t-142.5 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13 t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" /> +<glyph unicode="&#xf19a;" horiz-adv-x="1792" d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5 t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21 t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286 t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273 t273 -182.5t331.5 -68z" /> +<glyph unicode="&#xf19b;" horiz-adv-x="1792" d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" /> +<glyph unicode="&#xf19c;" horiz-adv-x="2048" d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64 q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" /> +<glyph unicode="&#xf19d;" horiz-adv-x="2304" d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433 q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" /> +<glyph unicode="&#xf19e;" d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q43 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0 q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" /> +<glyph unicode="&#xf1a0;" horiz-adv-x="1280" d="M981 197q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -49 2q-53 0 -104.5 -7t-107 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -56 23.5 -102t61 -75.5t87 -50t100 -29t101.5 -8.5q58 0 111.5 13t99 39t73 73t27.5 109zM864 1055 q0 59 -17 125.5t-48 129t-84 103.5t-117 41q-42 0 -82.5 -19.5t-66.5 -52.5q-46 -59 -46 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26q37 0 77.5 16.5t65.5 43.5q53 56 53 159zM752 1536h417l-137 -88h-132q75 -63 113 -133t38 -160q0 -72 -24.5 -129.5 t-59.5 -93t-69.5 -65t-59 -61.5t-24.5 -66q0 -36 32 -70.5t77 -68t90.5 -73.5t77.5 -104t32 -142q0 -91 -49 -173q-71 -122 -209.5 -179.5t-298.5 -57.5q-132 0 -246.5 41.5t-172.5 137.5q-36 59 -36 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 41 -47.5 73.5 t-15.5 73.5q0 40 21 85q-46 -4 -68 -4q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q76 66 182 98t218 32z" /> +<glyph unicode="&#xf1a1;" horiz-adv-x="1984" d="M831 572q0 -56 -40.5 -96t-96.5 -40q-57 0 -98 40t-41 96q0 57 41.5 98t97.5 41t96.5 -41t40.5 -98zM1292 711q56 0 96.5 -41t40.5 -98q0 -56 -40.5 -96t-96.5 -40q-57 0 -98 40t-41 96q0 57 41.5 98t97.5 41zM1984 722q0 -62 -31 -114t-83 -82q5 -33 5 -61 q0 -121 -68.5 -230.5t-197.5 -193.5q-125 -82 -285.5 -125.5t-335.5 -43.5q-176 0 -336.5 43.5t-284.5 125.5q-129 84 -197.5 193t-68.5 231q0 29 5 66q-48 31 -77 81.5t-29 109.5q0 94 66 160t160 66q83 0 148 -55q248 158 592 164l134 423q4 14 17.5 21.5t28.5 4.5 l347 -82q22 50 68.5 81t102.5 31q77 0 131.5 -54.5t54.5 -131.5t-54.5 -132t-131.5 -55q-76 0 -130.5 54t-55.5 131l-315 74l-116 -366q327 -14 560 -166q64 58 151 58q94 0 160 -66t66 -160zM1664 1459q-45 0 -77 -32t-32 -77t32 -77t77 -32t77 32t32 77t-32 77t-77 32z M77 722q0 -67 51 -111q49 131 180 235q-36 25 -82 25q-62 0 -105.5 -43.5t-43.5 -105.5zM1567 105q112 73 171.5 166t59.5 194t-59.5 193.5t-171.5 165.5q-116 75 -265.5 115.5t-313.5 40.5t-313.5 -40.5t-265.5 -115.5q-112 -73 -171.5 -165.5t-59.5 -193.5t59.5 -194 t171.5 -166q116 -75 265.5 -115.5t313.5 -40.5t313.5 40.5t265.5 115.5zM1850 605q57 46 57 117q0 62 -43.5 105.5t-105.5 43.5q-49 0 -86 -28q131 -105 178 -238zM1258 237q11 11 27 11t27 -11t11 -27.5t-11 -27.5q-99 -99 -319 -99h-2q-220 0 -319 99q-11 11 -11 27.5 t11 27.5t27 11t27 -11q77 -77 265 -77h2q188 0 265 77z" /> +<glyph unicode="&#xf1a2;" d="M950 393q7 7 17.5 7t17.5 -7t7 -18t-7 -18q-65 -64 -208 -64h-1h-1q-143 0 -207 64q-8 7 -8 18t8 18q7 7 17.5 7t17.5 -7q49 -51 172 -51h1h1q122 0 173 51zM671 613q0 -37 -26 -64t-63 -27t-63 27t-26 64t26 63t63 26t63 -26t26 -63zM1214 1049q-29 0 -50 21t-21 50 q0 30 21 51t50 21q30 0 51 -21t21 -51q0 -29 -21 -50t-51 -21zM1216 1408q132 0 226 -94t94 -227v-894q0 -133 -94 -227t-226 -94h-896q-132 0 -226 94t-94 227v894q0 133 94 227t226 94h896zM1321 596q35 14 57 45.5t22 70.5q0 51 -36 87.5t-87 36.5q-60 0 -98 -48 q-151 107 -375 115l83 265l206 -49q1 -50 36.5 -85t84.5 -35q50 0 86 35.5t36 85.5t-36 86t-86 36q-36 0 -66 -20.5t-45 -53.5l-227 54q-9 2 -17.5 -2.5t-11.5 -14.5l-95 -302q-224 -4 -381 -113q-36 43 -93 43q-51 0 -87 -36.5t-36 -87.5q0 -37 19.5 -67.5t52.5 -45.5 q-7 -25 -7 -54q0 -98 74 -181.5t201.5 -132t278.5 -48.5q150 0 277.5 48.5t201.5 132t74 181.5q0 27 -6 54zM971 702q37 0 63 -26t26 -63t-26 -64t-63 -27t-63 27t-26 64t26 63t63 26z" /> +<glyph unicode="&#xf1a3;" d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150 v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103 t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf1a4;" horiz-adv-x="1920" d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328 v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" /> +<glyph unicode="&#xf1a5;" d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" /> +<glyph unicode="&#xf1a6;" horiz-adv-x="2048" d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123 v-369h123z" /> +<glyph unicode="&#xf1a7;" d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101 v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf1a8;" horiz-adv-x="2038" d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14 q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24 q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33 q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5 t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43 q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5 t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13 t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" /> +<glyph unicode="&#xf1a9;" d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10 q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14 q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14 t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44 q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" /> +<glyph unicode="&#xf1aa;" d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5 t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5 q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126 t135.5 51q85 0 145 -60.5t60 -145.5z" /> +<glyph unicode="&#xf1ab;" d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5 q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28 q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11 q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q106 35 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5 q20 0 20 -21v-418z" /> +<glyph unicode="&#xf1ac;" horiz-adv-x="1792" d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48 l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23 t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128 q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128 q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" /> +<glyph unicode="&#xf1ad;" d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9 t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9 t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" /> +<glyph unicode="&#xf1ae;" horiz-adv-x="1280" d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68t68 28t68 -28l228 -228h368l228 228q28 28 68 28t68 -28t28 -68t-28 -68zM864 1152q0 -93 -65.5 -158.5 t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> +<glyph unicode="&#xf1b0;" horiz-adv-x="1664" d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5 q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819 q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5 t100.5 134t141.5 55.5z" /> +<glyph unicode="&#xf1b1;" horiz-adv-x="768" d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" /> +<glyph unicode="&#xf1b2;" horiz-adv-x="1792" d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z " /> +<glyph unicode="&#xf1b3;" horiz-adv-x="2304" d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67 t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-5 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70 v-400l434 -186q36 -16 57 -48t21 -70z" /> +<glyph unicode="&#xf1b4;" horiz-adv-x="2048" d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658 q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204 q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" /> +<glyph unicode="&#xf1b5;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5 t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217 t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" /> +<glyph unicode="&#xf1b6;" horiz-adv-x="1792" d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5 q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89 q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" /> +<glyph unicode="&#xf1b7;" d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5 q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5 q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z " /> +<glyph unicode="&#xf1b8;" horiz-adv-x="1792" d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188 l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5 t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1 q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" /> +<glyph unicode="&#xf1b9;" horiz-adv-x="2048" d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384 q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5 l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" /> +<glyph unicode="&#xf1ba;" horiz-adv-x="2048" d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5 t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" /> +<glyph unicode="&#xf1bb;" d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384 q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" /> +<glyph unicode="&#xf1bc;" d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64 q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37 q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf1bd;" d="M1397 1408q58 0 98.5 -40.5t40.5 -98.5v-1258q0 -58 -40.5 -98.5t-98.5 -40.5h-1258q-58 0 -98.5 40.5t-40.5 98.5v1258q0 58 40.5 98.5t98.5 40.5h1258zM1465 11v1258q0 28 -20 48t-48 20h-1258q-28 0 -48 -20t-20 -48v-1258q0 -28 20 -48t48 -20h1258q28 0 48 20t20 48 zM694 749l188 -387l533 145v-496q0 -7 -5.5 -12.5t-12.5 -5.5h-1258q-7 0 -12.5 5.5t-5.5 12.5v141l711 195l-212 439q4 1 12 2.5t12 1.5q170 32 303.5 21.5t221 -46t143.5 -94.5q27 -28 -25 -42q-64 -16 -256 -62l-97 198q-111 7 -240 -16zM1397 1287q7 0 12.5 -5.5 t5.5 -12.5v-428q-85 30 -188 52q-294 64 -645 12l-18 -3l-65 134h-233l85 -190q-132 -51 -230 -137v560q0 7 5.5 12.5t12.5 5.5h1258zM286 387q-14 -3 -26 4.5t-14 21.5q-24 203 166 305l129 -270z" /> +<glyph unicode="&#xf1be;" horiz-adv-x="2304" d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11 q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245 q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785 l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242 q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236q0 -11 -8 -19 t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786q-13 2 -22 11t-9 22v899 q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" /> +<glyph unicode="&#xf1c0;" d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127 t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5 t-103 128v128q0 69 103 128t280 93.5t385 34.5z" /> +<glyph unicode="&#xf1c1;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197 q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8 q-1 1 -1 2t-0.5 1.5t-0.5 1.5q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" /> +<glyph unicode="&#xf1c2;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4l-3 21q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5t-3.5 -21.5l-4 -21h-4l-2 21 q-2 26 -7 46l-99 438h90v107h-300z" /> +<glyph unicode="&#xf1c3;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107 h-290v-107h68l189 -272l-194 -283h-68z" /> +<glyph unicode="&#xf1c4;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" /> +<glyph unicode="&#xf1c5;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" /> +<glyph unicode="&#xf1c6;" d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400 v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79 q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" /> +<glyph unicode="&#xf1c7;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5 q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" /> +<glyph unicode="&#xf1c8;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" /> +<glyph unicode="&#xf1c9;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243 l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" /> +<glyph unicode="&#xf1ca;" d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406 q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" /> +<glyph unicode="&#xf1cb;" horiz-adv-x="1792" d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546 q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" /> +<glyph unicode="&#xf1cc;" horiz-adv-x="2048" d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94 q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55 t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97q14 -16 29.5 -34t34.5 -40t29 -34q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5 t-85 -189.5z" /> +<glyph unicode="&#xf1cd;" horiz-adv-x="1792" d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194 q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5 t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" /> +<glyph unicode="&#xf1ce;" horiz-adv-x="1792" d="M1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348q0 222 101 414.5t276.5 317t390.5 155.5v-260q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 q0 230 -145.5 406t-366.5 221v260q215 -31 390.5 -155.5t276.5 -317t101 -414.5z" /> +<glyph unicode="&#xf1d0;" horiz-adv-x="1792" d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170 t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136 q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" /> +<glyph unicode="&#xf1d1;" horiz-adv-x="1792" d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251 l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162 q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33 q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5 t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> +<glyph unicode="&#xf1d2;" d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85 q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392 q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072 q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf1d3;" horiz-adv-x="1792" d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58 q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47 q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171 v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" /> +<glyph unicode="&#xf1d4;" d="M825 547l343 588h-150q-21 -39 -63.5 -118.5t-68 -128.5t-59.5 -118.5t-60 -128.5h-3q-21 48 -44.5 97t-52 105.5t-46.5 92t-54 104.5t-49 95h-150l323 -589v-435h134v436zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf1d5;" horiz-adv-x="1280" d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5 t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153 t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" /> +<glyph unicode="&#xf1d6;" horiz-adv-x="1792" d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5 q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20 t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5 t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" /> +<glyph unicode="&#xf1d7;" horiz-adv-x="2048" d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25 q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5 q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109 q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" /> +<glyph unicode="&#xf1d8;" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" /> +<glyph unicode="&#xf1d9;" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137 l863 639l-478 -797z" /> +<glyph unicode="&#xf1da;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23 t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf1db;" d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf1dc;" horiz-adv-x="1792" d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15 t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2 t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5 q0 -26 -12 -48t-36 -22z" /> +<glyph unicode="&#xf1dd;" horiz-adv-x="1280" d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179 q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" /> +<glyph unicode="&#xf1de;" d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256 q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" /> +<glyph unicode="&#xf1e0;" d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5 t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" /> +<glyph unicode="&#xf1e1;" d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5 t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf1e2;" horiz-adv-x="1792" d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5 t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91 q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9 t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" /> +<glyph unicode="&#xf1e3;" horiz-adv-x="1792" d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323 l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" /> +<glyph unicode="&#xf1e4;" horiz-adv-x="1792" d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23 zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5 t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" /> +<glyph unicode="&#xf1e5;" horiz-adv-x="1792" d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf1e6;" horiz-adv-x="1792" d="M1755 1083q37 -37 37 -90t-37 -91l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234l401 400 q38 37 91 37t90 -37z" /> +<glyph unicode="&#xf1e7;" horiz-adv-x="1792" d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5 t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q3 -2 11 -7 t11 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" /> +<glyph unicode="&#xf1e8;" horiz-adv-x="1792" d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" /> +<glyph unicode="&#xf1e9;" d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36 q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q70 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5 t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87 q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" /> +<glyph unicode="&#xf1ea;" horiz-adv-x="2048" d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19 t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" /> +<glyph unicode="&#xf1eb;" horiz-adv-x="2048" d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121 q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" /> +<glyph unicode="&#xf1ec;" horiz-adv-x="1792" d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38 h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" /> +<glyph unicode="&#xf1ed;" horiz-adv-x="1792" d="M1112 1090q0 159 -237 159h-70q-32 0 -59.5 -21.5t-34.5 -52.5l-63 -276q-2 -5 -2 -16q0 -24 17 -39.5t41 -15.5h53q69 0 128.5 13t112.5 41t83.5 81.5t30.5 126.5zM1716 938q0 -265 -220 -428q-219 -161 -612 -161h-61q-32 0 -59 -21.5t-34 -52.5l-73 -316 q-8 -36 -40.5 -61.5t-69.5 -25.5h-213q-31 0 -53 20t-22 51q0 10 13 65h151q34 0 64 23.5t38 56.5l73 316q8 33 37.5 57t63.5 24h61q390 0 607 160t217 421q0 129 -51 207q183 -92 183 -335zM1533 1123q0 -264 -221 -428q-218 -161 -612 -161h-60q-32 0 -59.5 -22t-34.5 -53 l-73 -315q-8 -36 -40 -61.5t-69 -25.5h-214q-31 0 -52.5 19.5t-21.5 51.5q0 8 2 20l300 1301q8 36 40.5 61.5t69.5 25.5h444q68 0 125 -4t120.5 -15t113.5 -30t96.5 -50.5t77.5 -74t49.5 -103.5t18.5 -136z" /> +<glyph unicode="&#xf1ee;" horiz-adv-x="1792" d="M602 949q19 -61 31 -123.5t17 -141.5t-14 -159t-62 -145q-21 81 -67 157t-95.5 127t-99 90.5t-78.5 57.5t-33 19q-62 34 -81.5 100t14.5 128t101 81.5t129 -14.5q138 -83 238 -177zM927 1236q11 -25 20.5 -46t36.5 -100.5t42.5 -150.5t25.5 -179.5t0 -205.5t-47.5 -209.5 t-105.5 -208.5q-51 -72 -138 -72q-54 0 -98 31q-57 40 -69 109t28 127q60 85 81 195t13 199.5t-32 180.5t-39 128t-22 52q-31 63 -8.5 129.5t85.5 97.5q34 17 75 17q47 0 88.5 -25t63.5 -69zM1248 567q-17 -160 -72 -311q-17 131 -63 246q25 174 -5 361q-27 178 -94 342 q114 -90 212 -211q9 -37 15 -80q26 -179 7 -347zM1520 1440q9 -17 23.5 -49.5t43.5 -117.5t50.5 -178t34 -227.5t5 -269t-47 -300t-112.5 -323.5q-22 -48 -66 -75.5t-95 -27.5q-39 0 -74 16q-67 31 -92.5 100t4.5 136q58 126 90 257.5t37.5 239.5t-3.5 213.5t-26.5 180.5 t-38.5 138.5t-32.5 90t-15.5 32.5q-34 65 -11.5 135.5t87.5 104.5q37 20 81 20q49 0 91.5 -25.5t66.5 -70.5z" /> +<glyph unicode="&#xf1f0;" horiz-adv-x="2304" d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27 q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128 q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> +<glyph unicode="&#xf1f1;" horiz-adv-x="2304" d="M671 603h-13q-47 0 -47 -32q0 -22 20 -22q17 0 28 15t12 39zM1066 639h62v3q1 4 0.5 6.5t-1 7t-2 8t-4.5 6.5t-7.5 5t-11.5 2q-28 0 -36 -38zM1606 603h-12q-48 0 -48 -32q0 -22 20 -22q17 0 28 15t12 39zM1925 629q0 41 -30 41q-19 0 -31 -20t-12 -51q0 -42 28 -42 q20 0 32.5 20t12.5 52zM480 770h87l-44 -262h-56l32 201l-71 -201h-39l-4 200l-34 -200h-53l44 262h81l2 -163zM733 663q0 -6 -4 -42q-16 -101 -17 -113h-47l1 22q-20 -26 -58 -26q-23 0 -37.5 16t-14.5 42q0 39 26 60.5t73 21.5q14 0 23 -1q0 3 0.5 5.5t1 4.5t0.5 3 q0 20 -36 20q-29 0 -59 -10q0 4 7 48q38 11 67 11q74 0 74 -62zM889 721l-8 -49q-22 3 -41 3q-27 0 -27 -17q0 -8 4.5 -12t21.5 -11q40 -19 40 -60q0 -72 -87 -71q-34 0 -58 6q0 2 7 49q29 -8 51 -8q32 0 32 19q0 7 -4.5 11.5t-21.5 12.5q-43 20 -43 59q0 72 84 72 q30 0 50 -4zM977 721h28l-7 -52h-29q-2 -17 -6.5 -40.5t-7 -38.5t-2.5 -18q0 -16 19 -16q8 0 16 2l-8 -47q-21 -7 -40 -7q-43 0 -45 47q0 12 8 56q3 20 25 146h55zM1180 648q0 -23 -7 -52h-111q-3 -22 10 -33t38 -11q30 0 58 14l-9 -54q-30 -8 -57 -8q-95 0 -95 95 q0 55 27.5 90.5t69.5 35.5q35 0 55.5 -21t20.5 -56zM1319 722q-13 -23 -22 -62q-22 2 -31 -24t-25 -128h-56l3 14q22 130 29 199h51l-3 -33q14 21 25.5 29.5t28.5 4.5zM1506 763l-9 -57q-28 14 -50 14q-31 0 -51 -27.5t-20 -70.5q0 -30 13.5 -47t38.5 -17q21 0 48 13 l-10 -59q-28 -8 -50 -8q-45 0 -71.5 30.5t-26.5 82.5q0 70 35.5 114.5t91.5 44.5q26 0 61 -13zM1668 663q0 -18 -4 -42q-13 -79 -17 -113h-46l1 22q-20 -26 -59 -26q-23 0 -37 16t-14 42q0 39 25.5 60.5t72.5 21.5q15 0 23 -1q2 7 2 13q0 20 -36 20q-29 0 -59 -10q0 4 8 48 q38 11 67 11q73 0 73 -62zM1809 722q-14 -24 -21 -62q-23 2 -31.5 -23t-25.5 -129h-56l3 14q19 104 29 199h52q0 -11 -4 -33q15 21 26.5 29.5t27.5 4.5zM1950 770h56l-43 -262h-53l3 19q-23 -23 -52 -23q-31 0 -49.5 24t-18.5 64q0 53 27.5 92t64.5 39q31 0 53 -29z M2061 640q0 148 -72.5 273t-198 198t-273.5 73q-181 0 -328 -110q127 -116 171 -284h-50q-44 150 -158 253q-114 -103 -158 -253h-50q44 168 171 284q-147 110 -328 110q-148 0 -273.5 -73t-198 -198t-72.5 -273t72.5 -273t198 -198t273.5 -73q181 0 328 110 q-120 111 -165 264h50q46 -138 152 -233q106 95 152 233h50q-45 -153 -165 -264q147 -110 328 -110q148 0 273.5 73t198 198t72.5 273zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> +<glyph unicode="&#xf1f2;" horiz-adv-x="2304" d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42 q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604 v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569 q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73 t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" /> +<glyph unicode="&#xf1f3;" horiz-adv-x="2304" d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260 l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279 v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040 q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168 q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5 t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21 h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5 t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" /> +<glyph unicode="&#xf1f4;" horiz-adv-x="2304" d="M322 689h-15q-19 0 -19 18q0 28 19 85q5 15 15 19.5t28 4.5q77 0 77 -49q0 -41 -30.5 -59.5t-74.5 -18.5zM664 528q-47 0 -47 29q0 62 123 62l3 -3q-5 -88 -79 -88zM1438 687h-15q-19 0 -19 19q0 28 19 85q5 15 14.5 19t28.5 4q77 0 77 -49q0 -41 -30.5 -59.5 t-74.5 -18.5zM1780 527q-47 0 -47 30q0 62 123 62l3 -3q-5 -89 -79 -89zM373 894h-128q-8 0 -14.5 -4t-8.5 -7.5t-7 -12.5q-3 -7 -45 -190t-42 -192q0 -7 5.5 -12.5t13.5 -5.5h62q25 0 32.5 34.5l15 69t32.5 34.5q47 0 87.5 7.5t80.5 24.5t63.5 52.5t23.5 84.5 q0 36 -14.5 61t-41 36.5t-53.5 15.5t-62 4zM719 798q-38 0 -74 -6q-2 0 -8.5 -1t-9 -1.5l-7.5 -1.5t-7.5 -2t-6.5 -3t-6.5 -4t-5 -5t-4.5 -7t-4 -9q-9 -29 -9 -39t9 -10q5 0 21.5 5t19.5 6q30 8 58 8q74 0 74 -36q0 -11 -10 -14q-8 -2 -18 -3t-21.5 -1.5t-17.5 -1.5 q-38 -4 -64.5 -10t-56.5 -19.5t-45.5 -39t-15.5 -62.5q0 -38 26 -59.5t64 -21.5q24 0 45.5 6.5t33 13t38.5 23.5q-3 -7 -3 -15t5.5 -13.5t12.5 -5.5h56q1 1 7 3.5t7.5 3.5t5 3.5t5 5.5t2.5 8l45 194q4 13 4 30q0 81 -145 81zM1247 793h-74q-22 0 -39 -23q-5 -7 -29.5 -51 t-46.5 -81.5t-26 -38.5l-5 4q0 77 -27 166q-1 5 -3.5 8.5t-6 6.5t-6.5 5t-8.5 3t-8.5 1.5t-9.5 1t-9 0.5h-10h-8.5q-38 0 -38 -21l1 -5q5 -53 25 -151t25 -143q2 -16 2 -24q0 -19 -30.5 -61.5t-30.5 -58.5q0 -13 40 -13q61 0 76 25l245 415q10 20 10 26q0 9 -8 9zM1489 892 h-129q-18 0 -29 -23q-6 -13 -46.5 -191.5t-40.5 -190.5q0 -20 43 -20h7.5h9h9t9.5 1t8.5 2t8.5 3t6.5 4.5t5.5 6t3 8.5l21 91q2 10 10.5 17t19.5 7q47 0 87.5 7t80.5 24.5t63.5 52.5t23.5 84q0 36 -14.5 61t-41 36.5t-53.5 15.5t-62 4zM1835 798q-26 0 -74 -6 q-38 -6 -48 -16q-7 -8 -11 -19q-8 -24 -8 -39q0 -10 8 -10q1 0 41 12q30 8 58 8q74 0 74 -36q0 -12 -10 -14q-4 -1 -57 -7q-38 -4 -64.5 -10t-56.5 -19.5t-45.5 -39t-15.5 -62.5t26 -58.5t64 -21.5q24 0 45 6t34 13t38 24q-3 -15 -3 -16q0 -5 2 -8.5t6.5 -5.5t8 -3.5 t10.5 -2t9.5 -0.5h9.5h8q42 0 48 25l45 194q3 15 3 31q0 81 -145 81zM2157 889h-55q-25 0 -33 -40q-10 -44 -36.5 -167t-42.5 -190v-5q0 -16 16 -18h1h57q10 0 18.5 6.5t10.5 16.5l83 374h-1l1 5q0 7 -5.5 12.5t-13.5 5.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048 q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> +<glyph unicode="&#xf1f5;" horiz-adv-x="2304" d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109 q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118 q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151 q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31 q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> +<glyph unicode="&#xf1f6;" horiz-adv-x="2048" d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5 l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5 l418 363q10 8 23.5 7t21.5 -11z" /> +<glyph unicode="&#xf1f7;" horiz-adv-x="2048" d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128 q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161 q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" /> +<glyph unicode="&#xf1f8;" horiz-adv-x="1408" d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704 q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167 q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf1f9;" d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5 t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf1fa;" d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53 q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24 t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61 t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" /> +<glyph unicode="&#xf1fb;" horiz-adv-x="1792" d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10 t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" /> +<glyph unicode="&#xf1fc;" horiz-adv-x="1792" d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5 t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" /> +<glyph unicode="&#xf1fd;" horiz-adv-x="1792" d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11t55.5 -11t52.5 -38q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5t47 37.5 q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-35 0 -55.5 11t-52.5 38q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38t-58 27 t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448h256v448 h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51 t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" /> +<glyph unicode="&#xf1fe;" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" /> +<glyph unicode="&#xf200;" horiz-adv-x="1792" d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf201;" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9 t9 -23z" /> +<glyph unicode="&#xf202;" horiz-adv-x="1792" d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20 q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50 t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1 q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" /> +<glyph unicode="&#xf203;" d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73 q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110 q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf204;" horiz-adv-x="2048" d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5 t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5 t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" /> +<glyph unicode="&#xf205;" horiz-adv-x="2048" d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5 t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" /> +<glyph unicode="&#xf206;" horiz-adv-x="2304" d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94 q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469 q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400 q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" /> +<glyph unicode="&#xf207;" d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5 h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" /> +<glyph unicode="&#xf208;" horiz-adv-x="2048" d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327 q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5 q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" /> +<glyph unicode="&#xf209;" horiz-adv-x="1280" d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q18 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119 t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5 t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14 q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88 q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5 t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" /> +<glyph unicode="&#xf20a;" horiz-adv-x="2048" d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206 q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307 t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14 t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" /> +<glyph unicode="&#xf20b;" d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5 t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf20c;" d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55 q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410 q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" /> +<glyph unicode="&#xf20d;" horiz-adv-x="1792" /> +<glyph unicode="&#xf20e;" horiz-adv-x="1792" /> +<glyph unicode="&#xf500;" horiz-adv-x="1792" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/theme/bootstrap/font-awesome/fonts/fontawesome-webfont.ttf b/theme/bootstrap/font-awesome/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..96a3639 Binary files /dev/null and b/theme/bootstrap/font-awesome/fonts/fontawesome-webfont.ttf differ diff --git a/theme/bootstrap/font-awesome/fonts/fontawesome-webfont.woff b/theme/bootstrap/font-awesome/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..628b6a5 Binary files /dev/null and b/theme/bootstrap/font-awesome/fonts/fontawesome-webfont.woff differ diff --git a/theme/bootstrap/font-awesome/less/bordered-pulled.less b/theme/bootstrap/font-awesome/less/bordered-pulled.less new file mode 100644 index 0000000..0c90eb5 --- /dev/null +++ b/theme/bootstrap/font-awesome/less/bordered-pulled.less @@ -0,0 +1,16 @@ +// Bordered & Pulled +// ------------------------- + +.@{fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em @fa-border-color; + border-radius: .1em; +} + +.pull-right { float: right; } +.pull-left { float: left; } + +.@{fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/theme/bootstrap/font-awesome/less/core.less b/theme/bootstrap/font-awesome/less/core.less new file mode 100644 index 0000000..01d1910 --- /dev/null +++ b/theme/bootstrap/font-awesome/less/core.less @@ -0,0 +1,11 @@ +// Base Class Definition +// ------------------------- + +.@{fa-css-prefix} { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/theme/bootstrap/font-awesome/less/fixed-width.less b/theme/bootstrap/font-awesome/less/fixed-width.less new file mode 100644 index 0000000..110289f --- /dev/null +++ b/theme/bootstrap/font-awesome/less/fixed-width.less @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.@{fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/theme/bootstrap/font-awesome/less/font-awesome.less b/theme/bootstrap/font-awesome/less/font-awesome.less new file mode 100644 index 0000000..195fd46 --- /dev/null +++ b/theme/bootstrap/font-awesome/less/font-awesome.less @@ -0,0 +1,17 @@ +/*! + * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables.less"; +@import "mixins.less"; +@import "path.less"; +@import "core.less"; +@import "larger.less"; +@import "fixed-width.less"; +@import "list.less"; +@import "bordered-pulled.less"; +@import "spinning.less"; +@import "rotated-flipped.less"; +@import "stacked.less"; +@import "icons.less"; diff --git a/theme/bootstrap/font-awesome/less/icons.less b/theme/bootstrap/font-awesome/less/icons.less new file mode 100644 index 0000000..b5c26c7 --- /dev/null +++ b/theme/bootstrap/font-awesome/less/icons.less @@ -0,0 +1,552 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.@{fa-css-prefix}-glass:before { content: @fa-var-glass; } +.@{fa-css-prefix}-music:before { content: @fa-var-music; } +.@{fa-css-prefix}-search:before { content: @fa-var-search; } +.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; } +.@{fa-css-prefix}-heart:before { content: @fa-var-heart; } +.@{fa-css-prefix}-star:before { content: @fa-var-star; } +.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; } +.@{fa-css-prefix}-user:before { content: @fa-var-user; } +.@{fa-css-prefix}-film:before { content: @fa-var-film; } +.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; } +.@{fa-css-prefix}-th:before { content: @fa-var-th; } +.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; } +.@{fa-css-prefix}-check:before { content: @fa-var-check; } +.@{fa-css-prefix}-remove:before, +.@{fa-css-prefix}-close:before, +.@{fa-css-prefix}-times:before { content: @fa-var-times; } +.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; } +.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; } +.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; } +.@{fa-css-prefix}-signal:before { content: @fa-var-signal; } +.@{fa-css-prefix}-gear:before, +.@{fa-css-prefix}-cog:before { content: @fa-var-cog; } +.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; } +.@{fa-css-prefix}-home:before { content: @fa-var-home; } +.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; } +.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; } +.@{fa-css-prefix}-road:before { content: @fa-var-road; } +.@{fa-css-prefix}-download:before { content: @fa-var-download; } +.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; } +.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; } +.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; } +.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; } +.@{fa-css-prefix}-rotate-right:before, +.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; } +.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; } +.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; } +.@{fa-css-prefix}-lock:before { content: @fa-var-lock; } +.@{fa-css-prefix}-flag:before { content: @fa-var-flag; } +.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; } +.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; } +.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; } +.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; } +.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; } +.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; } +.@{fa-css-prefix}-tag:before { content: @fa-var-tag; } +.@{fa-css-prefix}-tags:before { content: @fa-var-tags; } +.@{fa-css-prefix}-book:before { content: @fa-var-book; } +.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; } +.@{fa-css-prefix}-print:before { content: @fa-var-print; } +.@{fa-css-prefix}-camera:before { content: @fa-var-camera; } +.@{fa-css-prefix}-font:before { content: @fa-var-font; } +.@{fa-css-prefix}-bold:before { content: @fa-var-bold; } +.@{fa-css-prefix}-italic:before { content: @fa-var-italic; } +.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; } +.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; } +.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; } +.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; } +.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; } +.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; } +.@{fa-css-prefix}-list:before { content: @fa-var-list; } +.@{fa-css-prefix}-dedent:before, +.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; } +.@{fa-css-prefix}-indent:before { content: @fa-var-indent; } +.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; } +.@{fa-css-prefix}-photo:before, +.@{fa-css-prefix}-image:before, +.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; } +.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; } +.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; } +.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; } +.@{fa-css-prefix}-tint:before { content: @fa-var-tint; } +.@{fa-css-prefix}-edit:before, +.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; } +.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; } +.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; } +.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; } +.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; } +.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; } +.@{fa-css-prefix}-backward:before { content: @fa-var-backward; } +.@{fa-css-prefix}-play:before { content: @fa-var-play; } +.@{fa-css-prefix}-pause:before { content: @fa-var-pause; } +.@{fa-css-prefix}-stop:before { content: @fa-var-stop; } +.@{fa-css-prefix}-forward:before { content: @fa-var-forward; } +.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; } +.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; } +.@{fa-css-prefix}-eject:before { content: @fa-var-eject; } +.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; } +.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; } +.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; } +.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; } +.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; } +.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; } +.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; } +.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; } +.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; } +.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; } +.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; } +.@{fa-css-prefix}-ban:before { content: @fa-var-ban; } +.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; } +.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; } +.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; } +.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; } +.@{fa-css-prefix}-mail-forward:before, +.@{fa-css-prefix}-share:before { content: @fa-var-share; } +.@{fa-css-prefix}-expand:before { content: @fa-var-expand; } +.@{fa-css-prefix}-compress:before { content: @fa-var-compress; } +.@{fa-css-prefix}-plus:before { content: @fa-var-plus; } +.@{fa-css-prefix}-minus:before { content: @fa-var-minus; } +.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; } +.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; } +.@{fa-css-prefix}-gift:before { content: @fa-var-gift; } +.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; } +.@{fa-css-prefix}-fire:before { content: @fa-var-fire; } +.@{fa-css-prefix}-eye:before { content: @fa-var-eye; } +.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; } +.@{fa-css-prefix}-warning:before, +.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; } +.@{fa-css-prefix}-plane:before { content: @fa-var-plane; } +.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; } +.@{fa-css-prefix}-random:before { content: @fa-var-random; } +.@{fa-css-prefix}-comment:before { content: @fa-var-comment; } +.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; } +.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; } +.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; } +.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; } +.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; } +.@{fa-css-prefix}-folder:before { content: @fa-var-folder; } +.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; } +.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; } +.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; } +.@{fa-css-prefix}-bar-chart-o:before, +.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; } +.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; } +.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; } +.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; } +.@{fa-css-prefix}-key:before { content: @fa-var-key; } +.@{fa-css-prefix}-gears:before, +.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; } +.@{fa-css-prefix}-comments:before { content: @fa-var-comments; } +.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; } +.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; } +.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; } +.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; } +.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; } +.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; } +.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; } +.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; } +.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; } +.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; } +.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; } +.@{fa-css-prefix}-upload:before { content: @fa-var-upload; } +.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; } +.@{fa-css-prefix}-phone:before { content: @fa-var-phone; } +.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; } +.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; } +.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; } +.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; } +.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; } +.@{fa-css-prefix}-github:before { content: @fa-var-github; } +.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; } +.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; } +.@{fa-css-prefix}-rss:before { content: @fa-var-rss; } +.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; } +.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; } +.@{fa-css-prefix}-bell:before { content: @fa-var-bell; } +.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; } +.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; } +.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; } +.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; } +.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; } +.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; } +.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; } +.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; } +.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; } +.@{fa-css-prefix}-globe:before { content: @fa-var-globe; } +.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; } +.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; } +.@{fa-css-prefix}-filter:before { content: @fa-var-filter; } +.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; } +.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; } +.@{fa-css-prefix}-group:before, +.@{fa-css-prefix}-users:before { content: @fa-var-users; } +.@{fa-css-prefix}-chain:before, +.@{fa-css-prefix}-link:before { content: @fa-var-link; } +.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; } +.@{fa-css-prefix}-flask:before { content: @fa-var-flask; } +.@{fa-css-prefix}-cut:before, +.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; } +.@{fa-css-prefix}-copy:before, +.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; } +.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; } +.@{fa-css-prefix}-save:before, +.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; } +.@{fa-css-prefix}-square:before { content: @fa-var-square; } +.@{fa-css-prefix}-navicon:before, +.@{fa-css-prefix}-reorder:before, +.@{fa-css-prefix}-bars:before { content: @fa-var-bars; } +.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; } +.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; } +.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; } +.@{fa-css-prefix}-underline:before { content: @fa-var-underline; } +.@{fa-css-prefix}-table:before { content: @fa-var-table; } +.@{fa-css-prefix}-magic:before { content: @fa-var-magic; } +.@{fa-css-prefix}-truck:before { content: @fa-var-truck; } +.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; } +.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; } +.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; } +.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; } +.@{fa-css-prefix}-money:before { content: @fa-var-money; } +.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; } +.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; } +.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; } +.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; } +.@{fa-css-prefix}-columns:before { content: @fa-var-columns; } +.@{fa-css-prefix}-unsorted:before, +.@{fa-css-prefix}-sort:before { content: @fa-var-sort; } +.@{fa-css-prefix}-sort-down:before, +.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; } +.@{fa-css-prefix}-sort-up:before, +.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; } +.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; } +.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; } +.@{fa-css-prefix}-rotate-left:before, +.@{fa-css-prefix}-undo:before { content: @fa-var-undo; } +.@{fa-css-prefix}-legal:before, +.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; } +.@{fa-css-prefix}-dashboard:before, +.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; } +.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; } +.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; } +.@{fa-css-prefix}-flash:before, +.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; } +.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; } +.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; } +.@{fa-css-prefix}-paste:before, +.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; } +.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; } +.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; } +.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; } +.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; } +.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; } +.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; } +.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; } +.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; } +.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; } +.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; } +.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; } +.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; } +.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; } +.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; } +.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; } +.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; } +.@{fa-css-prefix}-beer:before { content: @fa-var-beer; } +.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; } +.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; } +.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; } +.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; } +.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; } +.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; } +.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; } +.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; } +.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; } +.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; } +.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; } +.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; } +.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; } +.@{fa-css-prefix}-mobile-phone:before, +.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; } +.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; } +.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; } +.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; } +.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; } +.@{fa-css-prefix}-circle:before { content: @fa-var-circle; } +.@{fa-css-prefix}-mail-reply:before, +.@{fa-css-prefix}-reply:before { content: @fa-var-reply; } +.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; } +.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; } +.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; } +.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; } +.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; } +.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; } +.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; } +.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; } +.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; } +.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; } +.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; } +.@{fa-css-prefix}-code:before { content: @fa-var-code; } +.@{fa-css-prefix}-mail-reply-all:before, +.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; } +.@{fa-css-prefix}-star-half-empty:before, +.@{fa-css-prefix}-star-half-full:before, +.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; } +.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; } +.@{fa-css-prefix}-crop:before { content: @fa-var-crop; } +.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; } +.@{fa-css-prefix}-unlink:before, +.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; } +.@{fa-css-prefix}-question:before { content: @fa-var-question; } +.@{fa-css-prefix}-info:before { content: @fa-var-info; } +.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; } +.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; } +.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; } +.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; } +.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; } +.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; } +.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; } +.@{fa-css-prefix}-shield:before { content: @fa-var-shield; } +.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; } +.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; } +.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; } +.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; } +.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; } +.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; } +.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; } +.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; } +.@{fa-css-prefix}-html5:before { content: @fa-var-html5; } +.@{fa-css-prefix}-css3:before { content: @fa-var-css3; } +.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; } +.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; } +.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; } +.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; } +.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; } +.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; } +.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; } +.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; } +.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; } +.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; } +.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; } +.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; } +.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; } +.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; } +.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; } +.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; } +.@{fa-css-prefix}-compass:before { content: @fa-var-compass; } +.@{fa-css-prefix}-toggle-down:before, +.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; } +.@{fa-css-prefix}-toggle-up:before, +.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; } +.@{fa-css-prefix}-toggle-right:before, +.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; } +.@{fa-css-prefix}-euro:before, +.@{fa-css-prefix}-eur:before { content: @fa-var-eur; } +.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; } +.@{fa-css-prefix}-dollar:before, +.@{fa-css-prefix}-usd:before { content: @fa-var-usd; } +.@{fa-css-prefix}-rupee:before, +.@{fa-css-prefix}-inr:before { content: @fa-var-inr; } +.@{fa-css-prefix}-cny:before, +.@{fa-css-prefix}-rmb:before, +.@{fa-css-prefix}-yen:before, +.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; } +.@{fa-css-prefix}-ruble:before, +.@{fa-css-prefix}-rouble:before, +.@{fa-css-prefix}-rub:before { content: @fa-var-rub; } +.@{fa-css-prefix}-won:before, +.@{fa-css-prefix}-krw:before { content: @fa-var-krw; } +.@{fa-css-prefix}-bitcoin:before, +.@{fa-css-prefix}-btc:before { content: @fa-var-btc; } +.@{fa-css-prefix}-file:before { content: @fa-var-file; } +.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; } +.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; } +.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; } +.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; } +.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; } +.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; } +.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; } +.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; } +.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; } +.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; } +.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; } +.@{fa-css-prefix}-xing:before { content: @fa-var-xing; } +.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; } +.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; } +.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; } +.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; } +.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; } +.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; } +.@{fa-css-prefix}-adn:before { content: @fa-var-adn; } +.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; } +.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; } +.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; } +.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; } +.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; } +.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; } +.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; } +.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; } +.@{fa-css-prefix}-apple:before { content: @fa-var-apple; } +.@{fa-css-prefix}-windows:before { content: @fa-var-windows; } +.@{fa-css-prefix}-android:before { content: @fa-var-android; } +.@{fa-css-prefix}-linux:before { content: @fa-var-linux; } +.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; } +.@{fa-css-prefix}-skype:before { content: @fa-var-skype; } +.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; } +.@{fa-css-prefix}-trello:before { content: @fa-var-trello; } +.@{fa-css-prefix}-female:before { content: @fa-var-female; } +.@{fa-css-prefix}-male:before { content: @fa-var-male; } +.@{fa-css-prefix}-gittip:before { content: @fa-var-gittip; } +.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; } +.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; } +.@{fa-css-prefix}-archive:before { content: @fa-var-archive; } +.@{fa-css-prefix}-bug:before { content: @fa-var-bug; } +.@{fa-css-prefix}-vk:before { content: @fa-var-vk; } +.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; } +.@{fa-css-prefix}-renren:before { content: @fa-var-renren; } +.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; } +.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; } +.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; } +.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; } +.@{fa-css-prefix}-toggle-left:before, +.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; } +.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; } +.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; } +.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; } +.@{fa-css-prefix}-turkish-lira:before, +.@{fa-css-prefix}-try:before { content: @fa-var-try; } +.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; } +.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; } +.@{fa-css-prefix}-slack:before { content: @fa-var-slack; } +.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; } +.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; } +.@{fa-css-prefix}-openid:before { content: @fa-var-openid; } +.@{fa-css-prefix}-institution:before, +.@{fa-css-prefix}-bank:before, +.@{fa-css-prefix}-university:before { content: @fa-var-university; } +.@{fa-css-prefix}-mortar-board:before, +.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; } +.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; } +.@{fa-css-prefix}-google:before { content: @fa-var-google; } +.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; } +.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; } +.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; } +.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; } +.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; } +.@{fa-css-prefix}-digg:before { content: @fa-var-digg; } +.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; } +.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; } +.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; } +.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; } +.@{fa-css-prefix}-language:before { content: @fa-var-language; } +.@{fa-css-prefix}-fax:before { content: @fa-var-fax; } +.@{fa-css-prefix}-building:before { content: @fa-var-building; } +.@{fa-css-prefix}-child:before { content: @fa-var-child; } +.@{fa-css-prefix}-paw:before { content: @fa-var-paw; } +.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; } +.@{fa-css-prefix}-cube:before { content: @fa-var-cube; } +.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; } +.@{fa-css-prefix}-behance:before { content: @fa-var-behance; } +.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; } +.@{fa-css-prefix}-steam:before { content: @fa-var-steam; } +.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; } +.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; } +.@{fa-css-prefix}-automobile:before, +.@{fa-css-prefix}-car:before { content: @fa-var-car; } +.@{fa-css-prefix}-cab:before, +.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; } +.@{fa-css-prefix}-tree:before { content: @fa-var-tree; } +.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; } +.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; } +.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; } +.@{fa-css-prefix}-database:before { content: @fa-var-database; } +.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; } +.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; } +.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; } +.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; } +.@{fa-css-prefix}-file-photo-o:before, +.@{fa-css-prefix}-file-picture-o:before, +.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; } +.@{fa-css-prefix}-file-zip-o:before, +.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; } +.@{fa-css-prefix}-file-sound-o:before, +.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; } +.@{fa-css-prefix}-file-movie-o:before, +.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; } +.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; } +.@{fa-css-prefix}-vine:before { content: @fa-var-vine; } +.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; } +.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; } +.@{fa-css-prefix}-life-bouy:before, +.@{fa-css-prefix}-life-buoy:before, +.@{fa-css-prefix}-life-saver:before, +.@{fa-css-prefix}-support:before, +.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; } +.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; } +.@{fa-css-prefix}-ra:before, +.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; } +.@{fa-css-prefix}-ge:before, +.@{fa-css-prefix}-empire:before { content: @fa-var-empire; } +.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; } +.@{fa-css-prefix}-git:before { content: @fa-var-git; } +.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; } +.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; } +.@{fa-css-prefix}-qq:before { content: @fa-var-qq; } +.@{fa-css-prefix}-wechat:before, +.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; } +.@{fa-css-prefix}-send:before, +.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; } +.@{fa-css-prefix}-send-o:before, +.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; } +.@{fa-css-prefix}-history:before { content: @fa-var-history; } +.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; } +.@{fa-css-prefix}-header:before { content: @fa-var-header; } +.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; } +.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; } +.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; } +.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; } +.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; } +.@{fa-css-prefix}-soccer-ball-o:before, +.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; } +.@{fa-css-prefix}-tty:before { content: @fa-var-tty; } +.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; } +.@{fa-css-prefix}-plug:before { content: @fa-var-plug; } +.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; } +.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; } +.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; } +.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; } +.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; } +.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; } +.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; } +.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; } +.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; } +.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; } +.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; } +.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; } +.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; } +.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; } +.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; } +.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; } +.@{fa-css-prefix}-trash:before { content: @fa-var-trash; } +.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; } +.@{fa-css-prefix}-at:before { content: @fa-var-at; } +.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; } +.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; } +.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; } +.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; } +.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; } +.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; } +.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; } +.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; } +.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; } +.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; } +.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; } +.@{fa-css-prefix}-bus:before { content: @fa-var-bus; } +.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; } +.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; } +.@{fa-css-prefix}-cc:before { content: @fa-var-cc; } +.@{fa-css-prefix}-shekel:before, +.@{fa-css-prefix}-sheqel:before, +.@{fa-css-prefix}-ils:before { content: @fa-var-ils; } +.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; } diff --git a/theme/bootstrap/font-awesome/less/larger.less b/theme/bootstrap/font-awesome/less/larger.less new file mode 100644 index 0000000..c9d6467 --- /dev/null +++ b/theme/bootstrap/font-awesome/less/larger.less @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.@{fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.@{fa-css-prefix}-2x { font-size: 2em; } +.@{fa-css-prefix}-3x { font-size: 3em; } +.@{fa-css-prefix}-4x { font-size: 4em; } +.@{fa-css-prefix}-5x { font-size: 5em; } diff --git a/theme/bootstrap/font-awesome/less/list.less b/theme/bootstrap/font-awesome/less/list.less new file mode 100644 index 0000000..0b44038 --- /dev/null +++ b/theme/bootstrap/font-awesome/less/list.less @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.@{fa-css-prefix}-ul { + padding-left: 0; + margin-left: @fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.@{fa-css-prefix}-li { + position: absolute; + left: -@fa-li-width; + width: @fa-li-width; + top: (2em / 14); + text-align: center; + &.@{fa-css-prefix}-lg { + left: (-@fa-li-width + (4em / 14)); + } +} diff --git a/theme/bootstrap/font-awesome/less/mixins.less b/theme/bootstrap/font-awesome/less/mixins.less new file mode 100644 index 0000000..b7bfadc --- /dev/null +++ b/theme/bootstrap/font-awesome/less/mixins.less @@ -0,0 +1,25 @@ +// Mixins +// -------------------------- + +.fa-icon() { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.fa-icon-rotate(@degrees, @rotation) { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation); + -webkit-transform: rotate(@degrees); + -ms-transform: rotate(@degrees); + transform: rotate(@degrees); +} + +.fa-icon-flip(@horiz, @vert, @rotation) { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1); + -webkit-transform: scale(@horiz, @vert); + -ms-transform: scale(@horiz, @vert); + transform: scale(@horiz, @vert); +} diff --git a/theme/bootstrap/font-awesome/less/path.less b/theme/bootstrap/font-awesome/less/path.less new file mode 100644 index 0000000..c5a6912 --- /dev/null +++ b/theme/bootstrap/font-awesome/less/path.less @@ -0,0 +1,14 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); + src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), + url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), + url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), + url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); +// src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/theme/bootstrap/font-awesome/less/rotated-flipped.less b/theme/bootstrap/font-awesome/less/rotated-flipped.less new file mode 100644 index 0000000..f6ba814 --- /dev/null +++ b/theme/bootstrap/font-awesome/less/rotated-flipped.less @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } +.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } +.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } + +.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } +.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .@{fa-css-prefix}-rotate-90, +:root .@{fa-css-prefix}-rotate-180, +:root .@{fa-css-prefix}-rotate-270, +:root .@{fa-css-prefix}-flip-horizontal, +:root .@{fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/theme/bootstrap/font-awesome/less/spinning.less b/theme/bootstrap/font-awesome/less/spinning.less new file mode 100644 index 0000000..6e1564e --- /dev/null +++ b/theme/bootstrap/font-awesome/less/spinning.less @@ -0,0 +1,29 @@ +// Spinning Icons +// -------------------------- + +.@{fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} diff --git a/theme/bootstrap/font-awesome/less/stacked.less b/theme/bootstrap/font-awesome/less/stacked.less new file mode 100644 index 0000000..fc53fb0 --- /dev/null +++ b/theme/bootstrap/font-awesome/less/stacked.less @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.@{fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.@{fa-css-prefix}-stack-1x { line-height: inherit; } +.@{fa-css-prefix}-stack-2x { font-size: 2em; } +.@{fa-css-prefix}-inverse { color: @fa-inverse; } diff --git a/theme/bootstrap/font-awesome/less/variables.less b/theme/bootstrap/font-awesome/less/variables.less new file mode 100644 index 0000000..ccf939d --- /dev/null +++ b/theme/bootstrap/font-awesome/less/variables.less @@ -0,0 +1,561 @@ +// Variables +// -------------------------- + +@fa-font-path: "../fonts"; +//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts"; // for referencing Bootstrap CDN font files directly +@fa-css-prefix: fa; +@fa-version: "4.2.0"; +@fa-border-color: #eee; +@fa-inverse: #fff; +@fa-li-width: (30em / 14); + +@fa-var-adjust: "\f042"; +@fa-var-adn: "\f170"; +@fa-var-align-center: "\f037"; +@fa-var-align-justify: "\f039"; +@fa-var-align-left: "\f036"; +@fa-var-align-right: "\f038"; +@fa-var-ambulance: "\f0f9"; +@fa-var-anchor: "\f13d"; +@fa-var-android: "\f17b"; +@fa-var-angellist: "\f209"; +@fa-var-angle-double-down: "\f103"; +@fa-var-angle-double-left: "\f100"; +@fa-var-angle-double-right: "\f101"; +@fa-var-angle-double-up: "\f102"; +@fa-var-angle-down: "\f107"; +@fa-var-angle-left: "\f104"; +@fa-var-angle-right: "\f105"; +@fa-var-angle-up: "\f106"; +@fa-var-apple: "\f179"; +@fa-var-archive: "\f187"; +@fa-var-area-chart: "\f1fe"; +@fa-var-arrow-circle-down: "\f0ab"; +@fa-var-arrow-circle-left: "\f0a8"; +@fa-var-arrow-circle-o-down: "\f01a"; +@fa-var-arrow-circle-o-left: "\f190"; +@fa-var-arrow-circle-o-right: "\f18e"; +@fa-var-arrow-circle-o-up: "\f01b"; +@fa-var-arrow-circle-right: "\f0a9"; +@fa-var-arrow-circle-up: "\f0aa"; +@fa-var-arrow-down: "\f063"; +@fa-var-arrow-left: "\f060"; +@fa-var-arrow-right: "\f061"; +@fa-var-arrow-up: "\f062"; +@fa-var-arrows: "\f047"; +@fa-var-arrows-alt: "\f0b2"; +@fa-var-arrows-h: "\f07e"; +@fa-var-arrows-v: "\f07d"; +@fa-var-asterisk: "\f069"; +@fa-var-at: "\f1fa"; +@fa-var-automobile: "\f1b9"; +@fa-var-backward: "\f04a"; +@fa-var-ban: "\f05e"; +@fa-var-bank: "\f19c"; +@fa-var-bar-chart: "\f080"; +@fa-var-bar-chart-o: "\f080"; +@fa-var-barcode: "\f02a"; +@fa-var-bars: "\f0c9"; +@fa-var-beer: "\f0fc"; +@fa-var-behance: "\f1b4"; +@fa-var-behance-square: "\f1b5"; +@fa-var-bell: "\f0f3"; +@fa-var-bell-o: "\f0a2"; +@fa-var-bell-slash: "\f1f6"; +@fa-var-bell-slash-o: "\f1f7"; +@fa-var-bicycle: "\f206"; +@fa-var-binoculars: "\f1e5"; +@fa-var-birthday-cake: "\f1fd"; +@fa-var-bitbucket: "\f171"; +@fa-var-bitbucket-square: "\f172"; +@fa-var-bitcoin: "\f15a"; +@fa-var-bold: "\f032"; +@fa-var-bolt: "\f0e7"; +@fa-var-bomb: "\f1e2"; +@fa-var-book: "\f02d"; +@fa-var-bookmark: "\f02e"; +@fa-var-bookmark-o: "\f097"; +@fa-var-briefcase: "\f0b1"; +@fa-var-btc: "\f15a"; +@fa-var-bug: "\f188"; +@fa-var-building: "\f1ad"; +@fa-var-building-o: "\f0f7"; +@fa-var-bullhorn: "\f0a1"; +@fa-var-bullseye: "\f140"; +@fa-var-bus: "\f207"; +@fa-var-cab: "\f1ba"; +@fa-var-calculator: "\f1ec"; +@fa-var-calendar: "\f073"; +@fa-var-calendar-o: "\f133"; +@fa-var-camera: "\f030"; +@fa-var-camera-retro: "\f083"; +@fa-var-car: "\f1b9"; +@fa-var-caret-down: "\f0d7"; +@fa-var-caret-left: "\f0d9"; +@fa-var-caret-right: "\f0da"; +@fa-var-caret-square-o-down: "\f150"; +@fa-var-caret-square-o-left: "\f191"; +@fa-var-caret-square-o-right: "\f152"; +@fa-var-caret-square-o-up: "\f151"; +@fa-var-caret-up: "\f0d8"; +@fa-var-cc: "\f20a"; +@fa-var-cc-amex: "\f1f3"; +@fa-var-cc-discover: "\f1f2"; +@fa-var-cc-mastercard: "\f1f1"; +@fa-var-cc-paypal: "\f1f4"; +@fa-var-cc-stripe: "\f1f5"; +@fa-var-cc-visa: "\f1f0"; +@fa-var-certificate: "\f0a3"; +@fa-var-chain: "\f0c1"; +@fa-var-chain-broken: "\f127"; +@fa-var-check: "\f00c"; +@fa-var-check-circle: "\f058"; +@fa-var-check-circle-o: "\f05d"; +@fa-var-check-square: "\f14a"; +@fa-var-check-square-o: "\f046"; +@fa-var-chevron-circle-down: "\f13a"; +@fa-var-chevron-circle-left: "\f137"; +@fa-var-chevron-circle-right: "\f138"; +@fa-var-chevron-circle-up: "\f139"; +@fa-var-chevron-down: "\f078"; +@fa-var-chevron-left: "\f053"; +@fa-var-chevron-right: "\f054"; +@fa-var-chevron-up: "\f077"; +@fa-var-child: "\f1ae"; +@fa-var-circle: "\f111"; +@fa-var-circle-o: "\f10c"; +@fa-var-circle-o-notch: "\f1ce"; +@fa-var-circle-thin: "\f1db"; +@fa-var-clipboard: "\f0ea"; +@fa-var-clock-o: "\f017"; +@fa-var-close: "\f00d"; +@fa-var-cloud: "\f0c2"; +@fa-var-cloud-download: "\f0ed"; +@fa-var-cloud-upload: "\f0ee"; +@fa-var-cny: "\f157"; +@fa-var-code: "\f121"; +@fa-var-code-fork: "\f126"; +@fa-var-codepen: "\f1cb"; +@fa-var-coffee: "\f0f4"; +@fa-var-cog: "\f013"; +@fa-var-cogs: "\f085"; +@fa-var-columns: "\f0db"; +@fa-var-comment: "\f075"; +@fa-var-comment-o: "\f0e5"; +@fa-var-comments: "\f086"; +@fa-var-comments-o: "\f0e6"; +@fa-var-compass: "\f14e"; +@fa-var-compress: "\f066"; +@fa-var-copy: "\f0c5"; +@fa-var-copyright: "\f1f9"; +@fa-var-credit-card: "\f09d"; +@fa-var-crop: "\f125"; +@fa-var-crosshairs: "\f05b"; +@fa-var-css3: "\f13c"; +@fa-var-cube: "\f1b2"; +@fa-var-cubes: "\f1b3"; +@fa-var-cut: "\f0c4"; +@fa-var-cutlery: "\f0f5"; +@fa-var-dashboard: "\f0e4"; +@fa-var-database: "\f1c0"; +@fa-var-dedent: "\f03b"; +@fa-var-delicious: "\f1a5"; +@fa-var-desktop: "\f108"; +@fa-var-deviantart: "\f1bd"; +@fa-var-digg: "\f1a6"; +@fa-var-dollar: "\f155"; +@fa-var-dot-circle-o: "\f192"; +@fa-var-download: "\f019"; +@fa-var-dribbble: "\f17d"; +@fa-var-dropbox: "\f16b"; +@fa-var-drupal: "\f1a9"; +@fa-var-edit: "\f044"; +@fa-var-eject: "\f052"; +@fa-var-ellipsis-h: "\f141"; +@fa-var-ellipsis-v: "\f142"; +@fa-var-empire: "\f1d1"; +@fa-var-envelope: "\f0e0"; +@fa-var-envelope-o: "\f003"; +@fa-var-envelope-square: "\f199"; +@fa-var-eraser: "\f12d"; +@fa-var-eur: "\f153"; +@fa-var-euro: "\f153"; +@fa-var-exchange: "\f0ec"; +@fa-var-exclamation: "\f12a"; +@fa-var-exclamation-circle: "\f06a"; +@fa-var-exclamation-triangle: "\f071"; +@fa-var-expand: "\f065"; +@fa-var-external-link: "\f08e"; +@fa-var-external-link-square: "\f14c"; +@fa-var-eye: "\f06e"; +@fa-var-eye-slash: "\f070"; +@fa-var-eyedropper: "\f1fb"; +@fa-var-facebook: "\f09a"; +@fa-var-facebook-square: "\f082"; +@fa-var-fast-backward: "\f049"; +@fa-var-fast-forward: "\f050"; +@fa-var-fax: "\f1ac"; +@fa-var-female: "\f182"; +@fa-var-fighter-jet: "\f0fb"; +@fa-var-file: "\f15b"; +@fa-var-file-archive-o: "\f1c6"; +@fa-var-file-audio-o: "\f1c7"; +@fa-var-file-code-o: "\f1c9"; +@fa-var-file-excel-o: "\f1c3"; +@fa-var-file-image-o: "\f1c5"; +@fa-var-file-movie-o: "\f1c8"; +@fa-var-file-o: "\f016"; +@fa-var-file-pdf-o: "\f1c1"; +@fa-var-file-photo-o: "\f1c5"; +@fa-var-file-picture-o: "\f1c5"; +@fa-var-file-powerpoint-o: "\f1c4"; +@fa-var-file-sound-o: "\f1c7"; +@fa-var-file-text: "\f15c"; +@fa-var-file-text-o: "\f0f6"; +@fa-var-file-video-o: "\f1c8"; +@fa-var-file-word-o: "\f1c2"; +@fa-var-file-zip-o: "\f1c6"; +@fa-var-files-o: "\f0c5"; +@fa-var-film: "\f008"; +@fa-var-filter: "\f0b0"; +@fa-var-fire: "\f06d"; +@fa-var-fire-extinguisher: "\f134"; +@fa-var-flag: "\f024"; +@fa-var-flag-checkered: "\f11e"; +@fa-var-flag-o: "\f11d"; +@fa-var-flash: "\f0e7"; +@fa-var-flask: "\f0c3"; +@fa-var-flickr: "\f16e"; +@fa-var-floppy-o: "\f0c7"; +@fa-var-folder: "\f07b"; +@fa-var-folder-o: "\f114"; +@fa-var-folder-open: "\f07c"; +@fa-var-folder-open-o: "\f115"; +@fa-var-font: "\f031"; +@fa-var-forward: "\f04e"; +@fa-var-foursquare: "\f180"; +@fa-var-frown-o: "\f119"; +@fa-var-futbol-o: "\f1e3"; +@fa-var-gamepad: "\f11b"; +@fa-var-gavel: "\f0e3"; +@fa-var-gbp: "\f154"; +@fa-var-ge: "\f1d1"; +@fa-var-gear: "\f013"; +@fa-var-gears: "\f085"; +@fa-var-gift: "\f06b"; +@fa-var-git: "\f1d3"; +@fa-var-git-square: "\f1d2"; +@fa-var-github: "\f09b"; +@fa-var-github-alt: "\f113"; +@fa-var-github-square: "\f092"; +@fa-var-gittip: "\f184"; +@fa-var-glass: "\f000"; +@fa-var-globe: "\f0ac"; +@fa-var-google: "\f1a0"; +@fa-var-google-plus: "\f0d5"; +@fa-var-google-plus-square: "\f0d4"; +@fa-var-google-wallet: "\f1ee"; +@fa-var-graduation-cap: "\f19d"; +@fa-var-group: "\f0c0"; +@fa-var-h-square: "\f0fd"; +@fa-var-hacker-news: "\f1d4"; +@fa-var-hand-o-down: "\f0a7"; +@fa-var-hand-o-left: "\f0a5"; +@fa-var-hand-o-right: "\f0a4"; +@fa-var-hand-o-up: "\f0a6"; +@fa-var-hdd-o: "\f0a0"; +@fa-var-header: "\f1dc"; +@fa-var-headphones: "\f025"; +@fa-var-heart: "\f004"; +@fa-var-heart-o: "\f08a"; +@fa-var-history: "\f1da"; +@fa-var-home: "\f015"; +@fa-var-hospital-o: "\f0f8"; +@fa-var-html5: "\f13b"; +@fa-var-ils: "\f20b"; +@fa-var-image: "\f03e"; +@fa-var-inbox: "\f01c"; +@fa-var-indent: "\f03c"; +@fa-var-info: "\f129"; +@fa-var-info-circle: "\f05a"; +@fa-var-inr: "\f156"; +@fa-var-instagram: "\f16d"; +@fa-var-institution: "\f19c"; +@fa-var-ioxhost: "\f208"; +@fa-var-italic: "\f033"; +@fa-var-joomla: "\f1aa"; +@fa-var-jpy: "\f157"; +@fa-var-jsfiddle: "\f1cc"; +@fa-var-key: "\f084"; +@fa-var-keyboard-o: "\f11c"; +@fa-var-krw: "\f159"; +@fa-var-language: "\f1ab"; +@fa-var-laptop: "\f109"; +@fa-var-lastfm: "\f202"; +@fa-var-lastfm-square: "\f203"; +@fa-var-leaf: "\f06c"; +@fa-var-legal: "\f0e3"; +@fa-var-lemon-o: "\f094"; +@fa-var-level-down: "\f149"; +@fa-var-level-up: "\f148"; +@fa-var-life-bouy: "\f1cd"; +@fa-var-life-buoy: "\f1cd"; +@fa-var-life-ring: "\f1cd"; +@fa-var-life-saver: "\f1cd"; +@fa-var-lightbulb-o: "\f0eb"; +@fa-var-line-chart: "\f201"; +@fa-var-link: "\f0c1"; +@fa-var-linkedin: "\f0e1"; +@fa-var-linkedin-square: "\f08c"; +@fa-var-linux: "\f17c"; +@fa-var-list: "\f03a"; +@fa-var-list-alt: "\f022"; +@fa-var-list-ol: "\f0cb"; +@fa-var-list-ul: "\f0ca"; +@fa-var-location-arrow: "\f124"; +@fa-var-lock: "\f023"; +@fa-var-long-arrow-down: "\f175"; +@fa-var-long-arrow-left: "\f177"; +@fa-var-long-arrow-right: "\f178"; +@fa-var-long-arrow-up: "\f176"; +@fa-var-magic: "\f0d0"; +@fa-var-magnet: "\f076"; +@fa-var-mail-forward: "\f064"; +@fa-var-mail-reply: "\f112"; +@fa-var-mail-reply-all: "\f122"; +@fa-var-male: "\f183"; +@fa-var-map-marker: "\f041"; +@fa-var-maxcdn: "\f136"; +@fa-var-meanpath: "\f20c"; +@fa-var-medkit: "\f0fa"; +@fa-var-meh-o: "\f11a"; +@fa-var-microphone: "\f130"; +@fa-var-microphone-slash: "\f131"; +@fa-var-minus: "\f068"; +@fa-var-minus-circle: "\f056"; +@fa-var-minus-square: "\f146"; +@fa-var-minus-square-o: "\f147"; +@fa-var-mobile: "\f10b"; +@fa-var-mobile-phone: "\f10b"; +@fa-var-money: "\f0d6"; +@fa-var-moon-o: "\f186"; +@fa-var-mortar-board: "\f19d"; +@fa-var-music: "\f001"; +@fa-var-navicon: "\f0c9"; +@fa-var-newspaper-o: "\f1ea"; +@fa-var-openid: "\f19b"; +@fa-var-outdent: "\f03b"; +@fa-var-pagelines: "\f18c"; +@fa-var-paint-brush: "\f1fc"; +@fa-var-paper-plane: "\f1d8"; +@fa-var-paper-plane-o: "\f1d9"; +@fa-var-paperclip: "\f0c6"; +@fa-var-paragraph: "\f1dd"; +@fa-var-paste: "\f0ea"; +@fa-var-pause: "\f04c"; +@fa-var-paw: "\f1b0"; +@fa-var-paypal: "\f1ed"; +@fa-var-pencil: "\f040"; +@fa-var-pencil-square: "\f14b"; +@fa-var-pencil-square-o: "\f044"; +@fa-var-phone: "\f095"; +@fa-var-phone-square: "\f098"; +@fa-var-photo: "\f03e"; +@fa-var-picture-o: "\f03e"; +@fa-var-pie-chart: "\f200"; +@fa-var-pied-piper: "\f1a7"; +@fa-var-pied-piper-alt: "\f1a8"; +@fa-var-pinterest: "\f0d2"; +@fa-var-pinterest-square: "\f0d3"; +@fa-var-plane: "\f072"; +@fa-var-play: "\f04b"; +@fa-var-play-circle: "\f144"; +@fa-var-play-circle-o: "\f01d"; +@fa-var-plug: "\f1e6"; +@fa-var-plus: "\f067"; +@fa-var-plus-circle: "\f055"; +@fa-var-plus-square: "\f0fe"; +@fa-var-plus-square-o: "\f196"; +@fa-var-power-off: "\f011"; +@fa-var-print: "\f02f"; +@fa-var-puzzle-piece: "\f12e"; +@fa-var-qq: "\f1d6"; +@fa-var-qrcode: "\f029"; +@fa-var-question: "\f128"; +@fa-var-question-circle: "\f059"; +@fa-var-quote-left: "\f10d"; +@fa-var-quote-right: "\f10e"; +@fa-var-ra: "\f1d0"; +@fa-var-random: "\f074"; +@fa-var-rebel: "\f1d0"; +@fa-var-recycle: "\f1b8"; +@fa-var-reddit: "\f1a1"; +@fa-var-reddit-square: "\f1a2"; +@fa-var-refresh: "\f021"; +@fa-var-remove: "\f00d"; +@fa-var-renren: "\f18b"; +@fa-var-reorder: "\f0c9"; +@fa-var-repeat: "\f01e"; +@fa-var-reply: "\f112"; +@fa-var-reply-all: "\f122"; +@fa-var-retweet: "\f079"; +@fa-var-rmb: "\f157"; +@fa-var-road: "\f018"; +@fa-var-rocket: "\f135"; +@fa-var-rotate-left: "\f0e2"; +@fa-var-rotate-right: "\f01e"; +@fa-var-rouble: "\f158"; +@fa-var-rss: "\f09e"; +@fa-var-rss-square: "\f143"; +@fa-var-rub: "\f158"; +@fa-var-ruble: "\f158"; +@fa-var-rupee: "\f156"; +@fa-var-save: "\f0c7"; +@fa-var-scissors: "\f0c4"; +@fa-var-search: "\f002"; +@fa-var-search-minus: "\f010"; +@fa-var-search-plus: "\f00e"; +@fa-var-send: "\f1d8"; +@fa-var-send-o: "\f1d9"; +@fa-var-share: "\f064"; +@fa-var-share-alt: "\f1e0"; +@fa-var-share-alt-square: "\f1e1"; +@fa-var-share-square: "\f14d"; +@fa-var-share-square-o: "\f045"; +@fa-var-shekel: "\f20b"; +@fa-var-sheqel: "\f20b"; +@fa-var-shield: "\f132"; +@fa-var-shopping-cart: "\f07a"; +@fa-var-sign-in: "\f090"; +@fa-var-sign-out: "\f08b"; +@fa-var-signal: "\f012"; +@fa-var-sitemap: "\f0e8"; +@fa-var-skype: "\f17e"; +@fa-var-slack: "\f198"; +@fa-var-sliders: "\f1de"; +@fa-var-slideshare: "\f1e7"; +@fa-var-smile-o: "\f118"; +@fa-var-soccer-ball-o: "\f1e3"; +@fa-var-sort: "\f0dc"; +@fa-var-sort-alpha-asc: "\f15d"; +@fa-var-sort-alpha-desc: "\f15e"; +@fa-var-sort-amount-asc: "\f160"; +@fa-var-sort-amount-desc: "\f161"; +@fa-var-sort-asc: "\f0de"; +@fa-var-sort-desc: "\f0dd"; +@fa-var-sort-down: "\f0dd"; +@fa-var-sort-numeric-asc: "\f162"; +@fa-var-sort-numeric-desc: "\f163"; +@fa-var-sort-up: "\f0de"; +@fa-var-soundcloud: "\f1be"; +@fa-var-space-shuttle: "\f197"; +@fa-var-spinner: "\f110"; +@fa-var-spoon: "\f1b1"; +@fa-var-spotify: "\f1bc"; +@fa-var-square: "\f0c8"; +@fa-var-square-o: "\f096"; +@fa-var-stack-exchange: "\f18d"; +@fa-var-stack-overflow: "\f16c"; +@fa-var-star: "\f005"; +@fa-var-star-half: "\f089"; +@fa-var-star-half-empty: "\f123"; +@fa-var-star-half-full: "\f123"; +@fa-var-star-half-o: "\f123"; +@fa-var-star-o: "\f006"; +@fa-var-steam: "\f1b6"; +@fa-var-steam-square: "\f1b7"; +@fa-var-step-backward: "\f048"; +@fa-var-step-forward: "\f051"; +@fa-var-stethoscope: "\f0f1"; +@fa-var-stop: "\f04d"; +@fa-var-strikethrough: "\f0cc"; +@fa-var-stumbleupon: "\f1a4"; +@fa-var-stumbleupon-circle: "\f1a3"; +@fa-var-subscript: "\f12c"; +@fa-var-suitcase: "\f0f2"; +@fa-var-sun-o: "\f185"; +@fa-var-superscript: "\f12b"; +@fa-var-support: "\f1cd"; +@fa-var-table: "\f0ce"; +@fa-var-tablet: "\f10a"; +@fa-var-tachometer: "\f0e4"; +@fa-var-tag: "\f02b"; +@fa-var-tags: "\f02c"; +@fa-var-tasks: "\f0ae"; +@fa-var-taxi: "\f1ba"; +@fa-var-tencent-weibo: "\f1d5"; +@fa-var-terminal: "\f120"; +@fa-var-text-height: "\f034"; +@fa-var-text-width: "\f035"; +@fa-var-th: "\f00a"; +@fa-var-th-large: "\f009"; +@fa-var-th-list: "\f00b"; +@fa-var-thumb-tack: "\f08d"; +@fa-var-thumbs-down: "\f165"; +@fa-var-thumbs-o-down: "\f088"; +@fa-var-thumbs-o-up: "\f087"; +@fa-var-thumbs-up: "\f164"; +@fa-var-ticket: "\f145"; +@fa-var-times: "\f00d"; +@fa-var-times-circle: "\f057"; +@fa-var-times-circle-o: "\f05c"; +@fa-var-tint: "\f043"; +@fa-var-toggle-down: "\f150"; +@fa-var-toggle-left: "\f191"; +@fa-var-toggle-off: "\f204"; +@fa-var-toggle-on: "\f205"; +@fa-var-toggle-right: "\f152"; +@fa-var-toggle-up: "\f151"; +@fa-var-trash: "\f1f8"; +@fa-var-trash-o: "\f014"; +@fa-var-tree: "\f1bb"; +@fa-var-trello: "\f181"; +@fa-var-trophy: "\f091"; +@fa-var-truck: "\f0d1"; +@fa-var-try: "\f195"; +@fa-var-tty: "\f1e4"; +@fa-var-tumblr: "\f173"; +@fa-var-tumblr-square: "\f174"; +@fa-var-turkish-lira: "\f195"; +@fa-var-twitch: "\f1e8"; +@fa-var-twitter: "\f099"; +@fa-var-twitter-square: "\f081"; +@fa-var-umbrella: "\f0e9"; +@fa-var-underline: "\f0cd"; +@fa-var-undo: "\f0e2"; +@fa-var-university: "\f19c"; +@fa-var-unlink: "\f127"; +@fa-var-unlock: "\f09c"; +@fa-var-unlock-alt: "\f13e"; +@fa-var-unsorted: "\f0dc"; +@fa-var-upload: "\f093"; +@fa-var-usd: "\f155"; +@fa-var-user: "\f007"; +@fa-var-user-md: "\f0f0"; +@fa-var-users: "\f0c0"; +@fa-var-video-camera: "\f03d"; +@fa-var-vimeo-square: "\f194"; +@fa-var-vine: "\f1ca"; +@fa-var-vk: "\f189"; +@fa-var-volume-down: "\f027"; +@fa-var-volume-off: "\f026"; +@fa-var-volume-up: "\f028"; +@fa-var-warning: "\f071"; +@fa-var-wechat: "\f1d7"; +@fa-var-weibo: "\f18a"; +@fa-var-weixin: "\f1d7"; +@fa-var-wheelchair: "\f193"; +@fa-var-wifi: "\f1eb"; +@fa-var-windows: "\f17a"; +@fa-var-won: "\f159"; +@fa-var-wordpress: "\f19a"; +@fa-var-wrench: "\f0ad"; +@fa-var-xing: "\f168"; +@fa-var-xing-square: "\f169"; +@fa-var-yahoo: "\f19e"; +@fa-var-yelp: "\f1e9"; +@fa-var-yen: "\f157"; +@fa-var-youtube: "\f167"; +@fa-var-youtube-play: "\f16a"; +@fa-var-youtube-square: "\f166"; + diff --git a/theme/bootstrap/font-awesome/scss/_bordered-pulled.scss b/theme/bootstrap/font-awesome/scss/_bordered-pulled.scss new file mode 100644 index 0000000..9d3fdf3 --- /dev/null +++ b/theme/bootstrap/font-awesome/scss/_bordered-pulled.scss @@ -0,0 +1,16 @@ +// Bordered & Pulled +// ------------------------- + +.#{$fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em $fa-border-color; + border-radius: .1em; +} + +.pull-right { float: right; } +.pull-left { float: left; } + +.#{$fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/theme/bootstrap/font-awesome/scss/_core.scss b/theme/bootstrap/font-awesome/scss/_core.scss new file mode 100644 index 0000000..ca46d37 --- /dev/null +++ b/theme/bootstrap/font-awesome/scss/_core.scss @@ -0,0 +1,11 @@ +// Base Class Definition +// ------------------------- + +.#{$fa-css-prefix} { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/theme/bootstrap/font-awesome/scss/_fixed-width.scss b/theme/bootstrap/font-awesome/scss/_fixed-width.scss new file mode 100644 index 0000000..b221c98 --- /dev/null +++ b/theme/bootstrap/font-awesome/scss/_fixed-width.scss @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.#{$fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/theme/bootstrap/font-awesome/scss/_icons.scss b/theme/bootstrap/font-awesome/scss/_icons.scss new file mode 100644 index 0000000..8dc2939 --- /dev/null +++ b/theme/bootstrap/font-awesome/scss/_icons.scss @@ -0,0 +1,552 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } +.#{$fa-css-prefix}-music:before { content: $fa-var-music; } +.#{$fa-css-prefix}-search:before { content: $fa-var-search; } +.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } +.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } +.#{$fa-css-prefix}-star:before { content: $fa-var-star; } +.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } +.#{$fa-css-prefix}-user:before { content: $fa-var-user; } +.#{$fa-css-prefix}-film:before { content: $fa-var-film; } +.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } +.#{$fa-css-prefix}-th:before { content: $fa-var-th; } +.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } +.#{$fa-css-prefix}-check:before { content: $fa-var-check; } +.#{$fa-css-prefix}-remove:before, +.#{$fa-css-prefix}-close:before, +.#{$fa-css-prefix}-times:before { content: $fa-var-times; } +.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } +.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } +.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } +.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } +.#{$fa-css-prefix}-gear:before, +.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } +.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } +.#{$fa-css-prefix}-home:before { content: $fa-var-home; } +.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } +.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } +.#{$fa-css-prefix}-road:before { content: $fa-var-road; } +.#{$fa-css-prefix}-download:before { content: $fa-var-download; } +.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } +.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } +.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } +.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } +.#{$fa-css-prefix}-rotate-right:before, +.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } +.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } +.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } +.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } +.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } +.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } +.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } +.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } +.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } +.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } +.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } +.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } +.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } +.#{$fa-css-prefix}-book:before { content: $fa-var-book; } +.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } +.#{$fa-css-prefix}-print:before { content: $fa-var-print; } +.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } +.#{$fa-css-prefix}-font:before { content: $fa-var-font; } +.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } +.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } +.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } +.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } +.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } +.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } +.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } +.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } +.#{$fa-css-prefix}-list:before { content: $fa-var-list; } +.#{$fa-css-prefix}-dedent:before, +.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } +.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } +.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } +.#{$fa-css-prefix}-photo:before, +.#{$fa-css-prefix}-image:before, +.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } +.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } +.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } +.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } +.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } +.#{$fa-css-prefix}-edit:before, +.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } +.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } +.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } +.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } +.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } +.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } +.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } +.#{$fa-css-prefix}-play:before { content: $fa-var-play; } +.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } +.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } +.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } +.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } +.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } +.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } +.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } +.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } +.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } +.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } +.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } +.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } +.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } +.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } +.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } +.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } +.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } +.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } +.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } +.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } +.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } +.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } +.#{$fa-css-prefix}-mail-forward:before, +.#{$fa-css-prefix}-share:before { content: $fa-var-share; } +.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } +.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } +.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } +.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } +.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } +.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } +.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } +.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } +.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } +.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } +.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } +.#{$fa-css-prefix}-warning:before, +.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } +.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } +.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } +.#{$fa-css-prefix}-random:before { content: $fa-var-random; } +.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } +.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } +.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } +.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } +.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } +.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } +.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } +.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } +.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } +.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } +.#{$fa-css-prefix}-bar-chart-o:before, +.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } +.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } +.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } +.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } +.#{$fa-css-prefix}-key:before { content: $fa-var-key; } +.#{$fa-css-prefix}-gears:before, +.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } +.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } +.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } +.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } +.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } +.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } +.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } +.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } +.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } +.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } +.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } +.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } +.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } +.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } +.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } +.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } +.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } +.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } +.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } +.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } +.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } +.#{$fa-css-prefix}-github:before { content: $fa-var-github; } +.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } +.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } +.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } +.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } +.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } +.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } +.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } +.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } +.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } +.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } +.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } +.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } +.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } +.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } +.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } +.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } +.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } +.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } +.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } +.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } +.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } +.#{$fa-css-prefix}-group:before, +.#{$fa-css-prefix}-users:before { content: $fa-var-users; } +.#{$fa-css-prefix}-chain:before, +.#{$fa-css-prefix}-link:before { content: $fa-var-link; } +.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } +.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } +.#{$fa-css-prefix}-cut:before, +.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } +.#{$fa-css-prefix}-copy:before, +.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } +.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } +.#{$fa-css-prefix}-save:before, +.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } +.#{$fa-css-prefix}-square:before { content: $fa-var-square; } +.#{$fa-css-prefix}-navicon:before, +.#{$fa-css-prefix}-reorder:before, +.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } +.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } +.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } +.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } +.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } +.#{$fa-css-prefix}-table:before { content: $fa-var-table; } +.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } +.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } +.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } +.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } +.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } +.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } +.#{$fa-css-prefix}-money:before { content: $fa-var-money; } +.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } +.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } +.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } +.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } +.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } +.#{$fa-css-prefix}-unsorted:before, +.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } +.#{$fa-css-prefix}-sort-down:before, +.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } +.#{$fa-css-prefix}-sort-up:before, +.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } +.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } +.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } +.#{$fa-css-prefix}-rotate-left:before, +.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } +.#{$fa-css-prefix}-legal:before, +.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } +.#{$fa-css-prefix}-dashboard:before, +.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } +.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } +.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } +.#{$fa-css-prefix}-flash:before, +.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } +.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } +.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } +.#{$fa-css-prefix}-paste:before, +.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } +.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } +.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } +.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } +.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } +.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } +.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } +.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } +.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } +.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } +.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } +.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } +.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } +.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } +.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } +.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } +.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } +.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } +.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } +.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } +.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } +.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } +.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } +.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } +.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } +.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } +.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } +.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } +.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } +.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } +.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } +.#{$fa-css-prefix}-mobile-phone:before, +.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } +.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } +.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } +.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } +.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } +.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } +.#{$fa-css-prefix}-mail-reply:before, +.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } +.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } +.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } +.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } +.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } +.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } +.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } +.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } +.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } +.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } +.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } +.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } +.#{$fa-css-prefix}-code:before { content: $fa-var-code; } +.#{$fa-css-prefix}-mail-reply-all:before, +.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } +.#{$fa-css-prefix}-star-half-empty:before, +.#{$fa-css-prefix}-star-half-full:before, +.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } +.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } +.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } +.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } +.#{$fa-css-prefix}-unlink:before, +.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } +.#{$fa-css-prefix}-question:before { content: $fa-var-question; } +.#{$fa-css-prefix}-info:before { content: $fa-var-info; } +.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } +.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } +.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } +.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } +.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } +.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } +.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } +.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } +.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } +.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } +.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } +.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } +.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } +.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } +.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } +.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } +.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } +.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } +.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } +.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } +.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } +.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } +.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } +.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } +.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } +.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } +.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } +.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } +.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } +.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } +.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } +.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } +.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } +.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } +.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } +.#{$fa-css-prefix}-toggle-down:before, +.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } +.#{$fa-css-prefix}-toggle-up:before, +.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } +.#{$fa-css-prefix}-toggle-right:before, +.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } +.#{$fa-css-prefix}-euro:before, +.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } +.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } +.#{$fa-css-prefix}-dollar:before, +.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } +.#{$fa-css-prefix}-rupee:before, +.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } +.#{$fa-css-prefix}-cny:before, +.#{$fa-css-prefix}-rmb:before, +.#{$fa-css-prefix}-yen:before, +.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } +.#{$fa-css-prefix}-ruble:before, +.#{$fa-css-prefix}-rouble:before, +.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } +.#{$fa-css-prefix}-won:before, +.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } +.#{$fa-css-prefix}-bitcoin:before, +.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } +.#{$fa-css-prefix}-file:before { content: $fa-var-file; } +.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } +.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } +.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } +.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } +.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } +.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } +.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } +.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } +.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } +.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } +.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } +.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } +.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } +.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } +.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } +.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } +.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } +.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } +.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } +.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } +.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } +.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } +.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } +.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } +.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } +.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } +.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } +.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } +.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } +.#{$fa-css-prefix}-android:before { content: $fa-var-android; } +.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } +.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } +.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } +.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } +.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } +.#{$fa-css-prefix}-female:before { content: $fa-var-female; } +.#{$fa-css-prefix}-male:before { content: $fa-var-male; } +.#{$fa-css-prefix}-gittip:before { content: $fa-var-gittip; } +.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } +.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } +.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } +.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } +.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } +.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } +.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } +.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } +.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } +.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } +.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } +.#{$fa-css-prefix}-toggle-left:before, +.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } +.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } +.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } +.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } +.#{$fa-css-prefix}-turkish-lira:before, +.#{$fa-css-prefix}-try:before { content: $fa-var-try; } +.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } +.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } +.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } +.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } +.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } +.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } +.#{$fa-css-prefix}-institution:before, +.#{$fa-css-prefix}-bank:before, +.#{$fa-css-prefix}-university:before { content: $fa-var-university; } +.#{$fa-css-prefix}-mortar-board:before, +.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } +.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } +.#{$fa-css-prefix}-google:before { content: $fa-var-google; } +.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } +.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } +.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } +.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } +.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } +.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } +.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } +.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } +.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } +.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } +.#{$fa-css-prefix}-language:before { content: $fa-var-language; } +.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } +.#{$fa-css-prefix}-building:before { content: $fa-var-building; } +.#{$fa-css-prefix}-child:before { content: $fa-var-child; } +.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } +.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } +.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } +.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } +.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } +.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } +.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } +.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } +.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } +.#{$fa-css-prefix}-automobile:before, +.#{$fa-css-prefix}-car:before { content: $fa-var-car; } +.#{$fa-css-prefix}-cab:before, +.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } +.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } +.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } +.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } +.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } +.#{$fa-css-prefix}-database:before { content: $fa-var-database; } +.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } +.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } +.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } +.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } +.#{$fa-css-prefix}-file-photo-o:before, +.#{$fa-css-prefix}-file-picture-o:before, +.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } +.#{$fa-css-prefix}-file-zip-o:before, +.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } +.#{$fa-css-prefix}-file-sound-o:before, +.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } +.#{$fa-css-prefix}-file-movie-o:before, +.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } +.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } +.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } +.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } +.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } +.#{$fa-css-prefix}-life-bouy:before, +.#{$fa-css-prefix}-life-buoy:before, +.#{$fa-css-prefix}-life-saver:before, +.#{$fa-css-prefix}-support:before, +.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } +.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } +.#{$fa-css-prefix}-ra:before, +.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } +.#{$fa-css-prefix}-ge:before, +.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } +.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } +.#{$fa-css-prefix}-git:before { content: $fa-var-git; } +.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } +.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } +.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } +.#{$fa-css-prefix}-wechat:before, +.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } +.#{$fa-css-prefix}-send:before, +.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } +.#{$fa-css-prefix}-send-o:before, +.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } +.#{$fa-css-prefix}-history:before { content: $fa-var-history; } +.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } +.#{$fa-css-prefix}-header:before { content: $fa-var-header; } +.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } +.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } +.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } +.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } +.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } +.#{$fa-css-prefix}-soccer-ball-o:before, +.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } +.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } +.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } +.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } +.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } +.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } +.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } +.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } +.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } +.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } +.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } +.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } +.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } +.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } +.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } +.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } +.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } +.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } +.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } +.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } +.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } +.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } +.#{$fa-css-prefix}-at:before { content: $fa-var-at; } +.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } +.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } +.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } +.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } +.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } +.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } +.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } +.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } +.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } +.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } +.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } +.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } +.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } +.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } +.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } +.#{$fa-css-prefix}-shekel:before, +.#{$fa-css-prefix}-sheqel:before, +.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } +.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } diff --git a/theme/bootstrap/font-awesome/scss/_larger.scss b/theme/bootstrap/font-awesome/scss/_larger.scss new file mode 100644 index 0000000..41e9a81 --- /dev/null +++ b/theme/bootstrap/font-awesome/scss/_larger.scss @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.#{$fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.#{$fa-css-prefix}-2x { font-size: 2em; } +.#{$fa-css-prefix}-3x { font-size: 3em; } +.#{$fa-css-prefix}-4x { font-size: 4em; } +.#{$fa-css-prefix}-5x { font-size: 5em; } diff --git a/theme/bootstrap/font-awesome/scss/_list.scss b/theme/bootstrap/font-awesome/scss/_list.scss new file mode 100644 index 0000000..7d1e4d5 --- /dev/null +++ b/theme/bootstrap/font-awesome/scss/_list.scss @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.#{$fa-css-prefix}-ul { + padding-left: 0; + margin-left: $fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.#{$fa-css-prefix}-li { + position: absolute; + left: -$fa-li-width; + width: $fa-li-width; + top: (2em / 14); + text-align: center; + &.#{$fa-css-prefix}-lg { + left: -$fa-li-width + (4em / 14); + } +} diff --git a/theme/bootstrap/font-awesome/scss/_mixins.scss b/theme/bootstrap/font-awesome/scss/_mixins.scss new file mode 100644 index 0000000..a139dfb --- /dev/null +++ b/theme/bootstrap/font-awesome/scss/_mixins.scss @@ -0,0 +1,25 @@ +// Mixins +// -------------------------- + +@mixin fa-icon() { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +@mixin fa-icon-rotate($degrees, $rotation) { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); + -webkit-transform: rotate($degrees); + -ms-transform: rotate($degrees); + transform: rotate($degrees); +} + +@mixin fa-icon-flip($horiz, $vert, $rotation) { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); + -webkit-transform: scale($horiz, $vert); + -ms-transform: scale($horiz, $vert); + transform: scale($horiz, $vert); +} diff --git a/theme/bootstrap/font-awesome/scss/_path.scss b/theme/bootstrap/font-awesome/scss/_path.scss new file mode 100644 index 0000000..fd21c35 --- /dev/null +++ b/theme/bootstrap/font-awesome/scss/_path.scss @@ -0,0 +1,14 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); + src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), + url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), + url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), + url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); + //src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/theme/bootstrap/font-awesome/scss/_rotated-flipped.scss b/theme/bootstrap/font-awesome/scss/_rotated-flipped.scss new file mode 100644 index 0000000..a3558fd --- /dev/null +++ b/theme/bootstrap/font-awesome/scss/_rotated-flipped.scss @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } +.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } +.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } + +.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } +.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .#{$fa-css-prefix}-rotate-90, +:root .#{$fa-css-prefix}-rotate-180, +:root .#{$fa-css-prefix}-rotate-270, +:root .#{$fa-css-prefix}-flip-horizontal, +:root .#{$fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/theme/bootstrap/font-awesome/scss/_spinning.scss b/theme/bootstrap/font-awesome/scss/_spinning.scss new file mode 100644 index 0000000..002c5d5 --- /dev/null +++ b/theme/bootstrap/font-awesome/scss/_spinning.scss @@ -0,0 +1,29 @@ +// Spinning Icons +// -------------------------- + +.#{$fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} diff --git a/theme/bootstrap/font-awesome/scss/_stacked.scss b/theme/bootstrap/font-awesome/scss/_stacked.scss new file mode 100644 index 0000000..aef7403 --- /dev/null +++ b/theme/bootstrap/font-awesome/scss/_stacked.scss @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.#{$fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.#{$fa-css-prefix}-stack-1x { line-height: inherit; } +.#{$fa-css-prefix}-stack-2x { font-size: 2em; } +.#{$fa-css-prefix}-inverse { color: $fa-inverse; } diff --git a/theme/bootstrap/font-awesome/scss/_variables.scss b/theme/bootstrap/font-awesome/scss/_variables.scss new file mode 100644 index 0000000..669c307 --- /dev/null +++ b/theme/bootstrap/font-awesome/scss/_variables.scss @@ -0,0 +1,561 @@ +// Variables +// -------------------------- + +$fa-font-path: "../fonts" !default; +//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts" !default; // for referencing Bootstrap CDN font files directly +$fa-css-prefix: fa !default; +$fa-version: "4.2.0" !default; +$fa-border-color: #eee !default; +$fa-inverse: #fff !default; +$fa-li-width: (30em / 14) !default; + +$fa-var-adjust: "\f042"; +$fa-var-adn: "\f170"; +$fa-var-align-center: "\f037"; +$fa-var-align-justify: "\f039"; +$fa-var-align-left: "\f036"; +$fa-var-align-right: "\f038"; +$fa-var-ambulance: "\f0f9"; +$fa-var-anchor: "\f13d"; +$fa-var-android: "\f17b"; +$fa-var-angellist: "\f209"; +$fa-var-angle-double-down: "\f103"; +$fa-var-angle-double-left: "\f100"; +$fa-var-angle-double-right: "\f101"; +$fa-var-angle-double-up: "\f102"; +$fa-var-angle-down: "\f107"; +$fa-var-angle-left: "\f104"; +$fa-var-angle-right: "\f105"; +$fa-var-angle-up: "\f106"; +$fa-var-apple: "\f179"; +$fa-var-archive: "\f187"; +$fa-var-area-chart: "\f1fe"; +$fa-var-arrow-circle-down: "\f0ab"; +$fa-var-arrow-circle-left: "\f0a8"; +$fa-var-arrow-circle-o-down: "\f01a"; +$fa-var-arrow-circle-o-left: "\f190"; +$fa-var-arrow-circle-o-right: "\f18e"; +$fa-var-arrow-circle-o-up: "\f01b"; +$fa-var-arrow-circle-right: "\f0a9"; +$fa-var-arrow-circle-up: "\f0aa"; +$fa-var-arrow-down: "\f063"; +$fa-var-arrow-left: "\f060"; +$fa-var-arrow-right: "\f061"; +$fa-var-arrow-up: "\f062"; +$fa-var-arrows: "\f047"; +$fa-var-arrows-alt: "\f0b2"; +$fa-var-arrows-h: "\f07e"; +$fa-var-arrows-v: "\f07d"; +$fa-var-asterisk: "\f069"; +$fa-var-at: "\f1fa"; +$fa-var-automobile: "\f1b9"; +$fa-var-backward: "\f04a"; +$fa-var-ban: "\f05e"; +$fa-var-bank: "\f19c"; +$fa-var-bar-chart: "\f080"; +$fa-var-bar-chart-o: "\f080"; +$fa-var-barcode: "\f02a"; +$fa-var-bars: "\f0c9"; +$fa-var-beer: "\f0fc"; +$fa-var-behance: "\f1b4"; +$fa-var-behance-square: "\f1b5"; +$fa-var-bell: "\f0f3"; +$fa-var-bell-o: "\f0a2"; +$fa-var-bell-slash: "\f1f6"; +$fa-var-bell-slash-o: "\f1f7"; +$fa-var-bicycle: "\f206"; +$fa-var-binoculars: "\f1e5"; +$fa-var-birthday-cake: "\f1fd"; +$fa-var-bitbucket: "\f171"; +$fa-var-bitbucket-square: "\f172"; +$fa-var-bitcoin: "\f15a"; +$fa-var-bold: "\f032"; +$fa-var-bolt: "\f0e7"; +$fa-var-bomb: "\f1e2"; +$fa-var-book: "\f02d"; +$fa-var-bookmark: "\f02e"; +$fa-var-bookmark-o: "\f097"; +$fa-var-briefcase: "\f0b1"; +$fa-var-btc: "\f15a"; +$fa-var-bug: "\f188"; +$fa-var-building: "\f1ad"; +$fa-var-building-o: "\f0f7"; +$fa-var-bullhorn: "\f0a1"; +$fa-var-bullseye: "\f140"; +$fa-var-bus: "\f207"; +$fa-var-cab: "\f1ba"; +$fa-var-calculator: "\f1ec"; +$fa-var-calendar: "\f073"; +$fa-var-calendar-o: "\f133"; +$fa-var-camera: "\f030"; +$fa-var-camera-retro: "\f083"; +$fa-var-car: "\f1b9"; +$fa-var-caret-down: "\f0d7"; +$fa-var-caret-left: "\f0d9"; +$fa-var-caret-right: "\f0da"; +$fa-var-caret-square-o-down: "\f150"; +$fa-var-caret-square-o-left: "\f191"; +$fa-var-caret-square-o-right: "\f152"; +$fa-var-caret-square-o-up: "\f151"; +$fa-var-caret-up: "\f0d8"; +$fa-var-cc: "\f20a"; +$fa-var-cc-amex: "\f1f3"; +$fa-var-cc-discover: "\f1f2"; +$fa-var-cc-mastercard: "\f1f1"; +$fa-var-cc-paypal: "\f1f4"; +$fa-var-cc-stripe: "\f1f5"; +$fa-var-cc-visa: "\f1f0"; +$fa-var-certificate: "\f0a3"; +$fa-var-chain: "\f0c1"; +$fa-var-chain-broken: "\f127"; +$fa-var-check: "\f00c"; +$fa-var-check-circle: "\f058"; +$fa-var-check-circle-o: "\f05d"; +$fa-var-check-square: "\f14a"; +$fa-var-check-square-o: "\f046"; +$fa-var-chevron-circle-down: "\f13a"; +$fa-var-chevron-circle-left: "\f137"; +$fa-var-chevron-circle-right: "\f138"; +$fa-var-chevron-circle-up: "\f139"; +$fa-var-chevron-down: "\f078"; +$fa-var-chevron-left: "\f053"; +$fa-var-chevron-right: "\f054"; +$fa-var-chevron-up: "\f077"; +$fa-var-child: "\f1ae"; +$fa-var-circle: "\f111"; +$fa-var-circle-o: "\f10c"; +$fa-var-circle-o-notch: "\f1ce"; +$fa-var-circle-thin: "\f1db"; +$fa-var-clipboard: "\f0ea"; +$fa-var-clock-o: "\f017"; +$fa-var-close: "\f00d"; +$fa-var-cloud: "\f0c2"; +$fa-var-cloud-download: "\f0ed"; +$fa-var-cloud-upload: "\f0ee"; +$fa-var-cny: "\f157"; +$fa-var-code: "\f121"; +$fa-var-code-fork: "\f126"; +$fa-var-codepen: "\f1cb"; +$fa-var-coffee: "\f0f4"; +$fa-var-cog: "\f013"; +$fa-var-cogs: "\f085"; +$fa-var-columns: "\f0db"; +$fa-var-comment: "\f075"; +$fa-var-comment-o: "\f0e5"; +$fa-var-comments: "\f086"; +$fa-var-comments-o: "\f0e6"; +$fa-var-compass: "\f14e"; +$fa-var-compress: "\f066"; +$fa-var-copy: "\f0c5"; +$fa-var-copyright: "\f1f9"; +$fa-var-credit-card: "\f09d"; +$fa-var-crop: "\f125"; +$fa-var-crosshairs: "\f05b"; +$fa-var-css3: "\f13c"; +$fa-var-cube: "\f1b2"; +$fa-var-cubes: "\f1b3"; +$fa-var-cut: "\f0c4"; +$fa-var-cutlery: "\f0f5"; +$fa-var-dashboard: "\f0e4"; +$fa-var-database: "\f1c0"; +$fa-var-dedent: "\f03b"; +$fa-var-delicious: "\f1a5"; +$fa-var-desktop: "\f108"; +$fa-var-deviantart: "\f1bd"; +$fa-var-digg: "\f1a6"; +$fa-var-dollar: "\f155"; +$fa-var-dot-circle-o: "\f192"; +$fa-var-download: "\f019"; +$fa-var-dribbble: "\f17d"; +$fa-var-dropbox: "\f16b"; +$fa-var-drupal: "\f1a9"; +$fa-var-edit: "\f044"; +$fa-var-eject: "\f052"; +$fa-var-ellipsis-h: "\f141"; +$fa-var-ellipsis-v: "\f142"; +$fa-var-empire: "\f1d1"; +$fa-var-envelope: "\f0e0"; +$fa-var-envelope-o: "\f003"; +$fa-var-envelope-square: "\f199"; +$fa-var-eraser: "\f12d"; +$fa-var-eur: "\f153"; +$fa-var-euro: "\f153"; +$fa-var-exchange: "\f0ec"; +$fa-var-exclamation: "\f12a"; +$fa-var-exclamation-circle: "\f06a"; +$fa-var-exclamation-triangle: "\f071"; +$fa-var-expand: "\f065"; +$fa-var-external-link: "\f08e"; +$fa-var-external-link-square: "\f14c"; +$fa-var-eye: "\f06e"; +$fa-var-eye-slash: "\f070"; +$fa-var-eyedropper: "\f1fb"; +$fa-var-facebook: "\f09a"; +$fa-var-facebook-square: "\f082"; +$fa-var-fast-backward: "\f049"; +$fa-var-fast-forward: "\f050"; +$fa-var-fax: "\f1ac"; +$fa-var-female: "\f182"; +$fa-var-fighter-jet: "\f0fb"; +$fa-var-file: "\f15b"; +$fa-var-file-archive-o: "\f1c6"; +$fa-var-file-audio-o: "\f1c7"; +$fa-var-file-code-o: "\f1c9"; +$fa-var-file-excel-o: "\f1c3"; +$fa-var-file-image-o: "\f1c5"; +$fa-var-file-movie-o: "\f1c8"; +$fa-var-file-o: "\f016"; +$fa-var-file-pdf-o: "\f1c1"; +$fa-var-file-photo-o: "\f1c5"; +$fa-var-file-picture-o: "\f1c5"; +$fa-var-file-powerpoint-o: "\f1c4"; +$fa-var-file-sound-o: "\f1c7"; +$fa-var-file-text: "\f15c"; +$fa-var-file-text-o: "\f0f6"; +$fa-var-file-video-o: "\f1c8"; +$fa-var-file-word-o: "\f1c2"; +$fa-var-file-zip-o: "\f1c6"; +$fa-var-files-o: "\f0c5"; +$fa-var-film: "\f008"; +$fa-var-filter: "\f0b0"; +$fa-var-fire: "\f06d"; +$fa-var-fire-extinguisher: "\f134"; +$fa-var-flag: "\f024"; +$fa-var-flag-checkered: "\f11e"; +$fa-var-flag-o: "\f11d"; +$fa-var-flash: "\f0e7"; +$fa-var-flask: "\f0c3"; +$fa-var-flickr: "\f16e"; +$fa-var-floppy-o: "\f0c7"; +$fa-var-folder: "\f07b"; +$fa-var-folder-o: "\f114"; +$fa-var-folder-open: "\f07c"; +$fa-var-folder-open-o: "\f115"; +$fa-var-font: "\f031"; +$fa-var-forward: "\f04e"; +$fa-var-foursquare: "\f180"; +$fa-var-frown-o: "\f119"; +$fa-var-futbol-o: "\f1e3"; +$fa-var-gamepad: "\f11b"; +$fa-var-gavel: "\f0e3"; +$fa-var-gbp: "\f154"; +$fa-var-ge: "\f1d1"; +$fa-var-gear: "\f013"; +$fa-var-gears: "\f085"; +$fa-var-gift: "\f06b"; +$fa-var-git: "\f1d3"; +$fa-var-git-square: "\f1d2"; +$fa-var-github: "\f09b"; +$fa-var-github-alt: "\f113"; +$fa-var-github-square: "\f092"; +$fa-var-gittip: "\f184"; +$fa-var-glass: "\f000"; +$fa-var-globe: "\f0ac"; +$fa-var-google: "\f1a0"; +$fa-var-google-plus: "\f0d5"; +$fa-var-google-plus-square: "\f0d4"; +$fa-var-google-wallet: "\f1ee"; +$fa-var-graduation-cap: "\f19d"; +$fa-var-group: "\f0c0"; +$fa-var-h-square: "\f0fd"; +$fa-var-hacker-news: "\f1d4"; +$fa-var-hand-o-down: "\f0a7"; +$fa-var-hand-o-left: "\f0a5"; +$fa-var-hand-o-right: "\f0a4"; +$fa-var-hand-o-up: "\f0a6"; +$fa-var-hdd-o: "\f0a0"; +$fa-var-header: "\f1dc"; +$fa-var-headphones: "\f025"; +$fa-var-heart: "\f004"; +$fa-var-heart-o: "\f08a"; +$fa-var-history: "\f1da"; +$fa-var-home: "\f015"; +$fa-var-hospital-o: "\f0f8"; +$fa-var-html5: "\f13b"; +$fa-var-ils: "\f20b"; +$fa-var-image: "\f03e"; +$fa-var-inbox: "\f01c"; +$fa-var-indent: "\f03c"; +$fa-var-info: "\f129"; +$fa-var-info-circle: "\f05a"; +$fa-var-inr: "\f156"; +$fa-var-instagram: "\f16d"; +$fa-var-institution: "\f19c"; +$fa-var-ioxhost: "\f208"; +$fa-var-italic: "\f033"; +$fa-var-joomla: "\f1aa"; +$fa-var-jpy: "\f157"; +$fa-var-jsfiddle: "\f1cc"; +$fa-var-key: "\f084"; +$fa-var-keyboard-o: "\f11c"; +$fa-var-krw: "\f159"; +$fa-var-language: "\f1ab"; +$fa-var-laptop: "\f109"; +$fa-var-lastfm: "\f202"; +$fa-var-lastfm-square: "\f203"; +$fa-var-leaf: "\f06c"; +$fa-var-legal: "\f0e3"; +$fa-var-lemon-o: "\f094"; +$fa-var-level-down: "\f149"; +$fa-var-level-up: "\f148"; +$fa-var-life-bouy: "\f1cd"; +$fa-var-life-buoy: "\f1cd"; +$fa-var-life-ring: "\f1cd"; +$fa-var-life-saver: "\f1cd"; +$fa-var-lightbulb-o: "\f0eb"; +$fa-var-line-chart: "\f201"; +$fa-var-link: "\f0c1"; +$fa-var-linkedin: "\f0e1"; +$fa-var-linkedin-square: "\f08c"; +$fa-var-linux: "\f17c"; +$fa-var-list: "\f03a"; +$fa-var-list-alt: "\f022"; +$fa-var-list-ol: "\f0cb"; +$fa-var-list-ul: "\f0ca"; +$fa-var-location-arrow: "\f124"; +$fa-var-lock: "\f023"; +$fa-var-long-arrow-down: "\f175"; +$fa-var-long-arrow-left: "\f177"; +$fa-var-long-arrow-right: "\f178"; +$fa-var-long-arrow-up: "\f176"; +$fa-var-magic: "\f0d0"; +$fa-var-magnet: "\f076"; +$fa-var-mail-forward: "\f064"; +$fa-var-mail-reply: "\f112"; +$fa-var-mail-reply-all: "\f122"; +$fa-var-male: "\f183"; +$fa-var-map-marker: "\f041"; +$fa-var-maxcdn: "\f136"; +$fa-var-meanpath: "\f20c"; +$fa-var-medkit: "\f0fa"; +$fa-var-meh-o: "\f11a"; +$fa-var-microphone: "\f130"; +$fa-var-microphone-slash: "\f131"; +$fa-var-minus: "\f068"; +$fa-var-minus-circle: "\f056"; +$fa-var-minus-square: "\f146"; +$fa-var-minus-square-o: "\f147"; +$fa-var-mobile: "\f10b"; +$fa-var-mobile-phone: "\f10b"; +$fa-var-money: "\f0d6"; +$fa-var-moon-o: "\f186"; +$fa-var-mortar-board: "\f19d"; +$fa-var-music: "\f001"; +$fa-var-navicon: "\f0c9"; +$fa-var-newspaper-o: "\f1ea"; +$fa-var-openid: "\f19b"; +$fa-var-outdent: "\f03b"; +$fa-var-pagelines: "\f18c"; +$fa-var-paint-brush: "\f1fc"; +$fa-var-paper-plane: "\f1d8"; +$fa-var-paper-plane-o: "\f1d9"; +$fa-var-paperclip: "\f0c6"; +$fa-var-paragraph: "\f1dd"; +$fa-var-paste: "\f0ea"; +$fa-var-pause: "\f04c"; +$fa-var-paw: "\f1b0"; +$fa-var-paypal: "\f1ed"; +$fa-var-pencil: "\f040"; +$fa-var-pencil-square: "\f14b"; +$fa-var-pencil-square-o: "\f044"; +$fa-var-phone: "\f095"; +$fa-var-phone-square: "\f098"; +$fa-var-photo: "\f03e"; +$fa-var-picture-o: "\f03e"; +$fa-var-pie-chart: "\f200"; +$fa-var-pied-piper: "\f1a7"; +$fa-var-pied-piper-alt: "\f1a8"; +$fa-var-pinterest: "\f0d2"; +$fa-var-pinterest-square: "\f0d3"; +$fa-var-plane: "\f072"; +$fa-var-play: "\f04b"; +$fa-var-play-circle: "\f144"; +$fa-var-play-circle-o: "\f01d"; +$fa-var-plug: "\f1e6"; +$fa-var-plus: "\f067"; +$fa-var-plus-circle: "\f055"; +$fa-var-plus-square: "\f0fe"; +$fa-var-plus-square-o: "\f196"; +$fa-var-power-off: "\f011"; +$fa-var-print: "\f02f"; +$fa-var-puzzle-piece: "\f12e"; +$fa-var-qq: "\f1d6"; +$fa-var-qrcode: "\f029"; +$fa-var-question: "\f128"; +$fa-var-question-circle: "\f059"; +$fa-var-quote-left: "\f10d"; +$fa-var-quote-right: "\f10e"; +$fa-var-ra: "\f1d0"; +$fa-var-random: "\f074"; +$fa-var-rebel: "\f1d0"; +$fa-var-recycle: "\f1b8"; +$fa-var-reddit: "\f1a1"; +$fa-var-reddit-square: "\f1a2"; +$fa-var-refresh: "\f021"; +$fa-var-remove: "\f00d"; +$fa-var-renren: "\f18b"; +$fa-var-reorder: "\f0c9"; +$fa-var-repeat: "\f01e"; +$fa-var-reply: "\f112"; +$fa-var-reply-all: "\f122"; +$fa-var-retweet: "\f079"; +$fa-var-rmb: "\f157"; +$fa-var-road: "\f018"; +$fa-var-rocket: "\f135"; +$fa-var-rotate-left: "\f0e2"; +$fa-var-rotate-right: "\f01e"; +$fa-var-rouble: "\f158"; +$fa-var-rss: "\f09e"; +$fa-var-rss-square: "\f143"; +$fa-var-rub: "\f158"; +$fa-var-ruble: "\f158"; +$fa-var-rupee: "\f156"; +$fa-var-save: "\f0c7"; +$fa-var-scissors: "\f0c4"; +$fa-var-search: "\f002"; +$fa-var-search-minus: "\f010"; +$fa-var-search-plus: "\f00e"; +$fa-var-send: "\f1d8"; +$fa-var-send-o: "\f1d9"; +$fa-var-share: "\f064"; +$fa-var-share-alt: "\f1e0"; +$fa-var-share-alt-square: "\f1e1"; +$fa-var-share-square: "\f14d"; +$fa-var-share-square-o: "\f045"; +$fa-var-shekel: "\f20b"; +$fa-var-sheqel: "\f20b"; +$fa-var-shield: "\f132"; +$fa-var-shopping-cart: "\f07a"; +$fa-var-sign-in: "\f090"; +$fa-var-sign-out: "\f08b"; +$fa-var-signal: "\f012"; +$fa-var-sitemap: "\f0e8"; +$fa-var-skype: "\f17e"; +$fa-var-slack: "\f198"; +$fa-var-sliders: "\f1de"; +$fa-var-slideshare: "\f1e7"; +$fa-var-smile-o: "\f118"; +$fa-var-soccer-ball-o: "\f1e3"; +$fa-var-sort: "\f0dc"; +$fa-var-sort-alpha-asc: "\f15d"; +$fa-var-sort-alpha-desc: "\f15e"; +$fa-var-sort-amount-asc: "\f160"; +$fa-var-sort-amount-desc: "\f161"; +$fa-var-sort-asc: "\f0de"; +$fa-var-sort-desc: "\f0dd"; +$fa-var-sort-down: "\f0dd"; +$fa-var-sort-numeric-asc: "\f162"; +$fa-var-sort-numeric-desc: "\f163"; +$fa-var-sort-up: "\f0de"; +$fa-var-soundcloud: "\f1be"; +$fa-var-space-shuttle: "\f197"; +$fa-var-spinner: "\f110"; +$fa-var-spoon: "\f1b1"; +$fa-var-spotify: "\f1bc"; +$fa-var-square: "\f0c8"; +$fa-var-square-o: "\f096"; +$fa-var-stack-exchange: "\f18d"; +$fa-var-stack-overflow: "\f16c"; +$fa-var-star: "\f005"; +$fa-var-star-half: "\f089"; +$fa-var-star-half-empty: "\f123"; +$fa-var-star-half-full: "\f123"; +$fa-var-star-half-o: "\f123"; +$fa-var-star-o: "\f006"; +$fa-var-steam: "\f1b6"; +$fa-var-steam-square: "\f1b7"; +$fa-var-step-backward: "\f048"; +$fa-var-step-forward: "\f051"; +$fa-var-stethoscope: "\f0f1"; +$fa-var-stop: "\f04d"; +$fa-var-strikethrough: "\f0cc"; +$fa-var-stumbleupon: "\f1a4"; +$fa-var-stumbleupon-circle: "\f1a3"; +$fa-var-subscript: "\f12c"; +$fa-var-suitcase: "\f0f2"; +$fa-var-sun-o: "\f185"; +$fa-var-superscript: "\f12b"; +$fa-var-support: "\f1cd"; +$fa-var-table: "\f0ce"; +$fa-var-tablet: "\f10a"; +$fa-var-tachometer: "\f0e4"; +$fa-var-tag: "\f02b"; +$fa-var-tags: "\f02c"; +$fa-var-tasks: "\f0ae"; +$fa-var-taxi: "\f1ba"; +$fa-var-tencent-weibo: "\f1d5"; +$fa-var-terminal: "\f120"; +$fa-var-text-height: "\f034"; +$fa-var-text-width: "\f035"; +$fa-var-th: "\f00a"; +$fa-var-th-large: "\f009"; +$fa-var-th-list: "\f00b"; +$fa-var-thumb-tack: "\f08d"; +$fa-var-thumbs-down: "\f165"; +$fa-var-thumbs-o-down: "\f088"; +$fa-var-thumbs-o-up: "\f087"; +$fa-var-thumbs-up: "\f164"; +$fa-var-ticket: "\f145"; +$fa-var-times: "\f00d"; +$fa-var-times-circle: "\f057"; +$fa-var-times-circle-o: "\f05c"; +$fa-var-tint: "\f043"; +$fa-var-toggle-down: "\f150"; +$fa-var-toggle-left: "\f191"; +$fa-var-toggle-off: "\f204"; +$fa-var-toggle-on: "\f205"; +$fa-var-toggle-right: "\f152"; +$fa-var-toggle-up: "\f151"; +$fa-var-trash: "\f1f8"; +$fa-var-trash-o: "\f014"; +$fa-var-tree: "\f1bb"; +$fa-var-trello: "\f181"; +$fa-var-trophy: "\f091"; +$fa-var-truck: "\f0d1"; +$fa-var-try: "\f195"; +$fa-var-tty: "\f1e4"; +$fa-var-tumblr: "\f173"; +$fa-var-tumblr-square: "\f174"; +$fa-var-turkish-lira: "\f195"; +$fa-var-twitch: "\f1e8"; +$fa-var-twitter: "\f099"; +$fa-var-twitter-square: "\f081"; +$fa-var-umbrella: "\f0e9"; +$fa-var-underline: "\f0cd"; +$fa-var-undo: "\f0e2"; +$fa-var-university: "\f19c"; +$fa-var-unlink: "\f127"; +$fa-var-unlock: "\f09c"; +$fa-var-unlock-alt: "\f13e"; +$fa-var-unsorted: "\f0dc"; +$fa-var-upload: "\f093"; +$fa-var-usd: "\f155"; +$fa-var-user: "\f007"; +$fa-var-user-md: "\f0f0"; +$fa-var-users: "\f0c0"; +$fa-var-video-camera: "\f03d"; +$fa-var-vimeo-square: "\f194"; +$fa-var-vine: "\f1ca"; +$fa-var-vk: "\f189"; +$fa-var-volume-down: "\f027"; +$fa-var-volume-off: "\f026"; +$fa-var-volume-up: "\f028"; +$fa-var-warning: "\f071"; +$fa-var-wechat: "\f1d7"; +$fa-var-weibo: "\f18a"; +$fa-var-weixin: "\f1d7"; +$fa-var-wheelchair: "\f193"; +$fa-var-wifi: "\f1eb"; +$fa-var-windows: "\f17a"; +$fa-var-won: "\f159"; +$fa-var-wordpress: "\f19a"; +$fa-var-wrench: "\f0ad"; +$fa-var-xing: "\f168"; +$fa-var-xing-square: "\f169"; +$fa-var-yahoo: "\f19e"; +$fa-var-yelp: "\f1e9"; +$fa-var-yen: "\f157"; +$fa-var-youtube: "\f167"; +$fa-var-youtube-play: "\f16a"; +$fa-var-youtube-square: "\f166"; + diff --git a/theme/bootstrap/font-awesome/scss/font-awesome.scss b/theme/bootstrap/font-awesome/scss/font-awesome.scss new file mode 100644 index 0000000..f300c09 --- /dev/null +++ b/theme/bootstrap/font-awesome/scss/font-awesome.scss @@ -0,0 +1,17 @@ +/*! + * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables"; +@import "mixins"; +@import "path"; +@import "core"; +@import "larger"; +@import "fixed-width"; +@import "list"; +@import "bordered-pulled"; +@import "spinning"; +@import "rotated-flipped"; +@import "stacked"; +@import "icons"; diff --git a/theme/bootstrap/fonts/glyphicons-halflings-regular.eot b/theme/bootstrap/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000..b93a495 Binary files /dev/null and b/theme/bootstrap/fonts/glyphicons-halflings-regular.eot differ diff --git a/theme/bootstrap/fonts/glyphicons-halflings-regular.svg b/theme/bootstrap/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000..94fb549 --- /dev/null +++ b/theme/bootstrap/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,288 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata></metadata> +<defs> +<font id="glyphicons_halflingsregular" horiz-adv-x="1200" > +<font-face units-per-em="1200" ascent="960" descent="-240" /> +<missing-glyph horiz-adv-x="500" /> +<glyph horiz-adv-x="0" /> +<glyph horiz-adv-x="400" /> +<glyph unicode=" " /> +<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" /> +<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xa0;" /> +<glyph unicode="&#xa5;" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" /> +<glyph unicode="&#x2000;" horiz-adv-x="650" /> +<glyph unicode="&#x2001;" horiz-adv-x="1300" /> +<glyph unicode="&#x2002;" horiz-adv-x="650" /> +<glyph unicode="&#x2003;" horiz-adv-x="1300" /> +<glyph unicode="&#x2004;" horiz-adv-x="433" /> +<glyph unicode="&#x2005;" horiz-adv-x="325" /> +<glyph unicode="&#x2006;" horiz-adv-x="216" /> +<glyph unicode="&#x2007;" horiz-adv-x="216" /> +<glyph unicode="&#x2008;" horiz-adv-x="162" /> +<glyph unicode="&#x2009;" horiz-adv-x="260" /> +<glyph unicode="&#x200a;" horiz-adv-x="72" /> +<glyph unicode="&#x202f;" horiz-adv-x="260" /> +<glyph unicode="&#x205f;" horiz-adv-x="325" /> +<glyph unicode="&#x20ac;" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" /> +<glyph unicode="&#x20bd;" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" /> +<glyph unicode="&#x2212;" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#x231b;" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" /> +<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" /> +<glyph unicode="&#x2601;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" /> +<glyph unicode="&#x26fa;" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " /> +<glyph unicode="&#x2709;" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" /> +<glyph unicode="&#x270f;" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" /> +<glyph unicode="&#xe001;" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" /> +<glyph unicode="&#xe002;" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" /> +<glyph unicode="&#xe003;" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" /> +<glyph unicode="&#xe005;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" /> +<glyph unicode="&#xe006;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" /> +<glyph unicode="&#xe007;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" /> +<glyph unicode="&#xe008;" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" /> +<glyph unicode="&#xe009;" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" /> +<glyph unicode="&#xe010;" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe011;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" /> +<glyph unicode="&#xe012;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe013;" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" /> +<glyph unicode="&#xe014;" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" /> +<glyph unicode="&#xe015;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe016;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe017;" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" /> +<glyph unicode="&#xe018;" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe019;" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" /> +<glyph unicode="&#xe020;" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" /> +<glyph unicode="&#xe021;" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" /> +<glyph unicode="&#xe022;" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" /> +<glyph unicode="&#xe023;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe024;" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" /> +<glyph unicode="&#xe025;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe026;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " /> +<glyph unicode="&#xe027;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" /> +<glyph unicode="&#xe028;" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" /> +<glyph unicode="&#xe029;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" /> +<glyph unicode="&#xe030;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" /> +<glyph unicode="&#xe031;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" /> +<glyph unicode="&#xe032;" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe033;" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" /> +<glyph unicode="&#xe034;" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" /> +<glyph unicode="&#xe035;" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" /> +<glyph unicode="&#xe036;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" /> +<glyph unicode="&#xe037;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" /> +<glyph unicode="&#xe038;" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" /> +<glyph unicode="&#xe039;" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" /> +<glyph unicode="&#xe040;" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" /> +<glyph unicode="&#xe041;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" /> +<glyph unicode="&#xe042;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" /> +<glyph unicode="&#xe043;" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" /> +<glyph unicode="&#xe044;" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe045;" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" /> +<glyph unicode="&#xe046;" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" /> +<glyph unicode="&#xe047;" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" /> +<glyph unicode="&#xe048;" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" /> +<glyph unicode="&#xe049;" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" /> +<glyph unicode="&#xe050;" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" /> +<glyph unicode="&#xe051;" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" /> +<glyph unicode="&#xe052;" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe053;" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe054;" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" /> +<glyph unicode="&#xe055;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe056;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe057;" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe058;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe059;" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" /> +<glyph unicode="&#xe060;" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" /> +<glyph unicode="&#xe062;" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" /> +<glyph unicode="&#xe063;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" /> +<glyph unicode="&#xe064;" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" /> +<glyph unicode="&#xe065;" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" /> +<glyph unicode="&#xe066;" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" /> +<glyph unicode="&#xe067;" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" /> +<glyph unicode="&#xe068;" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" /> +<glyph unicode="&#xe069;" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe070;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe071;" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" /> +<glyph unicode="&#xe072;" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" /> +<glyph unicode="&#xe073;" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe074;" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" /> +<glyph unicode="&#xe075;" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" /> +<glyph unicode="&#xe076;" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe077;" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe078;" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe079;" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" /> +<glyph unicode="&#xe080;" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" /> +<glyph unicode="&#xe081;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" /> +<glyph unicode="&#xe082;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" /> +<glyph unicode="&#xe083;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" /> +<glyph unicode="&#xe084;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" /> +<glyph unicode="&#xe085;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" /> +<glyph unicode="&#xe086;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" /> +<glyph unicode="&#xe087;" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" /> +<glyph unicode="&#xe088;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" /> +<glyph unicode="&#xe089;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" /> +<glyph unicode="&#xe090;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" /> +<glyph unicode="&#xe091;" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" /> +<glyph unicode="&#xe092;" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" /> +<glyph unicode="&#xe093;" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" /> +<glyph unicode="&#xe094;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe095;" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" /> +<glyph unicode="&#xe096;" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" /> +<glyph unicode="&#xe097;" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" /> +<glyph unicode="&#xe101;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" /> +<glyph unicode="&#xe102;" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" /> +<glyph unicode="&#xe103;" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" /> +<glyph unicode="&#xe104;" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" /> +<glyph unicode="&#xe105;" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" /> +<glyph unicode="&#xe106;" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" /> +<glyph unicode="&#xe107;" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" /> +<glyph unicode="&#xe108;" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" /> +<glyph unicode="&#xe109;" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" /> +<glyph unicode="&#xe110;" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" /> +<glyph unicode="&#xe111;" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" /> +<glyph unicode="&#xe112;" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" /> +<glyph unicode="&#xe113;" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" /> +<glyph unicode="&#xe114;" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" /> +<glyph unicode="&#xe115;" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> +<glyph unicode="&#xe116;" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" /> +<glyph unicode="&#xe117;" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" /> +<glyph unicode="&#xe118;" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" /> +<glyph unicode="&#xe119;" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> +<glyph unicode="&#xe120;" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" /> +<glyph unicode="&#xe121;" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" /> +<glyph unicode="&#xe122;" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" /> +<glyph unicode="&#xe123;" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" /> +<glyph unicode="&#xe124;" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" /> +<glyph unicode="&#xe125;" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe126;" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" /> +<glyph unicode="&#xe127;" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe128;" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe129;" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe130;" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" /> +<glyph unicode="&#xe131;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" /> +<glyph unicode="&#xe132;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" /> +<glyph unicode="&#xe133;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" /> +<glyph unicode="&#xe134;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" /> +<glyph unicode="&#xe135;" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" /> +<glyph unicode="&#xe136;" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" /> +<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " /> +<glyph unicode="&#xe138;" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" /> +<glyph unicode="&#xe139;" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" /> +<glyph unicode="&#xe140;" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" /> +<glyph unicode="&#xe141;" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" /> +<glyph unicode="&#xe142;" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" /> +<glyph unicode="&#xe143;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" /> +<glyph unicode="&#xe144;" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" /> +<glyph unicode="&#xe145;" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" /> +<glyph unicode="&#xe146;" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" /> +<glyph unicode="&#xe148;" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" /> +<glyph unicode="&#xe149;" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" /> +<glyph unicode="&#xe150;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> +<glyph unicode="&#xe151;" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " /> +<glyph unicode="&#xe152;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " /> +<glyph unicode="&#xe153;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" /> +<glyph unicode="&#xe154;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" /> +<glyph unicode="&#xe155;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" /> +<glyph unicode="&#xe156;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" /> +<glyph unicode="&#xe157;" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" /> +<glyph unicode="&#xe158;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" /> +<glyph unicode="&#xe159;" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" /> +<glyph unicode="&#xe160;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" /> +<glyph unicode="&#xe161;" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" /> +<glyph unicode="&#xe162;" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" /> +<glyph unicode="&#xe163;" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" /> +<glyph unicode="&#xe164;" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" /> +<glyph unicode="&#xe165;" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" /> +<glyph unicode="&#xe166;" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" /> +<glyph unicode="&#xe167;" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" /> +<glyph unicode="&#xe168;" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" /> +<glyph unicode="&#xe169;" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" /> +<glyph unicode="&#xe170;" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" /> +<glyph unicode="&#xe171;" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" /> +<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" /> +<glyph unicode="&#xe173;" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" /> +<glyph unicode="&#xe174;" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" /> +<glyph unicode="&#xe175;" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe176;" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" /> +<glyph unicode="&#xe177;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" /> +<glyph unicode="&#xe178;" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" /> +<glyph unicode="&#xe179;" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" /> +<glyph unicode="&#xe180;" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" /> +<glyph unicode="&#xe181;" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" /> +<glyph unicode="&#xe182;" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" /> +<glyph unicode="&#xe183;" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" /> +<glyph unicode="&#xe184;" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe185;" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " /> +<glyph unicode="&#xe186;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" /> +<glyph unicode="&#xe187;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" /> +<glyph unicode="&#xe188;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" /> +<glyph unicode="&#xe189;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" /> +<glyph unicode="&#xe190;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" /> +<glyph unicode="&#xe191;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" /> +<glyph unicode="&#xe192;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" /> +<glyph unicode="&#xe193;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" /> +<glyph unicode="&#xe194;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" /> +<glyph unicode="&#xe195;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" /> +<glyph unicode="&#xe197;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe198;" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" /> +<glyph unicode="&#xe199;" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" /> +<glyph unicode="&#xe200;" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" /> +<glyph unicode="&#xe201;" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" /> +<glyph unicode="&#xe202;" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" /> +<glyph unicode="&#xe203;" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" /> +<glyph unicode="&#xe204;" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" /> +<glyph unicode="&#xe205;" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" /> +<glyph unicode="&#xe206;" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" /> +<glyph unicode="&#xe209;" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" /> +<glyph unicode="&#xe210;" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe211;" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe212;" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe213;" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe214;" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe215;" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe216;" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" /> +<glyph unicode="&#xe218;" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" /> +<glyph unicode="&#xe219;" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" /> +<glyph unicode="&#xe221;" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe223;" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" /> +<glyph unicode="&#xe224;" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " /> +<glyph unicode="&#xe225;" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" /> +<glyph unicode="&#xe226;" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" /> +<glyph unicode="&#xe227;" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" /> +<glyph unicode="&#xe230;" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" /> +<glyph unicode="&#xe231;" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" /> +<glyph unicode="&#xe232;" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" /> +<glyph unicode="&#xe233;" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" /> +<glyph unicode="&#xe234;" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" /> +<glyph unicode="&#xe235;" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" /> +<glyph unicode="&#xe236;" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe237;" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" /> +<glyph unicode="&#xe238;" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe239;" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" /> +<glyph unicode="&#xe240;" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" /> +<glyph unicode="&#xe241;" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" /> +<glyph unicode="&#xe242;" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" /> +<glyph unicode="&#xe243;" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" /> +<glyph unicode="&#xe244;" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" /> +<glyph unicode="&#xe245;" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" /> +<glyph unicode="&#xe246;" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" /> +<glyph unicode="&#xe247;" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe248;" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" /> +<glyph unicode="&#xe249;" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe250;" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" /> +<glyph unicode="&#xe251;" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" /> +<glyph unicode="&#xe252;" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" /> +<glyph unicode="&#xe253;" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" /> +<glyph unicode="&#xe254;" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" /> +<glyph unicode="&#xe255;" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" /> +<glyph unicode="&#xe256;" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" /> +<glyph unicode="&#xe257;" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" /> +<glyph unicode="&#xe258;" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" /> +<glyph unicode="&#xe259;" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" /> +<glyph unicode="&#xe260;" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" /> +<glyph unicode="&#xf8ff;" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" /> +<glyph unicode="&#x1f511;" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" /> +<glyph unicode="&#x1f6aa;" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/theme/bootstrap/fonts/glyphicons-halflings-regular.ttf b/theme/bootstrap/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000..1413fc6 Binary files /dev/null and b/theme/bootstrap/fonts/glyphicons-halflings-regular.ttf differ diff --git a/theme/bootstrap/fonts/glyphicons-halflings-regular.woff b/theme/bootstrap/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000..9e61285 Binary files /dev/null and b/theme/bootstrap/fonts/glyphicons-halflings-regular.woff differ diff --git a/theme/bootstrap/fonts/glyphicons-halflings-regular.woff2 b/theme/bootstrap/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000..64539b5 Binary files /dev/null and b/theme/bootstrap/fonts/glyphicons-halflings-regular.woff2 differ diff --git a/theme/bootstrap/index.html b/theme/bootstrap/index.html new file mode 100644 index 0000000..f832042 --- /dev/null +++ b/theme/bootstrap/index.html @@ -0,0 +1,1107 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Dashboard</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="dist/css/skins/_all-skins.min.css"> + <!-- iCheck --> + <link rel="stylesheet" href="plugins/iCheck/flat/blue.css"> + <!-- Morris chart --> + <link rel="stylesheet" href="plugins/morris/morris.css"> + <!-- jvectormap --> + <link rel="stylesheet" href="plugins/jvectormap/jquery-jvectormap-1.2.2.css"> + <!-- Date Picker --> + <link rel="stylesheet" href="plugins/datepicker/datepicker3.css"> + <!-- Daterange picker --> + <link rel="stylesheet" href="plugins/daterangepicker/daterangepicker-bs3.css"> + <!-- bootstrap wysihtml5 - text editor --> + <link rel="stylesheet" href="plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + <li> + <a href="#"> + <div class="pull-left"> + <img src="dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + AdminLTE Design Team + <small><i class="fa fa-clock-o"></i> 2 hours</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Developers + <small><i class="fa fa-clock-o"></i> Today</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Sales Department + <small><i class="fa fa-clock-o"></i> Yesterday</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Reviewers + <small><i class="fa fa-clock-o"></i> 2 days</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-users text-red"></i> 5 new members joined + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-shopping-cart text-green"></i> 25 sales made + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-user text-red"></i> You changed your username + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Create a nice theme + <small class="pull-right">40%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">40% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Some task I need to do + <small class="pull-right">60%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">60% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Make beautiful transitions + <small class="pull-right">80%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="active treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li class="active"><a href="index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="pages/layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="pages/layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="pages/layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="pages/layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="pages/widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="pages/charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="pages/charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="pages/charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="pages/charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="pages/UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="pages/UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="pages/UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="pages/UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="pages/UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="pages/UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="pages/forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="pages/forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="pages/forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="pages/tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="pages/tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="pages/calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="pages/mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="pages/examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="pages/examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="pages/examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="pages/examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="pages/examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="pages/examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="pages/examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="pages/examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Dashboard + <small>Control panel</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li class="active">Dashboard</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <!-- Small boxes (Stat box) --> + <div class="row"> + <div class="col-lg-3 col-xs-6"> + <!-- small box --> + <div class="small-box bg-aqua"> + <div class="inner"> + <h3>150</h3> + <p>New Orders</p> + </div> + <div class="icon"> + <i class="ion ion-bag"></i> + </div> + <a href="#" class="small-box-footer">More info <i class="fa fa-arrow-circle-right"></i></a> + </div> + </div><!-- ./col --> + <div class="col-lg-3 col-xs-6"> + <!-- small box --> + <div class="small-box bg-green"> + <div class="inner"> + <h3>53<sup style="font-size: 20px">%</sup></h3> + <p>Bounce Rate</p> + </div> + <div class="icon"> + <i class="ion ion-stats-bars"></i> + </div> + <a href="#" class="small-box-footer">More info <i class="fa fa-arrow-circle-right"></i></a> + </div> + </div><!-- ./col --> + <div class="col-lg-3 col-xs-6"> + <!-- small box --> + <div class="small-box bg-yellow"> + <div class="inner"> + <h3>44</h3> + <p>User Registrations</p> + </div> + <div class="icon"> + <i class="ion ion-person-add"></i> + </div> + <a href="#" class="small-box-footer">More info <i class="fa fa-arrow-circle-right"></i></a> + </div> + </div><!-- ./col --> + <div class="col-lg-3 col-xs-6"> + <!-- small box --> + <div class="small-box bg-red"> + <div class="inner"> + <h3>65</h3> + <p>Unique Visitors</p> + </div> + <div class="icon"> + <i class="ion ion-pie-graph"></i> + </div> + <a href="#" class="small-box-footer">More info <i class="fa fa-arrow-circle-right"></i></a> + </div> + </div><!-- ./col --> + </div><!-- /.row --> + <!-- Main row --> + <div class="row"> + <!-- Left col --> + <section class="col-lg-7 connectedSortable"> + <!-- Custom tabs (Charts with tabs)--> + <div class="nav-tabs-custom"> + <!-- Tabs within a box --> + <ul class="nav nav-tabs pull-right"> + <li class="active"><a href="#revenue-chart" data-toggle="tab">Area</a></li> + <li><a href="#sales-chart" data-toggle="tab">Donut</a></li> + <li class="pull-left header"><i class="fa fa-inbox"></i> Sales</li> + </ul> + <div class="tab-content no-padding"> + <!-- Morris chart - Sales --> + <div class="chart tab-pane active" id="revenue-chart" style="position: relative; height: 300px;"></div> + <div class="chart tab-pane" id="sales-chart" style="position: relative; height: 300px;"></div> + </div> + </div><!-- /.nav-tabs-custom --> + + <!-- Chat box --> + <div class="box box-success"> + <div class="box-header"> + <i class="fa fa-comments-o"></i> + <h3 class="box-title">Chat</h3> + <div class="box-tools pull-right" data-toggle="tooltip" title="Status"> + <div class="btn-group" data-toggle="btn-toggle" > + <button type="button" class="btn btn-default btn-sm active"><i class="fa fa-square text-green"></i></button> + <button type="button" class="btn btn-default btn-sm"><i class="fa fa-square text-red"></i></button> + </div> + </div> + </div> + <div class="box-body chat" id="chat-box"> + <!-- chat item --> + <div class="item"> + <img src="dist/img/user4-128x128.jpg" alt="user image" class="online"> + <p class="message"> + <a href="#" class="name"> + <small class="text-muted pull-right"><i class="fa fa-clock-o"></i> 2:15</small> + Mike Doe + </a> + I would like to meet you to discuss the latest news about + the arrival of the new theme. They say it is going to be one the + best themes on the market + </p> + <div class="attachment"> + <h4>Attachments:</h4> + <p class="filename"> + Theme-thumbnail-image.jpg + </p> + <div class="pull-right"> + <button class="btn btn-primary btn-sm btn-flat">Open</button> + </div> + </div><!-- /.attachment --> + </div><!-- /.item --> + <!-- chat item --> + <div class="item"> + <img src="dist/img/user3-128x128.jpg" alt="user image" class="offline"> + <p class="message"> + <a href="#" class="name"> + <small class="text-muted pull-right"><i class="fa fa-clock-o"></i> 5:15</small> + Alexander Pierce + </a> + I would like to meet you to discuss the latest news about + the arrival of the new theme. They say it is going to be one the + best themes on the market + </p> + </div><!-- /.item --> + <!-- chat item --> + <div class="item"> + <img src="dist/img/user2-160x160.jpg" alt="user image" class="offline"> + <p class="message"> + <a href="#" class="name"> + <small class="text-muted pull-right"><i class="fa fa-clock-o"></i> 5:30</small> + Susan Doe + </a> + I would like to meet you to discuss the latest news about + the arrival of the new theme. They say it is going to be one the + best themes on the market + </p> + </div><!-- /.item --> + </div><!-- /.chat --> + <div class="box-footer"> + <div class="input-group"> + <input class="form-control" placeholder="Type message..."> + <div class="input-group-btn"> + <button class="btn btn-success"><i class="fa fa-plus"></i></button> + </div> + </div> + </div> + </div><!-- /.box (chat box) --> + + <!-- TO DO List --> + <div class="box box-primary"> + <div class="box-header"> + <i class="ion ion-clipboard"></i> + <h3 class="box-title">To Do List</h3> + <div class="box-tools pull-right"> + <ul class="pagination pagination-sm inline"> + <li><a href="#">&laquo;</a></li> + <li><a href="#">1</a></li> + <li><a href="#">2</a></li> + <li><a href="#">3</a></li> + <li><a href="#">&raquo;</a></li> + </ul> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <ul class="todo-list"> + <li> + <!-- drag handle --> + <span class="handle"> + <i class="fa fa-ellipsis-v"></i> + <i class="fa fa-ellipsis-v"></i> + </span> + <!-- checkbox --> + <input type="checkbox" value="" name=""> + <!-- todo text --> + <span class="text">Design a nice theme</span> + <!-- Emphasis label --> + <small class="label label-danger"><i class="fa fa-clock-o"></i> 2 mins</small> + <!-- General tools such as edit or delete--> + <div class="tools"> + <i class="fa fa-edit"></i> + <i class="fa fa-trash-o"></i> + </div> + </li> + <li> + <span class="handle"> + <i class="fa fa-ellipsis-v"></i> + <i class="fa fa-ellipsis-v"></i> + </span> + <input type="checkbox" value="" name=""> + <span class="text">Make the theme responsive</span> + <small class="label label-info"><i class="fa fa-clock-o"></i> 4 hours</small> + <div class="tools"> + <i class="fa fa-edit"></i> + <i class="fa fa-trash-o"></i> + </div> + </li> + <li> + <span class="handle"> + <i class="fa fa-ellipsis-v"></i> + <i class="fa fa-ellipsis-v"></i> + </span> + <input type="checkbox" value="" name=""> + <span class="text">Let theme shine like a star</span> + <small class="label label-warning"><i class="fa fa-clock-o"></i> 1 day</small> + <div class="tools"> + <i class="fa fa-edit"></i> + <i class="fa fa-trash-o"></i> + </div> + </li> + <li> + <span class="handle"> + <i class="fa fa-ellipsis-v"></i> + <i class="fa fa-ellipsis-v"></i> + </span> + <input type="checkbox" value="" name=""> + <span class="text">Let theme shine like a star</span> + <small class="label label-success"><i class="fa fa-clock-o"></i> 3 days</small> + <div class="tools"> + <i class="fa fa-edit"></i> + <i class="fa fa-trash-o"></i> + </div> + </li> + <li> + <span class="handle"> + <i class="fa fa-ellipsis-v"></i> + <i class="fa fa-ellipsis-v"></i> + </span> + <input type="checkbox" value="" name=""> + <span class="text">Check your messages and notifications</span> + <small class="label label-primary"><i class="fa fa-clock-o"></i> 1 week</small> + <div class="tools"> + <i class="fa fa-edit"></i> + <i class="fa fa-trash-o"></i> + </div> + </li> + <li> + <span class="handle"> + <i class="fa fa-ellipsis-v"></i> + <i class="fa fa-ellipsis-v"></i> + </span> + <input type="checkbox" value="" name=""> + <span class="text">Let theme shine like a star</span> + <small class="label label-default"><i class="fa fa-clock-o"></i> 1 month</small> + <div class="tools"> + <i class="fa fa-edit"></i> + <i class="fa fa-trash-o"></i> + </div> + </li> + </ul> + </div><!-- /.box-body --> + <div class="box-footer clearfix no-border"> + <button class="btn btn-default pull-right"><i class="fa fa-plus"></i> Add item</button> + </div> + </div><!-- /.box --> + + <!-- quick email widget --> + <div class="box box-info"> + <div class="box-header"> + <i class="fa fa-envelope"></i> + <h3 class="box-title">Quick Email</h3> + <!-- tools box --> + <div class="pull-right box-tools"> + <button class="btn btn-info btn-sm" data-widget="remove" data-toggle="tooltip" title="Remove"><i class="fa fa-times"></i></button> + </div><!-- /. tools --> + </div> + <div class="box-body"> + <form action="#" method="post"> + <div class="form-group"> + <input type="email" class="form-control" name="emailto" placeholder="Email to:"> + </div> + <div class="form-group"> + <input type="text" class="form-control" name="subject" placeholder="Subject"> + </div> + <div> + <textarea class="textarea" placeholder="Message" style="width: 100%; height: 125px; font-size: 14px; line-height: 18px; border: 1px solid #dddddd; padding: 10px;"></textarea> + </div> + </form> + </div> + <div class="box-footer clearfix"> + <button class="pull-right btn btn-default" id="sendEmail">Send <i class="fa fa-arrow-circle-right"></i></button> + </div> + </div> + + </section><!-- /.Left col --> + <!-- right col (We are only adding the ID to make the widgets sortable)--> + <section class="col-lg-5 connectedSortable"> + + <!-- Map box --> + <div class="box box-solid bg-light-blue-gradient"> + <div class="box-header"> + <!-- tools box --> + <div class="pull-right box-tools"> + <button class="btn btn-primary btn-sm daterange pull-right" data-toggle="tooltip" title="Date range"><i class="fa fa-calendar"></i></button> + <button class="btn btn-primary btn-sm pull-right" data-widget="collapse" data-toggle="tooltip" title="Collapse" style="margin-right: 5px;"><i class="fa fa-minus"></i></button> + </div><!-- /. tools --> + + <i class="fa fa-map-marker"></i> + <h3 class="box-title"> + Visitors + </h3> + </div> + <div class="box-body"> + <div id="world-map" style="height: 250px; width: 100%;"></div> + </div><!-- /.box-body--> + <div class="box-footer no-border"> + <div class="row"> + <div class="col-xs-4 text-center" style="border-right: 1px solid #f4f4f4"> + <div id="sparkline-1"></div> + <div class="knob-label">Visitors</div> + </div><!-- ./col --> + <div class="col-xs-4 text-center" style="border-right: 1px solid #f4f4f4"> + <div id="sparkline-2"></div> + <div class="knob-label">Online</div> + </div><!-- ./col --> + <div class="col-xs-4 text-center"> + <div id="sparkline-3"></div> + <div class="knob-label">Exists</div> + </div><!-- ./col --> + </div><!-- /.row --> + </div> + </div> + <!-- /.box --> + + <!-- solid sales graph --> + <div class="box box-solid bg-teal-gradient"> + <div class="box-header"> + <i class="fa fa-th"></i> + <h3 class="box-title">Sales Graph</h3> + <div class="box-tools pull-right"> + <button class="btn bg-teal btn-sm" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn bg-teal btn-sm" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div> + <div class="box-body border-radius-none"> + <div class="chart" id="line-chart" style="height: 250px;"></div> + </div><!-- /.box-body --> + <div class="box-footer no-border"> + <div class="row"> + <div class="col-xs-4 text-center" style="border-right: 1px solid #f4f4f4"> + <input type="text" class="knob" data-readonly="true" value="20" data-width="60" data-height="60" data-fgColor="#39CCCC"> + <div class="knob-label">Mail-Orders</div> + </div><!-- ./col --> + <div class="col-xs-4 text-center" style="border-right: 1px solid #f4f4f4"> + <input type="text" class="knob" data-readonly="true" value="50" data-width="60" data-height="60" data-fgColor="#39CCCC"> + <div class="knob-label">Online</div> + </div><!-- ./col --> + <div class="col-xs-4 text-center"> + <input type="text" class="knob" data-readonly="true" value="30" data-width="60" data-height="60" data-fgColor="#39CCCC"> + <div class="knob-label">In-Store</div> + </div><!-- ./col --> + </div><!-- /.row --> + </div><!-- /.box-footer --> + </div><!-- /.box --> + + <!-- Calendar --> + <div class="box box-solid bg-green-gradient"> + <div class="box-header"> + <i class="fa fa-calendar"></i> + <h3 class="box-title">Calendar</h3> + <!-- tools box --> + <div class="pull-right box-tools"> + <!-- button with a dropdown --> + <div class="btn-group"> + <button class="btn btn-success btn-sm dropdown-toggle" data-toggle="dropdown"><i class="fa fa-bars"></i></button> + <ul class="dropdown-menu pull-right" role="menu"> + <li><a href="#">Add new event</a></li> + <li><a href="#">Clear events</a></li> + <li class="divider"></li> + <li><a href="#">View calendar</a></li> + </ul> + </div> + <button class="btn btn-success btn-sm" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-success btn-sm" data-widget="remove"><i class="fa fa-times"></i></button> + </div><!-- /. tools --> + </div><!-- /.box-header --> + <div class="box-body no-padding"> + <!--The calendar --> + <div id="calendar" style="width: 100%"></div> + </div><!-- /.box-body --> + <div class="box-footer text-black"> + <div class="row"> + <div class="col-sm-6"> + <!-- Progress bars --> + <div class="clearfix"> + <span class="pull-left">Task #1</span> + <small class="pull-right">90%</small> + </div> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 90%;"></div> + </div> + + <div class="clearfix"> + <span class="pull-left">Task #2</span> + <small class="pull-right">70%</small> + </div> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 70%;"></div> + </div> + </div><!-- /.col --> + <div class="col-sm-6"> + <div class="clearfix"> + <span class="pull-left">Task #3</span> + <small class="pull-right">60%</small> + </div> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 60%;"></div> + </div> + + <div class="clearfix"> + <span class="pull-left">Task #4</span> + <small class="pull-right">40%</small> + </div> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 40%;"></div> + </div> + </div><!-- /.col --> + </div><!-- /.row --> + </div> + </div><!-- /.box --> + + </section><!-- right col --> + </div><!-- /.row (main row) --> + + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- jQuery UI 1.11.4 --> + <script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script> + <!-- Resolve conflict in jQuery UI tooltip with Bootstrap tooltip --> + <script> + $.widget.bridge('uibutton', $.ui.button); + </script> + <!-- Bootstrap 3.3.5 --> + <script src="bootstrap/js/bootstrap.min.js"></script> + <!-- Morris.js charts --> + <script src="https://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min.js"></script> + <script src="plugins/morris/morris.min.js"></script> + <!-- Sparkline --> + <script src="plugins/sparkline/jquery.sparkline.min.js"></script> + <!-- jvectormap --> + <script src="plugins/jvectormap/jquery-jvectormap-1.2.2.min.js"></script> + <script src="plugins/jvectormap/jquery-jvectormap-world-mill-en.js"></script> + <!-- jQuery Knob Chart --> + <script src="plugins/knob/jquery.knob.js"></script> + <!-- daterangepicker --> + <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.2/moment.min.js"></script> + <script src="plugins/daterangepicker/daterangepicker.js"></script> + <!-- datepicker --> + <script src="plugins/datepicker/bootstrap-datepicker.js"></script> + <!-- Bootstrap WYSIHTML5 --> + <script src="plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js"></script> + <!-- Slimscroll --> + <script src="plugins/slimScroll/jquery.slimscroll.min.js"></script> + <!-- FastClick --> + <script src="plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="dist/js/app.min.js"></script> + <!-- AdminLTE dashboard demo (This is only for demo purposes) --> + <script src="dist/js/pages/dashboard.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="dist/js/demo.js"></script> + </body> +</html> diff --git a/theme/bootstrap/index2.html b/theme/bootstrap/index2.html new file mode 100644 index 0000000..df86394 --- /dev/null +++ b/theme/bootstrap/index2.html @@ -0,0 +1,1301 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Dashboard</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- jvectormap --> + <link rel="stylesheet" href="plugins/jvectormap/jquery-jvectormap-1.2.2.css"> + <!-- Theme style --> + <link rel="stylesheet" href="dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + + <!-- Logo --> + <a href="index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + </a> + <!-- Navbar Right Menu --> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + <li> + <a href="#"> + <div class="pull-left"> + <img src="dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + AdminLTE Design Team + <small><i class="fa fa-clock-o"></i> 2 hours</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Developers + <small><i class="fa fa-clock-o"></i> Today</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Sales Department + <small><i class="fa fa-clock-o"></i> Yesterday</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Reviewers + <small><i class="fa fa-clock-o"></i> 2 days</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-users text-red"></i> 5 new members joined + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-shopping-cart text-green"></i> 25 sales made + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-user text-red"></i> You changed your username + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Create a nice theme + <small class="pull-right">40%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">40% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Some task I need to do + <small class="pull-right">60%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">60% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Make beautiful transitions + <small class="pull-right">80%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="active treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li class="active"><a href="index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="pages/layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="pages/layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="pages/layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="pages/layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="pages/widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="pages/charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="pages/charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="pages/charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="pages/charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="pages/UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="pages/UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="pages/UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="pages/UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="pages/UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="pages/UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="pages/forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="pages/forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="pages/forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="pages/tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="pages/tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="pages/calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="pages/mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="pages/examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="pages/examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="pages/examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="pages/examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="pages/examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="pages/examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="pages/examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="pages/examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Dashboard + <small>Version 2.0</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li class="active">Dashboard</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <!-- Info boxes --> + <div class="row"> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box"> + <span class="info-box-icon bg-aqua"><i class="ion ion-ios-gear-outline"></i></span> + <div class="info-box-content"> + <span class="info-box-text">CPU Traffic</span> + <span class="info-box-number">90<small>%</small></span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box"> + <span class="info-box-icon bg-red"><i class="fa fa-google-plus"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Likes</span> + <span class="info-box-number">41,410</span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + + <!-- fix for small devices only --> + <div class="clearfix visible-sm-block"></div> + + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box"> + <span class="info-box-icon bg-green"><i class="ion ion-ios-cart-outline"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Sales</span> + <span class="info-box-number">760</span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box"> + <span class="info-box-icon bg-yellow"><i class="ion ion-ios-people-outline"></i></span> + <div class="info-box-content"> + <span class="info-box-text">New Members</span> + <span class="info-box-number">2,000</span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + </div><!-- /.row --> + + <div class="row"> + <div class="col-md-12"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title">Monthly Recap Report</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <div class="btn-group"> + <button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-wrench"></i></button> + <ul class="dropdown-menu" role="menu"> + <li><a href="#">Action</a></li> + <li><a href="#">Another action</a></li> + <li><a href="#">Something else here</a></li> + <li class="divider"></li> + <li><a href="#">Separated link</a></li> + </ul> + </div> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <div class="row"> + <div class="col-md-8"> + <p class="text-center"> + <strong>Sales: 1 Jan, 2014 - 30 Jul, 2014</strong> + </p> + <div class="chart"> + <!-- Sales Chart Canvas --> + <canvas id="salesChart" style="height: 180px;"></canvas> + </div><!-- /.chart-responsive --> + </div><!-- /.col --> + <div class="col-md-4"> + <p class="text-center"> + <strong>Goal Completion</strong> + </p> + <div class="progress-group"> + <span class="progress-text">Add Products to Cart</span> + <span class="progress-number"><b>160</b>/200</span> + <div class="progress sm"> + <div class="progress-bar progress-bar-aqua" style="width: 80%"></div> + </div> + </div><!-- /.progress-group --> + <div class="progress-group"> + <span class="progress-text">Complete Purchase</span> + <span class="progress-number"><b>310</b>/400</span> + <div class="progress sm"> + <div class="progress-bar progress-bar-red" style="width: 80%"></div> + </div> + </div><!-- /.progress-group --> + <div class="progress-group"> + <span class="progress-text">Visit Premium Page</span> + <span class="progress-number"><b>480</b>/800</span> + <div class="progress sm"> + <div class="progress-bar progress-bar-green" style="width: 80%"></div> + </div> + </div><!-- /.progress-group --> + <div class="progress-group"> + <span class="progress-text">Send Inquiries</span> + <span class="progress-number"><b>250</b>/500</span> + <div class="progress sm"> + <div class="progress-bar progress-bar-yellow" style="width: 80%"></div> + </div> + </div><!-- /.progress-group --> + </div><!-- /.col --> + </div><!-- /.row --> + </div><!-- ./box-body --> + <div class="box-footer"> + <div class="row"> + <div class="col-sm-3 col-xs-6"> + <div class="description-block border-right"> + <span class="description-percentage text-green"><i class="fa fa-caret-up"></i> 17%</span> + <h5 class="description-header">$35,210.43</h5> + <span class="description-text">TOTAL REVENUE</span> + </div><!-- /.description-block --> + </div><!-- /.col --> + <div class="col-sm-3 col-xs-6"> + <div class="description-block border-right"> + <span class="description-percentage text-yellow"><i class="fa fa-caret-left"></i> 0%</span> + <h5 class="description-header">$10,390.90</h5> + <span class="description-text">TOTAL COST</span> + </div><!-- /.description-block --> + </div><!-- /.col --> + <div class="col-sm-3 col-xs-6"> + <div class="description-block border-right"> + <span class="description-percentage text-green"><i class="fa fa-caret-up"></i> 20%</span> + <h5 class="description-header">$24,813.53</h5> + <span class="description-text">TOTAL PROFIT</span> + </div><!-- /.description-block --> + </div><!-- /.col --> + <div class="col-sm-3 col-xs-6"> + <div class="description-block"> + <span class="description-percentage text-red"><i class="fa fa-caret-down"></i> 18%</span> + <h5 class="description-header">1200</h5> + <span class="description-text">GOAL COMPLETIONS</span> + </div><!-- /.description-block --> + </div> + </div><!-- /.row --> + </div><!-- /.box-footer --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + + <!-- Main row --> + <div class="row"> + <!-- Left col --> + <div class="col-md-8"> + <!-- MAP & BOX PANE --> + <div class="box box-success"> + <div class="box-header with-border"> + <h3 class="box-title">Visitors Report</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body no-padding"> + <div class="row"> + <div class="col-md-9 col-sm-8"> + <div class="pad"> + <!-- Map will be created here --> + <div id="world-map-markers" style="height: 325px;"></div> + </div> + </div><!-- /.col --> + <div class="col-md-3 col-sm-4"> + <div class="pad box-pane-right bg-green" style="min-height: 280px"> + <div class="description-block margin-bottom"> + <div class="sparkbar pad" data-color="#fff">90,70,90,70,75,80,70</div> + <h5 class="description-header">8390</h5> + <span class="description-text">Visits</span> + </div><!-- /.description-block --> + <div class="description-block margin-bottom"> + <div class="sparkbar pad" data-color="#fff">90,50,90,70,61,83,63</div> + <h5 class="description-header">30%</h5> + <span class="description-text">Referrals</span> + </div><!-- /.description-block --> + <div class="description-block"> + <div class="sparkbar pad" data-color="#fff">90,50,90,70,61,83,63</div> + <h5 class="description-header">70%</h5> + <span class="description-text">Organic</span> + </div><!-- /.description-block --> + </div> + </div><!-- /.col --> + </div><!-- /.row --> + </div><!-- /.box-body --> + </div><!-- /.box --> + <div class="row"> + <div class="col-md-6"> + <!-- DIRECT CHAT --> + <div class="box box-warning direct-chat direct-chat-warning"> + <div class="box-header with-border"> + <h3 class="box-title">Direct Chat</h3> + <div class="box-tools pull-right"> + <span data-toggle="tooltip" title="3 New Messages" class="badge bg-yellow">3</span> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-toggle="tooltip" title="Contacts" data-widget="chat-pane-toggle"><i class="fa fa-comments"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <!-- Conversations are loaded here --> + <div class="direct-chat-messages"> + <!-- Message. Default to the left --> + <div class="direct-chat-msg"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-left">Alexander Pierce</span> + <span class="direct-chat-timestamp pull-right">23 Jan 2:00 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="dist/img/user1-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + Is this template really for free? That's unbelievable! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + + <!-- Message to the right --> + <div class="direct-chat-msg right"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-right">Sarah Bullock</span> + <span class="direct-chat-timestamp pull-left">23 Jan 2:05 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="dist/img/user3-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + You better believe it! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + + <!-- Message. Default to the left --> + <div class="direct-chat-msg"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-left">Alexander Pierce</span> + <span class="direct-chat-timestamp pull-right">23 Jan 5:37 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="dist/img/user1-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + Working with AdminLTE on a great new app! Wanna join? + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + + <!-- Message to the right --> + <div class="direct-chat-msg right"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-right">Sarah Bullock</span> + <span class="direct-chat-timestamp pull-left">23 Jan 6:10 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="dist/img/user3-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + I would love to. + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + + </div><!--/.direct-chat-messages--> + + <!-- Contacts are loaded here --> + <div class="direct-chat-contacts"> + <ul class="contacts-list"> + <li> + <a href="#"> + <img class="contacts-list-img" src="dist/img/user1-128x128.jpg"> + <div class="contacts-list-info"> + <span class="contacts-list-name"> + Count Dracula + <small class="contacts-list-date pull-right">2/28/2015</small> + </span> + <span class="contacts-list-msg">How have you been? I was...</span> + </div><!-- /.contacts-list-info --> + </a> + </li><!-- End Contact Item --> + <li> + <a href="#"> + <img class="contacts-list-img" src="dist/img/user7-128x128.jpg"> + <div class="contacts-list-info"> + <span class="contacts-list-name"> + Sarah Doe + <small class="contacts-list-date pull-right">2/23/2015</small> + </span> + <span class="contacts-list-msg">I will be waiting for...</span> + </div><!-- /.contacts-list-info --> + </a> + </li><!-- End Contact Item --> + <li> + <a href="#"> + <img class="contacts-list-img" src="dist/img/user3-128x128.jpg"> + <div class="contacts-list-info"> + <span class="contacts-list-name"> + Nadia Jolie + <small class="contacts-list-date pull-right">2/20/2015</small> + </span> + <span class="contacts-list-msg">I'll call you back at...</span> + </div><!-- /.contacts-list-info --> + </a> + </li><!-- End Contact Item --> + <li> + <a href="#"> + <img class="contacts-list-img" src="dist/img/user5-128x128.jpg"> + <div class="contacts-list-info"> + <span class="contacts-list-name"> + Nora S. Vans + <small class="contacts-list-date pull-right">2/10/2015</small> + </span> + <span class="contacts-list-msg">Where is your new...</span> + </div><!-- /.contacts-list-info --> + </a> + </li><!-- End Contact Item --> + <li> + <a href="#"> + <img class="contacts-list-img" src="dist/img/user6-128x128.jpg"> + <div class="contacts-list-info"> + <span class="contacts-list-name"> + John K. + <small class="contacts-list-date pull-right">1/27/2015</small> + </span> + <span class="contacts-list-msg">Can I take a look at...</span> + </div><!-- /.contacts-list-info --> + </a> + </li><!-- End Contact Item --> + <li> + <a href="#"> + <img class="contacts-list-img" src="dist/img/user8-128x128.jpg"> + <div class="contacts-list-info"> + <span class="contacts-list-name"> + Kenneth M. + <small class="contacts-list-date pull-right">1/4/2015</small> + </span> + <span class="contacts-list-msg">Never mind I found...</span> + </div><!-- /.contacts-list-info --> + </a> + </li><!-- End Contact Item --> + </ul><!-- /.contatcts-list --> + </div><!-- /.direct-chat-pane --> + </div><!-- /.box-body --> + <div class="box-footer"> + <form action="#" method="post"> + <div class="input-group"> + <input type="text" name="message" placeholder="Type Message ..." class="form-control"> + <span class="input-group-btn"> + <button type="button" class="btn btn-warning btn-flat">Send</button> + </span> + </div> + </form> + </div><!-- /.box-footer--> + </div><!--/.direct-chat --> + </div><!-- /.col --> + + <div class="col-md-6"> + <!-- USERS LIST --> + <div class="box box-danger"> + <div class="box-header with-border"> + <h3 class="box-title">Latest Members</h3> + <div class="box-tools pull-right"> + <span class="label label-danger">8 New Members</span> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body no-padding"> + <ul class="users-list clearfix"> + <li> + <img src="dist/img/user1-128x128.jpg" alt="User Image"> + <a class="users-list-name" href="#">Alexander Pierce</a> + <span class="users-list-date">Today</span> + </li> + <li> + <img src="dist/img/user8-128x128.jpg" alt="User Image"> + <a class="users-list-name" href="#">Norman</a> + <span class="users-list-date">Yesterday</span> + </li> + <li> + <img src="dist/img/user7-128x128.jpg" alt="User Image"> + <a class="users-list-name" href="#">Jane</a> + <span class="users-list-date">12 Jan</span> + </li> + <li> + <img src="dist/img/user6-128x128.jpg" alt="User Image"> + <a class="users-list-name" href="#">John</a> + <span class="users-list-date">12 Jan</span> + </li> + <li> + <img src="dist/img/user2-160x160.jpg" alt="User Image"> + <a class="users-list-name" href="#">Alexander</a> + <span class="users-list-date">13 Jan</span> + </li> + <li> + <img src="dist/img/user5-128x128.jpg" alt="User Image"> + <a class="users-list-name" href="#">Sarah</a> + <span class="users-list-date">14 Jan</span> + </li> + <li> + <img src="dist/img/user4-128x128.jpg" alt="User Image"> + <a class="users-list-name" href="#">Nora</a> + <span class="users-list-date">15 Jan</span> + </li> + <li> + <img src="dist/img/user3-128x128.jpg" alt="User Image"> + <a class="users-list-name" href="#">Nadia</a> + <span class="users-list-date">15 Jan</span> + </li> + </ul><!-- /.users-list --> + </div><!-- /.box-body --> + <div class="box-footer text-center"> + <a href="javascript::" class="uppercase">View All Users</a> + </div><!-- /.box-footer --> + </div><!--/.box --> + </div><!-- /.col --> + </div><!-- /.row --> + + <!-- TABLE: LATEST ORDERS --> + <div class="box box-info"> + <div class="box-header with-border"> + <h3 class="box-title">Latest Orders</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <div class="table-responsive"> + <table class="table no-margin"> + <thead> + <tr> + <th>Order ID</th> + <th>Item</th> + <th>Status</th> + <th>Popularity</th> + </tr> + </thead> + <tbody> + <tr> + <td><a href="pages/examples/invoice.html">OR9842</a></td> + <td>Call of Duty IV</td> + <td><span class="label label-success">Shipped</span></td> + <td><div class="sparkbar" data-color="#00a65a" data-height="20">90,80,90,-70,61,-83,63</div></td> + </tr> + <tr> + <td><a href="pages/examples/invoice.html">OR1848</a></td> + <td>Samsung Smart TV</td> + <td><span class="label label-warning">Pending</span></td> + <td><div class="sparkbar" data-color="#f39c12" data-height="20">90,80,-90,70,61,-83,68</div></td> + </tr> + <tr> + <td><a href="pages/examples/invoice.html">OR7429</a></td> + <td>iPhone 6 Plus</td> + <td><span class="label label-danger">Delivered</span></td> + <td><div class="sparkbar" data-color="#f56954" data-height="20">90,-80,90,70,-61,83,63</div></td> + </tr> + <tr> + <td><a href="pages/examples/invoice.html">OR7429</a></td> + <td>Samsung Smart TV</td> + <td><span class="label label-info">Processing</span></td> + <td><div class="sparkbar" data-color="#00c0ef" data-height="20">90,80,-90,70,-61,83,63</div></td> + </tr> + <tr> + <td><a href="pages/examples/invoice.html">OR1848</a></td> + <td>Samsung Smart TV</td> + <td><span class="label label-warning">Pending</span></td> + <td><div class="sparkbar" data-color="#f39c12" data-height="20">90,80,-90,70,61,-83,68</div></td> + </tr> + <tr> + <td><a href="pages/examples/invoice.html">OR7429</a></td> + <td>iPhone 6 Plus</td> + <td><span class="label label-danger">Delivered</span></td> + <td><div class="sparkbar" data-color="#f56954" data-height="20">90,-80,90,70,-61,83,63</div></td> + </tr> + <tr> + <td><a href="pages/examples/invoice.html">OR9842</a></td> + <td>Call of Duty IV</td> + <td><span class="label label-success">Shipped</span></td> + <td><div class="sparkbar" data-color="#00a65a" data-height="20">90,80,90,-70,61,-83,63</div></td> + </tr> + </tbody> + </table> + </div><!-- /.table-responsive --> + </div><!-- /.box-body --> + <div class="box-footer clearfix"> + <a href="javascript::;" class="btn btn-sm btn-info btn-flat pull-left">Place New Order</a> + <a href="javascript::;" class="btn btn-sm btn-default btn-flat pull-right">View All Orders</a> + </div><!-- /.box-footer --> + </div><!-- /.box --> + </div><!-- /.col --> + + <div class="col-md-4"> + <!-- Info Boxes Style 2 --> + <div class="info-box bg-yellow"> + <span class="info-box-icon"><i class="ion ion-ios-pricetag-outline"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Inventory</span> + <span class="info-box-number">5,200</span> + <div class="progress"> + <div class="progress-bar" style="width: 50%"></div> + </div> + <span class="progress-description"> + 50% Increase in 30 Days + </span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + <div class="info-box bg-green"> + <span class="info-box-icon"><i class="ion ion-ios-heart-outline"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Mentions</span> + <span class="info-box-number">92,050</span> + <div class="progress"> + <div class="progress-bar" style="width: 20%"></div> + </div> + <span class="progress-description"> + 20% Increase in 30 Days + </span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + <div class="info-box bg-red"> + <span class="info-box-icon"><i class="ion ion-ios-cloud-download-outline"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Downloads</span> + <span class="info-box-number">114,381</span> + <div class="progress"> + <div class="progress-bar" style="width: 70%"></div> + </div> + <span class="progress-description"> + 70% Increase in 30 Days + </span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + <div class="info-box bg-aqua"> + <span class="info-box-icon"><i class="ion-ios-chatbubble-outline"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Direct Messages</span> + <span class="info-box-number">163,921</span> + <div class="progress"> + <div class="progress-bar" style="width: 40%"></div> + </div> + <span class="progress-description"> + 40% Increase in 30 Days + </span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + + <div class="box box-default"> + <div class="box-header with-border"> + <h3 class="box-title">Browser Usage</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <div class="row"> + <div class="col-md-8"> + <div class="chart-responsive"> + <canvas id="pieChart" height="150"></canvas> + </div><!-- ./chart-responsive --> + </div><!-- /.col --> + <div class="col-md-4"> + <ul class="chart-legend clearfix"> + <li><i class="fa fa-circle-o text-red"></i> Chrome</li> + <li><i class="fa fa-circle-o text-green"></i> IE</li> + <li><i class="fa fa-circle-o text-yellow"></i> FireFox</li> + <li><i class="fa fa-circle-o text-aqua"></i> Safari</li> + <li><i class="fa fa-circle-o text-light-blue"></i> Opera</li> + <li><i class="fa fa-circle-o text-gray"></i> Navigator</li> + </ul> + </div><!-- /.col --> + </div><!-- /.row --> + </div><!-- /.box-body --> + <div class="box-footer no-padding"> + <ul class="nav nav-pills nav-stacked"> + <li><a href="#">United States of America <span class="pull-right text-red"><i class="fa fa-angle-down"></i> 12%</span></a></li> + <li><a href="#">India <span class="pull-right text-green"><i class="fa fa-angle-up"></i> 4%</span></a></li> + <li><a href="#">China <span class="pull-right text-yellow"><i class="fa fa-angle-left"></i> 0%</span></a></li> + </ul> + </div><!-- /.footer --> + </div><!-- /.box --> + + <!-- PRODUCT LIST --> + <div class="box box-primary"> + <div class="box-header with-border"> + <h3 class="box-title">Recently Added Products</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <ul class="products-list product-list-in-box"> + <li class="item"> + <div class="product-img"> + <img src="dist/img/default-50x50.gif" alt="Product Image"> + </div> + <div class="product-info"> + <a href="javascript::;" class="product-title">Samsung TV <span class="label label-warning pull-right">$1800</span></a> + <span class="product-description"> + Samsung 32" 1080p 60Hz LED Smart HDTV. + </span> + </div> + </li><!-- /.item --> + <li class="item"> + <div class="product-img"> + <img src="dist/img/default-50x50.gif" alt="Product Image"> + </div> + <div class="product-info"> + <a href="javascript::;" class="product-title">Bicycle <span class="label label-info pull-right">$700</span></a> + <span class="product-description"> + 26" Mongoose Dolomite Men's 7-speed, Navy Blue. + </span> + </div> + </li><!-- /.item --> + <li class="item"> + <div class="product-img"> + <img src="dist/img/default-50x50.gif" alt="Product Image"> + </div> + <div class="product-info"> + <a href="javascript::;" class="product-title">Xbox One <span class="label label-danger pull-right">$350</span></a> + <span class="product-description"> + Xbox One Console Bundle with Halo Master Chief Collection. + </span> + </div> + </li><!-- /.item --> + <li class="item"> + <div class="product-img"> + <img src="dist/img/default-50x50.gif" alt="Product Image"> + </div> + <div class="product-info"> + <a href="javascript::;" class="product-title">PlayStation 4 <span class="label label-success pull-right">$399</span></a> + <span class="product-description"> + PlayStation 4 500GB Console (PS4) + </span> + </div> + </li><!-- /.item --> + </ul> + </div><!-- /.box-body --> + <div class="box-footer text-center"> + <a href="javascript::;" class="uppercase">View All Products</a> + </div><!-- /.box-footer --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="bootstrap/js/bootstrap.min.js"></script> + <!-- FastClick --> + <script src="plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="dist/js/app.min.js"></script> + <!-- Sparkline --> + <script src="plugins/sparkline/jquery.sparkline.min.js"></script> + <!-- jvectormap --> + <script src="plugins/jvectormap/jquery-jvectormap-1.2.2.min.js"></script> + <script src="plugins/jvectormap/jquery-jvectormap-world-mill-en.js"></script> + <!-- SlimScroll 1.3.0 --> + <script src="plugins/slimScroll/jquery.slimscroll.min.js"></script> + <!-- ChartJS 1.0.1 --> + <script src="plugins/chartjs/Chart.min.js"></script> + <!-- AdminLTE dashboard demo (This is only for demo purposes) --> + <script src="dist/js/pages/dashboard2.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="dist/js/demo.js"></script> + </body> +</html> diff --git a/theme/bootstrap/js/bootstrap.js b/theme/bootstrap/js/bootstrap.js new file mode 100644 index 0000000..1c88b71 --- /dev/null +++ b/theme/bootstrap/js/bootstrap.js @@ -0,0 +1,2317 @@ +/*! + * Bootstrap v3.3.4 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +if (typeof jQuery === 'undefined') { + throw new Error('Bootstrap\'s JavaScript requires jQuery') +} + ++function ($) { + 'use strict'; + var version = $.fn.jquery.split(' ')[0].split('.') + if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) { + throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher') + } +}(jQuery); + +/* ======================================================================== + * Bootstrap: transition.js v3.3.4 + * http://getbootstrap.com/javascript/#transitions + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + WebkitTransition : 'webkitTransitionEnd', + MozTransition : 'transitionend', + OTransition : 'oTransitionEnd otransitionend', + transition : 'transitionend' + } + + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return { end: transEndEventNames[name] } + } + } + + return false // explicit for ie8 ( ._.) + } + + // http://blog.alexmaccaw.com/css-transitions + $.fn.emulateTransitionEnd = function (duration) { + var called = false + var $el = this + $(this).one('bsTransitionEnd', function () { called = true }) + var callback = function () { if (!called) $($el).trigger($.support.transition.end) } + setTimeout(callback, duration) + return this + } + + $(function () { + $.support.transition = transitionEnd() + + if (!$.support.transition) return + + $.event.special.bsTransitionEnd = { + bindType: $.support.transition.end, + delegateType: $.support.transition.end, + handle: function (e) { + if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) + } + } + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: alert.js v3.3.4 + * http://getbootstrap.com/javascript/#alerts + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.VERSION = '3.3.4' + + Alert.TRANSITION_DURATION = 150 + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.closest('.alert') + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + // detach from parent, fire event then clean up data + $parent.detach().trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one('bsTransitionEnd', removeElement) + .emulateTransitionEnd(Alert.TRANSITION_DURATION) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.alert + + $.fn.alert = Plugin + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: button.js v3.3.4 + * http://getbootstrap.com/javascript/#buttons + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + this.isLoading = false + } + + Button.VERSION = '3.3.4' + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state = state + 'Text' + + if (data.resetText == null) $el.data('resetText', $el[val]()) + + // push to event loop to allow forms to submit + setTimeout($.proxy(function () { + $el[val](data[state] == null ? this.options[state] : data[state]) + + if (state == 'loadingText') { + this.isLoading = true + $el.addClass(d).attr(d, d) + } else if (this.isLoading) { + this.isLoading = false + $el.removeClass(d).removeAttr(d) + } + }, this), 0) + } + + Button.prototype.toggle = function () { + var changed = true + var $parent = this.$element.closest('[data-toggle="buttons"]') + + if ($parent.length) { + var $input = this.$element.find('input') + if ($input.prop('type') == 'radio') { + if ($input.prop('checked') && this.$element.hasClass('active')) changed = false + else $parent.find('.active').removeClass('active') + } + if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') + } else { + this.$element.attr('aria-pressed', !this.$element.hasClass('active')) + } + + if (changed) this.$element.toggleClass('active') + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + var old = $.fn.button + + $.fn.button = Plugin + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document) + .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + Plugin.call($btn, 'toggle') + e.preventDefault() + }) + .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: carousel.js v3.3.4 + * http://getbootstrap.com/javascript/#carousel + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = null + this.sliding = null + this.interval = null + this.$active = null + this.$items = null + + this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) + + this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element + .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) + .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) + } + + Carousel.VERSION = '3.3.4' + + Carousel.TRANSITION_DURATION = 600 + + Carousel.DEFAULTS = { + interval: 5000, + pause: 'hover', + wrap: true, + keyboard: true + } + + Carousel.prototype.keydown = function (e) { + if (/input|textarea/i.test(e.target.tagName)) return + switch (e.which) { + case 37: this.prev(); break + case 39: this.next(); break + default: return + } + + e.preventDefault() + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getItemIndex = function (item) { + this.$items = item.parent().children('.item') + return this.$items.index(item || this.$active) + } + + Carousel.prototype.getItemForDirection = function (direction, active) { + var activeIndex = this.getItemIndex(active) + var willWrap = (direction == 'prev' && activeIndex === 0) + || (direction == 'next' && activeIndex == (this.$items.length - 1)) + if (willWrap && !this.options.wrap) return active + var delta = direction == 'prev' ? -1 : 1 + var itemIndex = (activeIndex + delta) % this.$items.length + return this.$items.eq(itemIndex) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || this.getItemForDirection(type, $active) + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var that = this + + if ($next.hasClass('active')) return (this.sliding = false) + + var relatedTarget = $next[0] + var slideEvent = $.Event('slide.bs.carousel', { + relatedTarget: relatedTarget, + direction: direction + }) + this.$element.trigger(slideEvent) + if (slideEvent.isDefaultPrevented()) return + + this.sliding = true + + isCycling && this.pause() + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) + $nextIndicator && $nextIndicator.addClass('active') + } + + var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" + if ($.support.transition && this.$element.hasClass('slide')) { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one('bsTransitionEnd', function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { + that.$element.trigger(slidEvent) + }, 0) + }) + .emulateTransitionEnd(Carousel.TRANSITION_DURATION) + } else { + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger(slidEvent) + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + var old = $.fn.carousel + + $.fn.carousel = Plugin + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + var clickHandler = function (e) { + var href + var $this = $(this) + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 + if (!$target.hasClass('carousel')) return + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + Plugin.call($target, options) + + if (slideIndex) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + } + + $(document) + .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) + .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + Plugin.call($carousel, $carousel.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: collapse.js v3.3.4 + * http://getbootstrap.com/javascript/#collapse + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + + '[data-toggle="collapse"][data-target="#' + element.id + '"]') + this.transitioning = null + + if (this.options.parent) { + this.$parent = this.getParent() + } else { + this.addAriaAndCollapsedClass(this.$element, this.$trigger) + } + + if (this.options.toggle) this.toggle() + } + + Collapse.VERSION = '3.3.4' + + Collapse.TRANSITION_DURATION = 350 + + Collapse.DEFAULTS = { + toggle: true + } + + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var activesData + var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') + + if (actives && actives.length) { + activesData = actives.data('bs.collapse') + if (activesData && activesData.transitioning) return + } + + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + if (actives && actives.length) { + Plugin.call(actives, 'hide') + activesData || actives.data('bs.collapse', null) + } + + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + .addClass('collapsing')[dimension](0) + .attr('aria-expanded', true) + + this.$trigger + .removeClass('collapsed') + .attr('aria-expanded', true) + + this.transitioning = 1 + + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('collapse in')[dimension]('') + this.transitioning = 0 + this.$element + .trigger('shown.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + var scrollSize = $.camelCase(['scroll', dimension].join('-')) + + this.$element + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) + } + + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var dimension = this.dimension() + + this.$element[dimension](this.$element[dimension]())[0].offsetHeight + + this.$element + .addClass('collapsing') + .removeClass('collapse in') + .attr('aria-expanded', false) + + this.$trigger + .addClass('collapsed') + .attr('aria-expanded', false) + + this.transitioning = 1 + + var complete = function () { + this.transitioning = 0 + this.$element + .removeClass('collapsing') + .addClass('collapse') + .trigger('hidden.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + this.$element + [dimension](0) + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION) + } + + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + Collapse.prototype.getParent = function () { + return $(this.options.parent) + .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') + .each($.proxy(function (i, element) { + var $element = $(element) + this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) + }, this)) + .end() + } + + Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { + var isOpen = $element.hasClass('in') + + $element.attr('aria-expanded', isOpen) + $trigger + .toggleClass('collapsed', !isOpen) + .attr('aria-expanded', isOpen) + } + + function getTargetFromTrigger($trigger) { + var href + var target = $trigger.attr('data-target') + || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 + + return $(target) + } + + + // COLLAPSE PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.collapse + + $.fn.collapse = Plugin + $.fn.collapse.Constructor = Collapse + + + // COLLAPSE NO CONFLICT + // ==================== + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + // COLLAPSE DATA-API + // ================= + + $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { + var $this = $(this) + + if (!$this.attr('data-target')) e.preventDefault() + + var $target = getTargetFromTrigger($this) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + + Plugin.call($target, option) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.3.4 + * http://getbootstrap.com/javascript/#dropdowns + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle="dropdown"]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.VERSION = '3.3.4' + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we use a backdrop because click events don't delegate + $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus) + } + + var relatedTarget = { relatedTarget: this } + $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this + .trigger('focus') + .attr('aria-expanded', 'true') + + $parent + .toggleClass('open') + .trigger('shown.bs.dropdown', relatedTarget) + } + + return false + } + + Dropdown.prototype.keydown = function (e) { + if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return + + var $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + if ((!isActive && e.which != 27) || (isActive && e.which == 27)) { + if (e.which == 27) $parent.find(toggle).trigger('focus') + return $this.trigger('click') + } + + var desc = ' li:not(.disabled):visible a' + var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc) + + if (!$items.length) return + + var index = $items.index(e.target) + + if (e.which == 38 && index > 0) index-- // up + if (e.which == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items.eq(index).trigger('focus') + } + + function clearMenus(e) { + if (e && e.which === 3) return + $(backdrop).remove() + $(toggle).each(function () { + var $this = $(this) + var $parent = getParent($this) + var relatedTarget = { relatedTarget: this } + + if (!$parent.hasClass('open')) return + + $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this.attr('aria-expanded', 'false') + $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget) + }) + } + + function getParent($this) { + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = selector && $(selector) + + return $parent && $parent.length ? $parent : $this.parent() + } + + + // DROPDOWN PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.dropdown') + + if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.dropdown + + $.fn.dropdown = Plugin + $.fn.dropdown.Constructor = Dropdown + + + // DROPDOWN NO CONFLICT + // ==================== + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + // APPLY TO STANDARD DROPDOWN ELEMENTS + // =================================== + + $(document) + .on('click.bs.dropdown.data-api', clearMenus) + .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) + .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '[role="menu"]', Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '[role="listbox"]', Dropdown.prototype.keydown) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: modal.js v3.3.4 + * http://getbootstrap.com/javascript/#modals + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // MODAL CLASS DEFINITION + // ====================== + + var Modal = function (element, options) { + this.options = options + this.$body = $(document.body) + this.$element = $(element) + this.$dialog = this.$element.find('.modal-dialog') + this.$backdrop = null + this.isShown = null + this.originalBodyPad = null + this.scrollbarWidth = 0 + this.ignoreBackdropClick = false + + if (this.options.remote) { + this.$element + .find('.modal-content') + .load(this.options.remote, $.proxy(function () { + this.$element.trigger('loaded.bs.modal') + }, this)) + } + } + + Modal.VERSION = '3.3.4' + + Modal.TRANSITION_DURATION = 300 + Modal.BACKDROP_TRANSITION_DURATION = 150 + + Modal.DEFAULTS = { + backdrop: true, + keyboard: true, + show: true + } + + Modal.prototype.toggle = function (_relatedTarget) { + return this.isShown ? this.hide() : this.show(_relatedTarget) + } + + Modal.prototype.show = function (_relatedTarget) { + var that = this + var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.checkScrollbar() + this.setScrollbar() + this.$body.addClass('modal-open') + + this.escape() + this.resize() + + this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) + + this.$dialog.on('mousedown.dismiss.bs.modal', function () { + that.$element.one('mouseup.dismiss.bs.modal', function (e) { + if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true + }) + }) + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(that.$body) // don't move modals dom position + } + + that.$element + .show() + .scrollTop(0) + + that.adjustDialog() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element + .addClass('in') + .attr('aria-hidden', false) + + that.enforceFocus() + + var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) + + transition ? + that.$dialog // wait for modal to slide in + .one('bsTransitionEnd', function () { + that.$element.trigger('focus').trigger(e) + }) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + that.$element.trigger('focus').trigger(e) + }) + } + + Modal.prototype.hide = function (e) { + if (e) e.preventDefault() + + e = $.Event('hide.bs.modal') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + this.resize() + + $(document).off('focusin.bs.modal') + + this.$element + .removeClass('in') + .attr('aria-hidden', true) + .off('click.dismiss.bs.modal') + .off('mouseup.dismiss.bs.modal') + + this.$dialog.off('mousedown.dismiss.bs.modal') + + $.support.transition && this.$element.hasClass('fade') ? + this.$element + .one('bsTransitionEnd', $.proxy(this.hideModal, this)) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + this.hideModal() + } + + Modal.prototype.enforceFocus = function () { + $(document) + .off('focusin.bs.modal') // guard against infinite focus loop + .on('focusin.bs.modal', $.proxy(function (e) { + if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { + this.$element.trigger('focus') + } + }, this)) + } + + Modal.prototype.escape = function () { + if (this.isShown && this.options.keyboard) { + this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { + e.which == 27 && this.hide() + }, this)) + } else if (!this.isShown) { + this.$element.off('keydown.dismiss.bs.modal') + } + } + + Modal.prototype.resize = function () { + if (this.isShown) { + $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) + } else { + $(window).off('resize.bs.modal') + } + } + + Modal.prototype.hideModal = function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.$body.removeClass('modal-open') + that.resetAdjustments() + that.resetScrollbar() + that.$element.trigger('hidden.bs.modal') + }) + } + + Modal.prototype.removeBackdrop = function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + Modal.prototype.backdrop = function (callback) { + var that = this + var animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') + .appendTo(this.$body) + + this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { + if (this.ignoreBackdropClick) { + this.ignoreBackdropClick = false + return + } + if (e.target !== e.currentTarget) return + this.options.backdrop == 'static' + ? this.$element[0].focus() + : this.hide() + }, this)) + + if (doAnimate) this.$backdrop[0].offsetWidth // force reflow + + this.$backdrop.addClass('in') + + if (!callback) return + + doAnimate ? + this.$backdrop + .one('bsTransitionEnd', callback) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callback() + + } else if (!this.isShown && this.$backdrop) { + this.$backdrop.removeClass('in') + + var callbackRemove = function () { + that.removeBackdrop() + callback && callback() + } + $.support.transition && this.$element.hasClass('fade') ? + this.$backdrop + .one('bsTransitionEnd', callbackRemove) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callbackRemove() + + } else if (callback) { + callback() + } + } + + // these following methods are used to handle overflowing modals + + Modal.prototype.handleUpdate = function () { + this.adjustDialog() + } + + Modal.prototype.adjustDialog = function () { + var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight + + this.$element.css({ + paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', + paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' + }) + } + + Modal.prototype.resetAdjustments = function () { + this.$element.css({ + paddingLeft: '', + paddingRight: '' + }) + } + + Modal.prototype.checkScrollbar = function () { + var fullWindowWidth = window.innerWidth + if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 + var documentElementRect = document.documentElement.getBoundingClientRect() + fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) + } + this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth + this.scrollbarWidth = this.measureScrollbar() + } + + Modal.prototype.setScrollbar = function () { + var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) + this.originalBodyPad = document.body.style.paddingRight || '' + if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) + } + + Modal.prototype.resetScrollbar = function () { + this.$body.css('padding-right', this.originalBodyPad) + } + + Modal.prototype.measureScrollbar = function () { // thx walsh + var scrollDiv = document.createElement('div') + scrollDiv.className = 'modal-scrollbar-measure' + this.$body.append(scrollDiv) + var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth + this.$body[0].removeChild(scrollDiv) + return scrollbarWidth + } + + + // MODAL PLUGIN DEFINITION + // ======================= + + function Plugin(option, _relatedTarget) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.modal') + var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('bs.modal', (data = new Modal(this, options))) + if (typeof option == 'string') data[option](_relatedTarget) + else if (options.show) data.show(_relatedTarget) + }) + } + + var old = $.fn.modal + + $.fn.modal = Plugin + $.fn.modal.Constructor = Modal + + + // MODAL NO CONFLICT + // ================= + + $.fn.modal.noConflict = function () { + $.fn.modal = old + return this + } + + + // MODAL DATA-API + // ============== + + $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { + var $this = $(this) + var href = $this.attr('href') + var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 + var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) + + if ($this.is('a')) e.preventDefault() + + $target.one('show.bs.modal', function (showEvent) { + if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown + $target.one('hidden.bs.modal', function () { + $this.is(':visible') && $this.trigger('focus') + }) + }) + Plugin.call($target, option, this) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tooltip.js v3.3.4 + * http://getbootstrap.com/javascript/#tooltip + * Inspired by the original jQuery.tipsy by Jason Frame + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TOOLTIP PUBLIC CLASS DEFINITION + // =============================== + + var Tooltip = function (element, options) { + this.type = null + this.options = null + this.enabled = null + this.timeout = null + this.hoverState = null + this.$element = null + + this.init('tooltip', element, options) + } + + Tooltip.VERSION = '3.3.4' + + Tooltip.TRANSITION_DURATION = 150 + + Tooltip.DEFAULTS = { + animation: true, + placement: 'top', + selector: false, + template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + container: false, + viewport: { + selector: 'body', + padding: 0 + } + } + + Tooltip.prototype.init = function (type, element, options) { + this.enabled = true + this.type = type + this.$element = $(element) + this.options = this.getOptions(options) + this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport) + + if (this.$element[0] instanceof document.constructor && !this.options.selector) { + throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') + } + + var triggers = this.options.trigger.split(' ') + + for (var i = triggers.length; i--;) { + var trigger = triggers[i] + + if (trigger == 'click') { + this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) + } else if (trigger != 'manual') { + var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' + var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' + + this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) + this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) + } + } + + this.options.selector ? + (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : + this.fixTitle() + } + + Tooltip.prototype.getDefaults = function () { + return Tooltip.DEFAULTS + } + + Tooltip.prototype.getOptions = function (options) { + options = $.extend({}, this.getDefaults(), this.$element.data(), options) + + if (options.delay && typeof options.delay == 'number') { + options.delay = { + show: options.delay, + hide: options.delay + } + } + + return options + } + + Tooltip.prototype.getDelegateOptions = function () { + var options = {} + var defaults = this.getDefaults() + + this._options && $.each(this._options, function (key, value) { + if (defaults[key] != value) options[key] = value + }) + + return options + } + + Tooltip.prototype.enter = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (self && self.$tip && self.$tip.is(':visible')) { + self.hoverState = 'in' + return + } + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + clearTimeout(self.timeout) + + self.hoverState = 'in' + + if (!self.options.delay || !self.options.delay.show) return self.show() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'in') self.show() + }, self.options.delay.show) + } + + Tooltip.prototype.leave = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + clearTimeout(self.timeout) + + self.hoverState = 'out' + + if (!self.options.delay || !self.options.delay.hide) return self.hide() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'out') self.hide() + }, self.options.delay.hide) + } + + Tooltip.prototype.show = function () { + var e = $.Event('show.bs.' + this.type) + + if (this.hasContent() && this.enabled) { + this.$element.trigger(e) + + var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) + if (e.isDefaultPrevented() || !inDom) return + var that = this + + var $tip = this.tip() + + var tipId = this.getUID(this.type) + + this.setContent() + $tip.attr('id', tipId) + this.$element.attr('aria-describedby', tipId) + + if (this.options.animation) $tip.addClass('fade') + + var placement = typeof this.options.placement == 'function' ? + this.options.placement.call(this, $tip[0], this.$element[0]) : + this.options.placement + + var autoToken = /\s?auto?\s?/i + var autoPlace = autoToken.test(placement) + if (autoPlace) placement = placement.replace(autoToken, '') || 'top' + + $tip + .detach() + .css({ top: 0, left: 0, display: 'block' }) + .addClass(placement) + .data('bs.' + this.type, this) + + this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) + + var pos = this.getPosition() + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (autoPlace) { + var orgPlacement = placement + var $container = this.options.container ? $(this.options.container) : this.$element.parent() + var containerDim = this.getPosition($container) + + placement = placement == 'bottom' && pos.bottom + actualHeight > containerDim.bottom ? 'top' : + placement == 'top' && pos.top - actualHeight < containerDim.top ? 'bottom' : + placement == 'right' && pos.right + actualWidth > containerDim.width ? 'left' : + placement == 'left' && pos.left - actualWidth < containerDim.left ? 'right' : + placement + + $tip + .removeClass(orgPlacement) + .addClass(placement) + } + + var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) + + this.applyPlacement(calculatedOffset, placement) + + var complete = function () { + var prevHoverState = that.hoverState + that.$element.trigger('shown.bs.' + that.type) + that.hoverState = null + + if (prevHoverState == 'out') that.leave(that) + } + + $.support.transition && this.$tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + } + } + + Tooltip.prototype.applyPlacement = function (offset, placement) { + var $tip = this.tip() + var width = $tip[0].offsetWidth + var height = $tip[0].offsetHeight + + // manually read margins because getBoundingClientRect includes difference + var marginTop = parseInt($tip.css('margin-top'), 10) + var marginLeft = parseInt($tip.css('margin-left'), 10) + + // we must check for NaN for ie 8/9 + if (isNaN(marginTop)) marginTop = 0 + if (isNaN(marginLeft)) marginLeft = 0 + + offset.top = offset.top + marginTop + offset.left = offset.left + marginLeft + + // $.fn.offset doesn't round pixel values + // so we use setOffset directly with our own function B-0 + $.offset.setOffset($tip[0], $.extend({ + using: function (props) { + $tip.css({ + top: Math.round(props.top), + left: Math.round(props.left) + }) + } + }, offset), 0) + + $tip.addClass('in') + + // check to see if placing tip in new offset caused the tip to resize itself + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (placement == 'top' && actualHeight != height) { + offset.top = offset.top + height - actualHeight + } + + var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) + + if (delta.left) offset.left += delta.left + else offset.top += delta.top + + var isVertical = /top|bottom/.test(placement) + var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight + var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' + + $tip.offset(offset) + this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) + } + + Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { + this.arrow() + .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') + .css(isVertical ? 'top' : 'left', '') + } + + Tooltip.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + + $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) + $tip.removeClass('fade in top bottom left right') + } + + Tooltip.prototype.hide = function (callback) { + var that = this + var $tip = $(this.$tip) + var e = $.Event('hide.bs.' + this.type) + + function complete() { + if (that.hoverState != 'in') $tip.detach() + that.$element + .removeAttr('aria-describedby') + .trigger('hidden.bs.' + that.type) + callback && callback() + } + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + $tip.removeClass('in') + + $.support.transition && $tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + + this.hoverState = null + + return this + } + + Tooltip.prototype.fixTitle = function () { + var $e = this.$element + if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') { + $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') + } + } + + Tooltip.prototype.hasContent = function () { + return this.getTitle() + } + + Tooltip.prototype.getPosition = function ($element) { + $element = $element || this.$element + + var el = $element[0] + var isBody = el.tagName == 'BODY' + + var elRect = el.getBoundingClientRect() + if (elRect.width == null) { + // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 + elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) + } + var elOffset = isBody ? { top: 0, left: 0 } : $element.offset() + var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } + var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null + + return $.extend({}, elRect, scroll, outerDims, elOffset) + } + + Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { + return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : + /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } + + } + + Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { + var delta = { top: 0, left: 0 } + if (!this.$viewport) return delta + + var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 + var viewportDimensions = this.getPosition(this.$viewport) + + if (/right|left/.test(placement)) { + var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll + var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight + if (topEdgeOffset < viewportDimensions.top) { // top overflow + delta.top = viewportDimensions.top - topEdgeOffset + } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow + delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset + } + } else { + var leftEdgeOffset = pos.left - viewportPadding + var rightEdgeOffset = pos.left + viewportPadding + actualWidth + if (leftEdgeOffset < viewportDimensions.left) { // left overflow + delta.left = viewportDimensions.left - leftEdgeOffset + } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow + delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset + } + } + + return delta + } + + Tooltip.prototype.getTitle = function () { + var title + var $e = this.$element + var o = this.options + + title = $e.attr('data-original-title') + || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) + + return title + } + + Tooltip.prototype.getUID = function (prefix) { + do prefix += ~~(Math.random() * 1000000) + while (document.getElementById(prefix)) + return prefix + } + + Tooltip.prototype.tip = function () { + return (this.$tip = this.$tip || $(this.options.template)) + } + + Tooltip.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) + } + + Tooltip.prototype.enable = function () { + this.enabled = true + } + + Tooltip.prototype.disable = function () { + this.enabled = false + } + + Tooltip.prototype.toggleEnabled = function () { + this.enabled = !this.enabled + } + + Tooltip.prototype.toggle = function (e) { + var self = this + if (e) { + self = $(e.currentTarget).data('bs.' + this.type) + if (!self) { + self = new this.constructor(e.currentTarget, this.getDelegateOptions()) + $(e.currentTarget).data('bs.' + this.type, self) + } + } + + self.tip().hasClass('in') ? self.leave(self) : self.enter(self) + } + + Tooltip.prototype.destroy = function () { + var that = this + clearTimeout(this.timeout) + this.hide(function () { + that.$element.off('.' + that.type).removeData('bs.' + that.type) + }) + } + + + // TOOLTIP PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tooltip') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tooltip + + $.fn.tooltip = Plugin + $.fn.tooltip.Constructor = Tooltip + + + // TOOLTIP NO CONFLICT + // =================== + + $.fn.tooltip.noConflict = function () { + $.fn.tooltip = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: popover.js v3.3.4 + * http://getbootstrap.com/javascript/#popovers + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // POPOVER PUBLIC CLASS DEFINITION + // =============================== + + var Popover = function (element, options) { + this.init('popover', element, options) + } + + if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') + + Popover.VERSION = '3.3.4' + + Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { + placement: 'right', + trigger: 'click', + content: '', + template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>' + }) + + + // NOTE: POPOVER EXTENDS tooltip.js + // ================================ + + Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) + + Popover.prototype.constructor = Popover + + Popover.prototype.getDefaults = function () { + return Popover.DEFAULTS + } + + Popover.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + var content = this.getContent() + + $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) + $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events + this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' + ](content) + + $tip.removeClass('fade top bottom left right in') + + // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do + // this manually by checking the contents. + if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() + } + + Popover.prototype.hasContent = function () { + return this.getTitle() || this.getContent() + } + + Popover.prototype.getContent = function () { + var $e = this.$element + var o = this.options + + return $e.attr('data-content') + || (typeof o.content == 'function' ? + o.content.call($e[0]) : + o.content) + } + + Popover.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.arrow')) + } + + + // POPOVER PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.popover') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.popover', (data = new Popover(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.popover + + $.fn.popover = Plugin + $.fn.popover.Constructor = Popover + + + // POPOVER NO CONFLICT + // =================== + + $.fn.popover.noConflict = function () { + $.fn.popover = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: scrollspy.js v3.3.4 + * http://getbootstrap.com/javascript/#scrollspy + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // SCROLLSPY CLASS DEFINITION + // ========================== + + function ScrollSpy(element, options) { + this.$body = $(document.body) + this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) + this.options = $.extend({}, ScrollSpy.DEFAULTS, options) + this.selector = (this.options.target || '') + ' .nav li > a' + this.offsets = [] + this.targets = [] + this.activeTarget = null + this.scrollHeight = 0 + + this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) + this.refresh() + this.process() + } + + ScrollSpy.VERSION = '3.3.4' + + ScrollSpy.DEFAULTS = { + offset: 10 + } + + ScrollSpy.prototype.getScrollHeight = function () { + return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) + } + + ScrollSpy.prototype.refresh = function () { + var that = this + var offsetMethod = 'offset' + var offsetBase = 0 + + this.offsets = [] + this.targets = [] + this.scrollHeight = this.getScrollHeight() + + if (!$.isWindow(this.$scrollElement[0])) { + offsetMethod = 'position' + offsetBase = this.$scrollElement.scrollTop() + } + + this.$body + .find(this.selector) + .map(function () { + var $el = $(this) + var href = $el.data('target') || $el.attr('href') + var $href = /^#./.test(href) && $(href) + + return ($href + && $href.length + && $href.is(':visible') + && [[$href[offsetMethod]().top + offsetBase, href]]) || null + }) + .sort(function (a, b) { return a[0] - b[0] }) + .each(function () { + that.offsets.push(this[0]) + that.targets.push(this[1]) + }) + } + + ScrollSpy.prototype.process = function () { + var scrollTop = this.$scrollElement.scrollTop() + this.options.offset + var scrollHeight = this.getScrollHeight() + var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() + var offsets = this.offsets + var targets = this.targets + var activeTarget = this.activeTarget + var i + + if (this.scrollHeight != scrollHeight) { + this.refresh() + } + + if (scrollTop >= maxScroll) { + return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) + } + + if (activeTarget && scrollTop < offsets[0]) { + this.activeTarget = null + return this.clear() + } + + for (i = offsets.length; i--;) { + activeTarget != targets[i] + && scrollTop >= offsets[i] + && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) + && this.activate(targets[i]) + } + } + + ScrollSpy.prototype.activate = function (target) { + this.activeTarget = target + + this.clear() + + var selector = this.selector + + '[data-target="' + target + '"],' + + this.selector + '[href="' + target + '"]' + + var active = $(selector) + .parents('li') + .addClass('active') + + if (active.parent('.dropdown-menu').length) { + active = active + .closest('li.dropdown') + .addClass('active') + } + + active.trigger('activate.bs.scrollspy') + } + + ScrollSpy.prototype.clear = function () { + $(this.selector) + .parentsUntil(this.options.target, '.active') + .removeClass('active') + } + + + // SCROLLSPY PLUGIN DEFINITION + // =========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.scrollspy') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.scrollspy + + $.fn.scrollspy = Plugin + $.fn.scrollspy.Constructor = ScrollSpy + + + // SCROLLSPY NO CONFLICT + // ===================== + + $.fn.scrollspy.noConflict = function () { + $.fn.scrollspy = old + return this + } + + + // SCROLLSPY DATA-API + // ================== + + $(window).on('load.bs.scrollspy.data-api', function () { + $('[data-spy="scroll"]').each(function () { + var $spy = $(this) + Plugin.call($spy, $spy.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tab.js v3.3.4 + * http://getbootstrap.com/javascript/#tabs + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TAB CLASS DEFINITION + // ==================== + + var Tab = function (element) { + this.element = $(element) + } + + Tab.VERSION = '3.3.4' + + Tab.TRANSITION_DURATION = 150 + + Tab.prototype.show = function () { + var $this = this.element + var $ul = $this.closest('ul:not(.dropdown-menu)') + var selector = $this.data('target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + if ($this.parent('li').hasClass('active')) return + + var $previous = $ul.find('.active:last a') + var hideEvent = $.Event('hide.bs.tab', { + relatedTarget: $this[0] + }) + var showEvent = $.Event('show.bs.tab', { + relatedTarget: $previous[0] + }) + + $previous.trigger(hideEvent) + $this.trigger(showEvent) + + if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return + + var $target = $(selector) + + this.activate($this.closest('li'), $ul) + this.activate($target, $target.parent(), function () { + $previous.trigger({ + type: 'hidden.bs.tab', + relatedTarget: $this[0] + }) + $this.trigger({ + type: 'shown.bs.tab', + relatedTarget: $previous[0] + }) + }) + } + + Tab.prototype.activate = function (element, container, callback) { + var $active = container.find('> .active') + var transition = callback + && $.support.transition + && (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length) + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', false) + + element + .addClass('active') + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + + if (transition) { + element[0].offsetWidth // reflow for transition + element.addClass('in') + } else { + element.removeClass('fade') + } + + if (element.parent('.dropdown-menu').length) { + element + .closest('li.dropdown') + .addClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + } + + callback && callback() + } + + $active.length && transition ? + $active + .one('bsTransitionEnd', next) + .emulateTransitionEnd(Tab.TRANSITION_DURATION) : + next() + + $active.removeClass('in') + } + + + // TAB PLUGIN DEFINITION + // ===================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tab') + + if (!data) $this.data('bs.tab', (data = new Tab(this))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tab + + $.fn.tab = Plugin + $.fn.tab.Constructor = Tab + + + // TAB NO CONFLICT + // =============== + + $.fn.tab.noConflict = function () { + $.fn.tab = old + return this + } + + + // TAB DATA-API + // ============ + + var clickHandler = function (e) { + e.preventDefault() + Plugin.call($(this), 'show') + } + + $(document) + .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) + .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: affix.js v3.3.4 + * http://getbootstrap.com/javascript/#affix + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // AFFIX CLASS DEFINITION + // ====================== + + var Affix = function (element, options) { + this.options = $.extend({}, Affix.DEFAULTS, options) + + this.$target = $(this.options.target) + .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) + .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) + + this.$element = $(element) + this.affixed = null + this.unpin = null + this.pinnedOffset = null + + this.checkPosition() + } + + Affix.VERSION = '3.3.4' + + Affix.RESET = 'affix affix-top affix-bottom' + + Affix.DEFAULTS = { + offset: 0, + target: window + } + + Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + var targetHeight = this.$target.height() + + if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false + + if (this.affixed == 'bottom') { + if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' + return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' + } + + var initializing = this.affixed == null + var colliderTop = initializing ? scrollTop : position.top + var colliderHeight = initializing ? targetHeight : height + + if (offsetTop != null && scrollTop <= offsetTop) return 'top' + if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' + + return false + } + + Affix.prototype.getPinnedOffset = function () { + if (this.pinnedOffset) return this.pinnedOffset + this.$element.removeClass(Affix.RESET).addClass('affix') + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + return (this.pinnedOffset = position.top - scrollTop) + } + + Affix.prototype.checkPositionWithEventLoop = function () { + setTimeout($.proxy(this.checkPosition, this), 1) + } + + Affix.prototype.checkPosition = function () { + if (!this.$element.is(':visible')) return + + var height = this.$element.height() + var offset = this.options.offset + var offsetTop = offset.top + var offsetBottom = offset.bottom + var scrollHeight = $(document.body).height() + + if (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) + + var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) + + if (this.affixed != affix) { + if (this.unpin != null) this.$element.css('top', '') + + var affixType = 'affix' + (affix ? '-' + affix : '') + var e = $.Event(affixType + '.bs.affix') + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + this.affixed = affix + this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null + + this.$element + .removeClass(Affix.RESET) + .addClass(affixType) + .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') + } + + if (affix == 'bottom') { + this.$element.offset({ + top: scrollHeight - height - offsetBottom + }) + } + } + + + // AFFIX PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.affix') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.affix', (data = new Affix(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.affix + + $.fn.affix = Plugin + $.fn.affix.Constructor = Affix + + + // AFFIX NO CONFLICT + // ================= + + $.fn.affix.noConflict = function () { + $.fn.affix = old + return this + } + + + // AFFIX DATA-API + // ============== + + $(window).on('load', function () { + $('[data-spy="affix"]').each(function () { + var $spy = $(this) + var data = $spy.data() + + data.offset = data.offset || {} + + if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom + if (data.offsetTop != null) data.offset.top = data.offsetTop + + Plugin.call($spy, data) + }) + }) + +}(jQuery); diff --git a/theme/bootstrap/js/bootstrap.min.js b/theme/bootstrap/js/bootstrap.min.js new file mode 100644 index 0000000..c8f82e5 --- /dev/null +++ b/theme/bootstrap/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.4 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.4",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.4",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.4",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.4",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27|32)/.test(b.which)&&!/input|textarea/i.test(b.target.tagName)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g&&27!=b.which||g&&27==b.which)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(b.target);38==b.which&&j>0&&j--,40==b.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="menu"]',g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in").attr("aria-hidden",!1),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a('<div class="modal-backdrop '+e+'" />').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.3.4",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport),this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-m<p.top?"bottom":"right"==h&&k.right+l>p.width?"left":"left"==h&&k.left-l<p.left?"right":h,f.removeClass(n).addClass(h)}var q=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(q,h);var r=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",r).emulateTransitionEnd(c.TRANSITION_DURATION):r()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.4",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.4",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.4",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){ +var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.4",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a(document.body).height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/js/flot-data.js b/theme/bootstrap/js/flot-data.js new file mode 100644 index 0000000..3e92eb8 --- /dev/null +++ b/theme/bootstrap/js/flot-data.js @@ -0,0 +1,1242 @@ +//Flot Line Chart +$(document).ready(function() { + console.log("document ready"); + var offset = 0; + plot(); + + function plot() { + var sin = [], + cos = []; + for (var i = 0; i < 12; i += 0.2) { + sin.push([i, Math.sin(i + offset)]); + cos.push([i, Math.cos(i + offset)]); + } + + var options = { + series: { + lines: { + show: true + }, + points: { + show: true + } + }, + grid: { + hoverable: true //IMPORTANT! this is needed for tooltip to work + }, + yaxis: { + min: -1.2, + max: 1.2 + }, + tooltip: true, + tooltipOpts: { + content: "'%s' of %x.1 is %y.4", + shifts: { + x: -60, + y: 25 + } + } + }; + + var plotObj = $.plot($("#flot-line-chart"), [{ + data: sin, + label: "sin(x)" + }, { + data: cos, + label: "cos(x)" + }], + options); + } +}); + +//Flot Pie Chart +$(function() { + + var data = [{ + label: "Series 0", + data: 1 + }, { + label: "Series 1", + data: 3 + }, { + label: "Series 2", + data: 9 + }, { + label: "Series 3", + data: 20 + }]; + + var plotObj = $.plot($("#flot-pie-chart"), data, { + series: { + pie: { + show: true + } + }, + grid: { + hoverable: true + }, + tooltip: true, + tooltipOpts: { + content: "%p.0%, %s", // show percentages, rounding to 2 decimal places + shifts: { + x: 20, + y: 0 + }, + defaultTheme: false + } + }); + +}); + +//Flot Multiple Axes Line Chart +$(function() { + var oilprices = [ + [1167692400000, 61.05], + [1167778800000, 58.32], + [1167865200000, 57.35], + [1167951600000, 56.31], + [1168210800000, 55.55], + [1168297200000, 55.64], + [1168383600000, 54.02], + [1168470000000, 51.88], + [1168556400000, 52.99], + [1168815600000, 52.99], + [1168902000000, 51.21], + [1168988400000, 52.24], + [1169074800000, 50.48], + [1169161200000, 51.99], + [1169420400000, 51.13], + [1169506800000, 55.04], + [1169593200000, 55.37], + [1169679600000, 54.23], + [1169766000000, 55.42], + [1170025200000, 54.01], + [1170111600000, 56.97], + [1170198000000, 58.14], + [1170284400000, 58.14], + [1170370800000, 59.02], + [1170630000000, 58.74], + [1170716400000, 58.88], + [1170802800000, 57.71], + [1170889200000, 59.71], + [1170975600000, 59.89], + [1171234800000, 57.81], + [1171321200000, 59.06], + [1171407600000, 58.00], + [1171494000000, 57.99], + [1171580400000, 59.39], + [1171839600000, 59.39], + [1171926000000, 58.07], + [1172012400000, 60.07], + [1172098800000, 61.14], + [1172444400000, 61.39], + [1172530800000, 61.46], + [1172617200000, 61.79], + [1172703600000, 62.00], + [1172790000000, 60.07], + [1173135600000, 60.69], + [1173222000000, 61.82], + [1173308400000, 60.05], + [1173654000000, 58.91], + [1173740400000, 57.93], + [1173826800000, 58.16], + [1173913200000, 57.55], + [1173999600000, 57.11], + [1174258800000, 56.59], + [1174345200000, 59.61], + [1174518000000, 61.69], + [1174604400000, 62.28], + [1174860000000, 62.91], + [1174946400000, 62.93], + [1175032800000, 64.03], + [1175119200000, 66.03], + [1175205600000, 65.87], + [1175464800000, 64.64], + [1175637600000, 64.38], + [1175724000000, 64.28], + [1175810400000, 64.28], + [1176069600000, 61.51], + [1176156000000, 61.89], + [1176242400000, 62.01], + [1176328800000, 63.85], + [1176415200000, 63.63], + [1176674400000, 63.61], + [1176760800000, 63.10], + [1176847200000, 63.13], + [1176933600000, 61.83], + [1177020000000, 63.38], + [1177279200000, 64.58], + [1177452000000, 65.84], + [1177538400000, 65.06], + [1177624800000, 66.46], + [1177884000000, 64.40], + [1178056800000, 63.68], + [1178143200000, 63.19], + [1178229600000, 61.93], + [1178488800000, 61.47], + [1178575200000, 61.55], + [1178748000000, 61.81], + [1178834400000, 62.37], + [1179093600000, 62.46], + [1179180000000, 63.17], + [1179266400000, 62.55], + [1179352800000, 64.94], + [1179698400000, 66.27], + [1179784800000, 65.50], + [1179871200000, 65.77], + [1179957600000, 64.18], + [1180044000000, 65.20], + [1180389600000, 63.15], + [1180476000000, 63.49], + [1180562400000, 65.08], + [1180908000000, 66.30], + [1180994400000, 65.96], + [1181167200000, 66.93], + [1181253600000, 65.98], + [1181599200000, 65.35], + [1181685600000, 66.26], + [1181858400000, 68.00], + [1182117600000, 69.09], + [1182204000000, 69.10], + [1182290400000, 68.19], + [1182376800000, 68.19], + [1182463200000, 69.14], + [1182722400000, 68.19], + [1182808800000, 67.77], + [1182895200000, 68.97], + [1182981600000, 69.57], + [1183068000000, 70.68], + [1183327200000, 71.09], + [1183413600000, 70.92], + [1183586400000, 71.81], + [1183672800000, 72.81], + [1183932000000, 72.19], + [1184018400000, 72.56], + [1184191200000, 72.50], + [1184277600000, 74.15], + [1184623200000, 75.05], + [1184796000000, 75.92], + [1184882400000, 75.57], + [1185141600000, 74.89], + [1185228000000, 73.56], + [1185314400000, 75.57], + [1185400800000, 74.95], + [1185487200000, 76.83], + [1185832800000, 78.21], + [1185919200000, 76.53], + [1186005600000, 76.86], + [1186092000000, 76.00], + [1186437600000, 71.59], + [1186696800000, 71.47], + [1186956000000, 71.62], + [1187042400000, 71.00], + [1187301600000, 71.98], + [1187560800000, 71.12], + [1187647200000, 69.47], + [1187733600000, 69.26], + [1187820000000, 69.83], + [1187906400000, 71.09], + [1188165600000, 71.73], + [1188338400000, 73.36], + [1188511200000, 74.04], + [1188856800000, 76.30], + [1189116000000, 77.49], + [1189461600000, 78.23], + [1189548000000, 79.91], + [1189634400000, 80.09], + [1189720800000, 79.10], + [1189980000000, 80.57], + [1190066400000, 81.93], + [1190239200000, 83.32], + [1190325600000, 81.62], + [1190584800000, 80.95], + [1190671200000, 79.53], + [1190757600000, 80.30], + [1190844000000, 82.88], + [1190930400000, 81.66], + [1191189600000, 80.24], + [1191276000000, 80.05], + [1191362400000, 79.94], + [1191448800000, 81.44], + [1191535200000, 81.22], + [1191794400000, 79.02], + [1191880800000, 80.26], + [1191967200000, 80.30], + [1192053600000, 83.08], + [1192140000000, 83.69], + [1192399200000, 86.13], + [1192485600000, 87.61], + [1192572000000, 87.40], + [1192658400000, 89.47], + [1192744800000, 88.60], + [1193004000000, 87.56], + [1193090400000, 87.56], + [1193176800000, 87.10], + [1193263200000, 91.86], + [1193612400000, 93.53], + [1193698800000, 94.53], + [1193871600000, 95.93], + [1194217200000, 93.98], + [1194303600000, 96.37], + [1194476400000, 95.46], + [1194562800000, 96.32], + [1195081200000, 93.43], + [1195167600000, 95.10], + [1195426800000, 94.64], + [1195513200000, 95.10], + [1196031600000, 97.70], + [1196118000000, 94.42], + [1196204400000, 90.62], + [1196290800000, 91.01], + [1196377200000, 88.71], + [1196636400000, 88.32], + [1196809200000, 90.23], + [1196982000000, 88.28], + [1197241200000, 87.86], + [1197327600000, 90.02], + [1197414000000, 92.25], + [1197586800000, 90.63], + [1197846000000, 90.63], + [1197932400000, 90.49], + [1198018800000, 91.24], + [1198105200000, 91.06], + [1198191600000, 90.49], + [1198710000000, 96.62], + [1198796400000, 96.00], + [1199142000000, 99.62], + [1199314800000, 99.18], + [1199401200000, 95.09], + [1199660400000, 96.33], + [1199833200000, 95.67], + [1200351600000, 91.90], + [1200438000000, 90.84], + [1200524400000, 90.13], + [1200610800000, 90.57], + [1200956400000, 89.21], + [1201042800000, 86.99], + [1201129200000, 89.85], + [1201474800000, 90.99], + [1201561200000, 91.64], + [1201647600000, 92.33], + [1201734000000, 91.75], + [1202079600000, 90.02], + [1202166000000, 88.41], + [1202252400000, 87.14], + [1202338800000, 88.11], + [1202425200000, 91.77], + [1202770800000, 92.78], + [1202857200000, 93.27], + [1202943600000, 95.46], + [1203030000000, 95.46], + [1203289200000, 101.74], + [1203462000000, 98.81], + [1203894000000, 100.88], + [1204066800000, 99.64], + [1204153200000, 102.59], + [1204239600000, 101.84], + [1204498800000, 99.52], + [1204585200000, 99.52], + [1204671600000, 104.52], + [1204758000000, 105.47], + [1204844400000, 105.15], + [1205103600000, 108.75], + [1205276400000, 109.92], + [1205362800000, 110.33], + [1205449200000, 110.21], + [1205708400000, 105.68], + [1205967600000, 101.84], + [1206313200000, 100.86], + [1206399600000, 101.22], + [1206486000000, 105.90], + [1206572400000, 107.58], + [1206658800000, 105.62], + [1206914400000, 101.58], + [1207000800000, 100.98], + [1207173600000, 103.83], + [1207260000000, 106.23], + [1207605600000, 108.50], + [1207778400000, 110.11], + [1207864800000, 110.14], + [1208210400000, 113.79], + [1208296800000, 114.93], + [1208383200000, 114.86], + [1208728800000, 117.48], + [1208815200000, 118.30], + [1208988000000, 116.06], + [1209074400000, 118.52], + [1209333600000, 118.75], + [1209420000000, 113.46], + [1209592800000, 112.52], + [1210024800000, 121.84], + [1210111200000, 123.53], + [1210197600000, 123.69], + [1210543200000, 124.23], + [1210629600000, 125.80], + [1210716000000, 126.29], + [1211148000000, 127.05], + [1211320800000, 129.07], + [1211493600000, 132.19], + [1211839200000, 128.85], + [1212357600000, 127.76], + [1212703200000, 138.54], + [1212962400000, 136.80], + [1213135200000, 136.38], + [1213308000000, 134.86], + [1213653600000, 134.01], + [1213740000000, 136.68], + [1213912800000, 135.65], + [1214172000000, 134.62], + [1214258400000, 134.62], + [1214344800000, 134.62], + [1214431200000, 139.64], + [1214517600000, 140.21], + [1214776800000, 140.00], + [1214863200000, 140.97], + [1214949600000, 143.57], + [1215036000000, 145.29], + [1215381600000, 141.37], + [1215468000000, 136.04], + [1215727200000, 146.40], + [1215986400000, 145.18], + [1216072800000, 138.74], + [1216159200000, 134.60], + [1216245600000, 129.29], + [1216332000000, 130.65], + [1216677600000, 127.95], + [1216850400000, 127.95], + [1217282400000, 122.19], + [1217455200000, 124.08], + [1217541600000, 125.10], + [1217800800000, 121.41], + [1217887200000, 119.17], + [1217973600000, 118.58], + [1218060000000, 120.02], + [1218405600000, 114.45], + [1218492000000, 113.01], + [1218578400000, 116.00], + [1218751200000, 113.77], + [1219010400000, 112.87], + [1219096800000, 114.53], + [1219269600000, 114.98], + [1219356000000, 114.98], + [1219701600000, 116.27], + [1219788000000, 118.15], + [1219874400000, 115.59], + [1219960800000, 115.46], + [1220306400000, 109.71], + [1220392800000, 109.35], + [1220565600000, 106.23], + [1220824800000, 106.34] + ]; + var exchangerates = [ + [1167606000000, 0.7580], + [1167692400000, 0.7580], + [1167778800000, 0.75470], + [1167865200000, 0.75490], + [1167951600000, 0.76130], + [1168038000000, 0.76550], + [1168124400000, 0.76930], + [1168210800000, 0.76940], + [1168297200000, 0.76880], + [1168383600000, 0.76780], + [1168470000000, 0.77080], + [1168556400000, 0.77270], + [1168642800000, 0.77490], + [1168729200000, 0.77410], + [1168815600000, 0.77410], + [1168902000000, 0.77320], + [1168988400000, 0.77270], + [1169074800000, 0.77370], + [1169161200000, 0.77240], + [1169247600000, 0.77120], + [1169334000000, 0.7720], + [1169420400000, 0.77210], + [1169506800000, 0.77170], + [1169593200000, 0.77040], + [1169679600000, 0.7690], + [1169766000000, 0.77110], + [1169852400000, 0.7740], + [1169938800000, 0.77450], + [1170025200000, 0.77450], + [1170111600000, 0.7740], + [1170198000000, 0.77160], + [1170284400000, 0.77130], + [1170370800000, 0.76780], + [1170457200000, 0.76880], + [1170543600000, 0.77180], + [1170630000000, 0.77180], + [1170716400000, 0.77280], + [1170802800000, 0.77290], + [1170889200000, 0.76980], + [1170975600000, 0.76850], + [1171062000000, 0.76810], + [1171148400000, 0.7690], + [1171234800000, 0.7690], + [1171321200000, 0.76980], + [1171407600000, 0.76990], + [1171494000000, 0.76510], + [1171580400000, 0.76130], + [1171666800000, 0.76160], + [1171753200000, 0.76140], + [1171839600000, 0.76140], + [1171926000000, 0.76070], + [1172012400000, 0.76020], + [1172098800000, 0.76110], + [1172185200000, 0.76220], + [1172271600000, 0.76150], + [1172358000000, 0.75980], + [1172444400000, 0.75980], + [1172530800000, 0.75920], + [1172617200000, 0.75730], + [1172703600000, 0.75660], + [1172790000000, 0.75670], + [1172876400000, 0.75910], + [1172962800000, 0.75820], + [1173049200000, 0.75850], + [1173135600000, 0.76130], + [1173222000000, 0.76310], + [1173308400000, 0.76150], + [1173394800000, 0.760], + [1173481200000, 0.76130], + [1173567600000, 0.76270], + [1173654000000, 0.76270], + [1173740400000, 0.76080], + [1173826800000, 0.75830], + [1173913200000, 0.75750], + [1173999600000, 0.75620], + [1174086000000, 0.7520], + [1174172400000, 0.75120], + [1174258800000, 0.75120], + [1174345200000, 0.75170], + [1174431600000, 0.7520], + [1174518000000, 0.75110], + [1174604400000, 0.7480], + [1174690800000, 0.75090], + [1174777200000, 0.75310], + [1174860000000, 0.75310], + [1174946400000, 0.75270], + [1175032800000, 0.74980], + [1175119200000, 0.74930], + [1175205600000, 0.75040], + [1175292000000, 0.750], + [1175378400000, 0.74910], + [1175464800000, 0.74910], + [1175551200000, 0.74850], + [1175637600000, 0.74840], + [1175724000000, 0.74920], + [1175810400000, 0.74710], + [1175896800000, 0.74590], + [1175983200000, 0.74770], + [1176069600000, 0.74770], + [1176156000000, 0.74830], + [1176242400000, 0.74580], + [1176328800000, 0.74480], + [1176415200000, 0.7430], + [1176501600000, 0.73990], + [1176588000000, 0.73950], + [1176674400000, 0.73950], + [1176760800000, 0.73780], + [1176847200000, 0.73820], + [1176933600000, 0.73620], + [1177020000000, 0.73550], + [1177106400000, 0.73480], + [1177192800000, 0.73610], + [1177279200000, 0.73610], + [1177365600000, 0.73650], + [1177452000000, 0.73620], + [1177538400000, 0.73310], + [1177624800000, 0.73390], + [1177711200000, 0.73440], + [1177797600000, 0.73270], + [1177884000000, 0.73270], + [1177970400000, 0.73360], + [1178056800000, 0.73330], + [1178143200000, 0.73590], + [1178229600000, 0.73590], + [1178316000000, 0.73720], + [1178402400000, 0.7360], + [1178488800000, 0.7360], + [1178575200000, 0.7350], + [1178661600000, 0.73650], + [1178748000000, 0.73840], + [1178834400000, 0.73950], + [1178920800000, 0.74130], + [1179007200000, 0.73970], + [1179093600000, 0.73960], + [1179180000000, 0.73850], + [1179266400000, 0.73780], + [1179352800000, 0.73660], + [1179439200000, 0.740], + [1179525600000, 0.74110], + [1179612000000, 0.74060], + [1179698400000, 0.74050], + [1179784800000, 0.74140], + [1179871200000, 0.74310], + [1179957600000, 0.74310], + [1180044000000, 0.74380], + [1180130400000, 0.74430], + [1180216800000, 0.74430], + [1180303200000, 0.74430], + [1180389600000, 0.74340], + [1180476000000, 0.74290], + [1180562400000, 0.74420], + [1180648800000, 0.7440], + [1180735200000, 0.74390], + [1180821600000, 0.74370], + [1180908000000, 0.74370], + [1180994400000, 0.74290], + [1181080800000, 0.74030], + [1181167200000, 0.73990], + [1181253600000, 0.74180], + [1181340000000, 0.74680], + [1181426400000, 0.7480], + [1181512800000, 0.7480], + [1181599200000, 0.7490], + [1181685600000, 0.74940], + [1181772000000, 0.75220], + [1181858400000, 0.75150], + [1181944800000, 0.75020], + [1182031200000, 0.74720], + [1182117600000, 0.74720], + [1182204000000, 0.74620], + [1182290400000, 0.74550], + [1182376800000, 0.74490], + [1182463200000, 0.74670], + [1182549600000, 0.74580], + [1182636000000, 0.74270], + [1182722400000, 0.74270], + [1182808800000, 0.7430], + [1182895200000, 0.74290], + [1182981600000, 0.7440], + [1183068000000, 0.7430], + [1183154400000, 0.74220], + [1183240800000, 0.73880], + [1183327200000, 0.73880], + [1183413600000, 0.73690], + [1183500000000, 0.73450], + [1183586400000, 0.73450], + [1183672800000, 0.73450], + [1183759200000, 0.73520], + [1183845600000, 0.73410], + [1183932000000, 0.73410], + [1184018400000, 0.7340], + [1184104800000, 0.73240], + [1184191200000, 0.72720], + [1184277600000, 0.72640], + [1184364000000, 0.72550], + [1184450400000, 0.72580], + [1184536800000, 0.72580], + [1184623200000, 0.72560], + [1184709600000, 0.72570], + [1184796000000, 0.72470], + [1184882400000, 0.72430], + [1184968800000, 0.72440], + [1185055200000, 0.72350], + [1185141600000, 0.72350], + [1185228000000, 0.72350], + [1185314400000, 0.72350], + [1185400800000, 0.72620], + [1185487200000, 0.72880], + [1185573600000, 0.73010], + [1185660000000, 0.73370], + [1185746400000, 0.73370], + [1185832800000, 0.73240], + [1185919200000, 0.72970], + [1186005600000, 0.73170], + [1186092000000, 0.73150], + [1186178400000, 0.72880], + [1186264800000, 0.72630], + [1186351200000, 0.72630], + [1186437600000, 0.72420], + [1186524000000, 0.72530], + [1186610400000, 0.72640], + [1186696800000, 0.7270], + [1186783200000, 0.73120], + [1186869600000, 0.73050], + [1186956000000, 0.73050], + [1187042400000, 0.73180], + [1187128800000, 0.73580], + [1187215200000, 0.74090], + [1187301600000, 0.74540], + [1187388000000, 0.74370], + [1187474400000, 0.74240], + [1187560800000, 0.74240], + [1187647200000, 0.74150], + [1187733600000, 0.74190], + [1187820000000, 0.74140], + [1187906400000, 0.73770], + [1187992800000, 0.73550], + [1188079200000, 0.73150], + [1188165600000, 0.73150], + [1188252000000, 0.7320], + [1188338400000, 0.73320], + [1188424800000, 0.73460], + [1188511200000, 0.73280], + [1188597600000, 0.73230], + [1188684000000, 0.7340], + [1188770400000, 0.7340], + [1188856800000, 0.73360], + [1188943200000, 0.73510], + [1189029600000, 0.73460], + [1189116000000, 0.73210], + [1189202400000, 0.72940], + [1189288800000, 0.72660], + [1189375200000, 0.72660], + [1189461600000, 0.72540], + [1189548000000, 0.72420], + [1189634400000, 0.72130], + [1189720800000, 0.71970], + [1189807200000, 0.72090], + [1189893600000, 0.7210], + [1189980000000, 0.7210], + [1190066400000, 0.7210], + [1190152800000, 0.72090], + [1190239200000, 0.71590], + [1190325600000, 0.71330], + [1190412000000, 0.71050], + [1190498400000, 0.70990], + [1190584800000, 0.70990], + [1190671200000, 0.70930], + [1190757600000, 0.70930], + [1190844000000, 0.70760], + [1190930400000, 0.7070], + [1191016800000, 0.70490], + [1191103200000, 0.70120], + [1191189600000, 0.70110], + [1191276000000, 0.70190], + [1191362400000, 0.70460], + [1191448800000, 0.70630], + [1191535200000, 0.70890], + [1191621600000, 0.70770], + [1191708000000, 0.70770], + [1191794400000, 0.70770], + [1191880800000, 0.70910], + [1191967200000, 0.71180], + [1192053600000, 0.70790], + [1192140000000, 0.70530], + [1192226400000, 0.7050], + [1192312800000, 0.70550], + [1192399200000, 0.70550], + [1192485600000, 0.70450], + [1192572000000, 0.70510], + [1192658400000, 0.70510], + [1192744800000, 0.70170], + [1192831200000, 0.70], + [1192917600000, 0.69950], + [1193004000000, 0.69940], + [1193090400000, 0.70140], + [1193176800000, 0.70360], + [1193263200000, 0.70210], + [1193349600000, 0.70020], + [1193436000000, 0.69670], + [1193522400000, 0.6950], + [1193612400000, 0.6950], + [1193698800000, 0.69390], + [1193785200000, 0.6940], + [1193871600000, 0.69220], + [1193958000000, 0.69190], + [1194044400000, 0.69140], + [1194130800000, 0.68940], + [1194217200000, 0.68910], + [1194303600000, 0.69040], + [1194390000000, 0.6890], + [1194476400000, 0.68340], + [1194562800000, 0.68230], + [1194649200000, 0.68070], + [1194735600000, 0.68150], + [1194822000000, 0.68150], + [1194908400000, 0.68470], + [1194994800000, 0.68590], + [1195081200000, 0.68220], + [1195167600000, 0.68270], + [1195254000000, 0.68370], + [1195340400000, 0.68230], + [1195426800000, 0.68220], + [1195513200000, 0.68220], + [1195599600000, 0.67920], + [1195686000000, 0.67460], + [1195772400000, 0.67350], + [1195858800000, 0.67310], + [1195945200000, 0.67420], + [1196031600000, 0.67440], + [1196118000000, 0.67390], + [1196204400000, 0.67310], + [1196290800000, 0.67610], + [1196377200000, 0.67610], + [1196463600000, 0.67850], + [1196550000000, 0.68180], + [1196636400000, 0.68360], + [1196722800000, 0.68230], + [1196809200000, 0.68050], + [1196895600000, 0.67930], + [1196982000000, 0.68490], + [1197068400000, 0.68330], + [1197154800000, 0.68250], + [1197241200000, 0.68250], + [1197327600000, 0.68160], + [1197414000000, 0.67990], + [1197500400000, 0.68130], + [1197586800000, 0.68090], + [1197673200000, 0.68680], + [1197759600000, 0.69330], + [1197846000000, 0.69330], + [1197932400000, 0.69450], + [1198018800000, 0.69440], + [1198105200000, 0.69460], + [1198191600000, 0.69640], + [1198278000000, 0.69650], + [1198364400000, 0.69560], + [1198450800000, 0.69560], + [1198537200000, 0.6950], + [1198623600000, 0.69480], + [1198710000000, 0.69280], + [1198796400000, 0.68870], + [1198882800000, 0.68240], + [1198969200000, 0.67940], + [1199055600000, 0.67940], + [1199142000000, 0.68030], + [1199228400000, 0.68550], + [1199314800000, 0.68240], + [1199401200000, 0.67910], + [1199487600000, 0.67830], + [1199574000000, 0.67850], + [1199660400000, 0.67850], + [1199746800000, 0.67970], + [1199833200000, 0.680], + [1199919600000, 0.68030], + [1200006000000, 0.68050], + [1200092400000, 0.6760], + [1200178800000, 0.6770], + [1200265200000, 0.6770], + [1200351600000, 0.67360], + [1200438000000, 0.67260], + [1200524400000, 0.67640], + [1200610800000, 0.68210], + [1200697200000, 0.68310], + [1200783600000, 0.68420], + [1200870000000, 0.68420], + [1200956400000, 0.68870], + [1201042800000, 0.69030], + [1201129200000, 0.68480], + [1201215600000, 0.68240], + [1201302000000, 0.67880], + [1201388400000, 0.68140], + [1201474800000, 0.68140], + [1201561200000, 0.67970], + [1201647600000, 0.67690], + [1201734000000, 0.67650], + [1201820400000, 0.67330], + [1201906800000, 0.67290], + [1201993200000, 0.67580], + [1202079600000, 0.67580], + [1202166000000, 0.6750], + [1202252400000, 0.6780], + [1202338800000, 0.68330], + [1202425200000, 0.68560], + [1202511600000, 0.69030], + [1202598000000, 0.68960], + [1202684400000, 0.68960], + [1202770800000, 0.68820], + [1202857200000, 0.68790], + [1202943600000, 0.68620], + [1203030000000, 0.68520], + [1203116400000, 0.68230], + [1203202800000, 0.68130], + [1203289200000, 0.68130], + [1203375600000, 0.68220], + [1203462000000, 0.68020], + [1203548400000, 0.68020], + [1203634800000, 0.67840], + [1203721200000, 0.67480], + [1203807600000, 0.67470], + [1203894000000, 0.67470], + [1203980400000, 0.67480], + [1204066800000, 0.67330], + [1204153200000, 0.6650], + [1204239600000, 0.66110], + [1204326000000, 0.65830], + [1204412400000, 0.6590], + [1204498800000, 0.6590], + [1204585200000, 0.65810], + [1204671600000, 0.65780], + [1204758000000, 0.65740], + [1204844400000, 0.65320], + [1204930800000, 0.65020], + [1205017200000, 0.65140], + [1205103600000, 0.65140], + [1205190000000, 0.65070], + [1205276400000, 0.6510], + [1205362800000, 0.64890], + [1205449200000, 0.64240], + [1205535600000, 0.64060], + [1205622000000, 0.63820], + [1205708400000, 0.63820], + [1205794800000, 0.63410], + [1205881200000, 0.63440], + [1205967600000, 0.63780], + [1206054000000, 0.64390], + [1206140400000, 0.64780], + [1206226800000, 0.64810], + [1206313200000, 0.64810], + [1206399600000, 0.64940], + [1206486000000, 0.64380], + [1206572400000, 0.63770], + [1206658800000, 0.63290], + [1206745200000, 0.63360], + [1206831600000, 0.63330], + [1206914400000, 0.63330], + [1207000800000, 0.6330], + [1207087200000, 0.63710], + [1207173600000, 0.64030], + [1207260000000, 0.63960], + [1207346400000, 0.63640], + [1207432800000, 0.63560], + [1207519200000, 0.63560], + [1207605600000, 0.63680], + [1207692000000, 0.63570], + [1207778400000, 0.63540], + [1207864800000, 0.6320], + [1207951200000, 0.63320], + [1208037600000, 0.63280], + [1208124000000, 0.63310], + [1208210400000, 0.63420], + [1208296800000, 0.63210], + [1208383200000, 0.63020], + [1208469600000, 0.62780], + [1208556000000, 0.63080], + [1208642400000, 0.63240], + [1208728800000, 0.63240], + [1208815200000, 0.63070], + [1208901600000, 0.62770], + [1208988000000, 0.62690], + [1209074400000, 0.63350], + [1209160800000, 0.63920], + [1209247200000, 0.640], + [1209333600000, 0.64010], + [1209420000000, 0.63960], + [1209506400000, 0.64070], + [1209592800000, 0.64230], + [1209679200000, 0.64290], + [1209765600000, 0.64720], + [1209852000000, 0.64850], + [1209938400000, 0.64860], + [1210024800000, 0.64670], + [1210111200000, 0.64440], + [1210197600000, 0.64670], + [1210284000000, 0.65090], + [1210370400000, 0.64780], + [1210456800000, 0.64610], + [1210543200000, 0.64610], + [1210629600000, 0.64680], + [1210716000000, 0.64490], + [1210802400000, 0.6470], + [1210888800000, 0.64610], + [1210975200000, 0.64520], + [1211061600000, 0.64220], + [1211148000000, 0.64220], + [1211234400000, 0.64250], + [1211320800000, 0.64140], + [1211407200000, 0.63660], + [1211493600000, 0.63460], + [1211580000000, 0.6350], + [1211666400000, 0.63460], + [1211752800000, 0.63460], + [1211839200000, 0.63430], + [1211925600000, 0.63460], + [1212012000000, 0.63790], + [1212098400000, 0.64160], + [1212184800000, 0.64420], + [1212271200000, 0.64310], + [1212357600000, 0.64310], + [1212444000000, 0.64350], + [1212530400000, 0.6440], + [1212616800000, 0.64730], + [1212703200000, 0.64690], + [1212789600000, 0.63860], + [1212876000000, 0.63560], + [1212962400000, 0.6340], + [1213048800000, 0.63460], + [1213135200000, 0.6430], + [1213221600000, 0.64520], + [1213308000000, 0.64670], + [1213394400000, 0.65060], + [1213480800000, 0.65040], + [1213567200000, 0.65030], + [1213653600000, 0.64810], + [1213740000000, 0.64510], + [1213826400000, 0.6450], + [1213912800000, 0.64410], + [1213999200000, 0.64140], + [1214085600000, 0.64090], + [1214172000000, 0.64090], + [1214258400000, 0.64280], + [1214344800000, 0.64310], + [1214431200000, 0.64180], + [1214517600000, 0.63710], + [1214604000000, 0.63490], + [1214690400000, 0.63330], + [1214776800000, 0.63340], + [1214863200000, 0.63380], + [1214949600000, 0.63420], + [1215036000000, 0.6320], + [1215122400000, 0.63180], + [1215208800000, 0.6370], + [1215295200000, 0.63680], + [1215381600000, 0.63680], + [1215468000000, 0.63830], + [1215554400000, 0.63710], + [1215640800000, 0.63710], + [1215727200000, 0.63550], + [1215813600000, 0.6320], + [1215900000000, 0.62770], + [1215986400000, 0.62760], + [1216072800000, 0.62910], + [1216159200000, 0.62740], + [1216245600000, 0.62930], + [1216332000000, 0.63110], + [1216418400000, 0.6310], + [1216504800000, 0.63120], + [1216591200000, 0.63120], + [1216677600000, 0.63040], + [1216764000000, 0.62940], + [1216850400000, 0.63480], + [1216936800000, 0.63780], + [1217023200000, 0.63680], + [1217109600000, 0.63680], + [1217196000000, 0.63680], + [1217282400000, 0.6360], + [1217368800000, 0.6370], + [1217455200000, 0.64180], + [1217541600000, 0.64110], + [1217628000000, 0.64350], + [1217714400000, 0.64270], + [1217800800000, 0.64270], + [1217887200000, 0.64190], + [1217973600000, 0.64460], + [1218060000000, 0.64680], + [1218146400000, 0.64870], + [1218232800000, 0.65940], + [1218319200000, 0.66660], + [1218405600000, 0.66660], + [1218492000000, 0.66780], + [1218578400000, 0.67120], + [1218664800000, 0.67050], + [1218751200000, 0.67180], + [1218837600000, 0.67840], + [1218924000000, 0.68110], + [1219010400000, 0.68110], + [1219096800000, 0.67940], + [1219183200000, 0.68040], + [1219269600000, 0.67810], + [1219356000000, 0.67560], + [1219442400000, 0.67350], + [1219528800000, 0.67630], + [1219615200000, 0.67620], + [1219701600000, 0.67770], + [1219788000000, 0.68150], + [1219874400000, 0.68020], + [1219960800000, 0.6780], + [1220047200000, 0.67960], + [1220133600000, 0.68170], + [1220220000000, 0.68170], + [1220306400000, 0.68320], + [1220392800000, 0.68770], + [1220479200000, 0.69120], + [1220565600000, 0.69140], + [1220652000000, 0.70090], + [1220738400000, 0.70120], + [1220824800000, 0.7010], + [1220911200000, 0.70050] + ]; + + function euroFormatter(v, axis) { + return v.toFixed(axis.tickDecimals) + "€"; + } + + function doPlot(position) { + $.plot($("#flot-line-chart-multi"), [{ + data: oilprices, + label: "Oil price ($)" + }, { + data: exchangerates, + label: "USD/EUR exchange rate", + yaxis: 2 + }], { + xaxes: [{ + mode: 'time' + }], + yaxes: [{ + min: 0 + }, { + // align if we are to the right + alignTicksWithAxis: position == "right" ? 1 : null, + position: position, + tickFormatter: euroFormatter + }], + legend: { + position: 'sw' + }, + grid: { + hoverable: true //IMPORTANT! this is needed for tooltip to work + }, + tooltip: true, + tooltipOpts: { + content: "%s for %x was %y", + xDateFormat: "%y-%0m-%0d", + + onHover: function(flotItem, $tooltipEl) { + // console.log(flotItem, $tooltipEl); + } + } + + }); + } + + doPlot("right"); + + $("button").click(function() { + doPlot($(this).text()); + }); +}); + +//Flot Moving Line Chart + +$(function() { + + var container = $("#flot-line-chart-moving"); + + // Determine how many data points to keep based on the placeholder's initial size; + // this gives us a nice high-res plot while avoiding more than one point per pixel. + + var maximum = container.outerWidth() / 2 || 300; + + // + + var data = []; + + function getRandomData() { + + if (data.length) { + data = data.slice(1); + } + + while (data.length < maximum) { + var previous = data.length ? data[data.length - 1] : 50; + var y = previous + Math.random() * 10 - 5; + data.push(y < 0 ? 0 : y > 100 ? 100 : y); + } + + // zip the generated y values with the x values + + var res = []; + for (var i = 0; i < data.length; ++i) { + res.push([i, data[i]]) + } + + return res; + } + + // + + series = [{ + data: getRandomData(), + lines: { + fill: true + } + }]; + + // + + var plot = $.plot(container, series, { + grid: { + borderWidth: 1, + minBorderMargin: 20, + labelMargin: 10, + backgroundColor: { + colors: ["#fff", "#e4f4f4"] + }, + margin: { + top: 8, + bottom: 20, + left: 20 + }, + markings: function(axes) { + var markings = []; + var xaxis = axes.xaxis; + for (var x = Math.floor(xaxis.min); x < xaxis.max; x += xaxis.tickSize * 2) { + markings.push({ + xaxis: { + from: x, + to: x + xaxis.tickSize + }, + color: "rgba(232, 232, 255, 0.2)" + }); + } + return markings; + } + }, + xaxis: { + tickFormatter: function() { + return ""; + } + }, + yaxis: { + min: 0, + max: 110 + }, + legend: { + show: true + } + }); + + // Update the random dataset at 25FPS for a smoothly-animating chart + + setInterval(function updateRandom() { + series[0].data = getRandomData(); + plot.setData(series); + plot.draw(); + }, 40); + +}); + +//Flot Bar Chart + +$(function() { + + var barOptions = { + series: { + bars: { + show: true, + barWidth: 43200000 + } + }, + xaxis: { + mode: "time", + timeformat: "%m/%d", + minTickSize: [1, "day"] + }, + grid: { + hoverable: true + }, + legend: { + show: false + }, + tooltip: true, + tooltipOpts: { + content: "x: %x, y: %y" + } + }; + var barData = { + label: "bar", + data: [ + [1354521600000, 1000], + [1355040000000, 2000], + [1355223600000, 3000], + [1355306400000, 4000], + [1355487300000, 5000], + [1355571900000, 6000] + ] + }; + $.plot($("#flot-bar-chart"), [barData], barOptions); + +}); diff --git a/theme/bootstrap/js/jquery.js b/theme/bootstrap/js/jquery.js new file mode 100644 index 0000000..d1608e3 --- /dev/null +++ b/theme/bootstrap/js/jquery.js @@ -0,0 +1,4 @@ +/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=lb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=mb(b);function pb(){}pb.prototype=d.filters=d.pseudos,d.setFilters=new pb,g=fb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fb.error(a):z(a,i).slice(0)};function qb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h; +if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==cb()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===cb()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ab:bb):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:bb,isPropagationStopped:bb,isImmediatePropagationStopped:bb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ab,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ab,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ab,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=bb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=bb),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function db(a){var b=eb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var eb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fb=/ jQuery\d+="(?:null|\d+)"/g,gb=new RegExp("<(?:"+eb+")[\\s/>]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/<tbody/i,lb=/<|&#?\w+;/,mb=/<(?:script|style|link)/i,nb=/checked\s*(?:[^=]|=\s*.checked.)/i,ob=/^$|\/(?:java|ecma)script/i,pb=/^true\/(.*)/,qb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,rb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?"<table>"!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.detach()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e)}m.Tween=Zb,Zb.prototype={constructor:Zb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px") +},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$b=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_b||(_b=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_b),_b=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSetAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contenteditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.ActiveXObject&&m(a).on("unload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m}); \ No newline at end of file diff --git a/theme/bootstrap/js/morris-data.js b/theme/bootstrap/js/morris-data.js new file mode 100644 index 0000000..e5e23f6 --- /dev/null +++ b/theme/bootstrap/js/morris-data.js @@ -0,0 +1,117 @@ +$(function() { + + Morris.Area({ + element: 'morris-area-chart', + data: [{ + period: '2010 Q1', + iphone: 2666, + ipad: null, + itouch: 2647 + }, { + period: '2010 Q2', + iphone: 2778, + ipad: 2294, + itouch: 2441 + }, { + period: '2010 Q3', + iphone: 4912, + ipad: 1969, + itouch: 2501 + }, { + period: '2010 Q4', + iphone: 3767, + ipad: 3597, + itouch: 5689 + }, { + period: '2011 Q1', + iphone: 6810, + ipad: 1914, + itouch: 2293 + }, { + period: '2011 Q2', + iphone: 5670, + ipad: 4293, + itouch: 1881 + }, { + period: '2011 Q3', + iphone: 4820, + ipad: 3795, + itouch: 1588 + }, { + period: '2011 Q4', + iphone: 15073, + ipad: 5967, + itouch: 5175 + }, { + period: '2012 Q1', + iphone: 10687, + ipad: 4460, + itouch: 2028 + }, { + period: '2012 Q2', + iphone: 8432, + ipad: 5713, + itouch: 1791 + }], + xkey: 'period', + ykeys: ['iphone', 'ipad', 'itouch'], + labels: ['iPhone', 'iPad', 'iPod Touch'], + pointSize: 2, + hideHover: 'auto', + resize: true + }); + + Morris.Donut({ + element: 'morris-donut-chart', + data: [{ + label: "Download Sales", + value: 12 + }, { + label: "In-Store Sales", + value: 30 + }, { + label: "Mail-Order Sales", + value: 20 + }], + resize: true + }); + + Morris.Bar({ + element: 'morris-bar-chart', + data: [{ + y: '2006', + a: 100, + b: 90 + }, { + y: '2007', + a: 75, + b: 65 + }, { + y: '2008', + a: 50, + b: 40 + }, { + y: '2009', + a: 75, + b: 65 + }, { + y: '2010', + a: 50, + b: 40 + }, { + y: '2011', + a: 75, + b: 65 + }, { + y: '2012', + a: 100, + b: 90 + }], + xkey: 'y', + ykeys: ['a', 'b'], + labels: ['Series A', 'Series B'], + hideHover: 'auto', + resize: true + }); + +}); diff --git a/theme/bootstrap/js/npm.js b/theme/bootstrap/js/npm.js new file mode 100644 index 0000000..bf6aa80 --- /dev/null +++ b/theme/bootstrap/js/npm.js @@ -0,0 +1,13 @@ +// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. +require('../../js/transition.js') +require('../../js/alert.js') +require('../../js/button.js') +require('../../js/carousel.js') +require('../../js/collapse.js') +require('../../js/dropdown.js') +require('../../js/modal.js') +require('../../js/tooltip.js') +require('../../js/popover.js') +require('../../js/scrollspy.js') +require('../../js/tab.js') +require('../../js/affix.js') \ No newline at end of file diff --git a/theme/bootstrap/js/plugins/flot/excanvas.min.js b/theme/bootstrap/js/plugins/flot/excanvas.min.js new file mode 100644 index 0000000..12c74f7 --- /dev/null +++ b/theme/bootstrap/js/plugins/flot/excanvas.min.js @@ -0,0 +1 @@ +if(!document.createElement("canvas").getContext){(function(){var z=Math;var K=z.round;var J=z.sin;var U=z.cos;var b=z.abs;var k=z.sqrt;var D=10;var F=D/2;function T(){return this.context_||(this.context_=new W(this))}var O=Array.prototype.slice;function G(i,j,m){var Z=O.call(arguments,2);return function(){return i.apply(j,Z.concat(O.call(arguments)))}}function AD(Z){return String(Z).replace(/&/g,"&amp;").replace(/"/g,"&quot;")}function r(i){if(!i.namespaces.g_vml_){i.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML")}if(!i.namespaces.g_o_){i.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML")}if(!i.styleSheets.ex_canvas_){var Z=i.createStyleSheet();Z.owningElement.id="ex_canvas_";Z.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}r(document);var E={init:function(Z){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var i=Z||document;i.createElement("canvas");i.attachEvent("onreadystatechange",G(this.init_,this,i))}},init_:function(m){var j=m.getElementsByTagName("canvas");for(var Z=0;Z<j.length;Z++){this.initElement(j[Z])}},initElement:function(i){if(!i.getContext){i.getContext=T;r(i.ownerDocument);i.innerHTML="";i.attachEvent("onpropertychange",S);i.attachEvent("onresize",w);var Z=i.attributes;if(Z.width&&Z.width.specified){i.style.width=Z.width.nodeValue+"px"}else{i.width=i.clientWidth}if(Z.height&&Z.height.specified){i.style.height=Z.height.nodeValue+"px"}else{i.height=i.clientHeight}}return i}};function S(i){var Z=i.srcElement;switch(i.propertyName){case"width":Z.getContext().clearRect();Z.style.width=Z.attributes.width.nodeValue+"px";Z.firstChild.style.width=Z.clientWidth+"px";break;case"height":Z.getContext().clearRect();Z.style.height=Z.attributes.height.nodeValue+"px";Z.firstChild.style.height=Z.clientHeight+"px";break}}function w(i){var Z=i.srcElement;if(Z.firstChild){Z.firstChild.style.width=Z.clientWidth+"px";Z.firstChild.style.height=Z.clientHeight+"px"}}E.init();var I=[];for(var AC=0;AC<16;AC++){for(var AB=0;AB<16;AB++){I[AC*16+AB]=AC.toString(16)+AB.toString(16)}}function V(){return[[1,0,0],[0,1,0],[0,0,1]]}function d(m,j){var i=V();for(var Z=0;Z<3;Z++){for(var AF=0;AF<3;AF++){var p=0;for(var AE=0;AE<3;AE++){p+=m[Z][AE]*j[AE][AF]}i[Z][AF]=p}}return i}function Q(i,Z){Z.fillStyle=i.fillStyle;Z.lineCap=i.lineCap;Z.lineJoin=i.lineJoin;Z.lineWidth=i.lineWidth;Z.miterLimit=i.miterLimit;Z.shadowBlur=i.shadowBlur;Z.shadowColor=i.shadowColor;Z.shadowOffsetX=i.shadowOffsetX;Z.shadowOffsetY=i.shadowOffsetY;Z.strokeStyle=i.strokeStyle;Z.globalAlpha=i.globalAlpha;Z.font=i.font;Z.textAlign=i.textAlign;Z.textBaseline=i.textBaseline;Z.arcScaleX_=i.arcScaleX_;Z.arcScaleY_=i.arcScaleY_;Z.lineScale_=i.lineScale_}var B={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"};function g(i){var m=i.indexOf("(",3);var Z=i.indexOf(")",m+1);var j=i.substring(m+1,Z).split(",");if(j.length==4&&i.substr(3,1)=="a"){alpha=Number(j[3])}else{j[3]=1}return j}function C(Z){return parseFloat(Z)/100}function N(i,j,Z){return Math.min(Z,Math.max(j,i))}function c(AF){var j,i,Z;h=parseFloat(AF[0])/360%360;if(h<0){h++}s=N(C(AF[1]),0,1);l=N(C(AF[2]),0,1);if(s==0){j=i=Z=l}else{var m=l<0.5?l*(1+s):l+s-l*s;var AE=2*l-m;j=A(AE,m,h+1/3);i=A(AE,m,h);Z=A(AE,m,h-1/3)}return"#"+I[Math.floor(j*255)]+I[Math.floor(i*255)]+I[Math.floor(Z*255)]}function A(i,Z,j){if(j<0){j++}if(j>1){j--}if(6*j<1){return i+(Z-i)*6*j}else{if(2*j<1){return Z}else{if(3*j<2){return i+(Z-i)*(2/3-j)*6}else{return i}}}}function Y(Z){var AE,p=1;Z=String(Z);if(Z.charAt(0)=="#"){AE=Z}else{if(/^rgb/.test(Z)){var m=g(Z);var AE="#",AF;for(var j=0;j<3;j++){if(m[j].indexOf("%")!=-1){AF=Math.floor(C(m[j])*255)}else{AF=Number(m[j])}AE+=I[N(AF,0,255)]}p=m[3]}else{if(/^hsl/.test(Z)){var m=g(Z);AE=c(m);p=m[3]}else{AE=B[Z]||Z}}}return{color:AE,alpha:p}}var L={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var f={};function X(Z){if(f[Z]){return f[Z]}var m=document.createElement("div");var j=m.style;try{j.font=Z}catch(i){}return f[Z]={style:j.fontStyle||L.style,variant:j.fontVariant||L.variant,weight:j.fontWeight||L.weight,size:j.fontSize||L.size,family:j.fontFamily||L.family}}function P(j,i){var Z={};for(var AF in j){Z[AF]=j[AF]}var AE=parseFloat(i.currentStyle.fontSize),m=parseFloat(j.size);if(typeof j.size=="number"){Z.size=j.size}else{if(j.size.indexOf("px")!=-1){Z.size=m}else{if(j.size.indexOf("em")!=-1){Z.size=AE*m}else{if(j.size.indexOf("%")!=-1){Z.size=(AE/100)*m}else{if(j.size.indexOf("pt")!=-1){Z.size=m/0.75}else{Z.size=AE}}}}}Z.size*=0.981;return Z}function AA(Z){return Z.style+" "+Z.variant+" "+Z.weight+" "+Z.size+"px "+Z.family}function t(Z){switch(Z){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function W(i){this.m_=V();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=D*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var Z=i.ownerDocument.createElement("div");Z.style.width=i.clientWidth+"px";Z.style.height=i.clientHeight+"px";Z.style.overflow="hidden";Z.style.position="absolute";i.appendChild(Z);this.element_=Z;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var M=W.prototype;M.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};M.beginPath=function(){this.currentPath_=[]};M.moveTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"moveTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.lineTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"lineTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.bezierCurveTo=function(j,i,AI,AH,AG,AE){var Z=this.getCoords_(AG,AE);var AF=this.getCoords_(j,i);var m=this.getCoords_(AI,AH);e(this,AF,m,Z)};function e(Z,m,j,i){Z.currentPath_.push({type:"bezierCurveTo",cp1x:m.x,cp1y:m.y,cp2x:j.x,cp2y:j.y,x:i.x,y:i.y});Z.currentX_=i.x;Z.currentY_=i.y}M.quadraticCurveTo=function(AG,j,i,Z){var AF=this.getCoords_(AG,j);var AE=this.getCoords_(i,Z);var AH={x:this.currentX_+2/3*(AF.x-this.currentX_),y:this.currentY_+2/3*(AF.y-this.currentY_)};var m={x:AH.x+(AE.x-this.currentX_)/3,y:AH.y+(AE.y-this.currentY_)/3};e(this,AH,m,AE)};M.arc=function(AJ,AH,AI,AE,i,j){AI*=D;var AN=j?"at":"wa";var AK=AJ+U(AE)*AI-F;var AM=AH+J(AE)*AI-F;var Z=AJ+U(i)*AI-F;var AL=AH+J(i)*AI-F;if(AK==Z&&!j){AK+=0.125}var m=this.getCoords_(AJ,AH);var AG=this.getCoords_(AK,AM);var AF=this.getCoords_(Z,AL);this.currentPath_.push({type:AN,x:m.x,y:m.y,radius:AI,xStart:AG.x,yStart:AG.y,xEnd:AF.x,yEnd:AF.y})};M.rect=function(j,i,Z,m){this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath()};M.strokeRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.stroke();this.currentPath_=p};M.fillRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.fill();this.currentPath_=p};M.createLinearGradient=function(i,m,Z,j){var p=new v("gradient");p.x0_=i;p.y0_=m;p.x1_=Z;p.y1_=j;return p};M.createRadialGradient=function(m,AE,j,i,p,Z){var AF=new v("gradientradial");AF.x0_=m;AF.y0_=AE;AF.r0_=j;AF.x1_=i;AF.y1_=p;AF.r1_=Z;return AF};M.drawImage=function(AO,j){var AH,AF,AJ,AV,AM,AK,AQ,AX;var AI=AO.runtimeStyle.width;var AN=AO.runtimeStyle.height;AO.runtimeStyle.width="auto";AO.runtimeStyle.height="auto";var AG=AO.width;var AT=AO.height;AO.runtimeStyle.width=AI;AO.runtimeStyle.height=AN;if(arguments.length==3){AH=arguments[1];AF=arguments[2];AM=AK=0;AQ=AJ=AG;AX=AV=AT}else{if(arguments.length==5){AH=arguments[1];AF=arguments[2];AJ=arguments[3];AV=arguments[4];AM=AK=0;AQ=AG;AX=AT}else{if(arguments.length==9){AM=arguments[1];AK=arguments[2];AQ=arguments[3];AX=arguments[4];AH=arguments[5];AF=arguments[6];AJ=arguments[7];AV=arguments[8]}else{throw Error("Invalid number of arguments")}}}var AW=this.getCoords_(AH,AF);var m=AQ/2;var i=AX/2;var AU=[];var Z=10;var AE=10;AU.push(" <g_vml_:group",' coordsize="',D*Z,",",D*AE,'"',' coordorigin="0,0"',' style="width:',Z,"px;height:",AE,"px;position:absolute;");if(this.m_[0][0]!=1||this.m_[0][1]||this.m_[1][1]!=1||this.m_[1][0]){var p=[];p.push("M11=",this.m_[0][0],",","M12=",this.m_[1][0],",","M21=",this.m_[0][1],",","M22=",this.m_[1][1],",","Dx=",K(AW.x/D),",","Dy=",K(AW.y/D),"");var AS=AW;var AR=this.getCoords_(AH+AJ,AF);var AP=this.getCoords_(AH,AF+AV);var AL=this.getCoords_(AH+AJ,AF+AV);AS.x=z.max(AS.x,AR.x,AP.x,AL.x);AS.y=z.max(AS.y,AR.y,AP.y,AL.y);AU.push("padding:0 ",K(AS.x/D),"px ",K(AS.y/D),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",p.join(""),", sizingmethod='clip');")}else{AU.push("top:",K(AW.y/D),"px;left:",K(AW.x/D),"px;")}AU.push(' ">','<g_vml_:image src="',AO.src,'"',' style="width:',D*AJ,"px;"," height:",D*AV,'px"',' cropleft="',AM/AG,'"',' croptop="',AK/AT,'"',' cropright="',(AG-AM-AQ)/AG,'"',' cropbottom="',(AT-AK-AX)/AT,'"'," />","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",AU.join(""))};M.stroke=function(AM){var m=10;var AN=10;var AE=5000;var AG={x:null,y:null};var AL={x:null,y:null};for(var AH=0;AH<this.currentPath_.length;AH+=AE){var AK=[];var AF=false;AK.push("<g_vml_:shape",' filled="',!!AM,'"',' style="position:absolute;width:',m,"px;height:",AN,'px;"',' coordorigin="0,0"',' coordsize="',D*m,",",D*AN,'"',' stroked="',!AM,'"',' path="');var AO=false;for(var AI=AH;AI<Math.min(AH+AE,this.currentPath_.length);AI++){if(AI%AE==0&&AI>0){AK.push(" m ",K(this.currentPath_[AI-1].x),",",K(this.currentPath_[AI-1].y))}var Z=this.currentPath_[AI];var AJ;switch(Z.type){case"moveTo":AJ=Z;AK.push(" m ",K(Z.x),",",K(Z.y));break;case"lineTo":AK.push(" l ",K(Z.x),",",K(Z.y));break;case"close":AK.push(" x ");Z=null;break;case"bezierCurveTo":AK.push(" c ",K(Z.cp1x),",",K(Z.cp1y),",",K(Z.cp2x),",",K(Z.cp2y),",",K(Z.x),",",K(Z.y));break;case"at":case"wa":AK.push(" ",Z.type," ",K(Z.x-this.arcScaleX_*Z.radius),",",K(Z.y-this.arcScaleY_*Z.radius)," ",K(Z.x+this.arcScaleX_*Z.radius),",",K(Z.y+this.arcScaleY_*Z.radius)," ",K(Z.xStart),",",K(Z.yStart)," ",K(Z.xEnd),",",K(Z.yEnd));break}if(Z){if(AG.x==null||Z.x<AG.x){AG.x=Z.x}if(AL.x==null||Z.x>AL.x){AL.x=Z.x}if(AG.y==null||Z.y<AG.y){AG.y=Z.y}if(AL.y==null||Z.y>AL.y){AL.y=Z.y}}}AK.push(' ">');if(!AM){R(this,AK)}else{a(this,AK,AG,AL)}AK.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",AK.join(""))}};function R(j,AE){var i=Y(j.strokeStyle);var m=i.color;var p=i.alpha*j.globalAlpha;var Z=j.lineScale_*j.lineWidth;if(Z<1){p*=Z}AE.push("<g_vml_:stroke",' opacity="',p,'"',' joinstyle="',j.lineJoin,'"',' miterlimit="',j.miterLimit,'"',' endcap="',t(j.lineCap),'"',' weight="',Z,'px"',' color="',m,'" />')}function a(AO,AG,Ah,AP){var AH=AO.fillStyle;var AY=AO.arcScaleX_;var AX=AO.arcScaleY_;var Z=AP.x-Ah.x;var m=AP.y-Ah.y;if(AH instanceof v){var AL=0;var Ac={x:0,y:0};var AU=0;var AK=1;if(AH.type_=="gradient"){var AJ=AH.x0_/AY;var j=AH.y0_/AX;var AI=AH.x1_/AY;var Aj=AH.y1_/AX;var Ag=AO.getCoords_(AJ,j);var Af=AO.getCoords_(AI,Aj);var AE=Af.x-Ag.x;var p=Af.y-Ag.y;AL=Math.atan2(AE,p)*180/Math.PI;if(AL<0){AL+=360}if(AL<0.000001){AL=0}}else{var Ag=AO.getCoords_(AH.x0_,AH.y0_);Ac={x:(Ag.x-Ah.x)/Z,y:(Ag.y-Ah.y)/m};Z/=AY*D;m/=AX*D;var Aa=z.max(Z,m);AU=2*AH.r0_/Aa;AK=2*AH.r1_/Aa-AU}var AS=AH.colors_;AS.sort(function(Ak,i){return Ak.offset-i.offset});var AN=AS.length;var AR=AS[0].color;var AQ=AS[AN-1].color;var AW=AS[0].alpha*AO.globalAlpha;var AV=AS[AN-1].alpha*AO.globalAlpha;var Ab=[];for(var Ae=0;Ae<AN;Ae++){var AM=AS[Ae];Ab.push(AM.offset*AK+AU+" "+AM.color)}AG.push('<g_vml_:fill type="',AH.type_,'"',' method="none" focus="100%"',' color="',AR,'"',' color2="',AQ,'"',' colors="',Ab.join(","),'"',' opacity="',AV,'"',' g_o_:opacity2="',AW,'"',' angle="',AL,'"',' focusposition="',Ac.x,",",Ac.y,'" />')}else{if(AH instanceof u){if(Z&&m){var AF=-Ah.x;var AZ=-Ah.y;AG.push("<g_vml_:fill",' position="',AF/Z*AY*AY,",",AZ/m*AX*AX,'"',' type="tile"',' src="',AH.src_,'" />')}}else{var Ai=Y(AO.fillStyle);var AT=Ai.color;var Ad=Ai.alpha*AO.globalAlpha;AG.push('<g_vml_:fill color="',AT,'" opacity="',Ad,'" />')}}}M.fill=function(){this.stroke(true)};M.closePath=function(){this.currentPath_.push({type:"close"})};M.getCoords_=function(j,i){var Z=this.m_;return{x:D*(j*Z[0][0]+i*Z[1][0]+Z[2][0])-F,y:D*(j*Z[0][1]+i*Z[1][1]+Z[2][1])-F}};M.save=function(){var Z={};Q(this,Z);this.aStack_.push(Z);this.mStack_.push(this.m_);this.m_=d(V(),this.m_)};M.restore=function(){if(this.aStack_.length){Q(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function H(Z){return isFinite(Z[0][0])&&isFinite(Z[0][1])&&isFinite(Z[1][0])&&isFinite(Z[1][1])&&isFinite(Z[2][0])&&isFinite(Z[2][1])}function y(i,Z,j){if(!H(Z)){return }i.m_=Z;if(j){var p=Z[0][0]*Z[1][1]-Z[0][1]*Z[1][0];i.lineScale_=k(b(p))}}M.translate=function(j,i){var Z=[[1,0,0],[0,1,0],[j,i,1]];y(this,d(Z,this.m_),false)};M.rotate=function(i){var m=U(i);var j=J(i);var Z=[[m,j,0],[-j,m,0],[0,0,1]];y(this,d(Z,this.m_),false)};M.scale=function(j,i){this.arcScaleX_*=j;this.arcScaleY_*=i;var Z=[[j,0,0],[0,i,0],[0,0,1]];y(this,d(Z,this.m_),true)};M.transform=function(p,m,AF,AE,i,Z){var j=[[p,m,0],[AF,AE,0],[i,Z,1]];y(this,d(j,this.m_),true)};M.setTransform=function(AE,p,AG,AF,j,i){var Z=[[AE,p,0],[AG,AF,0],[j,i,1]];y(this,Z,true)};M.drawText_=function(AK,AI,AH,AN,AG){var AM=this.m_,AQ=1000,i=0,AP=AQ,AF={x:0,y:0},AE=[];var Z=P(X(this.font),this.element_);var j=AA(Z);var AR=this.element_.currentStyle;var p=this.textAlign.toLowerCase();switch(p){case"left":case"center":case"right":break;case"end":p=AR.direction=="ltr"?"right":"left";break;case"start":p=AR.direction=="rtl"?"right":"left";break;default:p="left"}switch(this.textBaseline){case"hanging":case"top":AF.y=Z.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":AF.y=-Z.size/2.25;break}switch(p){case"right":i=AQ;AP=0.05;break;case"center":i=AP=AQ/2;break}var AO=this.getCoords_(AI+AF.x,AH+AF.y);AE.push('<g_vml_:line from="',-i,' 0" to="',AP,' 0.05" ',' coordsize="100 100" coordorigin="0 0"',' filled="',!AG,'" stroked="',!!AG,'" style="position:absolute;width:1px;height:1px;">');if(AG){R(this,AE)}else{a(this,AE,{x:-i,y:0},{x:AP,y:Z.size})}var AL=AM[0][0].toFixed(3)+","+AM[1][0].toFixed(3)+","+AM[0][1].toFixed(3)+","+AM[1][1].toFixed(3)+",0,0";var AJ=K(AO.x/D)+","+K(AO.y/D);AE.push('<g_vml_:skew on="t" matrix="',AL,'" ',' offset="',AJ,'" origin="',i,' 0" />','<g_vml_:path textpathok="true" />','<g_vml_:textpath on="true" string="',AD(AK),'" style="v-text-align:',p,";font:",AD(j),'" /></g_vml_:line>');this.element_.insertAdjacentHTML("beforeEnd",AE.join(""))};M.fillText=function(j,Z,m,i){this.drawText_(j,Z,m,i,false)};M.strokeText=function(j,Z,m,i){this.drawText_(j,Z,m,i,true)};M.measureText=function(j){if(!this.textMeasureEl_){var Z='<span style="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;"></span>';this.element_.insertAdjacentHTML("beforeEnd",Z);this.textMeasureEl_=this.element_.lastChild}var i=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(i.createTextNode(j));return{width:this.textMeasureEl_.offsetWidth}};M.clip=function(){};M.arcTo=function(){};M.createPattern=function(i,Z){return new u(i,Z)};function v(Z){this.type_=Z;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}v.prototype.addColorStop=function(i,Z){Z=Y(Z);this.colors_.push({offset:i,color:Z.color,alpha:Z.alpha})};function u(i,Z){q(i);switch(Z){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=Z;break;default:n("SYNTAX_ERR")}this.src_=i.src;this.width_=i.width;this.height_=i.height}function n(Z){throw new o(Z)}function q(Z){if(!Z||Z.nodeType!=1||Z.tagName!="IMG"){n("TYPE_MISMATCH_ERR")}if(Z.readyState!="complete"){n("INVALID_STATE_ERR")}}function o(Z){this.code=this[Z];this.message=Z+": DOM Exception "+this.code}var x=o.prototype=new Error;x.INDEX_SIZE_ERR=1;x.DOMSTRING_SIZE_ERR=2;x.HIERARCHY_REQUEST_ERR=3;x.WRONG_DOCUMENT_ERR=4;x.INVALID_CHARACTER_ERR=5;x.NO_DATA_ALLOWED_ERR=6;x.NO_MODIFICATION_ALLOWED_ERR=7;x.NOT_FOUND_ERR=8;x.NOT_SUPPORTED_ERR=9;x.INUSE_ATTRIBUTE_ERR=10;x.INVALID_STATE_ERR=11;x.SYNTAX_ERR=12;x.INVALID_MODIFICATION_ERR=13;x.NAMESPACE_ERR=14;x.INVALID_ACCESS_ERR=15;x.VALIDATION_ERR=16;x.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=E;CanvasRenderingContext2D=W;CanvasGradient=v;CanvasPattern=u;DOMException=o})()}; \ No newline at end of file diff --git a/theme/bootstrap/js/plugins/flot/flot-data.js b/theme/bootstrap/js/plugins/flot/flot-data.js new file mode 100644 index 0000000..b6d68fc --- /dev/null +++ b/theme/bootstrap/js/plugins/flot/flot-data.js @@ -0,0 +1,1244 @@ +// Flot Charts sample data for SB Admin template + +// Flot Line Chart with Tooltips +$(document).ready(function() { + console.log("document ready"); + var offset = 0; + plot(); + + function plot() { + var sin = [], + cos = []; + for (var i = 0; i < 12; i += 0.2) { + sin.push([i, Math.sin(i + offset)]); + cos.push([i, Math.cos(i + offset)]); + } + + var options = { + series: { + lines: { + show: true + }, + points: { + show: true + } + }, + grid: { + hoverable: true //IMPORTANT! this is needed for tooltip to work + }, + yaxis: { + min: -1.2, + max: 1.2 + }, + tooltip: true, + tooltipOpts: { + content: "'%s' of %x.1 is %y.4", + shifts: { + x: -60, + y: 25 + } + } + }; + + var plotObj = $.plot($("#flot-line-chart"), [{ + data: sin, + label: "sin(x)" + }, { + data: cos, + label: "cos(x)" + }], + options); + } +}); + +// Flot Pie Chart with Tooltips +$(function() { + + var data = [{ + label: "Series 0", + data: 1 + }, { + label: "Series 1", + data: 3 + }, { + label: "Series 2", + data: 9 + }, { + label: "Series 3", + data: 20 + }]; + + var plotObj = $.plot($("#flot-pie-chart"), data, { + series: { + pie: { + show: true + } + }, + grid: { + hoverable: true + }, + tooltip: true, + tooltipOpts: { + content: "%p.0%, %s", // show percentages, rounding to 2 decimal places + shifts: { + x: 20, + y: 0 + }, + defaultTheme: false + } + }); + +}); + +// Flot Line Charts - Multiple Axes - With Data +$(function() { + var oilprices = [ + [1167692400000, 61.05], + [1167778800000, 58.32], + [1167865200000, 57.35], + [1167951600000, 56.31], + [1168210800000, 55.55], + [1168297200000, 55.64], + [1168383600000, 54.02], + [1168470000000, 51.88], + [1168556400000, 52.99], + [1168815600000, 52.99], + [1168902000000, 51.21], + [1168988400000, 52.24], + [1169074800000, 50.48], + [1169161200000, 51.99], + [1169420400000, 51.13], + [1169506800000, 55.04], + [1169593200000, 55.37], + [1169679600000, 54.23], + [1169766000000, 55.42], + [1170025200000, 54.01], + [1170111600000, 56.97], + [1170198000000, 58.14], + [1170284400000, 58.14], + [1170370800000, 59.02], + [1170630000000, 58.74], + [1170716400000, 58.88], + [1170802800000, 57.71], + [1170889200000, 59.71], + [1170975600000, 59.89], + [1171234800000, 57.81], + [1171321200000, 59.06], + [1171407600000, 58.00], + [1171494000000, 57.99], + [1171580400000, 59.39], + [1171839600000, 59.39], + [1171926000000, 58.07], + [1172012400000, 60.07], + [1172098800000, 61.14], + [1172444400000, 61.39], + [1172530800000, 61.46], + [1172617200000, 61.79], + [1172703600000, 62.00], + [1172790000000, 60.07], + [1173135600000, 60.69], + [1173222000000, 61.82], + [1173308400000, 60.05], + [1173654000000, 58.91], + [1173740400000, 57.93], + [1173826800000, 58.16], + [1173913200000, 57.55], + [1173999600000, 57.11], + [1174258800000, 56.59], + [1174345200000, 59.61], + [1174518000000, 61.69], + [1174604400000, 62.28], + [1174860000000, 62.91], + [1174946400000, 62.93], + [1175032800000, 64.03], + [1175119200000, 66.03], + [1175205600000, 65.87], + [1175464800000, 64.64], + [1175637600000, 64.38], + [1175724000000, 64.28], + [1175810400000, 64.28], + [1176069600000, 61.51], + [1176156000000, 61.89], + [1176242400000, 62.01], + [1176328800000, 63.85], + [1176415200000, 63.63], + [1176674400000, 63.61], + [1176760800000, 63.10], + [1176847200000, 63.13], + [1176933600000, 61.83], + [1177020000000, 63.38], + [1177279200000, 64.58], + [1177452000000, 65.84], + [1177538400000, 65.06], + [1177624800000, 66.46], + [1177884000000, 64.40], + [1178056800000, 63.68], + [1178143200000, 63.19], + [1178229600000, 61.93], + [1178488800000, 61.47], + [1178575200000, 61.55], + [1178748000000, 61.81], + [1178834400000, 62.37], + [1179093600000, 62.46], + [1179180000000, 63.17], + [1179266400000, 62.55], + [1179352800000, 64.94], + [1179698400000, 66.27], + [1179784800000, 65.50], + [1179871200000, 65.77], + [1179957600000, 64.18], + [1180044000000, 65.20], + [1180389600000, 63.15], + [1180476000000, 63.49], + [1180562400000, 65.08], + [1180908000000, 66.30], + [1180994400000, 65.96], + [1181167200000, 66.93], + [1181253600000, 65.98], + [1181599200000, 65.35], + [1181685600000, 66.26], + [1181858400000, 68.00], + [1182117600000, 69.09], + [1182204000000, 69.10], + [1182290400000, 68.19], + [1182376800000, 68.19], + [1182463200000, 69.14], + [1182722400000, 68.19], + [1182808800000, 67.77], + [1182895200000, 68.97], + [1182981600000, 69.57], + [1183068000000, 70.68], + [1183327200000, 71.09], + [1183413600000, 70.92], + [1183586400000, 71.81], + [1183672800000, 72.81], + [1183932000000, 72.19], + [1184018400000, 72.56], + [1184191200000, 72.50], + [1184277600000, 74.15], + [1184623200000, 75.05], + [1184796000000, 75.92], + [1184882400000, 75.57], + [1185141600000, 74.89], + [1185228000000, 73.56], + [1185314400000, 75.57], + [1185400800000, 74.95], + [1185487200000, 76.83], + [1185832800000, 78.21], + [1185919200000, 76.53], + [1186005600000, 76.86], + [1186092000000, 76.00], + [1186437600000, 71.59], + [1186696800000, 71.47], + [1186956000000, 71.62], + [1187042400000, 71.00], + [1187301600000, 71.98], + [1187560800000, 71.12], + [1187647200000, 69.47], + [1187733600000, 69.26], + [1187820000000, 69.83], + [1187906400000, 71.09], + [1188165600000, 71.73], + [1188338400000, 73.36], + [1188511200000, 74.04], + [1188856800000, 76.30], + [1189116000000, 77.49], + [1189461600000, 78.23], + [1189548000000, 79.91], + [1189634400000, 80.09], + [1189720800000, 79.10], + [1189980000000, 80.57], + [1190066400000, 81.93], + [1190239200000, 83.32], + [1190325600000, 81.62], + [1190584800000, 80.95], + [1190671200000, 79.53], + [1190757600000, 80.30], + [1190844000000, 82.88], + [1190930400000, 81.66], + [1191189600000, 80.24], + [1191276000000, 80.05], + [1191362400000, 79.94], + [1191448800000, 81.44], + [1191535200000, 81.22], + [1191794400000, 79.02], + [1191880800000, 80.26], + [1191967200000, 80.30], + [1192053600000, 83.08], + [1192140000000, 83.69], + [1192399200000, 86.13], + [1192485600000, 87.61], + [1192572000000, 87.40], + [1192658400000, 89.47], + [1192744800000, 88.60], + [1193004000000, 87.56], + [1193090400000, 87.56], + [1193176800000, 87.10], + [1193263200000, 91.86], + [1193612400000, 93.53], + [1193698800000, 94.53], + [1193871600000, 95.93], + [1194217200000, 93.98], + [1194303600000, 96.37], + [1194476400000, 95.46], + [1194562800000, 96.32], + [1195081200000, 93.43], + [1195167600000, 95.10], + [1195426800000, 94.64], + [1195513200000, 95.10], + [1196031600000, 97.70], + [1196118000000, 94.42], + [1196204400000, 90.62], + [1196290800000, 91.01], + [1196377200000, 88.71], + [1196636400000, 88.32], + [1196809200000, 90.23], + [1196982000000, 88.28], + [1197241200000, 87.86], + [1197327600000, 90.02], + [1197414000000, 92.25], + [1197586800000, 90.63], + [1197846000000, 90.63], + [1197932400000, 90.49], + [1198018800000, 91.24], + [1198105200000, 91.06], + [1198191600000, 90.49], + [1198710000000, 96.62], + [1198796400000, 96.00], + [1199142000000, 99.62], + [1199314800000, 99.18], + [1199401200000, 95.09], + [1199660400000, 96.33], + [1199833200000, 95.67], + [1200351600000, 91.90], + [1200438000000, 90.84], + [1200524400000, 90.13], + [1200610800000, 90.57], + [1200956400000, 89.21], + [1201042800000, 86.99], + [1201129200000, 89.85], + [1201474800000, 90.99], + [1201561200000, 91.64], + [1201647600000, 92.33], + [1201734000000, 91.75], + [1202079600000, 90.02], + [1202166000000, 88.41], + [1202252400000, 87.14], + [1202338800000, 88.11], + [1202425200000, 91.77], + [1202770800000, 92.78], + [1202857200000, 93.27], + [1202943600000, 95.46], + [1203030000000, 95.46], + [1203289200000, 101.74], + [1203462000000, 98.81], + [1203894000000, 100.88], + [1204066800000, 99.64], + [1204153200000, 102.59], + [1204239600000, 101.84], + [1204498800000, 99.52], + [1204585200000, 99.52], + [1204671600000, 104.52], + [1204758000000, 105.47], + [1204844400000, 105.15], + [1205103600000, 108.75], + [1205276400000, 109.92], + [1205362800000, 110.33], + [1205449200000, 110.21], + [1205708400000, 105.68], + [1205967600000, 101.84], + [1206313200000, 100.86], + [1206399600000, 101.22], + [1206486000000, 105.90], + [1206572400000, 107.58], + [1206658800000, 105.62], + [1206914400000, 101.58], + [1207000800000, 100.98], + [1207173600000, 103.83], + [1207260000000, 106.23], + [1207605600000, 108.50], + [1207778400000, 110.11], + [1207864800000, 110.14], + [1208210400000, 113.79], + [1208296800000, 114.93], + [1208383200000, 114.86], + [1208728800000, 117.48], + [1208815200000, 118.30], + [1208988000000, 116.06], + [1209074400000, 118.52], + [1209333600000, 118.75], + [1209420000000, 113.46], + [1209592800000, 112.52], + [1210024800000, 121.84], + [1210111200000, 123.53], + [1210197600000, 123.69], + [1210543200000, 124.23], + [1210629600000, 125.80], + [1210716000000, 126.29], + [1211148000000, 127.05], + [1211320800000, 129.07], + [1211493600000, 132.19], + [1211839200000, 128.85], + [1212357600000, 127.76], + [1212703200000, 138.54], + [1212962400000, 136.80], + [1213135200000, 136.38], + [1213308000000, 134.86], + [1213653600000, 134.01], + [1213740000000, 136.68], + [1213912800000, 135.65], + [1214172000000, 134.62], + [1214258400000, 134.62], + [1214344800000, 134.62], + [1214431200000, 139.64], + [1214517600000, 140.21], + [1214776800000, 140.00], + [1214863200000, 140.97], + [1214949600000, 143.57], + [1215036000000, 145.29], + [1215381600000, 141.37], + [1215468000000, 136.04], + [1215727200000, 146.40], + [1215986400000, 145.18], + [1216072800000, 138.74], + [1216159200000, 134.60], + [1216245600000, 129.29], + [1216332000000, 130.65], + [1216677600000, 127.95], + [1216850400000, 127.95], + [1217282400000, 122.19], + [1217455200000, 124.08], + [1217541600000, 125.10], + [1217800800000, 121.41], + [1217887200000, 119.17], + [1217973600000, 118.58], + [1218060000000, 120.02], + [1218405600000, 114.45], + [1218492000000, 113.01], + [1218578400000, 116.00], + [1218751200000, 113.77], + [1219010400000, 112.87], + [1219096800000, 114.53], + [1219269600000, 114.98], + [1219356000000, 114.98], + [1219701600000, 116.27], + [1219788000000, 118.15], + [1219874400000, 115.59], + [1219960800000, 115.46], + [1220306400000, 109.71], + [1220392800000, 109.35], + [1220565600000, 106.23], + [1220824800000, 106.34] + ]; + var exchangerates = [ + [1167606000000, 0.7580], + [1167692400000, 0.7580], + [1167778800000, 0.75470], + [1167865200000, 0.75490], + [1167951600000, 0.76130], + [1168038000000, 0.76550], + [1168124400000, 0.76930], + [1168210800000, 0.76940], + [1168297200000, 0.76880], + [1168383600000, 0.76780], + [1168470000000, 0.77080], + [1168556400000, 0.77270], + [1168642800000, 0.77490], + [1168729200000, 0.77410], + [1168815600000, 0.77410], + [1168902000000, 0.77320], + [1168988400000, 0.77270], + [1169074800000, 0.77370], + [1169161200000, 0.77240], + [1169247600000, 0.77120], + [1169334000000, 0.7720], + [1169420400000, 0.77210], + [1169506800000, 0.77170], + [1169593200000, 0.77040], + [1169679600000, 0.7690], + [1169766000000, 0.77110], + [1169852400000, 0.7740], + [1169938800000, 0.77450], + [1170025200000, 0.77450], + [1170111600000, 0.7740], + [1170198000000, 0.77160], + [1170284400000, 0.77130], + [1170370800000, 0.76780], + [1170457200000, 0.76880], + [1170543600000, 0.77180], + [1170630000000, 0.77180], + [1170716400000, 0.77280], + [1170802800000, 0.77290], + [1170889200000, 0.76980], + [1170975600000, 0.76850], + [1171062000000, 0.76810], + [1171148400000, 0.7690], + [1171234800000, 0.7690], + [1171321200000, 0.76980], + [1171407600000, 0.76990], + [1171494000000, 0.76510], + [1171580400000, 0.76130], + [1171666800000, 0.76160], + [1171753200000, 0.76140], + [1171839600000, 0.76140], + [1171926000000, 0.76070], + [1172012400000, 0.76020], + [1172098800000, 0.76110], + [1172185200000, 0.76220], + [1172271600000, 0.76150], + [1172358000000, 0.75980], + [1172444400000, 0.75980], + [1172530800000, 0.75920], + [1172617200000, 0.75730], + [1172703600000, 0.75660], + [1172790000000, 0.75670], + [1172876400000, 0.75910], + [1172962800000, 0.75820], + [1173049200000, 0.75850], + [1173135600000, 0.76130], + [1173222000000, 0.76310], + [1173308400000, 0.76150], + [1173394800000, 0.760], + [1173481200000, 0.76130], + [1173567600000, 0.76270], + [1173654000000, 0.76270], + [1173740400000, 0.76080], + [1173826800000, 0.75830], + [1173913200000, 0.75750], + [1173999600000, 0.75620], + [1174086000000, 0.7520], + [1174172400000, 0.75120], + [1174258800000, 0.75120], + [1174345200000, 0.75170], + [1174431600000, 0.7520], + [1174518000000, 0.75110], + [1174604400000, 0.7480], + [1174690800000, 0.75090], + [1174777200000, 0.75310], + [1174860000000, 0.75310], + [1174946400000, 0.75270], + [1175032800000, 0.74980], + [1175119200000, 0.74930], + [1175205600000, 0.75040], + [1175292000000, 0.750], + [1175378400000, 0.74910], + [1175464800000, 0.74910], + [1175551200000, 0.74850], + [1175637600000, 0.74840], + [1175724000000, 0.74920], + [1175810400000, 0.74710], + [1175896800000, 0.74590], + [1175983200000, 0.74770], + [1176069600000, 0.74770], + [1176156000000, 0.74830], + [1176242400000, 0.74580], + [1176328800000, 0.74480], + [1176415200000, 0.7430], + [1176501600000, 0.73990], + [1176588000000, 0.73950], + [1176674400000, 0.73950], + [1176760800000, 0.73780], + [1176847200000, 0.73820], + [1176933600000, 0.73620], + [1177020000000, 0.73550], + [1177106400000, 0.73480], + [1177192800000, 0.73610], + [1177279200000, 0.73610], + [1177365600000, 0.73650], + [1177452000000, 0.73620], + [1177538400000, 0.73310], + [1177624800000, 0.73390], + [1177711200000, 0.73440], + [1177797600000, 0.73270], + [1177884000000, 0.73270], + [1177970400000, 0.73360], + [1178056800000, 0.73330], + [1178143200000, 0.73590], + [1178229600000, 0.73590], + [1178316000000, 0.73720], + [1178402400000, 0.7360], + [1178488800000, 0.7360], + [1178575200000, 0.7350], + [1178661600000, 0.73650], + [1178748000000, 0.73840], + [1178834400000, 0.73950], + [1178920800000, 0.74130], + [1179007200000, 0.73970], + [1179093600000, 0.73960], + [1179180000000, 0.73850], + [1179266400000, 0.73780], + [1179352800000, 0.73660], + [1179439200000, 0.740], + [1179525600000, 0.74110], + [1179612000000, 0.74060], + [1179698400000, 0.74050], + [1179784800000, 0.74140], + [1179871200000, 0.74310], + [1179957600000, 0.74310], + [1180044000000, 0.74380], + [1180130400000, 0.74430], + [1180216800000, 0.74430], + [1180303200000, 0.74430], + [1180389600000, 0.74340], + [1180476000000, 0.74290], + [1180562400000, 0.74420], + [1180648800000, 0.7440], + [1180735200000, 0.74390], + [1180821600000, 0.74370], + [1180908000000, 0.74370], + [1180994400000, 0.74290], + [1181080800000, 0.74030], + [1181167200000, 0.73990], + [1181253600000, 0.74180], + [1181340000000, 0.74680], + [1181426400000, 0.7480], + [1181512800000, 0.7480], + [1181599200000, 0.7490], + [1181685600000, 0.74940], + [1181772000000, 0.75220], + [1181858400000, 0.75150], + [1181944800000, 0.75020], + [1182031200000, 0.74720], + [1182117600000, 0.74720], + [1182204000000, 0.74620], + [1182290400000, 0.74550], + [1182376800000, 0.74490], + [1182463200000, 0.74670], + [1182549600000, 0.74580], + [1182636000000, 0.74270], + [1182722400000, 0.74270], + [1182808800000, 0.7430], + [1182895200000, 0.74290], + [1182981600000, 0.7440], + [1183068000000, 0.7430], + [1183154400000, 0.74220], + [1183240800000, 0.73880], + [1183327200000, 0.73880], + [1183413600000, 0.73690], + [1183500000000, 0.73450], + [1183586400000, 0.73450], + [1183672800000, 0.73450], + [1183759200000, 0.73520], + [1183845600000, 0.73410], + [1183932000000, 0.73410], + [1184018400000, 0.7340], + [1184104800000, 0.73240], + [1184191200000, 0.72720], + [1184277600000, 0.72640], + [1184364000000, 0.72550], + [1184450400000, 0.72580], + [1184536800000, 0.72580], + [1184623200000, 0.72560], + [1184709600000, 0.72570], + [1184796000000, 0.72470], + [1184882400000, 0.72430], + [1184968800000, 0.72440], + [1185055200000, 0.72350], + [1185141600000, 0.72350], + [1185228000000, 0.72350], + [1185314400000, 0.72350], + [1185400800000, 0.72620], + [1185487200000, 0.72880], + [1185573600000, 0.73010], + [1185660000000, 0.73370], + [1185746400000, 0.73370], + [1185832800000, 0.73240], + [1185919200000, 0.72970], + [1186005600000, 0.73170], + [1186092000000, 0.73150], + [1186178400000, 0.72880], + [1186264800000, 0.72630], + [1186351200000, 0.72630], + [1186437600000, 0.72420], + [1186524000000, 0.72530], + [1186610400000, 0.72640], + [1186696800000, 0.7270], + [1186783200000, 0.73120], + [1186869600000, 0.73050], + [1186956000000, 0.73050], + [1187042400000, 0.73180], + [1187128800000, 0.73580], + [1187215200000, 0.74090], + [1187301600000, 0.74540], + [1187388000000, 0.74370], + [1187474400000, 0.74240], + [1187560800000, 0.74240], + [1187647200000, 0.74150], + [1187733600000, 0.74190], + [1187820000000, 0.74140], + [1187906400000, 0.73770], + [1187992800000, 0.73550], + [1188079200000, 0.73150], + [1188165600000, 0.73150], + [1188252000000, 0.7320], + [1188338400000, 0.73320], + [1188424800000, 0.73460], + [1188511200000, 0.73280], + [1188597600000, 0.73230], + [1188684000000, 0.7340], + [1188770400000, 0.7340], + [1188856800000, 0.73360], + [1188943200000, 0.73510], + [1189029600000, 0.73460], + [1189116000000, 0.73210], + [1189202400000, 0.72940], + [1189288800000, 0.72660], + [1189375200000, 0.72660], + [1189461600000, 0.72540], + [1189548000000, 0.72420], + [1189634400000, 0.72130], + [1189720800000, 0.71970], + [1189807200000, 0.72090], + [1189893600000, 0.7210], + [1189980000000, 0.7210], + [1190066400000, 0.7210], + [1190152800000, 0.72090], + [1190239200000, 0.71590], + [1190325600000, 0.71330], + [1190412000000, 0.71050], + [1190498400000, 0.70990], + [1190584800000, 0.70990], + [1190671200000, 0.70930], + [1190757600000, 0.70930], + [1190844000000, 0.70760], + [1190930400000, 0.7070], + [1191016800000, 0.70490], + [1191103200000, 0.70120], + [1191189600000, 0.70110], + [1191276000000, 0.70190], + [1191362400000, 0.70460], + [1191448800000, 0.70630], + [1191535200000, 0.70890], + [1191621600000, 0.70770], + [1191708000000, 0.70770], + [1191794400000, 0.70770], + [1191880800000, 0.70910], + [1191967200000, 0.71180], + [1192053600000, 0.70790], + [1192140000000, 0.70530], + [1192226400000, 0.7050], + [1192312800000, 0.70550], + [1192399200000, 0.70550], + [1192485600000, 0.70450], + [1192572000000, 0.70510], + [1192658400000, 0.70510], + [1192744800000, 0.70170], + [1192831200000, 0.70], + [1192917600000, 0.69950], + [1193004000000, 0.69940], + [1193090400000, 0.70140], + [1193176800000, 0.70360], + [1193263200000, 0.70210], + [1193349600000, 0.70020], + [1193436000000, 0.69670], + [1193522400000, 0.6950], + [1193612400000, 0.6950], + [1193698800000, 0.69390], + [1193785200000, 0.6940], + [1193871600000, 0.69220], + [1193958000000, 0.69190], + [1194044400000, 0.69140], + [1194130800000, 0.68940], + [1194217200000, 0.68910], + [1194303600000, 0.69040], + [1194390000000, 0.6890], + [1194476400000, 0.68340], + [1194562800000, 0.68230], + [1194649200000, 0.68070], + [1194735600000, 0.68150], + [1194822000000, 0.68150], + [1194908400000, 0.68470], + [1194994800000, 0.68590], + [1195081200000, 0.68220], + [1195167600000, 0.68270], + [1195254000000, 0.68370], + [1195340400000, 0.68230], + [1195426800000, 0.68220], + [1195513200000, 0.68220], + [1195599600000, 0.67920], + [1195686000000, 0.67460], + [1195772400000, 0.67350], + [1195858800000, 0.67310], + [1195945200000, 0.67420], + [1196031600000, 0.67440], + [1196118000000, 0.67390], + [1196204400000, 0.67310], + [1196290800000, 0.67610], + [1196377200000, 0.67610], + [1196463600000, 0.67850], + [1196550000000, 0.68180], + [1196636400000, 0.68360], + [1196722800000, 0.68230], + [1196809200000, 0.68050], + [1196895600000, 0.67930], + [1196982000000, 0.68490], + [1197068400000, 0.68330], + [1197154800000, 0.68250], + [1197241200000, 0.68250], + [1197327600000, 0.68160], + [1197414000000, 0.67990], + [1197500400000, 0.68130], + [1197586800000, 0.68090], + [1197673200000, 0.68680], + [1197759600000, 0.69330], + [1197846000000, 0.69330], + [1197932400000, 0.69450], + [1198018800000, 0.69440], + [1198105200000, 0.69460], + [1198191600000, 0.69640], + [1198278000000, 0.69650], + [1198364400000, 0.69560], + [1198450800000, 0.69560], + [1198537200000, 0.6950], + [1198623600000, 0.69480], + [1198710000000, 0.69280], + [1198796400000, 0.68870], + [1198882800000, 0.68240], + [1198969200000, 0.67940], + [1199055600000, 0.67940], + [1199142000000, 0.68030], + [1199228400000, 0.68550], + [1199314800000, 0.68240], + [1199401200000, 0.67910], + [1199487600000, 0.67830], + [1199574000000, 0.67850], + [1199660400000, 0.67850], + [1199746800000, 0.67970], + [1199833200000, 0.680], + [1199919600000, 0.68030], + [1200006000000, 0.68050], + [1200092400000, 0.6760], + [1200178800000, 0.6770], + [1200265200000, 0.6770], + [1200351600000, 0.67360], + [1200438000000, 0.67260], + [1200524400000, 0.67640], + [1200610800000, 0.68210], + [1200697200000, 0.68310], + [1200783600000, 0.68420], + [1200870000000, 0.68420], + [1200956400000, 0.68870], + [1201042800000, 0.69030], + [1201129200000, 0.68480], + [1201215600000, 0.68240], + [1201302000000, 0.67880], + [1201388400000, 0.68140], + [1201474800000, 0.68140], + [1201561200000, 0.67970], + [1201647600000, 0.67690], + [1201734000000, 0.67650], + [1201820400000, 0.67330], + [1201906800000, 0.67290], + [1201993200000, 0.67580], + [1202079600000, 0.67580], + [1202166000000, 0.6750], + [1202252400000, 0.6780], + [1202338800000, 0.68330], + [1202425200000, 0.68560], + [1202511600000, 0.69030], + [1202598000000, 0.68960], + [1202684400000, 0.68960], + [1202770800000, 0.68820], + [1202857200000, 0.68790], + [1202943600000, 0.68620], + [1203030000000, 0.68520], + [1203116400000, 0.68230], + [1203202800000, 0.68130], + [1203289200000, 0.68130], + [1203375600000, 0.68220], + [1203462000000, 0.68020], + [1203548400000, 0.68020], + [1203634800000, 0.67840], + [1203721200000, 0.67480], + [1203807600000, 0.67470], + [1203894000000, 0.67470], + [1203980400000, 0.67480], + [1204066800000, 0.67330], + [1204153200000, 0.6650], + [1204239600000, 0.66110], + [1204326000000, 0.65830], + [1204412400000, 0.6590], + [1204498800000, 0.6590], + [1204585200000, 0.65810], + [1204671600000, 0.65780], + [1204758000000, 0.65740], + [1204844400000, 0.65320], + [1204930800000, 0.65020], + [1205017200000, 0.65140], + [1205103600000, 0.65140], + [1205190000000, 0.65070], + [1205276400000, 0.6510], + [1205362800000, 0.64890], + [1205449200000, 0.64240], + [1205535600000, 0.64060], + [1205622000000, 0.63820], + [1205708400000, 0.63820], + [1205794800000, 0.63410], + [1205881200000, 0.63440], + [1205967600000, 0.63780], + [1206054000000, 0.64390], + [1206140400000, 0.64780], + [1206226800000, 0.64810], + [1206313200000, 0.64810], + [1206399600000, 0.64940], + [1206486000000, 0.64380], + [1206572400000, 0.63770], + [1206658800000, 0.63290], + [1206745200000, 0.63360], + [1206831600000, 0.63330], + [1206914400000, 0.63330], + [1207000800000, 0.6330], + [1207087200000, 0.63710], + [1207173600000, 0.64030], + [1207260000000, 0.63960], + [1207346400000, 0.63640], + [1207432800000, 0.63560], + [1207519200000, 0.63560], + [1207605600000, 0.63680], + [1207692000000, 0.63570], + [1207778400000, 0.63540], + [1207864800000, 0.6320], + [1207951200000, 0.63320], + [1208037600000, 0.63280], + [1208124000000, 0.63310], + [1208210400000, 0.63420], + [1208296800000, 0.63210], + [1208383200000, 0.63020], + [1208469600000, 0.62780], + [1208556000000, 0.63080], + [1208642400000, 0.63240], + [1208728800000, 0.63240], + [1208815200000, 0.63070], + [1208901600000, 0.62770], + [1208988000000, 0.62690], + [1209074400000, 0.63350], + [1209160800000, 0.63920], + [1209247200000, 0.640], + [1209333600000, 0.64010], + [1209420000000, 0.63960], + [1209506400000, 0.64070], + [1209592800000, 0.64230], + [1209679200000, 0.64290], + [1209765600000, 0.64720], + [1209852000000, 0.64850], + [1209938400000, 0.64860], + [1210024800000, 0.64670], + [1210111200000, 0.64440], + [1210197600000, 0.64670], + [1210284000000, 0.65090], + [1210370400000, 0.64780], + [1210456800000, 0.64610], + [1210543200000, 0.64610], + [1210629600000, 0.64680], + [1210716000000, 0.64490], + [1210802400000, 0.6470], + [1210888800000, 0.64610], + [1210975200000, 0.64520], + [1211061600000, 0.64220], + [1211148000000, 0.64220], + [1211234400000, 0.64250], + [1211320800000, 0.64140], + [1211407200000, 0.63660], + [1211493600000, 0.63460], + [1211580000000, 0.6350], + [1211666400000, 0.63460], + [1211752800000, 0.63460], + [1211839200000, 0.63430], + [1211925600000, 0.63460], + [1212012000000, 0.63790], + [1212098400000, 0.64160], + [1212184800000, 0.64420], + [1212271200000, 0.64310], + [1212357600000, 0.64310], + [1212444000000, 0.64350], + [1212530400000, 0.6440], + [1212616800000, 0.64730], + [1212703200000, 0.64690], + [1212789600000, 0.63860], + [1212876000000, 0.63560], + [1212962400000, 0.6340], + [1213048800000, 0.63460], + [1213135200000, 0.6430], + [1213221600000, 0.64520], + [1213308000000, 0.64670], + [1213394400000, 0.65060], + [1213480800000, 0.65040], + [1213567200000, 0.65030], + [1213653600000, 0.64810], + [1213740000000, 0.64510], + [1213826400000, 0.6450], + [1213912800000, 0.64410], + [1213999200000, 0.64140], + [1214085600000, 0.64090], + [1214172000000, 0.64090], + [1214258400000, 0.64280], + [1214344800000, 0.64310], + [1214431200000, 0.64180], + [1214517600000, 0.63710], + [1214604000000, 0.63490], + [1214690400000, 0.63330], + [1214776800000, 0.63340], + [1214863200000, 0.63380], + [1214949600000, 0.63420], + [1215036000000, 0.6320], + [1215122400000, 0.63180], + [1215208800000, 0.6370], + [1215295200000, 0.63680], + [1215381600000, 0.63680], + [1215468000000, 0.63830], + [1215554400000, 0.63710], + [1215640800000, 0.63710], + [1215727200000, 0.63550], + [1215813600000, 0.6320], + [1215900000000, 0.62770], + [1215986400000, 0.62760], + [1216072800000, 0.62910], + [1216159200000, 0.62740], + [1216245600000, 0.62930], + [1216332000000, 0.63110], + [1216418400000, 0.6310], + [1216504800000, 0.63120], + [1216591200000, 0.63120], + [1216677600000, 0.63040], + [1216764000000, 0.62940], + [1216850400000, 0.63480], + [1216936800000, 0.63780], + [1217023200000, 0.63680], + [1217109600000, 0.63680], + [1217196000000, 0.63680], + [1217282400000, 0.6360], + [1217368800000, 0.6370], + [1217455200000, 0.64180], + [1217541600000, 0.64110], + [1217628000000, 0.64350], + [1217714400000, 0.64270], + [1217800800000, 0.64270], + [1217887200000, 0.64190], + [1217973600000, 0.64460], + [1218060000000, 0.64680], + [1218146400000, 0.64870], + [1218232800000, 0.65940], + [1218319200000, 0.66660], + [1218405600000, 0.66660], + [1218492000000, 0.66780], + [1218578400000, 0.67120], + [1218664800000, 0.67050], + [1218751200000, 0.67180], + [1218837600000, 0.67840], + [1218924000000, 0.68110], + [1219010400000, 0.68110], + [1219096800000, 0.67940], + [1219183200000, 0.68040], + [1219269600000, 0.67810], + [1219356000000, 0.67560], + [1219442400000, 0.67350], + [1219528800000, 0.67630], + [1219615200000, 0.67620], + [1219701600000, 0.67770], + [1219788000000, 0.68150], + [1219874400000, 0.68020], + [1219960800000, 0.6780], + [1220047200000, 0.67960], + [1220133600000, 0.68170], + [1220220000000, 0.68170], + [1220306400000, 0.68320], + [1220392800000, 0.68770], + [1220479200000, 0.69120], + [1220565600000, 0.69140], + [1220652000000, 0.70090], + [1220738400000, 0.70120], + [1220824800000, 0.7010], + [1220911200000, 0.70050] + ]; + + function euroFormatter(v, axis) { + return v.toFixed(axis.tickDecimals) + "€"; + } + + function doPlot(position) { + $.plot($("#flot-multiple-axes-chart"), [{ + data: oilprices, + label: "Oil price ($)" + }, { + data: exchangerates, + label: "USD/EUR exchange rate", + yaxis: 2 + }], { + xaxes: [{ + mode: 'time' + }], + yaxes: [{ + min: 0 + }, { + // align if we are to the right + alignTicksWithAxis: position == "right" ? 1 : null, + position: position, + tickFormatter: euroFormatter + }], + legend: { + position: 'sw' + }, + grid: { + hoverable: true //IMPORTANT! this is needed for tooltip to work + }, + tooltip: true, + tooltipOpts: { + content: "%s for %x was %y", + xDateFormat: "%y-%0m-%0d", + + onHover: function(flotItem, $tooltipEl) { + // console.log(flotItem, $tooltipEl); + } + } + + }); + } + + doPlot("right"); + + $("button").click(function() { + doPlot($(this).text()); + }); +}); + +// Flot Chart Dynamic Chart + +$(function() { + + var container = $("#flot-moving-line-chart"); + + // Determine how many data points to keep based on the placeholder's initial size; + // this gives us a nice high-res plot while avoiding more than one point per pixel. + + var maximum = container.outerWidth() / 2 || 300; + + // + + var data = []; + + function getRandomData() { + + if (data.length) { + data = data.slice(1); + } + + while (data.length < maximum) { + var previous = data.length ? data[data.length - 1] : 50; + var y = previous + Math.random() * 10 - 5; + data.push(y < 0 ? 0 : y > 100 ? 100 : y); + } + + // zip the generated y values with the x values + + var res = []; + for (var i = 0; i < data.length; ++i) { + res.push([i, data[i]]) + } + + return res; + } + + // + + series = [{ + data: getRandomData(), + lines: { + fill: true + } + }]; + + // + + var plot = $.plot(container, series, { + grid: { + borderWidth: 1, + minBorderMargin: 20, + labelMargin: 10, + backgroundColor: { + colors: ["#fff", "#e4f4f4"] + }, + margin: { + top: 8, + bottom: 20, + left: 20 + }, + markings: function(axes) { + var markings = []; + var xaxis = axes.xaxis; + for (var x = Math.floor(xaxis.min); x < xaxis.max; x += xaxis.tickSize * 2) { + markings.push({ + xaxis: { + from: x, + to: x + xaxis.tickSize + }, + color: "rgba(232, 232, 255, 0.2)" + }); + } + return markings; + } + }, + xaxis: { + tickFormatter: function() { + return ""; + } + }, + yaxis: { + min: 0, + max: 110 + }, + legend: { + show: true + } + }); + + // Update the random dataset at 25FPS for a smoothly-animating chart + + setInterval(function updateRandom() { + series[0].data = getRandomData(); + plot.setData(series); + plot.draw(); + }, 40); + +}); + +// Flot Chart Bar Graph + +$(function() { + + var barOptions = { + series: { + bars: { + show: true, + barWidth: 43200000 + } + }, + xaxis: { + mode: "time", + timeformat: "%m/%d", + minTickSize: [1, "day"] + }, + grid: { + hoverable: true + }, + legend: { + show: false + }, + tooltip: true, + tooltipOpts: { + content: "x: %x, y: %y" + } + }; + var barData = { + label: "bar", + data: [ + [1354521600000, 1000], + [1355040000000, 2000], + [1355223600000, 3000], + [1355306400000, 4000], + [1355487300000, 5000], + [1355571900000, 6000] + ] + }; + $.plot($("#flot-bar-chart"), [barData], barOptions); + +}); diff --git a/theme/bootstrap/js/plugins/flot/jquery.flot.js b/theme/bootstrap/js/plugins/flot/jquery.flot.js new file mode 100644 index 0000000..aabc544 --- /dev/null +++ b/theme/bootstrap/js/plugins/flot/jquery.flot.js @@ -0,0 +1,2599 @@ +/*! Javascript plotting library for jQuery, v. 0.7. + * + * Released under the MIT license by IOLA, December 2007. + * + */ + +// first an inline dependency, jquery.colorhelpers.js, we inline it here +// for convenience + +/* Plugin for jQuery for working with colors. + * + * Version 1.1. + * + * Inspiration from jQuery color animation plugin by John Resig. + * + * Released under the MIT license by Ole Laursen, October 2009. + * + * Examples: + * + * $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString() + * var c = $.color.extract($("#mydiv"), 'background-color'); + * console.log(c.r, c.g, c.b, c.a); + * $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)" + * + * Note that .scale() and .add() return the same modified object + * instead of making a new one. + * + * V. 1.1: Fix error handling so e.g. parsing an empty string does + * produce a color rather than just crashing. + */ +(function(B){B.color={};B.color.make=function(F,E,C,D){var G={};G.r=F||0;G.g=E||0;G.b=C||0;G.a=D!=null?D:1;G.add=function(J,I){for(var H=0;H<J.length;++H){G[J.charAt(H)]+=I}return G.normalize()};G.scale=function(J,I){for(var H=0;H<J.length;++H){G[J.charAt(H)]*=I}return G.normalize()};G.toString=function(){if(G.a>=1){return"rgb("+[G.r,G.g,G.b].join(",")+")"}else{return"rgba("+[G.r,G.g,G.b,G.a].join(",")+")"}};G.normalize=function(){function H(J,K,I){return K<J?J:(K>I?I:K)}G.r=H(0,parseInt(G.r),255);G.g=H(0,parseInt(G.g),255);G.b=H(0,parseInt(G.b),255);G.a=H(0,G.a,1);return G};G.clone=function(){return B.color.make(G.r,G.b,G.g,G.a)};return G.normalize()};B.color.extract=function(D,C){var E;do{E=D.css(C).toLowerCase();if(E!=""&&E!="transparent"){break}D=D.parent()}while(!B.nodeName(D.get(0),"body"));if(E=="rgba(0, 0, 0, 0)"){E="transparent"}return B.color.parse(E)};B.color.parse=function(F){var E,C=B.color.make;if(E=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10))}if(E=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10),parseFloat(E[4]))}if(E=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55)}if(E=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55,parseFloat(E[4]))}if(E=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(F)){return C(parseInt(E[1],16),parseInt(E[2],16),parseInt(E[3],16))}if(E=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(F)){return C(parseInt(E[1]+E[1],16),parseInt(E[2]+E[2],16),parseInt(E[3]+E[3],16))}var D=B.trim(F).toLowerCase();if(D=="transparent"){return C(255,255,255,0)}else{E=A[D]||[0,0,0];return C(E[0],E[1],E[2])}};var A={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery); + +// the actual Flot code +(function($) { + function Plot(placeholder, data_, options_, plugins) { + // data is on the form: + // [ series1, series2 ... ] + // where series is either just the data as [ [x1, y1], [x2, y2], ... ] + // or { data: [ [x1, y1], [x2, y2], ... ], label: "some label", ... } + + var series = [], + options = { + // the color theme used for graphs + colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"], + legend: { + show: true, + noColumns: 1, // number of colums in legend table + labelFormatter: null, // fn: string -> string + labelBoxBorderColor: "#ccc", // border color for the little label boxes + container: null, // container (as jQuery object) to put legend in, null means default on top of graph + position: "ne", // position of default legend container within plot + margin: 5, // distance from grid edge to default legend container within plot + backgroundColor: null, // null means auto-detect + backgroundOpacity: 0.85 // set to 0 to avoid background + }, + xaxis: { + show: null, // null = auto-detect, true = always, false = never + position: "bottom", // or "top" + mode: null, // null or "time" + color: null, // base color, labels, ticks + tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)" + transform: null, // null or f: number -> number to transform axis + inverseTransform: null, // if transform is set, this should be the inverse function + min: null, // min. value to show, null means set automatically + max: null, // max. value to show, null means set automatically + autoscaleMargin: null, // margin in % to add if auto-setting min/max + ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks + tickFormatter: null, // fn: number -> string + labelWidth: null, // size of tick labels in pixels + labelHeight: null, + reserveSpace: null, // whether to reserve space even if axis isn't shown + tickLength: null, // size in pixels of ticks, or "full" for whole line + alignTicksWithAxis: null, // axis number or null for no sync + + // mode specific options + tickDecimals: null, // no. of decimals, null means auto + tickSize: null, // number or [number, "unit"] + minTickSize: null, // number or [number, "unit"] + monthNames: null, // list of names of months + timeformat: null, // format string to use + twelveHourClock: false // 12 or 24 time in time mode + }, + yaxis: { + autoscaleMargin: 0.02, + position: "left" // or "right" + }, + xaxes: [], + yaxes: [], + series: { + points: { + show: false, + radius: 3, + lineWidth: 2, // in pixels + fill: true, + fillColor: "#ffffff", + symbol: "circle" // or callback + }, + lines: { + // we don't put in show: false so we can see + // whether lines were actively disabled + lineWidth: 2, // in pixels + fill: false, + fillColor: null, + steps: false + }, + bars: { + show: false, + lineWidth: 2, // in pixels + barWidth: 1, // in units of the x axis + fill: true, + fillColor: null, + align: "left", // or "center" + horizontal: false + }, + shadowSize: 3 + }, + grid: { + show: true, + aboveData: false, + color: "#545454", // primary color used for outline and labels + backgroundColor: null, // null for transparent, else color + borderColor: null, // set if different from the grid color + tickColor: null, // color for the ticks, e.g. "rgba(0,0,0,0.15)" + labelMargin: 5, // in pixels + axisMargin: 8, // in pixels + borderWidth: 2, // in pixels + minBorderMargin: null, // in pixels, null means taken from points radius + markings: null, // array of ranges or fn: axes -> array of ranges + markingsColor: "#f4f4f4", + markingsLineWidth: 2, + // interactive stuff + clickable: false, + hoverable: false, + autoHighlight: true, // highlight in case mouse is near + mouseActiveRadius: 10 // how far the mouse can be away to activate an item + }, + hooks: {} + }, + canvas = null, // the canvas for the plot itself + overlay = null, // canvas for interactive stuff on top of plot + eventHolder = null, // jQuery object that events should be bound to + ctx = null, octx = null, + xaxes = [], yaxes = [], + plotOffset = { left: 0, right: 0, top: 0, bottom: 0}, + canvasWidth = 0, canvasHeight = 0, + plotWidth = 0, plotHeight = 0, + hooks = { + processOptions: [], + processRawData: [], + processDatapoints: [], + drawSeries: [], + draw: [], + bindEvents: [], + drawOverlay: [], + shutdown: [] + }, + plot = this; + + // public functions + plot.setData = setData; + plot.setupGrid = setupGrid; + plot.draw = draw; + plot.getPlaceholder = function() { return placeholder; }; + plot.getCanvas = function() { return canvas; }; + plot.getPlotOffset = function() { return plotOffset; }; + plot.width = function () { return plotWidth; }; + plot.height = function () { return plotHeight; }; + plot.offset = function () { + var o = eventHolder.offset(); + o.left += plotOffset.left; + o.top += plotOffset.top; + return o; + }; + plot.getData = function () { return series; }; + plot.getAxes = function () { + var res = {}, i; + $.each(xaxes.concat(yaxes), function (_, axis) { + if (axis) + res[axis.direction + (axis.n != 1 ? axis.n : "") + "axis"] = axis; + }); + return res; + }; + plot.getXAxes = function () { return xaxes; }; + plot.getYAxes = function () { return yaxes; }; + plot.c2p = canvasToAxisCoords; + plot.p2c = axisToCanvasCoords; + plot.getOptions = function () { return options; }; + plot.highlight = highlight; + plot.unhighlight = unhighlight; + plot.triggerRedrawOverlay = triggerRedrawOverlay; + plot.pointOffset = function(point) { + return { + left: parseInt(xaxes[axisNumber(point, "x") - 1].p2c(+point.x) + plotOffset.left), + top: parseInt(yaxes[axisNumber(point, "y") - 1].p2c(+point.y) + plotOffset.top) + }; + }; + plot.shutdown = shutdown; + plot.resize = function () { + getCanvasDimensions(); + resizeCanvas(canvas); + resizeCanvas(overlay); + }; + + // public attributes + plot.hooks = hooks; + + // initialize + initPlugins(plot); + parseOptions(options_); + setupCanvases(); + setData(data_); + setupGrid(); + draw(); + bindEvents(); + + + function executeHooks(hook, args) { + args = [plot].concat(args); + for (var i = 0; i < hook.length; ++i) + hook[i].apply(this, args); + } + + function initPlugins() { + for (var i = 0; i < plugins.length; ++i) { + var p = plugins[i]; + p.init(plot); + if (p.options) + $.extend(true, options, p.options); + } + } + + function parseOptions(opts) { + var i; + + $.extend(true, options, opts); + + if (options.xaxis.color == null) + options.xaxis.color = options.grid.color; + if (options.yaxis.color == null) + options.yaxis.color = options.grid.color; + + if (options.xaxis.tickColor == null) // backwards-compatibility + options.xaxis.tickColor = options.grid.tickColor; + if (options.yaxis.tickColor == null) // backwards-compatibility + options.yaxis.tickColor = options.grid.tickColor; + + if (options.grid.borderColor == null) + options.grid.borderColor = options.grid.color; + if (options.grid.tickColor == null) + options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString(); + + // fill in defaults in axes, copy at least always the + // first as the rest of the code assumes it'll be there + for (i = 0; i < Math.max(1, options.xaxes.length); ++i) + options.xaxes[i] = $.extend(true, {}, options.xaxis, options.xaxes[i]); + for (i = 0; i < Math.max(1, options.yaxes.length); ++i) + options.yaxes[i] = $.extend(true, {}, options.yaxis, options.yaxes[i]); + + // backwards compatibility, to be removed in future + if (options.xaxis.noTicks && options.xaxis.ticks == null) + options.xaxis.ticks = options.xaxis.noTicks; + if (options.yaxis.noTicks && options.yaxis.ticks == null) + options.yaxis.ticks = options.yaxis.noTicks; + if (options.x2axis) { + options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis); + options.xaxes[1].position = "top"; + } + if (options.y2axis) { + options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis); + options.yaxes[1].position = "right"; + } + if (options.grid.coloredAreas) + options.grid.markings = options.grid.coloredAreas; + if (options.grid.coloredAreasColor) + options.grid.markingsColor = options.grid.coloredAreasColor; + if (options.lines) + $.extend(true, options.series.lines, options.lines); + if (options.points) + $.extend(true, options.series.points, options.points); + if (options.bars) + $.extend(true, options.series.bars, options.bars); + if (options.shadowSize != null) + options.series.shadowSize = options.shadowSize; + + // save options on axes for future reference + for (i = 0; i < options.xaxes.length; ++i) + getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i]; + for (i = 0; i < options.yaxes.length; ++i) + getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i]; + + // add hooks from options + for (var n in hooks) + if (options.hooks[n] && options.hooks[n].length) + hooks[n] = hooks[n].concat(options.hooks[n]); + + executeHooks(hooks.processOptions, [options]); + } + + function setData(d) { + series = parseData(d); + fillInSeriesOptions(); + processData(); + } + + function parseData(d) { + var res = []; + for (var i = 0; i < d.length; ++i) { + var s = $.extend(true, {}, options.series); + + if (d[i].data != null) { + s.data = d[i].data; // move the data instead of deep-copy + delete d[i].data; + + $.extend(true, s, d[i]); + + d[i].data = s.data; + } + else + s.data = d[i]; + res.push(s); + } + + return res; + } + + function axisNumber(obj, coord) { + var a = obj[coord + "axis"]; + if (typeof a == "object") // if we got a real axis, extract number + a = a.n; + if (typeof a != "number") + a = 1; // default to first axis + return a; + } + + function allAxes() { + // return flat array without annoying null entries + return $.grep(xaxes.concat(yaxes), function (a) { return a; }); + } + + function canvasToAxisCoords(pos) { + // return an object with x/y corresponding to all used axes + var res = {}, i, axis; + for (i = 0; i < xaxes.length; ++i) { + axis = xaxes[i]; + if (axis && axis.used) + res["x" + axis.n] = axis.c2p(pos.left); + } + + for (i = 0; i < yaxes.length; ++i) { + axis = yaxes[i]; + if (axis && axis.used) + res["y" + axis.n] = axis.c2p(pos.top); + } + + if (res.x1 !== undefined) + res.x = res.x1; + if (res.y1 !== undefined) + res.y = res.y1; + + return res; + } + + function axisToCanvasCoords(pos) { + // get canvas coords from the first pair of x/y found in pos + var res = {}, i, axis, key; + + for (i = 0; i < xaxes.length; ++i) { + axis = xaxes[i]; + if (axis && axis.used) { + key = "x" + axis.n; + if (pos[key] == null && axis.n == 1) + key = "x"; + + if (pos[key] != null) { + res.left = axis.p2c(pos[key]); + break; + } + } + } + + for (i = 0; i < yaxes.length; ++i) { + axis = yaxes[i]; + if (axis && axis.used) { + key = "y" + axis.n; + if (pos[key] == null && axis.n == 1) + key = "y"; + + if (pos[key] != null) { + res.top = axis.p2c(pos[key]); + break; + } + } + } + + return res; + } + + function getOrCreateAxis(axes, number) { + if (!axes[number - 1]) + axes[number - 1] = { + n: number, // save the number for future reference + direction: axes == xaxes ? "x" : "y", + options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis) + }; + + return axes[number - 1]; + } + + function fillInSeriesOptions() { + var i; + + // collect what we already got of colors + var neededColors = series.length, + usedColors = [], + assignedColors = []; + for (i = 0; i < series.length; ++i) { + var sc = series[i].color; + if (sc != null) { + --neededColors; + if (typeof sc == "number") + assignedColors.push(sc); + else + usedColors.push($.color.parse(series[i].color)); + } + } + + // we might need to generate more colors if higher indices + // are assigned + for (i = 0; i < assignedColors.length; ++i) { + neededColors = Math.max(neededColors, assignedColors[i] + 1); + } + + // produce colors as needed + var colors = [], variation = 0; + i = 0; + while (colors.length < neededColors) { + var c; + if (options.colors.length == i) // check degenerate case + c = $.color.make(100, 100, 100); + else + c = $.color.parse(options.colors[i]); + + // vary color if needed + var sign = variation % 2 == 1 ? -1 : 1; + c.scale('rgb', 1 + sign * Math.ceil(variation / 2) * 0.2) + + // FIXME: if we're getting to close to something else, + // we should probably skip this one + colors.push(c); + + ++i; + if (i >= options.colors.length) { + i = 0; + ++variation; + } + } + + // fill in the options + var colori = 0, s; + for (i = 0; i < series.length; ++i) { + s = series[i]; + + // assign colors + if (s.color == null) { + s.color = colors[colori].toString(); + ++colori; + } + else if (typeof s.color == "number") + s.color = colors[s.color].toString(); + + // turn on lines automatically in case nothing is set + if (s.lines.show == null) { + var v, show = true; + for (v in s) + if (s[v] && s[v].show) { + show = false; + break; + } + if (show) + s.lines.show = true; + } + + // setup axes + s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, "x")); + s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, "y")); + } + } + + function processData() { + var topSentry = Number.POSITIVE_INFINITY, + bottomSentry = Number.NEGATIVE_INFINITY, + fakeInfinity = Number.MAX_VALUE, + i, j, k, m, length, + s, points, ps, x, y, axis, val, f, p; + + function updateAxis(axis, min, max) { + if (min < axis.datamin && min != -fakeInfinity) + axis.datamin = min; + if (max > axis.datamax && max != fakeInfinity) + axis.datamax = max; + } + + $.each(allAxes(), function (_, axis) { + // init axis + axis.datamin = topSentry; + axis.datamax = bottomSentry; + axis.used = false; + }); + + for (i = 0; i < series.length; ++i) { + s = series[i]; + s.datapoints = { points: [] }; + + executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]); + } + + // first pass: clean and copy data + for (i = 0; i < series.length; ++i) { + s = series[i]; + + var data = s.data, format = s.datapoints.format; + + if (!format) { + format = []; + // find out how to copy + format.push({ x: true, number: true, required: true }); + format.push({ y: true, number: true, required: true }); + + if (s.bars.show || (s.lines.show && s.lines.fill)) { + format.push({ y: true, number: true, required: false, defaultValue: 0 }); + if (s.bars.horizontal) { + delete format[format.length - 1].y; + format[format.length - 1].x = true; + } + } + + s.datapoints.format = format; + } + + if (s.datapoints.pointsize != null) + continue; // already filled in + + s.datapoints.pointsize = format.length; + + ps = s.datapoints.pointsize; + points = s.datapoints.points; + + insertSteps = s.lines.show && s.lines.steps; + s.xaxis.used = s.yaxis.used = true; + + for (j = k = 0; j < data.length; ++j, k += ps) { + p = data[j]; + + var nullify = p == null; + if (!nullify) { + for (m = 0; m < ps; ++m) { + val = p[m]; + f = format[m]; + + if (f) { + if (f.number && val != null) { + val = +val; // convert to number + if (isNaN(val)) + val = null; + else if (val == Infinity) + val = fakeInfinity; + else if (val == -Infinity) + val = -fakeInfinity; + } + + if (val == null) { + if (f.required) + nullify = true; + + if (f.defaultValue != null) + val = f.defaultValue; + } + } + + points[k + m] = val; + } + } + + if (nullify) { + for (m = 0; m < ps; ++m) { + val = points[k + m]; + if (val != null) { + f = format[m]; + // extract min/max info + if (f.x) + updateAxis(s.xaxis, val, val); + if (f.y) + updateAxis(s.yaxis, val, val); + } + points[k + m] = null; + } + } + else { + // a little bit of line specific stuff that + // perhaps shouldn't be here, but lacking + // better means... + if (insertSteps && k > 0 + && points[k - ps] != null + && points[k - ps] != points[k] + && points[k - ps + 1] != points[k + 1]) { + // copy the point to make room for a middle point + for (m = 0; m < ps; ++m) + points[k + ps + m] = points[k + m]; + + // middle point has same y + points[k + 1] = points[k - ps + 1]; + + // we've added a point, better reflect that + k += ps; + } + } + } + } + + // give the hooks a chance to run + for (i = 0; i < series.length; ++i) { + s = series[i]; + + executeHooks(hooks.processDatapoints, [ s, s.datapoints]); + } + + // second pass: find datamax/datamin for auto-scaling + for (i = 0; i < series.length; ++i) { + s = series[i]; + points = s.datapoints.points, + ps = s.datapoints.pointsize; + + var xmin = topSentry, ymin = topSentry, + xmax = bottomSentry, ymax = bottomSentry; + + for (j = 0; j < points.length; j += ps) { + if (points[j] == null) + continue; + + for (m = 0; m < ps; ++m) { + val = points[j + m]; + f = format[m]; + if (!f || val == fakeInfinity || val == -fakeInfinity) + continue; + + if (f.x) { + if (val < xmin) + xmin = val; + if (val > xmax) + xmax = val; + } + if (f.y) { + if (val < ymin) + ymin = val; + if (val > ymax) + ymax = val; + } + } + } + + if (s.bars.show) { + // make sure we got room for the bar on the dancing floor + var delta = s.bars.align == "left" ? 0 : -s.bars.barWidth/2; + if (s.bars.horizontal) { + ymin += delta; + ymax += delta + s.bars.barWidth; + } + else { + xmin += delta; + xmax += delta + s.bars.barWidth; + } + } + + updateAxis(s.xaxis, xmin, xmax); + updateAxis(s.yaxis, ymin, ymax); + } + + $.each(allAxes(), function (_, axis) { + if (axis.datamin == topSentry) + axis.datamin = null; + if (axis.datamax == bottomSentry) + axis.datamax = null; + }); + } + + function makeCanvas(skipPositioning, cls) { + var c = document.createElement('canvas'); + c.className = cls; + c.width = canvasWidth; + c.height = canvasHeight; + + if (!skipPositioning) + $(c).css({ position: 'absolute', left: 0, top: 0 }); + + $(c).appendTo(placeholder); + + if (!c.getContext) // excanvas hack + c = window.G_vmlCanvasManager.initElement(c); + + // used for resetting in case we get replotted + c.getContext("2d").save(); + + return c; + } + + function getCanvasDimensions() { + canvasWidth = placeholder.width(); + canvasHeight = placeholder.height(); + + if (canvasWidth <= 0 || canvasHeight <= 0) + throw "Invalid dimensions for plot, width = " + canvasWidth + ", height = " + canvasHeight; + } + + function resizeCanvas(c) { + // resizing should reset the state (excanvas seems to be + // buggy though) + if (c.width != canvasWidth) + c.width = canvasWidth; + + if (c.height != canvasHeight) + c.height = canvasHeight; + + // so try to get back to the initial state (even if it's + // gone now, this should be safe according to the spec) + var cctx = c.getContext("2d"); + cctx.restore(); + + // and save again + cctx.save(); + } + + function setupCanvases() { + var reused, + existingCanvas = placeholder.children("canvas.base"), + existingOverlay = placeholder.children("canvas.overlay"); + + if (existingCanvas.length == 0 || existingOverlay == 0) { + // init everything + + placeholder.html(""); // make sure placeholder is clear + + placeholder.css({ padding: 0 }); // padding messes up the positioning + + if (placeholder.css("position") == 'static') + placeholder.css("position", "relative"); // for positioning labels and overlay + + getCanvasDimensions(); + + canvas = makeCanvas(true, "base"); + overlay = makeCanvas(false, "overlay"); // overlay canvas for interactive features + + reused = false; + } + else { + // reuse existing elements + + canvas = existingCanvas.get(0); + overlay = existingOverlay.get(0); + + reused = true; + } + + ctx = canvas.getContext("2d"); + octx = overlay.getContext("2d"); + + // we include the canvas in the event holder too, because IE 7 + // sometimes has trouble with the stacking order + eventHolder = $([overlay, canvas]); + + if (reused) { + // run shutdown in the old plot object + placeholder.data("plot").shutdown(); + + // reset reused canvases + plot.resize(); + + // make sure overlay pixels are cleared (canvas is cleared when we redraw) + octx.clearRect(0, 0, canvasWidth, canvasHeight); + + // then whack any remaining obvious garbage left + eventHolder.unbind(); + placeholder.children().not([canvas, overlay]).remove(); + } + + // save in case we get replotted + placeholder.data("plot", plot); + } + + function bindEvents() { + // bind events + if (options.grid.hoverable) { + eventHolder.mousemove(onMouseMove); + eventHolder.mouseleave(onMouseLeave); + } + + if (options.grid.clickable) + eventHolder.click(onClick); + + executeHooks(hooks.bindEvents, [eventHolder]); + } + + function shutdown() { + if (redrawTimeout) + clearTimeout(redrawTimeout); + + eventHolder.unbind("mousemove", onMouseMove); + eventHolder.unbind("mouseleave", onMouseLeave); + eventHolder.unbind("click", onClick); + + executeHooks(hooks.shutdown, [eventHolder]); + } + + function setTransformationHelpers(axis) { + // set helper functions on the axis, assumes plot area + // has been computed already + + function identity(x) { return x; } + + var s, m, t = axis.options.transform || identity, + it = axis.options.inverseTransform; + + // precompute how much the axis is scaling a point + // in canvas space + if (axis.direction == "x") { + s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min)); + m = Math.min(t(axis.max), t(axis.min)); + } + else { + s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min)); + s = -s; + m = Math.max(t(axis.max), t(axis.min)); + } + + // data point to canvas coordinate + if (t == identity) // slight optimization + axis.p2c = function (p) { return (p - m) * s; }; + else + axis.p2c = function (p) { return (t(p) - m) * s; }; + // canvas coordinate to data point + if (!it) + axis.c2p = function (c) { return m + c / s; }; + else + axis.c2p = function (c) { return it(m + c / s); }; + } + + function measureTickLabels(axis) { + var opts = axis.options, i, ticks = axis.ticks || [], labels = [], + l, w = opts.labelWidth, h = opts.labelHeight, dummyDiv; + + function makeDummyDiv(labels, width) { + return $('<div style="position:absolute;top:-10000px;' + width + 'font-size:smaller">' + + '<div class="' + axis.direction + 'Axis ' + axis.direction + axis.n + 'Axis">' + + labels.join("") + '</div></div>') + .appendTo(placeholder); + } + + if (axis.direction == "x") { + // to avoid measuring the widths of the labels (it's slow), we + // construct fixed-size boxes and put the labels inside + // them, we don't need the exact figures and the + // fixed-size box content is easy to center + if (w == null) + w = Math.floor(canvasWidth / (ticks.length > 0 ? ticks.length : 1)); + + // measure x label heights + if (h == null) { + labels = []; + for (i = 0; i < ticks.length; ++i) { + l = ticks[i].label; + if (l) + labels.push('<div class="tickLabel" style="float:left;width:' + w + 'px">' + l + '</div>'); + } + + if (labels.length > 0) { + // stick them all in the same div and measure + // collective height + labels.push('<div style="clear:left"></div>'); + dummyDiv = makeDummyDiv(labels, "width:10000px;"); + h = dummyDiv.height(); + dummyDiv.remove(); + } + } + } + else if (w == null || h == null) { + // calculate y label dimensions + for (i = 0; i < ticks.length; ++i) { + l = ticks[i].label; + if (l) + labels.push('<div class="tickLabel">' + l + '</div>'); + } + + if (labels.length > 0) { + dummyDiv = makeDummyDiv(labels, ""); + if (w == null) + w = dummyDiv.children().width(); + if (h == null) + h = dummyDiv.find("div.tickLabel").height(); + dummyDiv.remove(); + } + } + + if (w == null) + w = 0; + if (h == null) + h = 0; + + axis.labelWidth = w; + axis.labelHeight = h; + } + + function allocateAxisBoxFirstPhase(axis) { + // find the bounding box of the axis by looking at label + // widths/heights and ticks, make room by diminishing the + // plotOffset + + var lw = axis.labelWidth, + lh = axis.labelHeight, + pos = axis.options.position, + tickLength = axis.options.tickLength, + axismargin = options.grid.axisMargin, + padding = options.grid.labelMargin, + all = axis.direction == "x" ? xaxes : yaxes, + index; + + // determine axis margin + var samePosition = $.grep(all, function (a) { + return a && a.options.position == pos && a.reserveSpace; + }); + if ($.inArray(axis, samePosition) == samePosition.length - 1) + axismargin = 0; // outermost + + // determine tick length - if we're innermost, we can use "full" + if (tickLength == null) + tickLength = "full"; + + var sameDirection = $.grep(all, function (a) { + return a && a.reserveSpace; + }); + + var innermost = $.inArray(axis, sameDirection) == 0; + if (!innermost && tickLength == "full") + tickLength = 5; + + if (!isNaN(+tickLength)) + padding += +tickLength; + + // compute box + if (axis.direction == "x") { + lh += padding; + + if (pos == "bottom") { + plotOffset.bottom += lh + axismargin; + axis.box = { top: canvasHeight - plotOffset.bottom, height: lh }; + } + else { + axis.box = { top: plotOffset.top + axismargin, height: lh }; + plotOffset.top += lh + axismargin; + } + } + else { + lw += padding; + + if (pos == "left") { + axis.box = { left: plotOffset.left + axismargin, width: lw }; + plotOffset.left += lw + axismargin; + } + else { + plotOffset.right += lw + axismargin; + axis.box = { left: canvasWidth - plotOffset.right, width: lw }; + } + } + + // save for future reference + axis.position = pos; + axis.tickLength = tickLength; + axis.box.padding = padding; + axis.innermost = innermost; + } + + function allocateAxisBoxSecondPhase(axis) { + // set remaining bounding box coordinates + if (axis.direction == "x") { + axis.box.left = plotOffset.left; + axis.box.width = plotWidth; + } + else { + axis.box.top = plotOffset.top; + axis.box.height = plotHeight; + } + } + + function setupGrid() { + var i, axes = allAxes(); + + // first calculate the plot and axis box dimensions + + $.each(axes, function (_, axis) { + axis.show = axis.options.show; + if (axis.show == null) + axis.show = axis.used; // by default an axis is visible if it's got data + + axis.reserveSpace = axis.show || axis.options.reserveSpace; + + setRange(axis); + }); + + allocatedAxes = $.grep(axes, function (axis) { return axis.reserveSpace; }); + + plotOffset.left = plotOffset.right = plotOffset.top = plotOffset.bottom = 0; + if (options.grid.show) { + $.each(allocatedAxes, function (_, axis) { + // make the ticks + setupTickGeneration(axis); + setTicks(axis); + snapRangeToTicks(axis, axis.ticks); + + // find labelWidth/Height for axis + measureTickLabels(axis); + }); + + // with all dimensions in house, we can compute the + // axis boxes, start from the outside (reverse order) + for (i = allocatedAxes.length - 1; i >= 0; --i) + allocateAxisBoxFirstPhase(allocatedAxes[i]); + + // make sure we've got enough space for things that + // might stick out + var minMargin = options.grid.minBorderMargin; + if (minMargin == null) { + minMargin = 0; + for (i = 0; i < series.length; ++i) + minMargin = Math.max(minMargin, series[i].points.radius + series[i].points.lineWidth/2); + } + + for (var a in plotOffset) { + plotOffset[a] += options.grid.borderWidth; + plotOffset[a] = Math.max(minMargin, plotOffset[a]); + } + } + + plotWidth = canvasWidth - plotOffset.left - plotOffset.right; + plotHeight = canvasHeight - plotOffset.bottom - plotOffset.top; + + // now we got the proper plotWidth/Height, we can compute the scaling + $.each(axes, function (_, axis) { + setTransformationHelpers(axis); + }); + + if (options.grid.show) { + $.each(allocatedAxes, function (_, axis) { + allocateAxisBoxSecondPhase(axis); + }); + + insertAxisLabels(); + } + + insertLegend(); + } + + function setRange(axis) { + var opts = axis.options, + min = +(opts.min != null ? opts.min : axis.datamin), + max = +(opts.max != null ? opts.max : axis.datamax), + delta = max - min; + + if (delta == 0.0) { + // degenerate case + var widen = max == 0 ? 1 : 0.01; + + if (opts.min == null) + min -= widen; + // always widen max if we couldn't widen min to ensure we + // don't fall into min == max which doesn't work + if (opts.max == null || opts.min != null) + max += widen; + } + else { + // consider autoscaling + var margin = opts.autoscaleMargin; + if (margin != null) { + if (opts.min == null) { + min -= delta * margin; + // make sure we don't go below zero if all values + // are positive + if (min < 0 && axis.datamin != null && axis.datamin >= 0) + min = 0; + } + if (opts.max == null) { + max += delta * margin; + if (max > 0 && axis.datamax != null && axis.datamax <= 0) + max = 0; + } + } + } + axis.min = min; + axis.max = max; + } + + function setupTickGeneration(axis) { + var opts = axis.options; + + // estimate number of ticks + var noTicks; + if (typeof opts.ticks == "number" && opts.ticks > 0) + noTicks = opts.ticks; + else + // heuristic based on the model a*sqrt(x) fitted to + // some data points that seemed reasonable + noTicks = 0.3 * Math.sqrt(axis.direction == "x" ? canvasWidth : canvasHeight); + + var delta = (axis.max - axis.min) / noTicks, + size, generator, unit, formatter, i, magn, norm; + + if (opts.mode == "time") { + // pretty handling of time + + // map of app. size of time units in milliseconds + var timeUnitSize = { + "second": 1000, + "minute": 60 * 1000, + "hour": 60 * 60 * 1000, + "day": 24 * 60 * 60 * 1000, + "month": 30 * 24 * 60 * 60 * 1000, + "year": 365.2425 * 24 * 60 * 60 * 1000 + }; + + + // the allowed tick sizes, after 1 year we use + // an integer algorithm + var spec = [ + [1, "second"], [2, "second"], [5, "second"], [10, "second"], + [30, "second"], + [1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"], + [30, "minute"], + [1, "hour"], [2, "hour"], [4, "hour"], + [8, "hour"], [12, "hour"], + [1, "day"], [2, "day"], [3, "day"], + [0.25, "month"], [0.5, "month"], [1, "month"], + [2, "month"], [3, "month"], [6, "month"], + [1, "year"] + ]; + + var minSize = 0; + if (opts.minTickSize != null) { + if (typeof opts.tickSize == "number") + minSize = opts.tickSize; + else + minSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]]; + } + + for (var i = 0; i < spec.length - 1; ++i) + if (delta < (spec[i][0] * timeUnitSize[spec[i][1]] + + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2 + && spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) + break; + size = spec[i][0]; + unit = spec[i][1]; + + // special-case the possibility of several years + if (unit == "year") { + magn = Math.pow(10, Math.floor(Math.log(delta / timeUnitSize.year) / Math.LN10)); + norm = (delta / timeUnitSize.year) / magn; + if (norm < 1.5) + size = 1; + else if (norm < 3) + size = 2; + else if (norm < 7.5) + size = 5; + else + size = 10; + + size *= magn; + } + + axis.tickSize = opts.tickSize || [size, unit]; + + generator = function(axis) { + var ticks = [], + tickSize = axis.tickSize[0], unit = axis.tickSize[1], + d = new Date(axis.min); + + var step = tickSize * timeUnitSize[unit]; + + if (unit == "second") + d.setUTCSeconds(floorInBase(d.getUTCSeconds(), tickSize)); + if (unit == "minute") + d.setUTCMinutes(floorInBase(d.getUTCMinutes(), tickSize)); + if (unit == "hour") + d.setUTCHours(floorInBase(d.getUTCHours(), tickSize)); + if (unit == "month") + d.setUTCMonth(floorInBase(d.getUTCMonth(), tickSize)); + if (unit == "year") + d.setUTCFullYear(floorInBase(d.getUTCFullYear(), tickSize)); + + // reset smaller components + d.setUTCMilliseconds(0); + if (step >= timeUnitSize.minute) + d.setUTCSeconds(0); + if (step >= timeUnitSize.hour) + d.setUTCMinutes(0); + if (step >= timeUnitSize.day) + d.setUTCHours(0); + if (step >= timeUnitSize.day * 4) + d.setUTCDate(1); + if (step >= timeUnitSize.year) + d.setUTCMonth(0); + + + var carry = 0, v = Number.NaN, prev; + do { + prev = v; + v = d.getTime(); + ticks.push(v); + if (unit == "month") { + if (tickSize < 1) { + // a bit complicated - we'll divide the month + // up but we need to take care of fractions + // so we don't end up in the middle of a day + d.setUTCDate(1); + var start = d.getTime(); + d.setUTCMonth(d.getUTCMonth() + 1); + var end = d.getTime(); + d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize); + carry = d.getUTCHours(); + d.setUTCHours(0); + } + else + d.setUTCMonth(d.getUTCMonth() + tickSize); + } + else if (unit == "year") { + d.setUTCFullYear(d.getUTCFullYear() + tickSize); + } + else + d.setTime(v + step); + } while (v < axis.max && v != prev); + + return ticks; + }; + + formatter = function (v, axis) { + var d = new Date(v); + + // first check global format + if (opts.timeformat != null) + return $.plot.formatDate(d, opts.timeformat, opts.monthNames); + + var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]]; + var span = axis.max - axis.min; + var suffix = (opts.twelveHourClock) ? " %p" : ""; + + if (t < timeUnitSize.minute) + fmt = "%h:%M:%S" + suffix; + else if (t < timeUnitSize.day) { + if (span < 2 * timeUnitSize.day) + fmt = "%h:%M" + suffix; + else + fmt = "%b %d %h:%M" + suffix; + } + else if (t < timeUnitSize.month) + fmt = "%b %d"; + else if (t < timeUnitSize.year) { + if (span < timeUnitSize.year) + fmt = "%b"; + else + fmt = "%b %y"; + } + else + fmt = "%y"; + + return $.plot.formatDate(d, fmt, opts.monthNames); + }; + } + else { + // pretty rounding of base-10 numbers + var maxDec = opts.tickDecimals; + var dec = -Math.floor(Math.log(delta) / Math.LN10); + if (maxDec != null && dec > maxDec) + dec = maxDec; + + magn = Math.pow(10, -dec); + norm = delta / magn; // norm is between 1.0 and 10.0 + + if (norm < 1.5) + size = 1; + else if (norm < 3) { + size = 2; + // special case for 2.5, requires an extra decimal + if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) { + size = 2.5; + ++dec; + } + } + else if (norm < 7.5) + size = 5; + else + size = 10; + + size *= magn; + + if (opts.minTickSize != null && size < opts.minTickSize) + size = opts.minTickSize; + + axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec); + axis.tickSize = opts.tickSize || size; + + generator = function (axis) { + var ticks = []; + + // spew out all possible ticks + var start = floorInBase(axis.min, axis.tickSize), + i = 0, v = Number.NaN, prev; + do { + prev = v; + v = start + i * axis.tickSize; + ticks.push(v); + ++i; + } while (v < axis.max && v != prev); + return ticks; + }; + + formatter = function (v, axis) { + return v.toFixed(axis.tickDecimals); + }; + } + + if (opts.alignTicksWithAxis != null) { + var otherAxis = (axis.direction == "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1]; + if (otherAxis && otherAxis.used && otherAxis != axis) { + // consider snapping min/max to outermost nice ticks + var niceTicks = generator(axis); + if (niceTicks.length > 0) { + if (opts.min == null) + axis.min = Math.min(axis.min, niceTicks[0]); + if (opts.max == null && niceTicks.length > 1) + axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]); + } + + generator = function (axis) { + // copy ticks, scaled to this axis + var ticks = [], v, i; + for (i = 0; i < otherAxis.ticks.length; ++i) { + v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min); + v = axis.min + v * (axis.max - axis.min); + ticks.push(v); + } + return ticks; + }; + + // we might need an extra decimal since forced + // ticks don't necessarily fit naturally + if (axis.mode != "time" && opts.tickDecimals == null) { + var extraDec = Math.max(0, -Math.floor(Math.log(delta) / Math.LN10) + 1), + ts = generator(axis); + + // only proceed if the tick interval rounded + // with an extra decimal doesn't give us a + // zero at end + if (!(ts.length > 1 && /\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec)))) + axis.tickDecimals = extraDec; + } + } + } + + axis.tickGenerator = generator; + if ($.isFunction(opts.tickFormatter)) + axis.tickFormatter = function (v, axis) { return "" + opts.tickFormatter(v, axis); }; + else + axis.tickFormatter = formatter; + } + + function setTicks(axis) { + var oticks = axis.options.ticks, ticks = []; + if (oticks == null || (typeof oticks == "number" && oticks > 0)) + ticks = axis.tickGenerator(axis); + else if (oticks) { + if ($.isFunction(oticks)) + // generate the ticks + ticks = oticks({ min: axis.min, max: axis.max }); + else + ticks = oticks; + } + + // clean up/labelify the supplied ticks, copy them over + var i, v; + axis.ticks = []; + for (i = 0; i < ticks.length; ++i) { + var label = null; + var t = ticks[i]; + if (typeof t == "object") { + v = +t[0]; + if (t.length > 1) + label = t[1]; + } + else + v = +t; + if (label == null) + label = axis.tickFormatter(v, axis); + if (!isNaN(v)) + axis.ticks.push({ v: v, label: label }); + } + } + + function snapRangeToTicks(axis, ticks) { + if (axis.options.autoscaleMargin && ticks.length > 0) { + // snap to ticks + if (axis.options.min == null) + axis.min = Math.min(axis.min, ticks[0].v); + if (axis.options.max == null && ticks.length > 1) + axis.max = Math.max(axis.max, ticks[ticks.length - 1].v); + } + } + + function draw() { + ctx.clearRect(0, 0, canvasWidth, canvasHeight); + + var grid = options.grid; + + // draw background, if any + if (grid.show && grid.backgroundColor) + drawBackground(); + + if (grid.show && !grid.aboveData) + drawGrid(); + + for (var i = 0; i < series.length; ++i) { + executeHooks(hooks.drawSeries, [ctx, series[i]]); + drawSeries(series[i]); + } + + executeHooks(hooks.draw, [ctx]); + + if (grid.show && grid.aboveData) + drawGrid(); + } + + function extractRange(ranges, coord) { + var axis, from, to, key, axes = allAxes(); + + for (i = 0; i < axes.length; ++i) { + axis = axes[i]; + if (axis.direction == coord) { + key = coord + axis.n + "axis"; + if (!ranges[key] && axis.n == 1) + key = coord + "axis"; // support x1axis as xaxis + if (ranges[key]) { + from = ranges[key].from; + to = ranges[key].to; + break; + } + } + } + + // backwards-compat stuff - to be removed in future + if (!ranges[key]) { + axis = coord == "x" ? xaxes[0] : yaxes[0]; + from = ranges[coord + "1"]; + to = ranges[coord + "2"]; + } + + // auto-reverse as an added bonus + if (from != null && to != null && from > to) { + var tmp = from; + from = to; + to = tmp; + } + + return { from: from, to: to, axis: axis }; + } + + function drawBackground() { + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)"); + ctx.fillRect(0, 0, plotWidth, plotHeight); + ctx.restore(); + } + + function drawGrid() { + var i; + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + // draw markings + var markings = options.grid.markings; + if (markings) { + if ($.isFunction(markings)) { + var axes = plot.getAxes(); + // xmin etc. is backwards compatibility, to be + // removed in the future + axes.xmin = axes.xaxis.min; + axes.xmax = axes.xaxis.max; + axes.ymin = axes.yaxis.min; + axes.ymax = axes.yaxis.max; + + markings = markings(axes); + } + + for (i = 0; i < markings.length; ++i) { + var m = markings[i], + xrange = extractRange(m, "x"), + yrange = extractRange(m, "y"); + + // fill in missing + if (xrange.from == null) + xrange.from = xrange.axis.min; + if (xrange.to == null) + xrange.to = xrange.axis.max; + if (yrange.from == null) + yrange.from = yrange.axis.min; + if (yrange.to == null) + yrange.to = yrange.axis.max; + + // clip + if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max || + yrange.to < yrange.axis.min || yrange.from > yrange.axis.max) + continue; + + xrange.from = Math.max(xrange.from, xrange.axis.min); + xrange.to = Math.min(xrange.to, xrange.axis.max); + yrange.from = Math.max(yrange.from, yrange.axis.min); + yrange.to = Math.min(yrange.to, yrange.axis.max); + + if (xrange.from == xrange.to && yrange.from == yrange.to) + continue; + + // then draw + xrange.from = xrange.axis.p2c(xrange.from); + xrange.to = xrange.axis.p2c(xrange.to); + yrange.from = yrange.axis.p2c(yrange.from); + yrange.to = yrange.axis.p2c(yrange.to); + + if (xrange.from == xrange.to || yrange.from == yrange.to) { + // draw line + ctx.beginPath(); + ctx.strokeStyle = m.color || options.grid.markingsColor; + ctx.lineWidth = m.lineWidth || options.grid.markingsLineWidth; + ctx.moveTo(xrange.from, yrange.from); + ctx.lineTo(xrange.to, yrange.to); + ctx.stroke(); + } + else { + // fill area + ctx.fillStyle = m.color || options.grid.markingsColor; + ctx.fillRect(xrange.from, yrange.to, + xrange.to - xrange.from, + yrange.from - yrange.to); + } + } + } + + // draw the ticks + var axes = allAxes(), bw = options.grid.borderWidth; + + for (var j = 0; j < axes.length; ++j) { + var axis = axes[j], box = axis.box, + t = axis.tickLength, x, y, xoff, yoff; + if (!axis.show || axis.ticks.length == 0) + continue + + ctx.strokeStyle = axis.options.tickColor || $.color.parse(axis.options.color).scale('a', 0.22).toString(); + ctx.lineWidth = 1; + + // find the edges + if (axis.direction == "x") { + x = 0; + if (t == "full") + y = (axis.position == "top" ? 0 : plotHeight); + else + y = box.top - plotOffset.top + (axis.position == "top" ? box.height : 0); + } + else { + y = 0; + if (t == "full") + x = (axis.position == "left" ? 0 : plotWidth); + else + x = box.left - plotOffset.left + (axis.position == "left" ? box.width : 0); + } + + // draw tick bar + if (!axis.innermost) { + ctx.beginPath(); + xoff = yoff = 0; + if (axis.direction == "x") + xoff = plotWidth; + else + yoff = plotHeight; + + if (ctx.lineWidth == 1) { + x = Math.floor(x) + 0.5; + y = Math.floor(y) + 0.5; + } + + ctx.moveTo(x, y); + ctx.lineTo(x + xoff, y + yoff); + ctx.stroke(); + } + + // draw ticks + ctx.beginPath(); + for (i = 0; i < axis.ticks.length; ++i) { + var v = axis.ticks[i].v; + + xoff = yoff = 0; + + if (v < axis.min || v > axis.max + // skip those lying on the axes if we got a border + || (t == "full" && bw > 0 + && (v == axis.min || v == axis.max))) + continue; + + if (axis.direction == "x") { + x = axis.p2c(v); + yoff = t == "full" ? -plotHeight : t; + + if (axis.position == "top") + yoff = -yoff; + } + else { + y = axis.p2c(v); + xoff = t == "full" ? -plotWidth : t; + + if (axis.position == "left") + xoff = -xoff; + } + + if (ctx.lineWidth == 1) { + if (axis.direction == "x") + x = Math.floor(x) + 0.5; + else + y = Math.floor(y) + 0.5; + } + + ctx.moveTo(x, y); + ctx.lineTo(x + xoff, y + yoff); + } + + ctx.stroke(); + } + + + // draw border + if (bw) { + ctx.lineWidth = bw; + ctx.strokeStyle = options.grid.borderColor; + ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw); + } + + ctx.restore(); + } + + function insertAxisLabels() { + placeholder.find(".tickLabels").remove(); + + var html = ['<div class="tickLabels" style="font-size:smaller">']; + + var axes = allAxes(); + for (var j = 0; j < axes.length; ++j) { + var axis = axes[j], box = axis.box; + if (!axis.show) + continue; + //debug: html.push('<div style="position:absolute;opacity:0.10;background-color:red;left:' + box.left + 'px;top:' + box.top + 'px;width:' + box.width + 'px;height:' + box.height + 'px"></div>') + html.push('<div class="' + axis.direction + 'Axis ' + axis.direction + axis.n + 'Axis" style="color:' + axis.options.color + '">'); + for (var i = 0; i < axis.ticks.length; ++i) { + var tick = axis.ticks[i]; + if (!tick.label || tick.v < axis.min || tick.v > axis.max) + continue; + + var pos = {}, align; + + if (axis.direction == "x") { + align = "center"; + pos.left = Math.round(plotOffset.left + axis.p2c(tick.v) - axis.labelWidth/2); + if (axis.position == "bottom") + pos.top = box.top + box.padding; + else + pos.bottom = canvasHeight - (box.top + box.height - box.padding); + } + else { + pos.top = Math.round(plotOffset.top + axis.p2c(tick.v) - axis.labelHeight/2); + if (axis.position == "left") { + pos.right = canvasWidth - (box.left + box.width - box.padding) + align = "right"; + } + else { + pos.left = box.left + box.padding; + align = "left"; + } + } + + pos.width = axis.labelWidth; + + var style = ["position:absolute", "text-align:" + align ]; + for (var a in pos) + style.push(a + ":" + pos[a] + "px") + + html.push('<div class="tickLabel" style="' + style.join(';') + '">' + tick.label + '</div>'); + } + html.push('</div>'); + } + + html.push('</div>'); + + placeholder.append(html.join("")); + } + + function drawSeries(series) { + if (series.lines.show) + drawSeriesLines(series); + if (series.bars.show) + drawSeriesBars(series); + if (series.points.show) + drawSeriesPoints(series); + } + + function drawSeriesLines(series) { + function plotLine(datapoints, xoffset, yoffset, axisx, axisy) { + var points = datapoints.points, + ps = datapoints.pointsize, + prevx = null, prevy = null; + + ctx.beginPath(); + for (var i = ps; i < points.length; i += ps) { + var x1 = points[i - ps], y1 = points[i - ps + 1], + x2 = points[i], y2 = points[i + 1]; + + if (x1 == null || x2 == null) + continue; + + // clip with ymin + if (y1 <= y2 && y1 < axisy.min) { + if (y2 < axisy.min) + continue; // line segment is outside + // compute new intersection point + x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.min; + } + else if (y2 <= y1 && y2 < axisy.min) { + if (y1 < axisy.min) + continue; + x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.min; + } + + // clip with ymax + if (y1 >= y2 && y1 > axisy.max) { + if (y2 > axisy.max) + continue; + x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.max; + } + else if (y2 >= y1 && y2 > axisy.max) { + if (y1 > axisy.max) + continue; + x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.max; + } + + // clip with xmin + if (x1 <= x2 && x1 < axisx.min) { + if (x2 < axisx.min) + continue; + y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.min; + } + else if (x2 <= x1 && x2 < axisx.min) { + if (x1 < axisx.min) + continue; + y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.min; + } + + // clip with xmax + if (x1 >= x2 && x1 > axisx.max) { + if (x2 > axisx.max) + continue; + y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.max; + } + else if (x2 >= x1 && x2 > axisx.max) { + if (x1 > axisx.max) + continue; + y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.max; + } + + if (x1 != prevx || y1 != prevy) + ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset); + + prevx = x2; + prevy = y2; + ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset); + } + ctx.stroke(); + } + + function plotLineArea(datapoints, axisx, axisy) { + var points = datapoints.points, + ps = datapoints.pointsize, + bottom = Math.min(Math.max(0, axisy.min), axisy.max), + i = 0, top, areaOpen = false, + ypos = 1, segmentStart = 0, segmentEnd = 0; + + // we process each segment in two turns, first forward + // direction to sketch out top, then once we hit the + // end we go backwards to sketch the bottom + while (true) { + if (ps > 0 && i > points.length + ps) + break; + + i += ps; // ps is negative if going backwards + + var x1 = points[i - ps], + y1 = points[i - ps + ypos], + x2 = points[i], y2 = points[i + ypos]; + + if (areaOpen) { + if (ps > 0 && x1 != null && x2 == null) { + // at turning point + segmentEnd = i; + ps = -ps; + ypos = 2; + continue; + } + + if (ps < 0 && i == segmentStart + ps) { + // done with the reverse sweep + ctx.fill(); + areaOpen = false; + ps = -ps; + ypos = 1; + i = segmentStart = segmentEnd + ps; + continue; + } + } + + if (x1 == null || x2 == null) + continue; + + // clip x values + + // clip with xmin + if (x1 <= x2 && x1 < axisx.min) { + if (x2 < axisx.min) + continue; + y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.min; + } + else if (x2 <= x1 && x2 < axisx.min) { + if (x1 < axisx.min) + continue; + y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.min; + } + + // clip with xmax + if (x1 >= x2 && x1 > axisx.max) { + if (x2 > axisx.max) + continue; + y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.max; + } + else if (x2 >= x1 && x2 > axisx.max) { + if (x1 > axisx.max) + continue; + y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.max; + } + + if (!areaOpen) { + // open area + ctx.beginPath(); + ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom)); + areaOpen = true; + } + + // now first check the case where both is outside + if (y1 >= axisy.max && y2 >= axisy.max) { + ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max)); + continue; + } + else if (y1 <= axisy.min && y2 <= axisy.min) { + ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min)); + continue; + } + + // else it's a bit more complicated, there might + // be a flat maxed out rectangle first, then a + // triangular cutout or reverse; to find these + // keep track of the current x values + var x1old = x1, x2old = x2; + + // clip the y values, without shortcutting, we + // go through all cases in turn + + // clip with ymin + if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) { + x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.min; + } + else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) { + x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.min; + } + + // clip with ymax + if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) { + x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.max; + } + else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) { + x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.max; + } + + // if the x value was changed we got a rectangle + // to fill + if (x1 != x1old) { + ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1)); + // it goes to (x1, y1), but we fill that below + } + + // fill triangular section, this sometimes result + // in redundant points if (x1, y1) hasn't changed + // from previous line to, but we just ignore that + ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); + + // fill the other rectangle if it's there + if (x2 != x2old) { + ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); + ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2)); + } + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + ctx.lineJoin = "round"; + + var lw = series.lines.lineWidth, + sw = series.shadowSize; + // FIXME: consider another form of shadow when filling is turned on + if (lw > 0 && sw > 0) { + // draw shadow as a thick and thin line with transparency + ctx.lineWidth = sw; + ctx.strokeStyle = "rgba(0,0,0,0.1)"; + // position shadow at angle from the mid of line + var angle = Math.PI/18; + plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis); + ctx.lineWidth = sw/2; + plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis); + } + + ctx.lineWidth = lw; + ctx.strokeStyle = series.color; + var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight); + if (fillStyle) { + ctx.fillStyle = fillStyle; + plotLineArea(series.datapoints, series.xaxis, series.yaxis); + } + + if (lw > 0) + plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis); + ctx.restore(); + } + + function drawSeriesPoints(series) { + function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) { + var points = datapoints.points, ps = datapoints.pointsize; + + for (var i = 0; i < points.length; i += ps) { + var x = points[i], y = points[i + 1]; + if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) + continue; + + ctx.beginPath(); + x = axisx.p2c(x); + y = axisy.p2c(y) + offset; + if (symbol == "circle") + ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false); + else + symbol(ctx, x, y, radius, shadow); + ctx.closePath(); + + if (fillStyle) { + ctx.fillStyle = fillStyle; + ctx.fill(); + } + ctx.stroke(); + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + var lw = series.points.lineWidth, + sw = series.shadowSize, + radius = series.points.radius, + symbol = series.points.symbol; + if (lw > 0 && sw > 0) { + // draw shadow in two steps + var w = sw / 2; + ctx.lineWidth = w; + ctx.strokeStyle = "rgba(0,0,0,0.1)"; + plotPoints(series.datapoints, radius, null, w + w/2, true, + series.xaxis, series.yaxis, symbol); + + ctx.strokeStyle = "rgba(0,0,0,0.2)"; + plotPoints(series.datapoints, radius, null, w/2, true, + series.xaxis, series.yaxis, symbol); + } + + ctx.lineWidth = lw; + ctx.strokeStyle = series.color; + plotPoints(series.datapoints, radius, + getFillStyle(series.points, series.color), 0, false, + series.xaxis, series.yaxis, symbol); + ctx.restore(); + } + + function drawBar(x, y, b, barLeft, barRight, offset, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) { + var left, right, bottom, top, + drawLeft, drawRight, drawTop, drawBottom, + tmp; + + // in horizontal mode, we start the bar from the left + // instead of from the bottom so it appears to be + // horizontal rather than vertical + if (horizontal) { + drawBottom = drawRight = drawTop = true; + drawLeft = false; + left = b; + right = x; + top = y + barLeft; + bottom = y + barRight; + + // account for negative bars + if (right < left) { + tmp = right; + right = left; + left = tmp; + drawLeft = true; + drawRight = false; + } + } + else { + drawLeft = drawRight = drawTop = true; + drawBottom = false; + left = x + barLeft; + right = x + barRight; + bottom = b; + top = y; + + // account for negative bars + if (top < bottom) { + tmp = top; + top = bottom; + bottom = tmp; + drawBottom = true; + drawTop = false; + } + } + + // clip + if (right < axisx.min || left > axisx.max || + top < axisy.min || bottom > axisy.max) + return; + + if (left < axisx.min) { + left = axisx.min; + drawLeft = false; + } + + if (right > axisx.max) { + right = axisx.max; + drawRight = false; + } + + if (bottom < axisy.min) { + bottom = axisy.min; + drawBottom = false; + } + + if (top > axisy.max) { + top = axisy.max; + drawTop = false; + } + + left = axisx.p2c(left); + bottom = axisy.p2c(bottom); + right = axisx.p2c(right); + top = axisy.p2c(top); + + // fill the bar + if (fillStyleCallback) { + c.beginPath(); + c.moveTo(left, bottom); + c.lineTo(left, top); + c.lineTo(right, top); + c.lineTo(right, bottom); + c.fillStyle = fillStyleCallback(bottom, top); + c.fill(); + } + + // draw outline + if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) { + c.beginPath(); + + // FIXME: inline moveTo is buggy with excanvas + c.moveTo(left, bottom + offset); + if (drawLeft) + c.lineTo(left, top + offset); + else + c.moveTo(left, top + offset); + if (drawTop) + c.lineTo(right, top + offset); + else + c.moveTo(right, top + offset); + if (drawRight) + c.lineTo(right, bottom + offset); + else + c.moveTo(right, bottom + offset); + if (drawBottom) + c.lineTo(left, bottom + offset); + else + c.moveTo(left, bottom + offset); + c.stroke(); + } + } + + function drawSeriesBars(series) { + function plotBars(datapoints, barLeft, barRight, offset, fillStyleCallback, axisx, axisy) { + var points = datapoints.points, ps = datapoints.pointsize; + + for (var i = 0; i < points.length; i += ps) { + if (points[i] == null) + continue; + drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, offset, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth); + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + // FIXME: figure out a way to add shadows (for instance along the right edge) + ctx.lineWidth = series.bars.lineWidth; + ctx.strokeStyle = series.color; + var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2; + var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null; + plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, 0, fillStyleCallback, series.xaxis, series.yaxis); + ctx.restore(); + } + + function getFillStyle(filloptions, seriesColor, bottom, top) { + var fill = filloptions.fill; + if (!fill) + return null; + + if (filloptions.fillColor) + return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor); + + var c = $.color.parse(seriesColor); + c.a = typeof fill == "number" ? fill : 0.4; + c.normalize(); + return c.toString(); + } + + function insertLegend() { + placeholder.find(".legend").remove(); + + if (!options.legend.show) + return; + + var fragments = [], rowStarted = false, + lf = options.legend.labelFormatter, s, label; + for (var i = 0; i < series.length; ++i) { + s = series[i]; + label = s.label; + if (!label) + continue; + + if (i % options.legend.noColumns == 0) { + if (rowStarted) + fragments.push('</tr>'); + fragments.push('<tr>'); + rowStarted = true; + } + + if (lf) + label = lf(label, s); + + fragments.push( + '<td class="legendColorBox"><div style="border:1px solid ' + options.legend.labelBoxBorderColor + ';padding:1px"><div style="width:4px;height:0;border:5px solid ' + s.color + ';overflow:hidden"></div></div></td>' + + '<td class="legendLabel">' + label + '</td>'); + } + if (rowStarted) + fragments.push('</tr>'); + + if (fragments.length == 0) + return; + + var table = '<table style="font-size:smaller;color:' + options.grid.color + '">' + fragments.join("") + '</table>'; + if (options.legend.container != null) + $(options.legend.container).html(table); + else { + var pos = "", + p = options.legend.position, + m = options.legend.margin; + if (m[0] == null) + m = [m, m]; + if (p.charAt(0) == "n") + pos += 'top:' + (m[1] + plotOffset.top) + 'px;'; + else if (p.charAt(0) == "s") + pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;'; + if (p.charAt(1) == "e") + pos += 'right:' + (m[0] + plotOffset.right) + 'px;'; + else if (p.charAt(1) == "w") + pos += 'left:' + (m[0] + plotOffset.left) + 'px;'; + var legend = $('<div class="legend">' + table.replace('style="', 'style="position:absolute;' + pos +';') + '</div>').appendTo(placeholder); + if (options.legend.backgroundOpacity != 0.0) { + // put in the transparent background + // separately to avoid blended labels and + // label boxes + var c = options.legend.backgroundColor; + if (c == null) { + c = options.grid.backgroundColor; + if (c && typeof c == "string") + c = $.color.parse(c); + else + c = $.color.extract(legend, 'background-color'); + c.a = 1; + c = c.toString(); + } + var div = legend.children(); + $('<div style="position:absolute;width:' + div.width() + 'px;height:' + div.height() + 'px;' + pos +'background-color:' + c + ';"> </div>').prependTo(legend).css('opacity', options.legend.backgroundOpacity); + } + } + } + + + // interactive features + + var highlights = [], + redrawTimeout = null; + + // returns the data item the mouse is over, or null if none is found + function findNearbyItem(mouseX, mouseY, seriesFilter) { + var maxDistance = options.grid.mouseActiveRadius, + smallestDistance = maxDistance * maxDistance + 1, + item = null, foundPoint = false, i, j; + + for (i = series.length - 1; i >= 0; --i) { + if (!seriesFilter(series[i])) + continue; + + var s = series[i], + axisx = s.xaxis, + axisy = s.yaxis, + points = s.datapoints.points, + ps = s.datapoints.pointsize, + mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster + my = axisy.c2p(mouseY), + maxx = maxDistance / axisx.scale, + maxy = maxDistance / axisy.scale; + + // with inverse transforms, we can't use the maxx/maxy + // optimization, sadly + if (axisx.options.inverseTransform) + maxx = Number.MAX_VALUE; + if (axisy.options.inverseTransform) + maxy = Number.MAX_VALUE; + + if (s.lines.show || s.points.show) { + for (j = 0; j < points.length; j += ps) { + var x = points[j], y = points[j + 1]; + if (x == null) + continue; + + // For points and lines, the cursor must be within a + // certain distance to the data point + if (x - mx > maxx || x - mx < -maxx || + y - my > maxy || y - my < -maxy) + continue; + + // We have to calculate distances in pixels, not in + // data units, because the scales of the axes may be different + var dx = Math.abs(axisx.p2c(x) - mouseX), + dy = Math.abs(axisy.p2c(y) - mouseY), + dist = dx * dx + dy * dy; // we save the sqrt + + // use <= to ensure last point takes precedence + // (last generally means on top of) + if (dist < smallestDistance) { + smallestDistance = dist; + item = [i, j / ps]; + } + } + } + + if (s.bars.show && !item) { // no other point can be nearby + var barLeft = s.bars.align == "left" ? 0 : -s.bars.barWidth/2, + barRight = barLeft + s.bars.barWidth; + + for (j = 0; j < points.length; j += ps) { + var x = points[j], y = points[j + 1], b = points[j + 2]; + if (x == null) + continue; + + // for a bar graph, the cursor must be inside the bar + if (series[i].bars.horizontal ? + (mx <= Math.max(b, x) && mx >= Math.min(b, x) && + my >= y + barLeft && my <= y + barRight) : + (mx >= x + barLeft && mx <= x + barRight && + my >= Math.min(b, y) && my <= Math.max(b, y))) + item = [i, j / ps]; + } + } + } + + if (item) { + i = item[0]; + j = item[1]; + ps = series[i].datapoints.pointsize; + + return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps), + dataIndex: j, + series: series[i], + seriesIndex: i }; + } + + return null; + } + + function onMouseMove(e) { + if (options.grid.hoverable) + triggerClickHoverEvent("plothover", e, + function (s) { return s["hoverable"] != false; }); + } + + function onMouseLeave(e) { + if (options.grid.hoverable) + triggerClickHoverEvent("plothover", e, + function (s) { return false; }); + } + + function onClick(e) { + triggerClickHoverEvent("plotclick", e, + function (s) { return s["clickable"] != false; }); + } + + // trigger click or hover event (they send the same parameters + // so we share their code) + function triggerClickHoverEvent(eventname, event, seriesFilter) { + var offset = eventHolder.offset(), + canvasX = event.pageX - offset.left - plotOffset.left, + canvasY = event.pageY - offset.top - plotOffset.top, + pos = canvasToAxisCoords({ left: canvasX, top: canvasY }); + + pos.pageX = event.pageX; + pos.pageY = event.pageY; + + var item = findNearbyItem(canvasX, canvasY, seriesFilter); + + if (item) { + // fill in mouse pos for any listeners out there + item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left); + item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top); + } + + if (options.grid.autoHighlight) { + // clear auto-highlights + for (var i = 0; i < highlights.length; ++i) { + var h = highlights[i]; + if (h.auto == eventname && + !(item && h.series == item.series && + h.point[0] == item.datapoint[0] && + h.point[1] == item.datapoint[1])) + unhighlight(h.series, h.point); + } + + if (item) + highlight(item.series, item.datapoint, eventname); + } + + placeholder.trigger(eventname, [ pos, item ]); + } + + function triggerRedrawOverlay() { + if (!redrawTimeout) + redrawTimeout = setTimeout(drawOverlay, 30); + } + + function drawOverlay() { + redrawTimeout = null; + + // draw highlights + octx.save(); + octx.clearRect(0, 0, canvasWidth, canvasHeight); + octx.translate(plotOffset.left, plotOffset.top); + + var i, hi; + for (i = 0; i < highlights.length; ++i) { + hi = highlights[i]; + + if (hi.series.bars.show) + drawBarHighlight(hi.series, hi.point); + else + drawPointHighlight(hi.series, hi.point); + } + octx.restore(); + + executeHooks(hooks.drawOverlay, [octx]); + } + + function highlight(s, point, auto) { + if (typeof s == "number") + s = series[s]; + + if (typeof point == "number") { + var ps = s.datapoints.pointsize; + point = s.datapoints.points.slice(ps * point, ps * (point + 1)); + } + + var i = indexOfHighlight(s, point); + if (i == -1) { + highlights.push({ series: s, point: point, auto: auto }); + + triggerRedrawOverlay(); + } + else if (!auto) + highlights[i].auto = false; + } + + function unhighlight(s, point) { + if (s == null && point == null) { + highlights = []; + triggerRedrawOverlay(); + } + + if (typeof s == "number") + s = series[s]; + + if (typeof point == "number") + point = s.data[point]; + + var i = indexOfHighlight(s, point); + if (i != -1) { + highlights.splice(i, 1); + + triggerRedrawOverlay(); + } + } + + function indexOfHighlight(s, p) { + for (var i = 0; i < highlights.length; ++i) { + var h = highlights[i]; + if (h.series == s && h.point[0] == p[0] + && h.point[1] == p[1]) + return i; + } + return -1; + } + + function drawPointHighlight(series, point) { + var x = point[0], y = point[1], + axisx = series.xaxis, axisy = series.yaxis; + + if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) + return; + + var pointRadius = series.points.radius + series.points.lineWidth / 2; + octx.lineWidth = pointRadius; + octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString(); + var radius = 1.5 * pointRadius, + x = axisx.p2c(x), + y = axisy.p2c(y); + + octx.beginPath(); + if (series.points.symbol == "circle") + octx.arc(x, y, radius, 0, 2 * Math.PI, false); + else + series.points.symbol(octx, x, y, radius, false); + octx.closePath(); + octx.stroke(); + } + + function drawBarHighlight(series, point) { + octx.lineWidth = series.bars.lineWidth; + octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString(); + var fillStyle = $.color.parse(series.color).scale('a', 0.5).toString(); + var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2; + drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth, + 0, function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth); + } + + function getColorOrGradient(spec, bottom, top, defaultColor) { + if (typeof spec == "string") + return spec; + else { + // assume this is a gradient spec; IE currently only + // supports a simple vertical gradient properly, so that's + // what we support too + var gradient = ctx.createLinearGradient(0, top, 0, bottom); + + for (var i = 0, l = spec.colors.length; i < l; ++i) { + var c = spec.colors[i]; + if (typeof c != "string") { + var co = $.color.parse(defaultColor); + if (c.brightness != null) + co = co.scale('rgb', c.brightness) + if (c.opacity != null) + co.a *= c.opacity; + c = co.toString(); + } + gradient.addColorStop(i / (l - 1), c); + } + + return gradient; + } + } + } + + $.plot = function(placeholder, data, options) { + //var t0 = new Date(); + var plot = new Plot($(placeholder), data, options, $.plot.plugins); + //(window.console ? console.log : alert)("time used (msecs): " + ((new Date()).getTime() - t0.getTime())); + return plot; + }; + + $.plot.version = "0.7"; + + $.plot.plugins = []; + + // returns a string with the date d formatted according to fmt + $.plot.formatDate = function(d, fmt, monthNames) { + var leftPad = function(n) { + n = "" + n; + return n.length == 1 ? "0" + n : n; + }; + + var r = []; + var escape = false, padNext = false; + var hours = d.getUTCHours(); + var isAM = hours < 12; + if (monthNames == null) + monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + + if (fmt.search(/%p|%P/) != -1) { + if (hours > 12) { + hours = hours - 12; + } else if (hours == 0) { + hours = 12; + } + } + for (var i = 0; i < fmt.length; ++i) { + var c = fmt.charAt(i); + + if (escape) { + switch (c) { + case 'h': c = "" + hours; break; + case 'H': c = leftPad(hours); break; + case 'M': c = leftPad(d.getUTCMinutes()); break; + case 'S': c = leftPad(d.getUTCSeconds()); break; + case 'd': c = "" + d.getUTCDate(); break; + case 'm': c = "" + (d.getUTCMonth() + 1); break; + case 'y': c = "" + d.getUTCFullYear(); break; + case 'b': c = "" + monthNames[d.getUTCMonth()]; break; + case 'p': c = (isAM) ? ("" + "am") : ("" + "pm"); break; + case 'P': c = (isAM) ? ("" + "AM") : ("" + "PM"); break; + case '0': c = ""; padNext = true; break; + } + if (c && padNext) { + c = leftPad(c); + padNext = false; + } + r.push(c); + if (!padNext) + escape = false; + } + else { + if (c == "%") + escape = true; + else + r.push(c); + } + } + return r.join(""); + }; + + // round to nearby lower multiple of base + function floorInBase(n, base) { + return base * Math.floor(n / base); + } + +})(jQuery); diff --git a/theme/bootstrap/js/plugins/flot/jquery.flot.pie.js b/theme/bootstrap/js/plugins/flot/jquery.flot.pie.js new file mode 100644 index 0000000..b46c03c --- /dev/null +++ b/theme/bootstrap/js/plugins/flot/jquery.flot.pie.js @@ -0,0 +1,750 @@ +/* +Flot plugin for rendering pie charts. The plugin assumes the data is +coming is as a single data value for each series, and each of those +values is a positive value or zero (negative numbers don't make +any sense and will cause strange effects). The data values do +NOT need to be passed in as percentage values because it +internally calculates the total and percentages. + +* Created by Brian Medendorp, June 2009 +* Updated November 2009 with contributions from: btburnett3, Anthony Aragues and Xavi Ivars + +* Changes: + 2009-10-22: lineJoin set to round + 2009-10-23: IE full circle fix, donut + 2009-11-11: Added basic hover from btburnett3 - does not work in IE, and center is off in Chrome and Opera + 2009-11-17: Added IE hover capability submitted by Anthony Aragues + 2009-11-18: Added bug fix submitted by Xavi Ivars (issues with arrays when other JS libraries are included as well) + + +Available options are: +series: { + pie: { + show: true/false + radius: 0-1 for percentage of fullsize, or a specified pixel length, or 'auto' + innerRadius: 0-1 for percentage of fullsize or a specified pixel length, for creating a donut effect + startAngle: 0-2 factor of PI used for starting angle (in radians) i.e 3/2 starts at the top, 0 and 2 have the same result + tilt: 0-1 for percentage to tilt the pie, where 1 is no tilt, and 0 is completely flat (nothing will show) + offset: { + top: integer value to move the pie up or down + left: integer value to move the pie left or right, or 'auto' + }, + stroke: { + color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#FFF') + width: integer pixel width of the stroke + }, + label: { + show: true/false, or 'auto' + formatter: a user-defined function that modifies the text/style of the label text + radius: 0-1 for percentage of fullsize, or a specified pixel length + background: { + color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#000') + opacity: 0-1 + }, + threshold: 0-1 for the percentage value at which to hide labels (if they're too small) + }, + combine: { + threshold: 0-1 for the percentage value at which to combine slices (if they're too small) + color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#CCC'), if null, the plugin will automatically use the color of the first slice to be combined + label: any text value of what the combined slice should be labeled + } + highlight: { + opacity: 0-1 + } + } +} + +More detail and specific examples can be found in the included HTML file. + +*/ + +(function ($) +{ + function init(plot) // this is the "body" of the plugin + { + var canvas = null; + var target = null; + var maxRadius = null; + var centerLeft = null; + var centerTop = null; + var total = 0; + var redraw = true; + var redrawAttempts = 10; + var shrink = 0.95; + var legendWidth = 0; + var processed = false; + var raw = false; + + // interactive variables + var highlights = []; + + // add hook to determine if pie plugin in enabled, and then perform necessary operations + plot.hooks.processOptions.push(checkPieEnabled); + plot.hooks.bindEvents.push(bindEvents); + + // check to see if the pie plugin is enabled + function checkPieEnabled(plot, options) + { + if (options.series.pie.show) + { + //disable grid + options.grid.show = false; + + // set labels.show + if (options.series.pie.label.show=='auto') + if (options.legend.show) + options.series.pie.label.show = false; + else + options.series.pie.label.show = true; + + // set radius + if (options.series.pie.radius=='auto') + if (options.series.pie.label.show) + options.series.pie.radius = 3/4; + else + options.series.pie.radius = 1; + + // ensure sane tilt + if (options.series.pie.tilt>1) + options.series.pie.tilt=1; + if (options.series.pie.tilt<0) + options.series.pie.tilt=0; + + // add processData hook to do transformations on the data + plot.hooks.processDatapoints.push(processDatapoints); + plot.hooks.drawOverlay.push(drawOverlay); + + // add draw hook + plot.hooks.draw.push(draw); + } + } + + // bind hoverable events + function bindEvents(plot, eventHolder) + { + var options = plot.getOptions(); + + if (options.series.pie.show && options.grid.hoverable) + eventHolder.unbind('mousemove').mousemove(onMouseMove); + + if (options.series.pie.show && options.grid.clickable) + eventHolder.unbind('click').click(onClick); + } + + + // debugging function that prints out an object + function alertObject(obj) + { + var msg = ''; + function traverse(obj, depth) + { + if (!depth) + depth = 0; + for (var i = 0; i < obj.length; ++i) + { + for (var j=0; j<depth; j++) + msg += '\t'; + + if( typeof obj[i] == "object") + { // its an object + msg += ''+i+':\n'; + traverse(obj[i], depth+1); + } + else + { // its a value + msg += ''+i+': '+obj[i]+'\n'; + } + } + } + traverse(obj); + alert(msg); + } + + function calcTotal(data) + { + for (var i = 0; i < data.length; ++i) + { + var item = parseFloat(data[i].data[0][1]); + if (item) + total += item; + } + } + + function processDatapoints(plot, series, data, datapoints) + { + if (!processed) + { + processed = true; + + canvas = plot.getCanvas(); + target = $(canvas).parent(); + options = plot.getOptions(); + + plot.setData(combine(plot.getData())); + } + } + + function setupPie() + { + legendWidth = target.children().filter('.legend').children().width(); + + // calculate maximum radius and center point + maxRadius = Math.min(canvas.width,(canvas.height/options.series.pie.tilt))/2; + centerTop = (canvas.height/2)+options.series.pie.offset.top; + centerLeft = (canvas.width/2); + + if (options.series.pie.offset.left=='auto') + if (options.legend.position.match('w')) + centerLeft += legendWidth/2; + else + centerLeft -= legendWidth/2; + else + centerLeft += options.series.pie.offset.left; + + if (centerLeft<maxRadius) + centerLeft = maxRadius; + else if (centerLeft>canvas.width-maxRadius) + centerLeft = canvas.width-maxRadius; + } + + function fixData(data) + { + for (var i = 0; i < data.length; ++i) + { + if (typeof(data[i].data)=='number') + data[i].data = [[1,data[i].data]]; + else if (typeof(data[i].data)=='undefined' || typeof(data[i].data[0])=='undefined') + { + if (typeof(data[i].data)!='undefined' && typeof(data[i].data.label)!='undefined') + data[i].label = data[i].data.label; // fix weirdness coming from flot + data[i].data = [[1,0]]; + + } + } + return data; + } + + function combine(data) + { + data = fixData(data); + calcTotal(data); + var combined = 0; + var numCombined = 0; + var color = options.series.pie.combine.color; + + var newdata = []; + for (var i = 0; i < data.length; ++i) + { + // make sure its a number + data[i].data[0][1] = parseFloat(data[i].data[0][1]); + if (!data[i].data[0][1]) + data[i].data[0][1] = 0; + + if (data[i].data[0][1]/total<=options.series.pie.combine.threshold) + { + combined += data[i].data[0][1]; + numCombined++; + if (!color) + color = data[i].color; + } + else + { + newdata.push({ + data: [[1,data[i].data[0][1]]], + color: data[i].color, + label: data[i].label, + angle: (data[i].data[0][1]*(Math.PI*2))/total, + percent: (data[i].data[0][1]/total*100) + }); + } + } + if (numCombined>0) + newdata.push({ + data: [[1,combined]], + color: color, + label: options.series.pie.combine.label, + angle: (combined*(Math.PI*2))/total, + percent: (combined/total*100) + }); + return newdata; + } + + function draw(plot, newCtx) + { + if (!target) return; // if no series were passed + ctx = newCtx; + + setupPie(); + var slices = plot.getData(); + + var attempts = 0; + while (redraw && attempts<redrawAttempts) + { + redraw = false; + if (attempts>0) + maxRadius *= shrink; + attempts += 1; + clear(); + if (options.series.pie.tilt<=0.8) + drawShadow(); + drawPie(); + } + if (attempts >= redrawAttempts) { + clear(); + target.prepend('<div class="error">Could not draw pie with labels contained inside canvas</div>'); + } + + if ( plot.setSeries && plot.insertLegend ) + { + plot.setSeries(slices); + plot.insertLegend(); + } + + // we're actually done at this point, just defining internal functions at this point + + function clear() + { + ctx.clearRect(0,0,canvas.width,canvas.height); + target.children().filter('.pieLabel, .pieLabelBackground').remove(); + } + + function drawShadow() + { + var shadowLeft = 5; + var shadowTop = 15; + var edge = 10; + var alpha = 0.02; + + // set radius + if (options.series.pie.radius>1) + var radius = options.series.pie.radius; + else + var radius = maxRadius * options.series.pie.radius; + + if (radius>=(canvas.width/2)-shadowLeft || radius*options.series.pie.tilt>=(canvas.height/2)-shadowTop || radius<=edge) + return; // shadow would be outside canvas, so don't draw it + + ctx.save(); + ctx.translate(shadowLeft,shadowTop); + ctx.globalAlpha = alpha; + ctx.fillStyle = '#000'; + + // center and rotate to starting position + ctx.translate(centerLeft,centerTop); + ctx.scale(1, options.series.pie.tilt); + + //radius -= edge; + for (var i=1; i<=edge; i++) + { + ctx.beginPath(); + ctx.arc(0,0,radius,0,Math.PI*2,false); + ctx.fill(); + radius -= i; + } + + ctx.restore(); + } + + function drawPie() + { + startAngle = Math.PI*options.series.pie.startAngle; + + // set radius + if (options.series.pie.radius>1) + var radius = options.series.pie.radius; + else + var radius = maxRadius * options.series.pie.radius; + + // center and rotate to starting position + ctx.save(); + ctx.translate(centerLeft,centerTop); + ctx.scale(1, options.series.pie.tilt); + //ctx.rotate(startAngle); // start at top; -- This doesn't work properly in Opera + + // draw slices + ctx.save(); + var currentAngle = startAngle; + for (var i = 0; i < slices.length; ++i) + { + slices[i].startAngle = currentAngle; + drawSlice(slices[i].angle, slices[i].color, true); + } + ctx.restore(); + + // draw slice outlines + ctx.save(); + ctx.lineWidth = options.series.pie.stroke.width; + currentAngle = startAngle; + for (var i = 0; i < slices.length; ++i) + drawSlice(slices[i].angle, options.series.pie.stroke.color, false); + ctx.restore(); + + // draw donut hole + drawDonutHole(ctx); + + // draw labels + if (options.series.pie.label.show) + drawLabels(); + + // restore to original state + ctx.restore(); + + function drawSlice(angle, color, fill) + { + if (angle<=0) + return; + + if (fill) + ctx.fillStyle = color; + else + { + ctx.strokeStyle = color; + ctx.lineJoin = 'round'; + } + + ctx.beginPath(); + if (Math.abs(angle - Math.PI*2) > 0.000000001) + ctx.moveTo(0,0); // Center of the pie + else if ($.browser.msie) + angle -= 0.0001; + //ctx.arc(0,0,radius,0,angle,false); // This doesn't work properly in Opera + ctx.arc(0,0,radius,currentAngle,currentAngle+angle,false); + ctx.closePath(); + //ctx.rotate(angle); // This doesn't work properly in Opera + currentAngle += angle; + + if (fill) + ctx.fill(); + else + ctx.stroke(); + } + + function drawLabels() + { + var currentAngle = startAngle; + + // set radius + if (options.series.pie.label.radius>1) + var radius = options.series.pie.label.radius; + else + var radius = maxRadius * options.series.pie.label.radius; + + for (var i = 0; i < slices.length; ++i) + { + if (slices[i].percent >= options.series.pie.label.threshold*100) + drawLabel(slices[i], currentAngle, i); + currentAngle += slices[i].angle; + } + + function drawLabel(slice, startAngle, index) + { + if (slice.data[0][1]==0) + return; + + // format label text + var lf = options.legend.labelFormatter, text, plf = options.series.pie.label.formatter; + if (lf) + text = lf(slice.label, slice); + else + text = slice.label; + if (plf) + text = plf(text, slice); + + var halfAngle = ((startAngle+slice.angle) + startAngle)/2; + var x = centerLeft + Math.round(Math.cos(halfAngle) * radius); + var y = centerTop + Math.round(Math.sin(halfAngle) * radius) * options.series.pie.tilt; + + var html = '<span class="pieLabel" id="pieLabel'+index+'" style="position:absolute;top:' + y + 'px;left:' + x + 'px;">' + text + "</span>"; + target.append(html); + var label = target.children('#pieLabel'+index); + var labelTop = (y - label.height()/2); + var labelLeft = (x - label.width()/2); + label.css('top', labelTop); + label.css('left', labelLeft); + + // check to make sure that the label is not outside the canvas + if (0-labelTop>0 || 0-labelLeft>0 || canvas.height-(labelTop+label.height())<0 || canvas.width-(labelLeft+label.width())<0) + redraw = true; + + if (options.series.pie.label.background.opacity != 0) { + // put in the transparent background separately to avoid blended labels and label boxes + var c = options.series.pie.label.background.color; + if (c == null) { + c = slice.color; + } + var pos = 'top:'+labelTop+'px;left:'+labelLeft+'px;'; + $('<div class="pieLabelBackground" style="position:absolute;width:' + label.width() + 'px;height:' + label.height() + 'px;' + pos +'background-color:' + c + ';"> </div>').insertBefore(label).css('opacity', options.series.pie.label.background.opacity); + } + } // end individual label function + } // end drawLabels function + } // end drawPie function + } // end draw function + + // Placed here because it needs to be accessed from multiple locations + function drawDonutHole(layer) + { + // draw donut hole + if(options.series.pie.innerRadius > 0) + { + // subtract the center + layer.save(); + innerRadius = options.series.pie.innerRadius > 1 ? options.series.pie.innerRadius : maxRadius * options.series.pie.innerRadius; + layer.globalCompositeOperation = 'destination-out'; // this does not work with excanvas, but it will fall back to using the stroke color + layer.beginPath(); + layer.fillStyle = options.series.pie.stroke.color; + layer.arc(0,0,innerRadius,0,Math.PI*2,false); + layer.fill(); + layer.closePath(); + layer.restore(); + + // add inner stroke + layer.save(); + layer.beginPath(); + layer.strokeStyle = options.series.pie.stroke.color; + layer.arc(0,0,innerRadius,0,Math.PI*2,false); + layer.stroke(); + layer.closePath(); + layer.restore(); + // TODO: add extra shadow inside hole (with a mask) if the pie is tilted. + } + } + + //-- Additional Interactive related functions -- + + function isPointInPoly(poly, pt) + { + for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i) + ((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || (poly[j][1] <= pt[1] && pt[1]< poly[i][1])) + && (pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0]) + && (c = !c); + return c; + } + + function findNearbySlice(mouseX, mouseY) + { + var slices = plot.getData(), + options = plot.getOptions(), + radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; + + for (var i = 0; i < slices.length; ++i) + { + var s = slices[i]; + + if(s.pie.show) + { + ctx.save(); + ctx.beginPath(); + ctx.moveTo(0,0); // Center of the pie + //ctx.scale(1, options.series.pie.tilt); // this actually seems to break everything when here. + ctx.arc(0,0,radius,s.startAngle,s.startAngle+s.angle,false); + ctx.closePath(); + x = mouseX-centerLeft; + y = mouseY-centerTop; + if(ctx.isPointInPath) + { + if (ctx.isPointInPath(mouseX-centerLeft, mouseY-centerTop)) + { + //alert('found slice!'); + ctx.restore(); + return {datapoint: [s.percent, s.data], dataIndex: 0, series: s, seriesIndex: i}; + } + } + else + { + // excanvas for IE doesn;t support isPointInPath, this is a workaround. + p1X = (radius * Math.cos(s.startAngle)); + p1Y = (radius * Math.sin(s.startAngle)); + p2X = (radius * Math.cos(s.startAngle+(s.angle/4))); + p2Y = (radius * Math.sin(s.startAngle+(s.angle/4))); + p3X = (radius * Math.cos(s.startAngle+(s.angle/2))); + p3Y = (radius * Math.sin(s.startAngle+(s.angle/2))); + p4X = (radius * Math.cos(s.startAngle+(s.angle/1.5))); + p4Y = (radius * Math.sin(s.startAngle+(s.angle/1.5))); + p5X = (radius * Math.cos(s.startAngle+s.angle)); + p5Y = (radius * Math.sin(s.startAngle+s.angle)); + arrPoly = [[0,0],[p1X,p1Y],[p2X,p2Y],[p3X,p3Y],[p4X,p4Y],[p5X,p5Y]]; + arrPoint = [x,y]; + // TODO: perhaps do some mathmatical trickery here with the Y-coordinate to compensate for pie tilt? + if(isPointInPoly(arrPoly, arrPoint)) + { + ctx.restore(); + return {datapoint: [s.percent, s.data], dataIndex: 0, series: s, seriesIndex: i}; + } + } + ctx.restore(); + } + } + + return null; + } + + function onMouseMove(e) + { + triggerClickHoverEvent('plothover', e); + } + + function onClick(e) + { + triggerClickHoverEvent('plotclick', e); + } + + // trigger click or hover event (they send the same parameters so we share their code) + function triggerClickHoverEvent(eventname, e) + { + var offset = plot.offset(), + canvasX = parseInt(e.pageX - offset.left), + canvasY = parseInt(e.pageY - offset.top), + item = findNearbySlice(canvasX, canvasY); + + if (options.grid.autoHighlight) + { + // clear auto-highlights + for (var i = 0; i < highlights.length; ++i) + { + var h = highlights[i]; + if (h.auto == eventname && !(item && h.series == item.series)) + unhighlight(h.series); + } + } + + // highlight the slice + if (item) + highlight(item.series, eventname); + + // trigger any hover bind events + var pos = { pageX: e.pageX, pageY: e.pageY }; + target.trigger(eventname, [ pos, item ]); + } + + function highlight(s, auto) + { + if (typeof s == "number") + s = series[s]; + + var i = indexOfHighlight(s); + if (i == -1) + { + highlights.push({ series: s, auto: auto }); + plot.triggerRedrawOverlay(); + } + else if (!auto) + highlights[i].auto = false; + } + + function unhighlight(s) + { + if (s == null) + { + highlights = []; + plot.triggerRedrawOverlay(); + } + + if (typeof s == "number") + s = series[s]; + + var i = indexOfHighlight(s); + if (i != -1) + { + highlights.splice(i, 1); + plot.triggerRedrawOverlay(); + } + } + + function indexOfHighlight(s) + { + for (var i = 0; i < highlights.length; ++i) + { + var h = highlights[i]; + if (h.series == s) + return i; + } + return -1; + } + + function drawOverlay(plot, octx) + { + //alert(options.series.pie.radius); + var options = plot.getOptions(); + //alert(options.series.pie.radius); + + var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; + + octx.save(); + octx.translate(centerLeft, centerTop); + octx.scale(1, options.series.pie.tilt); + + for (i = 0; i < highlights.length; ++i) + drawHighlight(highlights[i].series); + + drawDonutHole(octx); + + octx.restore(); + + function drawHighlight(series) + { + if (series.angle < 0) return; + + //octx.fillStyle = parseColor(options.series.pie.highlight.color).scale(null, null, null, options.series.pie.highlight.opacity).toString(); + octx.fillStyle = "rgba(255, 255, 255, "+options.series.pie.highlight.opacity+")"; // this is temporary until we have access to parseColor + + octx.beginPath(); + if (Math.abs(series.angle - Math.PI*2) > 0.000000001) + octx.moveTo(0,0); // Center of the pie + octx.arc(0,0,radius,series.startAngle,series.startAngle+series.angle,false); + octx.closePath(); + octx.fill(); + } + + } + + } // end init (plugin body) + + // define pie specific options and their default values + var options = { + series: { + pie: { + show: false, + radius: 'auto', // actual radius of the visible pie (based on full calculated radius if <=1, or hard pixel value) + innerRadius:0, /* for donut */ + startAngle: 3/2, + tilt: 1, + offset: { + top: 0, + left: 'auto' + }, + stroke: { + color: '#FFF', + width: 1 + }, + label: { + show: 'auto', + formatter: function(label, slice){ + return '<div style="font-size:x-small;text-align:center;padding:2px;color:'+slice.color+';">'+label+'<br/>'+Math.round(slice.percent)+'%</div>'; + }, // formatter function + radius: 1, // radius at which to place the labels (based on full calculated radius if <=1, or hard pixel value) + background: { + color: null, + opacity: 0 + }, + threshold: 0 // percentage at which to hide the label (i.e. the slice is too narrow) + }, + combine: { + threshold: -1, // percentage at which to combine little slices into one larger slice + color: null, // color to give the new slice (auto-generated if null) + label: 'Other' // label to give the new slice + }, + highlight: { + //color: '#FFF', // will add this functionality once parseColor is available + opacity: 0.5 + } + } + } + }; + + $.plot.plugins.push({ + init: init, + options: options, + name: "pie", + version: "1.0" + }); +})(jQuery); diff --git a/theme/bootstrap/js/plugins/flot/jquery.flot.resize.js b/theme/bootstrap/js/plugins/flot/jquery.flot.resize.js new file mode 100644 index 0000000..1178425 --- /dev/null +++ b/theme/bootstrap/js/plugins/flot/jquery.flot.resize.js @@ -0,0 +1,60 @@ +/* Flot plugin for automatically redrawing plots as the placeholder resizes. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +It works by listening for changes on the placeholder div (through the jQuery +resize event plugin) - if the size changes, it will redraw the plot. + +There are no options. If you need to disable the plugin for some plots, you +can just fix the size of their placeholders. + +*/ + +/* Inline dependency: + * jQuery resize event - v1.1 - 3/14/2010 + * http://benalman.com/projects/jquery-resize-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ + +(function($,h,c){var a=$([]),e=$.resize=$.extend($.resize,{}),i,k="setTimeout",j="resize",d=j+"-special-event",b="delay",f="throttleWindow";e[b]=250;e[f]=true;$.event.special[j]={setup:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.add(l);$.data(this,d,{w:l.width(),h:l.height()});if(a.length===1){g()}},teardown:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.not(l);l.removeData(d);if(!a.length){clearTimeout(i)}},add:function(l){if(!e[f]&&this[k]){return false}var n;function m(s,o,p){var q=$(this),r=$.data(this,d);r.w=o!==c?o:q.width();r.h=p!==c?p:q.height();n.apply(this,arguments)}if($.isFunction(l)){n=l;return m}else{n=l.handler;l.handler=m}}};function g(){i=h[k](function(){a.each(function(){var n=$(this),m=n.width(),l=n.height(),o=$.data(this,d);if(m!==o.w||l!==o.h){n.trigger(j,[o.w=m,o.h=l])}});g()},e[b])}})(jQuery,this); + +(function ($) { + var options = { }; // no options + + function init(plot) { + function onResize() { + var placeholder = plot.getPlaceholder(); + + // somebody might have hidden us and we can't plot + // when we don't have the dimensions + if (placeholder.width() == 0 || placeholder.height() == 0) + return; + + plot.resize(); + plot.setupGrid(); + plot.draw(); + } + + function bindEvents(plot, eventHolder) { + plot.getPlaceholder().resize(onResize); + } + + function shutdown(plot, eventHolder) { + plot.getPlaceholder().unbind("resize", onResize); + } + + plot.hooks.bindEvents.push(bindEvents); + plot.hooks.shutdown.push(shutdown); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'resize', + version: '1.0' + }); +})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/js/plugins/flot/jquery.flot.tooltip.min.js b/theme/bootstrap/js/plugins/flot/jquery.flot.tooltip.min.js new file mode 100644 index 0000000..09e3bbf --- /dev/null +++ b/theme/bootstrap/js/plugins/flot/jquery.flot.tooltip.min.js @@ -0,0 +1,12 @@ +/* + * jquery.flot.tooltip + * + * description: easy-to-use tooltips for Flot charts + * version: 0.6.2 + * author: Krzysztof Urbas @krzysu [myviews.pl] + * website: https://github.com/krzysu/flot.tooltip + * + * build on 2013-09-30 + * released under MIT License, 2012 +*/ +(function(t){var o={tooltip:!1,tooltipOpts:{content:"%s | X: %x | Y: %y",xDateFormat:null,yDateFormat:null,shifts:{x:10,y:20},defaultTheme:!0,onHover:function(){}}},i=function(t){this.tipPosition={x:0,y:0},this.init(t)};i.prototype.init=function(o){function i(t){var o={};o.x=t.pageX,o.y=t.pageY,s.updateTooltipPosition(o)}function e(t,o,i){var e=s.getDomElement();if(i){var n;n=s.stringFormat(s.tooltipOptions.content,i),e.html(n),s.updateTooltipPosition({x:o.pageX,y:o.pageY}),e.css({left:s.tipPosition.x+s.tooltipOptions.shifts.x,top:s.tipPosition.y+s.tooltipOptions.shifts.y}).show(),"function"==typeof s.tooltipOptions.onHover&&s.tooltipOptions.onHover(i,e)}else e.hide().html("")}var s=this;o.hooks.bindEvents.push(function(o,n){s.plotOptions=o.getOptions(),s.plotOptions.tooltip!==!1&&void 0!==s.plotOptions.tooltip&&(s.tooltipOptions=s.plotOptions.tooltipOpts,s.getDomElement(),t(o.getPlaceholder()).bind("plothover",e),t(n).bind("mousemove",i))}),o.hooks.shutdown.push(function(o,s){t(o.getPlaceholder()).unbind("plothover",e),t(s).unbind("mousemove",i)})},i.prototype.getDomElement=function(){var o;return t("#flotTip").length>0?o=t("#flotTip"):(o=t("<div />").attr("id","flotTip"),o.appendTo("body").hide().css({position:"absolute"}),this.tooltipOptions.defaultTheme&&o.css({background:"#fff","z-index":"100",padding:"0.4em 0.6em","border-radius":"0.5em","font-size":"0.8em",border:"1px solid #111",display:"none","white-space":"nowrap"})),o},i.prototype.updateTooltipPosition=function(o){var i=t("#flotTip").outerWidth()+this.tooltipOptions.shifts.x,e=t("#flotTip").outerHeight()+this.tooltipOptions.shifts.y;o.x-t(window).scrollLeft()>t(window).innerWidth()-i&&(o.x-=i),o.y-t(window).scrollTop()>t(window).innerHeight()-e&&(o.y-=e),this.tipPosition.x=o.x,this.tipPosition.y=o.y},i.prototype.stringFormat=function(t,o){var i=/%p\.{0,1}(\d{0,})/,e=/%s/,s=/%x\.{0,1}(?:\d{0,})/,n=/%y\.{0,1}(?:\d{0,})/;return"function"==typeof t&&(t=t(o.series.label,o.series.data[o.dataIndex][0],o.series.data[o.dataIndex][1],o)),o.series.percent!==void 0&&(t=this.adjustValPrecision(i,t,o.series.percent)),o.series.label!==void 0&&(t=t.replace(e,o.series.label)),this.isTimeMode("xaxis",o)&&this.isXDateFormat(o)&&(t=t.replace(s,this.timestampToDate(o.series.data[o.dataIndex][0],this.tooltipOptions.xDateFormat))),this.isTimeMode("yaxis",o)&&this.isYDateFormat(o)&&(t=t.replace(n,this.timestampToDate(o.series.data[o.dataIndex][1],this.tooltipOptions.yDateFormat))),"number"==typeof o.series.data[o.dataIndex][0]&&(t=this.adjustValPrecision(s,t,o.series.data[o.dataIndex][0])),"number"==typeof o.series.data[o.dataIndex][1]&&(t=this.adjustValPrecision(n,t,o.series.data[o.dataIndex][1])),o.series.xaxis.tickFormatter!==void 0&&(t=t.replace(s,o.series.xaxis.tickFormatter(o.series.data[o.dataIndex][0],o.series.xaxis))),o.series.yaxis.tickFormatter!==void 0&&(t=t.replace(n,o.series.yaxis.tickFormatter(o.series.data[o.dataIndex][1],o.series.yaxis))),t},i.prototype.isTimeMode=function(t,o){return o.series[t].options.mode!==void 0&&"time"===o.series[t].options.mode},i.prototype.isXDateFormat=function(){return this.tooltipOptions.xDateFormat!==void 0&&null!==this.tooltipOptions.xDateFormat},i.prototype.isYDateFormat=function(){return this.tooltipOptions.yDateFormat!==void 0&&null!==this.tooltipOptions.yDateFormat},i.prototype.timestampToDate=function(o,i){var e=new Date(o);return t.plot.formatDate(e,i)},i.prototype.adjustValPrecision=function(t,o,i){var e,s=o.match(t);return null!==s&&""!==RegExp.$1&&(e=RegExp.$1,i=i.toFixed(e),o=o.replace(t,i)),o};var e=function(t){new i(t)};t.plot.plugins.push({init:e,options:o,name:"tooltip",version:"0.6.1"})})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/js/plugins/morris/morris-data.js b/theme/bootstrap/js/plugins/morris/morris-data.js new file mode 100644 index 0000000..f9dcb05 --- /dev/null +++ b/theme/bootstrap/js/plugins/morris/morris-data.js @@ -0,0 +1,227 @@ +// Morris.js Charts sample data for SB Admin template + +$(function() { + + // Area Chart + Morris.Area({ + element: 'morris-area-chart', + data: [{ + period: '2010 Q1', + iphone: 2666, + ipad: null, + itouch: 2647 + }, { + period: '2010 Q2', + iphone: 2778, + ipad: 2294, + itouch: 2441 + }, { + period: '2010 Q3', + iphone: 4912, + ipad: 1969, + itouch: 2501 + }, { + period: '2010 Q4', + iphone: 3767, + ipad: 3597, + itouch: 5689 + }, { + period: '2011 Q1', + iphone: 6810, + ipad: 1914, + itouch: 2293 + }, { + period: '2011 Q2', + iphone: 5670, + ipad: 4293, + itouch: 1881 + }, { + period: '2011 Q3', + iphone: 4820, + ipad: 3795, + itouch: 1588 + }, { + period: '2011 Q4', + iphone: 15073, + ipad: 5967, + itouch: 5175 + }, { + period: '2012 Q1', + iphone: 10687, + ipad: 4460, + itouch: 2028 + }, { + period: '2012 Q2', + iphone: 8432, + ipad: 5713, + itouch: 1791 + }], + xkey: 'period', + ykeys: ['iphone', 'ipad', 'itouch'], + labels: ['iPhone', 'iPad', 'iPod Touch'], + pointSize: 2, + hideHover: 'auto', + resize: true + }); + + // Donut Chart + Morris.Donut({ + element: 'morris-donut-chart', + data: [{ + label: "Download Sales", + value: 12 + }, { + label: "In-Store Sales", + value: 30 + }, { + label: "Mail-Order Sales", + value: 20 + }], + resize: true + }); + + // Line Chart + Morris.Line({ + // ID of the element in which to draw the chart. + element: 'morris-line-chart', + // Chart data records -- each entry in this array corresponds to a point on + // the chart. + data: [{ + d: '2012-10-01', + visits: 802 + }, { + d: '2012-10-02', + visits: 783 + }, { + d: '2012-10-03', + visits: 820 + }, { + d: '2012-10-04', + visits: 839 + }, { + d: '2012-10-05', + visits: 792 + }, { + d: '2012-10-06', + visits: 859 + }, { + d: '2012-10-07', + visits: 790 + }, { + d: '2012-10-08', + visits: 1680 + }, { + d: '2012-10-09', + visits: 1592 + }, { + d: '2012-10-10', + visits: 1420 + }, { + d: '2012-10-11', + visits: 882 + }, { + d: '2012-10-12', + visits: 889 + }, { + d: '2012-10-13', + visits: 819 + }, { + d: '2012-10-14', + visits: 849 + }, { + d: '2012-10-15', + visits: 870 + }, { + d: '2012-10-16', + visits: 1063 + }, { + d: '2012-10-17', + visits: 1192 + }, { + d: '2012-10-18', + visits: 1224 + }, { + d: '2012-10-19', + visits: 1329 + }, { + d: '2012-10-20', + visits: 1329 + }, { + d: '2012-10-21', + visits: 1239 + }, { + d: '2012-10-22', + visits: 1190 + }, { + d: '2012-10-23', + visits: 1312 + }, { + d: '2012-10-24', + visits: 1293 + }, { + d: '2012-10-25', + visits: 1283 + }, { + d: '2012-10-26', + visits: 1248 + }, { + d: '2012-10-27', + visits: 1323 + }, { + d: '2012-10-28', + visits: 1390 + }, { + d: '2012-10-29', + visits: 1420 + }, { + d: '2012-10-30', + visits: 1529 + }, { + d: '2012-10-31', + visits: 1892 + }, ], + // The name of the data record attribute that contains x-visitss. + xkey: 'd', + // A list of names of data record attributes that contain y-visitss. + ykeys: ['visits'], + // Labels for the ykeys -- will be displayed when you hover over the + // chart. + labels: ['Visits'], + // Disables line smoothing + smooth: false, + resize: true + }); + + // Bar Chart + Morris.Bar({ + element: 'morris-bar-chart', + data: [{ + device: 'iPhone', + geekbench: 136 + }, { + device: 'iPhone 3G', + geekbench: 137 + }, { + device: 'iPhone 3GS', + geekbench: 275 + }, { + device: 'iPhone 4', + geekbench: 380 + }, { + device: 'iPhone 4S', + geekbench: 655 + }, { + device: 'iPhone 5', + geekbench: 1571 + }], + xkey: 'device', + ykeys: ['geekbench'], + labels: ['Geekbench'], + barRatio: 0.4, + xLabelAngle: 35, + hideHover: 'auto', + resize: true + }); + + +}); diff --git a/theme/bootstrap/js/plugins/morris/morris.js b/theme/bootstrap/js/plugins/morris/morris.js new file mode 100644 index 0000000..3a1a830 --- /dev/null +++ b/theme/bootstrap/js/plugins/morris/morris.js @@ -0,0 +1,1892 @@ +/* @license +morris.js v0.5.0 +Copyright 2014 Olly Smith All rights reserved. +Licensed under the BSD-2-Clause License. +*/ + + +(function() { + var $, Morris, minutesSpecHelper, secondsSpecHelper, + __slice = [].slice, + __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + Morris = window.Morris = {}; + + $ = jQuery; + + Morris.EventEmitter = (function() { + function EventEmitter() {} + + EventEmitter.prototype.on = function(name, handler) { + if (this.handlers == null) { + this.handlers = {}; + } + if (this.handlers[name] == null) { + this.handlers[name] = []; + } + this.handlers[name].push(handler); + return this; + }; + + EventEmitter.prototype.fire = function() { + var args, handler, name, _i, _len, _ref, _results; + name = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; + if ((this.handlers != null) && (this.handlers[name] != null)) { + _ref = this.handlers[name]; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + handler = _ref[_i]; + _results.push(handler.apply(null, args)); + } + return _results; + } + }; + + return EventEmitter; + + })(); + + Morris.commas = function(num) { + var absnum, intnum, ret, strabsnum; + if (num != null) { + ret = num < 0 ? "-" : ""; + absnum = Math.abs(num); + intnum = Math.floor(absnum).toFixed(0); + ret += intnum.replace(/(?=(?:\d{3})+$)(?!^)/g, ','); + strabsnum = absnum.toString(); + if (strabsnum.length > intnum.length) { + ret += strabsnum.slice(intnum.length); + } + return ret; + } else { + return '-'; + } + }; + + Morris.pad2 = function(number) { + return (number < 10 ? '0' : '') + number; + }; + + Morris.Grid = (function(_super) { + __extends(Grid, _super); + + function Grid(options) { + this.resizeHandler = __bind(this.resizeHandler, this); + var _this = this; + if (typeof options.element === 'string') { + this.el = $(document.getElementById(options.element)); + } else { + this.el = $(options.element); + } + if ((this.el == null) || this.el.length === 0) { + throw new Error("Graph container element not found"); + } + if (this.el.css('position') === 'static') { + this.el.css('position', 'relative'); + } + this.options = $.extend({}, this.gridDefaults, this.defaults || {}, options); + if (typeof this.options.units === 'string') { + this.options.postUnits = options.units; + } + this.raphael = new Raphael(this.el[0]); + this.elementWidth = null; + this.elementHeight = null; + this.dirty = false; + this.selectFrom = null; + if (this.init) { + this.init(); + } + this.setData(this.options.data); + this.el.bind('mousemove', function(evt) { + var left, offset, right, width, x; + offset = _this.el.offset(); + x = evt.pageX - offset.left; + if (_this.selectFrom) { + left = _this.data[_this.hitTest(Math.min(x, _this.selectFrom))]._x; + right = _this.data[_this.hitTest(Math.max(x, _this.selectFrom))]._x; + width = right - left; + return _this.selectionRect.attr({ + x: left, + width: width + }); + } else { + return _this.fire('hovermove', x, evt.pageY - offset.top); + } + }); + this.el.bind('mouseleave', function(evt) { + if (_this.selectFrom) { + _this.selectionRect.hide(); + _this.selectFrom = null; + } + return _this.fire('hoverout'); + }); + this.el.bind('touchstart touchmove touchend', function(evt) { + var offset, touch; + touch = evt.originalEvent.touches[0] || evt.originalEvent.changedTouches[0]; + offset = _this.el.offset(); + return _this.fire('hovermove', touch.pageX - offset.left, touch.pageY - offset.top); + }); + this.el.bind('click', function(evt) { + var offset; + offset = _this.el.offset(); + return _this.fire('gridclick', evt.pageX - offset.left, evt.pageY - offset.top); + }); + if (this.options.rangeSelect) { + this.selectionRect = this.raphael.rect(0, 0, 0, this.el.innerHeight()).attr({ + fill: this.options.rangeSelectColor, + stroke: false + }).toBack().hide(); + this.el.bind('mousedown', function(evt) { + var offset; + offset = _this.el.offset(); + return _this.startRange(evt.pageX - offset.left); + }); + this.el.bind('mouseup', function(evt) { + var offset; + offset = _this.el.offset(); + _this.endRange(evt.pageX - offset.left); + return _this.fire('hovermove', evt.pageX - offset.left, evt.pageY - offset.top); + }); + } + if (this.options.resize) { + $(window).bind('resize', function(evt) { + if (_this.timeoutId != null) { + window.clearTimeout(_this.timeoutId); + } + return _this.timeoutId = window.setTimeout(_this.resizeHandler, 100); + }); + } + this.el.css('-webkit-tap-highlight-color', 'rgba(0,0,0,0)'); + if (this.postInit) { + this.postInit(); + } + } + + Grid.prototype.gridDefaults = { + dateFormat: null, + axes: true, + grid: true, + gridLineColor: '#aaa', + gridStrokeWidth: 0.5, + gridTextColor: '#888', + gridTextSize: 12, + gridTextFamily: 'sans-serif', + gridTextWeight: 'normal', + hideHover: false, + yLabelFormat: null, + xLabelAngle: 0, + numLines: 5, + padding: 25, + parseTime: true, + postUnits: '', + preUnits: '', + ymax: 'auto', + ymin: 'auto 0', + goals: [], + goalStrokeWidth: 1.0, + goalLineColors: ['#666633', '#999966', '#cc6666', '#663333'], + events: [], + eventStrokeWidth: 1.0, + eventLineColors: ['#005a04', '#ccffbb', '#3a5f0b', '#005502'], + rangeSelect: null, + rangeSelectColor: '#eef', + resize: false + }; + + Grid.prototype.setData = function(data, redraw) { + var e, idx, index, maxGoal, minGoal, ret, row, step, total, y, ykey, ymax, ymin, yval, _ref; + if (redraw == null) { + redraw = true; + } + this.options.data = data; + if ((data == null) || data.length === 0) { + this.data = []; + this.raphael.clear(); + if (this.hover != null) { + this.hover.hide(); + } + return; + } + ymax = this.cumulative ? 0 : null; + ymin = this.cumulative ? 0 : null; + if (this.options.goals.length > 0) { + minGoal = Math.min.apply(Math, this.options.goals); + maxGoal = Math.max.apply(Math, this.options.goals); + ymin = ymin != null ? Math.min(ymin, minGoal) : minGoal; + ymax = ymax != null ? Math.max(ymax, maxGoal) : maxGoal; + } + this.data = (function() { + var _i, _len, _results; + _results = []; + for (index = _i = 0, _len = data.length; _i < _len; index = ++_i) { + row = data[index]; + ret = { + src: row + }; + ret.label = row[this.options.xkey]; + if (this.options.parseTime) { + ret.x = Morris.parseDate(ret.label); + if (this.options.dateFormat) { + ret.label = this.options.dateFormat(ret.x); + } else if (typeof ret.label === 'number') { + ret.label = new Date(ret.label).toString(); + } + } else { + ret.x = index; + if (this.options.xLabelFormat) { + ret.label = this.options.xLabelFormat(ret); + } + } + total = 0; + ret.y = (function() { + var _j, _len1, _ref, _results1; + _ref = this.options.ykeys; + _results1 = []; + for (idx = _j = 0, _len1 = _ref.length; _j < _len1; idx = ++_j) { + ykey = _ref[idx]; + yval = row[ykey]; + if (typeof yval === 'string') { + yval = parseFloat(yval); + } + if ((yval != null) && typeof yval !== 'number') { + yval = null; + } + if (yval != null) { + if (this.cumulative) { + total += yval; + } else { + if (ymax != null) { + ymax = Math.max(yval, ymax); + ymin = Math.min(yval, ymin); + } else { + ymax = ymin = yval; + } + } + } + if (this.cumulative && (total != null)) { + ymax = Math.max(total, ymax); + ymin = Math.min(total, ymin); + } + _results1.push(yval); + } + return _results1; + }).call(this); + _results.push(ret); + } + return _results; + }).call(this); + if (this.options.parseTime) { + this.data = this.data.sort(function(a, b) { + return (a.x > b.x) - (b.x > a.x); + }); + } + this.xmin = this.data[0].x; + this.xmax = this.data[this.data.length - 1].x; + this.events = []; + if (this.options.events.length > 0) { + if (this.options.parseTime) { + this.events = (function() { + var _i, _len, _ref, _results; + _ref = this.options.events; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + e = _ref[_i]; + _results.push(Morris.parseDate(e)); + } + return _results; + }).call(this); + } else { + this.events = this.options.events; + } + this.xmax = Math.max(this.xmax, Math.max.apply(Math, this.events)); + this.xmin = Math.min(this.xmin, Math.min.apply(Math, this.events)); + } + if (this.xmin === this.xmax) { + this.xmin -= 1; + this.xmax += 1; + } + this.ymin = this.yboundary('min', ymin); + this.ymax = this.yboundary('max', ymax); + if (this.ymin === this.ymax) { + if (ymin) { + this.ymin -= 1; + } + this.ymax += 1; + } + if (((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'y') || this.options.grid === true) { + if (this.options.ymax === this.gridDefaults.ymax && this.options.ymin === this.gridDefaults.ymin) { + this.grid = this.autoGridLines(this.ymin, this.ymax, this.options.numLines); + this.ymin = Math.min(this.ymin, this.grid[0]); + this.ymax = Math.max(this.ymax, this.grid[this.grid.length - 1]); + } else { + step = (this.ymax - this.ymin) / (this.options.numLines - 1); + this.grid = (function() { + var _i, _ref1, _ref2, _results; + _results = []; + for (y = _i = _ref1 = this.ymin, _ref2 = this.ymax; step > 0 ? _i <= _ref2 : _i >= _ref2; y = _i += step) { + _results.push(y); + } + return _results; + }).call(this); + } + } + this.dirty = true; + if (redraw) { + return this.redraw(); + } + }; + + Grid.prototype.yboundary = function(boundaryType, currentValue) { + var boundaryOption, suggestedValue; + boundaryOption = this.options["y" + boundaryType]; + if (typeof boundaryOption === 'string') { + if (boundaryOption.slice(0, 4) === 'auto') { + if (boundaryOption.length > 5) { + suggestedValue = parseInt(boundaryOption.slice(5), 10); + if (currentValue == null) { + return suggestedValue; + } + return Math[boundaryType](currentValue, suggestedValue); + } else { + if (currentValue != null) { + return currentValue; + } else { + return 0; + } + } + } else { + return parseInt(boundaryOption, 10); + } + } else { + return boundaryOption; + } + }; + + Grid.prototype.autoGridLines = function(ymin, ymax, nlines) { + var gmax, gmin, grid, smag, span, step, unit, y, ymag; + span = ymax - ymin; + ymag = Math.floor(Math.log(span) / Math.log(10)); + unit = Math.pow(10, ymag); + gmin = Math.floor(ymin / unit) * unit; + gmax = Math.ceil(ymax / unit) * unit; + step = (gmax - gmin) / (nlines - 1); + if (unit === 1 && step > 1 && Math.ceil(step) !== step) { + step = Math.ceil(step); + gmax = gmin + step * (nlines - 1); + } + if (gmin < 0 && gmax > 0) { + gmin = Math.floor(ymin / step) * step; + gmax = Math.ceil(ymax / step) * step; + } + if (step < 1) { + smag = Math.floor(Math.log(step) / Math.log(10)); + grid = (function() { + var _i, _results; + _results = []; + for (y = _i = gmin; step > 0 ? _i <= gmax : _i >= gmax; y = _i += step) { + _results.push(parseFloat(y.toFixed(1 - smag))); + } + return _results; + })(); + } else { + grid = (function() { + var _i, _results; + _results = []; + for (y = _i = gmin; step > 0 ? _i <= gmax : _i >= gmax; y = _i += step) { + _results.push(y); + } + return _results; + })(); + } + return grid; + }; + + Grid.prototype._calc = function() { + var bottomOffsets, gridLine, h, i, w, yLabelWidths, _ref, _ref1; + w = this.el.width(); + h = this.el.height(); + if (this.elementWidth !== w || this.elementHeight !== h || this.dirty) { + this.elementWidth = w; + this.elementHeight = h; + this.dirty = false; + this.left = this.options.padding; + this.right = this.elementWidth - this.options.padding; + this.top = this.options.padding; + this.bottom = this.elementHeight - this.options.padding; + if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'y') { + yLabelWidths = (function() { + var _i, _len, _ref1, _results; + _ref1 = this.grid; + _results = []; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + gridLine = _ref1[_i]; + _results.push(this.measureText(this.yAxisFormat(gridLine)).width); + } + return _results; + }).call(this); + this.left += Math.max.apply(Math, yLabelWidths); + } + if ((_ref1 = this.options.axes) === true || _ref1 === 'both' || _ref1 === 'x') { + bottomOffsets = (function() { + var _i, _ref2, _results; + _results = []; + for (i = _i = 0, _ref2 = this.data.length; 0 <= _ref2 ? _i < _ref2 : _i > _ref2; i = 0 <= _ref2 ? ++_i : --_i) { + _results.push(this.measureText(this.data[i].text, -this.options.xLabelAngle).height); + } + return _results; + }).call(this); + this.bottom -= Math.max.apply(Math, bottomOffsets); + } + this.width = Math.max(1, this.right - this.left); + this.height = Math.max(1, this.bottom - this.top); + this.dx = this.width / (this.xmax - this.xmin); + this.dy = this.height / (this.ymax - this.ymin); + if (this.calc) { + return this.calc(); + } + } + }; + + Grid.prototype.transY = function(y) { + return this.bottom - (y - this.ymin) * this.dy; + }; + + Grid.prototype.transX = function(x) { + if (this.data.length === 1) { + return (this.left + this.right) / 2; + } else { + return this.left + (x - this.xmin) * this.dx; + } + }; + + Grid.prototype.redraw = function() { + this.raphael.clear(); + this._calc(); + this.drawGrid(); + this.drawGoals(); + this.drawEvents(); + if (this.draw) { + return this.draw(); + } + }; + + Grid.prototype.measureText = function(text, angle) { + var ret, tt; + if (angle == null) { + angle = 0; + } + tt = this.raphael.text(100, 100, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).rotate(angle); + ret = tt.getBBox(); + tt.remove(); + return ret; + }; + + Grid.prototype.yAxisFormat = function(label) { + return this.yLabelFormat(label); + }; + + Grid.prototype.yLabelFormat = function(label) { + if (typeof this.options.yLabelFormat === 'function') { + return this.options.yLabelFormat(label); + } else { + return "" + this.options.preUnits + (Morris.commas(label)) + this.options.postUnits; + } + }; + + Grid.prototype.drawGrid = function() { + var lineY, y, _i, _len, _ref, _ref1, _ref2, _results; + if (this.options.grid === false && ((_ref = this.options.axes) !== true && _ref !== 'both' && _ref !== 'y')) { + return; + } + _ref1 = this.grid; + _results = []; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + lineY = _ref1[_i]; + y = this.transY(lineY); + if ((_ref2 = this.options.axes) === true || _ref2 === 'both' || _ref2 === 'y') { + this.drawYAxisLabel(this.left - this.options.padding / 2, y, this.yAxisFormat(lineY)); + } + if (this.options.grid) { + _results.push(this.drawGridLine("M" + this.left + "," + y + "H" + (this.left + this.width))); + } else { + _results.push(void 0); + } + } + return _results; + }; + + Grid.prototype.drawGoals = function() { + var color, goal, i, _i, _len, _ref, _results; + _ref = this.options.goals; + _results = []; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + goal = _ref[i]; + color = this.options.goalLineColors[i % this.options.goalLineColors.length]; + _results.push(this.drawGoal(goal, color)); + } + return _results; + }; + + Grid.prototype.drawEvents = function() { + var color, event, i, _i, _len, _ref, _results; + _ref = this.events; + _results = []; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + event = _ref[i]; + color = this.options.eventLineColors[i % this.options.eventLineColors.length]; + _results.push(this.drawEvent(event, color)); + } + return _results; + }; + + Grid.prototype.drawGoal = function(goal, color) { + return this.raphael.path("M" + this.left + "," + (this.transY(goal)) + "H" + this.right).attr('stroke', color).attr('stroke-width', this.options.goalStrokeWidth); + }; + + Grid.prototype.drawEvent = function(event, color) { + return this.raphael.path("M" + (this.transX(event)) + "," + this.bottom + "V" + this.top).attr('stroke', color).attr('stroke-width', this.options.eventStrokeWidth); + }; + + Grid.prototype.drawYAxisLabel = function(xPos, yPos, text) { + return this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor).attr('text-anchor', 'end'); + }; + + Grid.prototype.drawGridLine = function(path) { + return this.raphael.path(path).attr('stroke', this.options.gridLineColor).attr('stroke-width', this.options.gridStrokeWidth); + }; + + Grid.prototype.startRange = function(x) { + this.hover.hide(); + this.selectFrom = x; + return this.selectionRect.attr({ + x: x, + width: 0 + }).show(); + }; + + Grid.prototype.endRange = function(x) { + var end, start; + if (this.selectFrom) { + start = Math.min(this.selectFrom, x); + end = Math.max(this.selectFrom, x); + this.options.rangeSelect.call(this.el, { + start: this.data[this.hitTest(start)].x, + end: this.data[this.hitTest(end)].x + }); + return this.selectFrom = null; + } + }; + + Grid.prototype.resizeHandler = function() { + this.timeoutId = null; + this.raphael.setSize(this.el.width(), this.el.height()); + return this.redraw(); + }; + + return Grid; + + })(Morris.EventEmitter); + + Morris.parseDate = function(date) { + var isecs, m, msecs, n, o, offsetmins, p, q, r, ret, secs; + if (typeof date === 'number') { + return date; + } + m = date.match(/^(\d+) Q(\d)$/); + n = date.match(/^(\d+)-(\d+)$/); + o = date.match(/^(\d+)-(\d+)-(\d+)$/); + p = date.match(/^(\d+) W(\d+)$/); + q = date.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+)(Z|([+-])(\d\d):?(\d\d))?$/); + r = date.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+):(\d+(\.\d+)?)(Z|([+-])(\d\d):?(\d\d))?$/); + if (m) { + return new Date(parseInt(m[1], 10), parseInt(m[2], 10) * 3 - 1, 1).getTime(); + } else if (n) { + return new Date(parseInt(n[1], 10), parseInt(n[2], 10) - 1, 1).getTime(); + } else if (o) { + return new Date(parseInt(o[1], 10), parseInt(o[2], 10) - 1, parseInt(o[3], 10)).getTime(); + } else if (p) { + ret = new Date(parseInt(p[1], 10), 0, 1); + if (ret.getDay() !== 4) { + ret.setMonth(0, 1 + ((4 - ret.getDay()) + 7) % 7); + } + return ret.getTime() + parseInt(p[2], 10) * 604800000; + } else if (q) { + if (!q[6]) { + return new Date(parseInt(q[1], 10), parseInt(q[2], 10) - 1, parseInt(q[3], 10), parseInt(q[4], 10), parseInt(q[5], 10)).getTime(); + } else { + offsetmins = 0; + if (q[6] !== 'Z') { + offsetmins = parseInt(q[8], 10) * 60 + parseInt(q[9], 10); + if (q[7] === '+') { + offsetmins = 0 - offsetmins; + } + } + return Date.UTC(parseInt(q[1], 10), parseInt(q[2], 10) - 1, parseInt(q[3], 10), parseInt(q[4], 10), parseInt(q[5], 10) + offsetmins); + } + } else if (r) { + secs = parseFloat(r[6]); + isecs = Math.floor(secs); + msecs = Math.round((secs - isecs) * 1000); + if (!r[8]) { + return new Date(parseInt(r[1], 10), parseInt(r[2], 10) - 1, parseInt(r[3], 10), parseInt(r[4], 10), parseInt(r[5], 10), isecs, msecs).getTime(); + } else { + offsetmins = 0; + if (r[8] !== 'Z') { + offsetmins = parseInt(r[10], 10) * 60 + parseInt(r[11], 10); + if (r[9] === '+') { + offsetmins = 0 - offsetmins; + } + } + return Date.UTC(parseInt(r[1], 10), parseInt(r[2], 10) - 1, parseInt(r[3], 10), parseInt(r[4], 10), parseInt(r[5], 10) + offsetmins, isecs, msecs); + } + } else { + return new Date(parseInt(date, 10), 0, 1).getTime(); + } + }; + + Morris.Hover = (function() { + Hover.defaults = { + "class": 'morris-hover morris-default-style' + }; + + function Hover(options) { + if (options == null) { + options = {}; + } + this.options = $.extend({}, Morris.Hover.defaults, options); + this.el = $("<div class='" + this.options["class"] + "'></div>"); + this.el.hide(); + this.options.parent.append(this.el); + } + + Hover.prototype.update = function(html, x, y) { + if (!html) { + return this.hide(); + } else { + this.html(html); + this.show(); + return this.moveTo(x, y); + } + }; + + Hover.prototype.html = function(content) { + return this.el.html(content); + }; + + Hover.prototype.moveTo = function(x, y) { + var hoverHeight, hoverWidth, left, parentHeight, parentWidth, top; + parentWidth = this.options.parent.innerWidth(); + parentHeight = this.options.parent.innerHeight(); + hoverWidth = this.el.outerWidth(); + hoverHeight = this.el.outerHeight(); + left = Math.min(Math.max(0, x - hoverWidth / 2), parentWidth - hoverWidth); + if (y != null) { + top = y - hoverHeight - 10; + if (top < 0) { + top = y + 10; + if (top + hoverHeight > parentHeight) { + top = parentHeight / 2 - hoverHeight / 2; + } + } + } else { + top = parentHeight / 2 - hoverHeight / 2; + } + return this.el.css({ + left: left + "px", + top: parseInt(top) + "px" + }); + }; + + Hover.prototype.show = function() { + return this.el.show(); + }; + + Hover.prototype.hide = function() { + return this.el.hide(); + }; + + return Hover; + + })(); + + Morris.Line = (function(_super) { + __extends(Line, _super); + + function Line(options) { + this.hilight = __bind(this.hilight, this); + this.onHoverOut = __bind(this.onHoverOut, this); + this.onHoverMove = __bind(this.onHoverMove, this); + this.onGridClick = __bind(this.onGridClick, this); + if (!(this instanceof Morris.Line)) { + return new Morris.Line(options); + } + Line.__super__.constructor.call(this, options); + } + + Line.prototype.init = function() { + if (this.options.hideHover !== 'always') { + this.hover = new Morris.Hover({ + parent: this.el + }); + this.on('hovermove', this.onHoverMove); + this.on('hoverout', this.onHoverOut); + return this.on('gridclick', this.onGridClick); + } + }; + + Line.prototype.defaults = { + lineWidth: 3, + pointSize: 4, + lineColors: ['#0b62a4', '#7A92A3', '#4da74d', '#afd8f8', '#edc240', '#cb4b4b', '#9440ed'], + pointStrokeWidths: [1], + pointStrokeColors: ['#ffffff'], + pointFillColors: [], + smooth: true, + xLabels: 'auto', + xLabelFormat: null, + xLabelMargin: 24, + hideHover: false + }; + + Line.prototype.calc = function() { + this.calcPoints(); + return this.generatePaths(); + }; + + Line.prototype.calcPoints = function() { + var row, y, _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + row = _ref[_i]; + row._x = this.transX(row.x); + row._y = (function() { + var _j, _len1, _ref1, _results1; + _ref1 = row.y; + _results1 = []; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + y = _ref1[_j]; + if (y != null) { + _results1.push(this.transY(y)); + } else { + _results1.push(y); + } + } + return _results1; + }).call(this); + _results.push(row._ymax = Math.min.apply(Math, [this.bottom].concat((function() { + var _j, _len1, _ref1, _results1; + _ref1 = row._y; + _results1 = []; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + y = _ref1[_j]; + if (y != null) { + _results1.push(y); + } + } + return _results1; + })()))); + } + return _results; + }; + + Line.prototype.hitTest = function(x) { + var index, r, _i, _len, _ref; + if (this.data.length === 0) { + return null; + } + _ref = this.data.slice(1); + for (index = _i = 0, _len = _ref.length; _i < _len; index = ++_i) { + r = _ref[index]; + if (x < (r._x + this.data[index]._x) / 2) { + break; + } + } + return index; + }; + + Line.prototype.onGridClick = function(x, y) { + var index; + index = this.hitTest(x); + return this.fire('click', index, this.data[index].src, x, y); + }; + + Line.prototype.onHoverMove = function(x, y) { + var index; + index = this.hitTest(x); + return this.displayHoverForRow(index); + }; + + Line.prototype.onHoverOut = function() { + if (this.options.hideHover !== false) { + return this.displayHoverForRow(null); + } + }; + + Line.prototype.displayHoverForRow = function(index) { + var _ref; + if (index != null) { + (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(index)); + return this.hilight(index); + } else { + this.hover.hide(); + return this.hilight(); + } + }; + + Line.prototype.hoverContentForRow = function(index) { + var content, j, row, y, _i, _len, _ref; + row = this.data[index]; + content = "<div class='morris-hover-row-label'>" + row.label + "</div>"; + _ref = row.y; + for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) { + y = _ref[j]; + content += "<div class='morris-hover-point' style='color: " + (this.colorFor(row, j, 'label')) + "'>\n " + this.options.labels[j] + ":\n " + (this.yLabelFormat(y)) + "\n</div>"; + } + if (typeof this.options.hoverCallback === 'function') { + content = this.options.hoverCallback(index, this.options, content, row.src); + } + return [content, row._x, row._ymax]; + }; + + Line.prototype.generatePaths = function() { + var coords, i, r, smooth; + return this.paths = (function() { + var _i, _ref, _ref1, _results; + _results = []; + for (i = _i = 0, _ref = this.options.ykeys.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + smooth = typeof this.options.smooth === "boolean" ? this.options.smooth : (_ref1 = this.options.ykeys[i], __indexOf.call(this.options.smooth, _ref1) >= 0); + coords = (function() { + var _j, _len, _ref2, _results1; + _ref2 = this.data; + _results1 = []; + for (_j = 0, _len = _ref2.length; _j < _len; _j++) { + r = _ref2[_j]; + if (r._y[i] !== void 0) { + _results1.push({ + x: r._x, + y: r._y[i] + }); + } + } + return _results1; + }).call(this); + if (coords.length > 1) { + _results.push(Morris.Line.createPath(coords, smooth, this.bottom)); + } else { + _results.push(null); + } + } + return _results; + }).call(this); + }; + + Line.prototype.draw = function() { + var _ref; + if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'x') { + this.drawXAxis(); + } + this.drawSeries(); + if (this.options.hideHover === false) { + return this.displayHoverForRow(this.data.length - 1); + } + }; + + Line.prototype.drawXAxis = function() { + var drawLabel, l, labels, prevAngleMargin, prevLabelMargin, row, ypos, _i, _len, _results, + _this = this; + ypos = this.bottom + this.options.padding / 2; + prevLabelMargin = null; + prevAngleMargin = null; + drawLabel = function(labelText, xpos) { + var label, labelBox, margin, offset, textBox; + label = _this.drawXAxisLabel(_this.transX(xpos), ypos, labelText); + textBox = label.getBBox(); + label.transform("r" + (-_this.options.xLabelAngle)); + labelBox = label.getBBox(); + label.transform("t0," + (labelBox.height / 2) + "..."); + if (_this.options.xLabelAngle !== 0) { + offset = -0.5 * textBox.width * Math.cos(_this.options.xLabelAngle * Math.PI / 180.0); + label.transform("t" + offset + ",0..."); + } + labelBox = label.getBBox(); + if (((prevLabelMargin == null) || prevLabelMargin >= labelBox.x + labelBox.width || (prevAngleMargin != null) && prevAngleMargin >= labelBox.x) && labelBox.x >= 0 && (labelBox.x + labelBox.width) < _this.el.width()) { + if (_this.options.xLabelAngle !== 0) { + margin = 1.25 * _this.options.gridTextSize / Math.sin(_this.options.xLabelAngle * Math.PI / 180.0); + prevAngleMargin = labelBox.x - margin; + } + return prevLabelMargin = labelBox.x - _this.options.xLabelMargin; + } else { + return label.remove(); + } + }; + if (this.options.parseTime) { + if (this.data.length === 1 && this.options.xLabels === 'auto') { + labels = [[this.data[0].label, this.data[0].x]]; + } else { + labels = Morris.labelSeries(this.xmin, this.xmax, this.width, this.options.xLabels, this.options.xLabelFormat); + } + } else { + labels = (function() { + var _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + row = _ref[_i]; + _results.push([row.label, row.x]); + } + return _results; + }).call(this); + } + labels.reverse(); + _results = []; + for (_i = 0, _len = labels.length; _i < _len; _i++) { + l = labels[_i]; + _results.push(drawLabel(l[0], l[1])); + } + return _results; + }; + + Line.prototype.drawSeries = function() { + var i, _i, _j, _ref, _ref1, _results; + this.seriesPoints = []; + for (i = _i = _ref = this.options.ykeys.length - 1; _ref <= 0 ? _i <= 0 : _i >= 0; i = _ref <= 0 ? ++_i : --_i) { + this._drawLineFor(i); + } + _results = []; + for (i = _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; i = _ref1 <= 0 ? ++_j : --_j) { + _results.push(this._drawPointFor(i)); + } + return _results; + }; + + Line.prototype._drawPointFor = function(index) { + var circle, row, _i, _len, _ref, _results; + this.seriesPoints[index] = []; + _ref = this.data; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + row = _ref[_i]; + circle = null; + if (row._y[index] != null) { + circle = this.drawLinePoint(row._x, row._y[index], this.colorFor(row, index, 'point'), index); + } + _results.push(this.seriesPoints[index].push(circle)); + } + return _results; + }; + + Line.prototype._drawLineFor = function(index) { + var path; + path = this.paths[index]; + if (path !== null) { + return this.drawLinePath(path, this.colorFor(null, index, 'line'), index); + } + }; + + Line.createPath = function(coords, smooth, bottom) { + var coord, g, grads, i, ix, lg, path, prevCoord, x1, x2, y1, y2, _i, _len; + path = ""; + if (smooth) { + grads = Morris.Line.gradients(coords); + } + prevCoord = { + y: null + }; + for (i = _i = 0, _len = coords.length; _i < _len; i = ++_i) { + coord = coords[i]; + if (coord.y != null) { + if (prevCoord.y != null) { + if (smooth) { + g = grads[i]; + lg = grads[i - 1]; + ix = (coord.x - prevCoord.x) / 4; + x1 = prevCoord.x + ix; + y1 = Math.min(bottom, prevCoord.y + ix * lg); + x2 = coord.x - ix; + y2 = Math.min(bottom, coord.y - ix * g); + path += "C" + x1 + "," + y1 + "," + x2 + "," + y2 + "," + coord.x + "," + coord.y; + } else { + path += "L" + coord.x + "," + coord.y; + } + } else { + if (!smooth || (grads[i] != null)) { + path += "M" + coord.x + "," + coord.y; + } + } + } + prevCoord = coord; + } + return path; + }; + + Line.gradients = function(coords) { + var coord, grad, i, nextCoord, prevCoord, _i, _len, _results; + grad = function(a, b) { + return (a.y - b.y) / (a.x - b.x); + }; + _results = []; + for (i = _i = 0, _len = coords.length; _i < _len; i = ++_i) { + coord = coords[i]; + if (coord.y != null) { + nextCoord = coords[i + 1] || { + y: null + }; + prevCoord = coords[i - 1] || { + y: null + }; + if ((prevCoord.y != null) && (nextCoord.y != null)) { + _results.push(grad(prevCoord, nextCoord)); + } else if (prevCoord.y != null) { + _results.push(grad(prevCoord, coord)); + } else if (nextCoord.y != null) { + _results.push(grad(coord, nextCoord)); + } else { + _results.push(null); + } + } else { + _results.push(null); + } + } + return _results; + }; + + Line.prototype.hilight = function(index) { + var i, _i, _j, _ref, _ref1; + if (this.prevHilight !== null && this.prevHilight !== index) { + for (i = _i = 0, _ref = this.seriesPoints.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) { + if (this.seriesPoints[i][this.prevHilight]) { + this.seriesPoints[i][this.prevHilight].animate(this.pointShrinkSeries(i)); + } + } + } + if (index !== null && this.prevHilight !== index) { + for (i = _j = 0, _ref1 = this.seriesPoints.length - 1; 0 <= _ref1 ? _j <= _ref1 : _j >= _ref1; i = 0 <= _ref1 ? ++_j : --_j) { + if (this.seriesPoints[i][index]) { + this.seriesPoints[i][index].animate(this.pointGrowSeries(i)); + } + } + } + return this.prevHilight = index; + }; + + Line.prototype.colorFor = function(row, sidx, type) { + if (typeof this.options.lineColors === 'function') { + return this.options.lineColors.call(this, row, sidx, type); + } else if (type === 'point') { + return this.options.pointFillColors[sidx % this.options.pointFillColors.length] || this.options.lineColors[sidx % this.options.lineColors.length]; + } else { + return this.options.lineColors[sidx % this.options.lineColors.length]; + } + }; + + Line.prototype.drawXAxisLabel = function(xPos, yPos, text) { + return this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor); + }; + + Line.prototype.drawLinePath = function(path, lineColor, lineIndex) { + return this.raphael.path(path).attr('stroke', lineColor).attr('stroke-width', this.lineWidthForSeries(lineIndex)); + }; + + Line.prototype.drawLinePoint = function(xPos, yPos, pointColor, lineIndex) { + return this.raphael.circle(xPos, yPos, this.pointSizeForSeries(lineIndex)).attr('fill', pointColor).attr('stroke-width', this.pointStrokeWidthForSeries(lineIndex)).attr('stroke', this.pointStrokeColorForSeries(lineIndex)); + }; + + Line.prototype.pointStrokeWidthForSeries = function(index) { + return this.options.pointStrokeWidths[index % this.options.pointStrokeWidths.length]; + }; + + Line.prototype.pointStrokeColorForSeries = function(index) { + return this.options.pointStrokeColors[index % this.options.pointStrokeColors.length]; + }; + + Line.prototype.lineWidthForSeries = function(index) { + if (this.options.lineWidth instanceof Array) { + return this.options.lineWidth[index % this.options.lineWidth.length]; + } else { + return this.options.lineWidth; + } + }; + + Line.prototype.pointSizeForSeries = function(index) { + if (this.options.pointSize instanceof Array) { + return this.options.pointSize[index % this.options.pointSize.length]; + } else { + return this.options.pointSize; + } + }; + + Line.prototype.pointGrowSeries = function(index) { + return Raphael.animation({ + r: this.pointSizeForSeries(index) + 3 + }, 25, 'linear'); + }; + + Line.prototype.pointShrinkSeries = function(index) { + return Raphael.animation({ + r: this.pointSizeForSeries(index) + }, 25, 'linear'); + }; + + return Line; + + })(Morris.Grid); + + Morris.labelSeries = function(dmin, dmax, pxwidth, specName, xLabelFormat) { + var d, d0, ddensity, name, ret, s, spec, t, _i, _len, _ref; + ddensity = 200 * (dmax - dmin) / pxwidth; + d0 = new Date(dmin); + spec = Morris.LABEL_SPECS[specName]; + if (spec === void 0) { + _ref = Morris.AUTO_LABEL_ORDER; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + name = _ref[_i]; + s = Morris.LABEL_SPECS[name]; + if (ddensity >= s.span) { + spec = s; + break; + } + } + } + if (spec === void 0) { + spec = Morris.LABEL_SPECS["second"]; + } + if (xLabelFormat) { + spec = $.extend({}, spec, { + fmt: xLabelFormat + }); + } + d = spec.start(d0); + ret = []; + while ((t = d.getTime()) <= dmax) { + if (t >= dmin) { + ret.push([spec.fmt(d), t]); + } + spec.incr(d); + } + return ret; + }; + + minutesSpecHelper = function(interval) { + return { + span: interval * 60 * 1000, + start: function(d) { + return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours()); + }, + fmt: function(d) { + return "" + (Morris.pad2(d.getHours())) + ":" + (Morris.pad2(d.getMinutes())); + }, + incr: function(d) { + return d.setUTCMinutes(d.getUTCMinutes() + interval); + } + }; + }; + + secondsSpecHelper = function(interval) { + return { + span: interval * 1000, + start: function(d) { + return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes()); + }, + fmt: function(d) { + return "" + (Morris.pad2(d.getHours())) + ":" + (Morris.pad2(d.getMinutes())) + ":" + (Morris.pad2(d.getSeconds())); + }, + incr: function(d) { + return d.setUTCSeconds(d.getUTCSeconds() + interval); + } + }; + }; + + Morris.LABEL_SPECS = { + "decade": { + span: 172800000000, + start: function(d) { + return new Date(d.getFullYear() - d.getFullYear() % 10, 0, 1); + }, + fmt: function(d) { + return "" + (d.getFullYear()); + }, + incr: function(d) { + return d.setFullYear(d.getFullYear() + 10); + } + }, + "year": { + span: 17280000000, + start: function(d) { + return new Date(d.getFullYear(), 0, 1); + }, + fmt: function(d) { + return "" + (d.getFullYear()); + }, + incr: function(d) { + return d.setFullYear(d.getFullYear() + 1); + } + }, + "month": { + span: 2419200000, + start: function(d) { + return new Date(d.getFullYear(), d.getMonth(), 1); + }, + fmt: function(d) { + return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1)); + }, + incr: function(d) { + return d.setMonth(d.getMonth() + 1); + } + }, + "week": { + span: 604800000, + start: function(d) { + return new Date(d.getFullYear(), d.getMonth(), d.getDate()); + }, + fmt: function(d) { + return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1)) + "-" + (Morris.pad2(d.getDate())); + }, + incr: function(d) { + return d.setDate(d.getDate() + 7); + } + }, + "day": { + span: 86400000, + start: function(d) { + return new Date(d.getFullYear(), d.getMonth(), d.getDate()); + }, + fmt: function(d) { + return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1)) + "-" + (Morris.pad2(d.getDate())); + }, + incr: function(d) { + return d.setDate(d.getDate() + 1); + } + }, + "hour": minutesSpecHelper(60), + "30min": minutesSpecHelper(30), + "15min": minutesSpecHelper(15), + "10min": minutesSpecHelper(10), + "5min": minutesSpecHelper(5), + "minute": minutesSpecHelper(1), + "30sec": secondsSpecHelper(30), + "15sec": secondsSpecHelper(15), + "10sec": secondsSpecHelper(10), + "5sec": secondsSpecHelper(5), + "second": secondsSpecHelper(1) + }; + + Morris.AUTO_LABEL_ORDER = ["decade", "year", "month", "week", "day", "hour", "30min", "15min", "10min", "5min", "minute", "30sec", "15sec", "10sec", "5sec", "second"]; + + Morris.Area = (function(_super) { + var areaDefaults; + + __extends(Area, _super); + + areaDefaults = { + fillOpacity: 'auto', + behaveLikeLine: false + }; + + function Area(options) { + var areaOptions; + if (!(this instanceof Morris.Area)) { + return new Morris.Area(options); + } + areaOptions = $.extend({}, areaDefaults, options); + this.cumulative = !areaOptions.behaveLikeLine; + if (areaOptions.fillOpacity === 'auto') { + areaOptions.fillOpacity = areaOptions.behaveLikeLine ? .8 : 1; + } + Area.__super__.constructor.call(this, areaOptions); + } + + Area.prototype.calcPoints = function() { + var row, total, y, _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + row = _ref[_i]; + row._x = this.transX(row.x); + total = 0; + row._y = (function() { + var _j, _len1, _ref1, _results1; + _ref1 = row.y; + _results1 = []; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + y = _ref1[_j]; + if (this.options.behaveLikeLine) { + _results1.push(this.transY(y)); + } else { + total += y || 0; + _results1.push(this.transY(total)); + } + } + return _results1; + }).call(this); + _results.push(row._ymax = Math.max.apply(Math, row._y)); + } + return _results; + }; + + Area.prototype.drawSeries = function() { + var i, range, _i, _j, _k, _len, _ref, _ref1, _results, _results1, _results2; + this.seriesPoints = []; + if (this.options.behaveLikeLine) { + range = (function() { + _results = []; + for (var _i = 0, _ref = this.options.ykeys.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); } + return _results; + }).apply(this); + } else { + range = (function() { + _results1 = []; + for (var _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; _ref1 <= 0 ? _j++ : _j--){ _results1.push(_j); } + return _results1; + }).apply(this); + } + _results2 = []; + for (_k = 0, _len = range.length; _k < _len; _k++) { + i = range[_k]; + this._drawFillFor(i); + this._drawLineFor(i); + _results2.push(this._drawPointFor(i)); + } + return _results2; + }; + + Area.prototype._drawFillFor = function(index) { + var path; + path = this.paths[index]; + if (path !== null) { + path = path + ("L" + (this.transX(this.xmax)) + "," + this.bottom + "L" + (this.transX(this.xmin)) + "," + this.bottom + "Z"); + return this.drawFilledPath(path, this.fillForSeries(index)); + } + }; + + Area.prototype.fillForSeries = function(i) { + var color; + color = Raphael.rgb2hsl(this.colorFor(this.data[i], i, 'line')); + return Raphael.hsl(color.h, this.options.behaveLikeLine ? color.s * 0.9 : color.s * 0.75, Math.min(0.98, this.options.behaveLikeLine ? color.l * 1.2 : color.l * 1.25)); + }; + + Area.prototype.drawFilledPath = function(path, fill) { + return this.raphael.path(path).attr('fill', fill).attr('fill-opacity', this.options.fillOpacity).attr('stroke', 'none'); + }; + + return Area; + + })(Morris.Line); + + Morris.Bar = (function(_super) { + __extends(Bar, _super); + + function Bar(options) { + this.onHoverOut = __bind(this.onHoverOut, this); + this.onHoverMove = __bind(this.onHoverMove, this); + this.onGridClick = __bind(this.onGridClick, this); + if (!(this instanceof Morris.Bar)) { + return new Morris.Bar(options); + } + Bar.__super__.constructor.call(this, $.extend({}, options, { + parseTime: false + })); + } + + Bar.prototype.init = function() { + this.cumulative = this.options.stacked; + if (this.options.hideHover !== 'always') { + this.hover = new Morris.Hover({ + parent: this.el + }); + this.on('hovermove', this.onHoverMove); + this.on('hoverout', this.onHoverOut); + return this.on('gridclick', this.onGridClick); + } + }; + + Bar.prototype.defaults = { + barSizeRatio: 0.75, + barGap: 3, + barColors: ['#0b62a4', '#7a92a3', '#4da74d', '#afd8f8', '#edc240', '#cb4b4b', '#9440ed'], + barOpacity: 1.0, + barRadius: [0, 0, 0, 0], + xLabelMargin: 50 + }; + + Bar.prototype.calc = function() { + var _ref; + this.calcBars(); + if (this.options.hideHover === false) { + return (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(this.data.length - 1)); + } + }; + + Bar.prototype.calcBars = function() { + var idx, row, y, _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (idx = _i = 0, _len = _ref.length; _i < _len; idx = ++_i) { + row = _ref[idx]; + row._x = this.left + this.width * (idx + 0.5) / this.data.length; + _results.push(row._y = (function() { + var _j, _len1, _ref1, _results1; + _ref1 = row.y; + _results1 = []; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + y = _ref1[_j]; + if (y != null) { + _results1.push(this.transY(y)); + } else { + _results1.push(null); + } + } + return _results1; + }).call(this)); + } + return _results; + }; + + Bar.prototype.draw = function() { + var _ref; + if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'x') { + this.drawXAxis(); + } + return this.drawSeries(); + }; + + Bar.prototype.drawXAxis = function() { + var i, label, labelBox, margin, offset, prevAngleMargin, prevLabelMargin, row, textBox, ypos, _i, _ref, _results; + ypos = this.bottom + (this.options.xAxisLabelTopPadding || this.options.padding / 2); + prevLabelMargin = null; + prevAngleMargin = null; + _results = []; + for (i = _i = 0, _ref = this.data.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + row = this.data[this.data.length - 1 - i]; + label = this.drawXAxisLabel(row._x, ypos, row.label); + textBox = label.getBBox(); + label.transform("r" + (-this.options.xLabelAngle)); + labelBox = label.getBBox(); + label.transform("t0," + (labelBox.height / 2) + "..."); + if (this.options.xLabelAngle !== 0) { + offset = -0.5 * textBox.width * Math.cos(this.options.xLabelAngle * Math.PI / 180.0); + label.transform("t" + offset + ",0..."); + } + if (((prevLabelMargin == null) || prevLabelMargin >= labelBox.x + labelBox.width || (prevAngleMargin != null) && prevAngleMargin >= labelBox.x) && labelBox.x >= 0 && (labelBox.x + labelBox.width) < this.el.width()) { + if (this.options.xLabelAngle !== 0) { + margin = 1.25 * this.options.gridTextSize / Math.sin(this.options.xLabelAngle * Math.PI / 180.0); + prevAngleMargin = labelBox.x - margin; + } + _results.push(prevLabelMargin = labelBox.x - this.options.xLabelMargin); + } else { + _results.push(label.remove()); + } + } + return _results; + }; + + Bar.prototype.drawSeries = function() { + var barWidth, bottom, groupWidth, idx, lastTop, left, leftPadding, numBars, row, sidx, size, spaceLeft, top, ypos, zeroPos; + groupWidth = this.width / this.options.data.length; + numBars = this.options.stacked ? 1 : this.options.ykeys.length; + barWidth = (groupWidth * this.options.barSizeRatio - this.options.barGap * (numBars - 1)) / numBars; + if (this.options.barSize) { + barWidth = Math.min(barWidth, this.options.barSize); + } + spaceLeft = groupWidth - barWidth * numBars - this.options.barGap * (numBars - 1); + leftPadding = spaceLeft / 2; + zeroPos = this.ymin <= 0 && this.ymax >= 0 ? this.transY(0) : null; + return this.bars = (function() { + var _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (idx = _i = 0, _len = _ref.length; _i < _len; idx = ++_i) { + row = _ref[idx]; + lastTop = 0; + _results.push((function() { + var _j, _len1, _ref1, _results1; + _ref1 = row._y; + _results1 = []; + for (sidx = _j = 0, _len1 = _ref1.length; _j < _len1; sidx = ++_j) { + ypos = _ref1[sidx]; + if (ypos !== null) { + if (zeroPos) { + top = Math.min(ypos, zeroPos); + bottom = Math.max(ypos, zeroPos); + } else { + top = ypos; + bottom = this.bottom; + } + left = this.left + idx * groupWidth + leftPadding; + if (!this.options.stacked) { + left += sidx * (barWidth + this.options.barGap); + } + size = bottom - top; + if (this.options.verticalGridCondition && this.options.verticalGridCondition(row.x)) { + this.drawBar(this.left + idx * groupWidth, this.top, groupWidth, Math.abs(this.top - this.bottom), this.options.verticalGridColor, this.options.verticalGridOpacity, this.options.barRadius); + } + if (this.options.stacked) { + top -= lastTop; + } + this.drawBar(left, top, barWidth, size, this.colorFor(row, sidx, 'bar'), this.options.barOpacity, this.options.barRadius); + _results1.push(lastTop += size); + } else { + _results1.push(null); + } + } + return _results1; + }).call(this)); + } + return _results; + }).call(this); + }; + + Bar.prototype.colorFor = function(row, sidx, type) { + var r, s; + if (typeof this.options.barColors === 'function') { + r = { + x: row.x, + y: row.y[sidx], + label: row.label + }; + s = { + index: sidx, + key: this.options.ykeys[sidx], + label: this.options.labels[sidx] + }; + return this.options.barColors.call(this, r, s, type); + } else { + return this.options.barColors[sidx % this.options.barColors.length]; + } + }; + + Bar.prototype.hitTest = function(x) { + if (this.data.length === 0) { + return null; + } + x = Math.max(Math.min(x, this.right), this.left); + return Math.min(this.data.length - 1, Math.floor((x - this.left) / (this.width / this.data.length))); + }; + + Bar.prototype.onGridClick = function(x, y) { + var index; + index = this.hitTest(x); + return this.fire('click', index, this.data[index].src, x, y); + }; + + Bar.prototype.onHoverMove = function(x, y) { + var index, _ref; + index = this.hitTest(x); + return (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(index)); + }; + + Bar.prototype.onHoverOut = function() { + if (this.options.hideHover !== false) { + return this.hover.hide(); + } + }; + + Bar.prototype.hoverContentForRow = function(index) { + var content, j, row, x, y, _i, _len, _ref; + row = this.data[index]; + content = "<div class='morris-hover-row-label'>" + row.label + "</div>"; + _ref = row.y; + for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) { + y = _ref[j]; + content += "<div class='morris-hover-point' style='color: " + (this.colorFor(row, j, 'label')) + "'>\n " + this.options.labels[j] + ":\n " + (this.yLabelFormat(y)) + "\n</div>"; + } + if (typeof this.options.hoverCallback === 'function') { + content = this.options.hoverCallback(index, this.options, content, row.src); + } + x = this.left + (index + 0.5) * this.width / this.data.length; + return [content, x]; + }; + + Bar.prototype.drawXAxisLabel = function(xPos, yPos, text) { + var label; + return label = this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor); + }; + + Bar.prototype.drawBar = function(xPos, yPos, width, height, barColor, opacity, radiusArray) { + var maxRadius, path; + maxRadius = Math.max.apply(Math, radiusArray); + if (maxRadius === 0 || maxRadius > height) { + path = this.raphael.rect(xPos, yPos, width, height); + } else { + path = this.raphael.path(this.roundedRect(xPos, yPos, width, height, radiusArray)); + } + return path.attr('fill', barColor).attr('fill-opacity', opacity).attr('stroke', 'none'); + }; + + Bar.prototype.roundedRect = function(x, y, w, h, r) { + if (r == null) { + r = [0, 0, 0, 0]; + } + return ["M", x, r[0] + y, "Q", x, y, x + r[0], y, "L", x + w - r[1], y, "Q", x + w, y, x + w, y + r[1], "L", x + w, y + h - r[2], "Q", x + w, y + h, x + w - r[2], y + h, "L", x + r[3], y + h, "Q", x, y + h, x, y + h - r[3], "Z"]; + }; + + return Bar; + + })(Morris.Grid); + + Morris.Donut = (function(_super) { + __extends(Donut, _super); + + Donut.prototype.defaults = { + colors: ['#0B62A4', '#3980B5', '#679DC6', '#95BBD7', '#B0CCE1', '#095791', '#095085', '#083E67', '#052C48', '#042135'], + backgroundColor: '#FFFFFF', + labelColor: '#000000', + formatter: Morris.commas, + resize: false + }; + + function Donut(options) { + this.resizeHandler = __bind(this.resizeHandler, this); + this.select = __bind(this.select, this); + this.click = __bind(this.click, this); + var _this = this; + if (!(this instanceof Morris.Donut)) { + return new Morris.Donut(options); + } + this.options = $.extend({}, this.defaults, options); + if (typeof options.element === 'string') { + this.el = $(document.getElementById(options.element)); + } else { + this.el = $(options.element); + } + if (this.el === null || this.el.length === 0) { + throw new Error("Graph placeholder not found."); + } + if (options.data === void 0 || options.data.length === 0) { + return; + } + this.raphael = new Raphael(this.el[0]); + if (this.options.resize) { + $(window).bind('resize', function(evt) { + if (_this.timeoutId != null) { + window.clearTimeout(_this.timeoutId); + } + return _this.timeoutId = window.setTimeout(_this.resizeHandler, 100); + }); + } + this.setData(options.data); + } + + Donut.prototype.redraw = function() { + var C, cx, cy, i, idx, last, max_value, min, next, seg, total, value, w, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _results; + this.raphael.clear(); + cx = this.el.width() / 2; + cy = this.el.height() / 2; + w = (Math.min(cx, cy) - 10) / 3; + total = 0; + _ref = this.values; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + value = _ref[_i]; + total += value; + } + min = 5 / (2 * w); + C = 1.9999 * Math.PI - min * this.data.length; + last = 0; + idx = 0; + this.segments = []; + _ref1 = this.values; + for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) { + value = _ref1[i]; + next = last + min + C * (value / total); + seg = new Morris.DonutSegment(cx, cy, w * 2, w, last, next, this.data[i].color || this.options.colors[idx % this.options.colors.length], this.options.backgroundColor, idx, this.raphael); + seg.render(); + this.segments.push(seg); + seg.on('hover', this.select); + seg.on('click', this.click); + last = next; + idx += 1; + } + this.text1 = this.drawEmptyDonutLabel(cx, cy - 10, this.options.labelColor, 15, 800); + this.text2 = this.drawEmptyDonutLabel(cx, cy + 10, this.options.labelColor, 14); + max_value = Math.max.apply(Math, this.values); + idx = 0; + _ref2 = this.values; + _results = []; + for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { + value = _ref2[_k]; + if (value === max_value) { + this.select(idx); + break; + } + _results.push(idx += 1); + } + return _results; + }; + + Donut.prototype.setData = function(data) { + var row; + this.data = data; + this.values = (function() { + var _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + row = _ref[_i]; + _results.push(parseFloat(row.value)); + } + return _results; + }).call(this); + return this.redraw(); + }; + + Donut.prototype.click = function(idx) { + return this.fire('click', idx, this.data[idx]); + }; + + Donut.prototype.select = function(idx) { + var row, s, segment, _i, _len, _ref; + _ref = this.segments; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + s = _ref[_i]; + s.deselect(); + } + segment = this.segments[idx]; + segment.select(); + row = this.data[idx]; + return this.setLabels(row.label, this.options.formatter(row.value, row)); + }; + + Donut.prototype.setLabels = function(label1, label2) { + var inner, maxHeightBottom, maxHeightTop, maxWidth, text1bbox, text1scale, text2bbox, text2scale; + inner = (Math.min(this.el.width() / 2, this.el.height() / 2) - 10) * 2 / 3; + maxWidth = 1.8 * inner; + maxHeightTop = inner / 2; + maxHeightBottom = inner / 3; + this.text1.attr({ + text: label1, + transform: '' + }); + text1bbox = this.text1.getBBox(); + text1scale = Math.min(maxWidth / text1bbox.width, maxHeightTop / text1bbox.height); + this.text1.attr({ + transform: "S" + text1scale + "," + text1scale + "," + (text1bbox.x + text1bbox.width / 2) + "," + (text1bbox.y + text1bbox.height) + }); + this.text2.attr({ + text: label2, + transform: '' + }); + text2bbox = this.text2.getBBox(); + text2scale = Math.min(maxWidth / text2bbox.width, maxHeightBottom / text2bbox.height); + return this.text2.attr({ + transform: "S" + text2scale + "," + text2scale + "," + (text2bbox.x + text2bbox.width / 2) + "," + text2bbox.y + }); + }; + + Donut.prototype.drawEmptyDonutLabel = function(xPos, yPos, color, fontSize, fontWeight) { + var text; + text = this.raphael.text(xPos, yPos, '').attr('font-size', fontSize).attr('fill', color); + if (fontWeight != null) { + text.attr('font-weight', fontWeight); + } + return text; + }; + + Donut.prototype.resizeHandler = function() { + this.timeoutId = null; + this.raphael.setSize(this.el.width(), this.el.height()); + return this.redraw(); + }; + + return Donut; + + })(Morris.EventEmitter); + + Morris.DonutSegment = (function(_super) { + __extends(DonutSegment, _super); + + function DonutSegment(cx, cy, inner, outer, p0, p1, color, backgroundColor, index, raphael) { + this.cx = cx; + this.cy = cy; + this.inner = inner; + this.outer = outer; + this.color = color; + this.backgroundColor = backgroundColor; + this.index = index; + this.raphael = raphael; + this.deselect = __bind(this.deselect, this); + this.select = __bind(this.select, this); + this.sin_p0 = Math.sin(p0); + this.cos_p0 = Math.cos(p0); + this.sin_p1 = Math.sin(p1); + this.cos_p1 = Math.cos(p1); + this.is_long = (p1 - p0) > Math.PI ? 1 : 0; + this.path = this.calcSegment(this.inner + 3, this.inner + this.outer - 5); + this.selectedPath = this.calcSegment(this.inner + 3, this.inner + this.outer); + this.hilight = this.calcArc(this.inner); + } + + DonutSegment.prototype.calcArcPoints = function(r) { + return [this.cx + r * this.sin_p0, this.cy + r * this.cos_p0, this.cx + r * this.sin_p1, this.cy + r * this.cos_p1]; + }; + + DonutSegment.prototype.calcSegment = function(r1, r2) { + var ix0, ix1, iy0, iy1, ox0, ox1, oy0, oy1, _ref, _ref1; + _ref = this.calcArcPoints(r1), ix0 = _ref[0], iy0 = _ref[1], ix1 = _ref[2], iy1 = _ref[3]; + _ref1 = this.calcArcPoints(r2), ox0 = _ref1[0], oy0 = _ref1[1], ox1 = _ref1[2], oy1 = _ref1[3]; + return ("M" + ix0 + "," + iy0) + ("A" + r1 + "," + r1 + ",0," + this.is_long + ",0," + ix1 + "," + iy1) + ("L" + ox1 + "," + oy1) + ("A" + r2 + "," + r2 + ",0," + this.is_long + ",1," + ox0 + "," + oy0) + "Z"; + }; + + DonutSegment.prototype.calcArc = function(r) { + var ix0, ix1, iy0, iy1, _ref; + _ref = this.calcArcPoints(r), ix0 = _ref[0], iy0 = _ref[1], ix1 = _ref[2], iy1 = _ref[3]; + return ("M" + ix0 + "," + iy0) + ("A" + r + "," + r + ",0," + this.is_long + ",0," + ix1 + "," + iy1); + }; + + DonutSegment.prototype.render = function() { + var _this = this; + this.arc = this.drawDonutArc(this.hilight, this.color); + return this.seg = this.drawDonutSegment(this.path, this.color, this.backgroundColor, function() { + return _this.fire('hover', _this.index); + }, function() { + return _this.fire('click', _this.index); + }); + }; + + DonutSegment.prototype.drawDonutArc = function(path, color) { + return this.raphael.path(path).attr({ + stroke: color, + 'stroke-width': 2, + opacity: 0 + }); + }; + + DonutSegment.prototype.drawDonutSegment = function(path, fillColor, strokeColor, hoverFunction, clickFunction) { + return this.raphael.path(path).attr({ + fill: fillColor, + stroke: strokeColor, + 'stroke-width': 3 + }).hover(hoverFunction).click(clickFunction); + }; + + DonutSegment.prototype.select = function() { + if (!this.selected) { + this.seg.animate({ + path: this.selectedPath + }, 150, '<>'); + this.arc.animate({ + opacity: 1 + }, 150, '<>'); + return this.selected = true; + } + }; + + DonutSegment.prototype.deselect = function() { + if (this.selected) { + this.seg.animate({ + path: this.path + }, 150, '<>'); + this.arc.animate({ + opacity: 0 + }, 150, '<>'); + return this.selected = false; + } + }; + + return DonutSegment; + + })(Morris.EventEmitter); + +}).call(this); diff --git a/theme/bootstrap/js/plugins/morris/morris.min.js b/theme/bootstrap/js/plugins/morris/morris.min.js new file mode 100644 index 0000000..c3bda2f --- /dev/null +++ b/theme/bootstrap/js/plugins/morris/morris.min.js @@ -0,0 +1,7 @@ +/* @license +morris.js v0.5.0 +Copyright 2014 Olly Smith All rights reserved. +Licensed under the BSD-2-Clause License. +*/ +(function(){var a,b,c,d,e=[].slice,f=function(a,b){return function(){return a.apply(b,arguments)}},g={}.hasOwnProperty,h=function(a,b){function c(){this.constructor=a}for(var d in b)g.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},i=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};b=window.Morris={},a=jQuery,b.EventEmitter=function(){function a(){}return a.prototype.on=function(a,b){return null==this.handlers&&(this.handlers={}),null==this.handlers[a]&&(this.handlers[a]=[]),this.handlers[a].push(b),this},a.prototype.fire=function(){var a,b,c,d,f,g,h;if(c=arguments[0],a=2<=arguments.length?e.call(arguments,1):[],null!=this.handlers&&null!=this.handlers[c]){for(g=this.handlers[c],h=[],d=0,f=g.length;f>d;d++)b=g[d],h.push(b.apply(null,a));return h}},a}(),b.commas=function(a){var b,c,d,e;return null!=a?(d=0>a?"-":"",b=Math.abs(a),c=Math.floor(b).toFixed(0),d+=c.replace(/(?=(?:\d{3})+$)(?!^)/g,","),e=b.toString(),e.length>c.length&&(d+=e.slice(c.length)),d):"-"},b.pad2=function(a){return(10>a?"0":"")+a},b.Grid=function(c){function d(b){this.resizeHandler=f(this.resizeHandler,this);var c=this;if(this.el="string"==typeof b.element?a(document.getElementById(b.element)):a(b.element),null==this.el||0===this.el.length)throw new Error("Graph container element not found");"static"===this.el.css("position")&&this.el.css("position","relative"),this.options=a.extend({},this.gridDefaults,this.defaults||{},b),"string"==typeof this.options.units&&(this.options.postUnits=b.units),this.raphael=new Raphael(this.el[0]),this.elementWidth=null,this.elementHeight=null,this.dirty=!1,this.selectFrom=null,this.init&&this.init(),this.setData(this.options.data),this.el.bind("mousemove",function(a){var b,d,e,f,g;return d=c.el.offset(),g=a.pageX-d.left,c.selectFrom?(b=c.data[c.hitTest(Math.min(g,c.selectFrom))]._x,e=c.data[c.hitTest(Math.max(g,c.selectFrom))]._x,f=e-b,c.selectionRect.attr({x:b,width:f})):c.fire("hovermove",g,a.pageY-d.top)}),this.el.bind("mouseleave",function(){return c.selectFrom&&(c.selectionRect.hide(),c.selectFrom=null),c.fire("hoverout")}),this.el.bind("touchstart touchmove touchend",function(a){var b,d;return d=a.originalEvent.touches[0]||a.originalEvent.changedTouches[0],b=c.el.offset(),c.fire("hovermove",d.pageX-b.left,d.pageY-b.top)}),this.el.bind("click",function(a){var b;return b=c.el.offset(),c.fire("gridclick",a.pageX-b.left,a.pageY-b.top)}),this.options.rangeSelect&&(this.selectionRect=this.raphael.rect(0,0,0,this.el.innerHeight()).attr({fill:this.options.rangeSelectColor,stroke:!1}).toBack().hide(),this.el.bind("mousedown",function(a){var b;return b=c.el.offset(),c.startRange(a.pageX-b.left)}),this.el.bind("mouseup",function(a){var b;return b=c.el.offset(),c.endRange(a.pageX-b.left),c.fire("hovermove",a.pageX-b.left,a.pageY-b.top)})),this.options.resize&&a(window).bind("resize",function(){return null!=c.timeoutId&&window.clearTimeout(c.timeoutId),c.timeoutId=window.setTimeout(c.resizeHandler,100)}),this.el.css("-webkit-tap-highlight-color","rgba(0,0,0,0)"),this.postInit&&this.postInit()}return h(d,c),d.prototype.gridDefaults={dateFormat:null,axes:!0,grid:!0,gridLineColor:"#aaa",gridStrokeWidth:.5,gridTextColor:"#888",gridTextSize:12,gridTextFamily:"sans-serif",gridTextWeight:"normal",hideHover:!1,yLabelFormat:null,xLabelAngle:0,numLines:5,padding:25,parseTime:!0,postUnits:"",preUnits:"",ymax:"auto",ymin:"auto 0",goals:[],goalStrokeWidth:1,goalLineColors:["#666633","#999966","#cc6666","#663333"],events:[],eventStrokeWidth:1,eventLineColors:["#005a04","#ccffbb","#3a5f0b","#005502"],rangeSelect:null,rangeSelectColor:"#eef",resize:!1},d.prototype.setData=function(a,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;return null==c&&(c=!0),this.options.data=a,null==a||0===a.length?(this.data=[],this.raphael.clear(),null!=this.hover&&this.hover.hide(),void 0):(o=this.cumulative?0:null,p=this.cumulative?0:null,this.options.goals.length>0&&(h=Math.min.apply(Math,this.options.goals),g=Math.max.apply(Math,this.options.goals),p=null!=p?Math.min(p,h):h,o=null!=o?Math.max(o,g):g),this.data=function(){var c,d,g;for(g=[],f=c=0,d=a.length;d>c;f=++c)j=a[f],i={src:j},i.label=j[this.options.xkey],this.options.parseTime?(i.x=b.parseDate(i.label),this.options.dateFormat?i.label=this.options.dateFormat(i.x):"number"==typeof i.label&&(i.label=new Date(i.label).toString())):(i.x=f,this.options.xLabelFormat&&(i.label=this.options.xLabelFormat(i))),l=0,i.y=function(){var a,b,c,d;for(c=this.options.ykeys,d=[],e=a=0,b=c.length;b>a;e=++a)n=c[e],q=j[n],"string"==typeof q&&(q=parseFloat(q)),null!=q&&"number"!=typeof q&&(q=null),null!=q&&(this.cumulative?l+=q:null!=o?(o=Math.max(q,o),p=Math.min(q,p)):o=p=q),this.cumulative&&null!=l&&(o=Math.max(l,o),p=Math.min(l,p)),d.push(q);return d}.call(this),g.push(i);return g}.call(this),this.options.parseTime&&(this.data=this.data.sort(function(a,b){return(a.x>b.x)-(b.x>a.x)})),this.xmin=this.data[0].x,this.xmax=this.data[this.data.length-1].x,this.events=[],this.options.events.length>0&&(this.events=this.options.parseTime?function(){var a,c,e,f;for(e=this.options.events,f=[],a=0,c=e.length;c>a;a++)d=e[a],f.push(b.parseDate(d));return f}.call(this):this.options.events,this.xmax=Math.max(this.xmax,Math.max.apply(Math,this.events)),this.xmin=Math.min(this.xmin,Math.min.apply(Math,this.events))),this.xmin===this.xmax&&(this.xmin-=1,this.xmax+=1),this.ymin=this.yboundary("min",p),this.ymax=this.yboundary("max",o),this.ymin===this.ymax&&(p&&(this.ymin-=1),this.ymax+=1),((r=this.options.axes)===!0||"both"===r||"y"===r||this.options.grid===!0)&&(this.options.ymax===this.gridDefaults.ymax&&this.options.ymin===this.gridDefaults.ymin?(this.grid=this.autoGridLines(this.ymin,this.ymax,this.options.numLines),this.ymin=Math.min(this.ymin,this.grid[0]),this.ymax=Math.max(this.ymax,this.grid[this.grid.length-1])):(k=(this.ymax-this.ymin)/(this.options.numLines-1),this.grid=function(){var a,b,c,d;for(d=[],m=a=b=this.ymin,c=this.ymax;k>0?c>=a:a>=c;m=a+=k)d.push(m);return d}.call(this))),this.dirty=!0,c?this.redraw():void 0)},d.prototype.yboundary=function(a,b){var c,d;return c=this.options["y"+a],"string"==typeof c?"auto"===c.slice(0,4)?c.length>5?(d=parseInt(c.slice(5),10),null==b?d:Math[a](b,d)):null!=b?b:0:parseInt(c,10):c},d.prototype.autoGridLines=function(a,b,c){var d,e,f,g,h,i,j,k,l;return h=b-a,l=Math.floor(Math.log(h)/Math.log(10)),j=Math.pow(10,l),e=Math.floor(a/j)*j,d=Math.ceil(b/j)*j,i=(d-e)/(c-1),1===j&&i>1&&Math.ceil(i)!==i&&(i=Math.ceil(i),d=e+i*(c-1)),0>e&&d>0&&(e=Math.floor(a/i)*i,d=Math.ceil(b/i)*i),1>i?(g=Math.floor(Math.log(i)/Math.log(10)),f=function(){var a,b;for(b=[],k=a=e;i>0?d>=a:a>=d;k=a+=i)b.push(parseFloat(k.toFixed(1-g)));return b}()):f=function(){var a,b;for(b=[],k=a=e;i>0?d>=a:a>=d;k=a+=i)b.push(k);return b}(),f},d.prototype._calc=function(){var a,b,c,d,e,f,g,h;return e=this.el.width(),c=this.el.height(),(this.elementWidth!==e||this.elementHeight!==c||this.dirty)&&(this.elementWidth=e,this.elementHeight=c,this.dirty=!1,this.left=this.options.padding,this.right=this.elementWidth-this.options.padding,this.top=this.options.padding,this.bottom=this.elementHeight-this.options.padding,((g=this.options.axes)===!0||"both"===g||"y"===g)&&(f=function(){var a,c,d,e;for(d=this.grid,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(this.measureText(this.yAxisFormat(b)).width);return e}.call(this),this.left+=Math.max.apply(Math,f)),((h=this.options.axes)===!0||"both"===h||"x"===h)&&(a=function(){var a,b,c;for(c=[],d=a=0,b=this.data.length;b>=0?b>a:a>b;d=b>=0?++a:--a)c.push(this.measureText(this.data[d].text,-this.options.xLabelAngle).height);return c}.call(this),this.bottom-=Math.max.apply(Math,a)),this.width=Math.max(1,this.right-this.left),this.height=Math.max(1,this.bottom-this.top),this.dx=this.width/(this.xmax-this.xmin),this.dy=this.height/(this.ymax-this.ymin),this.calc)?this.calc():void 0},d.prototype.transY=function(a){return this.bottom-(a-this.ymin)*this.dy},d.prototype.transX=function(a){return 1===this.data.length?(this.left+this.right)/2:this.left+(a-this.xmin)*this.dx},d.prototype.redraw=function(){return this.raphael.clear(),this._calc(),this.drawGrid(),this.drawGoals(),this.drawEvents(),this.draw?this.draw():void 0},d.prototype.measureText=function(a,b){var c,d;return null==b&&(b=0),d=this.raphael.text(100,100,a).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).rotate(b),c=d.getBBox(),d.remove(),c},d.prototype.yAxisFormat=function(a){return this.yLabelFormat(a)},d.prototype.yLabelFormat=function(a){return"function"==typeof this.options.yLabelFormat?this.options.yLabelFormat(a):""+this.options.preUnits+b.commas(a)+this.options.postUnits},d.prototype.drawGrid=function(){var a,b,c,d,e,f,g,h;if(this.options.grid!==!1||(e=this.options.axes)===!0||"both"===e||"y"===e){for(f=this.grid,h=[],c=0,d=f.length;d>c;c++)a=f[c],b=this.transY(a),((g=this.options.axes)===!0||"both"===g||"y"===g)&&this.drawYAxisLabel(this.left-this.options.padding/2,b,this.yAxisFormat(a)),this.options.grid?h.push(this.drawGridLine("M"+this.left+","+b+"H"+(this.left+this.width))):h.push(void 0);return h}},d.prototype.drawGoals=function(){var a,b,c,d,e,f,g;for(f=this.options.goals,g=[],c=d=0,e=f.length;e>d;c=++d)b=f[c],a=this.options.goalLineColors[c%this.options.goalLineColors.length],g.push(this.drawGoal(b,a));return g},d.prototype.drawEvents=function(){var a,b,c,d,e,f,g;for(f=this.events,g=[],c=d=0,e=f.length;e>d;c=++d)b=f[c],a=this.options.eventLineColors[c%this.options.eventLineColors.length],g.push(this.drawEvent(b,a));return g},d.prototype.drawGoal=function(a,b){return this.raphael.path("M"+this.left+","+this.transY(a)+"H"+this.right).attr("stroke",b).attr("stroke-width",this.options.goalStrokeWidth)},d.prototype.drawEvent=function(a,b){return this.raphael.path("M"+this.transX(a)+","+this.bottom+"V"+this.top).attr("stroke",b).attr("stroke-width",this.options.eventStrokeWidth)},d.prototype.drawYAxisLabel=function(a,b,c){return this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor).attr("text-anchor","end")},d.prototype.drawGridLine=function(a){return this.raphael.path(a).attr("stroke",this.options.gridLineColor).attr("stroke-width",this.options.gridStrokeWidth)},d.prototype.startRange=function(a){return this.hover.hide(),this.selectFrom=a,this.selectionRect.attr({x:a,width:0}).show()},d.prototype.endRange=function(a){var b,c;return this.selectFrom?(c=Math.min(this.selectFrom,a),b=Math.max(this.selectFrom,a),this.options.rangeSelect.call(this.el,{start:this.data[this.hitTest(c)].x,end:this.data[this.hitTest(b)].x}),this.selectFrom=null):void 0},d.prototype.resizeHandler=function(){return this.timeoutId=null,this.raphael.setSize(this.el.width(),this.el.height()),this.redraw()},d}(b.EventEmitter),b.parseDate=function(a){var b,c,d,e,f,g,h,i,j,k,l;return"number"==typeof a?a:(c=a.match(/^(\d+) Q(\d)$/),e=a.match(/^(\d+)-(\d+)$/),f=a.match(/^(\d+)-(\d+)-(\d+)$/),h=a.match(/^(\d+) W(\d+)$/),i=a.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+)(Z|([+-])(\d\d):?(\d\d))?$/),j=a.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+):(\d+(\.\d+)?)(Z|([+-])(\d\d):?(\d\d))?$/),c?new Date(parseInt(c[1],10),3*parseInt(c[2],10)-1,1).getTime():e?new Date(parseInt(e[1],10),parseInt(e[2],10)-1,1).getTime():f?new Date(parseInt(f[1],10),parseInt(f[2],10)-1,parseInt(f[3],10)).getTime():h?(k=new Date(parseInt(h[1],10),0,1),4!==k.getDay()&&k.setMonth(0,1+(4-k.getDay()+7)%7),k.getTime()+6048e5*parseInt(h[2],10)):i?i[6]?(g=0,"Z"!==i[6]&&(g=60*parseInt(i[8],10)+parseInt(i[9],10),"+"===i[7]&&(g=0-g)),Date.UTC(parseInt(i[1],10),parseInt(i[2],10)-1,parseInt(i[3],10),parseInt(i[4],10),parseInt(i[5],10)+g)):new Date(parseInt(i[1],10),parseInt(i[2],10)-1,parseInt(i[3],10),parseInt(i[4],10),parseInt(i[5],10)).getTime():j?(l=parseFloat(j[6]),b=Math.floor(l),d=Math.round(1e3*(l-b)),j[8]?(g=0,"Z"!==j[8]&&(g=60*parseInt(j[10],10)+parseInt(j[11],10),"+"===j[9]&&(g=0-g)),Date.UTC(parseInt(j[1],10),parseInt(j[2],10)-1,parseInt(j[3],10),parseInt(j[4],10),parseInt(j[5],10)+g,b,d)):new Date(parseInt(j[1],10),parseInt(j[2],10)-1,parseInt(j[3],10),parseInt(j[4],10),parseInt(j[5],10),b,d).getTime()):new Date(parseInt(a,10),0,1).getTime())},b.Hover=function(){function c(c){null==c&&(c={}),this.options=a.extend({},b.Hover.defaults,c),this.el=a("<div class='"+this.options["class"]+"'></div>"),this.el.hide(),this.options.parent.append(this.el)}return c.defaults={"class":"morris-hover morris-default-style"},c.prototype.update=function(a,b,c){return a?(this.html(a),this.show(),this.moveTo(b,c)):this.hide()},c.prototype.html=function(a){return this.el.html(a)},c.prototype.moveTo=function(a,b){var c,d,e,f,g,h;return g=this.options.parent.innerWidth(),f=this.options.parent.innerHeight(),d=this.el.outerWidth(),c=this.el.outerHeight(),e=Math.min(Math.max(0,a-d/2),g-d),null!=b?(h=b-c-10,0>h&&(h=b+10,h+c>f&&(h=f/2-c/2))):h=f/2-c/2,this.el.css({left:e+"px",top:parseInt(h)+"px"})},c.prototype.show=function(){return this.el.show()},c.prototype.hide=function(){return this.el.hide()},c}(),b.Line=function(a){function c(a){return this.hilight=f(this.hilight,this),this.onHoverOut=f(this.onHoverOut,this),this.onHoverMove=f(this.onHoverMove,this),this.onGridClick=f(this.onGridClick,this),this instanceof b.Line?(c.__super__.constructor.call(this,a),void 0):new b.Line(a)}return h(c,a),c.prototype.init=function(){return"always"!==this.options.hideHover?(this.hover=new b.Hover({parent:this.el}),this.on("hovermove",this.onHoverMove),this.on("hoverout",this.onHoverOut),this.on("gridclick",this.onGridClick)):void 0},c.prototype.defaults={lineWidth:3,pointSize:4,lineColors:["#0b62a4","#7A92A3","#4da74d","#afd8f8","#edc240","#cb4b4b","#9440ed"],pointStrokeWidths:[1],pointStrokeColors:["#ffffff"],pointFillColors:[],smooth:!0,xLabels:"auto",xLabelFormat:null,xLabelMargin:24,hideHover:!1},c.prototype.calc=function(){return this.calcPoints(),this.generatePaths()},c.prototype.calcPoints=function(){var a,b,c,d,e,f;for(e=this.data,f=[],c=0,d=e.length;d>c;c++)a=e[c],a._x=this.transX(a.x),a._y=function(){var c,d,e,f;for(e=a.y,f=[],c=0,d=e.length;d>c;c++)b=e[c],null!=b?f.push(this.transY(b)):f.push(b);return f}.call(this),f.push(a._ymax=Math.min.apply(Math,[this.bottom].concat(function(){var c,d,e,f;for(e=a._y,f=[],c=0,d=e.length;d>c;c++)b=e[c],null!=b&&f.push(b);return f}())));return f},c.prototype.hitTest=function(a){var b,c,d,e,f;if(0===this.data.length)return null;for(f=this.data.slice(1),b=d=0,e=f.length;e>d&&(c=f[b],!(a<(c._x+this.data[b]._x)/2));b=++d);return b},c.prototype.onGridClick=function(a,b){var c;return c=this.hitTest(a),this.fire("click",c,this.data[c].src,a,b)},c.prototype.onHoverMove=function(a){var b;return b=this.hitTest(a),this.displayHoverForRow(b)},c.prototype.onHoverOut=function(){return this.options.hideHover!==!1?this.displayHoverForRow(null):void 0},c.prototype.displayHoverForRow=function(a){var b;return null!=a?((b=this.hover).update.apply(b,this.hoverContentForRow(a)),this.hilight(a)):(this.hover.hide(),this.hilight())},c.prototype.hoverContentForRow=function(a){var b,c,d,e,f,g,h;for(d=this.data[a],b="<div class='morris-hover-row-label'>"+d.label+"</div>",h=d.y,c=f=0,g=h.length;g>f;c=++f)e=h[c],b+="<div class='morris-hover-point' style='color: "+this.colorFor(d,c,"label")+"'>\n "+this.options.labels[c]+":\n "+this.yLabelFormat(e)+"\n</div>";return"function"==typeof this.options.hoverCallback&&(b=this.options.hoverCallback(a,this.options,b,d.src)),[b,d._x,d._ymax]},c.prototype.generatePaths=function(){var a,c,d,e;return this.paths=function(){var f,g,h,j;for(j=[],c=f=0,g=this.options.ykeys.length;g>=0?g>f:f>g;c=g>=0?++f:--f)e="boolean"==typeof this.options.smooth?this.options.smooth:(h=this.options.ykeys[c],i.call(this.options.smooth,h)>=0),a=function(){var a,b,e,f;for(e=this.data,f=[],a=0,b=e.length;b>a;a++)d=e[a],void 0!==d._y[c]&&f.push({x:d._x,y:d._y[c]});return f}.call(this),a.length>1?j.push(b.Line.createPath(a,e,this.bottom)):j.push(null);return j}.call(this)},c.prototype.draw=function(){var a;return((a=this.options.axes)===!0||"both"===a||"x"===a)&&this.drawXAxis(),this.drawSeries(),this.options.hideHover===!1?this.displayHoverForRow(this.data.length-1):void 0},c.prototype.drawXAxis=function(){var a,c,d,e,f,g,h,i,j,k,l=this;for(h=this.bottom+this.options.padding/2,f=null,e=null,a=function(a,b){var c,d,g,i,j;return c=l.drawXAxisLabel(l.transX(b),h,a),j=c.getBBox(),c.transform("r"+-l.options.xLabelAngle),d=c.getBBox(),c.transform("t0,"+d.height/2+"..."),0!==l.options.xLabelAngle&&(i=-.5*j.width*Math.cos(l.options.xLabelAngle*Math.PI/180),c.transform("t"+i+",0...")),d=c.getBBox(),(null==f||f>=d.x+d.width||null!=e&&e>=d.x)&&d.x>=0&&d.x+d.width<l.el.width()?(0!==l.options.xLabelAngle&&(g=1.25*l.options.gridTextSize/Math.sin(l.options.xLabelAngle*Math.PI/180),e=d.x-g),f=d.x-l.options.xLabelMargin):c.remove()},d=this.options.parseTime?1===this.data.length&&"auto"===this.options.xLabels?[[this.data[0].label,this.data[0].x]]:b.labelSeries(this.xmin,this.xmax,this.width,this.options.xLabels,this.options.xLabelFormat):function(){var a,b,c,d;for(c=this.data,d=[],a=0,b=c.length;b>a;a++)g=c[a],d.push([g.label,g.x]);return d}.call(this),d.reverse(),k=[],i=0,j=d.length;j>i;i++)c=d[i],k.push(a(c[0],c[1]));return k},c.prototype.drawSeries=function(){var a,b,c,d,e,f;for(this.seriesPoints=[],a=b=d=this.options.ykeys.length-1;0>=d?0>=b:b>=0;a=0>=d?++b:--b)this._drawLineFor(a);for(f=[],a=c=e=this.options.ykeys.length-1;0>=e?0>=c:c>=0;a=0>=e?++c:--c)f.push(this._drawPointFor(a));return f},c.prototype._drawPointFor=function(a){var b,c,d,e,f,g;for(this.seriesPoints[a]=[],f=this.data,g=[],d=0,e=f.length;e>d;d++)c=f[d],b=null,null!=c._y[a]&&(b=this.drawLinePoint(c._x,c._y[a],this.colorFor(c,a,"point"),a)),g.push(this.seriesPoints[a].push(b));return g},c.prototype._drawLineFor=function(a){var b;return b=this.paths[a],null!==b?this.drawLinePath(b,this.colorFor(null,a,"line"),a):void 0},c.createPath=function(a,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r;for(k="",c&&(g=b.Line.gradients(a)),l={y:null},h=q=0,r=a.length;r>q;h=++q)e=a[h],null!=e.y&&(null!=l.y?c?(f=g[h],j=g[h-1],i=(e.x-l.x)/4,m=l.x+i,o=Math.min(d,l.y+i*j),n=e.x-i,p=Math.min(d,e.y-i*f),k+="C"+m+","+o+","+n+","+p+","+e.x+","+e.y):k+="L"+e.x+","+e.y:c&&null==g[h]||(k+="M"+e.x+","+e.y)),l=e;return k},c.gradients=function(a){var b,c,d,e,f,g,h,i;for(c=function(a,b){return(a.y-b.y)/(a.x-b.x)},i=[],d=g=0,h=a.length;h>g;d=++g)b=a[d],null!=b.y?(e=a[d+1]||{y:null},f=a[d-1]||{y:null},null!=f.y&&null!=e.y?i.push(c(f,e)):null!=f.y?i.push(c(f,b)):null!=e.y?i.push(c(b,e)):i.push(null)):i.push(null);return i},c.prototype.hilight=function(a){var b,c,d,e,f;if(null!==this.prevHilight&&this.prevHilight!==a)for(b=c=0,e=this.seriesPoints.length-1;e>=0?e>=c:c>=e;b=e>=0?++c:--c)this.seriesPoints[b][this.prevHilight]&&this.seriesPoints[b][this.prevHilight].animate(this.pointShrinkSeries(b));if(null!==a&&this.prevHilight!==a)for(b=d=0,f=this.seriesPoints.length-1;f>=0?f>=d:d>=f;b=f>=0?++d:--d)this.seriesPoints[b][a]&&this.seriesPoints[b][a].animate(this.pointGrowSeries(b));return this.prevHilight=a},c.prototype.colorFor=function(a,b,c){return"function"==typeof this.options.lineColors?this.options.lineColors.call(this,a,b,c):"point"===c?this.options.pointFillColors[b%this.options.pointFillColors.length]||this.options.lineColors[b%this.options.lineColors.length]:this.options.lineColors[b%this.options.lineColors.length]},c.prototype.drawXAxisLabel=function(a,b,c){return this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor)},c.prototype.drawLinePath=function(a,b,c){return this.raphael.path(a).attr("stroke",b).attr("stroke-width",this.lineWidthForSeries(c))},c.prototype.drawLinePoint=function(a,b,c,d){return this.raphael.circle(a,b,this.pointSizeForSeries(d)).attr("fill",c).attr("stroke-width",this.pointStrokeWidthForSeries(d)).attr("stroke",this.pointStrokeColorForSeries(d))},c.prototype.pointStrokeWidthForSeries=function(a){return this.options.pointStrokeWidths[a%this.options.pointStrokeWidths.length]},c.prototype.pointStrokeColorForSeries=function(a){return this.options.pointStrokeColors[a%this.options.pointStrokeColors.length]},c.prototype.lineWidthForSeries=function(a){return this.options.lineWidth instanceof Array?this.options.lineWidth[a%this.options.lineWidth.length]:this.options.lineWidth},c.prototype.pointSizeForSeries=function(a){return this.options.pointSize instanceof Array?this.options.pointSize[a%this.options.pointSize.length]:this.options.pointSize},c.prototype.pointGrowSeries=function(a){return Raphael.animation({r:this.pointSizeForSeries(a)+3},25,"linear")},c.prototype.pointShrinkSeries=function(a){return Raphael.animation({r:this.pointSizeForSeries(a)},25,"linear")},c}(b.Grid),b.labelSeries=function(c,d,e,f,g){var h,i,j,k,l,m,n,o,p,q,r;if(j=200*(d-c)/e,i=new Date(c),n=b.LABEL_SPECS[f],void 0===n)for(r=b.AUTO_LABEL_ORDER,p=0,q=r.length;q>p;p++)if(k=r[p],m=b.LABEL_SPECS[k],j>=m.span){n=m;break}for(void 0===n&&(n=b.LABEL_SPECS.second),g&&(n=a.extend({},n,{fmt:g})),h=n.start(i),l=[];(o=h.getTime())<=d;)o>=c&&l.push([n.fmt(h),o]),n.incr(h);return l},c=function(a){return{span:60*a*1e3,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate(),a.getHours())},fmt:function(a){return""+b.pad2(a.getHours())+":"+b.pad2(a.getMinutes())},incr:function(b){return b.setUTCMinutes(b.getUTCMinutes()+a)}}},d=function(a){return{span:1e3*a,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate(),a.getHours(),a.getMinutes())},fmt:function(a){return""+b.pad2(a.getHours())+":"+b.pad2(a.getMinutes())+":"+b.pad2(a.getSeconds())},incr:function(b){return b.setUTCSeconds(b.getUTCSeconds()+a)}}},b.LABEL_SPECS={decade:{span:1728e8,start:function(a){return new Date(a.getFullYear()-a.getFullYear()%10,0,1)},fmt:function(a){return""+a.getFullYear()},incr:function(a){return a.setFullYear(a.getFullYear()+10)}},year:{span:1728e7,start:function(a){return new Date(a.getFullYear(),0,1)},fmt:function(a){return""+a.getFullYear()},incr:function(a){return a.setFullYear(a.getFullYear()+1)}},month:{span:24192e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),1)},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)},incr:function(a){return a.setMonth(a.getMonth()+1)}},week:{span:6048e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate())},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)+"-"+b.pad2(a.getDate())},incr:function(a){return a.setDate(a.getDate()+7)}},day:{span:864e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate())},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)+"-"+b.pad2(a.getDate())},incr:function(a){return a.setDate(a.getDate()+1)}},hour:c(60),"30min":c(30),"15min":c(15),"10min":c(10),"5min":c(5),minute:c(1),"30sec":d(30),"15sec":d(15),"10sec":d(10),"5sec":d(5),second:d(1)},b.AUTO_LABEL_ORDER=["decade","year","month","week","day","hour","30min","15min","10min","5min","minute","30sec","15sec","10sec","5sec","second"],b.Area=function(c){function d(c){var f;return this instanceof b.Area?(f=a.extend({},e,c),this.cumulative=!f.behaveLikeLine,"auto"===f.fillOpacity&&(f.fillOpacity=f.behaveLikeLine?.8:1),d.__super__.constructor.call(this,f),void 0):new b.Area(c)}var e;return h(d,c),e={fillOpacity:"auto",behaveLikeLine:!1},d.prototype.calcPoints=function(){var a,b,c,d,e,f,g;for(f=this.data,g=[],d=0,e=f.length;e>d;d++)a=f[d],a._x=this.transX(a.x),b=0,a._y=function(){var d,e,f,g;for(f=a.y,g=[],d=0,e=f.length;e>d;d++)c=f[d],this.options.behaveLikeLine?g.push(this.transY(c)):(b+=c||0,g.push(this.transY(b)));return g}.call(this),g.push(a._ymax=Math.max.apply(Math,a._y));return g},d.prototype.drawSeries=function(){var a,b,c,d,e,f,g,h;for(this.seriesPoints=[],b=this.options.behaveLikeLine?function(){f=[];for(var a=0,b=this.options.ykeys.length-1;b>=0?b>=a:a>=b;b>=0?a++:a--)f.push(a);return f}.apply(this):function(){g=[];for(var a=e=this.options.ykeys.length-1;0>=e?0>=a:a>=0;0>=e?a++:a--)g.push(a);return g}.apply(this),h=[],c=0,d=b.length;d>c;c++)a=b[c],this._drawFillFor(a),this._drawLineFor(a),h.push(this._drawPointFor(a));return h},d.prototype._drawFillFor=function(a){var b;return b=this.paths[a],null!==b?(b+="L"+this.transX(this.xmax)+","+this.bottom+"L"+this.transX(this.xmin)+","+this.bottom+"Z",this.drawFilledPath(b,this.fillForSeries(a))):void 0},d.prototype.fillForSeries=function(a){var b;return b=Raphael.rgb2hsl(this.colorFor(this.data[a],a,"line")),Raphael.hsl(b.h,this.options.behaveLikeLine?.9*b.s:.75*b.s,Math.min(.98,this.options.behaveLikeLine?1.2*b.l:1.25*b.l))},d.prototype.drawFilledPath=function(a,b){return this.raphael.path(a).attr("fill",b).attr("fill-opacity",this.options.fillOpacity).attr("stroke","none")},d}(b.Line),b.Bar=function(c){function d(c){return this.onHoverOut=f(this.onHoverOut,this),this.onHoverMove=f(this.onHoverMove,this),this.onGridClick=f(this.onGridClick,this),this instanceof b.Bar?(d.__super__.constructor.call(this,a.extend({},c,{parseTime:!1})),void 0):new b.Bar(c)}return h(d,c),d.prototype.init=function(){return this.cumulative=this.options.stacked,"always"!==this.options.hideHover?(this.hover=new b.Hover({parent:this.el}),this.on("hovermove",this.onHoverMove),this.on("hoverout",this.onHoverOut),this.on("gridclick",this.onGridClick)):void 0},d.prototype.defaults={barSizeRatio:.75,barGap:3,barColors:["#0b62a4","#7a92a3","#4da74d","#afd8f8","#edc240","#cb4b4b","#9440ed"],barOpacity:1,barRadius:[0,0,0,0],xLabelMargin:50},d.prototype.calc=function(){var a;return this.calcBars(),this.options.hideHover===!1?(a=this.hover).update.apply(a,this.hoverContentForRow(this.data.length-1)):void 0},d.prototype.calcBars=function(){var a,b,c,d,e,f,g;for(f=this.data,g=[],a=d=0,e=f.length;e>d;a=++d)b=f[a],b._x=this.left+this.width*(a+.5)/this.data.length,g.push(b._y=function(){var a,d,e,f;for(e=b.y,f=[],a=0,d=e.length;d>a;a++)c=e[a],null!=c?f.push(this.transY(c)):f.push(null);return f}.call(this));return g},d.prototype.draw=function(){var a;return((a=this.options.axes)===!0||"both"===a||"x"===a)&&this.drawXAxis(),this.drawSeries()},d.prototype.drawXAxis=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m;for(j=this.bottom+(this.options.xAxisLabelTopPadding||this.options.padding/2),g=null,f=null,m=[],a=k=0,l=this.data.length;l>=0?l>k:k>l;a=l>=0?++k:--k)h=this.data[this.data.length-1-a],b=this.drawXAxisLabel(h._x,j,h.label),i=b.getBBox(),b.transform("r"+-this.options.xLabelAngle),c=b.getBBox(),b.transform("t0,"+c.height/2+"..."),0!==this.options.xLabelAngle&&(e=-.5*i.width*Math.cos(this.options.xLabelAngle*Math.PI/180),b.transform("t"+e+",0...")),(null==g||g>=c.x+c.width||null!=f&&f>=c.x)&&c.x>=0&&c.x+c.width<this.el.width()?(0!==this.options.xLabelAngle&&(d=1.25*this.options.gridTextSize/Math.sin(this.options.xLabelAngle*Math.PI/180),f=c.x-d),m.push(g=c.x-this.options.xLabelMargin)):m.push(b.remove());return m},d.prototype.drawSeries=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o;return c=this.width/this.options.data.length,h=this.options.stacked?1:this.options.ykeys.length,a=(c*this.options.barSizeRatio-this.options.barGap*(h-1))/h,this.options.barSize&&(a=Math.min(a,this.options.barSize)),l=c-a*h-this.options.barGap*(h-1),g=l/2,o=this.ymin<=0&&this.ymax>=0?this.transY(0):null,this.bars=function(){var h,l,p,q;for(p=this.data,q=[],d=h=0,l=p.length;l>h;d=++h)i=p[d],e=0,q.push(function(){var h,l,p,q;for(p=i._y,q=[],j=h=0,l=p.length;l>h;j=++h)n=p[j],null!==n?(o?(m=Math.min(n,o),b=Math.max(n,o)):(m=n,b=this.bottom),f=this.left+d*c+g,this.options.stacked||(f+=j*(a+this.options.barGap)),k=b-m,this.options.verticalGridCondition&&this.options.verticalGridCondition(i.x)&&this.drawBar(this.left+d*c,this.top,c,Math.abs(this.top-this.bottom),this.options.verticalGridColor,this.options.verticalGridOpacity,this.options.barRadius),this.options.stacked&&(m-=e),this.drawBar(f,m,a,k,this.colorFor(i,j,"bar"),this.options.barOpacity,this.options.barRadius),q.push(e+=k)):q.push(null);return q}.call(this));return q}.call(this)},d.prototype.colorFor=function(a,b,c){var d,e;return"function"==typeof this.options.barColors?(d={x:a.x,y:a.y[b],label:a.label},e={index:b,key:this.options.ykeys[b],label:this.options.labels[b]},this.options.barColors.call(this,d,e,c)):this.options.barColors[b%this.options.barColors.length]},d.prototype.hitTest=function(a){return 0===this.data.length?null:(a=Math.max(Math.min(a,this.right),this.left),Math.min(this.data.length-1,Math.floor((a-this.left)/(this.width/this.data.length))))},d.prototype.onGridClick=function(a,b){var c;return c=this.hitTest(a),this.fire("click",c,this.data[c].src,a,b)},d.prototype.onHoverMove=function(a){var b,c;return b=this.hitTest(a),(c=this.hover).update.apply(c,this.hoverContentForRow(b))},d.prototype.onHoverOut=function(){return this.options.hideHover!==!1?this.hover.hide():void 0},d.prototype.hoverContentForRow=function(a){var b,c,d,e,f,g,h,i;for(d=this.data[a],b="<div class='morris-hover-row-label'>"+d.label+"</div>",i=d.y,c=g=0,h=i.length;h>g;c=++g)f=i[c],b+="<div class='morris-hover-point' style='color: "+this.colorFor(d,c,"label")+"'>\n "+this.options.labels[c]+":\n "+this.yLabelFormat(f)+"\n</div>";return"function"==typeof this.options.hoverCallback&&(b=this.options.hoverCallback(a,this.options,b,d.src)),e=this.left+(a+.5)*this.width/this.data.length,[b,e]},d.prototype.drawXAxisLabel=function(a,b,c){var d;return d=this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor)},d.prototype.drawBar=function(a,b,c,d,e,f,g){var h,i;return h=Math.max.apply(Math,g),i=0===h||h>d?this.raphael.rect(a,b,c,d):this.raphael.path(this.roundedRect(a,b,c,d,g)),i.attr("fill",e).attr("fill-opacity",f).attr("stroke","none")},d.prototype.roundedRect=function(a,b,c,d,e){return null==e&&(e=[0,0,0,0]),["M",a,e[0]+b,"Q",a,b,a+e[0],b,"L",a+c-e[1],b,"Q",a+c,b,a+c,b+e[1],"L",a+c,b+d-e[2],"Q",a+c,b+d,a+c-e[2],b+d,"L",a+e[3],b+d,"Q",a,b+d,a,b+d-e[3],"Z"]},d}(b.Grid),b.Donut=function(c){function d(c){this.resizeHandler=f(this.resizeHandler,this),this.select=f(this.select,this),this.click=f(this.click,this);var d=this;if(!(this instanceof b.Donut))return new b.Donut(c);if(this.options=a.extend({},this.defaults,c),this.el="string"==typeof c.element?a(document.getElementById(c.element)):a(c.element),null===this.el||0===this.el.length)throw new Error("Graph placeholder not found.");void 0!==c.data&&0!==c.data.length&&(this.raphael=new Raphael(this.el[0]),this.options.resize&&a(window).bind("resize",function(){return null!=d.timeoutId&&window.clearTimeout(d.timeoutId),d.timeoutId=window.setTimeout(d.resizeHandler,100)}),this.setData(c.data))}return h(d,c),d.prototype.defaults={colors:["#0B62A4","#3980B5","#679DC6","#95BBD7","#B0CCE1","#095791","#095085","#083E67","#052C48","#042135"],backgroundColor:"#FFFFFF",labelColor:"#000000",formatter:b.commas,resize:!1},d.prototype.redraw=function(){var a,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x;for(this.raphael.clear(),c=this.el.width()/2,d=this.el.height()/2,n=(Math.min(c,d)-10)/3,l=0,u=this.values,o=0,r=u.length;r>o;o++)m=u[o],l+=m;for(i=5/(2*n),a=1.9999*Math.PI-i*this.data.length,g=0,f=0,this.segments=[],v=this.values,e=p=0,s=v.length;s>p;e=++p)m=v[e],j=g+i+a*(m/l),k=new b.DonutSegment(c,d,2*n,n,g,j,this.data[e].color||this.options.colors[f%this.options.colors.length],this.options.backgroundColor,f,this.raphael),k.render(),this.segments.push(k),k.on("hover",this.select),k.on("click",this.click),g=j,f+=1;for(this.text1=this.drawEmptyDonutLabel(c,d-10,this.options.labelColor,15,800),this.text2=this.drawEmptyDonutLabel(c,d+10,this.options.labelColor,14),h=Math.max.apply(Math,this.values),f=0,w=this.values,x=[],q=0,t=w.length;t>q;q++){if(m=w[q],m===h){this.select(f); +break}x.push(f+=1)}return x},d.prototype.setData=function(a){var b;return this.data=a,this.values=function(){var a,c,d,e;for(d=this.data,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(parseFloat(b.value));return e}.call(this),this.redraw()},d.prototype.click=function(a){return this.fire("click",a,this.data[a])},d.prototype.select=function(a){var b,c,d,e,f,g;for(g=this.segments,e=0,f=g.length;f>e;e++)c=g[e],c.deselect();return d=this.segments[a],d.select(),b=this.data[a],this.setLabels(b.label,this.options.formatter(b.value,b))},d.prototype.setLabels=function(a,b){var c,d,e,f,g,h,i,j;return c=2*(Math.min(this.el.width()/2,this.el.height()/2)-10)/3,f=1.8*c,e=c/2,d=c/3,this.text1.attr({text:a,transform:""}),g=this.text1.getBBox(),h=Math.min(f/g.width,e/g.height),this.text1.attr({transform:"S"+h+","+h+","+(g.x+g.width/2)+","+(g.y+g.height)}),this.text2.attr({text:b,transform:""}),i=this.text2.getBBox(),j=Math.min(f/i.width,d/i.height),this.text2.attr({transform:"S"+j+","+j+","+(i.x+i.width/2)+","+i.y})},d.prototype.drawEmptyDonutLabel=function(a,b,c,d,e){var f;return f=this.raphael.text(a,b,"").attr("font-size",d).attr("fill",c),null!=e&&f.attr("font-weight",e),f},d.prototype.resizeHandler=function(){return this.timeoutId=null,this.raphael.setSize(this.el.width(),this.el.height()),this.redraw()},d}(b.EventEmitter),b.DonutSegment=function(a){function b(a,b,c,d,e,g,h,i,j,k){this.cx=a,this.cy=b,this.inner=c,this.outer=d,this.color=h,this.backgroundColor=i,this.index=j,this.raphael=k,this.deselect=f(this.deselect,this),this.select=f(this.select,this),this.sin_p0=Math.sin(e),this.cos_p0=Math.cos(e),this.sin_p1=Math.sin(g),this.cos_p1=Math.cos(g),this.is_long=g-e>Math.PI?1:0,this.path=this.calcSegment(this.inner+3,this.inner+this.outer-5),this.selectedPath=this.calcSegment(this.inner+3,this.inner+this.outer),this.hilight=this.calcArc(this.inner)}return h(b,a),b.prototype.calcArcPoints=function(a){return[this.cx+a*this.sin_p0,this.cy+a*this.cos_p0,this.cx+a*this.sin_p1,this.cy+a*this.cos_p1]},b.prototype.calcSegment=function(a,b){var c,d,e,f,g,h,i,j,k,l;return k=this.calcArcPoints(a),c=k[0],e=k[1],d=k[2],f=k[3],l=this.calcArcPoints(b),g=l[0],i=l[1],h=l[2],j=l[3],"M"+c+","+e+("A"+a+","+a+",0,"+this.is_long+",0,"+d+","+f)+("L"+h+","+j)+("A"+b+","+b+",0,"+this.is_long+",1,"+g+","+i)+"Z"},b.prototype.calcArc=function(a){var b,c,d,e,f;return f=this.calcArcPoints(a),b=f[0],d=f[1],c=f[2],e=f[3],"M"+b+","+d+("A"+a+","+a+",0,"+this.is_long+",0,"+c+","+e)},b.prototype.render=function(){var a=this;return this.arc=this.drawDonutArc(this.hilight,this.color),this.seg=this.drawDonutSegment(this.path,this.color,this.backgroundColor,function(){return a.fire("hover",a.index)},function(){return a.fire("click",a.index)})},b.prototype.drawDonutArc=function(a,b){return this.raphael.path(a).attr({stroke:b,"stroke-width":2,opacity:0})},b.prototype.drawDonutSegment=function(a,b,c,d,e){return this.raphael.path(a).attr({fill:b,stroke:c,"stroke-width":3}).hover(d).click(e)},b.prototype.select=function(){return this.selected?void 0:(this.seg.animate({path:this.selectedPath},150,"<>"),this.arc.animate({opacity:1},150,"<>"),this.selected=!0)},b.prototype.deselect=function(){return this.selected?(this.seg.animate({path:this.path},150,"<>"),this.arc.animate({opacity:0},150,"<>"),this.selected=!1):void 0},b}(b.EventEmitter)}).call(this); \ No newline at end of file diff --git a/theme/bootstrap/js/plugins/morris/raphael.min.js b/theme/bootstrap/js/plugins/morris/raphael.min.js new file mode 100644 index 0000000..b40a005 --- /dev/null +++ b/theme/bootstrap/js/plugins/morris/raphael.min.js @@ -0,0 +1,11 @@ +// ┌────────────────────────────────────────────────────────────────────┐ \\ +// │ Raphaël 2.1.2 - JavaScript Vector Library │ \\ +// ├────────────────────────────────────────────────────────────────────┤ \\ +// │ Copyright © 2008-2012 Dmitry Baranovskiy (http://raphaeljs.com) │ \\ +// │ Copyright © 2008-2012 Sencha Labs (http://sencha.com) │ \\ +// ├────────────────────────────────────────────────────────────────────┤ \\ +// │ Licensed under the MIT (http://raphaeljs.com/license.html) license.│ \\ +// └────────────────────────────────────────────────────────────────────┘ \\ +!function(a){var b,c,d="0.4.2",e="hasOwnProperty",f=/[\.\/]/,g="*",h=function(){},i=function(a,b){return a-b},j={n:{}},k=function(a,d){a=String(a);var e,f=c,g=Array.prototype.slice.call(arguments,2),h=k.listeners(a),j=0,l=[],m={},n=[],o=b;b=a,c=0;for(var p=0,q=h.length;q>p;p++)"zIndex"in h[p]&&(l.push(h[p].zIndex),h[p].zIndex<0&&(m[h[p].zIndex]=h[p]));for(l.sort(i);l[j]<0;)if(e=m[l[j++]],n.push(e.apply(d,g)),c)return c=f,n;for(p=0;q>p;p++)if(e=h[p],"zIndex"in e)if(e.zIndex==l[j]){if(n.push(e.apply(d,g)),c)break;do if(j++,e=m[l[j]],e&&n.push(e.apply(d,g)),c)break;while(e)}else m[e.zIndex]=e;else if(n.push(e.apply(d,g)),c)break;return c=f,b=o,n.length?n:null};k._events=j,k.listeners=function(a){var b,c,d,e,h,i,k,l,m=a.split(f),n=j,o=[n],p=[];for(e=0,h=m.length;h>e;e++){for(l=[],i=0,k=o.length;k>i;i++)for(n=o[i].n,c=[n[m[e]],n[g]],d=2;d--;)b=c[d],b&&(l.push(b),p=p.concat(b.f||[]));o=l}return p},k.on=function(a,b){if(a=String(a),"function"!=typeof b)return function(){};for(var c=a.split(f),d=j,e=0,g=c.length;g>e;e++)d=d.n,d=d.hasOwnProperty(c[e])&&d[c[e]]||(d[c[e]]={n:{}});for(d.f=d.f||[],e=0,g=d.f.length;g>e;e++)if(d.f[e]==b)return h;return d.f.push(b),function(a){+a==+a&&(b.zIndex=+a)}},k.f=function(a){var b=[].slice.call(arguments,1);return function(){k.apply(null,[a,null].concat(b).concat([].slice.call(arguments,0)))}},k.stop=function(){c=1},k.nt=function(a){return a?new RegExp("(?:\\.|\\/|^)"+a+"(?:\\.|\\/|$)").test(b):b},k.nts=function(){return b.split(f)},k.off=k.unbind=function(a,b){if(!a)return k._events=j={n:{}},void 0;var c,d,h,i,l,m,n,o=a.split(f),p=[j];for(i=0,l=o.length;l>i;i++)for(m=0;m<p.length;m+=h.length-2){if(h=[m,1],c=p[m].n,o[i]!=g)c[o[i]]&&h.push(c[o[i]]);else for(d in c)c[e](d)&&h.push(c[d]);p.splice.apply(p,h)}for(i=0,l=p.length;l>i;i++)for(c=p[i];c.n;){if(b){if(c.f){for(m=0,n=c.f.length;n>m;m++)if(c.f[m]==b){c.f.splice(m,1);break}!c.f.length&&delete c.f}for(d in c.n)if(c.n[e](d)&&c.n[d].f){var q=c.n[d].f;for(m=0,n=q.length;n>m;m++)if(q[m]==b){q.splice(m,1);break}!q.length&&delete c.n[d].f}}else{delete c.f;for(d in c.n)c.n[e](d)&&c.n[d].f&&delete c.n[d].f}c=c.n}},k.once=function(a,b){var c=function(){return k.unbind(a,c),b.apply(this,arguments)};return k.on(a,c)},k.version=d,k.toString=function(){return"You are running Eve "+d},"undefined"!=typeof module&&module.exports?module.exports=k:"undefined"!=typeof define?define("eve",[],function(){return k}):a.eve=k}(this),function(a,b){"function"==typeof define&&define.amd?define(["eve"],function(c){return b(a,c)}):b(a,a.eve)}(this,function(a,b){function c(a){if(c.is(a,"function"))return u?a():b.on("raphael.DOMload",a);if(c.is(a,V))return c._engine.create[D](c,a.splice(0,3+c.is(a[0],T))).add(a);var d=Array.prototype.slice.call(arguments,0);if(c.is(d[d.length-1],"function")){var e=d.pop();return u?e.call(c._engine.create[D](c,d)):b.on("raphael.DOMload",function(){e.call(c._engine.create[D](c,d))})}return c._engine.create[D](c,arguments)}function d(a){if("function"==typeof a||Object(a)!==a)return a;var b=new a.constructor;for(var c in a)a[z](c)&&(b[c]=d(a[c]));return b}function e(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return a.push(a.splice(c,1)[0])}function f(a,b,c){function d(){var f=Array.prototype.slice.call(arguments,0),g=f.join("␀"),h=d.cache=d.cache||{},i=d.count=d.count||[];return h[z](g)?(e(i,g),c?c(h[g]):h[g]):(i.length>=1e3&&delete h[i.shift()],i.push(g),h[g]=a[D](b,f),c?c(h[g]):h[g])}return d}function g(){return this.hex}function h(a,b){for(var c=[],d=0,e=a.length;e-2*!b>d;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push(["C",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])}return c}function i(a,b,c,d,e){var f=-3*b+9*c-9*d+3*e,g=a*f+6*b-12*c+6*d;return a*g-3*b+3*c}function j(a,b,c,d,e,f,g,h,j){null==j&&(j=1),j=j>1?1:0>j?0:j;for(var k=j/2,l=12,m=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],n=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],o=0,p=0;l>p;p++){var q=k*m[p]+k,r=i(q,a,c,e,g),s=i(q,b,d,f,h),t=r*r+s*s;o+=n[p]*N.sqrt(t)}return k*o}function k(a,b,c,d,e,f,g,h,i){if(!(0>i||j(a,b,c,d,e,f,g,h)<i)){var k,l=1,m=l/2,n=l-m,o=.01;for(k=j(a,b,c,d,e,f,g,h,n);Q(k-i)>o;)m/=2,n+=(i>k?1:-1)*m,k=j(a,b,c,d,e,f,g,h,n);return n}}function l(a,b,c,d,e,f,g,h){if(!(O(a,c)<P(e,g)||P(a,c)>O(e,g)||O(b,d)<P(f,h)||P(b,d)>O(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(k){var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(!(n<+P(a,c).toFixed(2)||n>+O(a,c).toFixed(2)||n<+P(e,g).toFixed(2)||n>+O(e,g).toFixed(2)||o<+P(b,d).toFixed(2)||o>+O(b,d).toFixed(2)||o<+P(f,h).toFixed(2)||o>+O(f,h).toFixed(2)))return{x:l,y:m}}}}function m(a,b,d){var e=c.bezierBBox(a),f=c.bezierBBox(b);if(!c.isBBoxIntersect(e,f))return d?0:[];for(var g=j.apply(0,a),h=j.apply(0,b),i=O(~~(g/5),1),k=O(~~(h/5),1),m=[],n=[],o={},p=d?0:[],q=0;i+1>q;q++){var r=c.findDotsAtSegment.apply(c,a.concat(q/i));m.push({x:r.x,y:r.y,t:q/i})}for(q=0;k+1>q;q++)r=c.findDotsAtSegment.apply(c,b.concat(q/k)),n.push({x:r.x,y:r.y,t:q/k});for(q=0;i>q;q++)for(var s=0;k>s;s++){var t=m[q],u=m[q+1],v=n[s],w=n[s+1],x=Q(u.x-t.x)<.001?"y":"x",y=Q(w.x-v.x)<.001?"y":"x",z=l(t.x,t.y,u.x,u.y,v.x,v.y,w.x,w.y);if(z){if(o[z.x.toFixed(4)]==z.y.toFixed(4))continue;o[z.x.toFixed(4)]=z.y.toFixed(4);var A=t.t+Q((z[x]-t[x])/(u[x]-t[x]))*(u.t-t.t),B=v.t+Q((z[y]-v[y])/(w[y]-v[y]))*(w.t-v.t);A>=0&&1.001>=A&&B>=0&&1.001>=B&&(d?p++:p.push({x:z.x,y:z.y,t1:P(A,1),t2:P(B,1)}))}}return p}function n(a,b,d){a=c._path2curve(a),b=c._path2curve(b);for(var e,f,g,h,i,j,k,l,n,o,p=d?0:[],q=0,r=a.length;r>q;q++){var s=a[q];if("M"==s[0])e=i=s[1],f=j=s[2];else{"C"==s[0]?(n=[e,f].concat(s.slice(1)),e=n[6],f=n[7]):(n=[e,f,e,f,i,j,i,j],e=i,f=j);for(var t=0,u=b.length;u>t;t++){var v=b[t];if("M"==v[0])g=k=v[1],h=l=v[2];else{"C"==v[0]?(o=[g,h].concat(v.slice(1)),g=o[6],h=o[7]):(o=[g,h,g,h,k,l,k,l],g=k,h=l);var w=m(n,o,d);if(d)p+=w;else{for(var x=0,y=w.length;y>x;x++)w[x].segment1=q,w[x].segment2=t,w[x].bez1=n,w[x].bez2=o;p=p.concat(w)}}}}}return p}function o(a,b,c,d,e,f){null!=a?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function p(){return this.x+H+this.y+H+this.width+" × "+this.height}function q(a,b,c,d,e,f){function g(a){return((l*a+k)*a+j)*a}function h(a,b){var c=i(a,b);return((o*c+n)*c+m)*c}function i(a,b){var c,d,e,f,h,i;for(e=a,i=0;8>i;i++){if(f=g(e)-a,Q(f)<b)return e;if(h=(3*l*e+2*k)*e+j,Q(h)<1e-6)break;e-=f/h}if(c=0,d=1,e=a,c>e)return c;if(e>d)return d;for(;d>c;){if(f=g(e),Q(f-a)<b)return e;a>f?c=e:d=e,e=(d-c)/2+c}return e}var j=3*b,k=3*(d-b)-j,l=1-j-k,m=3*c,n=3*(e-c)-m,o=1-m-n;return h(a,1/(200*f))}function r(a,b){var c=[],d={};if(this.ms=b,this.times=1,a){for(var e in a)a[z](e)&&(d[_(e)]=a[e],c.push(_(e)));c.sort(lb)}this.anim=d,this.top=c[c.length-1],this.percents=c}function s(a,d,e,f,g,h){e=_(e);var i,j,k,l,m,n,p=a.ms,r={},s={},t={};if(f)for(v=0,x=ic.length;x>v;v++){var u=ic[v];if(u.el.id==d.id&&u.anim==a){u.percent!=e?(ic.splice(v,1),k=1):j=u,d.attr(u.totalOrigin);break}}else f=+s;for(var v=0,x=a.percents.length;x>v;v++){if(a.percents[v]==e||a.percents[v]>f*a.top){e=a.percents[v],m=a.percents[v-1]||0,p=p/a.top*(e-m),l=a.percents[v+1],i=a.anim[e];break}f&&d.attr(a.anim[a.percents[v]])}if(i){if(j)j.initstatus=f,j.start=new Date-j.ms*f;else{for(var y in i)if(i[z](y)&&(db[z](y)||d.paper.customAttributes[z](y)))switch(r[y]=d.attr(y),null==r[y]&&(r[y]=cb[y]),s[y]=i[y],db[y]){case T:t[y]=(s[y]-r[y])/p;break;case"colour":r[y]=c.getRGB(r[y]);var A=c.getRGB(s[y]);t[y]={r:(A.r-r[y].r)/p,g:(A.g-r[y].g)/p,b:(A.b-r[y].b)/p};break;case"path":var B=Kb(r[y],s[y]),C=B[1];for(r[y]=B[0],t[y]=[],v=0,x=r[y].length;x>v;v++){t[y][v]=[0];for(var D=1,F=r[y][v].length;F>D;D++)t[y][v][D]=(C[v][D]-r[y][v][D])/p}break;case"transform":var G=d._,H=Pb(G[y],s[y]);if(H)for(r[y]=H.from,s[y]=H.to,t[y]=[],t[y].real=!0,v=0,x=r[y].length;x>v;v++)for(t[y][v]=[r[y][v][0]],D=1,F=r[y][v].length;F>D;D++)t[y][v][D]=(s[y][v][D]-r[y][v][D])/p;else{var K=d.matrix||new o,L={_:{transform:G.transform},getBBox:function(){return d.getBBox(1)}};r[y]=[K.a,K.b,K.c,K.d,K.e,K.f],Nb(L,s[y]),s[y]=L._.transform,t[y]=[(L.matrix.a-K.a)/p,(L.matrix.b-K.b)/p,(L.matrix.c-K.c)/p,(L.matrix.d-K.d)/p,(L.matrix.e-K.e)/p,(L.matrix.f-K.f)/p]}break;case"csv":var M=I(i[y])[J](w),N=I(r[y])[J](w);if("clip-rect"==y)for(r[y]=N,t[y]=[],v=N.length;v--;)t[y][v]=(M[v]-r[y][v])/p;s[y]=M;break;default:for(M=[][E](i[y]),N=[][E](r[y]),t[y]=[],v=d.paper.customAttributes[y].length;v--;)t[y][v]=((M[v]||0)-(N[v]||0))/p}var O=i.easing,P=c.easing_formulas[O];if(!P)if(P=I(O).match(Z),P&&5==P.length){var Q=P;P=function(a){return q(a,+Q[1],+Q[2],+Q[3],+Q[4],p)}}else P=nb;if(n=i.start||a.start||+new Date,u={anim:a,percent:e,timestamp:n,start:n+(a.del||0),status:0,initstatus:f||0,stop:!1,ms:p,easing:P,from:r,diff:t,to:s,el:d,callback:i.callback,prev:m,next:l,repeat:h||a.times,origin:d.attr(),totalOrigin:g},ic.push(u),f&&!j&&!k&&(u.stop=!0,u.start=new Date-p*f,1==ic.length))return kc();k&&(u.start=new Date-u.ms*f),1==ic.length&&jc(kc)}b("raphael.anim.start."+d.id,d,a)}}function t(a){for(var b=0;b<ic.length;b++)ic[b].el.paper==a&&ic.splice(b--,1)}c.version="2.1.2",c.eve=b;var u,v,w=/[, ]+/,x={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},y=/\{(\d+)\}/g,z="hasOwnProperty",A={doc:document,win:a},B={was:Object.prototype[z].call(A.win,"Raphael"),is:A.win.Raphael},C=function(){this.ca=this.customAttributes={}},D="apply",E="concat",F="ontouchstart"in A.win||A.win.DocumentTouch&&A.doc instanceof DocumentTouch,G="",H=" ",I=String,J="split",K="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[J](H),L={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},M=I.prototype.toLowerCase,N=Math,O=N.max,P=N.min,Q=N.abs,R=N.pow,S=N.PI,T="number",U="string",V="array",W=Object.prototype.toString,X=(c._ISURL=/^url\(['"]?([^\)]+?)['"]?\)$/i,/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i),Y={NaN:1,Infinity:1,"-Infinity":1},Z=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,$=N.round,_=parseFloat,ab=parseInt,bb=I.prototype.toUpperCase,cb=c._availableAttrs={"arrow-end":"none","arrow-start":"none",blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/","letter-spacing":0,opacity:1,path:"M0,0",r:0,rx:0,ry:0,src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",transform:"",width:0,x:0,y:0},db=c._availableAnimAttrs={blur:T,"clip-rect":"csv",cx:T,cy:T,fill:"colour","fill-opacity":T,"font-size":T,height:T,opacity:T,path:"path",r:T,rx:T,ry:T,stroke:"colour","stroke-opacity":T,"stroke-width":T,transform:"transform",width:T,x:T,y:T},eb=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/,fb={hs:1,rg:1},gb=/,?([achlmqrstvxz]),?/gi,hb=/([achlmrqstvz])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,ib=/([rstm])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,jb=/(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/gi,kb=(c._radial_gradient=/^r(?:\(([^,]+?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*([^\)]+?)\))?/,{}),lb=function(a,b){return _(a)-_(b)},mb=function(){},nb=function(a){return a},ob=c._rectPath=function(a,b,c,d,e){return e?[["M",a+e,b],["l",c-2*e,0],["a",e,e,0,0,1,e,e],["l",0,d-2*e],["a",e,e,0,0,1,-e,e],["l",2*e-c,0],["a",e,e,0,0,1,-e,-e],["l",0,2*e-d],["a",e,e,0,0,1,e,-e],["z"]]:[["M",a,b],["l",c,0],["l",0,d],["l",-c,0],["z"]]},pb=function(a,b,c,d){return null==d&&(d=c),[["M",a,b],["m",0,-d],["a",c,d,0,1,1,0,2*d],["a",c,d,0,1,1,0,-2*d],["z"]]},qb=c._getPath={path:function(a){return a.attr("path")},circle:function(a){var b=a.attrs;return pb(b.cx,b.cy,b.r)},ellipse:function(a){var b=a.attrs;return pb(b.cx,b.cy,b.rx,b.ry)},rect:function(a){var b=a.attrs;return ob(b.x,b.y,b.width,b.height,b.r)},image:function(a){var b=a.attrs;return ob(b.x,b.y,b.width,b.height)},text:function(a){var b=a._getBBox();return ob(b.x,b.y,b.width,b.height)},set:function(a){var b=a._getBBox();return ob(b.x,b.y,b.width,b.height)}},rb=c.mapPath=function(a,b){if(!b)return a;var c,d,e,f,g,h,i;for(a=Kb(a),e=0,g=a.length;g>e;e++)for(i=a[e],f=1,h=i.length;h>f;f+=2)c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d;return a};if(c._g=A,c.type=A.win.SVGAngle||A.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML","VML"==c.type){var sb,tb=A.doc.createElement("div");if(tb.innerHTML='<v:shape adj="1"/>',sb=tb.firstChild,sb.style.behavior="url(#default#VML)",!sb||"object"!=typeof sb.adj)return c.type=G;tb=null}c.svg=!(c.vml="VML"==c.type),c._Paper=C,c.fn=v=C.prototype=c.prototype,c._id=0,c._oid=0,c.is=function(a,b){return b=M.call(b),"finite"==b?!Y[z](+a):"array"==b?a instanceof Array:"null"==b&&null===a||b==typeof a&&null!==a||"object"==b&&a===Object(a)||"array"==b&&Array.isArray&&Array.isArray(a)||W.call(a).slice(8,-1).toLowerCase()==b},c.angle=function(a,b,d,e,f,g){if(null==f){var h=a-d,i=b-e;return h||i?(180+180*N.atan2(-i,-h)/S+360)%360:0}return c.angle(a,b,f,g)-c.angle(d,e,f,g)},c.rad=function(a){return a%360*S/180},c.deg=function(a){return 180*a/S%360},c.snapTo=function(a,b,d){if(d=c.is(d,"finite")?d:10,c.is(a,V)){for(var e=a.length;e--;)if(Q(a[e]-b)<=d)return a[e]}else{a=+a;var f=b%a;if(d>f)return b-f;if(f>a-d)return b-f+a}return b},c.createUUID=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=0|16*N.random(),c="x"==a?b:8|3&b;return c.toString(16)}),c.setWindow=function(a){b("raphael.setWindow",c,A.win,a),A.win=a,A.doc=A.win.document,c._engine.initWin&&c._engine.initWin(A.win)};var ub=function(a){if(c.vml){var b,d=/^\s+|\s+$/g;try{var e=new ActiveXObject("htmlfile");e.write("<body>"),e.close(),b=e.body}catch(g){b=createPopup().document.body}var h=b.createTextRange();ub=f(function(a){try{b.style.color=I(a).replace(d,G);var c=h.queryCommandValue("ForeColor");return c=(255&c)<<16|65280&c|(16711680&c)>>>16,"#"+("000000"+c.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=A.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",A.doc.body.appendChild(i),ub=f(function(a){return i.style.color=a,A.doc.defaultView.getComputedStyle(i,G).getPropertyValue("color")})}return ub(a)},vb=function(){return"hsb("+[this.h,this.s,this.b]+")"},wb=function(){return"hsl("+[this.h,this.s,this.l]+")"},xb=function(){return this.hex},yb=function(a,b,d){if(null==b&&c.is(a,"object")&&"r"in a&&"g"in a&&"b"in a&&(d=a.b,b=a.g,a=a.r),null==b&&c.is(a,U)){var e=c.getRGB(a);a=e.r,b=e.g,d=e.b}return(a>1||b>1||d>1)&&(a/=255,b/=255,d/=255),[a,b,d]},zb=function(a,b,d,e){a*=255,b*=255,d*=255;var f={r:a,g:b,b:d,hex:c.rgb(a,b,d),toString:xb};return c.is(e,"finite")&&(f.opacity=e),f};c.color=function(a){var b;return c.is(a,"object")&&"h"in a&&"s"in a&&"b"in a?(b=c.hsb2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.hex=b.hex):c.is(a,"object")&&"h"in a&&"s"in a&&"l"in a?(b=c.hsl2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.hex=b.hex):(c.is(a,"string")&&(a=c.getRGB(a)),c.is(a,"object")&&"r"in a&&"g"in a&&"b"in a?(b=c.rgb2hsl(a),a.h=b.h,a.s=b.s,a.l=b.l,b=c.rgb2hsb(a),a.v=b.b):(a={hex:"none"},a.r=a.g=a.b=a.h=a.s=a.v=a.l=-1)),a.toString=xb,a},c.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,a=a.h,d=a.o),a*=360;var e,f,g,h,i;return a=a%360/60,i=c*b,h=i*(1-Q(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],zb(e,f,g,d)},c.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h),(a>1||b>1||c>1)&&(a/=360,b/=100,c/=100),a*=360;var e,f,g,h,i;return a=a%360/60,i=2*b*(.5>c?c:1-c),h=i*(1-Q(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],zb(e,f,g,d)},c.rgb2hsb=function(a,b,c){c=yb(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;return f=O(a,b,c),g=f-P(a,b,c),d=0==g?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=60*((d+360)%6)/360,e=0==g?0:g/f,{h:d,s:e,b:f,toString:vb}},c.rgb2hsl=function(a,b,c){c=yb(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;return g=O(a,b,c),h=P(a,b,c),i=g-h,d=0==i?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=60*((d+360)%6)/360,f=(g+h)/2,e=0==i?0:.5>f?i/(2*f):i/(2-2*f),{h:d,s:e,l:f,toString:wb}},c._path2string=function(){return this.join(",").replace(gb,"$1")},c._preload=function(a,b){var c=A.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top:-9999em",c.onload=function(){b.call(this),this.onload=null,A.doc.body.removeChild(this)},c.onerror=function(){A.doc.body.removeChild(this)},A.doc.body.appendChild(c),c.src=a},c.getRGB=f(function(a){if(!a||(a=I(a)).indexOf("-")+1)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:g};if("none"==a)return{r:-1,g:-1,b:-1,hex:"none",toString:g};!(fb[z](a.toLowerCase().substring(0,2))||"#"==a.charAt())&&(a=ub(a));var b,d,e,f,h,i,j=a.match(X);return j?(j[2]&&(e=ab(j[2].substring(5),16),d=ab(j[2].substring(3,5),16),b=ab(j[2].substring(1,3),16)),j[3]&&(e=ab((h=j[3].charAt(3))+h,16),d=ab((h=j[3].charAt(2))+h,16),b=ab((h=j[3].charAt(1))+h,16)),j[4]&&(i=j[4][J](eb),b=_(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),"rgba"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&"%"==i[3].slice(-1)&&(f/=100)),j[5]?(i=j[5][J](eb),b=_(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(b/=360),"hsba"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&"%"==i[3].slice(-1)&&(f/=100),c.hsb2rgb(b,d,e,f)):j[6]?(i=j[6][J](eb),b=_(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(b/=360),"hsla"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&"%"==i[3].slice(-1)&&(f/=100),c.hsl2rgb(b,d,e,f)):(j={r:b,g:d,b:e,toString:g},j.hex="#"+(16777216|e|d<<8|b<<16).toString(16).slice(1),c.is(f,"finite")&&(j.opacity=f),j)):{r:-1,g:-1,b:-1,hex:"none",error:1,toString:g}},c),c.hsb=f(function(a,b,d){return c.hsb2rgb(a,b,d).hex}),c.hsl=f(function(a,b,d){return c.hsl2rgb(a,b,d).hex}),c.rgb=f(function(a,b,c){return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),c.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);return b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b})),c.hex},c.getColor.reset=function(){delete this.start},c.parsePathString=function(a){if(!a)return null;var b=Ab(a);if(b.arr)return Cb(b.arr);var d={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},e=[];return c.is(a,V)&&c.is(a[0],V)&&(e=Cb(a)),e.length||I(a).replace(hb,function(a,b,c){var f=[],g=b.toLowerCase();if(c.replace(jb,function(a,b){b&&f.push(+b)}),"m"==g&&f.length>2&&(e.push([b][E](f.splice(0,2))),g="l",b="m"==b?"l":"L"),"r"==g)e.push([b][E](f));else for(;f.length>=d[g]&&(e.push([b][E](f.splice(0,d[g]))),d[g]););}),e.toString=c._path2string,b.arr=Cb(e),e},c.parseTransformString=f(function(a){if(!a)return null;var b=[];return c.is(a,V)&&c.is(a[0],V)&&(b=Cb(a)),b.length||I(a).replace(ib,function(a,c,d){var e=[];M.call(c),d.replace(jb,function(a,b){b&&e.push(+b)}),b.push([c][E](e))}),b.toString=c._path2string,b});var Ab=function(a){var b=Ab.ps=Ab.ps||{};return b[a]?b[a].sleep=100:b[a]={sleep:100},setTimeout(function(){for(var c in b)b[z](c)&&c!=a&&(b[c].sleep--,!b[c].sleep&&delete b[c])}),b[a]};c.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=R(j,3),l=R(j,2),m=i*i,n=m*i,o=k*a+3*l*i*c+3*j*i*i*e+n*g,p=k*b+3*l*i*d+3*j*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,w=j*e+i*g,x=j*f+i*h,y=90-180*N.atan2(q-s,r-t)/S;return(q>s||t>r)&&(y+=180),{x:o,y:p,m:{x:q,y:r},n:{x:s,y:t},start:{x:u,y:v},end:{x:w,y:x},alpha:y}},c.bezierBBox=function(a,b,d,e,f,g,h,i){c.is(a,"array")||(a=[a,b,d,e,f,g,h,i]);var j=Jb.apply(null,a);return{x:j.min.x,y:j.min.y,x2:j.max.x,y2:j.max.y,width:j.max.x-j.min.x,height:j.max.y-j.min.y}},c.isPointInsideBBox=function(a,b,c){return b>=a.x&&b<=a.x2&&c>=a.y&&c<=a.y2},c.isBBoxIntersect=function(a,b){var d=c.isPointInsideBBox;return d(b,a.x,a.y)||d(b,a.x2,a.y)||d(b,a.x,a.y2)||d(b,a.x2,a.y2)||d(a,b.x,b.y)||d(a,b.x2,b.y)||d(a,b.x,b.y2)||d(a,b.x2,b.y2)||(a.x<b.x2&&a.x>b.x||b.x<a.x2&&b.x>a.x)&&(a.y<b.y2&&a.y>b.y||b.y<a.y2&&b.y>a.y)},c.pathIntersection=function(a,b){return n(a,b)},c.pathIntersectionNumber=function(a,b){return n(a,b,1)},c.isPointInsidePath=function(a,b,d){var e=c.pathBBox(a);return c.isPointInsideBBox(e,b,d)&&1==n(a,[["M",b,d],["H",e.x2+10]],1)%2},c._removedFactory=function(a){return function(){b("raphael.log",null,"Raphaël: you are calling to method “"+a+"” of removed object",a)}};var Bb=c.pathBBox=function(a){var b=Ab(a);if(b.bbox)return d(b.bbox);if(!a)return{x:0,y:0,width:0,height:0,x2:0,y2:0};a=Kb(a);for(var c,e=0,f=0,g=[],h=[],i=0,j=a.length;j>i;i++)if(c=a[i],"M"==c[0])e=c[1],f=c[2],g.push(e),h.push(f);else{var k=Jb(e,f,c[1],c[2],c[3],c[4],c[5],c[6]);g=g[E](k.min.x,k.max.x),h=h[E](k.min.y,k.max.y),e=c[5],f=c[6]}var l=P[D](0,g),m=P[D](0,h),n=O[D](0,g),o=O[D](0,h),p=n-l,q=o-m,r={x:l,y:m,x2:n,y2:o,width:p,height:q,cx:l+p/2,cy:m+q/2};return b.bbox=d(r),r},Cb=function(a){var b=d(a);return b.toString=c._path2string,b},Db=c._pathToRelative=function(a){var b=Ab(a);if(b.rel)return Cb(b.rel);c.is(a,V)&&c.is(a&&a[0],V)||(a=c.parsePathString(a));var d=[],e=0,f=0,g=0,h=0,i=0;"M"==a[0][0]&&(e=a[0][1],f=a[0][2],g=e,h=f,i++,d.push(["M",e,f]));for(var j=i,k=a.length;k>j;j++){var l=d[j]=[],m=a[j];if(m[0]!=M.call(m[0]))switch(l[0]=M.call(m[0]),l[0]){case"a":l[1]=m[1],l[2]=m[2],l[3]=m[3],l[4]=m[4],l[5]=m[5],l[6]=+(m[6]-e).toFixed(3),l[7]=+(m[7]-f).toFixed(3);break;case"v":l[1]=+(m[1]-f).toFixed(3);break;case"m":g=m[1],h=m[2];default:for(var n=1,o=m.length;o>n;n++)l[n]=+(m[n]-(n%2?e:f)).toFixed(3)}else{l=d[j]=[],"m"==m[0]&&(g=m[1]+e,h=m[2]+f);for(var p=0,q=m.length;q>p;p++)d[j][p]=m[p]}var r=d[j].length;switch(d[j][0]){case"z":e=g,f=h;break;case"h":e+=+d[j][r-1];break;case"v":f+=+d[j][r-1];break;default:e+=+d[j][r-2],f+=+d[j][r-1]}}return d.toString=c._path2string,b.rel=Cb(d),d},Eb=c._pathToAbsolute=function(a){var b=Ab(a);if(b.abs)return Cb(b.abs);if(c.is(a,V)&&c.is(a&&a[0],V)||(a=c.parsePathString(a)),!a||!a.length)return[["M",0,0]];var d=[],e=0,f=0,g=0,i=0,j=0;"M"==a[0][0]&&(e=+a[0][1],f=+a[0][2],g=e,i=f,j++,d[0]=["M",e,f]);for(var k,l,m=3==a.length&&"M"==a[0][0]&&"R"==a[1][0].toUpperCase()&&"Z"==a[2][0].toUpperCase(),n=j,o=a.length;o>n;n++){if(d.push(k=[]),l=a[n],l[0]!=bb.call(l[0]))switch(k[0]=bb.call(l[0]),k[0]){case"A":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]+e),k[7]=+(l[7]+f);break;case"V":k[1]=+l[1]+f;break;case"H":k[1]=+l[1]+e;break;case"R":for(var p=[e,f][E](l.slice(1)),q=2,r=p.length;r>q;q++)p[q]=+p[q]+e,p[++q]=+p[q]+f;d.pop(),d=d[E](h(p,m));break;case"M":g=+l[1]+e,i=+l[2]+f;default:for(q=1,r=l.length;r>q;q++)k[q]=+l[q]+(q%2?e:f)}else if("R"==l[0])p=[e,f][E](l.slice(1)),d.pop(),d=d[E](h(p,m)),k=["R"][E](l.slice(-2));else for(var s=0,t=l.length;t>s;s++)k[s]=l[s];switch(k[0]){case"Z":e=g,f=i;break;case"H":e=k[1];break;case"V":f=k[1];break;case"M":g=k[k.length-2],i=k[k.length-1];default:e=k[k.length-2],f=k[k.length-1]}}return d.toString=c._path2string,b.abs=Cb(d),d},Fb=function(a,b,c,d){return[a,b,c,d,c,d]},Gb=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},Hb=function(a,b,c,d,e,g,h,i,j,k){var l,m=120*S/180,n=S/180*(+e||0),o=[],p=f(function(a,b,c){var d=a*N.cos(c)-b*N.sin(c),e=a*N.sin(c)+b*N.cos(c);return{x:d,y:e}});if(k)y=k[0],z=k[1],w=k[2],x=k[3];else{l=p(a,b,-n),a=l.x,b=l.y,l=p(i,j,-n),i=l.x,j=l.y;var q=(N.cos(S/180*e),N.sin(S/180*e),(a-i)/2),r=(b-j)/2,s=q*q/(c*c)+r*r/(d*d);s>1&&(s=N.sqrt(s),c=s*c,d=s*d);var t=c*c,u=d*d,v=(g==h?-1:1)*N.sqrt(Q((t*u-t*r*r-u*q*q)/(t*r*r+u*q*q))),w=v*c*r/d+(a+i)/2,x=v*-d*q/c+(b+j)/2,y=N.asin(((b-x)/d).toFixed(9)),z=N.asin(((j-x)/d).toFixed(9));y=w>a?S-y:y,z=w>i?S-z:z,0>y&&(y=2*S+y),0>z&&(z=2*S+z),h&&y>z&&(y-=2*S),!h&&z>y&&(z-=2*S)}var A=z-y;if(Q(A)>m){var B=z,C=i,D=j;z=y+m*(h&&z>y?1:-1),i=w+c*N.cos(z),j=x+d*N.sin(z),o=Hb(i,j,c,d,e,0,h,C,D,[z,B,w,x])}A=z-y;var F=N.cos(y),G=N.sin(y),H=N.cos(z),I=N.sin(z),K=N.tan(A/4),L=4/3*c*K,M=4/3*d*K,O=[a,b],P=[a+L*G,b-M*F],R=[i+L*I,j-M*H],T=[i,j];if(P[0]=2*O[0]-P[0],P[1]=2*O[1]-P[1],k)return[P,R,T][E](o);o=[P,R,T][E](o).join()[J](",");for(var U=[],V=0,W=o.length;W>V;V++)U[V]=V%2?p(o[V-1],o[V],n).y:p(o[V],o[V+1],n).x;return U},Ib=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:R(j,3)*a+3*R(j,2)*i*c+3*j*i*i*e+R(i,3)*g,y:R(j,3)*b+3*R(j,2)*i*d+3*j*i*i*f+R(i,3)*h}},Jb=f(function(a,b,c,d,e,f,g,h){var i,j=e-2*c+a-(g-2*e+c),k=2*(c-a)-2*(e-c),l=a-c,m=(-k+N.sqrt(k*k-4*j*l))/2/j,n=(-k-N.sqrt(k*k-4*j*l))/2/j,o=[b,h],p=[a,g];return Q(m)>"1e12"&&(m=.5),Q(n)>"1e12"&&(n=.5),m>0&&1>m&&(i=Ib(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ib(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),j=f-2*d+b-(h-2*f+d),k=2*(d-b)-2*(f-d),l=b-d,m=(-k+N.sqrt(k*k-4*j*l))/2/j,n=(-k-N.sqrt(k*k-4*j*l))/2/j,Q(m)>"1e12"&&(m=.5),Q(n)>"1e12"&&(n=.5),m>0&&1>m&&(i=Ib(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ib(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),{min:{x:P[D](0,p),y:P[D](0,o)},max:{x:O[D](0,p),y:O[D](0,o)}}}),Kb=c._path2curve=f(function(a,b){var c=!b&&Ab(a);if(!b&&c.curve)return Cb(c.curve);for(var d=Eb(a),e=b&&Eb(b),f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},h=(function(a,b,c){var d,e;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];switch(!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null),a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][E](Hb[D](0,[b.x,b.y][E](a.slice(1))));break;case"S":"C"==c||"S"==c?(d=2*b.x-b.bx,e=2*b.y-b.by):(d=b.x,e=b.y),a=["C",d,e][E](a.slice(1));break;case"T":"Q"==c||"T"==c?(b.qx=2*b.x-b.qx,b.qy=2*b.y-b.qy):(b.qx=b.x,b.qy=b.y),a=["C"][E](Gb(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][E](Gb(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][E](Fb(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][E](Fb(b.x,b.y,a[1],b.y));break;case"V":a=["C"][E](Fb(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][E](Fb(b.x,b.y,b.X,b.Y))}return a}),i=function(a,b){if(a[b].length>7){a[b].shift();for(var c=a[b];c.length;)a.splice(b++,0,["C"][E](c.splice(0,6)));a.splice(b,1),l=O(d.length,e&&e.length||0)}},j=function(a,b,c,f,g){a&&b&&"M"==a[g][0]&&"M"!=b[g][0]&&(b.splice(g,0,["M",f.x,f.y]),c.bx=0,c.by=0,c.x=a[g][1],c.y=a[g][2],l=O(d.length,e&&e.length||0))},k=0,l=O(d.length,e&&e.length||0);l>k;k++){d[k]=h(d[k],f),i(d,k),e&&(e[k]=h(e[k],g)),e&&i(e,k),j(d,e,f,g,k),j(e,d,g,f,k);var m=d[k],n=e&&e[k],o=m.length,p=e&&n.length;f.x=m[o-2],f.y=m[o-1],f.bx=_(m[o-4])||f.x,f.by=_(m[o-3])||f.y,g.bx=e&&(_(n[p-4])||g.x),g.by=e&&(_(n[p-3])||g.y),g.x=e&&n[p-2],g.y=e&&n[p-1]}return e||(c.curve=Cb(d)),e?[d,e]:d},null,Cb),Lb=(c._parseDots=f(function(a){for(var b=[],d=0,e=a.length;e>d;d++){var f={},g=a[d].match(/^([^:]*):?([\d\.]*)/);if(f.color=c.getRGB(g[1]),f.color.error)return null;f.color=f.color.hex,g[2]&&(f.offset=g[2]+"%"),b.push(f)}for(d=1,e=b.length-1;e>d;d++)if(!b[d].offset){for(var h=_(b[d-1].offset||0),i=0,j=d+1;e>j;j++)if(b[j].offset){i=b[j].offset;break}i||(i=100,j=e),i=_(i);for(var k=(i-h)/(j-d+1);j>d;d++)h+=k,b[d].offset=h+"%"}return b}),c._tear=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)}),Mb=(c._tofront=function(a,b){b.top!==a&&(Lb(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},c._toback=function(a,b){b.bottom!==a&&(Lb(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},c._insertafter=function(a,b,c){Lb(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},c._insertbefore=function(a,b,c){Lb(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},c.toMatrix=function(a,b){var c=Bb(a),d={_:{transform:G},getBBox:function(){return c}};return Nb(d,b),d.matrix}),Nb=(c.transformPath=function(a,b){return rb(a,Mb(a,b))},c._extractTransform=function(a,b){if(null==b)return a._.transform;b=I(b).replace(/\.{3}|\u2026/g,a._.transform||G);var d=c.parseTransformString(b),e=0,f=0,g=0,h=1,i=1,j=a._,k=new o;if(j.transform=d||[],d)for(var l=0,m=d.length;m>l;l++){var n,p,q,r,s,t=d[l],u=t.length,v=I(t[0]).toLowerCase(),w=t[0]!=v,x=w?k.invert():0;"t"==v&&3==u?w?(n=x.x(0,0),p=x.y(0,0),q=x.x(t[1],t[2]),r=x.y(t[1],t[2]),k.translate(q-n,r-p)):k.translate(t[1],t[2]):"r"==v?2==u?(s=s||a.getBBox(1),k.rotate(t[1],s.x+s.width/2,s.y+s.height/2),e+=t[1]):4==u&&(w?(q=x.x(t[2],t[3]),r=x.y(t[2],t[3]),k.rotate(t[1],q,r)):k.rotate(t[1],t[2],t[3]),e+=t[1]):"s"==v?2==u||3==u?(s=s||a.getBBox(1),k.scale(t[1],t[u-1],s.x+s.width/2,s.y+s.height/2),h*=t[1],i*=t[u-1]):5==u&&(w?(q=x.x(t[3],t[4]),r=x.y(t[3],t[4]),k.scale(t[1],t[2],q,r)):k.scale(t[1],t[2],t[3],t[4]),h*=t[1],i*=t[2]):"m"==v&&7==u&&k.add(t[1],t[2],t[3],t[4],t[5],t[6]),j.dirtyT=1,a.matrix=k}a.matrix=k,j.sx=h,j.sy=i,j.deg=e,j.dx=f=k.e,j.dy=g=k.f,1==h&&1==i&&!e&&j.bbox?(j.bbox.x+=+f,j.bbox.y+=+g):j.dirtyT=1}),Ob=function(a){var b=a[0];switch(b.toLowerCase()){case"t":return[b,0,0];case"m":return[b,1,0,0,1,0,0];case"r":return 4==a.length?[b,0,a[2],a[3]]:[b,0];case"s":return 5==a.length?[b,1,1,a[3],a[4]]:3==a.length?[b,1,1]:[b,1]}},Pb=c._equaliseTransform=function(a,b){b=I(b).replace(/\.{3}|\u2026/g,a),a=c.parseTransformString(a)||[],b=c.parseTransformString(b)||[];for(var d,e,f,g,h=O(a.length,b.length),i=[],j=[],k=0;h>k;k++){if(f=a[k]||Ob(b[k]),g=b[k]||Ob(f),f[0]!=g[0]||"r"==f[0].toLowerCase()&&(f[2]!=g[2]||f[3]!=g[3])||"s"==f[0].toLowerCase()&&(f[3]!=g[3]||f[4]!=g[4]))return;for(i[k]=[],j[k]=[],d=0,e=O(f.length,g.length);e>d;d++)d in f&&(i[k][d]=f[d]),d in g&&(j[k][d]=g[d]) +}return{from:i,to:j}};c._getContainer=function(a,b,d,e){var f;return f=null!=e||c.is(a,"object")?a:A.doc.getElementById(a),null!=f?f.tagName?null==b?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:b,height:d}:{container:1,x:a,y:b,width:d,height:e}:void 0},c.pathToRelative=Db,c._engine={},c.path2curve=Kb,c.matrix=function(a,b,c,d,e,f){return new o(a,b,c,d,e,f)},function(a){function b(a){return a[0]*a[0]+a[1]*a[1]}function d(a){var c=N.sqrt(b(a));a[0]&&(a[0]/=c),a[1]&&(a[1]/=c)}a.add=function(a,b,c,d,e,f){var g,h,i,j,k=[[],[],[]],l=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],m=[[a,c,e],[b,d,f],[0,0,1]];for(a&&a instanceof o&&(m=[[a.a,a.c,a.e],[a.b,a.d,a.f],[0,0,1]]),g=0;3>g;g++)for(h=0;3>h;h++){for(j=0,i=0;3>i;i++)j+=l[g][i]*m[i][h];k[g][h]=j}this.a=k[0][0],this.b=k[1][0],this.c=k[0][1],this.d=k[1][1],this.e=k[0][2],this.f=k[1][2]},a.invert=function(){var a=this,b=a.a*a.d-a.b*a.c;return new o(a.d/b,-a.b/b,-a.c/b,a.a/b,(a.c*a.f-a.d*a.e)/b,(a.b*a.e-a.a*a.f)/b)},a.clone=function(){return new o(this.a,this.b,this.c,this.d,this.e,this.f)},a.translate=function(a,b){this.add(1,0,0,1,a,b)},a.scale=function(a,b,c,d){null==b&&(b=a),(c||d)&&this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),(c||d)&&this.add(1,0,0,1,-c,-d)},a.rotate=function(a,b,d){a=c.rad(a),b=b||0,d=d||0;var e=+N.cos(a).toFixed(9),f=+N.sin(a).toFixed(9);this.add(e,f,-f,e,b,d),this.add(1,0,0,1,-b,-d)},a.x=function(a,b){return a*this.a+b*this.c+this.e},a.y=function(a,b){return a*this.b+b*this.d+this.f},a.get=function(a){return+this[I.fromCharCode(97+a)].toFixed(4)},a.toString=function(){return c.svg?"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},a.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0)+", M12="+this.get(2)+", M21="+this.get(1)+", M22="+this.get(3)+", Dx="+this.get(4)+", Dy="+this.get(5)+", sizingmethod='auto expand')"},a.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},a.split=function(){var a={};a.dx=this.e,a.dy=this.f;var e=[[this.a,this.c],[this.b,this.d]];a.scalex=N.sqrt(b(e[0])),d(e[0]),a.shear=e[0][0]*e[1][0]+e[0][1]*e[1][1],e[1]=[e[1][0]-e[0][0]*a.shear,e[1][1]-e[0][1]*a.shear],a.scaley=N.sqrt(b(e[1])),d(e[1]),a.shear/=a.scaley;var f=-e[0][1],g=e[1][1];return 0>g?(a.rotate=c.deg(N.acos(g)),0>f&&(a.rotate=360-a.rotate)):a.rotate=c.deg(N.asin(f)),a.isSimple=!(+a.shear.toFixed(9)||a.scalex.toFixed(9)!=a.scaley.toFixed(9)&&a.rotate),a.isSuperSimple=!+a.shear.toFixed(9)&&a.scalex.toFixed(9)==a.scaley.toFixed(9)&&!a.rotate,a.noRotation=!+a.shear.toFixed(9)&&!a.rotate,a},a.toTransformString=function(a){var b=a||this[J]();return b.isSimple?(b.scalex=+b.scalex.toFixed(4),b.scaley=+b.scaley.toFixed(4),b.rotate=+b.rotate.toFixed(4),(b.dx||b.dy?"t"+[b.dx,b.dy]:G)+(1!=b.scalex||1!=b.scaley?"s"+[b.scalex,b.scaley,0,0]:G)+(b.rotate?"r"+[b.rotate,0,0]:G)):"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(o.prototype);var Qb=navigator.userAgent.match(/Version\/(.*?)\s/)||navigator.userAgent.match(/Chrome\/(\d+)/);v.safari="Apple Computer, Inc."==navigator.vendor&&(Qb&&Qb[1]<4||"iP"==navigator.platform.slice(0,2))||"Google Inc."==navigator.vendor&&Qb&&Qb[1]<8?function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});setTimeout(function(){a.remove()})}:mb;for(var Rb=function(){this.returnValue=!1},Sb=function(){return this.originalEvent.preventDefault()},Tb=function(){this.cancelBubble=!0},Ub=function(){return this.originalEvent.stopPropagation()},Vb=function(a){var b=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,c=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft;return{x:a.clientX+c,y:a.clientY+b}},Wb=function(){return A.doc.addEventListener?function(a,b,c,d){var e=function(a){var b=Vb(a);return c.call(d,a,b.x,b.y)};if(a.addEventListener(b,e,!1),F&&L[b]){var f=function(b){for(var e=Vb(b),f=b,g=0,h=b.targetTouches&&b.targetTouches.length;h>g;g++)if(b.targetTouches[g].target==a){b=b.targetTouches[g],b.originalEvent=f,b.preventDefault=Sb,b.stopPropagation=Ub;break}return c.call(d,b,e.x,e.y)};a.addEventListener(L[b],f,!1)}return function(){return a.removeEventListener(b,e,!1),F&&L[b]&&a.removeEventListener(L[b],e,!1),!0}}:A.doc.attachEvent?function(a,b,c,d){var e=function(a){a=a||A.win.event;var b=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,e=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft,f=a.clientX+e,g=a.clientY+b;return a.preventDefault=a.preventDefault||Rb,a.stopPropagation=a.stopPropagation||Tb,c.call(d,a,f,g)};a.attachEvent("on"+b,e);var f=function(){return a.detachEvent("on"+b,e),!0};return f}:void 0}(),Xb=[],Yb=function(a){for(var c,d=a.clientX,e=a.clientY,f=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,g=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft,h=Xb.length;h--;){if(c=Xb[h],F&&a.touches){for(var i,j=a.touches.length;j--;)if(i=a.touches[j],i.identifier==c.el._drag.id){d=i.clientX,e=i.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}else a.preventDefault();var k,l=c.el.node,m=l.nextSibling,n=l.parentNode,o=l.style.display;A.win.opera&&n.removeChild(l),l.style.display="none",k=c.el.paper.getElementByPoint(d,e),l.style.display=o,A.win.opera&&(m?n.insertBefore(l,m):n.appendChild(l)),k&&b("raphael.drag.over."+c.el.id,c.el,k),d+=g,e+=f,b("raphael.drag.move."+c.el.id,c.move_scope||c.el,d-c.el._drag.x,e-c.el._drag.y,d,e,a)}},Zb=function(a){c.unmousemove(Yb).unmouseup(Zb);for(var d,e=Xb.length;e--;)d=Xb[e],d.el._drag={},b("raphael.drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,a);Xb=[]},$b=c.el={},_b=K.length;_b--;)!function(a){c[a]=$b[a]=function(b,d){return c.is(b,"function")&&(this.events=this.events||[],this.events.push({name:a,f:b,unbind:Wb(this.shape||this.node||A.doc,a,b,d||this)})),this},c["un"+a]=$b["un"+a]=function(b){for(var d=this.events||[],e=d.length;e--;)d[e].name!=a||!c.is(b,"undefined")&&d[e].f!=b||(d[e].unbind(),d.splice(e,1),!d.length&&delete this.events);return this}}(K[_b]);$b.data=function(a,d){var e=kb[this.id]=kb[this.id]||{};if(0==arguments.length)return e;if(1==arguments.length){if(c.is(a,"object")){for(var f in a)a[z](f)&&this.data(f,a[f]);return this}return b("raphael.data.get."+this.id,this,e[a],a),e[a]}return e[a]=d,b("raphael.data.set."+this.id,this,d,a),this},$b.removeData=function(a){return null==a?kb[this.id]={}:kb[this.id]&&delete kb[this.id][a],this},$b.getData=function(){return d(kb[this.id]||{})},$b.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},$b.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var ac=[];$b.drag=function(a,d,e,f,g,h){function i(i){(i.originalEvent||i).preventDefault();var j=i.clientX,k=i.clientY,l=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,m=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft;if(this._drag.id=i.identifier,F&&i.touches)for(var n,o=i.touches.length;o--;)if(n=i.touches[o],this._drag.id=n.identifier,n.identifier==this._drag.id){j=n.clientX,k=n.clientY;break}this._drag.x=j+m,this._drag.y=k+l,!Xb.length&&c.mousemove(Yb).mouseup(Zb),Xb.push({el:this,move_scope:f,start_scope:g,end_scope:h}),d&&b.on("raphael.drag.start."+this.id,d),a&&b.on("raphael.drag.move."+this.id,a),e&&b.on("raphael.drag.end."+this.id,e),b("raphael.drag.start."+this.id,g||f||this,i.clientX+m,i.clientY+l,i)}return this._drag={},ac.push({el:this,start:i}),this.mousedown(i),this},$b.onDragOver=function(a){a?b.on("raphael.drag.over."+this.id,a):b.unbind("raphael.drag.over."+this.id)},$b.undrag=function(){for(var a=ac.length;a--;)ac[a].el==this&&(this.unmousedown(ac[a].start),ac.splice(a,1),b.unbind("raphael.drag.*."+this.id));!ac.length&&c.unmousemove(Yb).unmouseup(Zb),Xb=[]},v.circle=function(a,b,d){var e=c._engine.circle(this,a||0,b||0,d||0);return this.__set__&&this.__set__.push(e),e},v.rect=function(a,b,d,e,f){var g=c._engine.rect(this,a||0,b||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},v.ellipse=function(a,b,d,e){var f=c._engine.ellipse(this,a||0,b||0,d||0,e||0);return this.__set__&&this.__set__.push(f),f},v.path=function(a){a&&!c.is(a,U)&&!c.is(a[0],V)&&(a+=G);var b=c._engine.path(c.format[D](c,arguments),this);return this.__set__&&this.__set__.push(b),b},v.image=function(a,b,d,e,f){var g=c._engine.image(this,a||"about:blank",b||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},v.text=function(a,b,d){var e=c._engine.text(this,a||0,b||0,I(d));return this.__set__&&this.__set__.push(e),e},v.set=function(a){!c.is(a,"array")&&(a=Array.prototype.splice.call(arguments,0,arguments.length));var b=new mc(a);return this.__set__&&this.__set__.push(b),b.paper=this,b.type="set",b},v.setStart=function(a){this.__set__=a||this.set()},v.setFinish=function(){var a=this.__set__;return delete this.__set__,a},v.setSize=function(a,b){return c._engine.setSize.call(this,a,b)},v.setViewBox=function(a,b,d,e,f){return c._engine.setViewBox.call(this,a,b,d,e,f)},v.top=v.bottom=null,v.raphael=c;var bc=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,g=e.clientLeft||d.clientLeft||0,h=b.top+(A.win.pageYOffset||e.scrollTop||d.scrollTop)-f,i=b.left+(A.win.pageXOffset||e.scrollLeft||d.scrollLeft)-g;return{y:h,x:i}};v.getElementByPoint=function(a,b){var c=this,d=c.canvas,e=A.doc.elementFromPoint(a,b);if(A.win.opera&&"svg"==e.tagName){var f=bc(d),g=d.createSVGRect();g.x=a-f.x,g.y=b-f.y,g.width=g.height=1;var h=d.getIntersectionList(g,null);h.length&&(e=h[h.length-1])}if(!e)return null;for(;e.parentNode&&e!=d.parentNode&&!e.raphael;)e=e.parentNode;return e==c.canvas.parentNode&&(e=d),e=e&&e.raphael?c.getById(e.raphaelid):null},v.getElementsByBBox=function(a){var b=this.set();return this.forEach(function(d){c.isBBoxIntersect(d.getBBox(),a)&&b.push(d)}),b},v.getById=function(a){for(var b=this.bottom;b;){if(b.id==a)return b;b=b.next}return null},v.forEach=function(a,b){for(var c=this.bottom;c;){if(a.call(b,c)===!1)return this;c=c.next}return this},v.getElementsByPoint=function(a,b){var c=this.set();return this.forEach(function(d){d.isPointInside(a,b)&&c.push(d)}),c},$b.isPointInside=function(a,b){var d=this.realPath=qb[this.type](this);return this.attr("transform")&&this.attr("transform").length&&(d=c.transformPath(d,this.attr("transform"))),c.isPointInsidePath(d,a,b)},$b.getBBox=function(a){if(this.removed)return{};var b=this._;return a?((b.dirty||!b.bboxwt)&&(this.realPath=qb[this.type](this),b.bboxwt=Bb(this.realPath),b.bboxwt.toString=p,b.dirty=0),b.bboxwt):((b.dirty||b.dirtyT||!b.bbox)&&((b.dirty||!this.realPath)&&(b.bboxwt=0,this.realPath=qb[this.type](this)),b.bbox=Bb(rb(this.realPath,this.matrix)),b.bbox.toString=p,b.dirty=b.dirtyT=0),b.bbox)},$b.clone=function(){if(this.removed)return null;var a=this.paper[this.type]().attr(this.attr());return this.__set__&&this.__set__.push(a),a},$b.glow=function(a){if("text"==this.type)return null;a=a||{};var b={width:(a.width||10)+(+this.attr("stroke-width")||1),fill:a.fill||!1,opacity:a.opacity||.5,offsetx:a.offsetx||0,offsety:a.offsety||0,color:a.color||"#000"},c=b.width/2,d=this.paper,e=d.set(),f=this.realPath||qb[this.type](this);f=this.matrix?rb(f,this.matrix):f;for(var g=1;c+1>g;g++)e.push(d.path(f).attr({stroke:b.color,fill:b.fill?b.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(b.width/c*g).toFixed(3),opacity:+(b.opacity/c).toFixed(3)}));return e.insertBefore(this).translate(b.offsetx,b.offsety)};var cc=function(a,b,d,e,f,g,h,i,l){return null==l?j(a,b,d,e,f,g,h,i):c.findDotsAtSegment(a,b,d,e,f,g,h,i,k(a,b,d,e,f,g,h,i,l))},dc=function(a,b){return function(d,e,f){d=Kb(d);for(var g,h,i,j,k,l="",m={},n=0,o=0,p=d.length;p>o;o++){if(i=d[o],"M"==i[0])g=+i[1],h=+i[2];else{if(j=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6]),n+j>e){if(b&&!m.start){if(k=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),l+=["C"+k.start.x,k.start.y,k.m.x,k.m.y,k.x,k.y],f)return l;m.start=l,l=["M"+k.x,k.y+"C"+k.n.x,k.n.y,k.end.x,k.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!a&&!b)return k=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),{x:k.x,y:k.y,alpha:k.alpha}}n+=j,g=+i[5],h=+i[6]}l+=i.shift()+i}return m.end=l,k=a?n:b?m:c.findDotsAtSegment(g,h,i[0],i[1],i[2],i[3],i[4],i[5],1),k.alpha&&(k={x:k.x,y:k.y,alpha:k.alpha}),k}},ec=dc(1),fc=dc(),gc=dc(0,1);c.getTotalLength=ec,c.getPointAtLength=fc,c.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return gc(a,b).end;var d=gc(a,c,1);return b?gc(d,b).end:d},$b.getTotalLength=function(){var a=this.getPath();if(a)return this.node.getTotalLength?this.node.getTotalLength():ec(a)},$b.getPointAtLength=function(a){var b=this.getPath();if(b)return fc(b,a)},$b.getPath=function(){var a,b=c._getPath[this.type];if("text"!=this.type&&"set"!=this.type)return b&&(a=b(this)),a},$b.getSubpath=function(a,b){var d=this.getPath();if(d)return c.getSubpath(d,a,b)};var hc=c.easing_formulas={linear:function(a){return a},"<":function(a){return R(a,1.7)},">":function(a){return R(a,.48)},"<>":function(a){var b=.48-a/1.04,c=N.sqrt(.1734+b*b),d=c-b,e=R(Q(d),1/3)*(0>d?-1:1),f=-c-b,g=R(Q(f),1/3)*(0>f?-1:1),h=e+g+.5;return 3*(1-h)*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a-=1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){return a==!!a?a:R(2,-10*a)*N.sin((a-.075)*2*S/.3)+1},bounce:function(a){var b,c=7.5625,d=2.75;return 1/d>a?b=c*a*a:2/d>a?(a-=1.5/d,b=c*a*a+.75):2.5/d>a?(a-=2.25/d,b=c*a*a+.9375):(a-=2.625/d,b=c*a*a+.984375),b}};hc.easeIn=hc["ease-in"]=hc["<"],hc.easeOut=hc["ease-out"]=hc[">"],hc.easeInOut=hc["ease-in-out"]=hc["<>"],hc["back-in"]=hc.backIn,hc["back-out"]=hc.backOut;var ic=[],jc=a.requestAnimationFrame||a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame||a.msRequestAnimationFrame||function(a){setTimeout(a,16)},kc=function(){for(var a=+new Date,d=0;d<ic.length;d++){var e=ic[d];if(!e.el.removed&&!e.paused){var f,g,h=a-e.start,i=e.ms,j=e.easing,k=e.from,l=e.diff,m=e.to,n=(e.t,e.el),o={},p={};if(e.initstatus?(h=(e.initstatus*e.anim.top-e.prev)/(e.percent-e.prev)*i,e.status=e.initstatus,delete e.initstatus,e.stop&&ic.splice(d--,1)):e.status=(e.prev+(e.percent-e.prev)*(h/i))/e.anim.top,!(0>h))if(i>h){var q=j(h/i);for(var r in k)if(k[z](r)){switch(db[r]){case T:f=+k[r]+q*i*l[r];break;case"colour":f="rgb("+[lc($(k[r].r+q*i*l[r].r)),lc($(k[r].g+q*i*l[r].g)),lc($(k[r].b+q*i*l[r].b))].join(",")+")";break;case"path":f=[];for(var t=0,u=k[r].length;u>t;t++){f[t]=[k[r][t][0]];for(var v=1,w=k[r][t].length;w>v;v++)f[t][v]=+k[r][t][v]+q*i*l[r][t][v];f[t]=f[t].join(H)}f=f.join(H);break;case"transform":if(l[r].real)for(f=[],t=0,u=k[r].length;u>t;t++)for(f[t]=[k[r][t][0]],v=1,w=k[r][t].length;w>v;v++)f[t][v]=k[r][t][v]+q*i*l[r][t][v];else{var x=function(a){return+k[r][a]+q*i*l[r][a]};f=[["m",x(0),x(1),x(2),x(3),x(4),x(5)]]}break;case"csv":if("clip-rect"==r)for(f=[],t=4;t--;)f[t]=+k[r][t]+q*i*l[r][t];break;default:var y=[][E](k[r]);for(f=[],t=n.paper.customAttributes[r].length;t--;)f[t]=+y[t]+q*i*l[r][t]}o[r]=f}n.attr(o),function(a,c,d){setTimeout(function(){b("raphael.anim.frame."+a,c,d)})}(n.id,n,e.anim)}else{if(function(a,d,e){setTimeout(function(){b("raphael.anim.frame."+d.id,d,e),b("raphael.anim.finish."+d.id,d,e),c.is(a,"function")&&a.call(d)})}(e.callback,n,e.anim),n.attr(m),ic.splice(d--,1),e.repeat>1&&!e.next){for(g in m)m[z](g)&&(p[g]=e.totalOrigin[g]);e.el.attr(p),s(e.anim,e.el,e.anim.percents[0],null,e.totalOrigin,e.repeat-1)}e.next&&!e.stop&&s(e.anim,e.el,e.next,null,e.totalOrigin,e.repeat)}}}c.svg&&n&&n.paper&&n.paper.safari(),ic.length&&jc(kc)},lc=function(a){return a>255?255:0>a?0:a};$b.animateWith=function(a,b,d,e,f,g){var h=this;if(h.removed)return g&&g.call(h),h;var i=d instanceof r?d:c.animation(d,e,f,g);s(i,h,i.percents[0],null,h.attr());for(var j=0,k=ic.length;k>j;j++)if(ic[j].anim==b&&ic[j].el==a){ic[k-1].start=ic[j].start;break}return h},$b.onAnimation=function(a){return a?b.on("raphael.anim.frame."+this.id,a):b.unbind("raphael.anim.frame."+this.id),this},r.prototype.delay=function(a){var b=new r(this.anim,this.ms);return b.times=this.times,b.del=+a||0,b},r.prototype.repeat=function(a){var b=new r(this.anim,this.ms);return b.del=this.del,b.times=N.floor(O(a,0))||1,b},c.animation=function(a,b,d,e){if(a instanceof r)return a;(c.is(d,"function")||!d)&&(e=e||d||null,d=null),a=Object(a),b=+b||0;var f,g,h={};for(g in a)a[z](g)&&_(g)!=g&&_(g)+"%"!=g&&(f=!0,h[g]=a[g]);return f?(d&&(h.easing=d),e&&(h.callback=e),new r({100:h},b)):new r(a,b)},$b.animate=function(a,b,d,e){var f=this;if(f.removed)return e&&e.call(f),f;var g=a instanceof r?a:c.animation(a,b,d,e);return s(g,f,g.percents[0],null,f.attr()),f},$b.setTime=function(a,b){return a&&null!=b&&this.status(a,P(b,a.ms)/a.ms),this},$b.status=function(a,b){var c,d,e=[],f=0;if(null!=b)return s(a,this,-1,P(b,1)),this;for(c=ic.length;c>f;f++)if(d=ic[f],d.el.id==this.id&&(!a||d.anim==a)){if(a)return d.status;e.push({anim:d.anim,status:d.status})}return a?0:e},$b.pause=function(a){for(var c=0;c<ic.length;c++)ic[c].el.id!=this.id||a&&ic[c].anim!=a||b("raphael.anim.pause."+this.id,this,ic[c].anim)!==!1&&(ic[c].paused=!0);return this},$b.resume=function(a){for(var c=0;c<ic.length;c++)if(ic[c].el.id==this.id&&(!a||ic[c].anim==a)){var d=ic[c];b("raphael.anim.resume."+this.id,this,d.anim)!==!1&&(delete d.paused,this.status(d.anim,d.status))}return this},$b.stop=function(a){for(var c=0;c<ic.length;c++)ic[c].el.id!=this.id||a&&ic[c].anim!=a||b("raphael.anim.stop."+this.id,this,ic[c].anim)!==!1&&ic.splice(c--,1);return this},b.on("raphael.remove",t),b.on("raphael.clear",t),$b.toString=function(){return"Raphaël’s object"};var mc=function(a){if(this.items=[],this.length=0,this.type="set",a)for(var b=0,c=a.length;c>b;b++)!a[b]||a[b].constructor!=$b.constructor&&a[b].constructor!=mc||(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},nc=mc.prototype;nc.push=function(){for(var a,b,c=0,d=arguments.length;d>c;c++)a=arguments[c],!a||a.constructor!=$b.constructor&&a.constructor!=mc||(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},nc.pop=function(){return this.length&&delete this[this.length--],this.items.pop()},nc.forEach=function(a,b){for(var c=0,d=this.items.length;d>c;c++)if(a.call(b,this.items[c],c)===!1)return this;return this};for(var oc in $b)$b[z](oc)&&(nc[oc]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a][D](c,b)})}}(oc));return nc.attr=function(a,b){if(a&&c.is(a,V)&&c.is(a[0],"object"))for(var d=0,e=a.length;e>d;d++)this.items[d].attr(a[d]);else for(var f=0,g=this.items.length;g>f;f++)this.items[f].attr(a,b);return this},nc.clear=function(){for(;this.length;)this.pop()},nc.splice=function(a,b){a=0>a?O(this.length+a,0):a,b=O(0,P(this.length-a,b));var c,d=[],e=[],f=[];for(c=2;c<arguments.length;c++)f.push(arguments[c]);for(c=0;b>c;c++)e.push(this[a+c]);for(;c<this.length-a;c++)d.push(this[a+c]);var g=f.length;for(c=0;c<g+d.length;c++)this.items[a+c]=this[a+c]=g>c?f[c]:d[c-g];for(c=this.items.length=this.length-=b-g;this[c];)delete this[c++];return new mc(e)},nc.exclude=function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]==a)return this.splice(b,1),!0},nc.animate=function(a,b,d,e){(c.is(d,"function")||!d)&&(e=d||null);var f,g,h=this.items.length,i=h,j=this;if(!h)return this;e&&(g=function(){!--h&&e.call(j)}),d=c.is(d,U)?d:g;var k=c.animation(a,b,d,g);for(f=this.items[--i].animate(k);i--;)this.items[i]&&!this.items[i].removed&&this.items[i].animateWith(f,k,k),this.items[i]&&!this.items[i].removed||h--;return this},nc.insertAfter=function(a){for(var b=this.items.length;b--;)this.items[b].insertAfter(a);return this},nc.getBBox=function(){for(var a=[],b=[],c=[],d=[],e=this.items.length;e--;)if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)}return a=P[D](0,a),b=P[D](0,b),c=O[D](0,c),d=O[D](0,d),{x:a,y:b,x2:c,y2:d,width:c-a,height:d-b}},nc.clone=function(a){a=this.paper.set();for(var b=0,c=this.items.length;c>b;b++)a.push(this.items[b].clone());return a},nc.toString=function(){return"Raphaël‘s set"},nc.glow=function(a){var b=this.paper.set();return this.forEach(function(c){var d=c.glow(a);null!=d&&d.forEach(function(a){b.push(a)})}),b},nc.isPointInside=function(a,b){var c=!1;return this.forEach(function(d){return d.isPointInside(a,b)?(console.log("runned"),c=!0,!1):void 0}),c},c.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[z](d)&&(b.face[d]=a.face[d]);if(this.fonts[c]?this.fonts[c].push(b):this.fonts[c]=[b],!a.svg){b.face["units-per-em"]=ab(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[z](e)){var f=a.glyphs[e];if(b.glyphs[e]={w:f.w,k:{},d:f.d&&"M"+f.d.replace(/[mlcxtrv]/g,function(a){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[a]||"M"})+"z"},f.k)for(var g in f.k)f[z](g)&&(b.glyphs[e].k[g]=f.k[g])}}return a},v.getFont=function(a,b,d,e){if(e=e||"normal",d=d||"normal",b=+b||{normal:400,bold:700,lighter:300,bolder:800}[b]||400,c.fonts){var f=c.fonts[a];if(!f){var g=new RegExp("(^|\\s)"+a.replace(/[^\w\d\s+!~.:_-]/g,G)+"(\\s|$)","i");for(var h in c.fonts)if(c.fonts[z](h)&&g.test(h)){f=c.fonts[h];break}}var i;if(f)for(var j=0,k=f.length;k>j&&(i=f[j],i.face["font-weight"]!=b||i.face["font-style"]!=d&&i.face["font-style"]||i.face["font-stretch"]!=e);j++);return i}},v.print=function(a,b,d,e,f,g,h,i){g=g||"middle",h=O(P(h||0,1),-1),i=O(P(i||1,3),1);var j,k=I(d)[J](G),l=0,m=0,n=G;if(c.is(e,"string")&&(e=this.getFont(e)),e){j=(f||16)/e.face["units-per-em"];for(var o=e.face.bbox[J](w),p=+o[0],q=o[3]-o[1],r=0,s=+o[1]+("baseline"==g?q+ +e.face.descent:q/2),t=0,u=k.length;u>t;t++){if("\n"==k[t])l=0,x=0,m=0,r+=q*i;else{var v=m&&e.glyphs[k[t-1]]||{},x=e.glyphs[k[t]];l+=m?(v.w||e.w)+(v.k&&v.k[k[t]]||0)+e.w*h:0,m=1}x&&x.d&&(n+=c.transformPath(x.d,["t",l*j,r*j,"s",j,j,p,s,"t",(a-p)/j,(b-s)/j]))}}return this.path(n).attr({fill:"#000",stroke:"none"})},v.add=function(a){if(c.is(a,"array"))for(var b,d=this.set(),e=0,f=a.length;f>e;e++)b=a[e]||{},x[z](b.type)&&d.push(this[b.type]().attr(b));return d},c.format=function(a,b){var d=c.is(b,V)?[0][E](b):arguments;return a&&c.is(a,U)&&d.length-1&&(a=a.replace(y,function(a,b){return null==d[++b]?G:d[b]})),a||G},c.fullfill=function(){var a=/\{([^\}]+)\}/g,b=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,c=function(a,c,d){var e=d;return c.replace(b,function(a,b,c,d,f){b=b||d,e&&(b in e&&(e=e[b]),"function"==typeof e&&f&&(e=e()))}),e=(null==e||e==d?a:e)+""};return function(b,d){return String(b).replace(a,function(a,b){return c(a,b,d)})}}(),c.ninja=function(){return B.was?A.win.Raphael=B.is:delete Raphael,c},c.st=nc,function(a,b,d){function e(){/in/.test(a.readyState)?setTimeout(e,9):c.eve("raphael.DOMload")}null==a.readyState&&a.addEventListener&&(a.addEventListener(b,d=function(){a.removeEventListener(b,d,!1),a.readyState="complete"},!1),a.readyState="loading"),e()}(document,"DOMContentLoaded"),b.on("raphael.DOMload",function(){u=!0}),function(){if(c.svg){var a="hasOwnProperty",b=String,d=parseFloat,e=parseInt,f=Math,g=f.max,h=f.abs,i=f.pow,j=/[, ]+/,k=c.eve,l="",m=" ",n="http://www.w3.org/1999/xlink",o={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},p={};c.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var q=function(d,e){if(e){"string"==typeof d&&(d=q(d));for(var f in e)e[a](f)&&("xlink:"==f.substring(0,6)?d.setAttributeNS(n,f.substring(6),b(e[f])):d.setAttribute(f,b(e[f])))}else d=c._g.doc.createElementNS("http://www.w3.org/2000/svg",d),d.style&&(d.style.webkitTapHighlightColor="rgba(0,0,0,0)");return d},r=function(a,e){var j="linear",k=a.id+e,m=.5,n=.5,o=a.node,p=a.paper,r=o.style,s=c._g.doc.getElementById(k);if(!s){if(e=b(e).replace(c._radial_gradient,function(a,b,c){if(j="radial",b&&c){m=d(b),n=d(c);var e=2*(n>.5)-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&.5!=n&&(n=n.toFixed(5)-1e-5*e)}return l}),e=e.split(/\s*\-\s*/),"linear"==j){var t=e.shift();if(t=-d(t),isNaN(t))return null;var u=[0,0,f.cos(c.rad(t)),f.sin(c.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)}var w=c._parseDots(e);if(!w)return null;if(k=k.replace(/[\(\)\s,\xb0#]/g,"_"),a.gradient&&k!=a.gradient.id&&(p.defs.removeChild(a.gradient),delete a.gradient),!a.gradient){s=q(j+"Gradient",{id:k}),a.gradient=s,q(s,"radial"==j?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:a.matrix.invert()}),p.defs.appendChild(s);for(var x=0,y=w.length;y>x;x++)s.appendChild(q("stop",{offset:w[x].offset?w[x].offset:x?"100%":"0%","stop-color":w[x].color||"#fff"}))}}return q(o,{fill:"url(#"+k+")",opacity:1,"fill-opacity":1}),r.fill=l,r.opacity=1,r.fillOpacity=1,1},s=function(a){var b=a.getBBox(1);q(a.pattern,{patternTransform:a.matrix.invert()+" translate("+b.x+","+b.y+")"})},t=function(d,e,f){if("path"==d.type){for(var g,h,i,j,k,m=b(e).toLowerCase().split("-"),n=d.paper,r=f?"end":"start",s=d.node,t=d.attrs,u=t["stroke-width"],v=m.length,w="classic",x=3,y=3,z=5;v--;)switch(m[v]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":w=m[v];break;case"wide":y=5;break;case"narrow":y=2;break;case"long":x=5;break;case"short":x=2}if("open"==w?(x+=2,y+=2,z+=2,i=1,j=f?4:1,k={fill:"none",stroke:t.stroke}):(j=i=x/2,k={fill:t.stroke,stroke:"none"}),d._.arrows?f?(d._.arrows.endPath&&p[d._.arrows.endPath]--,d._.arrows.endMarker&&p[d._.arrows.endMarker]--):(d._.arrows.startPath&&p[d._.arrows.startPath]--,d._.arrows.startMarker&&p[d._.arrows.startMarker]--):d._.arrows={},"none"!=w){var A="raphael-marker-"+w,B="raphael-marker-"+r+w+x+y;c._g.doc.getElementById(A)?p[A]++:(n.defs.appendChild(q(q("path"),{"stroke-linecap":"round",d:o[w],id:A})),p[A]=1);var C,D=c._g.doc.getElementById(B);D?(p[B]++,C=D.getElementsByTagName("use")[0]):(D=q(q("marker"),{id:B,markerHeight:y,markerWidth:x,orient:"auto",refX:j,refY:y/2}),C=q(q("use"),{"xlink:href":"#"+A,transform:(f?"rotate(180 "+x/2+" "+y/2+") ":l)+"scale("+x/z+","+y/z+")","stroke-width":(1/((x/z+y/z)/2)).toFixed(4)}),D.appendChild(C),n.defs.appendChild(D),p[B]=1),q(C,k);var E=i*("diamond"!=w&&"oval"!=w);f?(g=d._.arrows.startdx*u||0,h=c.getTotalLength(t.path)-E*u):(g=E*u,h=c.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),k={},k["marker-"+r]="url(#"+B+")",(h||g)&&(k.d=c.getSubpath(t.path,g,h)),q(s,k),d._.arrows[r+"Path"]=A,d._.arrows[r+"Marker"]=B,d._.arrows[r+"dx"]=E,d._.arrows[r+"Type"]=w,d._.arrows[r+"String"]=e}else f?(g=d._.arrows.startdx*u||0,h=c.getTotalLength(t.path)-g):(g=0,h=c.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),d._.arrows[r+"Path"]&&q(s,{d:c.getSubpath(t.path,g,h)}),delete d._.arrows[r+"Path"],delete d._.arrows[r+"Marker"],delete d._.arrows[r+"dx"],delete d._.arrows[r+"Type"],delete d._.arrows[r+"String"];for(k in p)if(p[a](k)&&!p[k]){var F=c._g.doc.getElementById(k);F&&F.parentNode.removeChild(F)}}},u={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},v=function(a,c,d){if(c=u[b(c).toLowerCase()]){for(var e=a.attrs["stroke-width"]||"1",f={round:e,square:e,butt:0}[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],h=c.length;h--;)g[h]=c[h]*e+(h%2?1:-1)*f;q(a.node,{"stroke-dasharray":g.join(",")})}},w=function(d,f){var i=d.node,k=d.attrs,m=i.style.visibility;i.style.visibility="hidden";for(var o in f)if(f[a](o)){if(!c._availableAttrs[a](o))continue;var p=f[o];switch(k[o]=p,o){case"blur":d.blur(p);break;case"href":case"title":var u=q("title"),w=c._g.doc.createTextNode(p);u.appendChild(w),i.appendChild(u);break;case"target":var x=i.parentNode;if("a"!=x.tagName.toLowerCase()){var u=q("a");x.insertBefore(u,i),u.appendChild(i),x=u}"target"==o?x.setAttributeNS(n,"show","blank"==p?"new":p):x.setAttributeNS(n,o,p);break;case"cursor":i.style.cursor=p;break;case"transform":d.transform(p);break;case"arrow-start":t(d,p);break;case"arrow-end":t(d,p,1);break;case"clip-rect":var z=b(p).split(j);if(4==z.length){d.clip&&d.clip.parentNode.parentNode.removeChild(d.clip.parentNode);var A=q("clipPath"),B=q("rect");A.id=c.createUUID(),q(B,{x:z[0],y:z[1],width:z[2],height:z[3]}),A.appendChild(B),d.paper.defs.appendChild(A),q(i,{"clip-path":"url(#"+A.id+")"}),d.clip=B}if(!p){var C=i.getAttribute("clip-path");if(C){var D=c._g.doc.getElementById(C.replace(/(^url\(#|\)$)/g,l));D&&D.parentNode.removeChild(D),q(i,{"clip-path":l}),delete d.clip}}break;case"path":"path"==d.type&&(q(i,{d:p?k.path=c._pathToAbsolute(p):"M0,0"}),d._.dirty=1,d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1)));break;case"width":if(i.setAttribute(o,p),d._.dirty=1,!k.fx)break;o="x",p=k.x;case"x":k.fx&&(p=-k.x-(k.width||0));case"rx":if("rx"==o&&"rect"==d.type)break;case"cx":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"height":if(i.setAttribute(o,p),d._.dirty=1,!k.fy)break;o="y",p=k.y;case"y":k.fy&&(p=-k.y-(k.height||0));case"ry":if("ry"==o&&"rect"==d.type)break;case"cy":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"r":"rect"==d.type?q(i,{rx:p,ry:p}):i.setAttribute(o,p),d._.dirty=1;break;case"src":"image"==d.type&&i.setAttributeNS(n,"href",p);break;case"stroke-width":(1!=d._.sx||1!=d._.sy)&&(p/=g(h(d._.sx),h(d._.sy))||1),d.paper._vbSize&&(p*=d.paper._vbSize),i.setAttribute(o,p),k["stroke-dasharray"]&&v(d,k["stroke-dasharray"],f),d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"stroke-dasharray":v(d,p,f);break;case"fill":var E=b(p).match(c._ISURL);if(E){A=q("pattern");var F=q("image");A.id=c.createUUID(),q(A,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),q(F,{x:0,y:0,"xlink:href":E[1]}),A.appendChild(F),function(a){c._preload(E[1],function(){var b=this.offsetWidth,c=this.offsetHeight;q(a,{width:b,height:c}),q(F,{width:b,height:c}),d.paper.safari()})}(A),d.paper.defs.appendChild(A),q(i,{fill:"url(#"+A.id+")"}),d.pattern=A,d.pattern&&s(d);break}var G=c.getRGB(p);if(G.error){if(("circle"==d.type||"ellipse"==d.type||"r"!=b(p).charAt())&&r(d,p)){if("opacity"in k||"fill-opacity"in k){var H=c._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l));if(H){var I=H.getElementsByTagName("stop");q(I[I.length-1],{"stop-opacity":("opacity"in k?k.opacity:1)*("fill-opacity"in k?k["fill-opacity"]:1)})}}k.gradient=p,k.fill="none";break}}else delete f.gradient,delete k.gradient,!c.is(k.opacity,"undefined")&&c.is(f.opacity,"undefined")&&q(i,{opacity:k.opacity}),!c.is(k["fill-opacity"],"undefined")&&c.is(f["fill-opacity"],"undefined")&&q(i,{"fill-opacity":k["fill-opacity"]});G[a]("opacity")&&q(i,{"fill-opacity":G.opacity>1?G.opacity/100:G.opacity});case"stroke":G=c.getRGB(p),i.setAttribute(o,G.hex),"stroke"==o&&G[a]("opacity")&&q(i,{"stroke-opacity":G.opacity>1?G.opacity/100:G.opacity}),"stroke"==o&&d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"gradient":("circle"==d.type||"ellipse"==d.type||"r"!=b(p).charAt())&&r(d,p);break;case"opacity":k.gradient&&!k[a]("stroke-opacity")&&q(i,{"stroke-opacity":p>1?p/100:p});case"fill-opacity":if(k.gradient){H=c._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l)),H&&(I=H.getElementsByTagName("stop"),q(I[I.length-1],{"stop-opacity":p}));break}default:"font-size"==o&&(p=e(p,10)+"px");var J=o.replace(/(\-.)/g,function(a){return a.substring(1).toUpperCase()});i.style[J]=p,d._.dirty=1,i.setAttribute(o,p)}}y(d,f),i.style.visibility=m},x=1.2,y=function(d,f){if("text"==d.type&&(f[a]("text")||f[a]("font")||f[a]("font-size")||f[a]("x")||f[a]("y"))){var g=d.attrs,h=d.node,i=h.firstChild?e(c._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue("font-size"),10):10; +if(f[a]("text")){for(g.text=f.text;h.firstChild;)h.removeChild(h.firstChild);for(var j,k=b(f.text).split("\n"),m=[],n=0,o=k.length;o>n;n++)j=q("tspan"),n&&q(j,{dy:i*x,x:g.x}),j.appendChild(c._g.doc.createTextNode(k[n])),h.appendChild(j),m[n]=j}else for(m=h.getElementsByTagName("tspan"),n=0,o=m.length;o>n;n++)n?q(m[n],{dy:i*x,x:g.x}):q(m[0],{dy:0});q(h,{x:g.x,y:g.y}),d._.dirty=1;var p=d._getBBox(),r=g.y-(p.y+p.height/2);r&&c.is(r,"finite")&&q(m[0],{dy:r})}},z=function(a,b){this[0]=this.node=a,a.raphael=!0,this.id=c._oid++,a.raphaelid=this.id,this.matrix=c.matrix(),this.realPath=null,this.paper=b,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!b.bottom&&(b.bottom=this),this.prev=b.top,b.top&&(b.top.next=this),b.top=this,this.next=null},A=c.el;z.prototype=A,A.constructor=z,c._engine.path=function(a,b){var c=q("path");b.canvas&&b.canvas.appendChild(c);var d=new z(c,b);return d.type="path",w(d,{fill:"none",stroke:"#000",path:a}),d},A.rotate=function(a,c,e){if(this.removed)return this;if(a=b(a).split(j),a.length-1&&(c=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(c=e),null==c||null==e){var f=this.getBBox(1);c=f.x+f.width/2,e=f.y+f.height/2}return this.transform(this._.transform.concat([["r",a,c,e]])),this},A.scale=function(a,c,e,f){if(this.removed)return this;if(a=b(a).split(j),a.length-1&&(c=d(a[1]),e=d(a[2]),f=d(a[3])),a=d(a[0]),null==c&&(c=a),null==f&&(e=f),null==e||null==f)var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,c,e,f]])),this},A.translate=function(a,c){return this.removed?this:(a=b(a).split(j),a.length-1&&(c=d(a[1])),a=d(a[0])||0,c=+c||0,this.transform(this._.transform.concat([["t",a,c]])),this)},A.transform=function(b){var d=this._;if(null==b)return d.transform;if(c._extractTransform(this,b),this.clip&&q(this.clip,{transform:this.matrix.invert()}),this.pattern&&s(this),this.node&&q(this.node,{transform:this.matrix}),1!=d.sx||1!=d.sy){var e=this.attrs[a]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":e})}return this},A.hide=function(){return!this.removed&&this.paper.safari(this.node.style.display="none"),this},A.show=function(){return!this.removed&&this.paper.safari(this.node.style.display=""),this},A.remove=function(){if(!this.removed&&this.node.parentNode){var a=this.paper;a.__set__&&a.__set__.exclude(this),k.unbind("raphael.*.*."+this.id),this.gradient&&a.defs.removeChild(this.gradient),c._tear(this,a),"a"==this.node.parentNode.tagName.toLowerCase()?this.node.parentNode.parentNode.removeChild(this.node.parentNode):this.node.parentNode.removeChild(this.node);for(var b in this)this[b]="function"==typeof this[b]?c._removedFactory(b):null;this.removed=!0}},A._getBBox=function(){if("none"==this.node.style.display){this.show();var a=!0}var b={};try{b=this.node.getBBox()}catch(c){}finally{b=b||{}}return a&&this.hide(),b},A.attr=function(b,d){if(this.removed)return this;if(null==b){var e={};for(var f in this.attrs)this.attrs[a](f)&&(e[f]=this.attrs[f]);return e.gradient&&"none"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e}if(null==d&&c.is(b,"string")){if("fill"==b&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;if("transform"==b)return this._.transform;for(var g=b.split(j),h={},i=0,l=g.length;l>i;i++)b=g[i],h[b]=b in this.attrs?this.attrs[b]:c.is(this.paper.customAttributes[b],"function")?this.paper.customAttributes[b].def:c._availableAttrs[b];return l-1?h:h[g[0]]}if(null==d&&c.is(b,"array")){for(h={},i=0,l=b.length;l>i;i++)h[b[i]]=this.attr(b[i]);return h}if(null!=d){var m={};m[b]=d}else null!=b&&c.is(b,"object")&&(m=b);for(var n in m)k("raphael.attr."+n+"."+this.id,this,m[n]);for(n in this.paper.customAttributes)if(this.paper.customAttributes[a](n)&&m[a](n)&&c.is(this.paper.customAttributes[n],"function")){var o=this.paper.customAttributes[n].apply(this,[].concat(m[n]));this.attrs[n]=m[n];for(var p in o)o[a](p)&&(m[p]=o[p])}return w(this,m),this},A.toFront=function(){if(this.removed)return this;"a"==this.node.parentNode.tagName.toLowerCase()?this.node.parentNode.parentNode.appendChild(this.node.parentNode):this.node.parentNode.appendChild(this.node);var a=this.paper;return a.top!=this&&c._tofront(this,a),this},A.toBack=function(){if(this.removed)return this;var a=this.node.parentNode;return"a"==a.tagName.toLowerCase()?a.parentNode.insertBefore(this.node.parentNode,this.node.parentNode.parentNode.firstChild):a.firstChild!=this.node&&a.insertBefore(this.node,this.node.parentNode.firstChild),c._toback(this,this.paper),this.paper,this},A.insertAfter=function(a){if(this.removed)return this;var b=a.node||a[a.length-1].node;return b.nextSibling?b.parentNode.insertBefore(this.node,b.nextSibling):b.parentNode.appendChild(this.node),c._insertafter(this,a,this.paper),this},A.insertBefore=function(a){if(this.removed)return this;var b=a.node||a[0].node;return b.parentNode.insertBefore(this.node,b),c._insertbefore(this,a,this.paper),this},A.blur=function(a){var b=this;if(0!==+a){var d=q("filter"),e=q("feGaussianBlur");b.attrs.blur=a,d.id=c.createUUID(),q(e,{stdDeviation:+a||1.5}),d.appendChild(e),b.paper.defs.appendChild(d),b._blur=d,q(b.node,{filter:"url(#"+d.id+")"})}else b._blur&&(b._blur.parentNode.removeChild(b._blur),delete b._blur,delete b.attrs.blur),b.node.removeAttribute("filter");return b},c._engine.circle=function(a,b,c,d){var e=q("circle");a.canvas&&a.canvas.appendChild(e);var f=new z(e,a);return f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"},f.type="circle",q(e,f.attrs),f},c._engine.rect=function(a,b,c,d,e,f){var g=q("rect");a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);return h.attrs={x:b,y:c,width:d,height:e,r:f||0,rx:f||0,ry:f||0,fill:"none",stroke:"#000"},h.type="rect",q(g,h.attrs),h},c._engine.ellipse=function(a,b,c,d,e){var f=q("ellipse");a.canvas&&a.canvas.appendChild(f);var g=new z(f,a);return g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"},g.type="ellipse",q(f,g.attrs),g},c._engine.image=function(a,b,c,d,e,f){var g=q("image");q(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"}),g.setAttributeNS(n,"href",b),a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);return h.attrs={x:c,y:d,width:e,height:f,src:b},h.type="image",h},c._engine.text=function(a,b,d,e){var f=q("text");a.canvas&&a.canvas.appendChild(f);var g=new z(f,a);return g.attrs={x:b,y:d,"text-anchor":"middle",text:e,font:c._availableAttrs.font,stroke:"none",fill:"#000"},g.type="text",w(g,g.attrs),g},c._engine.setSize=function(a,b){return this.width=a||this.width,this.height=b||this.height,this.canvas.setAttribute("width",this.width),this.canvas.setAttribute("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox),this},c._engine.create=function(){var a=c._getContainer.apply(0,arguments),b=a&&a.container,d=a.x,e=a.y,f=a.width,g=a.height;if(!b)throw new Error("SVG container not found.");var h,i=q("svg"),j="overflow:hidden;";return d=d||0,e=e||0,f=f||512,g=g||342,q(i,{height:g,version:1.1,width:f,xmlns:"http://www.w3.org/2000/svg"}),1==b?(i.style.cssText=j+"position:absolute;left:"+d+"px;top:"+e+"px",c._g.doc.body.appendChild(i),h=1):(i.style.cssText=j+"position:relative",b.firstChild?b.insertBefore(i,b.firstChild):b.appendChild(i)),b=new c._Paper,b.width=f,b.height=g,b.canvas=i,b.clear(),b._left=b._top=0,h&&(b.renderfix=function(){}),b.renderfix(),b},c._engine.setViewBox=function(a,b,c,d,e){k("raphael.setViewBox",this,this._viewBox,[a,b,c,d,e]);var f,h,i=g(c/this.width,d/this.height),j=this.top,l=e?"meet":"xMinYMin";for(null==a?(this._vbSize&&(i=1),delete this._vbSize,f="0 0 "+this.width+m+this.height):(this._vbSize=i,f=a+m+b+m+c+m+d),q(this.canvas,{viewBox:f,preserveAspectRatio:l});i&&j;)h="stroke-width"in j.attrs?j.attrs["stroke-width"]:1,j.attr({"stroke-width":h}),j._.dirty=1,j._.dirtyT=1,j=j.prev;return this._viewBox=[a,b,c,d,!!e],this},c.prototype.renderfix=function(){var a,b=this.canvas,c=b.style;try{a=b.getScreenCTM()||b.createSVGMatrix()}catch(d){a=b.createSVGMatrix()}var e=-a.e%1,f=-a.f%1;(e||f)&&(e&&(this._left=(this._left+e)%1,c.left=this._left+"px"),f&&(this._top=(this._top+f)%1,c.top=this._top+"px"))},c.prototype.clear=function(){c.eve("raphael.clear",this);for(var a=this.canvas;a.firstChild;)a.removeChild(a.firstChild);this.bottom=this.top=null,(this.desc=q("desc")).appendChild(c._g.doc.createTextNode("Created with Raphaël "+c.version)),a.appendChild(this.desc),a.appendChild(this.defs=q("defs"))},c.prototype.remove=function(){k("raphael.remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]="function"==typeof this[a]?c._removedFactory(a):null};var B=c.st;for(var C in A)A[a](C)&&!B[a](C)&&(B[C]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(C))}}(),function(){if(c.vml){var a="hasOwnProperty",b=String,d=parseFloat,e=Math,f=e.round,g=e.max,h=e.min,i=e.abs,j="fill",k=/[, ]+/,l=c.eve,m=" progid:DXImageTransform.Microsoft",n=" ",o="",p={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},q=/([clmz]),?([^clmz]*)/gi,r=/ progid:\S+Blur\([^\)]+\)/g,s=/-?[^,\s-]+/g,t="position:absolute;left:0;top:0;width:1px;height:1px",u=21600,v={path:1,rect:1,image:1},w={circle:1,ellipse:1},x=function(a){var d=/[ahqstv]/gi,e=c._pathToAbsolute;if(b(a).match(d)&&(e=c._path2curve),d=/[clmz]/g,e==c._pathToAbsolute&&!b(a).match(d)){var g=b(a).replace(q,function(a,b,c){var d=[],e="m"==b.toLowerCase(),g=p[b];return c.replace(s,function(a){e&&2==d.length&&(g+=d+p["m"==b?"l":"L"],d=[]),d.push(f(a*u))}),g+d});return g}var h,i,j=e(a);g=[];for(var k=0,l=j.length;l>k;k++){h=j[k],i=j[k][0].toLowerCase(),"z"==i&&(i="x");for(var m=1,r=h.length;r>m;m++)i+=f(h[m]*u)+(m!=r-1?",":o);g.push(i)}return g.join(n)},y=function(a,b,d){var e=c.matrix();return e.rotate(-a,.5,.5),{dx:e.x(b,d),dy:e.y(b,d)}},z=function(a,b,c,d,e,f){var g=a._,h=a.matrix,k=g.fillpos,l=a.node,m=l.style,o=1,p="",q=u/b,r=u/c;if(m.visibility="hidden",b&&c){if(l.coordsize=i(q)+n+i(r),m.rotation=f*(0>b*c?-1:1),f){var s=y(f,d,e);d=s.dx,e=s.dy}if(0>b&&(p+="x"),0>c&&(p+=" y")&&(o=-1),m.flip=p,l.coordorigin=d*-q+n+e*-r,k||g.fillsize){var t=l.getElementsByTagName(j);t=t&&t[0],l.removeChild(t),k&&(s=y(f,h.x(k[0],k[1]),h.y(k[0],k[1])),t.position=s.dx*o+n+s.dy*o),g.fillsize&&(t.size=g.fillsize[0]*i(b)+n+g.fillsize[1]*i(c)),l.appendChild(t)}m.visibility="visible"}};c.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};var A=function(a,c,d){for(var e=b(c).toLowerCase().split("-"),f=d?"end":"start",g=e.length,h="classic",i="medium",j="medium";g--;)switch(e[g]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":h=e[g];break;case"wide":case"narrow":j=e[g];break;case"long":case"short":i=e[g]}var k=a.node.getElementsByTagName("stroke")[0];k[f+"arrow"]=h,k[f+"arrowlength"]=i,k[f+"arrowwidth"]=j},B=function(e,i){e.attrs=e.attrs||{};var l=e.node,m=e.attrs,p=l.style,q=v[e.type]&&(i.x!=m.x||i.y!=m.y||i.width!=m.width||i.height!=m.height||i.cx!=m.cx||i.cy!=m.cy||i.rx!=m.rx||i.ry!=m.ry||i.r!=m.r),r=w[e.type]&&(m.cx!=i.cx||m.cy!=i.cy||m.r!=i.r||m.rx!=i.rx||m.ry!=i.ry),s=e;for(var t in i)i[a](t)&&(m[t]=i[t]);if(q&&(m.path=c._getPath[e.type](e),e._.dirty=1),i.href&&(l.href=i.href),i.title&&(l.title=i.title),i.target&&(l.target=i.target),i.cursor&&(p.cursor=i.cursor),"blur"in i&&e.blur(i.blur),(i.path&&"path"==e.type||q)&&(l.path=x(~b(m.path).toLowerCase().indexOf("r")?c._pathToAbsolute(m.path):m.path),"image"==e.type&&(e._.fillpos=[m.x,m.y],e._.fillsize=[m.width,m.height],z(e,1,1,0,0,0))),"transform"in i&&e.transform(i.transform),r){var y=+m.cx,B=+m.cy,D=+m.rx||+m.r||0,E=+m.ry||+m.r||0;l.path=c.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",f((y-D)*u),f((B-E)*u),f((y+D)*u),f((B+E)*u),f(y*u)),e._.dirty=1}if("clip-rect"in i){var G=b(i["clip-rect"]).split(k);if(4==G.length){G[2]=+G[2]+ +G[0],G[3]=+G[3]+ +G[1];var H=l.clipRect||c._g.doc.createElement("div"),I=H.style;I.clip=c.format("rect({1}px {2}px {3}px {0}px)",G),l.clipRect||(I.position="absolute",I.top=0,I.left=0,I.width=e.paper.width+"px",I.height=e.paper.height+"px",l.parentNode.insertBefore(H,l),H.appendChild(l),l.clipRect=H)}i["clip-rect"]||l.clipRect&&(l.clipRect.style.clip="auto")}if(e.textpath){var J=e.textpath.style;i.font&&(J.font=i.font),i["font-family"]&&(J.fontFamily='"'+i["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,o)+'"'),i["font-size"]&&(J.fontSize=i["font-size"]),i["font-weight"]&&(J.fontWeight=i["font-weight"]),i["font-style"]&&(J.fontStyle=i["font-style"])}if("arrow-start"in i&&A(s,i["arrow-start"]),"arrow-end"in i&&A(s,i["arrow-end"],1),null!=i.opacity||null!=i["stroke-width"]||null!=i.fill||null!=i.src||null!=i.stroke||null!=i["stroke-width"]||null!=i["stroke-opacity"]||null!=i["fill-opacity"]||null!=i["stroke-dasharray"]||null!=i["stroke-miterlimit"]||null!=i["stroke-linejoin"]||null!=i["stroke-linecap"]){var K=l.getElementsByTagName(j),L=!1;if(K=K&&K[0],!K&&(L=K=F(j)),"image"==e.type&&i.src&&(K.src=i.src),i.fill&&(K.on=!0),(null==K.on||"none"==i.fill||null===i.fill)&&(K.on=!1),K.on&&i.fill){var M=b(i.fill).match(c._ISURL);if(M){K.parentNode==l&&l.removeChild(K),K.rotate=!0,K.src=M[1],K.type="tile";var N=e.getBBox(1);K.position=N.x+n+N.y,e._.fillpos=[N.x,N.y],c._preload(M[1],function(){e._.fillsize=[this.offsetWidth,this.offsetHeight]})}else K.color=c.getRGB(i.fill).hex,K.src=o,K.type="solid",c.getRGB(i.fill).error&&(s.type in{circle:1,ellipse:1}||"r"!=b(i.fill).charAt())&&C(s,i.fill,K)&&(m.fill="none",m.gradient=i.fill,K.rotate=!1)}if("fill-opacity"in i||"opacity"in i){var O=((+m["fill-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+c.getRGB(i.fill).o+1||2)-1);O=h(g(O,0),1),K.opacity=O,K.src&&(K.color="none")}l.appendChild(K);var P=l.getElementsByTagName("stroke")&&l.getElementsByTagName("stroke")[0],Q=!1;!P&&(Q=P=F("stroke")),(i.stroke&&"none"!=i.stroke||i["stroke-width"]||null!=i["stroke-opacity"]||i["stroke-dasharray"]||i["stroke-miterlimit"]||i["stroke-linejoin"]||i["stroke-linecap"])&&(P.on=!0),("none"==i.stroke||null===i.stroke||null==P.on||0==i.stroke||0==i["stroke-width"])&&(P.on=!1);var R=c.getRGB(i.stroke);P.on&&i.stroke&&(P.color=R.hex),O=((+m["stroke-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+R.o+1||2)-1);var S=.75*(d(i["stroke-width"])||1);if(O=h(g(O,0),1),null==i["stroke-width"]&&(S=m["stroke-width"]),i["stroke-width"]&&(P.weight=S),S&&1>S&&(O*=S)&&(P.weight=1),P.opacity=O,i["stroke-linejoin"]&&(P.joinstyle=i["stroke-linejoin"]||"miter"),P.miterlimit=i["stroke-miterlimit"]||8,i["stroke-linecap"]&&(P.endcap="butt"==i["stroke-linecap"]?"flat":"square"==i["stroke-linecap"]?"square":"round"),i["stroke-dasharray"]){var T={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};P.dashstyle=T[a](i["stroke-dasharray"])?T[i["stroke-dasharray"]]:o}Q&&l.appendChild(P)}if("text"==s.type){s.paper.canvas.style.display=o;var U=s.paper.span,V=100,W=m.font&&m.font.match(/\d+(?:\.\d*)?(?=px)/);p=U.style,m.font&&(p.font=m.font),m["font-family"]&&(p.fontFamily=m["font-family"]),m["font-weight"]&&(p.fontWeight=m["font-weight"]),m["font-style"]&&(p.fontStyle=m["font-style"]),W=d(m["font-size"]||W&&W[0])||10,p.fontSize=W*V+"px",s.textpath.string&&(U.innerHTML=b(s.textpath.string).replace(/</g,"&#60;").replace(/&/g,"&#38;").replace(/\n/g,"<br>"));var X=U.getBoundingClientRect();s.W=m.w=(X.right-X.left)/V,s.H=m.h=(X.bottom-X.top)/V,s.X=m.x,s.Y=m.y+s.H/2,("x"in i||"y"in i)&&(s.path.v=c.format("m{0},{1}l{2},{1}",f(m.x*u),f(m.y*u),f(m.x*u)+1));for(var Y=["x","y","text","font","font-family","font-weight","font-style","font-size"],Z=0,$=Y.length;$>Z;Z++)if(Y[Z]in i){s._.dirty=1;break}switch(m["text-anchor"]){case"start":s.textpath.style["v-text-align"]="left",s.bbx=s.W/2;break;case"end":s.textpath.style["v-text-align"]="right",s.bbx=-s.W/2;break;default:s.textpath.style["v-text-align"]="center",s.bbx=0}s.textpath.style["v-text-kern"]=!0}},C=function(a,f,g){a.attrs=a.attrs||{};var h=(a.attrs,Math.pow),i="linear",j=".5 .5";if(a.attrs.gradient=f,f=b(f).replace(c._radial_gradient,function(a,b,c){return i="radial",b&&c&&(b=d(b),c=d(c),h(b-.5,2)+h(c-.5,2)>.25&&(c=e.sqrt(.25-h(b-.5,2))*(2*(c>.5)-1)+.5),j=b+n+c),o}),f=f.split(/\s*\-\s*/),"linear"==i){var k=f.shift();if(k=-d(k),isNaN(k))return null}var l=c._parseDots(f);if(!l)return null;if(a=a.shape||a.node,l.length){a.removeChild(g),g.on=!0,g.method="none",g.color=l[0].color,g.color2=l[l.length-1].color;for(var m=[],p=0,q=l.length;q>p;p++)l[p].offset&&m.push(l[p].offset+n+l[p].color);g.colors=m.length?m.join():"0% "+g.color,"radial"==i?(g.type="gradientTitle",g.focus="100%",g.focussize="0 0",g.focusposition=j,g.angle=0):(g.type="gradient",g.angle=(270-k)%360),a.appendChild(g)}return 1},D=function(a,b){this[0]=this.node=a,a.raphael=!0,this.id=c._oid++,a.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=b,this.matrix=c.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!b.bottom&&(b.bottom=this),this.prev=b.top,b.top&&(b.top.next=this),b.top=this,this.next=null},E=c.el;D.prototype=E,E.constructor=D,E.transform=function(a){if(null==a)return this._.transform;var d,e=this.paper._viewBoxShift,f=e?"s"+[e.scale,e.scale]+"-1-1t"+[e.dx,e.dy]:o;e&&(d=a=b(a).replace(/\.{3}|\u2026/g,this._.transform||o)),c._extractTransform(this,f+a);var g,h=this.matrix.clone(),i=this.skew,j=this.node,k=~b(this.attrs.fill).indexOf("-"),l=!b(this.attrs.fill).indexOf("url(");if(h.translate(1,1),l||k||"image"==this.type)if(i.matrix="1 0 0 1",i.offset="0 0",g=h.split(),k&&g.noRotation||!g.isSimple){j.style.filter=h.toFilter();var m=this.getBBox(),p=this.getBBox(1),q=m.x-p.x,r=m.y-p.y;j.coordorigin=q*-u+n+r*-u,z(this,1,1,q,r,0)}else j.style.filter=o,z(this,g.scalex,g.scaley,g.dx,g.dy,g.rotate);else j.style.filter=o,i.matrix=b(h),i.offset=h.offset();return d&&(this._.transform=d),this},E.rotate=function(a,c,e){if(this.removed)return this;if(null!=a){if(a=b(a).split(k),a.length-1&&(c=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(c=e),null==c||null==e){var f=this.getBBox(1);c=f.x+f.width/2,e=f.y+f.height/2}return this._.dirtyT=1,this.transform(this._.transform.concat([["r",a,c,e]])),this}},E.translate=function(a,c){return this.removed?this:(a=b(a).split(k),a.length-1&&(c=d(a[1])),a=d(a[0])||0,c=+c||0,this._.bbox&&(this._.bbox.x+=a,this._.bbox.y+=c),this.transform(this._.transform.concat([["t",a,c]])),this)},E.scale=function(a,c,e,f){if(this.removed)return this;if(a=b(a).split(k),a.length-1&&(c=d(a[1]),e=d(a[2]),f=d(a[3]),isNaN(e)&&(e=null),isNaN(f)&&(f=null)),a=d(a[0]),null==c&&(c=a),null==f&&(e=f),null==e||null==f)var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,c,e,f]])),this._.dirtyT=1,this},E.hide=function(){return!this.removed&&(this.node.style.display="none"),this},E.show=function(){return!this.removed&&(this.node.style.display=o),this},E._getBBox=function(){return this.removed?{}:{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},E.remove=function(){if(!this.removed&&this.node.parentNode){this.paper.__set__&&this.paper.__set__.exclude(this),c.eve.unbind("raphael.*.*."+this.id),c._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var a in this)this[a]="function"==typeof this[a]?c._removedFactory(a):null;this.removed=!0}},E.attr=function(b,d){if(this.removed)return this;if(null==b){var e={};for(var f in this.attrs)this.attrs[a](f)&&(e[f]=this.attrs[f]);return e.gradient&&"none"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e}if(null==d&&c.is(b,"string")){if(b==j&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;for(var g=b.split(k),h={},i=0,m=g.length;m>i;i++)b=g[i],h[b]=b in this.attrs?this.attrs[b]:c.is(this.paper.customAttributes[b],"function")?this.paper.customAttributes[b].def:c._availableAttrs[b];return m-1?h:h[g[0]]}if(this.attrs&&null==d&&c.is(b,"array")){for(h={},i=0,m=b.length;m>i;i++)h[b[i]]=this.attr(b[i]);return h}var n;null!=d&&(n={},n[b]=d),null==d&&c.is(b,"object")&&(n=b);for(var o in n)l("raphael.attr."+o+"."+this.id,this,n[o]);if(n){for(o in this.paper.customAttributes)if(this.paper.customAttributes[a](o)&&n[a](o)&&c.is(this.paper.customAttributes[o],"function")){var p=this.paper.customAttributes[o].apply(this,[].concat(n[o]));this.attrs[o]=n[o];for(var q in p)p[a](q)&&(n[q]=p[q])}n.text&&"text"==this.type&&(this.textpath.string=n.text),B(this,n)}return this},E.toFront=function(){return!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&c._tofront(this,this.paper),this},E.toBack=function(){return this.removed?this:(this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),c._toback(this,this.paper)),this)},E.insertAfter=function(a){return this.removed?this:(a.constructor==c.st.constructor&&(a=a[a.length-1]),a.node.nextSibling?a.node.parentNode.insertBefore(this.node,a.node.nextSibling):a.node.parentNode.appendChild(this.node),c._insertafter(this,a,this.paper),this)},E.insertBefore=function(a){return this.removed?this:(a.constructor==c.st.constructor&&(a=a[0]),a.node.parentNode.insertBefore(this.node,a.node),c._insertbefore(this,a,this.paper),this)},E.blur=function(a){var b=this.node.runtimeStyle,d=b.filter;return d=d.replace(r,o),0!==+a?(this.attrs.blur=a,b.filter=d+n+m+".Blur(pixelradius="+(+a||1.5)+")",b.margin=c.format("-{0}px 0 0 -{0}px",f(+a||1.5))):(b.filter=d,b.margin=0,delete this.attrs.blur),this},c._engine.path=function(a,b){var c=F("shape");c.style.cssText=t,c.coordsize=u+n+u,c.coordorigin=b.coordorigin;var d=new D(c,b),e={fill:"none",stroke:"#000"};a&&(e.path=a),d.type="path",d.path=[],d.Path=o,B(d,e),b.canvas.appendChild(c);var f=F("skew");return f.on=!0,c.appendChild(f),d.skew=f,d.transform(o),d},c._engine.rect=function(a,b,d,e,f,g){var h=c._rectPath(b,d,e,f,g),i=a.path(h),j=i.attrs;return i.X=j.x=b,i.Y=j.y=d,i.W=j.width=e,i.H=j.height=f,j.r=g,j.path=h,i.type="rect",i},c._engine.ellipse=function(a,b,c,d,e){var f=a.path();return f.attrs,f.X=b-d,f.Y=c-e,f.W=2*d,f.H=2*e,f.type="ellipse",B(f,{cx:b,cy:c,rx:d,ry:e}),f},c._engine.circle=function(a,b,c,d){var e=a.path();return e.attrs,e.X=b-d,e.Y=c-d,e.W=e.H=2*d,e.type="circle",B(e,{cx:b,cy:c,r:d}),e},c._engine.image=function(a,b,d,e,f,g){var h=c._rectPath(d,e,f,g),i=a.path(h).attr({stroke:"none"}),k=i.attrs,l=i.node,m=l.getElementsByTagName(j)[0];return k.src=b,i.X=k.x=d,i.Y=k.y=e,i.W=k.width=f,i.H=k.height=g,k.path=h,i.type="image",m.parentNode==l&&l.removeChild(m),m.rotate=!0,m.src=b,m.type="tile",i._.fillpos=[d,e],i._.fillsize=[f,g],l.appendChild(m),z(i,1,1,0,0,0),i},c._engine.text=function(a,d,e,g){var h=F("shape"),i=F("path"),j=F("textpath");d=d||0,e=e||0,g=g||"",i.v=c.format("m{0},{1}l{2},{1}",f(d*u),f(e*u),f(d*u)+1),i.textpathok=!0,j.string=b(g),j.on=!0,h.style.cssText=t,h.coordsize=u+n+u,h.coordorigin="0 0";var k=new D(h,a),l={fill:"#000",stroke:"none",font:c._availableAttrs.font,text:g};k.shape=h,k.path=i,k.textpath=j,k.type="text",k.attrs.text=b(g),k.attrs.x=d,k.attrs.y=e,k.attrs.w=1,k.attrs.h=1,B(k,l),h.appendChild(j),h.appendChild(i),a.canvas.appendChild(h);var m=F("skew");return m.on=!0,h.appendChild(m),k.skew=m,k.transform(o),k},c._engine.setSize=function(a,b){var d=this.canvas.style;return this.width=a,this.height=b,a==+a&&(a+="px"),b==+b&&(b+="px"),d.width=a,d.height=b,d.clip="rect(0 "+a+" "+b+" 0)",this._viewBox&&c._engine.setViewBox.apply(this,this._viewBox),this},c._engine.setViewBox=function(a,b,d,e,f){c.eve("raphael.setViewBox",this,this._viewBox,[a,b,d,e,f]);var h,i,j=this.width,k=this.height,l=1/g(d/j,e/k);return f&&(h=k/e,i=j/d,j>d*h&&(a-=(j-d*h)/2/h),k>e*i&&(b-=(k-e*i)/2/i)),this._viewBox=[a,b,d,e,!!f],this._viewBoxShift={dx:-a,dy:-b,scale:l},this.forEach(function(a){a.transform("...")}),this};var F;c._engine.initWin=function(a){var b=a.document;b.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!b.namespaces.rvml&&b.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),F=function(a){return b.createElement("<rvml:"+a+' class="rvml">')}}catch(c){F=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},c._engine.initWin(c._g.win),c._engine.create=function(){var a=c._getContainer.apply(0,arguments),b=a.container,d=a.height,e=a.width,f=a.x,g=a.y;if(!b)throw new Error("VML container not found.");var h=new c._Paper,i=h.canvas=c._g.doc.createElement("div"),j=i.style;return f=f||0,g=g||0,e=e||512,d=d||342,h.width=e,h.height=d,e==+e&&(e+="px"),d==+d&&(d+="px"),h.coordsize=1e3*u+n+1e3*u,h.coordorigin="0 0",h.span=c._g.doc.createElement("span"),h.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",i.appendChild(h.span),j.cssText=c.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",e,d),1==b?(c._g.doc.body.appendChild(i),j.left=f+"px",j.top=g+"px",j.position="absolute"):b.firstChild?b.insertBefore(i,b.firstChild):b.appendChild(i),h.renderfix=function(){},h},c.prototype.clear=function(){c.eve("raphael.clear",this),this.canvas.innerHTML=o,this.span=c._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},c.prototype.remove=function(){c.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]="function"==typeof this[a]?c._removedFactory(a):null;return!0};var G=c.st;for(var H in E)E[a](H)&&!G[a](H)&&(G[H]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(H))}}(),B.was?A.win.Raphael=c:Raphael=c,c}); \ No newline at end of file diff --git a/theme/bootstrap/package.json b/theme/bootstrap/package.json new file mode 100644 index 0000000..af7c55b --- /dev/null +++ b/theme/bootstrap/package.json @@ -0,0 +1,23 @@ +{ + "name": "admin-lte", + "version": "2.3.0", + "repository": { + "type": "git", + "url": "git://github.com/almasaeed2010/AdminLTE.git" + }, + "license": "MIT", + "devDependencies": { + "R2": "^1.4.3", + "grunt": "~0.4.5", + "grunt-contrib-clean": "^0.6.0", + "grunt-contrib-csslint": "^0.5.0", + "grunt-contrib-cssmin": "^0.12.2", + "grunt-contrib-jshint": "^0.11.2", + "grunt-contrib-less": "^0.12.0", + "grunt-contrib-uglify": "^0.7.0", + "grunt-contrib-watch": "~0.6.1", + "grunt-cssjanus": "^0.2.4", + "grunt-image": "^1.0.5", + "grunt-includes": "^0.4.5" + } +} diff --git a/theme/bootstrap/pages/UI/buttons.html b/theme/bootstrap/pages/UI/buttons.html new file mode 100644 index 0000000..8109500 --- /dev/null +++ b/theme/bootstrap/pages/UI/buttons.html @@ -0,0 +1,1515 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Buttons</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + AdminLTE Design Team + <small><i class="fa fa-clock-o"></i> 2 hours</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Developers + <small><i class="fa fa-clock-o"></i> Today</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Sales Department + <small><i class="fa fa-clock-o"></i> Yesterday</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Reviewers + <small><i class="fa fa-clock-o"></i> 2 days</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-users text-red"></i> 5 new members joined + </a> + </li> + + <li> + <a href="#"> + <i class="fa fa-shopping-cart text-green"></i> 25 sales made + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-user text-red"></i> You changed your username + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Create a nice theme + <small class="pull-right">40%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">40% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Some task I need to do + <small class="pull-right">60%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">60% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Make beautiful transitions + <small class="pull-right">80%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="../charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="../charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="../charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li class="active"><a href="buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="../examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="../examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="../examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="../examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="../examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="../examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="../examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Buttons + <small>Control panel</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">UI</a></li> + <li class="active">Buttons</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + + <div class="row"> + <div class="col-md-12"> + <div class="box box-primary"> + <div class="box-header"> + <i class="fa fa-edit"></i> + <h3 class="box-title">Buttons</h3> + </div> + <div class="box-body pad table-responsive"> + <p>Various types of buttons. Using the base class <code>.btn</code></p> + <table class="table table-bordered text-center"> + <tr> + <th>Normal</th> + <th>Large <code>.btn-lg</code></th> + <th>Small <code>.btn-sm</code></th> + <th>X-Small <code>.btn-xs</code></th> + <th>Flat <code>.btn-flat</code></th> + <th>Disabled <code>.disabled</code></th> + </tr> + <tr> + <td><button class="btn btn-block btn-default">Default</button></td> + <td><button class="btn btn-block btn-default btn-lg">Default</button></td> + <td><button class="btn btn-block btn-default btn-sm">Default</button></td> + <td><button class="btn btn-block btn-default btn-xs">Default</button></td> + <td><button class="btn btn-block btn-default btn-flat">Default</button></td> + <td><button class="btn btn-block btn-default disabled">Default</button></td> + </tr> + <tr> + <td><button class="btn btn-block btn-primary">Primary</button></td> + <td><button class="btn btn-block btn-primary btn-lg">Primary</button></td> + <td><button class="btn btn-block btn-primary btn-sm">Primary</button></td> + <td><button class="btn btn-block btn-primary btn-xs">Primary</button></td> + <td><button class="btn btn-block btn-primary btn-flat">Primary</button></td> + <td><button class="btn btn-block btn-primary disabled">Primary</button></td> + </tr> + <tr> + <td><button class="btn btn-block btn-success">Success</button></td> + <td><button class="btn btn-block btn-success btn-lg">Success</button></td> + <td><button class="btn btn-block btn-success btn-sm">Success</button></td> + <td><button class="btn btn-block btn-success btn-xs">Success</button></td> + <td><button class="btn btn-block btn-success btn-flat">Success</button></td> + <td><button class="btn btn-block btn-success disabled">Success</button></td> + </tr> + <tr> + <td><button class="btn btn-block btn-info">Info</button></td> + <td><button class="btn btn-block btn-info btn-lg">Info</button></td> + <td><button class="btn btn-block btn-info btn-sm">Info</button></td> + <td><button class="btn btn-block btn-info btn-xs">Info</button></td> + <td><button class="btn btn-block btn-info btn-flat">Info</button></td> + <td><button class="btn btn-block btn-info disabled">Info</button></td> + </tr> + <tr> + <td><button class="btn btn-block btn-danger">Danger</button></td> + <td><button class="btn btn-block btn-danger btn-lg">Danger</button></td> + <td><button class="btn btn-block btn-danger btn-sm">Danger</button></td> + <td><button class="btn btn-block btn-danger btn-xs">Danger</button></td> + <td><button class="btn btn-block btn-danger btn-flat">Danger</button></td> + <td><button class="btn btn-block btn-danger disabled">Danger</button></td> + </tr> + <tr> + <td><button class="btn btn-block btn-warning">Warning</button></td> + <td><button class="btn btn-block btn-warning btn-lg">Warning</button></td> + <td><button class="btn btn-block btn-warning btn-sm">Warning</button></td> + <td><button class="btn btn-block btn-warning btn-xs">Warning</button></td> + <td><button class="btn btn-block btn-warning btn-flat">Warning</button></td> + <td><button class="btn btn-block btn-warning disabled">Warning</button></td> + </tr> + </table> + </div><!-- /.box --> + </div> + </div><!-- /.col --> + </div><!-- ./row --> + <div class="row"> + <div class="col-md-6"> + <!-- Block buttons --> + <div class="box"> + <div class="box-header"> + <h3 class="box-title">Block Buttons</h3> + </div> + <div class="box-body"> + <button class="btn btn-default btn-block">.btn-block</button> + <button class="btn btn-default btn-block btn-flat">.btn-block .btn-flat</button> + <button class="btn btn-default btn-block btn-sm">.btn-block .btn-sm</button> + </div> + </div><!-- /.box --> + + <!-- Horizontal grouping --> + <div class="box"> + <div class="box-header"> + <h3 class="box-title">Horizontal Button Group</h3> + </div> + <div class="box-body table-responsive pad"> + <p> + Horizontal button groups are easy to create with bootstrap. Just add your buttons + inside <code>&lt;div class="btn-group"&gt;&lt;/div&gt;</code> + </p> + + <table class="table table-bordered"> + <tr> + <th>Button</th> + <th>Icons</th> + <th>Flat</th> + <th>Dropdown</th> + </tr> + <!-- Default --> + <tr> + <td> + <div class="btn-group"> + <button type="button" class="btn btn-default">Left</button> + <button type="button" class="btn btn-default">Middle</button> + <button type="button" class="btn btn-default">Right</button> + </div> + </td> + <td> + <div class="btn-group"> + <button type="button" class="btn btn-default"><i class="fa fa-align-left"></i></button> + <button type="button" class="btn btn-default"><i class="fa fa-align-center"></i></button> + <button type="button" class="btn btn-default"><i class="fa fa-align-right"></i></button> + </div> + </td> + <td> + <div class="btn-group"> + <button type="button" class="btn btn-default btn-flat"><i class="fa fa-align-left"></i></button> + <button type="button" class="btn btn-default btn-flat"><i class="fa fa-align-center"></i></button> + <button type="button" class="btn btn-default btn-flat"><i class="fa fa-align-right"></i></button> + </div> + </td> + <td> + <div class="btn-group"> + <button type="button" class="btn btn-default">1</button> + <button type="button" class="btn btn-default">2</button> + + <div class="btn-group"> + <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> + <span class="caret"></span> + </button> + <ul class="dropdown-menu"> + <li><a href="#">Dropdown link</a></li> + <li><a href="#">Dropdown link</a></li> + </ul> + </div> + </div> + </td> + </tr><!-- ./default --> + <!-- Info --> + <tr> + <td> + <div class="btn-group"> + <button type="button" class="btn btn-info">Left</button> + <button type="button" class="btn btn-info">Middle</button> + <button type="button" class="btn btn-info">Right</button> + </div> + </td> + <td> + <div class="btn-group"> + <button type="button" class="btn btn-info"><i class="fa fa-align-left"></i></button> + <button type="button" class="btn btn-info"><i class="fa fa-align-center"></i></button> + <button type="button" class="btn btn-info"><i class="fa fa-align-right"></i></button> + </div> + </td> + <td> + <div class="btn-group"> + <button type="button" class="btn btn-info btn-flat"><i class="fa fa-align-left"></i></button> + <button type="button" class="btn btn-info btn-flat"><i class="fa fa-align-center"></i></button> + <button type="button" class="btn btn-info btn-flat"><i class="fa fa-align-right"></i></button> + </div> + </td> + <td> + <div class="btn-group"> + <button type="button" class="btn btn-info">1</button> + <button type="button" class="btn btn-info">2</button> + + <div class="btn-group"> + <button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown"> + <span class="caret"></span> + </button> + <ul class="dropdown-menu"> + <li><a href="#">Dropdown link</a></li> + <li><a href="#">Dropdown link</a></li> + </ul> + </div> + </div> + </td> + </tr> <!-- /. info --> + <!-- /.danger --> + <tr> + <td> + <div class="btn-group"> + <button type="button" class="btn btn-danger">Left</button> + <button type="button" class="btn btn-danger">Middle</button> + <button type="button" class="btn btn-danger">Right</button> + </div> + </td> + <td> + <div class="btn-group"> + <button type="button" class="btn btn-danger"><i class="fa fa-align-left"></i></button> + <button type="button" class="btn btn-danger"><i class="fa fa-align-center"></i></button> + <button type="button" class="btn btn-danger"><i class="fa fa-align-right"></i></button> + </div> + </td> + <td> + <div class="btn-group"> + <button type="button" class="btn btn-danger btn-flat"><i class="fa fa-align-left"></i></button> + <button type="button" class="btn btn-danger btn-flat"><i class="fa fa-align-center"></i></button> + <button type="button" class="btn btn-danger btn-flat"><i class="fa fa-align-right"></i></button> + </div> + </td> + <td> + <div class="btn-group"> + <button type="button" class="btn btn-danger">1</button> + <button type="button" class="btn btn-danger">2</button> + + <div class="btn-group"> + <button type="button" class="btn btn-danger dropdown-toggle" data-toggle="dropdown"> + <span class="caret"></span> + </button> + <ul class="dropdown-menu"> + <li><a href="#">Dropdown link</a></li> + <li><a href="#">Dropdown link</a></li> + </ul> + </div> + </div> + </td> + </tr> <!-- /.danger --> + <!-- warning --> + <tr> + <td> + <div class="btn-group"> + <button type="button" class="btn btn-warning">Left</button> + <button type="button" class="btn btn-warning">Middle</button> + <button type="button" class="btn btn-warning">Right</button> + </div> + </td> + <td> + <div class="btn-group"> + <button type="button" class="btn btn-warning"><i class="fa fa-align-left"></i></button> + <button type="button" class="btn btn-warning"><i class="fa fa-align-center"></i></button> + <button type="button" class="btn btn-warning"><i class="fa fa-align-right"></i></button> + </div> + </td> + <td> + <div class="btn-group"> + <button type="button" class="btn btn-warning btn-flat"><i class="fa fa-align-left"></i></button> + <button type="button" class="btn btn-warning btn-flat"><i class="fa fa-align-center"></i></button> + <button type="button" class="btn btn-warning btn-flat"><i class="fa fa-align-right"></i></button> + </div> + </td> + <td> + <div class="btn-group"> + <button type="button" class="btn btn-warning">1</button> + <button type="button" class="btn btn-warning">2</button> + + <div class="btn-group"> + <button type="button" class="btn btn-warning dropdown-toggle" data-toggle="dropdown"> + <span class="caret"></span> + </button> + <ul class="dropdown-menu"> + <li><a href="#">Dropdown link</a></li> + <li><a href="#">Dropdown link</a></li> + </ul> + </div> + </div> + </td> + </tr> <!-- /.warning --> + <!-- success --> + <tr> + <td> + <div class="btn-group"> + <button type="button" class="btn btn-success">Left</button> + <button type="button" class="btn btn-success">Middle</button> + <button type="button" class="btn btn-success">Right</button> + </div> + </td> + <td> + <div class="btn-group"> + <button type="button" class="btn btn-success"><i class="fa fa-align-left"></i></button> + <button type="button" class="btn btn-success"><i class="fa fa-align-center"></i></button> + <button type="button" class="btn btn-success"><i class="fa fa-align-right"></i></button> + </div> + </td> + <td> + <div class="btn-group"> + <button type="button" class="btn btn-success btn-flat"><i class="fa fa-align-left"></i></button> + <button type="button" class="btn btn-success btn-flat"><i class="fa fa-align-center"></i></button> + <button type="button" class="btn btn-success btn-flat"><i class="fa fa-align-right"></i></button> + </div> + </td> + <td> + <div class="btn-group"> + <button type="button" class="btn btn-success">1</button> + <button type="button" class="btn btn-success">2</button> + + <div class="btn-group"> + <button type="button" class="btn btn-success dropdown-toggle" data-toggle="dropdown"> + <span class="caret"></span> + </button> + <ul class="dropdown-menu"> + <li><a href="#">Dropdown link</a></li> + <li><a href="#">Dropdown link</a></li> + </ul> + </div> + </div> + </td> + </tr> <!-- /.success --> + </table> + </div> + </div><!-- /.box --> + + <div class="box"> + <div class="box-header"> + <h3 class="box-title">Button Addon</h3> + </div> + <div class="box-body"> + <p>With dropdown</p> + <div class="input-group margin"> + <div class="input-group-btn"> + <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">Action <span class="fa fa-caret-down"></span></button> + <ul class="dropdown-menu"> + <li><a href="#">Action</a></li> + <li><a href="#">Another action</a></li> + <li><a href="#">Something else here</a></li> + <li class="divider"></li> + <li><a href="#">Separated link</a></li> + </ul> + </div><!-- /btn-group --> + <input type="text" class="form-control"> + </div><!-- /input-group --> + <p>Normal</p> + <div class="input-group margin"> + <div class="input-group-btn"> + <button type="button" class="btn btn-danger">Action</button> + </div><!-- /btn-group --> + <input type="text" class="form-control"> + </div><!-- /input-group --> + <p>Flat</p> + <div class="input-group margin"> + <input type="text" class="form-control"> + <span class="input-group-btn"> + <button class="btn btn-info btn-flat" type="button">Go!</button> + </span> + </div><!-- /input-group --> + </div><!-- /.box-body --> + </div><!-- /.box --> + <!-- split buttons box --> + <div class="box"> + <div class="box-header"> + <h3 class="box-title">Split buttons</h3> + </div> + <div class="box-body"> + <!-- Split button --> + <p>Normal split buttons:</p> + <div class="margin"> + <div class="btn-group"> + <button type="button" class="btn btn-default">Action</button> + <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> + <span class="caret"></span> + <span class="sr-only">Toggle Dropdown</span> + </button> + <ul class="dropdown-menu" role="menu"> + <li><a href="#">Action</a></li> + <li><a href="#">Another action</a></li> + <li><a href="#">Something else here</a></li> + <li class="divider"></li> + <li><a href="#">Separated link</a></li> + </ul> + </div> + <div class="btn-group"> + <button type="button" class="btn btn-info">Action</button> + <button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown"> + <span class="caret"></span> + <span class="sr-only">Toggle Dropdown</span> + </button> + <ul class="dropdown-menu" role="menu"> + <li><a href="#">Action</a></li> + <li><a href="#">Another action</a></li> + <li><a href="#">Something else here</a></li> + <li class="divider"></li> + <li><a href="#">Separated link</a></li> + </ul> + </div> + <div class="btn-group"> + <button type="button" class="btn btn-danger">Action</button> + <button type="button" class="btn btn-danger dropdown-toggle" data-toggle="dropdown"> + <span class="caret"></span> + <span class="sr-only">Toggle Dropdown</span> + </button> + <ul class="dropdown-menu" role="menu"> + <li><a href="#">Action</a></li> + <li><a href="#">Another action</a></li> + <li><a href="#">Something else here</a></li> + <li class="divider"></li> + <li><a href="#">Separated link</a></li> + </ul> + </div> + <div class="btn-group"> + <button type="button" class="btn btn-success">Action</button> + <button type="button" class="btn btn-success dropdown-toggle" data-toggle="dropdown"> + <span class="caret"></span> + <span class="sr-only">Toggle Dropdown</span> + </button> + <ul class="dropdown-menu" role="menu"> + <li><a href="#">Action</a></li> + <li><a href="#">Another action</a></li> + <li><a href="#">Something else here</a></li> + <li class="divider"></li> + <li><a href="#">Separated link</a></li> + </ul> + </div> + <div class="btn-group"> + <button type="button" class="btn btn-warning">Action</button> + <button type="button" class="btn btn-warning dropdown-toggle" data-toggle="dropdown"> + <span class="caret"></span> + <span class="sr-only">Toggle Dropdown</span> + </button> + <ul class="dropdown-menu" role="menu"> + <li><a href="#">Action</a></li> + <li><a href="#">Another action</a></li> + <li><a href="#">Something else here</a></li> + <li class="divider"></li> + <li><a href="#">Separated link</a></li> + </ul> + </div> + </div> + <!-- flat split buttons --> + <p>Flat split buttons:</p> + <div class="margin"> + <div class="btn-group"> + <button type="button" class="btn btn-default btn-flat">Action</button> + <button type="button" class="btn btn-default btn-flat dropdown-toggle" data-toggle="dropdown"> + <span class="caret"></span> + <span class="sr-only">Toggle Dropdown</span> + </button> + <ul class="dropdown-menu" role="menu"> + <li><a href="#">Action</a></li> + <li><a href="#">Another action</a></li> + <li><a href="#">Something else here</a></li> + <li class="divider"></li> + <li><a href="#">Separated link</a></li> + </ul> + </div> + <div class="btn-group"> + <button type="button" class="btn btn-info btn-flat">Action</button> + <button type="button" class="btn btn-info btn-flat dropdown-toggle" data-toggle="dropdown"> + <span class="caret"></span> + <span class="sr-only">Toggle Dropdown</span> + </button> + <ul class="dropdown-menu" role="menu"> + <li><a href="#">Action</a></li> + <li><a href="#">Another action</a></li> + <li><a href="#">Something else here</a></li> + <li class="divider"></li> + <li><a href="#">Separated link</a></li> + </ul> + </div> + <div class="btn-group"> + <button type="button" class="btn btn-danger btn-flat">Action</button> + <button type="button" class="btn btn-danger btn-flat dropdown-toggle" data-toggle="dropdown"> + <span class="caret"></span> + <span class="sr-only">Toggle Dropdown</span> + </button> + <ul class="dropdown-menu" role="menu"> + <li><a href="#">Action</a></li> + <li><a href="#">Another action</a></li> + <li><a href="#">Something else here</a></li> + <li class="divider"></li> + <li><a href="#">Separated link</a></li> + </ul> + </div> + <div class="btn-group"> + <button type="button" class="btn btn-success btn-flat">Action</button> + <button type="button" class="btn btn-success btn-flat dropdown-toggle" data-toggle="dropdown"> + <span class="caret"></span> + <span class="sr-only">Toggle Dropdown</span> + </button> + <ul class="dropdown-menu" role="menu"> + <li><a href="#">Action</a></li> + <li><a href="#">Another action</a></li> + <li><a href="#">Something else here</a></li> + <li class="divider"></li> + <li><a href="#">Separated link</a></li> + </ul> + </div> + <div class="btn-group"> + <button type="button" class="btn btn-warning btn-flat">Action</button> + <button type="button" class="btn btn-warning btn-flat dropdown-toggle" data-toggle="dropdown"> + <span class="caret"></span> + <span class="sr-only">Toggle Dropdown</span> + </button> + <ul class="dropdown-menu" role="menu"> + <li><a href="#">Action</a></li> + <li><a href="#">Another action</a></li> + <li><a href="#">Something else here</a></li> + <li class="divider"></li> + <li><a href="#">Separated link</a></li> + </ul> + </div> + </div> + </div><!-- /.box-body --> + </div><!-- end split buttons box --> + + <!-- social buttons --> + <div class="box"> + <div class="box-header"> + <h3 class="box-title">Social Buttons (By <a href="https://github.com/lipis/bootstrap-social">Lipis</a>)</h3> + </div> + <div class="box-body"> + <a class="btn btn-block btn-social btn-bitbucket"> + <i class="fa fa-bitbucket"></i> Sign in with Bitbucket + </a> + <a class="btn btn-block btn-social btn-dropbox"> + <i class="fa fa-dropbox"></i> Sign in with Dropbox + </a> + <a class="btn btn-block btn-social btn-facebook"> + <i class="fa fa-facebook"></i> Sign in with Facebook + </a> + <a class="btn btn-block btn-social btn-flickr"> + <i class="fa fa-flickr"></i> Sign in with Flickr + </a> + <a class="btn btn-block btn-social btn-foursquare"> + <i class="fa fa-foursquare"></i> Sign in with Foursquare + </a> + <a class="btn btn-block btn-social btn-github"> + <i class="fa fa-github"></i> Sign in with GitHub + </a> + <a class="btn btn-block btn-social btn-google"> + <i class="fa fa-google-plus"></i> Sign in with Google + </a> + <a class="btn btn-block btn-social btn-instagram"> + <i class="fa fa-instagram"></i> Sign in with Instagram + </a> + <a class="btn btn-block btn-social btn-linkedin"> + <i class="fa fa-linkedin"></i> Sign in with LinkedIn + </a> + <a class="btn btn-block btn-social btn-tumblr"> + <i class="fa fa-tumblr"></i> Sign in with Tumblr + </a> + <a class="btn btn-block btn-social btn-twitter"> + <i class="fa fa-twitter"></i> Sign in with Twitter + </a> + <a class="btn btn-block btn-social btn-vk"> + <i class="fa fa-vk"></i> Sign in with VK + </a> + <br> + <div class="text-center"> + <a class="btn btn-social-icon btn-bitbucket"><i class="fa fa-bitbucket"></i></a> + <a class="btn btn-social-icon btn-dropbox"><i class="fa fa-dropbox"></i></a> + <a class="btn btn-social-icon btn-facebook"><i class="fa fa-facebook"></i></a> + <a class="btn btn-social-icon btn-flickr"><i class="fa fa-flickr"></i></a> + <a class="btn btn-social-icon btn-foursquare"><i class="fa fa-foursquare"></i></a> + <a class="btn btn-social-icon btn-github"><i class="fa fa-github"></i></a> + <a class="btn btn-social-icon btn-google"><i class="fa fa-google-plus"></i></a> + <a class="btn btn-social-icon btn-instagram"><i class="fa fa-instagram"></i></a> + <a class="btn btn-social-icon btn-linkedin"><i class="fa fa-linkedin"></i></a> + <a class="btn btn-social-icon btn-tumblr"><i class="fa fa-tumblr"></i></a> + <a class="btn btn-social-icon btn-twitter"><i class="fa fa-twitter"></i></a> + <a class="btn btn-social-icon btn-vk"><i class="fa fa-vk"></i></a> + </div> + </div> + </div><!-- /.box --> + + </div><!-- /.col --> + <div class="col-md-6"> + <!-- Application buttons --> + <div class="box"> + <div class="box-header"> + <h3 class="box-title">Application Buttons</h3> + </div> + <div class="box-body"> + <p>Add the classes <code>.btn.btn-app</code> to an <code>&lt;a></code> tag to achieve the following:</p> + <a class="btn btn-app"> + <i class="fa fa-edit"></i> Edit + </a> + <a class="btn btn-app"> + <i class="fa fa-play"></i> Play + </a> + <a class="btn btn-app"> + <i class="fa fa-repeat"></i> Repeat + </a> + <a class="btn btn-app"> + <i class="fa fa-pause"></i> Pause + </a> + <a class="btn btn-app"> + <i class="fa fa-save"></i> Save + </a> + <a class="btn btn-app"> + <span class="badge bg-yellow">3</span> + <i class="fa fa-bullhorn"></i> Notifications + </a> + <a class="btn btn-app"> + <span class="badge bg-green">300</span> + <i class="fa fa-barcode"></i> Products + </a> + <a class="btn btn-app"> + <span class="badge bg-purple">891</span> + <i class="fa fa-users"></i> Users + </a> + <a class="btn btn-app"> + <span class="badge bg-teal">67</span> + <i class="fa fa-inbox"></i> Orders + </a> + <a class="btn btn-app"> + <span class="badge bg-aqua">12</span> + <i class="fa fa-envelope"></i> Inbox + </a> + <a class="btn btn-app"> + <span class="badge bg-red">531</span> + <i class="fa fa-heart-o"></i> Likes + </a> + </div><!-- /.box-body --> + </div><!-- /.box --> + <!-- Various colors --> + <div class="box"> + <div class="box-header"> + <h3 class="box-title">Different colors</h3> + </div> + <div class="box-body"> + <p>Mix and match with various background colors. Use base class <code>.btn</code> and add any available <code>.bg-*</code> class</p> + <!-- You may notice a .margin class added + here but that's only to make the content + display correctly without having to use a table--> + <p> + <button class="btn bg-maroon btn-flat margin">.btn.bg-maroon.btn-flat</button> + <button class="btn bg-purple btn-flat margin">.btn.bg-purple.btn-flat</button> + <button class="btn bg-navy btn-flat margin">.btn.bg-navy.btn-flat</button> + <button class="btn bg-orange btn-flat margin">.btn.bg-orange.btn-flat</button> + <button class="btn bg-olive btn-flat margin">.btn.bg-olive.btn-flat</button> + </p> + + <p> + <button class="btn bg-maroon margin">.btn.bg-maroon</button> + <button class="btn bg-purple margin">.btn.bg-purple</button> + <button class="btn bg-navy margin">.btn.bg-navy</button> + <button class="btn bg-orange margin">.btn.bg-orange</button> + <button class="btn bg-olive margin">.btn.bg-olive</button> + </p> + </div> + </div><!-- /.box --> + + <!-- Vertical grouping --> + <div class="box"> + <div class="box-header"> + <h3 class="box-title">Vertical Button Group</h3> + </div> + <div class="box-body table-responsive pad"> + + <p> + Vertical button groups are easy to create with bootstrap. Just add your buttons + inside <code>&lt;div class="btn-group-vertical"&gt;&lt;/div&gt;</code> + </p> + + <table class="table table-bordered"> + <tr> + <th>Button</th> + <th>Icons</th> + <th>Flat</th> + <th>Dropdown</th> + </tr> + <!-- Default --> + <tr> + <td> + <div class="btn-group-vertical"> + <button type="button" class="btn btn-default">Top</button> + <button type="button" class="btn btn-default">Middle</button> + <button type="button" class="btn btn-default">Bottom</button> + </div> + </td> + <td> + <div class="btn-group-vertical"> + <button type="button" class="btn btn-default"><i class="fa fa-align-left"></i></button> + <button type="button" class="btn btn-default"><i class="fa fa-align-center"></i></button> + <button type="button" class="btn btn-default"><i class="fa fa-align-right"></i></button> + </div> + </td> + <td> + <div class="btn-group-vertical"> + <button type="button" class="btn btn-default btn-flat"><i class="fa fa-align-left"></i></button> + <button type="button" class="btn btn-default btn-flat"><i class="fa fa-align-center"></i></button> + <button type="button" class="btn btn-default btn-flat"><i class="fa fa-align-right"></i></button> + </div> + </td> + <td> + <div class="btn-group-vertical"> + <button type="button" class="btn btn-default">1</button> + <button type="button" class="btn btn-default">2</button> + + <div class="btn-group"> + <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> + <span class="caret"></span> + </button> + <ul class="dropdown-menu"> + <li><a href="#">Dropdown link</a></li> + <li><a href="#">Dropdown link</a></li> + </ul> + </div> + </div> + </td> + </tr><!-- ./default --> + <!-- Info --> + <tr> + <td> + <div class="btn-group-vertical"> + <button type="button" class="btn btn-info">Top</button> + <button type="button" class="btn btn-info">Middle</button> + <button type="button" class="btn btn-info">Bottom</button> + </div> + </td> + <td> + <div class="btn-group-vertical"> + <button type="button" class="btn btn-info"><i class="fa fa-align-left"></i></button> + <button type="button" class="btn btn-info"><i class="fa fa-align-center"></i></button> + <button type="button" class="btn btn-info"><i class="fa fa-align-right"></i></button> + </div> + </td> + <td> + <div class="btn-group-vertical"> + <button type="button" class="btn btn-info btn-flat"><i class="fa fa-align-left"></i></button> + <button type="button" class="btn btn-info btn-flat"><i class="fa fa-align-center"></i></button> + <button type="button" class="btn btn-info btn-flat"><i class="fa fa-align-right"></i></button> + </div> + </td> + <td> + <div class="btn-group-vertical"> + <button type="button" class="btn btn-info">1</button> + <button type="button" class="btn btn-info">2</button> + + <div class="btn-group"> + <button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown"> + <span class="caret"></span> + </button> + <ul class="dropdown-menu"> + <li><a href="#">Dropdown link</a></li> + <li><a href="#">Dropdown link</a></li> + </ul> + </div> + </div> + </td> + </tr> <!-- /. info --> + <!-- /.danger --> + <tr> + <td> + <div class="btn-group-vertical"> + <button type="button" class="btn btn-danger">Top</button> + <button type="button" class="btn btn-danger">Middle</button> + <button type="button" class="btn btn-danger">Bottom</button> + </div> + </td> + <td> + <div class="btn-group-vertical"> + <button type="button" class="btn btn-danger"><i class="fa fa-align-left"></i></button> + <button type="button" class="btn btn-danger"><i class="fa fa-align-center"></i></button> + <button type="button" class="btn btn-danger"><i class="fa fa-align-right"></i></button> + </div> + </td> + <td> + <div class="btn-group-vertical"> + <button type="button" class="btn btn-danger btn-flat"><i class="fa fa-align-left"></i></button> + <button type="button" class="btn btn-danger btn-flat"><i class="fa fa-align-center"></i></button> + <button type="button" class="btn btn-danger btn-flat"><i class="fa fa-align-right"></i></button> + </div> + </td> + <td> + <div class="btn-group-vertical"> + <button type="button" class="btn btn-danger">1</button> + <button type="button" class="btn btn-danger">2</button> + + <div class="btn-group"> + <button type="button" class="btn btn-danger dropdown-toggle" data-toggle="dropdown"> + <span class="caret"></span> + </button> + <ul class="dropdown-menu"> + <li><a href="#">Dropdown link</a></li> + <li><a href="#">Dropdown link</a></li> + </ul> + </div> + </div> + </td> + </tr> <!-- /.danger --> + <!-- warning --> + <tr> + <td> + <div class="btn-group-vertical"> + <button type="button" class="btn btn-warning">Top</button> + <button type="button" class="btn btn-warning">Middle</button> + <button type="button" class="btn btn-warning">Bottom</button> + </div> + </td> + <td> + <div class="btn-group-vertical"> + <button type="button" class="btn btn-warning"><i class="fa fa-align-left"></i></button> + <button type="button" class="btn btn-warning"><i class="fa fa-align-center"></i></button> + <button type="button" class="btn btn-warning"><i class="fa fa-align-right"></i></button> + </div> + </td> + <td> + <div class="btn-group-vertical"> + <button type="button" class="btn btn-warning btn-flat"><i class="fa fa-align-left"></i></button> + <button type="button" class="btn btn-warning btn-flat"><i class="fa fa-align-center"></i></button> + <button type="button" class="btn btn-warning btn-flat"><i class="fa fa-align-right"></i></button> + </div> + </td> + <td> + <div class="btn-group-vertical"> + <button type="button" class="btn btn-warning">1</button> + <button type="button" class="btn btn-warning">2</button> + + <div class="btn-group"> + <button type="button" class="btn btn-warning dropdown-toggle" data-toggle="dropdown"> + <span class="caret"></span> + </button> + <ul class="dropdown-menu"> + <li><a href="#">Dropdown link</a></li> + <li><a href="#">Dropdown link</a></li> + </ul> + </div> + </div> + </td> + </tr> <!-- /.warning --> + <!-- success --> + <tr> + <td> + <div class="btn-group-vertical"> + <button type="button" class="btn btn-success">Top</button> + <button type="button" class="btn btn-success">Middle</button> + <button type="button" class="btn btn-success">Bottom</button> + </div> + </td> + <td> + <div class="btn-group-vertical"> + <button type="button" class="btn btn-success"><i class="fa fa-align-left"></i></button> + <button type="button" class="btn btn-success"><i class="fa fa-align-center"></i></button> + <button type="button" class="btn btn-success"><i class="fa fa-align-right"></i></button> + </div> + </td> + <td> + <div class="btn-group-vertical"> + <button type="button" class="btn btn-success btn-flat"><i class="fa fa-align-left"></i></button> + <button type="button" class="btn btn-success btn-flat"><i class="fa fa-align-center"></i></button> + <button type="button" class="btn btn-success btn-flat"><i class="fa fa-align-right"></i></button> + </div> + </td> + <td> + <div class="btn-group-vertical"> + <button type="button" class="btn btn-success">1</button> + <button type="button" class="btn btn-success">2</button> + + <div class="btn-group"> + <button type="button" class="btn btn-success dropdown-toggle" data-toggle="dropdown"> + <span class="caret"></span> + </button> + <ul class="dropdown-menu"> + <li><a href="#">Dropdown link</a></li> + <li><a href="#">Dropdown link</a></li> + </ul> + </div> + </div> + </td> + </tr> <!-- /.success --> + </table> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /. row --> + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + </body> +</html> diff --git a/theme/bootstrap/pages/UI/general.html b/theme/bootstrap/pages/UI/general.html new file mode 100644 index 0000000..53051de --- /dev/null +++ b/theme/bootstrap/pages/UI/general.html @@ -0,0 +1,1395 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | General UI</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + <style> + .color-palette { + height: 35px; + line-height: 35px; + text-align: center; + } + .color-palette-set { + margin-bottom: 15px; + } + .color-palette span { + display: none; + font-size: 12px; + } + .color-palette:hover span { + display: block; + } + .color-palette-box h4 { + position: absolute; + top: 100%; + left: 25px; + margin-top: -40px; + color: rgba(255, 255, 255, 0.8); + font-size: 12px; + display: block; + z-index: 7; + } + </style> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + AdminLTE Design Team + <small><i class="fa fa-clock-o"></i> 2 hours</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Developers + <small><i class="fa fa-clock-o"></i> Today</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Sales Department + <small><i class="fa fa-clock-o"></i> Yesterday</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Reviewers + <small><i class="fa fa-clock-o"></i> 2 days</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-users text-red"></i> 5 new members joined + </a> + </li> + + <li> + <a href="#"> + <i class="fa fa-shopping-cart text-green"></i> 25 sales made + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-user text-red"></i> You changed your username + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress progress-xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Create a nice theme + <small class="pull-right">40%</small> + </h3> + <div class="progress progress-xs"> + <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">40% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Some task I need to do + <small class="pull-right">60%</small> + </h3> + <div class="progress progress-xs"> + <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">60% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Make beautiful transitions + <small class="pull-right">80%</small> + </h3> + <div class="progress progress-xs"> + <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="../charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="../charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="../charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li class="active"><a href="general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="../examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="../examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="../examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="../examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="../examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="../examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="../examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + General UI + <small>Preview of UI elements</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">UI</a></li> + <li class="active">General</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <!-- COLOR PALETTE --> + <div class="box box-default color-palette-box"> + <div class="box-header with-border"> + <h3 class="box-title"><i class="fa fa-tag"></i> Color Palette</h3> + </div> + <div class="box-body"> + <div class="row"> + <div class="col-sm-4 col-md-2"> + <h4 class="text-center">Primary</h4> + <div class="color-palette-set"> + <div class="bg-light-blue disabled color-palette"><span>Disabled</span></div> + <div class="bg-light-blue color-palette"><span>#3c8dbc</span></div> + <div class="bg-light-blue-active color-palette"><span>Active</span></div> + </div> + </div><!-- /.col --> + <div class="col-sm-4 col-md-2"> + <h4 class="text-center">Info</h4> + <div class="color-palette-set"> + <div class="bg-aqua disabled color-palette"><span>Disabled</span></div> + <div class="bg-aqua color-palette"><span>#00c0ef</span></div> + <div class="bg-aqua-active color-palette"><span>Active</span></div> + </div> + </div><!-- /.col --> + <div class="col-sm-4 col-md-2"> + <h4 class="text-center">Success</h4> + <div class="color-palette-set"> + <div class="bg-green disabled color-palette"><span>Disabled</span></div> + <div class="bg-green color-palette"><span>#00a65a</span></div> + <div class="bg-green-active color-palette"><span>Active</span></div> + </div> + </div><!-- /.col --> + <div class="col-sm-4 col-md-2"> + <h4 class="text-center">Warning</h4> + <div class="color-palette-set"> + <div class="bg-yellow disabled color-palette"><span>Disabled</span></div> + <div class="bg-yellow color-palette"><span>#f39c12</span></div> + <div class="bg-yellow-active color-palette"><span>Active</span></div> + </div> + </div><!-- /.col --> + <div class="col-sm-4 col-md-2"> + <h4 class="text-center">Danger</h4> + <div class="color-palette-set"> + <div class="bg-red disabled color-palette"><span>Disabled</span></div> + <div class="bg-red color-palette"><span>#f56954</span></div> + <div class="bg-red-active color-palette"><span>Active</span></div> + </div> + </div><!-- /.col --> + <div class="col-sm-4 col-md-2"> + <h4 class="text-center">Gray</h4> + <div class="color-palette-set"> + <div class="bg-gray disabled color-palette"><span>Disabled</span></div> + <div class="bg-gray color-palette"><span>#d2d6de</span></div> + <div class="bg-gray-active color-palette"><span>Active</span></div> + </div> + </div><!-- /.col --> + </div><!-- /.row --> + <div class="row"> + <div class="col-sm-4 col-md-2"> + <h4 class="text-center">Navy</h4> + <div class="color-palette-set"> + <div class="bg-navy disabled color-palette"><span>Disabled</span></div> + <div class="bg-navy color-palette"><span>#001F3F</span></div> + <div class="bg-navy-active color-palette"><span>Active</span></div> + </div> + </div><!-- /.col --> + <div class="col-sm-4 col-md-2"> + <h4 class="text-center">Teal</h4> + <div class="color-palette-set"> + <div class="bg-teal disabled color-palette"><span>Disabled</span></div> + <div class="bg-teal color-palette"><span>#39CCCC</span></div> + <div class="bg-teal-active color-palette"><span>Active</span></div> + </div> + </div><!-- /.col --> + <div class="col-sm-4 col-md-2"> + <h4 class="text-center">Purple</h4> + <div class="color-palette-set"> + <div class="bg-purple disabled color-palette"><span>Disabled</span></div> + <div class="bg-purple color-palette"><span>#605ca8</span></div> + <div class="bg-purple-active color-palette"><span>Active</span></div> + </div> + </div><!-- /.col --> + <div class="col-sm-4 col-md-2"> + <h4 class="text-center">Orange</h4> + <div class="color-palette-set"> + <div class="bg-orange disabled color-palette"><span>Disabled</span></div> + <div class="bg-orange color-palette"><span>#ff851b</span></div> + <div class="bg-orange-active color-palette"><span>Active</span></div> + </div> + </div><!-- /.col --> + <div class="col-sm-4 col-md-2"> + <h4 class="text-center">Maroon</h4> + <div class="color-palette-set"> + <div class="bg-maroon disabled color-palette"><span>Disabled</span></div> + <div class="bg-maroon color-palette"><span>#D81B60</span></div> + <div class="bg-maroon-active color-palette"><span>Active</span></div> + </div> + </div><!-- /.col --> + <div class="col-sm-4 col-md-2"> + <h4 class="text-center">Black</h4> + <div class="color-palette-set"> + <div class="bg-black disabled color-palette"><span>Disabled</span></div> + <div class="bg-black color-palette"><span>#111111</span></div> + <div class="bg-black-active color-palette"><span>Active</span></div> + </div> + </div><!-- /.col --> + </div><!-- /.row --> + </div><!-- /.box-body --> + </div><!-- /.box --> + <!-- START ALERTS AND CALLOUTS --> + <h2 class="page-header">Alerts and Callouts</h2> + <div class="row"> + <div class="col-md-6"> + <div class="box box-default"> + <div class="box-header with-border"> + <i class="fa fa-warning"></i> + <h3 class="box-title">Alerts</h3> + </div><!-- /.box-header --> + <div class="box-body"> + <div class="alert alert-danger alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4><i class="icon fa fa-ban"></i> Alert!</h4> + Danger alert preview. This alert is dismissable. A wonderful serenity has taken possession of my entire soul, like these sweet mornings of spring which I enjoy with my whole heart. + </div> + <div class="alert alert-info alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4><i class="icon fa fa-info"></i> Alert!</h4> + Info alert preview. This alert is dismissable. + </div> + <div class="alert alert-warning alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4><i class="icon fa fa-warning"></i> Alert!</h4> + Warning alert preview. This alert is dismissable. + </div> + <div class="alert alert-success alert-dismissable"> + <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> + <h4> <i class="icon fa fa-check"></i> Alert!</h4> + Success alert preview. This alert is dismissable. + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + + <div class="col-md-6"> + <div class="box box-default"> + <div class="box-header with-border"> + <i class="fa fa-bullhorn"></i> + <h3 class="box-title">Callouts</h3> + </div><!-- /.box-header --> + <div class="box-body"> + <div class="callout callout-danger"> + <h4>I am a danger callout!</h4> + <p>There is a problem that we need to fix. A wonderful serenity has taken possession of my entire soul, like these sweet mornings of spring which I enjoy with my whole heart.</p> + </div> + <div class="callout callout-info"> + <h4>I am an info callout!</h4> + <p>Follow the steps to continue to payment.</p> + </div> + <div class="callout callout-warning"> + <h4>I am a warning callout!</h4> + <p>This is a yellow callout.</p> + </div> + <div class="callout callout-success"> + <h4>I am a success callout!</h4> + <p>This is a green callout.</p> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div> <!-- /.row --> + <!-- END ALERTS AND CALLOUTS --> + <!-- START CUSTOM TABS --> + <h2 class="page-header">AdminLTE Custom Tabs</h2> + <div class="row"> + <div class="col-md-6"> + <!-- Custom Tabs --> + <div class="nav-tabs-custom"> + <ul class="nav nav-tabs"> + <li class="active"><a href="#tab_1" data-toggle="tab">Tab 1</a></li> + <li><a href="#tab_2" data-toggle="tab">Tab 2</a></li> + <li><a href="#tab_3" data-toggle="tab">Tab 3</a></li> + <li class="dropdown"> + <a class="dropdown-toggle" data-toggle="dropdown" href="#"> + Dropdown <span class="caret"></span> + </a> + <ul class="dropdown-menu"> + <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Action</a></li> + <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Another action</a></li> + <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Something else here</a></li> + <li role="presentation" class="divider"></li> + <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Separated link</a></li> + </ul> + </li> + <li class="pull-right"><a href="#" class="text-muted"><i class="fa fa-gear"></i></a></li> + </ul> + <div class="tab-content"> + <div class="tab-pane active" id="tab_1"> + <b>How to use:</b> + <p>Exactly like the original bootstrap tabs except you should use + the custom wrapper <code>.nav-tabs-custom</code> to achieve this style.</p> + A wonderful serenity has taken possession of my entire soul, + like these sweet mornings of spring which I enjoy with my whole heart. + I am alone, and feel the charm of existence in this spot, + which was created for the bliss of souls like mine. I am so happy, + my dear friend, so absorbed in the exquisite sense of mere tranquil existence, + that I neglect my talents. I should be incapable of drawing a single stroke + at the present moment; and yet I feel that I never was a greater artist than now. + </div><!-- /.tab-pane --> + <div class="tab-pane" id="tab_2"> + The European languages are members of the same family. Their separate existence is a myth. + For science, music, sport, etc, Europe uses the same vocabulary. The languages only differ + in their grammar, their pronunciation and their most common words. Everyone realizes why a + new common language would be desirable: one could refuse to pay expensive translators. To + achieve this, it would be necessary to have uniform grammar, pronunciation and more common + words. If several languages coalesce, the grammar of the resulting language is more simple + and regular than that of the individual languages. + </div><!-- /.tab-pane --> + <div class="tab-pane" id="tab_3"> + Lorem Ipsum is simply dummy text of the printing and typesetting industry. + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, + when an unknown printer took a galley of type and scrambled it to make a type specimen book. + It has survived not only five centuries, but also the leap into electronic typesetting, + remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset + sheets containing Lorem Ipsum passages, and more recently with desktop publishing software + like Aldus PageMaker including versions of Lorem Ipsum. + </div><!-- /.tab-pane --> + </div><!-- /.tab-content --> + </div><!-- nav-tabs-custom --> + </div><!-- /.col --> + + <div class="col-md-6"> + <!-- Custom Tabs (Pulled to the right) --> + <div class="nav-tabs-custom"> + <ul class="nav nav-tabs pull-right"> + <li class="active"><a href="#tab_1-1" data-toggle="tab">Tab 1</a></li> + <li><a href="#tab_2-2" data-toggle="tab">Tab 2</a></li> + <li><a href="#tab_3-2" data-toggle="tab">Tab 3</a></li> + <li class="dropdown"> + <a class="dropdown-toggle" data-toggle="dropdown" href="#"> + Dropdown <span class="caret"></span> + </a> + <ul class="dropdown-menu"> + <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Action</a></li> + <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Another action</a></li> + <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Something else here</a></li> + <li role="presentation" class="divider"></li> + <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Separated link</a></li> + </ul> + </li> + <li class="pull-left header"><i class="fa fa-th"></i> Custom Tabs</li> + </ul> + <div class="tab-content"> + <div class="tab-pane active" id="tab_1-1"> + <b>How to use:</b> + <p>Exactly like the original bootstrap tabs except you should use + the custom wrapper <code>.nav-tabs-custom</code> to achieve this style.</p> + A wonderful serenity has taken possession of my entire soul, + like these sweet mornings of spring which I enjoy with my whole heart. + I am alone, and feel the charm of existence in this spot, + which was created for the bliss of souls like mine. I am so happy, + my dear friend, so absorbed in the exquisite sense of mere tranquil existence, + that I neglect my talents. I should be incapable of drawing a single stroke + at the present moment; and yet I feel that I never was a greater artist than now. + </div><!-- /.tab-pane --> + <div class="tab-pane" id="tab_2-2"> + The European languages are members of the same family. Their separate existence is a myth. + For science, music, sport, etc, Europe uses the same vocabulary. The languages only differ + in their grammar, their pronunciation and their most common words. Everyone realizes why a + new common language would be desirable: one could refuse to pay expensive translators. To + achieve this, it would be necessary to have uniform grammar, pronunciation and more common + words. If several languages coalesce, the grammar of the resulting language is more simple + and regular than that of the individual languages. + </div><!-- /.tab-pane --> + <div class="tab-pane" id="tab_3-2"> + Lorem Ipsum is simply dummy text of the printing and typesetting industry. + Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, + when an unknown printer took a galley of type and scrambled it to make a type specimen book. + It has survived not only five centuries, but also the leap into electronic typesetting, + remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset + sheets containing Lorem Ipsum passages, and more recently with desktop publishing software + like Aldus PageMaker including versions of Lorem Ipsum. + </div><!-- /.tab-pane --> + </div><!-- /.tab-content --> + </div><!-- nav-tabs-custom --> + </div><!-- /.col --> + </div> <!-- /.row --> + <!-- END CUSTOM TABS --> + <!-- START PROGRESS BARS --> + <h2 class="page-header">Progress Bars</h2> + <div class="row"> + <div class="col-md-6"> + <div class="box box-solid"> + <div class="box-header with-border"> + <h3 class="box-title">Progress Bars Different Sizes</h3> + </div><!-- /.box-header --> + <div class="box-body"> + <p><code>.progress</code></p> + <div class="progress"> + <div class="progress-bar progress-bar-primary progress-bar-striped" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width: 40%"> + <span class="sr-only">40% Complete (success)</span> + </div> + </div> + <p>Class: <code>.sm</code></p> + <div class="progress progress-sm active"> + <div class="progress-bar progress-bar-success progress-bar-striped" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100" style="width: 20%"> + <span class="sr-only">20% Complete</span> + </div> + </div> + <p>Class: <code>.xs</code></p> + <div class="progress progress-xs"> + <div class="progress-bar progress-bar-warning progress-bar-striped" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%"> + <span class="sr-only">60% Complete (warning)</span> + </div> + </div> + <p>Class: <code>.xxs</code></p> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger progress-bar-striped" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%"> + <span class="sr-only">60% Complete (warning)</span> + </div> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col (left) --> + <div class="col-md-6"> + <div class="box box-solid"> + <div class="box-header with-border"> + <h3 class="box-title">Progress bars</h3> + </div><!-- /.box-header --> + <div class="box-body"> + <div class="progress"> + <div class="progress-bar progress-bar-green" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width: 40%"> + <span class="sr-only">40% Complete (success)</span> + </div> + </div> + <div class="progress"> + <div class="progress-bar progress-bar-aqua" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100" style="width: 20%"> + <span class="sr-only">20% Complete</span> + </div> + </div> + <div class="progress"> + <div class="progress-bar progress-bar-yellow" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%"> + <span class="sr-only">60% Complete (warning)</span> + </div> + </div> + <div class="progress"> + <div class="progress-bar progress-bar-red" role="progressbar" aria-valuenow="80" aria-valuemin="0" aria-valuemax="100" style="width: 80%"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col (right) --> + </div><!-- /.row --> + <div class="row"> + <div class="col-md-6"> + <div class="box box-solid"> + <div class="box-header with-border"> + <h3 class="box-title">Vertical Progress Bars Different Sizes</h3> + </div><!-- /.box-header --> + <div class="box-body text-center"> + <p>By adding the class <code>.vertical</code> and <code>.progress-sm</code>, <code>.progress-xs</code> or <code>.progress-xxs</code> we achieve:</p> + <div class="progress vertical active"> + <div class="progress-bar progress-bar-primary progress-bar-striped" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="height: 40%"> + <span class="sr-only">40%</span> + </div> + </div> + <div class="progress vertical progress-sm"> + <div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100" style="height: 100%"> + <span class="sr-only">100%</span> + </div> + </div> + <div class="progress vertical progress-xs"> + <div class="progress-bar progress-bar-warning progress-bar-striped" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="height: 60%"> + <span class="sr-only">60%</span> + </div> + </div> + <div class="progress vertical progress-xxs"> + <div class="progress-bar progress-bar-info progress-bar-striped" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="height: 60%"> + <span class="sr-only">60%</span> + </div> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col (left) --> + <div class="col-md-6"> + <div class="box box-solid"> + <div class="box-header with-border"> + <h3 class="box-title">Vertical Progress bars</h3> + </div><!-- /.box-header --> + <div class="box-body text-center"> + <p>By adding the class <code>.vertical</code> we achieve:</p> + <div class="progress vertical"> + <div class="progress-bar progress-bar-green" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="height: 40%"> + <span class="sr-only">40%</span> + </div> + </div> + <div class="progress vertical"> + <div class="progress-bar progress-bar-aqua" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100" style="height: 20%"> + <span class="sr-only">20%</span> + </div> + </div> + <div class="progress vertical"> + <div class="progress-bar progress-bar-yellow" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="height: 60%"> + <span class="sr-only">60%</span> + </div> + </div> + <div class="progress vertical"> + <div class="progress-bar progress-bar-red" role="progressbar" aria-valuenow="80" aria-valuemin="0" aria-valuemax="100" style="height: 80%"> + <span class="sr-only">80%</span> + </div> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col (right) --> + </div><!-- /.row --> + <!-- END PROGRESS BARS --> + + <!-- START ACCORDION & CAROUSEL--> + <h2 class="page-header">Bootstrap Accordion & Carousel</h2> + <div class="row"> + <div class="col-md-6"> + <div class="box box-solid"> + <div class="box-header with-border"> + <h3 class="box-title">Collapsible Accordion</h3> + </div><!-- /.box-header --> + <div class="box-body"> + <div class="box-group" id="accordion"> + <!-- we are adding the .panel class so bootstrap.js collapse plugin detects it --> + <div class="panel box box-primary"> + <div class="box-header with-border"> + <h4 class="box-title"> + <a data-toggle="collapse" data-parent="#accordion" href="#collapseOne"> + Collapsible Group Item #1 + </a> + </h4> + </div> + <div id="collapseOne" class="panel-collapse collapse in"> + <div class="box-body"> + Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. + </div> + </div> + </div> + <div class="panel box box-danger"> + <div class="box-header with-border"> + <h4 class="box-title"> + <a data-toggle="collapse" data-parent="#accordion" href="#collapseTwo"> + Collapsible Group Danger + </a> + </h4> + </div> + <div id="collapseTwo" class="panel-collapse collapse"> + <div class="box-body"> + Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. + </div> + </div> + </div> + <div class="panel box box-success"> + <div class="box-header with-border"> + <h4 class="box-title"> + <a data-toggle="collapse" data-parent="#accordion" href="#collapseThree"> + Collapsible Group Success + </a> + </h4> + </div> + <div id="collapseThree" class="panel-collapse collapse"> + <div class="box-body"> + Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS. + </div> + </div> + </div> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + <div class="col-md-6"> + <div class="box box-solid"> + <div class="box-header with-border"> + <h3 class="box-title">Carousel</h3> + </div><!-- /.box-header --> + <div class="box-body"> + <div id="carousel-example-generic" class="carousel slide" data-ride="carousel"> + <ol class="carousel-indicators"> + <li data-target="#carousel-example-generic" data-slide-to="0" class="active"></li> + <li data-target="#carousel-example-generic" data-slide-to="1" class=""></li> + <li data-target="#carousel-example-generic" data-slide-to="2" class=""></li> + </ol> + <div class="carousel-inner"> + <div class="item active"> + <img src="http://placehold.it/900x500/39CCCC/ffffff&text=I+Love+Bootstrap" alt="First slide"> + <div class="carousel-caption"> + First Slide + </div> + </div> + <div class="item"> + <img src="http://placehold.it/900x500/3c8dbc/ffffff&text=I+Love+Bootstrap" alt="Second slide"> + <div class="carousel-caption"> + Second Slide + </div> + </div> + <div class="item"> + <img src="http://placehold.it/900x500/f39c12/ffffff&text=I+Love+Bootstrap" alt="Third slide"> + <div class="carousel-caption"> + Third Slide + </div> + </div> + </div> + <a class="left carousel-control" href="#carousel-example-generic" data-slide="prev"> + <span class="fa fa-angle-left"></span> + </a> + <a class="right carousel-control" href="#carousel-example-generic" data-slide="next"> + <span class="fa fa-angle-right"></span> + </a> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + <!-- END ACCORDION & CAROUSEL--> + + <!-- START TYPOGRAPHY --> + <h2 class="page-header">Typography</h2> + <div class="row"> + <div class="col-md-6"> + <div class="box box-solid"> + <div class="box-header with-border"> + <i class="fa fa-text-width"></i> + <h3 class="box-title">Headlines</h3> + </div><!-- /.box-header --> + <div class="box-body"> + <h1>h1. Bootstrap heading</h1> + <h2>h2. Bootstrap heading</h2> + <h3>h3. Bootstrap heading</h3> + <h4>h4. Bootstrap heading</h4> + <h5>h5. Bootstrap heading</h5> + <h6>h6. Bootstrap heading</h6> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- ./col --> + <div class="col-md-6"> + <div class="box box-solid"> + <div class="box-header with-border"> + <i class="fa fa-text-width"></i> + <h3 class="box-title">Text Emphasis</h3> + </div><!-- /.box-header --> + <div class="box-body"> + <p class="lead">Lead to emphasize importance</p> + <p class="text-green">Text green to emphasize success</p> + <p class="text-aqua">Text aqua to emphasize info</p> + <p class="text-light-blue">Text light blue to emphasize info (2)</p> + <p class="text-red">Text red to emphasize danger</p> + <p class="text-yellow">Text yellow to emphasize warning</p> + <p class="text-muted">Text muted to emphasize general</p> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- ./col --> + </div><!-- /.row --> + + <div class="row"> + <div class="col-md-6"> + <div class="box box-solid"> + <div class="box-header with-border"> + <i class="fa fa-text-width"></i> + <h3 class="box-title">Block Quotes</h3> + </div><!-- /.box-header --> + <div class="box-body"> + <blockquote> + <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.</p> + <small>Someone famous in <cite title="Source Title">Source Title</cite></small> + </blockquote> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- ./col --> + <div class="col-md-6"> + <div class="box box-solid"> + <div class="box-header with-border"> + <i class="fa fa-text-width"></i> + <h3 class="box-title">Block Quotes Pulled Right</h3> + </div><!-- /.box-header --> + <div class="box-body clearfix"> + <blockquote class="pull-right"> + <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.</p> + <small>Someone famous in <cite title="Source Title">Source Title</cite></small> + </blockquote> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- ./col --> + </div><!-- /.row --> + + <div class="row"> + <div class="col-md-4"> + <div class="box box-solid"> + <div class="box-header with-border"> + <i class="fa fa-text-width"></i> + <h3 class="box-title">Unordered List</h3> + </div><!-- /.box-header --> + <div class="box-body"> + <ul> + <li>Lorem ipsum dolor sit amet</li> + <li>Consectetur adipiscing elit</li> + <li>Integer molestie lorem at massa</li> + <li>Facilisis in pretium nisl aliquet</li> + <li>Nulla volutpat aliquam velit + <ul> + <li>Phasellus iaculis neque</li> + <li>Purus sodales ultricies</li> + <li>Vestibulum laoreet porttitor sem</li> + <li>Ac tristique libero volutpat at</li> + </ul> + </li> + <li>Faucibus porta lacus fringilla vel</li> + <li>Aenean sit amet erat nunc</li> + <li>Eget porttitor lorem</li> + </ul> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- ./col --> + <div class="col-md-4"> + <div class="box box-solid"> + <div class="box-header with-border"> + <i class="fa fa-text-width"></i> + <h3 class="box-title">Ordered Lists</h3> + </div><!-- /.box-header --> + <div class="box-body"> + <ol> + <li>Lorem ipsum dolor sit amet</li> + <li>Consectetur adipiscing elit</li> + <li>Integer molestie lorem at massa</li> + <li>Facilisis in pretium nisl aliquet</li> + <li>Nulla volutpat aliquam velit + <ol> + <li>Phasellus iaculis neque</li> + <li>Purus sodales ultricies</li> + <li>Vestibulum laoreet porttitor sem</li> + <li>Ac tristique libero volutpat at</li> + </ol> + </li> + <li>Faucibus porta lacus fringilla vel</li> + <li>Aenean sit amet erat nunc</li> + <li>Eget porttitor lorem</li> + </ol> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- ./col --> + <div class="col-md-4"> + <div class="box box-solid"> + <div class="box-header with-border"> + <i class="fa fa-text-width"></i> + <h3 class="box-title">Unstyled List</h3> + </div><!-- /.box-header --> + <div class="box-body"> + <ul class="list-unstyled"> + <li>Lorem ipsum dolor sit amet</li> + <li>Consectetur adipiscing elit</li> + <li>Integer molestie lorem at massa</li> + <li>Facilisis in pretium nisl aliquet</li> + <li>Nulla volutpat aliquam velit + <ul> + <li>Phasellus iaculis neque</li> + <li>Purus sodales ultricies</li> + <li>Vestibulum laoreet porttitor sem</li> + <li>Ac tristique libero volutpat at</li> + </ul> + </li> + <li>Faucibus porta lacus fringilla vel</li> + <li>Aenean sit amet erat nunc</li> + <li>Eget porttitor lorem</li> + </ul> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- ./col --> + </div><!-- /.row --> + + <div class="row"> + <div class="col-md-6"> + <div class="box box-solid"> + <div class="box-header with-border"> + <i class="fa fa-text-width"></i> + <h3 class="box-title">Description</h3> + </div><!-- /.box-header --> + <div class="box-body"> + <dl> + <dt>Description lists</dt> + <dd>A description list is perfect for defining terms.</dd> + <dt>Euismod</dt> + <dd>Vestibulum id ligula porta felis euismod semper eget lacinia odio sem nec elit.</dd> + <dd>Donec id elit non mi porta gravida at eget metus.</dd> + <dt>Malesuada porta</dt> + <dd>Etiam porta sem malesuada magna mollis euismod.</dd> + </dl> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- ./col --> + <div class="col-md-6"> + <div class="box box-solid"> + <div class="box-header with-border"> + <i class="fa fa-text-width"></i> + <h3 class="box-title">Description Horizontal</h3> + </div><!-- /.box-header --> + <div class="box-body"> + <dl class="dl-horizontal"> + <dt>Description lists</dt> + <dd>A description list is perfect for defining terms.</dd> + <dt>Euismod</dt> + <dd>Vestibulum id ligula porta felis euismod semper eget lacinia odio sem nec elit.</dd> + <dd>Donec id elit non mi porta gravida at eget metus.</dd> + <dt>Malesuada porta</dt> + <dd>Etiam porta sem malesuada magna mollis euismod.</dd> + <dt>Felis euismod semper eget lacinia</dt> + <dd>Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</dd> + </dl> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- ./col --> + </div><!-- /.row --> + <!-- END TYPOGRAPHY --> + + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + </body> +</html> diff --git a/theme/bootstrap/pages/UI/icons.html b/theme/bootstrap/pages/UI/icons.html new file mode 100644 index 0000000..861fc0e --- /dev/null +++ b/theme/bootstrap/pages/UI/icons.html @@ -0,0 +1,2736 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Icons</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + <!-- demo style --> + <style> + /* FROM HTTP://WWW.GETBOOTSTRAP.COM + * Glyphicons + * + * Special styles for displaying the icons and their classes in the docs. + */ + + .bs-glyphicons { + padding-left: 0; + padding-bottom: 1px; + margin-bottom: 20px; + list-style: none; + overflow: hidden; + } + .bs-glyphicons li { + float: left; + width: 25%; + height: 115px; + padding: 10px; + margin: 0 -1px -1px 0; + font-size: 12px; + line-height: 1.4; + text-align: center; + border: 1px solid #ddd; + } + .bs-glyphicons .glyphicon { + margin-top: 5px; + margin-bottom: 10px; + font-size: 24px; + } + .bs-glyphicons .glyphicon-class { + display: block; + text-align: center; + word-wrap: break-word; /* Help out IE10+ with class names */ + } + .bs-glyphicons li:hover { + background-color: rgba(86,61,124,.1); + } + + @media (min-width: 768px) { + .bs-glyphicons li { + width: 12.5%; + } + } + </style> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + AdminLTE Design Team + <small><i class="fa fa-clock-o"></i> 2 hours</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Developers + <small><i class="fa fa-clock-o"></i> Today</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Sales Department + <small><i class="fa fa-clock-o"></i> Yesterday</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Reviewers + <small><i class="fa fa-clock-o"></i> 2 days</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-users text-red"></i> 5 new members joined + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-shopping-cart text-green"></i> 25 sales made + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-user text-red"></i> You changed your username + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Create a nice theme + <small class="pull-right">40%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">40% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Some task I need to do + <small class="pull-right">60%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">60% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Make beautiful transitions + <small class="pull-right">80%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="../charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="../charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="../charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li class="active"><a href="icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="../examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="../examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="../examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="../examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="../examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="../examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="../examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Icons + <small>a set of beautiful icons</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">UI</a></li> + <li class="active">Icons</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="nav-tabs-custom"> + <ul class="nav nav-tabs"> + <li class="active"><a href="#fa-icons" data-toggle="tab">Font Awesome</a></li> + <li><a href="#glyphicons" data-toggle="tab">Glyphicons</a></li> + </ul> + <div class="tab-content"> + <!-- Font Awesome Icons --> + <div class="tab-pane active" id="fa-icons"> + <section id="new"> + <h4 class="page-header">66 New Icons in 4.4</h4> + <div class="row fontawesome-icon-list"> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-500px"></i> fa-500px</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-amazon"></i> fa-amazon</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-balance-scale"></i> fa-balance-scale</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-battery-0"></i> fa-battery-0 <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-battery-1"></i> fa-battery-1 <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-battery-2"></i> fa-battery-2 <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-battery-3"></i> fa-battery-3 <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-battery-4"></i> fa-battery-4 <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-battery-empty"></i> fa-battery-empty</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-battery-full"></i> fa-battery-full</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-battery-half"></i> fa-battery-half</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-battery-quarter"></i> fa-battery-quarter</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-battery-three-quarters"></i> fa-battery-three-quarters</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-black-tie"></i> fa-black-tie</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-calendar-check-o"></i> fa-calendar-check-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-calendar-minus-o"></i> fa-calendar-minus-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-calendar-plus-o"></i> fa-calendar-plus-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-calendar-times-o"></i> fa-calendar-times-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cc-diners-club"></i> fa-cc-diners-club</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cc-jcb"></i> fa-cc-jcb</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-chrome"></i> fa-chrome</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-clone"></i> fa-clone</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-commenting"></i> fa-commenting</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-commenting-o"></i> fa-commenting-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-contao"></i> fa-contao</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-creative-commons"></i> fa-creative-commons</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-expeditedssl"></i> fa-expeditedssl</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-firefox"></i> fa-firefox</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-fonticons"></i> fa-fonticons</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-genderless"></i> fa-genderless</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-get-pocket"></i> fa-get-pocket</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-gg"></i> fa-gg</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-gg-circle"></i> fa-gg-circle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-grab-o"></i> fa-hand-grab-o <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-lizard-o"></i> fa-hand-lizard-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-paper-o"></i> fa-hand-paper-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-peace-o"></i> fa-hand-peace-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-pointer-o"></i> fa-hand-pointer-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-rock-o"></i> fa-hand-rock-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-scissors-o"></i> fa-hand-scissors-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-spock-o"></i> fa-hand-spock-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-stop-o"></i> fa-hand-stop-o <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hourglass"></i> fa-hourglass</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hourglass-1"></i> fa-hourglass-1 <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hourglass-2"></i> fa-hourglass-2 <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hourglass-3"></i> fa-hourglass-3 <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hourglass-end"></i> fa-hourglass-end</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hourglass-half"></i> fa-hourglass-half</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hourglass-o"></i> fa-hourglass-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hourglass-start"></i> fa-hourglass-start</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-houzz"></i> fa-houzz</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-i-cursor"></i> fa-i-cursor</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-industry"></i> fa-industry</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-internet-explorer"></i> fa-internet-explorer</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-map"></i> fa-map</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-map-o"></i> fa-map-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-map-pin"></i> fa-map-pin</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-map-signs"></i> fa-map-signs</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-mouse-pointer"></i> fa-mouse-pointer</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-object-group"></i> fa-object-group</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-object-ungroup"></i> fa-object-ungroup</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-odnoklassniki"></i> fa-odnoklassniki</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-odnoklassniki-square"></i> fa-odnoklassniki-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-opencart"></i> fa-opencart</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-opera"></i> fa-opera</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-optin-monster"></i> fa-optin-monster</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-registered"></i> fa-registered</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-safari"></i> fa-safari</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-sticky-note"></i> fa-sticky-note</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-sticky-note-o"></i> fa-sticky-note-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-television"></i> fa-television</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-trademark"></i> fa-trademark</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-tripadvisor"></i> fa-tripadvisor</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-tv"></i> fa-tv <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-vimeo"></i> fa-vimeo</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-wikipedia-w"></i> fa-wikipedia-w</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-y-combinator"></i> fa-y-combinator</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-yc"></i> fa-yc <span class="text-muted">(alias)</span></div> + </div> + </section> + + <section id="web-application"> + <h4 class="page-header">Web Application Icons</h4> + <div class="row fontawesome-icon-list"> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-adjust"></i> fa-adjust</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-anchor"></i> fa-anchor</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-archive"></i> fa-archive</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-area-chart"></i> fa-area-chart</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-arrows"></i> fa-arrows</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-arrows-h"></i> fa-arrows-h</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-arrows-v"></i> fa-arrows-v</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-asterisk"></i> fa-asterisk</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-at"></i> fa-at</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-automobile"></i> fa-automobile <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-balance-scale"></i> fa-balance-scale</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-ban"></i> fa-ban</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bank"></i> fa-bank <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bar-chart"></i> fa-bar-chart</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bar-chart-o"></i> fa-bar-chart-o <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-barcode"></i> fa-barcode</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bars"></i> fa-bars</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-battery-0"></i> fa-battery-0 <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-battery-1"></i> fa-battery-1 <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-battery-2"></i> fa-battery-2 <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-battery-3"></i> fa-battery-3 <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-battery-4"></i> fa-battery-4 <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-battery-empty"></i> fa-battery-empty</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-battery-full"></i> fa-battery-full</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-battery-half"></i> fa-battery-half</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-battery-quarter"></i> fa-battery-quarter</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-battery-three-quarters"></i> fa-battery-three-quarters</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bed"></i> fa-bed</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-beer"></i> fa-beer</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bell"></i> fa-bell</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bell-o"></i> fa-bell-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bell-slash"></i> fa-bell-slash</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bell-slash-o"></i> fa-bell-slash-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bicycle"></i> fa-bicycle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-binoculars"></i> fa-binoculars</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-birthday-cake"></i> fa-birthday-cake</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bolt"></i> fa-bolt</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bomb"></i> fa-bomb</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-book"></i> fa-book</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bookmark"></i> fa-bookmark</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bookmark-o"></i> fa-bookmark-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-briefcase"></i> fa-briefcase</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bug"></i> fa-bug</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-building"></i> fa-building</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-building-o"></i> fa-building-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bullhorn"></i> fa-bullhorn</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bullseye"></i> fa-bullseye</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bus"></i> fa-bus</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cab"></i> fa-cab <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-calculator"></i> fa-calculator</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-calendar"></i> fa-calendar</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-calendar-check-o"></i> fa-calendar-check-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-calendar-minus-o"></i> fa-calendar-minus-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-calendar-o"></i> fa-calendar-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-calendar-plus-o"></i> fa-calendar-plus-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-calendar-times-o"></i> fa-calendar-times-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-camera"></i> fa-camera</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-camera-retro"></i> fa-camera-retro</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-car"></i> fa-car</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-caret-square-o-down"></i> fa-caret-square-o-down</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-caret-square-o-left"></i> fa-caret-square-o-left</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-caret-square-o-right"></i> fa-caret-square-o-right</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-caret-square-o-up"></i> fa-caret-square-o-up</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cart-arrow-down"></i> fa-cart-arrow-down</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cart-plus"></i> fa-cart-plus</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cc"></i> fa-cc</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-certificate"></i> fa-certificate</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-check"></i> fa-check</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-check-circle"></i> fa-check-circle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-check-circle-o"></i> fa-check-circle-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-check-square"></i> fa-check-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-check-square-o"></i> fa-check-square-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-child"></i> fa-child</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-circle"></i> fa-circle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-circle-o"></i> fa-circle-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-circle-o-notch"></i> fa-circle-o-notch</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-circle-thin"></i> fa-circle-thin</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-clock-o"></i> fa-clock-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-clone"></i> fa-clone</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-close"></i> fa-close <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cloud"></i> fa-cloud</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cloud-download"></i> fa-cloud-download</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cloud-upload"></i> fa-cloud-upload</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-code"></i> fa-code</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-code-fork"></i> fa-code-fork</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-coffee"></i> fa-coffee</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cog"></i> fa-cog</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cogs"></i> fa-cogs</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-comment"></i> fa-comment</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-comment-o"></i> fa-comment-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-commenting"></i> fa-commenting</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-commenting-o"></i> fa-commenting-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-comments"></i> fa-comments</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-comments-o"></i> fa-comments-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-compass"></i> fa-compass</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-copyright"></i> fa-copyright</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-creative-commons"></i> fa-creative-commons</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-credit-card"></i> fa-credit-card</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-crop"></i> fa-crop</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-crosshairs"></i> fa-crosshairs</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cube"></i> fa-cube</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cubes"></i> fa-cubes</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cutlery"></i> fa-cutlery</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-dashboard"></i> fa-dashboard <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-database"></i> fa-database</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-desktop"></i> fa-desktop</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-diamond"></i> fa-diamond</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-dot-circle-o"></i> fa-dot-circle-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-download"></i> fa-download</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-edit"></i> fa-edit <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-ellipsis-h"></i> fa-ellipsis-h</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-ellipsis-v"></i> fa-ellipsis-v</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-envelope"></i> fa-envelope</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-envelope-o"></i> fa-envelope-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-envelope-square"></i> fa-envelope-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-eraser"></i> fa-eraser</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-exchange"></i> fa-exchange</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-exclamation"></i> fa-exclamation</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-exclamation-circle"></i> fa-exclamation-circle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-exclamation-triangle"></i> fa-exclamation-triangle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-external-link"></i> fa-external-link</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-external-link-square"></i> fa-external-link-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-eye"></i> fa-eye</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-eye-slash"></i> fa-eye-slash</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-eyedropper"></i> fa-eyedropper</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-fax"></i> fa-fax</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-feed"></i> fa-feed <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-female"></i> fa-female</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-fighter-jet"></i> fa-fighter-jet</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-archive-o"></i> fa-file-archive-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-audio-o"></i> fa-file-audio-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-code-o"></i> fa-file-code-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-excel-o"></i> fa-file-excel-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-image-o"></i> fa-file-image-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-movie-o"></i> fa-file-movie-o <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-pdf-o"></i> fa-file-pdf-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-photo-o"></i> fa-file-photo-o <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-picture-o"></i> fa-file-picture-o <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-powerpoint-o"></i> fa-file-powerpoint-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-sound-o"></i> fa-file-sound-o <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-video-o"></i> fa-file-video-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-word-o"></i> fa-file-word-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-zip-o"></i> fa-file-zip-o <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-film"></i> fa-film</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-filter"></i> fa-filter</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-fire"></i> fa-fire</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-fire-extinguisher"></i> fa-fire-extinguisher</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-flag"></i> fa-flag</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-flag-checkered"></i> fa-flag-checkered</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-flag-o"></i> fa-flag-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-flash"></i> fa-flash <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-flask"></i> fa-flask</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-folder"></i> fa-folder</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-folder-o"></i> fa-folder-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-folder-open"></i> fa-folder-open</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-folder-open-o"></i> fa-folder-open-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-frown-o"></i> fa-frown-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-futbol-o"></i> fa-futbol-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-gamepad"></i> fa-gamepad</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-gavel"></i> fa-gavel</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-gear"></i> fa-gear <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-gears"></i> fa-gears <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-gift"></i> fa-gift</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-glass"></i> fa-glass</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-globe"></i> fa-globe</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-graduation-cap"></i> fa-graduation-cap</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-group"></i> fa-group <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-grab-o"></i> fa-hand-grab-o <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-lizard-o"></i> fa-hand-lizard-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-paper-o"></i> fa-hand-paper-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-peace-o"></i> fa-hand-peace-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-pointer-o"></i> fa-hand-pointer-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-rock-o"></i> fa-hand-rock-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-scissors-o"></i> fa-hand-scissors-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-spock-o"></i> fa-hand-spock-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-stop-o"></i> fa-hand-stop-o <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hdd-o"></i> fa-hdd-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-headphones"></i> fa-headphones</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-heart"></i> fa-heart</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-heart-o"></i> fa-heart-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-heartbeat"></i> fa-heartbeat</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-history"></i> fa-history</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-home"></i> fa-home</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hotel"></i> fa-hotel <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hourglass"></i> fa-hourglass</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hourglass-1"></i> fa-hourglass-1 <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hourglass-2"></i> fa-hourglass-2 <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hourglass-3"></i> fa-hourglass-3 <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hourglass-end"></i> fa-hourglass-end</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hourglass-half"></i> fa-hourglass-half</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hourglass-o"></i> fa-hourglass-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hourglass-start"></i> fa-hourglass-start</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-i-cursor"></i> fa-i-cursor</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-image"></i> fa-image <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-inbox"></i> fa-inbox</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-industry"></i> fa-industry</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-info"></i> fa-info</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-info-circle"></i> fa-info-circle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-institution"></i> fa-institution <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-key"></i> fa-key</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-keyboard-o"></i> fa-keyboard-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-language"></i> fa-language</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-laptop"></i> fa-laptop</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-leaf"></i> fa-leaf</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-legal"></i> fa-legal <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-lemon-o"></i> fa-lemon-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-level-down"></i> fa-level-down</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-level-up"></i> fa-level-up</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-life-bouy"></i> fa-life-bouy <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-life-buoy"></i> fa-life-buoy <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-life-ring"></i> fa-life-ring</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-life-saver"></i> fa-life-saver <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-lightbulb-o"></i> fa-lightbulb-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-line-chart"></i> fa-line-chart</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-location-arrow"></i> fa-location-arrow</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-lock"></i> fa-lock</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-magic"></i> fa-magic</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-magnet"></i> fa-magnet</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-mail-forward"></i> fa-mail-forward <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-mail-reply"></i> fa-mail-reply <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-mail-reply-all"></i> fa-mail-reply-all <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-male"></i> fa-male</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-map"></i> fa-map</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-map-marker"></i> fa-map-marker</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-map-o"></i> fa-map-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-map-pin"></i> fa-map-pin</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-map-signs"></i> fa-map-signs</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-meh-o"></i> fa-meh-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-microphone"></i> fa-microphone</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-microphone-slash"></i> fa-microphone-slash</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-minus"></i> fa-minus</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-minus-circle"></i> fa-minus-circle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-minus-square"></i> fa-minus-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-minus-square-o"></i> fa-minus-square-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-mobile"></i> fa-mobile</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-mobile-phone"></i> fa-mobile-phone <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-money"></i> fa-money</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-moon-o"></i> fa-moon-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-mortar-board"></i> fa-mortar-board <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-motorcycle"></i> fa-motorcycle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-mouse-pointer"></i> fa-mouse-pointer</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-music"></i> fa-music</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-navicon"></i> fa-navicon <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-newspaper-o"></i> fa-newspaper-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-object-group"></i> fa-object-group</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-object-ungroup"></i> fa-object-ungroup</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-paint-brush"></i> fa-paint-brush</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-paper-plane"></i> fa-paper-plane</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-paper-plane-o"></i> fa-paper-plane-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-paw"></i> fa-paw</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-pencil"></i> fa-pencil</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-pencil-square"></i> fa-pencil-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-pencil-square-o"></i> fa-pencil-square-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-phone"></i> fa-phone</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-phone-square"></i> fa-phone-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-photo"></i> fa-photo <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-picture-o"></i> fa-picture-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-pie-chart"></i> fa-pie-chart</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-plane"></i> fa-plane</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-plug"></i> fa-plug</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-plus"></i> fa-plus</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-plus-circle"></i> fa-plus-circle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-plus-square"></i> fa-plus-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-plus-square-o"></i> fa-plus-square-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-power-off"></i> fa-power-off</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-print"></i> fa-print</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-puzzle-piece"></i> fa-puzzle-piece</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-qrcode"></i> fa-qrcode</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-question"></i> fa-question</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-question-circle"></i> fa-question-circle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-quote-left"></i> fa-quote-left</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-quote-right"></i> fa-quote-right</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-random"></i> fa-random</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-recycle"></i> fa-recycle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-refresh"></i> fa-refresh</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-registered"></i> fa-registered</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-remove"></i> fa-remove <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-reorder"></i> fa-reorder <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-reply"></i> fa-reply</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-reply-all"></i> fa-reply-all</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-retweet"></i> fa-retweet</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-road"></i> fa-road</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-rocket"></i> fa-rocket</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-rss"></i> fa-rss</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-rss-square"></i> fa-rss-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-search"></i> fa-search</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-search-minus"></i> fa-search-minus</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-search-plus"></i> fa-search-plus</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-send"></i> fa-send <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-send-o"></i> fa-send-o <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-server"></i> fa-server</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-share"></i> fa-share</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-share-alt"></i> fa-share-alt</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-share-alt-square"></i> fa-share-alt-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-share-square"></i> fa-share-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-share-square-o"></i> fa-share-square-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-shield"></i> fa-shield</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-ship"></i> fa-ship</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-shopping-cart"></i> fa-shopping-cart</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-sign-in"></i> fa-sign-in</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-sign-out"></i> fa-sign-out</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-signal"></i> fa-signal</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-sitemap"></i> fa-sitemap</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-sliders"></i> fa-sliders</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-smile-o"></i> fa-smile-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-soccer-ball-o"></i> fa-soccer-ball-o <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-sort"></i> fa-sort</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-sort-alpha-asc"></i> fa-sort-alpha-asc</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-sort-alpha-desc"></i> fa-sort-alpha-desc</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-sort-amount-asc"></i> fa-sort-amount-asc</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-sort-amount-desc"></i> fa-sort-amount-desc</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-sort-asc"></i> fa-sort-asc</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-sort-desc"></i> fa-sort-desc</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-sort-down"></i> fa-sort-down <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-sort-numeric-asc"></i> fa-sort-numeric-asc</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-sort-numeric-desc"></i> fa-sort-numeric-desc</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-sort-up"></i> fa-sort-up <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-space-shuttle"></i> fa-space-shuttle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-spinner"></i> fa-spinner</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-spoon"></i> fa-spoon</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-square"></i> fa-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-square-o"></i> fa-square-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-star"></i> fa-star</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-star-half"></i> fa-star-half</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-star-half-empty"></i> fa-star-half-empty <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-star-half-full"></i> fa-star-half-full <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-star-half-o"></i> fa-star-half-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-star-o"></i> fa-star-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-sticky-note"></i> fa-sticky-note</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-sticky-note-o"></i> fa-sticky-note-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-street-view"></i> fa-street-view</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-suitcase"></i> fa-suitcase</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-sun-o"></i> fa-sun-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-support"></i> fa-support <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-tablet"></i> fa-tablet</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-tachometer"></i> fa-tachometer</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-tag"></i> fa-tag</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-tags"></i> fa-tags</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-tasks"></i> fa-tasks</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-taxi"></i> fa-taxi</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-television"></i> fa-television</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-terminal"></i> fa-terminal</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-thumb-tack"></i> fa-thumb-tack</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-thumbs-down"></i> fa-thumbs-down</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-thumbs-o-down"></i> fa-thumbs-o-down</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-thumbs-o-up"></i> fa-thumbs-o-up</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-thumbs-up"></i> fa-thumbs-up</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-ticket"></i> fa-ticket</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-times"></i> fa-times</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-times-circle"></i> fa-times-circle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-times-circle-o"></i> fa-times-circle-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-tint"></i> fa-tint</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-toggle-down"></i> fa-toggle-down <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-toggle-left"></i> fa-toggle-left <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-toggle-off"></i> fa-toggle-off</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-toggle-on"></i> fa-toggle-on</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-toggle-right"></i> fa-toggle-right <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-toggle-up"></i> fa-toggle-up <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-trademark"></i> fa-trademark</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-trash"></i> fa-trash</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-trash-o"></i> fa-trash-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-tree"></i> fa-tree</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-trophy"></i> fa-trophy</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-truck"></i> fa-truck</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-tty"></i> fa-tty</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-tv"></i> fa-tv <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-umbrella"></i> fa-umbrella</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-university"></i> fa-university</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-unlock"></i> fa-unlock</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-unlock-alt"></i> fa-unlock-alt</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-unsorted"></i> fa-unsorted <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-upload"></i> fa-upload</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-user"></i> fa-user</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-user-plus"></i> fa-user-plus</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-user-secret"></i> fa-user-secret</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-user-times"></i> fa-user-times</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-users"></i> fa-users</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-video-camera"></i> fa-video-camera</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-volume-down"></i> fa-volume-down</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-volume-off"></i> fa-volume-off</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-volume-up"></i> fa-volume-up</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-warning"></i> fa-warning <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-wheelchair"></i> fa-wheelchair</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-wifi"></i> fa-wifi</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-wrench"></i> fa-wrench</div> + </div> + </section> + + <section id="hand"> + <h4 class="page-header">Hand Icons</h4> + <div class="row fontawesome-icon-list"> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-grab-o"></i> fa-hand-grab-o <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-lizard-o"></i> fa-hand-lizard-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-o-down"></i> fa-hand-o-down</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-o-left"></i> fa-hand-o-left</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-o-right"></i> fa-hand-o-right</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-o-up"></i> fa-hand-o-up</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-paper-o"></i> fa-hand-paper-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-peace-o"></i> fa-hand-peace-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-pointer-o"></i> fa-hand-pointer-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-rock-o"></i> fa-hand-rock-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-scissors-o"></i> fa-hand-scissors-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-spock-o"></i> fa-hand-spock-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-stop-o"></i> fa-hand-stop-o <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-thumbs-down"></i> fa-thumbs-down</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-thumbs-o-down"></i> fa-thumbs-o-down</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-thumbs-o-up"></i> fa-thumbs-o-up</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-thumbs-up"></i> fa-thumbs-up</div> + </div> + </section> + + <section id="transportation"> + <h4 class="page-header">Transportation Icons</h4> + <div class="row fontawesome-icon-list"> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-ambulance"></i> fa-ambulance</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-automobile"></i> fa-automobile <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bicycle"></i> fa-bicycle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bus"></i> fa-bus</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cab"></i> fa-cab <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-car"></i> fa-car</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-fighter-jet"></i> fa-fighter-jet</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-motorcycle"></i> fa-motorcycle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-plane"></i> fa-plane</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-rocket"></i> fa-rocket</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-ship"></i> fa-ship</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-space-shuttle"></i> fa-space-shuttle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-subway"></i> fa-subway</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-taxi"></i> fa-taxi</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-train"></i> fa-train</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-truck"></i> fa-truck</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-wheelchair"></i> fa-wheelchair</div> + </div> + </section> + + <section id="gender"> + <h4 class="page-header">Gender Icons</h4> + <div class="row fontawesome-icon-list"> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-genderless"></i> fa-genderless</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-intersex"></i> fa-intersex <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-mars"></i> fa-mars</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-mars-double"></i> fa-mars-double</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-mars-stroke"></i> fa-mars-stroke</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-mars-stroke-h"></i> fa-mars-stroke-h</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-mars-stroke-v"></i> fa-mars-stroke-v</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-mercury"></i> fa-mercury</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-neuter"></i> fa-neuter</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-transgender"></i> fa-transgender</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-transgender-alt"></i> fa-transgender-alt</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-venus"></i> fa-venus</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-venus-double"></i> fa-venus-double</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-venus-mars"></i> fa-venus-mars</div> + </div> + </section> + + <section id="file-type"> + <h2 class="page-header">File Type Icons</h2> + <div class="row fontawesome-icon-list"> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file"></i> fa-file</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-archive-o"></i> fa-file-archive-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-audio-o"></i> fa-file-audio-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-code-o"></i> fa-file-code-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-excel-o"></i> fa-file-excel-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-image-o"></i> fa-file-image-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-movie-o"></i> fa-file-movie-o <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-o"></i> fa-file-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-pdf-o"></i> fa-file-pdf-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-photo-o"></i> fa-file-photo-o <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-picture-o"></i> fa-file-picture-o <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-powerpoint-o"></i> fa-file-powerpoint-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-sound-o"></i> fa-file-sound-o <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-text"></i> fa-file-text</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-text-o"></i> fa-file-text-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-video-o"></i> fa-file-video-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-word-o"></i> fa-file-word-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-zip-o"></i> fa-file-zip-o <span class="text-muted">(alias)</span></div> + </div> + </section> + + <section id="spinner"> + <h2 class="page-header">Spinner Icons</h2> + <div class="row fontawesome-icon-list"> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-circle-o-notch"></i> fa-circle-o-notch</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cog"></i> fa-cog</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-gear"></i> fa-gear <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-refresh"></i> fa-refresh</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-spinner"></i> fa-spinner</div> + </div> + </section> + + <section id="form-control"> + <h4 class="page-header">Form Control Icons</h4> + <div class="row fontawesome-icon-list"> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-check-square"></i> fa-check-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-check-square-o"></i> fa-check-square-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-circle"></i> fa-circle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-circle-o"></i> fa-circle-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-dot-circle-o"></i> fa-dot-circle-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-minus-square"></i> fa-minus-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-minus-square-o"></i> fa-minus-square-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-plus-square"></i> fa-plus-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-plus-square-o"></i> fa-plus-square-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-square"></i> fa-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-square-o"></i> fa-square-o</div> + </div> + </section> + + <section id="payment"> + <h4 class="page-header">Payment Icons</h4> + <div class="row fontawesome-icon-list"> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cc-amex"></i> fa-cc-amex</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cc-diners-club"></i> fa-cc-diners-club</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cc-discover"></i> fa-cc-discover</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cc-jcb"></i> fa-cc-jcb</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cc-mastercard"></i> fa-cc-mastercard</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cc-paypal"></i> fa-cc-paypal</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cc-stripe"></i> fa-cc-stripe</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cc-visa"></i> fa-cc-visa</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-credit-card"></i> fa-credit-card</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-google-wallet"></i> fa-google-wallet</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-paypal"></i> fa-paypal</div> + </div> + </section> + + <section id="chart"> + <h4 class="page-header">Chart Icons</h4> + <div class="row fontawesome-icon-list"> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-area-chart"></i> fa-area-chart</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bar-chart"></i> fa-bar-chart</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bar-chart-o"></i> fa-bar-chart-o <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-line-chart"></i> fa-line-chart</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-pie-chart"></i> fa-pie-chart</div> + </div> + </section> + + <section id="currency"> + <h4 class="page-header">Currency Icons</h4> + <div class="row fontawesome-icon-list"> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bitcoin"></i> fa-bitcoin <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-btc"></i> fa-btc</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cny"></i> fa-cny <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-dollar"></i> fa-dollar <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-eur"></i> fa-eur</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-euro"></i> fa-euro <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-gbp"></i> fa-gbp</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-gg"></i> fa-gg</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-gg-circle"></i> fa-gg-circle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-ils"></i> fa-ils</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-inr"></i> fa-inr</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-jpy"></i> fa-jpy</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-krw"></i> fa-krw</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-money"></i> fa-money</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-rmb"></i> fa-rmb <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-rouble"></i> fa-rouble <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-rub"></i> fa-rub</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-ruble"></i> fa-ruble <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-rupee"></i> fa-rupee <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-shekel"></i> fa-shekel <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-sheqel"></i> fa-sheqel <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-try"></i> fa-try</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-turkish-lira"></i> fa-turkish-lira <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-usd"></i> fa-usd</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-won"></i> fa-won <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-yen"></i> fa-yen <span class="text-muted">(alias)</span></div> + </div> + </section> + + <section id="text-editor"> + <h4 class="page-header">Text Editor Icons</h4> + <div class="row fontawesome-icon-list"> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-align-center"></i> fa-align-center</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-align-justify"></i> fa-align-justify</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-align-left"></i> fa-align-left</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-align-right"></i> fa-align-right</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bold"></i> fa-bold</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-chain"></i> fa-chain <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-chain-broken"></i> fa-chain-broken</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-clipboard"></i> fa-clipboard</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-columns"></i> fa-columns</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-copy"></i> fa-copy <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cut"></i> fa-cut <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-dedent"></i> fa-dedent <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-eraser"></i> fa-eraser</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file"></i> fa-file</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-o"></i> fa-file-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-text"></i> fa-file-text</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-file-text-o"></i> fa-file-text-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-files-o"></i> fa-files-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-floppy-o"></i> fa-floppy-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-font"></i> fa-font</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-header"></i> fa-header</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-indent"></i> fa-indent</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-italic"></i> fa-italic</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-link"></i> fa-link</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-list"></i> fa-list</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-list-alt"></i> fa-list-alt</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-list-ol"></i> fa-list-ol</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-list-ul"></i> fa-list-ul</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-outdent"></i> fa-outdent</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-paperclip"></i> fa-paperclip</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-paragraph"></i> fa-paragraph</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-paste"></i> fa-paste <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-repeat"></i> fa-repeat</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-rotate-left"></i> fa-rotate-left <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-rotate-right"></i> fa-rotate-right <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-save"></i> fa-save <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-scissors"></i> fa-scissors</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-strikethrough"></i> fa-strikethrough</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-subscript"></i> fa-subscript</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-superscript"></i> fa-superscript</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-table"></i> fa-table</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-text-height"></i> fa-text-height</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-text-width"></i> fa-text-width</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-th"></i> fa-th</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-th-large"></i> fa-th-large</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-th-list"></i> fa-th-list</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-underline"></i> fa-underline</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-undo"></i> fa-undo</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-unlink"></i> fa-unlink <span class="text-muted">(alias)</span></div> + </div> + </section> + + <section id="directional"> + <h4 class="page-header">Directional Icons</h4> + <div class="row fontawesome-icon-list"> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-angle-double-down"></i> fa-angle-double-down</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-angle-double-left"></i> fa-angle-double-left</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-angle-double-right"></i> fa-angle-double-right</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-angle-double-up"></i> fa-angle-double-up</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-angle-down"></i> fa-angle-down</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-angle-left"></i> fa-angle-left</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-angle-right"></i> fa-angle-right</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-angle-up"></i> fa-angle-up</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-arrow-circle-down"></i> fa-arrow-circle-down</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-arrow-circle-left"></i> fa-arrow-circle-left</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-arrow-circle-o-down"></i> fa-arrow-circle-o-down</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-arrow-circle-o-left"></i> fa-arrow-circle-o-left</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-arrow-circle-o-right"></i> fa-arrow-circle-o-right</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-arrow-circle-o-up"></i> fa-arrow-circle-o-up</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-arrow-circle-right"></i> fa-arrow-circle-right</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-arrow-circle-up"></i> fa-arrow-circle-up</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-arrow-down"></i> fa-arrow-down</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-arrow-left"></i> fa-arrow-left</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-arrow-right"></i> fa-arrow-right</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-arrow-up"></i> fa-arrow-up</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-arrows"></i> fa-arrows</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-arrows-alt"></i> fa-arrows-alt</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-arrows-h"></i> fa-arrows-h</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-arrows-v"></i> fa-arrows-v</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-caret-down"></i> fa-caret-down</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-caret-left"></i> fa-caret-left</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-caret-right"></i> fa-caret-right</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-caret-square-o-down"></i> fa-caret-square-o-down</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-caret-square-o-left"></i> fa-caret-square-o-left</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-caret-square-o-right"></i> fa-caret-square-o-right</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-caret-square-o-up"></i> fa-caret-square-o-up</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-caret-up"></i> fa-caret-up</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-chevron-circle-down"></i> fa-chevron-circle-down</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-chevron-circle-left"></i> fa-chevron-circle-left</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-chevron-circle-right"></i> fa-chevron-circle-right</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-chevron-circle-up"></i> fa-chevron-circle-up</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-chevron-down"></i> fa-chevron-down</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-chevron-left"></i> fa-chevron-left</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-chevron-right"></i> fa-chevron-right</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-chevron-up"></i> fa-chevron-up</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-exchange"></i> fa-exchange</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-o-down"></i> fa-hand-o-down</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-o-left"></i> fa-hand-o-left</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-o-right"></i> fa-hand-o-right</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hand-o-up"></i> fa-hand-o-up</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-long-arrow-down"></i> fa-long-arrow-down</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-long-arrow-left"></i> fa-long-arrow-left</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-long-arrow-right"></i> fa-long-arrow-right</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-long-arrow-up"></i> fa-long-arrow-up</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-toggle-down"></i> fa-toggle-down <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-toggle-left"></i> fa-toggle-left <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-toggle-right"></i> fa-toggle-right <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-toggle-up"></i> fa-toggle-up <span class="text-muted">(alias)</span></div> + </div> + </section> + + <section id="video-player"> + <h4 class="page-header">Video Player Icons</h4> + <div class="row fontawesome-icon-list"> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-arrows-alt"></i> fa-arrows-alt</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-backward"></i> fa-backward</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-compress"></i> fa-compress</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-eject"></i> fa-eject</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-expand"></i> fa-expand</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-fast-backward"></i> fa-fast-backward</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-fast-forward"></i> fa-fast-forward</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-forward"></i> fa-forward</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-pause"></i> fa-pause</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-play"></i> fa-play</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-play-circle"></i> fa-play-circle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-play-circle-o"></i> fa-play-circle-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-random"></i> fa-random</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-step-backward"></i> fa-step-backward</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-step-forward"></i> fa-step-forward</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-stop"></i> fa-stop</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-youtube-play"></i> fa-youtube-play</div> + </div> + </section> + + <section id="brand"> + <h4 class="page-header">Brand Icons</h4> + <div class="alert alert-info"> + <ul class="margin-bottom-none padding-left-lg"> + <li>All brand icons are trademarks of their respective owners.</li> + <li>The use of these trademarks does not indicate endorsement of the trademark holder by Font Awesome, nor vice versa.</li> + </ul> + </div> + <div class="row fontawesome-icon-list"> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-500px"></i> fa-500px</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-adn"></i> fa-adn</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-amazon"></i> fa-amazon</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-android"></i> fa-android</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-angellist"></i> fa-angellist</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-apple"></i> fa-apple</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-behance"></i> fa-behance</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-behance-square"></i> fa-behance-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bitbucket"></i> fa-bitbucket</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bitbucket-square"></i> fa-bitbucket-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-bitcoin"></i> fa-bitcoin <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-black-tie"></i> fa-black-tie</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-btc"></i> fa-btc</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-buysellads"></i> fa-buysellads</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cc-amex"></i> fa-cc-amex</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cc-diners-club"></i> fa-cc-diners-club</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cc-discover"></i> fa-cc-discover</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cc-jcb"></i> fa-cc-jcb</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cc-mastercard"></i> fa-cc-mastercard</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cc-paypal"></i> fa-cc-paypal</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cc-stripe"></i> fa-cc-stripe</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-cc-visa"></i> fa-cc-visa</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-chrome"></i> fa-chrome</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-codepen"></i> fa-codepen</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-connectdevelop"></i> fa-connectdevelop</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-contao"></i> fa-contao</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-css3"></i> fa-css3</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-dashcube"></i> fa-dashcube</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-delicious"></i> fa-delicious</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-deviantart"></i> fa-deviantart</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-digg"></i> fa-digg</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-dribbble"></i> fa-dribbble</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-dropbox"></i> fa-dropbox</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-drupal"></i> fa-drupal</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-empire"></i> fa-empire</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-expeditedssl"></i> fa-expeditedssl</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-facebook"></i> fa-facebook</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-facebook-f"></i> fa-facebook-f <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-facebook-official"></i> fa-facebook-official</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-facebook-square"></i> fa-facebook-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-firefox"></i> fa-firefox</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-flickr"></i> fa-flickr</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-fonticons"></i> fa-fonticons</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-forumbee"></i> fa-forumbee</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-foursquare"></i> fa-foursquare</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-ge"></i> fa-ge <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-get-pocket"></i> fa-get-pocket</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-gg"></i> fa-gg</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-gg-circle"></i> fa-gg-circle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-git"></i> fa-git</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-git-square"></i> fa-git-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-github"></i> fa-github</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-github-alt"></i> fa-github-alt</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-github-square"></i> fa-github-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-gittip"></i> fa-gittip <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-google"></i> fa-google</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-google-plus"></i> fa-google-plus</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-google-plus-square"></i> fa-google-plus-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-google-wallet"></i> fa-google-wallet</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-gratipay"></i> fa-gratipay</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hacker-news"></i> fa-hacker-news</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-houzz"></i> fa-houzz</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-html5"></i> fa-html5</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-instagram"></i> fa-instagram</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-internet-explorer"></i> fa-internet-explorer</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-ioxhost"></i> fa-ioxhost</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-joomla"></i> fa-joomla</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-jsfiddle"></i> fa-jsfiddle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-lastfm"></i> fa-lastfm</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-lastfm-square"></i> fa-lastfm-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-leanpub"></i> fa-leanpub</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-linkedin"></i> fa-linkedin</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-linkedin-square"></i> fa-linkedin-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-linux"></i> fa-linux</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-maxcdn"></i> fa-maxcdn</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-meanpath"></i> fa-meanpath</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-medium"></i> fa-medium</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-odnoklassniki"></i> fa-odnoklassniki</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-odnoklassniki-square"></i> fa-odnoklassniki-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-opencart"></i> fa-opencart</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-openid"></i> fa-openid</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-opera"></i> fa-opera</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-optin-monster"></i> fa-optin-monster</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-pagelines"></i> fa-pagelines</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-paypal"></i> fa-paypal</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-pied-piper"></i> fa-pied-piper</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-pied-piper-alt"></i> fa-pied-piper-alt</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-pinterest"></i> fa-pinterest</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-pinterest-p"></i> fa-pinterest-p</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-pinterest-square"></i> fa-pinterest-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-qq"></i> fa-qq</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-ra"></i> fa-ra <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-rebel"></i> fa-rebel</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-reddit"></i> fa-reddit</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-reddit-square"></i> fa-reddit-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-renren"></i> fa-renren</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-safari"></i> fa-safari</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-sellsy"></i> fa-sellsy</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-share-alt"></i> fa-share-alt</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-share-alt-square"></i> fa-share-alt-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-shirtsinbulk"></i> fa-shirtsinbulk</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-simplybuilt"></i> fa-simplybuilt</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-skyatlas"></i> fa-skyatlas</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-skype"></i> fa-skype</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-slack"></i> fa-slack</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-slideshare"></i> fa-slideshare</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-soundcloud"></i> fa-soundcloud</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-spotify"></i> fa-spotify</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-stack-exchange"></i> fa-stack-exchange</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-stack-overflow"></i> fa-stack-overflow</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-steam"></i> fa-steam</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-steam-square"></i> fa-steam-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-stumbleupon"></i> fa-stumbleupon</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-stumbleupon-circle"></i> fa-stumbleupon-circle</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-tencent-weibo"></i> fa-tencent-weibo</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-trello"></i> fa-trello</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-tripadvisor"></i> fa-tripadvisor</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-tumblr"></i> fa-tumblr</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-tumblr-square"></i> fa-tumblr-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-twitch"></i> fa-twitch</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-twitter"></i> fa-twitter</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-twitter-square"></i> fa-twitter-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-viacoin"></i> fa-viacoin</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-vimeo"></i> fa-vimeo</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-vimeo-square"></i> fa-vimeo-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-vine"></i> fa-vine</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-vk"></i> fa-vk</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-wechat"></i> fa-wechat <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-weibo"></i> fa-weibo</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-weixin"></i> fa-weixin</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-whatsapp"></i> fa-whatsapp</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-wikipedia-w"></i> fa-wikipedia-w</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-windows"></i> fa-windows</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-wordpress"></i> fa-wordpress</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-xing"></i> fa-xing</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-xing-square"></i> fa-xing-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-y-combinator"></i> fa-y-combinator</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-y-combinator-square"></i> fa-y-combinator-square <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-yahoo"></i> fa-yahoo</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-yc"></i> fa-yc <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-yc-square"></i> fa-yc-square <span class="text-muted">(alias)</span></div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-yelp"></i> fa-yelp</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-youtube"></i> fa-youtube</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-youtube-play"></i> fa-youtube-play</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-youtube-square"></i> fa-youtube-square</div> + </div> + </section> + + <section id="medical"> + <h4 class="page-header">Medical Icons</h4> + <div class="row"> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-ambulance"></i> fa-ambulance</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-h-square"></i> fa-h-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-heart"></i> fa-heart</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-heart-o"></i> fa-heart-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-heartbeat"></i> fa-heartbeat</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-hospital-o"></i> fa-hospital-o</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-medkit"></i> fa-medkit</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-plus-square"></i> fa-plus-square</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-stethoscope"></i> fa-stethoscope</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-user-md"></i> fa-user-md</div> + <div class="col-md-3 col-sm-4"><i class="fa fa-fw fa-wheelchair"></i> fa-wheelchair</div> + </div> + </section> + </div><!-- /#fa-icons --> + + <!-- glyphicons--> + <div class="tab-pane" id="glyphicons"> + + <ul class="bs-glyphicons"> + <li> + <span class="glyphicon glyphicon-asterisk"></span> + <span class="glyphicon-class">glyphicon glyphicon-asterisk</span> + </li> + <li> + <span class="glyphicon glyphicon-plus"></span> + <span class="glyphicon-class">glyphicon glyphicon-plus</span> + </li> + <li> + <span class="glyphicon glyphicon-euro"></span> + <span class="glyphicon-class">glyphicon glyphicon-euro</span> + </li> + <li> + <span class="glyphicon glyphicon-eur"></span> + <span class="glyphicon-class">glyphicon glyphicon-eur</span> + </li> + <li> + <span class="glyphicon glyphicon-minus"></span> + <span class="glyphicon-class">glyphicon glyphicon-minus</span> + </li> + <li> + <span class="glyphicon glyphicon-cloud"></span> + <span class="glyphicon-class">glyphicon glyphicon-cloud</span> + </li> + <li> + <span class="glyphicon glyphicon-envelope"></span> + <span class="glyphicon-class">glyphicon glyphicon-envelope</span> + </li> + <li> + <span class="glyphicon glyphicon-pencil"></span> + <span class="glyphicon-class">glyphicon glyphicon-pencil</span> + </li> + <li> + <span class="glyphicon glyphicon-glass"></span> + <span class="glyphicon-class">glyphicon glyphicon-glass</span> + </li> + <li> + <span class="glyphicon glyphicon-music"></span> + <span class="glyphicon-class">glyphicon glyphicon-music</span> + </li> + <li> + <span class="glyphicon glyphicon-search"></span> + <span class="glyphicon-class">glyphicon glyphicon-search</span> + </li> + <li> + <span class="glyphicon glyphicon-heart"></span> + <span class="glyphicon-class">glyphicon glyphicon-heart</span> + </li> + <li> + <span class="glyphicon glyphicon-star"></span> + <span class="glyphicon-class">glyphicon glyphicon-star</span> + </li> + <li> + <span class="glyphicon glyphicon-star-empty"></span> + <span class="glyphicon-class">glyphicon glyphicon-star-empty</span> + </li> + <li> + <span class="glyphicon glyphicon-user"></span> + <span class="glyphicon-class">glyphicon glyphicon-user</span> + </li> + <li> + <span class="glyphicon glyphicon-film"></span> + <span class="glyphicon-class">glyphicon glyphicon-film</span> + </li> + <li> + <span class="glyphicon glyphicon-th-large"></span> + <span class="glyphicon-class">glyphicon glyphicon-th-large</span> + </li> + <li> + <span class="glyphicon glyphicon-th"></span> + <span class="glyphicon-class">glyphicon glyphicon-th</span> + </li> + <li> + <span class="glyphicon glyphicon-th-list"></span> + <span class="glyphicon-class">glyphicon glyphicon-th-list</span> + </li> + <li> + <span class="glyphicon glyphicon-ok"></span> + <span class="glyphicon-class">glyphicon glyphicon-ok</span> + </li> + <li> + <span class="glyphicon glyphicon-remove"></span> + <span class="glyphicon-class">glyphicon glyphicon-remove</span> + </li> + <li> + <span class="glyphicon glyphicon-zoom-in"></span> + <span class="glyphicon-class">glyphicon glyphicon-zoom-in</span> + </li> + <li> + <span class="glyphicon glyphicon-zoom-out"></span> + <span class="glyphicon-class">glyphicon glyphicon-zoom-out</span> + </li> + <li> + <span class="glyphicon glyphicon-off"></span> + <span class="glyphicon-class">glyphicon glyphicon-off</span> + </li> + <li> + <span class="glyphicon glyphicon-signal"></span> + <span class="glyphicon-class">glyphicon glyphicon-signal</span> + </li> + <li> + <span class="glyphicon glyphicon-cog"></span> + <span class="glyphicon-class">glyphicon glyphicon-cog</span> + </li> + <li> + <span class="glyphicon glyphicon-trash"></span> + <span class="glyphicon-class">glyphicon glyphicon-trash</span> + </li> + <li> + <span class="glyphicon glyphicon-home"></span> + <span class="glyphicon-class">glyphicon glyphicon-home</span> + </li> + <li> + <span class="glyphicon glyphicon-file"></span> + <span class="glyphicon-class">glyphicon glyphicon-file</span> + </li> + <li> + <span class="glyphicon glyphicon-time"></span> + <span class="glyphicon-class">glyphicon glyphicon-time</span> + </li> + <li> + <span class="glyphicon glyphicon-road"></span> + <span class="glyphicon-class">glyphicon glyphicon-road</span> + </li> + <li> + <span class="glyphicon glyphicon-download-alt"></span> + <span class="glyphicon-class">glyphicon glyphicon-download-alt</span> + </li> + <li> + <span class="glyphicon glyphicon-download"></span> + <span class="glyphicon-class">glyphicon glyphicon-download</span> + </li> + <li> + <span class="glyphicon glyphicon-upload"></span> + <span class="glyphicon-class">glyphicon glyphicon-upload</span> + </li> + <li> + <span class="glyphicon glyphicon-inbox"></span> + <span class="glyphicon-class">glyphicon glyphicon-inbox</span> + </li> + <li> + <span class="glyphicon glyphicon-play-circle"></span> + <span class="glyphicon-class">glyphicon glyphicon-play-circle</span> + </li> + <li> + <span class="glyphicon glyphicon-repeat"></span> + <span class="glyphicon-class">glyphicon glyphicon-repeat</span> + </li> + <li> + <span class="glyphicon glyphicon-refresh"></span> + <span class="glyphicon-class">glyphicon glyphicon-refresh</span> + </li> + <li> + <span class="glyphicon glyphicon-list-alt"></span> + <span class="glyphicon-class">glyphicon glyphicon-list-alt</span> + </li> + <li> + <span class="glyphicon glyphicon-lock"></span> + <span class="glyphicon-class">glyphicon glyphicon-lock</span> + </li> + <li> + <span class="glyphicon glyphicon-flag"></span> + <span class="glyphicon-class">glyphicon glyphicon-flag</span> + </li> + <li> + <span class="glyphicon glyphicon-headphones"></span> + <span class="glyphicon-class">glyphicon glyphicon-headphones</span> + </li> + <li> + <span class="glyphicon glyphicon-volume-off"></span> + <span class="glyphicon-class">glyphicon glyphicon-volume-off</span> + </li> + <li> + <span class="glyphicon glyphicon-volume-down"></span> + <span class="glyphicon-class">glyphicon glyphicon-volume-down</span> + </li> + <li> + <span class="glyphicon glyphicon-volume-up"></span> + <span class="glyphicon-class">glyphicon glyphicon-volume-up</span> + </li> + <li> + <span class="glyphicon glyphicon-qrcode"></span> + <span class="glyphicon-class">glyphicon glyphicon-qrcode</span> + </li> + <li> + <span class="glyphicon glyphicon-barcode"></span> + <span class="glyphicon-class">glyphicon glyphicon-barcode</span> + </li> + <li> + <span class="glyphicon glyphicon-tag"></span> + <span class="glyphicon-class">glyphicon glyphicon-tag</span> + </li> + <li> + <span class="glyphicon glyphicon-tags"></span> + <span class="glyphicon-class">glyphicon glyphicon-tags</span> + </li> + <li> + <span class="glyphicon glyphicon-book"></span> + <span class="glyphicon-class">glyphicon glyphicon-book</span> + </li> + <li> + <span class="glyphicon glyphicon-bookmark"></span> + <span class="glyphicon-class">glyphicon glyphicon-bookmark</span> + </li> + <li> + <span class="glyphicon glyphicon-print"></span> + <span class="glyphicon-class">glyphicon glyphicon-print</span> + </li> + <li> + <span class="glyphicon glyphicon-camera"></span> + <span class="glyphicon-class">glyphicon glyphicon-camera</span> + </li> + <li> + <span class="glyphicon glyphicon-font"></span> + <span class="glyphicon-class">glyphicon glyphicon-font</span> + </li> + <li> + <span class="glyphicon glyphicon-bold"></span> + <span class="glyphicon-class">glyphicon glyphicon-bold</span> + </li> + <li> + <span class="glyphicon glyphicon-italic"></span> + <span class="glyphicon-class">glyphicon glyphicon-italic</span> + </li> + <li> + <span class="glyphicon glyphicon-text-height"></span> + <span class="glyphicon-class">glyphicon glyphicon-text-height</span> + </li> + <li> + <span class="glyphicon glyphicon-text-width"></span> + <span class="glyphicon-class">glyphicon glyphicon-text-width</span> + </li> + <li> + <span class="glyphicon glyphicon-align-left"></span> + <span class="glyphicon-class">glyphicon glyphicon-align-left</span> + </li> + <li> + <span class="glyphicon glyphicon-align-center"></span> + <span class="glyphicon-class">glyphicon glyphicon-align-center</span> + </li> + <li> + <span class="glyphicon glyphicon-align-right"></span> + <span class="glyphicon-class">glyphicon glyphicon-align-right</span> + </li> + <li> + <span class="glyphicon glyphicon-align-justify"></span> + <span class="glyphicon-class">glyphicon glyphicon-align-justify</span> + </li> + <li> + <span class="glyphicon glyphicon-list"></span> + <span class="glyphicon-class">glyphicon glyphicon-list</span> + </li> + <li> + <span class="glyphicon glyphicon-indent-left"></span> + <span class="glyphicon-class">glyphicon glyphicon-indent-left</span> + </li> + <li> + <span class="glyphicon glyphicon-indent-right"></span> + <span class="glyphicon-class">glyphicon glyphicon-indent-right</span> + </li> + <li> + <span class="glyphicon glyphicon-facetime-video"></span> + <span class="glyphicon-class">glyphicon glyphicon-facetime-video</span> + </li> + <li> + <span class="glyphicon glyphicon-picture"></span> + <span class="glyphicon-class">glyphicon glyphicon-picture</span> + </li> + <li> + <span class="glyphicon glyphicon-map-marker"></span> + <span class="glyphicon-class">glyphicon glyphicon-map-marker</span> + </li> + <li> + <span class="glyphicon glyphicon-adjust"></span> + <span class="glyphicon-class">glyphicon glyphicon-adjust</span> + </li> + <li> + <span class="glyphicon glyphicon-tint"></span> + <span class="glyphicon-class">glyphicon glyphicon-tint</span> + </li> + <li> + <span class="glyphicon glyphicon-edit"></span> + <span class="glyphicon-class">glyphicon glyphicon-edit</span> + </li> + <li> + <span class="glyphicon glyphicon-share"></span> + <span class="glyphicon-class">glyphicon glyphicon-share</span> + </li> + <li> + <span class="glyphicon glyphicon-check"></span> + <span class="glyphicon-class">glyphicon glyphicon-check</span> + </li> + <li> + <span class="glyphicon glyphicon-move"></span> + <span class="glyphicon-class">glyphicon glyphicon-move</span> + </li> + <li> + <span class="glyphicon glyphicon-step-backward"></span> + <span class="glyphicon-class">glyphicon glyphicon-step-backward</span> + </li> + <li> + <span class="glyphicon glyphicon-fast-backward"></span> + <span class="glyphicon-class">glyphicon glyphicon-fast-backward</span> + </li> + <li> + <span class="glyphicon glyphicon-backward"></span> + <span class="glyphicon-class">glyphicon glyphicon-backward</span> + </li> + <li> + <span class="glyphicon glyphicon-play"></span> + <span class="glyphicon-class">glyphicon glyphicon-play</span> + </li> + <li> + <span class="glyphicon glyphicon-pause"></span> + <span class="glyphicon-class">glyphicon glyphicon-pause</span> + </li> + <li> + <span class="glyphicon glyphicon-stop"></span> + <span class="glyphicon-class">glyphicon glyphicon-stop</span> + </li> + <li> + <span class="glyphicon glyphicon-forward"></span> + <span class="glyphicon-class">glyphicon glyphicon-forward</span> + </li> + <li> + <span class="glyphicon glyphicon-fast-forward"></span> + <span class="glyphicon-class">glyphicon glyphicon-fast-forward</span> + </li> + <li> + <span class="glyphicon glyphicon-step-forward"></span> + <span class="glyphicon-class">glyphicon glyphicon-step-forward</span> + </li> + <li> + <span class="glyphicon glyphicon-eject"></span> + <span class="glyphicon-class">glyphicon glyphicon-eject</span> + </li> + <li> + <span class="glyphicon glyphicon-chevron-left"></span> + <span class="glyphicon-class">glyphicon glyphicon-chevron-left</span> + </li> + <li> + <span class="glyphicon glyphicon-chevron-right"></span> + <span class="glyphicon-class">glyphicon glyphicon-chevron-right</span> + </li> + <li> + <span class="glyphicon glyphicon-plus-sign"></span> + <span class="glyphicon-class">glyphicon glyphicon-plus-sign</span> + </li> + <li> + <span class="glyphicon glyphicon-minus-sign"></span> + <span class="glyphicon-class">glyphicon glyphicon-minus-sign</span> + </li> + <li> + <span class="glyphicon glyphicon-remove-sign"></span> + <span class="glyphicon-class">glyphicon glyphicon-remove-sign</span> + </li> + <li> + <span class="glyphicon glyphicon-ok-sign"></span> + <span class="glyphicon-class">glyphicon glyphicon-ok-sign</span> + </li> + <li> + <span class="glyphicon glyphicon-question-sign"></span> + <span class="glyphicon-class">glyphicon glyphicon-question-sign</span> + </li> + <li> + <span class="glyphicon glyphicon-info-sign"></span> + <span class="glyphicon-class">glyphicon glyphicon-info-sign</span> + </li> + <li> + <span class="glyphicon glyphicon-screenshot"></span> + <span class="glyphicon-class">glyphicon glyphicon-screenshot</span> + </li> + <li> + <span class="glyphicon glyphicon-remove-circle"></span> + <span class="glyphicon-class">glyphicon glyphicon-remove-circle</span> + </li> + <li> + <span class="glyphicon glyphicon-ok-circle"></span> + <span class="glyphicon-class">glyphicon glyphicon-ok-circle</span> + </li> + <li> + <span class="glyphicon glyphicon-ban-circle"></span> + <span class="glyphicon-class">glyphicon glyphicon-ban-circle</span> + </li> + <li> + <span class="glyphicon glyphicon-arrow-left"></span> + <span class="glyphicon-class">glyphicon glyphicon-arrow-left</span> + </li> + <li> + <span class="glyphicon glyphicon-arrow-right"></span> + <span class="glyphicon-class">glyphicon glyphicon-arrow-right</span> + </li> + <li> + <span class="glyphicon glyphicon-arrow-up"></span> + <span class="glyphicon-class">glyphicon glyphicon-arrow-up</span> + </li> + <li> + <span class="glyphicon glyphicon-arrow-down"></span> + <span class="glyphicon-class">glyphicon glyphicon-arrow-down</span> + </li> + <li> + <span class="glyphicon glyphicon-share-alt"></span> + <span class="glyphicon-class">glyphicon glyphicon-share-alt</span> + </li> + <li> + <span class="glyphicon glyphicon-resize-full"></span> + <span class="glyphicon-class">glyphicon glyphicon-resize-full</span> + </li> + <li> + <span class="glyphicon glyphicon-resize-small"></span> + <span class="glyphicon-class">glyphicon glyphicon-resize-small</span> + </li> + <li> + <span class="glyphicon glyphicon-exclamation-sign"></span> + <span class="glyphicon-class">glyphicon glyphicon-exclamation-sign</span> + </li> + <li> + <span class="glyphicon glyphicon-gift"></span> + <span class="glyphicon-class">glyphicon glyphicon-gift</span> + </li> + <li> + <span class="glyphicon glyphicon-leaf"></span> + <span class="glyphicon-class">glyphicon glyphicon-leaf</span> + </li> + <li> + <span class="glyphicon glyphicon-fire"></span> + <span class="glyphicon-class">glyphicon glyphicon-fire</span> + </li> + <li> + <span class="glyphicon glyphicon-eye-open"></span> + <span class="glyphicon-class">glyphicon glyphicon-eye-open</span> + </li> + <li> + <span class="glyphicon glyphicon-eye-close"></span> + <span class="glyphicon-class">glyphicon glyphicon-eye-close</span> + </li> + <li> + <span class="glyphicon glyphicon-warning-sign"></span> + <span class="glyphicon-class">glyphicon glyphicon-warning-sign</span> + </li> + <li> + <span class="glyphicon glyphicon-plane"></span> + <span class="glyphicon-class">glyphicon glyphicon-plane</span> + </li> + <li> + <span class="glyphicon glyphicon-calendar"></span> + <span class="glyphicon-class">glyphicon glyphicon-calendar</span> + </li> + <li> + <span class="glyphicon glyphicon-random"></span> + <span class="glyphicon-class">glyphicon glyphicon-random</span> + </li> + <li> + <span class="glyphicon glyphicon-comment"></span> + <span class="glyphicon-class">glyphicon glyphicon-comment</span> + </li> + <li> + <span class="glyphicon glyphicon-magnet"></span> + <span class="glyphicon-class">glyphicon glyphicon-magnet</span> + </li> + <li> + <span class="glyphicon glyphicon-chevron-up"></span> + <span class="glyphicon-class">glyphicon glyphicon-chevron-up</span> + </li> + <li> + <span class="glyphicon glyphicon-chevron-down"></span> + <span class="glyphicon-class">glyphicon glyphicon-chevron-down</span> + </li> + <li> + <span class="glyphicon glyphicon-retweet"></span> + <span class="glyphicon-class">glyphicon glyphicon-retweet</span> + </li> + <li> + <span class="glyphicon glyphicon-shopping-cart"></span> + <span class="glyphicon-class">glyphicon glyphicon-shopping-cart</span> + </li> + <li> + <span class="glyphicon glyphicon-folder-close"></span> + <span class="glyphicon-class">glyphicon glyphicon-folder-close</span> + </li> + <li> + <span class="glyphicon glyphicon-folder-open"></span> + <span class="glyphicon-class">glyphicon glyphicon-folder-open</span> + </li> + <li> + <span class="glyphicon glyphicon-resize-vertical"></span> + <span class="glyphicon-class">glyphicon glyphicon-resize-vertical</span> + </li> + <li> + <span class="glyphicon glyphicon-resize-horizontal"></span> + <span class="glyphicon-class">glyphicon glyphicon-resize-horizontal</span> + </li> + <li> + <span class="glyphicon glyphicon-hdd"></span> + <span class="glyphicon-class">glyphicon glyphicon-hdd</span> + </li> + <li> + <span class="glyphicon glyphicon-bullhorn"></span> + <span class="glyphicon-class">glyphicon glyphicon-bullhorn</span> + </li> + <li> + <span class="glyphicon glyphicon-bell"></span> + <span class="glyphicon-class">glyphicon glyphicon-bell</span> + </li> + <li> + <span class="glyphicon glyphicon-certificate"></span> + <span class="glyphicon-class">glyphicon glyphicon-certificate</span> + </li> + <li> + <span class="glyphicon glyphicon-thumbs-up"></span> + <span class="glyphicon-class">glyphicon glyphicon-thumbs-up</span> + </li> + <li> + <span class="glyphicon glyphicon-thumbs-down"></span> + <span class="glyphicon-class">glyphicon glyphicon-thumbs-down</span> + </li> + <li> + <span class="glyphicon glyphicon-hand-right"></span> + <span class="glyphicon-class">glyphicon glyphicon-hand-right</span> + </li> + <li> + <span class="glyphicon glyphicon-hand-left"></span> + <span class="glyphicon-class">glyphicon glyphicon-hand-left</span> + </li> + <li> + <span class="glyphicon glyphicon-hand-up"></span> + <span class="glyphicon-class">glyphicon glyphicon-hand-up</span> + </li> + <li> + <span class="glyphicon glyphicon-hand-down"></span> + <span class="glyphicon-class">glyphicon glyphicon-hand-down</span> + </li> + <li> + <span class="glyphicon glyphicon-circle-arrow-right"></span> + <span class="glyphicon-class">glyphicon glyphicon-circle-arrow-right</span> + </li> + <li> + <span class="glyphicon glyphicon-circle-arrow-left"></span> + <span class="glyphicon-class">glyphicon glyphicon-circle-arrow-left</span> + </li> + <li> + <span class="glyphicon glyphicon-circle-arrow-up"></span> + <span class="glyphicon-class">glyphicon glyphicon-circle-arrow-up</span> + </li> + <li> + <span class="glyphicon glyphicon-circle-arrow-down"></span> + <span class="glyphicon-class">glyphicon glyphicon-circle-arrow-down</span> + </li> + <li> + <span class="glyphicon glyphicon-globe"></span> + <span class="glyphicon-class">glyphicon glyphicon-globe</span> + </li> + <li> + <span class="glyphicon glyphicon-wrench"></span> + <span class="glyphicon-class">glyphicon glyphicon-wrench</span> + </li> + <li> + <span class="glyphicon glyphicon-tasks"></span> + <span class="glyphicon-class">glyphicon glyphicon-tasks</span> + </li> + <li> + <span class="glyphicon glyphicon-filter"></span> + <span class="glyphicon-class">glyphicon glyphicon-filter</span> + </li> + <li> + <span class="glyphicon glyphicon-briefcase"></span> + <span class="glyphicon-class">glyphicon glyphicon-briefcase</span> + </li> + <li> + <span class="glyphicon glyphicon-fullscreen"></span> + <span class="glyphicon-class">glyphicon glyphicon-fullscreen</span> + </li> + <li> + <span class="glyphicon glyphicon-dashboard"></span> + <span class="glyphicon-class">glyphicon glyphicon-dashboard</span> + </li> + <li> + <span class="glyphicon glyphicon-paperclip"></span> + <span class="glyphicon-class">glyphicon glyphicon-paperclip</span> + </li> + <li> + <span class="glyphicon glyphicon-heart-empty"></span> + <span class="glyphicon-class">glyphicon glyphicon-heart-empty</span> + </li> + <li> + <span class="glyphicon glyphicon-link"></span> + <span class="glyphicon-class">glyphicon glyphicon-link</span> + </li> + <li> + <span class="glyphicon glyphicon-phone"></span> + <span class="glyphicon-class">glyphicon glyphicon-phone</span> + </li> + <li> + <span class="glyphicon glyphicon-pushpin"></span> + <span class="glyphicon-class">glyphicon glyphicon-pushpin</span> + </li> + <li> + <span class="glyphicon glyphicon-usd"></span> + <span class="glyphicon-class">glyphicon glyphicon-usd</span> + </li> + <li> + <span class="glyphicon glyphicon-gbp"></span> + <span class="glyphicon-class">glyphicon glyphicon-gbp</span> + </li> + <li> + <span class="glyphicon glyphicon-sort"></span> + <span class="glyphicon-class">glyphicon glyphicon-sort</span> + </li> + <li> + <span class="glyphicon glyphicon-sort-by-alphabet"></span> + <span class="glyphicon-class">glyphicon glyphicon-sort-by-alphabet</span> + </li> + <li> + <span class="glyphicon glyphicon-sort-by-alphabet-alt"></span> + <span class="glyphicon-class">glyphicon glyphicon-sort-by-alphabet-alt</span> + </li> + <li> + <span class="glyphicon glyphicon-sort-by-order"></span> + <span class="glyphicon-class">glyphicon glyphicon-sort-by-order</span> + </li> + <li> + <span class="glyphicon glyphicon-sort-by-order-alt"></span> + <span class="glyphicon-class">glyphicon glyphicon-sort-by-order-alt</span> + </li> + <li> + <span class="glyphicon glyphicon-sort-by-attributes"></span> + <span class="glyphicon-class">glyphicon glyphicon-sort-by-attributes</span> + </li> + <li> + <span class="glyphicon glyphicon-sort-by-attributes-alt"></span> + <span class="glyphicon-class">glyphicon glyphicon-sort-by-attributes-alt</span> + </li> + <li> + <span class="glyphicon glyphicon-unchecked"></span> + <span class="glyphicon-class">glyphicon glyphicon-unchecked</span> + </li> + <li> + <span class="glyphicon glyphicon-expand"></span> + <span class="glyphicon-class">glyphicon glyphicon-expand</span> + </li> + <li> + <span class="glyphicon glyphicon-collapse-down"></span> + <span class="glyphicon-class">glyphicon glyphicon-collapse-down</span> + </li> + <li> + <span class="glyphicon glyphicon-collapse-up"></span> + <span class="glyphicon-class">glyphicon glyphicon-collapse-up</span> + </li> + <li> + <span class="glyphicon glyphicon-log-in"></span> + <span class="glyphicon-class">glyphicon glyphicon-log-in</span> + </li> + <li> + <span class="glyphicon glyphicon-flash"></span> + <span class="glyphicon-class">glyphicon glyphicon-flash</span> + </li> + <li> + <span class="glyphicon glyphicon-log-out"></span> + <span class="glyphicon-class">glyphicon glyphicon-log-out</span> + </li> + <li> + <span class="glyphicon glyphicon-new-window"></span> + <span class="glyphicon-class">glyphicon glyphicon-new-window</span> + </li> + <li> + <span class="glyphicon glyphicon-record"></span> + <span class="glyphicon-class">glyphicon glyphicon-record</span> + </li> + <li> + <span class="glyphicon glyphicon-save"></span> + <span class="glyphicon-class">glyphicon glyphicon-save</span> + </li> + <li> + <span class="glyphicon glyphicon-open"></span> + <span class="glyphicon-class">glyphicon glyphicon-open</span> + </li> + <li> + <span class="glyphicon glyphicon-saved"></span> + <span class="glyphicon-class">glyphicon glyphicon-saved</span> + </li> + <li> + <span class="glyphicon glyphicon-import"></span> + <span class="glyphicon-class">glyphicon glyphicon-import</span> + </li> + <li> + <span class="glyphicon glyphicon-export"></span> + <span class="glyphicon-class">glyphicon glyphicon-export</span> + </li> + <li> + <span class="glyphicon glyphicon-send"></span> + <span class="glyphicon-class">glyphicon glyphicon-send</span> + </li> + <li> + <span class="glyphicon glyphicon-floppy-disk"></span> + <span class="glyphicon-class">glyphicon glyphicon-floppy-disk</span> + </li> + <li> + <span class="glyphicon glyphicon-floppy-saved"></span> + <span class="glyphicon-class">glyphicon glyphicon-floppy-saved</span> + </li> + <li> + <span class="glyphicon glyphicon-floppy-remove"></span> + <span class="glyphicon-class">glyphicon glyphicon-floppy-remove</span> + </li> + <li> + <span class="glyphicon glyphicon-floppy-save"></span> + <span class="glyphicon-class">glyphicon glyphicon-floppy-save</span> + </li> + <li> + <span class="glyphicon glyphicon-floppy-open"></span> + <span class="glyphicon-class">glyphicon glyphicon-floppy-open</span> + </li> + <li> + <span class="glyphicon glyphicon-credit-card"></span> + <span class="glyphicon-class">glyphicon glyphicon-credit-card</span> + </li> + <li> + <span class="glyphicon glyphicon-transfer"></span> + <span class="glyphicon-class">glyphicon glyphicon-transfer</span> + </li> + <li> + <span class="glyphicon glyphicon-cutlery"></span> + <span class="glyphicon-class">glyphicon glyphicon-cutlery</span> + </li> + <li> + <span class="glyphicon glyphicon-header"></span> + <span class="glyphicon-class">glyphicon glyphicon-header</span> + </li> + <li> + <span class="glyphicon glyphicon-compressed"></span> + <span class="glyphicon-class">glyphicon glyphicon-compressed</span> + </li> + <li> + <span class="glyphicon glyphicon-earphone"></span> + <span class="glyphicon-class">glyphicon glyphicon-earphone</span> + </li> + <li> + <span class="glyphicon glyphicon-phone-alt"></span> + <span class="glyphicon-class">glyphicon glyphicon-phone-alt</span> + </li> + <li> + <span class="glyphicon glyphicon-tower"></span> + <span class="glyphicon-class">glyphicon glyphicon-tower</span> + </li> + <li> + <span class="glyphicon glyphicon-stats"></span> + <span class="glyphicon-class">glyphicon glyphicon-stats</span> + </li> + <li> + <span class="glyphicon glyphicon-sd-video"></span> + <span class="glyphicon-class">glyphicon glyphicon-sd-video</span> + </li> + <li> + <span class="glyphicon glyphicon-hd-video"></span> + <span class="glyphicon-class">glyphicon glyphicon-hd-video</span> + </li> + <li> + <span class="glyphicon glyphicon-subtitles"></span> + <span class="glyphicon-class">glyphicon glyphicon-subtitles</span> + </li> + <li> + <span class="glyphicon glyphicon-sound-stereo"></span> + <span class="glyphicon-class">glyphicon glyphicon-sound-stereo</span> + </li> + <li> + <span class="glyphicon glyphicon-sound-dolby"></span> + <span class="glyphicon-class">glyphicon glyphicon-sound-dolby</span> + </li> + <li> + <span class="glyphicon glyphicon-sound-5-1"></span> + <span class="glyphicon-class">glyphicon glyphicon-sound-5-1</span> + </li> + <li> + <span class="glyphicon glyphicon-sound-6-1"></span> + <span class="glyphicon-class">glyphicon glyphicon-sound-6-1</span> + </li> + <li> + <span class="glyphicon glyphicon-sound-7-1"></span> + <span class="glyphicon-class">glyphicon glyphicon-sound-7-1</span> + </li> + <li> + <span class="glyphicon glyphicon-copyright-mark"></span> + <span class="glyphicon-class">glyphicon glyphicon-copyright-mark</span> + </li> + <li> + <span class="glyphicon glyphicon-registration-mark"></span> + <span class="glyphicon-class">glyphicon glyphicon-registration-mark</span> + </li> + <li> + <span class="glyphicon glyphicon-cloud-download"></span> + <span class="glyphicon-class">glyphicon glyphicon-cloud-download</span> + </li> + <li> + <span class="glyphicon glyphicon-cloud-upload"></span> + <span class="glyphicon-class">glyphicon glyphicon-cloud-upload</span> + </li> + <li> + <span class="glyphicon glyphicon-tree-conifer"></span> + <span class="glyphicon-class">glyphicon glyphicon-tree-conifer</span> + </li> + <li> + <span class="glyphicon glyphicon-tree-deciduous"></span> + <span class="glyphicon-class">glyphicon glyphicon-tree-deciduous</span> + </li> + <li> + <span class="glyphicon glyphicon-cd"></span> + <span class="glyphicon-class">glyphicon glyphicon-cd</span> + </li> + <li> + <span class="glyphicon glyphicon-save-file"></span> + <span class="glyphicon-class">glyphicon glyphicon-save-file</span> + </li> + <li> + <span class="glyphicon glyphicon-open-file"></span> + <span class="glyphicon-class">glyphicon glyphicon-open-file</span> + </li> + <li> + <span class="glyphicon glyphicon-level-up"></span> + <span class="glyphicon-class">glyphicon glyphicon-level-up</span> + </li> + <li> + <span class="glyphicon glyphicon-copy"></span> + <span class="glyphicon-class">glyphicon glyphicon-copy</span> + </li> + <li> + <span class="glyphicon glyphicon-paste"></span> + <span class="glyphicon-class">glyphicon glyphicon-paste</span> + </li> + <li> + <span class="glyphicon glyphicon-alert"></span> + <span class="glyphicon-class">glyphicon glyphicon-alert</span> + </li> + <li> + <span class="glyphicon glyphicon-equalizer"></span> + <span class="glyphicon-class">glyphicon glyphicon-equalizer</span> + </li> + <li> + <span class="glyphicon glyphicon-king"></span> + <span class="glyphicon-class">glyphicon glyphicon-king</span> + </li> + <li> + <span class="glyphicon glyphicon-queen"></span> + <span class="glyphicon-class">glyphicon glyphicon-queen</span> + </li> + <li> + <span class="glyphicon glyphicon-pawn"></span> + <span class="glyphicon-class">glyphicon glyphicon-pawn</span> + </li> + <li> + <span class="glyphicon glyphicon-bishop"></span> + <span class="glyphicon-class">glyphicon glyphicon-bishop</span> + </li> + <li> + <span class="glyphicon glyphicon-knight"></span> + <span class="glyphicon-class">glyphicon glyphicon-knight</span> + </li> + <li> + <span class="glyphicon glyphicon-baby-formula"></span> + <span class="glyphicon-class">glyphicon glyphicon-baby-formula</span> + </li> + <li> + <span class="glyphicon glyphicon-tent"></span> + <span class="glyphicon-class">glyphicon glyphicon-tent</span> + </li> + <li> + <span class="glyphicon glyphicon-blackboard"></span> + <span class="glyphicon-class">glyphicon glyphicon-blackboard</span> + </li> + <li> + <span class="glyphicon glyphicon-bed"></span> + <span class="glyphicon-class">glyphicon glyphicon-bed</span> + </li> + <li> + <span class="glyphicon glyphicon-apple"></span> + <span class="glyphicon-class">glyphicon glyphicon-apple</span> + </li> + <li> + <span class="glyphicon glyphicon-erase"></span> + <span class="glyphicon-class">glyphicon glyphicon-erase</span> + </li> + <li> + <span class="glyphicon glyphicon-hourglass"></span> + <span class="glyphicon-class">glyphicon glyphicon-hourglass</span> + </li> + <li> + <span class="glyphicon glyphicon-lamp"></span> + <span class="glyphicon-class">glyphicon glyphicon-lamp</span> + </li> + <li> + <span class="glyphicon glyphicon-duplicate"></span> + <span class="glyphicon-class">glyphicon glyphicon-duplicate</span> + </li> + <li> + <span class="glyphicon glyphicon-piggy-bank"></span> + <span class="glyphicon-class">glyphicon glyphicon-piggy-bank</span> + </li> + <li> + <span class="glyphicon glyphicon-scissors"></span> + <span class="glyphicon-class">glyphicon glyphicon-scissors</span> + </li> + <li> + <span class="glyphicon glyphicon-bitcoin"></span> + <span class="glyphicon-class">glyphicon glyphicon-bitcoin</span> + </li> + <li> + <span class="glyphicon glyphicon-btc"></span> + <span class="glyphicon-class">glyphicon glyphicon-btc</span> + </li> + <li> + <span class="glyphicon glyphicon-xbt"></span> + <span class="glyphicon-class">glyphicon glyphicon-xbt</span> + </li> + <li> + <span class="glyphicon glyphicon-yen"></span> + <span class="glyphicon-class">glyphicon glyphicon-yen</span> + </li> + <li> + <span class="glyphicon glyphicon-jpy"></span> + <span class="glyphicon-class">glyphicon glyphicon-jpy</span> + </li> + <li> + <span class="glyphicon glyphicon-ruble"></span> + <span class="glyphicon-class">glyphicon glyphicon-ruble</span> + </li> + <li> + <span class="glyphicon glyphicon-rub"></span> + <span class="glyphicon-class">glyphicon glyphicon-rub</span> + </li> + <li> + <span class="glyphicon glyphicon-scale"></span> + <span class="glyphicon-class">glyphicon glyphicon-scale</span> + </li> + <li> + <span class="glyphicon glyphicon-ice-lolly"></span> + <span class="glyphicon-class">glyphicon glyphicon-ice-lolly</span> + </li> + <li> + <span class="glyphicon glyphicon-ice-lolly-tasted"></span> + <span class="glyphicon-class">glyphicon glyphicon-ice-lolly-tasted</span> + </li> + <li> + <span class="glyphicon glyphicon-education"></span> + <span class="glyphicon-class">glyphicon glyphicon-education</span> + </li> + <li> + <span class="glyphicon glyphicon-option-horizontal"></span> + <span class="glyphicon-class">glyphicon glyphicon-option-horizontal</span> + </li> + <li> + <span class="glyphicon glyphicon-option-vertical"></span> + <span class="glyphicon-class">glyphicon glyphicon-option-vertical</span> + </li> + <li> + <span class="glyphicon glyphicon-menu-hamburger"></span> + <span class="glyphicon-class">glyphicon glyphicon-menu-hamburger</span> + </li> + <li> + <span class="glyphicon glyphicon-modal-window"></span> + <span class="glyphicon-class">glyphicon glyphicon-modal-window</span> + </li> + <li> + <span class="glyphicon glyphicon-oil"></span> + <span class="glyphicon-class">glyphicon glyphicon-oil</span> + </li> + <li> + <span class="glyphicon glyphicon-grain"></span> + <span class="glyphicon-class">glyphicon glyphicon-grain</span> + </li> + <li> + <span class="glyphicon glyphicon-sunglasses"></span> + <span class="glyphicon-class">glyphicon glyphicon-sunglasses</span> + </li> + <li> + <span class="glyphicon glyphicon-text-size"></span> + <span class="glyphicon-class">glyphicon glyphicon-text-size</span> + </li> + <li> + <span class="glyphicon glyphicon-text-color"></span> + <span class="glyphicon-class">glyphicon glyphicon-text-color</span> + </li> + <li> + <span class="glyphicon glyphicon-text-background"></span> + <span class="glyphicon-class">glyphicon glyphicon-text-background</span> + </li> + <li> + <span class="glyphicon glyphicon-object-align-top"></span> + <span class="glyphicon-class">glyphicon glyphicon-object-align-top</span> + </li> + <li> + <span class="glyphicon glyphicon-object-align-bottom"></span> + <span class="glyphicon-class">glyphicon glyphicon-object-align-bottom</span> + </li> + <li> + <span class="glyphicon glyphicon-object-align-horizontal"></span> + <span class="glyphicon-class">glyphicon glyphicon-object-align-horizontal</span> + </li> + <li> + <span class="glyphicon glyphicon-object-align-left"></span> + <span class="glyphicon-class">glyphicon glyphicon-object-align-left</span> + </li> + <li> + <span class="glyphicon glyphicon-object-align-vertical"></span> + <span class="glyphicon-class">glyphicon glyphicon-object-align-vertical</span> + </li> + <li> + <span class="glyphicon glyphicon-object-align-right"></span> + <span class="glyphicon-class">glyphicon glyphicon-object-align-right</span> + </li> + <li> + <span class="glyphicon glyphicon-triangle-right"></span> + <span class="glyphicon-class">glyphicon glyphicon-triangle-right</span> + </li> + <li> + <span class="glyphicon glyphicon-triangle-left"></span> + <span class="glyphicon-class">glyphicon glyphicon-triangle-left</span> + </li> + <li> + <span class="glyphicon glyphicon-triangle-bottom"></span> + <span class="glyphicon-class">glyphicon glyphicon-triangle-bottom</span> + </li> + <li> + <span class="glyphicon glyphicon-triangle-top"></span> + <span class="glyphicon-class">glyphicon glyphicon-triangle-top</span> + </li> + <li> + <span class="glyphicon glyphicon-console"></span> + <span class="glyphicon-class">glyphicon glyphicon-console</span> + </li> + <li> + <span class="glyphicon glyphicon-superscript"></span> + <span class="glyphicon-class">glyphicon glyphicon-superscript</span> + </li> + <li> + <span class="glyphicon glyphicon-subscript"></span> + <span class="glyphicon-class">glyphicon glyphicon-subscript</span> + </li> + <li> + <span class="glyphicon glyphicon-menu-left"></span> + <span class="glyphicon-class">glyphicon glyphicon-menu-left</span> + </li> + <li> + <span class="glyphicon glyphicon-menu-right"></span> + <span class="glyphicon-class">glyphicon glyphicon-menu-right</span> + </li> + <li> + <span class="glyphicon glyphicon-menu-down"></span> + <span class="glyphicon-class">glyphicon glyphicon-menu-down</span> + </li> + <li> + <span class="glyphicon glyphicon-menu-up"></span> + <span class="glyphicon-class">glyphicon glyphicon-menu-up</span> + </li> + </ul> + </div><!-- /#ion-icons --> + + </div><!-- /.tab-content --> + </div><!-- /.nav-tabs-custom --> + </div><!-- /.col --> + </div><!-- /.row --> + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + </body> +</html> diff --git a/theme/bootstrap/pages/UI/modals.html b/theme/bootstrap/pages/UI/modals.html new file mode 100644 index 0000000..4629d0d --- /dev/null +++ b/theme/bootstrap/pages/UI/modals.html @@ -0,0 +1,784 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Modals</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + + <style> + .example-modal .modal { + position: relative; + top: auto; + bottom: auto; + right: auto; + left: auto; + display: block; + z-index: 1; + } + .example-modal .modal { + background: transparent !important; + } + </style> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + AdminLTE Design Team + <small><i class="fa fa-clock-o"></i> 2 hours</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Developers + <small><i class="fa fa-clock-o"></i> Today</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Sales Department + <small><i class="fa fa-clock-o"></i> Yesterday</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Reviewers + <small><i class="fa fa-clock-o"></i> 2 days</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-users text-red"></i> 5 new members joined + </a> + </li> + + <li> + <a href="#"> + <i class="fa fa-shopping-cart text-green"></i> 25 sales made + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-user text-red"></i> You changed your username + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Create a nice theme + <small class="pull-right">40%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">40% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Some task I need to do + <small class="pull-right">60%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">60% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Make beautiful transitions + <small class="pull-right">80%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="../charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="../charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="../charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li class="active"><a href="modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="../examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="../examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="../examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="../examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="../examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="../examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="../examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Modals + <small>new</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">UI</a></li> + <li class="active">Modals</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="example-modal"> + <div class="modal"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> + <h4 class="modal-title">Modal Default</h4> + </div> + <div class="modal-body"> + <p>One fine body&hellip;</p> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default pull-left" data-dismiss="modal">Close</button> + <button type="button" class="btn btn-primary">Save changes</button> + </div> + </div><!-- /.modal-content --> + </div><!-- /.modal-dialog --> + </div><!-- /.modal --> + </div><!-- /.example-modal --> + + <div class="example-modal"> + <div class="modal modal-primary"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> + <h4 class="modal-title">Modal Primary</h4> + </div> + <div class="modal-body"> + <p>One fine body&hellip;</p> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-outline pull-left" data-dismiss="modal">Close</button> + <button type="button" class="btn btn-outline">Save changes</button> + </div> + </div><!-- /.modal-content --> + </div><!-- /.modal-dialog --> + </div><!-- /.modal --> + </div><!-- /.example-modal --> + + <div class="example-modal"> + <div class="modal modal-info"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> + <h4 class="modal-title">Modal Info</h4> + </div> + <div class="modal-body"> + <p>One fine body&hellip;</p> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-outline pull-left" data-dismiss="modal">Close</button> + <button type="button" class="btn btn-outline">Save changes</button> + </div> + </div><!-- /.modal-content --> + </div><!-- /.modal-dialog --> + </div><!-- /.modal --> + </div><!-- /.example-modal --> + + <div class="example-modal"> + <div class="modal modal-warning"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> + <h4 class="modal-title">Modal Warning</h4> + </div> + <div class="modal-body"> + <p>One fine body&hellip;</p> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-outline pull-left" data-dismiss="modal">Close</button> + <button type="button" class="btn btn-outline">Save changes</button> + </div> + </div><!-- /.modal-content --> + </div><!-- /.modal-dialog --> + </div><!-- /.modal --> + </div><!-- /.example-modal --> + + <div class="example-modal"> + <div class="modal modal-success"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> + <h4 class="modal-title">Modal Success</h4> + </div> + <div class="modal-body"> + <p>One fine body&hellip;</p> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-outline pull-left" data-dismiss="modal">Close</button> + <button type="button" class="btn btn-outline">Save changes</button> + </div> + </div><!-- /.modal-content --> + </div><!-- /.modal-dialog --> + </div><!-- /.modal --> + </div><!-- /.example-modal --> + + <div class="example-modal"> + <div class="modal modal-danger"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> + <h4 class="modal-title">Modal Danger</h4> + </div> + <div class="modal-body"> + <p>One fine body&hellip;</p> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-outline pull-left" data-dismiss="modal">Close</button> + <button type="button" class="btn btn-outline">Save changes</button> + </div> + </div><!-- /.modal-content --> + </div><!-- /.modal-dialog --> + </div><!-- /.modal --> + </div><!-- /.example-modal --> + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + </body> +</html> diff --git a/theme/bootstrap/pages/UI/sliders.html b/theme/bootstrap/pages/UI/sliders.html new file mode 100644 index 0000000..36ee836 --- /dev/null +++ b/theme/bootstrap/pages/UI/sliders.html @@ -0,0 +1,798 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | UI Sliders</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Ion Slider --> + <link rel="stylesheet" href="../../plugins/ionslider/ion.rangeSlider.css"> + <!-- ion slider Nice --> + <link rel="stylesheet" href="../../plugins/ionslider/ion.rangeSlider.skinNice.css"> + <!-- bootstrap slider --> + <link rel="stylesheet" href="../../plugins/bootstrap-slider/slider.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + AdminLTE Design Team + <small><i class="fa fa-clock-o"></i> 2 hours</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Developers + <small><i class="fa fa-clock-o"></i> Today</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Sales Department + <small><i class="fa fa-clock-o"></i> Yesterday</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Reviewers + <small><i class="fa fa-clock-o"></i> 2 days</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-users text-red"></i> 5 new members joined + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-shopping-cart text-green"></i> 25 sales made + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-user text-red"></i> You changed your username + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Create a nice theme + <small class="pull-right">40%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">40% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Some task I need to do + <small class="pull-right">60%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">60% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Make beautiful transitions + <small class="pull-right">80%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image "> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="../charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="../charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="../charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li class="active"><a href="sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="../examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="../examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="../examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="../examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="../examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="../examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="../examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Sliders + <small>range sliders</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">UI</a></li> + <li class="active">Sliders</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box box-primary"> + <div class="box-header"> + <h3 class="box-title">Ion Slider</h3> + </div><!-- /.box-header --> + <div class="box-body"> + <div class="row margin"> + <div class="col-sm-6"> + <input id="range_1" type="text" name="range_1" value=""> + </div> + + <div class="col-sm-6"> + <input id="range_2" type="text" name="range_2" value="1000;100000" data-type="double" data-step="500" data-postfix=" &euro;" data-from="30000" data-to="90000" data-hasgrid="true"> + </div> + </div> + <div class="row margin"> + <div class="col-sm-6"> + <input id="range_5" type="text" name="range_5" value=""> + </div> + <div class="col-sm-6"> + <input id="range_6" type="text" name="range_6" value=""> + </div> + </div> + <div class="row margin"> + <div class="col-sm-12"> + <input id="range_4" type="text" name="range_4" value="10000;100000"> + </div> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + + <div class="row"> + <div class="col-xs-12"> + <div class="box box-primary"> + <div class="box-header"> + <h3 class="box-title">Bootstrap Slider</h3> + </div><!-- /.box-header --> + <div class="box-body"> + <div class="row margin"> + <div class="col-sm-6"> + <input type="text" value="" class="slider form-control" data-slider-min="-200" data-slider-max="200" data-slider-step="5" data-slider-value="[-100,100]" data-slider-orientation="horizontal" data-slider-selection="before" data-slider-tooltip="show" data-slider-id="red"> + <p>data-slider-id="red"</p> + <input type="text" value="" class="slider form-control" data-slider-min="-200" data-slider-max="200" data-slider-step="5" data-slider-value="[-100,100]" data-slider-orientation="horizontal" data-slider-selection="before" data-slider-tooltip="show" data-slider-id="blue"> + <p>data-slider-id="blue"</p> + <input type="text" value="" class="slider form-control" data-slider-min="-200" data-slider-max="200" data-slider-step="5" data-slider-value="[-100,100]" data-slider-orientation="horizontal" data-slider-selection="before" data-slider-tooltip="show" data-slider-id="green"> + <p>data-slider-id="green"</p> + <input type="text" value="" class="slider form-control" data-slider-min="-200" data-slider-max="200" data-slider-step="5" data-slider-value="[-100,100]" data-slider-orientation="horizontal" data-slider-selection="before" data-slider-tooltip="show" data-slider-id="yellow"> + <p>data-slider-id="yellow"</p> + <input type="text" value="" class="slider form-control" data-slider-min="-200" data-slider-max="200" data-slider-step="5" data-slider-value="[-100,100]" data-slider-orientation="horizontal" data-slider-selection="before" data-slider-tooltip="show" data-slider-id="aqua"> + <p>data-slider-id="aqua"</p> + <input type="text" value="" class="slider form-control" data-slider-min="-200" data-slider-max="200" data-slider-step="5" data-slider-value="[-100,100]" data-slider-orientation="horizontal" data-slider-selection="before" data-slider-tooltip="show" data-slider-id="purple"> + <p style="margin-top: 10px">data-slider-id="purple"</p> + </div> + <div class="col-sm-6 text-center"> + <input type="text" value="" class="slider form-control" data-slider-min="-200" data-slider-max="200" data-slider-step="5" data-slider-value="[-100,100]" data-slider-orientation="vertical" data-slider-selection="before" data-slider-tooltip="show" data-slider-id="red"> + <input type="text" value="" class="slider form-control" data-slider-min="-200" data-slider-max="200" data-slider-step="5" data-slider-value="[-100,100]" data-slider-orientation="vertical" data-slider-selection="before" data-slider-tooltip="show" data-slider-id="blue"> + <input type="text" value="" class="slider form-control" data-slider-min="-200" data-slider-max="200" data-slider-step="5" data-slider-value="[-100,100]" data-slider-orientation="vertical" data-slider-selection="before" data-slider-tooltip="show" data-slider-id="green"> + <input type="text" value="" class="slider form-control" data-slider-min="-200" data-slider-max="200" data-slider-step="5" data-slider-value="[-100,100]" data-slider-orientation="vertical" data-slider-selection="before" data-slider-tooltip="show" data-slider-id="yellow"> + <input type="text" value="" class="slider form-control" data-slider-min="-200" data-slider-max="200" data-slider-step="5" data-slider-value="[-100,100]" data-slider-orientation="vertical" data-slider-selection="before" data-slider-tooltip="show" data-slider-id="aqua"> + <input type="text" value="" class="slider form-control" data-slider-min="-200" data-slider-max="200" data-slider-step="5" data-slider-value="[-100,100]" data-slider-orientation="vertical" data-slider-selection="before" data-slider-tooltip="show" data-slider-id="purple"> + </div> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + <!-- Ion Slider --> + <script src="../../plugins/ionslider/ion.rangeSlider.min.js"></script> + <!-- Bootstrap slider --> + <script src="../../plugins/bootstrap-slider/bootstrap-slider.js"></script> + <script> + $(function () { + /* BOOTSTRAP SLIDER */ + $('.slider').slider(); + + /* ION SLIDER */ + $("#range_1").ionRangeSlider({ + min: 0, + max: 5000, + from: 1000, + to: 4000, + type: 'double', + step: 1, + prefix: "$", + prettify: false, + hasGrid: true + }); + $("#range_2").ionRangeSlider(); + + $("#range_5").ionRangeSlider({ + min: 0, + max: 10, + type: 'single', + step: 0.1, + postfix: " mm", + prettify: false, + hasGrid: true + }); + $("#range_6").ionRangeSlider({ + min: -50, + max: 50, + from: 0, + type: 'single', + step: 1, + postfix: "°", + prettify: false, + hasGrid: true + }); + + $("#range_4").ionRangeSlider({ + type: "single", + step: 100, + postfix: " light years", + from: 55000, + hideMinMax: true, + hideFromTo: false + }); + $("#range_3").ionRangeSlider({ + type: "double", + postfix: " miles", + step: 10000, + from: 25000000, + to: 35000000, + onChange: function (obj) { + var t = ""; + for (var prop in obj) { + t += prop + ": " + obj[prop] + "\r\n"; + } + $("#result").html(t); + }, + onLoad: function (obj) { + // + } + }); + }); + </script> + </body> +</html> diff --git a/theme/bootstrap/pages/UI/timeline.html b/theme/bootstrap/pages/UI/timeline.html new file mode 100644 index 0000000..61fc684 --- /dev/null +++ b/theme/bootstrap/pages/UI/timeline.html @@ -0,0 +1,805 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Timeline</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + AdminLTE Design Team + <small><i class="fa fa-clock-o"></i> 2 hours</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Developers + <small><i class="fa fa-clock-o"></i> Today</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Sales Department + <small><i class="fa fa-clock-o"></i> Yesterday</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Reviewers + <small><i class="fa fa-clock-o"></i> 2 days</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-users text-red"></i> 5 new members joined + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-shopping-cart text-green"></i> 25 sales made + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-user text-red"></i> You changed your username + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Create a nice theme + <small class="pull-right">40%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">40% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Some task I need to do + <small class="pull-right">60%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">60% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Make beautiful transitions + <small class="pull-right">80%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="../charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="../charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="../charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li class="active"><a href="timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="../examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="../examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="../examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="../examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="../examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="../examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="../examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Timeline + <small>example</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">UI</a></li> + <li class="active">Timeline</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + + <!-- row --> + <div class="row"> + <div class="col-md-12"> + <!-- The time line --> + <ul class="timeline"> + <!-- timeline time label --> + <li class="time-label"> + <span class="bg-red"> + 10 Feb. 2014 + </span> + </li> + <!-- /.timeline-label --> + <!-- timeline item --> + <li> + <i class="fa fa-envelope bg-blue"></i> + <div class="timeline-item"> + <span class="time"><i class="fa fa-clock-o"></i> 12:05</span> + <h3 class="timeline-header"><a href="#">Support Team</a> sent you an email</h3> + <div class="timeline-body"> + Etsy doostang zoodles disqus groupon greplin oooj voxy zoodles, + weebly ning heekya handango imeem plugg dopplr jibjab, movity + jajah plickers sifteo edmodo ifttt zimbra. Babblely odeo kaboodle + quora plaxo ideeli hulu weebly balihoo... + </div> + <div class="timeline-footer"> + <a class="btn btn-primary btn-xs">Read more</a> + <a class="btn btn-danger btn-xs">Delete</a> + </div> + </div> + </li> + <!-- END timeline item --> + <!-- timeline item --> + <li> + <i class="fa fa-user bg-aqua"></i> + <div class="timeline-item"> + <span class="time"><i class="fa fa-clock-o"></i> 5 mins ago</span> + <h3 class="timeline-header no-border"><a href="#">Sarah Young</a> accepted your friend request</h3> + </div> + </li> + <!-- END timeline item --> + <!-- timeline item --> + <li> + <i class="fa fa-comments bg-yellow"></i> + <div class="timeline-item"> + <span class="time"><i class="fa fa-clock-o"></i> 27 mins ago</span> + <h3 class="timeline-header"><a href="#">Jay White</a> commented on your post</h3> + <div class="timeline-body"> + Take me to your leader! + Switzerland is small and neutral! + We are more like Germany, ambitious and misunderstood! + </div> + <div class="timeline-footer"> + <a class="btn btn-warning btn-flat btn-xs">View comment</a> + </div> + </div> + </li> + <!-- END timeline item --> + <!-- timeline time label --> + <li class="time-label"> + <span class="bg-green"> + 3 Jan. 2014 + </span> + </li> + <!-- /.timeline-label --> + <!-- timeline item --> + <li> + <i class="fa fa-camera bg-purple"></i> + <div class="timeline-item"> + <span class="time"><i class="fa fa-clock-o"></i> 2 days ago</span> + <h3 class="timeline-header"><a href="#">Mina Lee</a> uploaded new photos</h3> + <div class="timeline-body"> + <img src="http://placehold.it/150x100" alt="..." class="margin"> + <img src="http://placehold.it/150x100" alt="..." class="margin"> + <img src="http://placehold.it/150x100" alt="..." class="margin"> + <img src="http://placehold.it/150x100" alt="..." class="margin"> + </div> + </div> + </li> + <!-- END timeline item --> + <!-- timeline item --> + <li> + <i class="fa fa-video-camera bg-maroon"></i> + <div class="timeline-item"> + <span class="time"><i class="fa fa-clock-o"></i> 5 days ago</span> + <h3 class="timeline-header"><a href="#">Mr. Doe</a> shared a video</h3> + <div class="timeline-body"> + <div class="embed-responsive embed-responsive-16by9"> + <iframe class="embed-responsive-item" src="https://www.youtube.com/embed/tMWkeBIohBs" frameborder="0" allowfullscreen></iframe> + </div> + </div> + <div class="timeline-footer"> + <a href="#" class="btn btn-xs bg-maroon">See comments</a> + </div> + </div> + </li> + <!-- END timeline item --> + <li> + <i class="fa fa-clock-o bg-gray"></i> + </li> + </ul> + </div><!-- /.col --> + </div><!-- /.row --> + + <div class="row" style="margin-top: 10px;"> + <div class="col-md-12"> + <div class="box box-primary"> + <div class="box-header"> + <h3 class="box-title"><i class="fa fa-code"></i> Timeline Markup</h3> + </div> + <div class="box-body"> + <pre style="font-weight: 600;"> +&lt;ul class="timeline"> + + &lt;!-- timeline time label --> + &lt;li class="time-label"> + &lt;span class="bg-red"> + 10 Feb. 2014 + &lt;/span> + &lt;/li> + &lt;!-- /.timeline-label --> + + &lt;!-- timeline item --> + &lt;li> + &lt;!-- timeline icon --> + &lt;i class="fa fa-envelope bg-blue">&lt;/i> + &lt;div class="timeline-item"> + &lt;span class="time">&lt;i class="fa fa-clock-o">&lt;/i> 12:05&lt;/span> + + &lt;h3 class="timeline-header">&lt;a href="#">Support Team&lt;/a> ...&lt;/h3> + + &lt;div class="timeline-body"> + ... + Content goes here + &lt;/div> + + &lt;div class="timeline-footer"> + &lt;a class="btn btn-primary btn-xs">...&lt;/a> + &lt;/div> + &lt;/div> + &lt;/li> + &lt;!-- END timeline item --> + + ... + +&lt;/ul> + </pre> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + </body> +</html> diff --git a/theme/bootstrap/pages/calendar.html b/theme/bootstrap/pages/calendar.html new file mode 100644 index 0000000..5017022 --- /dev/null +++ b/theme/bootstrap/pages/calendar.html @@ -0,0 +1,879 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Calendar</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- fullCalendar 2.2.5--> + <link rel="stylesheet" href="../plugins/fullcalendar/fullcalendar.min.css"> + <link rel="stylesheet" href="../plugins/fullcalendar/fullcalendar.print.css" media="print"> + <!-- Theme style --> + <link rel="stylesheet" href="../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + AdminLTE Design Team + <small><i class="fa fa-clock-o"></i> 2 hours</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Developers + <small><i class="fa fa-clock-o"></i> Today</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Sales Department + <small><i class="fa fa-clock-o"></i> Yesterday</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Reviewers + <small><i class="fa fa-clock-o"></i> 2 days</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-users text-red"></i> 5 new members joined + </a> + </li> + + <li> + <a href="#"> + <i class="fa fa-shopping-cart text-green"></i> 25 sales made + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-user text-red"></i> You changed your username + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Create a nice theme + <small class="pull-right">40%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">40% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Some task I need to do + <small class="pull-right">60%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">60% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Make beautiful transitions + <small class="pull-right">80%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li class="active"> + <a href="calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Calendar + <small>Control panel</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li class="active">Calendar</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-md-3"> + <div class="box box-solid"> + <div class="box-header with-border"> + <h4 class="box-title">Draggable Events</h4> + </div> + <div class="box-body"> + <!-- the events --> + <div id="external-events"> + <div class="external-event bg-green">Lunch</div> + <div class="external-event bg-yellow">Go home</div> + <div class="external-event bg-aqua">Do homework</div> + <div class="external-event bg-light-blue">Work on UI design</div> + <div class="external-event bg-red">Sleep tight</div> + <div class="checkbox"> + <label for="drop-remove"> + <input type="checkbox" id="drop-remove"> + remove after drop + </label> + </div> + </div> + </div><!-- /.box-body --> + </div><!-- /. box --> + <div class="box box-solid"> + <div class="box-header with-border"> + <h3 class="box-title">Create Event</h3> + </div> + <div class="box-body"> + <div class="btn-group" style="width: 100%; margin-bottom: 10px;"> + <!--<button type="button" id="color-chooser-btn" class="btn btn-info btn-block dropdown-toggle" data-toggle="dropdown">Color <span class="caret"></span></button>--> + <ul class="fc-color-picker" id="color-chooser"> + <li><a class="text-aqua" href="#"><i class="fa fa-square"></i></a></li> + <li><a class="text-blue" href="#"><i class="fa fa-square"></i></a></li> + <li><a class="text-light-blue" href="#"><i class="fa fa-square"></i></a></li> + <li><a class="text-teal" href="#"><i class="fa fa-square"></i></a></li> + <li><a class="text-yellow" href="#"><i class="fa fa-square"></i></a></li> + <li><a class="text-orange" href="#"><i class="fa fa-square"></i></a></li> + <li><a class="text-green" href="#"><i class="fa fa-square"></i></a></li> + <li><a class="text-lime" href="#"><i class="fa fa-square"></i></a></li> + <li><a class="text-red" href="#"><i class="fa fa-square"></i></a></li> + <li><a class="text-purple" href="#"><i class="fa fa-square"></i></a></li> + <li><a class="text-fuchsia" href="#"><i class="fa fa-square"></i></a></li> + <li><a class="text-muted" href="#"><i class="fa fa-square"></i></a></li> + <li><a class="text-navy" href="#"><i class="fa fa-square"></i></a></li> + </ul> + </div><!-- /btn-group --> + <div class="input-group"> + <input id="new-event" type="text" class="form-control" placeholder="Event Title"> + <div class="input-group-btn"> + <button id="add-new-event" type="button" class="btn btn-primary btn-flat">Add</button> + </div><!-- /btn-group --> + </div><!-- /input-group --> + </div> + </div> + </div><!-- /.col --> + <div class="col-md-9"> + <div class="box box-primary"> + <div class="box-body no-padding"> + <!-- THE CALENDAR --> + <div id="calendar"></div> + </div><!-- /.box-body --> + </div><!-- /. box --> + </div><!-- /.col --> + </div><!-- /.row --> + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../bootstrap/js/bootstrap.min.js"></script> + <!-- jQuery UI 1.11.4 --> + <script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script> + <!-- Slimscroll --> + <script src="../plugins/slimScroll/jquery.slimscroll.min.js"></script> + <!-- FastClick --> + <script src="../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../dist/js/demo.js"></script> + <!-- fullCalendar 2.2.5 --> + <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.2/moment.min.js"></script> + <script src="../plugins/fullcalendar/fullcalendar.min.js"></script> + <!-- Page specific script --> + <script> + $(function () { + + /* initialize the external events + -----------------------------------------------------------------*/ + function ini_events(ele) { + ele.each(function () { + + // create an Event Object (http://arshaw.com/fullcalendar/docs/event_data/Event_Object/) + // it doesn't need to have a start or end + var eventObject = { + title: $.trim($(this).text()) // use the element's text as the event title + }; + + // store the Event Object in the DOM element so we can get to it later + $(this).data('eventObject', eventObject); + + // make the event draggable using jQuery UI + $(this).draggable({ + zIndex: 1070, + revert: true, // will cause the event to go back to its + revertDuration: 0 // original position after the drag + }); + + }); + } + ini_events($('#external-events div.external-event')); + + /* initialize the calendar + -----------------------------------------------------------------*/ + //Date for the calendar events (dummy data) + var date = new Date(); + var d = date.getDate(), + m = date.getMonth(), + y = date.getFullYear(); + $('#calendar').fullCalendar({ + header: { + left: 'prev,next today', + center: 'title', + right: 'month,agendaWeek,agendaDay' + }, + buttonText: { + today: 'today', + month: 'month', + week: 'week', + day: 'day' + }, + //Random default events + events: [ + { + title: 'All Day Event', + start: new Date(y, m, 1), + backgroundColor: "#f56954", //red + borderColor: "#f56954" //red + }, + { + title: 'Long Event', + start: new Date(y, m, d - 5), + end: new Date(y, m, d - 2), + backgroundColor: "#f39c12", //yellow + borderColor: "#f39c12" //yellow + }, + { + title: 'Meeting', + start: new Date(y, m, d, 10, 30), + allDay: false, + backgroundColor: "#0073b7", //Blue + borderColor: "#0073b7" //Blue + }, + { + title: 'Lunch', + start: new Date(y, m, d, 12, 0), + end: new Date(y, m, d, 14, 0), + allDay: false, + backgroundColor: "#00c0ef", //Info (aqua) + borderColor: "#00c0ef" //Info (aqua) + }, + { + title: 'Birthday Party', + start: new Date(y, m, d + 1, 19, 0), + end: new Date(y, m, d + 1, 22, 30), + allDay: false, + backgroundColor: "#00a65a", //Success (green) + borderColor: "#00a65a" //Success (green) + }, + { + title: 'Click for Google', + start: new Date(y, m, 28), + end: new Date(y, m, 29), + url: 'http://google.com/', + backgroundColor: "#3c8dbc", //Primary (light-blue) + borderColor: "#3c8dbc" //Primary (light-blue) + } + ], + editable: true, + droppable: true, // this allows things to be dropped onto the calendar !!! + drop: function (date, allDay) { // this function is called when something is dropped + + // retrieve the dropped element's stored Event Object + var originalEventObject = $(this).data('eventObject'); + + // we need to copy it, so that multiple events don't have a reference to the same object + var copiedEventObject = $.extend({}, originalEventObject); + + // assign it the date that was reported + copiedEventObject.start = date; + copiedEventObject.allDay = allDay; + copiedEventObject.backgroundColor = $(this).css("background-color"); + copiedEventObject.borderColor = $(this).css("border-color"); + + // render the event on the calendar + // the last `true` argument determines if the event "sticks" (http://arshaw.com/fullcalendar/docs/event_rendering/renderEvent/) + $('#calendar').fullCalendar('renderEvent', copiedEventObject, true); + + // is the "remove after drop" checkbox checked? + if ($('#drop-remove').is(':checked')) { + // if so, remove the element from the "Draggable Events" list + $(this).remove(); + } + + } + }); + + /* ADDING EVENTS */ + var currColor = "#3c8dbc"; //Red by default + //Color chooser button + var colorChooser = $("#color-chooser-btn"); + $("#color-chooser > li > a").click(function (e) { + e.preventDefault(); + //Save color + currColor = $(this).css("color"); + //Add color effect to button + $('#add-new-event').css({"background-color": currColor, "border-color": currColor}); + }); + $("#add-new-event").click(function (e) { + e.preventDefault(); + //Get value and make sure it is not null + var val = $("#new-event").val(); + if (val.length == 0) { + return; + } + + //Create events + var event = $("<div />"); + event.css({"background-color": currColor, "border-color": currColor, "color": "#fff"}).addClass("external-event"); + event.html(val); + $('#external-events').prepend(event); + + //Add draggable funtionality + ini_events(event); + + //Remove event from text input + $("#new-event").val(""); + }); + }); + </script> + </body> +</html> diff --git a/theme/bootstrap/pages/charts/chartjs.html b/theme/bootstrap/pages/charts/chartjs.html new file mode 100644 index 0000000..330f97f --- /dev/null +++ b/theme/bootstrap/pages/charts/chartjs.html @@ -0,0 +1,822 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | ChartJS</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li class="active"><a href="chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="../UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="../UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="../UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="../UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="../UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="../examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="../examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="../examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="../examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="../examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="../examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="../examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + ChartJS + <small>Preview sample</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">Charts</a></li> + <li class="active">ChartJS</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-md-6"> + <!-- AREA CHART --> + <div class="box box-primary"> + <div class="box-header with-border"> + <h3 class="box-title">Area Chart</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div> + <div class="box-body"> + <div class="chart"> + <canvas id="areaChart" style="height:250px"></canvas> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + + <!-- DONUT CHART --> + <div class="box box-danger"> + <div class="box-header with-border"> + <h3 class="box-title">Donut Chart</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div> + <div class="box-body"> + <canvas id="pieChart" style="height:250px"></canvas> + </div><!-- /.box-body --> + </div><!-- /.box --> + + </div><!-- /.col (LEFT) --> + <div class="col-md-6"> + <!-- LINE CHART --> + <div class="box box-info"> + <div class="box-header with-border"> + <h3 class="box-title">Line Chart</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div> + <div class="box-body"> + <div class="chart"> + <canvas id="lineChart" style="height:250px"></canvas> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + + <!-- BAR CHART --> + <div class="box box-success"> + <div class="box-header with-border"> + <h3 class="box-title">Bar Chart</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div> + <div class="box-body"> + <div class="chart"> + <canvas id="barChart" style="height:230px"></canvas> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + + </div><!-- /.col (RIGHT) --> + </div><!-- /.row --> + + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- ChartJS 1.0.1 --> + <script src="../../plugins/chartjs/Chart.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + <!-- page script --> + <script> + $(function () { + /* ChartJS + * ------- + * Here we will create a few charts using ChartJS + */ + + //-------------- + //- AREA CHART - + //-------------- + + // Get context with jQuery - using jQuery's .get() method. + var areaChartCanvas = $("#areaChart").get(0).getContext("2d"); + // This will get the first returned node in the jQuery collection. + var areaChart = new Chart(areaChartCanvas); + + var areaChartData = { + labels: ["January", "February", "March", "April", "May", "June", "July"], + datasets: [ + { + label: "Electronics", + fillColor: "rgba(210, 214, 222, 1)", + strokeColor: "rgba(210, 214, 222, 1)", + pointColor: "rgba(210, 214, 222, 1)", + pointStrokeColor: "#c1c7d1", + pointHighlightFill: "#fff", + pointHighlightStroke: "rgba(220,220,220,1)", + data: [65, 59, 80, 81, 56, 55, 40] + }, + { + label: "Digital Goods", + fillColor: "rgba(60,141,188,0.9)", + strokeColor: "rgba(60,141,188,0.8)", + pointColor: "#3b8bba", + pointStrokeColor: "rgba(60,141,188,1)", + pointHighlightFill: "#fff", + pointHighlightStroke: "rgba(60,141,188,1)", + data: [28, 48, 40, 19, 86, 27, 90] + } + ] + }; + + var areaChartOptions = { + //Boolean - If we should show the scale at all + showScale: true, + //Boolean - Whether grid lines are shown across the chart + scaleShowGridLines: false, + //String - Colour of the grid lines + scaleGridLineColor: "rgba(0,0,0,.05)", + //Number - Width of the grid lines + scaleGridLineWidth: 1, + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + //Boolean - Whether the line is curved between points + bezierCurve: true, + //Number - Tension of the bezier curve between points + bezierCurveTension: 0.3, + //Boolean - Whether to show a dot for each point + pointDot: false, + //Number - Radius of each point dot in pixels + pointDotRadius: 4, + //Number - Pixel width of point dot stroke + pointDotStrokeWidth: 1, + //Number - amount extra to add to the radius to cater for hit detection outside the drawn point + pointHitDetectionRadius: 20, + //Boolean - Whether to show a stroke for datasets + datasetStroke: true, + //Number - Pixel width of dataset stroke + datasetStrokeWidth: 2, + //Boolean - Whether to fill the dataset with a color + datasetFill: true, + //String - A legend template + legendTemplate: "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].lineColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>", + //Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container + maintainAspectRatio: true, + //Boolean - whether to make the chart responsive to window resizing + responsive: true + }; + + //Create the line chart + areaChart.Line(areaChartData, areaChartOptions); + + //------------- + //- LINE CHART - + //-------------- + var lineChartCanvas = $("#lineChart").get(0).getContext("2d"); + var lineChart = new Chart(lineChartCanvas); + var lineChartOptions = areaChartOptions; + lineChartOptions.datasetFill = false; + lineChart.Line(areaChartData, lineChartOptions); + + //------------- + //- PIE CHART - + //------------- + // Get context with jQuery - using jQuery's .get() method. + var pieChartCanvas = $("#pieChart").get(0).getContext("2d"); + var pieChart = new Chart(pieChartCanvas); + var PieData = [ + { + value: 700, + color: "#f56954", + highlight: "#f56954", + label: "Chrome" + }, + { + value: 500, + color: "#00a65a", + highlight: "#00a65a", + label: "IE" + }, + { + value: 400, + color: "#f39c12", + highlight: "#f39c12", + label: "FireFox" + }, + { + value: 600, + color: "#00c0ef", + highlight: "#00c0ef", + label: "Safari" + }, + { + value: 300, + color: "#3c8dbc", + highlight: "#3c8dbc", + label: "Opera" + }, + { + value: 100, + color: "#d2d6de", + highlight: "#d2d6de", + label: "Navigator" + } + ]; + var pieOptions = { + //Boolean - Whether we should show a stroke on each segment + segmentShowStroke: true, + //String - The colour of each segment stroke + segmentStrokeColor: "#fff", + //Number - The width of each segment stroke + segmentStrokeWidth: 2, + //Number - The percentage of the chart that we cut out of the middle + percentageInnerCutout: 50, // This is 0 for Pie charts + //Number - Amount of animation steps + animationSteps: 100, + //String - Animation easing effect + animationEasing: "easeOutBounce", + //Boolean - Whether we animate the rotation of the Doughnut + animateRotate: true, + //Boolean - Whether we animate scaling the Doughnut from the centre + animateScale: false, + //Boolean - whether to make the chart responsive to window resizing + responsive: true, + // Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container + maintainAspectRatio: true, + //String - A legend template + legendTemplate: "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>" + }; + //Create pie or douhnut chart + // You can switch between pie and douhnut using the method below. + pieChart.Doughnut(PieData, pieOptions); + + //------------- + //- BAR CHART - + //------------- + var barChartCanvas = $("#barChart").get(0).getContext("2d"); + var barChart = new Chart(barChartCanvas); + var barChartData = areaChartData; + barChartData.datasets[1].fillColor = "#00a65a"; + barChartData.datasets[1].strokeColor = "#00a65a"; + barChartData.datasets[1].pointColor = "#00a65a"; + var barChartOptions = { + //Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value + scaleBeginAtZero: true, + //Boolean - Whether grid lines are shown across the chart + scaleShowGridLines: true, + //String - Colour of the grid lines + scaleGridLineColor: "rgba(0,0,0,.05)", + //Number - Width of the grid lines + scaleGridLineWidth: 1, + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + //Boolean - If there is a stroke on each bar + barShowStroke: true, + //Number - Pixel width of the bar stroke + barStrokeWidth: 2, + //Number - Spacing between each of the X value sets + barValueSpacing: 5, + //Number - Spacing between data sets within X values + barDatasetSpacing: 1, + //String - A legend template + legendTemplate: "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].fillColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>", + //Boolean - whether to make the chart responsive + responsive: true, + maintainAspectRatio: true + }; + + barChartOptions.datasetFill = false; + barChart.Bar(barChartData, barChartOptions); + }); + </script> + </body> +</html> diff --git a/theme/bootstrap/pages/charts/flot.html b/theme/bootstrap/pages/charts/flot.html new file mode 100644 index 0000000..b679f35 --- /dev/null +++ b/theme/bootstrap/pages/charts/flot.html @@ -0,0 +1,1015 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Flot Charts</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + AdminLTE Design Team + <small><i class="fa fa-clock-o"></i> 2 hours</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Developers + <small><i class="fa fa-clock-o"></i> Today</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Sales Department + <small><i class="fa fa-clock-o"></i> Yesterday</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Reviewers + <small><i class="fa fa-clock-o"></i> 2 days</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-users text-red"></i> 5 new members joined + </a> + </li> + + <li> + <a href="#"> + <i class="fa fa-shopping-cart text-green"></i> 25 sales made + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-user text-red"></i> You changed your username + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Create a nice theme + <small class="pull-right">40%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">40% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Some task I need to do + <small class="pull-right">60%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">60% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Make beautiful transitions + <small class="pull-right">80%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li class="active"><a href="flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="../UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="../UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="../UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="../UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="../UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="../examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="../examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="../examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="../examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="../examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="../examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="../examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Flot Charts + <small>preview sample</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">Charts</a></li> + <li class="active">Flot</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-xs-12"> + <!-- interactive chart --> + <div class="box box-primary"> + <div class="box-header with-border"> + <i class="fa fa-bar-chart-o"></i> + <h3 class="box-title">Interactive Area Chart</h3> + <div class="box-tools pull-right"> + Real time + <div class="btn-group" id="realtime" data-toggle="btn-toggle"> + <button type="button" class="btn btn-default btn-xs active" data-toggle="on">On</button> + <button type="button" class="btn btn-default btn-xs" data-toggle="off">Off</button> + </div> + </div> + </div> + <div class="box-body"> + <div id="interactive" style="height: 300px;"></div> + </div><!-- /.box-body--> + </div><!-- /.box --> + + </div><!-- /.col --> + </div><!-- /.row --> + + <div class="row"> + <div class="col-md-6"> + <!-- Line chart --> + <div class="box box-primary"> + <div class="box-header with-border"> + <i class="fa fa-bar-chart-o"></i> + <h3 class="box-title">Line Chart</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div> + <div class="box-body"> + <div id="line-chart" style="height: 300px;"></div> + </div><!-- /.box-body--> + </div><!-- /.box --> + + <!-- Area chart --> + <div class="box box-primary"> + <div class="box-header with-border"> + <i class="fa fa-bar-chart-o"></i> + <h3 class="box-title">Full Width Area Chart</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div> + <div class="box-body"> + <div id="area-chart" style="height: 338px;" class="full-width-chart"></div> + </div><!-- /.box-body--> + </div><!-- /.box --> + + </div><!-- /.col --> + + <div class="col-md-6"> + <!-- Bar chart --> + <div class="box box-primary"> + <div class="box-header with-border"> + <i class="fa fa-bar-chart-o"></i> + <h3 class="box-title">Bar Chart</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div> + <div class="box-body"> + <div id="bar-chart" style="height: 300px;"></div> + </div><!-- /.box-body--> + </div><!-- /.box --> + + <!-- Donut chart --> + <div class="box box-primary"> + <div class="box-header with-border"> + <i class="fa fa-bar-chart-o"></i> + <h3 class="box-title">Donut Chart</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div> + <div class="box-body"> + <div id="donut-chart" style="height: 300px;"></div> + </div><!-- /.box-body--> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + </section><!-- /.content --> + + </div><!-- /.content-wrapper --> + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + <!-- FLOT CHARTS --> + <script src="../../plugins/flot/jquery.flot.min.js"></script> + <!-- FLOT RESIZE PLUGIN - allows the chart to redraw when the window is resized --> + <script src="../../plugins/flot/jquery.flot.resize.min.js"></script> + <!-- FLOT PIE PLUGIN - also used to draw donut charts --> + <script src="../../plugins/flot/jquery.flot.pie.min.js"></script> + <!-- FLOT CATEGORIES PLUGIN - Used to draw bar charts --> + <script src="../../plugins/flot/jquery.flot.categories.min.js"></script> + <!-- Page script --> + <script> + $(function () { + /* + * Flot Interactive Chart + * ----------------------- + */ + // We use an inline data source in the example, usually data would + // be fetched from a server + var data = [], totalPoints = 100; + function getRandomData() { + + if (data.length > 0) + data = data.slice(1); + + // Do a random walk + while (data.length < totalPoints) { + + var prev = data.length > 0 ? data[data.length - 1] : 50, + y = prev + Math.random() * 10 - 5; + + if (y < 0) { + y = 0; + } else if (y > 100) { + y = 100; + } + + data.push(y); + } + + // Zip the generated y values with the x values + var res = []; + for (var i = 0; i < data.length; ++i) { + res.push([i, data[i]]); + } + + return res; + } + + var interactive_plot = $.plot("#interactive", [getRandomData()], { + grid: { + borderColor: "#f3f3f3", + borderWidth: 1, + tickColor: "#f3f3f3" + }, + series: { + shadowSize: 0, // Drawing is faster without shadows + color: "#3c8dbc" + }, + lines: { + fill: true, //Converts the line chart to area chart + color: "#3c8dbc" + }, + yaxis: { + min: 0, + max: 100, + show: true + }, + xaxis: { + show: true + } + }); + + var updateInterval = 500; //Fetch data ever x milliseconds + var realtime = "on"; //If == to on then fetch data every x seconds. else stop fetching + function update() { + + interactive_plot.setData([getRandomData()]); + + // Since the axes don't change, we don't need to call plot.setupGrid() + interactive_plot.draw(); + if (realtime === "on") + setTimeout(update, updateInterval); + } + + //INITIALIZE REALTIME DATA FETCHING + if (realtime === "on") { + update(); + } + //REALTIME TOGGLE + $("#realtime .btn").click(function () { + if ($(this).data("toggle") === "on") { + realtime = "on"; + } + else { + realtime = "off"; + } + update(); + }); + /* + * END INTERACTIVE CHART + */ + + + /* + * LINE CHART + * ---------- + */ + //LINE randomly generated data + + var sin = [], cos = []; + for (var i = 0; i < 14; i += 0.5) { + sin.push([i, Math.sin(i)]); + cos.push([i, Math.cos(i)]); + } + var line_data1 = { + data: sin, + color: "#3c8dbc" + }; + var line_data2 = { + data: cos, + color: "#00c0ef" + }; + $.plot("#line-chart", [line_data1, line_data2], { + grid: { + hoverable: true, + borderColor: "#f3f3f3", + borderWidth: 1, + tickColor: "#f3f3f3" + }, + series: { + shadowSize: 0, + lines: { + show: true + }, + points: { + show: true + } + }, + lines: { + fill: false, + color: ["#3c8dbc", "#f56954"] + }, + yaxis: { + show: true, + }, + xaxis: { + show: true + } + }); + //Initialize tooltip on hover + $('<div class="tooltip-inner" id="line-chart-tooltip"></div>').css({ + position: "absolute", + display: "none", + opacity: 0.8 + }).appendTo("body"); + $("#line-chart").bind("plothover", function (event, pos, item) { + + if (item) { + var x = item.datapoint[0].toFixed(2), + y = item.datapoint[1].toFixed(2); + + $("#line-chart-tooltip").html(item.series.label + " of " + x + " = " + y) + .css({top: item.pageY + 5, left: item.pageX + 5}) + .fadeIn(200); + } else { + $("#line-chart-tooltip").hide(); + } + + }); + /* END LINE CHART */ + + /* + * FULL WIDTH STATIC AREA CHART + * ----------------- + */ + var areaData = [[2, 88.0], [3, 93.3], [4, 102.0], [5, 108.5], [6, 115.7], [7, 115.6], + [8, 124.6], [9, 130.3], [10, 134.3], [11, 141.4], [12, 146.5], [13, 151.7], [14, 159.9], + [15, 165.4], [16, 167.8], [17, 168.7], [18, 169.5], [19, 168.0]]; + $.plot("#area-chart", [areaData], { + grid: { + borderWidth: 0 + }, + series: { + shadowSize: 0, // Drawing is faster without shadows + color: "#00c0ef" + }, + lines: { + fill: true //Converts the line chart to area chart + }, + yaxis: { + show: false + }, + xaxis: { + show: false + } + }); + + /* END AREA CHART */ + + /* + * BAR CHART + * --------- + */ + + var bar_data = { + data: [["January", 10], ["February", 8], ["March", 4], ["April", 13], ["May", 17], ["June", 9]], + color: "#3c8dbc" + }; + $.plot("#bar-chart", [bar_data], { + grid: { + borderWidth: 1, + borderColor: "#f3f3f3", + tickColor: "#f3f3f3" + }, + series: { + bars: { + show: true, + barWidth: 0.5, + align: "center" + } + }, + xaxis: { + mode: "categories", + tickLength: 0 + } + }); + /* END BAR CHART */ + + /* + * DONUT CHART + * ----------- + */ + + var donutData = [ + {label: "Series2", data: 30, color: "#3c8dbc"}, + {label: "Series3", data: 20, color: "#0073b7"}, + {label: "Series4", data: 50, color: "#00c0ef"} + ]; + $.plot("#donut-chart", donutData, { + series: { + pie: { + show: true, + radius: 1, + innerRadius: 0.5, + label: { + show: true, + radius: 2 / 3, + formatter: labelFormatter, + threshold: 0.1 + } + + } + }, + legend: { + show: false + } + }); + /* + * END DONUT CHART + */ + + }); + + /* + * Custom Label formatter + * ---------------------- + */ + function labelFormatter(label, series) { + return '<div style="font-size:13px; text-align:center; padding:2px; color: #fff; font-weight: 600;">' + + label + + "<br>" + + Math.round(series.percent) + "%</div>"; + } + </script> + </body> +</html> diff --git a/theme/bootstrap/pages/charts/inline.html b/theme/bootstrap/pages/charts/inline.html new file mode 100644 index 0000000..c115fe1 --- /dev/null +++ b/theme/bootstrap/pages/charts/inline.html @@ -0,0 +1,1125 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Inline Charts</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + AdminLTE Design Team + <small><i class="fa fa-clock-o"></i> 2 hours</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Developers + <small><i class="fa fa-clock-o"></i> Today</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Sales Department + <small><i class="fa fa-clock-o"></i> Yesterday</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Reviewers + <small><i class="fa fa-clock-o"></i> 2 days</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-users text-red"></i> 5 new members joined + </a> + </li> + + <li> + <a href="#"> + <i class="fa fa-shopping-cart text-green"></i> 25 sales made + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-user text-red"></i> You changed your username + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Create a nice theme + <small class="pull-right">40%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">40% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Some task I need to do + <small class="pull-right">60%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">60% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Make beautiful transitions + <small class="pull-right">80%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li class="active"><a href="inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="../UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="../UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="../UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="../UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="../UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="../examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="../examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="../examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="../examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="../examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="../examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="../examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Inline Charts + <small>multiple types of charts</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">Charts</a></li> + <li class="active">Inline Charts</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + + <!-- row --> + <div class="row"> + <div class="col-xs-12"> + <!-- jQuery Knob --> + <div class="box box-solid"> + <div class="box-header"> + <i class="fa fa-bar-chart-o"></i> + <h3 class="box-title">jQuery Knob</h3> + <div class="box-tools pull-right"> + <button class="btn btn-default btn-sm" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-default btn-sm" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <div class="row"> + <div class="col-md-3 col-sm-6 col-xs-6 text-center"> + <input type="text" class="knob" value="30" data-width="90" data-height="90" data-fgColor="#3c8dbc"> + <div class="knob-label">New Visitors</div> + </div><!-- ./col --> + <div class="col-md-3 col-sm-6 col-xs-6 text-center"> + <input type="text" class="knob" value="70" data-width="90" data-height="90" data-fgColor="#f56954"> + <div class="knob-label">Bounce Rate</div> + </div><!-- ./col --> + <div class="col-md-3 col-sm-6 col-xs-6 text-center"> + <input type="text" class="knob" value="-80" data-min="-150" data-max="150" data-width="90" data-height="90" data-fgColor="#00a65a"> + <div class="knob-label">Server Load</div> + </div><!-- ./col --> + <div class="col-md-3 col-sm-6 col-xs-6 text-center"> + <input type="text" class="knob" value="40" data-width="90" data-height="90" data-fgColor="#00c0ef"> + <div class="knob-label">Disk Space</div> + </div><!-- ./col --> + </div><!-- /.row --> + + <div class="row"> + <div class="col-xs-6 text-center"> + <input type="text" class="knob" value="90" data-width="90" data-height="90" data-fgColor="#932ab6"> + <div class="knob-label">Bandwidth</div> + </div><!-- ./col --> + <div class="col-xs-6 text-center"> + <input type="text" class="knob" value="50" data-width="90" data-height="90" data-fgColor="#39CCCC"> + <div class="knob-label">CPU</div> + </div><!-- ./col --> + </div><!-- /.row --> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + + <div class="row"> + <div class="col-xs-12"> + <div class="box box-solid"> + <div class="box-header"> + <i class="fa fa-bar-chart-o"></i> + <h3 class="box-title">jQuery Knob Different Sizes</h3> + <div class="box-tools pull-right"> + <button class="btn btn-default btn-sm" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-default btn-sm" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <div class="row"> + <div class="col-md-3 col-sm-6 col-xs-6 text-center"> + <input type="text" class="knob" value="30" data-width="90" data-height="90" data-fgColor="#3c8dbc" data-readonly="true"> + <div class="knob-label">data-width="90"</div> + </div><!-- ./col --> + <div class="col-md-3 col-sm-6 col-xs-6 text-center"> + <input type="text" class="knob" value="30" data-width="120" data-height="120" data-fgColor="#f56954"> + <div class="knob-label">data-width="120"</div> + </div><!-- ./col --> + <div class="col-md-3 col-sm-6 col-xs-6 text-center"> + <input type="text" class="knob" value="30" data-thickness="0.1" data-width="90" data-height="90" data-fgColor="#00a65a"> + <div class="knob-label">data-thickness="0.1"</div> + </div><!-- ./col --> + <div class="col-md-3 col-sm-6 col-xs-6 text-center"> + <input type="text" class="knob" data-thickness="0.2" data-angleArc="250" data-angleOffset="-125" value="30" data-width="120" data-height="120" data-fgColor="#00c0ef"> + <div class="knob-label">data-angleArc="250"</div> + </div><!-- ./col --> + </div><!-- /.row --> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + + <div class="row"> + <div class="col-xs-12"> + <div class="box box-solid"> + <div class="box-header"> + <i class="fa fa-bar-chart-o"></i> + <h3 class="box-title">jQuery Knob Tron Style</h3> + <div class="box-tools pull-right"> + <button class="btn btn-default btn-sm" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-default btn-sm" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <div class="row"> + <div class="col-md-3 col-sm-6 col-xs-6 text-center"> + <input type="text" class="knob" value="80" data-skin="tron" data-thickness="0.2" data-width="90" data-height="90" data-fgColor="#3c8dbc" data-readonly="true"> + <div class="knob-label">data-width="90"</div> + </div><!-- ./col --> + <div class="col-md-3 col-sm-6 col-xs-6 text-center"> + <input type="text" class="knob" value="60" data-skin="tron" data-thickness="0.2" data-width="120" data-height="120" data-fgColor="#f56954"> + <div class="knob-label">data-width="120"</div> + </div><!-- ./col --> + <div class="col-md-3 col-sm-6 col-xs-6 text-center"> + <input type="text" class="knob" value="10" data-skin="tron" data-thickness="0.1" data-width="90" data-height="90" data-fgColor="#00a65a"> + <div class="knob-label">data-thickness="0.1"</div> + </div><!-- ./col --> + <div class="col-md-3 col-sm-6 col-xs-6 text-center"> + <input type="text" class="knob" value="100" data-skin="tron" data-thickness="0.2" data-angleArc="250" data-angleOffset="-125" data-width="120" data-height="120" data-fgColor="#00c0ef"> + <div class="knob-label">data-angleArc="250"</div> + </div><!-- ./col --> + </div><!-- /.row --> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + + <!-- callout --> + <div class="callout callout-info"> + <h4>The following was created using data tags</h4> + <p>The following three inline (sparkline) chart have been initialized to read and interpret data tags</p> + </div> + <!-- /.callout --> + + <div class="row"> + <div class="col-md-4"> + <div class="box box-solid"> + <div class="box-header"> + <h3 class="box-title text-danger">Sparkline Pie</h3> + <div class="box-tools pull-right"> + <button class="btn btn-default btn-sm"><i class="fa fa-refresh"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body text-center"> + <div class="sparkline" data-type="pie" data-offset="90" data-width="100px" data-height="100px"> + 6,4,8 + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + + <div class="col-md-4"> + <div class="box box-solid"> + <div class="box-header"> + <h3 class="box-title text-blue">Sparkline line</h3> + <div class="box-tools pull-right"> + <button class="btn btn-default btn-sm"><i class="fa fa-refresh"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body text-center"> + <div class="sparkline" data-type="line" data-spot-Radius="3" data-highlight-Spot-Color="#f39c12" data-highlight-Line-Color="#222" data-min-Spot-Color="#f56954" data-max-Spot-Color="#00a65a" data-spot-Color="#39CCCC" data-offset="90" data-width="100%" data-height="100px" data-line-Width="2" data-line-Color="#39CCCC" data-fill-Color="rgba(57, 204, 204, 0.08)"> + 6,4,7,8,4,3,2,2,5,6,7,4,1,5,7,9,9,8,7,6 + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + + <div class="col-md-4"> + <div class="box box-solid"> + <div class="box-header"> + <h3 class="box-title text-warning">Sparkline Bar</h3> + <div class="box-tools pull-right"> + <button class="btn btn-default btn-sm"><i class="fa fa-refresh"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body text-center"> + <div class="sparkline" data-type="bar" data-width="97%" data-height="100px" data-bar-Width="14" data-bar-Spacing="7" data-bar-Color="#f39c12"> + 6,4,8, 9, 10, 5, 13, 18, 21, 7, 9 + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + + <div class="row"> + <div class="col-xs-12"> + <div class="box box-solid"> + <div class="box-header"> + <h3 class="box-title">Sparkline examples</h3> + <div class="box-tools pull-right"> + <button class="btn btn-default btn-sm" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-default btn-sm" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div id="myBody" class="box-body"> + <div class="row"> + <div class="col-sm-6"> + <p> + Mouse speed <span id="mousespeed">Loading..</span> + </p> + <p> + Inline <span class="sparkline-1">10,8,9,3,5,8,5</span> + line graphs + <span class="sparkline-1">8,4,0,0,0,0,1,4,4,10,10,10,10,0,0,0,4,6,5,9,10</span> + </p> + + <p> + Bar charts <span class="sparkbar">10,8,9,3,5,8,5</span> + negative values: <span class="sparkbar">-3,1,2,0,3,-1</span> + stacked: <span class="sparkbar">0:2,2:4,4:2,4:1</span> + </p> + + <p> + Composite inline + <span id="compositeline">8,4,0,0,0,0,1,4,4,10,10,10,10,0,0,0,4,6,5,9,10</span> + </p> + <p> + Inline with normal range + <span id="normalline">8,4,0,0,0,0,1,4,4,10,10,10,10,0,0,0,4,6,5,9,10</span> + </p> + <p> + Composite bar + <span id="compositebar">4,6,7,7,4,3,2,1,4</span> + </p> + <p> + Discrete + <span class="discrete1">4,6,7,7,4,3,2,1,4,4,5,6,7,6,6,2,4,5</span><br> + + Discrete with threshold + <span id="discrete2">4,6,7,7,4,3,2,1,4</span> + </p> + <p> + Bullet charts<br> + <span class="sparkbullet">10,12,12,9,7</span><br> + <span class="sparkbullet">14,12,12,9,7</span><br> + <span class="sparkbullet">10,12,14,9,7</span><br> + </p> + </div><!-- /.col --> + <div class="col-sm-6"> + <p> + Customize size and colours + <span id="linecustom">10,8,9,3,5,8,5,7</span> + </p> + <p> + Tristate charts + <span class="sparktristate">1,1,0,1,-1,-1,1,-1,0,0,1,1</span><br> + (think games won, lost or drawn) + </p> + <p> + Tristate chart using a colour map: + <span class="sparktristatecols">1,2,0,2,-1,-2,1,-2,0,0,1,1</span> + </p> + <p> + Box Plot: <span class="sparkboxplot">4,27,34,52,54,59,61,68,78,82,85,87,91,93,100</span><br> + Pre-computed box plot <span class="sparkboxplotraw">Loading..</span> + </p> + <p> + Pie charts + <span class="sparkpie">1,1,2</span> + <span class="sparkpie">1,5</span> + <span class="sparkpie">20,50,80</span> + </p> + </div><!-- /.col --> + </div><!-- /.row --> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- SlimScroll 1.3.0 --> + <script src="../../plugins/slimScroll/jquery.slimscroll.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + <!-- jQuery Knob --> + <script src="../../plugins/knob/jquery.knob.js"></script> + <!-- Sparkline --> + <script src="../../plugins/sparkline/jquery.sparkline.min.js"></script> + <!-- page script --> + <script> + $(function () { + /* jQueryKnob */ + + $(".knob").knob({ + /*change : function (value) { + //console.log("change : " + value); + }, + release : function (value) { + console.log("release : " + value); + }, + cancel : function () { + console.log("cancel : " + this.value); + },*/ + draw: function () { + + // "tron" case + if (this.$.data('skin') == 'tron') { + + var a = this.angle(this.cv) // Angle + , sa = this.startAngle // Previous start angle + , sat = this.startAngle // Start angle + , ea // Previous end angle + , eat = sat + a // End angle + , r = true; + + this.g.lineWidth = this.lineWidth; + + this.o.cursor + && (sat = eat - 0.3) + && (eat = eat + 0.3); + + if (this.o.displayPrevious) { + ea = this.startAngle + this.angle(this.value); + this.o.cursor + && (sa = ea - 0.3) + && (ea = ea + 0.3); + this.g.beginPath(); + this.g.strokeStyle = this.previousColor; + this.g.arc(this.xy, this.xy, this.radius - this.lineWidth, sa, ea, false); + this.g.stroke(); + } + + this.g.beginPath(); + this.g.strokeStyle = r ? this.o.fgColor : this.fgColor; + this.g.arc(this.xy, this.xy, this.radius - this.lineWidth, sat, eat, false); + this.g.stroke(); + + this.g.lineWidth = 2; + this.g.beginPath(); + this.g.strokeStyle = this.o.fgColor; + this.g.arc(this.xy, this.xy, this.radius - this.lineWidth + 1 + this.lineWidth * 2 / 3, 0, 2 * Math.PI, false); + this.g.stroke(); + + return false; + } + } + }); + /* END JQUERY KNOB */ + + //INITIALIZE SPARKLINE CHARTS + $(".sparkline").each(function () { + var $this = $(this); + $this.sparkline('html', $this.data()); + }); + + /* SPARKLINE DOCUMENTAION EXAMPLES http://omnipotent.net/jquery.sparkline/#s-about */ + drawDocSparklines(); + drawMouseSpeedDemo(); + + }); + function drawDocSparklines() { + + // Bar + line composite charts + $('#compositebar').sparkline('html', {type: 'bar', barColor: '#aaf'}); + $('#compositebar').sparkline([4, 1, 5, 7, 9, 9, 8, 7, 6, 6, 4, 7, 8, 4, 3, 2, 2, 5, 6, 7], + {composite: true, fillColor: false, lineColor: 'red'}); + + + // Line charts taking their values from the tag + $('.sparkline-1').sparkline(); + + // Larger line charts for the docs + $('.largeline').sparkline('html', + {type: 'line', height: '2.5em', width: '4em'}); + + // Customized line chart + $('#linecustom').sparkline('html', + {height: '1.5em', width: '8em', lineColor: '#f00', fillColor: '#ffa', + minSpotColor: false, maxSpotColor: false, spotColor: '#77f', spotRadius: 3}); + + // Bar charts using inline values + $('.sparkbar').sparkline('html', {type: 'bar'}); + + $('.barformat').sparkline([1, 3, 5, 3, 8], { + type: 'bar', + tooltipFormat: '{{value:levels}} - {{value}}', + tooltipValueLookups: { + levels: $.range_map({':2': 'Low', '3:6': 'Medium', '7:': 'High'}) + } + }); + + // Tri-state charts using inline values + $('.sparktristate').sparkline('html', {type: 'tristate'}); + $('.sparktristatecols').sparkline('html', + {type: 'tristate', colorMap: {'-2': '#fa7', '2': '#44f'}}); + + // Composite line charts, the second using values supplied via javascript + $('#compositeline').sparkline('html', {fillColor: false, changeRangeMin: 0, chartRangeMax: 10}); + $('#compositeline').sparkline([4, 1, 5, 7, 9, 9, 8, 7, 6, 6, 4, 7, 8, 4, 3, 2, 2, 5, 6, 7], + {composite: true, fillColor: false, lineColor: 'red', changeRangeMin: 0, chartRangeMax: 10}); + + // Line charts with normal range marker + $('#normalline').sparkline('html', + {fillColor: false, normalRangeMin: -1, normalRangeMax: 8}); + $('#normalExample').sparkline('html', + {fillColor: false, normalRangeMin: 80, normalRangeMax: 95, normalRangeColor: '#4f4'}); + + // Discrete charts + $('.discrete1').sparkline('html', + {type: 'discrete', lineColor: 'blue', xwidth: 18}); + $('#discrete2').sparkline('html', + {type: 'discrete', lineColor: 'blue', thresholdColor: 'red', thresholdValue: 4}); + + // Bullet charts + $('.sparkbullet').sparkline('html', {type: 'bullet'}); + + // Pie charts + $('.sparkpie').sparkline('html', {type: 'pie', height: '1.0em'}); + + // Box plots + $('.sparkboxplot').sparkline('html', {type: 'box'}); + $('.sparkboxplotraw').sparkline([1, 3, 5, 8, 10, 15, 18], + {type: 'box', raw: true, showOutliers: true, target: 6}); + + // Box plot with specific field order + $('.boxfieldorder').sparkline('html', { + type: 'box', + tooltipFormatFieldlist: ['med', 'lq', 'uq'], + tooltipFormatFieldlistKey: 'field' + }); + + // click event demo sparkline + $('.clickdemo').sparkline(); + $('.clickdemo').bind('sparklineClick', function (ev) { + var sparkline = ev.sparklines[0], + region = sparkline.getCurrentRegionFields(); + value = region.y; + alert("Clicked on x=" + region.x + " y=" + region.y); + }); + + // mouseover event demo sparkline + $('.mouseoverdemo').sparkline(); + $('.mouseoverdemo').bind('sparklineRegionChange', function (ev) { + var sparkline = ev.sparklines[0], + region = sparkline.getCurrentRegionFields(); + value = region.y; + $('.mouseoverregion').text("x=" + region.x + " y=" + region.y); + }).bind('mouseleave', function () { + $('.mouseoverregion').text(''); + }); + } + + /** + ** Draw the little mouse speed animated graph + ** This just attaches a handler to the mousemove event to see + ** (roughly) how far the mouse has moved + ** and then updates the display a couple of times a second via + ** setTimeout() + **/ + function drawMouseSpeedDemo() { + var mrefreshinterval = 500; // update display every 500ms + var lastmousex = -1; + var lastmousey = -1; + var lastmousetime; + var mousetravel = 0; + var mpoints = []; + var mpoints_max = 30; + $('html').mousemove(function (e) { + var mousex = e.pageX; + var mousey = e.pageY; + if (lastmousex > -1) { + mousetravel += Math.max(Math.abs(mousex - lastmousex), Math.abs(mousey - lastmousey)); + } + lastmousex = mousex; + lastmousey = mousey; + }); + var mdraw = function () { + var md = new Date(); + var timenow = md.getTime(); + if (lastmousetime && lastmousetime != timenow) { + var pps = Math.round(mousetravel / (timenow - lastmousetime) * 1000); + mpoints.push(pps); + if (mpoints.length > mpoints_max) + mpoints.splice(0, 1); + mousetravel = 0; + $('#mousespeed').sparkline(mpoints, {width: mpoints.length * 2, tooltipSuffix: ' pixels per second'}); + } + lastmousetime = timenow; + setTimeout(mdraw, mrefreshinterval); + }; + // We could use setInterval instead, but I prefer to do it this way + setTimeout(mdraw, mrefreshinterval); + } + </script> + </body> +</html> diff --git a/theme/bootstrap/pages/charts/morris.html b/theme/bootstrap/pages/charts/morris.html new file mode 100644 index 0000000..2acba76 --- /dev/null +++ b/theme/bootstrap/pages/charts/morris.html @@ -0,0 +1,807 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Morris.js Charts</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Morris charts --> + <link rel="stylesheet" href="../../plugins/morris/morris.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + AdminLTE Design Team + <small><i class="fa fa-clock-o"></i> 2 hours</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Developers + <small><i class="fa fa-clock-o"></i> Today</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Sales Department + <small><i class="fa fa-clock-o"></i> Yesterday</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Reviewers + <small><i class="fa fa-clock-o"></i> 2 days</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-users text-red"></i> 5 new members joined + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-shopping-cart text-green"></i> 25 sales made + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-user text-red"></i> You changed your username + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Create a nice theme + <small class="pull-right">40%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">40% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Some task I need to do + <small class="pull-right">60%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">60% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Make beautiful transitions + <small class="pull-right">80%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li class="active"><a href="morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="../UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="../UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="../UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="../UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="../UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="../examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="../examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="../examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="../examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="../examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="../examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="../examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Morris Charts + <small>Preview sample</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">Charts</a></li> + <li class="active">Morris</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="callout callout-warning"> + <h4>Warning!</h4> + <p><b>Morris.js</b> charts are no longer maintained by its author. We would recommend using any of the other charts that come with the template.</p> + </div> + <div class="row"> + <div class="col-md-6"> + <!-- AREA CHART --> + <div class="box box-primary"> + <div class="box-header with-border"> + <h3 class="box-title">Area Chart</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div> + <div class="box-body chart-responsive"> + <div class="chart" id="revenue-chart" style="height: 300px;"></div> + </div><!-- /.box-body --> + </div><!-- /.box --> + + <!-- DONUT CHART --> + <div class="box box-danger"> + <div class="box-header with-border"> + <h3 class="box-title">Donut Chart</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div> + <div class="box-body chart-responsive"> + <div class="chart" id="sales-chart" style="height: 300px; position: relative;"></div> + </div><!-- /.box-body --> + </div><!-- /.box --> + + </div><!-- /.col (LEFT) --> + <div class="col-md-6"> + <!-- LINE CHART --> + <div class="box box-info"> + <div class="box-header with-border"> + <h3 class="box-title">Line Chart</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div> + <div class="box-body chart-responsive"> + <div class="chart" id="line-chart" style="height: 300px;"></div> + </div><!-- /.box-body --> + </div><!-- /.box --> + + <!-- BAR CHART --> + <div class="box box-success"> + <div class="box-header with-border"> + <h3 class="box-title">Bar Chart</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div> + <div class="box-body chart-responsive"> + <div class="chart" id="bar-chart" style="height: 300px;"></div> + </div><!-- /.box-body --> + </div><!-- /.box --> + + </div><!-- /.col (RIGHT) --> + </div><!-- /.row --> + + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- Morris.js charts --> + <script src="https://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min.js"></script> + <script src="../../plugins/morris/morris.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + <!-- page script --> + <script> + $(function () { + "use strict"; + + // AREA CHART + var area = new Morris.Area({ + element: 'revenue-chart', + resize: true, + data: [ + {y: '2011 Q1', item1: 2666, item2: 2666}, + {y: '2011 Q2', item1: 2778, item2: 2294}, + {y: '2011 Q3', item1: 4912, item2: 1969}, + {y: '2011 Q4', item1: 3767, item2: 3597}, + {y: '2012 Q1', item1: 6810, item2: 1914}, + {y: '2012 Q2', item1: 5670, item2: 4293}, + {y: '2012 Q3', item1: 4820, item2: 3795}, + {y: '2012 Q4', item1: 15073, item2: 5967}, + {y: '2013 Q1', item1: 10687, item2: 4460}, + {y: '2013 Q2', item1: 8432, item2: 5713} + ], + xkey: 'y', + ykeys: ['item1', 'item2'], + labels: ['Item 1', 'Item 2'], + lineColors: ['#a0d0e0', '#3c8dbc'], + hideHover: 'auto' + }); + + // LINE CHART + var line = new Morris.Line({ + element: 'line-chart', + resize: true, + data: [ + {y: '2011 Q1', item1: 2666}, + {y: '2011 Q2', item1: 2778}, + {y: '2011 Q3', item1: 4912}, + {y: '2011 Q4', item1: 3767}, + {y: '2012 Q1', item1: 6810}, + {y: '2012 Q2', item1: 5670}, + {y: '2012 Q3', item1: 4820}, + {y: '2012 Q4', item1: 15073}, + {y: '2013 Q1', item1: 10687}, + {y: '2013 Q2', item1: 8432} + ], + xkey: 'y', + ykeys: ['item1'], + labels: ['Item 1'], + lineColors: ['#3c8dbc'], + hideHover: 'auto' + }); + + //DONUT CHART + var donut = new Morris.Donut({ + element: 'sales-chart', + resize: true, + colors: ["#3c8dbc", "#f56954", "#00a65a"], + data: [ + {label: "Download Sales", value: 12}, + {label: "In-Store Sales", value: 30}, + {label: "Mail-Order Sales", value: 20} + ], + hideHover: 'auto' + }); + //BAR CHART + var bar = new Morris.Bar({ + element: 'bar-chart', + resize: true, + data: [ + {y: '2006', a: 100, b: 90}, + {y: '2007', a: 75, b: 65}, + {y: '2008', a: 50, b: 40}, + {y: '2009', a: 75, b: 65}, + {y: '2010', a: 50, b: 40}, + {y: '2011', a: 75, b: 65}, + {y: '2012', a: 100, b: 90} + ], + barColors: ['#00a65a', '#f56954'], + xkey: 'y', + ykeys: ['a', 'b'], + labels: ['CPU', 'DISK'], + hideHover: 'auto' + }); + }); + </script> + </body> +</html> diff --git a/theme/bootstrap/pages/examples/404.html b/theme/bootstrap/pages/examples/404.html new file mode 100644 index 0000000..b65e675 --- /dev/null +++ b/theme/bootstrap/pages/examples/404.html @@ -0,0 +1,668 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | 404 Page not found</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + AdminLTE Design Team + <small><i class="fa fa-clock-o"></i> 2 hours</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Developers + <small><i class="fa fa-clock-o"></i> Today</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Sales Department + <small><i class="fa fa-clock-o"></i> Yesterday</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Reviewers + <small><i class="fa fa-clock-o"></i> 2 days</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-users text-red"></i> 5 new members joined + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-shopping-cart text-green"></i> 25 sales made + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-user text-red"></i> You changed your username + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Create a nice theme + <small class="pull-right">40%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">40% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Some task I need to do + <small class="pull-right">60%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">60% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Make beautiful transitions + <small class="pull-right">80%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="../charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="../charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="../charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="../UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="../UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="../UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="../UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="../UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li class="active"><a href="404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + 404 Error Page + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">Examples</a></li> + <li class="active">404 error</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="error-page"> + <h2 class="headline text-yellow"> 404</h2> + <div class="error-content"> + <h3><i class="fa fa-warning text-yellow"></i> Oops! Page not found.</h3> + <p> + We could not find the page you were looking for. + Meanwhile, you may <a href="../../index.html">return to dashboard</a> or try using the search form. + </p> + <form class="search-form"> + <div class="input-group"> + <input type="text" name="search" class="form-control" placeholder="Search"> + <div class="input-group-btn"> + <button type="submit" name="submit" class="btn btn-warning btn-flat"><i class="fa fa-search"></i></button> + </div> + </div><!-- /.input-group --> + </form> + </div><!-- /.error-content --> + </div><!-- /.error-page --> + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + </body> +</html> diff --git a/theme/bootstrap/pages/examples/500.html b/theme/bootstrap/pages/examples/500.html new file mode 100644 index 0000000..45f5385 --- /dev/null +++ b/theme/bootstrap/pages/examples/500.html @@ -0,0 +1,670 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | 500 Error</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + AdminLTE Design Team + <small><i class="fa fa-clock-o"></i> 2 hours</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Developers + <small><i class="fa fa-clock-o"></i> Today</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Sales Department + <small><i class="fa fa-clock-o"></i> Yesterday</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Reviewers + <small><i class="fa fa-clock-o"></i> 2 days</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-users text-red"></i> 5 new members joined + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-shopping-cart text-green"></i> 25 sales made + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-user text-red"></i> You changed your username + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Create a nice theme + <small class="pull-right">40%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">40% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Some task I need to do + <small class="pull-right">60%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">60% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Make beautiful transitions + <small class="pull-right">80%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="../charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="../charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="../charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="../UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="../UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="../UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="../UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="../UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li class="active"><a href="500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + 500 Error Page + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">Examples</a></li> + <li class="active">500 error</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + + <div class="error-page"> + <h2 class="headline text-red">500</h2> + <div class="error-content"> + <h3><i class="fa fa-warning text-red"></i> Oops! Something went wrong.</h3> + <p> + We will work on fixing that right away. + Meanwhile, you may <a href="../../index.html">return to dashboard</a> or try using the search form. + </p> + <form class="search-form"> + <div class="input-group"> + <input type="text" name="search" class="form-control" placeholder="Search"> + <div class="input-group-btn"> + <button type="submit" name="submit" class="btn btn-danger btn-flat"><i class="fa fa-search"></i></button> + </div> + </div><!-- /.input-group --> + </form> + </div> + </div><!-- /.error-page --> + + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + </body> +</html> diff --git a/theme/bootstrap/pages/examples/blank.html b/theme/bootstrap/pages/examples/blank.html new file mode 100644 index 0000000..ba2fa8b --- /dev/null +++ b/theme/bootstrap/pages/examples/blank.html @@ -0,0 +1,572 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Blank Page</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <!-- Site wrapper --> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + + <!-- =============================================== --> + + <!-- Left side column. contains the sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">Hot</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="../charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="../charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="../charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="../UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="../UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="../UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="../UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="../UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li class="active"><a href="blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- =============================================== --> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Blank page + <small>it all starts here</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">Examples</a></li> + <li class="active">Blank page</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + + <!-- Default box --> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title">Title</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse" data-toggle="tooltip" title="Collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove" data-toggle="tooltip" title="Remove"><i class="fa fa-times"></i></button> + </div> + </div> + <div class="box-body"> + Start creating your amazing application! + </div><!-- /.box-body --> + <div class="box-footer"> + Footer + </div><!-- /.box-footer--> + </div><!-- /.box --> + + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- SlimScroll --> + <script src="../../plugins/slimScroll/jquery.slimscroll.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + </body> +</html> diff --git a/theme/bootstrap/pages/examples/invoice-print.html b/theme/bootstrap/pages/examples/invoice-print.html new file mode 100644 index 0000000..82ccb1a --- /dev/null +++ b/theme/bootstrap/pages/examples/invoice-print.html @@ -0,0 +1,158 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Invoice</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body onload="window.print();"> + <div class="wrapper"> + <!-- Main content --> + <section class="invoice"> + <!-- title row --> + <div class="row"> + <div class="col-xs-12"> + <h2 class="page-header"> + <i class="fa fa-globe"></i> AdminLTE, Inc. + <small class="pull-right">Date: 2/10/2014</small> + </h2> + </div><!-- /.col --> + </div> + <!-- info row --> + <div class="row invoice-info"> + <div class="col-sm-4 invoice-col"> + From + <address> + <strong>Admin, Inc.</strong><br> + 795 Folsom Ave, Suite 600<br> + San Francisco, CA 94107<br> + Phone: (804) 123-5432<br> + Email: info@almasaeedstudio.com + </address> + </div><!-- /.col --> + <div class="col-sm-4 invoice-col"> + To + <address> + <strong>John Doe</strong><br> + 795 Folsom Ave, Suite 600<br> + San Francisco, CA 94107<br> + Phone: (555) 539-1037<br> + Email: john.doe@example.com + </address> + </div><!-- /.col --> + <div class="col-sm-4 invoice-col"> + <b>Invoice #007612</b><br> + <br> + <b>Order ID:</b> 4F3S8J<br> + <b>Payment Due:</b> 2/22/2014<br> + <b>Account:</b> 968-34567 + </div><!-- /.col --> + </div><!-- /.row --> + + <!-- Table row --> + <div class="row"> + <div class="col-xs-12 table-responsive"> + <table class="table table-striped"> + <thead> + <tr> + <th>Qty</th> + <th>Product</th> + <th>Serial #</th> + <th>Description</th> + <th>Subtotal</th> + </tr> + </thead> + <tbody> + <tr> + <td>1</td> + <td>Call of Duty</td> + <td>455-981-221</td> + <td>El snort testosterone trophy driving gloves handsome</td> + <td>$64.50</td> + </tr> + <tr> + <td>1</td> + <td>Need for Speed IV</td> + <td>247-925-726</td> + <td>Wes Anderson umami biodiesel</td> + <td>$50.00</td> + </tr> + <tr> + <td>1</td> + <td>Monsters DVD</td> + <td>735-845-642</td> + <td>Terry Richardson helvetica tousled street art master</td> + <td>$10.70</td> + </tr> + <tr> + <td>1</td> + <td>Grown Ups Blue Ray</td> + <td>422-568-642</td> + <td>Tousled lomo letterpress</td> + <td>$25.99</td> + </tr> + </tbody> + </table> + </div><!-- /.col --> + </div><!-- /.row --> + + <div class="row"> + <!-- accepted payments column --> + <div class="col-xs-6"> + <p class="lead">Payment Methods:</p> + <img src="../../dist/img/credit/visa.png" alt="Visa"> + <img src="../../dist/img/credit/mastercard.png" alt="Mastercard"> + <img src="../../dist/img/credit/american-express.png" alt="American Express"> + <img src="../../dist/img/credit/paypal2.png" alt="Paypal"> + <p class="text-muted well well-sm no-shadow" style="margin-top: 10px;"> + Etsy doostang zoodles disqus groupon greplin oooj voxy zoodles, weebly ning heekya handango imeem plugg dopplr jibjab, movity jajah plickers sifteo edmodo ifttt zimbra. + </p> + </div><!-- /.col --> + <div class="col-xs-6"> + <p class="lead">Amount Due 2/22/2014</p> + <div class="table-responsive"> + <table class="table"> + <tr> + <th style="width:50%">Subtotal:</th> + <td>$250.30</td> + </tr> + <tr> + <th>Tax (9.3%)</th> + <td>$10.34</td> + </tr> + <tr> + <th>Shipping:</th> + <td>$5.80</td> + </tr> + <tr> + <th>Total:</th> + <td>$265.24</td> + </tr> + </table> + </div> + </div><!-- /.col --> + </div><!-- /.row --> + </section><!-- /.content --> + </div><!-- ./wrapper --> + + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + </body> +</html> diff --git a/theme/bootstrap/pages/examples/invoice.html b/theme/bootstrap/pages/examples/invoice.html new file mode 100644 index 0000000..b826e51 --- /dev/null +++ b/theme/bootstrap/pages/examples/invoice.html @@ -0,0 +1,790 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Invoice</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + AdminLTE Design Team + <small><i class="fa fa-clock-o"></i> 2 hours</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Developers + <small><i class="fa fa-clock-o"></i> Today</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Sales Department + <small><i class="fa fa-clock-o"></i> Yesterday</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Reviewers + <small><i class="fa fa-clock-o"></i> 2 days</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-users text-red"></i> 5 new members joined + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-shopping-cart text-green"></i> 25 sales made + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-user text-red"></i> You changed your username + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Create a nice theme + <small class="pull-right">40%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">40% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Some task I need to do + <small class="pull-right">60%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">60% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Make beautiful transitions + <small class="pull-right">80%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="../charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="../charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="../charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="../UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="../UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="../UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="../UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li class="active"><a href="invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Invoice + <small>#007612</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">Examples</a></li> + <li class="active">Invoice</li> + </ol> + </section> + + <div class="pad margin no-print"> + <div class="callout callout-info" style="margin-bottom: 0!important;"> + <h4><i class="fa fa-info"></i> Note:</h4> + This page has been enhanced for printing. Click the print button at the bottom of the invoice to test. + </div> + </div> + + <!-- Main content --> + <section class="invoice"> + <!-- title row --> + <div class="row"> + <div class="col-xs-12"> + <h2 class="page-header"> + <i class="fa fa-globe"></i> AdminLTE, Inc. + <small class="pull-right">Date: 2/10/2014</small> + </h2> + </div><!-- /.col --> + </div> + <!-- info row --> + <div class="row invoice-info"> + <div class="col-sm-4 invoice-col"> + From + <address> + <strong>Admin, Inc.</strong><br> + 795 Folsom Ave, Suite 600<br> + San Francisco, CA 94107<br> + Phone: (804) 123-5432<br> + Email: info@almasaeedstudio.com + </address> + </div><!-- /.col --> + <div class="col-sm-4 invoice-col"> + To + <address> + <strong>John Doe</strong><br> + 795 Folsom Ave, Suite 600<br> + San Francisco, CA 94107<br> + Phone: (555) 539-1037<br> + Email: john.doe@example.com + </address> + </div><!-- /.col --> + <div class="col-sm-4 invoice-col"> + <b>Invoice #007612</b><br> + <br> + <b>Order ID:</b> 4F3S8J<br> + <b>Payment Due:</b> 2/22/2014<br> + <b>Account:</b> 968-34567 + </div><!-- /.col --> + </div><!-- /.row --> + + <!-- Table row --> + <div class="row"> + <div class="col-xs-12 table-responsive"> + <table class="table table-striped"> + <thead> + <tr> + <th>Qty</th> + <th>Product</th> + <th>Serial #</th> + <th>Description</th> + <th>Subtotal</th> + </tr> + </thead> + <tbody> + <tr> + <td>1</td> + <td>Call of Duty</td> + <td>455-981-221</td> + <td>El snort testosterone trophy driving gloves handsome</td> + <td>$64.50</td> + </tr> + <tr> + <td>1</td> + <td>Need for Speed IV</td> + <td>247-925-726</td> + <td>Wes Anderson umami biodiesel</td> + <td>$50.00</td> + </tr> + <tr> + <td>1</td> + <td>Monsters DVD</td> + <td>735-845-642</td> + <td>Terry Richardson helvetica tousled street art master</td> + <td>$10.70</td> + </tr> + <tr> + <td>1</td> + <td>Grown Ups Blue Ray</td> + <td>422-568-642</td> + <td>Tousled lomo letterpress</td> + <td>$25.99</td> + </tr> + </tbody> + </table> + </div><!-- /.col --> + </div><!-- /.row --> + + <div class="row"> + <!-- accepted payments column --> + <div class="col-xs-6"> + <p class="lead">Payment Methods:</p> + <img src="../../dist/img/credit/visa.png" alt="Visa"> + <img src="../../dist/img/credit/mastercard.png" alt="Mastercard"> + <img src="../../dist/img/credit/american-express.png" alt="American Express"> + <img src="../../dist/img/credit/paypal2.png" alt="Paypal"> + <p class="text-muted well well-sm no-shadow" style="margin-top: 10px;"> + Etsy doostang zoodles disqus groupon greplin oooj voxy zoodles, weebly ning heekya handango imeem plugg dopplr jibjab, movity jajah plickers sifteo edmodo ifttt zimbra. + </p> + </div><!-- /.col --> + <div class="col-xs-6"> + <p class="lead">Amount Due 2/22/2014</p> + <div class="table-responsive"> + <table class="table"> + <tr> + <th style="width:50%">Subtotal:</th> + <td>$250.30</td> + </tr> + <tr> + <th>Tax (9.3%)</th> + <td>$10.34</td> + </tr> + <tr> + <th>Shipping:</th> + <td>$5.80</td> + </tr> + <tr> + <th>Total:</th> + <td>$265.24</td> + </tr> + </table> + </div> + </div><!-- /.col --> + </div><!-- /.row --> + + <!-- this row will not appear when printing --> + <div class="row no-print"> + <div class="col-xs-12"> + <a href="invoice-print.html" target="_blank" class="btn btn-default"><i class="fa fa-print"></i> Print</a> + <button class="btn btn-success pull-right"><i class="fa fa-credit-card"></i> Submit Payment</button> + <button class="btn btn-primary pull-right" style="margin-right: 5px;"><i class="fa fa-download"></i> Generate PDF</button> + </div> + </div> + </section><!-- /.content --> + <div class="clearfix"></div> + </div><!-- /.content-wrapper --> + <footer class="main-footer no-print"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + </body> +</html> diff --git a/theme/bootstrap/pages/examples/lockscreen.html b/theme/bootstrap/pages/examples/lockscreen.html new file mode 100644 index 0000000..a82db0e --- /dev/null +++ b/theme/bootstrap/pages/examples/lockscreen.html @@ -0,0 +1,70 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Lockscreen</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition lockscreen"> + <!-- Automatic element centering --> + <div class="lockscreen-wrapper"> + <div class="lockscreen-logo"> + <a href="../../index2.html"><b>Admin</b>LTE</a> + </div> + <!-- User name --> + <div class="lockscreen-name">John Doe</div> + + <!-- START LOCK SCREEN ITEM --> + <div class="lockscreen-item"> + <!-- lockscreen image --> + <div class="lockscreen-image"> + <img src="../../dist/img/user1-128x128.jpg" alt="User Image"> + </div> + <!-- /.lockscreen-image --> + + <!-- lockscreen credentials (contains the form) --> + <form class="lockscreen-credentials"> + <div class="input-group"> + <input type="password" class="form-control" placeholder="password"> + <div class="input-group-btn"> + <button class="btn"><i class="fa fa-arrow-right text-muted"></i></button> + </div> + </div> + </form><!-- /.lockscreen credentials --> + + </div><!-- /.lockscreen-item --> + <div class="help-block text-center"> + Enter your password to retrieve your session + </div> + <div class="text-center"> + <a href="login.html">Or sign in as a different user</a> + </div> + <div class="lockscreen-footer text-center"> + Copyright &copy; 2014-2015 <b><a href="http://almsaeedstudio.com" class="text-black">Almsaeed Studio</a></b><br> + All rights reserved + </div> + </div><!-- /.center --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + </body> +</html> diff --git a/theme/bootstrap/pages/examples/login.html b/theme/bootstrap/pages/examples/login.html new file mode 100644 index 0000000..df441c9 --- /dev/null +++ b/theme/bootstrap/pages/examples/login.html @@ -0,0 +1,85 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Log in</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- iCheck --> + <link rel="stylesheet" href="../../plugins/iCheck/square/blue.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition login-page"> + <div class="login-box"> + <div class="login-logo"> + <a href="../../index2.html"><b>Admin</b>LTE</a> + </div><!-- /.login-logo --> + <div class="login-box-body"> + <p class="login-box-msg">Sign in to start your session</p> + <form action="../../index2.html" method="post"> + <div class="form-group has-feedback"> + <input type="email" class="form-control" placeholder="Email"> + <span class="glyphicon glyphicon-envelope form-control-feedback"></span> + </div> + <div class="form-group has-feedback"> + <input type="password" class="form-control" placeholder="Password"> + <span class="glyphicon glyphicon-lock form-control-feedback"></span> + </div> + <div class="row"> + <div class="col-xs-8"> + <div class="checkbox icheck"> + <label> + <input type="checkbox"> Remember Me + </label> + </div> + </div><!-- /.col --> + <div class="col-xs-4"> + <button type="submit" class="btn btn-primary btn-block btn-flat">Sign In</button> + </div><!-- /.col --> + </div> + </form> + + <div class="social-auth-links text-center"> + <p>- OR -</p> + <a href="#" class="btn btn-block btn-social btn-facebook btn-flat"><i class="fa fa-facebook"></i> Sign in using Facebook</a> + <a href="#" class="btn btn-block btn-social btn-google btn-flat"><i class="fa fa-google-plus"></i> Sign in using Google+</a> + </div><!-- /.social-auth-links --> + + <a href="#">I forgot my password</a><br> + <a href="register.html" class="text-center">Register a new membership</a> + + </div><!-- /.login-box-body --> + </div><!-- /.login-box --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- iCheck --> + <script src="../../plugins/iCheck/icheck.min.js"></script> + <script> + $(function () { + $('input').iCheck({ + checkboxClass: 'icheckbox_square-blue', + radioClass: 'iradio_square-blue', + increaseArea: '20%' // optional + }); + }); + </script> + </body> +</html> diff --git a/theme/bootstrap/pages/examples/profile.html b/theme/bootstrap/pages/examples/profile.html new file mode 100644 index 0000000..d057d5d --- /dev/null +++ b/theme/bootstrap/pages/examples/profile.html @@ -0,0 +1,950 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="UTF-8"> + <title>AdminLTE 2 | User Profile</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + AdminLTE Design Team + <small><i class="fa fa-clock-o"></i> 2 hours</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Developers + <small><i class="fa fa-clock-o"></i> Today</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Sales Department + <small><i class="fa fa-clock-o"></i> Yesterday</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Reviewers + <small><i class="fa fa-clock-o"></i> 2 days</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-users text-red"></i> 5 new members joined + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-shopping-cart text-green"></i> 25 sales made + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-user text-red"></i> You changed your username + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Create a nice theme + <small class="pull-right">40%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">40% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Some task I need to do + <small class="pull-right">60%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">60% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Make beautiful transitions + <small class="pull-right">80%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="../charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="../charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="../charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="../UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="../UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="../UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="../UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="../UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li class="active"><a href="profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + User Profile + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">Examples</a></li> + <li class="active">User profile</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + + <div class="row"> + <div class="col-md-3"> + + <!-- Profile Image --> + <div class="box box-primary"> + <div class="box-body box-profile"> + <img class="profile-user-img img-responsive img-circle" src="../../dist/img/user4-128x128.jpg" alt="User profile picture"> + <h3 class="profile-username text-center">Nina Mcintire</h3> + <p class="text-muted text-center">Software Engineer</p> + + <ul class="list-group list-group-unbordered"> + <li class="list-group-item"> + <b>Followers</b> <a class="pull-right">1,322</a> + </li> + <li class="list-group-item"> + <b>Following</b> <a class="pull-right">543</a> + </li> + <li class="list-group-item"> + <b>Friends</b> <a class="pull-right">13,287</a> + </li> + </ul> + + <a href="#" class="btn btn-primary btn-block"><b>Follow</b></a> + </div><!-- /.box-body --> + </div><!-- /.box --> + + <!-- About Me Box --> + <div class="box box-primary"> + <div class="box-header with-border"> + <h3 class="box-title">About Me</h3> + </div><!-- /.box-header --> + <div class="box-body"> + <strong><i class="fa fa-book margin-r-5"></i> Education</strong> + <p class="text-muted"> + B.S. in Computer Science from the University of Tennessee at Knoxville + </p> + + <hr> + + <strong><i class="fa fa-map-marker margin-r-5"></i> Location</strong> + <p class="text-muted">Malibu, California</p> + + <hr> + + <strong><i class="fa fa-pencil margin-r-5"></i> Skills</strong> + <p> + <span class="label label-danger">UI Design</span> + <span class="label label-success">Coding</span> + <span class="label label-info">Javascript</span> + <span class="label label-warning">PHP</span> + <span class="label label-primary">Node.js</span> + </p> + + <hr> + + <strong><i class="fa fa-file-text-o margin-r-5"></i> Notes</strong> + <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam fermentum enim neque.</p> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + <div class="col-md-9"> + <div class="nav-tabs-custom"> + <ul class="nav nav-tabs"> + <li class="active"><a href="#activity" data-toggle="tab">Activity</a></li> + <li><a href="#timeline" data-toggle="tab">Timeline</a></li> + <li><a href="#settings" data-toggle="tab">Settings</a></li> + </ul> + <div class="tab-content"> + <div class="active tab-pane" id="activity"> + <!-- Post --> + <div class="post"> + <div class="user-block"> + <img class="img-circle img-bordered-sm" src="../../dist/img/user1-128x128.jpg" alt="user image"> + <span class='username'> + <a href="#">Jonathan Burke Jr.</a> + <a href='#' class='pull-right btn-box-tool'><i class='fa fa-times'></i></a> + </span> + <span class='description'>Shared publicly - 7:30 PM today</span> + </div><!-- /.user-block --> + <p> + Lorem ipsum represents a long-held tradition for designers, + typographers and the like. Some people hate it and argue for + its demise, but others ignore the hate as they create awesome + tools to help create filler text for everyone from bacon lovers + to Charlie Sheen fans. + </p> + <ul class="list-inline"> + <li><a href="#" class="link-black text-sm"><i class="fa fa-share margin-r-5"></i> Share</a></li> + <li><a href="#" class="link-black text-sm"><i class="fa fa-thumbs-o-up margin-r-5"></i> Like</a></li> + <li class="pull-right"><a href="#" class="link-black text-sm"><i class="fa fa-comments-o margin-r-5"></i> Comments (5)</a></li> + </ul> + + <input class="form-control input-sm" type="text" placeholder="Type a comment"> + </div><!-- /.post --> + + <!-- Post --> + <div class="post clearfix"> + <div class='user-block'> + <img class='img-circle img-bordered-sm' src='../../dist/img/user7-128x128.jpg' alt='user image'> + <span class='username'> + <a href="#">Sarah Ross</a> + <a href='#' class='pull-right btn-box-tool'><i class='fa fa-times'></i></a> + </span> + <span class='description'>Sent you a message - 3 days ago</span> + </div><!-- /.user-block --> + <p> + Lorem ipsum represents a long-held tradition for designers, + typographers and the like. Some people hate it and argue for + its demise, but others ignore the hate as they create awesome + tools to help create filler text for everyone from bacon lovers + to Charlie Sheen fans. + </p> + + <form class='form-horizontal'> + <div class='form-group margin-bottom-none'> + <div class='col-sm-9'> + <input class="form-control input-sm" placeholder="Response"> + </div> + <div class='col-sm-3'> + <button class='btn btn-danger pull-right btn-block btn-sm'>Send</button> + </div> + </div> + </form> + </div><!-- /.post --> + + <!-- Post --> + <div class="post"> + <div class='user-block'> + <img class='img-circle img-bordered-sm' src='../../dist/img/user6-128x128.jpg' alt='user image'> + <span class='username'> + <a href="#">Adam Jones</a> + <a href='#' class='pull-right btn-box-tool'><i class='fa fa-times'></i></a> + </span> + <span class='description'>Posted 5 photos - 5 days ago</span> + </div><!-- /.user-block --> + <div class='row margin-bottom'> + <div class='col-sm-6'> + <img class='img-responsive' src='../../dist/img/photo1.png' alt='Photo'> + </div><!-- /.col --> + <div class='col-sm-6'> + <div class='row'> + <div class='col-sm-6'> + <img class='img-responsive' src='../../dist/img/photo2.png' alt='Photo'> + <br> + <img class='img-responsive' src='../../dist/img/photo3.jpg' alt='Photo'> + </div><!-- /.col --> + <div class='col-sm-6'> + <img class='img-responsive' src='../../dist/img/photo4.jpg' alt='Photo'> + <br> + <img class='img-responsive' src='../../dist/img/photo1.png' alt='Photo'> + </div><!-- /.col --> + </div><!-- /.row --> + </div><!-- /.col --> + </div><!-- /.row --> + + <ul class="list-inline"> + <li><a href="#" class="link-black text-sm"><i class="fa fa-share margin-r-5"></i> Share</a></li> + <li><a href="#" class="link-black text-sm"><i class="fa fa-thumbs-o-up margin-r-5"></i> Like</a></li> + <li class="pull-right"><a href="#" class="link-black text-sm"><i class="fa fa-comments-o margin-r-5"></i> Comments (5)</a></li> + </ul> + + <input class="form-control input-sm" type="text" placeholder="Type a comment"> + </div><!-- /.post --> + </div><!-- /.tab-pane --> + <div class="tab-pane" id="timeline"> + <!-- The timeline --> + <ul class="timeline timeline-inverse"> + <!-- timeline time label --> + <li class="time-label"> + <span class="bg-red"> + 10 Feb. 2014 + </span> + </li> + <!-- /.timeline-label --> + <!-- timeline item --> + <li> + <i class="fa fa-envelope bg-blue"></i> + <div class="timeline-item"> + <span class="time"><i class="fa fa-clock-o"></i> 12:05</span> + <h3 class="timeline-header"><a href="#">Support Team</a> sent you an email</h3> + <div class="timeline-body"> + Etsy doostang zoodles disqus groupon greplin oooj voxy zoodles, + weebly ning heekya handango imeem plugg dopplr jibjab, movity + jajah plickers sifteo edmodo ifttt zimbra. Babblely odeo kaboodle + quora plaxo ideeli hulu weebly balihoo... + </div> + <div class="timeline-footer"> + <a class="btn btn-primary btn-xs">Read more</a> + <a class="btn btn-danger btn-xs">Delete</a> + </div> + </div> + </li> + <!-- END timeline item --> + <!-- timeline item --> + <li> + <i class="fa fa-user bg-aqua"></i> + <div class="timeline-item"> + <span class="time"><i class="fa fa-clock-o"></i> 5 mins ago</span> + <h3 class="timeline-header no-border"><a href="#">Sarah Young</a> accepted your friend request</h3> + </div> + </li> + <!-- END timeline item --> + <!-- timeline item --> + <li> + <i class="fa fa-comments bg-yellow"></i> + <div class="timeline-item"> + <span class="time"><i class="fa fa-clock-o"></i> 27 mins ago</span> + <h3 class="timeline-header"><a href="#">Jay White</a> commented on your post</h3> + <div class="timeline-body"> + Take me to your leader! + Switzerland is small and neutral! + We are more like Germany, ambitious and misunderstood! + </div> + <div class="timeline-footer"> + <a class="btn btn-warning btn-flat btn-xs">View comment</a> + </div> + </div> + </li> + <!-- END timeline item --> + <!-- timeline time label --> + <li class="time-label"> + <span class="bg-green"> + 3 Jan. 2014 + </span> + </li> + <!-- /.timeline-label --> + <!-- timeline item --> + <li> + <i class="fa fa-camera bg-purple"></i> + <div class="timeline-item"> + <span class="time"><i class="fa fa-clock-o"></i> 2 days ago</span> + <h3 class="timeline-header"><a href="#">Mina Lee</a> uploaded new photos</h3> + <div class="timeline-body"> + <img src="http://placehold.it/150x100" alt="..." class="margin"> + <img src="http://placehold.it/150x100" alt="..." class="margin"> + <img src="http://placehold.it/150x100" alt="..." class="margin"> + <img src="http://placehold.it/150x100" alt="..." class="margin"> + </div> + </div> + </li> + <!-- END timeline item --> + <li> + <i class="fa fa-clock-o bg-gray"></i> + </li> + </ul> + </div><!-- /.tab-pane --> + + <div class="tab-pane" id="settings"> + <form class="form-horizontal"> + <div class="form-group"> + <label for="inputName" class="col-sm-2 control-label">Name</label> + <div class="col-sm-10"> + <input type="email" class="form-control" id="inputName" placeholder="Name"> + </div> + </div> + <div class="form-group"> + <label for="inputEmail" class="col-sm-2 control-label">Email</label> + <div class="col-sm-10"> + <input type="email" class="form-control" id="inputEmail" placeholder="Email"> + </div> + </div> + <div class="form-group"> + <label for="inputName" class="col-sm-2 control-label">Name</label> + <div class="col-sm-10"> + <input type="text" class="form-control" id="inputName" placeholder="Name"> + </div> + </div> + <div class="form-group"> + <label for="inputExperience" class="col-sm-2 control-label">Experience</label> + <div class="col-sm-10"> + <textarea class="form-control" id="inputExperience" placeholder="Experience"></textarea> + </div> + </div> + <div class="form-group"> + <label for="inputSkills" class="col-sm-2 control-label">Skills</label> + <div class="col-sm-10"> + <input type="text" class="form-control" id="inputSkills" placeholder="Skills"> + </div> + </div> + <div class="form-group"> + <div class="col-sm-offset-2 col-sm-10"> + <div class="checkbox"> + <label> + <input type="checkbox"> I agree to the <a href="#">terms and conditions</a> + </label> + </div> + </div> + </div> + <div class="form-group"> + <div class="col-sm-offset-2 col-sm-10"> + <button type="submit" class="btn btn-danger">Submit</button> + </div> + </div> + </form> + </div><!-- /.tab-pane --> + </div><!-- /.tab-content --> + </div><!-- /.nav-tabs-custom --> + </div><!-- /.col --> + </div><!-- /.row --> + + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + </body> +</html> diff --git a/theme/bootstrap/pages/examples/register.html b/theme/bootstrap/pages/examples/register.html new file mode 100644 index 0000000..f692b01 --- /dev/null +++ b/theme/bootstrap/pages/examples/register.html @@ -0,0 +1,92 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Registration Page</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- iCheck --> + <link rel="stylesheet" href="../../plugins/iCheck/square/blue.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition register-page"> + <div class="register-box"> + <div class="register-logo"> + <a href="../../index2.html"><b>Admin</b>LTE</a> + </div> + + <div class="register-box-body"> + <p class="login-box-msg">Register a new membership</p> + <form action="../../index.html" method="post"> + <div class="form-group has-feedback"> + <input type="text" class="form-control" placeholder="Full name"> + <span class="glyphicon glyphicon-user form-control-feedback"></span> + </div> + <div class="form-group has-feedback"> + <input type="email" class="form-control" placeholder="Email"> + <span class="glyphicon glyphicon-envelope form-control-feedback"></span> + </div> + <div class="form-group has-feedback"> + <input type="password" class="form-control" placeholder="Password"> + <span class="glyphicon glyphicon-lock form-control-feedback"></span> + </div> + <div class="form-group has-feedback"> + <input type="password" class="form-control" placeholder="Retype password"> + <span class="glyphicon glyphicon-log-in form-control-feedback"></span> + </div> + <div class="row"> + <div class="col-xs-8"> + <div class="checkbox icheck"> + <label> + <input type="checkbox"> I agree to the <a href="#">terms</a> + </label> + </div> + </div><!-- /.col --> + <div class="col-xs-4"> + <button type="submit" class="btn btn-primary btn-block btn-flat">Register</button> + </div><!-- /.col --> + </div> + </form> + + <div class="social-auth-links text-center"> + <p>- OR -</p> + <a href="#" class="btn btn-block btn-social btn-facebook btn-flat"><i class="fa fa-facebook"></i> Sign up using Facebook</a> + <a href="#" class="btn btn-block btn-social btn-google btn-flat"><i class="fa fa-google-plus"></i> Sign up using Google+</a> + </div> + + <a href="login.html" class="text-center">I already have a membership</a> + </div><!-- /.form-box --> + </div><!-- /.register-box --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- iCheck --> + <script src="../../plugins/iCheck/icheck.min.js"></script> + <script> + $(function () { + $('input').iCheck({ + checkboxClass: 'icheckbox_square-blue', + radioClass: 'iradio_square-blue', + increaseArea: '20%' // optional + }); + }); + </script> + </body> +</html> diff --git a/theme/bootstrap/pages/forms/advanced.html b/theme/bootstrap/pages/forms/advanced.html new file mode 100644 index 0000000..be90dde --- /dev/null +++ b/theme/bootstrap/pages/forms/advanced.html @@ -0,0 +1,1061 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Advanced form elements</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- daterange picker --> + <link rel="stylesheet" href="../../plugins/daterangepicker/daterangepicker-bs3.css"> + <!-- iCheck for checkboxes and radio inputs --> + <link rel="stylesheet" href="../../plugins/iCheck/all.css"> + <!-- Bootstrap Color Picker --> + <link rel="stylesheet" href="../../plugins/colorpicker/bootstrap-colorpicker.min.css"> + <!-- Bootstrap time Picker --> + <link rel="stylesheet" href="../../plugins/timepicker/bootstrap-timepicker.min.css"> + <!-- Select2 --> + <link rel="stylesheet" href="../../plugins/select2/select2.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + AdminLTE Design Team + <small><i class="fa fa-clock-o"></i> 2 hours</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Developers + <small><i class="fa fa-clock-o"></i> Today</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Sales Department + <small><i class="fa fa-clock-o"></i> Yesterday</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Reviewers + <small><i class="fa fa-clock-o"></i> 2 days</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-users text-red"></i> 5 new members joined + </a> + </li> + + <li> + <a href="#"> + <i class="fa fa-shopping-cart text-green"></i> 25 sales made + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-user text-red"></i> You changed your username + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Create a nice theme + <small class="pull-right">40%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">40% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Some task I need to do + <small class="pull-right">60%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">60% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Make beautiful transitions + <small class="pull-right">80%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="../charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="../charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="../charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="../UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="../UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="../UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="../UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="../UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li class="active"><a href="advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="../examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="../examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="../examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="../examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="../examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="../examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="../examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Advanced Form Elements + <small>Preview</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">Forms</a></li> + <li class="active">Advanced Elements</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + + <!-- SELECT2 EXAMPLE --> + <div class="box box-default"> + <div class="box-header with-border"> + <h3 class="box-title">Select2</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-remove"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <div class="row"> + <div class="col-md-6"> + <div class="form-group"> + <label>Minimal</label> + <select class="form-control select2" style="width: 100%;"> + <option selected="selected">Alabama</option> + <option>Alaska</option> + <option>California</option> + <option>Delaware</option> + <option>Tennessee</option> + <option>Texas</option> + <option>Washington</option> + </select> + </div><!-- /.form-group --> + <div class="form-group"> + <label>Disabled</label> + <select class="form-control select2" disabled="disabled" style="width: 100%;"> + <option selected="selected">Alabama</option> + <option>Alaska</option> + <option>California</option> + <option>Delaware</option> + <option>Tennessee</option> + <option>Texas</option> + <option>Washington</option> + </select> + </div><!-- /.form-group --> + </div><!-- /.col --> + <div class="col-md-6"> + <div class="form-group"> + <label>Multiple</label> + <select class="form-control select2" multiple="multiple" data-placeholder="Select a State" style="width: 100%;"> + <option>Alabama</option> + <option>Alaska</option> + <option>California</option> + <option>Delaware</option> + <option>Tennessee</option> + <option>Texas</option> + <option>Washington</option> + </select> + </div><!-- /.form-group --> + <div class="form-group"> + <label>Disabled Result</label> + <select class="form-control select2" style="width: 100%;"> + <option selected="selected">Alabama</option> + <option>Alaska</option> + <option disabled="disabled">California (disabled)</option> + <option>Delaware</option> + <option>Tennessee</option> + <option>Texas</option> + <option>Washington</option> + </select> + </div><!-- /.form-group --> + </div><!-- /.col --> + </div><!-- /.row --> + </div><!-- /.box-body --> + <div class="box-footer"> + Visit <a href="https://select2.github.io/">Select2 documentation</a> for more examples and information about the plugin. + </div> + </div><!-- /.box --> + + <div class="row"> + <div class="col-md-6"> + + <div class="box box-danger"> + <div class="box-header"> + <h3 class="box-title">Input masks</h3> + </div> + <div class="box-body"> + <!-- Date dd/mm/yyyy --> + <div class="form-group"> + <label>Date masks:</label> + <div class="input-group"> + <div class="input-group-addon"> + <i class="fa fa-calendar"></i> + </div> + <input type="text" class="form-control" data-inputmask="'alias': 'dd/mm/yyyy'" data-mask> + </div><!-- /.input group --> + </div><!-- /.form group --> + + <!-- Date mm/dd/yyyy --> + <div class="form-group"> + <div class="input-group"> + <div class="input-group-addon"> + <i class="fa fa-calendar"></i> + </div> + <input type="text" class="form-control" data-inputmask="'alias': 'mm/dd/yyyy'" data-mask> + </div><!-- /.input group --> + </div><!-- /.form group --> + + <!-- phone mask --> + <div class="form-group"> + <label>US phone mask:</label> + <div class="input-group"> + <div class="input-group-addon"> + <i class="fa fa-phone"></i> + </div> + <input type="text" class="form-control" data-inputmask='"mask": "(999) 999-9999"' data-mask> + </div><!-- /.input group --> + </div><!-- /.form group --> + + <!-- phone mask --> + <div class="form-group"> + <label>Intl US phone mask:</label> + <div class="input-group"> + <div class="input-group-addon"> + <i class="fa fa-phone"></i> + </div> + <input type="text" class="form-control" data-inputmask="'mask': ['999-999-9999 [x99999]', '+099 99 99 9999[9]-9999']" data-mask> + </div><!-- /.input group --> + </div><!-- /.form group --> + + <!-- IP mask --> + <div class="form-group"> + <label>IP mask:</label> + <div class="input-group"> + <div class="input-group-addon"> + <i class="fa fa-laptop"></i> + </div> + <input type="text" class="form-control" data-inputmask="'alias': 'ip'" data-mask> + </div><!-- /.input group --> + </div><!-- /.form group --> + + </div><!-- /.box-body --> + </div><!-- /.box --> + + <div class="box box-info"> + <div class="box-header"> + <h3 class="box-title">Color & Time Picker</h3> + </div> + <div class="box-body"> + <!-- Color Picker --> + <div class="form-group"> + <label>Color picker:</label> + <input type="text" class="form-control my-colorpicker1"> + </div><!-- /.form group --> + + <!-- Color Picker --> + <div class="form-group"> + <label>Color picker with addon:</label> + <div class="input-group my-colorpicker2"> + <input type="text" class="form-control"> + <div class="input-group-addon"> + <i></i> + </div> + </div><!-- /.input group --> + </div><!-- /.form group --> + + <!-- time Picker --> + <div class="bootstrap-timepicker"> + <div class="form-group"> + <label>Time picker:</label> + <div class="input-group"> + <input type="text" class="form-control timepicker"> + <div class="input-group-addon"> + <i class="fa fa-clock-o"></i> + </div> + </div><!-- /.input group --> + </div><!-- /.form group --> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + + </div><!-- /.col (left) --> + <div class="col-md-6"> + <div class="box box-primary"> + <div class="box-header"> + <h3 class="box-title">Date picker</h3> + </div> + <div class="box-body"> + <!-- Date range --> + <div class="form-group"> + <label>Date range:</label> + <div class="input-group"> + <div class="input-group-addon"> + <i class="fa fa-calendar"></i> + </div> + <input type="text" class="form-control pull-right" id="reservation"> + </div><!-- /.input group --> + </div><!-- /.form group --> + + <!-- Date and time range --> + <div class="form-group"> + <label>Date and time range:</label> + <div class="input-group"> + <div class="input-group-addon"> + <i class="fa fa-clock-o"></i> + </div> + <input type="text" class="form-control pull-right" id="reservationtime"> + </div><!-- /.input group --> + </div><!-- /.form group --> + + <!-- Date and time range --> + <div class="form-group"> + <label>Date range button:</label> + <div class="input-group"> + <button class="btn btn-default pull-right" id="daterange-btn"> + <i class="fa fa-calendar"></i> Date range picker + <i class="fa fa-caret-down"></i> + </button> + </div> + </div><!-- /.form group --> + + </div><!-- /.box-body --> + </div><!-- /.box --> + + <!-- iCheck --> + <div class="box box-success"> + <div class="box-header"> + <h3 class="box-title">iCheck - Checkbox &amp; Radio Inputs</h3> + </div> + <div class="box-body"> + <!-- Minimal style --> + + <!-- checkbox --> + <div class="form-group"> + <label> + <input type="checkbox" class="minimal" checked> + </label> + <label> + <input type="checkbox" class="minimal"> + </label> + <label> + <input type="checkbox" class="minimal" disabled> + Minimal skin checkbox + </label> + </div> + + <!-- radio --> + <div class="form-group"> + <label> + <input type="radio" name="r1" class="minimal" checked> + </label> + <label> + <input type="radio" name="r1" class="minimal"> + </label> + <label> + <input type="radio" name="r1" class="minimal" disabled> + Minimal skin radio + </label> + </div> + + <!-- Minimal red style --> + + <!-- checkbox --> + <div class="form-group"> + <label> + <input type="checkbox" class="minimal-red" checked> + </label> + <label> + <input type="checkbox" class="minimal-red"> + </label> + <label> + <input type="checkbox" class="minimal-red" disabled> + Minimal red skin checkbox + </label> + </div> + + <!-- radio --> + <div class="form-group"> + <label> + <input type="radio" name="r2" class="minimal-red" checked> + </label> + <label> + <input type="radio" name="r2" class="minimal-red"> + </label> + <label> + <input type="radio" name="r2" class="minimal-red" disabled> + Minimal red skin radio + </label> + </div> + + <!-- Minimal red style --> + + <!-- checkbox --> + <div class="form-group"> + <label> + <input type="checkbox" class="flat-red" checked> + </label> + <label> + <input type="checkbox" class="flat-red"> + </label> + <label> + <input type="checkbox" class="flat-red" disabled> + Flat green skin checkbox + </label> + </div> + + <!-- radio --> + <div class="form-group"> + <label> + <input type="radio" name="r3" class="flat-red" checked> + </label> + <label> + <input type="radio" name="r3" class="flat-red"> + </label> + <label> + <input type="radio" name="r3" class="flat-red" disabled> + Flat green skin radio + </label> + </div> + </div><!-- /.box-body --> + <div class="box-footer"> + Many more skins available. <a href="http://fronteed.com/iCheck/">Documentation</a> + </div> + </div><!-- /.box --> + </div><!-- /.col (right) --> + </div><!-- /.row --> + + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- Select2 --> + <script src="../../plugins/select2/select2.full.min.js"></script> + <!-- InputMask --> + <script src="../../plugins/input-mask/jquery.inputmask.js"></script> + <script src="../../plugins/input-mask/jquery.inputmask.date.extensions.js"></script> + <script src="../../plugins/input-mask/jquery.inputmask.extensions.js"></script> + <!-- date-range-picker --> + <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.2/moment.min.js"></script> + <script src="../../plugins/daterangepicker/daterangepicker.js"></script> + <!-- bootstrap color picker --> + <script src="../../plugins/colorpicker/bootstrap-colorpicker.min.js"></script> + <!-- bootstrap time picker --> + <script src="../../plugins/timepicker/bootstrap-timepicker.min.js"></script> + <!-- SlimScroll 1.3.0 --> + <script src="../../plugins/slimScroll/jquery.slimscroll.min.js"></script> + <!-- iCheck 1.0.1 --> + <script src="../../plugins/iCheck/icheck.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + <!-- Page script --> + <script> + $(function () { + //Initialize Select2 Elements + $(".select2").select2(); + + //Datemask dd/mm/yyyy + $("#datemask").inputmask("dd/mm/yyyy", {"placeholder": "dd/mm/yyyy"}); + //Datemask2 mm/dd/yyyy + $("#datemask2").inputmask("mm/dd/yyyy", {"placeholder": "mm/dd/yyyy"}); + //Money Euro + $("[data-mask]").inputmask(); + + //Date range picker + $('#reservation').daterangepicker(); + //Date range picker with time picker + $('#reservationtime').daterangepicker({timePicker: true, timePickerIncrement: 30, format: 'MM/DD/YYYY h:mm A'}); + //Date range as a button + $('#daterange-btn').daterangepicker( + { + ranges: { + 'Today': [moment(), moment()], + 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')], + 'Last 7 Days': [moment().subtract(6, 'days'), moment()], + 'Last 30 Days': [moment().subtract(29, 'days'), moment()], + 'This Month': [moment().startOf('month'), moment().endOf('month')], + 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')] + }, + startDate: moment().subtract(29, 'days'), + endDate: moment() + }, + function (start, end) { + $('#reportrange span').html(start.format('MMMM D, YYYY') + ' - ' + end.format('MMMM D, YYYY')); + } + ); + + //iCheck for checkbox and radio inputs + $('input[type="checkbox"].minimal, input[type="radio"].minimal').iCheck({ + checkboxClass: 'icheckbox_minimal-blue', + radioClass: 'iradio_minimal-blue' + }); + //Red color scheme for iCheck + $('input[type="checkbox"].minimal-red, input[type="radio"].minimal-red').iCheck({ + checkboxClass: 'icheckbox_minimal-red', + radioClass: 'iradio_minimal-red' + }); + //Flat red color scheme for iCheck + $('input[type="checkbox"].flat-red, input[type="radio"].flat-red').iCheck({ + checkboxClass: 'icheckbox_flat-green', + radioClass: 'iradio_flat-green' + }); + + //Colorpicker + $(".my-colorpicker1").colorpicker(); + //color picker with addon + $(".my-colorpicker2").colorpicker(); + + //Timepicker + $(".timepicker").timepicker({ + showInputs: false + }); + }); + </script> + </body> +</html> diff --git a/theme/bootstrap/pages/forms/editors.html b/theme/bootstrap/pages/forms/editors.html new file mode 100644 index 0000000..8b09226 --- /dev/null +++ b/theme/bootstrap/pages/forms/editors.html @@ -0,0 +1,703 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Editors</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + <!-- bootstrap wysihtml5 - text editor --> + <link rel="stylesheet" href="../../plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + AdminLTE Design Team + <small><i class="fa fa-clock-o"></i> 2 hours</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Developers + <small><i class="fa fa-clock-o"></i> Today</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Sales Department + <small><i class="fa fa-clock-o"></i> Yesterday</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Reviewers + <small><i class="fa fa-clock-o"></i> 2 days</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-users text-red"></i> 5 new members joined + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-shopping-cart text-green"></i> 25 sales made + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-user text-red"></i> You changed your username + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Create a nice theme + <small class="pull-right">40%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">40% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Some task I need to do + <small class="pull-right">60%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">60% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Make beautiful transitions + <small class="pull-right">80%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="../charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="../charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="../charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="../UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="../UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="../UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="../UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="../UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li class="active"><a href="editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="../examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="../examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="../examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="../examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="../examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="../examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="../examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Text Editors + <small>Advanced form element</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">Forms</a></li> + <li class="active">Editors</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-md-12"> + <div class="box box-info"> + <div class="box-header"> + <h3 class="box-title">CK Editor <small>Advanced and full of features</small></h3> + <!-- tools box --> + <div class="pull-right box-tools"> + <button class="btn btn-info btn-sm" data-widget="collapse" data-toggle="tooltip" title="Collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-info btn-sm" data-widget="remove" data-toggle="tooltip" title="Remove"><i class="fa fa-times"></i></button> + </div><!-- /. tools --> + </div><!-- /.box-header --> + <div class="box-body pad"> + <form> + <textarea id="editor1" name="editor1" rows="10" cols="80"> + This is my textarea to be replaced with CKEditor. + </textarea> + </form> + </div> + </div><!-- /.box --> + + <div class="box"> + <div class="box-header"> + <h3 class="box-title">Bootstrap WYSIHTML5 <small>Simple and fast</small></h3> + <!-- tools box --> + <div class="pull-right box-tools"> + <button class="btn btn-default btn-sm" data-widget="collapse" data-toggle="tooltip" title="Collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-default btn-sm" data-widget="remove" data-toggle="tooltip" title="Remove"><i class="fa fa-times"></i></button> + </div><!-- /. tools --> + </div><!-- /.box-header --> + <div class="box-body pad"> + <form> + <textarea class="textarea" placeholder="Place some text here" style="width: 100%; height: 200px; font-size: 14px; line-height: 18px; border: 1px solid #dddddd; padding: 10px;"></textarea> + </form> + </div> + </div> + </div><!-- /.col--> + </div><!-- ./row --> + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + <!-- CK Editor --> + <script src="https://cdn.ckeditor.com/4.4.3/standard/ckeditor.js"></script> + <!-- Bootstrap WYSIHTML5 --> + <script src="../../plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js"></script> + <script> + $(function () { + // Replace the <textarea id="editor1"> with a CKEditor + // instance, using default configuration. + CKEDITOR.replace('editor1'); + //bootstrap WYSIHTML5 - text editor + $(".textarea").wysihtml5(); + }); + </script> + </body> +</html> diff --git a/theme/bootstrap/pages/forms/general.html b/theme/bootstrap/pages/forms/general.html new file mode 100644 index 0000000..5b56fa3 --- /dev/null +++ b/theme/bootstrap/pages/forms/general.html @@ -0,0 +1,988 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | General Form Elements</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + AdminLTE Design Team + <small><i class="fa fa-clock-o"></i> 2 hours</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Developers + <small><i class="fa fa-clock-o"></i> Today</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Sales Department + <small><i class="fa fa-clock-o"></i> Yesterday</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Reviewers + <small><i class="fa fa-clock-o"></i> 2 days</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-users text-red"></i> 5 new members joined + </a> + </li> + + <li> + <a href="#"> + <i class="fa fa-shopping-cart text-green"></i> 25 sales made + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-user text-red"></i> You changed your username + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Create a nice theme + <small class="pull-right">40%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">40% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Some task I need to do + <small class="pull-right">60%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">60% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Make beautiful transitions + <small class="pull-right">80%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="../charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="../charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="../charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="../UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="../UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="../UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="../UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="../UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li class="active"><a href="general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="../examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="../examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="../examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="../examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="../examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="../examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="../examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + General Form Elements + <small>Preview</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">Forms</a></li> + <li class="active">General Elements</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <!-- left column --> + <div class="col-md-6"> + <!-- general form elements --> + <div class="box box-primary"> + <div class="box-header with-border"> + <h3 class="box-title">Quick Example</h3> + </div><!-- /.box-header --> + <!-- form start --> + <form role="form"> + <div class="box-body"> + <div class="form-group"> + <label for="exampleInputEmail1">Email address</label> + <input type="email" class="form-control" id="exampleInputEmail1" placeholder="Enter email"> + </div> + <div class="form-group"> + <label for="exampleInputPassword1">Password</label> + <input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password"> + </div> + <div class="form-group"> + <label for="exampleInputFile">File input</label> + <input type="file" id="exampleInputFile"> + <p class="help-block">Example block-level help text here.</p> + </div> + <div class="checkbox"> + <label> + <input type="checkbox"> Check me out + </label> + </div> + </div><!-- /.box-body --> + + <div class="box-footer"> + <button type="submit" class="btn btn-primary">Submit</button> + </div> + </form> + </div><!-- /.box --> + + <!-- Form Element sizes --> + <div class="box box-success"> + <div class="box-header with-border"> + <h3 class="box-title">Different Height</h3> + </div> + <div class="box-body"> + <input class="form-control input-lg" type="text" placeholder=".input-lg"> + <br> + <input class="form-control" type="text" placeholder="Default input"> + <br> + <input class="form-control input-sm" type="text" placeholder=".input-sm"> + </div><!-- /.box-body --> + </div><!-- /.box --> + + <div class="box box-danger"> + <div class="box-header with-border"> + <h3 class="box-title">Different Width</h3> + </div> + <div class="box-body"> + <div class="row"> + <div class="col-xs-3"> + <input type="text" class="form-control" placeholder=".col-xs-3"> + </div> + <div class="col-xs-4"> + <input type="text" class="form-control" placeholder=".col-xs-4"> + </div> + <div class="col-xs-5"> + <input type="text" class="form-control" placeholder=".col-xs-5"> + </div> + </div> + </div><!-- /.box-body --> + </div><!-- /.box --> + + <!-- Input addon --> + <div class="box box-info"> + <div class="box-header with-border"> + <h3 class="box-title">Input Addon</h3> + </div> + <div class="box-body"> + <div class="input-group"> + <span class="input-group-addon">@</span> + <input type="text" class="form-control" placeholder="Username"> + </div> + <br> + <div class="input-group"> + <input type="text" class="form-control"> + <span class="input-group-addon">.00</span> + </div> + <br> + <div class="input-group"> + <span class="input-group-addon">$</span> + <input type="text" class="form-control"> + <span class="input-group-addon">.00</span> + </div> + + <h4>With icons</h4> + <div class="input-group"> + <span class="input-group-addon"><i class="fa fa-envelope"></i></span> + <input type="email" class="form-control" placeholder="Email"> + </div> + <br> + <div class="input-group"> + <input type="text" class="form-control"> + <span class="input-group-addon"><i class="fa fa-check"></i></span> + </div> + <br> + <div class="input-group"> + <span class="input-group-addon"><i class="fa fa-dollar"></i></span> + <input type="text" class="form-control"> + <span class="input-group-addon"><i class="fa fa-ambulance"></i></span> + </div> + + <h4>With checkbox and radio inputs</h4> + <div class="row"> + <div class="col-lg-6"> + <div class="input-group"> + <span class="input-group-addon"> + <input type="checkbox"> + </span> + <input type="text" class="form-control"> + </div><!-- /input-group --> + </div><!-- /.col-lg-6 --> + <div class="col-lg-6"> + <div class="input-group"> + <span class="input-group-addon"> + <input type="radio"> + </span> + <input type="text" class="form-control"> + </div><!-- /input-group --> + </div><!-- /.col-lg-6 --> + </div><!-- /.row --> + + <h4>With buttons</h4> + <p class="margin">Large: <code>.input-group.input-group-lg</code></p> + <div class="input-group input-group-lg"> + <div class="input-group-btn"> + <button type="button" class="btn btn-warning dropdown-toggle" data-toggle="dropdown">Action <span class="fa fa-caret-down"></span></button> + <ul class="dropdown-menu"> + <li><a href="#">Action</a></li> + <li><a href="#">Another action</a></li> + <li><a href="#">Something else here</a></li> + <li class="divider"></li> + <li><a href="#">Separated link</a></li> + </ul> + </div><!-- /btn-group --> + <input type="text" class="form-control"> + </div><!-- /input-group --> + <p class="margin">Normal</p> + <div class="input-group"> + <div class="input-group-btn"> + <button type="button" class="btn btn-danger">Action</button> + </div><!-- /btn-group --> + <input type="text" class="form-control"> + </div><!-- /input-group --> + <p class="margin">Small <code>.input-group.input-group-sm</code></p> + <div class="input-group input-group-sm"> + <input type="text" class="form-control"> + <span class="input-group-btn"> + <button class="btn btn-info btn-flat" type="button">Go!</button> + </span> + </div><!-- /input-group --> + </div><!-- /.box-body --> + </div><!-- /.box --> + + </div><!--/.col (left) --> + <!-- right column --> + <div class="col-md-6"> + <!-- Horizontal Form --> + <div class="box box-info"> + <div class="box-header with-border"> + <h3 class="box-title">Horizontal Form</h3> + </div><!-- /.box-header --> + <!-- form start --> + <form class="form-horizontal"> + <div class="box-body"> + <div class="form-group"> + <label for="inputEmail3" class="col-sm-2 control-label">Email</label> + <div class="col-sm-10"> + <input type="email" class="form-control" id="inputEmail3" placeholder="Email"> + </div> + </div> + <div class="form-group"> + <label for="inputPassword3" class="col-sm-2 control-label">Password</label> + <div class="col-sm-10"> + <input type="password" class="form-control" id="inputPassword3" placeholder="Password"> + </div> + </div> + <div class="form-group"> + <div class="col-sm-offset-2 col-sm-10"> + <div class="checkbox"> + <label> + <input type="checkbox"> Remember me + </label> + </div> + </div> + </div> + </div><!-- /.box-body --> + <div class="box-footer"> + <button type="submit" class="btn btn-default">Cancel</button> + <button type="submit" class="btn btn-info pull-right">Sign in</button> + </div><!-- /.box-footer --> + </form> + </div><!-- /.box --> + <!-- general form elements disabled --> + <div class="box box-warning"> + <div class="box-header with-border"> + <h3 class="box-title">General Elements</h3> + </div><!-- /.box-header --> + <div class="box-body"> + <form role="form"> + <!-- text input --> + <div class="form-group"> + <label>Text</label> + <input type="text" class="form-control" placeholder="Enter ..."> + </div> + <div class="form-group"> + <label>Text Disabled</label> + <input type="text" class="form-control" placeholder="Enter ..." disabled> + </div> + + <!-- textarea --> + <div class="form-group"> + <label>Textarea</label> + <textarea class="form-control" rows="3" placeholder="Enter ..."></textarea> + </div> + <div class="form-group"> + <label>Textarea Disabled</label> + <textarea class="form-control" rows="3" placeholder="Enter ..." disabled></textarea> + </div> + + <!-- input states --> + <div class="form-group has-success"> + <label class="control-label" for="inputSuccess"><i class="fa fa-check"></i> Input with success</label> + <input type="text" class="form-control" id="inputSuccess" placeholder="Enter ..."> + </div> + <div class="form-group has-warning"> + <label class="control-label" for="inputWarning"><i class="fa fa-bell-o"></i> Input with warning</label> + <input type="text" class="form-control" id="inputWarning" placeholder="Enter ..."> + </div> + <div class="form-group has-error"> + <label class="control-label" for="inputError"><i class="fa fa-times-circle-o"></i> Input with error</label> + <input type="text" class="form-control" id="inputError" placeholder="Enter ..."> + </div> + + <!-- checkbox --> + <div class="form-group"> + <div class="checkbox"> + <label> + <input type="checkbox"> + Checkbox 1 + </label> + </div> + + <div class="checkbox"> + <label> + <input type="checkbox"> + Checkbox 2 + </label> + </div> + + <div class="checkbox"> + <label> + <input type="checkbox" disabled> + Checkbox disabled + </label> + </div> + </div> + + <!-- radio --> + <div class="form-group"> + <div class="radio"> + <label> + <input type="radio" name="optionsRadios" id="optionsRadios1" value="option1" checked> + Option one is this and that&mdash;be sure to include why it's great + </label> + </div> + <div class="radio"> + <label> + <input type="radio" name="optionsRadios" id="optionsRadios2" value="option2"> + Option two can be something else and selecting it will deselect option one + </label> + </div> + <div class="radio"> + <label> + <input type="radio" name="optionsRadios" id="optionsRadios3" value="option3" disabled> + Option three is disabled + </label> + </div> + </div> + + <!-- select --> + <div class="form-group"> + <label>Select</label> + <select class="form-control"> + <option>option 1</option> + <option>option 2</option> + <option>option 3</option> + <option>option 4</option> + <option>option 5</option> + </select> + </div> + <div class="form-group"> + <label>Select Disabled</label> + <select class="form-control" disabled> + <option>option 1</option> + <option>option 2</option> + <option>option 3</option> + <option>option 4</option> + <option>option 5</option> + </select> + </div> + + <!-- Select multiple--> + <div class="form-group"> + <label>Select Multiple</label> + <select multiple class="form-control"> + <option>option 1</option> + <option>option 2</option> + <option>option 3</option> + <option>option 4</option> + <option>option 5</option> + </select> + </div> + <div class="form-group"> + <label>Select Multiple Disabled</label> + <select multiple class="form-control" disabled> + <option>option 1</option> + <option>option 2</option> + <option>option 3</option> + <option>option 4</option> + <option>option 5</option> + </select> + </div> + + </form> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!--/.col (right) --> + </div> <!-- /.row --> + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + </body> +</html> diff --git a/theme/bootstrap/pages/layout/boxed.html b/theme/bootstrap/pages/layout/boxed.html new file mode 100644 index 0000000..ea92584 --- /dev/null +++ b/theme/bootstrap/pages/layout/boxed.html @@ -0,0 +1,571 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Boxed Layout</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <!-- ADD THE CLASS layout-boxed TO GET A BOXED LAYOUT --> + <body class="hold-transition skin-blue layout-boxed sidebar-mini"> + <!-- Site wrapper --> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + + <!-- =============================================== --> + + <!-- Left side column. contains the sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li class="active"><a href="boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="../charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="../charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="../charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="../UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="../UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="../UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="../UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="../UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="../examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="../examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="../examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="../examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="../examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="../examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="../examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- =============================================== --> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Boxed Layout + <small>Blank example to the boxed layout</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">Layout</a></li> + <li class="active">Boxed</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="callout callout-info"> + <h4>Tip!</h4> + <p>Add the layout-boxed class to the body tag to get this layout. The boxed layout is helpful when working on large screens because it prevents the site from stretching very wide.</p> + </div> + <!-- Default box --> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title">Title</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse" data-toggle="tooltip" title="Collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove" data-toggle="tooltip" title="Remove"><i class="fa fa-times"></i></button> + </div> + </div> + <div class="box-body"> + Start creating your amazing application! + </div><!-- /.box-body --> + <div class="box-footer"> + Footer + </div><!-- /.box-footer--> + </div><!-- /.box --> + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- SlimScroll --> + <script src="../../plugins/slimScroll/jquery.slimscroll.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + </body> +</html> diff --git a/theme/bootstrap/pages/layout/collapsed-sidebar.html b/theme/bootstrap/pages/layout/collapsed-sidebar.html new file mode 100644 index 0000000..c5651b5 --- /dev/null +++ b/theme/bootstrap/pages/layout/collapsed-sidebar.html @@ -0,0 +1,574 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Collapsed Sidebar Layout</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <!-- ADD THE CLASS sidedar-collapse TO HIDE THE SIDEBAR PRIOR TO LOADING THE SITE --> + <body class="hold-transition skin-blue sidebar-collapse sidebar-mini"> + <!-- Site wrapper --> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + + <!-- =============================================== --> + + <!-- Left side column. contains the sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li class="active"><a href="collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="../charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="../charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="../charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="../UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="../UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="../UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="../UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="../UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="../examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="../examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="../examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="../examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="../examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="../examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="../examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- =============================================== --> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Sidebar Collapsed + <small>Layout with collapsed sidebar on load</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">Layout</a></li> + <li class="active">Collapsed Sidebar</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="callout callout-info"> + <h4>Tip!</h4> + <p>Add the sidebar-collapse class to the body tag to get this layout. You should combine this option with a fixed layout if you have a long sidebar. Doing that will prevent your page content from getting stretched vertically.</p> + </div> + <!-- Default box --> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title">Title</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse" data-toggle="tooltip" title="Collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove" data-toggle="tooltip" title="Remove"><i class="fa fa-times"></i></button> + </div> + </div> + <div class="box-body"> + Start creating your amazing application! + </div><!-- /.box-body --> + <div class="box-footer"> + Footer + </div><!-- /.box-footer--> + </div><!-- /.box --> + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- SlimScroll --> + <script src="../../plugins/slimScroll/jquery.slimscroll.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + </body> +</html> diff --git a/theme/bootstrap/pages/layout/fixed.html b/theme/bootstrap/pages/layout/fixed.html new file mode 100644 index 0000000..36ad504 --- /dev/null +++ b/theme/bootstrap/pages/layout/fixed.html @@ -0,0 +1,576 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Fixed Layout</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <!-- ADD THE CLASS fixed TO GET A FIXED HEADER AND SIDEBAR LAYOUT --> + <!-- the fixed layout is not compatible with sidebar-mini --> + <body class="hold-transition skin-blue fixed sidebar-mini"> + <!-- Site wrapper --> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + + <!-- =============================================== --> + + <!-- Left side column. contains the sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li class="active"><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="../charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="../charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="../charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="../UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="../UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="../UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="../UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="../UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="../examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="../examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="../examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="../examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="../examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="../examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="../examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- =============================================== --> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Fixed Layout + <small>Blank example to the fixed layout</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">Layout</a></li> + <li class="active">Fixed</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="callout callout-info"> + <h4>Tip!</h4> + <p>Add the fixed class to the body tag to get this layout. The fixed layout is your best option if your sidebar is bigger than your content because it prevents extra unwanted scrolling.</p> + </div> + <!-- Default box --> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title">Title</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse" data-toggle="tooltip" title="Collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-widget="remove" data-toggle="tooltip" title="Remove"><i class="fa fa-times"></i></button> + </div> + </div> + <div class="box-body"> + Start creating your amazing application! + </div><!-- /.box-body --> + <div class="box-footer"> + Footer + </div><!-- /.box-footer--> + </div><!-- /.box --> + + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- SlimScroll --> + <script src="../../plugins/slimScroll/jquery.slimscroll.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + </body> +</html> diff --git a/theme/bootstrap/pages/layout/top-nav.html b/theme/bootstrap/pages/layout/top-nav.html new file mode 100644 index 0000000..fd25f26 --- /dev/null +++ b/theme/bootstrap/pages/layout/top-nav.html @@ -0,0 +1,265 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Top Navigation</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <!-- ADD THE CLASS layout-top-nav TO REMOVE THE SIDEBAR. --> + <body class="hold-transition skin-blue layout-top-nav"> + <div class="wrapper"> + + <header class="main-header"> + <nav class="navbar navbar-static-top"> + <div class="container"> + <div class="navbar-header"> + <a href="../../index2.html" class="navbar-brand"><b>Admin</b>LTE</a> + <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-collapse"> + <i class="fa fa-bars"></i> + </button> + </div> + + <!-- Collect the nav links, forms, and other content for toggling --> + <div class="collapse navbar-collapse pull-left" id="navbar-collapse"> + <ul class="nav navbar-nav"> + <li class="active"><a href="#">Link <span class="sr-only">(current)</span></a></li> + <li><a href="#">Link</a></li> + <li class="dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <span class="caret"></span></a> + <ul class="dropdown-menu" role="menu"> + <li><a href="#">Action</a></li> + <li><a href="#">Another action</a></li> + <li><a href="#">Something else here</a></li> + <li class="divider"></li> + <li><a href="#">Separated link</a></li> + <li class="divider"></li> + <li><a href="#">One more separated link</a></li> + </ul> + </li> + </ul> + <form class="navbar-form navbar-left" role="search"> + <div class="form-group"> + <input type="text" class="form-control" id="navbar-search-input" placeholder="Search"> + </div> + </form> + </div><!-- /.navbar-collapse --> + <!-- Navbar Right Menu --> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <!-- Menu toggle button --> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the messages --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <!-- User Image --> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <!-- Message title and timestamp --> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <!-- The message --> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + </ul><!-- /.menu --> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li><!-- /.messages-menu --> + + <!-- Notifications Menu --> + <li class="dropdown notifications-menu"> + <!-- Menu toggle button --> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- Inner Menu: contains the notifications --> + <ul class="menu"> + <li><!-- start notification --> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li><!-- end notification --> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks Menu --> + <li class="dropdown tasks-menu"> + <!-- Menu Toggle Button --> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- Inner menu: contains the tasks --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <!-- Task title and progress text --> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <!-- The progress bar --> + <div class="progress xs"> + <!-- Change the css width attribute to simulate progress --> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account Menu --> + <li class="dropdown user user-menu"> + <!-- Menu Toggle Button --> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <!-- The user image in the navbar--> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <!-- hidden-xs hides the username on small devices so only the image appears. --> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- The user image in the menu --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + </ul> + </div><!-- /.navbar-custom-menu --> + </div><!-- /.container-fluid --> + </nav> + </header> + <!-- Full Width Column --> + <div class="content-wrapper"> + <div class="container"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Top Navigation + <small>Example 2.0</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">Layout</a></li> + <li class="active">Top Navigation</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="callout callout-info"> + <h4>Tip!</h4> + <p>Add the layout-top-nav class to the body tag to get this layout. This feature can also be used with a sidebar! So use this class if you want to remove the custom dropdown menus from the navbar and use regular links instead.</p> + </div> + <div class="callout callout-danger"> + <h4>Warning!</h4> + <p>The construction of this layout differs from the normal one. In other words, the HTML markup of the navbar and the content will slightly differ than that of the normal layout.</p> + </div> + <div class="box box-default"> + <div class="box-header with-border"> + <h3 class="box-title">Blank Box</h3> + </div> + <div class="box-body"> + The great content goes here + </div><!-- /.box-body --> + </div><!-- /.box --> + </section><!-- /.content --> + </div><!-- /.container --> + </div><!-- /.content-wrapper --> + <footer class="main-footer"> + <div class="container"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </div><!-- /.container --> + </footer> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- SlimScroll --> + <script src="../../plugins/slimScroll/jquery.slimscroll.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + </body> +</html> diff --git a/theme/bootstrap/pages/mailbox/compose.html b/theme/bootstrap/pages/mailbox/compose.html new file mode 100644 index 0000000..9836fc7 --- /dev/null +++ b/theme/bootstrap/pages/mailbox/compose.html @@ -0,0 +1,649 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Compose Message</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- fullCalendar 2.2.5--> + <link rel="stylesheet" href="../../plugins/fullcalendar/fullcalendar.min.css"> + <link rel="stylesheet" href="../../plugins/fullcalendar/fullcalendar.print.css" media="print"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + <!-- iCheck --> + <link rel="stylesheet" href="../../plugins/iCheck/flat/blue.css"> + <!-- bootstrap wysihtml5 - text editor --> + <link rel="stylesheet" href="../../plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="../charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="../charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="../charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="../UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="../UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="../UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="../UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="../UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li class="treeview active"> + <a href="mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="mailbox.html">Inbox <span class="label label-primary pull-right">13</span></a></li> + <li class="active"><a href="compose.html">Compose</a></li> + <li><a href="read-mail.html">Read</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="../examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="../examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="../examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="../examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="../examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="../examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="../examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Mailbox + <small>13 new messages</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li class="active">Mailbox</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-md-3"> + <a href="mailbox.html" class="btn btn-primary btn-block margin-bottom">Back to Inbox</a> + <div class="box box-solid"> + <div class="box-header with-border"> + <h3 class="box-title">Folders</h3> + <div class="box-tools"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + </div> + </div> + <div class="box-body no-padding"> + <ul class="nav nav-pills nav-stacked"> + <li><a href="mailbox.html"><i class="fa fa-inbox"></i> Inbox <span class="label label-primary pull-right">12</span></a></li> + <li><a href="#"><i class="fa fa-envelope-o"></i> Sent</a></li> + <li><a href="#"><i class="fa fa-file-text-o"></i> Drafts</a></li> + <li><a href="#"><i class="fa fa-filter"></i> Junk <span class="label label-warning pull-right">65</span></a></li> + <li><a href="#"><i class="fa fa-trash-o"></i> Trash</a></li> + </ul> + </div><!-- /.box-body --> + </div><!-- /. box --> + <div class="box box-solid"> + <div class="box-header with-border"> + <h3 class="box-title">Labels</h3> + <div class="box-tools"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body no-padding"> + <ul class="nav nav-pills nav-stacked"> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> Important</a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> Promotions</a></li> + <li><a href="#"><i class="fa fa-circle-o text-light-blue"></i> Social</a></li> + </ul> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + <div class="col-md-9"> + <div class="box box-primary"> + <div class="box-header with-border"> + <h3 class="box-title">Compose New Message</h3> + </div><!-- /.box-header --> + <div class="box-body"> + <div class="form-group"> + <input class="form-control" placeholder="To:"> + </div> + <div class="form-group"> + <input class="form-control" placeholder="Subject:"> + </div> + <div class="form-group"> + <textarea id="compose-textarea" class="form-control" style="height: 300px"> + <h1><u>Heading Of Message</u></h1> + <h4>Subheading</h4> + <p>But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure? On the other hand, we denounce with righteous indignation and dislike men who are so beguiled and demoralized by the charms of pleasure of the moment, so blinded by desire, that they cannot foresee</p> + <ul> + <li>List item one</li> + <li>List item two</li> + <li>List item three</li> + <li>List item four</li> + </ul> + <p>Thank you,</p> + <p>John Doe</p> + </textarea> + </div> + <div class="form-group"> + <div class="btn btn-default btn-file"> + <i class="fa fa-paperclip"></i> Attachment + <input type="file" name="attachment"> + </div> + <p class="help-block">Max. 32MB</p> + </div> + </div><!-- /.box-body --> + <div class="box-footer"> + <div class="pull-right"> + <button class="btn btn-default"><i class="fa fa-pencil"></i> Draft</button> + <button type="submit" class="btn btn-primary"><i class="fa fa-envelope-o"></i> Send</button> + </div> + <button class="btn btn-default"><i class="fa fa-times"></i> Discard</button> + </div><!-- /.box-footer --> + </div><!-- /. box --> + </div><!-- /.col --> + </div><!-- /.row --> + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- Slimscroll --> + <script src="../../plugins/slimScroll/jquery.slimscroll.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + <!-- iCheck --> + <script src="../../plugins/iCheck/icheck.min.js"></script> + <!-- Bootstrap WYSIHTML5 --> + <script src="../../plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js"></script> + <!-- Page Script --> + <script> + $(function () { + //Add text editor + $("#compose-textarea").wysihtml5(); + }); + </script> + </body> +</html> diff --git a/theme/bootstrap/pages/mailbox/mailbox.html b/theme/bootstrap/pages/mailbox/mailbox.html new file mode 100644 index 0000000..ed6bd71 --- /dev/null +++ b/theme/bootstrap/pages/mailbox/mailbox.html @@ -0,0 +1,816 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Mailbox</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- fullCalendar 2.2.5--> + <link rel="stylesheet" href="../../plugins/fullcalendar/fullcalendar.min.css"> + <link rel="stylesheet" href="../../plugins/fullcalendar/fullcalendar.print.css" media="print"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + <!-- iCheck --> + <link rel="stylesheet" href="../../plugins/iCheck/flat/blue.css"> + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="../charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="../charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="../charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="../UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="../UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="../UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="../UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="../UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li class="treeview active"> + <a href="mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li class="active"><a href="mailbox.html">Inbox <span class="label label-primary pull-right">13</span></a></li> + <li><a href="compose.html">Compose</a></li> + <li><a href="read-mail.html">Read</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="../examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="../examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="../examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="../examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="../examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="../examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="../examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Mailbox + <small>13 new messages</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li class="active">Mailbox</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-md-3"> + <a href="compose.html" class="btn btn-primary btn-block margin-bottom">Compose</a> + <div class="box box-solid"> + <div class="box-header with-border"> + <h3 class="box-title">Folders</h3> + <div class="box-tools"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + </div> + </div> + <div class="box-body no-padding"> + <ul class="nav nav-pills nav-stacked"> + <li class="active"><a href="#"><i class="fa fa-inbox"></i> Inbox <span class="label label-primary pull-right">12</span></a></li> + <li><a href="#"><i class="fa fa-envelope-o"></i> Sent</a></li> + <li><a href="#"><i class="fa fa-file-text-o"></i> Drafts</a></li> + <li><a href="#"><i class="fa fa-filter"></i> Junk <span class="label label-warning pull-right">65</span></a></li> + <li><a href="#"><i class="fa fa-trash-o"></i> Trash</a></li> + </ul> + </div><!-- /.box-body --> + </div><!-- /. box --> + <div class="box box-solid"> + <div class="box-header with-border"> + <h3 class="box-title">Labels</h3> + <div class="box-tools"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + </div> + </div> + <div class="box-body no-padding"> + <ul class="nav nav-pills nav-stacked"> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> Important</a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> Promotions</a></li> + <li><a href="#"><i class="fa fa-circle-o text-light-blue"></i> Social</a></li> + </ul> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + <div class="col-md-9"> + <div class="box box-primary"> + <div class="box-header with-border"> + <h3 class="box-title">Inbox</h3> + <div class="box-tools pull-right"> + <div class="has-feedback"> + <input type="text" class="form-control input-sm" placeholder="Search Mail"> + <span class="glyphicon glyphicon-search form-control-feedback"></span> + </div> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class="box-body no-padding"> + <div class="mailbox-controls"> + <!-- Check all button --> + <button class="btn btn-default btn-sm checkbox-toggle"><i class="fa fa-square-o"></i></button> + <div class="btn-group"> + <button class="btn btn-default btn-sm"><i class="fa fa-trash-o"></i></button> + <button class="btn btn-default btn-sm"><i class="fa fa-reply"></i></button> + <button class="btn btn-default btn-sm"><i class="fa fa-share"></i></button> + </div><!-- /.btn-group --> + <button class="btn btn-default btn-sm"><i class="fa fa-refresh"></i></button> + <div class="pull-right"> + 1-50/200 + <div class="btn-group"> + <button class="btn btn-default btn-sm"><i class="fa fa-chevron-left"></i></button> + <button class="btn btn-default btn-sm"><i class="fa fa-chevron-right"></i></button> + </div><!-- /.btn-group --> + </div><!-- /.pull-right --> + </div> + <div class="table-responsive mailbox-messages"> + <table class="table table-hover table-striped"> + <tbody> + <tr> + <td><input type="checkbox"></td> + <td class="mailbox-star"><a href="#"><i class="fa fa-star text-yellow"></i></a></td> + <td class="mailbox-name"><a href="read-mail.html">Alexander Pierce</a></td> + <td class="mailbox-subject"><b>AdminLTE 2.0 Issue</b> - Trying to find a solution to this problem...</td> + <td class="mailbox-attachment"></td> + <td class="mailbox-date">5 mins ago</td> + </tr> + <tr> + <td><input type="checkbox"></td> + <td class="mailbox-star"><a href="#"><i class="fa fa-star-o text-yellow"></i></a></td> + <td class="mailbox-name"><a href="read-mail.html">Alexander Pierce</a></td> + <td class="mailbox-subject"><b>AdminLTE 2.0 Issue</b> - Trying to find a solution to this problem...</td> + <td class="mailbox-attachment"><i class="fa fa-paperclip"></i></td> + <td class="mailbox-date">28 mins ago</td> + </tr> + <tr> + <td><input type="checkbox"></td> + <td class="mailbox-star"><a href="#"><i class="fa fa-star-o text-yellow"></i></a></td> + <td class="mailbox-name"><a href="read-mail.html">Alexander Pierce</a></td> + <td class="mailbox-subject"><b>AdminLTE 2.0 Issue</b> - Trying to find a solution to this problem...</td> + <td class="mailbox-attachment"><i class="fa fa-paperclip"></i></td> + <td class="mailbox-date">11 hours ago</td> + </tr> + <tr> + <td><input type="checkbox"></td> + <td class="mailbox-star"><a href="#"><i class="fa fa-star text-yellow"></i></a></td> + <td class="mailbox-name"><a href="read-mail.html">Alexander Pierce</a></td> + <td class="mailbox-subject"><b>AdminLTE 2.0 Issue</b> - Trying to find a solution to this problem...</td> + <td class="mailbox-attachment"></td> + <td class="mailbox-date">15 hours ago</td> + </tr> + <tr> + <td><input type="checkbox"></td> + <td class="mailbox-star"><a href="#"><i class="fa fa-star text-yellow"></i></a></td> + <td class="mailbox-name"><a href="read-mail.html">Alexander Pierce</a></td> + <td class="mailbox-subject"><b>AdminLTE 2.0 Issue</b> - Trying to find a solution to this problem...</td> + <td class="mailbox-attachment"><i class="fa fa-paperclip"></i></td> + <td class="mailbox-date">Yesterday</td> + </tr> + <tr> + <td><input type="checkbox"></td> + <td class="mailbox-star"><a href="#"><i class="fa fa-star-o text-yellow"></i></a></td> + <td class="mailbox-name"><a href="read-mail.html">Alexander Pierce</a></td> + <td class="mailbox-subject"><b>AdminLTE 2.0 Issue</b> - Trying to find a solution to this problem...</td> + <td class="mailbox-attachment"><i class="fa fa-paperclip"></i></td> + <td class="mailbox-date">2 days ago</td> + </tr> + <tr> + <td><input type="checkbox"></td> + <td class="mailbox-star"><a href="#"><i class="fa fa-star-o text-yellow"></i></a></td> + <td class="mailbox-name"><a href="read-mail.html">Alexander Pierce</a></td> + <td class="mailbox-subject"><b>AdminLTE 2.0 Issue</b> - Trying to find a solution to this problem...</td> + <td class="mailbox-attachment"><i class="fa fa-paperclip"></i></td> + <td class="mailbox-date">2 days ago</td> + </tr> + <tr> + <td><input type="checkbox"></td> + <td class="mailbox-star"><a href="#"><i class="fa fa-star text-yellow"></i></a></td> + <td class="mailbox-name"><a href="read-mail.html">Alexander Pierce</a></td> + <td class="mailbox-subject"><b>AdminLTE 2.0 Issue</b> - Trying to find a solution to this problem...</td> + <td class="mailbox-attachment"></td> + <td class="mailbox-date">2 days ago</td> + </tr> + <tr> + <td><input type="checkbox"></td> + <td class="mailbox-star"><a href="#"><i class="fa fa-star text-yellow"></i></a></td> + <td class="mailbox-name"><a href="read-mail.html">Alexander Pierce</a></td> + <td class="mailbox-subject"><b>AdminLTE 2.0 Issue</b> - Trying to find a solution to this problem...</td> + <td class="mailbox-attachment"></td> + <td class="mailbox-date">2 days ago</td> + </tr> + <tr> + <td><input type="checkbox"></td> + <td class="mailbox-star"><a href="#"><i class="fa fa-star-o text-yellow"></i></a></td> + <td class="mailbox-name"><a href="read-mail.html">Alexander Pierce</a></td> + <td class="mailbox-subject"><b>AdminLTE 2.0 Issue</b> - Trying to find a solution to this problem...</td> + <td class="mailbox-attachment"></td> + <td class="mailbox-date">2 days ago</td> + </tr> + <tr> + <td><input type="checkbox"></td> + <td class="mailbox-star"><a href="#"><i class="fa fa-star-o text-yellow"></i></a></td> + <td class="mailbox-name"><a href="read-mail.html">Alexander Pierce</a></td> + <td class="mailbox-subject"><b>AdminLTE 2.0 Issue</b> - Trying to find a solution to this problem...</td> + <td class="mailbox-attachment"><i class="fa fa-paperclip"></i></td> + <td class="mailbox-date">4 days ago</td> + </tr> + <tr> + <td><input type="checkbox"></td> + <td class="mailbox-star"><a href="#"><i class="fa fa-star text-yellow"></i></a></td> + <td class="mailbox-name"><a href="read-mail.html">Alexander Pierce</a></td> + <td class="mailbox-subject"><b>AdminLTE 2.0 Issue</b> - Trying to find a solution to this problem...</td> + <td class="mailbox-attachment"></td> + <td class="mailbox-date">12 days ago</td> + </tr> + <tr> + <td><input type="checkbox"></td> + <td class="mailbox-star"><a href="#"><i class="fa fa-star-o text-yellow"></i></a></td> + <td class="mailbox-name"><a href="read-mail.html">Alexander Pierce</a></td> + <td class="mailbox-subject"><b>AdminLTE 2.0 Issue</b> - Trying to find a solution to this problem...</td> + <td class="mailbox-attachment"><i class="fa fa-paperclip"></i></td> + <td class="mailbox-date">12 days ago</td> + </tr> + <tr> + <td><input type="checkbox"></td> + <td class="mailbox-star"><a href="#"><i class="fa fa-star text-yellow"></i></a></td> + <td class="mailbox-name"><a href="read-mail.html">Alexander Pierce</a></td> + <td class="mailbox-subject"><b>AdminLTE 2.0 Issue</b> - Trying to find a solution to this problem...</td> + <td class="mailbox-attachment"><i class="fa fa-paperclip"></i></td> + <td class="mailbox-date">14 days ago</td> + </tr> + <tr> + <td><input type="checkbox"></td> + <td class="mailbox-star"><a href="#"><i class="fa fa-star text-yellow"></i></a></td> + <td class="mailbox-name"><a href="read-mail.html">Alexander Pierce</a></td> + <td class="mailbox-subject"><b>AdminLTE 2.0 Issue</b> - Trying to find a solution to this problem...</td> + <td class="mailbox-attachment"><i class="fa fa-paperclip"></i></td> + <td class="mailbox-date">15 days ago</td> + </tr> + </tbody> + </table><!-- /.table --> + </div><!-- /.mail-box-messages --> + </div><!-- /.box-body --> + <div class="box-footer no-padding"> + <div class="mailbox-controls"> + <!-- Check all button --> + <button class="btn btn-default btn-sm checkbox-toggle"><i class="fa fa-square-o"></i></button> + <div class="btn-group"> + <button class="btn btn-default btn-sm"><i class="fa fa-trash-o"></i></button> + <button class="btn btn-default btn-sm"><i class="fa fa-reply"></i></button> + <button class="btn btn-default btn-sm"><i class="fa fa-share"></i></button> + </div><!-- /.btn-group --> + <button class="btn btn-default btn-sm"><i class="fa fa-refresh"></i></button> + <div class="pull-right"> + 1-50/200 + <div class="btn-group"> + <button class="btn btn-default btn-sm"><i class="fa fa-chevron-left"></i></button> + <button class="btn btn-default btn-sm"><i class="fa fa-chevron-right"></i></button> + </div><!-- /.btn-group --> + </div><!-- /.pull-right --> + </div> + </div> + </div><!-- /. box --> + </div><!-- /.col --> + </div><!-- /.row --> + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- Slimscroll --> + <script src="../../plugins/slimScroll/jquery.slimscroll.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- iCheck --> + <script src="../../plugins/iCheck/icheck.min.js"></script> + <!-- Page Script --> + <script> + $(function () { + //Enable iCheck plugin for checkboxes + //iCheck for checkbox and radio inputs + $('.mailbox-messages input[type="checkbox"]').iCheck({ + checkboxClass: 'icheckbox_flat-blue', + radioClass: 'iradio_flat-blue' + }); + + //Enable check and uncheck all functionality + $(".checkbox-toggle").click(function () { + var clicks = $(this).data('clicks'); + if (clicks) { + //Uncheck all checkboxes + $(".mailbox-messages input[type='checkbox']").iCheck("uncheck"); + $(".fa", this).removeClass("fa-check-square-o").addClass('fa-square-o'); + } else { + //Check all checkboxes + $(".mailbox-messages input[type='checkbox']").iCheck("check"); + $(".fa", this).removeClass("fa-square-o").addClass('fa-check-square-o'); + } + $(this).data("clicks", !clicks); + }); + + //Handle starring for glyphicon and font awesome + $(".mailbox-star").click(function (e) { + e.preventDefault(); + //detect type + var $this = $(this).find("a > i"); + var glyph = $this.hasClass("glyphicon"); + var fa = $this.hasClass("fa"); + + //Switch states + if (glyph) { + $this.toggleClass("glyphicon-star"); + $this.toggleClass("glyphicon-star-empty"); + } + + if (fa) { + $this.toggleClass("fa-star"); + $this.toggleClass("fa-star-o"); + } + }); + }); + </script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + </body> +</html> diff --git a/theme/bootstrap/pages/mailbox/read-mail.html b/theme/bootstrap/pages/mailbox/read-mail.html new file mode 100644 index 0000000..6bfdd7a --- /dev/null +++ b/theme/bootstrap/pages/mailbox/read-mail.html @@ -0,0 +1,674 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Read Mail</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- fullCalendar 2.2.5--> + <link rel="stylesheet" href="../../plugins/fullcalendar/fullcalendar.min.css"> + <link rel="stylesheet" href="../../plugins/fullcalendar/fullcalendar.print.css" media="print"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + <!-- iCheck --> + <link rel="stylesheet" href="../../plugins/iCheck/flat/blue.css"> + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="../charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="../charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="../charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="../UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="../UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="../UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="../UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="../UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="../tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li class="treeview active"> + <a href="mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="mailbox.html">Inbox <span class="label label-primary pull-right">13</span></a></li> + <li><a href="compose.html">Compose</a></li> + <li class="active"><a href="read-mail.html">Read</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="../examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="../examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="../examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="../examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="../examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="../examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="../examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Read Mail + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li class="active">Mailbox</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-md-3"> + <a href="compose.html" class="btn btn-primary btn-block margin-bottom">Compose</a> + <div class="box box-solid"> + <div class="box-header with-border"> + <h3 class="box-title">Folders</h3> + <div class="box-tools"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + </div> + </div> + <div class="box-body no-padding"> + <ul class="nav nav-pills nav-stacked"> + <li><a href="mailbox.html"><i class="fa fa-inbox"></i> Inbox <span class="label label-primary pull-right">12</span></a></li> + <li><a href="#"><i class="fa fa-envelope-o"></i> Sent</a></li> + <li><a href="#"><i class="fa fa-file-text-o"></i> Drafts</a></li> + <li><a href="#"><i class="fa fa-filter"></i> Junk <span class="label label-warning pull-right">65</span></a></li> + <li><a href="#"><i class="fa fa-trash-o"></i> Trash</a></li> + </ul> + </div><!-- /.box-body --> + </div><!-- /. box --> + <div class="box box-solid"> + <div class="box-header with-border"> + <h3 class="box-title">Labels</h3> + <div class="box-tools"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + </div> + </div> + <div class="box-body no-padding"> + <ul class="nav nav-pills nav-stacked"> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> Important</a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> Promotions</a></li> + <li><a href="#"><i class="fa fa-circle-o text-light-blue"></i> Social</a></li> + </ul> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + <div class="col-md-9"> + <div class="box box-primary"> + <div class="box-header with-border"> + <h3 class="box-title">Read Mail</h3> + <div class="box-tools pull-right"> + <a href="#" class="btn btn-box-tool" data-toggle="tooltip" title="Previous"><i class="fa fa-chevron-left"></i></a> + <a href="#" class="btn btn-box-tool" data-toggle="tooltip" title="Next"><i class="fa fa-chevron-right"></i></a> + </div> + </div><!-- /.box-header --> + <div class="box-body no-padding"> + <div class="mailbox-read-info"> + <h3>Message Subject Is Placed Here</h3> + <h5>From: support@almsaeedstudio.com <span class="mailbox-read-time pull-right">15 Feb. 2015 11:03 PM</span></h5> + </div><!-- /.mailbox-read-info --> + <div class="mailbox-controls with-border text-center"> + <div class="btn-group"> + <button class="btn btn-default btn-sm" data-toggle="tooltip" title="Delete"><i class="fa fa-trash-o"></i></button> + <button class="btn btn-default btn-sm" data-toggle="tooltip" title="Reply"><i class="fa fa-reply"></i></button> + <button class="btn btn-default btn-sm" data-toggle="tooltip" title="Forward"><i class="fa fa-share"></i></button> + </div><!-- /.btn-group --> + <button class="btn btn-default btn-sm" data-toggle="tooltip" title="Print"><i class="fa fa-print"></i></button> + </div><!-- /.mailbox-controls --> + <div class="mailbox-read-message"> + <p>Hello John,</p> + <p>Keffiyeh blog actually fashion axe vegan, irony biodiesel. Cold-pressed hoodie chillwave put a bird on it aesthetic, bitters brunch meggings vegan iPhone. Dreamcatcher vegan scenester mlkshk. Ethical master cleanse Bushwick, occupy Thundercats banjo cliche ennui farm-to-table mlkshk fanny pack gluten-free. Marfa butcher vegan quinoa, bicycle rights disrupt tofu scenester chillwave 3 wolf moon asymmetrical taxidermy pour-over. Quinoa tote bag fashion axe, Godard disrupt migas church-key tofu blog locavore. Thundercats cronut polaroid Neutra tousled, meh food truck selfies narwhal American Apparel.</p> + <p>Raw denim McSweeney's bicycle rights, iPhone trust fund quinoa Neutra VHS kale chips vegan PBR&amp;B literally Thundercats +1. Forage tilde four dollar toast, banjo health goth paleo butcher. Four dollar toast Brooklyn pour-over American Apparel sustainable, lumbersexual listicle gluten-free health goth umami hoodie. Synth Echo Park bicycle rights DIY farm-to-table, retro kogi sriracha dreamcatcher PBR&amp;B flannel hashtag irony Wes Anderson. Lumbersexual Williamsburg Helvetica next level. Cold-pressed slow-carb pop-up normcore Thundercats Portland, cardigan literally meditation lumbersexual crucifix. Wayfarers raw denim paleo Bushwick, keytar Helvetica scenester keffiyeh 8-bit irony mumblecore whatever viral Truffaut.</p> + <p>Post-ironic shabby chic VHS, Marfa keytar flannel lomo try-hard keffiyeh cray. Actually fap fanny pack yr artisan trust fund. High Life dreamcatcher church-key gentrify. Tumblr stumptown four dollar toast vinyl, cold-pressed try-hard blog authentic keffiyeh Helvetica lo-fi tilde Intelligentsia. Lomo locavore salvia bespoke, twee fixie paleo cliche brunch Schlitz blog McSweeney's messenger bag swag slow-carb. Odd Future photo booth pork belly, you probably haven't heard of them actually tofu ennui keffiyeh lo-fi Truffaut health goth. Narwhal sustainable retro disrupt.</p> + <p>Skateboard artisan letterpress before they sold out High Life messenger bag. Bitters chambray leggings listicle, drinking vinegar chillwave synth. Fanny pack hoodie American Apparel twee. American Apparel PBR listicle, salvia aesthetic occupy sustainable Neutra kogi. Organic synth Tumblr viral plaid, shabby chic single-origin coffee Etsy 3 wolf moon slow-carb Schlitz roof party tousled squid vinyl. Readymade next level literally trust fund. Distillery master cleanse migas, Vice sriracha flannel chambray chia cronut.</p> + <p>Thanks,<br>Jane</p> + </div><!-- /.mailbox-read-message --> + </div><!-- /.box-body --> + <div class="box-footer"> + <ul class="mailbox-attachments clearfix"> + <li> + <span class="mailbox-attachment-icon"><i class="fa fa-file-pdf-o"></i></span> + <div class="mailbox-attachment-info"> + <a href="#" class="mailbox-attachment-name"><i class="fa fa-paperclip"></i> Sep2014-report.pdf</a> + <span class="mailbox-attachment-size"> + 1,245 KB + <a href="#" class="btn btn-default btn-xs pull-right"><i class="fa fa-cloud-download"></i></a> + </span> + </div> + </li> + <li> + <span class="mailbox-attachment-icon"><i class="fa fa-file-word-o"></i></span> + <div class="mailbox-attachment-info"> + <a href="#" class="mailbox-attachment-name"><i class="fa fa-paperclip"></i> App Description.docx</a> + <span class="mailbox-attachment-size"> + 1,245 KB + <a href="#" class="btn btn-default btn-xs pull-right"><i class="fa fa-cloud-download"></i></a> + </span> + </div> + </li> + <li> + <span class="mailbox-attachment-icon has-img"><img src="../../dist/img/photo1.png" alt="Attachment"></span> + <div class="mailbox-attachment-info"> + <a href="#" class="mailbox-attachment-name"><i class="fa fa-camera"></i> photo1.png</a> + <span class="mailbox-attachment-size"> + 2.67 MB + <a href="#" class="btn btn-default btn-xs pull-right"><i class="fa fa-cloud-download"></i></a> + </span> + </div> + </li> + <li> + <span class="mailbox-attachment-icon has-img"><img src="../../dist/img/photo2.png" alt="Attachment"></span> + <div class="mailbox-attachment-info"> + <a href="#" class="mailbox-attachment-name"><i class="fa fa-camera"></i> photo2.png</a> + <span class="mailbox-attachment-size"> + 1.9 MB + <a href="#" class="btn btn-default btn-xs pull-right"><i class="fa fa-cloud-download"></i></a> + </span> + </div> + </li> + </ul> + </div><!-- /.box-footer --> + <div class="box-footer"> + <div class="pull-right"> + <button class="btn btn-default"><i class="fa fa-reply"></i> Reply</button> + <button class="btn btn-default"><i class="fa fa-share"></i> Forward</button> + </div> + <button class="btn btn-default"><i class="fa fa-trash-o"></i> Delete</button> + <button class="btn btn-default"><i class="fa fa-print"></i> Print</button> + </div><!-- /.box-footer --> + </div><!-- /. box --> + </div><!-- /.col --> + </div><!-- /.row --> + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- Slimscroll --> + <script src="../../plugins/slimScroll/jquery.slimscroll.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + </body> +</html> diff --git a/theme/bootstrap/pages/tables/data.html b/theme/bootstrap/pages/tables/data.html new file mode 100644 index 0000000..186cb50 --- /dev/null +++ b/theme/bootstrap/pages/tables/data.html @@ -0,0 +1,1542 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Data Tables</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- DataTables --> + <link rel="stylesheet" href="../../plugins/datatables/dataTables.bootstrap.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + AdminLTE Design Team + <small><i class="fa fa-clock-o"></i> 2 hours</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Developers + <small><i class="fa fa-clock-o"></i> Today</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Sales Department + <small><i class="fa fa-clock-o"></i> Yesterday</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Reviewers + <small><i class="fa fa-clock-o"></i> 2 days</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-users text-red"></i> 5 new members joined + </a> + </li> + + <li> + <a href="#"> + <i class="fa fa-shopping-cart text-green"></i> 25 sales made + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-user text-red"></i> You changed your username + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Create a nice theme + <small class="pull-right">40%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">40% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Some task I need to do + <small class="pull-right">60%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">60% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Make beautiful transitions + <small class="pull-right">80%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="../charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="../charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="../charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="../UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="../UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="../UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="../UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="../UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li class="active"><a href="data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="../examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="../examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="../examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="../examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="../examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="../examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="../examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Data Tables + <small>advanced tables</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">Tables</a></li> + <li class="active">Data tables</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-xs-12"> + <div class="box"> + <div class="box-header"> + <h3 class="box-title">Hover Data Table</h3> + </div><!-- /.box-header --> + <div class="box-body"> + <table id="example2" class="table table-bordered table-hover"> + <thead> + <tr> + <th>Rendering engine</th> + <th>Browser</th> + <th>Platform(s)</th> + <th>Engine version</th> + <th>CSS grade</th> + </tr> + </thead> + <tbody> + <tr> + <td>Trident</td> + <td>Internet + Explorer 4.0</td> + <td>Win 95+</td> + <td> 4</td> + <td>X</td> + </tr> + <tr> + <td>Trident</td> + <td>Internet + Explorer 5.0</td> + <td>Win 95+</td> + <td>5</td> + <td>C</td> + </tr> + <tr> + <td>Trident</td> + <td>Internet + Explorer 5.5</td> + <td>Win 95+</td> + <td>5.5</td> + <td>A</td> + </tr> + <tr> + <td>Trident</td> + <td>Internet + Explorer 6</td> + <td>Win 98+</td> + <td>6</td> + <td>A</td> + </tr> + <tr> + <td>Trident</td> + <td>Internet Explorer 7</td> + <td>Win XP SP2+</td> + <td>7</td> + <td>A</td> + </tr> + <tr> + <td>Trident</td> + <td>AOL browser (AOL desktop)</td> + <td>Win XP</td> + <td>6</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Firefox 1.0</td> + <td>Win 98+ / OSX.2+</td> + <td>1.7</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Firefox 1.5</td> + <td>Win 98+ / OSX.2+</td> + <td>1.8</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Firefox 2.0</td> + <td>Win 98+ / OSX.2+</td> + <td>1.8</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Firefox 3.0</td> + <td>Win 2k+ / OSX.3+</td> + <td>1.9</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Camino 1.0</td> + <td>OSX.2+</td> + <td>1.8</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Camino 1.5</td> + <td>OSX.3+</td> + <td>1.8</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Netscape 7.2</td> + <td>Win 95+ / Mac OS 8.6-9.2</td> + <td>1.7</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Netscape Browser 8</td> + <td>Win 98SE+</td> + <td>1.7</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Netscape Navigator 9</td> + <td>Win 98+ / OSX.2+</td> + <td>1.8</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Mozilla 1.0</td> + <td>Win 95+ / OSX.1+</td> + <td>1</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Mozilla 1.1</td> + <td>Win 95+ / OSX.1+</td> + <td>1.1</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Mozilla 1.2</td> + <td>Win 95+ / OSX.1+</td> + <td>1.2</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Mozilla 1.3</td> + <td>Win 95+ / OSX.1+</td> + <td>1.3</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Mozilla 1.4</td> + <td>Win 95+ / OSX.1+</td> + <td>1.4</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Mozilla 1.5</td> + <td>Win 95+ / OSX.1+</td> + <td>1.5</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Mozilla 1.6</td> + <td>Win 95+ / OSX.1+</td> + <td>1.6</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Mozilla 1.7</td> + <td>Win 98+ / OSX.1+</td> + <td>1.7</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Mozilla 1.8</td> + <td>Win 98+ / OSX.1+</td> + <td>1.8</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Seamonkey 1.1</td> + <td>Win 98+ / OSX.2+</td> + <td>1.8</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Epiphany 2.20</td> + <td>Gnome</td> + <td>1.8</td> + <td>A</td> + </tr> + <tr> + <td>Webkit</td> + <td>Safari 1.2</td> + <td>OSX.3</td> + <td>125.5</td> + <td>A</td> + </tr> + <tr> + <td>Webkit</td> + <td>Safari 1.3</td> + <td>OSX.3</td> + <td>312.8</td> + <td>A</td> + </tr> + <tr> + <td>Webkit</td> + <td>Safari 2.0</td> + <td>OSX.4+</td> + <td>419.3</td> + <td>A</td> + </tr> + <tr> + <td>Webkit</td> + <td>Safari 3.0</td> + <td>OSX.4+</td> + <td>522.1</td> + <td>A</td> + </tr> + <tr> + <td>Webkit</td> + <td>OmniWeb 5.5</td> + <td>OSX.4+</td> + <td>420</td> + <td>A</td> + </tr> + <tr> + <td>Webkit</td> + <td>iPod Touch / iPhone</td> + <td>iPod</td> + <td>420.1</td> + <td>A</td> + </tr> + <tr> + <td>Webkit</td> + <td>S60</td> + <td>S60</td> + <td>413</td> + <td>A</td> + </tr> + <tr> + <td>Presto</td> + <td>Opera 7.0</td> + <td>Win 95+ / OSX.1+</td> + <td>-</td> + <td>A</td> + </tr> + <tr> + <td>Presto</td> + <td>Opera 7.5</td> + <td>Win 95+ / OSX.2+</td> + <td>-</td> + <td>A</td> + </tr> + <tr> + <td>Presto</td> + <td>Opera 8.0</td> + <td>Win 95+ / OSX.2+</td> + <td>-</td> + <td>A</td> + </tr> + <tr> + <td>Presto</td> + <td>Opera 8.5</td> + <td>Win 95+ / OSX.2+</td> + <td>-</td> + <td>A</td> + </tr> + <tr> + <td>Presto</td> + <td>Opera 9.0</td> + <td>Win 95+ / OSX.3+</td> + <td>-</td> + <td>A</td> + </tr> + <tr> + <td>Presto</td> + <td>Opera 9.2</td> + <td>Win 88+ / OSX.3+</td> + <td>-</td> + <td>A</td> + </tr> + <tr> + <td>Presto</td> + <td>Opera 9.5</td> + <td>Win 88+ / OSX.3+</td> + <td>-</td> + <td>A</td> + </tr> + <tr> + <td>Presto</td> + <td>Opera for Wii</td> + <td>Wii</td> + <td>-</td> + <td>A</td> + </tr> + <tr> + <td>Presto</td> + <td>Nokia N800</td> + <td>N800</td> + <td>-</td> + <td>A</td> + </tr> + <tr> + <td>Presto</td> + <td>Nintendo DS browser</td> + <td>Nintendo DS</td> + <td>8.5</td> + <td>C/A<sup>1</sup></td> + </tr> + <tr> + <td>KHTML</td> + <td>Konqureror 3.1</td> + <td>KDE 3.1</td> + <td>3.1</td> + <td>C</td> + </tr> + <tr> + <td>KHTML</td> + <td>Konqureror 3.3</td> + <td>KDE 3.3</td> + <td>3.3</td> + <td>A</td> + </tr> + <tr> + <td>KHTML</td> + <td>Konqureror 3.5</td> + <td>KDE 3.5</td> + <td>3.5</td> + <td>A</td> + </tr> + <tr> + <td>Tasman</td> + <td>Internet Explorer 4.5</td> + <td>Mac OS 8-9</td> + <td>-</td> + <td>X</td> + </tr> + <tr> + <td>Tasman</td> + <td>Internet Explorer 5.1</td> + <td>Mac OS 7.6-9</td> + <td>1</td> + <td>C</td> + </tr> + <tr> + <td>Tasman</td> + <td>Internet Explorer 5.2</td> + <td>Mac OS 8-X</td> + <td>1</td> + <td>C</td> + </tr> + <tr> + <td>Misc</td> + <td>NetFront 3.1</td> + <td>Embedded devices</td> + <td>-</td> + <td>C</td> + </tr> + <tr> + <td>Misc</td> + <td>NetFront 3.4</td> + <td>Embedded devices</td> + <td>-</td> + <td>A</td> + </tr> + <tr> + <td>Misc</td> + <td>Dillo 0.8</td> + <td>Embedded devices</td> + <td>-</td> + <td>X</td> + </tr> + <tr> + <td>Misc</td> + <td>Links</td> + <td>Text only</td> + <td>-</td> + <td>X</td> + </tr> + <tr> + <td>Misc</td> + <td>Lynx</td> + <td>Text only</td> + <td>-</td> + <td>X</td> + </tr> + <tr> + <td>Misc</td> + <td>IE Mobile</td> + <td>Windows Mobile 6</td> + <td>-</td> + <td>C</td> + </tr> + <tr> + <td>Misc</td> + <td>PSP browser</td> + <td>PSP</td> + <td>-</td> + <td>C</td> + </tr> + <tr> + <td>Other browsers</td> + <td>All others</td> + <td>-</td> + <td>-</td> + <td>U</td> + </tr> + </tbody> + <tfoot> + <tr> + <th>Rendering engine</th> + <th>Browser</th> + <th>Platform(s)</th> + <th>Engine version</th> + <th>CSS grade</th> + </tr> + </tfoot> + </table> + </div><!-- /.box-body --> + </div><!-- /.box --> + + <div class="box"> + <div class="box-header"> + <h3 class="box-title">Data Table With Full Features</h3> + </div><!-- /.box-header --> + <div class="box-body"> + <table id="example1" class="table table-bordered table-striped"> + <thead> + <tr> + <th>Rendering engine</th> + <th>Browser</th> + <th>Platform(s)</th> + <th>Engine version</th> + <th>CSS grade</th> + </tr> + </thead> + <tbody> + <tr> + <td>Trident</td> + <td>Internet + Explorer 4.0</td> + <td>Win 95+</td> + <td> 4</td> + <td>X</td> + </tr> + <tr> + <td>Trident</td> + <td>Internet + Explorer 5.0</td> + <td>Win 95+</td> + <td>5</td> + <td>C</td> + </tr> + <tr> + <td>Trident</td> + <td>Internet + Explorer 5.5</td> + <td>Win 95+</td> + <td>5.5</td> + <td>A</td> + </tr> + <tr> + <td>Trident</td> + <td>Internet + Explorer 6</td> + <td>Win 98+</td> + <td>6</td> + <td>A</td> + </tr> + <tr> + <td>Trident</td> + <td>Internet Explorer 7</td> + <td>Win XP SP2+</td> + <td>7</td> + <td>A</td> + </tr> + <tr> + <td>Trident</td> + <td>AOL browser (AOL desktop)</td> + <td>Win XP</td> + <td>6</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Firefox 1.0</td> + <td>Win 98+ / OSX.2+</td> + <td>1.7</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Firefox 1.5</td> + <td>Win 98+ / OSX.2+</td> + <td>1.8</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Firefox 2.0</td> + <td>Win 98+ / OSX.2+</td> + <td>1.8</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Firefox 3.0</td> + <td>Win 2k+ / OSX.3+</td> + <td>1.9</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Camino 1.0</td> + <td>OSX.2+</td> + <td>1.8</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Camino 1.5</td> + <td>OSX.3+</td> + <td>1.8</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Netscape 7.2</td> + <td>Win 95+ / Mac OS 8.6-9.2</td> + <td>1.7</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Netscape Browser 8</td> + <td>Win 98SE+</td> + <td>1.7</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Netscape Navigator 9</td> + <td>Win 98+ / OSX.2+</td> + <td>1.8</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Mozilla 1.0</td> + <td>Win 95+ / OSX.1+</td> + <td>1</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Mozilla 1.1</td> + <td>Win 95+ / OSX.1+</td> + <td>1.1</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Mozilla 1.2</td> + <td>Win 95+ / OSX.1+</td> + <td>1.2</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Mozilla 1.3</td> + <td>Win 95+ / OSX.1+</td> + <td>1.3</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Mozilla 1.4</td> + <td>Win 95+ / OSX.1+</td> + <td>1.4</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Mozilla 1.5</td> + <td>Win 95+ / OSX.1+</td> + <td>1.5</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Mozilla 1.6</td> + <td>Win 95+ / OSX.1+</td> + <td>1.6</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Mozilla 1.7</td> + <td>Win 98+ / OSX.1+</td> + <td>1.7</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Mozilla 1.8</td> + <td>Win 98+ / OSX.1+</td> + <td>1.8</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Seamonkey 1.1</td> + <td>Win 98+ / OSX.2+</td> + <td>1.8</td> + <td>A</td> + </tr> + <tr> + <td>Gecko</td> + <td>Epiphany 2.20</td> + <td>Gnome</td> + <td>1.8</td> + <td>A</td> + </tr> + <tr> + <td>Webkit</td> + <td>Safari 1.2</td> + <td>OSX.3</td> + <td>125.5</td> + <td>A</td> + </tr> + <tr> + <td>Webkit</td> + <td>Safari 1.3</td> + <td>OSX.3</td> + <td>312.8</td> + <td>A</td> + </tr> + <tr> + <td>Webkit</td> + <td>Safari 2.0</td> + <td>OSX.4+</td> + <td>419.3</td> + <td>A</td> + </tr> + <tr> + <td>Webkit</td> + <td>Safari 3.0</td> + <td>OSX.4+</td> + <td>522.1</td> + <td>A</td> + </tr> + <tr> + <td>Webkit</td> + <td>OmniWeb 5.5</td> + <td>OSX.4+</td> + <td>420</td> + <td>A</td> + </tr> + <tr> + <td>Webkit</td> + <td>iPod Touch / iPhone</td> + <td>iPod</td> + <td>420.1</td> + <td>A</td> + </tr> + <tr> + <td>Webkit</td> + <td>S60</td> + <td>S60</td> + <td>413</td> + <td>A</td> + </tr> + <tr> + <td>Presto</td> + <td>Opera 7.0</td> + <td>Win 95+ / OSX.1+</td> + <td>-</td> + <td>A</td> + </tr> + <tr> + <td>Presto</td> + <td>Opera 7.5</td> + <td>Win 95+ / OSX.2+</td> + <td>-</td> + <td>A</td> + </tr> + <tr> + <td>Presto</td> + <td>Opera 8.0</td> + <td>Win 95+ / OSX.2+</td> + <td>-</td> + <td>A</td> + </tr> + <tr> + <td>Presto</td> + <td>Opera 8.5</td> + <td>Win 95+ / OSX.2+</td> + <td>-</td> + <td>A</td> + </tr> + <tr> + <td>Presto</td> + <td>Opera 9.0</td> + <td>Win 95+ / OSX.3+</td> + <td>-</td> + <td>A</td> + </tr> + <tr> + <td>Presto</td> + <td>Opera 9.2</td> + <td>Win 88+ / OSX.3+</td> + <td>-</td> + <td>A</td> + </tr> + <tr> + <td>Presto</td> + <td>Opera 9.5</td> + <td>Win 88+ / OSX.3+</td> + <td>-</td> + <td>A</td> + </tr> + <tr> + <td>Presto</td> + <td>Opera for Wii</td> + <td>Wii</td> + <td>-</td> + <td>A</td> + </tr> + <tr> + <td>Presto</td> + <td>Nokia N800</td> + <td>N800</td> + <td>-</td> + <td>A</td> + </tr> + <tr> + <td>Presto</td> + <td>Nintendo DS browser</td> + <td>Nintendo DS</td> + <td>8.5</td> + <td>C/A<sup>1</sup></td> + </tr> + <tr> + <td>KHTML</td> + <td>Konqureror 3.1</td> + <td>KDE 3.1</td> + <td>3.1</td> + <td>C</td> + </tr> + <tr> + <td>KHTML</td> + <td>Konqureror 3.3</td> + <td>KDE 3.3</td> + <td>3.3</td> + <td>A</td> + </tr> + <tr> + <td>KHTML</td> + <td>Konqureror 3.5</td> + <td>KDE 3.5</td> + <td>3.5</td> + <td>A</td> + </tr> + <tr> + <td>Tasman</td> + <td>Internet Explorer 4.5</td> + <td>Mac OS 8-9</td> + <td>-</td> + <td>X</td> + </tr> + <tr> + <td>Tasman</td> + <td>Internet Explorer 5.1</td> + <td>Mac OS 7.6-9</td> + <td>1</td> + <td>C</td> + </tr> + <tr> + <td>Tasman</td> + <td>Internet Explorer 5.2</td> + <td>Mac OS 8-X</td> + <td>1</td> + <td>C</td> + </tr> + <tr> + <td>Misc</td> + <td>NetFront 3.1</td> + <td>Embedded devices</td> + <td>-</td> + <td>C</td> + </tr> + <tr> + <td>Misc</td> + <td>NetFront 3.4</td> + <td>Embedded devices</td> + <td>-</td> + <td>A</td> + </tr> + <tr> + <td>Misc</td> + <td>Dillo 0.8</td> + <td>Embedded devices</td> + <td>-</td> + <td>X</td> + </tr> + <tr> + <td>Misc</td> + <td>Links</td> + <td>Text only</td> + <td>-</td> + <td>X</td> + </tr> + <tr> + <td>Misc</td> + <td>Lynx</td> + <td>Text only</td> + <td>-</td> + <td>X</td> + </tr> + <tr> + <td>Misc</td> + <td>IE Mobile</td> + <td>Windows Mobile 6</td> + <td>-</td> + <td>C</td> + </tr> + <tr> + <td>Misc</td> + <td>PSP browser</td> + <td>PSP</td> + <td>-</td> + <td>C</td> + </tr> + <tr> + <td>Other browsers</td> + <td>All others</td> + <td>-</td> + <td>-</td> + <td>U</td> + </tr> + </tbody> + <tfoot> + <tr> + <th>Rendering engine</th> + <th>Browser</th> + <th>Platform(s)</th> + <th>Engine version</th> + <th>CSS grade</th> + </tr> + </tfoot> + </table> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- DataTables --> + <script src="../../plugins/datatables/jquery.dataTables.min.js"></script> + <script src="../../plugins/datatables/dataTables.bootstrap.min.js"></script> + <!-- SlimScroll --> + <script src="../../plugins/slimScroll/jquery.slimscroll.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + <!-- page script --> + <script> + $(function () { + $("#example1").DataTable(); + $('#example2').DataTable({ + "paging": true, + "lengthChange": false, + "searching": false, + "ordering": true, + "info": true, + "autoWidth": false + }); + }); + </script> + </body> +</html> diff --git a/theme/bootstrap/pages/tables/simple.html b/theme/bootstrap/pages/tables/simple.html new file mode 100644 index 0000000..a1fc79f --- /dev/null +++ b/theme/bootstrap/pages/tables/simple.html @@ -0,0 +1,955 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Simple Tables</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="../../index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + AdminLTE Design Team + <small><i class="fa fa-clock-o"></i> 2 hours</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Developers + <small><i class="fa fa-clock-o"></i> Today</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Sales Department + <small><i class="fa fa-clock-o"></i> Yesterday</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Reviewers + <small><i class="fa fa-clock-o"></i> 2 days</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-users text-red"></i> 5 new members joined + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-shopping-cart text-green"></i> 25 sales made + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-user text-red"></i> You changed your username + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress progress-xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Create a nice theme + <small class="pull-right">40%</small> + </h3> + <div class="progress progress-xs"> + <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">40% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Some task I need to do + <small class="pull-right">60%</small> + </h3> + <div class="progress progress-xs"> + <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">60% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Make beautiful transitions + <small class="pull-right">80%</small> + </h3> + <div class="progress progress-xs"> + <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="../layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="../layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="../layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="../layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li> + <a href="../widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="../charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="../charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="../charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="../UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="../UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="../UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="../UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="../UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="../forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="../forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview active"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li class="active"><a href="simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="../calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="../mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="../examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="../examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="../examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="../examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="../examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="../examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="../examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Simple Tables + <small>preview of simple tables</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li><a href="#">Tables</a></li> + <li class="active">Simple</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + <div class="row"> + <div class="col-md-6"> + <div class="box"> + <div class="box-header with-border"> + <h3 class="box-title">Bordered Table</h3> + </div><!-- /.box-header --> + <div class="box-body"> + <table class="table table-bordered"> + <tr> + <th style="width: 10px">#</th> + <th>Task</th> + <th>Progress</th> + <th style="width: 40px">Label</th> + </tr> + <tr> + <td>1.</td> + <td>Update software</td> + <td> + <div class="progress progress-xs"> + <div class="progress-bar progress-bar-danger" style="width: 55%"></div> + </div> + </td> + <td><span class="badge bg-red">55%</span></td> + </tr> + <tr> + <td>2.</td> + <td>Clean database</td> + <td> + <div class="progress progress-xs"> + <div class="progress-bar progress-bar-yellow" style="width: 70%"></div> + </div> + </td> + <td><span class="badge bg-yellow">70%</span></td> + </tr> + <tr> + <td>3.</td> + <td>Cron job running</td> + <td> + <div class="progress progress-xs progress-striped active"> + <div class="progress-bar progress-bar-primary" style="width: 30%"></div> + </div> + </td> + <td><span class="badge bg-light-blue">30%</span></td> + </tr> + <tr> + <td>4.</td> + <td>Fix and squish bugs</td> + <td> + <div class="progress progress-xs progress-striped active"> + <div class="progress-bar progress-bar-success" style="width: 90%"></div> + </div> + </td> + <td><span class="badge bg-green">90%</span></td> + </tr> + </table> + </div><!-- /.box-body --> + <div class="box-footer clearfix"> + <ul class="pagination pagination-sm no-margin pull-right"> + <li><a href="#">&laquo;</a></li> + <li><a href="#">1</a></li> + <li><a href="#">2</a></li> + <li><a href="#">3</a></li> + <li><a href="#">&raquo;</a></li> + </ul> + </div> + </div><!-- /.box --> + + <div class="box"> + <div class="box-header"> + <h3 class="box-title">Condensed Full Width Table</h3> + </div><!-- /.box-header --> + <div class="box-body no-padding"> + <table class="table table-condensed"> + <tr> + <th style="width: 10px">#</th> + <th>Task</th> + <th>Progress</th> + <th style="width: 40px">Label</th> + </tr> + <tr> + <td>1.</td> + <td>Update software</td> + <td> + <div class="progress progress-xs"> + <div class="progress-bar progress-bar-danger" style="width: 55%"></div> + </div> + </td> + <td><span class="badge bg-red">55%</span></td> + </tr> + <tr> + <td>2.</td> + <td>Clean database</td> + <td> + <div class="progress progress-xs"> + <div class="progress-bar progress-bar-yellow" style="width: 70%"></div> + </div> + </td> + <td><span class="badge bg-yellow">70%</span></td> + </tr> + <tr> + <td>3.</td> + <td>Cron job running</td> + <td> + <div class="progress progress-xs progress-striped active"> + <div class="progress-bar progress-bar-primary" style="width: 30%"></div> + </div> + </td> + <td><span class="badge bg-light-blue">30%</span></td> + </tr> + <tr> + <td>4.</td> + <td>Fix and squish bugs</td> + <td> + <div class="progress progress-xs progress-striped active"> + <div class="progress-bar progress-bar-success" style="width: 90%"></div> + </div> + </td> + <td><span class="badge bg-green">90%</span></td> + </tr> + </table> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + <div class="col-md-6"> + <div class="box"> + <div class="box-header"> + <h3 class="box-title">Simple Full Width Table</h3> + <div class="box-tools"> + <ul class="pagination pagination-sm no-margin pull-right"> + <li><a href="#">&laquo;</a></li> + <li><a href="#">1</a></li> + <li><a href="#">2</a></li> + <li><a href="#">3</a></li> + <li><a href="#">&raquo;</a></li> + </ul> + </div> + </div><!-- /.box-header --> + <div class="box-body no-padding"> + <table class="table"> + <tr> + <th style="width: 10px">#</th> + <th>Task</th> + <th>Progress</th> + <th style="width: 40px">Label</th> + </tr> + <tr> + <td>1.</td> + <td>Update software</td> + <td> + <div class="progress progress-xs"> + <div class="progress-bar progress-bar-danger" style="width: 55%"></div> + </div> + </td> + <td><span class="badge bg-red">55%</span></td> + </tr> + <tr> + <td>2.</td> + <td>Clean database</td> + <td> + <div class="progress progress-xs"> + <div class="progress-bar progress-bar-yellow" style="width: 70%"></div> + </div> + </td> + <td><span class="badge bg-yellow">70%</span></td> + </tr> + <tr> + <td>3.</td> + <td>Cron job running</td> + <td> + <div class="progress progress-xs progress-striped active"> + <div class="progress-bar progress-bar-primary" style="width: 30%"></div> + </div> + </td> + <td><span class="badge bg-light-blue">30%</span></td> + </tr> + <tr> + <td>4.</td> + <td>Fix and squish bugs</td> + <td> + <div class="progress progress-xs progress-striped active"> + <div class="progress-bar progress-bar-success" style="width: 90%"></div> + </div> + </td> + <td><span class="badge bg-green">90%</span></td> + </tr> + </table> + </div><!-- /.box-body --> + </div><!-- /.box --> + + <div class="box"> + <div class="box-header"> + <h3 class="box-title">Striped Full Width Table</h3> + </div><!-- /.box-header --> + <div class="box-body no-padding"> + <table class="table table-striped"> + <tr> + <th style="width: 10px">#</th> + <th>Task</th> + <th>Progress</th> + <th style="width: 40px">Label</th> + </tr> + <tr> + <td>1.</td> + <td>Update software</td> + <td> + <div class="progress progress-xs"> + <div class="progress-bar progress-bar-danger" style="width: 55%"></div> + </div> + </td> + <td><span class="badge bg-red">55%</span></td> + </tr> + <tr> + <td>2.</td> + <td>Clean database</td> + <td> + <div class="progress progress-xs"> + <div class="progress-bar progress-bar-yellow" style="width: 70%"></div> + </div> + </td> + <td><span class="badge bg-yellow">70%</span></td> + </tr> + <tr> + <td>3.</td> + <td>Cron job running</td> + <td> + <div class="progress progress-xs progress-striped active"> + <div class="progress-bar progress-bar-primary" style="width: 30%"></div> + </div> + </td> + <td><span class="badge bg-light-blue">30%</span></td> + </tr> + <tr> + <td>4.</td> + <td>Fix and squish bugs</td> + <td> + <div class="progress progress-xs progress-striped active"> + <div class="progress-bar progress-bar-success" style="width: 90%"></div> + </div> + </td> + <td><span class="badge bg-green">90%</span></td> + </tr> + </table> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + <div class="row"> + <div class="col-xs-12"> + <div class="box"> + <div class="box-header"> + <h3 class="box-title">Responsive Hover Table</h3> + <div class="box-tools"> + <div class="input-group" style="width: 150px;"> + <input type="text" name="table_search" class="form-control input-sm pull-right" placeholder="Search"> + <div class="input-group-btn"> + <button class="btn btn-sm btn-default"><i class="fa fa-search"></i></button> + </div> + </div> + </div> + </div><!-- /.box-header --> + <div class="box-body table-responsive no-padding"> + <table class="table table-hover"> + <tr> + <th>ID</th> + <th>User</th> + <th>Date</th> + <th>Status</th> + <th>Reason</th> + </tr> + <tr> + <td>183</td> + <td>John Doe</td> + <td>11-7-2014</td> + <td><span class="label label-success">Approved</span></td> + <td>Bacon ipsum dolor sit amet salami venison chicken flank fatback doner.</td> + </tr> + <tr> + <td>219</td> + <td>Alexander Pierce</td> + <td>11-7-2014</td> + <td><span class="label label-warning">Pending</span></td> + <td>Bacon ipsum dolor sit amet salami venison chicken flank fatback doner.</td> + </tr> + <tr> + <td>657</td> + <td>Bob Doe</td> + <td>11-7-2014</td> + <td><span class="label label-primary">Approved</span></td> + <td>Bacon ipsum dolor sit amet salami venison chicken flank fatback doner.</td> + </tr> + <tr> + <td>175</td> + <td>Mike Doe</td> + <td>11-7-2014</td> + <td><span class="label label-danger">Denied</span></td> + <td>Bacon ipsum dolor sit amet salami venison chicken flank fatback doner.</td> + </tr> + </table> + </div><!-- /.box-body --> + </div><!-- /.box --> + </div> + </div> + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../../bootstrap/js/bootstrap.min.js"></script> + <!-- Slimscroll --> + <script src="../../plugins/slimScroll/jquery.slimscroll.min.js"></script> + <!-- FastClick --> + <script src="../../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../../dist/js/demo.js"></script> + </body> +</html> diff --git a/theme/bootstrap/pages/widgets.html b/theme/bootstrap/pages/widgets.html new file mode 100644 index 0000000..8780c98 --- /dev/null +++ b/theme/bootstrap/pages/widgets.html @@ -0,0 +1,1470 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Widgets</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="../bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="../dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="../dist/css/skins/_all-skins.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <header class="main-header"> + <!-- Logo --> + <a href="index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + <!-- Header Navbar: style can be found in header.less --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </a> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <img src="../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + AdminLTE Design Team + <small><i class="fa fa-clock-o"></i> 2 hours</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Developers + <small><i class="fa fa-clock-o"></i> Today</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../dist/img/user3-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Sales Department + <small><i class="fa fa-clock-o"></i> Yesterday</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + <li> + <a href="#"> + <div class="pull-left"> + <img src="../dist/img/user4-128x128.jpg" class="img-circle" alt="User Image"> + </div> + <h4> + Reviewers + <small><i class="fa fa-clock-o"></i> 2 days</small> + </h4> + <p>Why not buy a new awesome theme?</p> + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li> + <!-- Notifications: style can be found in dropdown.less --> + <li class="dropdown notifications-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the page and may cause design problems + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-users text-red"></i> 5 new members joined + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-shopping-cart text-green"></i> 25 sales made + </a> + </li> + <li> + <a href="#"> + <i class="fa fa-user text-light-blue"></i> You changed your username + </a> + </li> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks: style can be found in dropdown.less --> + <li class="dropdown tasks-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- inner menu: contains the actual data --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Create a nice theme + <small class="pull-right">40%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-green" style="width: 40%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">40% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Some task I need to do + <small class="pull-right">60%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-red" style="width: 60%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">60% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + <li><!-- Task item --> + <a href="#"> + <h3> + Make beautiful transitions + <small class="pull-right">80%</small> + </h3> + <div class="progress xs"> + <div class="progress-bar progress-bar-yellow" style="width: 80%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">80% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account: style can be found in dropdown.less --> + <li class="dropdown user user-menu"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <img src="../dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- User image --> + <li class="user-header"> + <img src="../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + <!-- Sidebar user panel --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="../dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + <!-- search form --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + <!-- sidebar menu: : style can be found in sidebar.less --> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-dashboard"></i> <span>Dashboard</span> <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="../index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> + <li><a href="../index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-files-o"></i> + <span>Layout Options</span> + <span class="label label-primary pull-right">4</span> + </a> + <ul class="treeview-menu"> + <li><a href="layout/top-nav.html"><i class="fa fa-circle-o"></i> Top Navigation</a></li> + <li><a href="layout/boxed.html"><i class="fa fa-circle-o"></i> Boxed</a></li> + <li><a href="layout/fixed.html"><i class="fa fa-circle-o"></i> Fixed</a></li> + <li><a href="layout/collapsed-sidebar.html"><i class="fa fa-circle-o"></i> Collapsed Sidebar</a></li> + </ul> + </li> + <li class="active"> + <a href="widgets.html"> + <i class="fa fa-th"></i> <span>Widgets</span> <small class="label pull-right bg-green">new</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-pie-chart"></i> + <span>Charts</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="charts/chartjs.html"><i class="fa fa-circle-o"></i> ChartJS</a></li> + <li><a href="charts/morris.html"><i class="fa fa-circle-o"></i> Morris</a></li> + <li><a href="charts/flot.html"><i class="fa fa-circle-o"></i> Flot</a></li> + <li><a href="charts/inline.html"><i class="fa fa-circle-o"></i> Inline charts</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>UI Elements</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="UI/general.html"><i class="fa fa-circle-o"></i> General</a></li> + <li><a href="UI/icons.html"><i class="fa fa-circle-o"></i> Icons</a></li> + <li><a href="UI/buttons.html"><i class="fa fa-circle-o"></i> Buttons</a></li> + <li><a href="UI/sliders.html"><i class="fa fa-circle-o"></i> Sliders</a></li> + <li><a href="UI/timeline.html"><i class="fa fa-circle-o"></i> Timeline</a></li> + <li><a href="UI/modals.html"><i class="fa fa-circle-o"></i> Modals</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-edit"></i> <span>Forms</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="forms/general.html"><i class="fa fa-circle-o"></i> General Elements</a></li> + <li><a href="forms/advanced.html"><i class="fa fa-circle-o"></i> Advanced Elements</a></li> + <li><a href="forms/editors.html"><i class="fa fa-circle-o"></i> Editors</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-table"></i> <span>Tables</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="tables/simple.html"><i class="fa fa-circle-o"></i> Simple tables</a></li> + <li><a href="tables/data.html"><i class="fa fa-circle-o"></i> Data tables</a></li> + </ul> + </li> + <li> + <a href="calendar.html"> + <i class="fa fa-calendar"></i> <span>Calendar</span> + <small class="label pull-right bg-red">3</small> + </a> + </li> + <li> + <a href="mailbox/mailbox.html"> + <i class="fa fa-envelope"></i> <span>Mailbox</span> + <small class="label pull-right bg-yellow">12</small> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-folder"></i> <span>Examples</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="examples/invoice.html"><i class="fa fa-circle-o"></i> Invoice</a></li> + <li><a href="examples/profile.html"><i class="fa fa-circle-o"></i> Profile</a></li> + <li><a href="examples/login.html"><i class="fa fa-circle-o"></i> Login</a></li> + <li><a href="examples/register.html"><i class="fa fa-circle-o"></i> Register</a></li> + <li><a href="examples/lockscreen.html"><i class="fa fa-circle-o"></i> Lockscreen</a></li> + <li><a href="examples/404.html"><i class="fa fa-circle-o"></i> 404 Error</a></li> + <li><a href="examples/500.html"><i class="fa fa-circle-o"></i> 500 Error</a></li> + <li><a href="examples/blank.html"><i class="fa fa-circle-o"></i> Blank Page</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level One <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Level Two <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level Three</a></li> + </ul> + </li> + </ul> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li> + </ul> + </li> + <li><a href="../documentation/index.html"><i class="fa fa-book"></i> <span>Documentation</span></a></li> + <li class="header">LABELS</li> + <li><a href="#"><i class="fa fa-circle-o text-red"></i> <span>Important</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-yellow"></i> <span>Warning</span></a></li> + <li><a href="#"><i class="fa fa-circle-o text-aqua"></i> <span>Information</span></a></li> + </ul> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Widgets + <small>Preview page</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li> + <li class="active">Widgets</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + + <div class="row"> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box"> + <span class="info-box-icon bg-aqua"><i class="fa fa-envelope-o"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Messages</span> + <span class="info-box-number">1,410</span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box"> + <span class="info-box-icon bg-green"><i class="fa fa-flag-o"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Bookmarks</span> + <span class="info-box-number">410</span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box"> + <span class="info-box-icon bg-yellow"><i class="fa fa-files-o"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Uploads</span> + <span class="info-box-number">13,648</span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box"> + <span class="info-box-icon bg-red"><i class="fa fa-star-o"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Likes</span> + <span class="info-box-number">93,139</span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + </div><!-- /.row --> + + <!-- =========================================================== --> + + <div class="row"> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box bg-aqua"> + <span class="info-box-icon"><i class="fa fa-bookmark-o"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Bookmarks</span> + <span class="info-box-number">41,410</span> + <div class="progress"> + <div class="progress-bar" style="width: 70%"></div> + </div> + <span class="progress-description"> + 70% Increase in 30 Days + </span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box bg-green"> + <span class="info-box-icon"><i class="fa fa-thumbs-o-up"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Likes</span> + <span class="info-box-number">41,410</span> + <div class="progress"> + <div class="progress-bar" style="width: 70%"></div> + </div> + <span class="progress-description"> + 70% Increase in 30 Days + </span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box bg-yellow"> + <span class="info-box-icon"><i class="fa fa-calendar"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Events</span> + <span class="info-box-number">41,410</span> + <div class="progress"> + <div class="progress-bar" style="width: 70%"></div> + </div> + <span class="progress-description"> + 70% Increase in 30 Days + </span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + <div class="col-md-3 col-sm-6 col-xs-12"> + <div class="info-box bg-red"> + <span class="info-box-icon"><i class="fa fa-comments-o"></i></span> + <div class="info-box-content"> + <span class="info-box-text">Comments</span> + <span class="info-box-number">41,410</span> + <div class="progress"> + <div class="progress-bar" style="width: 70%"></div> + </div> + <span class="progress-description"> + 70% Increase in 30 Days + </span> + </div><!-- /.info-box-content --> + </div><!-- /.info-box --> + </div><!-- /.col --> + </div><!-- /.row --> + + <!-- =========================================================== --> + + <!-- Small boxes (Stat box) --> + <div class="row"> + <div class="col-lg-3 col-xs-6"> + <!-- small box --> + <div class="small-box bg-aqua"> + <div class="inner"> + <h3>150</h3> + <p>New Orders</p> + </div> + <div class="icon"> + <i class="fa fa-shopping-cart"></i> + </div> + <a href="#" class="small-box-footer"> + More info <i class="fa fa-arrow-circle-right"></i> + </a> + </div> + </div><!-- ./col --> + <div class="col-lg-3 col-xs-6"> + <!-- small box --> + <div class="small-box bg-green"> + <div class="inner"> + <h3>53<sup style="font-size: 20px">%</sup></h3> + <p>Bounce Rate</p> + </div> + <div class="icon"> + <i class="ion ion-stats-bars"></i> + </div> + <a href="#" class="small-box-footer"> + More info <i class="fa fa-arrow-circle-right"></i> + </a> + </div> + </div><!-- ./col --> + <div class="col-lg-3 col-xs-6"> + <!-- small box --> + <div class="small-box bg-yellow"> + <div class="inner"> + <h3>44</h3> + <p>User Registrations</p> + </div> + <div class="icon"> + <i class="ion ion-person-add"></i> + </div> + <a href="#" class="small-box-footer"> + More info <i class="fa fa-arrow-circle-right"></i> + </a> + </div> + </div><!-- ./col --> + <div class="col-lg-3 col-xs-6"> + <!-- small box --> + <div class="small-box bg-red"> + <div class="inner"> + <h3>65</h3> + <p>Unique Visitors</p> + </div> + <div class="icon"> + <i class="ion ion-pie-graph"></i> + </div> + <a href="#" class="small-box-footer"> + More info <i class="fa fa-arrow-circle-right"></i> + </a> + </div> + </div><!-- ./col --> + </div><!-- /.row --> + + <!-- =========================================================== --> + + <div class="row"> + <div class="col-md-3"> + <div class="box box-default collapsed-box"> + <div class="box-header with-border"> + <h3 class="box-title">Expandable</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-plus"></i></button> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + <div class="col-md-3"> + <div class="box box-success"> + <div class="box-header with-border"> + <h3 class="box-title">Removable</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + <div class="col-md-3"> + <div class="box box-warning"> + <div class="box-header with-border"> + <h3 class="box-title">Collapsable</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + <div class="col-md-3"> + <div class="box box-danger"> + <div class="box-header"> + <h3 class="box-title">Loading state</h3> + </div> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + <!-- Loading (remove the following to stop the loading)--> + <div class="overlay"> + <i class="fa fa-refresh fa-spin"></i> + </div> + <!-- end loading --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + + <!-- =========================================================== --> + + <div class="row"> + <div class="col-md-3"> + <div class="box box-default collapsed-box box-solid"> + <div class="box-header with-border"> + <h3 class="box-title">Expandable</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-plus"></i></button> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + <div class="col-md-3"> + <div class="box box-success box-solid"> + <div class="box-header with-border"> + <h3 class="box-title">Removable</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + <div class="col-md-3"> + <div class="box box-warning box-solid"> + <div class="box-header with-border"> + <h3 class="box-title">Collapsable</h3> + <div class="box-tools pull-right"> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + </div><!-- /.box --> + </div><!-- /.col --> + <div class="col-md-3"> + <div class="box box-danger box-solid"> + <div class="box-header"> + <h3 class="box-title">Loading state</h3> + </div> + <div class="box-body"> + The body of the box + </div><!-- /.box-body --> + <!-- Loading (remove the following to stop the loading)--> + <div class="overlay"> + <i class="fa fa-refresh fa-spin"></i> + </div> + <!-- end loading --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + + <!-- =========================================================== --> + + <!-- Direct Chat --> + <div class="row"> + <div class="col-md-3"> + <!-- DIRECT CHAT PRIMARY --> + <div class="box box-primary direct-chat direct-chat-primary"> + <div class="box-header with-border"> + <h3 class="box-title">Direct Chat</h3> + <div class="box-tools pull-right"> + <span data-toggle="tooltip" title="3 New Messages" class="badge bg-light-blue">3</span> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-toggle="tooltip" title="Contacts" data-widget="chat-pane-toggle"><i class="fa fa-comments"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <!-- Conversations are loaded here --> + <div class="direct-chat-messages"> + <!-- Message. Default to the left --> + <div class="direct-chat-msg"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-left">Alexander Pierce</span> + <span class="direct-chat-timestamp pull-right">23 Jan 2:00 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user1-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + Is this template really for free? That's unbelievable! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + + <!-- Message to the right --> + <div class="direct-chat-msg right"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-right">Sarah Bullock</span> + <span class="direct-chat-timestamp pull-left">23 Jan 2:05 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user3-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + You better believe it! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + </div><!--/.direct-chat-messages--> + + <!-- Contacts are loaded here --> + <div class="direct-chat-contacts"> + <ul class="contacts-list"> + <li> + <a href="#"> + <img class="contacts-list-img" src="../dist/img/user1-128x128.jpg"> + <div class="contacts-list-info"> + <span class="contacts-list-name"> + Count Dracula + <small class="contacts-list-date pull-right">2/28/2015</small> + </span> + <span class="contacts-list-msg">How have you been? I was...</span> + </div><!-- /.contacts-list-info --> + </a> + </li><!-- End Contact Item --> + </ul><!-- /.contatcts-list --> + </div><!-- /.direct-chat-pane --> + </div><!-- /.box-body --> + <div class="box-footer"> + <form action="#" method="post"> + <div class="input-group"> + <input type="text" name="message" placeholder="Type Message ..." class="form-control"> + <span class="input-group-btn"> + <button type="button" class="btn btn-primary btn-flat">Send</button> + </span> + </div> + </form> + </div><!-- /.box-footer--> + </div><!--/.direct-chat --> + </div><!-- /.col --> + + <div class="col-md-3"> + <!-- DIRECT CHAT SUCCESS --> + <div class="box box-success direct-chat direct-chat-success"> + <div class="box-header with-border"> + <h3 class="box-title">Direct Chat</h3> + <div class="box-tools pull-right"> + <span data-toggle="tooltip" title="3 New Messages" class="badge bg-green">3</span> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-toggle="tooltip" title="Contacts" data-widget="chat-pane-toggle"><i class="fa fa-comments"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <!-- Conversations are loaded here --> + <div class="direct-chat-messages"> + <!-- Message. Default to the left --> + <div class="direct-chat-msg"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-left">Alexander Pierce</span> + <span class="direct-chat-timestamp pull-right">23 Jan 2:00 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user1-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + Is this template really for free? That's unbelievable! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + + <!-- Message to the right --> + <div class="direct-chat-msg right"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-right">Sarah Bullock</span> + <span class="direct-chat-timestamp pull-left">23 Jan 2:05 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user3-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + You better believe it! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + </div><!--/.direct-chat-messages--> + + <!-- Contacts are loaded here --> + <div class="direct-chat-contacts"> + <ul class="contacts-list"> + <li> + <a href="#"> + <img class="contacts-list-img" src="../dist/img/user1-128x128.jpg"> + <div class="contacts-list-info"> + <span class="contacts-list-name"> + Count Dracula + <small class="contacts-list-date pull-right">2/28/2015</small> + </span> + <span class="contacts-list-msg">How have you been? I was...</span> + </div><!-- /.contacts-list-info --> + </a> + </li><!-- End Contact Item --> + </ul><!-- /.contatcts-list --> + </div><!-- /.direct-chat-pane --> + </div><!-- /.box-body --> + <div class="box-footer"> + <form action="#" method="post"> + <div class="input-group"> + <input type="text" name="message" placeholder="Type Message ..." class="form-control"> + <span class="input-group-btn"> + <button type="button" class="btn btn-success btn-flat">Send</button> + </span> + </div> + </form> + </div><!-- /.box-footer--> + </div><!--/.direct-chat --> + </div><!-- /.col --> + + <div class="col-md-3"> + <!-- DIRECT CHAT WARNING --> + <div class="box box-warning direct-chat direct-chat-warning"> + <div class="box-header with-border"> + <h3 class="box-title">Direct Chat</h3> + <div class="box-tools pull-right"> + <span data-toggle="tooltip" title="3 New Messages" class="badge bg-yellow">3</span> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-toggle="tooltip" title="Contacts" data-widget="chat-pane-toggle"><i class="fa fa-comments"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <!-- Conversations are loaded here --> + <div class="direct-chat-messages"> + <!-- Message. Default to the left --> + <div class="direct-chat-msg"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-left">Alexander Pierce</span> + <span class="direct-chat-timestamp pull-right">23 Jan 2:00 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user1-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + Is this template really for free? That's unbelievable! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + + <!-- Message to the right --> + <div class="direct-chat-msg right"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-right">Sarah Bullock</span> + <span class="direct-chat-timestamp pull-left">23 Jan 2:05 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user3-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + You better believe it! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + </div><!--/.direct-chat-messages--> + + <!-- Contacts are loaded here --> + <div class="direct-chat-contacts"> + <ul class="contacts-list"> + <li> + <a href="#"> + <img class="contacts-list-img" src="../dist/img/user1-128x128.jpg"> + <div class="contacts-list-info"> + <span class="contacts-list-name"> + Count Dracula + <small class="contacts-list-date pull-right">2/28/2015</small> + </span> + <span class="contacts-list-msg">How have you been? I was...</span> + </div><!-- /.contacts-list-info --> + </a> + </li><!-- End Contact Item --> + </ul><!-- /.contatcts-list --> + </div><!-- /.direct-chat-pane --> + </div><!-- /.box-body --> + <div class="box-footer"> + <form action="#" method="post"> + <div class="input-group"> + <input type="text" name="message" placeholder="Type Message ..." class="form-control"> + <span class="input-group-btn"> + <button type="button" class="btn btn-warning btn-flat">Send</button> + </span> + </div> + </form> + </div><!-- /.box-footer--> + </div><!--/.direct-chat --> + </div><!-- /.col --> + + <div class="col-md-3"> + <!-- DIRECT CHAT DANGER --> + <div class="box box-danger direct-chat direct-chat-danger"> + <div class="box-header with-border"> + <h3 class="box-title">Direct Chat</h3> + <div class="box-tools pull-right"> + <span data-toggle="tooltip" title="3 New Messages" class="badge bg-red">3</span> + <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button> + <button class="btn btn-box-tool" data-toggle="tooltip" title="Contacts" data-widget="chat-pane-toggle"><i class="fa fa-comments"></i></button> + <button class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button> + </div> + </div><!-- /.box-header --> + <div class="box-body"> + <!-- Conversations are loaded here --> + <div class="direct-chat-messages"> + <!-- Message. Default to the left --> + <div class="direct-chat-msg"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-left">Alexander Pierce</span> + <span class="direct-chat-timestamp pull-right">23 Jan 2:00 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user1-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + Is this template really for free? That's unbelievable! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + + <!-- Message to the right --> + <div class="direct-chat-msg right"> + <div class="direct-chat-info clearfix"> + <span class="direct-chat-name pull-right">Sarah Bullock</span> + <span class="direct-chat-timestamp pull-left">23 Jan 2:05 pm</span> + </div><!-- /.direct-chat-info --> + <img class="direct-chat-img" src="../dist/img/user3-128x128.jpg" alt="message user image"><!-- /.direct-chat-img --> + <div class="direct-chat-text"> + You better believe it! + </div><!-- /.direct-chat-text --> + </div><!-- /.direct-chat-msg --> + </div><!--/.direct-chat-messages--> + + <!-- Contacts are loaded here --> + <div class="direct-chat-contacts"> + <ul class="contacts-list"> + <li> + <a href="#"> + <img class="contacts-list-img" src="../dist/img/user1-128x128.jpg"> + <div class="contacts-list-info"> + <span class="contacts-list-name"> + Count Dracula + <small class="contacts-list-date pull-right">2/28/2015</small> + </span> + <span class="contacts-list-msg">How have you been? I was...</span> + </div><!-- /.contacts-list-info --> + </a> + </li><!-- End Contact Item --> + </ul><!-- /.contatcts-list --> + </div><!-- /.direct-chat-pane --> + </div><!-- /.box-body --> + <div class="box-footer"> + <form action="#" method="post"> + <div class="input-group"> + <input type="text" name="message" placeholder="Type Message ..." class="form-control"> + <span class="input-group-btn"> + <button type="button" class="btn btn-danger btn-flat">Send</button> + </span> + </div> + </form> + </div><!-- /.box-footer--> + </div><!--/.direct-chat --> + </div><!-- /.col --> + </div><!-- /.row --> + + <h2 class="page-header">Social Widgets</h2> + + <div class="row"> + <div class="col-md-4"> + <!-- Widget: user widget style 1 --> + <div class="box box-widget widget-user-2"> + <!-- Add the bg color to the header using any of the bg-* classes --> + <div class="widget-user-header bg-yellow"> + <div class="widget-user-image"> + <img class="img-circle" src="../dist/img/user7-128x128.jpg" alt="User Avatar"> + </div><!-- /.widget-user-image --> + <h3 class="widget-user-username">Nadia Carmichael</h3> + <h5 class="widget-user-desc">Lead Developer</h5> + </div> + <div class="box-footer no-padding"> + <ul class="nav nav-stacked"> + <li><a href="#">Projects <span class="pull-right badge bg-blue">31</span></a></li> + <li><a href="#">Tasks <span class="pull-right badge bg-aqua">5</span></a></li> + <li><a href="#">Completed Projects <span class="pull-right badge bg-green">12</span></a></li> + <li><a href="#">Followers <span class="pull-right badge bg-red">842</span></a></li> + </ul> + </div> + </div><!-- /.widget-user --> + </div><!-- /.col --> + <div class="col-md-4"> + <!-- Widget: user widget style 1 --> + <div class="box box-widget widget-user"> + <!-- Add the bg color to the header using any of the bg-* classes --> + <div class="widget-user-header bg-aqua-active"> + <h3 class="widget-user-username">Alexander Pierce</h3> + <h5 class="widget-user-desc">Founder & CEO</h5> + </div> + <div class="widget-user-image"> + <img class="img-circle" src="../dist/img/user1-128x128.jpg" alt="User Avatar"> + </div> + <div class="box-footer"> + <div class="row"> + <div class="col-sm-4 border-right"> + <div class="description-block"> + <h5 class="description-header">3,200</h5> + <span class="description-text">SALES</span> + </div><!-- /.description-block --> + </div><!-- /.col --> + <div class="col-sm-4 border-right"> + <div class="description-block"> + <h5 class="description-header">13,000</h5> + <span class="description-text">FOLLOWERS</span> + </div><!-- /.description-block --> + </div><!-- /.col --> + <div class="col-sm-4"> + <div class="description-block"> + <h5 class="description-header">35</h5> + <span class="description-text">PRODUCTS</span> + </div><!-- /.description-block --> + </div><!-- /.col --> + </div><!-- /.row --> + </div> + </div><!-- /.widget-user --> + </div><!-- /.col --> + <div class="col-md-4"> + <!-- Widget: user widget style 1 --> + <div class="box box-widget widget-user"> + <!-- Add the bg color to the header using any of the bg-* classes --> + <div class="widget-user-header bg-black" style="background: url('../dist/img/photo1.png') center center;"> + <h3 class="widget-user-username">Elizabeth Pierce</h3> + <h5 class="widget-user-desc">Web Designer</h5> + </div> + <div class="widget-user-image"> + <img class="img-circle" src="../dist/img/user3-128x128.jpg" alt="User Avatar"> + </div> + <div class="box-footer"> + <div class="row"> + <div class="col-sm-4 border-right"> + <div class="description-block"> + <h5 class="description-header">3,200</h5> + <span class="description-text">SALES</span> + </div><!-- /.description-block --> + </div><!-- /.col --> + <div class="col-sm-4 border-right"> + <div class="description-block"> + <h5 class="description-header">13,000</h5> + <span class="description-text">FOLLOWERS</span> + </div><!-- /.description-block --> + </div><!-- /.col --> + <div class="col-sm-4"> + <div class="description-block"> + <h5 class="description-header">35</h5> + <span class="description-text">PRODUCTS</span> + </div><!-- /.description-block --> + </div><!-- /.col --> + </div><!-- /.row --> + </div> + </div><!-- /.widget-user --> + </div><!-- /.col --> + </div><!-- /.row --> + + <div class="row"> + <div class="col-md-6"> + <!-- Box Comment --> + <div class="box box-widget"> + <div class='box-header with-border'> + <div class='user-block'> + <img class='img-circle' src='../dist/img/user1-128x128.jpg' alt='user image'> + <span class='username'><a href="#">Jonathan Burke Jr.</a></span> + <span class='description'>Shared publicly - 7:30 PM Today</span> + </div><!-- /.user-block --> + <div class='box-tools'> + <button class='btn btn-box-tool' data-toggle='tooltip' title='Mark as read'><i class='fa fa-circle-o'></i></button> + <button class='btn btn-box-tool' data-widget='collapse'><i class='fa fa-minus'></i></button> + <button class='btn btn-box-tool' data-widget='remove'><i class='fa fa-times'></i></button> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class='box-body'> + <img class="img-responsive pad" src="../dist/img/photo2.png" alt="Photo"> + <p>I took this photo this morning. What do you guys think?</p> + <button class='btn btn-default btn-xs'><i class='fa fa-share'></i> Share</button> + <button class='btn btn-default btn-xs'><i class='fa fa-thumbs-o-up'></i> Like</button> + <span class='pull-right text-muted'>127 likes - 3 comments</span> + </div><!-- /.box-body --> + <div class='box-footer box-comments'> + <div class='box-comment'> + <!-- User image --> + <img class='img-circle img-sm' src='../dist/img/user3-128x128.jpg' alt='user image'> + <div class='comment-text'> + <span class="username"> + Maria Gonzales + <span class='text-muted pull-right'>8:03 PM Today</span> + </span><!-- /.username --> + It is a long established fact that a reader will be distracted + by the readable content of a page when looking at its layout. + </div><!-- /.comment-text --> + </div><!-- /.box-comment --> + <div class='box-comment'> + <!-- User image --> + <img class='img-circle img-sm' src='../dist/img/user4-128x128.jpg' alt='user image'> + <div class='comment-text'> + <span class="username"> + Luna Stark + <span class='text-muted pull-right'>8:03 PM Today</span> + </span><!-- /.username --> + It is a long established fact that a reader will be distracted + by the readable content of a page when looking at its layout. + </div><!-- /.comment-text --> + </div><!-- /.box-comment --> + </div><!-- /.box-footer --> + <div class="box-footer"> + <form action="#" method="post"> + <img class="img-responsive img-circle img-sm" src="../dist/img/user4-128x128.jpg" alt="alt text"> + <!-- .img-push is used to add margin to elements next to floating images --> + <div class="img-push"> + <input type="text" class="form-control input-sm" placeholder="Press enter to post comment"> + </div> + </form> + </div><!-- /.box-footer --> + </div><!-- /.box --> + </div><!-- /.col --> + <div class="col-md-6"> + <!-- Box Comment --> + <div class="box box-widget"> + <div class='box-header with-border'> + <div class='user-block'> + <img class='img-circle' src='../dist/img/user1-128x128.jpg' alt='user image'> + <span class='username'><a href="#">Jonathan Burke Jr.</a></span> + <span class='description'>Shared publicly - 7:30 PM Today</span> + </div><!-- /.user-block --> + <div class='box-tools'> + <button class='btn btn-box-tool' data-toggle='tooltip' title='Mark as read'><i class='fa fa-circle-o'></i></button> + <button class='btn btn-box-tool' data-widget='collapse'><i class='fa fa-minus'></i></button> + <button class='btn btn-box-tool' data-widget='remove'><i class='fa fa-times'></i></button> + </div><!-- /.box-tools --> + </div><!-- /.box-header --> + <div class='box-body'> + <!-- post text --> + <p>Far far away, behind the word mountains, far from the + countries Vokalia and Consonantia, there live the blind + texts. Separated they live in Bookmarksgrove right at</p> + <p>the coast of the Semantics, a large language ocean. + A small river named Duden flows by their place and supplies + it with the necessary regelialia. It is a paradisematic + country, in which roasted parts of sentences fly into + your mouth.</p> + + <!-- Attachment --> + <div class="attachment-block clearfix"> + <img class="attachment-img" src="../dist/img/photo1.png" alt="attachment image"> + <div class="attachment-pushed"> + <h4 class="attachment-heading"><a href="http://www.lipsum.com/">Lorem ipsum text generator</a></h4> + <div class="attachment-text"> + Description about the attachment can be placed here. + Lorem Ipsum is simply dummy text of the printing and typesetting industry... <a href="#">more</a> + </div><!-- /.attachment-text --> + </div><!-- /.attachment-pushed --> + </div><!-- /.attachment-block --> + + <!-- Social sharing buttons --> + <button class='btn btn-default btn-xs'><i class='fa fa-share'></i> Share</button> + <button class='btn btn-default btn-xs'><i class='fa fa-thumbs-o-up'></i> Like</button> + <span class='pull-right text-muted'>45 likes - 2 comments</span> + </div><!-- /.box-body --> + <div class='box-footer box-comments'> + <div class='box-comment'> + <!-- User image --> + <img class='img-circle img-sm' src='../dist/img/user3-128x128.jpg' alt='user image'> + <div class='comment-text'> + <span class="username"> + Maria Gonzales + <span class='text-muted pull-right'>8:03 PM Today</span> + </span><!-- /.username --> + It is a long established fact that a reader will be distracted + by the readable content of a page when looking at its layout. + </div><!-- /.comment-text --> + </div><!-- /.box-comment --> + <div class='box-comment'> + <!-- User image --> + <img class='img-circle img-sm' src='../dist/img/user5-128x128.jpg' alt='user image'> + <div class='comment-text'> + <span class="username"> + Nora Havisham + <span class='text-muted pull-right'>8:03 PM Today</span> + </span><!-- /.username --> + The point of using Lorem Ipsum is that it has a more-or-less + normal distribution of letters, as opposed to using + 'Content here, content here', making it look like readable English. + </div><!-- /.comment-text --> + </div><!-- /.box-comment --> + </div><!-- /.box-footer --> + <div class="box-footer"> + <form action="#" method="post"> + <img class="img-responsive img-circle img-sm" src="../dist/img/user4-128x128.jpg" alt="alt text"> + <!-- .img-push is used to add margin to elements next to floating images --> + <div class="img-push"> + <input type="text" class="form-control input-sm" placeholder="Press enter to post comment"> + </div> + </form> + </div><!-- /.box-footer --> + </div><!-- /.box --> + </div><!-- /.col --> + </div><!-- /.row --> + + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 2.3.0 + </div> + <strong>Copyright &copy; 2014-2015 <a href="http://almsaeedstudio.com">Almsaeed Studio</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-user bg-yellow"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Frodo Updated His Profile</h4> + <p>New phone +1(800)555-1234</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-envelope-o bg-light-blue"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Nora Joined Mailing List</h4> + <p>nora@example.com</p> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-file-code-o bg-green"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Cron Job 254 Executed</h4> + <p>Execution time 5 seconds</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Update Resume + <span class="label label-success pull-right">95%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-success" style="width: 95%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Laravel Integration + <span class="label label-warning pull-right">50%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-warning" style="width: 50%"></div> + </div> + </a> + </li> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Back End Framework + <span class="label label-primary pull-right">68%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-primary" style="width: 68%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Allow mail redirect + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Other sets of options are available + </p> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Expose author name in posts + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Allow the user to show his name in blog posts + </p> + </div><!-- /.form-group --> + + <h3 class="control-sidebar-heading">Chat Settings</h3> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Show me as online + <input type="checkbox" class="pull-right" checked> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Turn off notifications + <input type="checkbox" class="pull-right"> + </label> + </div><!-- /.form-group --> + + <div class="form-group"> + <label class="control-sidebar-subheading"> + Delete chat history + <a href="javascript::;" class="text-red pull-right"><i class="fa fa-trash-o"></i></a> + </label> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- jQuery 2.1.4 --> + <script src="../plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="../bootstrap/js/bootstrap.min.js"></script> + <!-- Slimscroll --> + <script src="../plugins/slimScroll/jquery.slimscroll.min.js"></script> + <!-- FastClick --> + <script src="../plugins/fastclick/fastclick.min.js"></script> + <!-- AdminLTE App --> + <script src="../dist/js/app.min.js"></script> + <!-- AdminLTE for demo purposes --> + <script src="../dist/js/demo.js"></script> + </body> +</html> diff --git a/theme/bootstrap/plugins/bootstrap-slider/bootstrap-slider.js b/theme/bootstrap/plugins/bootstrap-slider/bootstrap-slider.js new file mode 100644 index 0000000..2e072fe --- /dev/null +++ b/theme/bootstrap/plugins/bootstrap-slider/bootstrap-slider.js @@ -0,0 +1,1167 @@ +/*! ========================================================= + * bootstrap-slider.js + * + * Maintainers: + * Kyle Kemp + * - Twitter: @seiyria + * - Github: seiyria + * Rohit Kalkur + * - Twitter: @Rovolutionary + * - Github: rovolution + * + * ========================================================= + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================= */ + + +/** + * Bridget makes jQuery widgets + * v1.0.1 + * MIT license + */ +( function( $ ) { + + ( function( $ ) { + + 'use strict'; + + // -------------------------- utils -------------------------- // + + var slice = Array.prototype.slice; + + function noop() {} + + // -------------------------- definition -------------------------- // + + function defineBridget( $ ) { + + // bail if no jQuery + if ( !$ ) { + return; + } + + // -------------------------- addOptionMethod -------------------------- // + + /** + * adds option method -> $().plugin('option', {...}) + * @param {Function} PluginClass - constructor class + */ + function addOptionMethod( PluginClass ) { + // don't overwrite original option method + if ( PluginClass.prototype.option ) { + return; + } + + // option setter + PluginClass.prototype.option = function( opts ) { + // bail out if not an object + if ( !$.isPlainObject( opts ) ){ + return; + } + this.options = $.extend( true, this.options, opts ); + }; + } + + + // -------------------------- plugin bridge -------------------------- // + + // helper function for logging errors + // $.error breaks jQuery chaining + var logError = typeof console === 'undefined' ? noop : + function( message ) { + console.error( message ); + }; + + /** + * jQuery plugin bridge, access methods like $elem.plugin('method') + * @param {String} namespace - plugin name + * @param {Function} PluginClass - constructor class + */ + function bridge( namespace, PluginClass ) { + // add to jQuery fn namespace + $.fn[ namespace ] = function( options ) { + if ( typeof options === 'string' ) { + // call plugin method when first argument is a string + // get arguments for method + var args = slice.call( arguments, 1 ); + + for ( var i=0, len = this.length; i < len; i++ ) { + var elem = this[i]; + var instance = $.data( elem, namespace ); + if ( !instance ) { + logError( "cannot call methods on " + namespace + " prior to initialization; " + + "attempted to call '" + options + "'" ); + continue; + } + if ( !$.isFunction( instance[options] ) || options.charAt(0) === '_' ) { + logError( "no such method '" + options + "' for " + namespace + " instance" ); + continue; + } + + // trigger method with arguments + var returnValue = instance[ options ].apply( instance, args); + + // break look and return first value if provided + if ( returnValue !== undefined && returnValue !== instance) { + return returnValue; + } + } + // return this if no return value + return this; + } else { + var objects = this.map( function() { + var instance = $.data( this, namespace ); + if ( instance ) { + // apply options & init + instance.option( options ); + instance._init(); + } else { + // initialize new instance + instance = new PluginClass( this, options ); + $.data( this, namespace, instance ); + } + return $(this); + }); + + if(!objects || objects.length > 1) { + return objects; + } else { + return objects[0]; + } + } + }; + + } + + // -------------------------- bridget -------------------------- // + + /** + * converts a Prototypical class into a proper jQuery plugin + * the class must have a ._init method + * @param {String} namespace - plugin name, used in $().pluginName + * @param {Function} PluginClass - constructor class + */ + $.bridget = function( namespace, PluginClass ) { + addOptionMethod( PluginClass ); + bridge( namespace, PluginClass ); + }; + + return $.bridget; + + } + + // get jquery from browser global + defineBridget( $ ); + + })( $ ); + + + /************************************************* + + BOOTSTRAP-SLIDER SOURCE CODE + + **************************************************/ + + (function( $ ) { + + var ErrorMsgs = { + formatInvalidInputErrorMsg : function(input) { + return "Invalid input value '" + input + "' passed in"; + }, + callingContextNotSliderInstance : "Calling context element does not have instance of Slider bound to it. Check your code to make sure the JQuery object returned from the call to the slider() initializer is calling the method" + }; + + + + /************************************************* + + CONSTRUCTOR + + **************************************************/ + var Slider = function(element, options) { + createNewSlider.call(this, element, options); + return this; + }; + + function createNewSlider(element, options) { + /************************************************* + + Create Markup + + **************************************************/ + if(typeof element === "string") { + this.element = document.querySelector(element); + } else if(element instanceof HTMLElement) { + this.element = element; + } + + var origWidth = this.element.style.width; + var updateSlider = false; + var parent = this.element.parentNode; + var sliderTrackSelection; + var sliderMinHandle; + var sliderMaxHandle; + + if (this.sliderElem) { + updateSlider = true; + } else { + /* Create elements needed for slider */ + this.sliderElem = document.createElement("div"); + this.sliderElem.className = "slider"; + + /* Create slider track elements */ + var sliderTrack = document.createElement("div"); + sliderTrack.className = "slider-track"; + + sliderTrackSelection = document.createElement("div"); + sliderTrackSelection.className = "slider-selection"; + + sliderMinHandle = document.createElement("div"); + sliderMinHandle.className = "slider-handle min-slider-handle"; + + sliderMaxHandle = document.createElement("div"); + sliderMaxHandle.className = "slider-handle max-slider-handle"; + + sliderTrack.appendChild(sliderTrackSelection); + sliderTrack.appendChild(sliderMinHandle); + sliderTrack.appendChild(sliderMaxHandle); + + var createAndAppendTooltipSubElements = function(tooltipElem) { + var arrow = document.createElement("div"); + arrow.className = "tooltip-arrow"; + + var inner = document.createElement("div"); + inner.className = "tooltip-inner"; + + tooltipElem.appendChild(arrow); + tooltipElem.appendChild(inner); + }; + + /* Create tooltip elements */ + var sliderTooltip = document.createElement("div"); + sliderTooltip.className = "tooltip tooltip-main"; + createAndAppendTooltipSubElements(sliderTooltip); + + var sliderTooltipMin = document.createElement("div"); + sliderTooltipMin.className = "tooltip tooltip-min"; + createAndAppendTooltipSubElements(sliderTooltipMin); + + var sliderTooltipMax = document.createElement("div"); + sliderTooltipMax.className = "tooltip tooltip-max"; + createAndAppendTooltipSubElements(sliderTooltipMax); + + + /* Append components to sliderElem */ + this.sliderElem.appendChild(sliderTrack); + this.sliderElem.appendChild(sliderTooltip); + this.sliderElem.appendChild(sliderTooltipMin); + this.sliderElem.appendChild(sliderTooltipMax); + + /* Append slider element to parent container, right before the original <input> element */ + parent.insertBefore(this.sliderElem, this.element); + + /* Hide original <input> element */ + this.element.style.display = "none"; + } + /* If JQuery exists, cache JQ references */ + if($) { + this.$element = $(this.element); + this.$sliderElem = $(this.sliderElem); + } + + /************************************************* + + Process Options + + **************************************************/ + options = options ? options : {}; + var optionTypes = Object.keys(this.defaultOptions); + + for(var i = 0; i < optionTypes.length; i++) { + var optName = optionTypes[i]; + + // First check if an option was passed in via the constructor + var val = options[optName]; + // If no data attrib, then check data atrributes + val = (typeof val !== 'undefined') ? val : getDataAttrib(this.element, optName); + // Finally, if nothing was specified, use the defaults + val = (val !== null) ? val : this.defaultOptions[optName]; + + // Set all options on the instance of the Slider + if(!this.options) { + this.options = {}; + } + this.options[optName] = val; + } + + function getDataAttrib(element, optName) { + var dataName = "data-slider-" + optName; + var dataValString = element.getAttribute(dataName); + + try { + return JSON.parse(dataValString); + } + catch(err) { + return dataValString; + } + } + + /************************************************* + + Setup + + **************************************************/ + this.eventToCallbackMap = {}; + this.sliderElem.id = this.options.id; + + this.touchCapable = 'ontouchstart' in window || (window.DocumentTouch && document instanceof window.DocumentTouch); + + this.tooltip = this.sliderElem.querySelector('.tooltip-main'); + this.tooltipInner = this.tooltip.querySelector('.tooltip-inner'); + + this.tooltip_min = this.sliderElem.querySelector('.tooltip-min'); + this.tooltipInner_min = this.tooltip_min.querySelector('.tooltip-inner'); + + this.tooltip_max = this.sliderElem.querySelector('.tooltip-max'); + this.tooltipInner_max= this.tooltip_max.querySelector('.tooltip-inner'); + + if (updateSlider === true) { + // Reset classes + this._removeClass(this.sliderElem, 'slider-horizontal'); + this._removeClass(this.sliderElem, 'slider-vertical'); + this._removeClass(this.tooltip, 'hide'); + this._removeClass(this.tooltip_min, 'hide'); + this._removeClass(this.tooltip_max, 'hide'); + + // Undo existing inline styles for track + ["left", "top", "width", "height"].forEach(function(prop) { + this._removeProperty(this.trackSelection, prop); + }, this); + + // Undo inline styles on handles + [this.handle1, this.handle2].forEach(function(handle) { + this._removeProperty(handle, 'left'); + this._removeProperty(handle, 'top'); + }, this); + + // Undo inline styles and classes on tooltips + [this.tooltip, this.tooltip_min, this.tooltip_max].forEach(function(tooltip) { + this._removeProperty(tooltip, 'left'); + this._removeProperty(tooltip, 'top'); + this._removeProperty(tooltip, 'margin-left'); + this._removeProperty(tooltip, 'margin-top'); + + this._removeClass(tooltip, 'right'); + this._removeClass(tooltip, 'top'); + }, this); + } + + if(this.options.orientation === 'vertical') { + this._addClass(this.sliderElem,'slider-vertical'); + + this.stylePos = 'top'; + this.mousePos = 'pageY'; + this.sizePos = 'offsetHeight'; + + this._addClass(this.tooltip, 'right'); + this.tooltip.style.left = '100%'; + + this._addClass(this.tooltip_min, 'right'); + this.tooltip_min.style.left = '100%'; + + this._addClass(this.tooltip_max, 'right'); + this.tooltip_max.style.left = '100%'; + } else { + this._addClass(this.sliderElem, 'slider-horizontal'); + this.sliderElem.style.width = origWidth; + + this.options.orientation = 'horizontal'; + this.stylePos = 'left'; + this.mousePos = 'pageX'; + this.sizePos = 'offsetWidth'; + + this._addClass(this.tooltip, 'top'); + this.tooltip.style.top = -this.tooltip.outerHeight - 14 + 'px'; + + this._addClass(this.tooltip_min, 'top'); + this.tooltip_min.style.top = -this.tooltip_min.outerHeight - 14 + 'px'; + + this._addClass(this.tooltip_max, 'top'); + this.tooltip_max.style.top = -this.tooltip_max.outerHeight - 14 + 'px'; + } + + if (this.options.value instanceof Array) { + this.options.range = true; + } else if (this.options.range) { + // User wants a range, but value is not an array + this.options.value = [this.options.value, this.options.max]; + } + + this.trackSelection = sliderTrackSelection || this.trackSelection; + if (this.options.selection === 'none') { + this._addClass(this.trackSelection, 'hide'); + } + + this.handle1 = sliderMinHandle || this.handle1; + this.handle2 = sliderMaxHandle || this.handle2; + + if (updateSlider === true) { + // Reset classes + this._removeClass(this.handle1, 'round triangle'); + this._removeClass(this.handle2, 'round triangle hide'); + } + + var availableHandleModifiers = ['round', 'triangle', 'custom']; + var isValidHandleType = availableHandleModifiers.indexOf(this.options.handle) !== -1; + if (isValidHandleType) { + this._addClass(this.handle1, this.options.handle); + this._addClass(this.handle2, this.options.handle); + } + + this.offset = this._offset(this.sliderElem); + this.size = this.sliderElem[this.sizePos]; + this.setValue(this.options.value); + + /****************************************** + + Bind Event Listeners + + ******************************************/ + + // Bind keyboard handlers + this.handle1Keydown = this._keydown.bind(this, 0); + this.handle1.addEventListener("keydown", this.handle1Keydown, false); + + this.handle2Keydown = this._keydown.bind(this, 0); + this.handle2.addEventListener("keydown", this.handle2Keydown, false); + + if (this.touchCapable) { + // Bind touch handlers + this.mousedown = this._mousedown.bind(this); + this.sliderElem.addEventListener("touchstart", this.mousedown, false); + } else { + // Bind mouse handlers + this.mousedown = this._mousedown.bind(this); + this.sliderElem.addEventListener("mousedown", this.mousedown, false); + } + + // Bind tooltip-related handlers + if(this.options.tooltip === 'hide') { + this._addClass(this.tooltip, 'hide'); + this._addClass(this.tooltip_min, 'hide'); + this._addClass(this.tooltip_max, 'hide'); + } else if(this.options.tooltip === 'always') { + this._showTooltip(); + this._alwaysShowTooltip = true; + } else { + this.showTooltip = this._showTooltip.bind(this); + this.hideTooltip = this._hideTooltip.bind(this); + + this.sliderElem.addEventListener("mouseenter", this.showTooltip, false); + this.sliderElem.addEventListener("mouseleave", this.hideTooltip, false); + + this.handle1.addEventListener("focus", this.showTooltip, false); + this.handle1.addEventListener("blur", this.hideTooltip, false); + + this.handle2.addEventListener("focus", this.showTooltip, false); + this.handle2.addEventListener("blur", this.hideTooltip, false); + } + + if(this.options.enabled) { + this.enable(); + } else { + this.disable(); + } + } + + /************************************************* + + INSTANCE PROPERTIES/METHODS + + - Any methods bound to the prototype are considered + part of the plugin's `public` interface + + **************************************************/ + Slider.prototype = { + _init: function() {}, // NOTE: Must exist to support bridget + + constructor: Slider, + + defaultOptions: { + id: "", + min: 0, + max: 10, + step: 1, + precision: 0, + orientation: 'horizontal', + value: 5, + range: false, + selection: 'before', + tooltip: 'show', + tooltip_split: false, + handle: 'round', + reversed: false, + enabled: true, + formatter: function(val) { + if(val instanceof Array) { + return val[0] + " : " + val[1]; + } else { + return val; + } + }, + natural_arrow_keys: false + }, + + over: false, + + inDrag: false, + + getValue: function() { + if (this.options.range) { + return this.options.value; + } + return this.options.value[0]; + }, + + setValue: function(val, triggerSlideEvent) { + if (!val) { + val = 0; + } + this.options.value = this._validateInputValue(val); + var applyPrecision = this._applyPrecision.bind(this); + + if (this.options.range) { + this.options.value[0] = applyPrecision(this.options.value[0]); + this.options.value[1] = applyPrecision(this.options.value[1]); + + this.options.value[0] = Math.max(this.options.min, Math.min(this.options.max, this.options.value[0])); + this.options.value[1] = Math.max(this.options.min, Math.min(this.options.max, this.options.value[1])); + } else { + this.options.value = applyPrecision(this.options.value); + this.options.value = [ Math.max(this.options.min, Math.min(this.options.max, this.options.value))]; + this._addClass(this.handle2, 'hide'); + if (this.options.selection === 'after') { + this.options.value[1] = this.options.max; + } else { + this.options.value[1] = this.options.min; + } + } + + this.diff = this.options.max - this.options.min; + if (this.diff > 0) { + this.percentage = [ + (this.options.value[0] - this.options.min) * 100 / this.diff, + (this.options.value[1] - this.options.min) * 100 / this.diff, + this.options.step * 100 / this.diff + ]; + } else { + this.percentage = [0, 0, 100]; + } + + this._layout(); + + var sliderValue = this.options.range ? this.options.value : this.options.value[0]; + this._setDataVal(sliderValue); + + if(triggerSlideEvent === true) { + this._trigger('slide', sliderValue); + } + + return this; + }, + + destroy: function(){ + // Remove event handlers on slider elements + this._removeSliderEventHandlers(); + + // Remove the slider from the DOM + this.sliderElem.parentNode.removeChild(this.sliderElem); + /* Show original <input> element */ + this.element.style.display = ""; + + // Clear out custom event bindings + this._cleanUpEventCallbacksMap(); + + // Remove data values + this.element.removeAttribute("data"); + + // Remove JQuery handlers/data + if($) { + this._unbindJQueryEventHandlers(); + this.$element.removeData('slider'); + } + }, + + disable: function() { + this.options.enabled = false; + this.handle1.removeAttribute("tabindex"); + this.handle2.removeAttribute("tabindex"); + this._addClass(this.sliderElem, 'slider-disabled'); + this._trigger('slideDisabled'); + + return this; + }, + + enable: function() { + this.options.enabled = true; + this.handle1.setAttribute("tabindex", 0); + this.handle2.setAttribute("tabindex", 0); + this._removeClass(this.sliderElem, 'slider-disabled'); + this._trigger('slideEnabled'); + + return this; + }, + + toggle: function() { + if(this.options.enabled) { + this.disable(); + } else { + this.enable(); + } + + return this; + }, + + isEnabled: function() { + return this.options.enabled; + }, + + on: function(evt, callback) { + if($) { + this.$element.on(evt, callback); + this.$sliderElem.on(evt, callback); + } else { + this._bindNonQueryEventHandler(evt, callback); + } + return this; + }, + + getAttribute: function(attribute) { + if(attribute) { + return this.options[attribute]; + } else { + return this.options; + } + }, + + setAttribute: function(attribute, value) { + this.options[attribute] = value; + return this; + }, + + refresh: function() { + this._removeSliderEventHandlers(); + createNewSlider.call(this, this.element, this.options); + if($) { + // Bind new instance of slider to the element + $.data(this.element, 'slider', this); + } + return this; + }, + + /******************************+ + + HELPERS + + - Any method that is not part of the public interface. + - Place it underneath this comment block and write its signature like so: + + _fnName : function() {...} + + ********************************/ + _removeSliderEventHandlers: function() { + // Remove event listeners from handle1 + this.handle1.removeEventListener("keydown", this.handle1Keydown, false); + this.handle1.removeEventListener("focus", this.showTooltip, false); + this.handle1.removeEventListener("blur", this.hideTooltip, false); + + // Remove event listeners from handle2 + this.handle2.removeEventListener("keydown", this.handle2Keydown, false); + this.handle2.removeEventListener("focus", this.handle2Keydown, false); + this.handle2.removeEventListener("blur", this.handle2Keydown, false); + + // Remove event listeners from sliderElem + this.sliderElem.removeEventListener("mouseenter", this.showTooltip, false); + this.sliderElem.removeEventListener("mouseleave", this.hideTooltip, false); + this.sliderElem.removeEventListener("touchstart", this.mousedown, false); + this.sliderElem.removeEventListener("mousedown", this.mousedown, false); + }, + _bindNonQueryEventHandler: function(evt, callback) { + if(this.eventToCallbackMap[evt]===undefined) { + this.eventToCallbackMap[evt] = []; + } + this.eventToCallbackMap[evt].push(callback); + }, + _cleanUpEventCallbacksMap: function() { + var eventNames = Object.keys(this.eventToCallbackMap); + for(var i = 0; i < eventNames.length; i++) { + var eventName = eventNames[i]; + this.eventToCallbackMap[eventName] = null; + } + }, + _showTooltip: function() { + if (this.options.tooltip_split === false ){ + this._addClass(this.tooltip, 'in'); + } else { + this._addClass(this.tooltip_min, 'in'); + this._addClass(this.tooltip_max, 'in'); + } + this.over = true; + }, + _hideTooltip: function() { + if (this.inDrag === false && this.alwaysShowTooltip !== true) { + this._removeClass(this.tooltip, 'in'); + this._removeClass(this.tooltip_min, 'in'); + this._removeClass(this.tooltip_max, 'in'); + } + this.over = false; + }, + _layout: function() { + var positionPercentages; + + if(this.options.reversed) { + positionPercentages = [ 100 - this.percentage[0], this.percentage[1] ]; + } else { + positionPercentages = [ this.percentage[0], this.percentage[1] ]; + } + + this.handle1.style[this.stylePos] = positionPercentages[0]+'%'; + this.handle2.style[this.stylePos] = positionPercentages[1]+'%'; + + if (this.options.orientation === 'vertical') { + this.trackSelection.style.top = Math.min(positionPercentages[0], positionPercentages[1]) +'%'; + this.trackSelection.style.height = Math.abs(positionPercentages[0] - positionPercentages[1]) +'%'; + } else { + this.trackSelection.style.left = Math.min(positionPercentages[0], positionPercentages[1]) +'%'; + this.trackSelection.style.width = Math.abs(positionPercentages[0] - positionPercentages[1]) +'%'; + + var offset_min = this.tooltip_min.getBoundingClientRect(); + var offset_max = this.tooltip_max.getBoundingClientRect(); + + if (offset_min.right > offset_max.left) { + this._removeClass(this.tooltip_max, 'top'); + this._addClass(this.tooltip_max, 'bottom'); + this.tooltip_max.style.top = 18 + 'px'; + } else { + this._removeClass(this.tooltip_max, 'bottom'); + this._addClass(this.tooltip_max, 'top'); + this.tooltip_max.style.top = -30 + 'px'; + } + } + + + var formattedTooltipVal; + + if (this.options.range) { + formattedTooltipVal = this.options.formatter(this.options.value); + this._setText(this.tooltipInner, formattedTooltipVal); + this.tooltip.style[this.stylePos] = (positionPercentages[1] + positionPercentages[0])/2 + '%'; + + if (this.options.orientation === 'vertical') { + this._css(this.tooltip, 'margin-top', -this.tooltip.offsetHeight / 2 + 'px'); + } else { + this._css(this.tooltip, 'margin-left', -this.tooltip.offsetWidth / 2 + 'px'); + } + + if (this.options.orientation === 'vertical') { + this._css(this.tooltip, 'margin-top', -this.tooltip.offsetHeight / 2 + 'px'); + } else { + this._css(this.tooltip, 'margin-left', -this.tooltip.offsetWidth / 2 + 'px'); + } + + var innerTooltipMinText = this.options.formatter(this.options.value[0]); + this._setText(this.tooltipInner_min, innerTooltipMinText); + + var innerTooltipMaxText = this.options.formatter(this.options.value[1]); + this._setText(this.tooltipInner_max, innerTooltipMaxText); + + this.tooltip_min.style[this.stylePos] = positionPercentages[0] + '%'; + + if (this.options.orientation === 'vertical') { + this._css(this.tooltip_min, 'margin-top', -this.tooltip_min.offsetHeight / 2 + 'px'); + } else { + this._css(this.tooltip_min, 'margin-left', -this.tooltip_min.offsetWidth / 2 + 'px'); + } + + this.tooltip_max.style[this.stylePos] = positionPercentages[1] + '%'; + + if (this.options.orientation === 'vertical') { + this._css(this.tooltip_max, 'margin-top', -this.tooltip_max.offsetHeight / 2 + 'px'); + } else { + this._css(this.tooltip_max, 'margin-left', -this.tooltip_max.offsetWidth / 2 + 'px'); + } + } else { + formattedTooltipVal = this.options.formatter(this.options.value[0]); + this._setText(this.tooltipInner, formattedTooltipVal); + + this.tooltip.style[this.stylePos] = positionPercentages[0] + '%'; + if (this.options.orientation === 'vertical') { + this._css(this.tooltip, 'margin-top', -this.tooltip.offsetHeight / 2 + 'px'); + } else { + this._css(this.tooltip, 'margin-left', -this.tooltip.offsetWidth / 2 + 'px'); + } + } + }, + _removeProperty: function(element, prop) { + if (element.style.removeProperty) { + element.style.removeProperty(prop); + } else { + element.style.removeAttribute(prop); + } + }, + _mousedown: function(ev) { + if(!this.options.enabled) { + return false; + } + + this._triggerFocusOnHandle(); + + this.offset = this._offset(this.sliderElem); + this.size = this.sliderElem[this.sizePos]; + + var percentage = this._getPercentage(ev); + + if (this.options.range) { + var diff1 = Math.abs(this.percentage[0] - percentage); + var diff2 = Math.abs(this.percentage[1] - percentage); + this.dragged = (diff1 < diff2) ? 0 : 1; + } else { + this.dragged = 0; + } + + this.percentage[this.dragged] = this.options.reversed ? 100 - percentage : percentage; + this._layout(); + + this.mousemove = this._mousemove.bind(this); + this.mouseup = this._mouseup.bind(this); + + if (this.touchCapable) { + // Touch: Bind touch events: + document.addEventListener("touchmove", this.mousemove, false); + document.addEventListener("touchend", this.mouseup, false); + } else { + // Bind mouse events: + document.addEventListener("mousemove", this.mousemove, false); + document.addEventListener("mouseup", this.mouseup, false); + } + + this.inDrag = true; + + var val = this._calculateValue(); + this._trigger('slideStart', val); + this._setDataVal(val); + this.setValue(val); + + this._pauseEvent(ev); + + return true; + }, + _triggerFocusOnHandle: function(handleIdx) { + if(handleIdx === 0) { + this.handle1.focus(); + } + if(handleIdx === 1) { + this.handle2.focus(); + } + }, + _keydown: function(handleIdx, ev) { + if(!this.options.enabled) { + return false; + } + + var dir; + switch (ev.keyCode) { + case 37: // left + case 40: // down + dir = -1; + break; + case 39: // right + case 38: // up + dir = 1; + break; + } + if (!dir) { + return; + } + + // use natural arrow keys instead of from min to max + if (this.options.natural_arrow_keys) { + var ifVerticalAndNotReversed = (this.options.orientation === 'vertical' && !this.options.reversed); + var ifHorizontalAndReversed = (this.options.orientation === 'horizontal' && this.options.reversed); + + if (ifVerticalAndNotReversed || ifHorizontalAndReversed) { + dir = dir * -1; + } + } + + var oneStepValuePercentageChange = dir * this.percentage[2]; + var percentage = this.percentage[handleIdx] + oneStepValuePercentageChange; + + if (percentage > 100) { + percentage = 100; + } else if (percentage < 0) { + percentage = 0; + } + + this.dragged = handleIdx; + this._adjustPercentageForRangeSliders(percentage); + this.percentage[this.dragged] = percentage; + this._layout(); + + var val = this._calculateValue(); + + this._trigger('slideStart', val); + this._setDataVal(val); + this.setValue(val, true); + + this._trigger('slideStop', val); + this._setDataVal(val); + + this._pauseEvent(ev); + + return false; + }, + _pauseEvent: function(ev) { + if(ev.stopPropagation) { + ev.stopPropagation(); + } + if(ev.preventDefault) { + ev.preventDefault(); + } + ev.cancelBubble=true; + ev.returnValue=false; + }, + _mousemove: function(ev) { + if(!this.options.enabled) { + return false; + } + + var percentage = this._getPercentage(ev); + this._adjustPercentageForRangeSliders(percentage); + this.percentage[this.dragged] = this.options.reversed ? 100 - percentage : percentage; + this._layout(); + + var val = this._calculateValue(); + this.setValue(val, true); + + return false; + }, + _adjustPercentageForRangeSliders: function(percentage) { + if (this.options.range) { + if (this.dragged === 0 && this.percentage[1] < percentage) { + this.percentage[0] = this.percentage[1]; + this.dragged = 1; + } else if (this.dragged === 1 && this.percentage[0] > percentage) { + this.percentage[1] = this.percentage[0]; + this.dragged = 0; + } + } + }, + _mouseup: function() { + if(!this.options.enabled) { + return false; + } + if (this.touchCapable) { + // Touch: Unbind touch event handlers: + document.removeEventListener("touchmove", this.mousemove, false); + document.removeEventListener("touchend", this.mouseup, false); + } else { + // Unbind mouse event handlers: + document.removeEventListener("mousemove", this.mousemove, false); + document.removeEventListener("mouseup", this.mouseup, false); + } + + this.inDrag = false; + if (this.over === false) { + this._hideTooltip(); + } + var val = this._calculateValue(); + + this._layout(); + this._setDataVal(val); + this._trigger('slideStop', val); + + return false; + }, + _calculateValue: function() { + var val; + if (this.options.range) { + val = [this.options.min,this.options.max]; + if (this.percentage[0] !== 0){ + val[0] = (Math.max(this.options.min, this.options.min + Math.round((this.diff * this.percentage[0]/100)/this.options.step)*this.options.step)); + val[0] = this._applyPrecision(val[0]); + } + if (this.percentage[1] !== 100){ + val[1] = (Math.min(this.options.max, this.options.min + Math.round((this.diff * this.percentage[1]/100)/this.options.step)*this.options.step)); + val[1] = this._applyPrecision(val[1]); + } + this.options.value = val; + } else { + val = (this.options.min + Math.round((this.diff * this.percentage[0]/100)/this.options.step)*this.options.step); + if (val < this.options.min) { + val = this.options.min; + } + else if (val > this.options.max) { + val = this.options.max; + } + val = parseFloat(val); + val = this._applyPrecision(val); + this.options.value = [val, this.options.value[1]]; + } + return val; + }, + _applyPrecision: function(val) { + var precision = this.options.precision || this._getNumDigitsAfterDecimalPlace(this.step); + return this._applyToFixedAndParseFloat(val, precision); + }, + _getNumDigitsAfterDecimalPlace: function(num) { + var match = (''+num).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/); + if (!match) { return 0; } + return Math.max(0, (match[1] ? match[1].length : 0) - (match[2] ? +match[2] : 0)); + }, + _applyToFixedAndParseFloat: function(num, toFixedInput) { + var truncatedNum = num.toFixed(toFixedInput); + return parseFloat(truncatedNum); + }, + /* + Credits to Mike Samuel for the following method! + Source: http://stackoverflow.com/questions/10454518/javascript-how-to-retrieve-the-number-of-decimals-of-a-string-number + */ + _getPercentage: function(ev) { + if (this.touchCapable && (ev.type === 'touchstart' || ev.type === 'touchmove')) { + ev = ev.touches[0]; + } + var percentage = (ev[this.mousePos] - this.offset[this.stylePos])*100/this.size; + percentage = Math.round(percentage/this.percentage[2])*this.percentage[2]; + return Math.max(0, Math.min(100, percentage)); + }, + _validateInputValue: function(val) { + if(typeof val === 'number') { + return val; + } else if(val instanceof Array) { + this._validateArray(val); + return val; + } else { + throw new Error( ErrorMsgs.formatInvalidInputErrorMsg(val) ); + } + }, + _validateArray: function(val) { + for(var i = 0; i < val.length; i++) { + var input = val[i]; + if (typeof input !== 'number') { throw new Error( ErrorMsgs.formatInvalidInputErrorMsg(input) ); } + } + }, + _setDataVal: function(val) { + var value = "value: '" + val + "'"; + this.element.setAttribute('data', value); + this.element.setAttribute('value', val); + }, + _trigger: function(evt, val) { + val = val || undefined; + + var callbackFnArray = this.eventToCallbackMap[evt]; + if(callbackFnArray && callbackFnArray.length) { + for(var i = 0; i < callbackFnArray.length; i++) { + var callbackFn = callbackFnArray[i]; + callbackFn(val); + } + } + + /* If JQuery exists, trigger JQuery events */ + if($) { + this._triggerJQueryEvent(evt, val); + } + }, + _triggerJQueryEvent: function(evt, val) { + var eventData = { + type: evt, + value: val + }; + this.$element.trigger(eventData); + this.$sliderElem.trigger(eventData); + }, + _unbindJQueryEventHandlers: function() { + this.$element.off(); + this.$sliderElem.off(); + }, + _setText: function(element, text) { + if(typeof element.innerText !== "undefined") { + element.innerText = text; + } else if(typeof element.textContent !== "undefined") { + element.textContent = text; + } + }, + _removeClass: function(element, classString) { + var classes = classString.split(" "); + var newClasses = element.className; + + for(var i = 0; i < classes.length; i++) { + var classTag = classes[i]; + var regex = new RegExp("(?:\\s|^)" + classTag + "(?:\\s|$)"); + newClasses = newClasses.replace(regex, " "); + } + + element.className = newClasses.trim(); + }, + _addClass: function(element, classString) { + var classes = classString.split(" "); + var newClasses = element.className; + + for(var i = 0; i < classes.length; i++) { + var classTag = classes[i]; + var regex = new RegExp("(?:\\s|^)" + classTag + "(?:\\s|$)"); + var ifClassExists = regex.test(newClasses); + + if(!ifClassExists) { + newClasses += " " + classTag; + } + } + + element.className = newClasses.trim(); + }, + _offset: function (obj) { + var ol = 0; + var ot = 0; + if (obj.offsetParent) { + do { + ol += obj.offsetLeft; + ot += obj.offsetTop; + } while (obj = obj.offsetParent); + } + return { + left: ol, + top: ot + }; + }, + _css: function(elementRef, styleName, value) { + elementRef.style[styleName] = value; + } + }; + + /********************************* + + Attach to global namespace + + *********************************/ + if($) { + var namespace = $.fn.slider ? 'bootstrapSlider' : 'slider'; + $.bridget(namespace, Slider); + } else { + window.Slider = Slider; + } + + + })( $ ); + +})( window.jQuery ); \ No newline at end of file diff --git a/theme/bootstrap/plugins/bootstrap-slider/slider.css b/theme/bootstrap/plugins/bootstrap-slider/slider.css new file mode 100644 index 0000000..a96db7f --- /dev/null +++ b/theme/bootstrap/plugins/bootstrap-slider/slider.css @@ -0,0 +1,169 @@ +/*! + * Slider for Bootstrap + * + * Copyright 2012 Stefan Petre + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + */ +.slider { + display: block; + vertical-align: middle; + position: relative; + +} +.slider.slider-horizontal { + width: 100%; + height: 20px; + margin-bottom: 20px; +} +.slider.slider-horizontal:last-of-type { + margin-bottom: 0; +} +.slider.slider-horizontal .slider-track { + height: 10px; + width: 100%; + margin-top: -5px; + top: 50%; + left: 0; +} +.slider.slider-horizontal .slider-selection { + height: 100%; + top: 0; + bottom: 0; +} +.slider.slider-horizontal .slider-handle { + margin-left: -10px; + margin-top: -5px; +} +.slider.slider-horizontal .slider-handle.triangle { + border-width: 0 10px 10px 10px; + width: 0; + height: 0; + border-bottom-color: #0480be; + margin-top: 0; +} +.slider.slider-vertical { + height: 230px; + width: 20px; + margin-right: 20px; + display: inline-block; +} +.slider.slider-vertical:last-of-type { + margin-right: 0; +} +.slider.slider-vertical .slider-track { + width: 10px; + height: 100%; + margin-left: -5px; + left: 50%; + top: 0; +} +.slider.slider-vertical .slider-selection { + width: 100%; + left: 0; + top: 0; + bottom: 0; +} +.slider.slider-vertical .slider-handle { + margin-left: -5px; + margin-top: -10px; +} +.slider.slider-vertical .slider-handle.triangle { + border-width: 10px 0 10px 10px; + width: 1px; + height: 1px; + border-left-color: #0480be; + margin-left: 0; +} +.slider input { + display: none; +} +.slider .tooltip-inner { + white-space: nowrap; +} +.slider-track { + position: absolute; + cursor: pointer; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f0f0f0, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f0f0f0), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f0f0f0, #f9f9f9); + background-image: -o-linear-gradient(top, #f0f0f0, #f9f9f9); + background-image: linear-gradient(to bottom, #f0f0f0, #f9f9f9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0f0f0', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.slider-selection { + position: absolute; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f9f9f9, #f5f5f5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f9f9f9), to(#f5f5f5)); + background-image: -webkit-linear-gradient(top, #f9f9f9, #f5f5f5); + background-image: -o-linear-gradient(top, #f9f9f9, #f5f5f5); + background-image: linear-gradient(to bottom, #f9f9f9, #f5f5f5); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff9f9f9', endColorstr='#fff5f5f5', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.slider-handle { + position: absolute; + width: 20px; + height: 20px; + background-color: #444; + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + opacity: 1; + border: 0px solid transparent; +} +.slider-handle.round { + -webkit-border-radius: 20px; + -moz-border-radius: 20px; + border-radius: 20px; +} +.slider-handle.triangle { + background: transparent none; +} + +.slider-disabled .slider-selection { + opacity: 0.5; +} + +#red .slider-selection { + background: #f56954; +} + +#blue .slider-selection { + background: #3c8dbc; +} + +#green .slider-selection { + background: #00a65a; +} + +#yellow .slider-selection { + background: #f39c12; +} + +#aqua .slider-selection { + background: #00c0ef; +} + +#purple .slider-selection { + background: #932ab6; +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.js b/theme/bootstrap/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.js new file mode 100644 index 0000000..acccf91 --- /dev/null +++ b/theme/bootstrap/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.js @@ -0,0 +1,14975 @@ +// TODO: in future try to replace most inline compability checks with polyfills for code readability + +// element.textContent polyfill. +// Unsupporting browsers: IE8 + +if (Object.defineProperty && Object.getOwnPropertyDescriptor && Object.getOwnPropertyDescriptor(Element.prototype, "textContent") && !Object.getOwnPropertyDescriptor(Element.prototype, "textContent").get) { + (function() { + var innerText = Object.getOwnPropertyDescriptor(Element.prototype, "innerText"); + Object.defineProperty(Element.prototype, "textContent", + { + get: function() { + return innerText.get.call(this); + }, + set: function(s) { + return innerText.set.call(this, s); + } + } + ); + })(); +} + +// isArray polyfill for ie8 +if(!Array.isArray) { + Array.isArray = function(arg) { + return Object.prototype.toString.call(arg) === '[object Array]'; + }; +};/** + * @license wysihtml5x v0.4.15 + * https://github.com/Edicy/wysihtml5 + * + * Author: Christopher Blum (https://github.com/tiff) + * Secondary author of extended features: Oliver Pulges (https://github.com/pulges) + * + * Copyright (C) 2012 XING AG + * Licensed under the MIT license (MIT) + * + */ +var wysihtml5 = { + version: "0.4.15", + + // namespaces + commands: {}, + dom: {}, + quirks: {}, + toolbar: {}, + lang: {}, + selection: {}, + views: {}, + + INVISIBLE_SPACE: "\uFEFF", + + EMPTY_FUNCTION: function() {}, + + ELEMENT_NODE: 1, + TEXT_NODE: 3, + + BACKSPACE_KEY: 8, + ENTER_KEY: 13, + ESCAPE_KEY: 27, + SPACE_KEY: 32, + DELETE_KEY: 46 +}; +;/** + * Rangy, a cross-browser JavaScript range and selection library + * http://code.google.com/p/rangy/ + * + * Copyright 2014, Tim Down + * Licensed under the MIT license. + * Version: 1.3alpha.20140804 + * Build date: 4 August 2014 + */ + +(function(factory, global) { + if (typeof define == "function" && define.amd) { + // AMD. Register as an anonymous module. + define(factory); +/* + TODO: look into this properly. + + } else if (typeof exports == "object") { + // Node/CommonJS style for Browserify + module.exports = factory; +*/ + } else { + // No AMD or CommonJS support so we place Rangy in a global variable + global.rangy = factory(); + } +})(function() { + + var OBJECT = "object", FUNCTION = "function", UNDEFINED = "undefined"; + + // Minimal set of properties required for DOM Level 2 Range compliance. Comparison constants such as START_TO_START + // are omitted because ranges in KHTML do not have them but otherwise work perfectly well. See issue 113. + var domRangeProperties = ["startContainer", "startOffset", "endContainer", "endOffset", "collapsed", + "commonAncestorContainer"]; + + // Minimal set of methods required for DOM Level 2 Range compliance + var domRangeMethods = ["setStart", "setStartBefore", "setStartAfter", "setEnd", "setEndBefore", + "setEndAfter", "collapse", "selectNode", "selectNodeContents", "compareBoundaryPoints", "deleteContents", + "extractContents", "cloneContents", "insertNode", "surroundContents", "cloneRange", "toString", "detach"]; + + var textRangeProperties = ["boundingHeight", "boundingLeft", "boundingTop", "boundingWidth", "htmlText", "text"]; + + // Subset of TextRange's full set of methods that we're interested in + var textRangeMethods = ["collapse", "compareEndPoints", "duplicate", "moveToElementText", "parentElement", "select", + "setEndPoint", "getBoundingClientRect"]; + + /*----------------------------------------------------------------------------------------------------------------*/ + + // Trio of functions taken from Peter Michaux's article: + // http://peter.michaux.ca/articles/feature-detection-state-of-the-art-browser-scripting + function isHostMethod(o, p) { + var t = typeof o[p]; + return t == FUNCTION || (!!(t == OBJECT && o[p])) || t == "unknown"; + } + + function isHostObject(o, p) { + return !!(typeof o[p] == OBJECT && o[p]); + } + + function isHostProperty(o, p) { + return typeof o[p] != UNDEFINED; + } + + // Creates a convenience function to save verbose repeated calls to tests functions + function createMultiplePropertyTest(testFunc) { + return function(o, props) { + var i = props.length; + while (i--) { + if (!testFunc(o, props[i])) { + return false; + } + } + return true; + }; + } + + // Next trio of functions are a convenience to save verbose repeated calls to previous two functions + var areHostMethods = createMultiplePropertyTest(isHostMethod); + var areHostObjects = createMultiplePropertyTest(isHostObject); + var areHostProperties = createMultiplePropertyTest(isHostProperty); + + function isTextRange(range) { + return range && areHostMethods(range, textRangeMethods) && areHostProperties(range, textRangeProperties); + } + + function getBody(doc) { + return isHostObject(doc, "body") ? doc.body : doc.getElementsByTagName("body")[0]; + } + + var modules = {}; + + var api = { + version: "1.3alpha.20140804", + initialized: false, + supported: true, + + util: { + isHostMethod: isHostMethod, + isHostObject: isHostObject, + isHostProperty: isHostProperty, + areHostMethods: areHostMethods, + areHostObjects: areHostObjects, + areHostProperties: areHostProperties, + isTextRange: isTextRange, + getBody: getBody + }, + + features: {}, + + modules: modules, + config: { + alertOnFail: true, + alertOnWarn: false, + preferTextRange: false, + autoInitialize: (typeof rangyAutoInitialize == UNDEFINED) ? true : rangyAutoInitialize + } + }; + + function consoleLog(msg) { + if (isHostObject(window, "console") && isHostMethod(window.console, "log")) { + window.console.log(msg); + } + } + + function alertOrLog(msg, shouldAlert) { + if (shouldAlert) { + window.alert(msg); + } else { + consoleLog(msg); + } + } + + function fail(reason) { + api.initialized = true; + api.supported = false; + alertOrLog("Rangy is not supported on this page in your browser. Reason: " + reason, api.config.alertOnFail); + } + + api.fail = fail; + + function warn(msg) { + alertOrLog("Rangy warning: " + msg, api.config.alertOnWarn); + } + + api.warn = warn; + + // Add utility extend() method + if ({}.hasOwnProperty) { + api.util.extend = function(obj, props, deep) { + var o, p; + for (var i in props) { + if (props.hasOwnProperty(i)) { + o = obj[i]; + p = props[i]; + if (deep && o !== null && typeof o == "object" && p !== null && typeof p == "object") { + api.util.extend(o, p, true); + } + obj[i] = p; + } + } + // Special case for toString, which does not show up in for...in loops in IE <= 8 + if (props.hasOwnProperty("toString")) { + obj.toString = props.toString; + } + return obj; + }; + } else { + fail("hasOwnProperty not supported"); + } + + // Test whether Array.prototype.slice can be relied on for NodeLists and use an alternative toArray() if not + (function() { + var el = document.createElement("div"); + el.appendChild(document.createElement("span")); + var slice = [].slice; + var toArray; + try { + if (slice.call(el.childNodes, 0)[0].nodeType == 1) { + toArray = function(arrayLike) { + return slice.call(arrayLike, 0); + }; + } + } catch (e) {} + + if (!toArray) { + toArray = function(arrayLike) { + var arr = []; + for (var i = 0, len = arrayLike.length; i < len; ++i) { + arr[i] = arrayLike[i]; + } + return arr; + }; + } + + api.util.toArray = toArray; + })(); + + + // Very simple event handler wrapper function that doesn't attempt to solve issues such as "this" handling or + // normalization of event properties + var addListener; + if (isHostMethod(document, "addEventListener")) { + addListener = function(obj, eventType, listener) { + obj.addEventListener(eventType, listener, false); + }; + } else if (isHostMethod(document, "attachEvent")) { + addListener = function(obj, eventType, listener) { + obj.attachEvent("on" + eventType, listener); + }; + } else { + fail("Document does not have required addEventListener or attachEvent method"); + } + + api.util.addListener = addListener; + + var initListeners = []; + + function getErrorDesc(ex) { + return ex.message || ex.description || String(ex); + } + + // Initialization + function init() { + if (api.initialized) { + return; + } + var testRange; + var implementsDomRange = false, implementsTextRange = false; + + // First, perform basic feature tests + + if (isHostMethod(document, "createRange")) { + testRange = document.createRange(); + if (areHostMethods(testRange, domRangeMethods) && areHostProperties(testRange, domRangeProperties)) { + implementsDomRange = true; + } + } + + var body = getBody(document); + if (!body || body.nodeName.toLowerCase() != "body") { + fail("No body element found"); + return; + } + + if (body && isHostMethod(body, "createTextRange")) { + testRange = body.createTextRange(); + if (isTextRange(testRange)) { + implementsTextRange = true; + } + } + + if (!implementsDomRange && !implementsTextRange) { + fail("Neither Range nor TextRange are available"); + return; + } + + api.initialized = true; + api.features = { + implementsDomRange: implementsDomRange, + implementsTextRange: implementsTextRange + }; + + // Initialize modules + var module, errorMessage; + for (var moduleName in modules) { + if ( (module = modules[moduleName]) instanceof Module ) { + module.init(module, api); + } + } + + // Call init listeners + for (var i = 0, len = initListeners.length; i < len; ++i) { + try { + initListeners[i](api); + } catch (ex) { + errorMessage = "Rangy init listener threw an exception. Continuing. Detail: " + getErrorDesc(ex); + consoleLog(errorMessage); + } + } + } + + // Allow external scripts to initialize this library in case it's loaded after the document has loaded + api.init = init; + + // Execute listener immediately if already initialized + api.addInitListener = function(listener) { + if (api.initialized) { + listener(api); + } else { + initListeners.push(listener); + } + }; + + var shimListeners = []; + + api.addShimListener = function(listener) { + shimListeners.push(listener); + }; + + function shim(win) { + win = win || window; + init(); + + // Notify listeners + for (var i = 0, len = shimListeners.length; i < len; ++i) { + shimListeners[i](win); + } + } + + api.shim = api.createMissingNativeApi = shim; + + function Module(name, dependencies, initializer) { + this.name = name; + this.dependencies = dependencies; + this.initialized = false; + this.supported = false; + this.initializer = initializer; + } + + Module.prototype = { + init: function() { + var requiredModuleNames = this.dependencies || []; + for (var i = 0, len = requiredModuleNames.length, requiredModule, moduleName; i < len; ++i) { + moduleName = requiredModuleNames[i]; + + requiredModule = modules[moduleName]; + if (!requiredModule || !(requiredModule instanceof Module)) { + throw new Error("required module '" + moduleName + "' not found"); + } + + requiredModule.init(); + + if (!requiredModule.supported) { + throw new Error("required module '" + moduleName + "' not supported"); + } + } + + // Now run initializer + this.initializer(this); + }, + + fail: function(reason) { + this.initialized = true; + this.supported = false; + throw new Error("Module '" + this.name + "' failed to load: " + reason); + }, + + warn: function(msg) { + api.warn("Module " + this.name + ": " + msg); + }, + + deprecationNotice: function(deprecated, replacement) { + api.warn("DEPRECATED: " + deprecated + " in module " + this.name + "is deprecated. Please use " + + replacement + " instead"); + }, + + createError: function(msg) { + return new Error("Error in Rangy " + this.name + " module: " + msg); + } + }; + + function createModule(isCore, name, dependencies, initFunc) { + var newModule = new Module(name, dependencies, function(module) { + if (!module.initialized) { + module.initialized = true; + try { + initFunc(api, module); + module.supported = true; + } catch (ex) { + var errorMessage = "Module '" + name + "' failed to load: " + getErrorDesc(ex); + consoleLog(errorMessage); + } + } + }); + modules[name] = newModule; + } + + api.createModule = function(name) { + // Allow 2 or 3 arguments (second argument is an optional array of dependencies) + var initFunc, dependencies; + if (arguments.length == 2) { + initFunc = arguments[1]; + dependencies = []; + } else { + initFunc = arguments[2]; + dependencies = arguments[1]; + } + + var module = createModule(false, name, dependencies, initFunc); + + // Initialize the module immediately if the core is already initialized + if (api.initialized) { + module.init(); + } + }; + + api.createCoreModule = function(name, dependencies, initFunc) { + createModule(true, name, dependencies, initFunc); + }; + + /*----------------------------------------------------------------------------------------------------------------*/ + + // Ensure rangy.rangePrototype and rangy.selectionPrototype are available immediately + + function RangePrototype() {} + api.RangePrototype = RangePrototype; + api.rangePrototype = new RangePrototype(); + + function SelectionPrototype() {} + api.selectionPrototype = new SelectionPrototype(); + + /*----------------------------------------------------------------------------------------------------------------*/ + + // Wait for document to load before running tests + + var docReady = false; + + var loadHandler = function(e) { + if (!docReady) { + docReady = true; + if (!api.initialized && api.config.autoInitialize) { + init(); + } + } + }; + + // Test whether we have window and document objects that we will need + if (typeof window == UNDEFINED) { + fail("No window found"); + return; + } + if (typeof document == UNDEFINED) { + fail("No document found"); + return; + } + + if (isHostMethod(document, "addEventListener")) { + document.addEventListener("DOMContentLoaded", loadHandler, false); + } + + // Add a fallback in case the DOMContentLoaded event isn't supported + addListener(window, "load", loadHandler); + + /*----------------------------------------------------------------------------------------------------------------*/ + + // DOM utility methods used by Rangy + api.createCoreModule("DomUtil", [], function(api, module) { + var UNDEF = "undefined"; + var util = api.util; + + // Perform feature tests + if (!util.areHostMethods(document, ["createDocumentFragment", "createElement", "createTextNode"])) { + module.fail("document missing a Node creation method"); + } + + if (!util.isHostMethod(document, "getElementsByTagName")) { + module.fail("document missing getElementsByTagName method"); + } + + var el = document.createElement("div"); + if (!util.areHostMethods(el, ["insertBefore", "appendChild", "cloneNode"] || + !util.areHostObjects(el, ["previousSibling", "nextSibling", "childNodes", "parentNode"]))) { + module.fail("Incomplete Element implementation"); + } + + // innerHTML is required for Range's createContextualFragment method + if (!util.isHostProperty(el, "innerHTML")) { + module.fail("Element is missing innerHTML property"); + } + + var textNode = document.createTextNode("test"); + if (!util.areHostMethods(textNode, ["splitText", "deleteData", "insertData", "appendData", "cloneNode"] || + !util.areHostObjects(el, ["previousSibling", "nextSibling", "childNodes", "parentNode"]) || + !util.areHostProperties(textNode, ["data"]))) { + module.fail("Incomplete Text Node implementation"); + } + + /*----------------------------------------------------------------------------------------------------------------*/ + + // Removed use of indexOf because of a bizarre bug in Opera that is thrown in one of the Acid3 tests. I haven't been + // able to replicate it outside of the test. The bug is that indexOf returns -1 when called on an Array that + // contains just the document as a single element and the value searched for is the document. + var arrayContains = /*Array.prototype.indexOf ? + function(arr, val) { + return arr.indexOf(val) > -1; + }:*/ + + function(arr, val) { + var i = arr.length; + while (i--) { + if (arr[i] === val) { + return true; + } + } + return false; + }; + + // Opera 11 puts HTML elements in the null namespace, it seems, and IE 7 has undefined namespaceURI + function isHtmlNamespace(node) { + var ns; + return typeof node.namespaceURI == UNDEF || ((ns = node.namespaceURI) === null || ns == "http://www.w3.org/1999/xhtml"); + } + + function parentElement(node) { + var parent = node.parentNode; + return (parent.nodeType == 1) ? parent : null; + } + + function getNodeIndex(node) { + var i = 0; + while( (node = node.previousSibling) ) { + ++i; + } + return i; + } + + function getNodeLength(node) { + switch (node.nodeType) { + case 7: + case 10: + return 0; + case 3: + case 8: + return node.length; + default: + return node.childNodes.length; + } + } + + function getCommonAncestor(node1, node2) { + var ancestors = [], n; + for (n = node1; n; n = n.parentNode) { + ancestors.push(n); + } + + for (n = node2; n; n = n.parentNode) { + if (arrayContains(ancestors, n)) { + return n; + } + } + + return null; + } + + function isAncestorOf(ancestor, descendant, selfIsAncestor) { + var n = selfIsAncestor ? descendant : descendant.parentNode; + while (n) { + if (n === ancestor) { + return true; + } else { + n = n.parentNode; + } + } + return false; + } + + function isOrIsAncestorOf(ancestor, descendant) { + return isAncestorOf(ancestor, descendant, true); + } + + function getClosestAncestorIn(node, ancestor, selfIsAncestor) { + var p, n = selfIsAncestor ? node : node.parentNode; + while (n) { + p = n.parentNode; + if (p === ancestor) { + return n; + } + n = p; + } + return null; + } + + function isCharacterDataNode(node) { + var t = node.nodeType; + return t == 3 || t == 4 || t == 8 ; // Text, CDataSection or Comment + } + + function isTextOrCommentNode(node) { + if (!node) { + return false; + } + var t = node.nodeType; + return t == 3 || t == 8 ; // Text or Comment + } + + function insertAfter(node, precedingNode) { + var nextNode = precedingNode.nextSibling, parent = precedingNode.parentNode; + if (nextNode) { + parent.insertBefore(node, nextNode); + } else { + parent.appendChild(node); + } + return node; + } + + // Note that we cannot use splitText() because it is bugridden in IE 9. + function splitDataNode(node, index, positionsToPreserve) { + var newNode = node.cloneNode(false); + newNode.deleteData(0, index); + node.deleteData(index, node.length - index); + insertAfter(newNode, node); + + // Preserve positions + if (positionsToPreserve) { + for (var i = 0, position; position = positionsToPreserve[i++]; ) { + // Handle case where position was inside the portion of node after the split point + if (position.node == node && position.offset > index) { + position.node = newNode; + position.offset -= index; + } + // Handle the case where the position is a node offset within node's parent + else if (position.node == node.parentNode && position.offset > getNodeIndex(node)) { + ++position.offset; + } + } + } + return newNode; + } + + function getDocument(node) { + if (node.nodeType == 9) { + return node; + } else if (typeof node.ownerDocument != UNDEF) { + return node.ownerDocument; + } else if (typeof node.document != UNDEF) { + return node.document; + } else if (node.parentNode) { + return getDocument(node.parentNode); + } else { + throw module.createError("getDocument: no document found for node"); + } + } + + function getWindow(node) { + var doc = getDocument(node); + if (typeof doc.defaultView != UNDEF) { + return doc.defaultView; + } else if (typeof doc.parentWindow != UNDEF) { + return doc.parentWindow; + } else { + throw module.createError("Cannot get a window object for node"); + } + } + + function getIframeDocument(iframeEl) { + if (typeof iframeEl.contentDocument != UNDEF) { + return iframeEl.contentDocument; + } else if (typeof iframeEl.contentWindow != UNDEF) { + return iframeEl.contentWindow.document; + } else { + throw module.createError("getIframeDocument: No Document object found for iframe element"); + } + } + + function getIframeWindow(iframeEl) { + if (typeof iframeEl.contentWindow != UNDEF) { + return iframeEl.contentWindow; + } else if (typeof iframeEl.contentDocument != UNDEF) { + return iframeEl.contentDocument.defaultView; + } else { + throw module.createError("getIframeWindow: No Window object found for iframe element"); + } + } + + // This looks bad. Is it worth it? + function isWindow(obj) { + return obj && util.isHostMethod(obj, "setTimeout") && util.isHostObject(obj, "document"); + } + + function getContentDocument(obj, module, methodName) { + var doc; + + if (!obj) { + doc = document; + } + + // Test if a DOM node has been passed and obtain a document object for it if so + else if (util.isHostProperty(obj, "nodeType")) { + doc = (obj.nodeType == 1 && obj.tagName.toLowerCase() == "iframe") ? + getIframeDocument(obj) : getDocument(obj); + } + + // Test if the doc parameter appears to be a Window object + else if (isWindow(obj)) { + doc = obj.document; + } + + if (!doc) { + throw module.createError(methodName + "(): Parameter must be a Window object or DOM node"); + } + + return doc; + } + + function getRootContainer(node) { + var parent; + while ( (parent = node.parentNode) ) { + node = parent; + } + return node; + } + + function comparePoints(nodeA, offsetA, nodeB, offsetB) { + // See http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Comparing + var nodeC, root, childA, childB, n; + if (nodeA == nodeB) { + // Case 1: nodes are the same + return offsetA === offsetB ? 0 : (offsetA < offsetB) ? -1 : 1; + } else if ( (nodeC = getClosestAncestorIn(nodeB, nodeA, true)) ) { + // Case 2: node C (container B or an ancestor) is a child node of A + return offsetA <= getNodeIndex(nodeC) ? -1 : 1; + } else if ( (nodeC = getClosestAncestorIn(nodeA, nodeB, true)) ) { + // Case 3: node C (container A or an ancestor) is a child node of B + return getNodeIndex(nodeC) < offsetB ? -1 : 1; + } else { + root = getCommonAncestor(nodeA, nodeB); + if (!root) { + throw new Error("comparePoints error: nodes have no common ancestor"); + } + + // Case 4: containers are siblings or descendants of siblings + childA = (nodeA === root) ? root : getClosestAncestorIn(nodeA, root, true); + childB = (nodeB === root) ? root : getClosestAncestorIn(nodeB, root, true); + + if (childA === childB) { + // This shouldn't be possible + throw module.createError("comparePoints got to case 4 and childA and childB are the same!"); + } else { + n = root.firstChild; + while (n) { + if (n === childA) { + return -1; + } else if (n === childB) { + return 1; + } + n = n.nextSibling; + } + } + } + } + + /*----------------------------------------------------------------------------------------------------------------*/ + + // Test for IE's crash (IE 6/7) or exception (IE >= 8) when a reference to garbage-collected text node is queried + var crashyTextNodes = false; + + function isBrokenNode(node) { + var n; + try { + n = node.parentNode; + return false; + } catch (e) { + return true; + } + } + + (function() { + var el = document.createElement("b"); + el.innerHTML = "1"; + var textNode = el.firstChild; + el.innerHTML = "<br>"; + crashyTextNodes = isBrokenNode(textNode); + + api.features.crashyTextNodes = crashyTextNodes; + })(); + + /*----------------------------------------------------------------------------------------------------------------*/ + + function inspectNode(node) { + if (!node) { + return "[No node]"; + } + if (crashyTextNodes && isBrokenNode(node)) { + return "[Broken node]"; + } + if (isCharacterDataNode(node)) { + return '"' + node.data + '"'; + } + if (node.nodeType == 1) { + var idAttr = node.id ? ' id="' + node.id + '"' : ""; + return "<" + node.nodeName + idAttr + ">[index:" + getNodeIndex(node) + ",length:" + node.childNodes.length + "][" + (node.innerHTML || "[innerHTML not supported]").slice(0, 25) + "]"; + } + return node.nodeName; + } + + function fragmentFromNodeChildren(node) { + var fragment = getDocument(node).createDocumentFragment(), child; + while ( (child = node.firstChild) ) { + fragment.appendChild(child); + } + return fragment; + } + + var getComputedStyleProperty; + if (typeof window.getComputedStyle != UNDEF) { + getComputedStyleProperty = function(el, propName) { + return getWindow(el).getComputedStyle(el, null)[propName]; + }; + } else if (typeof document.documentElement.currentStyle != UNDEF) { + getComputedStyleProperty = function(el, propName) { + return el.currentStyle[propName]; + }; + } else { + module.fail("No means of obtaining computed style properties found"); + } + + function NodeIterator(root) { + this.root = root; + this._next = root; + } + + NodeIterator.prototype = { + _current: null, + + hasNext: function() { + return !!this._next; + }, + + next: function() { + var n = this._current = this._next; + var child, next; + if (this._current) { + child = n.firstChild; + if (child) { + this._next = child; + } else { + next = null; + while ((n !== this.root) && !(next = n.nextSibling)) { + n = n.parentNode; + } + this._next = next; + } + } + return this._current; + }, + + detach: function() { + this._current = this._next = this.root = null; + } + }; + + function createIterator(root) { + return new NodeIterator(root); + } + + function DomPosition(node, offset) { + this.node = node; + this.offset = offset; + } + + DomPosition.prototype = { + equals: function(pos) { + return !!pos && this.node === pos.node && this.offset == pos.offset; + }, + + inspect: function() { + return "[DomPosition(" + inspectNode(this.node) + ":" + this.offset + ")]"; + }, + + toString: function() { + return this.inspect(); + } + }; + + function DOMException(codeName) { + this.code = this[codeName]; + this.codeName = codeName; + this.message = "DOMException: " + this.codeName; + } + + DOMException.prototype = { + INDEX_SIZE_ERR: 1, + HIERARCHY_REQUEST_ERR: 3, + WRONG_DOCUMENT_ERR: 4, + NO_MODIFICATION_ALLOWED_ERR: 7, + NOT_FOUND_ERR: 8, + NOT_SUPPORTED_ERR: 9, + INVALID_STATE_ERR: 11, + INVALID_NODE_TYPE_ERR: 24 + }; + + DOMException.prototype.toString = function() { + return this.message; + }; + + api.dom = { + arrayContains: arrayContains, + isHtmlNamespace: isHtmlNamespace, + parentElement: parentElement, + getNodeIndex: getNodeIndex, + getNodeLength: getNodeLength, + getCommonAncestor: getCommonAncestor, + isAncestorOf: isAncestorOf, + isOrIsAncestorOf: isOrIsAncestorOf, + getClosestAncestorIn: getClosestAncestorIn, + isCharacterDataNode: isCharacterDataNode, + isTextOrCommentNode: isTextOrCommentNode, + insertAfter: insertAfter, + splitDataNode: splitDataNode, + getDocument: getDocument, + getWindow: getWindow, + getIframeWindow: getIframeWindow, + getIframeDocument: getIframeDocument, + getBody: util.getBody, + isWindow: isWindow, + getContentDocument: getContentDocument, + getRootContainer: getRootContainer, + comparePoints: comparePoints, + isBrokenNode: isBrokenNode, + inspectNode: inspectNode, + getComputedStyleProperty: getComputedStyleProperty, + fragmentFromNodeChildren: fragmentFromNodeChildren, + createIterator: createIterator, + DomPosition: DomPosition + }; + + api.DOMException = DOMException; + }); + + /*----------------------------------------------------------------------------------------------------------------*/ + + // Pure JavaScript implementation of DOM Range + api.createCoreModule("DomRange", ["DomUtil"], function(api, module) { + var dom = api.dom; + var util = api.util; + var DomPosition = dom.DomPosition; + var DOMException = api.DOMException; + + var isCharacterDataNode = dom.isCharacterDataNode; + var getNodeIndex = dom.getNodeIndex; + var isOrIsAncestorOf = dom.isOrIsAncestorOf; + var getDocument = dom.getDocument; + var comparePoints = dom.comparePoints; + var splitDataNode = dom.splitDataNode; + var getClosestAncestorIn = dom.getClosestAncestorIn; + var getNodeLength = dom.getNodeLength; + var arrayContains = dom.arrayContains; + var getRootContainer = dom.getRootContainer; + var crashyTextNodes = api.features.crashyTextNodes; + + /*----------------------------------------------------------------------------------------------------------------*/ + + // Utility functions + + function isNonTextPartiallySelected(node, range) { + return (node.nodeType != 3) && + (isOrIsAncestorOf(node, range.startContainer) || isOrIsAncestorOf(node, range.endContainer)); + } + + function getRangeDocument(range) { + return range.document || getDocument(range.startContainer); + } + + function getBoundaryBeforeNode(node) { + return new DomPosition(node.parentNode, getNodeIndex(node)); + } + + function getBoundaryAfterNode(node) { + return new DomPosition(node.parentNode, getNodeIndex(node) + 1); + } + + function insertNodeAtPosition(node, n, o) { + var firstNodeInserted = node.nodeType == 11 ? node.firstChild : node; + if (isCharacterDataNode(n)) { + if (o == n.length) { + dom.insertAfter(node, n); + } else { + n.parentNode.insertBefore(node, o == 0 ? n : splitDataNode(n, o)); + } + } else if (o >= n.childNodes.length) { + n.appendChild(node); + } else { + n.insertBefore(node, n.childNodes[o]); + } + return firstNodeInserted; + } + + function rangesIntersect(rangeA, rangeB, touchingIsIntersecting) { + assertRangeValid(rangeA); + assertRangeValid(rangeB); + + if (getRangeDocument(rangeB) != getRangeDocument(rangeA)) { + throw new DOMException("WRONG_DOCUMENT_ERR"); + } + + var startComparison = comparePoints(rangeA.startContainer, rangeA.startOffset, rangeB.endContainer, rangeB.endOffset), + endComparison = comparePoints(rangeA.endContainer, rangeA.endOffset, rangeB.startContainer, rangeB.startOffset); + + return touchingIsIntersecting ? startComparison <= 0 && endComparison >= 0 : startComparison < 0 && endComparison > 0; + } + + function cloneSubtree(iterator) { + var partiallySelected; + for (var node, frag = getRangeDocument(iterator.range).createDocumentFragment(), subIterator; node = iterator.next(); ) { + partiallySelected = iterator.isPartiallySelectedSubtree(); + node = node.cloneNode(!partiallySelected); + if (partiallySelected) { + subIterator = iterator.getSubtreeIterator(); + node.appendChild(cloneSubtree(subIterator)); + subIterator.detach(); + } + + if (node.nodeType == 10) { // DocumentType + throw new DOMException("HIERARCHY_REQUEST_ERR"); + } + frag.appendChild(node); + } + return frag; + } + + function iterateSubtree(rangeIterator, func, iteratorState) { + var it, n; + iteratorState = iteratorState || { stop: false }; + for (var node, subRangeIterator; node = rangeIterator.next(); ) { + if (rangeIterator.isPartiallySelectedSubtree()) { + if (func(node) === false) { + iteratorState.stop = true; + return; + } else { + // The node is partially selected by the Range, so we can use a new RangeIterator on the portion of + // the node selected by the Range. + subRangeIterator = rangeIterator.getSubtreeIterator(); + iterateSubtree(subRangeIterator, func, iteratorState); + subRangeIterator.detach(); + if (iteratorState.stop) { + return; + } + } + } else { + // The whole node is selected, so we can use efficient DOM iteration to iterate over the node and its + // descendants + it = dom.createIterator(node); + while ( (n = it.next()) ) { + if (func(n) === false) { + iteratorState.stop = true; + return; + } + } + } + } + } + + function deleteSubtree(iterator) { + var subIterator; + while (iterator.next()) { + if (iterator.isPartiallySelectedSubtree()) { + subIterator = iterator.getSubtreeIterator(); + deleteSubtree(subIterator); + subIterator.detach(); + } else { + iterator.remove(); + } + } + } + + function extractSubtree(iterator) { + for (var node, frag = getRangeDocument(iterator.range).createDocumentFragment(), subIterator; node = iterator.next(); ) { + + if (iterator.isPartiallySelectedSubtree()) { + node = node.cloneNode(false); + subIterator = iterator.getSubtreeIterator(); + node.appendChild(extractSubtree(subIterator)); + subIterator.detach(); + } else { + iterator.remove(); + } + if (node.nodeType == 10) { // DocumentType + throw new DOMException("HIERARCHY_REQUEST_ERR"); + } + frag.appendChild(node); + } + return frag; + } + + function getNodesInRange(range, nodeTypes, filter) { + var filterNodeTypes = !!(nodeTypes && nodeTypes.length), regex; + var filterExists = !!filter; + if (filterNodeTypes) { + regex = new RegExp("^(" + nodeTypes.join("|") + ")$"); + } + + var nodes = []; + iterateSubtree(new RangeIterator(range, false), function(node) { + if (filterNodeTypes && !regex.test(node.nodeType)) { + return; + } + if (filterExists && !filter(node)) { + return; + } + // Don't include a boundary container if it is a character data node and the range does not contain any + // of its character data. See issue 190. + var sc = range.startContainer; + if (node == sc && isCharacterDataNode(sc) && range.startOffset == sc.length) { + return; + } + + var ec = range.endContainer; + if (node == ec && isCharacterDataNode(ec) && range.endOffset == 0) { + return; + } + + nodes.push(node); + }); + return nodes; + } + + function inspect(range) { + var name = (typeof range.getName == "undefined") ? "Range" : range.getName(); + return "[" + name + "(" + dom.inspectNode(range.startContainer) + ":" + range.startOffset + ", " + + dom.inspectNode(range.endContainer) + ":" + range.endOffset + ")]"; + } + + /*----------------------------------------------------------------------------------------------------------------*/ + + // RangeIterator code partially borrows from IERange by Tim Ryan (http://github.com/timcameronryan/IERange) + + function RangeIterator(range, clonePartiallySelectedTextNodes) { + this.range = range; + this.clonePartiallySelectedTextNodes = clonePartiallySelectedTextNodes; + + + if (!range.collapsed) { + this.sc = range.startContainer; + this.so = range.startOffset; + this.ec = range.endContainer; + this.eo = range.endOffset; + var root = range.commonAncestorContainer; + + if (this.sc === this.ec && isCharacterDataNode(this.sc)) { + this.isSingleCharacterDataNode = true; + this._first = this._last = this._next = this.sc; + } else { + this._first = this._next = (this.sc === root && !isCharacterDataNode(this.sc)) ? + this.sc.childNodes[this.so] : getClosestAncestorIn(this.sc, root, true); + this._last = (this.ec === root && !isCharacterDataNode(this.ec)) ? + this.ec.childNodes[this.eo - 1] : getClosestAncestorIn(this.ec, root, true); + } + } + } + + RangeIterator.prototype = { + _current: null, + _next: null, + _first: null, + _last: null, + isSingleCharacterDataNode: false, + + reset: function() { + this._current = null; + this._next = this._first; + }, + + hasNext: function() { + return !!this._next; + }, + + next: function() { + // Move to next node + var current = this._current = this._next; + if (current) { + this._next = (current !== this._last) ? current.nextSibling : null; + + // Check for partially selected text nodes + if (isCharacterDataNode(current) && this.clonePartiallySelectedTextNodes) { + if (current === this.ec) { + (current = current.cloneNode(true)).deleteData(this.eo, current.length - this.eo); + } + if (this._current === this.sc) { + (current = current.cloneNode(true)).deleteData(0, this.so); + } + } + } + + return current; + }, + + remove: function() { + var current = this._current, start, end; + + if (isCharacterDataNode(current) && (current === this.sc || current === this.ec)) { + start = (current === this.sc) ? this.so : 0; + end = (current === this.ec) ? this.eo : current.length; + if (start != end) { + current.deleteData(start, end - start); + } + } else { + if (current.parentNode) { + current.parentNode.removeChild(current); + } else { + } + } + }, + + // Checks if the current node is partially selected + isPartiallySelectedSubtree: function() { + var current = this._current; + return isNonTextPartiallySelected(current, this.range); + }, + + getSubtreeIterator: function() { + var subRange; + if (this.isSingleCharacterDataNode) { + subRange = this.range.cloneRange(); + subRange.collapse(false); + } else { + subRange = new Range(getRangeDocument(this.range)); + var current = this._current; + var startContainer = current, startOffset = 0, endContainer = current, endOffset = getNodeLength(current); + + if (isOrIsAncestorOf(current, this.sc)) { + startContainer = this.sc; + startOffset = this.so; + } + if (isOrIsAncestorOf(current, this.ec)) { + endContainer = this.ec; + endOffset = this.eo; + } + + updateBoundaries(subRange, startContainer, startOffset, endContainer, endOffset); + } + return new RangeIterator(subRange, this.clonePartiallySelectedTextNodes); + }, + + detach: function() { + this.range = this._current = this._next = this._first = this._last = this.sc = this.so = this.ec = this.eo = null; + } + }; + + /*----------------------------------------------------------------------------------------------------------------*/ + + var beforeAfterNodeTypes = [1, 3, 4, 5, 7, 8, 10]; + var rootContainerNodeTypes = [2, 9, 11]; + var readonlyNodeTypes = [5, 6, 10, 12]; + var insertableNodeTypes = [1, 3, 4, 5, 7, 8, 10, 11]; + var surroundNodeTypes = [1, 3, 4, 5, 7, 8]; + + function createAncestorFinder(nodeTypes) { + return function(node, selfIsAncestor) { + var t, n = selfIsAncestor ? node : node.parentNode; + while (n) { + t = n.nodeType; + if (arrayContains(nodeTypes, t)) { + return n; + } + n = n.parentNode; + } + return null; + }; + } + + var getDocumentOrFragmentContainer = createAncestorFinder( [9, 11] ); + var getReadonlyAncestor = createAncestorFinder(readonlyNodeTypes); + var getDocTypeNotationEntityAncestor = createAncestorFinder( [6, 10, 12] ); + + function assertNoDocTypeNotationEntityAncestor(node, allowSelf) { + if (getDocTypeNotationEntityAncestor(node, allowSelf)) { + throw new DOMException("INVALID_NODE_TYPE_ERR"); + } + } + + function assertValidNodeType(node, invalidTypes) { + if (!arrayContains(invalidTypes, node.nodeType)) { + throw new DOMException("INVALID_NODE_TYPE_ERR"); + } + } + + function assertValidOffset(node, offset) { + if (offset < 0 || offset > (isCharacterDataNode(node) ? node.length : node.childNodes.length)) { + throw new DOMException("INDEX_SIZE_ERR"); + } + } + + function assertSameDocumentOrFragment(node1, node2) { + if (getDocumentOrFragmentContainer(node1, true) !== getDocumentOrFragmentContainer(node2, true)) { + throw new DOMException("WRONG_DOCUMENT_ERR"); + } + } + + function assertNodeNotReadOnly(node) { + if (getReadonlyAncestor(node, true)) { + throw new DOMException("NO_MODIFICATION_ALLOWED_ERR"); + } + } + + function assertNode(node, codeName) { + if (!node) { + throw new DOMException(codeName); + } + } + + function isOrphan(node) { + return (crashyTextNodes && dom.isBrokenNode(node)) || + !arrayContains(rootContainerNodeTypes, node.nodeType) && !getDocumentOrFragmentContainer(node, true); + } + + function isValidOffset(node, offset) { + return offset <= (isCharacterDataNode(node) ? node.length : node.childNodes.length); + } + + function isRangeValid(range) { + return (!!range.startContainer && !!range.endContainer && + !isOrphan(range.startContainer) && + !isOrphan(range.endContainer) && + isValidOffset(range.startContainer, range.startOffset) && + isValidOffset(range.endContainer, range.endOffset)); + } + + function assertRangeValid(range) { + if (!isRangeValid(range)) { + throw new Error("Range error: Range is no longer valid after DOM mutation (" + range.inspect() + ")"); + } + } + + /*----------------------------------------------------------------------------------------------------------------*/ + + // Test the browser's innerHTML support to decide how to implement createContextualFragment + var styleEl = document.createElement("style"); + var htmlParsingConforms = false; + try { + styleEl.innerHTML = "<b>x</b>"; + htmlParsingConforms = (styleEl.firstChild.nodeType == 3); // Opera incorrectly creates an element node + } catch (e) { + // IE 6 and 7 throw + } + + api.features.htmlParsingConforms = htmlParsingConforms; + + var createContextualFragment = htmlParsingConforms ? + + // Implementation as per HTML parsing spec, trusting in the browser's implementation of innerHTML. See + // discussion and base code for this implementation at issue 67. + // Spec: http://html5.org/specs/dom-parsing.html#extensions-to-the-range-interface + // Thanks to Aleks Williams. + function(fragmentStr) { + // "Let node the context object's start's node." + var node = this.startContainer; + var doc = getDocument(node); + + // "If the context object's start's node is null, raise an INVALID_STATE_ERR + // exception and abort these steps." + if (!node) { + throw new DOMException("INVALID_STATE_ERR"); + } + + // "Let element be as follows, depending on node's interface:" + // Document, Document Fragment: null + var el = null; + + // "Element: node" + if (node.nodeType == 1) { + el = node; + + // "Text, Comment: node's parentElement" + } else if (isCharacterDataNode(node)) { + el = dom.parentElement(node); + } + + // "If either element is null or element's ownerDocument is an HTML document + // and element's local name is "html" and element's namespace is the HTML + // namespace" + if (el === null || ( + el.nodeName == "HTML" && + dom.isHtmlNamespace(getDocument(el).documentElement) && + dom.isHtmlNamespace(el) + )) { + + // "let element be a new Element with "body" as its local name and the HTML + // namespace as its namespace."" + el = doc.createElement("body"); + } else { + el = el.cloneNode(false); + } + + // "If the node's document is an HTML document: Invoke the HTML fragment parsing algorithm." + // "If the node's document is an XML document: Invoke the XML fragment parsing algorithm." + // "In either case, the algorithm must be invoked with fragment as the input + // and element as the context element." + el.innerHTML = fragmentStr; + + // "If this raises an exception, then abort these steps. Otherwise, let new + // children be the nodes returned." + + // "Let fragment be a new DocumentFragment." + // "Append all new children to fragment." + // "Return fragment." + return dom.fragmentFromNodeChildren(el); + } : + + // In this case, innerHTML cannot be trusted, so fall back to a simpler, non-conformant implementation that + // previous versions of Rangy used (with the exception of using a body element rather than a div) + function(fragmentStr) { + var doc = getRangeDocument(this); + var el = doc.createElement("body"); + el.innerHTML = fragmentStr; + + return dom.fragmentFromNodeChildren(el); + }; + + function splitRangeBoundaries(range, positionsToPreserve) { + assertRangeValid(range); + + var sc = range.startContainer, so = range.startOffset, ec = range.endContainer, eo = range.endOffset; + var startEndSame = (sc === ec); + + if (isCharacterDataNode(ec) && eo > 0 && eo < ec.length) { + splitDataNode(ec, eo, positionsToPreserve); + } + + if (isCharacterDataNode(sc) && so > 0 && so < sc.length) { + sc = splitDataNode(sc, so, positionsToPreserve); + if (startEndSame) { + eo -= so; + ec = sc; + } else if (ec == sc.parentNode && eo >= getNodeIndex(sc)) { + eo++; + } + so = 0; + } + range.setStartAndEnd(sc, so, ec, eo); + } + + function rangeToHtml(range) { + assertRangeValid(range); + var container = range.commonAncestorContainer.parentNode.cloneNode(false); + container.appendChild( range.cloneContents() ); + return container.innerHTML; + } + + /*----------------------------------------------------------------------------------------------------------------*/ + + var rangeProperties = ["startContainer", "startOffset", "endContainer", "endOffset", "collapsed", + "commonAncestorContainer"]; + + var s2s = 0, s2e = 1, e2e = 2, e2s = 3; + var n_b = 0, n_a = 1, n_b_a = 2, n_i = 3; + + util.extend(api.rangePrototype, { + compareBoundaryPoints: function(how, range) { + assertRangeValid(this); + assertSameDocumentOrFragment(this.startContainer, range.startContainer); + + var nodeA, offsetA, nodeB, offsetB; + var prefixA = (how == e2s || how == s2s) ? "start" : "end"; + var prefixB = (how == s2e || how == s2s) ? "start" : "end"; + nodeA = this[prefixA + "Container"]; + offsetA = this[prefixA + "Offset"]; + nodeB = range[prefixB + "Container"]; + offsetB = range[prefixB + "Offset"]; + return comparePoints(nodeA, offsetA, nodeB, offsetB); + }, + + insertNode: function(node) { + assertRangeValid(this); + assertValidNodeType(node, insertableNodeTypes); + assertNodeNotReadOnly(this.startContainer); + + if (isOrIsAncestorOf(node, this.startContainer)) { + throw new DOMException("HIERARCHY_REQUEST_ERR"); + } + + // No check for whether the container of the start of the Range is of a type that does not allow + // children of the type of node: the browser's DOM implementation should do this for us when we attempt + // to add the node + + var firstNodeInserted = insertNodeAtPosition(node, this.startContainer, this.startOffset); + this.setStartBefore(firstNodeInserted); + }, + + cloneContents: function() { + assertRangeValid(this); + + var clone, frag; + if (this.collapsed) { + return getRangeDocument(this).createDocumentFragment(); + } else { + if (this.startContainer === this.endContainer && isCharacterDataNode(this.startContainer)) { + clone = this.startContainer.cloneNode(true); + clone.data = clone.data.slice(this.startOffset, this.endOffset); + frag = getRangeDocument(this).createDocumentFragment(); + frag.appendChild(clone); + return frag; + } else { + var iterator = new RangeIterator(this, true); + clone = cloneSubtree(iterator); + iterator.detach(); + } + return clone; + } + }, + + canSurroundContents: function() { + assertRangeValid(this); + assertNodeNotReadOnly(this.startContainer); + assertNodeNotReadOnly(this.endContainer); + + // Check if the contents can be surrounded. Specifically, this means whether the range partially selects + // no non-text nodes. + var iterator = new RangeIterator(this, true); + var boundariesInvalid = (iterator._first && (isNonTextPartiallySelected(iterator._first, this)) || + (iterator._last && isNonTextPartiallySelected(iterator._last, this))); + iterator.detach(); + return !boundariesInvalid; + }, + + surroundContents: function(node) { + assertValidNodeType(node, surroundNodeTypes); + + if (!this.canSurroundContents()) { + throw new DOMException("INVALID_STATE_ERR"); + } + + // Extract the contents + var content = this.extractContents(); + + // Clear the children of the node + if (node.hasChildNodes()) { + while (node.lastChild) { + node.removeChild(node.lastChild); + } + } + + // Insert the new node and add the extracted contents + insertNodeAtPosition(node, this.startContainer, this.startOffset); + node.appendChild(content); + + this.selectNode(node); + }, + + cloneRange: function() { + assertRangeValid(this); + var range = new Range(getRangeDocument(this)); + var i = rangeProperties.length, prop; + while (i--) { + prop = rangeProperties[i]; + range[prop] = this[prop]; + } + return range; + }, + + toString: function() { + assertRangeValid(this); + var sc = this.startContainer; + if (sc === this.endContainer && isCharacterDataNode(sc)) { + return (sc.nodeType == 3 || sc.nodeType == 4) ? sc.data.slice(this.startOffset, this.endOffset) : ""; + } else { + var textParts = [], iterator = new RangeIterator(this, true); + iterateSubtree(iterator, function(node) { + // Accept only text or CDATA nodes, not comments + if (node.nodeType == 3 || node.nodeType == 4) { + textParts.push(node.data); + } + }); + iterator.detach(); + return textParts.join(""); + } + }, + + // The methods below are all non-standard. The following batch were introduced by Mozilla but have since + // been removed from Mozilla. + + compareNode: function(node) { + assertRangeValid(this); + + var parent = node.parentNode; + var nodeIndex = getNodeIndex(node); + + if (!parent) { + throw new DOMException("NOT_FOUND_ERR"); + } + + var startComparison = this.comparePoint(parent, nodeIndex), + endComparison = this.comparePoint(parent, nodeIndex + 1); + + if (startComparison < 0) { // Node starts before + return (endComparison > 0) ? n_b_a : n_b; + } else { + return (endComparison > 0) ? n_a : n_i; + } + }, + + comparePoint: function(node, offset) { + assertRangeValid(this); + assertNode(node, "HIERARCHY_REQUEST_ERR"); + assertSameDocumentOrFragment(node, this.startContainer); + + if (comparePoints(node, offset, this.startContainer, this.startOffset) < 0) { + return -1; + } else if (comparePoints(node, offset, this.endContainer, this.endOffset) > 0) { + return 1; + } + return 0; + }, + + createContextualFragment: createContextualFragment, + + toHtml: function() { + return rangeToHtml(this); + }, + + // touchingIsIntersecting determines whether this method considers a node that borders a range intersects + // with it (as in WebKit) or not (as in Gecko pre-1.9, and the default) + intersectsNode: function(node, touchingIsIntersecting) { + assertRangeValid(this); + assertNode(node, "NOT_FOUND_ERR"); + if (getDocument(node) !== getRangeDocument(this)) { + return false; + } + + var parent = node.parentNode, offset = getNodeIndex(node); + assertNode(parent, "NOT_FOUND_ERR"); + + var startComparison = comparePoints(parent, offset, this.endContainer, this.endOffset), + endComparison = comparePoints(parent, offset + 1, this.startContainer, this.startOffset); + + return touchingIsIntersecting ? startComparison <= 0 && endComparison >= 0 : startComparison < 0 && endComparison > 0; + }, + + isPointInRange: function(node, offset) { + assertRangeValid(this); + assertNode(node, "HIERARCHY_REQUEST_ERR"); + assertSameDocumentOrFragment(node, this.startContainer); + + return (comparePoints(node, offset, this.startContainer, this.startOffset) >= 0) && + (comparePoints(node, offset, this.endContainer, this.endOffset) <= 0); + }, + + // The methods below are non-standard and invented by me. + + // Sharing a boundary start-to-end or end-to-start does not count as intersection. + intersectsRange: function(range) { + return rangesIntersect(this, range, false); + }, + + // Sharing a boundary start-to-end or end-to-start does count as intersection. + intersectsOrTouchesRange: function(range) { + return rangesIntersect(this, range, true); + }, + + intersection: function(range) { + if (this.intersectsRange(range)) { + var startComparison = comparePoints(this.startContainer, this.startOffset, range.startContainer, range.startOffset), + endComparison = comparePoints(this.endContainer, this.endOffset, range.endContainer, range.endOffset); + + var intersectionRange = this.cloneRange(); + if (startComparison == -1) { + intersectionRange.setStart(range.startContainer, range.startOffset); + } + if (endComparison == 1) { + intersectionRange.setEnd(range.endContainer, range.endOffset); + } + return intersectionRange; + } + return null; + }, + + union: function(range) { + if (this.intersectsOrTouchesRange(range)) { + var unionRange = this.cloneRange(); + if (comparePoints(range.startContainer, range.startOffset, this.startContainer, this.startOffset) == -1) { + unionRange.setStart(range.startContainer, range.startOffset); + } + if (comparePoints(range.endContainer, range.endOffset, this.endContainer, this.endOffset) == 1) { + unionRange.setEnd(range.endContainer, range.endOffset); + } + return unionRange; + } else { + throw new DOMException("Ranges do not intersect"); + } + }, + + containsNode: function(node, allowPartial) { + if (allowPartial) { + return this.intersectsNode(node, false); + } else { + return this.compareNode(node) == n_i; + } + }, + + containsNodeContents: function(node) { + return this.comparePoint(node, 0) >= 0 && this.comparePoint(node, getNodeLength(node)) <= 0; + }, + + containsRange: function(range) { + var intersection = this.intersection(range); + return intersection !== null && range.equals(intersection); + }, + + containsNodeText: function(node) { + var nodeRange = this.cloneRange(); + nodeRange.selectNode(node); + var textNodes = nodeRange.getNodes([3]); + if (textNodes.length > 0) { + nodeRange.setStart(textNodes[0], 0); + var lastTextNode = textNodes.pop(); + nodeRange.setEnd(lastTextNode, lastTextNode.length); + return this.containsRange(nodeRange); + } else { + return this.containsNodeContents(node); + } + }, + + getNodes: function(nodeTypes, filter) { + assertRangeValid(this); + return getNodesInRange(this, nodeTypes, filter); + }, + + getDocument: function() { + return getRangeDocument(this); + }, + + collapseBefore: function(node) { + this.setEndBefore(node); + this.collapse(false); + }, + + collapseAfter: function(node) { + this.setStartAfter(node); + this.collapse(true); + }, + + getBookmark: function(containerNode) { + var doc = getRangeDocument(this); + var preSelectionRange = api.createRange(doc); + containerNode = containerNode || dom.getBody(doc); + preSelectionRange.selectNodeContents(containerNode); + var range = this.intersection(preSelectionRange); + var start = 0, end = 0; + if (range) { + preSelectionRange.setEnd(range.startContainer, range.startOffset); + start = preSelectionRange.toString().length; + end = start + range.toString().length; + } + + return { + start: start, + end: end, + containerNode: containerNode + }; + }, + + moveToBookmark: function(bookmark) { + var containerNode = bookmark.containerNode; + var charIndex = 0; + this.setStart(containerNode, 0); + this.collapse(true); + var nodeStack = [containerNode], node, foundStart = false, stop = false; + var nextCharIndex, i, childNodes; + + while (!stop && (node = nodeStack.pop())) { + if (node.nodeType == 3) { + nextCharIndex = charIndex + node.length; + if (!foundStart && bookmark.start >= charIndex && bookmark.start <= nextCharIndex) { + this.setStart(node, bookmark.start - charIndex); + foundStart = true; + } + if (foundStart && bookmark.end >= charIndex && bookmark.end <= nextCharIndex) { + this.setEnd(node, bookmark.end - charIndex); + stop = true; + } + charIndex = nextCharIndex; + } else { + childNodes = node.childNodes; + i = childNodes.length; + while (i--) { + nodeStack.push(childNodes[i]); + } + } + } + }, + + getName: function() { + return "DomRange"; + }, + + equals: function(range) { + return Range.rangesEqual(this, range); + }, + + isValid: function() { + return isRangeValid(this); + }, + + inspect: function() { + return inspect(this); + }, + + detach: function() { + // In DOM4, detach() is now a no-op. + } + }); + + function copyComparisonConstantsToObject(obj) { + obj.START_TO_START = s2s; + obj.START_TO_END = s2e; + obj.END_TO_END = e2e; + obj.END_TO_START = e2s; + + obj.NODE_BEFORE = n_b; + obj.NODE_AFTER = n_a; + obj.NODE_BEFORE_AND_AFTER = n_b_a; + obj.NODE_INSIDE = n_i; + } + + function copyComparisonConstants(constructor) { + copyComparisonConstantsToObject(constructor); + copyComparisonConstantsToObject(constructor.prototype); + } + + function createRangeContentRemover(remover, boundaryUpdater) { + return function() { + assertRangeValid(this); + + var sc = this.startContainer, so = this.startOffset, root = this.commonAncestorContainer; + + var iterator = new RangeIterator(this, true); + + // Work out where to position the range after content removal + var node, boundary; + if (sc !== root) { + node = getClosestAncestorIn(sc, root, true); + boundary = getBoundaryAfterNode(node); + sc = boundary.node; + so = boundary.offset; + } + + // Check none of the range is read-only + iterateSubtree(iterator, assertNodeNotReadOnly); + + iterator.reset(); + + // Remove the content + var returnValue = remover(iterator); + iterator.detach(); + + // Move to the new position + boundaryUpdater(this, sc, so, sc, so); + + return returnValue; + }; + } + + function createPrototypeRange(constructor, boundaryUpdater) { + function createBeforeAfterNodeSetter(isBefore, isStart) { + return function(node) { + assertValidNodeType(node, beforeAfterNodeTypes); + assertValidNodeType(getRootContainer(node), rootContainerNodeTypes); + + var boundary = (isBefore ? getBoundaryBeforeNode : getBoundaryAfterNode)(node); + (isStart ? setRangeStart : setRangeEnd)(this, boundary.node, boundary.offset); + }; + } + + function setRangeStart(range, node, offset) { + var ec = range.endContainer, eo = range.endOffset; + if (node !== range.startContainer || offset !== range.startOffset) { + // Check the root containers of the range and the new boundary, and also check whether the new boundary + // is after the current end. In either case, collapse the range to the new position + if (getRootContainer(node) != getRootContainer(ec) || comparePoints(node, offset, ec, eo) == 1) { + ec = node; + eo = offset; + } + boundaryUpdater(range, node, offset, ec, eo); + } + } + + function setRangeEnd(range, node, offset) { + var sc = range.startContainer, so = range.startOffset; + if (node !== range.endContainer || offset !== range.endOffset) { + // Check the root containers of the range and the new boundary, and also check whether the new boundary + // is after the current end. In either case, collapse the range to the new position + if (getRootContainer(node) != getRootContainer(sc) || comparePoints(node, offset, sc, so) == -1) { + sc = node; + so = offset; + } + boundaryUpdater(range, sc, so, node, offset); + } + } + + // Set up inheritance + var F = function() {}; + F.prototype = api.rangePrototype; + constructor.prototype = new F(); + + util.extend(constructor.prototype, { + setStart: function(node, offset) { + assertNoDocTypeNotationEntityAncestor(node, true); + assertValidOffset(node, offset); + + setRangeStart(this, node, offset); + }, + + setEnd: function(node, offset) { + assertNoDocTypeNotationEntityAncestor(node, true); + assertValidOffset(node, offset); + + setRangeEnd(this, node, offset); + }, + + /** + * Convenience method to set a range's start and end boundaries. Overloaded as follows: + * - Two parameters (node, offset) creates a collapsed range at that position + * - Three parameters (node, startOffset, endOffset) creates a range contained with node starting at + * startOffset and ending at endOffset + * - Four parameters (startNode, startOffset, endNode, endOffset) creates a range starting at startOffset in + * startNode and ending at endOffset in endNode + */ + setStartAndEnd: function() { + var args = arguments; + var sc = args[0], so = args[1], ec = sc, eo = so; + + switch (args.length) { + case 3: + eo = args[2]; + break; + case 4: + ec = args[2]; + eo = args[3]; + break; + } + + boundaryUpdater(this, sc, so, ec, eo); + }, + + setBoundary: function(node, offset, isStart) { + this["set" + (isStart ? "Start" : "End")](node, offset); + }, + + setStartBefore: createBeforeAfterNodeSetter(true, true), + setStartAfter: createBeforeAfterNodeSetter(false, true), + setEndBefore: createBeforeAfterNodeSetter(true, false), + setEndAfter: createBeforeAfterNodeSetter(false, false), + + collapse: function(isStart) { + assertRangeValid(this); + if (isStart) { + boundaryUpdater(this, this.startContainer, this.startOffset, this.startContainer, this.startOffset); + } else { + boundaryUpdater(this, this.endContainer, this.endOffset, this.endContainer, this.endOffset); + } + }, + + selectNodeContents: function(node) { + assertNoDocTypeNotationEntityAncestor(node, true); + + boundaryUpdater(this, node, 0, node, getNodeLength(node)); + }, + + selectNode: function(node) { + assertNoDocTypeNotationEntityAncestor(node, false); + assertValidNodeType(node, beforeAfterNodeTypes); + + var start = getBoundaryBeforeNode(node), end = getBoundaryAfterNode(node); + boundaryUpdater(this, start.node, start.offset, end.node, end.offset); + }, + + extractContents: createRangeContentRemover(extractSubtree, boundaryUpdater), + + deleteContents: createRangeContentRemover(deleteSubtree, boundaryUpdater), + + canSurroundContents: function() { + assertRangeValid(this); + assertNodeNotReadOnly(this.startContainer); + assertNodeNotReadOnly(this.endContainer); + + // Check if the contents can be surrounded. Specifically, this means whether the range partially selects + // no non-text nodes. + var iterator = new RangeIterator(this, true); + var boundariesInvalid = (iterator._first && isNonTextPartiallySelected(iterator._first, this) || + (iterator._last && isNonTextPartiallySelected(iterator._last, this))); + iterator.detach(); + return !boundariesInvalid; + }, + + splitBoundaries: function() { + splitRangeBoundaries(this); + }, + + splitBoundariesPreservingPositions: function(positionsToPreserve) { + splitRangeBoundaries(this, positionsToPreserve); + }, + + normalizeBoundaries: function() { + assertRangeValid(this); + + var sc = this.startContainer, so = this.startOffset, ec = this.endContainer, eo = this.endOffset; + + var mergeForward = function(node) { + var sibling = node.nextSibling; + if (sibling && sibling.nodeType == node.nodeType) { + ec = node; + eo = node.length; + node.appendData(sibling.data); + sibling.parentNode.removeChild(sibling); + } + }; + + var mergeBackward = function(node) { + var sibling = node.previousSibling; + if (sibling && sibling.nodeType == node.nodeType) { + sc = node; + var nodeLength = node.length; + so = sibling.length; + node.insertData(0, sibling.data); + sibling.parentNode.removeChild(sibling); + if (sc == ec) { + eo += so; + ec = sc; + } else if (ec == node.parentNode) { + var nodeIndex = getNodeIndex(node); + if (eo == nodeIndex) { + ec = node; + eo = nodeLength; + } else if (eo > nodeIndex) { + eo--; + } + } + } + }; + + var normalizeStart = true; + + if (isCharacterDataNode(ec)) { + if (ec.length == eo) { + mergeForward(ec); + } + } else { + if (eo > 0) { + var endNode = ec.childNodes[eo - 1]; + if (endNode && isCharacterDataNode(endNode)) { + mergeForward(endNode); + } + } + normalizeStart = !this.collapsed; + } + + if (normalizeStart) { + if (isCharacterDataNode(sc)) { + if (so == 0) { + mergeBackward(sc); + } + } else { + if (so < sc.childNodes.length) { + var startNode = sc.childNodes[so]; + if (startNode && isCharacterDataNode(startNode)) { + mergeBackward(startNode); + } + } + } + } else { + sc = ec; + so = eo; + } + + boundaryUpdater(this, sc, so, ec, eo); + }, + + collapseToPoint: function(node, offset) { + assertNoDocTypeNotationEntityAncestor(node, true); + assertValidOffset(node, offset); + this.setStartAndEnd(node, offset); + } + }); + + copyComparisonConstants(constructor); + } + + /*----------------------------------------------------------------------------------------------------------------*/ + + // Updates commonAncestorContainer and collapsed after boundary change + function updateCollapsedAndCommonAncestor(range) { + range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset); + range.commonAncestorContainer = range.collapsed ? + range.startContainer : dom.getCommonAncestor(range.startContainer, range.endContainer); + } + + function updateBoundaries(range, startContainer, startOffset, endContainer, endOffset) { + range.startContainer = startContainer; + range.startOffset = startOffset; + range.endContainer = endContainer; + range.endOffset = endOffset; + range.document = dom.getDocument(startContainer); + + updateCollapsedAndCommonAncestor(range); + } + + function Range(doc) { + this.startContainer = doc; + this.startOffset = 0; + this.endContainer = doc; + this.endOffset = 0; + this.document = doc; + updateCollapsedAndCommonAncestor(this); + } + + createPrototypeRange(Range, updateBoundaries); + + util.extend(Range, { + rangeProperties: rangeProperties, + RangeIterator: RangeIterator, + copyComparisonConstants: copyComparisonConstants, + createPrototypeRange: createPrototypeRange, + inspect: inspect, + toHtml: rangeToHtml, + getRangeDocument: getRangeDocument, + rangesEqual: function(r1, r2) { + return r1.startContainer === r2.startContainer && + r1.startOffset === r2.startOffset && + r1.endContainer === r2.endContainer && + r1.endOffset === r2.endOffset; + } + }); + + api.DomRange = Range; + }); + + /*----------------------------------------------------------------------------------------------------------------*/ + + // Wrappers for the browser's native DOM Range and/or TextRange implementation + api.createCoreModule("WrappedRange", ["DomRange"], function(api, module) { + var WrappedRange, WrappedTextRange; + var dom = api.dom; + var util = api.util; + var DomPosition = dom.DomPosition; + var DomRange = api.DomRange; + var getBody = dom.getBody; + var getContentDocument = dom.getContentDocument; + var isCharacterDataNode = dom.isCharacterDataNode; + + + /*----------------------------------------------------------------------------------------------------------------*/ + + if (api.features.implementsDomRange) { + // This is a wrapper around the browser's native DOM Range. It has two aims: + // - Provide workarounds for specific browser bugs + // - provide convenient extensions, which are inherited from Rangy's DomRange + + (function() { + var rangeProto; + var rangeProperties = DomRange.rangeProperties; + + function updateRangeProperties(range) { + var i = rangeProperties.length, prop; + while (i--) { + prop = rangeProperties[i]; + range[prop] = range.nativeRange[prop]; + } + // Fix for broken collapsed property in IE 9. + range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset); + } + + function updateNativeRange(range, startContainer, startOffset, endContainer, endOffset) { + var startMoved = (range.startContainer !== startContainer || range.startOffset != startOffset); + var endMoved = (range.endContainer !== endContainer || range.endOffset != endOffset); + var nativeRangeDifferent = !range.equals(range.nativeRange); + + // Always set both boundaries for the benefit of IE9 (see issue 35) + if (startMoved || endMoved || nativeRangeDifferent) { + range.setEnd(endContainer, endOffset); + range.setStart(startContainer, startOffset); + } + } + + var createBeforeAfterNodeSetter; + + WrappedRange = function(range) { + if (!range) { + throw module.createError("WrappedRange: Range must be specified"); + } + this.nativeRange = range; + updateRangeProperties(this); + }; + + DomRange.createPrototypeRange(WrappedRange, updateNativeRange); + + rangeProto = WrappedRange.prototype; + + rangeProto.selectNode = function(node) { + this.nativeRange.selectNode(node); + updateRangeProperties(this); + }; + + rangeProto.cloneContents = function() { + return this.nativeRange.cloneContents(); + }; + + // Due to a long-standing Firefox bug that I have not been able to find a reliable way to detect, + // insertNode() is never delegated to the native range. + + rangeProto.surroundContents = function(node) { + this.nativeRange.surroundContents(node); + updateRangeProperties(this); + }; + + rangeProto.collapse = function(isStart) { + this.nativeRange.collapse(isStart); + updateRangeProperties(this); + }; + + rangeProto.cloneRange = function() { + return new WrappedRange(this.nativeRange.cloneRange()); + }; + + rangeProto.refresh = function() { + updateRangeProperties(this); + }; + + rangeProto.toString = function() { + return this.nativeRange.toString(); + }; + + // Create test range and node for feature detection + + var testTextNode = document.createTextNode("test"); + getBody(document).appendChild(testTextNode); + var range = document.createRange(); + + /*--------------------------------------------------------------------------------------------------------*/ + + // Test for Firefox 2 bug that prevents moving the start of a Range to a point after its current end and + // correct for it + + range.setStart(testTextNode, 0); + range.setEnd(testTextNode, 0); + + try { + range.setStart(testTextNode, 1); + + rangeProto.setStart = function(node, offset) { + this.nativeRange.setStart(node, offset); + updateRangeProperties(this); + }; + + rangeProto.setEnd = function(node, offset) { + this.nativeRange.setEnd(node, offset); + updateRangeProperties(this); + }; + + createBeforeAfterNodeSetter = function(name) { + return function(node) { + this.nativeRange[name](node); + updateRangeProperties(this); + }; + }; + + } catch(ex) { + + rangeProto.setStart = function(node, offset) { + try { + this.nativeRange.setStart(node, offset); + } catch (ex) { + this.nativeRange.setEnd(node, offset); + this.nativeRange.setStart(node, offset); + } + updateRangeProperties(this); + }; + + rangeProto.setEnd = function(node, offset) { + try { + this.nativeRange.setEnd(node, offset); + } catch (ex) { + this.nativeRange.setStart(node, offset); + this.nativeRange.setEnd(node, offset); + } + updateRangeProperties(this); + }; + + createBeforeAfterNodeSetter = function(name, oppositeName) { + return function(node) { + try { + this.nativeRange[name](node); + } catch (ex) { + this.nativeRange[oppositeName](node); + this.nativeRange[name](node); + } + updateRangeProperties(this); + }; + }; + } + + rangeProto.setStartBefore = createBeforeAfterNodeSetter("setStartBefore", "setEndBefore"); + rangeProto.setStartAfter = createBeforeAfterNodeSetter("setStartAfter", "setEndAfter"); + rangeProto.setEndBefore = createBeforeAfterNodeSetter("setEndBefore", "setStartBefore"); + rangeProto.setEndAfter = createBeforeAfterNodeSetter("setEndAfter", "setStartAfter"); + + /*--------------------------------------------------------------------------------------------------------*/ + + // Always use DOM4-compliant selectNodeContents implementation: it's simpler and less code than testing + // whether the native implementation can be trusted + rangeProto.selectNodeContents = function(node) { + this.setStartAndEnd(node, 0, dom.getNodeLength(node)); + }; + + /*--------------------------------------------------------------------------------------------------------*/ + + // Test for and correct WebKit bug that has the behaviour of compareBoundaryPoints round the wrong way for + // constants START_TO_END and END_TO_START: https://bugs.webkit.org/show_bug.cgi?id=20738 + + range.selectNodeContents(testTextNode); + range.setEnd(testTextNode, 3); + + var range2 = document.createRange(); + range2.selectNodeContents(testTextNode); + range2.setEnd(testTextNode, 4); + range2.setStart(testTextNode, 2); + + if (range.compareBoundaryPoints(range.START_TO_END, range2) == -1 && + range.compareBoundaryPoints(range.END_TO_START, range2) == 1) { + // This is the wrong way round, so correct for it + + rangeProto.compareBoundaryPoints = function(type, range) { + range = range.nativeRange || range; + if (type == range.START_TO_END) { + type = range.END_TO_START; + } else if (type == range.END_TO_START) { + type = range.START_TO_END; + } + return this.nativeRange.compareBoundaryPoints(type, range); + }; + } else { + rangeProto.compareBoundaryPoints = function(type, range) { + return this.nativeRange.compareBoundaryPoints(type, range.nativeRange || range); + }; + } + + /*--------------------------------------------------------------------------------------------------------*/ + + // Test for IE 9 deleteContents() and extractContents() bug and correct it. See issue 107. + + var el = document.createElement("div"); + el.innerHTML = "123"; + var textNode = el.firstChild; + var body = getBody(document); + body.appendChild(el); + + range.setStart(textNode, 1); + range.setEnd(textNode, 2); + range.deleteContents(); + + if (textNode.data == "13") { + // Behaviour is correct per DOM4 Range so wrap the browser's implementation of deleteContents() and + // extractContents() + rangeProto.deleteContents = function() { + this.nativeRange.deleteContents(); + updateRangeProperties(this); + }; + + rangeProto.extractContents = function() { + var frag = this.nativeRange.extractContents(); + updateRangeProperties(this); + return frag; + }; + } else { + } + + body.removeChild(el); + body = null; + + /*--------------------------------------------------------------------------------------------------------*/ + + // Test for existence of createContextualFragment and delegate to it if it exists + if (util.isHostMethod(range, "createContextualFragment")) { + rangeProto.createContextualFragment = function(fragmentStr) { + return this.nativeRange.createContextualFragment(fragmentStr); + }; + } + + /*--------------------------------------------------------------------------------------------------------*/ + + // Clean up + getBody(document).removeChild(testTextNode); + + rangeProto.getName = function() { + return "WrappedRange"; + }; + + api.WrappedRange = WrappedRange; + + api.createNativeRange = function(doc) { + doc = getContentDocument(doc, module, "createNativeRange"); + return doc.createRange(); + }; + })(); + } + + if (api.features.implementsTextRange) { + /* + This is a workaround for a bug where IE returns the wrong container element from the TextRange's parentElement() + method. For example, in the following (where pipes denote the selection boundaries): + + <ul id="ul"><li id="a">| a </li><li id="b"> b |</li></ul> + + var range = document.selection.createRange(); + alert(range.parentElement().id); // Should alert "ul" but alerts "b" + + This method returns the common ancestor node of the following: + - the parentElement() of the textRange + - the parentElement() of the textRange after calling collapse(true) + - the parentElement() of the textRange after calling collapse(false) + */ + var getTextRangeContainerElement = function(textRange) { + var parentEl = textRange.parentElement(); + var range = textRange.duplicate(); + range.collapse(true); + var startEl = range.parentElement(); + range = textRange.duplicate(); + range.collapse(false); + var endEl = range.parentElement(); + var startEndContainer = (startEl == endEl) ? startEl : dom.getCommonAncestor(startEl, endEl); + + return startEndContainer == parentEl ? startEndContainer : dom.getCommonAncestor(parentEl, startEndContainer); + }; + + var textRangeIsCollapsed = function(textRange) { + return textRange.compareEndPoints("StartToEnd", textRange) == 0; + }; + + // Gets the boundary of a TextRange expressed as a node and an offset within that node. This function started + // out as an improved version of code found in Tim Cameron Ryan's IERange (http://code.google.com/p/ierange/) + // but has grown, fixing problems with line breaks in preformatted text, adding workaround for IE TextRange + // bugs, handling for inputs and images, plus optimizations. + var getTextRangeBoundaryPosition = function(textRange, wholeRangeContainerElement, isStart, isCollapsed, startInfo) { + var workingRange = textRange.duplicate(); + workingRange.collapse(isStart); + var containerElement = workingRange.parentElement(); + + // Sometimes collapsing a TextRange that's at the start of a text node can move it into the previous node, so + // check for that + if (!dom.isOrIsAncestorOf(wholeRangeContainerElement, containerElement)) { + containerElement = wholeRangeContainerElement; + } + + + // Deal with nodes that cannot "contain rich HTML markup". In practice, this means form inputs, images and + // similar. See http://msdn.microsoft.com/en-us/library/aa703950%28VS.85%29.aspx + if (!containerElement.canHaveHTML) { + var pos = new DomPosition(containerElement.parentNode, dom.getNodeIndex(containerElement)); + return { + boundaryPosition: pos, + nodeInfo: { + nodeIndex: pos.offset, + containerElement: pos.node + } + }; + } + + var workingNode = dom.getDocument(containerElement).createElement("span"); + + // Workaround for HTML5 Shiv's insane violation of document.createElement(). See Rangy issue 104 and HTML5 + // Shiv issue 64: https://github.com/aFarkas/html5shiv/issues/64 + if (workingNode.parentNode) { + workingNode.parentNode.removeChild(workingNode); + } + + var comparison, workingComparisonType = isStart ? "StartToStart" : "StartToEnd"; + var previousNode, nextNode, boundaryPosition, boundaryNode; + var start = (startInfo && startInfo.containerElement == containerElement) ? startInfo.nodeIndex : 0; + var childNodeCount = containerElement.childNodes.length; + var end = childNodeCount; + + // Check end first. Code within the loop assumes that the endth child node of the container is definitely + // after the range boundary. + var nodeIndex = end; + + while (true) { + if (nodeIndex == childNodeCount) { + containerElement.appendChild(workingNode); + } else { + containerElement.insertBefore(workingNode, containerElement.childNodes[nodeIndex]); + } + workingRange.moveToElementText(workingNode); + comparison = workingRange.compareEndPoints(workingComparisonType, textRange); + if (comparison == 0 || start == end) { + break; + } else if (comparison == -1) { + if (end == start + 1) { + // We know the endth child node is after the range boundary, so we must be done. + break; + } else { + start = nodeIndex; + } + } else { + end = (end == start + 1) ? start : nodeIndex; + } + nodeIndex = Math.floor((start + end) / 2); + containerElement.removeChild(workingNode); + } + + + // We've now reached or gone past the boundary of the text range we're interested in + // so have identified the node we want + boundaryNode = workingNode.nextSibling; + + if (comparison == -1 && boundaryNode && isCharacterDataNode(boundaryNode)) { + // This is a character data node (text, comment, cdata). The working range is collapsed at the start of + // the node containing the text range's boundary, so we move the end of the working range to the + // boundary point and measure the length of its text to get the boundary's offset within the node. + workingRange.setEndPoint(isStart ? "EndToStart" : "EndToEnd", textRange); + + var offset; + + if (/[\r\n]/.test(boundaryNode.data)) { + /* + For the particular case of a boundary within a text node containing rendered line breaks (within a + <pre> element, for example), we need a slightly complicated approach to get the boundary's offset in + IE. The facts: + + - Each line break is represented as \r in the text node's data/nodeValue properties + - Each line break is represented as \r\n in the TextRange's 'text' property + - The 'text' property of the TextRange does not contain trailing line breaks + + To get round the problem presented by the final fact above, we can use the fact that TextRange's + moveStart() and moveEnd() methods return the actual number of characters moved, which is not + necessarily the same as the number of characters it was instructed to move. The simplest approach is + to use this to store the characters moved when moving both the start and end of the range to the + start of the document body and subtracting the start offset from the end offset (the + "move-negative-gazillion" method). However, this is extremely slow when the document is large and + the range is near the end of it. Clearly doing the mirror image (i.e. moving the range boundaries to + the end of the document) has the same problem. + + Another approach that works is to use moveStart() to move the start boundary of the range up to the + end boundary one character at a time and incrementing a counter with the value returned by the + moveStart() call. However, the check for whether the start boundary has reached the end boundary is + expensive, so this method is slow (although unlike "move-negative-gazillion" is largely unaffected + by the location of the range within the document). + + The approach used below is a hybrid of the two methods above. It uses the fact that a string + containing the TextRange's 'text' property with each \r\n converted to a single \r character cannot + be longer than the text of the TextRange, so the start of the range is moved that length initially + and then a character at a time to make up for any trailing line breaks not contained in the 'text' + property. This has good performance in most situations compared to the previous two methods. + */ + var tempRange = workingRange.duplicate(); + var rangeLength = tempRange.text.replace(/\r\n/g, "\r").length; + + offset = tempRange.moveStart("character", rangeLength); + while ( (comparison = tempRange.compareEndPoints("StartToEnd", tempRange)) == -1) { + offset++; + tempRange.moveStart("character", 1); + } + } else { + offset = workingRange.text.length; + } + boundaryPosition = new DomPosition(boundaryNode, offset); + } else { + + // If the boundary immediately follows a character data node and this is the end boundary, we should favour + // a position within that, and likewise for a start boundary preceding a character data node + previousNode = (isCollapsed || !isStart) && workingNode.previousSibling; + nextNode = (isCollapsed || isStart) && workingNode.nextSibling; + if (nextNode && isCharacterDataNode(nextNode)) { + boundaryPosition = new DomPosition(nextNode, 0); + } else if (previousNode && isCharacterDataNode(previousNode)) { + boundaryPosition = new DomPosition(previousNode, previousNode.data.length); + } else { + boundaryPosition = new DomPosition(containerElement, dom.getNodeIndex(workingNode)); + } + } + + // Clean up + workingNode.parentNode.removeChild(workingNode); + + return { + boundaryPosition: boundaryPosition, + nodeInfo: { + nodeIndex: nodeIndex, + containerElement: containerElement + } + }; + }; + + // Returns a TextRange representing the boundary of a TextRange expressed as a node and an offset within that + // node. This function started out as an optimized version of code found in Tim Cameron Ryan's IERange + // (http://code.google.com/p/ierange/) + var createBoundaryTextRange = function(boundaryPosition, isStart) { + var boundaryNode, boundaryParent, boundaryOffset = boundaryPosition.offset; + var doc = dom.getDocument(boundaryPosition.node); + var workingNode, childNodes, workingRange = getBody(doc).createTextRange(); + var nodeIsDataNode = isCharacterDataNode(boundaryPosition.node); + + if (nodeIsDataNode) { + boundaryNode = boundaryPosition.node; + boundaryParent = boundaryNode.parentNode; + } else { + childNodes = boundaryPosition.node.childNodes; + boundaryNode = (boundaryOffset < childNodes.length) ? childNodes[boundaryOffset] : null; + boundaryParent = boundaryPosition.node; + } + + // Position the range immediately before the node containing the boundary + workingNode = doc.createElement("span"); + + // Making the working element non-empty element persuades IE to consider the TextRange boundary to be within + // the element rather than immediately before or after it + workingNode.innerHTML = "&#feff;"; + + // insertBefore is supposed to work like appendChild if the second parameter is null. However, a bug report + // for IERange suggests that it can crash the browser: http://code.google.com/p/ierange/issues/detail?id=12 + if (boundaryNode) { + boundaryParent.insertBefore(workingNode, boundaryNode); + } else { + boundaryParent.appendChild(workingNode); + } + + workingRange.moveToElementText(workingNode); + workingRange.collapse(!isStart); + + // Clean up + boundaryParent.removeChild(workingNode); + + // Move the working range to the text offset, if required + if (nodeIsDataNode) { + workingRange[isStart ? "moveStart" : "moveEnd"]("character", boundaryOffset); + } + + return workingRange; + }; + + /*------------------------------------------------------------------------------------------------------------*/ + + // This is a wrapper around a TextRange, providing full DOM Range functionality using rangy's DomRange as a + // prototype + + WrappedTextRange = function(textRange) { + this.textRange = textRange; + this.refresh(); + }; + + WrappedTextRange.prototype = new DomRange(document); + + WrappedTextRange.prototype.refresh = function() { + var start, end, startBoundary; + + // TextRange's parentElement() method cannot be trusted. getTextRangeContainerElement() works around that. + var rangeContainerElement = getTextRangeContainerElement(this.textRange); + + if (textRangeIsCollapsed(this.textRange)) { + end = start = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, true, + true).boundaryPosition; + } else { + startBoundary = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, true, false); + start = startBoundary.boundaryPosition; + + // An optimization used here is that if the start and end boundaries have the same parent element, the + // search scope for the end boundary can be limited to exclude the portion of the element that precedes + // the start boundary + end = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, false, false, + startBoundary.nodeInfo).boundaryPosition; + } + + this.setStart(start.node, start.offset); + this.setEnd(end.node, end.offset); + }; + + WrappedTextRange.prototype.getName = function() { + return "WrappedTextRange"; + }; + + DomRange.copyComparisonConstants(WrappedTextRange); + + var rangeToTextRange = function(range) { + if (range.collapsed) { + return createBoundaryTextRange(new DomPosition(range.startContainer, range.startOffset), true); + } else { + var startRange = createBoundaryTextRange(new DomPosition(range.startContainer, range.startOffset), true); + var endRange = createBoundaryTextRange(new DomPosition(range.endContainer, range.endOffset), false); + var textRange = getBody( DomRange.getRangeDocument(range) ).createTextRange(); + textRange.setEndPoint("StartToStart", startRange); + textRange.setEndPoint("EndToEnd", endRange); + return textRange; + } + }; + + WrappedTextRange.rangeToTextRange = rangeToTextRange; + + WrappedTextRange.prototype.toTextRange = function() { + return rangeToTextRange(this); + }; + + api.WrappedTextRange = WrappedTextRange; + + // IE 9 and above have both implementations and Rangy makes both available. The next few lines sets which + // implementation to use by default. + if (!api.features.implementsDomRange || api.config.preferTextRange) { + // Add WrappedTextRange as the Range property of the global object to allow expression like Range.END_TO_END to work + var globalObj = (function() { return this; })(); + if (typeof globalObj.Range == "undefined") { + globalObj.Range = WrappedTextRange; + } + + api.createNativeRange = function(doc) { + doc = getContentDocument(doc, module, "createNativeRange"); + return getBody(doc).createTextRange(); + }; + + api.WrappedRange = WrappedTextRange; + } + } + + api.createRange = function(doc) { + doc = getContentDocument(doc, module, "createRange"); + return new api.WrappedRange(api.createNativeRange(doc)); + }; + + api.createRangyRange = function(doc) { + doc = getContentDocument(doc, module, "createRangyRange"); + return new DomRange(doc); + }; + + api.createIframeRange = function(iframeEl) { + module.deprecationNotice("createIframeRange()", "createRange(iframeEl)"); + return api.createRange(iframeEl); + }; + + api.createIframeRangyRange = function(iframeEl) { + module.deprecationNotice("createIframeRangyRange()", "createRangyRange(iframeEl)"); + return api.createRangyRange(iframeEl); + }; + + api.addShimListener(function(win) { + var doc = win.document; + if (typeof doc.createRange == "undefined") { + doc.createRange = function() { + return api.createRange(doc); + }; + } + doc = win = null; + }); + }); + + /*----------------------------------------------------------------------------------------------------------------*/ + + // This module creates a selection object wrapper that conforms as closely as possible to the Selection specification + // in the HTML Editing spec (http://dvcs.w3.org/hg/editing/raw-file/tip/editing.html#selections) + api.createCoreModule("WrappedSelection", ["DomRange", "WrappedRange"], function(api, module) { + api.config.checkSelectionRanges = true; + + var BOOLEAN = "boolean"; + var NUMBER = "number"; + var dom = api.dom; + var util = api.util; + var isHostMethod = util.isHostMethod; + var DomRange = api.DomRange; + var WrappedRange = api.WrappedRange; + var DOMException = api.DOMException; + var DomPosition = dom.DomPosition; + var getNativeSelection; + var selectionIsCollapsed; + var features = api.features; + var CONTROL = "Control"; + var getDocument = dom.getDocument; + var getBody = dom.getBody; + var rangesEqual = DomRange.rangesEqual; + + + // Utility function to support direction parameters in the API that may be a string ("backward" or "forward") or a + // Boolean (true for backwards). + function isDirectionBackward(dir) { + return (typeof dir == "string") ? /^backward(s)?$/i.test(dir) : !!dir; + } + + function getWindow(win, methodName) { + if (!win) { + return window; + } else if (dom.isWindow(win)) { + return win; + } else if (win instanceof WrappedSelection) { + return win.win; + } else { + var doc = dom.getContentDocument(win, module, methodName); + return dom.getWindow(doc); + } + } + + function getWinSelection(winParam) { + return getWindow(winParam, "getWinSelection").getSelection(); + } + + function getDocSelection(winParam) { + return getWindow(winParam, "getDocSelection").document.selection; + } + + function winSelectionIsBackward(sel) { + var backward = false; + if (sel.anchorNode) { + backward = (dom.comparePoints(sel.anchorNode, sel.anchorOffset, sel.focusNode, sel.focusOffset) == 1); + } + return backward; + } + + // Test for the Range/TextRange and Selection features required + // Test for ability to retrieve selection + var implementsWinGetSelection = isHostMethod(window, "getSelection"), + implementsDocSelection = util.isHostObject(document, "selection"); + + features.implementsWinGetSelection = implementsWinGetSelection; + features.implementsDocSelection = implementsDocSelection; + + var useDocumentSelection = implementsDocSelection && (!implementsWinGetSelection || api.config.preferTextRange); + + if (useDocumentSelection) { + getNativeSelection = getDocSelection; + api.isSelectionValid = function(winParam) { + var doc = getWindow(winParam, "isSelectionValid").document, nativeSel = doc.selection; + + // Check whether the selection TextRange is actually contained within the correct document + return (nativeSel.type != "None" || getDocument(nativeSel.createRange().parentElement()) == doc); + }; + } else if (implementsWinGetSelection) { + getNativeSelection = getWinSelection; + api.isSelectionValid = function() { + return true; + }; + } else { + module.fail("Neither document.selection or window.getSelection() detected."); + } + + api.getNativeSelection = getNativeSelection; + + var testSelection = getNativeSelection(); + var testRange = api.createNativeRange(document); + var body = getBody(document); + + // Obtaining a range from a selection + var selectionHasAnchorAndFocus = util.areHostProperties(testSelection, + ["anchorNode", "focusNode", "anchorOffset", "focusOffset"]); + + features.selectionHasAnchorAndFocus = selectionHasAnchorAndFocus; + + // Test for existence of native selection extend() method + var selectionHasExtend = isHostMethod(testSelection, "extend"); + features.selectionHasExtend = selectionHasExtend; + + // Test if rangeCount exists + var selectionHasRangeCount = (typeof testSelection.rangeCount == NUMBER); + features.selectionHasRangeCount = selectionHasRangeCount; + + var selectionSupportsMultipleRanges = false; + var collapsedNonEditableSelectionsSupported = true; + + var addRangeBackwardToNative = selectionHasExtend ? + function(nativeSelection, range) { + var doc = DomRange.getRangeDocument(range); + var endRange = api.createRange(doc); + endRange.collapseToPoint(range.endContainer, range.endOffset); + nativeSelection.addRange(getNativeRange(endRange)); + nativeSelection.extend(range.startContainer, range.startOffset); + } : null; + + if (util.areHostMethods(testSelection, ["addRange", "getRangeAt", "removeAllRanges"]) && + typeof testSelection.rangeCount == NUMBER && features.implementsDomRange) { + + (function() { + // Previously an iframe was used but this caused problems in some circumstances in IE, so tests are + // performed on the current document's selection. See issue 109. + + // Note also that if a selection previously existed, it is wiped by these tests. This should usually be fine + // because initialization usually happens when the document loads, but could be a problem for a script that + // loads and initializes Rangy later. If anyone complains, code could be added to save and restore the + // selection. + var sel = window.getSelection(); + if (sel) { + // Store the current selection + var originalSelectionRangeCount = sel.rangeCount; + var selectionHasMultipleRanges = (originalSelectionRangeCount > 1); + var originalSelectionRanges = []; + var originalSelectionBackward = winSelectionIsBackward(sel); + for (var i = 0; i < originalSelectionRangeCount; ++i) { + originalSelectionRanges[i] = sel.getRangeAt(i); + } + + // Create some test elements + var body = getBody(document); + var testEl = body.appendChild( document.createElement("div") ); + testEl.contentEditable = "false"; + var textNode = testEl.appendChild( document.createTextNode("\u00a0\u00a0\u00a0") ); + + // Test whether the native selection will allow a collapsed selection within a non-editable element + var r1 = document.createRange(); + + r1.setStart(textNode, 1); + r1.collapse(true); + sel.addRange(r1); + collapsedNonEditableSelectionsSupported = (sel.rangeCount == 1); + sel.removeAllRanges(); + + // Test whether the native selection is capable of supporting multiple ranges. + if (!selectionHasMultipleRanges) { + // Doing the original feature test here in Chrome 36 (and presumably later versions) prints a + // console error of "Discontiguous selection is not supported." that cannot be suppressed. There's + // nothing we can do about this while retaining the feature test so we have to resort to a browser + // sniff. I'm not happy about it. See + // https://code.google.com/p/chromium/issues/detail?id=399791 + var chromeMatch = window.navigator.appVersion.match(/Chrome\/(.*?) /); + if (chromeMatch && parseInt(chromeMatch[1]) >= 36) { + selectionSupportsMultipleRanges = false; + } else { + var r2 = r1.cloneRange(); + r1.setStart(textNode, 0); + r2.setEnd(textNode, 3); + r2.setStart(textNode, 2); + sel.addRange(r1); + sel.addRange(r2); + selectionSupportsMultipleRanges = (sel.rangeCount == 2); + } + } + + // Clean up + body.removeChild(testEl); + sel.removeAllRanges(); + + for (i = 0; i < originalSelectionRangeCount; ++i) { + if (i == 0 && originalSelectionBackward) { + if (addRangeBackwardToNative) { + addRangeBackwardToNative(sel, originalSelectionRanges[i]); + } else { + api.warn("Rangy initialization: original selection was backwards but selection has been restored forwards because the browser does not support Selection.extend"); + sel.addRange(originalSelectionRanges[i]); + } + } else { + sel.addRange(originalSelectionRanges[i]); + } + } + } + })(); + } + + features.selectionSupportsMultipleRanges = selectionSupportsMultipleRanges; + features.collapsedNonEditableSelectionsSupported = collapsedNonEditableSelectionsSupported; + + // ControlRanges + var implementsControlRange = false, testControlRange; + + if (body && isHostMethod(body, "createControlRange")) { + testControlRange = body.createControlRange(); + if (util.areHostProperties(testControlRange, ["item", "add"])) { + implementsControlRange = true; + } + } + features.implementsControlRange = implementsControlRange; + + // Selection collapsedness + if (selectionHasAnchorAndFocus) { + selectionIsCollapsed = function(sel) { + return sel.anchorNode === sel.focusNode && sel.anchorOffset === sel.focusOffset; + }; + } else { + selectionIsCollapsed = function(sel) { + return sel.rangeCount ? sel.getRangeAt(sel.rangeCount - 1).collapsed : false; + }; + } + + function updateAnchorAndFocusFromRange(sel, range, backward) { + var anchorPrefix = backward ? "end" : "start", focusPrefix = backward ? "start" : "end"; + sel.anchorNode = range[anchorPrefix + "Container"]; + sel.anchorOffset = range[anchorPrefix + "Offset"]; + sel.focusNode = range[focusPrefix + "Container"]; + sel.focusOffset = range[focusPrefix + "Offset"]; + } + + function updateAnchorAndFocusFromNativeSelection(sel) { + var nativeSel = sel.nativeSelection; + sel.anchorNode = nativeSel.anchorNode; + sel.anchorOffset = nativeSel.anchorOffset; + sel.focusNode = nativeSel.focusNode; + sel.focusOffset = nativeSel.focusOffset; + } + + function updateEmptySelection(sel) { + sel.anchorNode = sel.focusNode = null; + sel.anchorOffset = sel.focusOffset = 0; + sel.rangeCount = 0; + sel.isCollapsed = true; + sel._ranges.length = 0; + } + + function getNativeRange(range) { + var nativeRange; + if (range instanceof DomRange) { + nativeRange = api.createNativeRange(range.getDocument()); + nativeRange.setEnd(range.endContainer, range.endOffset); + nativeRange.setStart(range.startContainer, range.startOffset); + } else if (range instanceof WrappedRange) { + nativeRange = range.nativeRange; + } else if (features.implementsDomRange && (range instanceof dom.getWindow(range.startContainer).Range)) { + nativeRange = range; + } + return nativeRange; + } + + function rangeContainsSingleElement(rangeNodes) { + if (!rangeNodes.length || rangeNodes[0].nodeType != 1) { + return false; + } + for (var i = 1, len = rangeNodes.length; i < len; ++i) { + if (!dom.isAncestorOf(rangeNodes[0], rangeNodes[i])) { + return false; + } + } + return true; + } + + function getSingleElementFromRange(range) { + var nodes = range.getNodes(); + if (!rangeContainsSingleElement(nodes)) { + throw module.createError("getSingleElementFromRange: range " + range.inspect() + " did not consist of a single element"); + } + return nodes[0]; + } + + // Simple, quick test which only needs to distinguish between a TextRange and a ControlRange + function isTextRange(range) { + return !!range && typeof range.text != "undefined"; + } + + function updateFromTextRange(sel, range) { + // Create a Range from the selected TextRange + var wrappedRange = new WrappedRange(range); + sel._ranges = [wrappedRange]; + + updateAnchorAndFocusFromRange(sel, wrappedRange, false); + sel.rangeCount = 1; + sel.isCollapsed = wrappedRange.collapsed; + } + + function updateControlSelection(sel) { + // Update the wrapped selection based on what's now in the native selection + sel._ranges.length = 0; + if (sel.docSelection.type == "None") { + updateEmptySelection(sel); + } else { + var controlRange = sel.docSelection.createRange(); + if (isTextRange(controlRange)) { + // This case (where the selection type is "Control" and calling createRange() on the selection returns + // a TextRange) can happen in IE 9. It happens, for example, when all elements in the selected + // ControlRange have been removed from the ControlRange and removed from the document. + updateFromTextRange(sel, controlRange); + } else { + sel.rangeCount = controlRange.length; + var range, doc = getDocument(controlRange.item(0)); + for (var i = 0; i < sel.rangeCount; ++i) { + range = api.createRange(doc); + range.selectNode(controlRange.item(i)); + sel._ranges.push(range); + } + sel.isCollapsed = sel.rangeCount == 1 && sel._ranges[0].collapsed; + updateAnchorAndFocusFromRange(sel, sel._ranges[sel.rangeCount - 1], false); + } + } + } + + function addRangeToControlSelection(sel, range) { + var controlRange = sel.docSelection.createRange(); + var rangeElement = getSingleElementFromRange(range); + + // Create a new ControlRange containing all the elements in the selected ControlRange plus the element + // contained by the supplied range + var doc = getDocument(controlRange.item(0)); + var newControlRange = getBody(doc).createControlRange(); + for (var i = 0, len = controlRange.length; i < len; ++i) { + newControlRange.add(controlRange.item(i)); + } + try { + newControlRange.add(rangeElement); + } catch (ex) { + throw module.createError("addRange(): Element within the specified Range could not be added to control selection (does it have layout?)"); + } + newControlRange.select(); + + // Update the wrapped selection based on what's now in the native selection + updateControlSelection(sel); + } + + var getSelectionRangeAt; + + if (isHostMethod(testSelection, "getRangeAt")) { + // try/catch is present because getRangeAt() must have thrown an error in some browser and some situation. + // Unfortunately, I didn't write a comment about the specifics and am now scared to take it out. Let that be a + // lesson to us all, especially me. + getSelectionRangeAt = function(sel, index) { + try { + return sel.getRangeAt(index); + } catch (ex) { + return null; + } + }; + } else if (selectionHasAnchorAndFocus) { + getSelectionRangeAt = function(sel) { + var doc = getDocument(sel.anchorNode); + var range = api.createRange(doc); + range.setStartAndEnd(sel.anchorNode, sel.anchorOffset, sel.focusNode, sel.focusOffset); + + // Handle the case when the selection was selected backwards (from the end to the start in the + // document) + if (range.collapsed !== this.isCollapsed) { + range.setStartAndEnd(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset); + } + + return range; + }; + } + + function WrappedSelection(selection, docSelection, win) { + this.nativeSelection = selection; + this.docSelection = docSelection; + this._ranges = []; + this.win = win; + this.refresh(); + } + + WrappedSelection.prototype = api.selectionPrototype; + + function deleteProperties(sel) { + sel.win = sel.anchorNode = sel.focusNode = sel._ranges = null; + sel.rangeCount = sel.anchorOffset = sel.focusOffset = 0; + sel.detached = true; + } + + var cachedRangySelections = []; + + function actOnCachedSelection(win, action) { + var i = cachedRangySelections.length, cached, sel; + while (i--) { + cached = cachedRangySelections[i]; + sel = cached.selection; + if (action == "deleteAll") { + deleteProperties(sel); + } else if (cached.win == win) { + if (action == "delete") { + cachedRangySelections.splice(i, 1); + return true; + } else { + return sel; + } + } + } + if (action == "deleteAll") { + cachedRangySelections.length = 0; + } + return null; + } + + var getSelection = function(win) { + // Check if the parameter is a Rangy Selection object + if (win && win instanceof WrappedSelection) { + win.refresh(); + return win; + } + + win = getWindow(win, "getNativeSelection"); + + var sel = actOnCachedSelection(win); + var nativeSel = getNativeSelection(win), docSel = implementsDocSelection ? getDocSelection(win) : null; + if (sel) { + sel.nativeSelection = nativeSel; + sel.docSelection = docSel; + sel.refresh(); + } else { + sel = new WrappedSelection(nativeSel, docSel, win); + cachedRangySelections.push( { win: win, selection: sel } ); + } + return sel; + }; + + api.getSelection = getSelection; + + api.getIframeSelection = function(iframeEl) { + module.deprecationNotice("getIframeSelection()", "getSelection(iframeEl)"); + return api.getSelection(dom.getIframeWindow(iframeEl)); + }; + + var selProto = WrappedSelection.prototype; + + function createControlSelection(sel, ranges) { + // Ensure that the selection becomes of type "Control" + var doc = getDocument(ranges[0].startContainer); + var controlRange = getBody(doc).createControlRange(); + for (var i = 0, el, len = ranges.length; i < len; ++i) { + el = getSingleElementFromRange(ranges[i]); + try { + controlRange.add(el); + } catch (ex) { + throw module.createError("setRanges(): Element within one of the specified Ranges could not be added to control selection (does it have layout?)"); + } + } + controlRange.select(); + + // Update the wrapped selection based on what's now in the native selection + updateControlSelection(sel); + } + + // Selecting a range + if (!useDocumentSelection && selectionHasAnchorAndFocus && util.areHostMethods(testSelection, ["removeAllRanges", "addRange"])) { + selProto.removeAllRanges = function() { + this.nativeSelection.removeAllRanges(); + updateEmptySelection(this); + }; + + var addRangeBackward = function(sel, range) { + addRangeBackwardToNative(sel.nativeSelection, range); + sel.refresh(); + }; + + if (selectionHasRangeCount) { + selProto.addRange = function(range, direction) { + if (implementsControlRange && implementsDocSelection && this.docSelection.type == CONTROL) { + addRangeToControlSelection(this, range); + } else { + if (isDirectionBackward(direction) && selectionHasExtend) { + addRangeBackward(this, range); + } else { + var previousRangeCount; + if (selectionSupportsMultipleRanges) { + previousRangeCount = this.rangeCount; + } else { + this.removeAllRanges(); + previousRangeCount = 0; + } + // Clone the native range so that changing the selected range does not affect the selection. + // This is contrary to the spec but is the only way to achieve consistency between browsers. See + // issue 80. + this.nativeSelection.addRange(getNativeRange(range).cloneRange()); + + // Check whether adding the range was successful + this.rangeCount = this.nativeSelection.rangeCount; + + if (this.rangeCount == previousRangeCount + 1) { + // The range was added successfully + + // Check whether the range that we added to the selection is reflected in the last range extracted from + // the selection + if (api.config.checkSelectionRanges) { + var nativeRange = getSelectionRangeAt(this.nativeSelection, this.rangeCount - 1); + if (nativeRange && !rangesEqual(nativeRange, range)) { + // Happens in WebKit with, for example, a selection placed at the start of a text node + range = new WrappedRange(nativeRange); + } + } + this._ranges[this.rangeCount - 1] = range; + updateAnchorAndFocusFromRange(this, range, selectionIsBackward(this.nativeSelection)); + this.isCollapsed = selectionIsCollapsed(this); + } else { + // The range was not added successfully. The simplest thing is to refresh + this.refresh(); + } + } + } + }; + } else { + selProto.addRange = function(range, direction) { + if (isDirectionBackward(direction) && selectionHasExtend) { + addRangeBackward(this, range); + } else { + this.nativeSelection.addRange(getNativeRange(range)); + this.refresh(); + } + }; + } + + selProto.setRanges = function(ranges) { + if (implementsControlRange && implementsDocSelection && ranges.length > 1) { + createControlSelection(this, ranges); + } else { + this.removeAllRanges(); + for (var i = 0, len = ranges.length; i < len; ++i) { + this.addRange(ranges[i]); + } + } + }; + } else if (isHostMethod(testSelection, "empty") && isHostMethod(testRange, "select") && + implementsControlRange && useDocumentSelection) { + + selProto.removeAllRanges = function() { + // Added try/catch as fix for issue #21 + try { + this.docSelection.empty(); + + // Check for empty() not working (issue #24) + if (this.docSelection.type != "None") { + // Work around failure to empty a control selection by instead selecting a TextRange and then + // calling empty() + var doc; + if (this.anchorNode) { + doc = getDocument(this.anchorNode); + } else if (this.docSelection.type == CONTROL) { + var controlRange = this.docSelection.createRange(); + if (controlRange.length) { + doc = getDocument( controlRange.item(0) ); + } + } + if (doc) { + var textRange = getBody(doc).createTextRange(); + textRange.select(); + this.docSelection.empty(); + } + } + } catch(ex) {} + updateEmptySelection(this); + }; + + selProto.addRange = function(range) { + if (this.docSelection.type == CONTROL) { + addRangeToControlSelection(this, range); + } else { + api.WrappedTextRange.rangeToTextRange(range).select(); + this._ranges[0] = range; + this.rangeCount = 1; + this.isCollapsed = this._ranges[0].collapsed; + updateAnchorAndFocusFromRange(this, range, false); + } + }; + + selProto.setRanges = function(ranges) { + this.removeAllRanges(); + var rangeCount = ranges.length; + if (rangeCount > 1) { + createControlSelection(this, ranges); + } else if (rangeCount) { + this.addRange(ranges[0]); + } + }; + } else { + module.fail("No means of selecting a Range or TextRange was found"); + return false; + } + + selProto.getRangeAt = function(index) { + if (index < 0 || index >= this.rangeCount) { + throw new DOMException("INDEX_SIZE_ERR"); + } else { + // Clone the range to preserve selection-range independence. See issue 80. + return this._ranges[index].cloneRange(); + } + }; + + var refreshSelection; + + if (useDocumentSelection) { + refreshSelection = function(sel) { + var range; + if (api.isSelectionValid(sel.win)) { + range = sel.docSelection.createRange(); + } else { + range = getBody(sel.win.document).createTextRange(); + range.collapse(true); + } + + if (sel.docSelection.type == CONTROL) { + updateControlSelection(sel); + } else if (isTextRange(range)) { + updateFromTextRange(sel, range); + } else { + updateEmptySelection(sel); + } + }; + } else if (isHostMethod(testSelection, "getRangeAt") && typeof testSelection.rangeCount == NUMBER) { + refreshSelection = function(sel) { + if (implementsControlRange && implementsDocSelection && sel.docSelection.type == CONTROL) { + updateControlSelection(sel); + } else { + sel._ranges.length = sel.rangeCount = sel.nativeSelection.rangeCount; + if (sel.rangeCount) { + for (var i = 0, len = sel.rangeCount; i < len; ++i) { + sel._ranges[i] = new api.WrappedRange(sel.nativeSelection.getRangeAt(i)); + } + updateAnchorAndFocusFromRange(sel, sel._ranges[sel.rangeCount - 1], selectionIsBackward(sel.nativeSelection)); + sel.isCollapsed = selectionIsCollapsed(sel); + } else { + updateEmptySelection(sel); + } + } + }; + } else if (selectionHasAnchorAndFocus && typeof testSelection.isCollapsed == BOOLEAN && typeof testRange.collapsed == BOOLEAN && features.implementsDomRange) { + refreshSelection = function(sel) { + var range, nativeSel = sel.nativeSelection; + if (nativeSel.anchorNode) { + range = getSelectionRangeAt(nativeSel, 0); + sel._ranges = [range]; + sel.rangeCount = 1; + updateAnchorAndFocusFromNativeSelection(sel); + sel.isCollapsed = selectionIsCollapsed(sel); + } else { + updateEmptySelection(sel); + } + }; + } else { + module.fail("No means of obtaining a Range or TextRange from the user's selection was found"); + return false; + } + + selProto.refresh = function(checkForChanges) { + var oldRanges = checkForChanges ? this._ranges.slice(0) : null; + var oldAnchorNode = this.anchorNode, oldAnchorOffset = this.anchorOffset; + + refreshSelection(this); + if (checkForChanges) { + // Check the range count first + var i = oldRanges.length; + if (i != this._ranges.length) { + return true; + } + + // Now check the direction. Checking the anchor position is the same is enough since we're checking all the + // ranges after this + if (this.anchorNode != oldAnchorNode || this.anchorOffset != oldAnchorOffset) { + return true; + } + + // Finally, compare each range in turn + while (i--) { + if (!rangesEqual(oldRanges[i], this._ranges[i])) { + return true; + } + } + return false; + } + }; + + // Removal of a single range + var removeRangeManually = function(sel, range) { + var ranges = sel.getAllRanges(); + sel.removeAllRanges(); + for (var i = 0, len = ranges.length; i < len; ++i) { + if (!rangesEqual(range, ranges[i])) { + sel.addRange(ranges[i]); + } + } + if (!sel.rangeCount) { + updateEmptySelection(sel); + } + }; + + if (implementsControlRange && implementsDocSelection) { + selProto.removeRange = function(range) { + if (this.docSelection.type == CONTROL) { + var controlRange = this.docSelection.createRange(); + var rangeElement = getSingleElementFromRange(range); + + // Create a new ControlRange containing all the elements in the selected ControlRange minus the + // element contained by the supplied range + var doc = getDocument(controlRange.item(0)); + var newControlRange = getBody(doc).createControlRange(); + var el, removed = false; + for (var i = 0, len = controlRange.length; i < len; ++i) { + el = controlRange.item(i); + if (el !== rangeElement || removed) { + newControlRange.add(controlRange.item(i)); + } else { + removed = true; + } + } + newControlRange.select(); + + // Update the wrapped selection based on what's now in the native selection + updateControlSelection(this); + } else { + removeRangeManually(this, range); + } + }; + } else { + selProto.removeRange = function(range) { + removeRangeManually(this, range); + }; + } + + // Detecting if a selection is backward + var selectionIsBackward; + if (!useDocumentSelection && selectionHasAnchorAndFocus && features.implementsDomRange) { + selectionIsBackward = winSelectionIsBackward; + + selProto.isBackward = function() { + return selectionIsBackward(this); + }; + } else { + selectionIsBackward = selProto.isBackward = function() { + return false; + }; + } + + // Create an alias for backwards compatibility. From 1.3, everything is "backward" rather than "backwards" + selProto.isBackwards = selProto.isBackward; + + // Selection stringifier + // This is conformant to the old HTML5 selections draft spec but differs from WebKit and Mozilla's implementation. + // The current spec does not yet define this method. + selProto.toString = function() { + var rangeTexts = []; + for (var i = 0, len = this.rangeCount; i < len; ++i) { + rangeTexts[i] = "" + this._ranges[i]; + } + return rangeTexts.join(""); + }; + + function assertNodeInSameDocument(sel, node) { + if (sel.win.document != getDocument(node)) { + throw new DOMException("WRONG_DOCUMENT_ERR"); + } + } + + // No current browser conforms fully to the spec for this method, so Rangy's own method is always used + selProto.collapse = function(node, offset) { + assertNodeInSameDocument(this, node); + var range = api.createRange(node); + range.collapseToPoint(node, offset); + this.setSingleRange(range); + this.isCollapsed = true; + }; + + selProto.collapseToStart = function() { + if (this.rangeCount) { + var range = this._ranges[0]; + this.collapse(range.startContainer, range.startOffset); + } else { + throw new DOMException("INVALID_STATE_ERR"); + } + }; + + selProto.collapseToEnd = function() { + if (this.rangeCount) { + var range = this._ranges[this.rangeCount - 1]; + this.collapse(range.endContainer, range.endOffset); + } else { + throw new DOMException("INVALID_STATE_ERR"); + } + }; + + // The spec is very specific on how selectAllChildren should be implemented so the native implementation is + // never used by Rangy. + selProto.selectAllChildren = function(node) { + assertNodeInSameDocument(this, node); + var range = api.createRange(node); + range.selectNodeContents(node); + this.setSingleRange(range); + }; + + selProto.deleteFromDocument = function() { + // Sepcial behaviour required for IE's control selections + if (implementsControlRange && implementsDocSelection && this.docSelection.type == CONTROL) { + var controlRange = this.docSelection.createRange(); + var element; + while (controlRange.length) { + element = controlRange.item(0); + controlRange.remove(element); + element.parentNode.removeChild(element); + } + this.refresh(); + } else if (this.rangeCount) { + var ranges = this.getAllRanges(); + if (ranges.length) { + this.removeAllRanges(); + for (var i = 0, len = ranges.length; i < len; ++i) { + ranges[i].deleteContents(); + } + // The spec says nothing about what the selection should contain after calling deleteContents on each + // range. Firefox moves the selection to where the final selected range was, so we emulate that + this.addRange(ranges[len - 1]); + } + } + }; + + // The following are non-standard extensions + selProto.eachRange = function(func, returnValue) { + for (var i = 0, len = this._ranges.length; i < len; ++i) { + if ( func( this.getRangeAt(i) ) ) { + return returnValue; + } + } + }; + + selProto.getAllRanges = function() { + var ranges = []; + this.eachRange(function(range) { + ranges.push(range); + }); + return ranges; + }; + + selProto.setSingleRange = function(range, direction) { + this.removeAllRanges(); + this.addRange(range, direction); + }; + + selProto.callMethodOnEachRange = function(methodName, params) { + var results = []; + this.eachRange( function(range) { + results.push( range[methodName].apply(range, params) ); + } ); + return results; + }; + + function createStartOrEndSetter(isStart) { + return function(node, offset) { + var range; + if (this.rangeCount) { + range = this.getRangeAt(0); + range["set" + (isStart ? "Start" : "End")](node, offset); + } else { + range = api.createRange(this.win.document); + range.setStartAndEnd(node, offset); + } + this.setSingleRange(range, this.isBackward()); + }; + } + + selProto.setStart = createStartOrEndSetter(true); + selProto.setEnd = createStartOrEndSetter(false); + + // Add select() method to Range prototype. Any existing selection will be removed. + api.rangePrototype.select = function(direction) { + getSelection( this.getDocument() ).setSingleRange(this, direction); + }; + + selProto.changeEachRange = function(func) { + var ranges = []; + var backward = this.isBackward(); + + this.eachRange(function(range) { + func(range); + ranges.push(range); + }); + + this.removeAllRanges(); + if (backward && ranges.length == 1) { + this.addRange(ranges[0], "backward"); + } else { + this.setRanges(ranges); + } + }; + + selProto.containsNode = function(node, allowPartial) { + return this.eachRange( function(range) { + return range.containsNode(node, allowPartial); + }, true ) || false; + }; + + selProto.getBookmark = function(containerNode) { + return { + backward: this.isBackward(), + rangeBookmarks: this.callMethodOnEachRange("getBookmark", [containerNode]) + }; + }; + + selProto.moveToBookmark = function(bookmark) { + var selRanges = []; + for (var i = 0, rangeBookmark, range; rangeBookmark = bookmark.rangeBookmarks[i++]; ) { + range = api.createRange(this.win); + range.moveToBookmark(rangeBookmark); + selRanges.push(range); + } + if (bookmark.backward) { + this.setSingleRange(selRanges[0], "backward"); + } else { + this.setRanges(selRanges); + } + }; + + selProto.toHtml = function() { + var rangeHtmls = []; + this.eachRange(function(range) { + rangeHtmls.push( DomRange.toHtml(range) ); + }); + return rangeHtmls.join(""); + }; + + if (features.implementsTextRange) { + selProto.getNativeTextRange = function() { + var sel, textRange; + if ( (sel = this.docSelection) ) { + var range = sel.createRange(); + if (isTextRange(range)) { + return range; + } else { + throw module.createError("getNativeTextRange: selection is a control selection"); + } + } else if (this.rangeCount > 0) { + return api.WrappedTextRange.rangeToTextRange( this.getRangeAt(0) ); + } else { + throw module.createError("getNativeTextRange: selection contains no range"); + } + }; + } + + function inspect(sel) { + var rangeInspects = []; + var anchor = new DomPosition(sel.anchorNode, sel.anchorOffset); + var focus = new DomPosition(sel.focusNode, sel.focusOffset); + var name = (typeof sel.getName == "function") ? sel.getName() : "Selection"; + + if (typeof sel.rangeCount != "undefined") { + for (var i = 0, len = sel.rangeCount; i < len; ++i) { + rangeInspects[i] = DomRange.inspect(sel.getRangeAt(i)); + } + } + return "[" + name + "(Ranges: " + rangeInspects.join(", ") + + ")(anchor: " + anchor.inspect() + ", focus: " + focus.inspect() + "]"; + } + + selProto.getName = function() { + return "WrappedSelection"; + }; + + selProto.inspect = function() { + return inspect(this); + }; + + selProto.detach = function() { + actOnCachedSelection(this.win, "delete"); + deleteProperties(this); + }; + + WrappedSelection.detachAll = function() { + actOnCachedSelection(null, "deleteAll"); + }; + + WrappedSelection.inspect = inspect; + WrappedSelection.isDirectionBackward = isDirectionBackward; + + api.Selection = WrappedSelection; + + api.selectionPrototype = selProto; + + api.addShimListener(function(win) { + if (typeof win.getSelection == "undefined") { + win.getSelection = function() { + return getSelection(win); + }; + } + win = null; + }); + }); + + + /*----------------------------------------------------------------------------------------------------------------*/ + + return api; +}, this);;/** + * Selection save and restore module for Rangy. + * Saves and restores user selections using marker invisible elements in the DOM. + * + * Part of Rangy, a cross-browser JavaScript range and selection library + * http://code.google.com/p/rangy/ + * + * Depends on Rangy core. + * + * Copyright 2014, Tim Down + * Licensed under the MIT license. + * Version: 1.3alpha.20140804 + * Build date: 4 August 2014 + */ +(function(factory, global) { + if (typeof define == "function" && define.amd) { + // AMD. Register as an anonymous module with a dependency on Rangy. + define(["rangy"], factory); + /* + } else if (typeof exports == "object") { + // Node/CommonJS style for Browserify + module.exports = factory; + */ + } else { + // No AMD or CommonJS support so we use the rangy global variable + factory(global.rangy); + } +})(function(rangy) { + rangy.createModule("SaveRestore", ["WrappedRange"], function(api, module) { + var dom = api.dom; + + var markerTextChar = "\ufeff"; + + function gEBI(id, doc) { + return (doc || document).getElementById(id); + } + + function insertRangeBoundaryMarker(range, atStart) { + var markerId = "selectionBoundary_" + (+new Date()) + "_" + ("" + Math.random()).slice(2); + var markerEl; + var doc = dom.getDocument(range.startContainer); + + // Clone the Range and collapse to the appropriate boundary point + var boundaryRange = range.cloneRange(); + boundaryRange.collapse(atStart); + + // Create the marker element containing a single invisible character using DOM methods and insert it + markerEl = doc.createElement("span"); + markerEl.id = markerId; + markerEl.style.lineHeight = "0"; + markerEl.style.display = "none"; + markerEl.className = "rangySelectionBoundary"; + markerEl.appendChild(doc.createTextNode(markerTextChar)); + + boundaryRange.insertNode(markerEl); + return markerEl; + } + + function setRangeBoundary(doc, range, markerId, atStart) { + var markerEl = gEBI(markerId, doc); + if (markerEl) { + range[atStart ? "setStartBefore" : "setEndBefore"](markerEl); + markerEl.parentNode.removeChild(markerEl); + } else { + module.warn("Marker element has been removed. Cannot restore selection."); + } + } + + function compareRanges(r1, r2) { + return r2.compareBoundaryPoints(r1.START_TO_START, r1); + } + + function saveRange(range, backward) { + var startEl, endEl, doc = api.DomRange.getRangeDocument(range), text = range.toString(); + + if (range.collapsed) { + endEl = insertRangeBoundaryMarker(range, false); + return { + document: doc, + markerId: endEl.id, + collapsed: true + }; + } else { + endEl = insertRangeBoundaryMarker(range, false); + startEl = insertRangeBoundaryMarker(range, true); + + return { + document: doc, + startMarkerId: startEl.id, + endMarkerId: endEl.id, + collapsed: false, + backward: backward, + toString: function() { + return "original text: '" + text + "', new text: '" + range.toString() + "'"; + } + }; + } + } + + function restoreRange(rangeInfo, normalize) { + var doc = rangeInfo.document; + if (typeof normalize == "undefined") { + normalize = true; + } + var range = api.createRange(doc); + if (rangeInfo.collapsed) { + var markerEl = gEBI(rangeInfo.markerId, doc); + if (markerEl) { + markerEl.style.display = "inline"; + var previousNode = markerEl.previousSibling; + + // Workaround for issue 17 + if (previousNode && previousNode.nodeType == 3) { + markerEl.parentNode.removeChild(markerEl); + range.collapseToPoint(previousNode, previousNode.length); + } else { + range.collapseBefore(markerEl); + markerEl.parentNode.removeChild(markerEl); + } + } else { + module.warn("Marker element has been removed. Cannot restore selection."); + } + } else { + setRangeBoundary(doc, range, rangeInfo.startMarkerId, true); + setRangeBoundary(doc, range, rangeInfo.endMarkerId, false); + } + + if (normalize) { + range.normalizeBoundaries(); + } + + return range; + } + + function saveRanges(ranges, backward) { + var rangeInfos = [], range, doc; + + // Order the ranges by position within the DOM, latest first, cloning the array to leave the original untouched + ranges = ranges.slice(0); + ranges.sort(compareRanges); + + for (var i = 0, len = ranges.length; i < len; ++i) { + rangeInfos[i] = saveRange(ranges[i], backward); + } + + // Now that all the markers are in place and DOM manipulation over, adjust each range's boundaries to lie + // between its markers + for (i = len - 1; i >= 0; --i) { + range = ranges[i]; + doc = api.DomRange.getRangeDocument(range); + if (range.collapsed) { + range.collapseAfter(gEBI(rangeInfos[i].markerId, doc)); + } else { + range.setEndBefore(gEBI(rangeInfos[i].endMarkerId, doc)); + range.setStartAfter(gEBI(rangeInfos[i].startMarkerId, doc)); + } + } + + return rangeInfos; + } + + function saveSelection(win) { + if (!api.isSelectionValid(win)) { + module.warn("Cannot save selection. This usually happens when the selection is collapsed and the selection document has lost focus."); + return null; + } + var sel = api.getSelection(win); + var ranges = sel.getAllRanges(); + var backward = (ranges.length == 1 && sel.isBackward()); + + var rangeInfos = saveRanges(ranges, backward); + + // Ensure current selection is unaffected + if (backward) { + sel.setSingleRange(ranges[0], "backward"); + } else { + sel.setRanges(ranges); + } + + return { + win: win, + rangeInfos: rangeInfos, + restored: false + }; + } + + function restoreRanges(rangeInfos) { + var ranges = []; + + // Ranges are in reverse order of appearance in the DOM. We want to restore earliest first to avoid + // normalization affecting previously restored ranges. + var rangeCount = rangeInfos.length; + + for (var i = rangeCount - 1; i >= 0; i--) { + ranges[i] = restoreRange(rangeInfos[i], true); + } + + return ranges; + } + + function restoreSelection(savedSelection, preserveDirection) { + if (!savedSelection.restored) { + var rangeInfos = savedSelection.rangeInfos; + var sel = api.getSelection(savedSelection.win); + var ranges = restoreRanges(rangeInfos), rangeCount = rangeInfos.length; + + if (rangeCount == 1 && preserveDirection && api.features.selectionHasExtend && rangeInfos[0].backward) { + sel.removeAllRanges(); + sel.addRange(ranges[0], true); + } else { + sel.setRanges(ranges); + } + + savedSelection.restored = true; + } + } + + function removeMarkerElement(doc, markerId) { + var markerEl = gEBI(markerId, doc); + if (markerEl) { + markerEl.parentNode.removeChild(markerEl); + } + } + + function removeMarkers(savedSelection) { + var rangeInfos = savedSelection.rangeInfos; + for (var i = 0, len = rangeInfos.length, rangeInfo; i < len; ++i) { + rangeInfo = rangeInfos[i]; + if (rangeInfo.collapsed) { + removeMarkerElement(savedSelection.doc, rangeInfo.markerId); + } else { + removeMarkerElement(savedSelection.doc, rangeInfo.startMarkerId); + removeMarkerElement(savedSelection.doc, rangeInfo.endMarkerId); + } + } + } + + api.util.extend(api, { + saveRange: saveRange, + restoreRange: restoreRange, + saveRanges: saveRanges, + restoreRanges: restoreRanges, + saveSelection: saveSelection, + restoreSelection: restoreSelection, + removeMarkerElement: removeMarkerElement, + removeMarkers: removeMarkers + }); + }); + +}, this);;/* + Base.js, version 1.1a + Copyright 2006-2010, Dean Edwards + License: http://www.opensource.org/licenses/mit-license.php +*/ + +var Base = function() { + // dummy +}; + +Base.extend = function(_instance, _static) { // subclass + var extend = Base.prototype.extend; + + // build the prototype + Base._prototyping = true; + var proto = new this; + extend.call(proto, _instance); + proto.base = function() { + // call this method from any other method to invoke that method's ancestor + }; + delete Base._prototyping; + + // create the wrapper for the constructor function + //var constructor = proto.constructor.valueOf(); //-dean + var constructor = proto.constructor; + var klass = proto.constructor = function() { + if (!Base._prototyping) { + if (this._constructing || this.constructor == klass) { // instantiation + this._constructing = true; + constructor.apply(this, arguments); + delete this._constructing; + } else if (arguments[0] != null) { // casting + return (arguments[0].extend || extend).call(arguments[0], proto); + } + } + }; + + // build the class interface + klass.ancestor = this; + klass.extend = this.extend; + klass.forEach = this.forEach; + klass.implement = this.implement; + klass.prototype = proto; + klass.toString = this.toString; + klass.valueOf = function(type) { + //return (type == "object") ? klass : constructor; //-dean + return (type == "object") ? klass : constructor.valueOf(); + }; + extend.call(klass, _static); + // class initialisation + if (typeof klass.init == "function") klass.init(); + return klass; +}; + +Base.prototype = { + extend: function(source, value) { + if (arguments.length > 1) { // extending with a name/value pair + var ancestor = this[source]; + if (ancestor && (typeof value == "function") && // overriding a method? + // the valueOf() comparison is to avoid circular references + (!ancestor.valueOf || ancestor.valueOf() != value.valueOf()) && + /\bbase\b/.test(value)) { + // get the underlying method + var method = value.valueOf(); + // override + value = function() { + var previous = this.base || Base.prototype.base; + this.base = ancestor; + var returnValue = method.apply(this, arguments); + this.base = previous; + return returnValue; + }; + // point to the underlying method + value.valueOf = function(type) { + return (type == "object") ? value : method; + }; + value.toString = Base.toString; + } + this[source] = value; + } else if (source) { // extending with an object literal + var extend = Base.prototype.extend; + // if this object has a customised extend method then use it + if (!Base._prototyping && typeof this != "function") { + extend = this.extend || extend; + } + var proto = {toSource: null}; + // do the "toString" and other methods manually + var hidden = ["constructor", "toString", "valueOf"]; + // if we are prototyping then include the constructor + var i = Base._prototyping ? 0 : 1; + while (key = hidden[i++]) { + if (source[key] != proto[key]) { + extend.call(this, key, source[key]); + + } + } + // copy each of the source object's properties to this object + for (var key in source) { + if (!proto[key]) extend.call(this, key, source[key]); + } + } + return this; + } +}; + +// initialise +Base = Base.extend({ + constructor: function() { + this.extend(arguments[0]); + } +}, { + ancestor: Object, + version: "1.1", + + forEach: function(object, block, context) { + for (var key in object) { + if (this.prototype[key] === undefined) { + block.call(context, object[key], key, object); + } + } + }, + + implement: function() { + for (var i = 0; i < arguments.length; i++) { + if (typeof arguments[i] == "function") { + // if it's a function, call it + arguments[i](this.prototype); + } else { + // add the interface using the extend method + this.prototype.extend(arguments[i]); + } + } + return this; + }, + + toString: function() { + return String(this.valueOf()); + } +});;/** + * Detect browser support for specific features + */ +wysihtml5.browser = (function() { + var userAgent = navigator.userAgent, + testElement = document.createElement("div"), + // Browser sniffing is unfortunately needed since some behaviors are impossible to feature detect + isGecko = userAgent.indexOf("Gecko") !== -1 && userAgent.indexOf("KHTML") === -1, + isWebKit = userAgent.indexOf("AppleWebKit/") !== -1, + isChrome = userAgent.indexOf("Chrome/") !== -1, + isOpera = userAgent.indexOf("Opera/") !== -1; + + function iosVersion(userAgent) { + return +((/ipad|iphone|ipod/.test(userAgent) && userAgent.match(/ os (\d+).+? like mac os x/)) || [undefined, 0])[1]; + } + + function androidVersion(userAgent) { + return +(userAgent.match(/android (\d+)/) || [undefined, 0])[1]; + } + + function isIE(version, equation) { + var rv = -1, + re; + + if (navigator.appName == 'Microsoft Internet Explorer') { + re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); + } else if (navigator.appName == 'Netscape') { + re = new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})"); + } + + if (re && re.exec(navigator.userAgent) != null) { + rv = parseFloat(RegExp.$1); + } + + if (rv === -1) { return false; } + if (!version) { return true; } + if (!equation) { return version === rv; } + if (equation === "<") { return version < rv; } + if (equation === ">") { return version > rv; } + if (equation === "<=") { return version <= rv; } + if (equation === ">=") { return version >= rv; } + } + + return { + // Static variable needed, publicly accessible, to be able override it in unit tests + USER_AGENT: userAgent, + + /** + * Exclude browsers that are not capable of displaying and handling + * contentEditable as desired: + * - iPhone, iPad (tested iOS 4.2.2) and Android (tested 2.2) refuse to make contentEditables focusable + * - IE < 8 create invalid markup and crash randomly from time to time + * + * @return {Boolean} + */ + supported: function() { + var userAgent = this.USER_AGENT.toLowerCase(), + // Essential for making html elements editable + hasContentEditableSupport = "contentEditable" in testElement, + // Following methods are needed in order to interact with the contentEditable area + hasEditingApiSupport = document.execCommand && document.queryCommandSupported && document.queryCommandState, + // document selector apis are only supported by IE 8+, Safari 4+, Chrome and Firefox 3.5+ + hasQuerySelectorSupport = document.querySelector && document.querySelectorAll, + // contentEditable is unusable in mobile browsers (tested iOS 4.2.2, Android 2.2, Opera Mobile, WebOS 3.05) + isIncompatibleMobileBrowser = (this.isIos() && iosVersion(userAgent) < 5) || (this.isAndroid() && androidVersion(userAgent) < 4) || userAgent.indexOf("opera mobi") !== -1 || userAgent.indexOf("hpwos/") !== -1; + return hasContentEditableSupport + && hasEditingApiSupport + && hasQuerySelectorSupport + && !isIncompatibleMobileBrowser; + }, + + isTouchDevice: function() { + return this.supportsEvent("touchmove"); + }, + + isIos: function() { + return (/ipad|iphone|ipod/i).test(this.USER_AGENT); + }, + + isAndroid: function() { + return this.USER_AGENT.indexOf("Android") !== -1; + }, + + /** + * Whether the browser supports sandboxed iframes + * Currently only IE 6+ offers such feature <iframe security="restricted"> + * + * http://msdn.microsoft.com/en-us/library/ms534622(v=vs.85).aspx + * http://blogs.msdn.com/b/ie/archive/2008/01/18/using-frames-more-securely.aspx + * + * HTML5 sandboxed iframes are still buggy and their DOM is not reachable from the outside (except when using postMessage) + */ + supportsSandboxedIframes: function() { + return isIE(); + }, + + /** + * IE6+7 throw a mixed content warning when the src of an iframe + * is empty/unset or about:blank + * window.querySelector is implemented as of IE8 + */ + throwsMixedContentWarningWhenIframeSrcIsEmpty: function() { + return !("querySelector" in document); + }, + + /** + * Whether the caret is correctly displayed in contentEditable elements + * Firefox sometimes shows a huge caret in the beginning after focusing + */ + displaysCaretInEmptyContentEditableCorrectly: function() { + return isIE(); + }, + + /** + * Opera and IE are the only browsers who offer the css value + * in the original unit, thx to the currentStyle object + * All other browsers provide the computed style in px via window.getComputedStyle + */ + hasCurrentStyleProperty: function() { + return "currentStyle" in testElement; + }, + + /** + * Firefox on OSX navigates through history when hitting CMD + Arrow right/left + */ + hasHistoryIssue: function() { + return isGecko && navigator.platform.substr(0, 3) === "Mac"; + }, + + /** + * Whether the browser inserts a <br> when pressing enter in a contentEditable element + */ + insertsLineBreaksOnReturn: function() { + return isGecko; + }, + + supportsPlaceholderAttributeOn: function(element) { + return "placeholder" in element; + }, + + supportsEvent: function(eventName) { + return "on" + eventName in testElement || (function() { + testElement.setAttribute("on" + eventName, "return;"); + return typeof(testElement["on" + eventName]) === "function"; + })(); + }, + + /** + * Opera doesn't correctly fire focus/blur events when clicking in- and outside of iframe + */ + supportsEventsInIframeCorrectly: function() { + return !isOpera; + }, + + /** + * Everything below IE9 doesn't know how to treat HTML5 tags + * + * @param {Object} context The document object on which to check HTML5 support + * + * @example + * wysihtml5.browser.supportsHTML5Tags(document); + */ + supportsHTML5Tags: function(context) { + var element = context.createElement("div"), + html5 = "<article>foo</article>"; + element.innerHTML = html5; + return element.innerHTML.toLowerCase() === html5; + }, + + /** + * Checks whether a document supports a certain queryCommand + * In particular, Opera needs a reference to a document that has a contentEditable in it's dom tree + * in oder to report correct results + * + * @param {Object} doc Document object on which to check for a query command + * @param {String} command The query command to check for + * @return {Boolean} + * + * @example + * wysihtml5.browser.supportsCommand(document, "bold"); + */ + supportsCommand: (function() { + // Following commands are supported but contain bugs in some browsers + var buggyCommands = { + // formatBlock fails with some tags (eg. <blockquote>) + "formatBlock": isIE(10, "<="), + // When inserting unordered or ordered lists in Firefox, Chrome or Safari, the current selection or line gets + // converted into a list (<ul><li>...</li></ul>, <ol><li>...</li></ol>) + // IE and Opera act a bit different here as they convert the entire content of the current block element into a list + "insertUnorderedList": isIE(), + "insertOrderedList": isIE() + }; + + // Firefox throws errors for queryCommandSupported, so we have to build up our own object of supported commands + var supported = { + "insertHTML": isGecko + }; + + return function(doc, command) { + var isBuggy = buggyCommands[command]; + if (!isBuggy) { + // Firefox throws errors when invoking queryCommandSupported or queryCommandEnabled + try { + return doc.queryCommandSupported(command); + } catch(e1) {} + + try { + return doc.queryCommandEnabled(command); + } catch(e2) { + return !!supported[command]; + } + } + return false; + }; + })(), + + /** + * IE: URLs starting with: + * www., http://, https://, ftp://, gopher://, mailto:, new:, snews:, telnet:, wasis:, file://, + * nntp://, newsrc:, ldap://, ldaps://, outlook:, mic:// and url: + * will automatically be auto-linked when either the user inserts them via copy&paste or presses the + * space bar when the caret is directly after such an url. + * This behavior cannot easily be avoided in IE < 9 since the logic is hardcoded in the mshtml.dll + * (related blog post on msdn + * http://blogs.msdn.com/b/ieinternals/archive/2009/09/17/prevent-automatic-hyperlinking-in-contenteditable-html.aspx). + */ + doesAutoLinkingInContentEditable: function() { + return isIE(); + }, + + /** + * As stated above, IE auto links urls typed into contentEditable elements + * Since IE9 it's possible to prevent this behavior + */ + canDisableAutoLinking: function() { + return this.supportsCommand(document, "AutoUrlDetect"); + }, + + /** + * IE leaves an empty paragraph in the contentEditable element after clearing it + * Chrome/Safari sometimes an empty <div> + */ + clearsContentEditableCorrectly: function() { + return isGecko || isOpera || isWebKit; + }, + + /** + * IE gives wrong results for getAttribute + */ + supportsGetAttributeCorrectly: function() { + var td = document.createElement("td"); + return td.getAttribute("rowspan") != "1"; + }, + + /** + * When clicking on images in IE, Opera and Firefox, they are selected, which makes it easy to interact with them. + * Chrome and Safari both don't support this + */ + canSelectImagesInContentEditable: function() { + return isGecko || isIE() || isOpera; + }, + + /** + * All browsers except Safari and Chrome automatically scroll the range/caret position into view + */ + autoScrollsToCaret: function() { + return !isWebKit; + }, + + /** + * Check whether the browser automatically closes tags that don't need to be opened + */ + autoClosesUnclosedTags: function() { + var clonedTestElement = testElement.cloneNode(false), + returnValue, + innerHTML; + + clonedTestElement.innerHTML = "<p><div></div>"; + innerHTML = clonedTestElement.innerHTML.toLowerCase(); + returnValue = innerHTML === "<p></p><div></div>" || innerHTML === "<p><div></div></p>"; + + // Cache result by overwriting current function + this.autoClosesUnclosedTags = function() { return returnValue; }; + + return returnValue; + }, + + /** + * Whether the browser supports the native document.getElementsByClassName which returns live NodeLists + */ + supportsNativeGetElementsByClassName: function() { + return String(document.getElementsByClassName).indexOf("[native code]") !== -1; + }, + + /** + * As of now (19.04.2011) only supported by Firefox 4 and Chrome + * See https://developer.mozilla.org/en/DOM/Selection/modify + */ + supportsSelectionModify: function() { + return "getSelection" in window && "modify" in window.getSelection(); + }, + + /** + * Opera needs a white space after a <br> in order to position the caret correctly + */ + needsSpaceAfterLineBreak: function() { + return isOpera; + }, + + /** + * Whether the browser supports the speech api on the given element + * See http://mikepultz.com/2011/03/accessing-google-speech-api-chrome-11/ + * + * @example + * var input = document.createElement("input"); + * if (wysihtml5.browser.supportsSpeechApiOn(input)) { + * // ... + * } + */ + supportsSpeechApiOn: function(input) { + var chromeVersion = userAgent.match(/Chrome\/(\d+)/) || [undefined, 0]; + return chromeVersion[1] >= 11 && ("onwebkitspeechchange" in input || "speech" in input); + }, + + /** + * IE9 crashes when setting a getter via Object.defineProperty on XMLHttpRequest or XDomainRequest + * See https://connect.microsoft.com/ie/feedback/details/650112 + * or try the POC http://tifftiff.de/ie9_crash/ + */ + crashesWhenDefineProperty: function(property) { + return isIE(9) && (property === "XMLHttpRequest" || property === "XDomainRequest"); + }, + + /** + * IE is the only browser who fires the "focus" event not immediately when .focus() is called on an element + */ + doesAsyncFocus: function() { + return isIE(); + }, + + /** + * In IE it's impssible for the user and for the selection library to set the caret after an <img> when it's the lastChild in the document + */ + hasProblemsSettingCaretAfterImg: function() { + return isIE(); + }, + + hasUndoInContextMenu: function() { + return isGecko || isChrome || isOpera; + }, + + /** + * Opera sometimes doesn't insert the node at the right position when range.insertNode(someNode) + * is used (regardless if rangy or native) + * This especially happens when the caret is positioned right after a <br> because then + * insertNode() will insert the node right before the <br> + */ + hasInsertNodeIssue: function() { + return isOpera; + }, + + /** + * IE 8+9 don't fire the focus event of the <body> when the iframe gets focused (even though the caret gets set into the <body>) + */ + hasIframeFocusIssue: function() { + return isIE(); + }, + + /** + * Chrome + Safari create invalid nested markup after paste + * + * <p> + * foo + * <p>bar</p> <!-- BOO! --> + * </p> + */ + createsNestedInvalidMarkupAfterPaste: function() { + return isWebKit; + }, + + supportsMutationEvents: function() { + return ("MutationEvent" in window); + }, + + /** + IE (at least up to 11) does not support clipboardData on event. + It is on window but cannot return text/html + Should actually check for clipboardData on paste event, but cannot in firefox + */ + supportsModenPaste: function () { + return !("clipboardData" in window); + } + }; +})(); +;wysihtml5.lang.array = function(arr) { + return { + /** + * Check whether a given object exists in an array + * + * @example + * wysihtml5.lang.array([1, 2]).contains(1); + * // => true + * + * Can be used to match array with array. If intersection is found true is returned + */ + contains: function(needle) { + if (Array.isArray(needle)) { + for (var i = needle.length; i--;) { + if (wysihtml5.lang.array(arr).indexOf(needle[i]) !== -1) { + return true; + } + } + return false; + } else { + return wysihtml5.lang.array(arr).indexOf(needle) !== -1; + } + }, + + /** + * Check whether a given object exists in an array and return index + * If no elelemt found returns -1 + * + * @example + * wysihtml5.lang.array([1, 2]).indexOf(2); + * // => 1 + */ + indexOf: function(needle) { + if (arr.indexOf) { + return arr.indexOf(needle); + } else { + for (var i=0, length=arr.length; i<length; i++) { + if (arr[i] === needle) { return i; } + } + return -1; + } + }, + + /** + * Substract one array from another + * + * @example + * wysihtml5.lang.array([1, 2, 3, 4]).without([3, 4]); + * // => [1, 2] + */ + without: function(arrayToSubstract) { + arrayToSubstract = wysihtml5.lang.array(arrayToSubstract); + var newArr = [], + i = 0, + length = arr.length; + for (; i<length; i++) { + if (!arrayToSubstract.contains(arr[i])) { + newArr.push(arr[i]); + } + } + return newArr; + }, + + /** + * Return a clean native array + * + * Following will convert a Live NodeList to a proper Array + * @example + * var childNodes = wysihtml5.lang.array(document.body.childNodes).get(); + */ + get: function() { + var i = 0, + length = arr.length, + newArray = []; + for (; i<length; i++) { + newArray.push(arr[i]); + } + return newArray; + }, + + /** + * Creates a new array with the results of calling a provided function on every element in this array. + * optionally this can be provided as second argument + * + * @example + * var childNodes = wysihtml5.lang.array([1,2,3,4]).map(function (value, index, array) { + return value * 2; + * }); + * // => [2,4,6,8] + */ + map: function(callback, thisArg) { + if (Array.prototype.map) { + return arr.map(callback, thisArg); + } else { + var len = arr.length >>> 0, + A = new Array(len), + i = 0; + for (; i < len; i++) { + A[i] = callback.call(thisArg, arr[i], i, arr); + } + return A; + } + }, + + /* ReturnS new array without duplicate entries + * + * @example + * var uniq = wysihtml5.lang.array([1,2,3,2,1,4]).unique(); + * // => [1,2,3,4] + */ + unique: function() { + var vals = [], + max = arr.length, + idx = 0; + + while (idx < max) { + if (!wysihtml5.lang.array(vals).contains(arr[idx])) { + vals.push(arr[idx]); + } + idx++; + } + return vals; + } + + }; +}; +;wysihtml5.lang.Dispatcher = Base.extend( + /** @scope wysihtml5.lang.Dialog.prototype */ { + on: function(eventName, handler) { + this.events = this.events || {}; + this.events[eventName] = this.events[eventName] || []; + this.events[eventName].push(handler); + return this; + }, + + off: function(eventName, handler) { + this.events = this.events || {}; + var i = 0, + handlers, + newHandlers; + if (eventName) { + handlers = this.events[eventName] || [], + newHandlers = []; + for (; i<handlers.length; i++) { + if (handlers[i] !== handler && handler) { + newHandlers.push(handlers[i]); + } + } + this.events[eventName] = newHandlers; + } else { + // Clean up all events + this.events = {}; + } + return this; + }, + + fire: function(eventName, payload) { + this.events = this.events || {}; + var handlers = this.events[eventName] || [], + i = 0; + for (; i<handlers.length; i++) { + handlers[i].call(this, payload); + } + return this; + }, + + // deprecated, use .on() + observe: function() { + return this.on.apply(this, arguments); + }, + + // deprecated, use .off() + stopObserving: function() { + return this.off.apply(this, arguments); + } +}); +;wysihtml5.lang.object = function(obj) { + return { + /** + * @example + * wysihtml5.lang.object({ foo: 1, bar: 1 }).merge({ bar: 2, baz: 3 }).get(); + * // => { foo: 1, bar: 2, baz: 3 } + */ + merge: function(otherObj) { + for (var i in otherObj) { + obj[i] = otherObj[i]; + } + return this; + }, + + get: function() { + return obj; + }, + + /** + * @example + * wysihtml5.lang.object({ foo: 1 }).clone(); + * // => { foo: 1 } + * + * v0.4.14 adds options for deep clone : wysihtml5.lang.object({ foo: 1 }).clone(true); + */ + clone: function(deep) { + var newObj = {}, + i; + + if (obj === null || !wysihtml5.lang.object(obj).isPlainObject()) { + return obj; + } + + for (i in obj) { + if(obj.hasOwnProperty(i)) { + if (deep) { + newObj[i] = wysihtml5.lang.object(obj[i]).clone(deep); + } else { + newObj[i] = obj[i]; + } + } + } + return newObj; + }, + + /** + * @example + * wysihtml5.lang.object([]).isArray(); + * // => true + */ + isArray: function() { + return Object.prototype.toString.call(obj) === "[object Array]"; + }, + + /** + * @example + * wysihtml5.lang.object(function() {}).isFunction(); + * // => true + */ + isFunction: function() { + return Object.prototype.toString.call(obj) === '[object Function]'; + }, + + isPlainObject: function () { + return Object.prototype.toString.call(obj) === '[object Object]'; + } + }; +}; +;(function() { + var WHITE_SPACE_START = /^\s+/, + WHITE_SPACE_END = /\s+$/, + ENTITY_REG_EXP = /[&<>\t"]/g, + ENTITY_MAP = { + '&': '&amp;', + '<': '&lt;', + '>': '&gt;', + '"': "&quot;", + '\t':"&nbsp; " + }; + wysihtml5.lang.string = function(str) { + str = String(str); + return { + /** + * @example + * wysihtml5.lang.string(" foo ").trim(); + * // => "foo" + */ + trim: function() { + return str.replace(WHITE_SPACE_START, "").replace(WHITE_SPACE_END, ""); + }, + + /** + * @example + * wysihtml5.lang.string("Hello #{name}").interpolate({ name: "Christopher" }); + * // => "Hello Christopher" + */ + interpolate: function(vars) { + for (var i in vars) { + str = this.replace("#{" + i + "}").by(vars[i]); + } + return str; + }, + + /** + * @example + * wysihtml5.lang.string("Hello Tom").replace("Tom").with("Hans"); + * // => "Hello Hans" + */ + replace: function(search) { + return { + by: function(replace) { + return str.split(search).join(replace); + } + }; + }, + + /** + * @example + * wysihtml5.lang.string("hello<br>").escapeHTML(); + * // => "hello&lt;br&gt;" + */ + escapeHTML: function(linebreaks, convertSpaces) { + var html = str.replace(ENTITY_REG_EXP, function(c) { return ENTITY_MAP[c]; }); + if (linebreaks) { + html = html.replace(/(?:\r\n|\r|\n)/g, '<br />'); + } + if (convertSpaces) { + html = html.replace(/ /gi, "&nbsp; "); + } + return html; + } + }; + }; +})(); +;/** + * Find urls in descendant text nodes of an element and auto-links them + * Inspired by http://james.padolsey.com/javascript/find-and-replace-text-with-javascript/ + * + * @param {Element} element Container element in which to search for urls + * + * @example + * <div id="text-container">Please click here: www.google.com</div> + * <script>wysihtml5.dom.autoLink(document.getElementById("text-container"));</script> + */ +(function(wysihtml5) { + var /** + * Don't auto-link urls that are contained in the following elements: + */ + IGNORE_URLS_IN = wysihtml5.lang.array(["CODE", "PRE", "A", "SCRIPT", "HEAD", "TITLE", "STYLE"]), + /** + * revision 1: + * /(\S+\.{1}[^\s\,\.\!]+)/g + * + * revision 2: + * /(\b(((https?|ftp):\/\/)|(www\.))[-A-Z0-9+&@#\/%?=~_|!:,.;\[\]]*[-A-Z0-9+&@#\/%=~_|])/gim + * + * put this in the beginning if you don't wan't to match within a word + * (^|[\>\(\{\[\s\>]) + */ + URL_REG_EXP = /((https?:\/\/|www\.)[^\s<]{3,})/gi, + TRAILING_CHAR_REG_EXP = /([^\w\/\-](,?))$/i, + MAX_DISPLAY_LENGTH = 100, + BRACKETS = { ")": "(", "]": "[", "}": "{" }; + + function autoLink(element, ignoreInClasses) { + if (_hasParentThatShouldBeIgnored(element, ignoreInClasses)) { + return element; + } + + if (element === element.ownerDocument.documentElement) { + element = element.ownerDocument.body; + } + + return _parseNode(element, ignoreInClasses); + } + + /** + * This is basically a rebuild of + * the rails auto_link_urls text helper + */ + function _convertUrlsToLinks(str) { + return str.replace(URL_REG_EXP, function(match, url) { + var punctuation = (url.match(TRAILING_CHAR_REG_EXP) || [])[1] || "", + opening = BRACKETS[punctuation]; + url = url.replace(TRAILING_CHAR_REG_EXP, ""); + + if (url.split(opening).length > url.split(punctuation).length) { + url = url + punctuation; + punctuation = ""; + } + var realUrl = url, + displayUrl = url; + if (url.length > MAX_DISPLAY_LENGTH) { + displayUrl = displayUrl.substr(0, MAX_DISPLAY_LENGTH) + "..."; + } + // Add http prefix if necessary + if (realUrl.substr(0, 4) === "www.") { + realUrl = "http://" + realUrl; + } + + return '<a href="' + realUrl + '">' + displayUrl + '</a>' + punctuation; + }); + } + + /** + * Creates or (if already cached) returns a temp element + * for the given document object + */ + function _getTempElement(context) { + var tempElement = context._wysihtml5_tempElement; + if (!tempElement) { + tempElement = context._wysihtml5_tempElement = context.createElement("div"); + } + return tempElement; + } + + /** + * Replaces the original text nodes with the newly auto-linked dom tree + */ + function _wrapMatchesInNode(textNode) { + var parentNode = textNode.parentNode, + nodeValue = wysihtml5.lang.string(textNode.data).escapeHTML(), + tempElement = _getTempElement(parentNode.ownerDocument); + + // We need to insert an empty/temporary <span /> to fix IE quirks + // Elsewise IE would strip white space in the beginning + tempElement.innerHTML = "<span></span>" + _convertUrlsToLinks(nodeValue); + tempElement.removeChild(tempElement.firstChild); + + while (tempElement.firstChild) { + // inserts tempElement.firstChild before textNode + parentNode.insertBefore(tempElement.firstChild, textNode); + } + parentNode.removeChild(textNode); + } + + function _hasParentThatShouldBeIgnored(node, ignoreInClasses) { + var nodeName; + while (node.parentNode) { + node = node.parentNode; + nodeName = node.nodeName; + if (node.className && wysihtml5.lang.array(node.className.split(' ')).contains(ignoreInClasses)) { + return true; + } + if (IGNORE_URLS_IN.contains(nodeName)) { + return true; + } else if (nodeName === "body") { + return false; + } + } + return false; + } + + function _parseNode(element, ignoreInClasses) { + if (IGNORE_URLS_IN.contains(element.nodeName)) { + return; + } + + if (element.className && wysihtml5.lang.array(element.className.split(' ')).contains(ignoreInClasses)) { + return; + } + + if (element.nodeType === wysihtml5.TEXT_NODE && element.data.match(URL_REG_EXP)) { + _wrapMatchesInNode(element); + return; + } + + var childNodes = wysihtml5.lang.array(element.childNodes).get(), + childNodesLength = childNodes.length, + i = 0; + + for (; i<childNodesLength; i++) { + _parseNode(childNodes[i], ignoreInClasses); + } + + return element; + } + + wysihtml5.dom.autoLink = autoLink; + + // Reveal url reg exp to the outside + wysihtml5.dom.autoLink.URL_REG_EXP = URL_REG_EXP; +})(wysihtml5); +;(function(wysihtml5) { + var api = wysihtml5.dom; + + api.addClass = function(element, className) { + var classList = element.classList; + if (classList) { + return classList.add(className); + } + if (api.hasClass(element, className)) { + return; + } + element.className += " " + className; + }; + + api.removeClass = function(element, className) { + var classList = element.classList; + if (classList) { + return classList.remove(className); + } + + element.className = element.className.replace(new RegExp("(^|\\s+)" + className + "(\\s+|$)"), " "); + }; + + api.hasClass = function(element, className) { + var classList = element.classList; + if (classList) { + return classList.contains(className); + } + + var elementClassName = element.className; + return (elementClassName.length > 0 && (elementClassName == className || new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))); + }; +})(wysihtml5); +;wysihtml5.dom.contains = (function() { + var documentElement = document.documentElement; + if (documentElement.contains) { + return function(container, element) { + if (element.nodeType !== wysihtml5.ELEMENT_NODE) { + element = element.parentNode; + } + return container !== element && container.contains(element); + }; + } else if (documentElement.compareDocumentPosition) { + return function(container, element) { + // https://developer.mozilla.org/en/DOM/Node.compareDocumentPosition + return !!(container.compareDocumentPosition(element) & 16); + }; + } +})(); +;/** + * Converts an HTML fragment/element into a unordered/ordered list + * + * @param {Element} element The element which should be turned into a list + * @param {String} listType The list type in which to convert the tree (either "ul" or "ol") + * @return {Element} The created list + * + * @example + * <!-- Assume the following dom: --> + * <span id="pseudo-list"> + * eminem<br> + * dr. dre + * <div>50 Cent</div> + * </span> + * + * <script> + * wysihtml5.dom.convertToList(document.getElementById("pseudo-list"), "ul"); + * </script> + * + * <!-- Will result in: --> + * <ul> + * <li>eminem</li> + * <li>dr. dre</li> + * <li>50 Cent</li> + * </ul> + */ +wysihtml5.dom.convertToList = (function() { + function _createListItem(doc, list) { + var listItem = doc.createElement("li"); + list.appendChild(listItem); + return listItem; + } + + function _createList(doc, type) { + return doc.createElement(type); + } + + function convertToList(element, listType, uneditableClass) { + if (element.nodeName === "UL" || element.nodeName === "OL" || element.nodeName === "MENU") { + // Already a list + return element; + } + + var doc = element.ownerDocument, + list = _createList(doc, listType), + lineBreaks = element.querySelectorAll("br"), + lineBreaksLength = lineBreaks.length, + childNodes, + childNodesLength, + childNode, + lineBreak, + parentNode, + isBlockElement, + isLineBreak, + currentListItem, + i; + + // First find <br> at the end of inline elements and move them behind them + for (i=0; i<lineBreaksLength; i++) { + lineBreak = lineBreaks[i]; + while ((parentNode = lineBreak.parentNode) && parentNode !== element && parentNode.lastChild === lineBreak) { + if (wysihtml5.dom.getStyle("display").from(parentNode) === "block") { + parentNode.removeChild(lineBreak); + break; + } + wysihtml5.dom.insert(lineBreak).after(lineBreak.parentNode); + } + } + + childNodes = wysihtml5.lang.array(element.childNodes).get(); + childNodesLength = childNodes.length; + + for (i=0; i<childNodesLength; i++) { + currentListItem = currentListItem || _createListItem(doc, list); + childNode = childNodes[i]; + isBlockElement = wysihtml5.dom.getStyle("display").from(childNode) === "block"; + isLineBreak = childNode.nodeName === "BR"; + + // consider uneditable as an inline element + if (isBlockElement && (!uneditableClass || !wysihtml5.dom.hasClass(childNode, uneditableClass))) { + // Append blockElement to current <li> if empty, otherwise create a new one + currentListItem = currentListItem.firstChild ? _createListItem(doc, list) : currentListItem; + currentListItem.appendChild(childNode); + currentListItem = null; + continue; + } + + if (isLineBreak) { + // Only create a new list item in the next iteration when the current one has already content + currentListItem = currentListItem.firstChild ? null : currentListItem; + continue; + } + + currentListItem.appendChild(childNode); + } + + if (childNodes.length === 0) { + _createListItem(doc, list); + } + + element.parentNode.replaceChild(list, element); + return list; + } + + return convertToList; +})(); +;/** + * Copy a set of attributes from one element to another + * + * @param {Array} attributesToCopy List of attributes which should be copied + * @return {Object} Returns an object which offers the "from" method which can be invoked with the element where to + * copy the attributes from., this again returns an object which provides a method named "to" which can be invoked + * with the element where to copy the attributes to (see example) + * + * @example + * var textarea = document.querySelector("textarea"), + * div = document.querySelector("div[contenteditable=true]"), + * anotherDiv = document.querySelector("div.preview"); + * wysihtml5.dom.copyAttributes(["spellcheck", "value", "placeholder"]).from(textarea).to(div).andTo(anotherDiv); + * + */ +wysihtml5.dom.copyAttributes = function(attributesToCopy) { + return { + from: function(elementToCopyFrom) { + return { + to: function(elementToCopyTo) { + var attribute, + i = 0, + length = attributesToCopy.length; + for (; i<length; i++) { + attribute = attributesToCopy[i]; + if (typeof(elementToCopyFrom[attribute]) !== "undefined" && elementToCopyFrom[attribute] !== "") { + elementToCopyTo[attribute] = elementToCopyFrom[attribute]; + } + } + return { andTo: arguments.callee }; + } + }; + } + }; +}; +;/** + * Copy a set of styles from one element to another + * Please note that this only works properly across browsers when the element from which to copy the styles + * is in the dom + * + * Interesting article on how to copy styles + * + * @param {Array} stylesToCopy List of styles which should be copied + * @return {Object} Returns an object which offers the "from" method which can be invoked with the element where to + * copy the styles from., this again returns an object which provides a method named "to" which can be invoked + * with the element where to copy the styles to (see example) + * + * @example + * var textarea = document.querySelector("textarea"), + * div = document.querySelector("div[contenteditable=true]"), + * anotherDiv = document.querySelector("div.preview"); + * wysihtml5.dom.copyStyles(["overflow-y", "width", "height"]).from(textarea).to(div).andTo(anotherDiv); + * + */ +(function(dom) { + + /** + * Mozilla, WebKit and Opera recalculate the computed width when box-sizing: boder-box; is set + * So if an element has "width: 200px; -moz-box-sizing: border-box; border: 1px;" then + * its computed css width will be 198px + * + * See https://bugzilla.mozilla.org/show_bug.cgi?id=520992 + */ + var BOX_SIZING_PROPERTIES = ["-webkit-box-sizing", "-moz-box-sizing", "-ms-box-sizing", "box-sizing"]; + + var shouldIgnoreBoxSizingBorderBox = function(element) { + if (hasBoxSizingBorderBox(element)) { + return parseInt(dom.getStyle("width").from(element), 10) < element.offsetWidth; + } + return false; + }; + + var hasBoxSizingBorderBox = function(element) { + var i = 0, + length = BOX_SIZING_PROPERTIES.length; + for (; i<length; i++) { + if (dom.getStyle(BOX_SIZING_PROPERTIES[i]).from(element) === "border-box") { + return BOX_SIZING_PROPERTIES[i]; + } + } + }; + + dom.copyStyles = function(stylesToCopy) { + return { + from: function(element) { + if (shouldIgnoreBoxSizingBorderBox(element)) { + stylesToCopy = wysihtml5.lang.array(stylesToCopy).without(BOX_SIZING_PROPERTIES); + } + + var cssText = "", + length = stylesToCopy.length, + i = 0, + property; + for (; i<length; i++) { + property = stylesToCopy[i]; + cssText += property + ":" + dom.getStyle(property).from(element) + ";"; + } + + return { + to: function(element) { + dom.setStyles(cssText).on(element); + return { andTo: arguments.callee }; + } + }; + } + }; + }; +})(wysihtml5.dom); +;/** + * Event Delegation + * + * @example + * wysihtml5.dom.delegate(document.body, "a", "click", function() { + * // foo + * }); + */ +(function(wysihtml5) { + + wysihtml5.dom.delegate = function(container, selector, eventName, handler) { + return wysihtml5.dom.observe(container, eventName, function(event) { + var target = event.target, + match = wysihtml5.lang.array(container.querySelectorAll(selector)); + + while (target && target !== container) { + if (match.contains(target)) { + handler.call(target, event); + break; + } + target = target.parentNode; + } + }); + }; + +})(wysihtml5); +;// TODO: Refactor dom tree traversing here +(function(wysihtml5) { + wysihtml5.dom.domNode = function(node) { + var defaultNodeTypes = [wysihtml5.ELEMENT_NODE, wysihtml5.TEXT_NODE]; + + var _isBlankText = function(node) { + return node.nodeType === wysihtml5.TEXT_NODE && (/^\s*$/g).test(node.data); + }; + + return { + + // var node = wysihtml5.dom.domNode(element).prev({nodeTypes: [1,3], ignoreBlankTexts: true}); + prev: function(options) { + var prevNode = node.previousSibling, + types = (options && options.nodeTypes) ? options.nodeTypes : defaultNodeTypes; + + if (!prevNode) { + return null; + } + + if ( + (!wysihtml5.lang.array(types).contains(prevNode.nodeType)) || // nodeTypes check. + (options && options.ignoreBlankTexts && _isBlankText(prevNode)) // Blank text nodes bypassed if set + ) { + return wysihtml5.dom.domNode(prevNode).prev(options); + } + + return prevNode; + }, + + // var node = wysihtml5.dom.domNode(element).next({nodeTypes: [1,3], ignoreBlankTexts: true}); + next: function(options) { + var nextNode = node.nextSibling, + types = (options && options.nodeTypes) ? options.nodeTypes : defaultNodeTypes; + + if (!nextNode) { + return null; + } + + if ( + (!wysihtml5.lang.array(types).contains(nextNode.nodeType)) || // nodeTypes check. + (options && options.ignoreBlankTexts && _isBlankText(nextNode)) // blank text nodes bypassed if set + ) { + return wysihtml5.dom.domNode(nextNode).next(options); + } + + return nextNode; + } + + + + }; + }; +})(wysihtml5);;/** + * Returns the given html wrapped in a div element + * + * Fixing IE's inability to treat unknown elements (HTML5 section, article, ...) correctly + * when inserted via innerHTML + * + * @param {String} html The html which should be wrapped in a dom element + * @param {Obejct} [context] Document object of the context the html belongs to + * + * @example + * wysihtml5.dom.getAsDom("<article>foo</article>"); + */ +wysihtml5.dom.getAsDom = (function() { + + var _innerHTMLShiv = function(html, context) { + var tempElement = context.createElement("div"); + tempElement.style.display = "none"; + context.body.appendChild(tempElement); + // IE throws an exception when trying to insert <frameset></frameset> via innerHTML + try { tempElement.innerHTML = html; } catch(e) {} + context.body.removeChild(tempElement); + return tempElement; + }; + + /** + * Make sure IE supports HTML5 tags, which is accomplished by simply creating one instance of each element + */ + var _ensureHTML5Compatibility = function(context) { + if (context._wysihtml5_supportsHTML5Tags) { + return; + } + for (var i=0, length=HTML5_ELEMENTS.length; i<length; i++) { + context.createElement(HTML5_ELEMENTS[i]); + } + context._wysihtml5_supportsHTML5Tags = true; + }; + + + /** + * List of html5 tags + * taken from http://simon.html5.org/html5-elements + */ + var HTML5_ELEMENTS = [ + "abbr", "article", "aside", "audio", "bdi", "canvas", "command", "datalist", "details", "figcaption", + "figure", "footer", "header", "hgroup", "keygen", "mark", "meter", "nav", "output", "progress", + "rp", "rt", "ruby", "svg", "section", "source", "summary", "time", "track", "video", "wbr" + ]; + + return function(html, context) { + context = context || document; + var tempElement; + if (typeof(html) === "object" && html.nodeType) { + tempElement = context.createElement("div"); + tempElement.appendChild(html); + } else if (wysihtml5.browser.supportsHTML5Tags(context)) { + tempElement = context.createElement("div"); + tempElement.innerHTML = html; + } else { + _ensureHTML5Compatibility(context); + tempElement = _innerHTMLShiv(html, context); + } + return tempElement; + }; +})(); +;/** + * Walks the dom tree from the given node up until it finds a match + * Designed for optimal performance. + * + * @param {Element} node The from which to check the parent nodes + * @param {Object} matchingSet Object to match against (possible properties: nodeName, className, classRegExp) + * @param {Number} [levels] How many parents should the function check up from the current node (defaults to 50) + * @return {null|Element} Returns the first element that matched the desiredNodeName(s) + * @example + * var listElement = wysihtml5.dom.getParentElement(document.querySelector("li"), { nodeName: ["MENU", "UL", "OL"] }); + * // ... or ... + * var unorderedListElement = wysihtml5.dom.getParentElement(document.querySelector("li"), { nodeName: "UL" }); + * // ... or ... + * var coloredElement = wysihtml5.dom.getParentElement(myTextNode, { nodeName: "SPAN", className: "wysiwyg-color-red", classRegExp: /wysiwyg-color-[a-z]/g }); + */ +wysihtml5.dom.getParentElement = (function() { + + function _isSameNodeName(nodeName, desiredNodeNames) { + if (!desiredNodeNames || !desiredNodeNames.length) { + return true; + } + + if (typeof(desiredNodeNames) === "string") { + return nodeName === desiredNodeNames; + } else { + return wysihtml5.lang.array(desiredNodeNames).contains(nodeName); + } + } + + function _isElement(node) { + return node.nodeType === wysihtml5.ELEMENT_NODE; + } + + function _hasClassName(element, className, classRegExp) { + var classNames = (element.className || "").match(classRegExp) || []; + if (!className) { + return !!classNames.length; + } + return classNames[classNames.length - 1] === className; + } + + function _hasStyle(element, cssStyle, styleRegExp) { + var styles = (element.getAttribute('style') || "").match(styleRegExp) || []; + if (!cssStyle) { + return !!styles.length; + } + return styles[styles.length - 1] === cssStyle; + } + + return function(node, matchingSet, levels, container) { + var findByStyle = (matchingSet.cssStyle || matchingSet.styleRegExp), + findByClass = (matchingSet.className || matchingSet.classRegExp); + + levels = levels || 50; // Go max 50 nodes upwards from current node + + while (levels-- && node && node.nodeName !== "BODY" && (!container || node !== container)) { + if (_isElement(node) && _isSameNodeName(node.nodeName, matchingSet.nodeName) && + (!findByStyle || _hasStyle(node, matchingSet.cssStyle, matchingSet.styleRegExp)) && + (!findByClass || _hasClassName(node, matchingSet.className, matchingSet.classRegExp)) + ) { + return node; + } + node = node.parentNode; + } + return null; + }; +})(); +;/** + * Get element's style for a specific css property + * + * @param {Element} element The element on which to retrieve the style + * @param {String} property The CSS property to retrieve ("float", "display", "text-align", ...) + * + * @example + * wysihtml5.dom.getStyle("display").from(document.body); + * // => "block" + */ +wysihtml5.dom.getStyle = (function() { + var stylePropertyMapping = { + "float": ("styleFloat" in document.createElement("div").style) ? "styleFloat" : "cssFloat" + }, + REG_EXP_CAMELIZE = /\-[a-z]/g; + + function camelize(str) { + return str.replace(REG_EXP_CAMELIZE, function(match) { + return match.charAt(1).toUpperCase(); + }); + } + + return function(property) { + return { + from: function(element) { + if (element.nodeType !== wysihtml5.ELEMENT_NODE) { + return; + } + + var doc = element.ownerDocument, + camelizedProperty = stylePropertyMapping[property] || camelize(property), + style = element.style, + currentStyle = element.currentStyle, + styleValue = style[camelizedProperty]; + if (styleValue) { + return styleValue; + } + + // currentStyle is no standard and only supported by Opera and IE but it has one important advantage over the standard-compliant + // window.getComputedStyle, since it returns css property values in their original unit: + // If you set an elements width to "50%", window.getComputedStyle will give you it's current width in px while currentStyle + // gives you the original "50%". + // Opera supports both, currentStyle and window.getComputedStyle, that's why checking for currentStyle should have higher prio + if (currentStyle) { + try { + return currentStyle[camelizedProperty]; + } catch(e) { + //ie will occasionally fail for unknown reasons. swallowing exception + } + } + + var win = doc.defaultView || doc.parentWindow, + needsOverflowReset = (property === "height" || property === "width") && element.nodeName === "TEXTAREA", + originalOverflow, + returnValue; + + if (win.getComputedStyle) { + // Chrome and Safari both calculate a wrong width and height for textareas when they have scroll bars + // therfore we remove and restore the scrollbar and calculate the value in between + if (needsOverflowReset) { + originalOverflow = style.overflow; + style.overflow = "hidden"; + } + returnValue = win.getComputedStyle(element, null).getPropertyValue(property); + if (needsOverflowReset) { + style.overflow = originalOverflow || ""; + } + return returnValue; + } + } + }; + }; +})(); +;wysihtml5.dom.getTextNodes = function(node, ingoreEmpty){ + var all = []; + for (node=node.firstChild;node;node=node.nextSibling){ + if (node.nodeType == 3) { + if (!ingoreEmpty || !(/^\s*$/).test(node.innerText || node.textContent)) { + all.push(node); + } + } else { + all = all.concat(wysihtml5.dom.getTextNodes(node, ingoreEmpty)); + } + } + return all; +};;/** + * High performant way to check whether an element with a specific tag name is in the given document + * Optimized for being heavily executed + * Unleashes the power of live node lists + * + * @param {Object} doc The document object of the context where to check + * @param {String} tagName Upper cased tag name + * @example + * wysihtml5.dom.hasElementWithTagName(document, "IMG"); + */ +wysihtml5.dom.hasElementWithTagName = (function() { + var LIVE_CACHE = {}, + DOCUMENT_IDENTIFIER = 1; + + function _getDocumentIdentifier(doc) { + return doc._wysihtml5_identifier || (doc._wysihtml5_identifier = DOCUMENT_IDENTIFIER++); + } + + return function(doc, tagName) { + var key = _getDocumentIdentifier(doc) + ":" + tagName, + cacheEntry = LIVE_CACHE[key]; + if (!cacheEntry) { + cacheEntry = LIVE_CACHE[key] = doc.getElementsByTagName(tagName); + } + + return cacheEntry.length > 0; + }; +})(); +;/** + * High performant way to check whether an element with a specific class name is in the given document + * Optimized for being heavily executed + * Unleashes the power of live node lists + * + * @param {Object} doc The document object of the context where to check + * @param {String} tagName Upper cased tag name + * @example + * wysihtml5.dom.hasElementWithClassName(document, "foobar"); + */ +(function(wysihtml5) { + var LIVE_CACHE = {}, + DOCUMENT_IDENTIFIER = 1; + + function _getDocumentIdentifier(doc) { + return doc._wysihtml5_identifier || (doc._wysihtml5_identifier = DOCUMENT_IDENTIFIER++); + } + + wysihtml5.dom.hasElementWithClassName = function(doc, className) { + // getElementsByClassName is not supported by IE<9 + // but is sometimes mocked via library code (which then doesn't return live node lists) + if (!wysihtml5.browser.supportsNativeGetElementsByClassName()) { + return !!doc.querySelector("." + className); + } + + var key = _getDocumentIdentifier(doc) + ":" + className, + cacheEntry = LIVE_CACHE[key]; + if (!cacheEntry) { + cacheEntry = LIVE_CACHE[key] = doc.getElementsByClassName(className); + } + + return cacheEntry.length > 0; + }; +})(wysihtml5); +;wysihtml5.dom.insert = function(elementToInsert) { + return { + after: function(element) { + element.parentNode.insertBefore(elementToInsert, element.nextSibling); + }, + + before: function(element) { + element.parentNode.insertBefore(elementToInsert, element); + }, + + into: function(element) { + element.appendChild(elementToInsert); + } + }; +}; +;wysihtml5.dom.insertCSS = function(rules) { + rules = rules.join("\n"); + + return { + into: function(doc) { + var styleElement = doc.createElement("style"); + styleElement.type = "text/css"; + + if (styleElement.styleSheet) { + styleElement.styleSheet.cssText = rules; + } else { + styleElement.appendChild(doc.createTextNode(rules)); + } + + var link = doc.querySelector("head link"); + if (link) { + link.parentNode.insertBefore(styleElement, link); + return; + } else { + var head = doc.querySelector("head"); + if (head) { + head.appendChild(styleElement); + } + } + } + }; +}; +;// TODO: Refactor dom tree traversing here +(function(wysihtml5) { + wysihtml5.dom.lineBreaks = function(node) { + + function _isLineBreak(n) { + return n.nodeName === "BR"; + } + + /** + * Checks whether the elment causes a visual line break + * (<br> or block elements) + */ + function _isLineBreakOrBlockElement(element) { + if (_isLineBreak(element)) { + return true; + } + + if (wysihtml5.dom.getStyle("display").from(element) === "block") { + return true; + } + + return false; + } + + return { + + /* wysihtml5.dom.lineBreaks(element).add(); + * + * Adds line breaks before and after the given node if the previous and next siblings + * aren't already causing a visual line break (block element or <br>) + */ + add: function(options) { + var doc = node.ownerDocument, + nextSibling = wysihtml5.dom.domNode(node).next({ignoreBlankTexts: true}), + previousSibling = wysihtml5.dom.domNode(node).prev({ignoreBlankTexts: true}); + + if (nextSibling && !_isLineBreakOrBlockElement(nextSibling)) { + wysihtml5.dom.insert(doc.createElement("br")).after(node); + } + if (previousSibling && !_isLineBreakOrBlockElement(previousSibling)) { + wysihtml5.dom.insert(doc.createElement("br")).before(node); + } + }, + + /* wysihtml5.dom.lineBreaks(element).remove(); + * + * Removes line breaks before and after the given node + */ + remove: function(options) { + var nextSibling = wysihtml5.dom.domNode(node).next({ignoreBlankTexts: true}), + previousSibling = wysihtml5.dom.domNode(node).prev({ignoreBlankTexts: true}); + + if (nextSibling && _isLineBreak(nextSibling)) { + nextSibling.parentNode.removeChild(nextSibling); + } + if (previousSibling && _isLineBreak(previousSibling)) { + previousSibling.parentNode.removeChild(previousSibling); + } + } + }; + }; +})(wysihtml5);;/** + * Method to set dom events + * + * @example + * wysihtml5.dom.observe(iframe.contentWindow.document.body, ["focus", "blur"], function() { ... }); + */ +wysihtml5.dom.observe = function(element, eventNames, handler) { + eventNames = typeof(eventNames) === "string" ? [eventNames] : eventNames; + + var handlerWrapper, + eventName, + i = 0, + length = eventNames.length; + + for (; i<length; i++) { + eventName = eventNames[i]; + if (element.addEventListener) { + element.addEventListener(eventName, handler, false); + } else { + handlerWrapper = function(event) { + if (!("target" in event)) { + event.target = event.srcElement; + } + event.preventDefault = event.preventDefault || function() { + this.returnValue = false; + }; + event.stopPropagation = event.stopPropagation || function() { + this.cancelBubble = true; + }; + handler.call(element, event); + }; + element.attachEvent("on" + eventName, handlerWrapper); + } + } + + return { + stop: function() { + var eventName, + i = 0, + length = eventNames.length; + for (; i<length; i++) { + eventName = eventNames[i]; + if (element.removeEventListener) { + element.removeEventListener(eventName, handler, false); + } else { + element.detachEvent("on" + eventName, handlerWrapper); + } + } + } + }; +}; +;/** + * HTML Sanitizer + * Rewrites the HTML based on given rules + * + * @param {Element|String} elementOrHtml HTML String to be sanitized OR element whose content should be sanitized + * @param {Object} [rules] List of rules for rewriting the HTML, if there's no rule for an element it will + * be converted to a "span". Each rule is a key/value pair where key is the tag to convert, and value the + * desired substitution. + * @param {Object} context Document object in which to parse the html, needed to sandbox the parsing + * + * @return {Element|String} Depends on the elementOrHtml parameter. When html then the sanitized html as string elsewise the element. + * + * @example + * var userHTML = '<div id="foo" onclick="alert(1);"><p><font color="red">foo</font><script>alert(1);</script></p></div>'; + * wysihtml5.dom.parse(userHTML, { + * tags { + * p: "div", // Rename p tags to div tags + * font: "span" // Rename font tags to span tags + * div: true, // Keep them, also possible (same result when passing: "div" or true) + * script: undefined // Remove script elements + * } + * }); + * // => <div><div><span>foo bar</span></div></div> + * + * var userHTML = '<table><tbody><tr><td>I'm a table!</td></tr></tbody></table>'; + * wysihtml5.dom.parse(userHTML); + * // => '<span><span><span><span>I'm a table!</span></span></span></span>' + * + * var userHTML = '<div>foobar<br>foobar</div>'; + * wysihtml5.dom.parse(userHTML, { + * tags: { + * div: undefined, + * br: true + * } + * }); + * // => '' + * + * var userHTML = '<div class="red">foo</div><div class="pink">bar</div>'; + * wysihtml5.dom.parse(userHTML, { + * classes: { + * red: 1, + * green: 1 + * }, + * tags: { + * div: { + * rename_tag: "p" + * } + * } + * }); + * // => '<p class="red">foo</p><p>bar</p>' + */ + +wysihtml5.dom.parse = function(elementOrHtml_current, config_current) { + /* TODO: Currently escaped module pattern as otherwise folloowing default swill be shared among multiple editors. + * Refactor whole code as this method while workind is kind of awkward too */ + + /** + * It's not possible to use a XMLParser/DOMParser as HTML5 is not always well-formed XML + * new DOMParser().parseFromString('<img src="foo.gif">') will cause a parseError since the + * node isn't closed + * + * Therefore we've to use the browser's ordinary HTML parser invoked by setting innerHTML. + */ + var NODE_TYPE_MAPPING = { + "1": _handleElement, + "3": _handleText, + "8": _handleComment + }, + // Rename unknown tags to this + DEFAULT_NODE_NAME = "span", + WHITE_SPACE_REG_EXP = /\s+/, + defaultRules = { tags: {}, classes: {} }, + currentRules = {}; + + /** + * Iterates over all childs of the element, recreates them, appends them into a document fragment + * which later replaces the entire body content + */ + function parse(elementOrHtml, config) { + wysihtml5.lang.object(currentRules).merge(defaultRules).merge(config.rules).get(); + + var context = config.context || elementOrHtml.ownerDocument || document, + fragment = context.createDocumentFragment(), + isString = typeof(elementOrHtml) === "string", + clearInternals = false, + element, + newNode, + firstChild; + + if (config.clearInternals === true) { + clearInternals = true; + } + + if (isString) { + element = wysihtml5.dom.getAsDom(elementOrHtml, context); + } else { + element = elementOrHtml; + } + + if (currentRules.selectors) { + _applySelectorRules(element, currentRules.selectors); + } + + while (element.firstChild) { + firstChild = element.firstChild; + newNode = _convert(firstChild, config.cleanUp, clearInternals, config.uneditableClass); + if (newNode) { + fragment.appendChild(newNode); + } + if (firstChild !== newNode) { + element.removeChild(firstChild); + } + } + + if (config.unjoinNbsps) { + // replace joined non-breakable spaces with unjoined + var txtnodes = wysihtml5.dom.getTextNodes(fragment); + for (var n = txtnodes.length; n--;) { + txtnodes[n].nodeValue = txtnodes[n].nodeValue.replace(/([\S\u00A0])\u00A0/gi, "$1 "); + } + } + + // Clear element contents + element.innerHTML = ""; + + // Insert new DOM tree + element.appendChild(fragment); + + return isString ? wysihtml5.quirks.getCorrectInnerHTML(element) : element; + } + + function _convert(oldNode, cleanUp, clearInternals, uneditableClass) { + var oldNodeType = oldNode.nodeType, + oldChilds = oldNode.childNodes, + oldChildsLength = oldChilds.length, + method = NODE_TYPE_MAPPING[oldNodeType], + i = 0, + fragment, + newNode, + newChild; + + // Passes directly elemets with uneditable class + if (uneditableClass && oldNodeType === 1 && wysihtml5.dom.hasClass(oldNode, uneditableClass)) { + return oldNode; + } + + newNode = method && method(oldNode, clearInternals); + + // Remove or unwrap node in case of return value null or false + if (!newNode) { + if (newNode === false) { + // false defines that tag should be removed but contents should remain (unwrap) + fragment = oldNode.ownerDocument.createDocumentFragment(); + + for (i = oldChildsLength; i--;) { + if (oldChilds[i]) { + newChild = _convert(oldChilds[i], cleanUp, clearInternals, uneditableClass); + if (newChild) { + if (oldChilds[i] === newChild) { + i--; + } + fragment.insertBefore(newChild, fragment.firstChild); + } + } + } + + if (wysihtml5.dom.getStyle("display").from(oldNode) === "block") { + fragment.appendChild(oldNode.ownerDocument.createElement("br")); + } + + // TODO: try to minimize surplus spaces + if (wysihtml5.lang.array([ + "div", "pre", "p", + "table", "td", "th", + "ul", "ol", "li", + "dd", "dl", + "footer", "header", "section", + "h1", "h2", "h3", "h4", "h5", "h6" + ]).contains(oldNode.nodeName.toLowerCase()) && oldNode.parentNode.lastChild !== oldNode) { + // add space at first when unwraping non-textflow elements + if (!oldNode.nextSibling || oldNode.nextSibling.nodeType !== 3 || !(/^\s/).test(oldNode.nextSibling.nodeValue)) { + fragment.appendChild(oldNode.ownerDocument.createTextNode(" ")); + } + } + + if (fragment.normalize) { + fragment.normalize(); + } + return fragment; + } else { + // Remove + return null; + } + } + + // Converts all childnodes + for (i=0; i<oldChildsLength; i++) { + if (oldChilds[i]) { + newChild = _convert(oldChilds[i], cleanUp, clearInternals, uneditableClass); + if (newChild) { + if (oldChilds[i] === newChild) { + i--; + } + newNode.appendChild(newChild); + } + } + } + + // Cleanup senseless <span> elements + if (cleanUp && + newNode.nodeName.toLowerCase() === DEFAULT_NODE_NAME && + (!newNode.childNodes.length || + ((/^\s*$/gi).test(newNode.innerHTML) && (clearInternals || (oldNode.className !== "_wysihtml5-temp-placeholder" && oldNode.className !== "rangySelectionBoundary"))) || + !newNode.attributes.length) + ) { + fragment = newNode.ownerDocument.createDocumentFragment(); + while (newNode.firstChild) { + fragment.appendChild(newNode.firstChild); + } + if (fragment.normalize) { + fragment.normalize(); + } + return fragment; + } + + if (newNode.normalize) { + newNode.normalize(); + } + return newNode; + } + + function _applySelectorRules (element, selectorRules) { + var sel, method, els; + + for (sel in selectorRules) { + if (selectorRules.hasOwnProperty(sel)) { + if (wysihtml5.lang.object(selectorRules[sel]).isFunction()) { + method = selectorRules[sel]; + } else if (typeof(selectorRules[sel]) === "string" && elementHandlingMethods[selectorRules[sel]]) { + method = elementHandlingMethods[selectorRules[sel]]; + } + els = element.querySelectorAll(sel); + for (var i = els.length; i--;) { + method(els[i]); + } + } + } + } + + function _handleElement(oldNode, clearInternals) { + var rule, + newNode, + tagRules = currentRules.tags, + nodeName = oldNode.nodeName.toLowerCase(), + scopeName = oldNode.scopeName, + renameTag; + + /** + * We already parsed that element + * ignore it! (yes, this sometimes happens in IE8 when the html is invalid) + */ + if (oldNode._wysihtml5) { + return null; + } + oldNode._wysihtml5 = 1; + + if (oldNode.className === "wysihtml5-temp") { + return null; + } + + /** + * IE is the only browser who doesn't include the namespace in the + * nodeName, that's why we have to prepend it by ourselves + * scopeName is a proprietary IE feature + * read more here http://msdn.microsoft.com/en-us/library/ms534388(v=vs.85).aspx + */ + if (scopeName && scopeName != "HTML") { + nodeName = scopeName + ":" + nodeName; + } + /** + * Repair node + * IE is a bit bitchy when it comes to invalid nested markup which includes unclosed tags + * A <p> doesn't need to be closed according HTML4-5 spec, we simply replace it with a <div> to preserve its content and layout + */ + if ("outerHTML" in oldNode) { + if (!wysihtml5.browser.autoClosesUnclosedTags() && + oldNode.nodeName === "P" && + oldNode.outerHTML.slice(-4).toLowerCase() !== "</p>") { + nodeName = "div"; + } + } + + if (nodeName in tagRules) { + rule = tagRules[nodeName]; + if (!rule || rule.remove) { + return null; + } else if (rule.unwrap) { + return false; + } + rule = typeof(rule) === "string" ? { rename_tag: rule } : rule; + } else if (oldNode.firstChild) { + rule = { rename_tag: DEFAULT_NODE_NAME }; + } else { + // Remove empty unknown elements + return null; + } + + // tests if type condition is met or node should be removed/unwrapped/renamed + if (rule.one_of_type && !_testTypes(oldNode, currentRules, rule.one_of_type, clearInternals)) { + if (rule.remove_action) { + if (rule.remove_action === "unwrap") { + return false; + } else if (rule.remove_action === "rename") { + renameTag = rule.remove_action_rename_to || DEFAULT_NODE_NAME; + } else { + return null; + } + } else { + return null; + } + } + + newNode = oldNode.ownerDocument.createElement(renameTag || rule.rename_tag || nodeName); + _handleAttributes(oldNode, newNode, rule, clearInternals); + _handleStyles(oldNode, newNode, rule); + + oldNode = null; + + if (newNode.normalize) { newNode.normalize(); } + return newNode; + } + + function _testTypes(oldNode, rules, types, clearInternals) { + var definition, type; + + // do not interfere with placeholder span or pasting caret position is not maintained + if (oldNode.nodeName === "SPAN" && !clearInternals && (oldNode.className === "_wysihtml5-temp-placeholder" || oldNode.className === "rangySelectionBoundary")) { + return true; + } + + for (type in types) { + if (types.hasOwnProperty(type) && rules.type_definitions && rules.type_definitions[type]) { + definition = rules.type_definitions[type]; + if (_testType(oldNode, definition)) { + return true; + } + } + } + return false; + } + + function array_contains(a, obj) { + var i = a.length; + while (i--) { + if (a[i] === obj) { + return true; + } + } + return false; + } + + function _testType(oldNode, definition) { + + var nodeClasses = oldNode.getAttribute("class"), + nodeStyles = oldNode.getAttribute("style"), + classesLength, s, s_corrected, a, attr, currentClass, styleProp; + + // test for methods + if (definition.methods) { + for (var m in definition.methods) { + if (definition.methods.hasOwnProperty(m) && typeCeckMethods[m]) { + + if (typeCeckMethods[m](oldNode)) { + return true; + } + } + } + } + + // test for classes, if one found return true + if (nodeClasses && definition.classes) { + nodeClasses = nodeClasses.replace(/^\s+/g, '').replace(/\s+$/g, '').split(WHITE_SPACE_REG_EXP); + classesLength = nodeClasses.length; + for (var i = 0; i < classesLength; i++) { + if (definition.classes[nodeClasses[i]]) { + return true; + } + } + } + + // test for styles, if one found return true + if (nodeStyles && definition.styles) { + + nodeStyles = nodeStyles.split(';'); + for (s in definition.styles) { + if (definition.styles.hasOwnProperty(s)) { + for (var sp = nodeStyles.length; sp--;) { + styleProp = nodeStyles[sp].split(':'); + + if (styleProp[0].replace(/\s/g, '').toLowerCase() === s) { + if (definition.styles[s] === true || definition.styles[s] === 1 || wysihtml5.lang.array(definition.styles[s]).contains(styleProp[1].replace(/\s/g, '').toLowerCase()) ) { + return true; + } + } + } + } + } + } + + // test for attributes in general against regex match + if (definition.attrs) { + for (a in definition.attrs) { + if (definition.attrs.hasOwnProperty(a)) { + attr = wysihtml5.dom.getAttribute(oldNode, a); + if (typeof(attr) === "string") { + if (attr.search(definition.attrs[a]) > -1) { + return true; + } + } + } + } + } + return false; + } + + function _handleStyles(oldNode, newNode, rule) { + var s, v; + if(rule && rule.keep_styles) { + for (s in rule.keep_styles) { + if (rule.keep_styles.hasOwnProperty(s)) { + v = (s === "float") ? oldNode.style.styleFloat || oldNode.style.cssFloat : oldNode.style[s]; + // value can be regex and if so should match or style skipped + if (rule.keep_styles[s] instanceof RegExp && !(rule.keep_styles[s].test(v))) { + continue; + } + if (s === "float") { + // IE compability + newNode.style[(oldNode.style.styleFloat) ? 'styleFloat': 'cssFloat'] = v; + } else if (oldNode.style[s]) { + newNode.style[s] = v; + } + } + } + } + }; + + function _getAttributesBeginningWith(beginning, attributes) { + var returnAttributes = []; + for (var attr in attributes) { + if (attributes.hasOwnProperty(attr) && attr.indexOf(beginning) === 0) { + returnAttributes.push(attr); + } + } + return returnAttributes; + } + + function _checkAttribute(attributeName, attributeValue, methodName, nodeName) { + var method = attributeCheckMethods[methodName], + newAttributeValue; + + if (method) { + if (attributeValue || (attributeName === "alt" && nodeName == "IMG")) { + newAttributeValue = method(attributeValue); + if (typeof(newAttributeValue) === "string") { + return newAttributeValue; + } + } + } + + return false; + } + + function _checkAttributes(oldNode, local_attributes) { + var globalAttributes = wysihtml5.lang.object(currentRules.attributes || {}).clone(), // global values for check/convert values of attributes + checkAttributes = wysihtml5.lang.object(globalAttributes).merge( wysihtml5.lang.object(local_attributes || {}).clone()).get(), + attributes = {}, + oldAttributes = wysihtml5.dom.getAttributes(oldNode), + attributeName, newValue, matchingAttributes; + + for (attributeName in checkAttributes) { + if ((/\*$/).test(attributeName)) { + + matchingAttributes = _getAttributesBeginningWith(attributeName.slice(0,-1), oldAttributes); + for (var i = 0, imax = matchingAttributes.length; i < imax; i++) { + + newValue = _checkAttribute(matchingAttributes[i], oldAttributes[matchingAttributes[i]], checkAttributes[attributeName], oldNode.nodeName); + if (newValue !== false) { + attributes[matchingAttributes[i]] = newValue; + } + } + } else { + newValue = _checkAttribute(attributeName, oldAttributes[attributeName], checkAttributes[attributeName], oldNode.nodeName); + if (newValue !== false) { + attributes[attributeName] = newValue; + } + } + } + + return attributes; + } + + // TODO: refactor. Too long to read + function _handleAttributes(oldNode, newNode, rule, clearInternals) { + var attributes = {}, // fresh new set of attributes to set on newNode + setClass = rule.set_class, // classes to set + addClass = rule.add_class, // add classes based on existing attributes + addStyle = rule.add_style, // add styles based on existing attributes + setAttributes = rule.set_attributes, // attributes to set on the current node + allowedClasses = currentRules.classes, + i = 0, + classes = [], + styles = [], + newClasses = [], + oldClasses = [], + classesLength, + newClassesLength, + currentClass, + newClass, + attributeName, + method; + + if (setAttributes) { + attributes = wysihtml5.lang.object(setAttributes).clone(); + } + + // check/convert values of attributes + attributes = wysihtml5.lang.object(attributes).merge(_checkAttributes(oldNode, rule.check_attributes)).get(); + + if (setClass) { + classes.push(setClass); + } + + if (addClass) { + for (attributeName in addClass) { + method = addClassMethods[addClass[attributeName]]; + if (!method) { + continue; + } + newClass = method(wysihtml5.dom.getAttribute(oldNode, attributeName)); + if (typeof(newClass) === "string") { + classes.push(newClass); + } + } + } + + if (addStyle) { + for (attributeName in addStyle) { + method = addStyleMethods[addStyle[attributeName]]; + if (!method) { + continue; + } + + newStyle = method(wysihtml5.dom.getAttribute(oldNode, attributeName)); + if (typeof(newStyle) === "string") { + styles.push(newStyle); + } + } + } + + + if (typeof(allowedClasses) === "string" && allowedClasses === "any" && oldNode.getAttribute("class")) { + if (currentRules.classes_blacklist) { + oldClasses = oldNode.getAttribute("class"); + if (oldClasses) { + classes = classes.concat(oldClasses.split(WHITE_SPACE_REG_EXP)); + } + + classesLength = classes.length; + for (; i<classesLength; i++) { + currentClass = classes[i]; + if (!currentRules.classes_blacklist[currentClass]) { + newClasses.push(currentClass); + } + } + + if (newClasses.length) { + attributes["class"] = wysihtml5.lang.array(newClasses).unique().join(" "); + } + + } else { + attributes["class"] = oldNode.getAttribute("class"); + } + } else { + // make sure that wysihtml5 temp class doesn't get stripped out + if (!clearInternals) { + allowedClasses["_wysihtml5-temp-placeholder"] = 1; + allowedClasses["_rangySelectionBoundary"] = 1; + allowedClasses["wysiwyg-tmp-selected-cell"] = 1; + } + + // add old classes last + oldClasses = oldNode.getAttribute("class"); + if (oldClasses) { + classes = classes.concat(oldClasses.split(WHITE_SPACE_REG_EXP)); + } + classesLength = classes.length; + for (; i<classesLength; i++) { + currentClass = classes[i]; + if (allowedClasses[currentClass]) { + newClasses.push(currentClass); + } + } + + if (newClasses.length) { + attributes["class"] = wysihtml5.lang.array(newClasses).unique().join(" "); + } + } + + // remove table selection class if present + if (attributes["class"] && clearInternals) { + attributes["class"] = attributes["class"].replace("wysiwyg-tmp-selected-cell", ""); + if ((/^\s*$/g).test(attributes["class"])) { + delete attributes["class"]; + } + } + + if (styles.length) { + attributes["style"] = wysihtml5.lang.array(styles).unique().join(" "); + } + + // set attributes on newNode + for (attributeName in attributes) { + // Setting attributes can cause a js error in IE under certain circumstances + // eg. on a <img> under https when it's new attribute value is non-https + // TODO: Investigate this further and check for smarter handling + try { + newNode.setAttribute(attributeName, attributes[attributeName]); + } catch(e) {} + } + + // IE8 sometimes loses the width/height attributes when those are set before the "src" + // so we make sure to set them again + if (attributes.src) { + if (typeof(attributes.width) !== "undefined") { + newNode.setAttribute("width", attributes.width); + } + if (typeof(attributes.height) !== "undefined") { + newNode.setAttribute("height", attributes.height); + } + } + } + + var INVISIBLE_SPACE_REG_EXP = /\uFEFF/g; + function _handleText(oldNode) { + var nextSibling = oldNode.nextSibling; + if (nextSibling && nextSibling.nodeType === wysihtml5.TEXT_NODE) { + // Concatenate text nodes + nextSibling.data = oldNode.data.replace(INVISIBLE_SPACE_REG_EXP, "") + nextSibling.data.replace(INVISIBLE_SPACE_REG_EXP, ""); + } else { + // \uFEFF = wysihtml5.INVISIBLE_SPACE (used as a hack in certain rich text editing situations) + var data = oldNode.data.replace(INVISIBLE_SPACE_REG_EXP, ""); + return oldNode.ownerDocument.createTextNode(data); + } + } + + function _handleComment(oldNode) { + if (currentRules.comments) { + return oldNode.ownerDocument.createComment(oldNode.nodeValue); + } + } + + // ------------ attribute checks ------------ \\ + var attributeCheckMethods = { + url: (function() { + var REG_EXP = /^https?:\/\//i; + return function(attributeValue) { + if (!attributeValue || !attributeValue.match(REG_EXP)) { + return null; + } + return attributeValue.replace(REG_EXP, function(match) { + return match.toLowerCase(); + }); + }; + })(), + + src: (function() { + var REG_EXP = /^(\/|https?:\/\/)/i; + return function(attributeValue) { + if (!attributeValue || !attributeValue.match(REG_EXP)) { + return null; + } + return attributeValue.replace(REG_EXP, function(match) { + return match.toLowerCase(); + }); + }; + })(), + + href: (function() { + var REG_EXP = /^(#|\/|https?:\/\/|mailto:)/i; + return function(attributeValue) { + if (!attributeValue || !attributeValue.match(REG_EXP)) { + return null; + } + return attributeValue.replace(REG_EXP, function(match) { + return match.toLowerCase(); + }); + }; + })(), + + alt: (function() { + var REG_EXP = /[^ a-z0-9_\-]/gi; + return function(attributeValue) { + if (!attributeValue) { + return ""; + } + return attributeValue.replace(REG_EXP, ""); + }; + })(), + + numbers: (function() { + var REG_EXP = /\D/g; + return function(attributeValue) { + attributeValue = (attributeValue || "").replace(REG_EXP, ""); + return attributeValue || null; + }; + })(), + + any: (function() { + return function(attributeValue) { + return attributeValue; + }; + })() + }; + + // ------------ style converter (converts an html attribute to a style) ------------ \\ + var addStyleMethods = { + align_text: (function() { + var mapping = { + left: "text-align: left;", + right: "text-align: right;", + center: "text-align: center;" + }; + return function(attributeValue) { + return mapping[String(attributeValue).toLowerCase()]; + }; + })(), + }; + + // ------------ class converter (converts an html attribute to a class name) ------------ \\ + var addClassMethods = { + align_img: (function() { + var mapping = { + left: "wysiwyg-float-left", + right: "wysiwyg-float-right" + }; + return function(attributeValue) { + return mapping[String(attributeValue).toLowerCase()]; + }; + })(), + + align_text: (function() { + var mapping = { + left: "wysiwyg-text-align-left", + right: "wysiwyg-text-align-right", + center: "wysiwyg-text-align-center", + justify: "wysiwyg-text-align-justify" + }; + return function(attributeValue) { + return mapping[String(attributeValue).toLowerCase()]; + }; + })(), + + clear_br: (function() { + var mapping = { + left: "wysiwyg-clear-left", + right: "wysiwyg-clear-right", + both: "wysiwyg-clear-both", + all: "wysiwyg-clear-both" + }; + return function(attributeValue) { + return mapping[String(attributeValue).toLowerCase()]; + }; + })(), + + size_font: (function() { + var mapping = { + "1": "wysiwyg-font-size-xx-small", + "2": "wysiwyg-font-size-small", + "3": "wysiwyg-font-size-medium", + "4": "wysiwyg-font-size-large", + "5": "wysiwyg-font-size-x-large", + "6": "wysiwyg-font-size-xx-large", + "7": "wysiwyg-font-size-xx-large", + "-": "wysiwyg-font-size-smaller", + "+": "wysiwyg-font-size-larger" + }; + return function(attributeValue) { + return mapping[String(attributeValue).charAt(0)]; + }; + })() + }; + + // checks if element is possibly visible + var typeCeckMethods = { + has_visible_contet: (function() { + var txt, + isVisible = false, + visibleElements = ['img', 'video', 'picture', 'br', 'script', 'noscript', + 'style', 'table', 'iframe', 'object', 'embed', 'audio', + 'svg', 'input', 'button', 'select','textarea', 'canvas']; + + return function(el) { + + // has visible innertext. so is visible + txt = (el.innerText || el.textContent).replace(/\s/g, ''); + if (txt && txt.length > 0) { + return true; + } + + // matches list of visible dimensioned elements + for (var i = visibleElements.length; i--;) { + if (el.querySelector(visibleElements[i])) { + return true; + } + } + + // try to measure dimesions in last resort. (can find only of elements in dom) + if (el.offsetWidth && el.offsetWidth > 0 && el.offsetHeight && el.offsetHeight > 0) { + return true; + } + + return false; + }; + })() + }; + + var elementHandlingMethods = { + unwrap: function (element) { + wysihtml5.dom.unwrap(element); + }, + + remove: function (element) { + element.parentNode.removeChild(element); + } + }; + + return parse(elementOrHtml_current, config_current); +}; +;/** + * Checks for empty text node childs and removes them + * + * @param {Element} node The element in which to cleanup + * @example + * wysihtml5.dom.removeEmptyTextNodes(element); + */ +wysihtml5.dom.removeEmptyTextNodes = function(node) { + var childNode, + childNodes = wysihtml5.lang.array(node.childNodes).get(), + childNodesLength = childNodes.length, + i = 0; + for (; i<childNodesLength; i++) { + childNode = childNodes[i]; + if (childNode.nodeType === wysihtml5.TEXT_NODE && childNode.data === "") { + childNode.parentNode.removeChild(childNode); + } + } +}; +;/** + * Renames an element (eg. a <div> to a <p>) and keeps its childs + * + * @param {Element} element The list element which should be renamed + * @param {Element} newNodeName The desired tag name + * + * @example + * <!-- Assume the following dom: --> + * <ul id="list"> + * <li>eminem</li> + * <li>dr. dre</li> + * <li>50 Cent</li> + * </ul> + * + * <script> + * wysihtml5.dom.renameElement(document.getElementById("list"), "ol"); + * </script> + * + * <!-- Will result in: --> + * <ol> + * <li>eminem</li> + * <li>dr. dre</li> + * <li>50 Cent</li> + * </ol> + */ +wysihtml5.dom.renameElement = function(element, newNodeName) { + var newElement = element.ownerDocument.createElement(newNodeName), + firstChild; + while (firstChild = element.firstChild) { + newElement.appendChild(firstChild); + } + wysihtml5.dom.copyAttributes(["align", "className"]).from(element).to(newElement); + element.parentNode.replaceChild(newElement, element); + return newElement; +}; +;/** + * Takes an element, removes it and replaces it with it's childs + * + * @param {Object} node The node which to replace with it's child nodes + * @example + * <div id="foo"> + * <span>hello</span> + * </div> + * <script> + * // Remove #foo and replace with it's children + * wysihtml5.dom.replaceWithChildNodes(document.getElementById("foo")); + * </script> + */ +wysihtml5.dom.replaceWithChildNodes = function(node) { + if (!node.parentNode) { + return; + } + + if (!node.firstChild) { + node.parentNode.removeChild(node); + return; + } + + var fragment = node.ownerDocument.createDocumentFragment(); + while (node.firstChild) { + fragment.appendChild(node.firstChild); + } + node.parentNode.replaceChild(fragment, node); + node = fragment = null; +}; +;/** + * Unwraps an unordered/ordered list + * + * @param {Element} element The list element which should be unwrapped + * + * @example + * <!-- Assume the following dom: --> + * <ul id="list"> + * <li>eminem</li> + * <li>dr. dre</li> + * <li>50 Cent</li> + * </ul> + * + * <script> + * wysihtml5.dom.resolveList(document.getElementById("list")); + * </script> + * + * <!-- Will result in: --> + * eminem<br> + * dr. dre<br> + * 50 Cent<br> + */ +(function(dom) { + function _isBlockElement(node) { + return dom.getStyle("display").from(node) === "block"; + } + + function _isLineBreak(node) { + return node.nodeName === "BR"; + } + + function _appendLineBreak(element) { + var lineBreak = element.ownerDocument.createElement("br"); + element.appendChild(lineBreak); + } + + function resolveList(list, useLineBreaks) { + if (!list.nodeName.match(/^(MENU|UL|OL)$/)) { + return; + } + + var doc = list.ownerDocument, + fragment = doc.createDocumentFragment(), + previousSibling = wysihtml5.dom.domNode(list).prev({ignoreBlankTexts: true}), + firstChild, + lastChild, + isLastChild, + shouldAppendLineBreak, + paragraph, + listItem; + + if (useLineBreaks) { + // Insert line break if list is after a non-block element + if (previousSibling && !_isBlockElement(previousSibling) && !_isLineBreak(previousSibling)) { + _appendLineBreak(fragment); + } + + while (listItem = (list.firstElementChild || list.firstChild)) { + lastChild = listItem.lastChild; + while (firstChild = listItem.firstChild) { + isLastChild = firstChild === lastChild; + // This needs to be done before appending it to the fragment, as it otherwise will lose style information + shouldAppendLineBreak = isLastChild && !_isBlockElement(firstChild) && !_isLineBreak(firstChild); + fragment.appendChild(firstChild); + if (shouldAppendLineBreak) { + _appendLineBreak(fragment); + } + } + + listItem.parentNode.removeChild(listItem); + } + } else { + while (listItem = (list.firstElementChild || list.firstChild)) { + if (listItem.querySelector && listItem.querySelector("div, p, ul, ol, menu, blockquote, h1, h2, h3, h4, h5, h6")) { + while (firstChild = listItem.firstChild) { + fragment.appendChild(firstChild); + } + } else { + paragraph = doc.createElement("p"); + while (firstChild = listItem.firstChild) { + paragraph.appendChild(firstChild); + } + fragment.appendChild(paragraph); + } + listItem.parentNode.removeChild(listItem); + } + } + + list.parentNode.replaceChild(fragment, list); + } + + dom.resolveList = resolveList; +})(wysihtml5.dom); +;/** + * Sandbox for executing javascript, parsing css styles and doing dom operations in a secure way + * + * Browser Compatibility: + * - Secure in MSIE 6+, but only when the user hasn't made changes to his security level "restricted" + * - Partially secure in other browsers (Firefox, Opera, Safari, Chrome, ...) + * + * Please note that this class can't benefit from the HTML5 sandbox attribute for the following reasons: + * - sandboxing doesn't work correctly with inlined content (src="javascript:'<html>...</html>'") + * - sandboxing of physical documents causes that the dom isn't accessible anymore from the outside (iframe.contentWindow, ...) + * - setting the "allow-same-origin" flag would fix that, but then still javascript and dom events refuse to fire + * - therefore the "allow-scripts" flag is needed, which then would deactivate any security, as the js executed inside the iframe + * can do anything as if the sandbox attribute wasn't set + * + * @param {Function} [readyCallback] Method that gets invoked when the sandbox is ready + * @param {Object} [config] Optional parameters + * + * @example + * new wysihtml5.dom.Sandbox(function(sandbox) { + * sandbox.getWindow().document.body.innerHTML = '<img src=foo.gif onerror="alert(document.cookie)">'; + * }); + */ +(function(wysihtml5) { + var /** + * Default configuration + */ + doc = document, + /** + * Properties to unset/protect on the window object + */ + windowProperties = [ + "parent", "top", "opener", "frameElement", "frames", + "localStorage", "globalStorage", "sessionStorage", "indexedDB" + ], + /** + * Properties on the window object which are set to an empty function + */ + windowProperties2 = [ + "open", "close", "openDialog", "showModalDialog", + "alert", "confirm", "prompt", + "openDatabase", "postMessage", + "XMLHttpRequest", "XDomainRequest" + ], + /** + * Properties to unset/protect on the document object + */ + documentProperties = [ + "referrer", + "write", "open", "close" + ]; + + wysihtml5.dom.Sandbox = Base.extend( + /** @scope wysihtml5.dom.Sandbox.prototype */ { + + constructor: function(readyCallback, config) { + this.callback = readyCallback || wysihtml5.EMPTY_FUNCTION; + this.config = wysihtml5.lang.object({}).merge(config).get(); + this.editableArea = this._createIframe(); + }, + + insertInto: function(element) { + if (typeof(element) === "string") { + element = doc.getElementById(element); + } + + element.appendChild(this.editableArea); + }, + + getIframe: function() { + return this.editableArea; + }, + + getWindow: function() { + this._readyError(); + }, + + getDocument: function() { + this._readyError(); + }, + + destroy: function() { + var iframe = this.getIframe(); + iframe.parentNode.removeChild(iframe); + }, + + _readyError: function() { + throw new Error("wysihtml5.Sandbox: Sandbox iframe isn't loaded yet"); + }, + + /** + * Creates the sandbox iframe + * + * Some important notes: + * - We can't use HTML5 sandbox for now: + * setting it causes that the iframe's dom can't be accessed from the outside + * Therefore we need to set the "allow-same-origin" flag which enables accessing the iframe's dom + * But then there's another problem, DOM events (focus, blur, change, keypress, ...) aren't fired. + * In order to make this happen we need to set the "allow-scripts" flag. + * A combination of allow-scripts and allow-same-origin is almost the same as setting no sandbox attribute at all. + * - Chrome & Safari, doesn't seem to support sandboxing correctly when the iframe's html is inlined (no physical document) + * - IE needs to have the security="restricted" attribute set before the iframe is + * inserted into the dom tree + * - Believe it or not but in IE "security" in document.createElement("iframe") is false, even + * though it supports it + * - When an iframe has security="restricted", in IE eval() & execScript() don't work anymore + * - IE doesn't fire the onload event when the content is inlined in the src attribute, therefore we rely + * on the onreadystatechange event + */ + _createIframe: function() { + var that = this, + iframe = doc.createElement("iframe"); + iframe.className = "wysihtml5-sandbox"; + wysihtml5.dom.setAttributes({ + "security": "restricted", + "allowtransparency": "true", + "frameborder": 0, + "width": 0, + "height": 0, + "marginwidth": 0, + "marginheight": 0 + }).on(iframe); + + // Setting the src like this prevents ssl warnings in IE6 + if (wysihtml5.browser.throwsMixedContentWarningWhenIframeSrcIsEmpty()) { + iframe.src = "javascript:'<html></html>'"; + } + + iframe.onload = function() { + iframe.onreadystatechange = iframe.onload = null; + that._onLoadIframe(iframe); + }; + + iframe.onreadystatechange = function() { + if (/loaded|complete/.test(iframe.readyState)) { + iframe.onreadystatechange = iframe.onload = null; + that._onLoadIframe(iframe); + } + }; + + return iframe; + }, + + /** + * Callback for when the iframe has finished loading + */ + _onLoadIframe: function(iframe) { + // don't resume when the iframe got unloaded (eg. by removing it from the dom) + if (!wysihtml5.dom.contains(doc.documentElement, iframe)) { + return; + } + + var that = this, + iframeWindow = iframe.contentWindow, + iframeDocument = iframe.contentWindow.document, + charset = doc.characterSet || doc.charset || "utf-8", + sandboxHtml = this._getHtml({ + charset: charset, + stylesheets: this.config.stylesheets + }); + + // Create the basic dom tree including proper DOCTYPE and charset + iframeDocument.open("text/html", "replace"); + iframeDocument.write(sandboxHtml); + iframeDocument.close(); + + this.getWindow = function() { return iframe.contentWindow; }; + this.getDocument = function() { return iframe.contentWindow.document; }; + + // Catch js errors and pass them to the parent's onerror event + // addEventListener("error") doesn't work properly in some browsers + // TODO: apparently this doesn't work in IE9! + iframeWindow.onerror = function(errorMessage, fileName, lineNumber) { + throw new Error("wysihtml5.Sandbox: " + errorMessage, fileName, lineNumber); + }; + + if (!wysihtml5.browser.supportsSandboxedIframes()) { + // Unset a bunch of sensitive variables + // Please note: This isn't hack safe! + // It more or less just takes care of basic attacks and prevents accidental theft of sensitive information + // IE is secure though, which is the most important thing, since IE is the only browser, who + // takes over scripts & styles into contentEditable elements when copied from external websites + // or applications (Microsoft Word, ...) + var i, length; + for (i=0, length=windowProperties.length; i<length; i++) { + this._unset(iframeWindow, windowProperties[i]); + } + for (i=0, length=windowProperties2.length; i<length; i++) { + this._unset(iframeWindow, windowProperties2[i], wysihtml5.EMPTY_FUNCTION); + } + for (i=0, length=documentProperties.length; i<length; i++) { + this._unset(iframeDocument, documentProperties[i]); + } + // This doesn't work in Safari 5 + // See http://stackoverflow.com/questions/992461/is-it-possible-to-override-document-cookie-in-webkit + this._unset(iframeDocument, "cookie", "", true); + } + + this.loaded = true; + + // Trigger the callback + setTimeout(function() { that.callback(that); }, 0); + }, + + _getHtml: function(templateVars) { + var stylesheets = templateVars.stylesheets, + html = "", + i = 0, + length; + stylesheets = typeof(stylesheets) === "string" ? [stylesheets] : stylesheets; + if (stylesheets) { + length = stylesheets.length; + for (; i<length; i++) { + html += '<link rel="stylesheet" href="' + stylesheets[i] + '">'; + } + } + templateVars.stylesheets = html; + + return wysihtml5.lang.string( + '<!DOCTYPE html><html><head>' + + '<meta charset="#{charset}">#{stylesheets}</head>' + + '<body></body></html>' + ).interpolate(templateVars); + }, + + /** + * Method to unset/override existing variables + * @example + * // Make cookie unreadable and unwritable + * this._unset(document, "cookie", "", true); + */ + _unset: function(object, property, value, setter) { + try { object[property] = value; } catch(e) {} + + try { object.__defineGetter__(property, function() { return value; }); } catch(e) {} + if (setter) { + try { object.__defineSetter__(property, function() {}); } catch(e) {} + } + + if (!wysihtml5.browser.crashesWhenDefineProperty(property)) { + try { + var config = { + get: function() { return value; } + }; + if (setter) { + config.set = function() {}; + } + Object.defineProperty(object, property, config); + } catch(e) {} + } + } + }); +})(wysihtml5); +;(function(wysihtml5) { + var doc = document; + wysihtml5.dom.ContentEditableArea = Base.extend({ + getContentEditable: function() { + return this.element; + }, + + getWindow: function() { + return this.element.ownerDocument.defaultView; + }, + + getDocument: function() { + return this.element.ownerDocument; + }, + + constructor: function(readyCallback, config, contentEditable) { + this.callback = readyCallback || wysihtml5.EMPTY_FUNCTION; + this.config = wysihtml5.lang.object({}).merge(config).get(); + if (contentEditable) { + this.element = this._bindElement(contentEditable); + } else { + this.element = this._createElement(); + } + }, + + // creates a new contenteditable and initiates it + _createElement: function() { + var element = doc.createElement("div"); + element.className = "wysihtml5-sandbox"; + this._loadElement(element); + return element; + }, + + // initiates an allready existent contenteditable + _bindElement: function(contentEditable) { + contentEditable.className = (contentEditable.className && contentEditable.className != '') ? contentEditable.className + " wysihtml5-sandbox" : "wysihtml5-sandbox"; + this._loadElement(contentEditable, true); + return contentEditable; + }, + + _loadElement: function(element, contentExists) { + var that = this; + if (!contentExists) { + var sandboxHtml = this._getHtml(); + element.innerHTML = sandboxHtml; + } + + this.getWindow = function() { return element.ownerDocument.defaultView; }; + this.getDocument = function() { return element.ownerDocument; }; + + // Catch js errors and pass them to the parent's onerror event + // addEventListener("error") doesn't work properly in some browsers + // TODO: apparently this doesn't work in IE9! + // TODO: figure out and bind the errors logic for contenteditble mode + /*iframeWindow.onerror = function(errorMessage, fileName, lineNumber) { + throw new Error("wysihtml5.Sandbox: " + errorMessage, fileName, lineNumber); + } + */ + this.loaded = true; + // Trigger the callback + setTimeout(function() { that.callback(that); }, 0); + }, + + _getHtml: function(templateVars) { + return ''; + } + + }); +})(wysihtml5); +;(function() { + var mapping = { + "className": "class" + }; + wysihtml5.dom.setAttributes = function(attributes) { + return { + on: function(element) { + for (var i in attributes) { + element.setAttribute(mapping[i] || i, attributes[i]); + } + } + }; + }; +})(); +;wysihtml5.dom.setStyles = function(styles) { + return { + on: function(element) { + var style = element.style; + if (typeof(styles) === "string") { + style.cssText += ";" + styles; + return; + } + for (var i in styles) { + if (i === "float") { + style.cssFloat = styles[i]; + style.styleFloat = styles[i]; + } else { + style[i] = styles[i]; + } + } + } + }; +}; +;/** + * Simulate HTML5 placeholder attribute + * + * Needed since + * - div[contentEditable] elements don't support it + * - older browsers (such as IE8 and Firefox 3.6) don't support it at all + * + * @param {Object} parent Instance of main wysihtml5.Editor class + * @param {Element} view Instance of wysihtml5.views.* class + * @param {String} placeholderText + * + * @example + * wysihtml.dom.simulatePlaceholder(this, composer, "Foobar"); + */ +(function(dom) { + dom.simulatePlaceholder = function(editor, view, placeholderText) { + var CLASS_NAME = "placeholder", + unset = function() { + var composerIsVisible = view.element.offsetWidth > 0 && view.element.offsetHeight > 0; + if (view.hasPlaceholderSet()) { + view.clear(); + view.element.focus(); + if (composerIsVisible ) { + setTimeout(function() { + var sel = view.selection.getSelection(); + if (!sel.focusNode || !sel.anchorNode) { + view.selection.selectNode(view.element.firstChild || view.element); + } + }, 0); + } + } + view.placeholderSet = false; + dom.removeClass(view.element, CLASS_NAME); + }, + set = function() { + if (view.isEmpty()) { + view.placeholderSet = true; + view.setValue(placeholderText); + dom.addClass(view.element, CLASS_NAME); + } + }; + + editor + .on("set_placeholder", set) + .on("unset_placeholder", unset) + .on("focus:composer", unset) + .on("paste:composer", unset) + .on("blur:composer", set); + + set(); + }; +})(wysihtml5.dom); +;(function(dom) { + var documentElement = document.documentElement; + if ("textContent" in documentElement) { + dom.setTextContent = function(element, text) { + element.textContent = text; + }; + + dom.getTextContent = function(element) { + return element.textContent; + }; + } else if ("innerText" in documentElement) { + dom.setTextContent = function(element, text) { + element.innerText = text; + }; + + dom.getTextContent = function(element) { + return element.innerText; + }; + } else { + dom.setTextContent = function(element, text) { + element.nodeValue = text; + }; + + dom.getTextContent = function(element) { + return element.nodeValue; + }; + } +})(wysihtml5.dom); + +;/** + * Get a set of attribute from one element + * + * IE gives wrong results for hasAttribute/getAttribute, for example: + * var td = document.createElement("td"); + * td.getAttribute("rowspan"); // => "1" in IE + * + * Therefore we have to check the element's outerHTML for the attribute +*/ + +wysihtml5.dom.getAttribute = function(node, attributeName) { + var HAS_GET_ATTRIBUTE_BUG = !wysihtml5.browser.supportsGetAttributeCorrectly(); + attributeName = attributeName.toLowerCase(); + var nodeName = node.nodeName; + if (nodeName == "IMG" && attributeName == "src" && wysihtml5.dom.isLoadedImage(node) === true) { + // Get 'src' attribute value via object property since this will always contain the + // full absolute url (http://...) + // this fixes a very annoying bug in firefox (ver 3.6 & 4) and IE 8 where images copied from the same host + // will have relative paths, which the sanitizer strips out (see attributeCheckMethods.url) + return node.src; + } else if (HAS_GET_ATTRIBUTE_BUG && "outerHTML" in node) { + // Don't trust getAttribute/hasAttribute in IE 6-8, instead check the element's outerHTML + var outerHTML = node.outerHTML.toLowerCase(), + // TODO: This might not work for attributes without value: <input disabled> + hasAttribute = outerHTML.indexOf(" " + attributeName + "=") != -1; + + return hasAttribute ? node.getAttribute(attributeName) : null; + } else{ + return node.getAttribute(attributeName); + } +}; +;/** + * Get all attributes of an element + * + * IE gives wrong results for hasAttribute/getAttribute, for example: + * var td = document.createElement("td"); + * td.getAttribute("rowspan"); // => "1" in IE + * + * Therefore we have to check the element's outerHTML for the attribute +*/ + +wysihtml5.dom.getAttributes = function(node) { + var HAS_GET_ATTRIBUTE_BUG = !wysihtml5.browser.supportsGetAttributeCorrectly(), + nodeName = node.nodeName, + attributes = [], + attr; + + for (attr in node.attributes) { + if ((node.attributes.hasOwnProperty && node.attributes.hasOwnProperty(attr)) || (!node.attributes.hasOwnProperty && Object.prototype.hasOwnProperty.call(node.attributes, attr))) { + if (node.attributes[attr].specified) { + if (nodeName == "IMG" && node.attributes[attr].name.toLowerCase() == "src" && wysihtml5.dom.isLoadedImage(node) === true) { + attributes['src'] = node.src; + } else if (wysihtml5.lang.array(['rowspan', 'colspan']).contains(node.attributes[attr].name.toLowerCase()) && HAS_GET_ATTRIBUTE_BUG) { + if (node.attributes[attr].value !== 1) { + attributes[node.attributes[attr].name] = node.attributes[attr].value; + } + } else { + attributes[node.attributes[attr].name] = node.attributes[attr].value; + } + } + } + } + return attributes; +};;/** + * Check whether the given node is a proper loaded image + * FIXME: Returns undefined when unknown (Chrome, Safari) +*/ + +wysihtml5.dom.isLoadedImage = function (node) { + try { + return node.complete && !node.mozMatchesSelector(":-moz-broken"); + } catch(e) { + if (node.complete && node.readyState === "complete") { + return true; + } + } +}; +;(function(wysihtml5) { + + var api = wysihtml5.dom; + + var MapCell = function(cell) { + this.el = cell; + this.isColspan= false; + this.isRowspan= false; + this.firstCol= true; + this.lastCol= true; + this.firstRow= true; + this.lastRow= true; + this.isReal= true; + this.spanCollection= []; + this.modified = false; + }; + + var TableModifyerByCell = function (cell, table) { + if (cell) { + this.cell = cell; + this.table = api.getParentElement(cell, { nodeName: ["TABLE"] }); + } else if (table) { + this.table = table; + this.cell = this.table.querySelectorAll('th, td')[0]; + } + }; + + function queryInList(list, query) { + var ret = [], + q; + for (var e = 0, len = list.length; e < len; e++) { + q = list[e].querySelectorAll(query); + if (q) { + for(var i = q.length; i--; ret.unshift(q[i])); + } + } + return ret; + } + + function removeElement(el) { + el.parentNode.removeChild(el); + } + + function insertAfter(referenceNode, newNode) { + referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling); + } + + function nextNode(node, tag) { + var element = node.nextSibling; + while (element.nodeType !=1) { + element = element.nextSibling; + if (!tag || tag == element.tagName.toLowerCase()) { + return element; + } + } + return null; + } + + TableModifyerByCell.prototype = { + + addSpannedCellToMap: function(cell, map, r, c, cspan, rspan) { + var spanCollect = [], + rmax = r + ((rspan) ? parseInt(rspan, 10) - 1 : 0), + cmax = c + ((cspan) ? parseInt(cspan, 10) - 1 : 0); + + for (var rr = r; rr <= rmax; rr++) { + if (typeof map[rr] == "undefined") { map[rr] = []; } + for (var cc = c; cc <= cmax; cc++) { + map[rr][cc] = new MapCell(cell); + map[rr][cc].isColspan = (cspan && parseInt(cspan, 10) > 1); + map[rr][cc].isRowspan = (rspan && parseInt(rspan, 10) > 1); + map[rr][cc].firstCol = cc == c; + map[rr][cc].lastCol = cc == cmax; + map[rr][cc].firstRow = rr == r; + map[rr][cc].lastRow = rr == rmax; + map[rr][cc].isReal = cc == c && rr == r; + map[rr][cc].spanCollection = spanCollect; + + spanCollect.push(map[rr][cc]); + } + } + }, + + setCellAsModified: function(cell) { + cell.modified = true; + if (cell.spanCollection.length > 0) { + for (var s = 0, smax = cell.spanCollection.length; s < smax; s++) { + cell.spanCollection[s].modified = true; + } + } + }, + + setTableMap: function() { + var map = []; + var tableRows = this.getTableRows(), + ridx, row, cells, cidx, cell, + c, + cspan, rspan; + + for (ridx = 0; ridx < tableRows.length; ridx++) { + row = tableRows[ridx]; + cells = this.getRowCells(row); + c = 0; + if (typeof map[ridx] == "undefined") { map[ridx] = []; } + for (cidx = 0; cidx < cells.length; cidx++) { + cell = cells[cidx]; + + // If cell allready set means it is set by col or rowspan, + // so increase cols index until free col is found + while (typeof map[ridx][c] != "undefined") { c++; } + + cspan = api.getAttribute(cell, 'colspan'); + rspan = api.getAttribute(cell, 'rowspan'); + + if (cspan || rspan) { + this.addSpannedCellToMap(cell, map, ridx, c, cspan, rspan); + c = c + ((cspan) ? parseInt(cspan, 10) : 1); + } else { + map[ridx][c] = new MapCell(cell); + c++; + } + } + } + this.map = map; + return map; + }, + + getRowCells: function(row) { + var inlineTables = this.table.querySelectorAll('table'), + inlineCells = (inlineTables) ? queryInList(inlineTables, 'th, td') : [], + allCells = row.querySelectorAll('th, td'), + tableCells = (inlineCells.length > 0) ? wysihtml5.lang.array(allCells).without(inlineCells) : allCells; + + return tableCells; + }, + + getTableRows: function() { + var inlineTables = this.table.querySelectorAll('table'), + inlineRows = (inlineTables) ? queryInList(inlineTables, 'tr') : [], + allRows = this.table.querySelectorAll('tr'), + tableRows = (inlineRows.length > 0) ? wysihtml5.lang.array(allRows).without(inlineRows) : allRows; + + return tableRows; + }, + + getMapIndex: function(cell) { + var r_length = this.map.length, + c_length = (this.map && this.map[0]) ? this.map[0].length : 0; + + for (var r_idx = 0;r_idx < r_length; r_idx++) { + for (var c_idx = 0;c_idx < c_length; c_idx++) { + if (this.map[r_idx][c_idx].el === cell) { + return {'row': r_idx, 'col': c_idx}; + } + } + } + return false; + }, + + getElementAtIndex: function(idx) { + this.setTableMap(); + if (this.map[idx.row] && this.map[idx.row][idx.col] && this.map[idx.row][idx.col].el) { + return this.map[idx.row][idx.col].el; + } + return null; + }, + + getMapElsTo: function(to_cell) { + var els = []; + this.setTableMap(); + this.idx_start = this.getMapIndex(this.cell); + this.idx_end = this.getMapIndex(to_cell); + + // switch indexes if start is bigger than end + if (this.idx_start.row > this.idx_end.row || (this.idx_start.row == this.idx_end.row && this.idx_start.col > this.idx_end.col)) { + var temp_idx = this.idx_start; + this.idx_start = this.idx_end; + this.idx_end = temp_idx; + } + if (this.idx_start.col > this.idx_end.col) { + var temp_cidx = this.idx_start.col; + this.idx_start.col = this.idx_end.col; + this.idx_end.col = temp_cidx; + } + + if (this.idx_start != null && this.idx_end != null) { + for (var row = this.idx_start.row, maxr = this.idx_end.row; row <= maxr; row++) { + for (var col = this.idx_start.col, maxc = this.idx_end.col; col <= maxc; col++) { + els.push(this.map[row][col].el); + } + } + } + return els; + }, + + orderSelectionEnds: function(secondcell) { + this.setTableMap(); + this.idx_start = this.getMapIndex(this.cell); + this.idx_end = this.getMapIndex(secondcell); + + // switch indexes if start is bigger than end + if (this.idx_start.row > this.idx_end.row || (this.idx_start.row == this.idx_end.row && this.idx_start.col > this.idx_end.col)) { + var temp_idx = this.idx_start; + this.idx_start = this.idx_end; + this.idx_end = temp_idx; + } + if (this.idx_start.col > this.idx_end.col) { + var temp_cidx = this.idx_start.col; + this.idx_start.col = this.idx_end.col; + this.idx_end.col = temp_cidx; + } + + return { + "start": this.map[this.idx_start.row][this.idx_start.col].el, + "end": this.map[this.idx_end.row][this.idx_end.col].el + }; + }, + + createCells: function(tag, nr, attrs) { + var doc = this.table.ownerDocument, + frag = doc.createDocumentFragment(), + cell; + for (var i = 0; i < nr; i++) { + cell = doc.createElement(tag); + + if (attrs) { + for (var attr in attrs) { + if (attrs.hasOwnProperty(attr)) { + cell.setAttribute(attr, attrs[attr]); + } + } + } + + // add non breaking space + cell.appendChild(document.createTextNode("\u00a0")); + + frag.appendChild(cell); + } + return frag; + }, + + // Returns next real cell (not part of spanned cell unless first) on row if selected index is not real. I no real cells -1 will be returned + correctColIndexForUnreals: function(col, row) { + var r = this.map[row], + corrIdx = -1; + for (var i = 0, max = col; i < col; i++) { + if (r[i].isReal){ + corrIdx++; + } + } + return corrIdx; + }, + + getLastNewCellOnRow: function(row, rowLimit) { + var cells = this.getRowCells(row), + cell, idx; + + for (var cidx = 0, cmax = cells.length; cidx < cmax; cidx++) { + cell = cells[cidx]; + idx = this.getMapIndex(cell); + if (idx === false || (typeof rowLimit != "undefined" && idx.row != rowLimit)) { + return cell; + } + } + return null; + }, + + removeEmptyTable: function() { + var cells = this.table.querySelectorAll('td, th'); + if (!cells || cells.length == 0) { + removeElement(this.table); + return true; + } else { + return false; + } + }, + + // Splits merged cell on row to unique cells + splitRowToCells: function(cell) { + if (cell.isColspan) { + var colspan = parseInt(api.getAttribute(cell.el, 'colspan') || 1, 10), + cType = cell.el.tagName.toLowerCase(); + if (colspan > 1) { + var newCells = this.createCells(cType, colspan -1); + insertAfter(cell.el, newCells); + } + cell.el.removeAttribute('colspan'); + } + }, + + getRealRowEl: function(force, idx) { + var r = null, + c = null; + + idx = idx || this.idx; + + for (var cidx = 0, cmax = this.map[idx.row].length; cidx < cmax; cidx++) { + c = this.map[idx.row][cidx]; + if (c.isReal) { + r = api.getParentElement(c.el, { nodeName: ["TR"] }); + if (r) { + return r; + } + } + } + + if (r === null && force) { + r = api.getParentElement(this.map[idx.row][idx.col].el, { nodeName: ["TR"] }) || null; + } + + return r; + }, + + injectRowAt: function(row, col, colspan, cType, c) { + var r = this.getRealRowEl(false, {'row': row, 'col': col}), + new_cells = this.createCells(cType, colspan); + + if (r) { + var n_cidx = this.correctColIndexForUnreals(col, row); + if (n_cidx >= 0) { + insertAfter(this.getRowCells(r)[n_cidx], new_cells); + } else { + r.insertBefore(new_cells, r.firstChild); + } + } else { + var rr = this.table.ownerDocument.createElement('tr'); + rr.appendChild(new_cells); + insertAfter(api.getParentElement(c.el, { nodeName: ["TR"] }), rr); + } + }, + + canMerge: function(to) { + this.to = to; + this.setTableMap(); + this.idx_start = this.getMapIndex(this.cell); + this.idx_end = this.getMapIndex(this.to); + + // switch indexes if start is bigger than end + if (this.idx_start.row > this.idx_end.row || (this.idx_start.row == this.idx_end.row && this.idx_start.col > this.idx_end.col)) { + var temp_idx = this.idx_start; + this.idx_start = this.idx_end; + this.idx_end = temp_idx; + } + if (this.idx_start.col > this.idx_end.col) { + var temp_cidx = this.idx_start.col; + this.idx_start.col = this.idx_end.col; + this.idx_end.col = temp_cidx; + } + + for (var row = this.idx_start.row, maxr = this.idx_end.row; row <= maxr; row++) { + for (var col = this.idx_start.col, maxc = this.idx_end.col; col <= maxc; col++) { + if (this.map[row][col].isColspan || this.map[row][col].isRowspan) { + return false; + } + } + } + return true; + }, + + decreaseCellSpan: function(cell, span) { + var nr = parseInt(api.getAttribute(cell.el, span), 10) - 1; + if (nr >= 1) { + cell.el.setAttribute(span, nr); + } else { + cell.el.removeAttribute(span); + if (span == 'colspan') { + cell.isColspan = false; + } + if (span == 'rowspan') { + cell.isRowspan = false; + } + cell.firstCol = true; + cell.lastCol = true; + cell.firstRow = true; + cell.lastRow = true; + cell.isReal = true; + } + }, + + removeSurplusLines: function() { + var row, cell, ridx, rmax, cidx, cmax, allRowspan; + + this.setTableMap(); + if (this.map) { + ridx = 0; + rmax = this.map.length; + for (;ridx < rmax; ridx++) { + row = this.map[ridx]; + allRowspan = true; + cidx = 0; + cmax = row.length; + for (; cidx < cmax; cidx++) { + cell = row[cidx]; + if (!(api.getAttribute(cell.el, "rowspan") && parseInt(api.getAttribute(cell.el, "rowspan"), 10) > 1 && cell.firstRow !== true)) { + allRowspan = false; + break; + } + } + if (allRowspan) { + cidx = 0; + for (; cidx < cmax; cidx++) { + this.decreaseCellSpan(row[cidx], 'rowspan'); + } + } + } + + // remove rows without cells + var tableRows = this.getTableRows(); + ridx = 0; + rmax = tableRows.length; + for (;ridx < rmax; ridx++) { + row = tableRows[ridx]; + if (row.childNodes.length == 0 && (/^\s*$/.test(row.textContent || row.innerText))) { + removeElement(row); + } + } + } + }, + + fillMissingCells: function() { + var r_max = 0, + c_max = 0, + prevcell = null; + + this.setTableMap(); + if (this.map) { + + // find maximal dimensions of broken table + r_max = this.map.length; + for (var ridx = 0; ridx < r_max; ridx++) { + if (this.map[ridx].length > c_max) { c_max = this.map[ridx].length; } + } + + for (var row = 0; row < r_max; row++) { + for (var col = 0; col < c_max; col++) { + if (this.map[row] && !this.map[row][col]) { + if (col > 0) { + this.map[row][col] = new MapCell(this.createCells('td', 1)); + prevcell = this.map[row][col-1]; + if (prevcell && prevcell.el && prevcell.el.parent) { // if parent does not exist element is removed from dom + insertAfter(this.map[row][col-1].el, this.map[row][col].el); + } + } + } + } + } + } + }, + + rectify: function() { + if (!this.removeEmptyTable()) { + this.removeSurplusLines(); + this.fillMissingCells(); + return true; + } else { + return false; + } + }, + + unmerge: function() { + if (this.rectify()) { + this.setTableMap(); + this.idx = this.getMapIndex(this.cell); + + if (this.idx) { + var thisCell = this.map[this.idx.row][this.idx.col], + colspan = (api.getAttribute(thisCell.el, "colspan")) ? parseInt(api.getAttribute(thisCell.el, "colspan"), 10) : 1, + cType = thisCell.el.tagName.toLowerCase(); + + if (thisCell.isRowspan) { + var rowspan = parseInt(api.getAttribute(thisCell.el, "rowspan"), 10); + if (rowspan > 1) { + for (var nr = 1, maxr = rowspan - 1; nr <= maxr; nr++){ + this.injectRowAt(this.idx.row + nr, this.idx.col, colspan, cType, thisCell); + } + } + thisCell.el.removeAttribute('rowspan'); + } + this.splitRowToCells(thisCell); + } + } + }, + + // merges cells from start cell (defined in creating obj) to "to" cell + merge: function(to) { + if (this.rectify()) { + if (this.canMerge(to)) { + var rowspan = this.idx_end.row - this.idx_start.row + 1, + colspan = this.idx_end.col - this.idx_start.col + 1; + + for (var row = this.idx_start.row, maxr = this.idx_end.row; row <= maxr; row++) { + for (var col = this.idx_start.col, maxc = this.idx_end.col; col <= maxc; col++) { + + if (row == this.idx_start.row && col == this.idx_start.col) { + if (rowspan > 1) { + this.map[row][col].el.setAttribute('rowspan', rowspan); + } + if (colspan > 1) { + this.map[row][col].el.setAttribute('colspan', colspan); + } + } else { + // transfer content + if (!(/^\s*<br\/?>\s*$/.test(this.map[row][col].el.innerHTML.toLowerCase()))) { + this.map[this.idx_start.row][this.idx_start.col].el.innerHTML += ' ' + this.map[row][col].el.innerHTML; + } + removeElement(this.map[row][col].el); + } + } + } + this.rectify(); + } else { + if (window.console) { + console.log('Do not know how to merge allready merged cells.'); + } + } + } + }, + + // Decreases rowspan of a cell if it is done on first cell of rowspan row (real cell) + // Cell is moved to next row (if it is real) + collapseCellToNextRow: function(cell) { + var cellIdx = this.getMapIndex(cell.el), + newRowIdx = cellIdx.row + 1, + newIdx = {'row': newRowIdx, 'col': cellIdx.col}; + + if (newRowIdx < this.map.length) { + + var row = this.getRealRowEl(false, newIdx); + if (row !== null) { + var n_cidx = this.correctColIndexForUnreals(newIdx.col, newIdx.row); + if (n_cidx >= 0) { + insertAfter(this.getRowCells(row)[n_cidx], cell.el); + } else { + var lastCell = this.getLastNewCellOnRow(row, newRowIdx); + if (lastCell !== null) { + insertAfter(lastCell, cell.el); + } else { + row.insertBefore(cell.el, row.firstChild); + } + } + if (parseInt(api.getAttribute(cell.el, 'rowspan'), 10) > 2) { + cell.el.setAttribute('rowspan', parseInt(api.getAttribute(cell.el, 'rowspan'), 10) - 1); + } else { + cell.el.removeAttribute('rowspan'); + } + } + } + }, + + // Removes a cell when removing a row + // If is rowspan cell then decreases the rowspan + // and moves cell to next row if needed (is first cell of rowspan) + removeRowCell: function(cell) { + if (cell.isReal) { + if (cell.isRowspan) { + this.collapseCellToNextRow(cell); + } else { + removeElement(cell.el); + } + } else { + if (parseInt(api.getAttribute(cell.el, 'rowspan'), 10) > 2) { + cell.el.setAttribute('rowspan', parseInt(api.getAttribute(cell.el, 'rowspan'), 10) - 1); + } else { + cell.el.removeAttribute('rowspan'); + } + } + }, + + getRowElementsByCell: function() { + var cells = []; + this.setTableMap(); + this.idx = this.getMapIndex(this.cell); + if (this.idx !== false) { + var modRow = this.map[this.idx.row]; + for (var cidx = 0, cmax = modRow.length; cidx < cmax; cidx++) { + if (modRow[cidx].isReal) { + cells.push(modRow[cidx].el); + } + } + } + return cells; + }, + + getColumnElementsByCell: function() { + var cells = []; + this.setTableMap(); + this.idx = this.getMapIndex(this.cell); + if (this.idx !== false) { + for (var ridx = 0, rmax = this.map.length; ridx < rmax; ridx++) { + if (this.map[ridx][this.idx.col] && this.map[ridx][this.idx.col].isReal) { + cells.push(this.map[ridx][this.idx.col].el); + } + } + } + return cells; + }, + + // Removes the row of selected cell + removeRow: function() { + var oldRow = api.getParentElement(this.cell, { nodeName: ["TR"] }); + if (oldRow) { + this.setTableMap(); + this.idx = this.getMapIndex(this.cell); + if (this.idx !== false) { + var modRow = this.map[this.idx.row]; + for (var cidx = 0, cmax = modRow.length; cidx < cmax; cidx++) { + if (!modRow[cidx].modified) { + this.setCellAsModified(modRow[cidx]); + this.removeRowCell(modRow[cidx]); + } + } + } + removeElement(oldRow); + } + }, + + removeColCell: function(cell) { + if (cell.isColspan) { + if (parseInt(api.getAttribute(cell.el, 'colspan'), 10) > 2) { + cell.el.setAttribute('colspan', parseInt(api.getAttribute(cell.el, 'colspan'), 10) - 1); + } else { + cell.el.removeAttribute('colspan'); + } + } else if (cell.isReal) { + removeElement(cell.el); + } + }, + + removeColumn: function() { + this.setTableMap(); + this.idx = this.getMapIndex(this.cell); + if (this.idx !== false) { + for (var ridx = 0, rmax = this.map.length; ridx < rmax; ridx++) { + if (!this.map[ridx][this.idx.col].modified) { + this.setCellAsModified(this.map[ridx][this.idx.col]); + this.removeColCell(this.map[ridx][this.idx.col]); + } + } + } + }, + + // removes row or column by selected cell element + remove: function(what) { + if (this.rectify()) { + switch (what) { + case 'row': + this.removeRow(); + break; + case 'column': + this.removeColumn(); + break; + } + this.rectify(); + } + }, + + addRow: function(where) { + var doc = this.table.ownerDocument; + + this.setTableMap(); + this.idx = this.getMapIndex(this.cell); + if (where == "below" && api.getAttribute(this.cell, 'rowspan')) { + this.idx.row = this.idx.row + parseInt(api.getAttribute(this.cell, 'rowspan'), 10) - 1; + } + + if (this.idx !== false) { + var modRow = this.map[this.idx.row], + newRow = doc.createElement('tr'); + + for (var ridx = 0, rmax = modRow.length; ridx < rmax; ridx++) { + if (!modRow[ridx].modified) { + this.setCellAsModified(modRow[ridx]); + this.addRowCell(modRow[ridx], newRow, where); + } + } + + switch (where) { + case 'below': + insertAfter(this.getRealRowEl(true), newRow); + break; + case 'above': + var cr = api.getParentElement(this.map[this.idx.row][this.idx.col].el, { nodeName: ["TR"] }); + if (cr) { + cr.parentNode.insertBefore(newRow, cr); + } + break; + } + } + }, + + addRowCell: function(cell, row, where) { + var colSpanAttr = (cell.isColspan) ? {"colspan" : api.getAttribute(cell.el, 'colspan')} : null; + if (cell.isReal) { + if (where != 'above' && cell.isRowspan) { + cell.el.setAttribute('rowspan', parseInt(api.getAttribute(cell.el,'rowspan'), 10) + 1); + } else { + row.appendChild(this.createCells('td', 1, colSpanAttr)); + } + } else { + if (where != 'above' && cell.isRowspan && cell.lastRow) { + row.appendChild(this.createCells('td', 1, colSpanAttr)); + } else if (c.isRowspan) { + cell.el.attr('rowspan', parseInt(api.getAttribute(cell.el, 'rowspan'), 10) + 1); + } + } + }, + + add: function(where) { + if (this.rectify()) { + if (where == 'below' || where == 'above') { + this.addRow(where); + } + if (where == 'before' || where == 'after') { + this.addColumn(where); + } + } + }, + + addColCell: function (cell, ridx, where) { + var doAdd, + cType = cell.el.tagName.toLowerCase(); + + // defines add cell vs expand cell conditions + // true means add + switch (where) { + case "before": + doAdd = (!cell.isColspan || cell.firstCol); + break; + case "after": + doAdd = (!cell.isColspan || cell.lastCol || (cell.isColspan && c.el == this.cell)); + break; + } + + if (doAdd){ + // adds a cell before or after current cell element + switch (where) { + case "before": + cell.el.parentNode.insertBefore(this.createCells(cType, 1), cell.el); + break; + case "after": + insertAfter(cell.el, this.createCells(cType, 1)); + break; + } + + // handles if cell has rowspan + if (cell.isRowspan) { + this.handleCellAddWithRowspan(cell, ridx+1, where); + } + + } else { + // expands cell + cell.el.setAttribute('colspan', parseInt(api.getAttribute(cell.el, 'colspan'), 10) + 1); + } + }, + + addColumn: function(where) { + var row, modCell; + + this.setTableMap(); + this.idx = this.getMapIndex(this.cell); + if (where == "after" && api.getAttribute(this.cell, 'colspan')) { + this.idx.col = this.idx.col + parseInt(api.getAttribute(this.cell, 'colspan'), 10) - 1; + } + + if (this.idx !== false) { + for (var ridx = 0, rmax = this.map.length; ridx < rmax; ridx++ ) { + row = this.map[ridx]; + if (row[this.idx.col]) { + modCell = row[this.idx.col]; + if (!modCell.modified) { + this.setCellAsModified(modCell); + this.addColCell(modCell, ridx , where); + } + } + } + } + }, + + handleCellAddWithRowspan: function (cell, ridx, where) { + var addRowsNr = parseInt(api.getAttribute(this.cell, 'rowspan'), 10) - 1, + crow = api.getParentElement(cell.el, { nodeName: ["TR"] }), + cType = cell.el.tagName.toLowerCase(), + cidx, temp_r_cells, + doc = this.table.ownerDocument, + nrow; + + for (var i = 0; i < addRowsNr; i++) { + cidx = this.correctColIndexForUnreals(this.idx.col, (ridx + i)); + crow = nextNode(crow, 'tr'); + if (crow) { + if (cidx > 0) { + switch (where) { + case "before": + temp_r_cells = this.getRowCells(crow); + if (cidx > 0 && this.map[ridx + i][this.idx.col].el != temp_r_cells[cidx] && cidx == temp_r_cells.length - 1) { + insertAfter(temp_r_cells[cidx], this.createCells(cType, 1)); + } else { + temp_r_cells[cidx].parentNode.insertBefore(this.createCells(cType, 1), temp_r_cells[cidx]); + } + + break; + case "after": + insertAfter(this.getRowCells(crow)[cidx], this.createCells(cType, 1)); + break; + } + } else { + crow.insertBefore(this.createCells(cType, 1), crow.firstChild); + } + } else { + nrow = doc.createElement('tr'); + nrow.appendChild(this.createCells(cType, 1)); + this.table.appendChild(nrow); + } + } + } + }; + + api.table = { + getCellsBetween: function(cell1, cell2) { + var c1 = new TableModifyerByCell(cell1); + return c1.getMapElsTo(cell2); + }, + + addCells: function(cell, where) { + var c = new TableModifyerByCell(cell); + c.add(where); + }, + + removeCells: function(cell, what) { + var c = new TableModifyerByCell(cell); + c.remove(what); + }, + + mergeCellsBetween: function(cell1, cell2) { + var c1 = new TableModifyerByCell(cell1); + c1.merge(cell2); + }, + + unmergeCell: function(cell) { + var c = new TableModifyerByCell(cell); + c.unmerge(); + }, + + orderSelectionEnds: function(cell, cell2) { + var c = new TableModifyerByCell(cell); + return c.orderSelectionEnds(cell2); + }, + + indexOf: function(cell) { + var c = new TableModifyerByCell(cell); + c.setTableMap(); + return c.getMapIndex(cell); + }, + + findCell: function(table, idx) { + var c = new TableModifyerByCell(null, table); + return c.getElementAtIndex(idx); + }, + + findRowByCell: function(cell) { + var c = new TableModifyerByCell(cell); + return c.getRowElementsByCell(); + }, + + findColumnByCell: function(cell) { + var c = new TableModifyerByCell(cell); + return c.getColumnElementsByCell(); + }, + + canMerge: function(cell1, cell2) { + var c = new TableModifyerByCell(cell1); + return c.canMerge(cell2); + } + }; + + + +})(wysihtml5); +;// does a selector query on element or array of elements + +wysihtml5.dom.query = function(elements, query) { + var ret = [], + q; + + if (elements.nodeType) { + elements = [elements]; + } + + for (var e = 0, len = elements.length; e < len; e++) { + q = elements[e].querySelectorAll(query); + if (q) { + for(var i = q.length; i--; ret.unshift(q[i])); + } + } + return ret; +}; +;wysihtml5.dom.compareDocumentPosition = (function() { + var documentElement = document.documentElement; + if (documentElement.compareDocumentPosition) { + return function(container, element) { + return container.compareDocumentPosition(element); + }; + } else { + return function( container, element ) { + // implementation borrowed from https://github.com/tmpvar/jsdom/blob/681a8524b663281a0f58348c6129c8c184efc62c/lib/jsdom/level3/core.js // MIT license + var thisOwner, otherOwner; + + if( container.nodeType === 9) // Node.DOCUMENT_NODE + thisOwner = container; + else + thisOwner = container.ownerDocument; + + if( element.nodeType === 9) // Node.DOCUMENT_NODE + otherOwner = element; + else + otherOwner = element.ownerDocument; + + if( container === element ) return 0; + if( container === element.ownerDocument ) return 4 + 16; //Node.DOCUMENT_POSITION_FOLLOWING + Node.DOCUMENT_POSITION_CONTAINED_BY; + if( container.ownerDocument === element ) return 2 + 8; //Node.DOCUMENT_POSITION_PRECEDING + Node.DOCUMENT_POSITION_CONTAINS; + if( thisOwner !== otherOwner ) return 1; // Node.DOCUMENT_POSITION_DISCONNECTED; + + // Text nodes for attributes does not have a _parentNode. So we need to find them as attribute child. + if( container.nodeType === 2 /*Node.ATTRIBUTE_NODE*/ && container.childNodes && wysihtml5.lang.array(container.childNodes).indexOf( element ) !== -1) + return 4 + 16; //Node.DOCUMENT_POSITION_FOLLOWING + Node.DOCUMENT_POSITION_CONTAINED_BY; + + if( element.nodeType === 2 /*Node.ATTRIBUTE_NODE*/ && element.childNodes && wysihtml5.lang.array(element.childNodes).indexOf( container ) !== -1) + return 2 + 8; //Node.DOCUMENT_POSITION_PRECEDING + Node.DOCUMENT_POSITION_CONTAINS; + + var point = container; + var parents = [ ]; + var previous = null; + while( point ) { + if( point == element ) return 2 + 8; //Node.DOCUMENT_POSITION_PRECEDING + Node.DOCUMENT_POSITION_CONTAINS; + parents.push( point ); + point = point.parentNode; + } + point = element; + previous = null; + while( point ) { + if( point == container ) return 4 + 16; //Node.DOCUMENT_POSITION_FOLLOWING + Node.DOCUMENT_POSITION_CONTAINED_BY; + var location_index = wysihtml5.lang.array(parents).indexOf( point ); + if( location_index !== -1) { + var smallest_common_ancestor = parents[ location_index ]; + var this_index = wysihtml5.lang.array(smallest_common_ancestor.childNodes).indexOf( parents[location_index - 1]);//smallest_common_ancestor.childNodes.toArray().indexOf( parents[location_index - 1] ); + var other_index = wysihtml5.lang.array(smallest_common_ancestor.childNodes).indexOf( previous ); //smallest_common_ancestor.childNodes.toArray().indexOf( previous ); + if( this_index > other_index ) { + return 2; //Node.DOCUMENT_POSITION_PRECEDING; + } + else { + return 4; //Node.DOCUMENT_POSITION_FOLLOWING; + } + } + previous = point; + point = point.parentNode; + } + return 1; //Node.DOCUMENT_POSITION_DISCONNECTED; + }; + } +})(); +;wysihtml5.dom.unwrap = function(node) { + if (node.parentNode) { + while (node.lastChild) { + wysihtml5.dom.insert(node.lastChild).after(node); + } + node.parentNode.removeChild(node); + } +};;/* + * Methods for fetching pasted html before it gets inserted into content +**/ + +/* Modern event.clipboardData driven approach. + * Advantage is that it does not have to loose selection or modify dom to catch the data. + * IE does not support though. +**/ +wysihtml5.dom.getPastedHtml = function(event) { + var html; + if (event.clipboardData) { + if (wysihtml5.lang.array(event.clipboardData.types).contains('text/html')) { + html = event.clipboardData.getData('text/html'); + } else if (wysihtml5.lang.array(event.clipboardData.types).contains('text/plain')) { + html = wysihtml5.lang.string(event.clipboardData.getData('text/plain')).escapeHTML(true, true); + } + } + return html; +}; + +/* Older temprorary contenteditable as paste source catcher method for fallbacks */ +wysihtml5.dom.getPastedHtmlWithDiv = function (composer, f) { + var selBookmark = composer.selection.getBookmark(), + doc = composer.element.ownerDocument, + cleanerDiv = doc.createElement('DIV'); + + doc.body.appendChild(cleanerDiv); + + cleanerDiv.style.width = "1px"; + cleanerDiv.style.height = "1px"; + cleanerDiv.style.overflow = "hidden"; + + cleanerDiv.setAttribute('contenteditable', 'true'); + cleanerDiv.focus(); + + setTimeout(function () { + composer.selection.setBookmark(selBookmark); + f(cleanerDiv.innerHTML); + cleanerDiv.parentNode.removeChild(cleanerDiv); + }, 0); +};;/** + * Fix most common html formatting misbehaviors of browsers implementation when inserting + * content via copy & paste contentEditable + * + * @author Christopher Blum + */ +wysihtml5.quirks.cleanPastedHTML = (function() { + + var styleToRegex = function (styleStr) { + var trimmedStr = wysihtml5.lang.string(styleStr).trim(), + escapedStr = trimmedStr.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + + return new RegExp("^((?!^" + escapedStr + "$).)*$", "i"); + }; + + var extendRulesWithStyleExceptions = function (rules, exceptStyles) { + var newRules = wysihtml5.lang.object(rules).clone(true), + tag, style; + + for (tag in newRules.tags) { + + if (newRules.tags.hasOwnProperty(tag)) { + if (newRules.tags[tag].keep_styles) { + for (style in newRules.tags[tag].keep_styles) { + if (newRules.tags[tag].keep_styles.hasOwnProperty(style)) { + if (exceptStyles[style]) { + newRules.tags[tag].keep_styles[style] = styleToRegex(exceptStyles[style]); + } + } + } + } + } + } + + return newRules; + }; + + var pickRuleset = function(ruleset, html) { + var pickedSet, defaultSet; + + if (!ruleset) { + return null; + } + + for (var i = 0, max = ruleset.length; i < max; i++) { + if (!ruleset[i].condition) { + defaultSet = ruleset[i].set; + } + if (ruleset[i].condition && ruleset[i].condition.test(html)) { + return ruleset[i].set; + } + } + + return defaultSet; + }; + + return function(html, options) { + var exceptStyles = { + 'color': wysihtml5.dom.getStyle("color").from(options.referenceNode), + 'fontSize': wysihtml5.dom.getStyle("font-size").from(options.referenceNode) + }, + rules = extendRulesWithStyleExceptions(pickRuleset(options.rules, html) || {}, exceptStyles), + newHtml; + + newHtml = wysihtml5.dom.parse(html, { + "rules": rules, + "cleanUp": true, // <span> elements, empty or without attributes, should be removed/replaced with their content + "context": options.referenceNode.ownerDocument, + "uneditableClass": options.uneditableClass, + "clearInternals" : true, // don't paste temprorary selection and other markings + "unjoinNbsps" : true + }); + + return newHtml; + }; + +})();;/** + * IE and Opera leave an empty paragraph in the contentEditable element after clearing it + * + * @param {Object} contentEditableElement The contentEditable element to observe for clearing events + * @exaple + * wysihtml5.quirks.ensureProperClearing(myContentEditableElement); + */ +wysihtml5.quirks.ensureProperClearing = (function() { + var clearIfNecessary = function() { + var element = this; + setTimeout(function() { + var innerHTML = element.innerHTML.toLowerCase(); + if (innerHTML == "<p>&nbsp;</p>" || + innerHTML == "<p>&nbsp;</p><p>&nbsp;</p>") { + element.innerHTML = ""; + } + }, 0); + }; + + return function(composer) { + wysihtml5.dom.observe(composer.element, ["cut", "keydown"], clearIfNecessary); + }; +})(); +;// See https://bugzilla.mozilla.org/show_bug.cgi?id=664398 +// +// In Firefox this: +// var d = document.createElement("div"); +// d.innerHTML ='<a href="~"></a>'; +// d.innerHTML; +// will result in: +// <a href="%7E"></a> +// which is wrong +(function(wysihtml5) { + var TILDE_ESCAPED = "%7E"; + wysihtml5.quirks.getCorrectInnerHTML = function(element) { + var innerHTML = element.innerHTML; + if (innerHTML.indexOf(TILDE_ESCAPED) === -1) { + return innerHTML; + } + + var elementsWithTilde = element.querySelectorAll("[href*='~'], [src*='~']"), + url, + urlToSearch, + length, + i; + for (i=0, length=elementsWithTilde.length; i<length; i++) { + url = elementsWithTilde[i].href || elementsWithTilde[i].src; + urlToSearch = wysihtml5.lang.string(url).replace("~").by(TILDE_ESCAPED); + innerHTML = wysihtml5.lang.string(innerHTML).replace(urlToSearch).by(url); + } + return innerHTML; + }; +})(wysihtml5); +;/** + * Force rerendering of a given element + * Needed to fix display misbehaviors of IE + * + * @param {Element} element The element object which needs to be rerendered + * @example + * wysihtml5.quirks.redraw(document.body); + */ +(function(wysihtml5) { + var CLASS_NAME = "wysihtml5-quirks-redraw"; + + wysihtml5.quirks.redraw = function(element) { + wysihtml5.dom.addClass(element, CLASS_NAME); + wysihtml5.dom.removeClass(element, CLASS_NAME); + + // Following hack is needed for firefox to make sure that image resize handles are properly removed + try { + var doc = element.ownerDocument; + doc.execCommand("italic", false, null); + doc.execCommand("italic", false, null); + } catch(e) {} + }; +})(wysihtml5); +;wysihtml5.quirks.tableCellsSelection = function(editable, editor) { + + var dom = wysihtml5.dom, + select = { + table: null, + start: null, + end: null, + cells: null, + select: selectCells + }, + selection_class = "wysiwyg-tmp-selected-cell", + moveHandler = null, + upHandler = null; + + function init () { + + dom.observe(editable, "mousedown", function(event) { + var target = wysihtml5.dom.getParentElement(event.target, { nodeName: ["TD", "TH"] }); + if (target) { + handleSelectionMousedown(target); + } + }); + + return select; + } + + function handleSelectionMousedown (target) { + select.start = target; + select.end = target; + select.cells = [target]; + select.table = dom.getParentElement(select.start, { nodeName: ["TABLE"] }); + + if (select.table) { + removeCellSelections(); + dom.addClass(target, selection_class); + moveHandler = dom.observe(editable, "mousemove", handleMouseMove); + upHandler = dom.observe(editable, "mouseup", handleMouseUp); + editor.fire("tableselectstart").fire("tableselectstart:composer"); + } + } + + // remove all selection classes + function removeCellSelections () { + if (editable) { + var selectedCells = editable.querySelectorAll('.' + selection_class); + if (selectedCells.length > 0) { + for (var i = 0; i < selectedCells.length; i++) { + dom.removeClass(selectedCells[i], selection_class); + } + } + } + } + + function addSelections (cells) { + for (var i = 0; i < cells.length; i++) { + dom.addClass(cells[i], selection_class); + } + } + + function handleMouseMove (event) { + var curTable = null, + cell = dom.getParentElement(event.target, { nodeName: ["TD","TH"] }), + oldEnd; + + if (cell && select.table && select.start) { + curTable = dom.getParentElement(cell, { nodeName: ["TABLE"] }); + if (curTable && curTable === select.table) { + removeCellSelections(); + oldEnd = select.end; + select.end = cell; + select.cells = dom.table.getCellsBetween(select.start, cell); + if (select.cells.length > 1) { + editor.composer.selection.deselect(); + } + addSelections(select.cells); + if (select.end !== oldEnd) { + editor.fire("tableselectchange").fire("tableselectchange:composer"); + } + } + } + } + + function handleMouseUp (event) { + moveHandler.stop(); + upHandler.stop(); + editor.fire("tableselect").fire("tableselect:composer"); + setTimeout(function() { + bindSideclick(); + },0); + } + + function bindSideclick () { + var sideClickHandler = dom.observe(editable.ownerDocument, "click", function(event) { + sideClickHandler.stop(); + if (dom.getParentElement(event.target, { nodeName: ["TABLE"] }) != select.table) { + removeCellSelections(); + select.table = null; + select.start = null; + select.end = null; + editor.fire("tableunselect").fire("tableunselect:composer"); + } + }); + } + + function selectCells (start, end) { + select.start = start; + select.end = end; + select.table = dom.getParentElement(select.start, { nodeName: ["TABLE"] }); + selectedCells = dom.table.getCellsBetween(select.start, select.end); + addSelections(selectedCells); + bindSideclick(); + editor.fire("tableselect").fire("tableselect:composer"); + } + + return init(); + +}; +;(function(wysihtml5) { + var RGBA_REGEX = /^rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*([\d\.]+)\s*\)/i, + RGB_REGEX = /^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)/i, + HEX6_REGEX = /^#([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])/i, + HEX3_REGEX = /^#([0-9a-f])([0-9a-f])([0-9a-f])/i; + + var param_REGX = function (p) { + return new RegExp("(^|\\s|;)" + p + "\\s*:\\s*[^;$]+" , "gi"); + }; + + wysihtml5.quirks.styleParser = { + + parseColor: function(stylesStr, paramName) { + var paramRegex = param_REGX(paramName), + params = stylesStr.match(paramRegex), + radix = 10, + str, colorMatch; + + if (params) { + for (var i = params.length; i--;) { + params[i] = wysihtml5.lang.string(params[i].split(':')[1]).trim(); + } + str = params[params.length-1]; + + if (RGBA_REGEX.test(str)) { + colorMatch = str.match(RGBA_REGEX); + } else if (RGB_REGEX.test(str)) { + colorMatch = str.match(RGB_REGEX); + } else if (HEX6_REGEX.test(str)) { + colorMatch = str.match(HEX6_REGEX); + radix = 16; + } else if (HEX3_REGEX.test(str)) { + colorMatch = str.match(HEX3_REGEX); + colorMatch.shift(); + colorMatch.push(1); + return wysihtml5.lang.array(colorMatch).map(function(d, idx) { + return (idx < 3) ? (parseInt(d, 16) * 16) + parseInt(d, 16): parseFloat(d); + }); + } + + if (colorMatch) { + colorMatch.shift(); + if (!colorMatch[3]) { + colorMatch.push(1); + } + return wysihtml5.lang.array(colorMatch).map(function(d, idx) { + return (idx < 3) ? parseInt(d, radix): parseFloat(d); + }); + } + } + return false; + }, + + unparseColor: function(val, props) { + if (props) { + if (props == "hex") { + return (val[0].toString(16).toUpperCase()) + (val[1].toString(16).toUpperCase()) + (val[2].toString(16).toUpperCase()); + } else if (props == "hash") { + return "#" + (val[0].toString(16).toUpperCase()) + (val[1].toString(16).toUpperCase()) + (val[2].toString(16).toUpperCase()); + } else if (props == "rgb") { + return "rgb(" + val[0] + "," + val[1] + "," + val[2] + ")"; + } else if (props == "rgba") { + return "rgba(" + val[0] + "," + val[1] + "," + val[2] + "," + val[3] + ")"; + } else if (props == "csv") { + return val[0] + "," + val[1] + "," + val[2] + "," + val[3]; + } + } + + if (val[3] && val[3] !== 1) { + return "rgba(" + val[0] + "," + val[1] + "," + val[2] + "," + val[3] + ")"; + } else { + return "rgb(" + val[0] + "," + val[1] + "," + val[2] + ")"; + } + }, + + parseFontSize: function(stylesStr) { + var params = stylesStr.match(param_REGX('font-size')); + if (params) { + return wysihtml5.lang.string(params[params.length - 1].split(':')[1]).trim(); + } + return false; + } + }; + +})(wysihtml5); +;/** + * Selection API + * + * @example + * var selection = new wysihtml5.Selection(editor); + */ +(function(wysihtml5) { + var dom = wysihtml5.dom; + + function _getCumulativeOffsetTop(element) { + var top = 0; + if (element.parentNode) { + do { + top += element.offsetTop || 0; + element = element.offsetParent; + } while (element); + } + return top; + } + + // Provides the depth of ``descendant`` relative to ``ancestor`` + function getDepth(ancestor, descendant) { + var ret = 0; + while (descendant !== ancestor) { + ret++; + descendant = descendant.parentNode; + if (!descendant) + throw new Error("not a descendant of ancestor!"); + } + return ret; + } + + // Should fix the obtained ranges that cannot surrond contents normally to apply changes upon + // Being considerate to firefox that sets range start start out of span and end inside on doubleclick initiated selection + function expandRangeToSurround(range) { + if (range.canSurroundContents()) return; + + var common = range.commonAncestorContainer, + start_depth = getDepth(common, range.startContainer), + end_depth = getDepth(common, range.endContainer); + + while(!range.canSurroundContents()) { + // In the following branches, we cannot just decrement the depth variables because the setStartBefore/setEndAfter may move the start or end of the range more than one level relative to ``common``. So we need to recompute the depth. + if (start_depth > end_depth) { + range.setStartBefore(range.startContainer); + start_depth = getDepth(common, range.startContainer); + } + else { + range.setEndAfter(range.endContainer); + end_depth = getDepth(common, range.endContainer); + } + } + } + + wysihtml5.Selection = Base.extend( + /** @scope wysihtml5.Selection.prototype */ { + constructor: function(editor, contain, unselectableClass) { + // Make sure that our external range library is initialized + window.rangy.init(); + + this.editor = editor; + this.composer = editor.composer; + this.doc = this.composer.doc; + this.contain = contain; + this.unselectableClass = unselectableClass || false; + }, + + /** + * Get the current selection as a bookmark to be able to later restore it + * + * @return {Object} An object that represents the current selection + */ + getBookmark: function() { + var range = this.getRange(); + if (range) expandRangeToSurround(range); + return range && range.cloneRange(); + }, + + /** + * Restore a selection retrieved via wysihtml5.Selection.prototype.getBookmark + * + * @param {Object} bookmark An object that represents the current selection + */ + setBookmark: function(bookmark) { + if (!bookmark) { + return; + } + + this.setSelection(bookmark); + }, + + /** + * Set the caret in front of the given node + * + * @param {Object} node The element or text node where to position the caret in front of + * @example + * selection.setBefore(myElement); + */ + setBefore: function(node) { + var range = rangy.createRange(this.doc); + range.setStartBefore(node); + range.setEndBefore(node); + return this.setSelection(range); + }, + + /** + * Set the caret after the given node + * + * @param {Object} node The element or text node where to position the caret in front of + * @example + * selection.setBefore(myElement); + */ + setAfter: function(node) { + var range = rangy.createRange(this.doc); + + range.setStartAfter(node); + range.setEndAfter(node); + return this.setSelection(range); + }, + + /** + * Ability to select/mark nodes + * + * @param {Element} node The node/element to select + * @example + * selection.selectNode(document.getElementById("my-image")); + */ + selectNode: function(node, avoidInvisibleSpace) { + var range = rangy.createRange(this.doc), + isElement = node.nodeType === wysihtml5.ELEMENT_NODE, + canHaveHTML = "canHaveHTML" in node ? node.canHaveHTML : (node.nodeName !== "IMG"), + content = isElement ? node.innerHTML : node.data, + isEmpty = (content === "" || content === wysihtml5.INVISIBLE_SPACE), + displayStyle = dom.getStyle("display").from(node), + isBlockElement = (displayStyle === "block" || displayStyle === "list-item"); + + if (isEmpty && isElement && canHaveHTML && !avoidInvisibleSpace) { + // Make sure that caret is visible in node by inserting a zero width no breaking space + try { node.innerHTML = wysihtml5.INVISIBLE_SPACE; } catch(e) {} + } + + if (canHaveHTML) { + range.selectNodeContents(node); + } else { + range.selectNode(node); + } + + if (canHaveHTML && isEmpty && isElement) { + range.collapse(isBlockElement); + } else if (canHaveHTML && isEmpty) { + range.setStartAfter(node); + range.setEndAfter(node); + } + + this.setSelection(range); + }, + + /** + * Get the node which contains the selection + * + * @param {Boolean} [controlRange] (only IE) Whether it should return the selected ControlRange element when the selection type is a "ControlRange" + * @return {Object} The node that contains the caret + * @example + * var nodeThatContainsCaret = selection.getSelectedNode(); + */ + getSelectedNode: function(controlRange) { + var selection, + range; + + if (controlRange && this.doc.selection && this.doc.selection.type === "Control") { + range = this.doc.selection.createRange(); + if (range && range.length) { + return range.item(0); + } + } + + selection = this.getSelection(this.doc); + if (selection.focusNode === selection.anchorNode) { + return selection.focusNode; + } else { + range = this.getRange(this.doc); + return range ? range.commonAncestorContainer : this.doc.body; + } + }, + + fixSelBorders: function() { + var range = this.getRange(); + expandRangeToSurround(range); + this.setSelection(range); + }, + + getSelectedOwnNodes: function(controlRange) { + var selection, + ranges = this.getOwnRanges(), + ownNodes = []; + + for (var i = 0, maxi = ranges.length; i < maxi; i++) { + ownNodes.push(ranges[i].commonAncestorContainer || this.doc.body); + } + return ownNodes; + }, + + findNodesInSelection: function(nodeTypes) { + var ranges = this.getOwnRanges(), + nodes = [], curNodes; + for (var i = 0, maxi = ranges.length; i < maxi; i++) { + curNodes = ranges[i].getNodes([1], function(node) { + return wysihtml5.lang.array(nodeTypes).contains(node.nodeName); + }); + nodes = nodes.concat(curNodes); + } + return nodes; + }, + + containsUneditable: function() { + var uneditables = this.getOwnUneditables(), + selection = this.getSelection(); + + for (var i = 0, maxi = uneditables.length; i < maxi; i++) { + if (selection.containsNode(uneditables[i])) { + return true; + } + } + + return false; + }, + + deleteContents: function() { + var ranges = this.getOwnRanges(); + for (var i = ranges.length; i--;) { + ranges[i].deleteContents(); + } + this.setSelection(ranges[0]); + }, + + getPreviousNode: function(node, ignoreEmpty) { + if (!node) { + var selection = this.getSelection(); + node = selection.anchorNode; + } + + if (node === this.contain) { + return false; + } + + var ret = node.previousSibling, + parent; + + if (ret === this.contain) { + return false; + } + + if (ret && ret.nodeType !== 3 && ret.nodeType !== 1) { + // do not count comments and other node types + ret = this.getPreviousNode(ret, ignoreEmpty); + } else if (ret && ret.nodeType === 3 && (/^\s*$/).test(ret.textContent)) { + // do not count empty textnodes as previus nodes + ret = this.getPreviousNode(ret, ignoreEmpty); + } else if (ignoreEmpty && ret && ret.nodeType === 1 && !wysihtml5.lang.array(["BR", "HR", "IMG"]).contains(ret.nodeName) && (/^[\s]*$/).test(ret.innerHTML)) { + // Do not count empty nodes if param set. + // Contenteditable tends to bypass and delete these silently when deleting with caret + ret = this.getPreviousNode(ret, ignoreEmpty); + } else if (!ret && node !== this.contain) { + parent = node.parentNode; + if (parent !== this.contain) { + ret = this.getPreviousNode(parent, ignoreEmpty); + } + } + + return (ret !== this.contain) ? ret : false; + }, + + getSelectionParentsByTag: function(tagName) { + var nodes = this.getSelectedOwnNodes(), + curEl, parents = []; + + for (var i = 0, maxi = nodes.length; i < maxi; i++) { + curEl = (nodes[i].nodeName && nodes[i].nodeName === 'LI') ? nodes[i] : wysihtml5.dom.getParentElement(nodes[i], { nodeName: ['LI']}, false, this.contain); + if (curEl) { + parents.push(curEl); + } + } + return (parents.length) ? parents : null; + }, + + getRangeToNodeEnd: function() { + if (this.isCollapsed()) { + var range = this.getRange(), + sNode = range.startContainer, + pos = range.startOffset, + lastR = rangy.createRange(this.doc); + + lastR.selectNodeContents(sNode); + lastR.setStart(sNode, pos); + return lastR; + } + }, + + caretIsLastInSelection: function() { + var r = rangy.createRange(this.doc), + s = this.getSelection(), + endc = this.getRangeToNodeEnd().cloneContents(), + endtxt = endc.textContent; + + return (/^\s*$/).test(endtxt); + }, + + caretIsFirstInSelection: function() { + var r = rangy.createRange(this.doc), + s = this.getSelection(), + range = this.getRange(), + startNode = range.startContainer; + + if (startNode.nodeType === wysihtml5.TEXT_NODE) { + return this.isCollapsed() && (startNode.nodeType === wysihtml5.TEXT_NODE && (/^\s*$/).test(startNode.data.substr(0,range.startOffset))); + } else { + r.selectNodeContents(this.getRange().commonAncestorContainer); + r.collapse(true); + return (this.isCollapsed() && (r.startContainer === s.anchorNode || r.endContainer === s.anchorNode) && r.startOffset === s.anchorOffset); + } + }, + + caretIsInTheBeginnig: function(ofNode) { + var selection = this.getSelection(), + node = selection.anchorNode, + offset = selection.anchorOffset; + if (ofNode) { + return (offset === 0 && (node.nodeName && node.nodeName === ofNode.toUpperCase() || wysihtml5.dom.getParentElement(node.parentNode, { nodeName: ofNode }, 1))); + } else { + return (offset === 0 && !this.getPreviousNode(node, true)); + } + }, + + caretIsBeforeUneditable: function() { + var selection = this.getSelection(), + node = selection.anchorNode, + offset = selection.anchorOffset; + + if (offset === 0) { + var prevNode = this.getPreviousNode(node, true); + if (prevNode) { + var uneditables = this.getOwnUneditables(); + for (var i = 0, maxi = uneditables.length; i < maxi; i++) { + if (prevNode === uneditables[i]) { + return uneditables[i]; + } + } + } + } + return false; + }, + + // TODO: Figure out a method from following 2 that would work universally + executeAndRestoreRangy: function(method, restoreScrollPosition) { + var win = this.doc.defaultView || this.doc.parentWindow, + sel = rangy.saveSelection(win); + + if (!sel) { + method(); + } else { + try { + method(); + } catch(e) { + setTimeout(function() { throw e; }, 0); + } + } + rangy.restoreSelection(sel); + }, + + // TODO: has problems in chrome 12. investigate block level and uneditable area inbetween + executeAndRestore: function(method, restoreScrollPosition) { + var body = this.doc.body, + oldScrollTop = restoreScrollPosition && body.scrollTop, + oldScrollLeft = restoreScrollPosition && body.scrollLeft, + className = "_wysihtml5-temp-placeholder", + placeholderHtml = '<span class="' + className + '">' + wysihtml5.INVISIBLE_SPACE + '</span>', + range = this.getRange(true), + caretPlaceholder, + newCaretPlaceholder, + nextSibling, prevSibling, + node, node2, range2, + newRange; + + // Nothing selected, execute and say goodbye + if (!range) { + method(body, body); + return; + } + + if (!range.collapsed) { + range2 = range.cloneRange(); + node2 = range2.createContextualFragment(placeholderHtml); + range2.collapse(false); + range2.insertNode(node2); + range2.detach(); + } + + node = range.createContextualFragment(placeholderHtml); + range.insertNode(node); + + if (node2) { + caretPlaceholder = this.contain.querySelectorAll("." + className); + range.setStartBefore(caretPlaceholder[0]); + range.setEndAfter(caretPlaceholder[caretPlaceholder.length -1]); + } + this.setSelection(range); + + // Make sure that a potential error doesn't cause our placeholder element to be left as a placeholder + try { + method(range.startContainer, range.endContainer); + } catch(e) { + setTimeout(function() { throw e; }, 0); + } + caretPlaceholder = this.contain.querySelectorAll("." + className); + if (caretPlaceholder && caretPlaceholder.length) { + newRange = rangy.createRange(this.doc); + nextSibling = caretPlaceholder[0].nextSibling; + if (caretPlaceholder.length > 1) { + prevSibling = caretPlaceholder[caretPlaceholder.length -1].previousSibling; + } + if (prevSibling && nextSibling) { + newRange.setStartBefore(nextSibling); + newRange.setEndAfter(prevSibling); + } else { + newCaretPlaceholder = this.doc.createTextNode(wysihtml5.INVISIBLE_SPACE); + dom.insert(newCaretPlaceholder).after(caretPlaceholder[0]); + newRange.setStartBefore(newCaretPlaceholder); + newRange.setEndAfter(newCaretPlaceholder); + } + this.setSelection(newRange); + for (var i = caretPlaceholder.length; i--;) { + caretPlaceholder[i].parentNode.removeChild(caretPlaceholder[i]); + } + + } else { + // fallback for when all hell breaks loose + this.contain.focus(); + } + + if (restoreScrollPosition) { + body.scrollTop = oldScrollTop; + body.scrollLeft = oldScrollLeft; + } + + // Remove it again, just to make sure that the placeholder is definitely out of the dom tree + try { + caretPlaceholder.parentNode.removeChild(caretPlaceholder); + } catch(e2) {} + }, + + set: function(node, offset) { + var newRange = rangy.createRange(this.doc); + newRange.setStart(node, offset || 0); + this.setSelection(newRange); + }, + + /** + * Insert html at the caret position and move the cursor after the inserted html + * + * @param {String} html HTML string to insert + * @example + * selection.insertHTML("<p>foobar</p>"); + */ + insertHTML: function(html) { + var range = rangy.createRange(this.doc), + node = this.doc.createElement('DIV'), + fragment = this.doc.createDocumentFragment(), + lastChild; + + node.innerHTML = html; + lastChild = node.lastChild; + + while (node.firstChild) { + fragment.appendChild(node.firstChild); + } + this.insertNode(fragment); + + if (lastChild) { + this.setAfter(lastChild); + } + }, + + /** + * Insert a node at the caret position and move the cursor behind it + * + * @param {Object} node HTML string to insert + * @example + * selection.insertNode(document.createTextNode("foobar")); + */ + insertNode: function(node) { + var range = this.getRange(); + if (range) { + range.insertNode(node); + } + }, + + /** + * Wraps current selection with the given node + * + * @param {Object} node The node to surround the selected elements with + */ + surround: function(nodeOptions) { + var ranges = this.getOwnRanges(), + node, nodes = []; + if (ranges.length == 0) { + return nodes; + } + + for (var i = ranges.length; i--;) { + node = this.doc.createElement(nodeOptions.nodeName); + nodes.push(node); + if (nodeOptions.className) { + node.className = nodeOptions.className; + } + if (nodeOptions.cssStyle) { + node.setAttribute('style', nodeOptions.cssStyle); + } + try { + // This only works when the range boundaries are not overlapping other elements + ranges[i].surroundContents(node); + this.selectNode(node); + } catch(e) { + // fallback + node.appendChild(ranges[i].extractContents()); + ranges[i].insertNode(node); + } + } + return nodes; + }, + + deblockAndSurround: function(nodeOptions) { + var tempElement = this.doc.createElement('div'), + range = rangy.createRange(this.doc), + tempDivElements, + tempElements, + firstChild; + + tempElement.className = nodeOptions.className; + + this.composer.commands.exec("formatBlock", nodeOptions.nodeName, nodeOptions.className); + tempDivElements = this.contain.querySelectorAll("." + nodeOptions.className); + if (tempDivElements[0]) { + tempDivElements[0].parentNode.insertBefore(tempElement, tempDivElements[0]); + + range.setStartBefore(tempDivElements[0]); + range.setEndAfter(tempDivElements[tempDivElements.length - 1]); + tempElements = range.extractContents(); + + while (tempElements.firstChild) { + firstChild = tempElements.firstChild; + if (firstChild.nodeType == 1 && wysihtml5.dom.hasClass(firstChild, nodeOptions.className)) { + while (firstChild.firstChild) { + tempElement.appendChild(firstChild.firstChild); + } + if (firstChild.nodeName !== "BR") { tempElement.appendChild(this.doc.createElement('br')); } + tempElements.removeChild(firstChild); + } else { + tempElement.appendChild(firstChild); + } + } + } else { + tempElement = null; + } + + return tempElement; + }, + + /** + * Scroll the current caret position into the view + * FIXME: This is a bit hacky, there might be a smarter way of doing this + * + * @example + * selection.scrollIntoView(); + */ + scrollIntoView: function() { + var doc = this.doc, + tolerance = 5, // px + hasScrollBars = doc.documentElement.scrollHeight > doc.documentElement.offsetHeight, + tempElement = doc._wysihtml5ScrollIntoViewElement = doc._wysihtml5ScrollIntoViewElement || (function() { + var element = doc.createElement("span"); + // The element needs content in order to be able to calculate it's position properly + element.innerHTML = wysihtml5.INVISIBLE_SPACE; + return element; + })(), + offsetTop; + + if (hasScrollBars) { + this.insertNode(tempElement); + offsetTop = _getCumulativeOffsetTop(tempElement); + tempElement.parentNode.removeChild(tempElement); + if (offsetTop >= (doc.body.scrollTop + doc.documentElement.offsetHeight - tolerance)) { + doc.body.scrollTop = offsetTop; + } + } + }, + + /** + * Select line where the caret is in + */ + selectLine: function() { + if (wysihtml5.browser.supportsSelectionModify()) { + this._selectLine_W3C(); + } else if (this.doc.selection) { + this._selectLine_MSIE(); + } + }, + + /** + * See https://developer.mozilla.org/en/DOM/Selection/modify + */ + _selectLine_W3C: function() { + var win = this.doc.defaultView, + selection = win.getSelection(); + selection.modify("move", "left", "lineboundary"); + selection.modify("extend", "right", "lineboundary"); + }, + + _selectLine_MSIE: function() { + var range = this.doc.selection.createRange(), + rangeTop = range.boundingTop, + scrollWidth = this.doc.body.scrollWidth, + rangeBottom, + rangeEnd, + measureNode, + i, + j; + + if (!range.moveToPoint) { + return; + } + + if (rangeTop === 0) { + // Don't know why, but when the selection ends at the end of a line + // range.boundingTop is 0 + measureNode = this.doc.createElement("span"); + this.insertNode(measureNode); + rangeTop = measureNode.offsetTop; + measureNode.parentNode.removeChild(measureNode); + } + + rangeTop += 1; + + for (i=-10; i<scrollWidth; i+=2) { + try { + range.moveToPoint(i, rangeTop); + break; + } catch(e1) {} + } + + // Investigate the following in order to handle multi line selections + // rangeBottom = rangeTop + (rangeHeight ? (rangeHeight - 1) : 0); + rangeBottom = rangeTop; + rangeEnd = this.doc.selection.createRange(); + for (j=scrollWidth; j>=0; j--) { + try { + rangeEnd.moveToPoint(j, rangeBottom); + break; + } catch(e2) {} + } + + range.setEndPoint("EndToEnd", rangeEnd); + range.select(); + }, + + getText: function() { + var selection = this.getSelection(); + return selection ? selection.toString() : ""; + }, + + getNodes: function(nodeType, filter) { + var range = this.getRange(); + if (range) { + return range.getNodes([nodeType], filter); + } else { + return []; + } + }, + + fixRangeOverflow: function(range) { + if (this.contain && this.contain.firstChild && range) { + var containment = range.compareNode(this.contain); + if (containment !== 2) { + if (containment === 1) { + range.setStartBefore(this.contain.firstChild); + } + if (containment === 0) { + range.setEndAfter(this.contain.lastChild); + } + if (containment === 3) { + range.setStartBefore(this.contain.firstChild); + range.setEndAfter(this.contain.lastChild); + } + } else if (this._detectInlineRangeProblems(range)) { + var previousElementSibling = range.endContainer.previousElementSibling; + if (previousElementSibling) { + range.setEnd(previousElementSibling, this._endOffsetForNode(previousElementSibling)); + } + } + } + }, + + _endOffsetForNode: function(node) { + var range = document.createRange(); + range.selectNodeContents(node); + return range.endOffset; + }, + + _detectInlineRangeProblems: function(range) { + var position = dom.compareDocumentPosition(range.startContainer, range.endContainer); + return ( + range.endOffset == 0 && + position & 4 //Node.DOCUMENT_POSITION_FOLLOWING + ); + }, + + getRange: function(dontFix) { + var selection = this.getSelection(), + range = selection && selection.rangeCount && selection.getRangeAt(0); + + if (dontFix !== true) { + this.fixRangeOverflow(range); + } + + return range; + }, + + getOwnUneditables: function() { + var allUneditables = dom.query(this.contain, '.' + this.unselectableClass), + deepUneditables = dom.query(allUneditables, '.' + this.unselectableClass); + + return wysihtml5.lang.array(allUneditables).without(deepUneditables); + }, + + // Returns an array of ranges that belong only to this editable + // Needed as uneditable block in contenteditabel can split range into pieces + // If manipulating content reverse loop is usually needed as manipulation can shift subsequent ranges + getOwnRanges: function() { + var ranges = [], + r = this.getRange(), + tmpRanges; + + if (r) { ranges.push(r); } + + if (this.unselectableClass && this.contain && r) { + var uneditables = this.getOwnUneditables(), + tmpRange; + if (uneditables.length > 0) { + for (var i = 0, imax = uneditables.length; i < imax; i++) { + tmpRanges = []; + for (var j = 0, jmax = ranges.length; j < jmax; j++) { + if (ranges[j]) { + switch (ranges[j].compareNode(uneditables[i])) { + case 2: + // all selection inside uneditable. remove + break; + case 3: + //section begins before and ends after uneditable. spilt + tmpRange = ranges[j].cloneRange(); + tmpRange.setEndBefore(uneditables[i]); + tmpRanges.push(tmpRange); + + tmpRange = ranges[j].cloneRange(); + tmpRange.setStartAfter(uneditables[i]); + tmpRanges.push(tmpRange); + break; + default: + // in all other cases uneditable does not touch selection. dont modify + tmpRanges.push(ranges[j]); + } + } + ranges = tmpRanges; + } + } + } + } + return ranges; + }, + + getSelection: function() { + return rangy.getSelection(this.doc.defaultView || this.doc.parentWindow); + }, + + setSelection: function(range) { + var win = this.doc.defaultView || this.doc.parentWindow, + selection = rangy.getSelection(win); + return selection.setSingleRange(range); + }, + + createRange: function() { + return rangy.createRange(this.doc); + }, + + isCollapsed: function() { + return this.getSelection().isCollapsed; + }, + + getHtml: function() { + return this.getSelection().toHtml(); + }, + + isEndToEndInNode: function(nodeNames) { + var range = this.getRange(), + parentElement = range.commonAncestorContainer, + startNode = range.startContainer, + endNode = range.endContainer; + + + if (parentElement.nodeType === wysihtml5.TEXT_NODE) { + parentElement = parentElement.parentNode; + } + + if (startNode.nodeType === wysihtml5.TEXT_NODE && !(/^\s*$/).test(startNode.data.substr(range.startOffset))) { + return false; + } + + if (endNode.nodeType === wysihtml5.TEXT_NODE && !(/^\s*$/).test(endNode.data.substr(range.endOffset))) { + return false; + } + + while (startNode && startNode !== parentElement) { + if (startNode.nodeType !== wysihtml5.TEXT_NODE && !wysihtml5.dom.contains(parentElement, startNode)) { + return false; + } + if (wysihtml5.dom.domNode(startNode).prev({ignoreBlankTexts: true})) { + return false; + } + startNode = startNode.parentNode; + } + + while (endNode && endNode !== parentElement) { + if (endNode.nodeType !== wysihtml5.TEXT_NODE && !wysihtml5.dom.contains(parentElement, endNode)) { + return false; + } + if (wysihtml5.dom.domNode(endNode).next({ignoreBlankTexts: true})) { + return false; + } + endNode = endNode.parentNode; + } + + return (wysihtml5.lang.array(nodeNames).contains(parentElement.nodeName)) ? parentElement : false; + }, + + deselect: function() { + var sel = this.getSelection(); + sel && sel.removeAllRanges(); + } + }); + +})(wysihtml5); +;/** + * Inspired by the rangy CSS Applier module written by Tim Down and licensed under the MIT license. + * http://code.google.com/p/rangy/ + * + * changed in order to be able ... + * - to use custom tags + * - to detect and replace similar css classes via reg exp + */ +(function(wysihtml5, rangy) { + var defaultTagName = "span"; + + var REG_EXP_WHITE_SPACE = /\s+/g; + + function hasClass(el, cssClass, regExp) { + if (!el.className) { + return false; + } + + var matchingClassNames = el.className.match(regExp) || []; + return matchingClassNames[matchingClassNames.length - 1] === cssClass; + } + + function hasStyleAttr(el, regExp) { + if (!el.getAttribute || !el.getAttribute('style')) { + return false; + } + var matchingStyles = el.getAttribute('style').match(regExp); + return (el.getAttribute('style').match(regExp)) ? true : false; + } + + function addStyle(el, cssStyle, regExp) { + if (el.getAttribute('style')) { + removeStyle(el, regExp); + if (el.getAttribute('style') && !(/^\s*$/).test(el.getAttribute('style'))) { + el.setAttribute('style', cssStyle + ";" + el.getAttribute('style')); + } else { + el.setAttribute('style', cssStyle); + } + } else { + el.setAttribute('style', cssStyle); + } + } + + function addClass(el, cssClass, regExp) { + if (el.className) { + removeClass(el, regExp); + el.className += " " + cssClass; + } else { + el.className = cssClass; + } + } + + function removeClass(el, regExp) { + if (el.className) { + el.className = el.className.replace(regExp, ""); + } + } + + function removeStyle(el, regExp) { + var s, + s2 = []; + if (el.getAttribute('style')) { + s = el.getAttribute('style').split(';'); + for (var i = s.length; i--;) { + if (!s[i].match(regExp) && !(/^\s*$/).test(s[i])) { + s2.push(s[i]); + } + } + if (s2.length) { + el.setAttribute('style', s2.join(';')); + } else { + el.removeAttribute('style'); + } + } + } + + function getMatchingStyleRegexp(el, style) { + var regexes = [], + sSplit = style.split(';'), + elStyle = el.getAttribute('style'); + + if (elStyle) { + elStyle = elStyle.replace(/\s/gi, '').toLowerCase(); + regexes.push(new RegExp("(^|\\s|;)" + style.replace(/\s/gi, '').replace(/([\(\)])/gi, "\\$1").toLowerCase().replace(";", ";?").replace(/rgb\\\((\d+),(\d+),(\d+)\\\)/gi, "\\s?rgb\\($1,\\s?$2,\\s?$3\\)"), "gi")); + + for (var i = sSplit.length; i-- > 0;) { + if (!(/^\s*$/).test(sSplit[i])) { + regexes.push(new RegExp("(^|\\s|;)" + sSplit[i].replace(/\s/gi, '').replace(/([\(\)])/gi, "\\$1").toLowerCase().replace(";", ";?").replace(/rgb\\\((\d+),(\d+),(\d+)\\\)/gi, "\\s?rgb\\($1,\\s?$2,\\s?$3\\)"), "gi")); + } + } + for (var j = 0, jmax = regexes.length; j < jmax; j++) { + if (elStyle.match(regexes[j])) { + return regexes[j]; + } + } + } + + return false; + } + + function isMatchingAllready(node, tags, style, className) { + if (style) { + return getMatchingStyleRegexp(node, style); + } else if (className) { + return wysihtml5.dom.hasClass(node, className); + } else { + return rangy.dom.arrayContains(tags, node.tagName.toLowerCase()); + } + } + + function areMatchingAllready(nodes, tags, style, className) { + for (var i = nodes.length; i--;) { + if (!isMatchingAllready(nodes[i], tags, style, className)) { + return false; + } + } + return nodes.length ? true : false; + } + + function removeOrChangeStyle(el, style, regExp) { + + var exactRegex = getMatchingStyleRegexp(el, style); + if (exactRegex) { + // adding same style value on property again removes style + removeStyle(el, exactRegex); + return "remove"; + } else { + // adding new style value changes value + addStyle(el, style, regExp); + return "change"; + } + } + + function hasSameClasses(el1, el2) { + return el1.className.replace(REG_EXP_WHITE_SPACE, " ") == el2.className.replace(REG_EXP_WHITE_SPACE, " "); + } + + function replaceWithOwnChildren(el) { + var parent = el.parentNode; + while (el.firstChild) { + parent.insertBefore(el.firstChild, el); + } + parent.removeChild(el); + } + + function elementsHaveSameNonClassAttributes(el1, el2) { + if (el1.attributes.length != el2.attributes.length) { + return false; + } + for (var i = 0, len = el1.attributes.length, attr1, attr2, name; i < len; ++i) { + attr1 = el1.attributes[i]; + name = attr1.name; + if (name != "class") { + attr2 = el2.attributes.getNamedItem(name); + if (attr1.specified != attr2.specified) { + return false; + } + if (attr1.specified && attr1.nodeValue !== attr2.nodeValue) { + return false; + } + } + } + return true; + } + + function isSplitPoint(node, offset) { + if (rangy.dom.isCharacterDataNode(node)) { + if (offset == 0) { + return !!node.previousSibling; + } else if (offset == node.length) { + return !!node.nextSibling; + } else { + return true; + } + } + + return offset > 0 && offset < node.childNodes.length; + } + + function splitNodeAt(node, descendantNode, descendantOffset, container) { + var newNode; + if (rangy.dom.isCharacterDataNode(descendantNode)) { + if (descendantOffset == 0) { + descendantOffset = rangy.dom.getNodeIndex(descendantNode); + descendantNode = descendantNode.parentNode; + } else if (descendantOffset == descendantNode.length) { + descendantOffset = rangy.dom.getNodeIndex(descendantNode) + 1; + descendantNode = descendantNode.parentNode; + } else { + newNode = rangy.dom.splitDataNode(descendantNode, descendantOffset); + } + } + if (!newNode) { + if (!container || descendantNode !== container) { + + newNode = descendantNode.cloneNode(false); + if (newNode.id) { + newNode.removeAttribute("id"); + } + var child; + while ((child = descendantNode.childNodes[descendantOffset])) { + newNode.appendChild(child); + } + rangy.dom.insertAfter(newNode, descendantNode); + + } + } + return (descendantNode == node) ? newNode : splitNodeAt(node, newNode.parentNode, rangy.dom.getNodeIndex(newNode), container); + } + + function Merge(firstNode) { + this.isElementMerge = (firstNode.nodeType == wysihtml5.ELEMENT_NODE); + this.firstTextNode = this.isElementMerge ? firstNode.lastChild : firstNode; + this.textNodes = [this.firstTextNode]; + } + + Merge.prototype = { + doMerge: function() { + var textBits = [], textNode, parent, text; + for (var i = 0, len = this.textNodes.length; i < len; ++i) { + textNode = this.textNodes[i]; + parent = textNode.parentNode; + textBits[i] = textNode.data; + if (i) { + parent.removeChild(textNode); + if (!parent.hasChildNodes()) { + parent.parentNode.removeChild(parent); + } + } + } + this.firstTextNode.data = text = textBits.join(""); + return text; + }, + + getLength: function() { + var i = this.textNodes.length, len = 0; + while (i--) { + len += this.textNodes[i].length; + } + return len; + }, + + toString: function() { + var textBits = []; + for (var i = 0, len = this.textNodes.length; i < len; ++i) { + textBits[i] = "'" + this.textNodes[i].data + "'"; + } + return "[Merge(" + textBits.join(",") + ")]"; + } + }; + + function HTMLApplier(tagNames, cssClass, similarClassRegExp, normalize, cssStyle, similarStyleRegExp, container) { + this.tagNames = tagNames || [defaultTagName]; + this.cssClass = cssClass || ((cssClass === false) ? false : ""); + this.similarClassRegExp = similarClassRegExp; + this.cssStyle = cssStyle || ""; + this.similarStyleRegExp = similarStyleRegExp; + this.normalize = normalize; + this.applyToAnyTagName = false; + this.container = container; + } + + HTMLApplier.prototype = { + getAncestorWithClass: function(node) { + var cssClassMatch; + while (node) { + cssClassMatch = this.cssClass ? hasClass(node, this.cssClass, this.similarClassRegExp) : (this.cssStyle !== "") ? false : true; + if (node.nodeType == wysihtml5.ELEMENT_NODE && node.getAttribute("contenteditable") != "false" && rangy.dom.arrayContains(this.tagNames, node.tagName.toLowerCase()) && cssClassMatch) { + return node; + } + node = node.parentNode; + } + return false; + }, + + // returns parents of node with given style attribute + getAncestorWithStyle: function(node) { + var cssStyleMatch; + while (node) { + cssStyleMatch = this.cssStyle ? hasStyleAttr(node, this.similarStyleRegExp) : false; + + if (node.nodeType == wysihtml5.ELEMENT_NODE && node.getAttribute("contenteditable") != "false" && rangy.dom.arrayContains(this.tagNames, node.tagName.toLowerCase()) && cssStyleMatch) { + return node; + } + node = node.parentNode; + } + return false; + }, + + getMatchingAncestor: function(node) { + var ancestor = this.getAncestorWithClass(node), + matchType = false; + + if (!ancestor) { + ancestor = this.getAncestorWithStyle(node); + if (ancestor) { + matchType = "style"; + } + } else { + if (this.cssStyle) { + matchType = "class"; + } + } + + return { + "element": ancestor, + "type": matchType + }; + }, + + // Normalizes nodes after applying a CSS class to a Range. + postApply: function(textNodes, range) { + var firstNode = textNodes[0], lastNode = textNodes[textNodes.length - 1]; + + var merges = [], currentMerge; + + var rangeStartNode = firstNode, rangeEndNode = lastNode; + var rangeStartOffset = 0, rangeEndOffset = lastNode.length; + + var textNode, precedingTextNode; + + for (var i = 0, len = textNodes.length; i < len; ++i) { + textNode = textNodes[i]; + precedingTextNode = null; + if (textNode && textNode.parentNode) { + precedingTextNode = this.getAdjacentMergeableTextNode(textNode.parentNode, false); + } + if (precedingTextNode) { + if (!currentMerge) { + currentMerge = new Merge(precedingTextNode); + merges.push(currentMerge); + } + currentMerge.textNodes.push(textNode); + if (textNode === firstNode) { + rangeStartNode = currentMerge.firstTextNode; + rangeStartOffset = rangeStartNode.length; + } + if (textNode === lastNode) { + rangeEndNode = currentMerge.firstTextNode; + rangeEndOffset = currentMerge.getLength(); + } + } else { + currentMerge = null; + } + } + // Test whether the first node after the range needs merging + if(lastNode && lastNode.parentNode) { + var nextTextNode = this.getAdjacentMergeableTextNode(lastNode.parentNode, true); + if (nextTextNode) { + if (!currentMerge) { + currentMerge = new Merge(lastNode); + merges.push(currentMerge); + } + currentMerge.textNodes.push(nextTextNode); + } + } + // Do the merges + if (merges.length) { + for (i = 0, len = merges.length; i < len; ++i) { + merges[i].doMerge(); + } + // Set the range boundaries + range.setStart(rangeStartNode, rangeStartOffset); + range.setEnd(rangeEndNode, rangeEndOffset); + } + }, + + getAdjacentMergeableTextNode: function(node, forward) { + var isTextNode = (node.nodeType == wysihtml5.TEXT_NODE); + var el = isTextNode ? node.parentNode : node; + var adjacentNode; + var propName = forward ? "nextSibling" : "previousSibling"; + if (isTextNode) { + // Can merge if the node's previous/next sibling is a text node + adjacentNode = node[propName]; + if (adjacentNode && adjacentNode.nodeType == wysihtml5.TEXT_NODE) { + return adjacentNode; + } + } else { + // Compare element with its sibling + adjacentNode = el[propName]; + if (adjacentNode && this.areElementsMergeable(node, adjacentNode)) { + return adjacentNode[forward ? "firstChild" : "lastChild"]; + } + } + return null; + }, + + areElementsMergeable: function(el1, el2) { + return rangy.dom.arrayContains(this.tagNames, (el1.tagName || "").toLowerCase()) + && rangy.dom.arrayContains(this.tagNames, (el2.tagName || "").toLowerCase()) + && hasSameClasses(el1, el2) + && elementsHaveSameNonClassAttributes(el1, el2); + }, + + createContainer: function(doc) { + var el = doc.createElement(this.tagNames[0]); + if (this.cssClass) { + el.className = this.cssClass; + } + if (this.cssStyle) { + el.setAttribute('style', this.cssStyle); + } + return el; + }, + + applyToTextNode: function(textNode) { + var parent = textNode.parentNode; + if (parent.childNodes.length == 1 && rangy.dom.arrayContains(this.tagNames, parent.tagName.toLowerCase())) { + + if (this.cssClass) { + addClass(parent, this.cssClass, this.similarClassRegExp); + } + if (this.cssStyle) { + addStyle(parent, this.cssStyle, this.similarStyleRegExp); + } + } else { + var el = this.createContainer(rangy.dom.getDocument(textNode)); + textNode.parentNode.insertBefore(el, textNode); + el.appendChild(textNode); + } + }, + + isRemovable: function(el) { + return rangy.dom.arrayContains(this.tagNames, el.tagName.toLowerCase()) && + wysihtml5.lang.string(el.className).trim() === "" && + ( + !el.getAttribute('style') || + wysihtml5.lang.string(el.getAttribute('style')).trim() === "" + ); + }, + + undoToTextNode: function(textNode, range, ancestorWithClass, ancestorWithStyle) { + var styleMode = (ancestorWithClass) ? false : true, + ancestor = ancestorWithClass || ancestorWithStyle, + styleChanged = false; + if (!range.containsNode(ancestor)) { + // Split out the portion of the ancestor from which we can remove the CSS class + var ancestorRange = range.cloneRange(); + ancestorRange.selectNode(ancestor); + + if (ancestorRange.isPointInRange(range.endContainer, range.endOffset) && isSplitPoint(range.endContainer, range.endOffset)) { + splitNodeAt(ancestor, range.endContainer, range.endOffset, this.container); + range.setEndAfter(ancestor); + } + if (ancestorRange.isPointInRange(range.startContainer, range.startOffset) && isSplitPoint(range.startContainer, range.startOffset)) { + ancestor = splitNodeAt(ancestor, range.startContainer, range.startOffset, this.container); + } + } + + if (!styleMode && this.similarClassRegExp) { + removeClass(ancestor, this.similarClassRegExp); + } + + if (styleMode && this.similarStyleRegExp) { + styleChanged = (removeOrChangeStyle(ancestor, this.cssStyle, this.similarStyleRegExp) === "change"); + } + if (this.isRemovable(ancestor) && !styleChanged) { + replaceWithOwnChildren(ancestor); + } + }, + + applyToRange: function(range) { + var textNodes; + for (var ri = range.length; ri--;) { + textNodes = range[ri].getNodes([wysihtml5.TEXT_NODE]); + + if (!textNodes.length) { + try { + var node = this.createContainer(range[ri].endContainer.ownerDocument); + range[ri].surroundContents(node); + this.selectNode(range[ri], node); + return; + } catch(e) {} + } + + range[ri].splitBoundaries(); + textNodes = range[ri].getNodes([wysihtml5.TEXT_NODE]); + if (textNodes.length) { + var textNode; + + for (var i = 0, len = textNodes.length; i < len; ++i) { + textNode = textNodes[i]; + if (!this.getMatchingAncestor(textNode).element) { + this.applyToTextNode(textNode); + } + } + + range[ri].setStart(textNodes[0], 0); + textNode = textNodes[textNodes.length - 1]; + range[ri].setEnd(textNode, textNode.length); + + if (this.normalize) { + this.postApply(textNodes, range[ri]); + } + } + + } + }, + + undoToRange: function(range) { + var textNodes, textNode, ancestorWithClass, ancestorWithStyle, ancestor; + for (var ri = range.length; ri--;) { + + textNodes = range[ri].getNodes([wysihtml5.TEXT_NODE]); + if (textNodes.length) { + range[ri].splitBoundaries(); + textNodes = range[ri].getNodes([wysihtml5.TEXT_NODE]); + } else { + var doc = range[ri].endContainer.ownerDocument, + node = doc.createTextNode(wysihtml5.INVISIBLE_SPACE); + range[ri].insertNode(node); + range[ri].selectNode(node); + textNodes = [node]; + } + + for (var i = 0, len = textNodes.length; i < len; ++i) { + if (range[ri].isValid()) { + textNode = textNodes[i]; + + ancestor = this.getMatchingAncestor(textNode); + if (ancestor.type === "style") { + this.undoToTextNode(textNode, range[ri], false, ancestor.element); + } else if (ancestor.element) { + this.undoToTextNode(textNode, range[ri], ancestor.element); + } + } + } + + if (len == 1) { + this.selectNode(range[ri], textNodes[0]); + } else { + range[ri].setStart(textNodes[0], 0); + textNode = textNodes[textNodes.length - 1]; + range[ri].setEnd(textNode, textNode.length); + + if (this.normalize) { + this.postApply(textNodes, range[ri]); + } + } + + } + }, + + selectNode: function(range, node) { + var isElement = node.nodeType === wysihtml5.ELEMENT_NODE, + canHaveHTML = "canHaveHTML" in node ? node.canHaveHTML : true, + content = isElement ? node.innerHTML : node.data, + isEmpty = (content === "" || content === wysihtml5.INVISIBLE_SPACE); + + if (isEmpty && isElement && canHaveHTML) { + // Make sure that caret is visible in node by inserting a zero width no breaking space + try { node.innerHTML = wysihtml5.INVISIBLE_SPACE; } catch(e) {} + } + range.selectNodeContents(node); + if (isEmpty && isElement) { + range.collapse(false); + } else if (isEmpty) { + range.setStartAfter(node); + range.setEndAfter(node); + } + }, + + getTextSelectedByRange: function(textNode, range) { + var textRange = range.cloneRange(); + textRange.selectNodeContents(textNode); + + var intersectionRange = textRange.intersection(range); + var text = intersectionRange ? intersectionRange.toString() : ""; + textRange.detach(); + + return text; + }, + + isAppliedToRange: function(range) { + var ancestors = [], + appliedType = "full", + ancestor, styleAncestor, textNodes; + + for (var ri = range.length; ri--;) { + + textNodes = range[ri].getNodes([wysihtml5.TEXT_NODE]); + if (!textNodes.length) { + ancestor = this.getMatchingAncestor(range[ri].startContainer).element; + + return (ancestor) ? { + "elements": [ancestor], + "coverage": appliedType + } : false; + } + + for (var i = 0, len = textNodes.length, selectedText; i < len; ++i) { + selectedText = this.getTextSelectedByRange(textNodes[i], range[ri]); + ancestor = this.getMatchingAncestor(textNodes[i]).element; + if (ancestor && selectedText != "") { + ancestors.push(ancestor); + + if (wysihtml5.dom.getTextNodes(ancestor, true).length === 1) { + appliedType = "full"; + } else if (appliedType === "full") { + appliedType = "inline"; + } + } else if (!ancestor) { + appliedType = "partial"; + } + } + + } + + return (ancestors.length) ? { + "elements": ancestors, + "coverage": appliedType + } : false; + }, + + toggleRange: function(range) { + var isApplied = this.isAppliedToRange(range), + parentsExactMatch; + + if (isApplied) { + if (isApplied.coverage === "full") { + this.undoToRange(range); + } else if (isApplied.coverage === "inline") { + parentsExactMatch = areMatchingAllready(isApplied.elements, this.tagNames, this.cssStyle, this.cssClass); + this.undoToRange(range); + if (!parentsExactMatch) { + this.applyToRange(range); + } + } else { + // partial + if (!areMatchingAllready(isApplied.elements, this.tagNames, this.cssStyle, this.cssClass)) { + this.undoToRange(range); + } + this.applyToRange(range); + } + } else { + this.applyToRange(range); + } + } + }; + + wysihtml5.selection.HTMLApplier = HTMLApplier; + +})(wysihtml5, rangy); +;/** + * Rich Text Query/Formatting Commands + * + * @example + * var commands = new wysihtml5.Commands(editor); + */ +wysihtml5.Commands = Base.extend( + /** @scope wysihtml5.Commands.prototype */ { + constructor: function(editor) { + this.editor = editor; + this.composer = editor.composer; + this.doc = this.composer.doc; + }, + + /** + * Check whether the browser supports the given command + * + * @param {String} command The command string which to check (eg. "bold", "italic", "insertUnorderedList") + * @example + * commands.supports("createLink"); + */ + support: function(command) { + return wysihtml5.browser.supportsCommand(this.doc, command); + }, + + /** + * Check whether the browser supports the given command + * + * @param {String} command The command string which to execute (eg. "bold", "italic", "insertUnorderedList") + * @param {String} [value] The command value parameter, needed for some commands ("createLink", "insertImage", ...), optional for commands that don't require one ("bold", "underline", ...) + * @example + * commands.exec("insertImage", "http://a1.twimg.com/profile_images/113868655/schrei_twitter_reasonably_small.jpg"); + */ + exec: function(command, value) { + var obj = wysihtml5.commands[command], + args = wysihtml5.lang.array(arguments).get(), + method = obj && obj.exec, + result = null; + + this.editor.fire("beforecommand:composer"); + + if (method) { + args.unshift(this.composer); + result = method.apply(obj, args); + } else { + try { + // try/catch for buggy firefox + result = this.doc.execCommand(command, false, value); + } catch(e) {} + } + + this.editor.fire("aftercommand:composer"); + return result; + }, + + /** + * Check whether the current command is active + * If the caret is within a bold text, then calling this with command "bold" should return true + * + * @param {String} command The command string which to check (eg. "bold", "italic", "insertUnorderedList") + * @param {String} [commandValue] The command value parameter (eg. for "insertImage" the image src) + * @return {Boolean} Whether the command is active + * @example + * var isCurrentSelectionBold = commands.state("bold"); + */ + state: function(command, commandValue) { + var obj = wysihtml5.commands[command], + args = wysihtml5.lang.array(arguments).get(), + method = obj && obj.state; + if (method) { + args.unshift(this.composer); + return method.apply(obj, args); + } else { + try { + // try/catch for buggy firefox + return this.doc.queryCommandState(command); + } catch(e) { + return false; + } + } + }, + + /* Get command state parsed value if command has stateValue parsing function */ + stateValue: function(command) { + var obj = wysihtml5.commands[command], + args = wysihtml5.lang.array(arguments).get(), + method = obj && obj.stateValue; + if (method) { + args.unshift(this.composer); + return method.apply(obj, args); + } else { + return false; + } + } +}); +;wysihtml5.commands.bold = { + exec: function(composer, command) { + wysihtml5.commands.formatInline.execWithToggle(composer, command, "b"); + }, + + state: function(composer, command) { + // element.ownerDocument.queryCommandState("bold") results: + // firefox: only <b> + // chrome: <b>, <strong>, <h1>, <h2>, ... + // ie: <b>, <strong> + // opera: <b>, <strong> + return wysihtml5.commands.formatInline.state(composer, command, "b"); + } +}; + +;(function(wysihtml5) { + var undef, + NODE_NAME = "A", + dom = wysihtml5.dom; + + function _format(composer, attributes) { + var doc = composer.doc, + tempClass = "_wysihtml5-temp-" + (+new Date()), + tempClassRegExp = /non-matching-class/g, + i = 0, + length, + anchors, + anchor, + hasElementChild, + isEmpty, + elementToSetCaretAfter, + textContent, + whiteSpace, + j; + wysihtml5.commands.formatInline.exec(composer, undef, NODE_NAME, tempClass, tempClassRegExp, undef, undef, true, true); + anchors = doc.querySelectorAll(NODE_NAME + "." + tempClass); + length = anchors.length; + for (; i<length; i++) { + anchor = anchors[i]; + anchor.removeAttribute("class"); + for (j in attributes) { + // Do not set attribute "text" as it is meant for setting string value if created link has no textual data + if (j !== "text") { + anchor.setAttribute(j, attributes[j]); + } + } + } + + elementToSetCaretAfter = anchor; + if (length === 1) { + textContent = dom.getTextContent(anchor); + hasElementChild = !!anchor.querySelector("*"); + isEmpty = textContent === "" || textContent === wysihtml5.INVISIBLE_SPACE; + if (!hasElementChild && isEmpty) { + dom.setTextContent(anchor, attributes.text || anchor.href); + whiteSpace = doc.createTextNode(" "); + composer.selection.setAfter(anchor); + dom.insert(whiteSpace).after(anchor); + elementToSetCaretAfter = whiteSpace; + } + } + composer.selection.setAfter(elementToSetCaretAfter); + } + + // Changes attributes of links + function _changeLinks(composer, anchors, attributes) { + var oldAttrs; + for (var a = anchors.length; a--;) { + + // Remove all old attributes + oldAttrs = anchors[a].attributes; + for (var oa = oldAttrs.length; oa--;) { + anchors[a].removeAttribute(oldAttrs.item(oa).name); + } + + // Set new attributes + for (var j in attributes) { + if (attributes.hasOwnProperty(j)) { + anchors[a].setAttribute(j, attributes[j]); + } + } + + } + } + + wysihtml5.commands.createLink = { + /** + * TODO: Use HTMLApplier or formatInline here + * + * Turns selection into a link + * If selection is already a link, it just changes the attributes + * + * @example + * // either ... + * wysihtml5.commands.createLink.exec(composer, "createLink", "http://www.google.de"); + * // ... or ... + * wysihtml5.commands.createLink.exec(composer, "createLink", { href: "http://www.google.de", target: "_blank" }); + */ + exec: function(composer, command, value) { + var anchors = this.state(composer, command); + if (anchors) { + // Selection contains links then change attributes of these links + composer.selection.executeAndRestore(function() { + _changeLinks(composer, anchors, value); + }); + } else { + // Create links + value = typeof(value) === "object" ? value : { href: value }; + _format(composer, value); + } + }, + + state: function(composer, command) { + return wysihtml5.commands.formatInline.state(composer, command, "A"); + } + }; +})(wysihtml5); +;(function(wysihtml5) { + var dom = wysihtml5.dom; + + function _removeFormat(composer, anchors) { + var length = anchors.length, + i = 0, + anchor, + codeElement, + textContent; + for (; i<length; i++) { + anchor = anchors[i]; + codeElement = dom.getParentElement(anchor, { nodeName: "code" }); + textContent = dom.getTextContent(anchor); + + // if <a> contains url-like text content, rename it to <code> to prevent re-autolinking + // else replace <a> with its childNodes + if (textContent.match(dom.autoLink.URL_REG_EXP) && !codeElement) { + // <code> element is used to prevent later auto-linking of the content + codeElement = dom.renameElement(anchor, "code"); + } else { + dom.replaceWithChildNodes(anchor); + } + } + } + + wysihtml5.commands.removeLink = { + /* + * If selection is a link, it removes the link and wraps it with a <code> element + * The <code> element is needed to avoid auto linking + * + * @example + * wysihtml5.commands.createLink.exec(composer, "removeLink"); + */ + + exec: function(composer, command) { + var anchors = this.state(composer, command); + if (anchors) { + composer.selection.executeAndRestore(function() { + _removeFormat(composer, anchors); + }); + } + }, + + state: function(composer, command) { + return wysihtml5.commands.formatInline.state(composer, command, "A"); + } + }; +})(wysihtml5); +;/** + * document.execCommand("fontSize") will create either inline styles (firefox, chrome) or use font tags + * which we don't want + * Instead we set a css class + */ +(function(wysihtml5) { + var REG_EXP = /wysiwyg-font-size-[0-9a-z\-]+/g; + + wysihtml5.commands.fontSize = { + exec: function(composer, command, size) { + wysihtml5.commands.formatInline.execWithToggle(composer, command, "span", "wysiwyg-font-size-" + size, REG_EXP); + }, + + state: function(composer, command, size) { + return wysihtml5.commands.formatInline.state(composer, command, "span", "wysiwyg-font-size-" + size, REG_EXP); + } + }; +})(wysihtml5); +;/* In case font size adjustment to any number defined by user is preferred, we cannot use classes and must use inline styles. */ +(function(wysihtml5) { + var REG_EXP = /(\s|^)font-size\s*:\s*[^;\s]+;?/gi; + + wysihtml5.commands.fontSizeStyle = { + exec: function(composer, command, size) { + size = (typeof(size) == "object") ? size.size : size; + if (!(/^\s*$/).test(size)) { + wysihtml5.commands.formatInline.execWithToggle(composer, command, "span", false, false, "font-size:" + size, REG_EXP); + } + }, + + state: function(composer, command, size) { + return wysihtml5.commands.formatInline.state(composer, command, "span", false, false, "font-size", REG_EXP); + }, + + stateValue: function(composer, command) { + var st = this.state(composer, command), + styleStr, fontsizeMatches, + val = false; + + if (st && wysihtml5.lang.object(st).isArray()) { + st = st[0]; + } + if (st) { + styleStr = st.getAttribute('style'); + if (styleStr) { + return wysihtml5.quirks.styleParser.parseFontSize(styleStr); + } + } + return false; + } + }; +})(wysihtml5); +;/** + * document.execCommand("foreColor") will create either inline styles (firefox, chrome) or use font tags + * which we don't want + * Instead we set a css class + */ +(function(wysihtml5) { + var REG_EXP = /wysiwyg-color-[0-9a-z]+/g; + + wysihtml5.commands.foreColor = { + exec: function(composer, command, color) { + wysihtml5.commands.formatInline.execWithToggle(composer, command, "span", "wysiwyg-color-" + color, REG_EXP); + }, + + state: function(composer, command, color) { + return wysihtml5.commands.formatInline.state(composer, command, "span", "wysiwyg-color-" + color, REG_EXP); + } + }; +})(wysihtml5); +;/** + * document.execCommand("foreColor") will create either inline styles (firefox, chrome) or use font tags + * which we don't want + * Instead we set a css class + */ +(function(wysihtml5) { + var REG_EXP = /(\s|^)color\s*:\s*[^;\s]+;?/gi; + + wysihtml5.commands.foreColorStyle = { + exec: function(composer, command, color) { + var colorVals = wysihtml5.quirks.styleParser.parseColor((typeof(color) == "object") ? "color:" + color.color : "color:" + color, "color"), + colString; + + if (colorVals) { + colString = "color: rgb(" + colorVals[0] + ',' + colorVals[1] + ',' + colorVals[2] + ');'; + if (colorVals[3] !== 1) { + colString += "color: rgba(" + colorVals[0] + ',' + colorVals[1] + ',' + colorVals[2] + ',' + colorVals[3] + ');'; + } + wysihtml5.commands.formatInline.execWithToggle(composer, command, "span", false, false, colString, REG_EXP); + } + }, + + state: function(composer, command) { + return wysihtml5.commands.formatInline.state(composer, command, "span", false, false, "color", REG_EXP); + }, + + stateValue: function(composer, command, props) { + var st = this.state(composer, command), + colorStr; + + if (st && wysihtml5.lang.object(st).isArray()) { + st = st[0]; + } + + if (st) { + colorStr = st.getAttribute('style'); + if (colorStr) { + if (colorStr) { + val = wysihtml5.quirks.styleParser.parseColor(colorStr, "color"); + return wysihtml5.quirks.styleParser.unparseColor(val, props); + } + } + } + return false; + } + + }; +})(wysihtml5); +;/* In case background adjustment to any color defined by user is preferred, we cannot use classes and must use inline styles. */ +(function(wysihtml5) { + var REG_EXP = /(\s|^)background-color\s*:\s*[^;\s]+;?/gi; + + wysihtml5.commands.bgColorStyle = { + exec: function(composer, command, color) { + var colorVals = wysihtml5.quirks.styleParser.parseColor((typeof(color) == "object") ? "background-color:" + color.color : "background-color:" + color, "background-color"), + colString; + + if (colorVals) { + colString = "background-color: rgb(" + colorVals[0] + ',' + colorVals[1] + ',' + colorVals[2] + ');'; + if (colorVals[3] !== 1) { + colString += "background-color: rgba(" + colorVals[0] + ',' + colorVals[1] + ',' + colorVals[2] + ',' + colorVals[3] + ');'; + } + wysihtml5.commands.formatInline.execWithToggle(composer, command, "span", false, false, colString, REG_EXP); + } + }, + + state: function(composer, command) { + return wysihtml5.commands.formatInline.state(composer, command, "span", false, false, "background-color", REG_EXP); + }, + + stateValue: function(composer, command, props) { + var st = this.state(composer, command), + colorStr, + val = false; + + if (st && wysihtml5.lang.object(st).isArray()) { + st = st[0]; + } + + if (st) { + colorStr = st.getAttribute('style'); + if (colorStr) { + val = wysihtml5.quirks.styleParser.parseColor(colorStr, "background-color"); + return wysihtml5.quirks.styleParser.unparseColor(val, props); + } + } + return false; + } + + }; +})(wysihtml5); +;(function(wysihtml5) { + var dom = wysihtml5.dom, + // Following elements are grouped + // when the caret is within a H1 and the H4 is invoked, the H1 should turn into H4 + // instead of creating a H4 within a H1 which would result in semantically invalid html + BLOCK_ELEMENTS_GROUP = ["H1", "H2", "H3", "H4", "H5", "H6", "P", "PRE", "DIV"]; + + /** + * Remove similiar classes (based on classRegExp) + * and add the desired class name + */ + function _addClass(element, className, classRegExp) { + if (element.className) { + _removeClass(element, classRegExp); + element.className = wysihtml5.lang.string(element.className + " " + className).trim(); + } else { + element.className = className; + } + } + + function _addStyle(element, cssStyle, styleRegExp) { + _removeStyle(element, styleRegExp); + if (element.getAttribute('style')) { + element.setAttribute('style', wysihtml5.lang.string(element.getAttribute('style') + " " + cssStyle).trim()); + } else { + element.setAttribute('style', cssStyle); + } + } + + function _removeClass(element, classRegExp) { + var ret = classRegExp.test(element.className); + element.className = element.className.replace(classRegExp, ""); + if (wysihtml5.lang.string(element.className).trim() == '') { + element.removeAttribute('class'); + } + return ret; + } + + function _removeStyle(element, styleRegExp) { + var ret = styleRegExp.test(element.getAttribute('style')); + element.setAttribute('style', (element.getAttribute('style') || "").replace(styleRegExp, "")); + if (wysihtml5.lang.string(element.getAttribute('style') || "").trim() == '') { + element.removeAttribute('style'); + } + return ret; + } + + function _removeLastChildIfLineBreak(node) { + var lastChild = node.lastChild; + if (lastChild && _isLineBreak(lastChild)) { + lastChild.parentNode.removeChild(lastChild); + } + } + + function _isLineBreak(node) { + return node.nodeName === "BR"; + } + + /** + * Execute native query command + * and if necessary modify the inserted node's className + */ + function _execCommand(doc, composer, command, nodeName, className) { + var ranges = composer.selection.getOwnRanges(); + for (var i = ranges.length; i--;){ + composer.selection.getSelection().removeAllRanges(); + composer.selection.setSelection(ranges[i]); + if (className) { + var eventListener = dom.observe(doc, "DOMNodeInserted", function(event) { + var target = event.target, + displayStyle; + if (target.nodeType !== wysihtml5.ELEMENT_NODE) { + return; + } + displayStyle = dom.getStyle("display").from(target); + if (displayStyle.substr(0, 6) !== "inline") { + // Make sure that only block elements receive the given class + target.className += " " + className; + } + }); + } + doc.execCommand(command, false, nodeName); + + if (eventListener) { + eventListener.stop(); + } + } + } + + function _selectionWrap(composer, options) { + if (composer.selection.isCollapsed()) { + composer.selection.selectLine(); + } + + var surroundedNodes = composer.selection.surround(options); + for (var i = 0, imax = surroundedNodes.length; i < imax; i++) { + wysihtml5.dom.lineBreaks(surroundedNodes[i]).remove(); + _removeLastChildIfLineBreak(surroundedNodes[i]); + } + + // rethink restoring selection + // composer.selection.selectNode(element, wysihtml5.browser.displaysCaretInEmptyContentEditableCorrectly()); + } + + function _hasClasses(element) { + return !!wysihtml5.lang.string(element.className).trim(); + } + + function _hasStyles(element) { + return !!wysihtml5.lang.string(element.getAttribute('style') || '').trim(); + } + + wysihtml5.commands.formatBlock = { + exec: function(composer, command, nodeName, className, classRegExp, cssStyle, styleRegExp) { + var doc = composer.doc, + blockElements = this.state(composer, command, nodeName, className, classRegExp, cssStyle, styleRegExp), + useLineBreaks = composer.config.useLineBreaks, + defaultNodeName = useLineBreaks ? "DIV" : "P", + selectedNodes, classRemoveAction, blockRenameFound, styleRemoveAction, blockElement; + nodeName = typeof(nodeName) === "string" ? nodeName.toUpperCase() : nodeName; + + if (blockElements.length) { + composer.selection.executeAndRestoreRangy(function() { + for (var b = blockElements.length; b--;) { + if (classRegExp) { + classRemoveAction = _removeClass(blockElements[b], classRegExp); + } + if (styleRegExp) { + styleRemoveAction = _removeStyle(blockElements[b], styleRegExp); + } + + if ((styleRemoveAction || classRemoveAction) && nodeName === null && blockElements[b].nodeName != defaultNodeName) { + // dont rename or remove element when just setting block formating class or style + return; + } + + var hasClasses = _hasClasses(blockElements[b]), + hasStyles = _hasStyles(blockElements[b]); + + if (!hasClasses && !hasStyles && (useLineBreaks || nodeName === "P")) { + // Insert a line break afterwards and beforewards when there are siblings + // that are not of type line break or block element + wysihtml5.dom.lineBreaks(blockElements[b]).add(); + dom.replaceWithChildNodes(blockElements[b]); + } else { + // Make sure that styling is kept by renaming the element to a <div> or <p> and copying over the class name + dom.renameElement(blockElements[b], nodeName === "P" ? "DIV" : defaultNodeName); + } + } + }); + + return; + } + + // Find similiar block element and rename it (<h2 class="foo"></h2> => <h1 class="foo"></h1>) + if (nodeName === null || wysihtml5.lang.array(BLOCK_ELEMENTS_GROUP).contains(nodeName)) { + selectedNodes = composer.selection.findNodesInSelection(BLOCK_ELEMENTS_GROUP).concat(composer.selection.getSelectedOwnNodes()); + composer.selection.executeAndRestoreRangy(function() { + for (var n = selectedNodes.length; n--;) { + blockElement = dom.getParentElement(selectedNodes[n], { + nodeName: BLOCK_ELEMENTS_GROUP + }); + if (blockElement == composer.element) { + blockElement = null; + } + if (blockElement) { + // Rename current block element to new block element and add class + if (nodeName) { + blockElement = dom.renameElement(blockElement, nodeName); + } + if (className) { + _addClass(blockElement, className, classRegExp); + } + if (cssStyle) { + _addStyle(blockElement, cssStyle, styleRegExp); + } + blockRenameFound = true; + } + } + + }); + + if (blockRenameFound) { + return; + } + } + + _selectionWrap(composer, { + "nodeName": (nodeName || defaultNodeName), + "className": className || null, + "cssStyle": cssStyle || null + }); + }, + + state: function(composer, command, nodeName, className, classRegExp, cssStyle, styleRegExp) { + var nodes = composer.selection.getSelectedOwnNodes(), + parents = [], + parent; + + nodeName = typeof(nodeName) === "string" ? nodeName.toUpperCase() : nodeName; + + //var selectedNode = composer.selection.getSelectedNode(); + for (var i = 0, maxi = nodes.length; i < maxi; i++) { + parent = dom.getParentElement(nodes[i], { + nodeName: nodeName, + className: className, + classRegExp: classRegExp, + cssStyle: cssStyle, + styleRegExp: styleRegExp + }); + if (parent && wysihtml5.lang.array(parents).indexOf(parent) == -1) { + parents.push(parent); + } + } + if (parents.length == 0) { + return false; + } + return parents; + } + + + }; +})(wysihtml5); +;/* Formats block for as a <pre><code class="classname"></code></pre> block + * Useful in conjuction for sytax highlight utility: highlight.js + * + * Usage: + * + * editorInstance.composer.commands.exec("formatCode", "language-html"); +*/ + +wysihtml5.commands.formatCode = { + + exec: function(composer, command, classname) { + var pre = this.state(composer), + code, range, selectedNodes; + if (pre) { + // caret is already within a <pre><code>...</code></pre> + composer.selection.executeAndRestore(function() { + code = pre.querySelector("code"); + wysihtml5.dom.replaceWithChildNodes(pre); + if (code) { + wysihtml5.dom.replaceWithChildNodes(code); + } + }); + } else { + // Wrap in <pre><code>...</code></pre> + range = composer.selection.getRange(); + selectedNodes = range.extractContents(); + pre = composer.doc.createElement("pre"); + code = composer.doc.createElement("code"); + + if (classname) { + code.className = classname; + } + + pre.appendChild(code); + code.appendChild(selectedNodes); + range.insertNode(pre); + composer.selection.selectNode(pre); + } + }, + + state: function(composer) { + var selectedNode = composer.selection.getSelectedNode(); + if (selectedNode && selectedNode.nodeName && selectedNode.nodeName == "PRE"&& + selectedNode.firstChild && selectedNode.firstChild.nodeName && selectedNode.firstChild.nodeName == "CODE") { + return selectedNode; + } else { + return wysihtml5.dom.getParentElement(selectedNode, { nodeName: "CODE" }) && wysihtml5.dom.getParentElement(selectedNode, { nodeName: "PRE" }); + } + } +};;/** + * formatInline scenarios for tag "B" (| = caret, |foo| = selected text) + * + * #1 caret in unformatted text: + * abcdefg| + * output: + * abcdefg<b>|</b> + * + * #2 unformatted text selected: + * abc|deg|h + * output: + * abc<b>|deg|</b>h + * + * #3 unformatted text selected across boundaries: + * ab|c <span>defg|h</span> + * output: + * ab<b>|c </b><span><b>defg</b>|h</span> + * + * #4 formatted text entirely selected + * <b>|abc|</b> + * output: + * |abc| + * + * #5 formatted text partially selected + * <b>ab|c|</b> + * output: + * <b>ab</b>|c| + * + * #6 formatted text selected across boundaries + * <span>ab|c</span> <b>de|fgh</b> + * output: + * <span>ab|c</span> de|<b>fgh</b> + */ +(function(wysihtml5) { + var // Treat <b> as <strong> and vice versa + ALIAS_MAPPING = { + "strong": "b", + "em": "i", + "b": "strong", + "i": "em" + }, + htmlApplier = {}; + + function _getTagNames(tagName) { + var alias = ALIAS_MAPPING[tagName]; + return alias ? [tagName.toLowerCase(), alias.toLowerCase()] : [tagName.toLowerCase()]; + } + + function _getApplier(tagName, className, classRegExp, cssStyle, styleRegExp, container) { + var identifier = tagName; + + if (className) { + identifier += ":" + className; + } + if (cssStyle) { + identifier += ":" + cssStyle; + } + + if (!htmlApplier[identifier]) { + htmlApplier[identifier] = new wysihtml5.selection.HTMLApplier(_getTagNames(tagName), className, classRegExp, true, cssStyle, styleRegExp, container); + } + + return htmlApplier[identifier]; + } + + wysihtml5.commands.formatInline = { + exec: function(composer, command, tagName, className, classRegExp, cssStyle, styleRegExp, dontRestoreSelect, noCleanup) { + var range = composer.selection.createRange(), + ownRanges = composer.selection.getOwnRanges(); + + if (!ownRanges || ownRanges.length == 0) { + return false; + } + composer.selection.getSelection().removeAllRanges(); + + _getApplier(tagName, className, classRegExp, cssStyle, styleRegExp, composer.element).toggleRange(ownRanges); + + if (!dontRestoreSelect) { + range.setStart(ownRanges[0].startContainer, ownRanges[0].startOffset); + range.setEnd( + ownRanges[ownRanges.length - 1].endContainer, + ownRanges[ownRanges.length - 1].endOffset + ); + composer.selection.setSelection(range); + composer.selection.executeAndRestore(function() { + if (!noCleanup) { + composer.cleanUp(); + } + }, true, true); + } else if (!noCleanup) { + composer.cleanUp(); + } + }, + + // Executes so that if collapsed caret is in a state and executing that state it should unformat that state + // It is achieved by selecting the entire state element before executing. + // This works on built in contenteditable inline format commands + execWithToggle: function(composer, command, tagName, className, classRegExp, cssStyle, styleRegExp) { + var that = this; + + if (this.state(composer, command, tagName, className, classRegExp, cssStyle, styleRegExp) && + composer.selection.isCollapsed() && + !composer.selection.caretIsLastInSelection() && + !composer.selection.caretIsFirstInSelection() + ) { + var state_element = that.state(composer, command, tagName, className, classRegExp)[0]; + composer.selection.executeAndRestoreRangy(function() { + var parent = state_element.parentNode; + composer.selection.selectNode(state_element, true); + wysihtml5.commands.formatInline.exec(composer, command, tagName, className, classRegExp, cssStyle, styleRegExp, true, true); + }); + } else { + if (this.state(composer, command, tagName, className, classRegExp, cssStyle, styleRegExp) && !composer.selection.isCollapsed()) { + composer.selection.executeAndRestoreRangy(function() { + wysihtml5.commands.formatInline.exec(composer, command, tagName, className, classRegExp, cssStyle, styleRegExp, true, true); + }); + } else { + wysihtml5.commands.formatInline.exec(composer, command, tagName, className, classRegExp, cssStyle, styleRegExp); + } + } + }, + + state: function(composer, command, tagName, className, classRegExp, cssStyle, styleRegExp) { + var doc = composer.doc, + aliasTagName = ALIAS_MAPPING[tagName] || tagName, + ownRanges, isApplied; + + // Check whether the document contains a node with the desired tagName + if (!wysihtml5.dom.hasElementWithTagName(doc, tagName) && + !wysihtml5.dom.hasElementWithTagName(doc, aliasTagName)) { + return false; + } + + // Check whether the document contains a node with the desired className + if (className && !wysihtml5.dom.hasElementWithClassName(doc, className)) { + return false; + } + + ownRanges = composer.selection.getOwnRanges(); + + if (!ownRanges || ownRanges.length === 0) { + return false; + } + + isApplied = _getApplier(tagName, className, classRegExp, cssStyle, styleRegExp, composer.element).isAppliedToRange(ownRanges); + + return (isApplied && isApplied.elements) ? isApplied.elements : false; + } + }; +})(wysihtml5); +;(function(wysihtml5) { + + wysihtml5.commands.insertBlockQuote = { + exec: function(composer, command) { + var state = this.state(composer, command), + endToEndParent = composer.selection.isEndToEndInNode(['H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'P']), + prevNode, nextNode; + + composer.selection.executeAndRestore(function() { + if (state) { + if (composer.config.useLineBreaks) { + wysihtml5.dom.lineBreaks(state).add(); + } + wysihtml5.dom.unwrap(state); + } else { + if (composer.selection.isCollapsed()) { + composer.selection.selectLine(); + } + + if (endToEndParent) { + var qouteEl = endToEndParent.ownerDocument.createElement('blockquote'); + wysihtml5.dom.insert(qouteEl).after(endToEndParent); + qouteEl.appendChild(endToEndParent); + } else { + composer.selection.surround({nodeName: "blockquote"}); + } + } + }); + }, + state: function(composer, command) { + var selectedNode = composer.selection.getSelectedNode(), + node = wysihtml5.dom.getParentElement(selectedNode, { nodeName: "BLOCKQUOTE" }, false, composer.element); + + return (node) ? node : false; + } + }; + +})(wysihtml5);;wysihtml5.commands.insertHTML = { + exec: function(composer, command, html) { + if (composer.commands.support(command)) { + composer.doc.execCommand(command, false, html); + } else { + composer.selection.insertHTML(html); + } + }, + + state: function() { + return false; + } +}; +;(function(wysihtml5) { + var NODE_NAME = "IMG"; + + wysihtml5.commands.insertImage = { + /** + * Inserts an <img> + * If selection is already an image link, it removes it + * + * @example + * // either ... + * wysihtml5.commands.insertImage.exec(composer, "insertImage", "http://www.google.de/logo.jpg"); + * // ... or ... + * wysihtml5.commands.insertImage.exec(composer, "insertImage", { src: "http://www.google.de/logo.jpg", title: "foo" }); + */ + exec: function(composer, command, value) { + value = typeof(value) === "object" ? value : { src: value }; + + var doc = composer.doc, + image = this.state(composer), + textNode, + parent; + + if (image) { + // Image already selected, set the caret before it and delete it + composer.selection.setBefore(image); + parent = image.parentNode; + parent.removeChild(image); + + // and it's parent <a> too if it hasn't got any other relevant child nodes + wysihtml5.dom.removeEmptyTextNodes(parent); + if (parent.nodeName === "A" && !parent.firstChild) { + composer.selection.setAfter(parent); + parent.parentNode.removeChild(parent); + } + + // firefox and ie sometimes don't remove the image handles, even though the image got removed + wysihtml5.quirks.redraw(composer.element); + return; + } + + image = doc.createElement(NODE_NAME); + + for (var i in value) { + image.setAttribute(i === "className" ? "class" : i, value[i]); + } + + composer.selection.insertNode(image); + if (wysihtml5.browser.hasProblemsSettingCaretAfterImg()) { + textNode = doc.createTextNode(wysihtml5.INVISIBLE_SPACE); + composer.selection.insertNode(textNode); + composer.selection.setAfter(textNode); + } else { + composer.selection.setAfter(image); + } + }, + + state: function(composer) { + var doc = composer.doc, + selectedNode, + text, + imagesInSelection; + + if (!wysihtml5.dom.hasElementWithTagName(doc, NODE_NAME)) { + return false; + } + + selectedNode = composer.selection.getSelectedNode(); + if (!selectedNode) { + return false; + } + + if (selectedNode.nodeName === NODE_NAME) { + // This works perfectly in IE + return selectedNode; + } + + if (selectedNode.nodeType !== wysihtml5.ELEMENT_NODE) { + return false; + } + + text = composer.selection.getText(); + text = wysihtml5.lang.string(text).trim(); + if (text) { + return false; + } + + imagesInSelection = composer.selection.getNodes(wysihtml5.ELEMENT_NODE, function(node) { + return node.nodeName === "IMG"; + }); + + if (imagesInSelection.length !== 1) { + return false; + } + + return imagesInSelection[0]; + } + }; +})(wysihtml5); +;(function(wysihtml5) { + var LINE_BREAK = "<br>" + (wysihtml5.browser.needsSpaceAfterLineBreak() ? " " : ""); + + wysihtml5.commands.insertLineBreak = { + exec: function(composer, command) { + if (composer.commands.support(command)) { + composer.doc.execCommand(command, false, null); + if (!wysihtml5.browser.autoScrollsToCaret()) { + composer.selection.scrollIntoView(); + } + } else { + composer.commands.exec("insertHTML", LINE_BREAK); + } + }, + + state: function() { + return false; + } + }; +})(wysihtml5); +;wysihtml5.commands.insertOrderedList = { + exec: function(composer, command) { + wysihtml5.commands.insertList.exec(composer, command, "OL"); + }, + + state: function(composer, command) { + return wysihtml5.commands.insertList.state(composer, command, "OL"); + } +}; +;wysihtml5.commands.insertUnorderedList = { + exec: function(composer, command) { + wysihtml5.commands.insertList.exec(composer, command, "UL"); + }, + + state: function(composer, command) { + return wysihtml5.commands.insertList.state(composer, command, "UL"); + } +}; +;wysihtml5.commands.insertList = (function(wysihtml5) { + + var isNode = function(node, name) { + if (node && node.nodeName) { + if (typeof name === 'string') { + name = [name]; + } + for (var n = name.length; n--;) { + if (node.nodeName === name[n]) { + return true; + } + } + } + return false; + }; + + var findListEl = function(node, nodeName, composer) { + var ret = { + el: null, + other: false + }; + + if (node) { + var parentLi = wysihtml5.dom.getParentElement(node, { nodeName: "LI" }), + otherNodeName = (nodeName === "UL") ? "OL" : "UL"; + + if (isNode(node, nodeName)) { + ret.el = node; + } else if (isNode(node, otherNodeName)) { + ret = { + el: node, + other: true + }; + } else if (parentLi) { + if (isNode(parentLi.parentNode, nodeName)) { + ret.el = parentLi.parentNode; + } else if (isNode(parentLi.parentNode, otherNodeName)) { + ret = { + el : parentLi.parentNode, + other: true + }; + } + } + } + + // do not count list elements outside of composer + if (ret.el && !composer.element.contains(ret.el)) { + ret.el = null; + } + + return ret; + }; + + var handleSameTypeList = function(el, nodeName, composer) { + var otherNodeName = (nodeName === "UL") ? "OL" : "UL", + otherLists, innerLists; + // Unwrap list + // <ul><li>foo</li><li>bar</li></ul> + // becomes: + // foo<br>bar<br> + composer.selection.executeAndRestore(function() { + var otherLists = getListsInSelection(otherNodeName, composer); + if (otherLists.length) { + for (var l = otherLists.length; l--;) { + wysihtml5.dom.renameElement(otherLists[l], nodeName.toLowerCase()); + } + } else { + innerLists = getListsInSelection(['OL', 'UL'], composer); + for (var i = innerLists.length; i--;) { + wysihtml5.dom.resolveList(innerLists[i], composer.config.useLineBreaks); + } + wysihtml5.dom.resolveList(el, composer.config.useLineBreaks); + } + }); + }; + + var handleOtherTypeList = function(el, nodeName, composer) { + var otherNodeName = (nodeName === "UL") ? "OL" : "UL"; + // Turn an ordered list into an unordered list + // <ol><li>foo</li><li>bar</li></ol> + // becomes: + // <ul><li>foo</li><li>bar</li></ul> + // Also rename other lists in selection + composer.selection.executeAndRestore(function() { + var renameLists = [el].concat(getListsInSelection(otherNodeName, composer)); + + // All selection inner lists get renamed too + for (var l = renameLists.length; l--;) { + wysihtml5.dom.renameElement(renameLists[l], nodeName.toLowerCase()); + } + }); + }; + + var getListsInSelection = function(nodeName, composer) { + var ranges = composer.selection.getOwnRanges(), + renameLists = []; + + for (var r = ranges.length; r--;) { + renameLists = renameLists.concat(ranges[r].getNodes([1], function(node) { + return isNode(node, nodeName); + })); + } + + return renameLists; + }; + + var createListFallback = function(nodeName, composer) { + // Fallback for Create list + composer.selection.executeAndRestoreRangy(function() { + var tempClassName = "_wysihtml5-temp-" + new Date().getTime(), + tempElement = composer.selection.deblockAndSurround({ + "nodeName": "div", + "className": tempClassName + }), + isEmpty, list; + + // This space causes new lists to never break on enter + var INVISIBLE_SPACE_REG_EXP = /\uFEFF/g; + tempElement.innerHTML = tempElement.innerHTML.replace(INVISIBLE_SPACE_REG_EXP, ""); + + if (tempElement) { + isEmpty = wysihtml5.lang.array(["", "<br>", wysihtml5.INVISIBLE_SPACE]).contains(tempElement.innerHTML); + list = wysihtml5.dom.convertToList(tempElement, nodeName.toLowerCase(), composer.parent.config.uneditableContainerClassname); + if (isEmpty) { + composer.selection.selectNode(list.querySelector("li"), true); + } + } + }); + }; + + return { + exec: function(composer, command, nodeName) { + var doc = composer.doc, + cmd = (nodeName === "OL") ? "insertOrderedList" : "insertUnorderedList", + selectedNode = composer.selection.getSelectedNode(), + list = findListEl(selectedNode, nodeName, composer); + + if (!list.el) { + if (composer.commands.support(cmd)) { + doc.execCommand(cmd, false, null); + } else { + createListFallback(nodeName, composer); + } + } else if (list.other) { + handleOtherTypeList(list.el, nodeName, composer); + } else { + handleSameTypeList(list.el, nodeName, composer); + } + }, + + state: function(composer, command, nodeName) { + var selectedNode = composer.selection.getSelectedNode(), + list = findListEl(selectedNode, nodeName, composer); + + return (list.el && !list.other) ? list.el : false; + } + }; + +})(wysihtml5);;wysihtml5.commands.italic = { + exec: function(composer, command) { + wysihtml5.commands.formatInline.execWithToggle(composer, command, "i"); + }, + + state: function(composer, command) { + // element.ownerDocument.queryCommandState("italic") results: + // firefox: only <i> + // chrome: <i>, <em>, <blockquote>, ... + // ie: <i>, <em> + // opera: only <i> + return wysihtml5.commands.formatInline.state(composer, command, "i"); + } +}; +;(function(wysihtml5) { + var CLASS_NAME = "wysiwyg-text-align-center", + REG_EXP = /wysiwyg-text-align-[0-9a-z]+/g; + + wysihtml5.commands.justifyCenter = { + exec: function(composer, command) { + return wysihtml5.commands.formatBlock.exec(composer, "formatBlock", null, CLASS_NAME, REG_EXP); + }, + + state: function(composer, command) { + return wysihtml5.commands.formatBlock.state(composer, "formatBlock", null, CLASS_NAME, REG_EXP); + } + }; +})(wysihtml5); +;(function(wysihtml5) { + var CLASS_NAME = "wysiwyg-text-align-left", + REG_EXP = /wysiwyg-text-align-[0-9a-z]+/g; + + wysihtml5.commands.justifyLeft = { + exec: function(composer, command) { + return wysihtml5.commands.formatBlock.exec(composer, "formatBlock", null, CLASS_NAME, REG_EXP); + }, + + state: function(composer, command) { + return wysihtml5.commands.formatBlock.state(composer, "formatBlock", null, CLASS_NAME, REG_EXP); + } + }; +})(wysihtml5); +;(function(wysihtml5) { + var CLASS_NAME = "wysiwyg-text-align-right", + REG_EXP = /wysiwyg-text-align-[0-9a-z]+/g; + + wysihtml5.commands.justifyRight = { + exec: function(composer, command) { + return wysihtml5.commands.formatBlock.exec(composer, "formatBlock", null, CLASS_NAME, REG_EXP); + }, + + state: function(composer, command) { + return wysihtml5.commands.formatBlock.state(composer, "formatBlock", null, CLASS_NAME, REG_EXP); + } + }; +})(wysihtml5); +;(function(wysihtml5) { + var CLASS_NAME = "wysiwyg-text-align-justify", + REG_EXP = /wysiwyg-text-align-[0-9a-z]+/g; + + wysihtml5.commands.justifyFull = { + exec: function(composer, command) { + return wysihtml5.commands.formatBlock.exec(composer, "formatBlock", null, CLASS_NAME, REG_EXP); + }, + + state: function(composer, command) { + return wysihtml5.commands.formatBlock.state(composer, "formatBlock", null, CLASS_NAME, REG_EXP); + } + }; +})(wysihtml5); +;(function(wysihtml5) { + var STYLE_STR = "text-align: right;", + REG_EXP = /(\s|^)text-align\s*:\s*[^;\s]+;?/gi; + + wysihtml5.commands.alignRightStyle = { + exec: function(composer, command) { + return wysihtml5.commands.formatBlock.exec(composer, "formatBlock", null, null, null, STYLE_STR, REG_EXP); + }, + + state: function(composer, command) { + return wysihtml5.commands.formatBlock.state(composer, "formatBlock", null, null, null, STYLE_STR, REG_EXP); + } + }; +})(wysihtml5); +;(function(wysihtml5) { + var STYLE_STR = "text-align: left;", + REG_EXP = /(\s|^)text-align\s*:\s*[^;\s]+;?/gi; + + wysihtml5.commands.alignLeftStyle = { + exec: function(composer, command) { + return wysihtml5.commands.formatBlock.exec(composer, "formatBlock", null, null, null, STYLE_STR, REG_EXP); + }, + + state: function(composer, command) { + return wysihtml5.commands.formatBlock.state(composer, "formatBlock", null, null, null, STYLE_STR, REG_EXP); + } + }; +})(wysihtml5); +;(function(wysihtml5) { + var STYLE_STR = "text-align: center;", + REG_EXP = /(\s|^)text-align\s*:\s*[^;\s]+;?/gi; + + wysihtml5.commands.alignCenterStyle = { + exec: function(composer, command) { + return wysihtml5.commands.formatBlock.exec(composer, "formatBlock", null, null, null, STYLE_STR, REG_EXP); + }, + + state: function(composer, command) { + return wysihtml5.commands.formatBlock.state(composer, "formatBlock", null, null, null, STYLE_STR, REG_EXP); + } + }; +})(wysihtml5); +;wysihtml5.commands.redo = { + exec: function(composer) { + return composer.undoManager.redo(); + }, + + state: function(composer) { + return false; + } +}; +;wysihtml5.commands.underline = { + exec: function(composer, command) { + wysihtml5.commands.formatInline.execWithToggle(composer, command, "u"); + }, + + state: function(composer, command) { + return wysihtml5.commands.formatInline.state(composer, command, "u"); + } +}; +;wysihtml5.commands.undo = { + exec: function(composer) { + return composer.undoManager.undo(); + }, + + state: function(composer) { + return false; + } +}; +;wysihtml5.commands.createTable = { + exec: function(composer, command, value) { + var col, row, html; + if (value && value.cols && value.rows && parseInt(value.cols, 10) > 0 && parseInt(value.rows, 10) > 0) { + if (value.tableStyle) { + html = "<table style=\"" + value.tableStyle + "\">"; + } else { + html = "<table>"; + } + html += "<tbody>"; + for (row = 0; row < value.rows; row ++) { + html += '<tr>'; + for (col = 0; col < value.cols; col ++) { + html += "<td>&nbsp;</td>"; + } + html += '</tr>'; + } + html += "</tbody></table>"; + composer.commands.exec("insertHTML", html); + //composer.selection.insertHTML(html); + } + + + }, + + state: function(composer, command) { + return false; + } +}; +;wysihtml5.commands.mergeTableCells = { + exec: function(composer, command) { + if (composer.tableSelection && composer.tableSelection.start && composer.tableSelection.end) { + if (this.state(composer, command)) { + wysihtml5.dom.table.unmergeCell(composer.tableSelection.start); + } else { + wysihtml5.dom.table.mergeCellsBetween(composer.tableSelection.start, composer.tableSelection.end); + } + } + }, + + state: function(composer, command) { + if (composer.tableSelection) { + var start = composer.tableSelection.start, + end = composer.tableSelection.end; + if (start && end && start == end && + (( + wysihtml5.dom.getAttribute(start, "colspan") && + parseInt(wysihtml5.dom.getAttribute(start, "colspan"), 10) > 1 + ) || ( + wysihtml5.dom.getAttribute(start, "rowspan") && + parseInt(wysihtml5.dom.getAttribute(start, "rowspan"), 10) > 1 + )) + ) { + return [start]; + } + } + return false; + } +}; +;wysihtml5.commands.addTableCells = { + exec: function(composer, command, value) { + if (composer.tableSelection && composer.tableSelection.start && composer.tableSelection.end) { + + // switches start and end if start is bigger than end (reverse selection) + var tableSelect = wysihtml5.dom.table.orderSelectionEnds(composer.tableSelection.start, composer.tableSelection.end); + if (value == "before" || value == "above") { + wysihtml5.dom.table.addCells(tableSelect.start, value); + } else if (value == "after" || value == "below") { + wysihtml5.dom.table.addCells(tableSelect.end, value); + } + setTimeout(function() { + composer.tableSelection.select(tableSelect.start, tableSelect.end); + },0); + } + }, + + state: function(composer, command) { + return false; + } +}; +;wysihtml5.commands.deleteTableCells = { + exec: function(composer, command, value) { + if (composer.tableSelection && composer.tableSelection.start && composer.tableSelection.end) { + var tableSelect = wysihtml5.dom.table.orderSelectionEnds(composer.tableSelection.start, composer.tableSelection.end), + idx = wysihtml5.dom.table.indexOf(tableSelect.start), + selCell, + table = composer.tableSelection.table; + + wysihtml5.dom.table.removeCells(tableSelect.start, value); + setTimeout(function() { + // move selection to next or previous if not present + selCell = wysihtml5.dom.table.findCell(table, idx); + + if (!selCell){ + if (value == "row") { + selCell = wysihtml5.dom.table.findCell(table, { + "row": idx.row - 1, + "col": idx.col + }); + } + + if (value == "column") { + selCell = wysihtml5.dom.table.findCell(table, { + "row": idx.row, + "col": idx.col - 1 + }); + } + } + if (selCell) { + composer.tableSelection.select(selCell, selCell); + } + }, 0); + + } + }, + + state: function(composer, command) { + return false; + } +}; +;wysihtml5.commands.indentList = { + exec: function(composer, command, value) { + var listEls = composer.selection.getSelectionParentsByTag('LI'); + if (listEls) { + return this.tryToPushLiLevel(listEls, composer.selection); + } + return false; + }, + + state: function(composer, command) { + return false; + }, + + tryToPushLiLevel: function(liNodes, selection) { + var listTag, list, prevLi, liNode, prevLiList, + found = false; + + selection.executeAndRestoreRangy(function() { + + for (var i = liNodes.length; i--;) { + liNode = liNodes[i]; + listTag = (liNode.parentNode.nodeName === 'OL') ? 'OL' : 'UL'; + list = liNode.ownerDocument.createElement(listTag); + prevLi = wysihtml5.dom.domNode(liNode).prev({nodeTypes: [wysihtml5.ELEMENT_NODE]}); + prevLiList = (prevLi) ? prevLi.querySelector('ul, ol') : null; + + if (prevLi) { + if (prevLiList) { + prevLiList.appendChild(liNode); + } else { + list.appendChild(liNode); + prevLi.appendChild(list); + } + found = true; + } + } + + }); + return found; + } +}; +;wysihtml5.commands.outdentList = { + exec: function(composer, command, value) { + var listEls = composer.selection.getSelectionParentsByTag('LI'); + if (listEls) { + return this.tryToPullLiLevel(listEls, composer); + } + return false; + }, + + state: function(composer, command) { + return false; + }, + + tryToPullLiLevel: function(liNodes, composer) { + var listNode, outerListNode, outerLiNode, list, prevLi, liNode, afterList, + found = false, + that = this; + + composer.selection.executeAndRestoreRangy(function() { + + for (var i = liNodes.length; i--;) { + liNode = liNodes[i]; + if (liNode.parentNode) { + listNode = liNode.parentNode; + + if (listNode.tagName === 'OL' || listNode.tagName === 'UL') { + found = true; + + outerListNode = wysihtml5.dom.getParentElement(listNode.parentNode, { nodeName: ['OL', 'UL']}, false, composer.element); + outerLiNode = wysihtml5.dom.getParentElement(listNode.parentNode, { nodeName: ['LI']}, false, composer.element); + + if (outerListNode && outerLiNode) { + + if (liNode.nextSibling) { + afterList = that.getAfterList(listNode, liNode); + liNode.appendChild(afterList); + } + outerListNode.insertBefore(liNode, outerLiNode.nextSibling); + + } else { + + if (liNode.nextSibling) { + afterList = that.getAfterList(listNode, liNode); + liNode.appendChild(afterList); + } + + for (var j = liNode.childNodes.length; j--;) { + listNode.parentNode.insertBefore(liNode.childNodes[j], listNode.nextSibling); + } + + listNode.parentNode.insertBefore(document.createElement('br'), listNode.nextSibling); + liNode.parentNode.removeChild(liNode); + + } + + // cleanup + if (listNode.childNodes.length === 0) { + listNode.parentNode.removeChild(listNode); + } + } + } + } + + }); + return found; + }, + + getAfterList: function(listNode, liNode) { + var nodeName = listNode.nodeName, + newList = document.createElement(nodeName); + + while (liNode.nextSibling) { + newList.appendChild(liNode.nextSibling); + } + return newList; + } + +};;/** + * Undo Manager for wysihtml5 + * slightly inspired by http://rniwa.com/editing/undomanager.html#the-undomanager-interface + */ +(function(wysihtml5) { + var Z_KEY = 90, + Y_KEY = 89, + BACKSPACE_KEY = 8, + DELETE_KEY = 46, + MAX_HISTORY_ENTRIES = 25, + DATA_ATTR_NODE = "data-wysihtml5-selection-node", + DATA_ATTR_OFFSET = "data-wysihtml5-selection-offset", + UNDO_HTML = '<span id="_wysihtml5-undo" class="_wysihtml5-temp">' + wysihtml5.INVISIBLE_SPACE + '</span>', + REDO_HTML = '<span id="_wysihtml5-redo" class="_wysihtml5-temp">' + wysihtml5.INVISIBLE_SPACE + '</span>', + dom = wysihtml5.dom; + + function cleanTempElements(doc) { + var tempElement; + while (tempElement = doc.querySelector("._wysihtml5-temp")) { + tempElement.parentNode.removeChild(tempElement); + } + } + + wysihtml5.UndoManager = wysihtml5.lang.Dispatcher.extend( + /** @scope wysihtml5.UndoManager.prototype */ { + constructor: function(editor) { + this.editor = editor; + this.composer = editor.composer; + this.element = this.composer.element; + + this.position = 0; + this.historyStr = []; + this.historyDom = []; + + this.transact(); + + this._observe(); + }, + + _observe: function() { + var that = this, + doc = this.composer.sandbox.getDocument(), + lastKey; + + // Catch CTRL+Z and CTRL+Y + dom.observe(this.element, "keydown", function(event) { + if (event.altKey || (!event.ctrlKey && !event.metaKey)) { + return; + } + + var keyCode = event.keyCode, + isUndo = keyCode === Z_KEY && !event.shiftKey, + isRedo = (keyCode === Z_KEY && event.shiftKey) || (keyCode === Y_KEY); + + if (isUndo) { + that.undo(); + event.preventDefault(); + } else if (isRedo) { + that.redo(); + event.preventDefault(); + } + }); + + // Catch delete and backspace + dom.observe(this.element, "keydown", function(event) { + var keyCode = event.keyCode; + if (keyCode === lastKey) { + return; + } + + lastKey = keyCode; + + if (keyCode === BACKSPACE_KEY || keyCode === DELETE_KEY) { + that.transact(); + } + }); + + this.editor + .on("newword:composer", function() { + that.transact(); + }) + + .on("beforecommand:composer", function() { + that.transact(); + }); + }, + + transact: function() { + var previousHtml = this.historyStr[this.position - 1], + currentHtml = this.composer.getValue(false, false), + composerIsVisible = this.element.offsetWidth > 0 && this.element.offsetHeight > 0, + range, node, offset, element, position; + + if (currentHtml === previousHtml) { + return; + } + + var length = this.historyStr.length = this.historyDom.length = this.position; + if (length > MAX_HISTORY_ENTRIES) { + this.historyStr.shift(); + this.historyDom.shift(); + this.position--; + } + + this.position++; + + if (composerIsVisible) { + // Do not start saving selection if composer is not visible + range = this.composer.selection.getRange(); + node = (range && range.startContainer) ? range.startContainer : this.element; + offset = (range && range.startOffset) ? range.startOffset : 0; + + if (node.nodeType === wysihtml5.ELEMENT_NODE) { + element = node; + } else { + element = node.parentNode; + position = this.getChildNodeIndex(element, node); + } + + element.setAttribute(DATA_ATTR_OFFSET, offset); + if (typeof(position) !== "undefined") { + element.setAttribute(DATA_ATTR_NODE, position); + } + } + + var clone = this.element.cloneNode(!!currentHtml); + this.historyDom.push(clone); + this.historyStr.push(currentHtml); + + if (element) { + element.removeAttribute(DATA_ATTR_OFFSET); + element.removeAttribute(DATA_ATTR_NODE); + } + + }, + + undo: function() { + this.transact(); + + if (!this.undoPossible()) { + return; + } + + this.set(this.historyDom[--this.position - 1]); + this.editor.fire("undo:composer"); + }, + + redo: function() { + if (!this.redoPossible()) { + return; + } + + this.set(this.historyDom[++this.position - 1]); + this.editor.fire("redo:composer"); + }, + + undoPossible: function() { + return this.position > 1; + }, + + redoPossible: function() { + return this.position < this.historyStr.length; + }, + + set: function(historyEntry) { + this.element.innerHTML = ""; + + var i = 0, + childNodes = historyEntry.childNodes, + length = historyEntry.childNodes.length; + + for (; i<length; i++) { + this.element.appendChild(childNodes[i].cloneNode(true)); + } + + // Restore selection + var offset, + node, + position; + + if (historyEntry.hasAttribute(DATA_ATTR_OFFSET)) { + offset = historyEntry.getAttribute(DATA_ATTR_OFFSET); + position = historyEntry.getAttribute(DATA_ATTR_NODE); + node = this.element; + } else { + node = this.element.querySelector("[" + DATA_ATTR_OFFSET + "]") || this.element; + offset = node.getAttribute(DATA_ATTR_OFFSET); + position = node.getAttribute(DATA_ATTR_NODE); + node.removeAttribute(DATA_ATTR_OFFSET); + node.removeAttribute(DATA_ATTR_NODE); + } + + if (position !== null) { + node = this.getChildNodeByIndex(node, +position); + } + + this.composer.selection.set(node, offset); + }, + + getChildNodeIndex: function(parent, child) { + var i = 0, + childNodes = parent.childNodes, + length = childNodes.length; + for (; i<length; i++) { + if (childNodes[i] === child) { + return i; + } + } + }, + + getChildNodeByIndex: function(parent, index) { + return parent.childNodes[index]; + } + }); +})(wysihtml5); +;/** + * TODO: the following methods still need unit test coverage + */ +wysihtml5.views.View = Base.extend( + /** @scope wysihtml5.views.View.prototype */ { + constructor: function(parent, textareaElement, config) { + this.parent = parent; + this.element = textareaElement; + this.config = config; + if (!this.config.noTextarea) { + this._observeViewChange(); + } + }, + + _observeViewChange: function() { + var that = this; + this.parent.on("beforeload", function() { + that.parent.on("change_view", function(view) { + if (view === that.name) { + that.parent.currentView = that; + that.show(); + // Using tiny delay here to make sure that the placeholder is set before focusing + setTimeout(function() { that.focus(); }, 0); + } else { + that.hide(); + } + }); + }); + }, + + focus: function() { + if (this.element.ownerDocument.querySelector(":focus") === this.element) { + return; + } + + try { this.element.focus(); } catch(e) {} + }, + + hide: function() { + this.element.style.display = "none"; + }, + + show: function() { + this.element.style.display = ""; + }, + + disable: function() { + this.element.setAttribute("disabled", "disabled"); + }, + + enable: function() { + this.element.removeAttribute("disabled"); + } +}); +;(function(wysihtml5) { + var dom = wysihtml5.dom, + browser = wysihtml5.browser; + + wysihtml5.views.Composer = wysihtml5.views.View.extend( + /** @scope wysihtml5.views.Composer.prototype */ { + name: "composer", + + // Needed for firefox in order to display a proper caret in an empty contentEditable + CARET_HACK: "<br>", + + constructor: function(parent, editableElement, config) { + this.base(parent, editableElement, config); + if (!this.config.noTextarea) { + this.textarea = this.parent.textarea; + } else { + this.editableArea = editableElement; + } + if (this.config.contentEditableMode) { + this._initContentEditableArea(); + } else { + this._initSandbox(); + } + }, + + clear: function() { + this.element.innerHTML = browser.displaysCaretInEmptyContentEditableCorrectly() ? "" : this.CARET_HACK; + }, + + getValue: function(parse, clearInternals) { + var value = this.isEmpty() ? "" : wysihtml5.quirks.getCorrectInnerHTML(this.element); + if (parse !== false) { + value = this.parent.parse(value, (clearInternals === false) ? false : true); + } + + return value; + }, + + setValue: function(html, parse) { + if (parse) { + html = this.parent.parse(html); + } + + try { + this.element.innerHTML = html; + } catch (e) { + this.element.innerText = html; + } + }, + + cleanUp: function() { + this.parent.parse(this.element); + }, + + show: function() { + this.editableArea.style.display = this._displayStyle || ""; + + if (!this.config.noTextarea && !this.textarea.element.disabled) { + // Firefox needs this, otherwise contentEditable becomes uneditable + this.disable(); + this.enable(); + } + }, + + hide: function() { + this._displayStyle = dom.getStyle("display").from(this.editableArea); + if (this._displayStyle === "none") { + this._displayStyle = null; + } + this.editableArea.style.display = "none"; + }, + + disable: function() { + this.parent.fire("disable:composer"); + this.element.removeAttribute("contentEditable"); + }, + + enable: function() { + this.parent.fire("enable:composer"); + this.element.setAttribute("contentEditable", "true"); + }, + + focus: function(setToEnd) { + // IE 8 fires the focus event after .focus() + // This is needed by our simulate_placeholder.js to work + // therefore we clear it ourselves this time + if (wysihtml5.browser.doesAsyncFocus() && this.hasPlaceholderSet()) { + this.clear(); + } + + this.base(); + + var lastChild = this.element.lastChild; + if (setToEnd && lastChild && this.selection) { + if (lastChild.nodeName === "BR") { + this.selection.setBefore(this.element.lastChild); + } else { + this.selection.setAfter(this.element.lastChild); + } + } + }, + + getTextContent: function() { + return dom.getTextContent(this.element); + }, + + hasPlaceholderSet: function() { + return this.getTextContent() == ((this.config.noTextarea) ? this.editableArea.getAttribute("data-placeholder") : this.textarea.element.getAttribute("placeholder")) && this.placeholderSet; + }, + + isEmpty: function() { + var innerHTML = this.element.innerHTML.toLowerCase(); + return (/^(\s|<br>|<\/br>|<p>|<\/p>)*$/i).test(innerHTML) || + innerHTML === "" || + innerHTML === "<br>" || + innerHTML === "<p></p>" || + innerHTML === "<p><br></p>" || + this.hasPlaceholderSet(); + }, + + _initContentEditableArea: function() { + var that = this; + + if (this.config.noTextarea) { + this.sandbox = new dom.ContentEditableArea(function() { + that._create(); + }, {}, this.editableArea); + } else { + this.sandbox = new dom.ContentEditableArea(function() { + that._create(); + }); + this.editableArea = this.sandbox.getContentEditable(); + dom.insert(this.editableArea).after(this.textarea.element); + this._createWysiwygFormField(); + } + }, + + _initSandbox: function() { + var that = this; + + this.sandbox = new dom.Sandbox(function() { + that._create(); + }, { + stylesheets: this.config.stylesheets + }); + this.editableArea = this.sandbox.getIframe(); + + var textareaElement = this.textarea.element; + dom.insert(this.editableArea).after(textareaElement); + + this._createWysiwygFormField(); + }, + + // Creates hidden field which tells the server after submit, that the user used an wysiwyg editor + _createWysiwygFormField: function() { + if (this.textarea.element.form) { + var hiddenField = document.createElement("input"); + hiddenField.type = "hidden"; + hiddenField.name = "_wysihtml5_mode"; + hiddenField.value = 1; + dom.insert(hiddenField).after(this.textarea.element); + } + }, + + _create: function() { + var that = this; + this.doc = this.sandbox.getDocument(); + this.element = (this.config.contentEditableMode) ? this.sandbox.getContentEditable() : this.doc.body; + if (!this.config.noTextarea) { + this.textarea = this.parent.textarea; + this.element.innerHTML = this.textarea.getValue(true, false); + } else { + this.cleanUp(); // cleans contenteditable on initiation as it may contain html + } + + // Make sure our selection handler is ready + this.selection = new wysihtml5.Selection(this.parent, this.element, this.config.uneditableContainerClassname); + + // Make sure commands dispatcher is ready + this.commands = new wysihtml5.Commands(this.parent); + + if (!this.config.noTextarea) { + dom.copyAttributes([ + "className", "spellcheck", "title", "lang", "dir", "accessKey" + ]).from(this.textarea.element).to(this.element); + } + + dom.addClass(this.element, this.config.composerClassName); + // + // Make the editor look like the original textarea, by syncing styles + if (this.config.style && !this.config.contentEditableMode) { + this.style(); + } + + this.observe(); + + var name = this.config.name; + if (name) { + dom.addClass(this.element, name); + if (!this.config.contentEditableMode) { dom.addClass(this.editableArea, name); } + } + + this.enable(); + + if (!this.config.noTextarea && this.textarea.element.disabled) { + this.disable(); + } + + // Simulate html5 placeholder attribute on contentEditable element + var placeholderText = typeof(this.config.placeholder) === "string" + ? this.config.placeholder + : ((this.config.noTextarea) ? this.editableArea.getAttribute("data-placeholder") : this.textarea.element.getAttribute("placeholder")); + if (placeholderText) { + dom.simulatePlaceholder(this.parent, this, placeholderText); + } + + // Make sure that the browser avoids using inline styles whenever possible + this.commands.exec("styleWithCSS", false); + + this._initAutoLinking(); + this._initObjectResizing(); + this._initUndoManager(); + this._initLineBreaking(); + + // Simulate html5 autofocus on contentEditable element + // This doesn't work on IOS (5.1.1) + if (!this.config.noTextarea && (this.textarea.element.hasAttribute("autofocus") || document.querySelector(":focus") == this.textarea.element) && !browser.isIos()) { + setTimeout(function() { that.focus(true); }, 100); + } + + // IE sometimes leaves a single paragraph, which can't be removed by the user + if (!browser.clearsContentEditableCorrectly()) { + wysihtml5.quirks.ensureProperClearing(this); + } + + // Set up a sync that makes sure that textarea and editor have the same content + if (this.initSync && this.config.sync) { + this.initSync(); + } + + // Okay hide the textarea, we are ready to go + if (!this.config.noTextarea) { this.textarea.hide(); } + + // Fire global (before-)load event + this.parent.fire("beforeload").fire("load"); + }, + + _initAutoLinking: function() { + var that = this, + supportsDisablingOfAutoLinking = browser.canDisableAutoLinking(), + supportsAutoLinking = browser.doesAutoLinkingInContentEditable(); + if (supportsDisablingOfAutoLinking) { + this.commands.exec("autoUrlDetect", false); + } + + if (!this.config.autoLink) { + return; + } + + // Only do the auto linking by ourselves when the browser doesn't support auto linking + // OR when he supports auto linking but we were able to turn it off (IE9+) + if (!supportsAutoLinking || (supportsAutoLinking && supportsDisablingOfAutoLinking)) { + this.parent.on("newword:composer", function() { + if (dom.getTextContent(that.element).match(dom.autoLink.URL_REG_EXP)) { + that.selection.executeAndRestore(function(startContainer, endContainer) { + var uneditables = that.element.querySelectorAll("." + that.config.uneditableContainerClassname), + isInUneditable = false; + + for (var i = uneditables.length; i--;) { + if (wysihtml5.dom.contains(uneditables[i], endContainer)) { + isInUneditable = true; + } + } + + if (!isInUneditable) dom.autoLink(endContainer.parentNode, [that.config.uneditableContainerClassname]); + }); + } + }); + + dom.observe(this.element, "blur", function() { + dom.autoLink(that.element, [that.config.uneditableContainerClassname]); + }); + } + + // Assuming we have the following: + // <a href="http://www.google.de">http://www.google.de</a> + // If a user now changes the url in the innerHTML we want to make sure that + // it's synchronized with the href attribute (as long as the innerHTML is still a url) + var // Use a live NodeList to check whether there are any links in the document + links = this.sandbox.getDocument().getElementsByTagName("a"), + // The autoLink helper method reveals a reg exp to detect correct urls + urlRegExp = dom.autoLink.URL_REG_EXP, + getTextContent = function(element) { + var textContent = wysihtml5.lang.string(dom.getTextContent(element)).trim(); + if (textContent.substr(0, 4) === "www.") { + textContent = "http://" + textContent; + } + return textContent; + }; + + dom.observe(this.element, "keydown", function(event) { + if (!links.length) { + return; + } + + var selectedNode = that.selection.getSelectedNode(event.target.ownerDocument), + link = dom.getParentElement(selectedNode, { nodeName: "A" }, 4), + textContent; + + if (!link) { + return; + } + + textContent = getTextContent(link); + // keydown is fired before the actual content is changed + // therefore we set a timeout to change the href + setTimeout(function() { + var newTextContent = getTextContent(link); + if (newTextContent === textContent) { + return; + } + + // Only set href when new href looks like a valid url + if (newTextContent.match(urlRegExp)) { + link.setAttribute("href", newTextContent); + } + }, 0); + }); + }, + + _initObjectResizing: function() { + this.commands.exec("enableObjectResizing", true); + + // IE sets inline styles after resizing objects + // The following lines make sure that the width/height css properties + // are copied over to the width/height attributes + if (browser.supportsEvent("resizeend")) { + var properties = ["width", "height"], + propertiesLength = properties.length, + element = this.element; + + dom.observe(element, "resizeend", function(event) { + var target = event.target || event.srcElement, + style = target.style, + i = 0, + property; + + if (target.nodeName !== "IMG") { + return; + } + + for (; i<propertiesLength; i++) { + property = properties[i]; + if (style[property]) { + target.setAttribute(property, parseInt(style[property], 10)); + style[property] = ""; + } + } + + // After resizing IE sometimes forgets to remove the old resize handles + wysihtml5.quirks.redraw(element); + }); + } + }, + + _initUndoManager: function() { + this.undoManager = new wysihtml5.UndoManager(this.parent); + }, + + _initLineBreaking: function() { + var that = this, + USE_NATIVE_LINE_BREAK_INSIDE_TAGS = ["LI", "P", "H1", "H2", "H3", "H4", "H5", "H6"], + LIST_TAGS = ["UL", "OL", "MENU"]; + + function adjust(selectedNode) { + var parentElement = dom.getParentElement(selectedNode, { nodeName: ["P", "DIV"] }, 2); + if (parentElement && dom.contains(that.element, parentElement)) { + that.selection.executeAndRestore(function() { + if (that.config.useLineBreaks) { + dom.replaceWithChildNodes(parentElement); + } else if (parentElement.nodeName !== "P") { + dom.renameElement(parentElement, "p"); + } + }); + } + } + + if (!this.config.useLineBreaks) { + dom.observe(this.element, ["focus", "keydown"], function() { + if (that.isEmpty()) { + var paragraph = that.doc.createElement("P"); + that.element.innerHTML = ""; + that.element.appendChild(paragraph); + if (!browser.displaysCaretInEmptyContentEditableCorrectly()) { + paragraph.innerHTML = "<br>"; + that.selection.setBefore(paragraph.firstChild); + } else { + that.selection.selectNode(paragraph, true); + } + } + }); + } + + // Under certain circumstances Chrome + Safari create nested <p> or <hX> tags after paste + // Inserting an invisible white space in front of it fixes the issue + // This is too hacky and causes selection not to replace content on paste in chrome + /* if (browser.createsNestedInvalidMarkupAfterPaste()) { + dom.observe(this.element, "paste", function(event) { + var invisibleSpace = that.doc.createTextNode(wysihtml5.INVISIBLE_SPACE); + that.selection.insertNode(invisibleSpace); + }); + }*/ + + + dom.observe(this.element, "keydown", function(event) { + var keyCode = event.keyCode; + + if (event.shiftKey) { + return; + } + + if (keyCode !== wysihtml5.ENTER_KEY && keyCode !== wysihtml5.BACKSPACE_KEY) { + return; + } + var blockElement = dom.getParentElement(that.selection.getSelectedNode(), { nodeName: USE_NATIVE_LINE_BREAK_INSIDE_TAGS }, 4); + if (blockElement) { + setTimeout(function() { + // Unwrap paragraph after leaving a list or a H1-6 + var selectedNode = that.selection.getSelectedNode(), + list; + + if (blockElement.nodeName === "LI") { + if (!selectedNode) { + return; + } + + list = dom.getParentElement(selectedNode, { nodeName: LIST_TAGS }, 2); + + if (!list) { + adjust(selectedNode); + } + } + + if (keyCode === wysihtml5.ENTER_KEY && blockElement.nodeName.match(/^H[1-6]$/)) { + adjust(selectedNode); + } + }, 0); + return; + } + + if (that.config.useLineBreaks && keyCode === wysihtml5.ENTER_KEY && !wysihtml5.browser.insertsLineBreaksOnReturn()) { + event.preventDefault(); + that.commands.exec("insertLineBreak"); + + } + }); + } + }); +})(wysihtml5); +;(function(wysihtml5) { + var dom = wysihtml5.dom, + doc = document, + win = window, + HOST_TEMPLATE = doc.createElement("div"), + /** + * Styles to copy from textarea to the composer element + */ + TEXT_FORMATTING = [ + "background-color", + "color", "cursor", + "font-family", "font-size", "font-style", "font-variant", "font-weight", + "line-height", "letter-spacing", + "text-align", "text-decoration", "text-indent", "text-rendering", + "word-break", "word-wrap", "word-spacing" + ], + /** + * Styles to copy from textarea to the iframe + */ + BOX_FORMATTING = [ + "background-color", + "border-collapse", + "border-bottom-color", "border-bottom-style", "border-bottom-width", + "border-left-color", "border-left-style", "border-left-width", + "border-right-color", "border-right-style", "border-right-width", + "border-top-color", "border-top-style", "border-top-width", + "clear", "display", "float", + "margin-bottom", "margin-left", "margin-right", "margin-top", + "outline-color", "outline-offset", "outline-width", "outline-style", + "padding-left", "padding-right", "padding-top", "padding-bottom", + "position", "top", "left", "right", "bottom", "z-index", + "vertical-align", "text-align", + "-webkit-box-sizing", "-moz-box-sizing", "-ms-box-sizing", "box-sizing", + "-webkit-box-shadow", "-moz-box-shadow", "-ms-box-shadow","box-shadow", + "-webkit-border-top-right-radius", "-moz-border-radius-topright", "border-top-right-radius", + "-webkit-border-bottom-right-radius", "-moz-border-radius-bottomright", "border-bottom-right-radius", + "-webkit-border-bottom-left-radius", "-moz-border-radius-bottomleft", "border-bottom-left-radius", + "-webkit-border-top-left-radius", "-moz-border-radius-topleft", "border-top-left-radius", + "width", "height" + ], + ADDITIONAL_CSS_RULES = [ + "html { height: 100%; }", + "body { height: 100%; padding: 1px 0 0 0; margin: -1px 0 0 0; }", + "body > p:first-child { margin-top: 0; }", + "._wysihtml5-temp { display: none; }", + wysihtml5.browser.isGecko ? + "body.placeholder { color: graytext !important; }" : + "body.placeholder { color: #a9a9a9 !important; }", + // Ensure that user see's broken images and can delete them + "img:-moz-broken { -moz-force-broken-image-icon: 1; height: 24px; width: 24px; }" + ]; + + /** + * With "setActive" IE offers a smart way of focusing elements without scrolling them into view: + * http://msdn.microsoft.com/en-us/library/ms536738(v=vs.85).aspx + * + * Other browsers need a more hacky way: (pssst don't tell my mama) + * In order to prevent the element being scrolled into view when focusing it, we simply + * move it out of the scrollable area, focus it, and reset it's position + */ + var focusWithoutScrolling = function(element) { + if (element.setActive) { + // Following line could cause a js error when the textarea is invisible + // See https://github.com/xing/wysihtml5/issues/9 + try { element.setActive(); } catch(e) {} + } else { + var elementStyle = element.style, + originalScrollTop = doc.documentElement.scrollTop || doc.body.scrollTop, + originalScrollLeft = doc.documentElement.scrollLeft || doc.body.scrollLeft, + originalStyles = { + position: elementStyle.position, + top: elementStyle.top, + left: elementStyle.left, + WebkitUserSelect: elementStyle.WebkitUserSelect + }; + + dom.setStyles({ + position: "absolute", + top: "-99999px", + left: "-99999px", + // Don't ask why but temporarily setting -webkit-user-select to none makes the whole thing performing smoother + WebkitUserSelect: "none" + }).on(element); + + element.focus(); + + dom.setStyles(originalStyles).on(element); + + if (win.scrollTo) { + // Some browser extensions unset this method to prevent annoyances + // "Better PopUp Blocker" for Chrome http://code.google.com/p/betterpopupblocker/source/browse/trunk/blockStart.js#100 + // Issue: http://code.google.com/p/betterpopupblocker/issues/detail?id=1 + win.scrollTo(originalScrollLeft, originalScrollTop); + } + } + }; + + + wysihtml5.views.Composer.prototype.style = function() { + var that = this, + originalActiveElement = doc.querySelector(":focus"), + textareaElement = this.textarea.element, + hasPlaceholder = textareaElement.hasAttribute("placeholder"), + originalPlaceholder = hasPlaceholder && textareaElement.getAttribute("placeholder"), + originalDisplayValue = textareaElement.style.display, + originalDisabled = textareaElement.disabled, + displayValueForCopying; + + this.focusStylesHost = HOST_TEMPLATE.cloneNode(false); + this.blurStylesHost = HOST_TEMPLATE.cloneNode(false); + this.disabledStylesHost = HOST_TEMPLATE.cloneNode(false); + + // Remove placeholder before copying (as the placeholder has an affect on the computed style) + if (hasPlaceholder) { + textareaElement.removeAttribute("placeholder"); + } + + if (textareaElement === originalActiveElement) { + textareaElement.blur(); + } + + // enable for copying styles + textareaElement.disabled = false; + + // set textarea to display="none" to get cascaded styles via getComputedStyle + textareaElement.style.display = displayValueForCopying = "none"; + + if ((textareaElement.getAttribute("rows") && dom.getStyle("height").from(textareaElement) === "auto") || + (textareaElement.getAttribute("cols") && dom.getStyle("width").from(textareaElement) === "auto")) { + textareaElement.style.display = displayValueForCopying = originalDisplayValue; + } + + // --------- iframe styles (has to be set before editor styles, otherwise IE9 sets wrong fontFamily on blurStylesHost) --------- + dom.copyStyles(BOX_FORMATTING).from(textareaElement).to(this.editableArea).andTo(this.blurStylesHost); + + // --------- editor styles --------- + dom.copyStyles(TEXT_FORMATTING).from(textareaElement).to(this.element).andTo(this.blurStylesHost); + + // --------- apply standard rules --------- + dom.insertCSS(ADDITIONAL_CSS_RULES).into(this.element.ownerDocument); + + // --------- :disabled styles --------- + textareaElement.disabled = true; + dom.copyStyles(BOX_FORMATTING).from(textareaElement).to(this.disabledStylesHost); + dom.copyStyles(TEXT_FORMATTING).from(textareaElement).to(this.disabledStylesHost); + textareaElement.disabled = originalDisabled; + + // --------- :focus styles --------- + textareaElement.style.display = originalDisplayValue; + focusWithoutScrolling(textareaElement); + textareaElement.style.display = displayValueForCopying; + + dom.copyStyles(BOX_FORMATTING).from(textareaElement).to(this.focusStylesHost); + dom.copyStyles(TEXT_FORMATTING).from(textareaElement).to(this.focusStylesHost); + + // reset textarea + textareaElement.style.display = originalDisplayValue; + + dom.copyStyles(["display"]).from(textareaElement).to(this.editableArea); + + // Make sure that we don't change the display style of the iframe when copying styles oblur/onfocus + // this is needed for when the change_view event is fired where the iframe is hidden and then + // the blur event fires and re-displays it + var boxFormattingStyles = wysihtml5.lang.array(BOX_FORMATTING).without(["display"]); + + // --------- restore focus --------- + if (originalActiveElement) { + originalActiveElement.focus(); + } else { + textareaElement.blur(); + } + + // --------- restore placeholder --------- + if (hasPlaceholder) { + textareaElement.setAttribute("placeholder", originalPlaceholder); + } + + // --------- Sync focus/blur styles --------- + this.parent.on("focus:composer", function() { + dom.copyStyles(boxFormattingStyles) .from(that.focusStylesHost).to(that.editableArea); + dom.copyStyles(TEXT_FORMATTING) .from(that.focusStylesHost).to(that.element); + }); + + this.parent.on("blur:composer", function() { + dom.copyStyles(boxFormattingStyles) .from(that.blurStylesHost).to(that.editableArea); + dom.copyStyles(TEXT_FORMATTING) .from(that.blurStylesHost).to(that.element); + }); + + this.parent.observe("disable:composer", function() { + dom.copyStyles(boxFormattingStyles) .from(that.disabledStylesHost).to(that.editableArea); + dom.copyStyles(TEXT_FORMATTING) .from(that.disabledStylesHost).to(that.element); + }); + + this.parent.observe("enable:composer", function() { + dom.copyStyles(boxFormattingStyles) .from(that.blurStylesHost).to(that.editableArea); + dom.copyStyles(TEXT_FORMATTING) .from(that.blurStylesHost).to(that.element); + }); + + return this; + }; +})(wysihtml5); +;/** + * Taking care of events + * - Simulating 'change' event on contentEditable element + * - Handling drag & drop logic + * - Catch paste events + * - Dispatch proprietary newword:composer event + * - Keyboard shortcuts + */ +(function(wysihtml5) { + var dom = wysihtml5.dom, + browser = wysihtml5.browser, + /** + * Map keyCodes to query commands + */ + shortcuts = { + "66": "bold", // B + "73": "italic", // I + "85": "underline" // U + }; + + var deleteAroundEditable = function(selection, uneditable, element) { + // merge node with previous node from uneditable + var prevNode = selection.getPreviousNode(uneditable, true), + curNode = selection.getSelectedNode(); + + if (curNode.nodeType !== 1 && curNode.parentNode !== element) { curNode = curNode.parentNode; } + if (prevNode) { + if (curNode.nodeType == 1) { + var first = curNode.firstChild; + + if (prevNode.nodeType == 1) { + while (curNode.firstChild) { + prevNode.appendChild(curNode.firstChild); + } + } else { + while (curNode.firstChild) { + uneditable.parentNode.insertBefore(curNode.firstChild, uneditable); + } + } + if (curNode.parentNode) { + curNode.parentNode.removeChild(curNode); + } + selection.setBefore(first); + } else { + if (prevNode.nodeType == 1) { + prevNode.appendChild(curNode); + } else { + uneditable.parentNode.insertBefore(curNode, uneditable); + } + selection.setBefore(curNode); + } + } + }; + + var handleDeleteKeyPress = function(event, selection, element, composer) { + if (selection.isCollapsed()) { + if (selection.caretIsInTheBeginnig('LI')) { + event.preventDefault(); + composer.commands.exec('outdentList'); + } else if (selection.caretIsInTheBeginnig()) { + event.preventDefault(); + } else { + + if (selection.caretIsFirstInSelection() && + selection.getPreviousNode() && + selection.getPreviousNode().nodeName && + (/^H\d$/gi).test(selection.getPreviousNode().nodeName) + ) { + var prevNode = selection.getPreviousNode(); + event.preventDefault(); + if ((/^\s*$/).test(prevNode.textContent || prevNode.innerText)) { + // heading is empty + prevNode.parentNode.removeChild(prevNode); + } else { + var range = prevNode.ownerDocument.createRange(); + range.selectNodeContents(prevNode); + range.collapse(false); + selection.setSelection(range); + } + } + + var beforeUneditable = selection.caretIsBeforeUneditable(); + // Do a special delete if caret would delete uneditable + if (beforeUneditable) { + event.preventDefault(); + deleteAroundEditable(selection, beforeUneditable, element); + } + } + } else { + if (selection.containsUneditable()) { + event.preventDefault(); + selection.deleteContents(); + } + } + }; + + var handleTabKeyDown = function(composer, element) { + if (!composer.selection.isCollapsed()) { + composer.selection.deleteContents(); + } else if (composer.selection.caretIsInTheBeginnig('LI')) { + if (composer.commands.exec('indentList')) return; + } + + // Is &emsp; close enough to tab. Could not find enough counter arguments for now. + composer.commands.exec("insertHTML", "&emsp;"); + }; + + wysihtml5.views.Composer.prototype.observe = function() { + var that = this, + state = this.getValue(false, false), + container = (this.sandbox.getIframe) ? this.sandbox.getIframe() : this.sandbox.getContentEditable(), + element = this.element, + focusBlurElement = (browser.supportsEventsInIframeCorrectly() || this.sandbox.getContentEditable) ? element : this.sandbox.getWindow(), + pasteEvents = ["drop", "paste", "beforepaste"], + interactionEvents = ["drop", "paste", "mouseup", "focus", "keyup"]; + + // --------- destroy:composer event --------- + dom.observe(container, "DOMNodeRemoved", function() { + clearInterval(domNodeRemovedInterval); + that.parent.fire("destroy:composer"); + }); + + // DOMNodeRemoved event is not supported in IE 8 + if (!browser.supportsMutationEvents()) { + var domNodeRemovedInterval = setInterval(function() { + if (!dom.contains(document.documentElement, container)) { + clearInterval(domNodeRemovedInterval); + that.parent.fire("destroy:composer"); + } + }, 250); + } + + // --------- User interaction tracking -- + + dom.observe(focusBlurElement, interactionEvents, function() { + setTimeout(function() { + that.parent.fire("interaction").fire("interaction:composer"); + }, 0); + }); + + + if (this.config.handleTables) { + if(!this.tableClickHandle && this.doc.execCommand && wysihtml5.browser.supportsCommand(this.doc, "enableObjectResizing") && wysihtml5.browser.supportsCommand(this.doc, "enableInlineTableEditing")) { + if (this.sandbox.getIframe) { + this.tableClickHandle = dom.observe(container , ["focus", "mouseup", "mouseover"], function() { + that.doc.execCommand("enableObjectResizing", false, "false"); + that.doc.execCommand("enableInlineTableEditing", false, "false"); + that.tableClickHandle.stop(); + }); + } else { + setTimeout(function() { + that.doc.execCommand("enableObjectResizing", false, "false"); + that.doc.execCommand("enableInlineTableEditing", false, "false"); + }, 0); + } + } + this.tableSelection = wysihtml5.quirks.tableCellsSelection(element, that.parent); + } + + // --------- Focus & blur logic --------- + dom.observe(focusBlurElement, "focus", function(event) { + that.parent.fire("focus", event).fire("focus:composer", event); + + // Delay storing of state until all focus handler are fired + // especially the one which resets the placeholder + setTimeout(function() { state = that.getValue(false, false); }, 0); + }); + + dom.observe(focusBlurElement, "blur", function(event) { + if (state !== that.getValue(false, false)) { + //create change event if supported (all except IE8) + var changeevent = event; + if(typeof Object.create == 'function') { + changeevent = Object.create(event, { type: { value: 'change' } }); + } + that.parent.fire("change", changeevent).fire("change:composer", changeevent); + } + that.parent.fire("blur", event).fire("blur:composer", event); + }); + + // --------- Drag & Drop logic --------- + dom.observe(element, "dragenter", function() { + that.parent.fire("unset_placeholder"); + }); + + dom.observe(element, pasteEvents, function(event) { + that.parent.fire(event.type, event).fire(event.type + ":composer", event); + }); + + + if (this.config.copyedFromMarking) { + // If supported the copied source is based directly on selection + // Very useful for webkit based browsers where copy will otherwise contain a lot of code and styles based on whatever and not actually in selection. + dom.observe(element, "copy", function(event) { + if (event.clipboardData) { + event.clipboardData.setData("text/html", that.config.copyedFromMarking + that.selection.getHtml()); + event.preventDefault(); + } + that.parent.fire(event.type, event).fire(event.type + ":composer", event); + }); + } + + // --------- neword event --------- + dom.observe(element, "keyup", function(event) { + var keyCode = event.keyCode; + if (keyCode === wysihtml5.SPACE_KEY || keyCode === wysihtml5.ENTER_KEY) { + that.parent.fire("newword:composer"); + } + }); + + this.parent.on("paste:composer", function() { + setTimeout(function() { that.parent.fire("newword:composer"); }, 0); + }); + + // --------- Make sure that images are selected when clicking on them --------- + if (!browser.canSelectImagesInContentEditable()) { + dom.observe(element, "mousedown", function(event) { + var target = event.target; + var allImages = element.querySelectorAll('img'), + notMyImages = element.querySelectorAll('.' + that.config.uneditableContainerClassname + ' img'), + myImages = wysihtml5.lang.array(allImages).without(notMyImages); + + if (target.nodeName === "IMG" && wysihtml5.lang.array(myImages).contains(target)) { + that.selection.selectNode(target); + } + }); + } + + if (!browser.canSelectImagesInContentEditable()) { + dom.observe(element, "drop", function(event) { + // TODO: if I knew how to get dropped elements list from event I could limit it to only IMG element case + setTimeout(function() { + that.selection.getSelection().removeAllRanges(); + }, 0); + }); + } + + if (browser.hasHistoryIssue() && browser.supportsSelectionModify()) { + dom.observe(element, "keydown", function(event) { + if (!event.metaKey && !event.ctrlKey) { + return; + } + + var keyCode = event.keyCode, + win = element.ownerDocument.defaultView, + selection = win.getSelection(); + + if (keyCode === 37 || keyCode === 39) { + if (keyCode === 37) { + selection.modify("extend", "left", "lineboundary"); + if (!event.shiftKey) { + selection.collapseToStart(); + } + } + if (keyCode === 39) { + selection.modify("extend", "right", "lineboundary"); + if (!event.shiftKey) { + selection.collapseToEnd(); + } + } + event.preventDefault(); + } + }); + } + + // --------- Shortcut logic --------- + dom.observe(element, "keydown", function(event) { + var keyCode = event.keyCode, + command = shortcuts[keyCode]; + if ((event.ctrlKey || event.metaKey) && !event.altKey && command) { + that.commands.exec(command); + event.preventDefault(); + } + if (keyCode === 8) { + // delete key + handleDeleteKeyPress(event, that.selection, element, that); + } else if (that.config.handleTabKey && keyCode === 9) { + event.preventDefault(); + handleTabKeyDown(that, element); + } + }); + + // --------- Make sure that when pressing backspace/delete on selected images deletes the image and it's anchor --------- + dom.observe(element, "keydown", function(event) { + var target = that.selection.getSelectedNode(true), + keyCode = event.keyCode, + parent; + if (target && target.nodeName === "IMG" && (keyCode === wysihtml5.BACKSPACE_KEY || keyCode === wysihtml5.DELETE_KEY)) { // 8 => backspace, 46 => delete + parent = target.parentNode; + // delete the <img> + parent.removeChild(target); + // and it's parent <a> too if it hasn't got any other child nodes + if (parent.nodeName === "A" && !parent.firstChild) { + parent.parentNode.removeChild(parent); + } + + setTimeout(function() { wysihtml5.quirks.redraw(element); }, 0); + event.preventDefault(); + } + }); + + // --------- IE 8+9 focus the editor when the iframe is clicked (without actually firing the 'focus' event on the <body>) --------- + if (!this.config.contentEditableMode && browser.hasIframeFocusIssue()) { + dom.observe(container, "focus", function() { + setTimeout(function() { + if (that.doc.querySelector(":focus") !== that.element) { + that.focus(); + } + }, 0); + }); + + dom.observe(this.element, "blur", function() { + setTimeout(function() { + that.selection.getSelection().removeAllRanges(); + }, 0); + }); + } + + // --------- Show url in tooltip when hovering links or images --------- + var titlePrefixes = { + IMG: "Image: ", + A: "Link: " + }; + + dom.observe(element, "mouseover", function(event) { + var target = event.target, + nodeName = target.nodeName, + title; + if (nodeName !== "A" && nodeName !== "IMG") { + return; + } + var hasTitle = target.hasAttribute("title"); + if(!hasTitle){ + title = titlePrefixes[nodeName] + (target.getAttribute("href") || target.getAttribute("src")); + target.setAttribute("title", title); + } + }); + }; +})(wysihtml5); +;/** + * Class that takes care that the value of the composer and the textarea is always in sync + */ +(function(wysihtml5) { + var INTERVAL = 400; + + wysihtml5.views.Synchronizer = Base.extend( + /** @scope wysihtml5.views.Synchronizer.prototype */ { + + constructor: function(editor, textarea, composer) { + this.editor = editor; + this.textarea = textarea; + this.composer = composer; + + this._observe(); + }, + + /** + * Sync html from composer to textarea + * Takes care of placeholders + * @param {Boolean} shouldParseHtml Whether the html should be sanitized before inserting it into the textarea + */ + fromComposerToTextarea: function(shouldParseHtml) { + this.textarea.setValue(wysihtml5.lang.string(this.composer.getValue(false, false)).trim(), shouldParseHtml); + }, + + /** + * Sync value of textarea to composer + * Takes care of placeholders + * @param {Boolean} shouldParseHtml Whether the html should be sanitized before inserting it into the composer + */ + fromTextareaToComposer: function(shouldParseHtml) { + var textareaValue = this.textarea.getValue(false, false); + if (textareaValue) { + this.composer.setValue(textareaValue, shouldParseHtml); + } else { + this.composer.clear(); + this.editor.fire("set_placeholder"); + } + }, + + /** + * Invoke syncing based on view state + * @param {Boolean} shouldParseHtml Whether the html should be sanitized before inserting it into the composer/textarea + */ + sync: function(shouldParseHtml) { + if (this.editor.currentView.name === "textarea") { + this.fromTextareaToComposer(shouldParseHtml); + } else { + this.fromComposerToTextarea(shouldParseHtml); + } + }, + + /** + * Initializes interval-based syncing + * also makes sure that on-submit the composer's content is synced with the textarea + * immediately when the form gets submitted + */ + _observe: function() { + var interval, + that = this, + form = this.textarea.element.form, + startInterval = function() { + interval = setInterval(function() { that.fromComposerToTextarea(); }, INTERVAL); + }, + stopInterval = function() { + clearInterval(interval); + interval = null; + }; + + startInterval(); + + if (form) { + // If the textarea is in a form make sure that after onreset and onsubmit the composer + // has the correct state + wysihtml5.dom.observe(form, "submit", function() { + that.sync(true); + }); + wysihtml5.dom.observe(form, "reset", function() { + setTimeout(function() { that.fromTextareaToComposer(); }, 0); + }); + } + + this.editor.on("change_view", function(view) { + if (view === "composer" && !interval) { + that.fromTextareaToComposer(true); + startInterval(); + } else if (view === "textarea") { + that.fromComposerToTextarea(true); + stopInterval(); + } + }); + + this.editor.on("destroy:composer", stopInterval); + } + }); +})(wysihtml5); +;wysihtml5.views.Textarea = wysihtml5.views.View.extend( + /** @scope wysihtml5.views.Textarea.prototype */ { + name: "textarea", + + constructor: function(parent, textareaElement, config) { + this.base(parent, textareaElement, config); + + this._observe(); + }, + + clear: function() { + this.element.value = ""; + }, + + getValue: function(parse) { + var value = this.isEmpty() ? "" : this.element.value; + if (parse !== false) { + value = this.parent.parse(value); + } + return value; + }, + + setValue: function(html, parse) { + if (parse) { + html = this.parent.parse(html); + } + this.element.value = html; + }, + + cleanUp: function() { + var html = this.parent.parse(this.element.value); + this.element.value = html; + }, + + hasPlaceholderSet: function() { + var supportsPlaceholder = wysihtml5.browser.supportsPlaceholderAttributeOn(this.element), + placeholderText = this.element.getAttribute("placeholder") || null, + value = this.element.value, + isEmpty = !value; + return (supportsPlaceholder && isEmpty) || (value === placeholderText); + }, + + isEmpty: function() { + return !wysihtml5.lang.string(this.element.value).trim() || this.hasPlaceholderSet(); + }, + + _observe: function() { + var element = this.element, + parent = this.parent, + eventMapping = { + focusin: "focus", + focusout: "blur" + }, + /** + * Calling focus() or blur() on an element doesn't synchronously trigger the attached focus/blur events + * This is the case for focusin and focusout, so let's use them whenever possible, kkthxbai + */ + events = wysihtml5.browser.supportsEvent("focusin") ? ["focusin", "focusout", "change"] : ["focus", "blur", "change"]; + + parent.on("beforeload", function() { + wysihtml5.dom.observe(element, events, function(event) { + var eventName = eventMapping[event.type] || event.type; + parent.fire(eventName).fire(eventName + ":textarea"); + }); + + wysihtml5.dom.observe(element, ["paste", "drop"], function() { + setTimeout(function() { parent.fire("paste").fire("paste:textarea"); }, 0); + }); + }); + } +}); +;/** + * WYSIHTML5 Editor + * + * @param {Element} editableElement Reference to the textarea which should be turned into a rich text interface + * @param {Object} [config] See defaultConfig object below for explanation of each individual config option + * + * @events + * load + * beforeload (for internal use only) + * focus + * focus:composer + * focus:textarea + * blur + * blur:composer + * blur:textarea + * change + * change:composer + * change:textarea + * paste + * paste:composer + * paste:textarea + * newword:composer + * destroy:composer + * undo:composer + * redo:composer + * beforecommand:composer + * aftercommand:composer + * enable:composer + * disable:composer + * change_view + */ +(function(wysihtml5) { + var undef; + + var defaultConfig = { + // Give the editor a name, the name will also be set as class name on the iframe and on the iframe's body + name: undef, + // Whether the editor should look like the textarea (by adopting styles) + style: true, + // Id of the toolbar element, pass falsey value if you don't want any toolbar logic + toolbar: undef, + // Whether toolbar is displayed after init by script automatically. + // Can be set to false if toolobar is set to display only on editable area focus + showToolbarAfterInit: true, + // Whether urls, entered by the user should automatically become clickable-links + autoLink: true, + // Includes table editing events and cell selection tracking + handleTables: true, + // Tab key inserts tab into text as default behaviour. It can be disabled to regain keyboard navigation + handleTabKey: true, + // Object which includes parser rules to apply when html gets cleaned + // See parser_rules/*.js for examples + parserRules: { tags: { br: {}, span: {}, div: {}, p: {} }, classes: {} }, + // Object which includes parser when the user inserts content via copy & paste. If null parserRules will be used instead + pasteParserRulesets: null, + // Parser method to use when the user inserts content + parser: wysihtml5.dom.parse, + // Class name which should be set on the contentEditable element in the created sandbox iframe, can be styled via the 'stylesheets' option + composerClassName: "wysihtml5-editor", + // Class name to add to the body when the wysihtml5 editor is supported + bodyClassName: "wysihtml5-supported", + // By default wysihtml5 will insert a <br> for line breaks, set this to false to use <p> + useLineBreaks: true, + // Array (or single string) of stylesheet urls to be loaded in the editor's iframe + stylesheets: [], + // Placeholder text to use, defaults to the placeholder attribute on the textarea element + placeholderText: undef, + // Whether the rich text editor should be rendered on touch devices (wysihtml5 >= 0.3.0 comes with basic support for iOS 5) + supportTouchDevices: true, + // Whether senseless <span> elements (empty or without attributes) should be removed/replaced with their content + cleanUp: true, + // Whether to use div instead of secure iframe + contentEditableMode: false, + // Classname of container that editor should not touch and pass through + // Pass false to disable + uneditableContainerClassname: "wysihtml5-uneditable-container", + // Browsers that support copied source handling will get a marking of the origin of the copied source (for determinig code cleanup rules on paste) + // Also copied source is based directly on selection - + // (very useful for webkit based browsers where copy will otherwise contain a lot of code and styles based on whatever and not actually in selection). + // If falsy value is passed source override is also disabled + copyedFromMarking: '<meta name="copied-from" content="wysihtml5">' + }; + + wysihtml5.Editor = wysihtml5.lang.Dispatcher.extend( + /** @scope wysihtml5.Editor.prototype */ { + constructor: function(editableElement, config) { + this.editableElement = typeof(editableElement) === "string" ? document.getElementById(editableElement) : editableElement; + this.config = wysihtml5.lang.object({}).merge(defaultConfig).merge(config).get(); + this._isCompatible = wysihtml5.browser.supported(); + + if (this.editableElement.nodeName.toLowerCase() != "textarea") { + this.config.contentEditableMode = true; + this.config.noTextarea = true; + } + if (!this.config.noTextarea) { + this.textarea = new wysihtml5.views.Textarea(this, this.editableElement, this.config); + this.currentView = this.textarea; + } + + // Sort out unsupported/unwanted browsers here + if (!this._isCompatible || (!this.config.supportTouchDevices && wysihtml5.browser.isTouchDevice())) { + var that = this; + setTimeout(function() { that.fire("beforeload").fire("load"); }, 0); + return; + } + + // Add class name to body, to indicate that the editor is supported + wysihtml5.dom.addClass(document.body, this.config.bodyClassName); + + this.composer = new wysihtml5.views.Composer(this, this.editableElement, this.config); + this.currentView = this.composer; + + if (typeof(this.config.parser) === "function") { + this._initParser(); + } + + this.on("beforeload", this.handleBeforeLoad); + }, + + handleBeforeLoad: function() { + if (!this.config.noTextarea) { + this.synchronizer = new wysihtml5.views.Synchronizer(this, this.textarea, this.composer); + } + if (this.config.toolbar) { + this.toolbar = new wysihtml5.toolbar.Toolbar(this, this.config.toolbar, this.config.showToolbarAfterInit); + } + }, + + isCompatible: function() { + return this._isCompatible; + }, + + clear: function() { + this.currentView.clear(); + return this; + }, + + getValue: function(parse, clearInternals) { + return this.currentView.getValue(parse, clearInternals); + }, + + setValue: function(html, parse) { + this.fire("unset_placeholder"); + + if (!html) { + return this.clear(); + } + + this.currentView.setValue(html, parse); + return this; + }, + + cleanUp: function() { + this.currentView.cleanUp(); + }, + + focus: function(setToEnd) { + this.currentView.focus(setToEnd); + return this; + }, + + /** + * Deactivate editor (make it readonly) + */ + disable: function() { + this.currentView.disable(); + return this; + }, + + /** + * Activate editor + */ + enable: function() { + this.currentView.enable(); + return this; + }, + + isEmpty: function() { + return this.currentView.isEmpty(); + }, + + hasPlaceholderSet: function() { + return this.currentView.hasPlaceholderSet(); + }, + + parse: function(htmlOrElement, clearInternals) { + var parseContext = (this.config.contentEditableMode) ? document : ((this.composer) ? this.composer.sandbox.getDocument() : null); + var returnValue = this.config.parser(htmlOrElement, { + "rules": this.config.parserRules, + "cleanUp": this.config.cleanUp, + "context": parseContext, + "uneditableClass": this.config.uneditableContainerClassname, + "clearInternals" : clearInternals + }); + if (typeof(htmlOrElement) === "object") { + wysihtml5.quirks.redraw(htmlOrElement); + } + return returnValue; + }, + + /** + * Prepare html parser logic + * - Observes for paste and drop + */ + _initParser: function() { + var that = this, + oldHtml, + cleanHtml; + + if (wysihtml5.browser.supportsModenPaste()) { + this.on("paste:composer", function(event) { + event.preventDefault(); + oldHtml = wysihtml5.dom.getPastedHtml(event); + if (oldHtml) { + that._cleanAndPaste(oldHtml); + } + }); + + } else { + this.on("beforepaste:composer", function(event) { + event.preventDefault(); + wysihtml5.dom.getPastedHtmlWithDiv(that.composer, function(pastedHTML) { + if (pastedHTML) { + that._cleanAndPaste(pastedHTML); + } + }); + }); + + } + }, + + _cleanAndPaste: function (oldHtml) { + var cleanHtml = wysihtml5.quirks.cleanPastedHTML(oldHtml, { + "referenceNode": this.composer.element, + "rules": this.config.pasteParserRulesets || [{"set": this.config.parserRules}], + "uneditableClass": this.config.uneditableContainerClassname + }); + this.composer.selection.deleteContents(); + this.composer.selection.insertHTML(cleanHtml); + } + }); +})(wysihtml5); +;/** + * Toolbar Dialog + * + * @param {Element} link The toolbar link which causes the dialog to show up + * @param {Element} container The dialog container + * + * @example + * <!-- Toolbar link --> + * <a data-wysihtml5-command="insertImage">insert an image</a> + * + * <!-- Dialog --> + * <div data-wysihtml5-dialog="insertImage" style="display: none;"> + * <label> + * URL: <input data-wysihtml5-dialog-field="src" value="http://"> + * </label> + * <label> + * Alternative text: <input data-wysihtml5-dialog-field="alt" value=""> + * </label> + * </div> + * + * <script> + * var dialog = new wysihtml5.toolbar.Dialog( + * document.querySelector("[data-wysihtml5-command='insertImage']"), + * document.querySelector("[data-wysihtml5-dialog='insertImage']") + * ); + * dialog.observe("save", function(attributes) { + * // do something + * }); + * </script> + */ +(function(wysihtml5) { + var dom = wysihtml5.dom, + CLASS_NAME_OPENED = "wysihtml5-command-dialog-opened", + SELECTOR_FORM_ELEMENTS = "input, select, textarea", + SELECTOR_FIELDS = "[data-wysihtml5-dialog-field]", + ATTRIBUTE_FIELDS = "data-wysihtml5-dialog-field"; + + + wysihtml5.toolbar.Dialog = wysihtml5.lang.Dispatcher.extend( + /** @scope wysihtml5.toolbar.Dialog.prototype */ { + constructor: function(link, container) { + this.link = link; + this.container = container; + }, + + _observe: function() { + if (this._observed) { + return; + } + + var that = this, + callbackWrapper = function(event) { + var attributes = that._serialize(); + if (attributes == that.elementToChange) { + that.fire("edit", attributes); + } else { + that.fire("save", attributes); + } + that.hide(); + event.preventDefault(); + event.stopPropagation(); + }; + + dom.observe(that.link, "click", function() { + if (dom.hasClass(that.link, CLASS_NAME_OPENED)) { + setTimeout(function() { that.hide(); }, 0); + } + }); + + dom.observe(this.container, "keydown", function(event) { + var keyCode = event.keyCode; + if (keyCode === wysihtml5.ENTER_KEY) { + callbackWrapper(event); + } + if (keyCode === wysihtml5.ESCAPE_KEY) { + that.fire("cancel"); + that.hide(); + } + }); + + dom.delegate(this.container, "[data-wysihtml5-dialog-action=save]", "click", callbackWrapper); + + dom.delegate(this.container, "[data-wysihtml5-dialog-action=cancel]", "click", function(event) { + that.fire("cancel"); + that.hide(); + event.preventDefault(); + event.stopPropagation(); + }); + + var formElements = this.container.querySelectorAll(SELECTOR_FORM_ELEMENTS), + i = 0, + length = formElements.length, + _clearInterval = function() { clearInterval(that.interval); }; + for (; i<length; i++) { + dom.observe(formElements[i], "change", _clearInterval); + } + + this._observed = true; + }, + + /** + * Grabs all fields in the dialog and puts them in key=>value style in an object which + * then gets returned + */ + _serialize: function() { + var data = this.elementToChange || {}, + fields = this.container.querySelectorAll(SELECTOR_FIELDS), + length = fields.length, + i = 0; + + for (; i<length; i++) { + data[fields[i].getAttribute(ATTRIBUTE_FIELDS)] = fields[i].value; + } + return data; + }, + + /** + * Takes the attributes of the "elementToChange" + * and inserts them in their corresponding dialog input fields + * + * Assume the "elementToChange" looks like this: + * <a href="http://www.google.com" target="_blank">foo</a> + * + * and we have the following dialog: + * <input type="text" data-wysihtml5-dialog-field="href" value=""> + * <input type="text" data-wysihtml5-dialog-field="target" value=""> + * + * after calling _interpolate() the dialog will look like this + * <input type="text" data-wysihtml5-dialog-field="href" value="http://www.google.com"> + * <input type="text" data-wysihtml5-dialog-field="target" value="_blank"> + * + * Basically it adopted the attribute values into the corresponding input fields + * + */ + _interpolate: function(avoidHiddenFields) { + var field, + fieldName, + newValue, + focusedElement = document.querySelector(":focus"), + fields = this.container.querySelectorAll(SELECTOR_FIELDS), + length = fields.length, + i = 0; + for (; i<length; i++) { + field = fields[i]; + + // Never change elements where the user is currently typing in + if (field === focusedElement) { + continue; + } + + // Don't update hidden fields + // See https://github.com/xing/wysihtml5/pull/14 + if (avoidHiddenFields && field.type === "hidden") { + continue; + } + + fieldName = field.getAttribute(ATTRIBUTE_FIELDS); + newValue = (this.elementToChange && typeof(this.elementToChange) !== 'boolean') ? (this.elementToChange.getAttribute(fieldName) || "") : field.defaultValue; + field.value = newValue; + } + }, + + /** + * Show the dialog element + */ + show: function(elementToChange) { + if (dom.hasClass(this.link, CLASS_NAME_OPENED)) { + return; + } + + var that = this, + firstField = this.container.querySelector(SELECTOR_FORM_ELEMENTS); + this.elementToChange = elementToChange; + this._observe(); + this._interpolate(); + if (elementToChange) { + this.interval = setInterval(function() { that._interpolate(true); }, 500); + } + dom.addClass(this.link, CLASS_NAME_OPENED); + this.container.style.display = ""; + this.fire("show"); + if (firstField && !elementToChange) { + try { + firstField.focus(); + } catch(e) {} + } + }, + + /** + * Hide the dialog element + */ + hide: function() { + clearInterval(this.interval); + this.elementToChange = null; + dom.removeClass(this.link, CLASS_NAME_OPENED); + this.container.style.display = "none"; + this.fire("hide"); + } + }); +})(wysihtml5); +;/** + * Converts speech-to-text and inserts this into the editor + * As of now (2011/03/25) this only is supported in Chrome >= 11 + * + * Note that it sends the recorded audio to the google speech recognition api: + * http://stackoverflow.com/questions/4361826/does-chrome-have-buil-in-speech-recognition-for-input-type-text-x-webkit-speec + * + * Current HTML5 draft can be found here + * http://lists.w3.org/Archives/Public/public-xg-htmlspeech/2011Feb/att-0020/api-draft.html + * + * "Accessing Google Speech API Chrome 11" + * http://mikepultz.com/2011/03/accessing-google-speech-api-chrome-11/ + */ +(function(wysihtml5) { + var dom = wysihtml5.dom; + + var linkStyles = { + position: "relative" + }; + + var wrapperStyles = { + left: 0, + margin: 0, + opacity: 0, + overflow: "hidden", + padding: 0, + position: "absolute", + top: 0, + zIndex: 1 + }; + + var inputStyles = { + cursor: "inherit", + fontSize: "50px", + height: "50px", + marginTop: "-25px", + outline: 0, + padding: 0, + position: "absolute", + right: "-4px", + top: "50%" + }; + + var inputAttributes = { + "x-webkit-speech": "", + "speech": "" + }; + + wysihtml5.toolbar.Speech = function(parent, link) { + var input = document.createElement("input"); + if (!wysihtml5.browser.supportsSpeechApiOn(input)) { + link.style.display = "none"; + return; + } + var lang = parent.editor.textarea.element.getAttribute("lang"); + if (lang) { + inputAttributes.lang = lang; + } + + var wrapper = document.createElement("div"); + + wysihtml5.lang.object(wrapperStyles).merge({ + width: link.offsetWidth + "px", + height: link.offsetHeight + "px" + }); + + dom.insert(input).into(wrapper); + dom.insert(wrapper).into(link); + + dom.setStyles(inputStyles).on(input); + dom.setAttributes(inputAttributes).on(input); + + dom.setStyles(wrapperStyles).on(wrapper); + dom.setStyles(linkStyles).on(link); + + var eventName = "onwebkitspeechchange" in input ? "webkitspeechchange" : "speechchange"; + dom.observe(input, eventName, function() { + parent.execCommand("insertText", input.value); + input.value = ""; + }); + + dom.observe(input, "click", function(event) { + if (dom.hasClass(link, "wysihtml5-command-disabled")) { + event.preventDefault(); + } + + event.stopPropagation(); + }); + }; +})(wysihtml5); +;/** + * Toolbar + * + * @param {Object} parent Reference to instance of Editor instance + * @param {Element} container Reference to the toolbar container element + * + * @example + * <div id="toolbar"> + * <a data-wysihtml5-command="createLink">insert link</a> + * <a data-wysihtml5-command="formatBlock" data-wysihtml5-command-value="h1">insert h1</a> + * </div> + * + * <script> + * var toolbar = new wysihtml5.toolbar.Toolbar(editor, document.getElementById("toolbar")); + * </script> + */ +(function(wysihtml5) { + var CLASS_NAME_COMMAND_DISABLED = "wysihtml5-command-disabled", + CLASS_NAME_COMMANDS_DISABLED = "wysihtml5-commands-disabled", + CLASS_NAME_COMMAND_ACTIVE = "wysihtml5-command-active", + CLASS_NAME_ACTION_ACTIVE = "wysihtml5-action-active", + dom = wysihtml5.dom; + + wysihtml5.toolbar.Toolbar = Base.extend( + /** @scope wysihtml5.toolbar.Toolbar.prototype */ { + constructor: function(editor, container, showOnInit) { + this.editor = editor; + this.container = typeof(container) === "string" ? document.getElementById(container) : container; + this.composer = editor.composer; + + this._getLinks("command"); + this._getLinks("action"); + + this._observe(); + if (showOnInit) { this.show(); } + + if (editor.config.classNameCommandDisabled != null) { + CLASS_NAME_COMMAND_DISABLED = editor.config.classNameCommandDisabled; + } + if (editor.config.classNameCommandsDisabled != null) { + CLASS_NAME_COMMANDS_DISABLED = editor.config.classNameCommandsDisabled; + } + if (editor.config.classNameCommandActive != null) { + CLASS_NAME_COMMAND_ACTIVE = editor.config.classNameCommandActive; + } + if (editor.config.classNameActionActive != null) { + CLASS_NAME_ACTION_ACTIVE = editor.config.classNameActionActive; + } + + var speechInputLinks = this.container.querySelectorAll("[data-wysihtml5-command=insertSpeech]"), + length = speechInputLinks.length, + i = 0; + for (; i<length; i++) { + new wysihtml5.toolbar.Speech(this, speechInputLinks[i]); + } + }, + + _getLinks: function(type) { + var links = this[type + "Links"] = wysihtml5.lang.array(this.container.querySelectorAll("[data-wysihtml5-" + type + "]")).get(), + length = links.length, + i = 0, + mapping = this[type + "Mapping"] = {}, + link, + group, + name, + value, + dialog; + for (; i<length; i++) { + link = links[i]; + name = link.getAttribute("data-wysihtml5-" + type); + value = link.getAttribute("data-wysihtml5-" + type + "-value"); + group = this.container.querySelector("[data-wysihtml5-" + type + "-group='" + name + "']"); + dialog = this._getDialog(link, name); + + mapping[name + ":" + value] = { + link: link, + group: group, + name: name, + value: value, + dialog: dialog, + state: false + }; + } + }, + + _getDialog: function(link, command) { + var that = this, + dialogElement = this.container.querySelector("[data-wysihtml5-dialog='" + command + "']"), + dialog, + caretBookmark; + + if (dialogElement) { + if (wysihtml5.toolbar["Dialog_" + command]) { + dialog = new wysihtml5.toolbar["Dialog_" + command](link, dialogElement); + } else { + dialog = new wysihtml5.toolbar.Dialog(link, dialogElement); + } + + dialog.on("show", function() { + caretBookmark = that.composer.selection.getBookmark(); + + that.editor.fire("show:dialog", { command: command, dialogContainer: dialogElement, commandLink: link }); + }); + + dialog.on("save", function(attributes) { + if (caretBookmark) { + that.composer.selection.setBookmark(caretBookmark); + } + that._execCommand(command, attributes); + + that.editor.fire("save:dialog", { command: command, dialogContainer: dialogElement, commandLink: link }); + }); + + dialog.on("cancel", function() { + that.editor.focus(false); + that.editor.fire("cancel:dialog", { command: command, dialogContainer: dialogElement, commandLink: link }); + }); + } + return dialog; + }, + + /** + * @example + * var toolbar = new wysihtml5.Toolbar(); + * // Insert a <blockquote> element or wrap current selection in <blockquote> + * toolbar.execCommand("formatBlock", "blockquote"); + */ + execCommand: function(command, commandValue) { + if (this.commandsDisabled) { + return; + } + + var commandObj = this.commandMapping[command + ":" + commandValue]; + + // Show dialog when available + if (commandObj && commandObj.dialog && !commandObj.state) { + commandObj.dialog.show(); + } else { + this._execCommand(command, commandValue); + } + }, + + _execCommand: function(command, commandValue) { + // Make sure that composer is focussed (false => don't move caret to the end) + this.editor.focus(false); + + this.composer.commands.exec(command, commandValue); + this._updateLinkStates(); + }, + + execAction: function(action) { + var editor = this.editor; + if (action === "change_view") { + if (editor.textarea) { + if (editor.currentView === editor.textarea) { + editor.fire("change_view", "composer"); + } else { + editor.fire("change_view", "textarea"); + } + } + } + if (action == "showSource") { + editor.fire("showSource"); + } + }, + + _observe: function() { + var that = this, + editor = this.editor, + container = this.container, + links = this.commandLinks.concat(this.actionLinks), + length = links.length, + i = 0; + + for (; i<length; i++) { + // 'javascript:;' and unselectable=on Needed for IE, but done in all browsers to make sure that all get the same css applied + // (you know, a:link { ... } doesn't match anchors with missing href attribute) + if (links[i].nodeName === "A") { + dom.setAttributes({ + href: "javascript:;", + unselectable: "on" + }).on(links[i]); + } else { + dom.setAttributes({ unselectable: "on" }).on(links[i]); + } + } + + // Needed for opera and chrome + dom.delegate(container, "[data-wysihtml5-command], [data-wysihtml5-action]", "mousedown", function(event) { event.preventDefault(); }); + + dom.delegate(container, "[data-wysihtml5-command]", "click", function(event) { + var link = this, + command = link.getAttribute("data-wysihtml5-command"), + commandValue = link.getAttribute("data-wysihtml5-command-value"); + that.execCommand(command, commandValue); + event.preventDefault(); + }); + + dom.delegate(container, "[data-wysihtml5-action]", "click", function(event) { + var action = this.getAttribute("data-wysihtml5-action"); + that.execAction(action); + event.preventDefault(); + }); + + editor.on("interaction:composer", function() { + that._updateLinkStates(); + }); + + editor.on("focus:composer", function() { + that.bookmark = null; + }); + + if (this.editor.config.handleTables) { + editor.on("tableselect:composer", function() { + that.container.querySelectorAll('[data-wysihtml5-hiddentools="table"]')[0].style.display = ""; + }); + editor.on("tableunselect:composer", function() { + that.container.querySelectorAll('[data-wysihtml5-hiddentools="table"]')[0].style.display = "none"; + }); + } + + editor.on("change_view", function(currentView) { + // Set timeout needed in order to let the blur event fire first + if (editor.textarea) { + setTimeout(function() { + that.commandsDisabled = (currentView !== "composer"); + that._updateLinkStates(); + if (that.commandsDisabled) { + dom.addClass(container, CLASS_NAME_COMMANDS_DISABLED); + } else { + dom.removeClass(container, CLASS_NAME_COMMANDS_DISABLED); + } + }, 0); + } + }); + }, + + _updateLinkStates: function() { + + var commandMapping = this.commandMapping, + actionMapping = this.actionMapping, + i, + state, + action, + command; + // every millisecond counts... this is executed quite often + for (i in commandMapping) { + command = commandMapping[i]; + if (this.commandsDisabled) { + state = false; + dom.removeClass(command.link, CLASS_NAME_COMMAND_ACTIVE); + if (command.group) { + dom.removeClass(command.group, CLASS_NAME_COMMAND_ACTIVE); + } + if (command.dialog) { + command.dialog.hide(); + } + } else { + state = this.composer.commands.state(command.name, command.value); + dom.removeClass(command.link, CLASS_NAME_COMMAND_DISABLED); + if (command.group) { + dom.removeClass(command.group, CLASS_NAME_COMMAND_DISABLED); + } + } + if (command.state === state) { + continue; + } + + command.state = state; + if (state) { + dom.addClass(command.link, CLASS_NAME_COMMAND_ACTIVE); + if (command.group) { + dom.addClass(command.group, CLASS_NAME_COMMAND_ACTIVE); + } + if (command.dialog) { + if (typeof(state) === "object" || wysihtml5.lang.object(state).isArray()) { + + if (!command.dialog.multiselect && wysihtml5.lang.object(state).isArray()) { + // Grab first and only object/element in state array, otherwise convert state into boolean + // to avoid showing a dialog for multiple selected elements which may have different attributes + // eg. when two links with different href are selected, the state will be an array consisting of both link elements + // but the dialog interface can only update one + state = state.length === 1 ? state[0] : true; + command.state = state; + } + command.dialog.show(state); + } else { + command.dialog.hide(); + } + } + } else { + dom.removeClass(command.link, CLASS_NAME_COMMAND_ACTIVE); + if (command.group) { + dom.removeClass(command.group, CLASS_NAME_COMMAND_ACTIVE); + } + if (command.dialog) { + command.dialog.hide(); + } + } + } + + for (i in actionMapping) { + action = actionMapping[i]; + + if (action.name === "change_view") { + action.state = this.editor.currentView === this.editor.textarea; + if (action.state) { + dom.addClass(action.link, CLASS_NAME_ACTION_ACTIVE); + } else { + dom.removeClass(action.link, CLASS_NAME_ACTION_ACTIVE); + } + } + } + }, + + show: function() { + this.container.style.display = ""; + }, + + hide: function() { + this.container.style.display = "none"; + } + }); + +})(wysihtml5); +;(function(wysihtml5) { + wysihtml5.toolbar.Dialog_createTable = wysihtml5.toolbar.Dialog.extend({ + show: function(elementToChange) { + this.base(elementToChange); + + } + + }); +})(wysihtml5); +;(function(wysihtml5) { + var dom = wysihtml5.dom, + SELECTOR_FIELDS = "[data-wysihtml5-dialog-field]", + ATTRIBUTE_FIELDS = "data-wysihtml5-dialog-field"; + + wysihtml5.toolbar.Dialog_foreColorStyle = wysihtml5.toolbar.Dialog.extend({ + multiselect: true, + + _serialize: function() { + var data = {}, + fields = this.container.querySelectorAll(SELECTOR_FIELDS), + length = fields.length, + i = 0; + + for (; i<length; i++) { + data[fields[i].getAttribute(ATTRIBUTE_FIELDS)] = fields[i].value; + } + return data; + }, + + _interpolate: function(avoidHiddenFields) { + var field, + fieldName, + newValue, + focusedElement = document.querySelector(":focus"), + fields = this.container.querySelectorAll(SELECTOR_FIELDS), + length = fields.length, + i = 0, + firstElement = (this.elementToChange) ? ((wysihtml5.lang.object(this.elementToChange).isArray()) ? this.elementToChange[0] : this.elementToChange) : null, + colorStr = (firstElement) ? firstElement.getAttribute('style') : null, + color = (colorStr) ? wysihtml5.quirks.styleParser.parseColor(colorStr, "color") : null; + + for (; i<length; i++) { + field = fields[i]; + // Never change elements where the user is currently typing in + if (field === focusedElement) { + continue; + } + // Don't update hidden fields3 + if (avoidHiddenFields && field.type === "hidden") { + continue; + } + if (field.getAttribute(ATTRIBUTE_FIELDS) === "color") { + if (color) { + if (color[3] && color[3] != 1) { + field.value = "rgba(" + color[0] + "," + color[1] + "," + color[2] + "," + color[3] + ");"; + } else { + field.value = "rgb(" + color[0] + "," + color[1] + "," + color[2] + ");"; + } + } else { + field.value = "rgb(0,0,0);"; + } + } + } + } + + }); +})(wysihtml5); +;(function(wysihtml5) { + var dom = wysihtml5.dom, + SELECTOR_FIELDS = "[data-wysihtml5-dialog-field]", + ATTRIBUTE_FIELDS = "data-wysihtml5-dialog-field"; + + wysihtml5.toolbar.Dialog_fontSizeStyle = wysihtml5.toolbar.Dialog.extend({ + multiselect: true, + + _serialize: function() { + return {"size" : this.container.querySelector('[data-wysihtml5-dialog-field="size"]').value}; + }, + + _interpolate: function(avoidHiddenFields) { + var focusedElement = document.querySelector(":focus"), + field = this.container.querySelector("[data-wysihtml5-dialog-field='size']"), + firstElement = (this.elementToChange) ? ((wysihtml5.lang.object(this.elementToChange).isArray()) ? this.elementToChange[0] : this.elementToChange) : null, + styleStr = (firstElement) ? firstElement.getAttribute('style') : null, + size = (styleStr) ? wysihtml5.quirks.styleParser.parseFontSize(styleStr) : null; + + if (field && field !== focusedElement && size && !(/^\s*$/).test(size)) { + field.value = size; + } + } + + }); +})(wysihtml5); +/*! + + handlebars v1.3.0 + +Copyright (C) 2011 by Yehuda Katz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +@license +*/ +var Handlebars=function(){var a=function(){"use strict";function a(a){this.string=a}var b;return a.prototype.toString=function(){return""+this.string},b=a}(),b=function(a){"use strict";function b(a){return h[a]||"&amp;"}function c(a,b){for(var c in b)Object.prototype.hasOwnProperty.call(b,c)&&(a[c]=b[c])}function d(a){return a instanceof g?a.toString():a||0===a?(a=""+a,j.test(a)?a.replace(i,b):a):""}function e(a){return a||0===a?m(a)&&0===a.length?!0:!1:!0}var f={},g=a,h={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},i=/[&<>"'`]/g,j=/[&<>"'`]/;f.extend=c;var k=Object.prototype.toString;f.toString=k;var l=function(a){return"function"==typeof a};l(/x/)&&(l=function(a){return"function"==typeof a&&"[object Function]"===k.call(a)});var l;f.isFunction=l;var m=Array.isArray||function(a){return a&&"object"==typeof a?"[object Array]"===k.call(a):!1};return f.isArray=m,f.escapeExpression=d,f.isEmpty=e,f}(a),c=function(){"use strict";function a(a,b){var d;b&&b.firstLine&&(d=b.firstLine,a+=" - "+d+":"+b.firstColumn);for(var e=Error.prototype.constructor.call(this,a),f=0;f<c.length;f++)this[c[f]]=e[c[f]];d&&(this.lineNumber=d,this.column=b.firstColumn)}var b,c=["description","fileName","lineNumber","message","name","number","stack"];return a.prototype=new Error,b=a}(),d=function(a,b){"use strict";function c(a,b){this.helpers=a||{},this.partials=b||{},d(this)}function d(a){a.registerHelper("helperMissing",function(a){if(2===arguments.length)return void 0;throw new h("Missing helper: '"+a+"'")}),a.registerHelper("blockHelperMissing",function(b,c){var d=c.inverse||function(){},e=c.fn;return m(b)&&(b=b.call(this)),b===!0?e(this):b===!1||null==b?d(this):l(b)?b.length>0?a.helpers.each(b,c):d(this):e(b)}),a.registerHelper("each",function(a,b){var c,d=b.fn,e=b.inverse,f=0,g="";if(m(a)&&(a=a.call(this)),b.data&&(c=q(b.data)),a&&"object"==typeof a)if(l(a))for(var h=a.length;h>f;f++)c&&(c.index=f,c.first=0===f,c.last=f===a.length-1),g+=d(a[f],{data:c});else for(var i in a)a.hasOwnProperty(i)&&(c&&(c.key=i,c.index=f,c.first=0===f),g+=d(a[i],{data:c}),f++);return 0===f&&(g=e(this)),g}),a.registerHelper("if",function(a,b){return m(a)&&(a=a.call(this)),!b.hash.includeZero&&!a||g.isEmpty(a)?b.inverse(this):b.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})}),a.registerHelper("with",function(a,b){return m(a)&&(a=a.call(this)),g.isEmpty(a)?void 0:b.fn(a)}),a.registerHelper("log",function(b,c){var d=c.data&&null!=c.data.level?parseInt(c.data.level,10):1;a.log(d,b)})}function e(a,b){p.log(a,b)}var f={},g=a,h=b,i="1.3.0";f.VERSION=i;var j=4;f.COMPILER_REVISION=j;var k={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:">= 1.0.0"};f.REVISION_CHANGES=k;var l=g.isArray,m=g.isFunction,n=g.toString,o="[object Object]";f.HandlebarsEnvironment=c,c.prototype={constructor:c,logger:p,log:e,registerHelper:function(a,b,c){if(n.call(a)===o){if(c||b)throw new h("Arg not supported with multiple helpers");g.extend(this.helpers,a)}else c&&(b.not=c),this.helpers[a]=b},registerPartial:function(a,b){n.call(a)===o?g.extend(this.partials,a):this.partials[a]=b}};var p={methodMap:{0:"debug",1:"info",2:"warn",3:"error"},DEBUG:0,INFO:1,WARN:2,ERROR:3,level:3,log:function(a,b){if(p.level<=a){var c=p.methodMap[a];"undefined"!=typeof console&&console[c]&&console[c].call(console,b)}}};f.logger=p,f.log=e;var q=function(a){var b={};return g.extend(b,a),b};return f.createFrame=q,f}(b,c),e=function(a,b,c){"use strict";function d(a){var b=a&&a[0]||1,c=m;if(b!==c){if(c>b){var d=n[c],e=n[b];throw new l("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+d+") or downgrade your runtime to an older version ("+e+").")}throw new l("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function e(a,b){if(!b)throw new l("No environment passed to template");var c=function(a,c,d,e,f,g){var h=b.VM.invokePartial.apply(this,arguments);if(null!=h)return h;if(b.compile){var i={helpers:e,partials:f,data:g};return f[c]=b.compile(a,{data:void 0!==g},b),f[c](d,i)}throw new l("The partial "+c+" could not be compiled when running in runtime-only mode")},d={escapeExpression:k.escapeExpression,invokePartial:c,programs:[],program:function(a,b,c){var d=this.programs[a];return c?d=g(a,b,c):d||(d=this.programs[a]=g(a,b)),d},merge:function(a,b){var c=a||b;return a&&b&&a!==b&&(c={},k.extend(c,b),k.extend(c,a)),c},programWithDepth:b.VM.programWithDepth,noop:b.VM.noop,compilerInfo:null};return function(c,e){e=e||{};var f,g,h=e.partial?e:b;e.partial||(f=e.helpers,g=e.partials);var i=a.call(d,h,c,f,g,e.data);return e.partial||b.VM.checkRevision(d.compilerInfo),i}}function f(a,b,c){var d=Array.prototype.slice.call(arguments,3),e=function(a,e){return e=e||{},b.apply(this,[a,e.data||c].concat(d))};return e.program=a,e.depth=d.length,e}function g(a,b,c){var d=function(a,d){return d=d||{},b(a,d.data||c)};return d.program=a,d.depth=0,d}function h(a,b,c,d,e,f){var g={partial:!0,helpers:d,partials:e,data:f};if(void 0===a)throw new l("The partial "+b+" could not be found");return a instanceof Function?a(c,g):void 0}function i(){return""}var j={},k=a,l=b,m=c.COMPILER_REVISION,n=c.REVISION_CHANGES;return j.checkRevision=d,j.template=e,j.programWithDepth=f,j.program=g,j.invokePartial=h,j.noop=i,j}(b,c,d),f=function(a,b,c,d,e){"use strict";var f,g=a,h=b,i=c,j=d,k=e,l=function(){var a=new g.HandlebarsEnvironment;return j.extend(a,g),a.SafeString=h,a.Exception=i,a.Utils=j,a.VM=k,a.template=function(b){return k.template(b,a)},a},m=l();return m.create=l,f=m}(d,a,c,b,e);return f}();this["wysihtml5"] = this["wysihtml5"] || {}; +this["wysihtml5"]["tpl"] = this["wysihtml5"]["tpl"] || {}; + +this["wysihtml5"]["tpl"]["blockquote"] = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) { + this.compilerInfo = [4,'>= 1.0.0']; +helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; + var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression, self=this; + +function program1(depth0,data) { + + var buffer = "", stack1; + buffer += "btn-" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.size)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)); + return buffer; + } + +function program3(depth0,data) { + + + return " \n <span class=\"fa fa-quote-left\"></span>\n "; + } + +function program5(depth0,data) { + + + return "\n <span class=\"glyphicon glyphicon-quote\"></span>\n "; + } + + buffer += "<li>\n <a class=\"btn "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.size), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += " btn-default\" data-wysihtml5-command=\"formatBlock\" data-wysihtml5-command-value=\"blockquote\" data-wysihtml5-display-format-name=\"false\" tabindex=\"-1\">\n "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.fa), {hash:{},inverse:self.program(5, program5, data),fn:self.program(3, program3, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += "\n </a>\n</li>\n"; + return buffer; + }); + +this["wysihtml5"]["tpl"]["color"] = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) { + this.compilerInfo = [4,'>= 1.0.0']; +helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; + var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression, self=this; + +function program1(depth0,data) { + + var buffer = "", stack1; + buffer += "btn-" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.size)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)); + return buffer; + } + + buffer += "<li class=\"dropdown\">\n <a class=\"btn btn-default dropdown-toggle "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.size), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += "\" data-toggle=\"dropdown\" tabindex=\"-1\">\n <span class=\"current-color\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.colours)),stack1 == null || stack1 === false ? stack1 : stack1.black)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</span>\n <b class=\"caret\"></b>\n </a>\n <ul class=\"dropdown-menu\">\n <li><div class=\"wysihtml5-colors\" data-wysihtml5-command-value=\"black\"></div><a class=\"wysihtml5-colors-title\" data-wysihtml5-command=\"foreColor\" data-wysihtml5-command-value=\"black\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.colours)),stack1 == null || stack1 === false ? stack1 : stack1.black)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a></li>\n <li><div class=\"wysihtml5-colors\" data-wysihtml5-command-value=\"silver\"></div><a class=\"wysihtml5-colors-title\" data-wysihtml5-command=\"foreColor\" data-wysihtml5-command-value=\"silver\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.colours)),stack1 == null || stack1 === false ? stack1 : stack1.silver)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a></li>\n <li><div class=\"wysihtml5-colors\" data-wysihtml5-command-value=\"gray\"></div><a class=\"wysihtml5-colors-title\" data-wysihtml5-command=\"foreColor\" data-wysihtml5-command-value=\"gray\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.colours)),stack1 == null || stack1 === false ? stack1 : stack1.gray)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a></li>\n <li><div class=\"wysihtml5-colors\" data-wysihtml5-command-value=\"maroon\"></div><a class=\"wysihtml5-colors-title\" data-wysihtml5-command=\"foreColor\" data-wysihtml5-command-value=\"maroon\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.colours)),stack1 == null || stack1 === false ? stack1 : stack1.maroon)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a></li>\n <li><div class=\"wysihtml5-colors\" data-wysihtml5-command-value=\"red\"></div><a class=\"wysihtml5-colors-title\" data-wysihtml5-command=\"foreColor\" data-wysihtml5-command-value=\"red\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.colours)),stack1 == null || stack1 === false ? stack1 : stack1.red)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a></li>\n <li><div class=\"wysihtml5-colors\" data-wysihtml5-command-value=\"purple\"></div><a class=\"wysihtml5-colors-title\" data-wysihtml5-command=\"foreColor\" data-wysihtml5-command-value=\"purple\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.colours)),stack1 == null || stack1 === false ? stack1 : stack1.purple)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a></li>\n <li><div class=\"wysihtml5-colors\" data-wysihtml5-command-value=\"green\"></div><a class=\"wysihtml5-colors-title\" data-wysihtml5-command=\"foreColor\" data-wysihtml5-command-value=\"green\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.colours)),stack1 == null || stack1 === false ? stack1 : stack1.green)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a></li>\n <li><div class=\"wysihtml5-colors\" data-wysihtml5-command-value=\"olive\"></div><a class=\"wysihtml5-colors-title\" data-wysihtml5-command=\"foreColor\" data-wysihtml5-command-value=\"olive\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.colours)),stack1 == null || stack1 === false ? stack1 : stack1.olive)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a></li>\n <li><div class=\"wysihtml5-colors\" data-wysihtml5-command-value=\"navy\"></div><a class=\"wysihtml5-colors-title\" data-wysihtml5-command=\"foreColor\" data-wysihtml5-command-value=\"navy\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.colours)),stack1 == null || stack1 === false ? stack1 : stack1.navy)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a></li>\n <li><div class=\"wysihtml5-colors\" data-wysihtml5-command-value=\"blue\"></div><a class=\"wysihtml5-colors-title\" data-wysihtml5-command=\"foreColor\" data-wysihtml5-command-value=\"blue\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.colours)),stack1 == null || stack1 === false ? stack1 : stack1.blue)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a></li>\n <li><div class=\"wysihtml5-colors\" data-wysihtml5-command-value=\"orange\"></div><a class=\"wysihtml5-colors-title\" data-wysihtml5-command=\"foreColor\" data-wysihtml5-command-value=\"orange\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.colours)),stack1 == null || stack1 === false ? stack1 : stack1.orange)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a></li>\n </ul>\n</li>\n"; + return buffer; + }); + +this["wysihtml5"]["tpl"]["emphasis"] = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) { + this.compilerInfo = [4,'>= 1.0.0']; +helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; + var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression, self=this; + +function program1(depth0,data) { + + var buffer = "", stack1; + buffer += "btn-" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.size)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)); + return buffer; + } + +function program3(depth0,data) { + + var buffer = "", stack1; + buffer += "\n <a class=\"btn "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.size), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += " btn-default\" data-wysihtml5-command=\"small\" title=\"CTRL+S\" tabindex=\"-1\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.emphasis)),stack1 == null || stack1 === false ? stack1 : stack1.small)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a>\n "; + return buffer; + } + + buffer += "<li>\n <div class=\"btn-group\">\n <a class=\"btn "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.size), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += " btn-default\" data-wysihtml5-command=\"bold\" title=\"CTRL+B\" tabindex=\"-1\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.emphasis)),stack1 == null || stack1 === false ? stack1 : stack1.bold)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a>\n <a class=\"btn "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.size), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += " btn-default\" data-wysihtml5-command=\"italic\" title=\"CTRL+I\" tabindex=\"-1\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.emphasis)),stack1 == null || stack1 === false ? stack1 : stack1.italic)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a>\n <a class=\"btn "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.size), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += " btn-default\" data-wysihtml5-command=\"underline\" title=\"CTRL+U\" tabindex=\"-1\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.emphasis)),stack1 == null || stack1 === false ? stack1 : stack1.underline)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a>\n "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.emphasis)),stack1 == null || stack1 === false ? stack1 : stack1.small), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += "\n </div>\n</li>\n"; + return buffer; + }); + +this["wysihtml5"]["tpl"]["font-styles"] = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) { + this.compilerInfo = [4,'>= 1.0.0']; +helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; + var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression, self=this; + +function program1(depth0,data) { + + var buffer = "", stack1; + buffer += "btn-" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.size)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)); + return buffer; + } + +function program3(depth0,data) { + + + return "\n <span class=\"fa fa-font\"></span>\n "; + } + +function program5(depth0,data) { + + + return "\n <span class=\"glyphicon glyphicon-font\"></span>\n "; + } + + buffer += "<li class=\"dropdown\">\n <a class=\"btn btn-default dropdown-toggle "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.size), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += "\" data-toggle=\"dropdown\">\n "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.fa), {hash:{},inverse:self.program(5, program5, data),fn:self.program(3, program3, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += "\n <span class=\"current-font\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.font_styles)),stack1 == null || stack1 === false ? stack1 : stack1.normal)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</span>\n <b class=\"caret\"></b>\n </a>\n <ul class=\"dropdown-menu\">\n <li><a data-wysihtml5-command=\"formatBlock\" data-wysihtml5-command-value=\"p\" tabindex=\"-1\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.font_styles)),stack1 == null || stack1 === false ? stack1 : stack1.normal)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a></li>\n <li><a data-wysihtml5-command=\"formatBlock\" data-wysihtml5-command-value=\"h1\" tabindex=\"-1\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.font_styles)),stack1 == null || stack1 === false ? stack1 : stack1.h1)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a></li>\n <li><a data-wysihtml5-command=\"formatBlock\" data-wysihtml5-command-value=\"h2\" tabindex=\"-1\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.font_styles)),stack1 == null || stack1 === false ? stack1 : stack1.h2)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a></li>\n <li><a data-wysihtml5-command=\"formatBlock\" data-wysihtml5-command-value=\"h3\" tabindex=\"-1\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.font_styles)),stack1 == null || stack1 === false ? stack1 : stack1.h3)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a></li>\n <li><a data-wysihtml5-command=\"formatBlock\" data-wysihtml5-command-value=\"h4\" tabindex=\"-1\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.font_styles)),stack1 == null || stack1 === false ? stack1 : stack1.h4)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a></li>\n <li><a data-wysihtml5-command=\"formatBlock\" data-wysihtml5-command-value=\"h5\" tabindex=\"-1\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.font_styles)),stack1 == null || stack1 === false ? stack1 : stack1.h5)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a></li>\n <li><a data-wysihtml5-command=\"formatBlock\" data-wysihtml5-command-value=\"h6\" tabindex=\"-1\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.font_styles)),stack1 == null || stack1 === false ? stack1 : stack1.h6)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a></li>\n </ul>\n</li>\n"; + return buffer; + }); + +this["wysihtml5"]["tpl"]["html"] = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) { + this.compilerInfo = [4,'>= 1.0.0']; +helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; + var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression, self=this; + +function program1(depth0,data) { + + var buffer = "", stack1; + buffer += "btn-" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.size)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)); + return buffer; + } + +function program3(depth0,data) { + + + return "\n <span class=\"fa fa-pencil\"></span>\n "; + } + +function program5(depth0,data) { + + + return "\n <span class=\"glyphicon glyphicon-pencil\"></span>\n "; + } + + buffer += "<li>\n <div class=\"btn-group\">\n <a class=\"btn "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.size), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += " btn-default\" data-wysihtml5-action=\"change_view\" title=\"" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.html)),stack1 == null || stack1 === false ? stack1 : stack1.edit)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "\" tabindex=\"-1\">\n "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.fa), {hash:{},inverse:self.program(5, program5, data),fn:self.program(3, program3, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += "\n </a>\n </div>\n</li>\n"; + return buffer; + }); + +this["wysihtml5"]["tpl"]["image"] = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) { + this.compilerInfo = [4,'>= 1.0.0']; +helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; + var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression, self=this; + +function program1(depth0,data) { + + + return "modal-sm"; + } + +function program3(depth0,data) { + + var buffer = "", stack1; + buffer += "btn-" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.size)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)); + return buffer; + } + +function program5(depth0,data) { + + + return "\n <span class=\"fa fa-file-image-o\"></span>\n "; + } + +function program7(depth0,data) { + + + return "\n <span class=\"glyphicon glyphicon-picture\"></span>\n "; + } + + buffer += "<li>\n <div class=\"bootstrap-wysihtml5-insert-image-modal modal fade\" data-wysihtml5-dialog=\"insertImage\">\n <div class=\"modal-dialog "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.smallmodals), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += "\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <a class=\"close\" data-dismiss=\"modal\">&times;</a>\n <h3>" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.image)),stack1 == null || stack1 === false ? stack1 : stack1.insert)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</h3>\n </div>\n <div class=\"modal-body\">\n <div class=\"form-group\">\n <input value=\"http://\" class=\"bootstrap-wysihtml5-insert-image-url form-control\" data-wysihtml5-dialog-field=\"src\">\n </div> \n </div>\n <div class=\"modal-footer\">\n <a class=\"btn btn-default\" data-dismiss=\"modal\" data-wysihtml5-dialog-action=\"cancel\" href=\"#\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.image)),stack1 == null || stack1 === false ? stack1 : stack1.cancel)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a>\n <a class=\"btn btn-primary\" data-dismiss=\"modal\" data-wysihtml5-dialog-action=\"save\" href=\"#\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.image)),stack1 == null || stack1 === false ? stack1 : stack1.insert)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a>\n </div>\n </div>\n </div>\n </div>\n <a class=\"btn "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.size), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += " btn-default\" data-wysihtml5-command=\"insertImage\" title=\"" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.image)),stack1 == null || stack1 === false ? stack1 : stack1.insert)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "\" tabindex=\"-1\">\n "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.fa), {hash:{},inverse:self.program(7, program7, data),fn:self.program(5, program5, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += "\n </a>\n</li>\n"; + return buffer; + }); + +this["wysihtml5"]["tpl"]["link"] = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) { + this.compilerInfo = [4,'>= 1.0.0']; +helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; + var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression, self=this; + +function program1(depth0,data) { + + + return "modal-sm"; + } + +function program3(depth0,data) { + + var buffer = "", stack1; + buffer += "btn-" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.size)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)); + return buffer; + } + +function program5(depth0,data) { + + + return "\n <span class=\"fa fa-share-square-o\"></span>\n "; + } + +function program7(depth0,data) { + + + return "\n <span class=\"glyphicon glyphicon-share\"></span>\n "; + } + + buffer += "<li>\n <div class=\"bootstrap-wysihtml5-insert-link-modal modal fade\" data-wysihtml5-dialog=\"createLink\">\n <div class=\"modal-dialog "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.smallmodals), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += "\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <a class=\"close\" data-dismiss=\"modal\">&times;</a>\n <h3>" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.link)),stack1 == null || stack1 === false ? stack1 : stack1.insert)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</h3>\n </div>\n <div class=\"modal-body\">\n <div class=\"form-group\">\n <input value=\"http://\" class=\"bootstrap-wysihtml5-insert-link-url form-control\" data-wysihtml5-dialog-field=\"href\">\n </div> \n <div class=\"checkbox\">\n <label> \n <input type=\"checkbox\" class=\"bootstrap-wysihtml5-insert-link-target\" checked>" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.link)),stack1 == null || stack1 === false ? stack1 : stack1.target)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "\n </label>\n </div>\n </div>\n <div class=\"modal-footer\">\n <a class=\"btn btn-default\" data-dismiss=\"modal\" data-wysihtml5-dialog-action=\"cancel\" href=\"#\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.link)),stack1 == null || stack1 === false ? stack1 : stack1.cancel)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a>\n <a href=\"#\" class=\"btn btn-primary\" data-dismiss=\"modal\" data-wysihtml5-dialog-action=\"save\">" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.link)),stack1 == null || stack1 === false ? stack1 : stack1.insert)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "</a>\n </div>\n </div>\n </div>\n </div>\n <a class=\"btn "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.size), {hash:{},inverse:self.noop,fn:self.program(3, program3, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += " btn-default\" data-wysihtml5-command=\"createLink\" title=\"" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.link)),stack1 == null || stack1 === false ? stack1 : stack1.insert)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "\" tabindex=\"-1\">\n "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.fa), {hash:{},inverse:self.program(7, program7, data),fn:self.program(5, program5, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += "\n </a>\n</li>\n"; + return buffer; + }); + +this["wysihtml5"]["tpl"]["lists"] = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) { + this.compilerInfo = [4,'>= 1.0.0']; +helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; + var buffer = "", stack1, functionType="function", escapeExpression=this.escapeExpression, self=this; + +function program1(depth0,data) { + + var buffer = "", stack1; + buffer += "btn-" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.size)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)); + return buffer; + } + +function program3(depth0,data) { + + + return "\n <span class=\"fa fa-list-ul\"></span>\n "; + } + +function program5(depth0,data) { + + + return "\n <span class=\"glyphicon glyphicon-list\"></span>\n "; + } + +function program7(depth0,data) { + + + return "\n <span class=\"fa fa-list-ol\"></span>\n "; + } + +function program9(depth0,data) { + + + return "\n <span class=\"glyphicon glyphicon-th-list\"></span>\n "; + } + +function program11(depth0,data) { + + + return "\n <span class=\"fa fa-outdent\"></span>\n "; + } + +function program13(depth0,data) { + + + return "\n <span class=\"glyphicon glyphicon-indent-right\"></span>\n "; + } + +function program15(depth0,data) { + + + return "\n <span class=\"fa fa-indent\"></span>\n "; + } + +function program17(depth0,data) { + + + return "\n <span class=\"glyphicon glyphicon-indent-left\"></span>\n "; + } + + buffer += "<li>\n <div class=\"btn-group\">\n <a class=\"btn "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.size), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += " btn-default\" data-wysihtml5-command=\"insertUnorderedList\" title=\"" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.lists)),stack1 == null || stack1 === false ? stack1 : stack1.unordered)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "\" tabindex=\"-1\">\n "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.fa), {hash:{},inverse:self.program(5, program5, data),fn:self.program(3, program3, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += "\n </a>\n <a class=\"btn "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.size), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += " btn-default\" data-wysihtml5-command=\"insertOrderedList\" title=\"" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.lists)),stack1 == null || stack1 === false ? stack1 : stack1.ordered)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "\" tabindex=\"-1\">\n "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.fa), {hash:{},inverse:self.program(9, program9, data),fn:self.program(7, program7, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += "\n </a>\n <a class=\"btn "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.size), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += " btn-default\" data-wysihtml5-command=\"Outdent\" title=\"" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.lists)),stack1 == null || stack1 === false ? stack1 : stack1.outdent)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "\" tabindex=\"-1\">\n "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.fa), {hash:{},inverse:self.program(13, program13, data),fn:self.program(11, program11, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += "\n </a>\n <a class=\"btn "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.size), {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += " btn-default\" data-wysihtml5-command=\"Indent\" title=\"" + + escapeExpression(((stack1 = ((stack1 = ((stack1 = (depth0 && depth0.locale)),stack1 == null || stack1 === false ? stack1 : stack1.lists)),stack1 == null || stack1 === false ? stack1 : stack1.indent)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "\" tabindex=\"-1\">\n "; + stack1 = helpers['if'].call(depth0, ((stack1 = ((stack1 = (depth0 && depth0.options)),stack1 == null || stack1 === false ? stack1 : stack1.toolbar)),stack1 == null || stack1 === false ? stack1 : stack1.fa), {hash:{},inverse:self.program(17, program17, data),fn:self.program(15, program15, data),data:data}); + if(stack1 || stack1 === 0) { buffer += stack1; } + buffer += "\n </a>\n </div>\n</li>\n"; + return buffer; + });(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define('bootstrap.wysihtml5', ['jquery', 'wysihtml5', 'bootstrap', 'bootstrap.wysihtml5.templates', 'bootstrap.wysihtml5.commands'], factory); + } else { + // Browser globals + factory(jQuery, wysihtml5); // jshint ignore:line + } +}(function ($, wysihtml5) { + 'use strict'; + var bsWysihtml5 = function($, wysihtml5) { + + var templates = function(key, locale, options) { + if(wysihtml5.tpl[key]) { + return wysihtml5.tpl[key]({locale: locale, options: options}); + } + }; + + var Wysihtml5 = function(el, options) { + this.el = el; + var toolbarOpts = $.extend(true, {}, defaultOptions, options); + for(var t in toolbarOpts.customTemplates) { + if (toolbarOpts.customTemplates.hasOwnProperty(t)) { + wysihtml5.tpl[t] = toolbarOpts.customTemplates[t]; + } + } + this.toolbar = this.createToolbar(el, toolbarOpts); + this.editor = this.createEditor(toolbarOpts); + }; + + Wysihtml5.prototype = { + + constructor: Wysihtml5, + + createEditor: function(options) { + options = options || {}; + + // Add the toolbar to a clone of the options object so multiple instances + // of the WYISYWG don't break because 'toolbar' is already defined + options = $.extend(true, {}, options); + options.toolbar = this.toolbar[0]; + + this.initializeEditor(this.el[0], options); + }, + + + initializeEditor: function(el, options) { + var editor = new wysihtml5.Editor(this.el[0], options); + + editor.on('beforeload', this.syncBootstrapDialogEvents); + editor.on('beforeload', this.loadParserRules); + + // #30 - body is in IE 10 not created by default, which leads to nullpointer + // 2014/02/13 - adapted to wysihtml5-0.4, does not work in IE + if(editor.composer.editableArea.contentDocument) { + this.addMoreShortcuts(editor, + editor.composer.editableArea.contentDocument.body || editor.composer.editableArea.contentDocument, + options.shortcuts); + } else { + this.addMoreShortcuts(editor, editor.composer.editableArea, options.shortcuts); + } + + if(options && options.events) { + for(var eventName in options.events) { + if (options.events.hasOwnProperty(eventName)) { + editor.on(eventName, options.events[eventName]); + } + } + } + + return editor; + }, + + loadParserRules: function() { + if($.type(this.config.parserRules) === 'string') { + $.ajax({ + dataType: 'json', + url: this.config.parserRules, + context: this, + error: function (jqXHR, textStatus, errorThrown) { + console.log(errorThrown); + }, + success: function (parserRules) { + this.config.parserRules = parserRules; + console.log('parserrules loaded'); + } + }); + } + + if(this.config.pasteParserRulesets && $.type(this.config.pasteParserRulesets) === 'string') { + $.ajax({ + dataType: 'json', + url: this.config.pasteParserRulesets, + context: this, + error: function (jqXHR, textStatus, errorThrown) { + console.log(errorThrown); + }, + success: function (pasteParserRulesets) { + this.config.pasteParserRulesets = pasteParserRulesets; + } + }); + } + }, + + //sync wysihtml5 events for dialogs with bootstrap events + syncBootstrapDialogEvents: function() { + var editor = this; + $.map(this.toolbar.commandMapping, function(value) { + return [value]; + }).filter(function(commandObj) { + return commandObj.dialog; + }).map(function(commandObj) { + return commandObj.dialog; + }).forEach(function(dialog) { + dialog.on('show', function() { + $(this.container).modal('show'); + }); + dialog.on('hide', function() { + $(this.container).modal('hide'); + setTimeout(editor.composer.focus, 0); + }); + $(dialog.container).on('shown.bs.modal', function () { + $(this).find('input, select, textarea').first().focus(); + }); + }); + this.on('change_view', function() { + $(this.toolbar.container.children).find('a.btn').not('[data-wysihtml5-action="change_view"]').toggleClass('disabled'); + }); + }, + + createToolbar: function(el, options) { + var self = this; + var toolbar = $('<ul/>', { + 'class' : 'wysihtml5-toolbar', + 'style': 'display:none' + }); + var culture = options.locale || defaultOptions.locale || 'en'; + if(!locale.hasOwnProperty(culture)) { + console.debug('Locale \'' + culture + '\' not found. Available locales are: ' + Object.keys(locale) + '. Falling back to \'en\'.'); + culture = 'en'; + } + var localeObject = $.extend(true, {}, locale.en, locale[culture]); + for(var key in options.toolbar) { + if(options.toolbar[key]) { + toolbar.append(templates(key, localeObject, options)); + } + } + + toolbar.find('a[data-wysihtml5-command="formatBlock"]').click(function(e) { + var target = e.delegateTarget || e.target || e.srcElement, + el = $(target), + showformat = el.data('wysihtml5-display-format-name'), + formatname = el.data('wysihtml5-format-name') || el.html(); + if(showformat === undefined || showformat === 'true') { + self.toolbar.find('.current-font').text(formatname); + } + }); + + toolbar.find('a[data-wysihtml5-command="foreColor"]').click(function(e) { + var target = e.target || e.srcElement; + var el = $(target); + self.toolbar.find('.current-color').text(el.html()); + }); + + this.el.before(toolbar); + + return toolbar; + }, + + addMoreShortcuts: function(editor, el, shortcuts) { + /* some additional shortcuts */ + wysihtml5.dom.observe(el, 'keydown', function(event) { + var keyCode = event.keyCode, + command = shortcuts[keyCode]; + if ((event.ctrlKey || event.metaKey || event.altKey) && command && wysihtml5.commands[command]) { + var commandObj = editor.toolbar.commandMapping[command + ':null']; + if (commandObj && commandObj.dialog && !commandObj.state) { + commandObj.dialog.show(); + } else { + wysihtml5.commands[command].exec(editor.composer, command); + } + event.preventDefault(); + } + }); + } + }; + + // these define our public api + var methods = { + resetDefaults: function() { + $.fn.wysihtml5.defaultOptions = $.extend(true, {}, $.fn.wysihtml5.defaultOptionsCache); + }, + bypassDefaults: function(options) { + return this.each(function () { + var $this = $(this); + $this.data('wysihtml5', new Wysihtml5($this, options)); + }); + }, + shallowExtend: function (options) { + var settings = $.extend({}, $.fn.wysihtml5.defaultOptions, options || {}, $(this).data()); + var that = this; + return methods.bypassDefaults.apply(that, [settings]); + }, + deepExtend: function(options) { + var settings = $.extend(true, {}, $.fn.wysihtml5.defaultOptions, options || {}); + var that = this; + return methods.bypassDefaults.apply(that, [settings]); + }, + init: function(options) { + var that = this; + return methods.shallowExtend.apply(that, [options]); + } + }; + + $.fn.wysihtml5 = function ( method ) { + if ( methods[method] ) { + return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 )); + } else if ( typeof method === 'object' || ! method ) { + return methods.init.apply( this, arguments ); + } else { + $.error( 'Method ' + method + ' does not exist on jQuery.wysihtml5' ); + } + }; + + $.fn.wysihtml5.Constructor = Wysihtml5; + + var defaultOptions = $.fn.wysihtml5.defaultOptions = { + toolbar: { + 'font-styles': true, + 'color': false, + 'emphasis': { + 'small': true + }, + 'blockquote': true, + 'lists': true, + 'html': false, + 'link': true, + 'image': true, + 'smallmodals': false + }, + useLineBreaks: false, + parserRules: { + classes: { + 'wysiwyg-color-silver' : 1, + 'wysiwyg-color-gray' : 1, + 'wysiwyg-color-white' : 1, + 'wysiwyg-color-maroon' : 1, + 'wysiwyg-color-red' : 1, + 'wysiwyg-color-purple' : 1, + 'wysiwyg-color-fuchsia' : 1, + 'wysiwyg-color-green' : 1, + 'wysiwyg-color-lime' : 1, + 'wysiwyg-color-olive' : 1, + 'wysiwyg-color-yellow' : 1, + 'wysiwyg-color-navy' : 1, + 'wysiwyg-color-blue' : 1, + 'wysiwyg-color-teal' : 1, + 'wysiwyg-color-aqua' : 1, + 'wysiwyg-color-orange' : 1 + }, + tags: { + 'b': {}, + 'i': {}, + 'strong': {}, + 'em': {}, + 'p': {}, + 'br': {}, + 'ol': {}, + 'ul': {}, + 'li': {}, + 'h1': {}, + 'h2': {}, + 'h3': {}, + 'h4': {}, + 'h5': {}, + 'h6': {}, + 'blockquote': {}, + 'u': 1, + 'img': { + 'check_attributes': { + 'width': 'numbers', + 'alt': 'alt', + 'src': 'url', + 'height': 'numbers' + } + }, + 'a': { + 'check_attributes': { + 'href': 'url' + }, + 'set_attributes': { + 'target': '_blank', + 'rel': 'nofollow' + } + }, + 'span': 1, + 'div': 1, + 'small': 1, + 'code': 1, + 'pre': 1 + } + }, + locale: 'en', + shortcuts: { + '83': 'small',// S + '75': 'createLink'// K + } + }; + + if (typeof $.fn.wysihtml5.defaultOptionsCache === 'undefined') { + $.fn.wysihtml5.defaultOptionsCache = $.extend(true, {}, $.fn.wysihtml5.defaultOptions); + } + + var locale = $.fn.wysihtml5.locale = {}; + }; + bsWysihtml5($, wysihtml5); +})); +(function(wysihtml5) { + wysihtml5.commands.small = { + exec: function(composer, command) { + return wysihtml5.commands.formatInline.exec(composer, command, "small"); + }, + + state: function(composer, command) { + return wysihtml5.commands.formatInline.state(composer, command, "small"); + } + }; +})(wysihtml5); + +/** + * English translation for bootstrap-wysihtml5 + */ +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define('bootstrap.wysihtml5.en-US', ['jquery', 'bootstrap.wysihtml5'], factory); + } else { + // Browser globals + factory(jQuery); + } +}(function ($) { + $.fn.wysihtml5.locale.en = $.fn.wysihtml5.locale['en-US'] = { + font_styles: { + normal: 'Normal text', + h1: 'Heading 1', + h2: 'Heading 2', + h3: 'Heading 3', + h4: 'Heading 4', + h5: 'Heading 5', + h6: 'Heading 6' + }, + emphasis: { + bold: 'Bold', + italic: 'Italic', + underline: 'Underline', + small: 'Small' + }, + lists: { + unordered: 'Unordered list', + ordered: 'Ordered list', + outdent: 'Outdent', + indent: 'Indent' + }, + link: { + insert: 'Insert link', + cancel: 'Cancel', + target: 'Open link in new window' + }, + image: { + insert: 'Insert image', + cancel: 'Cancel' + }, + html: { + edit: 'Edit HTML' + }, + colours: { + black: 'Black', + silver: 'Silver', + gray: 'Grey', + maroon: 'Maroon', + red: 'Red', + purple: 'Purple', + green: 'Green', + olive: 'Olive', + navy: 'Navy', + blue: 'Blue', + orange: 'Orange' + } + }; +})); diff --git a/theme/bootstrap/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js b/theme/bootstrap/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js new file mode 100644 index 0000000..58765c0 --- /dev/null +++ b/theme/bootstrap/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js @@ -0,0 +1,8 @@ +/*! bootstrap3-wysihtml5-bower 2014-09-26 */ +var wysihtml5,Base,Handlebars;Object.defineProperty&&Object.getOwnPropertyDescriptor&&Object.getOwnPropertyDescriptor(Element.prototype,"textContent")&&!Object.getOwnPropertyDescriptor(Element.prototype,"textContent").get&&!function(){var a=Object.getOwnPropertyDescriptor(Element.prototype,"innerText");Object.defineProperty(Element.prototype,"textContent",{get:function(){return a.get.call(this)},set:function(b){return a.set.call(this,b)}})}(),Array.isArray||(Array.isArray=function(a){return"[object Array]"===Object.prototype.toString.call(a)}),wysihtml5={version:"0.4.15",commands:{},dom:{},quirks:{},toolbar:{},lang:{},selection:{},views:{},INVISIBLE_SPACE:"",EMPTY_FUNCTION:function(){},ELEMENT_NODE:1,TEXT_NODE:3,BACKSPACE_KEY:8,ENTER_KEY:13,ESCAPE_KEY:27,SPACE_KEY:32,DELETE_KEY:46},function(a,b){"function"==typeof define&&define.amd?define(a):b.rangy=a()}(function(){function a(a,b){var c=typeof a[b];return c==x||!(c!=w||!a[b])||"unknown"==c}function b(a,b){return!(typeof a[b]!=w||!a[b])}function c(a,b){return typeof a[b]!=y}function d(a){return function(b,c){for(var d=c.length;d--;)if(!a(b,c[d]))return!1;return!0}}function e(a){return a&&D(a,C)&&F(a,B)}function f(a){return b(a,"body")?a.body:a.getElementsByTagName("body")[0]}function g(c){b(window,"console")&&a(window.console,"log")&&window.console.log(c)}function h(a,b){b?window.alert(a):g(a)}function i(a){H.initialized=!0,H.supported=!1,h("Rangy is not supported on this page in your browser. Reason: "+a,H.config.alertOnFail)}function j(a){h("Rangy warning: "+a,H.config.alertOnWarn)}function k(a){return a.message||a.description||a+""}function l(){var b,c,d,h,j,l,m,o,p;if(!H.initialized){if(c=!1,d=!1,a(document,"createRange")&&(b=document.createRange(),D(b,A)&&F(b,z)&&(c=!0)),h=f(document),!h||"body"!=h.nodeName.toLowerCase())return i("No body element found"),void 0;if(h&&a(h,"createTextRange")&&(b=h.createTextRange(),e(b)&&(d=!0)),!c&&!d)return i("Neither Range nor TextRange are available"),void 0;H.initialized=!0,H.features={implementsDomRange:c,implementsTextRange:d};for(m in G)(j=G[m])instanceof n&&j.init(j,H);for(o=0,p=s.length;p>o;++o)try{s[o](H)}catch(q){l="Rangy init listener threw an exception. Continuing. Detail: "+k(q),g(l)}}}function m(a){a=a||window,l();for(var b=0,c=t.length;c>b;++b)t[b](a)}function n(a,b,c){this.name=a,this.dependencies=b,this.initialized=!1,this.supported=!1,this.initializer=c}function o(a,b,c,d){var e=new n(b,c,function(a){if(!a.initialized){a.initialized=!0;try{d(H,a),a.supported=!0}catch(c){var e="Module '"+b+"' failed to load: "+k(c);g(e)}}});G[b]=e}function p(){}function q(){}var r,s,t,u,v,w="object",x="function",y="undefined",z=["startContainer","startOffset","endContainer","endOffset","collapsed","commonAncestorContainer"],A=["setStart","setStartBefore","setStartAfter","setEnd","setEndBefore","setEndAfter","collapse","selectNode","selectNodeContents","compareBoundaryPoints","deleteContents","extractContents","cloneContents","insertNode","surroundContents","cloneRange","toString","detach"],B=["boundingHeight","boundingLeft","boundingTop","boundingWidth","htmlText","text"],C=["collapse","compareEndPoints","duplicate","moveToElementText","parentElement","select","setEndPoint","getBoundingClientRect"],D=d(a),E=d(b),F=d(c),G={},H={version:"1.3alpha.20140804",initialized:!1,supported:!0,util:{isHostMethod:a,isHostObject:b,isHostProperty:c,areHostMethods:D,areHostObjects:E,areHostProperties:F,isTextRange:e,getBody:f},features:{},modules:G,config:{alertOnFail:!0,alertOnWarn:!1,preferTextRange:!1,autoInitialize:typeof rangyAutoInitialize==y?!0:rangyAutoInitialize}};return H.fail=i,H.warn=j,{}.hasOwnProperty?H.util.extend=function(a,b,c){var d,e,f;for(f in b)b.hasOwnProperty(f)&&(d=a[f],e=b[f],c&&null!==d&&"object"==typeof d&&null!==e&&"object"==typeof e&&H.util.extend(d,e,!0),a[f]=e);return b.hasOwnProperty("toString")&&(a.toString=b.toString),a}:i("hasOwnProperty not supported"),function(){var a,b,c=document.createElement("div");c.appendChild(document.createElement("span")),a=[].slice;try{1==a.call(c.childNodes,0)[0].nodeType&&(b=function(b){return a.call(b,0)})}catch(d){}b||(b=function(a){var b,c,d=[];for(b=0,c=a.length;c>b;++b)d[b]=a[b];return d}),H.util.toArray=b}(),a(document,"addEventListener")?r=function(a,b,c){a.addEventListener(b,c,!1)}:a(document,"attachEvent")?r=function(a,b,c){a.attachEvent("on"+b,c)}:i("Document does not have required addEventListener or attachEvent method"),H.util.addListener=r,s=[],H.init=l,H.addInitListener=function(a){H.initialized?a(H):s.push(a)},t=[],H.addShimListener=function(a){t.push(a)},H.shim=H.createMissingNativeApi=m,n.prototype={init:function(){var a,b,c,d,e=this.dependencies||[];for(a=0,b=e.length;b>a;++a){if(d=e[a],c=G[d],!(c&&c instanceof n))throw Error("required module '"+d+"' not found");if(c.init(),!c.supported)throw Error("required module '"+d+"' not supported")}this.initializer(this)},fail:function(a){throw this.initialized=!0,this.supported=!1,Error("Module '"+this.name+"' failed to load: "+a)},warn:function(a){H.warn("Module "+this.name+": "+a)},deprecationNotice:function(a,b){H.warn("DEPRECATED: "+a+" in module "+this.name+"is deprecated. Please use "+b+" instead")},createError:function(a){return Error("Error in Rangy "+this.name+" module: "+a)}},H.createModule=function(a){var b,c,d;2==arguments.length?(b=arguments[1],c=[]):(b=arguments[2],c=arguments[1]),d=o(!1,a,c,b),H.initialized&&d.init()},H.createCoreModule=function(a,b,c){o(!0,a,b,c)},H.RangePrototype=p,H.rangePrototype=new p,H.selectionPrototype=new q,u=!1,v=function(){u||(u=!0,!H.initialized&&H.config.autoInitialize&&l())},typeof window==y?(i("No window found"),void 0):typeof document==y?(i("No document found"),void 0):(a(document,"addEventListener")&&document.addEventListener("DOMContentLoaded",v,!1),r(window,"load",v),H.createCoreModule("DomUtil",[],function(a,b){function c(a){var b;return typeof a.namespaceURI==I||null===(b=a.namespaceURI)||"http://www.w3.org/1999/xhtml"==b}function d(a){var b=a.parentNode;return 1==b.nodeType?b:null}function e(a){for(var b=0;a=a.previousSibling;)++b;return b}function f(a){switch(a.nodeType){case 7:case 10:return 0;case 3:case 8:return a.length;default:return a.childNodes.length}}function g(a,b){var c,d=[];for(c=a;c;c=c.parentNode)d.push(c);for(c=b;c;c=c.parentNode)if(F(d,c))return c;return null}function h(a,b,c){for(var d=c?b:b.parentNode;d;){if(d===a)return!0;d=d.parentNode}return!1}function i(a,b){return h(a,b,!0)}function j(a,b,c){for(var d,e=c?a:a.parentNode;e;){if(d=e.parentNode,d===b)return e;e=d}return null}function k(a){var b=a.nodeType;return 3==b||4==b||8==b}function l(a){if(!a)return!1;var b=a.nodeType;return 3==b||8==b}function m(a,b){var c=b.nextSibling,d=b.parentNode;return c?d.insertBefore(a,c):d.appendChild(a),a}function n(a,b,c){var d,f,g=a.cloneNode(!1);if(g.deleteData(0,b),a.deleteData(b,a.length-b),m(g,a),c)for(d=0;f=c[d++];)f.node==a&&f.offset>b?(f.node=g,f.offset-=b):f.node==a.parentNode&&f.offset>e(a)&&++f.offset;return g}function o(a){if(9==a.nodeType)return a;if(typeof a.ownerDocument!=I)return a.ownerDocument;if(typeof a.document!=I)return a.document;if(a.parentNode)return o(a.parentNode);throw b.createError("getDocument: no document found for node")}function p(a){var c=o(a);if(typeof c.defaultView!=I)return c.defaultView;if(typeof c.parentWindow!=I)return c.parentWindow;throw b.createError("Cannot get a window object for node")}function q(a){if(typeof a.contentDocument!=I)return a.contentDocument;if(typeof a.contentWindow!=I)return a.contentWindow.document;throw b.createError("getIframeDocument: No Document object found for iframe element")}function r(a){if(typeof a.contentWindow!=I)return a.contentWindow;if(typeof a.contentDocument!=I)return a.contentDocument.defaultView;throw b.createError("getIframeWindow: No Window object found for iframe element")}function s(a){return a&&J.isHostMethod(a,"setTimeout")&&J.isHostObject(a,"document")}function t(a,b,c){var d;if(a?J.isHostProperty(a,"nodeType")?d=1==a.nodeType&&"iframe"==a.tagName.toLowerCase()?q(a):o(a):s(a)&&(d=a.document):d=document,!d)throw b.createError(c+"(): Parameter must be a Window object or DOM node");return d}function u(a){for(var b;b=a.parentNode;)a=b;return a}function v(a,c,d,f){var h,i,k,l,m;if(a==d)return c===f?0:f>c?-1:1;if(h=j(d,a,!0))return c<=e(h)?-1:1;if(h=j(a,d,!0))return e(h)<f?-1:1;if(i=g(a,d),!i)throw Error("comparePoints error: nodes have no common ancestor");if(k=a===i?i:j(a,i,!0),l=d===i?i:j(d,i,!0),k===l)throw b.createError("comparePoints got to case 4 and childA and childB are the same!");for(m=i.firstChild;m;){if(m===k)return-1;if(m===l)return 1;m=m.nextSibling}}function w(a){var b;try{return b=a.parentNode,!1}catch(c){return!0}}function x(a){if(!a)return"[No node]";if(G&&w(a))return"[Broken node]";if(k(a))return'"'+a.data+'"';if(1==a.nodeType){var b=a.id?' id="'+a.id+'"':"";return"<"+a.nodeName+b+">[index:"+e(a)+",length:"+a.childNodes.length+"]["+(a.innerHTML||"[innerHTML not supported]").slice(0,25)+"]"}return a.nodeName}function y(a){for(var b,c=o(a).createDocumentFragment();b=a.firstChild;)c.appendChild(b);return c}function z(a){this.root=a,this._next=a}function A(a){return new z(a)}function B(a,b){this.node=a,this.offset=b}function C(a){this.code=this[a],this.codeName=a,this.message="DOMException: "+this.codeName}var D,E,F,G,H,I="undefined",J=a.util;J.areHostMethods(document,["createDocumentFragment","createElement","createTextNode"])||b.fail("document missing a Node creation method"),J.isHostMethod(document,"getElementsByTagName")||b.fail("document missing getElementsByTagName method"),D=document.createElement("div"),J.areHostMethods(D,["insertBefore","appendChild","cloneNode"]||!J.areHostObjects(D,["previousSibling","nextSibling","childNodes","parentNode"]))||b.fail("Incomplete Element implementation"),J.isHostProperty(D,"innerHTML")||b.fail("Element is missing innerHTML property"),E=document.createTextNode("test"),J.areHostMethods(E,["splitText","deleteData","insertData","appendData","cloneNode"]||!J.areHostObjects(D,["previousSibling","nextSibling","childNodes","parentNode"])||!J.areHostProperties(E,["data"]))||b.fail("Incomplete Text Node implementation"),F=function(a,b){for(var c=a.length;c--;)if(a[c]===b)return!0;return!1},G=!1,function(){var b,c=document.createElement("b");c.innerHTML="1",b=c.firstChild,c.innerHTML="<br>",G=w(b),a.features.crashyTextNodes=G}(),typeof window.getComputedStyle!=I?H=function(a,b){return p(a).getComputedStyle(a,null)[b]}:typeof document.documentElement.currentStyle!=I?H=function(a,b){return a.currentStyle[b]}:b.fail("No means of obtaining computed style properties found"),z.prototype={_current:null,hasNext:function(){return!!this._next},next:function(){var a,b,c=this._current=this._next;if(this._current)if(a=c.firstChild,a)this._next=a;else{for(b=null;c!==this.root&&!(b=c.nextSibling);)c=c.parentNode;this._next=b}return this._current},detach:function(){this._current=this._next=this.root=null}},B.prototype={equals:function(a){return!!a&&this.node===a.node&&this.offset==a.offset},inspect:function(){return"[DomPosition("+x(this.node)+":"+this.offset+")]"},toString:function(){return this.inspect()}},C.prototype={INDEX_SIZE_ERR:1,HIERARCHY_REQUEST_ERR:3,WRONG_DOCUMENT_ERR:4,NO_MODIFICATION_ALLOWED_ERR:7,NOT_FOUND_ERR:8,NOT_SUPPORTED_ERR:9,INVALID_STATE_ERR:11,INVALID_NODE_TYPE_ERR:24},C.prototype.toString=function(){return this.message},a.dom={arrayContains:F,isHtmlNamespace:c,parentElement:d,getNodeIndex:e,getNodeLength:f,getCommonAncestor:g,isAncestorOf:h,isOrIsAncestorOf:i,getClosestAncestorIn:j,isCharacterDataNode:k,isTextOrCommentNode:l,insertAfter:m,splitDataNode:n,getDocument:o,getWindow:p,getIframeWindow:r,getIframeDocument:q,getBody:J.getBody,isWindow:s,getContentDocument:t,getRootContainer:u,comparePoints:v,isBrokenNode:w,inspectNode:x,getComputedStyleProperty:H,fragmentFromNodeChildren:y,createIterator:A,DomPosition:B},a.DOMException=C}),H.createCoreModule("DomRange",["DomUtil"],function(a){function b(a,b){return 3!=a.nodeType&&(gb(a,b.startContainer)||gb(a,b.endContainer))}function c(a){return a.document||hb(a.startContainer)}function d(a){return new cb(a.parentNode,fb(a))}function e(a){return new cb(a.parentNode,fb(a)+1)}function f(a,b,c){var d=11==a.nodeType?a.firstChild:a;return eb(b)?c==b.length?ab.insertAfter(a,b):b.parentNode.insertBefore(a,0==c?b:jb(b,c)):c>=b.childNodes.length?b.appendChild(a):b.insertBefore(a,b.childNodes[c]),d}function g(a,b,d){if(y(a),y(b),c(b)!=c(a))throw new db("WRONG_DOCUMENT_ERR");var e=ib(a.startContainer,a.startOffset,b.endContainer,b.endOffset),f=ib(a.endContainer,a.endOffset,b.startContainer,b.startOffset);return d?0>=e&&f>=0:0>e&&f>0}function h(a){var b,d,e,f;for(e=c(a.range).createDocumentFragment();d=a.next();){if(b=a.isPartiallySelectedSubtree(),d=d.cloneNode(!b),b&&(f=a.getSubtreeIterator(),d.appendChild(h(f)),f.detach()),10==d.nodeType)throw new db("HIERARCHY_REQUEST_ERR");e.appendChild(d)}return e}function i(a,b,c){var d,e,f,g;for(c=c||{stop:!1};f=a.next();)if(a.isPartiallySelectedSubtree()){if(b(f)===!1)return c.stop=!0,void 0;if(g=a.getSubtreeIterator(),i(g,b,c),g.detach(),c.stop)return}else for(d=ab.createIterator(f);e=d.next();)if(b(e)===!1)return c.stop=!0,void 0}function j(a){for(var b;a.next();)a.isPartiallySelectedSubtree()?(b=a.getSubtreeIterator(),j(b),b.detach()):a.remove()}function k(a){for(var b,d,e=c(a.range).createDocumentFragment();b=a.next();){if(a.isPartiallySelectedSubtree()?(b=b.cloneNode(!1),d=a.getSubtreeIterator(),b.appendChild(k(d)),d.detach()):a.remove(),10==b.nodeType)throw new db("HIERARCHY_REQUEST_ERR");e.appendChild(b)}return e}function l(a,b,c){var d,e,f=!(!b||!b.length),g=!!c;return f&&(d=RegExp("^("+b.join("|")+")$")),e=[],i(new n(a,!1),function(b){var h,i;(!f||d.test(b.nodeType))&&(!g||c(b))&&(h=a.startContainer,b==h&&eb(h)&&a.startOffset==h.length||(i=a.endContainer,b==i&&eb(i)&&0==a.endOffset||e.push(b)))}),e}function m(a){var b=void 0===a.getName?"Range":a.getName();return"["+b+"("+ab.inspectNode(a.startContainer)+":"+a.startOffset+", "+ab.inspectNode(a.endContainer)+":"+a.endOffset+")]"}function n(a,b){if(this.range=a,this.clonePartiallySelectedTextNodes=b,!a.collapsed){this.sc=a.startContainer,this.so=a.startOffset,this.ec=a.endContainer,this.eo=a.endOffset;var c=a.commonAncestorContainer;this.sc===this.ec&&eb(this.sc)?(this.isSingleCharacterDataNode=!0,this._first=this._last=this._next=this.sc):(this._first=this._next=this.sc!==c||eb(this.sc)?kb(this.sc,c,!0):this.sc.childNodes[this.so],this._last=this.ec!==c||eb(this.ec)?kb(this.ec,c,!0):this.ec.childNodes[this.eo-1])}}function o(a){return function(b,c){for(var d,e=c?b:b.parentNode;e;){if(d=e.nodeType,mb(a,d))return e;e=e.parentNode}return null}}function p(a,b){if(P(a,b))throw new db("INVALID_NODE_TYPE_ERR")}function q(a,b){if(!mb(b,a.nodeType))throw new db("INVALID_NODE_TYPE_ERR")}function r(a,b){if(0>b||b>(eb(a)?a.length:a.childNodes.length))throw new db("INDEX_SIZE_ERR")}function s(a,b){if(N(a,!0)!==N(b,!0))throw new db("WRONG_DOCUMENT_ERR")}function t(a){if(O(a,!0))throw new db("NO_MODIFICATION_ALLOWED_ERR")}function u(a,b){if(!a)throw new db(b)}function v(a){return ob&&ab.isBrokenNode(a)||!mb(J,a.nodeType)&&!N(a,!0)}function w(a,b){return b<=(eb(a)?a.length:a.childNodes.length)}function x(a){return!!a.startContainer&&!!a.endContainer&&!v(a.startContainer)&&!v(a.endContainer)&&w(a.startContainer,a.startOffset)&&w(a.endContainer,a.endOffset)}function y(a){if(!x(a))throw Error("Range error: Range is no longer valid after DOM mutation ("+a.inspect()+")")}function z(a,b){var c,d,e,f,g;y(a),c=a.startContainer,d=a.startOffset,e=a.endContainer,f=a.endOffset,g=c===e,eb(e)&&f>0&&f<e.length&&jb(e,f,b),eb(c)&&d>0&&d<c.length&&(c=jb(c,d,b),g?(f-=d,e=c):e==c.parentNode&&f>=fb(c)&&f++,d=0),a.setStartAndEnd(c,d,e,f)}function A(a){y(a);var b=a.commonAncestorContainer.parentNode.cloneNode(!1);return b.appendChild(a.cloneContents()),b.innerHTML}function B(a){a.START_TO_START=U,a.START_TO_END=V,a.END_TO_END=W,a.END_TO_START=X,a.NODE_BEFORE=Y,a.NODE_AFTER=Z,a.NODE_BEFORE_AND_AFTER=$,a.NODE_INSIDE=_}function C(a){B(a),B(a.prototype)}function D(a,b){return function(){var c,d,f,g,h,j,k;return y(this),c=this.startContainer,d=this.startOffset,f=this.commonAncestorContainer,g=new n(this,!0),c!==f&&(h=kb(c,f,!0),j=e(h),c=j.node,d=j.offset),i(g,t),g.reset(),k=a(g),g.detach(),b(this,c,d,c,d),k}}function E(c,f){function g(a,b){return function(c){q(c,I),q(nb(c),J);var f=(a?d:e)(c);(b?h:i)(this,f.node,f.offset)}}function h(a,b,c){var d=a.endContainer,e=a.endOffset;(b!==a.startContainer||c!==a.startOffset)&&((nb(b)!=nb(d)||1==ib(b,c,d,e))&&(d=b,e=c),f(a,b,c,d,e))}function i(a,b,c){var d=a.startContainer,e=a.startOffset;(b!==a.endContainer||c!==a.endOffset)&&((nb(b)!=nb(d)||-1==ib(b,c,d,e))&&(d=b,e=c),f(a,d,e,b,c))}var l=function(){};l.prototype=a.rangePrototype,c.prototype=new l,bb.extend(c.prototype,{setStart:function(a,b){p(a,!0),r(a,b),h(this,a,b)},setEnd:function(a,b){p(a,!0),r(a,b),i(this,a,b)},setStartAndEnd:function(){var a=arguments,b=a[0],c=a[1],d=b,e=c;switch(a.length){case 3:e=a[2];break;case 4:d=a[2],e=a[3]}f(this,b,c,d,e)},setBoundary:function(a,b,c){this["set"+(c?"Start":"End")](a,b)},setStartBefore:g(!0,!0),setStartAfter:g(!1,!0),setEndBefore:g(!0,!1),setEndAfter:g(!1,!1),collapse:function(a){y(this),a?f(this,this.startContainer,this.startOffset,this.startContainer,this.startOffset):f(this,this.endContainer,this.endOffset,this.endContainer,this.endOffset)},selectNodeContents:function(a){p(a,!0),f(this,a,0,a,lb(a))},selectNode:function(a){p(a,!1),q(a,I);var b=d(a),c=e(a);f(this,b.node,b.offset,c.node,c.offset)},extractContents:D(k,f),deleteContents:D(j,f),canSurroundContents:function(){var a,c;return y(this),t(this.startContainer),t(this.endContainer),a=new n(this,!0),c=a._first&&b(a._first,this)||a._last&&b(a._last,this),a.detach(),!c},splitBoundaries:function(){z(this)},splitBoundariesPreservingPositions:function(a){z(this,a)},normalizeBoundaries:function(){var a,b,c,d,e,g,h,i,j;y(this),a=this.startContainer,b=this.startOffset,c=this.endContainer,d=this.endOffset,e=function(a){var b=a.nextSibling;b&&b.nodeType==a.nodeType&&(c=a,d=a.length,a.appendData(b.data),b.parentNode.removeChild(b))},g=function(e){var f,g,h=e.previousSibling;h&&h.nodeType==e.nodeType&&(a=e,f=e.length,b=h.length,e.insertData(0,h.data),h.parentNode.removeChild(h),a==c?(d+=b,c=a):c==e.parentNode&&(g=fb(e),d==g?(c=e,d=f):d>g&&d--))},h=!0,eb(c)?c.length==d&&e(c):(d>0&&(i=c.childNodes[d-1],i&&eb(i)&&e(i)),h=!this.collapsed),h?eb(a)?0==b&&g(a):b<a.childNodes.length&&(j=a.childNodes[b],j&&eb(j)&&g(j)):(a=c,b=d),f(this,a,b,c,d)},collapseToPoint:function(a,b){p(a,!0),r(a,b),this.setStartAndEnd(a,b)}}),C(c)}function F(a){a.collapsed=a.startContainer===a.endContainer&&a.startOffset===a.endOffset,a.commonAncestorContainer=a.collapsed?a.startContainer:ab.getCommonAncestor(a.startContainer,a.endContainer)}function G(a,b,c,d,e){a.startContainer=b,a.startOffset=c,a.endContainer=d,a.endOffset=e,a.document=ab.getDocument(b),F(a)}function H(a){this.startContainer=a,this.startOffset=0,this.endContainer=a,this.endOffset=0,this.document=a,F(this)}var I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,$,_,ab=a.dom,bb=a.util,cb=ab.DomPosition,db=a.DOMException,eb=ab.isCharacterDataNode,fb=ab.getNodeIndex,gb=ab.isOrIsAncestorOf,hb=ab.getDocument,ib=ab.comparePoints,jb=ab.splitDataNode,kb=ab.getClosestAncestorIn,lb=ab.getNodeLength,mb=ab.arrayContains,nb=ab.getRootContainer,ob=a.features.crashyTextNodes;n.prototype={_current:null,_next:null,_first:null,_last:null,isSingleCharacterDataNode:!1,reset:function(){this._current=null,this._next=this._first},hasNext:function(){return!!this._next},next:function(){var a=this._current=this._next;return a&&(this._next=a!==this._last?a.nextSibling:null,eb(a)&&this.clonePartiallySelectedTextNodes&&(a===this.ec&&(a=a.cloneNode(!0)).deleteData(this.eo,a.length-this.eo),this._current===this.sc&&(a=a.cloneNode(!0)).deleteData(0,this.so))),a},remove:function(){var a,b,c=this._current;!eb(c)||c!==this.sc&&c!==this.ec?c.parentNode&&c.parentNode.removeChild(c):(a=c===this.sc?this.so:0,b=c===this.ec?this.eo:c.length,a!=b&&c.deleteData(a,b-a))},isPartiallySelectedSubtree:function(){var a=this._current;return b(a,this.range)},getSubtreeIterator:function(){var a,b,d,e,f,g;return this.isSingleCharacterDataNode?(a=this.range.cloneRange(),a.collapse(!1)):(a=new H(c(this.range)),b=this._current,d=b,e=0,f=b,g=lb(b),gb(b,this.sc)&&(d=this.sc,e=this.so),gb(b,this.ec)&&(f=this.ec,g=this.eo),G(a,d,e,f,g)),new n(a,this.clonePartiallySelectedTextNodes)},detach:function(){this.range=this._current=this._next=this._first=this._last=this.sc=this.so=this.ec=this.eo=null}},I=[1,3,4,5,7,8,10],J=[2,9,11],K=[5,6,10,12],L=[1,3,4,5,7,8,10,11],M=[1,3,4,5,7,8],N=o([9,11]),O=o(K),P=o([6,10,12]),Q=document.createElement("style"),R=!1;try{Q.innerHTML="<b>x</b>",R=3==Q.firstChild.nodeType}catch(pb){}a.features.htmlParsingConforms=R,S=R?function(a){var b,c=this.startContainer,d=hb(c);if(!c)throw new db("INVALID_STATE_ERR");return b=null,1==c.nodeType?b=c:eb(c)&&(b=ab.parentElement(c)),b=null===b||"HTML"==b.nodeName&&ab.isHtmlNamespace(hb(b).documentElement)&&ab.isHtmlNamespace(b)?d.createElement("body"):b.cloneNode(!1),b.innerHTML=a,ab.fragmentFromNodeChildren(b)}:function(a){var b=c(this),d=b.createElement("body");return d.innerHTML=a,ab.fragmentFromNodeChildren(d)},T=["startContainer","startOffset","endContainer","endOffset","collapsed","commonAncestorContainer"],U=0,V=1,W=2,X=3,Y=0,Z=1,$=2,_=3,bb.extend(a.rangePrototype,{compareBoundaryPoints:function(a,b){var c,d,e,f,g,h;return y(this),s(this.startContainer,b.startContainer),g=a==X||a==U?"start":"end",h=a==V||a==U?"start":"end",c=this[g+"Container"],d=this[g+"Offset"],e=b[h+"Container"],f=b[h+"Offset"],ib(c,d,e,f)},insertNode:function(a){if(y(this),q(a,L),t(this.startContainer),gb(a,this.startContainer))throw new db("HIERARCHY_REQUEST_ERR");var b=f(a,this.startContainer,this.startOffset);this.setStartBefore(b)},cloneContents:function(){var a,b,d;return y(this),this.collapsed?c(this).createDocumentFragment():this.startContainer===this.endContainer&&eb(this.startContainer)?(a=this.startContainer.cloneNode(!0),a.data=a.data.slice(this.startOffset,this.endOffset),b=c(this).createDocumentFragment(),b.appendChild(a),b):(d=new n(this,!0),a=h(d),d.detach(),a)},canSurroundContents:function(){var a,c;return y(this),t(this.startContainer),t(this.endContainer),a=new n(this,!0),c=a._first&&b(a._first,this)||a._last&&b(a._last,this),a.detach(),!c},surroundContents:function(a){if(q(a,M),!this.canSurroundContents())throw new db("INVALID_STATE_ERR");var b=this.extractContents();if(a.hasChildNodes())for(;a.lastChild;)a.removeChild(a.lastChild);f(a,this.startContainer,this.startOffset),a.appendChild(b),this.selectNode(a)},cloneRange:function(){var a,b,d;for(y(this),a=new H(c(this)),b=T.length;b--;)d=T[b],a[d]=this[d];return a},toString:function(){var a,b,c;return y(this),a=this.startContainer,a===this.endContainer&&eb(a)?3==a.nodeType||4==a.nodeType?a.data.slice(this.startOffset,this.endOffset):"":(b=[],c=new n(this,!0),i(c,function(a){(3==a.nodeType||4==a.nodeType)&&b.push(a.data)}),c.detach(),b.join(""))},compareNode:function(a){var b,c,d,e;if(y(this),b=a.parentNode,c=fb(a),!b)throw new db("NOT_FOUND_ERR");return d=this.comparePoint(b,c),e=this.comparePoint(b,c+1),0>d?e>0?$:Y:e>0?Z:_},comparePoint:function(a,b){return y(this),u(a,"HIERARCHY_REQUEST_ERR"),s(a,this.startContainer),ib(a,b,this.startContainer,this.startOffset)<0?-1:ib(a,b,this.endContainer,this.endOffset)>0?1:0},createContextualFragment:S,toHtml:function(){return A(this)},intersectsNode:function(a,b){var d,e,f,g;return y(this),u(a,"NOT_FOUND_ERR"),hb(a)!==c(this)?!1:(d=a.parentNode,e=fb(a),u(d,"NOT_FOUND_ERR"),f=ib(d,e,this.endContainer,this.endOffset),g=ib(d,e+1,this.startContainer,this.startOffset),b?0>=f&&g>=0:0>f&&g>0)},isPointInRange:function(a,b){return y(this),u(a,"HIERARCHY_REQUEST_ERR"),s(a,this.startContainer),ib(a,b,this.startContainer,this.startOffset)>=0&&ib(a,b,this.endContainer,this.endOffset)<=0},intersectsRange:function(a){return g(this,a,!1)},intersectsOrTouchesRange:function(a){return g(this,a,!0)},intersection:function(a){var b,c,d;return this.intersectsRange(a)?(b=ib(this.startContainer,this.startOffset,a.startContainer,a.startOffset),c=ib(this.endContainer,this.endOffset,a.endContainer,a.endOffset),d=this.cloneRange(),-1==b&&d.setStart(a.startContainer,a.startOffset),1==c&&d.setEnd(a.endContainer,a.endOffset),d):null},union:function(a){if(this.intersectsOrTouchesRange(a)){var b=this.cloneRange();return-1==ib(a.startContainer,a.startOffset,this.startContainer,this.startOffset)&&b.setStart(a.startContainer,a.startOffset),1==ib(a.endContainer,a.endOffset,this.endContainer,this.endOffset)&&b.setEnd(a.endContainer,a.endOffset),b}throw new db("Ranges do not intersect")},containsNode:function(a,b){return b?this.intersectsNode(a,!1):this.compareNode(a)==_},containsNodeContents:function(a){return this.comparePoint(a,0)>=0&&this.comparePoint(a,lb(a))<=0},containsRange:function(a){var b=this.intersection(a);return null!==b&&a.equals(b)},containsNodeText:function(a){var b,c,d=this.cloneRange();return d.selectNode(a),b=d.getNodes([3]),b.length>0?(d.setStart(b[0],0),c=b.pop(),d.setEnd(c,c.length),this.containsRange(d)):this.containsNodeContents(a)},getNodes:function(a,b){return y(this),l(this,a,b)},getDocument:function(){return c(this)},collapseBefore:function(a){this.setEndBefore(a),this.collapse(!1)},collapseAfter:function(a){this.setStartAfter(a),this.collapse(!0)},getBookmark:function(b){var d,e,f,g=c(this),h=a.createRange(g);return b=b||ab.getBody(g),h.selectNodeContents(b),d=this.intersection(h),e=0,f=0,d&&(h.setEnd(d.startContainer,d.startOffset),e=(""+h).length,f=e+(""+d).length),{start:e,end:f,containerNode:b}},moveToBookmark:function(a){var b,c,d,e,f,g,h,i=a.containerNode,j=0;for(this.setStart(i,0),this.collapse(!0),b=[i],d=!1,e=!1;!e&&(c=b.pop());)if(3==c.nodeType)f=j+c.length,!d&&a.start>=j&&a.start<=f&&(this.setStart(c,a.start-j),d=!0),d&&a.end>=j&&a.end<=f&&(this.setEnd(c,a.end-j),e=!0),j=f;else for(h=c.childNodes,g=h.length;g--;)b.push(h[g])},getName:function(){return"DomRange"},equals:function(a){return H.rangesEqual(this,a)},isValid:function(){return x(this)},inspect:function(){return m(this)},detach:function(){}}),E(H,G),bb.extend(H,{rangeProperties:T,RangeIterator:n,copyComparisonConstants:C,createPrototypeRange:E,inspect:m,toHtml:A,getRangeDocument:c,rangesEqual:function(a,b){return a.startContainer===b.startContainer&&a.startOffset===b.startOffset&&a.endContainer===b.endContainer&&a.endOffset===b.endOffset}}),a.DomRange=H}),H.createCoreModule("WrappedRange",["DomRange"],function(a,b){var c,d,e,f,g,h,i,j,k=a.dom,l=a.util,m=k.DomPosition,n=a.DomRange,o=k.getBody,p=k.getContentDocument,q=k.isCharacterDataNode;a.features.implementsDomRange&&!function(){function d(a){for(var b,c=s.length;c--;)b=s[c],a[b]=a.nativeRange[b];a.collapsed=a.startContainer===a.endContainer&&a.startOffset===a.endOffset}function e(a,b,c,d,e){var f=a.startContainer!==b||a.startOffset!=c,g=a.endContainer!==d||a.endOffset!=e,h=!a.equals(a.nativeRange);(f||g||h)&&(a.setEnd(d,e),a.setStart(b,c))}var f,g,h,i,j,m,q,r,s=n.rangeProperties;c=function(a){if(!a)throw b.createError("WrappedRange: Range must be specified");this.nativeRange=a,d(this)},n.createPrototypeRange(c,e),f=c.prototype,f.selectNode=function(a){this.nativeRange.selectNode(a),d(this)},f.cloneContents=function(){return this.nativeRange.cloneContents()},f.surroundContents=function(a){this.nativeRange.surroundContents(a),d(this)},f.collapse=function(a){this.nativeRange.collapse(a),d(this)},f.cloneRange=function(){return new c(this.nativeRange.cloneRange())},f.refresh=function(){d(this)},f.toString=function(){return""+this.nativeRange},h=document.createTextNode("test"),o(document).appendChild(h),i=document.createRange(),i.setStart(h,0),i.setEnd(h,0);try{i.setStart(h,1),f.setStart=function(a,b){this.nativeRange.setStart(a,b),d(this)},f.setEnd=function(a,b){this.nativeRange.setEnd(a,b),d(this)},g=function(a){return function(b){this.nativeRange[a](b),d(this)}}}catch(t){f.setStart=function(a,b){try{this.nativeRange.setStart(a,b)}catch(c){this.nativeRange.setEnd(a,b),this.nativeRange.setStart(a,b)}d(this)},f.setEnd=function(a,b){try{this.nativeRange.setEnd(a,b)}catch(c){this.nativeRange.setStart(a,b),this.nativeRange.setEnd(a,b)}d(this)},g=function(a,b){return function(c){try{this.nativeRange[a](c)}catch(e){this.nativeRange[b](c),this.nativeRange[a](c)}d(this)}}}f.setStartBefore=g("setStartBefore","setEndBefore"),f.setStartAfter=g("setStartAfter","setEndAfter"),f.setEndBefore=g("setEndBefore","setStartBefore"),f.setEndAfter=g("setEndAfter","setStartAfter"),f.selectNodeContents=function(a){this.setStartAndEnd(a,0,k.getNodeLength(a))},i.selectNodeContents(h),i.setEnd(h,3),j=document.createRange(),j.selectNodeContents(h),j.setEnd(h,4),j.setStart(h,2),f.compareBoundaryPoints=-1==i.compareBoundaryPoints(i.START_TO_END,j)&&1==i.compareBoundaryPoints(i.END_TO_START,j)?function(a,b){return b=b.nativeRange||b,a==b.START_TO_END?a=b.END_TO_START:a==b.END_TO_START&&(a=b.START_TO_END),this.nativeRange.compareBoundaryPoints(a,b)}:function(a,b){return this.nativeRange.compareBoundaryPoints(a,b.nativeRange||b)},m=document.createElement("div"),m.innerHTML="123",q=m.firstChild,r=o(document),r.appendChild(m),i.setStart(q,1),i.setEnd(q,2),i.deleteContents(),"13"==q.data&&(f.deleteContents=function(){this.nativeRange.deleteContents(),d(this)},f.extractContents=function(){var a=this.nativeRange.extractContents();return d(this),a}),r.removeChild(m),r=null,l.isHostMethod(i,"createContextualFragment")&&(f.createContextualFragment=function(a){return this.nativeRange.createContextualFragment(a)}),o(document).removeChild(h),f.getName=function(){return"WrappedRange"},a.WrappedRange=c,a.createNativeRange=function(a){return a=p(a,b,"createNativeRange"),a.createRange()}}(),a.features.implementsTextRange&&(e=function(a){var b,c,d,e=a.parentElement(),f=a.duplicate();return f.collapse(!0),b=f.parentElement(),f=a.duplicate(),f.collapse(!1),c=f.parentElement(),d=b==c?b:k.getCommonAncestor(b,c),d==e?d:k.getCommonAncestor(e,d)},f=function(a){return 0==a.compareEndPoints("StartToEnd",a)},g=function(a,b,c,d,e){var f,g,h,i,j,l,n,o,p,r,s,t,u,v,w,x,y=a.duplicate();if(y.collapse(c),f=y.parentElement(),k.isOrIsAncestorOf(b,f)||(f=b),!f.canHaveHTML)return g=new m(f.parentNode,k.getNodeIndex(f)),{boundaryPosition:g,nodeInfo:{nodeIndex:g.offset,containerElement:g.node}};for(h=k.getDocument(f).createElement("span"),h.parentNode&&h.parentNode.removeChild(h),j=c?"StartToStart":"StartToEnd",r=e&&e.containerElement==f?e.nodeIndex:0,s=f.childNodes.length,t=s,u=t;;){if(u==s?f.appendChild(h):f.insertBefore(h,f.childNodes[u]),y.moveToElementText(h),i=y.compareEndPoints(j,a),0==i||r==t)break;if(-1==i){if(t==r+1)break;r=u}else t=t==r+1?r:u;u=Math.floor((r+t)/2),f.removeChild(h)}if(p=h.nextSibling,-1==i&&p&&q(p)){if(y.setEndPoint(c?"EndToStart":"EndToEnd",a),/[\r\n]/.test(p.data))for(w=y.duplicate(),x=w.text.replace(/\r\n/g,"\r").length,v=w.moveStart("character",x);-1==(i=w.compareEndPoints("StartToEnd",w));)v++,w.moveStart("character",1);else v=y.text.length;o=new m(p,v)}else l=(d||!c)&&h.previousSibling,n=(d||c)&&h.nextSibling,o=n&&q(n)?new m(n,0):l&&q(l)?new m(l,l.data.length):new m(f,k.getNodeIndex(h));return h.parentNode.removeChild(h),{boundaryPosition:o,nodeInfo:{nodeIndex:u,containerElement:f}}},h=function(a,b){var c,d,e,f,g=a.offset,h=k.getDocument(a.node),i=o(h).createTextRange(),j=q(a.node);return j?(c=a.node,d=c.parentNode):(f=a.node.childNodes,c=g<f.length?f[g]:null,d=a.node),e=h.createElement("span"),e.innerHTML="&#feff;",c?d.insertBefore(e,c):d.appendChild(e),i.moveToElementText(e),i.collapse(!b),d.removeChild(e),j&&i[b?"moveStart":"moveEnd"]("character",g),i},d=function(a){this.textRange=a,this.refresh()},d.prototype=new n(document),d.prototype.refresh=function(){var a,b,c,d=e(this.textRange); +f(this.textRange)?b=a=g(this.textRange,d,!0,!0).boundaryPosition:(c=g(this.textRange,d,!0,!1),a=c.boundaryPosition,b=g(this.textRange,d,!1,!1,c.nodeInfo).boundaryPosition),this.setStart(a.node,a.offset),this.setEnd(b.node,b.offset)},d.prototype.getName=function(){return"WrappedTextRange"},n.copyComparisonConstants(d),i=function(a){var b,c,d;return a.collapsed?h(new m(a.startContainer,a.startOffset),!0):(b=h(new m(a.startContainer,a.startOffset),!0),c=h(new m(a.endContainer,a.endOffset),!1),d=o(n.getRangeDocument(a)).createTextRange(),d.setEndPoint("StartToStart",b),d.setEndPoint("EndToEnd",c),d)},d.rangeToTextRange=i,d.prototype.toTextRange=function(){return i(this)},a.WrappedTextRange=d,(!a.features.implementsDomRange||a.config.preferTextRange)&&(j=function(){return this}(),void 0===j.Range&&(j.Range=d),a.createNativeRange=function(a){return a=p(a,b,"createNativeRange"),o(a).createTextRange()},a.WrappedRange=d)),a.createRange=function(c){return c=p(c,b,"createRange"),new a.WrappedRange(a.createNativeRange(c))},a.createRangyRange=function(a){return a=p(a,b,"createRangyRange"),new n(a)},a.createIframeRange=function(c){return b.deprecationNotice("createIframeRange()","createRange(iframeEl)"),a.createRange(c)},a.createIframeRangyRange=function(c){return b.deprecationNotice("createIframeRangyRange()","createRangyRange(iframeEl)"),a.createRangyRange(c)},a.addShimListener(function(b){var c=b.document;void 0===c.createRange&&(c.createRange=function(){return a.createRange(c)}),c=b=null})}),H.createCoreModule("WrappedSelection",["DomRange","WrappedRange"],function(a,b){function c(a){return"string"==typeof a?/^backward(s)?$/i.test(a):!!a}function d(a,c){if(a){if(A.isWindow(a))return a;if(a instanceof r)return a.win;var d=A.getContentDocument(a,b,c);return A.getWindow(d)}return window}function e(a){return d(a,"getWinSelection").getSelection()}function f(a){return d(a,"getDocSelection").document.selection}function g(a){var b=!1;return a.anchorNode&&(b=1==A.comparePoints(a.anchorNode,a.anchorOffset,a.focusNode,a.focusOffset)),b}function h(a,b,c){var d=c?"end":"start",e=c?"start":"end";a.anchorNode=b[d+"Container"],a.anchorOffset=b[d+"Offset"],a.focusNode=b[e+"Container"],a.focusOffset=b[e+"Offset"]}function i(a){var b=a.nativeSelection;a.anchorNode=b.anchorNode,a.anchorOffset=b.anchorOffset,a.focusNode=b.focusNode,a.focusOffset=b.focusOffset}function j(a){a.anchorNode=a.focusNode=null,a.anchorOffset=a.focusOffset=0,a.rangeCount=0,a.isCollapsed=!0,a._ranges.length=0}function k(b){var c;return b instanceof D?(c=a.createNativeRange(b.getDocument()),c.setEnd(b.endContainer,b.endOffset),c.setStart(b.startContainer,b.startOffset)):b instanceof E?c=b.nativeRange:J.implementsDomRange&&b instanceof A.getWindow(b.startContainer).Range&&(c=b),c}function l(a){if(!a.length||1!=a[0].nodeType)return!1;for(var b=1,c=a.length;c>b;++b)if(!A.isAncestorOf(a[0],a[b]))return!1;return!0}function m(a){var c=a.getNodes();if(!l(c))throw b.createError("getSingleElementFromRange: range "+a.inspect()+" did not consist of a single element");return c[0]}function n(a){return!!a&&void 0!==a.text}function o(a,b){var c=new E(b);a._ranges=[c],h(a,c,!1),a.rangeCount=1,a.isCollapsed=c.collapsed}function p(b){var c,d,e,f;if(b._ranges.length=0,"None"==b.docSelection.type)j(b);else if(c=b.docSelection.createRange(),n(c))o(b,c);else{for(b.rangeCount=c.length,e=L(c.item(0)),f=0;f<b.rangeCount;++f)d=a.createRange(e),d.selectNode(c.item(f)),b._ranges.push(d);b.isCollapsed=1==b.rangeCount&&b._ranges[0].collapsed,h(b,b._ranges[b.rangeCount-1],!1)}}function q(a,c){var d,e,f=a.docSelection.createRange(),g=m(c),h=L(f.item(0)),i=M(h).createControlRange();for(d=0,e=f.length;e>d;++d)i.add(f.item(d));try{i.add(g)}catch(j){throw b.createError("addRange(): Element within the specified Range could not be added to control selection (does it have layout?)")}i.select(),p(a)}function r(a,b,c){this.nativeSelection=a,this.docSelection=b,this._ranges=[],this.win=c,this.refresh()}function s(a){a.win=a.anchorNode=a.focusNode=a._ranges=null,a.rangeCount=a.anchorOffset=a.focusOffset=0,a.detached=!0}function t(a,b){for(var c,d,e=bb.length;e--;)if(c=bb[e],d=c.selection,"deleteAll"==b)s(d);else if(c.win==a)return"delete"==b?(bb.splice(e,1),!0):d;return"deleteAll"==b&&(bb.length=0),null}function u(a,c){var d,e,f,g=L(c[0].startContainer),h=M(g).createControlRange();for(d=0,f=c.length;f>d;++d){e=m(c[d]);try{h.add(e)}catch(i){throw b.createError("setRanges(): Element within one of the specified Ranges could not be added to control selection (does it have layout?)")}}h.select(),p(a)}function v(a,b){if(a.win.document!=L(b))throw new F("WRONG_DOCUMENT_ERR")}function w(b){return function(c,d){var e;this.rangeCount?(e=this.getRangeAt(0),e["set"+(b?"Start":"End")](c,d)):(e=a.createRange(this.win.document),e.setStartAndEnd(c,d)),this.setSingleRange(e,this.isBackward())}}function x(a){var b,c,d=[],e=new G(a.anchorNode,a.anchorOffset),f=new G(a.focusNode,a.focusOffset),g="function"==typeof a.getName?a.getName():"Selection";if(void 0!==a.rangeCount)for(b=0,c=a.rangeCount;c>b;++b)d[b]=D.inspect(a.getRangeAt(b));return"["+g+"(Ranges: "+d.join(", ")+")(anchor: "+e.inspect()+", focus: "+f.inspect()+"]"}var y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,$,_,ab,bb,cb,db,eb,fb,gb,hb;if(a.config.checkSelectionRanges=!0,y="boolean",z="number",A=a.dom,B=a.util,C=B.isHostMethod,D=a.DomRange,E=a.WrappedRange,F=a.DOMException,G=A.DomPosition,J=a.features,K="Control",L=A.getDocument,M=A.getBody,N=D.rangesEqual,O=C(window,"getSelection"),P=B.isHostObject(document,"selection"),J.implementsWinGetSelection=O,J.implementsDocSelection=P,Q=P&&(!O||a.config.preferTextRange),Q?(H=f,a.isSelectionValid=function(a){var b=d(a,"isSelectionValid").document,c=b.selection;return"None"!=c.type||L(c.createRange().parentElement())==b}):O?(H=e,a.isSelectionValid=function(){return!0}):b.fail("Neither document.selection or window.getSelection() detected."),a.getNativeSelection=H,R=H(),S=a.createNativeRange(document),T=M(document),U=B.areHostProperties(R,["anchorNode","focusNode","anchorOffset","focusOffset"]),J.selectionHasAnchorAndFocus=U,V=C(R,"extend"),J.selectionHasExtend=V,W=typeof R.rangeCount==z,J.selectionHasRangeCount=W,X=!1,Y=!0,Z=V?function(b,c){var d=D.getRangeDocument(c),e=a.createRange(d);e.collapseToPoint(c.endContainer,c.endOffset),b.addRange(k(e)),b.extend(c.startContainer,c.startOffset)}:null,B.areHostMethods(R,["addRange","getRangeAt","removeAllRanges"])&&typeof R.rangeCount==z&&J.implementsDomRange&&!function(){var b,c,d,e,f,h,i,j,k,l,m,n=window.getSelection();if(n){for(b=n.rangeCount,c=b>1,d=[],e=g(n),f=0;b>f;++f)d[f]=n.getRangeAt(f);for(h=M(document),i=h.appendChild(document.createElement("div")),i.contentEditable="false",j=i.appendChild(document.createTextNode("   ")),k=document.createRange(),k.setStart(j,1),k.collapse(!0),n.addRange(k),Y=1==n.rangeCount,n.removeAllRanges(),c||(l=window.navigator.appVersion.match(/Chrome\/(.*?) /),l&&parseInt(l[1])>=36?X=!1:(m=k.cloneRange(),k.setStart(j,0),m.setEnd(j,3),m.setStart(j,2),n.addRange(k),n.addRange(m),X=2==n.rangeCount)),h.removeChild(i),n.removeAllRanges(),f=0;b>f;++f)0==f&&e?Z?Z(n,d[f]):(a.warn("Rangy initialization: original selection was backwards but selection has been restored forwards because the browser does not support Selection.extend"),n.addRange(d[f])):n.addRange(d[f])}}(),J.selectionSupportsMultipleRanges=X,J.collapsedNonEditableSelectionsSupported=Y,$=!1,T&&C(T,"createControlRange")&&(_=T.createControlRange(),B.areHostProperties(_,["item","add"])&&($=!0)),J.implementsControlRange=$,I=U?function(a){return a.anchorNode===a.focusNode&&a.anchorOffset===a.focusOffset}:function(a){return a.rangeCount?a.getRangeAt(a.rangeCount-1).collapsed:!1},C(R,"getRangeAt")?ab=function(a,b){try{return a.getRangeAt(b)}catch(c){return null}}:U&&(ab=function(b){var c=L(b.anchorNode),d=a.createRange(c);return d.setStartAndEnd(b.anchorNode,b.anchorOffset,b.focusNode,b.focusOffset),d.collapsed!==this.isCollapsed&&d.setStartAndEnd(b.focusNode,b.focusOffset,b.anchorNode,b.anchorOffset),d}),r.prototype=a.selectionPrototype,bb=[],cb=function(a){var b,c,e;return a&&a instanceof r?(a.refresh(),a):(a=d(a,"getNativeSelection"),b=t(a),c=H(a),e=P?f(a):null,b?(b.nativeSelection=c,b.docSelection=e,b.refresh()):(b=new r(c,e,a),bb.push({win:a,selection:b})),b)},a.getSelection=cb,a.getIframeSelection=function(c){return b.deprecationNotice("getIframeSelection()","getSelection(iframeEl)"),a.getSelection(A.getIframeWindow(c))},db=r.prototype,!Q&&U&&B.areHostMethods(R,["removeAllRanges","addRange"]))db.removeAllRanges=function(){this.nativeSelection.removeAllRanges(),j(this)},eb=function(a,b){Z(a.nativeSelection,b),a.refresh()},db.addRange=W?function(b,d){var e,f;$&&P&&this.docSelection.type==K?q(this,b):c(d)&&V?eb(this,b):(X?e=this.rangeCount:(this.removeAllRanges(),e=0),this.nativeSelection.addRange(k(b).cloneRange()),this.rangeCount=this.nativeSelection.rangeCount,this.rangeCount==e+1?(a.config.checkSelectionRanges&&(f=ab(this.nativeSelection,this.rangeCount-1),f&&!N(f,b)&&(b=new E(f))),this._ranges[this.rangeCount-1]=b,h(this,b,hb(this.nativeSelection)),this.isCollapsed=I(this)):this.refresh())}:function(a,b){c(b)&&V?eb(this,a):(this.nativeSelection.addRange(k(a)),this.refresh())},db.setRanges=function(a){if($&&P&&a.length>1)u(this,a);else{this.removeAllRanges();for(var b=0,c=a.length;c>b;++b)this.addRange(a[b])}};else{if(!(C(R,"empty")&&C(S,"select")&&$&&Q))return b.fail("No means of selecting a Range or TextRange was found"),!1;db.removeAllRanges=function(){var a,b,c;try{this.docSelection.empty(),"None"!=this.docSelection.type&&(this.anchorNode?a=L(this.anchorNode):this.docSelection.type==K&&(b=this.docSelection.createRange(),b.length&&(a=L(b.item(0)))),a&&(c=M(a).createTextRange(),c.select(),this.docSelection.empty()))}catch(d){}j(this)},db.addRange=function(b){this.docSelection.type==K?q(this,b):(a.WrappedTextRange.rangeToTextRange(b).select(),this._ranges[0]=b,this.rangeCount=1,this.isCollapsed=this._ranges[0].collapsed,h(this,b,!1))},db.setRanges=function(a){this.removeAllRanges();var b=a.length;b>1?u(this,a):b&&this.addRange(a[0])}}if(db.getRangeAt=function(a){if(0>a||a>=this.rangeCount)throw new F("INDEX_SIZE_ERR");return this._ranges[a].cloneRange()},Q)fb=function(b){var c;a.isSelectionValid(b.win)?c=b.docSelection.createRange():(c=M(b.win.document).createTextRange(),c.collapse(!0)),b.docSelection.type==K?p(b):n(c)?o(b,c):j(b)};else if(C(R,"getRangeAt")&&typeof R.rangeCount==z)fb=function(b){if($&&P&&b.docSelection.type==K)p(b);else if(b._ranges.length=b.rangeCount=b.nativeSelection.rangeCount,b.rangeCount){for(var c=0,d=b.rangeCount;d>c;++c)b._ranges[c]=new a.WrappedRange(b.nativeSelection.getRangeAt(c));h(b,b._ranges[b.rangeCount-1],hb(b.nativeSelection)),b.isCollapsed=I(b)}else j(b)};else{if(!U||typeof R.isCollapsed!=y||typeof S.collapsed!=y||!J.implementsDomRange)return b.fail("No means of obtaining a Range or TextRange from the user's selection was found"),!1;fb=function(a){var b,c=a.nativeSelection;c.anchorNode?(b=ab(c,0),a._ranges=[b],a.rangeCount=1,i(a),a.isCollapsed=I(a)):j(a)}}db.refresh=function(a){var b,c=a?this._ranges.slice(0):null,d=this.anchorNode,e=this.anchorOffset;if(fb(this),a){if(b=c.length,b!=this._ranges.length)return!0;if(this.anchorNode!=d||this.anchorOffset!=e)return!0;for(;b--;)if(!N(c[b],this._ranges[b]))return!0;return!1}},gb=function(a,b){var c,d,e=a.getAllRanges();for(a.removeAllRanges(),c=0,d=e.length;d>c;++c)N(b,e[c])||a.addRange(e[c]);a.rangeCount||j(a)},db.removeRange=$&&P?function(a){var b,c,d,e,f,g,h,i;if(this.docSelection.type==K){for(b=this.docSelection.createRange(),c=m(a),d=L(b.item(0)),e=M(d).createControlRange(),g=!1,h=0,i=b.length;i>h;++h)f=b.item(h),f!==c||g?e.add(b.item(h)):g=!0;e.select(),p(this)}else gb(this,a)}:function(a){gb(this,a)},!Q&&U&&J.implementsDomRange?(hb=g,db.isBackward=function(){return hb(this)}):hb=db.isBackward=function(){return!1},db.isBackwards=db.isBackward,db.toString=function(){var a,b,c=[];for(a=0,b=this.rangeCount;b>a;++a)c[a]=""+this._ranges[a];return c.join("")},db.collapse=function(b,c){v(this,b);var d=a.createRange(b);d.collapseToPoint(b,c),this.setSingleRange(d),this.isCollapsed=!0},db.collapseToStart=function(){if(!this.rangeCount)throw new F("INVALID_STATE_ERR");var a=this._ranges[0];this.collapse(a.startContainer,a.startOffset)},db.collapseToEnd=function(){if(!this.rangeCount)throw new F("INVALID_STATE_ERR");var a=this._ranges[this.rangeCount-1];this.collapse(a.endContainer,a.endOffset)},db.selectAllChildren=function(b){v(this,b);var c=a.createRange(b);c.selectNodeContents(b),this.setSingleRange(c)},db.deleteFromDocument=function(){var a,b,c,d,e;if($&&P&&this.docSelection.type==K){for(a=this.docSelection.createRange();a.length;)b=a.item(0),a.remove(b),b.parentNode.removeChild(b);this.refresh()}else if(this.rangeCount&&(c=this.getAllRanges(),c.length)){for(this.removeAllRanges(),d=0,e=c.length;e>d;++d)c[d].deleteContents();this.addRange(c[e-1])}},db.eachRange=function(a,b){for(var c=0,d=this._ranges.length;d>c;++c)if(a(this.getRangeAt(c)))return b},db.getAllRanges=function(){var a=[];return this.eachRange(function(b){a.push(b)}),a},db.setSingleRange=function(a,b){this.removeAllRanges(),this.addRange(a,b)},db.callMethodOnEachRange=function(a,b){var c=[];return this.eachRange(function(d){c.push(d[a].apply(d,b))}),c},db.setStart=w(!0),db.setEnd=w(!1),a.rangePrototype.select=function(a){cb(this.getDocument()).setSingleRange(this,a)},db.changeEachRange=function(a){var b=[],c=this.isBackward();this.eachRange(function(c){a(c),b.push(c)}),this.removeAllRanges(),c&&1==b.length?this.addRange(b[0],"backward"):this.setRanges(b)},db.containsNode=function(a,b){return this.eachRange(function(c){return c.containsNode(a,b)},!0)||!1},db.getBookmark=function(a){return{backward:this.isBackward(),rangeBookmarks:this.callMethodOnEachRange("getBookmark",[a])}},db.moveToBookmark=function(b){var c,d,e,f=[];for(c=0;d=b.rangeBookmarks[c++];)e=a.createRange(this.win),e.moveToBookmark(d),f.push(e);b.backward?this.setSingleRange(f[0],"backward"):this.setRanges(f)},db.toHtml=function(){var a=[];return this.eachRange(function(b){a.push(D.toHtml(b))}),a.join("")},J.implementsTextRange&&(db.getNativeTextRange=function(){var c,d;if(c=this.docSelection){if(d=c.createRange(),n(d))return d;throw b.createError("getNativeTextRange: selection is a control selection")}if(this.rangeCount>0)return a.WrappedTextRange.rangeToTextRange(this.getRangeAt(0));throw b.createError("getNativeTextRange: selection contains no range")}),db.getName=function(){return"WrappedSelection"},db.inspect=function(){return x(this)},db.detach=function(){t(this.win,"delete"),s(this)},r.detachAll=function(){t(null,"deleteAll")},r.inspect=x,r.isDirectionBackward=c,a.Selection=r,a.selectionPrototype=db,a.addShimListener(function(a){void 0===a.getSelection&&(a.getSelection=function(){return cb(a)}),a=null})}),H)},this),function(a,b){"function"==typeof define&&define.amd?define(["rangy"],a):a(b.rangy)}(function(a){a.createModule("SaveRestore",["WrappedRange"],function(a,b){function c(a,b){return(b||document).getElementById(a)}function d(a,b){var c,d="selectionBoundary_"+ +new Date+"_"+(""+Math.random()).slice(2),e=o.getDocument(a.startContainer),f=a.cloneRange();return f.collapse(b),c=e.createElement("span"),c.id=d,c.style.lineHeight="0",c.style.display="none",c.className="rangySelectionBoundary",c.appendChild(e.createTextNode(p)),f.insertNode(c),c}function e(a,d,e,f){var g=c(e,a);g?(d[f?"setStartBefore":"setEndBefore"](g),g.parentNode.removeChild(g)):b.warn("Marker element has been removed. Cannot restore selection.")}function f(a,b){return b.compareBoundaryPoints(a.START_TO_START,a)}function g(b,c){var e,f,g=a.DomRange.getRangeDocument(b),h=""+b;return b.collapsed?(f=d(b,!1),{document:g,markerId:f.id,collapsed:!0}):(f=d(b,!1),e=d(b,!0),{document:g,startMarkerId:e.id,endMarkerId:f.id,collapsed:!1,backward:c,toString:function(){return"original text: '"+h+"', new text: '"+b+"'"}})}function h(d,f){var g,h,i,j=d.document;return void 0===f&&(f=!0),g=a.createRange(j),d.collapsed?(h=c(d.markerId,j),h?(h.style.display="inline",i=h.previousSibling,i&&3==i.nodeType?(h.parentNode.removeChild(h),g.collapseToPoint(i,i.length)):(g.collapseBefore(h),h.parentNode.removeChild(h))):b.warn("Marker element has been removed. Cannot restore selection.")):(e(j,g,d.startMarkerId,!0),e(j,g,d.endMarkerId,!1)),f&&g.normalizeBoundaries(),g}function i(b,d){var e,h,i,j,k=[];for(b=b.slice(0),b.sort(f),i=0,j=b.length;j>i;++i)k[i]=g(b[i],d);for(i=j-1;i>=0;--i)e=b[i],h=a.DomRange.getRangeDocument(e),e.collapsed?e.collapseAfter(c(k[i].markerId,h)):(e.setEndBefore(c(k[i].endMarkerId,h)),e.setStartAfter(c(k[i].startMarkerId,h)));return k}function j(c){var d,e,f,g;return a.isSelectionValid(c)?(d=a.getSelection(c),e=d.getAllRanges(),f=1==e.length&&d.isBackward(),g=i(e,f),f?d.setSingleRange(e[0],"backward"):d.setRanges(e),{win:c,rangeInfos:g,restored:!1}):(b.warn("Cannot save selection. This usually happens when the selection is collapsed and the selection document has lost focus."),null)}function k(a){var b,c=[],d=a.length;for(b=d-1;b>=0;b--)c[b]=h(a[b],!0);return c}function l(b,c){var d,e,f,g;b.restored||(d=b.rangeInfos,e=a.getSelection(b.win),f=k(d),g=d.length,1==g&&c&&a.features.selectionHasExtend&&d[0].backward?(e.removeAllRanges(),e.addRange(f[0],!0)):e.setRanges(f),b.restored=!0)}function m(a,b){var d=c(b,a);d&&d.parentNode.removeChild(d)}function n(a){var b,c,d,e=a.rangeInfos;for(b=0,c=e.length;c>b;++b)d=e[b],d.collapsed?m(a.doc,d.markerId):(m(a.doc,d.startMarkerId),m(a.doc,d.endMarkerId))}var o=a.dom,p="";a.util.extend(a,{saveRange:g,restoreRange:h,saveRanges:i,restoreRanges:k,saveSelection:j,restoreSelection:l,removeMarkerElement:m,removeMarkers:n})})},this),Base=function(){},Base.extend=function(a,b){var c,d,e,f=Base.prototype.extend;return Base._prototyping=!0,c=new this,f.call(c,a),c.base=function(){},delete Base._prototyping,d=c.constructor,e=c.constructor=function(){if(!Base._prototyping)if(this._constructing||this.constructor==e)this._constructing=!0,d.apply(this,arguments),delete this._constructing;else if(null!=arguments[0])return(arguments[0].extend||f).call(arguments[0],c)},e.ancestor=this,e.extend=this.extend,e.forEach=this.forEach,e.implement=this.implement,e.prototype=c,e.toString=this.toString,e.valueOf=function(a){return"object"==a?e:d.valueOf()},f.call(e,b),"function"==typeof e.init&&e.init(),e},Base.prototype={extend:function(a,b){var c,d,e,f,g,h,i;if(arguments.length>1)c=this[a],!c||"function"!=typeof b||c.valueOf&&c.valueOf()==b.valueOf()||!/\bbase\b/.test(b)||(d=b.valueOf(),b=function(){var a,b=this.base||Base.prototype.base;return this.base=c,a=d.apply(this,arguments),this.base=b,a},b.valueOf=function(a){return"object"==a?b:d},b.toString=Base.toString),this[a]=b;else if(a){for(e=Base.prototype.extend,Base._prototyping||"function"==typeof this||(e=this.extend||e),f={toSource:null},g=["constructor","toString","valueOf"],h=Base._prototyping?0:1;i=g[h++];)a[i]!=f[i]&&e.call(this,i,a[i]);for(i in a)f[i]||e.call(this,i,a[i])}return this}},Base=Base.extend({constructor:function(){this.extend(arguments[0])}},{ancestor:Object,version:"1.1",forEach:function(a,b,c){for(var d in a)void 0===this.prototype[d]&&b.call(c,a[d],d,a)},implement:function(){for(var a=0;a<arguments.length;a++)"function"==typeof arguments[a]?arguments[a](this.prototype):this.prototype.extend(arguments[a]);return this},toString:function(){return this.valueOf()+""}}),wysihtml5.browser=function(){function a(a){return+(/ipad|iphone|ipod/.test(a)&&a.match(/ os (\d+).+? like mac os x/)||[void 0,0])[1]}function b(a){return+(a.match(/android (\d+)/)||[void 0,0])[1]}function c(a,b){var c,d=-1;return"Microsoft Internet Explorer"==navigator.appName?c=RegExp("MSIE ([0-9]{1,}[.0-9]{0,})"):"Netscape"==navigator.appName&&(c=RegExp("Trident/.*rv:([0-9]{1,}[.0-9]{0,})")),c&&null!=c.exec(navigator.userAgent)&&(d=parseFloat(RegExp.$1)),-1===d?!1:a?b?"<"===b?d>a:">"===b?a>d:"<="===b?d>=a:">="===b?a>=d:void 0:a===d:!0}var d=navigator.userAgent,e=document.createElement("div"),f=-1!==d.indexOf("Gecko")&&-1===d.indexOf("KHTML"),g=-1!==d.indexOf("AppleWebKit/"),h=-1!==d.indexOf("Chrome/"),i=-1!==d.indexOf("Opera/");return{USER_AGENT:d,supported:function(){var c=this.USER_AGENT.toLowerCase(),d="contentEditable"in e,f=document.execCommand&&document.queryCommandSupported&&document.queryCommandState,g=document.querySelector&&document.querySelectorAll,h=this.isIos()&&a(c)<5||this.isAndroid()&&b(c)<4||-1!==c.indexOf("opera mobi")||-1!==c.indexOf("hpwos/");return d&&f&&g&&!h},isTouchDevice:function(){return this.supportsEvent("touchmove")},isIos:function(){return/ipad|iphone|ipod/i.test(this.USER_AGENT)},isAndroid:function(){return-1!==this.USER_AGENT.indexOf("Android")},supportsSandboxedIframes:function(){return c()},throwsMixedContentWarningWhenIframeSrcIsEmpty:function(){return!("querySelector"in document)},displaysCaretInEmptyContentEditableCorrectly:function(){return c()},hasCurrentStyleProperty:function(){return"currentStyle"in e},hasHistoryIssue:function(){return f&&"Mac"===navigator.platform.substr(0,3)},insertsLineBreaksOnReturn:function(){return f},supportsPlaceholderAttributeOn:function(a){return"placeholder"in a},supportsEvent:function(a){return"on"+a in e||function(){return e.setAttribute("on"+a,"return;"),"function"==typeof e["on"+a]}()},supportsEventsInIframeCorrectly:function(){return!i},supportsHTML5Tags:function(a){var b=a.createElement("div"),c="<article>foo</article>";return b.innerHTML=c,b.innerHTML.toLowerCase()===c},supportsCommand:function(){var a={formatBlock:c(10,"<="),insertUnorderedList:c(),insertOrderedList:c()},b={insertHTML:f};return function(c,d){var e=a[d];if(!e){try{return c.queryCommandSupported(d)}catch(f){}try{return c.queryCommandEnabled(d)}catch(g){return!!b[d]}}return!1}}(),doesAutoLinkingInContentEditable:function(){return c()},canDisableAutoLinking:function(){return this.supportsCommand(document,"AutoUrlDetect")},clearsContentEditableCorrectly:function(){return f||i||g},supportsGetAttributeCorrectly:function(){var a=document.createElement("td");return"1"!=a.getAttribute("rowspan")},canSelectImagesInContentEditable:function(){return f||c()||i},autoScrollsToCaret:function(){return!g},autoClosesUnclosedTags:function(){var a,b,c=e.cloneNode(!1);return c.innerHTML="<p><div></div>",b=c.innerHTML.toLowerCase(),a="<p></p><div></div>"===b||"<p><div></div></p>"===b,this.autoClosesUnclosedTags=function(){return a},a},supportsNativeGetElementsByClassName:function(){return-1!==(document.getElementsByClassName+"").indexOf("[native code]")},supportsSelectionModify:function(){return"getSelection"in window&&"modify"in window.getSelection()},needsSpaceAfterLineBreak:function(){return i},supportsSpeechApiOn:function(a){var b=d.match(/Chrome\/(\d+)/)||[void 0,0];return b[1]>=11&&("onwebkitspeechchange"in a||"speech"in a)},crashesWhenDefineProperty:function(a){return c(9)&&("XMLHttpRequest"===a||"XDomainRequest"===a)},doesAsyncFocus:function(){return c()},hasProblemsSettingCaretAfterImg:function(){return c()},hasUndoInContextMenu:function(){return f||h||i},hasInsertNodeIssue:function(){return i},hasIframeFocusIssue:function(){return c()},createsNestedInvalidMarkupAfterPaste:function(){return g},supportsMutationEvents:function(){return"MutationEvent"in window},supportsModenPaste:function(){return!("clipboardData"in window)}}}(),wysihtml5.lang.array=function(a){return{contains:function(b){if(Array.isArray(b)){for(var c=b.length;c--;)if(-1!==wysihtml5.lang.array(a).indexOf(b[c]))return!0;return!1}return-1!==wysihtml5.lang.array(a).indexOf(b)},indexOf:function(b){if(a.indexOf)return a.indexOf(b);for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},without:function(b){b=wysihtml5.lang.array(b);for(var c=[],d=0,e=a.length;e>d;d++)b.contains(a[d])||c.push(a[d]);return c},get:function(){for(var b=0,c=a.length,d=[];c>b;b++)d.push(a[b]);return d},map:function(b,c){if(Array.prototype.map)return a.map(b,c);for(var d=a.length>>>0,e=Array(d),f=0;d>f;f++)e[f]=b.call(c,a[f],f,a);return e},unique:function(){for(var b=[],c=a.length,d=0;c>d;)wysihtml5.lang.array(b).contains(a[d])||b.push(a[d]),d++;return b}}},wysihtml5.lang.Dispatcher=Base.extend({on:function(a,b){return this.events=this.events||{},this.events[a]=this.events[a]||[],this.events[a].push(b),this},off:function(a,b){this.events=this.events||{};var c,d,e=0;if(a){for(c=this.events[a]||[],d=[];e<c.length;e++)c[e]!==b&&b&&d.push(c[e]);this.events[a]=d}else this.events={};return this},fire:function(a,b){this.events=this.events||{};for(var c=this.events[a]||[],d=0;d<c.length;d++)c[d].call(this,b);return this},observe:function(){return this.on.apply(this,arguments)},stopObserving:function(){return this.off.apply(this,arguments)}}),wysihtml5.lang.object=function(a){return{merge:function(b){for(var c in b)a[c]=b[c];return this},get:function(){return a},clone:function(b){var c,d={};if(null===a||!wysihtml5.lang.object(a).isPlainObject())return a;for(c in a)a.hasOwnProperty(c)&&(d[c]=b?wysihtml5.lang.object(a[c]).clone(b):a[c]);return d},isArray:function(){return"[object Array]"===Object.prototype.toString.call(a)},isFunction:function(){return"[object Function]"===Object.prototype.toString.call(a)},isPlainObject:function(){return"[object Object]"===Object.prototype.toString.call(a)}}},function(){var a=/^\s+/,b=/\s+$/,c=/[&<>\t"]/g,d={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"," ":"&nbsp; "};wysihtml5.lang.string=function(e){return e+="",{trim:function(){return e.replace(a,"").replace(b,"")},interpolate:function(a){for(var b in a)e=this.replace("#{"+b+"}").by(a[b]);return e},replace:function(a){return{by:function(b){return e.split(a).join(b)}}},escapeHTML:function(a,b){var f=e.replace(c,function(a){return d[a]});return a&&(f=f.replace(/(?:\r\n|\r|\n)/g,"<br />")),b&&(f=f.replace(/ /gi,"&nbsp; ")),f}}}}(),function(a){function b(a,b){return f(a,b)?a:(a===a.ownerDocument.documentElement&&(a=a.ownerDocument.body),g(a,b))}function c(a){return a.replace(i,function(a,b){var c,d,e=(b.match(j)||[])[1]||"",f=l[e];return b=b.replace(j,""),b.split(f).length>b.split(e).length&&(b+=e,e=""),c=b,d=b,b.length>k&&(d=d.substr(0,k)+"..."),"www."===c.substr(0,4)&&(c="http://"+c),'<a href="'+c+'">'+d+"</a>"+e})}function d(a){var b=a._wysihtml5_tempElement;return b||(b=a._wysihtml5_tempElement=a.createElement("div")),b}function e(b){var e=b.parentNode,f=a.lang.string(b.data).escapeHTML(),g=d(e.ownerDocument);for(g.innerHTML="<span></span>"+c(f),g.removeChild(g.firstChild);g.firstChild;)e.insertBefore(g.firstChild,b);e.removeChild(b)}function f(b,c){for(var d;b.parentNode;){if(b=b.parentNode,d=b.nodeName,b.className&&a.lang.array(b.className.split(" ")).contains(c))return!0;if(h.contains(d))return!0;if("body"===d)return!1}return!1}function g(b,c){if(!(h.contains(b.nodeName)||b.className&&a.lang.array(b.className.split(" ")).contains(c))){if(b.nodeType===a.TEXT_NODE&&b.data.match(i))return e(b),void 0;for(var d=a.lang.array(b.childNodes).get(),f=d.length,j=0;f>j;j++)g(d[j],c);return b}}var h=a.lang.array(["CODE","PRE","A","SCRIPT","HEAD","TITLE","STYLE"]),i=/((https?:\/\/|www\.)[^\s<]{3,})/gi,j=/([^\w\/\-](,?))$/i,k=100,l={")":"(","]":"[","}":"{"};a.dom.autoLink=b,a.dom.autoLink.URL_REG_EXP=i}(wysihtml5),function(a){var b=a.dom;b.addClass=function(a,c){var d=a.classList;return d?d.add(c):(b.hasClass(a,c)||(a.className+=" "+c),void 0)},b.removeClass=function(a,b){var c=a.classList;return c?c.remove(b):(a.className=a.className.replace(RegExp("(^|\\s+)"+b+"(\\s+|$)")," "),void 0)},b.hasClass=function(a,b){var c,d=a.classList;return d?d.contains(b):(c=a.className,c.length>0&&(c==b||RegExp("(^|\\s)"+b+"(\\s|$)").test(c)))}}(wysihtml5),wysihtml5.dom.contains=function(){var a=document.documentElement;return a.contains?function(a,b){return b.nodeType!==wysihtml5.ELEMENT_NODE&&(b=b.parentNode),a!==b&&a.contains(b)}:a.compareDocumentPosition?function(a,b){return!!(16&a.compareDocumentPosition(b))}:void 0}(),wysihtml5.dom.convertToList=function(){function a(a,b){var c=a.createElement("li");return b.appendChild(c),c}function b(a,b){return a.createElement(b)}function c(c,d,e){if("UL"===c.nodeName||"OL"===c.nodeName||"MENU"===c.nodeName)return c;var f,g,h,i,j,k,l,m,n,o=c.ownerDocument,p=b(o,d),q=c.querySelectorAll("br"),r=q.length;for(n=0;r>n;n++)for(i=q[n];(j=i.parentNode)&&j!==c&&j.lastChild===i;){if("block"===wysihtml5.dom.getStyle("display").from(j)){j.removeChild(i);break}wysihtml5.dom.insert(i).after(i.parentNode)}for(f=wysihtml5.lang.array(c.childNodes).get(),g=f.length,n=0;g>n;n++)m=m||a(o,p),h=f[n],k="block"===wysihtml5.dom.getStyle("display").from(h),l="BR"===h.nodeName,!k||e&&wysihtml5.dom.hasClass(h,e)?l?m=m.firstChild?null:m:m.appendChild(h):(m=m.firstChild?a(o,p):m,m.appendChild(h),m=null);return 0===f.length&&a(o,p),c.parentNode.replaceChild(p,c),p}return c}(),wysihtml5.dom.copyAttributes=function(a){return{from:function(b){return{to:function(c){for(var d,e=0,f=a.length;f>e;e++)d=a[e],void 0!==b[d]&&""!==b[d]&&(c[d]=b[d]);return{andTo:arguments.callee}}}}}},function(a){var b=["-webkit-box-sizing","-moz-box-sizing","-ms-box-sizing","box-sizing"],c=function(b){return d(b)?parseInt(a.getStyle("width").from(b),10)<b.offsetWidth:!1},d=function(c){for(var d=0,e=b.length;e>d;d++)if("border-box"===a.getStyle(b[d]).from(c))return b[d]};a.copyStyles=function(d){return{from:function(e){c(e)&&(d=wysihtml5.lang.array(d).without(b));for(var f,g="",h=d.length,i=0;h>i;i++)f=d[i],g+=f+":"+a.getStyle(f).from(e)+";";return{to:function(b){return a.setStyles(g).on(b),{andTo:arguments.callee}}}}}}}(wysihtml5.dom),function(a){a.dom.delegate=function(b,c,d,e){return a.dom.observe(b,d,function(d){for(var f=d.target,g=a.lang.array(b.querySelectorAll(c));f&&f!==b;){if(g.contains(f)){e.call(f,d);break}f=f.parentNode}})}}(wysihtml5),function(a){a.dom.domNode=function(b){var c=[a.ELEMENT_NODE,a.TEXT_NODE],d=function(b){return b.nodeType===a.TEXT_NODE&&/^\s*$/g.test(b.data)};return{prev:function(e){var f=b.previousSibling,g=e&&e.nodeTypes?e.nodeTypes:c;return f?!a.lang.array(g).contains(f.nodeType)||e&&e.ignoreBlankTexts&&d(f)?a.dom.domNode(f).prev(e):f:null},next:function(e){var f=b.nextSibling,g=e&&e.nodeTypes?e.nodeTypes:c;return f?!a.lang.array(g).contains(f.nodeType)||e&&e.ignoreBlankTexts&&d(f)?a.dom.domNode(f).next(e):f:null}}}}(wysihtml5),wysihtml5.dom.getAsDom=function(){var a=function(a,b){var c=b.createElement("div");c.style.display="none",b.body.appendChild(c);try{c.innerHTML=a}catch(d){}return b.body.removeChild(c),c},b=function(a){if(!a._wysihtml5_supportsHTML5Tags){for(var b=0,d=c.length;d>b;b++)a.createElement(c[b]);a._wysihtml5_supportsHTML5Tags=!0}},c=["abbr","article","aside","audio","bdi","canvas","command","datalist","details","figcaption","figure","footer","header","hgroup","keygen","mark","meter","nav","output","progress","rp","rt","ruby","svg","section","source","summary","time","track","video","wbr"];return function(c,d){d=d||document;var e;return"object"==typeof c&&c.nodeType?(e=d.createElement("div"),e.appendChild(c)):wysihtml5.browser.supportsHTML5Tags(d)?(e=d.createElement("div"),e.innerHTML=c):(b(d),e=a(c,d)),e}}(),wysihtml5.dom.getParentElement=function(){function a(a,b){return b&&b.length?"string"==typeof b?a===b:wysihtml5.lang.array(b).contains(a):!0}function b(a){return a.nodeType===wysihtml5.ELEMENT_NODE}function c(a,b,c){var d=(a.className||"").match(c)||[];return b?d[d.length-1]===b:!!d.length}function d(a,b,c){var d=(a.getAttribute("style")||"").match(c)||[];return b?d[d.length-1]===b:!!d.length}return function(e,f,g,h){var i=f.cssStyle||f.styleRegExp,j=f.className||f.classRegExp;for(g=g||50;g--&&e&&"BODY"!==e.nodeName&&(!h||e!==h);){if(b(e)&&a(e.nodeName,f.nodeName)&&(!i||d(e,f.cssStyle,f.styleRegExp))&&(!j||c(e,f.className,f.classRegExp)))return e;e=e.parentNode}return null}}(),wysihtml5.dom.getStyle=function(){function a(a){return a.replace(c,function(a){return a.charAt(1).toUpperCase() +})}var b={"float":"styleFloat"in document.createElement("div").style?"styleFloat":"cssFloat"},c=/\-[a-z]/g;return function(c){return{from:function(d){var e,f,g,h,i,j,k,l,m;if(d.nodeType===wysihtml5.ELEMENT_NODE){if(e=d.ownerDocument,f=b[c]||a(c),g=d.style,h=d.currentStyle,i=g[f],i)return i;if(h)try{return h[f]}catch(n){}return j=e.defaultView||e.parentWindow,k=("height"===c||"width"===c)&&"TEXTAREA"===d.nodeName,j.getComputedStyle?(k&&(l=g.overflow,g.overflow="hidden"),m=j.getComputedStyle(d,null).getPropertyValue(c),k&&(g.overflow=l||""),m):void 0}}}}}(),wysihtml5.dom.getTextNodes=function(a,b){var c=[];for(a=a.firstChild;a;a=a.nextSibling)3==a.nodeType?b&&/^\s*$/.test(a.innerText||a.textContent)||c.push(a):c=c.concat(wysihtml5.dom.getTextNodes(a,b));return c},wysihtml5.dom.hasElementWithTagName=function(){function a(a){return a._wysihtml5_identifier||(a._wysihtml5_identifier=c++)}var b={},c=1;return function(c,d){var e=a(c)+":"+d,f=b[e];return f||(f=b[e]=c.getElementsByTagName(d)),f.length>0}}(),function(a){function b(a){return a._wysihtml5_identifier||(a._wysihtml5_identifier=d++)}var c={},d=1;a.dom.hasElementWithClassName=function(d,e){if(!a.browser.supportsNativeGetElementsByClassName())return!!d.querySelector("."+e);var f=b(d)+":"+e,g=c[f];return g||(g=c[f]=d.getElementsByClassName(e)),g.length>0}}(wysihtml5),wysihtml5.dom.insert=function(a){return{after:function(b){b.parentNode.insertBefore(a,b.nextSibling)},before:function(b){b.parentNode.insertBefore(a,b)},into:function(b){b.appendChild(a)}}},wysihtml5.dom.insertCSS=function(a){return a=a.join("\n"),{into:function(b){var c,d,e=b.createElement("style");return e.type="text/css",e.styleSheet?e.styleSheet.cssText=a:e.appendChild(b.createTextNode(a)),c=b.querySelector("head link"),c?(c.parentNode.insertBefore(e,c),void 0):(d=b.querySelector("head"),d&&d.appendChild(e),void 0)}}},function(a){a.dom.lineBreaks=function(b){function c(a){return"BR"===a.nodeName}function d(b){return c(b)?!0:"block"===a.dom.getStyle("display").from(b)?!0:!1}return{add:function(){var c=b.ownerDocument,e=a.dom.domNode(b).next({ignoreBlankTexts:!0}),f=a.dom.domNode(b).prev({ignoreBlankTexts:!0});e&&!d(e)&&a.dom.insert(c.createElement("br")).after(b),f&&!d(f)&&a.dom.insert(c.createElement("br")).before(b)},remove:function(){var d=a.dom.domNode(b).next({ignoreBlankTexts:!0}),e=a.dom.domNode(b).prev({ignoreBlankTexts:!0});d&&c(d)&&d.parentNode.removeChild(d),e&&c(e)&&e.parentNode.removeChild(e)}}}}(wysihtml5),wysihtml5.dom.observe=function(a,b,c){b="string"==typeof b?[b]:b;for(var d,e,f=0,g=b.length;g>f;f++)e=b[f],a.addEventListener?a.addEventListener(e,c,!1):(d=function(b){"target"in b||(b.target=b.srcElement),b.preventDefault=b.preventDefault||function(){this.returnValue=!1},b.stopPropagation=b.stopPropagation||function(){this.cancelBubble=!0},c.call(a,b)},a.attachEvent("on"+e,d));return{stop:function(){for(var e,f=0,g=b.length;g>f;f++)e=b[f],a.removeEventListener?a.removeEventListener(e,c,!1):a.detachEvent("on"+e,d)}}},wysihtml5.dom.parse=function(a,b){function c(a,b){var c,f,g,h,i,j,k,l,m;for(wysihtml5.lang.object(t).merge(s).merge(b.rules).get(),c=b.context||a.ownerDocument||document,f=c.createDocumentFragment(),g="string"==typeof a,h=!1,b.clearInternals===!0&&(h=!0),i=g?wysihtml5.dom.getAsDom(a,c):a,t.selectors&&e(i,t.selectors);i.firstChild;)k=i.firstChild,j=d(k,b.cleanUp,h,b.uneditableClass),j&&f.appendChild(j),k!==j&&i.removeChild(k);if(b.unjoinNbsps)for(l=wysihtml5.dom.getTextNodes(f),m=l.length;m--;)l[m].nodeValue=l[m].nodeValue.replace(/([\S\u00A0])\u00A0/gi,"$1 ");return i.innerHTML="",i.appendChild(f),g?wysihtml5.quirks.getCorrectInnerHTML(i):i}function d(a,b,c,e){var f,g,h,i=a.nodeType,j=a.childNodes,k=j.length,l=p[i],m=0;if(e&&1===i&&wysihtml5.dom.hasClass(a,e))return a;if(g=l&&l(a,c),!g){if(g===!1){for(f=a.ownerDocument.createDocumentFragment(),m=k;m--;)j[m]&&(h=d(j[m],b,c,e),h&&(j[m]===h&&m--,f.insertBefore(h,f.firstChild)));return"block"===wysihtml5.dom.getStyle("display").from(a)&&f.appendChild(a.ownerDocument.createElement("br")),wysihtml5.lang.array(["div","pre","p","table","td","th","ul","ol","li","dd","dl","footer","header","section","h1","h2","h3","h4","h5","h6"]).contains(a.nodeName.toLowerCase())&&a.parentNode.lastChild!==a&&(a.nextSibling&&3===a.nextSibling.nodeType&&/^\s/.test(a.nextSibling.nodeValue)||f.appendChild(a.ownerDocument.createTextNode(" "))),f.normalize&&f.normalize(),f}return null}for(m=0;k>m;m++)j[m]&&(h=d(j[m],b,c,e),h&&(j[m]===h&&m--,g.appendChild(h)));if(b&&g.nodeName.toLowerCase()===q&&(!g.childNodes.length||/^\s*$/gi.test(g.innerHTML)&&(c||"_wysihtml5-temp-placeholder"!==a.className&&"rangySelectionBoundary"!==a.className)||!g.attributes.length)){for(f=g.ownerDocument.createDocumentFragment();g.firstChild;)f.appendChild(g.firstChild);return f.normalize&&f.normalize(),f}return g.normalize&&g.normalize(),g}function e(a,b){var c,d,e,f;for(c in b)if(b.hasOwnProperty(c))for(wysihtml5.lang.object(b[c]).isFunction()?d=b[c]:"string"==typeof b[c]&&z[b[c]]&&(d=z[b[c]]),e=a.querySelectorAll(c),f=e.length;f--;)d(e[f])}function f(a,b){var c,d,e,f=t.tags,h=a.nodeName.toLowerCase(),j=a.scopeName;if(a._wysihtml5)return null;if(a._wysihtml5=1,"wysihtml5-temp"===a.className)return null;if(j&&"HTML"!=j&&(h=j+":"+h),"outerHTML"in a&&(wysihtml5.browser.autoClosesUnclosedTags()||"P"!==a.nodeName||"</p>"===a.outerHTML.slice(-4).toLowerCase()||(h="div")),h in f){if(c=f[h],!c||c.remove)return null;if(c.unwrap)return!1;c="string"==typeof c?{rename_tag:c}:c}else{if(!a.firstChild)return null;c={rename_tag:q}}if(c.one_of_type&&!g(a,t,c.one_of_type,b)){if(!c.remove_action)return null;if("unwrap"===c.remove_action)return!1;if("rename"!==c.remove_action)return null;e=c.remove_action_rename_to||q}return d=a.ownerDocument.createElement(e||c.rename_tag||h),m(a,d,c,b),i(a,d,c),a=null,d.normalize&&d.normalize(),d}function g(a,b,c,d){var e,f;if("SPAN"===a.nodeName&&!d&&("_wysihtml5-temp-placeholder"===a.className||"rangySelectionBoundary"===a.className))return!0;for(f in c)if(c.hasOwnProperty(f)&&b.type_definitions&&b.type_definitions[f]&&(e=b.type_definitions[f],h(a,e)))return!0;return!1}function h(a,b){var c,d,e,f,g,h,i,j,k=a.getAttribute("class"),l=a.getAttribute("style");if(b.methods)for(h in b.methods)if(b.methods.hasOwnProperty(h)&&y[h]&&y[h](a))return!0;if(k&&b.classes)for(k=k.replace(/^\s+/g,"").replace(/\s+$/g,"").split(r),c=k.length,i=0;c>i;i++)if(b.classes[k[i]])return!0;if(l&&b.styles){l=l.split(";");for(d in b.styles)if(b.styles.hasOwnProperty(d))for(j=l.length;j--;)if(g=l[j].split(":"),g[0].replace(/\s/g,"").toLowerCase()===d&&(b.styles[d]===!0||1===b.styles[d]||wysihtml5.lang.array(b.styles[d]).contains(g[1].replace(/\s/g,"").toLowerCase())))return!0}if(b.attrs)for(e in b.attrs)if(b.attrs.hasOwnProperty(e)&&(f=wysihtml5.dom.getAttribute(a,e),"string"==typeof f&&f.search(b.attrs[e])>-1))return!0;return!1}function i(a,b,c){var d,e;if(c&&c.keep_styles)for(d in c.keep_styles)if(c.keep_styles.hasOwnProperty(d)){if(e="float"===d?a.style.styleFloat||a.style.cssFloat:a.style[d],c.keep_styles[d]instanceof RegExp&&!c.keep_styles[d].test(e))continue;"float"===d?b.style[a.style.styleFloat?"styleFloat":"cssFloat"]=e:a.style[d]&&(b.style[d]=e)}}function j(a,b){var c,d=[];for(c in b)b.hasOwnProperty(c)&&0===c.indexOf(a)&&d.push(c);return d}function k(a,b,c,d){var e,f=v[c];return f&&(b||"alt"===a&&"IMG"==d)&&(e=f(b),"string"==typeof e)?e:!1}function l(a,b){var c,d,e,f,g,h=wysihtml5.lang.object(t.attributes||{}).clone(),i=wysihtml5.lang.object(h).merge(wysihtml5.lang.object(b||{}).clone()).get(),l={},m=wysihtml5.dom.getAttributes(a);for(c in i)if(/\*$/.test(c))for(e=j(c.slice(0,-1),m),f=0,g=e.length;g>f;f++)d=k(e[f],m[e[f]],i[c],a.nodeName),d!==!1&&(l[e[f]]=d);else d=k(c,m[c],i[c],a.nodeName),d!==!1&&(l[c]=d);return l}function m(a,b,c,d){var e,f,g,h,i,j={},k=c.set_class,m=c.add_class,n=c.add_style,o=c.set_attributes,p=t.classes,q=0,s=[],u=[],v=[],y=[];if(o&&(j=wysihtml5.lang.object(o).clone()),j=wysihtml5.lang.object(j).merge(l(a,c.check_attributes)).get(),k&&s.push(k),m)for(h in m)i=x[m[h]],i&&(g=i(wysihtml5.dom.getAttribute(a,h)),"string"==typeof g&&s.push(g));if(n)for(h in n)i=w[n[h]],i&&(newStyle=i(wysihtml5.dom.getAttribute(a,h)),"string"==typeof newStyle&&u.push(newStyle));if("string"==typeof p&&"any"===p&&a.getAttribute("class"))if(t.classes_blacklist){for(y=a.getAttribute("class"),y&&(s=s.concat(y.split(r))),e=s.length;e>q;q++)f=s[q],t.classes_blacklist[f]||v.push(f);v.length&&(j["class"]=wysihtml5.lang.array(v).unique().join(" "))}else j["class"]=a.getAttribute("class");else{for(d||(p["_wysihtml5-temp-placeholder"]=1,p._rangySelectionBoundary=1,p["wysiwyg-tmp-selected-cell"]=1),y=a.getAttribute("class"),y&&(s=s.concat(y.split(r))),e=s.length;e>q;q++)f=s[q],p[f]&&v.push(f);v.length&&(j["class"]=wysihtml5.lang.array(v).unique().join(" "))}j["class"]&&d&&(j["class"]=j["class"].replace("wysiwyg-tmp-selected-cell",""),/^\s*$/g.test(j["class"])&&delete j["class"]),u.length&&(j.style=wysihtml5.lang.array(u).unique().join(" "));for(h in j)try{b.setAttribute(h,j[h])}catch(z){}j.src&&(void 0!==j.width&&b.setAttribute("width",j.width),void 0!==j.height&&b.setAttribute("height",j.height))}function n(a){var b,c=a.nextSibling;return c&&c.nodeType===wysihtml5.TEXT_NODE?(c.data=a.data.replace(u,"")+c.data.replace(u,""),void 0):(b=a.data.replace(u,""),a.ownerDocument.createTextNode(b))}function o(a){return t.comments?a.ownerDocument.createComment(a.nodeValue):void 0}var p={1:f,3:n,8:o},q="span",r=/\s+/,s={tags:{},classes:{}},t={},u=/\uFEFF/g,v={url:function(){var a=/^https?:\/\//i;return function(b){return b&&b.match(a)?b.replace(a,function(a){return a.toLowerCase()}):null}}(),src:function(){var a=/^(\/|https?:\/\/)/i;return function(b){return b&&b.match(a)?b.replace(a,function(a){return a.toLowerCase()}):null}}(),href:function(){var a=/^(#|\/|https?:\/\/|mailto:)/i;return function(b){return b&&b.match(a)?b.replace(a,function(a){return a.toLowerCase()}):null}}(),alt:function(){var a=/[^ a-z0-9_\-]/gi;return function(b){return b?b.replace(a,""):""}}(),numbers:function(){var a=/\D/g;return function(b){return b=(b||"").replace(a,""),b||null}}(),any:function(){return function(a){return a}}()},w={align_text:function(){var a={left:"text-align: left;",right:"text-align: right;",center:"text-align: center;"};return function(b){return a[(b+"").toLowerCase()]}}()},x={align_img:function(){var a={left:"wysiwyg-float-left",right:"wysiwyg-float-right"};return function(b){return a[(b+"").toLowerCase()]}}(),align_text:function(){var a={left:"wysiwyg-text-align-left",right:"wysiwyg-text-align-right",center:"wysiwyg-text-align-center",justify:"wysiwyg-text-align-justify"};return function(b){return a[(b+"").toLowerCase()]}}(),clear_br:function(){var a={left:"wysiwyg-clear-left",right:"wysiwyg-clear-right",both:"wysiwyg-clear-both",all:"wysiwyg-clear-both"};return function(b){return a[(b+"").toLowerCase()]}}(),size_font:function(){var a={1:"wysiwyg-font-size-xx-small",2:"wysiwyg-font-size-small",3:"wysiwyg-font-size-medium",4:"wysiwyg-font-size-large",5:"wysiwyg-font-size-x-large",6:"wysiwyg-font-size-xx-large",7:"wysiwyg-font-size-xx-large","-":"wysiwyg-font-size-smaller","+":"wysiwyg-font-size-larger"};return function(b){return a[(b+"").charAt(0)]}}()},y={has_visible_contet:function(){var a,b=["img","video","picture","br","script","noscript","style","table","iframe","object","embed","audio","svg","input","button","select","textarea","canvas"];return function(c){if(a=(c.innerText||c.textContent).replace(/\s/g,""),a&&a.length>0)return!0;for(var d=b.length;d--;)if(c.querySelector(b[d]))return!0;return c.offsetWidth&&c.offsetWidth>0&&c.offsetHeight&&c.offsetHeight>0?!0:!1}}()},z={unwrap:function(a){wysihtml5.dom.unwrap(a)},remove:function(a){a.parentNode.removeChild(a)}};return c(a,b)},wysihtml5.dom.removeEmptyTextNodes=function(a){for(var b,c=wysihtml5.lang.array(a.childNodes).get(),d=c.length,e=0;d>e;e++)b=c[e],b.nodeType===wysihtml5.TEXT_NODE&&""===b.data&&b.parentNode.removeChild(b)},wysihtml5.dom.renameElement=function(a,b){for(var c,d=a.ownerDocument.createElement(b);c=a.firstChild;)d.appendChild(c);return wysihtml5.dom.copyAttributes(["align","className"]).from(a).to(d),a.parentNode.replaceChild(d,a),d},wysihtml5.dom.replaceWithChildNodes=function(a){if(a.parentNode){if(!a.firstChild)return a.parentNode.removeChild(a),void 0;for(var b=a.ownerDocument.createDocumentFragment();a.firstChild;)b.appendChild(a.firstChild);a.parentNode.replaceChild(b,a),a=b=null}},function(a){function b(b){return"block"===a.getStyle("display").from(b)}function c(a){return"BR"===a.nodeName}function d(a){var b=a.ownerDocument.createElement("br");a.appendChild(b)}function e(a,e){if(a.nodeName.match(/^(MENU|UL|OL)$/)){var f,g,h,i,j,k,l=a.ownerDocument,m=l.createDocumentFragment(),n=wysihtml5.dom.domNode(a).prev({ignoreBlankTexts:!0});if(e)for(!n||b(n)||c(n)||d(m);k=a.firstElementChild||a.firstChild;){for(g=k.lastChild;f=k.firstChild;)h=f===g,i=h&&!b(f)&&!c(f),m.appendChild(f),i&&d(m);k.parentNode.removeChild(k)}else for(;k=a.firstElementChild||a.firstChild;){if(k.querySelector&&k.querySelector("div, p, ul, ol, menu, blockquote, h1, h2, h3, h4, h5, h6"))for(;f=k.firstChild;)m.appendChild(f);else{for(j=l.createElement("p");f=k.firstChild;)j.appendChild(f);m.appendChild(j)}k.parentNode.removeChild(k)}a.parentNode.replaceChild(m,a)}}a.resolveList=e}(wysihtml5.dom),function(a){var b=document,c=["parent","top","opener","frameElement","frames","localStorage","globalStorage","sessionStorage","indexedDB"],d=["open","close","openDialog","showModalDialog","alert","confirm","prompt","openDatabase","postMessage","XMLHttpRequest","XDomainRequest"],e=["referrer","write","open","close"];a.dom.Sandbox=Base.extend({constructor:function(b,c){this.callback=b||a.EMPTY_FUNCTION,this.config=a.lang.object({}).merge(c).get(),this.editableArea=this._createIframe()},insertInto:function(a){"string"==typeof a&&(a=b.getElementById(a)),a.appendChild(this.editableArea)},getIframe:function(){return this.editableArea},getWindow:function(){this._readyError()},getDocument:function(){this._readyError()},destroy:function(){var a=this.getIframe();a.parentNode.removeChild(a)},_readyError:function(){throw Error("wysihtml5.Sandbox: Sandbox iframe isn't loaded yet")},_createIframe:function(){var c=this,d=b.createElement("iframe");return d.className="wysihtml5-sandbox",a.dom.setAttributes({security:"restricted",allowtransparency:"true",frameborder:0,width:0,height:0,marginwidth:0,marginheight:0}).on(d),a.browser.throwsMixedContentWarningWhenIframeSrcIsEmpty()&&(d.src="javascript:'<html></html>'"),d.onload=function(){d.onreadystatechange=d.onload=null,c._onLoadIframe(d)},d.onreadystatechange=function(){/loaded|complete/.test(d.readyState)&&(d.onreadystatechange=d.onload=null,c._onLoadIframe(d))},d},_onLoadIframe:function(f){var g,h,i,j,k,l,m;if(a.dom.contains(b.documentElement,f)){if(g=this,h=f.contentWindow,i=f.contentWindow.document,j=b.characterSet||b.charset||"utf-8",k=this._getHtml({charset:j,stylesheets:this.config.stylesheets}),i.open("text/html","replace"),i.write(k),i.close(),this.getWindow=function(){return f.contentWindow},this.getDocument=function(){return f.contentWindow.document},h.onerror=function(a,b,c){throw Error("wysihtml5.Sandbox: "+a,b,c)},!a.browser.supportsSandboxedIframes()){for(l=0,m=c.length;m>l;l++)this._unset(h,c[l]);for(l=0,m=d.length;m>l;l++)this._unset(h,d[l],a.EMPTY_FUNCTION);for(l=0,m=e.length;m>l;l++)this._unset(i,e[l]);this._unset(i,"cookie","",!0)}this.loaded=!0,setTimeout(function(){g.callback(g)},0)}},_getHtml:function(b){var c,d=b.stylesheets,e="",f=0;if(d="string"==typeof d?[d]:d,d)for(c=d.length;c>f;f++)e+='<link rel="stylesheet" href="'+d[f]+'">';return b.stylesheets=e,a.lang.string('<!DOCTYPE html><html><head><meta charset="#{charset}">#{stylesheets}</head><body></body></html>').interpolate(b)},_unset:function(b,c,d,e){try{b[c]=d}catch(f){}try{b.__defineGetter__(c,function(){return d})}catch(f){}if(e)try{b.__defineSetter__(c,function(){})}catch(f){}if(!a.browser.crashesWhenDefineProperty(c))try{var g={get:function(){return d}};e&&(g.set=function(){}),Object.defineProperty(b,c,g)}catch(f){}}})}(wysihtml5),function(a){var b=document;a.dom.ContentEditableArea=Base.extend({getContentEditable:function(){return this.element},getWindow:function(){return this.element.ownerDocument.defaultView},getDocument:function(){return this.element.ownerDocument},constructor:function(b,c,d){this.callback=b||a.EMPTY_FUNCTION,this.config=a.lang.object({}).merge(c).get(),this.element=d?this._bindElement(d):this._createElement()},_createElement:function(){var a=b.createElement("div");return a.className="wysihtml5-sandbox",this._loadElement(a),a},_bindElement:function(a){return a.className=a.className&&""!=a.className?a.className+" wysihtml5-sandbox":"wysihtml5-sandbox",this._loadElement(a,!0),a},_loadElement:function(a,b){var c,d=this;b||(c=this._getHtml(),a.innerHTML=c),this.getWindow=function(){return a.ownerDocument.defaultView},this.getDocument=function(){return a.ownerDocument},this.loaded=!0,setTimeout(function(){d.callback(d)},0)},_getHtml:function(){return""}})}(wysihtml5),function(){var a={className:"class"};wysihtml5.dom.setAttributes=function(b){return{on:function(c){for(var d in b)c.setAttribute(a[d]||d,b[d])}}}}(),wysihtml5.dom.setStyles=function(a){return{on:function(b){var c,d=b.style;if("string"==typeof a)return d.cssText+=";"+a,void 0;for(c in a)"float"===c?(d.cssFloat=a[c],d.styleFloat=a[c]):d[c]=a[c]}}},function(a){a.simulatePlaceholder=function(b,c,d){var e="placeholder",f=function(){var b=c.element.offsetWidth>0&&c.element.offsetHeight>0;c.hasPlaceholderSet()&&(c.clear(),c.element.focus(),b&&setTimeout(function(){var a=c.selection.getSelection();a.focusNode&&a.anchorNode||c.selection.selectNode(c.element.firstChild||c.element)},0)),c.placeholderSet=!1,a.removeClass(c.element,e)},g=function(){c.isEmpty()&&(c.placeholderSet=!0,c.setValue(d),a.addClass(c.element,e))};b.on("set_placeholder",g).on("unset_placeholder",f).on("focus:composer",f).on("paste:composer",f).on("blur:composer",g),g()}}(wysihtml5.dom),function(a){var b=document.documentElement;"textContent"in b?(a.setTextContent=function(a,b){a.textContent=b},a.getTextContent=function(a){return a.textContent}):"innerText"in b?(a.setTextContent=function(a,b){a.innerText=b},a.getTextContent=function(a){return a.innerText}):(a.setTextContent=function(a,b){a.nodeValue=b},a.getTextContent=function(a){return a.nodeValue})}(wysihtml5.dom),wysihtml5.dom.getAttribute=function(a,b){var c,d,e,f=!wysihtml5.browser.supportsGetAttributeCorrectly();return b=b.toLowerCase(),c=a.nodeName,"IMG"==c&&"src"==b&&wysihtml5.dom.isLoadedImage(a)===!0?a.src:f&&"outerHTML"in a?(d=a.outerHTML.toLowerCase(),e=-1!=d.indexOf(" "+b+"="),e?a.getAttribute(b):null):a.getAttribute(b)},wysihtml5.dom.getAttributes=function(a){var b,c=!wysihtml5.browser.supportsGetAttributeCorrectly(),d=a.nodeName,e=[];for(b in a.attributes)(a.attributes.hasOwnProperty&&a.attributes.hasOwnProperty(b)||!a.attributes.hasOwnProperty&&Object.prototype.hasOwnProperty.call(a.attributes,b))&&a.attributes[b].specified&&("IMG"==d&&"src"==a.attributes[b].name.toLowerCase()&&wysihtml5.dom.isLoadedImage(a)===!0?e.src=a.src:wysihtml5.lang.array(["rowspan","colspan"]).contains(a.attributes[b].name.toLowerCase())&&c?1!==a.attributes[b].value&&(e[a.attributes[b].name]=a.attributes[b].value):e[a.attributes[b].name]=a.attributes[b].value);return e},wysihtml5.dom.isLoadedImage=function(a){try{return a.complete&&!a.mozMatchesSelector(":-moz-broken")}catch(b){if(a.complete&&"complete"===a.readyState)return!0}},function(a){function b(a,b){var c,d,e,f,g=[];for(d=0,e=a.length;e>d;d++)if(c=a[d].querySelectorAll(b),c)for(f=c.length;f--;g.unshift(c[f]));return g}function d(a){a.parentNode.removeChild(a)}function e(a,b){a.parentNode.insertBefore(b,a.nextSibling)}function f(a,b){for(var c=a.nextSibling;1!=c.nodeType;)if(c=c.nextSibling,!b||b==c.tagName.toLowerCase())return c;return null}var g=a.dom,h=function(a){this.el=a,this.isColspan=!1,this.isRowspan=!1,this.firstCol=!0,this.lastCol=!0,this.firstRow=!0,this.lastRow=!0,this.isReal=!0,this.spanCollection=[],this.modified=!1},i=function(a,b){a?(this.cell=a,this.table=g.getParentElement(a,{nodeName:["TABLE"]})):b&&(this.table=b,this.cell=this.table.querySelectorAll("th, td")[0])};i.prototype={addSpannedCellToMap:function(a,b,c,d,e,f){var g,i,j=[],k=c+(f?parseInt(f,10)-1:0),l=d+(e?parseInt(e,10)-1:0);for(g=c;k>=g;g++)for(void 0===b[g]&&(b[g]=[]),i=d;l>=i;i++)b[g][i]=new h(a),b[g][i].isColspan=e&&parseInt(e,10)>1,b[g][i].isRowspan=f&&parseInt(f,10)>1,b[g][i].firstCol=i==d,b[g][i].lastCol=i==l,b[g][i].firstRow=g==c,b[g][i].lastRow=g==k,b[g][i].isReal=i==d&&g==c,b[g][i].spanCollection=j,j.push(b[g][i])},setCellAsModified:function(a){if(a.modified=!0,a.spanCollection.length>0)for(var b=0,c=a.spanCollection.length;c>b;b++)a.spanCollection[b].modified=!0},setTableMap:function(){var a,b,c,d,e,f,i,j,k=[],l=this.getTableRows();for(a=0;a<l.length;a++)for(b=l[a],c=this.getRowCells(b),f=0,void 0===k[a]&&(k[a]=[]),d=0;d<c.length;d++){for(e=c[d];void 0!==k[a][f];)f++;i=g.getAttribute(e,"colspan"),j=g.getAttribute(e,"rowspan"),i||j?(this.addSpannedCellToMap(e,k,a,f,i,j),f+=i?parseInt(i,10):1):(k[a][f]=new h(e),f++)}return this.map=k,k},getRowCells:function(c){var d=this.table.querySelectorAll("table"),e=d?b(d,"th, td"):[],f=c.querySelectorAll("th, td"),g=e.length>0?a.lang.array(f).without(e):f;return g},getTableRows:function(){var c=this.table.querySelectorAll("table"),d=c?b(c,"tr"):[],e=this.table.querySelectorAll("tr"),f=d.length>0?a.lang.array(e).without(d):e;return f},getMapIndex:function(a){var b,c,d=this.map.length,e=this.map&&this.map[0]?this.map[0].length:0;for(b=0;d>b;b++)for(c=0;e>c;c++)if(this.map[b][c].el===a)return{row:b,col:c};return!1},getElementAtIndex:function(a){return this.setTableMap(),this.map[a.row]&&this.map[a.row][a.col]&&this.map[a.row][a.col].el?this.map[a.row][a.col].el:null},getMapElsTo:function(a){var b,c,d,e,f,g,h=[];if(this.setTableMap(),this.idx_start=this.getMapIndex(this.cell),this.idx_end=this.getMapIndex(a),(this.idx_start.row>this.idx_end.row||this.idx_start.row==this.idx_end.row&&this.idx_start.col>this.idx_end.col)&&(b=this.idx_start,this.idx_start=this.idx_end,this.idx_end=b),this.idx_start.col>this.idx_end.col&&(c=this.idx_start.col,this.idx_start.col=this.idx_end.col,this.idx_end.col=c),null!=this.idx_start&&null!=this.idx_end)for(d=this.idx_start.row,e=this.idx_end.row;e>=d;d++)for(f=this.idx_start.col,g=this.idx_end.col;g>=f;f++)h.push(this.map[d][f].el);return h},orderSelectionEnds:function(a){var b,c;return this.setTableMap(),this.idx_start=this.getMapIndex(this.cell),this.idx_end=this.getMapIndex(a),(this.idx_start.row>this.idx_end.row||this.idx_start.row==this.idx_end.row&&this.idx_start.col>this.idx_end.col)&&(b=this.idx_start,this.idx_start=this.idx_end,this.idx_end=b),this.idx_start.col>this.idx_end.col&&(c=this.idx_start.col,this.idx_start.col=this.idx_end.col,this.idx_end.col=c),{start:this.map[this.idx_start.row][this.idx_start.col].el,end:this.map[this.idx_end.row][this.idx_end.col].el}},createCells:function(a,b,c){var d,e,f,g=this.table.ownerDocument,h=g.createDocumentFragment();for(e=0;b>e;e++){if(d=g.createElement(a),c)for(f in c)c.hasOwnProperty(f)&&d.setAttribute(f,c[f]);d.appendChild(document.createTextNode(" ")),h.appendChild(d)}return h},correctColIndexForUnreals:function(a,b){var c,d,e=this.map[b],f=-1;for(c=0,d=a;a>c;c++)e[c].isReal&&f++;return f},getLastNewCellOnRow:function(a,b){var c,d,e,f,g=this.getRowCells(a);for(e=0,f=g.length;f>e;e++)if(c=g[e],d=this.getMapIndex(c),d===!1||void 0!==b&&d.row!=b)return c;return null},removeEmptyTable:function(){var a=this.table.querySelectorAll("td, th");return a&&0!=a.length?!1:(d(this.table),!0)},splitRowToCells:function(a){var b,c,d;a.isColspan&&(b=parseInt(g.getAttribute(a.el,"colspan")||1,10),c=a.el.tagName.toLowerCase(),b>1&&(d=this.createCells(c,b-1),e(a.el,d)),a.el.removeAttribute("colspan"))},getRealRowEl:function(a,b){var c,d,e=null,f=null;for(b=b||this.idx,c=0,d=this.map[b.row].length;d>c;c++)if(f=this.map[b.row][c],f.isReal&&(e=g.getParentElement(f.el,{nodeName:["TR"]}),e))return e;return null===e&&a&&(e=g.getParentElement(this.map[b.row][b.col].el,{nodeName:["TR"]})||null),e},injectRowAt:function(a,b,c,d,f){var h,i,j=this.getRealRowEl(!1,{row:a,col:b}),k=this.createCells(d,c);j?(h=this.correctColIndexForUnreals(b,a),h>=0?e(this.getRowCells(j)[h],k):j.insertBefore(k,j.firstChild)):(i=this.table.ownerDocument.createElement("tr"),i.appendChild(k),e(g.getParentElement(f.el,{nodeName:["TR"]}),i))},canMerge:function(a){var b,c,d,e,f,g;for(this.to=a,this.setTableMap(),this.idx_start=this.getMapIndex(this.cell),this.idx_end=this.getMapIndex(this.to),(this.idx_start.row>this.idx_end.row||this.idx_start.row==this.idx_end.row&&this.idx_start.col>this.idx_end.col)&&(b=this.idx_start,this.idx_start=this.idx_end,this.idx_end=b),this.idx_start.col>this.idx_end.col&&(c=this.idx_start.col,this.idx_start.col=this.idx_end.col,this.idx_end.col=c),d=this.idx_start.row,e=this.idx_end.row;e>=d;d++)for(f=this.idx_start.col,g=this.idx_end.col;g>=f;f++)if(this.map[d][f].isColspan||this.map[d][f].isRowspan)return!1;return!0},decreaseCellSpan:function(a,b){var c=parseInt(g.getAttribute(a.el,b),10)-1;c>=1?a.el.setAttribute(b,c):(a.el.removeAttribute(b),"colspan"==b&&(a.isColspan=!1),"rowspan"==b&&(a.isRowspan=!1),a.firstCol=!0,a.lastCol=!0,a.firstRow=!0,a.lastRow=!0,a.isReal=!0)},removeSurplusLines:function(){var a,b,c,e,f,h,i,j;if(this.setTableMap(),this.map){for(c=0,e=this.map.length;e>c;c++){for(a=this.map[c],i=!0,f=0,h=a.length;h>f;f++)if(b=a[f],!(g.getAttribute(b.el,"rowspan")&&parseInt(g.getAttribute(b.el,"rowspan"),10)>1&&b.firstRow!==!0)){i=!1;break}if(i)for(f=0;h>f;f++)this.decreaseCellSpan(a[f],"rowspan")}for(j=this.getTableRows(),c=0,e=j.length;e>c;c++)a=j[c],0==a.childNodes.length&&/^\s*$/.test(a.textContent||a.innerText)&&d(a)}},fillMissingCells:function(){var a,b,c,d=0,f=0,g=null;if(this.setTableMap(),this.map){for(d=this.map.length,a=0;d>a;a++)this.map[a].length>f&&(f=this.map[a].length);for(b=0;d>b;b++)for(c=0;f>c;c++)this.map[b]&&!this.map[b][c]&&c>0&&(this.map[b][c]=new h(this.createCells("td",1)),g=this.map[b][c-1],g&&g.el&&g.el.parent&&e(this.map[b][c-1].el,this.map[b][c].el))}},rectify:function(){return this.removeEmptyTable()?!1:(this.removeSurplusLines(),this.fillMissingCells(),!0)},unmerge:function(){var a,b,c,d,e,f;if(this.rectify()&&(this.setTableMap(),this.idx=this.getMapIndex(this.cell),this.idx)){if(a=this.map[this.idx.row][this.idx.col],b=g.getAttribute(a.el,"colspan")?parseInt(g.getAttribute(a.el,"colspan"),10):1,c=a.el.tagName.toLowerCase(),a.isRowspan){if(d=parseInt(g.getAttribute(a.el,"rowspan"),10),d>1)for(e=1,f=d-1;f>=e;e++)this.injectRowAt(this.idx.row+e,this.idx.col,b,c,a);a.el.removeAttribute("rowspan")}this.splitRowToCells(a)}},merge:function(a){var b,c,e,f,g,h;if(this.rectify())if(this.canMerge(a)){for(b=this.idx_end.row-this.idx_start.row+1,c=this.idx_end.col-this.idx_start.col+1,e=this.idx_start.row,f=this.idx_end.row;f>=e;e++)for(g=this.idx_start.col,h=this.idx_end.col;h>=g;g++)e==this.idx_start.row&&g==this.idx_start.col?(b>1&&this.map[e][g].el.setAttribute("rowspan",b),c>1&&this.map[e][g].el.setAttribute("colspan",c)):(/^\s*<br\/?>\s*$/.test(this.map[e][g].el.innerHTML.toLowerCase())||(this.map[this.idx_start.row][this.idx_start.col].el.innerHTML+=" "+this.map[e][g].el.innerHTML),d(this.map[e][g].el));this.rectify()}else window.console&&void 0},collapseCellToNextRow:function(a){var b,c,d,f=this.getMapIndex(a.el),h=f.row+1,i={row:h,col:f.col};h<this.map.length&&(b=this.getRealRowEl(!1,i),null!==b&&(c=this.correctColIndexForUnreals(i.col,i.row),c>=0?e(this.getRowCells(b)[c],a.el):(d=this.getLastNewCellOnRow(b,h),null!==d?e(d,a.el):b.insertBefore(a.el,b.firstChild)),parseInt(g.getAttribute(a.el,"rowspan"),10)>2?a.el.setAttribute("rowspan",parseInt(g.getAttribute(a.el,"rowspan"),10)-1):a.el.removeAttribute("rowspan")))},removeRowCell:function(a){a.isReal?a.isRowspan?this.collapseCellToNextRow(a):d(a.el):parseInt(g.getAttribute(a.el,"rowspan"),10)>2?a.el.setAttribute("rowspan",parseInt(g.getAttribute(a.el,"rowspan"),10)-1):a.el.removeAttribute("rowspan")},getRowElementsByCell:function(){var a,b,c,d=[];if(this.setTableMap(),this.idx=this.getMapIndex(this.cell),this.idx!==!1)for(a=this.map[this.idx.row],b=0,c=a.length;c>b;b++)a[b].isReal&&d.push(a[b].el);return d},getColumnElementsByCell:function(){var a,b,c=[];if(this.setTableMap(),this.idx=this.getMapIndex(this.cell),this.idx!==!1)for(a=0,b=this.map.length;b>a;a++)this.map[a][this.idx.col]&&this.map[a][this.idx.col].isReal&&c.push(this.map[a][this.idx.col].el);return c},removeRow:function(){var a,b,c,e=g.getParentElement(this.cell,{nodeName:["TR"]});if(e){if(this.setTableMap(),this.idx=this.getMapIndex(this.cell),this.idx!==!1)for(a=this.map[this.idx.row],b=0,c=a.length;c>b;b++)a[b].modified||(this.setCellAsModified(a[b]),this.removeRowCell(a[b]));d(e)}},removeColCell:function(a){a.isColspan?parseInt(g.getAttribute(a.el,"colspan"),10)>2?a.el.setAttribute("colspan",parseInt(g.getAttribute(a.el,"colspan"),10)-1):a.el.removeAttribute("colspan"):a.isReal&&d(a.el)},removeColumn:function(){if(this.setTableMap(),this.idx=this.getMapIndex(this.cell),this.idx!==!1)for(var a=0,b=this.map.length;b>a;a++)this.map[a][this.idx.col].modified||(this.setCellAsModified(this.map[a][this.idx.col]),this.removeColCell(this.map[a][this.idx.col]))},remove:function(a){if(this.rectify()){switch(a){case"row":this.removeRow();break;case"column":this.removeColumn()}this.rectify()}},addRow:function(a){var b,c,d,f,h,i=this.table.ownerDocument;if(this.setTableMap(),this.idx=this.getMapIndex(this.cell),"below"==a&&g.getAttribute(this.cell,"rowspan")&&(this.idx.row=this.idx.row+parseInt(g.getAttribute(this.cell,"rowspan"),10)-1),this.idx!==!1){for(b=this.map[this.idx.row],c=i.createElement("tr"),d=0,f=b.length;f>d;d++)b[d].modified||(this.setCellAsModified(b[d]),this.addRowCell(b[d],c,a));switch(a){case"below":e(this.getRealRowEl(!0),c);break;case"above":h=g.getParentElement(this.map[this.idx.row][this.idx.col].el,{nodeName:["TR"]}),h&&h.parentNode.insertBefore(c,h)}}},addRowCell:function(a,b,d){var e=a.isColspan?{colspan:g.getAttribute(a.el,"colspan")}:null;a.isReal?"above"!=d&&a.isRowspan?a.el.setAttribute("rowspan",parseInt(g.getAttribute(a.el,"rowspan"),10)+1):b.appendChild(this.createCells("td",1,e)):"above"!=d&&a.isRowspan&&a.lastRow?b.appendChild(this.createCells("td",1,e)):c.isRowspan&&a.el.attr("rowspan",parseInt(g.getAttribute(a.el,"rowspan"),10)+1)},add:function(a){this.rectify()&&(("below"==a||"above"==a)&&this.addRow(a),("before"==a||"after"==a)&&this.addColumn(a))},addColCell:function(a,b,d){var f,h=a.el.tagName.toLowerCase();switch(d){case"before":f=!a.isColspan||a.firstCol;break;case"after":f=!a.isColspan||a.lastCol||a.isColspan&&c.el==this.cell}if(f){switch(d){case"before":a.el.parentNode.insertBefore(this.createCells(h,1),a.el);break;case"after":e(a.el,this.createCells(h,1))}a.isRowspan&&this.handleCellAddWithRowspan(a,b+1,d)}else a.el.setAttribute("colspan",parseInt(g.getAttribute(a.el,"colspan"),10)+1)},addColumn:function(a){var b,c,d,e;if(this.setTableMap(),this.idx=this.getMapIndex(this.cell),"after"==a&&g.getAttribute(this.cell,"colspan")&&(this.idx.col=this.idx.col+parseInt(g.getAttribute(this.cell,"colspan"),10)-1),this.idx!==!1)for(d=0,e=this.map.length;e>d;d++)b=this.map[d],b[this.idx.col]&&(c=b[this.idx.col],c.modified||(this.setCellAsModified(c),this.addColCell(c,d,a)))},handleCellAddWithRowspan:function(a,b,c){var d,h,i,j,k=parseInt(g.getAttribute(this.cell,"rowspan"),10)-1,l=g.getParentElement(a.el,{nodeName:["TR"]}),m=a.el.tagName.toLowerCase(),n=this.table.ownerDocument;for(j=0;k>j;j++)if(d=this.correctColIndexForUnreals(this.idx.col,b+j),l=f(l,"tr"),l)if(d>0)switch(c){case"before":h=this.getRowCells(l),d>0&&this.map[b+j][this.idx.col].el!=h[d]&&d==h.length-1?e(h[d],this.createCells(m,1)):h[d].parentNode.insertBefore(this.createCells(m,1),h[d]); +break;case"after":e(this.getRowCells(l)[d],this.createCells(m,1))}else l.insertBefore(this.createCells(m,1),l.firstChild);else i=n.createElement("tr"),i.appendChild(this.createCells(m,1)),this.table.appendChild(i)}},g.table={getCellsBetween:function(a,b){var c=new i(a);return c.getMapElsTo(b)},addCells:function(a,b){var c=new i(a);c.add(b)},removeCells:function(a,b){var c=new i(a);c.remove(b)},mergeCellsBetween:function(a,b){var c=new i(a);c.merge(b)},unmergeCell:function(a){var b=new i(a);b.unmerge()},orderSelectionEnds:function(a,b){var c=new i(a);return c.orderSelectionEnds(b)},indexOf:function(a){var b=new i(a);return b.setTableMap(),b.getMapIndex(a)},findCell:function(a,b){var c=new i(null,a);return c.getElementAtIndex(b)},findRowByCell:function(a){var b=new i(a);return b.getRowElementsByCell()},findColumnByCell:function(a){var b=new i(a);return b.getColumnElementsByCell()},canMerge:function(a,b){var c=new i(a);return c.canMerge(b)}}}(wysihtml5),wysihtml5.dom.query=function(a,b){var c,d,e,f,g=[];for(a.nodeType&&(a=[a]),d=0,e=a.length;e>d;d++)if(c=a[d].querySelectorAll(b),c)for(f=c.length;f--;g.unshift(c[f]));return g},wysihtml5.dom.compareDocumentPosition=function(){var a=document.documentElement;return a.compareDocumentPosition?function(a,b){return a.compareDocumentPosition(b)}:function(a,b){var c,d,e,f,g,h,i,j,k;if(c=9===a.nodeType?a:a.ownerDocument,d=9===b.nodeType?b:b.ownerDocument,a===b)return 0;if(a===b.ownerDocument)return 20;if(a.ownerDocument===b)return 10;if(c!==d)return 1;if(2===a.nodeType&&a.childNodes&&-1!==wysihtml5.lang.array(a.childNodes).indexOf(b))return 20;if(2===b.nodeType&&b.childNodes&&-1!==wysihtml5.lang.array(b.childNodes).indexOf(a))return 10;for(e=a,f=[],g=null;e;){if(e==b)return 10;f.push(e),e=e.parentNode}for(e=b,g=null;e;){if(e==a)return 20;if(h=wysihtml5.lang.array(f).indexOf(e),-1!==h)return i=f[h],j=wysihtml5.lang.array(i.childNodes).indexOf(f[h-1]),k=wysihtml5.lang.array(i.childNodes).indexOf(g),j>k?2:4;g=e,e=e.parentNode}return 1}}(),wysihtml5.dom.unwrap=function(a){if(a.parentNode){for(;a.lastChild;)wysihtml5.dom.insert(a.lastChild).after(a);a.parentNode.removeChild(a)}},wysihtml5.dom.getPastedHtml=function(a){var b;return a.clipboardData&&(wysihtml5.lang.array(a.clipboardData.types).contains("text/html")?b=a.clipboardData.getData("text/html"):wysihtml5.lang.array(a.clipboardData.types).contains("text/plain")&&(b=wysihtml5.lang.string(a.clipboardData.getData("text/plain")).escapeHTML(!0,!0))),b},wysihtml5.dom.getPastedHtmlWithDiv=function(a,b){var c=a.selection.getBookmark(),d=a.element.ownerDocument,e=d.createElement("DIV");d.body.appendChild(e),e.style.width="1px",e.style.height="1px",e.style.overflow="hidden",e.setAttribute("contenteditable","true"),e.focus(),setTimeout(function(){a.selection.setBookmark(c),b(e.innerHTML),e.parentNode.removeChild(e)},0)},wysihtml5.quirks.cleanPastedHTML=function(){var a=function(a){var b=wysihtml5.lang.string(a).trim(),c=b.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&");return RegExp("^((?!^"+c+"$).)*$","i")},b=function(b,c){var d,e,f=wysihtml5.lang.object(b).clone(!0);for(d in f.tags)if(f.tags.hasOwnProperty(d)&&f.tags[d].keep_styles)for(e in f.tags[d].keep_styles)f.tags[d].keep_styles.hasOwnProperty(e)&&c[e]&&(f.tags[d].keep_styles[e]=a(c[e]));return f},c=function(a,b){var c,d,e;if(!a)return null;for(d=0,e=a.length;e>d;d++)if(a[d].condition||(c=a[d].set),a[d].condition&&a[d].condition.test(b))return a[d].set;return c};return function(a,d){var e,f={color:wysihtml5.dom.getStyle("color").from(d.referenceNode),fontSize:wysihtml5.dom.getStyle("font-size").from(d.referenceNode)},g=b(c(d.rules,a)||{},f);return e=wysihtml5.dom.parse(a,{rules:g,cleanUp:!0,context:d.referenceNode.ownerDocument,uneditableClass:d.uneditableClass,clearInternals:!0,unjoinNbsps:!0}),e}}(),wysihtml5.quirks.ensureProperClearing=function(){var a=function(){var a=this;setTimeout(function(){var b=a.innerHTML.toLowerCase();("<p>&nbsp;</p>"==b||"<p>&nbsp;</p><p>&nbsp;</p>"==b)&&(a.innerHTML="")},0)};return function(b){wysihtml5.dom.observe(b.element,["cut","keydown"],a)}}(),function(a){var b="%7E";a.quirks.getCorrectInnerHTML=function(c){var d,e,f,g,h,i=c.innerHTML;if(-1===i.indexOf(b))return i;for(d=c.querySelectorAll("[href*='~'], [src*='~']"),h=0,g=d.length;g>h;h++)e=d[h].href||d[h].src,f=a.lang.string(e).replace("~").by(b),i=a.lang.string(i).replace(f).by(e);return i}}(wysihtml5),function(a){var b="wysihtml5-quirks-redraw";a.quirks.redraw=function(c){a.dom.addClass(c,b),a.dom.removeClass(c,b);try{var d=c.ownerDocument;d.execCommand("italic",!1,null),d.execCommand("italic",!1,null)}catch(e){}}}(wysihtml5),wysihtml5.quirks.tableCellsSelection=function(a,b){function c(){return k.observe(a,"mousedown",function(a){var b=wysihtml5.dom.getParentElement(a.target,{nodeName:["TD","TH"]});b&&d(b)}),l}function d(c){l.start=c,l.end=c,l.cells=[c],l.table=k.getParentElement(l.start,{nodeName:["TABLE"]}),l.table&&(e(),k.addClass(c,m),n=k.observe(a,"mousemove",g),o=k.observe(a,"mouseup",h),b.fire("tableselectstart").fire("tableselectstart:composer"))}function e(){var b,c;if(a&&(b=a.querySelectorAll("."+m),b.length>0))for(c=0;c<b.length;c++)k.removeClass(b[c],m)}function f(a){for(var b=0;b<a.length;b++)k.addClass(a[b],m)}function g(a){var c,d=null,g=k.getParentElement(a.target,{nodeName:["TD","TH"]});g&&l.table&&l.start&&(d=k.getParentElement(g,{nodeName:["TABLE"]}),d&&d===l.table&&(e(),c=l.end,l.end=g,l.cells=k.table.getCellsBetween(l.start,g),l.cells.length>1&&b.composer.selection.deselect(),f(l.cells),l.end!==c&&b.fire("tableselectchange").fire("tableselectchange:composer")))}function h(){n.stop(),o.stop(),b.fire("tableselect").fire("tableselect:composer"),setTimeout(function(){i()},0)}function i(){var c=k.observe(a.ownerDocument,"click",function(a){c.stop(),k.getParentElement(a.target,{nodeName:["TABLE"]})!=l.table&&(e(),l.table=null,l.start=null,l.end=null,b.fire("tableunselect").fire("tableunselect:composer"))})}function j(a,c){l.start=a,l.end=c,l.table=k.getParentElement(l.start,{nodeName:["TABLE"]}),selectedCells=k.table.getCellsBetween(l.start,l.end),f(selectedCells),i(),b.fire("tableselect").fire("tableselect:composer")}var k=wysihtml5.dom,l={table:null,start:null,end:null,cells:null,select:j},m="wysiwyg-tmp-selected-cell",n=null,o=null;return c()},function(a){var b=/^rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*([\d\.]+)\s*\)/i,c=/^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)/i,d=/^#([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])/i,e=/^#([0-9a-f])([0-9a-f])([0-9a-f])/i,f=function(a){return RegExp("(^|\\s|;)"+a+"\\s*:\\s*[^;$]+","gi")};a.quirks.styleParser={parseColor:function(g,h){var i,j,k,l=f(h),m=g.match(l),n=10;if(m){for(k=m.length;k--;)m[k]=a.lang.string(m[k].split(":")[1]).trim();if(i=m[m.length-1],b.test(i))j=i.match(b);else if(c.test(i))j=i.match(c);else if(d.test(i))j=i.match(d),n=16;else if(e.test(i))return j=i.match(e),j.shift(),j.push(1),a.lang.array(j).map(function(a,b){return 3>b?16*parseInt(a,16)+parseInt(a,16):parseFloat(a)});if(j)return j.shift(),j[3]||j.push(1),a.lang.array(j).map(function(a,b){return 3>b?parseInt(a,n):parseFloat(a)})}return!1},unparseColor:function(a,b){if(b){if("hex"==b)return a[0].toString(16).toUpperCase()+a[1].toString(16).toUpperCase()+a[2].toString(16).toUpperCase();if("hash"==b)return"#"+a[0].toString(16).toUpperCase()+a[1].toString(16).toUpperCase()+a[2].toString(16).toUpperCase();if("rgb"==b)return"rgb("+a[0]+","+a[1]+","+a[2]+")";if("rgba"==b)return"rgba("+a[0]+","+a[1]+","+a[2]+","+a[3]+")";if("csv"==b)return a[0]+","+a[1]+","+a[2]+","+a[3]}return a[3]&&1!==a[3]?"rgba("+a[0]+","+a[1]+","+a[2]+","+a[3]+")":"rgb("+a[0]+","+a[1]+","+a[2]+")"},parseFontSize:function(b){var c=b.match(f("font-size"));return c?a.lang.string(c[c.length-1].split(":")[1]).trim():!1}}}(wysihtml5),function(a){function b(a){var b=0;if(a.parentNode)do b+=a.offsetTop||0,a=a.offsetParent;while(a);return b}function c(a,b){for(var c=0;b!==a;)if(c++,b=b.parentNode,!b)throw Error("not a descendant of ancestor!");return c}function d(a){if(!a.canSurroundContents())for(var b=a.commonAncestorContainer,d=c(b,a.startContainer),e=c(b,a.endContainer);!a.canSurroundContents();)d>e?(a.setStartBefore(a.startContainer),d=c(b,a.startContainer)):(a.setEndAfter(a.endContainer),e=c(b,a.endContainer))}var e=a.dom;a.Selection=Base.extend({constructor:function(a,b,c){window.rangy.init(),this.editor=a,this.composer=a.composer,this.doc=this.composer.doc,this.contain=b,this.unselectableClass=c||!1},getBookmark:function(){var a=this.getRange();return a&&d(a),a&&a.cloneRange()},setBookmark:function(a){a&&this.setSelection(a)},setBefore:function(a){var b=rangy.createRange(this.doc);return b.setStartBefore(a),b.setEndBefore(a),this.setSelection(b)},setAfter:function(a){var b=rangy.createRange(this.doc);return b.setStartAfter(a),b.setEndAfter(a),this.setSelection(b)},selectNode:function(b,c){var d=rangy.createRange(this.doc),f=b.nodeType===a.ELEMENT_NODE,g="canHaveHTML"in b?b.canHaveHTML:"IMG"!==b.nodeName,h=f?b.innerHTML:b.data,i=""===h||h===a.INVISIBLE_SPACE,j=e.getStyle("display").from(b),k="block"===j||"list-item"===j;if(i&&f&&g&&!c)try{b.innerHTML=a.INVISIBLE_SPACE}catch(l){}g?d.selectNodeContents(b):d.selectNode(b),g&&i&&f?d.collapse(k):g&&i&&(d.setStartAfter(b),d.setEndAfter(b)),this.setSelection(d)},getSelectedNode:function(a){var b,c;return a&&this.doc.selection&&"Control"===this.doc.selection.type&&(c=this.doc.selection.createRange(),c&&c.length)?c.item(0):(b=this.getSelection(this.doc),b.focusNode===b.anchorNode?b.focusNode:(c=this.getRange(this.doc),c?c.commonAncestorContainer:this.doc.body))},fixSelBorders:function(){var a=this.getRange();d(a),this.setSelection(a)},getSelectedOwnNodes:function(){var a,b,c=this.getOwnRanges(),d=[];for(a=0,b=c.length;b>a;a++)d.push(c[a].commonAncestorContainer||this.doc.body);return d},findNodesInSelection:function(b){var c,d,e,f=this.getOwnRanges(),g=[];for(d=0,e=f.length;e>d;d++)c=f[d].getNodes([1],function(c){return a.lang.array(b).contains(c.nodeName)}),g=g.concat(c);return g},containsUneditable:function(){var a,b,c=this.getOwnUneditables(),d=this.getSelection();for(a=0,b=c.length;b>a;a++)if(d.containsNode(c[a]))return!0;return!1},deleteContents:function(){var a,b=this.getOwnRanges();for(a=b.length;a--;)b[a].deleteContents();this.setSelection(b[0])},getPreviousNode:function(b,c){var d,e,f;return b||(d=this.getSelection(),b=d.anchorNode),b===this.contain?!1:(e=b.previousSibling,e===this.contain?!1:(e&&3!==e.nodeType&&1!==e.nodeType?e=this.getPreviousNode(e,c):e&&3===e.nodeType&&/^\s*$/.test(e.textContent)?e=this.getPreviousNode(e,c):c&&e&&1===e.nodeType&&!a.lang.array(["BR","HR","IMG"]).contains(e.nodeName)&&/^[\s]*$/.test(e.innerHTML)?e=this.getPreviousNode(e,c):e||b===this.contain||(f=b.parentNode,f!==this.contain&&(e=this.getPreviousNode(f,c))),e!==this.contain?e:!1))},getSelectionParentsByTag:function(){var b,c,d,e=this.getSelectedOwnNodes(),f=[];for(c=0,d=e.length;d>c;c++)b=e[c].nodeName&&"LI"===e[c].nodeName?e[c]:a.dom.getParentElement(e[c],{nodeName:["LI"]},!1,this.contain),b&&f.push(b);return f.length?f:null},getRangeToNodeEnd:function(){if(this.isCollapsed()){var a=this.getRange(),b=a.startContainer,c=a.startOffset,d=rangy.createRange(this.doc);return d.selectNodeContents(b),d.setStart(b,c),d}},caretIsLastInSelection:function(){var a=(rangy.createRange(this.doc),this.getSelection(),this.getRangeToNodeEnd().cloneContents()),b=a.textContent;return/^\s*$/.test(b)},caretIsFirstInSelection:function(){var b=rangy.createRange(this.doc),c=this.getSelection(),d=this.getRange(),e=d.startContainer;return e.nodeType===a.TEXT_NODE?this.isCollapsed()&&e.nodeType===a.TEXT_NODE&&/^\s*$/.test(e.data.substr(0,d.startOffset)):(b.selectNodeContents(this.getRange().commonAncestorContainer),b.collapse(!0),this.isCollapsed()&&(b.startContainer===c.anchorNode||b.endContainer===c.anchorNode)&&b.startOffset===c.anchorOffset)},caretIsInTheBeginnig:function(b){var c=this.getSelection(),d=c.anchorNode,e=c.anchorOffset;return b?0===e&&(d.nodeName&&d.nodeName===b.toUpperCase()||a.dom.getParentElement(d.parentNode,{nodeName:b},1)):0===e&&!this.getPreviousNode(d,!0)},caretIsBeforeUneditable:function(){var a,b,c,d,e=this.getSelection(),f=e.anchorNode,g=e.anchorOffset;if(0===g&&(a=this.getPreviousNode(f,!0),a))for(b=this.getOwnUneditables(),c=0,d=b.length;d>c;c++)if(a===b[c])return b[c];return!1},executeAndRestoreRangy:function(a){var b=this.doc.defaultView||this.doc.parentWindow,c=rangy.saveSelection(b);if(c)try{a()}catch(d){setTimeout(function(){throw d},0)}else a();rangy.restoreSelection(c)},executeAndRestore:function(b,c){var d,f,g,h,i,j,k,l,m,n=this.doc.body,o=c&&n.scrollTop,p=c&&n.scrollLeft,q="_wysihtml5-temp-placeholder",r='<span class="'+q+'">'+a.INVISIBLE_SPACE+"</span>",s=this.getRange(!0);if(!s)return b(n,n),void 0;s.collapsed||(k=s.cloneRange(),j=k.createContextualFragment(r),k.collapse(!1),k.insertNode(j),k.detach()),i=s.createContextualFragment(r),s.insertNode(i),j&&(d=this.contain.querySelectorAll("."+q),s.setStartBefore(d[0]),s.setEndAfter(d[d.length-1])),this.setSelection(s);try{b(s.startContainer,s.endContainer)}catch(t){setTimeout(function(){throw t},0)}if(d=this.contain.querySelectorAll("."+q),d&&d.length)for(l=rangy.createRange(this.doc),g=d[0].nextSibling,d.length>1&&(h=d[d.length-1].previousSibling),h&&g?(l.setStartBefore(g),l.setEndAfter(h)):(f=this.doc.createTextNode(a.INVISIBLE_SPACE),e.insert(f).after(d[0]),l.setStartBefore(f),l.setEndAfter(f)),this.setSelection(l),m=d.length;m--;)d[m].parentNode.removeChild(d[m]);else this.contain.focus();c&&(n.scrollTop=o,n.scrollLeft=p);try{d.parentNode.removeChild(d)}catch(u){}},set:function(a,b){var c=rangy.createRange(this.doc);c.setStart(a,b||0),this.setSelection(c)},insertHTML:function(a){var b,c=(rangy.createRange(this.doc),this.doc.createElement("DIV")),d=this.doc.createDocumentFragment();for(c.innerHTML=a,b=c.lastChild;c.firstChild;)d.appendChild(c.firstChild);this.insertNode(d),b&&this.setAfter(b)},insertNode:function(a){var b=this.getRange();b&&b.insertNode(a)},surround:function(a){var b,c,d=this.getOwnRanges(),e=[];if(0==d.length)return e;for(c=d.length;c--;){b=this.doc.createElement(a.nodeName),e.push(b),a.className&&(b.className=a.className),a.cssStyle&&b.setAttribute("style",a.cssStyle);try{d[c].surroundContents(b),this.selectNode(b)}catch(f){b.appendChild(d[c].extractContents()),d[c].insertNode(b)}}return e},deblockAndSurround:function(b){var c,d,e,f=this.doc.createElement("div"),g=rangy.createRange(this.doc);if(f.className=b.className,this.composer.commands.exec("formatBlock",b.nodeName,b.className),c=this.contain.querySelectorAll("."+b.className),c[0])for(c[0].parentNode.insertBefore(f,c[0]),g.setStartBefore(c[0]),g.setEndAfter(c[c.length-1]),d=g.extractContents();d.firstChild;)if(e=d.firstChild,1==e.nodeType&&a.dom.hasClass(e,b.className)){for(;e.firstChild;)f.appendChild(e.firstChild);"BR"!==e.nodeName&&f.appendChild(this.doc.createElement("br")),d.removeChild(e)}else f.appendChild(e);else f=null;return f},scrollIntoView:function(){var c,d=this.doc,e=5,f=d.documentElement.scrollHeight>d.documentElement.offsetHeight,g=d._wysihtml5ScrollIntoViewElement=d._wysihtml5ScrollIntoViewElement||function(){var b=d.createElement("span");return b.innerHTML=a.INVISIBLE_SPACE,b}();f&&(this.insertNode(g),c=b(g),g.parentNode.removeChild(g),c>=d.body.scrollTop+d.documentElement.offsetHeight-e&&(d.body.scrollTop=c))},selectLine:function(){a.browser.supportsSelectionModify()?this._selectLine_W3C():this.doc.selection&&this._selectLine_MSIE()},_selectLine_W3C:function(){var a=this.doc.defaultView,b=a.getSelection();b.modify("move","left","lineboundary"),b.modify("extend","right","lineboundary")},_selectLine_MSIE:function(){var a,b,c,d,e,f=this.doc.selection.createRange(),g=f.boundingTop,h=this.doc.body.scrollWidth;if(f.moveToPoint){for(0===g&&(c=this.doc.createElement("span"),this.insertNode(c),g=c.offsetTop,c.parentNode.removeChild(c)),g+=1,d=-10;h>d;d+=2)try{f.moveToPoint(d,g);break}catch(i){}for(a=g,b=this.doc.selection.createRange(),e=h;e>=0;e--)try{b.moveToPoint(e,a);break}catch(j){}f.setEndPoint("EndToEnd",b),f.select()}},getText:function(){var a=this.getSelection();return a?""+a:""},getNodes:function(a,b){var c=this.getRange();return c?c.getNodes([a],b):[]},fixRangeOverflow:function(a){var b,c;this.contain&&this.contain.firstChild&&a&&(b=a.compareNode(this.contain),2!==b?(1===b&&a.setStartBefore(this.contain.firstChild),0===b&&a.setEndAfter(this.contain.lastChild),3===b&&(a.setStartBefore(this.contain.firstChild),a.setEndAfter(this.contain.lastChild))):this._detectInlineRangeProblems(a)&&(c=a.endContainer.previousElementSibling,c&&a.setEnd(c,this._endOffsetForNode(c))))},_endOffsetForNode:function(a){var b=document.createRange();return b.selectNodeContents(a),b.endOffset},_detectInlineRangeProblems:function(a){var b=e.compareDocumentPosition(a.startContainer,a.endContainer);return 0==a.endOffset&&4&b},getRange:function(a){var b=this.getSelection(),c=b&&b.rangeCount&&b.getRangeAt(0);return a!==!0&&this.fixRangeOverflow(c),c},getOwnUneditables:function(){var b=e.query(this.contain,"."+this.unselectableClass),c=e.query(b,"."+this.unselectableClass);return a.lang.array(b).without(c)},getOwnRanges:function(){var a,b,c,d,e,f,g,h=[],i=this.getRange();if(i&&h.push(i),this.unselectableClass&&this.contain&&i&&(b=this.getOwnUneditables(),b.length>0))for(d=0,e=b.length;e>d;d++)for(a=[],f=0,g=h.length;g>f;f++){if(h[f])switch(h[f].compareNode(b[d])){case 2:break;case 3:c=h[f].cloneRange(),c.setEndBefore(b[d]),a.push(c),c=h[f].cloneRange(),c.setStartAfter(b[d]),a.push(c);break;default:a.push(h[f])}h=a}return h},getSelection:function(){return rangy.getSelection(this.doc.defaultView||this.doc.parentWindow)},setSelection:function(a){var b=this.doc.defaultView||this.doc.parentWindow,c=rangy.getSelection(b);return c.setSingleRange(a)},createRange:function(){return rangy.createRange(this.doc)},isCollapsed:function(){return this.getSelection().isCollapsed},getHtml:function(){return this.getSelection().toHtml()},isEndToEndInNode:function(b){var c=this.getRange(),d=c.commonAncestorContainer,e=c.startContainer,f=c.endContainer;if(d.nodeType===a.TEXT_NODE&&(d=d.parentNode),e.nodeType===a.TEXT_NODE&&!/^\s*$/.test(e.data.substr(c.startOffset)))return!1;if(f.nodeType===a.TEXT_NODE&&!/^\s*$/.test(f.data.substr(c.endOffset)))return!1;for(;e&&e!==d;){if(e.nodeType!==a.TEXT_NODE&&!a.dom.contains(d,e))return!1;if(a.dom.domNode(e).prev({ignoreBlankTexts:!0}))return!1;e=e.parentNode}for(;f&&f!==d;){if(f.nodeType!==a.TEXT_NODE&&!a.dom.contains(d,f))return!1;if(a.dom.domNode(f).next({ignoreBlankTexts:!0}))return!1;f=f.parentNode}return a.lang.array(b).contains(d.nodeName)?d:!1},deselect:function(){var a=this.getSelection();a&&a.removeAllRanges()}})}(wysihtml5),function(a,b){function c(a,b,c){if(!a.className)return!1;var d=a.className.match(c)||[];return d[d.length-1]===b}function d(a,b){if(!a.getAttribute||!a.getAttribute("style"))return!1;a.getAttribute("style").match(b);return a.getAttribute("style").match(b)?!0:!1}function e(a,b,c){a.getAttribute("style")?(h(a,c),a.getAttribute("style")&&!/^\s*$/.test(a.getAttribute("style"))?a.setAttribute("style",b+";"+a.getAttribute("style")):a.setAttribute("style",b)):a.setAttribute("style",b)}function f(a,b,c){a.className?(g(a,c),a.className+=" "+b):a.className=b}function g(a,b){a.className&&(a.className=a.className.replace(b,""))}function h(a,b){var c,d,e=[];if(a.getAttribute("style")){for(c=a.getAttribute("style").split(";"),d=c.length;d--;)c[d].match(b)||/^\s*$/.test(c[d])||e.push(c[d]);e.length?a.setAttribute("style",e.join(";")):a.removeAttribute("style")}}function i(a,b){var c,d,e,f=[],g=b.split(";"),h=a.getAttribute("style");if(h){for(h=h.replace(/\s/gi,"").toLowerCase(),f.push(RegExp("(^|\\s|;)"+b.replace(/\s/gi,"").replace(/([\(\)])/gi,"\\$1").toLowerCase().replace(";",";?").replace(/rgb\\\((\d+),(\d+),(\d+)\\\)/gi,"\\s?rgb\\($1,\\s?$2,\\s?$3\\)"),"gi")),c=g.length;c-->0;)/^\s*$/.test(g[c])||f.push(RegExp("(^|\\s|;)"+g[c].replace(/\s/gi,"").replace(/([\(\)])/gi,"\\$1").toLowerCase().replace(";",";?").replace(/rgb\\\((\d+),(\d+),(\d+)\\\)/gi,"\\s?rgb\\($1,\\s?$2,\\s?$3\\)"),"gi"));for(d=0,e=f.length;e>d;d++)if(h.match(f[d]))return f[d]}return!1}function j(c,d,e,f){return e?i(c,e):f?a.dom.hasClass(c,f):b.dom.arrayContains(d,c.tagName.toLowerCase())}function k(a,b,c,d){for(var e=a.length;e--;)if(!j(a[e],b,c,d))return!1;return a.length?!0:!1}function l(a,b,c){var d=i(a,b);return d?(h(a,d),"remove"):(e(a,b,c),"change")}function m(a,b){return a.className.replace(u," ")==b.className.replace(u," ")}function n(a){for(var b=a.parentNode;a.firstChild;)b.insertBefore(a.firstChild,a);b.removeChild(a)}function o(a,b){if(a.attributes.length!=b.attributes.length)return!1;for(var c,d,e,f=0,g=a.attributes.length;g>f;++f)if(c=a.attributes[f],e=c.name,"class"!=e){if(d=b.attributes.getNamedItem(e),c.specified!=d.specified)return!1;if(c.specified&&c.nodeValue!==d.nodeValue)return!1}return!0}function p(a,c){return b.dom.isCharacterDataNode(a)?0==c?!!a.previousSibling:c==a.length?!!a.nextSibling:!0:c>0&&c<a.childNodes.length}function q(a,c,d,e){var f,g;if(b.dom.isCharacterDataNode(c)&&(0==d?(d=b.dom.getNodeIndex(c),c=c.parentNode):d==c.length?(d=b.dom.getNodeIndex(c)+1,c=c.parentNode):f=b.dom.splitDataNode(c,d)),!(f||e&&c===e)){for(f=c.cloneNode(!1),f.id&&f.removeAttribute("id");g=c.childNodes[d];)f.appendChild(g);b.dom.insertAfter(f,c)}return c==a?f:q(a,f.parentNode,b.dom.getNodeIndex(f),e)}function r(b){this.isElementMerge=b.nodeType==a.ELEMENT_NODE,this.firstTextNode=this.isElementMerge?b.lastChild:b,this.textNodes=[this.firstTextNode]}function s(a,b,c,d,e,f,g){this.tagNames=a||[t],this.cssClass=b||(b===!1?!1:""),this.similarClassRegExp=c,this.cssStyle=e||"",this.similarStyleRegExp=f,this.normalize=d,this.applyToAnyTagName=!1,this.container=g}var t="span",u=/\s+/g;r.prototype={doMerge:function(){var a,b,c,d,e,f=[];for(d=0,e=this.textNodes.length;e>d;++d)a=this.textNodes[d],b=a.parentNode,f[d]=a.data,d&&(b.removeChild(a),b.hasChildNodes()||b.parentNode.removeChild(b));return this.firstTextNode.data=c=f.join(""),c},getLength:function(){for(var a=this.textNodes.length,b=0;a--;)b+=this.textNodes[a].length;return b},toString:function(){var a,b,c=[];for(a=0,b=this.textNodes.length;b>a;++a)c[a]="'"+this.textNodes[a].data+"'";return"[Merge("+c.join(",")+")]"}},s.prototype={getAncestorWithClass:function(d){for(var e;d;){if(e=this.cssClass?c(d,this.cssClass,this.similarClassRegExp):""!==this.cssStyle?!1:!0,d.nodeType==a.ELEMENT_NODE&&"false"!=d.getAttribute("contenteditable")&&b.dom.arrayContains(this.tagNames,d.tagName.toLowerCase())&&e)return d;d=d.parentNode}return!1},getAncestorWithStyle:function(c){for(var e;c;){if(e=this.cssStyle?d(c,this.similarStyleRegExp):!1,c.nodeType==a.ELEMENT_NODE&&"false"!=c.getAttribute("contenteditable")&&b.dom.arrayContains(this.tagNames,c.tagName.toLowerCase())&&e)return c;c=c.parentNode}return!1},getMatchingAncestor:function(a){var b=this.getAncestorWithClass(a),c=!1;return b?this.cssStyle&&(c="class"):(b=this.getAncestorWithStyle(a),b&&(c="style")),{element:b,type:c}},postApply:function(a,b){var c,d,e,f,g,h,i=a[0],j=a[a.length-1],k=[],l=i,m=j,n=0,o=j.length;for(f=0,g=a.length;g>f;++f)d=a[f],e=null,d&&d.parentNode&&(e=this.getAdjacentMergeableTextNode(d.parentNode,!1)),e?(c||(c=new r(e),k.push(c)),c.textNodes.push(d),d===i&&(l=c.firstTextNode,n=l.length),d===j&&(m=c.firstTextNode,o=c.getLength())):c=null;if(j&&j.parentNode&&(h=this.getAdjacentMergeableTextNode(j.parentNode,!0),h&&(c||(c=new r(j),k.push(c)),c.textNodes.push(h))),k.length){for(f=0,g=k.length;g>f;++f)k[f].doMerge();b.setStart(l,n),b.setEnd(m,o)}},getAdjacentMergeableTextNode:function(b,c){var d,e=b.nodeType==a.TEXT_NODE,f=e?b.parentNode:b,g=c?"nextSibling":"previousSibling";if(e){if(d=b[g],d&&d.nodeType==a.TEXT_NODE)return d}else if(d=f[g],d&&this.areElementsMergeable(b,d))return d[c?"firstChild":"lastChild"];return null},areElementsMergeable:function(a,c){return b.dom.arrayContains(this.tagNames,(a.tagName||"").toLowerCase())&&b.dom.arrayContains(this.tagNames,(c.tagName||"").toLowerCase())&&m(a,c)&&o(a,c)},createContainer:function(a){var b=a.createElement(this.tagNames[0]);return this.cssClass&&(b.className=this.cssClass),this.cssStyle&&b.setAttribute("style",this.cssStyle),b},applyToTextNode:function(a){var c,d=a.parentNode;1==d.childNodes.length&&b.dom.arrayContains(this.tagNames,d.tagName.toLowerCase())?(this.cssClass&&f(d,this.cssClass,this.similarClassRegExp),this.cssStyle&&e(d,this.cssStyle,this.similarStyleRegExp)):(c=this.createContainer(b.dom.getDocument(a)),a.parentNode.insertBefore(c,a),c.appendChild(a))},isRemovable:function(c){return b.dom.arrayContains(this.tagNames,c.tagName.toLowerCase())&&""===a.lang.string(c.className).trim()&&(!c.getAttribute("style")||""===a.lang.string(c.getAttribute("style")).trim())},undoToTextNode:function(a,b,c,d){var e,f=c?!1:!0,h=c||d,i=!1;b.containsNode(h)||(e=b.cloneRange(),e.selectNode(h),e.isPointInRange(b.endContainer,b.endOffset)&&p(b.endContainer,b.endOffset)&&(q(h,b.endContainer,b.endOffset,this.container),b.setEndAfter(h)),e.isPointInRange(b.startContainer,b.startOffset)&&p(b.startContainer,b.startOffset)&&(h=q(h,b.startContainer,b.startOffset,this.container))),!f&&this.similarClassRegExp&&g(h,this.similarClassRegExp),f&&this.similarStyleRegExp&&(i="change"===l(h,this.cssStyle,this.similarStyleRegExp)),this.isRemovable(h)&&!i&&n(h)},applyToRange:function(b){var c,d,e,f,g,h;for(d=b.length;d--;){if(c=b[d].getNodes([a.TEXT_NODE]),!c.length)try{return e=this.createContainer(b[d].endContainer.ownerDocument),b[d].surroundContents(e),this.selectNode(b[d],e),void 0}catch(i){}if(b[d].splitBoundaries(),c=b[d].getNodes([a.TEXT_NODE]),c.length){for(g=0,h=c.length;h>g;++g)f=c[g],this.getMatchingAncestor(f).element||this.applyToTextNode(f);b[d].setStart(c[0],0),f=c[c.length-1],b[d].setEnd(f,f.length),this.normalize&&this.postApply(c,b[d])}}},undoToRange:function(b){var c,d,e,f,g,h,i,j;for(f=b.length;f--;){for(c=b[f].getNodes([a.TEXT_NODE]),c.length?(b[f].splitBoundaries(),c=b[f].getNodes([a.TEXT_NODE])):(g=b[f].endContainer.ownerDocument,h=g.createTextNode(a.INVISIBLE_SPACE),b[f].insertNode(h),b[f].selectNode(h),c=[h]),i=0,j=c.length;j>i;++i)b[f].isValid()&&(d=c[i],e=this.getMatchingAncestor(d),"style"===e.type?this.undoToTextNode(d,b[f],!1,e.element):e.element&&this.undoToTextNode(d,b[f],e.element));1==j?this.selectNode(b[f],c[0]):(b[f].setStart(c[0],0),d=c[c.length-1],b[f].setEnd(d,d.length),this.normalize&&this.postApply(c,b[f]))}},selectNode:function(b,c){var d=c.nodeType===a.ELEMENT_NODE,e="canHaveHTML"in c?c.canHaveHTML:!0,f=d?c.innerHTML:c.data,g=""===f||f===a.INVISIBLE_SPACE;if(g&&d&&e)try{c.innerHTML=a.INVISIBLE_SPACE}catch(h){}b.selectNodeContents(c),g&&d?b.collapse(!1):g&&(b.setStartAfter(c),b.setEndAfter(c))},getTextSelectedByRange:function(a,b){var c,d,e=b.cloneRange();return e.selectNodeContents(a),c=e.intersection(b),d=c?""+c:"",e.detach(),d},isAppliedToRange:function(b){var c,d,e,f,g,h,i=[],j="full";for(e=b.length;e--;){if(d=b[e].getNodes([a.TEXT_NODE]),!d.length)return c=this.getMatchingAncestor(b[e].startContainer).element,c?{elements:[c],coverage:j}:!1;for(f=0,g=d.length;g>f;++f)h=this.getTextSelectedByRange(d[f],b[e]),c=this.getMatchingAncestor(d[f]).element,c&&""!=h?(i.push(c),1===a.dom.getTextNodes(c,!0).length?j="full":"full"===j&&(j="inline")):c||(j="partial")}return i.length?{elements:i,coverage:j}:!1},toggleRange:function(a){var b,c=this.isAppliedToRange(a);c?"full"===c.coverage?this.undoToRange(a):"inline"===c.coverage?(b=k(c.elements,this.tagNames,this.cssStyle,this.cssClass),this.undoToRange(a),b||this.applyToRange(a)):(k(c.elements,this.tagNames,this.cssStyle,this.cssClass)||this.undoToRange(a),this.applyToRange(a)):this.applyToRange(a)}},a.selection.HTMLApplier=s}(wysihtml5,rangy),wysihtml5.Commands=Base.extend({constructor:function(a){this.editor=a,this.composer=a.composer,this.doc=this.composer.doc},support:function(a){return wysihtml5.browser.supportsCommand(this.doc,a)},exec:function(a,b){var c=wysihtml5.commands[a],d=wysihtml5.lang.array(arguments).get(),e=c&&c.exec,f=null;if(this.editor.fire("beforecommand:composer"),e)d.unshift(this.composer),f=e.apply(c,d);else try{f=this.doc.execCommand(a,!1,b)}catch(g){}return this.editor.fire("aftercommand:composer"),f},state:function(a){var b=wysihtml5.commands[a],c=wysihtml5.lang.array(arguments).get(),d=b&&b.state;if(d)return c.unshift(this.composer),d.apply(b,c);try{return this.doc.queryCommandState(a)}catch(e){return!1}},stateValue:function(a){var b=wysihtml5.commands[a],c=wysihtml5.lang.array(arguments).get(),d=b&&b.stateValue;return d?(c.unshift(this.composer),d.apply(b,c)):!1}}),wysihtml5.commands.bold={exec:function(a,b){wysihtml5.commands.formatInline.execWithToggle(a,b,"b")},state:function(a,b){return wysihtml5.commands.formatInline.state(a,b,"b")}},function(a){function b(b,c){var g,h,i,j,k,l,m,n,o,p=b.doc,q="_wysihtml5-temp-"+ +new Date,r=/non-matching-class/g,s=0;for(a.commands.formatInline.exec(b,d,e,q,r,d,d,!0,!0),h=p.querySelectorAll(e+"."+q),g=h.length;g>s;s++){i=h[s],i.removeAttribute("class");for(o in c)"text"!==o&&i.setAttribute(o,c[o])}l=i,1===g&&(m=f.getTextContent(i),j=!!i.querySelector("*"),k=""===m||m===a.INVISIBLE_SPACE,!j&&k&&(f.setTextContent(i,c.text||i.href),n=p.createTextNode(" "),b.selection.setAfter(i),f.insert(n).after(i),l=n)),b.selection.setAfter(l)}function c(a,b,c){var d,e,f,g;for(e=b.length;e--;){for(d=b[e].attributes,f=d.length;f--;)b[e].removeAttribute(d.item(f).name);for(g in c)c.hasOwnProperty(g)&&b[e].setAttribute(g,c[g])}}var d,e="A",f=a.dom;a.commands.createLink={exec:function(a,d,e){var f=this.state(a,d);f?a.selection.executeAndRestore(function(){c(a,f,e)}):(e="object"==typeof e?e:{href:e},b(a,e))},state:function(b,c){return a.commands.formatInline.state(b,c,"A")}}}(wysihtml5),function(a){function b(a,b){for(var d,e,f,g=b.length,h=0;g>h;h++)d=b[h],e=c.getParentElement(d,{nodeName:"code"}),f=c.getTextContent(d),f.match(c.autoLink.URL_REG_EXP)&&!e?e=c.renameElement(d,"code"):c.replaceWithChildNodes(d)}var c=a.dom;a.commands.removeLink={exec:function(a,c){var d=this.state(a,c);d&&a.selection.executeAndRestore(function(){b(a,d)})},state:function(b,c){return a.commands.formatInline.state(b,c,"A")}}}(wysihtml5),function(a){var b=/wysiwyg-font-size-[0-9a-z\-]+/g;a.commands.fontSize={exec:function(c,d,e){a.commands.formatInline.execWithToggle(c,d,"span","wysiwyg-font-size-"+e,b)},state:function(c,d,e){return a.commands.formatInline.state(c,d,"span","wysiwyg-font-size-"+e,b)}}}(wysihtml5),function(a){var b=/(\s|^)font-size\s*:\s*[^;\s]+;?/gi;a.commands.fontSizeStyle={exec:function(c,d,e){e="object"==typeof e?e.size:e,/^\s*$/.test(e)||a.commands.formatInline.execWithToggle(c,d,"span",!1,!1,"font-size:"+e,b)},state:function(c,d){return a.commands.formatInline.state(c,d,"span",!1,!1,"font-size",b)},stateValue:function(b,c){var d,e=this.state(b,c);return e&&a.lang.object(e).isArray()&&(e=e[0]),e&&(d=e.getAttribute("style"),d)?a.quirks.styleParser.parseFontSize(d):!1}}}(wysihtml5),function(a){var b=/wysiwyg-color-[0-9a-z]+/g;a.commands.foreColor={exec:function(c,d,e){a.commands.formatInline.execWithToggle(c,d,"span","wysiwyg-color-"+e,b)},state:function(c,d,e){return a.commands.formatInline.state(c,d,"span","wysiwyg-color-"+e,b)}}}(wysihtml5),function(a){var b=/(\s|^)color\s*:\s*[^;\s]+;?/gi;a.commands.foreColorStyle={exec:function(c,d,e){var f,g=a.quirks.styleParser.parseColor("object"==typeof e?"color:"+e.color:"color:"+e,"color");g&&(f="color: rgb("+g[0]+","+g[1]+","+g[2]+");",1!==g[3]&&(f+="color: rgba("+g[0]+","+g[1]+","+g[2]+","+g[3]+");"),a.commands.formatInline.execWithToggle(c,d,"span",!1,!1,f,b))},state:function(c,d){return a.commands.formatInline.state(c,d,"span",!1,!1,"color",b)},stateValue:function(b,c,d){var e,f=this.state(b,c);return f&&a.lang.object(f).isArray()&&(f=f[0]),f&&(e=f.getAttribute("style"),e&&e)?(val=a.quirks.styleParser.parseColor(e,"color"),a.quirks.styleParser.unparseColor(val,d)):!1 +}}}(wysihtml5),function(a){var b=/(\s|^)background-color\s*:\s*[^;\s]+;?/gi;a.commands.bgColorStyle={exec:function(c,d,e){var f,g=a.quirks.styleParser.parseColor("object"==typeof e?"background-color:"+e.color:"background-color:"+e,"background-color");g&&(f="background-color: rgb("+g[0]+","+g[1]+","+g[2]+");",1!==g[3]&&(f+="background-color: rgba("+g[0]+","+g[1]+","+g[2]+","+g[3]+");"),a.commands.formatInline.execWithToggle(c,d,"span",!1,!1,f,b))},state:function(c,d){return a.commands.formatInline.state(c,d,"span",!1,!1,"background-color",b)},stateValue:function(b,c,d){var e,f=this.state(b,c),g=!1;return f&&a.lang.object(f).isArray()&&(f=f[0]),f&&(e=f.getAttribute("style"),e)?(g=a.quirks.styleParser.parseColor(e,"background-color"),a.quirks.styleParser.unparseColor(g,d)):!1}}}(wysihtml5),function(a){function b(b,c,e){b.className?(d(b,e),b.className=a.lang.string(b.className+" "+c).trim()):b.className=c}function c(b,c,d){e(b,d),b.getAttribute("style")?b.setAttribute("style",a.lang.string(b.getAttribute("style")+" "+c).trim()):b.setAttribute("style",c)}function d(b,c){var d=c.test(b.className);return b.className=b.className.replace(c,""),""==a.lang.string(b.className).trim()&&b.removeAttribute("class"),d}function e(b,c){var d=c.test(b.getAttribute("style"));return b.setAttribute("style",(b.getAttribute("style")||"").replace(c,"")),""==a.lang.string(b.getAttribute("style")||"").trim()&&b.removeAttribute("style"),d}function f(a){var b=a.lastChild;b&&g(b)&&b.parentNode.removeChild(b)}function g(a){return"BR"===a.nodeName}function h(b,c){var d,e,g;for(b.selection.isCollapsed()&&b.selection.selectLine(),d=b.selection.surround(c),e=0,g=d.length;g>e;e++)a.dom.lineBreaks(d[e]).remove(),f(d[e])}function i(b){return!!a.lang.string(b.className).trim()}function j(b){return!!a.lang.string(b.getAttribute("style")||"").trim()}var k=a.dom,l=["H1","H2","H3","H4","H5","H6","P","PRE","DIV"];a.commands.formatBlock={exec:function(f,g,m,n,o,p,q){var r,s,t,u,v,w=(f.doc,this.state(f,g,m,n,o,p,q)),x=f.config.useLineBreaks,y=x?"DIV":"P";return m="string"==typeof m?m.toUpperCase():m,w.length?(f.selection.executeAndRestoreRangy(function(){var b,c,f;for(b=w.length;b--;){if(o&&(s=d(w[b],o)),q&&(u=e(w[b],q)),(u||s)&&null===m&&w[b].nodeName!=y)return;c=i(w[b]),f=j(w[b]),c||f||!x&&"P"!==m?k.renameElement(w[b],"P"===m?"DIV":y):(a.dom.lineBreaks(w[b]).add(),k.replaceWithChildNodes(w[b]))}}),void 0):((null!==m&&!a.lang.array(l).contains(m)||(r=f.selection.findNodesInSelection(l).concat(f.selection.getSelectedOwnNodes()),f.selection.executeAndRestoreRangy(function(){for(var a=r.length;a--;)v=k.getParentElement(r[a],{nodeName:l}),v==f.element&&(v=null),v&&(m&&(v=k.renameElement(v,m)),n&&b(v,n,o),p&&c(v,p,q),t=!0)}),!t))&&h(f,{nodeName:m||y,className:n||null,cssStyle:p||null}),void 0)},state:function(b,c,d,e,f,g,h){var i,j,l,m=b.selection.getSelectedOwnNodes(),n=[];for(d="string"==typeof d?d.toUpperCase():d,j=0,l=m.length;l>j;j++)i=k.getParentElement(m[j],{nodeName:d,className:e,classRegExp:f,cssStyle:g,styleRegExp:h}),i&&-1==a.lang.array(n).indexOf(i)&&n.push(i);return 0==n.length?!1:n}}}(wysihtml5),wysihtml5.commands.formatCode={exec:function(a,b,c){var d,e,f,g=this.state(a);g?a.selection.executeAndRestore(function(){d=g.querySelector("code"),wysihtml5.dom.replaceWithChildNodes(g),d&&wysihtml5.dom.replaceWithChildNodes(d)}):(e=a.selection.getRange(),f=e.extractContents(),g=a.doc.createElement("pre"),d=a.doc.createElement("code"),c&&(d.className=c),g.appendChild(d),d.appendChild(f),e.insertNode(g),a.selection.selectNode(g))},state:function(a){var b=a.selection.getSelectedNode();return b&&b.nodeName&&"PRE"==b.nodeName&&b.firstChild&&b.firstChild.nodeName&&"CODE"==b.firstChild.nodeName?b:wysihtml5.dom.getParentElement(b,{nodeName:"CODE"})&&wysihtml5.dom.getParentElement(b,{nodeName:"PRE"})}},function(a){function b(a){var b=d[a];return b?[a.toLowerCase(),b.toLowerCase()]:[a.toLowerCase()]}function c(c,d,f,g,h,i){var j=c;return d&&(j+=":"+d),g&&(j+=":"+g),e[j]||(e[j]=new a.selection.HTMLApplier(b(c),d,f,!0,g,h,i)),e[j]}var d={strong:"b",em:"i",b:"strong",i:"em"},e={};a.commands.formatInline={exec:function(a,b,d,e,f,g,h,i,j){var k=a.selection.createRange(),l=a.selection.getOwnRanges();return l&&0!=l.length?(a.selection.getSelection().removeAllRanges(),c(d,e,f,g,h,a.element).toggleRange(l),i?j||a.cleanUp():(k.setStart(l[0].startContainer,l[0].startOffset),k.setEnd(l[l.length-1].endContainer,l[l.length-1].endOffset),a.selection.setSelection(k),a.selection.executeAndRestore(function(){j||a.cleanUp()},!0,!0)),void 0):!1},execWithToggle:function(b,c,d,e,f,g,h){var i,j=this;this.state(b,c,d,e,f,g,h)&&b.selection.isCollapsed()&&!b.selection.caretIsLastInSelection()&&!b.selection.caretIsFirstInSelection()?(i=j.state(b,c,d,e,f)[0],b.selection.executeAndRestoreRangy(function(){i.parentNode;b.selection.selectNode(i,!0),a.commands.formatInline.exec(b,c,d,e,f,g,h,!0,!0)})):this.state(b,c,d,e,f,g,h)&&!b.selection.isCollapsed()?b.selection.executeAndRestoreRangy(function(){a.commands.formatInline.exec(b,c,d,e,f,g,h,!0,!0)}):a.commands.formatInline.exec(b,c,d,e,f,g,h)},state:function(b,e,f,g,h,i,j){var k,l,m=b.doc,n=d[f]||f;return a.dom.hasElementWithTagName(m,f)||a.dom.hasElementWithTagName(m,n)?g&&!a.dom.hasElementWithClassName(m,g)?!1:(k=b.selection.getOwnRanges(),k&&0!==k.length?(l=c(f,g,h,i,j,b.element).isAppliedToRange(k),l&&l.elements?l.elements:!1):!1):!1}}}(wysihtml5),function(a){a.commands.insertBlockQuote={exec:function(b,c){var d=this.state(b,c),e=b.selection.isEndToEndInNode(["H1","H2","H3","H4","H5","H6","P"]);b.selection.executeAndRestore(function(){if(d)b.config.useLineBreaks&&a.dom.lineBreaks(d).add(),a.dom.unwrap(d);else if(b.selection.isCollapsed()&&b.selection.selectLine(),e){var c=e.ownerDocument.createElement("blockquote");a.dom.insert(c).after(e),c.appendChild(e)}else b.selection.surround({nodeName:"blockquote"})})},state:function(b){var c=b.selection.getSelectedNode(),d=a.dom.getParentElement(c,{nodeName:"BLOCKQUOTE"},!1,b.element);return d?d:!1}}}(wysihtml5),wysihtml5.commands.insertHTML={exec:function(a,b,c){a.commands.support(b)?a.doc.execCommand(b,!1,c):a.selection.insertHTML(c)},state:function(){return!1}},function(a){var b="IMG";a.commands.insertImage={exec:function(c,d,e){var f,g,h,i,j;if(e="object"==typeof e?e:{src:e},f=c.doc,g=this.state(c),g)return c.selection.setBefore(g),i=g.parentNode,i.removeChild(g),a.dom.removeEmptyTextNodes(i),"A"!==i.nodeName||i.firstChild||(c.selection.setAfter(i),i.parentNode.removeChild(i)),a.quirks.redraw(c.element),void 0;g=f.createElement(b);for(j in e)g.setAttribute("className"===j?"class":j,e[j]);c.selection.insertNode(g),a.browser.hasProblemsSettingCaretAfterImg()?(h=f.createTextNode(a.INVISIBLE_SPACE),c.selection.insertNode(h),c.selection.setAfter(h)):c.selection.setAfter(g)},state:function(c){var d,e,f,g=c.doc;return a.dom.hasElementWithTagName(g,b)?(d=c.selection.getSelectedNode(),d?d.nodeName===b?d:d.nodeType!==a.ELEMENT_NODE?!1:(e=c.selection.getText(),e=a.lang.string(e).trim(),e?!1:(f=c.selection.getNodes(a.ELEMENT_NODE,function(a){return"IMG"===a.nodeName}),1!==f.length?!1:f[0])):!1):!1}}}(wysihtml5),function(a){var b="<br>"+(a.browser.needsSpaceAfterLineBreak()?" ":"");a.commands.insertLineBreak={exec:function(c,d){c.commands.support(d)?(c.doc.execCommand(d,!1,null),a.browser.autoScrollsToCaret()||c.selection.scrollIntoView()):c.commands.exec("insertHTML",b)},state:function(){return!1}}}(wysihtml5),wysihtml5.commands.insertOrderedList={exec:function(a,b){wysihtml5.commands.insertList.exec(a,b,"OL")},state:function(a,b){return wysihtml5.commands.insertList.state(a,b,"OL")}},wysihtml5.commands.insertUnorderedList={exec:function(a,b){wysihtml5.commands.insertList.exec(a,b,"UL")},state:function(a,b){return wysihtml5.commands.insertList.state(a,b,"UL")}},wysihtml5.commands.insertList=function(a){var b=function(a,b){if(a&&a.nodeName){"string"==typeof b&&(b=[b]);for(var c=b.length;c--;)if(a.nodeName===b[c])return!0}return!1},c=function(c,d,e){var f,g,h={el:null,other:!1};return c&&(f=a.dom.getParentElement(c,{nodeName:"LI"}),g="UL"===d?"OL":"UL",b(c,d)?h.el=c:b(c,g)?h={el:c,other:!0}:f&&(b(f.parentNode,d)?h.el=f.parentNode:b(f.parentNode,g)&&(h={el:f.parentNode,other:!0}))),h.el&&!e.element.contains(h.el)&&(h.el=null),h},d=function(b,c,d){var e,g="UL"===c?"OL":"UL";d.selection.executeAndRestore(function(){var h,i,j=f(g,d);if(j.length)for(h=j.length;h--;)a.dom.renameElement(j[h],c.toLowerCase());else{for(e=f(["OL","UL"],d),i=e.length;i--;)a.dom.resolveList(e[i],d.config.useLineBreaks);a.dom.resolveList(b,d.config.useLineBreaks)}})},e=function(b,c,d){var e="UL"===c?"OL":"UL";d.selection.executeAndRestore(function(){var g,h=[b].concat(f(e,d));for(g=h.length;g--;)a.dom.renameElement(h[g],c.toLowerCase())})},f=function(a,c){var d,e=c.selection.getOwnRanges(),f=[];for(d=e.length;d--;)f=f.concat(e[d].getNodes([1],function(c){return b(c,a)}));return f},g=function(b,c){c.selection.executeAndRestoreRangy(function(){var d,e,f="_wysihtml5-temp-"+(new Date).getTime(),g=c.selection.deblockAndSurround({nodeName:"div",className:f}),h=/\uFEFF/g;g.innerHTML=g.innerHTML.replace(h,""),g&&(d=a.lang.array(["","<br>",a.INVISIBLE_SPACE]).contains(g.innerHTML),e=a.dom.convertToList(g,b.toLowerCase(),c.parent.config.uneditableContainerClassname),d&&c.selection.selectNode(e.querySelector("li"),!0))})};return{exec:function(a,b,f){var h=a.doc,i="OL"===f?"insertOrderedList":"insertUnorderedList",j=a.selection.getSelectedNode(),k=c(j,f,a);k.el?k.other?e(k.el,f,a):d(k.el,f,a):a.commands.support(i)?h.execCommand(i,!1,null):g(f,a)},state:function(a,b,d){var e=a.selection.getSelectedNode(),f=c(e,d,a);return f.el&&!f.other?f.el:!1}}}(wysihtml5),wysihtml5.commands.italic={exec:function(a,b){wysihtml5.commands.formatInline.execWithToggle(a,b,"i")},state:function(a,b){return wysihtml5.commands.formatInline.state(a,b,"i")}},function(a){var b="wysiwyg-text-align-center",c=/wysiwyg-text-align-[0-9a-z]+/g;a.commands.justifyCenter={exec:function(d){return a.commands.formatBlock.exec(d,"formatBlock",null,b,c)},state:function(d){return a.commands.formatBlock.state(d,"formatBlock",null,b,c)}}}(wysihtml5),function(a){var b="wysiwyg-text-align-left",c=/wysiwyg-text-align-[0-9a-z]+/g;a.commands.justifyLeft={exec:function(d){return a.commands.formatBlock.exec(d,"formatBlock",null,b,c)},state:function(d){return a.commands.formatBlock.state(d,"formatBlock",null,b,c)}}}(wysihtml5),function(a){var b="wysiwyg-text-align-right",c=/wysiwyg-text-align-[0-9a-z]+/g;a.commands.justifyRight={exec:function(d){return a.commands.formatBlock.exec(d,"formatBlock",null,b,c)},state:function(d){return a.commands.formatBlock.state(d,"formatBlock",null,b,c)}}}(wysihtml5),function(a){var b="wysiwyg-text-align-justify",c=/wysiwyg-text-align-[0-9a-z]+/g;a.commands.justifyFull={exec:function(d){return a.commands.formatBlock.exec(d,"formatBlock",null,b,c)},state:function(d){return a.commands.formatBlock.state(d,"formatBlock",null,b,c)}}}(wysihtml5),function(a){var b="text-align: right;",c=/(\s|^)text-align\s*:\s*[^;\s]+;?/gi;a.commands.alignRightStyle={exec:function(d){return a.commands.formatBlock.exec(d,"formatBlock",null,null,null,b,c)},state:function(d){return a.commands.formatBlock.state(d,"formatBlock",null,null,null,b,c)}}}(wysihtml5),function(a){var b="text-align: left;",c=/(\s|^)text-align\s*:\s*[^;\s]+;?/gi;a.commands.alignLeftStyle={exec:function(d){return a.commands.formatBlock.exec(d,"formatBlock",null,null,null,b,c)},state:function(d){return a.commands.formatBlock.state(d,"formatBlock",null,null,null,b,c)}}}(wysihtml5),function(a){var b="text-align: center;",c=/(\s|^)text-align\s*:\s*[^;\s]+;?/gi;a.commands.alignCenterStyle={exec:function(d){return a.commands.formatBlock.exec(d,"formatBlock",null,null,null,b,c)},state:function(d){return a.commands.formatBlock.state(d,"formatBlock",null,null,null,b,c)}}}(wysihtml5),wysihtml5.commands.redo={exec:function(a){return a.undoManager.redo()},state:function(){return!1}},wysihtml5.commands.underline={exec:function(a,b){wysihtml5.commands.formatInline.execWithToggle(a,b,"u")},state:function(a,b){return wysihtml5.commands.formatInline.state(a,b,"u")}},wysihtml5.commands.undo={exec:function(a){return a.undoManager.undo()},state:function(){return!1}},wysihtml5.commands.createTable={exec:function(a,b,c){var d,e,f;if(c&&c.cols&&c.rows&&parseInt(c.cols,10)>0&&parseInt(c.rows,10)>0){for(f=c.tableStyle?'<table style="'+c.tableStyle+'">':"<table>",f+="<tbody>",e=0;e<c.rows;e++){for(f+="<tr>",d=0;d<c.cols;d++)f+="<td>&nbsp;</td>";f+="</tr>"}f+="</tbody></table>",a.commands.exec("insertHTML",f)}},state:function(){return!1}},wysihtml5.commands.mergeTableCells={exec:function(a,b){a.tableSelection&&a.tableSelection.start&&a.tableSelection.end&&(this.state(a,b)?wysihtml5.dom.table.unmergeCell(a.tableSelection.start):wysihtml5.dom.table.mergeCellsBetween(a.tableSelection.start,a.tableSelection.end))},state:function(a){if(a.tableSelection){var b=a.tableSelection.start,c=a.tableSelection.end;if(b&&c&&b==c&&(wysihtml5.dom.getAttribute(b,"colspan")&&parseInt(wysihtml5.dom.getAttribute(b,"colspan"),10)>1||wysihtml5.dom.getAttribute(b,"rowspan")&&parseInt(wysihtml5.dom.getAttribute(b,"rowspan"),10)>1))return[b]}return!1}},wysihtml5.commands.addTableCells={exec:function(a,b,c){if(a.tableSelection&&a.tableSelection.start&&a.tableSelection.end){var d=wysihtml5.dom.table.orderSelectionEnds(a.tableSelection.start,a.tableSelection.end);"before"==c||"above"==c?wysihtml5.dom.table.addCells(d.start,c):("after"==c||"below"==c)&&wysihtml5.dom.table.addCells(d.end,c),setTimeout(function(){a.tableSelection.select(d.start,d.end)},0)}},state:function(){return!1}},wysihtml5.commands.deleteTableCells={exec:function(a,b,c){if(a.tableSelection&&a.tableSelection.start&&a.tableSelection.end){var d,e=wysihtml5.dom.table.orderSelectionEnds(a.tableSelection.start,a.tableSelection.end),f=wysihtml5.dom.table.indexOf(e.start),g=a.tableSelection.table;wysihtml5.dom.table.removeCells(e.start,c),setTimeout(function(){d=wysihtml5.dom.table.findCell(g,f),d||("row"==c&&(d=wysihtml5.dom.table.findCell(g,{row:f.row-1,col:f.col})),"column"==c&&(d=wysihtml5.dom.table.findCell(g,{row:f.row,col:f.col-1}))),d&&a.tableSelection.select(d,d)},0)}},state:function(){return!1}},wysihtml5.commands.indentList={exec:function(a){var b=a.selection.getSelectionParentsByTag("LI");return b?this.tryToPushLiLevel(b,a.selection):!1},state:function(){return!1},tryToPushLiLevel:function(a,b){var c,d,e,f,g,h=!1;return b.executeAndRestoreRangy(function(){for(var b=a.length;b--;)f=a[b],c="OL"===f.parentNode.nodeName?"OL":"UL",d=f.ownerDocument.createElement(c),e=wysihtml5.dom.domNode(f).prev({nodeTypes:[wysihtml5.ELEMENT_NODE]}),g=e?e.querySelector("ul, ol"):null,e&&(g?g.appendChild(f):(d.appendChild(f),e.appendChild(d)),h=!0)}),h}},wysihtml5.commands.outdentList={exec:function(a){var b=a.selection.getSelectionParentsByTag("LI");return b?this.tryToPullLiLevel(b,a):!1},state:function(){return!1},tryToPullLiLevel:function(a,b){var c,d,e,f,g,h=!1,i=this;return b.selection.executeAndRestoreRangy(function(){var j,k;for(j=a.length;j--;)if(f=a[j],f.parentNode&&(c=f.parentNode,"OL"===c.tagName||"UL"===c.tagName)){if(h=!0,d=wysihtml5.dom.getParentElement(c.parentNode,{nodeName:["OL","UL"]},!1,b.element),e=wysihtml5.dom.getParentElement(c.parentNode,{nodeName:["LI"]},!1,b.element),d&&e)f.nextSibling&&(g=i.getAfterList(c,f),f.appendChild(g)),d.insertBefore(f,e.nextSibling);else{for(f.nextSibling&&(g=i.getAfterList(c,f),f.appendChild(g)),k=f.childNodes.length;k--;)c.parentNode.insertBefore(f.childNodes[k],c.nextSibling);c.parentNode.insertBefore(document.createElement("br"),c.nextSibling),f.parentNode.removeChild(f)}0===c.childNodes.length&&c.parentNode.removeChild(c)}}),h},getAfterList:function(a,b){for(var c=a.nodeName,d=document.createElement(c);b.nextSibling;)d.appendChild(b.nextSibling);return d}},function(a){var b=90,c=89,d=8,e=46,f=25,g="data-wysihtml5-selection-node",h="data-wysihtml5-selection-offset",i=('<span id="_wysihtml5-undo" class="_wysihtml5-temp">'+a.INVISIBLE_SPACE+"</span>",'<span id="_wysihtml5-redo" class="_wysihtml5-temp">'+a.INVISIBLE_SPACE+"</span>",a.dom);a.UndoManager=a.lang.Dispatcher.extend({constructor:function(a){this.editor=a,this.composer=a.composer,this.element=this.composer.element,this.position=0,this.historyStr=[],this.historyDom=[],this.transact(),this._observe()},_observe:function(){{var a,f=this;this.composer.sandbox.getDocument()}i.observe(this.element,"keydown",function(a){if(!a.altKey&&(a.ctrlKey||a.metaKey)){var d=a.keyCode,e=d===b&&!a.shiftKey,g=d===b&&a.shiftKey||d===c;e?(f.undo(),a.preventDefault()):g&&(f.redo(),a.preventDefault())}}),i.observe(this.element,"keydown",function(b){var c=b.keyCode;c!==a&&(a=c,(c===d||c===e)&&f.transact())}),this.editor.on("newword:composer",function(){f.transact()}).on("beforecommand:composer",function(){f.transact()})},transact:function(){var b,c,d,e,i,j,k,l=this.historyStr[this.position-1],m=this.composer.getValue(!1,!1),n=this.element.offsetWidth>0&&this.element.offsetHeight>0;m!==l&&(j=this.historyStr.length=this.historyDom.length=this.position,j>f&&(this.historyStr.shift(),this.historyDom.shift(),this.position--),this.position++,n&&(b=this.composer.selection.getRange(),c=b&&b.startContainer?b.startContainer:this.element,d=b&&b.startOffset?b.startOffset:0,c.nodeType===a.ELEMENT_NODE?e=c:(e=c.parentNode,i=this.getChildNodeIndex(e,c)),e.setAttribute(h,d),void 0!==i&&e.setAttribute(g,i)),k=this.element.cloneNode(!!m),this.historyDom.push(k),this.historyStr.push(m),e&&(e.removeAttribute(h),e.removeAttribute(g)))},undo:function(){this.transact(),this.undoPossible()&&(this.set(this.historyDom[--this.position-1]),this.editor.fire("undo:composer"))},redo:function(){this.redoPossible()&&(this.set(this.historyDom[++this.position-1]),this.editor.fire("redo:composer"))},undoPossible:function(){return this.position>1},redoPossible:function(){return this.position<this.historyStr.length},set:function(a){var b,c,d,e,f,i;for(this.element.innerHTML="",b=0,c=a.childNodes,d=a.childNodes.length;d>b;b++)this.element.appendChild(c[b].cloneNode(!0));a.hasAttribute(h)?(e=a.getAttribute(h),i=a.getAttribute(g),f=this.element):(f=this.element.querySelector("["+h+"]")||this.element,e=f.getAttribute(h),i=f.getAttribute(g),f.removeAttribute(h),f.removeAttribute(g)),null!==i&&(f=this.getChildNodeByIndex(f,+i)),this.composer.selection.set(f,e)},getChildNodeIndex:function(a,b){for(var c=0,d=a.childNodes,e=d.length;e>c;c++)if(d[c]===b)return c},getChildNodeByIndex:function(a,b){return a.childNodes[b]}})}(wysihtml5),wysihtml5.views.View=Base.extend({constructor:function(a,b,c){this.parent=a,this.element=b,this.config=c,this.config.noTextarea||this._observeViewChange()},_observeViewChange:function(){var a=this;this.parent.on("beforeload",function(){a.parent.on("change_view",function(b){b===a.name?(a.parent.currentView=a,a.show(),setTimeout(function(){a.focus()},0)):a.hide()})})},focus:function(){if(this.element.ownerDocument.querySelector(":focus")!==this.element)try{this.element.focus()}catch(a){}},hide:function(){this.element.style.display="none"},show:function(){this.element.style.display=""},disable:function(){this.element.setAttribute("disabled","disabled")},enable:function(){this.element.removeAttribute("disabled")}}),function(a){var b=a.dom,c=a.browser;a.views.Composer=a.views.View.extend({name:"composer",CARET_HACK:"<br>",constructor:function(a,b,c){this.base(a,b,c),this.config.noTextarea?this.editableArea=b:this.textarea=this.parent.textarea,this.config.contentEditableMode?this._initContentEditableArea():this._initSandbox()},clear:function(){this.element.innerHTML=c.displaysCaretInEmptyContentEditableCorrectly()?"":this.CARET_HACK},getValue:function(b,c){var d=this.isEmpty()?"":a.quirks.getCorrectInnerHTML(this.element);return b!==!1&&(d=this.parent.parse(d,c===!1?!1:!0)),d},setValue:function(a,b){b&&(a=this.parent.parse(a));try{this.element.innerHTML=a}catch(c){this.element.innerText=a}},cleanUp:function(){this.parent.parse(this.element)},show:function(){this.editableArea.style.display=this._displayStyle||"",this.config.noTextarea||this.textarea.element.disabled||(this.disable(),this.enable())},hide:function(){this._displayStyle=b.getStyle("display").from(this.editableArea),"none"===this._displayStyle&&(this._displayStyle=null),this.editableArea.style.display="none"},disable:function(){this.parent.fire("disable:composer"),this.element.removeAttribute("contentEditable")},enable:function(){this.parent.fire("enable:composer"),this.element.setAttribute("contentEditable","true")},focus:function(b){a.browser.doesAsyncFocus()&&this.hasPlaceholderSet()&&this.clear(),this.base();var c=this.element.lastChild;b&&c&&this.selection&&("BR"===c.nodeName?this.selection.setBefore(this.element.lastChild):this.selection.setAfter(this.element.lastChild))},getTextContent:function(){return b.getTextContent(this.element)},hasPlaceholderSet:function(){return this.getTextContent()==(this.config.noTextarea?this.editableArea.getAttribute("data-placeholder"):this.textarea.element.getAttribute("placeholder"))&&this.placeholderSet},isEmpty:function(){var a=this.element.innerHTML.toLowerCase();return/^(\s|<br>|<\/br>|<p>|<\/p>)*$/i.test(a)||""===a||"<br>"===a||"<p></p>"===a||"<p><br></p>"===a||this.hasPlaceholderSet()},_initContentEditableArea:function(){var a=this;this.config.noTextarea?this.sandbox=new b.ContentEditableArea(function(){a._create()},{},this.editableArea):(this.sandbox=new b.ContentEditableArea(function(){a._create()}),this.editableArea=this.sandbox.getContentEditable(),b.insert(this.editableArea).after(this.textarea.element),this._createWysiwygFormField())},_initSandbox:function(){var a,c=this;this.sandbox=new b.Sandbox(function(){c._create()},{stylesheets:this.config.stylesheets}),this.editableArea=this.sandbox.getIframe(),a=this.textarea.element,b.insert(this.editableArea).after(a),this._createWysiwygFormField()},_createWysiwygFormField:function(){if(this.textarea.element.form){var a=document.createElement("input");a.type="hidden",a.name="_wysihtml5_mode",a.value=1,b.insert(a).after(this.textarea.element)}},_create:function(){var d,e,f=this;this.doc=this.sandbox.getDocument(),this.element=this.config.contentEditableMode?this.sandbox.getContentEditable():this.doc.body,this.config.noTextarea?this.cleanUp():(this.textarea=this.parent.textarea,this.element.innerHTML=this.textarea.getValue(!0,!1)),this.selection=new a.Selection(this.parent,this.element,this.config.uneditableContainerClassname),this.commands=new a.Commands(this.parent),this.config.noTextarea||b.copyAttributes(["className","spellcheck","title","lang","dir","accessKey"]).from(this.textarea.element).to(this.element),b.addClass(this.element,this.config.composerClassName),this.config.style&&!this.config.contentEditableMode&&this.style(),this.observe(),d=this.config.name,d&&(b.addClass(this.element,d),this.config.contentEditableMode||b.addClass(this.editableArea,d)),this.enable(),!this.config.noTextarea&&this.textarea.element.disabled&&this.disable(),e="string"==typeof this.config.placeholder?this.config.placeholder:this.config.noTextarea?this.editableArea.getAttribute("data-placeholder"):this.textarea.element.getAttribute("placeholder"),e&&b.simulatePlaceholder(this.parent,this,e),this.commands.exec("styleWithCSS",!1),this._initAutoLinking(),this._initObjectResizing(),this._initUndoManager(),this._initLineBreaking(),this.config.noTextarea||!this.textarea.element.hasAttribute("autofocus")&&document.querySelector(":focus")!=this.textarea.element||c.isIos()||setTimeout(function(){f.focus(!0)},100),c.clearsContentEditableCorrectly()||a.quirks.ensureProperClearing(this),this.initSync&&this.config.sync&&this.initSync(),this.config.noTextarea||this.textarea.hide(),this.parent.fire("beforeload").fire("load")},_initAutoLinking:function(){var d,e,f,g=this,h=c.canDisableAutoLinking(),i=c.doesAutoLinkingInContentEditable();h&&this.commands.exec("autoUrlDetect",!1),this.config.autoLink&&((!i||i&&h)&&(this.parent.on("newword:composer",function(){b.getTextContent(g.element).match(b.autoLink.URL_REG_EXP)&&g.selection.executeAndRestore(function(c,d){var e,f=g.element.querySelectorAll("."+g.config.uneditableContainerClassname),h=!1;for(e=f.length;e--;)a.dom.contains(f[e],d)&&(h=!0);h||b.autoLink(d.parentNode,[g.config.uneditableContainerClassname])})}),b.observe(this.element,"blur",function(){b.autoLink(g.element,[g.config.uneditableContainerClassname])})),d=this.sandbox.getDocument().getElementsByTagName("a"),e=b.autoLink.URL_REG_EXP,f=function(c){var d=a.lang.string(b.getTextContent(c)).trim();return"www."===d.substr(0,4)&&(d="http://"+d),d},b.observe(this.element,"keydown",function(a){if(d.length){var c,h=g.selection.getSelectedNode(a.target.ownerDocument),i=b.getParentElement(h,{nodeName:"A"},4);i&&(c=f(i),setTimeout(function(){var a=f(i);a!==c&&a.match(e)&&i.setAttribute("href",a)},0))}}))},_initObjectResizing:function(){if(this.commands.exec("enableObjectResizing",!0),c.supportsEvent("resizeend")){var d=["width","height"],e=d.length,f=this.element;b.observe(f,"resizeend",function(b){var c,g=b.target||b.srcElement,h=g.style,i=0;if("IMG"===g.nodeName){for(;e>i;i++)c=d[i],h[c]&&(g.setAttribute(c,parseInt(h[c],10)),h[c]="");a.quirks.redraw(f)}})}},_initUndoManager:function(){this.undoManager=new a.UndoManager(this.parent)},_initLineBreaking:function(){function d(a){var c=b.getParentElement(a,{nodeName:["P","DIV"]},2);c&&b.contains(e.element,c)&&e.selection.executeAndRestore(function(){e.config.useLineBreaks?b.replaceWithChildNodes(c):"P"!==c.nodeName&&b.renameElement(c,"p")})}var e=this,f=["LI","P","H1","H2","H3","H4","H5","H6"],g=["UL","OL","MENU"];this.config.useLineBreaks||b.observe(this.element,["focus","keydown"],function(){if(e.isEmpty()){var a=e.doc.createElement("P");e.element.innerHTML="",e.element.appendChild(a),c.displaysCaretInEmptyContentEditableCorrectly()?e.selection.selectNode(a,!0):(a.innerHTML="<br>",e.selection.setBefore(a.firstChild))}}),b.observe(this.element,"keydown",function(c){var h,i=c.keyCode;if(!c.shiftKey&&(i===a.ENTER_KEY||i===a.BACKSPACE_KEY))return h=b.getParentElement(e.selection.getSelectedNode(),{nodeName:f},4),h?(setTimeout(function(){var c,f=e.selection.getSelectedNode();if("LI"===h.nodeName){if(!f)return;c=b.getParentElement(f,{nodeName:g},2),c||d(f)}i===a.ENTER_KEY&&h.nodeName.match(/^H[1-6]$/)&&d(f)},0),void 0):(e.config.useLineBreaks&&i===a.ENTER_KEY&&!a.browser.insertsLineBreaksOnReturn()&&(c.preventDefault(),e.commands.exec("insertLineBreak")),void 0)})}})}(wysihtml5),function(a){var b=a.dom,c=document,d=window,e=c.createElement("div"),f=["background-color","color","cursor","font-family","font-size","font-style","font-variant","font-weight","line-height","letter-spacing","text-align","text-decoration","text-indent","text-rendering","word-break","word-wrap","word-spacing"],g=["background-color","border-collapse","border-bottom-color","border-bottom-style","border-bottom-width","border-left-color","border-left-style","border-left-width","border-right-color","border-right-style","border-right-width","border-top-color","border-top-style","border-top-width","clear","display","float","margin-bottom","margin-left","margin-right","margin-top","outline-color","outline-offset","outline-width","outline-style","padding-left","padding-right","padding-top","padding-bottom","position","top","left","right","bottom","z-index","vertical-align","text-align","-webkit-box-sizing","-moz-box-sizing","-ms-box-sizing","box-sizing","-webkit-box-shadow","-moz-box-shadow","-ms-box-shadow","box-shadow","-webkit-border-top-right-radius","-moz-border-radius-topright","border-top-right-radius","-webkit-border-bottom-right-radius","-moz-border-radius-bottomright","border-bottom-right-radius","-webkit-border-bottom-left-radius","-moz-border-radius-bottomleft","border-bottom-left-radius","-webkit-border-top-left-radius","-moz-border-radius-topleft","border-top-left-radius","width","height"],h=["html { height: 100%; }","body { height: 100%; padding: 1px 0 0 0; margin: -1px 0 0 0; }","body > p:first-child { margin-top: 0; }","._wysihtml5-temp { display: none; }",a.browser.isGecko?"body.placeholder { color: graytext !important; }":"body.placeholder { color: #a9a9a9 !important; }","img:-moz-broken { -moz-force-broken-image-icon: 1; height: 24px; width: 24px; }"],i=function(a){if(a.setActive)try{a.setActive()}catch(e){}else{var f=a.style,g=c.documentElement.scrollTop||c.body.scrollTop,h=c.documentElement.scrollLeft||c.body.scrollLeft,i={position:f.position,top:f.top,left:f.left,WebkitUserSelect:f.WebkitUserSelect};b.setStyles({position:"absolute",top:"-99999px",left:"-99999px",WebkitUserSelect:"none"}).on(a),a.focus(),b.setStyles(i).on(a),d.scrollTo&&d.scrollTo(h,g)}};a.views.Composer.prototype.style=function(){var d,j,k=this,l=c.querySelector(":focus"),m=this.textarea.element,n=m.hasAttribute("placeholder"),o=n&&m.getAttribute("placeholder"),p=m.style.display,q=m.disabled;return this.focusStylesHost=e.cloneNode(!1),this.blurStylesHost=e.cloneNode(!1),this.disabledStylesHost=e.cloneNode(!1),n&&m.removeAttribute("placeholder"),m===l&&m.blur(),m.disabled=!1,m.style.display=d="none",(m.getAttribute("rows")&&"auto"===b.getStyle("height").from(m)||m.getAttribute("cols")&&"auto"===b.getStyle("width").from(m))&&(m.style.display=d=p),b.copyStyles(g).from(m).to(this.editableArea).andTo(this.blurStylesHost),b.copyStyles(f).from(m).to(this.element).andTo(this.blurStylesHost),b.insertCSS(h).into(this.element.ownerDocument),m.disabled=!0,b.copyStyles(g).from(m).to(this.disabledStylesHost),b.copyStyles(f).from(m).to(this.disabledStylesHost),m.disabled=q,m.style.display=p,i(m),m.style.display=d,b.copyStyles(g).from(m).to(this.focusStylesHost),b.copyStyles(f).from(m).to(this.focusStylesHost),m.style.display=p,b.copyStyles(["display"]).from(m).to(this.editableArea),j=a.lang.array(g).without(["display"]),l?l.focus():m.blur(),n&&m.setAttribute("placeholder",o),this.parent.on("focus:composer",function(){b.copyStyles(j).from(k.focusStylesHost).to(k.editableArea),b.copyStyles(f).from(k.focusStylesHost).to(k.element)}),this.parent.on("blur:composer",function(){b.copyStyles(j).from(k.blurStylesHost).to(k.editableArea),b.copyStyles(f).from(k.blurStylesHost).to(k.element)}),this.parent.observe("disable:composer",function(){b.copyStyles(j).from(k.disabledStylesHost).to(k.editableArea),b.copyStyles(f).from(k.disabledStylesHost).to(k.element)}),this.parent.observe("enable:composer",function(){b.copyStyles(j).from(k.blurStylesHost).to(k.editableArea),b.copyStyles(f).from(k.blurStylesHost).to(k.element)}),this}}(wysihtml5),function(a){var b=a.dom,c=a.browser,d={66:"bold",73:"italic",85:"underline"},e=function(a,b,c){var d,e=a.getPreviousNode(b,!0),f=a.getSelectedNode();if(1!==f.nodeType&&f.parentNode!==c&&(f=f.parentNode),e)if(1==f.nodeType){if(d=f.firstChild,1==e.nodeType)for(;f.firstChild;)e.appendChild(f.firstChild);else for(;f.firstChild;)b.parentNode.insertBefore(f.firstChild,b);f.parentNode&&f.parentNode.removeChild(f),a.setBefore(d)}else 1==e.nodeType?e.appendChild(f):b.parentNode.insertBefore(f,b),a.setBefore(f)},f=function(a,b,c,d){var f,g,h;b.isCollapsed()?b.caretIsInTheBeginnig("LI")?(a.preventDefault(),d.commands.exec("outdentList")):b.caretIsInTheBeginnig()?a.preventDefault():(b.caretIsFirstInSelection()&&b.getPreviousNode()&&b.getPreviousNode().nodeName&&/^H\d$/gi.test(b.getPreviousNode().nodeName)&&(f=b.getPreviousNode(),a.preventDefault(),/^\s*$/.test(f.textContent||f.innerText)?f.parentNode.removeChild(f):(g=f.ownerDocument.createRange(),g.selectNodeContents(f),g.collapse(!1),b.setSelection(g))),h=b.caretIsBeforeUneditable(),h&&(a.preventDefault(),e(b,h,c))):b.containsUneditable()&&(a.preventDefault(),b.deleteContents())},g=function(a){if(a.selection.isCollapsed()){if(a.selection.caretIsInTheBeginnig("LI")&&a.commands.exec("indentList"))return}else a.selection.deleteContents(); +a.commands.exec("insertHTML","&emsp;")};a.views.Composer.prototype.observe=function(){var e,h,i=this,j=this.getValue(!1,!1),k=this.sandbox.getIframe?this.sandbox.getIframe():this.sandbox.getContentEditable(),l=this.element,m=c.supportsEventsInIframeCorrectly()||this.sandbox.getContentEditable?l:this.sandbox.getWindow(),n=["drop","paste","beforepaste"],o=["drop","paste","mouseup","focus","keyup"];b.observe(k,"DOMNodeRemoved",function(){clearInterval(e),i.parent.fire("destroy:composer")}),c.supportsMutationEvents()||(e=setInterval(function(){b.contains(document.documentElement,k)||(clearInterval(e),i.parent.fire("destroy:composer"))},250)),b.observe(m,o,function(){setTimeout(function(){i.parent.fire("interaction").fire("interaction:composer")},0)}),this.config.handleTables&&(!this.tableClickHandle&&this.doc.execCommand&&a.browser.supportsCommand(this.doc,"enableObjectResizing")&&a.browser.supportsCommand(this.doc,"enableInlineTableEditing")&&(this.sandbox.getIframe?this.tableClickHandle=b.observe(k,["focus","mouseup","mouseover"],function(){i.doc.execCommand("enableObjectResizing",!1,"false"),i.doc.execCommand("enableInlineTableEditing",!1,"false"),i.tableClickHandle.stop()}):setTimeout(function(){i.doc.execCommand("enableObjectResizing",!1,"false"),i.doc.execCommand("enableInlineTableEditing",!1,"false")},0)),this.tableSelection=a.quirks.tableCellsSelection(l,i.parent)),b.observe(m,"focus",function(a){i.parent.fire("focus",a).fire("focus:composer",a),setTimeout(function(){j=i.getValue(!1,!1)},0)}),b.observe(m,"blur",function(a){if(j!==i.getValue(!1,!1)){var b=a;"function"==typeof Object.create&&(b=Object.create(a,{type:{value:"change"}})),i.parent.fire("change",b).fire("change:composer",b)}i.parent.fire("blur",a).fire("blur:composer",a)}),b.observe(l,"dragenter",function(){i.parent.fire("unset_placeholder")}),b.observe(l,n,function(a){i.parent.fire(a.type,a).fire(a.type+":composer",a)}),this.config.copyedFromMarking&&b.observe(l,"copy",function(a){a.clipboardData&&(a.clipboardData.setData("text/html",i.config.copyedFromMarking+i.selection.getHtml()),a.preventDefault()),i.parent.fire(a.type,a).fire(a.type+":composer",a)}),b.observe(l,"keyup",function(b){var c=b.keyCode;(c===a.SPACE_KEY||c===a.ENTER_KEY)&&i.parent.fire("newword:composer")}),this.parent.on("paste:composer",function(){setTimeout(function(){i.parent.fire("newword:composer")},0)}),c.canSelectImagesInContentEditable()||b.observe(l,"mousedown",function(b){var c=b.target,d=l.querySelectorAll("img"),e=l.querySelectorAll("."+i.config.uneditableContainerClassname+" img"),f=a.lang.array(d).without(e);"IMG"===c.nodeName&&a.lang.array(f).contains(c)&&i.selection.selectNode(c)}),c.canSelectImagesInContentEditable()||b.observe(l,"drop",function(){setTimeout(function(){i.selection.getSelection().removeAllRanges()},0)}),c.hasHistoryIssue()&&c.supportsSelectionModify()&&b.observe(l,"keydown",function(a){if(a.metaKey||a.ctrlKey){var b=a.keyCode,c=l.ownerDocument.defaultView,d=c.getSelection();(37===b||39===b)&&(37===b&&(d.modify("extend","left","lineboundary"),a.shiftKey||d.collapseToStart()),39===b&&(d.modify("extend","right","lineboundary"),a.shiftKey||d.collapseToEnd()),a.preventDefault())}}),b.observe(l,"keydown",function(a){var b=a.keyCode,c=d[b];(a.ctrlKey||a.metaKey)&&!a.altKey&&c&&(i.commands.exec(c),a.preventDefault()),8===b?f(a,i.selection,l,i):i.config.handleTabKey&&9===b&&(a.preventDefault(),g(i,l))}),b.observe(l,"keydown",function(b){var c,d=i.selection.getSelectedNode(!0),e=b.keyCode;!d||"IMG"!==d.nodeName||e!==a.BACKSPACE_KEY&&e!==a.DELETE_KEY||(c=d.parentNode,c.removeChild(d),"A"!==c.nodeName||c.firstChild||c.parentNode.removeChild(c),setTimeout(function(){a.quirks.redraw(l)},0),b.preventDefault())}),!this.config.contentEditableMode&&c.hasIframeFocusIssue()&&(b.observe(k,"focus",function(){setTimeout(function(){i.doc.querySelector(":focus")!==i.element&&i.focus()},0)}),b.observe(this.element,"blur",function(){setTimeout(function(){i.selection.getSelection().removeAllRanges()},0)})),h={IMG:"Image: ",A:"Link: "},b.observe(l,"mouseover",function(a){var b,c,d=a.target,e=d.nodeName;("A"===e||"IMG"===e)&&(c=d.hasAttribute("title"),c||(b=h[e]+(d.getAttribute("href")||d.getAttribute("src")),d.setAttribute("title",b)))})}}(wysihtml5),function(a){var b=400;a.views.Synchronizer=Base.extend({constructor:function(a,b,c){this.editor=a,this.textarea=b,this.composer=c,this._observe()},fromComposerToTextarea:function(b){this.textarea.setValue(a.lang.string(this.composer.getValue(!1,!1)).trim(),b)},fromTextareaToComposer:function(a){var b=this.textarea.getValue(!1,!1);b?this.composer.setValue(b,a):(this.composer.clear(),this.editor.fire("set_placeholder"))},sync:function(a){"textarea"===this.editor.currentView.name?this.fromTextareaToComposer(a):this.fromComposerToTextarea(a)},_observe:function(){var c,d=this,e=this.textarea.element.form,f=function(){c=setInterval(function(){d.fromComposerToTextarea()},b)},g=function(){clearInterval(c),c=null};f(),e&&(a.dom.observe(e,"submit",function(){d.sync(!0)}),a.dom.observe(e,"reset",function(){setTimeout(function(){d.fromTextareaToComposer()},0)})),this.editor.on("change_view",function(a){"composer"!==a||c?"textarea"===a&&(d.fromComposerToTextarea(!0),g()):(d.fromTextareaToComposer(!0),f())}),this.editor.on("destroy:composer",g)}})}(wysihtml5),wysihtml5.views.Textarea=wysihtml5.views.View.extend({name:"textarea",constructor:function(a,b,c){this.base(a,b,c),this._observe()},clear:function(){this.element.value=""},getValue:function(a){var b=this.isEmpty()?"":this.element.value;return a!==!1&&(b=this.parent.parse(b)),b},setValue:function(a,b){b&&(a=this.parent.parse(a)),this.element.value=a},cleanUp:function(){var a=this.parent.parse(this.element.value);this.element.value=a},hasPlaceholderSet:function(){var a=wysihtml5.browser.supportsPlaceholderAttributeOn(this.element),b=this.element.getAttribute("placeholder")||null,c=this.element.value,d=!c;return a&&d||c===b},isEmpty:function(){return!wysihtml5.lang.string(this.element.value).trim()||this.hasPlaceholderSet()},_observe:function(){var a=this.element,b=this.parent,c={focusin:"focus",focusout:"blur"},d=wysihtml5.browser.supportsEvent("focusin")?["focusin","focusout","change"]:["focus","blur","change"];b.on("beforeload",function(){wysihtml5.dom.observe(a,d,function(a){var d=c[a.type]||a.type;b.fire(d).fire(d+":textarea")}),wysihtml5.dom.observe(a,["paste","drop"],function(){setTimeout(function(){b.fire("paste").fire("paste:textarea")},0)})})}}),function(a){var b,c={name:b,style:!0,toolbar:b,showToolbarAfterInit:!0,autoLink:!0,handleTables:!0,handleTabKey:!0,parserRules:{tags:{br:{},span:{},div:{},p:{}},classes:{}},pasteParserRulesets:null,parser:a.dom.parse,composerClassName:"wysihtml5-editor",bodyClassName:"wysihtml5-supported",useLineBreaks:!0,stylesheets:[],placeholderText:b,supportTouchDevices:!0,cleanUp:!0,contentEditableMode:!1,uneditableContainerClassname:"wysihtml5-uneditable-container",copyedFromMarking:'<meta name="copied-from" content="wysihtml5">'};a.Editor=a.lang.Dispatcher.extend({constructor:function(b,d){if(this.editableElement="string"==typeof b?document.getElementById(b):b,this.config=a.lang.object({}).merge(c).merge(d).get(),this._isCompatible=a.browser.supported(),"textarea"!=this.editableElement.nodeName.toLowerCase()&&(this.config.contentEditableMode=!0,this.config.noTextarea=!0),this.config.noTextarea||(this.textarea=new a.views.Textarea(this,this.editableElement,this.config),this.currentView=this.textarea),!this._isCompatible||!this.config.supportTouchDevices&&a.browser.isTouchDevice()){var e=this;return setTimeout(function(){e.fire("beforeload").fire("load")},0),void 0}a.dom.addClass(document.body,this.config.bodyClassName),this.composer=new a.views.Composer(this,this.editableElement,this.config),this.currentView=this.composer,"function"==typeof this.config.parser&&this._initParser(),this.on("beforeload",this.handleBeforeLoad)},handleBeforeLoad:function(){this.config.noTextarea||(this.synchronizer=new a.views.Synchronizer(this,this.textarea,this.composer)),this.config.toolbar&&(this.toolbar=new a.toolbar.Toolbar(this,this.config.toolbar,this.config.showToolbarAfterInit))},isCompatible:function(){return this._isCompatible},clear:function(){return this.currentView.clear(),this},getValue:function(a,b){return this.currentView.getValue(a,b)},setValue:function(a,b){return this.fire("unset_placeholder"),a?(this.currentView.setValue(a,b),this):this.clear()},cleanUp:function(){this.currentView.cleanUp()},focus:function(a){return this.currentView.focus(a),this},disable:function(){return this.currentView.disable(),this},enable:function(){return this.currentView.enable(),this},isEmpty:function(){return this.currentView.isEmpty()},hasPlaceholderSet:function(){return this.currentView.hasPlaceholderSet()},parse:function(b,c){var d=this.config.contentEditableMode?document:this.composer?this.composer.sandbox.getDocument():null,e=this.config.parser(b,{rules:this.config.parserRules,cleanUp:this.config.cleanUp,context:d,uneditableClass:this.config.uneditableContainerClassname,clearInternals:c});return"object"==typeof b&&a.quirks.redraw(b),e},_initParser:function(){var b,c=this;a.browser.supportsModenPaste()?this.on("paste:composer",function(d){d.preventDefault(),b=a.dom.getPastedHtml(d),b&&c._cleanAndPaste(b)}):this.on("beforepaste:composer",function(b){b.preventDefault(),a.dom.getPastedHtmlWithDiv(c.composer,function(a){a&&c._cleanAndPaste(a)})})},_cleanAndPaste:function(b){var c=a.quirks.cleanPastedHTML(b,{referenceNode:this.composer.element,rules:this.config.pasteParserRulesets||[{set:this.config.parserRules}],uneditableClass:this.config.uneditableContainerClassname});this.composer.selection.deleteContents(),this.composer.selection.insertHTML(c)}})}(wysihtml5),function(a){var b=a.dom,c="wysihtml5-command-dialog-opened",d="input, select, textarea",e="[data-wysihtml5-dialog-field]",f="data-wysihtml5-dialog-field";a.toolbar.Dialog=a.lang.Dispatcher.extend({constructor:function(a,b){this.link=a,this.container=b},_observe:function(){var e,f,g,h,i,j;if(!this._observed){for(e=this,f=function(a){var b=e._serialize();b==e.elementToChange?e.fire("edit",b):e.fire("save",b),e.hide(),a.preventDefault(),a.stopPropagation()},b.observe(e.link,"click",function(){b.hasClass(e.link,c)&&setTimeout(function(){e.hide()},0)}),b.observe(this.container,"keydown",function(b){var c=b.keyCode;c===a.ENTER_KEY&&f(b),c===a.ESCAPE_KEY&&(e.fire("cancel"),e.hide())}),b.delegate(this.container,"[data-wysihtml5-dialog-action=save]","click",f),b.delegate(this.container,"[data-wysihtml5-dialog-action=cancel]","click",function(a){e.fire("cancel"),e.hide(),a.preventDefault(),a.stopPropagation()}),g=this.container.querySelectorAll(d),h=0,i=g.length,j=function(){clearInterval(e.interval)};i>h;h++)b.observe(g[h],"change",j);this._observed=!0}},_serialize:function(){for(var a=this.elementToChange||{},b=this.container.querySelectorAll(e),c=b.length,d=0;c>d;d++)a[b[d].getAttribute(f)]=b[d].value;return a},_interpolate:function(a){for(var b,c,d,g=document.querySelector(":focus"),h=this.container.querySelectorAll(e),i=h.length,j=0;i>j;j++)b=h[j],b!==g&&(a&&"hidden"===b.type||(c=b.getAttribute(f),d=this.elementToChange&&"boolean"!=typeof this.elementToChange?this.elementToChange.getAttribute(c)||"":b.defaultValue,b.value=d))},show:function(a){if(!b.hasClass(this.link,c)){var e=this,f=this.container.querySelector(d);if(this.elementToChange=a,this._observe(),this._interpolate(),a&&(this.interval=setInterval(function(){e._interpolate(!0)},500)),b.addClass(this.link,c),this.container.style.display="",this.fire("show"),f&&!a)try{f.focus()}catch(g){}}},hide:function(){clearInterval(this.interval),this.elementToChange=null,b.removeClass(this.link,c),this.container.style.display="none",this.fire("hide")}})}(wysihtml5),function(a){var b=a.dom,c={position:"relative"},d={left:0,margin:0,opacity:0,overflow:"hidden",padding:0,position:"absolute",top:0,zIndex:1},e={cursor:"inherit",fontSize:"50px",height:"50px",marginTop:"-25px",outline:0,padding:0,position:"absolute",right:"-4px",top:"50%"},f={"x-webkit-speech":"",speech:""};a.toolbar.Speech=function(g,h){var i,j,k,l=document.createElement("input");return a.browser.supportsSpeechApiOn(l)?(i=g.editor.textarea.element.getAttribute("lang"),i&&(f.lang=i),j=document.createElement("div"),a.lang.object(d).merge({width:h.offsetWidth+"px",height:h.offsetHeight+"px"}),b.insert(l).into(j),b.insert(j).into(h),b.setStyles(e).on(l),b.setAttributes(f).on(l),b.setStyles(d).on(j),b.setStyles(c).on(h),k="onwebkitspeechchange"in l?"webkitspeechchange":"speechchange",b.observe(l,k,function(){g.execCommand("insertText",l.value),l.value=""}),b.observe(l,"click",function(a){b.hasClass(h,"wysihtml5-command-disabled")&&a.preventDefault(),a.stopPropagation()}),void 0):(h.style.display="none",void 0)}}(wysihtml5),function(a){var b="wysihtml5-command-disabled",c="wysihtml5-commands-disabled",d="wysihtml5-command-active",e="wysihtml5-action-active",f=a.dom;a.toolbar.Toolbar=Base.extend({constructor:function(f,g,h){this.editor=f,this.container="string"==typeof g?document.getElementById(g):g,this.composer=f.composer,this._getLinks("command"),this._getLinks("action"),this._observe(),h&&this.show(),null!=f.config.classNameCommandDisabled&&(b=f.config.classNameCommandDisabled),null!=f.config.classNameCommandsDisabled&&(c=f.config.classNameCommandsDisabled),null!=f.config.classNameCommandActive&&(d=f.config.classNameCommandActive),null!=f.config.classNameActionActive&&(e=f.config.classNameActionActive);for(var i=this.container.querySelectorAll("[data-wysihtml5-command=insertSpeech]"),j=i.length,k=0;j>k;k++)new a.toolbar.Speech(this,i[k])},_getLinks:function(b){for(var c,d,e,f,g,h=this[b+"Links"]=a.lang.array(this.container.querySelectorAll("[data-wysihtml5-"+b+"]")).get(),i=h.length,j=0,k=this[b+"Mapping"]={};i>j;j++)c=h[j],e=c.getAttribute("data-wysihtml5-"+b),f=c.getAttribute("data-wysihtml5-"+b+"-value"),d=this.container.querySelector("[data-wysihtml5-"+b+"-group='"+e+"']"),g=this._getDialog(c,e),k[e+":"+f]={link:c,group:d,name:e,value:f,dialog:g,state:!1}},_getDialog:function(b,c){var d,e,f=this,g=this.container.querySelector("[data-wysihtml5-dialog='"+c+"']");return g&&(d=a.toolbar["Dialog_"+c]?new a.toolbar["Dialog_"+c](b,g):new a.toolbar.Dialog(b,g),d.on("show",function(){e=f.composer.selection.getBookmark(),f.editor.fire("show:dialog",{command:c,dialogContainer:g,commandLink:b})}),d.on("save",function(a){e&&f.composer.selection.setBookmark(e),f._execCommand(c,a),f.editor.fire("save:dialog",{command:c,dialogContainer:g,commandLink:b})}),d.on("cancel",function(){f.editor.focus(!1),f.editor.fire("cancel:dialog",{command:c,dialogContainer:g,commandLink:b})})),d},execCommand:function(a,b){if(!this.commandsDisabled){var c=this.commandMapping[a+":"+b];c&&c.dialog&&!c.state?c.dialog.show():this._execCommand(a,b)}},_execCommand:function(a,b){this.editor.focus(!1),this.composer.commands.exec(a,b),this._updateLinkStates()},execAction:function(a){var b=this.editor;"change_view"===a&&b.textarea&&(b.currentView===b.textarea?b.fire("change_view","composer"):b.fire("change_view","textarea")),"showSource"==a&&b.fire("showSource")},_observe:function(){for(var a=this,b=this.editor,d=this.container,e=this.commandLinks.concat(this.actionLinks),g=e.length,h=0;g>h;h++)"A"===e[h].nodeName?f.setAttributes({href:"javascript:;",unselectable:"on"}).on(e[h]):f.setAttributes({unselectable:"on"}).on(e[h]);f.delegate(d,"[data-wysihtml5-command], [data-wysihtml5-action]","mousedown",function(a){a.preventDefault()}),f.delegate(d,"[data-wysihtml5-command]","click",function(b){var c=this,d=c.getAttribute("data-wysihtml5-command"),e=c.getAttribute("data-wysihtml5-command-value");a.execCommand(d,e),b.preventDefault()}),f.delegate(d,"[data-wysihtml5-action]","click",function(b){var c=this.getAttribute("data-wysihtml5-action");a.execAction(c),b.preventDefault()}),b.on("interaction:composer",function(){a._updateLinkStates()}),b.on("focus:composer",function(){a.bookmark=null}),this.editor.config.handleTables&&(b.on("tableselect:composer",function(){a.container.querySelectorAll('[data-wysihtml5-hiddentools="table"]')[0].style.display=""}),b.on("tableunselect:composer",function(){a.container.querySelectorAll('[data-wysihtml5-hiddentools="table"]')[0].style.display="none"})),b.on("change_view",function(e){b.textarea&&setTimeout(function(){a.commandsDisabled="composer"!==e,a._updateLinkStates(),a.commandsDisabled?f.addClass(d,c):f.removeClass(d,c)},0)})},_updateLinkStates:function(){var c,g,h,i,j=this.commandMapping,k=this.actionMapping;for(c in j)i=j[c],this.commandsDisabled?(g=!1,f.removeClass(i.link,d),i.group&&f.removeClass(i.group,d),i.dialog&&i.dialog.hide()):(g=this.composer.commands.state(i.name,i.value),f.removeClass(i.link,b),i.group&&f.removeClass(i.group,b)),i.state!==g&&(i.state=g,g?(f.addClass(i.link,d),i.group&&f.addClass(i.group,d),i.dialog&&("object"==typeof g||a.lang.object(g).isArray()?(!i.dialog.multiselect&&a.lang.object(g).isArray()&&(g=1===g.length?g[0]:!0,i.state=g),i.dialog.show(g)):i.dialog.hide())):(f.removeClass(i.link,d),i.group&&f.removeClass(i.group,d),i.dialog&&i.dialog.hide()));for(c in k)h=k[c],"change_view"===h.name&&(h.state=this.editor.currentView===this.editor.textarea,h.state?f.addClass(h.link,e):f.removeClass(h.link,e))},show:function(){this.container.style.display=""},hide:function(){this.container.style.display="none"}})}(wysihtml5),function(a){a.toolbar.Dialog_createTable=a.toolbar.Dialog.extend({show:function(a){this.base(a)}})}(wysihtml5),function(a){var b=(a.dom,"[data-wysihtml5-dialog-field]"),c="data-wysihtml5-dialog-field";a.toolbar.Dialog_foreColorStyle=a.toolbar.Dialog.extend({multiselect:!0,_serialize:function(){for(var a={},d=this.container.querySelectorAll(b),e=d.length,f=0;e>f;f++)a[d[f].getAttribute(c)]=d[f].value;return a},_interpolate:function(d){for(var e,f=document.querySelector(":focus"),g=this.container.querySelectorAll(b),h=g.length,i=0,j=this.elementToChange?a.lang.object(this.elementToChange).isArray()?this.elementToChange[0]:this.elementToChange:null,k=j?j.getAttribute("style"):null,l=k?a.quirks.styleParser.parseColor(k,"color"):null;h>i;i++)e=g[i],e!==f&&(d&&"hidden"===e.type||"color"===e.getAttribute(c)&&(e.value=l?l[3]&&1!=l[3]?"rgba("+l[0]+","+l[1]+","+l[2]+","+l[3]+");":"rgb("+l[0]+","+l[1]+","+l[2]+");":"rgb(0,0,0);"))}})}(wysihtml5),function(a){a.dom;a.toolbar.Dialog_fontSizeStyle=a.toolbar.Dialog.extend({multiselect:!0,_serialize:function(){return{size:this.container.querySelector('[data-wysihtml5-dialog-field="size"]').value}},_interpolate:function(){var b=document.querySelector(":focus"),c=this.container.querySelector("[data-wysihtml5-dialog-field='size']"),d=this.elementToChange?a.lang.object(this.elementToChange).isArray()?this.elementToChange[0]:this.elementToChange:null,e=d?d.getAttribute("style"):null,f=e?a.quirks.styleParser.parseFontSize(e):null;c&&c!==b&&f&&!/^\s*$/.test(f)&&(c.value=f)}})}(wysihtml5),Handlebars=function(){var a=function(){"use strict";function a(a){this.string=a}var b;return a.prototype.toString=function(){return""+this.string},b=a}(),b=function(a){"use strict";function b(a){return k[a]||"&amp;"}function c(a,b){for(var c in b)Object.prototype.hasOwnProperty.call(b,c)&&(a[c]=b[c])}function d(a){return a instanceof j?""+a:a||0===a?(a=""+a,m.test(a)?a.replace(l,b):a):""}function e(a){return a||0===a?h(a)&&0===a.length?!0:!1:!0}var f,g,h,i={},j=a,k={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},l=/[&<>"'`]/g,m=/[&<>"'`]/;return i.extend=c,f=Object.prototype.toString,i.toString=f,g=function(a){return"function"==typeof a},g(/x/)&&(g=function(a){return"function"==typeof a&&"[object Function]"===f.call(a)}),i.isFunction=g,h=Array.isArray||function(a){return a&&"object"==typeof a?"[object Array]"===f.call(a):!1},i.isArray=h,i.escapeExpression=d,i.isEmpty=e,i}(a),c=function(){"use strict";function a(a,b){var d,e,f;for(b&&b.firstLine&&(d=b.firstLine,a+=" - "+d+":"+b.firstColumn),e=Error.prototype.constructor.call(this,a),f=0;f<c.length;f++)this[c[f]]=e[c[f]];d&&(this.lineNumber=d,this.column=b.firstColumn)}var b,c=["description","fileName","lineNumber","message","name","number","stack"];return a.prototype=Error(),b=a}(),d=function(a,b){"use strict";function c(a,b){this.helpers=a||{},this.partials=b||{},d(this)}function d(a){a.registerHelper("helperMissing",function(a){if(2===arguments.length)return void 0;throw new p("Missing helper: '"+a+"'")}),a.registerHelper("blockHelperMissing",function(b,c){var d=c.inverse||function(){},e=c.fn;return i(b)&&(b=b.call(this)),b===!0?e(this):b===!1||null==b?d(this):h(b)?b.length>0?a.helpers.each(b,c):d(this):e(b)}),a.registerHelper("each",function(a,b){var c,d,e,f=b.fn,g=b.inverse,j=0,k="";if(i(a)&&(a=a.call(this)),b.data&&(c=m(b.data)),a&&"object"==typeof a)if(h(a))for(d=a.length;d>j;j++)c&&(c.index=j,c.first=0===j,c.last=j===a.length-1),k+=f(a[j],{data:c});else for(e in a)a.hasOwnProperty(e)&&(c&&(c.key=e,c.index=j,c.first=0===j),k+=f(a[e],{data:c}),j++);return 0===j&&(k=g(this)),k}),a.registerHelper("if",function(a,b){return i(a)&&(a=a.call(this)),!b.hash.includeZero&&!a||o.isEmpty(a)?b.inverse(this):b.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})}),a.registerHelper("with",function(a,b){return i(a)&&(a=a.call(this)),o.isEmpty(a)?void 0:b.fn(a)}),a.registerHelper("log",function(b,c){var d=c.data&&null!=c.data.level?parseInt(c.data.level,10):1;a.log(d,b)})}function e(a,b){l.log(a,b)}var f,g,h,i,j,k,l,m,n={},o=a,p=b,q="1.3.0";return n.VERSION=q,f=4,n.COMPILER_REVISION=f,g={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:">= 1.0.0"},n.REVISION_CHANGES=g,h=o.isArray,i=o.isFunction,j=o.toString,k="[object Object]",n.HandlebarsEnvironment=c,c.prototype={constructor:c,logger:l,log:e,registerHelper:function(a,b,c){if(j.call(a)===k){if(c||b)throw new p("Arg not supported with multiple helpers");o.extend(this.helpers,a)}else c&&(b.not=c),this.helpers[a]=b},registerPartial:function(a,b){j.call(a)===k?o.extend(this.partials,a):this.partials[a]=b}},l={methodMap:{0:"debug",1:"info",2:"warn",3:"error"},DEBUG:0,INFO:1,WARN:2,ERROR:3,level:3,log:function(a,b){if(l.level<=a){var c=l.methodMap[a];"undefined"!=typeof console&&console[c]&&console[c].call(console,b)}}},n.logger=l,n.log=e,m=function(a){var b={};return o.extend(b,a),b},n.createFrame=m,n}(b,c),e=function(a,b,c){"use strict";function d(a){var b,c,d=a&&a[0]||1,e=m;if(d!==e){if(e>d)throw b=n[e],c=n[d],new l("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+b+") or downgrade your runtime to an older version ("+c+").");throw new l("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function e(a,b){if(!b)throw new l("No environment passed to template");var c=function(a,c,d,e,f,g){var h,i=b.VM.invokePartial.apply(this,arguments);if(null!=i)return i;if(b.compile)return h={helpers:e,partials:f,data:g},f[c]=b.compile(a,{data:void 0!==g},b),f[c](d,h);throw new l("The partial "+c+" could not be compiled when running in runtime-only mode")},d={escapeExpression:k.escapeExpression,invokePartial:c,programs:[],program:function(a,b,c){var d=this.programs[a];return c?d=g(a,b,c):d||(d=this.programs[a]=g(a,b)),d},merge:function(a,b){var c=a||b;return a&&b&&a!==b&&(c={},k.extend(c,b),k.extend(c,a)),c},programWithDepth:b.VM.programWithDepth,noop:b.VM.noop,compilerInfo:null};return function(c,e){var f,g,h,i;return e=e||{},h=e.partial?e:b,e.partial||(f=e.helpers,g=e.partials),i=a.call(d,h,c,f,g,e.data),e.partial||b.VM.checkRevision(d.compilerInfo),i}}function f(a,b,c){var d=Array.prototype.slice.call(arguments,3),e=function(a,e){return e=e||{},b.apply(this,[a,e.data||c].concat(d))};return e.program=a,e.depth=d.length,e}function g(a,b,c){var d=function(a,d){return d=d||{},b(a,d.data||c)};return d.program=a,d.depth=0,d}function h(a,b,c,d,e,f){var g={partial:!0,helpers:d,partials:e,data:f};if(void 0===a)throw new l("The partial "+b+" could not be found");return a instanceof Function?a(c,g):void 0}function i(){return""}var j={},k=a,l=b,m=c.COMPILER_REVISION,n=c.REVISION_CHANGES;return j.checkRevision=d,j.template=e,j.programWithDepth=f,j.program=g,j.invokePartial=h,j.noop=i,j}(b,c,d),f=function(a,b,c,d,e){"use strict";var f,g=a,h=b,i=c,j=d,k=e,l=function(){var a=new g.HandlebarsEnvironment;return j.extend(a,g),a.SafeString=h,a.Exception=i,a.Utils=j,a.VM=k,a.template=function(b){return k.template(b,a)},a},m=l();return m.create=l,f=m}(d,a,c,b,e);return f}(),this.wysihtml5=this.wysihtml5||{},this.wysihtml5.tpl=this.wysihtml5.tpl||{},this.wysihtml5.tpl.blockquote=Handlebars.template(function(a,b,c,d,e){function f(a){var b,c="";return c+="btn-"+l((b=a&&a.options,b=null==b||b===!1?b:b.toolbar,b=null==b||b===!1?b:b.size,typeof b===k?b.apply(a):b)),c}function g(){return' \n <span class="fa fa-quote-left"></span>\n '}function h(){return'\n <span class="glyphicon glyphicon-quote"></span>\n '}this.compilerInfo=[4,">= 1.0.0"],c=this.merge(c,a.helpers),e=e||{};var i,j="",k="function",l=this.escapeExpression,m=this;return j+='<li>\n <a class="btn ',i=c["if"].call(b,(i=b&&b.options,i=null==i||i===!1?i:i.toolbar,null==i||i===!1?i:i.size),{hash:{},inverse:m.noop,fn:m.program(1,f,e),data:e}),(i||0===i)&&(j+=i),j+=' btn-default" data-wysihtml5-command="formatBlock" data-wysihtml5-command-value="blockquote" data-wysihtml5-display-format-name="false" tabindex="-1">\n ',i=c["if"].call(b,(i=b&&b.options,i=null==i||i===!1?i:i.toolbar,null==i||i===!1?i:i.fa),{hash:{},inverse:m.program(5,h,e),fn:m.program(3,g,e),data:e}),(i||0===i)&&(j+=i),j+="\n </a>\n</li>\n",j}),this.wysihtml5.tpl.color=Handlebars.template(function(a,b,c,d,e){function f(a){var b,c="";return c+="btn-"+j((b=a&&a.options,b=null==b||b===!1?b:b.toolbar,b=null==b||b===!1?b:b.size,typeof b===i?b.apply(a):b)),c}this.compilerInfo=[4,">= 1.0.0"],c=this.merge(c,a.helpers),e=e||{};var g,h="",i="function",j=this.escapeExpression,k=this;return h+='<li class="dropdown">\n <a class="btn btn-default dropdown-toggle ',g=c["if"].call(b,(g=b&&b.options,g=null==g||g===!1?g:g.toolbar,null==g||g===!1?g:g.size),{hash:{},inverse:k.noop,fn:k.program(1,f,e),data:e}),(g||0===g)&&(h+=g),h+='" data-toggle="dropdown" tabindex="-1">\n <span class="current-color">'+j((g=b&&b.locale,g=null==g||g===!1?g:g.colours,g=null==g||g===!1?g:g.black,typeof g===i?g.apply(b):g))+'</span>\n <b class="caret"></b>\n </a>\n <ul class="dropdown-menu">\n <li><div class="wysihtml5-colors" data-wysihtml5-command-value="black"></div><a class="wysihtml5-colors-title" data-wysihtml5-command="foreColor" data-wysihtml5-command-value="black">'+j((g=b&&b.locale,g=null==g||g===!1?g:g.colours,g=null==g||g===!1?g:g.black,typeof g===i?g.apply(b):g))+'</a></li>\n <li><div class="wysihtml5-colors" data-wysihtml5-command-value="silver"></div><a class="wysihtml5-colors-title" data-wysihtml5-command="foreColor" data-wysihtml5-command-value="silver">'+j((g=b&&b.locale,g=null==g||g===!1?g:g.colours,g=null==g||g===!1?g:g.silver,typeof g===i?g.apply(b):g))+'</a></li>\n <li><div class="wysihtml5-colors" data-wysihtml5-command-value="gray"></div><a class="wysihtml5-colors-title" data-wysihtml5-command="foreColor" data-wysihtml5-command-value="gray">'+j((g=b&&b.locale,g=null==g||g===!1?g:g.colours,g=null==g||g===!1?g:g.gray,typeof g===i?g.apply(b):g))+'</a></li>\n <li><div class="wysihtml5-colors" data-wysihtml5-command-value="maroon"></div><a class="wysihtml5-colors-title" data-wysihtml5-command="foreColor" data-wysihtml5-command-value="maroon">'+j((g=b&&b.locale,g=null==g||g===!1?g:g.colours,g=null==g||g===!1?g:g.maroon,typeof g===i?g.apply(b):g))+'</a></li>\n <li><div class="wysihtml5-colors" data-wysihtml5-command-value="red"></div><a class="wysihtml5-colors-title" data-wysihtml5-command="foreColor" data-wysihtml5-command-value="red">'+j((g=b&&b.locale,g=null==g||g===!1?g:g.colours,g=null==g||g===!1?g:g.red,typeof g===i?g.apply(b):g))+'</a></li>\n <li><div class="wysihtml5-colors" data-wysihtml5-command-value="purple"></div><a class="wysihtml5-colors-title" data-wysihtml5-command="foreColor" data-wysihtml5-command-value="purple">'+j((g=b&&b.locale,g=null==g||g===!1?g:g.colours,g=null==g||g===!1?g:g.purple,typeof g===i?g.apply(b):g))+'</a></li>\n <li><div class="wysihtml5-colors" data-wysihtml5-command-value="green"></div><a class="wysihtml5-colors-title" data-wysihtml5-command="foreColor" data-wysihtml5-command-value="green">'+j((g=b&&b.locale,g=null==g||g===!1?g:g.colours,g=null==g||g===!1?g:g.green,typeof g===i?g.apply(b):g))+'</a></li>\n <li><div class="wysihtml5-colors" data-wysihtml5-command-value="olive"></div><a class="wysihtml5-colors-title" data-wysihtml5-command="foreColor" data-wysihtml5-command-value="olive">'+j((g=b&&b.locale,g=null==g||g===!1?g:g.colours,g=null==g||g===!1?g:g.olive,typeof g===i?g.apply(b):g))+'</a></li>\n <li><div class="wysihtml5-colors" data-wysihtml5-command-value="navy"></div><a class="wysihtml5-colors-title" data-wysihtml5-command="foreColor" data-wysihtml5-command-value="navy">'+j((g=b&&b.locale,g=null==g||g===!1?g:g.colours,g=null==g||g===!1?g:g.navy,typeof g===i?g.apply(b):g))+'</a></li>\n <li><div class="wysihtml5-colors" data-wysihtml5-command-value="blue"></div><a class="wysihtml5-colors-title" data-wysihtml5-command="foreColor" data-wysihtml5-command-value="blue">'+j((g=b&&b.locale,g=null==g||g===!1?g:g.colours,g=null==g||g===!1?g:g.blue,typeof g===i?g.apply(b):g))+'</a></li>\n <li><div class="wysihtml5-colors" data-wysihtml5-command-value="orange"></div><a class="wysihtml5-colors-title" data-wysihtml5-command="foreColor" data-wysihtml5-command-value="orange">'+j((g=b&&b.locale,g=null==g||g===!1?g:g.colours,g=null==g||g===!1?g:g.orange,typeof g===i?g.apply(b):g))+"</a></li>\n </ul>\n</li>\n",h}),this.wysihtml5.tpl.emphasis=Handlebars.template(function(a,b,c,d,e){function f(a){var b,c="";return c+="btn-"+k((b=a&&a.options,b=null==b||b===!1?b:b.toolbar,b=null==b||b===!1?b:b.size,typeof b===j?b.apply(a):b)),c}function g(a,b){var d,e="";return e+='\n <a class="btn ',d=c["if"].call(a,(d=a&&a.options,d=null==d||d===!1?d:d.toolbar,null==d||d===!1?d:d.size),{hash:{},inverse:l.noop,fn:l.program(1,f,b),data:b}),(d||0===d)&&(e+=d),e+=' btn-default" data-wysihtml5-command="small" title="CTRL+S" tabindex="-1">'+k((d=a&&a.locale,d=null==d||d===!1?d:d.emphasis,d=null==d||d===!1?d:d.small,typeof d===j?d.apply(a):d))+"</a>\n ",e}this.compilerInfo=[4,">= 1.0.0"],c=this.merge(c,a.helpers),e=e||{};var h,i="",j="function",k=this.escapeExpression,l=this;return i+='<li>\n <div class="btn-group">\n <a class="btn ',h=c["if"].call(b,(h=b&&b.options,h=null==h||h===!1?h:h.toolbar,null==h||h===!1?h:h.size),{hash:{},inverse:l.noop,fn:l.program(1,f,e),data:e}),(h||0===h)&&(i+=h),i+=' btn-default" data-wysihtml5-command="bold" title="CTRL+B" tabindex="-1">'+k((h=b&&b.locale,h=null==h||h===!1?h:h.emphasis,h=null==h||h===!1?h:h.bold,typeof h===j?h.apply(b):h))+'</a>\n <a class="btn ',h=c["if"].call(b,(h=b&&b.options,h=null==h||h===!1?h:h.toolbar,null==h||h===!1?h:h.size),{hash:{},inverse:l.noop,fn:l.program(1,f,e),data:e}),(h||0===h)&&(i+=h),i+=' btn-default" data-wysihtml5-command="italic" title="CTRL+I" tabindex="-1">'+k((h=b&&b.locale,h=null==h||h===!1?h:h.emphasis,h=null==h||h===!1?h:h.italic,typeof h===j?h.apply(b):h))+'</a>\n <a class="btn ',h=c["if"].call(b,(h=b&&b.options,h=null==h||h===!1?h:h.toolbar,null==h||h===!1?h:h.size),{hash:{},inverse:l.noop,fn:l.program(1,f,e),data:e}),(h||0===h)&&(i+=h),i+=' btn-default" data-wysihtml5-command="underline" title="CTRL+U" tabindex="-1">'+k((h=b&&b.locale,h=null==h||h===!1?h:h.emphasis,h=null==h||h===!1?h:h.underline,typeof h===j?h.apply(b):h))+"</a>\n ",h=c["if"].call(b,(h=b&&b.options,h=null==h||h===!1?h:h.toolbar,h=null==h||h===!1?h:h.emphasis,null==h||h===!1?h:h.small),{hash:{},inverse:l.noop,fn:l.program(3,g,e),data:e}),(h||0===h)&&(i+=h),i+="\n </div>\n</li>\n",i +}),this.wysihtml5.tpl["font-styles"]=Handlebars.template(function(a,b,c,d,e){function f(a){var b,c="";return c+="btn-"+l((b=a&&a.options,b=null==b||b===!1?b:b.toolbar,b=null==b||b===!1?b:b.size,typeof b===k?b.apply(a):b)),c}function g(){return'\n <span class="fa fa-font"></span>\n '}function h(){return'\n <span class="glyphicon glyphicon-font"></span>\n '}this.compilerInfo=[4,">= 1.0.0"],c=this.merge(c,a.helpers),e=e||{};var i,j="",k="function",l=this.escapeExpression,m=this;return j+='<li class="dropdown">\n <a class="btn btn-default dropdown-toggle ',i=c["if"].call(b,(i=b&&b.options,i=null==i||i===!1?i:i.toolbar,null==i||i===!1?i:i.size),{hash:{},inverse:m.noop,fn:m.program(1,f,e),data:e}),(i||0===i)&&(j+=i),j+='" data-toggle="dropdown">\n ',i=c["if"].call(b,(i=b&&b.options,i=null==i||i===!1?i:i.toolbar,null==i||i===!1?i:i.fa),{hash:{},inverse:m.program(5,h,e),fn:m.program(3,g,e),data:e}),(i||0===i)&&(j+=i),j+='\n <span class="current-font">'+l((i=b&&b.locale,i=null==i||i===!1?i:i.font_styles,i=null==i||i===!1?i:i.normal,typeof i===k?i.apply(b):i))+'</span>\n <b class="caret"></b>\n </a>\n <ul class="dropdown-menu">\n <li><a data-wysihtml5-command="formatBlock" data-wysihtml5-command-value="p" tabindex="-1">'+l((i=b&&b.locale,i=null==i||i===!1?i:i.font_styles,i=null==i||i===!1?i:i.normal,typeof i===k?i.apply(b):i))+'</a></li>\n <li><a data-wysihtml5-command="formatBlock" data-wysihtml5-command-value="h1" tabindex="-1">'+l((i=b&&b.locale,i=null==i||i===!1?i:i.font_styles,i=null==i||i===!1?i:i.h1,typeof i===k?i.apply(b):i))+'</a></li>\n <li><a data-wysihtml5-command="formatBlock" data-wysihtml5-command-value="h2" tabindex="-1">'+l((i=b&&b.locale,i=null==i||i===!1?i:i.font_styles,i=null==i||i===!1?i:i.h2,typeof i===k?i.apply(b):i))+'</a></li>\n <li><a data-wysihtml5-command="formatBlock" data-wysihtml5-command-value="h3" tabindex="-1">'+l((i=b&&b.locale,i=null==i||i===!1?i:i.font_styles,i=null==i||i===!1?i:i.h3,typeof i===k?i.apply(b):i))+'</a></li>\n <li><a data-wysihtml5-command="formatBlock" data-wysihtml5-command-value="h4" tabindex="-1">'+l((i=b&&b.locale,i=null==i||i===!1?i:i.font_styles,i=null==i||i===!1?i:i.h4,typeof i===k?i.apply(b):i))+'</a></li>\n <li><a data-wysihtml5-command="formatBlock" data-wysihtml5-command-value="h5" tabindex="-1">'+l((i=b&&b.locale,i=null==i||i===!1?i:i.font_styles,i=null==i||i===!1?i:i.h5,typeof i===k?i.apply(b):i))+'</a></li>\n <li><a data-wysihtml5-command="formatBlock" data-wysihtml5-command-value="h6" tabindex="-1">'+l((i=b&&b.locale,i=null==i||i===!1?i:i.font_styles,i=null==i||i===!1?i:i.h6,typeof i===k?i.apply(b):i))+"</a></li>\n </ul>\n</li>\n",j}),this.wysihtml5.tpl.html=Handlebars.template(function(a,b,c,d,e){function f(a){var b,c="";return c+="btn-"+l((b=a&&a.options,b=null==b||b===!1?b:b.toolbar,b=null==b||b===!1?b:b.size,typeof b===k?b.apply(a):b)),c}function g(){return'\n <span class="fa fa-pencil"></span>\n '}function h(){return'\n <span class="glyphicon glyphicon-pencil"></span>\n '}this.compilerInfo=[4,">= 1.0.0"],c=this.merge(c,a.helpers),e=e||{};var i,j="",k="function",l=this.escapeExpression,m=this;return j+='<li>\n <div class="btn-group">\n <a class="btn ',i=c["if"].call(b,(i=b&&b.options,i=null==i||i===!1?i:i.toolbar,null==i||i===!1?i:i.size),{hash:{},inverse:m.noop,fn:m.program(1,f,e),data:e}),(i||0===i)&&(j+=i),j+=' btn-default" data-wysihtml5-action="change_view" title="'+l((i=b&&b.locale,i=null==i||i===!1?i:i.html,i=null==i||i===!1?i:i.edit,typeof i===k?i.apply(b):i))+'" tabindex="-1">\n ',i=c["if"].call(b,(i=b&&b.options,i=null==i||i===!1?i:i.toolbar,null==i||i===!1?i:i.fa),{hash:{},inverse:m.program(5,h,e),fn:m.program(3,g,e),data:e}),(i||0===i)&&(j+=i),j+="\n </a>\n </div>\n</li>\n",j}),this.wysihtml5.tpl.image=Handlebars.template(function(a,b,c,d,e){function f(){return"modal-sm"}function g(a){var b,c="";return c+="btn-"+m((b=a&&a.options,b=null==b||b===!1?b:b.toolbar,b=null==b||b===!1?b:b.size,typeof b===l?b.apply(a):b)),c}function h(){return'\n <span class="fa fa-file-image-o"></span>\n '}function i(){return'\n <span class="glyphicon glyphicon-picture"></span>\n '}this.compilerInfo=[4,">= 1.0.0"],c=this.merge(c,a.helpers),e=e||{};var j,k="",l="function",m=this.escapeExpression,n=this;return k+='<li>\n <div class="bootstrap-wysihtml5-insert-image-modal modal fade" data-wysihtml5-dialog="insertImage">\n <div class="modal-dialog ',j=c["if"].call(b,(j=b&&b.options,j=null==j||j===!1?j:j.toolbar,null==j||j===!1?j:j.smallmodals),{hash:{},inverse:n.noop,fn:n.program(1,f,e),data:e}),(j||0===j)&&(k+=j),k+='">\n <div class="modal-content">\n <div class="modal-header">\n <a class="close" data-dismiss="modal">&times;</a>\n <h3>'+m((j=b&&b.locale,j=null==j||j===!1?j:j.image,j=null==j||j===!1?j:j.insert,typeof j===l?j.apply(b):j))+'</h3>\n </div>\n <div class="modal-body">\n <div class="form-group">\n <input value="http://" class="bootstrap-wysihtml5-insert-image-url form-control" data-wysihtml5-dialog-field="src">\n </div> \n </div>\n <div class="modal-footer">\n <a class="btn btn-default" data-dismiss="modal" data-wysihtml5-dialog-action="cancel" href="#">'+m((j=b&&b.locale,j=null==j||j===!1?j:j.image,j=null==j||j===!1?j:j.cancel,typeof j===l?j.apply(b):j))+'</a>\n <a class="btn btn-primary" data-dismiss="modal" data-wysihtml5-dialog-action="save" href="#">'+m((j=b&&b.locale,j=null==j||j===!1?j:j.image,j=null==j||j===!1?j:j.insert,typeof j===l?j.apply(b):j))+'</a>\n </div>\n </div>\n </div>\n </div>\n <a class="btn ',j=c["if"].call(b,(j=b&&b.options,j=null==j||j===!1?j:j.toolbar,null==j||j===!1?j:j.size),{hash:{},inverse:n.noop,fn:n.program(3,g,e),data:e}),(j||0===j)&&(k+=j),k+=' btn-default" data-wysihtml5-command="insertImage" title="'+m((j=b&&b.locale,j=null==j||j===!1?j:j.image,j=null==j||j===!1?j:j.insert,typeof j===l?j.apply(b):j))+'" tabindex="-1">\n ',j=c["if"].call(b,(j=b&&b.options,j=null==j||j===!1?j:j.toolbar,null==j||j===!1?j:j.fa),{hash:{},inverse:n.program(7,i,e),fn:n.program(5,h,e),data:e}),(j||0===j)&&(k+=j),k+="\n </a>\n</li>\n",k}),this.wysihtml5.tpl.link=Handlebars.template(function(a,b,c,d,e){function f(){return"modal-sm"}function g(a){var b,c="";return c+="btn-"+m((b=a&&a.options,b=null==b||b===!1?b:b.toolbar,b=null==b||b===!1?b:b.size,typeof b===l?b.apply(a):b)),c}function h(){return'\n <span class="fa fa-share-square-o"></span>\n '}function i(){return'\n <span class="glyphicon glyphicon-share"></span>\n '}this.compilerInfo=[4,">= 1.0.0"],c=this.merge(c,a.helpers),e=e||{};var j,k="",l="function",m=this.escapeExpression,n=this;return k+='<li>\n <div class="bootstrap-wysihtml5-insert-link-modal modal fade" data-wysihtml5-dialog="createLink">\n <div class="modal-dialog ',j=c["if"].call(b,(j=b&&b.options,j=null==j||j===!1?j:j.toolbar,null==j||j===!1?j:j.smallmodals),{hash:{},inverse:n.noop,fn:n.program(1,f,e),data:e}),(j||0===j)&&(k+=j),k+='">\n <div class="modal-content">\n <div class="modal-header">\n <a class="close" data-dismiss="modal">&times;</a>\n <h3>'+m((j=b&&b.locale,j=null==j||j===!1?j:j.link,j=null==j||j===!1?j:j.insert,typeof j===l?j.apply(b):j))+'</h3>\n </div>\n <div class="modal-body">\n <div class="form-group">\n <input value="http://" class="bootstrap-wysihtml5-insert-link-url form-control" data-wysihtml5-dialog-field="href">\n </div> \n <div class="checkbox">\n <label> \n <input type="checkbox" class="bootstrap-wysihtml5-insert-link-target" checked>'+m((j=b&&b.locale,j=null==j||j===!1?j:j.link,j=null==j||j===!1?j:j.target,typeof j===l?j.apply(b):j))+'\n </label>\n </div>\n </div>\n <div class="modal-footer">\n <a class="btn btn-default" data-dismiss="modal" data-wysihtml5-dialog-action="cancel" href="#">'+m((j=b&&b.locale,j=null==j||j===!1?j:j.link,j=null==j||j===!1?j:j.cancel,typeof j===l?j.apply(b):j))+'</a>\n <a href="#" class="btn btn-primary" data-dismiss="modal" data-wysihtml5-dialog-action="save">'+m((j=b&&b.locale,j=null==j||j===!1?j:j.link,j=null==j||j===!1?j:j.insert,typeof j===l?j.apply(b):j))+'</a>\n </div>\n </div>\n </div>\n </div>\n <a class="btn ',j=c["if"].call(b,(j=b&&b.options,j=null==j||j===!1?j:j.toolbar,null==j||j===!1?j:j.size),{hash:{},inverse:n.noop,fn:n.program(3,g,e),data:e}),(j||0===j)&&(k+=j),k+=' btn-default" data-wysihtml5-command="createLink" title="'+m((j=b&&b.locale,j=null==j||j===!1?j:j.link,j=null==j||j===!1?j:j.insert,typeof j===l?j.apply(b):j))+'" tabindex="-1">\n ',j=c["if"].call(b,(j=b&&b.options,j=null==j||j===!1?j:j.toolbar,null==j||j===!1?j:j.fa),{hash:{},inverse:n.program(7,i,e),fn:n.program(5,h,e),data:e}),(j||0===j)&&(k+=j),k+="\n </a>\n</li>\n",k}),this.wysihtml5.tpl.lists=Handlebars.template(function(a,b,c,d,e){function f(a){var b,c="";return c+="btn-"+r((b=a&&a.options,b=null==b||b===!1?b:b.toolbar,b=null==b||b===!1?b:b.size,typeof b===q?b.apply(a):b)),c}function g(){return'\n <span class="fa fa-list-ul"></span>\n '}function h(){return'\n <span class="glyphicon glyphicon-list"></span>\n '}function i(){return'\n <span class="fa fa-list-ol"></span>\n '}function j(){return'\n <span class="glyphicon glyphicon-th-list"></span>\n '}function k(){return'\n <span class="fa fa-outdent"></span>\n '}function l(){return'\n <span class="glyphicon glyphicon-indent-right"></span>\n '}function m(){return'\n <span class="fa fa-indent"></span>\n '}function n(){return'\n <span class="glyphicon glyphicon-indent-left"></span>\n '}this.compilerInfo=[4,">= 1.0.0"],c=this.merge(c,a.helpers),e=e||{};var o,p="",q="function",r=this.escapeExpression,s=this;return p+='<li>\n <div class="btn-group">\n <a class="btn ',o=c["if"].call(b,(o=b&&b.options,o=null==o||o===!1?o:o.toolbar,null==o||o===!1?o:o.size),{hash:{},inverse:s.noop,fn:s.program(1,f,e),data:e}),(o||0===o)&&(p+=o),p+=' btn-default" data-wysihtml5-command="insertUnorderedList" title="'+r((o=b&&b.locale,o=null==o||o===!1?o:o.lists,o=null==o||o===!1?o:o.unordered,typeof o===q?o.apply(b):o))+'" tabindex="-1">\n ',o=c["if"].call(b,(o=b&&b.options,o=null==o||o===!1?o:o.toolbar,null==o||o===!1?o:o.fa),{hash:{},inverse:s.program(5,h,e),fn:s.program(3,g,e),data:e}),(o||0===o)&&(p+=o),p+='\n </a>\n <a class="btn ',o=c["if"].call(b,(o=b&&b.options,o=null==o||o===!1?o:o.toolbar,null==o||o===!1?o:o.size),{hash:{},inverse:s.noop,fn:s.program(1,f,e),data:e}),(o||0===o)&&(p+=o),p+=' btn-default" data-wysihtml5-command="insertOrderedList" title="'+r((o=b&&b.locale,o=null==o||o===!1?o:o.lists,o=null==o||o===!1?o:o.ordered,typeof o===q?o.apply(b):o))+'" tabindex="-1">\n ',o=c["if"].call(b,(o=b&&b.options,o=null==o||o===!1?o:o.toolbar,null==o||o===!1?o:o.fa),{hash:{},inverse:s.program(9,j,e),fn:s.program(7,i,e),data:e}),(o||0===o)&&(p+=o),p+='\n </a>\n <a class="btn ',o=c["if"].call(b,(o=b&&b.options,o=null==o||o===!1?o:o.toolbar,null==o||o===!1?o:o.size),{hash:{},inverse:s.noop,fn:s.program(1,f,e),data:e}),(o||0===o)&&(p+=o),p+=' btn-default" data-wysihtml5-command="Outdent" title="'+r((o=b&&b.locale,o=null==o||o===!1?o:o.lists,o=null==o||o===!1?o:o.outdent,typeof o===q?o.apply(b):o))+'" tabindex="-1">\n ',o=c["if"].call(b,(o=b&&b.options,o=null==o||o===!1?o:o.toolbar,null==o||o===!1?o:o.fa),{hash:{},inverse:s.program(13,l,e),fn:s.program(11,k,e),data:e}),(o||0===o)&&(p+=o),p+='\n </a>\n <a class="btn ',o=c["if"].call(b,(o=b&&b.options,o=null==o||o===!1?o:o.toolbar,null==o||o===!1?o:o.size),{hash:{},inverse:s.noop,fn:s.program(1,f,e),data:e}),(o||0===o)&&(p+=o),p+=' btn-default" data-wysihtml5-command="Indent" title="'+r((o=b&&b.locale,o=null==o||o===!1?o:o.lists,o=null==o||o===!1?o:o.indent,typeof o===q?o.apply(b):o))+'" tabindex="-1">\n ',o=c["if"].call(b,(o=b&&b.options,o=null==o||o===!1?o:o.toolbar,null==o||o===!1?o:o.fa),{hash:{},inverse:s.program(17,n,e),fn:s.program(15,m,e),data:e}),(o||0===o)&&(p+=o),p+="\n </a>\n </div>\n</li>\n",p}),function(a){"use strict";"function"==typeof define&&define.amd?define("bootstrap.wysihtml5",["jquery","wysihtml5","bootstrap","bootstrap.wysihtml5.templates","bootstrap.wysihtml5.commands"],a):a(jQuery,wysihtml5)}(function(a,b){"use strict";var c=function(a,b){var c,d,e,f=function(a,c,d){return b.tpl[a]?b.tpl[a]({locale:c,options:d}):void 0},g=function(c,e){var f,g;this.el=c,f=a.extend(!0,{},d,e);for(g in f.customTemplates)f.customTemplates.hasOwnProperty(g)&&(b.tpl[g]=f.customTemplates[g]);this.toolbar=this.createToolbar(c,f),this.editor=this.createEditor(f)};g.prototype={constructor:g,createEditor:function(b){b=b||{},b=a.extend(!0,{},b),b.toolbar=this.toolbar[0],this.initializeEditor(this.el[0],b)},initializeEditor:function(a,c){var d,e=new b.Editor(this.el[0],c);if(e.on("beforeload",this.syncBootstrapDialogEvents),e.on("beforeload",this.loadParserRules),e.composer.editableArea.contentDocument?this.addMoreShortcuts(e,e.composer.editableArea.contentDocument.body||e.composer.editableArea.contentDocument,c.shortcuts):this.addMoreShortcuts(e,e.composer.editableArea,c.shortcuts),c&&c.events)for(d in c.events)c.events.hasOwnProperty(d)&&e.on(d,c.events[d]);return e},loadParserRules:function(){"string"===a.type(this.config.parserRules)&&a.ajax({dataType:"json",url:this.config.parserRules,context:this,error:function(a,b,c){void 0},success:function(a){this.config.parserRules=a,void 0}}),this.config.pasteParserRulesets&&"string"===a.type(this.config.pasteParserRulesets)&&a.ajax({dataType:"json",url:this.config.pasteParserRulesets,context:this,error:function(a,b,c){void 0},success:function(a){this.config.pasteParserRulesets=a}})},syncBootstrapDialogEvents:function(){var b=this;a.map(this.toolbar.commandMapping,function(a){return[a]}).filter(function(a){return a.dialog}).map(function(a){return a.dialog}).forEach(function(c){c.on("show",function(){a(this.container).modal("show")}),c.on("hide",function(){a(this.container).modal("hide"),setTimeout(b.composer.focus,0)}),a(c.container).on("shown.bs.modal",function(){a(this).find("input, select, textarea").first().focus()})}),this.on("change_view",function(){a(this.toolbar.container.children).find("a.btn").not('[data-wysihtml5-action="change_view"]').toggleClass("disabled")})},createToolbar:function(b,c){var g,h,i=this,j=a("<ul/>",{"class":"wysihtml5-toolbar",style:"display:none"}),k=c.locale||d.locale||"en";e.hasOwnProperty(k)||(void 0,k="en"),g=a.extend(!0,{},e.en,e[k]);for(h in c.toolbar)c.toolbar[h]&&j.append(f(h,g,c));return j.find('a[data-wysihtml5-command="formatBlock"]').click(function(b){var c=b.delegateTarget||b.target||b.srcElement,d=a(c),e=d.data("wysihtml5-display-format-name"),f=d.data("wysihtml5-format-name")||d.html();(void 0===e||"true"===e)&&i.toolbar.find(".current-font").text(f)}),j.find('a[data-wysihtml5-command="foreColor"]').click(function(b){var c=b.target||b.srcElement,d=a(c);i.toolbar.find(".current-color").text(d.html())}),this.el.before(j),j},addMoreShortcuts:function(a,c,d){b.dom.observe(c,"keydown",function(c){var e,f=c.keyCode,g=d[f];(c.ctrlKey||c.metaKey||c.altKey)&&g&&b.commands[g]&&(e=a.toolbar.commandMapping[g+":null"],e&&e.dialog&&!e.state?e.dialog.show():b.commands[g].exec(a.composer,g),c.preventDefault())})}},c={resetDefaults:function(){a.fn.wysihtml5.defaultOptions=a.extend(!0,{},a.fn.wysihtml5.defaultOptionsCache)},bypassDefaults:function(b){return this.each(function(){var c=a(this);c.data("wysihtml5",new g(c,b))})},shallowExtend:function(b){var d=a.extend({},a.fn.wysihtml5.defaultOptions,b||{},a(this).data()),e=this;return c.bypassDefaults.apply(e,[d])},deepExtend:function(b){var d=a.extend(!0,{},a.fn.wysihtml5.defaultOptions,b||{}),e=this;return c.bypassDefaults.apply(e,[d])},init:function(a){var b=this;return c.shallowExtend.apply(b,[a])}},a.fn.wysihtml5=function(b){return c[b]?c[b].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof b&&b?(a.error("Method "+b+" does not exist on jQuery.wysihtml5"),void 0):c.init.apply(this,arguments)},a.fn.wysihtml5.Constructor=g,d=a.fn.wysihtml5.defaultOptions={toolbar:{"font-styles":!0,color:!1,emphasis:{small:!0},blockquote:!0,lists:!0,html:!1,link:!0,image:!0,smallmodals:!1},useLineBreaks:!1,parserRules:{classes:{"wysiwyg-color-silver":1,"wysiwyg-color-gray":1,"wysiwyg-color-white":1,"wysiwyg-color-maroon":1,"wysiwyg-color-red":1,"wysiwyg-color-purple":1,"wysiwyg-color-fuchsia":1,"wysiwyg-color-green":1,"wysiwyg-color-lime":1,"wysiwyg-color-olive":1,"wysiwyg-color-yellow":1,"wysiwyg-color-navy":1,"wysiwyg-color-blue":1,"wysiwyg-color-teal":1,"wysiwyg-color-aqua":1,"wysiwyg-color-orange":1},tags:{b:{},i:{},strong:{},em:{},p:{},br:{},ol:{},ul:{},li:{},h1:{},h2:{},h3:{},h4:{},h5:{},h6:{},blockquote:{},u:1,img:{check_attributes:{width:"numbers",alt:"alt",src:"url",height:"numbers"}},a:{check_attributes:{href:"url"},set_attributes:{target:"_blank",rel:"nofollow"}},span:1,div:1,small:1,code:1,pre:1}},locale:"en",shortcuts:{83:"small",75:"createLink"}},void 0===a.fn.wysihtml5.defaultOptionsCache&&(a.fn.wysihtml5.defaultOptionsCache=a.extend(!0,{},a.fn.wysihtml5.defaultOptions)),e=a.fn.wysihtml5.locale={}};c(a,b)}),function(a){a.commands.small={exec:function(b,c){return a.commands.formatInline.exec(b,c,"small")},state:function(b,c){return a.commands.formatInline.state(b,c,"small")}}}(wysihtml5),function(a){"function"==typeof define&&define.amd?define("bootstrap.wysihtml5.en-US",["jquery","bootstrap.wysihtml5"],a):a(jQuery)}(function(a){a.fn.wysihtml5.locale.en=a.fn.wysihtml5.locale["en-US"]={font_styles:{normal:"Normal text",h1:"Heading 1",h2:"Heading 2",h3:"Heading 3",h4:"Heading 4",h5:"Heading 5",h6:"Heading 6"},emphasis:{bold:"Bold",italic:"Italic",underline:"Underline",small:"Small"},lists:{unordered:"Unordered list",ordered:"Ordered list",outdent:"Outdent",indent:"Indent"},link:{insert:"Insert link",cancel:"Cancel",target:"Open link in new window"},image:{insert:"Insert image",cancel:"Cancel"},html:{edit:"Edit HTML"},colours:{black:"Black",silver:"Silver",gray:"Grey",maroon:"Maroon",red:"Red",purple:"Purple",green:"Green",olive:"Olive",navy:"Navy",blue:"Blue",orange:"Orange"}}}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.css b/theme/bootstrap/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.css new file mode 100644 index 0000000..51c58df --- /dev/null +++ b/theme/bootstrap/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.css @@ -0,0 +1,117 @@ +ul.wysihtml5-toolbar { + margin: 0; + padding: 0; + display: block; +} + +ul.wysihtml5-toolbar::after { + clear: both; + display: table; + content: ""; +} + +ul.wysihtml5-toolbar > li { + float: left; + display: list-item; + list-style: none; + margin: 0 5px 10px 0; +} + +ul.wysihtml5-toolbar a[data-wysihtml5-command=bold] { + font-weight: bold; +} + +ul.wysihtml5-toolbar a[data-wysihtml5-command=italic] { + font-style: italic; +} + +ul.wysihtml5-toolbar a[data-wysihtml5-command=underline] { + text-decoration: underline; +} + +ul.wysihtml5-toolbar a.btn.wysihtml5-command-active { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05); + background-color: #E6E6E6; + background-color: #D9D9D9; + outline: 0; +} + +ul.wysihtml5-commands-disabled .dropdown-menu { + display: none !important; +} + +ul.wysihtml5-toolbar div.wysihtml5-colors { + display:block; + width: 50px; + height: 20px; + margin-top: 2px; + margin-left: 5px; + position: absolute; + pointer-events: none; +} + +ul.wysihtml5-toolbar a.wysihtml5-colors-title { + padding-left: 70px; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="black"] { + background: black !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="silver"] { + background: silver !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="gray"] { + background: gray !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="maroon"] { + background: maroon !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="red"] { + background: red !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="purple"] { + background: purple !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="green"] { + background: green !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="olive"] { + background: olive !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="navy"] { + background: navy !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="blue"] { + background: blue !important; +} + +ul.wysihtml5-toolbar div[data-wysihtml5-command-value="orange"] { + background: orange !important; +} + +.glyphicon-quote:before { + content: "\201C"; + font-family: Georgia, serif; + font-size: 50px; + position: absolute; + top: -4px; + left: -3px; + max-height: 100%; +} + +.glyphicon-quote:after { + content: "\0000a0"; +} + diff --git a/theme/bootstrap/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css b/theme/bootstrap/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css new file mode 100644 index 0000000..28f1831 --- /dev/null +++ b/theme/bootstrap/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css @@ -0,0 +1,3 @@ +/*! bootstrap3-wysihtml5-bower 2014-09-26 */ + +ul.wysihtml5-toolbar{margin:0;padding:0;display:block}ul.wysihtml5-toolbar::after{clear:both;display:table;content:""}ul.wysihtml5-toolbar>li{float:left;display:list-item;list-style:none;margin:0 5px 10px 0}ul.wysihtml5-toolbar a[data-wysihtml5-command=bold]{font-weight:700}ul.wysihtml5-toolbar a[data-wysihtml5-command=italic]{font-style:italic}ul.wysihtml5-toolbar a[data-wysihtml5-command=underline]{text-decoration:underline}ul.wysihtml5-toolbar a.btn.wysihtml5-command-active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05);background-color:#D9D9D9;outline:0}ul.wysihtml5-commands-disabled .dropdown-menu{display:none!important}ul.wysihtml5-toolbar div.wysihtml5-colors{display:block;width:50px;height:20px;margin-top:2px;margin-left:5px;position:absolute;pointer-events:none}ul.wysihtml5-toolbar a.wysihtml5-colors-title{padding-left:70px}ul.wysihtml5-toolbar div[data-wysihtml5-command-value=black]{background:#000!important}ul.wysihtml5-toolbar div[data-wysihtml5-command-value=silver]{background:silver!important}ul.wysihtml5-toolbar div[data-wysihtml5-command-value=gray]{background:gray!important}ul.wysihtml5-toolbar div[data-wysihtml5-command-value=maroon]{background:maroon!important}ul.wysihtml5-toolbar div[data-wysihtml5-command-value=red]{background:red!important}ul.wysihtml5-toolbar div[data-wysihtml5-command-value=purple]{background:purple!important}ul.wysihtml5-toolbar div[data-wysihtml5-command-value=green]{background:green!important}ul.wysihtml5-toolbar div[data-wysihtml5-command-value=olive]{background:olive!important}ul.wysihtml5-toolbar div[data-wysihtml5-command-value=navy]{background:navy!important}ul.wysihtml5-toolbar div[data-wysihtml5-command-value=blue]{background:#00f!important}ul.wysihtml5-toolbar div[data-wysihtml5-command-value=orange]{background:orange!important}.glyphicon-quote:before{content:"\201C";font-family:Georgia,serif;font-size:50px;position:absolute;top:-4px;left:-3px;max-height:100%}.glyphicon-quote:after{content:"\0000a0"} \ No newline at end of file diff --git a/theme/bootstrap/plugins/chartjs/Chart.js b/theme/bootstrap/plugins/chartjs/Chart.js new file mode 100644 index 0000000..cd79b6d --- /dev/null +++ b/theme/bootstrap/plugins/chartjs/Chart.js @@ -0,0 +1,3477 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 1.0.2 + * + * Copyright 2015 Nick Downie + * Released under the MIT license + * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md + */ + + +(function(){ + + "use strict"; + + //Declare root variable - window in the browser, global on the server + var root = this, + previous = root.Chart; + + //Occupy the global variable of Chart, and create a simple base class + var Chart = function(context){ + var chart = this; + this.canvas = context.canvas; + + this.ctx = context; + + //Variables global to the chart + var computeDimension = function(element,dimension) + { + if (element['offset'+dimension]) + { + return element['offset'+dimension]; + } + else + { + return document.defaultView.getComputedStyle(element).getPropertyValue(dimension); + } + } + + var width = this.width = computeDimension(context.canvas,'Width'); + var height = this.height = computeDimension(context.canvas,'Height'); + + // Firefox requires this to work correctly + context.canvas.width = width; + context.canvas.height = height; + + var width = this.width = context.canvas.width; + var height = this.height = context.canvas.height; + this.aspectRatio = this.width / this.height; + //High pixel density displays - multiply the size of the canvas height/width by the device pixel ratio, then scale. + helpers.retinaScale(this); + + return this; + }; + //Globally expose the defaults to allow for user updating/changing + Chart.defaults = { + global: { + // Boolean - Whether to animate the chart + animation: true, + + // Number - Number of animation steps + animationSteps: 60, + + // String - Animation easing effect + animationEasing: "easeOutQuart", + + // Boolean - If we should show the scale at all + showScale: true, + + // Boolean - If we want to override with a hard coded scale + scaleOverride: false, + + // ** Required if scaleOverride is true ** + // Number - The number of steps in a hard coded scale + scaleSteps: null, + // Number - The value jump in the hard coded scale + scaleStepWidth: null, + // Number - The scale starting value + scaleStartValue: null, + + // String - Colour of the scale line + scaleLineColor: "rgba(0,0,0,.1)", + + // Number - Pixel width of the scale line + scaleLineWidth: 1, + + // Boolean - Whether to show labels on the scale + scaleShowLabels: true, + + // Interpolated JS string - can access value + scaleLabel: "<%=value%>", + + // Boolean - Whether the scale should stick to integers, and not show any floats even if drawing space is there + scaleIntegersOnly: true, + + // Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value + scaleBeginAtZero: false, + + // String - Scale label font declaration for the scale label + scaleFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Scale label font size in pixels + scaleFontSize: 12, + + // String - Scale label font weight style + scaleFontStyle: "normal", + + // String - Scale label font colour + scaleFontColor: "#666", + + // Boolean - whether or not the chart should be responsive and resize when the browser does. + responsive: false, + + // Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container + maintainAspectRatio: true, + + // Boolean - Determines whether to draw tooltips on the canvas or not - attaches events to touchmove & mousemove + showTooltips: true, + + // Boolean - Determines whether to draw built-in tooltip or call custom tooltip function + customTooltips: false, + + // Array - Array of string names to attach tooltip events + tooltipEvents: ["mousemove", "touchstart", "touchmove", "mouseout"], + + // String - Tooltip background colour + tooltipFillColor: "rgba(0,0,0,0.8)", + + // String - Tooltip label font declaration for the scale label + tooltipFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Tooltip label font size in pixels + tooltipFontSize: 14, + + // String - Tooltip font weight style + tooltipFontStyle: "normal", + + // String - Tooltip label font colour + tooltipFontColor: "#fff", + + // String - Tooltip title font declaration for the scale label + tooltipTitleFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + + // Number - Tooltip title font size in pixels + tooltipTitleFontSize: 14, + + // String - Tooltip title font weight style + tooltipTitleFontStyle: "bold", + + // String - Tooltip title font colour + tooltipTitleFontColor: "#fff", + + // Number - pixel width of padding around tooltip text + tooltipYPadding: 6, + + // Number - pixel width of padding around tooltip text + tooltipXPadding: 6, + + // Number - Size of the caret on the tooltip + tooltipCaretSize: 8, + + // Number - Pixel radius of the tooltip border + tooltipCornerRadius: 6, + + // Number - Pixel offset from point x to tooltip edge + tooltipXOffset: 10, + + // String - Template string for single tooltips + tooltipTemplate: "<%if (label){%><%=label%>: <%}%><%= value %>", + + // String - Template string for single tooltips + multiTooltipTemplate: "<%= value %>", + + // String - Colour behind the legend colour block + multiTooltipKeyBackground: '#fff', + + // Function - Will fire on animation progression. + onAnimationProgress: function(){}, + + // Function - Will fire on animation completion. + onAnimationComplete: function(){} + + } + }; + + //Create a dictionary of chart types, to allow for extension of existing types + Chart.types = {}; + + //Global Chart helpers object for utility methods and classes + var helpers = Chart.helpers = {}; + + //-- Basic js utility methods + var each = helpers.each = function(loopable,callback,self){ + var additionalArgs = Array.prototype.slice.call(arguments, 3); + // Check to see if null or undefined firstly. + if (loopable){ + if (loopable.length === +loopable.length){ + var i; + for (i=0; i<loopable.length; i++){ + callback.apply(self,[loopable[i], i].concat(additionalArgs)); + } + } + else{ + for (var item in loopable){ + callback.apply(self,[loopable[item],item].concat(additionalArgs)); + } + } + } + }, + clone = helpers.clone = function(obj){ + var objClone = {}; + each(obj,function(value,key){ + if (obj.hasOwnProperty(key)) objClone[key] = value; + }); + return objClone; + }, + extend = helpers.extend = function(base){ + each(Array.prototype.slice.call(arguments,1), function(extensionObject) { + each(extensionObject,function(value,key){ + if (extensionObject.hasOwnProperty(key)) base[key] = value; + }); + }); + return base; + }, + merge = helpers.merge = function(base,master){ + //Merge properties in left object over to a shallow clone of object right. + var args = Array.prototype.slice.call(arguments,0); + args.unshift({}); + return extend.apply(null, args); + }, + indexOf = helpers.indexOf = function(arrayToSearch, item){ + if (Array.prototype.indexOf) { + return arrayToSearch.indexOf(item); + } + else{ + for (var i = 0; i < arrayToSearch.length; i++) { + if (arrayToSearch[i] === item) return i; + } + return -1; + } + }, + where = helpers.where = function(collection, filterCallback){ + var filtered = []; + + helpers.each(collection, function(item){ + if (filterCallback(item)){ + filtered.push(item); + } + }); + + return filtered; + }, + findNextWhere = helpers.findNextWhere = function(arrayToSearch, filterCallback, startIndex){ + // Default to start of the array + if (!startIndex){ + startIndex = -1; + } + for (var i = startIndex + 1; i < arrayToSearch.length; i++) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)){ + return currentItem; + } + } + }, + findPreviousWhere = helpers.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex){ + // Default to end of the array + if (!startIndex){ + startIndex = arrayToSearch.length; + } + for (var i = startIndex - 1; i >= 0; i--) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)){ + return currentItem; + } + } + }, + inherits = helpers.inherits = function(extensions){ + //Basic javascript inheritance based on the model created in Backbone.js + var parent = this; + var ChartElement = (extensions && extensions.hasOwnProperty("constructor")) ? extensions.constructor : function(){ return parent.apply(this, arguments); }; + + var Surrogate = function(){ this.constructor = ChartElement;}; + Surrogate.prototype = parent.prototype; + ChartElement.prototype = new Surrogate(); + + ChartElement.extend = inherits; + + if (extensions) extend(ChartElement.prototype, extensions); + + ChartElement.__super__ = parent.prototype; + + return ChartElement; + }, + noop = helpers.noop = function(){}, + uid = helpers.uid = (function(){ + var id=0; + return function(){ + return "chart-" + id++; + }; + })(), + warn = helpers.warn = function(str){ + //Method for warning of errors + if (window.console && typeof window.console.warn == "function") console.warn(str); + }, + amd = helpers.amd = (typeof define == 'function' && define.amd), + //-- Math methods + isNumber = helpers.isNumber = function(n){ + return !isNaN(parseFloat(n)) && isFinite(n); + }, + max = helpers.max = function(array){ + return Math.max.apply( Math, array ); + }, + min = helpers.min = function(array){ + return Math.min.apply( Math, array ); + }, + cap = helpers.cap = function(valueToCap,maxValue,minValue){ + if(isNumber(maxValue)) { + if( valueToCap > maxValue ) { + return maxValue; + } + } + else if(isNumber(minValue)){ + if ( valueToCap < minValue ){ + return minValue; + } + } + return valueToCap; + }, + getDecimalPlaces = helpers.getDecimalPlaces = function(num){ + if (num%1!==0 && isNumber(num)){ + return num.toString().split(".")[1].length; + } + else { + return 0; + } + }, + toRadians = helpers.radians = function(degrees){ + return degrees * (Math.PI/180); + }, + // Gets the angle from vertical upright to the point about a centre. + getAngleFromPoint = helpers.getAngleFromPoint = function(centrePoint, anglePoint){ + var distanceFromXCenter = anglePoint.x - centrePoint.x, + distanceFromYCenter = anglePoint.y - centrePoint.y, + radialDistanceFromCenter = Math.sqrt( distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); + + + var angle = Math.PI * 2 + Math.atan2(distanceFromYCenter, distanceFromXCenter); + + //If the segment is in the top left quadrant, we need to add another rotation to the angle + if (distanceFromXCenter < 0 && distanceFromYCenter < 0){ + angle += Math.PI*2; + } + + return { + angle: angle, + distance: radialDistanceFromCenter + }; + }, + aliasPixel = helpers.aliasPixel = function(pixelWidth){ + return (pixelWidth % 2 === 0) ? 0 : 0.5; + }, + splineCurve = helpers.splineCurve = function(FirstPoint,MiddlePoint,AfterPoint,t){ + //Props to Rob Spencer at scaled innovation for his post on splining between points + //http://scaledinnovation.com/analytics/splines/aboutSplines.html + var d01=Math.sqrt(Math.pow(MiddlePoint.x-FirstPoint.x,2)+Math.pow(MiddlePoint.y-FirstPoint.y,2)), + d12=Math.sqrt(Math.pow(AfterPoint.x-MiddlePoint.x,2)+Math.pow(AfterPoint.y-MiddlePoint.y,2)), + fa=t*d01/(d01+d12),// scaling factor for triangle Ta + fb=t*d12/(d01+d12); + return { + inner : { + x : MiddlePoint.x-fa*(AfterPoint.x-FirstPoint.x), + y : MiddlePoint.y-fa*(AfterPoint.y-FirstPoint.y) + }, + outer : { + x: MiddlePoint.x+fb*(AfterPoint.x-FirstPoint.x), + y : MiddlePoint.y+fb*(AfterPoint.y-FirstPoint.y) + } + }; + }, + calculateOrderOfMagnitude = helpers.calculateOrderOfMagnitude = function(val){ + return Math.floor(Math.log(val) / Math.LN10); + }, + calculateScaleRange = helpers.calculateScaleRange = function(valuesArray, drawingSize, textSize, startFromZero, integersOnly){ + + //Set a minimum step of two - a point at the top of the graph, and a point at the base + var minSteps = 2, + maxSteps = Math.floor(drawingSize/(textSize * 1.5)), + skipFitting = (minSteps >= maxSteps); + + var maxValue = max(valuesArray), + minValue = min(valuesArray); + + // We need some degree of seperation here to calculate the scales if all the values are the same + // Adding/minusing 0.5 will give us a range of 1. + if (maxValue === minValue){ + maxValue += 0.5; + // So we don't end up with a graph with a negative start value if we've said always start from zero + if (minValue >= 0.5 && !startFromZero){ + minValue -= 0.5; + } + else{ + // Make up a whole number above the values + maxValue += 0.5; + } + } + + var valueRange = Math.abs(maxValue - minValue), + rangeOrderOfMagnitude = calculateOrderOfMagnitude(valueRange), + graphMax = Math.ceil(maxValue / (1 * Math.pow(10, rangeOrderOfMagnitude))) * Math.pow(10, rangeOrderOfMagnitude), + graphMin = (startFromZero) ? 0 : Math.floor(minValue / (1 * Math.pow(10, rangeOrderOfMagnitude))) * Math.pow(10, rangeOrderOfMagnitude), + graphRange = graphMax - graphMin, + stepValue = Math.pow(10, rangeOrderOfMagnitude), + numberOfSteps = Math.round(graphRange / stepValue); + + //If we have more space on the graph we'll use it to give more definition to the data + while((numberOfSteps > maxSteps || (numberOfSteps * 2) < maxSteps) && !skipFitting) { + if(numberOfSteps > maxSteps){ + stepValue *=2; + numberOfSteps = Math.round(graphRange/stepValue); + // Don't ever deal with a decimal number of steps - cancel fitting and just use the minimum number of steps. + if (numberOfSteps % 1 !== 0){ + skipFitting = true; + } + } + //We can fit in double the amount of scale points on the scale + else{ + //If user has declared ints only, and the step value isn't a decimal + if (integersOnly && rangeOrderOfMagnitude >= 0){ + //If the user has said integers only, we need to check that making the scale more granular wouldn't make it a float + if(stepValue/2 % 1 === 0){ + stepValue /=2; + numberOfSteps = Math.round(graphRange/stepValue); + } + //If it would make it a float break out of the loop + else{ + break; + } + } + //If the scale doesn't have to be an int, make the scale more granular anyway. + else{ + stepValue /=2; + numberOfSteps = Math.round(graphRange/stepValue); + } + + } + } + + if (skipFitting){ + numberOfSteps = minSteps; + stepValue = graphRange / numberOfSteps; + } + + return { + steps : numberOfSteps, + stepValue : stepValue, + min : graphMin, + max : graphMin + (numberOfSteps * stepValue) + }; + + }, + /* jshint ignore:start */ + // Blows up jshint errors based on the new Function constructor + //Templating methods + //Javascript micro templating by John Resig - source at http://ejohn.org/blog/javascript-micro-templating/ + template = helpers.template = function(templateString, valuesObject){ + + // If templateString is function rather than string-template - call the function for valuesObject + + if(templateString instanceof Function){ + return templateString(valuesObject); + } + + var cache = {}; + function tmpl(str, data){ + // Figure out if we're getting a template, or if we need to + // load the template - and be sure to cache the result. + var fn = !/\W/.test(str) ? + cache[str] = cache[str] : + + // Generate a reusable function that will serve as a template + // generator (and which will be cached). + new Function("obj", + "var p=[],print=function(){p.push.apply(p,arguments);};" + + + // Introduce the data as local variables using with(){} + "with(obj){p.push('" + + + // Convert the template into pure JavaScript + str + .replace(/[\r\t\n]/g, " ") + .split("<%").join("\t") + .replace(/((^|%>)[^\t]*)'/g, "$1\r") + .replace(/\t=(.*?)%>/g, "',$1,'") + .split("\t").join("');") + .split("%>").join("p.push('") + .split("\r").join("\\'") + + "');}return p.join('');" + ); + + // Provide some basic currying to the user + return data ? fn( data ) : fn; + } + return tmpl(templateString,valuesObject); + }, + /* jshint ignore:end */ + generateLabels = helpers.generateLabels = function(templateString,numberOfSteps,graphMin,stepValue){ + var labelsArray = new Array(numberOfSteps); + if (labelTemplateString){ + each(labelsArray,function(val,index){ + labelsArray[index] = template(templateString,{value: (graphMin + (stepValue*(index+1)))}); + }); + } + return labelsArray; + }, + //--Animation methods + //Easing functions adapted from Robert Penner's easing equations + //http://www.robertpenner.com/easing/ + easingEffects = helpers.easingEffects = { + linear: function (t) { + return t; + }, + easeInQuad: function (t) { + return t * t; + }, + easeOutQuad: function (t) { + return -1 * t * (t - 2); + }, + easeInOutQuad: function (t) { + if ((t /= 1 / 2) < 1) return 1 / 2 * t * t; + return -1 / 2 * ((--t) * (t - 2) - 1); + }, + easeInCubic: function (t) { + return t * t * t; + }, + easeOutCubic: function (t) { + return 1 * ((t = t / 1 - 1) * t * t + 1); + }, + easeInOutCubic: function (t) { + if ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t; + return 1 / 2 * ((t -= 2) * t * t + 2); + }, + easeInQuart: function (t) { + return t * t * t * t; + }, + easeOutQuart: function (t) { + return -1 * ((t = t / 1 - 1) * t * t * t - 1); + }, + easeInOutQuart: function (t) { + if ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t * t; + return -1 / 2 * ((t -= 2) * t * t * t - 2); + }, + easeInQuint: function (t) { + return 1 * (t /= 1) * t * t * t * t; + }, + easeOutQuint: function (t) { + return 1 * ((t = t / 1 - 1) * t * t * t * t + 1); + }, + easeInOutQuint: function (t) { + if ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t * t * t; + return 1 / 2 * ((t -= 2) * t * t * t * t + 2); + }, + easeInSine: function (t) { + return -1 * Math.cos(t / 1 * (Math.PI / 2)) + 1; + }, + easeOutSine: function (t) { + return 1 * Math.sin(t / 1 * (Math.PI / 2)); + }, + easeInOutSine: function (t) { + return -1 / 2 * (Math.cos(Math.PI * t / 1) - 1); + }, + easeInExpo: function (t) { + return (t === 0) ? 1 : 1 * Math.pow(2, 10 * (t / 1 - 1)); + }, + easeOutExpo: function (t) { + return (t === 1) ? 1 : 1 * (-Math.pow(2, -10 * t / 1) + 1); + }, + easeInOutExpo: function (t) { + if (t === 0) return 0; + if (t === 1) return 1; + if ((t /= 1 / 2) < 1) return 1 / 2 * Math.pow(2, 10 * (t - 1)); + return 1 / 2 * (-Math.pow(2, -10 * --t) + 2); + }, + easeInCirc: function (t) { + if (t >= 1) return t; + return -1 * (Math.sqrt(1 - (t /= 1) * t) - 1); + }, + easeOutCirc: function (t) { + return 1 * Math.sqrt(1 - (t = t / 1 - 1) * t); + }, + easeInOutCirc: function (t) { + if ((t /= 1 / 2) < 1) return -1 / 2 * (Math.sqrt(1 - t * t) - 1); + return 1 / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1); + }, + easeInElastic: function (t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) return 0; + if ((t /= 1) == 1) return 1; + if (!p) p = 1 * 0.3; + if (a < Math.abs(1)) { + a = 1; + s = p / 4; + } else s = p / (2 * Math.PI) * Math.asin(1 / a); + return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p)); + }, + easeOutElastic: function (t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) return 0; + if ((t /= 1) == 1) return 1; + if (!p) p = 1 * 0.3; + if (a < Math.abs(1)) { + a = 1; + s = p / 4; + } else s = p / (2 * Math.PI) * Math.asin(1 / a); + return a * Math.pow(2, -10 * t) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) + 1; + }, + easeInOutElastic: function (t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) return 0; + if ((t /= 1 / 2) == 2) return 1; + if (!p) p = 1 * (0.3 * 1.5); + if (a < Math.abs(1)) { + a = 1; + s = p / 4; + } else s = p / (2 * Math.PI) * Math.asin(1 / a); + if (t < 1) return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p)); + return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) * 0.5 + 1; + }, + easeInBack: function (t) { + var s = 1.70158; + return 1 * (t /= 1) * t * ((s + 1) * t - s); + }, + easeOutBack: function (t) { + var s = 1.70158; + return 1 * ((t = t / 1 - 1) * t * ((s + 1) * t + s) + 1); + }, + easeInOutBack: function (t) { + var s = 1.70158; + if ((t /= 1 / 2) < 1) return 1 / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)); + return 1 / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); + }, + easeInBounce: function (t) { + return 1 - easingEffects.easeOutBounce(1 - t); + }, + easeOutBounce: function (t) { + if ((t /= 1) < (1 / 2.75)) { + return 1 * (7.5625 * t * t); + } else if (t < (2 / 2.75)) { + return 1 * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75); + } else if (t < (2.5 / 2.75)) { + return 1 * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375); + } else { + return 1 * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375); + } + }, + easeInOutBounce: function (t) { + if (t < 1 / 2) return easingEffects.easeInBounce(t * 2) * 0.5; + return easingEffects.easeOutBounce(t * 2 - 1) * 0.5 + 1 * 0.5; + } + }, + //Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ + requestAnimFrame = helpers.requestAnimFrame = (function(){ + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback) { + return window.setTimeout(callback, 1000 / 60); + }; + })(), + cancelAnimFrame = helpers.cancelAnimFrame = (function(){ + return window.cancelAnimationFrame || + window.webkitCancelAnimationFrame || + window.mozCancelAnimationFrame || + window.oCancelAnimationFrame || + window.msCancelAnimationFrame || + function(callback) { + return window.clearTimeout(callback, 1000 / 60); + }; + })(), + animationLoop = helpers.animationLoop = function(callback,totalSteps,easingString,onProgress,onComplete,chartInstance){ + + var currentStep = 0, + easingFunction = easingEffects[easingString] || easingEffects.linear; + + var animationFrame = function(){ + currentStep++; + var stepDecimal = currentStep/totalSteps; + var easeDecimal = easingFunction(stepDecimal); + + callback.call(chartInstance,easeDecimal,stepDecimal, currentStep); + onProgress.call(chartInstance,easeDecimal,stepDecimal); + if (currentStep < totalSteps){ + chartInstance.animationFrame = requestAnimFrame(animationFrame); + } else{ + onComplete.apply(chartInstance); + } + }; + requestAnimFrame(animationFrame); + }, + //-- DOM methods + getRelativePosition = helpers.getRelativePosition = function(evt){ + var mouseX, mouseY; + var e = evt.originalEvent || evt, + canvas = evt.currentTarget || evt.srcElement, + boundingRect = canvas.getBoundingClientRect(); + + if (e.touches){ + mouseX = e.touches[0].clientX - boundingRect.left; + mouseY = e.touches[0].clientY - boundingRect.top; + + } + else{ + mouseX = e.clientX - boundingRect.left; + mouseY = e.clientY - boundingRect.top; + } + + return { + x : mouseX, + y : mouseY + }; + + }, + addEvent = helpers.addEvent = function(node,eventType,method){ + if (node.addEventListener){ + node.addEventListener(eventType,method); + } else if (node.attachEvent){ + node.attachEvent("on"+eventType, method); + } else { + node["on"+eventType] = method; + } + }, + removeEvent = helpers.removeEvent = function(node, eventType, handler){ + if (node.removeEventListener){ + node.removeEventListener(eventType, handler, false); + } else if (node.detachEvent){ + node.detachEvent("on"+eventType,handler); + } else{ + node["on" + eventType] = noop; + } + }, + bindEvents = helpers.bindEvents = function(chartInstance, arrayOfEvents, handler){ + // Create the events object if it's not already present + if (!chartInstance.events) chartInstance.events = {}; + + each(arrayOfEvents,function(eventName){ + chartInstance.events[eventName] = function(){ + handler.apply(chartInstance, arguments); + }; + addEvent(chartInstance.chart.canvas,eventName,chartInstance.events[eventName]); + }); + }, + unbindEvents = helpers.unbindEvents = function (chartInstance, arrayOfEvents) { + each(arrayOfEvents, function(handler,eventName){ + removeEvent(chartInstance.chart.canvas, eventName, handler); + }); + }, + getMaximumWidth = helpers.getMaximumWidth = function(domNode){ + var container = domNode.parentNode; + // TODO = check cross browser stuff with this. + return container.clientWidth; + }, + getMaximumHeight = helpers.getMaximumHeight = function(domNode){ + var container = domNode.parentNode; + // TODO = check cross browser stuff with this. + return container.clientHeight; + }, + getMaximumSize = helpers.getMaximumSize = helpers.getMaximumWidth, // legacy support + retinaScale = helpers.retinaScale = function(chart){ + var ctx = chart.ctx, + width = chart.canvas.width, + height = chart.canvas.height; + + if (window.devicePixelRatio) { + ctx.canvas.style.width = width + "px"; + ctx.canvas.style.height = height + "px"; + ctx.canvas.height = height * window.devicePixelRatio; + ctx.canvas.width = width * window.devicePixelRatio; + ctx.scale(window.devicePixelRatio, window.devicePixelRatio); + } + }, + //-- Canvas methods + clear = helpers.clear = function(chart){ + chart.ctx.clearRect(0,0,chart.width,chart.height); + }, + fontString = helpers.fontString = function(pixelSize,fontStyle,fontFamily){ + return fontStyle + " " + pixelSize+"px " + fontFamily; + }, + longestText = helpers.longestText = function(ctx,font,arrayOfStrings){ + ctx.font = font; + var longest = 0; + each(arrayOfStrings,function(string){ + var textWidth = ctx.measureText(string).width; + longest = (textWidth > longest) ? textWidth : longest; + }); + return longest; + }, + drawRoundedRectangle = helpers.drawRoundedRectangle = function(ctx,x,y,width,height,radius){ + ctx.beginPath(); + ctx.moveTo(x + radius, y); + ctx.lineTo(x + width - radius, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + radius); + ctx.lineTo(x + width, y + height - radius); + ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); + ctx.lineTo(x + radius, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - radius); + ctx.lineTo(x, y + radius); + ctx.quadraticCurveTo(x, y, x + radius, y); + ctx.closePath(); + }; + + + //Store a reference to each instance - allowing us to globally resize chart instances on window resize. + //Destroy method on the chart will remove the instance of the chart from this reference. + Chart.instances = {}; + + Chart.Type = function(data,options,chart){ + this.options = options; + this.chart = chart; + this.id = uid(); + //Add the chart instance to the global namespace + Chart.instances[this.id] = this; + + // Initialize is always called when a chart type is created + // By default it is a no op, but it should be extended + if (options.responsive){ + this.resize(); + } + this.initialize.call(this,data); + }; + + //Core methods that'll be a part of every chart type + extend(Chart.Type.prototype,{ + initialize : function(){return this;}, + clear : function(){ + clear(this.chart); + return this; + }, + stop : function(){ + // Stops any current animation loop occuring + cancelAnimFrame(this.animationFrame); + return this; + }, + resize : function(callback){ + this.stop(); + var canvas = this.chart.canvas, + newWidth = getMaximumWidth(this.chart.canvas), + newHeight = this.options.maintainAspectRatio ? newWidth / this.chart.aspectRatio : getMaximumHeight(this.chart.canvas); + + canvas.width = this.chart.width = newWidth; + canvas.height = this.chart.height = newHeight; + + retinaScale(this.chart); + + if (typeof callback === "function"){ + callback.apply(this, Array.prototype.slice.call(arguments, 1)); + } + return this; + }, + reflow : noop, + render : function(reflow){ + if (reflow){ + this.reflow(); + } + if (this.options.animation && !reflow){ + helpers.animationLoop( + this.draw, + this.options.animationSteps, + this.options.animationEasing, + this.options.onAnimationProgress, + this.options.onAnimationComplete, + this + ); + } + else{ + this.draw(); + this.options.onAnimationComplete.call(this); + } + return this; + }, + generateLegend : function(){ + return template(this.options.legendTemplate,this); + }, + destroy : function(){ + this.clear(); + unbindEvents(this, this.events); + var canvas = this.chart.canvas; + + // Reset canvas height/width attributes starts a fresh with the canvas context + canvas.width = this.chart.width; + canvas.height = this.chart.height; + + // < IE9 doesn't support removeProperty + if (canvas.style.removeProperty) { + canvas.style.removeProperty('width'); + canvas.style.removeProperty('height'); + } else { + canvas.style.removeAttribute('width'); + canvas.style.removeAttribute('height'); + } + + delete Chart.instances[this.id]; + }, + showTooltip : function(ChartElements, forceRedraw){ + // Only redraw the chart if we've actually changed what we're hovering on. + if (typeof this.activeElements === 'undefined') this.activeElements = []; + + var isChanged = (function(Elements){ + var changed = false; + + if (Elements.length !== this.activeElements.length){ + changed = true; + return changed; + } + + each(Elements, function(element, index){ + if (element !== this.activeElements[index]){ + changed = true; + } + }, this); + return changed; + }).call(this, ChartElements); + + if (!isChanged && !forceRedraw){ + return; + } + else{ + this.activeElements = ChartElements; + } + this.draw(); + if(this.options.customTooltips){ + this.options.customTooltips(false); + } + if (ChartElements.length > 0){ + // If we have multiple datasets, show a MultiTooltip for all of the data points at that index + if (this.datasets && this.datasets.length > 1) { + var dataArray, + dataIndex; + + for (var i = this.datasets.length - 1; i >= 0; i--) { + dataArray = this.datasets[i].points || this.datasets[i].bars || this.datasets[i].segments; + dataIndex = indexOf(dataArray, ChartElements[0]); + if (dataIndex !== -1){ + break; + } + } + var tooltipLabels = [], + tooltipColors = [], + medianPosition = (function(index) { + + // Get all the points at that particular index + var Elements = [], + dataCollection, + xPositions = [], + yPositions = [], + xMax, + yMax, + xMin, + yMin; + helpers.each(this.datasets, function(dataset){ + dataCollection = dataset.points || dataset.bars || dataset.segments; + if (dataCollection[dataIndex] && dataCollection[dataIndex].hasValue()){ + Elements.push(dataCollection[dataIndex]); + } + }); + + helpers.each(Elements, function(element) { + xPositions.push(element.x); + yPositions.push(element.y); + + + //Include any colour information about the element + tooltipLabels.push(helpers.template(this.options.multiTooltipTemplate, element)); + tooltipColors.push({ + fill: element._saved.fillColor || element.fillColor, + stroke: element._saved.strokeColor || element.strokeColor + }); + + }, this); + + yMin = min(yPositions); + yMax = max(yPositions); + + xMin = min(xPositions); + xMax = max(xPositions); + + return { + x: (xMin > this.chart.width/2) ? xMin : xMax, + y: (yMin + yMax)/2 + }; + }).call(this, dataIndex); + + new Chart.MultiTooltip({ + x: medianPosition.x, + y: medianPosition.y, + xPadding: this.options.tooltipXPadding, + yPadding: this.options.tooltipYPadding, + xOffset: this.options.tooltipXOffset, + fillColor: this.options.tooltipFillColor, + textColor: this.options.tooltipFontColor, + fontFamily: this.options.tooltipFontFamily, + fontStyle: this.options.tooltipFontStyle, + fontSize: this.options.tooltipFontSize, + titleTextColor: this.options.tooltipTitleFontColor, + titleFontFamily: this.options.tooltipTitleFontFamily, + titleFontStyle: this.options.tooltipTitleFontStyle, + titleFontSize: this.options.tooltipTitleFontSize, + cornerRadius: this.options.tooltipCornerRadius, + labels: tooltipLabels, + legendColors: tooltipColors, + legendColorBackground : this.options.multiTooltipKeyBackground, + title: ChartElements[0].label, + chart: this.chart, + ctx: this.chart.ctx, + custom: this.options.customTooltips + }).draw(); + + } else { + each(ChartElements, function(Element) { + var tooltipPosition = Element.tooltipPosition(); + new Chart.Tooltip({ + x: Math.round(tooltipPosition.x), + y: Math.round(tooltipPosition.y), + xPadding: this.options.tooltipXPadding, + yPadding: this.options.tooltipYPadding, + fillColor: this.options.tooltipFillColor, + textColor: this.options.tooltipFontColor, + fontFamily: this.options.tooltipFontFamily, + fontStyle: this.options.tooltipFontStyle, + fontSize: this.options.tooltipFontSize, + caretHeight: this.options.tooltipCaretSize, + cornerRadius: this.options.tooltipCornerRadius, + text: template(this.options.tooltipTemplate, Element), + chart: this.chart, + custom: this.options.customTooltips + }).draw(); + }, this); + } + } + return this; + }, + toBase64Image : function(){ + return this.chart.canvas.toDataURL.apply(this.chart.canvas, arguments); + } + }); + + Chart.Type.extend = function(extensions){ + + var parent = this; + + var ChartType = function(){ + return parent.apply(this,arguments); + }; + + //Copy the prototype object of the this class + ChartType.prototype = clone(parent.prototype); + //Now overwrite some of the properties in the base class with the new extensions + extend(ChartType.prototype, extensions); + + ChartType.extend = Chart.Type.extend; + + if (extensions.name || parent.prototype.name){ + + var chartName = extensions.name || parent.prototype.name; + //Assign any potential default values of the new chart type + + //If none are defined, we'll use a clone of the chart type this is being extended from. + //I.e. if we extend a line chart, we'll use the defaults from the line chart if our new chart + //doesn't define some defaults of their own. + + var baseDefaults = (Chart.defaults[parent.prototype.name]) ? clone(Chart.defaults[parent.prototype.name]) : {}; + + Chart.defaults[chartName] = extend(baseDefaults,extensions.defaults); + + Chart.types[chartName] = ChartType; + + //Register this new chart type in the Chart prototype + Chart.prototype[chartName] = function(data,options){ + var config = merge(Chart.defaults.global, Chart.defaults[chartName], options || {}); + return new ChartType(data,config,this); + }; + } else{ + warn("Name not provided for this chart, so it hasn't been registered"); + } + return parent; + }; + + Chart.Element = function(configuration){ + extend(this,configuration); + this.initialize.apply(this,arguments); + this.save(); + }; + extend(Chart.Element.prototype,{ + initialize : function(){}, + restore : function(props){ + if (!props){ + extend(this,this._saved); + } else { + each(props,function(key){ + this[key] = this._saved[key]; + },this); + } + return this; + }, + save : function(){ + this._saved = clone(this); + delete this._saved._saved; + return this; + }, + update : function(newProps){ + each(newProps,function(value,key){ + this._saved[key] = this[key]; + this[key] = value; + },this); + return this; + }, + transition : function(props,ease){ + each(props,function(value,key){ + this[key] = ((value - this._saved[key]) * ease) + this._saved[key]; + },this); + return this; + }, + tooltipPosition : function(){ + return { + x : this.x, + y : this.y + }; + }, + hasValue: function(){ + return isNumber(this.value); + } + }); + + Chart.Element.extend = inherits; + + + Chart.Point = Chart.Element.extend({ + display: true, + inRange: function(chartX,chartY){ + var hitDetectionRange = this.hitDetectionRadius + this.radius; + return ((Math.pow(chartX-this.x, 2)+Math.pow(chartY-this.y, 2)) < Math.pow(hitDetectionRange,2)); + }, + draw : function(){ + if (this.display){ + var ctx = this.ctx; + ctx.beginPath(); + + ctx.arc(this.x, this.y, this.radius, 0, Math.PI*2); + ctx.closePath(); + + ctx.strokeStyle = this.strokeColor; + ctx.lineWidth = this.strokeWidth; + + ctx.fillStyle = this.fillColor; + + ctx.fill(); + ctx.stroke(); + } + + + //Quick debug for bezier curve splining + //Highlights control points and the line between them. + //Handy for dev - stripped in the min version. + + // ctx.save(); + // ctx.fillStyle = "black"; + // ctx.strokeStyle = "black" + // ctx.beginPath(); + // ctx.arc(this.controlPoints.inner.x,this.controlPoints.inner.y, 2, 0, Math.PI*2); + // ctx.fill(); + + // ctx.beginPath(); + // ctx.arc(this.controlPoints.outer.x,this.controlPoints.outer.y, 2, 0, Math.PI*2); + // ctx.fill(); + + // ctx.moveTo(this.controlPoints.inner.x,this.controlPoints.inner.y); + // ctx.lineTo(this.x, this.y); + // ctx.lineTo(this.controlPoints.outer.x,this.controlPoints.outer.y); + // ctx.stroke(); + + // ctx.restore(); + + + + } + }); + + Chart.Arc = Chart.Element.extend({ + inRange : function(chartX,chartY){ + + var pointRelativePosition = helpers.getAngleFromPoint(this, { + x: chartX, + y: chartY + }); + + //Check if within the range of the open/close angle + var betweenAngles = (pointRelativePosition.angle >= this.startAngle && pointRelativePosition.angle <= this.endAngle), + withinRadius = (pointRelativePosition.distance >= this.innerRadius && pointRelativePosition.distance <= this.outerRadius); + + return (betweenAngles && withinRadius); + //Ensure within the outside of the arc centre, but inside arc outer + }, + tooltipPosition : function(){ + var centreAngle = this.startAngle + ((this.endAngle - this.startAngle) / 2), + rangeFromCentre = (this.outerRadius - this.innerRadius) / 2 + this.innerRadius; + return { + x : this.x + (Math.cos(centreAngle) * rangeFromCentre), + y : this.y + (Math.sin(centreAngle) * rangeFromCentre) + }; + }, + draw : function(animationPercent){ + + var easingDecimal = animationPercent || 1; + + var ctx = this.ctx; + + ctx.beginPath(); + + ctx.arc(this.x, this.y, this.outerRadius, this.startAngle, this.endAngle); + + ctx.arc(this.x, this.y, this.innerRadius, this.endAngle, this.startAngle, true); + + ctx.closePath(); + ctx.strokeStyle = this.strokeColor; + ctx.lineWidth = this.strokeWidth; + + ctx.fillStyle = this.fillColor; + + ctx.fill(); + ctx.lineJoin = 'bevel'; + + if (this.showStroke){ + ctx.stroke(); + } + } + }); + + Chart.Rectangle = Chart.Element.extend({ + draw : function(){ + var ctx = this.ctx, + halfWidth = this.width/2, + leftX = this.x - halfWidth, + rightX = this.x + halfWidth, + top = this.base - (this.base - this.y), + halfStroke = this.strokeWidth / 2; + + // Canvas doesn't allow us to stroke inside the width so we can + // adjust the sizes to fit if we're setting a stroke on the line + if (this.showStroke){ + leftX += halfStroke; + rightX -= halfStroke; + top += halfStroke; + } + + ctx.beginPath(); + + ctx.fillStyle = this.fillColor; + ctx.strokeStyle = this.strokeColor; + ctx.lineWidth = this.strokeWidth; + + // It'd be nice to keep this class totally generic to any rectangle + // and simply specify which border to miss out. + ctx.moveTo(leftX, this.base); + ctx.lineTo(leftX, top); + ctx.lineTo(rightX, top); + ctx.lineTo(rightX, this.base); + ctx.fill(); + if (this.showStroke){ + ctx.stroke(); + } + }, + height : function(){ + return this.base - this.y; + }, + inRange : function(chartX,chartY){ + return (chartX >= this.x - this.width/2 && chartX <= this.x + this.width/2) && (chartY >= this.y && chartY <= this.base); + } + }); + + Chart.Tooltip = Chart.Element.extend({ + draw : function(){ + + var ctx = this.chart.ctx; + + ctx.font = fontString(this.fontSize,this.fontStyle,this.fontFamily); + + this.xAlign = "center"; + this.yAlign = "above"; + + //Distance between the actual element.y position and the start of the tooltip caret + var caretPadding = this.caretPadding = 2; + + var tooltipWidth = ctx.measureText(this.text).width + 2*this.xPadding, + tooltipRectHeight = this.fontSize + 2*this.yPadding, + tooltipHeight = tooltipRectHeight + this.caretHeight + caretPadding; + + if (this.x + tooltipWidth/2 >this.chart.width){ + this.xAlign = "left"; + } else if (this.x - tooltipWidth/2 < 0){ + this.xAlign = "right"; + } + + if (this.y - tooltipHeight < 0){ + this.yAlign = "below"; + } + + + var tooltipX = this.x - tooltipWidth/2, + tooltipY = this.y - tooltipHeight; + + ctx.fillStyle = this.fillColor; + + // Custom Tooltips + if(this.custom){ + this.custom(this); + } + else{ + switch(this.yAlign) + { + case "above": + //Draw a caret above the x/y + ctx.beginPath(); + ctx.moveTo(this.x,this.y - caretPadding); + ctx.lineTo(this.x + this.caretHeight, this.y - (caretPadding + this.caretHeight)); + ctx.lineTo(this.x - this.caretHeight, this.y - (caretPadding + this.caretHeight)); + ctx.closePath(); + ctx.fill(); + break; + case "below": + tooltipY = this.y + caretPadding + this.caretHeight; + //Draw a caret below the x/y + ctx.beginPath(); + ctx.moveTo(this.x, this.y + caretPadding); + ctx.lineTo(this.x + this.caretHeight, this.y + caretPadding + this.caretHeight); + ctx.lineTo(this.x - this.caretHeight, this.y + caretPadding + this.caretHeight); + ctx.closePath(); + ctx.fill(); + break; + } + + switch(this.xAlign) + { + case "left": + tooltipX = this.x - tooltipWidth + (this.cornerRadius + this.caretHeight); + break; + case "right": + tooltipX = this.x - (this.cornerRadius + this.caretHeight); + break; + } + + drawRoundedRectangle(ctx,tooltipX,tooltipY,tooltipWidth,tooltipRectHeight,this.cornerRadius); + + ctx.fill(); + + ctx.fillStyle = this.textColor; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + ctx.fillText(this.text, tooltipX + tooltipWidth/2, tooltipY + tooltipRectHeight/2); + } + } + }); + + Chart.MultiTooltip = Chart.Element.extend({ + initialize : function(){ + this.font = fontString(this.fontSize,this.fontStyle,this.fontFamily); + + this.titleFont = fontString(this.titleFontSize,this.titleFontStyle,this.titleFontFamily); + + this.height = (this.labels.length * this.fontSize) + ((this.labels.length-1) * (this.fontSize/2)) + (this.yPadding*2) + this.titleFontSize *1.5; + + this.ctx.font = this.titleFont; + + var titleWidth = this.ctx.measureText(this.title).width, + //Label has a legend square as well so account for this. + labelWidth = longestText(this.ctx,this.font,this.labels) + this.fontSize + 3, + longestTextWidth = max([labelWidth,titleWidth]); + + this.width = longestTextWidth + (this.xPadding*2); + + + var halfHeight = this.height/2; + + //Check to ensure the height will fit on the canvas + if (this.y - halfHeight < 0 ){ + this.y = halfHeight; + } else if (this.y + halfHeight > this.chart.height){ + this.y = this.chart.height - halfHeight; + } + + //Decide whether to align left or right based on position on canvas + if (this.x > this.chart.width/2){ + this.x -= this.xOffset + this.width; + } else { + this.x += this.xOffset; + } + + + }, + getLineHeight : function(index){ + var baseLineHeight = this.y - (this.height/2) + this.yPadding, + afterTitleIndex = index-1; + + //If the index is zero, we're getting the title + if (index === 0){ + return baseLineHeight + this.titleFontSize/2; + } else{ + return baseLineHeight + ((this.fontSize*1.5*afterTitleIndex) + this.fontSize/2) + this.titleFontSize * 1.5; + } + + }, + draw : function(){ + // Custom Tooltips + if(this.custom){ + this.custom(this); + } + else{ + drawRoundedRectangle(this.ctx,this.x,this.y - this.height/2,this.width,this.height,this.cornerRadius); + var ctx = this.ctx; + ctx.fillStyle = this.fillColor; + ctx.fill(); + ctx.closePath(); + + ctx.textAlign = "left"; + ctx.textBaseline = "middle"; + ctx.fillStyle = this.titleTextColor; + ctx.font = this.titleFont; + + ctx.fillText(this.title,this.x + this.xPadding, this.getLineHeight(0)); + + ctx.font = this.font; + helpers.each(this.labels,function(label,index){ + ctx.fillStyle = this.textColor; + ctx.fillText(label,this.x + this.xPadding + this.fontSize + 3, this.getLineHeight(index + 1)); + + //A bit gnarly, but clearing this rectangle breaks when using explorercanvas (clears whole canvas) + //ctx.clearRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize); + //Instead we'll make a white filled block to put the legendColour palette over. + + ctx.fillStyle = this.legendColorBackground; + ctx.fillRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize); + + ctx.fillStyle = this.legendColors[index].fill; + ctx.fillRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize); + + + },this); + } + } + }); + + Chart.Scale = Chart.Element.extend({ + initialize : function(){ + this.fit(); + }, + buildYLabels : function(){ + this.yLabels = []; + + var stepDecimalPlaces = getDecimalPlaces(this.stepValue); + + for (var i=0; i<=this.steps; i++){ + this.yLabels.push(template(this.templateString,{value:(this.min + (i * this.stepValue)).toFixed(stepDecimalPlaces)})); + } + this.yLabelWidth = (this.display && this.showLabels) ? longestText(this.ctx,this.font,this.yLabels) : 0; + }, + addXLabel : function(label){ + this.xLabels.push(label); + this.valuesCount++; + this.fit(); + }, + removeXLabel : function(){ + this.xLabels.shift(); + this.valuesCount--; + this.fit(); + }, + // Fitting loop to rotate x Labels and figure out what fits there, and also calculate how many Y steps to use + fit: function(){ + // First we need the width of the yLabels, assuming the xLabels aren't rotated + + // To do that we need the base line at the top and base of the chart, assuming there is no x label rotation + this.startPoint = (this.display) ? this.fontSize : 0; + this.endPoint = (this.display) ? this.height - (this.fontSize * 1.5) - 5 : this.height; // -5 to pad labels + + // Apply padding settings to the start and end point. + this.startPoint += this.padding; + this.endPoint -= this.padding; + + // Cache the starting height, so can determine if we need to recalculate the scale yAxis + var cachedHeight = this.endPoint - this.startPoint, + cachedYLabelWidth; + + // Build the current yLabels so we have an idea of what size they'll be to start + /* + * This sets what is returned from calculateScaleRange as static properties of this class: + * + this.steps; + this.stepValue; + this.min; + this.max; + * + */ + this.calculateYRange(cachedHeight); + + // With these properties set we can now build the array of yLabels + // and also the width of the largest yLabel + this.buildYLabels(); + + this.calculateXLabelRotation(); + + while((cachedHeight > this.endPoint - this.startPoint)){ + cachedHeight = this.endPoint - this.startPoint; + cachedYLabelWidth = this.yLabelWidth; + + this.calculateYRange(cachedHeight); + this.buildYLabels(); + + // Only go through the xLabel loop again if the yLabel width has changed + if (cachedYLabelWidth < this.yLabelWidth){ + this.calculateXLabelRotation(); + } + } + + }, + calculateXLabelRotation : function(){ + //Get the width of each grid by calculating the difference + //between x offsets between 0 and 1. + + this.ctx.font = this.font; + + var firstWidth = this.ctx.measureText(this.xLabels[0]).width, + lastWidth = this.ctx.measureText(this.xLabels[this.xLabels.length - 1]).width, + firstRotated, + lastRotated; + + + this.xScalePaddingRight = lastWidth/2 + 3; + this.xScalePaddingLeft = (firstWidth/2 > this.yLabelWidth + 10) ? firstWidth/2 : this.yLabelWidth + 10; + + this.xLabelRotation = 0; + if (this.display){ + var originalLabelWidth = longestText(this.ctx,this.font,this.xLabels), + cosRotation, + firstRotatedWidth; + this.xLabelWidth = originalLabelWidth; + //Allow 3 pixels x2 padding either side for label readability + var xGridWidth = Math.floor(this.calculateX(1) - this.calculateX(0)) - 6; + + //Max label rotate should be 90 - also act as a loop counter + while ((this.xLabelWidth > xGridWidth && this.xLabelRotation === 0) || (this.xLabelWidth > xGridWidth && this.xLabelRotation <= 90 && this.xLabelRotation > 0)){ + cosRotation = Math.cos(toRadians(this.xLabelRotation)); + + firstRotated = cosRotation * firstWidth; + lastRotated = cosRotation * lastWidth; + + // We're right aligning the text now. + if (firstRotated + this.fontSize / 2 > this.yLabelWidth + 8){ + this.xScalePaddingLeft = firstRotated + this.fontSize / 2; + } + this.xScalePaddingRight = this.fontSize/2; + + + this.xLabelRotation++; + this.xLabelWidth = cosRotation * originalLabelWidth; + + } + if (this.xLabelRotation > 0){ + this.endPoint -= Math.sin(toRadians(this.xLabelRotation))*originalLabelWidth + 3; + } + } + else{ + this.xLabelWidth = 0; + this.xScalePaddingRight = this.padding; + this.xScalePaddingLeft = this.padding; + } + + }, + // Needs to be overidden in each Chart type + // Otherwise we need to pass all the data into the scale class + calculateYRange: noop, + drawingArea: function(){ + return this.startPoint - this.endPoint; + }, + calculateY : function(value){ + var scalingFactor = this.drawingArea() / (this.min - this.max); + return this.endPoint - (scalingFactor * (value - this.min)); + }, + calculateX : function(index){ + var isRotated = (this.xLabelRotation > 0), + // innerWidth = (this.offsetGridLines) ? this.width - offsetLeft - this.padding : this.width - (offsetLeft + halfLabelWidth * 2) - this.padding, + innerWidth = this.width - (this.xScalePaddingLeft + this.xScalePaddingRight), + valueWidth = innerWidth/Math.max((this.valuesCount - ((this.offsetGridLines) ? 0 : 1)), 1), + valueOffset = (valueWidth * index) + this.xScalePaddingLeft; + + if (this.offsetGridLines){ + valueOffset += (valueWidth/2); + } + + return Math.round(valueOffset); + }, + update : function(newProps){ + helpers.extend(this, newProps); + this.fit(); + }, + draw : function(){ + var ctx = this.ctx, + yLabelGap = (this.endPoint - this.startPoint) / this.steps, + xStart = Math.round(this.xScalePaddingLeft); + if (this.display){ + ctx.fillStyle = this.textColor; + ctx.font = this.font; + each(this.yLabels,function(labelString,index){ + var yLabelCenter = this.endPoint - (yLabelGap * index), + linePositionY = Math.round(yLabelCenter), + drawHorizontalLine = this.showHorizontalLines; + + ctx.textAlign = "right"; + ctx.textBaseline = "middle"; + if (this.showLabels){ + ctx.fillText(labelString,xStart - 10,yLabelCenter); + } + + // This is X axis, so draw it + if (index === 0 && !drawHorizontalLine){ + drawHorizontalLine = true; + } + + if (drawHorizontalLine){ + ctx.beginPath(); + } + + if (index > 0){ + // This is a grid line in the centre, so drop that + ctx.lineWidth = this.gridLineWidth; + ctx.strokeStyle = this.gridLineColor; + } else { + // This is the first line on the scale + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + } + + linePositionY += helpers.aliasPixel(ctx.lineWidth); + + if(drawHorizontalLine){ + ctx.moveTo(xStart, linePositionY); + ctx.lineTo(this.width, linePositionY); + ctx.stroke(); + ctx.closePath(); + } + + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + ctx.beginPath(); + ctx.moveTo(xStart - 5, linePositionY); + ctx.lineTo(xStart, linePositionY); + ctx.stroke(); + ctx.closePath(); + + },this); + + each(this.xLabels,function(label,index){ + var xPos = this.calculateX(index) + aliasPixel(this.lineWidth), + // Check to see if line/bar here and decide where to place the line + linePos = this.calculateX(index - (this.offsetGridLines ? 0.5 : 0)) + aliasPixel(this.lineWidth), + isRotated = (this.xLabelRotation > 0), + drawVerticalLine = this.showVerticalLines; + + // This is Y axis, so draw it + if (index === 0 && !drawVerticalLine){ + drawVerticalLine = true; + } + + if (drawVerticalLine){ + ctx.beginPath(); + } + + if (index > 0){ + // This is a grid line in the centre, so drop that + ctx.lineWidth = this.gridLineWidth; + ctx.strokeStyle = this.gridLineColor; + } else { + // This is the first line on the scale + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + } + + if (drawVerticalLine){ + ctx.moveTo(linePos,this.endPoint); + ctx.lineTo(linePos,this.startPoint - 3); + ctx.stroke(); + ctx.closePath(); + } + + + ctx.lineWidth = this.lineWidth; + ctx.strokeStyle = this.lineColor; + + + // Small lines at the bottom of the base grid line + ctx.beginPath(); + ctx.moveTo(linePos,this.endPoint); + ctx.lineTo(linePos,this.endPoint + 5); + ctx.stroke(); + ctx.closePath(); + + ctx.save(); + ctx.translate(xPos,(isRotated) ? this.endPoint + 12 : this.endPoint + 8); + ctx.rotate(toRadians(this.xLabelRotation)*-1); + ctx.font = this.font; + ctx.textAlign = (isRotated) ? "right" : "center"; + ctx.textBaseline = (isRotated) ? "middle" : "top"; + ctx.fillText(label, 0, 0); + ctx.restore(); + },this); + + } + } + + }); + + Chart.RadialScale = Chart.Element.extend({ + initialize: function(){ + this.size = min([this.height, this.width]); + this.drawingArea = (this.display) ? (this.size/2) - (this.fontSize/2 + this.backdropPaddingY) : (this.size/2); + }, + calculateCenterOffset: function(value){ + // Take into account half font size + the yPadding of the top value + var scalingFactor = this.drawingArea / (this.max - this.min); + + return (value - this.min) * scalingFactor; + }, + update : function(){ + if (!this.lineArc){ + this.setScaleSize(); + } else { + this.drawingArea = (this.display) ? (this.size/2) - (this.fontSize/2 + this.backdropPaddingY) : (this.size/2); + } + this.buildYLabels(); + }, + buildYLabels: function(){ + this.yLabels = []; + + var stepDecimalPlaces = getDecimalPlaces(this.stepValue); + + for (var i=0; i<=this.steps; i++){ + this.yLabels.push(template(this.templateString,{value:(this.min + (i * this.stepValue)).toFixed(stepDecimalPlaces)})); + } + }, + getCircumference : function(){ + return ((Math.PI*2) / this.valuesCount); + }, + setScaleSize: function(){ + /* + * Right, this is really confusing and there is a lot of maths going on here + * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9 + * + * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif + * + * Solution: + * + * We assume the radius of the polygon is half the size of the canvas at first + * at each index we check if the text overlaps. + * + * Where it does, we store that angle and that index. + * + * After finding the largest index and angle we calculate how much we need to remove + * from the shape radius to move the point inwards by that x. + * + * We average the left and right distances to get the maximum shape radius that can fit in the box + * along with labels. + * + * Once we have that, we can find the centre point for the chart, by taking the x text protrusion + * on each side, removing that from the size, halving it and adding the left x protrusion width. + * + * This will mean we have a shape fitted to the canvas, as large as it can be with the labels + * and position it in the most space efficient manner + * + * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif + */ + + + // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width. + // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points + var largestPossibleRadius = min([(this.height/2 - this.pointLabelFontSize - 5), this.width/2]), + pointPosition, + i, + textWidth, + halfTextWidth, + furthestRight = this.width, + furthestRightIndex, + furthestRightAngle, + furthestLeft = 0, + furthestLeftIndex, + furthestLeftAngle, + xProtrusionLeft, + xProtrusionRight, + radiusReductionRight, + radiusReductionLeft, + maxWidthRadius; + this.ctx.font = fontString(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily); + for (i=0;i<this.valuesCount;i++){ + // 5px to space the text slightly out - similar to what we do in the draw function. + pointPosition = this.getPointPosition(i, largestPossibleRadius); + textWidth = this.ctx.measureText(template(this.templateString, { value: this.labels[i] })).width + 5; + if (i === 0 || i === this.valuesCount/2){ + // If we're at index zero, or exactly the middle, we're at exactly the top/bottom + // of the radar chart, so text will be aligned centrally, so we'll half it and compare + // w/left and right text sizes + halfTextWidth = textWidth/2; + if (pointPosition.x + halfTextWidth > furthestRight) { + furthestRight = pointPosition.x + halfTextWidth; + furthestRightIndex = i; + } + if (pointPosition.x - halfTextWidth < furthestLeft) { + furthestLeft = pointPosition.x - halfTextWidth; + furthestLeftIndex = i; + } + } + else if (i < this.valuesCount/2) { + // Less than half the values means we'll left align the text + if (pointPosition.x + textWidth > furthestRight) { + furthestRight = pointPosition.x + textWidth; + furthestRightIndex = i; + } + } + else if (i > this.valuesCount/2){ + // More than half the values means we'll right align the text + if (pointPosition.x - textWidth < furthestLeft) { + furthestLeft = pointPosition.x - textWidth; + furthestLeftIndex = i; + } + } + } + + xProtrusionLeft = furthestLeft; + + xProtrusionRight = Math.ceil(furthestRight - this.width); + + furthestRightAngle = this.getIndexAngle(furthestRightIndex); + + furthestLeftAngle = this.getIndexAngle(furthestLeftIndex); + + radiusReductionRight = xProtrusionRight / Math.sin(furthestRightAngle + Math.PI/2); + + radiusReductionLeft = xProtrusionLeft / Math.sin(furthestLeftAngle + Math.PI/2); + + // Ensure we actually need to reduce the size of the chart + radiusReductionRight = (isNumber(radiusReductionRight)) ? radiusReductionRight : 0; + radiusReductionLeft = (isNumber(radiusReductionLeft)) ? radiusReductionLeft : 0; + + this.drawingArea = largestPossibleRadius - (radiusReductionLeft + radiusReductionRight)/2; + + //this.drawingArea = min([maxWidthRadius, (this.height - (2 * (this.pointLabelFontSize + 5)))/2]) + this.setCenterPoint(radiusReductionLeft, radiusReductionRight); + + }, + setCenterPoint: function(leftMovement, rightMovement){ + + var maxRight = this.width - rightMovement - this.drawingArea, + maxLeft = leftMovement + this.drawingArea; + + this.xCenter = (maxLeft + maxRight)/2; + // Always vertically in the centre as the text height doesn't change + this.yCenter = (this.height/2); + }, + + getIndexAngle : function(index){ + var angleMultiplier = (Math.PI * 2) / this.valuesCount; + // Start from the top instead of right, so remove a quarter of the circle + + return index * angleMultiplier - (Math.PI/2); + }, + getPointPosition : function(index, distanceFromCenter){ + var thisAngle = this.getIndexAngle(index); + return { + x : (Math.cos(thisAngle) * distanceFromCenter) + this.xCenter, + y : (Math.sin(thisAngle) * distanceFromCenter) + this.yCenter + }; + }, + draw: function(){ + if (this.display){ + var ctx = this.ctx; + each(this.yLabels, function(label, index){ + // Don't draw a centre value + if (index > 0){ + var yCenterOffset = index * (this.drawingArea/this.steps), + yHeight = this.yCenter - yCenterOffset, + pointPosition; + + // Draw circular lines around the scale + if (this.lineWidth > 0){ + ctx.strokeStyle = this.lineColor; + ctx.lineWidth = this.lineWidth; + + if(this.lineArc){ + ctx.beginPath(); + ctx.arc(this.xCenter, this.yCenter, yCenterOffset, 0, Math.PI*2); + ctx.closePath(); + ctx.stroke(); + } else{ + ctx.beginPath(); + for (var i=0;i<this.valuesCount;i++) + { + pointPosition = this.getPointPosition(i, this.calculateCenterOffset(this.min + (index * this.stepValue))); + if (i === 0){ + ctx.moveTo(pointPosition.x, pointPosition.y); + } else { + ctx.lineTo(pointPosition.x, pointPosition.y); + } + } + ctx.closePath(); + ctx.stroke(); + } + } + if(this.showLabels){ + ctx.font = fontString(this.fontSize,this.fontStyle,this.fontFamily); + if (this.showLabelBackdrop){ + var labelWidth = ctx.measureText(label).width; + ctx.fillStyle = this.backdropColor; + ctx.fillRect( + this.xCenter - labelWidth/2 - this.backdropPaddingX, + yHeight - this.fontSize/2 - this.backdropPaddingY, + labelWidth + this.backdropPaddingX*2, + this.fontSize + this.backdropPaddingY*2 + ); + } + ctx.textAlign = 'center'; + ctx.textBaseline = "middle"; + ctx.fillStyle = this.fontColor; + ctx.fillText(label, this.xCenter, yHeight); + } + } + }, this); + + if (!this.lineArc){ + ctx.lineWidth = this.angleLineWidth; + ctx.strokeStyle = this.angleLineColor; + for (var i = this.valuesCount - 1; i >= 0; i--) { + if (this.angleLineWidth > 0){ + var outerPosition = this.getPointPosition(i, this.calculateCenterOffset(this.max)); + ctx.beginPath(); + ctx.moveTo(this.xCenter, this.yCenter); + ctx.lineTo(outerPosition.x, outerPosition.y); + ctx.stroke(); + ctx.closePath(); + } + // Extra 3px out for some label spacing + var pointLabelPosition = this.getPointPosition(i, this.calculateCenterOffset(this.max) + 5); + ctx.font = fontString(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily); + ctx.fillStyle = this.pointLabelFontColor; + + var labelsCount = this.labels.length, + halfLabelsCount = this.labels.length/2, + quarterLabelsCount = halfLabelsCount/2, + upperHalf = (i < quarterLabelsCount || i > labelsCount - quarterLabelsCount), + exactQuarter = (i === quarterLabelsCount || i === labelsCount - quarterLabelsCount); + if (i === 0){ + ctx.textAlign = 'center'; + } else if(i === halfLabelsCount){ + ctx.textAlign = 'center'; + } else if (i < halfLabelsCount){ + ctx.textAlign = 'left'; + } else { + ctx.textAlign = 'right'; + } + + // Set the correct text baseline based on outer positioning + if (exactQuarter){ + ctx.textBaseline = 'middle'; + } else if (upperHalf){ + ctx.textBaseline = 'bottom'; + } else { + ctx.textBaseline = 'top'; + } + + ctx.fillText(this.labels[i], pointLabelPosition.x, pointLabelPosition.y); + } + } + } + } + }); + + // Attach global event to resize each chart instance when the browser resizes + helpers.addEvent(window, "resize", (function(){ + // Basic debounce of resize function so it doesn't hurt performance when resizing browser. + var timeout; + return function(){ + clearTimeout(timeout); + timeout = setTimeout(function(){ + each(Chart.instances,function(instance){ + // If the responsive flag is set in the chart instance config + // Cascade the resize event down to the chart. + if (instance.options.responsive){ + instance.resize(instance.render, true); + } + }); + }, 50); + }; + })()); + + + if (amd) { + define(function(){ + return Chart; + }); + } else if (typeof module === 'object' && module.exports) { + module.exports = Chart; + } + + root.Chart = Chart; + + Chart.noConflict = function(){ + root.Chart = previous; + return Chart; + }; + +}).call(this); + +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + helpers = Chart.helpers; + + + var defaultConfig = { + //Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value + scaleBeginAtZero : true, + + //Boolean - Whether grid lines are shown across the chart + scaleShowGridLines : true, + + //String - Colour of the grid lines + scaleGridLineColor : "rgba(0,0,0,.05)", + + //Number - Width of the grid lines + scaleGridLineWidth : 1, + + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + + //Boolean - If there is a stroke on each bar + barShowStroke : true, + + //Number - Pixel width of the bar stroke + barStrokeWidth : 2, + + //Number - Spacing between each of the X value sets + barValueSpacing : 5, + + //Number - Spacing between data sets within X values + barDatasetSpacing : 1, + + //String - A legend template + legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].fillColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>" + + }; + + + Chart.Type.extend({ + name: "Bar", + defaults : defaultConfig, + initialize: function(data){ + + //Expose options as a scope variable here so we can access it in the ScaleClass + var options = this.options; + + this.ScaleClass = Chart.Scale.extend({ + offsetGridLines : true, + calculateBarX : function(datasetCount, datasetIndex, barIndex){ + //Reusable method for calculating the xPosition of a given bar based on datasetIndex & width of the bar + var xWidth = this.calculateBaseWidth(), + xAbsolute = this.calculateX(barIndex) - (xWidth/2), + barWidth = this.calculateBarWidth(datasetCount); + + return xAbsolute + (barWidth * datasetIndex) + (datasetIndex * options.barDatasetSpacing) + barWidth/2; + }, + calculateBaseWidth : function(){ + return (this.calculateX(1) - this.calculateX(0)) - (2*options.barValueSpacing); + }, + calculateBarWidth : function(datasetCount){ + //The padding between datasets is to the right of each bar, providing that there are more than 1 dataset + var baseWidth = this.calculateBaseWidth() - ((datasetCount - 1) * options.barDatasetSpacing); + + return (baseWidth / datasetCount); + } + }); + + this.datasets = []; + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activeBars = (evt.type !== 'mouseout') ? this.getBarsAtEvent(evt) : []; + + this.eachBars(function(bar){ + bar.restore(['fillColor', 'strokeColor']); + }); + helpers.each(activeBars, function(activeBar){ + activeBar.fillColor = activeBar.highlightFill; + activeBar.strokeColor = activeBar.highlightStroke; + }); + this.showTooltip(activeBars); + }); + } + + //Declare the extension of the default point, to cater for the options passed in to the constructor + this.BarClass = Chart.Rectangle.extend({ + strokeWidth : this.options.barStrokeWidth, + showStroke : this.options.barShowStroke, + ctx : this.chart.ctx + }); + + //Iterate through each of the datasets, and build this into a property of the chart + helpers.each(data.datasets,function(dataset,datasetIndex){ + + var datasetObject = { + label : dataset.label || null, + fillColor : dataset.fillColor, + strokeColor : dataset.strokeColor, + bars : [] + }; + + this.datasets.push(datasetObject); + + helpers.each(dataset.data,function(dataPoint,index){ + //Add a new point for each piece of data, passing any required data to draw. + datasetObject.bars.push(new this.BarClass({ + value : dataPoint, + label : data.labels[index], + datasetLabel: dataset.label, + strokeColor : dataset.strokeColor, + fillColor : dataset.fillColor, + highlightFill : dataset.highlightFill || dataset.fillColor, + highlightStroke : dataset.highlightStroke || dataset.strokeColor + })); + },this); + + },this); + + this.buildScale(data.labels); + + this.BarClass.prototype.base = this.scale.endPoint; + + this.eachBars(function(bar, index, datasetIndex){ + helpers.extend(bar, { + width : this.scale.calculateBarWidth(this.datasets.length), + x: this.scale.calculateBarX(this.datasets.length, datasetIndex, index), + y: this.scale.endPoint + }); + bar.save(); + }, this); + + this.render(); + }, + update : function(){ + this.scale.update(); + // Reset any highlight colours before updating. + helpers.each(this.activeElements, function(activeElement){ + activeElement.restore(['fillColor', 'strokeColor']); + }); + + this.eachBars(function(bar){ + bar.save(); + }); + this.render(); + }, + eachBars : function(callback){ + helpers.each(this.datasets,function(dataset, datasetIndex){ + helpers.each(dataset.bars, callback, this, datasetIndex); + },this); + }, + getBarsAtEvent : function(e){ + var barsArray = [], + eventPosition = helpers.getRelativePosition(e), + datasetIterator = function(dataset){ + barsArray.push(dataset.bars[barIndex]); + }, + barIndex; + + for (var datasetIndex = 0; datasetIndex < this.datasets.length; datasetIndex++) { + for (barIndex = 0; barIndex < this.datasets[datasetIndex].bars.length; barIndex++) { + if (this.datasets[datasetIndex].bars[barIndex].inRange(eventPosition.x,eventPosition.y)){ + helpers.each(this.datasets, datasetIterator); + return barsArray; + } + } + } + + return barsArray; + }, + buildScale : function(labels){ + var self = this; + + var dataTotal = function(){ + var values = []; + self.eachBars(function(bar){ + values.push(bar.value); + }); + return values; + }; + + var scaleOptions = { + templateString : this.options.scaleLabel, + height : this.chart.height, + width : this.chart.width, + ctx : this.chart.ctx, + textColor : this.options.scaleFontColor, + fontSize : this.options.scaleFontSize, + fontStyle : this.options.scaleFontStyle, + fontFamily : this.options.scaleFontFamily, + valuesCount : labels.length, + beginAtZero : this.options.scaleBeginAtZero, + integersOnly : this.options.scaleIntegersOnly, + calculateYRange: function(currentHeight){ + var updatedRanges = helpers.calculateScaleRange( + dataTotal(), + currentHeight, + this.fontSize, + this.beginAtZero, + this.integersOnly + ); + helpers.extend(this, updatedRanges); + }, + xLabels : labels, + font : helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily), + lineWidth : this.options.scaleLineWidth, + lineColor : this.options.scaleLineColor, + showHorizontalLines : this.options.scaleShowHorizontalLines, + showVerticalLines : this.options.scaleShowVerticalLines, + gridLineWidth : (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0, + gridLineColor : (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : "rgba(0,0,0,0)", + padding : (this.options.showScale) ? 0 : (this.options.barShowStroke) ? this.options.barStrokeWidth : 0, + showLabels : this.options.scaleShowLabels, + display : this.options.showScale + }; + + if (this.options.scaleOverride){ + helpers.extend(scaleOptions, { + calculateYRange: helpers.noop, + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + }); + } + + this.scale = new this.ScaleClass(scaleOptions); + }, + addData : function(valuesArray,label){ + //Map the values array for each of the datasets + helpers.each(valuesArray,function(value,datasetIndex){ + //Add a new point for each piece of data, passing any required data to draw. + this.datasets[datasetIndex].bars.push(new this.BarClass({ + value : value, + label : label, + x: this.scale.calculateBarX(this.datasets.length, datasetIndex, this.scale.valuesCount+1), + y: this.scale.endPoint, + width : this.scale.calculateBarWidth(this.datasets.length), + base : this.scale.endPoint, + strokeColor : this.datasets[datasetIndex].strokeColor, + fillColor : this.datasets[datasetIndex].fillColor + })); + },this); + + this.scale.addXLabel(label); + //Then re-render the chart. + this.update(); + }, + removeData : function(){ + this.scale.removeXLabel(); + //Then re-render the chart. + helpers.each(this.datasets,function(dataset){ + dataset.bars.shift(); + },this); + this.update(); + }, + reflow : function(){ + helpers.extend(this.BarClass.prototype,{ + y: this.scale.endPoint, + base : this.scale.endPoint + }); + var newScaleProps = helpers.extend({ + height : this.chart.height, + width : this.chart.width + }); + this.scale.update(newScaleProps); + }, + draw : function(ease){ + var easingDecimal = ease || 1; + this.clear(); + + var ctx = this.chart.ctx; + + this.scale.draw(easingDecimal); + + //Draw all the bars for each dataset + helpers.each(this.datasets,function(dataset,datasetIndex){ + helpers.each(dataset.bars,function(bar,index){ + if (bar.hasValue()){ + bar.base = this.scale.endPoint; + //Transition then draw + bar.transition({ + x : this.scale.calculateBarX(this.datasets.length, datasetIndex, index), + y : this.scale.calculateY(bar.value), + width : this.scale.calculateBarWidth(this.datasets.length) + }, easingDecimal).draw(); + } + },this); + + },this); + } + }); + + +}).call(this); + +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + //Cache a local reference to Chart.helpers + helpers = Chart.helpers; + + var defaultConfig = { + //Boolean - Whether we should show a stroke on each segment + segmentShowStroke : true, + + //String - The colour of each segment stroke + segmentStrokeColor : "#fff", + + //Number - The width of each segment stroke + segmentStrokeWidth : 2, + + //The percentage of the chart that we cut out of the middle. + percentageInnerCutout : 50, + + //Number - Amount of animation steps + animationSteps : 100, + + //String - Animation easing effect + animationEasing : "easeOutBounce", + + //Boolean - Whether we animate the rotation of the Doughnut + animateRotate : true, + + //Boolean - Whether we animate scaling the Doughnut from the centre + animateScale : false, + + //String - A legend template + legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>" + + }; + + + Chart.Type.extend({ + //Passing in a name registers this chart in the Chart namespace + name: "Doughnut", + //Providing a defaults will also register the deafults in the chart namespace + defaults : defaultConfig, + //Initialize is fired when the chart is initialized - Data is passed in as a parameter + //Config is automatically merged by the core of Chart.js, and is available at this.options + initialize: function(data){ + + //Declare segments as a static property to prevent inheriting across the Chart type prototype + this.segments = []; + this.outerRadius = (helpers.min([this.chart.width,this.chart.height]) - this.options.segmentStrokeWidth/2)/2; + + this.SegmentArc = Chart.Arc.extend({ + ctx : this.chart.ctx, + x : this.chart.width/2, + y : this.chart.height/2 + }); + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activeSegments = (evt.type !== 'mouseout') ? this.getSegmentsAtEvent(evt) : []; + + helpers.each(this.segments,function(segment){ + segment.restore(["fillColor"]); + }); + helpers.each(activeSegments,function(activeSegment){ + activeSegment.fillColor = activeSegment.highlightColor; + }); + this.showTooltip(activeSegments); + }); + } + this.calculateTotal(data); + + helpers.each(data,function(datapoint, index){ + this.addData(datapoint, index, true); + },this); + + this.render(); + }, + getSegmentsAtEvent : function(e){ + var segmentsArray = []; + + var location = helpers.getRelativePosition(e); + + helpers.each(this.segments,function(segment){ + if (segment.inRange(location.x,location.y)) segmentsArray.push(segment); + },this); + return segmentsArray; + }, + addData : function(segment, atIndex, silent){ + var index = atIndex || this.segments.length; + this.segments.splice(index, 0, new this.SegmentArc({ + value : segment.value, + outerRadius : (this.options.animateScale) ? 0 : this.outerRadius, + innerRadius : (this.options.animateScale) ? 0 : (this.outerRadius/100) * this.options.percentageInnerCutout, + fillColor : segment.color, + highlightColor : segment.highlight || segment.color, + showStroke : this.options.segmentShowStroke, + strokeWidth : this.options.segmentStrokeWidth, + strokeColor : this.options.segmentStrokeColor, + startAngle : Math.PI * 1.5, + circumference : (this.options.animateRotate) ? 0 : this.calculateCircumference(segment.value), + label : segment.label + })); + if (!silent){ + this.reflow(); + this.update(); + } + }, + calculateCircumference : function(value){ + return (Math.PI*2)*(Math.abs(value) / this.total); + }, + calculateTotal : function(data){ + this.total = 0; + helpers.each(data,function(segment){ + this.total += Math.abs(segment.value); + },this); + }, + update : function(){ + this.calculateTotal(this.segments); + + // Reset any highlight colours before updating. + helpers.each(this.activeElements, function(activeElement){ + activeElement.restore(['fillColor']); + }); + + helpers.each(this.segments,function(segment){ + segment.save(); + }); + this.render(); + }, + + removeData: function(atIndex){ + var indexToDelete = (helpers.isNumber(atIndex)) ? atIndex : this.segments.length-1; + this.segments.splice(indexToDelete, 1); + this.reflow(); + this.update(); + }, + + reflow : function(){ + helpers.extend(this.SegmentArc.prototype,{ + x : this.chart.width/2, + y : this.chart.height/2 + }); + this.outerRadius = (helpers.min([this.chart.width,this.chart.height]) - this.options.segmentStrokeWidth/2)/2; + helpers.each(this.segments, function(segment){ + segment.update({ + outerRadius : this.outerRadius, + innerRadius : (this.outerRadius/100) * this.options.percentageInnerCutout + }); + }, this); + }, + draw : function(easeDecimal){ + var animDecimal = (easeDecimal) ? easeDecimal : 1; + this.clear(); + helpers.each(this.segments,function(segment,index){ + segment.transition({ + circumference : this.calculateCircumference(segment.value), + outerRadius : this.outerRadius, + innerRadius : (this.outerRadius/100) * this.options.percentageInnerCutout + },animDecimal); + + segment.endAngle = segment.startAngle + segment.circumference; + + segment.draw(); + if (index === 0){ + segment.startAngle = Math.PI * 1.5; + } + //Check to see if it's the last segment, if not get the next and update the start angle + if (index < this.segments.length-1){ + this.segments[index+1].startAngle = segment.endAngle; + } + },this); + + } + }); + + Chart.types.Doughnut.extend({ + name : "Pie", + defaults : helpers.merge(defaultConfig,{percentageInnerCutout : 0}) + }); + +}).call(this); +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + helpers = Chart.helpers; + + var defaultConfig = { + + ///Boolean - Whether grid lines are shown across the chart + scaleShowGridLines : true, + + //String - Colour of the grid lines + scaleGridLineColor : "rgba(0,0,0,.05)", + + //Number - Width of the grid lines + scaleGridLineWidth : 1, + + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + + //Boolean - Whether the line is curved between points + bezierCurve : true, + + //Number - Tension of the bezier curve between points + bezierCurveTension : 0.4, + + //Boolean - Whether to show a dot for each point + pointDot : true, + + //Number - Radius of each point dot in pixels + pointDotRadius : 4, + + //Number - Pixel width of point dot stroke + pointDotStrokeWidth : 1, + + //Number - amount extra to add to the radius to cater for hit detection outside the drawn point + pointHitDetectionRadius : 20, + + //Boolean - Whether to show a stroke for datasets + datasetStroke : true, + + //Number - Pixel width of dataset stroke + datasetStrokeWidth : 2, + + //Boolean - Whether to fill the dataset with a colour + datasetFill : true, + + //String - A legend template + legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].strokeColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>" + + }; + + + Chart.Type.extend({ + name: "Line", + defaults : defaultConfig, + initialize: function(data){ + //Declare the extension of the default point, to cater for the options passed in to the constructor + this.PointClass = Chart.Point.extend({ + strokeWidth : this.options.pointDotStrokeWidth, + radius : this.options.pointDotRadius, + display: this.options.pointDot, + hitDetectionRadius : this.options.pointHitDetectionRadius, + ctx : this.chart.ctx, + inRange : function(mouseX){ + return (Math.pow(mouseX-this.x, 2) < Math.pow(this.radius + this.hitDetectionRadius,2)); + } + }); + + this.datasets = []; + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activePoints = (evt.type !== 'mouseout') ? this.getPointsAtEvent(evt) : []; + this.eachPoints(function(point){ + point.restore(['fillColor', 'strokeColor']); + }); + helpers.each(activePoints, function(activePoint){ + activePoint.fillColor = activePoint.highlightFill; + activePoint.strokeColor = activePoint.highlightStroke; + }); + this.showTooltip(activePoints); + }); + } + + //Iterate through each of the datasets, and build this into a property of the chart + helpers.each(data.datasets,function(dataset){ + + var datasetObject = { + label : dataset.label || null, + fillColor : dataset.fillColor, + strokeColor : dataset.strokeColor, + pointColor : dataset.pointColor, + pointStrokeColor : dataset.pointStrokeColor, + points : [] + }; + + this.datasets.push(datasetObject); + + + helpers.each(dataset.data,function(dataPoint,index){ + //Add a new point for each piece of data, passing any required data to draw. + datasetObject.points.push(new this.PointClass({ + value : dataPoint, + label : data.labels[index], + datasetLabel: dataset.label, + strokeColor : dataset.pointStrokeColor, + fillColor : dataset.pointColor, + highlightFill : dataset.pointHighlightFill || dataset.pointColor, + highlightStroke : dataset.pointHighlightStroke || dataset.pointStrokeColor + })); + },this); + + this.buildScale(data.labels); + + + this.eachPoints(function(point, index){ + helpers.extend(point, { + x: this.scale.calculateX(index), + y: this.scale.endPoint + }); + point.save(); + }, this); + + },this); + + + this.render(); + }, + update : function(){ + this.scale.update(); + // Reset any highlight colours before updating. + helpers.each(this.activeElements, function(activeElement){ + activeElement.restore(['fillColor', 'strokeColor']); + }); + this.eachPoints(function(point){ + point.save(); + }); + this.render(); + }, + eachPoints : function(callback){ + helpers.each(this.datasets,function(dataset){ + helpers.each(dataset.points,callback,this); + },this); + }, + getPointsAtEvent : function(e){ + var pointsArray = [], + eventPosition = helpers.getRelativePosition(e); + helpers.each(this.datasets,function(dataset){ + helpers.each(dataset.points,function(point){ + if (point.inRange(eventPosition.x,eventPosition.y)) pointsArray.push(point); + }); + },this); + return pointsArray; + }, + buildScale : function(labels){ + var self = this; + + var dataTotal = function(){ + var values = []; + self.eachPoints(function(point){ + values.push(point.value); + }); + + return values; + }; + + var scaleOptions = { + templateString : this.options.scaleLabel, + height : this.chart.height, + width : this.chart.width, + ctx : this.chart.ctx, + textColor : this.options.scaleFontColor, + fontSize : this.options.scaleFontSize, + fontStyle : this.options.scaleFontStyle, + fontFamily : this.options.scaleFontFamily, + valuesCount : labels.length, + beginAtZero : this.options.scaleBeginAtZero, + integersOnly : this.options.scaleIntegersOnly, + calculateYRange : function(currentHeight){ + var updatedRanges = helpers.calculateScaleRange( + dataTotal(), + currentHeight, + this.fontSize, + this.beginAtZero, + this.integersOnly + ); + helpers.extend(this, updatedRanges); + }, + xLabels : labels, + font : helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily), + lineWidth : this.options.scaleLineWidth, + lineColor : this.options.scaleLineColor, + showHorizontalLines : this.options.scaleShowHorizontalLines, + showVerticalLines : this.options.scaleShowVerticalLines, + gridLineWidth : (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0, + gridLineColor : (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : "rgba(0,0,0,0)", + padding: (this.options.showScale) ? 0 : this.options.pointDotRadius + this.options.pointDotStrokeWidth, + showLabels : this.options.scaleShowLabels, + display : this.options.showScale + }; + + if (this.options.scaleOverride){ + helpers.extend(scaleOptions, { + calculateYRange: helpers.noop, + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + }); + } + + + this.scale = new Chart.Scale(scaleOptions); + }, + addData : function(valuesArray,label){ + //Map the values array for each of the datasets + + helpers.each(valuesArray,function(value,datasetIndex){ + //Add a new point for each piece of data, passing any required data to draw. + this.datasets[datasetIndex].points.push(new this.PointClass({ + value : value, + label : label, + x: this.scale.calculateX(this.scale.valuesCount+1), + y: this.scale.endPoint, + strokeColor : this.datasets[datasetIndex].pointStrokeColor, + fillColor : this.datasets[datasetIndex].pointColor + })); + },this); + + this.scale.addXLabel(label); + //Then re-render the chart. + this.update(); + }, + removeData : function(){ + this.scale.removeXLabel(); + //Then re-render the chart. + helpers.each(this.datasets,function(dataset){ + dataset.points.shift(); + },this); + this.update(); + }, + reflow : function(){ + var newScaleProps = helpers.extend({ + height : this.chart.height, + width : this.chart.width + }); + this.scale.update(newScaleProps); + }, + draw : function(ease){ + var easingDecimal = ease || 1; + this.clear(); + + var ctx = this.chart.ctx; + + // Some helper methods for getting the next/prev points + var hasValue = function(item){ + return item.value !== null; + }, + nextPoint = function(point, collection, index){ + return helpers.findNextWhere(collection, hasValue, index) || point; + }, + previousPoint = function(point, collection, index){ + return helpers.findPreviousWhere(collection, hasValue, index) || point; + }; + + this.scale.draw(easingDecimal); + + + helpers.each(this.datasets,function(dataset){ + var pointsWithValues = helpers.where(dataset.points, hasValue); + + //Transition each point first so that the line and point drawing isn't out of sync + //We can use this extra loop to calculate the control points of this dataset also in this loop + + helpers.each(dataset.points, function(point, index){ + if (point.hasValue()){ + point.transition({ + y : this.scale.calculateY(point.value), + x : this.scale.calculateX(index) + }, easingDecimal); + } + },this); + + + // Control points need to be calculated in a seperate loop, because we need to know the current x/y of the point + // This would cause issues when there is no animation, because the y of the next point would be 0, so beziers would be skewed + if (this.options.bezierCurve){ + helpers.each(pointsWithValues, function(point, index){ + var tension = (index > 0 && index < pointsWithValues.length - 1) ? this.options.bezierCurveTension : 0; + point.controlPoints = helpers.splineCurve( + previousPoint(point, pointsWithValues, index), + point, + nextPoint(point, pointsWithValues, index), + tension + ); + + // Prevent the bezier going outside of the bounds of the graph + + // Cap puter bezier handles to the upper/lower scale bounds + if (point.controlPoints.outer.y > this.scale.endPoint){ + point.controlPoints.outer.y = this.scale.endPoint; + } + else if (point.controlPoints.outer.y < this.scale.startPoint){ + point.controlPoints.outer.y = this.scale.startPoint; + } + + // Cap inner bezier handles to the upper/lower scale bounds + if (point.controlPoints.inner.y > this.scale.endPoint){ + point.controlPoints.inner.y = this.scale.endPoint; + } + else if (point.controlPoints.inner.y < this.scale.startPoint){ + point.controlPoints.inner.y = this.scale.startPoint; + } + },this); + } + + + //Draw the line between all the points + ctx.lineWidth = this.options.datasetStrokeWidth; + ctx.strokeStyle = dataset.strokeColor; + ctx.beginPath(); + + helpers.each(pointsWithValues, function(point, index){ + if (index === 0){ + ctx.moveTo(point.x, point.y); + } + else{ + if(this.options.bezierCurve){ + var previous = previousPoint(point, pointsWithValues, index); + + ctx.bezierCurveTo( + previous.controlPoints.outer.x, + previous.controlPoints.outer.y, + point.controlPoints.inner.x, + point.controlPoints.inner.y, + point.x, + point.y + ); + } + else{ + ctx.lineTo(point.x,point.y); + } + } + }, this); + + ctx.stroke(); + + if (this.options.datasetFill && pointsWithValues.length > 0){ + //Round off the line by going to the base of the chart, back to the start, then fill. + ctx.lineTo(pointsWithValues[pointsWithValues.length - 1].x, this.scale.endPoint); + ctx.lineTo(pointsWithValues[0].x, this.scale.endPoint); + ctx.fillStyle = dataset.fillColor; + ctx.closePath(); + ctx.fill(); + } + + //Now draw the points over the line + //A little inefficient double looping, but better than the line + //lagging behind the point positions + helpers.each(pointsWithValues,function(point){ + point.draw(); + }); + },this); + } + }); + + +}).call(this); + +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + //Cache a local reference to Chart.helpers + helpers = Chart.helpers; + + var defaultConfig = { + //Boolean - Show a backdrop to the scale label + scaleShowLabelBackdrop : true, + + //String - The colour of the label backdrop + scaleBackdropColor : "rgba(255,255,255,0.75)", + + // Boolean - Whether the scale should begin at zero + scaleBeginAtZero : true, + + //Number - The backdrop padding above & below the label in pixels + scaleBackdropPaddingY : 2, + + //Number - The backdrop padding to the side of the label in pixels + scaleBackdropPaddingX : 2, + + //Boolean - Show line for each value in the scale + scaleShowLine : true, + + //Boolean - Stroke a line around each segment in the chart + segmentShowStroke : true, + + //String - The colour of the stroke on each segement. + segmentStrokeColor : "#fff", + + //Number - The width of the stroke value in pixels + segmentStrokeWidth : 2, + + //Number - Amount of animation steps + animationSteps : 100, + + //String - Animation easing effect. + animationEasing : "easeOutBounce", + + //Boolean - Whether to animate the rotation of the chart + animateRotate : true, + + //Boolean - Whether to animate scaling the chart from the centre + animateScale : false, + + //String - A legend template + legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>" + }; + + + Chart.Type.extend({ + //Passing in a name registers this chart in the Chart namespace + name: "PolarArea", + //Providing a defaults will also register the deafults in the chart namespace + defaults : defaultConfig, + //Initialize is fired when the chart is initialized - Data is passed in as a parameter + //Config is automatically merged by the core of Chart.js, and is available at this.options + initialize: function(data){ + this.segments = []; + //Declare segment class as a chart instance specific class, so it can share props for this instance + this.SegmentArc = Chart.Arc.extend({ + showStroke : this.options.segmentShowStroke, + strokeWidth : this.options.segmentStrokeWidth, + strokeColor : this.options.segmentStrokeColor, + ctx : this.chart.ctx, + innerRadius : 0, + x : this.chart.width/2, + y : this.chart.height/2 + }); + this.scale = new Chart.RadialScale({ + display: this.options.showScale, + fontStyle: this.options.scaleFontStyle, + fontSize: this.options.scaleFontSize, + fontFamily: this.options.scaleFontFamily, + fontColor: this.options.scaleFontColor, + showLabels: this.options.scaleShowLabels, + showLabelBackdrop: this.options.scaleShowLabelBackdrop, + backdropColor: this.options.scaleBackdropColor, + backdropPaddingY : this.options.scaleBackdropPaddingY, + backdropPaddingX: this.options.scaleBackdropPaddingX, + lineWidth: (this.options.scaleShowLine) ? this.options.scaleLineWidth : 0, + lineColor: this.options.scaleLineColor, + lineArc: true, + width: this.chart.width, + height: this.chart.height, + xCenter: this.chart.width/2, + yCenter: this.chart.height/2, + ctx : this.chart.ctx, + templateString: this.options.scaleLabel, + valuesCount: data.length + }); + + this.updateScaleRange(data); + + this.scale.update(); + + helpers.each(data,function(segment,index){ + this.addData(segment,index,true); + },this); + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activeSegments = (evt.type !== 'mouseout') ? this.getSegmentsAtEvent(evt) : []; + helpers.each(this.segments,function(segment){ + segment.restore(["fillColor"]); + }); + helpers.each(activeSegments,function(activeSegment){ + activeSegment.fillColor = activeSegment.highlightColor; + }); + this.showTooltip(activeSegments); + }); + } + + this.render(); + }, + getSegmentsAtEvent : function(e){ + var segmentsArray = []; + + var location = helpers.getRelativePosition(e); + + helpers.each(this.segments,function(segment){ + if (segment.inRange(location.x,location.y)) segmentsArray.push(segment); + },this); + return segmentsArray; + }, + addData : function(segment, atIndex, silent){ + var index = atIndex || this.segments.length; + + this.segments.splice(index, 0, new this.SegmentArc({ + fillColor: segment.color, + highlightColor: segment.highlight || segment.color, + label: segment.label, + value: segment.value, + outerRadius: (this.options.animateScale) ? 0 : this.scale.calculateCenterOffset(segment.value), + circumference: (this.options.animateRotate) ? 0 : this.scale.getCircumference(), + startAngle: Math.PI * 1.5 + })); + if (!silent){ + this.reflow(); + this.update(); + } + }, + removeData: function(atIndex){ + var indexToDelete = (helpers.isNumber(atIndex)) ? atIndex : this.segments.length-1; + this.segments.splice(indexToDelete, 1); + this.reflow(); + this.update(); + }, + calculateTotal: function(data){ + this.total = 0; + helpers.each(data,function(segment){ + this.total += segment.value; + },this); + this.scale.valuesCount = this.segments.length; + }, + updateScaleRange: function(datapoints){ + var valuesArray = []; + helpers.each(datapoints,function(segment){ + valuesArray.push(segment.value); + }); + + var scaleSizes = (this.options.scaleOverride) ? + { + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + } : + helpers.calculateScaleRange( + valuesArray, + helpers.min([this.chart.width, this.chart.height])/2, + this.options.scaleFontSize, + this.options.scaleBeginAtZero, + this.options.scaleIntegersOnly + ); + + helpers.extend( + this.scale, + scaleSizes, + { + size: helpers.min([this.chart.width, this.chart.height]), + xCenter: this.chart.width/2, + yCenter: this.chart.height/2 + } + ); + + }, + update : function(){ + this.calculateTotal(this.segments); + + helpers.each(this.segments,function(segment){ + segment.save(); + }); + + this.reflow(); + this.render(); + }, + reflow : function(){ + helpers.extend(this.SegmentArc.prototype,{ + x : this.chart.width/2, + y : this.chart.height/2 + }); + this.updateScaleRange(this.segments); + this.scale.update(); + + helpers.extend(this.scale,{ + xCenter: this.chart.width/2, + yCenter: this.chart.height/2 + }); + + helpers.each(this.segments, function(segment){ + segment.update({ + outerRadius : this.scale.calculateCenterOffset(segment.value) + }); + }, this); + + }, + draw : function(ease){ + var easingDecimal = ease || 1; + //Clear & draw the canvas + this.clear(); + helpers.each(this.segments,function(segment, index){ + segment.transition({ + circumference : this.scale.getCircumference(), + outerRadius : this.scale.calculateCenterOffset(segment.value) + },easingDecimal); + + segment.endAngle = segment.startAngle + segment.circumference; + + // If we've removed the first segment we need to set the first one to + // start at the top. + if (index === 0){ + segment.startAngle = Math.PI * 1.5; + } + + //Check to see if it's the last segment, if not get the next and update the start angle + if (index < this.segments.length - 1){ + this.segments[index+1].startAngle = segment.endAngle; + } + segment.draw(); + }, this); + this.scale.draw(); + } + }); + +}).call(this); +(function(){ + "use strict"; + + var root = this, + Chart = root.Chart, + helpers = Chart.helpers; + + + + Chart.Type.extend({ + name: "Radar", + defaults:{ + //Boolean - Whether to show lines for each scale point + scaleShowLine : true, + + //Boolean - Whether we show the angle lines out of the radar + angleShowLineOut : true, + + //Boolean - Whether to show labels on the scale + scaleShowLabels : false, + + // Boolean - Whether the scale should begin at zero + scaleBeginAtZero : true, + + //String - Colour of the angle line + angleLineColor : "rgba(0,0,0,.1)", + + //Number - Pixel width of the angle line + angleLineWidth : 1, + + //String - Point label font declaration + pointLabelFontFamily : "'Arial'", + + //String - Point label font weight + pointLabelFontStyle : "normal", + + //Number - Point label font size in pixels + pointLabelFontSize : 10, + + //String - Point label font colour + pointLabelFontColor : "#666", + + //Boolean - Whether to show a dot for each point + pointDot : true, + + //Number - Radius of each point dot in pixels + pointDotRadius : 3, + + //Number - Pixel width of point dot stroke + pointDotStrokeWidth : 1, + + //Number - amount extra to add to the radius to cater for hit detection outside the drawn point + pointHitDetectionRadius : 20, + + //Boolean - Whether to show a stroke for datasets + datasetStroke : true, + + //Number - Pixel width of dataset stroke + datasetStrokeWidth : 2, + + //Boolean - Whether to fill the dataset with a colour + datasetFill : true, + + //String - A legend template + legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].strokeColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>" + + }, + + initialize: function(data){ + this.PointClass = Chart.Point.extend({ + strokeWidth : this.options.pointDotStrokeWidth, + radius : this.options.pointDotRadius, + display: this.options.pointDot, + hitDetectionRadius : this.options.pointHitDetectionRadius, + ctx : this.chart.ctx + }); + + this.datasets = []; + + this.buildScale(data); + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activePointsCollection = (evt.type !== 'mouseout') ? this.getPointsAtEvent(evt) : []; + + this.eachPoints(function(point){ + point.restore(['fillColor', 'strokeColor']); + }); + helpers.each(activePointsCollection, function(activePoint){ + activePoint.fillColor = activePoint.highlightFill; + activePoint.strokeColor = activePoint.highlightStroke; + }); + + this.showTooltip(activePointsCollection); + }); + } + + //Iterate through each of the datasets, and build this into a property of the chart + helpers.each(data.datasets,function(dataset){ + + var datasetObject = { + label: dataset.label || null, + fillColor : dataset.fillColor, + strokeColor : dataset.strokeColor, + pointColor : dataset.pointColor, + pointStrokeColor : dataset.pointStrokeColor, + points : [] + }; + + this.datasets.push(datasetObject); + + helpers.each(dataset.data,function(dataPoint,index){ + //Add a new point for each piece of data, passing any required data to draw. + var pointPosition; + if (!this.scale.animation){ + pointPosition = this.scale.getPointPosition(index, this.scale.calculateCenterOffset(dataPoint)); + } + datasetObject.points.push(new this.PointClass({ + value : dataPoint, + label : data.labels[index], + datasetLabel: dataset.label, + x: (this.options.animation) ? this.scale.xCenter : pointPosition.x, + y: (this.options.animation) ? this.scale.yCenter : pointPosition.y, + strokeColor : dataset.pointStrokeColor, + fillColor : dataset.pointColor, + highlightFill : dataset.pointHighlightFill || dataset.pointColor, + highlightStroke : dataset.pointHighlightStroke || dataset.pointStrokeColor + })); + },this); + + },this); + + this.render(); + }, + eachPoints : function(callback){ + helpers.each(this.datasets,function(dataset){ + helpers.each(dataset.points,callback,this); + },this); + }, + + getPointsAtEvent : function(evt){ + var mousePosition = helpers.getRelativePosition(evt), + fromCenter = helpers.getAngleFromPoint({ + x: this.scale.xCenter, + y: this.scale.yCenter + }, mousePosition); + + var anglePerIndex = (Math.PI * 2) /this.scale.valuesCount, + pointIndex = Math.round((fromCenter.angle - Math.PI * 1.5) / anglePerIndex), + activePointsCollection = []; + + // If we're at the top, make the pointIndex 0 to get the first of the array. + if (pointIndex >= this.scale.valuesCount || pointIndex < 0){ + pointIndex = 0; + } + + if (fromCenter.distance <= this.scale.drawingArea){ + helpers.each(this.datasets, function(dataset){ + activePointsCollection.push(dataset.points[pointIndex]); + }); + } + + return activePointsCollection; + }, + + buildScale : function(data){ + this.scale = new Chart.RadialScale({ + display: this.options.showScale, + fontStyle: this.options.scaleFontStyle, + fontSize: this.options.scaleFontSize, + fontFamily: this.options.scaleFontFamily, + fontColor: this.options.scaleFontColor, + showLabels: this.options.scaleShowLabels, + showLabelBackdrop: this.options.scaleShowLabelBackdrop, + backdropColor: this.options.scaleBackdropColor, + backdropPaddingY : this.options.scaleBackdropPaddingY, + backdropPaddingX: this.options.scaleBackdropPaddingX, + lineWidth: (this.options.scaleShowLine) ? this.options.scaleLineWidth : 0, + lineColor: this.options.scaleLineColor, + angleLineColor : this.options.angleLineColor, + angleLineWidth : (this.options.angleShowLineOut) ? this.options.angleLineWidth : 0, + // Point labels at the edge of each line + pointLabelFontColor : this.options.pointLabelFontColor, + pointLabelFontSize : this.options.pointLabelFontSize, + pointLabelFontFamily : this.options.pointLabelFontFamily, + pointLabelFontStyle : this.options.pointLabelFontStyle, + height : this.chart.height, + width: this.chart.width, + xCenter: this.chart.width/2, + yCenter: this.chart.height/2, + ctx : this.chart.ctx, + templateString: this.options.scaleLabel, + labels: data.labels, + valuesCount: data.datasets[0].data.length + }); + + this.scale.setScaleSize(); + this.updateScaleRange(data.datasets); + this.scale.buildYLabels(); + }, + updateScaleRange: function(datasets){ + var valuesArray = (function(){ + var totalDataArray = []; + helpers.each(datasets,function(dataset){ + if (dataset.data){ + totalDataArray = totalDataArray.concat(dataset.data); + } + else { + helpers.each(dataset.points, function(point){ + totalDataArray.push(point.value); + }); + } + }); + return totalDataArray; + })(); + + + var scaleSizes = (this.options.scaleOverride) ? + { + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + } : + helpers.calculateScaleRange( + valuesArray, + helpers.min([this.chart.width, this.chart.height])/2, + this.options.scaleFontSize, + this.options.scaleBeginAtZero, + this.options.scaleIntegersOnly + ); + + helpers.extend( + this.scale, + scaleSizes + ); + + }, + addData : function(valuesArray,label){ + //Map the values array for each of the datasets + this.scale.valuesCount++; + helpers.each(valuesArray,function(value,datasetIndex){ + var pointPosition = this.scale.getPointPosition(this.scale.valuesCount, this.scale.calculateCenterOffset(value)); + this.datasets[datasetIndex].points.push(new this.PointClass({ + value : value, + label : label, + x: pointPosition.x, + y: pointPosition.y, + strokeColor : this.datasets[datasetIndex].pointStrokeColor, + fillColor : this.datasets[datasetIndex].pointColor + })); + },this); + + this.scale.labels.push(label); + + this.reflow(); + + this.update(); + }, + removeData : function(){ + this.scale.valuesCount--; + this.scale.labels.shift(); + helpers.each(this.datasets,function(dataset){ + dataset.points.shift(); + },this); + this.reflow(); + this.update(); + }, + update : function(){ + this.eachPoints(function(point){ + point.save(); + }); + this.reflow(); + this.render(); + }, + reflow: function(){ + helpers.extend(this.scale, { + width : this.chart.width, + height: this.chart.height, + size : helpers.min([this.chart.width, this.chart.height]), + xCenter: this.chart.width/2, + yCenter: this.chart.height/2 + }); + this.updateScaleRange(this.datasets); + this.scale.setScaleSize(); + this.scale.buildYLabels(); + }, + draw : function(ease){ + var easeDecimal = ease || 1, + ctx = this.chart.ctx; + this.clear(); + this.scale.draw(); + + helpers.each(this.datasets,function(dataset){ + + //Transition each point first so that the line and point drawing isn't out of sync + helpers.each(dataset.points,function(point,index){ + if (point.hasValue()){ + point.transition(this.scale.getPointPosition(index, this.scale.calculateCenterOffset(point.value)), easeDecimal); + } + },this); + + + + //Draw the line between all the points + ctx.lineWidth = this.options.datasetStrokeWidth; + ctx.strokeStyle = dataset.strokeColor; + ctx.beginPath(); + helpers.each(dataset.points,function(point,index){ + if (index === 0){ + ctx.moveTo(point.x,point.y); + } + else{ + ctx.lineTo(point.x,point.y); + } + },this); + ctx.closePath(); + ctx.stroke(); + + ctx.fillStyle = dataset.fillColor; + ctx.fill(); + + //Now draw the points over the line + //A little inefficient double looping, but better than the line + //lagging behind the point positions + helpers.each(dataset.points,function(point){ + if (point.hasValue()){ + point.draw(); + } + }); + + },this); + + } + + }); + + + + + +}).call(this); diff --git a/theme/bootstrap/plugins/chartjs/Chart.min.js b/theme/bootstrap/plugins/chartjs/Chart.min.js new file mode 100644 index 0000000..fdbb8d9 --- /dev/null +++ b/theme/bootstrap/plugins/chartjs/Chart.min.js @@ -0,0 +1,11 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 1.0.2 + * + * Copyright 2015 Nick Downie + * Released under the MIT license + * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md + */ +(function(){"use strict";var t=this,i=t.Chart,e=function(t){this.canvas=t.canvas,this.ctx=t;var i=function(t,i){return t["offset"+i]?t["offset"+i]:document.defaultView.getComputedStyle(t).getPropertyValue(i)},e=this.width=i(t.canvas,"Width"),n=this.height=i(t.canvas,"Height");t.canvas.width=e,t.canvas.height=n;var e=this.width=t.canvas.width,n=this.height=t.canvas.height;return this.aspectRatio=this.width/this.height,s.retinaScale(this),this};e.defaults={global:{animation:!0,animationSteps:60,animationEasing:"easeOutQuart",showScale:!0,scaleOverride:!1,scaleSteps:null,scaleStepWidth:null,scaleStartValue:null,scaleLineColor:"rgba(0,0,0,.1)",scaleLineWidth:1,scaleShowLabels:!0,scaleLabel:"<%=value%>",scaleIntegersOnly:!0,scaleBeginAtZero:!1,scaleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",scaleFontSize:12,scaleFontStyle:"normal",scaleFontColor:"#666",responsive:!1,maintainAspectRatio:!0,showTooltips:!0,customTooltips:!1,tooltipEvents:["mousemove","touchstart","touchmove","mouseout"],tooltipFillColor:"rgba(0,0,0,0.8)",tooltipFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipFontSize:14,tooltipFontStyle:"normal",tooltipFontColor:"#fff",tooltipTitleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipTitleFontSize:14,tooltipTitleFontStyle:"bold",tooltipTitleFontColor:"#fff",tooltipYPadding:6,tooltipXPadding:6,tooltipCaretSize:8,tooltipCornerRadius:6,tooltipXOffset:10,tooltipTemplate:"<%if (label){%><%=label%>: <%}%><%= value %>",multiTooltipTemplate:"<%= value %>",multiTooltipKeyBackground:"#fff",onAnimationProgress:function(){},onAnimationComplete:function(){}}},e.types={};var s=e.helpers={},n=s.each=function(t,i,e){var s=Array.prototype.slice.call(arguments,3);if(t)if(t.length===+t.length){var n;for(n=0;n<t.length;n++)i.apply(e,[t[n],n].concat(s))}else for(var o in t)i.apply(e,[t[o],o].concat(s))},o=s.clone=function(t){var i={};return n(t,function(e,s){t.hasOwnProperty(s)&&(i[s]=e)}),i},a=s.extend=function(t){return n(Array.prototype.slice.call(arguments,1),function(i){n(i,function(e,s){i.hasOwnProperty(s)&&(t[s]=e)})}),t},h=s.merge=function(){var t=Array.prototype.slice.call(arguments,0);return t.unshift({}),a.apply(null,t)},l=s.indexOf=function(t,i){if(Array.prototype.indexOf)return t.indexOf(i);for(var e=0;e<t.length;e++)if(t[e]===i)return e;return-1},r=(s.where=function(t,i){var e=[];return s.each(t,function(t){i(t)&&e.push(t)}),e},s.findNextWhere=function(t,i,e){e||(e=-1);for(var s=e+1;s<t.length;s++){var n=t[s];if(i(n))return n}},s.findPreviousWhere=function(t,i,e){e||(e=t.length);for(var s=e-1;s>=0;s--){var n=t[s];if(i(n))return n}},s.inherits=function(t){var i=this,e=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return i.apply(this,arguments)},s=function(){this.constructor=e};return s.prototype=i.prototype,e.prototype=new s,e.extend=r,t&&a(e.prototype,t),e.__super__=i.prototype,e}),c=s.noop=function(){},u=s.uid=function(){var t=0;return function(){return"chart-"+t++}}(),d=s.warn=function(t){window.console&&"function"==typeof window.console.warn&&console.warn(t)},p=s.amd="function"==typeof define&&define.amd,f=s.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},g=s.max=function(t){return Math.max.apply(Math,t)},m=s.min=function(t){return Math.min.apply(Math,t)},v=(s.cap=function(t,i,e){if(f(i)){if(t>i)return i}else if(f(e)&&e>t)return e;return t},s.getDecimalPlaces=function(t){return t%1!==0&&f(t)?t.toString().split(".")[1].length:0}),S=s.radians=function(t){return t*(Math.PI/180)},x=(s.getAngleFromPoint=function(t,i){var e=i.x-t.x,s=i.y-t.y,n=Math.sqrt(e*e+s*s),o=2*Math.PI+Math.atan2(s,e);return 0>e&&0>s&&(o+=2*Math.PI),{angle:o,distance:n}},s.aliasPixel=function(t){return t%2===0?0:.5}),y=(s.splineCurve=function(t,i,e,s){var n=Math.sqrt(Math.pow(i.x-t.x,2)+Math.pow(i.y-t.y,2)),o=Math.sqrt(Math.pow(e.x-i.x,2)+Math.pow(e.y-i.y,2)),a=s*n/(n+o),h=s*o/(n+o);return{inner:{x:i.x-a*(e.x-t.x),y:i.y-a*(e.y-t.y)},outer:{x:i.x+h*(e.x-t.x),y:i.y+h*(e.y-t.y)}}},s.calculateOrderOfMagnitude=function(t){return Math.floor(Math.log(t)/Math.LN10)}),C=(s.calculateScaleRange=function(t,i,e,s,n){var o=2,a=Math.floor(i/(1.5*e)),h=o>=a,l=g(t),r=m(t);l===r&&(l+=.5,r>=.5&&!s?r-=.5:l+=.5);for(var c=Math.abs(l-r),u=y(c),d=Math.ceil(l/(1*Math.pow(10,u)))*Math.pow(10,u),p=s?0:Math.floor(r/(1*Math.pow(10,u)))*Math.pow(10,u),f=d-p,v=Math.pow(10,u),S=Math.round(f/v);(S>a||a>2*S)&&!h;)if(S>a)v*=2,S=Math.round(f/v),S%1!==0&&(h=!0);else if(n&&u>=0){if(v/2%1!==0)break;v/=2,S=Math.round(f/v)}else v/=2,S=Math.round(f/v);return h&&(S=o,v=f/S),{steps:S,stepValue:v,min:p,max:p+S*v}},s.template=function(t,i){function e(t,i){var e=/\W/.test(t)?new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+t.replace(/[\r\t\n]/g," ").split("<%").join(" ").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split(" ").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');"):s[t]=s[t];return i?e(i):e}if(t instanceof Function)return t(i);var s={};return e(t,i)}),w=(s.generateLabels=function(t,i,e,s){var o=new Array(i);return labelTemplateString&&n(o,function(i,n){o[n]=C(t,{value:e+s*(n+1)})}),o},s.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-0.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-0.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-0.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-0.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var i=1.70158,e=0,s=1;return 0===t?0:1==(t/=1)?1:(e||(e=.3),s<Math.abs(1)?(s=1,i=e/4):i=e/(2*Math.PI)*Math.asin(1/s),-(s*Math.pow(2,10*(t-=1))*Math.sin(2*(1*t-i)*Math.PI/e)))},easeOutElastic:function(t){var i=1.70158,e=0,s=1;return 0===t?0:1==(t/=1)?1:(e||(e=.3),s<Math.abs(1)?(s=1,i=e/4):i=e/(2*Math.PI)*Math.asin(1/s),s*Math.pow(2,-10*t)*Math.sin(2*(1*t-i)*Math.PI/e)+1)},easeInOutElastic:function(t){var i=1.70158,e=0,s=1;return 0===t?0:2==(t/=.5)?1:(e||(e=.3*1.5),s<Math.abs(1)?(s=1,i=e/4):i=e/(2*Math.PI)*Math.asin(1/s),1>t?-.5*s*Math.pow(2,10*(t-=1))*Math.sin(2*(1*t-i)*Math.PI/e):s*Math.pow(2,-10*(t-=1))*Math.sin(2*(1*t-i)*Math.PI/e)*.5+1)},easeInBack:function(t){var i=1.70158;return 1*(t/=1)*t*((i+1)*t-i)},easeOutBack:function(t){var i=1.70158;return 1*((t=t/1-1)*t*((i+1)*t+i)+1)},easeInOutBack:function(t){var i=1.70158;return(t/=.5)<1?.5*t*t*(((i*=1.525)+1)*t-i):.5*((t-=2)*t*(((i*=1.525)+1)*t+i)+2)},easeInBounce:function(t){return 1-w.easeOutBounce(1-t)},easeOutBounce:function(t){return(t/=1)<1/2.75?7.5625*t*t:2/2.75>t?1*(7.5625*(t-=1.5/2.75)*t+.75):2.5/2.75>t?1*(7.5625*(t-=2.25/2.75)*t+.9375):1*(7.5625*(t-=2.625/2.75)*t+.984375)},easeInOutBounce:function(t){return.5>t?.5*w.easeInBounce(2*t):.5*w.easeOutBounce(2*t-1)+.5}}),b=s.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)}}(),P=s.cancelAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||window.oCancelAnimationFrame||window.msCancelAnimationFrame||function(t){return window.clearTimeout(t,1e3/60)}}(),L=(s.animationLoop=function(t,i,e,s,n,o){var a=0,h=w[e]||w.linear,l=function(){a++;var e=a/i,r=h(e);t.call(o,r,e,a),s.call(o,r,e),i>a?o.animationFrame=b(l):n.apply(o)};b(l)},s.getRelativePosition=function(t){var i,e,s=t.originalEvent||t,n=t.currentTarget||t.srcElement,o=n.getBoundingClientRect();return s.touches?(i=s.touches[0].clientX-o.left,e=s.touches[0].clientY-o.top):(i=s.clientX-o.left,e=s.clientY-o.top),{x:i,y:e}},s.addEvent=function(t,i,e){t.addEventListener?t.addEventListener(i,e):t.attachEvent?t.attachEvent("on"+i,e):t["on"+i]=e}),k=s.removeEvent=function(t,i,e){t.removeEventListener?t.removeEventListener(i,e,!1):t.detachEvent?t.detachEvent("on"+i,e):t["on"+i]=c},F=(s.bindEvents=function(t,i,e){t.events||(t.events={}),n(i,function(i){t.events[i]=function(){e.apply(t,arguments)},L(t.chart.canvas,i,t.events[i])})},s.unbindEvents=function(t,i){n(i,function(i,e){k(t.chart.canvas,e,i)})}),R=s.getMaximumWidth=function(t){var i=t.parentNode;return i.clientWidth},T=s.getMaximumHeight=function(t){var i=t.parentNode;return i.clientHeight},A=(s.getMaximumSize=s.getMaximumWidth,s.retinaScale=function(t){var i=t.ctx,e=t.canvas.width,s=t.canvas.height;window.devicePixelRatio&&(i.canvas.style.width=e+"px",i.canvas.style.height=s+"px",i.canvas.height=s*window.devicePixelRatio,i.canvas.width=e*window.devicePixelRatio,i.scale(window.devicePixelRatio,window.devicePixelRatio))}),M=s.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},W=s.fontString=function(t,i,e){return i+" "+t+"px "+e},z=s.longestText=function(t,i,e){t.font=i;var s=0;return n(e,function(i){var e=t.measureText(i).width;s=e>s?e:s}),s},B=s.drawRoundedRectangle=function(t,i,e,s,n,o){t.beginPath(),t.moveTo(i+o,e),t.lineTo(i+s-o,e),t.quadraticCurveTo(i+s,e,i+s,e+o),t.lineTo(i+s,e+n-o),t.quadraticCurveTo(i+s,e+n,i+s-o,e+n),t.lineTo(i+o,e+n),t.quadraticCurveTo(i,e+n,i,e+n-o),t.lineTo(i,e+o),t.quadraticCurveTo(i,e,i+o,e),t.closePath()};e.instances={},e.Type=function(t,i,s){this.options=i,this.chart=s,this.id=u(),e.instances[this.id]=this,i.responsive&&this.resize(),this.initialize.call(this,t)},a(e.Type.prototype,{initialize:function(){return this},clear:function(){return M(this.chart),this},stop:function(){return P(this.animationFrame),this},resize:function(t){this.stop();var i=this.chart.canvas,e=R(this.chart.canvas),s=this.options.maintainAspectRatio?e/this.chart.aspectRatio:T(this.chart.canvas);return i.width=this.chart.width=e,i.height=this.chart.height=s,A(this.chart),"function"==typeof t&&t.apply(this,Array.prototype.slice.call(arguments,1)),this},reflow:c,render:function(t){return t&&this.reflow(),this.options.animation&&!t?s.animationLoop(this.draw,this.options.animationSteps,this.options.animationEasing,this.options.onAnimationProgress,this.options.onAnimationComplete,this):(this.draw(),this.options.onAnimationComplete.call(this)),this},generateLegend:function(){return C(this.options.legendTemplate,this)},destroy:function(){this.clear(),F(this,this.events);var t=this.chart.canvas;t.width=this.chart.width,t.height=this.chart.height,t.style.removeProperty?(t.style.removeProperty("width"),t.style.removeProperty("height")):(t.style.removeAttribute("width"),t.style.removeAttribute("height")),delete e.instances[this.id]},showTooltip:function(t,i){"undefined"==typeof this.activeElements&&(this.activeElements=[]);var o=function(t){var i=!1;return t.length!==this.activeElements.length?i=!0:(n(t,function(t,e){t!==this.activeElements[e]&&(i=!0)},this),i)}.call(this,t);if(o||i){if(this.activeElements=t,this.draw(),this.options.customTooltips&&this.options.customTooltips(!1),t.length>0)if(this.datasets&&this.datasets.length>1){for(var a,h,r=this.datasets.length-1;r>=0&&(a=this.datasets[r].points||this.datasets[r].bars||this.datasets[r].segments,h=l(a,t[0]),-1===h);r--);var c=[],u=[],d=function(){var t,i,e,n,o,a=[],l=[],r=[];return s.each(this.datasets,function(i){t=i.points||i.bars||i.segments,t[h]&&t[h].hasValue()&&a.push(t[h])}),s.each(a,function(t){l.push(t.x),r.push(t.y),c.push(s.template(this.options.multiTooltipTemplate,t)),u.push({fill:t._saved.fillColor||t.fillColor,stroke:t._saved.strokeColor||t.strokeColor})},this),o=m(r),e=g(r),n=m(l),i=g(l),{x:n>this.chart.width/2?n:i,y:(o+e)/2}}.call(this,h);new e.MultiTooltip({x:d.x,y:d.y,xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,xOffset:this.options.tooltipXOffset,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,titleTextColor:this.options.tooltipTitleFontColor,titleFontFamily:this.options.tooltipTitleFontFamily,titleFontStyle:this.options.tooltipTitleFontStyle,titleFontSize:this.options.tooltipTitleFontSize,cornerRadius:this.options.tooltipCornerRadius,labels:c,legendColors:u,legendColorBackground:this.options.multiTooltipKeyBackground,title:t[0].label,chart:this.chart,ctx:this.chart.ctx,custom:this.options.customTooltips}).draw()}else n(t,function(t){var i=t.tooltipPosition();new e.Tooltip({x:Math.round(i.x),y:Math.round(i.y),xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,caretHeight:this.options.tooltipCaretSize,cornerRadius:this.options.tooltipCornerRadius,text:C(this.options.tooltipTemplate,t),chart:this.chart,custom:this.options.customTooltips}).draw()},this);return this}},toBase64Image:function(){return this.chart.canvas.toDataURL.apply(this.chart.canvas,arguments)}}),e.Type.extend=function(t){var i=this,s=function(){return i.apply(this,arguments)};if(s.prototype=o(i.prototype),a(s.prototype,t),s.extend=e.Type.extend,t.name||i.prototype.name){var n=t.name||i.prototype.name,l=e.defaults[i.prototype.name]?o(e.defaults[i.prototype.name]):{};e.defaults[n]=a(l,t.defaults),e.types[n]=s,e.prototype[n]=function(t,i){var o=h(e.defaults.global,e.defaults[n],i||{});return new s(t,o,this)}}else d("Name not provided for this chart, so it hasn't been registered");return i},e.Element=function(t){a(this,t),this.initialize.apply(this,arguments),this.save()},a(e.Element.prototype,{initialize:function(){},restore:function(t){return t?n(t,function(t){this[t]=this._saved[t]},this):a(this,this._saved),this},save:function(){return this._saved=o(this),delete this._saved._saved,this},update:function(t){return n(t,function(t,i){this._saved[i]=this[i],this[i]=t},this),this},transition:function(t,i){return n(t,function(t,e){this[e]=(t-this._saved[e])*i+this._saved[e]},this),this},tooltipPosition:function(){return{x:this.x,y:this.y}},hasValue:function(){return f(this.value)}}),e.Element.extend=r,e.Point=e.Element.extend({display:!0,inRange:function(t,i){var e=this.hitDetectionRadius+this.radius;return Math.pow(t-this.x,2)+Math.pow(i-this.y,2)<Math.pow(e,2)},draw:function(){if(this.display){var t=this.ctx;t.beginPath(),t.arc(this.x,this.y,this.radius,0,2*Math.PI),t.closePath(),t.strokeStyle=this.strokeColor,t.lineWidth=this.strokeWidth,t.fillStyle=this.fillColor,t.fill(),t.stroke()}}}),e.Arc=e.Element.extend({inRange:function(t,i){var e=s.getAngleFromPoint(this,{x:t,y:i}),n=e.angle>=this.startAngle&&e.angle<=this.endAngle,o=e.distance>=this.innerRadius&&e.distance<=this.outerRadius;return n&&o},tooltipPosition:function(){var t=this.startAngle+(this.endAngle-this.startAngle)/2,i=(this.outerRadius-this.innerRadius)/2+this.innerRadius;return{x:this.x+Math.cos(t)*i,y:this.y+Math.sin(t)*i}},draw:function(t){var i=this.ctx;i.beginPath(),i.arc(this.x,this.y,this.outerRadius,this.startAngle,this.endAngle),i.arc(this.x,this.y,this.innerRadius,this.endAngle,this.startAngle,!0),i.closePath(),i.strokeStyle=this.strokeColor,i.lineWidth=this.strokeWidth,i.fillStyle=this.fillColor,i.fill(),i.lineJoin="bevel",this.showStroke&&i.stroke()}}),e.Rectangle=e.Element.extend({draw:function(){var t=this.ctx,i=this.width/2,e=this.x-i,s=this.x+i,n=this.base-(this.base-this.y),o=this.strokeWidth/2;this.showStroke&&(e+=o,s-=o,n+=o),t.beginPath(),t.fillStyle=this.fillColor,t.strokeStyle=this.strokeColor,t.lineWidth=this.strokeWidth,t.moveTo(e,this.base),t.lineTo(e,n),t.lineTo(s,n),t.lineTo(s,this.base),t.fill(),this.showStroke&&t.stroke()},height:function(){return this.base-this.y},inRange:function(t,i){return t>=this.x-this.width/2&&t<=this.x+this.width/2&&i>=this.y&&i<=this.base}}),e.Tooltip=e.Element.extend({draw:function(){var t=this.chart.ctx;t.font=W(this.fontSize,this.fontStyle,this.fontFamily),this.xAlign="center",this.yAlign="above";var i=this.caretPadding=2,e=t.measureText(this.text).width+2*this.xPadding,s=this.fontSize+2*this.yPadding,n=s+this.caretHeight+i;this.x+e/2>this.chart.width?this.xAlign="left":this.x-e/2<0&&(this.xAlign="right"),this.y-n<0&&(this.yAlign="below");var o=this.x-e/2,a=this.y-n;if(t.fillStyle=this.fillColor,this.custom)this.custom(this);else{switch(this.yAlign){case"above":t.beginPath(),t.moveTo(this.x,this.y-i),t.lineTo(this.x+this.caretHeight,this.y-(i+this.caretHeight)),t.lineTo(this.x-this.caretHeight,this.y-(i+this.caretHeight)),t.closePath(),t.fill();break;case"below":a=this.y+i+this.caretHeight,t.beginPath(),t.moveTo(this.x,this.y+i),t.lineTo(this.x+this.caretHeight,this.y+i+this.caretHeight),t.lineTo(this.x-this.caretHeight,this.y+i+this.caretHeight),t.closePath(),t.fill()}switch(this.xAlign){case"left":o=this.x-e+(this.cornerRadius+this.caretHeight);break;case"right":o=this.x-(this.cornerRadius+this.caretHeight)}B(t,o,a,e,s,this.cornerRadius),t.fill(),t.fillStyle=this.textColor,t.textAlign="center",t.textBaseline="middle",t.fillText(this.text,o+e/2,a+s/2)}}}),e.MultiTooltip=e.Element.extend({initialize:function(){this.font=W(this.fontSize,this.fontStyle,this.fontFamily),this.titleFont=W(this.titleFontSize,this.titleFontStyle,this.titleFontFamily),this.height=this.labels.length*this.fontSize+(this.labels.length-1)*(this.fontSize/2)+2*this.yPadding+1.5*this.titleFontSize,this.ctx.font=this.titleFont;var t=this.ctx.measureText(this.title).width,i=z(this.ctx,this.font,this.labels)+this.fontSize+3,e=g([i,t]);this.width=e+2*this.xPadding;var s=this.height/2;this.y-s<0?this.y=s:this.y+s>this.chart.height&&(this.y=this.chart.height-s),this.x>this.chart.width/2?this.x-=this.xOffset+this.width:this.x+=this.xOffset},getLineHeight:function(t){var i=this.y-this.height/2+this.yPadding,e=t-1;return 0===t?i+this.titleFontSize/2:i+(1.5*this.fontSize*e+this.fontSize/2)+1.5*this.titleFontSize},draw:function(){if(this.custom)this.custom(this);else{B(this.ctx,this.x,this.y-this.height/2,this.width,this.height,this.cornerRadius);var t=this.ctx;t.fillStyle=this.fillColor,t.fill(),t.closePath(),t.textAlign="left",t.textBaseline="middle",t.fillStyle=this.titleTextColor,t.font=this.titleFont,t.fillText(this.title,this.x+this.xPadding,this.getLineHeight(0)),t.font=this.font,s.each(this.labels,function(i,e){t.fillStyle=this.textColor,t.fillText(i,this.x+this.xPadding+this.fontSize+3,this.getLineHeight(e+1)),t.fillStyle=this.legendColorBackground,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize),t.fillStyle=this.legendColors[e].fill,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize)},this)}}}),e.Scale=e.Element.extend({initialize:function(){this.fit()},buildYLabels:function(){this.yLabels=[];for(var t=v(this.stepValue),i=0;i<=this.steps;i++)this.yLabels.push(C(this.templateString,{value:(this.min+i*this.stepValue).toFixed(t)}));this.yLabelWidth=this.display&&this.showLabels?z(this.ctx,this.font,this.yLabels):0},addXLabel:function(t){this.xLabels.push(t),this.valuesCount++,this.fit()},removeXLabel:function(){this.xLabels.shift(),this.valuesCount--,this.fit()},fit:function(){this.startPoint=this.display?this.fontSize:0,this.endPoint=this.display?this.height-1.5*this.fontSize-5:this.height,this.startPoint+=this.padding,this.endPoint-=this.padding;var t,i=this.endPoint-this.startPoint;for(this.calculateYRange(i),this.buildYLabels(),this.calculateXLabelRotation();i>this.endPoint-this.startPoint;)i=this.endPoint-this.startPoint,t=this.yLabelWidth,this.calculateYRange(i),this.buildYLabels(),t<this.yLabelWidth&&this.calculateXLabelRotation()},calculateXLabelRotation:function(){this.ctx.font=this.font;var t,i,e=this.ctx.measureText(this.xLabels[0]).width,s=this.ctx.measureText(this.xLabels[this.xLabels.length-1]).width;if(this.xScalePaddingRight=s/2+3,this.xScalePaddingLeft=e/2>this.yLabelWidth+10?e/2:this.yLabelWidth+10,this.xLabelRotation=0,this.display){var n,o=z(this.ctx,this.font,this.xLabels);this.xLabelWidth=o;for(var a=Math.floor(this.calculateX(1)-this.calculateX(0))-6;this.xLabelWidth>a&&0===this.xLabelRotation||this.xLabelWidth>a&&this.xLabelRotation<=90&&this.xLabelRotation>0;)n=Math.cos(S(this.xLabelRotation)),t=n*e,i=n*s,t+this.fontSize/2>this.yLabelWidth+8&&(this.xScalePaddingLeft=t+this.fontSize/2),this.xScalePaddingRight=this.fontSize/2,this.xLabelRotation++,this.xLabelWidth=n*o;this.xLabelRotation>0&&(this.endPoint-=Math.sin(S(this.xLabelRotation))*o+3)}else this.xLabelWidth=0,this.xScalePaddingRight=this.padding,this.xScalePaddingLeft=this.padding},calculateYRange:c,drawingArea:function(){return this.startPoint-this.endPoint},calculateY:function(t){var i=this.drawingArea()/(this.min-this.max);return this.endPoint-i*(t-this.min)},calculateX:function(t){var i=(this.xLabelRotation>0,this.width-(this.xScalePaddingLeft+this.xScalePaddingRight)),e=i/Math.max(this.valuesCount-(this.offsetGridLines?0:1),1),s=e*t+this.xScalePaddingLeft;return this.offsetGridLines&&(s+=e/2),Math.round(s)},update:function(t){s.extend(this,t),this.fit()},draw:function(){var t=this.ctx,i=(this.endPoint-this.startPoint)/this.steps,e=Math.round(this.xScalePaddingLeft);this.display&&(t.fillStyle=this.textColor,t.font=this.font,n(this.yLabels,function(n,o){var a=this.endPoint-i*o,h=Math.round(a),l=this.showHorizontalLines;t.textAlign="right",t.textBaseline="middle",this.showLabels&&t.fillText(n,e-10,a),0!==o||l||(l=!0),l&&t.beginPath(),o>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),h+=s.aliasPixel(t.lineWidth),l&&(t.moveTo(e,h),t.lineTo(this.width,h),t.stroke(),t.closePath()),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(e-5,h),t.lineTo(e,h),t.stroke(),t.closePath()},this),n(this.xLabels,function(i,e){var s=this.calculateX(e)+x(this.lineWidth),n=this.calculateX(e-(this.offsetGridLines?.5:0))+x(this.lineWidth),o=this.xLabelRotation>0,a=this.showVerticalLines;0!==e||a||(a=!0),a&&t.beginPath(),e>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),a&&(t.moveTo(n,this.endPoint),t.lineTo(n,this.startPoint-3),t.stroke(),t.closePath()),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(n,this.endPoint),t.lineTo(n,this.endPoint+5),t.stroke(),t.closePath(),t.save(),t.translate(s,o?this.endPoint+12:this.endPoint+8),t.rotate(-1*S(this.xLabelRotation)),t.font=this.font,t.textAlign=o?"right":"center",t.textBaseline=o?"middle":"top",t.fillText(i,0,0),t.restore()},this))}}),e.RadialScale=e.Element.extend({initialize:function(){this.size=m([this.height,this.width]),this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2},calculateCenterOffset:function(t){var i=this.drawingArea/(this.max-this.min);return(t-this.min)*i},update:function(){this.lineArc?this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2:this.setScaleSize(),this.buildYLabels()},buildYLabels:function(){this.yLabels=[];for(var t=v(this.stepValue),i=0;i<=this.steps;i++)this.yLabels.push(C(this.templateString,{value:(this.min+i*this.stepValue).toFixed(t)}))},getCircumference:function(){return 2*Math.PI/this.valuesCount},setScaleSize:function(){var t,i,e,s,n,o,a,h,l,r,c,u,d=m([this.height/2-this.pointLabelFontSize-5,this.width/2]),p=this.width,g=0;for(this.ctx.font=W(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),i=0;i<this.valuesCount;i++)t=this.getPointPosition(i,d),e=this.ctx.measureText(C(this.templateString,{value:this.labels[i]})).width+5,0===i||i===this.valuesCount/2?(s=e/2,t.x+s>p&&(p=t.x+s,n=i),t.x-s<g&&(g=t.x-s,a=i)):i<this.valuesCount/2?t.x+e>p&&(p=t.x+e,n=i):i>this.valuesCount/2&&t.x-e<g&&(g=t.x-e,a=i);l=g,r=Math.ceil(p-this.width),o=this.getIndexAngle(n),h=this.getIndexAngle(a),c=r/Math.sin(o+Math.PI/2),u=l/Math.sin(h+Math.PI/2),c=f(c)?c:0,u=f(u)?u:0,this.drawingArea=d-(u+c)/2,this.setCenterPoint(u,c)},setCenterPoint:function(t,i){var e=this.width-i-this.drawingArea,s=t+this.drawingArea;this.xCenter=(s+e)/2,this.yCenter=this.height/2},getIndexAngle:function(t){var i=2*Math.PI/this.valuesCount;return t*i-Math.PI/2},getPointPosition:function(t,i){var e=this.getIndexAngle(t);return{x:Math.cos(e)*i+this.xCenter,y:Math.sin(e)*i+this.yCenter}},draw:function(){if(this.display){var t=this.ctx;if(n(this.yLabels,function(i,e){if(e>0){var s,n=e*(this.drawingArea/this.steps),o=this.yCenter-n;if(this.lineWidth>0)if(t.strokeStyle=this.lineColor,t.lineWidth=this.lineWidth,this.lineArc)t.beginPath(),t.arc(this.xCenter,this.yCenter,n,0,2*Math.PI),t.closePath(),t.stroke();else{t.beginPath();for(var a=0;a<this.valuesCount;a++)s=this.getPointPosition(a,this.calculateCenterOffset(this.min+e*this.stepValue)),0===a?t.moveTo(s.x,s.y):t.lineTo(s.x,s.y);t.closePath(),t.stroke()}if(this.showLabels){if(t.font=W(this.fontSize,this.fontStyle,this.fontFamily),this.showLabelBackdrop){var h=t.measureText(i).width;t.fillStyle=this.backdropColor,t.fillRect(this.xCenter-h/2-this.backdropPaddingX,o-this.fontSize/2-this.backdropPaddingY,h+2*this.backdropPaddingX,this.fontSize+2*this.backdropPaddingY)}t.textAlign="center",t.textBaseline="middle",t.fillStyle=this.fontColor,t.fillText(i,this.xCenter,o)}}},this),!this.lineArc){t.lineWidth=this.angleLineWidth,t.strokeStyle=this.angleLineColor;for(var i=this.valuesCount-1;i>=0;i--){if(this.angleLineWidth>0){var e=this.getPointPosition(i,this.calculateCenterOffset(this.max));t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(e.x,e.y),t.stroke(),t.closePath()}var s=this.getPointPosition(i,this.calculateCenterOffset(this.max)+5);t.font=W(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),t.fillStyle=this.pointLabelFontColor;var o=this.labels.length,a=this.labels.length/2,h=a/2,l=h>i||i>o-h,r=i===h||i===o-h;t.textAlign=0===i?"center":i===a?"center":a>i?"left":"right",t.textBaseline=r?"middle":l?"bottom":"top",t.fillText(this.labels[i],s.x,s.y)}}}}}),s.addEvent(window,"resize",function(){var t;return function(){clearTimeout(t),t=setTimeout(function(){n(e.instances,function(t){t.options.responsive&&t.resize(t.render,!0)})},50)}}()),p?define(function(){return e}):"object"==typeof module&&module.exports&&(module.exports=e),t.Chart=e,e.noConflict=function(){return t.Chart=i,e}}).call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleBeginAtZero:!0,scaleShowGridLines:!0,scaleGridLineColor:"rgba(0,0,0,.05)",scaleGridLineWidth:1,scaleShowHorizontalLines:!0,scaleShowVerticalLines:!0,barShowStroke:!0,barStrokeWidth:2,barValueSpacing:5,barDatasetSpacing:1,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<datasets.length; i++){%><li><span style="background-color:<%=datasets[i].fillColor%>"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>'};i.Type.extend({name:"Bar",defaults:s,initialize:function(t){var s=this.options;this.ScaleClass=i.Scale.extend({offsetGridLines:!0,calculateBarX:function(t,i,e){var n=this.calculateBaseWidth(),o=this.calculateX(e)-n/2,a=this.calculateBarWidth(t);return o+a*i+i*s.barDatasetSpacing+a/2},calculateBaseWidth:function(){return this.calculateX(1)-this.calculateX(0)-2*s.barValueSpacing},calculateBarWidth:function(t){var i=this.calculateBaseWidth()-(t-1)*s.barDatasetSpacing;return i/t}}),this.datasets=[],this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getBarsAtEvent(t):[];this.eachBars(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),this.BarClass=i.Rectangle.extend({strokeWidth:this.options.barStrokeWidth,showStroke:this.options.barShowStroke,ctx:this.chart.ctx}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,bars:[]};this.datasets.push(s),e.each(i.data,function(e,n){s.bars.push(new this.BarClass({value:e,label:t.labels[n],datasetLabel:i.label,strokeColor:i.strokeColor,fillColor:i.fillColor,highlightFill:i.highlightFill||i.fillColor,highlightStroke:i.highlightStroke||i.strokeColor}))},this)},this),this.buildScale(t.labels),this.BarClass.prototype.base=this.scale.endPoint,this.eachBars(function(t,i,s){e.extend(t,{width:this.scale.calculateBarWidth(this.datasets.length),x:this.scale.calculateBarX(this.datasets.length,s,i),y:this.scale.endPoint}),t.save()},this),this.render()},update:function(){this.scale.update(),e.each(this.activeElements,function(t){t.restore(["fillColor","strokeColor"])}),this.eachBars(function(t){t.save()}),this.render()},eachBars:function(t){e.each(this.datasets,function(i,s){e.each(i.bars,t,this,s)},this)},getBarsAtEvent:function(t){for(var i,s=[],n=e.getRelativePosition(t),o=function(t){s.push(t.bars[i])},a=0;a<this.datasets.length;a++)for(i=0;i<this.datasets[a].bars.length;i++)if(this.datasets[a].bars[i].inRange(n.x,n.y))return e.each(this.datasets,o),s;return s},buildScale:function(t){var i=this,s=function(){var t=[];return i.eachBars(function(i){t.push(i.value)}),t},n={templateString:this.options.scaleLabel,height:this.chart.height,width:this.chart.width,ctx:this.chart.ctx,textColor:this.options.scaleFontColor,fontSize:this.options.scaleFontSize,fontStyle:this.options.scaleFontStyle,fontFamily:this.options.scaleFontFamily,valuesCount:t.length,beginAtZero:this.options.scaleBeginAtZero,integersOnly:this.options.scaleIntegersOnly,calculateYRange:function(t){var i=e.calculateScaleRange(s(),t,this.fontSize,this.beginAtZero,this.integersOnly);e.extend(this,i)},xLabels:t,font:e.fontString(this.options.scaleFontSize,this.options.scaleFontStyle,this.options.scaleFontFamily),lineWidth:this.options.scaleLineWidth,lineColor:this.options.scaleLineColor,showHorizontalLines:this.options.scaleShowHorizontalLines,showVerticalLines:this.options.scaleShowVerticalLines,gridLineWidth:this.options.scaleShowGridLines?this.options.scaleGridLineWidth:0,gridLineColor:this.options.scaleShowGridLines?this.options.scaleGridLineColor:"rgba(0,0,0,0)",padding:this.options.showScale?0:this.options.barShowStroke?this.options.barStrokeWidth:0,showLabels:this.options.scaleShowLabels,display:this.options.showScale};this.options.scaleOverride&&e.extend(n,{calculateYRange:e.noop,steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}),this.scale=new this.ScaleClass(n)},addData:function(t,i){e.each(t,function(t,e){this.datasets[e].bars.push(new this.BarClass({value:t,label:i,x:this.scale.calculateBarX(this.datasets.length,e,this.scale.valuesCount+1),y:this.scale.endPoint,width:this.scale.calculateBarWidth(this.datasets.length),base:this.scale.endPoint,strokeColor:this.datasets[e].strokeColor,fillColor:this.datasets[e].fillColor})) +},this),this.scale.addXLabel(i),this.update()},removeData:function(){this.scale.removeXLabel(),e.each(this.datasets,function(t){t.bars.shift()},this),this.update()},reflow:function(){e.extend(this.BarClass.prototype,{y:this.scale.endPoint,base:this.scale.endPoint});var t=e.extend({height:this.chart.height,width:this.chart.width});this.scale.update(t)},draw:function(t){var i=t||1;this.clear();this.chart.ctx;this.scale.draw(i),e.each(this.datasets,function(t,s){e.each(t.bars,function(t,e){t.hasValue()&&(t.base=this.scale.endPoint,t.transition({x:this.scale.calculateBarX(this.datasets.length,s,e),y:this.scale.calculateY(t.value),width:this.scale.calculateBarWidth(this.datasets.length)},i).draw())},this)},this)}})}.call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={segmentShowStroke:!0,segmentStrokeColor:"#fff",segmentStrokeWidth:2,percentageInnerCutout:50,animationSteps:100,animationEasing:"easeOutBounce",animateRotate:!0,animateScale:!1,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<segments.length; i++){%><li><span style="background-color:<%=segments[i].fillColor%>"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>'};i.Type.extend({name:"Doughnut",defaults:s,initialize:function(t){this.segments=[],this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,this.SegmentArc=i.Arc.extend({ctx:this.chart.ctx,x:this.chart.width/2,y:this.chart.height/2}),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(i,function(t){t.fillColor=t.highlightColor}),this.showTooltip(i)}),this.calculateTotal(t),e.each(t,function(t,i){this.addData(t,i,!0)},this),this.render()},getSegmentsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(s.x,s.y)&&i.push(t)},this),i},addData:function(t,i,e){var s=i||this.segments.length;this.segments.splice(s,0,new this.SegmentArc({value:t.value,outerRadius:this.options.animateScale?0:this.outerRadius,innerRadius:this.options.animateScale?0:this.outerRadius/100*this.options.percentageInnerCutout,fillColor:t.color,highlightColor:t.highlight||t.color,showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,startAngle:1.5*Math.PI,circumference:this.options.animateRotate?0:this.calculateCircumference(t.value),label:t.label})),e||(this.reflow(),this.update())},calculateCircumference:function(t){return 2*Math.PI*(Math.abs(t)/this.total)},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=Math.abs(t.value)},this)},update:function(){this.calculateTotal(this.segments),e.each(this.activeElements,function(t){t.restore(["fillColor"])}),e.each(this.segments,function(t){t.save()}),this.render()},removeData:function(t){var i=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(i,1),this.reflow(),this.update()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,e.each(this.segments,function(t){t.update({outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout})},this)},draw:function(t){var i=t?t:1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.calculateCircumference(t.value),outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout},i),t.endAngle=t.startAngle+t.circumference,t.draw(),0===e&&(t.startAngle=1.5*Math.PI),e<this.segments.length-1&&(this.segments[e+1].startAngle=t.endAngle)},this)}}),i.types.Doughnut.extend({name:"Pie",defaults:e.merge(s,{percentageInnerCutout:0})})}.call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleShowGridLines:!0,scaleGridLineColor:"rgba(0,0,0,.05)",scaleGridLineWidth:1,scaleShowHorizontalLines:!0,scaleShowVerticalLines:!0,bezierCurve:!0,bezierCurveTension:.4,pointDot:!0,pointDotRadius:4,pointDotStrokeWidth:1,pointHitDetectionRadius:20,datasetStroke:!0,datasetStrokeWidth:2,datasetFill:!0,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<datasets.length; i++){%><li><span style="background-color:<%=datasets[i].strokeColor%>"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>'};i.Type.extend({name:"Line",defaults:s,initialize:function(t){this.PointClass=i.Point.extend({strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx,inRange:function(t){return Math.pow(t-this.x,2)<Math.pow(this.radius+this.hitDetectionRadius,2)}}),this.datasets=[],this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getPointsAtEvent(t):[];this.eachPoints(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,pointColor:i.pointColor,pointStrokeColor:i.pointStrokeColor,points:[]};this.datasets.push(s),e.each(i.data,function(e,n){s.points.push(new this.PointClass({value:e,label:t.labels[n],datasetLabel:i.label,strokeColor:i.pointStrokeColor,fillColor:i.pointColor,highlightFill:i.pointHighlightFill||i.pointColor,highlightStroke:i.pointHighlightStroke||i.pointStrokeColor}))},this),this.buildScale(t.labels),this.eachPoints(function(t,i){e.extend(t,{x:this.scale.calculateX(i),y:this.scale.endPoint}),t.save()},this)},this),this.render()},update:function(){this.scale.update(),e.each(this.activeElements,function(t){t.restore(["fillColor","strokeColor"])}),this.eachPoints(function(t){t.save()}),this.render()},eachPoints:function(t){e.each(this.datasets,function(i){e.each(i.points,t,this)},this)},getPointsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.datasets,function(t){e.each(t.points,function(t){t.inRange(s.x,s.y)&&i.push(t)})},this),i},buildScale:function(t){var s=this,n=function(){var t=[];return s.eachPoints(function(i){t.push(i.value)}),t},o={templateString:this.options.scaleLabel,height:this.chart.height,width:this.chart.width,ctx:this.chart.ctx,textColor:this.options.scaleFontColor,fontSize:this.options.scaleFontSize,fontStyle:this.options.scaleFontStyle,fontFamily:this.options.scaleFontFamily,valuesCount:t.length,beginAtZero:this.options.scaleBeginAtZero,integersOnly:this.options.scaleIntegersOnly,calculateYRange:function(t){var i=e.calculateScaleRange(n(),t,this.fontSize,this.beginAtZero,this.integersOnly);e.extend(this,i)},xLabels:t,font:e.fontString(this.options.scaleFontSize,this.options.scaleFontStyle,this.options.scaleFontFamily),lineWidth:this.options.scaleLineWidth,lineColor:this.options.scaleLineColor,showHorizontalLines:this.options.scaleShowHorizontalLines,showVerticalLines:this.options.scaleShowVerticalLines,gridLineWidth:this.options.scaleShowGridLines?this.options.scaleGridLineWidth:0,gridLineColor:this.options.scaleShowGridLines?this.options.scaleGridLineColor:"rgba(0,0,0,0)",padding:this.options.showScale?0:this.options.pointDotRadius+this.options.pointDotStrokeWidth,showLabels:this.options.scaleShowLabels,display:this.options.showScale};this.options.scaleOverride&&e.extend(o,{calculateYRange:e.noop,steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}),this.scale=new i.Scale(o)},addData:function(t,i){e.each(t,function(t,e){this.datasets[e].points.push(new this.PointClass({value:t,label:i,x:this.scale.calculateX(this.scale.valuesCount+1),y:this.scale.endPoint,strokeColor:this.datasets[e].pointStrokeColor,fillColor:this.datasets[e].pointColor}))},this),this.scale.addXLabel(i),this.update()},removeData:function(){this.scale.removeXLabel(),e.each(this.datasets,function(t){t.points.shift()},this),this.update()},reflow:function(){var t=e.extend({height:this.chart.height,width:this.chart.width});this.scale.update(t)},draw:function(t){var i=t||1;this.clear();var s=this.chart.ctx,n=function(t){return null!==t.value},o=function(t,i,s){return e.findNextWhere(i,n,s)||t},a=function(t,i,s){return e.findPreviousWhere(i,n,s)||t};this.scale.draw(i),e.each(this.datasets,function(t){var h=e.where(t.points,n);e.each(t.points,function(t,e){t.hasValue()&&t.transition({y:this.scale.calculateY(t.value),x:this.scale.calculateX(e)},i)},this),this.options.bezierCurve&&e.each(h,function(t,i){var s=i>0&&i<h.length-1?this.options.bezierCurveTension:0;t.controlPoints=e.splineCurve(a(t,h,i),t,o(t,h,i),s),t.controlPoints.outer.y>this.scale.endPoint?t.controlPoints.outer.y=this.scale.endPoint:t.controlPoints.outer.y<this.scale.startPoint&&(t.controlPoints.outer.y=this.scale.startPoint),t.controlPoints.inner.y>this.scale.endPoint?t.controlPoints.inner.y=this.scale.endPoint:t.controlPoints.inner.y<this.scale.startPoint&&(t.controlPoints.inner.y=this.scale.startPoint)},this),s.lineWidth=this.options.datasetStrokeWidth,s.strokeStyle=t.strokeColor,s.beginPath(),e.each(h,function(t,i){if(0===i)s.moveTo(t.x,t.y);else if(this.options.bezierCurve){var e=a(t,h,i);s.bezierCurveTo(e.controlPoints.outer.x,e.controlPoints.outer.y,t.controlPoints.inner.x,t.controlPoints.inner.y,t.x,t.y)}else s.lineTo(t.x,t.y)},this),s.stroke(),this.options.datasetFill&&h.length>0&&(s.lineTo(h[h.length-1].x,this.scale.endPoint),s.lineTo(h[0].x,this.scale.endPoint),s.fillStyle=t.fillColor,s.closePath(),s.fill()),e.each(h,function(t){t.draw()})},this)}})}.call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleShowLabelBackdrop:!0,scaleBackdropColor:"rgba(255,255,255,0.75)",scaleBeginAtZero:!0,scaleBackdropPaddingY:2,scaleBackdropPaddingX:2,scaleShowLine:!0,segmentShowStroke:!0,segmentStrokeColor:"#fff",segmentStrokeWidth:2,animationSteps:100,animationEasing:"easeOutBounce",animateRotate:!0,animateScale:!1,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<segments.length; i++){%><li><span style="background-color:<%=segments[i].fillColor%>"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>'};i.Type.extend({name:"PolarArea",defaults:s,initialize:function(t){this.segments=[],this.SegmentArc=i.Arc.extend({showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,ctx:this.chart.ctx,innerRadius:0,x:this.chart.width/2,y:this.chart.height/2}),this.scale=new i.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,lineArc:!0,width:this.chart.width,height:this.chart.height,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,valuesCount:t.length}),this.updateScaleRange(t),this.scale.update(),e.each(t,function(t,i){this.addData(t,i,!0)},this),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(i,function(t){t.fillColor=t.highlightColor}),this.showTooltip(i)}),this.render()},getSegmentsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(s.x,s.y)&&i.push(t)},this),i},addData:function(t,i,e){var s=i||this.segments.length;this.segments.splice(s,0,new this.SegmentArc({fillColor:t.color,highlightColor:t.highlight||t.color,label:t.label,value:t.value,outerRadius:this.options.animateScale?0:this.scale.calculateCenterOffset(t.value),circumference:this.options.animateRotate?0:this.scale.getCircumference(),startAngle:1.5*Math.PI})),e||(this.reflow(),this.update())},removeData:function(t){var i=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(i,1),this.reflow(),this.update()},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=t.value},this),this.scale.valuesCount=this.segments.length},updateScaleRange:function(t){var i=[];e.each(t,function(t){i.push(t.value)});var s=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(i,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,s,{size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2})},update:function(){this.calculateTotal(this.segments),e.each(this.segments,function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.updateScaleRange(this.segments),this.scale.update(),e.extend(this.scale,{xCenter:this.chart.width/2,yCenter:this.chart.height/2}),e.each(this.segments,function(t){t.update({outerRadius:this.scale.calculateCenterOffset(t.value)})},this)},draw:function(t){var i=t||1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.scale.getCircumference(),outerRadius:this.scale.calculateCenterOffset(t.value)},i),t.endAngle=t.startAngle+t.circumference,0===e&&(t.startAngle=1.5*Math.PI),e<this.segments.length-1&&(this.segments[e+1].startAngle=t.endAngle),t.draw()},this),this.scale.draw()}})}.call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers;i.Type.extend({name:"Radar",defaults:{scaleShowLine:!0,angleShowLineOut:!0,scaleShowLabels:!1,scaleBeginAtZero:!0,angleLineColor:"rgba(0,0,0,.1)",angleLineWidth:1,pointLabelFontFamily:"'Arial'",pointLabelFontStyle:"normal",pointLabelFontSize:10,pointLabelFontColor:"#666",pointDot:!0,pointDotRadius:3,pointDotStrokeWidth:1,pointHitDetectionRadius:20,datasetStroke:!0,datasetStrokeWidth:2,datasetFill:!0,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<datasets.length; i++){%><li><span style="background-color:<%=datasets[i].strokeColor%>"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>'},initialize:function(t){this.PointClass=i.Point.extend({strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx}),this.datasets=[],this.buildScale(t),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getPointsAtEvent(t):[];this.eachPoints(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,pointColor:i.pointColor,pointStrokeColor:i.pointStrokeColor,points:[]};this.datasets.push(s),e.each(i.data,function(e,n){var o;this.scale.animation||(o=this.scale.getPointPosition(n,this.scale.calculateCenterOffset(e))),s.points.push(new this.PointClass({value:e,label:t.labels[n],datasetLabel:i.label,x:this.options.animation?this.scale.xCenter:o.x,y:this.options.animation?this.scale.yCenter:o.y,strokeColor:i.pointStrokeColor,fillColor:i.pointColor,highlightFill:i.pointHighlightFill||i.pointColor,highlightStroke:i.pointHighlightStroke||i.pointStrokeColor}))},this)},this),this.render()},eachPoints:function(t){e.each(this.datasets,function(i){e.each(i.points,t,this)},this)},getPointsAtEvent:function(t){var i=e.getRelativePosition(t),s=e.getAngleFromPoint({x:this.scale.xCenter,y:this.scale.yCenter},i),n=2*Math.PI/this.scale.valuesCount,o=Math.round((s.angle-1.5*Math.PI)/n),a=[];return(o>=this.scale.valuesCount||0>o)&&(o=0),s.distance<=this.scale.drawingArea&&e.each(this.datasets,function(t){a.push(t.points[o])}),a},buildScale:function(t){this.scale=new i.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,angleLineColor:this.options.angleLineColor,angleLineWidth:this.options.angleShowLineOut?this.options.angleLineWidth:0,pointLabelFontColor:this.options.pointLabelFontColor,pointLabelFontSize:this.options.pointLabelFontSize,pointLabelFontFamily:this.options.pointLabelFontFamily,pointLabelFontStyle:this.options.pointLabelFontStyle,height:this.chart.height,width:this.chart.width,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,labels:t.labels,valuesCount:t.datasets[0].data.length}),this.scale.setScaleSize(),this.updateScaleRange(t.datasets),this.scale.buildYLabels()},updateScaleRange:function(t){var i=function(){var i=[];return e.each(t,function(t){t.data?i=i.concat(t.data):e.each(t.points,function(t){i.push(t.value)})}),i}(),s=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(i,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,s)},addData:function(t,i){this.scale.valuesCount++,e.each(t,function(t,e){var s=this.scale.getPointPosition(this.scale.valuesCount,this.scale.calculateCenterOffset(t));this.datasets[e].points.push(new this.PointClass({value:t,label:i,x:s.x,y:s.y,strokeColor:this.datasets[e].pointStrokeColor,fillColor:this.datasets[e].pointColor}))},this),this.scale.labels.push(i),this.reflow(),this.update()},removeData:function(){this.scale.valuesCount--,this.scale.labels.shift(),e.each(this.datasets,function(t){t.points.shift()},this),this.reflow(),this.update()},update:function(){this.eachPoints(function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.scale,{width:this.chart.width,height:this.chart.height,size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2}),this.updateScaleRange(this.datasets),this.scale.setScaleSize(),this.scale.buildYLabels()},draw:function(t){var i=t||1,s=this.chart.ctx;this.clear(),this.scale.draw(),e.each(this.datasets,function(t){e.each(t.points,function(t,e){t.hasValue()&&t.transition(this.scale.getPointPosition(e,this.scale.calculateCenterOffset(t.value)),i)},this),s.lineWidth=this.options.datasetStrokeWidth,s.strokeStyle=t.strokeColor,s.beginPath(),e.each(t.points,function(t,i){0===i?s.moveTo(t.x,t.y):s.lineTo(t.x,t.y)},this),s.closePath(),s.stroke(),s.fillStyle=t.fillColor,s.fill(),e.each(t.points,function(t){t.hasValue()&&t.draw()})},this)}})}.call(this); diff --git a/theme/bootstrap/plugins/ckeditor/CHANGES.md b/theme/bootstrap/plugins/ckeditor/CHANGES.md new file mode 100644 index 0000000..1316da9 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/CHANGES.md @@ -0,0 +1,378 @@ +CKEditor 4 Changelog +==================== + +## CKEditor 4.3.1 + +**Important Notes:** + +* To match the naming convention, the `language` button is now `Language` ([#11201](http://dev.ckeditor.com/ticket/11201)). +* [Enhanced Image](http://ckeditor.com/addon/image2) button, context menu, command, and icon names match those of the [Image](http://ckeditor.com/addon/image) plugin ([#11222](http://dev.ckeditor.com/ticket/11222)). + +Fixed Issues: + +* [#11244](http://dev.ckeditor.com/ticket/11244): Changed: The [`widget.repository.checkWidgets()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.repository-method-checkWidgets) method now fires the [`widget.repository.checkWidgets`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.repository-event-checkWidgets) event, so from CKEditor 4.3.1 it is preferred to use the method rather than fire the event. +* [#11171](http://dev.ckeditor.com/ticket/11171): Fixed: [`editor.insertElement()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertElement) and [`editor.insertText()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertText) methods do not call the [`widget.repository.checkWidgets()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.repository-method-checkWidgets) method. +* [#11085](http://dev.ckeditor.com/ticket/11085): [IE8] Replaced preview generated by the [Mathematical Formulas](http://ckeditor.com/addon/mathjax) widget with a placeholder. +* [#11044](http://dev.ckeditor.com/ticket/11044): Enhanced WAI-ARIA support for the [Language](http://ckeditor.com/addon/language) plugin drop-down menu. +* [#11075](http://dev.ckeditor.com/ticket/11075): With drop-down menu button focused, pressing the *Down Arrow* key will now open the menu and focus its first option. +* [#11165](http://dev.ckeditor.com/ticket/11165): Fixed: The [File Browser](http://ckeditor.com/addon/filebrowser) plugin cannot be removed from the editor. +* [#11159](http://dev.ckeditor.com/ticket/11159): [IE9-10] [Enhanced Image](http://ckeditor.com/addon/image2): Fixed buggy discovery of image dimensions. +* [#11101](http://dev.ckeditor.com/ticket/11101): Drop-down lists no longer break when given double quotes. +* [#11077](http://dev.ckeditor.com/ticket/11077): [Enhanced Image](http://ckeditor.com/addon/image2): Empty undo step recorded when resizing the image. +* [#10853](http://dev.ckeditor.com/ticket/10853): [Enhanced Image](http://ckeditor.com/addon/image2): Widget has paragraph wrapper when de-captioning unaligned image. +* [#11198](http://dev.ckeditor.com/ticket/11198): Widgets: Drag handler is not fully visible when an inline widget is in a heading. +* [#11132](http://dev.ckeditor.com/ticket/11132): [Firefox] Fixed: Caret is lost after drag and drop of an inline widget. +* [#11182](http://dev.ckeditor.com/ticket/11182): [IE10-11] Fixed: Editor crashes (IE11) or works with minor issues (IE10) if a page is loaded in Quirks Mode. See [`env.quirks`](http://docs.ckeditor.com/#!/api/CKEDITOR.env-property-quirks) for more details. +* [#11204](http://dev.ckeditor.com/ticket/11204): Added `figure` and `figcaption` styles to the `contents.css` file so [Enhanced Image](http://ckeditor.com/addon/image2) looks nicer. +* [#11202](http://dev.ckeditor.com/ticket/11202): Fixed: No newline in [BBCode](http://ckeditor.com/addon/bbcode) mode. +* [#10890](http://dev.ckeditor.com/ticket/10890): Fixed: Error thrown when pressing the *Delete* key in a list item. +* [#10055](http://dev.ckeditor.com/ticket/10055): [IE8-10] Fixed: *Delete* pressed on a selected image causes the browser to go back. +* [#11183](http://dev.ckeditor.com/ticket/11183): Fixed: Inserting a horizontal rule or a table in multiple row selection causes a browser crash. Additionally, the [`editor.insertElement()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-insertElement) method does not insert the element into every range of a selection any more. +* [#11042](http://dev.ckeditor.com/ticket/11042): Fixed: Selection made on an element containing a non-editable element was not auto faked. +* [#11125](http://dev.ckeditor.com/ticket/11125): Fixed: Keyboard navigation through menu and drop-down items will now cycle. +* [#11011](http://dev.ckeditor.com/ticket/11011): Fixed: The [`editor.applyStyle()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-applyStyle) method removes attributes from nested elements. +* [#11179](http://dev.ckeditor.com/ticket/11179): Fixed: [`editor.destroy()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-destroy) does not cleanup content generated by the [Table Resize](http://ckeditor.com/addon/tableresize) plugin for inline editors. +* [#11237](http://dev.ckeditor.com/ticket/11237): Fixed: Table border attribute value is deleted when pasting content from Microsoft Word. +* [#11250](http://dev.ckeditor.com/ticket/11250): Fixed: HTML entities inside the `<textarea>` element are not encoded. +* [#11260](http://dev.ckeditor.com/ticket/11260): Fixed: Initially disabled buttons are not read by JAWS as disabled. +* [#11200](http://dev.ckeditor.com/ticket/11200): Added [Clipboard](http://ckeditor.com/addon/clipboard) plugin as a dependency for [Widget](http://ckeditor.com/addon/widget) to fix drag and drop. + +## CKEditor 4.3 + +New Features: + +* [#10612](http://dev.ckeditor.com/ticket/10612): Internet Explorer 11 support. +* [#10869](http://dev.ckeditor.com/ticket/10869): Widgets: Added better integration with the [Elements Path](http://ckeditor.com/addon/elementspath) plugin. +* [#10886](http://dev.ckeditor.com/ticket/10886): Widgets: Added tooltip to the drag handle. +* [#10933](http://dev.ckeditor.com/ticket/10933): Widgets: Introduced drag and drop of block widgets with the [Line Utilities](http://ckeditor.com/addon/lineutils) plugin. +* [#10936](http://dev.ckeditor.com/ticket/10936): Widget System changes for easier integration with other dialog systems. +* [#10895](http://dev.ckeditor.com/ticket/10895): [Enhanced Image](http://ckeditor.com/addon/image2): Added file browser integration. +* [#11002](http://dev.ckeditor.com/ticket/11002): Added the [`draggable`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget.definition-property-draggable) option to disable drag and drop support for widgets. +* [#10937](http://dev.ckeditor.com/ticket/10937): [Mathematical Formulas](http://ckeditor.com/addon/mathjax) widget improvements: + * loading indicator ([#10948](http://dev.ckeditor.com/ticket/10948)), + * applying paragraph changes (like font color change) to iframe ([#10841](http://dev.ckeditor.com/ticket/10841)), + * Firefox and IE9 clipboard fixes ([#10857](http://dev.ckeditor.com/ticket/10857)), + * fixing same origin policy issue ([#10840](http://dev.ckeditor.com/ticket/10840)), + * fixing undo bugs ([#10842](http://dev.ckeditor.com/ticket/10842), [#10930](http://dev.ckeditor.com/ticket/10930)), + * fixing other minor bugs. +* [#10862](http://dev.ckeditor.com/ticket/10862): [Placeholder](http://ckeditor.com/addon/placeholder) plugin was rewritten as a widget. +* [#10822](http://dev.ckeditor.com/ticket/10822): Added styles system integration with non-editable elements (for example widgets) and their nested editables. Styles cannot change non-editable content and are applied in nested editable only if allowed by its type and content filter. +* [#10856](http://dev.ckeditor.com/ticket/10856): Menu buttons will now toggle the visibility of their panels when clicked multiple times. [Language](http://ckeditor.com/addon/language) plugin fixes: Added active language highlighting, added an option to remove the language. +* [#10028](http://dev.ckeditor.com/ticket/10028): New [`config.dialog_noConfirmCancel`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-dialog_noConfirmCancel) configuration option that eliminates the need to confirm closing of a dialog window when the user changed any of its fields. +* [#10848](http://dev.ckeditor.com/ticket/10848): Integrate remaining plugins ([Styles](http://ckeditor.com/addon/stylescombo), [Format](http://ckeditor.com/addon/format), [Font](http://ckeditor.com/addon/font), [Color Button](http://ckeditor.com/addon/colorbutton), [Language](http://ckeditor.com/addon/language) and [Indent](http://ckeditor.com/addon/indent)) with [active filter](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-activeFilter). +* [#10855](http://dev.ckeditor.com/ticket/10855): Change the extension of emoticons in the [BBCode](http://ckeditor.com/addon/bbcode) sample from GIF to PNG. + +Fixed Issues: + +* [#10831](http://dev.ckeditor.com/ticket/10831): [Enhanced Image](http://ckeditor.com/addon/image2): Merged `image2inline` and `image2block` into one `image2` widget. +* [#10835](http://dev.ckeditor.com/ticket/10835): [Enhanced Image](http://ckeditor.com/addon/image2): Improved visibility of the resize handle. +* [#10836](http://dev.ckeditor.com/ticket/10836): [Enhanced Image](http://ckeditor.com/addon/image2): Preserve custom mouse cursor while resizing the image. +* [#10939](http://dev.ckeditor.com/ticket/10939): [Firefox] [Enhanced Image](http://ckeditor.com/addon/image2): hovering the image causes it to change. +* [#10866](http://dev.ckeditor.com/ticket/10866): Fixed: Broken *Tab* key navigation in the [Enhanced Image](http://ckeditor.com/addon/image2) dialog window. +* [#10833](http://dev.ckeditor.com/ticket/10833): Fixed: *Lock ratio* option should be on by default in the [Enhanced Image](http://ckeditor.com/addon/image2) dialog window. +* [#10881](http://dev.ckeditor.com/ticket/10881): Various improvements to *Enter* key behavior in nested editables. +* [#10879](http://dev.ckeditor.com/ticket/10879): [Remove Format](http://ckeditor.com/addon/removeformat) should not leak from a nested editable. +* [#10877](http://dev.ckeditor.com/ticket/10877): Fixed: [WebSpellChecker](http://ckeditor.com/addon/wsc) fails to apply changes if a nested editable was focused. +* [#10877](http://dev.ckeditor.com/ticket/10877): Fixed: [SCAYT](http://ckeditor.com/addon/wsc) blocks typing in nested editables. +* [#11079](http://dev.ckeditor.com/ticket/11079): Add button icons to the [Placeholder](http://ckeditor.com/addon/placeholder) sample. +* [#10870](http://dev.ckeditor.com/ticket/10870): The `paste` command is no longer being disabled when the clipboard is empty. +* [#10854](http://dev.ckeditor.com/ticket/10854): Fixed: Firefox prepends `<br>` to `<body>`, so it is stripped by the HTML data processor. +* [#10823](http://dev.ckeditor.com/ticket/10823): Fixed: [Link](http://ckeditor.com/addon/link) plugin does not work with non-editable content. +* [#10828](http://dev.ckeditor.com/ticket/10828): [Magic Line](http://ckeditor.com/addon/magicline) integration with the Widget System. +* [#10865](http://dev.ckeditor.com/ticket/10865): Improved hiding copybin, so copying widgets works smoothly. +* [#11066](http://dev.ckeditor.com/ticket/11066): Widget's private parts use CSS reset. +* [#11027](http://dev.ckeditor.com/ticket/11027): Fixed: Block commands break on widgets; added the [`contentDomInvalidated`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-contentDomInvalidated) event. +* [#10430](http://dev.ckeditor.com/ticket/10430): Resolve dependence of the [Image](http://ckeditor.com/addon/image) plugin on the [Form Elements](http://ckeditor.com/addon/forms) plugin. +* [#10911](http://dev.ckeditor.com/ticket/10911): Fixed: Browser *Alt* hotkeys will no longer be blocked while a widget is focused. +* [#11082](http://dev.ckeditor.com/ticket/11082): Fixed: Selected widget is not copied or cut when using toolbar buttons or context menu. +* [#11083](http://dev.ckeditor.com/ticket/11083): Fixed list and div element application to block widgets. +* [#10887](http://dev.ckeditor.com/ticket/10887): Internet Explorer 8 compatibility issues related to the Widget System. +* [#11074](http://dev.ckeditor.com/ticket/11074): Temporarily disabled inline widget drag and drop, because of seriously buggy native `range#moveToPoint` method. +* [#11098](http://dev.ckeditor.com/ticket/11098): Fixed: Wrong selection position after undoing widget drag and drop. +* [#11110](http://dev.ckeditor.com/ticket/11110): Fixed: IFrame and Flash objects are being incorrectly pasted in certain conditions. +* [#11129](http://dev.ckeditor.com/ticket/11129): Page break is lost when loading data. +* [#11123](http://dev.ckeditor.com/ticket/11123): [Firefox] Widget is destroyed after being dragged outside of `<body>`. +* [#11124](http://dev.ckeditor.com/ticket/11124): Fixed the [Elements Path](http://ckeditor.com/addon/elementspath) in an editor using the [Div Editing Area](http://ckeditor.com/addon/divarea). + +## CKEditor 4.3 Beta + +New Features: + +* [#9764](http://dev.ckeditor.com/ticket/9764): Widget System. + * [Widget plugin](http://ckeditor.com/addon/widget) introducing the [Widget API](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.widget). + * New [`editor.enterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-enterMode) and [`editor.shiftEnterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-shiftEnterMode) properties &ndash; normalized versions of [`config.enterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-enterMode) and [`config.shiftEnterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-shiftEnterMode). + * Dynamic editor settings. Starting from CKEditor 4.3 Beta, *Enter* mode values and [content filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) instances may be changed dynamically (for example when the caret was placed in an element in which editor features should be adjusted). When you are implementing a new editor feature, you should base its behavior on [dynamic](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-activeEnterMode) or [static](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-enterMode) *Enter* mode values depending on whether this feature works in selection context or globally on editor content. + * Dynamic *Enter* mode values &ndash; [`editor.setActiveEnterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setActiveEnterMode) method, [`editor.activeEnterModeChange`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-activeEnterModeChange) event, and two properties: [`editor.activeEnterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-activeEnterMode) and [`editor.activeShiftEnterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-activeShiftEnterMode). + * Dynamic content filter instances &ndash; [`editor.setActiveFilter`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setActiveFilter) method, [`editor.activeFilterChange`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-activeFilterChange) event, and [`editor.activeFilter`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-activeFilter) property. + * "Fake" selection was introduced. It makes it possible to virtually select any element when the real selection remains hidden. See the [`selection.fake`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.selection-method-fake) method. + * Default [`htmlParser.filter`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.filter) rules are not applied to non-editable elements (elements with `contenteditable` attribute set to `false` and their descendants) anymore. To add a rule which will be applied to all elements you need to pass an additional argument to the [`filter.addRules`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.filter-method-addRules) method. + * Dozens of new methods were introduced &ndash; most interesting ones: + * [`document.find`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.document-method-find), + * [`document.findOne`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.document-method-findOne), + * [`editable.insertElementIntoRange`](http://docs.ckeditor.com/#!/api/CKEDITOR.editable-method-insertElementIntoRange), + * [`range.moveToClosestEditablePosition`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.range-method-moveToClosestEditablePosition), + * New methods for [`htmlParser.node`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.node) and [`htmlParser.element`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.element). +* [#10659](http://dev.ckeditor.com/ticket/10659): New [Enhanced Image](http://ckeditor.com/addon/image2) plugin that introduces a widget with integrated image captions, an option to center images, and dynamic "click and drag" resizing. +* [#10664](http://dev.ckeditor.com/ticket/10664): New [Mathematical Formulas](http://ckeditor.com/addon/mathjax) plugin that introduces the MathJax widget. +* [#7987](https://dev.ckeditor.com/ticket/7987): New [Language](http://ckeditor.com/addon/language) plugin that implements Language toolbar button to support [WCAG 3.1.2 Language of Parts](http://www.w3.org/TR/UNDERSTANDING-WCAG20/meaning-other-lang-id.html). +* [#10708](http://dev.ckeditor.com/ticket/10708): New [smileys](http://ckeditor.com/addon/smiley). + +## CKEditor 4.2.3 + +Fixed Issues: + +* [#10994](http://dev.ckeditor.com/ticket/10994): Fixed: Loading external jQuery library when opening the [jQuery Adapter](http://docs.ckeditor.com/#!/guide/dev_jquery) sample directly from file. +* [#10975](http://dev.ckeditor.com/ticket/10975): [IE] Fixed: Error thrown while opening the color palette. +* [#9929](http://dev.ckeditor.com/ticket/9929): [Blink/WebKit] Fixed: A non-breaking space is created once a character is deleted and a regular space is typed. +* [#10963](http://dev.ckeditor.com/ticket/10963): Fixed: JAWS issue with the keyboard shortcut for [Magic Line](http://ckeditor.com/addon/magicline). +* [#11096](http://dev.ckeditor.com/ticket/11096): Fixed: TypeError: Object has no method 'is'. + +## CKEditor 4.2.2 + +Fixed Issues: + +* [#9314](http://dev.ckeditor.com/ticket/9314): Fixed: Incorrect error message on closing a dialog window without saving changs. +* [#10308](http://dev.ckeditor.com/ticket/10308): [IE10] Fixed: Unspecified error when deleting a row. +* [#10945](http://dev.ckeditor.com/ticket/10945): [Chrome] Fixed: Clicking with a mouse inside the editor does not show the caret. +* [#10912](http://dev.ckeditor.com/ticket/10912): Prevent default action when content of a non-editable link is clicked. +* [#10913](http://dev.ckeditor.com/ticket/10913): Fixed [`CKEDITOR.plugins.addExternal`](http://docs.ckeditor.com/#!/api/CKEDITOR.resourceManager-method-addExternal) not handling paths including file name specified. +* [#10666](http://dev.ckeditor.com/ticket/10666): Fixed [`CKEDITOR.tools.isArray`](http://docs.ckeditor.com/#!/api/CKEDITOR.tools-method-isArray) not working cross frame. +* [#10910](http://dev.ckeditor.com/ticket/10910): [IE9] Fixed JavaScript error thrown in Compatibility Mode when clicking and/or typing in the editing area. +* [#10868](http://dev.ckeditor.com/ticket/10868): [IE8] Prevent the browser from crashing when applying the Inline Quotation style. +* [#10915](http://dev.ckeditor.com/ticket/10915): Fixed: Invalid CSS filter in the Kama skin. +* [#10914](http://dev.ckeditor.com/ticket/10914): Plugins [Indent List](http://ckeditor.com/addon/indentlist) and [Indent Block](http://ckeditor.com/addon/indentblock) are now included in the build configuration. +* [#10812](http://dev.ckeditor.com/ticket/10812): Fixed [`range#createBookmark2`](http://docs.ckeditor.com/#!/api/CKEDITOR.dom.range-method-createBookmark2) incorrectly normalizing offsets. This bug was causing many issues: [#10850](http://dev.ckeditor.com/ticket/10850), [#10842](http://dev.ckeditor.com/ticket/10842). +* [#10951](http://dev.ckeditor.com/ticket/10951): Reviewed and optimized focus handling on panels (combo, menu buttons, color buttons, and context menu) to enhance accessibility. Fixed [#10705](http://dev.ckeditor.com/ticket/10705), [#10706](http://dev.ckeditor.com/ticket/10706) and [#10707](http://dev.ckeditor.com/ticket/10707). +* [#10704](http://dev.ckeditor.com/ticket/10704): Fixed a JAWS issue with the Select Color dialog window title not being announced. +* [#10753](http://dev.ckeditor.com/ticket/10753): The floating toolbar in inline instances now has a dedicated accessibility label. + +## CKEditor 4.2.1 + +Fixed Issues: + +* [#10301](http://dev.ckeditor.com/ticket/10301): [IE9-10] Undo fails after 3+ consecutive paste actions with a JavaScript error. +* [#10689](http://dev.ckeditor.com/ticket/10689): Save toolbar button saves only the first editor instance. +* [#10368](http://dev.ckeditor.com/ticket/10368): Move language reading direction definition (`dir`) from main language file to core. +* [#9330](http://dev.ckeditor.com/ticket/9330): Fixed pasting anchors from MS Word. +* [#8103](http://dev.ckeditor.com/ticket/8103): Fixed pasting nested lists from MS Word. +* [#9958](http://dev.ckeditor.com/ticket/9958): [IE9] Pressing the "OK" button will trigger the `onbeforeunload` event in the popup dialog. +* [#10662](http://dev.ckeditor.com/ticket/10662): Fixed styles from the Styles drop-down list not registering to the ACF in case when the [Shared Spaces plugin](http://ckeditor.com/addon/sharedspace) is used. +* [#9654](http://dev.ckeditor.com/ticket/9654): Problems with Internet Explorer 10 Quirks Mode. +* [#9816](http://dev.ckeditor.com/ticket/9816): Floating toolbar does not reposition vertically in several cases. +* [#10646](http://dev.ckeditor.com/ticket/10646): Removing a selected sublist or nested table with *Backspace/Delete* removes the parent element. +* [#10623](http://dev.ckeditor.com/ticket/10623): [WebKit] Page is scrolled when opening a drop-down list. +* [#10004](http://dev.ckeditor.com/ticket/10004): [ChromeVox] Button names are not announced. +* [#10731](http://dev.ckeditor.com/ticket/10731): [WebSpellChecker](http://ckeditor.com/addon/wsc) plugin breaks cloning of editor configuration. +* It is now possible to set per instance [WebSpellChecker](http://ckeditor.com/addon/wsc) plugin configuration instead of setting the configuration globally. + +## CKEditor 4.2 + +**Important Notes:** + +* Dropped compatibility support for Internet Explorer 7 and Firefox 3.6. + +* Both the Basic and the Standard distribution packages will not contain the new [Indent Block](http://ckeditor.com/addon/indentblock) plugin. Because of this the [Advanced Content Filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) might remove block indentations from existing contents. If you want to prevent this, either [add an appropriate ACF rule to your filter](http://docs.ckeditor.com/#!/guide/dev_allowed_content_rules) or create a custom build based on the Basic/Standard package and add the Indent Block plugin in [CKBuilder](http://ckeditor.com/builder). + +New Features: + +* [#10027](http://dev.ckeditor.com/ticket/10027): Separated list and block indentation into two plugins: [Indent List](http://ckeditor.com/addon/indentlist) and [Indent Block](http://ckeditor.com/addon/indentblock). +* [#8244](http://dev.ckeditor.com/ticket/8244): Use *(Shift+)Tab* to indent and outdent lists. +* [#10281](http://dev.ckeditor.com/ticket/10281): The [jQuery Adapter](http://docs.ckeditor.com/#!/guide/dev_jquery) is now available. Several jQuery-related issues fixed: [#8261](http://dev.ckeditor.com/ticket/8261), [#9077](http://dev.ckeditor.com/ticket/9077), [#8710](http://dev.ckeditor.com/ticket/8710), [#8530](http://dev.ckeditor.com/ticket/8530), [#9019](http://dev.ckeditor.com/ticket/9019), [#6181](http://dev.ckeditor.com/ticket/6181), [#7876](http://dev.ckeditor.com/ticket/7876), [#6906](http://dev.ckeditor.com/ticket/6906). +* [#10042](http://dev.ckeditor.com/ticket/10042): Introduced [`config.title`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-title) setting to change the human-readable title of the editor. +* [#9794](http://dev.ckeditor.com/ticket/9794): Added [`editor.onChange`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-change) event. +* [#9923](http://dev.ckeditor.com/ticket/9923): HiDPI support in the editor UI. HiDPI icons for [Moono skin](http://ckeditor.com/addon/moono) added. +* [#8031](http://dev.ckeditor.com/ticket/8031): Handle `required` attributes on `<textarea>` elements &mdash; introduced [`editor.required`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-required) event. +* [#10280](http://dev.ckeditor.com/ticket/10280): Ability to replace `<textarea>` elements with the inline editor. + +Fixed Issues: + +* [#10599](http://dev.ckeditor.com/ticket/10599): [Indent](http://ckeditor.com/addon/indent) plugin is no longer required by the [List](http://ckeditor.com/addon/list) plugin. +* [#10370](http://dev.ckeditor.com/ticket/10370): Inconsistency in data events between framed and inline editors. +* [#10438](http://dev.ckeditor.com/ticket/10438): [FF, IE] No selection is done on an editable element on executing [`editor.setData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setData). + +## CKEditor 4.1.3 + +New Features: + +* Added new translation: Indonesian. + +Fixed Issues: + +* [#10644](http://dev.ckeditor.com/ticket/10644): Fixed a critical bug when pasting plain text in Blink-based browsers. +* [#5189](http://dev.ckeditor.com/ticket/5189): [Find/Replace](http://ckeditor.com/addon/find) dialog window: rename "Cancel" button to "Close". +* [#10562](http://dev.ckeditor.com/ticket/10562): [Housekeeping] Unified CSS gradient filter formats in the [Moono](http://ckeditor.com/addon/moono) skin. +* [#10537](http://dev.ckeditor.com/ticket/10537): Advanced Content Filter should register a default rule for [`config.shiftEnterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-shiftEnterMode). +* [#10610](http://dev.ckeditor.com/ticket/10610): [`CKEDITOR.dialog.addIframe()`](http://docs.ckeditor.com/#!/api/CKEDITOR.dialog-static-method-addIframe) incorrectly sets the iframe size in dialog windows. + +## CKEditor 4.1.2 + +New Features: + +* Added new translation: Sinhala. + +Fixed Issues: + +* [#10339](http://dev.ckeditor.com/ticket/10339): Fixed: Error thrown when inserted data was totally stripped out after filtering and processing. +* [#10298](http://dev.ckeditor.com/ticket/10298): Fixed: Data processor breaks attributes containing protected parts. +* [#10367](http://dev.ckeditor.com/ticket/10367): Fixed: [`editable.insertText()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editable-method-insertText) loses characters when `RegExp` replace controls are being inserted. +* [#10165](http://dev.ckeditor.com/ticket/10165): [IE] Access denied error when `document.domain` has been altered. +* [#9761](http://dev.ckeditor.com/ticket/9761): Update the *Backspace* key state in [`keystrokeHandler.blockedKeystrokes`](http://docs.ckeditor.com/#!/api/CKEDITOR.keystrokeHandler-property-blockedKeystrokes) when calling [`editor.setReadOnly()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-setReadOnly). +* [#6504](http://dev.ckeditor.com/ticket/6504): Fixed: Race condition while loading several [`config.customConfig`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-customConfig) files. +* [#10146](http://dev.ckeditor.com/ticket/10146): [Firefox] Empty lines are being removed while [`config.enterMode`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-enterMode) is [`CKEDITOR.ENTER_BR`](http://docs.ckeditor.com/#!/api/CKEDITOR-property-ENTER_BR). +* [#10360](http://dev.ckeditor.com/ticket/10360): Fixed: ARIA `role="application"` should not be used for dialog windows. +* [#10361](http://dev.ckeditor.com/ticket/10361): Fixed: ARIA `role="application"` should not be used for floating panels. +* [#10510](http://dev.ckeditor.com/ticket/10510): Introduced unique voice labels to differentiate between different editor instances. +* [#9945](http://dev.ckeditor.com/ticket/9945): [iOS] Scrolling not possible on iPad. +* [#10389](http://dev.ckeditor.com/ticket/10389): Fixed: Invalid HTML in the "Text and Table" template. +* [WebSpellChecker](http://ckeditor.com/addon/wsc) plugin user interface was changed to match CKEditor 4 style. + +## CKEditor 4.1.1 + +New Features: + +* Added new translation: Albanian. + +Fixed Issues: + +* [#10172](http://dev.ckeditor.com/ticket/10172): Pressing *Delete* or *Backspace* in an empty table cell moves the cursor to the next/previous cell. +* [#10219](http://dev.ckeditor.com/ticket/10219): Error thrown when destroying an editor instance in parallel with a `mouseup` event. +* [#10265](http://dev.ckeditor.com/ticket/10265): Wrong loop type in the [File Browser](http://ckeditor.com/addon/filebrowser) plugin. +* [#10249](http://dev.ckeditor.com/ticket/10249): Wrong undo/redo states at start. +* [#10268](http://dev.ckeditor.com/ticket/10268): [Show Blocks](http://ckeditor.com/addon/showblocks) does not recover after switching to Source view. +* [#9995](http://dev.ckeditor.com/ticket/9995): HTML code in the `<textarea>` should not be modified by the [`htmlDataProcessor`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlDataProcessor). +* [#10320](http://dev.ckeditor.com/ticket/10320): [Justify](http://ckeditor.com/addon/justify) plugin should add elements to Advanced Content Filter based on current [Enter mode](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-enterMode). +* [#10260](http://dev.ckeditor.com/ticket/10260): Fixed: Advanced Content Filter blocks [`tabSpaces`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-tabSpaces). Unified `data-cke-*` attributes filtering. +* [#10315](http://dev.ckeditor.com/ticket/10315): [WebKit] [Undo manager](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.undo.UndoManager) should not record snapshots after a filling character was added/removed. +* [#10291](http://dev.ckeditor.com/ticket/10291): [WebKit] Space after a filling character should be secured. +* [#10330](http://dev.ckeditor.com/ticket/10330): [WebKit] The filling character is not removed on `keydown` in specific cases. +* [#10285](http://dev.ckeditor.com/ticket/10285): Fixed: Styled text pasted from MS Word causes an infinite loop. +* [#10131](http://dev.ckeditor.com/ticket/10131): Fixed: [`undoManager.update()`](http://docs.ckeditor.com/#!/api/CKEDITOR.plugins.undo.UndoManager-method-update) does not refresh the command state. +* [#10337](http://dev.ckeditor.com/ticket/10337): Fixed: Unable to remove `<s>` using [Remove Format](http://ckeditor.com/addon/removeformat). + +## CKEditor 4.1 + +Fixed Issues: + +* [#10192](http://dev.ckeditor.com/ticket/10192): Closing lists with the *Enter* key does not work with [Advanced Content Filter](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) in several cases. +* [#10191](http://dev.ckeditor.com/ticket/10191): Fixed allowed content rules unification, so the [`filter.allowedContent`](http://docs.ckeditor.com/#!/api/CKEDITOR.filter-property-allowedContent) property always contains rules in the same format. +* [#10224](http://dev.ckeditor.com/ticket/10224): Advanced Content Filter does not remove non-empty `<a>` elements anymore. +* Minor issues in plugin integration with Advanced Content Filter: + * [#10166](http://dev.ckeditor.com/ticket/10166): Added transformation from the `align` attribute to `float` style to preserve backward compatibility after the introduction of Advanced Content Filter. + * [#10195](http://dev.ckeditor.com/ticket/10195): [Image](http://ckeditor.com/addon/image) plugin no longer registers rules for links to Advanced Content Filter. + * [#10213](http://dev.ckeditor.com/ticket/10213): [Justify](http://ckeditor.com/addon/justify) plugin is now correctly registering rules to Advanced Content Filter when [`config.justifyClasses`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-justifyClasses) is defined. + +## CKEditor 4.1 RC + +New Features: + +* [#9829](http://dev.ckeditor.com/ticket/9829): Advanced Content Filter - data and features activation based on editor configuration. + + Brand new data filtering system that works in 2 modes: + + * Based on loaded features (toolbar items, plugins) - the data will be filtered according to what the editor in its + current configuration can handle. + * Based on [`config.allowedContent`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-allowedContent) rules - the data + will be filtered and the editor features (toolbar items, commands, keystrokes) will be enabled if they are allowed. + + See the `datafiltering.html` sample, [guides](http://docs.ckeditor.com/#!/guide/dev_advanced_content_filter) and [`CKEDITOR.filter` API documentation](http://docs.ckeditor.com/#!/api/CKEDITOR.filter). +* [#9387](http://dev.ckeditor.com/ticket/9387): Reintroduced [Shared Spaces](http://ckeditor.com/addon/sharedspace) - the ability to display toolbar and bottom editor space in selected locations and to share them by different editor instances. +* [#9907](http://dev.ckeditor.com/ticket/9907): Added the [`contentPreview`](http://docs.ckeditor.com/#!/api/CKEDITOR-event-contentPreview) event for preview data manipulation. +* [#9713](http://dev.ckeditor.com/ticket/9713): Introduced the [Source Dialog](http://ckeditor.com/addon/sourcedialog) plugin that brings raw HTML editing for inline editor instances. +* Included in [#9829](http://dev.ckeditor.com/ticket/9829): Introduced new events, [`toHtml`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-toHtml) and [`toDataFormat`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-toDataFormat), allowing for better integration with data processing. +* [#9981](http://dev.ckeditor.com/ticket/9981): Added ability to filter [`htmlParser.fragment`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.fragment), [`htmlParser.element`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.element) etc. by many [`htmlParser.filter`](http://docs.ckeditor.com/#!/api/CKEDITOR.htmlParser.filter)s before writing structure to an HTML string. +* Included in [#10103](http://dev.ckeditor.com/ticket/10103): + * Introduced the [`editor.status`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-status) property to make it easier to check the current status of the editor. + * Default [`command`](http://docs.ckeditor.com/#!/api/CKEDITOR.command) state is now [`CKEDITOR.TRISTATE_DISABLE`](http://docs.ckeditor.com/#!/api/CKEDITOR-property-TRISTATE_DISABLED). It will be activated on [`editor.instanceReady`](http://docs.ckeditor.com/#!/api/CKEDITOR-event-instanceReady) or immediately after being added if the editor is already initialized. +* [#9796](http://dev.ckeditor.com/ticket/9796): Introduced `<s>` as a default tag for strikethrough, which replaces obsolete `<strike>` in HTML5. + +## CKEditor 4.0.3 + +Fixed Issues: + +* [#10196](http://dev.ckeditor.com/ticket/10196): Fixed context menus not opening with keyboard shortcuts when [Autogrow](http://ckeditor.com/addon/autogrow) is enabled. +* [#10212](http://dev.ckeditor.com/ticket/10212): [IE7-10] Undo command throws errors after multiple switches between Source and WYSIWYG view. +* [#10219](http://dev.ckeditor.com/ticket/10219): [Inline editor] Error thrown after calling [`editor.destroy()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-destroy). + +## CKEditor 4.0.2 + +Fixed Issues: + +* [#9779](http://dev.ckeditor.com/ticket/9779): Fixed overriding [`CKEDITOR.getUrl()`](http://docs.ckeditor.com/#!/api/CKEDITOR-method-getUrl) with `CKEDITOR_GETURL`. +* [#9772](http://dev.ckeditor.com/ticket/9772): Custom buttons in the dialog window footer have different look and size ([Moono](http://ckeditor.com/addon/moono), [Kama](http://ckeditor.com/addon/kama) skins). +* [#9029](http://dev.ckeditor.com/ticket/9029): Custom styles added with the [`stylesSet.add()`](http://docs.ckeditor.com/#!/api/CKEDITOR.stylesSet-method-add) are displayed in the wrong order. +* [#9887](http://dev.ckeditor.com/ticket/9887): Disable [Magic Line](http://ckeditor.com/addon/magicline) when [`editor.readOnly`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-property-readOnly) is set. +* [#9882](http://dev.ckeditor.com/ticket/9882): Fixed empty document title on [`editor.getData()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-getData) if set via the Document Properties dialog window. +* [#9773](http://dev.ckeditor.com/ticket/9773): Fixed rendering problems with selection fields in the Kama skin. +* [#9851](http://dev.ckeditor.com/ticket/9851): The [`selectionChange`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-event-selectionChange) event is not fired when mouse selection ended outside editable. +* [#9903](http://dev.ckeditor.com/ticket/9903): [Inline editor] Bad positioning of floating space with page horizontal scroll. +* [#9872](http://dev.ckeditor.com/ticket/9872): [`editor.checkDirty()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-checkDirty) returns `true` when called onload. Removed the obsolete `editor.mayBeDirty` flag. +* [#9893](http://dev.ckeditor.com/ticket/9893): [IE] Fixed broken toolbar when editing mixed direction content in Quirks mode. +* [#9845](http://dev.ckeditor.com/ticket/9845): Fixed TAB navigation in the [Link](http://ckeditor.com/addon/link) dialog window when the Anchor option is used and no anchors are available. +* [#9883](http://dev.ckeditor.com/ticket/9883): Maximizing was making the entire page editable with [divarea](http://ckeditor.com/addon/divarea)-based editors. +* [#9940](http://dev.ckeditor.com/ticket/9940): [Firefox] Navigating back to a page with the editor was making the entire page editable. +* [#9966](http://dev.ckeditor.com/ticket/9966): Fixed: Unable to type square brackets with French keyboard layout. Changed [Magic Line](http://ckeditor.com/addon/magicline) keystrokes. +* [#9507](http://dev.ckeditor.com/ticket/9507): [Firefox] Selection is moved before editable position when the editor is focused for the first time. +* [#9947](http://dev.ckeditor.com/ticket/9947): [WebKit] Editor overflows parent container in some edge cases. +* [#10105](http://dev.ckeditor.com/ticket/10105): Fixed: Broken [sourcearea](http://ckeditor.com/addon/sourcearea) view when an RTL language is set. +* [#10123](http://dev.ckeditor.com/ticket/10123): [WebKit] Fixed: Several dialog windows have broken layout since the latest WebKit release. +* [#10152](http://dev.ckeditor.com/ticket/10152): Fixed: Invalid ARIA property used on menu items. + +## CKEditor 4.0.1.1 + +Fixed Issues: + +* Security update: Added protection against XSS attack and possible path disclosure in the PHP sample. + +## CKEditor 4.0.1 + +Fixed Issues: + +* [#9655](http://dev.ckeditor.com/ticket/9655): Support for IE Quirks Mode in the new [Moono skin](http://ckeditor.com/addon/moono). +* Accessibility issues (mainly in inline editor): [#9364](http://dev.ckeditor.com/ticket/9364), [#9368](http://dev.ckeditor.com/ticket/9368), [#9369](http://dev.ckeditor.com/ticket/9369), [#9370](http://dev.ckeditor.com/ticket/9370), [#9541](http://dev.ckeditor.com/ticket/9541), [#9543](http://dev.ckeditor.com/ticket/9543), [#9841](http://dev.ckeditor.com/ticket/9841), [#9844](http://dev.ckeditor.com/ticket/9844). +* [Magic Line](http://ckeditor.com/addon/magicline) plugin: + * [#9481](http://dev.ckeditor.com/ticket/9481): Added accessibility support for Magic Line. + * [#9509](http://dev.ckeditor.com/ticket/9509): Added Magic Line support for forms. + * [#9573](http://dev.ckeditor.com/ticket/9573): Magic Line does not disappear on `mouseout` in a specific case. +* [#9754](http://dev.ckeditor.com/ticket/9754): [WebKit] Cutting & pasting simple unformatted text generates an inline wrapper in WebKit browsers. +* [#9456](http://dev.ckeditor.com/ticket/9456): [Chrome] Properly paste bullet list style from MS Word. +* [#9699](http://dev.ckeditor.com/ticket/9699), [#9758](http://dev.ckeditor.com/ticket/9758): Improved selection locking when selecting by dragging. +* Context menu: + * [#9712](http://dev.ckeditor.com/ticket/9712): Opening the context menu destroys editor focus. + * [#9366](http://dev.ckeditor.com/ticket/9366): Context menu should be displayed over the floating toolbar. + * [#9706](http://dev.ckeditor.com/ticket/9706): Context menu generates a JavaScript error in inline mode when the editor is attached to a header element. +* [#9800](http://dev.ckeditor.com/ticket/9800): Hide float panel when resizing the window. +* [#9721](http://dev.ckeditor.com/ticket/9721): Padding in content of div-based editor puts the editing area under the bottom UI space. +* [#9528](http://dev.ckeditor.com/ticket/9528): Host page `box-sizing` style should not influence the editor UI elements. +* [#9503](http://dev.ckeditor.com/ticket/9503): [Form Elements](http://ckeditor.com/addon/forms) plugin adds context menu listeners only on supported input types. Added support for `tel`, `email`, `search` and `url` input types. +* [#9769](http://dev.ckeditor.com/ticket/9769): Improved floating toolbar positioning in a narrow window. +* [#9875](http://dev.ckeditor.com/ticket/9875): Table dialog window does not populate width correctly. +* [#8675](http://dev.ckeditor.com/ticket/8675): Deleting cells in a nested table removes the outer table cell. +* [#9815](http://dev.ckeditor.com/ticket/9815): Cannot edit dialog window fields in an editor initialized in the jQuery UI modal dialog. +* [#8888](http://dev.ckeditor.com/ticket/8888): CKEditor dialog windows do not show completely in a small window. +* [#9360](http://dev.ckeditor.com/ticket/9360): [Inline editor] Blocks shown for a `<div>` element stay permanently even after the user exits editing the `<div>`. +* [#9531](http://dev.ckeditor.com/ticket/9531): [Firefox & Inline editor] Toolbar is lost when closing the Format drop-down list by clicking its button. +* [#9553](http://dev.ckeditor.com/ticket/9553): Table width incorrectly set when the `border-width` style is specified. +* [#9594](http://dev.ckeditor.com/ticket/9594): Cannot tab past CKEditor when it is in read-only mode. +* [#9658](http://dev.ckeditor.com/ticket/9658): [IE9] Justify not working on selected images. +* [#9686](http://dev.ckeditor.com/ticket/9686): Added missing contents styles for `<pre>` elements. +* [#9709](http://dev.ckeditor.com/ticket/9709): [Paste from Word](http://ckeditor.com/addon/pastefromword) should not depend on configuration from other styles. +* [#9726](http://dev.ckeditor.com/ticket/9726): Removed [Color Dialog](http://ckeditor.com/addon/colordialog) plugin dependency from [Table Tools](http://ckeditor.com/addon/tabletools). +* [#9765](http://dev.ckeditor.com/ticket/9765): Toolbar Collapse command documented incorrectly in the [Accessibility Instructions](http://ckeditor.com/addon/a11yhelp) dialog window. +* [#9771](http://dev.ckeditor.com/ticket/9771): [WebKit & Opera] Fixed scrolling issues when pasting. +* [#9787](http://dev.ckeditor.com/ticket/9787): [IE9] `onChange` is not fired for checkboxes in dialogs. +* [#9842](http://dev.ckeditor.com/ticket/9842): [Firefox 17] When opening a toolbar menu for the first time and pressing the *Down Arrow* key, focus goes to the next toolbar button instead of the menu options. +* [#9847](http://dev.ckeditor.com/ticket/9847): [Elements Path](http://ckeditor.com/addon/elementspath) should not be initialized in the inline editor. +* [#9853](http://dev.ckeditor.com/ticket/9853): [`editor.addRemoveFormatFilter()`](http://docs.ckeditor.com/#!/api/CKEDITOR.editor-method-addRemoveFormatFilter) is exposed before it really works. +* [#8893](http://dev.ckeditor.com/ticket/8893): Value of the [`pasteFromWordCleanupFile`](http://docs.ckeditor.com/#!/api/CKEDITOR.config-cfg-pasteFromWordCleanupFile) configuration option is now taken from the instance configuration. +* [#9693](http://dev.ckeditor.com/ticket/9693): Removed "Live Preview" checkbox from UI color picker. + + +## CKEditor 4.0 + +The first stable release of the new CKEditor 4 code line. + +The CKEditor JavaScript API has been kept compatible with CKEditor 4, whenever +possible. The list of relevant changes can be found in the [API Changes page of +the CKEditor 4 documentation][1]. + +[1]: http://docs.ckeditor.com/#!/guide/dev_api_changes "API Changes" diff --git a/theme/bootstrap/plugins/ckeditor/LICENSE.md b/theme/bootstrap/plugins/ckeditor/LICENSE.md new file mode 100644 index 0000000..d447c67 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/LICENSE.md @@ -0,0 +1,1264 @@ +Software License Agreement +========================== + +CKEditor - The text editor for Internet - http://ckeditor.com +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + +Licensed under the terms of any of the following licenses at your +choice: + + - GNU General Public License Version 2 or later (the "GPL") + http://www.gnu.org/licenses/gpl.html + (See Appendix A) + + - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + http://www.gnu.org/licenses/lgpl.html + (See Appendix B) + + - Mozilla Public License Version 1.1 or later (the "MPL") + http://www.mozilla.org/MPL/MPL-1.1.html + (See Appendix C) + +You are not required to, but if you want to explicitly declare the +license you have chosen to be bound to when using, reproducing, +modifying and distributing this software, just include a text file +titled "legal.txt" in your version of this software, indicating your +license choice. In any case, your choice will not restrict any +recipient of your version of this software to use, reproduce, modify +and distribute this software under any of the above licenses. + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by +CKSource engineers and consists of CKSource-owned intellectual +property. In some specific instances, CKEditor will incorporate work +done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +CKEditor is a trademark of CKSource - Frederico Knabben. All other brand +and product names are trademarks, registered trademarks or service +marks of their respective holders. + +--- + +Appendix A: The GPL License +--------------------------- + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software-to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + + +Appendix B: The LGPL License +---------------------------- + +GNU LESSER GENERAL PUBLIC LICENSE +Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + +Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software-to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages-typically libraries-of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + +GNU LESSER GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + +NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + +END OF TERMS AND CONDITIONS + + +Appendix C: The MPL License +--------------------------- + +MOZILLA PUBLIC LICENSE +Version 1.1 + +1. Definitions. + + 1.0.1. "Commercial Use" means distribution or otherwise making the + Covered Code available to a third party. + + 1.1. "Contributor" means each entity that creates or contributes to + the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original + Code, prior Modifications used by a Contributor, and the Modifications + made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the + combination of the Original Code and Modifications, in each case + including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally + accepted in the software development community for the electronic + transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source + Code. + + 1.6. "Initial Developer" means the individual or entity identified + as the Initial Developer in the Source Code notice required by Exhibit + A. + + 1.7. "Larger Work" means a work which combines Covered Code or + portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.8.1. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means any addition to or deletion from the + substance or structure of either the Original Code or any previous + Modifications. When Covered Code is released as a series of files, a + Modification is: + A. Any addition to or deletion from the contents of a file + containing Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or + previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code + which is described in the Source Code notice required by Exhibit A as + Original Code, and which, at the time of its release under this + License is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, process, + and apparatus claims, in any patent Licensable by grantor. + + 1.11. "Source Code" means the preferred form of the Covered Code for + making modifications to it, including all modules it contains, plus + any associated interface definition files, scripts used to control + compilation and installation of an Executable, or source code + differential comparisons against either the Original Code or another + well known, available Covered Code of the Contributor's choice. The + Source Code can be in a compressed or archival form, provided the + appropriate decompression or de-archiving software is widely available + for no charge. + + 1.12. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this + License or a future version of this License issued under Section 6.1. + For legal entities, "You" includes any entity which controls, is + controlled by, or is under common control with You. For purposes of + this definition, "control" means (a) the power, direct or indirect, + to cause the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty percent + (50%) of the outstanding shares or beneficial ownership of such + entity. + +2. Source Code License. + + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, royalty-free, + non-exclusive license, subject to third party intellectual property + claims: + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer to use, reproduce, + modify, display, perform, sublicense and distribute the Original + Code (or portions thereof) with or without Modifications, and/or + as part of a Larger Work; and + + (b) under Patents Claims infringed by the making, using or + selling of Original Code, to make, have made, use, practice, + sell, and offer for sale, and/or otherwise dispose of the + Original Code (or portions thereof). + + (c) the licenses granted in this Section 2.1(a) and (b) are + effective on the date Initial Developer first distributes + Original Code under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: 1) for code that You delete from the Original Code; 2) + separate from the Original Code; or 3) for infringements caused + by: i) the modification of the Original Code or ii) the + combination of the Original Code with other software or devices. + + 2.2. Contributor Grant. + Subject to third party intellectual property claims, each Contributor + hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor, to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications + created by such Contributor (or portions thereof) either on an + unmodified basis, with other Modifications, as Covered Code + and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either alone + and/or in combination with its Contributor Version (or portions + of such combination), to make, use, sell, offer for sale, have + made, and/or otherwise dispose of: 1) Modifications made by that + Contributor (or portions thereof); and 2) the combination of + Modifications made by that Contributor with its Contributor + Version (or portions of such combination). + + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first makes Commercial Use of + the Covered Code. + + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: 1) for any code that Contributor has deleted from the + Contributor Version; 2) separate from the Contributor Version; + 3) for infringements caused by: i) third party modifications of + Contributor Version or ii) the combination of Modifications made + by that Contributor with other software (except as part of the + Contributor Version) or other devices; or 4) under Patent Claims + infringed by Covered Code in the absence of Modifications made by + that Contributor. + +3. Distribution Obligations. + + 3.1. Application of License. + The Modifications which You create or to which You contribute are + governed by the terms of this License, including without limitation + Section 2.2. The Source Code version of Covered Code may be + distributed only under the terms of this License or a future version + of this License released under Section 6.1, and You must include a + copy of this License with every copy of the Source Code You + distribute. You may not offer or impose any terms on any Source Code + version that alters or restricts the applicable version of this + License or the recipients' rights hereunder. However, You may include + an additional document offering the additional rights described in + Section 3.5. + + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be + made available in Source Code form under the terms of this License + either on the same media as an Executable version or via an accepted + Electronic Distribution Mechanism to anyone to whom you made an + Executable version available; and if made available via Electronic + Distribution Mechanism, must remain available for at least twelve (12) + months after the date it initially became available, or at least six + (6) months after a subsequent version of that particular Modification + has been made available to such recipients. You are responsible for + ensuring that the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. + You must cause all Covered Code to which You contribute to contain a + file documenting the changes You made to create that Covered Code and + the date of any change. You must include a prominent statement that + the Modification is derived, directly or indirectly, from Original + Code provided by the Initial Developer and including the name of the + Initial Developer in (a) the Source Code, and (b) in any notice in an + Executable version or related documentation in which You describe the + origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party's + intellectual property rights is required to exercise the rights + granted by such Contributor under Sections 2.1 or 2.2, + Contributor must include a text file with the Source Code + distribution titled "LEGAL" which describes the claim and the + party making the claim in sufficient detail that a recipient will + know whom to contact. If Contributor obtains such knowledge after + the Modification is made available as described in Section 3.2, + Contributor shall promptly modify the LEGAL file in all copies + Contributor makes available thereafter and shall take other steps + (such as notifying appropriate mailing lists or newsgroups) + reasonably calculated to inform those who received the Covered + Code that new knowledge has been obtained. + + (b) Contributor APIs. + If Contributor's Modifications include an application programming + interface and Contributor has knowledge of patent licenses which + are reasonably necessary to implement that API, Contributor must + also include this information in the LEGAL file. + + (c) Representations. + Contributor represents that, except as disclosed pursuant to + Section 3.4(a) above, Contributor believes that Contributor's + Modifications are Contributor's original creation(s) and/or + Contributor has sufficient rights to grant the rights conveyed by + this License. + + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source + Code. If it is not possible to put such notice in a particular Source + Code file due to its structure, then You must include such notice in a + location (such as a relevant directory) where a user would be likely + to look for such a notice. If You created one or more Modification(s) + You may add your name as a Contributor to the notice described in + Exhibit A. You must also duplicate this License in any documentation + for the Source Code where You describe recipients' rights or ownership + rights relating to Covered Code. You may choose to offer, and to + charge a fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Code. However, You + may do so only on Your own behalf, and not on behalf of the Initial + Developer or any Contributor. You must make it absolutely clear than + any such warranty, support, indemnity or liability obligation is + offered by You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of warranty, + support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the + requirements of Section 3.1-3.5 have been met for that Covered Code, + and if You include a notice stating that the Source Code version of + the Covered Code is available under the terms of this License, + including a description of how and where You have fulfilled the + obligations of Section 3.2. The notice must be conspicuously included + in any notice in an Executable version, related documentation or + collateral in which You describe recipients' rights relating to the + Covered Code. You may distribute the Executable version of Covered + Code or ownership rights under a license of Your choice, which may + contain terms different from this License, provided that You are in + compliance with the terms of this License and that the license for the + Executable version does not attempt to limit or alter the recipient's + rights in the Source Code version from the rights set forth in this + License. If You distribute the Executable version under a different + license You must make it absolutely clear that any terms which differ + from this License are offered by You alone, not by the Initial + Developer or any Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred by + the Initial Developer or such Contributor as a result of any such + terms You offer. + + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code + not governed by the terms of this License and distribute the Larger + Work as a single product. In such a case, You must make sure the + requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Code due to + statute, judicial order, or regulation then You must: (a) comply with + the terms of this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. Such description + must be included in the LEGAL file described in Section 3.4 and must + be included with all distributions of the Source Code. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + +5. Application of this License. + + This License applies to code to which the Initial Developer has + attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + + 6.1. New Versions. + Netscape Communications Corporation ("Netscape") may publish revised + and/or new versions of the License from time to time. Each version + will be given a distinguishing version number. + + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the + License, You may always continue to use it under the terms of that + version. You may also choose to use such Covered Code under the terms + of any subsequent version of the License published by Netscape. No one + other than Netscape has the right to modify the terms applicable to + Covered Code created under this License. + + 6.3. Derivative Works. + If You create or use a modified version of this License (which you may + only do in order to apply it to code which is not already Covered Code + governed by this License), You must (a) rename Your license so that + the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", + "MPL", "NPL" or any confusingly similar phrase do not appear in your + license (except to note that your license differs from this License) + and (b) otherwise make it clear that Your version of the license + contains terms which differ from the Mozilla Public License and + Netscape Public License. (Filling in the name of the Initial + Developer, Original Code or Contributor in the notice described in + Exhibit A shall not of themselves be deemed to be modifications of + this License.) + +7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF + DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE + IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE + COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + + 8.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to cure + such breach within 30 days of becoming aware of the breach. All + sublicenses to the Covered Code which are properly granted shall + survive any termination of this License. Provisions which, by their + nature, must remain in effect beyond the termination of this License + shall survive. + + 8.2. If You initiate litigation by asserting a patent infringement + claim (excluding declatory judgment actions) against Initial Developer + or a Contributor (the Initial Developer or Contributor against whom + You file such action is referred to as "Participant") alleging that: + + (a) such Participant's Contributor Version directly or indirectly + infringes any patent, then any and all rights granted by such + Participant to You under Sections 2.1 and/or 2.2 of this License + shall, upon 60 days notice from Participant terminate prospectively, + unless if within 60 days after receipt of notice You either: (i) + agree in writing to pay Participant a mutually agreeable reasonable + royalty for Your past and future use of Modifications made by such + Participant, or (ii) withdraw Your litigation claim with respect to + the Contributor Version against such Participant. If within 60 days + of notice, a reasonable royalty and payment arrangement are not + mutually agreed upon in writing by the parties or the litigation claim + is not withdrawn, the rights granted by Participant to You under + Sections 2.1 and/or 2.2 automatically terminate at the expiration of + the 60 day notice period specified above. + + (b) any software, hardware, or device, other than such Participant's + Contributor Version, directly or indirectly infringes any patent, then + any rights granted to You by such Participant under Sections 2.1(b) + and 2.2(b) are revoked effective as of the date You first made, used, + sold, distributed, or had made, Modifications made by that + Participant. + + 8.3. If You assert a patent infringement claim against Participant + alleging that such Participant's Contributor Version directly or + indirectly infringes any patent where such claim is resolved (such as + by license or settlement) prior to the initiation of patent + infringement litigation, then the reasonable value of the licenses + granted by such Participant under Sections 2.1 or 2.2 shall be taken + into account in determining the amount or value of any payment or + license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, + all end user license agreements (excluding distributors and resellers) + which have been validly granted by You or any distributor hereunder + prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL + DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, + OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR + ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY + CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, + WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY + RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW + PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO + THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + + The Covered Code is a "commercial item," as that term is defined in + 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer + software" and "commercial computer software documentation," as such + terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 + C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), + all U.S. Government End Users acquire Covered Code with only those + rights set forth herein. + +11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed by + California law provisions (except to the extent applicable law, if + any, provides otherwise), excluding its conflict-of-law provisions. + With respect to disputes in which at least one party is a citizen of, + or an entity chartered or registered to do business in the United + States of America, any litigation relating to this License shall be + subject to the jurisdiction of the Federal Courts of the Northern + District of California, with venue lying in Santa Clara County, + California, with the losing party responsible for costs, including + without limitation, court costs and reasonable attorneys' fees and + expenses. The application of the United Nations Convention on + Contracts for the International Sale of Goods is expressly excluded. + Any law or regulation which provides that the language of a contract + shall be construed against the drafter shall not apply to this + License. + +12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or indirectly, + out of its utilization of rights under this License and You agree to + work with Initial Developer and Contributors to distribute such + responsibility on an equitable basis. Nothing herein is intended or + shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as + "Multiple-Licensed". "Multiple-Licensed" means that the Initial + Developer permits you to utilize portions of the Covered Code under + Your choice of the NPL or the alternative licenses, if any, specified + by the Initial Developer in the file described in Exhibit A. + +EXHIBIT A -Mozilla Public License. + + ``The contents of this file are subject to the Mozilla Public License + Version 1.1 (the "License"); you may not use this file except in + compliance with the License. You may obtain a copy of the License at + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + License for the specific language governing rights and limitations + under the License. + + The Original Code is ______________________________________. + + The Initial Developer of the Original Code is ________________________. + Portions created by ______________________ are Copyright (C) ______ + _______________________. All Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the terms + of the _____ license (the "[___] License"), in which case the + provisions of [______] License are applicable instead of those + above. If you wish to allow use of your version of this file only + under the terms of the [____] License and not to allow others to use + your version of this file under the MPL, indicate your decision by + deleting the provisions above and replace them with the notice and + other provisions required by the [___] License. If you do not delete + the provisions above, a recipient may use your version of this file + under either the MPL or the [___] License." + + [NOTE: The text of this Exhibit A may differ slightly from the text of + the notices in the Source Code files of the Original Code. You should + use the text of this Exhibit A rather than the text found in the + Original Code Source Code for Your Modifications.] diff --git a/theme/bootstrap/plugins/ckeditor/README.md b/theme/bootstrap/plugins/ckeditor/README.md new file mode 100644 index 0000000..378c267 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/README.md @@ -0,0 +1,39 @@ +CKEditor 4 +========== + +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +http://ckeditor.com - See LICENSE.md for license information. + +CKEditor is a text editor to be used inside web pages. It's not a replacement +for desktop text editors like Word or OpenOffice, but a component to be used as +part of web applications and websites. + +## Documentation + +The full editor documentation is available online at the following address: +http://docs.ckeditor.com + +## Installation + +Installing CKEditor is an easy task. Just follow these simple steps: + + 1. **Download** the latest version from the CKEditor website: + http://ckeditor.com. You should have already completed this step, but be + sure you have the very latest version. + 2. **Extract** (decompress) the downloaded file into the root of your website. + +**Note:** CKEditor is by default installed in the `ckeditor` folder. You can +place the files in whichever you want though. + +## Checking Your Installation + +The editor comes with a few sample pages that can be used to verify that +installation proceeded properly. Take a look at the `samples` directory. + +To test your installation, just call the following page at your website: + + http://<your site>/<CKEditor installation path>/samples/index.html + +For example: + + http://www.example.com/ckeditor/samples/index.html diff --git a/theme/bootstrap/plugins/ckeditor/adapters/jquery.js b/theme/bootstrap/plugins/ckeditor/adapters/jquery.js new file mode 100644 index 0000000..2851ea4 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/adapters/jquery.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(a){CKEDITOR.config.jqueryOverrideVal="undefined"==typeof CKEDITOR.config.jqueryOverrideVal?!0:CKEDITOR.config.jqueryOverrideVal;"undefined"!=typeof a&&(a.extend(a.fn,{ckeditorGet:function(){var a=this.eq(0).data("ckeditorInstance");if(!a)throw"CKEditor is not initialized yet, use ckeditor() with a callback.";return a},ckeditor:function(g,d){if(!CKEDITOR.env.isCompatible)throw Error("The environment is incompatible.");if(!a.isFunction(g))var k=d,d=g,g=k;var i=[],d=d||{};this.each(function(){var b= +a(this),c=b.data("ckeditorInstance"),f=b.data("_ckeditorInstanceLock"),h=this,j=new a.Deferred;i.push(j.promise());if(c&&!f)g&&g.apply(c,[this]),j.resolve();else if(f)c.once("instanceReady",function(){setTimeout(function(){c.element?(c.element.$==h&&g&&g.apply(c,[h]),j.resolve()):setTimeout(arguments.callee,100)},0)},null,null,9999);else{if(d.autoUpdateElement||"undefined"==typeof d.autoUpdateElement&&CKEDITOR.config.autoUpdateElement)d.autoUpdateElementJquery=!0;d.autoUpdateElement=!1;b.data("_ckeditorInstanceLock", +!0);c=a(this).is("textarea")?CKEDITOR.replace(h,d):CKEDITOR.inline(h,d);b.data("ckeditorInstance",c);c.on("instanceReady",function(d){var e=d.editor;setTimeout(function(){if(e.element){d.removeListener();e.on("dataReady",function(){b.trigger("dataReady.ckeditor",[e])});e.on("setData",function(a){b.trigger("setData.ckeditor",[e,a.data])});e.on("getData",function(a){b.trigger("getData.ckeditor",[e,a.data])},999);e.on("destroy",function(){b.trigger("destroy.ckeditor",[e])});e.on("save",function(){a(h.form).submit(); +return!1},null,null,20);if(e.config.autoUpdateElementJquery&&b.is("textarea")&&a(h.form).length){var c=function(){b.ckeditor(function(){e.updateElement()})};a(h.form).submit(c);a(h.form).bind("form-pre-serialize",c);b.bind("destroy.ckeditor",function(){a(h.form).unbind("submit",c);a(h.form).unbind("form-pre-serialize",c)})}e.on("destroy",function(){b.removeData("ckeditorInstance")});b.removeData("_ckeditorInstanceLock");b.trigger("instanceReady.ckeditor",[e]);g&&g.apply(e,[h]);j.resolve()}else setTimeout(arguments.callee, +100)},0)},null,null,9999)}});var f=new a.Deferred;this.promise=f.promise();a.when.apply(this,i).then(function(){f.resolve()});this.editor=this.eq(0).data("ckeditorInstance");return this}}),CKEDITOR.config.jqueryOverrideVal&&(a.fn.val=CKEDITOR.tools.override(a.fn.val,function(g){return function(d){if(arguments.length){var k=this,i=[],f=this.each(function(){var b=a(this),c=b.data("ckeditorInstance");if(b.is("textarea")&&c){var f=new a.Deferred;c.setData(d,function(){f.resolve()});i.push(f.promise()); +return!0}return g.call(b,d)});if(i.length){var b=new a.Deferred;a.when.apply(this,i).done(function(){b.resolveWith(k)});return b.promise()}return f}var f=a(this).eq(0),c=f.data("ckeditorInstance");return f.is("textarea")&&c?c.getData():g.call(f)}})))})(window.jQuery); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/build-config.js b/theme/bootstrap/plugins/ckeditor/build-config.js new file mode 100644 index 0000000..59e52e3 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/build-config.js @@ -0,0 +1,142 @@ + +/** + * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.html or http://ckeditor.com/license + */ + +/** + * This file was added automatically by CKEditor builder. + * You may re-use it at any time at http://ckeditor.com/builder to build CKEditor again. + * + * NOTE: + * This file is not used by CKEditor, you may remove it. + * Changing this file will not change your CKEditor configuration. + */ + +var CKBUILDER_CONFIG = { + skin: 'moono', + preset: 'standard', + ignore: [ + 'dev', + '.gitignore', + '.gitattributes', + 'README.md', + '.mailmap' + ], + plugins : { + 'about' : 1, + 'a11yhelp' : 1, + 'basicstyles' : 1, + 'blockquote' : 1, + 'clipboard' : 1, + 'contextmenu' : 1, + 'resize' : 1, + 'toolbar' : 1, + 'elementspath' : 1, + 'enterkey' : 1, + 'entities' : 1, + 'filebrowser' : 1, + 'floatingspace' : 1, + 'format' : 1, + 'horizontalrule' : 1, + 'htmlwriter' : 1, + 'wysiwygarea' : 1, + 'image' : 1, + 'indentlist' : 1, + 'link' : 1, + 'list' : 1, + 'magicline' : 1, + 'maximize' : 1, + 'pastetext' : 1, + 'pastefromword' : 1, + 'removeformat' : 1, + 'sourcearea' : 1, + 'specialchar' : 1, + 'scayt' : 1, + 'stylescombo' : 1, + 'tab' : 1, + 'table' : 1, + 'tabletools' : 1, + 'undo' : 1, + 'wsc' : 1, + 'dialog' : 1, + 'dialogui' : 1, + 'menu' : 1, + 'floatpanel' : 1, + 'panel' : 1, + 'button' : 1, + 'popup' : 1, + 'richcombo' : 1, + 'listblock' : 1, + 'indent' : 1, + 'fakeobjects' : 1, + 'menubutton' : 1 + }, + languages : { + 'af' : 1, + 'sq' : 1, + 'ar' : 1, + 'eu' : 1, + 'bn' : 1, + 'bs' : 1, + 'bg' : 1, + 'ca' : 1, + 'zh-cn' : 1, + 'zh' : 1, + 'hr' : 1, + 'cs' : 1, + 'da' : 1, + 'nl' : 1, + 'en' : 1, + 'en-au' : 1, + 'en-ca' : 1, + 'en-gb' : 1, + 'eo' : 1, + 'et' : 1, + 'fo' : 1, + 'fi' : 1, + 'fr' : 1, + 'fr-ca' : 1, + 'gl' : 1, + 'ka' : 1, + 'de' : 1, + 'el' : 1, + 'gu' : 1, + 'he' : 1, + 'hi' : 1, + 'hu' : 1, + 'is' : 1, + 'id' : 1, + 'it' : 1, + 'ja' : 1, + 'km' : 1, + 'ko' : 1, + 'ku' : 1, + 'lv' : 1, + 'lt' : 1, + 'mk' : 1, + 'ms' : 1, + 'mn' : 1, + 'no' : 1, + 'nb' : 1, + 'fa' : 1, + 'pl' : 1, + 'pt-br' : 1, + 'pt' : 1, + 'ro' : 1, + 'ru' : 1, + 'sr' : 1, + 'sr-latn' : 1, + 'si' : 1, + 'sk' : 1, + 'sl' : 1, + 'es' : 1, + 'sv' : 1, + 'th' : 1, + 'tr' : 1, + 'ug' : 1, + 'uk' : 1, + 'vi' : 1, + 'cy' : 1 + } +}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/ckeditor.js b/theme/bootstrap/plugins/ckeditor/ckeditor.js new file mode 100644 index 0000000..90b26d8 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/ckeditor.js @@ -0,0 +1,900 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +(function(){if(window.CKEDITOR&&window.CKEDITOR.dom)return;window.CKEDITOR||(window.CKEDITOR=function(){var a={timestamp:"DBAA",version:"4.3.1",revision:"3ecd0b8",rnd:Math.floor(900*Math.random())+100,_:{pending:[]},status:"unloaded",basePath:function(){var b=window.CKEDITOR_BASEPATH||"";if(!b)for(var d=document.getElementsByTagName("script"),a=0;a<d.length;a++){var e=d[a].src.match(/(^|.*[\\\/])ckeditor(?:_basic)?(?:_source)?.js(?:\?.*)?$/i);if(e){b=e[1];break}}-1==b.indexOf(":/")&&(b=0===b.indexOf("/")?location.href.match(/^.*?:\/\/[^\/]*/)[0]+b:location.href.match(/^[^\?]*\/(?:)/)[0]+ +b);if(!b)throw'The CKEditor installation path could not be automatically detected. Please set the global variable "CKEDITOR_BASEPATH" before creating editor instances.';return b}(),getUrl:function(b){-1==b.indexOf(":/")&&0!==b.indexOf("/")&&(b=this.basePath+b);this.timestamp&&("/"!=b.charAt(b.length-1)&&!/[&?]t=/.test(b))&&(b+=(0<=b.indexOf("?")?"&":"?")+"t="+this.timestamp);return b},domReady:function(){function b(){try{document.addEventListener?(document.removeEventListener("DOMContentLoaded",b, +!1),d()):document.attachEvent&&"complete"===document.readyState&&(document.detachEvent("onreadystatechange",b),d())}catch(a){}}function d(){for(var d;d=a.shift();)d()}var a=[];return function(d){a.push(d);"complete"===document.readyState&&setTimeout(b,1);if(1==a.length)if(document.addEventListener)document.addEventListener("DOMContentLoaded",b,!1),window.addEventListener("load",b,!1);else if(document.attachEvent){document.attachEvent("onreadystatechange",b);window.attachEvent("onload",b);d=!1;try{d= +!window.frameElement}catch(e){}if(document.documentElement.doScroll&&d){var i=function(){try{document.documentElement.doScroll("left")}catch(d){setTimeout(i,1);return}b()};i()}}}}()},e=window.CKEDITOR_GETURL;if(e){var b=a.getUrl;a.getUrl=function(c){return e.call(a,c)||b.call(a,c)}}return a}()); +CKEDITOR.event||(CKEDITOR.event=function(){},CKEDITOR.event.implementOn=function(a){var e=CKEDITOR.event.prototype,b;for(b in e)a[b]==void 0&&(a[b]=e[b])},CKEDITOR.event.prototype=function(){function a(a){var d=e(this);return d[a]||(d[a]=new b(a))}var e=function(b){b=b.getPrivate&&b.getPrivate()||b._||(b._={});return b.events||(b.events={})},b=function(b){this.name=b;this.listeners=[]};b.prototype={getListenerIndex:function(b){for(var d=0,a=this.listeners;d<a.length;d++)if(a[d].fn==b)return d;return-1}}; +return{define:function(b,d){var h=a.call(this,b);CKEDITOR.tools.extend(h,d,true)},on:function(b,d,h,e,n){function i(a,f,o,q){a={name:b,sender:this,editor:a,data:f,listenerData:e,stop:o,cancel:q,removeListener:j};return d.call(h,a)===false?false:a.data}function j(){q.removeListener(b,d)}var o=a.call(this,b);if(o.getListenerIndex(d)<0){o=o.listeners;h||(h=this);isNaN(n)&&(n=10);var q=this;i.fn=d;i.priority=n;for(var s=o.length-1;s>=0;s--)if(o[s].priority<=n){o.splice(s+1,0,i);return{removeListener:j}}o.unshift(i)}return{removeListener:j}}, +once:function(){var b=arguments[1];arguments[1]=function(d){d.removeListener();return b.apply(this,arguments)};return this.on.apply(this,arguments)},capture:function(){CKEDITOR.event.useCapture=1;var b=this.on.apply(this,arguments);CKEDITOR.event.useCapture=0;return b},fire:function(){var b=0,d=function(){b=1},a=0,g=function(){a=1};return function(n,i,j){var o=e(this)[n],n=b,q=a;b=a=0;if(o){var s=o.listeners;if(s.length)for(var s=s.slice(0),u,f=0;f<s.length;f++){if(o.errorProof)try{u=s[f].call(this, +j,i,d,g)}catch(p){}else u=s[f].call(this,j,i,d,g);u===false?a=1:typeof u!="undefined"&&(i=u);if(b||a)break}}i=a?false:typeof i=="undefined"?true:i;b=n;a=q;return i}}(),fireOnce:function(b,d,a){d=this.fire(b,d,a);delete e(this)[b];return d},removeListener:function(b,d){var a=e(this)[b];if(a){var g=a.getListenerIndex(d);g>=0&&a.listeners.splice(g,1)}},removeAllListeners:function(){var b=e(this),d;for(d in b)delete b[d]},hasListeners:function(b){return(b=e(this)[b])&&b.listeners.length>0}}}()); +CKEDITOR.editor||(CKEDITOR.editor=function(){CKEDITOR._.pending.push([this,arguments]);CKEDITOR.event.call(this)},CKEDITOR.editor.prototype.fire=function(a,e){a in{instanceReady:1,loaded:1}&&(this[a]=true);return CKEDITOR.event.prototype.fire.call(this,a,e,this)},CKEDITOR.editor.prototype.fireOnce=function(a,e){a in{instanceReady:1,loaded:1}&&(this[a]=true);return CKEDITOR.event.prototype.fireOnce.call(this,a,e,this)},CKEDITOR.event.implementOn(CKEDITOR.editor.prototype)); +CKEDITOR.env||(CKEDITOR.env=function(){var a=navigator.userAgent.toLowerCase(),e=window.opera,b={ie:a.indexOf("trident/")>-1,opera:!!e&&e.version,webkit:a.indexOf(" applewebkit/")>-1,air:a.indexOf(" adobeair/")>-1,mac:a.indexOf("macintosh")>-1,quirks:document.compatMode=="BackCompat"&&(!document.documentMode||document.documentMode<10),mobile:a.indexOf("mobile")>-1,iOS:/(ipad|iphone|ipod)/.test(a),isCustomDomain:function(){if(!this.ie)return false;var d=document.domain,b=window.location.hostname;return d!= +b&&d!="["+b+"]"},secure:location.protocol=="https:"};b.gecko=navigator.product=="Gecko"&&!b.webkit&&!b.opera&&!b.ie;if(b.webkit)a.indexOf("chrome")>-1?b.chrome=true:b.safari=true;var c=0;if(b.ie){c=b.quirks||!document.documentMode?parseFloat(a.match(/msie (\d+)/)[1]):document.documentMode;b.ie9Compat=c==9;b.ie8Compat=c==8;b.ie7Compat=c==7;b.ie6Compat=c<7||b.quirks}if(b.gecko){var d=a.match(/rv:([\d\.]+)/);if(d){d=d[1].split(".");c=d[0]*1E4+(d[1]||0)*100+(d[2]||0)*1}}b.opera&&(c=parseFloat(e.version())); +b.air&&(c=parseFloat(a.match(/ adobeair\/(\d+)/)[1]));b.webkit&&(c=parseFloat(a.match(/ applewebkit\/(\d+)/)[1]));b.version=c;b.isCompatible=b.iOS&&c>=534||!b.mobile&&(b.ie&&c>6||b.gecko&&c>=10801||b.opera&&c>=9.5||b.air&&c>=1||b.webkit&&c>=522||false);b.hidpi=window.devicePixelRatio>=2;b.needsBrFiller=b.gecko||b.webkit||b.ie&&c>10;b.needsNbspFiller=b.ie&&c<11;b.cssClass="cke_browser_"+(b.ie?"ie":b.gecko?"gecko":b.opera?"opera":b.webkit?"webkit":"unknown");if(b.quirks)b.cssClass=b.cssClass+" cke_browser_quirks"; +if(b.ie){b.cssClass=b.cssClass+(" cke_browser_ie"+(b.quirks||b.version<7?"6":b.version));if(b.quirks)b.cssClass=b.cssClass+" cke_browser_iequirks"}if(b.gecko)if(c<10900)b.cssClass=b.cssClass+" cke_browser_gecko18";else if(c<=11E3)b.cssClass=b.cssClass+" cke_browser_gecko19";if(b.air)b.cssClass=b.cssClass+" cke_browser_air";if(b.iOS)b.cssClass=b.cssClass+" cke_browser_ios";if(b.hidpi)b.cssClass=b.cssClass+" cke_hidpi";return b}()); +"unloaded"==CKEDITOR.status&&function(){CKEDITOR.event.implementOn(CKEDITOR);CKEDITOR.loadFullCore=function(){if(CKEDITOR.status!="basic_ready")CKEDITOR.loadFullCore._load=1;else{delete CKEDITOR.loadFullCore;var a=document.createElement("script");a.type="text/javascript";a.src=CKEDITOR.basePath+"ckeditor.js";document.getElementsByTagName("head")[0].appendChild(a)}};CKEDITOR.loadFullCoreTimeout=0;CKEDITOR.add=function(a){(this._.pending||(this._.pending=[])).push(a)};(function(){CKEDITOR.domReady(function(){var a= +CKEDITOR.loadFullCore,e=CKEDITOR.loadFullCoreTimeout;if(a){CKEDITOR.status="basic_ready";a&&a._load?a():e&&setTimeout(function(){CKEDITOR.loadFullCore&&CKEDITOR.loadFullCore()},e*1E3)}})})();CKEDITOR.status="basic_loaded"}();CKEDITOR.dom={}; +(function(){var a=[],e=CKEDITOR.env.gecko?"-moz-":CKEDITOR.env.webkit?"-webkit-":CKEDITOR.env.opera?"-o-":CKEDITOR.env.ie?"-ms-":"";CKEDITOR.on("reset",function(){a=[]});CKEDITOR.tools={arrayCompare:function(b,a){if(!b&&!a)return true;if(!b||!a||b.length!=a.length)return false;for(var d=0;d<b.length;d++)if(b[d]!=a[d])return false;return true},clone:function(b){var a;if(b&&b instanceof Array){a=[];for(var d=0;d<b.length;d++)a[d]=CKEDITOR.tools.clone(b[d]);return a}if(b===null||typeof b!="object"|| +b instanceof String||b instanceof Number||b instanceof Boolean||b instanceof Date||b instanceof RegExp)return b;a=new b.constructor;for(d in b)a[d]=CKEDITOR.tools.clone(b[d]);return a},capitalize:function(b,a){return b.charAt(0).toUpperCase()+(a?b.slice(1):b.slice(1).toLowerCase())},extend:function(b){var a=arguments.length,d,h;if(typeof(d=arguments[a-1])=="boolean")a--;else if(typeof(d=arguments[a-2])=="boolean"){h=arguments[a-1];a=a-2}for(var e=1;e<a;e++){var n=arguments[e],i;for(i in n)if(d=== +true||b[i]==void 0)if(!h||i in h)b[i]=n[i]}return b},prototypedCopy:function(b){var a=function(){};a.prototype=b;return new a},copy:function(b){var a={},d;for(d in b)a[d]=b[d];return a},isArray:function(b){return Object.prototype.toString.call(b)=="[object Array]"},isEmpty:function(b){for(var a in b)if(b.hasOwnProperty(a))return false;return true},cssVendorPrefix:function(b,a,d){if(d)return e+b+":"+a+";"+b+":"+a;d={};d[b]=a;d[e+b]=a;return d},cssStyleToDomStyle:function(){var b=document.createElement("div").style, +a=typeof b.cssFloat!="undefined"?"cssFloat":typeof b.styleFloat!="undefined"?"styleFloat":"float";return function(d){return d=="float"?a:d.replace(/-./g,function(d){return d.substr(1).toUpperCase()})}}(),buildStyleHtml:function(b){for(var b=[].concat(b),a,d=[],h=0;h<b.length;h++)if(a=b[h])/@import|[{}]/.test(a)?d.push("<style>"+a+"</style>"):d.push('<link type="text/css" rel=stylesheet href="'+a+'">');return d.join("")},htmlEncode:function(b){return(""+b).replace(/&/g,"&amp;").replace(/>/g,"&gt;").replace(/</g, +"&lt;")},htmlEncodeAttr:function(b){return b.replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")},htmlDecodeAttr:function(b){return b.replace(/&quot;/g,'"').replace(/&lt;/g,"<").replace(/&gt;/g,">")},getNextNumber:function(){var b=0;return function(){return++b}}(),getNextId:function(){return"cke_"+this.getNextNumber()},override:function(b,a){var d=a(b);d.prototype=b.prototype;return d},setTimeout:function(b,a,d,h,e){e||(e=window);d||(d=e);return e.setTimeout(function(){h?b.apply(d,[].concat(h)): +b.apply(d)},a||0)},trim:function(){var b=/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;return function(a){return a.replace(b,"")}}(),ltrim:function(){var b=/^[ \t\n\r]+/g;return function(a){return a.replace(b,"")}}(),rtrim:function(){var b=/[ \t\n\r]+$/g;return function(a){return a.replace(b,"")}}(),indexOf:function(b,a){if(typeof a=="function")for(var d=0,h=b.length;d<h;d++){if(a(b[d]))return d}else{if(b.indexOf)return b.indexOf(a);d=0;for(h=b.length;d<h;d++)if(b[d]===a)return d}return-1},search:function(b, +a){var d=CKEDITOR.tools.indexOf(b,a);return d>=0?b[d]:null},bind:function(b,a){return function(){return b.apply(a,arguments)}},createClass:function(b){var a=b.$,d=b.base,h=b.privates||b._,e=b.proto,b=b.statics;!a&&(a=function(){d&&this.base.apply(this,arguments)});if(h)var n=a,a=function(){var d=this._||(this._={}),a;for(a in h){var b=h[a];d[a]=typeof b=="function"?CKEDITOR.tools.bind(b,this):b}n.apply(this,arguments)};if(d){a.prototype=this.prototypedCopy(d.prototype);a.prototype.constructor=a;a.base= +d;a.baseProto=d.prototype;a.prototype.base=function(){this.base=d.prototype.base;d.apply(this,arguments);this.base=arguments.callee}}e&&this.extend(a.prototype,e,true);b&&this.extend(a,b,true);return a},addFunction:function(b,c){return a.push(function(){return b.apply(c||this,arguments)})-1},removeFunction:function(b){a[b]=null},callFunction:function(b){var c=a[b];return c&&c.apply(window,Array.prototype.slice.call(arguments,1))},cssLength:function(){var a=/^-?\d+\.?\d*px$/,c;return function(d){c= +CKEDITOR.tools.trim(d+"")+"px";return a.test(c)?c:d||""}}(),convertToPx:function(){var a;return function(c){if(!a){a=CKEDITOR.dom.element.createFromHtml('<div style="position:absolute;left:-9999px;top:-9999px;margin:0px;padding:0px;border:0px;"></div>',CKEDITOR.document);CKEDITOR.document.getBody().append(a)}if(!/%$/.test(c)){a.setStyle("width",c);return a.$.clientWidth}return c}}(),repeat:function(a,c){return Array(c+1).join(a)},tryThese:function(){for(var a,c=0,d=arguments.length;c<d;c++){var h= +arguments[c];try{a=h();break}catch(e){}}return a},genKey:function(){return Array.prototype.slice.call(arguments).join("-")},defer:function(a){return function(){var c=arguments,d=this;window.setTimeout(function(){a.apply(d,c)},0)}},normalizeCssText:function(a,c){var d=[],h,e=CKEDITOR.tools.parseCssText(a,true,c);for(h in e)d.push(h+":"+e[h]);d.sort();return d.length?d.join(";")+";":""},convertRgbToHex:function(a){return a.replace(/(?:rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\))/gi,function(a,d,b,e){a= +[d,b,e];for(d=0;d<3;d++)a[d]=("0"+parseInt(a[d],10).toString(16)).slice(-2);return"#"+a.join("")})},parseCssText:function(a,c,d){var h={};if(d){d=new CKEDITOR.dom.element("span");d.setAttribute("style",a);a=CKEDITOR.tools.convertRgbToHex(d.getAttribute("style")||"")}if(!a||a==";")return h;a.replace(/&quot;/g,'"').replace(/\s*([^:;\s]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(a,d,b){if(c){d=d.toLowerCase();d=="font-family"&&(b=b.toLowerCase().replace(/["']/g,"").replace(/\s*,\s*/g,","));b=CKEDITOR.tools.trim(b)}h[d]= +b});return h},writeCssText:function(a,c){var d,h=[];for(d in a)h.push(d+":"+a[d]);c&&h.sort();return h.join("; ")},objectCompare:function(a,c,d){var h;if(!a&&!c)return true;if(!a||!c)return false;for(h in a)if(a[h]!=c[h])return false;if(!d)for(h in c)if(a[h]!=c[h])return false;return true},objectKeys:function(a){var c=[],d;for(d in a)c.push(d);return c},convertArrayToObject:function(a,c){var d={};arguments.length==1&&(c=true);for(var h=0,e=a.length;h<e;++h)d[a[h]]=c;return d},fixDomain:function(){for(var a;;)try{a= +window.parent.document.domain;break}catch(c){a=a?a.replace(/.+?(?:\.|$)/,""):document.domain;if(!a)break;document.domain=a}return!!a},eventsBuffer:function(a,c){function d(){e=(new Date).getTime();h=false;c()}var h,e=0;return{input:function(){if(!h){var c=(new Date).getTime()-e;c<a?h=setTimeout(d,a-c):d()}},reset:function(){h&&clearTimeout(h);h=e=0}}},enableHtml5Elements:function(a,c){for(var d=["abbr","article","aside","audio","bdi","canvas","data","datalist","details","figcaption","figure","footer", +"header","hgroup","mark","meter","nav","output","progress","section","summary","time","video"],h=d.length,e;h--;){e=a.createElement(d[h]);c&&a.appendChild(e)}}}})(); +CKEDITOR.dtd=function(){var a=CKEDITOR.tools.extend,e=function(a,d){for(var b=CKEDITOR.tools.clone(a),h=1;h<arguments.length;h++){var d=arguments[h],c;for(c in d)delete b[c]}return b},b={},c={},d={address:1,article:1,aside:1,blockquote:1,details:1,div:1,dl:1,fieldset:1,figure:1,footer:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,header:1,hgroup:1,hr:1,menu:1,nav:1,ol:1,p:1,pre:1,section:1,table:1,ul:1},h={command:1,link:1,meta:1,noscript:1,script:1,style:1},g={},n={"#":1},i={center:1,dir:1,noframes:1}; +a(b,{a:1,abbr:1,area:1,audio:1,b:1,bdi:1,bdo:1,br:1,button:1,canvas:1,cite:1,code:1,command:1,datalist:1,del:1,dfn:1,em:1,embed:1,i:1,iframe:1,img:1,input:1,ins:1,kbd:1,keygen:1,label:1,map:1,mark:1,meter:1,noscript:1,object:1,output:1,progress:1,q:1,ruby:1,s:1,samp:1,script:1,select:1,small:1,span:1,strong:1,sub:1,sup:1,textarea:1,time:1,u:1,"var":1,video:1,wbr:1},n,{acronym:1,applet:1,basefont:1,big:1,font:1,isindex:1,strike:1,style:1,tt:1});a(c,d,b,i);e={a:e(b,{a:1,button:1}),abbr:b,address:c, +area:g,article:a({style:1},c),aside:a({style:1},c),audio:a({source:1,track:1},c),b:b,base:g,bdi:b,bdo:b,blockquote:c,body:c,br:g,button:e(b,{a:1,button:1}),canvas:b,caption:c,cite:b,code:b,col:g,colgroup:{col:1},command:g,datalist:a({option:1},b),dd:c,del:b,details:a({summary:1},c),dfn:b,div:a({style:1},c),dl:{dt:1,dd:1},dt:c,em:b,embed:g,fieldset:a({legend:1},c),figcaption:c,figure:a({figcaption:1},c),footer:c,form:c,h1:b,h2:b,h3:b,h4:b,h5:b,h6:b,head:a({title:1,base:1},h),header:c,hgroup:{h1:1, +h2:1,h3:1,h4:1,h5:1,h6:1},hr:g,html:a({head:1,body:1},c,h),i:b,iframe:n,img:g,input:g,ins:b,kbd:b,keygen:g,label:b,legend:b,li:c,link:g,map:c,mark:b,menu:a({li:1},c),meta:g,meter:e(b,{meter:1}),nav:c,noscript:a({link:1,meta:1,style:1},b),object:a({param:1},b),ol:{li:1},optgroup:{option:1},option:n,output:b,p:b,param:g,pre:b,progress:e(b,{progress:1}),q:b,rp:b,rt:b,ruby:a({rp:1,rt:1},b),s:b,samp:b,script:n,section:a({style:1},c),select:{optgroup:1,option:1},small:b,source:g,span:b,strong:b,style:n, +sub:b,summary:b,sup:b,table:{caption:1,colgroup:1,thead:1,tfoot:1,tbody:1,tr:1},tbody:{tr:1},td:c,textarea:n,tfoot:{tr:1},th:c,thead:{tr:1},time:e(b,{time:1}),title:n,tr:{th:1,td:1},track:g,u:b,ul:{li:1},"var":b,video:a({source:1,track:1},c),wbr:g,acronym:b,applet:a({param:1},c),basefont:g,big:b,center:c,dialog:g,dir:{li:1},font:b,isindex:g,noframes:c,strike:b,tt:b};a(e,{$block:a({audio:1,dd:1,dt:1,figcaption:1,li:1,video:1},d,i),$blockLimit:{article:1,aside:1,audio:1,body:1,caption:1,details:1,dir:1, +div:1,dl:1,fieldset:1,figcaption:1,figure:1,footer:1,form:1,header:1,hgroup:1,menu:1,nav:1,ol:1,section:1,table:1,td:1,th:1,tr:1,ul:1,video:1},$cdata:{script:1,style:1},$editable:{address:1,article:1,aside:1,blockquote:1,body:1,details:1,div:1,fieldset:1,figcaption:1,footer:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,header:1,hgroup:1,nav:1,p:1,pre:1,section:1},$empty:{area:1,base:1,basefont:1,br:1,col:1,command:1,dialog:1,embed:1,hr:1,img:1,input:1,isindex:1,keygen:1,link:1,meta:1,param:1,source:1,track:1, +wbr:1},$inline:b,$list:{dl:1,ol:1,ul:1},$listItem:{dd:1,dt:1,li:1},$nonBodyContent:a({body:1,head:1,html:1},e.head),$nonEditable:{applet:1,audio:1,button:1,embed:1,iframe:1,map:1,object:1,option:1,param:1,script:1,textarea:1,video:1},$object:{applet:1,audio:1,button:1,hr:1,iframe:1,img:1,input:1,object:1,select:1,table:1,textarea:1,video:1},$removeEmpty:{abbr:1,acronym:1,b:1,bdi:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,mark:1,meter:1,output:1,q:1,ruby:1,s:1,samp:1, +small:1,span:1,strike:1,strong:1,sub:1,sup:1,time:1,tt:1,u:1,"var":1},$tabIndex:{a:1,area:1,button:1,input:1,object:1,select:1,textarea:1},$tableContent:{caption:1,col:1,colgroup:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1},$transparent:{a:1,audio:1,canvas:1,del:1,ins:1,map:1,noscript:1,object:1,video:1},$intermediate:{caption:1,colgroup:1,dd:1,dt:1,figcaption:1,legend:1,li:1,optgroup:1,option:1,rp:1,rt:1,summary:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1}});return e}(); +CKEDITOR.dom.event=function(a){this.$=a}; +CKEDITOR.dom.event.prototype={getKey:function(){return this.$.keyCode||this.$.which},getKeystroke:function(){var a=this.getKey();if(this.$.ctrlKey||this.$.metaKey)a=a+CKEDITOR.CTRL;this.$.shiftKey&&(a=a+CKEDITOR.SHIFT);this.$.altKey&&(a=a+CKEDITOR.ALT);return a},preventDefault:function(a){var e=this.$;e.preventDefault?e.preventDefault():e.returnValue=false;a&&this.stopPropagation()},stopPropagation:function(){var a=this.$;a.stopPropagation?a.stopPropagation():a.cancelBubble=true},getTarget:function(){var a= +this.$.target||this.$.srcElement;return a?new CKEDITOR.dom.node(a):null},getPhase:function(){return this.$.eventPhase||2},getPageOffset:function(){var a=this.getTarget().getDocument().$;return{x:this.$.pageX||this.$.clientX+(a.documentElement.scrollLeft||a.body.scrollLeft),y:this.$.pageY||this.$.clientY+(a.documentElement.scrollTop||a.body.scrollTop)}}};CKEDITOR.CTRL=1114112;CKEDITOR.SHIFT=2228224;CKEDITOR.ALT=4456448;CKEDITOR.EVENT_PHASE_CAPTURING=1;CKEDITOR.EVENT_PHASE_AT_TARGET=2; +CKEDITOR.EVENT_PHASE_BUBBLING=3;CKEDITOR.dom.domObject=function(a){if(a)this.$=a}; +CKEDITOR.dom.domObject.prototype=function(){var a=function(a,b){return function(c){typeof CKEDITOR!="undefined"&&a.fire(b,new CKEDITOR.dom.event(c))}};return{getPrivate:function(){var a;if(!(a=this.getCustomData("_")))this.setCustomData("_",a={});return a},on:function(e){var b=this.getCustomData("_cke_nativeListeners");if(!b){b={};this.setCustomData("_cke_nativeListeners",b)}if(!b[e]){b=b[e]=a(this,e);this.$.addEventListener?this.$.addEventListener(e,b,!!CKEDITOR.event.useCapture):this.$.attachEvent&& +this.$.attachEvent("on"+e,b)}return CKEDITOR.event.prototype.on.apply(this,arguments)},removeListener:function(a){CKEDITOR.event.prototype.removeListener.apply(this,arguments);if(!this.hasListeners(a)){var b=this.getCustomData("_cke_nativeListeners"),c=b&&b[a];if(c){this.$.removeEventListener?this.$.removeEventListener(a,c,false):this.$.detachEvent&&this.$.detachEvent("on"+a,c);delete b[a]}}},removeAllListeners:function(){var a=this.getCustomData("_cke_nativeListeners"),b;for(b in a){var c=a[b];this.$.detachEvent? +this.$.detachEvent("on"+b,c):this.$.removeEventListener&&this.$.removeEventListener(b,c,false);delete a[b]}}}}(); +(function(a){var e={};CKEDITOR.on("reset",function(){e={}});a.equals=function(a){try{return a&&a.$===this.$}catch(c){return false}};a.setCustomData=function(a,c){var d=this.getUniqueId();(e[d]||(e[d]={}))[a]=c;return this};a.getCustomData=function(a){var c=this.$["data-cke-expando"];return(c=c&&e[c])&&a in c?c[a]:null};a.removeCustomData=function(a){var c=this.$["data-cke-expando"],c=c&&e[c],d,h;if(c){d=c[a];h=a in c;delete c[a]}return h?d:null};a.clearCustomData=function(){this.removeAllListeners(); +var a=this.$["data-cke-expando"];a&&delete e[a]};a.getUniqueId=function(){return this.$["data-cke-expando"]||(this.$["data-cke-expando"]=CKEDITOR.tools.getNextNumber())};CKEDITOR.event.implementOn(a)})(CKEDITOR.dom.domObject.prototype); +CKEDITOR.dom.node=function(a){return a?new CKEDITOR.dom[a.nodeType==CKEDITOR.NODE_DOCUMENT?"document":a.nodeType==CKEDITOR.NODE_ELEMENT?"element":a.nodeType==CKEDITOR.NODE_TEXT?"text":a.nodeType==CKEDITOR.NODE_COMMENT?"comment":a.nodeType==CKEDITOR.NODE_DOCUMENT_FRAGMENT?"documentFragment":"domObject"](a):this};CKEDITOR.dom.node.prototype=new CKEDITOR.dom.domObject;CKEDITOR.NODE_ELEMENT=1;CKEDITOR.NODE_DOCUMENT=9;CKEDITOR.NODE_TEXT=3;CKEDITOR.NODE_COMMENT=8;CKEDITOR.NODE_DOCUMENT_FRAGMENT=11; +CKEDITOR.POSITION_IDENTICAL=0;CKEDITOR.POSITION_DISCONNECTED=1;CKEDITOR.POSITION_FOLLOWING=2;CKEDITOR.POSITION_PRECEDING=4;CKEDITOR.POSITION_IS_CONTAINED=8;CKEDITOR.POSITION_CONTAINS=16; +CKEDITOR.tools.extend(CKEDITOR.dom.node.prototype,{appendTo:function(a,e){a.append(this,e);return a},clone:function(a,e){var b=this.$.cloneNode(a),c=function(d){d["data-cke-expando"]&&(d["data-cke-expando"]=false);if(d.nodeType==CKEDITOR.NODE_ELEMENT){e||d.removeAttribute("id",false);if(a)for(var d=d.childNodes,b=0;b<d.length;b++)c(d[b])}};c(b);return new CKEDITOR.dom.node(b)},hasPrevious:function(){return!!this.$.previousSibling},hasNext:function(){return!!this.$.nextSibling},insertAfter:function(a){a.$.parentNode.insertBefore(this.$, +a.$.nextSibling);return a},insertBefore:function(a){a.$.parentNode.insertBefore(this.$,a.$);return a},insertBeforeMe:function(a){this.$.parentNode.insertBefore(a.$,this.$);return a},getAddress:function(a){for(var e=[],b=this.getDocument().$.documentElement,c=this.$;c&&c!=b;){var d=c.parentNode;d&&e.unshift(this.getIndex.call({$:c},a));c=d}return e},getDocument:function(){return new CKEDITOR.dom.document(this.$.ownerDocument||this.$.parentNode.ownerDocument)},getIndex:function(a){var e=this.$,b=-1, +c;if(!this.$.parentNode)return b;do if(!a||!(e!=this.$&&e.nodeType==CKEDITOR.NODE_TEXT&&(c||!e.nodeValue))){b++;c=e.nodeType==CKEDITOR.NODE_TEXT}while(e=e.previousSibling);return b},getNextSourceNode:function(a,e,b){if(b&&!b.call)var c=b,b=function(a){return!a.equals(c)};var a=!a&&this.getFirst&&this.getFirst(),d;if(!a){if(this.type==CKEDITOR.NODE_ELEMENT&&b&&b(this,true)===false)return null;a=this.getNext()}for(;!a&&(d=(d||this).getParent());){if(b&&b(d,true)===false)return null;a=d.getNext()}return!a|| +b&&b(a)===false?null:e&&e!=a.type?a.getNextSourceNode(false,e,b):a},getPreviousSourceNode:function(a,e,b){if(b&&!b.call)var c=b,b=function(a){return!a.equals(c)};var a=!a&&this.getLast&&this.getLast(),d;if(!a){if(this.type==CKEDITOR.NODE_ELEMENT&&b&&b(this,true)===false)return null;a=this.getPrevious()}for(;!a&&(d=(d||this).getParent());){if(b&&b(d,true)===false)return null;a=d.getPrevious()}return!a||b&&b(a)===false?null:e&&a.type!=e?a.getPreviousSourceNode(false,e,b):a},getPrevious:function(a){var e= +this.$,b;do b=(e=e.previousSibling)&&e.nodeType!=10&&new CKEDITOR.dom.node(e);while(b&&a&&!a(b));return b},getNext:function(a){var e=this.$,b;do b=(e=e.nextSibling)&&new CKEDITOR.dom.node(e);while(b&&a&&!a(b));return b},getParent:function(a){var e=this.$.parentNode;return e&&(e.nodeType==CKEDITOR.NODE_ELEMENT||a&&e.nodeType==CKEDITOR.NODE_DOCUMENT_FRAGMENT)?new CKEDITOR.dom.node(e):null},getParents:function(a){var e=this,b=[];do b[a?"push":"unshift"](e);while(e=e.getParent());return b},getCommonAncestor:function(a){if(a.equals(this))return this; +if(a.contains&&a.contains(this))return a;var e=this.contains?this:this.getParent();do if(e.contains(a))return e;while(e=e.getParent());return null},getPosition:function(a){var e=this.$,b=a.$;if(e.compareDocumentPosition)return e.compareDocumentPosition(b);if(e==b)return CKEDITOR.POSITION_IDENTICAL;if(this.type==CKEDITOR.NODE_ELEMENT&&a.type==CKEDITOR.NODE_ELEMENT){if(e.contains){if(e.contains(b))return CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_PRECEDING;if(b.contains(e))return CKEDITOR.POSITION_IS_CONTAINED+ +CKEDITOR.POSITION_FOLLOWING}if("sourceIndex"in e)return e.sourceIndex<0||b.sourceIndex<0?CKEDITOR.POSITION_DISCONNECTED:e.sourceIndex<b.sourceIndex?CKEDITOR.POSITION_PRECEDING:CKEDITOR.POSITION_FOLLOWING}for(var e=this.getAddress(),a=a.getAddress(),b=Math.min(e.length,a.length),c=0;c<=b-1;c++)if(e[c]!=a[c]){if(c<b)return e[c]<a[c]?CKEDITOR.POSITION_PRECEDING:CKEDITOR.POSITION_FOLLOWING;break}return e.length<a.length?CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_PRECEDING:CKEDITOR.POSITION_IS_CONTAINED+ +CKEDITOR.POSITION_FOLLOWING},getAscendant:function(a,e){var b=this.$,c;if(!e)b=b.parentNode;for(;b;){if(b.nodeName&&(c=b.nodeName.toLowerCase(),typeof a=="string"?c==a:c in a))return new CKEDITOR.dom.node(b);try{b=b.parentNode}catch(d){b=null}}return null},hasAscendant:function(a,e){var b=this.$;if(!e)b=b.parentNode;for(;b;){if(b.nodeName&&b.nodeName.toLowerCase()==a)return true;b=b.parentNode}return false},move:function(a,e){a.append(this.remove(),e)},remove:function(a){var e=this.$,b=e.parentNode; +if(b){if(a)for(;a=e.firstChild;)b.insertBefore(e.removeChild(a),e);b.removeChild(e)}return this},replace:function(a){this.insertBefore(a);a.remove()},trim:function(){this.ltrim();this.rtrim()},ltrim:function(){for(var a;this.getFirst&&(a=this.getFirst());){if(a.type==CKEDITOR.NODE_TEXT){var e=CKEDITOR.tools.ltrim(a.getText()),b=a.getLength();if(e){if(e.length<b){a.split(b-e.length);this.$.removeChild(this.$.firstChild)}}else{a.remove();continue}}break}},rtrim:function(){for(var a;this.getLast&&(a= +this.getLast());){if(a.type==CKEDITOR.NODE_TEXT){var e=CKEDITOR.tools.rtrim(a.getText()),b=a.getLength();if(e){if(e.length<b){a.split(e.length);this.$.lastChild.parentNode.removeChild(this.$.lastChild)}}else{a.remove();continue}}break}if(CKEDITOR.env.needsBrFiller)(a=this.$.lastChild)&&(a.type==1&&a.nodeName.toLowerCase()=="br")&&a.parentNode.removeChild(a)},isReadOnly:function(){var a=this;this.type!=CKEDITOR.NODE_ELEMENT&&(a=this.getParent());if(a&&typeof a.$.isContentEditable!="undefined")return!(a.$.isContentEditable|| +a.data("cke-editable"));for(;a;){if(a.data("cke-editable"))break;if(a.getAttribute("contentEditable")=="false")return true;if(a.getAttribute("contentEditable")=="true")break;a=a.getParent()}return!a}});CKEDITOR.dom.window=function(a){CKEDITOR.dom.domObject.call(this,a)};CKEDITOR.dom.window.prototype=new CKEDITOR.dom.domObject; +CKEDITOR.tools.extend(CKEDITOR.dom.window.prototype,{focus:function(){this.$.focus()},getViewPaneSize:function(){var a=this.$.document,e=a.compatMode=="CSS1Compat";return{width:(e?a.documentElement.clientWidth:a.body.clientWidth)||0,height:(e?a.documentElement.clientHeight:a.body.clientHeight)||0}},getScrollPosition:function(){var a=this.$;if("pageXOffset"in a)return{x:a.pageXOffset||0,y:a.pageYOffset||0};a=a.document;return{x:a.documentElement.scrollLeft||a.body.scrollLeft||0,y:a.documentElement.scrollTop|| +a.body.scrollTop||0}},getFrame:function(){var a=this.$.frameElement;return a?new CKEDITOR.dom.element.get(a):null}});CKEDITOR.dom.document=function(a){CKEDITOR.dom.domObject.call(this,a)};CKEDITOR.dom.document.prototype=new CKEDITOR.dom.domObject; +CKEDITOR.tools.extend(CKEDITOR.dom.document.prototype,{type:CKEDITOR.NODE_DOCUMENT,appendStyleSheet:function(a){if(this.$.createStyleSheet)this.$.createStyleSheet(a);else{var e=new CKEDITOR.dom.element("link");e.setAttributes({rel:"stylesheet",type:"text/css",href:a});this.getHead().append(e)}},appendStyleText:function(a){if(this.$.createStyleSheet){var e=this.$.createStyleSheet("");e.cssText=a}else{var b=new CKEDITOR.dom.element("style",this);b.append(new CKEDITOR.dom.text(a,this));this.getHead().append(b)}return e|| +b.$.sheet},createElement:function(a,e){var b=new CKEDITOR.dom.element(a,this);if(e){e.attributes&&b.setAttributes(e.attributes);e.styles&&b.setStyles(e.styles)}return b},createText:function(a){return new CKEDITOR.dom.text(a,this)},focus:function(){this.getWindow().focus()},getActive:function(){return new CKEDITOR.dom.element(this.$.activeElement)},getById:function(a){return(a=this.$.getElementById(a))?new CKEDITOR.dom.element(a):null},getByAddress:function(a,e){for(var b=this.$.documentElement,c= +0;b&&c<a.length;c++){var d=a[c];if(e)for(var h=-1,g=0;g<b.childNodes.length;g++){var n=b.childNodes[g];if(!(e===true&&n.nodeType==3&&n.previousSibling&&n.previousSibling.nodeType==3)){h++;if(h==d){b=n;break}}}else b=b.childNodes[d]}return b?new CKEDITOR.dom.node(b):null},getElementsByTag:function(a,e){if((!CKEDITOR.env.ie||document.documentMode>8)&&e)a=e+":"+a;return new CKEDITOR.dom.nodeList(this.$.getElementsByTagName(a))},getHead:function(){var a=this.$.getElementsByTagName("head")[0];return a= +a?new CKEDITOR.dom.element(a):this.getDocumentElement().append(new CKEDITOR.dom.element("head"),true)},getBody:function(){return new CKEDITOR.dom.element(this.$.body)},getDocumentElement:function(){return new CKEDITOR.dom.element(this.$.documentElement)},getWindow:function(){return new CKEDITOR.dom.window(this.$.parentWindow||this.$.defaultView)},write:function(a){this.$.open("text/html","replace");CKEDITOR.env.ie&&(a=a.replace(/(?:^\s*<!DOCTYPE[^>]*?>)|^/i,'$&\n<script data-cke-temp="1">('+CKEDITOR.tools.fixDomain+ +")();<\/script>"));this.$.write(a);this.$.close()},find:function(a){return new CKEDITOR.dom.nodeList(this.$.querySelectorAll(a))},findOne:function(a){return(a=this.$.querySelector(a))?new CKEDITOR.dom.element(a):null},_getHtml5ShivFrag:function(){var a=this.getCustomData("html5ShivFrag");if(!a){a=this.$.createDocumentFragment();CKEDITOR.tools.enableHtml5Elements(a,true);this.setCustomData("html5ShivFrag",a)}return a}});CKEDITOR.dom.nodeList=function(a){this.$=a}; +CKEDITOR.dom.nodeList.prototype={count:function(){return this.$.length},getItem:function(a){if(a<0||a>=this.$.length)return null;return(a=this.$[a])?new CKEDITOR.dom.node(a):null}};CKEDITOR.dom.element=function(a,e){typeof a=="string"&&(a=(e?e.$:document).createElement(a));CKEDITOR.dom.domObject.call(this,a)};CKEDITOR.dom.element.get=function(a){return(a=typeof a=="string"?document.getElementById(a)||document.getElementsByName(a)[0]:a)&&(a.$?a:new CKEDITOR.dom.element(a))}; +CKEDITOR.dom.element.prototype=new CKEDITOR.dom.node;CKEDITOR.dom.element.createFromHtml=function(a,e){var b=new CKEDITOR.dom.element("div",e);b.setHtml(a);return b.getFirst().remove()}; +CKEDITOR.dom.element.setMarker=function(a,e,b,c){var d=e.getCustomData("list_marker_id")||e.setCustomData("list_marker_id",CKEDITOR.tools.getNextNumber()).getCustomData("list_marker_id"),h=e.getCustomData("list_marker_names")||e.setCustomData("list_marker_names",{}).getCustomData("list_marker_names");a[d]=e;h[b]=1;return e.setCustomData(b,c)};CKEDITOR.dom.element.clearAllMarkers=function(a){for(var e in a)CKEDITOR.dom.element.clearMarkers(a,a[e],1)}; +CKEDITOR.dom.element.clearMarkers=function(a,e,b){var c=e.getCustomData("list_marker_names"),d=e.getCustomData("list_marker_id"),h;for(h in c)e.removeCustomData(h);e.removeCustomData("list_marker_names");if(b){e.removeCustomData("list_marker_id");delete a[d]}}; +(function(){function a(a){var b=true;if(!a.$.id){a.$.id="cke_tmp_"+CKEDITOR.tools.getNextNumber();b=false}return function(){b||a.removeAttribute("id")}}function e(a,b){return"#"+a.$.id+" "+b.split(/,\s*/).join(", #"+a.$.id+" ")}function b(a){for(var b=0,e=0,n=c[a].length;e<n;e++)b=b+(parseInt(this.getComputedStyle(c[a][e])||0,10)||0);return b}CKEDITOR.tools.extend(CKEDITOR.dom.element.prototype,{type:CKEDITOR.NODE_ELEMENT,addClass:function(a){var b=this.$.className;b&&(RegExp("(?:^|\\s)"+a+"(?:\\s|$)", +"").test(b)||(b=b+(" "+a)));this.$.className=b||a},removeClass:function(a){var b=this.getAttribute("class");if(b){a=RegExp("(?:^|\\s+)"+a+"(?=\\s|$)","i");if(a.test(b))(b=b.replace(a,"").replace(/^\s+/,""))?this.setAttribute("class",b):this.removeAttribute("class")}return this},hasClass:function(a){return RegExp("(?:^|\\s+)"+a+"(?=\\s|$)","").test(this.getAttribute("class"))},append:function(a,b){typeof a=="string"&&(a=this.getDocument().createElement(a));b?this.$.insertBefore(a.$,this.$.firstChild): +this.$.appendChild(a.$);return a},appendHtml:function(a){if(this.$.childNodes.length){var b=new CKEDITOR.dom.element("div",this.getDocument());b.setHtml(a);b.moveChildren(this)}else this.setHtml(a)},appendText:function(a){this.$.text!=void 0?this.$.text=this.$.text+a:this.append(new CKEDITOR.dom.text(a))},appendBogus:function(a){if(a||CKEDITOR.env.needsBrFiller||CKEDITOR.env.opera){for(a=this.getLast();a&&a.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.rtrim(a.getText());)a=a.getPrevious();if(!a||!a.is|| +!a.is("br")){a=CKEDITOR.env.opera?this.getDocument().createText(""):this.getDocument().createElement("br");CKEDITOR.env.gecko&&a.setAttribute("type","_moz");this.append(a)}}},breakParent:function(a){var b=new CKEDITOR.dom.range(this.getDocument());b.setStartAfter(this);b.setEndAfter(a);a=b.extractContents();b.insertNode(this.remove());a.insertAfterNode(this)},contains:CKEDITOR.env.ie||CKEDITOR.env.webkit?function(a){var b=this.$;return a.type!=CKEDITOR.NODE_ELEMENT?b.contains(a.getParent().$):b!= +a.$&&b.contains(a.$)}:function(a){return!!(this.$.compareDocumentPosition(a.$)&16)},focus:function(){function a(){try{this.$.focus()}catch(b){}}return function(b){b?CKEDITOR.tools.setTimeout(a,100,this):a.call(this)}}(),getHtml:function(){var a=this.$.innerHTML;return CKEDITOR.env.ie?a.replace(/<\?[^>]*>/g,""):a},getOuterHtml:function(){if(this.$.outerHTML)return this.$.outerHTML.replace(/<\?[^>]*>/,"");var a=this.$.ownerDocument.createElement("div");a.appendChild(this.$.cloneNode(true));return a.innerHTML}, +getClientRect:function(){var a=CKEDITOR.tools.extend({},this.$.getBoundingClientRect());!a.width&&(a.width=a.right-a.left);!a.height&&(a.height=a.bottom-a.top);return a},setHtml:CKEDITOR.env.ie&&CKEDITOR.env.version<9?function(a){try{var b=this.$;if(this.getParent())return b.innerHTML=a;var c=this.getDocument()._getHtml5ShivFrag();c.appendChild(b);b.innerHTML=a;c.removeChild(b);return a}catch(e){this.$.innerHTML="";b=new CKEDITOR.dom.element("body",this.getDocument());b.$.innerHTML=a;for(b=b.getChildren();b.count();)this.append(b.getItem(0)); +return a}}:function(a){return this.$.innerHTML=a},setText:function(a){CKEDITOR.dom.element.prototype.setText=this.$.innerText!=void 0?function(a){return this.$.innerText=a}:function(a){return this.$.textContent=a};return this.setText(a)},getAttribute:function(){var a=function(a){return this.$.getAttribute(a,2)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)?function(a){switch(a){case "class":a="className";break;case "http-equiv":a="httpEquiv";break;case "name":return this.$.name; +case "tabindex":a=this.$.getAttribute(a,2);a!==0&&this.$.tabIndex===0&&(a=null);return a;case "checked":a=this.$.attributes.getNamedItem(a);return(a.specified?a.nodeValue:this.$.checked)?"checked":null;case "hspace":case "value":return this.$[a];case "style":return this.$.style.cssText;case "contenteditable":case "contentEditable":return this.$.attributes.getNamedItem("contentEditable").specified?this.$.getAttribute("contentEditable"):null}return this.$.getAttribute(a,2)}:a}(),getChildren:function(){return new CKEDITOR.dom.nodeList(this.$.childNodes)}, +getComputedStyle:CKEDITOR.env.ie?function(a){return this.$.currentStyle[CKEDITOR.tools.cssStyleToDomStyle(a)]}:function(a){var b=this.getWindow().$.getComputedStyle(this.$,null);return b?b.getPropertyValue(a):""},getDtd:function(){var a=CKEDITOR.dtd[this.getName()];this.getDtd=function(){return a};return a},getElementsByTag:CKEDITOR.dom.document.prototype.getElementsByTag,getTabIndex:CKEDITOR.env.ie?function(){var a=this.$.tabIndex;a===0&&(!CKEDITOR.dtd.$tabIndex[this.getName()]&&parseInt(this.getAttribute("tabindex"), +10)!==0)&&(a=-1);return a}:CKEDITOR.env.webkit?function(){var a=this.$.tabIndex;if(a==void 0){a=parseInt(this.getAttribute("tabindex"),10);isNaN(a)&&(a=-1)}return a}:function(){return this.$.tabIndex},getText:function(){return this.$.textContent||this.$.innerText||""},getWindow:function(){return this.getDocument().getWindow()},getId:function(){return this.$.id||null},getNameAtt:function(){return this.$.name||null},getName:function(){var a=this.$.nodeName.toLowerCase();if(CKEDITOR.env.ie&&!(document.documentMode> +8)){var b=this.$.scopeName;b!="HTML"&&(a=b.toLowerCase()+":"+a)}return(this.getName=function(){return a})()},getValue:function(){return this.$.value},getFirst:function(a){var b=this.$.firstChild;(b=b&&new CKEDITOR.dom.node(b))&&(a&&!a(b))&&(b=b.getNext(a));return b},getLast:function(a){var b=this.$.lastChild;(b=b&&new CKEDITOR.dom.node(b))&&(a&&!a(b))&&(b=b.getPrevious(a));return b},getStyle:function(a){return this.$.style[CKEDITOR.tools.cssStyleToDomStyle(a)]},is:function(){var a=this.getName(); +if(typeof arguments[0]=="object")return!!arguments[0][a];for(var b=0;b<arguments.length;b++)if(arguments[b]==a)return true;return false},isEditable:function(a){var b=this.getName();if(this.isReadOnly()||this.getComputedStyle("display")=="none"||this.getComputedStyle("visibility")=="hidden"||CKEDITOR.dtd.$nonEditable[b]||CKEDITOR.dtd.$empty[b]||this.is("a")&&(this.data("cke-saved-name")||this.hasAttribute("name"))&&!this.getChildCount())return false;if(a!==false){a=CKEDITOR.dtd[b]||CKEDITOR.dtd.span; +return!(!a||!a["#"])}return true},isIdentical:function(a){var b=this.clone(0,1),a=a.clone(0,1);b.removeAttributes(["_moz_dirty","data-cke-expando","data-cke-saved-href","data-cke-saved-name"]);a.removeAttributes(["_moz_dirty","data-cke-expando","data-cke-saved-href","data-cke-saved-name"]);if(b.$.isEqualNode){b.$.style.cssText=CKEDITOR.tools.normalizeCssText(b.$.style.cssText);a.$.style.cssText=CKEDITOR.tools.normalizeCssText(a.$.style.cssText);return b.$.isEqualNode(a.$)}b=b.getOuterHtml();a=a.getOuterHtml(); +if(CKEDITOR.env.ie&&CKEDITOR.env.version<9&&this.is("a")){var c=this.getParent();if(c.type==CKEDITOR.NODE_ELEMENT){c=c.clone();c.setHtml(b);b=c.getHtml();c.setHtml(a);a=c.getHtml()}}return b==a},isVisible:function(){var a=(this.$.offsetHeight||this.$.offsetWidth)&&this.getComputedStyle("visibility")!="hidden",b,c;if(a&&(CKEDITOR.env.webkit||CKEDITOR.env.opera)){b=this.getWindow();if(!b.equals(CKEDITOR.document.getWindow())&&(c=b.$.frameElement))a=(new CKEDITOR.dom.element(c)).isVisible()}return!!a}, +isEmptyInlineRemoveable:function(){if(!CKEDITOR.dtd.$removeEmpty[this.getName()])return false;for(var a=this.getChildren(),b=0,c=a.count();b<c;b++){var e=a.getItem(b);if(!(e.type==CKEDITOR.NODE_ELEMENT&&e.data("cke-bookmark"))&&(e.type==CKEDITOR.NODE_ELEMENT&&!e.isEmptyInlineRemoveable()||e.type==CKEDITOR.NODE_TEXT&&CKEDITOR.tools.trim(e.getText())))return false}return true},hasAttributes:CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)?function(){for(var a=this.$.attributes,b=0;b< +a.length;b++){var c=a[b];switch(c.nodeName){case "class":if(this.getAttribute("class"))return true;case "data-cke-expando":continue;default:if(c.specified)return true}}return false}:function(){var a=this.$.attributes,b=a.length,c={"data-cke-expando":1,_moz_dirty:1};return b>0&&(b>2||!c[a[0].nodeName]||b==2&&!c[a[1].nodeName])},hasAttribute:function(){function a(b){b=this.$.attributes.getNamedItem(b);return!(!b||!b.specified)}return CKEDITOR.env.ie&&CKEDITOR.env.version<8?function(b){return b=="name"? +!!this.$.name:a.call(this,b)}:a}(),hide:function(){this.setStyle("display","none")},moveChildren:function(a,b){var c=this.$,a=a.$;if(c!=a){var e;if(b)for(;e=c.lastChild;)a.insertBefore(c.removeChild(e),a.firstChild);else for(;e=c.firstChild;)a.appendChild(c.removeChild(e))}},mergeSiblings:function(){function a(b,d,c){if(d&&d.type==CKEDITOR.NODE_ELEMENT){for(var e=[];d.data("cke-bookmark")||d.isEmptyInlineRemoveable();){e.push(d);d=c?d.getNext():d.getPrevious();if(!d||d.type!=CKEDITOR.NODE_ELEMENT)return}if(b.isIdentical(d)){for(var j= +c?b.getLast():b.getFirst();e.length;)e.shift().move(b,!c);d.moveChildren(b,!c);d.remove();j&&j.type==CKEDITOR.NODE_ELEMENT&&j.mergeSiblings()}}}return function(b){if(b===false||CKEDITOR.dtd.$removeEmpty[this.getName()]||this.is("a")){a(this,this.getNext(),true);a(this,this.getPrevious())}}}(),show:function(){this.setStyles({display:"",visibility:""})},setAttribute:function(){var a=function(a,b){this.$.setAttribute(a,b);return this};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)? +function(b,c){b=="class"?this.$.className=c:b=="style"?this.$.style.cssText=c:b=="tabindex"?this.$.tabIndex=c:b=="checked"?this.$.checked=c:b=="contenteditable"?a.call(this,"contentEditable",c):a.apply(this,arguments);return this}:CKEDITOR.env.ie8Compat&&CKEDITOR.env.secure?function(b,c){if(b=="src"&&c.match(/^http:\/\//))try{a.apply(this,arguments)}catch(e){}else a.apply(this,arguments);return this}:a}(),setAttributes:function(a){for(var b in a)this.setAttribute(b,a[b]);return this},setValue:function(a){this.$.value= +a;return this},removeAttribute:function(){var a=function(a){this.$.removeAttribute(a)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)?function(a){a=="class"?a="className":a=="tabindex"?a="tabIndex":a=="contenteditable"&&(a="contentEditable");this.$.removeAttribute(a)}:a}(),removeAttributes:function(a){if(CKEDITOR.tools.isArray(a))for(var b=0;b<a.length;b++)this.removeAttribute(a[b]);else for(b in a)a.hasOwnProperty(b)&&this.removeAttribute(b)},removeStyle:function(a){var b= +this.$.style;if(!b.removeProperty&&(a=="border"||a=="margin"||a=="padding")){var c=["top","left","right","bottom"],e;a=="border"&&(e=["color","style","width"]);for(var b=[],i=0;i<c.length;i++)if(e)for(var j=0;j<e.length;j++)b.push([a,c[i],e[j]].join("-"));else b.push([a,c[i]].join("-"));for(a=0;a<b.length;a++)this.removeStyle(b[a])}else{b.removeProperty?b.removeProperty(a):b.removeAttribute(CKEDITOR.tools.cssStyleToDomStyle(a));this.$.style.cssText||this.removeAttribute("style")}},setStyle:function(a, +b){this.$.style[CKEDITOR.tools.cssStyleToDomStyle(a)]=b;return this},setStyles:function(a){for(var b in a)this.setStyle(b,a[b]);return this},setOpacity:function(a){if(CKEDITOR.env.ie&&CKEDITOR.env.version<9){a=Math.round(a*100);this.setStyle("filter",a>=100?"":"progid:DXImageTransform.Microsoft.Alpha(opacity="+a+")")}else this.setStyle("opacity",a)},unselectable:function(){this.setStyles(CKEDITOR.tools.cssVendorPrefix("user-select","none"));if(CKEDITOR.env.ie||CKEDITOR.env.opera){this.setAttribute("unselectable", +"on");for(var a,b=this.getElementsByTag("*"),c=0,e=b.count();c<e;c++){a=b.getItem(c);a.setAttribute("unselectable","on")}}},getPositionedAncestor:function(){for(var a=this;a.getName()!="html";){if(a.getComputedStyle("position")!="static")return a;a=a.getParent()}return null},getDocumentPosition:function(a){var b=0,c=0,e=this.getDocument(),i=e.getBody(),j=e.$.compatMode=="BackCompat";if(document.documentElement.getBoundingClientRect){var o=this.$.getBoundingClientRect(),q=e.$.documentElement,s=q.clientTop|| +i.$.clientTop||0,u=q.clientLeft||i.$.clientLeft||0,f=true;if(CKEDITOR.env.ie){f=e.getDocumentElement().contains(this);e=e.getBody().contains(this);f=j&&e||!j&&f}if(f){b=o.left+(!j&&q.scrollLeft||i.$.scrollLeft);b=b-u;c=o.top+(!j&&q.scrollTop||i.$.scrollTop);c=c-s}}else{i=this;for(e=null;i&&!(i.getName()=="body"||i.getName()=="html");){b=b+(i.$.offsetLeft-i.$.scrollLeft);c=c+(i.$.offsetTop-i.$.scrollTop);if(!i.equals(this)){b=b+(i.$.clientLeft||0);c=c+(i.$.clientTop||0)}for(;e&&!e.equals(i);){b=b- +e.$.scrollLeft;c=c-e.$.scrollTop;e=e.getParent()}e=i;i=(o=i.$.offsetParent)?new CKEDITOR.dom.element(o):null}}if(a){i=this.getWindow();e=a.getWindow();if(!i.equals(e)&&i.$.frameElement){a=(new CKEDITOR.dom.element(i.$.frameElement)).getDocumentPosition(a);b=b+a.x;c=c+a.y}}if(!document.documentElement.getBoundingClientRect&&CKEDITOR.env.gecko&&!j){b=b+(this.$.clientLeft?1:0);c=c+(this.$.clientTop?1:0)}return{x:b,y:c}},scrollIntoView:function(a){var b=this.getParent();if(b){do{(b.$.clientWidth&&b.$.clientWidth< +b.$.scrollWidth||b.$.clientHeight&&b.$.clientHeight<b.$.scrollHeight)&&!b.is("body")&&this.scrollIntoParent(b,a,1);if(b.is("html")){var c=b.getWindow();try{var e=c.$.frameElement;e&&(b=new CKEDITOR.dom.element(e))}catch(i){}}}while(b=b.getParent())}},scrollIntoParent:function(a,b,c){var e,i,j,o;function q(b,f){if(/body|html/.test(a.getName()))a.getWindow().$.scrollBy(b,f);else{a.$.scrollLeft=a.$.scrollLeft+b;a.$.scrollTop=a.$.scrollTop+f}}function s(a,b){var d={x:0,y:0};if(!a.is(f?"body":"html")){var c= +a.$.getBoundingClientRect();d.x=c.left;d.y=c.top}c=a.getWindow();if(!c.equals(b)){c=s(CKEDITOR.dom.element.get(c.$.frameElement),b);d.x=d.x+c.x;d.y=d.y+c.y}return d}function u(a,b){return parseInt(a.getComputedStyle("margin-"+b)||0,10)||0}!a&&(a=this.getWindow());j=a.getDocument();var f=j.$.compatMode=="BackCompat";a instanceof CKEDITOR.dom.window&&(a=f?j.getBody():j.getDocumentElement());j=a.getWindow();i=s(this,j);var p=s(a,j),y=this.$.offsetHeight;e=this.$.offsetWidth;var m=a.$.clientHeight,k= +a.$.clientWidth;j=i.x-u(this,"left")-p.x||0;o=i.y-u(this,"top")-p.y||0;e=i.x+e+u(this,"right")-(p.x+k)||0;i=i.y+y+u(this,"bottom")-(p.y+m)||0;if(o<0||i>0)q(0,b===true?o:b===false?i:o<0?o:i);if(c&&(j<0||e>0))q(j<0?j:e,0)},setState:function(a,b,c){b=b||"cke";switch(a){case CKEDITOR.TRISTATE_ON:this.addClass(b+"_on");this.removeClass(b+"_off");this.removeClass(b+"_disabled");c&&this.setAttribute("aria-pressed",true);c&&this.removeAttribute("aria-disabled");break;case CKEDITOR.TRISTATE_DISABLED:this.addClass(b+ +"_disabled");this.removeClass(b+"_off");this.removeClass(b+"_on");c&&this.setAttribute("aria-disabled",true);c&&this.removeAttribute("aria-pressed");break;default:this.addClass(b+"_off");this.removeClass(b+"_on");this.removeClass(b+"_disabled");c&&this.removeAttribute("aria-pressed");c&&this.removeAttribute("aria-disabled")}},getFrameDocument:function(){var a=this.$;try{a.contentWindow.document}catch(b){a.src=a.src}return a&&new CKEDITOR.dom.document(a.contentWindow.document)},copyAttributes:function(a, +b){for(var c=this.$.attributes,b=b||{},e=0;e<c.length;e++){var i=c[e],j=i.nodeName.toLowerCase(),o;if(!(j in b))if(j=="checked"&&(o=this.getAttribute(j)))a.setAttribute(j,o);else if(i.specified||CKEDITOR.env.ie&&i.nodeValue&&j=="value"){o=this.getAttribute(j);if(o===null)o=i.nodeValue;a.setAttribute(j,o)}}if(this.$.style.cssText!=="")a.$.style.cssText=this.$.style.cssText},renameNode:function(a){if(this.getName()!=a){var b=this.getDocument(),a=new CKEDITOR.dom.element(a,b);this.copyAttributes(a); +this.moveChildren(a);this.getParent()&&this.$.parentNode.replaceChild(a.$,this.$);a.$["data-cke-expando"]=this.$["data-cke-expando"];this.$=a.$}},getChild:function(){function a(b,c){var d=b.childNodes;if(c>=0&&c<d.length)return d[c]}return function(b){var c=this.$;if(b.slice)for(;b.length>0&&c;)c=a(c,b.shift());else c=a(c,b);return c?new CKEDITOR.dom.node(c):null}}(),getChildCount:function(){return this.$.childNodes.length},disableContextMenu:function(){this.on("contextmenu",function(a){a.data.getTarget().hasClass("cke_enable_context_menu")|| +a.data.preventDefault()})},getDirection:function(a){return a?this.getComputedStyle("direction")||this.getDirection()||this.getParent()&&this.getParent().getDirection(1)||this.getDocument().$.dir||"ltr":this.getStyle("direction")||this.getAttribute("dir")},data:function(a,b){a="data-"+a;if(b===void 0)return this.getAttribute(a);b===false?this.removeAttribute(a):this.setAttribute(a,b);return null},getEditor:function(){var a=CKEDITOR.instances,b,c;for(b in a){c=a[b];if(c.element.equals(this)&&c.elementMode!= +CKEDITOR.ELEMENT_MODE_APPENDTO)return c}return null},find:function(b){var c=a(this),b=new CKEDITOR.dom.nodeList(this.$.querySelectorAll(e(this,b)));c();return b},findOne:function(b){var c=a(this),b=this.$.querySelector(e(this,b));c();return b?new CKEDITOR.dom.element(b):null},forEach:function(a,b,c){if(!c&&(!b||this.type==b))var e=a(this);if(e!==false)for(var c=this.getChildren(),i=0;i<c.count();i++){e=c.getItem(i);e.type==CKEDITOR.NODE_ELEMENT?e.forEach(a,b):(!b||e.type==b)&&a(e)}}});var c={width:["border-left-width", +"border-right-width","padding-left","padding-right"],height:["border-top-width","border-bottom-width","padding-top","padding-bottom"]};CKEDITOR.dom.element.prototype.setSize=function(a,c,e){if(typeof c=="number"){if(e&&(!CKEDITOR.env.ie||!CKEDITOR.env.quirks))c=c-b.call(this,a);this.setStyle(a,c+"px")}};CKEDITOR.dom.element.prototype.getSize=function(a,c){var e=Math.max(this.$["offset"+CKEDITOR.tools.capitalize(a)],this.$["client"+CKEDITOR.tools.capitalize(a)])||0;c&&(e=e-b.call(this,a));return e}})(); +CKEDITOR.dom.documentFragment=function(a){a=a||CKEDITOR.document;this.$=a.type==CKEDITOR.NODE_DOCUMENT?a.$.createDocumentFragment():a}; +CKEDITOR.tools.extend(CKEDITOR.dom.documentFragment.prototype,CKEDITOR.dom.element.prototype,{type:CKEDITOR.NODE_DOCUMENT_FRAGMENT,insertAfterNode:function(a){a=a.$;a.parentNode.insertBefore(this.$,a.nextSibling)}},!0,{append:1,appendBogus:1,getFirst:1,getLast:1,getParent:1,getNext:1,getPrevious:1,appendTo:1,moveChildren:1,insertBefore:1,insertAfterNode:1,replace:1,trim:1,type:1,ltrim:1,rtrim:1,getDocument:1,getChildCount:1,getChild:1,getChildren:1}); +(function(){function a(a,b){var c=this.range;if(this._.end)return null;if(!this._.start){this._.start=1;if(c.collapsed){this.end();return null}c.optimize()}var f,d=c.startContainer;f=c.endContainer;var o=c.startOffset,e=c.endOffset,k,l=this.guard,t=this.type,h=a?"getPreviousSourceNode":"getNextSourceNode";if(!a&&!this._.guardLTR){var r=f.type==CKEDITOR.NODE_ELEMENT?f:f.getParent(),i=f.type==CKEDITOR.NODE_ELEMENT?f.getChild(e):f.getNext();this._.guardLTR=function(a,b){return(!b||!r.equals(a))&&(!i|| +!a.equals(i))&&(a.type!=CKEDITOR.NODE_ELEMENT||!b||!a.equals(c.root))}}if(a&&!this._.guardRTL){var g=d.type==CKEDITOR.NODE_ELEMENT?d:d.getParent(),j=d.type==CKEDITOR.NODE_ELEMENT?o?d.getChild(o-1):null:d.getPrevious();this._.guardRTL=function(a,b){return(!b||!g.equals(a))&&(!j||!a.equals(j))&&(a.type!=CKEDITOR.NODE_ELEMENT||!b||!a.equals(c.root))}}var n=a?this._.guardRTL:this._.guardLTR;k=l?function(a,b){return n(a,b)===false?false:l(a,b)}:n;if(this.current)f=this.current[h](false,t,k);else{if(a)f.type== +CKEDITOR.NODE_ELEMENT&&(f=e>0?f.getChild(e-1):k(f,true)===false?null:f.getPreviousSourceNode(true,t,k));else{f=d;if(f.type==CKEDITOR.NODE_ELEMENT&&!(f=f.getChild(o)))f=k(d,true)===false?null:d.getNextSourceNode(true,t,k)}f&&k(f)===false&&(f=null)}for(;f&&!this._.end;){this.current=f;if(!this.evaluator||this.evaluator(f)!==false){if(!b)return f}else if(b&&this.evaluator)return false;f=f[h](false,t,k)}this.end();return this.current=null}function e(b){for(var c,d=null;c=a.call(this,b);)d=c;return d} +function b(a){if(j(a))return false;if(a.type==CKEDITOR.NODE_TEXT)return true;if(a.type==CKEDITOR.NODE_ELEMENT){if(a.is(CKEDITOR.dtd.$inline)||a.getAttribute("contenteditable")=="false")return true;var b;if(b=!CKEDITOR.env.needsBrFiller)if(b=a.is(o))a:{b=0;for(var c=a.getChildCount();b<c;++b)if(!j(a.getChild(b))){b=false;break a}b=true}if(b)return true}return false}CKEDITOR.dom.walker=CKEDITOR.tools.createClass({$:function(a){this.range=a;this._={}},proto:{end:function(){this._.end=1},next:function(){return a.call(this)}, +previous:function(){return a.call(this,1)},checkForward:function(){return a.call(this,0,1)!==false},checkBackward:function(){return a.call(this,1,1)!==false},lastForward:function(){return e.call(this)},lastBackward:function(){return e.call(this,1)},reset:function(){delete this.current;this._={}}}});var c={block:1,"list-item":1,table:1,"table-row-group":1,"table-header-group":1,"table-footer-group":1,"table-row":1,"table-column-group":1,"table-column":1,"table-cell":1,"table-caption":1},d={absolute:1, +fixed:1};CKEDITOR.dom.element.prototype.isBlockBoundary=function(a){return this.getComputedStyle("float")=="none"&&!(this.getComputedStyle("position")in d)&&c[this.getComputedStyle("display")]?true:!!(this.is(CKEDITOR.dtd.$block)||a&&this.is(a))};CKEDITOR.dom.walker.blockBoundary=function(a){return function(b){return!(b.type==CKEDITOR.NODE_ELEMENT&&b.isBlockBoundary(a))}};CKEDITOR.dom.walker.listItemBoundary=function(){return this.blockBoundary({br:1})};CKEDITOR.dom.walker.bookmark=function(a,b){function c(a){return a&& +a.getName&&a.getName()=="span"&&a.data("cke-bookmark")}return function(f){var d,o;d=f&&f.type!=CKEDITOR.NODE_ELEMENT&&(o=f.getParent())&&c(o);d=a?d:d||c(f);return!!(b^d)}};CKEDITOR.dom.walker.whitespaces=function(a){return function(b){var c;b&&b.type==CKEDITOR.NODE_TEXT&&(c=!CKEDITOR.tools.trim(b.getText())||CKEDITOR.env.webkit&&b.getText()=="​");return!!(a^c)}};CKEDITOR.dom.walker.invisible=function(a){var b=CKEDITOR.dom.walker.whitespaces();return function(c){if(b(c))c=1;else{c.type==CKEDITOR.NODE_TEXT&& +(c=c.getParent());c=!c.$.offsetHeight}return!!(a^c)}};CKEDITOR.dom.walker.nodeType=function(a,b){return function(c){return!!(b^c.type==a)}};CKEDITOR.dom.walker.bogus=function(a){function b(a){return!g(a)&&!n(a)}return function(c){var f=CKEDITOR.env.needsBrFiller?c.is&&c.is("br"):c.getText&&h.test(c.getText());if(f){f=c.getParent();c=c.getNext(b);f=f.isBlockBoundary()&&(!c||c.type==CKEDITOR.NODE_ELEMENT&&c.isBlockBoundary())}return!!(a^f)}};CKEDITOR.dom.walker.temp=function(a){return function(b){b.type!= +CKEDITOR.NODE_ELEMENT&&(b=b.getParent());b=b&&b.hasAttribute("data-cke-temp");return!!(a^b)}};var h=/^[\t\r\n ]*(?:&nbsp;|\xa0)$/,g=CKEDITOR.dom.walker.whitespaces(),n=CKEDITOR.dom.walker.bookmark(),i=CKEDITOR.dom.walker.temp();CKEDITOR.dom.walker.ignored=function(a){return function(b){b=g(b)||n(b)||i(b);return!!(a^b)}};var j=CKEDITOR.dom.walker.ignored(),o=function(a){var b={},c;for(c in a)CKEDITOR.dtd[c]["#"]&&(b[c]=1);return b}(CKEDITOR.dtd.$block);CKEDITOR.dom.walker.editable=function(a){return function(c){return!!(a^ +b(c))}};CKEDITOR.dom.element.prototype.getBogus=function(){var a=this;do a=a.getPreviousSourceNode();while(n(a)||g(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.is(CKEDITOR.dtd.$inline)&&!a.is(CKEDITOR.dtd.$empty));return a&&(CKEDITOR.env.needsBrFiller?a.is&&a.is("br"):a.getText&&h.test(a.getText()))?a:false}})(); +CKEDITOR.dom.range=function(a){this.endOffset=this.endContainer=this.startOffset=this.startContainer=null;this.collapsed=true;var e=a instanceof CKEDITOR.dom.document;this.document=e?a:a.getDocument();this.root=e?a.getBody():a}; +(function(){function a(){var a=false,b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(true),d=CKEDITOR.dom.walker.bogus();return function(f){if(c(f)||b(f))return true;if(d(f)&&!a)return a=true;return f.type==CKEDITOR.NODE_TEXT&&(f.hasAscendant("pre")||CKEDITOR.tools.trim(f.getText()).length)||f.type==CKEDITOR.NODE_ELEMENT&&!f.is(h)?false:true}}function e(a){var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(1);return function(d){return c(d)||b(d)?true:!a&&g(d)|| +d.type==CKEDITOR.NODE_ELEMENT&&d.is(CKEDITOR.dtd.$removeEmpty)}}function b(a){return function(){var b;return this[a?"getPreviousNode":"getNextNode"](function(a){!b&&j(a)&&(b=a);return i(a)&&!(g(a)&&a.equals(b))})}}var c=function(a){a.collapsed=a.startContainer&&a.endContainer&&a.startContainer.equals(a.endContainer)&&a.startOffset==a.endOffset},d=function(a,b,c,d){a.optimizeBookmark();var f=a.startContainer,e=a.endContainer,h=a.startOffset,m=a.endOffset,k,l;if(e.type==CKEDITOR.NODE_TEXT)e=e.split(m); +else if(e.getChildCount()>0)if(m>=e.getChildCount()){e=e.append(a.document.createText(""));l=true}else e=e.getChild(m);if(f.type==CKEDITOR.NODE_TEXT){f.split(h);f.equals(e)&&(e=f.getNext())}else if(h)if(h>=f.getChildCount()){f=f.append(a.document.createText(""));k=true}else f=f.getChild(h).getPrevious();else{f=f.append(a.document.createText(""),1);k=true}var h=f.getParents(),m=e.getParents(),t,i,r;for(t=0;t<h.length;t++){i=h[t];r=m[t];if(!i.equals(r))break}for(var g=c,j,n,E,z=t;z<h.length;z++){j= +h[z];g&&!j.equals(f)&&(n=g.append(j.clone()));for(j=j.getNext();j;){if(j.equals(m[z])||j.equals(e))break;E=j.getNext();if(b==2)g.append(j.clone(true));else{j.remove();b==1&&g.append(j)}j=E}g&&(g=n)}g=c;for(c=t;c<m.length;c++){j=m[c];b>0&&!j.equals(e)&&(n=g.append(j.clone()));if(!h[c]||j.$.parentNode!=h[c].$.parentNode)for(j=j.getPrevious();j;){if(j.equals(h[c])||j.equals(f))break;E=j.getPrevious();if(b==2)g.$.insertBefore(j.$.cloneNode(true),g.$.firstChild);else{j.remove();b==1&&g.$.insertBefore(j.$, +g.$.firstChild)}j=E}g&&(g=n)}if(b==2){i=a.startContainer;if(i.type==CKEDITOR.NODE_TEXT){i.$.data=i.$.data+i.$.nextSibling.data;i.$.parentNode.removeChild(i.$.nextSibling)}a=a.endContainer;if(a.type==CKEDITOR.NODE_TEXT&&a.$.nextSibling){a.$.data=a.$.data+a.$.nextSibling.data;a.$.parentNode.removeChild(a.$.nextSibling)}}else{if(i&&r&&(f.$.parentNode!=i.$.parentNode||e.$.parentNode!=r.$.parentNode)){b=r.getIndex();k&&r.$.parentNode==f.$.parentNode&&b--;if(d&&i.type==CKEDITOR.NODE_ELEMENT){d=CKEDITOR.dom.element.createFromHtml('<span data-cke-bookmark="1" style="display:none">&nbsp;</span>', +a.document);d.insertAfter(i);i.mergeSiblings(false);a.moveToBookmark({startNode:d})}else a.setStart(r.getParent(),b)}a.collapse(true)}k&&f.remove();l&&e.$.parentNode&&e.remove()},h={abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,"var":1},g=CKEDITOR.dom.walker.bogus(),n=/^[\t\r\n ]*(?:&nbsp;|\xa0)$/,i=CKEDITOR.dom.walker.editable(),j=CKEDITOR.dom.walker.ignored(true);CKEDITOR.dom.range.prototype= +{clone:function(){var a=new CKEDITOR.dom.range(this.root);a.startContainer=this.startContainer;a.startOffset=this.startOffset;a.endContainer=this.endContainer;a.endOffset=this.endOffset;a.collapsed=this.collapsed;return a},collapse:function(a){if(a){this.endContainer=this.startContainer;this.endOffset=this.startOffset}else{this.startContainer=this.endContainer;this.startOffset=this.endOffset}this.collapsed=true},cloneContents:function(){var a=new CKEDITOR.dom.documentFragment(this.document);this.collapsed|| +d(this,2,a);return a},deleteContents:function(a){this.collapsed||d(this,0,null,a)},extractContents:function(a){var b=new CKEDITOR.dom.documentFragment(this.document);this.collapsed||d(this,1,b,a);return b},createBookmark:function(a){var b,c,d,f,e=this.collapsed;b=this.document.createElement("span");b.data("cke-bookmark",1);b.setStyle("display","none");b.setHtml("&nbsp;");if(a){d="cke_bm_"+CKEDITOR.tools.getNextNumber();b.setAttribute("id",d+(e?"C":"S"))}if(!e){c=b.clone();c.setHtml("&nbsp;");a&&c.setAttribute("id", +d+"E");f=this.clone();f.collapse();f.insertNode(c)}f=this.clone();f.collapse(true);f.insertNode(b);if(c){this.setStartAfter(b);this.setEndBefore(c)}else this.moveToPosition(b,CKEDITOR.POSITION_AFTER_END);return{startNode:a?d+(e?"C":"S"):b,endNode:a?d+"E":c,serializable:a,collapsed:e}},createBookmark2:function(){function a(b){var c=b.container,d=b.offset,f;f=c;var e=d;f=f.type!=CKEDITOR.NODE_ELEMENT||e===0||e==f.getChildCount()?0:f.getChild(e-1).type==CKEDITOR.NODE_TEXT&&f.getChild(e).type==CKEDITOR.NODE_TEXT; +if(f){c=c.getChild(d-1);d=c.getLength()}c.type==CKEDITOR.NODE_ELEMENT&&d>1&&(d=c.getChild(d-1).getIndex(true)+1);if(c.type==CKEDITOR.NODE_TEXT){f=c;for(e=0;(f=f.getPrevious())&&f.type==CKEDITOR.NODE_TEXT;)e=e+f.getLength();d=d+e}b.container=c;b.offset=d}return function(b){var c=this.collapsed,d={container:this.startContainer,offset:this.startOffset},f={container:this.endContainer,offset:this.endOffset};if(b){a(d);c||a(f)}return{start:d.container.getAddress(b),end:c?null:f.container.getAddress(b), +startOffset:d.offset,endOffset:f.offset,normalized:b,collapsed:c,is2:true}}}(),moveToBookmark:function(a){if(a.is2){var b=this.document.getByAddress(a.start,a.normalized),c=a.startOffset,d=a.end&&this.document.getByAddress(a.end,a.normalized),a=a.endOffset;this.setStart(b,c);d?this.setEnd(d,a):this.collapse(true)}else{b=(c=a.serializable)?this.document.getById(a.startNode):a.startNode;a=c?this.document.getById(a.endNode):a.endNode;this.setStartBefore(b);b.remove();if(a){this.setEndBefore(a);a.remove()}else this.collapse(true)}}, +getBoundaryNodes:function(){var a=this.startContainer,b=this.endContainer,c=this.startOffset,d=this.endOffset,f;if(a.type==CKEDITOR.NODE_ELEMENT){f=a.getChildCount();if(f>c)a=a.getChild(c);else if(f<1)a=a.getPreviousSourceNode();else{for(a=a.$;a.lastChild;)a=a.lastChild;a=new CKEDITOR.dom.node(a);a=a.getNextSourceNode()||a}}if(b.type==CKEDITOR.NODE_ELEMENT){f=b.getChildCount();if(f>d)b=b.getChild(d).getPreviousSourceNode(true);else if(f<1)b=b.getPreviousSourceNode();else{for(b=b.$;b.lastChild;)b= +b.lastChild;b=new CKEDITOR.dom.node(b)}}a.getPosition(b)&CKEDITOR.POSITION_FOLLOWING&&(a=b);return{startNode:a,endNode:b}},getCommonAncestor:function(a,b){var c=this.startContainer,d=this.endContainer,c=c.equals(d)?a&&c.type==CKEDITOR.NODE_ELEMENT&&this.startOffset==this.endOffset-1?c.getChild(this.startOffset):c:c.getCommonAncestor(d);return b&&!c.is?c.getParent():c},optimize:function(){var a=this.startContainer,b=this.startOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>=a.getLength()&&this.setStartAfter(a): +this.setStartBefore(a));a=this.endContainer;b=this.endOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>=a.getLength()&&this.setEndAfter(a):this.setEndBefore(a))},optimizeBookmark:function(){var a=this.startContainer,b=this.endContainer;a.is&&(a.is("span")&&a.data("cke-bookmark"))&&this.setStartAt(a,CKEDITOR.POSITION_BEFORE_START);b&&(b.is&&b.is("span")&&b.data("cke-bookmark"))&&this.setEndAt(b,CKEDITOR.POSITION_AFTER_END)},trim:function(a,b){var c=this.startContainer,d=this.startOffset,f=this.collapsed; +if((!a||f)&&c&&c.type==CKEDITOR.NODE_TEXT){if(d)if(d>=c.getLength()){d=c.getIndex()+1;c=c.getParent()}else{var e=c.split(d),d=c.getIndex()+1,c=c.getParent();if(this.startContainer.equals(this.endContainer))this.setEnd(e,this.endOffset-this.startOffset);else if(c.equals(this.endContainer))this.endOffset=this.endOffset+1}else{d=c.getIndex();c=c.getParent()}this.setStart(c,d);if(f){this.collapse(true);return}}c=this.endContainer;d=this.endOffset;if(!b&&!f&&c&&c.type==CKEDITOR.NODE_TEXT){if(d){d>=c.getLength()|| +c.split(d);d=c.getIndex()+1}else d=c.getIndex();c=c.getParent();this.setEnd(c,d)}},enlarge:function(a,b){function c(a){return a&&a.type==CKEDITOR.NODE_ELEMENT&&a.hasAttribute("contenteditable")?null:a}switch(a){case CKEDITOR.ENLARGE_INLINE:var d=1;case CKEDITOR.ENLARGE_ELEMENT:if(this.collapsed)break;var f=this.getCommonAncestor(),e=this.root,h,m,k,l,t,i=false,r,j;r=this.startContainer;j=this.startOffset;if(r.type==CKEDITOR.NODE_TEXT){if(j){r=!CKEDITOR.tools.trim(r.substring(0,j)).length&&r;i=!!r}if(r&& +!(l=r.getPrevious()))k=r.getParent()}else{j&&(l=r.getChild(j-1)||r.getLast());l||(k=r)}for(k=c(k);k||l;){if(k&&!l){!t&&k.equals(f)&&(t=true);if(d?k.isBlockBoundary():!e.contains(k))break;if(!i||k.getComputedStyle("display")!="inline"){i=false;t?h=k:this.setStartBefore(k)}l=k.getPrevious()}for(;l;){r=false;if(l.type==CKEDITOR.NODE_COMMENT)l=l.getPrevious();else{if(l.type==CKEDITOR.NODE_TEXT){j=l.getText();/[^\s\ufeff]/.test(j)&&(l=null);r=/[\s\ufeff]$/.test(j)}else if((l.$.offsetWidth>0||b&&l.is("br"))&& +!l.data("cke-bookmark"))if(i&&CKEDITOR.dtd.$removeEmpty[l.getName()]){j=l.getText();if(/[^\s\ufeff]/.test(j))l=null;else for(var g=l.$.getElementsByTagName("*"),n=0,E;E=g[n++];)if(!CKEDITOR.dtd.$removeEmpty[E.nodeName.toLowerCase()]){l=null;break}l&&(r=!!j.length)}else l=null;r&&(i?t?h=k:k&&this.setStartBefore(k):i=true);if(l){r=l.getPrevious();if(!k&&!r){k=l;l=null;break}l=r}else k=null}}k&&(k=c(k.getParent()))}r=this.endContainer;j=this.endOffset;k=l=null;t=i=false;if(r.type==CKEDITOR.NODE_TEXT){r= +!CKEDITOR.tools.trim(r.substring(j)).length&&r;i=!(r&&r.getLength());if(r&&!(l=r.getNext()))k=r.getParent()}else(l=r.getChild(j))||(k=r);for(;k||l;){if(k&&!l){!t&&k.equals(f)&&(t=true);if(d?k.isBlockBoundary():!e.contains(k))break;if(!i||k.getComputedStyle("display")!="inline"){i=false;t?m=k:k&&this.setEndAfter(k)}l=k.getNext()}for(;l;){r=false;if(l.type==CKEDITOR.NODE_TEXT){j=l.getText();/[^\s\ufeff]/.test(j)&&(l=null);r=/^[\s\ufeff]/.test(j)}else if(l.type==CKEDITOR.NODE_ELEMENT){if((l.$.offsetWidth> +0||b&&l.is("br"))&&!l.data("cke-bookmark"))if(i&&CKEDITOR.dtd.$removeEmpty[l.getName()]){j=l.getText();if(/[^\s\ufeff]/.test(j))l=null;else{g=l.$.getElementsByTagName("*");for(n=0;E=g[n++];)if(!CKEDITOR.dtd.$removeEmpty[E.nodeName.toLowerCase()]){l=null;break}}l&&(r=!!j.length)}else l=null}else r=1;r&&i&&(t?m=k:this.setEndAfter(k));if(l){r=l.getNext();if(!k&&!r){k=l;l=null;break}l=r}else k=null}k&&(k=c(k.getParent()))}if(h&&m){f=h.contains(m)?m:h;this.setStartBefore(f);this.setEndAfter(f)}break;case CKEDITOR.ENLARGE_BLOCK_CONTENTS:case CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:k= +new CKEDITOR.dom.range(this.root);e=this.root;k.setStartAt(e,CKEDITOR.POSITION_AFTER_START);k.setEnd(this.startContainer,this.startOffset);k=new CKEDITOR.dom.walker(k);var z,M,Q=CKEDITOR.dom.walker.blockBoundary(a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS?{br:1}:null),v=null,w=function(a){if(a.type==CKEDITOR.NODE_ELEMENT&&a.getAttribute("contenteditable")=="false")if(v){if(v.equals(a)){v=null;return}}else v=a;else if(v)return;var b=Q(a);b||(z=a);return b},d=function(a){var b=w(a);!b&&(a.is&&a.is("br"))&& +(M=a);return b};k.guard=w;k=k.lastBackward();z=z||e;this.setStartAt(z,!z.is("br")&&(!k&&this.checkStartOfBlock()||k&&z.contains(k))?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_AFTER_END);if(a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS){k=this.clone();k=new CKEDITOR.dom.walker(k);var H=CKEDITOR.dom.walker.whitespaces(),C=CKEDITOR.dom.walker.bookmark();k.evaluator=function(a){return!H(a)&&!C(a)};if((k=k.previous())&&k.type==CKEDITOR.NODE_ELEMENT&&k.is("br"))break}k=this.clone();k.collapse();k.setEndAt(e, +CKEDITOR.POSITION_BEFORE_END);k=new CKEDITOR.dom.walker(k);k.guard=a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS?d:w;z=null;k=k.lastForward();z=z||e;this.setEndAt(z,!k&&this.checkEndOfBlock()||k&&z.contains(k)?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_BEFORE_START);M&&this.setEndAfter(M)}},shrink:function(a,b,c){if(!this.collapsed){var a=a||CKEDITOR.SHRINK_TEXT,d=this.clone(),f=this.startContainer,e=this.endContainer,h=this.startOffset,m=this.endOffset,k=1,l=1;if(f&&f.type==CKEDITOR.NODE_TEXT)if(h)if(h>= +f.getLength())d.setStartAfter(f);else{d.setStartBefore(f);k=0}else d.setStartBefore(f);if(e&&e.type==CKEDITOR.NODE_TEXT)if(m)if(m>=e.getLength())d.setEndAfter(e);else{d.setEndAfter(e);l=0}else d.setEndBefore(e);var d=new CKEDITOR.dom.walker(d),t=CKEDITOR.dom.walker.bookmark();d.evaluator=function(b){return b.type==(a==CKEDITOR.SHRINK_ELEMENT?CKEDITOR.NODE_ELEMENT:CKEDITOR.NODE_TEXT)};var j;d.guard=function(b,d){if(t(b))return true;if(a==CKEDITOR.SHRINK_ELEMENT&&b.type==CKEDITOR.NODE_TEXT||d&&b.equals(j)|| +c===false&&b.type==CKEDITOR.NODE_ELEMENT&&b.isBlockBoundary()||b.type==CKEDITOR.NODE_ELEMENT&&b.hasAttribute("contenteditable"))return false;!d&&b.type==CKEDITOR.NODE_ELEMENT&&(j=b);return true};if(k)(f=d[a==CKEDITOR.SHRINK_ELEMENT?"lastForward":"next"]())&&this.setStartAt(f,b?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_START);if(l){d.reset();(d=d[a==CKEDITOR.SHRINK_ELEMENT?"lastBackward":"previous"]())&&this.setEndAt(d,b?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_END)}return!(!k&& +!l)}},insertNode:function(a){this.optimizeBookmark();this.trim(false,true);var b=this.startContainer,c=b.getChild(this.startOffset);c?a.insertBefore(c):b.append(a);a.getParent()&&a.getParent().equals(this.endContainer)&&this.endOffset++;this.setStartBefore(a)},moveToPosition:function(a,b){this.setStartAt(a,b);this.collapse(true)},moveToRange:function(a){this.setStart(a.startContainer,a.startOffset);this.setEnd(a.endContainer,a.endOffset)},selectNodeContents:function(a){this.setStart(a,0);this.setEnd(a, +a.type==CKEDITOR.NODE_TEXT?a.getLength():a.getChildCount())},setStart:function(a,b){if(a.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[a.getName()]){b=a.getIndex();a=a.getParent()}this.startContainer=a;this.startOffset=b;if(!this.endContainer){this.endContainer=a;this.endOffset=b}c(this)},setEnd:function(a,b){if(a.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[a.getName()]){b=a.getIndex()+1;a=a.getParent()}this.endContainer=a;this.endOffset=b;if(!this.startContainer){this.startContainer=a;this.startOffset= +b}c(this)},setStartAfter:function(a){this.setStart(a.getParent(),a.getIndex()+1)},setStartBefore:function(a){this.setStart(a.getParent(),a.getIndex())},setEndAfter:function(a){this.setEnd(a.getParent(),a.getIndex()+1)},setEndBefore:function(a){this.setEnd(a.getParent(),a.getIndex())},setStartAt:function(a,b){switch(b){case CKEDITOR.POSITION_AFTER_START:this.setStart(a,0);break;case CKEDITOR.POSITION_BEFORE_END:a.type==CKEDITOR.NODE_TEXT?this.setStart(a,a.getLength()):this.setStart(a,a.getChildCount()); +break;case CKEDITOR.POSITION_BEFORE_START:this.setStartBefore(a);break;case CKEDITOR.POSITION_AFTER_END:this.setStartAfter(a)}c(this)},setEndAt:function(a,b){switch(b){case CKEDITOR.POSITION_AFTER_START:this.setEnd(a,0);break;case CKEDITOR.POSITION_BEFORE_END:a.type==CKEDITOR.NODE_TEXT?this.setEnd(a,a.getLength()):this.setEnd(a,a.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setEndBefore(a);break;case CKEDITOR.POSITION_AFTER_END:this.setEndAfter(a)}c(this)},fixBlock:function(a,b){var c= +this.createBookmark(),d=this.document.createElement(b);this.collapse(a);this.enlarge(CKEDITOR.ENLARGE_BLOCK_CONTENTS);this.extractContents().appendTo(d);d.trim();d.appendBogus();this.insertNode(d);this.moveToBookmark(c);return d},splitBlock:function(a){var b=new CKEDITOR.dom.elementPath(this.startContainer,this.root),c=new CKEDITOR.dom.elementPath(this.endContainer,this.root),d=b.block,f=c.block,e=null;if(!b.blockLimit.equals(c.blockLimit))return null;if(a!="br"){if(!d){d=this.fixBlock(true,a);f= +(new CKEDITOR.dom.elementPath(this.endContainer,this.root)).block}f||(f=this.fixBlock(false,a))}a=d&&this.checkStartOfBlock();b=f&&this.checkEndOfBlock();this.deleteContents();if(d&&d.equals(f))if(b){e=new CKEDITOR.dom.elementPath(this.startContainer,this.root);this.moveToPosition(f,CKEDITOR.POSITION_AFTER_END);f=null}else if(a){e=new CKEDITOR.dom.elementPath(this.startContainer,this.root);this.moveToPosition(d,CKEDITOR.POSITION_BEFORE_START);d=null}else{f=this.splitElement(d);d.is("ul","ol")||d.appendBogus()}return{previousBlock:d, +nextBlock:f,wasStartOfBlock:a,wasEndOfBlock:b,elementPath:e}},splitElement:function(a){if(!this.collapsed)return null;this.setEndAt(a,CKEDITOR.POSITION_BEFORE_END);var b=this.extractContents(),c=a.clone(false);b.appendTo(c);c.insertAfter(a);this.moveToPosition(a,CKEDITOR.POSITION_AFTER_END);return c},removeEmptyBlocksAtEnd:function(){function a(d){return function(a){return b(a)||(c(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.isEmptyInlineRemoveable())||d.is("table")&&a.is("caption")?false:true}}var b=CKEDITOR.dom.walker.whitespaces(), +c=CKEDITOR.dom.walker.bookmark(false);return function(b){for(var c=this.createBookmark(),d=this[b?"endPath":"startPath"](),e=d.block||d.blockLimit,m;e&&!e.equals(d.root)&&!e.getFirst(a(e));){m=e.getParent();this[b?"setEndAt":"setStartAt"](e,CKEDITOR.POSITION_AFTER_END);e.remove(1);e=m}this.moveToBookmark(c)}}(),startPath:function(){return new CKEDITOR.dom.elementPath(this.startContainer,this.root)},endPath:function(){return new CKEDITOR.dom.elementPath(this.endContainer,this.root)},checkBoundaryOfElement:function(a, +b){var c=b==CKEDITOR.START,d=this.clone();d.collapse(c);d[c?"setStartAt":"setEndAt"](a,c?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_END);d=new CKEDITOR.dom.walker(d);d.evaluator=e(c);return d[c?"checkBackward":"checkForward"]()},checkStartOfBlock:function(){var b=this.startContainer,c=this.startOffset;if(CKEDITOR.env.ie&&c&&b.type==CKEDITOR.NODE_TEXT){b=CKEDITOR.tools.ltrim(b.substring(0,c));n.test(b)&&this.trim(0,1)}this.trim();b=new CKEDITOR.dom.elementPath(this.startContainer,this.root); +c=this.clone();c.collapse(true);c.setStartAt(b.block||b.blockLimit,CKEDITOR.POSITION_AFTER_START);b=new CKEDITOR.dom.walker(c);b.evaluator=a();return b.checkBackward()},checkEndOfBlock:function(){var b=this.endContainer,c=this.endOffset;if(CKEDITOR.env.ie&&b.type==CKEDITOR.NODE_TEXT){b=CKEDITOR.tools.rtrim(b.substring(c));n.test(b)&&this.trim(1,0)}this.trim();b=new CKEDITOR.dom.elementPath(this.endContainer,this.root);c=this.clone();c.collapse(false);c.setEndAt(b.block||b.blockLimit,CKEDITOR.POSITION_BEFORE_END); +b=new CKEDITOR.dom.walker(c);b.evaluator=a();return b.checkForward()},getPreviousNode:function(a,b,c){var d=this.clone();d.collapse(1);d.setStartAt(c||this.root,CKEDITOR.POSITION_AFTER_START);c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.previous()},getNextNode:function(a,b,c){var d=this.clone();d.collapse();d.setEndAt(c||this.root,CKEDITOR.POSITION_BEFORE_END);c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.next()},checkReadOnly:function(){function a(b,c){for(;b;){if(b.type== +CKEDITOR.NODE_ELEMENT){if(b.getAttribute("contentEditable")=="false"&&!b.data("cke-editable"))return 0;if(b.is("html")||b.getAttribute("contentEditable")=="true"&&(b.contains(c)||b.equals(c)))break}b=b.getParent()}return 1}return function(){var b=this.startContainer,c=this.endContainer;return!(a(b,c)&&a(c,b))}}(),moveToElementEditablePosition:function(a,b){if(a.type==CKEDITOR.NODE_ELEMENT&&!a.isEditable(false)){this.moveToPosition(a,b?CKEDITOR.POSITION_AFTER_END:CKEDITOR.POSITION_BEFORE_START);return true}for(var c= +0;a;){if(a.type==CKEDITOR.NODE_TEXT){b&&this.endContainer&&this.checkEndOfBlock()&&n.test(a.getText())?this.moveToPosition(a,CKEDITOR.POSITION_BEFORE_START):this.moveToPosition(a,b?CKEDITOR.POSITION_AFTER_END:CKEDITOR.POSITION_BEFORE_START);c=1;break}if(a.type==CKEDITOR.NODE_ELEMENT)if(a.isEditable()){this.moveToPosition(a,b?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_START);c=1}else if(b&&a.is("br")&&this.endContainer&&this.checkEndOfBlock())this.moveToPosition(a,CKEDITOR.POSITION_BEFORE_START); +else if(a.getAttribute("contenteditable")=="false"&&a.is(CKEDITOR.dtd.$block)){this.setStartBefore(a);this.setEndAfter(a);return true}var d=a,f=c,e=void 0;d.type==CKEDITOR.NODE_ELEMENT&&d.isEditable(false)&&(e=d[b?"getLast":"getFirst"](j));!f&&!e&&(e=d[b?"getPrevious":"getNext"](j));a=e}return!!c},moveToClosestEditablePosition:function(a,b){var c=new CKEDITOR.dom.range(this.root),d=0,f,e=[CKEDITOR.POSITION_AFTER_END,CKEDITOR.POSITION_BEFORE_START];c.moveToPosition(a,e[b?0:1]);if(a.is(CKEDITOR.dtd.$block)){if(f= +c[b?"getNextEditableNode":"getPreviousEditableNode"]()){d=1;if(f.type==CKEDITOR.NODE_ELEMENT&&f.is(CKEDITOR.dtd.$block)&&f.getAttribute("contenteditable")=="false"){c.setStartAt(f,CKEDITOR.POSITION_BEFORE_START);c.setEndAt(f,CKEDITOR.POSITION_AFTER_END)}else c.moveToPosition(f,e[b?1:0])}}else d=1;d&&this.moveToRange(c);return!!d},moveToElementEditStart:function(a){return this.moveToElementEditablePosition(a)},moveToElementEditEnd:function(a){return this.moveToElementEditablePosition(a,true)},getEnclosedNode:function(){var a= +this.clone();a.optimize();if(a.startContainer.type!=CKEDITOR.NODE_ELEMENT||a.endContainer.type!=CKEDITOR.NODE_ELEMENT)return null;var a=new CKEDITOR.dom.walker(a),b=CKEDITOR.dom.walker.bookmark(false,true),c=CKEDITOR.dom.walker.whitespaces(true);a.evaluator=function(a){return c(a)&&b(a)};var d=a.next();a.reset();return d&&d.equals(a.previous())?d:null},getTouchedStartNode:function(){var a=this.startContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.startOffset)||a},getTouchedEndNode:function(){var a= +this.endContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.endOffset-1)||a},getNextEditableNode:b(),getPreviousEditableNode:b(1),scrollIntoView:function(){var a=new CKEDITOR.dom.element.createFromHtml("<span>&nbsp;</span>",this.document),b,c,d,f=this.clone();f.optimize();if(d=f.startContainer.type==CKEDITOR.NODE_TEXT){c=f.startContainer.getText();b=f.startContainer.split(f.startOffset);a.insertAfter(f.startContainer)}else f.insertNode(a);a.scrollIntoView();if(d){f.startContainer.setText(c); +b.remove()}a.remove()}}})();CKEDITOR.POSITION_AFTER_START=1;CKEDITOR.POSITION_BEFORE_END=2;CKEDITOR.POSITION_BEFORE_START=3;CKEDITOR.POSITION_AFTER_END=4;CKEDITOR.ENLARGE_ELEMENT=1;CKEDITOR.ENLARGE_BLOCK_CONTENTS=2;CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS=3;CKEDITOR.ENLARGE_INLINE=4;CKEDITOR.START=1;CKEDITOR.END=2;CKEDITOR.SHRINK_ELEMENT=1;CKEDITOR.SHRINK_TEXT=2;"use strict"; +(function(){function a(a){if(!(arguments.length<1)){this.range=a;this.forceBrBreak=0;this.enlargeBr=1;this.enforceRealBlocks=0;this._||(this._={})}}function e(a,b,c){for(a=a.getNextSourceNode(b,null,c);!h(a);)a=a.getNextSourceNode(b,null,c);return a}function b(a){var b=[];a.forEach(function(a){if(a.getAttribute("contenteditable")=="true"){b.push(a);return false}},CKEDITOR.NODE_ELEMENT,true);return b}function c(a,d,e,h){a:{h==void 0&&(h=b(e));for(var g;g=h.shift();)if(g.getDtd().p){h={element:g,remaining:h}; +break a}h=null}if(!h)return 0;if((g=CKEDITOR.filter.instances[h.element.data("cke-filter")])&&!g.check(d))return c(a,d,e,h.remaining);d=new CKEDITOR.dom.range(h.element);d.selectNodeContents(h.element);d=d.createIterator();d.enlargeBr=a.enlargeBr;d.enforceRealBlocks=a.enforceRealBlocks;d.activeFilter=d.filter=g;a._.nestedEditable={element:h.element,container:e,remaining:h.remaining,iterator:d};return 1}var d=/^[\r\n\t ]+$/,h=CKEDITOR.dom.walker.bookmark(false,true),g=CKEDITOR.dom.walker.whitespaces(true), +n=function(a){return h(a)&&g(a)};a.prototype={getNextParagraph:function(a){var b,g,q,s,u,a=a||"p";if(this._.nestedEditable){if(b=this._.nestedEditable.iterator.getNextParagraph(a)){this.activeFilter=this._.nestedEditable.iterator.activeFilter;return b}this.activeFilter=this.filter;if(c(this,a,this._.nestedEditable.container,this._.nestedEditable.remaining)){this.activeFilter=this._.nestedEditable.iterator.activeFilter;return this._.nestedEditable.iterator.getNextParagraph(a)}this._.nestedEditable= +null}if(!this.range.root.getDtd()[a])return null;if(!this._.started){var f=this.range.clone();f.shrink(CKEDITOR.SHRINK_ELEMENT,true);g=f.endContainer.hasAscendant("pre",true)||f.startContainer.hasAscendant("pre",true);f.enlarge(this.forceBrBreak&&!g||!this.enlargeBr?CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:CKEDITOR.ENLARGE_BLOCK_CONTENTS);if(!f.collapsed){g=new CKEDITOR.dom.walker(f.clone());var p=CKEDITOR.dom.walker.bookmark(true,true);g.evaluator=p;this._.nextNode=g.next();g=new CKEDITOR.dom.walker(f.clone()); +g.evaluator=p;g=g.previous();this._.lastNode=g.getNextSourceNode(true);if(this._.lastNode&&this._.lastNode.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.trim(this._.lastNode.getText())&&this._.lastNode.getParent().isBlockBoundary()){p=this.range.clone();p.moveToPosition(this._.lastNode,CKEDITOR.POSITION_AFTER_END);if(p.checkEndOfBlock()){p=new CKEDITOR.dom.elementPath(p.endContainer,p.root);this._.lastNode=(p.block||p.blockLimit).getNextSourceNode(true)}}if(!this._.lastNode||!f.root.contains(this._.lastNode)){this._.lastNode= +this._.docEndMarker=f.document.createText("");this._.lastNode.insertAfter(g)}f=null}this._.started=1;g=f}p=this._.nextNode;f=this._.lastNode;for(this._.nextNode=null;p;){var y=0,m=p.hasAscendant("pre"),k=p.type!=CKEDITOR.NODE_ELEMENT,l=0;if(k)p.type==CKEDITOR.NODE_TEXT&&d.test(p.getText())&&(k=0);else{var t=p.getName();if(CKEDITOR.dtd.$block[t]&&p.getAttribute("contenteditable")=="false"){b=p;c(this,a,b);break}else if(p.isBlockBoundary(this.forceBrBreak&&!m&&{br:1})){if(t=="br")k=1;else if(!g&&!p.getChildCount()&& +t!="hr"){b=p;q=p.equals(f);break}if(g){g.setEndAt(p,CKEDITOR.POSITION_BEFORE_START);if(t!="br")this._.nextNode=p}y=1}else{if(p.getFirst()){if(!g){g=this.range.clone();g.setStartAt(p,CKEDITOR.POSITION_BEFORE_START)}p=p.getFirst();continue}k=1}}if(k&&!g){g=this.range.clone();g.setStartAt(p,CKEDITOR.POSITION_BEFORE_START)}q=(!y||k)&&p.equals(f);if(g&&!y)for(;!p.getNext(n)&&!q;){t=p.getParent();if(t.isBlockBoundary(this.forceBrBreak&&!m&&{br:1})){y=1;k=0;q||t.equals(f);g.setEndAt(t,CKEDITOR.POSITION_BEFORE_END); +break}p=t;k=1;q=p.equals(f);l=1}k&&g.setEndAt(p,CKEDITOR.POSITION_AFTER_END);p=e(p,l,f);if((q=!p)||y&&g)break}if(!b){if(!g){this._.docEndMarker&&this._.docEndMarker.remove();return this._.nextNode=null}b=new CKEDITOR.dom.elementPath(g.startContainer,g.root);p=b.blockLimit;y={div:1,th:1,td:1};b=b.block;if(!b&&p&&!this.enforceRealBlocks&&y[p.getName()]&&g.checkStartOfBlock()&&g.checkEndOfBlock()&&!p.equals(g.root))b=p;else if(!b||this.enforceRealBlocks&&b.getName()=="li"){b=this.range.document.createElement(a); +g.extractContents().appendTo(b);b.trim();g.insertNode(b);s=u=true}else if(b.getName()!="li"){if(!g.checkStartOfBlock()||!g.checkEndOfBlock()){b=b.clone(false);g.extractContents().appendTo(b);b.trim();u=g.splitBlock();s=!u.wasStartOfBlock;u=!u.wasEndOfBlock;g.insertNode(b)}}else if(!q)this._.nextNode=b.equals(f)?null:e(g.getBoundaryNodes().endNode,1,f)}if(s)(s=b.getPrevious())&&s.type==CKEDITOR.NODE_ELEMENT&&(s.getName()=="br"?s.remove():s.getLast()&&s.getLast().$.nodeName.toLowerCase()=="br"&&s.getLast().remove()); +if(u)(s=b.getLast())&&s.type==CKEDITOR.NODE_ELEMENT&&s.getName()=="br"&&(!CKEDITOR.env.needsBrFiller||s.getPrevious(h)||s.getNext(h))&&s.remove();if(!this._.nextNode)this._.nextNode=q||b.equals(f)||!f?null:e(b,1,f);return b}};CKEDITOR.dom.range.prototype.createIterator=function(){return new a(this)}})(); +CKEDITOR.command=function(a,e){this.uiItems=[];this.exec=function(b){if(this.state==CKEDITOR.TRISTATE_DISABLED||!this.checkAllowed())return false;this.editorFocus&&a.focus();return this.fire("exec")===false?true:e.exec.call(this,a,b)!==false};this.refresh=function(a,b){if(!this.readOnly&&a.readOnly)return true;if(this.context&&!b.isContextFor(this.context)){this.disable();return true}if(!this.checkAllowed(true)){this.disable();return true}this.startDisabled||this.enable();this.modes&&!this.modes[a.mode]&& +this.disable();return this.fire("refresh",{editor:a,path:b})===false?true:e.refresh&&e.refresh.apply(this,arguments)!==false};var b;this.checkAllowed=function(c){return!c&&typeof b=="boolean"?b:b=a.activeFilter.checkFeature(this)};CKEDITOR.tools.extend(this,e,{modes:{wysiwyg:1},editorFocus:1,contextSensitive:!!e.context,state:CKEDITOR.TRISTATE_DISABLED});CKEDITOR.event.call(this)}; +CKEDITOR.command.prototype={enable:function(){this.state==CKEDITOR.TRISTATE_DISABLED&&this.checkAllowed()&&this.setState(!this.preserveState||typeof this.previousState=="undefined"?CKEDITOR.TRISTATE_OFF:this.previousState)},disable:function(){this.setState(CKEDITOR.TRISTATE_DISABLED)},setState:function(a){if(this.state==a||a!=CKEDITOR.TRISTATE_DISABLED&&!this.checkAllowed())return false;this.previousState=this.state;this.state=a;this.fire("state");return true},toggleState:function(){this.state==CKEDITOR.TRISTATE_OFF? +this.setState(CKEDITOR.TRISTATE_ON):this.state==CKEDITOR.TRISTATE_ON&&this.setState(CKEDITOR.TRISTATE_OFF)}};CKEDITOR.event.implementOn(CKEDITOR.command.prototype);CKEDITOR.ENTER_P=1;CKEDITOR.ENTER_BR=2;CKEDITOR.ENTER_DIV=3; +CKEDITOR.config={customConfig:"config.js",autoUpdateElement:!0,language:"",defaultLanguage:"en",contentsLangDirection:"",enterMode:CKEDITOR.ENTER_P,forceEnterMode:!1,shiftEnterMode:CKEDITOR.ENTER_BR,docType:"<!DOCTYPE html>",bodyId:"",bodyClass:"",fullPage:!1,height:200,extraPlugins:"",removePlugins:"",protectedSource:[],tabIndex:0,width:"",baseFloatZIndex:1E4,blockedKeystrokes:[CKEDITOR.CTRL+66,CKEDITOR.CTRL+73,CKEDITOR.CTRL+85]}; +(function(){function a(a,b,c,f,k){var m=b.name;if((f||typeof a.elements!="function"||a.elements(m))&&(!a.match||a.match(b))){if(f=!k){a:if(a.nothingRequired)f=true;else{if(k=a.requiredClasses){m=b.classes;for(f=0;f<k.length;++f)if(CKEDITOR.tools.indexOf(m,k[f])==-1){f=false;break a}}f=d(b.styles,a.requiredStyles)&&d(b.attributes,a.requiredAttributes)}f=!f}if(!f){if(!a.propertiesOnly)c.valid=true;if(!c.allAttributes)c.allAttributes=e(a.attributes,b.attributes,c.validAttributes);if(!c.allStyles)c.allStyles= +e(a.styles,b.styles,c.validStyles);if(!c.allClasses){a=a.classes;b=b.classes;f=c.validClasses;if(a)if(a===true)b=true;else{for(var k=0,m=b.length,l;k<m;++k){l=b[k];f[l]||(f[l]=a(l))}b=false}else b=false;c.allClasses=b}}}}function e(a,b,c){if(!a)return false;if(a===true)return true;for(var d in b)c[d]||(c[d]=a(d,b[d]));return false}function b(a,b){if(!a)return false;if(a===true)return a;if(typeof a=="string"){a=r(a);return a=="*"?true:CKEDITOR.tools.convertArrayToObject(a.split(b))}if(CKEDITOR.tools.isArray(a))return a.length? +CKEDITOR.tools.convertArrayToObject(a):false;var c={},d=0,f;for(f in a){c[f]=a[f];d++}return d?c:false}function c(b){if(b._.filterFunction)return b._.filterFunction;var c=/^cke:(object|embed|param)$/,d=/^(object|embed|param)$/;return b._.filterFunction=function(f,e,k,m,l,h,t){var g=f.name,r,y=false;if(l)f.name=g=g.replace(c,"$1");if(k=k&&k[g]){i(f);for(g=0;g<k.length;++g)p(b,f,k[g]);j(f)}if(e){var g=f.name,k=e.elements[g],x=e.generic,e={valid:false,validAttributes:{},validClasses:{},validStyles:{}, +allAttributes:false,allClasses:false,allStyles:false};if(!k&&!x){m.push(f);return true}i(f);if(k){g=0;for(r=k.length;g<r;++g)a(k[g],f,e,true,h)}if(x){g=0;for(r=x.length;g<r;++g)a(x[g],f,e,false,h)}if(!e.valid){m.push(f);return true}h=e.validAttributes;g=e.validStyles;k=e.validClasses;r=f.attributes;var x=f.styles,n=r["class"],L=r.style,A,z,E=[],I=[],s=/^data-cke-/,q=false;delete r.style;delete r["class"];if(!e.allAttributes)for(A in r)if(!h[A])if(s.test(A)){if(A!=(z=A.replace(/^data-cke-saved-/,""))&& +!h[z]){delete r[A];q=true}}else{delete r[A];q=true}if(e.allStyles){if(L)r.style=L}else{for(A in x)g[A]?E.push(A+":"+x[A]):q=true;if(E.length)r.style=E.sort().join("; ")}if(e.allClasses)n&&(r["class"]=n);else{for(A in k)k[A]&&I.push(A);I.length&&(r["class"]=I.sort().join(" "));n&&I.length<n.split(/\s+/).length&&(q=true)}q&&(y=true);if(!t&&!o(f)){m.push(f);return true}}if(l)f.name=f.name.replace(d,"cke:$1");return y}}function d(a,b){if(!b)return true;for(var c=0;c<b.length;++c)if(!(b[c]in a))return false; +return true}function h(a){if(!a)return{};for(var a=a.split(/\s*,\s*/).sort(),b={};a.length;)b[a.shift()]=L;return b}function g(a){for(var b,c,d,f,e={},k=1,a=r(a);b=a.match(z);){if(c=b[2]){d=n(c,"styles");f=n(c,"attrs");c=n(c,"classes")}else d=f=c=null;e["$"+k++]={elements:b[1],classes:c,styles:d,attributes:f};a=a.slice(b[0].length)}return e}function n(a,b){var c=a.match(M[b]);return c?r(c[1]):null}function i(a){if(!a.styles)a.styles=CKEDITOR.tools.parseCssText(a.attributes.style||"",1);if(!a.classes)a.classes= +a.attributes["class"]?a.attributes["class"].split(/\s+/):[]}function j(a){var b=a.attributes,c;delete b.style;delete b["class"];if(c=CKEDITOR.tools.writeCssText(a.styles,true))b.style=c;a.classes.length&&(b["class"]=a.classes.sort().join(" "))}function o(a){switch(a.name){case "a":if(!a.children.length&&!a.attributes.name)return false;break;case "img":if(!a.attributes.src)return false}return true}function q(a){return!a?false:a===true?true:function(b){return b in a}}function s(){return new CKEDITOR.htmlParser.element("br")} +function u(a){return a.type==CKEDITOR.NODE_ELEMENT&&(a.name=="br"||t.$block[a.name])}function f(a,b,c){var d=a.name;if(t.$empty[d]||!a.children.length)if(d=="hr"&&b=="br")a.replaceWith(s());else{a.parent&&c.push({check:"it",el:a.parent});a.remove()}else if(t.$block[d]||d=="tr")if(b=="br"){if(a.previous&&!u(a.previous)){b=s();b.insertBefore(a)}if(a.next&&!u(a.next)){b=s();b.insertAfter(a)}a.replaceWithChildren()}else{var d=a.children,f;b:{f=t[b];for(var e=0,k=d.length,m;e<k;++e){m=d[e];if(m.type== +CKEDITOR.NODE_ELEMENT&&!f[m.name]){f=false;break b}}f=true}if(f){a.name=b;a.attributes={};c.push({check:"parent-down",el:a})}else{f=a.parent;for(var e=f.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT||f.name=="body",l,k=d.length;k>0;){m=d[--k];if(e&&(m.type==CKEDITOR.NODE_TEXT||m.type==CKEDITOR.NODE_ELEMENT&&t.$inline[m.name])){if(!l){l=new CKEDITOR.htmlParser.element(b);l.insertAfter(a);c.push({check:"parent-down",el:l})}l.add(m,0)}else{l=null;m.insertAfter(a);f.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT&&(m.type== +CKEDITOR.NODE_ELEMENT&&!t[f.name][m.name])&&c.push({check:"el-up",el:m})}}a.remove()}}else if(d=="style")a.remove();else{a.parent&&c.push({check:"it",el:a.parent});a.replaceWithChildren()}}function p(a,b,c){var d,f;for(d=0;d<c.length;++d){f=c[d];if((!f.check||a.check(f.check,false))&&(!f.left||f.left(b))){f.right(b,Q);break}}}function y(a,b){var c=b.getDefinition(),d=c.attributes,f=c.styles,e,k,m,l;if(a.name!=c.element)return false;for(e in d)if(e=="class"){c=d[e].split(/\s+/);for(m=a.classes.join("|");l= +c.pop();)if(m.indexOf(l)==-1)return false}else if(a.attributes[e]!=d[e])return false;for(k in f)if(a.styles[k]!=f[k])return false;return true}function m(a,b){var c,d;if(typeof a=="string")c=a;else if(a instanceof CKEDITOR.style)d=a;else{c=a[0];d=a[1]}return[{element:c,left:d,right:function(a,c){c.transform(a,b)}}]}function k(a){return function(b){return y(b,a)}}function l(a){return function(b,c){c[a](b)}}var t=CKEDITOR.dtd,x=CKEDITOR.tools.copy,r=CKEDITOR.tools.trim,L="cke-test",A=["","p","br","div"]; +CKEDITOR.filter=function(a){this.allowedContent=[];this.disabled=false;this.editor=null;this.id=CKEDITOR.tools.getNextNumber();this._={rules:{},transformations:{},cachedTests:{}};CKEDITOR.filter.instances[this.id]=this;if(a instanceof CKEDITOR.editor){a=this.editor=a;this.customConfig=true;var b=a.config.allowedContent;if(b===true)this.disabled=true;else{if(!b)this.customConfig=false;this.allow(b,"config",1);this.allow(a.config.extraAllowedContent,"extra",1);this.allow(A[a.enterMode]+" "+A[a.shiftEnterMode], +"default",1)}}else{this.customConfig=false;this.allow(a,"default",1)}};CKEDITOR.filter.instances={};CKEDITOR.filter.prototype={allow:function(a,c,d){if(this.disabled||this.customConfig&&!d||!a)return false;this._.cachedChecks={};var f,e;if(typeof a=="string")a=g(a);else if(a instanceof CKEDITOR.style){e=a.getDefinition();d={};a=e.attributes;d[e.element]=e={styles:e.styles,requiredStyles:e.styles&&CKEDITOR.tools.objectKeys(e.styles)};if(a){a=x(a);e.classes=a["class"]?a["class"].split(/\s+/):null;e.requiredClasses= +e.classes;delete a["class"];e.attributes=a;e.requiredAttributes=a&&CKEDITOR.tools.objectKeys(a)}a=d}else if(CKEDITOR.tools.isArray(a)){for(f=0;f<a.length;++f)e=this.allow(a[f],c,d);return e}var k,d=[];for(k in a){e=a[k];e=typeof e=="boolean"?{}:typeof e=="function"?{match:e}:x(e);if(k.charAt(0)!="$")e.elements=k;if(c)e.featureName=c.toLowerCase();var m=e;m.elements=b(m.elements,/\s+/)||null;m.propertiesOnly=m.propertiesOnly||m.elements===true;var l=/\s*,\s*/,h=void 0;for(h in I){m[h]=b(m[h],l)||null; +var p=m,t=E[h],r=b(m[E[h]],l),i=m[h],j=[],y=true,n=void 0;r?y=false:r={};for(n in i)if(n.charAt(0)=="!"){n=n.slice(1);j.push(n);r[n]=true;y=false}for(;n=j.pop();){i[n]=i["!"+n];delete i["!"+n]}p[t]=(y?false:r)||null}m.match=m.match||null;this.allowedContent.push(e);d.push(e)}c=this._.rules;k=c.elements||{};a=c.generic||[];e=0;for(m=d.length;e<m;++e){l=x(d[e]);h=l.classes===true||l.styles===true||l.attributes===true;p=l;t=void 0;for(t in I)p[t]=q(p[t]);r=true;for(t in E){t=E[t];p[t]=CKEDITOR.tools.objectKeys(p[t]); +p[t]&&(r=false)}p.nothingRequired=r;if(l.elements===true||l.elements===null){l.elements=q(l.elements);a[h?"unshift":"push"](l)}else{p=l.elements;delete l.elements;for(f in p)if(k[f])k[f][h?"unshift":"push"](l);else k[f]=[l]}}c.elements=k;c.generic=a.length?a:null;return true},applyTo:function(a,b,d,e){if(this.disabled)return false;var k=[],m=!d&&this._.rules,l=this._.transformations,h=c(this),p=this.editor&&this.editor.config.protectedSource,g=false;a.forEach(function(a){if(a.type==CKEDITOR.NODE_ELEMENT){if(a.attributes["data-cke-filter"]== +"off")return false;if(!b||!(a.name=="span"&&~CKEDITOR.tools.objectKeys(a.attributes).join("|").indexOf("data-cke-")))h(a,m,l,k,b)&&(g=true)}else if(a.type==CKEDITOR.NODE_COMMENT&&a.value.match(/^\{cke_protected\}(?!\{C\})/)){var c;a:{var d=decodeURIComponent(a.value.replace(/^\{cke_protected\}/,""));c=[];var f,e,C;if(p)for(e=0;e<p.length;++e)if((C=d.match(p[e]))&&C[0].length==d.length){c=true;break a}d=CKEDITOR.htmlParser.fragment.fromHtml(d);d.children.length==1&&(f=d.children[0]).type==CKEDITOR.NODE_ELEMENT&& +h(f,m,l,c,b);c=!c.length}c||k.push(a)}},null,true);k.length&&(g=true);for(var r,a=[],e=A[e||(this.editor?this.editor.enterMode:CKEDITOR.ENTER_P)];d=k.pop();)d.type==CKEDITOR.NODE_ELEMENT?f(d,e,a):d.remove();for(;r=a.pop();){d=r.el;if(d.parent)switch(r.check){case "it":t.$removeEmpty[d.name]&&!d.children.length?f(d,e,a):o(d)||f(d,e,a);break;case "el-up":d.parent.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT&&!t[d.parent.name][d.name]&&f(d,e,a);break;case "parent-down":d.parent.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT&& +!t[d.parent.name][d.name]&&f(d.parent,e,a)}}return g},checkFeature:function(a){if(this.disabled||!a)return true;a.toFeature&&(a=a.toFeature(this.editor));return!a.requiredContent||this.check(a.requiredContent)},disable:function(){this.disabled=true},addContentForms:function(a){if(!this.disabled&&a){var b,c,d=[],f;for(b=0;b<a.length&&!f;++b){c=a[b];if((typeof c=="string"||c instanceof CKEDITOR.style)&&this.check(c))f=c}if(f){for(b=0;b<a.length;++b)d.push(m(a[b],f));this.addTransformations(d)}}},addFeature:function(a){if(this.disabled|| +!a)return true;a.toFeature&&(a=a.toFeature(this.editor));this.allow(a.allowedContent,a.name);this.addTransformations(a.contentTransformations);this.addContentForms(a.contentForms);return this.customConfig&&a.requiredContent?this.check(a.requiredContent):true},addTransformations:function(a){var b,c;if(!this.disabled&&a){var d=this._.transformations,f;for(f=0;f<a.length;++f){b=a[f];var e=void 0,m=void 0,h=void 0,p=void 0,t=void 0,g=void 0;c=[];for(m=0;m<b.length;++m){h=b[m];if(typeof h=="string"){h= +h.split(/\s*:\s*/);p=h[0];t=null;g=h[1]}else{p=h.check;t=h.left;g=h.right}if(!e){e=h;e=e.element?e.element:p?p.match(/^([a-z0-9]+)/i)[0]:e.left.getDefinition().element}t instanceof CKEDITOR.style&&(t=k(t));c.push({check:p==e?null:p,left:t,right:typeof g=="string"?l(g):g})}b=e;d[b]||(d[b]=[]);d[b].push(c)}}},check:function(a,b,d){if(this.disabled)return true;if(CKEDITOR.tools.isArray(a)){for(var f=a.length;f--;)if(this.check(a[f],b,d))return true;return false}var e,k;if(typeof a=="string"){k=a+"<"+ +(b===false?"0":"1")+(d?"1":"0")+">";if(k in this._.cachedChecks)return this._.cachedChecks[k];f=g(a).$1;e=f.styles;var m=f.classes;f.name=f.elements;f.classes=m=m?m.split(/\s*,\s*/):[];f.styles=h(e);f.attributes=h(f.attributes);f.children=[];m.length&&(f.attributes["class"]=m.join(" "));if(e)f.attributes.style=CKEDITOR.tools.writeCssText(f.styles);e=f}else{f=a.getDefinition();e=f.styles;m=f.attributes||{};if(e){e=x(e);m.style=CKEDITOR.tools.writeCssText(e,true)}else e={};e={name:f.element,attributes:m, +classes:m["class"]?m["class"].split(/\s+/):[],styles:e,children:[]}}var m=CKEDITOR.tools.clone(e),l=[],t;if(b!==false&&(t=this._.transformations[e.name])){for(f=0;f<t.length;++f)p(this,e,t[f]);j(e)}c(this)(m,this._.rules,b===false?false:this._.transformations,l,false,!d,!d);b=l.length>0?false:CKEDITOR.tools.objectCompare(e.attributes,m.attributes,true)?true:false;typeof a=="string"&&(this._.cachedChecks[k]=b);return b},getAllowedEnterMode:function(){var a=["p","div","br"],b={p:CKEDITOR.ENTER_P,div:CKEDITOR.ENTER_DIV, +br:CKEDITOR.ENTER_BR};return function(c,d){var f=a.slice(),e;if(this.check(A[c]))return c;for(d||(f=f.reverse());e=f.pop();)if(this.check(e))return b[e];return CKEDITOR.ENTER_BR}}()};var I={styles:1,attributes:1,classes:1},E={styles:"requiredStyles",attributes:"requiredAttributes",classes:"requiredClasses"},z=/^([a-z0-9*\s]+)((?:\s*\{[!\w\-,\s\*]+\}\s*|\s*\[[!\w\-,\s\*]+\]\s*|\s*\([!\w\-,\s\*]+\)\s*){0,3})(?:;\s*|$)/i,M={styles:/{([^}]+)}/,attrs:/\[([^\]]+)\]/,classes:/\(([^\)]+)\)/},Q=CKEDITOR.filter.transformationsTools= +{sizeToStyle:function(a){this.lengthToStyle(a,"width");this.lengthToStyle(a,"height")},sizeToAttribute:function(a){this.lengthToAttribute(a,"width");this.lengthToAttribute(a,"height")},lengthToStyle:function(a,b,c){c=c||b;if(!(c in a.styles)){var d=a.attributes[b];if(d){/^\d+$/.test(d)&&(d=d+"px");a.styles[c]=d}}delete a.attributes[b]},lengthToAttribute:function(a,b,c){c=c||b;if(!(c in a.attributes)){var d=a.styles[b],f=d&&d.match(/^(\d+)(?:\.\d*)?px$/);f?a.attributes[c]=f[1]:d==L&&(a.attributes[c]= +L)}delete a.styles[b]},alignmentToStyle:function(a){if(!("float"in a.styles)){var b=a.attributes.align;if(b=="left"||b=="right")a.styles["float"]=b}delete a.attributes.align},alignmentToAttribute:function(a){if(!("align"in a.attributes)){var b=a.styles["float"];if(b=="left"||b=="right")a.attributes.align=b}delete a.styles["float"]},matchesStyle:y,transform:function(a,b){if(typeof b=="string")a.name=b;else{var c=b.getDefinition(),d=c.styles,f=c.attributes,e,k,m,l;a.name=c.element;for(e in f)if(e== +"class"){c=a.classes.join("|");for(m=f[e].split(/\s+/);l=m.pop();)c.indexOf(l)==-1&&a.classes.push(l)}else a.attributes[e]=f[e];for(k in d)a.styles[k]=d[k]}}}})(); +(function(){CKEDITOR.focusManager=function(a){if(a.focusManager)return a.focusManager;this.hasFocus=false;this.currentActive=null;this._={editor:a};return this};CKEDITOR.focusManager._={blurDelay:200};CKEDITOR.focusManager.prototype={focus:function(a){this._.timer&&clearTimeout(this._.timer);if(a)this.currentActive=a;if(!this.hasFocus&&!this._.locked){(a=CKEDITOR.currentInstance)&&a.focusManager.blur(1);this.hasFocus=true;(a=this._.editor.container)&&a.addClass("cke_focus");this._.editor.fire("focus")}}, +lock:function(){this._.locked=1},unlock:function(){delete this._.locked},blur:function(a){function e(){if(this.hasFocus){this.hasFocus=false;var a=this._.editor.container;a&&a.removeClass("cke_focus");this._.editor.fire("blur")}}if(!this._.locked){this._.timer&&clearTimeout(this._.timer);var b=CKEDITOR.focusManager._.blurDelay;a||!b?e.call(this):this._.timer=CKEDITOR.tools.setTimeout(function(){delete this._.timer;e.call(this)},b,this)}},add:function(a,e){var b=a.getCustomData("focusmanager");if(!b|| +b!=this){b&&b.remove(a);var b="focus",c="blur";if(e)if(CKEDITOR.env.ie){b="focusin";c="focusout"}else CKEDITOR.event.useCapture=1;var d={blur:function(){a.equals(this.currentActive)&&this.blur()},focus:function(){this.focus(a)}};a.on(b,d.focus,this);a.on(c,d.blur,this);if(e)CKEDITOR.event.useCapture=0;a.setCustomData("focusmanager",this);a.setCustomData("focusmanager_handlers",d)}},remove:function(a){a.removeCustomData("focusmanager");var e=a.removeCustomData("focusmanager_handlers");a.removeListener("blur", +e.blur);a.removeListener("focus",e.focus)}}})();CKEDITOR.keystrokeHandler=function(a){if(a.keystrokeHandler)return a.keystrokeHandler;this.keystrokes={};this.blockedKeystrokes={};this._={editor:a};return this}; +(function(){var a,e=function(b){var b=b.data,d=b.getKeystroke(),e=this.keystrokes[d],g=this._.editor;a=g.fire("key",{keyCode:d})===false;if(!a){e&&(a=g.execCommand(e,{from:"keystrokeHandler"})!==false);a||(a=!!this.blockedKeystrokes[d])}a&&b.preventDefault(true);return!a},b=function(b){if(a){a=false;b.data.preventDefault(true)}};CKEDITOR.keystrokeHandler.prototype={attach:function(a){a.on("keydown",e,this);if(CKEDITOR.env.opera||CKEDITOR.env.gecko&&CKEDITOR.env.mac)a.on("keypress",b,this)}}})(); +(function(){CKEDITOR.lang={languages:{af:1,ar:1,bg:1,bn:1,bs:1,ca:1,cs:1,cy:1,da:1,de:1,el:1,"en-au":1,"en-ca":1,"en-gb":1,en:1,eo:1,es:1,et:1,eu:1,fa:1,fi:1,fo:1,"fr-ca":1,fr:1,gl:1,gu:1,he:1,hi:1,hr:1,hu:1,id:1,is:1,it:1,ja:1,ka:1,km:1,ko:1,ku:1,lt:1,lv:1,mk:1,mn:1,ms:1,nb:1,nl:1,no:1,pl:1,"pt-br":1,pt:1,ro:1,ru:1,si:1,sk:1,sl:1,sq:1,"sr-latn":1,sr:1,sv:1,th:1,tr:1,ug:1,uk:1,vi:1,"zh-cn":1,zh:1},rtl:{ar:1,fa:1,he:1,ku:1,ug:1},load:function(a,e,b){if(!a||!CKEDITOR.lang.languages[a])a=this.detect(e, +a);this[a]?b(a,this[a]):CKEDITOR.scriptLoader.load(CKEDITOR.getUrl("lang/"+a+".js"),function(){this[a].dir=this.rtl[a]?"rtl":"ltr";b(a,this[a])},this)},detect:function(a,e){var b=this.languages,e=e||navigator.userLanguage||navigator.language||a,c=e.toLowerCase().match(/([a-z]+)(?:-([a-z]+))?/),d=c[1],c=c[2];b[d+"-"+c]?d=d+"-"+c:b[d]||(d=null);CKEDITOR.lang.detect=d?function(){return d}:function(a){return a};return d||a}}})(); +CKEDITOR.scriptLoader=function(){var a={},e={};return{load:function(b,c,d,h){var g=typeof b=="string";g&&(b=[b]);d||(d=CKEDITOR);var n=b.length,i=[],j=[],o=function(a){c&&(g?c.call(d,a):c.call(d,i,j))};if(n===0)o(true);else{var q=function(a,b){(b?i:j).push(a);if(--n<=0){h&&CKEDITOR.document.getDocumentElement().removeStyle("cursor");o(b)}},s=function(b,c){a[b]=1;var d=e[b];delete e[b];for(var f=0;f<d.length;f++)d[f](b,c)},u=function(b){if(a[b])q(b,true);else{var d=e[b]||(e[b]=[]);d.push(q);if(!(d.length> +1)){var f=new CKEDITOR.dom.element("script");f.setAttributes({type:"text/javascript",src:b});if(c)if(CKEDITOR.env.ie&&CKEDITOR.env.version<11)f.$.onreadystatechange=function(){if(f.$.readyState=="loaded"||f.$.readyState=="complete"){f.$.onreadystatechange=null;s(b,true)}};else{f.$.onload=function(){setTimeout(function(){s(b,true)},0)};f.$.onerror=function(){s(b,false)}}f.appendTo(CKEDITOR.document.getHead())}}};h&&CKEDITOR.document.getDocumentElement().setStyle("cursor","wait");for(var f=0;f<n;f++)u(b[f])}}, +queue:function(){function a(){var b;(b=c[0])&&this.load(b.scriptUrl,b.callback,CKEDITOR,0)}var c=[];return function(d,e){var g=this;c.push({scriptUrl:d,callback:function(){e&&e.apply(this,arguments);c.shift();a.call(g)}});c.length==1&&a.call(this)}}()}}();CKEDITOR.resourceManager=function(a,e){this.basePath=a;this.fileName=e;this.registered={};this.loaded={};this.externals={};this._={waitingList:{}}}; +CKEDITOR.resourceManager.prototype={add:function(a,e){if(this.registered[a])throw'[CKEDITOR.resourceManager.add] The resource name "'+a+'" is already registered.';var b=this.registered[a]=e||{};b.name=a;b.path=this.getPath(a);CKEDITOR.fire(a+CKEDITOR.tools.capitalize(this.fileName)+"Ready",b);return this.get(a)},get:function(a){return this.registered[a]||null},getPath:function(a){var e=this.externals[a];return CKEDITOR.getUrl(e&&e.dir||this.basePath+a+"/")},getFilePath:function(a){var e=this.externals[a]; +return CKEDITOR.getUrl(this.getPath(a)+(e?e.file:this.fileName+".js"))},addExternal:function(a,e,b){for(var a=a.split(","),c=0;c<a.length;c++){var d=a[c];b||(e=e.replace(/[^\/]+$/,function(a){b=a;return""}));this.externals[d]={dir:e,file:b||this.fileName+".js"}}},load:function(a,e,b){CKEDITOR.tools.isArray(a)||(a=a?[a]:[]);for(var c=this.loaded,d=this.registered,h=[],g={},n={},i=0;i<a.length;i++){var j=a[i];if(j)if(!c[j]&&!d[j]){var o=this.getFilePath(j);h.push(o);o in g||(g[o]=[]);g[o].push(j)}else n[j]= +this.get(j)}CKEDITOR.scriptLoader.load(h,function(a,d){if(d.length)throw'[CKEDITOR.resourceManager.load] Resource name "'+g[d[0]].join(",")+'" was not found at "'+d[0]+'".';for(var h=0;h<a.length;h++)for(var f=g[a[h]],p=0;p<f.length;p++){var i=f[p];n[i]=this.get(i);c[i]=1}e.call(b,n)},this)}};CKEDITOR.plugins=new CKEDITOR.resourceManager("plugins/","plugin"); +CKEDITOR.plugins.load=CKEDITOR.tools.override(CKEDITOR.plugins.load,function(a){var e={};return function(b,c,d){var h={},g=function(b){a.call(this,b,function(a){CKEDITOR.tools.extend(h,a);var b=[],n;for(n in a){var q=a[n],s=q&&q.requires;if(!e[n]){if(q.icons)for(var u=q.icons.split(","),f=u.length;f--;)CKEDITOR.skin.addIcon(u[f],q.path+"icons/"+(CKEDITOR.env.hidpi&&q.hidpi?"hidpi/":"")+u[f]+".png");e[n]=1}if(s){s.split&&(s=s.split(","));for(q=0;q<s.length;q++)h[s[q]]||b.push(s[q])}}if(b.length)g.call(this, +b);else{for(n in h){q=h[n];if(q.onLoad&&!q.onLoad._called){q.onLoad()===false&&delete h[n];q.onLoad._called=1}}c&&c.call(d||window,h)}},this)};g.call(this,b)}});CKEDITOR.plugins.setLang=function(a,e,b){var c=this.get(a),a=c.langEntries||(c.langEntries={}),c=c.lang||(c.lang=[]);c.split&&(c=c.split(","));CKEDITOR.tools.indexOf(c,e)==-1&&c.push(e);a[e]=b};CKEDITOR.ui=function(a){if(a.ui)return a.ui;this.items={};this.instances={};this.editor=a;this._={handlers:{}};return this}; +CKEDITOR.ui.prototype={add:function(a,e,b){b.name=a.toLowerCase();var c=this.items[a]={type:e,command:b.command||null,args:Array.prototype.slice.call(arguments,2)};CKEDITOR.tools.extend(c,b)},get:function(a){return this.instances[a]},create:function(a){var e=this.items[a],b=e&&this._.handlers[e.type],c=e&&e.command&&this.editor.getCommand(e.command),b=b&&b.create.apply(this,e.args);this.instances[a]=b;c&&c.uiItems.push(b);if(b&&!b.type)b.type=e.type;return b},addHandler:function(a,e){this._.handlers[a]= +e},space:function(a){return CKEDITOR.document.getById(this.spaceId(a))},spaceId:function(a){return this.editor.id+"_"+a}};CKEDITOR.event.implementOn(CKEDITOR.ui); +(function(){function a(a,c,h){CKEDITOR.event.call(this);a=a&&CKEDITOR.tools.clone(a);if(c!==void 0){if(c instanceof CKEDITOR.dom.element){if(!h)throw Error("One of the element modes must be specified.");}else throw Error("Expect element of type CKEDITOR.dom.element.");if(CKEDITOR.env.ie&&CKEDITOR.env.quirks&&h==CKEDITOR.ELEMENT_MODE_INLINE)throw Error("Inline element mode is not supported on IE quirks.");if(!(h==CKEDITOR.ELEMENT_MODE_INLINE?c.is(CKEDITOR.dtd.$editable)||c.is("textarea"):h==CKEDITOR.ELEMENT_MODE_REPLACE? +!c.is(CKEDITOR.dtd.$nonBodyContent):1))throw Error('The specified element mode is not supported on element: "'+c.getName()+'".');this.element=c;this.elementMode=h;this.name=this.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO&&(c.getId()||c.getNameAtt())}else this.elementMode=CKEDITOR.ELEMENT_MODE_NONE;this._={};this.commands={};this.templates={};this.name=this.name||e();this.id=CKEDITOR.tools.getNextId();this.status="unloaded";this.config=CKEDITOR.tools.prototypedCopy(CKEDITOR.config);this.ui=new CKEDITOR.ui(this); +this.focusManager=new CKEDITOR.focusManager(this);this.keystrokeHandler=new CKEDITOR.keystrokeHandler(this);this.on("readOnly",b);this.on("selectionChange",function(a){d(this,a.data.path)});this.on("activeFilterChange",function(){d(this,this.elementPath(),true)});this.on("mode",b);this.on("instanceReady",function(){this.config.startupFocus&&this.focus()});CKEDITOR.fire("instanceCreated",null,this);CKEDITOR.add(this);CKEDITOR.tools.setTimeout(function(){g(this,a)},0,this)}function e(){do var a="editor"+ +++s;while(CKEDITOR.instances[a]);return a}function b(){var a=this.commands,b;for(b in a)c(this,a[b])}function c(a,b){b[b.startDisabled?"disable":a.readOnly&&!b.readOnly?"disable":b.modes[a.mode]?"enable":"disable"]()}function d(a,b,c){if(b){var d,e,l=a.commands;for(e in l){d=l[e];(c||d.contextSensitive)&&d.refresh(a,b)}}}function h(a){var b=a.config.customConfig;if(!b)return false;var b=CKEDITOR.getUrl(b),c=u[b]||(u[b]={});if(c.fn){c.fn.call(a,a.config);(CKEDITOR.getUrl(a.config.customConfig)==b|| +!h(a))&&a.fireOnce("customConfigLoaded")}else CKEDITOR.scriptLoader.queue(b,function(){c.fn=CKEDITOR.editorConfig?CKEDITOR.editorConfig:function(){};h(a)});return true}function g(a,b){a.on("customConfigLoaded",function(){if(b){if(b.on)for(var c in b.on)a.on(c,b.on[c]);CKEDITOR.tools.extend(a.config,b,true);delete a.config.on}c=a.config;a.readOnly=!(!c.readOnly&&!(a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?a.element.is("textarea")?a.element.hasAttribute("disabled"):a.element.isReadOnly():a.elementMode== +CKEDITOR.ELEMENT_MODE_REPLACE&&a.element.hasAttribute("disabled")));a.blockless=a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?!(a.element.is("textarea")||CKEDITOR.dtd[a.element.getName()].p):false;a.tabIndex=c.tabIndex||a.element&&a.element.getAttribute("tabindex")||0;a.activeEnterMode=a.enterMode=a.blockless?CKEDITOR.ENTER_BR:c.enterMode;a.activeShiftEnterMode=a.shiftEnterMode=a.blockless?CKEDITOR.ENTER_BR:c.shiftEnterMode;if(c.skin)CKEDITOR.skinName=c.skin;a.fireOnce("configLoaded");a.dataProcessor= +new CKEDITOR.htmlDataProcessor(a);a.filter=a.activeFilter=new CKEDITOR.filter(a);n(a)});if(b&&b.customConfig!=void 0)a.config.customConfig=b.customConfig;h(a)||a.fireOnce("customConfigLoaded")}function n(a){CKEDITOR.skin.loadPart("editor",function(){i(a)})}function i(a){CKEDITOR.lang.load(a.config.language,a.config.defaultLanguage,function(b,c){var d=a.config.title;a.langCode=b;a.lang=CKEDITOR.tools.prototypedCopy(c);a.title=typeof d=="string"||d===false?d:[a.lang.editor,a.name].join(", ");if(CKEDITOR.env.gecko&& +CKEDITOR.env.version<10900&&a.lang.dir=="rtl")a.lang.dir="ltr";if(!a.config.contentsLangDirection)a.config.contentsLangDirection=a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?a.element.getDirection(1):a.lang.dir;a.fire("langLoaded");j(a)})}function j(a){a.getStylesSet(function(b){a.once("loaded",function(){a.fire("stylesSet",{styles:b})},null,null,1);o(a)})}function o(a){var b=a.config,c=b.plugins,d=b.extraPlugins,e=b.removePlugins;if(d)var l=RegExp("(?:^|,)(?:"+d.replace(/\s*,\s*/g,"|")+")(?=,|$)", +"g"),c=c.replace(l,""),c=c+(","+d);if(e)var h=RegExp("(?:^|,)(?:"+e.replace(/\s*,\s*/g,"|")+")(?=,|$)","g"),c=c.replace(h,"");CKEDITOR.env.air&&(c=c+",adobeair");CKEDITOR.plugins.load(c.split(","),function(c){var d=[],e=[],k=[];a.plugins=c;for(var l in c){var m=c[l],g=m.lang,i=null,j=m.requires,v;CKEDITOR.tools.isArray(j)&&(j=j.join(","));if(j&&(v=j.match(h)))for(;j=v.pop();)CKEDITOR.tools.setTimeout(function(a,b){throw Error('Plugin "'+a.replace(",","")+'" cannot be removed from the plugins list, because it\'s required by "'+ +b+'" plugin.');},0,null,[j,l]);if(g&&!a.lang[l]){g.split&&(g=g.split(","));if(CKEDITOR.tools.indexOf(g,a.langCode)>=0)i=a.langCode;else{i=a.langCode.replace(/-.*/,"");i=i!=a.langCode&&CKEDITOR.tools.indexOf(g,i)>=0?i:CKEDITOR.tools.indexOf(g,"en")>=0?"en":g[0]}if(!m.langEntries||!m.langEntries[i])k.push(CKEDITOR.getUrl(m.path+"lang/"+i+".js"));else{a.lang[l]=m.langEntries[i];i=null}}e.push(i);d.push(m)}CKEDITOR.scriptLoader.load(k,function(){for(var c=["beforeInit","init","afterInit"],k=0;k<c.length;k++)for(var m= +0;m<d.length;m++){var l=d[m];k===0&&(e[m]&&l.lang&&l.langEntries)&&(a.lang[l.name]=l.langEntries[e[m]]);if(l[c[k]])l[c[k]](a)}a.fireOnce("pluginsLoaded");b.keystrokes&&a.setKeystroke(a.config.keystrokes);for(m=0;m<a.config.blockedKeystrokes.length;m++)a.keystrokeHandler.blockedKeystrokes[a.config.blockedKeystrokes[m]]=1;a.status="loaded";a.fireOnce("loaded");CKEDITOR.fire("instanceLoaded",null,a)})})}function q(){var a=this.element;if(a&&this.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO){var b=this.getData(); +this.config.htmlEncodeOutput&&(b=CKEDITOR.tools.htmlEncode(b));a.is("textarea")?a.setValue(b):a.setHtml(b);return true}return false}a.prototype=CKEDITOR.editor.prototype;CKEDITOR.editor=a;var s=0,u={};CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{addCommand:function(a,b){b.name=a.toLowerCase();var d=new CKEDITOR.command(this,b);this.mode&&c(this,d);return this.commands[a]=d},_attachToForm:function(){var a=this,b=a.element,c=new CKEDITOR.dom.element(b.$.form);if(b.is("textarea")&&c){var d=function(c){a.updateElement(); +a._.required&&(!b.getValue()&&a.fire("required")===false)&&c.data.preventDefault()};c.on("submit",d);if(c.$.submit&&c.$.submit.call&&c.$.submit.apply)c.$.submit=CKEDITOR.tools.override(c.$.submit,function(a){return function(){d();a.apply?a.apply(this):a()}});a.on("destroy",function(){c.removeListener("submit",d)})}},destroy:function(a){this.fire("beforeDestroy");!a&&q.call(this);this.editable(null);this.status="destroyed";this.fire("destroy");this.removeAllListeners();CKEDITOR.remove(this);CKEDITOR.fire("instanceDestroyed", +null,this)},elementPath:function(a){return(a=a||this.getSelection().getStartElement())?new CKEDITOR.dom.elementPath(a,this.editable()):null},createRange:function(){var a=this.editable();return a?new CKEDITOR.dom.range(a):null},execCommand:function(a,b){var c=this.getCommand(a),d={name:a,commandData:b,command:c};if(c&&c.state!=CKEDITOR.TRISTATE_DISABLED&&this.fire("beforeCommandExec",d)!==true){d.returnValue=c.exec(d.commandData);if(!c.async&&this.fire("afterCommandExec",d)!==true)return d.returnValue}return false}, +getCommand:function(a){return this.commands[a]},getData:function(a){!a&&this.fire("beforeGetData");var b=this._.data;if(typeof b!="string")b=(b=this.element)&&this.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE?b.is("textarea")?b.getValue():b.getHtml():"";b={dataValue:b};!a&&this.fire("getData",b);return b.dataValue},getSnapshot:function(){var a=this.fire("getSnapshot");if(typeof a!="string"){var b=this.element;b&&this.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&(a=b.is("textarea")?b.getValue():b.getHtml())}return a}, +loadSnapshot:function(a){this.fire("loadSnapshot",a)},setData:function(a,b,c){if(b)this.on("dataReady",function(a){a.removeListener();b.call(a.editor)});a={dataValue:a};!c&&this.fire("setData",a);this._.data=a.dataValue;!c&&this.fire("afterSetData",a)},setReadOnly:function(a){a=a==void 0||a;if(this.readOnly!=a){this.readOnly=a;this.keystrokeHandler.blockedKeystrokes[8]=+a;this.editable().setReadOnly(a);this.fire("readOnly")}},insertHtml:function(a,b){this.fire("insertHtml",{dataValue:a,mode:b})}, +insertText:function(a){this.fire("insertText",a)},insertElement:function(a){this.fire("insertElement",a)},focus:function(){this.fire("beforeFocus")},checkDirty:function(){return this.status=="ready"&&this._.previousValue!==this.getSnapshot()},resetDirty:function(){this._.previousValue=this.getSnapshot()},updateElement:function(){return q.call(this)},setKeystroke:function(){for(var a=this.keystrokeHandler.keystrokes,b=CKEDITOR.tools.isArray(arguments[0])?arguments[0]:[[].slice.call(arguments,0)],c, +d,e=b.length;e--;){c=b[e];d=0;if(CKEDITOR.tools.isArray(c)){d=c[1];c=c[0]}d?a[c]=d:delete a[c]}},addFeature:function(a){return this.filter.addFeature(a)},setActiveFilter:function(a){if(!a)a=this.filter;if(this.activeFilter!==a){this.activeFilter=a;this.fire("activeFilterChange");a===this.filter?this.setActiveEnterMode(null,null):this.setActiveEnterMode(a.getAllowedEnterMode(this.enterMode),a.getAllowedEnterMode(this.shiftEnterMode,true))}},setActiveEnterMode:function(a,b){a=a?this.blockless?CKEDITOR.ENTER_BR: +a:this.enterMode;b=b?this.blockless?CKEDITOR.ENTER_BR:b:this.shiftEnterMode;if(this.activeEnterMode!=a||this.activeShiftEnterMode!=b){this.activeEnterMode=a;this.activeShiftEnterMode=b;this.fire("activeEnterModeChange")}}})})();CKEDITOR.ELEMENT_MODE_NONE=0;CKEDITOR.ELEMENT_MODE_REPLACE=1;CKEDITOR.ELEMENT_MODE_APPENDTO=2;CKEDITOR.ELEMENT_MODE_INLINE=3; +CKEDITOR.htmlParser=function(){this._={htmlPartsRegex:RegExp("<(?:(?:\\/([^>]+)>)|(?:!--([\\S|\\s]*?)--\>)|(?:([^\\s>]+)\\s*((?:(?:\"[^\"]*\")|(?:'[^']*')|[^\"'>])*)\\/?>))","g")}}; +(function(){var a=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,e={checked:1,compact:1,declare:1,defer:1,disabled:1,ismap:1,multiple:1,nohref:1,noresize:1,noshade:1,nowrap:1,readonly:1,selected:1};CKEDITOR.htmlParser.prototype={onTagOpen:function(){},onTagClose:function(){},onText:function(){},onCDATA:function(){},onComment:function(){},parse:function(b){for(var c,d,h=0,g;c=this._.htmlPartsRegex.exec(b);){d=c.index;if(d>h){h=b.substring(h,d);if(g)g.push(h);else this.onText(h)}h= +this._.htmlPartsRegex.lastIndex;if(d=c[1]){d=d.toLowerCase();if(g&&CKEDITOR.dtd.$cdata[d]){this.onCDATA(g.join(""));g=null}if(!g){this.onTagClose(d);continue}}if(g)g.push(c[0]);else if(d=c[3]){d=d.toLowerCase();if(!/="/.test(d)){var n={},i;c=c[4];var j=!!(c&&c.charAt(c.length-1)=="/");if(c)for(;i=a.exec(c);){var o=i[1].toLowerCase();i=i[2]||i[3]||i[4]||"";n[o]=!i&&e[o]?o:CKEDITOR.tools.htmlDecodeAttr(i)}this.onTagOpen(d,n,j);!g&&CKEDITOR.dtd.$cdata[d]&&(g=[])}}else if(d=c[2])this.onComment(d)}if(b.length> +h)this.onText(b.substring(h,b.length))}}})(); +CKEDITOR.htmlParser.basicWriter=CKEDITOR.tools.createClass({$:function(){this._={output:[]}},proto:{openTag:function(a){this._.output.push("<",a)},openTagClose:function(a,e){e?this._.output.push(" />"):this._.output.push(">")},attribute:function(a,e){typeof e=="string"&&(e=CKEDITOR.tools.htmlEncodeAttr(e));this._.output.push(" ",a,'="',e,'"')},closeTag:function(a){this._.output.push("</",a,">")},text:function(a){this._.output.push(a)},comment:function(a){this._.output.push("<\!--",a,"--\>")},write:function(a){this._.output.push(a)}, +reset:function(){this._.output=[];this._.indent=false},getHtml:function(a){var e=this._.output.join("");a&&this.reset();return e}}});"use strict"; +(function(){CKEDITOR.htmlParser.node=function(){};CKEDITOR.htmlParser.node.prototype={remove:function(){var a=this.parent.children,e=CKEDITOR.tools.indexOf(a,this),b=this.previous,c=this.next;b&&(b.next=c);c&&(c.previous=b);a.splice(e,1);this.parent=null},replaceWith:function(a){var e=this.parent.children,b=CKEDITOR.tools.indexOf(e,this),c=a.previous=this.previous,d=a.next=this.next;c&&(c.next=a);d&&(d.previous=a);e[b]=a;a.parent=this.parent;this.parent=null},insertAfter:function(a){var e=a.parent.children, +b=CKEDITOR.tools.indexOf(e,a),c=a.next;e.splice(b+1,0,this);this.next=a.next;this.previous=a;a.next=this;c&&(c.previous=this);this.parent=a.parent},insertBefore:function(a){var e=a.parent.children,b=CKEDITOR.tools.indexOf(e,a);e.splice(b,0,this);this.next=a;(this.previous=a.previous)&&(a.previous.next=this);a.previous=this;this.parent=a.parent},getAscendant:function(a){var e=typeof a=="function"?a:typeof a=="string"?function(b){return b.name==a}:function(b){return b.name in a},b=this.parent;for(;b&& +b.type==CKEDITOR.NODE_ELEMENT;){if(e(b))return b;b=b.parent}return null},wrapWith:function(a){this.replaceWith(a);a.add(this);return a},getIndex:function(){return CKEDITOR.tools.indexOf(this.parent.children,this)},getFilterContext:function(a){return a||{}}}})();"use strict";CKEDITOR.htmlParser.comment=function(a){this.value=a;this._={isBlockLike:false}}; +CKEDITOR.htmlParser.comment.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_COMMENT,filter:function(a,e){var b=this.value;if(!(b=a.onComment(e,b,this))){this.remove();return false}if(typeof b!="string"){this.replaceWith(b);return false}this.value=b;return true},writeHtml:function(a,e){e&&this.filter(e);a.comment(this.value)}});"use strict"; +(function(){CKEDITOR.htmlParser.text=function(a){this.value=a;this._={isBlockLike:false}};CKEDITOR.htmlParser.text.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_TEXT,filter:function(a,e){if(!(this.value=a.onText(e,this.value,this))){this.remove();return false}},writeHtml:function(a,e){e&&this.filter(e);a.text(this.value)}})})();"use strict"; +(function(){CKEDITOR.htmlParser.cdata=function(a){this.value=a};CKEDITOR.htmlParser.cdata.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_TEXT,filter:function(){},writeHtml:function(a){a.write(this.value)}})})();"use strict";CKEDITOR.htmlParser.fragment=function(){this.children=[];this.parent=null;this._={isBlockLike:true,hasInlineStarted:false}}; +(function(){function a(a){return a.attributes["data-cke-survive"]?false:a.name=="a"&&a.attributes.href||CKEDITOR.dtd.$removeEmpty[a.name]}var e=CKEDITOR.tools.extend({table:1,ul:1,ol:1,dl:1},CKEDITOR.dtd.table,CKEDITOR.dtd.ul,CKEDITOR.dtd.ol,CKEDITOR.dtd.dl),b={ol:1,ul:1},c=CKEDITOR.tools.extend({},{html:1},CKEDITOR.dtd.html,CKEDITOR.dtd.body,CKEDITOR.dtd.head,{style:1,script:1});CKEDITOR.htmlParser.fragment.fromHtml=function(d,h,g){function n(a){var b;if(p.length>0)for(var c=0;c<p.length;c++){var d= +p[c],e=d.name,f=CKEDITOR.dtd[e],k=m.name&&CKEDITOR.dtd[m.name];if((!k||k[e])&&(!a||!f||f[a]||!CKEDITOR.dtd[a])){if(!b){i();b=1}d=d.clone();d.parent=m;m=d;p.splice(c,1);c--}else if(e==m.name){o(m,m.parent,1);c--}}}function i(){for(;y.length;)o(y.shift(),m)}function j(a){if(a._.isBlockLike&&a.name!="pre"&&a.name!="textarea"){var b=a.children.length,c=a.children[b-1],d;if(c&&c.type==CKEDITOR.NODE_TEXT)(d=CKEDITOR.tools.rtrim(c.value))?c.value=d:a.children.length=b-1}}function o(b,c,d){var c=c||m||f, +e=m;if(b.previous===void 0){if(q(c,b)){m=c;u.onTagOpen(g,{});b.returnPoint=c=m}j(b);(!a(b)||b.children.length)&&c.add(b);b.name=="pre"&&(l=false);b.name=="textarea"&&(k=false)}if(b.returnPoint){m=b.returnPoint;delete b.returnPoint}else m=d?c:e}function q(a,b){if((a==f||a.name=="body")&&g&&(!a.name||CKEDITOR.dtd[a.name][g])){var c,d;return(c=b.attributes&&(d=b.attributes["data-cke-real-element-type"])?d:b.name)&&c in CKEDITOR.dtd.$inline&&!(c in CKEDITOR.dtd.head)&&!b.isOrphan||b.type==CKEDITOR.NODE_TEXT}} +function s(a,b){return a in CKEDITOR.dtd.$listItem||a in CKEDITOR.dtd.$tableContent?a==b||a=="dt"&&b=="dd"||a=="dd"&&b=="dt":false}var u=new CKEDITOR.htmlParser,f=h instanceof CKEDITOR.htmlParser.element?h:typeof h=="string"?new CKEDITOR.htmlParser.element(h):new CKEDITOR.htmlParser.fragment,p=[],y=[],m=f,k=f.name=="textarea",l=f.name=="pre";u.onTagOpen=function(d,f,h,g){f=new CKEDITOR.htmlParser.element(d,f);if(f.isUnknown&&h)f.isEmpty=true;f.isOptionalClose=g;if(a(f))p.push(f);else{if(d=="pre")l= +true;else{if(d=="br"&&l){m.add(new CKEDITOR.htmlParser.text("\n"));return}d=="textarea"&&(k=true)}if(d=="br")y.push(f);else{for(;;){g=(h=m.name)?CKEDITOR.dtd[h]||(m._.isBlockLike?CKEDITOR.dtd.div:CKEDITOR.dtd.span):c;if(!f.isUnknown&&!m.isUnknown&&!g[d])if(m.isOptionalClose)u.onTagClose(h);else if(d in b&&h in b){h=m.children;(h=h[h.length-1])&&h.name=="li"||o(h=new CKEDITOR.htmlParser.element("li"),m);!f.returnPoint&&(f.returnPoint=m);m=h}else if(d in CKEDITOR.dtd.$listItem&&!s(d,h))u.onTagOpen(d== +"li"?"ul":"dl",{},0,1);else if(h in e&&!s(d,h)){!f.returnPoint&&(f.returnPoint=m);m=m.parent}else{h in CKEDITOR.dtd.$inline&&p.unshift(m);if(m.parent)o(m,m.parent,1);else{f.isOrphan=1;break}}else break}n(d);i();f.parent=m;f.isEmpty?o(f):m=f}}};u.onTagClose=function(a){for(var b=p.length-1;b>=0;b--)if(a==p[b].name){p.splice(b,1);return}for(var c=[],d=[],e=m;e!=f&&e.name!=a;){e._.isBlockLike||d.unshift(e);c.push(e);e=e.returnPoint||e.parent}if(e!=f){for(b=0;b<c.length;b++){var k=c[b];o(k,k.parent)}m= +e;e._.isBlockLike&&i();o(e,e.parent);if(e==m)m=m.parent;p=p.concat(d)}a=="body"&&(g=false)};u.onText=function(a){if((!m._.hasInlineStarted||y.length)&&!l&&!k){a=CKEDITOR.tools.ltrim(a);if(a.length===0)return}var d=m.name,f=d?CKEDITOR.dtd[d]||(m._.isBlockLike?CKEDITOR.dtd.div:CKEDITOR.dtd.span):c;if(!k&&!f["#"]&&d in e){u.onTagOpen(d in b?"li":d=="dl"?"dd":d=="table"?"tr":d=="tr"?"td":"");u.onText(a)}else{i();n();!l&&!k&&(a=a.replace(/[\t\r\n ]{2,}|[\t\r\n]/g," "));a=new CKEDITOR.htmlParser.text(a); +if(q(m,a))this.onTagOpen(g,{},0,1);m.add(a)}};u.onCDATA=function(a){m.add(new CKEDITOR.htmlParser.cdata(a))};u.onComment=function(a){i();n();m.add(new CKEDITOR.htmlParser.comment(a))};u.parse(d);for(i();m!=f;)o(m,m.parent,1);j(f);return f};CKEDITOR.htmlParser.fragment.prototype={type:CKEDITOR.NODE_DOCUMENT_FRAGMENT,add:function(a,b){isNaN(b)&&(b=this.children.length);var c=b>0?this.children[b-1]:null;if(c){if(a._.isBlockLike&&c.type==CKEDITOR.NODE_TEXT){c.value=CKEDITOR.tools.rtrim(c.value);if(c.value.length=== +0){this.children.pop();this.add(a);return}}c.next=a}a.previous=c;a.parent=this;this.children.splice(b,0,a);if(!this._.hasInlineStarted)this._.hasInlineStarted=a.type==CKEDITOR.NODE_TEXT||a.type==CKEDITOR.NODE_ELEMENT&&!a._.isBlockLike},filter:function(a,b){b=this.getFilterContext(b);a.onRoot(b,this);this.filterChildren(a,false,b)},filterChildren:function(a,b,c){if(this.childrenFilteredBy!=a.id){c=this.getFilterContext(c);if(b&&!this.parent)a.onRoot(c,this);this.childrenFilteredBy=a.id;for(b=0;b<this.children.length;b++)this.children[b].filter(a, +c)===false&&b--}},writeHtml:function(a,b){b&&this.filter(b);this.writeChildrenHtml(a)},writeChildrenHtml:function(a,b,c){var e=this.getFilterContext();if(c&&!this.parent&&b)b.onRoot(e,this);b&&this.filterChildren(b,false,e);b=0;c=this.children;for(e=c.length;b<e;b++)c[b].writeHtml(a)},forEach:function(a,b,c){if(!c&&(!b||this.type==b))var e=a(this);if(e!==false)for(var c=this.children,i=0;i<c.length;i++){e=c[i];e.type==CKEDITOR.NODE_ELEMENT?e.forEach(a,b):(!b||e.type==b)&&a(e)}},getFilterContext:function(a){return a|| +{}}}})();"use strict"; +(function(){function a(){this.rules=[]}function e(b,c,d,e){var g,n;for(g in c){(n=b[g])||(n=b[g]=new a);n.add(c[g],d,e)}}CKEDITOR.htmlParser.filter=CKEDITOR.tools.createClass({$:function(b){this.id=CKEDITOR.tools.getNextNumber();this.elementNameRules=new a;this.attributeNameRules=new a;this.elementsRules={};this.attributesRules={};this.textRules=new a;this.commentRules=new a;this.rootRules=new a;b&&this.addRules(b,10)},proto:{addRules:function(a,c){var d;if(typeof c=="number")d=c;else if(c&&"priority"in +c)d=c.priority;typeof d!="number"&&(d=10);typeof c!="object"&&(c={});a.elementNames&&this.elementNameRules.addMany(a.elementNames,d,c);a.attributeNames&&this.attributeNameRules.addMany(a.attributeNames,d,c);a.elements&&e(this.elementsRules,a.elements,d,c);a.attributes&&e(this.attributesRules,a.attributes,d,c);a.text&&this.textRules.add(a.text,d,c);a.comment&&this.commentRules.add(a.comment,d,c);a.root&&this.rootRules.add(a.root,d,c)},applyTo:function(a){a.filter(this)},onElementName:function(a,c){return this.elementNameRules.execOnName(a, +c)},onAttributeName:function(a,c){return this.attributeNameRules.execOnName(a,c)},onText:function(a,c){return this.textRules.exec(a,c)},onComment:function(a,c,d){return this.commentRules.exec(a,c,d)},onRoot:function(a,c){return this.rootRules.exec(a,c)},onElement:function(a,c){for(var d=[this.elementsRules["^"],this.elementsRules[c.name],this.elementsRules.$],e,g=0;g<3;g++)if(e=d[g]){e=e.exec(a,c,this);if(e===false)return null;if(e&&e!=c)return this.onNode(a,e);if(c.parent&&!c.name)break}return c}, +onNode:function(a,c){var d=c.type;return d==CKEDITOR.NODE_ELEMENT?this.onElement(a,c):d==CKEDITOR.NODE_TEXT?new CKEDITOR.htmlParser.text(this.onText(a,c.value)):d==CKEDITOR.NODE_COMMENT?new CKEDITOR.htmlParser.comment(this.onComment(a,c.value)):null},onAttribute:function(a,c,d,e){return(d=this.attributesRules[d])?d.exec(a,e,c,this):e}}});CKEDITOR.htmlParser.filterRulesGroup=a;a.prototype={add:function(a,c,d){this.rules.splice(this.findIndex(c),0,{value:a,priority:c,options:d})},addMany:function(a, +c,d){for(var e=[this.findIndex(c),0],g=0,n=a.length;g<n;g++)e.push({value:a[g],priority:c,options:d});this.rules.splice.apply(this.rules,e)},findIndex:function(a){for(var c=this.rules,d=c.length-1;d>=0&&a<c[d].priority;)d--;return d+1},exec:function(a,c){var d=c instanceof CKEDITOR.htmlParser.node||c instanceof CKEDITOR.htmlParser.fragment,e=Array.prototype.slice.call(arguments,1),g=this.rules,n=g.length,i,j,o,q;for(q=0;q<n;q++){if(d){i=c.type;j=c.name}o=g[q];if(!a.nonEditable||o.options.applyToAll){o= +o.value.apply(null,e);if(o===false||d&&o&&(o.name!=j||o.type!=i))return o;o!=void 0&&(e[0]=c=o)}}return c},execOnName:function(a,c){for(var d=0,e=this.rules,g=e.length,n;c&&d<g;d++){n=e[d];if(!a.nonEditable||n.options.applyToAll)c=c.replace(n.value[0],n.value[1])}return c}}})(); +(function(){function a(a,e){function f(a){return a||CKEDITOR.env.needsNbspFiller?new CKEDITOR.htmlParser.text(" "):new CKEDITOR.htmlParser.element("br",{"data-cke-bogus":1})}function l(a,d){return function(e){if(e.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT){var k=[],l=b(e),g,C;if(l)for(m(l,1)&&k.push(l);l;){if(h(l)&&(g=c(l))&&m(g))if((C=c(g))&&!h(C))k.push(g);else{f(v).insertAfter(g);g.remove()}l=l.previous}for(l=0;l<k.length;l++)k[l].remove();if(k=CKEDITOR.env.opera&&!a||(typeof d=="function"?d(e)!== +false:d))if(!v&&!CKEDITOR.env.needsBrFiller&&e.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT)k=false;else if(!v&&!CKEDITOR.env.needsBrFiller&&(document.documentMode>7||e.name in CKEDITOR.dtd.tr||e.name in CKEDITOR.dtd.$listItem))k=false;else{k=b(e);k=!k||e.name=="form"&&k.name=="input"}k&&e.add(f(a))}}}function m(a,b){if((!v||CKEDITOR.env.needsBrFiller)&&a.type==CKEDITOR.NODE_ELEMENT&&a.name=="br"&&!a.attributes["data-cke-eol"])return true;var c;if(a.type==CKEDITOR.NODE_TEXT&&(c=a.value.match(y))){if(c.index){(new CKEDITOR.htmlParser.text(a.value.substring(0, +c.index))).insertBefore(a);a.value=c[0]}if(!CKEDITOR.env.needsBrFiller&&v&&(!b||a.parent.name in i))return true;if(!v)if((c=a.previous)&&c.name=="br"||!c||h(c))return true}return false}var r={elements:{}},v=e=="html",i=CKEDITOR.tools.extend({},t),p;for(p in i)"#"in k[p]||delete i[p];for(p in i)r.elements[p]=l(v,a.config.fillEmptyBlocks!==false);r.root=l(v);r.elements.br=function(a){return function(b){if(b.parent.type!=CKEDITOR.NODE_DOCUMENT_FRAGMENT){var e=b.attributes;if("data-cke-bogus"in e||"data-cke-eol"in +e)delete e["data-cke-bogus"];else{for(e=b.next;e&&d(e);)e=e.next;var k=c(b);!e&&h(b.parent)?g(b.parent,f(a)):h(e)&&(k&&!h(k))&&f(a).insertBefore(e)}}}}(v);return r}function e(a,b){return a!=CKEDITOR.ENTER_BR&&b!==false?a==CKEDITOR.ENTER_DIV?"div":"p":false}function b(a){for(a=a.children[a.children.length-1];a&&d(a);)a=a.previous;return a}function c(a){for(a=a.previous;a&&d(a);)a=a.previous;return a}function d(a){return a.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.trim(a.value)||a.type==CKEDITOR.NODE_ELEMENT&& +a.attributes["data-cke-bookmark"]}function h(a){return a&&(a.type==CKEDITOR.NODE_ELEMENT&&a.name in t||a.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT)}function g(a,b){var c=a.children[a.children.length-1];a.children.push(b);b.parent=a;if(c){c.next=b;b.previous=c}}function n(a){a=a.attributes;a.contenteditable!="false"&&(a["data-cke-editable"]=a.contenteditable?"true":1);a.contenteditable="false"}function i(a){a=a.attributes;switch(a["data-cke-editable"]){case "true":a.contenteditable="true";break;case "1":delete a.contenteditable}} +function j(a){return a.replace(I,function(a,b,c){return"<"+b+c.replace(E,function(a,b){if(!/^on/.test(b)&&c.indexOf("data-cke-saved-"+b)==-1){a=a.slice(1);return" data-cke-saved-"+a+" data-cke-"+CKEDITOR.rnd+"-"+a}return a})+">"})}function o(a,b){return a.replace(b,function(a,b,c){a.indexOf("<textarea")===0&&(a=b+u(c).replace(/</g,"&lt;").replace(/>/g,"&gt;")+"</textarea>");return"<cke:encoded>"+encodeURIComponent(a)+"</cke:encoded>"})}function q(a){return a.replace(Q,function(a,b){return decodeURIComponent(b)})} +function s(a){return a.replace(/<\!--(?!{cke_protected})[\s\S]+?--\>/g,function(a){return"<\!--"+m+"{C}"+encodeURIComponent(a).replace(/--/g,"%2D%2D")+"--\>"})}function u(a){return a.replace(/<\!--\{cke_protected\}\{C\}([\s\S]+?)--\>/g,function(a,b){return decodeURIComponent(b)})}function f(a,b){var c=b._.dataStore;return a.replace(/<\!--\{cke_protected\}([\s\S]+?)--\>/g,function(a,b){return decodeURIComponent(b)}).replace(/\{cke_protected_(\d+)\}/g,function(a,b){return c&&c[b]||""})}function p(a, +b){for(var c=[],d=b.config.protectedSource,e=b._.dataStore||(b._.dataStore={id:1}),f=/<\!--\{cke_temp(comment)?\}(\d*?)--\>/g,d=[/<script[\s\S]*?<\/script>/gi,/<noscript[\s\S]*?<\/noscript>/gi].concat(d),a=a.replace(/<\!--[\s\S]*?--\>/g,function(a){return"<\!--{cke_tempcomment}"+(c.push(a)-1)+"--\>"}),k=0;k<d.length;k++)a=a.replace(d[k],function(a){a=a.replace(f,function(a,b,d){return c[d]});return/cke_temp(comment)?/.test(a)?a:"<\!--{cke_temp}"+(c.push(a)-1)+"--\>"});a=a.replace(f,function(a,b,d){return"<\!--"+ +m+(b?"{C}":"")+encodeURIComponent(c[d]).replace(/--/g,"%2D%2D")+"--\>"});return a.replace(/(['"]).*?\1/g,function(a){return a.replace(/<\!--\{cke_protected\}([\s\S]+?)--\>/g,function(a,b){e[e.id]=decodeURIComponent(b);return"{cke_protected_"+e.id++ +"}"})})}CKEDITOR.htmlDataProcessor=function(b){var c,d,k=this;this.editor=b;this.dataFilter=c=new CKEDITOR.htmlParser.filter;this.htmlFilter=d=new CKEDITOR.htmlParser.filter;this.writer=new CKEDITOR.htmlParser.basicWriter;c.addRules(x);c.addRules(r,{applyToAll:true}); +c.addRules(a(b,"data"),{applyToAll:true});d.addRules(L);d.addRules(A,{applyToAll:true});d.addRules(a(b,"html"),{applyToAll:true});b.on("toHtml",function(a){var a=a.data,c=a.dataValue,c=p(c,b),c=o(c,M),c=j(c),c=o(c,z),c=c.replace(v,"$1cke:$2"),c=c.replace(H,"<cke:$1$2></cke:$1>"),c=CKEDITOR.env.opera?c:c.replace(/(<pre\b[^>]*>)(\r\n|\n)/g,"$1$2$2"),d=a.context||b.editable().getName(),f;if(CKEDITOR.env.ie&&CKEDITOR.env.version<9&&d=="pre"){d="div";c="<pre>"+c+"</pre>";f=1}d=b.document.createElement(d); +d.setHtml("a"+c);c=d.getHtml().substr(1);c=c.replace(RegExp(" data-cke-"+CKEDITOR.rnd+"-","ig")," ");f&&(c=c.replace(/^<pre>|<\/pre>$/gi,""));c=c.replace(w,"$1$2");c=q(c);c=u(c);a.dataValue=CKEDITOR.htmlParser.fragment.fromHtml(c,a.context,a.fixForBody===false?false:e(a.enterMode,b.config.autoParagraph))},null,null,5);b.on("toHtml",function(a){a.data.filter.applyTo(a.data.dataValue,true,a.data.dontFilter,a.data.enterMode)&&b.fire("dataFiltered")},null,null,6);b.on("toHtml",function(a){a.data.dataValue.filterChildren(k.dataFilter, +true)},null,null,10);b.on("toHtml",function(a){var a=a.data,b=a.dataValue,c=new CKEDITOR.htmlParser.basicWriter;b.writeChildrenHtml(c);b=c.getHtml(true);a.dataValue=s(b)},null,null,15);b.on("toDataFormat",function(a){var c=a.data.dataValue;a.data.enterMode!=CKEDITOR.ENTER_BR&&(c=c.replace(/^<br *\/?>/i,""));a.data.dataValue=CKEDITOR.htmlParser.fragment.fromHtml(c,a.data.context,e(a.data.enterMode,b.config.autoParagraph))},null,null,5);b.on("toDataFormat",function(a){a.data.dataValue.filterChildren(k.htmlFilter, +true)},null,null,10);b.on("toDataFormat",function(a){a.data.filter.applyTo(a.data.dataValue,false,true)},null,null,11);b.on("toDataFormat",function(a){var c=a.data.dataValue,d=k.writer;d.reset();c.writeChildrenHtml(d);c=d.getHtml(true);c=u(c);c=f(c,b);a.data.dataValue=c},null,null,15)};CKEDITOR.htmlDataProcessor.prototype={toHtml:function(a,b,c,d){var e=this.editor,f,k,l;if(b&&typeof b=="object"){f=b.context;c=b.fixForBody;d=b.dontFilter;k=b.filter;l=b.enterMode}else f=b;!f&&f!==null&&(f=e.editable().getName()); +return e.fire("toHtml",{dataValue:a,context:f,fixForBody:c,dontFilter:d,filter:k||e.filter,enterMode:l||e.enterMode}).dataValue},toDataFormat:function(a,b){var c,d,e;if(b){c=b.context;d=b.filter;e=b.enterMode}!c&&c!==null&&(c=this.editor.editable().getName());return this.editor.fire("toDataFormat",{dataValue:a,filter:d||this.editor.filter,context:c,enterMode:e||this.editor.enterMode}).dataValue}};var y=/(?:&nbsp;|\xa0)$/,m="{cke_protected}",k=CKEDITOR.dtd,l=["caption","colgroup","col","thead","tfoot", +"tbody"],t=CKEDITOR.tools.extend({},k.$blockLimit,k.$block),x={elements:{input:n,textarea:n}},r={attributeNames:[[/^on/,"data-cke-pa-on"],[/^data-cke-expando$/,""]]},L={elements:{embed:function(a){var b=a.parent;if(b&&b.name=="object"){var c=b.attributes.width,b=b.attributes.height;if(c)a.attributes.width=c;if(b)a.attributes.height=b}},a:function(a){if(!a.children.length&&!a.attributes.name&&!a.attributes["data-cke-saved-name"])return false}}},A={elementNames:[[/^cke:/,""],[/^\?xml:namespace$/,""]], +attributeNames:[[/^data-cke-(saved|pa)-/,""],[/^data-cke-.*/,""],["hidefocus",""]],elements:{$:function(a){var b=a.attributes;if(b){if(b["data-cke-temp"])return false;for(var c=["name","href","src"],d,e=0;e<c.length;e++){d="data-cke-saved-"+c[e];d in b&&delete b[c[e]]}}return a},table:function(a){a.children.slice(0).sort(function(a,b){var c,d;if(a.type==CKEDITOR.NODE_ELEMENT&&b.type==a.type){c=CKEDITOR.tools.indexOf(l,a.name);d=CKEDITOR.tools.indexOf(l,b.name)}if(!(c>-1&&d>-1&&c!=d)){c=a.parent?a.getIndex(): +-1;d=b.parent?b.getIndex():-1}return c>d?1:-1})},param:function(a){a.children=[];a.isEmpty=true;return a},span:function(a){a.attributes["class"]=="Apple-style-span"&&delete a.name},html:function(a){delete a.attributes.contenteditable;delete a.attributes["class"]},body:function(a){delete a.attributes.spellcheck;delete a.attributes.contenteditable},style:function(a){var b=a.children[0];if(b&&b.value)b.value=CKEDITOR.tools.trim(b.value);if(!a.attributes.type)a.attributes.type="text/css"},title:function(a){var b= +a.children[0];!b&&g(a,b=new CKEDITOR.htmlParser.text);b.value=a.attributes["data-cke-title"]||""},input:i,textarea:i},attributes:{"class":function(a){return CKEDITOR.tools.ltrim(a.replace(/(?:^|\s+)cke_[^\s]*/g,""))||false}}};if(CKEDITOR.env.ie)A.attributes.style=function(a){return a.replace(/(^|;)([^\:]+)/g,function(a){return a.toLowerCase()})};var I=/<(a|area|img|input|source)\b([^>]*)>/gi,E=/\s(on\w+|href|src|name)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+))/gi,z=/(?:<style(?=[ >])[^>]*>[\s\S]*?<\/style>)|(?:<(:?link|meta|base)[^>]*>)/gi, +M=/(<textarea(?=[ >])[^>]*>)([\s\S]*?)(?:<\/textarea>)/gi,Q=/<cke:encoded>([^<]*)<\/cke:encoded>/gi,v=/(<\/?)((?:object|embed|param|html|body|head|title)[^>]*>)/gi,w=/(<\/?)cke:((?:html|body|head|title)[^>]*>)/gi,H=/<cke:(param|embed)([^>]*?)\/?>(?!\s*<\/cke:\1)/gi})();"use strict"; +CKEDITOR.htmlParser.element=function(a,e){this.name=a;this.attributes=e||{};this.children=[];var b=a||"",c=b.match(/^cke:(.*)/);c&&(b=c[1]);b=!(!CKEDITOR.dtd.$nonBodyContent[b]&&!CKEDITOR.dtd.$block[b]&&!CKEDITOR.dtd.$listItem[b]&&!CKEDITOR.dtd.$tableContent[b]&&!(CKEDITOR.dtd.$nonEditable[b]||b=="br"));this.isEmpty=!!CKEDITOR.dtd.$empty[a];this.isUnknown=!CKEDITOR.dtd[a];this._={isBlockLike:b,hasInlineStarted:this.isEmpty||!b}}; +CKEDITOR.htmlParser.cssStyle=function(a){var e={};((a instanceof CKEDITOR.htmlParser.element?a.attributes.style:a)||"").replace(/&quot;/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(a,c,d){c=="font-family"&&(d=d.replace(/["']/g,""));e[c.toLowerCase()]=d});return{rules:e,populate:function(a){var c=this.toString();if(c)a instanceof CKEDITOR.dom.element?a.setAttribute("style",c):a instanceof CKEDITOR.htmlParser.element?a.attributes.style=c:a.style=c},toString:function(){var a=[],c; +for(c in e)e[c]&&a.push(c,":",e[c],";");return a.join("")}}}; +(function(){function a(a){return function(b){return b.type==CKEDITOR.NODE_ELEMENT&&(typeof a=="string"?b.name==a:b.name in a)}}var e=function(a,b){a=a[0];b=b[0];return a<b?-1:a>b?1:0},b=CKEDITOR.htmlParser.fragment.prototype;CKEDITOR.htmlParser.element.prototype=CKEDITOR.tools.extend(new CKEDITOR.htmlParser.node,{type:CKEDITOR.NODE_ELEMENT,add:b.add,clone:function(){return new CKEDITOR.htmlParser.element(this.name,this.attributes)},filter:function(a,b){var e=this,g,n,b=e.getFilterContext(b);if(b.off)return true; +if(!e.parent)a.onRoot(b,e);for(;;){g=e.name;if(!(n=a.onElementName(b,g))){this.remove();return false}e.name=n;if(!(e=a.onElement(b,e))){this.remove();return false}if(e!==this){this.replaceWith(e);return false}if(e.name==g)break;if(e.type!=CKEDITOR.NODE_ELEMENT){this.replaceWith(e);return false}if(!e.name){this.replaceWithChildren();return false}}g=e.attributes;var i,j;for(i in g){j=i;for(n=g[i];;)if(j=a.onAttributeName(b,i))if(j!=i){delete g[i];i=j}else break;else{delete g[i];break}j&&((n=a.onAttribute(b, +e,j,n))===false?delete g[j]:g[j]=n)}e.isEmpty||this.filterChildren(a,false,b);return true},filterChildren:b.filterChildren,writeHtml:function(a,b){b&&this.filter(b);var h=this.name,g=[],n=this.attributes,i,j;a.openTag(h,n);for(i in n)g.push([i,n[i]]);a.sortAttributes&&g.sort(e);i=0;for(j=g.length;i<j;i++){n=g[i];a.attribute(n[0],n[1])}a.openTagClose(h,this.isEmpty);this.writeChildrenHtml(a);this.isEmpty||a.closeTag(h)},writeChildrenHtml:b.writeChildrenHtml,replaceWithChildren:function(){for(var a= +this.children,b=a.length;b;)a[--b].insertAfter(this);this.remove()},forEach:b.forEach,getFirst:function(b){if(!b)return this.children.length?this.children[0]:null;typeof b!="function"&&(b=a(b));for(var d=0,e=this.children.length;d<e;++d)if(b(this.children[d]))return this.children[d];return null},getHtml:function(){var a=new CKEDITOR.htmlParser.basicWriter;this.writeChildrenHtml(a);return a.getHtml()},setHtml:function(a){for(var a=this.children=CKEDITOR.htmlParser.fragment.fromHtml(a).children,b=0, +e=a.length;b<e;++b)a[b].parent=this},getOuterHtml:function(){var a=new CKEDITOR.htmlParser.basicWriter;this.writeHtml(a);return a.getHtml()},split:function(a){for(var b=this.children.splice(a,this.children.length-a),e=this.clone(),g=0;g<b.length;++g)b[g].parent=e;e.children=b;if(b[0])b[0].previous=null;if(a>0)this.children[a-1].next=null;this.parent.add(e,this.getIndex()+1);return e},removeClass:function(a){var b=this.attributes["class"];if(b)(b=CKEDITOR.tools.trim(b.replace(RegExp("(?:\\s+|^)"+a+ +"(?:\\s+|$)")," ")))?this.attributes["class"]=b:delete this.attributes["class"]},hasClass:function(a){var b=this.attributes["class"];return!b?false:RegExp("(?:^|\\s)"+a+"(?=\\s|$)").test(b)},getFilterContext:function(a){var b=[];a||(a={off:false,nonEditable:false});!a.off&&this.attributes["data-cke-processor"]=="off"&&b.push("off",true);!a.nonEditable&&this.attributes.contenteditable=="false"&&b.push("nonEditable",true);if(b.length)for(var a=CKEDITOR.tools.copy(a),e=0;e<b.length;e=e+2)a[b[e]]=b[e+ +1];return a}},true)})();(function(){var a={};CKEDITOR.template=function(e){if(a[e])this.output=a[e];else{var b=e.replace(/'/g,"\\'").replace(/{([^}]+)}/g,function(a,b){return"',data['"+b+"']==undefined?'{"+b+"}':data['"+b+"'],'"});this.output=a[e]=Function("data","buffer","return buffer?buffer.push('"+b+"'):['"+b+"'].join('');")}}})();delete CKEDITOR.loadFullCore;CKEDITOR.instances={};CKEDITOR.document=new CKEDITOR.dom.document(document); +CKEDITOR.add=function(a){CKEDITOR.instances[a.name]=a;a.on("focus",function(){if(CKEDITOR.currentInstance!=a){CKEDITOR.currentInstance=a;CKEDITOR.fire("currentInstance")}});a.on("blur",function(){if(CKEDITOR.currentInstance==a){CKEDITOR.currentInstance=null;CKEDITOR.fire("currentInstance")}});CKEDITOR.fire("instance",null,a)};CKEDITOR.remove=function(a){delete CKEDITOR.instances[a.name]}; +(function(){var a={};CKEDITOR.addTemplate=function(e,b){var c=a[e];if(c)return c;c={name:e,source:b};CKEDITOR.fire("template",c);return a[e]=new CKEDITOR.template(c.source)};CKEDITOR.getTemplate=function(e){return a[e]}})();(function(){var a=[];CKEDITOR.addCss=function(e){a.push(e)};CKEDITOR.getCss=function(){return a.join("\n")}})();CKEDITOR.on("instanceDestroyed",function(){CKEDITOR.tools.isEmpty(this.instances)&&CKEDITOR.fire("reset")});CKEDITOR.TRISTATE_ON=1;CKEDITOR.TRISTATE_OFF=2; +CKEDITOR.TRISTATE_DISABLED=0; +(function(){CKEDITOR.inline=function(a,e){if(!CKEDITOR.env.isCompatible)return null;a=CKEDITOR.dom.element.get(a);if(a.getEditor())throw'The editor instance "'+a.getEditor().name+'" is already attached to the provided element.';var b=new CKEDITOR.editor(e,a,CKEDITOR.ELEMENT_MODE_INLINE),c=a.is("textarea")?a:null;if(c){b.setData(c.getValue(),null,true);a=CKEDITOR.dom.element.createFromHtml('<div contenteditable="'+!!b.readOnly+'" class="cke_textarea_inline">'+c.getValue()+"</div>",CKEDITOR.document); +a.insertAfter(c);c.hide();c.$.form&&b._attachToForm()}else b.setData(a.getHtml(),null,true);b.on("loaded",function(){b.fire("uiReady");b.editable(a);b.container=a;b.setData(b.getData(1));b.resetDirty();b.fire("contentDom");b.mode="wysiwyg";b.fire("mode");b.status="ready";b.fireOnce("instanceReady");CKEDITOR.fire("instanceReady",null,b)},null,null,1E4);b.on("destroy",function(){if(c){b.container.clearCustomData();b.container.remove();c.show()}b.element.clearCustomData();delete b.element});return b}; +CKEDITOR.inlineAll=function(){var a,e,b;for(b in CKEDITOR.dtd.$editable)for(var c=CKEDITOR.document.getElementsByTag(b),d=0,h=c.count();d<h;d++){a=c.getItem(d);if(a.getAttribute("contenteditable")=="true"){e={element:a,config:{}};CKEDITOR.fire("inline",e)!==false&&CKEDITOR.inline(a,e.config)}}};CKEDITOR.domReady(function(){!CKEDITOR.disableAutoInline&&CKEDITOR.inlineAll()})})();CKEDITOR.replaceClass="ckeditor"; +(function(){function a(a,c,g,n){if(!CKEDITOR.env.isCompatible)return null;a=CKEDITOR.dom.element.get(a);if(a.getEditor())throw'The editor instance "'+a.getEditor().name+'" is already attached to the provided element.';var i=new CKEDITOR.editor(c,a,n);if(n==CKEDITOR.ELEMENT_MODE_REPLACE){a.setStyle("visibility","hidden");i._.required=a.hasAttribute("required");a.removeAttribute("required")}g&&i.setData(g,null,true);i.on("loaded",function(){b(i);n==CKEDITOR.ELEMENT_MODE_REPLACE&&(i.config.autoUpdateElement&& +a.$.form)&&i._attachToForm();i.setMode(i.config.startupMode,function(){i.resetDirty();i.status="ready";i.fireOnce("instanceReady");CKEDITOR.fire("instanceReady",null,i)})});i.on("destroy",e);return i}function e(){var a=this.container,b=this.element;if(a){a.clearCustomData();a.remove()}if(b){b.clearCustomData();if(this.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE){b.show();this._.required&&b.setAttribute("required","required")}delete this.element}}function b(a){var b=a.name,e=a.element,n=a.elementMode, +i=a.fire("uiSpace",{space:"top",html:""}).html,j=a.fire("uiSpace",{space:"bottom",html:""}).html;c||(c=CKEDITOR.addTemplate("maincontainer",'<{outerEl} id="cke_{name}" class="{id} cke cke_reset cke_chrome cke_editor_{name} cke_{langDir} '+CKEDITOR.env.cssClass+'" dir="{langDir}" lang="{langCode}" role="application" aria-labelledby="cke_{name}_arialbl"><span id="cke_{name}_arialbl" class="cke_voice_label">{voiceLabel}</span><{outerEl} class="cke_inner cke_reset" role="presentation">{topHtml}<{outerEl} id="{contentId}" class="cke_contents cke_reset" role="presentation"></{outerEl}>{bottomHtml}</{outerEl}></{outerEl}>')); +b=CKEDITOR.dom.element.createFromHtml(c.output({id:a.id,name:b,langDir:a.lang.dir,langCode:a.langCode,voiceLabel:[a.lang.editor,a.name].join(", "),topHtml:i?'<span id="'+a.ui.spaceId("top")+'" class="cke_top cke_reset_all" role="presentation" style="height:auto">'+i+"</span>":"",contentId:a.ui.spaceId("contents"),bottomHtml:j?'<span id="'+a.ui.spaceId("bottom")+'" class="cke_bottom cke_reset_all" role="presentation">'+j+"</span>":"",outerEl:CKEDITOR.env.ie?"span":"div"}));if(n==CKEDITOR.ELEMENT_MODE_REPLACE){e.hide(); +b.insertAfter(e)}else e.append(b);a.container=b;i&&a.ui.space("top").unselectable();j&&a.ui.space("bottom").unselectable();e=a.config.width;n=a.config.height;e&&b.setStyle("width",CKEDITOR.tools.cssLength(e));n&&a.ui.space("contents").setStyle("height",CKEDITOR.tools.cssLength(n));b.disableContextMenu();CKEDITOR.env.webkit&&b.on("focus",function(){a.focus()});a.fireOnce("uiReady")}CKEDITOR.replace=function(b,c){return a(b,c,null,CKEDITOR.ELEMENT_MODE_REPLACE)};CKEDITOR.appendTo=function(b,c,e){return a(b, +c,e,CKEDITOR.ELEMENT_MODE_APPENDTO)};CKEDITOR.replaceAll=function(){for(var a=document.getElementsByTagName("textarea"),b=0;b<a.length;b++){var c=null,e=a[b];if(e.name||e.id){if(typeof arguments[0]=="string"){if(!RegExp("(?:^|\\s)"+arguments[0]+"(?:$|\\s)").test(e.className))continue}else if(typeof arguments[0]=="function"){c={};if(arguments[0](e,c)===false)continue}this.replace(e,c)}}};CKEDITOR.editor.prototype.addMode=function(a,b){(this._.modes||(this._.modes={}))[a]=b};CKEDITOR.editor.prototype.setMode= +function(a,b){var c=this,e=this._.modes;if(!(a==c.mode||!e||!e[a])){c.fire("beforeSetMode",a);if(c.mode){var i=c.checkDirty();c._.previousMode=c.mode;c.fire("beforeModeUnload");c.editable(0);c.ui.space("contents").setHtml("");c.mode=""}this._.modes[a](function(){c.mode=a;i!==void 0&&!i&&c.resetDirty();setTimeout(function(){c.fire("mode");b&&b.call(c)},0)})}};CKEDITOR.editor.prototype.resize=function(a,b,c,e){var i=this.container,j=this.ui.space("contents"),o=CKEDITOR.env.webkit&&this.document&&this.document.getWindow().$.frameElement, +e=e?i.getChild(1):i;e.setSize("width",a,true);o&&(o.style.width="1%");j.setStyle("height",Math.max(b-(c?0:(e.$.offsetHeight||0)-(j.$.clientHeight||0)),0)+"px");o&&(o.style.width="100%");this.fire("resize")};CKEDITOR.editor.prototype.getResizable=function(a){return a?this.ui.space("contents"):this.container};var c;CKEDITOR.domReady(function(){CKEDITOR.replaceClass&&CKEDITOR.replaceAll(CKEDITOR.replaceClass)})})();CKEDITOR.config.startupMode="wysiwyg"; +(function(){function a(a){var b=a.editor,d=a.data.path,m=d.blockLimit,k=a.data.selection,l=k.getRanges()[0],g;if(CKEDITOR.env.gecko||CKEDITOR.env.ie&&CKEDITOR.env.needsBrFiller)if(k=e(k,d)){k.appendBogus();g=CKEDITOR.env.ie}if(b.config.autoParagraph!==false&&b.activeEnterMode!=CKEDITOR.ENTER_BR&&b.editable().equals(m)&&!d.block&&l.collapsed&&!l.getCommonAncestor().isReadOnly()){d=l.clone();d.enlarge(CKEDITOR.ENLARGE_BLOCK_CONTENTS);m=new CKEDITOR.dom.walker(d);m.guard=function(a){return!c(a)||a.type== +CKEDITOR.NODE_COMMENT||a.isReadOnly()};if(!m.checkForward()||d.checkStartOfBlock()&&d.checkEndOfBlock()){b=l.fixBlock(true,b.activeEnterMode==CKEDITOR.ENTER_DIV?"div":"p");if(!CKEDITOR.env.needsBrFiller)(b=b.getFirst(c))&&(b.type==CKEDITOR.NODE_TEXT&&CKEDITOR.tools.trim(b.getText()).match(/^(?:&nbsp;|\xa0)$/))&&b.remove();g=1;a.cancel()}}g&&l.select()}function e(a,b){if(a.isFake)return 0;var e=b.block||b.blockLimit,d=e&&e.getLast(c);if(e&&e.isBlockBoundary()&&(!d||!(d.type==CKEDITOR.NODE_ELEMENT&& +d.isBlockBoundary()))&&!e.is("pre")&&!e.getBogus())return e}function b(a){var b=a.data.getTarget();if(b.is("input")){b=b.getAttribute("type");(b=="submit"||b=="reset")&&a.data.preventDefault()}}function c(a){return o(a)&&q(a)}function d(a,b){return function(c){var e=CKEDITOR.dom.element.get(c.data.$.toElement||c.data.$.fromElement||c.data.$.relatedTarget);(!e||!b.equals(e)&&!b.contains(e))&&a.call(this,c)}}function h(a){var b,e=a.getRanges()[0],d=a.root,k={table:1,ul:1,ol:1,dl:1};if(e.startPath().contains(k)){var a= +function(a){return function(e,d){d&&(e.type==CKEDITOR.NODE_ELEMENT&&e.is(k))&&(b=e);if(!d&&c(e)&&(!a||!i(e)))return false}},l=e.clone();l.collapse(1);l.setStartAt(d,CKEDITOR.POSITION_AFTER_START);d=new CKEDITOR.dom.walker(l);d.guard=a();d.checkBackward();if(b){l=e.clone();l.collapse();l.setEndAt(b,CKEDITOR.POSITION_AFTER_END);d=new CKEDITOR.dom.walker(l);d.guard=a(true);b=false;d.checkForward();return b}}return null}function g(a){a.editor.focus();a.editor.fire("saveSnapshot")}function n(a,b){var c= +a.editor;!b&&c.getSelection().scrollIntoView();setTimeout(function(){c.fire("saveSnapshot")},0)}CKEDITOR.editable=CKEDITOR.tools.createClass({base:CKEDITOR.dom.element,$:function(a,b){this.base(b.$||b);this.editor=a;this.hasFocus=false;this.setup()},proto:{focus:function(){var a;if(CKEDITOR.env.webkit&&!this.hasFocus){a=this.editor._.previousActive||this.getDocument().getActive();if(this.contains(a)){a.focus();return}}try{this.$[CKEDITOR.env.ie&&this.getDocument().equals(CKEDITOR.document)?"setActive": +"focus"]()}catch(b){if(!CKEDITOR.env.ie)throw b;}if(CKEDITOR.env.safari&&!this.isInline()){a=CKEDITOR.document.getActive();a.equals(this.getWindow().getFrame())||this.getWindow().focus()}},on:function(a,b){var c=Array.prototype.slice.call(arguments,0);if(CKEDITOR.env.ie&&/^focus|blur$/.exec(a)){a=a=="focus"?"focusin":"focusout";b=d(b,this);c[0]=a;c[1]=b}return CKEDITOR.dom.element.prototype.on.apply(this,c)},attachListener:function(a,b,c,e,d,l){!this._.listeners&&(this._.listeners=[]);var g=Array.prototype.slice.call(arguments, +1),g=a.on.apply(a,g);this._.listeners.push(g);return g},clearListeners:function(){var a=this._.listeners;try{for(;a.length;)a.pop().removeListener()}catch(b){}},restoreAttrs:function(){var a=this._.attrChanges,b,c;for(c in a)if(a.hasOwnProperty(c)){b=a[c];b!==null?this.setAttribute(c,b):this.removeAttribute(c)}},attachClass:function(a){var b=this.getCustomData("classes");if(!this.hasClass(a)){!b&&(b=[]);b.push(a);this.setCustomData("classes",b);this.addClass(a)}},changeAttr:function(a,b){var c=this.getAttribute(a); +if(b!==c){!this._.attrChanges&&(this._.attrChanges={});a in this._.attrChanges||(this._.attrChanges[a]=c);this.setAttribute(a,b)}},insertHtml:function(a,b){g(this);s(this,b||"html",a)},insertText:function(a){g(this);var b=this.editor,c=b.getSelection().getStartElement().hasAscendant("pre",true)?CKEDITOR.ENTER_BR:b.activeEnterMode,b=c==CKEDITOR.ENTER_BR,e=CKEDITOR.tools,a=e.htmlEncode(a.replace(/\r\n/g,"\n")),a=a.replace(/\t/g,"&nbsp;&nbsp; &nbsp;"),c=c==CKEDITOR.ENTER_P?"p":"div";if(!b){var d=/\n{2}/g; +if(d.test(a))var l="<"+c+">",h="</"+c+">",a=l+a.replace(d,function(){return h+l})+h}a=a.replace(/\n/g,"<br>");b||(a=a.replace(RegExp("<br>(?=</"+c+">)"),function(a){return e.repeat(a,2)}));a=a.replace(/^ | $/g,"&nbsp;");a=a.replace(/(>|\s) /g,function(a,b){return b+"&nbsp;"}).replace(/ (?=<)/g,"&nbsp;");s(this,"text",a)},insertElement:function(a,b){b?this.insertElementIntoRange(a,b):this.insertElementIntoSelection(a)},insertElementIntoRange:function(a,b){var c=this.editor,e=c.config.enterMode,d=a.getName(), +l=CKEDITOR.dtd.$block[d];if(b.checkReadOnly())return false;b.deleteContents(1);b.startContainer.type==CKEDITOR.NODE_ELEMENT&&b.startContainer.is({tr:1,table:1,tbody:1,thead:1,tfoot:1})&&u(b);var g,h;if(l)for(;(g=b.getCommonAncestor(0,1))&&(h=CKEDITOR.dtd[g.getName()])&&(!h||!h[d]);)if(g.getName()in CKEDITOR.dtd.span)b.splitElement(g);else if(b.checkStartOfBlock()&&b.checkEndOfBlock()){b.setStartBefore(g);b.collapse(true);g.remove()}else b.splitBlock(e==CKEDITOR.ENTER_DIV?"div":"p",c.editable());b.insertNode(a); +return true},insertElementIntoSelection:function(a){var b=this.editor,e=b.activeEnterMode,b=b.getSelection(),d=b.getRanges()[0],k=a.getName(),k=CKEDITOR.dtd.$block[k];g(this);if(this.insertElementIntoRange(a,d)){d.moveToPosition(a,CKEDITOR.POSITION_AFTER_END);if(k)if((k=a.getNext(function(a){return c(a)&&!i(a)}))&&k.type==CKEDITOR.NODE_ELEMENT&&k.is(CKEDITOR.dtd.$block))k.getDtd()["#"]?d.moveToElementEditStart(k):d.moveToElementEditEnd(a);else if(!k&&e!=CKEDITOR.ENTER_BR){k=d.fixBlock(true,e==CKEDITOR.ENTER_DIV? +"div":"p");d.moveToElementEditStart(k)}}b.selectRanges([d]);n(this,CKEDITOR.env.opera)},setData:function(a,b){b||(a=this.editor.dataProcessor.toHtml(a));this.setHtml(a);this.editor.fire("dataReady")},getData:function(a){var b=this.getHtml();a||(b=this.editor.dataProcessor.toDataFormat(b));return b},setReadOnly:function(a){this.setAttribute("contenteditable",!a)},detach:function(){this.removeClass("cke_editable");var a=this.editor;this._.detach();delete a.document;delete a.window},isInline:function(){return this.getDocument().equals(CKEDITOR.document)}, +setup:function(){var a=this.editor;this.attachListener(a,"beforeGetData",function(){var b=this.getData();this.is("textarea")||a.config.ignoreEmptyParagraph!==false&&(b=b.replace(j,function(a,b){return b}));a.setData(b,null,1)},this);this.attachListener(a,"getSnapshot",function(a){a.data=this.getData(1)},this);this.attachListener(a,"afterSetData",function(){this.setData(a.getData(1))},this);this.attachListener(a,"loadSnapshot",function(a){this.setData(a.data,1)},this);this.attachListener(a,"beforeFocus", +function(){var b=a.getSelection();(b=b&&b.getNative())&&b.type=="Control"||this.focus()},this);this.attachListener(a,"insertHtml",function(a){this.insertHtml(a.data.dataValue,a.data.mode)},this);this.attachListener(a,"insertElement",function(a){this.insertElement(a.data)},this);this.attachListener(a,"insertText",function(a){this.insertText(a.data)},this);this.setReadOnly(a.readOnly);this.attachClass("cke_editable");this.attachClass(a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?"cke_editable_inline": +a.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE||a.elementMode==CKEDITOR.ELEMENT_MODE_APPENDTO?"cke_editable_themed":"");this.attachClass("cke_contents_"+a.config.contentsLangDirection);a.keystrokeHandler.blockedKeystrokes[8]=+a.readOnly;a.keystrokeHandler.attach(this);this.on("blur",function(a){CKEDITOR.env.opera&&CKEDITOR.document.getActive().equals(this.isInline()?this:this.getWindow().getFrame())?a.cancel():this.hasFocus=false},null,null,-1);this.on("focus",function(){this.hasFocus=true},null,null, +-1);a.focusManager.add(this);if(this.equals(CKEDITOR.document.getActive())){this.hasFocus=true;a.once("contentDom",function(){a.focusManager.focus()})}this.isInline()&&this.changeAttr("tabindex",a.tabIndex);if(!this.is("textarea")){a.document=this.getDocument();a.window=this.getWindow();var e=a.document;this.changeAttr("spellcheck",!a.config.disableNativeSpellChecker);var d=a.config.contentsLangDirection;this.getDirection(1)!=d&&this.changeAttr("dir",d);var m=CKEDITOR.getCss();if(m){d=e.getHead(); +if(!d.getCustomData("stylesheet")){m=e.appendStyleText(m);m=new CKEDITOR.dom.element(m.ownerNode||m.owningElement);d.setCustomData("stylesheet",m);m.data("cke-temp",1)}}d=e.getCustomData("stylesheet_ref")||0;e.setCustomData("stylesheet_ref",d+1);this.setCustomData("cke_includeReadonly",!a.config.disableReadonlyStyling);this.attachListener(this,"click",function(a){var a=a.data,b=(new CKEDITOR.dom.elementPath(a.getTarget(),this)).contains("a");b&&(a.$.button!=2&&b.isReadOnly())&&a.preventDefault()}); +var k={8:1,46:1};this.attachListener(a,"key",function(b){if(a.readOnly)return true;var c=b.data.keyCode,e;if(c in k){var b=a.getSelection(),d,m=b.getRanges()[0],g=m.startPath(),i,j,n,c=c==8;if(CKEDITOR.env.ie&&CKEDITOR.env.version<11&&(d=b.getSelectedElement())||(d=h(b))){a.fire("saveSnapshot");m.moveToPosition(d,CKEDITOR.POSITION_BEFORE_START);d.remove();m.select();a.fire("saveSnapshot");e=1}else if(m.collapsed)if((i=g.block)&&(n=i[c?"getPrevious":"getNext"](o))&&n.type==CKEDITOR.NODE_ELEMENT&&n.is("table")&& +m[c?"checkStartOfBlock":"checkEndOfBlock"]()){a.fire("saveSnapshot");m[c?"checkEndOfBlock":"checkStartOfBlock"]()&&i.remove();m["moveToElementEdit"+(c?"End":"Start")](n);m.select();a.fire("saveSnapshot");e=1}else if(g.blockLimit&&g.blockLimit.is("td")&&(j=g.blockLimit.getAscendant("table"))&&m.checkBoundaryOfElement(j,c?CKEDITOR.START:CKEDITOR.END)&&(n=j[c?"getPrevious":"getNext"](o))){a.fire("saveSnapshot");m["moveToElementEdit"+(c?"End":"Start")](n);m.checkStartOfBlock()&&m.checkEndOfBlock()?n.remove(): +m.select();a.fire("saveSnapshot");e=1}else if((j=g.contains(["td","th","caption"]))&&m.checkBoundaryOfElement(j,c?CKEDITOR.START:CKEDITOR.END))e=1}return!e});a.blockless&&(CKEDITOR.env.ie&&CKEDITOR.env.needsBrFiller)&&this.attachListener(this,"keyup",function(b){if(b.data.getKeystroke()in k&&!this.getFirst(c)){this.appendBogus();b=a.createRange();b.moveToPosition(this,CKEDITOR.POSITION_AFTER_START);b.select()}});this.attachListener(this,"dblclick",function(b){if(a.readOnly)return false;b={element:b.data.getTarget()}; +a.fire("doubleclick",b)});CKEDITOR.env.ie&&this.attachListener(this,"click",b);!CKEDITOR.env.ie&&!CKEDITOR.env.opera&&this.attachListener(this,"mousedown",function(b){var c=b.data.getTarget();if(c.is("img","hr","input","textarea","select")){a.getSelection().selectElement(c);c.is("input","textarea","select")&&b.data.preventDefault()}});CKEDITOR.env.gecko&&this.attachListener(this,"mouseup",function(b){if(b.data.$.button==2){b=b.data.getTarget();if(!b.getOuterHtml().replace(j,"")){var c=a.createRange(); +c.moveToElementEditStart(b);c.select(true)}}});if(CKEDITOR.env.webkit){this.attachListener(this,"click",function(a){a.data.getTarget().is("input","select")&&a.data.preventDefault()});this.attachListener(this,"mouseup",function(a){a.data.getTarget().is("input","textarea")&&a.data.preventDefault()})}}}},_:{detach:function(){this.editor.setData(this.editor.getData(),0,1);this.clearListeners();this.restoreAttrs();var a;if(a=this.removeCustomData("classes"))for(;a.length;)this.removeClass(a.pop());a=this.getDocument(); +var b=a.getHead();if(b.getCustomData("stylesheet")){var c=a.getCustomData("stylesheet_ref");if(--c)a.setCustomData("stylesheet_ref",c);else{a.removeCustomData("stylesheet_ref");b.removeCustomData("stylesheet").remove()}}delete this.editor}}});CKEDITOR.editor.prototype.editable=function(a){var b=this._.editable;if(b&&a)return 0;if(arguments.length)b=this._.editable=a?a instanceof CKEDITOR.editable?a:new CKEDITOR.editable(this,a):(b&&b.detach(),null);return b};var i=CKEDITOR.dom.walker.bogus(),j=/(^|<body\b[^>]*>)\s*<(p|div|address|h\d|center|pre)[^>]*>\s*(?:<br[^>]*>|&nbsp;|\u00A0|&#160;)?\s*(:?<\/\2>)?\s*(?=$|<\/body>)/gi, +o=CKEDITOR.dom.walker.whitespaces(true),q=CKEDITOR.dom.walker.bookmark(false,true);CKEDITOR.on("instanceLoaded",function(b){var c=b.editor;c.on("insertElement",function(a){a=a.data;if(a.type==CKEDITOR.NODE_ELEMENT&&(a.is("input")||a.is("textarea"))){a.getAttribute("contentEditable")!="false"&&a.data("cke-editable",a.hasAttribute("contenteditable")?"true":"1");a.setAttribute("contentEditable",false)}});c.on("selectionChange",function(b){if(!c.readOnly){var e=c.getSelection();if(e&&!e.isLocked){e=c.checkDirty(); +c.fire("lockSnapshot");a(b);c.fire("unlockSnapshot");!e&&c.resetDirty()}}})});CKEDITOR.on("instanceCreated",function(a){var b=a.editor;b.on("mode",function(){var a=b.editable();if(a&&a.isInline()){var c=b.title;a.changeAttr("role","textbox");a.changeAttr("aria-label",c);c&&a.changeAttr("title",c);if(c=this.ui.space(this.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?"top":"contents")){var e=CKEDITOR.tools.getNextId(),d=CKEDITOR.dom.element.createFromHtml('<span id="'+e+'" class="cke_voice_label">'+this.lang.common.editorHelp+ +"</span>");c.append(d);a.changeAttr("aria-describedby",e)}}})});CKEDITOR.addCss(".cke_editable{cursor:text}.cke_editable img,.cke_editable input,.cke_editable textarea{cursor:default}");var s=function(){function a(b){return b.type==CKEDITOR.NODE_ELEMENT}function b(c,e){var d,k,m,l,h=[],i=e.range.startContainer;d=e.range.startPath();for(var i=g[i.getName()],r=0,j=c.getChildren(),n=j.count(),o=-1,q=-1,x=0,s=d.contains(g.$list);r<n;++r){d=j.getItem(r);if(a(d)){m=d.getName();if(s&&m in CKEDITOR.dtd.$list)h= +h.concat(b(d,e));else{l=!!i[m];if(m=="br"&&d.data("cke-eol")&&(!r||r==n-1)){x=(k=r?h[r-1].node:j.getItem(r+1))&&(!a(k)||!k.is("br"));k=k&&a(k)&&g.$block[k.getName()]}o==-1&&!l&&(o=r);l||(q=r);h.push({isElement:1,isLineBreak:x,isBlock:d.isBlockBoundary(),hasBlockSibling:k,node:d,name:m,allowed:l});k=x=0}}else h.push({isElement:0,node:d,allowed:1})}if(o>-1)h[o].firstNotAllowed=1;if(q>-1)h[q].lastNotAllowed=1;return h}function e(b,c){var d=[],k=b.getChildren(),m=k.count(),l,h=0,r=g[c],i=!b.is(g.$inline)|| +b.is("br");for(i&&d.push(" ");h<m;h++){l=k.getItem(h);a(l)&&!l.is(r)?d=d.concat(e(l,c)):d.push(l)}i&&d.push(" ");return d}function d(b){return b&&a(b)&&(b.is(g.$removeEmpty)||b.is("a")&&!b.isBlockBoundary())}function k(b,c,e,d){var l=b.clone(),m,g;l.setEndAt(c,CKEDITOR.POSITION_BEFORE_END);if((m=(new CKEDITOR.dom.walker(l)).next())&&a(m)&&h[m.getName()]&&(g=m.getPrevious())&&a(g)&&!g.getParent().equals(b.startContainer)&&e.contains(g)&&d.contains(m)&&m.isIdentical(g)){m.moveChildren(g);m.remove(); +k(b,c,e,d)}}function l(b,c){function e(b,c){if(c.isBlock&&c.isElement&&!c.node.is("br")&&a(b)&&b.is("br")){b.remove();return 1}}var d=c.endContainer.getChild(c.endOffset),k=c.endContainer.getChild(c.endOffset-1);d&&e(d,b[b.length-1]);if(k&&e(k,b[0])){c.setEnd(c.endContainer,c.endOffset-1);c.collapse()}}var g=CKEDITOR.dtd,h={p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,ul:1,ol:1,li:1,pre:1,dl:1,blockquote:1},r={p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1},i=CKEDITOR.tools.extend({},g.$inline);delete i.br;return function(h, +j,o){var q=h.editor;h.getDocument();var x=q.getSelection().getRanges()[0],s=false;if(j=="unfiltered_html"){j="html";s=true}if(!x.checkReadOnly()){var v=(new CKEDITOR.dom.elementPath(x.startContainer,x.root)).blockLimit||x.root,j={type:j,dontFilter:s,editable:h,editor:q,range:x,blockLimit:v,mergeCandidates:[],zombies:[]},q=j.range,s=j.mergeCandidates,w,H,C,D;if(j.type=="text"&&q.shrink(CKEDITOR.SHRINK_ELEMENT,true,false)){w=CKEDITOR.dom.element.createFromHtml("<span>&nbsp;</span>",q.document);q.insertNode(w); +q.setStartAfter(w)}H=new CKEDITOR.dom.elementPath(q.startContainer);j.endPath=C=new CKEDITOR.dom.elementPath(q.endContainer);if(!q.collapsed){var v=C.block||C.blockLimit,X=q.getCommonAncestor();v&&(!v.equals(X)&&!v.contains(X)&&q.checkEndOfBlock())&&j.zombies.push(v);q.deleteContents()}for(;(D=a(q.startContainer)&&q.startContainer.getChild(q.startOffset-1))&&a(D)&&D.isBlockBoundary()&&H.contains(D);)q.moveToPosition(D,CKEDITOR.POSITION_BEFORE_END);k(q,j.blockLimit,H,C);if(w){q.setEndBefore(w);q.collapse(); +w.remove()}w=q.startPath();if(v=w.contains(d,false,1)){q.splitElement(v);j.inlineStylesRoot=v;j.inlineStylesPeak=w.lastElement}w=q.createBookmark();(v=w.startNode.getPrevious(c))&&a(v)&&d(v)&&s.push(v);(v=w.startNode.getNext(c))&&a(v)&&d(v)&&s.push(v);for(v=w.startNode;(v=v.getParent())&&d(v);)s.push(v);q.moveToBookmark(w);if(w=o){w=j.range;if(j.type=="text"&&j.inlineStylesRoot){D=j.inlineStylesPeak;q=D.getDocument().createText("{cke-peak}");for(s=j.inlineStylesRoot.getParent();!D.equals(s);){q=q.appendTo(D.clone()); +D=D.getParent()}o=q.getOuterHtml().split("{cke-peak}").join(o)}D=j.blockLimit.getName();if(/^\s+|\s+$/.test(o)&&"span"in CKEDITOR.dtd[D])var u='<span data-cke-marker="1">&nbsp;</span>',o=u+o+u;o=j.editor.dataProcessor.toHtml(o,{context:null,fixForBody:false,dontFilter:j.dontFilter,filter:j.editor.activeFilter,enterMode:j.editor.activeEnterMode});D=w.document.createElement("body");D.setHtml(o);if(u){D.getFirst().remove();D.getLast().remove()}if((u=w.startPath().block)&&!(u.getChildCount()==1&&u.getBogus()))a:{var F; +if(D.getChildCount()==1&&a(F=D.getFirst())&&F.is(r)){u=F.getElementsByTag("*");w=0;for(s=u.count();w<s;w++){q=u.getItem(w);if(!q.is(i))break a}F.moveChildren(F.getParent(1));F.remove()}}j.dataWrapper=D;w=o}if(w){F=j.range;var u=F.document,B,o=j.blockLimit;w=0;var J;D=[];var G,O,s=q=0,K,R;H=F.startContainer;var v=j.endPath.elements[0],S;C=v.getPosition(H);X=!!v.getCommonAncestor(H)&&C!=CKEDITOR.POSITION_IDENTICAL&&!(C&CKEDITOR.POSITION_CONTAINS+CKEDITOR.POSITION_IS_CONTAINED);H=b(j.dataWrapper,j); +for(l(H,F);w<H.length;w++){C=H[w];if(B=C.isLineBreak){B=F;K=o;var N=void 0,U=void 0;if(C.hasBlockSibling)B=1;else{N=B.startContainer.getAscendant(g.$block,1);if(!N||!N.is({div:1,p:1}))B=0;else{U=N.getPosition(K);if(U==CKEDITOR.POSITION_IDENTICAL||U==CKEDITOR.POSITION_CONTAINS)B=0;else{K=B.splitElement(N);B.moveToPosition(K,CKEDITOR.POSITION_AFTER_START);B=1}}}}if(B)s=w>0;else{B=F.startPath();if(!C.isBlock&&j.editor.config.autoParagraph!==false&&(j.editor.activeEnterMode!=CKEDITOR.ENTER_BR&&j.editor.editable().equals(B.blockLimit)&& +!B.block)&&(O=j.editor.activeEnterMode!=CKEDITOR.ENTER_BR&&j.editor.config.autoParagraph!==false?j.editor.activeEnterMode==CKEDITOR.ENTER_DIV?"div":"p":false)){O=u.createElement(O);O.appendBogus();F.insertNode(O);CKEDITOR.env.needsBrFiller&&(J=O.getBogus())&&J.remove();F.moveToPosition(O,CKEDITOR.POSITION_BEFORE_END)}if((B=F.startPath().block)&&!B.equals(G)){if(J=B.getBogus()){J.remove();D.push(B)}G=B}C.firstNotAllowed&&(q=1);if(q&&C.isElement){B=F.startContainer;for(K=null;B&&!g[B.getName()][C.name];){if(B.equals(o)){B= +null;break}K=B;B=B.getParent()}if(B){if(K){R=F.splitElement(K);j.zombies.push(R);j.zombies.push(K)}}else{K=o.getName();S=!w;B=w==H.length-1;K=e(C.node,K);for(var N=[],U=K.length,Y=0,$=void 0,aa=0,ba=-1;Y<U;Y++){$=K[Y];if($==" "){if(!aa&&(!S||Y)){N.push(new CKEDITOR.dom.text(" "));ba=N.length}aa=1}else{N.push($);aa=0}}B&&ba==N.length&&N.pop();S=N}}if(S){for(;B=S.pop();)F.insertNode(B);S=0}else F.insertNode(C.node);if(C.lastNotAllowed&&w<H.length-1){(R=X?v:R)&&F.setEndAt(R,CKEDITOR.POSITION_AFTER_START); +q=0}F.collapse()}}j.dontMoveCaret=s;j.bogusNeededBlocks=D}J=j.range;var V;R=j.bogusNeededBlocks;for(S=J.createBookmark();G=j.zombies.pop();)if(G.getParent()){O=J.clone();O.moveToElementEditStart(G);O.removeEmptyBlocksAtEnd()}if(R)for(;G=R.pop();)CKEDITOR.env.needsBrFiller?G.appendBogus():G.append(J.document.createText(" "));for(;G=j.mergeCandidates.pop();)G.mergeSiblings();J.moveToBookmark(S);if(!j.dontMoveCaret){for(G=a(J.startContainer)&&J.startContainer.getChild(J.startOffset-1);G&&a(G)&&!G.is(g.$empty);){if(G.isBlockBoundary())J.moveToPosition(G, +CKEDITOR.POSITION_BEFORE_END);else{if(d(G)&&G.getHtml().match(/(\s|&nbsp;)$/g)){V=null;break}V=J.clone();V.moveToPosition(G,CKEDITOR.POSITION_BEFORE_END)}G=G.getLast(c)}V&&J.moveToRange(V)}x.select();n(h)}}}(),u=function(){function a(b){b=new CKEDITOR.dom.walker(b);b.guard=function(a,b){if(b)return false;if(a.type==CKEDITOR.NODE_ELEMENT)return a.is(CKEDITOR.dtd.$tableContent)};b.evaluator=function(a){return a.type==CKEDITOR.NODE_ELEMENT};return b}function b(a,c,e){c=a.getDocument().createElement(c); +a.append(c,e);return c}function c(a){var b=a.count(),e;for(b;b-- >0;){e=a.getItem(b);if(!CKEDITOR.tools.trim(e.getHtml())){e.appendBogus();CKEDITOR.env.ie&&(CKEDITOR.env.version<9&&e.getChildCount())&&e.getFirst().remove()}}}return function(e){var d=e.startContainer,l=d.getAscendant("table",1),g=false;c(l.getElementsByTag("td"));c(l.getElementsByTag("th"));l=e.clone();l.setStart(d,0);l=a(l).lastBackward();if(!l){l=e.clone();l.setEndAt(d,CKEDITOR.POSITION_BEFORE_END);l=a(l).lastForward();g=true}l|| +(l=d);if(l.is("table")){e.setStartAt(l,CKEDITOR.POSITION_BEFORE_START);e.collapse(true);l.remove()}else{l.is({tbody:1,thead:1,tfoot:1})&&(l=b(l,"tr",g));l.is("tr")&&(l=b(l,l.getParent().is("thead")?"th":"td",g));(d=l.getBogus())&&d.remove();e.moveToPosition(l,g?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_END)}}}()})(); +(function(){function a(){var a=this._.fakeSelection,b;if(a){b=this.getSelection(1);if(!b||!b.isHidden()){a.reset();a=0}}if(!a){a=b||this.getSelection(1);if(!a||a.getType()==CKEDITOR.SELECTION_NONE)return}this.fire("selectionCheck",a);b=this.elementPath();if(!b.compare(this._.selectionPreviousPath)){if(CKEDITOR.env.webkit)this._.previousActive=this.document.getActive();this._.selectionPreviousPath=b;this.fire("selectionChange",{selection:a,path:b})}}function e(){q=true;if(!o){b.call(this);o=CKEDITOR.tools.setTimeout(b, +200,this)}}function b(){o=null;if(q){CKEDITOR.tools.setTimeout(a,0,this);q=false}}function c(a){function b(c,e){return!c||c.type==CKEDITOR.NODE_TEXT?false:a.clone()["moveToElementEdit"+(e?"End":"Start")](c)}if(!(a.root instanceof CKEDITOR.editable))return false;var c=a.startContainer,e=a.getPreviousNode(s,null,c),d=a.getNextNode(s,null,c);return b(e)||b(d,1)||!e&&!d&&!(c.type==CKEDITOR.NODE_ELEMENT&&c.isBlockBoundary()&&c.getBogus())?true:false}function d(a){return a.getCustomData("cke-fillingChar")} +function h(a,b){var c=a&&a.removeCustomData("cke-fillingChar");if(c){if(b!==false){var e,d=a.getDocument().getSelection().getNative(),f=d&&d.type!="None"&&d.getRangeAt(0);if(c.getLength()>1&&f&&f.intersectsNode(c.$)){e=[d.anchorOffset,d.focusOffset];f=d.focusNode==c.$&&d.focusOffset>0;d.anchorNode==c.$&&d.anchorOffset>0&&e[0]--;f&&e[1]--;var h;f=d;if(!f.isCollapsed){h=f.getRangeAt(0);h.setStart(f.anchorNode,f.anchorOffset);h.setEnd(f.focusNode,f.focusOffset);h=h.collapsed}h&&e.unshift(e.pop())}}c.setText(g(c.getText())); +if(e){c=d.getRangeAt(0);c.setStart(c.startContainer,e[0]);c.setEnd(c.startContainer,e[1]);d.removeAllRanges();d.addRange(c)}}}function g(a){return a.replace(/\u200B( )?/g,function(a){return a[1]?" ":""})}function n(a,b,c){var e=a.on("focus",function(a){a.cancel()},null,null,-100);if(CKEDITOR.env.ie)var d=a.getDocument().on("selectionchange",function(a){a.cancel()},null,null,-100);else{var f=new CKEDITOR.dom.range(a);f.moveToElementEditStart(a);var g=a.getDocument().$.createRange();g.setStart(f.startContainer.$, +f.startOffset);g.collapse(1);b.removeAllRanges();b.addRange(g)}c&&a.focus();e.removeListener();d&&d.removeListener()}function i(a){var b=CKEDITOR.dom.element.createFromHtml('<div data-cke-hidden-sel="1" data-cke-temp="1" style="'+(CKEDITOR.env.ie?"display:none":"position:fixed;top:0;left:-1000px")+'">&nbsp;</div>',a.document);a.fire("lockSnapshot");a.editable().append(b);var c=a.getSelection(),e=a.createRange(),d=c.root.on("selectionchange",function(a){a.cancel()},null,null,0);e.setStartAt(b,CKEDITOR.POSITION_AFTER_START); +e.setEndAt(b,CKEDITOR.POSITION_BEFORE_END);c.selectRanges([e]);d.removeListener();a.fire("unlockSnapshot");a._.hiddenSelectionContainer=b}function j(a){var b={37:1,39:1,8:1,46:1};return function(c){var e=c.data.getKeystroke();if(b[e]){var d=a.getSelection().getRanges(),f=d[0];if(d.length==1&&f.collapsed)if((e=f[e<38?"getPreviousEditableNode":"getNextEditableNode"]())&&e.type==CKEDITOR.NODE_ELEMENT&&e.getAttribute("contenteditable")=="false"){a.getSelection().fake(e);c.data.preventDefault();c.cancel()}}}} +var o,q,s=CKEDITOR.dom.walker.invisible(1),u=function(){function a(b){return function(a){var c=a.editor.createRange();c.moveToClosestEditablePosition(a.selected,b)&&a.editor.getSelection().selectRanges([c]);return false}}function b(a){return function(b){var c=b.editor,e=c.createRange(),d;if(!(d=e.moveToClosestEditablePosition(b.selected,a)))d=e.moveToClosestEditablePosition(b.selected,!a);d&&c.getSelection().selectRanges([e]);c.fire("saveSnapshot");b.selected.remove();if(!d){e.moveToElementEditablePosition(c.editable()); +c.getSelection().selectRanges([e])}c.fire("saveSnapshot");return false}}var c=a(),e=a(1);return{37:c,38:c,39:e,40:e,8:b(),46:b(1)}}();CKEDITOR.on("instanceCreated",function(b){function c(){var a=d.getSelection();a&&a.removeAllRanges()}var d=b.editor;d.on("contentDom",function(){var b=d.document,c=CKEDITOR.document,k=d.editable(),m=b.getBody(),g=b.getDocumentElement(),i=k.isInline(),o,n;CKEDITOR.env.gecko&&k.attachListener(k,"focus",function(a){a.removeListener();if(o!==0)if((a=d.getSelection().getNative())&& +a.isCollapsed&&a.anchorNode==k.$){a=d.createRange();a.moveToElementEditStart(k);a.select()}},null,null,-2);k.attachListener(k,CKEDITOR.env.webkit?"DOMFocusIn":"focus",function(){o&&CKEDITOR.env.webkit&&(o=d._.previousActive&&d._.previousActive.equals(b.getActive()));d.unlockSelection(o);o=0},null,null,-1);k.attachListener(k,"mousedown",function(){o=0});if(CKEDITOR.env.ie||CKEDITOR.env.opera||i){var q=function(){n=new CKEDITOR.dom.selection(d.getSelection());n.lock()};f?k.attachListener(k,"beforedeactivate", +q,null,null,-1):k.attachListener(d,"selectionCheck",q,null,null,-1);k.attachListener(k,CKEDITOR.env.webkit?"DOMFocusOut":"blur",function(){d.lockSelection(n);o=1},null,null,-1);k.attachListener(k,"mousedown",function(){o=0})}if(CKEDITOR.env.ie&&!i){var p;k.attachListener(k,"mousedown",function(a){if(a.data.$.button==2){a=d.document.getSelection();if(!a||a.getType()==CKEDITOR.SELECTION_NONE)p=d.window.getScrollPosition()}});k.attachListener(k,"mouseup",function(a){if(a.data.$.button==2&&p){d.document.$.documentElement.scrollLeft= +p.x;d.document.$.documentElement.scrollTop=p.y}p=null});if(b.$.compatMode!="BackCompat"){if(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)g.on("mousedown",function(a){function b(a){a=a.data.$;if(e){var c=m.$.createTextRange();try{c.moveToPoint(a.x,a.y)}catch(d){}e.setEndPoint(f.compareEndPoints("StartToStart",c)<0?"EndToEnd":"StartToStart",c);e.select()}}function d(){g.removeListener("mousemove",b);c.removeListener("mouseup",d);g.removeListener("mouseup",d);e.select()}a=a.data;if(a.getTarget().is("html")&& +a.$.y<g.$.clientHeight&&a.$.x<g.$.clientWidth){var e=m.$.createTextRange();try{e.moveToPoint(a.$.x,a.$.y)}catch(k){}var f=e.duplicate();g.on("mousemove",b);c.on("mouseup",d);g.on("mouseup",d)}});if(CKEDITOR.env.version>7&&CKEDITOR.env.version<11){g.on("mousedown",function(a){if(a.data.getTarget().is("html")){c.on("mouseup",v);g.on("mouseup",v)}});var v=function(){c.removeListener("mouseup",v);g.removeListener("mouseup",v);var a=CKEDITOR.document.$.selection,d=a.createRange();a.type!="None"&&d.parentElement().ownerDocument== +b.$&&d.select()}}}}k.attachListener(k,"selectionchange",a,d);k.attachListener(k,"keyup",e,d);k.attachListener(k,CKEDITOR.env.webkit?"DOMFocusIn":"focus",function(){d.forceNextSelectionCheck();d.selectionChange(1)});if(i?CKEDITOR.env.webkit||CKEDITOR.env.gecko:CKEDITOR.env.opera){var w;k.attachListener(k,"mousedown",function(){w=1});k.attachListener(b.getDocumentElement(),"mouseup",function(){w&&e.call(d);w=0})}else k.attachListener(CKEDITOR.env.ie?k:b.getDocumentElement(),"mouseup",e,d);CKEDITOR.env.webkit&& +k.attachListener(b,"keydown",function(a){switch(a.data.getKey()){case 13:case 33:case 34:case 35:case 36:case 37:case 39:case 8:case 45:case 46:h(k)}},null,null,-1);k.attachListener(k,"keydown",j(d),null,null,-1)});d.on("contentDomUnload",d.forceNextSelectionCheck,d);d.on("dataReady",function(){delete d._.fakeSelection;delete d._.hiddenSelectionContainer;d.selectionChange(1)});d.on("loadSnapshot",function(){var a=d.editable().getLast(function(a){return a.type==CKEDITOR.NODE_ELEMENT});a&&a.hasAttribute("data-cke-hidden-sel")&& +a.remove()},null,null,100);CKEDITOR.env.ie9Compat&&d.on("beforeDestroy",c,null,null,9);CKEDITOR.env.webkit&&d.on("setData",c);d.on("contentDomUnload",function(){d.unlockSelection()});d.on("key",function(a){if(d.mode=="wysiwyg"){var b=d.getSelection();if(b.isFake){var c=u[a.data.keyCode];if(c)return c({editor:d,selected:b.getSelectedElement(),selection:b,keyEvent:a})}}})});CKEDITOR.on("instanceReady",function(a){var b=a.editor;if(CKEDITOR.env.webkit){b.on("selectionChange",function(){var a=b.editable(), +c=d(a);c&&(c.getCustomData("ready")?h(a):c.setCustomData("ready",1))},null,null,-1);b.on("beforeSetMode",function(){h(b.editable())},null,null,-1);var c,e,a=function(){var a=b.editable();if(a)if(a=d(a)){var f=b.document.$.defaultView.getSelection();f.type=="Caret"&&f.anchorNode==a.$&&(e=1);c=a.getText();a.setText(g(c))}},f=function(){var a=b.editable();if(a)if(a=d(a)){a.setText(c);if(e){b.document.$.defaultView.getSelection().setPosition(a.$,a.getLength());e=0}}};b.on("beforeUndoImage",a);b.on("afterUndoImage", +f);b.on("beforeGetData",a,null,null,0);b.on("getData",f)}});CKEDITOR.editor.prototype.selectionChange=function(b){(b?a:e).call(this)};CKEDITOR.editor.prototype.getSelection=function(a){if((this._.savedSelection||this._.fakeSelection)&&!a)return this._.savedSelection||this._.fakeSelection;return(a=this.editable())&&this.mode=="wysiwyg"?new CKEDITOR.dom.selection(a):null};CKEDITOR.editor.prototype.lockSelection=function(a){a=a||this.getSelection(1);if(a.getType()!=CKEDITOR.SELECTION_NONE){!a.isLocked&& +a.lock();this._.savedSelection=a;return true}return false};CKEDITOR.editor.prototype.unlockSelection=function(a){var b=this._.savedSelection;if(b){b.unlock(a);delete this._.savedSelection;return true}return false};CKEDITOR.editor.prototype.forceNextSelectionCheck=function(){delete this._.selectionPreviousPath};CKEDITOR.dom.document.prototype.getSelection=function(){return new CKEDITOR.dom.selection(this)};CKEDITOR.dom.range.prototype.select=function(){var a=this.root instanceof CKEDITOR.editable? +this.root.editor.getSelection():new CKEDITOR.dom.selection(this.root);a.selectRanges([this]);return a};CKEDITOR.SELECTION_NONE=1;CKEDITOR.SELECTION_TEXT=2;CKEDITOR.SELECTION_ELEMENT=3;var f=typeof window.getSelection!="function",p=1;CKEDITOR.dom.selection=function(a){if(a instanceof CKEDITOR.dom.selection)var b=a,a=a.root;var c=a instanceof CKEDITOR.dom.element;this.rev=b?b.rev:p++;this.document=a instanceof CKEDITOR.dom.document?a:a.getDocument();this.root=a=c?a:this.document.getBody();this.isLocked= +0;this._={cache:{}};if(b){CKEDITOR.tools.extend(this._.cache,b._.cache);this.isFake=b.isFake;this.isLocked=b.isLocked;return this}b=f?this.document.$.selection:this.document.getWindow().$.getSelection();if(CKEDITOR.env.webkit)(b.type=="None"&&this.document.getActive().equals(a)||b.type=="Caret"&&b.anchorNode.nodeType==CKEDITOR.NODE_DOCUMENT)&&n(a,b);else if(CKEDITOR.env.gecko)b&&(this.document.getActive().equals(a)&&b.anchorNode&&b.anchorNode.nodeType==CKEDITOR.NODE_DOCUMENT)&&n(a,b,true);else if(CKEDITOR.env.ie){var d; +try{d=this.document.getActive()}catch(e){}if(f)b.type=="None"&&(d&&d.equals(this.document.getDocumentElement()))&&n(a,null,true);else{(b=b&&b.anchorNode)&&(b=new CKEDITOR.dom.node(b));d&&(d.equals(this.document.getDocumentElement())&&b&&(a.equals(b)||a.contains(b)))&&n(a,null,true)}}d=this.getNative();var g,h;if(d)if(d.getRangeAt)g=(h=d.rangeCount&&d.getRangeAt(0))&&new CKEDITOR.dom.node(h.commonAncestorContainer);else{try{h=d.createRange()}catch(j){}g=h&&CKEDITOR.dom.element.get(h.item&&h.item(0)|| +h.parentElement())}if(!g||!(g.type==CKEDITOR.NODE_ELEMENT||g.type==CKEDITOR.NODE_TEXT)||!this.root.equals(g)&&!this.root.contains(g)){this._.cache.type=CKEDITOR.SELECTION_NONE;this._.cache.startElement=null;this._.cache.selectedElement=null;this._.cache.selectedText="";this._.cache.ranges=new CKEDITOR.dom.rangeList}return this};var y={img:1,hr:1,li:1,table:1,tr:1,td:1,th:1,embed:1,object:1,ol:1,ul:1,a:1,input:1,form:1,select:1,textarea:1,button:1,fieldset:1,thead:1,tfoot:1};CKEDITOR.dom.selection.prototype= +{getNative:function(){return this._.cache.nativeSel!==void 0?this._.cache.nativeSel:this._.cache.nativeSel=f?this.document.$.selection:this.document.getWindow().$.getSelection()},getType:f?function(){var a=this._.cache;if(a.type)return a.type;var b=CKEDITOR.SELECTION_NONE;try{var c=this.getNative(),d=c.type;if(d=="Text")b=CKEDITOR.SELECTION_TEXT;if(d=="Control")b=CKEDITOR.SELECTION_ELEMENT;if(c.createRange().parentElement())b=CKEDITOR.SELECTION_TEXT}catch(e){}return a.type=b}:function(){var a=this._.cache; +if(a.type)return a.type;var b=CKEDITOR.SELECTION_TEXT,c=this.getNative();if(!c||!c.rangeCount)b=CKEDITOR.SELECTION_NONE;else if(c.rangeCount==1){var c=c.getRangeAt(0),d=c.startContainer;if(d==c.endContainer&&d.nodeType==1&&c.endOffset-c.startOffset==1&&y[d.childNodes[c.startOffset].nodeName.toLowerCase()])b=CKEDITOR.SELECTION_ELEMENT}return a.type=b},getRanges:function(){var a=f?function(){function a(b){return(new CKEDITOR.dom.node(b)).getIndex()}var b=function(b,c){b=b.duplicate();b.collapse(c); +var d=b.parentElement();if(!d.hasChildNodes())return{container:d,offset:0};for(var e=d.children,f,g,h=b.duplicate(),l=0,m=e.length-1,j=-1,i,o;l<=m;){j=Math.floor((l+m)/2);f=e[j];h.moveToElementText(f);i=h.compareEndPoints("StartToStart",b);if(i>0)m=j-1;else if(i<0)l=j+1;else return{container:d,offset:a(f)}}if(j==-1||j==e.length-1&&i<0){h.moveToElementText(d);h.setEndPoint("StartToStart",b);h=h.text.replace(/(\r\n|\r)/g,"\n").length;e=d.childNodes;if(!h){f=e[e.length-1];return f.nodeType!=CKEDITOR.NODE_TEXT? +{container:d,offset:e.length}:{container:f,offset:f.nodeValue.length}}for(d=e.length;h>0&&d>0;){g=e[--d];if(g.nodeType==CKEDITOR.NODE_TEXT){o=g;h=h-g.nodeValue.length}}return{container:o,offset:-h}}h.collapse(i>0?true:false);h.setEndPoint(i>0?"StartToStart":"EndToStart",b);h=h.text.replace(/(\r\n|\r)/g,"\n").length;if(!h)return{container:d,offset:a(f)+(i>0?0:1)};for(;h>0;)try{g=f[i>0?"previousSibling":"nextSibling"];if(g.nodeType==CKEDITOR.NODE_TEXT){h=h-g.nodeValue.length;o=g}f=g}catch(n){return{container:d, +offset:a(f)}}return{container:o,offset:i>0?-h:o.nodeValue.length+h}};return function(){var a=this.getNative(),c=a&&a.createRange(),d=this.getType();if(!a)return[];if(d==CKEDITOR.SELECTION_TEXT){a=new CKEDITOR.dom.range(this.root);d=b(c,true);a.setStart(new CKEDITOR.dom.node(d.container),d.offset);d=b(c);a.setEnd(new CKEDITOR.dom.node(d.container),d.offset);a.endContainer.getPosition(a.startContainer)&CKEDITOR.POSITION_PRECEDING&&a.endOffset<=a.startContainer.getIndex()&&a.collapse();return[a]}if(d== +CKEDITOR.SELECTION_ELEMENT){for(var d=[],e=0;e<c.length;e++){for(var f=c.item(e),k=f.parentNode,g=0,a=new CKEDITOR.dom.range(this.root);g<k.childNodes.length&&k.childNodes[g]!=f;g++);a.setStart(new CKEDITOR.dom.node(k),g);a.setEnd(new CKEDITOR.dom.node(k),g+1);d.push(a)}return d}return[]}}():function(){var a=[],b,c=this.getNative();if(!c)return a;for(var d=0;d<c.rangeCount;d++){var e=c.getRangeAt(d);b=new CKEDITOR.dom.range(this.root);b.setStart(new CKEDITOR.dom.node(e.startContainer),e.startOffset); +b.setEnd(new CKEDITOR.dom.node(e.endContainer),e.endOffset);a.push(b)}return a};return function(b){var c=this._.cache;if(c.ranges&&!b)return c.ranges;if(!c.ranges)c.ranges=new CKEDITOR.dom.rangeList(a.call(this));if(b)for(var d=c.ranges,e=0;e<d.length;e++){var f=d[e];f.getCommonAncestor().isReadOnly()&&d.splice(e,1);if(!f.collapsed){if(f.startContainer.isReadOnly())for(var b=f.startContainer,g;b;){if((g=b.type==CKEDITOR.NODE_ELEMENT)&&b.is("body")||!b.isReadOnly())break;g&&b.getAttribute("contentEditable")== +"false"&&f.setStartAfter(b);b=b.getParent()}b=f.startContainer;g=f.endContainer;var h=f.startOffset,j=f.endOffset,i=f.clone();b&&b.type==CKEDITOR.NODE_TEXT&&(h>=b.getLength()?i.setStartAfter(b):i.setStartBefore(b));g&&g.type==CKEDITOR.NODE_TEXT&&(j?i.setEndAfter(g):i.setEndBefore(g));b=new CKEDITOR.dom.walker(i);b.evaluator=function(a){if(a.type==CKEDITOR.NODE_ELEMENT&&a.isReadOnly()){var b=f.clone();f.setEndBefore(a);f.collapsed&&d.splice(e--,1);if(!(a.getPosition(i.endContainer)&CKEDITOR.POSITION_CONTAINS)){b.setStartAfter(a); +b.collapsed||d.splice(e+1,0,b)}return true}return false};b.next()}}return c.ranges}}(),getStartElement:function(){var a=this._.cache;if(a.startElement!==void 0)return a.startElement;var b;switch(this.getType()){case CKEDITOR.SELECTION_ELEMENT:return this.getSelectedElement();case CKEDITOR.SELECTION_TEXT:var c=this.getRanges()[0];if(c){if(c.collapsed){b=c.startContainer;b.type!=CKEDITOR.NODE_ELEMENT&&(b=b.getParent())}else{for(c.optimize();;){b=c.startContainer;if(c.startOffset==(b.getChildCount?b.getChildCount(): +b.getLength())&&!b.isBlockBoundary())c.setStartAfter(b);else break}b=c.startContainer;if(b.type!=CKEDITOR.NODE_ELEMENT)return b.getParent();b=b.getChild(c.startOffset);if(!b||b.type!=CKEDITOR.NODE_ELEMENT)b=c.startContainer;else for(c=b.getFirst();c&&c.type==CKEDITOR.NODE_ELEMENT;){b=c;c=c.getFirst()}}b=b.$}}return a.startElement=b?new CKEDITOR.dom.element(b):null},getSelectedElement:function(){var a=this._.cache;if(a.selectedElement!==void 0)return a.selectedElement;var b=this,c=CKEDITOR.tools.tryThese(function(){return b.getNative().createRange().item(0)}, +function(){for(var a=b.getRanges()[0].clone(),c,d,e=2;e&&(!(c=a.getEnclosedNode())||!(c.type==CKEDITOR.NODE_ELEMENT&&y[c.getName()]&&(d=c)));e--)a.shrink(CKEDITOR.SHRINK_ELEMENT);return d&&d.$});return a.selectedElement=c?new CKEDITOR.dom.element(c):null},getSelectedText:function(){var a=this._.cache;if(a.selectedText!==void 0)return a.selectedText;var b=this.getNative(),b=f?b.type=="Control"?"":b.createRange().text:b.toString();return a.selectedText=b},lock:function(){this.getRanges();this.getStartElement(); +this.getSelectedElement();this.getSelectedText();this._.cache.nativeSel=null;this.isLocked=1},unlock:function(a){if(this.isLocked){if(a)var b=this.getSelectedElement(),c=!b&&this.getRanges(),d=this.isFake;this.isLocked=0;this.reset();if(a)(a=b||c[0]&&c[0].getCommonAncestor())&&a.getAscendant("body",1)&&(d?this.fake(b):b?this.selectElement(b):this.selectRanges(c))}},reset:function(){this._.cache={};this.isFake=0;var a=this.root.editor;if(a&&a._.fakeSelection&&this.rev==a._.fakeSelection.rev){delete a._.fakeSelection; +var b=a._.hiddenSelectionContainer;if(b){a.fire("lockSnapshot");b.remove();a.fire("unlockSnapshot")}delete a._.hiddenSelectionContainer}this.rev=p++},selectElement:function(a){var b=new CKEDITOR.dom.range(this.root);b.setStartBefore(a);b.setEndAfter(a);this.selectRanges([b])},selectRanges:function(a){this.reset();if(a.length)if(this.isLocked){var b=CKEDITOR.document.getActive();this.unlock();this.selectRanges(a);this.lock();!b.equals(this.root)&&b.focus()}else{a:{var d,e;if(a.length==1&&!(e=a[0]).collapsed&& +(b=e.getEnclosedNode())&&b.type==CKEDITOR.NODE_ELEMENT){e=e.clone();e.shrink(CKEDITOR.SHRINK_ELEMENT,true);if((d=e.getEnclosedNode())&&d.type==CKEDITOR.NODE_ELEMENT)b=d;if(b.getAttribute("contenteditable")=="false")break a}b=void 0}if(b)this.fake(b);else{if(f){e=CKEDITOR.dom.walker.whitespaces(true);d=/\ufeff|\u00a0/;var g={table:1,tbody:1,tr:1};if(a.length>1){b=a[a.length-1];a[0].setEnd(b.endContainer,b.endOffset)}var b=a[0],a=b.collapsed,j,i,o,n=b.getEnclosedNode();if(n&&n.type==CKEDITOR.NODE_ELEMENT&& +n.getName()in y&&(!n.is("a")||!n.getText()))try{o=n.$.createControlRange();o.addElement(n.$);o.select();return}catch(q){}(b.startContainer.type==CKEDITOR.NODE_ELEMENT&&b.startContainer.getName()in g||b.endContainer.type==CKEDITOR.NODE_ELEMENT&&b.endContainer.getName()in g)&&b.shrink(CKEDITOR.NODE_ELEMENT,true);o=b.createBookmark();var g=o.startNode,p;if(!a)p=o.endNode;o=b.document.$.body.createTextRange();o.moveToElementText(g.$);o.moveStart("character",1);if(p){d=b.document.$.body.createTextRange(); +d.moveToElementText(p.$);o.setEndPoint("EndToEnd",d);o.moveEnd("character",-1)}else{j=g.getNext(e);i=g.hasAscendant("pre");j=!(j&&j.getText&&j.getText().match(d))&&(i||!g.hasPrevious()||g.getPrevious().is&&g.getPrevious().is("br"));i=b.document.createElement("span");i.setHtml("&#65279;");i.insertBefore(g);j&&b.document.createText("").insertBefore(g)}b.setStartBefore(g);g.remove();if(a){if(j){o.moveStart("character",-1);o.select();b.document.$.selection.clear()}else o.select();b.moveToPosition(i, +CKEDITOR.POSITION_BEFORE_START);i.remove()}else{b.setEndBefore(p);p.remove();o.select()}}else{p=this.getNative();if(!p)return;if(CKEDITOR.env.opera){b=this.document.$.createRange();b.selectNodeContents(this.root.$);p.addRange(b)}this.removeAllRanges();for(o=0;o<a.length;o++){if(o<a.length-1){b=a[o];j=a[o+1];d=b.clone();d.setStart(b.endContainer,b.endOffset);d.setEnd(j.startContainer,j.startOffset);if(!d.collapsed){d.shrink(CKEDITOR.NODE_ELEMENT,true);i=d.getCommonAncestor();d=d.getEnclosedNode(); +if(i.isReadOnly()||d&&d.isReadOnly()){j.setStart(b.startContainer,b.startOffset);a.splice(o--,1);continue}}}b=a[o];i=this.document.$.createRange();j=b.startContainer;if(CKEDITOR.env.opera&&b.collapsed&&j.type==CKEDITOR.NODE_ELEMENT){d=j.getChild(b.startOffset-1);e=j.getChild(b.startOffset);if(!d&&!e&&j.is(CKEDITOR.dtd.$removeEmpty)||d&&d.type==CKEDITOR.NODE_ELEMENT||e&&e.type==CKEDITOR.NODE_ELEMENT){b.insertNode(this.document.createText(""));b.collapse(1)}}if(b.collapsed&&CKEDITOR.env.webkit&&c(b)){j= +this.root;h(j,false);d=j.getDocument().createText("​");j.setCustomData("cke-fillingChar",d);b.insertNode(d);if((j=d.getNext())&&!d.getPrevious()&&j.type==CKEDITOR.NODE_ELEMENT&&j.getName()=="br"){h(this.root);b.moveToPosition(j,CKEDITOR.POSITION_BEFORE_START)}else b.moveToPosition(d,CKEDITOR.POSITION_AFTER_END)}i.setStart(b.startContainer.$,b.startOffset);try{i.setEnd(b.endContainer.$,b.endOffset)}catch(s){if(s.toString().indexOf("NS_ERROR_ILLEGAL_VALUE")>=0){b.collapse(1);i.setEnd(b.endContainer.$, +b.endOffset)}else throw s;}p.addRange(i)}}this.reset();this.root.fire("selectionchange")}}},fake:function(a){var b=this.root.editor;this.reset();i(b);var c=this._.cache,d=new CKEDITOR.dom.range(this.root);d.setStartBefore(a);d.setEndAfter(a);c.ranges=new CKEDITOR.dom.rangeList(d);c.selectedElement=c.startElement=a;c.type=CKEDITOR.SELECTION_ELEMENT;c.selectedText=c.nativeSel=null;this.isFake=1;this.rev=p++;b._.fakeSelection=this;this.root.fire("selectionchange")},isHidden:function(){var a=this.getCommonAncestor(); +a&&a.type==CKEDITOR.NODE_TEXT&&(a=a.getParent());return!(!a||!a.data("cke-hidden-sel"))},createBookmarks:function(a){a=this.getRanges().createBookmarks(a);this.isFake&&(a.isFake=1);return a},createBookmarks2:function(a){a=this.getRanges().createBookmarks2(a);this.isFake&&(a.isFake=1);return a},selectBookmarks:function(a){for(var b=[],c=0;c<a.length;c++){var d=new CKEDITOR.dom.range(this.root);d.moveToBookmark(a[c]);b.push(d)}a.isFake?this.fake(b[0].getEnclosedNode()):this.selectRanges(b);return this}, +getCommonAncestor:function(){var a=this.getRanges();return!a.length?null:a[0].startContainer.getCommonAncestor(a[a.length-1].endContainer)},scrollIntoView:function(){this.type!=CKEDITOR.SELECTION_NONE&&this.getRanges()[0].scrollIntoView()},removeAllRanges:function(){var a=this.getNative();try{a&&a[f?"empty":"removeAllRanges"]()}catch(b){}this.reset()}}})();"use strict"; +CKEDITOR.editor.prototype.attachStyleStateChange=function(a,e){var b=this._.styleStateChangeCallbacks;if(!b){b=this._.styleStateChangeCallbacks=[];this.on("selectionChange",function(a){for(var d=0;d<b.length;d++){var e=b[d],g=e.style.checkActive(a.data.path)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF;e.fn.call(this,g)}})}b.push({style:a,fn:e})};CKEDITOR.STYLE_BLOCK=1;CKEDITOR.STYLE_INLINE=2;CKEDITOR.STYLE_OBJECT=3; +(function(){function a(a,b){for(var c,d;a=a.getParent();){if(a.equals(b))break;if(a.getAttribute("data-nostyle"))c=a;else if(!d){var e=a.getAttribute("contentEditable");e=="false"?c=a:e=="true"&&(d=1)}}return c}function e(b){var d=b.document;if(b.collapsed){d=y(this,d);b.insertNode(d);b.moveToPosition(d,CKEDITOR.POSITION_BEFORE_END)}else{var f=this.element,g=this._.definition,h,j=g.ignoreReadonly,i=j||g.includeReadonly;i==void 0&&(i=b.root.getCustomData("cke_includeReadonly"));var k=CKEDITOR.dtd[f]; +if(!k){h=true;k=CKEDITOR.dtd.span}b.enlarge(CKEDITOR.ENLARGE_INLINE,1);b.trim();var l=b.createBookmark(),m=l.startNode,o=l.endNode,n=m,q;if(!j){var p=b.getCommonAncestor(),j=a(m,p),p=a(o,p);j&&(n=j.getNextSourceNode(true));p&&(o=p)}for(n.getPosition(o)==CKEDITOR.POSITION_FOLLOWING&&(n=0);n;){j=false;if(n.equals(o)){n=null;j=true}else{var s=n.type==CKEDITOR.NODE_ELEMENT?n.getName():null,p=s&&n.getAttribute("contentEditable")=="false",r=s&&n.getAttribute("data-nostyle");if(s&&n.data("cke-bookmark")){n= +n.getNextSourceNode(true);continue}if(p&&i&&CKEDITOR.dtd.$block[s])for(var t=n,x=c(t),z=void 0,A=x.length,I=0,t=A&&new CKEDITOR.dom.range(t.getDocument());I<A;++I){var z=x[I],L=CKEDITOR.filter.instances[z.data("cke-filter")];if(L?L.check(this):1){t.selectNodeContents(z);e.call(this,t)}}x=s?!k[s]||r?0:p&&!i?0:(n.getPosition(o)|M)==M&&(!g.childRule||g.childRule(n)):1;if(x)if((x=n.getParent())&&((x.getDtd()||CKEDITOR.dtd.span)[f]||h)&&(!g.parentRule||g.parentRule(x))){if(!q&&(!s||!CKEDITOR.dtd.$removeEmpty[s]|| +(n.getPosition(o)|M)==M)){q=b.clone();q.setStartBefore(n)}s=n.type;if(s==CKEDITOR.NODE_TEXT||p||s==CKEDITOR.NODE_ELEMENT&&!n.getChildCount()){for(var s=n,W;(j=!s.getNext(E))&&(W=s.getParent(),k[W.getName()])&&(W.getPosition(m)|Q)==Q&&(!g.childRule||g.childRule(W));)s=W;q.setEndAfter(s)}}else j=true;else j=true;n=n.getNextSourceNode(r||p)}if(j&&q&&!q.collapsed){for(var j=y(this,d),p=j.hasAttributes(),r=q.getCommonAncestor(),s={},x={},z={},A={},T,P,Z;j&&r;){if(r.getName()==f){for(T in g.attributes)if(!A[T]&& +(Z=r.getAttribute(P)))j.getAttribute(T)==Z?x[T]=1:A[T]=1;for(P in g.styles)if(!z[P]&&(Z=r.getStyle(P)))j.getStyle(P)==Z?s[P]=1:z[P]=1}r=r.getParent()}for(T in x)j.removeAttribute(T);for(P in s)j.removeStyle(P);p&&!j.hasAttributes()&&(j=null);if(j){q.extractContents().appendTo(j);q.insertNode(j);u.call(this,j);j.mergeSiblings();CKEDITOR.env.ie||j.$.normalize()}else{j=new CKEDITOR.dom.element("span");q.extractContents().appendTo(j);q.insertNode(j);u.call(this,j);j.remove(true)}q=null}}b.moveToBookmark(l); +b.shrink(CKEDITOR.SHRINK_TEXT);b.shrink(CKEDITOR.NODE_ELEMENT,true)}}function b(a){function b(){for(var a=new CKEDITOR.dom.elementPath(d.getParent()),c=new CKEDITOR.dom.elementPath(k.getParent()),e=null,f=null,g=0;g<a.elements.length;g++){var h=a.elements[g];if(h==a.block||h==a.blockLimit)break;m.checkElementRemovable(h)&&(e=h)}for(g=0;g<c.elements.length;g++){h=c.elements[g];if(h==c.block||h==c.blockLimit)break;m.checkElementRemovable(h)&&(f=h)}f&&k.breakParent(f);e&&d.breakParent(e)}a.enlarge(CKEDITOR.ENLARGE_INLINE, +1);var c=a.createBookmark(),d=c.startNode;if(a.collapsed){for(var e=new CKEDITOR.dom.elementPath(d.getParent(),a.root),g,j=0,h;j<e.elements.length&&(h=e.elements[j]);j++){if(h==e.block||h==e.blockLimit)break;if(this.checkElementRemovable(h)){var i;if(a.collapsed&&(a.checkBoundaryOfElement(h,CKEDITOR.END)||(i=a.checkBoundaryOfElement(h,CKEDITOR.START)))){g=h;g.match=i?"start":"end"}else{h.mergeSiblings();h.is(this.element)?s.call(this,h):f(h,l(this)[h.getName()])}}}if(g){h=d;for(j=0;;j++){i=e.elements[j]; +if(i.equals(g))break;else if(i.match)continue;else i=i.clone();i.append(h);h=i}h[g.match=="start"?"insertBefore":"insertAfter"](g)}}else{var k=c.endNode,m=this;b();for(e=d;!e.equals(k);){g=e.getNextSourceNode();if(e.type==CKEDITOR.NODE_ELEMENT&&this.checkElementRemovable(e)){e.getName()==this.element?s.call(this,e):f(e,l(this)[e.getName()]);if(g.type==CKEDITOR.NODE_ELEMENT&&g.contains(d)){b();g=d.getNext()}}e=g}}a.moveToBookmark(c);a.shrink(CKEDITOR.NODE_ELEMENT,true)}function c(a){var b=[];a.forEach(function(a){if(a.getAttribute("contenteditable")== +"true"){b.push(a);return false}},CKEDITOR.NODE_ELEMENT,true);return b}function d(a){var b=a.getEnclosedNode()||a.getCommonAncestor(false,true);(a=(new CKEDITOR.dom.elementPath(b,a.root)).contains(this.element,1))&&!a.isReadOnly()&&m(a,this)}function h(a){var b=a.getCommonAncestor(true,true);if(a=(new CKEDITOR.dom.elementPath(b,a.root)).contains(this.element,1)){var b=this._.definition,c=b.attributes;if(c)for(var d in c)a.removeAttribute(d,c[d]);if(b.styles)for(var e in b.styles)b.styles.hasOwnProperty(e)&& +a.removeStyle(e)}}function g(a){var b=a.createBookmark(true),c=a.createIterator();c.enforceRealBlocks=true;if(this._.enterMode)c.enlargeBr=this._.enterMode!=CKEDITOR.ENTER_BR;for(var d,e=a.document,f;d=c.getNextParagraph();)if(!d.isReadOnly()&&(c.activeFilter?c.activeFilter.check(this):1)){f=y(this,e,d);i(d,f)}a.moveToBookmark(b)}function n(a){var b=a.createBookmark(1),c=a.createIterator();c.enforceRealBlocks=true;c.enlargeBr=this._.enterMode!=CKEDITOR.ENTER_BR;for(var d,e;d=c.getNextParagraph();)if(this.checkElementRemovable(d))if(d.is("pre")){(e= +this._.enterMode==CKEDITOR.ENTER_BR?null:a.document.createElement(this._.enterMode==CKEDITOR.ENTER_P?"p":"div"))&&d.copyAttributes(e);i(d,e)}else s.call(this,d);a.moveToBookmark(b)}function i(a,b){var c=!b;if(c){b=a.getDocument().createElement("div");a.copyAttributes(b)}var d=b&&b.is("pre"),e=a.is("pre"),f=!d&&e;if(d&&!e){e=b;(f=a.getBogus())&&f.remove();f=a.getHtml();f=o(f,/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g,"");f=f.replace(/[ \t\r\n]*(<br[^>]*>)[ \t\r\n]*/gi,"$1");f=f.replace(/([ \t\n\r]+|&nbsp;)/g, +" ");f=f.replace(/<br\b[^>]*>/gi,"\n");if(CKEDITOR.env.ie){var g=a.getDocument().createElement("div");g.append(e);e.$.outerHTML="<pre>"+f+"</pre>";e.copyAttributes(g.getFirst());e=g.getFirst().remove()}else e.setHtml(f);b=e}else f?b=q(c?[a.getHtml()]:j(a),b):a.moveChildren(b);b.replace(a);if(d){var c=b,h;if((h=c.getPrevious(z))&&h.type==CKEDITOR.NODE_ELEMENT&&h.is("pre")){d=o(h.getHtml(),/\n$/,"")+"\n\n"+o(c.getHtml(),/^\n/,"");CKEDITOR.env.ie?c.$.outerHTML="<pre>"+d+"</pre>":c.setHtml(d);h.remove()}}else c&& +p(b)}function j(a){a.getName();var b=[];o(a.getOuterHtml(),/(\S\s*)\n(?:\s|(<span[^>]+data-cke-bookmark.*?\/span>))*\n(?!$)/gi,function(a,b,c){return b+"</pre>"+c+"<pre>"}).replace(/<pre\b.*?>([\s\S]*?)<\/pre>/gi,function(a,c){b.push(c)});return b}function o(a,b,c){var d="",e="",a=a.replace(/(^<span[^>]+data-cke-bookmark.*?\/span>)|(<span[^>]+data-cke-bookmark.*?\/span>$)/gi,function(a,b,c){b&&(d=b);c&&(e=c);return""});return d+a.replace(b,c)+e}function q(a,b){var c;a.length>1&&(c=new CKEDITOR.dom.documentFragment(b.getDocument())); +for(var d=0;d<a.length;d++){var e=a[d],e=e.replace(/(\r\n|\r)/g,"\n"),e=o(e,/^[ \t]*\n/,""),e=o(e,/\n$/,""),e=o(e,/^[ \t]+|[ \t]+$/g,function(a,b){return a.length==1?"&nbsp;":b?" "+CKEDITOR.tools.repeat("&nbsp;",a.length-1):CKEDITOR.tools.repeat("&nbsp;",a.length-1)+" "}),e=e.replace(/\n/g,"<br>"),e=e.replace(/[ \t]{2,}/g,function(a){return CKEDITOR.tools.repeat("&nbsp;",a.length-1)+" "});if(c){var f=b.clone();f.setHtml(e);c.append(f)}else b.setHtml(e)}return c||b}function s(a,b){var c=this._.definition, +d=c.attributes,c=c.styles,e=l(this)[a.getName()],g=CKEDITOR.tools.isEmpty(d)&&CKEDITOR.tools.isEmpty(c),h;for(h in d)if(!((h=="class"||this._.definition.fullMatch)&&a.getAttribute(h)!=t(h,d[h]))&&!(b&&h.slice(0,5)=="data-")){g=a.hasAttribute(h);a.removeAttribute(h)}for(var j in c)if(!(this._.definition.fullMatch&&a.getStyle(j)!=t(j,c[j],true))){g=g||!!a.getStyle(j);a.removeStyle(j)}f(a,e,r[a.getName()]);g&&(this._.definition.alwaysRemoveElement?p(a,1):!CKEDITOR.dtd.$block[a.getName()]||this._.enterMode== +CKEDITOR.ENTER_BR&&!a.hasAttributes()?p(a):a.renameNode(this._.enterMode==CKEDITOR.ENTER_P?"p":"div"))}function u(a){for(var b=l(this),c=a.getElementsByTag(this.element),d,e=c.count();--e>=0;){d=c.getItem(e);d.isReadOnly()||s.call(this,d,true)}for(var g in b)if(g!=this.element){c=a.getElementsByTag(g);for(e=c.count()-1;e>=0;e--){d=c.getItem(e);d.isReadOnly()||f(d,b[g])}}}function f(a,b,c){if(b=b&&b.attributes)for(var d=0;d<b.length;d++){var e=b[d][0],f;if(f=a.getAttribute(e)){var g=b[d][1];(g===null|| +g.test&&g.test(f)||typeof g=="string"&&f==g)&&a.removeAttribute(e)}}c||p(a)}function p(a,b){if(!a.hasAttributes()||b)if(CKEDITOR.dtd.$block[a.getName()]){var c=a.getPrevious(z),d=a.getNext(z);c&&(c.type==CKEDITOR.NODE_TEXT||!c.isBlockBoundary({br:1}))&&a.append("br",1);d&&(d.type==CKEDITOR.NODE_TEXT||!d.isBlockBoundary({br:1}))&&a.append("br");a.remove(true)}else{c=a.getFirst();d=a.getLast();a.remove(true);if(c){c.type==CKEDITOR.NODE_ELEMENT&&c.mergeSiblings();d&&(!c.equals(d)&&d.type==CKEDITOR.NODE_ELEMENT)&& +d.mergeSiblings()}}}function y(a,b,c){var d;d=a.element;d=="*"&&(d="span");d=new CKEDITOR.dom.element(d,b);c&&c.copyAttributes(d);d=m(d,a);b.getCustomData("doc_processing_style")&&d.hasAttribute("id")?d.removeAttribute("id"):b.setCustomData("doc_processing_style",1);return d}function m(a,b){var c=b._.definition,d=c.attributes,c=CKEDITOR.style.getStyleText(c);if(d)for(var e in d)a.setAttribute(e,d[e]);c&&a.setAttribute("style",c);return a}function k(a,b){for(var c in a)a[c]=a[c].replace(I,function(a, +c){return b[c]})}function l(a){if(a._.overrides)return a._.overrides;var b=a._.overrides={},c=a._.definition.overrides;if(c){CKEDITOR.tools.isArray(c)||(c=[c]);for(var d=0;d<c.length;d++){var e=c[d],f,g;if(typeof e=="string")f=e.toLowerCase();else{f=e.element?e.element.toLowerCase():a.element;g=e.attributes}e=b[f]||(b[f]={});if(g){var e=e.attributes=e.attributes||[],h;for(h in g)e.push([h.toLowerCase(),g[h]])}}}return b}function t(a,b,c){var d=new CKEDITOR.dom.element("span");d[c?"setStyle":"setAttribute"](a, +b);return d[c?"getStyle":"getAttribute"](a)}function x(a,b){for(var c=a.document,d=a.getRanges(),e=b?this.removeFromRange:this.applyToRange,f,g=d.createIterator();f=g.getNextRange();)e.call(this,f);a.selectRanges(d);c.removeCustomData("doc_processing_style")}var r={address:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,section:1,header:1,footer:1,nav:1,article:1,aside:1,figure:1,dialog:1,hgroup:1,time:1,meter:1,menu:1,command:1,keygen:1,output:1,progress:1,details:1,datagrid:1,datalist:1},L={a:1, +embed:1,hr:1,img:1,li:1,object:1,ol:1,table:1,td:1,tr:1,th:1,ul:1,dl:1,dt:1,dd:1,form:1,audio:1,video:1},A=/\s*(?:;\s*|$)/,I=/#\((.+?)\)/g,E=CKEDITOR.dom.walker.bookmark(0,1),z=CKEDITOR.dom.walker.whitespaces(1);CKEDITOR.style=function(a,b){var c=a.attributes;if(c&&c.style){a.styles=CKEDITOR.tools.extend({},a.styles,CKEDITOR.tools.parseCssText(c.style));delete c.style}if(b){a=CKEDITOR.tools.clone(a);k(a.attributes,b);k(a.styles,b)}c=this.element=a.element?typeof a.element=="string"?a.element.toLowerCase(): +a.element:"*";this.type=a.type||(r[c]?CKEDITOR.STYLE_BLOCK:L[c]?CKEDITOR.STYLE_OBJECT:CKEDITOR.STYLE_INLINE);if(typeof this.element=="object")this.type=CKEDITOR.STYLE_OBJECT;this._={definition:a}};CKEDITOR.editor.prototype.applyStyle=function(a){a.checkApplicable(this.elementPath())&&x.call(a,this.getSelection())};CKEDITOR.editor.prototype.removeStyle=function(a){a.checkApplicable(this.elementPath())&&x.call(a,this.getSelection(),1)};CKEDITOR.style.prototype={apply:function(a){x.call(this,a.getSelection())}, +remove:function(a){x.call(this,a.getSelection(),1)},applyToRange:function(a){return(this.applyToRange=this.type==CKEDITOR.STYLE_INLINE?e:this.type==CKEDITOR.STYLE_BLOCK?g:this.type==CKEDITOR.STYLE_OBJECT?d:null).call(this,a)},removeFromRange:function(a){return(this.removeFromRange=this.type==CKEDITOR.STYLE_INLINE?b:this.type==CKEDITOR.STYLE_BLOCK?n:this.type==CKEDITOR.STYLE_OBJECT?h:null).call(this,a)},applyToObject:function(a){m(a,this)},checkActive:function(a){switch(this.type){case CKEDITOR.STYLE_BLOCK:return this.checkElementRemovable(a.block|| +a.blockLimit,true);case CKEDITOR.STYLE_OBJECT:case CKEDITOR.STYLE_INLINE:for(var b=a.elements,c=0,d;c<b.length;c++){d=b[c];if(!(this.type==CKEDITOR.STYLE_INLINE&&(d==a.block||d==a.blockLimit))){if(this.type==CKEDITOR.STYLE_OBJECT){var e=d.getName();if(!(typeof this.element=="string"?e==this.element:e in this.element))continue}if(this.checkElementRemovable(d,true))return true}}}return false},checkApplicable:function(a,b){if(b&&!b.check(this))return false;switch(this.type){case CKEDITOR.STYLE_OBJECT:return!!a.contains(this.element); +case CKEDITOR.STYLE_BLOCK:return!!a.blockLimit.getDtd()[this.element]}return true},checkElementMatch:function(a,b){var c=this._.definition;if(!a||!c.ignoreReadonly&&a.isReadOnly())return false;var d=a.getName();if(typeof this.element=="string"?d==this.element:d in this.element){if(!b&&!a.hasAttributes())return true;if(d=c._AC)c=d;else{var d={},e=0,f=c.attributes;if(f)for(var g in f){e++;d[g]=f[g]}if(g=CKEDITOR.style.getStyleText(c)){d.style||e++;d.style=g}d._length=e;c=c._AC=d}if(c._length){for(var h in c)if(h!= +"_length"){e=a.getAttribute(h)||"";if(h=="style")a:{d=c[h];typeof d=="string"&&(d=CKEDITOR.tools.parseCssText(d));typeof e=="string"&&(e=CKEDITOR.tools.parseCssText(e,true));g=void 0;for(g in d)if(!(g in e&&(e[g]==d[g]||d[g]=="inherit"||e[g]=="inherit"))){d=false;break a}d=true}else d=c[h]==e;if(d){if(!b)return true}else if(b)return false}if(b)return true}else return true}return false},checkElementRemovable:function(a,b){if(this.checkElementMatch(a,b))return true;var c=l(this)[a.getName()];if(c){var d; +if(!(c=c.attributes))return true;for(var e=0;e<c.length;e++){d=c[e][0];if(d=a.getAttribute(d)){var f=c[e][1];if(f===null||typeof f=="string"&&d==f||f.test(d))return true}}}return false},buildPreview:function(a){var b=this._.definition,c=[],d=b.element;d=="bdo"&&(d="span");var c=["<",d],e=b.attributes;if(e)for(var f in e)c.push(" ",f,'="',e[f],'"');(e=CKEDITOR.style.getStyleText(b))&&c.push(' style="',e,'"');c.push(">",a||b.name,"</",d,">");return c.join("")},getDefinition:function(){return this._.definition}}; +CKEDITOR.style.getStyleText=function(a){var b=a._ST;if(b)return b;var b=a.styles,c=a.attributes&&a.attributes.style||"",d="";c.length&&(c=c.replace(A,";"));for(var e in b){var f=b[e],g=(e+":"+f).replace(A,";");f=="inherit"?d=d+g:c=c+g}c.length&&(c=CKEDITOR.tools.normalizeCssText(c,true));return a._ST=c+d};var M=CKEDITOR.POSITION_PRECEDING|CKEDITOR.POSITION_IDENTICAL|CKEDITOR.POSITION_IS_CONTAINED,Q=CKEDITOR.POSITION_FOLLOWING|CKEDITOR.POSITION_IDENTICAL|CKEDITOR.POSITION_IS_CONTAINED})(); +CKEDITOR.styleCommand=function(a,e){this.requiredContent=this.allowedContent=this.style=a;CKEDITOR.tools.extend(this,e,true)};CKEDITOR.styleCommand.prototype.exec=function(a){a.focus();this.state==CKEDITOR.TRISTATE_OFF?a.applyStyle(this.style):this.state==CKEDITOR.TRISTATE_ON&&a.removeStyle(this.style)};CKEDITOR.stylesSet=new CKEDITOR.resourceManager("","stylesSet");CKEDITOR.addStylesSet=CKEDITOR.tools.bind(CKEDITOR.stylesSet.add,CKEDITOR.stylesSet); +CKEDITOR.loadStylesSet=function(a,e,b){CKEDITOR.stylesSet.addExternal(a,e,"");CKEDITOR.stylesSet.load(a,b)}; +CKEDITOR.editor.prototype.getStylesSet=function(a){if(this._.stylesDefinitions)a(this._.stylesDefinitions);else{var e=this,b=e.config.stylesCombo_stylesSet||e.config.stylesSet;if(b===false)a(null);else if(b instanceof Array){e._.stylesDefinitions=b;a(b)}else{b||(b="default");var b=b.split(":"),c=b[0];CKEDITOR.stylesSet.addExternal(c,b[1]?b.slice(1).join(":"):CKEDITOR.getUrl("styles.js"),"");CKEDITOR.stylesSet.load(c,function(b){e._.stylesDefinitions=b[c];a(e._.stylesDefinitions)})}}}; +CKEDITOR.dom.comment=function(a,e){typeof a=="string"&&(a=(e?e.$:document).createComment(a));CKEDITOR.dom.domObject.call(this,a)};CKEDITOR.dom.comment.prototype=new CKEDITOR.dom.node;CKEDITOR.tools.extend(CKEDITOR.dom.comment.prototype,{type:CKEDITOR.NODE_COMMENT,getOuterHtml:function(){return"<\!--"+this.$.nodeValue+"--\>"}});"use strict"; +(function(){var a={},e={},b;for(b in CKEDITOR.dtd.$blockLimit)b in CKEDITOR.dtd.$list||(a[b]=1);for(b in CKEDITOR.dtd.$block)b in CKEDITOR.dtd.$blockLimit||b in CKEDITOR.dtd.$empty||(e[b]=1);CKEDITOR.dom.elementPath=function(b,d){var h=null,g=null,n=[],i=b,j,d=d||b.getDocument().getBody();do if(i.type==CKEDITOR.NODE_ELEMENT){n.push(i);if(!this.lastElement){this.lastElement=i;if(i.is(CKEDITOR.dtd.$object)||i.getAttribute("contenteditable")=="false")continue}if(i.equals(d))break;if(!g){j=i.getName(); +i.getAttribute("contenteditable")=="true"?g=i:!h&&e[j]&&(h=i);if(a[j]){var o;if(o=!h){if(j=j=="div"){a:{j=i.getChildren();o=0;for(var q=j.count();o<q;o++){var s=j.getItem(o);if(s.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$block[s.getName()]){j=true;break a}}j=false}j=!j}o=j}o?h=i:g=i}}}while(i=i.getParent());g||(g=d);this.block=h;this.blockLimit=g;this.root=d;this.elements=n}})(); +CKEDITOR.dom.elementPath.prototype={compare:function(a){var e=this.elements,a=a&&a.elements;if(!a||e.length!=a.length)return false;for(var b=0;b<e.length;b++)if(!e[b].equals(a[b]))return false;return true},contains:function(a,e,b){var c;typeof a=="string"&&(c=function(b){return b.getName()==a});a instanceof CKEDITOR.dom.element?c=function(b){return b.equals(a)}:CKEDITOR.tools.isArray(a)?c=function(b){return CKEDITOR.tools.indexOf(a,b.getName())>-1}:typeof a=="function"?c=a:typeof a=="object"&&(c= +function(b){return b.getName()in a});var d=this.elements,h=d.length;e&&h--;if(b){d=Array.prototype.slice.call(d,0);d.reverse()}for(e=0;e<h;e++)if(c(d[e]))return d[e];return null},isContextFor:function(a){var e;if(a in CKEDITOR.dtd.$block){e=this.contains(CKEDITOR.dtd.$intermediate)||this.root.equals(this.block)&&this.block||this.blockLimit;return!!e.getDtd()[a]}return true},direction:function(){return(this.block||this.blockLimit||this.root).getDirection(1)}}; +CKEDITOR.dom.text=function(a,e){typeof a=="string"&&(a=(e?e.$:document).createTextNode(a));this.$=a};CKEDITOR.dom.text.prototype=new CKEDITOR.dom.node; +CKEDITOR.tools.extend(CKEDITOR.dom.text.prototype,{type:CKEDITOR.NODE_TEXT,getLength:function(){return this.$.nodeValue.length},getText:function(){return this.$.nodeValue},setText:function(a){this.$.nodeValue=a},split:function(a){var e=this.$.parentNode,b=e.childNodes.length,c=this.getLength(),d=this.getDocument(),h=new CKEDITOR.dom.text(this.$.splitText(a),d);if(e.childNodes.length==b)if(a>=c){h=d.createText("");h.insertAfter(this)}else{a=d.createText("");a.insertAfter(h);a.remove()}return h},substring:function(a, +e){return typeof e!="number"?this.$.nodeValue.substr(a):this.$.nodeValue.substring(a,e)}}); +(function(){function a(a,c,d){var e=a.serializable,g=c[d?"endContainer":"startContainer"],n=d?"endOffset":"startOffset",i=e?c.document.getById(a.startNode):a.startNode,a=e?c.document.getById(a.endNode):a.endNode;if(g.equals(i.getPrevious())){c.startOffset=c.startOffset-g.getLength()-a.getPrevious().getLength();g=a.getNext()}else if(g.equals(a.getPrevious())){c.startOffset=c.startOffset-g.getLength();g=a.getNext()}g.equals(i.getParent())&&c[n]++;g.equals(a.getParent())&&c[n]++;c[d?"endContainer":"startContainer"]= +g;return c}CKEDITOR.dom.rangeList=function(a){if(a instanceof CKEDITOR.dom.rangeList)return a;a?a instanceof CKEDITOR.dom.range&&(a=[a]):a=[];return CKEDITOR.tools.extend(a,e)};var e={createIterator:function(){var a=this,c=CKEDITOR.dom.walker.bookmark(),d=[],e;return{getNextRange:function(g){e=e==void 0?0:e+1;var n=a[e];if(n&&a.length>1){if(!e)for(var i=a.length-1;i>=0;i--)d.unshift(a[i].createBookmark(true));if(g)for(var j=0;a[e+j+1];){for(var o=n.document,g=0,i=o.getById(d[j].endNode),o=o.getById(d[j+ +1].startNode);;){i=i.getNextSourceNode(false);if(o.equals(i))g=1;else if(c(i)||i.type==CKEDITOR.NODE_ELEMENT&&i.isBlockBoundary())continue;break}if(!g)break;j++}for(n.moveToBookmark(d.shift());j--;){i=a[++e];i.moveToBookmark(d.shift());n.setEnd(i.endContainer,i.endOffset)}}return n}}},createBookmarks:function(b){for(var c=[],d,e=0;e<this.length;e++){c.push(d=this[e].createBookmark(b,true));for(var g=e+1;g<this.length;g++){this[g]=a(d,this[g]);this[g]=a(d,this[g],true)}}return c},createBookmarks2:function(a){for(var c= +[],d=0;d<this.length;d++)c.push(this[d].createBookmark2(a));return c},moveToBookmarks:function(a){for(var c=0;c<this.length;c++)this[c].moveToBookmark(a[c])}}})(); +(function(){function a(){return CKEDITOR.getUrl(CKEDITOR.skinName.split(",")[1]||"skins/"+CKEDITOR.skinName.split(",")[0]+"/")}function e(b){var c=CKEDITOR.skin["ua_"+b],d=CKEDITOR.env;if(c)for(var c=c.split(",").sort(function(a,b){return a>b?-1:1}),e=0,g;e<c.length;e++){g=c[e];if(d.ie&&(g.replace(/^ie/,"")==d.version||d.quirks&&g=="iequirks"))g="ie";if(d[g]){b=b+("_"+c[e]);break}}return CKEDITOR.getUrl(a()+b+".css")}function b(a,b){if(!h[a]){CKEDITOR.document.appendStyleSheet(e(a));h[a]=1}b&&b()} +function c(a){var b=a.getById(g);if(!b){b=a.getHead().append("style");b.setAttribute("id",g);b.setAttribute("type","text/css")}return b}function d(a,b,c){var d,e,f;if(CKEDITOR.env.webkit){b=b.split("}").slice(0,-1);for(e=0;e<b.length;e++)b[e]=b[e].split("{")}for(var g=0;g<a.length;g++)if(CKEDITOR.env.webkit)for(e=0;e<b.length;e++){f=b[e][1];for(d=0;d<c.length;d++)f=f.replace(c[d][0],c[d][1]);a[g].$.sheet.addRule(b[e][0],f)}else{f=b;for(d=0;d<c.length;d++)f=f.replace(c[d][0],c[d][1]);CKEDITOR.env.ie&& +CKEDITOR.env.version<11?a[g].$.styleSheet.cssText=a[g].$.styleSheet.cssText+f:a[g].$.innerHTML=a[g].$.innerHTML+f}}var h={};CKEDITOR.skin={path:a,loadPart:function(c,d){CKEDITOR.skin.name!=CKEDITOR.skinName.split(",")[0]?CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(a()+"skin.js"),function(){b(c,d)}):b(c,d)},getPath:function(a){return CKEDITOR.getUrl(e(a))},icons:{},addIcon:function(a,b,c,d){a=a.toLowerCase();this.icons[a]||(this.icons[a]={path:b,offset:c||0,bgsize:d||"16px"})},getIconStyle:function(a, +b,c,d,e){var f;if(a){a=a.toLowerCase();b&&(f=this.icons[a+"-rtl"]);f||(f=this.icons[a])}a=c||f&&f.path||"";d=d||f&&f.offset;e=e||f&&f.bgsize||"16px";return a&&"background-image:url("+CKEDITOR.getUrl(a)+");background-position:0 "+d+"px;background-size:"+e+";"}};CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{getUiColor:function(){return this.uiColor},setUiColor:function(a){var b=c(CKEDITOR.document);return(this.setUiColor=function(a){var c=CKEDITOR.skin.chameleon,e=[[i,a]];this.uiColor=a;d([b],c(this, +"editor"),e);d(n,c(this,"panel"),e)}).call(this,a)}});var g="cke_ui_color",n=[],i=/\$color/g;CKEDITOR.on("instanceLoaded",function(a){if(!CKEDITOR.env.ie||!CKEDITOR.env.quirks){var b=a.editor,a=function(a){a=(a.data[0]||a.data).element.getElementsByTag("iframe").getItem(0).getFrameDocument();if(!a.getById("cke_ui_color")){a=c(a);n.push(a);var e=b.getUiColor();e&&d([a],CKEDITOR.skin.chameleon(b,"panel"),[[i,e]])}};b.on("panelShow",a);b.on("menuShow",a);b.config.uiColor&&b.setUiColor(b.config.uiColor)}})})(); +(function(){if(CKEDITOR.env.webkit)CKEDITOR.env.hc=false;else{var a=CKEDITOR.dom.element.createFromHtml('<div style="width:0px;height:0px;position:absolute;left:-10000px;border: 1px solid;border-color: red blue;"></div>',CKEDITOR.document);a.appendTo(CKEDITOR.document.getHead());try{CKEDITOR.env.hc=a.getComputedStyle("border-top-color")==a.getComputedStyle("border-right-color")}catch(e){CKEDITOR.env.hc=false}a.remove()}if(CKEDITOR.env.hc)CKEDITOR.env.cssClass=CKEDITOR.env.cssClass+" cke_hc";CKEDITOR.document.appendStyleText(".cke{visibility:hidden;}"); +CKEDITOR.status="loaded";CKEDITOR.fireOnce("loaded");if(a=CKEDITOR._.pending){delete CKEDITOR._.pending;for(var b=0;b<a.length;b++){CKEDITOR.editor.prototype.constructor.apply(a[b][0],a[b][1]);CKEDITOR.add(a[b][0])}}})();/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.skin.name="moono";CKEDITOR.skin.ua_editor="ie,iequirks,ie7,ie8,gecko";CKEDITOR.skin.ua_dialog="ie,iequirks,ie7,ie8,opera"; +CKEDITOR.skin.chameleon=function(){var b=function(){return function(b,e){for(var a=b.match(/[^#]./g),c=0;3>c;c++){var f=a,h=c,d;d=parseInt(a[c],16);d=("0"+(0>e?0|d*(1+e):0|d+(255-d)*e).toString(16)).slice(-2);f[h]=d}return"#"+a.join("")}}(),c=function(){var b=new CKEDITOR.template("background:#{to};background-image:-webkit-gradient(linear,lefttop,leftbottom,from({from}),to({to}));background-image:-moz-linear-gradient(top,{from},{to});background-image:-webkit-linear-gradient(top,{from},{to});background-image:-o-linear-gradient(top,{from},{to});background-image:-ms-linear-gradient(top,{from},{to});background-image:linear-gradient(top,{from},{to});filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='{from}',endColorstr='{to}');");return function(c, +a){return b.output({from:c,to:a})}}(),f={editor:new CKEDITOR.template("{id}.cke_chrome [border-color:{defaultBorder};] {id} .cke_top [ {defaultGradient}border-bottom-color:{defaultBorder};] {id} .cke_bottom [{defaultGradient}border-top-color:{defaultBorder};] {id} .cke_resizer [border-right-color:{ckeResizer}] {id} .cke_dialog_title [{defaultGradient}border-bottom-color:{defaultBorder};] {id} .cke_dialog_footer [{defaultGradient}outline-color:{defaultBorder};border-top-color:{defaultBorder};] {id} .cke_dialog_tab [{lightGradient}border-color:{defaultBorder};] {id} .cke_dialog_tab:hover [{mediumGradient}] {id} .cke_dialog_contents [border-top-color:{defaultBorder};] {id} .cke_dialog_tab_selected, {id} .cke_dialog_tab_selected:hover [background:{dialogTabSelected};border-bottom-color:{dialogTabSelectedBorder};] {id} .cke_dialog_body [background:{dialogBody};border-color:{defaultBorder};] {id} .cke_toolgroup [{lightGradient}border-color:{defaultBorder};] {id} a.cke_button_off:hover, {id} a.cke_button_off:focus, {id} a.cke_button_off:active [{mediumGradient}] {id} .cke_button_on [{ckeButtonOn}] {id} .cke_toolbar_separator [background-color: {ckeToolbarSeparator};] {id} .cke_combo_button [border-color:{defaultBorder};{lightGradient}] {id} a.cke_combo_button:hover, {id} a.cke_combo_button:focus, {id} .cke_combo_on a.cke_combo_button [border-color:{defaultBorder};{mediumGradient}] {id} .cke_path_item [color:{elementsPathColor};] {id} a.cke_path_item:hover, {id} a.cke_path_item:focus, {id} a.cke_path_item:active [background-color:{elementsPathBg};] {id}.cke_panel [border-color:{defaultBorder};] "), +panel:new CKEDITOR.template(".cke_panel_grouptitle [{lightGradient}border-color:{defaultBorder};] .cke_menubutton_icon [background-color:{menubuttonIcon};] .cke_menubutton:hover .cke_menubutton_icon, .cke_menubutton:focus .cke_menubutton_icon, .cke_menubutton:active .cke_menubutton_icon [background-color:{menubuttonIconHover};] .cke_menuseparator [background-color:{menubuttonIcon};] a:hover.cke_colorbox, a:focus.cke_colorbox, a:active.cke_colorbox [border-color:{defaultBorder};] a:hover.cke_colorauto, a:hover.cke_colormore, a:focus.cke_colorauto, a:focus.cke_colormore, a:active.cke_colorauto, a:active.cke_colormore [background-color:{ckeColorauto};border-color:{defaultBorder};] ")}; +return function(g,e){var a=g.uiColor,a={id:"."+g.id,defaultBorder:b(a,-0.1),defaultGradient:c(b(a,0.9),a),lightGradient:c(b(a,1),b(a,0.7)),mediumGradient:c(b(a,0.8),b(a,0.5)),ckeButtonOn:c(b(a,0.6),b(a,0.7)),ckeResizer:b(a,-0.4),ckeToolbarSeparator:b(a,0.5),ckeColorauto:b(a,0.8),dialogBody:b(a,0.7),dialogTabSelected:c("#FFFFFF","#FFFFFF"),dialogTabSelectedBorder:"#FFF",elementsPathColor:b(a,-0.6),elementsPathBg:a,menubuttonIcon:b(a,0.5),menubuttonIconHover:b(a,0.3)};return f[e].output(a).replace(/\[/g, +"{").replace(/\]/g,"}")}}();CKEDITOR.plugins.add("dialogui",{onLoad:function(){var i=function(b){this._||(this._={});this._["default"]=this._.initValue=b["default"]||"";this._.required=b.required||!1;for(var a=[this._],d=1;d<arguments.length;d++)a.push(arguments[d]);a.push(!0);CKEDITOR.tools.extend.apply(CKEDITOR.tools,a);return this._},r={build:function(b,a,d){return new CKEDITOR.ui.dialog.textInput(b,a,d)}},l={build:function(b,a,d){return new CKEDITOR.ui.dialog[a.type](b,a,d)}},n={isChanged:function(){return this.getValue()!= +this.getInitValue()},reset:function(b){this.setValue(this.getInitValue(),b)},setInitValue:function(){this._.initValue=this.getValue()},resetInitValue:function(){this._.initValue=this._["default"]},getInitValue:function(){return this._.initValue}},o=CKEDITOR.tools.extend({},CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,{onChange:function(b,a){this._.domOnChangeRegistered||(b.on("load",function(){this.getInputElement().on("change",function(){b.parts.dialog.isVisible()&&this.fire("change",{value:this.getValue()})}, +this)},this),this._.domOnChangeRegistered=!0);this.on("change",a)}},!0),s=/^on([A-Z]\w+)/,p=function(b){for(var a in b)(s.test(a)||"title"==a||"type"==a)&&delete b[a];return b};CKEDITOR.tools.extend(CKEDITOR.ui.dialog,{labeledElement:function(b,a,d,e){if(!(4>arguments.length)){var c=i.call(this,a);c.labelId=CKEDITOR.tools.getNextId()+"_label";this._.children=[];CKEDITOR.ui.dialog.uiElement.call(this,b,a,d,"div",null,{role:"presentation"},function(){var f=[],d=a.required?" cke_required":"";"horizontal"!= +a.labelLayout?f.push('<label class="cke_dialog_ui_labeled_label'+d+'" ',' id="'+c.labelId+'"',c.inputId?' for="'+c.inputId+'"':"",(a.labelStyle?' style="'+a.labelStyle+'"':"")+">",a.label,"</label>",'<div class="cke_dialog_ui_labeled_content"',a.controlStyle?' style="'+a.controlStyle+'"':"",' role="radiogroup" aria-labelledby="'+c.labelId+'">',e.call(this,b,a),"</div>"):(d={type:"hbox",widths:a.widths,padding:0,children:[{type:"html",html:'<label class="cke_dialog_ui_labeled_label'+d+'" id="'+c.labelId+ +'" for="'+c.inputId+'"'+(a.labelStyle?' style="'+a.labelStyle+'"':"")+">"+CKEDITOR.tools.htmlEncode(a.label)+"</span>"},{type:"html",html:'<span class="cke_dialog_ui_labeled_content"'+(a.controlStyle?' style="'+a.controlStyle+'"':"")+">"+e.call(this,b,a)+"</span>"}]},CKEDITOR.dialog._.uiElementBuilders.hbox.build(b,d,f));return f.join("")})}},textInput:function(b,a,d){if(!(3>arguments.length)){i.call(this,a);var e=this._.inputId=CKEDITOR.tools.getNextId()+"_textInput",c={"class":"cke_dialog_ui_input_"+ +a.type,id:e,type:a.type};a.validate&&(this.validate=a.validate);a.maxLength&&(c.maxlength=a.maxLength);a.size&&(c.size=a.size);a.inputStyle&&(c.style=a.inputStyle);var f=this,h=!1;b.on("load",function(){f.getInputElement().on("keydown",function(a){a.data.getKeystroke()==13&&(h=true)});f.getInputElement().on("keyup",function(a){if(a.data.getKeystroke()==13&&h){b.getButton("ok")&&setTimeout(function(){b.getButton("ok").click()},0);h=false}},null,null,1E3)});CKEDITOR.ui.dialog.labeledElement.call(this, +b,a,d,function(){var b=['<div class="cke_dialog_ui_input_',a.type,'" role="presentation"'];a.width&&b.push('style="width:'+a.width+'" ');b.push("><input ");c["aria-labelledby"]=this._.labelId;this._.required&&(c["aria-required"]=this._.required);for(var d in c)b.push(d+'="'+c[d]+'" ');b.push(" /></div>");return b.join("")})}},textarea:function(b,a,d){if(!(3>arguments.length)){i.call(this,a);var e=this,c=this._.inputId=CKEDITOR.tools.getNextId()+"_textarea",f={};a.validate&&(this.validate=a.validate); +f.rows=a.rows||5;f.cols=a.cols||20;f["class"]="cke_dialog_ui_input_textarea "+(a["class"]||"");"undefined"!=typeof a.inputStyle&&(f.style=a.inputStyle);a.dir&&(f.dir=a.dir);CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){f["aria-labelledby"]=this._.labelId;this._.required&&(f["aria-required"]=this._.required);var a=['<div class="cke_dialog_ui_input_textarea" role="presentation"><textarea id="',c,'" '],b;for(b in f)a.push(b+'="'+CKEDITOR.tools.htmlEncode(f[b])+'" ');a.push(">",CKEDITOR.tools.htmlEncode(e._["default"]), +"</textarea></div>");return a.join("")})}},checkbox:function(b,a,d){if(!(3>arguments.length)){var e=i.call(this,a,{"default":!!a["default"]});a.validate&&(this.validate=a.validate);CKEDITOR.ui.dialog.uiElement.call(this,b,a,d,"span",null,null,function(){var c=CKEDITOR.tools.extend({},a,{id:a.id?a.id+"_checkbox":CKEDITOR.tools.getNextId()+"_checkbox"},true),d=[],h=CKEDITOR.tools.getNextId()+"_label",g={"class":"cke_dialog_ui_checkbox_input",type:"checkbox","aria-labelledby":h};p(c);if(a["default"])g.checked= +"checked";if(typeof c.inputStyle!="undefined")c.style=c.inputStyle;e.checkbox=new CKEDITOR.ui.dialog.uiElement(b,c,d,"input",null,g);d.push(' <label id="',h,'" for="',g.id,'"'+(a.labelStyle?' style="'+a.labelStyle+'"':"")+">",CKEDITOR.tools.htmlEncode(a.label),"</label>");return d.join("")})}},radio:function(b,a,d){if(!(3>arguments.length)){i.call(this,a);this._["default"]||(this._["default"]=this._.initValue=a.items[0][1]);a.validate&&(this.validate=a.valdiate);var e=[],c=this;CKEDITOR.ui.dialog.labeledElement.call(this, +b,a,d,function(){for(var d=[],h=[],g=(a.id?a.id:CKEDITOR.tools.getNextId())+"_radio",k=0;k<a.items.length;k++){var j=a.items[k],i=j[2]!==void 0?j[2]:j[0],l=j[1]!==void 0?j[1]:j[0],m=CKEDITOR.tools.getNextId()+"_radio_input",n=m+"_label",m=CKEDITOR.tools.extend({},a,{id:m,title:null,type:null},true),i=CKEDITOR.tools.extend({},m,{title:i},true),o={type:"radio","class":"cke_dialog_ui_radio_input",name:g,value:l,"aria-labelledby":n},q=[];if(c._["default"]==l)o.checked="checked";p(m);p(i);if(typeof m.inputStyle!= +"undefined")m.style=m.inputStyle;m.keyboardFocusable=true;e.push(new CKEDITOR.ui.dialog.uiElement(b,m,q,"input",null,o));q.push(" ");new CKEDITOR.ui.dialog.uiElement(b,i,q,"label",null,{id:n,"for":o.id},j[0]);d.push(q.join(""))}new CKEDITOR.ui.dialog.hbox(b,e,d,h);return h.join("")});this._.children=e}},button:function(b,a,d){if(arguments.length){"function"==typeof a&&(a=a(b.getParentEditor()));i.call(this,a,{disabled:a.disabled||!1});CKEDITOR.event.implementOn(this);var e=this;b.on("load",function(){var a= +this.getElement();(function(){a.on("click",function(a){e.click();a.data.preventDefault()});a.on("keydown",function(a){a.data.getKeystroke()in{32:1}&&(e.click(),a.data.preventDefault())})})();a.unselectable()},this);var c=CKEDITOR.tools.extend({},a);delete c.style;var f=CKEDITOR.tools.getNextId()+"_label";CKEDITOR.ui.dialog.uiElement.call(this,b,c,d,"a",null,{style:a.style,href:"javascript:void(0)",title:a.label,hidefocus:"true","class":a["class"],role:"button","aria-labelledby":f},'<span id="'+f+ +'" class="cke_dialog_ui_button">'+CKEDITOR.tools.htmlEncode(a.label)+"</span>")}},select:function(b,a,d){if(!(3>arguments.length)){var e=i.call(this,a);a.validate&&(this.validate=a.validate);e.inputId=CKEDITOR.tools.getNextId()+"_select";CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){var c=CKEDITOR.tools.extend({},a,{id:a.id?a.id+"_select":CKEDITOR.tools.getNextId()+"_select"},true),d=[],h=[],g={id:e.inputId,"class":"cke_dialog_ui_input_select","aria-labelledby":this._.labelId};d.push('<div class="cke_dialog_ui_input_', +a.type,'" role="presentation"');a.width&&d.push('style="width:'+a.width+'" ');d.push(">");if(a.size!=void 0)g.size=a.size;if(a.multiple!=void 0)g.multiple=a.multiple;p(c);for(var k=0,j;k<a.items.length&&(j=a.items[k]);k++)h.push('<option value="',CKEDITOR.tools.htmlEncode(j[1]!==void 0?j[1]:j[0]).replace(/"/g,"&quot;"),'" /> ',CKEDITOR.tools.htmlEncode(j[0]));if(typeof c.inputStyle!="undefined")c.style=c.inputStyle;e.select=new CKEDITOR.ui.dialog.uiElement(b,c,d,"select",null,g,h.join(""));d.push("</div>"); +return d.join("")})}},file:function(b,a,d){if(!(3>arguments.length)){void 0===a["default"]&&(a["default"]="");var e=CKEDITOR.tools.extend(i.call(this,a),{definition:a,buttons:[]});a.validate&&(this.validate=a.validate);b.on("load",function(){CKEDITOR.document.getById(e.frameId).getParent().addClass("cke_dialog_ui_input_file")});CKEDITOR.ui.dialog.labeledElement.call(this,b,a,d,function(){e.frameId=CKEDITOR.tools.getNextId()+"_fileInput";var b=['<iframe frameborder="0" allowtransparency="0" class="cke_dialog_ui_input_file" role="presentation" id="', +e.frameId,'" title="',a.label,'" src="javascript:void('];b.push(CKEDITOR.env.ie?"(function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+"})()":"0");b.push(')"></iframe>');return b.join("")})}},fileButton:function(b,a,d){if(!(3>arguments.length)){i.call(this,a);var e=this;a.validate&&(this.validate=a.validate);var c=CKEDITOR.tools.extend({},a),f=c.onClick;c.className=(c.className?c.className+" ":"")+"cke_dialog_ui_button";c.onClick=function(c){var d= +a["for"];if(!f||f.call(this,c)!==false){b.getContentElement(d[0],d[1]).submit();this.disable()}};b.on("load",function(){b.getContentElement(a["for"][0],a["for"][1])._.buttons.push(e)});CKEDITOR.ui.dialog.button.call(this,b,c,d)}},html:function(){var b=/^\s*<[\w:]+\s+([^>]*)?>/,a=/^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/,d=/\/$/;return function(e,c,f){if(!(3>arguments.length)){var h=[],g=c.html;"<"!=g.charAt(0)&&(g="<span>"+g+"</span>");var k=c.focus;if(k){var j=this.focus;this.focus=function(){("function"== +typeof k?k:j).call(this);this.fire("focus")};c.isFocusable&&(this.isFocusable=this.isFocusable);this.keyboardFocusable=!0}CKEDITOR.ui.dialog.uiElement.call(this,e,c,h,"span",null,null,"");h=h.join("").match(b);g=g.match(a)||["","",""];d.test(g[1])&&(g[1]=g[1].slice(0,-1),g[2]="/"+g[2]);f.push([g[1]," ",h[1]||"",g[2]].join(""))}}}(),fieldset:function(b,a,d,e,c){var f=c.label;this._={children:a};CKEDITOR.ui.dialog.uiElement.call(this,b,c,e,"fieldset",null,null,function(){var a=[];f&&a.push("<legend"+ +(c.labelStyle?' style="'+c.labelStyle+'"':"")+">"+f+"</legend>");for(var b=0;b<d.length;b++)a.push(d[b]);return a.join("")})}},!0);CKEDITOR.ui.dialog.html.prototype=new CKEDITOR.ui.dialog.uiElement;CKEDITOR.ui.dialog.labeledElement.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{setLabel:function(b){var a=CKEDITOR.document.getById(this._.labelId);1>a.getChildCount()?(new CKEDITOR.dom.text(b,CKEDITOR.document)).appendTo(a):a.getChild(0).$.nodeValue=b;return this},getLabel:function(){var b= +CKEDITOR.document.getById(this._.labelId);return!b||1>b.getChildCount()?"":b.getChild(0).getText()},eventProcessors:o},!0);CKEDITOR.ui.dialog.button.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{click:function(){return!this._.disabled?this.fire("click",{dialog:this._.dialog}):!1},enable:function(){this._.disabled=!1;var b=this.getElement();b&&b.removeClass("cke_disabled")},disable:function(){this._.disabled=!0;this.getElement().addClass("cke_disabled")},isVisible:function(){return this.getElement().getFirst().isVisible()}, +isEnabled:function(){return!this._.disabled},eventProcessors:CKEDITOR.tools.extend({},CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,{onClick:function(b,a){this.on("click",function(){a.apply(this,arguments)})}},!0),accessKeyUp:function(){this.click()},accessKeyDown:function(){this.focus()},keyboardFocusable:!0},!0);CKEDITOR.ui.dialog.textInput.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return CKEDITOR.document.getById(this._.inputId)}, +focus:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&a.$.focus()},0)},select:function(){var b=this.selectParentTab();setTimeout(function(){var a=b.getInputElement();a&&(a.$.focus(),a.$.select())},0)},accessKeyUp:function(){this.select()},setValue:function(b){!b&&(b="");return CKEDITOR.ui.dialog.uiElement.prototype.setValue.apply(this,arguments)},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.textarea.prototype=new CKEDITOR.ui.dialog.textInput;CKEDITOR.ui.dialog.select.prototype= +CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,{getInputElement:function(){return this._.select.getElement()},add:function(b,a,d){var e=new CKEDITOR.dom.element("option",this.getDialog().getParentEditor().document),c=this.getInputElement().$;e.$.text=b;e.$.value=void 0===a||null===a?b:a;void 0===d||null===d?CKEDITOR.env.ie?c.add(e.$):c.add(e.$,null):c.add(e.$,d);return this},remove:function(b){this.getInputElement().$.remove(b);return this},clear:function(){for(var b=this.getInputElement().$;0< +b.length;)b.remove(0);return this},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.checkbox.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{getInputElement:function(){return this._.checkbox.getElement()},setValue:function(b,a){this.getInputElement().$.checked=b;!a&&this.fire("change",{value:b})},getValue:function(){return this.getInputElement().$.checked},accessKeyUp:function(){this.setValue(!this.getValue())},eventProcessors:{onChange:function(b,a){if(!CKEDITOR.env.ie||8<CKEDITOR.env.version)return o.onChange.apply(this, +arguments);b.on("load",function(){var a=this._.checkbox.getElement();a.on("propertychange",function(b){b=b.data.$;"checked"==b.propertyName&&this.fire("change",{value:a.$.checked})},this)},this);this.on("change",a);return null}},keyboardFocusable:!0},n,!0);CKEDITOR.ui.dialog.radio.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{setValue:function(b,a){for(var d=this._.children,e,c=0;c<d.length&&(e=d[c]);c++)e.getElement().$.checked=e.getValue()==b;!a&&this.fire("change",{value:b})}, +getValue:function(){for(var b=this._.children,a=0;a<b.length;a++)if(b[a].getElement().$.checked)return b[a].getValue();return null},accessKeyUp:function(){var b=this._.children,a;for(a=0;a<b.length;a++)if(b[a].getElement().$.checked){b[a].getElement().focus();return}b[0].getElement().focus()},eventProcessors:{onChange:function(b,a){if(CKEDITOR.env.ie)b.on("load",function(){for(var a=this._.children,b=this,c=0;c<a.length;c++)a[c].getElement().on("propertychange",function(a){a=a.data.$;"checked"==a.propertyName&& +this.$.checked&&b.fire("change",{value:this.getAttribute("value")})})},this),this.on("change",a);else return o.onChange.apply(this,arguments);return null}}},n,!0);CKEDITOR.ui.dialog.file.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.labeledElement,n,{getInputElement:function(){var b=CKEDITOR.document.getById(this._.frameId).getFrameDocument();return 0<b.$.forms.length?new CKEDITOR.dom.element(b.$.forms[0].elements[0]):this.getElement()},submit:function(){this.getInputElement().getParent().$.submit(); +return this},getAction:function(){return this.getInputElement().getParent().$.action},registerEvents:function(b){var a=/^on([A-Z]\w+)/,d,e=function(a,b,c,d){a.on("formLoaded",function(){a.getInputElement().on(c,d,a)})},c;for(c in b)if(d=c.match(a))this.eventProcessors[c]?this.eventProcessors[c].call(this,this._.dialog,b[c]):e(this,this._.dialog,d[1].toLowerCase(),b[c]);return this},reset:function(){function b(){d.$.open();var b="";e.size&&(b=e.size-(CKEDITOR.env.ie?7:0));var i=a.frameId+"_input"; +d.$.write(['<html dir="'+g+'" lang="'+k+'"><head><title></title></head><body style="margin: 0; overflow: hidden; background: transparent;">','<form enctype="multipart/form-data" method="POST" dir="'+g+'" lang="'+k+'" action="',CKEDITOR.tools.htmlEncode(e.action),'"><label id="',a.labelId,'" for="',i,'" style="display:none">',CKEDITOR.tools.htmlEncode(e.label),'</label><input id="',i,'" aria-labelledby="',a.labelId,'" type="file" name="',CKEDITOR.tools.htmlEncode(e.id||"cke_upload"),'" size="',CKEDITOR.tools.htmlEncode(0< +b?b:""),'" /></form></body></html><script>',CKEDITOR.env.ie?"("+CKEDITOR.tools.fixDomain+")();":"","window.parent.CKEDITOR.tools.callFunction("+f+");","window.onbeforeunload = function() {window.parent.CKEDITOR.tools.callFunction("+h+")}","<\/script>"].join(""));d.$.close();for(b=0;b<c.length;b++)c[b].enable()}var a=this._,d=CKEDITOR.document.getById(a.frameId).getFrameDocument(),e=a.definition,c=a.buttons,f=this.formLoadedNumber,h=this.formUnloadNumber,g=a.dialog._.editor.lang.dir,k=a.dialog._.editor.langCode; +f||(f=this.formLoadedNumber=CKEDITOR.tools.addFunction(function(){this.fire("formLoaded")},this),h=this.formUnloadNumber=CKEDITOR.tools.addFunction(function(){this.getInputElement().clearCustomData()},this),this.getDialog()._.editor.on("destroy",function(){CKEDITOR.tools.removeFunction(f);CKEDITOR.tools.removeFunction(h)}));CKEDITOR.env.gecko?setTimeout(b,500):b()},getValue:function(){return this.getInputElement().$.value||""},setInitValue:function(){this._.initValue=""},eventProcessors:{onChange:function(b, +a){this._.domOnChangeRegistered||(this.on("formLoaded",function(){this.getInputElement().on("change",function(){this.fire("change",{value:this.getValue()})},this)},this),this._.domOnChangeRegistered=!0);this.on("change",a)}},keyboardFocusable:!0},!0);CKEDITOR.ui.dialog.fileButton.prototype=new CKEDITOR.ui.dialog.button;CKEDITOR.ui.dialog.fieldset.prototype=CKEDITOR.tools.clone(CKEDITOR.ui.dialog.hbox.prototype);CKEDITOR.dialog.addUIElement("text",r);CKEDITOR.dialog.addUIElement("password",r);CKEDITOR.dialog.addUIElement("textarea", +l);CKEDITOR.dialog.addUIElement("checkbox",l);CKEDITOR.dialog.addUIElement("radio",l);CKEDITOR.dialog.addUIElement("button",l);CKEDITOR.dialog.addUIElement("select",l);CKEDITOR.dialog.addUIElement("file",l);CKEDITOR.dialog.addUIElement("fileButton",l);CKEDITOR.dialog.addUIElement("html",l);CKEDITOR.dialog.addUIElement("fieldset",{build:function(b,a,d){for(var e=a.children,c,f=[],h=[],g=0;g<e.length&&(c=e[g]);g++){var i=[];f.push(i);h.push(CKEDITOR.dialog._.uiElementBuilders[c.type].build(b,c,i))}return new CKEDITOR.ui.dialog[a.type](b, +h,f,d,a)}})}});CKEDITOR.DIALOG_RESIZE_NONE=0;CKEDITOR.DIALOG_RESIZE_WIDTH=1;CKEDITOR.DIALOG_RESIZE_HEIGHT=2;CKEDITOR.DIALOG_RESIZE_BOTH=3; +(function(){function t(){for(var a=this._.tabIdList.length,b=CKEDITOR.tools.indexOf(this._.tabIdList,this._.currentTabId)+a,c=b-1;c>b-a;c--)if(this._.tabs[this._.tabIdList[c%a]][0].$.offsetHeight)return this._.tabIdList[c%a];return null}function u(){for(var a=this._.tabIdList.length,b=CKEDITOR.tools.indexOf(this._.tabIdList,this._.currentTabId),c=b+1;c<b+a;c++)if(this._.tabs[this._.tabIdList[c%a]][0].$.offsetHeight)return this._.tabIdList[c%a];return null}function G(a,b){for(var c=a.$.getElementsByTagName("input"), +e=0,d=c.length;e<d;e++){var g=new CKEDITOR.dom.element(c[e]);"text"==g.getAttribute("type").toLowerCase()&&(b?(g.setAttribute("value",g.getCustomData("fake_value")||""),g.removeCustomData("fake_value")):(g.setCustomData("fake_value",g.getAttribute("value")),g.setAttribute("value","")))}}function P(a,b){var c=this.getInputElement();c&&(a?c.removeAttribute("aria-invalid"):c.setAttribute("aria-invalid",!0));a||(this.select?this.select():this.focus());b&&alert(b);this.fire("validated",{valid:a,msg:b})} +function Q(){var a=this.getInputElement();a&&a.removeAttribute("aria-invalid")}function R(a){var a=CKEDITOR.dom.element.createFromHtml(CKEDITOR.addTemplate("dialog",S).output({id:CKEDITOR.tools.getNextNumber(),editorId:a.id,langDir:a.lang.dir,langCode:a.langCode,editorDialogClass:"cke_editor_"+a.name.replace(/\./g,"\\.")+"_dialog",closeTitle:a.lang.common.close,hidpi:CKEDITOR.env.hidpi?"cke_hidpi":""})),b=a.getChild([0,0,0,0,0]),c=b.getChild(0),e=b.getChild(1);if(CKEDITOR.env.ie&&!CKEDITOR.env.ie6Compat){var d= +"javascript:void(function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+"}())";CKEDITOR.dom.element.createFromHtml('<iframe frameBorder="0" class="cke_iframe_shim" src="'+d+'" tabIndex="-1"></iframe>').appendTo(b.getParent())}c.unselectable();e.unselectable();return{element:a,parts:{dialog:a.getChild(0),title:c,close:e,tabs:b.getChild(2),contents:b.getChild([3,0,0,0]),footer:b.getChild([3,0,1,0])}}}function H(a,b,c){this.element=b;this.focusIndex=c;this.tabIndex= +0;this.isFocusable=function(){return!b.getAttribute("disabled")&&b.isVisible()};this.focus=function(){a._.currentFocusIndex=this.focusIndex;this.element.focus()};b.on("keydown",function(a){a.data.getKeystroke()in{32:1,13:1}&&this.fire("click")});b.on("focus",function(){this.fire("mouseover")});b.on("blur",function(){this.fire("mouseout")})}function T(a){function b(){a.layout()}var c=CKEDITOR.document.getWindow();c.on("resize",b);a.on("hide",function(){c.removeListener("resize",b)})}function I(a,b){this._= +{dialog:a};CKEDITOR.tools.extend(this,b)}function U(a){function b(b){var c=a.getSize(),h=CKEDITOR.document.getWindow().getViewPaneSize(),o=b.data.$.screenX,j=b.data.$.screenY,n=o-e.x,m=j-e.y;e={x:o,y:j};d.x+=n;d.y+=m;a.move(d.x+i[3]<f?-i[3]:d.x-i[1]>h.width-c.width-f?h.width-c.width+("rtl"==g.lang.dir?0:i[1]):d.x,d.y+i[0]<f?-i[0]:d.y-i[2]>h.height-c.height-f?h.height-c.height+i[2]:d.y,1);b.data.preventDefault()}function c(){CKEDITOR.document.removeListener("mousemove",b);CKEDITOR.document.removeListener("mouseup", +c);if(CKEDITOR.env.ie6Compat){var a=q.getChild(0).getFrameDocument();a.removeListener("mousemove",b);a.removeListener("mouseup",c)}}var e=null,d=null;a.getElement().getFirst();var g=a.getParentEditor(),f=g.config.dialog_magnetDistance,i=CKEDITOR.skin.margins||[0,0,0,0];"undefined"==typeof f&&(f=20);a.parts.title.on("mousedown",function(f){e={x:f.data.$.screenX,y:f.data.$.screenY};CKEDITOR.document.on("mousemove",b);CKEDITOR.document.on("mouseup",c);d=a.getPosition();if(CKEDITOR.env.ie6Compat){var k= +q.getChild(0).getFrameDocument();k.on("mousemove",b);k.on("mouseup",c)}f.data.preventDefault()},a)}function V(a){var b,c;function e(d){var e="rtl"==i.lang.dir,j=o.width,C=o.height,D=j+(d.data.$.screenX-b)*(e?-1:1)*(a._.moved?1:2),n=C+(d.data.$.screenY-c)*(a._.moved?1:2),x=a._.element.getFirst(),x=e&&x.getComputedStyle("right"),y=a.getPosition();y.y+n>h.height&&(n=h.height-y.y);if((e?x:y.x)+D>h.width)D=h.width-(e?x:y.x);if(f==CKEDITOR.DIALOG_RESIZE_WIDTH||f==CKEDITOR.DIALOG_RESIZE_BOTH)j=Math.max(g.minWidth|| +0,D-l);if(f==CKEDITOR.DIALOG_RESIZE_HEIGHT||f==CKEDITOR.DIALOG_RESIZE_BOTH)C=Math.max(g.minHeight||0,n-k);a.resize(j,C);a._.moved||a.layout();d.data.preventDefault()}function d(){CKEDITOR.document.removeListener("mouseup",d);CKEDITOR.document.removeListener("mousemove",e);j&&(j.remove(),j=null);if(CKEDITOR.env.ie6Compat){var a=q.getChild(0).getFrameDocument();a.removeListener("mouseup",d);a.removeListener("mousemove",e)}}var g=a.definition,f=g.resizable;if(f!=CKEDITOR.DIALOG_RESIZE_NONE){var i=a.getParentEditor(), +l,k,h,o,j,n=CKEDITOR.tools.addFunction(function(f){o=a.getSize();var g=a.parts.contents;g.$.getElementsByTagName("iframe").length&&(j=CKEDITOR.dom.element.createFromHtml('<div class="cke_dialog_resize_cover" style="height: 100%; position: absolute; width: 100%;"></div>'),g.append(j));k=o.height-a.parts.contents.getSize("height",!(CKEDITOR.env.gecko||CKEDITOR.env.opera||CKEDITOR.env.ie&&CKEDITOR.env.quirks));l=o.width-a.parts.contents.getSize("width",1);b=f.screenX;c=f.screenY;h=CKEDITOR.document.getWindow().getViewPaneSize(); +CKEDITOR.document.on("mousemove",e);CKEDITOR.document.on("mouseup",d);CKEDITOR.env.ie6Compat&&(g=q.getChild(0).getFrameDocument(),g.on("mousemove",e),g.on("mouseup",d));f.preventDefault&&f.preventDefault()});a.on("load",function(){var b="";f==CKEDITOR.DIALOG_RESIZE_WIDTH?b=" cke_resizer_horizontal":f==CKEDITOR.DIALOG_RESIZE_HEIGHT&&(b=" cke_resizer_vertical");b=CKEDITOR.dom.element.createFromHtml('<div class="cke_resizer'+b+" cke_resizer_"+i.lang.dir+'" title="'+CKEDITOR.tools.htmlEncode(i.lang.common.resize)+ +'" onmousedown="CKEDITOR.tools.callFunction('+n+', event )">'+("ltr"==i.lang.dir?"◢":"◣")+"</div>");a.parts.footer.append(b,1)});i.on("destroy",function(){CKEDITOR.tools.removeFunction(n)})}}function E(a){a.data.preventDefault(1)}function J(a){var b=CKEDITOR.document.getWindow(),c=a.config,e=c.dialog_backgroundCoverColor||"white",d=c.dialog_backgroundCoverOpacity,g=c.baseFloatZIndex,c=CKEDITOR.tools.genKey(e,d,g),f=w[c];f?f.show():(g=['<div tabIndex="-1" style="position: ',CKEDITOR.env.ie6Compat? +"absolute":"fixed","; z-index: ",g,"; top: 0px; left: 0px; ",!CKEDITOR.env.ie6Compat?"background-color: "+e:"",'" class="cke_dialog_background_cover">'],CKEDITOR.env.ie6Compat&&(e="<html><body style=\\'background-color:"+e+";\\'></body></html>",g.push('<iframe hidefocus="true" frameborder="0" id="cke_dialog_background_iframe" src="javascript:'),g.push("void((function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.write( '"+e+"' );document.close();")+"})())"),g.push('" style="position:absolute;left:0;top:0;width:100%;height: 100%;filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0)"></iframe>')), +g.push("</div>"),f=CKEDITOR.dom.element.createFromHtml(g.join("")),f.setOpacity(void 0!=d?d:0.5),f.on("keydown",E),f.on("keypress",E),f.on("keyup",E),f.appendTo(CKEDITOR.document.getBody()),w[c]=f);a.focusManager.add(f);q=f;var a=function(){var a=b.getViewPaneSize();f.setStyles({width:a.width+"px",height:a.height+"px"})},i=function(){var a=b.getScrollPosition(),c=CKEDITOR.dialog._.currentTop;f.setStyles({left:a.x+"px",top:a.y+"px"});if(c){do{a=c.getPosition();c.move(a.x,a.y)}while(c=c._.parentDialog) +}};F=a;b.on("resize",a);a();(!CKEDITOR.env.mac||!CKEDITOR.env.webkit)&&f.focus();if(CKEDITOR.env.ie6Compat){var l=function(){i();arguments.callee.prevScrollHandler.apply(this,arguments)};b.$.setTimeout(function(){l.prevScrollHandler=window.onscroll||function(){};window.onscroll=l},0);i()}}function K(a){q&&(a.focusManager.remove(q),a=CKEDITOR.document.getWindow(),q.hide(),a.removeListener("resize",F),CKEDITOR.env.ie6Compat&&a.$.setTimeout(function(){window.onscroll=window.onscroll&&window.onscroll.prevScrollHandler|| +null},0),F=null)}var r=CKEDITOR.tools.cssLength,S='<div class="cke_reset_all {editorId} {editorDialogClass} {hidpi}" dir="{langDir}" lang="{langCode}" role="dialog" aria-labelledby="cke_dialog_title_{id}"><table class="cke_dialog '+CKEDITOR.env.cssClass+' cke_{langDir}" style="position:absolute" role="presentation"><tr><td role="presentation"><div class="cke_dialog_body" role="presentation"><div id="cke_dialog_title_{id}" class="cke_dialog_title" role="presentation"></div><a id="cke_dialog_close_button_{id}" class="cke_dialog_close_button" href="javascript:void(0)" title="{closeTitle}" role="button"><span class="cke_label">X</span></a><div id="cke_dialog_tabs_{id}" class="cke_dialog_tabs" role="tablist"></div><table class="cke_dialog_contents" role="presentation"><tr><td id="cke_dialog_contents_{id}" class="cke_dialog_contents_body" role="presentation"></td></tr><tr><td id="cke_dialog_footer_{id}" class="cke_dialog_footer" role="presentation"></td></tr></table></div></td></tr></table></div>'; +CKEDITOR.dialog=function(a,b){function c(){var a=m._.focusList;a.sort(function(a,b){return a.tabIndex!=b.tabIndex?b.tabIndex-a.tabIndex:a.focusIndex-b.focusIndex});for(var b=a.length,c=0;c<b;c++)a[c].focusIndex=c}function e(a){var b=m._.focusList,a=a||0;if(!(1>b.length)){var c=m._.currentFocusIndex;try{b[c].getInputElement().$.blur()}catch(f){}for(var d=c=(c+a+b.length)%b.length;a&&!b[d].isFocusable()&&!(d=(d+a+b.length)%b.length,d==c););b[d].focus();"text"==b[d].type&&b[d].select()}}function d(b){if(m== +CKEDITOR.dialog._.currentTop){var c=b.data.getKeystroke(),d="rtl"==a.lang.dir;o=j=0;if(9==c||c==CKEDITOR.SHIFT+9)c=c==CKEDITOR.SHIFT+9,m._.tabBarMode?(c=c?t.call(m):u.call(m),m.selectPage(c),m._.tabs[c][0].focus()):e(c?-1:1),o=1;else if(c==CKEDITOR.ALT+121&&!m._.tabBarMode&&1<m.getPageCount())m._.tabBarMode=!0,m._.tabs[m._.currentTabId][0].focus(),o=1;else if((37==c||39==c)&&m._.tabBarMode)c=c==(d?39:37)?t.call(m):u.call(m),m.selectPage(c),m._.tabs[c][0].focus(),o=1;else if((13==c||32==c)&&m._.tabBarMode)this.selectPage(this._.currentTabId), +this._.tabBarMode=!1,this._.currentFocusIndex=-1,e(1),o=1;else if(13==c){c=b.data.getTarget();if(!c.is("a","button","select","textarea")&&(!c.is("input")||"button"!=c.$.type))(c=this.getButton("ok"))&&CKEDITOR.tools.setTimeout(c.click,0,c),o=1;j=1}else if(27==c)(c=this.getButton("cancel"))?CKEDITOR.tools.setTimeout(c.click,0,c):!1!==this.fire("cancel",{hide:!0}).hide&&this.hide(),j=1;else return;g(b)}}function g(a){o?a.data.preventDefault(1):j&&a.data.stopPropagation()}var f=CKEDITOR.dialog._.dialogDefinitions[b], +i=CKEDITOR.tools.clone(W),l=a.config.dialog_buttonsOrder||"OS",k=a.lang.dir,h={},o,j;("OS"==l&&CKEDITOR.env.mac||"rtl"==l&&"ltr"==k||"ltr"==l&&"rtl"==k)&&i.buttons.reverse();f=CKEDITOR.tools.extend(f(a),i);f=CKEDITOR.tools.clone(f);f=new L(this,f);i=R(a);this._={editor:a,element:i.element,name:b,contentSize:{width:0,height:0},size:{width:0,height:0},contents:{},buttons:{},accessKeyMap:{},tabs:{},tabIdList:[],currentTabId:null,currentTabIndex:null,pageCount:0,lastTab:null,tabBarMode:!1,focusList:[], +currentFocusIndex:0,hasFocus:!1};this.parts=i.parts;CKEDITOR.tools.setTimeout(function(){a.fire("ariaWidget",this.parts.contents)},0,this);i={position:CKEDITOR.env.ie6Compat?"absolute":"fixed",top:0,visibility:"hidden"};i["rtl"==k?"right":"left"]=0;this.parts.dialog.setStyles(i);CKEDITOR.event.call(this);this.definition=f=CKEDITOR.fire("dialogDefinition",{name:b,definition:f},a).definition;if(!("removeDialogTabs"in a._)&&a.config.removeDialogTabs){i=a.config.removeDialogTabs.split(";");for(k=0;k< +i.length;k++)if(l=i[k].split(":"),2==l.length){var n=l[0];h[n]||(h[n]=[]);h[n].push(l[1])}a._.removeDialogTabs=h}if(a._.removeDialogTabs&&(h=a._.removeDialogTabs[b]))for(k=0;k<h.length;k++)f.removeContents(h[k]);if(f.onLoad)this.on("load",f.onLoad);if(f.onShow)this.on("show",f.onShow);if(f.onHide)this.on("hide",f.onHide);if(f.onOk)this.on("ok",function(b){a.fire("saveSnapshot");setTimeout(function(){a.fire("saveSnapshot")},0);!1===f.onOk.call(this,b)&&(b.data.hide=!1)});if(f.onCancel)this.on("cancel", +function(a){!1===f.onCancel.call(this,a)&&(a.data.hide=!1)});var m=this,p=function(a){var b=m._.contents,c=!1,d;for(d in b)for(var f in b[d])if(c=a.call(this,b[d][f]))return};this.on("ok",function(a){p(function(b){if(b.validate){var c=b.validate(this),d="string"==typeof c||!1===c;d&&(a.data.hide=!1,a.stop());P.call(b,!d,"string"==typeof c?c:void 0);return d}})},this,null,0);this.on("cancel",function(b){p(function(c){if(c.isChanged())return!a.config.dialog_noConfirmCancel&&!confirm(a.lang.common.confirmCancel)&& +(b.data.hide=!1),!0})},this,null,0);this.parts.close.on("click",function(a){!1!==this.fire("cancel",{hide:!0}).hide&&this.hide();a.data.preventDefault()},this);this.changeFocus=e;var v=this._.element;a.focusManager.add(v,1);this.on("show",function(){v.on("keydown",d,this);if(CKEDITOR.env.opera||CKEDITOR.env.gecko)v.on("keypress",g,this)});this.on("hide",function(){v.removeListener("keydown",d);(CKEDITOR.env.opera||CKEDITOR.env.gecko)&&v.removeListener("keypress",g);p(function(a){Q.apply(a)})});this.on("iframeAdded", +function(a){(new CKEDITOR.dom.document(a.data.iframe.$.contentWindow.document)).on("keydown",d,this,null,0)});this.on("show",function(){c();if(a.config.dialog_startupFocusTab&&1<m._.pageCount)m._.tabBarMode=!0,m._.tabs[m._.currentTabId][0].focus();else if(!this._.hasFocus)if(this._.currentFocusIndex=-1,f.onFocus){var b=f.onFocus.call(this);b&&b.focus()}else e(1)},this,null,4294967295);if(CKEDITOR.env.ie6Compat)this.on("load",function(){var a=this.getElement(),b=a.getFirst();b.remove();b.appendTo(a)}, +this);U(this);V(this);(new CKEDITOR.dom.text(f.title,CKEDITOR.document)).appendTo(this.parts.title);for(k=0;k<f.contents.length;k++)(h=f.contents[k])&&this.addPage(h);this.parts.tabs.on("click",function(a){var b=a.data.getTarget();b.hasClass("cke_dialog_tab")&&(b=b.$.id,this.selectPage(b.substring(4,b.lastIndexOf("_"))),this._.tabBarMode&&(this._.tabBarMode=!1,this._.currentFocusIndex=-1,e(1)),a.data.preventDefault())},this);k=[];h=CKEDITOR.dialog._.uiElementBuilders.hbox.build(this,{type:"hbox", +className:"cke_dialog_footer_buttons",widths:[],children:f.buttons},k).getChild();this.parts.footer.setHtml(k.join(""));for(k=0;k<h.length;k++)this._.buttons[h[k].id]=h[k]};CKEDITOR.dialog.prototype={destroy:function(){this.hide();this._.element.remove()},resize:function(){return function(a,b){if(!this._.contentSize||!(this._.contentSize.width==a&&this._.contentSize.height==b))CKEDITOR.dialog.fire("resize",{dialog:this,width:a,height:b},this._.editor),this.fire("resize",{width:a,height:b},this._.editor), +this.parts.contents.setStyles({width:a+"px",height:b+"px"}),"rtl"==this._.editor.lang.dir&&this._.position&&(this._.position.x=CKEDITOR.document.getWindow().getViewPaneSize().width-this._.contentSize.width-parseInt(this._.element.getFirst().getStyle("right"),10)),this._.contentSize={width:a,height:b}}}(),getSize:function(){var a=this._.element.getFirst();return{width:a.$.offsetWidth||0,height:a.$.offsetHeight||0}},move:function(a,b,c){var e=this._.element.getFirst(),d="rtl"==this._.editor.lang.dir, +g="fixed"==e.getComputedStyle("position");CKEDITOR.env.ie&&e.setStyle("zoom","100%");if(!g||!this._.position||!(this._.position.x==a&&this._.position.y==b))this._.position={x:a,y:b},g||(g=CKEDITOR.document.getWindow().getScrollPosition(),a+=g.x,b+=g.y),d&&(g=this.getSize(),a=CKEDITOR.document.getWindow().getViewPaneSize().width-g.width-a),b={top:(0<b?b:0)+"px"},b[d?"right":"left"]=(0<a?a:0)+"px",e.setStyles(b),c&&(this._.moved=1)},getPosition:function(){return CKEDITOR.tools.extend({},this._.position)}, +show:function(){var a=this._.element,b=this.definition;!a.getParent()||!a.getParent().equals(CKEDITOR.document.getBody())?a.appendTo(CKEDITOR.document.getBody()):a.setStyle("display","block");if(CKEDITOR.env.gecko&&10900>CKEDITOR.env.version){var c=this.parts.dialog;c.setStyle("position","absolute");setTimeout(function(){c.setStyle("position","fixed")},0)}this.resize(this._.contentSize&&this._.contentSize.width||b.width||b.minWidth,this._.contentSize&&this._.contentSize.height||b.height||b.minHeight); +this.reset();this.selectPage(this.definition.contents[0].id);null===CKEDITOR.dialog._.currentZIndex&&(CKEDITOR.dialog._.currentZIndex=this._.editor.config.baseFloatZIndex);this._.element.getFirst().setStyle("z-index",CKEDITOR.dialog._.currentZIndex+=10);null===CKEDITOR.dialog._.currentTop?(CKEDITOR.dialog._.currentTop=this,this._.parentDialog=null,J(this._.editor)):(this._.parentDialog=CKEDITOR.dialog._.currentTop,this._.parentDialog.getElement().getFirst().$.style.zIndex-=Math.floor(this._.editor.config.baseFloatZIndex/ +2),CKEDITOR.dialog._.currentTop=this);a.on("keydown",M);a.on(CKEDITOR.env.opera?"keypress":"keyup",N);this._.hasFocus=!1;for(var e in b.contents)if(b.contents[e]){var a=b.contents[e],d=this._.tabs[a.id],g=a.requiredContent,f=0;if(d){for(var i in this._.contents[a.id]){var l=this._.contents[a.id][i];"hbox"==l.type||("vbox"==l.type||!l.getInputElement())||(l.requiredContent&&!this._.editor.activeFilter.check(l.requiredContent)?l.disable():(l.enable(),f++))}!f||g&&!this._.editor.activeFilter.check(g)? +d[0].addClass("cke_dialog_tab_disabled"):d[0].removeClass("cke_dialog_tab_disabled")}}CKEDITOR.tools.setTimeout(function(){this.layout();T(this);this.parts.dialog.setStyle("visibility","");this.fireOnce("load",{});CKEDITOR.ui.fire("ready",this);this.fire("show",{});this._.editor.fire("dialogShow",this);this._.parentDialog||this._.editor.focusManager.lock();this.foreach(function(a){a.setInitValue&&a.setInitValue()})},100,this)},layout:function(){var a=this.parts.dialog,b=this.getSize(),c=CKEDITOR.document.getWindow().getViewPaneSize(), +e=(c.width-b.width)/2,d=(c.height-b.height)/2;CKEDITOR.env.ie6Compat||(b.height+(0<d?d:0)>c.height||b.width+(0<e?e:0)>c.width?a.setStyle("position","absolute"):a.setStyle("position","fixed"));this.move(this._.moved?this._.position.x:e,this._.moved?this._.position.y:d)},foreach:function(a){for(var b in this._.contents)for(var c in this._.contents[b])a.call(this,this._.contents[b][c]);return this},reset:function(){var a=function(a){a.reset&&a.reset(1)};return function(){this.foreach(a);return this}}(), +setupContent:function(){var a=arguments;this.foreach(function(b){b.setup&&b.setup.apply(b,a)})},commitContent:function(){var a=arguments;this.foreach(function(b){CKEDITOR.env.ie&&this._.currentFocusIndex==b.focusIndex&&b.getInputElement().$.blur();b.commit&&b.commit.apply(b,a)})},hide:function(){if(this.parts.dialog.isVisible()){this.fire("hide",{});this._.editor.fire("dialogHide",this);this.selectPage(this._.tabIdList[0]);var a=this._.element;a.setStyle("display","none");this.parts.dialog.setStyle("visibility", +"hidden");for(X(this);CKEDITOR.dialog._.currentTop!=this;)CKEDITOR.dialog._.currentTop.hide();if(this._.parentDialog){var b=this._.parentDialog.getElement().getFirst();b.setStyle("z-index",parseInt(b.$.style.zIndex,10)+Math.floor(this._.editor.config.baseFloatZIndex/2))}else K(this._.editor);if(CKEDITOR.dialog._.currentTop=this._.parentDialog)CKEDITOR.dialog._.currentZIndex-=10;else{CKEDITOR.dialog._.currentZIndex=null;a.removeListener("keydown",M);a.removeListener(CKEDITOR.env.opera?"keypress":"keyup", +N);var c=this._.editor;c.focus();setTimeout(function(){c.focusManager.unlock()},0)}delete this._.parentDialog;this.foreach(function(a){a.resetInitValue&&a.resetInitValue()})}},addPage:function(a){if(!a.requiredContent||this._.editor.filter.check(a.requiredContent)){for(var b=[],c=a.label?' title="'+CKEDITOR.tools.htmlEncode(a.label)+'"':"",e=CKEDITOR.dialog._.uiElementBuilders.vbox.build(this,{type:"vbox",className:"cke_dialog_page_contents",children:a.elements,expand:!!a.expand,padding:a.padding, +style:a.style||"width: 100%;"},b),d=this._.contents[a.id]={},g=e.getChild(),f=0;e=g.shift();)!e.notAllowed&&("hbox"!=e.type&&"vbox"!=e.type)&&f++,d[e.id]=e,"function"==typeof e.getChild&&g.push.apply(g,e.getChild());f||(a.hidden=!0);b=CKEDITOR.dom.element.createFromHtml(b.join(""));b.setAttribute("role","tabpanel");e=CKEDITOR.env;d="cke_"+a.id+"_"+CKEDITOR.tools.getNextNumber();c=CKEDITOR.dom.element.createFromHtml(['<a class="cke_dialog_tab"',0<this._.pageCount?" cke_last":"cke_first",c,a.hidden? +' style="display:none"':"",' id="',d,'"',e.gecko&&10900<=e.version&&!e.hc?"":' href="javascript:void(0)"',' tabIndex="-1" hidefocus="true" role="tab">',a.label,"</a>"].join(""));b.setAttribute("aria-labelledby",d);this._.tabs[a.id]=[c,b];this._.tabIdList.push(a.id);!a.hidden&&this._.pageCount++;this._.lastTab=c;this.updateStyle();b.setAttribute("name",a.id);b.appendTo(this.parts.contents);c.unselectable();this.parts.tabs.append(c);a.accessKey&&(O(this,this,"CTRL+"+a.accessKey,Y,Z),this._.accessKeyMap["CTRL+"+ +a.accessKey]=a.id)}},selectPage:function(a){if(this._.currentTabId!=a&&!this._.tabs[a][0].hasClass("cke_dialog_tab_disabled")&&!0!==this.fire("selectPage",{page:a,currentPage:this._.currentTabId})){for(var b in this._.tabs){var c=this._.tabs[b][0],e=this._.tabs[b][1];b!=a&&(c.removeClass("cke_dialog_tab_selected"),e.hide());e.setAttribute("aria-hidden",b!=a)}var d=this._.tabs[a];d[0].addClass("cke_dialog_tab_selected");CKEDITOR.env.ie6Compat||CKEDITOR.env.ie7Compat?(G(d[1]),d[1].show(),setTimeout(function(){G(d[1], +1)},0)):d[1].show();this._.currentTabId=a;this._.currentTabIndex=CKEDITOR.tools.indexOf(this._.tabIdList,a)}},updateStyle:function(){this.parts.dialog[(1===this._.pageCount?"add":"remove")+"Class"]("cke_single_page")},hidePage:function(a){var b=this._.tabs[a]&&this._.tabs[a][0];b&&(1!=this._.pageCount&&b.isVisible())&&(a==this._.currentTabId&&this.selectPage(t.call(this)),b.hide(),this._.pageCount--,this.updateStyle())},showPage:function(a){if(a=this._.tabs[a]&&this._.tabs[a][0])a.show(),this._.pageCount++, +this.updateStyle()},getElement:function(){return this._.element},getName:function(){return this._.name},getContentElement:function(a,b){var c=this._.contents[a];return c&&c[b]},getValueOf:function(a,b){return this.getContentElement(a,b).getValue()},setValueOf:function(a,b,c){return this.getContentElement(a,b).setValue(c)},getButton:function(a){return this._.buttons[a]},click:function(a){return this._.buttons[a].click()},disableButton:function(a){return this._.buttons[a].disable()},enableButton:function(a){return this._.buttons[a].enable()}, +getPageCount:function(){return this._.pageCount},getParentEditor:function(){return this._.editor},getSelectedElement:function(){return this.getParentEditor().getSelection().getSelectedElement()},addFocusable:function(a,b){if("undefined"==typeof b)b=this._.focusList.length,this._.focusList.push(new H(this,a,b));else{this._.focusList.splice(b,0,new H(this,a,b));for(var c=b+1;c<this._.focusList.length;c++)this._.focusList[c].focusIndex++}}};CKEDITOR.tools.extend(CKEDITOR.dialog,{add:function(a,b){if(!this._.dialogDefinitions[a]|| +"function"==typeof b)this._.dialogDefinitions[a]=b},exists:function(a){return!!this._.dialogDefinitions[a]},getCurrent:function(){return CKEDITOR.dialog._.currentTop},isTabEnabled:function(a,b,c){a=a.config.removeDialogTabs;return!(a&&a.match(RegExp("(?:^|;)"+b+":"+c+"(?:$|;)","i")))},okButton:function(){var a=function(a,c){c=c||{};return CKEDITOR.tools.extend({id:"ok",type:"button",label:a.lang.common.ok,"class":"cke_dialog_ui_button_ok",onClick:function(a){a=a.data.dialog;!1!==a.fire("ok",{hide:!0}).hide&& +a.hide()}},c,!0)};a.type="button";a.override=function(b){return CKEDITOR.tools.extend(function(c){return a(c,b)},{type:"button"},!0)};return a}(),cancelButton:function(){var a=function(a,c){c=c||{};return CKEDITOR.tools.extend({id:"cancel",type:"button",label:a.lang.common.cancel,"class":"cke_dialog_ui_button_cancel",onClick:function(a){a=a.data.dialog;!1!==a.fire("cancel",{hide:!0}).hide&&a.hide()}},c,!0)};a.type="button";a.override=function(b){return CKEDITOR.tools.extend(function(c){return a(c, +b)},{type:"button"},!0)};return a}(),addUIElement:function(a,b){this._.uiElementBuilders[a]=b}});CKEDITOR.dialog._={uiElementBuilders:{},dialogDefinitions:{},currentTop:null,currentZIndex:null};CKEDITOR.event.implementOn(CKEDITOR.dialog);CKEDITOR.event.implementOn(CKEDITOR.dialog.prototype);var W={resizable:CKEDITOR.DIALOG_RESIZE_BOTH,minWidth:600,minHeight:400,buttons:[CKEDITOR.dialog.okButton,CKEDITOR.dialog.cancelButton]},z=function(a,b,c){for(var e=0,d;d=a[e];e++)if(d.id==b||c&&d[c]&&(d=z(d[c], +b,c)))return d;return null},A=function(a,b,c,e,d){if(c){for(var g=0,f;f=a[g];g++){if(f.id==c)return a.splice(g,0,b),b;if(e&&f[e]&&(f=A(f[e],b,c,e,!0)))return f}if(d)return null}a.push(b);return b},B=function(a,b,c){for(var e=0,d;d=a[e];e++){if(d.id==b)return a.splice(e,1);if(c&&d[c]&&(d=B(d[c],b,c)))return d}return null},L=function(a,b){this.dialog=a;for(var c=b.contents,e=0,d;d=c[e];e++)c[e]=d&&new I(a,d);CKEDITOR.tools.extend(this,b)};L.prototype={getContents:function(a){return z(this.contents, +a)},getButton:function(a){return z(this.buttons,a)},addContents:function(a,b){return A(this.contents,a,b)},addButton:function(a,b){return A(this.buttons,a,b)},removeContents:function(a){B(this.contents,a)},removeButton:function(a){B(this.buttons,a)}};I.prototype={get:function(a){return z(this.elements,a,"children")},add:function(a,b){return A(this.elements,a,b,"children")},remove:function(a){B(this.elements,a,"children")}};var F,w={},q,s={},M=function(a){var b=a.data.$.ctrlKey||a.data.$.metaKey,c= +a.data.$.altKey,e=a.data.$.shiftKey,d=String.fromCharCode(a.data.$.keyCode);if((b=s[(b?"CTRL+":"")+(c?"ALT+":"")+(e?"SHIFT+":"")+d])&&b.length)b=b[b.length-1],b.keydown&&b.keydown.call(b.uiElement,b.dialog,b.key),a.data.preventDefault()},N=function(a){var b=a.data.$.ctrlKey||a.data.$.metaKey,c=a.data.$.altKey,e=a.data.$.shiftKey,d=String.fromCharCode(a.data.$.keyCode);if((b=s[(b?"CTRL+":"")+(c?"ALT+":"")+(e?"SHIFT+":"")+d])&&b.length)b=b[b.length-1],b.keyup&&(b.keyup.call(b.uiElement,b.dialog,b.key), +a.data.preventDefault())},O=function(a,b,c,e,d){(s[c]||(s[c]=[])).push({uiElement:a,dialog:b,key:c,keyup:d||a.accessKeyUp,keydown:e||a.accessKeyDown})},X=function(a){for(var b in s){for(var c=s[b],e=c.length-1;0<=e;e--)(c[e].dialog==a||c[e].uiElement==a)&&c.splice(e,1);0===c.length&&delete s[b]}},Z=function(a,b){a._.accessKeyMap[b]&&a.selectPage(a._.accessKeyMap[b])},Y=function(){};(function(){CKEDITOR.ui.dialog={uiElement:function(a,b,c,e,d,g,f){if(!(4>arguments.length)){var i=(e.call?e(b):e)||"div", +l=["<",i," "],k=(d&&d.call?d(b):d)||{},h=(g&&g.call?g(b):g)||{},o=(f&&f.call?f.call(this,a,b):f)||"",j=this.domId=h.id||CKEDITOR.tools.getNextId()+"_uiElement";this.id=b.id;b.requiredContent&&!a.getParentEditor().filter.check(b.requiredContent)&&(k.display="none",this.notAllowed=!0);h.id=j;var n={};b.type&&(n["cke_dialog_ui_"+b.type]=1);b.className&&(n[b.className]=1);b.disabled&&(n.cke_disabled=1);for(var m=h["class"]&&h["class"].split?h["class"].split(" "):[],j=0;j<m.length;j++)m[j]&&(n[m[j]]=1); +m=[];for(j in n)m.push(j);h["class"]=m.join(" ");b.title&&(h.title=b.title);n=(b.style||"").split(";");b.align&&(m=b.align,k["margin-left"]="left"==m?0:"auto",k["margin-right"]="right"==m?0:"auto");for(j in k)n.push(j+":"+k[j]);b.hidden&&n.push("display:none");for(j=n.length-1;0<=j;j--)""===n[j]&&n.splice(j,1);0<n.length&&(h.style=(h.style?h.style+"; ":"")+n.join("; "));for(j in h)l.push(j+'="'+CKEDITOR.tools.htmlEncode(h[j])+'" ');l.push(">",o,"</",i,">");c.push(l.join(""));(this._||(this._={})).dialog= +a;"boolean"==typeof b.isChanged&&(this.isChanged=function(){return b.isChanged});"function"==typeof b.isChanged&&(this.isChanged=b.isChanged);"function"==typeof b.setValue&&(this.setValue=CKEDITOR.tools.override(this.setValue,function(a){return function(c){a.call(this,b.setValue.call(this,c))}}));"function"==typeof b.getValue&&(this.getValue=CKEDITOR.tools.override(this.getValue,function(a){return function(){return b.getValue.call(this,a.call(this))}}));CKEDITOR.event.implementOn(this);this.registerEvents(b); +this.accessKeyUp&&(this.accessKeyDown&&b.accessKey)&&O(this,a,"CTRL+"+b.accessKey);var p=this;a.on("load",function(){var b=p.getInputElement();if(b){var c=p.type in{checkbox:1,ratio:1}&&CKEDITOR.env.ie&&CKEDITOR.env.version<8?"cke_dialog_ui_focused":"";b.on("focus",function(){a._.tabBarMode=false;a._.hasFocus=true;p.fire("focus");c&&this.addClass(c)});b.on("blur",function(){p.fire("blur");c&&this.removeClass(c)})}});CKEDITOR.tools.extend(this,b);this.keyboardFocusable&&(this.tabIndex=b.tabIndex|| +0,this.focusIndex=a._.focusList.push(this)-1,this.on("focus",function(){a._.currentFocusIndex=p.focusIndex}))}},hbox:function(a,b,c,e,d){if(!(4>arguments.length)){this._||(this._={});var g=this._.children=b,f=d&&d.widths||null,i=d&&d.height||null,l,k={role:"presentation"};d&&d.align&&(k.align=d.align);CKEDITOR.ui.dialog.uiElement.call(this,a,d||{type:"hbox"},e,"table",{},k,function(){var a=['<tbody><tr class="cke_dialog_ui_hbox">'];for(l=0;l<c.length;l++){var b="cke_dialog_ui_hbox_child",e=[];0=== +l&&(b="cke_dialog_ui_hbox_first");l==c.length-1&&(b="cke_dialog_ui_hbox_last");a.push('<td class="',b,'" role="presentation" ');f?f[l]&&e.push("width:"+r(f[l])):e.push("width:"+Math.floor(100/c.length)+"%");i&&e.push("height:"+r(i));d&&void 0!=d.padding&&e.push("padding:"+r(d.padding));CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&g[l].align)&&e.push("text-align:"+g[l].align);0<e.length&&a.push('style="'+e.join("; ")+'" ');a.push(">",c[l],"</td>")}a.push("</tr></tbody>");return a.join("")})}},vbox:function(a, +b,c,e,d){if(!(3>arguments.length)){this._||(this._={});var g=this._.children=b,f=d&&d.width||null,i=d&&d.heights||null;CKEDITOR.ui.dialog.uiElement.call(this,a,d||{type:"vbox"},e,"div",null,{role:"presentation"},function(){var b=['<table role="presentation" cellspacing="0" border="0" '];b.push('style="');d&&d.expand&&b.push("height:100%;");b.push("width:"+r(f||"100%"),";");CKEDITOR.env.webkit&&b.push("float:none;");b.push('"');b.push('align="',CKEDITOR.tools.htmlEncode(d&&d.align||("ltr"==a.getParentEditor().lang.dir? +"left":"right")),'" ');b.push("><tbody>");for(var e=0;e<c.length;e++){var h=[];b.push('<tr><td role="presentation" ');f&&h.push("width:"+r(f||"100%"));i?h.push("height:"+r(i[e])):d&&d.expand&&h.push("height:"+Math.floor(100/c.length)+"%");d&&void 0!=d.padding&&h.push("padding:"+r(d.padding));CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&g[e].align)&&h.push("text-align:"+g[e].align);0<h.length&&b.push('style="',h.join("; "),'" ');b.push(' class="cke_dialog_ui_vbox_child">',c[e],"</td></tr>")}b.push("</tbody></table>"); +return b.join("")})}}}})();CKEDITOR.ui.dialog.uiElement.prototype={getElement:function(){return CKEDITOR.document.getById(this.domId)},getInputElement:function(){return this.getElement()},getDialog:function(){return this._.dialog},setValue:function(a,b){this.getInputElement().setValue(a);!b&&this.fire("change",{value:a});return this},getValue:function(){return this.getInputElement().getValue()},isChanged:function(){return!1},selectParentTab:function(){for(var a=this.getInputElement();(a=a.getParent())&& +-1==a.$.className.search("cke_dialog_page_contents"););if(!a)return this;a=a.getAttribute("name");this._.dialog._.currentTabId!=a&&this._.dialog.selectPage(a);return this},focus:function(){this.selectParentTab().getInputElement().focus();return this},registerEvents:function(a){var b=/^on([A-Z]\w+)/,c,e=function(a,b,c,d){b.on("load",function(){a.getInputElement().on(c,d,a)})},d;for(d in a)if(c=d.match(b))this.eventProcessors[d]?this.eventProcessors[d].call(this,this._.dialog,a[d]):e(this,this._.dialog, +c[1].toLowerCase(),a[d]);return this},eventProcessors:{onLoad:function(a,b){a.on("load",b,this)},onShow:function(a,b){a.on("show",b,this)},onHide:function(a,b){a.on("hide",b,this)}},accessKeyDown:function(){this.focus()},accessKeyUp:function(){},disable:function(){var a=this.getElement();this.getInputElement().setAttribute("disabled","true");a.addClass("cke_disabled")},enable:function(){var a=this.getElement();this.getInputElement().removeAttribute("disabled");a.removeClass("cke_disabled")},isEnabled:function(){return!this.getElement().hasClass("cke_disabled")}, +isVisible:function(){return this.getInputElement().isVisible()},isFocusable:function(){return!this.isEnabled()||!this.isVisible()?!1:!0}};CKEDITOR.ui.dialog.hbox.prototype=CKEDITOR.tools.extend(new CKEDITOR.ui.dialog.uiElement,{getChild:function(a){if(1>arguments.length)return this._.children.concat();a.splice||(a=[a]);return 2>a.length?this._.children[a[0]]:this._.children[a[0]]&&this._.children[a[0]].getChild?this._.children[a[0]].getChild(a.slice(1,a.length)):null}},!0);CKEDITOR.ui.dialog.vbox.prototype= +new CKEDITOR.ui.dialog.hbox;(function(){var a={build:function(a,c,e){for(var d=c.children,g,f=[],i=[],l=0;l<d.length&&(g=d[l]);l++){var k=[];f.push(k);i.push(CKEDITOR.dialog._.uiElementBuilders[g.type].build(a,g,k))}return new CKEDITOR.ui.dialog[c.type](a,i,f,e,c)}};CKEDITOR.dialog.addUIElement("hbox",a);CKEDITOR.dialog.addUIElement("vbox",a)})();CKEDITOR.dialogCommand=function(a,b){this.dialogName=a;CKEDITOR.tools.extend(this,b,!0)};CKEDITOR.dialogCommand.prototype={exec:function(a){CKEDITOR.env.opera? +CKEDITOR.tools.setTimeout(function(){a.openDialog(this.dialogName)},0,this):a.openDialog(this.dialogName)},canUndo:!1,editorFocus:1};(function(){var a=/^([a]|[^a])+$/,b=/^\d*$/,c=/^\d*(?:\.\d+)?$/,e=/^(((\d*(\.\d+))|(\d*))(px|\%)?)?$/,d=/^(((\d*(\.\d+))|(\d*))(px|em|ex|in|cm|mm|pt|pc|\%)?)?$/i,g=/^(\s*[\w-]+\s*:\s*[^:;]+(?:;|$))*$/;CKEDITOR.VALIDATE_OR=1;CKEDITOR.VALIDATE_AND=2;CKEDITOR.dialog.validate={functions:function(){var a=arguments;return function(){var b=this&&this.getValue?this.getValue(): +a[0],c=void 0,d=CKEDITOR.VALIDATE_AND,e=[],g;for(g=0;g<a.length;g++)if("function"==typeof a[g])e.push(a[g]);else break;g<a.length&&"string"==typeof a[g]&&(c=a[g],g++);g<a.length&&"number"==typeof a[g]&&(d=a[g]);var j=d==CKEDITOR.VALIDATE_AND?!0:!1;for(g=0;g<e.length;g++)j=d==CKEDITOR.VALIDATE_AND?j&&e[g](b):j||e[g](b);return!j?c:!0}},regex:function(a,b){return function(c){c=this&&this.getValue?this.getValue():c;return!a.test(c)?b:!0}},notEmpty:function(b){return this.regex(a,b)},integer:function(a){return this.regex(b, +a)},number:function(a){return this.regex(c,a)},cssLength:function(a){return this.functions(function(a){return d.test(CKEDITOR.tools.trim(a))},a)},htmlLength:function(a){return this.functions(function(a){return e.test(CKEDITOR.tools.trim(a))},a)},inlineStyle:function(a){return this.functions(function(a){return g.test(CKEDITOR.tools.trim(a))},a)},equals:function(a,b){return this.functions(function(b){return b==a},b)},notEqual:function(a,b){return this.functions(function(b){return b!=a},b)}};CKEDITOR.on("instanceDestroyed", +function(a){if(CKEDITOR.tools.isEmpty(CKEDITOR.instances)){for(var b;b=CKEDITOR.dialog._.currentTop;)b.hide();for(var c in w)w[c].remove();w={}}var a=a.editor._.storedDialogs,d;for(d in a)a[d].destroy()})})();CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{openDialog:function(a,b){var c=null,e=CKEDITOR.dialog._.dialogDefinitions[a];null===CKEDITOR.dialog._.currentTop&&J(this);if("function"==typeof e)c=this._.storedDialogs||(this._.storedDialogs={}),c=c[a]||(c[a]=new CKEDITOR.dialog(this,a)),b&&b.call(c, +c),c.show();else{if("failed"==e)throw K(this),Error('[CKEDITOR.dialog.openDialog] Dialog "'+a+'" failed when loading definition.');"string"==typeof e&&CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(e),function(){"function"!=typeof CKEDITOR.dialog._.dialogDefinitions[a]&&(CKEDITOR.dialog._.dialogDefinitions[a]="failed");this.openDialog(a,b)},this,0,1)}CKEDITOR.skin.loadPart("dialog");return c}})})(); +CKEDITOR.plugins.add("dialog",{requires:"dialogui",init:function(t){t.on("doubleclick",function(u){u.data.dialog&&t.openDialog(u.data.dialog)},null,null,999)}});CKEDITOR.plugins.add("about",{requires:"dialog",init:function(a){var b=a.addCommand("about",new CKEDITOR.dialogCommand("about"));b.modes={wysiwyg:1,source:1};b.canUndo=!1;b.readOnly=1;a.ui.addButton&&a.ui.addButton("About",{label:a.lang.about.title,command:"about",toolbar:"about"});CKEDITOR.dialog.add("about",this.path+"dialogs/about.js")}});(function(){CKEDITOR.plugins.add("a11yhelp",{requires:"dialog",availableLangs:{ar:1,bg:1,ca:1,cs:1,cy:1,da:1,de:1,el:1,en:1,eo:1,es:1,et:1,fa:1,fi:1,fr:1,"fr-ca":1,gl:1,gu:1,he:1,hi:1,hr:1,hu:1,id:1,it:1,ja:1,km:1,ko:1,ku:1,lt:1,lv:1,mk:1,mn:1,nb:1,nl:1,no:1,pl:1,pt:1,"pt-br":1,ro:1,ru:1,si:1,sk:1,sl:1,sq:1,sr:1,"sr-latn":1,sv:1,th:1,tr:1,ug:1,uk:1,vi:1,zh:1,"zh-cn":1},init:function(b){var c=this;b.addCommand("a11yHelp",{exec:function(){var a=b.langCode,a=c.availableLangs[a]?a:c.availableLangs[a.replace(/-.*/, +"")]?a.replace(/-.*/,""):"en";CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(c.path+"dialogs/lang/"+a+".js"),function(){b.lang.a11yhelp=c.langEntries[a];b.openDialog("a11yHelp")})},modes:{wysiwyg:1,source:1},readOnly:1,canUndo:!1});b.setKeystroke(CKEDITOR.ALT+48,"a11yHelp");CKEDITOR.dialog.add("a11yHelp",this.path+"dialogs/a11yhelp.js")}})})();CKEDITOR.plugins.add("basicstyles",{init:function(c){var e=0,d=function(g,d,b,a){if(a){var a=new CKEDITOR.style(a),f=h[b];f.unshift(a);c.attachStyleStateChange(a,function(a){!c.readOnly&&c.getCommand(b).setState(a)});c.addCommand(b,new CKEDITOR.styleCommand(a,{contentForms:f}));c.ui.addButton&&c.ui.addButton(g,{label:d,command:b,toolbar:"basicstyles,"+(e+=10)})}},h={bold:["strong","b",["span",function(a){a=a.styles["font-weight"];return"bold"==a||700<=+a}]],italic:["em","i",["span",function(a){return"italic"== +a.styles["font-style"]}]],underline:["u",["span",function(a){return"underline"==a.styles["text-decoration"]}]],strike:["s","strike",["span",function(a){return"line-through"==a.styles["text-decoration"]}]],subscript:["sub"],superscript:["sup"]},b=c.config,a=c.lang.basicstyles;d("Bold",a.bold,"bold",b.coreStyles_bold);d("Italic",a.italic,"italic",b.coreStyles_italic);d("Underline",a.underline,"underline",b.coreStyles_underline);d("Strike",a.strike,"strike",b.coreStyles_strike);d("Subscript",a.subscript, +"subscript",b.coreStyles_subscript);d("Superscript",a.superscript,"superscript",b.coreStyles_superscript);c.setKeystroke([[CKEDITOR.CTRL+66,"bold"],[CKEDITOR.CTRL+73,"italic"],[CKEDITOR.CTRL+85,"underline"]])}});CKEDITOR.config.coreStyles_bold={element:"strong",overrides:"b"};CKEDITOR.config.coreStyles_italic={element:"em",overrides:"i"};CKEDITOR.config.coreStyles_underline={element:"u"};CKEDITOR.config.coreStyles_strike={element:"s",overrides:"strike"};CKEDITOR.config.coreStyles_subscript={element:"sub"}; +CKEDITOR.config.coreStyles_superscript={element:"sup"};(function(){var k={exec:function(g){var a=g.getCommand("blockquote").state,i=g.getSelection(),c=i&&i.getRanges()[0];if(c){var h=i.createBookmarks();if(CKEDITOR.env.ie){var e=h[0].startNode,b=h[0].endNode,d;if(e&&"blockquote"==e.getParent().getName())for(d=e;d=d.getNext();)if(d.type==CKEDITOR.NODE_ELEMENT&&d.isBlockBoundary()){e.move(d,!0);break}if(b&&"blockquote"==b.getParent().getName())for(d=b;d=d.getPrevious();)if(d.type==CKEDITOR.NODE_ELEMENT&&d.isBlockBoundary()){b.move(d);break}}var f=c.createIterator(); +f.enlargeBr=g.config.enterMode!=CKEDITOR.ENTER_BR;if(a==CKEDITOR.TRISTATE_OFF){for(e=[];a=f.getNextParagraph();)e.push(a);1>e.length&&(a=g.document.createElement(g.config.enterMode==CKEDITOR.ENTER_P?"p":"div"),b=h.shift(),c.insertNode(a),a.append(new CKEDITOR.dom.text("",g.document)),c.moveToBookmark(b),c.selectNodeContents(a),c.collapse(!0),b=c.createBookmark(),e.push(a),h.unshift(b));d=e[0].getParent();c=[];for(b=0;b<e.length;b++)a=e[b],d=d.getCommonAncestor(a.getParent());for(a={table:1,tbody:1, +tr:1,ol:1,ul:1};a[d.getName()];)d=d.getParent();for(b=null;0<e.length;){for(a=e.shift();!a.getParent().equals(d);)a=a.getParent();a.equals(b)||c.push(a);b=a}for(;0<c.length;)if(a=c.shift(),"blockquote"==a.getName()){for(b=new CKEDITOR.dom.documentFragment(g.document);a.getFirst();)b.append(a.getFirst().remove()),e.push(b.getLast());b.replace(a)}else e.push(a);c=g.document.createElement("blockquote");for(c.insertBefore(e[0]);0<e.length;)a=e.shift(),c.append(a)}else if(a==CKEDITOR.TRISTATE_ON){b=[]; +for(d={};a=f.getNextParagraph();){for(e=c=null;a.getParent();){if("blockquote"==a.getParent().getName()){c=a.getParent();e=a;break}a=a.getParent()}c&&(e&&!e.getCustomData("blockquote_moveout"))&&(b.push(e),CKEDITOR.dom.element.setMarker(d,e,"blockquote_moveout",!0))}CKEDITOR.dom.element.clearAllMarkers(d);a=[];e=[];for(d={};0<b.length;)f=b.shift(),c=f.getParent(),f.getPrevious()?f.getNext()?(f.breakParent(f.getParent()),e.push(f.getNext())):f.remove().insertAfter(c):f.remove().insertBefore(c),c.getCustomData("blockquote_processed")|| +(e.push(c),CKEDITOR.dom.element.setMarker(d,c,"blockquote_processed",!0)),a.push(f);CKEDITOR.dom.element.clearAllMarkers(d);for(b=e.length-1;0<=b;b--){c=e[b];a:{d=c;for(var f=0,k=d.getChildCount(),j=void 0;f<k&&(j=d.getChild(f));f++)if(j.type==CKEDITOR.NODE_ELEMENT&&j.isBlockBoundary()){d=!1;break a}d=!0}d&&c.remove()}if(g.config.enterMode==CKEDITOR.ENTER_BR)for(c=!0;a.length;)if(f=a.shift(),"div"==f.getName()){b=new CKEDITOR.dom.documentFragment(g.document);c&&(f.getPrevious()&&!(f.getPrevious().type== +CKEDITOR.NODE_ELEMENT&&f.getPrevious().isBlockBoundary()))&&b.append(g.document.createElement("br"));for(c=f.getNext()&&!(f.getNext().type==CKEDITOR.NODE_ELEMENT&&f.getNext().isBlockBoundary());f.getFirst();)f.getFirst().remove().appendTo(b);c&&b.append(g.document.createElement("br"));b.replace(f);c=!1}}i.selectBookmarks(h);g.focus()}},refresh:function(g,a){this.setState(g.elementPath(a.block||a.blockLimit).contains("blockquote",1)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)},context:"blockquote", +allowedContent:"blockquote",requiredContent:"blockquote"};CKEDITOR.plugins.add("blockquote",{init:function(g){g.blockless||(g.addCommand("blockquote",k),g.ui.addButton&&g.ui.addButton("Blockquote",{label:g.lang.blockquote.toolbar,command:"blockquote",toolbar:"blocks,10"}))}})})();(function(){function w(b){function a(){var e=b.editable();e.on(q,function(b){(!CKEDITOR.env.ie||!n)&&u(b)});CKEDITOR.env.ie&&e.on("paste",function(e){r||(f(),e.data.preventDefault(),u(e),l("paste")||b.openDialog("paste"))});CKEDITOR.env.ie&&(e.on("contextmenu",h,null,null,0),e.on("beforepaste",function(b){b.data&&!b.data.$.ctrlKey&&h()},null,null,0));e.on("beforecut",function(){!n&&i(b)});var a;e.attachListener(CKEDITOR.env.ie?e:b.document.getDocumentElement(),"mouseup",function(){a=setTimeout(function(){s()}, +0)});b.on("destroy",function(){clearTimeout(a)});e.on("keyup",s)}function c(e){return{type:e,canUndo:"cut"==e,startDisabled:!0,exec:function(){"cut"==this.type&&i();var e;var a=this.type;if(CKEDITOR.env.ie)e=l(a);else try{e=b.document.$.execCommand(a,!1,null)}catch(d){e=!1}e||alert(b.lang.clipboard[this.type+"Error"]);return e}}}function d(){return{canUndo:!1,async:!0,exec:function(b,a){var d=function(a,d){a&&g(a.type,a.dataValue,!!d);b.fire("afterCommandExec",{name:"paste",command:c,returnValue:!!a})}, +c=this;"string"==typeof a?d({type:"auto",dataValue:a},1):b.getClipboardData(d)}}}function f(){r=1;setTimeout(function(){r=0},100)}function h(){n=1;setTimeout(function(){n=0},10)}function l(e){var a=b.document,d=a.getBody(),c=!1,i=function(){c=!0};d.on(e,i);(7<CKEDITOR.env.version?a.$:a.$.selection.createRange()).execCommand(e);d.removeListener(e,i);return c}function g(e,a,d){e={type:e};if(d&&!b.fire("beforePaste",e)||!a)return!1;e.dataValue=a;return b.fire("paste",e)}function i(){if(CKEDITOR.env.ie&& +!CKEDITOR.env.quirks){var e=b.getSelection(),a,d,c;if(e.getType()==CKEDITOR.SELECTION_ELEMENT&&(a=e.getSelectedElement()))d=e.getRanges()[0],c=b.document.createText(""),c.insertBefore(a),d.setStartBefore(c),d.setEndAfter(a),e.selectRanges([d]),setTimeout(function(){a.getParent()&&(c.remove(),e.selectElement(a))},0)}}function k(a,d){var c=b.document,i=b.editable(),k=function(b){b.cancel()},f=CKEDITOR.env.gecko&&10902>=CKEDITOR.env.version,h;if(!c.getById("cke_pastebin")){var o=b.getSelection(),v=o.createBookmarks(), +j=new CKEDITOR.dom.element((CKEDITOR.env.webkit||i.is("body"))&&!CKEDITOR.env.ie&&!CKEDITOR.env.opera?"body":"div",c);j.setAttributes({id:"cke_pastebin","data-cke-temp":"1"});CKEDITOR.env.opera&&j.appendBogus();var g=0,c=c.getWindow();f?(j.insertAfter(v[0].startNode),j.setStyle("display","inline")):(CKEDITOR.env.webkit?(i.append(j),j.addClass("cke_editable"),i.is("body")||(f="static"!=i.getComputedStyle("position")?i:CKEDITOR.dom.element.get(i.$.offsetParent),g=f.getDocumentPosition().y)):i.getAscendant(CKEDITOR.env.ie|| +CKEDITOR.env.opera?"body":"html",1).append(j),j.setStyles({position:"absolute",top:c.getScrollPosition().y-g+10+"px",width:"1px",height:Math.max(1,c.getViewPaneSize().height-20)+"px",overflow:"hidden",margin:0,padding:0}));(f=j.getParent().isReadOnly())?(j.setOpacity(0),j.setAttribute("contenteditable",!0)):j.setStyle("ltr"==b.config.contentsLangDirection?"left":"right","-1000px");b.on("selectionChange",k,null,null,0);CKEDITOR.env.webkit&&(h=i.once("blur",k,null,null,-100));f&&j.focus();f=new CKEDITOR.dom.range(j); +f.selectNodeContents(j);var l=f.select();CKEDITOR.env.ie&&(h=i.once("blur",function(){b.lockSelection(l)}));var m=CKEDITOR.document.getWindow().getScrollPosition().y;setTimeout(function(){if(CKEDITOR.env.webkit||CKEDITOR.env.opera)CKEDITOR.document[CKEDITOR.env.webkit?"getBody":"getDocumentElement"]().$.scrollTop=m;h&&h.removeListener();CKEDITOR.env.ie&&i.focus();o.selectBookmarks(v);j.remove();var a;if(CKEDITOR.env.webkit&&(a=j.getFirst())&&a.is&&a.hasClass("Apple-style-span"))j=a;b.removeListener("selectionChange", +k);d(j.getHtml())},0)}}function o(){if(CKEDITOR.env.ie){b.focus();f();var a=b.focusManager;a.lock();if(b.editable().fire(q)&&!l("paste"))return a.unlock(),!1;a.unlock()}else try{if(b.editable().fire(q)&&!b.document.$.execCommand("Paste",!1,null))throw 0;}catch(d){return!1}return!0}function p(a){if("wysiwyg"==b.mode)switch(a.data.keyCode){case CKEDITOR.CTRL+86:case CKEDITOR.SHIFT+45:a=b.editable();f();!CKEDITOR.env.ie&&a.fire("beforepaste");(CKEDITOR.env.opera||CKEDITOR.env.gecko&&10900>CKEDITOR.env.version)&& +a.fire("paste");break;case CKEDITOR.CTRL+88:case CKEDITOR.SHIFT+46:b.fire("saveSnapshot"),setTimeout(function(){b.fire("saveSnapshot")},0)}}function u(a){var d={type:"auto"},c=b.fire("beforePaste",d);k(a,function(b){b=b.replace(/<span[^>]+data-cke-bookmark[^<]*?<\/span>/ig,"");c&&g(d.type,b,0,1)})}function s(){if("wysiwyg"==b.mode){var a=m("paste");b.getCommand("cut").setState(m("cut"));b.getCommand("copy").setState(m("copy"));b.getCommand("paste").setState(a);b.fire("pasteState",a)}}function m(a){if(t&& +a in{paste:1,cut:1})return CKEDITOR.TRISTATE_DISABLED;if("paste"==a)return CKEDITOR.TRISTATE_OFF;var a=b.getSelection(),d=a.getRanges();return a.getType()==CKEDITOR.SELECTION_NONE||1==d.length&&d[0].collapsed?CKEDITOR.TRISTATE_DISABLED:CKEDITOR.TRISTATE_OFF}var n=0,r=0,t=0,q=CKEDITOR.env.ie?"beforepaste":"paste";(function(){b.on("key",p);b.on("contentDom",a);b.on("selectionChange",function(a){t=a.data.selection.getRanges()[0].checkReadOnly();s()});b.contextMenu&&b.contextMenu.addListener(function(a, +b){t=b.getRanges()[0].checkReadOnly();return{cut:m("cut"),copy:m("copy"),paste:m("paste")}})})();(function(){function a(d,c,i,e,f){var k=b.lang.clipboard[c];b.addCommand(c,i);b.ui.addButton&&b.ui.addButton(d,{label:k,command:c,toolbar:"clipboard,"+e});b.addMenuItems&&b.addMenuItem(c,{label:k,command:c,group:"clipboard",order:f})}a("Cut","cut",c("cut"),10,1);a("Copy","copy",c("copy"),20,4);a("Paste","paste",d(),30,8)})();b.getClipboardData=function(a,d){function c(a){a.removeListener();a.cancel(); +d(a.data)}function i(a){a.removeListener();a.cancel();g=!0;d({type:h,dataValue:a.data})}function f(){this.customTitle=a&&a.title}var k=!1,h="auto",g=!1;d||(d=a,a=null);b.on("paste",c,null,null,0);b.on("beforePaste",function(a){a.removeListener();k=true;h=a.data.type},null,null,1E3);!1===o()&&(b.removeListener("paste",c),k&&b.fire("pasteDialog",f)?(b.on("pasteDialogCommit",i),b.on("dialogHide",function(a){a.removeListener();a.data.removeListener("pasteDialogCommit",i);setTimeout(function(){g||d(null)}, +10)})):d(null))}}function x(b){if(CKEDITOR.env.webkit){if(!b.match(/^[^<]*$/g)&&!b.match(/^(<div><br( ?\/)?><\/div>|<div>[^<]*<\/div>)*$/gi))return"html"}else if(CKEDITOR.env.ie){if(!b.match(/^([^<]|<br( ?\/)?>)*$/gi)&&!b.match(/^(<p>([^<]|<br( ?\/)?>)*<\/p>|(\r\n))*$/gi))return"html"}else if(CKEDITOR.env.gecko||CKEDITOR.env.opera){if(!b.match(/^([^<]|<br( ?\/)?>)*$/gi))return"html"}else return"html";return"htmlifiedtext"}function y(b,a){function c(a){return CKEDITOR.tools.repeat("</p><p>",~~(a/2))+ +(1==a%2?"<br>":"")}a=a.replace(/\s+/g," ").replace(/> +</g,"><").replace(/<br ?\/>/gi,"<br>");a=a.replace(/<\/?[A-Z]+>/g,function(a){return a.toLowerCase()});if(a.match(/^[^<]$/))return a;CKEDITOR.env.webkit&&-1<a.indexOf("<div>")&&(a=a.replace(/^(<div>(<br>|)<\/div>)(?!$|(<div>(<br>|)<\/div>))/g,"<br>").replace(/^(<div>(<br>|)<\/div>){2}(?!$)/g,"<div></div>"),a.match(/<div>(<br>|)<\/div>/)&&(a="<p>"+a.replace(/(<div>(<br>|)<\/div>)+/g,function(a){return c(a.split("</div><div>").length+1)})+"</p>"), +a=a.replace(/<\/div><div>/g,"<br>"),a=a.replace(/<\/?div>/g,""));if((CKEDITOR.env.gecko||CKEDITOR.env.opera)&&b.enterMode!=CKEDITOR.ENTER_BR)CKEDITOR.env.gecko&&(a=a.replace(/^<br><br>$/,"<br>")),-1<a.indexOf("<br><br>")&&(a="<p>"+a.replace(/(<br>){2,}/g,function(a){return c(a.length/4)})+"</p>");return p(b,a)}function z(){var b=new CKEDITOR.htmlParser.filter,a={blockquote:1,dl:1,fieldset:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,ol:1,p:1,table:1,ul:1},c=CKEDITOR.tools.extend({br:0},CKEDITOR.dtd.$inline),d= +{p:1,br:1,"cke:br":1},f=CKEDITOR.dtd,h=CKEDITOR.tools.extend({area:1,basefont:1,embed:1,iframe:1,map:1,object:1,param:1},CKEDITOR.dtd.$nonBodyContent,CKEDITOR.dtd.$cdata),l=function(a){delete a.name;a.add(new CKEDITOR.htmlParser.text(" "))},g=function(a){for(var b=a,c;(b=b.next)&&b.name&&b.name.match(/^h\d$/);){c=new CKEDITOR.htmlParser.element("cke:br");c.isEmpty=!0;for(a.add(c);c=b.children.shift();)a.add(c)}};b.addRules({elements:{h1:g,h2:g,h3:g,h4:g,h5:g,h6:g,img:function(a){var a=CKEDITOR.tools.trim(a.attributes.alt|| +""),b=" ";a&&!a.match(/(^http|\.(jpe?g|gif|png))/i)&&(b=" ["+a+"] ");return new CKEDITOR.htmlParser.text(b)},td:l,th:l,$:function(b){var k=b.name,g;if(h[k])return!1;b.attributes=[];if("br"==k)return b;if(a[k])b.name="p";else if(c[k])delete b.name;else if(f[k]){g=new CKEDITOR.htmlParser.element("cke:br");g.isEmpty=!0;if(CKEDITOR.dtd.$empty[k])return g;b.add(g,0);g=g.clone();g.isEmpty=!0;b.add(g);delete b.name}d[b.name]||delete b.name;return b}}},{applyToAll:!0});return b}function A(b,a,c){var a=new CKEDITOR.htmlParser.fragment.fromHtml(a), +d=new CKEDITOR.htmlParser.basicWriter;a.writeHtml(d,c);var a=d.getHtml(),a=a.replace(/\s*(<\/?[a-z:]+ ?\/?>)\s*/g,"$1").replace(/(<cke:br \/>){2,}/g,"<cke:br />").replace(/(<cke:br \/>)(<\/?p>|<br \/>)/g,"$2").replace(/(<\/?p>|<br \/>)(<cke:br \/>)/g,"$1").replace(/<(cke:)?br( \/)?>/g,"<br>").replace(/<p><\/p>/g,""),f=0,a=a.replace(/<\/?p>/g,function(a){if("<p>"==a){if(1<++f)return"</p><p>"}else if(0<--f)return"</p><p>";return a}).replace(/<p><\/p>/g,"");return p(b,a)}function p(b,a){b.enterMode== +CKEDITOR.ENTER_BR?a=a.replace(/(<\/p><p>)+/g,function(a){return CKEDITOR.tools.repeat("<br>",2*(a.length/7))}).replace(/<\/?p>/g,""):b.enterMode==CKEDITOR.ENTER_DIV&&(a=a.replace(/<(\/)?p>/g,"<$1div>"));return a}CKEDITOR.plugins.add("clipboard",{requires:"dialog",init:function(b){var a;w(b);CKEDITOR.dialog.add("paste",CKEDITOR.getUrl(this.path+"dialogs/paste.js"));b.on("paste",function(a){var b=a.data.dataValue,f=CKEDITOR.dtd.$block;-1<b.indexOf("Apple-")&&(b=b.replace(/<span class="Apple-converted-space">&nbsp;<\/span>/gi, +" "),"html"!=a.data.type&&(b=b.replace(/<span class="Apple-tab-span"[^>]*>([^<]*)<\/span>/gi,function(a,b){return b.replace(/\t/g,"&nbsp;&nbsp; &nbsp;")})),-1<b.indexOf('<br class="Apple-interchange-newline">')&&(a.data.startsWithEOL=1,a.data.preSniffing="html",b=b.replace(/<br class="Apple-interchange-newline">/,"")),b=b.replace(/(<[^>]+) class="Apple-[^"]*"/gi,"$1"));if(b.match(/^<[^<]+cke_(editable|contents)/i)){var h,l,g=new CKEDITOR.dom.element("div");for(g.setHtml(b);1==g.getChildCount()&&(h= +g.getFirst())&&h.type==CKEDITOR.NODE_ELEMENT&&(h.hasClass("cke_editable")||h.hasClass("cke_contents"));)g=l=h;l&&(b=l.getHtml().replace(/<br>$/i,""))}CKEDITOR.env.ie?b=b.replace(/^&nbsp;(?: |\r\n)?<(\w+)/g,function(b,d){if(d.toLowerCase()in f){a.data.preSniffing="html";return"<"+d}return b}):CKEDITOR.env.webkit?b=b.replace(/<\/(\w+)><div><br><\/div>$/,function(b,d){if(d in f){a.data.endsWithEOL=1;return"</"+d+">"}return b}):CKEDITOR.env.gecko&&(b=b.replace(/(\s)<br>$/,"$1"));a.data.dataValue=b},null, +null,3);b.on("paste",function(c){var c=c.data,d=c.type,f=c.dataValue,h,l=b.config.clipboard_defaultContentType||"html";h="html"==d||"html"==c.preSniffing?"html":x(f);"htmlifiedtext"==h?f=y(b.config,f):"text"==d&&"html"==h&&(f=A(b.config,f,a||(a=z(b))));c.startsWithEOL&&(f='<br data-cke-eol="1">'+f);c.endsWithEOL&&(f+='<br data-cke-eol="1">');"auto"==d&&(d="html"==h||"html"==l?"html":"text");c.type=d;c.dataValue=f;delete c.preSniffing;delete c.startsWithEOL;delete c.endsWithEOL},null,null,6);b.on("paste", +function(a){a=a.data;b.insertHtml(a.dataValue,a.type);setTimeout(function(){b.fire("afterPaste")},0)},null,null,1E3);b.on("pasteDialog",function(a){setTimeout(function(){b.openDialog("paste",a.data)},0)})}})})();(function(){CKEDITOR.plugins.add("panel",{beforeInit:function(a){a.ui.addHandler(CKEDITOR.UI_PANEL,CKEDITOR.ui.panel.handler)}});CKEDITOR.UI_PANEL="panel";CKEDITOR.ui.panel=function(a,b){b&&CKEDITOR.tools.extend(this,b);CKEDITOR.tools.extend(this,{className:"",css:[]});this.id=CKEDITOR.tools.getNextId();this.document=a;this.isFramed=this.forceIFrame||this.css.length;this._={blocks:{}}};CKEDITOR.ui.panel.handler={create:function(a){return new CKEDITOR.ui.panel(a)}};var f=CKEDITOR.addTemplate("panel", +'<div lang="{langCode}" id="{id}" dir={dir} class="cke cke_reset_all {editorId} cke_panel cke_panel {cls} cke_{dir}" style="z-index:{z-index}" role="presentation">{frame}</div>'),g=CKEDITOR.addTemplate("panel-frame",'<iframe id="{id}" class="cke_panel_frame" role="presentation" frameborder="0" src="{src}"></iframe>'),h=CKEDITOR.addTemplate("panel-frame-inner",'<!DOCTYPE html><html class="cke_panel_container {env}" dir="{dir}" lang="{langCode}"><head>{css}</head><body class="cke_{dir}" style="margin:0;padding:0" onload="{onload}"></body></html>'); +CKEDITOR.ui.panel.prototype={render:function(a,b){this.getHolderElement=function(){var a=this._.holder;if(!a){if(this.isFramed){var a=this.document.getById(this.id+"_frame"),b=a.getParent(),a=a.getFrameDocument();CKEDITOR.env.iOS&&b.setStyles({overflow:"scroll","-webkit-overflow-scrolling":"touch"});b=CKEDITOR.tools.addFunction(CKEDITOR.tools.bind(function(){this.isLoaded=!0;if(this.onLoad)this.onLoad()},this));a.write(h.output(CKEDITOR.tools.extend({css:CKEDITOR.tools.buildStyleHtml(this.css),onload:"window.parent.CKEDITOR.tools.callFunction("+ +b+");"},d)));a.getWindow().$.CKEDITOR=CKEDITOR;a.on("key"+(CKEDITOR.env.opera?"press":"down"),function(a){var b=a.data.getKeystroke(),c=this.document.getById(this.id).getAttribute("dir");this._.onKeyDown&&!1===this._.onKeyDown(b)?a.data.preventDefault():(27==b||b==("rtl"==c?39:37))&&this.onEscape&&!1===this.onEscape(b)&&a.data.preventDefault()},this);a=a.getBody();a.unselectable();CKEDITOR.env.air&&CKEDITOR.tools.callFunction(b)}else a=this.document.getById(this.id);this._.holder=a}return a};var d= +{editorId:a.id,id:this.id,langCode:a.langCode,dir:a.lang.dir,cls:this.className,frame:"",env:CKEDITOR.env.cssClass,"z-index":a.config.baseFloatZIndex+1};if(this.isFramed){var e=CKEDITOR.env.air?"javascript:void(0)":CKEDITOR.env.ie?"javascript:void(function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+"}())":"";d.frame=g.output({id:this.id+"_frame",src:e})}e=f.output(d);b&&b.push(e);return e},addBlock:function(a,b){b=this._.blocks[a]=b instanceof CKEDITOR.ui.panel.block? +b:new CKEDITOR.ui.panel.block(this.getHolderElement(),b);this._.currentBlock||this.showBlock(a);return b},getBlock:function(a){return this._.blocks[a]},showBlock:function(a){var a=this._.blocks[a],b=this._.currentBlock,d=!this.forceIFrame||CKEDITOR.env.ie?this._.holder:this.document.getById(this.id+"_frame");b&&b.hide();this._.currentBlock=a;CKEDITOR.fire("ariaWidget",d);a._.focusIndex=-1;this._.onKeyDown=a.onKeyDown&&CKEDITOR.tools.bind(a.onKeyDown,a);a.show();return a},destroy:function(){this.element&& +this.element.remove()}};CKEDITOR.ui.panel.block=CKEDITOR.tools.createClass({$:function(a,b){this.element=a.append(a.getDocument().createElement("div",{attributes:{tabindex:-1,"class":"cke_panel_block"},styles:{display:"none"}}));b&&CKEDITOR.tools.extend(this,b);this.element.setAttributes({role:this.attributes.role||"presentation","aria-label":this.attributes["aria-label"],title:this.attributes.title||this.attributes["aria-label"]});this.keys={};this._.focusIndex=-1;this.element.disableContextMenu()}, +_:{markItem:function(a){-1!=a&&(a=this.element.getElementsByTag("a").getItem(this._.focusIndex=a),(CKEDITOR.env.webkit||CKEDITOR.env.opera)&&a.getDocument().getWindow().focus(),a.focus(),this.onMark&&this.onMark(a))}},proto:{show:function(){this.element.setStyle("display","")},hide:function(){(!this.onHide||!0!==this.onHide.call(this))&&this.element.setStyle("display","none")},onKeyDown:function(a,b){var d=this.keys[a];switch(d){case "next":for(var e=this._.focusIndex,d=this.element.getElementsByTag("a"), +c;c=d.getItem(++e);)if(c.getAttribute("_cke_focus")&&c.$.offsetWidth){this._.focusIndex=e;c.focus();break}return!c&&!b?(this._.focusIndex=-1,this.onKeyDown(a,1)):!1;case "prev":e=this._.focusIndex;for(d=this.element.getElementsByTag("a");0<e&&(c=d.getItem(--e));){if(c.getAttribute("_cke_focus")&&c.$.offsetWidth){this._.focusIndex=e;c.focus();break}c=null}return!c&&!b?(this._.focusIndex=d.count(),this.onKeyDown(a,1)):!1;case "click":case "mouseup":return e=this._.focusIndex,(c=0<=e&&this.element.getElementsByTag("a").getItem(e))&& +(c.$[d]?c.$[d]():c.$["on"+d]()),!1}return!0}}})})();CKEDITOR.plugins.add("floatpanel",{requires:"panel"}); +(function(){function q(a,b,c,i,f){var f=CKEDITOR.tools.genKey(b.getUniqueId(),c.getUniqueId(),a.lang.dir,a.uiColor||"",i.css||"",f||""),h=g[f];h||(h=g[f]=new CKEDITOR.ui.panel(b,i),h.element=c.append(CKEDITOR.dom.element.createFromHtml(h.render(a),b)),h.element.setStyles({display:"none",position:"absolute"}));return h}var g={};CKEDITOR.ui.floatPanel=CKEDITOR.tools.createClass({$:function(a,b,c,i){function f(){d.hide()}c.forceIFrame=1;c.toolbarRelated&&a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE&& +(b=CKEDITOR.document.getById("cke_"+a.name));var h=b.getDocument(),i=q(a,h,b,c,i||0),j=i.element,l=j.getFirst(),d=this;j.disableContextMenu();this.element=j;this._={editor:a,panel:i,parentElement:b,definition:c,document:h,iframe:l,children:[],dir:a.lang.dir};a.on("mode",f);a.on("resize",f);h.getWindow().on("resize",f)},proto:{addBlock:function(a,b){return this._.panel.addBlock(a,b)},addListBlock:function(a,b){return this._.panel.addListBlock(a,b)},getBlock:function(a){return this._.panel.getBlock(a)}, +showBlock:function(a,b,c,i,f,h){var j=this._.panel,l=j.showBlock(a);this.allowBlur(!1);a=this._.editor.editable();this._.returnFocus=a.hasFocus?a:new CKEDITOR.dom.element(CKEDITOR.document.$.activeElement);var d=this.element,a=this._.iframe,a=CKEDITOR.env.ie?a:new CKEDITOR.dom.window(a.$.contentWindow),g=d.getDocument(),o=this._.parentElement.getPositionedAncestor(),p=b.getDocumentPosition(g),g=o?o.getDocumentPosition(g):{x:0,y:0},m="rtl"==this._.dir,e=p.x+(i||0)-g.x,k=p.y+(f||0)-g.y;if(m&&(1==c|| +4==c))e+=b.$.offsetWidth;else if(!m&&(2==c||3==c))e+=b.$.offsetWidth-1;if(3==c||4==c)k+=b.$.offsetHeight-1;this._.panel._.offsetParentId=b.getId();d.setStyles({top:k+"px",left:0,display:""});d.setOpacity(0);d.getFirst().removeStyle("width");this._.editor.focusManager.add(a);this._.blurSet||(CKEDITOR.event.useCapture=!0,a.on("blur",function(a){this.allowBlur()&&a.data.getPhase()==CKEDITOR.EVENT_PHASE_AT_TARGET&&(this.visible&&!this._.activeChild)&&(delete this._.returnFocus,this.hide())},this),a.on("focus", +function(){this._.focused=!0;this.hideChild();this.allowBlur(!0)},this),CKEDITOR.event.useCapture=!1,this._.blurSet=1);j.onEscape=CKEDITOR.tools.bind(function(a){if(this.onEscape&&this.onEscape(a)===false)return false},this);CKEDITOR.tools.setTimeout(function(){var a=CKEDITOR.tools.bind(function(){d.removeStyle("width");if(l.autoSize){var a=l.element.getDocument(),a=(CKEDITOR.env.webkit?l.element:a.getBody()).$.scrollWidth;CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&a>0)&&(a=a+((d.$.offsetWidth||0)-(d.$.clientWidth|| +0)+3));d.setStyle("width",a+10+"px");a=l.element.$.scrollHeight;CKEDITOR.env.ie&&(CKEDITOR.env.quirks&&a>0)&&(a=a+((d.$.offsetHeight||0)-(d.$.clientHeight||0)+3));d.setStyle("height",a+"px");j._.currentBlock.element.setStyle("display","none").removeStyle("display")}else d.removeStyle("height");m&&(e=e-d.$.offsetWidth);d.setStyle("left",e+"px");var b=j.element.getWindow(),a=d.$.getBoundingClientRect(),b=b.getViewPaneSize(),c=a.width||a.right-a.left,f=a.height||a.bottom-a.top,i=m?a.right:b.width-a.left, +g=m?b.width-a.right:a.left;m?i<c&&(e=g>c?e+c:b.width>c?e-a.left:e-a.right+b.width):i<c&&(e=g>c?e-c:b.width>c?e-a.right+b.width:e-a.left);c=a.top;b.height-a.top<f&&(k=c>f?k-f:b.height>f?k-a.bottom+b.height:k-a.top);if(CKEDITOR.env.ie){b=a=new CKEDITOR.dom.element(d.$.offsetParent);b.getName()=="html"&&(b=b.getDocument().getBody());b.getComputedStyle("direction")=="rtl"&&(e=CKEDITOR.env.ie8Compat?e-d.getDocument().getDocumentElement().$.scrollLeft*2:e-(a.$.scrollWidth-a.$.clientWidth))}var a=d.getFirst(), +n;(n=a.getCustomData("activePanel"))&&n.onHide&&n.onHide.call(this,1);a.setCustomData("activePanel",this);d.setStyles({top:k+"px",left:e+"px"});d.setOpacity(1);h&&h()},this);j.isLoaded?a():j.onLoad=a;CKEDITOR.tools.setTimeout(function(){var a=CKEDITOR.env.webkit&&CKEDITOR.document.getWindow().getScrollPosition().y;this.focus();l.element.focus();if(CKEDITOR.env.webkit)CKEDITOR.document.getBody().$.scrollTop=a;this.allowBlur(true);this._.editor.fire("panelShow",this)},0,this)},CKEDITOR.env.air?200: +0,this);this.visible=1;this.onShow&&this.onShow.call(this)},focus:function(){if(CKEDITOR.env.webkit){var a=CKEDITOR.document.getActive();!a.equals(this._.iframe)&&a.$.blur()}(this._.lastFocused||this._.iframe.getFrameDocument().getWindow()).focus()},blur:function(){var a=this._.iframe.getFrameDocument().getActive();a.is("a")&&(this._.lastFocused=a)},hide:function(a){if(this.visible&&(!this.onHide||!0!==this.onHide.call(this))){this.hideChild();CKEDITOR.env.gecko&&this._.iframe.getFrameDocument().$.activeElement.blur(); +this.element.setStyle("display","none");this.visible=0;this.element.getFirst().removeCustomData("activePanel");if(a=a&&this._.returnFocus)CKEDITOR.env.webkit&&a.type&&a.getWindow().$.focus(),a.focus();delete this._.lastFocused;this._.editor.fire("panelHide",this)}},allowBlur:function(a){var b=this._.panel;void 0!=a&&(b.allowBlur=a);return b.allowBlur},showAsChild:function(a,b,c,g,f,h){this._.activeChild==a&&a._.panel._.offsetParentId==c.getId()||(this.hideChild(),a.onHide=CKEDITOR.tools.bind(function(){CKEDITOR.tools.setTimeout(function(){this._.focused|| +this.hide()},0,this)},this),this._.activeChild=a,this._.focused=!1,a.showBlock(b,c,g,f,h),this.blur(),(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)&&setTimeout(function(){a.element.getChild(0).$.style.cssText+=""},100))},hideChild:function(a){var b=this._.activeChild;b&&(delete b.onHide,delete this._.activeChild,b.hide(),a&&this.focus())}}});CKEDITOR.on("instanceDestroyed",function(){var a=CKEDITOR.tools.isEmpty(CKEDITOR.instances),b;for(b in g){var c=g[b];a?c.destroy():c.element.hide()}a&&(g= +{})})})();CKEDITOR.plugins.add("menu",{requires:"floatpanel",beforeInit:function(g){for(var h=g.config.menu_groups.split(","),m=g._.menuGroups={},l=g._.menuItems={},a=0;a<h.length;a++)m[h[a]]=a+1;g.addMenuGroup=function(b,a){m[b]=a||100};g.addMenuItem=function(a,c){m[c.group]&&(l[a]=new CKEDITOR.menuItem(this,a,c))};g.addMenuItems=function(a){for(var c in a)this.addMenuItem(c,a[c])};g.getMenuItem=function(a){return l[a]};g.removeMenuItem=function(a){delete l[a]}}}); +(function(){function g(a){a.sort(function(a,c){return a.group<c.group?-1:a.group>c.group?1:a.order<c.order?-1:a.order>c.order?1:0})}var h='<span class="cke_menuitem"><a id="{id}" class="cke_menubutton cke_menubutton__{name} cke_menubutton_{state} {cls}" href="{href}" title="{title}" tabindex="-1"_cke_focus=1 hidefocus="true" role="{role}" aria-haspopup="{hasPopup}" aria-disabled="{disabled}" {ariaChecked}';if(CKEDITOR.env.opera||CKEDITOR.env.gecko&&CKEDITOR.env.mac)h+=' onkeypress="return false;"'; +CKEDITOR.env.gecko&&(h+=' onblur="this.style.cssText = this.style.cssText;"');var h=h+(' onmouseover="CKEDITOR.tools.callFunction({hoverFn},{index});" onmouseout="CKEDITOR.tools.callFunction({moveOutFn},{index});" '+(CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick")+'="CKEDITOR.tools.callFunction({clickFn},{index}); return false;">'),m=CKEDITOR.addTemplate("menuItem",h+'<span class="cke_menubutton_inner"><span class="cke_menubutton_icon"><span class="cke_button_icon cke_button__{iconName}_icon" style="{iconStyle}"></span></span><span class="cke_menubutton_label">{label}</span>{arrowHtml}</span></a></span>'), +l=CKEDITOR.addTemplate("menuArrow",'<span class="cke_menuarrow"><span>{label}</span></span>');CKEDITOR.menu=CKEDITOR.tools.createClass({$:function(a,b){b=this._.definition=b||{};this.id=CKEDITOR.tools.getNextId();this.editor=a;this.items=[];this._.listeners=[];this._.level=b.level||1;var c=CKEDITOR.tools.extend({},b.panel,{css:[CKEDITOR.skin.getPath("editor")],level:this._.level-1,block:{}}),k=c.block.attributes=c.attributes||{};!k.role&&(k.role="menu");this._.panelDefinition=c},_:{onShow:function(){var a= +this.editor.getSelection(),b=a&&a.getStartElement(),c=this.editor.elementPath(),k=this._.listeners;this.removeAll();for(var e=0;e<k.length;e++){var j=k[e](b,a,c);if(j)for(var i in j){var f=this.editor.getMenuItem(i);if(f&&(!f.command||this.editor.getCommand(f.command).state))f.state=j[i],this.add(f)}}},onClick:function(a){this.hide();if(a.onClick)a.onClick();else a.command&&this.editor.execCommand(a.command)},onEscape:function(a){var b=this.parent;b?b._.panel.hideChild(1):27==a&&this.hide(1);return!1}, +onHide:function(){this.onHide&&this.onHide()},showSubMenu:function(a){var b=this._.subMenu,c=this.items[a];if(c=c.getItems&&c.getItems()){b?b.removeAll():(b=this._.subMenu=new CKEDITOR.menu(this.editor,CKEDITOR.tools.extend({},this._.definition,{level:this._.level+1},!0)),b.parent=this,b._.onClick=CKEDITOR.tools.bind(this._.onClick,this));for(var k in c){var e=this.editor.getMenuItem(k);e&&(e.state=c[k],b.add(e))}var j=this._.panel.getBlock(this.id).element.getDocument().getById(this.id+(""+a));setTimeout(function(){b.show(j, +2)},0)}else this._.panel.hideChild(1)}},proto:{add:function(a){a.order||(a.order=this.items.length);this.items.push(a)},removeAll:function(){this.items=[]},show:function(a,b,c,k){if(!this.parent&&(this._.onShow(),!this.items.length))return;var b=b||("rtl"==this.editor.lang.dir?2:1),e=this.items,j=this.editor,i=this._.panel,f=this._.element;if(!i){i=this._.panel=new CKEDITOR.ui.floatPanel(this.editor,CKEDITOR.document.getBody(),this._.panelDefinition,this._.level);i.onEscape=CKEDITOR.tools.bind(function(a){if(!1=== +this._.onEscape(a))return!1},this);i.onShow=function(){i._.panel.getHolderElement().getParent().addClass("cke cke_reset_all")};i.onHide=CKEDITOR.tools.bind(function(){this._.onHide&&this._.onHide()},this);f=i.addBlock(this.id,this._.panelDefinition.block);f.autoSize=!0;var d=f.keys;d[40]="next";d[9]="next";d[38]="prev";d[CKEDITOR.SHIFT+9]="prev";d["rtl"==j.lang.dir?37:39]=CKEDITOR.env.ie?"mouseup":"click";d[32]=CKEDITOR.env.ie?"mouseup":"click";CKEDITOR.env.ie&&(d[13]="mouseup");f=this._.element= +f.element;d=f.getDocument();d.getBody().setStyle("overflow","hidden");d.getElementsByTag("html").getItem(0).setStyle("overflow","hidden");this._.itemOverFn=CKEDITOR.tools.addFunction(function(a){clearTimeout(this._.showSubTimeout);this._.showSubTimeout=CKEDITOR.tools.setTimeout(this._.showSubMenu,j.config.menu_subMenuDelay||400,this,[a])},this);this._.itemOutFn=CKEDITOR.tools.addFunction(function(){clearTimeout(this._.showSubTimeout)},this);this._.itemClickFn=CKEDITOR.tools.addFunction(function(a){var b= +this.items[a];if(b.state==CKEDITOR.TRISTATE_DISABLED)this.hide(1);else if(b.getItems)this._.showSubMenu(a);else this._.onClick(b)},this)}g(e);for(var d=j.elementPath(),d=['<div class="cke_menu'+(d&&d.direction()!=j.lang.dir?" cke_mixed_dir_content":"")+'" role="presentation">'],h=e.length,m=h&&e[0].group,l=0;l<h;l++){var n=e[l];m!=n.group&&(d.push('<div class="cke_menuseparator" role="separator"></div>'),m=n.group);n.render(this,l,d)}d.push("</div>");f.setHtml(d.join(""));CKEDITOR.ui.fire("ready", +this);this.parent?this.parent._.panel.showAsChild(i,this.id,a,b,c,k):i.showBlock(this.id,a,b,c,k);j.fire("menuShow",[i])},addListener:function(a){this._.listeners.push(a)},hide:function(a){this._.onHide&&this._.onHide();this._.panel&&this._.panel.hide(a)}}});CKEDITOR.menuItem=CKEDITOR.tools.createClass({$:function(a,b,c){CKEDITOR.tools.extend(this,c,{order:0,className:"cke_menubutton__"+b});this.group=a._.menuGroups[this.group];this.editor=a;this.name=b},proto:{render:function(a,b,c){var h=a.id+(""+ +b),e="undefined"==typeof this.state?CKEDITOR.TRISTATE_OFF:this.state,j="",i=e==CKEDITOR.TRISTATE_ON?"on":e==CKEDITOR.TRISTATE_DISABLED?"disabled":"off";this.role in{menuitemcheckbox:1,menuitemradio:1}&&(j=' aria-checked="'+(e==CKEDITOR.TRISTATE_ON?"true":"false")+'"');var f=this.getItems,d="&#"+("rtl"==this.editor.lang.dir?"9668":"9658")+";",g=this.name;this.icon&&!/\./.test(this.icon)&&(g=this.icon);a={id:h,name:this.name,iconName:g,label:this.label,cls:this.className||"",state:i,hasPopup:f?"true": +"false",disabled:e==CKEDITOR.TRISTATE_DISABLED,title:this.label,href:"javascript:void('"+(this.label||"").replace("'")+"')",hoverFn:a._.itemOverFn,moveOutFn:a._.itemOutFn,clickFn:a._.itemClickFn,index:b,iconStyle:CKEDITOR.skin.getIconStyle(g,"rtl"==this.editor.lang.dir,g==this.icon?null:this.icon,this.iconOffset),arrowHtml:f?l.output({label:d}):"",role:this.role?this.role:"menuitem",ariaChecked:j};m.output(a,c)}}})})();CKEDITOR.config.menu_groups="clipboard,form,tablecell,tablecellproperties,tablerow,tablecolumn,table,anchor,link,image,flash,checkbox,radio,textfield,hiddenfield,imagebutton,button,select,textarea,div";CKEDITOR.plugins.add("contextmenu",{requires:"menu",onLoad:function(){CKEDITOR.plugins.contextMenu=CKEDITOR.tools.createClass({base:CKEDITOR.menu,$:function(a){this.base.call(this,a,{panel:{className:"cke_menu_panel",attributes:{"aria-label":a.lang.contextmenu.options}}})},proto:{addTarget:function(a,c){a.on("contextmenu",function(a){var a=a.data,b=CKEDITOR.env.webkit?d:CKEDITOR.env.mac?a.$.metaKey:a.$.ctrlKey;if(!c||!b){a.preventDefault();var e=a.getTarget().getDocument(),f=a.getTarget().getDocument().getDocumentElement(), +b=!e.equals(CKEDITOR.document),e=e.getWindow().getScrollPosition(),g=b?a.$.clientX:a.$.pageX||e.x+a.$.clientX,h=b?a.$.clientY:a.$.pageY||e.y+a.$.clientY;CKEDITOR.tools.setTimeout(function(){this.open(f,null,g,h)},CKEDITOR.env.ie?200:0,this)}},this);if(CKEDITOR.env.webkit){var d,b=function(){d=0};a.on("keydown",function(a){d=CKEDITOR.env.mac?a.data.$.metaKey:a.data.$.ctrlKey});a.on("keyup",b);a.on("contextmenu",b)}},open:function(a,c,d,b){this.editor.focus();a=a||CKEDITOR.document.getDocumentElement(); +this.editor.selectionChange(1);this.show(a,c,d,b)}}})},beforeInit:function(a){var c=a.contextMenu=new CKEDITOR.plugins.contextMenu(a);a.on("contentDom",function(){c.addTarget(a.editable(),!1!==a.config.browserContextMenuOnCtrl)});a.addCommand("contextMenu",{exec:function(){a.contextMenu.open(a.document.getBody())}});a.setKeystroke(CKEDITOR.SHIFT+121,"contextMenu");a.setKeystroke(CKEDITOR.CTRL+CKEDITOR.SHIFT+121,"contextMenu")}});CKEDITOR.plugins.add("resize",{init:function(b){var f,g,n,o,a=b.config,q=b.ui.spaceId("resizer"),h=b.element?b.element.getDirection(1):"ltr";!a.resize_dir&&(a.resize_dir="vertical");void 0==a.resize_maxWidth&&(a.resize_maxWidth=3E3);void 0==a.resize_maxHeight&&(a.resize_maxHeight=3E3);void 0==a.resize_minWidth&&(a.resize_minWidth=750);void 0==a.resize_minHeight&&(a.resize_minHeight=250);if(!1!==a.resize_enabled){var c=null,i=("both"==a.resize_dir||"horizontal"==a.resize_dir)&&a.resize_minWidth!=a.resize_maxWidth, +l=("both"==a.resize_dir||"vertical"==a.resize_dir)&&a.resize_minHeight!=a.resize_maxHeight,j=function(d){var e=f,m=g,c=e+(d.data.$.screenX-n)*("rtl"==h?-1:1),d=m+(d.data.$.screenY-o);i&&(e=Math.max(a.resize_minWidth,Math.min(c,a.resize_maxWidth)));l&&(m=Math.max(a.resize_minHeight,Math.min(d,a.resize_maxHeight)));b.resize(i?e:null,m)},k=function(){CKEDITOR.document.removeListener("mousemove",j);CKEDITOR.document.removeListener("mouseup",k);b.document&&(b.document.removeListener("mousemove",j),b.document.removeListener("mouseup", +k))},p=CKEDITOR.tools.addFunction(function(d){c||(c=b.getResizable());f=c.$.offsetWidth||0;g=c.$.offsetHeight||0;n=d.screenX;o=d.screenY;a.resize_minWidth>f&&(a.resize_minWidth=f);a.resize_minHeight>g&&(a.resize_minHeight=g);CKEDITOR.document.on("mousemove",j);CKEDITOR.document.on("mouseup",k);b.document&&(b.document.on("mousemove",j),b.document.on("mouseup",k));d.preventDefault&&d.preventDefault()});b.on("destroy",function(){CKEDITOR.tools.removeFunction(p)});b.on("uiSpace",function(a){if("bottom"== +a.data.space){var e="";i&&!l&&(e=" cke_resizer_horizontal");!i&&l&&(e=" cke_resizer_vertical");var c='<span id="'+q+'" class="cke_resizer'+e+" cke_resizer_"+h+'" title="'+CKEDITOR.tools.htmlEncode(b.lang.common.resize)+'" onmousedown="CKEDITOR.tools.callFunction('+p+', event)">'+("ltr"==h?"◢":"◣")+"</span>";"ltr"==h&&"ltr"==e?a.data.html+=c:a.data.html=c+a.data.html}},b,null,100);b.on("maximize",function(a){b.ui.space("resizer")[a.data==CKEDITOR.TRISTATE_ON?"hide":"show"]()})}}});(function(){var c='<a id="{id}" class="cke_button cke_button__{name} cke_button_{state} {cls}"'+(CKEDITOR.env.gecko&&10900<=CKEDITOR.env.version&&!CKEDITOR.env.hc?"":" href=\"javascript:void('{titleJs}')\"")+' title="{title}" tabindex="-1" hidefocus="true" role="button" aria-labelledby="{id}_label" aria-haspopup="{hasArrow}" aria-disabled="{ariaDisabled}"';if(CKEDITOR.env.opera||CKEDITOR.env.gecko&&CKEDITOR.env.mac)c+=' onkeypress="return false;"';CKEDITOR.env.gecko&&(c+=' onblur="this.style.cssText = this.style.cssText;"'); +var c=c+(' onkeydown="return CKEDITOR.tools.callFunction({keydownFn},event);" onfocus="return CKEDITOR.tools.callFunction({focusFn},event);" onmousedown="return CKEDITOR.tools.callFunction({mousedownFn},event);" '+(CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick")+'="CKEDITOR.tools.callFunction({clickFn},this);return false;"><span class="cke_button_icon cke_button__{iconName}_icon" style="{style}"'),c=c+'>&nbsp;</span><span id="{id}_label" class="cke_button_label cke_button__{name}_label" aria-hidden="false">{label}</span>{arrowHtml}</a>', +m=CKEDITOR.addTemplate("buttonArrow",'<span class="cke_button_arrow">'+(CKEDITOR.env.hc?"&#9660;":"")+"</span>"),n=CKEDITOR.addTemplate("button",c);CKEDITOR.plugins.add("button",{beforeInit:function(a){a.ui.addHandler(CKEDITOR.UI_BUTTON,CKEDITOR.ui.button.handler)}});CKEDITOR.UI_BUTTON="button";CKEDITOR.ui.button=function(a){CKEDITOR.tools.extend(this,a,{title:a.label,click:a.click||function(b){b.execCommand(a.command)}});this._={}};CKEDITOR.ui.button.handler={create:function(a){return new CKEDITOR.ui.button(a)}}; +CKEDITOR.ui.button.prototype={render:function(a,b){var c=CKEDITOR.env,i=this._.id=CKEDITOR.tools.getNextId(),f="",e=this.command,l;this._.editor=a;var d={id:i,button:this,editor:a,focus:function(){CKEDITOR.document.getById(i).focus()},execute:function(){this.button.click(a)},attach:function(a){this.button.attach(a)}},o=CKEDITOR.tools.addFunction(function(a){if(d.onkey)return a=new CKEDITOR.dom.event(a),!1!==d.onkey(d,a.getKeystroke())}),p=CKEDITOR.tools.addFunction(function(a){var b;d.onfocus&&(b= +!1!==d.onfocus(d,new CKEDITOR.dom.event(a)));CKEDITOR.env.gecko&&10900>CKEDITOR.env.version&&a.preventBubble();return b}),j=0,q=CKEDITOR.tools.addFunction(function(){if(CKEDITOR.env.opera){var b=a.editable();b.isInline()&&b.hasFocus&&(a.lockSelection(),j=1)}});d.clickFn=l=CKEDITOR.tools.addFunction(function(){j&&(a.unlockSelection(1),j=0);d.execute()});if(this.modes){var k={},g=function(){var b=a.mode;b&&(b=this.modes[b]?void 0!=k[b]?k[b]:CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,b=a.readOnly&& +!this.readOnly?CKEDITOR.TRISTATE_DISABLED:b,this.setState(b),this.refresh&&this.refresh())};a.on("beforeModeUnload",function(){a.mode&&this._.state!=CKEDITOR.TRISTATE_DISABLED&&(k[a.mode]=this._.state)},this);a.on("activeFilterChange",g,this);a.on("mode",g,this);!this.readOnly&&a.on("readOnly",g,this)}else if(e&&(e=a.getCommand(e)))e.on("state",function(){this.setState(e.state)},this),f+=e.state==CKEDITOR.TRISTATE_ON?"on":e.state==CKEDITOR.TRISTATE_DISABLED?"disabled":"off";if(this.directional)a.on("contentDirChanged", +function(b){var c=CKEDITOR.document.getById(this._.id),d=c.getFirst(),b=b.data;b!=a.lang.dir?c.addClass("cke_"+b):c.removeClass("cke_ltr").removeClass("cke_rtl");d.setAttribute("style",CKEDITOR.skin.getIconStyle(h,"rtl"==b,this.icon,this.iconOffset))},this);e||(f+="off");var h=g=this.name||this.command;this.icon&&!/\./.test(this.icon)&&(h=this.icon,this.icon=null);c={id:i,name:g,iconName:h,label:this.label,cls:this.className||"",state:f,ariaDisabled:"disabled"==f?"true":"false",title:this.title,titleJs:c.gecko&& +10900<=c.version&&!c.hc?"":(this.title||"").replace("'",""),hasArrow:this.hasArrow?"true":"false",keydownFn:o,mousedownFn:q,focusFn:p,clickFn:l,style:CKEDITOR.skin.getIconStyle(h,"rtl"==a.lang.dir,this.icon,this.iconOffset),arrowHtml:this.hasArrow?m.output():""};n.output(c,b);if(this.onRender)this.onRender();return d},setState:function(a){if(this._.state==a)return!1;this._.state=a;var b=CKEDITOR.document.getById(this._.id);return b?(b.setState(a,"cke_button"),a==CKEDITOR.TRISTATE_DISABLED?b.setAttribute("aria-disabled", +!0):b.removeAttribute("aria-disabled"),a==CKEDITOR.TRISTATE_ON?b.setAttribute("aria-pressed",!0):b.removeAttribute("aria-pressed"),!0):!1},getState:function(){return this._.state},toFeature:function(a){if(this._.feature)return this._.feature;var b=this;!this.allowedContent&&(!this.requiredContent&&this.command)&&(b=a.getCommand(this.command)||b);return this._.feature=b}};CKEDITOR.ui.prototype.addButton=function(a,b){this.add(a,CKEDITOR.UI_BUTTON,b)}})();(function(){function w(a){function d(){for(var b=g(),e=CKEDITOR.tools.clone(a.config.toolbarGroups)||n(a),f=0;f<e.length;f++){var k=e[f];if("/"!=k){"string"==typeof k&&(k=e[f]={name:k});var i,d=k.groups;if(d)for(var h=0;h<d.length;h++)i=d[h],(i=b[i])&&c(k,i);(i=b[k.name])&&c(k,i)}}return e}function g(){var b={},c,f,e;for(c in a.ui.items)f=a.ui.items[c],e=f.toolbar||"others",e=e.split(","),f=e[0],e=parseInt(e[1]||-1,10),b[f]||(b[f]=[]),b[f].push({name:c,order:e});for(f in b)b[f]=b[f].sort(function(b, +a){return b.order==a.order?0:0>a.order?-1:0>b.order?1:b.order<a.order?-1:1});return b}function c(c,e){if(e.length){c.items?c.items.push(a.ui.create("-")):c.items=[];for(var f;f=e.shift();)if(f="string"==typeof f?f:f.name,!b||-1==CKEDITOR.tools.indexOf(b,f))(f=a.ui.create(f))&&a.addFeature(f)&&c.items.push(f)}}function h(b){var a=[],e,d,h;for(e=0;e<b.length;++e)d=b[e],h={},"/"==d?a.push(d):CKEDITOR.tools.isArray(d)?(c(h,CKEDITOR.tools.clone(d)),a.push(h)):d.items&&(c(h,CKEDITOR.tools.clone(d.items)), +h.name=d.name,a.push(h));return a}var b=a.config.removeButtons,b=b&&b.split(","),e=a.config.toolbar;"string"==typeof e&&(e=a.config["toolbar_"+e]);return a.toolbar=e?h(e):d()}function n(a){return a._.toolbarGroups||(a._.toolbarGroups=[{name:"document",groups:["mode","document","doctools"]},{name:"clipboard",groups:["clipboard","undo"]},{name:"editing",groups:["find","selection","spellchecker"]},{name:"forms"},"/",{name:"basicstyles",groups:["basicstyles","cleanup"]},{name:"paragraph",groups:["list", +"indent","blocks","align","bidi"]},{name:"links"},{name:"insert"},"/",{name:"styles"},{name:"colors"},{name:"tools"},{name:"others"},{name:"about"}])}var u=function(){this.toolbars=[];this.focusCommandExecuted=!1};u.prototype.focus=function(){for(var a=0,d;d=this.toolbars[a++];)for(var g=0,c;c=d.items[g++];)if(c.focus){c.focus();return}};var x={modes:{wysiwyg:1,source:1},readOnly:1,exec:function(a){a.toolbox&&(a.toolbox.focusCommandExecuted=!0,CKEDITOR.env.ie||CKEDITOR.env.air?setTimeout(function(){a.toolbox.focus()}, +100):a.toolbox.focus())}};CKEDITOR.plugins.add("toolbar",{requires:"button",init:function(a){var d,g=function(c,h){var b,e="rtl"==a.lang.dir,j=a.config.toolbarGroupCycling,o=e?37:39,e=e?39:37,j=void 0===j||j;switch(h){case 9:case CKEDITOR.SHIFT+9:for(;!b||!b.items.length;)if(b=9==h?(b?b.next:c.toolbar.next)||a.toolbox.toolbars[0]:(b?b.previous:c.toolbar.previous)||a.toolbox.toolbars[a.toolbox.toolbars.length-1],b.items.length)for(c=b.items[d?b.items.length-1:0];c&&!c.focus;)(c=d?c.previous:c.next)|| +(b=0);c&&c.focus();return!1;case o:b=c;do b=b.next,!b&&j&&(b=c.toolbar.items[0]);while(b&&!b.focus);b?b.focus():g(c,9);return!1;case 40:return c.button&&c.button.hasArrow?(a.once("panelShow",function(b){b.data._.panel._.currentBlock.onKeyDown(40)}),c.execute()):g(c,40==h?o:e),!1;case e:case 38:b=c;do b=b.previous,!b&&j&&(b=c.toolbar.items[c.toolbar.items.length-1]);while(b&&!b.focus);b?b.focus():(d=1,g(c,CKEDITOR.SHIFT+9),d=0);return!1;case 27:return a.focus(),!1;case 13:case 32:return c.execute(), +!1}return!0};a.on("uiSpace",function(c){if(c.data.space==a.config.toolbarLocation){c.removeListener();a.toolbox=new u;var d=CKEDITOR.tools.getNextId(),b=['<span id="',d,'" class="cke_voice_label">',a.lang.toolbar.toolbars,"</span>",'<span id="'+a.ui.spaceId("toolbox")+'" class="cke_toolbox" role="group" aria-labelledby="',d,'" onmousedown="return false;">'],d=!1!==a.config.toolbarStartupExpanded,e,j;a.config.toolbarCanCollapse&&a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE&&b.push('<span class="cke_toolbox_main"'+ +(d?">":' style="display:none">'));for(var o=a.toolbox.toolbars,f=w(a),k=0;k<f.length;k++){var i,l=0,r,m=f[k],s;if(m)if(e&&(b.push("</span>"),j=e=0),"/"===m)b.push('<span class="cke_toolbar_break"></span>');else{s=m.items||m;for(var t=0;t<s.length;t++){var p=s[t],n;if(p)if(p.type==CKEDITOR.UI_SEPARATOR)j=e&&p;else{n=!1!==p.canGroup;if(!l){i=CKEDITOR.tools.getNextId();l={id:i,items:[]};r=m.name&&(a.lang.toolbar.toolbarGroups[m.name]||m.name);b.push('<span id="',i,'" class="cke_toolbar"',r?' aria-labelledby="'+ +i+'_label"':"",' role="toolbar">');r&&b.push('<span id="',i,'_label" class="cke_voice_label">',r,"</span>");b.push('<span class="cke_toolbar_start"></span>');var q=o.push(l)-1;0<q&&(l.previous=o[q-1],l.previous.next=l)}n?e||(b.push('<span class="cke_toolgroup" role="presentation">'),e=1):e&&(b.push("</span>"),e=0);i=function(c){c=c.render(a,b);q=l.items.push(c)-1;if(q>0){c.previous=l.items[q-1];c.previous.next=c}c.toolbar=l;c.onkey=g;c.onfocus=function(){a.toolbox.focusCommandExecuted||a.focus()}}; +j&&(i(j),j=0);i(p)}}e&&(b.push("</span>"),j=e=0);l&&b.push('<span class="cke_toolbar_end"></span></span>')}}a.config.toolbarCanCollapse&&b.push("</span>");if(a.config.toolbarCanCollapse&&a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE){var v=CKEDITOR.tools.addFunction(function(){a.execCommand("toolbarCollapse")});a.on("destroy",function(){CKEDITOR.tools.removeFunction(v)});a.addCommand("toolbarCollapse",{readOnly:1,exec:function(b){var a=b.ui.space("toolbar_collapser"),c=a.getPrevious(),e=b.ui.space("contents"), +d=c.getParent(),f=parseInt(e.$.style.height,10),h=d.$.offsetHeight,g=a.hasClass("cke_toolbox_collapser_min");g?(c.show(),a.removeClass("cke_toolbox_collapser_min"),a.setAttribute("title",b.lang.toolbar.toolbarCollapse)):(c.hide(),a.addClass("cke_toolbox_collapser_min"),a.setAttribute("title",b.lang.toolbar.toolbarExpand));a.getFirst().setText(g?"▲":"◀");e.setStyle("height",f-(d.$.offsetHeight-h)+"px");b.fire("resize")},modes:{wysiwyg:1,source:1}});a.setKeystroke(CKEDITOR.ALT+(CKEDITOR.env.ie||CKEDITOR.env.webkit? +189:109),"toolbarCollapse");b.push('<a title="'+(d?a.lang.toolbar.toolbarCollapse:a.lang.toolbar.toolbarExpand)+'" id="'+a.ui.spaceId("toolbar_collapser")+'" tabIndex="-1" class="cke_toolbox_collapser');d||b.push(" cke_toolbox_collapser_min");b.push('" onclick="CKEDITOR.tools.callFunction('+v+')">','<span class="cke_arrow">&#9650;</span>',"</a>")}b.push("</span>");c.data.html+=b.join("")}});a.on("destroy",function(){if(this.toolbox){var a,d=0,b,e,g;for(a=this.toolbox.toolbars;d<a.length;d++){e=a[d].items; +for(b=0;b<e.length;b++)g=e[b],g.clickFn&&CKEDITOR.tools.removeFunction(g.clickFn),g.keyDownFn&&CKEDITOR.tools.removeFunction(g.keyDownFn)}}});a.on("uiReady",function(){var c=a.ui.space("toolbox");c&&a.focusManager.add(c,1)});a.addCommand("toolbarFocus",x);a.setKeystroke(CKEDITOR.ALT+121,"toolbarFocus");a.ui.add("-",CKEDITOR.UI_SEPARATOR,{});a.ui.addHandler(CKEDITOR.UI_SEPARATOR,{create:function(){return{render:function(a,d){d.push('<span class="cke_toolbar_separator" role="separator"></span>');return{}}}}})}}); +CKEDITOR.ui.prototype.addToolbarGroup=function(a,d,g){var c=n(this.editor),h=0===d,b={name:a};if(g){if(g=CKEDITOR.tools.search(c,function(a){return a.name==g})){!g.groups&&(g.groups=[]);if(d&&(d=CKEDITOR.tools.indexOf(g.groups,d),0<=d)){g.groups.splice(d+1,0,a);return}h?g.groups.splice(0,0,a):g.groups.push(a);return}d=null}d&&(d=CKEDITOR.tools.indexOf(c,function(a){return a.name==d}));h?c.splice(0,0,a):"number"==typeof d?c.splice(d+1,0,b):c.push(a)}})();CKEDITOR.UI_SEPARATOR="separator"; +CKEDITOR.config.toolbarLocation="top";(function(){var k;function n(a,c){function j(d){d=i.list[d];if(d.equals(a.editable())||"true"==d.getAttribute("contenteditable")){var e=a.createRange();e.selectNodeContents(d);e.select()}else a.getSelection().selectElement(d);a.focus()}function s(){l&&l.setHtml(o);delete i.list}var m=a.ui.spaceId("path"),l,i=a._.elementsPath,n=i.idBase;c.html+='<span id="'+m+'_label" class="cke_voice_label">'+a.lang.elementspath.eleLabel+'</span><span id="'+m+'" class="cke_path" role="group" aria-labelledby="'+m+ +'_label">'+o+"</span>";a.on("uiReady",function(){var d=a.ui.space("path");d&&a.focusManager.add(d,1)});i.onClick=j;var t=CKEDITOR.tools.addFunction(j),u=CKEDITOR.tools.addFunction(function(d,e){var g=i.idBase,b,e=new CKEDITOR.dom.event(e);b="rtl"==a.lang.dir;switch(e.getKeystroke()){case b?39:37:case 9:return(b=CKEDITOR.document.getById(g+(d+1)))||(b=CKEDITOR.document.getById(g+"0")),b.focus(),!1;case b?37:39:case CKEDITOR.SHIFT+9:return(b=CKEDITOR.document.getById(g+(d-1)))||(b=CKEDITOR.document.getById(g+ +(i.list.length-1))),b.focus(),!1;case 27:return a.focus(),!1;case 13:case 32:return j(d),!1}return!0});a.on("selectionChange",function(){a.editable();for(var d=[],e=i.list=[],g=[],b=i.filters,c=!0,j=a.elementPath().elements,f,k=j.length;k--;){var h=j[k],p=0;f=h.data("cke-display-name")?h.data("cke-display-name"):h.data("cke-real-element-type")?h.data("cke-real-element-type"):h.getName();c=h.hasAttribute("contenteditable")?"true"==h.getAttribute("contenteditable"):c;!c&&!h.hasAttribute("contenteditable")&& +(p=1);for(var q=0;q<b.length;q++){var r=b[q](h,f);if(!1===r){p=1;break}f=r||f}p||(e.unshift(h),g.unshift(f))}e=e.length;for(b=0;b<e;b++)f=g[b],c=a.lang.elementspath.eleTitle.replace(/%1/,f),f=v.output({id:n+b,label:c,text:f,jsTitle:"javascript:void('"+f+"')",index:b,keyDownFn:u,clickFn:t}),d.unshift(f);l||(l=CKEDITOR.document.getById(m));g=l;g.setHtml(d.join("")+o);a.fire("elementsPathUpdate",{space:g})});a.on("readOnly",s);a.on("contentDomUnload",s);a.addCommand("elementsPathFocus",k);a.setKeystroke(CKEDITOR.ALT+ +122,"elementsPathFocus")}k={editorFocus:!1,readOnly:1,exec:function(a){(a=CKEDITOR.document.getById(a._.elementsPath.idBase+"0"))&&a.focus(CKEDITOR.env.ie||CKEDITOR.env.air)}};var o='<span class="cke_path_empty">&nbsp;</span>',c="";if(CKEDITOR.env.opera||CKEDITOR.env.gecko&&CKEDITOR.env.mac)c+=' onkeypress="return false;"';CKEDITOR.env.gecko&&(c+=' onblur="this.style.cssText = this.style.cssText;"');var v=CKEDITOR.addTemplate("pathItem",'<a id="{id}" href="{jsTitle}" tabindex="-1" class="cke_path_item" title="{label}"'+ +(CKEDITOR.env.gecko&&10900>CKEDITOR.env.version?' onfocus="event.preventBubble();"':"")+c+' hidefocus="true" onkeydown="return CKEDITOR.tools.callFunction({keyDownFn},{index}, event );" onclick="CKEDITOR.tools.callFunction({clickFn},{index}); return false;" role="button" aria-label="{label}">{text}</a>');CKEDITOR.plugins.add("elementspath",{init:function(a){a._.elementsPath={idBase:"cke_elementspath_"+CKEDITOR.tools.getNextNumber()+"_",filters:[]};a.on("uiSpace",function(c){"bottom"==c.data.space&& +n(a,c.data)})}})})();(function(){function l(e,c,b){b=e.config.forceEnterMode||b;"wysiwyg"==e.mode&&(c||(c=e.activeEnterMode),e.elementPath().isContextFor("p")||(c=CKEDITOR.ENTER_BR,b=1),e.fire("saveSnapshot"),c==CKEDITOR.ENTER_BR?o(e,c,null,b):p(e,c,null,b),e.fire("saveSnapshot"))}function q(e){for(var e=e.getSelection().getRanges(!0),c=e.length-1;0<c;c--)e[c].deleteContents();return e[0]}CKEDITOR.plugins.add("enterkey",{init:function(e){e.addCommand("enter",{modes:{wysiwyg:1},editorFocus:!1,exec:function(c){l(c)}}); +e.addCommand("shiftEnter",{modes:{wysiwyg:1},editorFocus:!1,exec:function(c){l(c,c.activeShiftEnterMode,1)}});e.setKeystroke([[13,"enter"],[CKEDITOR.SHIFT+13,"shiftEnter"]])}});var t=CKEDITOR.dom.walker.whitespaces(),u=CKEDITOR.dom.walker.bookmark();CKEDITOR.plugins.enterkey={enterBlock:function(e,c,b,i){if(b=b||q(e)){var f=b.document,j=b.checkStartOfBlock(),h=b.checkEndOfBlock(),a=e.elementPath(b.startContainer).block,k=c==CKEDITOR.ENTER_DIV?"div":"p",d;if(j&&h){if(a&&(a.is("li")||a.getParent().is("li"))){b= +a.getParent();d=b.getParent();var i=!a.hasPrevious(),m=!a.hasNext(),k=e.getSelection(),g=k.createBookmarks(),j=a.getDirection(1),h=a.getAttribute("class"),n=a.getAttribute("style"),l=d.getDirection(1)!=j,e=e.enterMode!=CKEDITOR.ENTER_BR||l||n||h;if(d.is("li"))if(i||m)a[i?"insertBefore":"insertAfter"](d);else a.breakParent(d);else{if(e)if(d=f.createElement(c==CKEDITOR.ENTER_P?"p":"div"),l&&d.setAttribute("dir",j),n&&d.setAttribute("style",n),h&&d.setAttribute("class",h),a.moveChildren(d),i||m)d[i? +"insertBefore":"insertAfter"](b);else a.breakParent(b),d.insertAfter(b);else if(a.appendBogus(!0),i||m)for(;f=a[i?"getFirst":"getLast"]();)f[i?"insertBefore":"insertAfter"](b);else for(a.breakParent(b);f=a.getLast();)f.insertAfter(b);a.remove()}k.selectBookmarks(g);return}if(a&&a.getParent().is("blockquote")){a.breakParent(a.getParent());a.getPrevious().getFirst(CKEDITOR.dom.walker.invisible(1))||a.getPrevious().remove();a.getNext().getFirst(CKEDITOR.dom.walker.invisible(1))||a.getNext().remove(); +b.moveToElementEditStart(a);b.select();return}}else if(a&&a.is("pre")&&!h){o(e,c,b,i);return}if(h=b.splitBlock(k)){c=h.previousBlock;a=h.nextBlock;e=h.wasStartOfBlock;j=h.wasEndOfBlock;if(a)g=a.getParent(),g.is("li")&&(a.breakParent(g),a.move(a.getNext(),1));else if(c&&(g=c.getParent())&&g.is("li"))c.breakParent(g),g=c.getNext(),b.moveToElementEditStart(g),c.move(c.getPrevious());if(!e&&!j)a.is("li")&&(d=b.clone(),d.selectNodeContents(a),d=new CKEDITOR.dom.walker(d),d.evaluator=function(a){return!(u(a)|| +t(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.getName()in CKEDITOR.dtd.$inline&&!(a.getName()in CKEDITOR.dtd.$empty))},(g=d.next())&&(g.type==CKEDITOR.NODE_ELEMENT&&g.is("ul","ol"))&&(CKEDITOR.env.needsBrFiller?f.createElement("br"):f.createText(" ")).insertBefore(g)),a&&b.moveToElementEditStart(a);else{if(c){if(c.is("li")||!r.test(c.getName())&&!c.is("pre"))d=c.clone()}else a&&(d=a.clone());d?i&&!d.is("li")&&d.renameNode(k):g&&g.is("li")?d=g:(d=f.createElement(k),c&&(m=c.getDirection())&&d.setAttribute("dir", +m));if(f=h.elementPath){i=0;for(k=f.elements.length;i<k;i++){g=f.elements[i];if(g.equals(f.block)||g.equals(f.blockLimit))break;CKEDITOR.dtd.$removeEmpty[g.getName()]&&(g=g.clone(),d.moveChildren(g),d.append(g))}}d.appendBogus();d.getParent()||b.insertNode(d);d.is("li")&&d.removeAttribute("value");if(CKEDITOR.env.ie&&e&&(!j||!c.getChildCount()))b.moveToElementEditStart(j?c:d),b.select();b.moveToElementEditStart(e&&!j?a:d)}b.select();b.scrollIntoView()}}},enterBr:function(e,c,b,i){if(b=b||q(e)){var f= +b.document,j=b.checkEndOfBlock(),h=new CKEDITOR.dom.elementPath(e.getSelection().getStartElement()),a=h.block,h=a&&h.block.getName();!i&&"li"==h?p(e,c,b,i):(!i&&j&&r.test(h)?(j=a.getDirection())?(f=f.createElement("div"),f.setAttribute("dir",j),f.insertAfter(a),b.setStart(f,0)):(f.createElement("br").insertAfter(a),CKEDITOR.env.gecko&&f.createText("").insertAfter(a),b.setStartAt(a.getNext(),CKEDITOR.env.ie?CKEDITOR.POSITION_BEFORE_START:CKEDITOR.POSITION_AFTER_START)):(a="pre"==h&&CKEDITOR.env.ie&& +8>CKEDITOR.env.version?f.createText("\r"):f.createElement("br"),b.deleteContents(),b.insertNode(a),CKEDITOR.env.needsBrFiller?(f.createText("").insertAfter(a),j&&a.getParent().appendBogus(),a.getNext().$.nodeValue="",b.setStartAt(a.getNext(),CKEDITOR.POSITION_AFTER_START)):b.setStartAt(a,CKEDITOR.POSITION_AFTER_END)),b.collapse(!0),b.select(),b.scrollIntoView())}}};var s=CKEDITOR.plugins.enterkey,o=s.enterBr,p=s.enterBlock,r=/^h[1-6]$/})();(function(){function j(a,b){var d={},e=[],f={nbsp:" ",shy:"­",gt:">",lt:"<",amp:"&",apos:"'",quot:'"'},a=a.replace(/\b(nbsp|shy|gt|lt|amp|apos|quot)(?:,|$)/g,function(a,h){var c=b?"&"+h+";":f[h];d[c]=b?f[h]:"&"+h+";";e.push(c);return""});if(!b&&a){var a=a.split(","),c=document.createElement("div"),g;c.innerHTML="&"+a.join(";&")+";";g=c.innerHTML;c=null;for(c=0;c<g.length;c++){var i=g.charAt(c);d[i]="&"+a[c]+";";e.push(i)}}d.regex=e.join(b?"|":"");return d}CKEDITOR.plugins.add("entities",{afterInit:function(a){var b= +a.config;if(a=(a=a.dataProcessor)&&a.htmlFilter){var d=[];!1!==b.basicEntities&&d.push("nbsp,gt,lt,amp");b.entities&&(d.length&&d.push("quot,iexcl,cent,pound,curren,yen,brvbar,sect,uml,copy,ordf,laquo,not,shy,reg,macr,deg,plusmn,sup2,sup3,acute,micro,para,middot,cedil,sup1,ordm,raquo,frac14,frac12,frac34,iquest,times,divide,fnof,bull,hellip,prime,Prime,oline,frasl,weierp,image,real,trade,alefsym,larr,uarr,rarr,darr,harr,crarr,lArr,uArr,rArr,dArr,hArr,forall,part,exist,empty,nabla,isin,notin,ni,prod,sum,minus,lowast,radic,prop,infin,ang,and,or,cap,cup,int,there4,sim,cong,asymp,ne,equiv,le,ge,sub,sup,nsub,sube,supe,oplus,otimes,perp,sdot,lceil,rceil,lfloor,rfloor,lang,rang,loz,spades,clubs,hearts,diams,circ,tilde,ensp,emsp,thinsp,zwnj,zwj,lrm,rlm,ndash,mdash,lsquo,rsquo,sbquo,ldquo,rdquo,bdquo,dagger,Dagger,permil,lsaquo,rsaquo,euro"), +b.entities_latin&&d.push("Agrave,Aacute,Acirc,Atilde,Auml,Aring,AElig,Ccedil,Egrave,Eacute,Ecirc,Euml,Igrave,Iacute,Icirc,Iuml,ETH,Ntilde,Ograve,Oacute,Ocirc,Otilde,Ouml,Oslash,Ugrave,Uacute,Ucirc,Uuml,Yacute,THORN,szlig,agrave,aacute,acirc,atilde,auml,aring,aelig,ccedil,egrave,eacute,ecirc,euml,igrave,iacute,icirc,iuml,eth,ntilde,ograve,oacute,ocirc,otilde,ouml,oslash,ugrave,uacute,ucirc,uuml,yacute,thorn,yuml,OElig,oelig,Scaron,scaron,Yuml"),b.entities_greek&&d.push("Alpha,Beta,Gamma,Delta,Epsilon,Zeta,Eta,Theta,Iota,Kappa,Lambda,Mu,Nu,Xi,Omicron,Pi,Rho,Sigma,Tau,Upsilon,Phi,Chi,Psi,Omega,alpha,beta,gamma,delta,epsilon,zeta,eta,theta,iota,kappa,lambda,mu,nu,xi,omicron,pi,rho,sigmaf,sigma,tau,upsilon,phi,chi,psi,omega,thetasym,upsih,piv"), +b.entities_additional&&d.push(b.entities_additional));var e=j(d.join(",")),f=e.regex?"["+e.regex+"]":"a^";delete e.regex;b.entities&&b.entities_processNumerical&&(f="[^ -~]|"+f);var f=RegExp(f,"g"),c=function(a){return b.entities_processNumerical=="force"||!e[a]?"&#"+a.charCodeAt(0)+";":e[a]},g=j("nbsp,gt,lt,amp,shy",!0),i=RegExp(g.regex,"g"),k=function(a){return g[a]};a.addRules({text:function(a){return a.replace(i,k).replace(f,c)}},{applyToAll:!0})}}})})();CKEDITOR.config.basicEntities=!0; +CKEDITOR.config.entities=!0;CKEDITOR.config.entities_latin=!0;CKEDITOR.config.entities_greek=!0;CKEDITOR.config.entities_additional="#39";CKEDITOR.plugins.add("popup"); +CKEDITOR.tools.extend(CKEDITOR.editor.prototype,{popup:function(e,a,b,d){a=a||"80%";b=b||"70%";"string"==typeof a&&(1<a.length&&"%"==a.substr(a.length-1,1))&&(a=parseInt(window.screen.width*parseInt(a,10)/100,10));"string"==typeof b&&(1<b.length&&"%"==b.substr(b.length-1,1))&&(b=parseInt(window.screen.height*parseInt(b,10)/100,10));640>a&&(a=640);420>b&&(b=420);var f=parseInt((window.screen.height-b)/2,10),g=parseInt((window.screen.width-a)/2,10),d=(d||"location=no,menubar=no,toolbar=no,dependent=yes,minimizable=no,modal=yes,alwaysRaised=yes,resizable=yes,scrollbars=yes")+",width="+ +a+",height="+b+",top="+f+",left="+g,c=window.open("",null,d,!0);if(!c)return!1;try{-1==navigator.userAgent.toLowerCase().indexOf(" chrome/")&&(c.moveTo(g,f),c.resizeTo(a,b)),c.focus(),c.location.href=e}catch(h){window.open(e,null,d,!0)}return!0}});(function(){function g(a,c){var d=[];if(c)for(var b in c)d.push(b+"="+encodeURIComponent(c[b]));else return a;return a+(-1!=a.indexOf("?")?"&":"?")+d.join("&")}function i(a){a+="";return a.charAt(0).toUpperCase()+a.substr(1)}function k(){var a=this.getDialog(),c=a.getParentEditor();c._.filebrowserSe=this;var d=c.config["filebrowser"+i(a.getName())+"WindowWidth"]||c.config.filebrowserWindowWidth||"80%",a=c.config["filebrowser"+i(a.getName())+"WindowHeight"]||c.config.filebrowserWindowHeight||"70%", +b=this.filebrowser.params||{};b.CKEditor=c.name;b.CKEditorFuncNum=c._.filebrowserFn;b.langCode||(b.langCode=c.langCode);b=g(this.filebrowser.url,b);c.popup(b,d,a,c.config.filebrowserWindowFeatures||c.config.fileBrowserWindowFeatures)}function l(){var a=this.getDialog();a.getParentEditor()._.filebrowserSe=this;return!a.getContentElement(this["for"][0],this["for"][1]).getInputElement().$.value||!a.getContentElement(this["for"][0],this["for"][1]).getAction()?!1:!0}function m(a,c,d){var b=d.params||{}; +b.CKEditor=a.name;b.CKEditorFuncNum=a._.filebrowserFn;b.langCode||(b.langCode=a.langCode);c.action=g(d.url,b);c.filebrowser=d}function j(a,c,d,b){if(b&&b.length)for(var e,g=b.length;g--;)if(e=b[g],("hbox"==e.type||"vbox"==e.type||"fieldset"==e.type)&&j(a,c,d,e.children),e.filebrowser)if("string"==typeof e.filebrowser&&(e.filebrowser={action:"fileButton"==e.type?"QuickUpload":"Browse",target:e.filebrowser}),"Browse"==e.filebrowser.action){var f=e.filebrowser.url;void 0===f&&(f=a.config["filebrowser"+ +i(c)+"BrowseUrl"],void 0===f&&(f=a.config.filebrowserBrowseUrl));f&&(e.onClick=k,e.filebrowser.url=f,e.hidden=!1)}else if("QuickUpload"==e.filebrowser.action&&e["for"]&&(f=e.filebrowser.url,void 0===f&&(f=a.config["filebrowser"+i(c)+"UploadUrl"],void 0===f&&(f=a.config.filebrowserUploadUrl)),f)){var h=e.onClick;e.onClick=function(a){var b=a.sender;return h&&h.call(b,a)===false?false:l.call(b,a)};e.filebrowser.url=f;e.hidden=!1;m(a,d.getContents(e["for"][0]).get(e["for"][1]),e.filebrowser)}}function h(a, +c,d){if(-1!==d.indexOf(";")){for(var d=d.split(";"),b=0;b<d.length;b++)if(h(a,c,d[b]))return!0;return!1}return(a=a.getContents(c).get(d).filebrowser)&&a.url}function n(a,c){var d=this._.filebrowserSe.getDialog(),b=this._.filebrowserSe["for"],e=this._.filebrowserSe.filebrowser.onSelect;b&&d.getContentElement(b[0],b[1]).reset();if(!("function"==typeof c&&!1===c.call(this._.filebrowserSe))&&!(e&&!1===e.call(this._.filebrowserSe,a,c))&&("string"==typeof c&&c&&alert(c),a&&(b=this._.filebrowserSe,d=b.getDialog(), +b=b.filebrowser.target||null)))if(b=b.split(":"),e=d.getContentElement(b[0],b[1]))e.setValue(a),d.selectPage(b[0])}CKEDITOR.plugins.add("filebrowser",{requires:"popup",init:function(a){a._.filebrowserFn=CKEDITOR.tools.addFunction(n,a);a.on("destroy",function(){CKEDITOR.tools.removeFunction(this._.filebrowserFn)})}});CKEDITOR.on("dialogDefinition",function(a){if(a.editor.plugins.filebrowser)for(var c=a.data.definition,d,b=0;b<c.contents.length;++b)if(d=c.contents[b])j(a.editor,a.data.name,c,d.elements), +d.hidden&&d.filebrowser&&(d.hidden=!h(c,d.id,d.filebrowser))})})();(function(){function q(a){var i=a.config,l=a.fire("uiSpace",{space:"top",html:""}).html,o=function(){function f(a,c,e){b.setStyle(c,t(e));b.setStyle("position",a)}function e(a){var b=r.getDocumentPosition();switch(a){case "top":f("absolute","top",b.y-m-n);break;case "pin":f("fixed","top",q);break;case "bottom":f("absolute","top",b.y+(c.height||c.bottom-c.top)+n)}j=a}var j,r,k,c,h,m,s,l=i.floatSpaceDockedOffsetX||0,n=i.floatSpaceDockedOffsetY||0,p=i.floatSpacePinnedOffsetX||0,q=i.floatSpacePinnedOffsetY|| +0;return function(d){if(r=a.editable())if(d&&"focus"==d.name&&b.show(),b.removeStyle("left"),b.removeStyle("right"),k=b.getClientRect(),c=r.getClientRect(),h=g.getViewPaneSize(),m=k.height,s="pageXOffset"in g.$?g.$.pageXOffset:CKEDITOR.document.$.documentElement.scrollLeft,j){m+n<=c.top?e("top"):m+n>h.height-c.bottom?e("pin"):e("bottom");var d=h.width/2,d=0<c.left&&c.right<h.width&&c.width>k.width?"rtl"==a.config.contentsLangDirection?"right":"left":d-c.left>c.right-d?"left":"right",f;k.width>h.width? +(d="left",f=0):(f="left"==d?0<c.left?c.left:0:c.right<h.width?h.width-c.right:0,f+k.width>h.width&&(d="left"==d?"right":"left",f=0));b.setStyle(d,t(("pin"==j?p:l)+f+("pin"==j?0:"left"==d?s:-s)))}else j="pin",e("pin"),o(d)}}();if(l){var b=CKEDITOR.document.getBody().append(CKEDITOR.dom.element.createFromHtml(u.output({content:l,id:a.id,langDir:a.lang.dir,langCode:a.langCode,name:a.name,style:"display:none;z-index:"+(i.baseFloatZIndex-1),topId:a.ui.spaceId("top"),voiceLabel:a.lang.editorPanel+", "+ +a.name}))),p=CKEDITOR.tools.eventsBuffer(500,o),e=CKEDITOR.tools.eventsBuffer(100,o);b.unselectable();b.on("mousedown",function(a){a=a.data;a.getTarget().hasAscendant("a",1)||a.preventDefault()});a.on("focus",function(b){o(b);a.on("change",p.input);g.on("scroll",e.input);g.on("resize",e.input)});a.on("blur",function(){b.hide();a.removeListener("change",p.input);g.removeListener("scroll",e.input);g.removeListener("resize",e.input)});a.on("destroy",function(){g.removeListener("scroll",e.input);g.removeListener("resize", +e.input);b.clearCustomData();b.remove()});a.focusManager.hasFocus&&b.show();a.focusManager.add(b,1)}}var u=CKEDITOR.addTemplate("floatcontainer",'<div id="cke_{name}" class="cke {id} cke_reset_all cke_chrome cke_editor_{name} cke_float cke_{langDir} '+CKEDITOR.env.cssClass+'" dir="{langDir}" title="'+(CKEDITOR.env.gecko?" ":"")+'" lang="{langCode}" role="application" style="{style}" aria-labelledby="cke_{name}_arialbl"><span id="cke_{name}_arialbl" class="cke_voice_label">{voiceLabel}</span><div class="cke_inner"><div id="{topId}" class="cke_top" role="presentation">{content}</div></div></div>'), +g=CKEDITOR.document.getWindow(),t=CKEDITOR.tools.cssLength;CKEDITOR.plugins.add("floatingspace",{init:function(a){a.on("loaded",function(){q(this)},null,null,20)}})})();CKEDITOR.plugins.add("listblock",{requires:"panel",onLoad:function(){var f=CKEDITOR.addTemplate("panel-list",'<ul role="presentation" class="cke_panel_list">{items}</ul>'),g=CKEDITOR.addTemplate("panel-list-item",'<li id="{id}" class="cke_panel_listItem" role=presentation><a id="{id}_option" _cke_focus=1 hidefocus=true title="{title}" href="javascript:void(\'{val}\')" {onclick}="CKEDITOR.tools.callFunction({clickFn},\'{val}\'); return false;" role="option">{text}</a></li>'),h=CKEDITOR.addTemplate("panel-list-group", +'<h1 id="{id}" class="cke_panel_grouptitle" role="presentation" >{label}</h1>'),i=/\'/g;CKEDITOR.ui.panel.prototype.addListBlock=function(a,b){return this.addBlock(a,new CKEDITOR.ui.listBlock(this.getHolderElement(),b))};CKEDITOR.ui.listBlock=CKEDITOR.tools.createClass({base:CKEDITOR.ui.panel.block,$:function(a,b){var b=b||{},c=b.attributes||(b.attributes={});(this.multiSelect=!!b.multiSelect)&&(c["aria-multiselectable"]=!0);!c.role&&(c.role="listbox");this.base.apply(this,arguments);this.element.setAttribute("role", +c.role);c=this.keys;c[40]="next";c[9]="next";c[38]="prev";c[CKEDITOR.SHIFT+9]="prev";c[32]=CKEDITOR.env.ie?"mouseup":"click";CKEDITOR.env.ie&&(c[13]="mouseup");this._.pendingHtml=[];this._.pendingList=[];this._.items={};this._.groups={}},_:{close:function(){if(this._.started){var a=f.output({items:this._.pendingList.join("")});this._.pendingList=[];this._.pendingHtml.push(a);delete this._.started}},getClick:function(){this._.click||(this._.click=CKEDITOR.tools.addFunction(function(a){var b=this.toggle(a); +if(this.onClick)this.onClick(a,b)},this));return this._.click}},proto:{add:function(a,b,c){var d=CKEDITOR.tools.getNextId();this._.started||(this._.started=1,this._.size=this._.size||0);this._.items[a]=d;var e;e=CKEDITOR.tools.htmlEncodeAttr(a).replace(i,"\\'");a={id:d,val:e,onclick:CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick",clickFn:this._.getClick(),title:CKEDITOR.tools.htmlEncodeAttr(c||a),text:b||a};this._.pendingList.push(g.output(a))},startGroup:function(a){this._.close(); +var b=CKEDITOR.tools.getNextId();this._.groups[a]=b;this._.pendingHtml.push(h.output({id:b,label:a}))},commit:function(){this._.close();this.element.appendHtml(this._.pendingHtml.join(""));delete this._.size;this._.pendingHtml=[]},toggle:function(a){var b=this.isMarked(a);b?this.unmark(a):this.mark(a);return!b},hideGroup:function(a){var b=(a=this.element.getDocument().getById(this._.groups[a]))&&a.getNext();a&&(a.setStyle("display","none"),b&&"ul"==b.getName()&&b.setStyle("display","none"))},hideItem:function(a){this.element.getDocument().getById(this._.items[a]).setStyle("display", +"none")},showAll:function(){var a=this._.items,b=this._.groups,c=this.element.getDocument(),d;for(d in a)c.getById(a[d]).setStyle("display","");for(var e in b)a=c.getById(b[e]),d=a.getNext(),a.setStyle("display",""),d&&"ul"==d.getName()&&d.setStyle("display","")},mark:function(a){this.multiSelect||this.unmarkAll();var a=this._.items[a],b=this.element.getDocument().getById(a);b.addClass("cke_selected");this.element.getDocument().getById(a+"_option").setAttribute("aria-selected",!0);this.onMark&&this.onMark(b)}, +unmark:function(a){var b=this.element.getDocument(),a=this._.items[a],c=b.getById(a);c.removeClass("cke_selected");b.getById(a+"_option").removeAttribute("aria-selected");this.onUnmark&&this.onUnmark(c)},unmarkAll:function(){var a=this._.items,b=this.element.getDocument(),c;for(c in a){var d=a[c];b.getById(d).removeClass("cke_selected");b.getById(d+"_option").removeAttribute("aria-selected")}this.onUnmark&&this.onUnmark()},isMarked:function(a){return this.element.getDocument().getById(this._.items[a]).hasClass("cke_selected")}, +focus:function(a){this._.focusIndex=-1;var b=this.element.getElementsByTag("a"),c,d=-1;if(a)for(c=this.element.getDocument().getById(this._.items[a]).getFirst();a=b.getItem(++d);){if(a.equals(c)){this._.focusIndex=d;break}}else this.element.focus();c&&setTimeout(function(){c.focus()},0)}}})}});CKEDITOR.plugins.add("richcombo",{requires:"floatpanel,listblock,button",beforeInit:function(d){d.ui.addHandler(CKEDITOR.UI_RICHCOMBO,CKEDITOR.ui.richCombo.handler)}}); +(function(){var d='<span id="{id}" class="cke_combo cke_combo__{name} {cls}" role="presentation"><span id="{id}_label" class="cke_combo_label">{label}</span><a class="cke_combo_button" hidefocus=true title="{title}" tabindex="-1"'+(CKEDITOR.env.gecko&&10900<=CKEDITOR.env.version&&!CKEDITOR.env.hc?"":'" href="javascript:void(\'{titleJs}\')"')+' hidefocus="true" role="button" aria-labelledby="{id}_label" aria-haspopup="true"';if(CKEDITOR.env.opera||CKEDITOR.env.gecko&&CKEDITOR.env.mac)d+=' onkeypress="return false;"'; +CKEDITOR.env.gecko&&(d+=' onblur="this.style.cssText = this.style.cssText;"');var d=d+(' onkeydown="return CKEDITOR.tools.callFunction({keydownFn},event,this);" onmousedown="return CKEDITOR.tools.callFunction({mousedownFn},event);" onfocus="return CKEDITOR.tools.callFunction({focusFn},event);" '+(CKEDITOR.env.ie?'onclick="return false;" onmouseup':"onclick")+'="CKEDITOR.tools.callFunction({clickFn},this);return false;"><span id="{id}_text" class="cke_combo_text cke_combo_inlinelabel">{label}</span><span class="cke_combo_open"><span class="cke_combo_arrow">'+ +(CKEDITOR.env.hc?"&#9660;":CKEDITOR.env.air?"&nbsp;":"")+"</span></span></a></span>"),i=CKEDITOR.addTemplate("combo",d);CKEDITOR.UI_RICHCOMBO="richcombo";CKEDITOR.ui.richCombo=CKEDITOR.tools.createClass({$:function(a){CKEDITOR.tools.extend(this,a,{canGroup:!1,title:a.label,modes:{wysiwyg:1},editorFocus:1});a=this.panel||{};delete this.panel;this.id=CKEDITOR.tools.getNextNumber();this.document=a.parent&&a.parent.getDocument()||CKEDITOR.document;a.className="cke_combopanel";a.block={multiSelect:a.multiSelect, +attributes:a.attributes};a.toolbarRelated=!0;this._={panelDefinition:a,items:{}}},proto:{renderHtml:function(a){var b=[];this.render(a,b);return b.join("")},render:function(a,b){function g(){var c=this.modes[a.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED;a.readOnly&&!this.readOnly&&(c=CKEDITOR.TRISTATE_DISABLED);this.setState(c);this.setValue("");c!=CKEDITOR.TRISTATE_DISABLED&&this.refresh&&this.refresh()}var d=CKEDITOR.env,h="cke_"+this.id,e=CKEDITOR.tools.addFunction(function(b){j&&(a.unlockSelection(1), +j=0);c.execute(b)},this),f=this,c={id:h,combo:this,focus:function(){CKEDITOR.document.getById(h).getChild(1).focus()},execute:function(c){var b=f._;if(b.state!=CKEDITOR.TRISTATE_DISABLED)if(f.createPanel(a),b.on)b.panel.hide();else{f.commit();var d=f.getValue();d?b.list.mark(d):b.list.unmarkAll();b.panel.showBlock(f.id,new CKEDITOR.dom.element(c),4)}},clickFn:e};a.on("activeFilterChange",g,this);a.on("mode",g,this);!this.readOnly&&a.on("readOnly",g,this);var k=CKEDITOR.tools.addFunction(function(b, +d){var b=new CKEDITOR.dom.event(b),g=b.getKeystroke();if(40==g)a.once("panelShow",function(a){a.data._.panel._.currentBlock.onKeyDown(40)});switch(g){case 13:case 32:case 40:CKEDITOR.tools.callFunction(e,d);break;default:c.onkey(c,g)}b.preventDefault()}),l=CKEDITOR.tools.addFunction(function(){c.onfocus&&c.onfocus()}),j=0,m=CKEDITOR.tools.addFunction(function(){if(CKEDITOR.env.opera){var b=a.editable();b.isInline()&&b.hasFocus&&(a.lockSelection(),j=1)}});c.keyDownFn=k;d={id:h,name:this.name||this.command, +label:this.label,title:this.title,cls:this.className||"",titleJs:d.gecko&&10900<=d.version&&!d.hc?"":(this.title||"").replace("'",""),keydownFn:k,mousedownFn:m,focusFn:l,clickFn:e};i.output(d,b);if(this.onRender)this.onRender();return c},createPanel:function(a){if(!this._.panel){var b=this._.panelDefinition,d=this._.panelDefinition.block,i=b.parent||CKEDITOR.document.getBody(),h="cke_combopanel__"+this.name,e=new CKEDITOR.ui.floatPanel(a,i,b),f=e.addListBlock(this.id,d),c=this;e.onShow=function(){this.element.addClass(h); +c.setState(CKEDITOR.TRISTATE_ON);c._.on=1;c.editorFocus&&!a.focusManager.hasFocus&&a.focus();if(c.onOpen)c.onOpen();a.once("panelShow",function(){f.focus(!f.multiSelect&&c.getValue())})};e.onHide=function(b){this.element.removeClass(h);c.setState(c.modes&&c.modes[a.mode]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED);c._.on=0;if(!b&&c.onClose)c.onClose()};e.onEscape=function(){e.hide(1)};f.onClick=function(a,b){c.onClick&&c.onClick.call(c,a,b);e.hide()};this._.panel=e;this._.list=f;e.getBlock(this.id).onHide= +function(){c._.on=0;c.setState(CKEDITOR.TRISTATE_OFF)};this.init&&this.init()}},setValue:function(a,b){this._.value=a;var d=this.document.getById("cke_"+this.id+"_text");d&&(!a&&!b?(b=this.label,d.addClass("cke_combo_inlinelabel")):d.removeClass("cke_combo_inlinelabel"),d.setText("undefined"!=typeof b?b:a))},getValue:function(){return this._.value||""},unmarkAll:function(){this._.list.unmarkAll()},mark:function(a){this._.list.mark(a)},hideItem:function(a){this._.list.hideItem(a)},hideGroup:function(a){this._.list.hideGroup(a)}, +showAll:function(){this._.list.showAll()},add:function(a,b,d){this._.items[a]=d||a;this._.list.add(a,b,d)},startGroup:function(a){this._.list.startGroup(a)},commit:function(){this._.committed||(this._.list.commit(),this._.committed=1,CKEDITOR.ui.fire("ready",this));this._.committed=1},setState:function(a){if(this._.state!=a){var b=this.document.getById("cke_"+this.id);b.setState(a,"cke_combo");a==CKEDITOR.TRISTATE_DISABLED?b.setAttribute("aria-disabled",!0):b.removeAttribute("aria-disabled");this._.state= +a}},getState:function(){return this._.state},enable:function(){this._.state==CKEDITOR.TRISTATE_DISABLED&&this.setState(this._.lastState)},disable:function(){this._.state!=CKEDITOR.TRISTATE_DISABLED&&(this._.lastState=this._.state,this.setState(CKEDITOR.TRISTATE_DISABLED))}},statics:{handler:{create:function(a){return new CKEDITOR.ui.richCombo(a)}}}});CKEDITOR.ui.prototype.addRichCombo=function(a,b){this.add(a,CKEDITOR.UI_RICHCOMBO,b)}})();CKEDITOR.plugins.add("format",{requires:"richcombo",init:function(a){if(!a.blockless){for(var f=a.config,c=a.lang.format,j=f.format_tags.split(";"),d={},k=0,l=[],g=0;g<j.length;g++){var h=j[g],i=new CKEDITOR.style(f["format_"+h]);if(!a.filter.customConfig||a.filter.check(i))k++,d[h]=i,d[h]._.enterMode=a.config.enterMode,l.push(i)}0!==k&&a.ui.addRichCombo("Format",{label:c.label,title:c.panelTitle,toolbar:"styles,20",allowedContent:l,panel:{css:[CKEDITOR.skin.getPath("editor")].concat(f.contentsCss), +multiSelect:!1,attributes:{"aria-label":c.panelTitle}},init:function(){this.startGroup(c.panelTitle);for(var b in d){var a=c["tag_"+b];this.add(b,d[b].buildPreview(a),a)}},onClick:function(b){a.focus();a.fire("saveSnapshot");var b=d[b],c=a.elementPath();a[b.checkActive(c)?"removeStyle":"applyStyle"](b);setTimeout(function(){a.fire("saveSnapshot")},0)},onRender:function(){a.on("selectionChange",function(b){var c=this.getValue(),b=b.data.path;this.refresh();for(var e in d)if(d[e].checkActive(b)){e!= +c&&this.setValue(e,a.lang.format["tag_"+e]);return}this.setValue("")},this)},onOpen:function(){this.showAll();for(var b in d)a.activeFilter.check(d[b])||this.hideItem(b)},refresh:function(){var b=a.elementPath();if(b){if(b.isContextFor("p"))for(var c in d)if(a.activeFilter.check(d[c]))return;this.setState(CKEDITOR.TRISTATE_DISABLED)}}})}}});CKEDITOR.config.format_tags="p;h1;h2;h3;h4;h5;h6;pre;address;div";CKEDITOR.config.format_p={element:"p"};CKEDITOR.config.format_div={element:"div"}; +CKEDITOR.config.format_pre={element:"pre"};CKEDITOR.config.format_address={element:"address"};CKEDITOR.config.format_h1={element:"h1"};CKEDITOR.config.format_h2={element:"h2"};CKEDITOR.config.format_h3={element:"h3"};CKEDITOR.config.format_h4={element:"h4"};CKEDITOR.config.format_h5={element:"h5"};CKEDITOR.config.format_h6={element:"h6"};(function(){var b={canUndo:!1,exec:function(a){var b=a.document.createElement("hr");a.insertElement(b)},allowedContent:"hr",requiredContent:"hr"};CKEDITOR.plugins.add("horizontalrule",{init:function(a){a.blockless||(a.addCommand("horizontalrule",b),a.ui.addButton&&a.ui.addButton("HorizontalRule",{label:a.lang.horizontalrule.toolbar,command:"horizontalrule",toolbar:"insert,40"}))}})})();CKEDITOR.plugins.add("htmlwriter",{init:function(b){var a=new CKEDITOR.htmlWriter;a.forceSimpleAmpersand=b.config.forceSimpleAmpersand;a.indentationChars=b.config.dataIndentationChars||"\t";b.dataProcessor.writer=a}}); +CKEDITOR.htmlWriter=CKEDITOR.tools.createClass({base:CKEDITOR.htmlParser.basicWriter,$:function(){this.base();this.indentationChars="\t";this.selfClosingEnd=" />";this.lineBreakChars="\n";this.sortAttributes=1;this._.indent=0;this._.indentation="";this._.inPre=0;this._.rules={};var b=CKEDITOR.dtd,a;for(a in CKEDITOR.tools.extend({},b.$nonBodyContent,b.$block,b.$listItem,b.$tableContent))this.setRules(a,{indent:!b[a]["#"],breakBeforeOpen:1,breakBeforeClose:!b[a]["#"],breakAfterClose:1,needsSpace:a in +b.$block&&!(a in{li:1,dt:1,dd:1})});this.setRules("br",{breakAfterOpen:1});this.setRules("title",{indent:0,breakAfterOpen:0});this.setRules("style",{indent:0,breakBeforeClose:1});this.setRules("pre",{breakAfterOpen:1,indent:0})},proto:{openTag:function(b){var a=this._.rules[b];this._.afterCloser&&(a&&a.needsSpace&&this._.needsSpace)&&this._.output.push("\n");this._.indent?this.indentation():a&&a.breakBeforeOpen&&(this.lineBreak(),this.indentation());this._.output.push("<",b);this._.afterCloser=0}, +openTagClose:function(b,a){var c=this._.rules[b];a?(this._.output.push(this.selfClosingEnd),c&&c.breakAfterClose&&(this._.needsSpace=c.needsSpace)):(this._.output.push(">"),c&&c.indent&&(this._.indentation+=this.indentationChars));c&&c.breakAfterOpen&&this.lineBreak();"pre"==b&&(this._.inPre=1)},attribute:function(b,a){"string"==typeof a&&(this.forceSimpleAmpersand&&(a=a.replace(/&amp;/g,"&")),a=CKEDITOR.tools.htmlEncodeAttr(a));this._.output.push(" ",b,'="',a,'"')},closeTag:function(b){var a=this._.rules[b]; +a&&a.indent&&(this._.indentation=this._.indentation.substr(this.indentationChars.length));this._.indent?this.indentation():a&&a.breakBeforeClose&&(this.lineBreak(),this.indentation());this._.output.push("</",b,">");"pre"==b&&(this._.inPre=0);a&&a.breakAfterClose&&(this.lineBreak(),this._.needsSpace=a.needsSpace);this._.afterCloser=1},text:function(b){this._.indent&&(this.indentation(),!this._.inPre&&(b=CKEDITOR.tools.ltrim(b)));this._.output.push(b)},comment:function(b){this._.indent&&this.indentation(); +this._.output.push("<\!--",b,"--\>")},lineBreak:function(){!this._.inPre&&0<this._.output.length&&this._.output.push(this.lineBreakChars);this._.indent=1},indentation:function(){!this._.inPre&&this._.indentation&&this._.output.push(this._.indentation);this._.indent=0},reset:function(){this._.output=[];this._.indent=0;this._.indentation="";this._.afterCloser=0;this._.inPre=0},setRules:function(b,a){var c=this._.rules[b];c?CKEDITOR.tools.extend(c,a,!0):this._.rules[b]=a}}});(function(){function k(a){var d=this.editor,b=a.document,c=b.body;(a=b.getElementById("cke_actscrpt"))&&a.parentNode.removeChild(a);(a=b.getElementById("cke_shimscrpt"))&&a.parentNode.removeChild(a);CKEDITOR.env.gecko&&(c.contentEditable=!1,2E4>CKEDITOR.env.version&&(c.innerHTML=c.innerHTML.replace(/^.*<\!-- cke-content-start --\>/,""),setTimeout(function(){var a=new CKEDITOR.dom.range(new CKEDITOR.dom.document(b));a.setStart(new CKEDITOR.dom.node(c),0);d.getSelection().selectRanges([a])},0)));c.contentEditable= +!0;CKEDITOR.env.ie&&(c.hideFocus=!0,c.disabled=!0,c.removeAttribute("disabled"));delete this._.isLoadingData;this.$=c;b=new CKEDITOR.dom.document(b);this.setup();CKEDITOR.env.ie&&(b.getDocumentElement().addClass(b.$.compatMode),d.config.enterMode!=CKEDITOR.ENTER_P&&this.attachListener(b,"selectionchange",function(){var a=b.getBody(),c=d.getSelection(),e=c&&c.getRanges()[0];e&&(a.getHtml().match(/^<p>(?:&nbsp;|<br>)<\/p>$/i)&&e.startContainer.equals(a))&&setTimeout(function(){e=d.getSelection().getRanges()[0]; +if(!e.startContainer.equals("body")){a.getFirst().remove(1);e.moveToElementEditEnd(a);e.select()}},0)}));if(CKEDITOR.env.webkit||CKEDITOR.env.ie&&10<CKEDITOR.env.version)b.getDocumentElement().on("mousedown",function(a){a.data.getTarget().is("html")&&setTimeout(function(){d.editable().focus()})});try{d.document.$.execCommand("2D-position",!1,!0)}catch(e){}try{d.document.$.execCommand("enableInlineTableEditing",!1,!d.config.disableNativeTableHandles)}catch(g){}if(d.config.disableObjectResizing)try{this.getDocument().$.execCommand("enableObjectResizing", +!1,!1)}catch(f){this.attachListener(this,CKEDITOR.env.ie?"resizestart":"resize",function(a){a.data.preventDefault()})}(CKEDITOR.env.gecko||CKEDITOR.env.ie&&"CSS1Compat"==d.document.$.compatMode)&&this.attachListener(this,"keydown",function(a){var b=a.data.getKeystroke();if(b==33||b==34)if(CKEDITOR.env.ie)setTimeout(function(){d.getSelection().scrollIntoView()},0);else if(d.window.$.innerHeight>this.$.offsetHeight){var c=d.createRange();c[b==33?"moveToElementEditStart":"moveToElementEditEnd"](this); +c.select();a.data.preventDefault()}});CKEDITOR.env.ie&&this.attachListener(b,"blur",function(){try{b.$.selection.empty()}catch(a){}});d.document.getElementsByTag("title").getItem(0).data("cke-title",d.document.$.title);CKEDITOR.env.ie&&(d.document.$.title=this._.docTitle);CKEDITOR.tools.setTimeout(function(){d.fire("contentDom");if(this._.isPendingFocus){d.focus();this._.isPendingFocus=false}setTimeout(function(){d.fire("dataReady")},0);CKEDITOR.env.ie&&setTimeout(function(){if(d.document){var a= +d.document.$.body;a.runtimeStyle.marginBottom="0px";a.runtimeStyle.marginBottom=""}},1E3)},0,this)}function l(){var a=[];if(8<=CKEDITOR.document.$.documentMode){a.push("html.CSS1Compat [contenteditable=false]{min-height:0 !important}");var d=[],b;for(b in CKEDITOR.dtd.$removeEmpty)d.push("html.CSS1Compat "+b+"[contenteditable=false]");a.push(d.join(",")+"{display:inline-block}")}else CKEDITOR.env.gecko&&(a.push("html{height:100% !important}"),a.push("img:-moz-broken{-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}")); +a.push("html{cursor:text;*cursor:auto}");a.push("img,input,textarea{cursor:default}");return a.join("\n")}CKEDITOR.plugins.add("wysiwygarea",{init:function(a){a.config.fullPage&&a.addFeature({allowedContent:"html head title; style [media,type]; body (*)[id]; meta link [*]",requiredContent:"body"});a.addMode("wysiwyg",function(d){function b(b){b&&b.removeListener();a.editable(new j(a,e.$.contentWindow.document.body));a.setData(a.getData(1),d)}var c="document.open();"+(CKEDITOR.env.ie?"("+CKEDITOR.tools.fixDomain+ +")();":"")+"document.close();",c=CKEDITOR.env.air?"javascript:void(0)":CKEDITOR.env.ie?"javascript:void(function(){"+encodeURIComponent(c)+"}())":"",e=CKEDITOR.dom.element.createFromHtml('<iframe src="'+c+'" frameBorder="0"></iframe>');e.setStyles({width:"100%",height:"100%"});e.addClass("cke_wysiwyg_frame cke_reset");var g=a.ui.space("contents");g.append(e);if(c=CKEDITOR.env.ie||CKEDITOR.env.gecko)e.on("load",b);var f=a.title,h=a.lang.common.editorHelp;f&&(CKEDITOR.env.ie&&(f+=", "+h),e.setAttribute("title", +f));var f=CKEDITOR.tools.getNextId(),i=CKEDITOR.dom.element.createFromHtml('<span id="'+f+'" class="cke_voice_label">'+h+"</span>");g.append(i,1);a.on("beforeModeUnload",function(a){a.removeListener();i.remove()});e.setAttributes({"aria-describedby":f,tabIndex:a.tabIndex,allowTransparency:"true"});!c&&b();CKEDITOR.env.webkit&&(c=function(){g.setStyle("width","100%");e.hide();e.setSize("width",g.getSize("width"));g.removeStyle("width");e.show()},e.setCustomData("onResize",c),CKEDITOR.document.getWindow().on("resize", +c));a.fire("ariaWidget",e)})}});var j=CKEDITOR.tools.createClass({$:function(a){this.base.apply(this,arguments);this._.frameLoadedHandler=CKEDITOR.tools.addFunction(function(a){CKEDITOR.tools.setTimeout(k,0,this,a)},this);this._.docTitle=this.getWindow().getFrame().getAttribute("title")},base:CKEDITOR.editable,proto:{setData:function(a,d){var b=this.editor;if(d)this.setHtml(a),b.fire("dataReady");else{this._.isLoadingData=!0;b._.dataStore={id:1};var c=b.config,e=c.fullPage,g=c.docType,f=CKEDITOR.tools.buildStyleHtml(l()).replace(/<style>/, +'<style data-cke-temp="1">');e||(f+=CKEDITOR.tools.buildStyleHtml(b.config.contentsCss));var h=c.baseHref?'<base href="'+c.baseHref+'" data-cke-temp="1" />':"";e&&(a=a.replace(/<!DOCTYPE[^>]*>/i,function(a){b.docType=g=a;return""}).replace(/<\?xml\s[^\?]*\?>/i,function(a){b.xmlDeclaration=a;return""}));a=b.dataProcessor.toHtml(a);e?(/<body[\s|>]/.test(a)||(a="<body>"+a),/<html[\s|>]/.test(a)||(a="<html>"+a+"</html>"),/<head[\s|>]/.test(a)?/<title[\s|>]/.test(a)||(a=a.replace(/<head[^>]*>/,"$&<title></title>")): +a=a.replace(/<html[^>]*>/,"$&<head><title></title></head>"),h&&(a=a.replace(/<head>/,"$&"+h)),a=a.replace(/<\/head\s*>/,f+"$&"),a=g+a):a=c.docType+'<html dir="'+c.contentsLangDirection+'" lang="'+(c.contentsLanguage||b.langCode)+'"><head><title>'+this._.docTitle+"</title>"+h+f+"</head><body"+(c.bodyId?' id="'+c.bodyId+'"':"")+(c.bodyClass?' class="'+c.bodyClass+'"':"")+">"+a+"</body></html>";CKEDITOR.env.gecko&&(a=a.replace(/<body/,'<body contenteditable="true" '),2E4>CKEDITOR.env.version&&(a=a.replace(/<body[^>]*>/, +"$&<\!-- cke-content-start --\>")));c='<script id="cke_actscrpt" type="text/javascript"'+(CKEDITOR.env.ie?' defer="defer" ':"")+">var wasLoaded=0;function onload(){if(!wasLoaded)window.parent.CKEDITOR.tools.callFunction("+this._.frameLoadedHandler+",window);wasLoaded=1;}"+(CKEDITOR.env.ie?"onload();":'document.addEventListener("DOMContentLoaded", onload, false );')+"<\/script>";CKEDITOR.env.ie&&9>CKEDITOR.env.version&&(c+='<script id="cke_shimscrpt">window.parent.CKEDITOR.tools.enableHtml5Elements(document)<\/script>'); +a=a.replace(/(?=\s*<\/(:?head)>)/,c);this.clearCustomData();this.clearListeners();b.fire("contentDomUnload");var i=this.getDocument();try{i.write(a)}catch(j){setTimeout(function(){i.write(a)},0)}}},getData:function(a){if(a)return this.getHtml();var a=this.editor,d=a.config,b=d.fullPage,c=b&&a.docType,e=b&&a.xmlDeclaration,g=this.getDocument(),b=b?g.getDocumentElement().getOuterHtml():g.getBody().getHtml();CKEDITOR.env.gecko&&d.enterMode!=CKEDITOR.ENTER_BR&&(b=b.replace(/<br>(?=\s*(:?$|<\/body>))/, +""));b=a.dataProcessor.toDataFormat(b);e&&(b=e+"\n"+b);c&&(b=c+"\n"+b);return b},focus:function(){this._.isLoadingData?this._.isPendingFocus=!0:j.baseProto.focus.call(this)},detach:function(){var a=this.editor,d=a.document,b=a.window.getFrame();j.baseProto.detach.call(this);this.clearCustomData();d.getDocumentElement().clearCustomData();b.clearCustomData();CKEDITOR.tools.removeFunction(this._.frameLoadedHandler);(d=b.removeCustomData("onResize"))&&d.removeListener();a.fire("contentDomUnload");b.remove()}}})})(); +CKEDITOR.config.disableObjectResizing=!1;CKEDITOR.config.disableNativeTableHandles=!0;CKEDITOR.config.disableNativeSpellChecker=!0;CKEDITOR.config.contentsCss=CKEDITOR.basePath+"contents.css";(function(){function e(b,a){a||(a=b.getSelection().getSelectedElement());if(a&&a.is("img")&&!a.data("cke-realelement")&&!a.isReadOnly())return a}function f(b){var a=b.getStyle("float");if("inherit"==a||"none"==a)a=0;a||(a=b.getAttribute("align"));return a}CKEDITOR.plugins.add("image",{requires:"dialog",init:function(b){if(!b.plugins.image2){CKEDITOR.dialog.add("image",this.path+"dialogs/image.js");var a="img[alt,!src]{border-style,border-width,float,height,margin,margin-bottom,margin-left,margin-right,margin-top,width}"; +CKEDITOR.dialog.isTabEnabled(b,"image","advanced")&&(a="img[alt,dir,id,lang,longdesc,!src,title]{*}(*)");b.addCommand("image",new CKEDITOR.dialogCommand("image",{allowedContent:a,requiredContent:"img[alt,src]",contentTransformations:[["img{width}: sizeToStyle","img[width]: sizeToAttribute"],["img{float}: alignmentToStyle","img[align]: alignmentToAttribute"]]}));b.ui.addButton&&b.ui.addButton("Image",{label:b.lang.common.image,command:"image",toolbar:"insert,10"});b.on("doubleclick",function(b){var a= +b.data.element;a.is("img")&&(!a.data("cke-realelement")&&!a.isReadOnly())&&(b.data.dialog="image")});b.addMenuItems&&b.addMenuItems({image:{label:b.lang.image.menu,command:"image",group:"image"}});b.contextMenu&&b.contextMenu.addListener(function(a){if(e(b,a))return{image:CKEDITOR.TRISTATE_OFF}})}},afterInit:function(b){function a(a){var d=b.getCommand("justify"+a);if(d){if("left"==a||"right"==a)d.on("exec",function(d){var c=e(b),g;c&&(g=f(c),g==a?(c.removeStyle("float"),a==f(c)&&c.removeAttribute("align")): +c.setStyle("float",a),d.cancel())});d.on("refresh",function(d){var c=e(b);c&&(c=f(c),this.setState(c==a?CKEDITOR.TRISTATE_ON:"right"==a||"left"==a?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED),d.cancel())})}}b.plugins.image2||(a("left"),a("right"),a("center"),a("block"))}})})();CKEDITOR.config.image_removeLinkByEmptyURL=!0;(function(){function k(a,b){var e,f;b.on("refresh",function(a){var b=[i],c;for(c in a.data.states)b.push(a.data.states[c]);this.setState(CKEDITOR.tools.search(b,m)?m:i)},b,null,100);b.on("exec",function(b){e=a.getSelection();f=e.createBookmarks(1);b.data||(b.data={});b.data.done=!1},b,null,0);b.on("exec",function(){a.forceNextSelectionCheck();e.selectBookmarks(f)},b,null,100)}var i=CKEDITOR.TRISTATE_DISABLED,m=CKEDITOR.TRISTATE_OFF;CKEDITOR.plugins.add("indent",{init:function(a){var b=CKEDITOR.plugins.indent.genericDefinition; +k(a,a.addCommand("indent",new b(!0)));k(a,a.addCommand("outdent",new b));a.ui.addButton&&(a.ui.addButton("Indent",{label:a.lang.indent.indent,command:"indent",directional:!0,toolbar:"indent,20"}),a.ui.addButton("Outdent",{label:a.lang.indent.outdent,command:"outdent",directional:!0,toolbar:"indent,10"}));a.on("dirChanged",function(b){var f=a.createRange(),j=b.data.node;f.setStartBefore(j);f.setEndAfter(j);for(var l=new CKEDITOR.dom.walker(f),c;c=l.next();)if(c.type==CKEDITOR.NODE_ELEMENT)if(!c.equals(j)&& +c.getDirection()){f.setStartAfter(c);l=new CKEDITOR.dom.walker(f)}else{var d=a.config.indentClasses;if(d)for(var g=b.data.dir=="ltr"?["_rtl",""]:["","_rtl"],h=0;h<d.length;h++)if(c.hasClass(d[h]+g[0])){c.removeClass(d[h]+g[0]);c.addClass(d[h]+g[1])}d=c.getStyle("margin-right");g=c.getStyle("margin-left");d?c.setStyle("margin-left",d):c.removeStyle("margin-left");g?c.setStyle("margin-right",g):c.removeStyle("margin-right")}})}});CKEDITOR.plugins.indent={genericDefinition:function(a){this.isIndent= +!!a;this.startDisabled=!this.isIndent},specificDefinition:function(a,b,e){this.name=b;this.editor=a;this.jobs={};this.enterBr=a.config.enterMode==CKEDITOR.ENTER_BR;this.isIndent=!!e;this.relatedGlobal=e?"indent":"outdent";this.indentKey=e?9:CKEDITOR.SHIFT+9;this.database={}},registerCommands:function(a,b){a.on("pluginsLoaded",function(){for(var a in b)(function(a,b){var e=a.getCommand(b.relatedGlobal),c;for(c in b.jobs)e.on("exec",function(d){d.data.done||(a.fire("lockSnapshot"),b.execJob(a,c)&&(d.data.done= +!0),a.fire("unlockSnapshot"),CKEDITOR.dom.element.clearAllMarkers(b.database))},this,null,c),e.on("refresh",function(d){d.data.states||(d.data.states={});d.data.states[b.name+"@"+c]=b.refreshJob(a,c,d.data.path)},this,null,c);a.addFeature(b)})(this,b[a])})}};CKEDITOR.plugins.indent.genericDefinition.prototype={context:"p",exec:function(){}};CKEDITOR.plugins.indent.specificDefinition.prototype={execJob:function(a,b){var e=this.jobs[b];if(e.state!=i)return e.exec.call(this,a)},refreshJob:function(a, +b,e){b=this.jobs[b];b.state=a.activeFilter.checkFeature(this)?b.refresh.call(this,a,e):i;return b.state},getContext:function(a){return a.contains(this.context)}}})();(function(){function s(e){function g(b){for(var f=d.startContainer,a=d.endContainer;f&&!f.getParent().equals(b);)f=f.getParent();for(;a&&!a.getParent().equals(b);)a=a.getParent();if(!f||!a)return!1;for(var h=f,f=[],c=!1;!c;)h.equals(a)&&(c=!0),f.push(h),h=h.getNext();if(1>f.length)return!1;h=b.getParents(!0);for(a=0;a<h.length;a++)if(h[a].getName&&k[h[a].getName()]){b=h[a];break}for(var h=n.isIndent?1:-1,a=f[0],f=f[f.length-1],c=CKEDITOR.plugins.list.listToArray(b,o),g=c[f.getCustomData("listarray_index")].indent, +a=a.getCustomData("listarray_index");a<=f.getCustomData("listarray_index");a++)if(c[a].indent+=h,0<h){var l=c[a].parent;c[a].parent=new CKEDITOR.dom.element(l.getName(),l.getDocument())}for(a=f.getCustomData("listarray_index")+1;a<c.length&&c[a].indent>g;a++)c[a].indent+=h;f=CKEDITOR.plugins.list.arrayToList(c,o,null,e.config.enterMode,b.getDirection());if(!n.isIndent){var i;if((i=b.getParent())&&i.is("li"))for(var h=f.listNode.getChildren(),m=[],j,a=h.count()-1;0<=a;a--)(j=h.getItem(a))&&(j.is&& +j.is("li"))&&m.push(j)}f&&f.listNode.replace(b);if(m&&m.length)for(a=0;a<m.length;a++){for(j=b=m[a];(j=j.getNext())&&j.is&&j.getName()in k;)CKEDITOR.env.needsNbspFiller&&!b.getFirst(t)&&b.append(d.document.createText(" ")),b.append(j);b.insertAfter(i)}f&&e.fire("contentDomInvalidated");return!0}for(var n=this,o=this.database,k=this.context,l=e.getSelection(),l=(l&&l.getRanges()).createIterator(),d;d=l.getNextRange();){for(var b=d.getCommonAncestor();b&&!(b.type==CKEDITOR.NODE_ELEMENT&&k[b.getName()]);)b= +b.getParent();b||(b=d.startPath().contains(k))&&d.setEndAt(b,CKEDITOR.POSITION_BEFORE_END);if(!b){var c=d.getEnclosedNode();c&&(c.type==CKEDITOR.NODE_ELEMENT&&c.getName()in k)&&(d.setStartAt(c,CKEDITOR.POSITION_AFTER_START),d.setEndAt(c,CKEDITOR.POSITION_BEFORE_END),b=c)}b&&(d.startContainer.type==CKEDITOR.NODE_ELEMENT&&d.startContainer.getName()in k)&&(c=new CKEDITOR.dom.walker(d),c.evaluator=i,d.startContainer=c.next());b&&(d.endContainer.type==CKEDITOR.NODE_ELEMENT&&d.endContainer.getName()in k)&& +(c=new CKEDITOR.dom.walker(d),c.evaluator=i,d.endContainer=c.previous());if(b)return g(b)}return 0}function p(e,g){g||(g=e.contains(this.context));return g&&e.block&&e.block.equals(g.getFirst(i))}function i(e){return e.type==CKEDITOR.NODE_ELEMENT&&e.is("li")}function t(e){return u(e)&&v(e)}var u=CKEDITOR.dom.walker.whitespaces(!0),v=CKEDITOR.dom.walker.bookmark(!1,!0),q=CKEDITOR.TRISTATE_DISABLED,r=CKEDITOR.TRISTATE_OFF;CKEDITOR.plugins.add("indentlist",{requires:"indent",init:function(e){function g(e, +g){i.specificDefinition.apply(this,arguments);this.requiredContent=["ul","ol"];e.on("key",function(g){if("wysiwyg"==e.mode&&g.data.keyCode==this.indentKey){var d=this.getContext(e.elementPath());if(d&&(!this.isIndent||!p.call(this,e.elementPath(),d)))e.execCommand(this.relatedGlobal),g.cancel()}},this);this.jobs[this.isIndent?10:30]={refresh:this.isIndent?function(e,d){var b=this.getContext(d),c=p.call(this,d,b);return!b||!this.isIndent||c?q:r}:function(e,d){return!this.getContext(d)||this.isIndent? +q:r},exec:CKEDITOR.tools.bind(s,this)}}var i=CKEDITOR.plugins.indent;i.registerCommands(e,{indentlist:new g(e,"indentlist",!0),outdentlist:new g(e,"outdentlist")});CKEDITOR.tools.extend(g.prototype,i.specificDefinition.prototype,{context:{ol:1,ul:1}})}})})();(function(){function g(a,b){var c=j.exec(a),d=j.exec(b);if(c){if(!c[2]&&"px"==d[2])return d[1];if("px"==c[2]&&!d[2])return d[1]+"px"}return b}var i=CKEDITOR.htmlParser.cssStyle,h=CKEDITOR.tools.cssLength,j=/^((?:\d*(?:\.\d+))|(?:\d+))(.*)?$/i,l={elements:{$:function(a){var b=a.attributes;if((b=(b=(b=b&&b["data-cke-realelement"])&&new CKEDITOR.htmlParser.fragment.fromHtml(decodeURIComponent(b)))&&b.children[0])&&a.attributes["data-cke-resizable"]){var c=(new i(a)).rules,a=b.attributes,d=c.width,c= +c.height;d&&(a.width=g(a.width,d));c&&(a.height=g(a.height,c))}return b}}},k=CKEDITOR.plugins.add("fakeobjects",{init:function(a){a.filter.allow("img[!data-cke-realelement,src,alt,title](*){*}","fakeobjects")},afterInit:function(a){(a=(a=a.dataProcessor)&&a.htmlFilter)&&a.addRules(l)}});CKEDITOR.editor.prototype.createFakeElement=function(a,b,c,d){var e=this.lang.fakeobjects,e=e[c]||e.unknown,b={"class":b,"data-cke-realelement":encodeURIComponent(a.getOuterHtml()),"data-cke-real-node-type":a.type, +alt:e,title:e,align:a.getAttribute("align")||""};CKEDITOR.env.hc||(b.src=CKEDITOR.getUrl(k.path+"images/spacer.gif"));c&&(b["data-cke-real-element-type"]=c);d&&(b["data-cke-resizable"]=d,c=new i,d=a.getAttribute("width"),a=a.getAttribute("height"),d&&(c.rules.width=h(d)),a&&(c.rules.height=h(a)),c.populate(b));return this.document.createElement("img",{attributes:b})};CKEDITOR.editor.prototype.createFakeParserElement=function(a,b,c,d){var e=this.lang.fakeobjects,e=e[c]||e.unknown,f;f=new CKEDITOR.htmlParser.basicWriter; +a.writeHtml(f);f=f.getHtml();b={"class":b,"data-cke-realelement":encodeURIComponent(f),"data-cke-real-node-type":a.type,alt:e,title:e,align:a.attributes.align||""};CKEDITOR.env.hc||(b.src=CKEDITOR.getUrl(k.path+"images/spacer.gif"));c&&(b["data-cke-real-element-type"]=c);d&&(b["data-cke-resizable"]=d,d=a.attributes,a=new i,c=d.width,d=d.height,void 0!=c&&(a.rules.width=h(c)),void 0!=d&&(a.rules.height=h(d)),a.populate(b));return new CKEDITOR.htmlParser.element("img",b)};CKEDITOR.editor.prototype.restoreRealElement= +function(a){if(a.data("cke-real-node-type")!=CKEDITOR.NODE_ELEMENT)return null;var b=CKEDITOR.dom.element.createFromHtml(decodeURIComponent(a.data("cke-realelement")),this.document);if(a.data("cke-resizable")){var c=a.getStyle("width"),a=a.getStyle("height");c&&b.setAttribute("width",g(b.getAttribute("width"),c));a&&b.setAttribute("height",g(b.getAttribute("height"),a))}return b}})();CKEDITOR.plugins.add("link",{requires:"dialog,fakeobjects",onLoad:function(){function b(b){return d.replace(/%1/g,"rtl"==b?"right":"left").replace(/%2/g,"cke_contents_"+b)}var a="background:url("+CKEDITOR.getUrl(this.path+"images"+(CKEDITOR.env.hidpi?"/hidpi":"")+"/anchor.png")+") no-repeat %1 center;border:1px dotted #00f;background-size:16px;",d=".%2 a.cke_anchor,.%2 a.cke_anchor_empty,.cke_editable.%2 a[name],.cke_editable.%2 a[data-cke-saved-name]{"+a+"padding-%1:18px;cursor:auto;}"+(CKEDITOR.plugins.link.synAnchorSelector? +"a.cke_anchor_empty{display:inline-block;}":"")+".%2 img.cke_anchor{"+a+"width:16px;min-height:15px;height:1.15em;vertical-align:"+(CKEDITOR.env.opera?"middle":"text-bottom")+";}";CKEDITOR.addCss(b("ltr")+b("rtl"))},init:function(b){var a="a[!href]";CKEDITOR.dialog.isTabEnabled(b,"link","advanced")&&(a=a.replace("]",",accesskey,charset,dir,id,lang,name,rel,tabindex,title,type]{*}(*)"));CKEDITOR.dialog.isTabEnabled(b,"link","target")&&(a=a.replace("]",",target,onclick]"));b.addCommand("link",new CKEDITOR.dialogCommand("link", +{allowedContent:a,requiredContent:"a[href]"}));b.addCommand("anchor",new CKEDITOR.dialogCommand("anchor",{allowedContent:"a[!name,id]",requiredContent:"a[name]"}));b.addCommand("unlink",new CKEDITOR.unlinkCommand);b.addCommand("removeAnchor",new CKEDITOR.removeAnchorCommand);b.setKeystroke(CKEDITOR.CTRL+76,"link");b.ui.addButton&&(b.ui.addButton("Link",{label:b.lang.link.toolbar,command:"link",toolbar:"links,10"}),b.ui.addButton("Unlink",{label:b.lang.link.unlink,command:"unlink",toolbar:"links,20"}), +b.ui.addButton("Anchor",{label:b.lang.link.anchor.toolbar,command:"anchor",toolbar:"links,30"}));CKEDITOR.dialog.add("link",this.path+"dialogs/link.js");CKEDITOR.dialog.add("anchor",this.path+"dialogs/anchor.js");b.on("doubleclick",function(a){var c=CKEDITOR.plugins.link.getSelectedLink(b)||a.data.element;if(!c.isReadOnly())if(c.is("a")){a.data.dialog=c.getAttribute("name")&&(!c.getAttribute("href")||!c.getChildCount())?"anchor":"link";b.getSelection().selectElement(c)}else if(CKEDITOR.plugins.link.tryRestoreFakeAnchor(b, +c))a.data.dialog="anchor"});b.addMenuItems&&b.addMenuItems({anchor:{label:b.lang.link.anchor.menu,command:"anchor",group:"anchor",order:1},removeAnchor:{label:b.lang.link.anchor.remove,command:"removeAnchor",group:"anchor",order:5},link:{label:b.lang.link.menu,command:"link",group:"link",order:1},unlink:{label:b.lang.link.unlink,command:"unlink",group:"link",order:5}});b.contextMenu&&b.contextMenu.addListener(function(a){if(!a||a.isReadOnly())return null;a=CKEDITOR.plugins.link.tryRestoreFakeAnchor(b, +a);if(!a&&!(a=CKEDITOR.plugins.link.getSelectedLink(b)))return null;var c={};a.getAttribute("href")&&a.getChildCount()&&(c={link:CKEDITOR.TRISTATE_OFF,unlink:CKEDITOR.TRISTATE_OFF});if(a&&a.hasAttribute("name"))c.anchor=c.removeAnchor=CKEDITOR.TRISTATE_OFF;return c})},afterInit:function(b){var a=b.dataProcessor,d=a&&a.dataFilter,a=a&&a.htmlFilter,c=b._.elementsPath&&b._.elementsPath.filters;d&&d.addRules({elements:{a:function(a){var c=a.attributes;if(!c.name)return null;var d=!a.children.length;if(CKEDITOR.plugins.link.synAnchorSelector){var a= +d?"cke_anchor_empty":"cke_anchor",e=c["class"];if(c.name&&(!e||0>e.indexOf(a)))c["class"]=(e||"")+" "+a;d&&CKEDITOR.plugins.link.emptyAnchorFix&&(c.contenteditable="false",c["data-cke-editable"]=1)}else if(CKEDITOR.plugins.link.fakeAnchor&&d)return b.createFakeParserElement(a,"cke_anchor","anchor");return null}}});CKEDITOR.plugins.link.emptyAnchorFix&&a&&a.addRules({elements:{a:function(a){delete a.attributes.contenteditable}}});c&&c.push(function(a,c){if("a"==c&&(CKEDITOR.plugins.link.tryRestoreFakeAnchor(b, +a)||a.getAttribute("name")&&(!a.getAttribute("href")||!a.getChildCount())))return"anchor"})}}); +CKEDITOR.plugins.link={getSelectedLink:function(b){var a=b.getSelection(),d=a.getSelectedElement();return d&&d.is("a")?d:(a=a.getRanges()[0])?(a.shrink(CKEDITOR.SHRINK_TEXT),b.elementPath(a.getCommonAncestor()).contains("a",1)):null},fakeAnchor:CKEDITOR.env.opera||CKEDITOR.env.webkit,synAnchorSelector:CKEDITOR.env.ie&&11>CKEDITOR.env.version,emptyAnchorFix:CKEDITOR.env.ie&&8>CKEDITOR.env.version,tryRestoreFakeAnchor:function(b,a){if(a&&a.data("cke-real-element-type")&&"anchor"==a.data("cke-real-element-type")){var d= +b.restoreRealElement(a);if(d.data("cke-saved-name"))return d}}};CKEDITOR.unlinkCommand=function(){}; +CKEDITOR.unlinkCommand.prototype={exec:function(b){var a=new CKEDITOR.style({element:"a",type:CKEDITOR.STYLE_INLINE,alwaysRemoveElement:1});b.removeStyle(a)},refresh:function(b,a){var d=a.lastElement&&a.lastElement.getAscendant("a",!0);d&&"a"==d.getName()&&d.getAttribute("href")&&d.getChildCount()?this.setState(CKEDITOR.TRISTATE_OFF):this.setState(CKEDITOR.TRISTATE_DISABLED)},contextSensitive:1,startDisabled:1,requiredContent:"a[href]"};CKEDITOR.removeAnchorCommand=function(){}; +CKEDITOR.removeAnchorCommand.prototype={exec:function(b){var a=b.getSelection(),d=a.createBookmarks(),c;if(a&&(c=a.getSelectedElement())&&(CKEDITOR.plugins.link.fakeAnchor&&!c.getChildCount()?CKEDITOR.plugins.link.tryRestoreFakeAnchor(b,c):c.is("a")))c.remove(1);else if(c=CKEDITOR.plugins.link.getSelectedLink(b))c.hasAttribute("href")?(c.removeAttributes({name:1,"data-cke-saved-name":1}),c.removeClass("cke_anchor")):c.remove(1);a.selectBookmarks(d)},requiredContent:"a[name]"}; +CKEDITOR.tools.extend(CKEDITOR.config,{linkShowAdvancedTab:!0,linkShowTargetTab:!0});(function(){function E(c,k,e){function b(b){if((d=a[b?"getFirst":"getLast"]())&&(!d.is||!d.isBlockBoundary())&&(m=k.root[b?"getPrevious":"getNext"](CKEDITOR.dom.walker.invisible(!0)))&&(!m.is||!m.isBlockBoundary({br:1})))c.document.createElement("br")[b?"insertBefore":"insertAfter"](d)}for(var j=CKEDITOR.plugins.list.listToArray(k.root,e),g=[],h=0;h<k.contents.length;h++){var f=k.contents[h];if((f=f.getAscendant("li",!0))&&!f.getCustomData("list_item_processed"))g.push(f),CKEDITOR.dom.element.setMarker(e, +f,"list_item_processed",!0)}f=null;for(h=0;h<g.length;h++)f=g[h].getCustomData("listarray_index"),j[f].indent=-1;for(h=f+1;h<j.length;h++)if(j[h].indent>j[h-1].indent+1){g=j[h-1].indent+1-j[h].indent;for(f=j[h].indent;j[h]&&j[h].indent>=f;)j[h].indent+=g,h++;h--}var a=CKEDITOR.plugins.list.arrayToList(j,e,null,c.config.enterMode,k.root.getAttribute("dir")).listNode,d,m;b(!0);b();a.replace(k.root);c.fire("contentDomInvalidated")}function x(c,k){this.name=c;this.context=this.type=k;this.allowedContent= +k+" li";this.requiredContent=k}function A(c,k,e,b){for(var j,g;j=c[b?"getLast":"getFirst"](F);)(g=j.getDirection(1))!==k.getDirection(1)&&j.setAttribute("dir",g),j.remove(),e?j[b?"insertBefore":"insertAfter"](e):k.append(j,b)}function B(c){var k;(k=function(e){var b=c[e?"getPrevious":"getNext"](q);b&&(b.type==CKEDITOR.NODE_ELEMENT&&b.is(c.getName()))&&(A(c,b,null,!e),c.remove(),c=b)})();k(1)}function C(c){return c.type==CKEDITOR.NODE_ELEMENT&&(c.getName()in CKEDITOR.dtd.$block||c.getName()in CKEDITOR.dtd.$listItem)&& +CKEDITOR.dtd[c.getName()]["#"]}function y(c,k,e){c.fire("saveSnapshot");e.enlarge(CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS);var b=e.extractContents();k.trim(!1,!0);var j=k.createBookmark(),g=new CKEDITOR.dom.elementPath(k.startContainer),h=g.block,g=g.lastElement.getAscendant("li",1)||h,f=new CKEDITOR.dom.elementPath(e.startContainer),a=f.contains(CKEDITOR.dtd.$listItem),f=f.contains(CKEDITOR.dtd.$list);h?(h=h.getBogus())&&h.remove():f&&(h=f.getPrevious(q))&&v(h)&&h.remove();(h=b.getLast())&&(h.type== +CKEDITOR.NODE_ELEMENT&&h.is("br"))&&h.remove();(h=k.startContainer.getChild(k.startOffset))?b.insertBefore(h):k.startContainer.append(b);if(a&&(b=w(a)))g.contains(a)?(A(b,a.getParent(),a),b.remove()):g.append(b);for(;e.checkStartOfBlock()&&e.checkEndOfBlock();){f=e.startPath();b=f.block;if(!b)break;b.is("li")&&(g=b.getParent(),b.equals(g.getLast(q))&&b.equals(g.getFirst(q))&&(b=g));e.moveToPosition(b,CKEDITOR.POSITION_BEFORE_START);b.remove()}e=e.clone();b=c.editable();e.setEndAt(b,CKEDITOR.POSITION_BEFORE_END); +e=new CKEDITOR.dom.walker(e);e.evaluator=function(a){return q(a)&&!v(a)};(e=e.next())&&(e.type==CKEDITOR.NODE_ELEMENT&&e.getName()in CKEDITOR.dtd.$list)&&B(e);k.moveToBookmark(j);k.select();c.fire("saveSnapshot")}function w(c){return(c=c.getLast(q))&&c.type==CKEDITOR.NODE_ELEMENT&&c.getName()in r?c:null}var r={ol:1,ul:1},G=CKEDITOR.dom.walker.whitespaces(),D=CKEDITOR.dom.walker.bookmark(),q=function(c){return!(G(c)||D(c))},v=CKEDITOR.dom.walker.bogus();CKEDITOR.plugins.list={listToArray:function(c, +k,e,b,j){if(!r[c.getName()])return[];b||(b=0);e||(e=[]);for(var g=0,h=c.getChildCount();g<h;g++){var f=c.getChild(g);f.type==CKEDITOR.NODE_ELEMENT&&f.getName()in CKEDITOR.dtd.$list&&CKEDITOR.plugins.list.listToArray(f,k,e,b+1);if("li"==f.$.nodeName.toLowerCase()){var a={parent:c,indent:b,element:f,contents:[]};j?a.grandparent=j:(a.grandparent=c.getParent(),a.grandparent&&"li"==a.grandparent.$.nodeName.toLowerCase()&&(a.grandparent=a.grandparent.getParent()));k&&CKEDITOR.dom.element.setMarker(k,f, +"listarray_index",e.length);e.push(a);for(var d=0,m=f.getChildCount(),i;d<m;d++)i=f.getChild(d),i.type==CKEDITOR.NODE_ELEMENT&&r[i.getName()]?CKEDITOR.plugins.list.listToArray(i,k,e,b+1,a.grandparent):a.contents.push(i)}}return e},arrayToList:function(c,k,e,b,j){e||(e=0);if(!c||c.length<e+1)return null;for(var g,h=c[e].parent.getDocument(),f=new CKEDITOR.dom.documentFragment(h),a=null,d=e,m=Math.max(c[e].indent,0),i=null,n,l,p=b==CKEDITOR.ENTER_P?"p":"div";;){var o=c[d];g=o.grandparent;n=o.element.getDirection(1); +if(o.indent==m){if(!a||c[d].parent.getName()!=a.getName())a=c[d].parent.clone(!1,1),j&&a.setAttribute("dir",j),f.append(a);i=a.append(o.element.clone(0,1));n!=a.getDirection(1)&&i.setAttribute("dir",n);for(g=0;g<o.contents.length;g++)i.append(o.contents[g].clone(1,1));d++}else if(o.indent==Math.max(m,0)+1)o=c[d-1].element.getDirection(1),d=CKEDITOR.plugins.list.arrayToList(c,null,d,b,o!=n?n:null),!i.getChildCount()&&(CKEDITOR.env.needsNbspFiller&&!(7<h.$.documentMode))&&i.append(h.createText(" ")), +i.append(d.listNode),d=d.nextIndex;else if(-1==o.indent&&!e&&g){r[g.getName()]?(i=o.element.clone(!1,!0),n!=g.getDirection(1)&&i.setAttribute("dir",n)):i=new CKEDITOR.dom.documentFragment(h);var a=g.getDirection(1)!=n,u=o.element,z=u.getAttribute("class"),v=u.getAttribute("style"),w=i.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT&&(b!=CKEDITOR.ENTER_BR||a||v||z),s,x=o.contents.length,t;for(g=0;g<x;g++)if(s=o.contents[g],D(s)&&1<x)w?t=s.clone(1,1):i.append(s.clone(1,1));else if(s.type==CKEDITOR.NODE_ELEMENT&& +s.isBlockBoundary()){a&&!s.getDirection()&&s.setAttribute("dir",n);l=s;var y=u.getAttribute("style");y&&l.setAttribute("style",y.replace(/([^;])$/,"$1;")+(l.getAttribute("style")||""));z&&s.addClass(z);l=null;t&&(i.append(t),t=null);i.append(s.clone(1,1))}else w?(l||(l=h.createElement(p),i.append(l),a&&l.setAttribute("dir",n)),v&&l.setAttribute("style",v),z&&l.setAttribute("class",z),t&&(l.append(t),t=null),l.append(s.clone(1,1))):i.append(s.clone(1,1));t&&((l||i).append(t),t=null);i.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT&& +d!=c.length-1&&(CKEDITOR.env.needsBrFiller&&(n=i.getLast())&&(n.type==CKEDITOR.NODE_ELEMENT&&n.is("br"))&&n.remove(),n=i.getLast(q),(!n||!(n.type==CKEDITOR.NODE_ELEMENT&&n.is(CKEDITOR.dtd.$block)))&&i.append(h.createElement("br")));n=i.$.nodeName.toLowerCase();("div"==n||"p"==n)&&i.appendBogus();f.append(i);a=null;d++}else return null;l=null;if(c.length<=d||Math.max(c[d].indent,0)<m)break}if(k)for(c=f.getFirst();c;){if(c.type==CKEDITOR.NODE_ELEMENT&&(CKEDITOR.dom.element.clearMarkers(k,c),c.getName()in +CKEDITOR.dtd.$listItem&&(e=c,h=j=b=void 0,b=e.getDirection()))){for(j=e.getParent();j&&!(h=j.getDirection());)j=j.getParent();b==h&&e.removeAttribute("dir")}c=c.getNextSourceNode()}return{listNode:f,nextIndex:d}}};var H=/^h[1-6]$/,F=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT);x.prototype={exec:function(c){this.refresh(c,c.elementPath());var k=c.config,e=c.getSelection(),b=e&&e.getRanges();if(this.state==CKEDITOR.TRISTATE_OFF){var j=c.editable();if(j.getFirst(q)){var g=1==b.length&&b[0];(k= +g&&g.getEnclosedNode())&&(k.is&&this.type==k.getName())&&this.setState(CKEDITOR.TRISTATE_ON)}else k.enterMode==CKEDITOR.ENTER_BR?j.appendBogus():b[0].fixBlock(1,k.enterMode==CKEDITOR.ENTER_P?"p":"div"),e.selectRanges(b)}for(var k=e.createBookmarks(!0),j=[],h={},b=b.createIterator(),f=0;(g=b.getNextRange())&&++f;){var a=g.getBoundaryNodes(),d=a.startNode,m=a.endNode;d.type==CKEDITOR.NODE_ELEMENT&&"td"==d.getName()&&g.setStartAt(a.startNode,CKEDITOR.POSITION_AFTER_START);m.type==CKEDITOR.NODE_ELEMENT&& +"td"==m.getName()&&g.setEndAt(a.endNode,CKEDITOR.POSITION_BEFORE_END);g=g.createIterator();for(g.forceBrBreak=this.state==CKEDITOR.TRISTATE_OFF;a=g.getNextParagraph();)if(!a.getCustomData("list_block")){CKEDITOR.dom.element.setMarker(h,a,"list_block",1);for(var i=c.elementPath(a),d=i.elements,m=0,i=i.blockLimit,n,l=d.length-1;0<=l&&(n=d[l]);l--)if(r[n.getName()]&&i.contains(n)){i.removeCustomData("list_group_object_"+f);(d=n.getCustomData("list_group_object"))?d.contents.push(a):(d={root:n,contents:[a]}, +j.push(d),CKEDITOR.dom.element.setMarker(h,n,"list_group_object",d));m=1;break}m||(m=i,m.getCustomData("list_group_object_"+f)?m.getCustomData("list_group_object_"+f).contents.push(a):(d={root:m,contents:[a]},CKEDITOR.dom.element.setMarker(h,m,"list_group_object_"+f,d),j.push(d)))}}for(n=[];0<j.length;)if(d=j.shift(),this.state==CKEDITOR.TRISTATE_OFF)if(r[d.root.getName()]){b=c;f=d;d=h;g=n;m=CKEDITOR.plugins.list.listToArray(f.root,d);i=[];for(a=0;a<f.contents.length;a++)if(l=f.contents[a],(l=l.getAscendant("li", +!0))&&!l.getCustomData("list_item_processed"))i.push(l),CKEDITOR.dom.element.setMarker(d,l,"list_item_processed",!0);for(var l=f.root.getDocument(),p=void 0,o=void 0,a=0;a<i.length;a++){var u=i[a].getCustomData("listarray_index"),p=m[u].parent;p.is(this.type)||(o=l.createElement(this.type),p.copyAttributes(o,{start:1,type:1}),o.removeStyle("list-style-type"),m[u].parent=o)}d=CKEDITOR.plugins.list.arrayToList(m,d,null,b.config.enterMode);m=void 0;i=d.listNode.getChildCount();for(a=0;a<i&&(m=d.listNode.getChild(a));a++)m.getName()== +this.type&&g.push(m);d.listNode.replace(f.root);b.fire("contentDomInvalidated")}else{m=c;a=d;g=n;i=a.contents;b=a.root.getDocument();f=[];1==i.length&&i[0].equals(a.root)&&(d=b.createElement("div"),i[0].moveChildren&&i[0].moveChildren(d),i[0].append(d),i[0]=d);a=a.contents[0].getParent();for(l=0;l<i.length;l++)a=a.getCommonAncestor(i[l].getParent());p=m.config.useComputedState;m=d=void 0;p=void 0===p||p;for(l=0;l<i.length;l++)for(o=i[l];u=o.getParent();){if(u.equals(a)){f.push(o);!m&&o.getDirection()&& +(m=1);o=o.getDirection(p);null!==d&&(d=d&&d!=o?null:o);break}o=u}if(!(1>f.length)){i=f[f.length-1].getNext();l=b.createElement(this.type);g.push(l);for(p=g=void 0;f.length;)g=f.shift(),p=b.createElement("li"),g.is("pre")||H.test(g.getName())||"false"==g.getAttribute("contenteditable")?g.appendTo(p):(g.copyAttributes(p),d&&g.getDirection()&&(p.removeStyle("direction"),p.removeAttribute("dir")),g.moveChildren(p),g.remove()),p.appendTo(l);d&&m&&l.setAttribute("dir",d);i?l.insertBefore(i):l.appendTo(a)}}else this.state== +CKEDITOR.TRISTATE_ON&&r[d.root.getName()]&&E.call(this,c,d,h);for(l=0;l<n.length;l++)B(n[l]);CKEDITOR.dom.element.clearAllMarkers(h);e.selectBookmarks(k);c.focus()},refresh:function(c,k){var e=k.contains(r,1),b=k.blockLimit||k.root;e&&b.contains(e)?this.setState(e.is(this.type)?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF):this.setState(CKEDITOR.TRISTATE_OFF)}};CKEDITOR.plugins.add("list",{requires:"indentlist",init:function(c){c.blockless||(c.addCommand("numberedlist",new x("numberedlist","ol")),c.addCommand("bulletedlist", +new x("bulletedlist","ul")),c.ui.addButton&&(c.ui.addButton("NumberedList",{label:c.lang.list.numberedlist,command:"numberedlist",directional:!0,toolbar:"list,10"}),c.ui.addButton("BulletedList",{label:c.lang.list.bulletedlist,command:"bulletedlist",directional:!0,toolbar:"list,20"})),c.on("key",function(k){var e=k.data.keyCode;if(c.mode=="wysiwyg"&&e in{8:1,46:1}){var b=c.getSelection().getRanges()[0],j=b&&b.startPath();if(b&&b.collapsed){var j=new CKEDITOR.dom.elementPath(b.startContainer),g=e== +8,h=c.editable(),f=new CKEDITOR.dom.walker(b.clone());f.evaluator=function(a){return q(a)&&!v(a)};f.guard=function(a,b){return!(b&&a.type==CKEDITOR.NODE_ELEMENT&&a.is("table"))};e=b.clone();if(g){var a,d;if((a=j.contains(r))&&b.checkBoundaryOfElement(a,CKEDITOR.START)&&(a=a.getParent())&&a.is("li")&&(a=w(a))){d=a;a=a.getPrevious(q);e.moveToPosition(a&&v(a)?a:d,CKEDITOR.POSITION_BEFORE_START)}else{f.range.setStartAt(h,CKEDITOR.POSITION_AFTER_START);f.range.setEnd(b.startContainer,b.startOffset);if((a= +f.previous())&&a.type==CKEDITOR.NODE_ELEMENT&&(a.getName()in r||a.is("li"))){if(!a.is("li")){f.range.selectNodeContents(a);f.reset();f.evaluator=C;a=f.previous()}d=a;e.moveToElementEditEnd(d)}}if(d){y(c,e,b);k.cancel()}else if((e=j.contains(r))&&b.checkBoundaryOfElement(e,CKEDITOR.START)){d=e.getFirst(q);if(b.checkBoundaryOfElement(d,CKEDITOR.START)){a=e.getPrevious(q);if(w(d)){if(a){b.moveToElementEditEnd(a);b.select()}}else c.execCommand("outdent");k.cancel()}}}else if(d=j.contains("li")){f.range.setEndAt(h, +CKEDITOR.POSITION_BEFORE_END);h=(j=d.getLast(q))&&C(j)?j:d;d=0;if((a=f.next())&&a.type==CKEDITOR.NODE_ELEMENT&&a.getName()in r&&a.equals(j)){d=1;a=f.next()}else b.checkBoundaryOfElement(h,CKEDITOR.END)&&(d=1);if(d&&a){b=b.clone();b.moveToElementEditStart(a);y(c,e,b);k.cancel()}}else{f.range.setEndAt(h,CKEDITOR.POSITION_BEFORE_END);if((a=f.next())&&a.type==CKEDITOR.NODE_ELEMENT&&a.is(r)){a=a.getFirst(q);if(j.block&&b.checkStartOfBlock()&&b.checkEndOfBlock()){j.block.remove();b.moveToElementEditStart(a); +b.select()}else if(w(a)){b.moveToElementEditStart(a);b.select()}else{b=b.clone();b.moveToElementEditStart(a);y(c,e,b)}k.cancel()}}setTimeout(function(){c.selectionChange(1)})}}}))}})})();(function(){function Q(a,c,d){return m(c)&&m(d)&&d.equals(c.getNext(function(a){return!(z(a)||A(a)||p(a))}))}function u(a){this.upper=a[0];this.lower=a[1];this.set.apply(this,a.slice(2))}function J(a){var c=a.element;if(c&&m(c)&&(c=c.getAscendant(a.triggers,!0))&&a.editable.contains(c)){var d=K(c,!0);if("true"==d.getAttribute("contenteditable"))return c;if(d.is(a.triggers))return d}return null}function ga(a,c,d){o(a,c);o(a,d);a=c.size.bottom;d=d.size.top;return a&&d?0|(a+d)/2:a||d}function r(a,c, +d){return c=c[d?"getPrevious":"getNext"](function(b){return b&&b.type==CKEDITOR.NODE_TEXT&&!z(b)||m(b)&&!p(b)&&!v(a,b)})}function K(a,c){if(a.data("cke-editable"))return null;for(c||(a=a.getParent());a&&!a.data("cke-editable");){if(a.hasAttribute("contenteditable"))return a;a=a.getParent()}return null}function ha(a){var c=a.doc,d=B('<span contenteditable="false" style="'+L+"position:absolute;border-top:1px dashed "+a.boxColor+'"></span>',c),b=this.path+"images/"+(n.hidpi?"hidpi/":"")+"icon.png";q(d, +{attach:function(){this.wrap.getParent()||this.wrap.appendTo(a.editable,!0);return this},lineChildren:[q(B('<span title="'+a.editor.lang.magicline.title+'" contenteditable="false">&#8629;</span>',c),{base:L+"height:17px;width:17px;"+(a.rtl?"left":"right")+":17px;background:url("+b+") center no-repeat "+a.boxColor+";cursor:pointer;"+(n.hc?"font-size: 15px;line-height:14px;border:1px solid #fff;text-align:center;":"")+(n.hidpi?"background-size: 9px 10px;":""),looks:["top:-8px;"+CKEDITOR.tools.cssVendorPrefix("border-radius", +"2px",1),"top:-17px;"+CKEDITOR.tools.cssVendorPrefix("border-radius","2px 2px 0px 0px",1),"top:-1px;"+CKEDITOR.tools.cssVendorPrefix("border-radius","0px 0px 2px 2px",1)]}),q(B(R,c),{base:S+"left:0px;border-left-color:"+a.boxColor+";",looks:["border-width:8px 0 8px 8px;top:-8px","border-width:8px 0 0 8px;top:-8px","border-width:0 0 8px 8px;top:0px"]}),q(B(R,c),{base:S+"right:0px;border-right-color:"+a.boxColor+";",looks:["border-width:8px 8px 8px 0;top:-8px","border-width:8px 8px 0 0;top:-8px","border-width:0 8px 8px 0;top:0px"]})], +detach:function(){this.wrap.getParent()&&this.wrap.remove();return this},mouseNear:function(){o(a,this);var b=a.holdDistance,c=this.size;return c&&a.mouse.y>c.top-b&&a.mouse.y<c.bottom+b&&a.mouse.x>c.left-b&&a.mouse.x<c.right+b?!0:!1},place:function(){var b=a.view,c=a.editable,d=a.trigger,h=d.upper,g=d.lower,j=h||g,l=j.getParent(),k={};this.trigger=d;h&&o(a,h,!0);g&&o(a,g,!0);o(a,l,!0);a.inInlineMode&&C(a,!0);l.equals(c)?(k.left=b.scroll.x,k.right=-b.scroll.x,k.width=""):(k.left=j.size.left-j.size.margin.left+ +b.scroll.x-(a.inInlineMode?b.editable.left+b.editable.border.left:0),k.width=j.size.outerWidth+j.size.margin.left+j.size.margin.right+b.scroll.x,k.right="");h&&g?k.top=h.size.margin.bottom===g.size.margin.top?0|h.size.bottom+h.size.margin.bottom/2:h.size.margin.bottom<g.size.margin.top?h.size.bottom+h.size.margin.bottom:h.size.bottom+h.size.margin.bottom-g.size.margin.top:h?g||(k.top=h.size.bottom+h.size.margin.bottom):k.top=g.size.top-g.size.margin.top;d.is(x)||k.top>b.scroll.y-15&&k.top<b.scroll.y+ +5?(k.top=a.inInlineMode?0:b.scroll.y,this.look(x)):d.is(y)||k.top>b.pane.bottom-5&&k.top<b.pane.bottom+15?(k.top=a.inInlineMode?b.editable.height+b.editable.padding.top+b.editable.padding.bottom:b.pane.bottom-1,this.look(y)):(a.inInlineMode&&(k.top-=b.editable.top+b.editable.border.top),this.look(s));a.inInlineMode&&(k.top--,k.top+=b.editable.scroll.top,k.left+=b.editable.scroll.left);for(var T in k)k[T]=CKEDITOR.tools.cssLength(k[T]);this.setStyles(k)},look:function(a){if(this.oldLook!=a){for(var b= +this.lineChildren.length,c;b--;)(c=this.lineChildren[b]).setAttribute("style",c.base+c.looks[0|a/2]);this.oldLook=a}},wrap:new M("span",a.doc)});for(c=d.lineChildren.length;c--;)d.lineChildren[c].appendTo(d);d.look(s);d.appendTo(d.wrap);d.unselectable();d.lineChildren[0].on("mouseup",function(b){d.detach();N(a,function(b){var c=a.line.trigger;b[c.is(D)?"insertBefore":"insertAfter"](c.is(D)?c.lower:c.upper)},!0);a.editor.focus();!n.ie&&a.enterMode!=CKEDITOR.ENTER_BR&&a.hotNode.scrollIntoView();b.data.preventDefault(!0)}); +d.on("mousedown",function(a){a.data.preventDefault(!0)});a.line=d}function N(a,c,d){var b=new CKEDITOR.dom.range(a.doc),e=a.editor,f;n.ie&&a.enterMode==CKEDITOR.ENTER_BR?f=a.doc.createText(E):(f=(f=K(a.element,!0))&&f.data("cke-enter-mode")||a.enterMode,f=new M(F[f],a.doc),f.is("br")||a.doc.createText(E).appendTo(f));d&&e.fire("saveSnapshot");c(f);b.moveToPosition(f,CKEDITOR.POSITION_AFTER_START);e.getSelection().selectRanges([b]);a.hotNode=f;d&&e.fire("saveSnapshot")}function U(a,c){return{canUndo:!0, +modes:{wysiwyg:1},exec:function(){function d(b){var d=n.ie&&9>n.version?" ":E,f=a.hotNode&&a.hotNode.getText()==d&&a.element.equals(a.hotNode)&&a.lastCmdDirection===!!c;N(a,function(d){f&&a.hotNode&&a.hotNode.remove();d[c?"insertAfter":"insertBefore"](b);d.setAttributes({"data-cke-magicline-hot":1,"data-cke-magicline-dir":!!c});a.lastCmdDirection=!!c});!n.ie&&a.enterMode!=CKEDITOR.ENTER_BR&&a.hotNode.scrollIntoView();a.line.detach()}return function(b){var b=b.getSelection().getStartElement(),e,b= +b.getAscendant(V,1);if(!W(a,b)&&b&&!b.equals(a.editable)&&!b.contains(a.editable)){if((e=K(b))&&"false"==e.getAttribute("contenteditable"))b=e;a.element=b;e=r(a,b,!c);var f;m(e)&&e.is(a.triggers)&&e.is(ia)&&(!r(a,e,!c)||(f=r(a,e,!c))&&m(f)&&f.is(a.triggers))?d(e):(f=J(a,b),m(f)&&(r(a,f,!c)?(b=r(a,f,!c))&&(m(b)&&b.is(a.triggers))&&d(f):d(f)))}}}()}}function v(a,c){if(!c||!(c.type==CKEDITOR.NODE_ELEMENT&&c.$))return!1;var d=a.line;return d.wrap.equals(c)||d.wrap.contains(c)}function m(a){return a&& +a.type==CKEDITOR.NODE_ELEMENT&&a.$}function p(a){if(!m(a))return!1;var c;if(!(c=X(a)))m(a)?(c={left:1,right:1,center:1},c=!(!c[a.getComputedStyle("float")]&&!c[a.getAttribute("align")])):c=!1;return c}function X(a){return!!{absolute:1,fixed:1}[a.getComputedStyle("position")]}function G(a,c){return m(c)?c.is(a.triggers):null}function W(a,c){if(!c)return!1;for(var d=c.getParents(1),b=d.length;b--;)for(var e=a.tabuList.length;e--;)if(d[b].hasAttribute(a.tabuList[e]))return!0;return!1}function ja(a,c, +d){c=c[d?"getLast":"getFirst"](function(b){return a.isRelevant(b)&&!b.is(ka)});if(!c)return!1;o(a,c);return d?c.size.top>a.mouse.y:c.size.bottom<a.mouse.y}function Y(a){var c=a.editable,d=a.mouse,b=a.view,e=a.triggerOffset;C(a);var f=d.y>(a.inInlineMode?b.editable.top+b.editable.height/2:Math.min(b.editable.height,b.pane.height)/2),c=c[f?"getLast":"getFirst"](function(a){return!(z(a)||A(a))});if(!c)return null;v(a,c)&&(c=a.line.wrap[f?"getPrevious":"getNext"](function(a){return!(z(a)||A(a))}));if(!m(c)|| +p(c)||!G(a,c))return null;o(a,c);return!f&&0<=c.size.top&&0<d.y&&d.y<c.size.top+e?(a=a.inInlineMode||0===b.scroll.y?x:s,new u([null,c,D,H,a])):f&&c.size.bottom<=b.pane.height&&d.y>c.size.bottom-e&&d.y<b.pane.height?(a=a.inInlineMode||c.size.bottom>b.pane.height-e&&c.size.bottom<b.pane.height?y:s,new u([c,null,Z,H,a])):null}function $(a){var c=a.mouse,d=a.view,b=a.triggerOffset,e=J(a);if(!e)return null;o(a,e);var b=Math.min(b,0|e.size.outerHeight/2),f=[],i,h;if(c.y>e.size.top-1&&c.y<e.size.top+b)h= +!1;else if(c.y>e.size.bottom-b&&c.y<e.size.bottom+1)h=!0;else return null;if(p(e)||ja(a,e,h)||e.getParent().is(aa))return null;var g=r(a,e,!h);if(g){if(g&&g.type==CKEDITOR.NODE_TEXT)return null;if(m(g)){if(p(g)||!G(a,g)||g.getParent().is(aa))return null;f=[g,e][h?"reverse":"concat"]().concat([O,H])}}else e.equals(a.editable[h?"getLast":"getFirst"](a.isRelevant))?(C(a),h&&c.y>e.size.bottom-b&&c.y<d.pane.height&&e.size.bottom>d.pane.height-b&&e.size.bottom<d.pane.height?i=y:0<c.y&&c.y<e.size.top+b&& +(i=x)):i=s,f=[null,e][h?"reverse":"concat"]().concat([h?Z:D,H,i,e.equals(a.editable[h?"getLast":"getFirst"](a.isRelevant))?h?y:x:s]);return 0 in f?new u(f):null}function P(a,c,d,b){for(var e=function(){var b=n.ie?c.$.currentStyle:a.win.$.getComputedStyle(c.$,"");return n.ie?function(a){return b[CKEDITOR.tools.cssStyleToDomStyle(a)]}:function(a){return b.getPropertyValue(a)}}(),f=c.getDocumentPosition(),i={},h={},g={},j={},l=t.length;l--;)i[t[l]]=parseInt(e("border-"+t[l]+"-width"),10)||0,g[t[l]]= +parseInt(e("padding-"+t[l]),10)||0,h[t[l]]=parseInt(e("margin-"+t[l]),10)||0;(!d||b)&&I(a,b);j.top=f.y-(d?0:a.view.scroll.y);j.left=f.x-(d?0:a.view.scroll.x);j.outerWidth=c.$.offsetWidth;j.outerHeight=c.$.offsetHeight;j.height=j.outerHeight-(g.top+g.bottom+i.top+i.bottom);j.width=j.outerWidth-(g.left+g.right+i.left+i.right);j.bottom=j.top+j.outerHeight;j.right=j.left+j.outerWidth;a.inInlineMode&&(j.scroll={top:c.$.scrollTop,left:c.$.scrollLeft});return q({border:i,padding:g,margin:h,ignoreScroll:d}, +j,!0)}function o(a,c,d){if(!m(c))return c.size=null;if(c.size){if(c.size.ignoreScroll==d&&c.size.date>new Date-ba)return null}else c.size={};return q(c.size,P(a,c,d),{date:+new Date},!0)}function C(a,c){a.view.editable=P(a,a.editable,c,!0)}function I(a,c){a.view||(a.view={});var d=a.view;if(c||!(d&&d.date>new Date-ba)){var b=a.win,d=b.getScrollPosition(),b=b.getViewPaneSize();q(a.view,{scroll:{x:d.x,y:d.y,width:a.doc.$.documentElement.scrollWidth-b.width,height:a.doc.$.documentElement.scrollHeight- +b.height},pane:{width:b.width,height:b.height,bottom:b.height+d.y},date:+new Date},!0)}}function la(a,c,d,b){for(var e=b,f=b,i=0,h=!1,g=!1,j=a.view.pane.height,l=a.mouse;l.y+i<j&&0<l.y-i;){h||(h=c(e,b));g||(g=c(f,b));!h&&0<l.y-i&&(e=d(a,{x:l.x,y:l.y-i}));!g&&l.y+i<j&&(f=d(a,{x:l.x,y:l.y+i}));if(h&&g)break;i+=2}return new u([e,f,null,null])}CKEDITOR.plugins.add("magicline",{init:function(a){var c=a.config,d=c.magicline_triggerOffset||30,b={editor:a,enterMode:c.enterMode,triggerOffset:d,holdDistance:0| +d*(c.magicline_holdDistance||0.5),boxColor:c.magicline_color||"#ff0000",rtl:"rtl"==c.contentsLangDirection,tabuList:["data-cke-hidden-sel"].concat(c.magicline_tabuList||[]),triggers:c.magicline_everywhere?V:{table:1,hr:1,div:1,ul:1,ol:1,dl:1,form:1,blockquote:1}},e,f,i;b.isRelevant=function(a){return m(a)&&!v(b,a)&&!p(a)};a.on("contentDom",function(){var d=a.editable(),g=a.document,j=a.window;q(b,{editable:d,inInlineMode:d.isInline(),doc:g,win:j,hotNode:null},!0);b.boundary=b.inInlineMode?b.editable: +b.doc.getDocumentElement();d.is(w.$inline)||(b.inInlineMode&&!X(d)&&d.setStyles({position:"relative",top:null,left:null}),ha.call(this,b),I(b),d.attachListener(a,"beforeUndoImage",function(){b.line.detach()}),d.attachListener(a,"beforeGetData",function(){b.line.wrap.getParent()&&(b.line.detach(),a.once("getData",function(){b.line.attach()},null,null,1E3))},null,null,0),d.attachListener(b.inInlineMode?g:g.getWindow().getFrame(),"mouseout",function(c){if("wysiwyg"==a.mode)if(b.inInlineMode){var d=c.data.$.clientX, +c=c.data.$.clientY;I(b);C(b,!0);var e=b.view.editable,f=b.view.scroll;if(!(d>e.left-f.x&&d<e.right-f.x)||!(c>e.top-f.y&&c<e.bottom-f.y))clearTimeout(i),i=null,b.line.detach()}else clearTimeout(i),i=null,b.line.detach()}),d.attachListener(d,"keyup",function(){b.hiddenMode=0}),d.attachListener(d,"keydown",function(c){if("wysiwyg"==a.mode)switch(c=c.data.getKeystroke(),a.getSelection().getStartElement(),c){case 2228240:case 16:b.hiddenMode=1,b.line.detach()}}),d.attachListener(b.inInlineMode?d:g,"mousemove", +function(c){f=!0;if(!("wysiwyg"!=a.mode||a.readOnly||i)){var d={x:c.data.$.clientX,y:c.data.$.clientY};i=setTimeout(function(){b.mouse=d;i=b.trigger=null;I(b);if(f&&!b.hiddenMode&&a.focusManager.hasFocus&&!b.line.mouseNear()&&(b.element=ca(b,!0)))(b.trigger=Y(b)||$(b)||da(b))&&!W(b,b.trigger.upper||b.trigger.lower)?b.line.attach().place():(b.trigger=null,b.line.detach()),f=!1},30)}}),d.attachListener(j,"scroll",function(){"wysiwyg"==a.mode&&(b.line.detach(),n.webkit&&(b.hiddenMode=1,clearTimeout(e), +e=setTimeout(function(){b.mouseDown||(b.hiddenMode=0)},50)))}),d.attachListener(ea?g:j,"mousedown",function(){"wysiwyg"==a.mode&&(b.line.detach(),b.hiddenMode=1,b.mouseDown=1)}),d.attachListener(ea?g:j,"mouseup",function(){b.hiddenMode=0;b.mouseDown=0}),a.addCommand("accessPreviousSpace",U(b)),a.addCommand("accessNextSpace",U(b,!0)),a.setKeystroke([[c.magicline_keystrokePrevious,"accessPreviousSpace"],[c.magicline_keystrokeNext,"accessNextSpace"]]),a.on("loadSnapshot",function(){var c,d,e,f;for(f in{p:1, +br:1,div:1}){c=a.document.getElementsByTag(f);for(e=c.count();e--;)if((d=c.getItem(e)).data("cke-magicline-hot")){b.hotNode=d;b.lastCmdDirection="true"===d.data("cke-magicline-dir")?!0:!1;return}}}),this.backdoor={accessFocusSpace:N,boxTrigger:u,isLine:v,getAscendantTrigger:J,getNonEmptyNeighbour:r,getSize:P,that:b,triggerEdge:$,triggerEditable:Y,triggerExpand:da})},this)}});var q=CKEDITOR.tools.extend,M=CKEDITOR.dom.element,B=M.createFromHtml,n=CKEDITOR.env,ea=CKEDITOR.env.ie&&9>CKEDITOR.env.version, +w=CKEDITOR.dtd,F={},D=128,Z=64,O=32,H=16,fa=8,x=4,y=2,s=1,E=" ",aa=w.$listItem,ka=w.$tableContent,ia=q({},w.$nonEditable,w.$empty),V=w.$block,ba=100,L="width:0px;height:0px;padding:0px;margin:0px;display:block;z-index:9999;color:#fff;position:absolute;font-size: 0px;line-height:0px;",S=L+"border-color:transparent;display:block;border-style:solid;",R="<span>"+E+"</span>";F[CKEDITOR.ENTER_BR]="br";F[CKEDITOR.ENTER_P]="p";F[CKEDITOR.ENTER_DIV]="div";u.prototype={set:function(a,c,d){this.properties=a+ +c+(d||s);return this},is:function(a){return(this.properties&a)==a}};var ca=function(){return function(a,c,d){if(!a.mouse)return null;var b=a.doc,e=a.line.wrap,d=d||a.mouse,f=new CKEDITOR.dom.element(b.$.elementFromPoint(d.x,d.y));c&&v(a,f)&&(e.hide(),f=new CKEDITOR.dom.element(b.$.elementFromPoint(d.x,d.y)),e.show());return!f||!(f.type==CKEDITOR.NODE_ELEMENT&&f.$)||n.ie&&9>n.version&&!a.boundary.equals(f)&&!a.boundary.contains(f)?null:f}}(),z=CKEDITOR.dom.walker.whitespaces(),A=CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_COMMENT), +da=function(){function a(a){var b=a.element,e,f,i;if(!m(b)||b.contains(a.editable)||b.isReadOnly())return null;i=la(a,function(a,b){return!b.equals(a)},function(a,b){return ca(a,!0,b)},b);e=i.upper;f=i.lower;if(Q(a,e,f))return i.set(O,fa);if(e&&b.contains(e))for(;!e.getParent().equals(b);)e=e.getParent();else e=b.getFirst(function(b){return c(a,b)});if(f&&b.contains(f))for(;!f.getParent().equals(b);)f=f.getParent();else f=b.getLast(function(b){return c(a,b)});if(!e||!f)return null;o(a,e);o(a,f);if(!(a.mouse.y> +e.size.top&&a.mouse.y<f.size.bottom))return null;for(var b=Number.MAX_VALUE,h,g,j,l;f&&!f.equals(e)&&(g=e.getNext(a.isRelevant));)h=Math.abs(ga(a,e,g)-a.mouse.y),h<b&&(b=h,j=e,l=g),e=g,o(a,e);if(!j||!l||!(a.mouse.y>j.size.top&&a.mouse.y<l.size.bottom))return null;i.upper=j;i.lower=l;return i.set(O,fa)}function c(a,b){return!(b&&b.type==CKEDITOR.NODE_TEXT||A(b)||p(b)||v(a,b)||b.type==CKEDITOR.NODE_ELEMENT&&b.$&&b.is("br"))}return function(c){var b=a(c),e;if(e=b){e=b.upper;var f=b.lower;e=!e||!f||p(f)|| +p(e)||f.equals(e)||e.equals(f)||f.contains(e)||e.contains(f)?!1:G(c,e)&&G(c,f)&&Q(c,e,f)?!0:!1}return e?b:null}}(),t=["top","left","right","bottom"]})();CKEDITOR.config.magicline_keystrokePrevious=CKEDITOR.CTRL+CKEDITOR.SHIFT+51;CKEDITOR.config.magicline_keystrokeNext=CKEDITOR.CTRL+CKEDITOR.SHIFT+52;(function(){function l(a){if(!a||a.type!=CKEDITOR.NODE_ELEMENT||"form"!=a.getName())return[];for(var e=[],f=["style","className"],b=0;b<f.length;b++){var d=a.$.elements.namedItem(f[b]);d&&(d=new CKEDITOR.dom.element(d),e.push([d,d.nextSibling]),d.remove())}return e}function o(a,e){if(a&&!(a.type!=CKEDITOR.NODE_ELEMENT||"form"!=a.getName())&&0<e.length)for(var f=e.length-1;0<=f;f--){var b=e[f][0],d=e[f][1];d?b.insertBefore(d):b.appendTo(a)}}function n(a,e){var f=l(a),b={},d=a.$;e||(b["class"]=d.className|| +"",d.className="");b.inline=d.style.cssText||"";e||(d.style.cssText="position: static; overflow: visible");o(f);return b}function p(a,e){var f=l(a),b=a.$;"class"in e&&(b.className=e["class"]);"inline"in e&&(b.style.cssText=e.inline);o(f)}function q(a){if(!a.editable().isInline()){var e=CKEDITOR.instances,f;for(f in e){var b=e[f];"wysiwyg"==b.mode&&!b.readOnly&&(b=b.document.getBody(),b.setAttribute("contentEditable",!1),b.setAttribute("contentEditable",!0))}a.editable().hasFocus&&(a.toolbox.focus(), +a.focus())}}CKEDITOR.plugins.add("maximize",{init:function(a){function e(){var b=d.getViewPaneSize();a.resize(b.width,b.height,null,!0)}if(a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE){var f=a.lang,b=CKEDITOR.document,d=b.getWindow(),j,k,m,l=CKEDITOR.TRISTATE_OFF;a.addCommand("maximize",{modes:{wysiwyg:!CKEDITOR.env.iOS,source:!CKEDITOR.env.iOS},readOnly:1,editorFocus:!1,exec:function(){var h=a.container.getChild(1),g=a.ui.space("contents");if("wysiwyg"==a.mode){var c=a.getSelection();j=c&&c.getRanges(); +k=d.getScrollPosition()}else{var i=a.editable().$;j=!CKEDITOR.env.ie&&[i.selectionStart,i.selectionEnd];k=[i.scrollLeft,i.scrollTop]}if(this.state==CKEDITOR.TRISTATE_OFF){d.on("resize",e);m=d.getScrollPosition();for(c=a.container;c=c.getParent();)c.setCustomData("maximize_saved_styles",n(c)),c.setStyle("z-index",a.config.baseFloatZIndex-5);g.setCustomData("maximize_saved_styles",n(g,!0));h.setCustomData("maximize_saved_styles",n(h,!0));g={overflow:CKEDITOR.env.webkit?"":"hidden",width:0,height:0}; +b.getDocumentElement().setStyles(g);!CKEDITOR.env.gecko&&b.getDocumentElement().setStyle("position","fixed");(!CKEDITOR.env.gecko||!CKEDITOR.env.quirks)&&b.getBody().setStyles(g);CKEDITOR.env.ie?setTimeout(function(){d.$.scrollTo(0,0)},0):d.$.scrollTo(0,0);h.setStyle("position",CKEDITOR.env.gecko&&CKEDITOR.env.quirks?"fixed":"absolute");h.$.offsetLeft;h.setStyles({"z-index":a.config.baseFloatZIndex-5,left:"0px",top:"0px"});h.addClass("cke_maximized");e();g=h.getDocumentPosition();h.setStyles({left:-1* +g.x+"px",top:-1*g.y+"px"});CKEDITOR.env.gecko&&q(a)}else if(this.state==CKEDITOR.TRISTATE_ON){d.removeListener("resize",e);g=[g,h];for(c=0;c<g.length;c++)p(g[c],g[c].getCustomData("maximize_saved_styles")),g[c].removeCustomData("maximize_saved_styles");for(c=a.container;c=c.getParent();)p(c,c.getCustomData("maximize_saved_styles")),c.removeCustomData("maximize_saved_styles");CKEDITOR.env.ie?setTimeout(function(){d.$.scrollTo(m.x,m.y)},0):d.$.scrollTo(m.x,m.y);h.removeClass("cke_maximized");CKEDITOR.env.webkit&& +(h.setStyle("display","inline"),setTimeout(function(){h.setStyle("display","block")},0));a.fire("resize")}this.toggleState();if(c=this.uiItems[0])g=this.state==CKEDITOR.TRISTATE_OFF?f.maximize.maximize:f.maximize.minimize,c=CKEDITOR.document.getById(c._.id),c.getChild(1).setHtml(g),c.setAttribute("title",g),c.setAttribute("href",'javascript:void("'+g+'");');"wysiwyg"==a.mode?j?(CKEDITOR.env.gecko&&q(a),a.getSelection().selectRanges(j),(i=a.getSelection().getStartElement())&&i.scrollIntoView(!0)): +d.$.scrollTo(k.x,k.y):(j&&(i.selectionStart=j[0],i.selectionEnd=j[1]),i.scrollLeft=k[0],i.scrollTop=k[1]);j=k=null;l=this.state;a.fire("maximize",this.state)},canUndo:!1});a.ui.addButton&&a.ui.addButton("Maximize",{label:f.maximize.maximize,command:"maximize",toolbar:"tools,10"});a.on("mode",function(){var b=a.getCommand("maximize");b.setState(b.state==CKEDITOR.TRISTATE_DISABLED?CKEDITOR.TRISTATE_DISABLED:l)},null,null,100)}}})})();(function(){var c={canUndo:!1,async:!0,exec:function(a){a.getClipboardData({title:a.lang.pastetext.title},function(b){b&&a.fire("paste",{type:"text",dataValue:b.dataValue});a.fire("afterCommandExec",{name:"pastetext",command:c,returnValue:!!b})})}};CKEDITOR.plugins.add("pastetext",{requires:"clipboard",init:function(a){a.addCommand("pastetext",c);a.ui.addButton&&a.ui.addButton("PasteText",{label:a.lang.pastetext.button,command:"pastetext",toolbar:"clipboard,40"});if(a.config.forcePasteAsPlainText)a.on("beforePaste", +function(a){"html"!=a.data.type&&(a.data.type="text")});a.on("pasteState",function(b){a.getCommand("pastetext").setState(b.data)})}})})();(function(){function h(a,d,f){var b=CKEDITOR.cleanWord;b?f():(a=CKEDITOR.getUrl(a.config.pasteFromWordCleanupFile||d+"filter/default.js"),CKEDITOR.scriptLoader.load(a,f,null,!0));return!b}function i(a){a.data.type="html"}CKEDITOR.plugins.add("pastefromword",{requires:"clipboard",init:function(a){var d=0,f=this.path;a.addCommand("pastefromword",{canUndo:!1,async:!0,exec:function(a){var e=this;d=1;a.once("beforePaste",i);a.getClipboardData({title:a.lang.pastefromword.title},function(c){c&&a.fire("paste", +{type:"html",dataValue:c.dataValue});a.fire("afterCommandExec",{name:"pastefromword",command:e,returnValue:!!c})})}});a.ui.addButton&&a.ui.addButton("PasteFromWord",{label:a.lang.pastefromword.toolbar,command:"pastefromword",toolbar:"clipboard,50"});a.on("pasteState",function(b){a.getCommand("pastefromword").setState(b.data)});a.on("paste",function(b){var e=b.data,c=e.dataValue;if(c&&(d||/(class=\"?Mso|style=\"[^\"]*\bmso\-|w:WordDocument)/.test(c))){var g=h(a,f,function(){if(g)a.fire("paste",e); +else if(!a.config.pasteFromWordPromptCleanup||d||confirm(a.lang.pastefromword.confirmCleanup))e.dataValue=CKEDITOR.cleanWord(c,a)});g&&b.cancel()}},null,null,3)}})})();CKEDITOR.plugins.add("removeformat",{init:function(a){a.addCommand("removeFormat",CKEDITOR.plugins.removeformat.commands.removeformat);a.ui.addButton&&a.ui.addButton("RemoveFormat",{label:a.lang.removeformat.toolbar,command:"removeFormat",toolbar:"cleanup,10"})}}); +CKEDITOR.plugins.removeformat={commands:{removeformat:{exec:function(a){for(var h=a._.removeFormatRegex||(a._.removeFormatRegex=RegExp("^(?:"+a.config.removeFormatTags.replace(/,/g,"|")+")$","i")),e=a._.removeAttributes||(a._.removeAttributes=a.config.removeFormatAttributes.split(",")),f=CKEDITOR.plugins.removeformat.filter,k=a.getSelection().getRanges(1),l=k.createIterator(),c;c=l.getNextRange();){c.collapsed||c.enlarge(CKEDITOR.ENLARGE_ELEMENT);var i=c.createBookmark(),b=i.startNode,j=i.endNode, +d=function(b){for(var c=a.elementPath(b),e=c.elements,d=1,g;(g=e[d])&&!g.equals(c.block)&&!g.equals(c.blockLimit);d++)h.test(g.getName())&&f(a,g)&&b.breakParent(g)};d(b);if(j){d(j);for(b=b.getNextSourceNode(!0,CKEDITOR.NODE_ELEMENT);b&&!b.equals(j);)d=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT),!("img"==b.getName()&&b.data("cke-realelement"))&&f(a,b)&&(h.test(b.getName())?b.remove(1):(b.removeAttributes(e),a.fire("removeFormatCleanup",b))),b=d}c.moveToBookmark(i)}a.forceNextSelectionCheck();a.getSelection().selectRanges(k)}}}, +filter:function(a,h){for(var e=a._.removeFormatFilters||[],f=0;f<e.length;f++)if(!1===e[f](h))return!1;return!0}};CKEDITOR.editor.prototype.addRemoveFormatFilter=function(a){this._.removeFormatFilters||(this._.removeFormatFilters=[]);this._.removeFormatFilters.push(a)};CKEDITOR.config.removeFormatTags="b,big,code,del,dfn,em,font,i,ins,kbd,q,s,samp,small,span,strike,strong,sub,sup,tt,u,var";CKEDITOR.config.removeFormatAttributes="class,style,lang,width,height,align,hspace,valign";(function(){CKEDITOR.plugins.add("sourcearea",{init:function(a){function d(){this.hide();this.setStyle("height",this.getParent().$.clientHeight+"px");this.setStyle("width",this.getParent().$.clientWidth+"px");this.show()}if(a.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE){var e=CKEDITOR.plugins.sourcearea;a.addMode("source",function(e){var b=a.ui.space("contents").getDocument().createElement("textarea");b.setStyles(CKEDITOR.tools.extend({width:CKEDITOR.env.ie7Compat?"99%":"100%",height:"100%",resize:"none", +outline:"none","text-align":"left"},CKEDITOR.tools.cssVendorPrefix("tab-size",a.config.sourceAreaTabSize||4)));b.setAttribute("dir","ltr");b.addClass("cke_source cke_reset cke_enable_context_menu");a.ui.space("contents").append(b);b=a.editable(new c(a,b));b.setData(a.getData(1));CKEDITOR.env.ie&&(b.attachListener(a,"resize",d,b),b.attachListener(CKEDITOR.document.getWindow(),"resize",d,b),CKEDITOR.tools.setTimeout(d,0,b));a.fire("ariaWidget",this);e()});a.addCommand("source",e.commands.source);a.ui.addButton&& +a.ui.addButton("Source",{label:a.lang.sourcearea.toolbar,command:"source",toolbar:"mode,10"});a.on("mode",function(){a.getCommand("source").setState("source"==a.mode?CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)})}}});var c=CKEDITOR.tools.createClass({base:CKEDITOR.editable,proto:{setData:function(a){this.setValue(a);this.editor.fire("dataReady")},getData:function(){return this.getValue()},insertHtml:function(){},insertElement:function(){},insertText:function(){},setReadOnly:function(a){this[(a?"set": +"remove")+"Attribute"]("readOnly","readonly")},detach:function(){c.baseProto.detach.call(this);this.clearCustomData();this.remove()}}})})();CKEDITOR.plugins.sourcearea={commands:{source:{modes:{wysiwyg:1,source:1},editorFocus:!1,readOnly:1,exec:function(c){"wysiwyg"==c.mode&&c.fire("saveSnapshot");c.getCommand("source").setState(CKEDITOR.TRISTATE_DISABLED);c.setMode("source"==c.mode?"wysiwyg":"source")},canUndo:!1}}};CKEDITOR.plugins.add("specialchar",{availableLangs:{ar:1,bg:1,ca:1,cs:1,cy:1,de:1,el:1,en:1,eo:1,es:1,et:1,fa:1,fi:1,fr:1,"fr-ca":1,gl:1,he:1,hr:1,hu:1,id:1,it:1,ja:1,km:1,ku:1,lv:1,nb:1,nl:1,no:1,pl:1,pt:1,"pt-br":1,ru:1,si:1,sk:1,sl:1,sq:1,sv:1,th:1,tr:1,ug:1,uk:1,vi:1,zh:1,"zh-cn":1},requires:"dialog",init:function(a){var c=this;CKEDITOR.dialog.add("specialchar",this.path+"dialogs/specialchar.js");a.addCommand("specialchar",{exec:function(){var b=a.langCode,b=c.availableLangs[b]?b:c.availableLangs[b.replace(/-.*/, +"")]?b.replace(/-.*/,""):"en";CKEDITOR.scriptLoader.load(CKEDITOR.getUrl(c.path+"dialogs/lang/"+b+".js"),function(){CKEDITOR.tools.extend(a.lang.specialchar,c.langEntries[b]);a.openDialog("specialchar")})},modes:{wysiwyg:1},canUndo:!1});a.ui.addButton&&a.ui.addButton("SpecialChar",{label:a.lang.specialchar.toolbar,command:"specialchar",toolbar:"insert,50"})}});CKEDITOR.config.specialChars="! &quot; # $ % &amp; ' ( ) * + - . / 0 1 2 3 4 5 6 7 8 9 : ; &lt; = &gt; ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ &euro; &lsquo; &rsquo; &ldquo; &rdquo; &ndash; &mdash; &iexcl; &cent; &pound; &curren; &yen; &brvbar; &sect; &uml; &copy; &ordf; &laquo; &not; &reg; &macr; &deg; &sup2; &sup3; &acute; &micro; &para; &middot; &cedil; &sup1; &ordm; &raquo; &frac14; &frac12; &frac34; &iquest; &Agrave; &Aacute; &Acirc; &Atilde; &Auml; &Aring; &AElig; &Ccedil; &Egrave; &Eacute; &Ecirc; &Euml; &Igrave; &Iacute; &Icirc; &Iuml; &ETH; &Ntilde; &Ograve; &Oacute; &Ocirc; &Otilde; &Ouml; &times; &Oslash; &Ugrave; &Uacute; &Ucirc; &Uuml; &Yacute; &THORN; &szlig; &agrave; &aacute; &acirc; &atilde; &auml; &aring; &aelig; &ccedil; &egrave; &eacute; &ecirc; &euml; &igrave; &iacute; &icirc; &iuml; &eth; &ntilde; &ograve; &oacute; &ocirc; &otilde; &ouml; &divide; &oslash; &ugrave; &uacute; &ucirc; &uuml; &yacute; &thorn; &yuml; &OElig; &oelig; &#372; &#374 &#373 &#375; &sbquo; &#8219; &bdquo; &hellip; &trade; &#9658; &bull; &rarr; &rArr; &hArr; &diams; &asymp;".split(" ");CKEDITOR.plugins.add("menubutton",{requires:"button,menu",onLoad:function(){var d=function(c){var a=this._,b=a.menu;a.state!==CKEDITOR.TRISTATE_DISABLED&&(a.on&&b?b.hide():(a.previousState=a.state,b||(b=a.menu=new CKEDITOR.menu(c,{panel:{className:"cke_menu_panel",attributes:{"aria-label":c.lang.common.options}}}),b.onHide=CKEDITOR.tools.bind(function(){var b=this.command?c.getCommand(this.command).modes:this.modes;this.setState(!b||b[c.mode]?a.previousState:CKEDITOR.TRISTATE_DISABLED);a.on=0},this), +this.onMenu&&b.addListener(this.onMenu)),this.setState(CKEDITOR.TRISTATE_ON),a.on=1,setTimeout(function(){b.show(CKEDITOR.document.getById(a.id),4)},0)))};CKEDITOR.ui.menuButton=CKEDITOR.tools.createClass({base:CKEDITOR.ui.button,$:function(c){delete c.panel;this.base(c);this.hasArrow=!0;this.click=d},statics:{handler:{create:function(c){return new CKEDITOR.ui.menuButton(c)}}}})},beforeInit:function(d){d.ui.addHandler(CKEDITOR.UI_MENUBUTTON,CKEDITOR.ui.menuButton.handler)}}); +CKEDITOR.UI_MENUBUTTON="menubutton";(function(){function o(a,c){var b=0,d;for(d in c)if(c[d]==a){b=1;break}return b}var j="",r=function(){function a(){b.once("focus",g);b.once("blur",c)}function c(b){var b=b.editor,c=d.getScayt(b),g=b.elementMode==CKEDITOR.ELEMENT_MODE_INLINE;c&&(d.setPaused(b,!c.disabled),d.setControlId(b,c.id),c.destroy(!0),delete d.instances[b.name],g&&a())}var b=this,g=function(){if(!("undefined"!=typeof d.instances[b.name]||null!=d.instances[b.name])){var a=b.config,c={};c.srcNodeRef="BODY"==b.editable().$.nodeName? +b.document.getWindow().$.frameElement:b.editable().$;c.assocApp="CKEDITOR."+CKEDITOR.version+"@"+CKEDITOR.revision;c.customerid=a.scayt_customerid||"1:WvF0D4-UtPqN1-43nkD4-NKvUm2-daQqk3-LmNiI-z7Ysb4-mwry24-T8YrS3-Q2tpq2";c.customDictionaryIds=a.scayt_customDictionaryIds||"";c.userDictionaryName=a.scayt_userDictionaryName||"";c.sLang=a.scayt_sLang||"en_US";c.onLoad=function(){CKEDITOR.env.ie&&8>CKEDITOR.env.version||this.addStyle(this.selectorCss(),"padding-bottom: 2px !important;");b.editable().hasFocus&& +!d.isControlRestored(b)&&this.focus()};a=window.scayt_custom_params;if("object"==typeof a)for(var g in a)c[g]=a[g];d.getControlId(b)&&(c.id=d.getControlId(b));var e=new window.scayt(c);e.afterMarkupRemove.push(function(a){(new CKEDITOR.dom.element(a,e.document)).mergeSiblings()});if(c=d.instances[b.name])e.sLang=c.sLang,e.option(c.option()),e.paused=c.paused;d.instances[b.name]=e;try{e.setDisabled(!1===d.isPaused(b))}catch(n){}b.fire("showScaytState")}};b.elementMode==CKEDITOR.ELEMENT_MODE_INLINE? +a():b.on("contentDom",g);b.on("contentDomUnload",function(){for(var a=CKEDITOR.document.getElementsByTag("script"),b=/^dojoIoScript(\d+)$/i,c=/^https?:\/\/svc\.webspellchecker\.net\/spellcheck\/script\/ssrv\.cgi/i,d=0;d<a.count();d++){var g=a.getItem(d),e=g.getId(),f=g.getAttribute("src");e&&(f&&e.match(b)&&f.match(c))&&g.remove()}});b.on("beforeCommandExec",function(a){"source"==a.data.name&&"source"==b.mode&&d.markControlRestore(b)});b.on("afterCommandExec",function(a){if(d.isScaytEnabled(b)&&"wysiwyg"== +b.mode&&("undo"==a.data.name||"redo"==a.data.name))d.getScayt(b).setDisabled(!0),d.refresh_timeout&&window.clearTimeout(d.refresh_timeout),d.refresh_timeout=window.setTimeout(function(){d.getScayt(b).setDisabled(!1);d.getScayt(b).focus();d.getScayt(b).refresh()},10)});b.on("destroy",c);b.on("setData",c);b.on("insertElement",function(){var a=d.getScayt(b);d.isScaytEnabled(b)&&(CKEDITOR.env.ie&&b.getSelection().unlock(!0),window.setTimeout(function(){a.focus();a.refresh()},10))},this,null,50);b.on("insertHtml", +function(){var a=d.getScayt(b);d.isScaytEnabled(b)&&(CKEDITOR.env.ie&&b.getSelection().unlock(!0),window.setTimeout(function(){a.focus();a.refresh()},10))},this,null,50);b.on("scaytDialog",function(a){a.data.djConfig=window.djConfig;a.data.scayt_control=d.getScayt(b);a.data.tab=j;a.data.scayt=window.scayt});var e=b.dataProcessor;(e=e&&e.htmlFilter)&&e.addRules({elements:{span:function(a){if(a.attributes["data-scayt_word"]&&a.attributes["data-scaytid"])return delete a.name,a}}});var e=CKEDITOR.plugins.undo.Image.prototype, +f="function"==typeof e.equalsContent?"equalsContent":"equals";e[f]=CKEDITOR.tools.override(e[f],function(a){return function(b){var c=this.contents,g=b.contents,e=d.getScayt(this.editor);e&&d.isScaytReady(this.editor)&&(this.contents=e.reset(c)||"",b.contents=e.reset(g)||"");e=a.apply(this,arguments);this.contents=c;b.contents=g;return e}});e=CKEDITOR.editor.prototype;e.checkDirty=CKEDITOR.tools.override(e.checkDirty,function(a){return function(){var b=null,c=d.getScayt(this);c&&d.isScaytReady(this)? +(b=c.reset(this.getSnapshot()),c=c.reset(this._.previousValue),b=b!==c):b=a.apply(this);return b}});b.document&&(b.elementMode!=CKEDITOR.ELEMENT_MODE_INLINE||b.focusManager.hasFocus)&&g()};CKEDITOR.plugins.scayt={engineLoaded:!1,instances:{},controlInfo:{},setControlInfo:function(a,c){a&&(a.name&&"object"!=typeof this.controlInfo[a.name])&&(this.controlInfo[a.name]={});for(var b in c)this.controlInfo[a.name][b]=c[b]},isControlRestored:function(a){return a&&a.name&&this.controlInfo[a.name]?this.controlInfo[a.name].restored: +!1},markControlRestore:function(a){this.setControlInfo(a,{restored:!0})},setControlId:function(a,c){this.setControlInfo(a,{id:c})},getControlId:function(a){return a&&a.name&&this.controlInfo[a.name]&&this.controlInfo[a.name].id?this.controlInfo[a.name].id:null},setPaused:function(a,c){this.setControlInfo(a,{paused:c})},isPaused:function(a){if(a&&a.name&&this.controlInfo[a.name])return this.controlInfo[a.name].paused},getScayt:function(a){return this.instances[a.name]},isScaytReady:function(a){return!0=== +this.engineLoaded&&"undefined"!==typeof window.scayt&&this.getScayt(a)},isScaytEnabled:function(a){return(a=this.getScayt(a))?!1===a.disabled:!1},getUiTabs:function(a){var c=[],b=a.config.scayt_uiTabs||"1,1,1",b=b.split(",");b[3]="1";for(var d=0;4>d;d++)c[d]="undefined"!=typeof window.scayt&&"undefined"!=typeof window.scayt.uiTags?parseInt(b[d],10)&&window.scayt.uiTags[d]:parseInt(b[d],10);"object"==typeof a.plugins.wsc?c.push(1):c.push(0);return c},loadEngine:function(a){if(CKEDITOR.env.gecko&&10900> +CKEDITOR.env.version||CKEDITOR.env.opera||CKEDITOR.env.air)return a.fire("showScaytState");if(!0===this.engineLoaded)return r.apply(a);if(-1==this.engineLoaded)return CKEDITOR.on("scaytReady",function(){r.apply(a)});CKEDITOR.on("scaytReady",r,a);CKEDITOR.on("scaytReady",function(){this.engineLoaded=!0},this,null,0);this.engineLoaded=-1;var c=document.location.protocol,c=-1!=c.search(/https?:/)?c:"http:",c=a.config.scayt_srcUrl||c+"//svc.webspellchecker.net/scayt26/loader__base.js",b=d.parseUrl(c).path+ +"/";void 0==window.scayt?(CKEDITOR._djScaytConfig={baseUrl:b,addOnLoad:[function(){CKEDITOR.fireOnce("scaytReady")}],isDebug:!1},CKEDITOR.document.getHead().append(CKEDITOR.document.createElement("script",{attributes:{type:"text/javascript",async:"true",src:c}}))):CKEDITOR.fireOnce("scaytReady");return null},parseUrl:function(a){var c;return a.match&&(c=a.match(/(.*)[\/\\](.*?\.\w+)$/))?{path:c[1],file:c[2]}:a}};var d=CKEDITOR.plugins.scayt,p=function(a,c,b,d,e,f,h){a.addCommand(d,e);a.addMenuItem(d, +{label:b,command:d,group:f,order:h})},u={preserveState:!0,editorFocus:!1,canUndo:!1,exec:function(a){if(d.isScaytReady(a)){var c=d.isScaytEnabled(a);this.setState(c?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_ON);a=d.getScayt(a);a.focus();a.setDisabled(c)}else!a.config.scayt_autoStartup&&0<=d.engineLoaded&&(a.focus(),this.setState(CKEDITOR.TRISTATE_DISABLED),d.loadEngine(a))}};CKEDITOR.plugins.add("scayt",{requires:"menubutton,dialog",beforeInit:function(a){var c=a.config.scayt_contextMenuItemsOrder|| +"suggest|moresuggest|control",b="";if((c=c.split("|"))&&c.length)for(var d=0;d<c.length;d++)b+="scayt_"+c[d]+(c.length!=parseInt(d,10)+1?",":"");a.config.menu_groups=b+","+a.config.menu_groups},checkEnvironment:function(){return CKEDITOR.env.opera||CKEDITOR.env.air?0:1},init:function(a){var c=a.dataProcessor&&a.dataProcessor.dataFilter,b={elements:{span:function(a){var b=a.attributes;b&&b["data-scaytid"]&&delete a.name}}};c&&c.addRules(b);var g={},e={},f=a.addCommand("scaytcheck",u);CKEDITOR.dialog.add("scaytcheck", +CKEDITOR.getUrl(this.path+"dialogs/options.js"));c=d.getUiTabs(a);a.addMenuGroup("scaytButton");a.addMenuGroup("scayt_suggest",-10);a.addMenuGroup("scayt_moresuggest",-9);a.addMenuGroup("scayt_control",-8);var b={},h=a.lang.scayt;b.scaytToggle={label:h.enable,command:"scaytcheck",group:"scaytButton"};1==c[0]&&(b.scaytOptions={label:h.options,group:"scaytButton",onClick:function(){j="options";a.openDialog("scaytcheck")}});1==c[1]&&(b.scaytLangs={label:h.langs,group:"scaytButton",onClick:function(){j= +"langs";a.openDialog("scaytcheck")}});1==c[2]&&(b.scaytDict={label:h.dictionariesTab,group:"scaytButton",onClick:function(){j="dictionaries";a.openDialog("scaytcheck")}});b.scaytAbout={label:a.lang.scayt.about,group:"scaytButton",onClick:function(){j="about";a.openDialog("scaytcheck")}};1==c[4]&&(b.scaytWSC={label:a.lang.wsc.toolbar,group:"scaytButton",command:"checkspell"});a.addMenuItems(b);a.ui.add("Scayt",CKEDITOR.UI_MENUBUTTON,{label:h.title,title:CKEDITOR.env.opera?h.opera_title:h.title,modes:{wysiwyg:this.checkEnvironment()}, +toolbar:"spellchecker,20",onRender:function(){f.on("state",function(){this.setState(f.state)},this)},onMenu:function(){var b=d.isScaytEnabled(a);a.getMenuItem("scaytToggle").label=h[b?"disable":"enable"];var c=d.getUiTabs(a);return{scaytToggle:CKEDITOR.TRISTATE_OFF,scaytOptions:b&&c[0]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,scaytLangs:b&&c[1]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,scaytDict:b&&c[2]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,scaytAbout:b&&c[3]?CKEDITOR.TRISTATE_OFF: +CKEDITOR.TRISTATE_DISABLED,scaytWSC:c[4]?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED}}});a.contextMenu&&a.addMenuItems&&a.contextMenu.addListener(function(b,c){if(!d.isScaytEnabled(a)||c.getRanges()[0].checkReadOnly())return null;var f=d.getScayt(a),n=f.getScaytNode();if(!n)return null;var i=f.getWord(n);if(!i)return null;var j=f.getLang(),l=a.config.scayt_contextCommands||"all",i=window.scayt.getSuggestion(i,j),l=l.split("|"),m;for(m in g){delete a._.menuItems[m];delete a.commands[m]}for(m in e){delete a._.menuItems[m]; +delete a.commands[m]}if(!i||!i.length){p(a,"no_sugg",h.noSuggestions,"scayt_no_sugg",{exec:function(){}},"scayt_control",1,true);e.scayt_no_sugg=CKEDITOR.TRISTATE_OFF}else{g={};e={};m=a.config.scayt_moreSuggestions||"on";var j=false,s=a.config.scayt_maxSuggestions;typeof s!="number"&&(s=5);!s&&(s=i.length);for(var k=0,r=i.length;k<r;k=k+1){var q="scayt_suggestion_"+i[k].replace(" ","_"),t=function(a,b){return{exec:function(){f.replace(a,b)}}}(n,i[k]);if(k<s){p(a,"button_"+q,i[k],q,t,"scayt_suggest", +k+1);e[q]=CKEDITOR.TRISTATE_OFF}else if(m=="on"){p(a,"button_"+q,i[k],q,t,"scayt_moresuggest",k+1);g[q]=CKEDITOR.TRISTATE_OFF;j=true}}if(j){a.addMenuItem("scayt_moresuggest",{label:h.moreSuggestions,group:"scayt_moresuggest",order:10,getItems:function(){return g}});e.scayt_moresuggest=CKEDITOR.TRISTATE_OFF}}if(o("all",l)||o("ignore",l)){p(a,"ignore",h.ignore,"scayt_ignore",{exec:function(){f.ignore(n)}},"scayt_control",2);e.scayt_ignore=CKEDITOR.TRISTATE_OFF}if(o("all",l)||o("ignoreall",l)){p(a,"ignore_all", +h.ignoreAll,"scayt_ignore_all",{exec:function(){f.ignoreAll(n)}},"scayt_control",3);e.scayt_ignore_all=CKEDITOR.TRISTATE_OFF}if(o("all",l)||o("add",l)){p(a,"add_word",h.addWord,"scayt_add_word",{exec:function(){window.scayt.addWordToUserDictionary(n)}},"scayt_control",4);e.scayt_add_word=CKEDITOR.TRISTATE_OFF}f.fireOnContextMenu&&f.fireOnContextMenu(a);return e});c=function(b){b.removeListener();CKEDITOR.env.opera||CKEDITOR.env.air?f.setState(CKEDITOR.TRISTATE_DISABLED):f.setState(d.isScaytEnabled(a)? +CKEDITOR.TRISTATE_ON:CKEDITOR.TRISTATE_OFF)};a.on("showScaytState",c);a.on("instanceReady",c);if(a.config.scayt_autoStartup)a.on("instanceReady",function(){d.loadEngine(a)})},afterInit:function(a){var c,b=function(a){if(a.hasAttribute("data-scaytid"))return!1};a._.elementsPath&&(c=a._.elementsPath.filters)&&c.push(b);a.addRemoveFormatFilter&&a.addRemoveFormatFilter(b)}})})();(function(){CKEDITOR.plugins.add("stylescombo",{requires:"richcombo",init:function(c){var j=c.config,f=c.lang.stylescombo,e={},i=[],k=[];c.on("stylesSet",function(b){if(b=b.data.styles){for(var a,h,d=0,g=b.length;d<g;d++)if(a=b[d],!(c.blockless&&a.element in CKEDITOR.dtd.$block)&&(h=a.name,a=new CKEDITOR.style(a),!c.filter.customConfig||c.filter.check(a)))a._name=h,a._.enterMode=j.enterMode,a._.weight=d+1E3*(a.type==CKEDITOR.STYLE_OBJECT?1:a.type==CKEDITOR.STYLE_BLOCK?2:3),e[h]=a,i.push(a),k.push(a); +i.sort(function(a,b){return a._.weight-b._.weight})}});c.ui.addRichCombo("Styles",{label:f.label,title:f.panelTitle,toolbar:"styles,10",allowedContent:k,panel:{css:[CKEDITOR.skin.getPath("editor")].concat(j.contentsCss),multiSelect:!0,attributes:{"aria-label":f.panelTitle}},init:function(){var b,a,c,d,g,e;g=0;for(e=i.length;g<e;g++)b=i[g],a=b._name,d=b.type,d!=c&&(this.startGroup(f["panelTitle"+d]),c=d),this.add(a,b.type==CKEDITOR.STYLE_OBJECT?a:b.buildPreview(),a);this.commit()},onClick:function(b){c.focus(); +c.fire("saveSnapshot");var b=e[b],a=c.elementPath();c[b.checkActive(a)?"removeStyle":"applyStyle"](b);c.fire("saveSnapshot")},onRender:function(){c.on("selectionChange",function(b){for(var a=this.getValue(),b=b.data.path.elements,c=0,d=b.length,g;c<d;c++){g=b[c];for(var f in e)if(e[f].checkElementRemovable(g,!0)){f!=a&&this.setValue(f);return}}this.setValue("")},this)},onOpen:function(){var b=c.getSelection().getSelectedElement(),b=c.elementPath(b),a=[0,0,0,0];this.showAll();this.unmarkAll();for(var h in e){var d= +e[h],g=d.type;d.checkApplicable(b,c.activeFilter)?a[g]++:this.hideItem(h);d.checkActive(b)&&this.mark(h)}a[CKEDITOR.STYLE_BLOCK]||this.hideGroup(f["panelTitle"+CKEDITOR.STYLE_BLOCK]);a[CKEDITOR.STYLE_INLINE]||this.hideGroup(f["panelTitle"+CKEDITOR.STYLE_INLINE]);a[CKEDITOR.STYLE_OBJECT]||this.hideGroup(f["panelTitle"+CKEDITOR.STYLE_OBJECT])},refresh:function(){var b=c.elementPath();if(b){for(var a in e)if(e[a].checkApplicable(b,c.activeFilter))return;this.setState(CKEDITOR.TRISTATE_DISABLED)}},reset:function(){e= +{};i=[]}})}})})();(function(){function i(c){return{editorFocus:!1,canUndo:!1,modes:{wysiwyg:1},exec:function(d){if(d.editable().hasFocus){var e=d.getSelection(),b;if(b=(new CKEDITOR.dom.elementPath(e.getCommonAncestor(),e.root)).contains({td:1,th:1},1)){var e=d.createRange(),a=CKEDITOR.tools.tryThese(function(){var a=b.getParent().$.cells[b.$.cellIndex+(c?-1:1)];a.parentNode.parentNode;return a},function(){var a=b.getParent(),a=a.getAscendant("table").$.rows[a.$.rowIndex+(c?-1:1)];return a.cells[c?a.cells.length-1: +0]});if(!a&&!c){for(var f=b.getAscendant("table").$,a=b.getParent().$.cells,f=new CKEDITOR.dom.element(f.insertRow(-1),d.document),g=0,h=a.length;g<h;g++)f.append((new CKEDITOR.dom.element(a[g],d.document)).clone(!1,!1)).appendBogus();e.moveToElementEditStart(f)}else if(a)a=new CKEDITOR.dom.element(a),e.moveToElementEditStart(a),(!e.checkStartOfBlock()||!e.checkEndOfBlock())&&e.selectNodeContents(a);else return!0;e.select(!0);return!0}}return!1}}}var h={editorFocus:!1,modes:{wysiwyg:1,source:1}}, +g={exec:function(c){c.container.focusNext(!0,c.tabIndex)}},f={exec:function(c){c.container.focusPrevious(!0,c.tabIndex)}};CKEDITOR.plugins.add("tab",{init:function(c){for(var d=!1!==c.config.enableTabKeyTools,e=c.config.tabSpaces||0,b="";e--;)b+=" ";if(b)c.on("key",function(a){9==a.data.keyCode&&(c.insertHtml(b),a.cancel())});if(d)c.on("key",function(a){(9==a.data.keyCode&&c.execCommand("selectNextCell")||a.data.keyCode==CKEDITOR.SHIFT+9&&c.execCommand("selectPreviousCell"))&&a.cancel()});c.addCommand("blur", +CKEDITOR.tools.extend(g,h));c.addCommand("blurBack",CKEDITOR.tools.extend(f,h));c.addCommand("selectNextCell",i());c.addCommand("selectPreviousCell",i(!0))}})})(); +CKEDITOR.dom.element.prototype.focusNext=function(i,h){var g=void 0===h?this.getTabIndex():h,f,c,d,e,b,a;if(0>=g)for(b=this.getNextSourceNode(i,CKEDITOR.NODE_ELEMENT);b;){if(b.isVisible()&&0===b.getTabIndex()){d=b;break}b=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT)}else for(b=this.getDocument().getBody().getFirst();b=b.getNextSourceNode(!1,CKEDITOR.NODE_ELEMENT);){if(!f)if(!c&&b.equals(this)){if(c=!0,i){if(!(b=b.getNextSourceNode(!0,CKEDITOR.NODE_ELEMENT)))break;f=1}}else c&&!this.contains(b)&& +(f=1);if(b.isVisible()&&!(0>(a=b.getTabIndex()))){if(f&&a==g){d=b;break}a>g&&(!d||!e||a<e)?(d=b,e=a):!d&&0===a&&(d=b,e=a)}}d&&d.focus()}; +CKEDITOR.dom.element.prototype.focusPrevious=function(i,h){for(var g=void 0===h?this.getTabIndex():h,f,c,d,e=0,b,a=this.getDocument().getBody().getLast();a=a.getPreviousSourceNode(!1,CKEDITOR.NODE_ELEMENT);){if(!f)if(!c&&a.equals(this)){if(c=!0,i){if(!(a=a.getPreviousSourceNode(!0,CKEDITOR.NODE_ELEMENT)))break;f=1}}else c&&!this.contains(a)&&(f=1);if(a.isVisible()&&!(0>(b=a.getTabIndex())))if(0>=g){if(f&&0===b){d=a;break}b>e&&(d=a,e=b)}else{if(f&&b==g){d=a;break}if(b<g&&(!d||b>e))d=a,e=b}}d&&d.focus()};CKEDITOR.plugins.add("table",{requires:"dialog",init:function(a){function d(a){return CKEDITOR.tools.extend(a||{},{contextSensitive:1,refresh:function(a,e){this.setState(e.contains("table",1)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)}})}if(!a.blockless){var b=a.lang.table;a.addCommand("table",new CKEDITOR.dialogCommand("table",{context:"table",allowedContent:"table{width,height}[align,border,cellpadding,cellspacing,summary];caption tbody thead tfoot;th td tr[scope];"+(a.plugins.dialogadvtab? +"table"+a.plugins.dialogadvtab.allowedContent():""),requiredContent:"table",contentTransformations:[["table{width}: sizeToStyle","table[width]: sizeToAttribute"]]}));a.addCommand("tableProperties",new CKEDITOR.dialogCommand("tableProperties",d()));a.addCommand("tableDelete",d({exec:function(a){var c=a.elementPath().contains("table",1);if(c){var b=c.getParent();1==b.getChildCount()&&!b.is("body","td","th")&&(c=b);a=a.createRange();a.moveToPosition(c,CKEDITOR.POSITION_BEFORE_START);c.remove();a.select()}}})); +a.ui.addButton&&a.ui.addButton("Table",{label:b.toolbar,command:"table",toolbar:"insert,30"});CKEDITOR.dialog.add("table",this.path+"dialogs/table.js");CKEDITOR.dialog.add("tableProperties",this.path+"dialogs/table.js");a.addMenuItems&&a.addMenuItems({table:{label:b.menu,command:"tableProperties",group:"table",order:5},tabledelete:{label:b.deleteTable,command:"tableDelete",group:"table",order:1}});a.on("doubleclick",function(a){a.data.element.is("table")&&(a.data.dialog="tableProperties")});a.contextMenu&& +a.contextMenu.addListener(function(){return{tabledelete:CKEDITOR.TRISTATE_OFF,table:CKEDITOR.TRISTATE_OFF}})}}});(function(){function p(e){function d(a){!(0<b.length)&&(a.type==CKEDITOR.NODE_ELEMENT&&y.test(a.getName())&&!a.getCustomData("selected_cell"))&&(CKEDITOR.dom.element.setMarker(c,a,"selected_cell",!0),b.push(a))}for(var e=e.getRanges(),b=[],c={},a=0;a<e.length;a++){var f=e[a];if(f.collapsed)f=f.getCommonAncestor(),(f=f.getAscendant("td",!0)||f.getAscendant("th",!0))&&b.push(f);else{var f=new CKEDITOR.dom.walker(f),g;for(f.guard=d;g=f.next();)if(g.type!=CKEDITOR.NODE_ELEMENT||!g.is(CKEDITOR.dtd.table))if((g= +g.getAscendant("td",!0)||g.getAscendant("th",!0))&&!g.getCustomData("selected_cell"))CKEDITOR.dom.element.setMarker(c,g,"selected_cell",!0),b.push(g)}}CKEDITOR.dom.element.clearAllMarkers(c);return b}function o(e,d){for(var b=p(e),c=b[0],a=c.getAscendant("table"),c=c.getDocument(),f=b[0].getParent(),g=f.$.rowIndex,b=b[b.length-1],h=b.getParent().$.rowIndex+b.$.rowSpan-1,b=new CKEDITOR.dom.element(a.$.rows[h]),g=d?g:h,f=d?f:b,b=CKEDITOR.tools.buildTableMap(a),a=b[g],g=d?b[g-1]:b[g+1],b=b[0].length, +c=c.createElement("tr"),h=0;a[h]&&h<b;h++){var i;1<a[h].rowSpan&&g&&a[h]==g[h]?(i=a[h],i.rowSpan+=1):(i=(new CKEDITOR.dom.element(a[h])).clone(),i.removeAttribute("rowSpan"),i.appendBogus(),c.append(i),i=i.$);h+=i.colSpan-1}d?c.insertBefore(f):c.insertAfter(f)}function q(e){if(e instanceof CKEDITOR.dom.selection){for(var d=p(e),b=d[0].getAscendant("table"),c=CKEDITOR.tools.buildTableMap(b),e=d[0].getParent().$.rowIndex,d=d[d.length-1],a=d.getParent().$.rowIndex+d.$.rowSpan-1,d=[],f=e;f<=a;f++){for(var g= +c[f],h=new CKEDITOR.dom.element(b.$.rows[f]),i=0;i<g.length;i++){var j=new CKEDITOR.dom.element(g[i]),l=j.getParent().$.rowIndex;1==j.$.rowSpan?j.remove():(j.$.rowSpan-=1,l==f&&(l=c[f+1],l[i-1]?j.insertAfter(new CKEDITOR.dom.element(l[i-1])):(new CKEDITOR.dom.element(b.$.rows[f+1])).append(j,1)));i+=j.$.colSpan-1}d.push(h)}c=b.$.rows;b=new CKEDITOR.dom.element(c[a+1]||(0<e?c[e-1]:null)||b.$.parentNode);for(f=d.length;0<=f;f--)q(d[f]);return b}e instanceof CKEDITOR.dom.element&&(b=e.getAscendant("table"), +1==b.$.rows.length?b.remove():e.remove());return null}function r(e,d){for(var b=d?Infinity:0,c=0;c<e.length;c++){var a;a=e[c];for(var f=d,g=a.getParent().$.cells,h=0,i=0;i<g.length;i++){var j=g[i],h=h+(f?1:j.colSpan);if(j==a.$)break}a=h-1;if(d?a<b:a>b)b=a}return b}function k(e,d){for(var b=p(e),c=b[0].getAscendant("table"),a=r(b,1),b=r(b),a=d?a:b,f=CKEDITOR.tools.buildTableMap(c),c=[],b=[],g=f.length,h=0;h<g;h++)c.push(f[h][a]),b.push(d?f[h][a-1]:f[h][a+1]);for(h=0;h<g;h++)c[h]&&(1<c[h].colSpan&& +b[h]==c[h]?(a=c[h],a.colSpan+=1):(a=(new CKEDITOR.dom.element(c[h])).clone(),a.removeAttribute("colSpan"),a.appendBogus(),a[d?"insertBefore":"insertAfter"].call(a,new CKEDITOR.dom.element(c[h])),a=a.$),h+=a.rowSpan-1)}function u(e,d){var b=e.getStartElement();if(b=b.getAscendant("td",1)||b.getAscendant("th",1)){var c=b.clone();c.appendBogus();d?c.insertBefore(b):c.insertAfter(b)}}function t(e){if(e instanceof CKEDITOR.dom.selection){var e=p(e),d=e[0]&&e[0].getAscendant("table"),b;a:{var c=0;b=e.length- +1;for(var a={},f,g;f=e[c++];)CKEDITOR.dom.element.setMarker(a,f,"delete_cell",!0);for(c=0;f=e[c++];)if((g=f.getPrevious())&&!g.getCustomData("delete_cell")||(g=f.getNext())&&!g.getCustomData("delete_cell")){CKEDITOR.dom.element.clearAllMarkers(a);b=g;break a}CKEDITOR.dom.element.clearAllMarkers(a);g=e[0].getParent();(g=g.getPrevious())?b=g.getLast():(g=e[b].getParent(),b=(g=g.getNext())?g.getChild(0):null)}for(g=e.length-1;0<=g;g--)t(e[g]);b?m(b,!0):d&&d.remove()}else e instanceof CKEDITOR.dom.element&& +(d=e.getParent(),1==d.getChildCount()?d.remove():e.remove())}function m(e,d){var b=e.getDocument(),c=CKEDITOR.document;CKEDITOR.env.ie&&11>CKEDITOR.env.version&&(c.focus(),b.focus());b=new CKEDITOR.dom.range(b);if(!b["moveToElementEdit"+(d?"End":"Start")](e))b.selectNodeContents(e),b.collapse(d?!1:!0);b.select(!0)}function v(e,d,b){e=e[d];if("undefined"==typeof b)return e;for(d=0;e&&d<e.length;d++){if(b.is&&e[d]==b.$)return d;if(d==b)return new CKEDITOR.dom.element(e[d])}return b.is?-1:null}function s(e, +d,b){var c=p(e),a;if((d?1!=c.length:2>c.length)||(a=e.getCommonAncestor())&&a.type==CKEDITOR.NODE_ELEMENT&&a.is("table"))return!1;var f,e=c[0];a=e.getAscendant("table");var g=CKEDITOR.tools.buildTableMap(a),h=g.length,i=g[0].length,j=e.getParent().$.rowIndex,l=v(g,j,e);if(d){var n;try{var m=parseInt(e.getAttribute("rowspan"),10)||1;f=parseInt(e.getAttribute("colspan"),10)||1;n=g["up"==d?j-m:"down"==d?j+m:j]["left"==d?l-f:"right"==d?l+f:l]}catch(z){return!1}if(!n||e.$==n)return!1;c["up"==d||"left"== +d?"unshift":"push"](new CKEDITOR.dom.element(n))}for(var d=e.getDocument(),o=j,m=n=0,q=!b&&new CKEDITOR.dom.documentFragment(d),s=0,d=0;d<c.length;d++){f=c[d];var k=f.getParent(),t=f.getFirst(),r=f.$.colSpan,u=f.$.rowSpan,k=k.$.rowIndex,w=v(g,k,f),s=s+r*u,m=Math.max(m,w-l+r);n=Math.max(n,k-j+u);if(!b){r=f;(u=r.getBogus())&&u.remove();r.trim();if(f.getChildren().count()){if(k!=o&&t&&(!t.isBlockBoundary||!t.isBlockBoundary({br:1})))(o=q.getLast(CKEDITOR.dom.walker.whitespaces(!0)))&&(!o.is||!o.is("br"))&& +q.append("br");f.moveChildren(q)}d?f.remove():f.setHtml("")}o=k}if(b)return n*m==s;q.moveChildren(e);e.appendBogus();m>=i?e.removeAttribute("rowSpan"):e.$.rowSpan=n;n>=h?e.removeAttribute("colSpan"):e.$.colSpan=m;b=new CKEDITOR.dom.nodeList(a.$.rows);c=b.count();for(d=c-1;0<=d;d--)a=b.getItem(d),a.$.cells.length||(a.remove(),c++);return e}function w(e,d){var b=p(e);if(1<b.length)return!1;if(d)return!0;var b=b[0],c=b.getParent(),a=c.getAscendant("table"),f=CKEDITOR.tools.buildTableMap(a),g=c.$.rowIndex, +h=v(f,g,b),i=b.$.rowSpan,j;if(1<i){j=Math.ceil(i/2);for(var i=Math.floor(i/2),c=g+j,a=new CKEDITOR.dom.element(a.$.rows[c]),f=v(f,c),l,c=b.clone(),g=0;g<f.length;g++)if(l=f[g],l.parentNode==a.$&&g>h){c.insertBefore(new CKEDITOR.dom.element(l));break}else l=null;l||a.append(c,!0)}else{i=j=1;a=c.clone();a.insertAfter(c);a.append(c=b.clone());l=v(f,g);for(h=0;h<l.length;h++)l[h].rowSpan++}c.appendBogus();b.$.rowSpan=j;c.$.rowSpan=i;1==j&&b.removeAttribute("rowSpan");1==i&&c.removeAttribute("rowSpan"); +return c}function x(e,d){var b=p(e);if(1<b.length)return!1;if(d)return!0;var b=b[0],c=b.getParent(),a=c.getAscendant("table"),a=CKEDITOR.tools.buildTableMap(a),f=v(a,c.$.rowIndex,b),g=b.$.colSpan;if(1<g)c=Math.ceil(g/2),g=Math.floor(g/2);else{for(var g=c=1,h=[],i=0;i<a.length;i++){var j=a[i];h.push(j[f]);1<j[f].rowSpan&&(i+=j[f].rowSpan-1)}for(a=0;a<h.length;a++)h[a].colSpan++}a=b.clone();a.insertAfter(b);a.appendBogus();b.$.colSpan=c;a.$.colSpan=g;1==c&&b.removeAttribute("colSpan");1==g&&a.removeAttribute("colSpan"); +return a}var y=/^(?:td|th)$/;CKEDITOR.plugins.tabletools={requires:"table,dialog,contextmenu",init:function(e){function d(a){return CKEDITOR.tools.extend(a||{},{contextSensitive:1,refresh:function(a,b){this.setState(b.contains({td:1,th:1},1)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)}})}function b(a,b){var c=e.addCommand(a,b);e.addFeature(c)}var c=e.lang.table;b("cellProperties",new CKEDITOR.dialogCommand("cellProperties",d({allowedContent:"td th{width,height,border-color,background-color,white-space,vertical-align,text-align}[colspan,rowspan]", +requiredContent:"table"})));CKEDITOR.dialog.add("cellProperties",this.path+"dialogs/tableCell.js");b("rowDelete",d({requiredContent:"table",exec:function(a){a=a.getSelection();m(q(a))}}));b("rowInsertBefore",d({requiredContent:"table",exec:function(a){a=a.getSelection();o(a,!0)}}));b("rowInsertAfter",d({requiredContent:"table",exec:function(a){a=a.getSelection();o(a)}}));b("columnDelete",d({requiredContent:"table",exec:function(a){for(var a=a.getSelection(),a=p(a),b=a[0],c=a[a.length-1],a=b.getAscendant("table"), +d=CKEDITOR.tools.buildTableMap(a),e,j,l=[],n=0,o=d.length;n<o;n++)for(var k=0,q=d[n].length;k<q;k++)d[n][k]==b.$&&(e=k),d[n][k]==c.$&&(j=k);for(n=e;n<=j;n++)for(k=0;k<d.length;k++)c=d[k],b=new CKEDITOR.dom.element(a.$.rows[k]),c=new CKEDITOR.dom.element(c[n]),c.$&&(1==c.$.colSpan?c.remove():c.$.colSpan-=1,k+=c.$.rowSpan-1,b.$.cells.length||l.push(b));j=a.$.rows[0]&&a.$.rows[0].cells;e=new CKEDITOR.dom.element(j[e]||(e?j[e-1]:a.$.parentNode));l.length==o&&a.remove();e&&m(e,!0)}}));b("columnInsertBefore", +d({requiredContent:"table",exec:function(a){a=a.getSelection();k(a,!0)}}));b("columnInsertAfter",d({requiredContent:"table",exec:function(a){a=a.getSelection();k(a)}}));b("cellDelete",d({requiredContent:"table",exec:function(a){a=a.getSelection();t(a)}}));b("cellMerge",d({allowedContent:"td[colspan,rowspan]",requiredContent:"td[colspan,rowspan]",exec:function(a){m(s(a.getSelection()),!0)}}));b("cellMergeRight",d({allowedContent:"td[colspan]",requiredContent:"td[colspan]",exec:function(a){m(s(a.getSelection(), +"right"),!0)}}));b("cellMergeDown",d({allowedContent:"td[rowspan]",requiredContent:"td[rowspan]",exec:function(a){m(s(a.getSelection(),"down"),!0)}}));b("cellVerticalSplit",d({allowedContent:"td[rowspan]",requiredContent:"td[rowspan]",exec:function(a){m(w(a.getSelection()))}}));b("cellHorizontalSplit",d({allowedContent:"td[colspan]",requiredContent:"td[colspan]",exec:function(a){m(x(a.getSelection()))}}));b("cellInsertBefore",d({requiredContent:"table",exec:function(a){a=a.getSelection();u(a,!0)}})); +b("cellInsertAfter",d({requiredContent:"table",exec:function(a){a=a.getSelection();u(a)}}));e.addMenuItems&&e.addMenuItems({tablecell:{label:c.cell.menu,group:"tablecell",order:1,getItems:function(){var a=e.getSelection(),b=p(a);return{tablecell_insertBefore:CKEDITOR.TRISTATE_OFF,tablecell_insertAfter:CKEDITOR.TRISTATE_OFF,tablecell_delete:CKEDITOR.TRISTATE_OFF,tablecell_merge:s(a,null,!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_merge_right:s(a,"right",!0)?CKEDITOR.TRISTATE_OFF: +CKEDITOR.TRISTATE_DISABLED,tablecell_merge_down:s(a,"down",!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_split_vertical:w(a,!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_split_horizontal:x(a,!0)?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED,tablecell_properties:0<b.length?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED}}},tablecell_insertBefore:{label:c.cell.insertBefore,group:"tablecell",command:"cellInsertBefore",order:5},tablecell_insertAfter:{label:c.cell.insertAfter, +group:"tablecell",command:"cellInsertAfter",order:10},tablecell_delete:{label:c.cell.deleteCell,group:"tablecell",command:"cellDelete",order:15},tablecell_merge:{label:c.cell.merge,group:"tablecell",command:"cellMerge",order:16},tablecell_merge_right:{label:c.cell.mergeRight,group:"tablecell",command:"cellMergeRight",order:17},tablecell_merge_down:{label:c.cell.mergeDown,group:"tablecell",command:"cellMergeDown",order:18},tablecell_split_horizontal:{label:c.cell.splitHorizontal,group:"tablecell", +command:"cellHorizontalSplit",order:19},tablecell_split_vertical:{label:c.cell.splitVertical,group:"tablecell",command:"cellVerticalSplit",order:20},tablecell_properties:{label:c.cell.title,group:"tablecellproperties",command:"cellProperties",order:21},tablerow:{label:c.row.menu,group:"tablerow",order:1,getItems:function(){return{tablerow_insertBefore:CKEDITOR.TRISTATE_OFF,tablerow_insertAfter:CKEDITOR.TRISTATE_OFF,tablerow_delete:CKEDITOR.TRISTATE_OFF}}},tablerow_insertBefore:{label:c.row.insertBefore, +group:"tablerow",command:"rowInsertBefore",order:5},tablerow_insertAfter:{label:c.row.insertAfter,group:"tablerow",command:"rowInsertAfter",order:10},tablerow_delete:{label:c.row.deleteRow,group:"tablerow",command:"rowDelete",order:15},tablecolumn:{label:c.column.menu,group:"tablecolumn",order:1,getItems:function(){return{tablecolumn_insertBefore:CKEDITOR.TRISTATE_OFF,tablecolumn_insertAfter:CKEDITOR.TRISTATE_OFF,tablecolumn_delete:CKEDITOR.TRISTATE_OFF}}},tablecolumn_insertBefore:{label:c.column.insertBefore, +group:"tablecolumn",command:"columnInsertBefore",order:5},tablecolumn_insertAfter:{label:c.column.insertAfter,group:"tablecolumn",command:"columnInsertAfter",order:10},tablecolumn_delete:{label:c.column.deleteColumn,group:"tablecolumn",command:"columnDelete",order:15}});e.contextMenu&&e.contextMenu.addListener(function(a,b,c){return(a=c.contains({td:1,th:1},1))&&!a.isReadOnly()?{tablecell:CKEDITOR.TRISTATE_OFF,tablerow:CKEDITOR.TRISTATE_OFF,tablecolumn:CKEDITOR.TRISTATE_OFF}:null})},getSelectedCells:p}; +CKEDITOR.plugins.add("tabletools",CKEDITOR.plugins.tabletools)})();CKEDITOR.tools.buildTableMap=function(p){for(var p=p.$.rows,o=-1,q=[],r=0;r<p.length;r++){o++;!q[o]&&(q[o]=[]);for(var k=-1,u=0;u<p[r].cells.length;u++){var t=p[r].cells[u];for(k++;q[o][k];)k++;for(var m=isNaN(t.colSpan)?1:t.colSpan,t=isNaN(t.rowSpan)?1:t.rowSpan,v=0;v<t;v++){q[o+v]||(q[o+v]=[]);for(var s=0;s<m;s++)q[o+v][k+s]=p[r].cells[u]}k+=m-1}}return q};(function(){function g(a){this.editor=a;this.reset()}CKEDITOR.plugins.add("undo",{init:function(a){function c(a){b.enabled&&!1!==a.data.command.canUndo&&b.save()}function d(){b.enabled=a.readOnly?!1:"wysiwyg"==a.mode;b.onChange()}var b=a.undoManager=new g(a),e=a.addCommand("undo",{exec:function(){b.undo()&&(a.selectionChange(),this.fire("afterUndo"))},startDisabled:!0,canUndo:!1}),f=a.addCommand("redo",{exec:function(){b.redo()&&(a.selectionChange(),this.fire("afterRedo"))},startDisabled:!0,canUndo:!1}); +a.setKeystroke([[CKEDITOR.CTRL+90,"undo"],[CKEDITOR.CTRL+89,"redo"],[CKEDITOR.CTRL+CKEDITOR.SHIFT+90,"redo"]]);b.onChange=function(){e.setState(b.undoable()?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED);f.setState(b.redoable()?CKEDITOR.TRISTATE_OFF:CKEDITOR.TRISTATE_DISABLED)};a.on("beforeCommandExec",c);a.on("afterCommandExec",c);a.on("saveSnapshot",function(a){b.save(a.data&&a.data.contentOnly)});a.on("contentDom",function(){a.editable().on("keydown",function(a){a=a.data.getKey();(8==a||46== +a)&&b.type(a,0)});a.editable().on("keypress",function(a){b.type(a.data.getKey(),1)})});a.on("beforeModeUnload",function(){"wysiwyg"==a.mode&&b.save(!0)});a.on("mode",d);a.on("readOnly",d);a.ui.addButton&&(a.ui.addButton("Undo",{label:a.lang.undo.undo,command:"undo",toolbar:"undo,10"}),a.ui.addButton("Redo",{label:a.lang.undo.redo,command:"redo",toolbar:"undo,20"}));a.resetUndo=function(){b.reset();a.fire("saveSnapshot")};a.on("updateSnapshot",function(){b.currentImage&&b.update()});a.on("lockSnapshot", +function(a){b.lock(a.data&&a.data.dontUpdate)});a.on("unlockSnapshot",b.unlock,b)}});CKEDITOR.plugins.undo={};var f=CKEDITOR.plugins.undo.Image=function(a,c){this.editor=a;a.fire("beforeUndoImage");var d=a.getSnapshot();CKEDITOR.env.ie&&d&&(d=d.replace(/\s+data-cke-expando=".*?"/g,""));this.contents=d;c||(this.bookmarks=(d=d&&a.getSelection())&&d.createBookmarks2(!0));a.fire("afterUndoImage")},h=/\b(?:href|src|name)="[^"]*?"/gi;f.prototype={equalsContent:function(a){var c=this.contents,a=a.contents; +if(CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat))c=c.replace(h,""),a=a.replace(h,"");return c!=a?!1:!0},equalsSelection:function(a){var c=this.bookmarks,a=a.bookmarks;if(c||a){if(!c||!a||c.length!=a.length)return!1;for(var d=0;d<c.length;d++){var b=c[d],e=a[d];if(b.startOffset!=e.startOffset||b.endOffset!=e.endOffset||!CKEDITOR.tools.arrayCompare(b.start,e.start)||!CKEDITOR.tools.arrayCompare(b.end,e.end))return!1}}return!0}};g.prototype={type:function(a,c){var d=!c&&a!=this.lastKeystroke, +b=this.editor;if(!this.typing||c&&!this.wasCharacter||d){var e=new f(b),g=this.snapshots.length;CKEDITOR.tools.setTimeout(function(){var a=b.getSnapshot();CKEDITOR.env.ie&&(a=a.replace(/\s+data-cke-expando=".*?"/g,""));e.contents!=a&&g==this.snapshots.length&&(this.typing=!0,this.save(!1,e,!1)||this.snapshots.splice(this.index+1,this.snapshots.length-this.index-1),this.hasUndo=!0,this.hasRedo=!1,this.modifiersCount=this.typesCount=1,this.onChange())},0,this)}this.lastKeystroke=a;(this.wasCharacter= +c)?(this.modifiersCount=0,this.typesCount++,25<this.typesCount?(this.save(!1,null,!1),this.typesCount=1):setTimeout(function(){b.fire("change")},0)):(this.typesCount=0,this.modifiersCount++,25<this.modifiersCount?(this.save(!1,null,!1),this.modifiersCount=1):setTimeout(function(){b.fire("change")},0))},reset:function(){this.lastKeystroke=0;this.snapshots=[];this.index=-1;this.limit=this.editor.config.undoStackSize||20;this.currentImage=null;this.hasRedo=this.hasUndo=!1;this.locked=null;this.resetType()}, +resetType:function(){this.typing=!1;delete this.lastKeystroke;this.modifiersCount=this.typesCount=0},fireChange:function(){this.hasUndo=!!this.getNextImage(!0);this.hasRedo=!!this.getNextImage(!1);this.resetType();this.onChange()},save:function(a,c,d){if(this.locked)return!1;var b=this.snapshots;c||(c=new f(this.editor));if(!1===c.contents)return!1;if(this.currentImage)if(c.equalsContent(this.currentImage)){if(a||c.equalsSelection(this.currentImage))return!1}else this.editor.fire("change");b.splice(this.index+ +1,b.length-this.index-1);b.length==this.limit&&b.shift();this.index=b.push(c)-1;this.currentImage=c;!1!==d&&this.fireChange();return!0},restoreImage:function(a){var c=this.editor,d;a.bookmarks&&(c.focus(),d=c.getSelection());this.locked=1;this.editor.loadSnapshot(a.contents);a.bookmarks?d.selectBookmarks(a.bookmarks):CKEDITOR.env.ie&&(d=this.editor.document.getBody().$.createTextRange(),d.collapse(!0),d.select());this.locked=0;this.index=a.index;this.currentImage=this.snapshots[this.index];this.update(); +this.fireChange();c.fire("change")},getNextImage:function(a){var c=this.snapshots,d=this.currentImage,b;if(d)if(a)for(b=this.index-1;0<=b;b--){if(a=c[b],!d.equalsContent(a))return a.index=b,a}else for(b=this.index+1;b<c.length;b++)if(a=c[b],!d.equalsContent(a))return a.index=b,a;return null},redoable:function(){return this.enabled&&this.hasRedo},undoable:function(){return this.enabled&&this.hasUndo},undo:function(){if(this.undoable()){this.save(!0);var a=this.getNextImage(!0);if(a)return this.restoreImage(a), +!0}return!1},redo:function(){if(this.redoable()&&(this.save(!0),this.redoable())){var a=this.getNextImage(!1);if(a)return this.restoreImage(a),!0}return!1},update:function(a){if(!this.locked){a||(a=new f(this.editor));for(var c=this.index,d=this.snapshots;0<c&&this.currentImage.equalsContent(d[c-1]);)c-=1;d.splice(c,this.index-c+1,a);this.index=c;this.currentImage=a}},lock:function(a){this.locked?this.locked.level++:a?this.locked={level:1}:(a=new f(this.editor,!0),this.locked={update:this.currentImage&& +this.currentImage.equalsContent(a)?a:null,level:1})},unlock:function(){if(this.locked&&!--this.locked.level){var a=this.locked.update,c=a&&new f(this.editor,!0);this.locked=null;a&&!a.equalsContent(c)&&this.update()}}}})();CKEDITOR.config.wsc_removeGlobalVariable=!0; +CKEDITOR.plugins.add("wsc",{requires:"dialog",parseApi:function(a){a.config.wsc_onFinish="function"===typeof a.config.wsc_onFinish?a.config.wsc_onFinish:function(){};a.config.wsc_onClose="function"===typeof a.config.wsc_onClose?a.config.wsc_onClose:function(){}},parseConfig:function(a){a.config.wsc_customerId=a.config.wsc_customerId||CKEDITOR.config.wsc_customerId||"1:ua3xw1-2XyGJ3-GWruD3-6OFNT1-oXcuB1-nR6Bp4-hgQHc-EcYng3-sdRXG3-NOfFk";a.config.wsc_customDictionaryIds=a.config.wsc_customDictionaryIds|| +CKEDITOR.config.wsc_customDictionaryIds||"";a.config.wsc_userDictionaryName=a.config.wsc_userDictionaryName||CKEDITOR.config.wsc_userDictionaryName||"";a.config.wsc_customLoaderScript=a.config.wsc_customLoaderScript||CKEDITOR.config.wsc_customLoaderScript;CKEDITOR.config.wsc_cmd=a.config.wsc_cmd||CKEDITOR.config.wsc_cmd||"spell";CKEDITOR.config.wsc_version="v4.3.0-1e748a6"},init:function(a){this.parseConfig(a);this.parseApi(a);a.addCommand("checkspell",new CKEDITOR.dialogCommand("checkspell")).modes= +{wysiwyg:!CKEDITOR.env.opera&&!CKEDITOR.env.air&&document.domain==window.location.hostname};"undefined"==typeof a.plugins.scayt&&a.ui.addButton&&a.ui.addButton("SpellChecker",{label:a.lang.wsc.toolbar,command:"checkspell",toolbar:"spellchecker,10"});CKEDITOR.dialog.add("checkspell",this.path+(CKEDITOR.env.ie&&8>=CKEDITOR.env.version?"dialogs/wsc_ie.js":window.postMessage?"dialogs/wsc.js":"dialogs/wsc_ie.js"))}});CKEDITOR.config.plugins='dialogui,dialog,about,a11yhelp,basicstyles,blockquote,clipboard,panel,floatpanel,menu,contextmenu,resize,button,toolbar,elementspath,enterkey,entities,popup,filebrowser,floatingspace,listblock,richcombo,format,horizontalrule,htmlwriter,wysiwygarea,image,indent,indentlist,fakeobjects,link,list,magicline,maximize,pastetext,pastefromword,removeformat,sourcearea,specialchar,menubutton,scayt,stylescombo,tab,table,tabletools,undo,wsc';CKEDITOR.config.skin='moono';(function() {var setIcons = function(icons, strip) {var path = CKEDITOR.getUrl( 'plugins/' + strip );icons = icons.split( ',' );for ( var i = 0; i < icons.length; i++ )CKEDITOR.skin.icons[ icons[ i ] ] = { path: path, offset: -icons[ ++i ], bgsize : icons[ ++i ] };};if (CKEDITOR.env.hidpi) setIcons('about,0,,bold,24,,italic,48,,strike,72,,subscript,96,,superscript,120,,underline,144,,blockquote,168,,copy-rtl,192,,copy,216,,cut-rtl,240,,cut,264,,paste-rtl,288,,paste,312,,horizontalrule,336,,image,360,,indent-rtl,384,,indent,408,,outdent-rtl,432,,outdent,456,,anchor-rtl,480,,anchor,504,,link,528,,unlink,552,,bulletedlist-rtl,576,,bulletedlist,600,,numberedlist-rtl,624,,numberedlist,648,,maximize,672,,pastetext-rtl,696,,pastetext,720,,pastefromword-rtl,744,,pastefromword,768,,removeformat,792,,source-rtl,816,,source,840,,specialchar,864,,scayt,888,,table,912,,redo-rtl,936,,redo,960,,undo-rtl,984,,undo,1008,,spellchecker,1032,','icons_hidpi.png');else setIcons('about,0,auto,bold,24,auto,italic,48,auto,strike,72,auto,subscript,96,auto,superscript,120,auto,underline,144,auto,blockquote,168,auto,copy-rtl,192,auto,copy,216,auto,cut-rtl,240,auto,cut,264,auto,paste-rtl,288,auto,paste,312,auto,horizontalrule,336,auto,image,360,auto,indent-rtl,384,auto,indent,408,auto,outdent-rtl,432,auto,outdent,456,auto,anchor-rtl,480,auto,anchor,504,auto,link,528,auto,unlink,552,auto,bulletedlist-rtl,576,auto,bulletedlist,600,auto,numberedlist-rtl,624,auto,numberedlist,648,auto,maximize,672,auto,pastetext-rtl,696,auto,pastetext,720,auto,pastefromword-rtl,744,auto,pastefromword,768,auto,removeformat,792,auto,source-rtl,816,auto,source,840,auto,specialchar,864,auto,scayt,888,auto,table,912,auto,redo-rtl,936,auto,redo,960,auto,undo-rtl,984,auto,undo,1008,auto,spellchecker,1032,auto','icons.png');})();CKEDITOR.lang.languages={"af":1,"sq":1,"ar":1,"eu":1,"bn":1,"bs":1,"bg":1,"ca":1,"zh-cn":1,"zh":1,"hr":1,"cs":1,"da":1,"nl":1,"en":1,"en-au":1,"en-ca":1,"en-gb":1,"eo":1,"et":1,"fo":1,"fi":1,"fr":1,"fr-ca":1,"gl":1,"ka":1,"de":1,"el":1,"gu":1,"he":1,"hi":1,"hu":1,"is":1,"id":1,"it":1,"ja":1,"km":1,"ko":1,"ku":1,"lv":1,"lt":1,"mk":1,"ms":1,"mn":1,"no":1,"nb":1,"fa":1,"pl":1,"pt-br":1,"pt":1,"ro":1,"ru":1,"sr":1,"sr-latn":1,"si":1,"sk":1,"sl":1,"es":1,"sv":1,"th":1,"tr":1,"ug":1,"uk":1,"vi":1,"cy":1};}()); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/config.js b/theme/bootstrap/plugins/ckeditor/config.js new file mode 100644 index 0000000..66f6fbf --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/config.js @@ -0,0 +1,38 @@ +/** + * @license Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +CKEDITOR.editorConfig = function( config ) { + // Define changes to default configuration here. + // For the complete reference: + // http://docs.ckeditor.com/#!/api/CKEDITOR.config + + // The toolbar groups arrangement, optimized for two toolbar rows. + config.toolbarGroups = [ + { name: 'clipboard', groups: [ 'clipboard', 'undo' ] }, + { name: 'editing', groups: [ 'find', 'selection', 'spellchecker' ] }, + { name: 'links' }, + { name: 'insert' }, + { name: 'forms' }, + { name: 'tools' }, + { name: 'document', groups: [ 'mode', 'document', 'doctools' ] }, + { name: 'others' }, + '/', + { name: 'basicstyles', groups: [ 'basicstyles', 'cleanup' ] }, + { name: 'paragraph', groups: [ 'list', 'indent', 'blocks', 'align', 'bidi' ] }, + { name: 'styles' }, + { name: 'colors' }, + { name: 'about' } + ]; + + // Remove some buttons, provided by the standard plugins, which we don't + // need to have in the Standard(s) toolbar. + config.removeButtons = 'Underline,Subscript,Superscript'; + + // Se the most common block elements. + config.format_tags = 'p;h1;h2;h3;pre'; + + // Make dialogs simpler. + config.removeDialogTabs = 'image:advanced;link:advanced'; +}; diff --git a/theme/bootstrap/plugins/ckeditor/contents.css b/theme/bootstrap/plugins/ckeditor/contents.css new file mode 100644 index 0000000..0874d26 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/contents.css @@ -0,0 +1,123 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ + +body +{ + /* Font */ + font-family: sans-serif, Arial, Verdana, "Trebuchet MS"; + font-size: 12px; + + /* Text color */ + color: #333; + + /* Remove the background color to make it transparent */ + background-color: #fff; + + margin: 20px; +} + +.cke_editable +{ + font-size: 13px; + line-height: 1.6em; +} + +blockquote +{ + font-style: italic; + font-family: Georgia, Times, "Times New Roman", serif; + padding: 2px 0; + border-style: solid; + border-color: #ccc; + border-width: 0; +} + +.cke_contents_ltr blockquote +{ + padding-left: 20px; + padding-right: 8px; + border-left-width: 5px; +} + +.cke_contents_rtl blockquote +{ + padding-left: 8px; + padding-right: 20px; + border-right-width: 5px; +} + +a +{ + color: #0782C1; +} + +ol,ul,dl +{ + /* IE7: reset rtl list margin. (#7334) */ + *margin-right: 0px; + /* preserved spaces for list items with text direction other than the list. (#6249,#8049)*/ + padding: 0 40px; +} + +h1,h2,h3,h4,h5,h6 +{ + font-weight: normal; + line-height: 1.2em; +} + +hr +{ + border: 0px; + border-top: 1px solid #ccc; +} + +img.right +{ + border: 1px solid #ccc; + float: right; + margin-left: 15px; + padding: 5px; +} + +img.left +{ + border: 1px solid #ccc; + float: left; + margin-right: 15px; + padding: 5px; +} + +pre +{ + white-space: pre-wrap; /* CSS 2.1 */ + word-wrap: break-word; /* IE7 */ +} + +.marker +{ + background-color: Yellow; +} + +span[lang] +{ + font-style: italic; +} + +figure +{ + text-align: center; + border: solid 1px #ccc; + border-radius: 2px; + background: rgba(0,0,0,0.05); + padding: 10px; + margin: 10px 20px; + display: block; /* For IE8 */ +} + +figure figcaption +{ + text-align: center; + display: block; /* For IE8 */ +} diff --git a/theme/bootstrap/plugins/ckeditor/lang/af.js b/theme/bootstrap/plugins/ckeditor/lang/af.js new file mode 100644 index 0000000..899a640 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/af.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['af']={"editor":"Teksverwerker","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Druk op ALT 0 vir hulp","browseServer":"Blaai op bediener","url":"URL","protocol":"Protokol","upload":"Oplaai","uploadSubmit":"Stuur na bediener","image":"Afbeelding","flash":"Flash","form":"Vorm","checkbox":"Merkhokkie","radio":"Radioknoppie","textField":"Teksveld","textarea":"Teks-area","hiddenField":"Blinde veld","button":"Knop","select":"Keuseveld","imageButton":"Afbeeldingsknop","notSet":"<geen instelling>","id":"Id","name":"Naam","langDir":"Skryfrigting","langDirLtr":"Links na regs (LTR)","langDirRtl":"Regs na links (RTL)","langCode":"Taalkode","longDescr":"Lang beskrywing URL","cssClass":"CSS klasse","advisoryTitle":"Aanbevole titel","cssStyle":"Styl","ok":"OK","cancel":"Kanselleer","close":"Sluit","preview":"Voorbeeld","resize":"Sleep om te herskaal","generalTab":"Algemeen","advancedTab":"Gevorderd","validateNumberFailed":"Hierdie waarde is nie 'n getal nie.","confirmNewPage":"Alle wysiginge sal verlore gaan. Is u seker dat u 'n nuwe bladsy wil laai?","confirmCancel":"Sommige opsies is gewysig. Is u seker dat u hierdie dialoogvenster wil sluit?","options":"Opsies","target":"Doel","targetNew":"Nuwe venster (_blank)","targetTop":"Boonste venster (_top)","targetSelf":"Selfde venster (_self)","targetParent":"Oorspronklike venster (_parent)","langDirLTR":"Links na Regs (LTR)","langDirRTL":"Regs na Links (RTL)","styles":"Styl","cssClasses":"CSS klasse","width":"Breedte","height":"Hoogte","align":"Oplyn","alignLeft":"Links","alignRight":"Regs","alignCenter":"Sentreer","alignTop":"Bo","alignMiddle":"Middel","alignBottom":"Onder","invalidValue":"Invalid value.","invalidHeight":"Hoogte moet 'n getal wees","invalidWidth":"Breedte moet 'n getal wees.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, nie beskikbaar nie</span>"},"about":{"copy":"Kopiereg &copy; $1. Alle regte voorbehou.","dlgTitle":"Info oor CKEditor","help":"Check $1 for help.","moreInfo":"Vir lisensie-informasie, besoek asb. ons webwerf:","title":"Info oor CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Vet","italic":"Skuins","strike":"Deurstreep","subscript":"Onderskrif","superscript":"Bo-skrif","underline":"Onderstreep"},"blockquote":{"toolbar":"Sitaatblok"},"clipboard":{"copy":"Kopiëer","copyError":"U blaaier se sekuriteitsinstelling belet die kopiëringsaksie. Gebruik die sleutelbordkombinasie (Ctrl/Cmd+C).","cut":"Knip","cutError":"U blaaier se sekuriteitsinstelling belet die outomatiese knip-aksie. Gebruik die sleutelbordkombinasie (Ctrl/Cmd+X).","paste":"Plak","pasteArea":"Plak-area","pasteMsg":"Plak die teks in die volgende teks-area met die sleutelbordkombinasie (<STRONG>Ctrl/Cmd+V</STRONG>) en druk <STRONG>OK</STRONG>.","securityMsg":"Weens u blaaier se sekuriteitsinstelling is data op die knipbord nie toeganklik nie. U kan dit eers weer in hierdie venster plak.","title":"Byvoeg"},"contextmenu":{"options":"Konteks Spyskaart-opsies"},"toolbar":{"toolbarCollapse":"Verklein werkbalk","toolbarExpand":"Vergroot werkbalk","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elemente-pad","eleTitle":"%1 element"},"format":{"label":"Opmaak","panelTitle":"Opmaak","tag_address":"Adres","tag_div":"Normaal (DIV)","tag_h1":"Opskrif 1","tag_h2":"Opskrif 2","tag_h3":"Opskrif 3","tag_h4":"Opskrif 4","tag_h5":"Opskrif 5","tag_h6":"Opskrif 6","tag_p":"Normaal","tag_pre":"Opgemaak"},"horizontalrule":{"toolbar":"Horisontale lyn invoeg"},"image":{"alertUrl":"Gee URL van afbeelding.","alt":"Alternatiewe teks","border":"Rand","btnUpload":"Stuur na bediener","button2Img":"Wil u die geselekteerde afbeeldingsknop vervang met 'n eenvoudige afbeelding?","hSpace":"HSpasie","img2Button":"Wil u die geselekteerde afbeelding vervang met 'n afbeeldingsknop?","infoTab":"Afbeelding informasie","linkTab":"Skakel","lockRatio":"Vaste proporsie","menu":"Afbeelding eienskappe","resetSize":"Herstel grootte","title":"Afbeelding eienskappe","titleButton":"Afbeeldingsknop eienskappe","upload":"Oplaai","urlMissing":"Die URL na die afbeelding ontbreek.","vSpace":"VSpasie","validateBorder":"Rand moet 'n heelgetal wees.","validateHSpace":"HSpasie moet 'n heelgetal wees.","validateVSpace":"VSpasie moet 'n heelgetal wees."},"indent":{"indent":"Vergroot inspring","outdent":"Verklein inspring"},"fakeobjects":{"anchor":"Anker","flash":"Flash animasie","hiddenfield":"Verborge veld","iframe":"IFrame","unknown":"Onbekende objek"},"link":{"acccessKey":"Toegangsleutel","advanced":"Gevorderd","advisoryContentType":"Aanbevole inhoudstipe","advisoryTitle":"Aanbevole titel","anchor":{"toolbar":"Anker byvoeg/verander","menu":"Anker-eienskappe","title":"Anker-eienskappe","name":"Ankernaam","errorName":"Voltooi die ankernaam asseblief","remove":"Remove Anchor"},"anchorId":"Op element Id","anchorName":"Op ankernaam","charset":"Karakterstel van geskakelde bron","cssClasses":"CSS klasse","emailAddress":"E-posadres","emailBody":"Berig-inhoud","emailSubject":"Berig-onderwerp","id":"Id","info":"Skakel informasie","langCode":"Taalkode","langDir":"Skryfrigting","langDirLTR":"Links na regs (LTR)","langDirRTL":"Regs na links (RTL)","menu":"Wysig skakel","name":"Naam","noAnchors":"(Geen ankers beskikbaar in dokument)","noEmail":"Gee die e-posadres","noUrl":"Gee die skakel se URL","other":"<ander>","popupDependent":"Afhanklik (Netscape)","popupFeatures":"Eienskappe van opspringvenster","popupFullScreen":"Volskerm (IE)","popupLeft":"Posisie links","popupLocationBar":"Adresbalk","popupMenuBar":"Spyskaartbalk","popupResizable":"Herskaalbaar","popupScrollBars":"Skuifbalke","popupStatusBar":"Statusbalk","popupToolbar":"Werkbalk","popupTop":"Posisie bo","rel":"Relationship","selectAnchor":"Kies 'n anker","styles":"Styl","tabIndex":"Tab indeks","target":"Doel","targetFrame":"<raam>","targetFrameName":"Naam van doelraam","targetPopup":"<opspringvenster>","targetPopupName":"Naam van opspringvenster","title":"Skakel","toAnchor":"Anker in bladsy","toEmail":"E-pos","toUrl":"URL","toolbar":"Skakel invoeg/wysig","type":"Skakelsoort","unlink":"Verwyder skakel","upload":"Oplaai"},"list":{"bulletedlist":"Ongenommerde lys","numberedlist":"Genommerde lys"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maksimaliseer","minimize":"Minimaliseer"},"pastetext":{"button":"Plak as eenvoudige teks","title":"Plak as eenvoudige teks"},"pastefromword":{"confirmCleanup":"Die teks wat u wil plak lyk asof dit uit Word gekopiëer is. Wil u dit eers skoonmaak voordat dit geplak word?","error":"Die geplakte teks kon nie skoongemaak word nie, weens 'n interne fout","title":"Plak vanuit Word","toolbar":"Plak vanuit Word"},"removeformat":{"toolbar":"Verwyder opmaak"},"sourcearea":{"toolbar":"Bron"},"specialchar":{"options":"Spesiale karakter-opsies","title":"Kies spesiale karakter","toolbar":"Voeg spesiaale karakter in"},"scayt":{"about":"SCAYT info","aboutTab":"Info","addWord":"Voeg woord by","allCaps":"Ignoreer woorde in hoofletters","dic_create":"Skep","dic_delete":"Verwijder","dic_field_name":"Naam van woordeboek","dic_info":"Aanvanklik word die gebruikerswoordeboek in 'n koekie gestoor. Koekies is egter beperk in grootte. Wanneer die gebruikerswoordeboek te groot vir 'n koekie geword het, kan dit op ons bediener gestoor word. Om u persoonlike woordeboek op ons bediener te stoor, gee asb. 'n naam vir u woordeboek. Indien u alreeds 'n gestoorde woordeboek het, tik die naam en kliek op die Herstel knop.","dic_rename":"Hernoem","dic_restore":"Herstel","dictionariesTab":"Woordeboeke","disable":"SCAYT af","emptyDic":"Woordeboeknaam mag nie leeg wees nie.","enable":"SCAYT aan","ignore":"Ignoreer","ignoreAll":"Ignoreer alles","ignoreDomainNames":"Ignoreer domeinname","langs":"Tale","languagesTab":"Tale","mixedCase":"Ignoreer woorde met hoof- en kleinletters","mixedWithDigits":"Ignoreer woorde met syfers","moreSuggestions":"Meer voorstelle","opera_title":"Nie ondersteun deur Opera nie","options":"Opsies","optionsTab":"Opsies","title":"Speltoets terwyl u tik","toggle":"SCAYT wissel aan/af","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styl","panelTitle":"Opmaak style","panelTitle1":"Blok style","panelTitle2":"Inlyn style","panelTitle3":"Objek style"},"table":{"border":"Randbreedte","caption":"Naam","cell":{"menu":"Sel","insertBefore":"Voeg sel in voor","insertAfter":"Voeg sel in na","deleteCell":"Verwyder sel","merge":"Voeg selle saam","mergeRight":"Voeg saam na regs","mergeDown":"Voeg saam ondertoe","splitHorizontal":"Splits sel horisontaal","splitVertical":"Splits sel vertikaal","title":"Sel eienskappe","cellType":"Sel tipe","rowSpan":"Omspan rye","colSpan":"Omspan kolomme","wordWrap":"Woord terugloop","hAlign":"Horisontale oplyning","vAlign":"Vertikale oplyning","alignBaseline":"Basislyn","bgColor":"Agtergrondkleur","borderColor":"Randkleur","data":"Inhoud","header":"Opskrif","yes":"Ja","no":"Nee","invalidWidth":"Selbreedte moet 'n getal wees.","invalidHeight":"Selhoogte moet 'n getal wees.","invalidRowSpan":"Omspan rye moet 'n heelgetal wees.","invalidColSpan":"Omspan kolomme moet 'n heelgetal wees.","chooseColor":"Kies"},"cellPad":"Sel-spasie","cellSpace":"Sel-afstand","column":{"menu":"Kolom","insertBefore":"Voeg kolom in voor","insertAfter":"Voeg kolom in na","deleteColumn":"Verwyder kolom"},"columns":"Kolomme","deleteTable":"Verwyder tabel","headers":"Opskrifte","headersBoth":"Beide ","headersColumn":"Eerste kolom","headersNone":"Geen","headersRow":"Eerste ry","invalidBorder":"Randbreedte moet 'n getal wees.","invalidCellPadding":"Sel-spasie moet 'n getal wees.","invalidCellSpacing":"Sel-afstand moet 'n getal wees.","invalidCols":"Aantal kolomme moet 'n getal groter as 0 wees.","invalidHeight":"Tabelhoogte moet 'n getal wees.","invalidRows":"Aantal rye moet 'n getal groter as 0 wees.","invalidWidth":"Tabelbreedte moet 'n getal wees.","menu":"Tabel eienskappe","row":{"menu":"Ry","insertBefore":"Voeg ry in voor","insertAfter":"Voeg ry in na","deleteRow":"Verwyder ry"},"rows":"Rye","summary":"Opsomming","title":"Tabel eienskappe","toolbar":"Tabel","widthPc":"persent","widthPx":"piksels","widthUnit":"breedte-eenheid"},"undo":{"redo":"Oordoen","undo":"Ontdoen"},"wsc":{"btnIgnore":"Ignoreer","btnIgnoreAll":"Ignoreer alles","btnReplace":"Vervang","btnReplaceAll":"vervang alles","btnUndo":"Ontdoen","changeTo":"Verander na","errorLoading":"Fout by inlaai van diens: %s.","ieSpellDownload":"Speltoetser is nie geïnstalleer nie. Wil u dit nou aflaai?","manyChanges":"Klaar met speltoets: %1 woorde verander","noChanges":"Klaar met speltoets: Geen woorde verander nie","noMispell":"Klaar met speltoets: Geen foute nie","noSuggestions":"- Geen voorstel -","notAvailable":"Jammer, hierdie diens is nie nou beskikbaar nie.","notInDic":"Nie in woordeboek nie","oneChange":"Klaar met speltoets: Een woord verander","progress":"Spelling word getoets...","title":"Speltoetser","toolbar":"Speltoets"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/ar.js b/theme/bootstrap/plugins/ckeditor/lang/ar.js new file mode 100644 index 0000000..2c57ade --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/ar.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['ar']={"editor":"محرر النص الغني","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"إضغط على ALT + 0 للحصول على المساعدة.","browseServer":"تصفح","url":"الرابط","protocol":"البروتوكول","upload":"رفع","uploadSubmit":"أرسل","image":"صورة","flash":"فلاش","form":"نموذج","checkbox":"خانة إختيار","radio":"زر اختيار","textField":"مربع نص","textarea":"مساحة نصية","hiddenField":"إدراج حقل خفي","button":"زر ضغط","select":"اختار","imageButton":"زر صورة","notSet":"<بدون تحديد>","id":"الرقم","name":"إسم","langDir":"إتجاه النص","langDirLtr":"اليسار لليمين (LTR)","langDirRtl":"اليمين لليسار (RTL)","langCode":"رمز اللغة","longDescr":"الوصف التفصيلى","cssClass":"فئات التنسيق","advisoryTitle":"عنوان التقرير","cssStyle":"نمط","ok":"موافق","cancel":"إلغاء الأمر","close":"أغلق","preview":"استعراض","resize":"تغيير الحجم","generalTab":"عام","advancedTab":"متقدم","validateNumberFailed":"لايوجد نتيجة","confirmNewPage":"ستفقد أي متغييرات اذا لم تقم بحفظها اولا. هل أنت متأكد أنك تريد صفحة جديدة؟","confirmCancel":"بعض الخيارات قد تغيرت. هل أنت متأكد من إغلاق مربع النص؟","options":"خيارات","target":"هدف الرابط","targetNew":"نافذة جديدة","targetTop":"النافذة الأعلى","targetSelf":"داخل النافذة","targetParent":"النافذة الأم","langDirLTR":"اليسار لليمين (LTR)","langDirRTL":"اليمين لليسار (RTL)","styles":"نمط","cssClasses":"فئات التنسيق","width":"العرض","height":"الإرتفاع","align":"محاذاة","alignLeft":"يسار","alignRight":"يمين","alignCenter":"وسط","alignTop":"أعلى","alignMiddle":"وسط","alignBottom":"أسفل","invalidValue":"قيمة غير مفبولة.","invalidHeight":"الارتفاع يجب أن يكون عدداً.","invalidWidth":"العرض يجب أن يكون عدداً.","invalidCssLength":"قيمة الخانة المخصصة لـ \"%1\" يجب أن تكون رقما موجبا، باستخدام أو من غير استخدام وحدة CSS قياس مقبولة (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"قيمة الخانة المخصصة لـ \"%1\" يجب أن تكون رقما موجبا، باستخدام أو من غير استخدام وحدة HTML قياس مقبولة (px or %).","invalidInlineStyle":"قيمة الخانة المخصصة لـ Inline Style يجب أن تختوي على مجموع واحد أو أكثر بالشكل التالي: \"name : value\", مفصولة بفاصلة منقزطة.","cssLengthTooltip":"أدخل رقما للقيمة بالبكسل أو رقما بوحدة CSS مقبولة (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, غير متاح</span>"},"about":{"copy":"حقوق النشر &copy; $1. جميع الحقوق محفوظة.","dlgTitle":"عن CKEditor","help":"راجع $1 من أجل المساعدة","moreInfo":"للحصول على معلومات الترخيص ، يرجى زيارة موقعنا:","title":"عن CKEditor","userGuide":"دليل مستخدم CKEditor."},"basicstyles":{"bold":"عريض","italic":"مائل","strike":"يتوسطه خط","subscript":"منخفض","superscript":"مرتفع","underline":"تسطير"},"blockquote":{"toolbar":"اقتباس"},"clipboard":{"copy":"نسخ","copyError":"الإعدادات الأمنية للمتصفح الذي تستخدمه تمنع عمليات النسخ التلقائي. فضلاً إستخدم لوحة المفاتيح لفعل ذلك (Ctrl/Cmd+C).","cut":"قص","cutError":"الإعدادات الأمنية للمتصفح الذي تستخدمه تمنع القص التلقائي. فضلاً إستخدم لوحة المفاتيح لفعل ذلك (Ctrl/Cmd+X).","paste":"لصق","pasteArea":"منطقة اللصق","pasteMsg":"الصق داخل الصندوق بإستخدام زرائر (<STRONG>Ctrl/Cmd+V</STRONG>) في لوحة المفاتيح، ثم اضغط زر <STRONG>موافق</STRONG>.","securityMsg":"نظراً لإعدادات الأمان الخاصة بمتصفحك، لن يتمكن هذا المحرر من الوصول لمحتوى حافظتك، لذلك يجب عليك لصق المحتوى مرة أخرى في هذه النافذة.","title":"لصق"},"contextmenu":{"options":"خصائص قائمة السياق"},"toolbar":{"toolbarCollapse":"تقليص شريط الأدوت","toolbarExpand":"تمديد شريط الأدوات","toolbarGroups":{"document":"مستند","clipboard":"الحافظة/الرجوع","editing":"تحرير","forms":"نماذج","basicstyles":"نمط بسيط","paragraph":"فقرة","links":"روابط","insert":"إدراج","styles":"أنماط","colors":"ألوان","tools":"أدوات"},"toolbars":"أشرطة أدوات المحرر"},"elementspath":{"eleLabel":"مسار العنصر","eleTitle":"عنصر 1%"},"format":{"label":"تنسيق","panelTitle":"تنسيق الفقرة","tag_address":"عنوان","tag_div":"عادي (DIV)","tag_h1":"العنوان 1","tag_h2":"العنوان 2","tag_h3":"العنوان 3","tag_h4":"العنوان 4","tag_h5":"العنوان 5","tag_h6":"العنوان 6","tag_p":"عادي","tag_pre":"منسّق"},"horizontalrule":{"toolbar":"خط فاصل"},"image":{"alertUrl":"فضلاً أكتب الموقع الذي توجد عليه هذه الصورة.","alt":"عنوان الصورة","border":"سمك الحدود","btnUpload":"أرسلها للخادم","button2Img":"هل تريد تحويل زر الصورة المختار إلى صورة بسيطة؟","hSpace":"تباعد أفقي","img2Button":"هل تريد تحويل الصورة المختارة إلى زر صورة؟","infoTab":"معلومات الصورة","linkTab":"الرابط","lockRatio":"تناسق الحجم","menu":"خصائص الصورة","resetSize":"إستعادة الحجم الأصلي","title":"خصائص الصورة","titleButton":"خصائص زر الصورة","upload":"رفع","urlMissing":"عنوان مصدر الصورة مفقود","vSpace":"تباعد عمودي","validateBorder":"الإطار يجب أن يكون عددا","validateHSpace":"HSpace يجب أن يكون عدداً.","validateVSpace":"VSpace يجب أن يكون عدداً."},"indent":{"indent":"زيادة المسافة البادئة","outdent":"إنقاص المسافة البادئة"},"fakeobjects":{"anchor":"إرساء","flash":"رسم متحرك بالفلاش","hiddenfield":"إدراج حقل خفي","iframe":"iframe","unknown":"عنصر غير معروف"},"link":{"acccessKey":"مفاتيح الإختصار","advanced":"متقدم","advisoryContentType":"نوع التقرير","advisoryTitle":"عنوان التقرير","anchor":{"toolbar":"إشارة مرجعية","menu":"تحرير الإشارة المرجعية","title":"خصائص الإشارة المرجعية","name":"اسم الإشارة المرجعية","errorName":"الرجاء كتابة اسم الإشارة المرجعية","remove":"إزالة الإشارة المرجعية"},"anchorId":"حسب رقم العنصر","anchorName":"حسب إسم الإشارة المرجعية","charset":"ترميز المادة المطلوبة","cssClasses":"فئات التنسيق","emailAddress":"البريد الإلكتروني","emailBody":"محتوى الرسالة","emailSubject":"موضوع الرسالة","id":"هوية","info":"معلومات الرابط","langCode":"رمز اللغة","langDir":"إتجاه نص اللغة","langDirLTR":"اليسار لليمين (LTR)","langDirRTL":"اليمين لليسار (RTL)","menu":"تحرير الرابط","name":"إسم","noAnchors":"(لا توجد علامات مرجعية في هذا المستند)","noEmail":"الرجاء كتابة الريد الإلكتروني","noUrl":"الرجاء كتابة رابط الموقع","other":"<أخرى>","popupDependent":"تابع (Netscape)","popupFeatures":"خصائص النافذة المنبثقة","popupFullScreen":"ملئ الشاشة (IE)","popupLeft":"التمركز لليسار","popupLocationBar":"شريط العنوان","popupMenuBar":"القوائم الرئيسية","popupResizable":"قابلة التشكيل","popupScrollBars":"أشرطة التمرير","popupStatusBar":"شريط الحالة","popupToolbar":"شريط الأدوات","popupTop":"التمركز للأعلى","rel":"العلاقة","selectAnchor":"اختر علامة مرجعية","styles":"نمط","tabIndex":"الترتيب","target":"هدف الرابط","targetFrame":"<إطار>","targetFrameName":"اسم الإطار المستهدف","targetPopup":"<نافذة منبثقة>","targetPopupName":"اسم النافذة المنبثقة","title":"رابط","toAnchor":"مكان في هذا المستند","toEmail":"بريد إلكتروني","toUrl":"الرابط","toolbar":"رابط","type":"نوع الربط","unlink":"إزالة رابط","upload":"رفع"},"list":{"bulletedlist":"ادخال/حذف تعداد نقطي","numberedlist":"ادخال/حذف تعداد رقمي"},"magicline":{"title":"إدراج فقرة هنا"},"maximize":{"maximize":"تكبير","minimize":"تصغير"},"pastetext":{"button":"لصق كنص بسيط","title":"لصق كنص بسيط"},"pastefromword":{"confirmCleanup":"يبدو أن النص المراد لصقه منسوخ من برنامج وورد. هل تود تنظيفه قبل الشروع في عملية اللصق؟","error":"لم يتم مسح المعلومات الملصقة لخلل داخلي","title":"لصق من وورد","toolbar":"لصق من وورد"},"removeformat":{"toolbar":"إزالة التنسيقات"},"sourcearea":{"toolbar":"المصدر"},"specialchar":{"options":"خيارات الأحرف الخاصة","title":"اختر حرف خاص","toolbar":"إدراج حرف خاص"},"scayt":{"about":"عن SCAYT","aboutTab":"عن","addWord":"إضافة كلمة","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"قواميس","disable":"تعطيل SCAYT","emptyDic":"اسم القاموس يجب ألا يكون فارغاً.","enable":"تفعيل SCAYT","ignore":"تجاهل","ignoreAll":"تجاهل الكل","ignoreDomainNames":"Ignore Domain Names","langs":"لغات","languagesTab":"لغات","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"المزيد من المقترحات","opera_title":"Not supported by Opera","options":"خيارات","optionsTab":"خيارات","title":"تدقيق إملائي أثناء الكتابة","toggle":"تثبيت SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"أنماط","panelTitle":"أنماط التنسيق","panelTitle1":"أنماط الفقرة","panelTitle2":"أنماط مضمنة","panelTitle3":"أنماط الكائن"},"table":{"border":"الحدود","caption":"الوصف","cell":{"menu":"خلية","insertBefore":"إدراج خلية قبل","insertAfter":"إدراج خلية بعد","deleteCell":"حذف خلية","merge":"دمج خلايا","mergeRight":"دمج لليمين","mergeDown":"دمج للأسفل","splitHorizontal":"تقسيم الخلية أفقياً","splitVertical":"تقسيم الخلية عمودياً","title":"خصائص الخلية","cellType":"نوع الخلية","rowSpan":"امتداد الصفوف","colSpan":"امتداد الأعمدة","wordWrap":"التفاف النص","hAlign":"محاذاة أفقية","vAlign":"محاذاة رأسية","alignBaseline":"خط القاعدة","bgColor":"لون الخلفية","borderColor":"لون الحدود","data":"بيانات","header":"عنوان","yes":"نعم","no":"لا","invalidWidth":"عرض الخلية يجب أن يكون عدداً.","invalidHeight":"ارتفاع الخلية يجب أن يكون عدداً.","invalidRowSpan":"امتداد الصفوف يجب أن يكون عدداً صحيحاً.","invalidColSpan":"امتداد الأعمدة يجب أن يكون عدداً صحيحاً.","chooseColor":"اختر"},"cellPad":"المسافة البادئة","cellSpace":"تباعد الخلايا","column":{"menu":"عمود","insertBefore":"إدراج عمود قبل","insertAfter":"إدراج عمود بعد","deleteColumn":"حذف أعمدة"},"columns":"أعمدة","deleteTable":"حذف الجدول","headers":"العناوين","headersBoth":"كلاهما","headersColumn":"العمود الأول","headersNone":"بدون","headersRow":"الصف الأول","invalidBorder":"حجم الحد يجب أن يكون عدداً.","invalidCellPadding":"المسافة البادئة يجب أن تكون عدداً","invalidCellSpacing":"المسافة بين الخلايا يجب أن تكون عدداً.","invalidCols":"عدد الأعمدة يجب أن يكون عدداً أكبر من صفر.","invalidHeight":"ارتفاع الجدول يجب أن يكون عدداً.","invalidRows":"عدد الصفوف يجب أن يكون عدداً أكبر من صفر.","invalidWidth":"عرض الجدول يجب أن يكون عدداً.","menu":"خصائص الجدول","row":{"menu":"صف","insertBefore":"إدراج صف قبل","insertAfter":"إدراج صف بعد","deleteRow":"حذف صفوف"},"rows":"صفوف","summary":"الخلاصة","title":"خصائص الجدول","toolbar":"جدول","widthPc":"بالمئة","widthPx":"بكسل","widthUnit":"وحدة العرض"},"undo":{"redo":"إعادة","undo":"تراجع"},"wsc":{"btnIgnore":"تجاهل","btnIgnoreAll":"تجاهل الكل","btnReplace":"تغيير","btnReplaceAll":"تغيير الكل","btnUndo":"تراجع","changeTo":"التغيير إلى","errorLoading":"خطأ في تحميل تطبيق خدمة الاستضافة: %s.","ieSpellDownload":"المدقق الإملائي (الإنجليزي) غير مثبّت. هل تود تحميله الآن؟","manyChanges":"تم إكمال التدقيق الإملائي: تم تغيير %1 من كلمات","noChanges":"تم التدقيق الإملائي: لم يتم تغيير أي كلمة","noMispell":"تم التدقيق الإملائي: لم يتم العثور على أي أخطاء إملائية","noSuggestions":"- لا توجد إقتراحات -","notAvailable":"عفواً، ولكن هذه الخدمة غير متاحة الان","notInDic":"ليست في القاموس","oneChange":"تم التدقيق الإملائي: تم تغيير كلمة واحدة فقط","progress":"جاري التدقيق الاملائى","title":"التدقيق الإملائي","toolbar":"تدقيق إملائي"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/bg.js b/theme/bootstrap/plugins/ckeditor/lang/bg.js new file mode 100644 index 0000000..af3c4be --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/bg.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['bg']={"editor":"Текстов редактор за форматиран текст","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"натиснете ALT 0 за помощ","browseServer":"Избор от сървъра","url":"URL","protocol":"Протокол","upload":"Качване","uploadSubmit":"Изпращане към сървъра","image":"Снимка","flash":"Флаш","form":"Форма","checkbox":"Поле за избор","radio":"Радио бутон","textField":"Текстово поле","textarea":"Текстова зона","hiddenField":"Скрито поле","button":"Бутон","select":"Поле за избор","imageButton":"Бутон за снимка","notSet":"<не е избрано>","id":"ID","name":"Име","langDir":"Посока на езика","langDirLtr":"Ляво на дясно (ЛнД)","langDirRtl":"Дясно на ляво (ДнЛ)","langCode":"Код на езика","longDescr":"Уеб адрес за дълго описание","cssClass":"Класове за CSS","advisoryTitle":"Препоръчително заглавие","cssStyle":"Стил","ok":"ОК","cancel":"Отказ","close":"Затвори","preview":"Преглед","resize":"Влачете за да оразмерите","generalTab":"Общи","advancedTab":"Разширено","validateNumberFailed":"Тази стойност не е число","confirmNewPage":"Всички незапазени промени ще бъдат изгубени. Сигурни ли сте, че желаете да заредите нова страница?","confirmCancel":"Някои от опциите са променени. Сигурни ли сте, че желаете да затворите прозореца?","options":"Опции","target":"Цел","targetNew":"Нов прозорец (_blank)","targetTop":"Горна позиция (_top)","targetSelf":"Текущия прозорец (_self)","targetParent":"Основен прозорец (_parent)","langDirLTR":"Ляво на дясно (ЛнД)","langDirRTL":"Дясно на ляво (ДнЛ)","styles":"Стил","cssClasses":"Класове за CSS","width":"Ширина","height":"Височина","align":"Подравняване","alignLeft":"Ляво","alignRight":"Дясно","alignCenter":"Център","alignTop":"Горе","alignMiddle":"По средата","alignBottom":"Долу","invalidValue":"Невалидна стойност.","invalidHeight":"Височината трябва да е число.","invalidWidth":"Ширина требе да е число.","invalidCssLength":"Стойността на полето \"%1\" трябва да бъде положително число с или без валидна CSS измервателна единица (px, %, in, cm, mm, em, ex, pt, или pc).","invalidHtmlLength":"Стойността на полето \"%1\" трябва да бъде положително число с или без валидна HTML измервателна единица (px или %).","invalidInlineStyle":"Стойността на стилa трябва да съдържат една или повече двойки във формат \"name : value\", разделени с двоеточие.","cssLengthTooltip":"Въведете числена стойност в пиксели или друга валидна CSS единица (px, %, in, cm, mm, em, ex, pt, или pc).","unavailable":"%1<span class=\"cke_accessibility\">, недостъпно</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"Относно CKEditor","help":"Проверете $1 за помощ.","moreInfo":"За лицензионна информация моля посетете сайта ни:","title":"Относно CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Удебелен","italic":"Наклонен","strike":"Зачертан текст","subscript":"Индексиран текст","superscript":"Суперскрипт","underline":"Подчертан"},"blockquote":{"toolbar":"Блок за цитат"},"clipboard":{"copy":"Копирай","copyError":"Настройките за сигурност на вашия бразуър не разрешават на редактора да изпълни запаметяването. За целта използвайте клавиатурата (Ctrl/Cmd+C).","cut":"Отрежи","cutError":"Настройките за сигурност на Вашия браузър не позволяват на редактора автоматично да изъплни действията за отрязване. Моля ползвайте клавиатурните команди за целта (ctrl+x).","paste":"Вмъкни","pasteArea":"Зона за вмъкване","pasteMsg":"Вмъкнете тук съдъжанието с клавиатуарата (<STRONG>Ctrl/Cmd+V</STRONG>) и натиснете <STRONG>OK</STRONG>.","securityMsg":"Заради настройките за сигурност на Вашия браузър, редакторът не може да прочете данните от клипборда коректно.","title":"Вмъкни"},"contextmenu":{"options":"Опции на контекстното меню"},"toolbar":{"toolbarCollapse":"Свиване на лентата с инструменти","toolbarExpand":"Разширяване на лентата с инструменти","toolbarGroups":{"document":"Документ","clipboard":"Clipboard/Undo","editing":"Промяна","forms":"Форми","basicstyles":"Базови стилове","paragraph":"Параграф","links":"Връзки","insert":"Вмъкване","styles":"Стилове","colors":"Цветове","tools":"Инструменти"},"toolbars":"Ленти с инструменти"},"elementspath":{"eleLabel":"Път за елементите","eleTitle":"%1 елемент"},"format":{"label":"Формат","panelTitle":"Формат","tag_address":"Адрес","tag_div":"Параграф (DIV)","tag_h1":"Заглавие 1","tag_h2":"Заглавие 2","tag_h3":"Заглавие 3","tag_h4":"Заглавие 4","tag_h5":"Заглавие 5","tag_h6":"Заглавие 6","tag_p":"Нормален","tag_pre":"Форматиран"},"horizontalrule":{"toolbar":"Вмъкване на хоризонтална линия"},"image":{"alertUrl":"Моля, въведете пълния път до изображението","alt":"Алтернативен текст","border":"Рамка","btnUpload":"Изпрати я на сървъра","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"Хоризонтален отстъп","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Инфо за снимка","linkTab":"Връзка","lockRatio":"Заключване на съотношението","menu":"Настройки за снимка","resetSize":"Нулиране на размер","title":"Настройки за снимка","titleButton":"Настойки за бутон за снимка","upload":"Качване","urlMissing":"Image source URL is missing.","vSpace":"Вертикален отстъп","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Увеличаване на отстъпа","outdent":"Намаляване на отстъпа"},"fakeobjects":{"anchor":"Кука","flash":"Флаш анимация","hiddenfield":"Скрито поле","iframe":"IFrame","unknown":"Неизвестен обект"},"link":{"acccessKey":"Ключ за достъп","advanced":"Разширено","advisoryContentType":"Препоръчителен тип на съдържанието","advisoryTitle":"Препоръчително заглавие","anchor":{"toolbar":"Котва","menu":"Промяна на котва","title":"Настройки на котва","name":"Име на котва","errorName":"Моля въведете име на котвата","remove":"Премахване на котва"},"anchorId":"По ID на елемент","anchorName":"По име на котва","charset":"Тип на свързания ресурс","cssClasses":"Класове за CSS","emailAddress":"E-mail aдрес","emailBody":"Съдържание","emailSubject":"Тема","id":"ID","info":"Инфо за връзката","langCode":"Код за езика","langDir":"Посока на езика","langDirLTR":"Ляво на Дясно (ЛнД)","langDirRTL":"Дясно на Ляво (ДнЛ)","menu":"Промяна на връзка","name":"Име","noAnchors":"(Няма котви в текущия документ)","noEmail":"Моля въведете e-mail aдрес","noUrl":"Моля въведете URL адреса","other":"<друго>","popupDependent":"Зависимост (Netscape)","popupFeatures":"Функции на изкачащ прозорец","popupFullScreen":"Цял екран (IE)","popupLeft":"Лява позиция","popupLocationBar":"Лента с локацията","popupMenuBar":"Лента за меню","popupResizable":"Оразмеряем","popupScrollBars":"Скролери","popupStatusBar":"Статусна лента","popupToolbar":"Лента с инструменти","popupTop":"Горна позиция","rel":"Връзка","selectAnchor":"Изберете котва","styles":"Стил","tabIndex":"Ред на достъп","target":"Цел","targetFrame":"<frame>","targetFrameName":"Име на целевият прозорец","targetPopup":"<изкачащ прозорец>","targetPopupName":"Име на изкачащ прозорец","title":"Връзка","toAnchor":"Връзка към котва в текста","toEmail":"E-mail","toUrl":"Уеб адрес","toolbar":"Връзка","type":"Тип на връзката","unlink":"Премахни връзката","upload":"Качване"},"list":{"bulletedlist":"Вмъкване/Премахване на точков списък","numberedlist":"Вмъкване/Премахване на номериран списък"},"magicline":{"title":"Вмъкнете параграф тук"},"maximize":{"maximize":"Максимизиране","minimize":"Минимизиране"},"pastetext":{"button":"Вмъкни като чист текст","title":"Вмъкни като чист текст"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Вмъкни от MS Word","toolbar":"Вмъкни от MS Word"},"removeformat":{"toolbar":"Премахване на форматирането"},"sourcearea":{"toolbar":"Източник"},"specialchar":{"options":"Опции за специален знак","title":"Избор на специален знак","toolbar":"Вмъкване на специален знак"},"scayt":{"about":"About SCAYT","aboutTab":"Относно","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Нов","dic_delete":"Изтриване","dic_field_name":"Име на речнк","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Преименуване","dic_restore":"Възтановяване","dictionariesTab":"Речници","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Езици","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Игнорирани думи и цифри","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Стилове","panelTitle":"Стилове за форматиране","panelTitle1":"Блокови стилове","panelTitle2":"Вътрешни стилове","panelTitle3":"Обектни стилове"},"table":{"border":"Размер на рамката","caption":"Заглавие","cell":{"menu":"Клетка","insertBefore":"Вмъкване на клетка преди","insertAfter":"Вмъкване на клетка след","deleteCell":"Изтриване на клетки","merge":"Сливане на клетки","mergeRight":"Сливане в дясно","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Настройки на клетката","cellType":"Тип на клетката","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Авто. пренос","hAlign":"Хоризонтално подравняване","vAlign":"Вертикално подравняване","alignBaseline":"Базова линия","bgColor":"Фон","borderColor":"Цвят на рамката","data":"Данни","header":"Хедър","yes":"Да","no":"Не","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Изберете"},"cellPad":"Отделяне на клетките","cellSpace":"Разтояние между клетките","column":{"menu":"Колона","insertBefore":"Вмъкване на колона преди","insertAfter":"Вмъкване на колона след","deleteColumn":"Изтриване на колони"},"columns":"Колони","deleteTable":"Изтриване на таблица","headers":"Хедъри","headersBoth":"Заедно","headersColumn":"Първа колона","headersNone":"Няма","headersRow":"Първи ред","invalidBorder":"Размерът на рамката трябва да е число.","invalidCellPadding":"Отстоянието на клетките трябва да е позитивно число.","invalidCellSpacing":"Интервала в клетките трябва да е позитивно число.","invalidCols":"Броят колони трябва да е по-голям от 0.","invalidHeight":"Височината на таблицата трябва да е число.","invalidRows":"Броят редове трябва да е по-голям от 0.","invalidWidth":"Ширината на таблицата трябва да е число.","menu":"Настройки на таблицата","row":{"menu":"Ред","insertBefore":"Вмъкване на ред преди","insertAfter":"Вмъкване на ред след","deleteRow":"Изтриване на редове"},"rows":"Редове","summary":"Обща информация","title":"Настройки на таблицата","toolbar":"Таблица","widthPc":"процент","widthPx":"пиксела","widthUnit":"единица за ширина"},"undo":{"redo":"Връщане на предишен статус","undo":"Възтанови"},"wsc":{"btnIgnore":"Игнорирай","btnIgnoreAll":"Игнорирай всичко","btnReplace":"Препокриване","btnReplaceAll":"Препокрий всичко","btnUndo":"Възтанови","changeTo":"Промени на","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- Няма препоръчани -","notAvailable":"Съжаляваме, но услугата не е достъпна за момента","notInDic":"Не е в речника","oneChange":"Spell check complete: One word changed","progress":"Проверява се правописа...","title":"Проверка на правопис","toolbar":"Проверка на правопис"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/bn.js b/theme/bootstrap/plugins/ckeditor/lang/bn.js new file mode 100644 index 0000000..cace373 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/bn.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['bn']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"ব্রাউজ সার্ভার","url":"URL","protocol":"প্রোটোকল","upload":"আপলোড","uploadSubmit":"ইহাকে সার্ভারে প্রেরন কর","image":"ছবির লেবেল যুক্ত কর","flash":"ফ্লাশ লেবেল যুক্ত কর","form":"ফর্ম","checkbox":"চেক বাক্স","radio":"রেডিও বাটন","textField":"টেক্সট ফীল্ড","textarea":"টেক্সট এরিয়া","hiddenField":"গুপ্ত ফীল্ড","button":"বাটন","select":"বাছাই ফীল্ড","imageButton":"ছবির বাটন","notSet":"<সেট নেই>","id":"আইডি","name":"নাম","langDir":"ভাষা লেখার দিক","langDirLtr":"বাম থেকে ডান (LTR)","langDirRtl":"ডান থেকে বাম (RTL)","langCode":"ভাষা কোড","longDescr":"URL এর লম্বা বর্ণনা","cssClass":"স্টাইল-শীট ক্লাস","advisoryTitle":"পরামর্শ শীর্ষক","cssStyle":"স্টাইল","ok":"ওকে","cancel":"বাতিল","close":"Close","preview":"প্রিভিউ","resize":"Resize","generalTab":"General","advancedTab":"এডভান্সড","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"You have changed some options. Are you sure you want to close the dialog window?","options":"Options","target":"টার্গেট","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"বাম থেকে ডান (LTR)","langDirRTL":"ডান থেকে বাম (RTL)","styles":"স্টাইল","cssClasses":"স্টাইল-শীট ক্লাস","width":"প্রস্থ","height":"দৈর্ঘ্য","align":"এলাইন","alignLeft":"বামে","alignRight":"ডানে","alignCenter":"মাঝখানে","alignTop":"উপর","alignMiddle":"মধ্য","alignBottom":"নীচে","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"বোল্ড","italic":"ইটালিক","strike":"স্ট্রাইক থ্রু","subscript":"অধোলেখ","superscript":"অভিলেখ","underline":"আন্ডারলাইন"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"কপি","copyError":"আপনার ব্রাউজারের সুরক্ষা সেটিংস এডিটরকে অটোমেটিক কপি করার অনুমতি দেয়নি। দয়া করে এই কাজের জন্য কিবোর্ড ব্যবহার করুন (Ctrl/Cmd+C)।","cut":"কাট","cutError":"আপনার ব্রাউজারের সুরক্ষা সেটিংস এডিটরকে অটোমেটিক কাট করার অনুমতি দেয়নি। দয়া করে এই কাজের জন্য কিবোর্ড ব্যবহার করুন (Ctrl/Cmd+X)।","paste":"পেস্ট","pasteArea":"Paste Area","pasteMsg":"অনুগ্রহ করে নীচের বাক্সে কিবোর্ড ব্যবহার করে (<STRONG>Ctrl/Cmd+V</STRONG>) পেস্ট করুন এবং <STRONG>OK</STRONG> চাপ দিন","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"পেস্ট"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"ফন্ট ফরমেট","panelTitle":"ফন্ট ফরমেট","tag_address":"ঠিকানা","tag_div":"শীর্ষক (DIV)","tag_h1":"শীর্ষক ১","tag_h2":"শীর্ষক ২","tag_h3":"শীর্ষক ৩","tag_h4":"শীর্ষক ৪","tag_h5":"শীর্ষক ৫","tag_h6":"শীর্ষক ৬","tag_p":"সাধারণ","tag_pre":"ফর্মেটেড"},"horizontalrule":{"toolbar":"রেখা যুক্ত কর"},"image":{"alertUrl":"অনুগ্রহক করে ছবির URL টাইপ করুন","alt":"বিকল্প টেক্সট","border":"বর্ডার","btnUpload":"ইহাকে সার্ভারে প্রেরন কর","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"হরাইজন্টাল স্পেস","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"ছবির তথ্য","linkTab":"লিংক","lockRatio":"অনুপাত লক কর","menu":"ছবির প্রোপার্টি","resetSize":"সাইজ পূর্বাবস্থায় ফিরিয়ে দাও","title":"ছবির প্রোপার্টি","titleButton":"ছবি বাটন প্রোপার্টি","upload":"আপলোড","urlMissing":"Image source URL is missing.","vSpace":"ভার্টিকেল স্পেস","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"ইনডেন্ট বাড়াও","outdent":"ইনডেন্ট কমাও"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"এক্সেস কী","advanced":"এডভান্সড","advisoryContentType":"পরামর্শ কন্টেন্টের প্রকার","advisoryTitle":"পরামর্শ শীর্ষক","anchor":{"toolbar":"নোঙ্গর","menu":"নোঙর প্রোপার্টি","title":"নোঙর প্রোপার্টি","name":"নোঙরের নাম","errorName":"নোঙরের নাম টাইপ করুন","remove":"Remove Anchor"},"anchorId":"নোঙরের আইডি দিয়ে","anchorName":"নোঙরের নাম দিয়ে","charset":"লিংক রিসোর্স ক্যারেক্টর সেট","cssClasses":"স্টাইল-শীট ক্লাস","emailAddress":"ইমেইল ঠিকানা","emailBody":"মেসেজের দেহ","emailSubject":"মেসেজের বিষয়","id":"আইডি","info":"লিংক তথ্য","langCode":"ভাষা লেখার দিক","langDir":"ভাষা লেখার দিক","langDirLTR":"বাম থেকে ডান (LTR)","langDirRTL":"ডান থেকে বাম (RTL)","menu":"লিংক সম্পাদন","name":"নাম","noAnchors":"(No anchors available in the document)","noEmail":"অনুগ্রহ করে ইমেইল এড্রেস টাইপ করুন","noUrl":"অনুগ্রহ করে URL লিংক টাইপ করুন","other":"<other>","popupDependent":"ডিপেন্ডেন্ট (Netscape)","popupFeatures":"পপআপ উইন্ডো ফীচার সমূহ","popupFullScreen":"পূর্ণ পর্দা জুড়ে (IE)","popupLeft":"বামের পজিশন","popupLocationBar":"লোকেশন বার","popupMenuBar":"মেন্যু বার","popupResizable":"Resizable","popupScrollBars":"স্ক্রল বার","popupStatusBar":"স্ট্যাটাস বার","popupToolbar":"টুল বার","popupTop":"ডানের পজিশন","rel":"Relationship","selectAnchor":"নোঙর বাছাই","styles":"স্টাইল","tabIndex":"ট্যাব ইন্ডেক্স","target":"টার্গেট","targetFrame":"<ফ্রেম>","targetFrameName":"টার্গেট ফ্রেমের নাম","targetPopup":"<পপআপ উইন্ডো>","targetPopupName":"পপআপ উইন্ডোর নাম","title":"লিংক","toAnchor":"এই পেজে নোঙর কর","toEmail":"ইমেইল","toUrl":"URL","toolbar":"লিংক যুক্ত কর","type":"লিংক প্রকার","unlink":"লিংক সরাও","upload":"আপলোড"},"list":{"bulletedlist":"বুলেট লিস্ট লেবেল","numberedlist":"সাংখ্যিক লিস্টের লেবেল"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"সাদা টেক্সট হিসেবে পেস্ট কর","title":"সাদা টেক্সট হিসেবে পেস্ট কর"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"পেস্ট (শব্দ)","toolbar":"পেস্ট (শব্দ)"},"removeformat":{"toolbar":"ফরমেট সরাও"},"sourcearea":{"toolbar":"সোর্স"},"specialchar":{"options":"Special Character Options","title":"বিশেষ ক্যারেক্টার বাছাই কর","toolbar":"বিশেষ অক্ষর যুক্ত কর"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"স্টাইল","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"বর্ডার সাইজ","caption":"শীর্ষক","cell":{"menu":"সেল","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"সেল মুছে দাও","merge":"সেল জোড়া দাও","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"সেল প্যাডিং","cellSpace":"সেল স্পেস","column":{"menu":"কলাম","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"কলাম মুছে দাও"},"columns":"কলাম","deleteTable":"টেবিল ডিলীট কর","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"টেবিল প্রোপার্টি","row":{"menu":"রো","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"রো মুছে দাও"},"rows":"রো","summary":"সারাংশ","title":"টেবিল প্রোপার্টি","toolbar":"টেবিলের লেবেল যুক্ত কর","widthPc":"শতকরা","widthPx":"পিক্সেল","widthUnit":"width unit"},"undo":{"redo":"রি-ডু","undo":"আনডু"},"wsc":{"btnIgnore":"ইগনোর কর","btnIgnoreAll":"সব ইগনোর কর","btnReplace":"বদলে দাও","btnReplaceAll":"সব বদলে দাও","btnUndo":"আন্ডু","changeTo":"এতে বদলাও","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"বানান পরীক্ষক ইনস্টল করা নেই। আপনি কি এখনই এটা ডাউনলোড করতে চান?","manyChanges":"বানান পরীক্ষা শেষ: %1 গুলো শব্দ বদলে গ্যাছে","noChanges":"বানান পরীক্ষা শেষ: কোন শব্দ পরিবর্তন করা হয়নি","noMispell":"বানান পরীক্ষা শেষ: কোন ভুল বানান পাওয়া যায়নি","noSuggestions":"- কোন সাজেশন নেই -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"শব্দকোষে নেই","oneChange":"বানান পরীক্ষা শেষ: একটি মাত্র শব্দ পরিবর্তন করা হয়েছে","progress":"বানান পরীক্ষা চলছে...","title":"Spell Check","toolbar":"বানান চেক"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/bs.js b/theme/bootstrap/plugins/ckeditor/lang/bs.js new file mode 100644 index 0000000..903340a --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/bs.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['bs']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protokol","upload":"Šalji","uploadSubmit":"Šalji na server","image":"Slika","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<nije podešeno>","id":"Id","name":"Naziv","langDir":"Smjer pisanja","langDirLtr":"S lijeva na desno (LTR)","langDirRtl":"S desna na lijevo (RTL)","langCode":"Jezièni kôd","longDescr":"Dugaèki opis URL-a","cssClass":"Klase CSS stilova","advisoryTitle":"Advisory title","cssStyle":"Stil","ok":"OK","cancel":"Odustani","close":"Close","preview":"Prikaži","resize":"Resize","generalTab":"General","advancedTab":"Naprednije","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"You have changed some options. Are you sure you want to close the dialog window?","options":"Options","target":"Prozor","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"S lijeva na desno (LTR)","langDirRTL":"S desna na lijevo (RTL)","styles":"Stil","cssClasses":"Klase CSS stilova","width":"Širina","height":"Visina","align":"Poravnanje","alignLeft":"Lijevo","alignRight":"Desno","alignCenter":"Centar","alignTop":"Vrh","alignMiddle":"Sredina","alignBottom":"Dno","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Boldiraj","italic":"Ukosi","strike":"Precrtaj","subscript":"Subscript","superscript":"Superscript","underline":"Podvuci"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Kopiraj","copyError":"Sigurnosne postavke Vašeg pretraživaèa ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tastaturi (Ctrl/Cmd+C).","cut":"Izreži","cutError":"Sigurnosne postavke vašeg pretraživaèa ne dozvoljavaju operacije automatskog rezanja. Molimo koristite kraticu na tastaturi (Ctrl/Cmd+X).","paste":"Zalijepi","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Zalijepi"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Ubaci horizontalnu liniju"},"image":{"alertUrl":"Molimo ukucajte URL od slike.","alt":"Tekst na slici","border":"Okvir","btnUpload":"Šalji na server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Info slike","linkTab":"Link","lockRatio":"Zakljuèaj odnos","menu":"Svojstva slike","resetSize":"Resetuj dimenzije","title":"Svojstva slike","titleButton":"Image Button Properties","upload":"Šalji","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Poveæaj uvod","outdent":"Smanji uvod"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Pristupna tipka","advanced":"Naprednije","advisoryContentType":"Advisory vrsta sadržaja","advisoryTitle":"Advisory title","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"Po Id-u elementa","anchorName":"Po nazivu sidra","charset":"Linked Resource Charset","cssClasses":"Klase CSS stilova","emailAddress":"E-Mail Adresa","emailBody":"Poruka","emailSubject":"Subjekt poruke","id":"Id","info":"Link info","langCode":"Smjer pisanja","langDir":"Smjer pisanja","langDirLTR":"S lijeva na desno (LTR)","langDirRTL":"S desna na lijevo (RTL)","menu":"Izmjeni link","name":"Naziv","noAnchors":"(Nema dostupnih sidra na stranici)","noEmail":"Molimo ukucajte e-mail adresu","noUrl":"Molimo ukucajte URL link","other":"<other>","popupDependent":"Ovisno (Netscape)","popupFeatures":"Moguænosti popup prozora","popupFullScreen":"Cijeli ekran (IE)","popupLeft":"Lijeva pozicija","popupLocationBar":"Traka za lokaciju","popupMenuBar":"Izborna traka","popupResizable":"Resizable","popupScrollBars":"Scroll traka","popupStatusBar":"Statusna traka","popupToolbar":"Traka sa alatima","popupTop":"Gornja pozicija","rel":"Relationship","selectAnchor":"Izaberi sidro","styles":"Stil","tabIndex":"Tab indeks","target":"Prozor","targetFrame":"<frejm>","targetFrameName":"Target Frame Name","targetPopup":"<popup prozor>","targetPopupName":"Naziv popup prozora","title":"Link","toAnchor":"Sidro na ovoj stranici","toEmail":"E-Mail","toUrl":"URL","toolbar":"Ubaci/Izmjeni link","type":"Tip linka","unlink":"Izbriši link","upload":"Šalji"},"list":{"bulletedlist":"Lista","numberedlist":"Numerisana lista"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Zalijepi kao obièan tekst","title":"Zalijepi kao obièan tekst"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Zalijepi iz Word-a","toolbar":"Zalijepi iz Word-a"},"removeformat":{"toolbar":"Poništi format"},"sourcearea":{"toolbar":"HTML kôd"},"specialchar":{"options":"Special Character Options","title":"Izaberi specijalni karakter","toolbar":"Ubaci specijalni karater"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Okvir","caption":"Naslov","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Briši æelije","merge":"Spoji æelije","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Uvod æelija","cellSpace":"Razmak æelija","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Briši kolone"},"columns":"Kolona","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Svojstva tabele","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Briši redove"},"rows":"Redova","summary":"Summary","title":"Svojstva tabele","toolbar":"Tabela","widthPc":"posto","widthPx":"piksela","widthUnit":"width unit"},"undo":{"redo":"Ponovi","undo":"Vrati"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/ca.js b/theme/bootstrap/plugins/ckeditor/lang/ca.js new file mode 100644 index 0000000..ba85b2a --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/ca.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['ca']={"editor":"Editor de text enriquit","editorPanel":"Panell de l'editor de text enriquit","common":{"editorHelp":"Premeu ALT 0 per ajuda","browseServer":"Veure servidor","url":"URL","protocol":"Protocol","upload":"Puja","uploadSubmit":"Envia-la al servidor","image":"Imatge","flash":"Flash","form":"Formulari","checkbox":"Casella de verificació","radio":"Botó d'opció","textField":"Camp de text","textarea":"Àrea de text","hiddenField":"Camp ocult","button":"Botó","select":"Camp de selecció","imageButton":"Botó d'imatge","notSet":"<no definit>","id":"Id","name":"Nom","langDir":"Direcció de l'idioma","langDirLtr":"D'esquerra a dreta (LTR)","langDirRtl":"De dreta a esquerra (RTL)","langCode":"Codi d'idioma","longDescr":"Descripció llarga de la URL","cssClass":"Classes del full d'estil","advisoryTitle":"Títol consultiu","cssStyle":"Estil","ok":"D'acord","cancel":"Cancel·la","close":"Tanca","preview":"Previsualitza","resize":"Arrossegueu per redimensionar","generalTab":"General","advancedTab":"Avançat","validateNumberFailed":"Aquest valor no és un número.","confirmNewPage":"Els canvis en aquest contingut que no es desin es perdran. Esteu segur que voleu carregar una pàgina nova?","confirmCancel":"Algunes opcions s'han canviat. Esteu segur que voleu tancar el quadre de diàleg?","options":"Opcions","target":"Destí","targetNew":"Nova finestra (_blank)","targetTop":"Finestra superior (_top)","targetSelf":"Mateixa finestra (_self)","targetParent":"Finestra pare (_parent)","langDirLTR":"D'esquerra a dreta (LTR)","langDirRTL":"De dreta a esquerra (RTL)","styles":"Estil","cssClasses":"Classes del full d'estil","width":"Amplada","height":"Alçada","align":"Alineació","alignLeft":"Ajusta a l'esquerra","alignRight":"Ajusta a la dreta","alignCenter":"Centre","alignTop":"Superior","alignMiddle":"Centre","alignBottom":"Inferior","invalidValue":"Valor no vàlid.","invalidHeight":"L'alçada ha de ser un número.","invalidWidth":"L'amplada ha de ser un número.","invalidCssLength":"El valor especificat per als \"%1\" camps ha de ser un número positiu amb o sense unitat de mesura vàlida de CSS (px, %, in, cm, mm, em, ex, pt o pc).","invalidHtmlLength":"El valor especificat per als \"%1\" camps ha de ser un número positiu amb o sense unitat de mesura vàlida d'HTML (px o %).","invalidInlineStyle":"El valor especificat per l'estil en línia ha de constar d'una o més tuples amb el format \"name: value\", separats per punt i coma.","cssLengthTooltip":"Introduïu un número per un valor en píxels o un número amb una unitat vàlida de CSS (px, %, in, cm, mm, em, ex, pt o pc).","unavailable":"%1<span class=\"cke_accessibility\">, no disponible</span>"},"about":{"copy":"Copyright &copy; $1. Tots els drets reservats.","dlgTitle":"Quant al CKEditor","help":"Premi $1 per obtenir ajuda.","moreInfo":"Per informació sobre llicències visiteu el nostre lloc web:","title":"Quant al CKEditor","userGuide":"Manual d'usuari de CKEditor"},"basicstyles":{"bold":"Negreta","italic":"Cursiva","strike":"Ratllat","subscript":"Subíndex","superscript":"Superíndex","underline":"Subratllat"},"blockquote":{"toolbar":"Bloc de cita"},"clipboard":{"copy":"Copiar","copyError":"La configuració de seguretat del vostre navegador no permet executar automàticament les operacions de copiar. Si us plau, utilitzeu el teclat (Ctrl/Cmd+C).","cut":"Retallar","cutError":"La configuració de seguretat del vostre navegador no permet executar automàticament les operacions de retallar. Si us plau, utilitzeu el teclat (Ctrl/Cmd+X).","paste":"Enganxar","pasteArea":"Àrea d'enganxat","pasteMsg":"Si us plau, enganxi dins del següent camp utilitzant el teclat (<strong>Ctrl/Cmd+V</strong>) i premi OK.","securityMsg":"A causa de la configuració de seguretat del vostre navegador, l'editor no pot accedir a les dades del porta-retalls directament. Enganxeu-ho un altre cop en aquesta finestra.","title":"Enganxar"},"contextmenu":{"options":"Opcions del menú contextual"},"toolbar":{"toolbarCollapse":"Redueix la barra d'eines","toolbarExpand":"Amplia la barra d'eines","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor de barra d'eines"},"elementspath":{"eleLabel":"Ruta dels elements","eleTitle":"%1 element"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Adreça","tag_div":"Normal (DIV)","tag_h1":"Encapçalament 1","tag_h2":"Encapçalament 2","tag_h3":"Encapçalament 3","tag_h4":"Encapçalament 4","tag_h5":"Encapçalament 5","tag_h6":"Encapçalament 6","tag_p":"Normal","tag_pre":"Formatejat"},"horizontalrule":{"toolbar":"Insereix línia horitzontal"},"image":{"alertUrl":"Si us plau, escriviu la URL de la imatge","alt":"Text alternatiu","border":"Vora","btnUpload":"Envia-la al servidor","button2Img":"Voleu transformar el botó d'imatge seleccionat en una simple imatge?","hSpace":"Espaiat horit.","img2Button":"Voleu transformar la imatge seleccionada en un botó d'imatge?","infoTab":"Informació de la imatge","linkTab":"Enllaç","lockRatio":"Bloqueja les proporcions","menu":"Propietats de la imatge","resetSize":"Restaura la mida","title":"Propietats de la imatge","titleButton":"Propietats del botó d'imatge","upload":"Puja","urlMissing":"Falta la URL de la imatge.","vSpace":"Espaiat vert.","validateBorder":"La vora ha de ser un nombre enter.","validateHSpace":"HSpace ha de ser un nombre enter.","validateVSpace":"VSpace ha de ser un nombre enter."},"indent":{"indent":"Augmenta el sagnat","outdent":"Redueix el sagnat"},"fakeobjects":{"anchor":"Àncora","flash":"Animació Flash","hiddenfield":"Camp ocult","iframe":"IFrame","unknown":"Objecte desconegut"},"link":{"acccessKey":"Clau d'accés","advanced":"Avançat","advisoryContentType":"Tipus de contingut consultiu","advisoryTitle":"Títol consultiu","anchor":{"toolbar":"Insereix/Edita àncora","menu":"Propietats de l'àncora","title":"Propietats de l'àncora","name":"Nom de l'àncora","errorName":"Si us plau, escriviu el nom de l'ancora","remove":"Remove Anchor"},"anchorId":"Per Id d'element","anchorName":"Per nom d'àncora","charset":"Conjunt de caràcters font enllaçat","cssClasses":"Classes del full d'estil","emailAddress":"Adreça de correu electrònic","emailBody":"Cos del missatge","emailSubject":"Assumpte del missatge","id":"Id","info":"Informació de l'enllaç","langCode":"Direcció de l'idioma","langDir":"Direcció de l'idioma","langDirLTR":"D'esquerra a dreta (LTR)","langDirRTL":"De dreta a esquerra (RTL)","menu":"Edita l'enllaç","name":"Nom","noAnchors":"(No hi ha àncores disponibles en aquest document)","noEmail":"Si us plau, escrigui l'adreça correu electrònic","noUrl":"Si us plau, escrigui l'enllaç URL","other":"<altre>","popupDependent":"Depenent (Netscape)","popupFeatures":"Característiques finestra popup","popupFullScreen":"Pantalla completa (IE)","popupLeft":"Posició esquerra","popupLocationBar":"Barra d'adreça","popupMenuBar":"Barra de menú","popupResizable":"Redimensionable","popupScrollBars":"Barres d'scroll","popupStatusBar":"Barra d'estat","popupToolbar":"Barra d'eines","popupTop":"Posició dalt","rel":"Relació","selectAnchor":"Selecciona una àncora","styles":"Estil","tabIndex":"Index de Tab","target":"Destí","targetFrame":"<marc>","targetFrameName":"Nom del marc de destí","targetPopup":"<finestra emergent>","targetPopupName":"Nom finestra popup","title":"Enllaç","toAnchor":"Àncora en aquesta pàgina","toEmail":"Correu electrònic","toUrl":"URL","toolbar":"Insereix/Edita enllaç","type":"Tipus d'enllaç","unlink":"Elimina l'enllaç","upload":"Puja"},"list":{"bulletedlist":"Llista de pics","numberedlist":"Llista numerada"},"magicline":{"title":"Insereix el paràgraf aquí"},"maximize":{"maximize":"Maximitza","minimize":"Minimitza"},"pastetext":{"button":"Enganxa com a text no formatat","title":"Enganxa com a text no formatat"},"pastefromword":{"confirmCleanup":"El text que voleu enganxar sembla provenir de Word. Voleu netejar aquest text abans que sigui enganxat?","error":"No ha estat possible netejar les dades enganxades degut a un error intern","title":"Enganxa des del Word","toolbar":"Enganxa des del Word"},"removeformat":{"toolbar":"Elimina Format"},"sourcearea":{"toolbar":"Codi font"},"specialchar":{"options":"Opcions de caràcters especials","title":"Selecciona el caràcter especial","toolbar":"Insereix caràcter especial"},"scayt":{"about":"Quant a l'SCAYT","aboutTab":"Quant a","addWord":"Afegeix una paraula","allCaps":"Ignora paraules en majúscules","dic_create":"Crea","dic_delete":"Elimina","dic_field_name":"Nom del diccionari","dic_info":"Inicialment el diccionari d'usuari s'emmagatzema en una galeta. De totes maneres, les galetes tenen la mida limitada. Quan el diccionari creix massa, llavors el diccionari es pot emmagatzemar al nostre servidor. Per desar el vostre diccionari personal al nostre servidor heu d.'especificar un nom pel diccionari. Si ja heu desat un diccionari, teclegeu si us plau el seu nom i cliqueu el botó de restauració.","dic_rename":"Canvia el nom","dic_restore":"Restaura","dictionariesTab":"Diccionaris","disable":"Deshabilita SCAYT","emptyDic":"El nom del diccionari no hauria d'estar buit.","enable":"Habilitat l'SCAYT","ignore":"Ignora","ignoreAll":"Ignora'ls tots","ignoreDomainNames":"Ignora els noms de domini","langs":"Idiomes","languagesTab":"Idiomes","mixedCase":"Ignora paraules amb majúscules i minúscules","mixedWithDigits":"Ignora paraules amb números ","moreSuggestions":"Més suggerències","opera_title":"No és compatible amb l'Opera","options":"Opcions","optionsTab":"Opcions","title":"Spell Check As You Type","toggle":"Commuta l'SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Estil","panelTitle":"Estils de format","panelTitle1":"Estils de bloc","panelTitle2":"Estils incrustats","panelTitle3":"Estils d'objecte"},"table":{"border":"Mida vora","caption":"Títol","cell":{"menu":"Cel·la","insertBefore":"Insereix abans","insertAfter":"Insereix després","deleteCell":"Suprimeix","merge":"Fusiona","mergeRight":"Fusiona a la dreta","mergeDown":"Fusiona avall","splitHorizontal":"Divideix horitzontalment","splitVertical":"Divideix verticalment","title":"Propietats de la cel·la","cellType":"Tipus de cel·la","rowSpan":"Expansió de files","colSpan":"Expansió de columnes","wordWrap":"Ajustar al contingut","hAlign":"Alineació Horizontal","vAlign":"Alineació Vertical","alignBaseline":"A la línia base","bgColor":"Color de fons","borderColor":"Color de la vora","data":"Dades","header":"Capçalera","yes":"Sí","no":"No","invalidWidth":"L'amplada de cel·la ha de ser un nombre.","invalidHeight":"L'alçada de cel·la ha de ser un nombre.","invalidRowSpan":"L'expansió de files ha de ser un nombre enter.","invalidColSpan":"L'expansió de columnes ha de ser un nombre enter.","chooseColor":"Trieu"},"cellPad":"Encoixinament de cel·les","cellSpace":"Espaiat de cel·les","column":{"menu":"Columna","insertBefore":"Insereix columna abans de","insertAfter":"Insereix columna darrera","deleteColumn":"Suprimeix una columna"},"columns":"Columnes","deleteTable":"Suprimeix la taula","headers":"Capçaleres","headersBoth":"Ambdues","headersColumn":"Primera columna","headersNone":"Cap","headersRow":"Primera fila","invalidBorder":"El gruix de la vora ha de ser un nombre.","invalidCellPadding":"L'encoixinament de cel·la ha de ser un nombre.","invalidCellSpacing":"L'espaiat de cel·la ha de ser un nombre.","invalidCols":"El nombre de columnes ha de ser un nombre major que 0.","invalidHeight":"L'alçada de la taula ha de ser un nombre.","invalidRows":"El nombre de files ha de ser un nombre major que 0.","invalidWidth":"L'amplada de la taula ha de ser un nombre.","menu":"Propietats de la taula","row":{"menu":"Fila","insertBefore":"Insereix fila abans de","insertAfter":"Insereix fila darrera","deleteRow":"Suprimeix una fila"},"rows":"Files","summary":"Resum","title":"Propietats de la taula","toolbar":"Taula","widthPc":"percentatge","widthPx":"píxels","widthUnit":"unitat d'amplada"},"undo":{"redo":"Refés","undo":"Desfés"},"wsc":{"btnIgnore":"Ignora","btnIgnoreAll":"Ignora-les totes","btnReplace":"Canvia","btnReplaceAll":"Canvia-les totes","btnUndo":"Desfés","changeTo":"Reemplaça amb","errorLoading":"Error carregant el servidor: %s.","ieSpellDownload":"Verificació ortogràfica no instal·lada. Voleu descarregar-ho ara?","manyChanges":"Verificació ortogràfica: s'han canviat %1 paraules","noChanges":"Verificació ortogràfica: no s'ha canviat cap paraula","noMispell":"Verificació ortogràfica acabada: no hi ha cap paraula mal escrita","noSuggestions":"Cap suggeriment","notAvailable":"El servei no es troba disponible ara.","notInDic":"No és al diccionari","oneChange":"Verificació ortogràfica: s'ha canviat una paraula","progress":"Verificació ortogràfica en curs...","title":"Comprova l'ortografia","toolbar":"Revisa l'ortografia"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/cs.js b/theme/bootstrap/plugins/ckeditor/lang/cs.js new file mode 100644 index 0000000..6674891 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/cs.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['cs']={"editor":"Textový editor","editorPanel":"Panel textového editoru","common":{"editorHelp":"Stiskněte ALT 0 pro nápovědu","browseServer":"Vybrat na serveru","url":"URL","protocol":"Protokol","upload":"Odeslat","uploadSubmit":"Odeslat na server","image":"Obrázek","flash":"Flash","form":"Formulář","checkbox":"Zaškrtávací políčko","radio":"Přepínač","textField":"Textové pole","textarea":"Textová oblast","hiddenField":"Skryté pole","button":"Tlačítko","select":"Seznam","imageButton":"Obrázkové tlačítko","notSet":"<nenastaveno>","id":"Id","name":"Jméno","langDir":"Směr jazyka","langDirLtr":"Zleva doprava (LTR)","langDirRtl":"Zprava doleva (RTL)","langCode":"Kód jazyka","longDescr":"Dlouhý popis URL","cssClass":"Třída stylu","advisoryTitle":"Pomocný titulek","cssStyle":"Styl","ok":"OK","cancel":"Zrušit","close":"Zavřít","preview":"Náhled","resize":"Uchopit pro změnu velikosti","generalTab":"Obecné","advancedTab":"Rozšířené","validateNumberFailed":"Zadaná hodnota není číselná.","confirmNewPage":"Jakékoliv neuložené změny obsahu budou ztraceny. Skutečně chcete otevřít novou stránku?","confirmCancel":"Některá z nastavení byla změněna. Skutečně chcete zavřít dialogové okno?","options":"Nastavení","target":"Cíl","targetNew":"Nové okno (_blank)","targetTop":"Okno nejvyšší úrovně (_top)","targetSelf":"Stejné okno (_self)","targetParent":"Rodičovské okno (_parent)","langDirLTR":"Zleva doprava (LTR)","langDirRTL":"Zprava doleva (RTL)","styles":"Styly","cssClasses":"Třídy stylů","width":"Šířka","height":"Výška","align":"Zarovnání","alignLeft":"Vlevo","alignRight":"Vpravo","alignCenter":"Na střed","alignTop":"Nahoru","alignMiddle":"Na střed","alignBottom":"Dolů","invalidValue":"Neplatná hodnota.","invalidHeight":"Zadaná výška musí být číslo.","invalidWidth":"Šířka musí být číslo.","invalidCssLength":"Hodnota určená pro pole \"%1\" musí být kladné číslo bez nebo s platnou jednotkou míry CSS (px, %, in, cm, mm, em, ex, pt, nebo pc).","invalidHtmlLength":"Hodnota určená pro pole \"%1\" musí být kladné číslo bez nebo s platnou jednotkou míry HTML (px nebo %).","invalidInlineStyle":"Hodnota určená pro řádkový styl se musí skládat z jedné nebo více n-tic ve formátu \"název : hodnota\", oddělené středníky","cssLengthTooltip":"Zadejte číslo jako hodnotu v pixelech nebo číslo s platnou jednotkou CSS (px, %, v cm, mm, em, ex, pt, nebo pc).","unavailable":"%1<span class=\"cke_accessibility\">, nedostupné</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"O aplikaci CKEditor","help":"Prohlédněte si $1 pro nápovědu.","moreInfo":"Pro informace o lincenci navštivte naši webovou stránku:","title":"O aplikaci CKEditor","userGuide":"Uživatelská příručka CKEditor"},"basicstyles":{"bold":"Tučné","italic":"Kurzíva","strike":"Přeškrtnuté","subscript":"Dolní index","superscript":"Horní index","underline":"Podtržené"},"blockquote":{"toolbar":"Citace"},"clipboard":{"copy":"Kopírovat","copyError":"Bezpečnostní nastavení vašeho prohlížeče nedovolují editoru spustit funkci pro kopírování zvoleného textu do schránky. Prosím zkopírujte zvolený text do schránky pomocí klávesnice (Ctrl/Cmd+C).","cut":"Vyjmout","cutError":"Bezpečnostní nastavení vašeho prohlížeče nedovolují editoru spustit funkci pro vyjmutí zvoleného textu do schránky. Prosím vyjměte zvolený text do schránky pomocí klávesnice (Ctrl/Cmd+X).","paste":"Vložit","pasteArea":"Oblast vkládání","pasteMsg":"Do následujícího pole vložte požadovaný obsah pomocí klávesnice (<STRONG>Ctrl/Cmd+V</STRONG>) a stiskněte <STRONG>OK</STRONG>.","securityMsg":"Z důvodů nastavení bezpečnosti vašeho prohlížeče nemůže editor přistupovat přímo do schránky. Obsah schránky prosím vložte znovu do tohoto okna.","title":"Vložit"},"contextmenu":{"options":"Nastavení kontextové nabídky"},"toolbar":{"toolbarCollapse":"Skrýt panel nástrojů","toolbarExpand":"Zobrazit panel nástrojů","toolbarGroups":{"document":"Dokument","clipboard":"Schránka/Zpět","editing":"Úpravy","forms":"Formuláře","basicstyles":"Základní styly","paragraph":"Odstavec","links":"Odkazy","insert":"Vložit","styles":"Styly","colors":"Barvy","tools":"Nástroje"},"toolbars":"Panely nástrojů editoru"},"elementspath":{"eleLabel":"Cesta objektu","eleTitle":"%1 objekt"},"format":{"label":"Formát","panelTitle":"Formát","tag_address":"Adresa","tag_div":"Normální (DIV)","tag_h1":"Nadpis 1","tag_h2":"Nadpis 2","tag_h3":"Nadpis 3","tag_h4":"Nadpis 4","tag_h5":"Nadpis 5","tag_h6":"Nadpis 6","tag_p":"Normální","tag_pre":"Naformátováno"},"horizontalrule":{"toolbar":"Vložit vodorovnou linku"},"image":{"alertUrl":"Zadejte prosím URL obrázku","alt":"Alternativní text","border":"Okraje","btnUpload":"Odeslat na server","button2Img":"Skutečně chcete převést zvolené obrázkové tlačítko na obyčejný obrázek?","hSpace":"Horizontální mezera","img2Button":"Skutečně chcete převést zvolený obrázek na obrázkové tlačítko?","infoTab":"Informace o obrázku","linkTab":"Odkaz","lockRatio":"Zámek","menu":"Vlastnosti obrázku","resetSize":"Původní velikost","title":"Vlastnosti obrázku","titleButton":"Vlastností obrázkového tlačítka","upload":"Odeslat","urlMissing":"Zadané URL zdroje obrázku nebylo nalezeno.","vSpace":"Vertikální mezera","validateBorder":"Okraj musí být nastaven v celých číslech.","validateHSpace":"Horizontální mezera musí být nastavena v celých číslech.","validateVSpace":"Vertikální mezera musí být nastavena v celých číslech."},"indent":{"indent":"Zvětšit odsazení","outdent":"Zmenšit odsazení"},"fakeobjects":{"anchor":"Záložka","flash":"Flash animace","hiddenfield":"Skryté pole","iframe":"IFrame","unknown":"Neznámý objekt"},"link":{"acccessKey":"Přístupový klíč","advanced":"Rozšířené","advisoryContentType":"Pomocný typ obsahu","advisoryTitle":"Pomocný titulek","anchor":{"toolbar":"Záložka","menu":"Vlastnosti záložky","title":"Vlastnosti záložky","name":"Název záložky","errorName":"Zadejte prosím název záložky","remove":"Odstranit záložku"},"anchorId":"Podle Id objektu","anchorName":"Podle jména kotvy","charset":"Přiřazená znaková sada","cssClasses":"Třída stylu","emailAddress":"E-mailová adresa","emailBody":"Tělo zprávy","emailSubject":"Předmět zprávy","id":"Id","info":"Informace o odkazu","langCode":"Kód jazyka","langDir":"Směr jazyka","langDirLTR":"Zleva doprava (LTR)","langDirRTL":"Zprava doleva (RTL)","menu":"Změnit odkaz","name":"Jméno","noAnchors":"(Ve stránce není definována žádná kotva!)","noEmail":"Zadejte prosím e-mailovou adresu","noUrl":"Zadejte prosím URL odkazu","other":"<jiný>","popupDependent":"Závislost (Netscape)","popupFeatures":"Vlastnosti vyskakovacího okna","popupFullScreen":"Celá obrazovka (IE)","popupLeft":"Levý okraj","popupLocationBar":"Panel umístění","popupMenuBar":"Panel nabídky","popupResizable":"Umožňující měnit velikost","popupScrollBars":"Posuvníky","popupStatusBar":"Stavový řádek","popupToolbar":"Panel nástrojů","popupTop":"Horní okraj","rel":"Vztah","selectAnchor":"Vybrat kotvu","styles":"Styl","tabIndex":"Pořadí prvku","target":"Cíl","targetFrame":"<rámec>","targetFrameName":"Název cílového rámu","targetPopup":"<vyskakovací okno>","targetPopupName":"Název vyskakovacího okna","title":"Odkaz","toAnchor":"Kotva v této stránce","toEmail":"E-mail","toUrl":"URL","toolbar":"Odkaz","type":"Typ odkazu","unlink":"Odstranit odkaz","upload":"Odeslat"},"list":{"bulletedlist":"Odrážky","numberedlist":"Číslování"},"magicline":{"title":"zde vložit odstavec"},"maximize":{"maximize":"Maximalizovat","minimize":"Minimalizovat"},"pastetext":{"button":"Vložit jako čistý text","title":"Vložit jako čistý text"},"pastefromword":{"confirmCleanup":"Jak je vidět, vkládaný text je kopírován z Wordu. Chcete jej před vložením vyčistit?","error":"Z důvodu vnitřní chyby nebylo možné provést vyčištění vkládaného textu.","title":"Vložit z Wordu","toolbar":"Vložit z Wordu"},"removeformat":{"toolbar":"Odstranit formátování"},"sourcearea":{"toolbar":"Zdroj"},"specialchar":{"options":"Nastavení speciálních znaků","title":"Výběr speciálního znaku","toolbar":"Vložit speciální znaky"},"scayt":{"about":"O aplikaci SCAYT","aboutTab":"O aplikaci","addWord":"Přidat slovo","allCaps":"Ignorovat slova tvořená velkými písmeny","dic_create":"Vytvořit","dic_delete":"Smazat","dic_field_name":"Název slovníku","dic_info":"Zpočátku se uživatelský slovník ukládá do cookies ve vašem prohlížeči. Ovšem cookies mají omezenou velikost, takže když slovník dosáhne velikosti, kdy se již do cookies nevejde, může být uložen na našem serveru. Chcete-li uložit váš osobní slovník na našem serveru, je třeba slovník nejdříve pojmenovat. Máte-li již slovník pojmenován a uložen, zadejte jeho název a klepněte na tlačítko Obnovit.","dic_rename":"Přejmenovat","dic_restore":"Obnovit","dictionariesTab":"Slovníky","disable":"Vypnout SCAYT","emptyDic":"Název slovníku nesmí být prázdný.","enable":"Zapnout SCAYT","ignore":"Přeskočit","ignoreAll":"Přeskočit vše","ignoreDomainNames":"Ignorovat doménová jména","langs":"Jazyky","languagesTab":"Jazyky","mixedCase":"Ignorovat slova obsahující různou velikost písma","mixedWithDigits":"Ignorovat slova obsahující čísla","moreSuggestions":"Více návrhů","opera_title":"Toto Opera nepodporuje","options":"Nastavení","optionsTab":"Nastavení","title":"Kontrola pravopisu během psaní (SCAYT)","toggle":"Vypínač SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styl","panelTitle":"Formátovací styly","panelTitle1":"Blokové styly","panelTitle2":"Řádkové styly","panelTitle3":"Objektové styly"},"table":{"border":"Ohraničení","caption":"Popis","cell":{"menu":"Buňka","insertBefore":"Vložit buňku před","insertAfter":"Vložit buňku za","deleteCell":"Smazat buňky","merge":"Sloučit buňky","mergeRight":"Sloučit doprava","mergeDown":"Sloučit dolů","splitHorizontal":"Rozdělit buňky vodorovně","splitVertical":"Rozdělit buňky svisle","title":"Vlastnosti buňky","cellType":"Typ buňky","rowSpan":"Spojit řádky","colSpan":"Spojit sloupce","wordWrap":"Zalamování","hAlign":"Vodorovné zarovnání","vAlign":"Svislé zarovnání","alignBaseline":"Na účaří","bgColor":"Barva pozadí","borderColor":"Barva okraje","data":"Data","header":"Hlavička","yes":"Ano","no":"Ne","invalidWidth":"Šířka buňky musí být číslo.","invalidHeight":"Zadaná výška buňky musí být číslená.","invalidRowSpan":"Zadaný počet sloučených řádků musí být celé číslo.","invalidColSpan":"Zadaný počet sloučených sloupců musí být celé číslo.","chooseColor":"Výběr"},"cellPad":"Odsazení obsahu v buňce","cellSpace":"Vzdálenost buněk","column":{"menu":"Sloupec","insertBefore":"Vložit sloupec před","insertAfter":"Vložit sloupec za","deleteColumn":"Smazat sloupec"},"columns":"Sloupce","deleteTable":"Smazat tabulku","headers":"Záhlaví","headersBoth":"Obojí","headersColumn":"První sloupec","headersNone":"Žádné","headersRow":"První řádek","invalidBorder":"Zdaná velikost okraje musí být číselná.","invalidCellPadding":"Zadané odsazení obsahu v buňce musí být číselné.","invalidCellSpacing":"Zadaná vzdálenost buněk musí být číselná.","invalidCols":"Počet sloupců musí být číslo větší než 0.","invalidHeight":"Zadaná výška tabulky musí být číselná.","invalidRows":"Počet řádků musí být číslo větší než 0.","invalidWidth":"Šířka tabulky musí být číslo.","menu":"Vlastnosti tabulky","row":{"menu":"Řádek","insertBefore":"Vložit řádek před","insertAfter":"Vložit řádek za","deleteRow":"Smazat řádky"},"rows":"Řádky","summary":"Souhrn","title":"Vlastnosti tabulky","toolbar":"Tabulka","widthPc":"procent","widthPx":"bodů","widthUnit":"jednotka šířky"},"undo":{"redo":"Znovu","undo":"Zpět"},"wsc":{"btnIgnore":"Přeskočit","btnIgnoreAll":"Přeskakovat vše","btnReplace":"Zaměnit","btnReplaceAll":"Zaměňovat vše","btnUndo":"Zpět","changeTo":"Změnit na","errorLoading":"Chyba nahrávání služby aplikace z: %s.","ieSpellDownload":"Kontrola pravopisu není nainstalována. Chcete ji nyní stáhnout?","manyChanges":"Kontrola pravopisu dokončena: %1 slov změněno","noChanges":"Kontrola pravopisu dokončena: Beze změn","noMispell":"Kontrola pravopisu dokončena: Žádné pravopisné chyby nenalezeny","noSuggestions":"- žádné návrhy -","notAvailable":"Omlouváme se, ale služba nyní není dostupná.","notInDic":"Není ve slovníku","oneChange":"Kontrola pravopisu dokončena: Jedno slovo změněno","progress":"Probíhá kontrola pravopisu...","title":"Kontrola pravopisu","toolbar":"Zkontrolovat pravopis"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/cy.js b/theme/bootstrap/plugins/ckeditor/lang/cy.js new file mode 100644 index 0000000..a025e07 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/cy.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['cy']={"editor":"Golygydd Testun Cyfoethog","editorPanel":"Panel Golygydd Testun Cyfoethog","common":{"editorHelp":"Gwasgwch ALT 0 am gymorth","browseServer":"Pori'r Gweinydd","url":"URL","protocol":"Protocol","upload":"Lanlwytho","uploadSubmit":"Anfon i'r Gweinydd","image":"Delwedd","flash":"Flash","form":"Ffurflen","checkbox":"Blwch ticio","radio":"Botwm Radio","textField":"Maes Testun","textarea":"Ardal Testun","hiddenField":"Maes Cudd","button":"Botwm","select":"Maes Dewis","imageButton":"Botwm Delwedd","notSet":"<heb osod>","id":"Id","name":"Name","langDir":"Cyfeiriad Iaith","langDirLtr":"Chwith i'r Dde (LTR)","langDirRtl":"Dde i'r Chwith (RTL)","langCode":"Cod Iaith","longDescr":"URL Disgrifiad Hir","cssClass":"Dosbarthiadau Dalen Arddull","advisoryTitle":"Teitl Cynghorol","cssStyle":"Arddull","ok":"Iawn","cancel":"Diddymu","close":"Cau","preview":"Rhagolwg","resize":"Ailfeintio","generalTab":"Cyffredinol","advancedTab":"Uwch","validateNumberFailed":"'Dyw'r gwerth hwn ddim yn rhif.","confirmNewPage":"Byddwch chi'n colli unrhyw newidiadau i'r cynnwys sydd heb eu cadw. Ydych am barhau i lwytho tudalen newydd?","confirmCancel":"Cafodd rhai o'r opsiynau eu newid. Ydych chi wir am gau'r deialog?","options":"Opsiynau","target":"Targed","targetNew":"Ffenest Newydd (_blank)","targetTop":"Ffenest ar y Brig (_top)","targetSelf":"Yr un Ffenest (_self)","targetParent":"Ffenest y Rhiant (_parent)","langDirLTR":"Chwith i'r Dde (LTR)","langDirRTL":"Dde i'r Chwith (RTL)","styles":"Arddull","cssClasses":"Dosbarthiadau Dalen Arddull","width":"Lled","height":"Uchder","align":"Alinio","alignLeft":"Chwith","alignRight":"Dde","alignCenter":"Canol","alignTop":"Brig","alignMiddle":"Canol","alignBottom":"Gwaelod","invalidValue":"Gwerth annilys.","invalidHeight":"Mae'n rhaid i'r uchder fod yn rhif.","invalidWidth":"Mae'n rhaid i'r lled fod yn rhif.","invalidCssLength":"Mae'n rhaid i'r gwerth ar gyfer maes \"%1\" fod yn rhif positif gyda neu heb uned fesuriad CSS dilys (px, %, in, cm, mm, em, ex, pt, neu pc).","invalidHtmlLength":"Mae'n rhaid i'r gwerth ar gyfer maes \"%1\" fod yn rhif positif gyda neu heb uned fesuriad HTML dilys (px neu %).","invalidInlineStyle":"Mae'n rhaid i'r gwerth ar gyfer arddull mewn-llinell gynnwys un set neu fwy ar y fformat \"enw : gwerth\", wedi'u gwahanu gyda hanner colon.","cssLengthTooltip":"Rhowch rif am werth mewn picsel neu rhif gydag uned CSS dilys (px, %, in, cm, mm, em, pt neu pc).","unavailable":"%1<span class=\"cke_accessibility\">, ddim ar gael</span>"},"about":{"copy":"Hawlfraint &copy; $1. Cedwir pob hawl.","dlgTitle":"Ynghylch CKEditor","help":"Gwirio $1 am gymorth.","moreInfo":"Am wybodaeth ynghylch trwyddedau, ewch i'n gwefan:","title":"Ynghylch CKEditor","userGuide":"Canllawiau Defnyddiwr CKEditor"},"basicstyles":{"bold":"Bras","italic":"Italig","strike":"Llinell Trwyddo","subscript":"Is-sgript","superscript":"Uwchsgript","underline":"Tanlinellu"},"blockquote":{"toolbar":"Dyfyniad bloc"},"clipboard":{"copy":"Copïo","copyError":"'Dyw gosodiadau diogelwch eich porwr ddim yn caniatàu'r golygydd i gynnal 'gweithredoedd copïo' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+C).","cut":"Torri","cutError":"Nid yw gosodiadau diogelwch eich porwr yn caniatàu'r golygydd i gynnal 'gweithredoedd torri' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+X).","paste":"Gludo","pasteArea":"Ardal Gludo","pasteMsg":"Gludwch i mewn i'r blwch canlynol gan ddefnyddio'r bysellfwrdd (<strong>Ctrl/Cmd+V</strong>) a phwyso <strong>Iawn</strong>.","securityMsg":"Oherwydd gosodiadau diogelwch eich porwr, 'dyw'r porwr ddim yn gallu ennill mynediad i'r data ar y clipfwrdd yn uniongyrchol. Mae angen i chi ei ludo eto i'r ffenestr hon.","title":"Gludo"},"contextmenu":{"options":"Opsiynau Dewislen Cyd-destun"},"toolbar":{"toolbarCollapse":"Cyfangu'r Bar Offer","toolbarExpand":"Ehangu'r Bar Offer","toolbarGroups":{"document":"Dogfen","clipboard":"Clipfwrdd/Dadwneud","editing":"Golygu","forms":"Ffurflenni","basicstyles":"Arddulliau Sylfaenol","paragraph":"Paragraff","links":"Dolenni","insert":"Mewnosod","styles":"Arddulliau","colors":"Lliwiau","tools":"Offer"},"toolbars":"Bariau offer y golygydd"},"elementspath":{"eleLabel":"Llwybr elfennau","eleTitle":"Elfen %1"},"format":{"label":"Fformat","panelTitle":"Fformat Paragraff","tag_address":"Cyfeiriad","tag_div":"Normal (DIV)","tag_h1":"Pennawd 1","tag_h2":"Pennawd 2","tag_h3":"Pennawd 3","tag_h4":"Pennawd 4","tag_h5":"Pennawd 5","tag_h6":"Pennawd 6","tag_p":"Normal","tag_pre":"Wedi'i Fformatio"},"horizontalrule":{"toolbar":"Mewnosod Llinell Lorweddol"},"image":{"alertUrl":"Rhowch URL y ddelwedd","alt":"Testun Amgen","border":"Ymyl","btnUpload":"Anfon i'r Gweinydd","button2Img":"Ydych am drawsffurfio'r botwm ddelwedd hwn ar ddelwedd syml?","hSpace":"BwlchLl","img2Button":"Ydych am drawsffurfio'r ddelwedd hon ar fotwm delwedd?","infoTab":"Gwyb Delwedd","linkTab":"Dolen","lockRatio":"Cloi Cymhareb","menu":"Priodweddau Delwedd","resetSize":"Ailosod Maint","title":"Priodweddau Delwedd","titleButton":"Priodweddau Botwm Delwedd","upload":"Lanlwytho","urlMissing":"URL gwreiddiol y ddelwedd ar goll.","vSpace":"BwlchF","validateBorder":"Rhaid i'r ymyl fod yn gyfanrif.","validateHSpace":"Rhaid i'r HSpace fod yn gyfanrif.","validateVSpace":"Rhaid i'r VSpace fod yn gyfanrif."},"indent":{"indent":"Cynyddu'r Mewnoliad","outdent":"Lleihau'r Mewnoliad"},"fakeobjects":{"anchor":"Angor","flash":"Animeiddiant Flash","hiddenfield":"Maes Cudd","iframe":"IFrame","unknown":"Gwrthrych Anhysbys"},"link":{"acccessKey":"Allwedd Mynediad","advanced":"Uwch","advisoryContentType":"Math y Cynnwys Cynghorol","advisoryTitle":"Teitl Cynghorol","anchor":{"toolbar":"Angor","menu":"Golygu'r Angor","title":"Priodweddau'r Angor","name":"Enw'r Angor","errorName":"Teipiwch enw'r angor","remove":"Tynnwch yr Angor"},"anchorId":"Gan Id yr Elfen","anchorName":"Gan Enw'r Angor","charset":"Set Nodau'r Adnodd Cysylltiedig","cssClasses":"Dosbarthiadau Dalen Arddull","emailAddress":"Cyfeiriad E-Bost","emailBody":"Corff y Neges","emailSubject":"Testun y Neges","id":"Id","info":"Gwyb y Ddolen","langCode":"Cod Iaith","langDir":"Cyfeiriad Iaith","langDirLTR":"Chwith i'r Dde (LTR)","langDirRTL":"Dde i'r Chwith (RTL)","menu":"Golygu Dolen","name":"Enw","noAnchors":"(Dim angorau ar gael yn y ddogfen)","noEmail":"Teipiwch gyfeiriad yr e-bost","noUrl":"Teipiwch URL y ddolen","other":"<eraill>","popupDependent":"Dibynnol (Netscape)","popupFeatures":"Nodweddion Ffenestr Bop","popupFullScreen":"Sgrin Llawn (IE)","popupLeft":"Safle Chwith","popupLocationBar":"Bar Safle","popupMenuBar":"Dewislen","popupResizable":"Ailfeintiol","popupScrollBars":"Barrau Sgrolio","popupStatusBar":"Bar Statws","popupToolbar":"Bar Offer","popupTop":"Safle Top","rel":"Perthynas","selectAnchor":"Dewiswch Angor","styles":"Arddull","tabIndex":"Indecs Tab","target":"Targed","targetFrame":"<ffrâm>","targetFrameName":"Enw Ffrâm y Targed","targetPopup":"<ffenestr bop>","targetPopupName":"Enw Ffenestr Bop","title":"Dolen","toAnchor":"Dolen at angor yn y testun","toEmail":"E-bost","toUrl":"URL","toolbar":"Dolen","type":"Math y Ddolen","unlink":"Datgysylltu","upload":"Lanlwytho"},"list":{"bulletedlist":"Mewnosod/Tynnu Rhestr Bwled","numberedlist":"Mewnosod/Tynnu Rhestr Rhifol"},"magicline":{"title":"Mewnosod paragraff yma"},"maximize":{"maximize":"Mwyhau","minimize":"Lleihau"},"pastetext":{"button":"Gludo fel testun plaen","title":"Gludo fel Testun Plaen"},"pastefromword":{"confirmCleanup":"Mae'r testun rydych chi am ludo wedi'i gopïo o Word. Ydych chi am ei lanhau cyn ei ludo?","error":"Doedd dim modd glanhau y data a ludwyd oherwydd gwall mewnol","title":"Gludo o Word","toolbar":"Gludo o Word"},"removeformat":{"toolbar":"Tynnu Fformat"},"sourcearea":{"toolbar":"HTML"},"specialchar":{"options":"Opsiynau Nodau Arbennig","title":"Dewis Nod Arbennig","toolbar":"Mewnosod Nod Arbennig"},"scayt":{"about":"Ynghylch SCAYT","aboutTab":"Ynghylch","addWord":"Ychwanegu Gair","allCaps":"Anwybyddu Geiriau Nodau Uwch i Gyd","dic_create":"Creu","dic_delete":"Dileu","dic_field_name":"Enw'r geiriadur","dic_info":"Ar y cychwyn, caiff y Geiriadur ei storio mewn Cwci. Er, mae terfyn ar faint cwcis. Pan fydd Gweiriadur Defnyddiwr yn tyfu tu hwnt i gyfyngiadau maint Cwci, caiff y geiriadur ei storio ar ein gweinydd ni. er mwyn storio eich geiriadur poersonol chi ar ein gweinydd, bydd angen i chi osod enw ar gyfer y geiriadur. Os oes geiriadur 'da chi ar ein gweinydd yn barod, teipiwch ei enw a chliciwch y botwm Adfer.","dic_rename":"Ailenwi","dic_restore":"Adfer","dictionariesTab":"Geiriaduron","disable":"Analluogi SCAYT","emptyDic":"Ni ddylai enw'r geiriadur fod yn wag.","enable":"Galluogi SCAYT","ignore":"Anwybyddu","ignoreAll":"Anwybyddu pob","ignoreDomainNames":"Anwybyddu Enwau Parth","langs":"Ieithoedd","languagesTab":"Ieithoedd","mixedCase":"Anwybyddu Geiriau â Chymysgedd Nodau Uwch ac Is","mixedWithDigits":"Anwybyddu Geiriau â Rhifau","moreSuggestions":"Awgrymiadau pellach","opera_title":"Heb ei gynnal gan Opera","options":"Opsiynau","optionsTab":"Opsiynau","title":"Gwirio'r Sillafu Wrth Deipio","toggle":"Togl SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Arddulliau","panelTitle":"Arddulliau Fformatio","panelTitle1":"Arddulliau Bloc","panelTitle2":"Arddulliau Mewnol","panelTitle3":"Arddulliau Gwrthrych"},"table":{"border":"Maint yr Ymyl","caption":"Pennawd","cell":{"menu":"Cell","insertBefore":"Mewnosod Cell Cyn","insertAfter":"Mewnosod Cell Ar Ôl","deleteCell":"Dileu Celloedd","merge":"Cyfuno Celloedd","mergeRight":"Cyfuno i'r Dde","mergeDown":"Cyfuno i Lawr","splitHorizontal":"Hollti'r Gell yn Lorweddol","splitVertical":"Hollti'r Gell yn Fertigol","title":"Priodweddau'r Gell","cellType":"Math y Gell","rowSpan":"Rhychwant Rhesi","colSpan":"Rhychwant Colofnau","wordWrap":"Lapio Geiriau","hAlign":"Aliniad Llorweddol","vAlign":"Aliniad Fertigol","alignBaseline":"Baslinell","bgColor":"Lliw Cefndir","borderColor":"Lliw Ymyl","data":"Data","header":"Pennyn","yes":"Ie","no":"Na","invalidWidth":"Mae'n rhaid i led y gell fod yn rhif.","invalidHeight":"Mae'n rhaid i uchder y gell fod yn rhif.","invalidRowSpan":"Mae'n rhaid i rychwant y rhesi fod yn gyfanrif.","invalidColSpan":"Mae'n rhaid i rychwant y colofnau fod yn gyfanrif.","chooseColor":"Dewis"},"cellPad":"Padio'r gell","cellSpace":"Bylchiad y gell","column":{"menu":"Colofn","insertBefore":"Mewnosod Colofn Cyn","insertAfter":"Mewnosod Colofn Ar Ôl","deleteColumn":"Dileu Colofnau"},"columns":"Colofnau","deleteTable":"Dileu Tabl","headers":"Penynnau","headersBoth":"Y Ddau","headersColumn":"Colofn gyntaf","headersNone":"Dim","headersRow":"Rhes gyntaf","invalidBorder":"Mae'n rhaid i faint yr ymyl fod yn rhif.","invalidCellPadding":"Mae'n rhaid i badiad y gell fod yn rhif positif.","invalidCellSpacing":"Mae'n rhaid i fylchiad y gell fod yn rhif positif.","invalidCols":"Mae'n rhaid cael o leiaf un golofn.","invalidHeight":"Mae'n rhaid i uchder y tabl fod yn rhif.","invalidRows":"Mae'n rhaid cael o leiaf un rhes.","invalidWidth":"Mae'n rhaid i led y tabl fod yn rhif.","menu":"Priodweddau'r Tabl","row":{"menu":"Rhes","insertBefore":"Mewnosod Rhes Cyn","insertAfter":"Mewnosod Rhes Ar Ôl","deleteRow":"Dileu Rhesi"},"rows":"Rhesi","summary":"Crynodeb","title":"Priodweddau'r Tabl","toolbar":"Tabl","widthPc":"y cant","widthPx":"picsel","widthUnit":"uned lled"},"undo":{"redo":"Ailwneud","undo":"Dadwneud"},"wsc":{"btnIgnore":"Anwybyddu Un","btnIgnoreAll":"Anwybyddu Pob","btnReplace":"Amnewid Un","btnReplaceAll":"Amnewid Pob","btnUndo":"Dadwneud","changeTo":"Newid i","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Gwirydd sillafu heb ei arsefydlu. A ydych am ei lawrlwytho nawr?","manyChanges":"Gwirio sillafu wedi gorffen: Newidiwyd %1 gair","noChanges":"Gwirio sillafu wedi gorffen: Dim newidiadau","noMispell":"Gwirio sillafu wedi gorffen: Dim camsillaf.","noSuggestions":"- Dim awgrymiadau -","notAvailable":"Nid yw'r gwasanaeth hwn ar gael yn bresennol.","notInDic":"Nid i'w gael yn y geiriadur","oneChange":"Gwirio sillafu wedi gorffen: Newidiwyd 1 gair","progress":"Gwirio sillafu yn ar y gweill...","title":"Gwirio Sillafu","toolbar":"Gwirio Sillafu"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/da.js b/theme/bootstrap/plugins/ckeditor/lang/da.js new file mode 100644 index 0000000..6ea9f3a --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/da.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['da']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Tryk ALT 0 for hjælp","browseServer":"Gennemse...","url":"URL","protocol":"Protokol","upload":"Upload","uploadSubmit":"Upload","image":"Indsæt billede","flash":"Indsæt Flash","form":"Indsæt formular","checkbox":"Indsæt afkrydsningsfelt","radio":"Indsæt alternativknap","textField":"Indsæt tekstfelt","textarea":"Indsæt tekstboks","hiddenField":"Indsæt skjult felt","button":"Indsæt knap","select":"Indsæt liste","imageButton":"Indsæt billedknap","notSet":"<intet valgt>","id":"Id","name":"Navn","langDir":"Tekstretning","langDirLtr":"Fra venstre mod højre (LTR)","langDirRtl":"Fra højre mod venstre (RTL)","langCode":"Sprogkode","longDescr":"Udvidet beskrivelse","cssClass":"Typografiark (CSS)","advisoryTitle":"Titel","cssStyle":"Typografi (CSS)","ok":"OK","cancel":"Annullér","close":"Luk","preview":"Forhåndsvisning","resize":"Træk for at skalere","generalTab":"Generelt","advancedTab":"Avanceret","validateNumberFailed":"Værdien er ikke et tal.","confirmNewPage":"Alt indhold, der ikke er blevet gemt, vil gå tabt. Er du sikker på, at du vil indlæse en ny side?","confirmCancel":"Nogle af indstillingerne er blevet ændret. Er du sikker på, at du vil lukke vinduet?","options":"Vis muligheder","target":"Mål","targetNew":"Nyt vindue (_blank)","targetTop":"Øverste vindue (_top)","targetSelf":"Samme vindue (_self)","targetParent":"Samme vindue (_parent)","langDirLTR":"Venstre til højre (LTR)","langDirRTL":"Højre til venstre (RTL)","styles":"Style","cssClasses":"Stylesheetklasser","width":"Bredde","height":"Højde","align":"Justering","alignLeft":"Venstre","alignRight":"Højre","alignCenter":"Centreret","alignTop":"Øverst","alignMiddle":"Centreret","alignBottom":"Nederst","invalidValue":"Invalid value.","invalidHeight":"Højde skal være et tal.","invalidWidth":"Bredde skal være et tal.","invalidCssLength":"Værdien specificeret for \"%1\" feltet skal være et positivt nummer med eller uden en CSS måleenhed (px, %, in, cm, mm, em, ex, pt, eller pc).","invalidHtmlLength":"Værdien specificeret for \"%1\" feltet skal være et positivt nummer med eller uden en CSS måleenhed (px eller %).","invalidInlineStyle":"Værdien specificeret for inline style skal indeholde en eller flere elementer med et format som \"name:value\", separeret af semikoloner","cssLengthTooltip":"Indsæt en numerisk værdi i pixel eller nummer med en gyldig CSS værdi (px, %, in, cm, mm, em, ex, pt, eller pc).","unavailable":"%1<span class=\"cke_accessibility\">, ikke tilgængelig</span>"},"about":{"copy":"Copyright &copy; $1. Alle rettigheder forbeholdes.","dlgTitle":"Om CKEditor","help":"Se $1 for at få hjælp.","moreInfo":"For informationer omkring licens, se venligst vores hjemmeside (på engelsk):","title":"Om CKEditor","userGuide":"CKEditor-brugermanual"},"basicstyles":{"bold":"Fed","italic":"Kursiv","strike":"Gennemstreget","subscript":"Sænket skrift","superscript":"Hævet skrift","underline":"Understreget"},"blockquote":{"toolbar":"Blokcitat"},"clipboard":{"copy":"Kopiér","copyError":"Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.<br><br>Brug i stedet tastaturet til at kopiere teksten (Ctrl/Cmd+C).","cut":"Klip","cutError":"Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.<br><br>Brug i stedet tastaturet til at klippe teksten (Ctrl/Cmd+X).","paste":"Indsæt","pasteArea":"Indsæt område","pasteMsg":"Indsæt i feltet herunder (<STRONG>Ctrl/Cmd+V</STRONG>) og klik på <STRONG>OK</STRONG>.","securityMsg":"Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.<br><br>Du skal indsætte udklipsholderens indhold i dette vindue igen.","title":"Indsæt"},"contextmenu":{"options":"Muligheder for hjælpemenu"},"toolbar":{"toolbarCollapse":"Sammenklap værktøjslinje","toolbarExpand":"Udvid værktøjslinje","toolbarGroups":{"document":"Dokument","clipboard":"Udklipsholder/Fortryd","editing":"Redigering","forms":"Formularer","basicstyles":"Basis styles","paragraph":"Paragraf","links":"Links","insert":"Indsæt","styles":"Typografier","colors":"Farver","tools":"Værktøjer"},"toolbars":"Editors værktøjslinjer"},"elementspath":{"eleLabel":"Sti på element","eleTitle":"%1 element"},"format":{"label":"Formatering","panelTitle":"Formatering","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"Overskrift 1","tag_h2":"Overskrift 2","tag_h3":"Overskrift 3","tag_h4":"Overskrift 4","tag_h5":"Overskrift 5","tag_h6":"Overskrift 6","tag_p":"Normal","tag_pre":"Formateret"},"horizontalrule":{"toolbar":"Indsæt vandret streg"},"image":{"alertUrl":"Indtast stien til billedet","alt":"Alternativ tekst","border":"Ramme","btnUpload":"Upload fil til serveren","button2Img":"Vil du lave billedknappen om til et almindeligt billede?","hSpace":"Vandret margen","img2Button":"Vil du lave billedet om til en billedknap?","infoTab":"Generelt","linkTab":"Hyperlink","lockRatio":"Lås størrelsesforhold","menu":"Egenskaber for billede","resetSize":"Nulstil størrelse","title":"Egenskaber for billede","titleButton":"Egenskaber for billedknap","upload":"Upload","urlMissing":"Kilde på billed-URL mangler","vSpace":"Lodret margen","validateBorder":"Kant skal være et helt nummer.","validateHSpace":"HSpace skal være et helt nummer.","validateVSpace":"VSpace skal være et helt nummer."},"indent":{"indent":"Forøg indrykning","outdent":"Formindsk indrykning"},"fakeobjects":{"anchor":"Anker","flash":"Flashanimation","hiddenfield":"Skjult felt","iframe":"Iframe","unknown":"Ukendt objekt"},"link":{"acccessKey":"Genvejstast","advanced":"Avanceret","advisoryContentType":"Indholdstype","advisoryTitle":"Titel","anchor":{"toolbar":"Indsæt/redigér bogmærke","menu":"Egenskaber for bogmærke","title":"Egenskaber for bogmærke","name":"Bogmærkenavn","errorName":"Indtast bogmærkenavn","remove":"Fjern bogmærke"},"anchorId":"Efter element-Id","anchorName":"Efter ankernavn","charset":"Tegnsæt","cssClasses":"Typografiark","emailAddress":"E-mailadresse","emailBody":"Besked","emailSubject":"Emne","id":"Id","info":"Generelt","langCode":"Tekstretning","langDir":"Tekstretning","langDirLTR":"Fra venstre mod højre (LTR)","langDirRTL":"Fra højre mod venstre (RTL)","menu":"Redigér hyperlink","name":"Navn","noAnchors":"(Ingen bogmærker i dokumentet)","noEmail":"Indtast e-mailadresse!","noUrl":"Indtast hyperlink-URL!","other":"<anden>","popupDependent":"Koblet/dependent (Netscape)","popupFeatures":"Egenskaber for popup","popupFullScreen":"Fuld skærm (IE)","popupLeft":"Position fra venstre","popupLocationBar":"Adresselinje","popupMenuBar":"Menulinje","popupResizable":"Justérbar","popupScrollBars":"Scrollbar","popupStatusBar":"Statuslinje","popupToolbar":"Værktøjslinje","popupTop":"Position fra toppen","rel":"Relation","selectAnchor":"Vælg et anker","styles":"Typografi","tabIndex":"Tabulatorindeks","target":"Mål","targetFrame":"<ramme>","targetFrameName":"Destinationsvinduets navn","targetPopup":"<popup vindue>","targetPopupName":"Popupvinduets navn","title":"Egenskaber for hyperlink","toAnchor":"Bogmærke på denne side","toEmail":"E-mail","toUrl":"URL","toolbar":"Indsæt/redigér hyperlink","type":"Type","unlink":"Fjern hyperlink","upload":"Upload"},"list":{"bulletedlist":"Punktopstilling","numberedlist":"Talopstilling"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maksimér","minimize":"Minimér"},"pastetext":{"button":"Indsæt som ikke-formateret tekst","title":"Indsæt som ikke-formateret tekst"},"pastefromword":{"confirmCleanup":"Den tekst du forsøger at indsætte ser ud til at komme fra Word. Vil du rense teksten før den indsættes?","error":"Det var ikke muligt at fjerne formatteringen på den indsatte tekst grundet en intern fejl","title":"Indsæt fra Word","toolbar":"Indsæt fra Word"},"removeformat":{"toolbar":"Fjern formatering"},"sourcearea":{"toolbar":"Kilde"},"specialchar":{"options":"Muligheder for specialkarakterer","title":"Vælg symbol","toolbar":"Indsæt symbol"},"scayt":{"about":"Om SCAYT","aboutTab":"Om","addWord":"Tilføj ord","allCaps":"Ignorer alle store bogstaver","dic_create":"Opret","dic_delete":"Slet","dic_field_name":"Navn på ordbog","dic_info":"Til start er brugerordbogen gemt i en Cookie. Dog har Cookies en begrænsning på størrelse. Når ordbogen når en bestemt størrelse kan den blive gemt på vores server. For at gemme din personlige ordbog på vores server skal du angive et navn for denne. Såfremt du allerede har gemt en ordbog, skriv navnet på denne og klik på Gendan knappen.","dic_rename":"Omdøb","dic_restore":"Gendan","dictionariesTab":"Ordbøger","disable":"Deaktivér SCAYT","emptyDic":"Ordbogsnavn må ikke være tom.","enable":"Aktivér SCAYT","ignore":"Ignorér","ignoreAll":"Ignorér alle","ignoreDomainNames":"Ignorér domænenavne","langs":"Sprog","languagesTab":"Sprog","mixedCase":"Ignorer ord med store og små bogstaver","mixedWithDigits":"Ignorér ord med numre","moreSuggestions":"Flere forslag","opera_title":"Ikke supporteret af Opera","options":"Indstillinger","optionsTab":"Indstillinger","title":"Stavekontrol mens du skriver","toggle":"Skift/toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Typografi","panelTitle":"Formattering på stylesheet","panelTitle1":"Block typografi","panelTitle2":"Inline typografi","panelTitle3":"Object typografi"},"table":{"border":"Rammebredde","caption":"Titel","cell":{"menu":"Celle","insertBefore":"Indsæt celle før","insertAfter":"Indsæt celle efter","deleteCell":"Slet celle","merge":"Flet celler","mergeRight":"Flet til højre","mergeDown":"Flet nedad","splitHorizontal":"Del celle vandret","splitVertical":"Del celle lodret","title":"Celleegenskaber","cellType":"Celletype","rowSpan":"Række span (rows span)","colSpan":"Kolonne span (columns span)","wordWrap":"Tekstombrydning","hAlign":"Vandret justering","vAlign":"Lodret justering","alignBaseline":"Grundlinje","bgColor":"Baggrundsfarve","borderColor":"Rammefarve","data":"Data","header":"Hoved","yes":"Ja","no":"Nej","invalidWidth":"Cellebredde skal være et tal.","invalidHeight":"Cellehøjde skal være et tal.","invalidRowSpan":"Række span skal være et heltal.","invalidColSpan":"Kolonne span skal være et heltal.","chooseColor":"Vælg"},"cellPad":"Cellemargen","cellSpace":"Celleafstand","column":{"menu":"Kolonne","insertBefore":"Indsæt kolonne før","insertAfter":"Indsæt kolonne efter","deleteColumn":"Slet kolonne"},"columns":"Kolonner","deleteTable":"Slet tabel","headers":"Hoved","headersBoth":"Begge","headersColumn":"Første kolonne","headersNone":"Ingen","headersRow":"Første række","invalidBorder":"Rammetykkelse skal være et tal.","invalidCellPadding":"Cellemargen skal være et tal.","invalidCellSpacing":"Celleafstand skal være et tal.","invalidCols":"Antallet af kolonner skal være større end 0.","invalidHeight":"Tabelhøjde skal være et tal.","invalidRows":"Antallet af rækker skal være større end 0.","invalidWidth":"Tabelbredde skal være et tal.","menu":"Egenskaber for tabel","row":{"menu":"Række","insertBefore":"Indsæt række før","insertAfter":"Indsæt række efter","deleteRow":"Slet række"},"rows":"Rækker","summary":"Resumé","title":"Egenskaber for tabel","toolbar":"Tabel","widthPc":"procent","widthPx":"pixels","widthUnit":"Bredde på enhed"},"undo":{"redo":"Annullér fortryd","undo":"Fortryd"},"wsc":{"btnIgnore":"Ignorér","btnIgnoreAll":"Ignorér alle","btnReplace":"Erstat","btnReplaceAll":"Erstat alle","btnUndo":"Tilbage","changeTo":"Forslag","errorLoading":"Fejl ved indlæsning af host: %s.","ieSpellDownload":"Stavekontrol ikke installeret. Vil du installere den nu?","manyChanges":"Stavekontrol færdig: %1 ord ændret","noChanges":"Stavekontrol færdig: Ingen ord ændret","noMispell":"Stavekontrol færdig: Ingen fejl fundet","noSuggestions":"(ingen forslag)","notAvailable":"Stavekontrol er desværre ikke tilgængelig.","notInDic":"Ikke i ordbogen","oneChange":"Stavekontrol færdig: Et ord ændret","progress":"Stavekontrollen arbejder...","title":"Stavekontrol","toolbar":"Stavekontrol"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/de.js b/theme/bootstrap/plugins/ckeditor/lang/de.js new file mode 100644 index 0000000..76d794b --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/de.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['de']={"editor":"WYSIWYG-Editor","editorPanel":"WYSIWYG-Editor-Leiste","common":{"editorHelp":"Drücken Sie ALT 0 für Hilfe","browseServer":"Server durchsuchen","url":"URL","protocol":"Protokoll","upload":"Hochladen","uploadSubmit":"Zum Server senden","image":"Bild","flash":"Flash","form":"Formular","checkbox":"Checkbox","radio":"Radiobutton","textField":"Textfeld einzeilig","textarea":"Textfeld mehrzeilig","hiddenField":"Verstecktes Feld","button":"Klickbutton","select":"Auswahlfeld","imageButton":"Bildbutton","notSet":"<nichts>","id":"ID","name":"Name","langDir":"Schreibrichtung","langDirLtr":"Links nach Rechts (LTR)","langDirRtl":"Rechts nach Links (RTL)","langCode":"Sprachenkürzel","longDescr":"Langform URL","cssClass":"Stylesheet Klasse","advisoryTitle":"Titel Beschreibung","cssStyle":"Style","ok":"OK","cancel":"Abbrechen","close":"Schließen","preview":"Vorschau","resize":"Zum Vergrößern ziehen","generalTab":"Allgemein","advancedTab":"Erweitert","validateNumberFailed":"Dieser Wert ist keine Nummer.","confirmNewPage":"Alle nicht gespeicherten Änderungen gehen verlohren. Sind Sie sicher die neue Seite zu laden?","confirmCancel":"Einige Optionen wurden geändert. Wollen Sie den Dialog dennoch schließen?","options":"Optionen","target":"Zielseite","targetNew":"Neues Fenster (_blank)","targetTop":"Oberstes Fenster (_top)","targetSelf":"Gleiches Fenster (_self)","targetParent":"Oberes Fenster (_parent)","langDirLTR":"Links nach Rechts (LNR)","langDirRTL":"Rechts nach Links (RNL)","styles":"Style","cssClasses":"Stylesheet Klasse","width":"Breite","height":"Höhe","align":"Ausrichtung","alignLeft":"Links","alignRight":"Rechts","alignCenter":"Zentriert","alignTop":"Oben","alignMiddle":"Mitte","alignBottom":"Unten","invalidValue":"Ungültiger Wert.","invalidHeight":"Höhe muss eine Zahl sein.","invalidWidth":"Breite muss eine Zahl sein.","invalidCssLength":"Wert spezifiziert für \"%1\" Feld muss ein positiver numerischer Wert sein mit oder ohne korrekte CSS Messeinheit (px, %, in, cm, mm, em, ex, pt oder pc).","invalidHtmlLength":"Wert spezifiziert für \"%1\" Feld muss ein positiver numerischer Wert sein mit oder ohne korrekte HTML Messeinheit (px oder %).","invalidInlineStyle":"Wert spezifiziert für inline Stilart muss enthalten ein oder mehr Tupels mit dem Format \"Name : Wert\" getrennt mit Semikolons.","cssLengthTooltip":"Gebe eine Zahl ein für ein Wert in pixels oder eine Zahl mit einer korrekten CSS Messeinheit (px, %, in, cm, mm, em, ex, pt oder pc).","unavailable":"%1<span class=\"cke_accessibility\">, nicht verfügbar</span>"},"about":{"copy":"Copyright &copy; $1. Alle Rechte vorbehalten.","dlgTitle":"Über CKEditor","help":"Prüfe $1 für Hilfe.","moreInfo":"Für Informationen über unsere Lizenzbestimmungen besuchen sie bitte unsere Webseite:","title":"Über CKEditor","userGuide":"CKEditor Benutzerhandbuch"},"basicstyles":{"bold":"Fett","italic":"Kursiv","strike":"Durchgestrichen","subscript":"Tiefgestellt","superscript":"Hochgestellt","underline":"Unterstrichen"},"blockquote":{"toolbar":"Zitatblock"},"clipboard":{"copy":"Kopieren","copyError":"Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch kopieren. Bitte benutzen Sie die System-Zwischenablage über STRG-C (kopieren).","cut":"Ausschneiden","cutError":"Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch auszuschneiden. Bitte benutzen Sie die System-Zwischenablage über STRG-X (ausschneiden) und STRG-V (einfügen).","paste":"Einfügen","pasteArea":"Einfügebereich","pasteMsg":"Bitte fügen Sie den Text in der folgenden Box über die Tastatur (mit <STRONG>Strg+V</STRONG>) ein und bestätigen Sie mit <STRONG>OK</STRONG>.","securityMsg":"Aufgrund von Sicherheitsbeschränkungen Ihres Browsers kann der Editor nicht direkt auf die Zwischenablage zugreifen. Bitte fügen Sie den Inhalt erneut in diesem Fenster ein.","title":"Einfügen"},"contextmenu":{"options":"Kontextmenü Optionen"},"toolbar":{"toolbarCollapse":"Symbolleiste einklappen","toolbarExpand":"Symbolleiste ausklappen","toolbarGroups":{"document":"Dokument","clipboard":"Zwischenablage/Rückgängig","editing":"Editieren","forms":"Formularen","basicstyles":"Grundstile","paragraph":"Absatz","links":"Links","insert":"Einfügen","styles":"Stile","colors":"Farben","tools":"Werkzeuge"},"toolbars":"Editor Symbolleisten"},"elementspath":{"eleLabel":"Elements Pfad","eleTitle":"%1 Element"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Addresse","tag_div":"Normal (DIV)","tag_h1":"Überschrift 1","tag_h2":"Überschrift 2","tag_h3":"Überschrift 3","tag_h4":"Überschrift 4","tag_h5":"Überschrift 5","tag_h6":"Überschrift 6","tag_p":"Normal","tag_pre":"Formatiert"},"horizontalrule":{"toolbar":"Horizontale Linie einfügen"},"image":{"alertUrl":"Bitte geben Sie die Bild-URL an","alt":"Alternativer Text","border":"Rahmen","btnUpload":"Zum Server senden","button2Img":"Möchten Sie den gewählten Bild-Button in ein einfaches Bild umwandeln?","hSpace":"Horizontal-Abstand","img2Button":"Möchten Sie das gewählten Bild in einen Bild-Button umwandeln?","infoTab":"Bild-Info","linkTab":"Link","lockRatio":"Größenverhältnis beibehalten","menu":"Bild-Eigenschaften","resetSize":"Größe zurücksetzen","title":"Bild-Eigenschaften","titleButton":"Bildbutton-Eigenschaften","upload":"Hochladen","urlMissing":"Imagequelle URL fehlt.","vSpace":"Vertikal-Abstand","validateBorder":"Rahmen muß eine ganze Zahl sein.","validateHSpace":"Horizontal-Abstand muß eine ganze Zahl sein.","validateVSpace":"Vertikal-Abstand muß eine ganze Zahl sein."},"indent":{"indent":"Einzug erhöhen","outdent":"Einzug verringern"},"fakeobjects":{"anchor":"Anker","flash":"Flash Animation","hiddenfield":"Verstecktes Feld","iframe":"IFrame","unknown":"Unbekanntes Objekt"},"link":{"acccessKey":"Zugriffstaste","advanced":"Erweitert","advisoryContentType":"Inhaltstyp","advisoryTitle":"Titel Beschreibung","anchor":{"toolbar":"Anker einfügen/editieren","menu":"Anker-Eigenschaften","title":"Anker-Eigenschaften","name":"Anker Name","errorName":"Bitte geben Sie den Namen des Ankers ein","remove":"Anker entfernen"},"anchorId":"nach Element Id","anchorName":"nach Anker Name","charset":"Ziel-Zeichensatz","cssClasses":"Stylesheet Klasse","emailAddress":"E-Mail Adresse","emailBody":"Nachrichtentext","emailSubject":"Betreffzeile","id":"Id","info":"Link-Info","langCode":"Sprachenkürzel","langDir":"Schreibrichtung","langDirLTR":"Links nach Rechts (LTR)","langDirRTL":"Rechts nach Links (RTL)","menu":"Link editieren","name":"Name","noAnchors":"(keine Anker im Dokument vorhanden)","noEmail":"Bitte geben Sie e-Mail Adresse an","noUrl":"Bitte geben Sie die Link-URL an","other":"<andere>","popupDependent":"Abhängig (Netscape)","popupFeatures":"Pop-up Fenster-Eigenschaften","popupFullScreen":"Vollbild (IE)","popupLeft":"Linke Position","popupLocationBar":"Adress-Leiste","popupMenuBar":"Menü-Leiste","popupResizable":"Größe änderbar","popupScrollBars":"Rollbalken","popupStatusBar":"Statusleiste","popupToolbar":"Symbolleiste","popupTop":"Obere Position","rel":"Beziehung","selectAnchor":"Anker auswählen","styles":"Style","tabIndex":"Tab-Index","target":"Zielseite","targetFrame":"<Frame>","targetFrameName":"Ziel-Fenster-Name","targetPopup":"<Pop-up Fenster>","targetPopupName":"Pop-up Fenster-Name","title":"Link","toAnchor":"Anker in dieser Seite","toEmail":"E-Mail","toUrl":"URL","toolbar":"Link einfügen/editieren","type":"Link-Typ","unlink":"Link entfernen","upload":"Hochladen"},"list":{"bulletedlist":"Liste","numberedlist":"Nummerierte Liste"},"magicline":{"title":"Absatz hier einfügen"},"maximize":{"maximize":"Maximieren","minimize":"Minimieren"},"pastetext":{"button":"Als Text einfügen","title":"Als Text einfügen"},"pastefromword":{"confirmCleanup":"Der Text, den Sie einfügen möchten, scheint aus MS-Word kopiert zu sein. Möchten Sie ihn zuvor bereinigen lassen?","error":"Aufgrund eines internen Fehlers war es nicht möglich die eingefügten Daten zu bereinigen","title":"Aus MS-Word einfügen","toolbar":"Aus MS-Word einfügen"},"removeformat":{"toolbar":"Formatierungen entfernen"},"sourcearea":{"toolbar":"Quellcode"},"specialchar":{"options":"Sonderzeichen Optionen","title":"Sonderzeichen auswählen","toolbar":"Sonderzeichen einfügen/editieren"},"scayt":{"about":"Über SCAYT","aboutTab":"Über","addWord":"Wort hinzufügen","allCaps":"Groß geschriebenen Wörter ignorieren","dic_create":"Erzeugen","dic_delete":"Löschen","dic_field_name":"Wörterbuchname","dic_info":"Anfangs wird das Benutzerwörterbuch in einem Cookie gespeichert. Allerdings sind Cookies in der Größe begrenzt. Wenn das Benutzerwörterbuch bis zu einem Punkt wächst, wo es nicht mehr in einem Cookie gespeichert werden kann, wird das Benutzerwörterbuch auf dem Server gespeichert. Um Ihr persönliches Wörterbuch auf dem Server zu speichern, müssen Sie einen Namen für das Wörterbuch angeben. Falls Sie schon ein gespeicherte Wörterbuch haben, geben Sie bitte dessen Namen ein und klicken Sie auf die Schaltfläche Wiederherstellen.","dic_rename":"Umbenennen","dic_restore":"Wiederherstellen","dictionariesTab":"Wörterbücher","disable":"SCAYT ausschalten","emptyDic":"Wörterbuchname sollte leer sein.","enable":"SCAYT einschalten","ignore":"Ignorieren","ignoreAll":"Alle ignorieren","ignoreDomainNames":"Domain-Namen ignorieren","langs":"Sprachen","languagesTab":"Sprachen","mixedCase":"Wörter mit gemischte Setzkasten ignorieren","mixedWithDigits":"Wörter mit Zahlen ignorieren","moreSuggestions":"Mehr Vorschläge","opera_title":"Nicht von Opera unterstützt","options":"Optionen","optionsTab":"Optionen","title":"Rechtschreibprüfung während der Texteingabe (SCAYT)","toggle":"SCAYT umschalten","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Formatierungenstil","panelTitle1":"Block Stilart","panelTitle2":"Inline Stilart","panelTitle3":"Objekt Stilart"},"table":{"border":"Rahmen","caption":"Überschrift","cell":{"menu":"Zelle","insertBefore":"Zelle davor einfügen","insertAfter":"Zelle danach einfügen","deleteCell":"Zelle löschen","merge":"Zellen verbinden","mergeRight":"Nach rechts verbinden","mergeDown":"Nach unten verbinden","splitHorizontal":"Zelle horizontal teilen","splitVertical":"Zelle vertikal teilen","title":"Zellen-Eigenschaften","cellType":"Zellart","rowSpan":"Anzahl Zeilen verbinden","colSpan":"Anzahl Spalten verbinden","wordWrap":"Zeilenumbruch","hAlign":"Horizontale Ausrichtung","vAlign":"Vertikale Ausrichtung","alignBaseline":"Grundlinie","bgColor":"Hintergrundfarbe","borderColor":"Rahmenfarbe","data":"Daten","header":"Überschrift","yes":"Ja","no":"Nein","invalidWidth":"Zellenbreite muß eine Zahl sein.","invalidHeight":"Zellenhöhe muß eine Zahl sein.","invalidRowSpan":"\"Anzahl Zeilen verbinden\" muss eine Ganzzahl sein.","invalidColSpan":"\"Anzahl Spalten verbinden\" muss eine Ganzzahl sein.","chooseColor":"Wählen"},"cellPad":"Zellenabstand innen","cellSpace":"Zellenabstand außen","column":{"menu":"Spalte","insertBefore":"Spalte links davor einfügen","insertAfter":"Spalte rechts danach einfügen","deleteColumn":"Spalte löschen"},"columns":"Spalte","deleteTable":"Tabelle löschen","headers":"Kopfzeile","headersBoth":"Beide","headersColumn":"Erste Spalte","headersNone":"Keine","headersRow":"Erste Zeile","invalidBorder":"Die Rahmenbreite muß eine Zahl sein.","invalidCellPadding":"Der Zellenabstand innen muß eine positive Zahl sein.","invalidCellSpacing":"Der Zellenabstand außen muß eine positive Zahl sein.","invalidCols":"Die Anzahl der Spalten muß größer als 0 sein..","invalidHeight":"Die Tabellenbreite muß eine Zahl sein.","invalidRows":"Die Anzahl der Zeilen muß größer als 0 sein.","invalidWidth":"Die Tabellenbreite muss eine Zahl sein.","menu":"Tabellen-Eigenschaften","row":{"menu":"Zeile","insertBefore":"Zeile oberhalb einfügen","insertAfter":"Zeile unterhalb einfügen","deleteRow":"Zeile entfernen"},"rows":"Zeile","summary":"Inhaltsübersicht","title":"Tabellen-Eigenschaften","toolbar":"Tabelle","widthPc":"%","widthPx":"Pixel","widthUnit":"Breite Einheit"},"undo":{"redo":"Wiederherstellen","undo":"Rückgängig"},"wsc":{"btnIgnore":"Ignorieren","btnIgnoreAll":"Alle Ignorieren","btnReplace":"Ersetzen","btnReplaceAll":"Alle Ersetzen","btnUndo":"Rückgängig","changeTo":"Ändern in","errorLoading":"Fehler beim laden des Dienstanbieters: %s.","ieSpellDownload":"Rechtschreibprüfung nicht installiert. Möchten Sie sie jetzt herunterladen?","manyChanges":"Rechtschreibprüfung abgeschlossen - %1 Wörter geändert","noChanges":"Rechtschreibprüfung abgeschlossen - keine Worte geändert","noMispell":"Rechtschreibprüfung abgeschlossen - keine Fehler gefunden","noSuggestions":" - keine Vorschläge - ","notAvailable":"Entschuldigung, aber dieser Dienst steht im Moment nicht zur Verfügung.","notInDic":"Nicht im Wörterbuch","oneChange":"Rechtschreibprüfung abgeschlossen - ein Wort geändert","progress":"Rechtschreibprüfung läuft...","title":"Rechtschreibprüfung","toolbar":"Rechtschreibprüfung"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/el.js b/theme/bootstrap/plugins/ckeditor/lang/el.js new file mode 100644 index 0000000..022b707 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/el.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['el']={"editor":"Επεξεργαστής Πλούσιου Κειμένου","editorPanel":"Πίνακας Επεξεργαστή Πλούσιου Κειμένου","common":{"editorHelp":"Πατήστε το ALT 0 για βοήθεια","browseServer":"Εξερεύνηση Διακομιστή","url":"URL","protocol":"Πρωτόκολλο","upload":"Αποστολή","uploadSubmit":"Αποστολή στον Διακομιστή","image":"Εικόνα","flash":"Flash","form":"Φόρμα","checkbox":"Κουτί Επιλογής","radio":"Κουμπί Επιλογής","textField":"Πεδίο Κειμένου","textarea":"Περιοχή Κειμένου","hiddenField":"Κρυφό Πεδίο","button":"Κουμπί","select":"Πεδίο Επιλογής","imageButton":"Κουμπί Εικόνας","notSet":"<δεν έχει ρυθμιστεί>","id":"Id","name":"Όνομα","langDir":"Κατεύθυνση Κειμένου","langDirLtr":"Αριστερά προς Δεξιά (LTR)","langDirRtl":"Δεξιά προς Αριστερά (RTL)","langCode":"Κωδικός Γλώσσας","longDescr":"Αναλυτική Περιγραφή URL","cssClass":"Κλάσεις Φύλλων Στυλ","advisoryTitle":"Ενδεικτικός Τίτλος","cssStyle":"Μορφή Κειμένου","ok":"OK","cancel":"Ακύρωση","close":"Κλείσιμο","preview":"Προεπισκόπηση","resize":"Αλλαγή Μεγέθους","generalTab":"Γενικά","advancedTab":"Για Προχωρημένους","validateNumberFailed":"Αυτή η τιμή δεν είναι αριθμός.","confirmNewPage":"Οι όποιες αλλαγές στο περιεχόμενο θα χαθούν. Είσαστε σίγουροι ότι θέλετε να φορτώσετε μια νέα σελίδα;","confirmCancel":"Μερικές επιλογές έχουν αλλάξει. Είσαστε σίγουροι ότι θέλετε να κλείσετε το παράθυρο διαλόγου;","options":"Επιλογές","target":"Προορισμός","targetNew":"Νέο Παράθυρο (_blank)","targetTop":"Αρχική Περιοχή (_top)","targetSelf":"Ίδιο Παράθυρο (_self)","targetParent":"Γονεϊκό Παράθυρο (_parent)","langDirLTR":"Αριστερά προς Δεξιά (LTR)","langDirRTL":"Δεξιά προς Αριστερά (RTL)","styles":"Μορφή","cssClasses":"Κλάσεις Φύλλων Στυλ","width":"Πλάτος","height":"Ύψος","align":"Στοίχιση","alignLeft":"Αριστερά","alignRight":"Δεξιά","alignCenter":"Κέντρο","alignTop":"Πάνω","alignMiddle":"Μέση","alignBottom":"Κάτω","invalidValue":"Μη έγκυρη τιμή.","invalidHeight":"Το ύψος πρέπει να είναι ένας αριθμός.","invalidWidth":"Το πλάτος πρέπει να είναι ένας αριθμός.","invalidCssLength":"Η τιμή που ορίζεται για το πεδίο \"%1\" πρέπει να είναι ένας θετικός αριθμός με ή χωρίς μια έγκυρη μονάδα μέτρησης CSS (px, %, in, cm, mm, em, ex, pt, ή pc).","invalidHtmlLength":"Η τιμή που ορίζεται για το πεδίο \"%1\" πρέπει να είναι ένας θετικός αριθμός με ή χωρίς μια έγκυρη μονάδα μέτρησης HTML (px ή %).","invalidInlineStyle":"Η τιμή για το εν σειρά στυλ πρέπει να περιέχει ένα ή περισσότερα ζεύγη με την μορφή \"όνομα: τιμή\" διαχωρισμένα με Ελληνικό ερωτηματικό.","cssLengthTooltip":"Εισάγεται μια τιμή σε pixel ή έναν αριθμό μαζί με μια έγκυρη μονάδα μέτρησης CSS (px, %, in, cm, mm, em, ex, pt, ή pc).","unavailable":"%1<span class=\"cke_accessibility\">, δεν είναι διαθέσιμο</span>"},"about":{"copy":"Πνευματικά δικαιώματα &copy; $1 Με επιφύλαξη παντός δικαιώματος.","dlgTitle":"Περί του CKEditor","help":"Ελέγξτε το $1 για βοήθεια.","moreInfo":"Για πληροφορίες αδειών παρακαλούμε επισκεφθείτε την ιστοσελίδα μας:","title":"Περί του CKEditor","userGuide":"Οδηγίες Χρήστη CKEditor"},"basicstyles":{"bold":"Έντονη","italic":"Πλάγια","strike":"Διακριτή Διαγραφή","subscript":"Δείκτης","superscript":"Εκθέτης","underline":"Υπογράμμιση"},"blockquote":{"toolbar":"Περιοχή Παράθεσης"},"clipboard":{"copy":"Αντιγραφή","copyError":"Οι ρυθμίσεις ασφαλείας του περιηγητή σας δεν επιτρέπουν την επιλεγμένη εργασία αντιγραφής. Παρακαλώ χρησιμοποιείστε το πληκτρολόγιο (Ctrl/Cmd+C).","cut":"Αποκοπή","cutError":"Οι ρυθμίσεις ασφαλείας του περιηγητή σας δεν επιτρέπουν την επιλεγμένη εργασία αποκοπής. Παρακαλώ χρησιμοποιείστε το πληκτρολόγιο (Ctrl/Cmd+X).","paste":"Επικόλληση","pasteArea":"Περιοχή Επικόλλησης","pasteMsg":"Παρακαλώ επικολλήστε στο ακόλουθο κουτί χρησιμοποιώντας το πληκτρολόγιο (<strong>Ctrl/Cmd+V</strong>) και πατήστε OK.","securityMsg":"Λόγων των ρυθμίσεων ασφάλειας του περιηγητή σας, ο επεξεργαστής δεν μπορεί να έχει πρόσβαση στην μνήμη επικόλλησης. Χρειάζεται να επικολλήσετε ξανά σε αυτό το παράθυρο.","title":"Επικόλληση"},"contextmenu":{"options":"Επιλογές Αναδυόμενου Μενού"},"toolbar":{"toolbarCollapse":"Σύμπτυξη Εργαλειοθήκης","toolbarExpand":"Ανάπτυξη Εργαλειοθήκης","toolbarGroups":{"document":"Έγγραφο","clipboard":"Πρόχειρο/Αναίρεση","editing":"Επεξεργασία","forms":"Φόρμες","basicstyles":"Βασικά Στυλ","paragraph":"Παράγραφος","links":"Σύνδεσμοι","insert":"Εισαγωγή","styles":"Στυλ","colors":"Χρώματα","tools":"Εργαλεία"},"toolbars":"Εργαλειοθήκες επεξεργαστή"},"elementspath":{"eleLabel":"Διαδρομή Στοιχείων","eleTitle":"Στοιχείο %1"},"format":{"label":"Μορφοποίηση","panelTitle":"Μορφοποίηση Παραγράφου","tag_address":"Διεύθυνση","tag_div":"Κανονική (DIV)","tag_h1":"Κεφαλίδα 1","tag_h2":"Κεφαλίδα 2","tag_h3":"Κεφαλίδα 3","tag_h4":"Κεφαλίδα 4","tag_h5":"Κεφαλίδα 5","tag_h6":"Κεφαλίδα 6","tag_p":"Κανονική","tag_pre":"Προ-μορφοποιημένη"},"horizontalrule":{"toolbar":"Εισαγωγή Οριζόντιας Γραμμής"},"image":{"alertUrl":"Εισάγετε την τοποθεσία (URL) της εικόνας","alt":"Εναλλακτικό Κείμενο","border":"Περίγραμμα","btnUpload":"Αποστολή στον Διακομιστή","button2Img":"Θέλετε να μετατρέψετε το επιλεγμένο κουμπί εικόνας σε απλή εικόνα;","hSpace":"HSpace","img2Button":"Θέλετε να μεταμορφώσετε την επιλεγμένη εικόνα που είναι πάνω σε ένα κουμπί;","infoTab":"Πληροφορίες Εικόνας","linkTab":"Σύνδεσμος","lockRatio":"Κλείδωμα Αναλογίας","menu":"Ιδιότητες Εικόνας","resetSize":"Επαναφορά Αρχικού Μεγέθους","title":"Ιδιότητες Εικόνας","titleButton":"Ιδιότητες Κουμπιού Εικόνας","upload":"Αποστολή","urlMissing":"Το URL πηγής για την εικόνα λείπει.","vSpace":"VSpace","validateBorder":"Το περίγραμμα πρέπει να είναι ένας ακέραιος αριθμός.","validateHSpace":"Το HSpace πρέπει να είναι ένας ακέραιος αριθμός.","validateVSpace":"Το VSpace πρέπει να είναι ένας ακέραιος αριθμός."},"indent":{"indent":"Αύξηση Εσοχής","outdent":"Μείωση Εσοχής"},"fakeobjects":{"anchor":"Άγκυρα","flash":"Ταινία Flash","hiddenfield":"Κρυφό Πεδίο","iframe":"IFrame","unknown":"Άγνωστο Αντικείμενο"},"link":{"acccessKey":"Συντόμευση","advanced":"Για Προχωρημένους","advisoryContentType":"Ενδεικτικός Τύπος Περιεχομένου","advisoryTitle":"Ενδεικτικός Τίτλος","anchor":{"toolbar":"Εισαγωγή/επεξεργασία Άγκυρας","menu":"Ιδιότητες άγκυρας","title":"Ιδιότητες άγκυρας","name":"Όνομα άγκυρας","errorName":"Παρακαλούμε εισάγετε όνομα άγκυρας","remove":"Αφαίρεση Άγκυρας"},"anchorId":"Βάσει του Element Id","anchorName":"Βάσει του Ονόματος Άγκυρας","charset":"Κωδικοποίηση Χαρακτήρων Προσαρτημένης Πηγής","cssClasses":"Κλάσεις Φύλλων Στυλ","emailAddress":"Διεύθυνση E-mail","emailBody":"Κείμενο Μηνύματος","emailSubject":"Θέμα Μηνύματος","id":"Id","info":"Πληροφορίες Συνδέσμου","langCode":"Κατεύθυνση Κειμένου","langDir":"Κατεύθυνση Κειμένου","langDirLTR":"Αριστερά προς Δεξιά (LTR)","langDirRTL":"Δεξιά προς Αριστερά (RTL)","menu":"Επεξεργασία Συνδέσμου","name":"Όνομα","noAnchors":"(Δεν υπάρχουν άγκυρες στο κείμενο)","noEmail":"Εισάγετε τη διεύθυνση ηλεκτρονικού ταχυδρομείου","noUrl":"Εισάγετε την τοποθεσία (URL) του συνδέσμου","other":"<άλλο>","popupDependent":"Εξαρτημένο (Netscape)","popupFeatures":"Επιλογές Αναδυόμενου Παραθύρου","popupFullScreen":"Πλήρης Οθόνη (IE)","popupLeft":"Θέση Αριστερά","popupLocationBar":"Γραμμή Τοποθεσίας","popupMenuBar":"Γραμμή Επιλογών","popupResizable":"Προσαρμοζόμενο Μέγεθος","popupScrollBars":"Μπάρες Κύλισης","popupStatusBar":"Γραμμή Κατάστασης","popupToolbar":"Εργαλειοθήκη","popupTop":"Θέση Πάνω","rel":"Σχέση","selectAnchor":"Επιλέξτε μια Άγκυρα","styles":"Μορφή","tabIndex":"Σειρά Μεταπήδησης","target":"Παράθυρο Προορισμού","targetFrame":"<πλαίσιο>","targetFrameName":"Όνομα Πλαισίου Προορισμού","targetPopup":"<αναδυόμενο παράθυρο>","targetPopupName":"Όνομα Αναδυόμενου Παραθύρου","title":"Σύνδεσμος","toAnchor":"Άγκυρα σε αυτήν τη σελίδα","toEmail":"E-Mail","toUrl":"URL","toolbar":"Σύνδεσμος","type":"Τύπος Συνδέσμου","unlink":"Αφαίρεση Συνδέσμου","upload":"Αποστολή"},"list":{"bulletedlist":"Εισαγωγή/Απομάκρυνση Λίστας Κουκκίδων","numberedlist":"Εισαγωγή/Απομάκρυνση Αριθμημένης Λίστας"},"magicline":{"title":"Εισάγετε παράγραφο εδώ"},"maximize":{"maximize":"Μεγιστοποίηση","minimize":"Ελαχιστοποίηση"},"pastetext":{"button":"Επικόλληση ως απλό κείμενο","title":"Επικόλληση ως απλό κείμενο"},"pastefromword":{"confirmCleanup":"Το κείμενο που επικολλάται φαίνεται να είναι αντιγραμμένο από το Word. Μήπως θα θέλατε να καθαριστεί προτού επικολληθεί;","error":"Δεν ήταν δυνατό να καθαριστούν τα δεδομένα λόγω ενός εσωτερικού σφάλματος","title":"Επικόλληση από το Word","toolbar":"Επικόλληση από το Word"},"removeformat":{"toolbar":"Εκκαθάριση Μορφοποίησης"},"sourcearea":{"toolbar":"Κώδικας"},"specialchar":{"options":"Επιλογές Ειδικών Χαρακτήρων","title":"Επιλέξτε Έναν Ειδικό Χαρακτήρα","toolbar":"Εισαγωγή Ειδικού Χαρακτήρα"},"scayt":{"about":"About SCAYT","aboutTab":"Περί","addWord":"Προσθήκη στο λεξικό","allCaps":"Να αγνοούνται όλες οι λέξεις σε κεφαλαία","dic_create":"Δημιουργία","dic_delete":"Διαγραφή","dic_field_name":"Όνομα λεξικού","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Μετονομασία","dic_restore":"Ανάκτηση","dictionariesTab":"Λεξικά","disable":"Disable SCAYT","emptyDic":"Το όνομα του λεξικού δεν πρέπει να είναι κενό.","enable":"Enable SCAYT","ignore":"Αγνόησε το","ignoreAll":"Να αγνοηθούν όλα","ignoreDomainNames":"Ignore Domain Names","langs":"Γλώσσες","languagesTab":"Γλώσσες","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"Περισσότερες προτάσεις","opera_title":"Not supported by Opera","options":"Επιλογές","optionsTab":"Επιλογές","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Μορφές","panelTitle":"Στυλ Μορφοποίησης","panelTitle1":"Στυλ Τμημάτων","panelTitle2":"Στυλ Εν Σειρά","panelTitle3":"Στυλ Αντικειμένων"},"table":{"border":"Πάχος Περιγράμματος","caption":"Λεζάντα","cell":{"menu":"Κελί","insertBefore":"Εισαγωγή Κελιού Πριν","insertAfter":"Εισαγωγή Κελιού Μετά","deleteCell":"Διαγραφή Κελιών","merge":"Ενοποίηση Κελιών","mergeRight":"Συγχώνευση Με Δεξιά","mergeDown":"Συγχώνευση Με Κάτω","splitHorizontal":"Οριζόντια Διαίρεση Κελιού","splitVertical":"Κατακόρυφη Διαίρεση Κελιού","title":"Ιδιότητες Κελιού","cellType":"Τύπος Κελιού","rowSpan":"Εύρος Γραμμών","colSpan":"Εύρος Στηλών","wordWrap":"Αναδίπλωση Λέξεων","hAlign":"Οριζόντια Στοίχιση","vAlign":"Κάθετη Στοίχιση","alignBaseline":"Baseline","bgColor":"Χρώμα Φόντου","borderColor":"Χρώμα Περιγράμματος","data":"Δεδομένα","header":"Κεφαλίδα","yes":"Ναι","no":"Όχι","invalidWidth":"Το πλάτος του κελιού πρέπει να είναι αριθμός.","invalidHeight":"Το ύψος του κελιού πρέπει να είναι αριθμός.","invalidRowSpan":"Το εύρος των γραμμών πρέπει να είναι ακέραιος αριθμός.","invalidColSpan":"Το εύρος των στηλών πρέπει να είναι ακέραιος αριθμός.","chooseColor":"Επιλέξτε"},"cellPad":"Αναπλήρωση κελιών","cellSpace":"Απόσταση κελιών","column":{"menu":"Στήλη","insertBefore":"Εισαγωγή Στήλης Πριν","insertAfter":"Εισαγωγή Στήλης Μετά","deleteColumn":"Διαγραφή Στηλών"},"columns":"Στήλες","deleteTable":"Διαγραφή Πίνακα","headers":"Κεφαλίδες","headersBoth":"Και τα δύο","headersColumn":"Πρώτη στήλη","headersNone":"Κανένα","headersRow":"Πρώτη Γραμμή","invalidBorder":"Το πάχος του περιγράμματος πρέπει να είναι ένας αριθμός.","invalidCellPadding":"Η αναπλήρωση των κελιών πρέπει να είναι θετικός αριθμός.","invalidCellSpacing":"Η απόσταση μεταξύ των κελιών πρέπει να είναι ένας θετικός αριθμός.","invalidCols":"Ο αριθμός των στηλών πρέπει να είναι μεγαλύτερος από 0.","invalidHeight":"Το ύψος του πίνακα πρέπει να είναι αριθμός.","invalidRows":"Ο αριθμός των σειρών πρέπει να είναι μεγαλύτερος από 0.","invalidWidth":"Το πλάτος του πίνακα πρέπει να είναι ένας αριθμός.","menu":"Ιδιότητες Πίνακα","row":{"menu":"Γραμμή","insertBefore":"Εισαγωγή Γραμμής Πριν","insertAfter":"Εισαγωγή Γραμμής Μετά","deleteRow":"Διαγραφή Γραμμών"},"rows":"Γραμμές","summary":"Περίληψη","title":"Ιδιότητες Πίνακα","toolbar":"Πίνακας","widthPc":"τοις εκατό","widthPx":"pixel","widthUnit":"μονάδα πλάτους"},"undo":{"redo":"Επανάληψη","undo":"Αναίρεση"},"wsc":{"btnIgnore":"Αγνόηση","btnIgnoreAll":"Αγνόηση όλων","btnReplace":"Αντικατάσταση","btnReplaceAll":"Αντικατάσταση όλων","btnUndo":"Αναίρεση","changeTo":"Αλλαγή σε","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Δεν υπάρχει εγκατεστημένος ορθογράφος. Θέλετε να τον κατεβάσετε τώρα;","manyChanges":"Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Άλλαξαν %1 λέξεις","noChanges":"Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Δεν άλλαξαν λέξεις","noMispell":"Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Δεν βρέθηκαν λάθη","noSuggestions":"- Δεν υπάρχουν προτάσεις -","notAvailable":"Η υπηρεσία δεν είναι διαθέσιμη αυτήν την στιγμή.","notInDic":"Δεν υπάρχει στο λεξικό","oneChange":"Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Άλλαξε μια λέξη","progress":"Γίνεται ορθογραφικός έλεγχος...","title":"Ορθογραφικός Έλεγχος","toolbar":"Ορθογραφικός Έλεγχος"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/en-au.js b/theme/bootstrap/plugins/ckeditor/lang/en-au.js new file mode 100644 index 0000000..2a3cd4d --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/en-au.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['en-au']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Send it to the Server","image":"Image","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<not set>","id":"Id","name":"Name","langDir":"Language Direction","langDirLtr":"Left to Right (LTR)","langDirRtl":"Right to Left (RTL)","langCode":"Language Code","longDescr":"Long Description URL","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"OK","cancel":"Cancel","close":"Close","preview":"Preview","resize":"Resize","generalTab":"General","advancedTab":"Advanced","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"You have changed some options. Are you sure you want to close the dialog window?","options":"Options","target":"Target","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Width","height":"Height","align":"Align","alignLeft":"Left","alignRight":"Right","alignCenter":"Centre","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Copy","copyError":"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).","cut":"Cut","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"Paste","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"Format","panelTitle":"Paragraph Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Insert Horizontal Line"},"image":{"alertUrl":"Please type the image URL","alt":"Alternative Text","border":"Border","btnUpload":"Send it to the Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Image Info","linkTab":"Link","lockRatio":"Lock Ratio","menu":"Image Properties","resetSize":"Reset Size","title":"Image Properties","titleButton":"Image Button Properties","upload":"Upload","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Increase Indent","outdent":"Decrease Indent"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Access Key","advanced":"Advanced","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"Id","info":"Link Info","langCode":"Language Code","langDir":"Language Direction","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","menu":"Edit Link","name":"Name","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"Style","tabIndex":"Tab Index","target":"Target","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"Link","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Paste from Word","toolbar":"Paste from Word"},"removeformat":{"toolbar":"Remove Format"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Select Special Character","toolbar":"Insert Special Character"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styles","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Border size","caption":"Caption","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Delete Cells","merge":"Merge Cells","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"Columns","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a number.","invalidCellSpacing":"Cell spacing must be a number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Table Properties","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"Rows","summary":"Summary","title":"Table Properties","toolbar":"Table","widthPc":"percent","widthPx":"pixels","widthUnit":"width unit"},"undo":{"redo":"Redo","undo":"Undo"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/en-ca.js b/theme/bootstrap/plugins/ckeditor/lang/en-ca.js new file mode 100644 index 0000000..0e2ce11 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/en-ca.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['en-ca']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Send it to the Server","image":"Image","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<not set>","id":"Id","name":"Name","langDir":"Language Direction","langDirLtr":"Left to Right (LTR)","langDirRtl":"Right to Left (RTL)","langCode":"Language Code","longDescr":"Long Description URL","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"OK","cancel":"Cancel","close":"Close","preview":"Preview","resize":"Resize","generalTab":"General","advancedTab":"Advanced","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"You have changed some options. Are you sure you want to close the dialog window?","options":"Options","target":"Target","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Width","height":"Height","align":"Align","alignLeft":"Left","alignRight":"Right","alignCenter":"Centre","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Copy","copyError":"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).","cut":"Cut","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"Paste","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"Format","panelTitle":"Paragraph Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Insert Horizontal Line"},"image":{"alertUrl":"Please type the image URL","alt":"Alternative Text","border":"Border","btnUpload":"Send it to the Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Image Info","linkTab":"Link","lockRatio":"Lock Ratio","menu":"Image Properties","resetSize":"Reset Size","title":"Image Properties","titleButton":"Image Button Properties","upload":"Upload","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Increase Indent","outdent":"Decrease Indent"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Access Key","advanced":"Advanced","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"Id","info":"Link Info","langCode":"Language Code","langDir":"Language Direction","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","menu":"Edit Link","name":"Name","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"Style","tabIndex":"Tab Index","target":"Target","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"Link","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Paste from Word","toolbar":"Paste from Word"},"removeformat":{"toolbar":"Remove Format"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Select Special Character","toolbar":"Insert Special Character"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styles","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Border size","caption":"Caption","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Delete Cells","merge":"Merge Cells","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"Columns","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a number.","invalidCellSpacing":"Cell spacing must be a number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Table Properties","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"Rows","summary":"Summary","title":"Table Properties","toolbar":"Table","widthPc":"percent","widthPx":"pixels","widthUnit":"width unit"},"undo":{"redo":"Redo","undo":"Undo"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/en-gb.js b/theme/bootstrap/plugins/ckeditor/lang/en-gb.js new file mode 100644 index 0000000..454e3e2 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/en-gb.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['en-gb']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Send it to the Server","image":"Image","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<not set>","id":"Id","name":"Name","langDir":"Language Direction","langDirLtr":"Left to Right (LTR)","langDirRtl":"Right to Left (RTL)","langCode":"Language Code","longDescr":"Long Description URL","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"OK","cancel":"Cancel","close":"Close","preview":"Preview","resize":"Drag to resize","generalTab":"General","advancedTab":"Advanced","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"You have changed some options. Are you sure you want to close the dialogue window?","options":"Options","target":"Target","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Width","height":"Height","align":"Align","alignLeft":"Left","alignRight":"Right","alignCenter":"Centre","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Copy","copyError":"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).","cut":"Cut","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"Paste","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"Format","panelTitle":"Paragraph Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Insert Horizontal Line"},"image":{"alertUrl":"Please type the image URL","alt":"Alternative Text","border":"Border","btnUpload":"Send it to the Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Image Info","linkTab":"Link","lockRatio":"Lock Ratio","menu":"Image Properties","resetSize":"Reset Size","title":"Image Properties","titleButton":"Image Button Properties","upload":"Upload","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Increase Indent","outdent":"Decrease Indent"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Access Key","advanced":"Advanced","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"Id","info":"Link Info","langCode":"Language Code","langDir":"Language Direction","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","menu":"Edit Link","name":"Name","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"Style","tabIndex":"Tab Index","target":"Target","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"Link","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximise","minimize":"Minimise"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Paste from Word","toolbar":"Paste from Word"},"removeformat":{"toolbar":"Remove Format"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Select Special Character","toolbar":"Insert Special Character"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styles","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Border size","caption":"Caption","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Delete Cells","merge":"Merge Cells","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"Columns","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a number.","invalidCellSpacing":"Cell spacing must be a number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Table Properties","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"Rows","summary":"Summary","title":"Table Properties","toolbar":"Table","widthPc":"percent","widthPx":"pixels","widthUnit":"width unit"},"undo":{"redo":"Redo","undo":"Undo"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/en.js b/theme/bootstrap/plugins/ckeditor/lang/en.js new file mode 100644 index 0000000..cffe567 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/en.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['en']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Send it to the Server","image":"Image","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<not set>","id":"Id","name":"Name","langDir":"Language Direction","langDirLtr":"Left to Right (LTR)","langDirRtl":"Right to Left (RTL)","langCode":"Language Code","longDescr":"Long Description URL","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"OK","cancel":"Cancel","close":"Close","preview":"Preview","resize":"Resize","generalTab":"General","advancedTab":"Advanced","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"You have changed some options. Are you sure you want to close the dialog window?","options":"Options","target":"Target","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Width","height":"Height","align":"Alignment","alignLeft":"Left","alignRight":"Right","alignCenter":"Center","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Copy","copyError":"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).","cut":"Cut","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"Paste","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"Format","panelTitle":"Paragraph Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Insert Horizontal Line"},"image":{"alertUrl":"Please type the image URL","alt":"Alternative Text","border":"Border","btnUpload":"Send it to the Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Image Info","linkTab":"Link","lockRatio":"Lock Ratio","menu":"Image Properties","resetSize":"Reset Size","title":"Image Properties","titleButton":"Image Button Properties","upload":"Upload","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Increase Indent","outdent":"Decrease Indent"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Access Key","advanced":"Advanced","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"Id","info":"Link Info","langCode":"Language Code","langDir":"Language Direction","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","menu":"Edit Link","name":"Name","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"Style","tabIndex":"Tab Index","target":"Target","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"Link","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Paste from Word","toolbar":"Paste from Word"},"removeformat":{"toolbar":"Remove Format"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Select Special Character","toolbar":"Insert Special Character"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styles","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Border size","caption":"Caption","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Delete Cells","merge":"Merge Cells","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"Columns","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Table Properties","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"Rows","summary":"Summary","title":"Table Properties","toolbar":"Table","widthPc":"percent","widthPx":"pixels","widthUnit":"width unit"},"undo":{"redo":"Redo","undo":"Undo"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/eo.js b/theme/bootstrap/plugins/ckeditor/lang/eo.js new file mode 100644 index 0000000..6d7e257 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/eo.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['eo']={"editor":"Redaktilo por Riĉiga Teksto","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Premu ALT 0 por helpilo","browseServer":"Foliumi en la Servilo","url":"URL","protocol":"Protokolo","upload":"Alŝuti","uploadSubmit":"Sendu al Servilo","image":"Bildo","flash":"Flaŝo","form":"Formularo","checkbox":"Markobutono","radio":"Radiobutono","textField":"Teksta kampo","textarea":"Teksta Areo","hiddenField":"Kaŝita Kampo","button":"Butono","select":"Elekta Kampo","imageButton":"Bildbutono","notSet":"<Defaŭlta>","id":"Id","name":"Nomo","langDir":"Skribdirekto","langDirLtr":"De maldekstro dekstren (LTR)","langDirRtl":"De dekstro maldekstren (RTL)","langCode":"Lingva Kodo","longDescr":"URL de Longa Priskribo","cssClass":"Klasoj de Stilfolioj","advisoryTitle":"Priskriba Titolo","cssStyle":"Stilo","ok":"Akcepti","cancel":"Rezigni","close":"Fermi","preview":"Vidigi Aspekton","resize":"Movigi por ŝanĝi la grandon","generalTab":"Ĝenerala","advancedTab":"Speciala","validateNumberFailed":"Tiu valoro ne estas nombro.","confirmNewPage":"La neregistritaj ŝanĝoj estas perdotaj. Ĉu vi certas, ke vi volas ŝargi novan paĝon?","confirmCancel":"Iuj opcioj esta ŝanĝitaj. Ĉu vi certas, ke vi volas fermi la dialogon?","options":"Opcioj","target":"Celo","targetNew":"Nova Fenestro (_blank)","targetTop":"Supra Fenestro (_top)","targetSelf":"Sama Fenestro (_self)","targetParent":"Patra Fenestro (_parent)","langDirLTR":"De maldekstro dekstren (LTR)","langDirRTL":"De dekstro maldekstren (RTL)","styles":"Stilo","cssClasses":"Stilfoliaj Klasoj","width":"Larĝo","height":"Alto","align":"Ĝisrandigo","alignLeft":"Maldekstre","alignRight":"Dekstre","alignCenter":"Centre","alignTop":"Supre","alignMiddle":"Centre","alignBottom":"Malsupre","invalidValue":"Nevalida Valoro","invalidHeight":"Alto devas esti nombro.","invalidWidth":"Larĝo devas esti nombro.","invalidCssLength":"La valoro indikita por la \"%1\" kampo devas esti pozitiva nombro kun aŭ sen valida CSSmezurunuo (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"La valoro indikita por la \"%1\" kampo devas esti pozitiva nombro kun aŭ sen valida HTMLmezurunuo (px or %).","invalidInlineStyle":"La valoro indikita por la enlinia stilo devas konsisti el unu aŭ pluraj elementoj kun la formato de \"nomo : valoro\", apartigitaj per punktokomoj.","cssLengthTooltip":"Entajpu nombron por rastrumera valoro aŭ nombron kun valida CSSunuo (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, nehavebla</span>"},"about":{"copy":"Copyright &copy; $1. Ĉiuj rajtoj rezervitaj.","dlgTitle":"Pri CKEditor","help":"Kontroli $1 por helpo.","moreInfo":"Por informoj pri licenco, bonvolu viziti nian retpaĝaron:","title":"Pri CKEditor","userGuide":"CKEditor Uzindikoj"},"basicstyles":{"bold":"Grasa","italic":"Kursiva","strike":"Trastreko","subscript":"Suba indico","superscript":"Supra indico","underline":"Substreko"},"blockquote":{"toolbar":"Citaĵo"},"clipboard":{"copy":"Kopii","copyError":"La sekurecagordo de via TTT-legilo ne permesas, ke la redaktilo faras kopiajn operaciojn. Bonvolu uzi la klavaron por tio (Ctrl/Cmd-C).","cut":"Eltondi","cutError":"La sekurecagordo de via TTT-legilo ne permesas, ke la redaktilo faras eltondajn operaciojn. Bonvolu uzi la klavaron por tio (Ctrl/Cmd-X).","paste":"Interglui","pasteArea":"Intergluoareo","pasteMsg":"Bonvolu glui la tekston en la jenan areon per uzado de la klavaro (<strong>Ctrl/Cmd+V</strong>) kaj premu OK","securityMsg":"Pro la sekurecagordo de via TTT-legilo, la redaktilo ne povas rekte atingi viajn datenojn en la poŝo. Bonvolu denove interglui la datenojn en tiun fenestron.","title":"Interglui"},"contextmenu":{"options":"Opcioj de Kunteksta Menuo"},"toolbar":{"toolbarCollapse":"Faldi la ilbreton","toolbarExpand":"Malfaldi la ilbreton","toolbarGroups":{"document":"Dokumento","clipboard":"Poŝo/Malfari","editing":"Redaktado","forms":"Formularoj","basicstyles":"Bazaj stiloj","paragraph":"Paragrafo","links":"Ligiloj","insert":"Enmeti","styles":"Stiloj","colors":"Koloroj","tools":"Iloj"},"toolbars":"Ilobretoj de la redaktilo"},"elementspath":{"eleLabel":"Vojo al Elementoj","eleTitle":"%1 elementoj"},"format":{"label":"Formato","panelTitle":"ParagrafFormato","tag_address":"Adreso","tag_div":"Normala (DIV)","tag_h1":"Titolo 1","tag_h2":"Titolo 2","tag_h3":"Titolo 3","tag_h4":"Titolo 4","tag_h5":"Titolo 5","tag_h6":"Titolo 6","tag_p":"Normala","tag_pre":"Formatita"},"horizontalrule":{"toolbar":"Enmeti Horizontalan Linion"},"image":{"alertUrl":"Bonvolu tajpi la retadreson de la bildo","alt":"Anstataŭiga Teksto","border":"Bordero","btnUpload":"Sendu al Servilo","button2Img":"Ĉu vi volas transformi la selektitan bildbutonon en simplan bildon?","hSpace":"Horizontala Spaco","img2Button":"Ĉu vi volas transformi la selektitan bildon en bildbutonon?","infoTab":"Informoj pri Bildo","linkTab":"Ligilo","lockRatio":"Konservi Proporcion","menu":"Atributoj de Bildo","resetSize":"Origina Grando","title":"Atributoj de Bildo","titleButton":"Bildbutonaj Atributoj","upload":"Alŝuti","urlMissing":"La fontretadreso de la bildo mankas.","vSpace":"Vertikala Spaco","validateBorder":"La bordero devas esti entjera nombro.","validateHSpace":"La horizontala spaco devas esti entjera nombro.","validateVSpace":"La vertikala spaco devas esti entjera nombro."},"indent":{"indent":"Pligrandigi Krommarĝenon","outdent":"Malpligrandigi Krommarĝenon"},"fakeobjects":{"anchor":"Ankro","flash":"FlaŝAnimacio","hiddenfield":"Kaŝita kampo","iframe":"Enlinia Kadro (IFrame)","unknown":"Nekonata objekto"},"link":{"acccessKey":"Fulmoklavo","advanced":"Speciala","advisoryContentType":"Enhavotipo","advisoryTitle":"Priskriba Titolo","anchor":{"toolbar":"Ankro","menu":"Enmeti/Ŝanĝi Ankron","title":"Ankraj Atributoj","name":"Ankra Nomo","errorName":"Bv entajpi la ankran nomon","remove":"Forigi Ankron"},"anchorId":"Per Elementidentigilo","anchorName":"Per Ankronomo","charset":"Signaro de la Ligita Rimedo","cssClasses":"Klasoj de Stilfolioj","emailAddress":"Retpoŝto","emailBody":"Mesaĝa korpo","emailSubject":"Mesaĝa Temo","id":"Id","info":"Informoj pri la Ligilo","langCode":"Lingva Kodo","langDir":"Skribdirekto","langDirLTR":"De maldekstro dekstren (LTR)","langDirRTL":"De dekstro maldekstren (RTL)","menu":"Ŝanĝi Ligilon","name":"Nomo","noAnchors":"<Ne disponeblas ankroj en la dokumento>","noEmail":"Bonvolu entajpi la retpoŝtadreson","noUrl":"Bonvolu entajpi la URL-on","other":"<alia>","popupDependent":"Dependa (Netscape)","popupFeatures":"Atributoj de la Ŝprucfenestro","popupFullScreen":"Tutekrane (IE)","popupLeft":"Maldekstra Pozicio","popupLocationBar":"Adresobreto","popupMenuBar":"Menubreto","popupResizable":"Dimensiŝanĝebla","popupScrollBars":"Rulumskaloj","popupStatusBar":"Statobreto","popupToolbar":"Ilobreto","popupTop":"Supra Pozicio","rel":"Rilato","selectAnchor":"Elekti Ankron","styles":"Stilo","tabIndex":"Taba Indekso","target":"Celo","targetFrame":"<kadro>","targetFrameName":"Nomo de CelKadro","targetPopup":"<ŝprucfenestro>","targetPopupName":"Nomo de Ŝprucfenestro","title":"Ligilo","toAnchor":"Ankri en tiu ĉi paĝo","toEmail":"Retpoŝto","toUrl":"URL","toolbar":"Enmeti/Ŝanĝi Ligilon","type":"Tipo de Ligilo","unlink":"Forigi Ligilon","upload":"Alŝuti"},"list":{"bulletedlist":"Bula Listo","numberedlist":"Numera Listo"},"magicline":{"title":"Enmeti paragrafon ĉi-tien"},"maximize":{"maximize":"Pligrandigi","minimize":"Malgrandigi"},"pastetext":{"button":"Interglui kiel platan tekston","title":"Interglui kiel platan tekston"},"pastefromword":{"confirmCleanup":"La teksto, kiun vi volas interglui, ŝajnas esti kopiita el Word. Ĉu vi deziras purigi ĝin antaŭ intergluo?","error":"Ne eblis purigi la intergluitajn datenojn pro interna eraro","title":"Interglui el Word","toolbar":"Interglui el Word"},"removeformat":{"toolbar":"Forigi Formaton"},"sourcearea":{"toolbar":"Fonto"},"specialchar":{"options":"Opcioj pri Specialaj Signoj","title":"Selekti Specialan Signon","toolbar":"Enmeti Specialan Signon"},"scayt":{"about":"Pri OKDVT","aboutTab":"Pri","addWord":"Almeti la vorton","allCaps":"Ignori la vortojn skribitajn nur per ĉefliteroj","dic_create":"Krei","dic_delete":"Forigi","dic_field_name":"Vortaronomo","dic_info":"Komence la vortaro de la uzanto estas konservita en kuketo. Tamen la kuketgrando estas limigita. Kiam la vortaro de la uzanto atingas grandon, kiu ne plu ebligas konservi ĝin en kuketo, tiam la vortaro povas esti konservata en niaj serviloj. Por konservi vian personan vortaron en nian servilon, vi devas indiki nomon por tiu vortaro. Se vi jam havas konservitan vortaron, bonvolu entajpi ties nomon kaj alklaki la restaŭrbutonon.","dic_rename":"Renomi","dic_restore":"Restaŭri","dictionariesTab":"Vortaroj","disable":"Malebligi OKDVT","emptyDic":"La vortaronomo ne devus esti malplena.","enable":"Ebligi OKDVT","ignore":"Ignori","ignoreAll":"Ignori ĉion","ignoreDomainNames":"Ignori domajnajn nomojn","langs":"Lingvoj","languagesTab":"Lingvoj","mixedCase":"Ignori vortojn kun miksa uskleco","mixedWithDigits":"Ignori vortojn kun nombroj","moreSuggestions":"Pli da sugestoj","opera_title":"Ne subportata de Opera","options":"Opcioj","optionsTab":"Opcioj","title":"OrtografiKontrolado Dum Vi Tajpas (OKDVT)","toggle":"Baskuligi OKDVT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stiloj","panelTitle":"Stiloj pri enpaĝigo","panelTitle1":"Stiloj de blokoj","panelTitle2":"Enliniaj Stiloj","panelTitle3":"Stiloj de objektoj"},"table":{"border":"Bordero","caption":"Tabeltitolo","cell":{"menu":"Ĉelo","insertBefore":"Enmeti Ĉelon Antaŭ","insertAfter":"Enmeti Ĉelon Post","deleteCell":"Forigi la Ĉelojn","merge":"Kunfandi la Ĉelojn","mergeRight":"Kunfandi dekstren","mergeDown":"Kunfandi malsupren ","splitHorizontal":"Horizontale dividi","splitVertical":"Vertikale dividi","title":"Ĉelatributoj","cellType":"Ĉeltipo","rowSpan":"Kunfando de linioj","colSpan":"Kunfando de kolumnoj","wordWrap":"Cezuro","hAlign":"Horizontala ĝisrandigo","vAlign":"Vertikala ĝisrandigo","alignBaseline":"Malsupro de la teksto","bgColor":"Fonkoloro","borderColor":"Borderkoloro","data":"Datenoj","header":"Supra paĝotitolo","yes":"Jes","no":"No","invalidWidth":"Ĉellarĝo devas esti nombro.","invalidHeight":"Ĉelalto devas esti nombro.","invalidRowSpan":"Kunfando de linioj devas esti entjera nombro.","invalidColSpan":"Kunfando de kolumnoj devas esti entjera nombro.","chooseColor":"Elektu"},"cellPad":"Interna Marĝeno de la ĉeloj","cellSpace":"Spaco inter la Ĉeloj","column":{"menu":"Kolumno","insertBefore":"Enmeti kolumnon antaŭ","insertAfter":"Enmeti kolumnon post","deleteColumn":"Forigi Kolumnojn"},"columns":"Kolumnoj","deleteTable":"Forigi Tabelon","headers":"Supraj Paĝotitoloj","headersBoth":"Ambaŭ","headersColumn":"Unua kolumno","headersNone":"Neniu","headersRow":"Unua linio","invalidBorder":"La bordergrando devas esti nombro.","invalidCellPadding":"La interna marĝeno en la ĉeloj devas esti pozitiva nombro.","invalidCellSpacing":"La spaco inter la ĉeloj devas esti pozitiva nombro.","invalidCols":"La nombro de la kolumnoj devas superi 0.","invalidHeight":"La tabelalto devas esti nombro.","invalidRows":"La nombro de la linioj devas superi 0.","invalidWidth":"La tabellarĝo devas esti nombro.","menu":"Atributoj de Tabelo","row":{"menu":"Linio","insertBefore":"Enmeti linion antaŭ","insertAfter":"Enmeti linion post","deleteRow":"Forigi Liniojn"},"rows":"Linioj","summary":"Resumo","title":"Atributoj de Tabelo","toolbar":"Tabelo","widthPc":"elcentoj","widthPx":"Rastrumeroj","widthUnit":"unuo de larĝo"},"undo":{"redo":"Refari","undo":"Malfari"},"wsc":{"btnIgnore":"Ignori","btnIgnoreAll":"Ignori Ĉion","btnReplace":"Anstataŭigi","btnReplaceAll":"Anstataŭigi Ĉion","btnUndo":"Malfari","changeTo":"Ŝanĝi al","errorLoading":"Eraro en la servoelŝuto el la gastiga komputiko: %s.","ieSpellDownload":"Ortografikontrolilo ne instalita. Ĉu vi volas elŝuti ĝin nun?","manyChanges":"Ortografikontrolado finita: %1 vortoj korektitaj","noChanges":"Ortografikontrolado finita: neniu vorto korektita","noMispell":"Ortografikontrolado finita: neniu eraro trovita","noSuggestions":"- Neniu propono -","notAvailable":"Bedaŭrinde la servo ne funkcias nuntempe.","notInDic":"Ne trovita en la vortaro","oneChange":"Ortografikontrolado finita: unu vorto korektita","progress":"La ortografio estas kontrolata...","title":"Kontroli la ortografion","toolbar":"Kontroli la ortografion"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/es.js b/theme/bootstrap/plugins/ckeditor/lang/es.js new file mode 100644 index 0000000..7a631e0 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/es.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['es']={"editor":"Editor de texto enriquecido","editorPanel":"Panel del Editor de Texto Enriquecido","common":{"editorHelp":"Pulse ALT 0 para ayuda","browseServer":"Ver Servidor","url":"URL","protocol":"Protocolo","upload":"Cargar","uploadSubmit":"Enviar al Servidor","image":"Imagen","flash":"Flash","form":"Formulario","checkbox":"Casilla de Verificación","radio":"Botones de Radio","textField":"Campo de Texto","textarea":"Area de Texto","hiddenField":"Campo Oculto","button":"Botón","select":"Campo de Selección","imageButton":"Botón Imagen","notSet":"<No definido>","id":"Id","name":"Nombre","langDir":"Orientación","langDirLtr":"Izquierda a Derecha (LTR)","langDirRtl":"Derecha a Izquierda (RTL)","langCode":"Cód. de idioma","longDescr":"Descripción larga URL","cssClass":"Clases de hojas de estilo","advisoryTitle":"Título","cssStyle":"Estilo","ok":"Aceptar","cancel":"Cancelar","close":"Cerrar","preview":"Previsualización","resize":"Arrastre para redimensionar","generalTab":"General","advancedTab":"Avanzado","validateNumberFailed":"El valor no es un número.","confirmNewPage":"Cualquier cambio que no se haya guardado se perderá.\r\n¿Está seguro de querer crear una nueva página?","confirmCancel":"Algunas de las opciones se han cambiado.\r\n¿Está seguro de querer cerrar el diálogo?","options":"Opciones","target":"Destino","targetNew":"Nueva ventana (_blank)","targetTop":"Ventana principal (_top)","targetSelf":"Misma ventana (_self)","targetParent":"Ventana padre (_parent)","langDirLTR":"Izquierda a derecha (LTR)","langDirRTL":"Derecha a izquierda (RTL)","styles":"Estilos","cssClasses":"Clase de la hoja de estilos","width":"Anchura","height":"Altura","align":"Alineación","alignLeft":"Izquierda","alignRight":"Derecha","alignCenter":"Centrado","alignTop":"Tope","alignMiddle":"Centro","alignBottom":"Pie","invalidValue":"Valor no válido","invalidHeight":"Altura debe ser un número.","invalidWidth":"Anchura debe ser un número.","invalidCssLength":"El valor especificado para el campo \"%1\" debe ser un número positivo, incluyendo optionalmente una unidad de medida CSS válida (px, %, in, cm, mm, em, ex, pt, o pc).","invalidHtmlLength":"El valor especificado para el campo \"%1\" debe ser un número positivo, incluyendo optionalmente una unidad de medida HTML válida (px o %).","invalidInlineStyle":"El valor especificado para el estilo debe consistir en uno o más pares con el formato \"nombre: valor\", separados por punto y coma.","cssLengthTooltip":"Introduca un número para el valor en pixels o un número con una unidad de medida CSS válida (px, %, in, cm, mm, em, ex, pt, o pc).","unavailable":"%1<span class=\"cke_accessibility\">, no disponible</span>"},"about":{"copy":"Copyright &copy; $1. Todos los derechos reservados.","dlgTitle":"Acerca de CKEditor","help":"Lea la $1 para resolver sus dudas.","moreInfo":"Para información de licencia, por favor visite nuestro sitio web:","title":"Acerca de CKEditor","userGuide":"Guía de usuario de CKEditor"},"basicstyles":{"bold":"Negrita","italic":"Cursiva","strike":"Tachado","subscript":"Subíndice","superscript":"Superíndice","underline":"Subrayado"},"blockquote":{"toolbar":"Cita"},"clipboard":{"copy":"Copiar","copyError":"La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de copiado.\r\nPor favor use el teclado (Ctrl/Cmd+C).","cut":"Cortar","cutError":"La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de cortado.\r\nPor favor use el teclado (Ctrl/Cmd+X).","paste":"Pegar","pasteArea":"Zona de pegado","pasteMsg":"Por favor pegue dentro del cuadro utilizando el teclado (<STRONG>Ctrl/Cmd+V</STRONG>);\r\nluego presione <STRONG>Aceptar</STRONG>.","securityMsg":"Debido a la configuración de seguridad de su navegador, el editor no tiene acceso al portapapeles.\r\nEs necesario que lo pegue de nuevo en esta ventana.","title":"Pegar"},"contextmenu":{"options":"Opciones del menú contextual"},"toolbar":{"toolbarCollapse":"Contraer barra de herramientas","toolbarExpand":"Expandir barra de herramientas","toolbarGroups":{"document":"Documento","clipboard":"Portapapeles/Deshacer","editing":"Edición","forms":"Formularios","basicstyles":"Estilos básicos","paragraph":"Párrafo","links":"Enlaces","insert":"Insertar","styles":"Estilos","colors":"Colores","tools":"Herramientas"},"toolbars":"Barras de herramientas del editor"},"elementspath":{"eleLabel":"Ruta de los elementos","eleTitle":"%1 elemento"},"format":{"label":"Formato","panelTitle":"Formato","tag_address":"Dirección","tag_div":"Normal (DIV)","tag_h1":"Encabezado 1","tag_h2":"Encabezado 2","tag_h3":"Encabezado 3","tag_h4":"Encabezado 4","tag_h5":"Encabezado 5","tag_h6":"Encabezado 6","tag_p":"Normal","tag_pre":"Con formato"},"horizontalrule":{"toolbar":"Insertar Línea Horizontal"},"image":{"alertUrl":"Por favor escriba la URL de la imagen","alt":"Texto Alternativo","border":"Borde","btnUpload":"Enviar al Servidor","button2Img":"¿Desea convertir el botón de imagen en una simple imagen?","hSpace":"Esp.Horiz","img2Button":"¿Desea convertir la imagen en un botón de imagen?","infoTab":"Información de Imagen","linkTab":"Vínculo","lockRatio":"Proporcional","menu":"Propiedades de Imagen","resetSize":"Tamaño Original","title":"Propiedades de Imagen","titleButton":"Propiedades de Botón de Imagen","upload":"Cargar","urlMissing":"Debe indicar la URL de la imagen.","vSpace":"Esp.Vert","validateBorder":"El borde debe ser un número.","validateHSpace":"El espaciado horizontal debe ser un número.","validateVSpace":"El espaciado vertical debe ser un número."},"indent":{"indent":"Aumentar Sangría","outdent":"Disminuir Sangría"},"fakeobjects":{"anchor":"Ancla","flash":"Animación flash","hiddenfield":"Campo oculto","iframe":"IFrame","unknown":"Objeto desconocido"},"link":{"acccessKey":"Tecla de Acceso","advanced":"Avanzado","advisoryContentType":"Tipo de Contenido","advisoryTitle":"Título","anchor":{"toolbar":"Referencia","menu":"Propiedades de Referencia","title":"Propiedades de Referencia","name":"Nombre de la Referencia","errorName":"Por favor, complete el nombre de la Referencia","remove":"Quitar Referencia"},"anchorId":"Por ID de elemento","anchorName":"Por Nombre de Referencia","charset":"Fuente de caracteres vinculado","cssClasses":"Clases de hojas de estilo","emailAddress":"Dirección de E-Mail","emailBody":"Cuerpo del Mensaje","emailSubject":"Título del Mensaje","id":"Id","info":"Información de Vínculo","langCode":"Código idioma","langDir":"Orientación","langDirLTR":"Izquierda a Derecha (LTR)","langDirRTL":"Derecha a Izquierda (RTL)","menu":"Editar Vínculo","name":"Nombre","noAnchors":"(No hay referencias disponibles en el documento)","noEmail":"Por favor escriba la dirección de e-mail","noUrl":"Por favor escriba el vínculo URL","other":"<otro>","popupDependent":"Dependiente (Netscape)","popupFeatures":"Características de Ventana Emergente","popupFullScreen":"Pantalla Completa (IE)","popupLeft":"Posición Izquierda","popupLocationBar":"Barra de ubicación","popupMenuBar":"Barra de Menú","popupResizable":"Redimensionable","popupScrollBars":"Barras de desplazamiento","popupStatusBar":"Barra de Estado","popupToolbar":"Barra de Herramientas","popupTop":"Posición Derecha","rel":"Relación","selectAnchor":"Seleccionar una referencia","styles":"Estilo","tabIndex":"Indice de tabulación","target":"Destino","targetFrame":"<marco>","targetFrameName":"Nombre del Marco Destino","targetPopup":"<ventana emergente>","targetPopupName":"Nombre de Ventana Emergente","title":"Vínculo","toAnchor":"Referencia en esta página","toEmail":"E-Mail","toUrl":"URL","toolbar":"Insertar/Editar Vínculo","type":"Tipo de vínculo","unlink":"Eliminar Vínculo","upload":"Cargar"},"list":{"bulletedlist":"Viñetas","numberedlist":"Numeración"},"magicline":{"title":"Insertar párrafo aquí"},"maximize":{"maximize":"Maximizar","minimize":"Minimizar"},"pastetext":{"button":"Pegar como Texto Plano","title":"Pegar como Texto Plano"},"pastefromword":{"confirmCleanup":"El texto que desea parece provenir de Word.\r\n¿Desea depurarlo antes de pegarlo?","error":"No ha sido posible limpiar los datos debido a un error interno","title":"Pegar desde Word","toolbar":"Pegar desde Word"},"removeformat":{"toolbar":"Eliminar Formato"},"sourcearea":{"toolbar":"Fuente HTML"},"specialchar":{"options":"Opciones de caracteres especiales","title":"Seleccione un caracter especial","toolbar":"Insertar Caracter Especial"},"scayt":{"about":"Acerca de Corrector","aboutTab":"Acerca de","addWord":"Añadir palabra","allCaps":"Omitir palabras en MAYÚSCULAS","dic_create":"Crear","dic_delete":"Borrar","dic_field_name":"Nombre del diccionario","dic_info":"Inicialmente el Diccionario de usuario se guarda en una Cookie. Sin embargo, las cookies están limitadas en tamaño. Cuando el diccionario crece a un punto en el que no se puede guardar en una Cookie, el diccionario puede ser almacenado en nuestro servidor. Para almacenar su diccionario personalizado en nuestro servidor debe especificar un nombre para su diccionario. Si ya ha guardado un diccionaro, por favor, escriba su nombre y pulse el botón Recuperar","dic_rename":"Renombrar","dic_restore":"Recuperar","dictionariesTab":"Diccionarios","disable":"Desactivar Corrector","emptyDic":"El nombre del diccionario no puede estar en blanco.","enable":"Activar Corrector","ignore":"Ignorar","ignoreAll":"Ignorar Todas","ignoreDomainNames":"Omitir nombres de dominio","langs":"Idiomas","languagesTab":"Idiomas","mixedCase":"Ignorar palabras con combinación de mayúsculas y minúsculas","mixedWithDigits":"Omitir palabras con números","moreSuggestions":"Más sugerencias","opera_title":"No soportado en Opera","options":"Opciones","optionsTab":"Opciones","title":"Comprobar Ortografía Mientras Escribe","toggle":"Cambiar Corrector","noSuggestions":"No suggestion"},"stylescombo":{"label":"Estilo","panelTitle":"Estilos para formatear","panelTitle1":"Estilos de párrafo","panelTitle2":"Estilos de carácter","panelTitle3":"Estilos de objeto"},"table":{"border":"Tamaño de Borde","caption":"Título","cell":{"menu":"Celda","insertBefore":"Insertar celda a la izquierda","insertAfter":"Insertar celda a la derecha","deleteCell":"Eliminar Celdas","merge":"Combinar Celdas","mergeRight":"Combinar a la derecha","mergeDown":"Combinar hacia abajo","splitHorizontal":"Dividir la celda horizontalmente","splitVertical":"Dividir la celda verticalmente","title":"Propiedades de celda","cellType":"Tipo de Celda","rowSpan":"Expandir filas","colSpan":"Expandir columnas","wordWrap":"Ajustar al contenido","hAlign":"Alineación Horizontal","vAlign":"Alineación Vertical","alignBaseline":"Linea de base","bgColor":"Color de fondo","borderColor":"Color de borde","data":"Datos","header":"Encabezado","yes":"Sí","no":"No","invalidWidth":"La anchura de celda debe ser un número.","invalidHeight":"La altura de celda debe ser un número.","invalidRowSpan":"La expansión de filas debe ser un número entero.","invalidColSpan":"La expansión de columnas debe ser un número entero.","chooseColor":"Elegir"},"cellPad":"Esp. interior","cellSpace":"Esp. e/celdas","column":{"menu":"Columna","insertBefore":"Insertar columna a la izquierda","insertAfter":"Insertar columna a la derecha","deleteColumn":"Eliminar Columnas"},"columns":"Columnas","deleteTable":"Eliminar Tabla","headers":"Encabezados","headersBoth":"Ambas","headersColumn":"Primera columna","headersNone":"Ninguno","headersRow":"Primera fila","invalidBorder":"El tamaño del borde debe ser un número.","invalidCellPadding":"El espaciado interior debe ser un número.","invalidCellSpacing":"El espaciado entre celdas debe ser un número.","invalidCols":"El número de columnas debe ser un número mayor que 0.","invalidHeight":"La altura de tabla debe ser un número.","invalidRows":"El número de filas debe ser un número mayor que 0.","invalidWidth":"La anchura de tabla debe ser un número.","menu":"Propiedades de Tabla","row":{"menu":"Fila","insertBefore":"Insertar fila en la parte superior","insertAfter":"Insertar fila en la parte inferior","deleteRow":"Eliminar Filas"},"rows":"Filas","summary":"Síntesis","title":"Propiedades de Tabla","toolbar":"Tabla","widthPc":"porcentaje","widthPx":"pixeles","widthUnit":"unidad de la anchura"},"undo":{"redo":"Rehacer","undo":"Deshacer"},"wsc":{"btnIgnore":"Ignorar","btnIgnoreAll":"Ignorar Todo","btnReplace":"Reemplazar","btnReplaceAll":"Reemplazar Todo","btnUndo":"Deshacer","changeTo":"Cambiar a","errorLoading":"Error cargando la aplicación del servidor: %s.","ieSpellDownload":"Módulo de Control de Ortografía no instalado.\r\n¿Desea descargarlo ahora?","manyChanges":"Control finalizado: se ha cambiado %1 palabras","noChanges":"Control finalizado: no se ha cambiado ninguna palabra","noMispell":"Control finalizado: no se encontraron errores","noSuggestions":"- No hay sugerencias -","notAvailable":"Lo sentimos pero el servicio no está disponible.","notInDic":"No se encuentra en el Diccionario","oneChange":"Control finalizado: se ha cambiado una palabra","progress":"Control de Ortografía en progreso...","title":"Comprobar ortografía","toolbar":"Ortografía"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/et.js b/theme/bootstrap/plugins/ckeditor/lang/et.js new file mode 100644 index 0000000..38df2ad --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/et.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['et']={"editor":"Rikkalik tekstiredaktor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Abi saamiseks vajuta ALT 0","browseServer":"Serveri sirvimine","url":"URL","protocol":"Protokoll","upload":"Laadi üles","uploadSubmit":"Saada serverisse","image":"Pilt","flash":"Flash","form":"Vorm","checkbox":"Märkeruut","radio":"Raadionupp","textField":"Tekstilahter","textarea":"Tekstiala","hiddenField":"Varjatud lahter","button":"Nupp","select":"Valiklahter","imageButton":"Piltnupp","notSet":"<määramata>","id":"ID","name":"Nimi","langDir":"Keele suund","langDirLtr":"Vasakult paremale (LTR)","langDirRtl":"Paremalt vasakule (RTL)","langCode":"Keele kood","longDescr":"Pikk kirjeldus URL","cssClass":"Stiilistiku klassid","advisoryTitle":"Soovituslik pealkiri","cssStyle":"Laad","ok":"OK","cancel":"Loobu","close":"Sulge","preview":"Eelvaade","resize":"Suuruse muutmiseks lohista","generalTab":"Üldine","advancedTab":"Täpsemalt","validateNumberFailed":"See väärtus pole number.","confirmNewPage":"Kõik salvestamata muudatused lähevad kaotsi. Kas oled kindel, et tahad laadida uue lehe?","confirmCancel":"Mõned valikud on muudetud. Kas oled kindel, et tahad dialoogi sulgeda?","options":"Valikud","target":"Sihtkoht","targetNew":"Uus aken (_blank)","targetTop":"Kõige ülemine aken (_top)","targetSelf":"Sama aken (_self)","targetParent":"Vanemaken (_parent)","langDirLTR":"Vasakult paremale (LTR)","langDirRTL":"Paremalt vasakule (RTL)","styles":"Stiili","cssClasses":"Stiililehe klassid","width":"Laius","height":"Kõrgus","align":"Joondus","alignLeft":"Vasak","alignRight":"Paremale","alignCenter":"Kesk","alignTop":"Üles","alignMiddle":"Keskele","alignBottom":"Alla","invalidValue":"Vigane väärtus.","invalidHeight":"Kõrgus peab olema number.","invalidWidth":"Laius peab olema number.","invalidCssLength":"\"%1\" välja jaoks määratud väärtus peab olema positiivne täisarv CSS ühikuga (px, %, in, cm, mm, em, ex, pt või pc) või ilma.","invalidHtmlLength":"\"%1\" välja jaoks määratud väärtus peab olema positiivne täisarv HTML ühikuga (px või %) või ilma.","invalidInlineStyle":"Reasisese stiili määrangud peavad koosnema paarisväärtustest (tuples), mis on semikoolonitega eraldatult järgnevas vormingus: \"nimi : väärtus\".","cssLengthTooltip":"Sisesta väärtus pikslites või number koos sobiva CSS-i ühikuga (px, %, in, cm, mm, em, ex, pt või pc).","unavailable":"%1<span class=\"cke_accessibility\">, pole saadaval</span>"},"about":{"copy":"Copyright &copy; $1. Kõik õigused kaitstud.","dlgTitle":"CKEditorist","help":"Abi jaoks vaata $1.","moreInfo":"Litsentsi andmed leiab meie veebilehelt:","title":"CKEditorist","userGuide":"CKEditori kasutusjuhendit"},"basicstyles":{"bold":"Paks","italic":"Kursiiv","strike":"Läbijoonitud","subscript":"Allindeks","superscript":"Ülaindeks","underline":"Allajoonitud"},"blockquote":{"toolbar":"Blokktsitaat"},"clipboard":{"copy":"Kopeeri","copyError":"Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt kopeerida. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+C).","cut":"Lõika","cutError":"Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt lõigata. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+X).","paste":"Aseta","pasteArea":"Asetamise ala","pasteMsg":"Palun aseta tekst järgnevasse kasti kasutades klaviatuuri klahvikombinatsiooni (<STRONG>Ctrl/Cmd+V</STRONG>) ja vajuta seejärel <STRONG>OK</STRONG>.","securityMsg":"Sinu veebisirvija turvaseadete tõttu ei oma redaktor otsest ligipääsu lõikelaua andmetele. Sa pead asetama need uuesti siia aknasse.","title":"Asetamine"},"contextmenu":{"options":"Kontekstimenüü valikud"},"toolbar":{"toolbarCollapse":"Tööriistariba peitmine","toolbarExpand":"Tööriistariba näitamine","toolbarGroups":{"document":"Dokument","clipboard":"Lõikelaud/tagasivõtmine","editing":"Muutmine","forms":"Vormid","basicstyles":"Põhistiilid","paragraph":"Lõik","links":"Lingid","insert":"Sisesta","styles":"Stiilid","colors":"Värvid","tools":"Tööriistad"},"toolbars":"Redaktori tööriistaribad"},"elementspath":{"eleLabel":"Elementide asukoht","eleTitle":"%1 element"},"format":{"label":"Vorming","panelTitle":"Vorming","tag_address":"Aadress","tag_div":"Tavaline (DIV)","tag_h1":"Pealkiri 1","tag_h2":"Pealkiri 2","tag_h3":"Pealkiri 3","tag_h4":"Pealkiri 4","tag_h5":"Pealkiri 5","tag_h6":"Pealkiri 6","tag_p":"Tavaline","tag_pre":"Vormindatud"},"horizontalrule":{"toolbar":"Horisontaaljoone sisestamine"},"image":{"alertUrl":"Palun kirjuta pildi URL","alt":"Alternatiivne tekst","border":"Joon","btnUpload":"Saada serverisse","button2Img":"Kas tahad teisendada valitud pildiga nupu tavaliseks pildiks?","hSpace":"H. vaheruum","img2Button":"Kas tahad teisendada valitud tavalise pildi pildiga nupuks?","infoTab":"Pildi info","linkTab":"Link","lockRatio":"Lukusta kuvasuhe","menu":"Pildi omadused","resetSize":"Lähtesta suurus","title":"Pildi omadused","titleButton":"Piltnupu omadused","upload":"Lae üles","urlMissing":"Pildi lähte-URL on puudu.","vSpace":"V. vaheruum","validateBorder":"Äärise laius peab olema täisarv.","validateHSpace":"Horisontaalne vaheruum peab olema täisarv.","validateVSpace":"Vertikaalne vaheruum peab olema täisarv."},"indent":{"indent":"Taande suurendamine","outdent":"Taande vähendamine"},"fakeobjects":{"anchor":"Ankur","flash":"Flashi animatsioon","hiddenfield":"Varjatud väli","iframe":"IFrame","unknown":"Tundmatu objekt"},"link":{"acccessKey":"Juurdepääsu võti","advanced":"Täpsemalt","advisoryContentType":"Juhendava sisu tüüp","advisoryTitle":"Juhendav tiitel","anchor":{"toolbar":"Ankru sisestamine/muutmine","menu":"Ankru omadused","title":"Ankru omadused","name":"Ankru nimi","errorName":"Palun sisesta ankru nimi","remove":"Eemalda ankur"},"anchorId":"Elemendi id järgi","anchorName":"Ankru nime järgi","charset":"Lingitud ressursi märgistik","cssClasses":"Stiilistiku klassid","emailAddress":"E-posti aadress","emailBody":"Sõnumi tekst","emailSubject":"Sõnumi teema","id":"ID","info":"Lingi info","langCode":"Keele suund","langDir":"Keele suund","langDirLTR":"Vasakult paremale (LTR)","langDirRTL":"Paremalt vasakule (RTL)","menu":"Muuda linki","name":"Nimi","noAnchors":"(Selles dokumendis pole ankruid)","noEmail":"Palun kirjuta e-posti aadress","noUrl":"Palun kirjuta lingi URL","other":"<muu>","popupDependent":"Sõltuv (Netscape)","popupFeatures":"Hüpikakna omadused","popupFullScreen":"Täisekraan (IE)","popupLeft":"Vasak asukoht","popupLocationBar":"Aadressiriba","popupMenuBar":"Menüüriba","popupResizable":"Suurust saab muuta","popupScrollBars":"Kerimisribad","popupStatusBar":"Olekuriba","popupToolbar":"Tööriistariba","popupTop":"Ülemine asukoht","rel":"Suhe","selectAnchor":"Vali ankur","styles":"Laad","tabIndex":"Tab indeks","target":"Sihtkoht","targetFrame":"<raam>","targetFrameName":"Sihtmärk raami nimi","targetPopup":"<hüpikaken>","targetPopupName":"Hüpikakna nimi","title":"Link","toAnchor":"Ankur sellel lehel","toEmail":"E-post","toUrl":"URL","toolbar":"Lingi lisamine/muutmine","type":"Lingi liik","unlink":"Lingi eemaldamine","upload":"Lae üles"},"list":{"bulletedlist":"Punktloend","numberedlist":"Numberloend"},"magicline":{"title":"Sisesta siia lõigu tekst"},"maximize":{"maximize":"Maksimeerimine","minimize":"Minimeerimine"},"pastetext":{"button":"Asetamine tavalise tekstina","title":"Asetamine tavalise tekstina"},"pastefromword":{"confirmCleanup":"Tekst, mida tahad asetada näib pärinevat Wordist. Kas tahad selle enne asetamist puhastada?","error":"Asetatud andmete puhastamine ei olnud sisemise vea tõttu võimalik","title":"Asetamine Wordist","toolbar":"Asetamine Wordist"},"removeformat":{"toolbar":"Vormingu eemaldamine"},"sourcearea":{"toolbar":"Lähtekood"},"specialchar":{"options":"Erimärkide valikud","title":"Erimärgi valimine","toolbar":"Erimärgi sisestamine"},"scayt":{"about":"SCAYT-ist lähemalt","aboutTab":"Lähemalt","addWord":"Lisa sõna","allCaps":"Läbivate suurtähtedega sõnade eiramine","dic_create":"Loo","dic_delete":"Kustuta","dic_field_name":"Sõnaraamatu nimi","dic_info":"Alguses säilitatakse kasutaja sõnaraamatut küpsises. Küpsise suurus on piiratud. Pärast sõnaraamatu kasvamist nii suureks, et see küpsisesse ei mahu, võib sõnaraamatut hoida meie serveris. Oma isikliku sõnaraamatu hoidmiseks meie serveris pead andma sellele nime. Kui sa juba oled sõnaraamatu salvestanud, sisesta selle nimi ja klõpsa taastamise nupule.","dic_rename":"Nimeta ümber","dic_restore":"Taasta","dictionariesTab":"Sõnaraamatud","disable":"SCAYT keelatud","emptyDic":"Sõnaraamatu nimi ei tohi olla tühi.","enable":"SCAYT lubatud","ignore":"Eira","ignoreAll":"Eira kõiki","ignoreDomainNames":"Domeeninimede eiramine","langs":"Keeled","languagesTab":"Keeled","mixedCase":"Tavapäratu tõstuga sõnade eiramine","mixedWithDigits":"Numbreid sisaldavate sõnade eiramine","moreSuggestions":"Veel soovitusi","opera_title":"Operas pole toetatud","options":"Valikud","optionsTab":"Valikud","title":"Õigekirjakontroll kirjutamise ajal","toggle":"SCAYT sisse/välja lülitamine","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stiil","panelTitle":"Vormindusstiilid","panelTitle1":"Blokkstiilid","panelTitle2":"Reasisesed stiilid","panelTitle3":"Objektistiilid"},"table":{"border":"Joone suurus","caption":"Tabeli tiitel","cell":{"menu":"Lahter","insertBefore":"Sisesta lahter enne","insertAfter":"Sisesta lahter peale","deleteCell":"Eemalda lahtrid","merge":"Ühenda lahtrid","mergeRight":"Ühenda paremale","mergeDown":"Ühenda alla","splitHorizontal":"Poolita lahter horisontaalselt","splitVertical":"Poolita lahter vertikaalselt","title":"Lahtri omadused","cellType":"Lahtri liik","rowSpan":"Ridade vahe","colSpan":"Tulpade vahe","wordWrap":"Sõnade murdmine","hAlign":"Horisontaalne joondus","vAlign":"Vertikaalne joondus","alignBaseline":"Baasjoon","bgColor":"Tausta värv","borderColor":"Äärise värv","data":"Andmed","header":"Päis","yes":"Jah","no":"Ei","invalidWidth":"Lahtri laius peab olema number.","invalidHeight":"Lahtri kõrgus peab olema number.","invalidRowSpan":"Ridade vahe peab olema täisarv.","invalidColSpan":"Tulpade vahe peab olema täisarv.","chooseColor":"Vali"},"cellPad":"Lahtri täidis","cellSpace":"Lahtri vahe","column":{"menu":"Veerg","insertBefore":"Sisesta veerg enne","insertAfter":"Sisesta veerg peale","deleteColumn":"Eemalda veerud"},"columns":"Veerud","deleteTable":"Kustuta tabel","headers":"Päised","headersBoth":"Mõlemad","headersColumn":"Esimene tulp","headersNone":"Puudub","headersRow":"Esimene rida","invalidBorder":"Äärise suurus peab olema number.","invalidCellPadding":"Lahtrite polsterdus (padding) peab olema positiivne arv.","invalidCellSpacing":"Lahtrite vahe peab olema positiivne arv.","invalidCols":"Tulpade arv peab olema nullist suurem.","invalidHeight":"Tabeli kõrgus peab olema number.","invalidRows":"Ridade arv peab olema nullist suurem.","invalidWidth":"Tabeli laius peab olema number.","menu":"Tabeli omadused","row":{"menu":"Rida","insertBefore":"Sisesta rida enne","insertAfter":"Sisesta rida peale","deleteRow":"Eemalda read"},"rows":"Read","summary":"Kokkuvõte","title":"Tabeli omadused","toolbar":"Tabel","widthPc":"protsenti","widthPx":"pikslit","widthUnit":"laiuse ühik"},"undo":{"redo":"Toimingu kordamine","undo":"Tagasivõtmine"},"wsc":{"btnIgnore":"Ignoreeri","btnIgnoreAll":"Ignoreeri kõiki","btnReplace":"Asenda","btnReplaceAll":"Asenda kõik","btnUndo":"Võta tagasi","changeTo":"Muuda","errorLoading":"Viga rakenduse teenushosti laadimisel: %s.","ieSpellDownload":"Õigekirja kontrollija ei ole paigaldatud. Soovid sa selle alla laadida?","manyChanges":"Õigekirja kontroll sooritatud: %1 sõna muudetud","noChanges":"Õigekirja kontroll sooritatud: ühtegi sõna ei muudetud","noMispell":"Õigekirja kontroll sooritatud: õigekirjuvigu ei leitud","noSuggestions":"- Soovitused puuduvad -","notAvailable":"Kahjuks ei ole teenus praegu saadaval.","notInDic":"Puudub sõnastikust","oneChange":"Õigekirja kontroll sooritatud: üks sõna muudeti","progress":"Toimub õigekirja kontroll...","title":"Õigekirjakontroll","toolbar":"Õigekirjakontroll"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/eu.js b/theme/bootstrap/plugins/ckeditor/lang/eu.js new file mode 100644 index 0000000..8b3f82c --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/eu.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['eu']={"editor":"Testu Aberastuko Editorea","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"ALT 0 sakatu laguntza jasotzeko","browseServer":"Zerbitzaria arakatu","url":"URL","protocol":"Protokoloa","upload":"Gora kargatu","uploadSubmit":"Zerbitzarira bidali","image":"Irudia","flash":"Flasha","form":"Formularioa","checkbox":"Kontrol-laukia","radio":"Aukera-botoia","textField":"Testu Eremua","textarea":"Testu-area","hiddenField":"Ezkutuko Eremua","button":"Botoia","select":"Hautespen Eremua","imageButton":"Irudi Botoia","notSet":"<Ezarri gabe>","id":"Id","name":"Izena","langDir":"Hizkuntzaren Norabidea","langDirLtr":"Ezkerretik Eskumara(LTR)","langDirRtl":"Eskumatik Ezkerrera (RTL)","langCode":"Hizkuntza Kodea","longDescr":"URL Deskribapen Luzea","cssClass":"Estilo-orriko Klaseak","advisoryTitle":"Izenburua","cssStyle":"Estiloa","ok":"Ados","cancel":"Utzi","close":"Itxi","preview":"Aurrebista","resize":"Arrastatu tamaina aldatzeko","generalTab":"Orokorra","advancedTab":"Aurreratua","validateNumberFailed":"Balio hau ez da zenbaki bat.","confirmNewPage":"Eduki honetan gorde gabe dauden aldaketak galduko dira. Ziur zaude orri berri bat kargatu nahi duzula?","confirmCancel":"Aukera batzuk aldatu egin dira. Ziur zaude elkarrizketa-koadroa itxi nahi duzula?","options":"Aukerak","target":"Target (Helburua)","targetNew":"Leiho Berria (_blank)","targetTop":"Goieneko Leihoan (_top)","targetSelf":"Leiho Berdinean (_self)","targetParent":"Leiho Gurasoan (_parent)","langDirLTR":"Ezkerretik Eskumara(LTR)","langDirRTL":"Eskumatik Ezkerrera (RTL)","styles":"Estiloa","cssClasses":"Estilo-orriko Klaseak","width":"Zabalera","height":"Altuera","align":"Lerrokatu","alignLeft":"Ezkerrera","alignRight":"Eskuman","alignCenter":"Erdian","alignTop":"Goian","alignMiddle":"Erdian","alignBottom":"Behean","invalidValue":"Balio ezegokia.","invalidHeight":"Altuera zenbaki bat izan behar da.","invalidWidth":"Zabalera zenbaki bat izan behar da.","invalidCssLength":"\"%1\" eremurako zehaztutako balioa zenbaki positibo bat izan behar du, aukeran CSS neurri unitate batekin (px, %, in, cm, mm, em, ex, pt edo pc).","invalidHtmlLength":"\"%1\" eremurako zehaztutako balioa zenbaki positibo bat izan behar du, aukeran HTML neurri unitate batekin (px edo %).","invalidInlineStyle":"Lerroko estiloan zehazten dena tupla \"name : value\" formatuko eta puntu eta komaz bereiztutako tupla bat edo gehiago izan behar dira.","cssLengthTooltip":"Zenbakia bakarrik zehazten bada pixeletan egongo da. CSS neurri unitatea ere zehaztu ahal da (px, %, in, cm, mm, em, ex, pt, edo pc).","unavailable":"%1<span class=\"cke_accessibility\">, erabilezina</span>"},"about":{"copy":"Copyright &copy; $1. Eskubide guztiak erreserbaturik.","dlgTitle":"CKEditor(r)i buruz","help":"$1 aztertu laguntza jasotzeko.","moreInfo":"Lizentziari buruzko informazioa gure webgunean:","title":"CKEditor(r)i buruz","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Lodia","italic":"Etzana","strike":"Marratua","subscript":"Azpi-indize","superscript":"Goi-indize","underline":"Azpimarratu"},"blockquote":{"toolbar":"Aipamen blokea"},"clipboard":{"copy":"Kopiatu","copyError":"Zure web nabigatzailearen segurtasun ezarpenak testuak automatikoki kopiatzea ez dute baimentzen. Mesedez teklatua erabili ezazu (Ctrl/Cmd+C).","cut":"Ebaki","cutError":"Zure web nabigatzailearen segurtasun ezarpenak testuak automatikoki moztea ez dute baimentzen. Mesedez teklatua erabili ezazu (Ctrl/Cmd+X).","paste":"Itsatsi","pasteArea":"Itsasteko Area","pasteMsg":"Mesedez teklatua erabilita (<STRONG>Ctrl/Cmd+V</STRONG>) ondorego eremuan testua itsatsi eta <STRONG>OK</STRONG> sakatu.","securityMsg":"Nabigatzailearen segurtasun ezarpenak direla eta, editoreak ezin du arbela zuzenean erabili. Leiho honetan berriro itsatsi behar duzu.","title":"Itsatsi"},"contextmenu":{"options":"Testuingurko Menuaren Aukerak"},"toolbar":{"toolbarCollapse":"Tresna-barra Txikitu","toolbarExpand":"Tresna-barra Luzatu","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editorearen Tresna-barra"},"elementspath":{"eleLabel":"Elementu bidea","eleTitle":"%1 elementua"},"format":{"label":"Formatua","panelTitle":"Formatua","tag_address":"Helbidea","tag_div":"Paragrafoa (DIV)","tag_h1":"Izenburua 1","tag_h2":"Izenburua 2","tag_h3":"Izenburua 3","tag_h4":"Izenburua 4","tag_h5":"Izenburua 5","tag_h6":"Izenburua 6","tag_p":"Arrunta","tag_pre":"Formateatua"},"horizontalrule":{"toolbar":"Txertatu Marra Horizontala"},"image":{"alertUrl":"Mesedez Irudiaren URLa idatzi","alt":"Ordezko Testua","border":"Ertza","btnUpload":"Zerbitzarira bidalia","button2Img":"Aukeratutako irudi botoia, irudi normal batean eraldatu nahi duzu?","hSpace":"HSpace","img2Button":"Aukeratutako irudia, irudi botoi batean eraldatu nahi duzu?","infoTab":"Irudi informazioa","linkTab":"Esteka","lockRatio":"Erlazioa Blokeatu","menu":"Irudi Ezaugarriak","resetSize":"Tamaina Berrezarri","title":"Irudi Ezaugarriak","titleButton":"Irudi Botoiaren Ezaugarriak","upload":"Gora Kargatu","urlMissing":"Irudiaren iturburu URL-a falta da.","vSpace":"VSpace","validateBorder":"Ertza zenbaki oso bat izan behar da.","validateHSpace":"HSpace zenbaki oso bat izan behar da.","validateVSpace":"VSpace zenbaki oso bat izan behar da."},"indent":{"indent":"Handitu Koska","outdent":"Txikitu Koska"},"fakeobjects":{"anchor":"Aingura","flash":"Flash Animazioa","hiddenfield":"Ezkutuko Eremua","iframe":"IFrame","unknown":"Objektu ezezaguna"},"link":{"acccessKey":"Sarbide-gakoa","advanced":"Aurreratua","advisoryContentType":"Eduki Mota (Content Type)","advisoryTitle":"Izenburua","anchor":{"toolbar":"Aingura","menu":"Ainguraren Ezaugarriak","title":"Ainguraren Ezaugarriak","name":"Ainguraren Izena","errorName":"Idatzi ainguraren izena","remove":"Remove Anchor"},"anchorId":"Elementuaren ID-gatik","anchorName":"Aingura izenagatik","charset":"Estekatutako Karaktere Multzoa","cssClasses":"Estilo-orriko Klaseak","emailAddress":"ePosta Helbidea","emailBody":"Mezuaren Gorputza","emailSubject":"Mezuaren Gaia","id":"Id","info":"Estekaren Informazioa","langCode":"Hizkuntzaren Norabidea","langDir":"Hizkuntzaren Norabidea","langDirLTR":"Ezkerretik Eskumara(LTR)","langDirRTL":"Eskumatik Ezkerrera (RTL)","menu":"Aldatu Esteka","name":"Izena","noAnchors":"(Ez daude aingurak eskuragarri dokumentuan)","noEmail":"Mesedez ePosta helbidea idatzi","noUrl":"Mesedez URL esteka idatzi","other":"<bestelakoa>","popupDependent":"Menpekoa (Netscape)","popupFeatures":"Popup Leihoaren Ezaugarriak","popupFullScreen":"Pantaila Osoa (IE)","popupLeft":"Ezkerreko Posizioa","popupLocationBar":"Kokaleku Barra","popupMenuBar":"Menu Barra","popupResizable":"Tamaina Aldakorra","popupScrollBars":"Korritze Barrak","popupStatusBar":"Egoera Barra","popupToolbar":"Tresna Barra","popupTop":"Goiko Posizioa","rel":"Erlazioa","selectAnchor":"Aingura bat hautatu","styles":"Estiloa","tabIndex":"Tabulazio Indizea","target":"Target (Helburua)","targetFrame":"<marko>","targetFrameName":"Marko Helburuaren Izena","targetPopup":"<popup leihoa>","targetPopupName":"Popup Leihoaren Izena","title":"Esteka","toAnchor":"Aingura orrialde honetan","toEmail":"ePosta","toUrl":"URL","toolbar":"Txertatu/Editatu Esteka","type":"Esteka Mota","unlink":"Kendu Esteka","upload":"Gora kargatu"},"list":{"bulletedlist":"Buletdun Zerrenda","numberedlist":"Zenbakidun Zerrenda"},"magicline":{"title":"Txertatu paragrafoa hemen"},"maximize":{"maximize":"Maximizatu","minimize":"Minimizatu"},"pastetext":{"button":"Testu Arrunta bezala Itsatsi","title":"Testu Arrunta bezala Itsatsi"},"pastefromword":{"confirmCleanup":"Itsatsi nahi duzun testua Wordetik hartua dela dirudi. Itsatsi baino lehen garbitu nahi duzu?","error":"Barneko errore bat dela eta ezin izan da testua garbitu","title":"Itsatsi Word-etik","toolbar":"Itsatsi Word-etik"},"removeformat":{"toolbar":"Kendu Formatua"},"sourcearea":{"toolbar":"HTML Iturburua"},"specialchar":{"options":"Karaktere Berezien Aukerak","title":"Karaktere Berezia Aukeratu","toolbar":"Txertatu Karaktere Berezia"},"scayt":{"about":"SCAYTi buruz","aboutTab":"Honi buruz","addWord":"Hitza Gehitu","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Hiztegiak","disable":"Desgaitu SCAYT","emptyDic":"Hiztegiaren izena ezin da hutsik egon.","enable":"Gaitu SCAYT","ignore":"Baztertu","ignoreAll":"Denak baztertu","ignoreDomainNames":"Ignore Domain Names","langs":"Hizkuntzak","languagesTab":"Hizkuntzak","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"Iradokizun gehiago","opera_title":"Not supported by Opera","options":"Aukerak","optionsTab":"Aukerak","title":"Ortografia Zuzenketa Idatzi Ahala (SCAYT)","toggle":"SCAYT aldatu","noSuggestions":"No suggestion"},"stylescombo":{"label":"Estiloa","panelTitle":"Formatu Estiloak","panelTitle1":"Bloke Estiloak","panelTitle2":"Inline Estiloak","panelTitle3":"Objektu Estiloak"},"table":{"border":"Ertzaren Zabalera","caption":"Epigrafea","cell":{"menu":"Gelaxka","insertBefore":"Txertatu Gelaxka Aurretik","insertAfter":"Txertatu Gelaxka Ostean","deleteCell":"Kendu Gelaxkak","merge":"Batu Gelaxkak","mergeRight":"Elkartu Eskumara","mergeDown":"Elkartu Behera","splitHorizontal":"Banatu Gelaxkak Horizontalki","splitVertical":"Banatu Gelaxkak Bertikalki","title":"Gelaxken Ezaugarriak","cellType":"Gelaxka Mota","rowSpan":"Hedatutako Lerroak","colSpan":"Hedatutako Zutabeak","wordWrap":"Itzulbira","hAlign":"Lerrokatze Horizontala","vAlign":"Lerrokatze Bertikala","alignBaseline":"Oinarri-lerroan","bgColor":"Fondoaren Kolorea","borderColor":"Ertzaren Kolorea","data":"Data","header":"Goiburua","yes":"Bai","no":"Ez","invalidWidth":"Gelaxkaren zabalera zenbaki bat izan behar da.","invalidHeight":"Gelaxkaren altuera zenbaki bat izan behar da.","invalidRowSpan":"Lerroen hedapena zenbaki osoa izan behar da.","invalidColSpan":"Zutabeen hedapena zenbaki osoa izan behar da.","chooseColor":"Choose"},"cellPad":"Gelaxken betegarria","cellSpace":"Gelaxka arteko tartea","column":{"menu":"Zutabea","insertBefore":"Txertatu Zutabea Aurretik","insertAfter":"Txertatu Zutabea Ostean","deleteColumn":"Ezabatu Zutabeak"},"columns":"Zutabeak","deleteTable":"Ezabatu Taula","headers":"Goiburuak","headersBoth":"Biak","headersColumn":"Lehen zutabea","headersNone":"Bat ere ez","headersRow":"Lehen lerroa","invalidBorder":"Ertzaren tamaina zenbaki bat izan behar da.","invalidCellPadding":"Gelaxken betegarria zenbaki bat izan behar da.","invalidCellSpacing":"Gelaxka arteko tartea zenbaki bat izan behar da.","invalidCols":"Zutabe kopurua 0 baino handiagoa den zenbakia izan behar da.","invalidHeight":"Taularen altuera zenbaki bat izan behar da.","invalidRows":"Lerro kopurua 0 baino handiagoa den zenbakia izan behar da.","invalidWidth":"Taularen zabalera zenbaki bat izan behar da.","menu":"Taularen Ezaugarriak","row":{"menu":"Lerroa","insertBefore":"Txertatu Lerroa Aurretik","insertAfter":"Txertatu Lerroa Ostean","deleteRow":"Ezabatu Lerroak"},"rows":"Lerroak","summary":"Laburpena","title":"Taularen Ezaugarriak","toolbar":"Taula","widthPc":"ehuneko","widthPx":"pixel","widthUnit":"zabalera unitatea"},"undo":{"redo":"Berregin","undo":"Desegin"},"wsc":{"btnIgnore":"Ezikusi","btnIgnoreAll":"Denak Ezikusi","btnReplace":"Ordezkatu","btnReplaceAll":"Denak Ordezkatu","btnUndo":"Desegin","changeTo":"Honekin ordezkatu","errorLoading":"Errorea gertatu da aplikazioa zerbitzaritik kargatzean: %s.","ieSpellDownload":"Zuzentzaile ortografikoa ez dago instalatuta. Deskargatu nahi duzu?","manyChanges":"Zuzenketa ortografikoa bukatuta: %1 hitz aldatu dira","noChanges":"Zuzenketa ortografikoa bukatuta: Ez da ezer aldatu","noMispell":"Zuzenketa ortografikoa bukatuta: Akatsik ez","noSuggestions":"- Iradokizunik ez -","notAvailable":"Barkatu baina momentu honetan zerbitzua ez dago erabilgarri.","notInDic":"Ez dago hiztegian","oneChange":"Zuzenketa ortografikoa bukatuta: Hitz bat aldatu da","progress":"Zuzenketa ortografikoa martxan...","title":"Ortografia zuzenketa","toolbar":"Ortografia"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/fa.js b/theme/bootstrap/plugins/ckeditor/lang/fa.js new file mode 100644 index 0000000..094e08f --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/fa.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['fa']={"editor":"ویرایشگر متن کامل","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"کلید Alt+0 را برای راهنمایی بفشارید","browseServer":"فهرستنمایی سرور","url":"URL","protocol":"پروتکل","upload":"آپلود","uploadSubmit":"به سرور بفرست","image":"تصویر","flash":"فلش","form":"فرم","checkbox":"چکباکس","radio":"دکمهی رادیویی","textField":"فیلد متنی","textarea":"ناحیهٴ متنی","hiddenField":"فیلد پنهان","button":"دکمه","select":"فیلد انتخاب چند گزینهای","imageButton":"دکمهی تصویری","notSet":"<تعین نشده>","id":"شناسه","name":"نام","langDir":"جهتنمای زبان","langDirLtr":"چپ به راست","langDirRtl":"راست به چپ","langCode":"کد زبان","longDescr":"URL توصیف طولانی","cssClass":"کلاسهای شیوهنامه (Stylesheet)","advisoryTitle":"عنوان کمکی","cssStyle":"شیوه (style)","ok":"پذیرش","cancel":"انصراف","close":"بستن","preview":"پیشنمایش","resize":"تغییر اندازه","generalTab":"عمومی","advancedTab":"پیشرفته","validateNumberFailed":"این مقدار یک عدد نیست.","confirmNewPage":"هر تغییر ایجاد شدهی ذخیره نشده از بین خواهد رفت. آیا اطمینان دارید که قصد بارگیری صفحه جدیدی را دارید؟","confirmCancel":"برخی از گزینهها تغییر کردهاند. آیا واقعا قصد بستن این پنجره را دارید؟","options":"گزینهها","target":"نحوه باز کردن","targetNew":"پنجره جدید","targetTop":"بالاترین پنجره","targetSelf":"همان پنجره","targetParent":"پنجره والد","langDirLTR":"چپ به راست","langDirRTL":"راست به چپ","styles":"سبک","cssClasses":"کلاسهای شیوهنامه","width":"عرض","height":"طول","align":"چینش","alignLeft":"چپ","alignRight":"راست","alignCenter":"مرکز","alignTop":"بالا","alignMiddle":"وسط","alignBottom":"پائین","invalidValue":"مقدار نامعتبر.","invalidHeight":"ارتفاع باید یک عدد باشد.","invalidWidth":"عرض باید یک عدد باشد.","invalidCssLength":"عدد تعیین شده برای فیلد \"%1\" باید یک عدد مثبت با یا بدون یک واحد اندازه گیری CSS معتبر باشد (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"عدد تعیین شده برای فیلد \"%1\" باید یک عدد مثبت با یا بدون یک واحد اندازه گیری HTML معتبر باشد (px or %).","invalidInlineStyle":"عدد تعیین شده برای سبک درونخطی -Inline Style- باید دارای یک یا چند چندتایی با شکلی شبیه \"name : value\" که باید با یک \";\" از هم جدا شوند.","cssLengthTooltip":"یک عدد برای یک مقدار بر حسب پیکسل و یا یک عدد با یک واحد CSS معتبر وارد کنید (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">، غیر قابل دسترس</span>"},"about":{"copy":"حق نشر &copy; $1. کلیه حقوق محفوظ است.","dlgTitle":"درباره CKEditor","help":" برای راهنمایی $1 را بررسی کنید.","moreInfo":"برای کسب اطلاعات مجوز لطفا به وب سایت ما مراجعه کنید:","title":"درباره CKEditor","userGuide":"راهنمای کاربران CKEditor"},"basicstyles":{"bold":"درشت","italic":"خمیده","strike":"میانخط","subscript":"زیرنویس","superscript":"بالانویس","underline":"زیرخطدار"},"blockquote":{"toolbar":"بلوک نقل قول"},"clipboard":{"copy":"رونوشت","copyError":"تنظیمات امنیتی مرورگر شما اجازه نمیدهد که ویرایشگر به طور خودکار عملکردهای کپی کردن را انجام دهد. لطفا با دکمههای صفحه کلید این کار را انجام دهید (Ctrl/Cmd+C).","cut":"برش","cutError":"تنظیمات امنیتی مرورگر شما اجازه نمیدهد که ویرایشگر به طور خودکار عملکردهای برش را انجام دهد. لطفا با دکمههای صفحه کلید این کار را انجام دهید (Ctrl/Cmd+X).","paste":"چسباندن","pasteArea":"محل چسباندن","pasteMsg":"لطفا متن را با کلیدهای (<STRONG>Ctrl/Cmd+V</STRONG>) در این جعبهٴ متنی بچسبانید و <STRONG>پذیرش</STRONG> را بزنید.","securityMsg":"به خاطر تنظیمات امنیتی مرورگر شما، ویرایشگر نمیتواند دسترسی مستقیم به دادههای clipboard داشته باشد. شما باید دوباره آنرا در این پنجره بچسبانید.","title":"چسباندن"},"contextmenu":{"options":"گزینههای منوی زمینه"},"toolbar":{"toolbarCollapse":"بستن نوار ابزار","toolbarExpand":"بازکردن نوار ابزار","toolbarGroups":{"document":"سند","clipboard":"حافظه موقت/برگشت","editing":"در حال ویرایش","forms":"فرمها","basicstyles":"شیوههای پایه","paragraph":"بند","links":"پیوندها","insert":"ورود","styles":"شیوهها","colors":"رنگها","tools":"ابزارها"},"toolbars":"نوار ابزار"},"elementspath":{"eleLabel":"مسیر عناصر","eleTitle":"%1 عنصر"},"format":{"label":"فرمت","panelTitle":"فرمت","tag_address":"آدرس","tag_div":"بند","tag_h1":"سرنویس 1","tag_h2":"سرنویس 2","tag_h3":"سرنویس 3","tag_h4":"سرنویس 4","tag_h5":"سرنویس 5","tag_h6":"سرنویس 6","tag_p":"نرمال","tag_pre":"فرمت شده"},"horizontalrule":{"toolbar":"گنجاندن خط افقی"},"image":{"alertUrl":"لطفا URL تصویر را بنویسید","alt":"متن جایگزین","border":"لبه","btnUpload":"به سرور بفرست","button2Img":"آیا مایلید از یک تصویر ساده روی دکمه تصویری انتخاب شده استفاده کنید؟","hSpace":"فاصلهٴ افقی","img2Button":"آیا مایلید از یک دکمه تصویری روی تصویر انتخاب شده استفاده کنید؟","infoTab":"اطلاعات تصویر","linkTab":"پیوند","lockRatio":"قفل کردن نسبت","menu":"ویژگیهای تصویر","resetSize":"بازنشانی اندازه","title":"ویژگیهای تصویر","titleButton":"ویژگیهای دکمهٴ تصویری","upload":"انتقال به سرور","urlMissing":"آدرس URL اصلی تصویر یافت نشد.","vSpace":"فاصلهٴ عمودی","validateBorder":"مقدار خطوط باید یک عدد باشد.","validateHSpace":"مقدار فاصله گذاری افقی باید یک عدد باشد.","validateVSpace":"مقدار فاصله گذاری عمودی باید یک عدد باشد."},"indent":{"indent":"افزایش تورفتگی","outdent":"کاهش تورفتگی"},"fakeobjects":{"anchor":"لنگر","flash":"انیمشن فلش","hiddenfield":"فیلد پنهان","iframe":"IFrame","unknown":"شیء ناشناخته"},"link":{"acccessKey":"کلید دستیابی","advanced":"پیشرفته","advisoryContentType":"نوع محتوای کمکی","advisoryTitle":"عنوان کمکی","anchor":{"toolbar":"گنجاندن/ویرایش لنگر","menu":"ویژگیهای لنگر","title":"ویژگیهای لنگر","name":"نام لنگر","errorName":"لطفا نام لنگر را بنویسید","remove":"حذف لنگر"},"anchorId":"با شناسهٴ المان","anchorName":"با نام لنگر","charset":"نویسهگان منبع پیوند شده","cssClasses":"کلاسهای شیوهنامه(Stylesheet)","emailAddress":"نشانی پست الکترونیکی","emailBody":"متن پیام","emailSubject":"موضوع پیام","id":"شناسه","info":"اطلاعات پیوند","langCode":"جهتنمای زبان","langDir":"جهتنمای زبان","langDirLTR":"چپ به راست (LTR)","langDirRTL":"راست به چپ (RTL)","menu":"ویرایش پیوند","name":"نام","noAnchors":"(در این سند لنگری دردسترس نیست)","noEmail":"لطفا نشانی پست الکترونیکی را بنویسید","noUrl":"لطفا URL پیوند را بنویسید","other":"<سایر>","popupDependent":"وابسته (Netscape)","popupFeatures":"ویژگیهای پنجرهٴ پاپاپ","popupFullScreen":"تمام صفحه (IE)","popupLeft":"موقعیت چپ","popupLocationBar":"نوار موقعیت","popupMenuBar":"نوار منو","popupResizable":"قابل تغییر اندازه","popupScrollBars":"میلههای پیمایش","popupStatusBar":"نوار وضعیت","popupToolbar":"نوار ابزار","popupTop":"موقعیت بالا","rel":"وابستگی","selectAnchor":"یک لنگر برگزینید","styles":"شیوه (style)","tabIndex":"نمایهٴ دسترسی با برگه","target":"مقصد","targetFrame":"<فریم>","targetFrameName":"نام فریم مقصد","targetPopup":"<پنجرهٴ پاپاپ>","targetPopupName":"نام پنجرهٴ پاپاپ","title":"پیوند","toAnchor":"لنگر در همین صفحه","toEmail":"پست الکترونیکی","toUrl":"URL","toolbar":"گنجاندن/ویرایش پیوند","type":"نوع پیوند","unlink":"برداشتن پیوند","upload":"انتقال به سرور"},"list":{"bulletedlist":"فهرست نقطهای","numberedlist":"فهرست شمارهدار"},"magicline":{"title":"قرار دادن بند در اینجا"},"maximize":{"maximize":"بیشنه کردن","minimize":"کمینه کردن"},"pastetext":{"button":"چسباندن به عنوان متن ساده","title":"چسباندن به عنوان متن ساده"},"pastefromword":{"confirmCleanup":"متنی که میخواهید بچسبانید به نظر میرسد که از Word کپی شده است. آیا میخواهید قبل از چسباندن آن را پاکسازی کنید؟","error":"به دلیل بروز خطای داخلی امکان پاکسازی اطلاعات بازنشانی شده وجود ندارد.","title":"چسباندن از Word","toolbar":"چسباندن از Word"},"removeformat":{"toolbar":"برداشتن فرمت"},"sourcearea":{"toolbar":"منبع"},"specialchar":{"options":"گزینههای نویسههای ویژه","title":"گزینش نویسهی ویژه","toolbar":"گنجاندن نویسهی ویژه"},"scayt":{"about":"درباره SCAYT","aboutTab":"درباره","addWord":"افزودن Word","allCaps":"نادیده گرفتن همه کلاه-واژهها","dic_create":"ایجاد","dic_delete":"حذف","dic_field_name":"نام دیکشنری","dic_info":"در ابتدا دیکشنری کاربر در کوکی ذخیره میشود. با این حال، کوکیها در اندازه محدود شدهاند. وقتی که دیکشنری کاربری بزرگ میشود و به نقطهای که نمیتواند در کوکی ذخیره شود، پس از آن دیکشنری ممکن است بر روی سرور ما ذخیره شود. برای ذخیره دیکشنری شخصی شما بر روی سرور ما، باید یک نام برای دیکشنری خود مشخص نمایید. اگر شما قبلا یک دیکشنری روی سرور ما ذخیره کردهاید، لطفا نام آنرا درج و روی دکمه بازیافت کلیک نمایید.","dic_rename":"تغییر نام","dic_restore":"بازیافت","dictionariesTab":"دیکشنریها","disable":"غیرفعالسازی SCAYT","emptyDic":"نام دیکشنری نباید خالی باشد.","enable":"فعالسازی SCAYT","ignore":"عبور کردن","ignoreAll":"عبور کردن از همه","ignoreDomainNames":"عبور از نامهای دامنه","langs":"زبانها","languagesTab":"زبانها","mixedCase":"عبور از کلماتی مرکب از حروف بزرگ و کوچک","mixedWithDigits":"عبور از کلمات به همراه عدد","moreSuggestions":"پیشنهادهای بیشتر","opera_title":"توسط اپرا پشتیبانی نمیشود","options":"گزینهها","optionsTab":"گزینهها","title":"بررسی املای تایپ شما","toggle":"ضامن SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"سبک","panelTitle":"سبکهای قالببندی","panelTitle1":"سبکهای بلوک","panelTitle2":"سبکهای درونخطی","panelTitle3":"سبکهای شیء"},"table":{"border":"اندازهٴ لبه","caption":"عنوان","cell":{"menu":"سلول","insertBefore":"افزودن سلول قبل از","insertAfter":"افزودن سلول بعد از","deleteCell":"حذف سلولها","merge":"ادغام سلولها","mergeRight":"ادغام به راست","mergeDown":"ادغام به پایین","splitHorizontal":"جدا کردن افقی سلول","splitVertical":"جدا کردن عمودی سلول","title":"ویژگیهای سلول","cellType":"نوع سلول","rowSpan":"محدوده ردیفها","colSpan":"محدوده ستونها","wordWrap":"شکستن کلمه","hAlign":"چینش افقی","vAlign":"چینش عمودی","alignBaseline":"خط مبنا","bgColor":"رنگ زمینه","borderColor":"رنگ خطوط","data":"اطلاعات","header":"سرنویس","yes":"بله","no":"خیر","invalidWidth":"عرض سلول باید یک عدد باشد.","invalidHeight":"ارتفاع سلول باید عدد باشد.","invalidRowSpan":"مقدار محدوده ردیفها باید یک عدد باشد.","invalidColSpan":"مقدار محدوده ستونها باید یک عدد باشد.","chooseColor":"انتخاب"},"cellPad":"فاصلهٴ پرشده در سلول","cellSpace":"فاصلهٴ میان سلولها","column":{"menu":"ستون","insertBefore":"افزودن ستون قبل از","insertAfter":"افزودن ستون بعد از","deleteColumn":"حذف ستونها"},"columns":"ستونها","deleteTable":"پاک کردن جدول","headers":"سرنویسها","headersBoth":"هردو","headersColumn":"اولین ستون","headersNone":"هیچ","headersRow":"اولین ردیف","invalidBorder":"مقدار اندازه خطوط باید یک عدد باشد.","invalidCellPadding":"بالشتک سلول باید یک عدد باشد.","invalidCellSpacing":"مقدار فاصلهگذاری سلول باید یک عدد باشد.","invalidCols":"تعداد ستونها باید یک عدد بزرگتر از 0 باشد.","invalidHeight":"مقدار ارتفاع جدول باید یک عدد باشد.","invalidRows":"تعداد ردیفها باید یک عدد بزرگتر از 0 باشد.","invalidWidth":"مقدار پهنای جدول باید یک عدد باشد.","menu":"ویژگیهای جدول","row":{"menu":"سطر","insertBefore":"افزودن سطر قبل از","insertAfter":"افزودن سطر بعد از","deleteRow":"حذف سطرها"},"rows":"سطرها","summary":"خلاصه","title":"ویژگیهای جدول","toolbar":"جدول","widthPc":"درصد","widthPx":"پیکسل","widthUnit":"واحد پهنا"},"undo":{"redo":"بازچیدن","undo":"واچیدن"},"wsc":{"btnIgnore":"چشمپوشی","btnIgnoreAll":"چشمپوشی همه","btnReplace":"جایگزینی","btnReplaceAll":"جایگزینی همه","btnUndo":"واچینش","changeTo":"تغییر به","errorLoading":"خطا در بارگیری برنامه خدمات میزبان: %s.","ieSpellDownload":"بررسی کنندهٴ املا نصب نشده است. آیا میخواهید آن را هماکنون دریافت کنید؟","manyChanges":"بررسی املا انجام شد. %1 واژه تغییر یافت","noChanges":"بررسی املا انجام شد. هیچ واژهای تغییر نیافت","noMispell":"بررسی املا انجام شد. هیچ غلط املائی یافت نشد","noSuggestions":"- پیشنهادی نیست -","notAvailable":"با عرض پوزش خدمات الان در دسترس نیستند.","notInDic":"در واژه~نامه یافت نشد","oneChange":"بررسی املا انجام شد. یک واژه تغییر یافت","progress":"بررسی املا در حال انجام...","title":"بررسی املا","toolbar":"بررسی املا"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/fi.js b/theme/bootstrap/plugins/ckeditor/lang/fi.js new file mode 100644 index 0000000..821bf76 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/fi.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['fi']={"editor":"Rikastekstieditori","editorPanel":"Rikastekstieditoripaneeli","common":{"editorHelp":"Paina ALT 0 nähdäksesi ohjeen","browseServer":"Selaa palvelinta","url":"Osoite","protocol":"Protokolla","upload":"Lisää tiedosto","uploadSubmit":"Lähetä palvelimelle","image":"Kuva","flash":"Flash-animaatio","form":"Lomake","checkbox":"Valintaruutu","radio":"Radiopainike","textField":"Tekstikenttä","textarea":"Tekstilaatikko","hiddenField":"Piilokenttä","button":"Painike","select":"Valintakenttä","imageButton":"Kuvapainike","notSet":"<ei asetettu>","id":"Tunniste","name":"Nimi","langDir":"Kielen suunta","langDirLtr":"Vasemmalta oikealle (LTR)","langDirRtl":"Oikealta vasemmalle (RTL)","langCode":"Kielikoodi","longDescr":"Pitkän kuvauksen URL","cssClass":"Tyyliluokat","advisoryTitle":"Avustava otsikko","cssStyle":"Tyyli","ok":"OK","cancel":"Peruuta","close":"Sulje","preview":"Esikatselu","resize":"Raahaa muuttaaksesi kokoa","generalTab":"Yleinen","advancedTab":"Lisäominaisuudet","validateNumberFailed":"Arvon pitää olla numero.","confirmNewPage":"Kaikki tallentamattomat muutokset tähän sisältöön menetetään. Oletko varma, että haluat ladata uuden sivun?","confirmCancel":"Jotkut asetuksista on muuttuneet. Oletko varma, että haluat sulkea valintaikkunan?","options":"Asetukset","target":"Kohde","targetNew":"Uusi ikkuna (_blank)","targetTop":"Päällimmäinen ikkuna (_top)","targetSelf":"Sama ikkuna (_self)","targetParent":"Ylemmän tason ikkuna (_parent)","langDirLTR":"Vasemmalta oikealle (LTR)","langDirRTL":"Oikealta vasemmalle (RTL)","styles":"Tyyli","cssClasses":"Tyylitiedoston luokat","width":"Leveys","height":"Korkeus","align":"Kohdistus","alignLeft":"Vasemmalle","alignRight":"Oikealle","alignCenter":"Keskelle","alignTop":"Ylös","alignMiddle":"Keskelle","alignBottom":"Alas","invalidValue":"Virheellinen arvo.","invalidHeight":"Korkeuden täytyy olla numero.","invalidWidth":"Leveyden täytyy olla numero.","invalidCssLength":"Kentän \"%1\" arvon täytyy olla positiivinen luku CSS mittayksikön (px, %, in, cm, mm, em, ex, pt tai pc) kanssa tai ilman.","invalidHtmlLength":"Kentän \"%1\" arvon täytyy olla positiivinen luku HTML mittayksikön (px tai %) kanssa tai ilman.","invalidInlineStyle":"Tyylille annetun arvon täytyy koostua yhdestä tai useammasta \"nimi : arvo\" parista, jotka ovat eroteltuna toisistaan puolipisteillä.","cssLengthTooltip":"Anna numeroarvo pikseleinä tai numeroarvo CSS mittayksikön kanssa (px, %, in, cm, mm, em, ex, pt, tai pc).","unavailable":"%1<span class=\"cke_accessibility\">, ei saatavissa</span>"},"about":{"copy":"Copyright &copy; $1. Kaikki oikeuden pidätetään.","dlgTitle":"Tietoa CKEditorista","help":"Katso ohjeet: $1.","moreInfo":"Lisenssitiedot löytyvät kotisivuiltamme:","title":"Tietoa CKEditorista","userGuide":"CKEditorin käyttäjäopas"},"basicstyles":{"bold":"Lihavoitu","italic":"Kursivoitu","strike":"Yliviivattu","subscript":"Alaindeksi","superscript":"Yläindeksi","underline":"Alleviivattu"},"blockquote":{"toolbar":"Lainaus"},"clipboard":{"copy":"Kopioi","copyError":"Selaimesi turva-asetukset eivät salli editorin toteuttaa kopioimista. Käytä näppäimistöä kopioimiseen (Ctrl+C).","cut":"Leikkaa","cutError":"Selaimesi turva-asetukset eivät salli editorin toteuttaa leikkaamista. Käytä näppäimistöä leikkaamiseen (Ctrl+X).","paste":"Liitä","pasteArea":"Leikealue","pasteMsg":"Liitä painamalla (<STRONG>Ctrl+V</STRONG>) ja painamalla <STRONG>OK</STRONG>.","securityMsg":"Selaimesi turva-asetukset eivät salli editorin käyttää leikepöytää suoraan. Sinun pitää suorittaa liittäminen tässä ikkunassa.","title":"Liitä"},"contextmenu":{"options":"Pikavalikon ominaisuudet"},"toolbar":{"toolbarCollapse":"Kutista työkalupalkki","toolbarExpand":"Laajenna työkalupalkki","toolbarGroups":{"document":"Dokumentti","clipboard":"Leikepöytä/Kumoa","editing":"Muokkaus","forms":"Lomakkeet","basicstyles":"Perustyylit","paragraph":"Kappale","links":"Linkit","insert":"Lisää","styles":"Tyylit","colors":"Värit","tools":"Työkalut"},"toolbars":"Editorin työkalupalkit"},"elementspath":{"eleLabel":"Elementin polku","eleTitle":"%1 elementti"},"format":{"label":"Muotoilu","panelTitle":"Muotoilu","tag_address":"Osoite","tag_div":"Normaali (DIV)","tag_h1":"Otsikko 1","tag_h2":"Otsikko 2","tag_h3":"Otsikko 3","tag_h4":"Otsikko 4","tag_h5":"Otsikko 5","tag_h6":"Otsikko 6","tag_p":"Normaali","tag_pre":"Muotoiltu"},"horizontalrule":{"toolbar":"Lisää murtoviiva"},"image":{"alertUrl":"Kirjoita kuvan osoite (URL)","alt":"Vaihtoehtoinen teksti","border":"Kehys","btnUpload":"Lähetä palvelimelle","button2Img":"Haluatko muuntaa valitun kuvanäppäimen kuvaksi?","hSpace":"Vaakatila","img2Button":"Haluatko muuntaa valitun kuvan kuvanäppäimeksi?","infoTab":"Kuvan tiedot","linkTab":"Linkki","lockRatio":"Lukitse suhteet","menu":"Kuvan ominaisuudet","resetSize":"Alkuperäinen koko","title":"Kuvan ominaisuudet","titleButton":"Kuvapainikkeen ominaisuudet","upload":"Lisää kuva","urlMissing":"Kuvan lähdeosoite puuttuu.","vSpace":"Pystytila","validateBorder":"Kehyksen täytyy olla kokonaisluku.","validateHSpace":"HSpace-määrityksen täytyy olla kokonaisluku.","validateVSpace":"VSpace-määrityksen täytyy olla kokonaisluku."},"indent":{"indent":"Suurenna sisennystä","outdent":"Pienennä sisennystä"},"fakeobjects":{"anchor":"Ankkuri","flash":"Flash animaatio","hiddenfield":"Piilokenttä","iframe":"IFrame-kehys","unknown":"Tuntematon objekti"},"link":{"acccessKey":"Pikanäppäin","advanced":"Lisäominaisuudet","advisoryContentType":"Avustava sisällön tyyppi","advisoryTitle":"Avustava otsikko","anchor":{"toolbar":"Lisää ankkuri/muokkaa ankkuria","menu":"Ankkurin ominaisuudet","title":"Ankkurin ominaisuudet","name":"Nimi","errorName":"Ankkurille on kirjoitettava nimi","remove":"Poista ankkuri"},"anchorId":"Ankkurin ID:n mukaan","anchorName":"Ankkurin nimen mukaan","charset":"Linkitetty kirjaimisto","cssClasses":"Tyyliluokat","emailAddress":"Sähköpostiosoite","emailBody":"Viesti","emailSubject":"Aihe","id":"Tunniste","info":"Linkin tiedot","langCode":"Kielen suunta","langDir":"Kielen suunta","langDirLTR":"Vasemmalta oikealle (LTR)","langDirRTL":"Oikealta vasemmalle (RTL)","menu":"Muokkaa linkkiä","name":"Nimi","noAnchors":"(Ei ankkureita tässä dokumentissa)","noEmail":"Kirjoita sähköpostiosoite","noUrl":"Linkille on kirjoitettava URL","other":"<muu>","popupDependent":"Riippuva (Netscape)","popupFeatures":"Popup ikkunan ominaisuudet","popupFullScreen":"Täysi ikkuna (IE)","popupLeft":"Vasemmalta (px)","popupLocationBar":"Osoiterivi","popupMenuBar":"Valikkorivi","popupResizable":"Venytettävä","popupScrollBars":"Vierityspalkit","popupStatusBar":"Tilarivi","popupToolbar":"Vakiopainikkeet","popupTop":"Ylhäältä (px)","rel":"Suhde","selectAnchor":"Valitse ankkuri","styles":"Tyyli","tabIndex":"Tabulaattori indeksi","target":"Kohde","targetFrame":"<kehys>","targetFrameName":"Kohdekehyksen nimi","targetPopup":"<popup ikkuna>","targetPopupName":"Popup ikkunan nimi","title":"Linkki","toAnchor":"Ankkuri tässä sivussa","toEmail":"Sähköposti","toUrl":"Osoite","toolbar":"Lisää linkki/muokkaa linkkiä","type":"Linkkityyppi","unlink":"Poista linkki","upload":"Lisää tiedosto"},"list":{"bulletedlist":"Luettelomerkit","numberedlist":"Numerointi"},"magicline":{"title":"Lisää kappale tähän."},"maximize":{"maximize":"Suurenna","minimize":"Pienennä"},"pastetext":{"button":"Liitä tekstinä","title":"Liitä tekstinä"},"pastefromword":{"confirmCleanup":"Liittämäsi teksti näyttäisi olevan Word-dokumentista. Haluatko siivota sen ennen liittämistä? (Suositus: Kyllä)","error":"Liitetyn tiedon siivoaminen ei onnistunut sisäisen virheen takia","title":"Liitä Word-dokumentista","toolbar":"Liitä Word-dokumentista"},"removeformat":{"toolbar":"Poista muotoilu"},"sourcearea":{"toolbar":"Koodi"},"specialchar":{"options":"Erikoismerkin ominaisuudet","title":"Valitse erikoismerkki","toolbar":"Lisää erikoismerkki"},"scayt":{"about":"Tietoja oikoluvusta kirjoitetaessa","aboutTab":"Tietoa","addWord":"Lisää sana","allCaps":"Ohita sanat, jotka on kirjoitettu kokonaan isoilla kirjaimilla","dic_create":"Luo","dic_delete":"Poista","dic_field_name":"Sanakirjan nimi","dic_info":"Oletuksena sanakirjat tallennetaan evästeeseen, mutta evästeiden koko on kuitenkin rajallinen. Sanakirjan kasvaessa niin suureksi, ettei se enää mahdu evästeeseen, sanakirja täytyy tallentaa palvelimellemme. Tallentaaksesi sanakirjasi palvelimellemme tulee sinun antaa sille nimi. Jos olet jo tallentanut sanakirjan, anna sen nimi ja klikkaa Palauta-painiketta","dic_rename":"Nimeä uudelleen","dic_restore":"Palauta","dictionariesTab":"Sanakirjat","disable":"Poista käytöstä oikoluku kirjoitetaessa","emptyDic":"Sanakirjan nimi on annettava.","enable":"Ota käyttöön oikoluku kirjoitettaessa","ignore":"Ohita","ignoreAll":"Ohita kaikki","ignoreDomainNames":"Ohita verkkotunnukset","langs":"Kielet","languagesTab":"Kielet","mixedCase":"Ohita sanat, joissa on sekoitettu isoja ja pieniä kirjaimia","mixedWithDigits":"Ohita sanat, joissa on numeroita","moreSuggestions":"Lisää ehdotuksia","opera_title":"Opera ei tue tätä ominaisuutta","options":"Asetukset","optionsTab":"Asetukset","title":"Oikolue kirjoitettaessa","toggle":"Vaihda oikoluku kirjoittaessa tilaa","noSuggestions":"No suggestion"},"stylescombo":{"label":"Tyyli","panelTitle":"Muotoilujen tyylit","panelTitle1":"Lohkojen tyylit","panelTitle2":"Rivinsisäiset tyylit","panelTitle3":"Objektien tyylit"},"table":{"border":"Rajan paksuus","caption":"Otsikko","cell":{"menu":"Solu","insertBefore":"Lisää solu eteen","insertAfter":"Lisää solu perään","deleteCell":"Poista solut","merge":"Yhdistä solut","mergeRight":"Yhdistä oikealla olevan kanssa","mergeDown":"Yhdistä alla olevan kanssa","splitHorizontal":"Jaa solu vaakasuunnassa","splitVertical":"Jaa solu pystysuunnassa","title":"Solun ominaisuudet","cellType":"Solun tyyppi","rowSpan":"Rivin jatkuvuus","colSpan":"Solun jatkuvuus","wordWrap":"Rivitys","hAlign":"Horisontaali kohdistus","vAlign":"Vertikaali kohdistus","alignBaseline":"Alas (teksti)","bgColor":"Taustan väri","borderColor":"Reunan väri","data":"Data","header":"Ylätunniste","yes":"Kyllä","no":"Ei","invalidWidth":"Solun leveyden täytyy olla numero.","invalidHeight":"Solun korkeuden täytyy olla numero.","invalidRowSpan":"Rivin jatkuvuuden täytyy olla kokonaisluku.","invalidColSpan":"Solun jatkuvuuden täytyy olla kokonaisluku.","chooseColor":"Valitse"},"cellPad":"Solujen sisennys","cellSpace":"Solujen väli","column":{"menu":"Sarake","insertBefore":"Lisää sarake vasemmalle","insertAfter":"Lisää sarake oikealle","deleteColumn":"Poista sarakkeet"},"columns":"Sarakkeet","deleteTable":"Poista taulu","headers":"Ylätunnisteet","headersBoth":"Molemmat","headersColumn":"Ensimmäinen sarake","headersNone":"Ei","headersRow":"Ensimmäinen rivi","invalidBorder":"Reunan koon täytyy olla numero.","invalidCellPadding":"Solujen sisennyksen täytyy olla numero.","invalidCellSpacing":"Solujen välin täytyy olla numero.","invalidCols":"Sarakkeiden määrän täytyy olla suurempi kuin 0.","invalidHeight":"Taulun korkeuden täytyy olla numero.","invalidRows":"Rivien määrän täytyy olla suurempi kuin 0.","invalidWidth":"Taulun leveyden täytyy olla numero.","menu":"Taulun ominaisuudet","row":{"menu":"Rivi","insertBefore":"Lisää rivi yläpuolelle","insertAfter":"Lisää rivi alapuolelle","deleteRow":"Poista rivit"},"rows":"Rivit","summary":"Yhteenveto","title":"Taulun ominaisuudet","toolbar":"Taulu","widthPc":"prosenttia","widthPx":"pikseliä","widthUnit":"leveysyksikkö"},"undo":{"redo":"Toista","undo":"Kumoa"},"wsc":{"btnIgnore":"Jätä huomioimatta","btnIgnoreAll":"Jätä kaikki huomioimatta","btnReplace":"Korvaa","btnReplaceAll":"Korvaa kaikki","btnUndo":"Kumoa","changeTo":"Vaihda","errorLoading":"Virhe ladattaessa oikolukupalvelua isännältä: %s.","ieSpellDownload":"Oikeinkirjoituksen tarkistusta ei ole asennettu. Haluatko ladata sen nyt?","manyChanges":"Tarkistus valmis: %1 sanaa muutettiin","noChanges":"Tarkistus valmis: Yhtään sanaa ei muutettu","noMispell":"Tarkistus valmis: Ei virheitä","noSuggestions":"Ei ehdotuksia","notAvailable":"Valitettavasti oikoluku ei ole käytössä tällä hetkellä.","notInDic":"Ei sanakirjassa","oneChange":"Tarkistus valmis: Yksi sana muutettiin","progress":"Tarkistus käynnissä...","title":"Oikoluku","toolbar":"Tarkista oikeinkirjoitus"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/fo.js b/theme/bootstrap/plugins/ckeditor/lang/fo.js new file mode 100644 index 0000000..7f618f0 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/fo.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['fo']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Trýst ALT og 0 fyri vegleiðing","browseServer":"Ambætarakagi","url":"URL","protocol":"Protokoll","upload":"Send til ambætaran","uploadSubmit":"Send til ambætaran","image":"Myndir","flash":"Flash","form":"Formur","checkbox":"Flugubein","radio":"Radioknøttur","textField":"Tekstteigur","textarea":"Tekstumráði","hiddenField":"Fjaldur teigur","button":"Knøttur","select":"Valskrá","imageButton":"Myndaknøttur","notSet":"<ikki sett>","id":"Id","name":"Navn","langDir":"Tekstkós","langDirLtr":"Frá vinstru til høgru (LTR)","langDirRtl":"Frá høgru til vinstru (RTL)","langCode":"Málkoda","longDescr":"Víðkað URL frágreiðing","cssClass":"Typografi klassar","advisoryTitle":"Vegleiðandi heiti","cssStyle":"Typografi","ok":"Góðkent","cancel":"Avlýst","close":"Lat aftur","preview":"Frumsýn","resize":"Drag fyri at broyta stødd","generalTab":"Generelt","advancedTab":"Fjølbroytt","validateNumberFailed":"Hetta er ikki eitt tal.","confirmNewPage":"Allar ikki goymdar broytingar í hesum innihaldið hvørva. Skal nýggj síða lesast kortini?","confirmCancel":"Nakrir valmøguleikar eru broyttir. Ert tú vísur í, at dialogurin skal latast aftur?","options":"Options","target":"Target","targetNew":"Nýtt vindeyga (_blank)","targetTop":"Vindeyga ovast (_top)","targetSelf":"Sama vindeyga (_self)","targetParent":"Upphavligt vindeyga (_parent)","langDirLTR":"Frá vinstru til høgru (LTR)","langDirRTL":"Frá høgru til vinstru (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Breidd","height":"Hædd","align":"Justering","alignLeft":"Vinstra","alignRight":"Høgra","alignCenter":"Miðsett","alignTop":"Ovast","alignMiddle":"Miðja","alignBottom":"Botnur","invalidValue":"Invalid value.","invalidHeight":"Hædd má vera eitt tal.","invalidWidth":"Breidd má vera eitt tal.","invalidCssLength":"Virðið sett í \"%1\" feltið má vera eitt positivt tal, við ella uttan gyldugum CSS mátieind (px, %, in, cm, mm, em, ex, pt, ella pc).","invalidHtmlLength":"Virðið sett í \"%1\" feltiðield má vera eitt positivt tal, við ella uttan gyldugum CSS mátieind (px ella %).","invalidInlineStyle":"Virði specifiserað fyri inline style má hava eitt ella fleiri pør (tuples) skrivað sum \"name : value\", hvørt parið sundurskilt við semi-colon.","cssLengthTooltip":"Skriva eitt tal fyri eitt virði í pixels ella eitt tal við gyldigum CSS eind (px, %, in, cm, mm, em, ex, pt, ella pc).","unavailable":"%1<span class=\"cke_accessibility\">, ikki tøkt</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"Um CKEditor","help":"Kekka $1 fyri hjálp.","moreInfo":"Licens upplýsingar finnast á heimasíðu okkara:","title":"Um CKEditor","userGuide":"CKEditor Brúkaravegleiðing"},"basicstyles":{"bold":"Feit skrift","italic":"Skráskrift","strike":"Yvirstrikað","subscript":"Lækkað skrift","superscript":"Hækkað skrift","underline":"Undirstrikað"},"blockquote":{"toolbar":"Blockquote"},"clipboard":{"copy":"Avrita","copyError":"Trygdaruppseting alnótskagans forðar tekstviðgeranum í at avrita tekstin. Vinarliga nýt knappaborðið til at avrita tekstin (Ctrl/Cmd+C).","cut":"Kvett","cutError":"Trygdaruppseting alnótskagans forðar tekstviðgeranum í at kvetta tekstin. Vinarliga nýt knappaborðið til at kvetta tekstin (Ctrl/Cmd+X).","paste":"Innrita","pasteArea":"Avritingarumráði","pasteMsg":"Vinarliga koyr tekstin í hendan rútin við knappaborðinum (<strong>Ctrl/Cmd+V</strong>) og klikk á <strong>Góðtak</strong>.","securityMsg":"Trygdaruppseting alnótskagans forðar tekstviðgeranum í beinleiðis atgongd til avritingarminnið. Tygum mugu royna aftur í hesum rútinum.","title":"Innrita"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Lat Toolbar aftur","toolbarExpand":"Vís Toolbar","toolbarGroups":{"document":"Dokument","clipboard":"Clipboard/Undo","editing":"Editering","forms":"Formar","basicstyles":"Grundleggjandi Styles","paragraph":"Reglubrot","links":"Leinkjur","insert":"Set inn","styles":"Styles","colors":"Litir","tools":"Tól"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Slóð til elementir","eleTitle":"%1 element"},"format":{"label":"Skriftsnið","panelTitle":"Skriftsnið","tag_address":"Adressa","tag_div":"Vanligt (DIV)","tag_h1":"Yvirskrift 1","tag_h2":"Yvirskrift 2","tag_h3":"Yvirskrift 3","tag_h4":"Yvirskrift 4","tag_h5":"Yvirskrift 5","tag_h6":"Yvirskrift 6","tag_p":"Vanligt","tag_pre":"Sniðgivið"},"horizontalrule":{"toolbar":"Ger vatnrætta linju"},"image":{"alertUrl":"Rita slóðina til myndina","alt":"Alternativur tekstur","border":"Bordi","btnUpload":"Send til ambætaran","button2Img":"Skal valdi myndaknøttur gerast til vanliga mynd?","hSpace":"Høgri breddi","img2Button":"Skal valda mynd gerast til myndaknøtt?","infoTab":"Myndaupplýsingar","linkTab":"Tilknýti","lockRatio":"Læs lutfallið","menu":"Myndaeginleikar","resetSize":"Upprunastødd","title":"Myndaeginleikar","titleButton":"Eginleikar fyri myndaknøtt","upload":"Send","urlMissing":"URL til mynd manglar.","vSpace":"Vinstri breddi","validateBorder":"Bordi má vera eitt heiltal.","validateHSpace":"HSpace má vera eitt heiltal.","validateVSpace":"VSpace má vera eitt heiltal."},"indent":{"indent":"Økja reglubrotarinntriv","outdent":"Minka reglubrotarinntriv"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Fjaldur teigur","iframe":"IFrame","unknown":"Ókent Object"},"link":{"acccessKey":"Snarvegisknöttur","advanced":"Fjølbroytt","advisoryContentType":"Vegleiðandi innihaldsslag","advisoryTitle":"Vegleiðandi heiti","anchor":{"toolbar":"Ger/broyt marknastein","menu":"Eginleikar fyri marknastein","title":"Eginleikar fyri marknastein","name":"Heiti marknasteinsins","errorName":"Vinarliga rita marknasteinsins heiti","remove":"Strika marknastein"},"anchorId":"Eftir element Id","anchorName":"Eftir navni á marknasteini","charset":"Atknýtt teknsett","cssClasses":"Typografi klassar","emailAddress":"Teldupost-adressa","emailBody":"Breyðtekstur","emailSubject":"Evni","id":"Id","info":"Tilknýtis upplýsingar","langCode":"Tekstkós","langDir":"Tekstkós","langDirLTR":"Frá vinstru til høgru (LTR)","langDirRTL":"Frá høgru til vinstru (RTL)","menu":"Broyt tilknýti","name":"Navn","noAnchors":"(Eingir marknasteinar eru í hesum dokumentið)","noEmail":"Vinarliga skriva teldupost-adressu","noUrl":"Vinarliga skriva tilknýti (URL)","other":"<annað>","popupDependent":"Bundið (Netscape)","popupFeatures":"Popup vindeygans víðkaðu eginleikar","popupFullScreen":"Fullur skermur (IE)","popupLeft":"Frástøða frá vinstru","popupLocationBar":"Adressulinja","popupMenuBar":"Skrábjálki","popupResizable":"Stødd kann broytast","popupScrollBars":"Rullibjálki","popupStatusBar":"Støðufrágreiðingarbjálki","popupToolbar":"Amboðsbjálki","popupTop":"Frástøða frá íerva","rel":"Relatión","selectAnchor":"Vel ein marknastein","styles":"Typografi","tabIndex":"Tabulator indeks","target":"Target","targetFrame":"<ramma>","targetFrameName":"Vís navn vindeygans","targetPopup":"<popup vindeyga>","targetPopupName":"Popup vindeygans navn","title":"Tilknýti","toAnchor":"Tilknýti til marknastein í tekstinum","toEmail":"Teldupostur","toUrl":"URL","toolbar":"Ger/broyt tilknýti","type":"Tilknýtisslag","unlink":"Strika tilknýti","upload":"Send til ambætaran"},"list":{"bulletedlist":"Punktmerktur listi","numberedlist":"Talmerktur listi"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maksimera","minimize":"Minimera"},"pastetext":{"button":"Innrita som reinan tekst","title":"Innrita som reinan tekst"},"pastefromword":{"confirmCleanup":"Teksturin, tú roynir at seta inn, sýnist at stava frá Word. Skal teksturin reinsast fyrst?","error":"Tað eydnaðist ikki at reinsa tekstin vegna ein internan feil","title":"Innrita frá Word","toolbar":"Innrita frá Word"},"removeformat":{"toolbar":"Strika sniðgeving"},"sourcearea":{"toolbar":"Kelda"},"specialchar":{"options":"Møguleikar við serteknum","title":"Vel sertekn","toolbar":"Set inn sertekn"},"scayt":{"about":"Um SCAYT","aboutTab":"Um","addWord":"Legg orð afturat","allCaps":"Loyp orð við bert stórum stavum um","dic_create":"Upprætta nýggja","dic_delete":"Strika","dic_field_name":"Orðabókanavn","dic_info":"Upprunaliga er brúkara-orðabókin goymd í eini cookie í tínum egna kaga. Men hesar cookies eru avmarkaðar í stødd. Tá brúkara-orðabókin veksur seg ov stóra til eina cookie, so er møguligt at goyma hana á ambætara okkara. Fyri at goyma persónligu orðabókina á ambætaranum eigur tú at velja eitt navn til tína skuffu. Hevur tú longu goymt eina orðabók, so vinarliga skriva navnið og klikk á knøttin Endurskapa.","dic_rename":"Broyt","dic_restore":"Endurskapa","dictionariesTab":"Orðabøkur","disable":"Nokta SCAYT","emptyDic":"Heiti á orðabók eigur ikki at vera tómt.","enable":"Loyv SCAYT","ignore":"Ignorera","ignoreAll":"Ignorera alt","ignoreDomainNames":"loyp økisnøvn um","langs":"Tungumál","languagesTab":"Tungumál","mixedCase":"Loyp orð við blandaðum smáum og stórum stavum um","mixedWithDigits":"Loyp orð við tølum um","moreSuggestions":"Fleiri tilráðingar","opera_title":"Ikki stuðlað í Opera","options":"Uppseting","optionsTab":"Uppseting","title":"Kanna stavseting, meðan tú skrivar","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Typografi","panelTitle":"Formatterings stílir","panelTitle1":"Blokk stílir","panelTitle2":"Inline stílir","panelTitle3":"Object stílir"},"table":{"border":"Bordabreidd","caption":"Tabellfrágreiðing","cell":{"menu":"Meski","insertBefore":"Set meska inn áðrenn","insertAfter":"Set meska inn aftaná","deleteCell":"Strika meskar","merge":"Flætta meskar","mergeRight":"Flætta meskar til høgru","mergeDown":"Flætta saman","splitHorizontal":"Kloyv meska vatnrætt","splitVertical":"Kloyv meska loddrætt","title":"Mesku eginleikar","cellType":"Mesku slag","rowSpan":"Ræð spenni","colSpan":"Kolonnu spenni","wordWrap":"Orðkloyving","hAlign":"Horisontal plasering","vAlign":"Loddrøtt plasering","alignBaseline":"Basislinja","bgColor":"Bakgrundslitur","borderColor":"Bordalitur","data":"Data","header":"Header","yes":"Ja","no":"Nei","invalidWidth":"Meskubreidd má vera eitt tal.","invalidHeight":"Meskuhædd má vera eitt tal.","invalidRowSpan":"Raðspennið má vera eitt heiltal.","invalidColSpan":"Kolonnuspennið má vera eitt heiltal.","chooseColor":"Vel"},"cellPad":"Meskubreddi","cellSpace":"Fjarstøða millum meskar","column":{"menu":"Kolonna","insertBefore":"Set kolonnu inn áðrenn","insertAfter":"Set kolonnu inn aftaná","deleteColumn":"Strika kolonnur"},"columns":"Kolonnur","deleteTable":"Strika tabell","headers":"Yvirskriftir","headersBoth":"Báðir","headersColumn":"Fyrsta kolonna","headersNone":"Eingin","headersRow":"Fyrsta rað","invalidBorder":"Borda-stødd má vera eitt tal.","invalidCellPadding":"Cell padding má vera eitt tal.","invalidCellSpacing":"Cell spacing má vera eitt tal.","invalidCols":"Talið av kolonnum má vera eitt tal størri enn 0.","invalidHeight":"Tabell-hædd má vera eitt tal.","invalidRows":"Talið av røðum má vera eitt tal størri enn 0.","invalidWidth":"Tabell-breidd má vera eitt tal.","menu":"Eginleikar fyri tabell","row":{"menu":"Rað","insertBefore":"Set rað inn áðrenn","insertAfter":"Set rað inn aftaná","deleteRow":"Strika røðir"},"rows":"Røðir","summary":"Samandráttur","title":"Eginleikar fyri tabell","toolbar":"Tabell","widthPc":"prosent","widthPx":"pixels","widthUnit":"breiddar unit"},"undo":{"redo":"Vend aftur","undo":"Angra"},"wsc":{"btnIgnore":"Forfjóna","btnIgnoreAll":"Forfjóna alt","btnReplace":"Yvirskriva","btnReplaceAll":"Yvirskriva alt","btnUndo":"Angra","changeTo":"Broyt til","errorLoading":"Feilur við innlesing av application service host: %s.","ieSpellDownload":"Rættstavarin er ikki tøkur í tekstviðgeranum. Vilt tú heinta hann nú?","manyChanges":"Rættstavarin liðugur: %1 orð broytt","noChanges":"Rættstavarin liðugur: Einki orð varð broytt","noMispell":"Rættstavarin liðugur: Eingin feilur funnin","noSuggestions":"- Einki uppskot -","notAvailable":"Tíverri, ikki tøkt í løtuni.","notInDic":"Finst ikki í orðabókini","oneChange":"Rættstavarin liðugur: Eitt orð er broytt","progress":"Rættstavarin arbeiðir...","title":"Kanna stavseting","toolbar":"Kanna stavseting"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/fr-ca.js b/theme/bootstrap/plugins/ckeditor/lang/fr-ca.js new file mode 100644 index 0000000..5662623 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/fr-ca.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['fr-ca']={"editor":"Éditeur de texte enrichi","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Appuyez sur 0 pour de l'aide","browseServer":"Parcourir le serveur","url":"URL","protocol":"Protocole","upload":"Envoyer","uploadSubmit":"Envoyer au serveur","image":"Image","flash":"Animation Flash","form":"Formulaire","checkbox":"Case à cocher","radio":"Bouton radio","textField":"Champ texte","textarea":"Zone de texte","hiddenField":"Champ caché","button":"Bouton","select":"Liste déroulante","imageButton":"Bouton image","notSet":"<Par défaut>","id":"Id","name":"Nom","langDir":"Sens d'écriture","langDirLtr":"De gauche à droite (LTR)","langDirRtl":"De droite à gauche (RTL)","langCode":"Code langue","longDescr":"URL de description longue","cssClass":"Classes CSS","advisoryTitle":"Titre","cssStyle":"Style","ok":"OK","cancel":"Annuler","close":"Fermer","preview":"Aperçu","resize":"Redimensionner","generalTab":"Général","advancedTab":"Avancé","validateNumberFailed":"Cette valeur n'est pas un nombre.","confirmNewPage":"Les changements non sauvegardés seront perdus. Êtes-vous certain de vouloir charger une nouvelle page?","confirmCancel":"Certaines options ont été modifiées. Êtes-vous certain de vouloir fermer?","options":"Options","target":"Cible","targetNew":"Nouvelle fenêtre (_blank)","targetTop":"Fenêtre supérieur (_top)","targetSelf":"Cette fenêtre (_self)","targetParent":"Fenêtre parent (_parent)","langDirLTR":"De gauche à droite (LTR)","langDirRTL":"De droite à gauche (RTL)","styles":"Style","cssClasses":"Classe CSS","width":"Largeur","height":"Hauteur","align":"Alignement","alignLeft":"Gauche","alignRight":"Droite","alignCenter":"Centré","alignTop":"Haut","alignMiddle":"Milieu","alignBottom":"Bas","invalidValue":"Valeur invalide.","invalidHeight":"La hauteur doit être un nombre.","invalidWidth":"La largeur doit être un nombre.","invalidCssLength":"La valeur spécifiée pour le champ \"%1\" doit être un nombre positif avec ou sans unité de mesure CSS valide (px, %, in, cm, mm, em, ex, pt, ou pc).","invalidHtmlLength":"La valeur spécifiée pour le champ \"%1\" doit être un nombre positif avec ou sans unité de mesure HTML valide (px ou %).","invalidInlineStyle":"La valeur spécifiée pour le style intégré doit être composée d'un ou plusieurs couples de valeur au format \"nom : valeur\", separés par des points-virgules.","cssLengthTooltip":"Entrer un nombre pour la valeur en pixel ou un nombre avec une unité CSS valide (px, %, in, cm, mm, em, ex, pt, ou pc).","unavailable":"%1<span class=\"cke_accessibility\">, indisponible</span>"},"about":{"copy":"Copyright &copy; $1. Tous droits réservés.","dlgTitle":"À propos de CKEditor","help":"Consulter $1 pour l'aide.","moreInfo":"Pour les informations de licence, consulter notre site internet:","title":"À propos de CKEditor","userGuide":"Guide utilisateur de CKEditor"},"basicstyles":{"bold":"Gras","italic":"Italique","strike":"Barré","subscript":"Indice","superscript":"Exposant","underline":"Souligné"},"blockquote":{"toolbar":"Citation"},"clipboard":{"copy":"Copier","copyError":"Les paramètres de sécurité de votre navigateur empêchent l'éditeur de copier automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl/Cmd+C).","cut":"Couper","cutError":"Les paramètres de sécurité de votre navigateur empêchent l'éditeur de couper automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl/Cmd+X).","paste":"Coller","pasteArea":"Coller la zone","pasteMsg":"Veuillez coller dans la zone ci-dessous en utilisant le clavier (<STRONG>Ctrl/Cmd+V</STRONG>) et appuyer sur <STRONG>OK</STRONG>.","securityMsg":"A cause des paramètres de sécurité de votre navigateur, l'éditeur ne peut accéder au presse-papier directement. Vous devez coller à nouveau le contenu dans cette fenêtre.","title":"Coller"},"contextmenu":{"options":"Options du menu contextuel"},"toolbar":{"toolbarCollapse":"Enrouler la barre d'outils","toolbarExpand":"Dérouler la barre d'outils","toolbarGroups":{"document":"Document","clipboard":"Presse papier/Annuler","editing":"Édition","forms":"Formulaires","basicstyles":"Styles de base","paragraph":"Paragraphe","links":"Liens","insert":"Insérer","styles":"Styles","colors":"Couleurs","tools":"Outils"},"toolbars":"Barre d'outils de l'éditeur"},"elementspath":{"eleLabel":"Chemin d'éléments","eleTitle":"element %1"},"format":{"label":"Format","panelTitle":"Format de paragraphe","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"En-tête 1","tag_h2":"En-tête 2","tag_h3":"En-tête 3","tag_h4":"En-tête 4","tag_h5":"En-tête 5","tag_h6":"En-tête 6","tag_p":"Normal","tag_pre":"Formaté"},"horizontalrule":{"toolbar":"Insérer un séparateur horizontale"},"image":{"alertUrl":"Veuillez saisir l'URL de l'image","alt":"Texte alternatif","border":"Bordure","btnUpload":"Envoyer sur le serveur","button2Img":"Désirez-vous transformer l'image sélectionnée en image simple?","hSpace":"Espacement horizontal","img2Button":"Désirez-vous transformer l'image sélectionnée en bouton image?","infoTab":"Informations sur l'image","linkTab":"Lien","lockRatio":"Verrouiller les proportions","menu":"Propriétés de l'image","resetSize":"Taille originale","title":"Propriétés de l'image","titleButton":"Propriétés du bouton image","upload":"Téléverser","urlMissing":"L'URL de la source de l'image est manquant.","vSpace":"Espacement vertical","validateBorder":"La bordure doit être un entier.","validateHSpace":"L'espacement horizontal doit être un entier.","validateVSpace":"L'espacement vertical doit être un entier."},"indent":{"indent":"Augmenter le retrait","outdent":"Diminuer le retrait"},"fakeobjects":{"anchor":"Ancre","flash":"Animation Flash","hiddenfield":"Champ caché","iframe":"IFrame","unknown":"Objet inconnu"},"link":{"acccessKey":"Touche d'accessibilité","advanced":"Avancé","advisoryContentType":"Type de contenu","advisoryTitle":"Description","anchor":{"toolbar":"Ancre","menu":"Modifier l'ancre","title":"Propriétés de l'ancre","name":"Nom de l'ancre","errorName":"Veuillez saisir le nom de l'ancre","remove":"Supprimer l'ancre"},"anchorId":"Par ID","anchorName":"Par nom","charset":"Encodage de la cible","cssClasses":"Classes CSS","emailAddress":"Courriel","emailBody":"Corps du message","emailSubject":"Objet du message","id":"ID","info":"Informations sur le lien","langCode":"Code de langue","langDir":"Sens d'écriture","langDirLTR":"De gauche à droite (LTR)","langDirRTL":"De droite à gauche (RTL)","menu":"Modifier le lien","name":"Nom","noAnchors":"(Pas d'ancre disponible dans le document)","noEmail":"Veuillez saisir le courriel","noUrl":"Veuillez saisir l'URL","other":"<autre>","popupDependent":"Dépendante (Netscape)","popupFeatures":"Caractéristiques de la fenêtre popup","popupFullScreen":"Plein écran (IE)","popupLeft":"Position de la gauche","popupLocationBar":"Barre d'adresse","popupMenuBar":"Barre de menu","popupResizable":"Redimensionnable","popupScrollBars":"Barres de défilement","popupStatusBar":"Barre d'état","popupToolbar":"Barre d'outils","popupTop":"Position à partir du haut","rel":"Relation","selectAnchor":"Sélectionner une ancre","styles":"Style","tabIndex":"Ordre de tabulation","target":"Destination","targetFrame":"<Cadre>","targetFrameName":"Nom du cadre de destination","targetPopup":"<fenêtre popup>","targetPopupName":"Nom de la fenêtre popup","title":"Lien","toAnchor":"Ancre dans cette page","toEmail":"Courriel","toUrl":"URL","toolbar":"Lien","type":"Type de lien","unlink":"Supprimer le lien","upload":"Téléverser"},"list":{"bulletedlist":"Liste à puces","numberedlist":"Liste numérotée"},"magicline":{"title":"Insérer le paragraphe ici"},"maximize":{"maximize":"Maximizer","minimize":"Minimizer"},"pastetext":{"button":"Coller comme texte","title":"Coller comme texte"},"pastefromword":{"confirmCleanup":"Le texte que vous tentez de coller semble provenir de Word. Désirez vous le nettoyer avant de coller?","error":"Il n'a pas été possible de nettoyer les données collées du à une erreur interne","title":"Coller de Word","toolbar":"Coller de Word"},"removeformat":{"toolbar":"Supprimer le formatage"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Option des caractères spéciaux","title":"Sélectionner un caractère spécial","toolbar":"Insérer un caractère spécial"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styles","panelTitle":"Styles de formattage","panelTitle1":"Styles de block","panelTitle2":"Styles en ligne","panelTitle3":"Styles d'objet"},"table":{"border":"Taille de la bordure","caption":"Titre","cell":{"menu":"Cellule","insertBefore":"Insérer une cellule avant","insertAfter":"Insérer une cellule après","deleteCell":"Supprimer des cellules","merge":"Fusionner les cellules","mergeRight":"Fusionner à droite","mergeDown":"Fusionner en bas","splitHorizontal":"Scinder la cellule horizontalement","splitVertical":"Scinder la cellule verticalement","title":"Propriétés de la cellule","cellType":"Type de cellule","rowSpan":"Fusion de lignes","colSpan":"Fusion de colonnes","wordWrap":"Retour à la ligne","hAlign":"Alignement horizontal","vAlign":"Alignement vertical","alignBaseline":"Bas du texte","bgColor":"Couleur d'arrière plan","borderColor":"Couleur de bordure","data":"Données","header":"En-tête","yes":"Oui","no":"Non","invalidWidth":"La largeur de cellule doit être un nombre.","invalidHeight":"La hauteur de cellule doit être un nombre.","invalidRowSpan":"La fusion de lignes doit être un nombre entier.","invalidColSpan":"La fusion de colonnes doit être un nombre entier.","chooseColor":"Sélectionner"},"cellPad":"Marge interne des cellules","cellSpace":"Espacement des cellules","column":{"menu":"Colonne","insertBefore":"Insérer une colonne avant","insertAfter":"Insérer une colonne après","deleteColumn":"Supprimer des colonnes"},"columns":"Colonnes","deleteTable":"Supprimer le tableau","headers":"En-têtes","headersBoth":"Les deux.","headersColumn":"Première colonne","headersNone":"Aucun","headersRow":"Première ligne","invalidBorder":"La taille de bordure doit être un nombre.","invalidCellPadding":"La marge interne des cellules doit être un nombre positif.","invalidCellSpacing":"L'espacement des cellules doit être un nombre positif.","invalidCols":"Le nombre de colonnes doit être supérieur à 0.","invalidHeight":"La hauteur du tableau doit être un nombre.","invalidRows":"Le nombre de lignes doit être supérieur à 0.","invalidWidth":"La largeur du tableau doit être un nombre.","menu":"Propriétés du tableau","row":{"menu":"Ligne","insertBefore":"Insérer une ligne avant","insertAfter":"Insérer une ligne après","deleteRow":"Supprimer des lignes"},"rows":"Lignes","summary":"Résumé","title":"Propriétés du tableau","toolbar":"Tableau","widthPc":"pourcentage","widthPx":"pixels","widthUnit":"unité de largeur"},"undo":{"redo":"Refaire","undo":"Annuler"},"wsc":{"btnIgnore":"Ignorer","btnIgnoreAll":"Ignorer tout","btnReplace":"Remplacer","btnReplaceAll":"Remplacer tout","btnUndo":"Annuler","changeTo":"Changer en","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Le Correcteur d'orthographe n'est pas installé. Souhaitez-vous le télécharger maintenant?","manyChanges":"Vérification d'orthographe terminée: %1 mots modifiés","noChanges":"Vérification d'orthographe terminée: Pas de modifications","noMispell":"Vérification d'orthographe terminée: pas d'erreur trouvée","noSuggestions":"- Pas de suggestion -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Pas dans le dictionnaire","oneChange":"Vérification d'orthographe terminée: Un mot modifié","progress":"Vérification d'orthographe en cours...","title":"Spell Check","toolbar":"Orthographe"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/fr.js b/theme/bootstrap/plugins/ckeditor/lang/fr.js new file mode 100644 index 0000000..653083b --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/fr.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['fr']={"editor":"Éditeur de Texte Enrichi","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Appuyez sur ALT-0 pour l'aide","browseServer":"Explorer le serveur","url":"URL","protocol":"Protocole","upload":"Envoyer","uploadSubmit":"Envoyer sur le serveur","image":"Image","flash":"Flash","form":"Formulaire","checkbox":"Case à cocher","radio":"Bouton Radio","textField":"Champ texte","textarea":"Zone de texte","hiddenField":"Champ caché","button":"Bouton","select":"Liste déroulante","imageButton":"Bouton image","notSet":"<non défini>","id":"Id","name":"Nom","langDir":"Sens d'écriture","langDirLtr":"Gauche à droite (LTR)","langDirRtl":"Droite à gauche (RTL)","langCode":"Code de langue","longDescr":"URL de description longue (longdesc => malvoyant)","cssClass":"Classe CSS","advisoryTitle":"Description (title)","cssStyle":"Style","ok":"OK","cancel":"Annuler","close":"Fermer","preview":"Aperçu","resize":"Déplacer pour modifier la taille","generalTab":"Général","advancedTab":"Avancé","validateNumberFailed":"Cette valeur n'est pas un nombre.","confirmNewPage":"Les changements non sauvegardés seront perdus. Êtes-vous sûr de vouloir charger une nouvelle page?","confirmCancel":"Certaines options ont été modifiées. Êtes-vous sûr de vouloir fermer?","options":"Options","target":"Cible (Target)","targetNew":"Nouvelle fenêtre (_blank)","targetTop":"Fenêtre supérieure (_top)","targetSelf":"Même fenêtre (_self)","targetParent":"Fenêtre parent (_parent)","langDirLTR":"Gauche à Droite (LTR)","langDirRTL":"Droite à Gauche (RTL)","styles":"Style","cssClasses":"Classes de style","width":"Largeur","height":"Hauteur","align":"Alignement","alignLeft":"Gauche","alignRight":"Droite","alignCenter":"Centré","alignTop":"Haut","alignMiddle":"Milieu","alignBottom":"Bas","invalidValue":"Valeur incorrecte.","invalidHeight":"La hauteur doit être un nombre.","invalidWidth":"La largeur doit être un nombre.","invalidCssLength":"La valeur spécifiée pour le champ \"%1\" doit être un nombre positif avec ou sans unité de mesure CSS valide (px, %, in, cm, mm, em, ex, pt, ou pc).","invalidHtmlLength":"La valeur spécifiée pour le champ \"%1\" doit être un nombre positif avec ou sans unité de mesure HTML valide (px ou %).","invalidInlineStyle":"La valeur spécifiée pour le style inline doit être composée d'un ou plusieurs couples de valeur au format \"nom : valeur\", separés par des points-virgules.","cssLengthTooltip":"Entrer un nombre pour une valeur en pixels ou un nombre avec une unité de mesure CSS valide (px, %, in, cm, mm, em, ex, pt, ou pc).","unavailable":"%1<span class=\"cke_accessibility\">, Indisponible</span>"},"about":{"copy":"Copyright &copy; $1. Tous droits réservés.","dlgTitle":"À propos de CKEditor","help":"Consulter $1 pour l'aide.","moreInfo":"Pour les informations de licence, veuillez visiter notre site web:","title":"À propos de CKEditor","userGuide":"Guide de l'utilisateur CKEditor en anglais"},"basicstyles":{"bold":"Gras","italic":"Italique","strike":"Barré","subscript":"Indice","superscript":"Exposant","underline":"Souligné"},"blockquote":{"toolbar":"Citation"},"clipboard":{"copy":"Copier","copyError":"Les paramètres de sécurité de votre navigateur ne permettent pas à l'éditeur d'exécuter automatiquement des opérations de copie. Veuillez utiliser le raccourci clavier (Ctrl/Cmd+C).","cut":"Couper","cutError":"Les paramètres de sécurité de votre navigateur ne permettent pas à l'éditeur d'exécuter automatiquement l'opération \"couper\". Veuillez utiliser le raccourci clavier (Ctrl/Cmd+X).","paste":"Coller","pasteArea":"Coller la zone","pasteMsg":"Veuillez coller le texte dans la zone suivante en utilisant le raccourci clavier (<strong>Ctrl/Cmd+V</strong>) et cliquez sur OK.","securityMsg":"A cause des paramètres de sécurité de votre navigateur, l'éditeur n'est pas en mesure d'accéder directement à vos données contenues dans le presse-papier. Vous devriez réessayer de coller les données dans la fenêtre.","title":"Coller"},"contextmenu":{"options":"Options du menu contextuel"},"toolbar":{"toolbarCollapse":"Enrouler la barre d'outils","toolbarExpand":"Dérouler la barre d'outils","toolbarGroups":{"document":"Document","clipboard":"Presse-papier/Défaire","editing":"Editer","forms":"Formulaires","basicstyles":"Styles de base","paragraph":"Paragraphe","links":"Liens","insert":"Insérer","styles":"Styles","colors":"Couleurs","tools":"Outils"},"toolbars":"Barre d'outils de l'éditeur"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 éléments"},"format":{"label":"Format","panelTitle":"Format de paragraphe","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"Titre 1","tag_h2":"Titre 2","tag_h3":"Titre 3","tag_h4":"Titre 4","tag_h5":"Titre 5","tag_h6":"Titre 6","tag_p":"Normal","tag_pre":"Formaté"},"horizontalrule":{"toolbar":"Ligne horizontale"},"image":{"alertUrl":"Veuillez entrer l'adresse de l'image","alt":"Texte de remplacement","border":"Bordure","btnUpload":"Envoyer sur le serveur","button2Img":"Voulez-vous transformer le bouton image sélectionné en simple image?","hSpace":"Espacement horizontal","img2Button":"Voulez-vous transformer l'image en bouton image?","infoTab":"Informations sur l'image","linkTab":"Lien","lockRatio":"Conserver les proportions","menu":"Propriétés de l'image","resetSize":"Taille d'origine","title":"Propriétés de l'image","titleButton":"Propriétés du bouton image","upload":"Envoyer","urlMissing":"L'adresse source de l'image est manquante.","vSpace":"Espacement vertical","validateBorder":"Bordure doit être un entier.","validateHSpace":"HSpace doit être un entier.","validateVSpace":"VSpace doit être un entier."},"indent":{"indent":"Augmenter le retrait (tabulation)","outdent":"Diminuer le retrait (tabulation)"},"fakeobjects":{"anchor":"Ancre","flash":"Animation Flash","hiddenfield":"Champ caché","iframe":"IFrame","unknown":"Objet inconnu"},"link":{"acccessKey":"Touche d'accessibilité","advanced":"Avancé","advisoryContentType":"Type de contenu (ex: text/html)","advisoryTitle":"Description (title)","anchor":{"toolbar":"Ancre","menu":"Editer l'ancre","title":"Propriétés de l'ancre","name":"Nom de l'ancre","errorName":"Veuillez entrer le nom de l'ancre.","remove":"Supprimer l'ancre"},"anchorId":"Par ID d'élément","anchorName":"Par nom d'ancre","charset":"Charset de la cible","cssClasses":"Classe CSS","emailAddress":"Adresse E-Mail","emailBody":"Corps du message","emailSubject":"Sujet du message","id":"Id","info":"Infos sur le lien","langCode":"Code de langue","langDir":"Sens d'écriture","langDirLTR":"Gauche à droite","langDirRTL":"Droite à gauche","menu":"Editer le lien","name":"Nom","noAnchors":"(Aucune ancre disponible dans ce document)","noEmail":"Veuillez entrer l'adresse e-mail","noUrl":"Veuillez entrer l'adresse du lien","other":"<autre>","popupDependent":"Dépendante (Netscape)","popupFeatures":"Options de la fenêtre popup","popupFullScreen":"Plein écran (IE)","popupLeft":"Position gauche","popupLocationBar":"Barre d'adresse","popupMenuBar":"Barre de menu","popupResizable":"Redimensionnable","popupScrollBars":"Barres de défilement","popupStatusBar":"Barre de status","popupToolbar":"Barre d'outils","popupTop":"Position haute","rel":"Relation","selectAnchor":"Sélectionner l'ancre","styles":"Style","tabIndex":"Index de tabulation","target":"Cible","targetFrame":"<cadre>","targetFrameName":"Nom du Cadre destination","targetPopup":"<fenêtre popup>","targetPopupName":"Nom de la fenêtre popup","title":"Lien","toAnchor":"Transformer le lien en ancre dans le texte","toEmail":"E-mail","toUrl":"URL","toolbar":"Lien","type":"Type de lien","unlink":"Supprimer le lien","upload":"Envoyer"},"list":{"bulletedlist":"Insérer/Supprimer la liste à puces","numberedlist":"Insérer/Supprimer la liste numérotée"},"magicline":{"title":"Insérez un paragraphe ici"},"maximize":{"maximize":"Agrandir","minimize":"Minimiser"},"pastetext":{"button":"Coller comme texte sans mise en forme","title":"Coller comme texte sans mise en forme"},"pastefromword":{"confirmCleanup":"Le texte à coller semble provenir de Word. Désirez-vous le nettoyer avant de coller?","error":"Il n'a pas été possible de nettoyer les données collées à la suite d'une erreur interne.","title":"Coller depuis Word","toolbar":"Coller depuis Word"},"removeformat":{"toolbar":"Supprimer la mise en forme"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Options des caractères spéciaux","title":"Sélectionnez un caractère","toolbar":"Insérer un caractère spécial"},"scayt":{"about":"A propos de SCAYT","aboutTab":"À propos de","addWord":"Ajouter le mot","allCaps":"Ignorer les mots entièrement en majuscules","dic_create":"Créer","dic_delete":"Effacer","dic_field_name":"Nom du dictionnaire","dic_info":"Initialement, le dictionnaire de l'utilisateur est stocké dans un cookie. Cependant, les cookies sont limités en taille. Quand le dictionnaire atteint une taille qu'il n'est plus possible de stocker dans un cookie, il peut alors être stocké sur nos serveurs. Afin de stocker votre dictionnaire personnel sur nos serveurs, vous devez spécifier un nom pour ce dictionnaire. Si vous avez déjà un dictionnaire stocké, merci de taper son nom puis cliquer sur Restaurer pour le récupérer.","dic_rename":"Renommer","dic_restore":"Restaurer","dictionariesTab":"Dictionnaires","disable":"Désactiver SCAYT","emptyDic":"Le nom du dictionnaire ne devrait pas être vide.","enable":"Activer SCAYT","ignore":"Ignorer","ignoreAll":"Ignorer Tout","ignoreDomainNames":"Ignorer les noms de domaines","langs":"Langues","languagesTab":"Langues","mixedCase":"Ignorer les mots à casse multiple","mixedWithDigits":"Ignorer les mots contenant des chiffres","moreSuggestions":"Plus de suggestions","opera_title":"Non supporté par Opera","options":"Options","optionsTab":"Options","title":"Vérification de l'Orthographe en Cours de Frappe (SCAYT)","toggle":"Activer/Désactiver SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styles","panelTitle":"Styles de mise en page","panelTitle1":"Styles de blocs","panelTitle2":"Styles en ligne","panelTitle3":"Styles d'objet"},"table":{"border":"Taille de la bordure","caption":"Titre du tableau","cell":{"menu":"Cellule","insertBefore":"Insérer une cellule avant","insertAfter":"Insérer une cellule après","deleteCell":"Supprimer les cellules","merge":"Fusionner les cellules","mergeRight":"Fusionner à droite","mergeDown":"Fusionner en bas","splitHorizontal":"Fractionner horizontalement","splitVertical":"Fractionner verticalement","title":"Propriétés de la cellule","cellType":"Type de cellule","rowSpan":"Fusion de lignes","colSpan":"Fusion de colonnes","wordWrap":"Césure","hAlign":"Alignement Horizontal","vAlign":"Alignement Vertical","alignBaseline":"Bas du texte","bgColor":"Couleur d'arrière-plan","borderColor":"Couleur de Bordure","data":"Données","header":"Entête","yes":"Oui","no":"Non","invalidWidth":"La Largeur de Cellule doit être un nombre.","invalidHeight":"La Hauteur de Cellule doit être un nombre.","invalidRowSpan":"La fusion de lignes doit être un nombre entier.","invalidColSpan":"La fusion de colonnes doit être un nombre entier.","chooseColor":"Choisissez"},"cellPad":"Marge interne des cellules","cellSpace":"Espacement des cellules","column":{"menu":"Colonnes","insertBefore":"Insérer une colonne avant","insertAfter":"Insérer une colonne après","deleteColumn":"Supprimer les colonnes"},"columns":"Colonnes","deleteTable":"Supprimer le tableau","headers":"En-Têtes","headersBoth":"Les deux","headersColumn":"Première colonne","headersNone":"Aucunes","headersRow":"Première ligne","invalidBorder":"La taille de la bordure doit être un nombre.","invalidCellPadding":"La marge intérieure des cellules doit être un nombre positif.","invalidCellSpacing":"L'espacement des cellules doit être un nombre positif.","invalidCols":"Le nombre de colonnes doit être supérieur à 0.","invalidHeight":"La hauteur du tableau doit être un nombre.","invalidRows":"Le nombre de lignes doit être supérieur à 0.","invalidWidth":"La largeur du tableau doit être un nombre.","menu":"Propriétés du tableau","row":{"menu":"Ligne","insertBefore":"Insérer une ligne avant","insertAfter":"Insérer une ligne après","deleteRow":"Supprimer les lignes"},"rows":"Lignes","summary":"Résumé (description)","title":"Propriétés du tableau","toolbar":"Tableau","widthPc":"% pourcents","widthPx":"pixels","widthUnit":"unité de largeur"},"undo":{"redo":"Rétablir","undo":"Annuler"},"wsc":{"btnIgnore":"Ignorer","btnIgnoreAll":"Ignorer tout","btnReplace":"Remplacer","btnReplaceAll":"Remplacer tout","btnUndo":"Annuler","changeTo":"Modifier pour","errorLoading":"Erreur du chargement du service depuis l'hôte : %s.","ieSpellDownload":"La vérification d'orthographe n'est pas installée. Voulez-vous la télécharger maintenant?","manyChanges":"Vérification de l'orthographe terminée : %1 mots corrigés.","noChanges":"Vérification de l'orthographe terminée : Aucun mot corrigé.","noMispell":"Vérification de l'orthographe terminée : aucune erreur trouvée.","noSuggestions":"- Aucune suggestion -","notAvailable":"Désolé, le service est indisponible actuellement.","notInDic":"N'existe pas dans le dictionnaire.","oneChange":"Vérification de l'orthographe terminée : Un seul mot corrigé.","progress":"Vérification de l'orthographe en cours...","title":"Vérifier l'orthographe","toolbar":"Vérifier l'orthographe"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/gl.js b/theme/bootstrap/plugins/ckeditor/lang/gl.js new file mode 100644 index 0000000..bdf5600 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/gl.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['gl']={"editor":"Editor de texto mellorado","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Prema ALT 0 para obter axuda","browseServer":"Examinar o servidor","url":"URL","protocol":"Protocolo","upload":"Enviar","uploadSubmit":"Enviar ao servidor","image":"Imaxe","flash":"Flash","form":"Formulario","checkbox":"Caixa de selección","radio":"Botón de opción","textField":"Campo de texto","textarea":"Área de texto","hiddenField":"Campo agochado","button":"Botón","select":"Campo de selección","imageButton":"Botón de imaxe","notSet":"<sen estabelecer>","id":"ID","name":"Nome","langDir":"Dirección de escritura do idioma","langDirLtr":"Esquerda a dereita (LTR)","langDirRtl":"Dereita a esquerda (RTL)","langCode":"Código do idioma","longDescr":"Descrición completa do URL","cssClass":"Clases da folla de estilos","advisoryTitle":"Título","cssStyle":"Estilo","ok":"Aceptar","cancel":"Cancelar","close":"Pechar","preview":"Vista previa","resize":"Redimensionar","generalTab":"Xeral","advancedTab":"Avanzado","validateNumberFailed":"Este valor non é un número.","confirmNewPage":"Calquera cambio que non gardara neste contido perderase.\r\nConfirma que quere cargar unha páxina nova?","confirmCancel":"Algunhas das opcións foron cambiadas.\r\nConfirma que quere pechar o diálogo?","options":"Opcións","target":"Destino","targetNew":"Nova xanela (_blank)","targetTop":"Xanela principal (_top)","targetSelf":"Mesma xanela (_self)","targetParent":"Xanela superior (_parent)","langDirLTR":"Esquerda a dereita (LTR)","langDirRTL":"Dereita a esquerda (RTL)","styles":"Estilo","cssClasses":"Clases da folla de estilos","width":"Largo","height":"Alto","align":"Aliñamento","alignLeft":"Esquerda","alignRight":"Dereita","alignCenter":"Centro","alignTop":"Arriba","alignMiddle":"Centro","alignBottom":"Abaixo","invalidValue":"Valor incorrecto.","invalidHeight":"O alto debe ser un número.","invalidWidth":"O largo debe ser un número.","invalidCssLength":"O valor especificado para o campo «%1» debe ser un número positivo con ou sen unha unidade de medida CSS correcta (px, %, in, cm, mm, em, ex, pt, ou pc).","invalidHtmlLength":"O valor especificado para o campo «%1» debe ser un número positivo con ou sen unha unidade de medida HTML correcta (px ou %).","invalidInlineStyle":"O valor especificado no estilo en liña debe consistir nunha ou máis tuplas co formato «nome : valor», separadas por punto e coma.","cssLengthTooltip":"Escriba un número para o valor en píxeles ou un número cunha unidade CSS correcta (px, %, in, cm, mm, em, ex, pt, ou pc).","unavailable":"%1<span class=\"cke_accessibility\">, non dispoñíbel</span>"},"about":{"copy":"Copyright &copy; $1. Todos os dereitos reservados.","dlgTitle":"Sobre o CKEditor","help":"Consulte $1 para obter axuda.","moreInfo":"Para obter información sobre a licenza, visite o noso sitio web:","title":"Sobre o CKEditor","userGuide":"Guía do usuario do CKEditor"},"basicstyles":{"bold":"Negra","italic":"Cursiva","strike":"Riscado","subscript":"Subíndice","superscript":"Superíndice","underline":"Subliñado"},"blockquote":{"toolbar":"Cita"},"clipboard":{"copy":"Copiar","copyError":"Os axustes de seguranza do seu navegador non permiten que o editor realice automaticamente as tarefas de copia. Use o teclado para iso (Ctrl/Cmd+C).","cut":"Cortar","cutError":"Os axustes de seguranza do seu navegador non permiten que o editor realice automaticamente as tarefas de corte. Use o teclado para iso (Ctrl/Cmd+X).","paste":"Pegar","pasteArea":"Zona de pegado","pasteMsg":"Pegue dentro do seguinte cadro usando o teclado (<STRONG>Ctrl/Cmd+V</STRONG>) e prema en Aceptar","securityMsg":"Por mor da configuración de seguranza do seu navegador, o editor non ten acceso ao portapapeis. É necesario pegalo novamente nesta xanela.","title":"Pegar"},"contextmenu":{"options":"Opcións do menú contextual"},"toolbar":{"toolbarCollapse":"Contraer a barra de ferramentas","toolbarExpand":"Expandir a barra de ferramentas","toolbarGroups":{"document":"Documento","clipboard":"Portapapeis/desfacer","editing":"Edición","forms":"Formularios","basicstyles":"Estilos básicos","paragraph":"Paragrafo","links":"Ligazóns","insert":"Inserir","styles":"Estilos","colors":"Cores","tools":"Ferramentas"},"toolbars":"Barras de ferramentas do editor"},"elementspath":{"eleLabel":"Ruta dos elementos","eleTitle":"Elemento %1"},"format":{"label":"Formato","panelTitle":"Formato do parágrafo","tag_address":"Enderezo","tag_div":"Normal (DIV)","tag_h1":"Enacabezado 1","tag_h2":"Encabezado 2","tag_h3":"Encabezado 3","tag_h4":"Encabezado 4","tag_h5":"Encabezado 5","tag_h6":"Encabezado 6","tag_p":"Normal","tag_pre":"Formatado"},"horizontalrule":{"toolbar":"Inserir unha liña horizontal"},"image":{"alertUrl":"Escriba o URL da imaxe","alt":"Texto alternativo","border":"Bordo","btnUpload":"Enviar ao servidor","button2Img":"Quere converter o botón da imaxe seleccionada nunha imaxe sinxela?","hSpace":"Esp.Horiz.","img2Button":"Quere converter a imaxe seleccionada nun botón de imaxe?","infoTab":"Información da imaxe","linkTab":"Ligazón","lockRatio":"Proporcional","menu":"Propiedades da imaxe","resetSize":"Tamaño orixinal","title":"Propiedades da imaxe","titleButton":"Propiedades do botón de imaxe","upload":"Cargar","urlMissing":"Non se atopa o URL da imaxe.","vSpace":"Esp.Vert.","validateBorder":"O bordo debe ser un número.","validateHSpace":"O espazado horizontal debe ser un número.","validateVSpace":"O espazado vertical debe ser un número."},"indent":{"indent":"Aumentar a sangría","outdent":"Reducir a sangría"},"fakeobjects":{"anchor":"Ancoraxe","flash":"Animación «Flash»","hiddenfield":"Campo agochado","iframe":"IFrame","unknown":"Obxecto descoñecido"},"link":{"acccessKey":"Chave de acceso","advanced":"Avanzado","advisoryContentType":"Tipo de contido informativo","advisoryTitle":"Título","anchor":{"toolbar":"Ancoraxe","menu":"Editar a ancoraxe","title":"Propiedades da ancoraxe","name":"Nome da ancoraxe","errorName":"Escriba o nome da ancoraxe","remove":"Retirar a ancoraxe"},"anchorId":"Polo ID do elemento","anchorName":"Polo nome da ancoraxe","charset":"Codificación do recurso ligado","cssClasses":"Clases da folla de estilos","emailAddress":"Enderezo de correo","emailBody":"Corpo da mensaxe","emailSubject":"Asunto da mensaxe","id":"ID","info":"Información da ligazón","langCode":"Código do idioma","langDir":"Dirección de escritura do idioma","langDirLTR":"Esquerda a dereita (LTR)","langDirRTL":"Dereita a esquerda (RTL)","menu":"Editar a ligazón","name":"Nome","noAnchors":"(Non hai ancoraxes dispoñíbeis no documento)","noEmail":"Escriba o enderezo de correo","noUrl":"Escriba a ligazón URL","other":"<outro>","popupDependent":"Dependente (Netscape)","popupFeatures":"Características da xanela emerxente","popupFullScreen":"Pantalla completa (IE)","popupLeft":"Posición esquerda","popupLocationBar":"Barra de localización","popupMenuBar":"Barra do menú","popupResizable":"Redimensionábel","popupScrollBars":"Barras de desprazamento","popupStatusBar":"Barra de estado","popupToolbar":"Barra de ferramentas","popupTop":"Posición superior","rel":"Relación","selectAnchor":"Seleccionar unha ancoraxe","styles":"Estilo","tabIndex":"Índice de tabulación","target":"Destino","targetFrame":"<marco>","targetFrameName":"Nome do marco de destino","targetPopup":"<xanela emerxente>","targetPopupName":"Nome da xanela emerxente","title":"Ligazón","toAnchor":"Ligar coa ancoraxe no testo","toEmail":"Correo","toUrl":"URL","toolbar":"Ligazón","type":"Tipo de ligazón","unlink":"Eliminar a ligazón","upload":"Enviar"},"list":{"bulletedlist":"Inserir/retirar lista viñeteada","numberedlist":"Inserir/retirar lista numerada"},"magicline":{"title":"Inserir aquí o parágrafo"},"maximize":{"maximize":"Maximizar","minimize":"Minimizar"},"pastetext":{"button":"Pegar como texto simple","title":"Pegar como texto simple"},"pastefromword":{"confirmCleanup":"O texto que quere pegar semella ser copiado desde o Word. Quere depuralo antes de pegalo?","error":"Non foi posíbel depurar os datos pegados por mor dun erro interno","title":"Pegar desde Word","toolbar":"Pegar desde Word"},"removeformat":{"toolbar":"Retirar o formato"},"sourcearea":{"toolbar":"Orixe"},"specialchar":{"options":"Opcións de caracteres especiais","title":"Seleccione un carácter especial","toolbar":"Inserir un carácter especial"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Estilos","panelTitle":"Estilos de formatando","panelTitle1":"Estilos de bloque","panelTitle2":"Estilos de carácter","panelTitle3":"Estilos de obxecto"},"table":{"border":"Tamaño do bordo","caption":"Título","cell":{"menu":"Cela","insertBefore":"Inserir a cela á esquerda","insertAfter":"Inserir a cela á dereita","deleteCell":"Eliminar celas","merge":"Combinar celas","mergeRight":"Combinar á dereita","mergeDown":"Combinar cara abaixo","splitHorizontal":"Dividir a cela en horizontal","splitVertical":"Dividir a cela en vertical","title":"Propiedades da cela","cellType":"Tipo de cela","rowSpan":"Expandir filas","colSpan":"Expandir columnas","wordWrap":"Axustar ao contido","hAlign":"Aliñación horizontal","vAlign":"Aliñación vertical","alignBaseline":"Liña de base","bgColor":"Cor do fondo","borderColor":"Cor do bordo","data":"Datos","header":"Cabeceira","yes":"Si","no":"Non","invalidWidth":"O largo da cela debe ser un número.","invalidHeight":"O alto da cela debe ser un número.","invalidRowSpan":"A expansión de filas debe ser un número enteiro.","invalidColSpan":"A expansión de columnas debe ser un número enteiro.","chooseColor":"Escoller"},"cellPad":"Marxe interior da cela","cellSpace":"Marxe entre celas","column":{"menu":"Columna","insertBefore":"Inserir a columna á esquerda","insertAfter":"Inserir a columna á dereita","deleteColumn":"Borrar Columnas"},"columns":"Columnas","deleteTable":"Borrar Táboa","headers":"Cabeceiras","headersBoth":"Ambas","headersColumn":"Primeira columna","headersNone":"Ningún","headersRow":"Primeira fila","invalidBorder":"O tamaño do bordo debe ser un número.","invalidCellPadding":"A marxe interior debe ser un número positivo.","invalidCellSpacing":"A marxe entre celas debe ser un número positivo.","invalidCols":"O número de columnas debe ser un número maior que 0.","invalidHeight":"O alto da táboa debe ser un número.","invalidRows":"O número de filas debe ser un número maior que 0","invalidWidth":"O largo da táboa debe ser un número.","menu":"Propiedades da táboa","row":{"menu":"Fila","insertBefore":"Inserir a fila por riba","insertAfter":"Inserir a fila por baixo","deleteRow":"Eliminar filas"},"rows":"Filas","summary":"Resumo","title":"Propiedades da táboa","toolbar":"Taboa","widthPc":"porcentaxe","widthPx":"píxeles","widthUnit":"unidade do largo"},"undo":{"redo":"Refacer","undo":"Desfacer"},"wsc":{"btnIgnore":"Ignorar","btnIgnoreAll":"Ignorar Todas","btnReplace":"Substituir","btnReplaceAll":"Substituir Todas","btnUndo":"Desfacer","changeTo":"Cambiar a","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"O corrector ortográfico non está instalado. ¿Quere descargalo agora?","manyChanges":"Corrección ortográfica rematada: %1 verbas substituidas","noChanges":"Corrección ortográfica rematada: Non se substituiu nengunha verba","noMispell":"Corrección ortográfica rematada: Non se atoparon erros","noSuggestions":"- Sen candidatos -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Non está no diccionario","oneChange":"Corrección ortográfica rematada: Unha verba substituida","progress":"Corrección ortográfica en progreso...","title":"Spell Check","toolbar":"Corrección Ortográfica"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/gu.js b/theme/bootstrap/plugins/ckeditor/lang/gu.js new file mode 100644 index 0000000..c448cf4 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/gu.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['gu']={"editor":"રીચ ટેક્ષ્ત્ એડીટર","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"પ્રેસ ALT 0 મદદ માટ","browseServer":"સર્વર બ્રાઉઝ કરો","url":"URL","protocol":"પ્રોટોકૉલ","upload":"અપલોડ","uploadSubmit":"આ સર્વરને મોકલવું","image":"ચિત્ર","flash":"ફ્લૅશ","form":"ફૉર્મ/પત્રક","checkbox":"ચેક બોક્સ","radio":"રેડિઓ બટન","textField":"ટેક્સ્ટ ફીલ્ડ, શબ્દ ક્ષેત્ર","textarea":"ટેક્સ્ટ એરિઆ, શબ્દ વિસ્તાર","hiddenField":"ગુપ્ત ક્ષેત્ર","button":"બટન","select":"પસંદગી ક્ષેત્ર","imageButton":"ચિત્ર બટન","notSet":"<સેટ નથી>","id":"Id","name":"નામ","langDir":"ભાષા લેખવાની પદ્ધતિ","langDirLtr":"ડાબે થી જમણે (LTR)","langDirRtl":"જમણે થી ડાબે (RTL)","langCode":"ભાષા કોડ","longDescr":"વધારે માહિતી માટે URL","cssClass":"સ્ટાઇલ-શીટ ક્લાસ","advisoryTitle":"મુખ્ય મથાળું","cssStyle":"સ્ટાઇલ","ok":"ઠીક છે","cancel":"રદ કરવું","close":"બંધ કરવું","preview":"જોવું","resize":"ખેંચી ને યોગ્ય કરવું","generalTab":"જનરલ","advancedTab":"અડ્વાન્સડ","validateNumberFailed":"આ રકમ આકડો નથી.","confirmNewPage":"સવે કાર્ય વગરનું ફકરો ખોવાઈ જશે. તમને ખાતરી છે કે તમને નવું પાનું ખોલવું છે?","confirmCancel":"ઘણા વિકલ્પો બદલાયા છે. તમારે આ બોક્ષ્ બંધ કરવું છે?","options":"વિકલ્પો","target":"લક્ષ્ય","targetNew":"નવી વિન્ડો (_blank)","targetTop":"ઉપરની વિન્ડો (_top)","targetSelf":"એજ વિન્ડો (_self)","targetParent":"પેરનટ વિન્ડો (_parent)","langDirLTR":"ડાબે થી જમણે (LTR)","langDirRTL":"જમણે થી ડાબે (RTL)","styles":"શૈલી","cssClasses":"શૈલી કલાસીસ","width":"પહોળાઈ","height":"ઊંચાઈ","align":"લાઇનદોરીમાં ગોઠવવું","alignLeft":"ડાબી બાજુ ગોઠવવું","alignRight":"જમણી","alignCenter":"મધ્ય સેન્ટર","alignTop":"ઉપર","alignMiddle":"વચ્ચે","alignBottom":"નીચે","invalidValue":"Invalid value.","invalidHeight":"ઉંચાઈ એક આંકડો હોવો જોઈએ.","invalidWidth":"પોહળ ઈ એક આંકડો હોવો જોઈએ.","invalidCssLength":"\"%1\" ની વેલ્યુ એક પોસીટીવ આંકડો હોવો જોઈએ અથવા CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc) વગર.","invalidHtmlLength":"\"%1\" ની વેલ્યુ એક પોસીટીવ આંકડો હોવો જોઈએ અથવા HTML measurement unit (px or %) વગર.","invalidInlineStyle":"ઈનલાઈન સ્ટાઈલ ની વેલ્યુ \"name : value\" ના ફોર્મેટ માં હોવી જોઈએ, વચ્ચે સેમી-કોલોન જોઈએ.","cssLengthTooltip":"પિક્ષ્લ્ નો આંકડો CSS unit (px, %, in, cm, mm, em, ex, pt, or pc) માં નાખો.","unavailable":"%1<span class=\"cke_accessibility\">, નથી મળતું</span>"},"about":{"copy":"કોપીરાઈટ &copy; $1. ઓલ રાઈટ્સ ","dlgTitle":"CKEditor વિષે","help":"મદદ માટે $1 તપાસો","moreInfo":"લાયસનસની માહિતી માટે અમારી વેબ સાઈટ","title":"CKEditor વિષે","userGuide":"CKEditor યુઝર્સ ગાઈડ"},"basicstyles":{"bold":"બોલ્ડ/સ્પષ્ટ","italic":"ઇટેલિક, ત્રાંસા","strike":"છેકી નાખવું","subscript":"એક ચિહ્નની નીચે કરેલું બીજું ચિહ્ન","superscript":"એક ચિહ્ન ઉપર કરેલું બીજું ચિહ્ન.","underline":"અન્ડર્લાઇન, નીચે લીટી"},"blockquote":{"toolbar":"બ્લૉક-કોટ, અવતરણચિહ્નો"},"clipboard":{"copy":"નકલ","copyError":"તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસ કોપી કરવાની પરવાનગી નથી આપતી. (Ctrl/Cmd+C) का प्रयोग करें।","cut":"કાપવું","cutError":"તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસ કટ કરવાની પરવાનગી નથી આપતી. (Ctrl/Cmd+X) નો ઉપયોગ કરો.","paste":"પેસ્ટ","pasteArea":"પેસ્ટ કરવાની જગ્યા","pasteMsg":"Ctrl/Cmd+V નો પ્રયોગ કરી પેસ્ટ કરો","securityMsg":"તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસના કારણે,એડિટર તમારા કિલ્પબોર્ડ ડેટા ને કોપી નથી કરી શકતો. તમારે આ વિન્ડોમાં ફરીથી પેસ્ટ કરવું પડશે.","title":"પેસ્ટ"},"contextmenu":{"options":"કોન્તેક્ષ્ત્ મેનુના વિકલ્પો"},"toolbar":{"toolbarCollapse":"ટૂલબાર નાનું કરવું","toolbarExpand":"ટૂલબાર મોટું કરવું","toolbarGroups":{"document":"દસ્તાવેજ","clipboard":"ક્લિપબોર્ડ/અન","editing":"એડીટ કરવું","forms":"ફોર્મ","basicstyles":"બેસિક્ સ્ટાઇલ","paragraph":"ફકરો","links":"લીંક","insert":"ઉમેરવું","styles":"સ્ટાઇલ","colors":"રંગ","tools":"ટૂલ્સ"},"toolbars":"એડીટર ટૂલ બાર"},"elementspath":{"eleLabel":"એલીમેન્ટ્સ નો ","eleTitle":"એલીમેન્ટ %1"},"format":{"label":"ફૉન્ટ ફૉર્મટ, રચનાની શૈલી","panelTitle":"ફૉન્ટ ફૉર્મટ, રચનાની શૈલી","tag_address":"સરનામું","tag_div":"શીર્ષક (DIV)","tag_h1":"શીર્ષક 1","tag_h2":"શીર્ષક 2","tag_h3":"શીર્ષક 3","tag_h4":"શીર્ષક 4","tag_h5":"શીર્ષક 5","tag_h6":"શીર્ષક 6","tag_p":"સામાન્ય","tag_pre":"ફૉર્મટેડ"},"horizontalrule":{"toolbar":"સમસ્તરીય રેખા ઇન્સર્ટ/દાખલ કરવી"},"image":{"alertUrl":"ચિત્રની URL ટાઇપ કરો","alt":"ઑલ્ટર્નટ ટેક્સ્ટ","border":"બોર્ડર","btnUpload":"આ સર્વરને મોકલવું","button2Img":"તમારે ઈમેજ બટનને સાદી ઈમેજમાં બદલવું છે.","hSpace":"સમસ્તરીય જગ્યા","img2Button":"તમારે સાદી ઈમેજને ઈમેજ બટનમાં બદલવું છે.","infoTab":"ચિત્ર ની જાણકારી","linkTab":"લિંક","lockRatio":"લૉક ગુણોત્તર","menu":"ચિત્રના ગુણ","resetSize":"રીસેટ સાઇઝ","title":"ચિત્રના ગુણ","titleButton":"ચિત્ર બટનના ગુણ","upload":"અપલોડ","urlMissing":"ઈમેજની મૂળ URL છે નહી.","vSpace":"લંબરૂપ જગ્યા","validateBorder":"બોર્ડેર આંકડો હોવો જોઈએ.","validateHSpace":"HSpaceઆંકડો હોવો જોઈએ.","validateVSpace":"VSpace આંકડો હોવો જોઈએ. "},"indent":{"indent":"ઇન્ડેન્ટ, લીટીના આરંભમાં જગ્યા વધારવી","outdent":"ઇન્ડેન્ટ લીટીના આરંભમાં જગ્યા ઘટાડવી"},"fakeobjects":{"anchor":"અનકર","flash":"ફ્લેશ ","hiddenfield":"હિડન ","iframe":"IFrame","unknown":"અનનોન ઓબ્જેક્ટ"},"link":{"acccessKey":"ઍક્સેસ કી","advanced":"અડ્વાન્સડ","advisoryContentType":"મુખ્ય કન્ટેન્ટ પ્રકાર","advisoryTitle":"મુખ્ય મથાળું","anchor":{"toolbar":"ઍંકર ઇન્સર્ટ/દાખલ કરવી","menu":"ઍંકરના ગુણ","title":"ઍંકરના ગુણ","name":"ઍંકરનું નામ","errorName":"ઍંકરનું નામ ટાઈપ કરો","remove":"સ્થિર નકરવું"},"anchorId":"ઍંકર એલિમન્ટ Id થી પસંદ કરો","anchorName":"ઍંકર નામથી પસંદ કરો","charset":"લિંક રિસૉર્સ કૅરિક્ટર સેટ","cssClasses":"સ્ટાઇલ-શીટ ક્લાસ","emailAddress":"ઈ-મેલ સરનામું","emailBody":"સંદેશ","emailSubject":"ઈ-મેલ વિષય","id":"Id","info":"લિંક ઇન્ફૉ ટૅબ","langCode":"ભાષા લેખવાની પદ્ધતિ","langDir":"ભાષા લેખવાની પદ્ધતિ","langDirLTR":"ડાબે થી જમણે (LTR)","langDirRTL":"જમણે થી ડાબે (RTL)","menu":" લિંક એડિટ/માં ફેરફાર કરવો","name":"નામ","noAnchors":"(ડૉક્યુમન્ટમાં ઍંકરની સંખ્યા)","noEmail":"ઈ-મેલ સરનામું ટાઇપ કરો","noUrl":"લિંક URL ટાઇપ કરો","other":"<other> <અન્ય>","popupDependent":"ડિપેન્ડન્ટ (Netscape)","popupFeatures":"પૉપ-અપ વિન્ડો ફીચરસૅ","popupFullScreen":"ફુલ સ્ક્રીન (IE)","popupLeft":"ડાબી બાજુ","popupLocationBar":"લોકેશન બાર","popupMenuBar":"મેન્યૂ બાર","popupResizable":"રીસાઈઝએબલ","popupScrollBars":"સ્ક્રોલ બાર","popupStatusBar":"સ્ટૅટસ બાર","popupToolbar":"ટૂલ બાર","popupTop":"જમણી બાજુ","rel":"સંબંધની સ્થિતિ","selectAnchor":"ઍંકર પસંદ કરો","styles":"સ્ટાઇલ","tabIndex":"ટૅબ ઇન્ડેક્સ","target":"ટાર્ગેટ/લક્ષ્ય","targetFrame":"<ફ્રેમ>","targetFrameName":"ટાર્ગેટ ફ્રેમ નું નામ","targetPopup":"<પૉપ-અપ વિન્ડો>","targetPopupName":"પૉપ-અપ વિન્ડો નું નામ","title":"લિંક","toAnchor":"આ પેજનો ઍંકર","toEmail":"ઈ-મેલ","toUrl":"URL","toolbar":"લિંક ઇન્સર્ટ/દાખલ કરવી","type":"લિંક પ્રકાર","unlink":"લિંક કાઢવી","upload":"અપલોડ"},"list":{"bulletedlist":"બુલેટ સૂચિ","numberedlist":"સંખ્યાંકન સૂચિ"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"મોટું કરવું","minimize":"નાનું કરવું"},"pastetext":{"button":"પેસ્ટ (ટેક્સ્ટ)","title":"પેસ્ટ (ટેક્સ્ટ)"},"pastefromword":{"confirmCleanup":"તમે જે ટેક્ષ્ત્ કોપી કરી રહ્યા છો ટે વર્ડ ની છે. કોપી કરતા પેહલા સાફ કરવી છે?","error":"પેસ્ટ કરેલો ડેટા ઇન્ટરનલ એરર ના લીથે સાફ કરી શકાયો નથી.","title":"પેસ્ટ (વડૅ ટેક્સ્ટ)","toolbar":"પેસ્ટ (વડૅ ટેક્સ્ટ)"},"removeformat":{"toolbar":"ફૉર્મટ કાઢવું"},"sourcearea":{"toolbar":"મૂળ કે પ્રાથમિક દસ્તાવેજ"},"specialchar":{"options":"સ્પેશિઅલ કરેક્ટરના વિકલ્પો","title":"સ્પેશિઅલ વિશિષ્ટ અક્ષર પસંદ કરો","toolbar":"વિશિષ્ટ અક્ષર ઇન્સર્ટ/દાખલ કરવું"},"scayt":{"about":"SCAYT વિષે","aboutTab":"વિષે","addWord":"શબ્દ ઉમેરવો","allCaps":"ઓલ-કેપ્સ વર્ડ છોડી દો.","dic_create":"બનાવવું","dic_delete":"કાઢી નાખવું","dic_field_name":"શબ્દકોશ નામ","dic_info":"પેહલા User Dictionary, Cookie તરીકે સ્ટોર થાય છે. પણ Cookie ની સમતા ઓછી છે. જયારે User Dictionary, Cookie તરીકે સ્ટોર ના કરી શકાય, ત્યારે તે અમારા સર્વર પર સ્ટોર થાય છે. તમારી વ્યતિગત ડીકસ્નરી ને સર્વર પર સ્ટોર કરવા માટે તમારે તેનું નામ આપવું પડશે. જો તમે તમારી ડીકસ્નરી નું નામ આપેલું હોય તો તમે રિસ્ટોર બટન ક્લીક કરી શકો.","dic_rename":"નવું નામ આપવું","dic_restore":"પાછું ","dictionariesTab":"શબ્દકોશ","disable":"SCAYT ડિસેબલ કરવું","emptyDic":"ડિક્સનરીનું નામ ખાલી ના હોય.","enable":"SCAYT એનેબલ કરવું","ignore":"ઇગ્નોર","ignoreAll":"બધા ઇગ્નોર ","ignoreDomainNames":"ડોમેન નામ છોડી દો.","langs":"ભાષાઓ","languagesTab":"ભાષા","mixedCase":"મિક્સ કેસ વર્ડ છોડી દો.","mixedWithDigits":"આંકડા વાળા શબ્દ છોડી દો.","moreSuggestions":"વધારે વિકલ્પો","opera_title":"ઓપેરામાં સપોર્ટ નથી","options":"વિકલ્પો","optionsTab":"વિકલ્પો","title":"ટાઈપ કરતા સ્પેલ તપાસો","toggle":"SCAYT ટોગલ","noSuggestions":"No suggestion"},"stylescombo":{"label":"શૈલી/રીત","panelTitle":"ફોર્મેટ ","panelTitle1":"બ્લોક ","panelTitle2":"ઈનલાઈન ","panelTitle3":"ઓબ્જેક્ટ પદ્ધતિ"},"table":{"border":"કોઠાની બાજુ(બોર્ડર) સાઇઝ","caption":"મથાળું/કૅપ્શન ","cell":{"menu":"કોષના ખાના","insertBefore":"પહેલાં કોષ ઉમેરવો","insertAfter":"પછી કોષ ઉમેરવો","deleteCell":"કોષ ડિલીટ/કાઢી નાખવો","merge":"કોષ ભેગા કરવા","mergeRight":"જમણી બાજુ ભેગા કરવા","mergeDown":"નીચે ભેગા કરવા","splitHorizontal":"કોષને સમસ્તરીય વિભાજન કરવું","splitVertical":"કોષને સીધું ને ઊભું વિભાજન કરવું","title":"સેલના ગુણ","cellType":"સેલનો પ્રકાર","rowSpan":"આડી કટારની જગ્યા","colSpan":"ઊભી કતારની જગ્યા","wordWrap":"વર્ડ રેપ","hAlign":"સપાટ લાઈનદોરી","vAlign":"ઊભી લાઈનદોરી","alignBaseline":"બસે લાઈન","bgColor":"પાછાળનો રંગ","borderColor":"બોર્ડેર રંગ","data":"સ્વીકૃત માહિતી","header":"મથાળું","yes":"હા","no":"ના","invalidWidth":"સેલની પોહલાઈ આંકડો હોવો જોઈએ.","invalidHeight":"સેલની ઊંચાઈ આંકડો હોવો જોઈએ.","invalidRowSpan":"રો સ્પાન આંકડો હોવો જોઈએ.","invalidColSpan":"કોલમ સ્પાન આંકડો હોવો જોઈએ.","chooseColor":"પસંદ કરવું"},"cellPad":"સેલ પૅડિંગ","cellSpace":"સેલ અંતર","column":{"menu":"કૉલમ/ઊભી કટાર","insertBefore":"પહેલાં કૉલમ/ઊભી કટાર ઉમેરવી","insertAfter":"પછી કૉલમ/ઊભી કટાર ઉમેરવી","deleteColumn":"કૉલમ/ઊભી કટાર ડિલીટ/કાઢી નાખવી"},"columns":"કૉલમ/ઊભી કટાર","deleteTable":"કોઠો ડિલીટ/કાઢી નાખવું","headers":"મથાળા","headersBoth":"બેવું","headersColumn":"પહેલી ઊભી કટાર","headersNone":"નથી ","headersRow":"પહેલી કટાર","invalidBorder":"બોર્ડર એક આંકડો હોવો જોઈએ","invalidCellPadding":"સેલની અંદરની જગ્યા સુન્ય કરતા વધારે હોવી જોઈએ.","invalidCellSpacing":"સેલ વચ્ચેની જગ્યા સુન્ય કરતા વધારે હોવી જોઈએ.","invalidCols":"ઉભી કટાર, 0 કરતા વધારે હોવી જોઈએ.","invalidHeight":"ટેબલની ઊંચાઈ આંકડો હોવો જોઈએ.","invalidRows":"આડી કટાર, 0 કરતા વધારે હોવી જોઈએ.","invalidWidth":"ટેબલની પોહલાઈ આંકડો હોવો જોઈએ.","menu":"ટેબલ, કોઠાનું મથાળું","row":{"menu":"પંક્તિના ખાના","insertBefore":"પહેલાં પંક્તિ ઉમેરવી","insertAfter":"પછી પંક્તિ ઉમેરવી","deleteRow":"પંક્તિઓ ડિલીટ/કાઢી નાખવી"},"rows":"પંક્તિના ખાના","summary":"ટૂંકો એહેવાલ","title":"ટેબલ, કોઠાનું મથાળું","toolbar":"ટેબલ, કોઠો","widthPc":"પ્રતિશત","widthPx":"પિકસલ","widthUnit":"પોહાલાઈ એકમ"},"undo":{"redo":"રિડૂ; પછી હતી એવી સ્થિતિ પાછી લાવવી","undo":"રદ કરવું; પહેલાં હતી એવી સ્થિતિ પાછી લાવવી"},"wsc":{"btnIgnore":"ઇગ્નોર/અવગણના કરવી","btnIgnoreAll":"બધાની ઇગ્નોર/અવગણના કરવી","btnReplace":"બદલવું","btnReplaceAll":"બધા બદલી કરો","btnUndo":"અન્ડૂ","changeTo":"આનાથી બદલવું","errorLoading":"સર્વિસ એપ્લીકેશન લોડ નથી થ: %s.","ieSpellDownload":"સ્પેલ-ચેકર ઇન્સ્ટોલ નથી. શું તમે ડાઉનલોડ કરવા માંગો છો?","manyChanges":"શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: %1 શબ્દ બદલયા છે","noChanges":"શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: એકપણ શબ્દ બદલયો નથી","noMispell":"શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: ખોટી જોડણી મળી નથી","noSuggestions":"- કઇ સજેશન નથી -","notAvailable":"માફ કરશો, આ સુવિધા ઉપલબ્ધ નથી","notInDic":"શબ્દકોશમાં નથી","oneChange":"શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: એક શબ્દ બદલયો છે","progress":"શબ્દની જોડણી/સ્પેલ ચેક ચાલુ છે...","title":"સ્પેલ ","toolbar":"જોડણી (સ્પેલિંગ) તપાસવી"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/he.js b/theme/bootstrap/plugins/ckeditor/lang/he.js new file mode 100644 index 0000000..1e0f3a3 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/he.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['he']={"editor":"עורך טקסט עשיר","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"לחץ אלט ALT + 0 לעזרה","browseServer":"סייר השרת","url":"כתובת (URL)","protocol":"פרוטוקול","upload":"העלאה","uploadSubmit":"שליחה לשרת","image":"תמונה","flash":"פלאש","form":"טופס","checkbox":"תיבת סימון","radio":"לחצן אפשרויות","textField":"שדה טקסט","textarea":"איזור טקסט","hiddenField":"שדה חבוי","button":"כפתור","select":"שדה בחירה","imageButton":"כפתור תמונה","notSet":"<לא נקבע>","id":"זיהוי (ID)","name":"שם","langDir":"כיוון שפה","langDirLtr":"שמאל לימין (LTR)","langDirRtl":"ימין לשמאל (RTL)","langCode":"קוד שפה","longDescr":"קישור לתיאור מפורט","cssClass":"מחלקת עיצוב (CSS Class)","advisoryTitle":"כותרת מוצעת","cssStyle":"סגנון","ok":"אישור","cancel":"ביטול","close":"סגירה","preview":"תצוגה מקדימה","resize":"יש לגרור בכדי לשנות את הגודל","generalTab":"כללי","advancedTab":"אפשרויות מתקדמות","validateNumberFailed":"הערך חייב להיות מספרי.","confirmNewPage":"כל השינויים שלא נשמרו יאבדו. האם להעלות דף חדש?","confirmCancel":"חלק מהאפשרויות שונו, האם לסגור את הדיאלוג?","options":"אפשרויות","target":"מטרה","targetNew":"חלון חדש (_blank)","targetTop":"החלון העליון ביותר (_top)","targetSelf":"אותו חלון (_self)","targetParent":"חלון האב (_parent)","langDirLTR":"שמאל לימין (LTR)","langDirRTL":"ימין לשמאל (RTL)","styles":"סגנון","cssClasses":"מחלקות גליונות סגנון","width":"רוחב","height":"גובה","align":"יישור","alignLeft":"לשמאל","alignRight":"לימין","alignCenter":"מרכז","alignTop":"למעלה","alignMiddle":"לאמצע","alignBottom":"לתחתית","invalidValue":"ערך לא חוקי.","invalidHeight":"הגובה חייב להיות מספר.","invalidWidth":"הרוחב חייב להיות מספר.","invalidCssLength":"הערך שצוין לשדה \"%1\" חייב להיות מספר חיובי עם או ללא יחידת מידה חוקית של CSS (px, %, in, cm, mm, em, ex, pt, או pc).","invalidHtmlLength":"הערך שצוין לשדה \"%1\" חייב להיות מספר חיובי עם או ללא יחידת מידה חוקית של HTML (px או %).","invalidInlineStyle":"הערך שצויין לשדה הסגנון חייב להכיל זוג ערכים אחד או יותר בפורמט \"שם : ערך\", מופרדים על ידי נקודה-פסיק.","cssLengthTooltip":"יש להכניס מספר המייצג פיקסלים או מספר עם יחידת גליונות סגנון תקינה (px, %, in, cm, mm, em, ex, pt, או pc).","unavailable":"%1<span class=\"cke_accessibility\">, לא זמין</span>"},"about":{"copy":"Copyright &copy; $1. כל הזכויות שמורות.","dlgTitle":"אודות CKEditor","help":"היכנסו ל$1 לעזרה.","moreInfo":"למידע נוסף בקרו באתרנו:","title":"אודות CKEditor","userGuide":"מדריך המשתמש של CKEditor"},"basicstyles":{"bold":"מודגש","italic":"נטוי","strike":"כתיב מחוק","subscript":"כתיב תחתון","superscript":"כתיב עליון","underline":"קו תחתון"},"blockquote":{"toolbar":"בלוק ציטוט"},"clipboard":{"copy":"העתקה","copyError":"הגדרות האבטחה בדפדפן שלך לא מאפשרות לעורך לבצע פעולות העתקה אוטומטיות. יש להשתמש במקלדת לשם כך (Ctrl/Cmd+C).","cut":"גזירה","cutError":"הגדרות האבטחה בדפדפן שלך לא מאפשרות לעורך לבצע פעולות גזירה אוטומטיות. יש להשתמש במקלדת לשם כך (Ctrl/Cmd+X).","paste":"הדבקה","pasteArea":"איזור הדבקה","pasteMsg":"נא להדביק בתוך הקופסה באמצעות (<b>Ctrl/Cmd+V</b>) וללחוץ על <b>אישור</b>.","securityMsg":"עקב הגדרות אבטחה בדפדפן, לא ניתן לגשת אל לוח הגזירים (Clipboard) בצורה ישירה. נא להדביק שוב בחלון זה.","title":"הדבקה"},"contextmenu":{"options":"אפשרויות תפריט ההקשר"},"toolbar":{"toolbarCollapse":"מזעור סרגל כלים","toolbarExpand":"הרחבת סרגל כלים","toolbarGroups":{"document":"מסמך","clipboard":"לוח הגזירים (Clipboard)/צעד אחרון","editing":"עריכה","forms":"טפסים","basicstyles":"עיצוב בסיסי","paragraph":"פסקה","links":"קישורים","insert":"הכנסה","styles":"עיצוב","colors":"צבעים","tools":"כלים"},"toolbars":"סרגלי כלים של העורך"},"elementspath":{"eleLabel":"עץ האלמנטים","eleTitle":"%1 אלמנט"},"format":{"label":"עיצוב","panelTitle":"עיצוב","tag_address":"כתובת","tag_div":"נורמלי (DIV)","tag_h1":"כותרת","tag_h2":"כותרת 2","tag_h3":"כותרת 3","tag_h4":"כותרת 4","tag_h5":"כותרת 5","tag_h6":"כותרת 6","tag_p":"נורמלי","tag_pre":"קוד"},"horizontalrule":{"toolbar":"הוספת קו אופקי"},"image":{"alertUrl":"יש להקליד את כתובת התמונה","alt":"טקסט חלופי","border":"מסגרת","btnUpload":"שליחה לשרת","button2Img":"האם להפוך את תמונת הכפתור לתמונה פשוטה?","hSpace":"מרווח אופקי","img2Button":"האם להפוך את התמונה לכפתור תמונה?","infoTab":"מידע על התמונה","linkTab":"קישור","lockRatio":"נעילת היחס","menu":"תכונות התמונה","resetSize":"איפוס הגודל","title":"מאפייני התמונה","titleButton":"מאפיני כפתור תמונה","upload":"העלאה","urlMissing":"כתובת התמונה חסרה.","vSpace":"מרווח אנכי","validateBorder":"שדה המסגרת חייב להיות מספר שלם.","validateHSpace":"שדה המרווח האופקי חייב להיות מספר שלם.","validateVSpace":"שדה המרווח האנכי חייב להיות מספר שלם."},"indent":{"indent":"הגדלת הזחה","outdent":"הקטנת הזחה"},"fakeobjects":{"anchor":"עוגן","flash":"סרטון פלאש","hiddenfield":"שדה חבוי","iframe":"חלון פנימי (iframe)","unknown":"אובייקט לא ידוע"},"link":{"acccessKey":"מקש גישה","advanced":"אפשרויות מתקדמות","advisoryContentType":"Content Type מוצע","advisoryTitle":"כותרת מוצעת","anchor":{"toolbar":"הוספת/עריכת נקודת עיגון","menu":"מאפייני נקודת עיגון","title":"מאפייני נקודת עיגון","name":"שם לנקודת עיגון","errorName":"יש להקליד שם לנקודת עיגון","remove":"מחיקת נקודת עיגון"},"anchorId":"עפ\"י זיהוי (ID) האלמנט","anchorName":"עפ\"י שם העוגן","charset":"קידוד המשאב המקושר","cssClasses":"גיליונות עיצוב קבוצות","emailAddress":"כתובת הדוא\"ל","emailBody":"גוף ההודעה","emailSubject":"נושא ההודעה","id":"זיהוי (ID)","info":"מידע על הקישור","langCode":"קוד שפה","langDir":"כיוון שפה","langDirLTR":"שמאל לימין (LTR)","langDirRTL":"ימין לשמאל (RTL)","menu":"מאפייני קישור","name":"שם","noAnchors":"(אין עוגנים זמינים בדף)","noEmail":"יש להקליד את כתובת הדוא\"ל","noUrl":"יש להקליד את כתובת הקישור (URL)","other":"<אחר>","popupDependent":"תלוי (Netscape)","popupFeatures":"תכונות החלון הקופץ","popupFullScreen":"מסך מלא (IE)","popupLeft":"מיקום צד שמאל","popupLocationBar":"סרגל כתובת","popupMenuBar":"סרגל תפריט","popupResizable":"שינוי גודל","popupScrollBars":"ניתן לגלילה","popupStatusBar":"סרגל חיווי","popupToolbar":"סרגל הכלים","popupTop":"מיקום צד עליון","rel":"קשר גומלין","selectAnchor":"בחירת עוגן","styles":"סגנון","tabIndex":"מספר טאב","target":"מטרה","targetFrame":"<מסגרת>","targetFrameName":"שם מסגרת היעד","targetPopup":"<חלון קופץ>","targetPopupName":"שם החלון הקופץ","title":"קישור","toAnchor":"עוגן בעמוד זה","toEmail":"דוא\"ל","toUrl":"כתובת (URL)","toolbar":"הוספת/עריכת קישור","type":"סוג קישור","unlink":"הסרת הקישור","upload":"העלאה"},"list":{"bulletedlist":"רשימת נקודות","numberedlist":"רשימה ממוספרת"},"magicline":{"title":"הכנס פסקה כאן"},"maximize":{"maximize":"הגדלה למקסימום","minimize":"הקטנה למינימום"},"pastetext":{"button":"הדבקה כטקסט פשוט","title":"הדבקה כטקסט פשוט"},"pastefromword":{"confirmCleanup":"נראה הטקסט שבכוונתך להדביק מקורו בקובץ וורד. האם ברצונך לנקות אותו טרם ההדבקה?","error":"לא ניתן היה לנקות את המידע בשל תקלה פנימית.","title":"הדבקה מ-Word","toolbar":"הדבקה מ-Word"},"removeformat":{"toolbar":"הסרת העיצוב"},"sourcearea":{"toolbar":"מקור"},"specialchar":{"options":"אפשרויות תווים מיוחדים","title":"בחירת תו מיוחד","toolbar":"הוספת תו מיוחד"},"scayt":{"about":"אודות SCAYT","aboutTab":"אודות","addWord":"הוספת מילה","allCaps":"התעלם ממילים שכל אותיותיהן גדולות","dic_create":"יצירה","dic_delete":"מחיקה","dic_field_name":"שם המילון","dic_info":"בהתחלה מילון המשתמש מאוחסן בעוגיה, אך עוגיות מוגבלות במקום. כאשר המילון מגיע לגודל בו הוא אינו יכול להתאכסן בעוגיה, המילון צריך להתאכסן בשרתנו. לשם כך עליך לתת שם למילון. אם כבר יש לך מילון מאוחסן, יש להכניס את שמו וללחוץ על כפתור השחזור.","dic_rename":"שינוי שם","dic_restore":"שחזור","dictionariesTab":"מילון","disable":"בטל SCAYT","emptyDic":"יש לבחור מילון.","enable":"אפשר SCAYT","ignore":"התעלמות","ignoreAll":"התעלמות מהכל","ignoreDomainNames":"התעלם משמות מתחם","langs":"שפות","languagesTab":"שפות","mixedCase":"התעלם ממילים עם אותיות גדולות וקטנות ביחד","mixedWithDigits":"התעלם ממילים עם מספרים","moreSuggestions":"הצעות נוספות","opera_title":"לא זמין בדפדפן אופרה","options":"אפשרויות","optionsTab":"אפשרויות","title":"בדיקת איות בזמן כתיבה (SCAYT)","toggle":"שינוי SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"סגנון","panelTitle":"סגנונות פורמט","panelTitle1":"סגנונות בלוק","panelTitle2":"סגנונות רצף","panelTitle3":"סגנונות אובייקט"},"table":{"border":"גודל מסגרת","caption":"כיתוב","cell":{"menu":"מאפייני תא","insertBefore":"הוספת תא לפני","insertAfter":"הוספת תא אחרי","deleteCell":"מחיקת תאים","merge":"מיזוג תאים","mergeRight":"מזג ימינה","mergeDown":"מזג למטה","splitHorizontal":"פיצול תא אופקית","splitVertical":"פיצול תא אנכית","title":"תכונות התא","cellType":"סוג התא","rowSpan":"מתיחת השורות","colSpan":"מתיחת התאים","wordWrap":"מניעת גלישת שורות","hAlign":"יישור אופקי","vAlign":"יישור אנכי","alignBaseline":"שורת בסיס","bgColor":"צבע רקע","borderColor":"צבע מסגרת","data":"מידע","header":"כותרת","yes":"כן","no":"לא","invalidWidth":"שדה רוחב התא חייב להיות מספר.","invalidHeight":"שדה גובה התא חייב להיות מספר.","invalidRowSpan":"שדה מתיחת השורות חייב להיות מספר שלם.","invalidColSpan":"שדה מתיחת העמודות חייב להיות מספר שלם.","chooseColor":"בחר"},"cellPad":"ריפוד תא","cellSpace":"מרווח תא","column":{"menu":"עמודה","insertBefore":"הוספת עמודה לפני","insertAfter":"הוספת עמודה אחרי","deleteColumn":"מחיקת עמודות"},"columns":"עמודות","deleteTable":"מחק טבלה","headers":"כותרות","headersBoth":"שניהם","headersColumn":"עמודה ראשונה","headersNone":"אין","headersRow":"שורה ראשונה","invalidBorder":"שדה גודל המסגרת חייב להיות מספר.","invalidCellPadding":"שדה ריפוד התאים חייב להיות מספר חיובי.","invalidCellSpacing":"שדה ריווח התאים חייב להיות מספר חיובי.","invalidCols":"שדה מספר העמודות חייב להיות מספר גדול מ 0.","invalidHeight":"שדה גובה הטבלה חייב להיות מספר.","invalidRows":"שדה מספר השורות חייב להיות מספר גדול מ 0.","invalidWidth":"שדה רוחב הטבלה חייב להיות מספר.","menu":"מאפייני טבלה","row":{"menu":"שורה","insertBefore":"הוספת שורה לפני","insertAfter":"הוספת שורה אחרי","deleteRow":"מחיקת שורות"},"rows":"שורות","summary":"תקציר","title":"מאפייני טבלה","toolbar":"טבלה","widthPc":"אחוז","widthPx":"פיקסלים","widthUnit":"יחידת רוחב"},"undo":{"redo":"חזרה על צעד אחרון","undo":"ביטול צעד אחרון"},"wsc":{"btnIgnore":"התעלמות","btnIgnoreAll":"התעלמות מהכל","btnReplace":"החלפה","btnReplaceAll":"החלפת הכל","btnUndo":"החזרה","changeTo":"שינוי ל","errorLoading":"שגיאה בהעלאת השירות: %s.","ieSpellDownload":"בודק האיות לא מותקן, האם להורידו?","manyChanges":"בדיקות איות הסתיימה: %1 מילים שונו","noChanges":"בדיקות איות הסתיימה: לא שונתה אף מילה","noMispell":"בדיקות איות הסתיימה: לא נמצאו שגיאות כתיב","noSuggestions":"- אין הצעות -","notAvailable":"לא נמצא שירות זמין.","notInDic":"לא נמצא במילון","oneChange":"בדיקות איות הסתיימה: שונתה מילה אחת","progress":"בודק האיות בתהליך בדיקה....","title":"בדיקת איות","toolbar":"בדיקת איות"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/hi.js b/theme/bootstrap/plugins/ckeditor/lang/hi.js new file mode 100644 index 0000000..d8d0ce8 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/hi.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['hi']={"editor":"रिच टेक्स्ट एडिटर","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"मदद के लिये ALT 0 दबाए","browseServer":"सर्वर ब्राउज़ करें","url":"URL","protocol":"प्रोटोकॉल","upload":"अपलोड","uploadSubmit":"इसे सर्वर को भेजें","image":"तस्वीर","flash":"फ़्लैश","form":"फ़ॉर्म","checkbox":"चॅक बॉक्स","radio":"रेडिओ बटन","textField":"टेक्स्ट फ़ील्ड","textarea":"टेक्स्ट एरिया","hiddenField":"गुप्त फ़ील्ड","button":"बटन","select":"चुनाव फ़ील्ड","imageButton":"तस्वीर बटन","notSet":"<सॅट नहीं>","id":"Id","name":"नाम","langDir":"भाषा लिखने की दिशा","langDirLtr":"बायें से दायें (LTR)","langDirRtl":"दायें से बायें (RTL)","langCode":"भाषा कोड","longDescr":"अधिक विवरण के लिए URL","cssClass":"स्टाइल-शीट क्लास","advisoryTitle":"परामर्श शीर्शक","cssStyle":"स्टाइल","ok":"ठीक है","cancel":"रद्द करें","close":"Close","preview":"प्रीव्यू","resize":"Resize","generalTab":"सामान्य","advancedTab":"ऍड्वान्स्ड","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"You have changed some options. Are you sure you want to close the dialog window?","options":"Options","target":"टार्गेट","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"बायें से दायें (LTR)","langDirRTL":"दायें से बायें (RTL)","styles":"स्टाइल","cssClasses":"स्टाइल-शीट क्लास","width":"चौड़ाई","height":"ऊँचाई","align":"ऍलाइन","alignLeft":"दायें","alignRight":"दायें","alignCenter":"बीच में","alignTop":"ऊपर","alignMiddle":"मध्य","alignBottom":"नीचे","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"बोल्ड","italic":"इटैलिक","strike":"स्ट्राइक थ्रू","subscript":"अधोलेख","superscript":"अभिलेख","underline":"रेखांकण"},"blockquote":{"toolbar":"ब्लॉक-कोट"},"clipboard":{"copy":"कॉपी","copyError":"आपके ब्राआउज़र की सुरक्षा सॅटिन्ग्स ने कॉपी करने की अनुमति नहीं प्रदान की है। (Ctrl/Cmd+C) का प्रयोग करें।","cut":"कट","cutError":"आपके ब्राउज़र की सुरक्षा सॅटिन्ग्स ने कट करने की अनुमति नहीं प्रदान की है। (Ctrl/Cmd+X) का प्रयोग करें।","paste":"पेस्ट","pasteArea":"Paste Area","pasteMsg":"Ctrl/Cmd+V का प्रयोग करके पेस्ट करें और ठीक है करें.","securityMsg":"आपके ब्राउज़र की सुरक्षा आपके ब्राउज़र की सुरKश सैटिंग के कारण, एडिटर आपके क्लिपबोर्ड डेटा को नहीं पा सकता है. आपको उसे इस विन्डो में दोबारा पेस्ट करना होगा.","title":"पेस्ट"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"एडिटर टूलबार"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"फ़ॉर्मैट","panelTitle":"फ़ॉर्मैट","tag_address":"पता","tag_div":"शीर्षक (DIV)","tag_h1":"शीर्षक 1","tag_h2":"शीर्षक 2","tag_h3":"शीर्षक 3","tag_h4":"शीर्षक 4","tag_h5":"शीर्षक 5","tag_h6":"शीर्षक 6","tag_p":"साधारण","tag_pre":"फ़ॉर्मैटॅड"},"horizontalrule":{"toolbar":"हॉरिज़ॉन्टल रेखा इन्सर्ट करें"},"image":{"alertUrl":"तस्वीर का URL टाइप करें ","alt":"वैकल्पिक टेक्स्ट","border":"बॉर्डर","btnUpload":"इसे सर्वर को भेजें","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"हॉरिज़ॉन्टल स्पेस","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"तस्वीर की जानकारी","linkTab":"लिंक","lockRatio":"लॉक अनुपात","menu":"तस्वीर प्रॉपर्टीज़","resetSize":"रीसॅट साइज़","title":"तस्वीर प्रॉपर्टीज़","titleButton":"तस्वीर बटन प्रॉपर्टीज़","upload":"अपलोड","urlMissing":"Image source URL is missing.","vSpace":"वर्टिकल स्पेस","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"इन्डॅन्ट बढ़ायें","outdent":"इन्डॅन्ट कम करें"},"fakeobjects":{"anchor":"ऐंकर इन्सर्ट/संपादन","flash":"Flash Animation","hiddenfield":"गुप्त फ़ील्ड","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"ऍक्सॅस की","advanced":"ऍड्वान्स्ड","advisoryContentType":"परामर्श कन्टॅन्ट प्रकार","advisoryTitle":"परामर्श शीर्शक","anchor":{"toolbar":"ऐंकर इन्सर्ट/संपादन","menu":"ऐंकर प्रॉपर्टीज़","title":"ऐंकर प्रॉपर्टीज़","name":"ऐंकर का नाम","errorName":"ऐंकर का नाम टाइप करें","remove":"Remove Anchor"},"anchorId":"ऍलीमॅन्ट Id से","anchorName":"ऐंकर नाम से","charset":"लिंक रिसोर्स करॅक्टर सॅट","cssClasses":"स्टाइल-शीट क्लास","emailAddress":"ई-मेल पता","emailBody":"संदेश","emailSubject":"संदेश विषय","id":"Id","info":"लिंक ","langCode":"भाषा लिखने की दिशा","langDir":"भाषा लिखने की दिशा","langDirLTR":"बायें से दायें (LTR)","langDirRTL":"दायें से बायें (RTL)","menu":"लिंक संपादन","name":"नाम","noAnchors":"(डॉक्यूमॅन्ट में ऐंकर्स की संख्या)","noEmail":"ई-मेल पता टाइप करें","noUrl":"लिंक URL टाइप करें","other":"<अन्य>","popupDependent":"डिपेन्डॅन्ट (Netscape)","popupFeatures":"पॉप-अप विन्डो फ़ीचर्स","popupFullScreen":"फ़ुल स्क्रीन (IE)","popupLeft":"बायीं तरफ","popupLocationBar":"लोकेशन बार","popupMenuBar":"मॅन्यू बार","popupResizable":"Resizable","popupScrollBars":"स्क्रॉल बार","popupStatusBar":"स्टेटस बार","popupToolbar":"टूल बार","popupTop":"दायीं तरफ","rel":"Relationship","selectAnchor":"ऐंकर चुनें","styles":"स्टाइल","tabIndex":"टैब इन्डॅक्स","target":"टार्गेट","targetFrame":"<फ़्रेम>","targetFrameName":"टार्गेट फ़्रेम का नाम","targetPopup":"<पॉप-अप विन्डो>","targetPopupName":"पॉप-अप विन्डो का नाम","title":"लिंक","toAnchor":"इस पेज का ऐंकर","toEmail":"ई-मेल","toUrl":"URL","toolbar":"लिंक इन्सर्ट/संपादन","type":"लिंक प्रकार","unlink":"लिंक हटायें","upload":"अपलोड"},"list":{"bulletedlist":"बुलॅट सूची","numberedlist":"अंकीय सूची"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"मेक्सिमाईज़","minimize":"मिनिमाईज़"},"pastetext":{"button":"पेस्ट (सादा टॅक्स्ट)","title":"पेस्ट (सादा टॅक्स्ट)"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"पेस्ट (वर्ड से)","toolbar":"पेस्ट (वर्ड से)"},"removeformat":{"toolbar":"फ़ॉर्मैट हटायें"},"sourcearea":{"toolbar":"सोर्स"},"specialchar":{"options":"Special Character Options","title":"विशेष करॅक्टर चुनें","toolbar":"विशेष करॅक्टर इन्सर्ट करें"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"स्टाइल","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"बॉर्डर साइज़","caption":"शीर्षक","cell":{"menu":"खाना","insertBefore":"पहले सैल डालें","insertAfter":"बाद में सैल डालें","deleteCell":"सैल डिलीट करें","merge":"सैल मिलायें","mergeRight":"बाँया विलय","mergeDown":"नीचे विलय करें","splitHorizontal":"सैल को क्षैतिज स्थिति में विभाजित करें","splitVertical":"सैल को लम्बाकार में विभाजित करें","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"सैल पैडिंग","cellSpace":"सैल अंतर","column":{"menu":"कालम","insertBefore":"पहले कालम डालें","insertAfter":"बाद में कालम डालें","deleteColumn":"कालम डिलीट करें"},"columns":"कालम","deleteTable":"टेबल डिलीट करें","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"टेबल प्रॉपर्टीज़","row":{"menu":"पंक्ति","insertBefore":"पहले पंक्ति डालें","insertAfter":"बाद में पंक्ति डालें","deleteRow":"पंक्तियाँ डिलीट करें"},"rows":"पंक्तियाँ","summary":"सारांश","title":"टेबल प्रॉपर्टीज़","toolbar":"टेबल","widthPc":"प्रतिशत","widthPx":"पिक्सैल","widthUnit":"width unit"},"undo":{"redo":"रीडू","undo":"अन्डू"},"wsc":{"btnIgnore":"इग्नोर","btnIgnoreAll":"सभी इग्नोर करें","btnReplace":"रिप्लेस","btnReplaceAll":"सभी रिप्लेस करें","btnUndo":"अन्डू","changeTo":"इसमें बदलें","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"स्पॅल-चॅकर इन्स्टाल नहीं किया गया है। क्या आप इसे डाउनलोड करना चाहेंगे?","manyChanges":"वर्तनी की जाँच : %1 शब्द बदले गये","noChanges":"वर्तनी की जाँच :कोई शब्द नहीं बदला गया","noMispell":"वर्तनी की जाँच : कोई गलत वर्तनी (स्पॅलिंग) नहीं पाई गई","noSuggestions":"- कोई सुझाव नहीं -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"शब्दकोश में नहीं","oneChange":"वर्तनी की जाँच : एक शब्द बदला गया","progress":"वर्तनी की जाँच (स्पॅल-चॅक) जारी है...","title":"Spell Check","toolbar":"वर्तनी (स्पेलिंग) जाँच"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/hr.js b/theme/bootstrap/plugins/ckeditor/lang/hr.js new file mode 100644 index 0000000..50ba145 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/hr.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['hr']={"editor":"Bogati uređivač teksta","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Pritisni ALT 0 za pomoć","browseServer":"Pretraži server","url":"URL","protocol":"Protokol","upload":"Pošalji","uploadSubmit":"Pošalji na server","image":"Slika","flash":"Flash","form":"Forma","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<nije postavljeno>","id":"Id","name":"Naziv","langDir":"Smjer jezika","langDirLtr":"S lijeva na desno (LTR)","langDirRtl":"S desna na lijevo (RTL)","langCode":"Kôd jezika","longDescr":"Dugački opis URL","cssClass":"Klase stilova","advisoryTitle":"Advisory naslov","cssStyle":"Stil","ok":"OK","cancel":"Poništi","close":"Zatvori","preview":"Pregledaj","resize":"Povuci za promjenu veličine","generalTab":"Općenito","advancedTab":"Napredno","validateNumberFailed":"Ova vrijednost nije broj.","confirmNewPage":"Sve napravljene promjene će biti izgubljene ukoliko ih niste snimili. Sigurno želite učitati novu stranicu?","confirmCancel":"Neke od opcija su promjenjene. Sigurno želite zatvoriti ovaj prozor?","options":"Opcije","target":"Odredište","targetNew":"Novi prozor (_blank)","targetTop":"Vršni prozor (_top)","targetSelf":"Isti prozor (_self)","targetParent":"Roditeljski prozor (_parent)","langDirLTR":"S lijeva na desno (LTR)","langDirRTL":"S desna na lijevo (RTL)","styles":"Stil","cssClasses":"Klase stilova","width":"Širina","height":"Visina","align":"Poravnanje","alignLeft":"Lijevo","alignRight":"Desno","alignCenter":"Središnje","alignTop":"Vrh","alignMiddle":"Sredina","alignBottom":"Dolje","invalidValue":"Neispravna vrijednost.","invalidHeight":"Visina mora biti broj.","invalidWidth":"Širina mora biti broj.","invalidCssLength":"Vrijednost određena za \"%1\" polje mora biti pozitivni broj sa ili bez važećih CSS mjernih jedinica (px, %, in, cm, mm, em, ex, pt ili pc).","invalidHtmlLength":"Vrijednost određena za \"%1\" polje mora biti pozitivni broj sa ili bez važećih HTML mjernih jedinica (px ili %).","invalidInlineStyle":"Vrijednost za linijski stil mora sadržavati jednu ili više definicija s formatom \"naziv:vrijednost\", odvojenih točka-zarezom.","cssLengthTooltip":"Unesite broj za vrijednost u pikselima ili broj s važećim CSS mjernim jedinicama (px, %, in, cm, mm, em, ex, pt ili pc).","unavailable":"%1<span class=\"cke_accessibility\">, nedostupno</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"O CKEditoru","help":"Provjeri $1 za pomoć.","moreInfo":"Za informacije o licencama posjetite našu web stranicu:","title":"O CKEditoru","userGuide":"Vodič za CKEditor korisnike"},"basicstyles":{"bold":"Podebljaj","italic":"Ukosi","strike":"Precrtano","subscript":"Subscript","superscript":"Superscript","underline":"Potcrtano"},"blockquote":{"toolbar":"Blockquote"},"clipboard":{"copy":"Kopiraj","copyError":"Sigurnosne postavke Vašeg pretraživača ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tipkovnici (Ctrl/Cmd+C).","cut":"Izreži","cutError":"Sigurnosne postavke Vašeg pretraživača ne dozvoljavaju operacije automatskog izrezivanja. Molimo koristite kraticu na tipkovnici (Ctrl/Cmd+X).","paste":"Zalijepi","pasteArea":"Prostor za ljepljenje","pasteMsg":"Molimo zaljepite unutar doljnjeg okvira koristeći tipkovnicu (<STRONG>Ctrl/Cmd+V</STRONG>) i kliknite <STRONG>OK</STRONG>.","securityMsg":"Zbog sigurnosnih postavki Vašeg pretraživača, editor nema direktan pristup Vašem međuspremniku. Potrebno je ponovno zalijepiti tekst u ovaj prozor.","title":"Zalijepi"},"contextmenu":{"options":"Opcije izbornika"},"toolbar":{"toolbarCollapse":"Smanji alatnu traku","toolbarExpand":"Proširi alatnu traku","toolbarGroups":{"document":"Dokument","clipboard":"Međuspremnik/Poništi","editing":"Uređivanje","forms":"Forme","basicstyles":"Osnovni stilovi","paragraph":"Paragraf","links":"Veze","insert":"Umetni","styles":"Stilovi","colors":"Boje","tools":"Alatke"},"toolbars":"Alatne trake uređivača teksta"},"elementspath":{"eleLabel":"Putanja elemenata","eleTitle":"%1 element"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatirano"},"horizontalrule":{"toolbar":"Ubaci vodoravnu liniju"},"image":{"alertUrl":"Unesite URL slike","alt":"Alternativni tekst","border":"Okvir","btnUpload":"Pošalji na server","button2Img":"Želite li promijeniti odabrani gumb u jednostavnu sliku?","hSpace":"HSpace","img2Button":"Želite li promijeniti odabranu sliku u gumb?","infoTab":"Info slike","linkTab":"Link","lockRatio":"Zaključaj odnos","menu":"Svojstva slika","resetSize":"Obriši veličinu","title":"Svojstva slika","titleButton":"Image Button svojstva","upload":"Pošalji","urlMissing":"Nedostaje URL slike.","vSpace":"VSpace","validateBorder":"Okvir mora biti cijeli broj.","validateHSpace":"HSpace mora biti cijeli broj","validateVSpace":"VSpace mora biti cijeli broj."},"indent":{"indent":"Pomakni udesno","outdent":"Pomakni ulijevo"},"fakeobjects":{"anchor":"Sidro","flash":"Flash animacija","hiddenfield":"Sakriveno polje","iframe":"IFrame","unknown":"Nepoznati objekt"},"link":{"acccessKey":"Pristupna tipka","advanced":"Napredno","advisoryContentType":"Advisory vrsta sadržaja","advisoryTitle":"Advisory naslov","anchor":{"toolbar":"Ubaci/promijeni sidro","menu":"Svojstva sidra","title":"Svojstva sidra","name":"Ime sidra","errorName":"Molimo unesite ime sidra","remove":"Ukloni sidro"},"anchorId":"Po Id elementa","anchorName":"Po nazivu sidra","charset":"Kodna stranica povezanih resursa","cssClasses":"Stylesheet klase","emailAddress":"E-Mail adresa","emailBody":"Sadržaj poruke","emailSubject":"Naslov","id":"Id","info":"Link Info","langCode":"Smjer jezika","langDir":"Smjer jezika","langDirLTR":"S lijeva na desno (LTR)","langDirRTL":"S desna na lijevo (RTL)","menu":"Promijeni link","name":"Naziv","noAnchors":"(Nema dostupnih sidra)","noEmail":"Molimo upišite e-mail adresu","noUrl":"Molimo upišite URL link","other":"<drugi>","popupDependent":"Ovisno (Netscape)","popupFeatures":"Mogućnosti popup prozora","popupFullScreen":"Cijeli ekran (IE)","popupLeft":"Lijeva pozicija","popupLocationBar":"Traka za lokaciju","popupMenuBar":"Izborna traka","popupResizable":"Promjenjiva veličina","popupScrollBars":"Scroll traka","popupStatusBar":"Statusna traka","popupToolbar":"Traka s alatima","popupTop":"Gornja pozicija","rel":"Veza","selectAnchor":"Odaberi sidro","styles":"Stil","tabIndex":"Tab Indeks","target":"Meta","targetFrame":"<okvir>","targetFrameName":"Ime ciljnog okvira","targetPopup":"<popup prozor>","targetPopupName":"Naziv popup prozora","title":"Link","toAnchor":"Sidro na ovoj stranici","toEmail":"E-Mail","toUrl":"URL","toolbar":"Ubaci/promijeni link","type":"Link vrsta","unlink":"Ukloni link","upload":"Pošalji"},"list":{"bulletedlist":"Obična lista","numberedlist":"Brojčana lista"},"magicline":{"title":"Ubaci paragraf ovdje"},"maximize":{"maximize":"Povećaj","minimize":"Smanji"},"pastetext":{"button":"Zalijepi kao čisti tekst","title":"Zalijepi kao čisti tekst"},"pastefromword":{"confirmCleanup":"Tekst koji želite zalijepiti čini se da je kopiran iz Worda. Želite li prije očistiti tekst?","error":"Nije moguće očistiti podatke za ljepljenje zbog interne greške","title":"Zalijepi iz Worda","toolbar":"Zalijepi iz Worda"},"removeformat":{"toolbar":"Ukloni formatiranje"},"sourcearea":{"toolbar":"Kôd"},"specialchar":{"options":"Opcije specijalnih znakova","title":"Odaberite posebni karakter","toolbar":"Ubaci posebne znakove"},"scayt":{"about":"O SCAYT","aboutTab":"O SCAYT","addWord":"Dodaj riječ","allCaps":"Ignoriraj riječi s velikim slovima","dic_create":"Napravi","dic_delete":"Obriši","dic_field_name":"Naziv riječnika","dic_info":"Na početku se korisnički Riječnik sprema u Cookie. Nažalost, veličina im je ograničena. Kada korisnički Riječnik naraste preko te veličine, Riječnik će biti smješten na naš server. Kako bi se korisnički Riječnik spremio na naš server morate odabrati naziv Vašeg Riječnika. Ukoliko ste već prije spremali Riječnik na naše servere, unesite naziv Riječnika i pritisnite na Povrati.","dic_rename":"Promijeni naziv","dic_restore":"Povrati","dictionariesTab":"Rječnici","disable":"Onemogući SCAYT","emptyDic":"Naziv rječnika ne smije biti prazno.","enable":"Omogući SCAYT","ignore":"Zanemari","ignoreAll":"Zanemari sve","ignoreDomainNames":"Ignoriraj nazive domena","langs":"Jezici","languagesTab":"Jezici","mixedCase":"Ignoriraj riječi s miješanim slovima","mixedWithDigits":"Ignoriraj riječi s brojevima","moreSuggestions":"Više prijedloga","opera_title":"Nije podržano u Operi","options":"Opcije","optionsTab":"Opcije","title":"Provjeri pravopis tijekom tipkanja (SCAYT)","toggle":"Omoguću/Onemogući SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Stilovi formatiranja","panelTitle1":"Block stilovi","panelTitle2":"Inline stilovi","panelTitle3":"Object stilovi"},"table":{"border":"Veličina okvira","caption":"Naslov","cell":{"menu":"Ćelija","insertBefore":"Ubaci ćeliju prije","insertAfter":"Ubaci ćeliju poslije","deleteCell":"Izbriši ćelije","merge":"Spoji ćelije","mergeRight":"Spoji desno","mergeDown":"Spoji dolje","splitHorizontal":"Podijeli ćeliju vodoravno","splitVertical":"Podijeli ćeliju okomito","title":"Svojstva ćelije","cellType":"Vrsta ćelije","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Prelazak u novi red","hAlign":"Vodoravno poravnanje","vAlign":"Okomito poravnanje","alignBaseline":"Osnovna linija","bgColor":"Boja pozadine","borderColor":"Boja ruba","data":"Podatak","header":"Zaglavlje","yes":"Da","no":"ne","invalidWidth":"Širina ćelije mora biti broj.","invalidHeight":"Visina ćelije mora biti broj.","invalidRowSpan":"Rows span mora biti cijeli broj.","invalidColSpan":"Columns span mora biti cijeli broj.","chooseColor":"Odaberi"},"cellPad":"Razmak ćelija","cellSpace":"Prostornost ćelija","column":{"menu":"Kolona","insertBefore":"Ubaci kolonu prije","insertAfter":"Ubaci kolonu poslije","deleteColumn":"Izbriši kolone"},"columns":"Kolona","deleteTable":"Izbriši tablicu","headers":"Zaglavlje","headersBoth":"Oba","headersColumn":"Prva kolona","headersNone":"Ništa","headersRow":"Prvi red","invalidBorder":"Debljina ruba mora biti broj.","invalidCellPadding":"Razmak ćelija mora biti broj.","invalidCellSpacing":"Prostornost ćelija mora biti broj.","invalidCols":"Broj kolona mora biti broj veći od 0.","invalidHeight":"Visina tablice mora biti broj.","invalidRows":"Broj redova mora biti broj veći od 0.","invalidWidth":"Širina tablice mora biti broj.","menu":"Svojstva tablice","row":{"menu":"Red","insertBefore":"Ubaci red prije","insertAfter":"Ubaci red poslije","deleteRow":"Izbriši redove"},"rows":"Redova","summary":"Sažetak","title":"Svojstva tablice","toolbar":"Tablica","widthPc":"postotaka","widthPx":"piksela","widthUnit":"jedinica širine"},"undo":{"redo":"Ponovi","undo":"Poništi"},"wsc":{"btnIgnore":"Zanemari","btnIgnoreAll":"Zanemari sve","btnReplace":"Zamijeni","btnReplaceAll":"Zamijeni sve","btnUndo":"Vrati","changeTo":"Promijeni u","errorLoading":"Greška učitavanja aplikacije: %s.","ieSpellDownload":"Provjera pravopisa nije instalirana. Želite li skinuti provjeru pravopisa?","manyChanges":"Provjera završena: Promijenjeno %1 riječi","noChanges":"Provjera završena: Nije napravljena promjena","noMispell":"Provjera završena: Nema grešaka","noSuggestions":"-Nema preporuke-","notAvailable":"Žao nam je, ali usluga trenutno nije dostupna.","notInDic":"Nije u rječniku","oneChange":"Provjera završena: Jedna riječ promjenjena","progress":"Provjera u tijeku...","title":"Provjera pravopisa","toolbar":"Provjeri pravopis"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/hu.js b/theme/bootstrap/plugins/ckeditor/lang/hu.js new file mode 100644 index 0000000..6b28bba --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/hu.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['hu']={"editor":"HTML szerkesztő","editorPanel":"Rich Text szerkesztő panel","common":{"editorHelp":"Segítségért nyomjon ALT 0","browseServer":"Böngészés a szerveren","url":"Hivatkozás","protocol":"Protokoll","upload":"Feltöltés","uploadSubmit":"Küldés a szerverre","image":"Kép","flash":"Flash","form":"Űrlap","checkbox":"Jelölőnégyzet","radio":"Választógomb","textField":"Szövegmező","textarea":"Szövegterület","hiddenField":"Rejtettmező","button":"Gomb","select":"Legördülő lista","imageButton":"Képgomb","notSet":"<nincs beállítva>","id":"Azonosító","name":"Név","langDir":"Írás iránya","langDirLtr":"Balról jobbra","langDirRtl":"Jobbról balra","langCode":"Nyelv kódja","longDescr":"Részletes leírás webcíme","cssClass":"Stíluskészlet","advisoryTitle":"Súgócimke","cssStyle":"Stílus","ok":"Rendben","cancel":"Mégsem","close":"Bezárás","preview":"Előnézet","resize":"Húzza az átméretezéshez","generalTab":"Általános","advancedTab":"További opciók","validateNumberFailed":"A mezőbe csak számokat írhat.","confirmNewPage":"Minden nem mentett változás el fog veszni! Biztosan be szeretné tölteni az oldalt?","confirmCancel":"Az űrlap tartalma megváltozott, ám a változásokat nem rögzítette. Biztosan be szeretné zárni az űrlapot?","options":"Beállítások","target":"Cél","targetNew":"Új ablak (_blank)","targetTop":"Legfelső ablak (_top)","targetSelf":"Aktuális ablakban (_self)","targetParent":"Szülő ablak (_parent)","langDirLTR":"Balról jobbra (LTR)","langDirRTL":"Jobbról balra (RTL)","styles":"Stílus","cssClasses":"Stíluslap osztály","width":"Szélesség","height":"Magasság","align":"Igazítás","alignLeft":"Bal","alignRight":"Jobbra","alignCenter":"Középre","alignTop":"Tetejére","alignMiddle":"Középre","alignBottom":"Aljára","invalidValue":"Érvénytelen érték.","invalidHeight":"A magasság mezőbe csak számokat írhat.","invalidWidth":"A szélesség mezőbe csak számokat írhat.","invalidCssLength":"\"%1\"-hez megadott érték csakis egy pozitív szám lehet, esetleg egy érvényes CSS egységgel megjelölve(px, %, in, cm, mm, em, ex, pt vagy pc).","invalidHtmlLength":"\"%1\"-hez megadott érték csakis egy pozitív szám lehet, esetleg egy érvényes HTML egységgel megjelölve(px vagy %).","invalidInlineStyle":"Az inline stílusnak megadott értéknek tartalmaznia kell egy vagy több rekordot a \"name : value\" formátumban, pontosvesszővel elválasztva.","cssLengthTooltip":"Adjon meg egy számot értéknek pixelekben vagy egy számot érvényes CSS mértékegységben (px, %, in, cm, mm, em, ex, pt, vagy pc).","unavailable":"%1<span class=\"cke_accessibility\">, nem elérhető</span>"},"about":{"copy":"Copyright &copy; $1. Minden jog fenntartva.","dlgTitle":"CKEditor névjegy","help":"Itt találsz segítséget: $1","moreInfo":"Licenszelési információkért kérjük látogassa meg weboldalunkat:","title":"CKEditor névjegy","userGuide":"CKEditor Felhasználói útmutató"},"basicstyles":{"bold":"Félkövér","italic":"Dőlt","strike":"Áthúzott","subscript":"Alsó index","superscript":"Felső index","underline":"Aláhúzott"},"blockquote":{"toolbar":"Idézet blokk"},"clipboard":{"copy":"Másolás","copyError":"A böngésző biztonsági beállításai nem engedélyezik a szerkesztőnek, hogy végrehajtsa a másolás műveletet. Használja az alábbi billentyűkombinációt (Ctrl/Cmd+X).","cut":"Kivágás","cutError":"A böngésző biztonsági beállításai nem engedélyezik a szerkesztőnek, hogy végrehajtsa a kivágás műveletet. Használja az alábbi billentyűkombinációt (Ctrl/Cmd+X).","paste":"Beillesztés","pasteArea":"Beszúrás mező","pasteMsg":"Másolja be az alábbi mezőbe a <STRONG>Ctrl/Cmd+V</STRONG> billentyűk lenyomásával, majd nyomjon <STRONG>Rendben</STRONG>-t.","securityMsg":"A böngésző biztonsági beállításai miatt a szerkesztő nem képes hozzáférni a vágólap adataihoz. Illeszd be újra ebben az ablakban.","title":"Beillesztés"},"contextmenu":{"options":"Helyi menü opciók"},"toolbar":{"toolbarCollapse":"Eszköztár összecsukása","toolbarExpand":"Eszköztár szétnyitása","toolbarGroups":{"document":"Dokumentum","clipboard":"Vágólap/Visszavonás","editing":"Szerkesztés","forms":"Űrlapok","basicstyles":"Alapstílusok","paragraph":"Bekezdés","links":"Hivatkozások","insert":"Beszúrás","styles":"Stílusok","colors":"Színek","tools":"Eszközök"},"toolbars":"Szerkesztő Eszköztár"},"elementspath":{"eleLabel":"Elem utak","eleTitle":"%1 elem"},"format":{"label":"Formátum","panelTitle":"Formátum","tag_address":"Címsor","tag_div":"Bekezdés (DIV)","tag_h1":"Fejléc 1","tag_h2":"Fejléc 2","tag_h3":"Fejléc 3","tag_h4":"Fejléc 4","tag_h5":"Fejléc 5","tag_h6":"Fejléc 6","tag_p":"Normál","tag_pre":"Formázott"},"horizontalrule":{"toolbar":"Elválasztóvonal beillesztése"},"image":{"alertUrl":"Töltse ki a kép webcímét","alt":"Buborék szöveg","border":"Keret","btnUpload":"Küldés a szerverre","button2Img":"A kiválasztott képgombból sima képet szeretne csinálni?","hSpace":"Vízsz. táv","img2Button":"A kiválasztott képből képgombot szeretne csinálni?","infoTab":"Alaptulajdonságok","linkTab":"Hivatkozás","lockRatio":"Arány megtartása","menu":"Kép tulajdonságai","resetSize":"Eredeti méret","title":"Kép tulajdonságai","titleButton":"Képgomb tulajdonságai","upload":"Feltöltés","urlMissing":"Hiányzik a kép URL-je","vSpace":"Függ. táv","validateBorder":"A keret méretének egész számot kell beírni!","validateHSpace":"Vízszintes távolságnak egész számot kell beírni!","validateVSpace":"Függőleges távolságnak egész számot kell beírni!"},"indent":{"indent":"Behúzás növelése","outdent":"Behúzás csökkentése"},"fakeobjects":{"anchor":"Horgony","flash":"Flash animáció","hiddenfield":"Rejtett mezõ","iframe":"IFrame","unknown":"Ismeretlen objektum"},"link":{"acccessKey":"Billentyűkombináció","advanced":"További opciók","advisoryContentType":"Súgó tartalomtípusa","advisoryTitle":"Súgócimke","anchor":{"toolbar":"Horgony beillesztése/szerkesztése","menu":"Horgony tulajdonságai","title":"Horgony tulajdonságai","name":"Horgony neve","errorName":"Kérem adja meg a horgony nevét","remove":"Horgony eltávolítása"},"anchorId":"Azonosító szerint","anchorName":"Horgony név szerint","charset":"Hivatkozott tartalom kódlapja","cssClasses":"Stíluskészlet","emailAddress":"E-Mail cím","emailBody":"Üzenet","emailSubject":"Üzenet tárgya","id":"Id","info":"Alaptulajdonságok","langCode":"Írás iránya","langDir":"Írás iránya","langDirLTR":"Balról jobbra","langDirRTL":"Jobbról balra","menu":"Hivatkozás módosítása","name":"Név","noAnchors":"(Nincs horgony a dokumentumban)","noEmail":"Adja meg az E-Mail címet","noUrl":"Adja meg a hivatkozás webcímét","other":"<más>","popupDependent":"Szülőhöz kapcsolt (csak Netscape)","popupFeatures":"Felugró ablak jellemzői","popupFullScreen":"Teljes képernyő (csak IE)","popupLeft":"Bal pozíció","popupLocationBar":"Címsor","popupMenuBar":"Menü sor","popupResizable":"Átméretezés","popupScrollBars":"Gördítősáv","popupStatusBar":"Állapotsor","popupToolbar":"Eszköztár","popupTop":"Felső pozíció","rel":"Kapcsolat típusa","selectAnchor":"Horgony választása","styles":"Stílus","tabIndex":"Tabulátor index","target":"Tartalom megjelenítése","targetFrame":"<keretben>","targetFrameName":"Keret neve","targetPopup":"<felugró ablakban>","targetPopupName":"Felugró ablak neve","title":"Hivatkozás tulajdonságai","toAnchor":"Horgony az oldalon","toEmail":"E-Mail","toUrl":"URL","toolbar":"Hivatkozás beillesztése/módosítása","type":"Hivatkozás típusa","unlink":"Hivatkozás törlése","upload":"Feltöltés"},"list":{"bulletedlist":"Felsorolás","numberedlist":"Számozás"},"magicline":{"title":"Szúrja be a bekezdést ide"},"maximize":{"maximize":"Teljes méret","minimize":"Kis méret"},"pastetext":{"button":"Beillesztés formázatlan szövegként","title":"Beillesztés formázatlan szövegként"},"pastefromword":{"confirmCleanup":"Úgy tűnik a beillesztett szöveget Word-ből másolt át. Meg szeretné tisztítani a szöveget? (ajánlott)","error":"Egy belső hiba miatt nem sikerült megtisztítani a szöveget","title":"Beillesztés Word-ből","toolbar":"Beillesztés Word-ből"},"removeformat":{"toolbar":"Formázás eltávolítása"},"sourcearea":{"toolbar":"Forráskód"},"specialchar":{"options":"Speciális karakter opciók","title":"Speciális karakter választása","toolbar":"Speciális karakter beillesztése"},"scayt":{"about":"SCAYT névjegy","aboutTab":"Névjegy","addWord":"Szó hozzáadása","allCaps":"Nagybetűs szavak kihagyása","dic_create":"Létrehozás","dic_delete":"Törlés","dic_field_name":"Szótár neve","dic_info":"Kezdetben a felhasználói szótár böngésző sütiben tárolódik. Azonban a sütik maximális mérete korlátozott. Amikora a szótár akkora lesz, hogy már sütiben nem lehet tárolni, akkor a szótárat tárolhatja a szerveren is. Ehhez egy nevet kell megadni a szótárhoz. Amennyiben már van szerveren tárolt szótára, adja meg a nevét és kattintson a visszaállítás gombra.","dic_rename":"Átnevezés","dic_restore":"Visszaállítás","dictionariesTab":"Szótár","disable":"SCAYT letiltása","emptyDic":"A szótár nevét meg kell adni.","enable":"SCAYT engedélyezése","ignore":"Kihagy","ignoreAll":"Összes kihagyása","ignoreDomainNames":"Domain nevek kihagyása","langs":"Nyelvek","languagesTab":"Nyelvek","mixedCase":"Kis és nagybetűt is tartalmazó szavak kihagyása","mixedWithDigits":"Számokat tartalmazó szavak kihagyása","moreSuggestions":"További javaslatok","opera_title":"Az Opera nem támogatja","options":"Beállítások","optionsTab":"Beállítások","title":"Helyesírás ellenőrzés gépelés közben","toggle":"SCAYT kapcsolása","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stílus","panelTitle":"Formázási stílusok","panelTitle1":"Blokk stílusok","panelTitle2":"Inline stílusok","panelTitle3":"Objektum stílusok"},"table":{"border":"Szegélyméret","caption":"Felirat","cell":{"menu":"Cella","insertBefore":"Beszúrás balra","insertAfter":"Beszúrás jobbra","deleteCell":"Cellák törlése","merge":"Cellák egyesítése","mergeRight":"Cellák egyesítése jobbra","mergeDown":"Cellák egyesítése lefelé","splitHorizontal":"Cellák szétválasztása vízszintesen","splitVertical":"Cellák szétválasztása függőlegesen","title":"Cella tulajdonságai","cellType":"Cella típusa","rowSpan":"Függőleges egyesítés","colSpan":"Vízszintes egyesítés","wordWrap":"Hosszú sorok törése","hAlign":"Vízszintes igazítás","vAlign":"Függőleges igazítás","alignBaseline":"Alapvonalra","bgColor":"Háttér színe","borderColor":"Keret színe","data":"Adat","header":"Fejléc","yes":"Igen","no":"Nem","invalidWidth":"A szélesség mezőbe csak számokat írhat.","invalidHeight":"A magasság mezőbe csak számokat írhat.","invalidRowSpan":"A függőleges egyesítés mezőbe csak számokat írhat.","invalidColSpan":"A vízszintes egyesítés mezőbe csak számokat írhat.","chooseColor":"Válasszon"},"cellPad":"Cella belső margó","cellSpace":"Cella térköz","column":{"menu":"Oszlop","insertBefore":"Beszúrás balra","insertAfter":"Beszúrás jobbra","deleteColumn":"Oszlopok törlése"},"columns":"Oszlopok","deleteTable":"Táblázat törlése","headers":"Fejlécek","headersBoth":"Mindkettő","headersColumn":"Első oszlop","headersNone":"Nincsenek","headersRow":"Első sor","invalidBorder":"A szegélyméret mezőbe csak számokat írhat.","invalidCellPadding":"A cella belső margó mezőbe csak számokat írhat.","invalidCellSpacing":"A cella térköz mezőbe csak számokat írhat.","invalidCols":"Az oszlopok számának nagyobbnak kell lenni mint 0.","invalidHeight":"A magasság mezőbe csak számokat írhat.","invalidRows":"A sorok számának nagyobbnak kell lenni mint 0.","invalidWidth":"A szélesség mezőbe csak számokat írhat.","menu":"Táblázat tulajdonságai","row":{"menu":"Sor","insertBefore":"Beszúrás fölé","insertAfter":"Beszúrás alá","deleteRow":"Sorok törlése"},"rows":"Sorok","summary":"Leírás","title":"Táblázat tulajdonságai","toolbar":"Táblázat","widthPc":"százalék","widthPx":"képpont","widthUnit":"Szélesség egység"},"undo":{"redo":"Ismétlés","undo":"Visszavonás"},"wsc":{"btnIgnore":"Kihagyja","btnIgnoreAll":"Mindet kihagyja","btnReplace":"Csere","btnReplaceAll":"Összes cseréje","btnUndo":"Visszavonás","changeTo":"Módosítás","errorLoading":"Hiba a szolgáltatás host betöltése közben: %s.","ieSpellDownload":"A helyesírás-ellenőrző nincs telepítve. Szeretné letölteni most?","manyChanges":"Helyesírás-ellenőrzés kész: %1 szó cserélve","noChanges":"Helyesírás-ellenőrzés kész: Nincs változtatott szó","noMispell":"Helyesírás-ellenőrzés kész: Nem találtam hibát","noSuggestions":"Nincs javaslat","notAvailable":"Sajnálom, de a szolgáltatás jelenleg nem elérhető.","notInDic":"Nincs a szótárban","oneChange":"Helyesírás-ellenőrzés kész: Egy szó cserélve","progress":"Helyesírás-ellenőrzés folyamatban...","title":"Helyesírás ellenörző","toolbar":"Helyesírás-ellenőrzés"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/id.js b/theme/bootstrap/plugins/ckeditor/lang/id.js new file mode 100644 index 0000000..6c932eb --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/id.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['id']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Tekan ALT 0 untuk bantuan.","browseServer":"Jelajah Server","url":"URL","protocol":"Protokol","upload":"Unggah","uploadSubmit":"Kirim ke Server","image":"Gambar","flash":"Flash","form":"Formulir","checkbox":"Kotak Cek","radio":"Tombol Radio","textField":"Kolom Teks","textarea":"Area Teks","hiddenField":"Kolom Tersembunyi","button":"Tombol","select":"Kolom Seleksi","imageButton":"Tombol Gambar","notSet":"<tidak diatur>","id":"Id","name":"Nama","langDir":"Arah Bahasa","langDirLtr":"Kiri ke Kanan (LTR)","langDirRtl":"Kanan ke Kiri","langCode":"Kode Bahasa","longDescr":"Deskripsi URL Panjang","cssClass":"Kelas Stylesheet","advisoryTitle":"Penasehat Judul","cssStyle":"Gaya","ok":"OK","cancel":"Batal","close":"Tutup","preview":"Pratinjau","resize":"Ubah ukuran","generalTab":"Umum","advancedTab":"Advanced","validateNumberFailed":"Nilai ini tidak sebuah angka","confirmNewPage":"Semua perubahan yang tidak disimpan di konten ini akan hilang. Apakah anda yakin ingin memuat halaman baru?","confirmCancel":"Beberapa opsi telah berubah. Apakah anda yakin ingin menutup dialog?","options":"Opsi","target":"Sasaran","targetNew":"Jendela Baru (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Jendela yang Sama (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Kiri ke Kanan (LTR)","langDirRTL":"Kanan ke Kiri (RTL)","styles":"Gaya","cssClasses":"Kelas Stylesheet","width":"Lebar","height":"Tinggi","align":"Penjajaran","alignLeft":"Kiri","alignRight":"Kanan","alignCenter":"Tengah","alignTop":"Atas","alignMiddle":"Tengah","alignBottom":"Bawah","invalidValue":"Nilai tidak sah.","invalidHeight":"Tinggi harus sebuah angka.","invalidWidth":"Lebar harus sebuah angka.","invalidCssLength":"Nilai untuk \"%1\" harus sebuah angkat positif dengan atau tanpa pengukuran unit CSS yang sah (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Nilai yang dispesifikasian untuk kolom \"%1\" harus sebuah angka positif dengan atau tanpa sebuah unit pengukuran HTML (px atau %) yang valid.","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Masukkan sebuah angka untuk sebuah nilai dalam pixel atau sebuah angka dengan unit CSS yang sah (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, tidak tersedia</span>"},"about":{"copy":"Hak cipta &copy; $1. All rights reserved.","dlgTitle":"Tentang CKEditor","help":"Cel $1 untuk bantuan.","moreInfo":"Untuk informasi lisensi silahkan kunjungi web site kami:","title":"Tentang CKEditor","userGuide":"Petunjuk Pengguna CKEditor"},"basicstyles":{"bold":"Huruf Tebal","italic":"Huruf Miring","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Garis Bawah"},"blockquote":{"toolbar":"Kutipan Blok"},"clipboard":{"copy":"Salin","copyError":"Pengaturan keamanan peramban anda tidak mengizinkan editor untuk mengeksekusi operasi menyalin secara otomatis. Mohon gunakan papan tuts (Ctrl/Cmd+C)","cut":"Potong","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"Tempel","pasteArea":"Area Tempel","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Tempel"},"contextmenu":{"options":"Opsi Konteks Pilihan"},"toolbar":{"toolbarCollapse":"Ciutkan Toolbar","toolbarExpand":"Bentangkan Toolbar","toolbarGroups":{"document":"Dokumen","clipboard":"Papan klip / Kembalikan perlakuan","editing":"Sunting","forms":"Formulir","basicstyles":"Gaya Dasar","paragraph":"Paragraf","links":"Tautan","insert":"Sisip","styles":"Gaya","colors":"Warna","tools":"Alat"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"Bentuk","panelTitle":"Bentuk Paragraf","tag_address":"Alamat","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Membentuk"},"horizontalrule":{"toolbar":"Sisip Garis Horisontal"},"image":{"alertUrl":"Mohon tulis URL gambar","alt":"Teks alternatif","border":"Batas","btnUpload":"Kirim ke Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Info Gambar","linkTab":"Tautan","lockRatio":"Lock Ratio","menu":"Image Properties","resetSize":"Reset Size","title":"Image Properties","titleButton":"Image Button Properties","upload":"Unggah","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Tingkatkan Lekuk","outdent":"Kurangi Lekuk"},"fakeobjects":{"anchor":"Anchor","flash":"Animasi Flash","hiddenfield":"Kolom Tersembunyi","iframe":"IFrame","unknown":"Obyek Tak Dikenal"},"link":{"acccessKey":"Access Key","advanced":"Advanced","advisoryContentType":"Advisory Content Type","advisoryTitle":"Penasehat Judul","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"Kelas Stylesheet","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"Id","info":"Link Info","langCode":"Kode Bahasa","langDir":"Arah Bahasa","langDirLTR":"Kiri ke Kanan (LTR)","langDirRTL":"Kanan ke Kiri (RTL)","menu":"Edit Link","name":"Nama","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"Gaya","tabIndex":"Tab Index","target":"Sasaran","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"Tautan","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"Tautan","type":"Link Type","unlink":"Unlink","upload":"Unggah"},"list":{"bulletedlist":"Sisip/Hapus Daftar Bullet","numberedlist":"Sisip/Hapus Daftar Bernomor"},"magicline":{"title":"Masukkan paragraf disini"},"maximize":{"maximize":"Memperbesar","minimize":"Memperkecil"},"pastetext":{"button":"Tempel sebagai teks polos","title":"Tempel sebagai Teks Polos"},"pastefromword":{"confirmCleanup":"Teks yang ingin anda tempel sepertinya di salin dari Word. Apakah anda mau membersihkannya sebelum menempel?","error":"Tidak mungkin membersihkan data yang ditempel dikerenakan kesalahan internal","title":"Tempel dari Word","toolbar":"Tempel dari Word"},"removeformat":{"toolbar":"Hapus Format"},"sourcearea":{"toolbar":"Sumber"},"specialchar":{"options":"Opsi spesial karakter","title":"Pilih spesial karakter","toolbar":"Sisipkan spesial karakter"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Gaya","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Ukuran batas","caption":"Judul halaman","cell":{"menu":"Sel","insertBefore":"Sisip Sel Sebelum","insertAfter":"Sisip Sel Setelah","deleteCell":"Hapus Sel","merge":"Gabungkan Sel","mergeRight":"Gabungkan ke Kanan","mergeDown":"Gabungkan ke Bawah","splitHorizontal":"Pisahkan Sel Secara Horisontal","splitVertical":"Pisahkan Sel Secara Vertikal","title":"Properti Sel","cellType":"Tipe Sel","rowSpan":"Rentang antar baris","colSpan":"Rentang antar kolom","wordWrap":"Word Wrap","hAlign":"Jajaran Horisontal","vAlign":"Jajaran Vertikal","alignBaseline":"Dasar","bgColor":"Warna Latar Belakang","borderColor":"Warna Batasan","data":"Data","header":"Header","yes":"Ya","no":"Tidak","invalidWidth":"Lebar sel harus sebuah angka.","invalidHeight":"Tinggi sel harus sebuah angka","invalidRowSpan":"Rentang antar baris harus angka seluruhnya.","invalidColSpan":"Rentang antar kolom harus angka seluruhnya","chooseColor":"Pilih"},"cellPad":"Sel spasi dalam","cellSpace":"Spasi antar sel","column":{"menu":"Kolom","insertBefore":"Sisip Kolom Sebelum","insertAfter":"Sisip Kolom Sesudah","deleteColumn":"Hapus Kolom"},"columns":"Kolom","deleteTable":"Hapus Tabel","headers":"Headers","headersBoth":"Keduanya","headersColumn":"Kolom pertama","headersNone":"Tidak ada","headersRow":"Baris Pertama","invalidBorder":"Ukuran batasan harus sebuah angka","invalidCellPadding":"'Spasi dalam' sel harus angka positif.","invalidCellSpacing":"Spasi antar sel harus angka positif.","invalidCols":"Jumlah kolom harus sebuah angka lebih besar dari 0","invalidHeight":"Tinggi tabel harus sebuah angka.","invalidRows":"Jumlah barus harus sebuah angka dan lebih besar dari 0.","invalidWidth":"Lebar tabel harus sebuah angka.","menu":"Properti Tabel","row":{"menu":"Baris","insertBefore":"Sisip Baris Sebelum","insertAfter":"Sisip Baris Sesudah","deleteRow":"Hapus Baris"},"rows":"Baris","summary":"Intisari","title":"Properti Tabel","toolbar":"Tabe","widthPc":"persen","widthPx":"piksel","widthUnit":"lebar satuan"},"undo":{"redo":"Kembali lakukan","undo":"Batalkan perlakuan"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/is.js b/theme/bootstrap/plugins/ckeditor/lang/is.js new file mode 100644 index 0000000..b085dd7 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/is.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['is']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Fletta í skjalasafni","url":"Vefslóð","protocol":"Samskiptastaðall","upload":"Senda upp","uploadSubmit":"Hlaða upp","image":"Setja inn mynd","flash":"Flash","form":"Setja inn innsláttarform","checkbox":"Setja inn hökunarreit","radio":"Setja inn valhnapp","textField":"Setja inn textareit","textarea":"Setja inn textasvæði","hiddenField":"Setja inn falið svæði","button":"Setja inn hnapp","select":"Setja inn lista","imageButton":"Setja inn myndahnapp","notSet":"<ekkert valið>","id":"Auðkenni","name":"Nafn","langDir":"Lesstefna","langDirLtr":"Frá vinstri til hægri (LTR)","langDirRtl":"Frá hægri til vinstri (RTL)","langCode":"Tungumálakóði","longDescr":"Nánari lýsing","cssClass":"Stílsniðsflokkur","advisoryTitle":"Titill","cssStyle":"Stíll","ok":"Í lagi","cancel":"Hætta við","close":"Close","preview":"Forskoða","resize":"Resize","generalTab":"Almennt","advancedTab":"Tæknilegt","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"You have changed some options. Are you sure you want to close the dialog window?","options":"Options","target":"Mark","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Frá vinstri til hægri (LTR)","langDirRTL":"Frá hægri til vinstri (RTL)","styles":"Stíll","cssClasses":"Stílsniðsflokkur","width":"Breidd","height":"Hæð","align":"Jöfnun","alignLeft":"Vinstri","alignRight":"Hægri","alignCenter":"Miðjað","alignTop":"Efst","alignMiddle":"Miðjuð","alignBottom":"Neðst","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Feitletrað","italic":"Skáletrað","strike":"Yfirstrikað","subscript":"Niðurskrifað","superscript":"Uppskrifað","underline":"Undirstrikað"},"blockquote":{"toolbar":"Inndráttur"},"clipboard":{"copy":"Afrita","copyError":"Öryggisstillingar vafrans þíns leyfa ekki afritun texta með músaraðgerð. Notaðu lyklaborðið í afrita (Ctrl/Cmd+C).","cut":"Klippa","cutError":"Öryggisstillingar vafrans þíns leyfa ekki klippingu texta með músaraðgerð. Notaðu lyklaborðið í klippa (Ctrl/Cmd+X).","paste":"Líma","pasteArea":"Paste Area","pasteMsg":"Límdu í svæðið hér að neðan og (<STRONG>Ctrl/Cmd+V</STRONG>) og smelltu á <STRONG>OK</STRONG>.","securityMsg":"Vegna öryggisstillinga í vafranum þínum fær ritillinn ekki beinan aðgang að klippuborðinu. Þú verður að líma innihaldið aftur inn í þennan glugga.","title":"Líma"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"Stílsnið","panelTitle":"Stílsnið","tag_address":"Vistfang","tag_div":"Venjulegt (DIV)","tag_h1":"Fyrirsögn 1","tag_h2":"Fyrirsögn 2","tag_h3":"Fyrirsögn 3","tag_h4":"Fyrirsögn 4","tag_h5":"Fyrirsögn 5","tag_h6":"Fyrirsögn 6","tag_p":"Venjulegt letur","tag_pre":"Forsniðið"},"horizontalrule":{"toolbar":"Lóðrétt lína"},"image":{"alertUrl":"Sláðu inn slóðina að myndinni","alt":"Baklægur texti","border":"Rammi","btnUpload":"Hlaða upp","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"Vinstri bil","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Almennt","linkTab":"Stikla","lockRatio":"Festa stærðarhlutfall","menu":"Eigindi myndar","resetSize":"Reikna stærð","title":"Eigindi myndar","titleButton":"Eigindi myndahnapps","upload":"Hlaða upp","urlMissing":"Image source URL is missing.","vSpace":"Hægri bil","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Minnka inndrátt","outdent":"Auka inndrátt"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Skammvalshnappur","advanced":"Tæknilegt","advisoryContentType":"Tegund innihalds","advisoryTitle":"Titill","anchor":{"toolbar":"Stofna/breyta kaflamerki","menu":"Eigindi kaflamerkis","title":"Eigindi kaflamerkis","name":"Nafn bókamerkis","errorName":"Sláðu inn nafn bókamerkis!","remove":"Remove Anchor"},"anchorId":"Eftir auðkenni einingar","anchorName":"Eftir akkerisnafni","charset":"Táknróf","cssClasses":"Stílsniðsflokkur","emailAddress":"Netfang","emailBody":"Meginmál","emailSubject":"Efni","id":"Auðkenni","info":"Almennt","langCode":"Lesstefna","langDir":"Lesstefna","langDirLTR":"Frá vinstri til hægri (LTR)","langDirRTL":"Frá hægri til vinstri (RTL)","menu":"Breyta stiklu","name":"Nafn","noAnchors":"<Engin bókamerki á skrá>","noEmail":"Sláðu inn netfang!","noUrl":"Sláðu inn veffang stiklunnar!","other":"<annar>","popupDependent":"Háð venslum (Netscape)","popupFeatures":"Eigindi sprettiglugga","popupFullScreen":"Heilskjár (IE)","popupLeft":"Fjarlægð frá vinstri","popupLocationBar":"Fanglína","popupMenuBar":"Vallína","popupResizable":"Resizable","popupScrollBars":"Skrunstikur","popupStatusBar":"Stöðustika","popupToolbar":"Verkfærastika","popupTop":"Fjarlægð frá efri brún","rel":"Relationship","selectAnchor":"Veldu akkeri","styles":"Stíll","tabIndex":"Raðnúmer innsláttarreits","target":"Mark","targetFrame":"<rammi>","targetFrameName":"Nafn markglugga","targetPopup":"<sprettigluggi>","targetPopupName":"Nafn sprettiglugga","title":"Stikla","toAnchor":"Bókamerki á þessari síðu","toEmail":"Netfang","toUrl":"Vefslóð","toolbar":"Stofna/breyta stiklu","type":"Stikluflokkur","unlink":"Fjarlægja stiklu","upload":"Senda upp"},"list":{"bulletedlist":"Punktalisti","numberedlist":"Númeraður listi"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Líma sem ósniðinn texta","title":"Líma sem ósniðinn texta"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Líma úr Word","toolbar":"Líma úr Word"},"removeformat":{"toolbar":"Fjarlægja snið"},"sourcearea":{"toolbar":"Kóði"},"specialchar":{"options":"Special Character Options","title":"Velja tákn","toolbar":"Setja inn merki"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stílflokkur","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Breidd ramma","caption":"Titill","cell":{"menu":"Reitur","insertBefore":"Skjóta inn reiti fyrir aftan","insertAfter":"Skjóta inn reiti fyrir framan","deleteCell":"Fella reit","merge":"Sameina reiti","mergeRight":"Sameina til hægri","mergeDown":"Sameina niður á við","splitHorizontal":"Kljúfa reit lárétt","splitVertical":"Kljúfa reit lóðrétt","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Reitaspássía","cellSpace":"Bil milli reita","column":{"menu":"Dálkur","insertBefore":"Skjóta inn dálki vinstra megin","insertAfter":"Skjóta inn dálki hægra megin","deleteColumn":"Fella dálk"},"columns":"Dálkar","deleteTable":"Fella töflu","headers":"Fyrirsagnir","headersBoth":"Hvort tveggja","headersColumn":"Fyrsti dálkur","headersNone":"Engar","headersRow":"Fyrsta röð","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Eigindi töflu","row":{"menu":"Röð","insertBefore":"Skjóta inn röð fyrir ofan","insertAfter":"Skjóta inn röð fyrir neðan","deleteRow":"Eyða röð"},"rows":"Raðir","summary":"Áfram","title":"Eigindi töflu","toolbar":"Tafla","widthPc":"prósent","widthPx":"myndeindir","widthUnit":"width unit"},"undo":{"redo":"Hætta við afturköllun","undo":"Afturkalla"},"wsc":{"btnIgnore":"Hunsa","btnIgnoreAll":"Hunsa allt","btnReplace":"Skipta","btnReplaceAll":"Skipta öllu","btnUndo":"Til baka","changeTo":"Tillaga","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Villuleit ekki sett upp.<br>Viltu setja hana upp?","manyChanges":"Villuleit lokið: %1 orðum breytt","noChanges":"Villuleit lokið: Engu orði breytt","noMispell":"Villuleit lokið: Engin villa fannst","noSuggestions":"- engar tillögur -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Ekki í orðabókinni","oneChange":"Villuleit lokið: Einu orði breytt","progress":"Villuleit í gangi...","title":"Spell Check","toolbar":"Villuleit"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/it.js b/theme/bootstrap/plugins/ckeditor/lang/it.js new file mode 100644 index 0000000..fb8c77d --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/it.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['it']={"editor":"Rich Text Editor","editorPanel":"Pannello Rich Text Editor","common":{"editorHelp":"Premi ALT 0 per aiuto","browseServer":"Cerca sul server","url":"URL","protocol":"Protocollo","upload":"Carica","uploadSubmit":"Invia al server","image":"Immagine","flash":"Oggetto Flash","form":"Modulo","checkbox":"Checkbox","radio":"Radio Button","textField":"Campo di testo","textarea":"Area di testo","hiddenField":"Campo nascosto","button":"Bottone","select":"Menu di selezione","imageButton":"Bottone immagine","notSet":"<non impostato>","id":"Id","name":"Nome","langDir":"Direzione scrittura","langDirLtr":"Da Sinistra a Destra (LTR)","langDirRtl":"Da Destra a Sinistra (RTL)","langCode":"Codice Lingua","longDescr":"URL descrizione estesa","cssClass":"Nome classe CSS","advisoryTitle":"Titolo","cssStyle":"Stile","ok":"OK","cancel":"Annulla","close":"Chiudi","preview":"Anteprima","resize":"Trascina per ridimensionare","generalTab":"Generale","advancedTab":"Avanzate","validateNumberFailed":"Il valore inserito non è un numero.","confirmNewPage":"Ogni modifica non salvata sarà persa. Sei sicuro di voler caricare una nuova pagina?","confirmCancel":"Alcune delle opzioni sono state cambiate. Sei sicuro di voler chiudere la finestra di dialogo?","options":"Opzioni","target":"Destinazione","targetNew":"Nuova finestra (_blank)","targetTop":"Finestra in primo piano (_top)","targetSelf":"Stessa finestra (_self)","targetParent":"Finestra Padre (_parent)","langDirLTR":"Da sinistra a destra (LTR)","langDirRTL":"Da destra a sinistra (RTL)","styles":"Stile","cssClasses":"Classi di stile","width":"Larghezza","height":"Altezza","align":"Allineamento","alignLeft":"Sinistra","alignRight":"Destra","alignCenter":"Centrato","alignTop":"In Alto","alignMiddle":"Centrato","alignBottom":"In Basso","invalidValue":"Valore non valido.","invalidHeight":"L'altezza dev'essere un numero","invalidWidth":"La Larghezza dev'essere un numero","invalidCssLength":"Il valore indicato per il campo \"%1\" deve essere un numero positivo con o senza indicazione di una valida unità di misura per le classi CSS (px, %, in, cm, mm, em, ex, pt, o pc).","invalidHtmlLength":"Il valore indicato per il campo \"%1\" deve essere un numero positivo con o senza indicazione di una valida unità di misura per le pagine HTML (px o %).","invalidInlineStyle":"Il valore specificato per lo stile inline deve consistere in una o più tuple con il formato di \"name : value\", separati da semicolonne.","cssLengthTooltip":"Inserisci un numero per il valore in pixel oppure un numero con una valida unità CSS (px, %, in, cm, mm, ex, pt, o pc).","unavailable":"%1<span class=\"cke_accessibility\">, non disponibile</span>"},"about":{"copy":"Copyright &copy; $1. Tutti i diritti riservati.","dlgTitle":"Riguardo CKEditor","help":"Vedi $1 per l'aiuto.","moreInfo":"Per le informazioni sulla licenza si prega di visitare il nostro sito:","title":"Riguardo CKEditor","userGuide":"Guida Utente CKEditor"},"basicstyles":{"bold":"Grassetto","italic":"Corsivo","strike":"Barrato","subscript":"Pedice","superscript":"Apice","underline":"Sottolineato"},"blockquote":{"toolbar":"Citazione"},"clipboard":{"copy":"Copia","copyError":"Le impostazioni di sicurezza del browser non permettono di copiare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+C).","cut":"Taglia","cutError":"Le impostazioni di sicurezza del browser non permettono di tagliare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+X).","paste":"Incolla","pasteArea":"Incolla","pasteMsg":"Incolla il testo all'interno dell'area sottostante usando la scorciatoia di tastiere (<STRONG>Ctrl/Cmd+V</STRONG>) e premi <STRONG>OK</STRONG>.","securityMsg":"A causa delle impostazioni di sicurezza del browser,l'editor non è in grado di accedere direttamente agli appunti. E' pertanto necessario incollarli di nuovo in questa finestra.","title":"Incolla"},"contextmenu":{"options":"Opzioni del menù contestuale"},"toolbar":{"toolbarCollapse":"Minimizza Toolbar","toolbarExpand":"Espandi Toolbar","toolbarGroups":{"document":"Documento","clipboard":"Copia negli appunti/Annulla","editing":"Modifica","forms":"Form","basicstyles":"Stili di base","paragraph":"Paragrafo","links":"Link","insert":"Inserisci","styles":"Stili","colors":"Colori","tools":"Strumenti"},"toolbars":"Editor toolbar"},"elementspath":{"eleLabel":"Percorso degli elementi","eleTitle":"%1 elemento"},"format":{"label":"Formato","panelTitle":"Formato","tag_address":"Indirizzo","tag_div":"Paragrafo (DIV)","tag_h1":"Titolo 1","tag_h2":"Titolo 2","tag_h3":"Titolo 3","tag_h4":"Titolo 4","tag_h5":"Titolo 5","tag_h6":"Titolo 6","tag_p":"Normale","tag_pre":"Formattato"},"horizontalrule":{"toolbar":"Inserisci riga orizzontale"},"image":{"alertUrl":"Devi inserire l'URL per l'immagine","alt":"Testo alternativo","border":"Bordo","btnUpload":"Invia al server","button2Img":"Vuoi trasformare il bottone immagine selezionato in un'immagine semplice?","hSpace":"HSpace","img2Button":"Vuoi trasferomare l'immagine selezionata in un bottone immagine?","infoTab":"Informazioni immagine","linkTab":"Collegamento","lockRatio":"Blocca rapporto","menu":"Proprietà immagine","resetSize":"Reimposta dimensione","title":"Proprietà immagine","titleButton":"Proprietà bottone immagine","upload":"Carica","urlMissing":"Manca l'URL dell'immagine.","vSpace":"VSpace","validateBorder":"Il campo Bordo deve essere un numero intero.","validateHSpace":"Il campo HSpace deve essere un numero intero.","validateVSpace":"Il campo VSpace deve essere un numero intero."},"indent":{"indent":"Aumenta rientro","outdent":"Riduci rientro"},"fakeobjects":{"anchor":"Ancora","flash":"Animazione Flash","hiddenfield":"Campo Nascosto","iframe":"IFrame","unknown":"Oggetto sconosciuto"},"link":{"acccessKey":"Scorciatoia da tastiera","advanced":"Avanzate","advisoryContentType":"Tipo della risorsa collegata","advisoryTitle":"Titolo","anchor":{"toolbar":"Inserisci/Modifica Ancora","menu":"Proprietà ancora","title":"Proprietà ancora","name":"Nome ancora","errorName":"Inserici il nome dell'ancora","remove":"Rimuovi l'ancora"},"anchorId":"Per id elemento","anchorName":"Per Nome","charset":"Set di caretteri della risorsa collegata","cssClasses":"Nome classe CSS","emailAddress":"Indirizzo E-Mail","emailBody":"Corpo del messaggio","emailSubject":"Oggetto del messaggio","id":"Id","info":"Informazioni collegamento","langCode":"Direzione scrittura","langDir":"Direzione scrittura","langDirLTR":"Da Sinistra a Destra (LTR)","langDirRTL":"Da Destra a Sinistra (RTL)","menu":"Modifica collegamento","name":"Nome","noAnchors":"(Nessuna ancora disponibile nel documento)","noEmail":"Devi inserire un'indirizzo e-mail","noUrl":"Devi inserire l'URL del collegamento","other":"<altro>","popupDependent":"Dipendente (Netscape)","popupFeatures":"Caratteristiche finestra popup","popupFullScreen":"A tutto schermo (IE)","popupLeft":"Posizione da sinistra","popupLocationBar":"Barra degli indirizzi","popupMenuBar":"Barra del menu","popupResizable":"Ridimensionabile","popupScrollBars":"Barre di scorrimento","popupStatusBar":"Barra di stato","popupToolbar":"Barra degli strumenti","popupTop":"Posizione dall'alto","rel":"Relazioni","selectAnchor":"Scegli Ancora","styles":"Stile","tabIndex":"Ordine di tabulazione","target":"Destinazione","targetFrame":"<riquadro>","targetFrameName":"Nome del riquadro di destinazione","targetPopup":"<finestra popup>","targetPopupName":"Nome finestra popup","title":"Collegamento","toAnchor":"Ancora nel testo","toEmail":"E-Mail","toUrl":"URL","toolbar":"Collegamento","type":"Tipo di Collegamento","unlink":"Elimina collegamento","upload":"Carica"},"list":{"bulletedlist":"Inserisci/Rimuovi Elenco Puntato","numberedlist":"Inserisci/Rimuovi Elenco Numerato"},"magicline":{"title":"Inserisci paragrafo qui"},"maximize":{"maximize":"Massimizza","minimize":"Minimizza"},"pastetext":{"button":"Incolla come testo semplice","title":"Incolla come testo semplice"},"pastefromword":{"confirmCleanup":"Il testo da incollare sembra provenire da Word. Desideri pulirlo prima di incollare?","error":"Non è stato possibile eliminare il testo incollato a causa di un errore interno.","title":"Incolla da Word","toolbar":"Incolla da Word"},"removeformat":{"toolbar":"Elimina formattazione"},"sourcearea":{"toolbar":"Sorgente"},"specialchar":{"options":"Opzioni carattere speciale","title":"Seleziona carattere speciale","toolbar":"Inserisci carattere speciale"},"scayt":{"about":"About COMS","aboutTab":"Info","addWord":"Aggiungi Parola","allCaps":"Ignora Parole in maiuscolo","dic_create":"Crea","dic_delete":"Cancella","dic_field_name":"Nome del dizionario","dic_info":"Inizialmente il dizionario utente è memorizzato in un Cookie. I Cookie però hanno una dimensioni massima limitata. Quando il dizionario utente creasce a tal punto da non poter più essere memorizzato in un Cookie, allora il dizionario può essere memorizzato sul nostro server. Per memorizzare il proprio dizionario personale sul nostro server, è necessario specificare un nome per il proprio dizionario. Se avete già memorizzato un dizionario, inserite il nome che gli avete dato e premete il pulsante Ripristina.","dic_rename":"Rinomina","dic_restore":"Ripristina","dictionariesTab":"Dizionari","disable":"Disabilita COMS","emptyDic":"Il nome del dizionario non può essere vuoto.","enable":"Abilita COMS","ignore":"Ignora","ignoreAll":"Ignora tutti","ignoreDomainNames":"Ignora nomi di dominio","langs":"Lingue","languagesTab":"Lingue","mixedCase":"Ignora parole con maiuscole e minuscole","mixedWithDigits":"Ignora parole con numeri","moreSuggestions":"Altri suggerimenti","opera_title":"Non supportato da Opera","options":"Opzioni","optionsTab":"Opzioni","title":"Controllo Ortografico Mentre Scrivi","toggle":"Inverti abilitazione SCOMS","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stili","panelTitle":"Stili di formattazione","panelTitle1":"Stili per blocchi","panelTitle2":"Stili in linea","panelTitle3":"Stili per oggetti"},"table":{"border":"Dimensione bordo","caption":"Intestazione","cell":{"menu":"Cella","insertBefore":"Inserisci Cella Prima","insertAfter":"Inserisci Cella Dopo","deleteCell":"Elimina celle","merge":"Unisce celle","mergeRight":"Unisci a Destra","mergeDown":"Unisci in Basso","splitHorizontal":"Dividi Cella Orizzontalmente","splitVertical":"Dividi Cella Verticalmente","title":"Proprietà della cella","cellType":"Tipo di cella","rowSpan":"Su più righe","colSpan":"Su più colonne","wordWrap":"Ritorno a capo","hAlign":"Allineamento orizzontale","vAlign":"Allineamento verticale","alignBaseline":"Linea Base","bgColor":"Colore di Sfondo","borderColor":"Colore del Bordo","data":"Dati","header":"Intestazione","yes":"Si","no":"No","invalidWidth":"La larghezza della cella dev'essere un numero.","invalidHeight":"L'altezza della cella dev'essere un numero.","invalidRowSpan":"Il numero di righe dev'essere un numero intero.","invalidColSpan":"Il numero di colonne dev'essere un numero intero.","chooseColor":"Scegli"},"cellPad":"Padding celle","cellSpace":"Spaziatura celle","column":{"menu":"Colonna","insertBefore":"Inserisci Colonna Prima","insertAfter":"Inserisci Colonna Dopo","deleteColumn":"Elimina colonne"},"columns":"Colonne","deleteTable":"Cancella Tabella","headers":"Intestazione","headersBoth":"Entrambe","headersColumn":"Prima Colonna","headersNone":"Nessuna","headersRow":"Prima Riga","invalidBorder":"La dimensione del bordo dev'essere un numero.","invalidCellPadding":"Il paging delle celle dev'essere un numero","invalidCellSpacing":"La spaziatura tra le celle dev'essere un numero.","invalidCols":"Il numero di colonne dev'essere un numero maggiore di 0.","invalidHeight":"L'altezza della tabella dev'essere un numero.","invalidRows":"Il numero di righe dev'essere un numero maggiore di 0.","invalidWidth":"La larghezza della tabella dev'essere un numero.","menu":"Proprietà tabella","row":{"menu":"Riga","insertBefore":"Inserisci Riga Prima","insertAfter":"Inserisci Riga Dopo","deleteRow":"Elimina righe"},"rows":"Righe","summary":"Indice","title":"Proprietà tabella","toolbar":"Tabella","widthPc":"percento","widthPx":"pixel","widthUnit":"unità larghezza"},"undo":{"redo":"Ripristina","undo":"Annulla"},"wsc":{"btnIgnore":"Ignora","btnIgnoreAll":"Ignora tutto","btnReplace":"Cambia","btnReplaceAll":"Cambia tutto","btnUndo":"Annulla","changeTo":"Cambia in","errorLoading":"Errore nel caricamento dell'host col servizio applicativo: %s.","ieSpellDownload":"Contollo ortografico non installato. Lo vuoi scaricare ora?","manyChanges":"Controllo ortografico completato: %1 parole cambiate","noChanges":"Controllo ortografico completato: nessuna parola cambiata","noMispell":"Controllo ortografico completato: nessun errore trovato","noSuggestions":"- Nessun suggerimento -","notAvailable":"Il servizio non è momentaneamente disponibile.","notInDic":"Non nel dizionario","oneChange":"Controllo ortografico completato: 1 parola cambiata","progress":"Controllo ortografico in corso","title":"Controllo ortografico","toolbar":"Correttore ortografico"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/ja.js b/theme/bootstrap/plugins/ckeditor/lang/ja.js new file mode 100644 index 0000000..4ee91d2 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/ja.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['ja']={"editor":"リッチテキストエディタ","editorPanel":"リッチテキストエディタパネル","common":{"editorHelp":"ヘルプは ALT 0 を押してください","browseServer":"サーバブラウザ","url":"URL","protocol":"プロトコル","upload":"アップロード","uploadSubmit":"サーバーに送信","image":"イメージ","flash":"Flash","form":"フォーム","checkbox":"チェックボックス","radio":"ラジオボタン","textField":"1行テキスト","textarea":"テキストエリア","hiddenField":"不可視フィールド","button":"ボタン","select":"選択フィールド","imageButton":"画像ボタン","notSet":"<なし>","id":"Id","name":"Name属性","langDir":"文字表記の方向","langDirLtr":"左から右 (LTR)","langDirRtl":"右から左 (RTL)","langCode":"言語コード","longDescr":"longdesc属性(長文説明)","cssClass":"スタイルシートクラス","advisoryTitle":"Title属性","cssStyle":"スタイルシート","ok":"OK","cancel":"キャンセル","close":"閉じる","preview":"プレビュー","resize":"ドラッグしてリサイズ","generalTab":"全般","advancedTab":"高度な設定","validateNumberFailed":"値が数ではありません","confirmNewPage":"変更内容を保存せず、 新しいページを開いてもよろしいでしょうか?","confirmCancel":"オプション設定を変更しました。ダイアログを閉じてもよろしいでしょうか?","options":"オプション","target":"ターゲット","targetNew":"新しいウインドウ (_blank)","targetTop":"最上部ウィンドウ (_top)","targetSelf":"同じウィンドウ (_self)","targetParent":"親ウィンドウ (_parent)","langDirLTR":"左から右 (LTR)","langDirRTL":"右から左 (RTL)","styles":"スタイル","cssClasses":"スタイルシートクラス","width":"幅","height":"高さ","align":"行揃え","alignLeft":"左","alignRight":"右","alignCenter":"中央","alignTop":"上","alignMiddle":"中央","alignBottom":"下","invalidValue":"不正な値です。","invalidHeight":"高さは数値で入力してください。","invalidWidth":"幅は数値で入力してください。","invalidCssLength":"入力された \"%1\" 項目の値は、CSSの大きさ(px, %, in, cm, mm, em, ex, pt, または pc)が正しいものである/ないに関わらず、正の値である必要があります。","invalidHtmlLength":"入力された \"%1\" 項目の値は、HTMLの大きさ(px または %)が正しいものである/ないに関わらず、正の値である必要があります。","invalidInlineStyle":"入力されたインラインスタイルの値は、\"名前 : 値\" のフォーマットのセットで、複数の場合はセミコロンで区切られている形式である必要があります。","cssLengthTooltip":"ピクセル数もしくはCSSにセットできる数値を入力してください。(px,%,in,cm,mm,em,ex,pt,or pc)","unavailable":"%1<span class=\"cke_accessibility\">, 利用不可能</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"CKEditorについて","help":"$1 のヘルプを見てください。","moreInfo":"ライセンス情報の詳細はウェブサイトにて確認してください:","title":"CKEditorについて","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"太字","italic":"斜体","strike":"打ち消し線","subscript":"下付き","superscript":"上付き","underline":"下線"},"blockquote":{"toolbar":"ブロック引用文"},"clipboard":{"copy":"コピー","copyError":"ブラウザーのセキュリティ設定によりエディタのコピー操作を自動で実行することができません。実行するには手動でキーボードの(Ctrl/Cmd+C)を使用してください。","cut":"切り取り","cutError":"ブラウザーのセキュリティ設定によりエディタの切り取り操作を自動で実行することができません。実行するには手動でキーボードの(Ctrl/Cmd+X)を使用してください。","paste":"貼り付け","pasteArea":"貼り付け場所","pasteMsg":"キーボード(<STRONG>Ctrl/Cmd+V</STRONG>)を使用して、次の入力エリア内で貼り付けて、<STRONG>OK</STRONG>を押してください。","securityMsg":"ブラウザのセキュリティ設定により、エディタはクリップボードデータに直接アクセスすることができません。このウィンドウは貼り付け操作を行う度に表示されます。","title":"貼り付け"},"contextmenu":{"options":"コンテキストメニューオプション"},"toolbar":{"toolbarCollapse":"ツールバーを閉じる","toolbarExpand":"ツールバーを開く","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"編集ツールバー"},"elementspath":{"eleLabel":"要素パス","eleTitle":"%1 要素"},"format":{"label":"書式","panelTitle":"段落の書式","tag_address":"アドレス","tag_div":"標準 (DIV)","tag_h1":"見出し 1","tag_h2":"見出し 2","tag_h3":"見出し 3","tag_h4":"見出し 4","tag_h5":"見出し 5","tag_h6":"見出し 6","tag_p":"標準","tag_pre":"書式付き"},"horizontalrule":{"toolbar":"水平線"},"image":{"alertUrl":"画像のURLを入力してください","alt":"代替テキスト","border":"枠線の幅","btnUpload":"サーバーに送信","button2Img":"選択した画像ボタンを画像に変換しますか?","hSpace":"水平間隔","img2Button":"選択した画像を画像ボタンに変換しますか?","infoTab":"画像情報","linkTab":"リンク","lockRatio":"比率を固定","menu":"画像のプロパティ","resetSize":"サイズをリセット","title":"画像のプロパティ","titleButton":"画像ボタンのプロパティ","upload":"アップロード","urlMissing":"画像のURLを入力してください。","vSpace":"垂直間隔","validateBorder":"枠線の幅は数値で入力してください。","validateHSpace":"水平間隔は数値で入力してください。","validateVSpace":"垂直間隔は数値で入力してください。"},"indent":{"indent":"インデント","outdent":"インデント解除"},"fakeobjects":{"anchor":"アンカー","flash":"Flash Animation","hiddenfield":"不可視フィールド","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"アクセスキー","advanced":"高度な設定","advisoryContentType":"Content Type属性","advisoryTitle":"Title属性","anchor":{"toolbar":"アンカー挿入/編集","menu":"アンカーの編集","title":"アンカーのプロパティ","name":"アンカー名","errorName":"アンカー名を入力してください。","remove":"アンカーを削除"},"anchorId":"エレメントID","anchorName":"アンカー名","charset":"リンク先のcharset","cssClasses":"スタイルシートクラス","emailAddress":"E-Mail アドレス","emailBody":"本文","emailSubject":"件名","id":"Id","info":"ハイパーリンク情報","langCode":"言語コード","langDir":"文字表記の方向","langDirLTR":"左から右 (LTR)","langDirRTL":"右から左 (RTL)","menu":"リンクを編集","name":"Name属性","noAnchors":"(このドキュメント内にアンカーはありません)","noEmail":"メールアドレスを入力してください。","noUrl":"リンクURLを入力してください。","other":"<その他の>","popupDependent":"開いたウィンドウに連動して閉じる (Netscape)","popupFeatures":"ポップアップウィンドウ特徴","popupFullScreen":"全画面モード(IE)","popupLeft":"左端からの座標で指定","popupLocationBar":"ロケーションバー","popupMenuBar":"メニューバー","popupResizable":"サイズ可変","popupScrollBars":"スクロールバー","popupStatusBar":"ステータスバー","popupToolbar":"ツールバー","popupTop":"上端からの座標で指定","rel":"関連リンク","selectAnchor":"アンカーを選択","styles":"スタイルシート","tabIndex":"タブインデックス","target":"ターゲット","targetFrame":"<フレーム>","targetFrameName":"ターゲットのフレーム名","targetPopup":"<ポップアップウィンドウ>","targetPopupName":"ポップアップウィンドウ名","title":"ハイパーリンク","toAnchor":"ページ内のアンカー","toEmail":"E-Mail","toUrl":"URL","toolbar":"リンク挿入/編集","type":"リンクタイプ","unlink":"リンクを削除","upload":"アップロード"},"list":{"bulletedlist":"番号無しリスト","numberedlist":"番号付きリスト"},"magicline":{"title":"ここに段落を挿入"},"maximize":{"maximize":"最大化","minimize":"最小化"},"pastetext":{"button":"プレーンテキストとして貼り付け","title":"プレーンテキストとして貼り付け"},"pastefromword":{"confirmCleanup":"貼り付けを行うテキストはワード文章からコピーされようとしています。貼り付ける前にクリーニングを行いますか?","error":"内部エラーにより貼り付けたデータをクリアできませんでした","title":"ワード文章から貼り付け","toolbar":"ワード文章から貼り付け"},"removeformat":{"toolbar":"書式を解除"},"sourcearea":{"toolbar":"ソース"},"specialchar":{"options":"特殊文字オプション","title":"特殊文字の選択","toolbar":"特殊文字を挿入"},"scayt":{"about":"SCAYTバージョン","aboutTab":"バージョン情報","addWord":"語句追加","allCaps":"全て大文字の単語を無視","dic_create":"登録","dic_delete":"削除","dic_field_name":"辞書名","dic_info":"始めユーザーディレクトリは、Cookieに保存されます。但し Cookie はサイズに制限があります。ユーザーディレクトリがCookieに保存できないサイズに到達するとディレクトリはサーバー上に保存されます。個人のディレクトリをサーバー上に保存するには、ディレクトリ名を明示する必要があります。もし既に保存されたディレクトリがある場合、その名前を入力し、元に戻すボタンを押してください。","dic_rename":"名前変更","dic_restore":"元に戻す","dictionariesTab":"辞書","disable":"SCAYT無効","emptyDic":"辞書名は必ず入力してください","enable":"SCAYT有効","ignore":"無視","ignoreAll":"すべて無視","ignoreDomainNames":"ドメイン名を無視","langs":"言語","languagesTab":"言語","mixedCase":"大文字小文字混在の単語を無視","mixedWithDigits":"数字付き単語を無視","moreSuggestions":"他の候補","opera_title":"Operaではサポートされません","options":"オプション","optionsTab":"オプション","title":"スペルチェック設定(SCAYT)","toggle":"SCAYT切替","noSuggestions":"No suggestion"},"stylescombo":{"label":"スタイル","panelTitle":"スタイル","panelTitle1":"ブロックスタイル","panelTitle2":"インラインスタイル","panelTitle3":"オブジェクトスタイル"},"table":{"border":"枠線の幅","caption":"キャプション","cell":{"menu":"セル","insertBefore":"セルを前に挿入","insertAfter":"セルを後に挿入","deleteCell":"セルを削除","merge":"セルを結合","mergeRight":"右に結合","mergeDown":"下に結合","splitHorizontal":"セルを水平方向に分割","splitVertical":"セルを垂直方向に分割","title":"セルのプロパティ","cellType":"セルの種類","rowSpan":"行の結合数","colSpan":"列の結合数","wordWrap":"単語の折り返し","hAlign":"水平方向の配置","vAlign":"垂直方向の配置","alignBaseline":"ベースライン","bgColor":"背景色","borderColor":"ボーダーカラー","data":"テーブルデータ (td)","header":"ヘッダ","yes":"はい","no":"いいえ","invalidWidth":"セル幅は数値で入力してください。","invalidHeight":"セル高さは数値で入力してください。","invalidRowSpan":"縦幅(行数)は数値で入力してください。","invalidColSpan":"横幅(列数)は数値で入力してください。","chooseColor":"色の選択"},"cellPad":"セル内間隔","cellSpace":"セル内余白","column":{"menu":"列","insertBefore":"列を左に挿入","insertAfter":"列を右に挿入","deleteColumn":"列を削除"},"columns":"列数","deleteTable":"表を削除","headers":"ヘッダ (th)","headersBoth":"両方","headersColumn":"最初の列のみ","headersNone":"なし","headersRow":"最初の行のみ","invalidBorder":"枠線の幅は数値で入力してください。","invalidCellPadding":"セル内余白は数値で入力してください。","invalidCellSpacing":"セル間余白は数値で入力してください。","invalidCols":"列数は0より大きな数値を入力してください。","invalidHeight":"高さは数値で入力してください。","invalidRows":"行数は0より大きな数値を入力してください。","invalidWidth":"幅は数値で入力してください。","menu":"表のプロパティ","row":{"menu":"行","insertBefore":"行を上に挿入","insertAfter":"行を下に挿入","deleteRow":"行を削除"},"rows":"行数","summary":"表の概要","title":"表のプロパティ","toolbar":"表","widthPc":"パーセント","widthPx":"ピクセル","widthUnit":"幅の単位"},"undo":{"redo":"やり直す","undo":"元に戻す"},"wsc":{"btnIgnore":"無視","btnIgnoreAll":"すべて無視","btnReplace":"置換","btnReplaceAll":"すべて置換","btnUndo":"やり直し","changeTo":"変更","errorLoading":"アプリケーションサービスホスト読込みエラー: %s.","ieSpellDownload":"スペルチェッカーがインストールされていません。今すぐダウンロードしますか?","manyChanges":"スペルチェック完了: %1 語句変更されました","noChanges":"スペルチェック完了: 語句は変更されませんでした","noMispell":"スペルチェック完了: スペルの誤りはありませんでした","noSuggestions":"- 該当なし -","notAvailable":"申し訳ありません、現在サービスを利用することができません","notInDic":"辞書にありません","oneChange":"スペルチェック完了: 1語句変更されました","progress":"スペルチェック処理中...","title":"スペルチェック","toolbar":"スペルチェック"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/ka.js b/theme/bootstrap/plugins/ckeditor/lang/ka.js new file mode 100644 index 0000000..b70f931 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/ka.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['ka']={"editor":"ტექსტის რედაქტორი","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"დააჭირეთ ALT 0-ს დახმარების მისაღებად","browseServer":"სერვერზე დათვალიერება","url":"URL","protocol":"პროტოკოლი","upload":"ატვირთვა","uploadSubmit":"სერვერზე გაგზავნა","image":"სურათი","flash":"Flash","form":"ფორმა","checkbox":"მონიშვნის ღილაკი","radio":"ამორჩევის ღილაკი","textField":"ტექსტური ველი","textarea":"ტექსტური არე","hiddenField":"მალული ველი","button":"ღილაკი","select":"არჩევის ველი","imageButton":"სურათიანი ღილაკი","notSet":"<არაფერი>","id":"Id","name":"სახელი","langDir":"ენის მიმართულება","langDirLtr":"მარცხნიდან მარჯვნივ (LTR)","langDirRtl":"მარჯვნიდან მარცხნივ (RTL)","langCode":"ენის კოდი","longDescr":"დიდი აღწერის URL","cssClass":"CSS კლასი","advisoryTitle":"სათაური","cssStyle":"CSS სტილი","ok":"დიახ","cancel":"გაუქმება","close":"დახურვა","preview":"გადახედვა","resize":"გაწიე ზომის შესაცვლელად","generalTab":"ინფორმაცია","advancedTab":"გაფართოებული","validateNumberFailed":"ეს მნიშვნელობა არაა რიცხვი.","confirmNewPage":"ამ დოკუმენტში ყველა ჩაუწერელი ცვლილება დაიკარგება. დარწმუნებული ხართ რომ ახალი გვერდის ჩატვირთვა გინდათ?","confirmCancel":"ზოგიერთი პარამეტრი შეცვლილია, დარწმუნებულილ ხართ რომ ფანჯრის დახურვა გსურთ?","options":"პარამეტრები","target":"გახსნის ადგილი","targetNew":"ახალი ფანჯარა (_blank)","targetTop":"ზედა ფანჯარა (_top)","targetSelf":"იგივე ფანჯარა (_self)","targetParent":"მშობელი ფანჯარა (_parent)","langDirLTR":"მარცხნიდან მარჯვნივ (LTR)","langDirRTL":"მარჯვნიდან მარცხნივ (RTL)","styles":"სტილი","cssClasses":"CSS კლასი","width":"სიგანე","height":"სიმაღლე","align":"სწორება","alignLeft":"მარცხენა","alignRight":"მარჯვენა","alignCenter":"შუა","alignTop":"ზემოთა","alignMiddle":"შუა","alignBottom":"ქვემოთა","invalidValue":"Invalid value.","invalidHeight":"სიმაღლე რიცხვით უნდა იყოს წარმოდგენილი.","invalidWidth":"სიგანე რიცხვით უნდა იყოს წარმოდგენილი.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, მიუწვდომელია</span>"},"about":{"copy":"Copyright &copy; $1. ყველა უფლება დაცულია.","dlgTitle":"CKEditor-ის შესახებ","help":"დახმარებისთვის იხილეთ $1.","moreInfo":"ლიცენზიის ინფორმაციისთვის ეწვიეთ ჩვენს საიტს:","title":"CKEditor-ის შესახებ","userGuide":"CKEditor-ის მომხმარებლის სახელმძღვანელო"},"basicstyles":{"bold":"მსხვილი","italic":"დახრილი","strike":"გადახაზული","subscript":"ინდექსი","superscript":"ხარისხი","underline":"გახაზული"},"blockquote":{"toolbar":"ციტატა"},"clipboard":{"copy":"ასლი","copyError":"თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა ასლის ოპერაციის ავტომატურად განხორციელების საშუალებას. გამოიყენეთ კლავიატურა ამისთვის (Ctrl/Cmd+C).","cut":"ამოჭრა","cutError":"თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა ამოჭრის ოპერაციის ავტომატურად განხორციელების საშუალებას. გამოიყენეთ კლავიატურა ამისთვის (Ctrl/Cmd+X).","paste":"ჩასმა","pasteArea":"ჩასმის არე","pasteMsg":"ჩასვით ამ არის შიგნით კლავიატურის გამოყენებით (<strong>Ctrl/Cmd+V</strong>) და დააჭირეთ OK-ს","securityMsg":"თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა clipboard-ის მონაცემების წვდომის უფლებას. კიდევ უნდა ჩასვათ ტექსტი ამ ფანჯარაში.","title":"ჩასმა"},"contextmenu":{"options":"კონტექსტური მენიუს პარამეტრები"},"toolbar":{"toolbarCollapse":"ხელსაწყოთა ზოლის შეწევა","toolbarExpand":"ხელსაწყოთა ზოლის გამოწევა","toolbarGroups":{"document":"დოკუმენტი","clipboard":"Clipboard/გაუქმება","editing":"რედაქტირება","forms":"ფორმები","basicstyles":"ძირითადი სტილები","paragraph":"აბზაცი","links":"ბმულები","insert":"ჩასმა","styles":"სტილები","colors":"ფერები","tools":"ხელსაწყოები"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"ელემეტის გზა","eleTitle":"%1 ელემენტი"},"format":{"label":"ფიორმატირება","panelTitle":"ფორმატირება","tag_address":"მისამართი","tag_div":"ჩვეულებრივი (DIV)","tag_h1":"სათაური 1","tag_h2":"სათაური 2","tag_h3":"სათაური 3","tag_h4":"სათაური 4","tag_h5":"სათაური 5","tag_h6":"სათაური 6","tag_p":"ჩვეულებრივი","tag_pre":"ფორმატირებული"},"horizontalrule":{"toolbar":"ჰორიზონტალური ხაზის ჩასმა"},"image":{"alertUrl":"აკრიფეთ სურათის URL","alt":"სანაცვლო ტექსტი","border":"ჩარჩო","btnUpload":"სერვერისთვის გაგზავნა","button2Img":"გსურთ არჩეული სურათიანი ღილაკის გადაქცევა ჩვეულებრივ ღილაკად?","hSpace":"ჰორიზონტალური სივრცე","img2Button":"გსურთ არჩეული ჩვეულებრივი ღილაკის გადაქცევა სურათიან ღილაკად?","infoTab":"სურათის ინფორმცია","linkTab":"ბმული","lockRatio":"პროპორციის შენარჩუნება","menu":"სურათის პარამეტრები","resetSize":"ზომის დაბრუნება","title":"სურათის პარამეტრები","titleButton":"სურათიანი ღილაკის პარამეტრები","upload":"ატვირთვა","urlMissing":"სურათის URL არაა შევსებული.","vSpace":"ვერტიკალური სივრცე","validateBorder":"ჩარჩო მთელი რიცხვი უნდა იყოს.","validateHSpace":"ჰორიზონტალური სივრცე მთელი რიცხვი უნდა იყოს.","validateVSpace":"ვერტიკალური სივრცე მთელი რიცხვი უნდა იყოს."},"indent":{"indent":"მეტად შეწევა","outdent":"ნაკლებად შეწევა"},"fakeobjects":{"anchor":"ღუზა","flash":"Flash ანიმაცია","hiddenfield":"მალული ველი","iframe":"IFrame","unknown":"უცნობი ობიექტი"},"link":{"acccessKey":"წვდომის ღილაკი","advanced":"დაწვრილებით","advisoryContentType":"შიგთავსის ტიპი","advisoryTitle":"სათაური","anchor":{"toolbar":"ღუზა","menu":"ღუზის რედაქტირება","title":"ღუზის პარამეტრები","name":"ღუზუს სახელი","errorName":"აკრიფეთ ღუზის სახელი","remove":"Remove Anchor"},"anchorId":"ელემენტის Id-თ","anchorName":"ღუზის სახელით","charset":"კოდირება","cssClasses":"CSS კლასი","emailAddress":"ელფოსტის მისამართები","emailBody":"წერილის ტექსტი","emailSubject":"წერილის სათაური","id":"Id","info":"ბმულის ინფორმაცია","langCode":"ენის კოდი","langDir":"ენის მიმართულება","langDirLTR":"მარცხნიდან მარჯვნივ (LTR)","langDirRTL":"მარჯვნიდან მარცხნივ (RTL)","menu":"ბმულის რედაქტირება","name":"სახელი","noAnchors":"(ამ დოკუმენტში ღუზა არაა)","noEmail":"აკრიფეთ ელფოსტის მისამართი","noUrl":"აკრიფეთ ბმულის URL","other":"<სხვა>","popupDependent":"დამოკიდებული (Netscape)","popupFeatures":"Popup ფანჯრის პარამეტრები","popupFullScreen":"მთელი ეკრანი (IE)","popupLeft":"მარცხენა პოზიცია","popupLocationBar":"ნავიგაციის ზოლი","popupMenuBar":"მენიუს ზოლი","popupResizable":"ცვალებადი ზომით","popupScrollBars":"გადახვევის ზოლები","popupStatusBar":"სტატუსის ზოლი","popupToolbar":"ხელსაწყოთა ზოლი","popupTop":"ზედა პოზიცია","rel":"კავშირი","selectAnchor":"აირჩიეთ ღუზა","styles":"CSS სტილი","tabIndex":"Tab-ის ინდექსი","target":"გახსნის ადგილი","targetFrame":"<frame>","targetFrameName":"Frame-ის სახელი","targetPopup":"<popup ფანჯარა>","targetPopupName":"Popup ფანჯრის სახელი","title":"ბმული","toAnchor":"ბმული ტექსტში ღუზაზე","toEmail":"ელფოსტა","toUrl":"URL","toolbar":"ბმული","type":"ბმულის ტიპი","unlink":"ბმულის მოხსნა","upload":"აქაჩვა"},"list":{"bulletedlist":"ღილიანი სია","numberedlist":"გადანომრილი სია"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"გადიდება","minimize":"დაპატარავება"},"pastetext":{"button":"მხოლოდ ტექსტის ჩასმა","title":"მხოლოდ ტექსტის ჩასმა"},"pastefromword":{"confirmCleanup":"ჩასასმელი ტექსტი ვორდიდან გადმოტანილს გავს - გინდათ მისი წინასწარ გაწმენდა?","error":"შიდა შეცდომის გამო ვერ მოხერხდა ტექსტის გაწმენდა","title":"ვორდიდან ჩასმა","toolbar":"ვორდიდან ჩასმა"},"removeformat":{"toolbar":"ფორმატირების მოხსნა"},"sourcearea":{"toolbar":"კოდები"},"specialchar":{"options":"სპეციალური სიმბოლოს პარამეტრები","title":"სპეციალური სიმბოლოს არჩევა","toolbar":"სპეციალური სიმბოლოს ჩასმა"},"scayt":{"about":"SCAYT-ის შესახებ","aboutTab":"ინფორმაცია","addWord":"სიტყვის დამატება","allCaps":"დიდი ასოებით დაწერილი სიტყვების უგულებელყოფა","dic_create":"შექმნა","dic_delete":"წაშლა","dic_field_name":"ლექსიკონის სახელი","dic_info":"თავდაპირველად მომხმარებლის ლექსიკონი ინახება Cookie-ში. თუმცა Cookie შეზღუდულია ზომაში. როცა ლექსიკონის ზომა გაიზრდება საკმაოდ ის შეიძლება შევინახოთ ჩვენს სერვერზე. ჩვენს სერვერზე ლექსიკონს შესანახად უნდა მიუთითოთ მისი სახელი. თუ უკე გაქვთ ლექსიკონი, აკრიფეთ მისი სახელი და დააჭირეთ \"დაბრუნების\" ღილაკს.","dic_rename":"გადარქმევა","dic_restore":"დაბრუნება","dictionariesTab":"ლექსიკონები","disable":"SCAYT-ის გამორთვა","emptyDic":"ლექსიკონის სიტყვა არ უნდა იყოს ცარიელი.","enable":"SCAYT-ის ჩართვა","ignore":"უგულებელყოფა","ignoreAll":"ყველას უგულებელყოფა","ignoreDomainNames":"დომენური სახელების უგულებელყოფა","langs":"ენები","languagesTab":"ენები","mixedCase":"შერეული ასოებანი სიტყვების უგულებელყოფა","mixedWithDigits":"ციფრებიანი სიტყვების უგულებელყოფა","moreSuggestions":"მეტი შემოთავაზება","opera_title":"არაა მხარდაჭერილი Opera-ს მიერ","options":"პარამეტრები","optionsTab":"პარამეტრები","title":"მართლწერის შემოწმება კრეფისას","toggle":"SCAYT-ის გადართვა","noSuggestions":"No suggestion"},"stylescombo":{"label":"სტილები","panelTitle":"ფორმატირების სტილები","panelTitle1":"არის სტილები","panelTitle2":"თანდართული სტილები","panelTitle3":"ობიექტის სტილები"},"table":{"border":"ჩარჩოს ზომა","caption":"სათაური","cell":{"menu":"უჯრა","insertBefore":"უჯრის ჩასმა მანამდე","insertAfter":"უჯრის ჩასმა მერე","deleteCell":"უჯრების წაშლა","merge":"უჯრების შეერთება","mergeRight":"შეერთება მარჯვენასთან","mergeDown":"შეერთება ქვემოთასთან","splitHorizontal":"გაყოფა ჰორიზონტალურად","splitVertical":"გაყოფა ვერტიკალურად","title":"უჯრის პარამეტრები","cellType":"უჯრის ტიპი","rowSpan":"სტრიქონების ოდენობა","colSpan":"სვეტების ოდენობა","wordWrap":"სტრიქონის გადატანა (Word Wrap)","hAlign":"ჰორიზონტალური სწორება","vAlign":"ვერტიკალური სწორება","alignBaseline":"ძირითადი ხაზის გასწვრივ","bgColor":"ფონის ფერი","borderColor":"ჩარჩოს ფერი","data":"მონაცემები","header":"სათაური","yes":"დიახ","no":"არა","invalidWidth":"უჯრის სიგანე რიცხვით უნდა იყოს წარმოდგენილი.","invalidHeight":"უჯრის სიმაღლე რიცხვით უნდა იყოს წარმოდგენილი.","invalidRowSpan":"სტრიქონების რაოდენობა მთელი რიცხვი უნდა იყოს.","invalidColSpan":"სვეტების რაოდენობა მთელი რიცხვი უნდა იყოს.","chooseColor":"არჩევა"},"cellPad":"უჯრის კიდე (padding)","cellSpace":"უჯრის სივრცე (spacing)","column":{"menu":"სვეტი","insertBefore":"სვეტის ჩამატება წინ","insertAfter":"სვეტის ჩამატება მერე","deleteColumn":"სვეტების წაშლა"},"columns":"სვეტი","deleteTable":"ცხრილის წაშლა","headers":"სათაურები","headersBoth":"ორივე","headersColumn":"პირველი სვეტი","headersNone":"არაფერი","headersRow":"პირველი სტრიქონი","invalidBorder":"ჩარჩოს ზომა რიცხვით უდნა იყოს წარმოდგენილი.","invalidCellPadding":"უჯრის კიდე (padding) რიცხვით უნდა იყოს წარმოდგენილი.","invalidCellSpacing":"უჯრის სივრცე (spacing) რიცხვით უნდა იყოს წარმოდგენილი.","invalidCols":"სვეტების რაოდენობა დადებითი რიცხვი უნდა იყოს.","invalidHeight":"ცხრილის სიმაღლე რიცხვით უნდა იყოს წარმოდგენილი.","invalidRows":"სტრიქონების რაოდენობა დადებითი რიცხვი უნდა იყოს.","invalidWidth":"ცხრილის სიგანე რიცხვით უნდა იყოს წარმოდგენილი.","menu":"ცხრილის პარამეტრები","row":{"menu":"სტრიქონი","insertBefore":"სტრიქონის ჩამატება წინ","insertAfter":"სტრიქონის ჩამატება მერე","deleteRow":"სტრიქონების წაშლა"},"rows":"სტრიქონი","summary":"შეჯამება","title":"ცხრილის პარამეტრები","toolbar":"ცხრილი","widthPc":"პროცენტი","widthPx":"წერტილი","widthUnit":"საზომი ერთეული"},"undo":{"redo":"გამეორება","undo":"გაუქმება"},"wsc":{"btnIgnore":"უგულებელყოფა","btnIgnoreAll":"ყველას უგულებელყოფა","btnReplace":"შეცვლა","btnReplaceAll":"ყველას შეცვლა","btnUndo":"გაუქმება","changeTo":"შეცვლელი","errorLoading":"სერვისის გამოძახების შეცდომა: %s.","ieSpellDownload":"მართლწერის შემოწმება არაა დაინსტალირებული. ჩამოვქაჩოთ ინტერნეტიდან?","manyChanges":"მართლწერის შემოწმება: %1 სიტყვა შეიცვალა","noChanges":"მართლწერის შემოწმება: არაფერი შეცვლილა","noMispell":"მართლწერის შემოწმება: შეცდომა არ მოიძებნა","noSuggestions":"- არაა შემოთავაზება -","notAvailable":"უკაცრავად, ეს სერვისი ამჟამად მიუწვდომელია.","notInDic":"არაა ლექსიკონში","oneChange":"მართლწერის შემოწმება: ერთი სიტყვა შეიცვალა","progress":"მიმდინარეობს მართლწერის შემოწმება...","title":"მართლწერა","toolbar":"მართლწერა"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/km.js b/theme/bootstrap/plugins/ckeditor/lang/km.js new file mode 100644 index 0000000..f6accb6 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/km.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['km']={"editor":"ឧបករណ៍សរសេរអត្ថបទសម្បូរបែប","editorPanel":"ផ្ទាំងឧបករណ៍សរសេរអត្ថបទសម្បូរបែប","common":{"editorHelp":"ចុច ALT 0 សម្រាប់ជំនួយ","browseServer":"រកមើលក្នុងម៉ាស៊ីនបម្រើ","url":"URL","protocol":"ពិធីការ","upload":"ផ្ទុកឡើង","uploadSubmit":"បញ្ជូនទៅកាន់ម៉ាស៊ីនបម្រើ","image":"រូបភាព","flash":"Flash","form":"បែបបទ","checkbox":"ប្រអប់ធីក","radio":"ប៊ូតុងមូល","textField":"វាលអត្ថបទ","textarea":"Textarea","hiddenField":"វាលកំបាំង","button":"ប៊ូតុង","select":"វាលជម្រើស","imageButton":"ប៊ូតុងរូបភាព","notSet":"<មិនកំណត់>","id":"Id","name":"ឈ្មោះ","langDir":"ទិសដៅភាសា","langDirLtr":"ពីឆ្វេងទៅស្តាំ (LTR)","langDirRtl":"ពីស្តាំទៅឆ្វេង (RTL)","langCode":"លេខកូដភាសា","longDescr":"URL អធិប្បាយវែង","cssClass":"Stylesheet Classes","advisoryTitle":"ចំណងជើងណែនាំ","cssStyle":"រចនាបថ","ok":"ព្រម","cancel":"បោះបង់","close":"បិទ","preview":"មើលជាមុន","resize":"ប្ដូរទំហំ","generalTab":"ទូទៅ","advancedTab":"កម្រិតខ្ពស់","validateNumberFailed":"តម្លៃនេះពុំមែនជាលេខទេ។","confirmNewPage":"រាល់បន្លាស់ប្ដូរនានាដែលមិនទាន់រក្សាទុកក្នុងមាតិកានេះ នឹងត្រូវបាត់បង់។ តើអ្នកពិតជាចង់ផ្ទុកទំព័រថ្មីមែនទេ?","confirmCancel":"ការកំណត់មួយចំនួនត្រូវបានផ្លាស់ប្ដូរ។ តើអ្នកពិតជាចង់បិទប្រអប់នេះមែនទេ?","options":"ការកំណត់","target":"គោលដៅ","targetNew":"វីនដូថ្មី (_blank)","targetTop":"វីនដូលើគេ (_top)","targetSelf":"វីនដូដូចគ្នា (_self)","targetParent":"វីនដូមេ (_parent)","langDirLTR":"ពីឆ្វេងទៅស្តាំ(LTR)","langDirRTL":"ពីស្តាំទៅឆ្វេង(RTL)","styles":"រចនាបថ","cssClasses":"Stylesheet Classes","width":"ទទឹង","height":"កំពស់","align":"កំណត់ទីតាំង","alignLeft":"ខាងឆ្វង","alignRight":"ខាងស្តាំ","alignCenter":"កណ្តាល","alignTop":"ខាងលើ","alignMiddle":"កណ្តាល","alignBottom":"ខាងក្រោម","invalidValue":"តម្លៃមិនត្រឹមត្រូវ។","invalidHeight":"តម្លៃកំពស់ត្រូវតែជាលេខ។","invalidWidth":"តម្លៃទទឹងត្រូវតែជាលេខ។","invalidCssLength":"តម្លៃកំណត់សម្រាប់វាល \"%1\" ត្រូវតែជាលេខវិជ្ជមាន ដោយភ្ជាប់ឬមិនភ្ជាប់ជាមួយនឹងឯកតារង្វាស់របស់ CSS (px, %, in, cm, mm, em, ex, pt ឬ pc) ។","invalidHtmlLength":"តម្លៃកំណត់សម្រាប់វាល \"%1\" ត្រូវតែជាលេខវិជ្ជមាន ដោយភ្ជាប់ឬមិនភ្ជាប់ជាមួយនឹងឯកតារង្វាស់របស់ HTML (px ឬ %) ។","invalidInlineStyle":"តម្លៃកំណត់សម្រាប់រចនាបថក្នុងតួ ត្រូវតែមានមួយឬធាតុច្រើនដោយមានទ្រង់ទ្រាយជា \"ឈ្មោះ : តម្លៃ\" ហើយញែកចេញពីគ្នាដោយចុចក្បៀស។","cssLengthTooltip":"បញ្ចូលលេខសម្រាប់តម្លៃជាភិចសែល ឬលេខដែលមានឯកតាត្រឹមត្រូវរបស់ CSS (px, %, in, cm, mm, em, ex, pt ឬ pc) ។","unavailable":"%1<span class=\"cke_accessibility\">, មិនមាន</span>"},"about":{"copy":"រក្សាសិទ្ធិ &copy; $1។ រក្សាសិទ្ធិគ្រប់បែបយ៉ាង។","dlgTitle":"អំពី CKEditor","help":"ពិនិត្យ $1 សម្រាប់ជំនួយ។","moreInfo":"សម្រាប់ព័ត៌មានអំពីអាជ្ញាបណញណ សូមមើលក្នុងគេហទំព័ររបស់យើង៖","title":"អំពី CKEditor","userGuide":"វិធីប្រើប្រាស់ CKEditor"},"basicstyles":{"bold":"ដិត","italic":"ទ្រេត","strike":"គូសបន្ទាត់ចំកណ្ដាល","subscript":"អក្សរតូចក្រោម","superscript":"អក្សរតូចលើ","underline":"គូសបន្ទាត់ក្រោម"},"blockquote":{"toolbar":"ប្លក់ពាក្យសម្រង់"},"clipboard":{"copy":"ចម្លង","copyError":"ការកំណត់សុវត្ថភាពរបស់កម្មវិធីរុករករបស់លោកអ្នក នេះមិនអាចធ្វើកម្មវិធីតាក់តែងអត្ថបទ ចំលងអត្ថបទយកដោយស្វ័យប្រវត្តបានឡើយ ។ សូមប្រើប្រាស់បន្សំ ឃីដូចនេះ (Ctrl/Cmd+C)។","cut":"កាត់យក","cutError":"ការកំណត់សុវត្ថភាពរបស់កម្មវិធីរុករករបស់លោកអ្នក នេះមិនអាចធ្វើកម្មវិធីតាក់តែងអត្ថបទ កាត់អត្ថបទយកដោយស្វ័យប្រវត្តបានឡើយ ។ សូមប្រើប្រាស់បន្សំ ឃីដូចនេះ (Ctrl/Cmd+X) ។","paste":"បិទភ្ជាប់","pasteArea":"Paste Area","pasteMsg":"សូមចំលងអត្ថបទទៅដាក់ក្នុងប្រអប់ដូចខាងក្រោមដោយប្រើប្រាស់ ឃី (<STRONG>Ctrl/Cmd+V</STRONG>) ហើយចុច <STRONG>OK</STRONG> ។","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"បិទភ្ជាប់"},"contextmenu":{"options":"ជម្រើសម៉ឺនុយបរិបទ"},"toolbar":{"toolbarCollapse":"បង្រួមរបារឧបករណ៍","toolbarExpand":"ពង្រីករបារឧបករណ៍","toolbarGroups":{"document":"ឯកសារ","clipboard":"Clipboard/មិនធ្វើវិញ","editing":"ការកែសម្រួល","forms":"បែបបទ","basicstyles":"រចនាបថមូលដ្ឋាន","paragraph":"កថាខណ្ឌ","links":"តំណ","insert":"បញ្ចូល","styles":"រចនាបថ","colors":"ពណ៌","tools":"ឧបករណ៍"},"toolbars":"របារឧបករណ៍កែសម្រួល"},"elementspath":{"eleLabel":"ទីតាំងធាតុ","eleTitle":"ធាតុ %1"},"format":{"label":"ទម្រង់","panelTitle":"ទម្រង់កថាខណ្ឌ","tag_address":"អាសយដ្ឋាន","tag_div":"ធម្មតា (DIV)","tag_h1":"ចំណងជើង 1","tag_h2":"ចំណងជើង 2","tag_h3":"ចំណងជើង 3","tag_h4":"ចំណងជើង 4","tag_h5":"ចំណងជើង 5","tag_h6":"ចំណងជើង 6","tag_p":"ធម្មតា","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"បន្ថែមបន្ទាត់ផ្តេក"},"image":{"alertUrl":"សូមសរសេរងាស័យដ្ឋានរបស់រូបភាព","alt":"អត្ថបទជំនួស","border":"ស៊ុម","btnUpload":"បញ្ជូនទៅកាន់ម៉ាស៊ីនផ្តល់សេវា","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"គំលាតទទឹង","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"ពត៌មានអំពីរូបភាព","linkTab":"ឈ្នាប់","lockRatio":"អត្រាឡុក","menu":"ការកំណត់រូបភាព","resetSize":"កំណត់ទំហំឡើងវិញ","title":"ការកំណត់រូបភាព","titleButton":"ការកំណត់ប៉ូតុនរូបភាព","upload":"ទាញយក","urlMissing":"ខ្វះ URL ប្រភពរូបភាព។","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"បន្ថែមការចូលបន្ទាត់","outdent":"បន្ថយការចូលបន្ទាត់"},"fakeobjects":{"anchor":"យុថ្កា","flash":"Flash មានចលនា","hiddenfield":"វាលកំបាំង","iframe":"IFrame","unknown":"វត្ថុមិនស្គាល់"},"link":{"acccessKey":"សោរចូល","advanced":"កម្រិតខ្ពស់","advisoryContentType":"ប្រភេទអត្ថបទប្រឹក្សា","advisoryTitle":"ចំណងជើងប្រឹក្សា","anchor":{"toolbar":"យុថ្កា","menu":"កែយុថ្កា","title":"លក្ខណៈយុថ្កា","name":"ឈ្មោះយុថ្កា","errorName":"សូមបញ្ចូលឈ្មោះយុថ្កា","remove":"ដកយុថ្កាចេញ"},"anchorId":"តាម ID ធាតុ","anchorName":"តាមឈ្មោះយុថ្កា","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"អាសយដ្ឋានអ៊ីមែល","emailBody":"តួអត្ថបទ","emailSubject":"ប្រធានបទសារ","id":"Id","info":"ព័ត៌មានពីតំណ","langCode":"កូដភាសា","langDir":"ទិសដៅភាសា","langDirLTR":"ពីឆ្វេងទៅស្តាំ(LTR)","langDirRTL":"ពីស្តាំទៅឆ្វេង(RTL)","menu":"កែតំណ","name":"ឈ្មោះ","noAnchors":"(មិនមានយុថ្កានៅក្នុងឯកសារអត្ថថបទទេ)","noEmail":"សូមបញ្ចូលអាសយដ្ឋានអ៊ីមែល","noUrl":"សូមបញ្ចូលតំណ URL","other":"<ផ្សេងទៀត>","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"ពេញអេក្រង់ (IE)","popupLeft":"ទីតាំងខាងឆ្វេង","popupLocationBar":"របារទីតាំង","popupMenuBar":"របារម៉ឺនុយ","popupResizable":"អាចប្ដូរទំហំ","popupScrollBars":"របាររំកិល","popupStatusBar":"របារស្ថានភាព","popupToolbar":"របារឧបករណ៍","popupTop":"ទីតាំងកំពូល","rel":"សម្ពន្ធភាព","selectAnchor":"រើសយកយុថ្កាមួយ","styles":"ស្ទីល","tabIndex":"Tab Index","target":"គោលដៅ","targetFrame":"<ស៊ុម>","targetFrameName":"ឈ្មោះស៊ុមជាគោលដៅ","targetPopup":"<វីនដូផុសឡើង>","targetPopupName":"ឈ្មោះវីនដូតផុសឡើង","title":"តំណ","toAnchor":"តភ្ជាប់ទៅយុថ្កាក្នុងអត្ថបទ","toEmail":"អ៊ីមែល","toUrl":"URL","toolbar":"តំណ","type":"ប្រភេទតំណ","unlink":"ផ្ដាច់តំណ","upload":"ផ្ទុកឡើង"},"list":{"bulletedlist":"បញ្ចូល / លុបបញ្ជីជាចំណុចមូល","numberedlist":"បញ្ចូល / លុបបញ្ជីជាលេខ"},"magicline":{"title":"បញ្ចូលកថាខណ្ឌនៅទីនេះ"},"maximize":{"maximize":"ពង្រីកអតិបរមា","minimize":"បង្រួមអប្បបរមា"},"pastetext":{"button":"បិទភ្ជាប់ជាអត្ថបទធម្មតា","title":"បិទភ្ជាប់ជាអត្ថបទធម្មតា"},"pastefromword":{"confirmCleanup":"អត្ថបទដែលអ្នកចង់បិទភ្ជាប់នេះ ទំនងដូចជាចម្លងមកពី Word។ តើអ្នកចង់សម្អាតវាមុនបិទភ្ជាប់ទេ?","error":"ដោយសារមានបញ្ហាផ្នែកក្នុងធ្វើឲ្យមិនអាចសម្អាតទិន្នន័យដែលបានបិទភ្ជាប់","title":"បិទភ្ជាប់ពី Word","toolbar":"បិទភ្ជាប់ពី Word"},"removeformat":{"toolbar":"ជម្រះទ្រង់ទ្រាយ"},"sourcearea":{"toolbar":"អក្សរកូដ"},"specialchar":{"options":"ជម្រើសតួអក្សរពិសេស","title":"រើសតួអក្សរពិសេស","toolbar":"បន្ថែមអក្សរពិសេស"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"រចនាបថ","panelTitle":"ទ្រង់ទ្រាយរចនាបថ","panelTitle1":"រចនាបថប្លក់","panelTitle2":"រចនាបថក្នុងជួរ","panelTitle3":"រចនាបថវត្ថុ"},"table":{"border":"ទំហំបន្ទាត់ស៊ុម","caption":"ចំណងជើង","cell":{"menu":"ក្រឡា","insertBefore":"បញ្ចូលក្រឡាពីមុខ","insertAfter":"បញ្ចូលក្រឡាពីក្រោយ","deleteCell":"លុបក្រឡា","merge":"បញ្ចូលក្រឡាចូលគ្នា","mergeRight":"បញ្ចូលគ្នាខាងស្ដាំ","mergeDown":"បញ្ចូលគ្នាចុះក្រោម","splitHorizontal":"ពុះក្រឡាផ្ដេក","splitVertical":"ពុះក្រឡាបញ្ឈរ","title":"លក្ខណៈក្រឡា","cellType":"ប្រភេទក្រឡា","rowSpan":"ចំនួនជួរដេកលាយចូលគ្នា","colSpan":"ចំនួនជួរឈរលាយចូលគ្នា","wordWrap":"រុំពាក្យ","hAlign":"ការតម្រឹមផ្ដេក","vAlign":"ការតម្រឹមបញ្ឈរ","alignBaseline":"ខ្សែបន្ទាត់គោល","bgColor":"ពណ៌ផ្ទៃក្រោយ","borderColor":"ពណ៌បន្ទាត់ស៊ុម","data":"ទិន្នន័យ","header":"ក្បាល","yes":"ព្រម","no":"ទេ","invalidWidth":"ទទឹងក្រឡាត្រូវតែជាលេខ។","invalidHeight":"កម្ពស់ក្រឡាត្រូវតែជាលេខ។","invalidRowSpan":"ចំនួនជួរដេកលាយចូលគ្នាត្រូវតែជាលេខទាំងអស់។","invalidColSpan":"ចំនួនជួរឈរលាយចូលគ្នាត្រូវតែជាលេខទាំងអស់។","chooseColor":"រើស"},"cellPad":"ចន្លោះក្រឡា","cellSpace":"គម្លាតក្រឡា","column":{"menu":"ជួរឈរ","insertBefore":"បញ្ចូលជួរឈរពីមុខ","insertAfter":"បញ្ចូលជួរឈរពីក្រោយ","deleteColumn":"លុបជួរឈរ"},"columns":"ជួរឈរ","deleteTable":"លុបតារាង","headers":"ក្បាល","headersBoth":"ទាំងពីរ","headersColumn":"ជួរឈរដំបូង","headersNone":"មិនមាន","headersRow":"ជួរដេកដំបូង","invalidBorder":"ទំហំបន្ទាត់ស៊ុមត្រូវតែជាលេខ។","invalidCellPadding":"ចន្លោះក្រឡាត្រូវតែជាលេខវិជ្ជមាន។","invalidCellSpacing":"គម្លាតក្រឡាត្រូវតែជាលេខវិជ្ជមាន។","invalidCols":"ចំនួនជួរឈរត្រូវតែជាលេខធំជាង 0។","invalidHeight":"កម្ពស់តារាងត្រូវតែជាលេខ","invalidRows":"ចំនួនជួរដេកត្រូវតែជាលេខធំជាង 0។","invalidWidth":"ទទឹងតារាងត្រូវតែជាលេខ។","menu":"លក្ខណៈតារាង","row":{"menu":"ជួរដេក","insertBefore":"បញ្ចូលជួរដេកពីមុខ","insertAfter":"បញ្ចូលជួរដេកពីក្រោយ","deleteRow":"លុបជួរដេក"},"rows":"ជួរដេក","summary":"សេចក្តីសង្ខេប","title":"លក្ខណៈតារាង","toolbar":"តារាង","widthPc":"ភាគរយ","widthPx":"ភីកសែល","widthUnit":"ឯកតាទទឹង"},"undo":{"redo":"ធ្វើឡើងវិញ","undo":"មិនធ្វើវិញ"},"wsc":{"btnIgnore":"មិនផ្លាស់ប្តូរ","btnIgnoreAll":"មិនផ្លាស់ប្តូរ ទាំងអស់","btnReplace":"ជំនួស","btnReplaceAll":"ជំនួសទាំងអស់","btnUndo":"សារឡើងវិញ","changeTo":"ផ្លាស់ប្តូរទៅ","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"ពុំមានកម្មវិធីពិនិត្យអក្ខរាវិរុទ្ធ ។ តើចង់ទាញយកពីណា?","manyChanges":"ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: %1 ពាក្យបានផ្លាស់ប្តូរ","noChanges":"ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: ពុំមានផ្លាស់ប្តូរ","noMispell":"ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: គ្មានកំហុស","noSuggestions":"- គ្មានសំណើរ -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"គ្មានក្នុងវចនានុក្រម","oneChange":"ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: ពាក្យមួយត្រូចបានផ្លាស់ប្តូរ","progress":"កំពុងពិនិត្យអក្ខរាវិរុទ្ធ...","title":"Spell Check","toolbar":"ពិនិត្យអក្ខរាវិរុទ្ធ"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/ko.js b/theme/bootstrap/plugins/ckeditor/lang/ko.js new file mode 100644 index 0000000..2f198f1 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/ko.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['ko']={"editor":"리치 텍스트 편집기","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"도움이 필요하시면 ALT 0 을 누르세요","browseServer":"서버 보기","url":"URL","protocol":"프로토콜","upload":"업로드","uploadSubmit":"서버로 전송","image":"이미지","flash":"플래쉬","form":"폼","checkbox":"체크박스","radio":"라디오버튼","textField":"입력필드","textarea":"입력영역","hiddenField":"숨김필드","button":"버튼","select":"펼침목록","imageButton":"이미지버튼","notSet":"<설정되지 않음>","id":"ID","name":"Name","langDir":"쓰기 방향","langDirLtr":"왼쪽에서 오른쪽 (LTR)","langDirRtl":"오른쪽에서 왼쪽 (RTL)","langCode":"언어 코드","longDescr":"URL 설명","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"예","cancel":"아니오","close":"닫기","preview":"미리보기","resize":"크기 조절","generalTab":"General","advancedTab":"자세히","validateNumberFailed":"이 값은 숫자가 아닙니다.","confirmNewPage":"저장하지 않은 모든 변경사항은 유실됩니다. 정말로 새로운 페이지를 부르겠습니까?","confirmCancel":"몇몇개의 옵션이 바꼈습니다. 정말로 창을 닫으시겠습니까?","options":"옵션","target":"타겟","targetNew":"새로운 창 (_blank)","targetTop":"최상위 창 (_top)","targetSelf":"같은 창 (_self)","targetParent":"부모 창 (_parent)","langDirLTR":"왼쪽에서 오른쪽 (LTR)","langDirRTL":"오른쪽에서 왼쪽 (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"너비","height":"높이","align":"정렬","alignLeft":"왼쪽","alignRight":"오른쪽","alignCenter":"가운데","alignTop":"위","alignMiddle":"중간","alignBottom":"아래","invalidValue":"잘못된 값.","invalidHeight":"높이는 숫자여야 합니다.","invalidWidth":"넓이는 숫자여야 합니다.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, 사용할 수 없음</span>"},"about":{"copy":"저작권 &copy; $1 . 판권 소유.","dlgTitle":"CKEditor 에 대하여","help":"도움이 필요하시면 $1 를 확인하세요","moreInfo":"라이센스에 대한 정보를 보고싶다면 우리의 웹 사이트를 방문하세요:","title":"CKEditor에 대하여","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"진하게","italic":"이텔릭","strike":"취소선","subscript":"아래 첨자","superscript":"위 첨자","underline":"밑줄"},"blockquote":{"toolbar":"인용 블록"},"clipboard":{"copy":"복사하기","copyError":"브라우저의 보안설정때문에 복사하기 기능을 실행할 수 없습니다. 키보드 명령을 사용하십시요. (Ctrl/Cmd+C).","cut":"잘라내기","cutError":"브라우저의 보안설정때문에 잘라내기 기능을 실행할 수 없습니다. 키보드 명령을 사용하십시요. (Ctrl/Cmd+X).","paste":"붙여넣기","pasteArea":"범위 붙여넣기","pasteMsg":"키보드의 (<STRONG>Ctrl/Cmd+V</STRONG>) 를 이용해서 상자안에 붙여넣고 <STRONG>OK</STRONG> 를 누르세요.","securityMsg":"브러우저 보안 설정으로 인해, 클립보드의 자료를 직접 접근할 수 없습니다. 이 창에 다시 붙여넣기 하십시오.","title":"붙여넣기"},"contextmenu":{"options":"컨텍스트 메뉴 옵션"},"toolbar":{"toolbarCollapse":"툴바 삭제","toolbarExpand":"확장 툴바","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"편집자용 툴바들"},"elementspath":{"eleLabel":"요소 위치","eleTitle":"%1 요소"},"format":{"label":"포맷","panelTitle":"포맷","tag_address":"Address","tag_div":"기본 (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"수평선 삽입"},"image":{"alertUrl":"이미지 URL을 입력하십시요","alt":"이미지 설명","border":"테두리","btnUpload":"서버로 전송","button2Img":"단순 이미지에서 선택한 이미지 버튼을 변환하시겠습니까?","hSpace":"수평여백","img2Button":"이미지 버튼에 선택한 이미지를 변환하시겠습니까?","infoTab":"이미지 정보","linkTab":"링크","lockRatio":"비율 유지","menu":"이미지 설정","resetSize":"원래 크기로","title":"이미지 설정","titleButton":"이미지버튼 속성","upload":"업로드","urlMissing":"이미지 소스 URL이 없습니다.","vSpace":"수직여백","validateBorder":"테두리는 정수여야 합니다.","validateHSpace":"가로 길이는 정수여야 합니다.","validateVSpace":"세로 길이는 정수여야 합니다."},"indent":{"indent":"들여쓰기","outdent":"내어쓰기"},"fakeobjects":{"anchor":"책갈피 삽입/변경","flash":"Flash Animation","hiddenfield":"숨김필드","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"엑세스 키","advanced":"자세히","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"책갈피 삽입/변경","menu":"책갈피 속성","title":"책갈피 속성","name":"책갈피 이름","errorName":"책갈피 이름을 입력하십시요.","remove":"Remove Anchor"},"anchorId":"책갈피 ID","anchorName":"책갈피 이름","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"이메일 주소","emailBody":"내용","emailSubject":"제목","id":"ID","info":"링크 정보","langCode":"쓰기 방향","langDir":"쓰기 방향","langDirLTR":"왼쪽에서 오른쪽 (LTR)","langDirRTL":"오른쪽에서 왼쪽 (RTL)","menu":"링크 수정","name":"Name","noAnchors":"(문서에 책갈피가 없습니다.)","noEmail":"이메일주소를 입력하십시요.","noUrl":"링크 URL을 입력하십시요.","other":"<기타>","popupDependent":"Dependent (Netscape)","popupFeatures":"팝업창 설정","popupFullScreen":"전체화면 (IE)","popupLeft":"왼쪽 위치","popupLocationBar":"주소표시줄","popupMenuBar":"메뉴바","popupResizable":"크기 조절 가능","popupScrollBars":"스크롤바","popupStatusBar":"상태바","popupToolbar":"툴바","popupTop":"윗쪽 위치","rel":"Relationship","selectAnchor":"책갈피 선택","styles":"Style","tabIndex":"탭 순서","target":"타겟","targetFrame":"<프레임>","targetFrameName":"타겟 프레임 이름","targetPopup":"<팝업창>","targetPopupName":"팝업창 이름","title":"링크","toAnchor":"책갈피","toEmail":"이메일","toUrl":"URL","toolbar":"링크 삽입/변경","type":"링크 종류","unlink":"링크 삭제","upload":"업로드"},"list":{"bulletedlist":"순서없는 목록","numberedlist":"순서있는 목록"},"magicline":{"title":"여기에 그래프 삽입"},"maximize":{"maximize":"최대","minimize":"최소"},"pastetext":{"button":"텍스트로 붙여넣기","title":"텍스트로 붙여넣기"},"pastefromword":{"confirmCleanup":"붙여 넣기 할 텍스트는 MS Word에서 복사 한 것입니다. 붙여 넣기 전에 MS Word 포멧을 삭제 하시겠습니까?","error":"내부 오류로 붙여 넣은 데이터를 정리 할 수 없습니다.","title":"MS Word 형식에서 붙여넣기","toolbar":"MS Word 형식에서 붙여넣기"},"removeformat":{"toolbar":"포맷 지우기"},"sourcearea":{"toolbar":"소스"},"specialchar":{"options":"특수문자 옵션","title":"특수문자 선택","toolbar":"특수문자 삽입"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"스타일","panelTitle":"전체 구성 스타일","panelTitle1":"블록 스타일","panelTitle2":"인라인 스타일","panelTitle3":"오브젝트 스타일"},"table":{"border":"테두리 크기","caption":"캡션","cell":{"menu":"셀/칸(Cell)","insertBefore":"앞에 셀/칸 삽입","insertAfter":"뒤에 셀/칸 삽입","deleteCell":"셀 삭제","merge":"셀 합치기","mergeRight":"오른쪽 뭉치기","mergeDown":"왼쪽 뭉치기","splitHorizontal":"수평 나누기","splitVertical":"수직 나누기","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"셀 여백","cellSpace":"셀 간격","column":{"menu":"열(Column)","insertBefore":"앞에 열 삽입","insertAfter":"뒤에 열 삽입","deleteColumn":"세로줄 삭제"},"columns":"세로줄","deleteTable":"표 삭제","headers":"해더","headersBoth":"모두","headersColumn":"첫 열","headersNone":"None","headersRow":"첫 행","invalidBorder":"테두리 크기는 숫자여야 합니다.","invalidCellPadding":"셀 안쪽의 여백은 0 이상이어야 합니다.","invalidCellSpacing":"셀 간격은 0 이상이어야 합니다.","invalidCols":"행 번호는 0보다 큰 숫자여야 합니다.","invalidHeight":"표 높이는 숫자여야 합니다.","invalidRows":"행 번호는 0보다 큰 숫자여야 합니다.","invalidWidth":"표의 폭은 숫자여야 합니다.","menu":"표 설정","row":{"menu":"행(Row)","insertBefore":"앞에 행 삽입","insertAfter":"뒤에 행 삽입","deleteRow":"가로줄 삭제"},"rows":"가로줄","summary":"요약","title":"표 설정","toolbar":"표","widthPc":"퍼센트","widthPx":"픽셀","widthUnit":"폭 단위"},"undo":{"redo":"재실행","undo":"취소"},"wsc":{"btnIgnore":"건너뜀","btnIgnoreAll":"모두 건너뜀","btnReplace":"변경","btnReplaceAll":"모두 변경","btnUndo":"취소","changeTo":"변경할 단어","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"철자 검사기가 철치되지 않았습니다. 지금 다운로드하시겠습니까?","manyChanges":"철자검사 완료: %1 단어가 변경되었습니다.","noChanges":"철자검사 완료: 변경된 단어가 없습니다.","noMispell":"철자검사 완료: 잘못된 철자가 없습니다.","noSuggestions":"- 추천단어 없음 -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"사전에 없는 단어","oneChange":"철자검사 완료: 단어가 변경되었습니다.","progress":"철자검사를 진행중입니다...","title":"Spell Check","toolbar":"철자검사"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/ku.js b/theme/bootstrap/plugins/ckeditor/lang/ku.js new file mode 100644 index 0000000..dbb92a3 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/ku.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['ku']={"editor":"سەرنووسەی دەقی بە پیت","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"کلیکی ALT لەگەڵ 0 بکه بۆ یارمەتی","browseServer":"هێنانی ڕاژە","url":"ناونیشانی بەستەر","protocol":"پڕۆتۆکۆڵ","upload":"بارکردن","uploadSubmit":"ناردنی بۆ ڕاژە","image":"وێنە","flash":"فلاش","form":"داڕشتە","checkbox":"خانەی نیشانکردن","radio":"جێگرەوەی دوگمە","textField":"خانەی دەق","textarea":"ڕووبەری دەق","hiddenField":"شاردنەوی خانە","button":"دوگمە","select":"هەڵبژاردەی خانە","imageButton":"دوگمەی وێنە","notSet":"<هیچ دانەدراوە>","id":"ناسنامە","name":"ناو","langDir":"ئاراستەی زمان","langDirLtr":"چەپ بۆ ڕاست (LTR)","langDirRtl":"ڕاست بۆ چەپ (RTL)","langCode":"هێمای زمان","longDescr":"پێناسەی درێژی بەستەر","cssClass":"شێوازی چینی پهڕە","advisoryTitle":"ڕاوێژکاری سەردێڕ","cssStyle":"شێواز","ok":"باشە","cancel":"هەڵوەشاندن","close":"داخستن","preview":"پێشبینین","resize":"گۆڕینی ئەندازە","generalTab":"گشتی","advancedTab":"پەرەسەندوو","validateNumberFailed":"ئەم نرخە ژمارە نیە، تکایە نرخێکی ژمارە بنووسە.","confirmNewPage":"سەرجەم گۆڕانکاریەکان و پێکهاتەکانی ناووەوە لەدەست دەدەی گەر بێتوو پاشکەوتی نەکەی یەکەم جار، تۆ هەر دڵنیایی لەکردنەوەی پەنجەرەکی نوێ؟","confirmCancel":"هەندێك هەڵبژاردە گۆڕدراوە. تۆ دڵنیایی لە داخستنی ئەم دیالۆگە؟","options":"هەڵبژاردەکان","target":"ئامانج","targetNew":"پەنجەرەیەکی نوێ (_blank)","targetTop":"لووتکەی پەنجەرە (_top)","targetSelf":"لەهەمان پەنجەرە (_self)","targetParent":"پەنجەرەی باوان (_parent)","langDirLTR":"چەپ بۆ ڕاست (LTR)","langDirRTL":"ڕاست بۆ چەپ (RTL)","styles":"شێواز","cssClasses":"شێوازی چینی پەڕە","width":"پانی","height":"درێژی","align":"ڕێککەرەوە","alignLeft":"چەپ","alignRight":"ڕاست","alignCenter":"ناوەڕاست","alignTop":"سەرەوە","alignMiddle":"ناوەند","alignBottom":"ژێرەوە","invalidValue":"نرخێکی نادرووست.","invalidHeight":"درێژی دەبێت ژمارە بێت.","invalidWidth":"پانی دەبێت ژمارە بێت.","invalidCssLength":"ئەم نرخەی دراوە بۆ خانەی \"%1\" دەبێت ژمارەکی درووست بێت یان بێ ناونیشانی ئامرازی (px, %, in, cm, mm, em, ex, pt, یان pc).","invalidHtmlLength":"ئەم نرخەی دراوە بۆ خانەی \"%1\" دەبێت ژمارەکی درووست بێت یان بێ ناونیشانی ئامرازی HTML (px یان %).","invalidInlineStyle":"دانەی نرخی شێوازی ناوهێڵ دەبێت پێکهاتبێت لەیەك یان زیاتری داڕشتە \"ناو : نرخ\", جیاکردنەوەی بە فاریزە و خاڵ","cssLengthTooltip":"ژمارەیەك بنووسه بۆ نرخی piksel یان ئامرازێکی درووستی CSS (px, %, in, cm, mm, em, ex, pt, یان pc).","unavailable":"%1<span class=\"cke_accessibility\">, ئامادە نیە</span>"},"about":{"copy":"مافی لەبەرگەرتنەوەی &copy; $1. گشتی پارێزراوه. ورگێڕانی بۆ کوردی لەلایەن هۆژە کۆیی.","dlgTitle":"دەربارەی CKEditor","help":"سەیری $1 بکه بۆ یارمەتی.","moreInfo":"بۆ زانیاری زیاتر دەربارەی مۆڵەتی بەکارهێنان، تکایه سەردانی ماڵپەڕەکەمان بکه:","title":"دەربارەی CKEditor","userGuide":"ڕێپیشاندەری CKEditors"},"basicstyles":{"bold":"قەڵەو","italic":"لار","strike":"لێدان","subscript":"ژێرنووس","superscript":"سەرنووس","underline":"ژێرهێڵ"},"blockquote":{"toolbar":"بەربەستکردنی ووتەی وەرگیراو"},"clipboard":{"copy":"لەبەرگرتنەوە","copyError":"پارێزی وێبگەڕەکەت ڕێگەنادات بەسەرنووسەکە لە لکاندنی دەقی خۆکارارنە. تکایە لەبری ئەمە ئەم فەرمانە بەکاربهێنە بەداگرتنی کلیلی (Ctrl/Cmd+C).","cut":"بڕین","cutError":"پارێزی وێبگەڕەکەت ڕێگەنادات بە سەرنووسەکە لەبڕینی خۆکارانە. تکایە لەبری ئەمە ئەم فەرمانە بەکاربهێنە بەداگرتنی کلیلی (Ctrl/Cmd+X).","paste":"لکاندن","pasteArea":"ناوچەی لکاندن","pasteMsg":"تکایە بیلکێنە لەناوەوەی ئەم سنوقە لەڕێی تەختەکلیلەکەت بە بەکارهێنانی کلیلی (<STRONG>Ctrl/Cmd+V</STRONG>) دووای کلیکی باشە بکە.","securityMsg":"بەهۆی شێوەپێدانی پارێزی وێبگەڕەکەت، سەرنووسەکه ناتوانێت دەستبگەیەنێت بەهەڵگیراوەکە ڕاستەوخۆ. بۆیه پێویسته دووباره بیلکێنیت لەم پەنجەرەیه.","title":"لکاندن"},"contextmenu":{"options":"هەڵبژاردەی لیستەی کلیکی دەستی ڕاست"},"toolbar":{"toolbarCollapse":"شاردنەوی هێڵی تووڵامراز","toolbarExpand":"نیشاندانی هێڵی تووڵامراز","toolbarGroups":{"document":"پەڕه","clipboard":"بڕین/پووچکردنەوە","editing":"چاکسازی","forms":"داڕشتە","basicstyles":"شێوازی بنچینەیی","paragraph":"بڕگە","links":"بەستەر","insert":"خستنە ناو","styles":"شێواز","colors":"ڕەنگەکان","tools":"ئامرازەکان"},"toolbars":"تووڵامرازی دەسکاریکەر"},"elementspath":{"eleLabel":"ڕێڕەوی توخمەکان","eleTitle":"%1 توخم"},"format":{"label":"ڕازاندنەوە","panelTitle":"بەشی ڕازاندنەوه","tag_address":"ناونیشان","tag_div":"(DIV)-ی ئاسایی","tag_h1":"سەرنووسەی ١","tag_h2":"سەرنووسەی ٢","tag_h3":"سەرنووسەی ٣","tag_h4":"سەرنووسەی ٤","tag_h5":"سەرنووسەی ٥","tag_h6":"سەرنووسەی ٦","tag_p":"ئاسایی","tag_pre":"شێوازکراو"},"horizontalrule":{"toolbar":"دانانی هێلی ئاسۆیی"},"image":{"alertUrl":"تکایه ناونیشانی بەستەری وێنه بنووسه","alt":"جێگرەوەی دەق","border":"پەراوێز","btnUpload":"ناردنی بۆ ڕاژه","button2Img":"تۆ دەتەوێت دوگمەی وێنەی دیاریکراو بگۆڕیت بۆ وێنەیەکی ئاسایی؟","hSpace":"بۆشایی ئاسۆیی","img2Button":"تۆ دەتەوێت وێنەی دیاریکراو بگۆڕیت بۆ دوگمەی وێنه؟","infoTab":"زانیاری وێنه","linkTab":"بەستەر","lockRatio":"داخستنی ڕێژه","menu":"خاسیەتی وێنه","resetSize":"ڕێکخستنەوەی قەباره","title":"خاسیەتی وێنه","titleButton":"خاسیەتی دوگمەی وێنه","upload":"بارکردن","urlMissing":"سەرچاوەی بەستەری وێنه بزره","vSpace":"بۆشایی ئەستونی","validateBorder":"پەراوێز دەبێت بەتەواوی تەنها ژماره بێت.","validateHSpace":"بۆشایی ئاسۆیی دەبێت بەتەواوی تەنها ژمارە بێت.","validateVSpace":"بۆشایی ئەستونی دەبێت بەتەواوی تەنها ژماره بێت."},"indent":{"indent":"زیادکردنی بۆشایی","outdent":"کەمکردنەوەی بۆشایی"},"fakeobjects":{"anchor":"لەنگەر","flash":"فلاش","hiddenfield":"شاردنەوەی خانه","iframe":"لەچوارچێوە","unknown":"بەرکارێکی نەناسراو"},"link":{"acccessKey":"کلیلی دەستپێگەیشتن","advanced":"پێشکەوتوو","advisoryContentType":"جۆری ناوەڕۆکی ڕاویژکار","advisoryTitle":"ڕاوێژکاری سەردێڕ","anchor":{"toolbar":"دانان/چاکسازی لەنگەر","menu":"چاکسازی لەنگەر","title":"خاسیەتی لەنگەر","name":"ناوی لەنگەر","errorName":"تکایه ناوی لەنگەر بنووسه","remove":"لابردنی لەنگەر"},"anchorId":"بەپێی ناسنامەی توخم","anchorName":"بەپێی ناوی لەنگەر","charset":"بەستەری سەرچاوەی نووسە","cssClasses":"شێوازی چینی پەڕه","emailAddress":"ناونیشانی ئیمەیل","emailBody":"ناوەڕۆکی نامە","emailSubject":"بابەتی نامە","id":"ناسنامە","info":"زانیاری بەستەر","langCode":"هێمای زمان","langDir":"ئاراستەی زمان","langDirLTR":"چەپ بۆ ڕاست (LTR)","langDirRTL":"ڕاست بۆ چەپ (RTL)","menu":"چاکسازی بەستەر","name":"ناو","noAnchors":"(هیچ جۆرێکی لەنگەر ئامادە نیە لەم پەڕەیه)","noEmail":"تکایە ناونیشانی ئیمەیل بنووسە","noUrl":"تکایە ناونیشانی بەستەر بنووسە","other":"<هیتر>","popupDependent":"پێوەبەستراو (Netscape)","popupFeatures":"خاسیەتی پەنجەرەی سەرهەڵدەر","popupFullScreen":"پڕ بەپڕی شاشە (IE)","popupLeft":"جێگای چەپ","popupLocationBar":"هێڵی ناونیشانی بەستەر","popupMenuBar":"هێڵی لیسته","popupResizable":"توانای گۆڕینی قەباره","popupScrollBars":"هێڵی هاتووچۆپێکردن","popupStatusBar":"هێڵی دۆخ","popupToolbar":"هێڵی تووڵامراز","popupTop":"جێگای سەرەوە","rel":"پەیوەندی","selectAnchor":"هەڵبژاردنی لەنگەرێك","styles":"شێواز","tabIndex":"بازدەری تابی ئیندێکس","target":"ئامانج","targetFrame":"<چووارچێوە>","targetFrameName":"ناوی ئامانجی چووارچێوە","targetPopup":"<پەنجەرەی سەرهەڵدەر>","targetPopupName":"ناوی پەنجەرەی سەرهەڵدەر","title":"بەستەر","toAnchor":"بەستەر بۆ لەنگەر له دەق","toEmail":"ئیمەیل","toUrl":"ناونیشانی بەستەر","toolbar":"دانان/ڕێکخستنی بەستەر","type":"جۆری بەستەر","unlink":"لابردنی بەستەر","upload":"بارکردن"},"list":{"bulletedlist":"دانان/لابردنی خاڵی لیست","numberedlist":"دانان/لابردنی ژمارەی لیست"},"magicline":{"title":"بڕگە لێرە دابنێ"},"maximize":{"maximize":"ئەوپەڕی گەورەیی","minimize":"ئەوپەڕی بچووکی"},"pastetext":{"button":"لکاندنی وەك دەقی ڕوون","title":"لکاندنی وەك دەقی ڕوون"},"pastefromword":{"confirmCleanup":"ئەم دەقەی بەتەمای بیلکێنی پێدەچێت له word هێنرابێت. دەتەوێت پاکی بکەیوه پێش ئەوەی بیلکێنی؟","error":"هیچ ڕێگەیەك نەبوو لەلکاندنی دەقەکه بەهۆی هەڵەیەکی ناوەخۆیی","title":"لکاندنی لەلایەن Word","toolbar":"لکاندنی لەڕێی Word"},"removeformat":{"toolbar":"لابردنی داڕشتەکە"},"sourcearea":{"toolbar":"سەرچاوە"},"specialchar":{"options":"هەڵبژاردەی نووسەی تایبەتی","title":"هەڵبژاردنی نووسەی تایبەتی","toolbar":"دانانی نووسەی تایبەتی"},"scayt":{"about":"دهربارهی SCAYT","aboutTab":"دهربارهی","addWord":"زیادکردنی ووشه","allCaps":"پشتگوێخستنی وشانهی پێکهاتووه لهپیتی گهوره","dic_create":"درووستکردن","dic_delete":"سڕینهوه","dic_field_name":"ناوی فهرههنگ","dic_info":"لهبنچینهدا فهرههنگی بهکارهێنهر کۆگاکردن کراوه له شهکرۆکه Cookie, ههرچۆنێك بێت شهکۆرکه سنووردار کراوه له قهباره کۆگاکردن.کاتێك فهرههنگی بهکارهێنهر گهیشته ئهم خاڵهی کهناتوانرێت زیاتر کۆگاکردن بکرێت له شهکرۆکه، ئهوسا فهرههنگهکه پێویسته کۆگابکرێت له ڕاژهکهی ئێمه. بۆ کۆگاکردنی زانیاری تایبهتی فهرههنگهکه له ڕاژهکهی ئێمه, پێویسته ناوێك ههڵبژێریت بۆ فهرههنگهکه. گهر تۆ فهرههنگێکی کۆگاکراوت ههیه, تکایه ناوی فهرههنگهکه بنووسه وه کلیکی دوگمهی گهڕاندنهوه بکه.","dic_rename":"گۆڕینی ناو","dic_restore":"گهڕاندنهوه","dictionariesTab":"فهرههنگهکان","disable":"ناچالاککردنی SCAYT","emptyDic":"ناوی فهرههنگ نابێت خاڵی بێت.","enable":"چالاککردنی SCAYT","ignore":"پشتگوێخستن","ignoreAll":"پشتگوێخستنی ههمووی","ignoreDomainNames":"پشتگوێخستنی دۆمهین","langs":"زمانهکان","languagesTab":"زمانهکان","mixedCase":"پشتگوێخستنی وشانهی پێکهاتووه لهپیتی گهورهو بچووك","mixedWithDigits":"پشتگوێخستنی وشانهی پێکهاتووه لهژماره","moreSuggestions":"پێشنیاری زیاتر","opera_title":"پشتیوانی نهکراوه لهلایهن Opera","options":"ههڵبژارده","optionsTab":"ههڵبژارده","title":"پشکنینی نووسه لهکاتی نووسین","toggle":"گۆڕینی SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"شێواز","panelTitle":"شێوازی ڕازاندنەوە","panelTitle1":"شێوازی خشت","panelTitle2":"شێوازی ناوهێڵ","panelTitle3":"شێوازی بەرکار"},"table":{"border":"گەورەیی پەراوێز","caption":"سەردێڕ","cell":{"menu":"خانه","insertBefore":"دانانی خانه لەپێش","insertAfter":"دانانی خانه لەپاش","deleteCell":"سڕینەوەی خانه","merge":"تێکەڵکردنی خانە","mergeRight":"تێکەڵکردنی لەگەڵ ڕاست","mergeDown":"تێکەڵکردنی لەگەڵ خوارەوە","splitHorizontal":"دابەشکردنی خانەی ئاسۆیی","splitVertical":"دابەشکردنی خانەی ئەستونی","title":"خاسیەتی خانه","cellType":"جۆری خانه","rowSpan":"ماوەی نێوان ڕیز","colSpan":"بستی ئەستونی","wordWrap":"پێچانەوەی وشە","hAlign":"ڕیزکردنی ئاسۆیی","vAlign":"ڕیزکردنی ئەستونی","alignBaseline":"هێڵەبنەڕەت","bgColor":"ڕەنگی پاشبنەما","borderColor":"ڕەنگی پەراوێز","data":"داتا","header":"سەرپەڕه","yes":"بەڵێ","no":"نەخێر","invalidWidth":"پانی خانه دەبێت بەتەواوی ژماره بێت.","invalidHeight":"درێژی خانه بەتەواوی دەبێت ژمارە بێت.","invalidRowSpan":"ماوەی نێوان ڕیز بەتەواوی دەبێت ژمارە بێت.","invalidColSpan":"ماوەی نێوان ئەستونی بەتەواوی دەبێت ژمارە بێت.","chooseColor":"هەڵبژێرە"},"cellPad":"بۆشایی ناوپۆش","cellSpace":"بۆشایی خانه","column":{"menu":"ئەستون","insertBefore":"دانانی ئەستون لەپێش","insertAfter":"دانانی ئەستوون لەپاش","deleteColumn":"سڕینەوەی ئەستوون"},"columns":"ستوونەکان","deleteTable":"سڕینەوەی خشتە","headers":"سەرپەڕه","headersBoth":"هەردووك","headersColumn":"یەکەم ئەستوون","headersNone":"هیچ","headersRow":"یەکەم ڕیز","invalidBorder":"ژمارەی پەراوێز دەبێت تەنها ژماره بێت.","invalidCellPadding":"ناوپۆشی خانه دەبێت ژمارەکی درووست بێت.","invalidCellSpacing":"بۆشایی خانه دەبێت ژمارەکی درووست بێت.","invalidCols":"ژمارەی ئەستوونی دەبێت گەورەتر بێت لەژمارەی 0.","invalidHeight":"درێژی خشته دهبێت تهنها ژماره بێت.","invalidRows":"ژمارەی ڕیز دەبێت گەورەتر بێت لەژمارەی 0.","invalidWidth":"پانی خشته دەبێت تەنها ژماره بێت.","menu":"خاسیەتی خشتە","row":{"menu":"ڕیز","insertBefore":"دانانی ڕیز لەپێش","insertAfter":"دانانی ڕیز لەپاش","deleteRow":"سڕینەوەی ڕیز"},"rows":"ڕیز","summary":"کورتە","title":"خاسیەتی خشتە","toolbar":"خشتە","widthPc":"لەسەدا","widthPx":"وێنەخاڵ - پیکسل","widthUnit":"پانی یەکە"},"undo":{"redo":"هەڵگەڕاندنەوە","undo":"پووچکردنەوە"},"wsc":{"btnIgnore":"پشتگوێ کردن","btnIgnoreAll":"پشتگوێکردنی ههمووی","btnReplace":"لهبریدانن","btnReplaceAll":"لهبریدانانی ههمووی","btnUndo":"پووچکردنهوه","changeTo":"گۆڕینی بۆ","errorLoading":"ههڵه لههێنانی داخوازینامهی خانهخۆێی ڕاژه: %s.","ieSpellDownload":"پشکنینی ڕێنووس دانهمزراوه. دهتهوێت ئێستا دایبگریت?","manyChanges":"پشکنینی ڕێنووس کۆتای هات: لهسهدا %1 ی وشهکان گۆڕدرا","noChanges":"پشکنینی ڕێنووس کۆتای هات: هیچ وشهیهك نۆگۆڕدرا","noMispell":"پشکنینی ڕێنووس کۆتای هات: هیچ ههڵهیهکی ڕێنووس نهدۆزراوه","noSuggestions":"- هیچ پێشنیارێك -","notAvailable":"ببووره، لهمکاتهدا ڕاژهکه لهبهردهستا نیه.","notInDic":"لهفهرههنگ دانیه","oneChange":"پشکنینی ڕێنووس کۆتای هات: یهك وشه گۆڕدرا","progress":"پشکنینی ڕێنووس لهبهردهوامبوون دایه...","title":"پشکنینی ڕێنووس","toolbar":"پشکنینی ڕێنووس"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/lt.js b/theme/bootstrap/plugins/ckeditor/lang/lt.js new file mode 100644 index 0000000..e3f725d --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/lt.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['lt']={"editor":"Pilnas redaktorius","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Spauskite ALT 0 dėl pagalbos","browseServer":"Naršyti po serverį","url":"URL","protocol":"Protokolas","upload":"Siųsti","uploadSubmit":"Siųsti į serverį","image":"Vaizdas","flash":"Flash","form":"Forma","checkbox":"Žymimasis langelis","radio":"Žymimoji akutė","textField":"Teksto laukas","textarea":"Teksto sritis","hiddenField":"Nerodomas laukas","button":"Mygtukas","select":"Atrankos laukas","imageButton":"Vaizdinis mygtukas","notSet":"<nėra nustatyta>","id":"Id","name":"Vardas","langDir":"Teksto kryptis","langDirLtr":"Iš kairės į dešinę (LTR)","langDirRtl":"Iš dešinės į kairę (RTL)","langCode":"Kalbos kodas","longDescr":"Ilgas aprašymas URL","cssClass":"Stilių lentelės klasės","advisoryTitle":"Konsultacinė antraštė","cssStyle":"Stilius","ok":"OK","cancel":"Nutraukti","close":"Uždaryti","preview":"Peržiūrėti","resize":"Pavilkite, kad pakeistumėte dydį","generalTab":"Bendros savybės","advancedTab":"Papildomas","validateNumberFailed":"Ši reikšmė nėra skaičius.","confirmNewPage":"Visas neišsaugotas turinys bus prarastas. Ar tikrai norite įkrauti naują puslapį?","confirmCancel":"Kai kurie parametrai pasikeitė. Ar tikrai norite užverti langą?","options":"Parametrai","target":"Tikslinė nuoroda","targetNew":"Naujas langas (_blank)","targetTop":"Viršutinis langas (_top)","targetSelf":"Esamas langas (_self)","targetParent":"Paskutinis langas (_parent)","langDirLTR":"Iš kairės į dešinę (LTR)","langDirRTL":"Iš dešinės į kairę (RTL)","styles":"Stilius","cssClasses":"Stilių klasės","width":"Plotis","height":"Aukštis","align":"Lygiuoti","alignLeft":"Kairę","alignRight":"Dešinę","alignCenter":"Centrą","alignTop":"Viršūnę","alignMiddle":"Vidurį","alignBottom":"Apačią","invalidValue":"Neteisinga reikšmė.","invalidHeight":"Aukštis turi būti nurodytas skaičiais.","invalidWidth":"Plotis turi būti nurodytas skaičiais.","invalidCssLength":"Reikšmė nurodyta \"%1\" laukui, turi būti teigiamas skaičius su arba be tinkamo CSS matavimo vieneto (px, %, in, cm, mm, em, ex, pt arba pc).","invalidHtmlLength":"Reikšmė nurodyta \"%1\" laukui, turi būti teigiamas skaičius su arba be tinkamo HTML matavimo vieneto (px arba %).","invalidInlineStyle":"Reikšmė nurodyta vidiniame stiliuje turi būti sudaryta iš vieno šių reikšmių \"vardas : reikšmė\", atskirta kabliataškiais.","cssLengthTooltip":"Įveskite reikšmę pikseliais arba skaičiais su tinkamu CSS vienetu (px, %, in, cm, mm, em, ex, pt arba pc).","unavailable":"%1<span class=\"cke_accessibility\">, netinkamas</span>"},"about":{"copy":"Copyright &copy; $1. Visos teiss saugomos.","dlgTitle":"Apie CKEditor","help":"Patikrinkite $1 dėl pagalbos.","moreInfo":"Dėl licencijavimo apsilankykite mūsų svetainėje:","title":"Apie CKEditor","userGuide":"CKEditor Vartotojo Gidas"},"basicstyles":{"bold":"Pusjuodis","italic":"Kursyvas","strike":"Perbrauktas","subscript":"Apatinis indeksas","superscript":"Viršutinis indeksas","underline":"Pabrauktas"},"blockquote":{"toolbar":"Citata"},"clipboard":{"copy":"Kopijuoti","copyError":"Jūsų naršyklės saugumo nustatymai neleidžia redaktoriui automatiškai įvykdyti kopijavimo operacijų. Tam prašome naudoti klaviatūrą (Ctrl/Cmd+C).","cut":"Iškirpti","cutError":"Jūsų naršyklės saugumo nustatymai neleidžia redaktoriui automatiškai įvykdyti iškirpimo operacijų. Tam prašome naudoti klaviatūrą (Ctrl/Cmd+X).","paste":"Įdėti","pasteArea":"Įkelti dalį","pasteMsg":"Žemiau esančiame įvedimo lauke įdėkite tekstą, naudodami klaviatūrą (<STRONG>Ctrl/Cmd+V</STRONG>) ir paspauskite mygtuką <STRONG>OK</STRONG>.","securityMsg":"Dėl jūsų naršyklės saugumo nustatymų, redaktorius negali tiesiogiai pasiekti laikinosios atminties. Jums reikia nukopijuoti dar kartą į šį langą.","title":"Įdėti"},"contextmenu":{"options":"Kontekstinio meniu parametrai"},"toolbar":{"toolbarCollapse":"Apjungti įrankių juostą","toolbarExpand":"Išplėsti įrankių juostą","toolbarGroups":{"document":"Dokumentas","clipboard":"Atmintinė/Atgal","editing":"Redagavimas","forms":"Formos","basicstyles":"Pagrindiniai stiliai","paragraph":"Paragrafas","links":"Nuorodos","insert":"Įterpti","styles":"Stiliai","colors":"Spalvos","tools":"Įrankiai"},"toolbars":"Redaktoriaus įrankiai"},"elementspath":{"eleLabel":"Elemento kelias","eleTitle":"%1 elementas"},"format":{"label":"Šrifto formatas","panelTitle":"Šrifto formatas","tag_address":"Kreipinio","tag_div":"Normalus (DIV)","tag_h1":"Antraštinis 1","tag_h2":"Antraštinis 2","tag_h3":"Antraštinis 3","tag_h4":"Antraštinis 4","tag_h5":"Antraštinis 5","tag_h6":"Antraštinis 6","tag_p":"Normalus","tag_pre":"Formuotas"},"horizontalrule":{"toolbar":"Įterpti horizontalią liniją"},"image":{"alertUrl":"Prašome įvesti vaizdo URL","alt":"Alternatyvus Tekstas","border":"Rėmelis","btnUpload":"Siųsti į serverį","button2Img":"Ar norite mygtuką paversti paprastu paveiksliuku?","hSpace":"Hor.Erdvė","img2Button":"Ar norite paveiksliuką paversti mygtuku?","infoTab":"Vaizdo informacija","linkTab":"Nuoroda","lockRatio":"Išlaikyti proporciją","menu":"Vaizdo savybės","resetSize":"Atstatyti dydį","title":"Vaizdo savybės","titleButton":"Vaizdinio mygtuko savybės","upload":"Nusiųsti","urlMissing":"Paveiksliuko nuorodos nėra.","vSpace":"Vert.Erdvė","validateBorder":"Reikšmė turi būti sveikas skaičius.","validateHSpace":"Reikšmė turi būti sveikas skaičius.","validateVSpace":"Reikšmė turi būti sveikas skaičius."},"indent":{"indent":"Padidinti įtrauką","outdent":"Sumažinti įtrauką"},"fakeobjects":{"anchor":"Žymė","flash":"Flash animacija","hiddenfield":"Paslėptas laukas","iframe":"IFrame","unknown":"Nežinomas objektas"},"link":{"acccessKey":"Prieigos raktas","advanced":"Papildomas","advisoryContentType":"Konsultacinio turinio tipas","advisoryTitle":"Konsultacinė antraštė","anchor":{"toolbar":"Įterpti/modifikuoti žymę","menu":"Žymės savybės","title":"Žymės savybės","name":"Žymės vardas","errorName":"Prašome įvesti žymės vardą","remove":"Pašalinti žymę"},"anchorId":"Pagal žymės Id","anchorName":"Pagal žymės vardą","charset":"Susietų išteklių simbolių lentelė","cssClasses":"Stilių lentelės klasės","emailAddress":"El.pašto adresas","emailBody":"Žinutės turinys","emailSubject":"Žinutės tema","id":"Id","info":"Nuorodos informacija","langCode":"Teksto kryptis","langDir":"Teksto kryptis","langDirLTR":"Iš kairės į dešinę (LTR)","langDirRTL":"Iš dešinės į kairę (RTL)","menu":"Taisyti nuorodą","name":"Vardas","noAnchors":"(Šiame dokumente žymių nėra)","noEmail":"Prašome įvesti el.pašto adresą","noUrl":"Prašome įvesti nuorodos URL","other":"<kitas>","popupDependent":"Priklausomas (Netscape)","popupFeatures":"Išskleidžiamo lango savybės","popupFullScreen":"Visas ekranas (IE)","popupLeft":"Kairė pozicija","popupLocationBar":"Adreso juosta","popupMenuBar":"Meniu juosta","popupResizable":"Kintamas dydis","popupScrollBars":"Slinkties juostos","popupStatusBar":"Būsenos juosta","popupToolbar":"Mygtukų juosta","popupTop":"Viršutinė pozicija","rel":"Sąsajos","selectAnchor":"Pasirinkite žymę","styles":"Stilius","tabIndex":"Tabuliavimo indeksas","target":"Paskirties vieta","targetFrame":"<kadras>","targetFrameName":"Paskirties kadro vardas","targetPopup":"<išskleidžiamas langas>","targetPopupName":"Paskirties lango vardas","title":"Nuoroda","toAnchor":"Žymė šiame puslapyje","toEmail":"El.paštas","toUrl":"Nuoroda","toolbar":"Įterpti/taisyti nuorodą","type":"Nuorodos tipas","unlink":"Panaikinti nuorodą","upload":"Siųsti"},"list":{"bulletedlist":"Suženklintas sąrašas","numberedlist":"Numeruotas sąrašas"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Išdidinti","minimize":"Sumažinti"},"pastetext":{"button":"Įdėti kaip gryną tekstą","title":"Įdėti kaip gryną tekstą"},"pastefromword":{"confirmCleanup":"Tekstas, kurį įkeliate yra kopijuojamas iš Word. Ar norite jį išvalyti prieš įkeliant?","error":"Dėl vidinių sutrikimų, nepavyko išvalyti įkeliamo teksto","title":"Įdėti iš Word","toolbar":"Įdėti iš Word"},"removeformat":{"toolbar":"Panaikinti formatą"},"sourcearea":{"toolbar":"Šaltinis"},"specialchar":{"options":"Specialaus simbolio nustatymai","title":"Pasirinkite specialų simbolį","toolbar":"Įterpti specialų simbolį"},"scayt":{"about":"Apie SCAYT","aboutTab":"Apie","addWord":"Pridėti žodį","allCaps":"Ignoruoti visas didžiąsias raides","dic_create":"Sukurti","dic_delete":"Ištrinti","dic_field_name":"Žodyno pavadinimas","dic_info":"Paprastai žodynas yra saugojamas sausainėliuose (cookies), kurių dydis, bet kokiu atveju, yra apribotas. Esant sausainėlių apimties pervišiui, viskas bus saugoma serveryje. Jei norite iš kart viską saugoti serveryje, turite sugalvoti žodynui pavadinimą. Jei jau turite žodyną, įrašykite pavadinimą ir nuspauskite Atstatyti mygtuką.","dic_rename":"Pervadinti","dic_restore":"Atstatyti","dictionariesTab":"Žodynai","disable":"Išjungti SCAYT","emptyDic":"Žodyno vardas neturėtų būti tuščias.","enable":"Įjungti SCAYT","ignore":"Ignoruoti","ignoreAll":"Ignoruoti viską","ignoreDomainNames":"Ignoruoti domenų vardus","langs":"Kalbos","languagesTab":"Kalbos","mixedCase":"Ignoruoti maišyto dydžio raides","mixedWithDigits":"Ignoruoti raides su skaičiais","moreSuggestions":"Daugiau patarimų","opera_title":"Nepalaikoma naršyklėje Opera","options":"Parametrai","optionsTab":"Parametrai","title":"Tikrinti klaidas kai rašoma","toggle":"Perjungti SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stilius","panelTitle":"Stilių formatavimas","panelTitle1":"Blokų stiliai","panelTitle2":"Vidiniai stiliai","panelTitle3":"Objektų stiliai"},"table":{"border":"Rėmelio dydis","caption":"Antraštė","cell":{"menu":"Langelis","insertBefore":"Įterpti langelį prieš","insertAfter":"Įterpti langelį po","deleteCell":"Šalinti langelius","merge":"Sujungti langelius","mergeRight":"Sujungti su dešine","mergeDown":"Sujungti su apačia","splitHorizontal":"Skaidyti langelį horizontaliai","splitVertical":"Skaidyti langelį vertikaliai","title":"Cell nustatymai","cellType":"Cell rūšis","rowSpan":"Eilučių Span","colSpan":"Stulpelių Span","wordWrap":"Sutraukti raides","hAlign":"Horizontalus lygiavimas","vAlign":"Vertikalus lygiavimas","alignBaseline":"Apatinė linija","bgColor":"Fono spalva","borderColor":"Rėmelio spalva","data":"Data","header":"Antraštė","yes":"Taip","no":"Ne","invalidWidth":"Reikšmė turi būti skaičius.","invalidHeight":"Reikšmė turi būti skaičius.","invalidRowSpan":"Reikšmė turi būti skaičius.","invalidColSpan":"Reikšmė turi būti skaičius.","chooseColor":"Pasirinkite"},"cellPad":"Tarpas nuo langelio rėmo iki teksto","cellSpace":"Tarpas tarp langelių","column":{"menu":"Stulpelis","insertBefore":"Įterpti stulpelį prieš","insertAfter":"Įterpti stulpelį po","deleteColumn":"Šalinti stulpelius"},"columns":"Stulpeliai","deleteTable":"Šalinti lentelę","headers":"Antraštės","headersBoth":"Abu","headersColumn":"Pirmas stulpelis","headersNone":"Nėra","headersRow":"Pirma eilutė","invalidBorder":"Reikšmė turi būti nurodyta skaičiumi.","invalidCellPadding":"Reikšmė turi būti nurodyta skaičiumi.","invalidCellSpacing":"Reikšmė turi būti nurodyta skaičiumi.","invalidCols":"Skaičius turi būti didesnis nei 0.","invalidHeight":"Reikšmė turi būti nurodyta skaičiumi.","invalidRows":"Skaičius turi būti didesnis nei 0.","invalidWidth":"Reikšmė turi būti nurodyta skaičiumi.","menu":"Lentelės savybės","row":{"menu":"Eilutė","insertBefore":"Įterpti eilutę prieš","insertAfter":"Įterpti eilutę po","deleteRow":"Šalinti eilutes"},"rows":"Eilutės","summary":"Santrauka","title":"Lentelės savybės","toolbar":"Lentelė","widthPc":"procentais","widthPx":"taškais","widthUnit":"pločio vienetas"},"undo":{"redo":"Atstatyti","undo":"Atšaukti"},"wsc":{"btnIgnore":"Ignoruoti","btnIgnoreAll":"Ignoruoti visus","btnReplace":"Pakeisti","btnReplaceAll":"Pakeisti visus","btnUndo":"Atšaukti","changeTo":"Pakeisti į","errorLoading":"Klaida įkraunant servisą: %s.","ieSpellDownload":"Rašybos tikrinimas neinstaliuotas. Ar Jūs norite jį dabar atsisiųsti?","manyChanges":"Rašybos tikrinimas baigtas: Pakeista %1 žodžių","noChanges":"Rašybos tikrinimas baigtas: Nėra pakeistų žodžių","noMispell":"Rašybos tikrinimas baigtas: Nerasta rašybos klaidų","noSuggestions":"- Nėra pasiūlymų -","notAvailable":"Atleiskite, šiuo metu servisas neprieinamas.","notInDic":"Žodyne nerastas","oneChange":"Rašybos tikrinimas baigtas: Vienas žodis pakeistas","progress":"Vyksta rašybos tikrinimas...","title":"Tikrinti klaidas","toolbar":"Rašybos tikrinimas"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/lv.js b/theme/bootstrap/plugins/ckeditor/lang/lv.js new file mode 100644 index 0000000..76c2f6a --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/lv.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['lv']={"editor":"Bagātinātā teksta redaktors","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Palīdzībai, nospiediet ALT 0 ","browseServer":"Skatīt servera saturu","url":"URL","protocol":"Protokols","upload":"Augšupielādēt","uploadSubmit":"Nosūtīt serverim","image":"Attēls","flash":"Flash","form":"Forma","checkbox":"Atzīmēšanas kastīte","radio":"Izvēles poga","textField":"Teksta rinda","textarea":"Teksta laukums","hiddenField":"Paslēpta teksta rinda","button":"Poga","select":"Iezīmēšanas lauks","imageButton":"Attēlpoga","notSet":"<nav iestatīts>","id":"Id","name":"Nosaukums","langDir":"Valodas lasīšanas virziens","langDirLtr":"No kreisās uz labo (LTR)","langDirRtl":"No labās uz kreiso (RTL)","langCode":"Valodas kods","longDescr":"Gara apraksta Hipersaite","cssClass":"Stilu saraksta klases","advisoryTitle":"Konsultatīvs virsraksts","cssStyle":"Stils","ok":"Darīts!","cancel":"Atcelt","close":"Aizvērt","preview":"Priekšskatījums","resize":"Mērogot","generalTab":"Vispārīgi","advancedTab":"Izvērstais","validateNumberFailed":"Šī vērtība nav skaitlis","confirmNewPage":"Jebkuras nesaglabātās izmaiņas tiks zaudētas. Vai tiešām vēlaties atvērt jaunu lapu?","confirmCancel":"Daži no uzstādījumiem ir mainīti. Vai tiešām vēlaties aizvērt šo dialogu?","options":"Uzstādījumi","target":"Mērķis","targetNew":"Jauns logs (_blank)","targetTop":"Virsējais logs (_top)","targetSelf":"Tas pats logs (_self)","targetParent":"Avota logs (_parent)","langDirLTR":"Kreisais uz Labo (LTR)","langDirRTL":"Labais uz Kreiso (RTL)","styles":"Stils","cssClasses":"Stilu klases","width":"Platums","height":"Augstums","align":"Nolīdzināt","alignLeft":"Pa kreisi","alignRight":"Pa labi","alignCenter":"Centrēti","alignTop":"Augšā","alignMiddle":"Vertikāli centrēts","alignBottom":"Apakšā","invalidValue":"Nekorekta vērtība","invalidHeight":"Augstumam jābūt skaitlim.","invalidWidth":"Platumam jābūt skaitlim","invalidCssLength":"Laukam \"%1\" norādītajai vērtībai jābūt pozitīvam skaitlim ar vai bez korektām CSS mērvienībām (px, %, in, cm, mm, em, ex, pt, vai pc).","invalidHtmlLength":"Laukam \"%1\" norādītajai vērtībai jābūt pozitīvam skaitlim ar vai bez korektām HTML mērvienībām (px vai %).","invalidInlineStyle":"Iekļautajā stilā norādītajai vērtībai jāsastāv no viena vai vairākiem pāriem pēc forma'ta \"nosaukums: vērtība\", atdalītiem ar semikolu.","cssLengthTooltip":"Ievadiet vērtību pikseļos vai skaitli ar derīgu CSS mērvienību (px, %, in, cm, mm, em, ex, pt, vai pc).","unavailable":"%1<span class=\"cke_accessibility\">, nav pieejams</span>"},"about":{"copy":"Kopēšanas tiesības &copy; $1. Visas tiesības rezervētas.","dlgTitle":"Par CKEditor","help":"Pārbaudiet $1 palīdzībai.","moreInfo":"Informācijai par licenzēšanu apmeklējiet mūsu mājas lapu:","title":"Par CKEditor","userGuide":"CKEditor Lietotāja pamācība"},"basicstyles":{"bold":"Treknināts","italic":"Kursīvs","strike":"Pārsvītrots","subscript":"Apakšrakstā","superscript":"Augšrakstā","underline":"Pasvītrots"},"blockquote":{"toolbar":"Bloka citāts"},"clipboard":{"copy":"Kopēt","copyError":"Jūsu pārlūkprogrammas drošības iestatījumi nepieļauj redaktoram automātiski veikt kopēšanas darbību. Lūdzu, izmantojiet (Ctrl/Cmd+C), lai veiktu šo darbību.","cut":"Izgriezt","cutError":"Jūsu pārlūkprogrammas drošības iestatījumi nepieļauj redaktoram automātiski veikt izgriezšanas darbību. Lūdzu, izmantojiet (Ctrl/Cmd+X), lai veiktu šo darbību.","paste":"Ielīmēt","pasteArea":"Ielīmēšanas zona","pasteMsg":"Lūdzu, ievietojiet tekstu šajā laukumā, izmantojot klaviatūru (<STRONG>Ctrl/Cmd+V</STRONG>) un apstipriniet ar <STRONG>Darīts!</STRONG>.","securityMsg":"Jūsu pārlūka drošības uzstādījumu dēļ, nav iespējams tieši piekļūt jūsu starpliktuvei. Jums jāielīmē atkārtoti šajā logā.","title":"Ievietot"},"contextmenu":{"options":"Uznirstošās izvēlnes uzstādījumi"},"toolbar":{"toolbarCollapse":"Aizvērt rīkjoslu","toolbarExpand":"Atvērt rīkjoslu","toolbarGroups":{"document":"Dokuments","clipboard":"Starpliktuve/Atcelt","editing":"Labošana","forms":"Formas","basicstyles":"Pamata stili","paragraph":"Paragrāfs","links":"Saites","insert":"Ievietot","styles":"Stili","colors":"Krāsas","tools":"Rīki"},"toolbars":"Redaktora rīkjoslas"},"elementspath":{"eleLabel":"Elementa ceļš","eleTitle":"%1 elements"},"format":{"label":"Formāts","panelTitle":"Formāts","tag_address":"Adrese","tag_div":"Rindkopa (DIV)","tag_h1":"Virsraksts 1","tag_h2":"Virsraksts 2","tag_h3":"Virsraksts 3","tag_h4":"Virsraksts 4","tag_h5":"Virsraksts 5","tag_h6":"Virsraksts 6","tag_p":"Normāls teksts","tag_pre":"Formatēts teksts"},"horizontalrule":{"toolbar":"Ievietot horizontālu Atdalītājsvītru"},"image":{"alertUrl":"Lūdzu norādīt attēla hipersaiti","alt":"Alternatīvais teksts","border":"Rāmis","btnUpload":"Nosūtīt serverim","button2Img":"Vai vēlaties pārveidot izvēlēto attēla pogu uz attēla?","hSpace":"Horizontālā telpa","img2Button":"Vai vēlaties pārveidot izvēlēto attēlu uz attēla pogas?","infoTab":"Informācija par attēlu","linkTab":"Hipersaite","lockRatio":"Nemainīga Augstuma/Platuma attiecība","menu":"Attēla īpašības","resetSize":"Atjaunot sākotnējo izmēru","title":"Attēla īpašības","titleButton":"Attēlpogas īpašības","upload":"Augšupielādēt","urlMissing":"Trūkst attēla atrašanās adrese.","vSpace":"Vertikālā telpa","validateBorder":"Apmalei jābūt veselam skaitlim","validateHSpace":"HSpace jābūt veselam skaitlim","validateVSpace":"VSpace jābūt veselam skaitlim"},"indent":{"indent":"Palielināt atkāpi","outdent":"Samazināt atkāpi"},"fakeobjects":{"anchor":"Iezīme","flash":"Flash animācija","hiddenfield":"Slēpts lauks","iframe":"Iframe","unknown":"Nezināms objekts"},"link":{"acccessKey":"Pieejas taustiņš","advanced":"Izvērstais","advisoryContentType":"Konsultatīvs satura tips","advisoryTitle":"Konsultatīvs virsraksts","anchor":{"toolbar":"Ievietot/Labot iezīmi","menu":"Labot iezīmi","title":"Iezīmes uzstādījumi","name":"Iezīmes nosaukums","errorName":"Lūdzu norādiet iezīmes nosaukumu","remove":"Noņemt iezīmi"},"anchorId":"Pēc elementa ID","anchorName":"Pēc iezīmes nosaukuma","charset":"Pievienotā resursa kodējums","cssClasses":"Stilu saraksta klases","emailAddress":"E-pasta adrese","emailBody":"Ziņas saturs","emailSubject":"Ziņas tēma","id":"ID","info":"Hipersaites informācija","langCode":"Valodas kods","langDir":"Valodas lasīšanas virziens","langDirLTR":"No kreisās uz labo (LTR)","langDirRTL":"No labās uz kreiso (RTL)","menu":"Labot hipersaiti","name":"Nosaukums","noAnchors":"(Šajā dokumentā nav iezīmju)","noEmail":"Lūdzu norādi e-pasta adresi","noUrl":"Lūdzu norādi hipersaiti","other":"<cits>","popupDependent":"Atkarīgs (Netscape)","popupFeatures":"Uznirstošā loga nosaukums īpašības","popupFullScreen":"Pilnā ekrānā (IE)","popupLeft":"Kreisā koordināte","popupLocationBar":"Atrašanās vietas josla","popupMenuBar":"Izvēlnes josla","popupResizable":"Mērogojams","popupScrollBars":"Ritjoslas","popupStatusBar":"Statusa josla","popupToolbar":"Rīku josla","popupTop":"Augšējā koordināte","rel":"Relācija","selectAnchor":"Izvēlēties iezīmi","styles":"Stils","tabIndex":"Ciļņu indekss","target":"Mērķis","targetFrame":"<ietvars>","targetFrameName":"Mērķa ietvara nosaukums","targetPopup":"<uznirstošā logā>","targetPopupName":"Uznirstošā loga nosaukums","title":"Hipersaite","toAnchor":"Iezīme šajā lapā","toEmail":"E-pasts","toUrl":"Adrese","toolbar":"Ievietot/Labot hipersaiti","type":"Hipersaites tips","unlink":"Noņemt hipersaiti","upload":"Augšupielādēt"},"list":{"bulletedlist":"Pievienot/Noņemt vienkāršu sarakstu","numberedlist":"Numurēts saraksts"},"magicline":{"title":"Ievietot šeit rindkopu"},"maximize":{"maximize":"Maksimizēt","minimize":"Minimizēt"},"pastetext":{"button":"Ievietot kā vienkāršu tekstu","title":"Ievietot kā vienkāršu tekstu"},"pastefromword":{"confirmCleanup":"Teksts, kuru vēlaties ielīmēt, izskatās ir nokopēts no Word. Vai vēlaties to iztīrīt pirms ielīmēšanas?","error":"Iekšējas kļūdas dēļ, neizdevās iztīrīt ielīmētos datus.","title":"Ievietot no Worda","toolbar":"Ievietot no Worda"},"removeformat":{"toolbar":"Noņemt stilus"},"sourcearea":{"toolbar":"HTML kods"},"specialchar":{"options":"Speciālo simbolu uzstādījumi","title":"Ievietot īpašu simbolu","toolbar":"Ievietot speciālo simbolu"},"scayt":{"about":"Par SCAYT","aboutTab":"Par","addWord":"Pievienot vārdu","allCaps":"Ignorēt vārdus ar lielajiem burtiem","dic_create":"Izveidot","dic_delete":"Dzēst","dic_field_name":"Vārdnīcas nosaukums","dic_info":"Sākumā lietotāja vārdnīca tiek glabāta Cookie. Diemžēl, Cookie ir ierobežots izmērs. Kad vārdnīca sasniegs izmēru, ka to vairs nevar glabāt Cookie, tā tiks noglabāta uz servera. Lai saglabātu personīgo vārdnīcu uz jūsu servera, jums jānorāda tās nosaukums. Ja jūs jau esiet noglabājuši vārdnīcu, lūdzu ierakstiet tās nosaukum un nospiediet Atjaunot pogu.","dic_rename":"Pārsaukt","dic_restore":"Atjaunot","dictionariesTab":"Vārdnīcas","disable":"Atslēgt SCAYT","emptyDic":"Vārdnīcas nosaukums nevar būt tukšs.","enable":"Ieslēgt SCAYT","ignore":"Ignorēt","ignoreAll":"Ignorēt visu","ignoreDomainNames":"Ignorēt domēnu nosaukumus","langs":"Valodas","languagesTab":"Valodas","mixedCase":"Ignorēt vārdus ar jauktu reģistru burtiem","mixedWithDigits":"Ignorēt vārdus ar skaitļiem","moreSuggestions":"Vairāk ieteikumi","opera_title":"Opera neatbalsta","options":"Uzstādījumi","optionsTab":"Uzstādījumi","title":"Pārbaudīt gramatiku rakstot","toggle":"Pārslēgt SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stils","panelTitle":"Formatēšanas stili","panelTitle1":"Bloka stili","panelTitle2":"iekļautie stili","panelTitle3":"Objekta stili"},"table":{"border":"Rāmja izmērs","caption":"Leģenda","cell":{"menu":"Šūna","insertBefore":"Pievienot šūnu pirms","insertAfter":"Pievienot šūnu pēc","deleteCell":"Dzēst rūtiņas","merge":"Apvienot rūtiņas","mergeRight":"Apvieno pa labi","mergeDown":"Apvienot uz leju","splitHorizontal":"Sadalīt šūnu horizontāli","splitVertical":"Sadalīt šūnu vertikāli","title":"Šūnas uzstādījumi","cellType":"Šūnas tips","rowSpan":"Apvienotas rindas","colSpan":"Apvienotas kolonas","wordWrap":"Vārdu pārnese","hAlign":"Horizontālais novietojums","vAlign":"Vertikālais novietojums","alignBaseline":"Pamatrinda","bgColor":"Fona krāsa","borderColor":"Rāmja krāsa","data":"Dati","header":"Virsraksts","yes":"Jā","no":"Nē","invalidWidth":"Šūnas platumam jābūt skaitlim","invalidHeight":"Šūnas augstumam jābūt skaitlim","invalidRowSpan":"Apvienojamo rindu skaitam jābūt veselam skaitlim","invalidColSpan":"Apvienojamo kolonu skaitam jābūt veselam skaitlim","chooseColor":"Izvēlēties"},"cellPad":"Rūtiņu nobīde","cellSpace":"Rūtiņu atstatums","column":{"menu":"Kolonna","insertBefore":"Ievietot kolonu pirms","insertAfter":"Ievieto kolonu pēc","deleteColumn":"Dzēst kolonnas"},"columns":"Kolonnas","deleteTable":"Dzēst tabulu","headers":"Virsraksti","headersBoth":"Abi","headersColumn":"Pirmā kolona","headersNone":"Nekas","headersRow":"Pirmā rinda","invalidBorder":"Rāmju izmēram jābūt skaitlim","invalidCellPadding":"Šūnu atkāpēm jābūt pozitīvam skaitlim","invalidCellSpacing":"Šūnu atstarpēm jābūt pozitīvam skaitlim","invalidCols":"Kolonu skaitam jābūt lielākam par 0","invalidHeight":"Tabulas augstumam jābūt skaitlim","invalidRows":"Rindu skaitam jābūt lielākam par 0","invalidWidth":"Tabulas platumam jābūt skaitlim","menu":"Tabulas īpašības","row":{"menu":"Rinda","insertBefore":"Ievietot rindu pirms","insertAfter":"Ievietot rindu pēc","deleteRow":"Dzēst rindas"},"rows":"Rindas","summary":"Anotācija","title":"Tabulas īpašības","toolbar":"Tabula","widthPc":"procentuāli","widthPx":"pikseļos","widthUnit":"platuma mērvienība"},"undo":{"redo":"Atkārtot","undo":"Atcelt"},"wsc":{"btnIgnore":"Ignorēt","btnIgnoreAll":"Ignorēt visu","btnReplace":"Aizvietot","btnReplaceAll":"Aizvietot visu","btnUndo":"Atcelt","changeTo":"Nomainīt uz","errorLoading":"Kļūda ielādējot aplikācijas servisa adresi: %s.","ieSpellDownload":"Pareizrakstības pārbaudītājs nav pievienots. Vai vēlaties to lejupielādēt tagad?","manyChanges":"Pareizrakstības pārbaude pabeigta: %1 vārdi tika mainīti","noChanges":"Pareizrakstības pārbaude pabeigta: nekas netika labots","noMispell":"Pareizrakstības pārbaude pabeigta: kļūdas netika atrastas","noSuggestions":"- Nav ieteikumu -","notAvailable":"Atvainojiet, bet serviss šobrīd nav pieejams.","notInDic":"Netika atrasts vārdnīcā","oneChange":"Pareizrakstības pārbaude pabeigta: 1 vārds izmainīts","progress":"Notiek pareizrakstības pārbaude...","title":"Pārbaudīt gramatiku","toolbar":"Pareizrakstības pārbaude"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/mk.js b/theme/bootstrap/plugins/ckeditor/lang/mk.js new file mode 100644 index 0000000..65a42a4 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/mk.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['mk']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Send it to the Server","image":"Image","flash":"Flash","form":"Form","checkbox":"Checkbox","radio":"Radio Button","textField":"Text Field","textarea":"Textarea","hiddenField":"Hidden Field","button":"Button","select":"Selection Field","imageButton":"Image Button","notSet":"<not set>","id":"Id","name":"Name","langDir":"Language Direction","langDirLtr":"Left to Right (LTR)","langDirRtl":"Right to Left (RTL)","langCode":"Language Code","longDescr":"Long Description URL","cssClass":"Stylesheet Classes","advisoryTitle":"Advisory Title","cssStyle":"Style","ok":"OK","cancel":"Cancel","close":"Close","preview":"Preview","resize":"Resize","generalTab":"Општо","advancedTab":"Advanced","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"You have changed some options. Are you sure you want to close the dialog window?","options":"Options","target":"Target","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","styles":"Style","cssClasses":"Stylesheet Classes","width":"Width","height":"Height","align":"Alignment","alignLeft":"Left","alignRight":"Right","alignCenter":"Center","alignTop":"Top","alignMiddle":"Middle","alignBottom":"Bottom","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Copy","copyError":"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).","cut":"Cut","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"Paste","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Paste"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"Format","panelTitle":"Paragraph Format","tag_address":"Address","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Insert Horizontal Line"},"image":{"alertUrl":"Please type the image URL","alt":"Alternative Text","border":"Border","btnUpload":"Send it to the Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Image Info","linkTab":"Link","lockRatio":"Lock Ratio","menu":"Image Properties","resetSize":"Reset Size","title":"Image Properties","titleButton":"Image Button Properties","upload":"Upload","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Increase Indent","outdent":"Decrease Indent"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Access Key","advanced":"Advanced","advisoryContentType":"Advisory Content Type","advisoryTitle":"Advisory Title","anchor":{"toolbar":"Anchor","menu":"Edit Anchor","title":"Anchor Properties","name":"Anchor Name","errorName":"Please type the anchor name","remove":"Remove Anchor"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"Stylesheet Classes","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"Id","info":"Link Info","langCode":"Language Code","langDir":"Language Direction","langDirLTR":"Left to Right (LTR)","langDirRTL":"Right to Left (RTL)","menu":"Edit Link","name":"Name","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"Style","tabIndex":"Tab Index","target":"Target","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"Link","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"Link","type":"Link Type","unlink":"Unlink","upload":"Upload"},"list":{"bulletedlist":"Insert/Remove Bulleted List","numberedlist":"Insert/Remove Numbered List"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Paste as plain text","title":"Paste as Plain Text"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Paste from Word","toolbar":"Paste from Word"},"removeformat":{"toolbar":"Remove Format"},"sourcearea":{"toolbar":"Source"},"specialchar":{"options":"Special Character Options","title":"Select Special Character","toolbar":"Insert Special Character"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styles","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Border size","caption":"Caption","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Delete Cells","merge":"Merge Cells","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"Columns","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Table Properties","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"Rows","summary":"Summary","title":"Table Properties","toolbar":"Table","widthPc":"percent","widthPx":"pixels","widthUnit":"width unit"},"undo":{"redo":"Redo","undo":"Undo"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/mn.js b/theme/bootstrap/plugins/ckeditor/lang/mn.js new file mode 100644 index 0000000..b0dc5a2 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/mn.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['mn']={"editor":"Хэлбэрт бичвэр боловсруулагч","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Үйлчлэгч тооцоолуур (сервэр)-ийг үзэх","url":"цахим хуудасны хаяг (URL)","protocol":"Протокол","upload":"Илгээж ачаалах","uploadSubmit":"Үүнийг үйлчлэгч тооцоолуур (сервер) лүү илгээх","image":"Зураг","flash":"Флаш хөдөлгөөнтэй зураг","form":"Маягт","checkbox":"Тэмдэглээний нүд","radio":"Радио товчлуур","textField":"Бичвэрийн талбар","textarea":"Бичвэрийн зай","hiddenField":"Далд талбар","button":"Товчлуур","select":"Сонголтын талбар","imageButton":"Зургий товчуур","notSet":"<тохируулаагүй>","id":"Id (техникийн нэр)","name":"Нэр","langDir":"Хэлний чиглэл","langDirLtr":"Зүүнээс баруун (LTR)","langDirRtl":"Баруунаас зүүн (RTL)","langCode":"Хэлний код","longDescr":"Урт тайлбарын вэб хаяг","cssClass":"Хэлбэрийн хуудасны ангиуд","advisoryTitle":"Зөвлөх гарчиг","cssStyle":"Загвар","ok":"За","cancel":"Болих","close":"Хаах","preview":"Урьдчилан харах","resize":"Resize","generalTab":"Ерөнхий","advancedTab":"Гүнзгий","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"You have changed some options. Are you sure you want to close the dialog window?","options":"Сонголт","target":"Бай","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Зүүн талаас баруун тийшээ (LTR)","langDirRTL":"Баруун талаас зүүн тийшээ (RTL)","styles":"Загвар","cssClasses":"Хэлбэрийн хуудасны ангиуд","width":"Өргөн","height":"Өндөр","align":"Эгнээ","alignLeft":"Зүүн","alignRight":"Баруун","alignCenter":"Төвд","alignTop":"Дээд талд","alignMiddle":"Дунд","alignBottom":"Доод талд","invalidValue":"Invalid value.","invalidHeight":"Өндөр нь тоо байх ёстой.","invalidWidth":"Өргөн нь тоо байх ёстой.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Тод бүдүүн","italic":"Налуу","strike":"Дундуур нь зураастай болгох","subscript":"Суурь болгох","superscript":"Зэрэг болгох","underline":"Доогуур нь зураастай болгох"},"blockquote":{"toolbar":"Ишлэл хэсэг"},"clipboard":{"copy":"Хуулах","copyError":"Таны browser-ын хамгаалалтын тохиргоо editor-д автоматаар хуулах үйлдэлийг зөвшөөрөхгүй байна. (Ctrl/Cmd+C) товчны хослолыг ашиглана уу.","cut":"Хайчлах","cutError":"Таны browser-ын хамгаалалтын тохиргоо editor-д автоматаар хайчлах үйлдэлийг зөвшөөрөхгүй байна. (Ctrl/Cmd+X) товчны хослолыг ашиглана уу.","paste":"Буулгах","pasteArea":"Paste Area","pasteMsg":"(<strong>Ctrl/Cmd+V</strong>) товчийг ашиглан paste хийнэ үү. Мөн <strong>OK</strong> дар.","securityMsg":"Таны үзүүлэгч/browser/-н хамгаалалтын тохиргооноос болоод editor clipboard өгөгдөлрүү шууд хандах боломжгүй. Энэ цонход дахин paste хийхийг оролд.","title":"Буулгах"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Холбоосууд","insert":"Оруулах","styles":"Загварууд","colors":"Онгөнүүд","tools":"Хэрэгслүүд"},"toolbars":"Болосруулагчийн хэрэгслийн самбар"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"Параргафын загвар","panelTitle":"Параргафын загвар","tag_address":"Хаяг","tag_div":"Paragraph (DIV)","tag_h1":"Гарчиг 1","tag_h2":"Гарчиг 2","tag_h3":"Гарчиг 3","tag_h4":"Гарчиг 4","tag_h5":"Гарчиг 5","tag_h6":"Гарчиг 6","tag_p":"Хэвийн","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"Хөндлөн зураас оруулах"},"image":{"alertUrl":"Зурагны URL-ын төрлийн сонгоно уу","alt":"Зургийг орлох бичвэр","border":"Хүрээ","btnUpload":"Үүнийг сервэррүү илгээ","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"Хөндлөн зай","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Зурагны мэдээлэл","linkTab":"Холбоос","lockRatio":"Радио түгжих","menu":"Зураг","resetSize":"хэмжээ дахин оноох","title":"Зураг","titleButton":"Зурган товчны шинж чанар","upload":"Хуулах","urlMissing":"Зургийн эх сурвалжийн хаяг (URL) байхгүй байна.","vSpace":"Босоо зай","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Догол мөр хасах","outdent":"Догол мөр нэмэх"},"fakeobjects":{"anchor":"Зангуу","flash":"Flash Animation","hiddenfield":"Нууц талбар","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Холбох түлхүүр","advanced":"Нэмэлт","advisoryContentType":"Зөвлөлдөх төрлийн агуулга","advisoryTitle":"Зөвлөлдөх гарчиг","anchor":{"toolbar":"Зангуу","menu":"Зангууг болосруулах","title":"Зангуугийн шинж чанар","name":"Зангуугийн нэр","errorName":"Зангуугийн нэрийг оруулна уу","remove":"Зангууг устгах"},"anchorId":"Элемэнтйн Id нэрээр","anchorName":"Зангуугийн нэрээр","charset":"Тэмдэгт оноох нөөцөд холбогдсон","cssClasses":"Stylesheet классууд","emailAddress":"Э-шуудангийн хаяг","emailBody":"Зурвасны их бие","emailSubject":"Зурвасны гарчиг","id":"Id","info":"Холбоосын тухай мэдээлэл","langCode":"Хэлний код","langDir":"Хэлний чиглэл","langDirLTR":"Зүүнээс баруун (LTR)","langDirRTL":"Баруунаас зүүн (RTL)","menu":"Холбоос засварлах","name":"Нэр","noAnchors":"(Баримт бичиг зангуугүй байна)","noEmail":"Э-шуудангий хаягаа шивнэ үү","noUrl":"Холбоосны URL хаягийг шивнэ үү","other":"<other>","popupDependent":"Хамаатай (Netscape)","popupFeatures":"Popup цонхны онцлог","popupFullScreen":"Цонх дүүргэх (Internet Explorer)","popupLeft":"Зүүн байрлал","popupLocationBar":"Location хэсэг","popupMenuBar":"Цэсний самбар","popupResizable":"Resizable","popupScrollBars":"Скрол хэсэгүүд","popupStatusBar":"Статус хэсэг","popupToolbar":"Багажны самбар","popupTop":"Дээд байрлал","rel":"Relationship","selectAnchor":"Нэг зангууг сонгоно уу","styles":"Загвар","tabIndex":"Tab индекс","target":"Байрлал","targetFrame":"<Агуулах хүрээ>","targetFrameName":"Очих фремын нэр","targetPopup":"<popup цонх>","targetPopupName":"Popup цонхны нэр","title":"Холбоос","toAnchor":"Энэ бичвэр дэх зангуу руу очих холбоос","toEmail":"Э-захиа","toUrl":"цахим хуудасны хаяг (URL)","toolbar":"Холбоос","type":"Линкийн төрөл","unlink":"Холбоос авч хаях","upload":"Хуулах"},"list":{"bulletedlist":"Цэгтэй жагсаалт","numberedlist":"Дугаарлагдсан жагсаалт"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Дэлгэц дүүргэх","minimize":"Цонхыг багсгаж харуулах"},"pastetext":{"button":"Энгийн бичвэрээр буулгах","title":"Энгийн бичвэрээр буулгах"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Word-оос буулгах","toolbar":"Word-оос буулгах"},"removeformat":{"toolbar":"Параргафын загварыг авч хаях"},"sourcearea":{"toolbar":"Код"},"specialchar":{"options":"Special Character Options","title":"Онцгой тэмдэгт сонгох","toolbar":"Онцгой тэмдэгт оруулах"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Бий болгох","dic_delete":"Устгах","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Нэрийг солих","dic_restore":"Restore","dictionariesTab":"Толь бичгүүд","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Хэлүүд","languagesTab":"Хэлүүд","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Сонголт","optionsTab":"Сонголт","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Загвар","panelTitle":"Загвар хэлбэржүүлэх","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Хүрээний хэмжээ","caption":"Тайлбар","cell":{"menu":"Нүх/зай","insertBefore":"Нүх/зай өмнө нь оруулах","insertAfter":"Нүх/зай дараа нь оруулах","deleteCell":"Нүх устгах","merge":"Нүх нэгтэх","mergeRight":"Баруун тийш нэгтгэх","mergeDown":"Доош нэгтгэх","splitHorizontal":"Нүх/зайг босоогоор нь тусгаарлах","splitVertical":"Нүх/зайг хөндлөнгөөр нь тусгаарлах","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Хэвтээд тэгшлэх арга","vAlign":"Босоод тэгшлэх арга","alignBaseline":"Baseline","bgColor":"Дэвсгэр өнгө","borderColor":"Хүрээний өнгө","data":"Data","header":"Header","yes":"Тийм","no":"Үгүй","invalidWidth":"Нүдний өргөн нь тоо байх ёстой.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Сонгох"},"cellPad":"Нүх доторлох(padding)","cellSpace":"Нүх хоорондын зай (spacing)","column":{"menu":"Багана","insertBefore":"Багана өмнө нь оруулах","insertAfter":"Багана дараа нь оруулах","deleteColumn":"Багана устгах"},"columns":"Багана","deleteTable":"Хүснэгт устгах","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Хүснэгтийн өргөн нь тоо байх ёстой.","menu":"Хүснэгт","row":{"menu":"Мөр","insertBefore":"Мөр өмнө нь оруулах","insertAfter":"Мөр дараа нь оруулах","deleteRow":"Мөр устгах"},"rows":"Мөр","summary":"Тайлбар","title":"Хүснэгт","toolbar":"Хүснэгт","widthPc":"хувь","widthPx":"цэг","widthUnit":"өргөний нэгж"},"undo":{"redo":"Өмнөх үйлдлээ сэргээх","undo":"Хүчингүй болгох"},"wsc":{"btnIgnore":"Зөвшөөрөх","btnIgnoreAll":"Бүгдийг зөвшөөрөх","btnReplace":"Солих","btnReplaceAll":"Бүгдийг Дарж бичих","btnUndo":"Буцаах","changeTo":"Өөрчлөх","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Дүрэм шалгагч суугаагүй байна. Татаж авахыг хүсч байна уу?","manyChanges":"Дүрэм шалгаад дууссан: %1 үг өөрчлөгдсөн","noChanges":"Дүрэм шалгаад дууссан: үг өөрчлөгдөөгүй","noMispell":"Дүрэм шалгаад дууссан: Алдаа олдсонгүй","noSuggestions":"- Тайлбаргүй -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Толь бичиггүй","oneChange":"Дүрэм шалгаад дууссан: 1 үг өөрчлөгдсөн","progress":"Дүрэм шалгаж байгаа үйл явц...","title":"Spell Check","toolbar":"Үгийн дүрэх шалгах"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/ms.js b/theme/bootstrap/plugins/ckeditor/lang/ms.js new file mode 100644 index 0000000..24242b9 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/ms.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['ms']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Browse Server","url":"URL","protocol":"Protokol","upload":"Muat Naik","uploadSubmit":"Hantar ke Server","image":"Gambar","flash":"Flash","form":"Borang","checkbox":"Checkbox","radio":"Butang Radio","textField":"Text Field","textarea":"Textarea","hiddenField":"Field Tersembunyi","button":"Butang","select":"Field Pilihan","imageButton":"Butang Bergambar","notSet":"<tidak di set>","id":"Id","name":"Nama","langDir":"Arah Tulisan","langDirLtr":"Kiri ke Kanan (LTR)","langDirRtl":"Kanan ke Kiri (RTL)","langCode":"Kod Bahasa","longDescr":"Butiran Panjang URL","cssClass":"Kelas-kelas Stylesheet","advisoryTitle":"Tajuk Makluman","cssStyle":"Stail","ok":"OK","cancel":"Batal","close":"Close","preview":"Prebiu","resize":"Resize","generalTab":"General","advancedTab":"Advanced","validateNumberFailed":"This value is not a number.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"You have changed some options. Are you sure you want to close the dialog window?","options":"Options","target":"Sasaran","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Kiri ke Kanan (LTR)","langDirRTL":"Kanan ke Kiri (RTL)","styles":"Stail","cssClasses":"Kelas-kelas Stylesheet","width":"Lebar","height":"Tinggi","align":"Jajaran","alignLeft":"Kiri","alignRight":"Kanan","alignCenter":"Tengah","alignTop":"Atas","alignMiddle":"Pertengahan","alignBottom":"Bawah","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Bold","italic":"Italic","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"Underline"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Salin","copyError":"Keselamatan perisian browser anda tidak membenarkan operasi salinan text/imej. Sila gunakan papan kekunci (Ctrl/Cmd+C).","cut":"Potong","cutError":"Keselamatan perisian browser anda tidak membenarkan operasi suntingan text/imej. Sila gunakan papan kekunci (Ctrl/Cmd+X).","paste":"Tampal","pasteArea":"Paste Area","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"Tampal"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Collapse Toolbar","toolbarExpand":"Expand Toolbar","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor toolbars"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Alamat","tag_div":"Perenggan (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Telah Diformat"},"horizontalrule":{"toolbar":"Masukkan Garisan Membujur"},"image":{"alertUrl":"Sila taip URL untuk fail gambar","alt":"Text Alternatif","border":"Border","btnUpload":"Hantar ke Server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"Ruang Melintang","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Info Imej","linkTab":"Sambungan","lockRatio":"Tetapkan Nisbah","menu":"Ciri-ciri Imej","resetSize":"Saiz Set Semula","title":"Ciri-ciri Imej","titleButton":"Ciri-ciri Butang Bergambar","upload":"Muat Naik","urlMissing":"Image source URL is missing.","vSpace":"Ruang Menegak","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Tambahkan Inden","outdent":"Kurangkan Inden"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Kunci Akses","advanced":"Advanced","advisoryContentType":"Jenis Kandungan Makluman","advisoryTitle":"Tajuk Makluman","anchor":{"toolbar":"Masukkan/Sunting Pautan","menu":"Ciri-ciri Pautan","title":"Ciri-ciri Pautan","name":"Nama Pautan","errorName":"Sila taip nama pautan","remove":"Remove Anchor"},"anchorId":"dengan menggunakan ID elemen","anchorName":"dengan menggunakan nama pautan","charset":"Linked Resource Charset","cssClasses":"Kelas-kelas Stylesheet","emailAddress":"Alamat E-Mail","emailBody":"Isi Kandungan Mesej","emailSubject":"Subjek Mesej","id":"Id","info":"Butiran Sambungan","langCode":"Arah Tulisan","langDir":"Arah Tulisan","langDirLTR":"Kiri ke Kanan (LTR)","langDirRTL":"Kanan ke Kiri (RTL)","menu":"Sunting Sambungan","name":"Nama","noAnchors":"(Tiada pautan terdapat dalam dokumen ini)","noEmail":"Sila taip alamat e-mail","noUrl":"Sila taip sambungan URL","other":"<lain>","popupDependent":"Bergantungan (Netscape)","popupFeatures":"Ciri Tetingkap Popup","popupFullScreen":"Skrin Penuh (IE)","popupLeft":"Posisi Kiri","popupLocationBar":"Bar Lokasi","popupMenuBar":"Bar Menu","popupResizable":"Resizable","popupScrollBars":"Bar-bar skrol","popupStatusBar":"Bar Status","popupToolbar":"Toolbar","popupTop":"Posisi Atas","rel":"Relationship","selectAnchor":"Sila pilih pautan","styles":"Stail","tabIndex":"Indeks Tab ","target":"Sasaran","targetFrame":"<bingkai>","targetFrameName":"Nama Bingkai Sasaran","targetPopup":"<tetingkap popup>","targetPopupName":"Nama Tetingkap Popup","title":"Sambungan","toAnchor":"Pautan dalam muka surat ini","toEmail":"E-Mail","toUrl":"URL","toolbar":"Masukkan/Sunting Sambungan","type":"Jenis Sambungan","unlink":"Buang Sambungan","upload":"Muat Naik"},"list":{"bulletedlist":"Senarai tidak bernombor","numberedlist":"Senarai bernombor"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Tampal sebagai text biasa","title":"Tampal sebagai text biasa"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Tampal dari Word","toolbar":"Tampal dari Word"},"removeformat":{"toolbar":"Buang Format"},"sourcearea":{"toolbar":"Sumber"},"specialchar":{"options":"Special Character Options","title":"Sila pilih huruf istimewa","toolbar":"Masukkan Huruf Istimewa"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stail","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Saiz Border","caption":"Keterangan","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Buangkan Sel-sel","merge":"Cantumkan Sel-sel","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Tambahan Ruang Sel","cellSpace":"Ruangan Antara Sel","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Buangkan Lajur"},"columns":"Jaluran","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"None","headersRow":"First Row","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Ciri-ciri Jadual","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Buangkan Baris"},"rows":"Barisan","summary":"Summary","title":"Ciri-ciri Jadual","toolbar":"Jadual","widthPc":"peratus","widthPx":"piksel-piksel","widthUnit":"width unit"},"undo":{"redo":"Ulangkan","undo":"Batalkan"},"wsc":{"btnIgnore":"Biar","btnIgnoreAll":"Biarkan semua","btnReplace":"Ganti","btnReplaceAll":"Gantikan Semua","btnUndo":"Batalkan","changeTo":"Tukarkan kepada","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Pemeriksa ejaan tidak dipasang. Adakah anda mahu muat turun sekarang?","manyChanges":"Pemeriksaan ejaan siap: %1 perkataan diubah","noChanges":"Pemeriksaan ejaan siap: Tiada perkataan diubah","noMispell":"Pemeriksaan ejaan siap: Tiada salah ejaan","noSuggestions":"- Tiada cadangan -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Tidak terdapat didalam kamus","oneChange":"Pemeriksaan ejaan siap: Satu perkataan telah diubah","progress":"Pemeriksaan ejaan sedang diproses...","title":"Spell Check","toolbar":"Semak Ejaan"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/nb.js b/theme/bootstrap/plugins/ckeditor/lang/nb.js new file mode 100644 index 0000000..09d7435 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/nb.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['nb']={"editor":"Rikteksteditor","editorPanel":"Panel for rikteksteditor","common":{"editorHelp":"Trykk ALT 0 for hjelp","browseServer":"Bla igjennom server","url":"URL","protocol":"Protokoll","upload":"Last opp","uploadSubmit":"Send det til serveren","image":"Bilde","flash":"Flash","form":"Skjema","checkbox":"Avmerkingsboks","radio":"Alternativknapp","textField":"Tekstboks","textarea":"Tekstområde","hiddenField":"Skjult felt","button":"Knapp","select":"Rullegardinliste","imageButton":"Bildeknapp","notSet":"<ikke satt>","id":"Id","name":"Navn","langDir":"Språkretning","langDirLtr":"Venstre til høyre (VTH)","langDirRtl":"Høyre til venstre (HTV)","langCode":"Språkkode","longDescr":"Utvidet beskrivelse","cssClass":"Stilarkklasser","advisoryTitle":"Tittel","cssStyle":"Stil","ok":"OK","cancel":"Avbryt","close":"Lukk","preview":"Forhåndsvis","resize":"Dra for å skalere","generalTab":"Generelt","advancedTab":"Avansert","validateNumberFailed":"Denne verdien er ikke et tall.","confirmNewPage":"Alle ulagrede endringer som er gjort i dette innholdet vil bli tapt. Er du sikker på at du vil laste en ny side?","confirmCancel":"Noen av valgene har blitt endret. Er du sikker på at du vil lukke dialogen?","options":"Valg","target":"Mål","targetNew":"Nytt vindu (_blank)","targetTop":"Hele vindu (_top)","targetSelf":"Samme vindu (_self)","targetParent":"Foreldrevindu (_parent)","langDirLTR":"Venstre til høyre (VTH)","langDirRTL":"Høyre til venstre (HTV)","styles":"Stil","cssClasses":"Stilarkklasser","width":"Bredde","height":"Høyde","align":"Juster","alignLeft":"Venstre","alignRight":"Høyre","alignCenter":"Midtjuster","alignTop":"Topp","alignMiddle":"Midten","alignBottom":"Bunn","invalidValue":"Ugyldig verdi.","invalidHeight":"Høyde må være et tall.","invalidWidth":"Bredde må være et tall.","invalidCssLength":"Den angitte verdien for feltet \"%1\" må være et positivt tall med eller uten en gyldig CSS-målingsenhet (px, %, in, cm, mm, em, ex, pt, eller pc).","invalidHtmlLength":"Den angitte verdien for feltet \"%1\" må være et positivt tall med eller uten en gyldig HTML-målingsenhet (px eller %).","invalidInlineStyle":"Verdi angitt for inline stil må bestå av en eller flere sett med formatet \"navn : verdi\", separert med semikolon","cssLengthTooltip":"Skriv inn et tall for en piksel-verdi eller et tall med en gyldig CSS-enhet (px, %, in, cm, mm, em, ex, pt, eller pc).","unavailable":"%1<span class=\"cke_accessibility\">, utilgjenglig</span>"},"about":{"copy":"Copyright &copy; $1. Alle rettigheter reservert.","dlgTitle":"Om CKEditor","help":"Se $1 for hjelp.","moreInfo":"For lisensieringsinformasjon, vennligst besøk vårt nettsted:","title":"Om CKEditor","userGuide":"CKEditors brukerveiledning"},"basicstyles":{"bold":"Fet","italic":"Kursiv","strike":"Gjennomstreking","subscript":"Senket skrift","superscript":"Hevet skrift","underline":"Understreking"},"blockquote":{"toolbar":"Blokksitat"},"clipboard":{"copy":"Kopier","copyError":"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk tastatursnarveien (Ctrl/Cmd+C).","cut":"Klipp ut","cutError":"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk tastatursnarveien (Ctrl/Cmd+X).","paste":"Lim inn","pasteArea":"Innlimingsområde","pasteMsg":"Vennligst lim inn i følgende boks med tastaturet (<strong>Ctrl/Cmd+V</strong>) og trykk <strong>OK</strong>.","securityMsg":"Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du må derfor lime det inn på nytt i dette vinduet.","title":"Lim inn"},"contextmenu":{"options":"Alternativer for høyreklikkmeny"},"toolbar":{"toolbarCollapse":"Skjul verktøylinje","toolbarExpand":"Vis verktøylinje","toolbarGroups":{"document":"Dokument","clipboard":"Utklippstavle/Angre","editing":"Redigering","forms":"Skjema","basicstyles":"Basisstiler","paragraph":"Avsnitt","links":"Lenker","insert":"Innsetting","styles":"Stiler","colors":"Farger","tools":"Verktøy"},"toolbars":"Verktøylinjer for editor"},"elementspath":{"eleLabel":"Element-sti","eleTitle":"%1 element"},"format":{"label":"Format","panelTitle":"Avsnittsformat","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"Overskrift 1","tag_h2":"Overskrift 2","tag_h3":"Overskrift 3","tag_h4":"Overskrift 4","tag_h5":"Overskrift 5","tag_h6":"Overskrift 6","tag_p":"Normal","tag_pre":"Formatert"},"horizontalrule":{"toolbar":"Sett inn horisontal linje"},"image":{"alertUrl":"Vennligst skriv bilde-urlen","alt":"Alternativ tekst","border":"Ramme","btnUpload":"Send det til serveren","button2Img":"Vil du endre den valgte bildeknappen til et vanlig bilde?","hSpace":"HMarg","img2Button":"Vil du endre det valgte bildet til en bildeknapp?","infoTab":"Bildeinformasjon","linkTab":"Lenke","lockRatio":"Lås forhold","menu":"Bildeegenskaper","resetSize":"Tilbakestill størrelse","title":"Bildeegenskaper","titleButton":"Egenskaper for bildeknapp","upload":"Last opp","urlMissing":"Bildets adresse mangler.","vSpace":"VMarg","validateBorder":"Ramme må være et heltall.","validateHSpace":"HMarg må være et heltall.","validateVSpace":"VMarg må være et heltall."},"indent":{"indent":"Øk innrykk","outdent":"Reduser innrykk"},"fakeobjects":{"anchor":"Anker","flash":"Flash-animasjon","hiddenfield":"Skjult felt","iframe":"IFrame","unknown":"Ukjent objekt"},"link":{"acccessKey":"Aksessknapp","advanced":"Avansert","advisoryContentType":"Type","advisoryTitle":"Tittel","anchor":{"toolbar":"Sett inn/Rediger anker","menu":"Egenskaper for anker","title":"Egenskaper for anker","name":"Ankernavn","errorName":"Vennligst skriv inn ankernavnet","remove":"Fjern anker"},"anchorId":"Element etter ID","anchorName":"Anker etter navn","charset":"Lenket tegnsett","cssClasses":"Stilarkklasser","emailAddress":"E-postadresse","emailBody":"Melding","emailSubject":"Meldingsemne","id":"Id","info":"Lenkeinfo","langCode":"Språkkode","langDir":"Språkretning","langDirLTR":"Venstre til høyre (VTH)","langDirRTL":"Høyre til venstre (HTV)","menu":"Rediger lenke","name":"Navn","noAnchors":"(Ingen anker i dokumentet)","noEmail":"Vennligst skriv inn e-postadressen","noUrl":"Vennligst skriv inn lenkens URL","other":"<annen>","popupDependent":"Avhenging (Netscape)","popupFeatures":"Egenskaper for popup-vindu","popupFullScreen":"Fullskjerm (IE)","popupLeft":"Venstre posisjon","popupLocationBar":"Adresselinje","popupMenuBar":"Menylinje","popupResizable":"Skalerbar","popupScrollBars":"Scrollbar","popupStatusBar":"Statuslinje","popupToolbar":"Verktøylinje","popupTop":"Topp-posisjon","rel":"Relasjon (rel)","selectAnchor":"Velg et anker","styles":"Stil","tabIndex":"Tabindeks","target":"Mål","targetFrame":"<ramme>","targetFrameName":"Målramme","targetPopup":"<popup-vindu>","targetPopupName":"Navn på popup-vindu","title":"Lenke","toAnchor":"Lenke til anker i teksten","toEmail":"E-post","toUrl":"URL","toolbar":"Sett inn/Rediger lenke","type":"Lenketype","unlink":"Fjern lenke","upload":"Last opp"},"list":{"bulletedlist":"Legg til/Fjern punktmerket liste","numberedlist":"Legg til/Fjern nummerert liste"},"magicline":{"title":"Sett inn nytt avsnitt her"},"maximize":{"maximize":"Maksimer","minimize":"Minimer"},"pastetext":{"button":"Lim inn som ren tekst","title":"Lim inn som ren tekst"},"pastefromword":{"confirmCleanup":"Teksten du limer inn ser ut til å være kopiert fra Word. Vil du renske den før du limer den inn?","error":"Det var ikke mulig å renske den innlimte teksten på grunn av en intern feil","title":"Lim inn fra Word","toolbar":"Lim inn fra Word"},"removeformat":{"toolbar":"Fjern formatering"},"sourcearea":{"toolbar":"Kilde"},"specialchar":{"options":"Alternativer for spesialtegn","title":"Velg spesialtegn","toolbar":"Sett inn spesialtegn"},"scayt":{"about":"Om SCAYT","aboutTab":"Om","addWord":"Legg til ord","allCaps":"Ikke kontroller ord med kun store bokstaver","dic_create":"Opprett","dic_delete":"Slett","dic_field_name":"Ordboknavn","dic_info":"Brukerordboken lagres først i en informasjonskapsel på din maskin, men det er en begrensning på hvor mye som kan lagres her. Når ordboken blir for stor til å lagres i en informasjonskapsel, vil vi i stedet lagre ordboken på vår server. For å lagre din personlige ordbok på vår server, burde du velge et navn for ordboken din. Hvis du allerede har lagret en ordbok, vennligst skriv inn ordbokens navn og klikk på Gjenopprett-knappen.","dic_rename":"Gi nytt navn","dic_restore":"Gjenopprett","dictionariesTab":"Ordbøker","disable":"Slå av SCAYT","emptyDic":"Ordboknavn bør ikke være tom.","enable":"Slå på SCAYT","ignore":"Ignorer","ignoreAll":"Ignorer Alle","ignoreDomainNames":"Ikke kontroller domenenavn","langs":"Språk","languagesTab":"Språk","mixedCase":"Ikke kontroller ord med blandet små og store bokstaver","mixedWithDigits":"Ikke kontroller ord som inneholder tall","moreSuggestions":"Flere forslag","opera_title":"Ikke støttet av Opera","options":"Valg","optionsTab":"Valg","title":"Stavekontroll mens du skriver","toggle":"Veksle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Stilformater","panelTitle1":"Blokkstiler","panelTitle2":"Inlinestiler","panelTitle3":"Objektstiler"},"table":{"border":"Rammestørrelse","caption":"Tittel","cell":{"menu":"Celle","insertBefore":"Sett inn celle før","insertAfter":"Sett inn celle etter","deleteCell":"Slett celler","merge":"Slå sammen celler","mergeRight":"Slå sammen høyre","mergeDown":"Slå sammen ned","splitHorizontal":"Del celle horisontalt","splitVertical":"Del celle vertikalt","title":"Celleegenskaper","cellType":"Celletype","rowSpan":"Radspenn","colSpan":"Kolonnespenn","wordWrap":"Tekstbrytning","hAlign":"Horisontal justering","vAlign":"Vertikal justering","alignBaseline":"Grunnlinje","bgColor":"Bakgrunnsfarge","borderColor":"Rammefarge","data":"Data","header":"Overskrift","yes":"Ja","no":"Nei","invalidWidth":"Cellebredde må være et tall.","invalidHeight":"Cellehøyde må være et tall.","invalidRowSpan":"Radspenn må være et heltall.","invalidColSpan":"Kolonnespenn må være et heltall.","chooseColor":"Velg"},"cellPad":"Cellepolstring","cellSpace":"Cellemarg","column":{"menu":"Kolonne","insertBefore":"Sett inn kolonne før","insertAfter":"Sett inn kolonne etter","deleteColumn":"Slett kolonner"},"columns":"Kolonner","deleteTable":"Slett tabell","headers":"Overskrifter","headersBoth":"Begge","headersColumn":"Første kolonne","headersNone":"Ingen","headersRow":"Første rad","invalidBorder":"Rammestørrelse må være et tall.","invalidCellPadding":"Cellepolstring må være et positivt tall.","invalidCellSpacing":"Cellemarg må være et positivt tall.","invalidCols":"Antall kolonner må være et tall større enn 0.","invalidHeight":"Tabellhøyde må være et tall.","invalidRows":"Antall rader må være et tall større enn 0.","invalidWidth":"Tabellbredde må være et tall.","menu":"Egenskaper for tabell","row":{"menu":"Rader","insertBefore":"Sett inn rad før","insertAfter":"Sett inn rad etter","deleteRow":"Slett rader"},"rows":"Rader","summary":"Sammendrag","title":"Egenskaper for tabell","toolbar":"Tabell","widthPc":"prosent","widthPx":"piksler","widthUnit":"Bredde-enhet"},"undo":{"redo":"Gjør om","undo":"Angre"},"wsc":{"btnIgnore":"Ignorer","btnIgnoreAll":"Ignorer alle","btnReplace":"Erstatt","btnReplaceAll":"Erstatt alle","btnUndo":"Angre","changeTo":"Endre til","errorLoading":"Feil under lasting av applikasjonstjenestetjener: %s.","ieSpellDownload":"Stavekontroll er ikke installert. Vil du laste den ned nå?","manyChanges":"Stavekontroll fullført: %1 ord endret","noChanges":"Stavekontroll fullført: ingen ord endret","noMispell":"Stavekontroll fullført: ingen feilstavinger funnet","noSuggestions":"- Ingen forslag -","notAvailable":"Beklager, tjenesten er utilgjenglig nå.","notInDic":"Ikke i ordboken","oneChange":"Stavekontroll fullført: Ett ord endret","progress":"Stavekontroll pågår...","title":"Stavekontroll","toolbar":"Stavekontroll"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/nl.js b/theme/bootstrap/plugins/ckeditor/lang/nl.js new file mode 100644 index 0000000..39cd3a4 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/nl.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['nl']={"editor":"Tekstverwerker","editorPanel":"Tekstverwerker beheerpaneel","common":{"editorHelp":"Druk ALT 0 voor hulp","browseServer":"Bladeren op server","url":"URL","protocol":"Protocol","upload":"Upload","uploadSubmit":"Naar server verzenden","image":"Afbeelding","flash":"Flash","form":"Formulier","checkbox":"Selectievinkje","radio":"Keuzerondje","textField":"Tekstveld","textarea":"Tekstvak","hiddenField":"Verborgen veld","button":"Knop","select":"Selectieveld","imageButton":"Afbeeldingsknop","notSet":"<niet ingevuld>","id":"Id","name":"Naam","langDir":"Schrijfrichting","langDirLtr":"Links naar rechts (LTR)","langDirRtl":"Rechts naar links (RTL)","langCode":"Taalcode","longDescr":"Lange URL-omschrijving","cssClass":"Stylesheet-klassen","advisoryTitle":"Adviserende titel","cssStyle":"Stijl","ok":"OK","cancel":"Annuleren","close":"Sluiten","preview":"Voorbeeld","resize":"Sleep om te herschalen","generalTab":"Algemeen","advancedTab":"Geavanceerd","validateNumberFailed":"Deze waarde is geen geldig getal.","confirmNewPage":"Alle aangebrachte wijzigingen gaan verloren. Weet u zeker dat u een nieuwe pagina wilt openen?","confirmCancel":"Enkele opties zijn gewijzigd. Weet u zeker dat u dit dialoogvenster wilt sluiten?","options":"Opties","target":"Doelvenster","targetNew":"Nieuw venster (_blank)","targetTop":"Hele venster (_top)","targetSelf":"Zelfde venster (_self)","targetParent":"Origineel venster (_parent)","langDirLTR":"Links naar rechts (LTR)","langDirRTL":"Rechts naar links (RTL)","styles":"Stijl","cssClasses":"Stylesheet-klassen","width":"Breedte","height":"Hoogte","align":"Uitlijning","alignLeft":"Links","alignRight":"Rechts","alignCenter":"Centreren","alignTop":"Boven","alignMiddle":"Midden","alignBottom":"Onder","invalidValue":"Ongeldige waarde.","invalidHeight":"De hoogte moet een getal zijn.","invalidWidth":"De breedte moet een getal zijn.","invalidCssLength":"Waarde in veld \"%1\" moet een positief nummer zijn, met of zonder een geldige CSS meeteenheid (px, %, in, cm, mm, em, ex, pt of pc).","invalidHtmlLength":"Waarde in veld \"%1\" moet een positief nummer zijn, met of zonder een geldige HTML meeteenheid (px of %).","invalidInlineStyle":"Waarde voor de online stijl moet bestaan uit een of meerdere tupels met het formaat \"naam : waarde\", gescheiden door puntkomma's.","cssLengthTooltip":"Geef een nummer in voor een waarde in pixels of geef een nummer in met een geldige CSS eenheid (px, %, in, cm, mm, em, ex, pt, of pc).","unavailable":"%1<span class=\"cke_accessibility\">, niet beschikbaar</span>"},"about":{"copy":"Copyright &copy; $1. Alle rechten voorbehouden.","dlgTitle":"Over CKEditor","help":"Bekijk de $1 voor hulp.","moreInfo":"Bezoek onze website voor licentieinformatie:","title":"Over CKEditor","userGuide":"CKEditor gebruiksaanwijzing"},"basicstyles":{"bold":"Vet","italic":"Cursief","strike":"Doorhalen","subscript":"Subscript","superscript":"Superscript","underline":"Onderstrepen"},"blockquote":{"toolbar":"Citaatblok"},"clipboard":{"copy":"Kopiëren","copyError":"De beveiligingsinstelling van de browser verhinderen het automatisch kopiëren. Gebruik de sneltoets Ctrl/Cmd+C van het toetsenbord.","cut":"Knippen","cutError":"De beveiligingsinstelling van de browser verhinderen het automatisch knippen. Gebruik de sneltoets Ctrl/Cmd+X van het toetsenbord.","paste":"Plakken","pasteArea":"Plakgebied","pasteMsg":"Plak de tekst in het volgende vak gebruikmakend van uw toetsenbord (<strong>Ctrl/Cmd+V</strong>) en klik op OK.","securityMsg":"Door de beveiligingsinstellingen van uw browser is het niet mogelijk om direct vanuit het klembord in de editor te plakken. Middels opnieuw plakken in dit venster kunt u de tekst alsnog plakken in de editor.","title":"Plakken"},"contextmenu":{"options":"Contextmenu opties"},"toolbar":{"toolbarCollapse":"Werkbalk inklappen","toolbarExpand":"Werkbalk uitklappen","toolbarGroups":{"document":"Document","clipboard":"Klembord/Ongedaan maken","editing":"Bewerken","forms":"Formulieren","basicstyles":"Basisstijlen","paragraph":"Paragraaf","links":"Links","insert":"Invoegen","styles":"Stijlen","colors":"Kleuren","tools":"Toepassingen"},"toolbars":"Werkbalken"},"elementspath":{"eleLabel":"Elementenpad","eleTitle":"%1 element"},"format":{"label":"Opmaak","panelTitle":"Opmaak","tag_address":"Adres","tag_div":"Normaal (DIV)","tag_h1":"Kop 1","tag_h2":"Kop 2","tag_h3":"Kop 3","tag_h4":"Kop 4","tag_h5":"Kop 5","tag_h6":"Kop 6","tag_p":"Normaal","tag_pre":"Met opmaak"},"horizontalrule":{"toolbar":"Horizontale lijn invoegen"},"image":{"alertUrl":"Geef de URL van de afbeelding","alt":"Alternatieve tekst","border":"Rand","btnUpload":"Naar server verzenden","button2Img":"Wilt u de geselecteerde afbeeldingsknop vervangen door een eenvoudige afbeelding?","hSpace":"HSpace","img2Button":"Wilt u de geselecteerde afbeelding vervangen door een afbeeldingsknop?","infoTab":"Informatie afbeelding","linkTab":"Link","lockRatio":"Afmetingen vergrendelen","menu":"Eigenschappen afbeelding","resetSize":"Afmetingen resetten","title":"Eigenschappen afbeelding","titleButton":"Eigenschappen afbeeldingsknop","upload":"Upload","urlMissing":"De URL naar de afbeelding ontbreekt.","vSpace":"VSpace","validateBorder":"Rand moet een heel nummer zijn.","validateHSpace":"HSpace moet een heel nummer zijn.","validateVSpace":"VSpace moet een heel nummer zijn."},"indent":{"indent":"Inspringing vergroten","outdent":"Inspringing verkleinen"},"fakeobjects":{"anchor":"Interne link","flash":"Flash animatie","hiddenfield":"Verborgen veld","iframe":"IFrame","unknown":"Onbekend object"},"link":{"acccessKey":"Toegangstoets","advanced":"Geavanceerd","advisoryContentType":"Aanbevolen content-type","advisoryTitle":"Adviserende titel","anchor":{"toolbar":"Interne link","menu":"Eigenschappen interne link","title":"Eigenschappen interne link","name":"Naam interne link","errorName":"Geef de naam van de interne link op","remove":"Interne link verwijderen"},"anchorId":"Op kenmerk interne link","anchorName":"Op naam interne link","charset":"Karakterset van gelinkte bron","cssClasses":"Stylesheet-klassen","emailAddress":"E-mailadres","emailBody":"Inhoud bericht","emailSubject":"Onderwerp bericht","id":"Id","info":"Linkomschrijving","langCode":"Taalcode","langDir":"Schrijfrichting","langDirLTR":"Links naar rechts (LTR)","langDirRTL":"Rechts naar links (RTL)","menu":"Link wijzigen","name":"Naam","noAnchors":"(Geen interne links in document gevonden)","noEmail":"Geef een e-mailadres","noUrl":"Geef de link van de URL","other":"<ander>","popupDependent":"Afhankelijk (Netscape)","popupFeatures":"Instellingen popupvenster","popupFullScreen":"Volledig scherm (IE)","popupLeft":"Positie links","popupLocationBar":"Locatiemenu","popupMenuBar":"Menubalk","popupResizable":"Herschaalbaar","popupScrollBars":"Schuifbalken","popupStatusBar":"Statusbalk","popupToolbar":"Werkbalk","popupTop":"Positie boven","rel":"Relatie","selectAnchor":"Kies een interne link","styles":"Stijl","tabIndex":"Tabvolgorde","target":"Doelvenster","targetFrame":"<frame>","targetFrameName":"Naam doelframe","targetPopup":"<popupvenster>","targetPopupName":"Naam popupvenster","title":"Link","toAnchor":"Interne link in pagina","toEmail":"E-mail","toUrl":"URL","toolbar":"Link invoegen/wijzigen","type":"Linktype","unlink":"Link verwijderen","upload":"Upload"},"list":{"bulletedlist":"Opsomming invoegen","numberedlist":"Genummerde lijst invoegen"},"magicline":{"title":"Hier paragraaf invoeren"},"maximize":{"maximize":"Maximaliseren","minimize":"Minimaliseren"},"pastetext":{"button":"Plakken als platte tekst","title":"Plakken als platte tekst"},"pastefromword":{"confirmCleanup":"De tekst die u wilt plakken lijkt gekopieerd te zijn vanuit Word. Wilt u de tekst opschonen voordat deze geplakt wordt?","error":"Het was niet mogelijk om de geplakte tekst op te schonen door een interne fout","title":"Plakken vanuit Word","toolbar":"Plakken vanuit Word"},"removeformat":{"toolbar":"Opmaak verwijderen"},"sourcearea":{"toolbar":"Broncode"},"specialchar":{"options":"Speciale tekens opties","title":"Selecteer speciaal teken","toolbar":"Speciaal teken invoegen"},"scayt":{"about":"Over SCAYT","aboutTab":"Over","addWord":"Woord toevoegen","allCaps":"Negeer woorden helemaal in hoofdletters","dic_create":"Aanmaken","dic_delete":"Verwijderen","dic_field_name":"Naam woordenboek","dic_info":"Initieel wordt het gebruikerswoordenboek opgeslagen in een cookie. Cookies zijn echter beperkt in grootte. Zodra het gebruikerswoordenboek het punt bereikt waarop het niet meer in een cookie opgeslagen kan worden, dan wordt het woordenboek op de server opgeslagen. Om je persoonlijke woordenboek op je eigen server op te slaan, moet je een mapnaam opgeven. Indien je al een woordenboek hebt opgeslagen, typ dan de naam en klik op de Terugzetten knop.","dic_rename":"Hernoemen","dic_restore":"Terugzetten","dictionariesTab":"Woordenboeken","disable":"SCAYT uitschakelen","emptyDic":"De naam van het woordenboek mag niet leeg zijn.","enable":"SCAYT inschakelen","ignore":"Negeren","ignoreAll":"Alles negeren","ignoreDomainNames":"Negeer domeinnamen","langs":"Talen","languagesTab":"Talen","mixedCase":"Negeer woorden met hoofd- en kleine letters","mixedWithDigits":"Negeer woorden met cijfers","moreSuggestions":"Meer suggesties","opera_title":"Niet ondersteund door Opera","options":"Opties","optionsTab":"Opties","title":"Controleer de spelling tijdens het typen","toggle":"SCAYT in/uitschakelen","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stijl","panelTitle":"Opmaakstijlen","panelTitle1":"Blok stijlen","panelTitle2":"Inline stijlen","panelTitle3":"Object stijlen"},"table":{"border":"Randdikte","caption":"Onderschrift","cell":{"menu":"Cel","insertBefore":"Voeg cel in voor","insertAfter":"Voeg cel in na","deleteCell":"Cellen verwijderen","merge":"Cellen samenvoegen","mergeRight":"Voeg samen naar rechts","mergeDown":"Voeg samen naar beneden","splitHorizontal":"Splits cel horizontaal","splitVertical":"Splits cel vertikaal","title":"Celeigenschappen","cellType":"Celtype","rowSpan":"Rijen samenvoegen","colSpan":"Kolommen samenvoegen","wordWrap":"Automatische terugloop","hAlign":"Horizontale uitlijning","vAlign":"Verticale uitlijning","alignBaseline":"Tekstregel","bgColor":"Achtergrondkleur","borderColor":"Randkleur","data":"Gegevens","header":"Kop","yes":"Ja","no":"Nee","invalidWidth":"De celbreedte moet een getal zijn.","invalidHeight":"De celhoogte moet een getal zijn.","invalidRowSpan":"Rijen samenvoegen moet een heel getal zijn.","invalidColSpan":"Kolommen samenvoegen moet een heel getal zijn.","chooseColor":"Kies"},"cellPad":"Celopvulling","cellSpace":"Celafstand","column":{"menu":"Kolom","insertBefore":"Voeg kolom in voor","insertAfter":"Voeg kolom in na","deleteColumn":"Kolommen verwijderen"},"columns":"Kolommen","deleteTable":"Tabel verwijderen","headers":"Koppen","headersBoth":"Beide","headersColumn":"Eerste kolom","headersNone":"Geen","headersRow":"Eerste rij","invalidBorder":"De randdikte moet een getal zijn.","invalidCellPadding":"Celopvulling moet een getal zijn.","invalidCellSpacing":"Celafstand moet een getal zijn.","invalidCols":"Het aantal kolommen moet een getal zijn groter dan 0.","invalidHeight":"De tabelhoogte moet een getal zijn.","invalidRows":"Het aantal rijen moet een getal zijn groter dan 0.","invalidWidth":"De tabelbreedte moet een getal zijn.","menu":"Tabeleigenschappen","row":{"menu":"Rij","insertBefore":"Voeg rij in voor","insertAfter":"Voeg rij in na","deleteRow":"Rijen verwijderen"},"rows":"Rijen","summary":"Samenvatting","title":"Tabeleigenschappen","toolbar":"Tabel","widthPc":"procent","widthPx":"pixels","widthUnit":"eenheid breedte"},"undo":{"redo":"Opnieuw uitvoeren","undo":"Ongedaan maken"},"wsc":{"btnIgnore":"Negeren","btnIgnoreAll":"Alles negeren","btnReplace":"Vervangen","btnReplaceAll":"Alles vervangen","btnUndo":"Ongedaan maken","changeTo":"Wijzig in","errorLoading":"Er is een fout opgetreden bij het laden van de dienst: %s.","ieSpellDownload":"De spellingscontrole is niet geïnstalleerd. Wilt u deze nu downloaden?","manyChanges":"Klaar met spellingscontrole: %1 woorden aangepast","noChanges":"Klaar met spellingscontrole: geen woorden aangepast","noMispell":"Klaar met spellingscontrole: geen fouten gevonden","noSuggestions":"- Geen suggesties -","notAvailable":"Excuses, deze dienst is momenteel niet beschikbaar.","notInDic":"Niet in het woordenboek","oneChange":"Klaar met spellingscontrole: één woord aangepast","progress":"Bezig met spellingscontrole...","title":"Spellingscontrole","toolbar":"Spellingscontrole"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/no.js b/theme/bootstrap/plugins/ckeditor/lang/no.js new file mode 100644 index 0000000..df4efe1 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/no.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['no']={"editor":"Rikteksteditor","editorPanel":"Panel for rikteksteditor","common":{"editorHelp":"Trykk ALT 0 for hjelp","browseServer":"Bla igjennom server","url":"URL","protocol":"Protokoll","upload":"Last opp","uploadSubmit":"Send det til serveren","image":"Bilde","flash":"Flash","form":"Skjema","checkbox":"Avmerkingsboks","radio":"Alternativknapp","textField":"Tekstboks","textarea":"Tekstområde","hiddenField":"Skjult felt","button":"Knapp","select":"Rullegardinliste","imageButton":"Bildeknapp","notSet":"<ikke satt>","id":"Id","name":"Navn","langDir":"Språkretning","langDirLtr":"Venstre til høyre (VTH)","langDirRtl":"Høyre til venstre (HTV)","langCode":"Språkkode","longDescr":"Utvidet beskrivelse","cssClass":"Stilarkklasser","advisoryTitle":"Tittel","cssStyle":"Stil","ok":"OK","cancel":"Avbryt","close":"Lukk","preview":"Forhåndsvis","resize":"Dra for å skalere","generalTab":"Generelt","advancedTab":"Avansert","validateNumberFailed":"Denne verdien er ikke et tall.","confirmNewPage":"Alle ulagrede endringer som er gjort i dette innholdet vil bli tapt. Er du sikker på at du vil laste en ny side?","confirmCancel":"Noen av valgene har blitt endret. Er du sikker på at du vil lukke dialogen?","options":"Valg","target":"Mål","targetNew":"Nytt vindu (_blank)","targetTop":"Hele vindu (_top)","targetSelf":"Samme vindu (_self)","targetParent":"Foreldrevindu (_parent)","langDirLTR":"Venstre til høyre (VTH)","langDirRTL":"Høyre til venstre (HTV)","styles":"Stil","cssClasses":"Stilarkklasser","width":"Bredde","height":"Høyde","align":"Juster","alignLeft":"Venstre","alignRight":"Høyre","alignCenter":"Midtjuster","alignTop":"Topp","alignMiddle":"Midten","alignBottom":"Bunn","invalidValue":"Ugyldig verdi.","invalidHeight":"Høyde må være et tall.","invalidWidth":"Bredde må være et tall.","invalidCssLength":"Den angitte verdien for feltet \"%1\" må være et positivt tall med eller uten en gyldig CSS-målingsenhet (px, %, in, cm, mm, em, ex, pt, eller pc).","invalidHtmlLength":"Den angitte verdien for feltet \"%1\" må være et positivt tall med eller uten en gyldig HTML-målingsenhet (px eller %).","invalidInlineStyle":"Verdi angitt for inline stil må bestå av en eller flere sett med formatet \"navn : verdi\", separert med semikolon","cssLengthTooltip":"Skriv inn et tall for en piksel-verdi eller et tall med en gyldig CSS-enhet (px, %, in, cm, mm, em, ex, pt, eller pc).","unavailable":"%1<span class=\"cke_accessibility\">, utilgjenglig</span>"},"about":{"copy":"Copyright &copy; $1. Alle rettigheter reservert.","dlgTitle":"Om CKEditor","help":"Se $1 for hjelp.","moreInfo":"For lisensieringsinformasjon, vennligst besøk vårt nettsted:","title":"Om CKEditor","userGuide":"CKEditors brukerveiledning"},"basicstyles":{"bold":"Fet","italic":"Kursiv","strike":"Gjennomstreking","subscript":"Senket skrift","superscript":"Hevet skrift","underline":"Understreking"},"blockquote":{"toolbar":"Blokksitat"},"clipboard":{"copy":"Kopier","copyError":"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk snarveien (Ctrl/Cmd+C).","cut":"Klipp ut","cutError":"Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk snarveien (Ctrl/Cmd+X).","paste":"Lim inn","pasteArea":"Innlimingsområde","pasteMsg":"Vennligst lim inn i følgende boks med tastaturet (<STRONG>Ctrl/Cmd+V</STRONG>) og trykk <STRONG>OK</STRONG>.","securityMsg":"Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du må derfor lime det inn på nytt i dette vinduet.","title":"Lim inn"},"contextmenu":{"options":"Alternativer for høyreklikkmeny"},"toolbar":{"toolbarCollapse":"Skjul verktøylinje","toolbarExpand":"Vis verktøylinje","toolbarGroups":{"document":"Dokument","clipboard":"Utklippstavle/Angre","editing":"Redigering","forms":"Skjema","basicstyles":"Basisstiler","paragraph":"Avsnitt","links":"Lenker","insert":"Innsetting","styles":"Stiler","colors":"Farger","tools":"Verktøy"},"toolbars":"Verktøylinjer for editor"},"elementspath":{"eleLabel":"Element-sti","eleTitle":"%1 element"},"format":{"label":"Format","panelTitle":"Avsnittsformat","tag_address":"Adresse","tag_div":"Normal (DIV)","tag_h1":"Overskrift 1","tag_h2":"Overskrift 2","tag_h3":"Overskrift 3","tag_h4":"Overskrift 4","tag_h5":"Overskrift 5","tag_h6":"Overskrift 6","tag_p":"Normal","tag_pre":"Formatert"},"horizontalrule":{"toolbar":"Sett inn horisontal linje"},"image":{"alertUrl":"Vennligst skriv bilde-urlen","alt":"Alternativ tekst","border":"Ramme","btnUpload":"Send det til serveren","button2Img":"Vil du endre den valgte bildeknappen til et vanlig bilde?","hSpace":"HMarg","img2Button":"Vil du endre det valgte bildet til en bildeknapp?","infoTab":"Bildeinformasjon","linkTab":"Lenke","lockRatio":"Lås forhold","menu":"Bildeegenskaper","resetSize":"Tilbakestill størrelse","title":"Bildeegenskaper","titleButton":"Egenskaper for bildeknapp","upload":"Last opp","urlMissing":"Bildets adresse mangler.","vSpace":"VMarg","validateBorder":"Ramme må være et heltall.","validateHSpace":"HMarg må være et heltall.","validateVSpace":"VMarg må være et heltall."},"indent":{"indent":"Øk innrykk","outdent":"Reduser innrykk"},"fakeobjects":{"anchor":"Anker","flash":"Flash-animasjon","hiddenfield":"Skjult felt","iframe":"IFrame","unknown":"Ukjent objekt"},"link":{"acccessKey":"Aksessknapp","advanced":"Avansert","advisoryContentType":"Type","advisoryTitle":"Tittel","anchor":{"toolbar":"Sett inn/Rediger anker","menu":"Egenskaper for anker","title":"Egenskaper for anker","name":"Ankernavn","errorName":"Vennligst skriv inn ankernavnet","remove":"Fjern anker"},"anchorId":"Element etter ID","anchorName":"Anker etter navn","charset":"Lenket tegnsett","cssClasses":"Stilarkklasser","emailAddress":"E-postadresse","emailBody":"Melding","emailSubject":"Meldingsemne","id":"Id","info":"Lenkeinfo","langCode":"Språkkode","langDir":"Språkretning","langDirLTR":"Venstre til høyre (VTH)","langDirRTL":"Høyre til venstre (HTV)","menu":"Rediger lenke","name":"Navn","noAnchors":"(Ingen anker i dokumentet)","noEmail":"Vennligst skriv inn e-postadressen","noUrl":"Vennligst skriv inn lenkens URL","other":"<annen>","popupDependent":"Avhenging (Netscape)","popupFeatures":"Egenskaper for popup-vindu","popupFullScreen":"Fullskjerm (IE)","popupLeft":"Venstre posisjon","popupLocationBar":"Adresselinje","popupMenuBar":"Menylinje","popupResizable":"Skalerbar","popupScrollBars":"Scrollbar","popupStatusBar":"Statuslinje","popupToolbar":"Verktøylinje","popupTop":"Topp-posisjon","rel":"Relasjon (rel)","selectAnchor":"Velg et anker","styles":"Stil","tabIndex":"Tabindeks","target":"Mål","targetFrame":"<ramme>","targetFrameName":"Målramme","targetPopup":"<popup-vindu>","targetPopupName":"Navn på popup-vindu","title":"Lenke","toAnchor":"Lenke til anker i teksten","toEmail":"E-post","toUrl":"URL","toolbar":"Sett inn/Rediger lenke","type":"Lenketype","unlink":"Fjern lenke","upload":"Last opp"},"list":{"bulletedlist":"Legg til/Fjern punktmerket liste","numberedlist":"Legg til/Fjern nummerert liste"},"magicline":{"title":"Sett inn nytt avsnitt her"},"maximize":{"maximize":"Maksimer","minimize":"Minimer"},"pastetext":{"button":"Lim inn som ren tekst","title":"Lim inn som ren tekst"},"pastefromword":{"confirmCleanup":"Teksten du limer inn ser ut til å være kopiert fra Word. Vil du renske den før du limer den inn?","error":"Det var ikke mulig å renske den innlimte teksten på grunn av en intern feil","title":"Lim inn fra Word","toolbar":"Lim inn fra Word"},"removeformat":{"toolbar":"Fjern formatering"},"sourcearea":{"toolbar":"Kilde"},"specialchar":{"options":"Alternativer for spesialtegn","title":"Velg spesialtegn","toolbar":"Sett inn spesialtegn"},"scayt":{"about":"Om SCAYT","aboutTab":"Om","addWord":"Legg til ord","allCaps":"Ikke kontroller ord med kun store bokstaver","dic_create":"Opprett","dic_delete":"Slett","dic_field_name":"Ordboknavn","dic_info":"Brukerordboken lagres først i en informasjonskapsel på din maskin, men det er en begrensning på hvor mye som kan lagres her. Når ordboken blir for stor til å lagres i en informasjonskapsel, vil vi i stedet lagre ordboken på vår server. For å lagre din personlige ordbok på vår server, burde du velge et navn for ordboken din. Hvis du allerede har lagret en ordbok, vennligst skriv inn ordbokens navn og klikk på Gjenopprett-knappen.","dic_rename":"Gi nytt navn","dic_restore":"Gjenopprett","dictionariesTab":"Ordbøker","disable":"Slå av SCAYT","emptyDic":"Ordboknavn bør ikke være tom.","enable":"Slå på SCAYT","ignore":"Ignorer","ignoreAll":"Ignorer Alle","ignoreDomainNames":"Ikke kontroller domenenavn","langs":"Språk","languagesTab":"Språk","mixedCase":"Ikke kontroller ord med blandet små og store bokstaver","mixedWithDigits":"Ikke kontroller ord som inneholder tall","moreSuggestions":"Flere forslag","opera_title":"Ikke støttet av Opera","options":"Valg","optionsTab":"Valg","title":"Stavekontroll mens du skriver","toggle":"Veksle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Stilformater","panelTitle1":"Blokkstiler","panelTitle2":"Inlinestiler","panelTitle3":"Objektstiler"},"table":{"border":"Rammestørrelse","caption":"Tittel","cell":{"menu":"Celle","insertBefore":"Sett inn celle før","insertAfter":"Sett inn celle etter","deleteCell":"Slett celler","merge":"Slå sammen celler","mergeRight":"Slå sammen høyre","mergeDown":"Slå sammen ned","splitHorizontal":"Del celle horisontalt","splitVertical":"Del celle vertikalt","title":"Celleegenskaper","cellType":"Celletype","rowSpan":"Radspenn","colSpan":"Kolonnespenn","wordWrap":"Tekstbrytning","hAlign":"Horisontal justering","vAlign":"Vertikal justering","alignBaseline":"Grunnlinje","bgColor":"Bakgrunnsfarge","borderColor":"Rammefarge","data":"Data","header":"Overskrift","yes":"Ja","no":"Nei","invalidWidth":"Cellebredde må være et tall.","invalidHeight":"Cellehøyde må være et tall.","invalidRowSpan":"Radspenn må være et heltall.","invalidColSpan":"Kolonnespenn må være et heltall.","chooseColor":"Velg"},"cellPad":"Cellepolstring","cellSpace":"Cellemarg","column":{"menu":"Kolonne","insertBefore":"Sett inn kolonne før","insertAfter":"Sett inn kolonne etter","deleteColumn":"Slett kolonner"},"columns":"Kolonner","deleteTable":"Slett tabell","headers":"Overskrifter","headersBoth":"Begge","headersColumn":"Første kolonne","headersNone":"Ingen","headersRow":"Første rad","invalidBorder":"Rammestørrelse må være et tall.","invalidCellPadding":"Cellepolstring må være et positivt tall.","invalidCellSpacing":"Cellemarg må være et positivt tall.","invalidCols":"Antall kolonner må være et tall større enn 0.","invalidHeight":"Tabellhøyde må være et tall.","invalidRows":"Antall rader må være et tall større enn 0.","invalidWidth":"Tabellbredde må være et tall.","menu":"Egenskaper for tabell","row":{"menu":"Rader","insertBefore":"Sett inn rad før","insertAfter":"Sett inn rad etter","deleteRow":"Slett rader"},"rows":"Rader","summary":"Sammendrag","title":"Egenskaper for tabell","toolbar":"Tabell","widthPc":"prosent","widthPx":"piksler","widthUnit":"Bredde-enhet"},"undo":{"redo":"Gjør om","undo":"Angre"},"wsc":{"btnIgnore":"Ignorer","btnIgnoreAll":"Ignorer alle","btnReplace":"Erstatt","btnReplaceAll":"Erstatt alle","btnUndo":"Angre","changeTo":"Endre til","errorLoading":"Feil under lasting av applikasjonstjenestetjener: %s.","ieSpellDownload":"Stavekontroll er ikke installert. Vil du laste den ned nå?","manyChanges":"Stavekontroll fullført: %1 ord endret","noChanges":"Stavekontroll fullført: ingen ord endret","noMispell":"Stavekontroll fullført: ingen feilstavinger funnet","noSuggestions":"- Ingen forslag -","notAvailable":"Beklager, tjenesten er utilgjenglig nå.","notInDic":"Ikke i ordboken","oneChange":"Stavekontroll fullført: Ett ord endret","progress":"Stavekontroll pågår...","title":"Stavekontroll","toolbar":"Stavekontroll"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/pl.js b/theme/bootstrap/plugins/ckeditor/lang/pl.js new file mode 100644 index 0000000..faa3230 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/pl.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['pl']={"editor":"Edytor tekstu sformatowanego","editorPanel":"Panel edytora tekstu sformatowanego","common":{"editorHelp":"W celu uzyskania pomocy naciśnij ALT 0","browseServer":"Przeglądaj","url":"Adres URL","protocol":"Protokół","upload":"Wyślij","uploadSubmit":"Wyślij","image":"Obrazek","flash":"Flash","form":"Formularz","checkbox":"Pole wyboru (checkbox)","radio":"Przycisk opcji (radio)","textField":"Pole tekstowe","textarea":"Obszar tekstowy","hiddenField":"Pole ukryte","button":"Przycisk","select":"Lista wyboru","imageButton":"Przycisk graficzny","notSet":"<nie ustawiono>","id":"Id","name":"Nazwa","langDir":"Kierunek tekstu","langDirLtr":"Od lewej do prawej (LTR)","langDirRtl":"Od prawej do lewej (RTL)","langCode":"Kod języka","longDescr":"Adres URL długiego opisu","cssClass":"Nazwa klasy CSS","advisoryTitle":"Opis obiektu docelowego","cssStyle":"Styl","ok":"OK","cancel":"Anuluj","close":"Zamknij","preview":"Podgląd","resize":"Przeciągnij, aby zmienić rozmiar","generalTab":"Ogólne","advancedTab":"Zaawansowane","validateNumberFailed":"Ta wartość nie jest liczbą.","confirmNewPage":"Wszystkie niezapisane zmiany zostaną utracone. Czy na pewno wczytać nową stronę?","confirmCancel":"Pewne opcje zostały zmienione. Czy na pewno zamknąć okno dialogowe?","options":"Opcje","target":"Obiekt docelowy","targetNew":"Nowe okno (_blank)","targetTop":"Okno najwyżej w hierarchii (_top)","targetSelf":"To samo okno (_self)","targetParent":"Okno nadrzędne (_parent)","langDirLTR":"Od lewej do prawej (LTR)","langDirRTL":"Od prawej do lewej (RTL)","styles":"Style","cssClasses":"Klasy arkusza stylów","width":"Szerokość","height":"Wysokość","align":"Wyrównaj","alignLeft":"Do lewej","alignRight":"Do prawej","alignCenter":"Do środka","alignTop":"Do góry","alignMiddle":"Do środka","alignBottom":"Do dołu","invalidValue":"Nieprawidłowa wartość.","invalidHeight":"Wysokość musi być liczbą.","invalidWidth":"Szerokość musi być liczbą.","invalidCssLength":"Wartość podana dla pola \"%1\" musi być liczbą dodatnią bez jednostki lub z poprawną jednostką długości zgodną z CSS (px, %, in, cm, mm, em, ex, pt lub pc).","invalidHtmlLength":"Wartość podana dla pola \"%1\" musi być liczbą dodatnią bez jednostki lub z poprawną jednostką długości zgodną z HTML (px lub %).","invalidInlineStyle":"Wartość podana dla stylu musi składać się z jednej lub większej liczby krotek w formacie \"nazwa : wartość\", rozdzielonych średnikami.","cssLengthTooltip":"Wpisz liczbę dla wartości w pikselach lub liczbę wraz z jednostką długości zgodną z CSS (px, %, in, cm, mm, em, ex, pt lub pc).","unavailable":"%1<span class=\"cke_accessibility\">, niedostępne</span>"},"about":{"copy":"Copyright &copy; $1. Wszelkie prawa zastrzeżone.","dlgTitle":"Informacje o programie CKEditor","help":"Pomoc znajdziesz w $1.","moreInfo":"Informacje na temat licencji można znaleźć na naszej stronie:","title":"Informacje o programie CKEditor","userGuide":"podręczniku użytkownika programu CKEditor"},"basicstyles":{"bold":"Pogrubienie","italic":"Kursywa","strike":"Przekreślenie","subscript":"Indeks dolny","superscript":"Indeks górny","underline":"Podkreślenie"},"blockquote":{"toolbar":"Cytat"},"clipboard":{"copy":"Kopiuj","copyError":"Ustawienia bezpieczeństwa Twojej przeglądarki nie pozwalają na automatyczne kopiowanie tekstu. Użyj skrótu klawiszowego Ctrl/Cmd+C.","cut":"Wytnij","cutError":"Ustawienia bezpieczeństwa Twojej przeglądarki nie pozwalają na automatyczne wycinanie tekstu. Użyj skrótu klawiszowego Ctrl/Cmd+X.","paste":"Wklej","pasteArea":"Obszar wklejania","pasteMsg":"Wklej tekst w poniższym polu, używając skrótu klawiaturowego (<STRONG>Ctrl/Cmd+V</STRONG>), i kliknij <STRONG>OK</STRONG>.","securityMsg":"Zabezpieczenia przeglądarki uniemożliwiają wklejenie danych bezpośrednio do edytora. Proszę ponownie wkleić dane w tym oknie.","title":"Wklej"},"contextmenu":{"options":"Opcje menu kontekstowego"},"toolbar":{"toolbarCollapse":"Zwiń pasek narzędzi","toolbarExpand":"Rozwiń pasek narzędzi","toolbarGroups":{"document":"Dokument","clipboard":"Schowek/Wstecz","editing":"Edycja","forms":"Formularze","basicstyles":"Style podstawowe","paragraph":"Akapit","links":"Hiperłącza","insert":"Wstawianie","styles":"Style","colors":"Kolory","tools":"Narzędzia"},"toolbars":"Paski narzędzi edytora"},"elementspath":{"eleLabel":"Ścieżka elementów","eleTitle":"element %1"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Adres","tag_div":"Normalny (DIV)","tag_h1":"Nagłówek 1","tag_h2":"Nagłówek 2","tag_h3":"Nagłówek 3","tag_h4":"Nagłówek 4","tag_h5":"Nagłówek 5","tag_h6":"Nagłówek 6","tag_p":"Normalny","tag_pre":"Tekst sformatowany"},"horizontalrule":{"toolbar":"Wstaw poziomą linię"},"image":{"alertUrl":"Podaj adres obrazka.","alt":"Tekst zastępczy","border":"Obramowanie","btnUpload":"Wyślij","button2Img":"Czy chcesz przekonwertować zaznaczony przycisk graficzny do zwykłego obrazka?","hSpace":"Odstęp poziomy","img2Button":"Czy chcesz przekonwertować zaznaczony obrazek do przycisku graficznego?","infoTab":"Informacje o obrazku","linkTab":"Hiperłącze","lockRatio":"Zablokuj proporcje","menu":"Właściwości obrazka","resetSize":"Przywróć rozmiar","title":"Właściwości obrazka","titleButton":"Właściwości przycisku graficznego","upload":"Wyślij","urlMissing":"Podaj adres URL obrazka.","vSpace":"Odstęp pionowy","validateBorder":"Wartość obramowania musi być liczbą całkowitą.","validateHSpace":"Wartość odstępu poziomego musi być liczbą całkowitą.","validateVSpace":"Wartość odstępu pionowego musi być liczbą całkowitą."},"indent":{"indent":"Zwiększ wcięcie","outdent":"Zmniejsz wcięcie"},"fakeobjects":{"anchor":"Kotwica","flash":"Animacja Flash","hiddenfield":"Pole ukryte","iframe":"IFrame","unknown":"Nieznany obiekt"},"link":{"acccessKey":"Klawisz dostępu","advanced":"Zaawansowane","advisoryContentType":"Typ MIME obiektu docelowego","advisoryTitle":"Opis obiektu docelowego","anchor":{"toolbar":"Wstaw/edytuj kotwicę","menu":"Właściwości kotwicy","title":"Właściwości kotwicy","name":"Nazwa kotwicy","errorName":"Wpisz nazwę kotwicy","remove":"Usuń kotwicę"},"anchorId":"Wg identyfikatora","anchorName":"Wg nazwy","charset":"Kodowanie znaków obiektu docelowego","cssClasses":"Nazwa klasy CSS","emailAddress":"Adres e-mail","emailBody":"Treść","emailSubject":"Temat","id":"Id","info":"Informacje ","langCode":"Kod języka","langDir":"Kierunek tekstu","langDirLTR":"Od lewej do prawej (LTR)","langDirRTL":"Od prawej do lewej (RTL)","menu":"Edytuj odnośnik","name":"Nazwa","noAnchors":"(W dokumencie nie zdefiniowano żadnych kotwic)","noEmail":"Podaj adres e-mail","noUrl":"Podaj adres URL","other":"<inny>","popupDependent":"Okno zależne (Netscape)","popupFeatures":"Właściwości wyskakującego okna","popupFullScreen":"Pełny ekran (IE)","popupLeft":"Pozycja w poziomie","popupLocationBar":"Pasek adresu","popupMenuBar":"Pasek menu","popupResizable":"Skalowalny","popupScrollBars":"Paski przewijania","popupStatusBar":"Pasek statusu","popupToolbar":"Pasek narzędzi","popupTop":"Pozycja w pionie","rel":"Relacja","selectAnchor":"Wybierz kotwicę","styles":"Styl","tabIndex":"Indeks kolejności","target":"Obiekt docelowy","targetFrame":"<ramka>","targetFrameName":"Nazwa ramki docelowej","targetPopup":"<wyskakujące okno>","targetPopupName":"Nazwa wyskakującego okna","title":"Odnośnik","toAnchor":"Odnośnik wewnątrz strony (kotwica)","toEmail":"Adres e-mail","toUrl":"Adres URL","toolbar":"Wstaw/edytuj odnośnik","type":"Typ odnośnika","unlink":"Usuń odnośnik","upload":"Wyślij"},"list":{"bulletedlist":"Lista wypunktowana","numberedlist":"Lista numerowana"},"magicline":{"title":"Wstaw nowy akapit"},"maximize":{"maximize":"Maksymalizuj","minimize":"Minimalizuj"},"pastetext":{"button":"Wklej jako czysty tekst","title":"Wklej jako czysty tekst"},"pastefromword":{"confirmCleanup":"Tekst, który chcesz wkleić, prawdopodobnie pochodzi z programu Microsoft Word. Czy chcesz go wyczyścić przed wklejeniem?","error":"Wyczyszczenie wklejonych danych nie było możliwe z powodu wystąpienia błędu.","title":"Wklej z programu MS Word","toolbar":"Wklej z programu MS Word"},"removeformat":{"toolbar":"Usuń formatowanie"},"sourcearea":{"toolbar":"Źródło dokumentu"},"specialchar":{"options":"Opcje znaków specjalnych","title":"Wybierz znak specjalny","toolbar":"Wstaw znak specjalny"},"scayt":{"about":"Informacje o SCAYT","aboutTab":"Informacje o SCAYT","addWord":"Dodaj słowo","allCaps":"Ignoruj wyrazy pisane dużymi literami","dic_create":"Utwórz","dic_delete":"Usuń","dic_field_name":"Nazwa słownika","dic_info":"Początkowo słownik użytkownika przechowywany jest w cookie. Pliki cookie mają jednak ograniczoną pojemność. Jeśli słownik użytkownika przekroczy wielkość dopuszczalną dla pliku cookie, możliwe jest przechowanie go na naszym serwerze. W celu zapisania słownika na serwerze niezbędne jest nadanie mu nazwy. Jeśli słownik został już zapisany na serwerze, wystarczy podać jego nazwę i nacisnąć przycisk Przywróć.","dic_rename":"Zmień nazwę","dic_restore":"Przywróć","dictionariesTab":"Słowniki","disable":"Wyłącz SCAYT","emptyDic":"Nazwa słownika nie może być pusta.","enable":"Włącz SCAYT","ignore":"Ignoruj","ignoreAll":"Ignoruj wszystkie","ignoreDomainNames":"Ignoruj nazwy domen","langs":"Języki","languagesTab":"Języki","mixedCase":"Ignoruj wyrazy pisane dużymi i małymi literami","mixedWithDigits":"Ignoruj wyrazy zawierające cyfry","moreSuggestions":"Więcej sugestii","opera_title":"Funkcja nie jest obsługiwana przez przeglądarkę Opera","options":"Opcje","optionsTab":"Opcje","title":"Sprawdź pisownię podczas pisania (SCAYT)","toggle":"Przełącz SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Styl","panelTitle":"Style formatujące","panelTitle1":"Style blokowe","panelTitle2":"Style liniowe","panelTitle3":"Style obiektowe"},"table":{"border":"Grubość obramowania","caption":"Tytuł","cell":{"menu":"Komórka","insertBefore":"Wstaw komórkę z lewej","insertAfter":"Wstaw komórkę z prawej","deleteCell":"Usuń komórki","merge":"Połącz komórki","mergeRight":"Połącz z komórką z prawej","mergeDown":"Połącz z komórką poniżej","splitHorizontal":"Podziel komórkę poziomo","splitVertical":"Podziel komórkę pionowo","title":"Właściwości komórki","cellType":"Typ komórki","rowSpan":"Scalenie wierszy","colSpan":"Scalenie komórek","wordWrap":"Zawijanie słów","hAlign":"Wyrównanie poziome","vAlign":"Wyrównanie pionowe","alignBaseline":"Linia bazowa","bgColor":"Kolor tła","borderColor":"Kolor obramowania","data":"Dane","header":"Nagłówek","yes":"Tak","no":"Nie","invalidWidth":"Szerokość komórki musi być liczbą.","invalidHeight":"Wysokość komórki musi być liczbą.","invalidRowSpan":"Scalenie wierszy musi być liczbą całkowitą.","invalidColSpan":"Scalenie komórek musi być liczbą całkowitą.","chooseColor":"Wybierz"},"cellPad":"Dopełnienie komórek","cellSpace":"Odstęp pomiędzy komórkami","column":{"menu":"Kolumna","insertBefore":"Wstaw kolumnę z lewej","insertAfter":"Wstaw kolumnę z prawej","deleteColumn":"Usuń kolumny"},"columns":"Liczba kolumn","deleteTable":"Usuń tabelę","headers":"Nagłówki","headersBoth":"Oba","headersColumn":"Pierwsza kolumna","headersNone":"Brak","headersRow":"Pierwszy wiersz","invalidBorder":"Wartość obramowania musi być liczbą.","invalidCellPadding":"Dopełnienie komórek musi być liczbą dodatnią.","invalidCellSpacing":"Odstęp pomiędzy komórkami musi być liczbą dodatnią.","invalidCols":"Liczba kolumn musi być większa niż 0.","invalidHeight":"Wysokość tabeli musi być liczbą.","invalidRows":"Liczba wierszy musi być większa niż 0.","invalidWidth":"Szerokość tabeli musi być liczbą.","menu":"Właściwości tabeli","row":{"menu":"Wiersz","insertBefore":"Wstaw wiersz powyżej","insertAfter":"Wstaw wiersz poniżej","deleteRow":"Usuń wiersze"},"rows":"Liczba wierszy","summary":"Podsumowanie","title":"Właściwości tabeli","toolbar":"Tabela","widthPc":"%","widthPx":"piksele","widthUnit":"jednostka szerokości"},"undo":{"redo":"Ponów","undo":"Cofnij"},"wsc":{"btnIgnore":"Ignoruj","btnIgnoreAll":"Ignoruj wszystkie","btnReplace":"Zmień","btnReplaceAll":"Zmień wszystkie","btnUndo":"Cofnij","changeTo":"Zmień na","errorLoading":"Błąd wczytywania hosta aplikacji usługi: %s.","ieSpellDownload":"Słownik nie jest zainstalowany. Czy chcesz go pobrać?","manyChanges":"Sprawdzanie zakończone: zmieniono %l słów","noChanges":"Sprawdzanie zakończone: nie zmieniono żadnego słowa","noMispell":"Sprawdzanie zakończone: nie znaleziono błędów","noSuggestions":"- Brak sugestii -","notAvailable":"Przepraszamy, ale usługa jest obecnie niedostępna.","notInDic":"Słowa nie ma w słowniku","oneChange":"Sprawdzanie zakończone: zmieniono jedno słowo","progress":"Trwa sprawdzanie...","title":"Sprawdź pisownię","toolbar":"Sprawdź pisownię"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/pt-br.js b/theme/bootstrap/plugins/ckeditor/lang/pt-br.js new file mode 100644 index 0000000..c7373ce --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/pt-br.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['pt-br']={"editor":"Editor de Rich Text","editorPanel":"Painel do editor de Rich Text","common":{"editorHelp":"Pressione ALT+0 para ajuda","browseServer":"Localizar no Servidor","url":"URL","protocol":"Protocolo","upload":"Enviar ao Servidor","uploadSubmit":"Enviar para o Servidor","image":"Imagem","flash":"Flash","form":"Formulário","checkbox":"Caixa de Seleção","radio":"Botão de Opção","textField":"Caixa de Texto","textarea":"Área de Texto","hiddenField":"Campo Oculto","button":"Botão","select":"Caixa de Listagem","imageButton":"Botão de Imagem","notSet":"<não ajustado>","id":"Id","name":"Nome","langDir":"Direção do idioma","langDirLtr":"Esquerda para Direita (LTR)","langDirRtl":"Direita para Esquerda (RTL)","langCode":"Idioma","longDescr":"Descrição da URL","cssClass":"Classe de CSS","advisoryTitle":"Título","cssStyle":"Estilos","ok":"OK","cancel":"Cancelar","close":"Fechar","preview":"Visualizar","resize":"Arraste para redimensionar","generalTab":"Geral","advancedTab":"Avançado","validateNumberFailed":"Este valor não é um número.","confirmNewPage":"Todas as mudanças não salvas serão perdidas. Tem certeza de que quer abrir uma nova página?","confirmCancel":"Algumas opções foram alteradas. Tem certeza de que quer fechar a caixa de diálogo?","options":"Opções","target":"Destino","targetNew":"Nova Janela (_blank)","targetTop":"Janela de Cima (_top)","targetSelf":"Mesma Janela (_self)","targetParent":"Janela Pai (_parent)","langDirLTR":"Esquerda para Direita (LTR)","langDirRTL":"Direita para Esquerda (RTL)","styles":"Estilo","cssClasses":"Classes","width":"Largura","height":"Altura","align":"Alinhamento","alignLeft":"Esquerda","alignRight":"Direita","alignCenter":"Centralizado","alignTop":"Superior","alignMiddle":"Centralizado","alignBottom":"Inferior","invalidValue":"Valor inválido.","invalidHeight":"A altura tem que ser um número","invalidWidth":"A largura tem que ser um número.","invalidCssLength":"O valor do campo \"%1\" deve ser um número positivo opcionalmente seguido por uma válida unidade de medida de CSS (px, %, in, cm, mm, em, ex, pt ou pc).","invalidHtmlLength":"O valor do campo \"%1\" deve ser um número positivo opcionalmente seguido por uma válida unidade de medida de HTML (px ou %).","invalidInlineStyle":"O valor válido para estilo deve conter uma ou mais tuplas no formato \"nome : valor\", separados por ponto e vírgula.","cssLengthTooltip":"Insira um número para valor em pixels ou um número seguido de uma válida unidade de medida de CSS (px, %, in, cm, mm, em, ex, pt ou pc).","unavailable":"%1<span class=\"cke_accessibility\">, indisponível</span>"},"about":{"copy":"Copyright &copy; $1. Todos os direitos reservados.","dlgTitle":"Sobre o CKEditor","help":"Verifique o $1 para obter ajuda.","moreInfo":"Para informações sobre a licença por favor visite o nosso site:","title":"Sobre o CKEditor","userGuide":"Guia do Usuário do CKEditor"},"basicstyles":{"bold":"Negrito","italic":"Itálico","strike":"Tachado","subscript":"Subscrito","superscript":"Sobrescrito","underline":"Sublinhado"},"blockquote":{"toolbar":"Citação"},"clipboard":{"copy":"Copiar","copyError":"As configurações de segurança do seu navegador não permitem que o editor execute operações de copiar automaticamente. Por favor, utilize o teclado para copiar (Ctrl/Cmd+C).","cut":"Recortar","cutError":"As configurações de segurança do seu navegador não permitem que o editor execute operações de recortar automaticamente. Por favor, utilize o teclado para recortar (Ctrl/Cmd+X).","paste":"Colar","pasteArea":"Área para Colar","pasteMsg":"Transfira o link usado na caixa usando o teclado com (<STRONG>Ctrl/Cmd+V</STRONG>) e <STRONG>OK</STRONG>.","securityMsg":"As configurações de segurança do seu navegador não permitem que o editor acesse os dados da área de transferência diretamente. Por favor cole o conteúdo manualmente nesta janela.","title":"Colar"},"contextmenu":{"options":"Opções Menu de Contexto"},"toolbar":{"toolbarCollapse":"Diminuir Barra de Ferramentas","toolbarExpand":"Aumentar Barra de Ferramentas","toolbarGroups":{"document":"Documento","clipboard":"Clipboard/Desfazer","editing":"Edição","forms":"Formulários","basicstyles":"Estilos Básicos","paragraph":"Paragrafo","links":"Links","insert":"Inserir","styles":"Estilos","colors":"Cores","tools":"Ferramentas"},"toolbars":"Barra de Ferramentas do Editor"},"elementspath":{"eleLabel":"Caminho dos Elementos","eleTitle":"Elemento %1"},"format":{"label":"Formatação","panelTitle":"Formatação","tag_address":"Endereço","tag_div":"Normal (DIV)","tag_h1":"Título 1","tag_h2":"Título 2","tag_h3":"Título 3","tag_h4":"Título 4","tag_h5":"Título 5","tag_h6":"Título 6","tag_p":"Normal","tag_pre":"Formatado"},"horizontalrule":{"toolbar":"Inserir Linha Horizontal"},"image":{"alertUrl":"Por favor, digite a URL da imagem.","alt":"Texto Alternativo","border":"Borda","btnUpload":"Enviar para o Servidor","button2Img":"Deseja transformar o botão de imagem em uma imagem comum?","hSpace":"HSpace","img2Button":"Deseja transformar a imagem em um botão de imagem?","infoTab":"Informações da Imagem","linkTab":"Link","lockRatio":"Travar Proporções","menu":"Formatar Imagem","resetSize":"Redefinir para o Tamanho Original","title":"Formatar Imagem","titleButton":"Formatar Botão de Imagem","upload":"Enviar","urlMissing":"URL da imagem está faltando.","vSpace":"VSpace","validateBorder":"A borda deve ser um número inteiro.","validateHSpace":"O HSpace deve ser um número inteiro.","validateVSpace":"O VSpace deve ser um número inteiro."},"indent":{"indent":"Aumentar Recuo","outdent":"Diminuir Recuo"},"fakeobjects":{"anchor":"Âncora","flash":"Animação em Flash","hiddenfield":"Campo Oculto","iframe":"IFrame","unknown":"Objeto desconhecido"},"link":{"acccessKey":"Chave de Acesso","advanced":"Avançado","advisoryContentType":"Tipo de Conteúdo","advisoryTitle":"Título","anchor":{"toolbar":"Inserir/Editar Âncora","menu":"Formatar Âncora","title":"Formatar Âncora","name":"Nome da Âncora","errorName":"Por favor, digite o nome da âncora","remove":"Remover Âncora"},"anchorId":"Id da âncora","anchorName":"Nome da âncora","charset":"Charset do Link","cssClasses":"Classe de CSS","emailAddress":"Endereço E-Mail","emailBody":"Corpo da Mensagem","emailSubject":"Assunto da Mensagem","id":"Id","info":"Informações","langCode":"Direção do idioma","langDir":"Direção do idioma","langDirLTR":"Esquerda para Direita (LTR)","langDirRTL":"Direita para Esquerda (RTL)","menu":"Editar Link","name":"Nome","noAnchors":"(Não há âncoras no documento)","noEmail":"Por favor, digite o endereço de e-mail","noUrl":"Por favor, digite o endereço do Link","other":"<outro>","popupDependent":"Dependente (Netscape)","popupFeatures":"Propriedades da Janela Pop-up","popupFullScreen":"Modo Tela Cheia (IE)","popupLeft":"Esquerda","popupLocationBar":"Barra de Endereços","popupMenuBar":"Barra de Menus","popupResizable":"Redimensionável","popupScrollBars":"Barras de Rolagem","popupStatusBar":"Barra de Status","popupToolbar":"Barra de Ferramentas","popupTop":"Topo","rel":"Tipo de Relação","selectAnchor":"Selecione uma âncora","styles":"Estilos","tabIndex":"Índice de Tabulação","target":"Destino","targetFrame":"<frame>","targetFrameName":"Nome do Frame de Destino","targetPopup":"<janela popup>","targetPopupName":"Nome da Janela Pop-up","title":"Editar Link","toAnchor":"Âncora nesta página","toEmail":"E-Mail","toUrl":"URL","toolbar":"Inserir/Editar Link","type":"Tipo de hiperlink","unlink":"Remover Link","upload":"Enviar ao Servidor"},"list":{"bulletedlist":"Lista sem números","numberedlist":"Lista numerada"},"magicline":{"title":"Insera um parágrafo aqui"},"maximize":{"maximize":"Maximizar","minimize":"Minimize"},"pastetext":{"button":"Colar como Texto sem Formatação","title":"Colar como Texto sem Formatação"},"pastefromword":{"confirmCleanup":"O texto que você deseja colar parece ter sido copiado do Word. Você gostaria de remover a formatação antes de colar?","error":"Não foi possível limpar os dados colados devido a um erro interno","title":"Colar do Word","toolbar":"Colar do Word"},"removeformat":{"toolbar":"Remover Formatação"},"sourcearea":{"toolbar":"Código-Fonte"},"specialchar":{"options":"Opções de Caractere Especial","title":"Selecione um Caractere Especial","toolbar":"Inserir Caractere Especial"},"scayt":{"about":"Sobre a correção ortográfica durante a digitação","aboutTab":"Sobre","addWord":"Adicionar palavra","allCaps":"Ignorar palavras maiúsculas","dic_create":"Criar","dic_delete":"Excluir","dic_field_name":"Nome do Dicionário","dic_info":"Inicialmente, o dicionário do usuário fica armazenado em um Cookie. Porém, Cookies tem tamanho limitado, portanto quand o dicionário do usuário atingir o tamanho limite poderá ser armazenado no nosso servidor. Para armazenar seu dicionário pessoal no nosso servidor deverá especificar um nome para ele. Se já tiver um dicionário armazenado por favor especifique o seu nome e clique em Restaurar.","dic_rename":"Renomear","dic_restore":"Restaurar","dictionariesTab":"Dicionários","disable":"Desabilitar correção ortográfica durante a digitação","emptyDic":"O nome do dicionário não deveria estar vazio.","enable":"Habilitar correção ortográfica durante a digitação","ignore":"Ignorar","ignoreAll":"Ignorar todas","ignoreDomainNames":"Ignorar nomes de domínio","langs":"Idiomas","languagesTab":"Idiomas","mixedCase":"Ignorar palavras com maiúsculas e minúsculas misturadas","mixedWithDigits":"Ignorar palavras com números","moreSuggestions":"Mais sugestões","opera_title":"Não suportado no Opera","options":"Opções","optionsTab":"Opções","title":"Correção ortográfica durante a digitação","toggle":"Ativar/desativar correção ortográfica durante a digitação","noSuggestions":"No suggestion"},"stylescombo":{"label":"Estilo","panelTitle":"Estilos de Formatação","panelTitle1":"Estilos de bloco","panelTitle2":"Estilos de texto corrido","panelTitle3":"Estilos de objeto"},"table":{"border":"Borda","caption":"Legenda","cell":{"menu":"Célula","insertBefore":"Inserir célula a esquerda","insertAfter":"Inserir célula a direita","deleteCell":"Remover Células","merge":"Mesclar Células","mergeRight":"Mesclar com célula a direita","mergeDown":"Mesclar com célula abaixo","splitHorizontal":"Dividir célula horizontalmente","splitVertical":"Dividir célula verticalmente","title":"Propriedades da célula","cellType":"Tipo de célula","rowSpan":"Linhas cobertas","colSpan":"Colunas cobertas","wordWrap":"Quebra de palavra","hAlign":"Alinhamento horizontal","vAlign":"Alinhamento vertical","alignBaseline":"Patamar de alinhamento","bgColor":"Cor de fundo","borderColor":"Cor das bordas","data":"Dados","header":"Cabeçalho","yes":"Sim","no":"Não","invalidWidth":"A largura da célula tem que ser um número.","invalidHeight":"A altura da célula tem que ser um número.","invalidRowSpan":"Linhas cobertas tem que ser um número inteiro.","invalidColSpan":"Colunas cobertas tem que ser um número inteiro.","chooseColor":"Escolher"},"cellPad":"Margem interna","cellSpace":"Espaçamento","column":{"menu":"Coluna","insertBefore":"Inserir coluna a esquerda","insertAfter":"Inserir coluna a direita","deleteColumn":"Remover Colunas"},"columns":"Colunas","deleteTable":"Apagar Tabela","headers":"Cabeçalho","headersBoth":"Ambos","headersColumn":"Primeira coluna","headersNone":"Nenhum","headersRow":"Primeira linha","invalidBorder":"O tamanho da borda tem que ser um número.","invalidCellPadding":"A margem interna das células tem que ser um número.","invalidCellSpacing":"O espaçamento das células tem que ser um número.","invalidCols":"O número de colunas tem que ser um número maior que 0.","invalidHeight":"A altura da tabela tem que ser um número.","invalidRows":"O número de linhas tem que ser um número maior que 0.","invalidWidth":"A largura da tabela tem que ser um número.","menu":"Formatar Tabela","row":{"menu":"Linha","insertBefore":"Inserir linha acima","insertAfter":"Inserir linha abaixo","deleteRow":"Remover Linhas"},"rows":"Linhas","summary":"Resumo","title":"Formatar Tabela","toolbar":"Tabela","widthPc":"%","widthPx":"pixels","widthUnit":"unidade largura"},"undo":{"redo":"Refazer","undo":"Desfazer"},"wsc":{"btnIgnore":"Ignorar uma vez","btnIgnoreAll":"Ignorar Todas","btnReplace":"Alterar","btnReplaceAll":"Alterar Todas","btnUndo":"Desfazer","changeTo":"Alterar para","errorLoading":"Erro carregando servidor de aplicação: %s.","ieSpellDownload":"A verificação ortográfica não foi instalada. Você gostaria de realizar o download agora?","manyChanges":"Verificação ortográfica encerrada: %1 palavras foram alteradas","noChanges":"Verificação ortográfica encerrada: Não houve alterações","noMispell":"Verificação encerrada: Não foram encontrados erros de ortografia","noSuggestions":"-sem sugestões de ortografia-","notAvailable":"Desculpe, o serviço não está disponível no momento.","notInDic":"Não encontrada","oneChange":"Verificação ortográfica encerrada: Uma palavra foi alterada","progress":"Verificação ortográfica em andamento...","title":"Corretor Ortográfico","toolbar":"Verificar Ortografia"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/pt.js b/theme/bootstrap/plugins/ckeditor/lang/pt.js new file mode 100644 index 0000000..1ace58c --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/pt.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['pt']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Pressione ALT+0 para ajuda","browseServer":"Explorar Servidor","url":"URL","protocol":"Protocolo","upload":"Enviar","uploadSubmit":"Enviar para o Servidor","image":"Imagem","flash":"Flash","form":"Formulário","checkbox":"Caixa de Seleção","radio":"Botão de Opção","textField":"Campo de Texto","textarea":"Área de Texto","hiddenField":"Campo Ocultado","button":"Botão","select":"Campo de Seleção","imageButton":"Botão de Imagem","notSet":"<Não definido>","id":"Id.","name":"Nome","langDir":"Orientação do Idioma","langDirLtr":"Esquerda para a Direita (EPD)","langDirRtl":"Direita para a Esquerda (DPE)","langCode":"Código de Idioma","longDescr":"Descrição Completa do URL","cssClass":"Classes de Estilo de Folhas","advisoryTitle":"Título Consultivo","cssStyle":"Estilo","ok":"OK","cancel":"Cancelar","close":"Fechar","preview":"Pré-visualização","resize":"Redimensionar","generalTab":"Geral","advancedTab":"Avançado","validateNumberFailed":"Este valor não é um numero.","confirmNewPage":"Irão ser perdidas quaisquer alterações não guardadas. Tem certeza que deseja carregar a página nova?","confirmCancel":"Foram alteradas algumas das opções. Tem a certeza que deseja fechar a janela?","options":"Opções","target":"Destino","targetNew":"Nova Janela (_blank)","targetTop":"Janela Superior (_top)","targetSelf":"Mesma Janela (_self)","targetParent":"Janela Parente (_parent)","langDirLTR":"Esquerda para a Direita (EPD)","langDirRTL":"Direita para a Esquerda (DPE)","styles":"Estilo","cssClasses":"Classes de Estilo de Folhas","width":"Largura","height":"Altura","align":"Alinhamento","alignLeft":"Esquerda","alignRight":"Direita","alignCenter":"Centrado","alignTop":"Topo","alignMiddle":"Centro","alignBottom":"Fundo","invalidValue":"Valor inválido.","invalidHeight":"A altura tem de ser um número.","invalidWidth":"A largura tem de ser um número. ","invalidCssLength":"Valor especificado para o campo \"1%\" deve ser um número positivo, com ou sem uma unidade de medida CSS válida (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Valor especificado para o campo \"1%\" deve ser um número positivo, com ou sem uma unidade de medida HTML válida (px ou %).","invalidInlineStyle":"Valor especificado para o estilo em embutido deve ser constituído por uma ou mais tuplas com o formato de \"nome : valor\", separados por ponto e vírgula.","cssLengthTooltip":"Digite um número para um valor em pixels ou um número com uma unidade CSS válida (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, indisponível</span>"},"about":{"copy":"Direitos de Autor &copy; $1. Todos os direitos reservados.","dlgTitle":"Sobre o CKEditor","help":"Doar $1 para ajudar.","moreInfo":"Para informação sobre o licenciamento, visite o nosso site da web:","title":"Sobre o CKEditor","userGuide":"CKEditor - Guia do Utilizador"},"basicstyles":{"bold":"Negrito","italic":"Itálico","strike":"Rasurado","subscript":"Superior à Linha","superscript":"Inferior à Linha","underline":"Sublinhado"},"blockquote":{"toolbar":"Bloco de citação"},"clipboard":{"copy":"Copiar","copyError":"A configuração de segurança do navegador não permite a execução automática de operações de copiar. Por favor use o teclado (Ctrl/Cmd+C).","cut":"Cortar","cutError":"A configuração de segurança do navegador não permite a execução automática de operações de cortar. Por favor use o teclado (Ctrl/Cmd+X).","paste":"Colar","pasteArea":"Colar Área","pasteMsg":"Por favor, cole dentro da seguinte caixa usando o teclado (<STRONG>Ctrl/Cmd+V</STRONG>) e prima <STRONG>OK</STRONG>.","securityMsg":"Devido ás definições de segurança do teu browser, o editor não pode aceder ao clipboard diretamente. É necessário que voltes a colar as informações nesta janela.","title":"Colar"},"contextmenu":{"options":"Menu de opções de contexto"},"toolbar":{"toolbarCollapse":"Colapsar Barra","toolbarExpand":"Expandir Barra","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editor de barras de ferramentas"},"elementspath":{"eleLabel":"Camninho dos Elementos","eleTitle":"Elemento %1"},"format":{"label":"Formatar","panelTitle":"Formatar Parágrafo","tag_address":"Endereço","tag_div":"Normal (DIV)","tag_h1":"Título 1","tag_h2":"Título 2","tag_h3":"Título 3","tag_h4":"Título 4","tag_h5":"Título 5","tag_h6":"Título 6","tag_p":"Normal","tag_pre":"Formatado"},"horizontalrule":{"toolbar":"Inserir Linha Horizontal"},"image":{"alertUrl":"Por favor introduza o URL da imagem","alt":"Texto Alternativo","border":"Limite","btnUpload":"Enviar para o Servidor","button2Img":"Deseja transformar o botão com imagem selecionado em uma imagem?","hSpace":"Esp.Horiz","img2Button":"Deseja transformar a imagem selecionada em um botão com imagem?","infoTab":"Informação da Imagem","linkTab":"Hiperligação","lockRatio":"Proporcional","menu":"Propriedades da Imagem","resetSize":"Tamanho Original","title":"Propriedades da Imagem","titleButton":"Propriedades do Botão de imagens","upload":"Carregar","urlMissing":"O URL da fonte da imagem está em falta.","vSpace":"Esp.Vert","validateBorder":"A borda tem de ser um numero.","validateHSpace":"HSpace tem de ser um numero.","validateVSpace":"VSpace tem de ser um numero."},"indent":{"indent":"Aumentar Avanço","outdent":"Diminuir Avanço"},"fakeobjects":{"anchor":" Inserir/Editar Âncora","flash":"Animação Flash","hiddenfield":"Campo Ocultado","iframe":"IFrame","unknown":"Objeto Desconhecido"},"link":{"acccessKey":"Chave de Acesso","advanced":"Avançado","advisoryContentType":"Tipo de Conteúdo","advisoryTitle":"Título","anchor":{"toolbar":" Inserir/Editar Âncora","menu":"Propriedades da Âncora","title":"Propriedades da Âncora","name":"Nome da Âncora","errorName":"Por favor, introduza o nome da âncora","remove":"Remove Anchor"},"anchorId":"Por ID de elemento","anchorName":"Por Nome de Referência","charset":"Fonte de caracteres vinculado","cssClasses":"Classes de Estilo de Folhas Classes","emailAddress":"Endereço de E-Mail","emailBody":"Corpo da Mensagem","emailSubject":"Título de Mensagem","id":"ID","info":"Informação de Hiperligação","langCode":"Orientação de idioma","langDir":"Orientação de idioma","langDirLTR":"Esquerda à Direita (LTR)","langDirRTL":"Direita a Esquerda (RTL)","menu":"Editar Hiperligação","name":"Nome","noAnchors":"(Não há referências disponíveis no documento)","noEmail":"Por favor introduza o endereço de e-mail","noUrl":"Por favor introduza a hiperligação URL","other":"<outro>","popupDependent":"Dependente (Netscape)","popupFeatures":"Características de Janela de Popup","popupFullScreen":"Janela Completa (IE)","popupLeft":"Posição Esquerda","popupLocationBar":"Barra de localização","popupMenuBar":"Barra de Menu","popupResizable":"Redimensionável","popupScrollBars":"Barras de deslocamento","popupStatusBar":"Barra de Estado","popupToolbar":"Barra de Ferramentas","popupTop":"Posição Direita","rel":"Relação","selectAnchor":"Seleccionar una referência","styles":"Estilo","tabIndex":"Índice de Tubulação","target":"Destino","targetFrame":"<Frame>","targetFrameName":"Nome do Frame Destino","targetPopup":"<Janela de popup>","targetPopupName":"Nome da Janela de Popup","title":"Hiperligação","toAnchor":"Referência a esta página","toEmail":"E-Mail","toUrl":"URL","toolbar":"Inserir/Editar Hiperligação","type":"Tipo de Hiperligação","unlink":"Eliminar Hiperligação","upload":"Carregar"},"list":{"bulletedlist":"Marcas","numberedlist":"Numeração"},"magicline":{"title":"Insira aqui o parágrafo"},"maximize":{"maximize":"Maximizar","minimize":"Minimizar"},"pastetext":{"button":"Colar como Texto Simples","title":"Colar como Texto Simples"},"pastefromword":{"confirmCleanup":"O texto que pretende colar parece ter sido copiado do Word. Deseja limpá-lo antes de colar?","error":"Não foi possivel limpar a informação colada decido a um erro interno.","title":"Colar do Word","toolbar":"Colar do Word"},"removeformat":{"toolbar":"Eliminar Formato"},"sourcearea":{"toolbar":"Fonte"},"specialchar":{"options":"Opções de caracteres especiais","title":"Selecione um caracter especial","toolbar":"Inserir Caracter Especial"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Estilo","panelTitle":"Estilos de Formatação","panelTitle1":"Estilos de Bloco","panelTitle2":"Estilos de Linha","panelTitle3":"Estilos de Objeto"},"table":{"border":"Tamanho da Margem","caption":"Título","cell":{"menu":"Célula","insertBefore":"Inserir Célula Antes","insertAfter":"Inserir Célula Depois","deleteCell":"Eliminar Célula","merge":"Unir Células","mergeRight":"Unir à Direita","mergeDown":"Unir abaixo","splitHorizontal":"Dividir Célula Horizontalmente","splitVertical":"Dividir Célula Verticalmente","title":"Propriedades da Célula","cellType":"Tipo de Célula","rowSpan":"Filas na Célula","colSpan":"Colunas na Célula","wordWrap":"Continuar","hAlign":"Alinhamento Horizontal","vAlign":"Alinhamento Vertical","alignBaseline":"Base","bgColor":"Cor de Fundo","borderColor":"Cor da Margem","data":"Dados","header":"Cabeçalho","yes":"Sim","no":"Não","invalidWidth":"A largura da célula deve ser um número.","invalidHeight":"A altura da célula deve ser um número.","invalidRowSpan":"As filas da célula deve ter um número inteiro.","invalidColSpan":"As colunas da célula deve ter um número inteiro.","chooseColor":"Escolher"},"cellPad":"Criação de Espaço","cellSpace":"Espaçamento Célula","column":{"menu":"Coluna","insertBefore":"Inserir Coluna Antes","insertAfter":"Inserir Coluna Depois","deleteColumn":"Apagar Colunas"},"columns":"Colunas","deleteTable":"Apagar Tabela","headers":"Cabeçalhos","headersBoth":"Ambos","headersColumn":"Primeira coluna","headersNone":"Nenhum","headersRow":"Primeira Linha","invalidBorder":"O tamanho da borda tem de ser um número.","invalidCellPadding":"A criação do espaço na célula deve ser um número positivo.","invalidCellSpacing":"O espaçamento da célula deve ser um número positivo.","invalidCols":"O número de colunas tem de ser um número maior que 0.","invalidHeight":"A altura da tabela tem de ser um número.","invalidRows":"O número das linhas tem de ser um número maior que 0.","invalidWidth":"A largura da tabela tem de ser um número.","menu":"Propriedades da Tabela","row":{"menu":"Linha","insertBefore":"Inserir Linha Antes","insertAfter":"Inserir Linha Depois","deleteRow":"Apagar Linhas"},"rows":"Linhas","summary":"Sumário","title":"Propriedades da Tabela","toolbar":"Tabela","widthPc":"percentagem","widthPx":"pixels","widthUnit":"unidade da largura"},"undo":{"redo":"Repetir","undo":"Anular"},"wsc":{"btnIgnore":"Ignorar","btnIgnoreAll":"Ignorar Tudo","btnReplace":"Substituir","btnReplaceAll":"Substituir Tudo","btnUndo":"Anular","changeTo":"Mudar para","errorLoading":"Error loading application service host: %s.","ieSpellDownload":" Verificação ortográfica não instalada. Quer descarregar agora?","manyChanges":"Verificação ortográfica completa: %1 palavras alteradas","noChanges":"Verificação ortográfica completa: não houve alteração de palavras","noMispell":"Verificação ortográfica completa: não foram encontrados erros","noSuggestions":"- Sem sugestões -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Não está num directório","oneChange":"Verificação ortográfica completa: uma palavra alterada","progress":"Verificação ortográfica em progresso…","title":"Spell Check","toolbar":"Verificação Ortográfica"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/ro.js b/theme/bootstrap/plugins/ckeditor/lang/ro.js new file mode 100644 index 0000000..11991e7 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/ro.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['ro']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Apasă ALT 0 pentru ajutor","browseServer":"Răsfoieşte server","url":"URL","protocol":"Protocol","upload":"Încarcă","uploadSubmit":"Trimite la server","image":"Imagine","flash":"Flash","form":"Formular (Form)","checkbox":"Bifă (Checkbox)","radio":"Buton radio (RadioButton)","textField":"Câmp text (TextField)","textarea":"Suprafaţă text (Textarea)","hiddenField":"Câmp ascuns (HiddenField)","button":"Buton","select":"Câmp selecţie (SelectionField)","imageButton":"Buton imagine (ImageButton)","notSet":"<nesetat>","id":"Id","name":"Nume","langDir":"Direcţia cuvintelor","langDirLtr":"stânga-dreapta (LTR)","langDirRtl":"dreapta-stânga (RTL)","langCode":"Codul limbii","longDescr":"Descrierea lungă URL","cssClass":"Clasele cu stilul paginii (CSS)","advisoryTitle":"Titlul consultativ","cssStyle":"Stil","ok":"OK","cancel":"Anulare","close":"Închide","preview":"Previzualizare","resize":"Trage pentru a redimensiona","generalTab":"General","advancedTab":"Avansat","validateNumberFailed":"Această valoare nu este un număr.","confirmNewPage":"Orice modificări nesalvate ale acestui conținut, vor fi pierdute. Sigur doriți încărcarea unei noi pagini?","confirmCancel":"Câteva opțiuni au fost schimbate. Sigur doriți să închideți dialogul?","options":"Opțiuni","target":"Țintă","targetNew":"Fereastră nouă (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"În aceeași fereastră (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"Stânga spre Dreapta (LTR)","langDirRTL":"Dreapta spre Stânga (RTL)","styles":"Stil","cssClasses":"Stylesheet Classes","width":"Lăţime","height":"Înălţime","align":"Aliniere","alignLeft":"Mărește Bara","alignRight":"Dreapta","alignCenter":"Centru","alignTop":"Sus","alignMiddle":"Mijloc","alignBottom":"Jos","invalidValue":"Varloare invalida","invalidHeight":"Înălțimea trebuie să fie un număr.","invalidWidth":"Lățimea trebuie să fie un număr.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, nu este disponibil</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Îngroşat (bold)","italic":"Înclinat (italic)","strike":"Tăiat (strike through)","subscript":"Indice (subscript)","superscript":"Putere (superscript)","underline":"Subliniat (underline)"},"blockquote":{"toolbar":"Citat"},"clipboard":{"copy":"Copiază","copyError":"Setările de securitate ale navigatorului (browser) pe care îl folosiţi nu permit editorului să execute automat operaţiunea de copiere. Vă rugăm folosiţi tastatura (Ctrl/Cmd+C).","cut":"Taie","cutError":"Setările de securitate ale navigatorului (browser) pe care îl folosiţi nu permit editorului să execute automat operaţiunea de tăiere. Vă rugăm folosiţi tastatura (Ctrl/Cmd+X).","paste":"Adaugă","pasteArea":"Suprafața de adăugare","pasteMsg":"Vă rugăm adăugaţi în căsuţa următoare folosind tastatura (<strong>Ctrl/Cmd+V</strong>) şi apăsaţi OK","securityMsg":"Din cauza setărilor de securitate ale programului dvs. cu care navigaţi pe internet (browser), editorul nu poate accesa direct datele din clipboard. Va trebui să adăugaţi din nou datele în această fereastră.","title":"Adaugă"},"contextmenu":{"options":"Opțiuni Meniu Contextual"},"toolbar":{"toolbarCollapse":"Micșorează Bara","toolbarExpand":"Mărește Bara","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Editează bara de unelte"},"elementspath":{"eleLabel":"Calea elementelor","eleTitle":"%1 element"},"format":{"label":"Formatare","panelTitle":"Formatare","tag_address":"Adresă","tag_div":"Normal (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatat"},"horizontalrule":{"toolbar":"Inserează linie orizontală"},"image":{"alertUrl":"Vă rugăm să scrieţi URL-ul imaginii","alt":"Text alternativ","border":"Margine","btnUpload":"Trimite la server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Informaţii despre imagine","linkTab":"Link (Legătură web)","lockRatio":"Păstrează proporţiile","menu":"Proprietăţile imaginii","resetSize":"Resetează mărimea","title":"Proprietăţile imaginii","titleButton":"Proprietăţi buton imagine (Image Button)","upload":"Încarcă","urlMissing":"Sursa URL a imaginii lipsește.","vSpace":"VSpace","validateBorder":"Bordura trebuie să fie un număr întreg.","validateHSpace":"Hspace trebuie să fie un număr întreg.","validateVSpace":"Vspace trebuie să fie un număr întreg."},"indent":{"indent":"Creşte indentarea","outdent":"Scade indentarea"},"fakeobjects":{"anchor":"Inserează/Editează ancoră","flash":"Flash Animation","hiddenfield":"Câmp ascuns (HiddenField)","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Tasta de acces","advanced":"Avansat","advisoryContentType":"Tipul consultativ al titlului","advisoryTitle":"Titlul consultativ","anchor":{"toolbar":"Inserează/Editează ancoră","menu":"Proprietăţi ancoră","title":"Proprietăţi ancoră","name":"Numele ancorei","errorName":"Vă rugăm scrieţi numele ancorei","remove":"Elimină ancora"},"anchorId":"după Id-ul elementului","anchorName":"după numele ancorei","charset":"Setul de caractere al resursei legate","cssClasses":"Clasele cu stilul paginii (CSS)","emailAddress":"Adresă de e-mail","emailBody":"Opțiuni Meniu Contextual","emailSubject":"Subiectul mesajului","id":"Id","info":"Informaţii despre link (Legătură web)","langCode":"Direcţia cuvintelor","langDir":"Direcţia cuvintelor","langDirLTR":"stânga-dreapta (LTR)","langDirRTL":"dreapta-stânga (RTL)","menu":"Editează Link","name":"Nume","noAnchors":"(Nicio ancoră disponibilă în document)","noEmail":"Vă rugăm să scrieţi adresa de e-mail","noUrl":"Vă rugăm să scrieţi URL-ul","other":"<alt>","popupDependent":"Dependent (Netscape)","popupFeatures":"Proprietăţile ferestrei popup","popupFullScreen":"Tot ecranul (Full Screen)(IE)","popupLeft":"Poziţia la stânga","popupLocationBar":"Bara de locaţie","popupMenuBar":"Bara de meniu","popupResizable":"Redimensionabil","popupScrollBars":"Bare de derulare","popupStatusBar":"Bara de status","popupToolbar":"Bara de opţiuni","popupTop":"Poziţia la dreapta","rel":"Relație","selectAnchor":"Selectaţi o ancoră","styles":"Stil","tabIndex":"Indexul tabului","target":"Ţintă (Target)","targetFrame":"<frame>","targetFrameName":"Numele frameului ţintă","targetPopup":"<fereastra popup>","targetPopupName":"Numele ferestrei popup","title":"Link (Legătură web)","toAnchor":"Ancoră în această pagină","toEmail":"E-Mail","toUrl":"URL","toolbar":"Inserează/Editează link (legătură web)","type":"Tipul link-ului (al legăturii web)","unlink":"Înlătură link (legătură web)","upload":"Încarcă"},"list":{"bulletedlist":"Inserează / Elimină Listă cu puncte","numberedlist":"Inserează / Elimină Listă numerotată"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Mărește","minimize":"Micșorează"},"pastetext":{"button":"Adaugă ca text simplu (Plain Text)","title":"Adaugă ca text simplu (Plain Text)"},"pastefromword":{"confirmCleanup":"Textul pe care doriți să-l lipiți este din Word. Doriți curățarea textului înante de a-l adăuga?","error":"Nu a fost posibilă curățarea datelor adăugate datorită unei erori interne","title":"Adaugă din Word","toolbar":"Adaugă din Word"},"removeformat":{"toolbar":"Înlătură formatarea"},"sourcearea":{"toolbar":"Sursa"},"specialchar":{"options":"Opțiuni caractere speciale","title":"Selectează caracter special","toolbar":"Inserează caracter special"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Formatarea stilurilor","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Mărimea marginii","caption":"Titlu (Caption)","cell":{"menu":"Celulă","insertBefore":"Inserează celulă înainte","insertAfter":"Inserează celulă după","deleteCell":"Şterge celule","merge":"Uneşte celule","mergeRight":"Uneşte la dreapta","mergeDown":"Uneşte jos","splitHorizontal":"Împarte celula pe orizontală","splitVertical":"Împarte celula pe verticală","title":"Proprietăți celulă","cellType":"Tipul celulei","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Aliniament orizontal","vAlign":"Aliniament vertical","alignBaseline":"Baseline","bgColor":"Culoare fundal","borderColor":"Culoare bordură","data":"Data","header":"Antet","yes":"Da","no":"Nu","invalidWidth":"Lățimea celulei trebuie să fie un număr.","invalidHeight":"Înălțimea celulei trebuie să fie un număr.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Alege"},"cellPad":"Spaţiu în cadrul celulei","cellSpace":"Spaţiu între celule","column":{"menu":"Coloană","insertBefore":"Inserează coloană înainte","insertAfter":"Inserează coloană după","deleteColumn":"Şterge celule"},"columns":"Coloane","deleteTable":"Şterge tabel","headers":"Antente","headersBoth":"Ambele","headersColumn":"Prima coloană","headersNone":"Nimic","headersRow":"Primul rând","invalidBorder":"Dimensiunea bordurii trebuie să aibe un număr.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Spațierea celului trebuie să fie un număr pozitiv.","invalidCols":"Numărul coloanelor trebuie să fie mai mare decât 0.","invalidHeight":"Inaltimea celulei trebuie sa fie un numar.","invalidRows":"Numărul rândurilor trebuie să fie mai mare decât 0.","invalidWidth":"Lățimea tabelului trebuie să fie un număr.","menu":"Proprietăţile tabelului","row":{"menu":"Rând","insertBefore":"Inserează rând înainte","insertAfter":"Inserează rând după","deleteRow":"Şterge rânduri"},"rows":"Rânduri","summary":"Rezumat","title":"Proprietăţile tabelului","toolbar":"Tabel","widthPc":"procente","widthPx":"pixeli","widthUnit":"unitate lățime"},"undo":{"redo":"Starea ulterioară (redo)","undo":"Starea anterioară (undo)"},"wsc":{"btnIgnore":"Ignoră","btnIgnoreAll":"Ignoră toate","btnReplace":"Înlocuieşte","btnReplaceAll":"Înlocuieşte tot","btnUndo":"Starea anterioară (undo)","changeTo":"Schimbă în","errorLoading":"Eroare în lansarea aplicației service host %s.","ieSpellDownload":"Unealta pentru verificat textul (Spell checker) neinstalată. Doriţi să o descărcaţi acum?","manyChanges":"Verificarea textului terminată: 1% cuvinte modificate","noChanges":"Verificarea textului terminată: Niciun cuvânt modificat","noMispell":"Verificarea textului terminată: Nicio greşeală găsită","noSuggestions":"- Fără sugestii -","notAvailable":"Scuzați, dar serviciul nu este disponibil momentan.","notInDic":"Nu e în dicţionar","oneChange":"Verificarea textului terminată: Un cuvânt modificat","progress":"Verificarea textului în desfăşurare...","title":"Spell Check","toolbar":"Verifică scrierea textului"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/ru.js b/theme/bootstrap/plugins/ckeditor/lang/ru.js new file mode 100644 index 0000000..dedfa25 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/ru.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['ru']={"editor":"Визуальный текстовый редактор","editorPanel":"Визуальный редактор текста","common":{"editorHelp":"Нажмите ALT-0 для открытия справки","browseServer":"Выбор на сервере","url":"Ссылка","protocol":"Протокол","upload":"Загрузка файла","uploadSubmit":"Загрузить на сервер","image":"Изображение","flash":"Flash","form":"Форма","checkbox":"Чекбокс","radio":"Радиокнопка","textField":"Текстовое поле","textarea":"Многострочное текстовое поле","hiddenField":"Скрытое поле","button":"Кнопка","select":"Выпадающий список","imageButton":"Кнопка-изображение","notSet":"<не указано>","id":"Идентификатор","name":"Имя","langDir":"Направление текста","langDirLtr":"Слева направо (LTR)","langDirRtl":"Справа налево (RTL)","langCode":"Код языка","longDescr":"Длинное описание ссылки","cssClass":"Класс CSS","advisoryTitle":"Заголовок","cssStyle":"Стиль","ok":"ОК","cancel":"Отмена","close":"Закрыть","preview":"Предпросмотр","resize":"Перетащите для изменения размера","generalTab":"Основное","advancedTab":"Дополнительно","validateNumberFailed":"Это значение не является числом.","confirmNewPage":"Несохранённые изменения будут потеряны! Вы действительно желаете перейти на другую страницу?","confirmCancel":"Некоторые параметры были изменены. Вы уверены, что желаете закрыть без сохранения?","options":"Параметры","target":"Цель","targetNew":"Новое окно (_blank)","targetTop":"Главное окно (_top)","targetSelf":"Текущее окно (_self)","targetParent":"Родительское окно (_parent)","langDirLTR":"Слева направо (LTR)","langDirRTL":"Справа налево (RTL)","styles":"Стиль","cssClasses":"CSS классы","width":"Ширина","height":"Высота","align":"Выравнивание","alignLeft":"По левому краю","alignRight":"По правому краю","alignCenter":"По центру","alignTop":"Поверху","alignMiddle":"Посередине","alignBottom":"Понизу","invalidValue":"Недопустимое значение.","invalidHeight":"Высота задается числом.","invalidWidth":"Ширина задается числом.","invalidCssLength":"Значение, указанное в поле \"%1\", должно быть положительным целым числом. Допускается указание единиц меры CSS (px, %, in, cm, mm, em, ex, pt или pc).","invalidHtmlLength":"Значение, указанное в поле \"%1\", должно быть положительным целым числом. Допускается указание единиц меры HTML (px или %).","invalidInlineStyle":"Значение, указанное для стиля элемента, должно состоять из одной или нескольких пар данных в формате \"параметр : значение\", разделённых точкой с запятой.","cssLengthTooltip":"Введите значение в пикселях, либо число с корректной единицей меры CSS (px, %, in, cm, mm, em, ex, pt или pc).","unavailable":"%1<span class=\"cke_accessibility\">, недоступно</span>"},"about":{"copy":"Copyright &copy; $1. Все права защищены.","dlgTitle":"О CKEditor","help":"$1 содержит подробную справку по использованию.","moreInfo":"Для получения информации о лицензии, пожалуйста, перейдите на наш сайт:","title":"О CKEditor","userGuide":"Руководство пользователя CKEditor"},"basicstyles":{"bold":"Полужирный","italic":"Курсив","strike":"Зачеркнутый","subscript":"Подстрочный индекс","superscript":"Надстрочный индекс","underline":"Подчеркнутый"},"blockquote":{"toolbar":"Цитата"},"clipboard":{"copy":"Копировать","copyError":"Настройки безопасности вашего браузера не разрешают редактору выполнять операции по копированию текста. Пожалуйста, используйте для этого клавиатуру (Ctrl/Cmd+C).","cut":"Вырезать","cutError":"Настройки безопасности вашего браузера не разрешают редактору выполнять операции по вырезке текста. Пожалуйста, используйте для этого клавиатуру (Ctrl/Cmd+X).","paste":"Вставить","pasteArea":"Зона для вставки","pasteMsg":"Пожалуйста, вставьте текст в зону ниже, используя клавиатуру (<strong>Ctrl/Cmd+V</strong>) и нажмите кнопку \"OK\".","securityMsg":"Настройки безопасности вашего браузера не разрешают редактору напрямую обращаться к буферу обмена. Вы должны вставить текст снова в это окно.","title":"Вставить"},"contextmenu":{"options":"Параметры контекстного меню"},"toolbar":{"toolbarCollapse":"Свернуть панель инструментов","toolbarExpand":"Развернуть панель инструментов","toolbarGroups":{"document":"Документ","clipboard":"Буфер обмена / Отмена действий","editing":"Корректировка","forms":"Формы","basicstyles":"Простые стили","paragraph":"Абзац","links":"Ссылки","insert":"Вставка","styles":"Стили","colors":"Цвета","tools":"Инструменты"},"toolbars":"Панели инструментов редактора"},"elementspath":{"eleLabel":"Путь элементов","eleTitle":"Элемент %1"},"format":{"label":"Форматирование","panelTitle":"Форматирование","tag_address":"Адрес","tag_div":"Обычное (div)","tag_h1":"Заголовок 1","tag_h2":"Заголовок 2","tag_h3":"Заголовок 3","tag_h4":"Заголовок 4","tag_h5":"Заголовок 5","tag_h6":"Заголовок 6","tag_p":"Обычное","tag_pre":"Моноширинное"},"horizontalrule":{"toolbar":"Вставить горизонтальную линию"},"image":{"alertUrl":"Пожалуйста, введите ссылку на изображение","alt":"Альтернативный текст","border":"Граница","btnUpload":"Загрузить на сервер","button2Img":"Вы желаете преобразовать это изображение-кнопку в обычное изображение?","hSpace":"Гориз. отступ","img2Button":"Вы желаете преобразовать это обычное изображение в изображение-кнопку?","infoTab":"Данные об изображении","linkTab":"Ссылка","lockRatio":"Сохранять пропорции","menu":"Свойства изображения","resetSize":"Вернуть обычные размеры","title":"Свойства изображения","titleButton":"Свойства изображения-кнопки","upload":"Загрузить","urlMissing":"Не указана ссылка на изображение.","vSpace":"Вертик. отступ","validateBorder":"Размер границ должен быть задан числом.","validateHSpace":"Горизонтальный отступ должен быть задан числом.","validateVSpace":"Вертикальный отступ должен быть задан числом."},"indent":{"indent":"Увеличить отступ","outdent":"Уменьшить отступ"},"fakeobjects":{"anchor":"Якорь","flash":"Flash анимация","hiddenfield":"Скрытое поле","iframe":"iFrame","unknown":"Неизвестный объект"},"link":{"acccessKey":"Клавиша доступа","advanced":"Дополнительно","advisoryContentType":"Тип содержимого","advisoryTitle":"Заголовок","anchor":{"toolbar":"Вставить / редактировать якорь","menu":"Изменить якорь","title":"Свойства якоря","name":"Имя якоря","errorName":"Пожалуйста, введите имя якоря","remove":"Удалить якорь"},"anchorId":"По идентификатору","anchorName":"По имени","charset":"Кодировка ресурса","cssClasses":"Классы CSS","emailAddress":"Email адрес","emailBody":"Текст сообщения","emailSubject":"Тема сообщения","id":"Идентификатор","info":"Информация о ссылке","langCode":"Код языка","langDir":"Направление текста","langDirLTR":"Слева направо (LTR)","langDirRTL":"Справа налево (RTL)","menu":"Редактировать ссылку","name":"Имя","noAnchors":"(В документе нет ни одного якоря)","noEmail":"Пожалуйста, введите email адрес","noUrl":"Пожалуйста, введите ссылку","other":"<другой>","popupDependent":"Зависимое (Netscape)","popupFeatures":"Параметры всплывающего окна","popupFullScreen":"Полноэкранное (IE)","popupLeft":"Отступ слева","popupLocationBar":"Панель адреса","popupMenuBar":"Панель меню","popupResizable":"Изменяемый размер","popupScrollBars":"Полосы прокрутки","popupStatusBar":"Строка состояния","popupToolbar":"Панель инструментов","popupTop":"Отступ сверху","rel":"Отношение","selectAnchor":"Выберите якорь","styles":"Стиль","tabIndex":"Последовательность перехода","target":"Цель","targetFrame":"<фрейм>","targetFrameName":"Имя целевого фрейма","targetPopup":"<всплывающее окно>","targetPopupName":"Имя всплывающего окна","title":"Ссылка","toAnchor":"Ссылка на якорь в тексте","toEmail":"Email","toUrl":"Ссылка","toolbar":"Вставить/Редактировать ссылку","type":"Тип ссылки","unlink":"Убрать ссылку","upload":"Загрузка"},"list":{"bulletedlist":"Вставить / удалить маркированный список","numberedlist":"Вставить / удалить нумерованный список"},"magicline":{"title":"Вставить здесь параграф"},"maximize":{"maximize":"Развернуть","minimize":"Свернуть"},"pastetext":{"button":"Вставить только текст","title":"Вставить только текст"},"pastefromword":{"confirmCleanup":"Текст, который вы желаете вставить, по всей видимости, был скопирован из Word. Следует ли очистить его перед вставкой?","error":"Невозможно очистить вставленные данные из-за внутренней ошибки","title":"Вставить из Word","toolbar":"Вставить из Word"},"removeformat":{"toolbar":"Убрать форматирование"},"sourcearea":{"toolbar":"Источник"},"specialchar":{"options":"Выбор специального символа","title":"Выберите специальный символ","toolbar":"Вставить специальный символ"},"scayt":{"about":"О SCAYT","aboutTab":"О SCAYT","addWord":"Добавить слово","allCaps":"Игнорировать слова из заглавных букв","dic_create":"Создать","dic_delete":"Удалить","dic_field_name":"Название словаря","dic_info":"Изначально, пользовательский словарь хранится в cookie, которые ограничены в размере. Когда словарь пользователя вырастает до размеров, что его невозможно хранить в cookie, он переносится на хранение на наш сервер. Чтобы сохранить ваш словарь на нашем сервере, вам следует указать название вашего словаря. Если у вас уже был словарь, который вы сохраняли на нашем сервере, то укажите здесь его название и нажмите кнопку Восстановить.","dic_rename":"Переименовать","dic_restore":"Восстановить","dictionariesTab":"Словари","disable":"Отключить SCAYT","emptyDic":"Вы должны указать название словаря.","enable":"Включить SCAYT","ignore":"Пропустить","ignoreAll":"Пропустить всё","ignoreDomainNames":"Игнорировать доменные имена","langs":"Языки","languagesTab":"Языки","mixedCase":"Игнорировать слова из букв в разном регистре","mixedWithDigits":"Игнорировать слова, содержащие цифры","moreSuggestions":"Ещё варианты","opera_title":"Не поддерживается Opera","options":"Настройки","optionsTab":"Параметры","title":"Проверка орфографии по мере ввода (SCAYT)","toggle":"Переключить SCAYT","noSuggestions":"Нет вариантов"},"stylescombo":{"label":"Стили","panelTitle":"Стили форматирования","panelTitle1":"Стили блока","panelTitle2":"Стили элемента","panelTitle3":"Стили объекта"},"table":{"border":"Размер границ","caption":"Заголовок","cell":{"menu":"Ячейка","insertBefore":"Вставить ячейку слева","insertAfter":"Вставить ячейку справа","deleteCell":"Удалить ячейки","merge":"Объединить ячейки","mergeRight":"Объединить с правой","mergeDown":"Объединить с нижней","splitHorizontal":"Разделить ячейку по горизонтали","splitVertical":"Разделить ячейку по вертикали","title":"Свойства ячейки","cellType":"Тип ячейки","rowSpan":"Объединяет строк","colSpan":"Объединяет колонок","wordWrap":"Перенос по словам","hAlign":"Горизонтальное выравнивание","vAlign":"Вертикальное выравнивание","alignBaseline":"По базовой линии","bgColor":"Цвет фона","borderColor":"Цвет границ","data":"Данные","header":"Заголовок","yes":"Да","no":"Нет","invalidWidth":"Ширина ячейки должна быть числом.","invalidHeight":"Высота ячейки должна быть числом.","invalidRowSpan":"Количество объединяемых строк должно быть задано числом.","invalidColSpan":"Количество объединяемых колонок должно быть задано числом.","chooseColor":"Выберите"},"cellPad":"Внутренний отступ ячеек","cellSpace":"Внешний отступ ячеек","column":{"menu":"Колонка","insertBefore":"Вставить колонку слева","insertAfter":"Вставить колонку справа","deleteColumn":"Удалить колонки"},"columns":"Колонки","deleteTable":"Удалить таблицу","headers":"Заголовки","headersBoth":"Сверху и слева","headersColumn":"Левая колонка","headersNone":"Без заголовков","headersRow":"Верхняя строка","invalidBorder":"Размер границ должен быть числом.","invalidCellPadding":"Внутренний отступ ячеек (cellpadding) должен быть числом.","invalidCellSpacing":"Внешний отступ ячеек (cellspacing) должен быть числом.","invalidCols":"Количество столбцов должно быть больше 0.","invalidHeight":"Высота таблицы должна быть числом.","invalidRows":"Количество строк должно быть больше 0.","invalidWidth":"Ширина таблицы должна быть числом.","menu":"Свойства таблицы","row":{"menu":"Строка","insertBefore":"Вставить строку сверху","insertAfter":"Вставить строку снизу","deleteRow":"Удалить строки"},"rows":"Строки","summary":"Итоги","title":"Свойства таблицы","toolbar":"Таблица","widthPc":"процентов","widthPx":"пикселей","widthUnit":"единица измерения"},"undo":{"redo":"Повторить","undo":"Отменить"},"wsc":{"btnIgnore":"Пропустить","btnIgnoreAll":"Пропустить всё","btnReplace":"Заменить","btnReplaceAll":"Заменить всё","btnUndo":"Отменить","changeTo":"Изменить на","errorLoading":"Произошла ошибка при подключении к серверу проверки орфографии: %s.","ieSpellDownload":"Модуль проверки орфографии не установлен. Хотите скачать его?","manyChanges":"Проверка орфографии завершена. Изменено слов: %1","noChanges":"Проверка орфографии завершена. Не изменено ни одного слова","noMispell":"Проверка орфографии завершена. Ошибок не найдено","noSuggestions":"- Варианты отсутствуют -","notAvailable":"Извините, но в данный момент сервис недоступен.","notInDic":"Отсутствует в словаре","oneChange":"Проверка орфографии завершена. Изменено одно слово","progress":"Орфография проверяется...","title":"Проверка орфографии","toolbar":"Проверить орфографию"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/si.js b/theme/bootstrap/plugins/ckeditor/lang/si.js new file mode 100644 index 0000000..7e100f4 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/si.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['si']={"editor":"පොහොසත් වචන සංස්කරණ","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"උදව් ලබා ගැනීමට ALT බොත්තම ඔබන්න","browseServer":"සෙවුම් සේවාදායකය","url":"URL","protocol":"මුලාපත්රය","upload":"උඩුගතකිරීම","uploadSubmit":"සේවාදායකය වෙත යොමුකිරිම","image":"රුපය","flash":"දීප්තිය","form":"පෝරමය","checkbox":"ලකුණුකිරීමේ කොටුව","radio":"තේරීම් ","textField":"ලියන ප්රදේශය","textarea":"අකුරු ","hiddenField":"සැඟවුණු ප්රදේශය","button":"බොත්තම","select":"තෝරන්න ","imageButton":"රුප ","notSet":"<යොදා >","id":"අංකය","name":"නම","langDir":"භාෂා දිශාව","langDirLtr":"වමේසිට දකුණුට","langDirRtl":"දකුණේ සිට වමට","langCode":"භාෂා කේතය","longDescr":"සම්පුර්න පැහැදිලි කිරීම","cssClass":"විලාශ පත්ර පන්තිය","advisoryTitle":"උපදෙස් ","cssStyle":"විලාසය","ok":"නිරදි","cancel":"අවලංගු කිරීම","close":"වැසීම","preview":"නැවත ","resize":"විශාලත්වය නැවත වෙනස් කිරීම","generalTab":"පොදු කරුණු.","advancedTab":"දීය","validateNumberFailed":"මෙම වටිනාකම අංකයක් නොවේ","confirmNewPage":"ආරක්ෂා නොකළ සියලුම දත්තයන් මැකියනුලැබේ. ඔබට නව පිටුවක් ලබා ගැනීමට අවශ්යද?","confirmCancel":"ඇතම් විකල්පයන් වෙනස් කර ඇත. ඔබට මින් නික්මීමට අවශ්යද?","options":" විකල්ප","target":"අරමුණ","targetNew":"නව කව්ළුව","targetTop":"වැදගත් කව්ළුව","targetSelf":"එම කව්ළුව(_තම\\\\)","targetParent":"මව් කව්ළුව(_)","langDirLTR":"වමේසිට දකුණුට","langDirRTL":"දකුණේ සිට වමට","styles":"විලාසය","cssClasses":"විලාසපත්ර පන්තිය","width":"පළල","height":"උස","align":"ගැලපුම","alignLeft":"වම","alignRight":"දකුණ","alignCenter":"මධ්ය","alignTop":"ඉ","alignMiddle":"මැද","alignBottom":"පහල","invalidValue":"වැරදී වටිනාකමකි","invalidHeight":"උස අංකයක් විය යුතුය","invalidWidth":"පළල අංකයක් විය යුතුය","invalidCssLength":"වටිනාකමක් නිරූපණය කිරීම \"%1\" ප්රදේශය ධන සංක්යාත්මක වටිනාකමක් හෝ නිවරදි නොවන CSS මිනුම් එකක(px, %, in, cm, mm, em, ex, pt, pc)","invalidHtmlLength":"වටිනාකමක් නිරූපණය කිරීම \"%1\" ප්රදේශය ධන සංක්යාත්මක වටිනාකමක් හෝ නිවරදි නොවන HTML මිනුම් එකක (px හෝ %).","invalidInlineStyle":"වටිනාකමක් නිරූපණය කිරීම පේළි විලාසයයට ආකෘතිය අනතර්ග විය යුතය \"නම : වටිනාකම\", තිත් කොමාවකින් වෙන් වෙන ලද.","cssLengthTooltip":"සංක්යා ඇතුලත් කිරීමේදී වටිනාකම තිත් ප්රමාණය නිවරදි CSS ඒකක(තිත්, %, අඟල්,සෙමි, mm, em, ex, pt, pc)","unavailable":"%1<span පන්තිය=\"ළඟා වියහැකි ද බලන්න\">, නොමැතිනම්</span>"},"about":{"copy":"පිටපත් අයිතිය සහ පිටපත් කිරීම;$1 .සියලුම හිමිකම් ඇවිරිණි.","dlgTitle":"CKEditor ගැන විස්තර","help":"උදව් සඳහා $1 ","moreInfo":"බලපත්ර තොරතුරු සදහා කරුණාකර අපගේ විද්යුත් ලිපිනයට පිවිසෙන්න:","title":"CKEditor ගැන විස්තර","userGuide":"CKEditor භාවිතා කිරීම පිළිබඳ "},"basicstyles":{"bold":"තද අකුරින් ලියනලද","italic":"බැධීඅකුරින් ලියන ලද","strike":"Strike Through","subscript":"Subscript","superscript":"Superscript","underline":"යටින් ඉරි අදින ලද"},"blockquote":{"toolbar":"උද්ධෘත කොටස"},"clipboard":{"copy":"පිටපත් කරන්න","copyError":"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).","cut":"කපාගන්න","cutError":"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).","paste":"අලවන්න","pasteArea":"අලවන ප්රදේශ","pasteMsg":"Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"අලවන්න"},"contextmenu":{"options":"අනතර්ග ලේඛණ විකල්ප"},"toolbar":{"toolbarCollapse":"මෙවලම් තීරුව හැකුලුම.","toolbarExpand":"මෙවලම් තීරුව දීගහැරුම","toolbarGroups":{"document":"ලිපිය","clipboard":"ඇමිණුම වෙනස් කිරීම","editing":"සංස්කරණය","forms":"පෝරමය","basicstyles":"මුලික විලාසය","paragraph":"චේදය","links":"සබැඳිය","insert":"ඇතුලත් කිරීම","styles":"විලාසය","colors":"වර්ණය","tools":"මෙවලම්"},"toolbars":"සංස්කරණ මෙවලම් තීරුව"},"elementspath":{"eleLabel":"මුලද්රව්ය මාර්ගය","eleTitle":"%1 මුල"},"format":{"label":"ආකෘතිය","panelTitle":"චේදයේ ","tag_address":"ලිපිනය","tag_div":"සාමාන්ය(DIV)","tag_h1":"ශීර්ෂය 1","tag_h2":"ශීර්ෂය 2","tag_h3":"ශීර්ෂය 3","tag_h4":"ශීර්ෂය 4","tag_h5":"ශීර්ෂය 5","tag_h6":"ශීර්ෂය 6","tag_p":"සාමාන්ය","tag_pre":"ආකෘතියන්"},"horizontalrule":{"toolbar":"තිරස් රේඛාවක් ඇතුලත් කරන්න"},"image":{"alertUrl":"කරුණාකර රුපයේ URL ලියන්න","alt":"විකල්ප ","border":"සීමාවවල ","btnUpload":"සේවාදායකය වෙත යොමුකිරිම","button2Img":"ඔබට තෝරන ලද රුපය පරිවර්තනය කිරීමට අවශ්යද?","hSpace":"HSpace","img2Button":"ඔබට තෝරන ලද රුපය පරිවර්තනය කිරීමට අවශ්යද?","infoTab":"රුපයේ තොරතුරු","linkTab":"සබැඳිය","lockRatio":"නවතන අනුපාතය ","menu":"රුපයේ ගුණ","resetSize":"නැවතත් විශාලත්වය වෙනස් කිරීම","title":"රුපයේ ","titleButton":"රුප බොත්තමේ ගුණ","upload":"උඩුගතකිරීම","urlMissing":"රුප මුලාශ්ර URL නැත.","vSpace":"VSpace","validateBorder":"මාඉම් සම්පුර්ණ සංක්යාවක් විය යුතුය.","validateHSpace":"HSpace සම්පුර්ණ සංක්යාවක් විය යුතුය","validateVSpace":"VSpace සම්පුර්ණ සංක්යාවක් විය යුතුය."},"indent":{"indent":"අතර පරතරය වැඩිකරන්න","outdent":"අතර පරතරය අඩුකරන්න"},"fakeobjects":{"anchor":"ආධාරය","flash":"Flash Animation","hiddenfield":"සැඟවුණු ප්රදේශය","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"ප්රවේශ යතුර","advanced":"දීය","advisoryContentType":"උපදේශාත්මක අන්තර්ගත ආකාරය","advisoryTitle":"උපදේශාත්මක නාමය","anchor":{"toolbar":"ආධාරය","menu":"ආධාරය වෙනස් කිරීම","title":"ආධාරක ","name":"ආධාරකයේ නාමය","errorName":"කරුණාකර ආධාරකයේ නාමය ඇතුල් කරන්න","remove":"ආධාරකය ඉවත් කිරීම"},"anchorId":"By Element Id","anchorName":"By Anchor Name","charset":"Linked Resource Charset","cssClasses":"විලාසපත්ර පන්තිය","emailAddress":"E-Mail Address","emailBody":"Message Body","emailSubject":"Message Subject","id":"අංකය","info":"Link Info","langCode":"භාෂා කේතය","langDir":"භාෂා දිශාව","langDirLTR":"වමේසිට දකුණුට","langDirRTL":"දකුණේ සිට වමට","menu":"Edit Link","name":"නම","noAnchors":"(No anchors available in the document)","noEmail":"Please type the e-mail address","noUrl":"Please type the link URL","other":"<other>","popupDependent":"Dependent (Netscape)","popupFeatures":"Popup Window Features","popupFullScreen":"Full Screen (IE)","popupLeft":"Left Position","popupLocationBar":"Location Bar","popupMenuBar":"Menu Bar","popupResizable":"Resizable","popupScrollBars":"Scroll Bars","popupStatusBar":"Status Bar","popupToolbar":"Toolbar","popupTop":"Top Position","rel":"Relationship","selectAnchor":"Select an Anchor","styles":"විලාසය","tabIndex":"Tab Index","target":"අරමුණ","targetFrame":"<frame>","targetFrameName":"Target Frame Name","targetPopup":"<popup window>","targetPopupName":"Popup Window Name","title":"සබැඳිය","toAnchor":"Link to anchor in the text","toEmail":"E-mail","toUrl":"URL","toolbar":"සබැඳිය","type":"Link Type","unlink":"Unlink","upload":"උඩුගතකිරීම"},"list":{"bulletedlist":"ඇතුලත් / ඉවත් කිරීම ලඉස්තුව","numberedlist":"ඇතුලත් / ඉවත් කිරීම අන්න්කිත ලඉස්තුව"},"magicline":{"title":"චේදය ඇතුලත් කරන්න"},"maximize":{"maximize":"විශාල කිරීම","minimize":"කුඩා කිරීම"},"pastetext":{"button":"සාමාන්ය අක්ෂර ලෙස අලවන්න","title":"සාමාන්ය අක්ෂර ලෙස අලවන්න"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"වචන වලින් අලවන්න","toolbar":"වචන වලින් අලවන්න"},"removeformat":{"toolbar":"සැකසීම වෙනස් කරන්න"},"sourcearea":{"toolbar":"මුලාශ්රය"},"specialchar":{"options":"විශේෂ ගුණාංග වීකල්ප","title":"විශේෂ ගුණාංග ","toolbar":"විශේෂ ගුණාංග ඇතුලත් "},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"විලාසය","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"සීමාවවල විශාලත්වය","caption":"Caption","cell":{"menu":"කොටුව","insertBefore":"පෙර කොටුවක් ඇතුල්කිරිම","insertAfter":"පසුව කොටුවක් ඇතුලත් ","deleteCell":"කොටුව මැකීම","merge":"කොටු එකට යාකිරිම","mergeRight":"දකුණට ","mergeDown":"පහලට ","splitHorizontal":"තිරස්ව කොටු පැතිරීම","splitVertical":"සිරස්ව කොටු පැතිරීම","title":"කොටු ","cellType":"කොටු වර්ගය","rowSpan":"පේළි පළල","colSpan":"සිරස් පළල","wordWrap":"වචන ගැලපුම","hAlign":"තිරස්ව ","vAlign":"සිරස්ව ","alignBaseline":"පාද රේඛාව","bgColor":"පසුබිම් වර්ණය","borderColor":"මායිම් ","data":"Data","header":"ශීර්ෂක","yes":"ඔව්","no":"නැත","invalidWidth":"කොටු පළල සංඛ්ය්ත්මක වටිනාකමක් විය යුතුය","invalidHeight":"කොටු උස සංඛ්ය්ත්මක වටිනාකමක් විය යුතුය","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"තෝරන්න"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"සිරස් ","deleteTable":"වගුව මකන්න","headers":"ශීර්ෂක","headersBoth":"දෙකම","headersColumn":"පළමූ සිරස් තීරුව","headersNone":"කිසිවක්ම නොවේ","headersRow":"පළමූ පේළිය","invalidBorder":"Border size must be a number.","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Table Properties","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"Rows","summary":"Summary","title":"Table Properties","toolbar":"Table","widthPc":"percent","widthPx":"pixels","widthUnit":"width unit"},"undo":{"redo":"නැවත කිරීම","undo":"වෙනස් කිරීම"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/sk.js b/theme/bootstrap/plugins/ckeditor/lang/sk.js new file mode 100644 index 0000000..38ebb70 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/sk.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['sk']={"editor":"Editor formátovaného textu","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Stlačte ALT 0 pre nápovedu","browseServer":"Prechádzať server","url":"URL","protocol":"Protokol","upload":"Odoslať","uploadSubmit":"Odoslať na server","image":"Obrázok","flash":"Flash","form":"Formulár","checkbox":"Zaškrtávacie políčko","radio":"Prepínač","textField":"Textové pole","textarea":"Textová oblasť","hiddenField":"Skryté pole","button":"Tlačidlo","select":"Rozbaľovací zoznam","imageButton":"Obrázkové tlačidlo","notSet":"<nenastavené>","id":"Id","name":"Meno","langDir":"Orientácia jazyka","langDirLtr":"Zľava doprava (LTR)","langDirRtl":"Sprava doľava (RTL)","langCode":"Kód jazyka","longDescr":"Dlhý popis URL","cssClass":"Trieda štýlu","advisoryTitle":"Pomocný titulok","cssStyle":"Štýl","ok":"OK","cancel":"Zrušiť","close":"Zatvorit","preview":"Náhľad","resize":"Zmeniť veľkosť","generalTab":"Hlavné","advancedTab":"Rozšírené","validateNumberFailed":"Hodnota nieje číslo.","confirmNewPage":"Prajete si načítat novú stránku? Všetky neuložené zmeny budú stratené. ","confirmCancel":"Niektore možnosti boli zmenené. Naozaj chcete zavrieť okno?","options":"Možnosti","target":"Cieľ","targetNew":"Nové okno (_blank)","targetTop":"Najvrchnejšie okno (_top)","targetSelf":"To isté okno (_self)","targetParent":"Rodičovské okno (_parent)","langDirLTR":"Zľava doprava (LTR)","langDirRTL":"Sprava doľava (RTL)","styles":"Štýl","cssClasses":"Triedy štýlu","width":"Šírka","height":"Výška","align":"Zarovnanie","alignLeft":"Vľavo","alignRight":"Vpravo","alignCenter":"Na stred","alignTop":"Nahor","alignMiddle":"Na stred","alignBottom":"Dole","invalidValue":"Neplatná hodnota.","invalidHeight":"Výška musí byť číslo.","invalidWidth":"Šírka musí byť číslo.","invalidCssLength":"Špecifikovaná hodnota pre pole \"%1\" musí byť kladné číslo s alebo bez platnej CSS mernej jednotky (px, %, in, cm, mm, em, ex, pt alebo pc).","invalidHtmlLength":"Špecifikovaná hodnota pre pole \"%1\" musí byť kladné číslo s alebo bez platnej HTML mernej jednotky (px alebo %).","invalidInlineStyle":"Zadaná hodnota pre inline štýl musí pozostávať s jedného, alebo viac dvojíc formátu \"názov: hodnota\", oddelených bodkočiarkou.","cssLengthTooltip":"Vložte číslo pre hodnotu v pixeloch alebo číslo so správnou CSS jednotou (px, %, in, cm, mm, em, ex, pt alebo pc).","unavailable":"%1<span class=\"cke_accessibility\">, nedostupný</span>"},"about":{"copy":"Copyright &copy; $1. Všetky práva vyhradené.","dlgTitle":"O CKEditor-e","help":"Zaškrtnite $1 pre pomoc.","moreInfo":"Pre informácie o licenciách, prosíme, navštívte našu web stránku:","title":"O CKEditor-e","userGuide":"Používateľská príručka KCEditor-a"},"basicstyles":{"bold":"Tučné","italic":"Kurzíva","strike":"Prečiarknuté","subscript":"Dolný index","superscript":"Horný index","underline":"Podčiarknuté"},"blockquote":{"toolbar":"Citácia"},"clipboard":{"copy":"Kopírovať","copyError":"Bezpečnostné nastavenia Vášho prehliadača nedovoľujú editoru automaticky spustiť operáciu kopírovania. Prosím, použite na to klávesnicu (Ctrl/Cmd+C).","cut":"Vystrihnúť","cutError":"Bezpečnostné nastavenia Vášho prehliadača nedovoľujú editoru automaticky spustiť operáciu vystrihnutia. Prosím, použite na to klávesnicu (Ctrl/Cmd+X).","paste":"Vložiť","pasteArea":"Miesto pre vloženie","pasteMsg":"Prosím, vložte nasledovný rámček použitím klávesnice (<STRONG>Ctrl/Cmd+V</STRONG>) a stlačte OK.","securityMsg":"Kvôli vašim bezpečnostným nastaveniam prehliadača editor nie je schopný pristupovať k vašej schránke na kopírovanie priamo. Vložte to preto do tohto okna.","title":"Vložiť"},"contextmenu":{"options":"Možnosti kontextového menu"},"toolbar":{"toolbarCollapse":"Zbaliť lištu nástrojov","toolbarExpand":"Rozbaliť lištu nástrojov","toolbarGroups":{"document":"Dokument","clipboard":"Schránka pre kopírovanie/Späť","editing":"Upravovanie","forms":"Formuláre","basicstyles":"Základné štýly","paragraph":"Odstavec","links":"Odkazy","insert":"Vložiť","styles":"Štýly","colors":"Farby","tools":"Nástroje"},"toolbars":"Lišty nástrojov editora"},"elementspath":{"eleLabel":"Cesta prvkov","eleTitle":"%1 prvok"},"format":{"label":"Formát","panelTitle":"Formát","tag_address":"Adresa","tag_div":"Normálny (DIV)","tag_h1":"Nadpis 1","tag_h2":"Nadpis 2","tag_h3":"Nadpis 3","tag_h4":"Nadpis 4","tag_h5":"Nadpis 5","tag_h6":"Nadpis 6","tag_p":"Normálny","tag_pre":"Formátovaný"},"horizontalrule":{"toolbar":"Vložiť vodorovnú čiaru"},"image":{"alertUrl":"Zadajte prosím URL obrázka","alt":"Alternatívny text","border":"Rám (border)","btnUpload":"Odoslať to na server","button2Img":"Chcete zmeniť vybrané obrázkové tlačidlo na jednoduchý obrázok?","hSpace":"H-medzera","img2Button":"Chcete zmeniť vybraný obrázok na obrázkové tlačidlo?","infoTab":"Informácie o obrázku","linkTab":"Odkaz","lockRatio":"Pomer zámky","menu":"Vlastnosti obrázka","resetSize":"Pôvodná veľkosť","title":"Vlastnosti obrázka","titleButton":"Vlastnosti obrázkového tlačidla","upload":"Nahrať","urlMissing":"Chýba URL zdroja obrázka.","vSpace":"V-medzera","validateBorder":"Rám (border) musí byť celé číslo.","validateHSpace":"H-medzera musí byť celé číslo.","validateVSpace":"V-medzera musí byť celé číslo."},"indent":{"indent":"Zväčšiť odsadenie","outdent":"Zmenšiť odsadenie"},"fakeobjects":{"anchor":"Kotva","flash":"Flash animácia","hiddenfield":"Skryté pole","iframe":"IFrame","unknown":"Neznámy objekt"},"link":{"acccessKey":"Prístupový kľúč","advanced":"Rozšírené","advisoryContentType":"Pomocný typ obsahu","advisoryTitle":"Pomocný titulok","anchor":{"toolbar":"Kotva","menu":"Upraviť kotvu","title":"Vlastnosti kotvy","name":"Názov kotvy","errorName":"Zadajte prosím názov kotvy","remove":"Odstrániť kotvu"},"anchorId":"Podľa Id objektu","anchorName":"Podľa mena kotvy","charset":"Priradená znaková sada","cssClasses":"Triedy štýlu","emailAddress":"E-Mailová adresa","emailBody":"Telo správy","emailSubject":"Predmet správy","id":"Id","info":"Informácie o odkaze","langCode":"Orientácia jazyka","langDir":"Orientácia jazyka","langDirLTR":"Zľava doprava (LTR)","langDirRTL":"Sprava doľava (RTL)","menu":"Upraviť odkaz","name":"Názov","noAnchors":"(V dokumente nie sú dostupné žiadne kotvy)","noEmail":"Zadajte prosím e-mailovú adresu","noUrl":"Zadajte prosím URL odkazu","other":"<iný>","popupDependent":"Závislosť (Netscape)","popupFeatures":"Vlastnosti vyskakovacieho okna","popupFullScreen":"Celá obrazovka (IE)","popupLeft":"Ľavý okraj","popupLocationBar":"Panel umiestnenia (location bar)","popupMenuBar":"Panel ponuky (menu bar)","popupResizable":"Meniteľná veľkosť (resizable)","popupScrollBars":"Posuvníky (scroll bars)","popupStatusBar":"Stavový riadok (status bar)","popupToolbar":"Panel nástrojov (toolbar)","popupTop":"Horný okraj","rel":"Vzťah (rel)","selectAnchor":"Vybrať kotvu","styles":"Štýl","tabIndex":"Poradie prvku (tab index)","target":"Cieľ","targetFrame":"<rámec>","targetFrameName":"Názov rámu cieľa","targetPopup":"<vyskakovacie okno>","targetPopupName":"Názov vyskakovacieho okna","title":"Odkaz","toAnchor":"Odkaz na kotvu v texte","toEmail":"E-mail","toUrl":"URL","toolbar":"Odkaz","type":"Typ odkazu","unlink":"Odstrániť odkaz","upload":"Nahrať"},"list":{"bulletedlist":"Vložiť/Odstrániť zoznam s odrážkami","numberedlist":"Vložiť/Odstrániť číslovaný zoznam"},"magicline":{"title":"Sem vložte paragraf"},"maximize":{"maximize":"Maximalizovať","minimize":"Minimalizovať"},"pastetext":{"button":"Vložiť ako čistý text","title":"Vložiť ako čistý text"},"pastefromword":{"confirmCleanup":"Vkladaný text vyzerá byť skopírovaný z Wordu. Chcete ho automaticky vyčistiť pred vkladaním?","error":"Nebolo možné vyčistiť vložené dáta kvôli internej chybe","title":"Vložiť z Wordu","toolbar":"Vložiť z Wordu"},"removeformat":{"toolbar":"Odstrániť formátovanie"},"sourcearea":{"toolbar":"Zdroj"},"specialchar":{"options":"Možnosti špeciálneho znaku","title":"Výber špeciálneho znaku","toolbar":"Vložiť špeciálny znak"},"scayt":{"about":"O KPPP (Kontrola pravopisu počas písania)","aboutTab":"O","addWord":"Pridať slovo","allCaps":"Ignorovať slová písané veľkými písmenami","dic_create":"Vytvoriť","dic_delete":"Vymazať","dic_field_name":"Názov slovníka","dic_info":"Spočiatku je užívateľský slovník uložený v cookie. Cookie však majú obmedzenú veľkosť. Keď užívateľský slovník narastie do bodu, kedy nemôže byť uložený v cookie, potom musí byť slovník uložený na našom serveri. Pre uloženie vášho osobného slovníka na náš server by ste mali zadať názov pre váš slovník. Ak už máte uložený slovník, prosíme, napíšte jeho názov a kliknite tlačidlo Obnoviť.","dic_rename":"Premenovať","dic_restore":"Obnoviť","dictionariesTab":"Slovníky","disable":"Zakázať KPPP (Kontrola pravopisu počas písania)","emptyDic":"Názov slovníka by nemal byť prázdny.","enable":"Povoliť KPPP (Kontrola pravopisu počas písania)","ignore":"Ignorovať","ignoreAll":"Ignorovať všetko","ignoreDomainNames":"Iznorovať názvy domén","langs":"Jazyky","languagesTab":"Jazyky","mixedCase":"Ignorovať slová so smiešanými veľkými a malými písmenami","mixedWithDigits":"Ignorovať slová s číslami","moreSuggestions":"Viac návrhov","opera_title":"Nepodporované Operou","options":"Možnosti","optionsTab":"Možnosti","title":"Kontrola pravopisu počas písania","toggle":"Prepnúť KPPP (Kontrola pravopisu počas písania)","noSuggestions":"No suggestion"},"stylescombo":{"label":"Štýly","panelTitle":"Formátovanie štýlov","panelTitle1":"Štýly bloku","panelTitle2":"Vnútroriadkové (inline) štýly","panelTitle3":"Štýly objeku"},"table":{"border":"Šírka rámu (border)","caption":"Popis","cell":{"menu":"Bunka","insertBefore":"Vložiť bunku pred","insertAfter":"Vložiť bunku za","deleteCell":"Vymazať bunky","merge":"Zlúčiť bunky","mergeRight":"Zlúčiť doprava","mergeDown":"Zlúčiť dole","splitHorizontal":"Rozdeliť bunky horizontálne","splitVertical":"Rozdeliť bunky vertikálne","title":"Vlastnosti bunky","cellType":"Typ bunky","rowSpan":"Rozsah riadkov","colSpan":"Rozsah stĺpcov","wordWrap":"Zalomovanie riadkov","hAlign":"Horizontálne zarovnanie","vAlign":"Vertikálne zarovnanie","alignBaseline":"Základná čiara (baseline)","bgColor":"Farba pozadia","borderColor":"Farba rámu","data":"Dáta","header":"Hlavička","yes":"Áno","no":"Nie","invalidWidth":"Šírka bunky musí byť číslo.","invalidHeight":"Výška bunky musí byť číslo.","invalidRowSpan":"Rozsah riadkov musí byť celé číslo.","invalidColSpan":"Rozsah stĺpcov musí byť celé číslo.","chooseColor":"Vybrať"},"cellPad":"Odsadenie obsahu (cell padding)","cellSpace":"Vzdialenosť buniek (cell spacing)","column":{"menu":"Stĺpec","insertBefore":"Vložiť stĺpec pred","insertAfter":"Vložiť stĺpec po","deleteColumn":"Zmazať stĺpce"},"columns":"Stĺpce","deleteTable":"Vymazať tabuľku","headers":"Hlavička","headersBoth":"Obe","headersColumn":"Prvý stĺpec","headersNone":"Žiadne","headersRow":"Prvý riadok","invalidBorder":"Širka rámu musí byť číslo.","invalidCellPadding":"Odsadenie v bunkách (cell padding) musí byť kladné číslo.","invalidCellSpacing":"Medzera mädzi bunkami (cell spacing) musí byť kladné číslo.","invalidCols":"Počet stĺpcov musí byť číslo väčšie ako 0.","invalidHeight":"Výška tabuľky musí byť číslo.","invalidRows":"Počet riadkov musí byť číslo väčšie ako 0.","invalidWidth":"Širka tabuľky musí byť číslo.","menu":"Vlastnosti tabuľky","row":{"menu":"Riadok","insertBefore":"Vložiť riadok pred","insertAfter":"Vložiť riadok po","deleteRow":"Vymazať riadky"},"rows":"Riadky","summary":"Prehľad","title":"Vlastnosti tabuľky","toolbar":"Tabuľka","widthPc":"percent","widthPx":"pixelov","widthUnit":"jednotka šírky"},"undo":{"redo":"Znovu","undo":"Späť"},"wsc":{"btnIgnore":"Ignorovať","btnIgnoreAll":"Ignorovať všetko","btnReplace":"Prepísat","btnReplaceAll":"Prepísat všetko","btnUndo":"Späť","changeTo":"Zmeniť na","errorLoading":"Chyba pri načítaní slovníka z adresy: %s.","ieSpellDownload":"Kontrola pravopisu nie je naištalovaná. Chcete ju teraz stiahnuť?","manyChanges":"Kontrola pravopisu dokončená: Bolo zmenených %1 slov","noChanges":"Kontrola pravopisu dokončená: Neboli zmenené žiadne slová","noMispell":"Kontrola pravopisu dokončená: Neboli nájdené žiadne chyby pravopisu","noSuggestions":"- Žiadny návrh -","notAvailable":"Prepáčte, ale služba je momentálne nedostupná.","notInDic":"Nie je v slovníku","oneChange":"Kontrola pravopisu dokončená: Bolo zmenené jedno slovo","progress":"Prebieha kontrola pravopisu...","title":"Skontrolovať pravopis","toolbar":"Kontrola pravopisu"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/sl.js b/theme/bootstrap/plugins/ckeditor/lang/sl.js new file mode 100644 index 0000000..d00e1db --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/sl.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['sl']={"editor":"Bogat Urejevalnik Besedila","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Pritisnite ALT 0 za pomoč","browseServer":"Prebrskaj na strežniku","url":"URL","protocol":"Protokol","upload":"Naloži","uploadSubmit":"Pošlji na strežnik","image":"Slika","flash":"Flash","form":"Obrazec","checkbox":"Potrditveno polje","radio":"Izbirno polje","textField":"Vnosno polje","textarea":"Vnosno območje","hiddenField":"Skrito polje","button":"Gumb","select":"Spustno Polje","imageButton":"Slikovni Gumb","notSet":"<ni določen>","id":"Id","name":"Ime","langDir":"Smer jezika","langDirLtr":"Od leve proti desni (LTR)","langDirRtl":"Od desne proti levi (RTL)","langCode":"Koda Jezika","longDescr":"Dolg opis URL-ja","cssClass":"Razred stilne predloge","advisoryTitle":"Predlagani naslov","cssStyle":"Slog","ok":"V redu","cancel":"Prekliči","close":"Zapri","preview":"Predogled","resize":"Potegni za spremembo velikosti","generalTab":"Splošno","advancedTab":"Napredno","validateNumberFailed":"Ta vrednost ni število.","confirmNewPage":"Vse neshranjene spremembe te vsebine bodo izgubljene. Ali res želite naložiti novo stran?","confirmCancel":"Nekaj možnosti je bilo spremenjenih. Ali res želite zapreti okno?","options":"Možnosti","target":"Cilj","targetNew":"Novo Okno (_blank)","targetTop":"Vrhovno Okno (_top)","targetSelf":"Enako Okno (_self)","targetParent":"Matično Okno (_parent)","langDirLTR":"Od leve proti desni (LTR)","langDirRTL":"Od desne proti levi (RTL)","styles":"Slog","cssClasses":"Razred stilne predloge","width":"Širina","height":"Višina","align":"Poravnava","alignLeft":"Levo","alignRight":"Desno","alignCenter":"Sredinsko","alignTop":"Na vrh","alignMiddle":"V sredino","alignBottom":"Na dno","invalidValue":"Neveljavna vrednost.","invalidHeight":"Višina mora biti število.","invalidWidth":"Širina mora biti število.","invalidCssLength":"Vrednost določena za \"%1\" polje mora biti pozitivna številka z ali brez veljavne CSS enote za merjenje (px, %, in, cm, mm, em, ex, pt, ali pc).","invalidHtmlLength":"Vrednost določena za \"%1\" polje mora biti pozitivna številka z ali brez veljavne HTML enote za merjenje (px ali %).","invalidInlineStyle":"Vrednost določena za inline slog mora biti sestavljena iz ene ali več tork (tuples) z obliko \"ime : vrednost\", ločenih z podpičji.","cssLengthTooltip":"Vnesite številko za vrednost v slikovnih pikah (pixels) ali številko z veljavno CSS enoto (px, %, in, cm, mm, em, ex, pt, ali pc).","unavailable":"%1<span class=\"cke_accessibility\">, nedosegljiv</span>"},"about":{"copy":"Copyright &copy; $1. Vse pravice pridržane.","dlgTitle":"O programu CKEditor","help":"Preverite $1 za pomoč.","moreInfo":"Za informacijo o licenci prosim obiščite našo spletno stran:","title":"O programu CKEditor","userGuide":"CKEditor Navodila za Uporabo"},"basicstyles":{"bold":"Krepko","italic":"Ležeče","strike":"Prečrtano","subscript":"Podpisano","superscript":"Nadpisano","underline":"Podčrtano"},"blockquote":{"toolbar":"Citat"},"clipboard":{"copy":"Kopiraj","copyError":"Varnostne nastavitve brskalnika ne dopuščajo samodejnega kopiranja. Uporabite kombinacijo tipk na tipkovnici (Ctrl/Cmd+C).","cut":"Izreži","cutError":"Varnostne nastavitve brskalnika ne dopuščajo samodejnega izrezovanja. Uporabite kombinacijo tipk na tipkovnici (Ctrl/Cmd+X).","paste":"Prilepi","pasteArea":"Prilepi Prostor","pasteMsg":"Prosim prilepite v sleči okvir s pomočjo tipkovnice (<STRONG>Ctrl/Cmd+V</STRONG>) in pritisnite <STRONG>V redu</STRONG>.","securityMsg":"Zaradi varnostnih nastavitev vašega brskalnika urejevalnik ne more neposredno dostopati do odložišča. Vsebino odložišča ponovno prilepite v to okno.","title":"Prilepi"},"contextmenu":{"options":"Možnosti Kontekstnega Menija"},"toolbar":{"toolbarCollapse":"Skrči Orodno Vrstico","toolbarExpand":"Razširi Orodno Vrstico","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Urejevalnik orodne vrstice"},"elementspath":{"eleLabel":"Pot elementov","eleTitle":"%1 element"},"format":{"label":"Oblika","panelTitle":"Oblika","tag_address":"Napis","tag_div":"Navaden (DIV)","tag_h1":"Naslov 1","tag_h2":"Naslov 2","tag_h3":"Naslov 3","tag_h4":"Naslov 4","tag_h5":"Naslov 5","tag_h6":"Naslov 6","tag_p":"Navaden","tag_pre":"Oblikovan"},"horizontalrule":{"toolbar":"Vstavi vodoravno črto"},"image":{"alertUrl":"Vnesite URL slike","alt":"Nadomestno besedilo","border":"Obroba","btnUpload":"Pošlji na strežnik","button2Img":"Želiš pretvoriti izbrani gumb s sliko v preprosto sliko?","hSpace":"Vodoravni razmik","img2Button":"Želiš pretvoriti izbrano sliko v gumb s sliko?","infoTab":"Podatki o sliki","linkTab":"Povezava","lockRatio":"Zakleni razmerje","menu":"Lastnosti slike","resetSize":"Ponastavi velikost","title":"Lastnosti slike","titleButton":"Lastnosti gumba s sliko","upload":"Pošlji","urlMissing":"Manjka vir (URL) slike.","vSpace":"Navpični razmik","validateBorder":"Meja mora biti celo število.","validateHSpace":"HSpace mora biti celo število.","validateVSpace":"VSpace mora biti celo število."},"indent":{"indent":"Povečaj zamik","outdent":"Zmanjšaj zamik"},"fakeobjects":{"anchor":"Sidro","flash":"Flash animacija","hiddenfield":"Skrito polje","iframe":"IFrame","unknown":"Neznan objekt"},"link":{"acccessKey":"Dostopno Geslo","advanced":"Napredno","advisoryContentType":"Predlagani tip vsebine (content-type)","advisoryTitle":"Predlagani naslov","anchor":{"toolbar":"Vstavi/uredi zaznamek","menu":"Lastnosti zaznamka","title":"Lastnosti zaznamka","name":"Ime zaznamka","errorName":"Prosim vnesite ime zaznamka","remove":"Remove Anchor"},"anchorId":"Po ID-ju elementa","anchorName":"Po imenu zaznamka","charset":"Kodna tabela povezanega vira","cssClasses":"Razred stilne predloge","emailAddress":"Elektronski naslov","emailBody":"Vsebina sporočila","emailSubject":"Predmet sporočila","id":"Id","info":"Podatki o povezavi","langCode":"Smer jezika","langDir":"Smer jezika","langDirLTR":"Od leve proti desni (LTR)","langDirRTL":"Od desne proti levi (RTL)","menu":"Uredi povezavo","name":"Ime","noAnchors":"(V tem dokumentu ni zaznamkov)","noEmail":"Vnesite elektronski naslov","noUrl":"Vnesite URL povezave","other":"<drug>","popupDependent":"Podokno (Netscape)","popupFeatures":"Značilnosti pojavnega okna","popupFullScreen":"Celozaslonska slika (IE)","popupLeft":"Lega levo","popupLocationBar":"Naslovna vrstica","popupMenuBar":"Menijska vrstica","popupResizable":"Spremenljive velikosti","popupScrollBars":"Drsniki","popupStatusBar":"Vrstica stanja","popupToolbar":"Orodna vrstica","popupTop":"Lega na vrhu","rel":"Odnos","selectAnchor":"Izberi zaznamek","styles":"Slog","tabIndex":"Številka tabulatorja","target":"Cilj","targetFrame":"<okvir>","targetFrameName":"Ime ciljnega okvirja","targetPopup":"<pojavno okno>","targetPopupName":"Ime pojavnega okna","title":"Povezava","toAnchor":"Zaznamek na tej strani","toEmail":"Elektronski naslov","toUrl":"URL","toolbar":"Vstavi/uredi povezavo","type":"Vrsta povezave","unlink":"Odstrani povezavo","upload":"Prenesi"},"list":{"bulletedlist":"Označen seznam","numberedlist":"Oštevilčen seznam"},"magicline":{"title":"Vstavite odstavek tukaj"},"maximize":{"maximize":"Maksimiraj","minimize":"Minimiraj"},"pastetext":{"button":"Prilepi kot golo besedilo","title":"Prilepi kot golo besedilo"},"pastefromword":{"confirmCleanup":"Besedilo, ki ga želite prilepiti je kopirano iz Word-a. Ali ga želite očistiti, preden ga prilepite?","error":"Ni bilo mogoče očistiti prilepljenih podatkov zaradi notranje napake","title":"Prilepi iz Worda","toolbar":"Prilepi iz Worda"},"removeformat":{"toolbar":"Odstrani oblikovanje"},"sourcearea":{"toolbar":"Izvorna koda"},"specialchar":{"options":"Možnosti Posebnega Znaka","title":"Izberi Posebni Znak","toolbar":"Vstavi posebni znak"},"scayt":{"about":"O storitvi SCAYT","aboutTab":"O storitvi","addWord":"Dodaj besedo","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Slovarji","disable":"Onemogoči SCAYT","emptyDic":"Ime slovarja ne more biti prazno.","enable":"Omogoči SCAYT","ignore":"Prezri","ignoreAll":"Prezri vse","ignoreDomainNames":"Ignore Domain Names","langs":"Jeziki","languagesTab":"Jeziki","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"Več predlogov","opera_title":"Not supported by Opera","options":"Možnosti","optionsTab":"Možnosti","title":"Črkovanje med tipkanjem","toggle":"Preklopi SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Slog","panelTitle":"Oblikovalni Stili","panelTitle1":"Slogi odstavkov","panelTitle2":"Slogi besedila","panelTitle3":"Slogi objektov"},"table":{"border":"Velikost obrobe","caption":"Naslov","cell":{"menu":"Celica","insertBefore":"Vstavi celico pred","insertAfter":"Vstavi celico za","deleteCell":"Izbriši celice","merge":"Združi celice","mergeRight":"Združi desno","mergeDown":"Druži navzdol","splitHorizontal":"Razdeli celico vodoravno","splitVertical":"Razdeli celico navpično","title":"Lastnosti celice","cellType":"Vrsta celice","rowSpan":"Razpon vrstic","colSpan":"Razpon stolpcev","wordWrap":"Prelom besedila","hAlign":"Vodoravna poravnava","vAlign":"Navpična poravnava","alignBaseline":"Osnovnica","bgColor":"Barva ozadja","borderColor":"Barva obrobe","data":"Podatki","header":"Glava","yes":"Da","no":"Ne","invalidWidth":"Širina celice mora biti število.","invalidHeight":"Višina celice mora biti število.","invalidRowSpan":"Razpon vrstic mora biti celo število.","invalidColSpan":"Razpon stolpcev mora biti celo število.","chooseColor":"Izberi"},"cellPad":"Polnilo med celicami","cellSpace":"Razmik med celicami","column":{"menu":"Stolpec","insertBefore":"Vstavi stolpec pred","insertAfter":"Vstavi stolpec za","deleteColumn":"Izbriši stolpce"},"columns":"Stolpci","deleteTable":"Izbriši tabelo","headers":"Glave","headersBoth":"Oboje","headersColumn":"Prvi stolpec","headersNone":"Brez","headersRow":"Prva vrstica","invalidBorder":"Širina obrobe mora biti število.","invalidCellPadding":"Zamik celic mora biti število","invalidCellSpacing":"Razmik med celicami mora biti število.","invalidCols":"Število stolpcev mora biti večje od 0.","invalidHeight":"Višina tabele mora biti število.","invalidRows":"Število vrstic mora biti večje od 0.","invalidWidth":"Širina tabele mora biti število.","menu":"Lastnosti tabele","row":{"menu":"Vrstica","insertBefore":"Vstavi vrstico pred","insertAfter":"Vstavi vrstico za","deleteRow":"Izbriši vrstice"},"rows":"Vrstice","summary":"Povzetek","title":"Lastnosti tabele","toolbar":"Tabela","widthPc":"procentov","widthPx":"pik","widthUnit":"enota širine"},"undo":{"redo":"Ponovi","undo":"Razveljavi"},"wsc":{"btnIgnore":"Prezri","btnIgnoreAll":"Prezri vse","btnReplace":"Zamenjaj","btnReplaceAll":"Zamenjaj vse","btnUndo":"Razveljavi","changeTo":"Spremeni v","errorLoading":"Napaka pri nalaganju storitve programa na naslovu %s.","ieSpellDownload":"Črkovalnik ni nameščen. Ali ga želite prenesti sedaj?","manyChanges":"Črkovanje je končano: Spremenjenih je bilo %1 besed","noChanges":"Črkovanje je končano: Nobena beseda ni bila spremenjena","noMispell":"Črkovanje je končano: Brez napak","noSuggestions":"- Ni predlogov -","notAvailable":"Oprostite, storitev trenutno ni dosegljiva.","notInDic":"Ni v slovarju","oneChange":"Črkovanje je končano: Spremenjena je bila ena beseda","progress":"Preverjanje črkovanja se izvaja...","title":"Črkovalnik","toolbar":"Preveri črkovanje"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/sq.js b/theme/bootstrap/plugins/ckeditor/lang/sq.js new file mode 100644 index 0000000..3ceabd2 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/sq.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['sq']={"editor":"Redaktues i Pasur Teksti","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Shtyp ALT 0 për ndihmë","browseServer":"Shfleto në Server","url":"URL","protocol":"Protokolli","upload":"Ngarko","uploadSubmit":"Dërgo në server","image":"Imazh","flash":"Objekt flash","form":"Formular","checkbox":"Checkbox","radio":"Buton radio","textField":"Fushë tekst","textarea":"Hapësirë tekst","hiddenField":"Fushë e fshehur","button":"Buton","select":"Menu zgjedhjeje","imageButton":"Buton imazhi","notSet":"<e pazgjedhur>","id":"Id","name":"Emër","langDir":"Kod gjuhe","langDirLtr":"Nga e majta në të djathtë (LTR)","langDirRtl":"Nga e djathta në të majtë (RTL)","langCode":"Kod gjuhe","longDescr":"Përshkrim i hollësishëm","cssClass":"Klasa stili CSS","advisoryTitle":"Titull","cssStyle":"Stil","ok":"OK","cancel":"Anulo","close":"Mbyll","preview":"Parashiko","resize":"Ripërmaso","generalTab":"Të përgjithshme","advancedTab":"Të përparuara","validateNumberFailed":"Vlera e futur nuk është një numër","confirmNewPage":"Çdo ndryshim që nuk është ruajtur do humbasë. Je i sigurtë që dëshiron të krijosh një faqe të re?","confirmCancel":"Disa opsione kanë ndryshuar. Je i sigurtë që dëshiron ta mbyllësh dritaren?","options":"Opsione","target":"Objektivi","targetNew":"Dritare e re (_blank)","targetTop":"Dritare në plan të parë (_top)","targetSelf":"E njëjta dritare (_self)","targetParent":"Dritarja prind (_parent)","langDirLTR":"Nga e majta në të djathë (LTR)","langDirRTL":"Nga e djathta në të majtë (RTL)","styles":"Stil","cssClasses":"Klasa Stili CSS","width":"Gjerësi","height":"Lartësi","align":"Rreshtim","alignLeft":"Majtas","alignRight":"Djathtas","alignCenter":"Qendër","alignTop":"Lart","alignMiddle":"Në mes","alignBottom":"Poshtë","invalidValue":"Vlerë e pavlefshme","invalidHeight":"Lartësia duhet të jetë një numër","invalidWidth":"Gjerësia duhet të jetë një numër","invalidCssLength":"Vlera e fushës \"%1\" duhet të jetë një numër pozitiv me apo pa njësi matëse të vlefshme CSS (px, %, in, cm, mm, em, ex, pt ose pc).","invalidHtmlLength":"Vlera e fushës \"%1\" duhet të jetë një numër pozitiv me apo pa njësi matëse të vlefshme HTML (px ose %)","invalidInlineStyle":"Stili inline duhet të jetë një apo disa vlera të formatit \"emër: vlerë\", ndarë nga pikëpresje.","cssLengthTooltip":"Fut një numër për vlerën në pixel apo një numër me një njësi të vlefshme CSS (px, %, in, cm, mm, ex, pt, ose pc).","unavailable":"%1<span class=\"cke_accessibility\">, i padisponueshëm</span>"},"about":{"copy":"Të drejtat e kopjimit &copy; $1. Të gjitha të drejtat e rezervuara.","dlgTitle":"Rreth CKEditor","help":"Kontrollo $1 për ndihmë.","moreInfo":"Për informacione rreth licencave shih faqen tonë:","title":"Rreth CKEditor","userGuide":"Udhëzuesi i Shfrytëzuesit të CKEditor"},"basicstyles":{"bold":"Trash","italic":"Pjerrët","strike":"Nëpërmes","subscript":"Nën-skriptë","superscript":"Super-skriptë","underline":"Nënvijëzuar"},"blockquote":{"toolbar":"Citatet"},"clipboard":{"copy":"Kopjo","copyError":"Të dhënat e sigurisë së shfletuesit tuaj nuk lejojnë që redaktuesi automatikisht të kryej veprimin e kopjimit. Ju lutemi shfrytëzoni tastierën për këtë veprim (Ctrl/Cmd+C).","cut":"Preje","cutError":"Të dhënat e sigurisë së shfletuesit tuaj nuk lejojnë që redaktuesi automatikisht të kryej veprimin e prerjes. Ju lutemi shfrytëzoni tastierën për këtë veprim (Ctrl/Cmd+X).","paste":"Hidhe","pasteArea":"Hapësira Hedhëse","pasteMsg":"Ju lutemi hidhni brenda kutizës në vijim duke shfrytëzuar tastierën (<strong>Ctrl/Cmd+V</strong>) dhe shtypni Mirë.","securityMsg":"Për shkak të dhënave të sigurisë së shfletuesit tuaj, redaktuesi nuk është në gjendje të i qaset drejtpërdrejtë të dhanve të tabelës suaj të punës. Ju duhet të hidhni atë përsëri në këtë dritare.","title":"Hidhe"},"contextmenu":{"options":"Mundësitë e Menysë së Kontekstit"},"toolbar":{"toolbarCollapse":"Zvogëlo Shiritin","toolbarExpand":"Zgjero Shiritin","toolbarGroups":{"document":"Dokument","clipboard":"Tabela Punës/Ribëje","editing":"Duke Redaktuar","forms":"Formular","basicstyles":"Stili Bazë","paragraph":"Paragraf","links":"Nyjet","insert":"Shto","styles":"Stil","colors":"Ngjyrat","tools":"Mjetet"},"toolbars":"Shiritet e Redaktuesit"},"elementspath":{"eleLabel":"Rruga e elementeve","eleTitle":"%1 element"},"format":{"label":"Formati","panelTitle":"Formati i Paragrafit","tag_address":"Adresa","tag_div":"Normal (DIV)","tag_h1":"Titulli 1","tag_h2":"Titulli 2","tag_h3":"Titulli 3","tag_h4":"Titulli 4","tag_h5":"Titulli 5","tag_h6":"Titulli 6","tag_p":"Normal","tag_pre":"Formatuar"},"horizontalrule":{"toolbar":"Vendos Vijë Horizontale"},"image":{"alertUrl":"Ju lutemi shkruani URL-në e fotos","alt":"Tekst Alternativ","border":"Korniza","btnUpload":"Dërgo në server","button2Img":"Dëshironi të e ndërroni pullën e fotos së selektuar në një foto të thjeshtë?","hSpace":"HSpace","img2Button":"Dëshironi të ndryshoni foton e përzgjedhur në pullë?","infoTab":"Informacione mbi Fotografinë","linkTab":"Nyja","lockRatio":"Mbyll Racionin","menu":"Karakteristikat e Fotografisë","resetSize":"Rikthe Madhësinë","title":"Karakteristikat e Fotografisë","titleButton":"Karakteristikat e Pullës së Fotografisë","upload":"Ngarko","urlMissing":"Mungon URL e burimit të fotografisë.","vSpace":"Hapësira Vertikale","validateBorder":"Korniza duhet të jetë numër i plotë.","validateHSpace":"Hapësira horizontale duhet të jetë numër i plotë.","validateVSpace":"Hapësira vertikale duhet të jetë numër i plotë."},"indent":{"indent":"Rrite Identin","outdent":"Zvogëlo Identin"},"fakeobjects":{"anchor":"Spirancë","flash":"Objekt flash","hiddenfield":"Fushë e fshehur","iframe":"IFrame","unknown":"Objekt i Panjohur"},"link":{"acccessKey":"Sipas ID-së së Elementit","advanced":"Të përparuara","advisoryContentType":"Lloji i Përmbajtjes Këshillimore","advisoryTitle":"Titull","anchor":{"toolbar":"Spirancë","menu":"Redakto Spirancën","title":"Anchor Properties","name":"Emri i Spirancës","errorName":"Ju lutemi shkruani emrin e spirancës","remove":"Largo Spirancën"},"anchorId":"Sipas ID-së së Elementit","anchorName":"Sipas Emrit të Spirancës","charset":"Seti i Karaktereve të Burimeve të Nëdlidhura","cssClasses":"Klasa stili CSS","emailAddress":"Posta Elektronike","emailBody":"Trupi i Porosisë","emailSubject":"Titulli i Porosisë","id":"Id","info":"Informacione të Nyjes","langCode":"Kod gjuhe","langDir":"Drejtim teksti","langDirLTR":"Nga e majta në të djathë (LTR)","langDirRTL":"Nga e djathta në të majtë (RTL)","menu":"Redakto Nyjen","name":"Emër","noAnchors":"(Nuk ka asnjë spirancë në dokument)","noEmail":"Ju lutemi shkruani postën elektronike","noUrl":"Ju lutemi shkruani URL-në e nyjes","other":"<tjetër>","popupDependent":"E Varur (Netscape)","popupFeatures":"Karakteristikat e Dritares së Dialogut","popupFullScreen":"Ekran i Plotë (IE)","popupLeft":"Pozita Majtas","popupLocationBar":"Shiriti i Lokacionit","popupMenuBar":"Shiriti i Menysë","popupResizable":"I ndryshueshëm","popupScrollBars":"Scroll Bars","popupStatusBar":"Shiriti i Statutit","popupToolbar":"Shiriti i Mejteve","popupTop":"Top Pozita","rel":"Marrëdhëniet","selectAnchor":"Përzgjidh një Spirancë","styles":"Stil","tabIndex":"Tab Index","target":"Objektivi","targetFrame":"<frame>","targetFrameName":"Emri i Kornizës së Synuar","targetPopup":"<popup window>","targetPopupName":"Emri i Dritares së Dialogut","title":"Nyja","toAnchor":"Lidhu me spirancën në tekst","toEmail":"Posta Elektronike","toUrl":"URL","toolbar":"Nyja","type":"Lloji i Nyjes","unlink":"Largo Nyjen","upload":"Ngarko"},"list":{"bulletedlist":"Vendos/Largo Listën me Pika","numberedlist":"Vendos/Largo Listën me Numra"},"magicline":{"title":"Vendos paragraf këtu"},"maximize":{"maximize":"Zmadho","minimize":"Zvogëlo"},"pastetext":{"button":"Hidhe si tekst të thjeshtë","title":"Hidhe si Tekst të Thjeshtë"},"pastefromword":{"confirmCleanup":"Teksti që dëshironi të e hidhni siç duket është kopjuar nga Word-i. Dëshironi të e pastroni para se të e hidhni?","error":"Nuk ishte e mundur të fshiheshin të dhënat e hedhura për shkak të një gabimi të brendshëm","title":"Hidhe nga Word-i","toolbar":"Hidhe nga Word-i"},"removeformat":{"toolbar":"Largo Formatin"},"sourcearea":{"toolbar":"Burimi"},"specialchar":{"options":"Mundësitë për Karaktere Speciale","title":"Përzgjidh Karakter Special","toolbar":"Vendos Karakter Special"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Stilet e Formatimit","panelTitle1":"Stilet e Bllokut","panelTitle2":"Stili i Brendshëm","panelTitle3":"Stilet e Objektit"},"table":{"border":"Madhësia e kornizave","caption":"Titull","cell":{"menu":"Qeli","insertBefore":"Shto Qeli Para","insertAfter":"Shto Qeli Prapa","deleteCell":"Gris Qelitë","merge":"Bashko Qelitë","mergeRight":"Bashko Djathtas","mergeDown":"Bashko Poshtë","splitHorizontal":"Ndaj Qelinë Horizontalisht","splitVertical":"Ndaj Qelinë Vertikalisht","title":"Rekuizitat e Qelisë","cellType":"Lloji i Qelisë","rowSpan":"Bashko Rreshtat","colSpan":"Bashko Kolonat","wordWrap":"Fund i Fjalës","hAlign":"Bashkimi Horizontal","vAlign":"Bashkimi Vertikal","alignBaseline":"Baza","bgColor":"Ngjyra e Prapavijës","borderColor":"Ngjyra e Kornizave","data":"Të dhënat","header":"Koka","yes":"Po","no":"Jo","invalidWidth":"Gjerësia e qelisë duhet të jetë numër.","invalidHeight":"Lartësia e qelisë duhet të jetë numër.","invalidRowSpan":"Hapësira e rreshtave duhet të jetë numër i plotë.","invalidColSpan":"Hapësira e kolonave duhet të jetë numër i plotë.","chooseColor":"Përzgjidh"},"cellPad":"Mbushja e qelisë","cellSpace":"Hapësira e qelisë","column":{"menu":"Kolona","insertBefore":"Vendos Kolonë Para","insertAfter":"Vendos Kolonë Pas","deleteColumn":"Gris Kolonat"},"columns":"Kolonat","deleteTable":"Gris Tabelën","headers":"Kokat","headersBoth":"Së bashku","headersColumn":"Kolona e parë","headersNone":"Asnjë","headersRow":"Rreshti i Parë","invalidBorder":"Madhësia e kufinjve duhet të jetë numër.","invalidCellPadding":"Mbushja e qelisë duhet të jetë numër pozitiv.","invalidCellSpacing":"Hapësira e qelisë duhet të jetë numër pozitiv.","invalidCols":"Numri i kolonave duhet të jetë numër më i madh se 0.","invalidHeight":"Lartësia e tabelës duhet të jetë numër.","invalidRows":"Numri i rreshtave duhet të jetë numër më i madh se 0.","invalidWidth":"Gjerësia e tabelës duhet të jetë numër.","menu":"Karakteristikat e Tabelës","row":{"menu":"Rreshti","insertBefore":"Shto Rresht Para","insertAfter":"Shto Rresht Prapa","deleteRow":"Gris Rreshtat"},"rows":"Rreshtat","summary":"Përmbledhje","title":"Karakteristikat e Tabelës","toolbar":"Tabela","widthPc":"përqind","widthPx":"piksell","widthUnit":"njësia e gjerësisë"},"undo":{"redo":"Ribëje","undo":"Rizhbëje"},"wsc":{"btnIgnore":"Ignore","btnIgnoreAll":"Ignore All","btnReplace":"Replace","btnReplaceAll":"Replace All","btnUndo":"Undo","changeTo":"Change to","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Spell checker not installed. Do you want to download it now?","manyChanges":"Spell check complete: %1 words changed","noChanges":"Spell check complete: No words changed","noMispell":"Spell check complete: No misspellings found","noSuggestions":"- No suggestions -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Not in dictionary","oneChange":"Spell check complete: One word changed","progress":"Spell check in progress...","title":"Spell Check","toolbar":"Check Spelling"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/sr-latn.js b/theme/bootstrap/plugins/ckeditor/lang/sr-latn.js new file mode 100644 index 0000000..d2fdb75 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/sr-latn.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['sr-latn']={"editor":"Bogati uređivač teksta","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Pretraži server","url":"URL","protocol":"Protokol","upload":"Pošalji","uploadSubmit":"Pošalji na server","image":"Slika","flash":"Fleš","form":"Forma","checkbox":"Polje za potvrdu","radio":"Radio-dugme","textField":"Tekstualno polje","textarea":"Zona teksta","hiddenField":"Skriveno polje","button":"Dugme","select":"Izborno polje","imageButton":"Dugme sa slikom","notSet":"<nije postavljeno>","id":"Id","name":"Naziv","langDir":"Smer jezika","langDirLtr":"S leva na desno (LTR)","langDirRtl":"S desna na levo (RTL)","langCode":"Kôd jezika","longDescr":"Pun opis URL","cssClass":"Stylesheet klase","advisoryTitle":"Advisory naslov","cssStyle":"Stil","ok":"OK","cancel":"Otkaži","close":"Zatvori","preview":"Izgled stranice","resize":"Resize","generalTab":"Opšte","advancedTab":"Napredni tagovi","validateNumberFailed":"Ova vrednost nije broj.","confirmNewPage":"Nesačuvane promene ovog sadržaja će biti izgubljene. Jeste li sigurni da želita da učitate novu stranu?","confirmCancel":"You have changed some options. Are you sure you want to close the dialog window?","options":"Opcije","target":"Meta","targetNew":"Novi prozor (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Isti prozor (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"S leva na desno (LTR)","langDirRTL":"S desna na levo (RTL)","styles":"Stil","cssClasses":"Stylesheet klase","width":"Širina","height":"Visina","align":"Ravnanje","alignLeft":"Levo","alignRight":"Desno","alignCenter":"Sredina","alignTop":"Vrh","alignMiddle":"Sredina","alignBottom":"Dole","invalidValue":"Invalid value.","invalidHeight":"Visina mora biti broj.","invalidWidth":"Širina mora biti broj.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Podebljano","italic":"Kurziv","strike":"Precrtano","subscript":"Indeks","superscript":"Stepen","underline":"Podvučeno"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Kopiraj","copyError":"Sigurnosna podešavanja Vašeg pretraživača ne dozvoljavaju operacije automatskog kopiranja teksta. Molimo Vas da koristite prečicu sa tastature (Ctrl/Cmd+C).","cut":"Iseci","cutError":"Sigurnosna podešavanja Vašeg pretraživača ne dozvoljavaju operacije automatskog isecanja teksta. Molimo Vas da koristite prečicu sa tastature (Ctrl/Cmd+X).","paste":"Zalepi","pasteArea":"Prostor za lepljenje","pasteMsg":"Molimo Vas da zalepite unutar donje povrine koristeći tastaturnu prečicu (<STRONG>Ctrl/Cmd+V</STRONG>) i da pritisnete <STRONG>OK</STRONG>.","securityMsg":"Zbog sigurnosnih postavki vašeg pregledača, editor nije u mogućnosti da direktno pristupi podacima u klipbordu. Potrebno je da zalepite još jednom u ovom prozoru.","title":"Zalepi"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Suzi alatnu traku","toolbarExpand":"Proširi alatnu traku","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Alatne trake"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"Format","panelTitle":"Format","tag_address":"Adresa","tag_div":"Normalno (DIV)","tag_h1":"Naslov 1","tag_h2":"Naslov 2","tag_h3":"Naslov 3","tag_h4":"Naslov 4","tag_h5":"Naslov 5","tag_h6":"Naslov 6","tag_p":"Normal","tag_pre":"Formatirano"},"horizontalrule":{"toolbar":"Unesi horizontalnu liniju"},"image":{"alertUrl":"Unesite URL slike","alt":"Alternativni tekst","border":"Okvir","btnUpload":"Pošalji na server","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"HSpace","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"Info slike","linkTab":"Link","lockRatio":"Zaključaj odnos","menu":"Osobine slika","resetSize":"Resetuj veličinu","title":"Osobine slika","titleButton":"Osobine dugmeta sa slikom","upload":"Pošalji","urlMissing":"Image source URL is missing.","vSpace":"VSpace","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"Uvećaj levu marginu","outdent":"Smanji levu marginu"},"fakeobjects":{"anchor":"Unesi/izmeni sidro","flash":"Flash Animation","hiddenfield":"Skriveno polje","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Pristupni taster","advanced":"Napredni tagovi","advisoryContentType":"Advisory vrsta sadržaja","advisoryTitle":"Advisory naslov","anchor":{"toolbar":"Unesi/izmeni sidro","menu":"Osobine sidra","title":"Osobine sidra","name":"Naziv sidra","errorName":"Unesite naziv sidra","remove":"Ukloni sidro"},"anchorId":"Po Id-u elementa","anchorName":"Po nazivu sidra","charset":"Linked Resource Charset","cssClasses":"Stylesheet klase","emailAddress":"E-Mail adresa","emailBody":"Sadržaj poruke","emailSubject":"Naslov","id":"Id","info":"Link Info","langCode":"Smer jezika","langDir":"Smer jezika","langDirLTR":"S leva na desno (LTR)","langDirRTL":"S desna na levo (RTL)","menu":"Izmeni link","name":"Naziv","noAnchors":"(Nema dostupnih sidra)","noEmail":"Otkucajte adresu elektronske pote","noUrl":"Unesite URL linka","other":"<остало>","popupDependent":"Zavisno (Netscape)","popupFeatures":"Mogućnosti popup prozora","popupFullScreen":"Prikaz preko celog ekrana (IE)","popupLeft":"Od leve ivice ekrana (px)","popupLocationBar":"Lokacija","popupMenuBar":"Kontekstni meni","popupResizable":"Promenljive veličine","popupScrollBars":"Scroll bar","popupStatusBar":"Statusna linija","popupToolbar":"Toolbar","popupTop":"Od vrha ekrana (px)","rel":"Odnos","selectAnchor":"Odaberi sidro","styles":"Stil","tabIndex":"Tab indeks","target":"Meta","targetFrame":"<okvir>","targetFrameName":"Naziv odredišnog frejma","targetPopup":"<popup prozor>","targetPopupName":"Naziv popup prozora","title":"Link","toAnchor":"Sidro na ovoj stranici","toEmail":"E-Mail","toUrl":"URL","toolbar":"Unesi/izmeni link","type":"Vrsta linka","unlink":"Ukloni link","upload":"Pošalji"},"list":{"bulletedlist":"Nenabrojiva lista","numberedlist":"Nabrojiva lista"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Zalepi kao čist tekst","title":"Zalepi kao čist tekst"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Zalepi iz Worda","toolbar":"Zalepi iz Worda"},"removeformat":{"toolbar":"Ukloni formatiranje"},"sourcearea":{"toolbar":"Kôd"},"specialchar":{"options":"Special Character Options","title":"Odaberite specijalni karakter","toolbar":"Unesi specijalni karakter"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Stil","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Veličina okvira","caption":"Naslov tabele","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Obriši ćelije","merge":"Spoj celije","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Razmak ćelija","cellSpace":"Ćelijski prostor","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Obriši kolone"},"columns":"Kolona","deleteTable":"Izbriši tabelu","headers":"Zaglavlja","headersBoth":"Oba","headersColumn":"Prva kolona","headersNone":"None","headersRow":"Prvi red","invalidBorder":"Veličina okvira mora biti broj.","invalidCellPadding":"Padding polja mora biti pozitivan broj.","invalidCellSpacing":"Razmak između ćelija mora biti pozitivan broj.","invalidCols":"Broj kolona mora biti broj veći od 0.","invalidHeight":"Visina tabele mora biti broj.","invalidRows":"Broj redova mora biti veći od 0.","invalidWidth":"Širina tabele mora biti broj.","menu":"Osobine tabele","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Obriši redove"},"rows":"Redova","summary":"Sažetak","title":"Osobine tabele","toolbar":"Tabela","widthPc":"procenata","widthPx":"piksela","widthUnit":"jedinica za širinu"},"undo":{"redo":"Ponovi akciju","undo":"Poni�ti akciju"},"wsc":{"btnIgnore":"Ignoriši","btnIgnoreAll":"Ignoriši sve","btnReplace":"Zameni","btnReplaceAll":"Zameni sve","btnUndo":"Vrati akciju","changeTo":"Izmeni","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Provera spelovanja nije instalirana. Da li želite da je skinete sa Interneta?","manyChanges":"Provera spelovanja završena: %1 reč(i) je izmenjeno","noChanges":"Provera spelovanja završena: Nije izmenjena nijedna rec","noMispell":"Provera spelovanja završena: greške nisu pronadene","noSuggestions":"- Bez sugestija -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Nije u rečniku","oneChange":"Provera spelovanja završena: Izmenjena je jedna reč","progress":"Provera spelovanja u toku...","title":"Spell Check","toolbar":"Proveri spelovanje"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/sr.js b/theme/bootstrap/plugins/ckeditor/lang/sr.js new file mode 100644 index 0000000..7f3693e --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/sr.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['sr']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Press ALT 0 for help","browseServer":"Претражи сервер","url":"УРЛ","protocol":"Протокол","upload":"Пошаљи","uploadSubmit":"Пошаљи на сервер","image":"Слика","flash":"Флеш елемент","form":"Форма","checkbox":"Поље за потврду","radio":"Радио-дугме","textField":"Текстуално поље","textarea":"Зона текста","hiddenField":"Скривено поље","button":"Дугме","select":"Изборно поље","imageButton":"Дугме са сликом","notSet":"<није постављено>","id":"Ид","name":"Назив","langDir":"Смер језика","langDirLtr":"С лева на десно (LTR)","langDirRtl":"С десна на лево (RTL)","langCode":"Kôд језика","longDescr":"Пун опис УРЛ","cssClass":"Stylesheet класе","advisoryTitle":"Advisory наслов","cssStyle":"Стил","ok":"OK","cancel":"Oткажи","close":"Затвори","preview":"Изглед странице","resize":"Resize","generalTab":"Опште","advancedTab":"Напредни тагови","validateNumberFailed":"Ова вредност није цигра.","confirmNewPage":"Any unsaved changes to this content will be lost. Are you sure you want to load new page?","confirmCancel":"You have changed some options. Are you sure you want to close the dialog window?","options":"Опције","target":"Meтa","targetNew":"New Window (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"Same Window (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"С лева на десно (LTR)","langDirRTL":"С десна на лево (RTL)","styles":"Стил","cssClasses":"Stylesheet класе","width":"Ширина","height":"Висина","align":"Равнање","alignLeft":"Лево","alignRight":"Десно","alignCenter":"Средина","alignTop":"Врх","alignMiddle":"Средина","alignBottom":"Доле","invalidValue":"Invalid value.","invalidHeight":"Height must be a number.","invalidWidth":"Width must be a number.","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Подебљано","italic":"Курзив","strike":"Прецртано","subscript":"Индекс","superscript":"Степен","underline":"Подвучено"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"Копирај","copyError":"Сигурносна подешавања Вашег претраживача не дозвољавају операције аутоматског копирања текста. Молимо Вас да користите пречицу са тастатуре (Ctrl/Cmd+C).","cut":"Исеци","cutError":"Сигурносна подешавања Вашег претраживача не дозвољавају операције аутоматског исецања текста. Молимо Вас да користите пречицу са тастатуре (Ctrl/Cmd+X).","paste":"Залепи","pasteArea":"Залепи зону","pasteMsg":"Молимо Вас да залепите унутар доње површине користећи тастатурну пречицу (<STRONG>Ctrl/Cmd+V</STRONG>) и да притиснете <STRONG>OK</STRONG>.","securityMsg":"Због сигурносних подешавања претраживача, едитор не може да приступи оставу. Требате да га поново залепите у овом прозору.","title":"Залепи"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Склопи алатну траку","toolbarExpand":"Прошири алатну траку","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Едитор алатне траке"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"Формат","panelTitle":"Формат","tag_address":"Adresa","tag_div":"Нормално (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatirano"},"horizontalrule":{"toolbar":"Унеси хоризонталну линију"},"image":{"alertUrl":"Унесите УРЛ слике","alt":"Алтернативни текст","border":"Оквир","btnUpload":"Пошаљи на сервер","button2Img":"Да ли желите да промените одабрану слику дугмета као једноставну слику?","hSpace":"HSpace","img2Button":"Да ли желите да промените одабрану слику у слику дугмета?","infoTab":"Инфо слике","linkTab":"Линк","lockRatio":"Закључај однос","menu":"Особине слика","resetSize":"Ресетуј величину","title":"Особине слика","titleButton":"Особине дугмета са сликом","upload":"Пошаљи","urlMissing":"Недостаје УРЛ слике.","vSpace":"VSpace","validateBorder":"Ивица треба да буде цифра.","validateHSpace":"HSpace треба да буде цифра.","validateVSpace":"VSpace треба да буде цифра."},"indent":{"indent":"Увећај леву маргину","outdent":"Смањи леву маргину"},"fakeobjects":{"anchor":"Anchor","flash":"Flash Animation","hiddenfield":"Hidden Field","iframe":"IFrame","unknown":"Unknown Object"},"link":{"acccessKey":"Приступни тастер","advanced":"Напредни тагови","advisoryContentType":"Advisory врста садржаја","advisoryTitle":"Advisory наслов","anchor":{"toolbar":"Унеси/измени сидро","menu":"Особине сидра","title":"Особине сидра","name":"Име сидра","errorName":"Молимо Вас да унесете име сидра","remove":"Remove Anchor"},"anchorId":"Пo Ид-jу елемента","anchorName":"По називу сидра","charset":"Linked Resource Charset","cssClasses":"Stylesheet класе","emailAddress":"Адреса електронске поште","emailBody":"Садржај поруке","emailSubject":"Наслов","id":"Ид","info":"Линк инфо","langCode":"Смер језика","langDir":"Смер језика","langDirLTR":"С лева на десно (LTR)","langDirRTL":"С десна на лево (RTL)","menu":"Промени линк","name":"Назив","noAnchors":"(Нема доступних сидра)","noEmail":"Откуцајте адресу електронске поште","noUrl":"Унесите УРЛ линка","other":"<друго>","popupDependent":"Зависно (Netscape)","popupFeatures":"Могућности искачућег прозора","popupFullScreen":"Приказ преко целог екрана (ИE)","popupLeft":"Од леве ивице екрана (пиксела)","popupLocationBar":"Локација","popupMenuBar":"Контекстни мени","popupResizable":"Величина се мења","popupScrollBars":"Скрол бар","popupStatusBar":"Статусна линија","popupToolbar":"Toolbar","popupTop":"Од врха екрана (пиксела)","rel":"Однос","selectAnchor":"Одабери сидро","styles":"Стил","tabIndex":"Таб индекс","target":"Meтa","targetFrame":"<оквир>","targetFrameName":"Назив одредишног фрејма","targetPopup":"<искачући прозор>","targetPopupName":"Назив искачућег прозора","title":"Линк","toAnchor":"Сидро на овој страници","toEmail":"Eлектронска пошта","toUrl":"УРЛ","toolbar":"Унеси/измени линк","type":"Врста линка","unlink":"Уклони линк","upload":"Пошаљи"},"list":{"bulletedlist":"Ненабројива листа","numberedlist":"Набројиву листу"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"Maximize","minimize":"Minimize"},"pastetext":{"button":"Залепи као чист текст","title":"Залепи као чист текст"},"pastefromword":{"confirmCleanup":"The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?","error":"It was not possible to clean up the pasted data due to an internal error","title":"Залепи из Worda","toolbar":"Залепи из Worda"},"removeformat":{"toolbar":"Уклони форматирање"},"sourcearea":{"toolbar":"Kôд"},"specialchar":{"options":"Опције специјалног карактера","title":"Одаберите специјални карактер","toolbar":"Унеси специјални карактер"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Стил","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"Величина оквира","caption":"Наслов табеле","cell":{"menu":"Cell","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"Обриши ћелије","merge":"Спој ћелије","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"Размак ћелија","cellSpace":"Ћелијски простор","column":{"menu":"Column","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Обриши колоне"},"columns":"Kолона","deleteTable":"Обриши таблу","headers":"Поглавља","headersBoth":"Оба","headersColumn":"Прва колона","headersNone":"None","headersRow":"Први ред","invalidBorder":"Величина ивице треба да буде цифра.","invalidCellPadding":"Пуњење ћелије треба да буде позитивна цифра.","invalidCellSpacing":"Размак ћелије треба да буде позитивна цифра.","invalidCols":"Број колона треба да буде цифра већа од 0.","invalidHeight":"Висина табеле треба да буде цифра.","invalidRows":"Број реда треба да буде цифра већа од 0.","invalidWidth":"Ширина табеле треба да буде цифра.","menu":"Особине табеле","row":{"menu":"Row","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Обриши редове"},"rows":"Редова","summary":"Резиме","title":"Особине табеле","toolbar":"Табела","widthPc":"процената","widthPx":"пиксела","widthUnit":"јединица ширине"},"undo":{"redo":"Понови акцију","undo":"Поништи акцију"},"wsc":{"btnIgnore":"Игнориши","btnIgnoreAll":"Игнориши све","btnReplace":"Замени","btnReplaceAll":"Замени све","btnUndo":"Врати акцију","changeTo":"Измени","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"Провера спеловања није инсталирана. Да ли желите да је скинете са Интернета?","manyChanges":"Провера спеловања завршена: %1 реч(и) је измењено","noChanges":"Провера спеловања завршена: Није измењена ниједна реч","noMispell":"Провера спеловања завршена: грешке нису пронађене","noSuggestions":"- Без сугестија -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"Није у речнику","oneChange":"Провера спеловања завршена: Измењена је једна реч","progress":"Провера спеловања у току...","title":"Spell Check","toolbar":"Провери спеловање"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/sv.js b/theme/bootstrap/plugins/ckeditor/lang/sv.js new file mode 100644 index 0000000..6506a92 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/sv.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['sv']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Tryck ALT 0 för hjälp","browseServer":"Bläddra på server","url":"URL","protocol":"Protokoll","upload":"Ladda upp","uploadSubmit":"Skicka till server","image":"Bild","flash":"Flash","form":"Formulär","checkbox":"Kryssruta","radio":"Alternativknapp","textField":"Textfält","textarea":"Textruta","hiddenField":"Dolt fält","button":"Knapp","select":"Flervalslista","imageButton":"Bildknapp","notSet":"<ej angivet>","id":"Id","name":"Namn","langDir":"Språkriktning","langDirLtr":"Vänster till Höger (VTH)","langDirRtl":"Höger till Vänster (HTV)","langCode":"Språkkod","longDescr":"URL-beskrivning","cssClass":"Stilmall","advisoryTitle":"Titel","cssStyle":"Stilmall","ok":"OK","cancel":"Avbryt","close":"Stäng","preview":"Förhandsgranska","resize":"Dra för att ändra storlek","generalTab":"Allmänt","advancedTab":"Avancerad","validateNumberFailed":"Värdet är inte ett nummer.","confirmNewPage":"Alla ändringar i innehållet kommer att förloras. Är du säker på att du vill ladda en ny sida?","confirmCancel":"Några av alternativen har ändrats. Är du säker på att du vill stänga dialogrutan?","options":"Alternativ","target":"Mål","targetNew":"Nytt fönster (_blank)","targetTop":"Översta fönstret (_top)","targetSelf":"Samma fönster (_self)","targetParent":"Föregående fönster (_parent)","langDirLTR":"Vänster till höger (LTR)","langDirRTL":"Höger till vänster (RTL)","styles":"Stil","cssClasses":"Stilmallar","width":"Bredd","height":"Höjd","align":"Justering","alignLeft":"Vänster","alignRight":"Höger","alignCenter":"Centrerad","alignTop":"Överkant","alignMiddle":"Mitten","alignBottom":"Nederkant","invalidValue":"Felaktigt värde.","invalidHeight":"Höjd måste vara ett nummer.","invalidWidth":"Bredd måste vara ett nummer.","invalidCssLength":"Värdet för fältet \"%1\" måste vara ett positivt nummer med eller utan CSS-mätenheter (px, %, in, cm, mm, em, ex, pt, eller pc).","invalidHtmlLength":"Värdet för fältet \"%1\" måste vara ett positivt nummer med eller utan godkända HTML-mätenheter (px eller %).","invalidInlineStyle":"Det angivna värdet för style måste innehålla en eller flera tupler separerade med semikolon i följande format: \"name : value\"","cssLengthTooltip":"Ange ett nummer i pixlar eller ett nummer men godkänd CSS-mätenhet (px, %, in, cm, mm, em, ex, pt, eller pc).","unavailable":"%1<span class=\"cke_accessibility\">, Ej tillgänglig</span>"},"about":{"copy":"Copyright &copy; $1. Alla rättigheter reserverade.","dlgTitle":"Om CKEditor","help":"Se $1 för hjälp.","moreInfo":"För information av licensiering besök vår hemsida:","title":"Om CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"Fet","italic":"Kursiv","strike":"Genomstruken","subscript":"Nedsänkta tecken","superscript":"Upphöjda tecken","underline":"Understruken"},"blockquote":{"toolbar":"Blockcitat"},"clipboard":{"copy":"Kopiera","copyError":"Säkerhetsinställningar i Er webbläsare tillåter inte åtgärden kopiera. Använd (Ctrl/Cmd+C) istället.","cut":"Klipp ut","cutError":"Säkerhetsinställningar i Er webbläsare tillåter inte åtgärden klipp ut. Använd (Ctrl/Cmd+X) istället.","paste":"Klistra in","pasteArea":"Paste Area","pasteMsg":"Var god och klistra in Er text i rutan nedan genom att använda (<strong>Ctrl/Cmd+V</strong>) klicka sen på OK.","securityMsg":"På grund av din webbläsares säkerhetsinställningar kan verktyget inte få åtkomst till urklippsdatan. Var god och använd detta fönster istället.","title":"Klistra in"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"Dölj verktygsfält","toolbarExpand":"Visa verktygsfält","toolbarGroups":{"document":"Dokument","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"Redigera verktygsfält"},"elementspath":{"eleLabel":"Elementets sökväg","eleTitle":"%1 element"},"format":{"label":"Teckenformat","panelTitle":"Teckenformat","tag_address":"Adress","tag_div":"Normal (DIV)","tag_h1":"Rubrik 1","tag_h2":"Rubrik 2","tag_h3":"Rubrik 3","tag_h4":"Rubrik 4","tag_h5":"Rubrik 5","tag_h6":"Rubrik 6","tag_p":"Normal","tag_pre":"Formaterad"},"horizontalrule":{"toolbar":"Infoga horisontal linje"},"image":{"alertUrl":"Var god och ange bildens URL","alt":"Alternativ text","border":"Kant","btnUpload":"Skicka till server","button2Img":"Vill du omvandla den valda bildknappen på en enkel bild?","hSpace":"Horis. marginal","img2Button":"Vill du omvandla den valda bildknappen på en enkel bild?","infoTab":"Bildinformation","linkTab":"Länk","lockRatio":"Lås höjd/bredd förhållanden","menu":"Bildegenskaper","resetSize":"Återställ storlek","title":"Bildegenskaper","titleButton":"Egenskaper för bildknapp","upload":"Ladda upp","urlMissing":"Bildkällans URL saknas.","vSpace":"Vert. marginal","validateBorder":"Kantlinje måste vara ett heltal.","validateHSpace":"HSpace måste vara ett heltal.","validateVSpace":"VSpace måste vara ett heltal."},"indent":{"indent":"Öka indrag","outdent":"Minska indrag"},"fakeobjects":{"anchor":"Ankare","flash":"Flashanimation","hiddenfield":"Gömt fält","iframe":"iFrame","unknown":"Okänt objekt"},"link":{"acccessKey":"Behörighetsnyckel","advanced":"Avancerad","advisoryContentType":"Innehållstyp","advisoryTitle":"Titel","anchor":{"toolbar":"Infoga/Redigera ankarlänk","menu":"Egenskaper för ankarlänk","title":"Egenskaper för ankarlänk","name":"Ankarnamn","errorName":"Var god ange ett ankarnamn","remove":"Radera ankare"},"anchorId":"Efter element-id","anchorName":"Efter ankarnamn","charset":"Teckenuppställning","cssClasses":"Stilmall","emailAddress":"E-postadress","emailBody":"Innehåll","emailSubject":"Ämne","id":"Id","info":"Länkinformation","langCode":"Språkkod","langDir":"Språkriktning","langDirLTR":"Vänster till höger (VTH)","langDirRTL":"Höger till vänster (HTV)","menu":"Redigera länk","name":"Namn","noAnchors":"(Inga ankare kunde hittas)","noEmail":"Var god ange e-postadress","noUrl":"Var god ange länkens URL","other":"<annan>","popupDependent":"Beroende (endast Netscape)","popupFeatures":"Popup-fönstrets egenskaper","popupFullScreen":"Helskärm (endast IE)","popupLeft":"Position från vänster","popupLocationBar":"Adressfält","popupMenuBar":"Menyfält","popupResizable":"Resizable","popupScrollBars":"Scrolllista","popupStatusBar":"Statusfält","popupToolbar":"Verktygsfält","popupTop":"Position från sidans topp","rel":"Förhållande","selectAnchor":"Välj ett ankare","styles":"Stilmall","tabIndex":"Tabindex","target":"Mål","targetFrame":"<ram>","targetFrameName":"Målets ramnamn","targetPopup":"<popup-fönster>","targetPopupName":"Popup-fönstrets namn","title":"Länk","toAnchor":"Länk till ankare i texten","toEmail":"E-post","toUrl":"URL","toolbar":"Infoga/Redigera länk","type":"Länktyp","unlink":"Radera länk","upload":"Ladda upp"},"list":{"bulletedlist":"Punktlista","numberedlist":"Numrerad lista"},"magicline":{"title":"Infoga paragraf här"},"maximize":{"maximize":"Maximera","minimize":"Minimera"},"pastetext":{"button":"Klistra in som vanlig text","title":"Klistra in som vanlig text"},"pastefromword":{"confirmCleanup":"Texten du vill klistra in verkar vara kopierad från Word. Vill du rensa den innan du klistrar in den?","error":"Det var inte möjligt att städa upp den inklistrade data på grund av ett internt fel","title":"Klistra in från Word","toolbar":"Klistra in från Word"},"removeformat":{"toolbar":"Radera formatering"},"sourcearea":{"toolbar":"Källa"},"specialchar":{"options":"Alternativ för utökade tecken","title":"Välj utökat tecken","toolbar":"Klistra in utökat tecken"},"scayt":{"about":"Om SCAYT","aboutTab":"Om","addWord":"Lägg till ord","allCaps":"Ignorera alla ord med enbart versaler","dic_create":"Skapa","dic_delete":"Ta bort","dic_field_name":"Ordlistans namn","dic_info":"Inledningsvis lagras ordlistan i en cookie. När ordlista växer till en punkt där det inte kan lagras i en cookie, lagras den på vår server. För att lagra din personliga ordlista på vår server du ska ange ett namn för din ordbok. Om du redan har en lagrad ordbok, skriv namnet och klicka på knappen Återställ.","dic_rename":"Byt namn","dic_restore":"Återställ","dictionariesTab":"Ordlistor","disable":"Inaktivera SCAYT","emptyDic":"Ordlistans namn får ej vara tomt.","enable":"Aktivera SCAYT","ignore":"Ignorera","ignoreAll":"Ignorera alla","ignoreDomainNames":"Ignorera domännamn","langs":"Språk","languagesTab":"Språk","mixedCase":"Ignorera ord med blandat shiftläge","mixedWithDigits":"Ignorera ord med nummer","moreSuggestions":"Fler förslag","opera_title":"Stöds ej av Opera","options":"Inställningar","optionsTab":"Inställningar","title":"Stavningskontroll medan du skriver","toggle":"Växla SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Anpassad stil","panelTitle":"Formatmallar","panelTitle1":"Blockstil","panelTitle2":"Inbäddad stil","panelTitle3":"Objektets stil"},"table":{"border":"Kantstorlek","caption":"Rubrik","cell":{"menu":"Cell","insertBefore":"Lägg till cell före","insertAfter":"Lägg till cell efter","deleteCell":"Radera celler","merge":"Sammanfoga celler","mergeRight":"Sammanfoga höger","mergeDown":"Sammanfoga ner","splitHorizontal":"Dela cell horisontellt","splitVertical":"Dela cell vertikalt","title":"Egenskaper för cell","cellType":"Celltyp","rowSpan":"Rad spann","colSpan":"Kolumnen spann","wordWrap":"Radbrytning","hAlign":"Horisontell justering","vAlign":"Vertikal justering","alignBaseline":"Baslinje","bgColor":"Bakgrundsfärg","borderColor":"Ramfärg","data":"Data","header":"Rubrik","yes":"Ja","no":"Nej","invalidWidth":"Cellens bredd måste vara ett nummer.","invalidHeight":"Cellens höjd måste vara ett nummer.","invalidRowSpan":"Radutvidgning måste vara ett heltal.","invalidColSpan":"Kolumn måste vara ett heltal.","chooseColor":"Välj"},"cellPad":"Cellutfyllnad","cellSpace":"Cellavstånd","column":{"menu":"Kolumn","insertBefore":"Lägg till kolumn före","insertAfter":"Lägg till kolumn efter","deleteColumn":"Radera kolumn"},"columns":"Kolumner","deleteTable":"Radera tabell","headers":"Rubriker","headersBoth":"Båda","headersColumn":"Första kolumnen","headersNone":"Ingen","headersRow":"Första raden","invalidBorder":"Ram måste vara ett nummer.","invalidCellPadding":"Luft i cell måste vara ett nummer.","invalidCellSpacing":"Luft i cell måste vara ett nummer.","invalidCols":"Antal kolumner måste vara ett nummer större än 0.","invalidHeight":"Tabellens höjd måste vara ett nummer.","invalidRows":"Antal rader måste vara större än 0.","invalidWidth":"Tabell måste vara ett nummer.","menu":"Tabellegenskaper","row":{"menu":"Rad","insertBefore":"Lägg till rad före","insertAfter":"Lägg till rad efter","deleteRow":"Radera rad"},"rows":"Rader","summary":"Sammanfattning","title":"Tabellegenskaper","toolbar":"Tabell","widthPc":"procent","widthPx":"pixlar","widthUnit":"enhet bredd"},"undo":{"redo":"Gör om","undo":"Ångra"},"wsc":{"btnIgnore":"Ignorera","btnIgnoreAll":"Ignorera alla","btnReplace":"Ersätt","btnReplaceAll":"Ersätt alla","btnUndo":"Ångra","changeTo":"Ändra till","errorLoading":"Tjänsten är ej tillgänglig: %s.","ieSpellDownload":"Stavningskontrollen är ej installerad. Vill du göra det nu?","manyChanges":"Stavningskontroll slutförd: %1 ord rättades.","noChanges":"Stavningskontroll slutförd: Inga ord rättades.","noMispell":"Stavningskontroll slutförd: Inga stavfel påträffades.","noSuggestions":"- Förslag saknas -","notAvailable":"Tyvärr är tjänsten ej tillgänglig nu","notInDic":"Saknas i ordlistan","oneChange":"Stavningskontroll slutförd: Ett ord rättades.","progress":"Stavningskontroll pågår...","title":"Kontrollera stavning","toolbar":"Stavningskontroll"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/th.js b/theme/bootstrap/plugins/ckeditor/lang/th.js new file mode 100644 index 0000000..4f22202 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/th.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['th']={"editor":"Rich Text Editor","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"กด ALT 0 หากต้องการความช่วยเหลือ","browseServer":"เปิดหน้าต่างจัดการไฟล์อัพโหลด","url":"ที่อยู่อ้างอิง URL","protocol":"โปรโตคอล","upload":"อัพโหลดไฟล์","uploadSubmit":"อัพโหลดไฟล์ไปเก็บไว้ที่เครื่องแม่ข่าย (เซิร์ฟเวอร์)","image":"รูปภาพ","flash":"ไฟล์ Flash","form":"แบบฟอร์ม","checkbox":"เช็คบ๊อก","radio":"เรดิโอบัตตอน","textField":"เท็กซ์ฟิลด์","textarea":"เท็กซ์แอเรีย","hiddenField":"ฮิดเดนฟิลด์","button":"ปุ่ม","select":"แถบตัวเลือก","imageButton":"ปุ่มแบบรูปภาพ","notSet":"<ไม่ระบุ>","id":"ไอดี","name":"ชื่อ","langDir":"การเขียน-อ่านภาษา","langDirLtr":"จากซ้ายไปขวา (LTR)","langDirRtl":"จากขวามาซ้าย (RTL)","langCode":"รหัสภาษา","longDescr":"คำอธิบายประกอบ URL","cssClass":"คลาสของไฟล์กำหนดลักษณะการแสดงผล","advisoryTitle":"คำเกริ่นนำ","cssStyle":"ลักษณะการแสดงผล","ok":"ตกลง","cancel":"ยกเลิก","close":"ปิด","preview":"ดูหน้าเอกสารตัวอย่าง","resize":"ปรับขนาด","generalTab":"ทั่วไป","advancedTab":"ขั้นสูง","validateNumberFailed":"ค่านี้ไม่ใช่ตัวเลข","confirmNewPage":"การเปลี่ยนแปลงใดๆ ในเนื้อหานี้ ที่ไม่ได้ถูกบันทึกไว้ จะสูญหายทั้งหมด คุณแน่ใจว่าจะเรียกหน้าใหม่?","confirmCancel":"ตัวเลือกบางตัวมีการเปลี่ยนแปลง คุณแน่ใจว่าจะปิดกล่องโต้ตอบนี้?","options":"ตัวเลือก","target":"การเปิดหน้าลิงค์","targetNew":"หน้าต่างใหม่ (_blank)","targetTop":"Topmost Window (_top)","targetSelf":"หน้าต่างเดียวกัน (_self)","targetParent":"Parent Window (_parent)","langDirLTR":"จากซ้ายไปขวา (LTR)","langDirRTL":"จากขวามาซ้าย (RTL)","styles":"ลักษณะการแสดงผล","cssClasses":"คลาสของไฟล์กำหนดลักษณะการแสดงผล","width":"ความกว้าง","height":"ความสูง","align":"การจัดวาง","alignLeft":"ชิดซ้าย","alignRight":"ชิดขวา","alignCenter":"กึ่งกลาง","alignTop":"บนสุด","alignMiddle":"กึ่งกลางแนวตั้ง","alignBottom":"ชิดด้านล่าง","invalidValue":"ค่าไม่ถูกต้อง","invalidHeight":"ความสูงต้องเป็นตัวเลข","invalidWidth":"ความกว้างต้องเป็นตัวเลข","invalidCssLength":"Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).","invalidHtmlLength":"Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).","invalidInlineStyle":"Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.","cssLengthTooltip":"Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).","unavailable":"%1<span class=\"cke_accessibility\">, unavailable</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"About CKEditor","help":"Check $1 for help.","moreInfo":"For licensing information please visit our web site:","title":"About CKEditor","userGuide":"CKEditor User's Guide"},"basicstyles":{"bold":"ตัวหนา","italic":"ตัวเอียง","strike":"ตัวขีดเส้นทับ","subscript":"ตัวห้อย","superscript":"ตัวยก","underline":"ตัวขีดเส้นใต้"},"blockquote":{"toolbar":"Block Quote"},"clipboard":{"copy":"สำเนา","copyError":"ไม่สามารถสำเนาข้อความที่เลือกไว้ได้เนื่องจากการกำหนดค่าระดับความปลอดภัย. กรุณาใช้ปุ่มลัดเพื่อวางข้อความแทน (กดปุ่ม Ctrl/Cmd และตัว C พร้อมกัน).","cut":"ตัด","cutError":"ไม่สามารถตัดข้อความที่เลือกไว้ได้เนื่องจากการกำหนดค่าระดับความปลอดภัย. กรุณาใช้ปุ่มลัดเพื่อวางข้อความแทน (กดปุ่ม Ctrl/Cmd และตัว X พร้อมกัน).","paste":"วาง","pasteArea":"Paste Area","pasteMsg":"กรุณาใช้คีย์บอร์ดเท่านั้น โดยกดปุ๋ม (<strong>Ctrl/Cmd และ V</strong>)พร้อมๆกัน และกด <strong>OK</strong>.","securityMsg":"Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.","title":"วาง"},"contextmenu":{"options":"Context Menu Options"},"toolbar":{"toolbarCollapse":"ซ่อนแถบเครื่องมือ","toolbarExpand":"เปิดแถบเครื่องมือ","toolbarGroups":{"document":"Document","clipboard":"Clipboard/Undo","editing":"Editing","forms":"Forms","basicstyles":"Basic Styles","paragraph":"Paragraph","links":"Links","insert":"Insert","styles":"Styles","colors":"Colors","tools":"Tools"},"toolbars":"แถบเครื่องมือช่วยพิมพ์ข้อความ"},"elementspath":{"eleLabel":"Elements path","eleTitle":"%1 element"},"format":{"label":"รูปแบบ","panelTitle":"รูปแบบ","tag_address":"Address","tag_div":"Paragraph (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Normal","tag_pre":"Formatted"},"horizontalrule":{"toolbar":"แทรกเส้นคั่นบรรทัด"},"image":{"alertUrl":"กรุณาระบุที่อยู่อ้างอิงออนไลน์ของไฟล์รูปภาพ (URL)","alt":"คำประกอบรูปภาพ","border":"ขนาดขอบรูป","btnUpload":"อัพโหลดไฟล์ไปเก็บไว้ที่เครื่องแม่ข่าย (เซิร์ฟเวอร์)","button2Img":"Do you want to transform the selected image button on a simple image?","hSpace":"ระยะแนวนอน","img2Button":"Do you want to transform the selected image on a image button?","infoTab":"ข้อมูลของรูปภาพ","linkTab":"ลิ้งค์","lockRatio":"กำหนดอัตราส่วน กว้าง-สูง แบบคงที่","menu":"คุณสมบัติของ รูปภาพ","resetSize":"กำหนดรูปเท่าขนาดจริง","title":"คุณสมบัติของ รูปภาพ","titleButton":"คุณสมบัติของ ปุ่มแบบรูปภาพ","upload":"อัพโหลดไฟล์","urlMissing":"Image source URL is missing.","vSpace":"ระยะแนวตั้ง","validateBorder":"Border must be a whole number.","validateHSpace":"HSpace must be a whole number.","validateVSpace":"VSpace must be a whole number."},"indent":{"indent":"เพิ่มระยะย่อหน้า","outdent":"ลดระยะย่อหน้า"},"fakeobjects":{"anchor":"แทรก/แก้ไข Anchor","flash":"ภาพอนิเมชั่นแฟลช","hiddenfield":"ฮิดเดนฟิลด์","iframe":"IFrame","unknown":"วัตถุไม่ทราบชนิด"},"link":{"acccessKey":"แอคเซส คีย์","advanced":"ขั้นสูง","advisoryContentType":"ชนิดของคำเกริ่นนำ","advisoryTitle":"คำเกริ่นนำ","anchor":{"toolbar":"แทรก/แก้ไข Anchor","menu":"รายละเอียด Anchor","title":"รายละเอียด Anchor","name":"ชื่อ Anchor","errorName":"กรุณาระบุชื่อของ Anchor","remove":"Remove Anchor"},"anchorId":"ไอดี","anchorName":"ชื่อ","charset":"ลิงค์เชื่อมโยงไปยังชุดตัวอักษร","cssClasses":"คลาสของไฟล์กำหนดลักษณะการแสดงผล","emailAddress":"อีเมล์ (E-Mail)","emailBody":"ข้อความ","emailSubject":"หัวเรื่อง","id":"ไอดี","info":"รายละเอียด","langCode":"การเขียน-อ่านภาษา","langDir":"การเขียน-อ่านภาษา","langDirLTR":"จากซ้ายไปขวา (LTR)","langDirRTL":"จากขวามาซ้าย (RTL)","menu":"แก้ไข ลิงค์","name":"ชื่อ","noAnchors":"(ยังไม่มีจุดเชื่อมโยงภายในหน้าเอกสารนี้)","noEmail":"กรุณาระบุอีเมล์ (E-mail)","noUrl":"กรุณาระบุที่อยู่อ้างอิงออนไลน์ (URL)","other":"<อื่น ๆ>","popupDependent":"แสดงเต็มหน้าจอ (Netscape)","popupFeatures":"คุณสมบัติของหน้าจอเล็ก (Pop-up)","popupFullScreen":"แสดงเต็มหน้าจอ (IE5.5++ เท่านั้น)","popupLeft":"พิกัดซ้าย (Left Position)","popupLocationBar":"แสดงที่อยู่ของไฟล์","popupMenuBar":"แสดงแถบเมนู","popupResizable":"สามารถปรับขนาดได้","popupScrollBars":"แสดงแถบเลื่อน","popupStatusBar":"แสดงแถบสถานะ","popupToolbar":"แสดงแถบเครื่องมือ","popupTop":"พิกัดบน (Top Position)","rel":"ความสัมพันธ์","selectAnchor":"ระบุข้อมูลของจุดเชื่อมโยง (Anchor)","styles":"ลักษณะการแสดงผล","tabIndex":"ลำดับของ แท็บ","target":"การเปิดหน้าลิงค์","targetFrame":"<เปิดในเฟรม>","targetFrameName":"ชื่อทาร์เก็ตเฟรม","targetPopup":"<เปิดหน้าจอเล็ก (Pop-up)>","targetPopupName":"ระบุชื่อหน้าจอเล็ก (Pop-up)","title":"ลิงค์เชื่อมโยงเว็บ อีเมล์ รูปภาพ หรือไฟล์อื่นๆ","toAnchor":"จุดเชื่อมโยง (Anchor)","toEmail":"ส่งอีเมล์ (E-Mail)","toUrl":"ที่อยู่อ้างอิง URL","toolbar":"แทรก/แก้ไข ลิงค์","type":"ประเภทของลิงค์","unlink":"ลบ ลิงค์","upload":"อัพโหลดไฟล์"},"list":{"bulletedlist":"ลำดับรายการแบบสัญลักษณ์","numberedlist":"ลำดับรายการแบบตัวเลข"},"magicline":{"title":"Insert paragraph here"},"maximize":{"maximize":"ขยายใหญ่","minimize":"ย่อขนาด"},"pastetext":{"button":"วางแบบตัวอักษรธรรมดา","title":"วางแบบตัวอักษรธรรมดา"},"pastefromword":{"confirmCleanup":"ข้อความที่คุณต้องการวางลงไปเป็นข้อความที่คัดลอกมาจากโปรแกรมไมโครซอฟท์เวิร์ด คุณต้องการล้างค่าข้อความดังกล่าวก่อนวางลงไปหรือไม่?","error":"ไม่สามารถล้างข้อมูลที่ต้องการวางได้เนื่องจากเกิดข้อผิดพลาดภายในระบบ","title":"วางสำเนาจากตัวอักษรเวิร์ด","toolbar":"วางสำเนาจากตัวอักษรเวิร์ด"},"removeformat":{"toolbar":"ล้างรูปแบบ"},"sourcearea":{"toolbar":"ดูรหัส HTML"},"specialchar":{"options":"Special Character Options","title":"แทรกตัวอักษรพิเศษ","toolbar":"แทรกตัวอักษรพิเศษ"},"scayt":{"about":"About SCAYT","aboutTab":"About","addWord":"Add Word","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"Dictionaries","disable":"Disable SCAYT","emptyDic":"Dictionary name should not be empty.","enable":"Enable SCAYT","ignore":"Ignore","ignoreAll":"Ignore All","ignoreDomainNames":"Ignore Domain Names","langs":"Languages","languagesTab":"Languages","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"More suggestions","opera_title":"Not supported by Opera","options":"Options","optionsTab":"Options","title":"Spell Check As You Type","toggle":"Toggle SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"ลักษณะ","panelTitle":"Formatting Styles","panelTitle1":"Block Styles","panelTitle2":"Inline Styles","panelTitle3":"Object Styles"},"table":{"border":"ขนาดเส้นขอบ","caption":"หัวเรื่องของตาราง","cell":{"menu":"ช่องตาราง","insertBefore":"Insert Cell Before","insertAfter":"Insert Cell After","deleteCell":"ลบช่อง","merge":"ผสานช่อง","mergeRight":"Merge Right","mergeDown":"Merge Down","splitHorizontal":"Split Cell Horizontally","splitVertical":"Split Cell Vertically","title":"Cell Properties","cellType":"Cell Type","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"Word Wrap","hAlign":"Horizontal Alignment","vAlign":"Vertical Alignment","alignBaseline":"Baseline","bgColor":"Background Color","borderColor":"Border Color","data":"Data","header":"Header","yes":"Yes","no":"No","invalidWidth":"Cell width must be a number.","invalidHeight":"Cell height must be a number.","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"Choose"},"cellPad":"ระยะแนวตั้ง","cellSpace":"ระยะแนวนอนน","column":{"menu":"คอลัมน์","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"ลบสดมน์"},"columns":"สดมน์","deleteTable":"ลบตาราง","headers":"ส่วนหัว","headersBoth":"ทั้งสองอย่าง","headersColumn":"คอลัมน์แรก","headersNone":"None","headersRow":"แถวแรก","invalidBorder":"ขนาดเส้นกรอบต้องเป็นจำนวนตัวเลข","invalidCellPadding":"ช่องว่างภายในเซลล์ต้องเลขจำนวนบวก","invalidCellSpacing":"ช่องว่างภายในเซลล์ต้องเป็นเลขจำนวนบวก","invalidCols":"จำนวนคอลัมน์ต้องเป็นจำนวนมากกว่า 0","invalidHeight":"ส่วนสูงของตารางต้องเป็นตัวเลข","invalidRows":"จำนวนของแถวต้องเป็นจำนวนมากกว่า 0","invalidWidth":"ความกว้างตารางต้องเป็นตัวเลข","menu":"คุณสมบัติของ ตาราง","row":{"menu":"แถว","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"ลบแถว"},"rows":"แถว","summary":"สรุปความ","title":"คุณสมบัติของ ตาราง","toolbar":"ตาราง","widthPc":"เปอร์เซ็น","widthPx":"จุดสี","widthUnit":"หน่วยความกว้าง"},"undo":{"redo":"ทำซ้ำคำสั่ง","undo":"ยกเลิกคำสั่ง"},"wsc":{"btnIgnore":"ยกเว้น","btnIgnoreAll":"ยกเว้นทั้งหมด","btnReplace":"แทนที่","btnReplaceAll":"แทนที่ทั้งหมด","btnUndo":"ยกเลิก","changeTo":"แก้ไขเป็น","errorLoading":"Error loading application service host: %s.","ieSpellDownload":"ไม่ได้ติดตั้งระบบตรวจสอบคำสะกด. ต้องการติดตั้งไหมครับ?","manyChanges":"ตรวจสอบคำสะกดเสร็จสิ้น:: แก้ไข %1 คำ","noChanges":"ตรวจสอบคำสะกดเสร็จสิ้น: ไม่มีการแก้คำใดๆ","noMispell":"ตรวจสอบคำสะกดเสร็จสิ้น: ไม่พบคำสะกดผิด","noSuggestions":"- ไม่มีคำแนะนำใดๆ -","notAvailable":"Sorry, but service is unavailable now.","notInDic":"ไม่พบในดิกชันนารี","oneChange":"ตรวจสอบคำสะกดเสร็จสิ้น: แก้ไข1คำ","progress":"กำลังตรวจสอบคำสะกด...","title":"Spell Check","toolbar":"ตรวจการสะกดคำ"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/tr.js b/theme/bootstrap/plugins/ckeditor/lang/tr.js new file mode 100644 index 0000000..7b043e2 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/tr.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['tr']={"editor":"Zengin Metin Editörü","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Yardım için ALT 0 tuşlarına basın","browseServer":"Sunucuya Gözat","url":"URL","protocol":"Protokol","upload":"Karşıya Yükle","uploadSubmit":"Sunucuya Gönder","image":"Resim","flash":"Flash","form":"Form","checkbox":"Onay Kutusu","radio":"Seçenek Düğmesi","textField":"Metin Kutusu","textarea":"Metin Alanı","hiddenField":"Gizli Alan","button":"Düğme","select":"Seçme Alanı","imageButton":"Resim Düğmesi","notSet":"<tanımlanmamış>","id":"Kimlik","name":"İsim","langDir":"Dil Yönü","langDirLtr":"Soldan Sağa (LTR)","langDirRtl":"Sağdan Sola (RTL)","langCode":"Dil Kodlaması","longDescr":"Uzun Tanımlı URL","cssClass":"Biçem Sayfası Sınıfları","advisoryTitle":"Öneri Başlığı","cssStyle":"Biçem","ok":"Tamam","cancel":"İptal","close":"Kapat","preview":"Önizleme","resize":"Yeniden Boyutlandır","generalTab":"Genel","advancedTab":"Gelişmiş","validateNumberFailed":"Bu değer bir sayı değildir.","confirmNewPage":"Bu içerikle ilgili kaydedilmemiş tüm bilgiler kaybolacaktır. Yeni bir sayfa yüklemek istediğinizden emin misiniz?","confirmCancel":"Bazı seçenekleri değiştirdiniz. İletişim penceresini kapatmak istediğinizden emin misiniz?","options":"Seçenekler","target":"Hedef","targetNew":"Yeni Pencere (_blank)","targetTop":"En Üstteki Pencere (_top)","targetSelf":"Aynı Pencere (_self)","targetParent":"Üst Pencere (_parent)","langDirLTR":"Soldan Sağa (LTR)","langDirRTL":"Sağdan Sola (RTL)","styles":"Biçem","cssClasses":"Biçem Sayfası Sınıfları","width":"Genişlik","height":"Yükseklik","align":"Hizalama","alignLeft":"Sol","alignRight":"Sağ","alignCenter":"Ortala","alignTop":"Üst","alignMiddle":"Orta","alignBottom":"Alt","invalidValue":"Geçersiz değer.","invalidHeight":"Yükseklik değeri bir sayı olmalıdır.","invalidWidth":"Genişlik değeri bir sayı olmalıdır.","invalidCssLength":"\"%1\" alanı için verilen değer, geçerli bir CSS ölçü birimi (px, %, in, cm, mm, em, ex, pt, veya pc) içeren veya içermeyen pozitif bir sayı olmalıdır.","invalidHtmlLength":"Belirttiğiniz sayı \"%1\" alanı için pozitif bir sayı HTML birim değeri olmalıdır (px veya %).","invalidInlineStyle":"Satıriçi biçem için verilen değer, \"isim : değer\" biçiminde birbirinden noktalı virgüllerle ayrılan bir veya daha fazla değişkenler grubundan oluşmalıdır.","cssLengthTooltip":"Piksel türünde bir sayı veya geçerli bir CSS ölçü birimi (px, %, in, cm, mm, em, ex, pt veya pc) içeren bir sayı girin.","unavailable":"%1<span class=\"cke_accessibility\">, kullanılamaz</span>"},"about":{"copy":"Copyright &copy; $1. Tüm hakları saklıdır.","dlgTitle":"CKEditor Hakkında","help":"Yardım için $1 kontrol edin.","moreInfo":"Lisanslama hakkında daha fazla bilgi almak için lütfen sitemizi ziyaret edin:","title":"CKEditor Hakkında","userGuide":"CKEditor Kullanıcı Kılavuzu"},"basicstyles":{"bold":"Kalın","italic":"İtalik","strike":"Üstü Çizgili","subscript":"Alt Simge","superscript":"Üst Simge","underline":"Altı Çizgili"},"blockquote":{"toolbar":"Blok Oluştur"},"clipboard":{"copy":"Kopyala","copyError":"Gezgin yazılımınızın güvenlik ayarları düzenleyicinin otomatik kopyalama işlemine izin vermiyor. İşlem için (Ctrl/Cmd+C) tuşlarını kullanın.","cut":"Kes","cutError":"Gezgin yazılımınızın güvenlik ayarları düzenleyicinin otomatik kesme işlemine izin vermiyor. İşlem için (Ctrl/Cmd+X) tuşlarını kullanın.","paste":"Yapıştır","pasteArea":"Yapıştırma Alanı","pasteMsg":"Lütfen aşağıdaki kutunun içine yapıştırın. (<STRONG>Ctrl/Cmd+V</STRONG>) ve <STRONG>Tamam</STRONG> butonunu tıklayın.","securityMsg":"Gezgin yazılımınızın güvenlik ayarları düzenleyicinin direkt olarak panoya erişimine izin vermiyor. Bu pencere içine tekrar yapıştırmalısınız..","title":"Yapıştır"},"contextmenu":{"options":"İçerik Menüsü Seçenekleri"},"toolbar":{"toolbarCollapse":"Araç çubuklarını topla","toolbarExpand":"Araç çubuklarını aç","toolbarGroups":{"document":"Belge","clipboard":"Pano/Geri al","editing":"Düzenleme","forms":"Formlar","basicstyles":"Temel Stiller","paragraph":"Paragraf","links":"Bağlantılar","insert":"Ekle","styles":"Stiller","colors":"Renkler","tools":"Araçlar"},"toolbars":"Araç çubukları Editörü"},"elementspath":{"eleLabel":"Elementlerin yolu","eleTitle":"%1 elementi"},"format":{"label":"Biçim","panelTitle":"Biçim","tag_address":"Adres","tag_div":"Paragraf (DIV)","tag_h1":"Başlık 1","tag_h2":"Başlık 2","tag_h3":"Başlık 3","tag_h4":"Başlık 4","tag_h5":"Başlık 5","tag_h6":"Başlık 6","tag_p":"Normal","tag_pre":"Biçimli"},"horizontalrule":{"toolbar":"Yatay Satır Ekle"},"image":{"alertUrl":"Lütfen resmin URL'sini yazınız","alt":"Alternatif Yazı","border":"Kenar","btnUpload":"Sunucuya Yolla","button2Img":"Seçili resim butonunu basit resime çevirmek istermisiniz?","hSpace":"Yatay Boşluk","img2Button":"Seçili olan resimi, resimli butona çevirmek istermisiniz?","infoTab":"Resim Bilgisi","linkTab":"Köprü","lockRatio":"Oranı Kilitle","menu":"Resim Özellikleri","resetSize":"Boyutu Başa Döndür","title":"Resim Özellikleri","titleButton":"Resimli Düğme Özellikleri","upload":"Karşıya Yükle","urlMissing":"Resmin URL kaynağı eksiktir.","vSpace":"Dikey Boşluk","validateBorder":"Çerçeve tam sayı olmalıdır.","validateHSpace":"HSpace tam sayı olmalıdır.","validateVSpace":"VSpace tam sayı olmalıdır."},"indent":{"indent":"Sekme Arttır","outdent":"Sekme Azalt"},"fakeobjects":{"anchor":"Bağlantı","flash":"Flash Animasyonu","hiddenfield":"Gizli Alan","iframe":"IFrame","unknown":"Bilinmeyen Nesne"},"link":{"acccessKey":"Erişim Tuşu","advanced":"Gelişmiş","advisoryContentType":"Danışma İçerik Türü","advisoryTitle":"Danışma Başlığı","anchor":{"toolbar":"Bağlantı Ekle/Düzenle","menu":"Bağlantı Özellikleri","title":"Bağlantı Özellikleri","name":"Bağlantı Adı","errorName":"Lütfen bağlantı için ad giriniz","remove":"Bağlantıyı Kaldır"},"anchorId":"Eleman Kimlik Numarası ile","anchorName":"Bağlantı Adı ile","charset":"Bağlı Kaynak Karakter Gurubu","cssClasses":"Biçem Sayfası Sınıfları","emailAddress":"E-Posta Adresi","emailBody":"İleti Gövdesi","emailSubject":"İleti Konusu","id":"Id","info":"Link Bilgisi","langCode":"Dil Yönü","langDir":"Dil Yönü","langDirLTR":"Soldan Sağa (LTR)","langDirRTL":"Sağdan Sola (RTL)","menu":"Link Düzenle","name":"Ad","noAnchors":"(Bu belgede hiç çapa yok)","noEmail":"Lütfen E-posta adresini yazın","noUrl":"Lütfen Link URL'sini yazın","other":"<diğer>","popupDependent":"Bağımlı (Netscape)","popupFeatures":"Yeni Açılan Pencere Özellikleri","popupFullScreen":"Tam Ekran (IE)","popupLeft":"Sola Göre Konum","popupLocationBar":"Yer Çubuğu","popupMenuBar":"Menü Çubuğu","popupResizable":"Resizable","popupScrollBars":"Kaydırma Çubukları","popupStatusBar":"Durum Çubuğu","popupToolbar":"Araç Çubuğu","popupTop":"Yukarıya Göre Konum","rel":"İlişki","selectAnchor":"Bağlantı Seç","styles":"Biçem","tabIndex":"Sekme İndeksi","target":"Hedef","targetFrame":"<çerçeve>","targetFrameName":"Hedef Çerçeve Adı","targetPopup":"<yeni açılan pencere>","targetPopupName":"Yeni Açılan Pencere Adı","title":"Link","toAnchor":"Bu sayfada çapa","toEmail":"E-Posta","toUrl":"URL","toolbar":"Link Ekle/Düzenle","type":"Link Türü","unlink":"Köprü Kaldır","upload":"Karşıya Yükle"},"list":{"bulletedlist":"Simgeli Liste","numberedlist":"Numaralı Liste"},"magicline":{"title":"Parağrafı buraya ekle"},"maximize":{"maximize":"Büyült","minimize":"Küçült"},"pastetext":{"button":"Düz Metin Olarak Yapıştır","title":"Düz Metin Olarak Yapıştır"},"pastefromword":{"confirmCleanup":"Yapıştırmaya çalıştığınız metin Word'den kopyalanmıştır. Yapıştırmadan önce silmek istermisiniz?","error":"Yapıştırmadaki veri bilgisi hata düzelene kadar silinmeyecektir","title":"Word'den Yapıştır","toolbar":"Word'den Yapıştır"},"removeformat":{"toolbar":"Biçimi Kaldır"},"sourcearea":{"toolbar":"Kaynak"},"specialchar":{"options":"Özel Karakter Seçenekleri","title":"Özel Karakter Seç","toolbar":"Özel Karakter Ekle"},"scayt":{"about":"SCAYT'ı hakkında","aboutTab":"Hakkında","addWord":"Kelime Ekle","allCaps":"Tüm büyük küçük kelimeleri yoksay","dic_create":"Oluştur","dic_delete":"Sil","dic_field_name":"Sözlük adı","dic_info":"Başlangıçta Kullanıcı Sözlüğü bir çerezde saklanır. Ancak, Çerezler boyutu sınırlıdır. Kullanıcı Sözlüğü, çerezin içinde saklanamayacağı bir noktada, bizim sunucularımızın içindeki sözlükte saklanabilir. Bizim sunucu üzerinde kişisel Sözlük saklamanız için, Sözlüğe bir ad belirtmelisiniz. Eğer zaten bir saklı Sözlük varsa, lütfen adını yazın ve Geri Yükle düğmesini tıklayın.","dic_rename":"Yeniden adlandır","dic_restore":"Geri al","dictionariesTab":"Sözlükler","disable":"SCAYT'ı pasifleştir","emptyDic":"Sözlük adı boş olamaz.","enable":"SCAYT'ı etkinleştir","ignore":"Yoksay","ignoreAll":"Tümünü Yoksay","ignoreDomainNames":"Domain adlarını yoksay","langs":"Diller","languagesTab":"Diller","mixedCase":"Karışık büyüklük ile Sözcükler yoksay","mixedWithDigits":"Sayılarla Kelimeler yoksay","moreSuggestions":"Daha fazla öneri","opera_title":"Opera tarafından desteklenmemektedir","options":"Seçenekler","optionsTab":"Seçenekler","title":"Girmiş olduğunuz kelime denetimi","toggle":"SCAYT'ı değiştir","noSuggestions":"No suggestion"},"stylescombo":{"label":"Biçem","panelTitle":"Stilleri Düzenliyor","panelTitle1":"Blok Stilleri","panelTitle2":"Inline Stilleri","panelTitle3":"Nesne Stilleri"},"table":{"border":"Kenar Kalınlığı","caption":"Başlık","cell":{"menu":"Hücre","insertBefore":"Hücre Ekle - Önce","insertAfter":"Hücre Ekle - Sonra","deleteCell":"Hücre Sil","merge":"Hücreleri Birleştir","mergeRight":"Birleştir - Sağdaki İle ","mergeDown":"Birleştir - Aşağıdaki İle ","splitHorizontal":"Hücreyi Yatay Böl","splitVertical":"Hücreyi Dikey Böl","title":"Hücre Özellikleri","cellType":"Hücre Tipi","rowSpan":"Satırlar Mesafesi (Span)","colSpan":"Sütünlar Mesafesi (Span)","wordWrap":"Kelime Kaydırma","hAlign":"Düşey Hizalama","vAlign":"Yataş Hizalama","alignBaseline":"Tabana","bgColor":"Arkaplan Rengi","borderColor":"Çerçeve Rengi","data":"Veri","header":"Başlık","yes":"Evet","no":"Hayır","invalidWidth":"Hücre genişliği sayı olmalıdır.","invalidHeight":"Hücre yüksekliği sayı olmalıdır.","invalidRowSpan":"Satırların mesafesi tam sayı olmalıdır.","invalidColSpan":"Sütünların mesafesi tam sayı olmalıdır.","chooseColor":"Seçiniz"},"cellPad":"Izgara yazı arası","cellSpace":"Izgara kalınlığı","column":{"menu":"Sütun","insertBefore":"Kolon Ekle - Önce","insertAfter":"Kolon Ekle - Sonra","deleteColumn":"Sütun Sil"},"columns":"Sütunlar","deleteTable":"Tabloyu Sil","headers":"Başlıklar","headersBoth":"Her İkisi","headersColumn":"İlk Sütun","headersNone":"Yok","headersRow":"İlk Satır","invalidBorder":"Çerceve büyüklüklüğü sayı olmalıdır.","invalidCellPadding":"Hücre aralığı (padding) sayı olmalıdır.","invalidCellSpacing":"Hücre boşluğu (spacing) sayı olmalıdır.","invalidCols":"Sütün sayısı 0 sayısından büyük olmalıdır.","invalidHeight":"Tablo yüksekliği sayı olmalıdır.","invalidRows":"Satır sayısı 0 sayısından büyük olmalıdır.","invalidWidth":"Tablo genişliği sayı olmalıdır.","menu":"Tablo Özellikleri","row":{"menu":"Satır","insertBefore":"Satır Ekle - Önce","insertAfter":"Satır Ekle - Sonra","deleteRow":"Satır Sil"},"rows":"Satırlar","summary":"Özet","title":"Tablo Özellikleri","toolbar":"Tablo","widthPc":"yüzde","widthPx":"piksel","widthUnit":"genişlik birimi"},"undo":{"redo":"Tekrarla","undo":"Geri Al"},"wsc":{"btnIgnore":"Yoksay","btnIgnoreAll":"Tümünü Yoksay","btnReplace":"Değiştir","btnReplaceAll":"Tümünü Değiştir","btnUndo":"Geri Al","changeTo":"Şuna değiştir:","errorLoading":"Uygulamada yüklerken hata oluştu: %s.","ieSpellDownload":"Yazım denetimi yüklenmemiş. Şimdi yüklemek ister misiniz?","manyChanges":"Yazım denetimi tamamlandı: %1 kelime değiştirildi","noChanges":"Yazım denetimi tamamlandı: Hiçbir kelime değiştirilmedi","noMispell":"Yazım denetimi tamamlandı: Yanlış yazıma rastlanmadı","noSuggestions":"- Öneri Yok -","notAvailable":"Üzügünüz, bu servis şuanda hizmet dışıdır.","notInDic":"Sözlükte Yok","oneChange":"Yazım denetimi tamamlandı: Bir kelime değiştirildi","progress":"Yazım denetimi işlemde...","title":"Yazımı Denetle","toolbar":"Yazım Denetimi"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/ug.js b/theme/bootstrap/plugins/ckeditor/lang/ug.js new file mode 100644 index 0000000..2717aa9 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/ug.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['ug']={"editor":"تەھرىرلىگۈچ","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"ALT+0 نى بېسىپ ياردەمنى كۆرۈڭ","browseServer":"كۆرسىتىش مۇلازىمېتىر","url":"ئەسلى ھۆججەت","protocol":"كېلىشىم","upload":"يۈكلە","uploadSubmit":"مۇلازىمېتىرغا يۈكلە","image":"سۈرەت","flash":"Flash","form":"جەدۋەل","checkbox":"كۆپ تاللاش رامكىسى","radio":"يەككە تاللاش توپچىسى","textField":"يەككە قۇر تېكىست","textarea":"كۆپ قۇر تېكىست","hiddenField":"يوشۇرۇن دائىرە","button":"توپچا","select":"تىزىم/تىزىملىك","imageButton":"سۈرەت دائىرە","notSet":"‹تەڭشەلمىگەن›","id":"ID","name":"ئات","langDir":"تىل يۆنىلىشى","langDirLtr":"سولدىن ئوڭغا (LTR)","langDirRtl":"ئوڭدىن سولغا (RTL)","langCode":"تىل كودى","longDescr":"تەپسىلىي چۈشەندۈرۈش ئادرېسى","cssClass":"ئۇسلۇب خىلىنىڭ ئاتى","advisoryTitle":"ماۋزۇ","cssStyle":"قۇر ئىچىدىكى ئۇسلۇبى","ok":"جەزملە","cancel":"ۋاز كەچ","close":"تاقا","preview":"ئالدىن كۆزەت","resize":"چوڭلۇقىنى ئۆزگەرت","generalTab":"ئادەتتىكى","advancedTab":"ئالىي","validateNumberFailed":"سان پىچىمىدا كىرگۈزۈش زۆرۈر","confirmNewPage":"نۆۋەتتىكى پۈتۈك مەزمۇنى ساقلانمىدى، يېڭى پۈتۈك قۇرامسىز؟","confirmCancel":"قىسمەن ئۆزگەرتىش ساقلانمىدى، بۇ سۆزلەشكۈنى تاقامسىز؟","options":"تاللانما","target":"نىشان كۆزنەك","targetNew":"يېڭى كۆزنەك (_blank)","targetTop":"پۈتۈن بەت (_top)","targetSelf":"مەزكۇر كۆزنەك (_self)","targetParent":"ئاتا كۆزنەك (_parent)","langDirLTR":"سولدىن ئوڭغا (LTR)","langDirRTL":"ئوڭدىن سولغا (RTL)","styles":"ئۇسلۇبلار","cssClasses":"ئۇسلۇب خىللىرى","width":"كەڭلىك","height":"ئېگىزلىك","align":"توغرىلىنىشى","alignLeft":"سول","alignRight":"ئوڭ","alignCenter":"ئوتتۇرا","alignTop":"ئۈستى","alignMiddle":"ئوتتۇرا","alignBottom":"ئاستى","invalidValue":"ئىناۋەتسىز قىممەت.","invalidHeight":"ئېگىزلىك چوقۇم رەقەم پىچىمىدا بولۇشى زۆرۈر","invalidWidth":"كەڭلىك چوقۇم رەقەم پىچىمىدا بولۇشى زۆرۈر","invalidCssLength":"بۇ سۆز بۆلىكى چوقۇم مۇۋاپىق بولغان CSS ئۇزۇنلۇق قىممىتى بولۇشى زۆرۈر، بىرلىكى (px, %, in, cm, mm, em, ex, pt ياكى pc)","invalidHtmlLength":"بۇ سۆز بۆلىكى چوقۇم بىرىكمە HTML ئۇزۇنلۇق قىممىتى بولۇشى كېرەك. ئۆز ئىچىگە ئالىدىغان بىرلىك (px ياكى %)","invalidInlineStyle":"ئىچكى باغلانما ئۇسلۇبى چوقۇم چېكىتلىك پەش بىلەن ئايرىلغان بىر ياكى كۆپ «خاسلىق ئاتى:خاسلىق قىممىتى» پىچىمىدا بولۇشى لازىم","cssLengthTooltip":"بۇ سۆز بۆلىكى بىرىكمە CSS ئۇزۇنلۇق قىممىتى بولۇشى كېرەك. ئۆز ئىچىگە ئالىدىغان بىرلىك (px, %, in, cm, mm, em, ex, pt ياكى pc)","unavailable":"%1<span class=\\\\\"cke_accessibility\\\\\">، ئىشلەتكىلى بولمايدۇ</span>"},"about":{"copy":"Copyright &copy; $1. نەشر ھوقۇقىغا ئىگە","dlgTitle":"CKEditor ھەققىدە","help":"$1 نى زىيارەت قىلىپ ياردەمگە ئېرىشىڭ","moreInfo":"تور تۇرايىمىزنى زىيارەت قىلىپ كېلىشىمگە ئائىت تېخىمۇ كۆپ ئۇچۇرغا ئېرىشىڭ","title":"CKEditor ھەققىدە","userGuide":"CKEditor ئىشلەتكۈچى قوللانمىسى"},"basicstyles":{"bold":"توم","italic":"يانتۇ","strike":"ئۆچۈرۈش سىزىقى","subscript":"تۆۋەن ئىندېكس","superscript":"يۇقىرى ئىندېكس","underline":"ئاستى سىزىق"},"blockquote":{"toolbar":"بۆلەك نەقىل"},"clipboard":{"copy":"نەشر ھوقۇقىغا ئىگە بەلگىسى","copyError":"تور كۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى تەھرىرلىگۈچنىڭ كۆچۈر مەشغۇلاتىنى ئۆزلۈكىدىن ئىجرا قىلىشىغا يول قويمايدۇ، ھەرپتاختا تېز كۇنۇپكا (Ctrl/Cmd+C) ئارقىلىق تاماملاڭ","cut":"كەس","cutError":"تور كۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى تەھرىرلىگۈچنىڭ كەس مەشغۇلاتىنى ئۆزلۈكىدىن ئىجرا قىلىشىغا يول قويمايدۇ، ھەرپتاختا تېز كۇنۇپكا (Ctrl/Cmd+X) ئارقىلىق تاماملاڭ","paste":"چاپلا","pasteArea":"چاپلاش دائىرىسى","pasteMsg":"ھەرپتاختا تېز كۇنۇپكا (<STRONG>Ctrl/Cmd+V</STRONG>) نى ئىشلىتىپ مەزمۇننى تۆۋەندىكى رامكىغا كۆچۈرۈڭ، ئاندىن <STRONG>جەزملە</STRONG>نى بېسىڭ","securityMsg":"توركۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى سەۋەبىدىن بۇ تەھرىرلىگۈچ چاپلاش تاختىسىدىكى مەزمۇننى بىۋاستە زىيارەت قىلالمايدۇ، بۇ كۆزنەكتە قايتا بىر قېتىم چاپلىشىڭىز كېرەك.","title":"چاپلا"},"contextmenu":{"options":"قىسقا يول تىزىملىك تاللانمىسى"},"toolbar":{"toolbarCollapse":"قورال بالداقنى قاتلا","toolbarExpand":"قورال بالداقنى ياي","toolbarGroups":{"document":"پۈتۈك","clipboard":"چاپلاش تاختىسى/يېنىۋال","editing":"تەھرىر","forms":"جەدۋەل","basicstyles":"ئاساسىي ئۇسلۇب","paragraph":"ئابزاس","links":"ئۇلانما","insert":"قىستۇر","styles":"ئۇسلۇب","colors":"رەڭ","tools":"قورال"},"toolbars":"قورال بالداق"},"elementspath":{"eleLabel":"ئېلېمېنت يولى","eleTitle":"%1 ئېلېمېنت"},"format":{"label":"پىچىم","panelTitle":"پىچىم","tag_address":"ئادرېس","tag_div":"ئابزاس (DIV)","tag_h1":"ماۋزۇ 1","tag_h2":"ماۋزۇ 2","tag_h3":"ماۋزۇ 3","tag_h4":"ماۋزۇ 4","tag_h5":"ماۋزۇ 5","tag_h6":"ماۋزۇ 6","tag_p":"ئادەتتىكى","tag_pre":"تىزىلغان پىچىم"},"horizontalrule":{"toolbar":"توغرا سىزىق قىستۇر"},"image":{"alertUrl":"سۈرەت ئادرېسىنى كىرگۈزۈڭ","alt":"تېكىست ئالماشتۇر","border":"گىرۋەك چوڭلۇقى","btnUpload":"مۇلازىمېتىرغا يۈكلە","button2Img":"نۆۋەتتىكى توپچىنى سۈرەتكە ئۆزگەرتەمسىز؟","hSpace":"توغرىسىغا ئارىلىقى","img2Button":"نۆۋەتتىكى سۈرەتنى توپچىغا ئۆزگەرتەمسىز؟","infoTab":"سۈرەت","linkTab":"ئۇلانما","lockRatio":"نىسبەتنى قۇلۇپلا","menu":"سۈرەت خاسلىقى","resetSize":"ئەسلى چوڭلۇق","title":"سۈرەت خاسلىقى","titleButton":"سۈرەت دائىرە خاسلىقى","upload":"يۈكلە","urlMissing":"سۈرەتنىڭ ئەسلى ھۆججەت ئادرېسى كەم","vSpace":"بويىغا ئارىلىقى","validateBorder":"گىرۋەك چوڭلۇقى چوقۇم سان بولىدۇ","validateHSpace":"توغرىسىغا ئارىلىق چوقۇم پۈتۈن سان بولىدۇ","validateVSpace":"بويىغا ئارىلىق چوقۇم پۈتۈن سان بولىدۇ"},"indent":{"indent":"تارايت","outdent":"كەڭەيت"},"fakeobjects":{"anchor":"لەڭگەرلىك نۇقتا","flash":"Flash جانلاندۇرۇم","hiddenfield":"يوشۇرۇن دائىرە","iframe":"IFrame","unknown":"يوچۇن نەڭ"},"link":{"acccessKey":"زىيارەت كۇنۇپكا","advanced":"ئالىي","advisoryContentType":"مەزمۇن تىپى","advisoryTitle":"ماۋزۇ","anchor":{"toolbar":"لەڭگەرلىك نۇقتا ئۇلانمىسى قىستۇر/تەھرىرلە","menu":"لەڭگەرلىك نۇقتا ئۇلانما خاسلىقى","title":"لەڭگەرلىك نۇقتا ئۇلانما خاسلىقى","name":"لەڭگەرلىك نۇقتا ئاتى","errorName":"لەڭگەرلىك نۇقتا ئاتىنى كىرگۈزۈڭ","remove":"لەڭگەرلىك نۇقتا ئۆچۈر"},"anchorId":"لەڭگەرلىك نۇقتا ID سى بويىچە","anchorName":"لەڭگەرلىك نۇقتا ئاتى بويىچە","charset":"ھەرپ كودلىنىشى","cssClasses":"ئۇسلۇب خىلى ئاتى","emailAddress":"ئادرېس","emailBody":"مەزمۇن","emailSubject":"ماۋزۇ","id":"ID","info":"ئۇلانما ئۇچۇرى","langCode":"تىل كودى","langDir":"تىل يۆنىلىشى","langDirLTR":"سولدىن ئوڭغا (LTR)","langDirRTL":"ئوڭدىن سولغا (RTL)","menu":"ئۇلانما تەھرىر","name":"ئات","noAnchors":"(بۇ پۈتۈكتە ئىشلەتكىلى بولىدىغان لەڭگەرلىك نۇقتا يوق)","noEmail":"ئېلخەت ئادرېسىنى كىرگۈزۈڭ","noUrl":"ئۇلانما ئادرېسىنى كىرگۈزۈڭ","other":"‹باشقا›","popupDependent":"تەۋە (NS)","popupFeatures":"قاڭقىش كۆزنەك خاسلىقى","popupFullScreen":"پۈتۈن ئېكران (IE)","popupLeft":"سول","popupLocationBar":"ئادرېس بالداق","popupMenuBar":"تىزىملىك بالداق","popupResizable":"چوڭلۇقى ئۆزگەرتىشچان","popupScrollBars":"دومىلىما سۈرگۈچ","popupStatusBar":"ھالەت بالداق","popupToolbar":"قورال بالداق","popupTop":"ئوڭ","rel":"باغلىنىش","selectAnchor":"بىر لەڭگەرلىك نۇقتا تاللاڭ","styles":"قۇر ئىچىدىكى ئۇسلۇبى","tabIndex":"Tab تەرتىپى","target":"نىشان","targetFrame":"‹كاندۇك›","targetFrameName":"نىشان كاندۇك ئاتى","targetPopup":"‹قاڭقىش كۆزنەك›","targetPopupName":"قاڭقىش كۆزنەك ئاتى","title":"ئۇلانما","toAnchor":"بەت ئىچىدىكى لەڭگەرلىك نۇقتا ئۇلانمىسى","toEmail":"ئېلخەت","toUrl":"ئادرېس","toolbar":"ئۇلانما قىستۇر/تەھرىرلە","type":"ئۇلانما تىپى","unlink":"ئۇلانما بىكار قىل","upload":"يۈكلە"},"list":{"bulletedlist":"تۈر بەلگە تىزىمى","numberedlist":"تەرتىپ نومۇر تىزىمى"},"magicline":{"title":"بۇ جايغا ئابزاس قىستۇر"},"maximize":{"maximize":"چوڭايت","minimize":"كىچىكلەت"},"pastetext":{"button":"پىچىمى يوق تېكىست سۈپىتىدە چاپلا","title":"پىچىمى يوق تېكىست سۈپىتىدە چاپلا"},"pastefromword":{"confirmCleanup":"سىز چاپلىماقچى بولغان مەزمۇن MS Word تىن كەلگەندەك قىلىدۇ، MS Word پىچىمىنى تازىلىۋەتكەندىن كېيىن ئاندىن چاپلامدۇ؟","error":"ئىچكى خاتالىق سەۋەبىدىن چاپلايدىغان سانلىق مەلۇماتنى تازىلىيالمايدۇ","title":"MS Word تىن چاپلا","toolbar":"MS Word تىن چاپلا"},"removeformat":{"toolbar":"پىچىمنى چىقىرىۋەت"},"sourcearea":{"toolbar":"مەنبە"},"specialchar":{"options":"ئالاھىدە ھەرپ تاللانمىسى","title":"ئالاھىدە ھەرپ تاللاڭ","toolbar":"ئالاھىدە ھەرپ قىستۇر"},"scayt":{"about":"شۇئان ئىملا تەكشۈرۈش ھەققىدە","aboutTab":"ھەققىدە","addWord":"سۆز قوش","allCaps":"چوڭ ھەرپتە يېزىلغان ھەممە سۆزگە پەرۋا قىلما","dic_create":"قۇر","dic_delete":"ئۆچۈر","dic_field_name":"لۇغەت ئاتى","dic_info":"باشلىنىشتا ئىشلەتكۈچى لۇغىتى Cookie غا ساقلىنىدۇ ئەمما Cookie نىڭ سىغىمى چەكلىك بولغاچقا، ئىشلەتكۈچى لۇغىتى كۆپىيىپ Cookie چەكلىمىسىدىن ئېشىپ كەتكەندە ساقلىغىلى بولمايدۇ، بۇ چاغدا لۇغىتىڭىزنى مۇلازىمېتىرىمىزغا ساقلىسىڭىز بولىدۇ. شەخسىي لۇغىتىڭىزنى مۇلازىمېتىرىمىزغا ساقلىماقچى بولسىڭىز لۇغىتىڭىزگە ئاتتىن بىرنى قويۇڭ، ئەگەر مۇلازىمتېرىمىزدا سىزنىڭ لۇغىتىڭىزدىن بىرسى بولسا لۇغەت ئاتىنى كىرگۈزۈپ ئەسلىگە قايتۇر توپچىسىنى بېسىڭ.","dic_rename":"ئات ئۆزگەرت","dic_restore":"ئەسلىگە كەلتۈر","dictionariesTab":"لۇغەت","disable":"شۇئان ئىملا تەكشۈرۈشنى چەكلە","emptyDic":"لۇغەت ئاتى بوش قالمايدۇ","enable":"شۇئان ئىملا تەكشۈرۈشنى قوزغات","ignore":"پەرۋا قىلما","ignoreAll":"ھەممىسىگە پەرۋا قىلما","ignoreDomainNames":"دائىرە ئاتىغا پەرۋا قىلما","langs":"تىل","languagesTab":"تىل","mixedCase":"چوڭ كىچىك ھەرپ بىلەن ئارىلاش يېزىلغان سۆزگە پەرۋا قىلما","mixedWithDigits":"سان بار سۆزگە پەرۋا قىلما","moreSuggestions":"تېخىمۇ كۆپ ئىملا تەۋسىيەسى","opera_title":"Opera توركۆرگۈنى قوللىمايدۇ","options":"تاللانما","optionsTab":"تاللانما","title":"شۇئان ئىملا تەكشۈر","toggle":"شۇئان ئىملا تەكشۈرۈشنى ۋاقىتلىق توختات/قوزغات","noSuggestions":"No suggestion"},"stylescombo":{"label":"ئۇسلۇب","panelTitle":"ئۇسلۇب","panelTitle1":"بۆلەك دەرىجىسىدىكى ئېلېمېنت ئۇسلۇبى","panelTitle2":"ئىچكى باغلانما ئېلېمېنت ئۇسلۇبى","panelTitle3":"نەڭ (Object) ئېلېمېنت ئۇسلۇبى"},"table":{"border":"گىرۋەك","caption":"ماۋزۇ","cell":{"menu":"كاتەكچە","insertBefore":"سولغا كاتەكچە قىستۇر","insertAfter":"ئوڭغا كاتەكچە قىستۇر","deleteCell":"كەتەكچە ئۆچۈر","merge":"كاتەكچە بىرلەشتۈر","mergeRight":"كاتەكچىنى ئوڭغا بىرلەشتۈر","mergeDown":"كاتەكچىنى ئاستىغا بىرلەشتۈر","splitHorizontal":"كاتەكچىنى توغرىسىغا بىرلەشتۈر","splitVertical":"كاتەكچىنى بويىغا بىرلەشتۈر","title":"كاتەكچە خاسلىقى","cellType":"كاتەكچە تىپى","rowSpan":"بويىغا چات ئارىسى قۇر سانى","colSpan":"توغرىسىغا چات ئارىسى ئىستون سانى","wordWrap":"ئۆزلۈكىدىن قۇر قاتلا","hAlign":"توغرىسىغا توغرىلا","vAlign":"بويىغا توغرىلا","alignBaseline":"ئاساسىي سىزىق","bgColor":"تەگلىك رەڭگى","borderColor":"گىرۋەك رەڭگى","data":"سانلىق مەلۇمات","header":"جەدۋەل باشى","yes":"ھەئە","no":"ياق","invalidWidth":"كاتەكچە كەڭلىكى چوقۇم سان بولىدۇ","invalidHeight":"كاتەكچە ئېگىزلىكى چوقۇم سان بولىدۇ","invalidRowSpan":"قۇر چات ئارىسى چوقۇم پۈتۈن سان بولىدۇ ","invalidColSpan":"ئىستون چات ئارىسى چوقۇم پۈتۈن سان بولىدۇ","chooseColor":"تاللاڭ"},"cellPad":"يان ئارىلىق","cellSpace":"ئارىلىق","column":{"menu":"ئىستون","insertBefore":"سولغا ئىستون قىستۇر","insertAfter":"ئوڭغا ئىستون قىستۇر","deleteColumn":"ئىستون ئۆچۈر"},"columns":"ئىستون سانى","deleteTable":"جەدۋەل ئۆچۈر","headers":"ماۋزۇ كاتەكچە","headersBoth":"بىرىنچى ئىستون ۋە بىرىنچى قۇر","headersColumn":"بىرىنچى ئىستون","headersNone":"يوق","headersRow":"بىرىنچى قۇر","invalidBorder":"گىرۋەك توملۇقى چوقۇم سان بولىدۇ","invalidCellPadding":"كاتەكچىگە چوقۇم سان تولدۇرۇلىدۇ","invalidCellSpacing":"كاتەكچە ئارىلىقى چوقۇم سان بولىدۇ","invalidCols":"بەلگىلەنگەن قۇر سانى چوقۇم نۆلدىن چوڭ بولىدۇ","invalidHeight":"جەدۋەل ئېگىزلىكى چوقۇم سان بولىدۇ","invalidRows":"بەلگىلەنگەن ئىستون سانى چوقۇم نۆلدىن چوڭ بولىدۇ","invalidWidth":"جەدۋەل كەڭلىكى چوقۇم سان بولىدۇ","menu":"جەدۋەل خاسلىقى","row":{"menu":"قۇر","insertBefore":"ئۈستىگە قۇر قىستۇر","insertAfter":"ئاستىغا قۇر قىستۇر","deleteRow":"قۇر ئۆچۈر"},"rows":"قۇر سانى","summary":"ئۈزۈندە","title":"جەدۋەل خاسلىقى","toolbar":"جەدۋەل","widthPc":"پىرسەنت","widthPx":"پىكسېل","widthUnit":"كەڭلىك بىرلىكى"},"undo":{"redo":"قايتىلا ","undo":"يېنىۋال"},"wsc":{"btnIgnore":"پەرۋا قىلما","btnIgnoreAll":"ھەممىگە پەرۋا قىلما","btnReplace":"ئالماشتۇر","btnReplaceAll":"ھەممىنى ئالماشتۇر","btnUndo":"يېنىۋال","changeTo":"ئۆزگەرت","errorLoading":"لازىملىق مۇلازىمېتىرنى يۈكلىگەندە خاتالىق كۆرۈلدى: %s.","ieSpellDownload":"ئىملا تەكشۈرۈش قىستۇرمىسى تېخى ئورنىتىلمىغان، ھازىرلا چۈشۈرەمسىز؟","manyChanges":"ئىملا تەكشۈرۈش تامام: %1 سۆزنى ئۆزگەرتتى","noChanges":"ئىملا تەكشۈرۈش تامام: ھېچقانداق سۆزنى ئۆزگەرتمىدى","noMispell":"ئىملا تەكشۈرۈش تامام: ئىملا خاتالىقى بايقالمىدى","noSuggestions":"-تەكلىپ يوق-","notAvailable":"كەچۈرۈڭ، مۇلازىمېتىرنى ۋاقتىنچە ئىشلەتكىلى بولمايدۇ","notInDic":"لۇغەتتە يوق","oneChange":"ئىملا تەكشۈرۈش تامام: بىر سۆزنى ئۆزگەرتتى","progress":"ئىملا تەكشۈرۈۋاتىدۇ…","title":"ئىملا تەكشۈر","toolbar":"ئىملا تەكشۈر"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/uk.js b/theme/bootstrap/plugins/ckeditor/lang/uk.js new file mode 100644 index 0000000..b3da02d --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/uk.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['uk']={"editor":"Текстовий редактор","editorPanel":"Панель текстового редактора","common":{"editorHelp":"натисніть ALT 0 для довідки","browseServer":"Огляд Сервера","url":"URL","protocol":"Протокол","upload":"Надіслати","uploadSubmit":"Надіслати на сервер","image":"Зображення","flash":"Flash","form":"Форма","checkbox":"Галочка","radio":"Кнопка вибору","textField":"Текстове поле","textarea":"Текстова область","hiddenField":"Приховане поле","button":"Кнопка","select":"Список","imageButton":"Кнопка із зображенням","notSet":"<не визначено>","id":"Ідентифікатор","name":"Ім'я","langDir":"Напрямок мови","langDirLtr":"Зліва направо (LTR)","langDirRtl":"Справа наліво (RTL)","langCode":"Код мови","longDescr":"Довгий опис URL","cssClass":"Клас CSS","advisoryTitle":"Заголовок","cssStyle":"Стиль CSS","ok":"ОК","cancel":"Скасувати","close":"Закрити","preview":"Попередній перегляд","resize":"Потягніть для зміни розмірів","generalTab":"Основне","advancedTab":"Додаткове","validateNumberFailed":"Значення не є цілим числом.","confirmNewPage":"Всі незбережені зміни будуть втрачені. Ви впевнені, що хочете завантажити нову сторінку?","confirmCancel":"Деякі опції змінено. Закрити вікно без збереження змін?","options":"Опції","target":"Ціль","targetNew":"Нове вікно (_blank)","targetTop":"Поточне вікно (_top)","targetSelf":"Поточний фрейм/вікно (_self)","targetParent":"Батьківський фрейм/вікно (_parent)","langDirLTR":"Зліва направо (LTR)","langDirRTL":"Справа наліво (RTL)","styles":"Стиль CSS","cssClasses":"Клас CSS","width":"Ширина","height":"Висота","align":"Вирівнювання","alignLeft":"По лівому краю","alignRight":"По правому краю","alignCenter":"По центру","alignTop":"По верхньому краю","alignMiddle":"По середині","alignBottom":"По нижньому краю","invalidValue":"Невірне значення.","invalidHeight":"Висота повинна бути цілим числом.","invalidWidth":"Ширина повинна бути цілим числом.","invalidCssLength":"Значення, вказане для \"%1\" в полі повинно бути позитивним числом або без дійсного виміру CSS блоку (px, %, in, cm, mm, em, ex, pt або pc).","invalidHtmlLength":"Значення, вказане для \"%1\" в полі повинно бути позитивним числом або без дійсного виміру HTML блоку (px або %).","invalidInlineStyle":"Значення, вказане для вбудованого стилю повинне складатися з одного чи кількох кортежів у форматі \"ім'я : значення\", розділених крапкою з комою.","cssLengthTooltip":"Введіть номер значення в пікселях або число з дійсною одиниці CSS (px, %, in, cm, mm, em, ex, pt або pc).","unavailable":"%1<span class=\"cke_accessibility\">, не доступне</span>"},"about":{"copy":"Copyright &copy; $1. Всі права застережено.","dlgTitle":"Про CKEditor","help":"Перевірте $1 для допомоги.","moreInfo":"Щодо інформації з ліцензування завітайте на наш сайт:","title":"Про CKEditor","userGuide":"Інструкція Користувача для CKEditor"},"basicstyles":{"bold":"Жирний","italic":"Курсив","strike":"Закреслений","subscript":"Нижній індекс","superscript":"Верхній індекс","underline":"Підкреслений"},"blockquote":{"toolbar":"Цитата"},"clipboard":{"copy":"Копіювати","copyError":"Налаштування безпеки Вашого браузера не дозволяють редактору автоматично виконувати операції копіювання. Будь ласка, використовуйте клавіатуру для цього (Ctrl/Cmd+C).","cut":"Вирізати","cutError":"Налаштування безпеки Вашого браузера не дозволяють редактору автоматично виконувати операції вирізування. Будь ласка, використовуйте клавіатуру для цього (Ctrl/Cmd+X)","paste":"Вставити","pasteArea":"Область вставки","pasteMsg":"Будь ласка, вставте інформацію з буфера обміну в цю область, користуючись комбінацією клавіш (<STRONG>Ctrl/Cmd+V</STRONG>), та натисніть <STRONG>OK</STRONG>.","securityMsg":"Редактор не може отримати прямий доступ до буферу обміну у зв'язку з налаштуваннями Вашого браузера. Вам потрібно вставити інформацію в це вікно.","title":"Вставити"},"contextmenu":{"options":"Опції контекстного меню"},"toolbar":{"toolbarCollapse":"Згорнути панель інструментів","toolbarExpand":"Розгорнути панель інструментів","toolbarGroups":{"document":"Документ","clipboard":"Буфер обміну / Скасувати","editing":"Редагування","forms":"Форми","basicstyles":"Основний Стиль","paragraph":"Параграф","links":"Посилання","insert":"Вставити","styles":"Стилі","colors":"Кольори","tools":"Інструменти"},"toolbars":"Панель інструментів редактора"},"elementspath":{"eleLabel":"Шлях","eleTitle":"%1 елемент"},"format":{"label":"Форматування","panelTitle":"Форматування параграфа","tag_address":"Адреса","tag_div":"Нормальний (div)","tag_h1":"Заголовок 1","tag_h2":"Заголовок 2","tag_h3":"Заголовок 3","tag_h4":"Заголовок 4","tag_h5":"Заголовок 5","tag_h6":"Заголовок 6","tag_p":"Нормальний","tag_pre":"Форматований"},"horizontalrule":{"toolbar":"Горизонтальна лінія"},"image":{"alertUrl":"Будь ласка, вкажіть URL зображення","alt":"Альтернативний текст","border":"Рамка","btnUpload":"Надіслати на сервер","button2Img":"Бажаєте перетворити обрану кнопку-зображення на просте зображення?","hSpace":"Гориз. відступ","img2Button":"Бажаєте перетворити обране зображення на кнопку-зображення?","infoTab":"Інформація про зображення","linkTab":"Посилання","lockRatio":"Зберегти пропорції","menu":"Властивості зображення","resetSize":"Очистити поля розмірів","title":"Властивості зображення","titleButton":"Властивості кнопки із зображенням","upload":"Надіслати","urlMissing":"Вкажіть URL зображення.","vSpace":"Верт. відступ","validateBorder":"Ширина рамки повинна бути цілим числом.","validateHSpace":"Гориз. відступ повинен бути цілим числом.","validateVSpace":"Верт. відступ повинен бути цілим числом."},"indent":{"indent":"Збільшити відступ","outdent":"Зменшити відступ"},"fakeobjects":{"anchor":"Якір","flash":"Flash-анімація","hiddenfield":"Приховані Поля","iframe":"IFrame","unknown":"Невідомий об'єкт"},"link":{"acccessKey":"Гаряча клавіша","advanced":"Додаткове","advisoryContentType":"Тип вмісту","advisoryTitle":"Заголовок","anchor":{"toolbar":"Вставити/Редагувати якір","menu":"Властивості якоря","title":"Властивості якоря","name":"Ім'я якоря","errorName":"Будь ласка, вкажіть ім'я якоря","remove":"Прибрати якір"},"anchorId":"За ідентифікатором елементу","anchorName":"За ім'ям елементу","charset":"Кодування","cssClasses":"Клас CSS","emailAddress":"Адреса ел. пошти","emailBody":"Тіло повідомлення","emailSubject":"Тема листа","id":"Ідентифікатор","info":"Інформація посилання","langCode":"Код мови","langDir":"Напрямок мови","langDirLTR":"Зліва направо (LTR)","langDirRTL":"Справа наліво (RTL)","menu":"Вставити посилання","name":"Ім'я","noAnchors":"(В цьому документі немає якорів)","noEmail":"Будь ласка, вкажіть адрес ел. пошти","noUrl":"Будь ласка, вкажіть URL посилання","other":"<інший>","popupDependent":"Залежний (Netscape)","popupFeatures":"Властивості випливаючого вікна","popupFullScreen":"Повний екран (IE)","popupLeft":"Позиція зліва","popupLocationBar":"Панель локації","popupMenuBar":"Панель меню","popupResizable":"Масштабоване","popupScrollBars":"Стрічки прокрутки","popupStatusBar":"Рядок статусу","popupToolbar":"Панель інструментів","popupTop":"Позиція зверху","rel":"Зв'язок","selectAnchor":"Оберіть якір","styles":"Стиль CSS","tabIndex":"Послідовність переходу","target":"Ціль","targetFrame":"<фрейм>","targetFrameName":"Ім'я цільового фрейму","targetPopup":"<випливаюче вікно>","targetPopupName":"Ім'я випливаючого вікна","title":"Посилання","toAnchor":"Якір на цю сторінку","toEmail":"Ел. пошта","toUrl":"URL","toolbar":"Вставити/Редагувати посилання","type":"Тип посилання","unlink":"Видалити посилання","upload":"Надіслати"},"list":{"bulletedlist":"Маркірований список","numberedlist":"Нумерований список"},"magicline":{"title":"Вставити абзац"},"maximize":{"maximize":"Максимізувати","minimize":"Мінімізувати"},"pastetext":{"button":"Вставити тільки текст","title":"Вставити тільки текст"},"pastefromword":{"confirmCleanup":"Текст, що Ви намагаєтесь вставити, схожий на скопійований з Word. Бажаєте очистити його форматування перед вставлянням?","error":"Неможливо очистити форматування через внутрішню помилку.","title":"Вставити з Word","toolbar":"Вставити з Word"},"removeformat":{"toolbar":"Очистити форматування"},"sourcearea":{"toolbar":"Джерело"},"specialchar":{"options":"Опції","title":"Оберіть спеціальний символ","toolbar":"Спеціальний символ"},"scayt":{"about":"Про SCAYT","aboutTab":"Про SCAYT","addWord":"Додати слово","allCaps":"Пропустити прописні слова","dic_create":"Створити","dic_delete":"Видалити","dic_field_name":"Назва словника","dic_info":"Як правило, користувацькі словники зберігаються у cookie-файлах. Однак, cookie-файли мають обмеження на розмір. Якщо користувацький словник зростає в обсязі настільки, що вже не може бути збережений у cookie-файлі, тоді його можна зберегти на нашому сервері. Щоб зберегти Ваш персональний словник на нашому сервері необхідно вказати назву словника. Якщо Ви вже зберігали словник на сервері, будь ласка, вкажіть назву збереженого словника і натисніть кнопку Відновити.","dic_rename":"Перейменувати","dic_restore":"Відновити","dictionariesTab":"Словники","disable":"Вимкнути SCAYT","emptyDic":"Назва словника повинна бути вказана.","enable":"Ввімкнути SCAYT","ignore":"Пропустити","ignoreAll":"Пропустити всі","ignoreDomainNames":"Пропустити доменні назви","langs":"Мови","languagesTab":"Мови","mixedCase":"Пропустити слова зі змішаним регістром","mixedWithDigits":"Пропустити слова, що містять цифри","moreSuggestions":"Більше варіантів","opera_title":"Не підтримується в Opera","options":"Опції","optionsTab":"Опції","title":"Перефірка орфографії по мірі набору","toggle":"Перемкнути SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Стиль","panelTitle":"Стилі форматування","panelTitle1":"Блочні стилі","panelTitle2":"Рядкові стилі","panelTitle3":"Об'єктні стилі"},"table":{"border":"Розмір рамки","caption":"Заголовок таблиці","cell":{"menu":"Комірки","insertBefore":"Вставити комірку перед","insertAfter":"Вставити комірку після","deleteCell":"Видалити комірки","merge":"Об'єднати комірки","mergeRight":"Об'єднати справа","mergeDown":"Об'єднати донизу","splitHorizontal":"Розділити комірку по горизонталі","splitVertical":"Розділити комірку по вертикалі","title":"Властивості комірки","cellType":"Тип комірки","rowSpan":"Об'єднання рядків","colSpan":"Об'єднання стовпців","wordWrap":"Автоперенесення тексту","hAlign":"Гориз. вирівнювання","vAlign":"Верт. вирівнювання","alignBaseline":"По базовій лінії","bgColor":"Колір фону","borderColor":"Колір рамки","data":"Дані","header":"Заголовок","yes":"Так","no":"Ні","invalidWidth":"Ширина комірки повинна бути цілим числом.","invalidHeight":"Висота комірки повинна бути цілим числом.","invalidRowSpan":"Кількість об'єднуваних рядків повинна бути цілим числом.","invalidColSpan":"Кількість об'єднуваних стовбців повинна бути цілим числом.","chooseColor":"Обрати"},"cellPad":"Внутр. відступ","cellSpace":"Проміжок","column":{"menu":"Стовбці","insertBefore":"Вставити стовбець перед","insertAfter":"Вставити стовбець після","deleteColumn":"Видалити стовбці"},"columns":"Стовбці","deleteTable":"Видалити таблицю","headers":"Заголовки стовбців/рядків","headersBoth":"Стовбці і рядки","headersColumn":"Стовбці","headersNone":"Без заголовків","headersRow":"Рядки","invalidBorder":"Розмір рамки повинен бути цілим числом.","invalidCellPadding":"Внутр. відступ комірки повинен бути цілим числом.","invalidCellSpacing":"Проміжок між комірками повинен бути цілим числом.","invalidCols":"Кількість стовбців повинна бути більшою 0.","invalidHeight":"Висота таблиці повинна бути цілим числом.","invalidRows":"Кількість рядків повинна бути більшою 0.","invalidWidth":"Ширина таблиці повинна бути цілим числом.","menu":"Властивості таблиці","row":{"menu":"Рядки","insertBefore":"Вставити рядок перед","insertAfter":"Вставити рядок після","deleteRow":"Видалити рядки"},"rows":"Рядки","summary":"Детальний опис заголовку таблиці","title":"Властивості таблиці","toolbar":"Таблиця","widthPc":"відсотків","widthPx":"пікселів","widthUnit":"Одиниці вимір."},"undo":{"redo":"Повторити","undo":"Повернути"},"wsc":{"btnIgnore":"Пропустити","btnIgnoreAll":"Пропустити все","btnReplace":"Замінити","btnReplaceAll":"Замінити все","btnUndo":"Назад","changeTo":"Замінити на","errorLoading":"Помилка завантаження : %s.","ieSpellDownload":"Модуль перевірки орфографії не встановлено. Бажаєте завантажити його зараз?","manyChanges":"Перевірку орфографії завершено: 1% слів(ова) змінено","noChanges":"Перевірку орфографії завершено: жодне слово не змінено","noMispell":"Перевірку орфографії завершено: помилок не знайдено","noSuggestions":"- немає варіантів -","notAvailable":"Вибачте, але сервіс наразі недоступний.","notInDic":"Немає в словнику","oneChange":"Перевірку орфографії завершено: змінено одне слово","progress":"Виконується перевірка орфографії...","title":"Перевірка орфографії","toolbar":"Перевірити орфографію"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/vi.js b/theme/bootstrap/plugins/ckeditor/lang/vi.js new file mode 100644 index 0000000..5e0c110 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/vi.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['vi']={"editor":"Bộ soạn thảo văn bản có định dạng","editorPanel":"Rich Text Editor panel","common":{"editorHelp":"Nhấn ALT + 0 để được giúp đỡ","browseServer":"Duyệt máy chủ","url":"URL","protocol":"Giao thức","upload":"Tải lên","uploadSubmit":"Tải lên máy chủ","image":"Hình ảnh","flash":"Flash","form":"Biểu mẫu","checkbox":"Nút kiểm","radio":"Nút chọn","textField":"Trường văn bản","textarea":"Vùng văn bản","hiddenField":"Trường ẩn","button":"Nút","select":"Ô chọn","imageButton":"Nút hình ảnh","notSet":"<không thiết lập>","id":"Định danh","name":"Tên","langDir":"Hướng ngôn ngữ","langDirLtr":"Trái sang phải (LTR)","langDirRtl":"Phải sang trái (RTL)","langCode":"Mã ngôn ngữ","longDescr":"Mô tả URL","cssClass":"Lớp Stylesheet","advisoryTitle":"Nhan đề hướng dẫn","cssStyle":"Kiểu (style)","ok":"Đồng ý","cancel":"Bỏ qua","close":"Đóng","preview":"Xem trước","resize":"Kéo rê để thay đổi kích cỡ","generalTab":"Tab chung","advancedTab":"Tab mở rộng","validateNumberFailed":"Giá trị này không phải là số.","confirmNewPage":"Mọi thay đổi không được lưu lại, nội dung này sẽ bị mất. Bạn có chắc chắn muốn tải một trang mới?","confirmCancel":"Một vài tùy chọn đã bị thay đổi. Bạn có chắc chắn muốn đóng hộp thoại?","options":"Tùy chọn","target":"Đích đến","targetNew":"Cửa sổ mới (_blank)","targetTop":"Cửa sổ trên cùng (_top)","targetSelf":"Tại trang (_self)","targetParent":"Cửa sổ cha (_parent)","langDirLTR":"Trái sang phải (LTR)","langDirRTL":"Phải sang trái (RTL)","styles":"Kiểu","cssClasses":"Lớp CSS","width":"Chiều rộng","height":"chiều cao","align":"Vị trí","alignLeft":"Trái","alignRight":"Phải","alignCenter":"Giữa","alignTop":"Trên","alignMiddle":"Giữa","alignBottom":"Dưới","invalidValue":"Giá trị không hợp lệ.","invalidHeight":"Chiều cao phải là số nguyên.","invalidWidth":"Chiều rộng phải là số nguyên.","invalidCssLength":"Giá trị quy định cho trường \"%1\" phải là một số dương có hoặc không có một đơn vị đo CSS hợp lệ (px, %, in, cm, mm, em, ex, pt, hoặc pc).","invalidHtmlLength":"Giá trị quy định cho trường \"%1\" phải là một số dương có hoặc không có một đơn vị đo HTML hợp lệ (px hoặc %).","invalidInlineStyle":"Giá trị quy định cho kiểu nội tuyến phải bao gồm một hoặc nhiều dữ liệu với định dạng \"tên:giá trị\", cách nhau bằng dấu chấm phẩy.","cssLengthTooltip":"Nhập một giá trị theo pixel hoặc một số với một đơn vị CSS hợp lệ (px, %, in, cm, mm, em, ex, pt, hoặc pc).","unavailable":"%1<span class=\"cke_accessibility\">, không có</span>"},"about":{"copy":"Bản quyền &copy; $1. Giữ toàn quyền.","dlgTitle":"Thông tin về CKEditor","help":"Kiểm tra $1 để được giúp đỡ.","moreInfo":"Vui lòng ghé thăm trang web của chúng tôi để có thông tin về giấy phép:","title":"Thông tin về CKEditor","userGuide":"Hướng dẫn sử dụng CKEditor"},"basicstyles":{"bold":"Đậm","italic":"Nghiêng","strike":"Gạch xuyên ngang","subscript":"Chỉ số dưới","superscript":"Chỉ số trên","underline":"Gạch chân"},"blockquote":{"toolbar":"Khối trích dẫn"},"clipboard":{"copy":"Sao chép","copyError":"Các thiết lập bảo mật của trình duyệt không cho phép trình biên tập tự động thực thi lệnh sao chép. Hãy sử dụng bàn phím cho lệnh này (Ctrl/Cmd+C).","cut":"Cắt","cutError":"Các thiết lập bảo mật của trình duyệt không cho phép trình biên tập tự động thực thi lệnh cắt. Hãy sử dụng bàn phím cho lệnh này (Ctrl/Cmd+X).","paste":"Dán","pasteArea":"Khu vực dán","pasteMsg":"Hãy dán nội dung vào trong khung bên dưới, sử dụng tổ hợp phím (<STRONG>Ctrl/Cmd+V</STRONG>) và nhấn vào nút <STRONG>Đồng ý</STRONG>.","securityMsg":"Do thiết lập bảo mật của trình duyệt nên trình biên tập không thể truy cập trực tiếp vào nội dung đã sao chép. Bạn cần phải dán lại nội dung vào cửa sổ này.","title":"Dán"},"contextmenu":{"options":"Tùy chọn menu bổ xung"},"toolbar":{"toolbarCollapse":"Thu gọn thanh công cụ","toolbarExpand":"Mở rộng thnah công cụ","toolbarGroups":{"document":"Tài liệu","clipboard":"Clipboard/Undo","editing":"Chỉnh sửa","forms":"Bảng biểu","basicstyles":"Kiểu cơ bản","paragraph":"Đoạn","links":"Liên kết","insert":"Chèn","styles":"Kiểu","colors":"Màu sắc","tools":"Công cụ"},"toolbars":"Thanh công cụ"},"elementspath":{"eleLabel":"Nhãn thành phần","eleTitle":"%1 thành phần"},"format":{"label":"Định dạng","panelTitle":"Định dạng","tag_address":"Address","tag_div":"Bình thường (DIV)","tag_h1":"Heading 1","tag_h2":"Heading 2","tag_h3":"Heading 3","tag_h4":"Heading 4","tag_h5":"Heading 5","tag_h6":"Heading 6","tag_p":"Bình thường (P)","tag_pre":"Đã thiết lập"},"horizontalrule":{"toolbar":"Chèn đường phân cách ngang"},"image":{"alertUrl":"Hãy đưa vào đường dẫn của ảnh","alt":"Chú thích ảnh","border":"Đường viền","btnUpload":"Tải lên máy chủ","button2Img":"Bạn có muốn chuyển nút bấm bằng ảnh được chọn thành ảnh?","hSpace":"Khoảng đệm ngang","img2Button":"Bạn có muốn chuyển đổi ảnh được chọn thành nút bấm bằng ảnh?","infoTab":"Thông tin của ảnh","linkTab":"Tab liên kết","lockRatio":"Giữ nguyên tỷ lệ","menu":"Thuộc tính của ảnh","resetSize":"Kích thước gốc","title":"Thuộc tính của ảnh","titleButton":"Thuộc tính nút của ảnh","upload":"Tải lên","urlMissing":"Thiếu đường dẫn hình ảnh","vSpace":"Khoảng đệm dọc","validateBorder":"Chiều rộng của đường viền phải là một số nguyên dương","validateHSpace":"Khoảng đệm ngang phải là một số nguyên dương","validateVSpace":"Khoảng đệm dọc phải là một số nguyên dương"},"indent":{"indent":"Dịch vào trong","outdent":"Dịch ra ngoài"},"fakeobjects":{"anchor":"Điểm neo","flash":"Flash","hiddenfield":"Trường ẩn","iframe":"IFrame","unknown":"Đối tượng không rõ ràng"},"link":{"acccessKey":"Phím hỗ trợ truy cập","advanced":"Mở rộng","advisoryContentType":"Nội dung hướng dẫn","advisoryTitle":"Nhan đề hướng dẫn","anchor":{"toolbar":"Chèn/Sửa điểm neo","menu":"Thuộc tính điểm neo","title":"Thuộc tính điểm neo","name":"Tên của điểm neo","errorName":"Hãy nhập vào tên của điểm neo","remove":"Xóa neo"},"anchorId":"Theo định danh thành phần","anchorName":"Theo tên điểm neo","charset":"Bảng mã của tài nguyên được liên kết đến","cssClasses":"Lớp Stylesheet","emailAddress":"Thư điện tử","emailBody":"Nội dung thông điệp","emailSubject":"Tiêu đề thông điệp","id":"Định danh","info":"Thông tin liên kết","langCode":"Mã ngôn ngữ","langDir":"Hướng ngôn ngữ","langDirLTR":"Trái sang phải (LTR)","langDirRTL":"Phải sang trái (RTL)","menu":"Sửa liên kết","name":"Tên","noAnchors":"(Không có điểm neo nào trong tài liệu)","noEmail":"Hãy đưa vào địa chỉ thư điện tử","noUrl":"Hãy đưa vào đường dẫn liên kết (URL)","other":"<khác>","popupDependent":"Phụ thuộc (Netscape)","popupFeatures":"Đặc điểm của cửa sổ Popup","popupFullScreen":"Toàn màn hình (IE)","popupLeft":"Vị trí bên trái","popupLocationBar":"Thanh vị trí","popupMenuBar":"Thanh Menu","popupResizable":"Có thể thay đổi kích cỡ","popupScrollBars":"Thanh cuộn","popupStatusBar":"Thanh trạng thái","popupToolbar":"Thanh công cụ","popupTop":"Vị trí phía trên","rel":"Quan hệ","selectAnchor":"Chọn một điểm neo","styles":"Kiểu (style)","tabIndex":"Chỉ số của Tab","target":"Đích","targetFrame":"<khung>","targetFrameName":"Tên khung đích","targetPopup":"<cửa sổ popup>","targetPopupName":"Tên cửa sổ Popup","title":"Liên kết","toAnchor":"Neo trong trang này","toEmail":"Thư điện tử","toUrl":"URL","toolbar":"Chèn/Sửa liên kết","type":"Kiểu liên kết","unlink":"Xoá liên kết","upload":"Tải lên"},"list":{"bulletedlist":"Chèn/Xoá Danh sách không thứ tự","numberedlist":"Chèn/Xoá Danh sách có thứ tự"},"magicline":{"title":"Chèn đoạn vào đây"},"maximize":{"maximize":"Phóng to tối đa","minimize":"Thu nhỏ"},"pastetext":{"button":"Dán theo định dạng văn bản thuần","title":"Dán theo định dạng văn bản thuần"},"pastefromword":{"confirmCleanup":"Văn bản bạn muốn dán có kèm định dạng của Word. Bạn có muốn loại bỏ định dạng Word trước khi dán?","error":"Không thể để làm sạch các dữ liệu dán do một lỗi nội bộ","title":"Dán với định dạng Word","toolbar":"Dán với định dạng Word"},"removeformat":{"toolbar":"Xoá định dạng"},"sourcearea":{"toolbar":"Mã HTML"},"specialchar":{"options":"Tùy chọn các ký tự đặc biệt","title":"Hãy chọn ký tự đặc biệt","toolbar":"Chèn ký tự đặc biệt"},"scayt":{"about":"Thông tin về SCAYT","aboutTab":"Thông tin","addWord":"Thêm từ","allCaps":"Không phân biệt chữ HOA chữ thường","dic_create":"Tạo","dic_delete":"Xóa","dic_field_name":"Tên từ điển","dic_info":"Ban đầu, từ điển người dùng được lưu trữ trong một cookie. Tuy nhiên, kích thước cookie bị giới hạn. Khi người sử dụng từ điển phát triển đến điểm không thể được lưu trữ trong cookie, từ điển sẽ được lưu trữ trên máy chủ của chúng tôi. Để lưu trữ từ điển cá nhân của bạn trên máy chủ của chúng tôi, bạn nên xác định một tên cho từ điển của bạn. Nếu bạn đã có một cuốn từ điển được lưu trữ, xin vui lòng gõ tên của nó và nhấn vào nút Khôi phục.","dic_rename":"Thay tên","dic_restore":"Phục hồi","dictionariesTab":"Từ điển","disable":"Tắt SCAYT","emptyDic":"Tên của từ điển không được để trống.","enable":"Bật SCAYT","ignore":"Bỏ qua","ignoreAll":"Bỏ qua tất cả","ignoreDomainNames":"Bỏ qua tên miền","langs":"Ngôn ngữ","languagesTab":"Tab ngôn ngữ","mixedCase":"Không phân biệt loại chữ","mixedWithDigits":"Không phân biệt chữ và số","moreSuggestions":"Đề xuất thêm","opera_title":"Không hỗ trợ trên trình duyệt Opera","options":"Tùy chọn","optionsTab":"Tùy chọn","title":"Kiểm tra chính tả ngay khi gõ chữ (SCAYT)","toggle":"Bật tắt SCAYT","noSuggestions":"No suggestion"},"stylescombo":{"label":"Kiểu","panelTitle":"Phong cách định dạng","panelTitle1":"Kiểu khối","panelTitle2":"Kiểu trực tiếp","panelTitle3":"Kiểu đối tượng"},"table":{"border":"Kích thước đường viền","caption":"Đầu đề","cell":{"menu":"Ô","insertBefore":"Chèn ô Phía trước","insertAfter":"Chèn ô Phía sau","deleteCell":"Xoá ô","merge":"Kết hợp ô","mergeRight":"Kết hợp sang phải","mergeDown":"Kết hợp xuống dưới","splitHorizontal":"Phân tách ô theo chiều ngang","splitVertical":"Phân tách ô theo chiều dọc","title":"Thuộc tính của ô","cellType":"Kiểu của ô","rowSpan":"Kết hợp hàng","colSpan":"Kết hợp cột","wordWrap":"Chữ liền hàng","hAlign":"Canh lề ngang","vAlign":"Canh lề dọc","alignBaseline":"Đường cơ sở","bgColor":"Màu nền","borderColor":"Màu viền","data":"Dữ liệu","header":"Đầu đề","yes":"Có","no":"Không","invalidWidth":"Chiều rộng của ô phải là một số nguyên.","invalidHeight":"Chiều cao của ô phải là một số nguyên.","invalidRowSpan":"Số hàng kết hợp phải là một số nguyên.","invalidColSpan":"Số cột kết hợp phải là một số nguyên.","chooseColor":"Chọn màu"},"cellPad":"Khoảng đệm giữ ô và nội dung","cellSpace":"Khoảng cách giữa các ô","column":{"menu":"Cột","insertBefore":"Chèn cột phía trước","insertAfter":"Chèn cột phía sau","deleteColumn":"Xoá cột"},"columns":"Số cột","deleteTable":"Xóa bảng","headers":"Đầu đề","headersBoth":"Cả hai","headersColumn":"Cột đầu tiên","headersNone":"Không có","headersRow":"Hàng đầu tiên","invalidBorder":"Kích cỡ của đường biên phải là một số nguyên.","invalidCellPadding":"Khoảng đệm giữa ô và nội dung phải là một số nguyên.","invalidCellSpacing":"Khoảng cách giữa các ô phải là một số nguyên.","invalidCols":"Số lượng cột phải là một số lớn hơn 0.","invalidHeight":"Chiều cao của bảng phải là một số nguyên.","invalidRows":"Số lượng hàng phải là một số lớn hơn 0.","invalidWidth":"Chiều rộng của bảng phải là một số nguyên.","menu":"Thuộc tính bảng","row":{"menu":"Hàng","insertBefore":"Chèn hàng phía trước","insertAfter":"Chèn hàng phía sau","deleteRow":"Xoá hàng"},"rows":"Số hàng","summary":"Tóm lược","title":"Thuộc tính bảng","toolbar":"Bảng","widthPc":"Phần trăm (%)","widthPx":"Điểm ảnh (px)","widthUnit":"Đơn vị"},"undo":{"redo":"Làm lại thao tác","undo":"Khôi phục thao tác"},"wsc":{"btnIgnore":"Bỏ qua","btnIgnoreAll":"Bỏ qua tất cả","btnReplace":"Thay thế","btnReplaceAll":"Thay thế tất cả","btnUndo":"Phục hồi lại","changeTo":"Chuyển thành","errorLoading":"Lỗi khi đang nạp dịch vụ ứng dụng: %s.","ieSpellDownload":"Chức năng kiểm tra chính tả chưa được cài đặt. Bạn có muốn tải về ngay bây giờ?","manyChanges":"Hoàn tất kiểm tra chính tả: %1 từ đã được thay đổi","noChanges":"Hoàn tất kiểm tra chính tả: Không có từ nào được thay đổi","noMispell":"Hoàn tất kiểm tra chính tả: Không có lỗi chính tả","noSuggestions":"- Không đưa ra gợi ý về từ -","notAvailable":"Xin lỗi, dịch vụ này hiện tại không có.","notInDic":"Không có trong từ điển","oneChange":"Hoàn tất kiểm tra chính tả: Một từ đã được thay đổi","progress":"Đang tiến hành kiểm tra chính tả...","title":"Kiểm tra chính tả","toolbar":"Kiểm tra chính tả"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/zh-cn.js b/theme/bootstrap/plugins/ckeditor/lang/zh-cn.js new file mode 100644 index 0000000..04b80d2 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/zh-cn.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['zh-cn']={"editor":"所见即所得编辑器","editorPanel":"所见即所得编辑器面板","common":{"editorHelp":"按 ALT+0 获得帮助","browseServer":"浏览服务器","url":"URL","protocol":"协议","upload":"上传","uploadSubmit":"上传到服务器","image":"图像","flash":"Flash","form":"表单","checkbox":"复选框","radio":"单选按钮","textField":"单行文本","textarea":"多行文本","hiddenField":"隐藏域","button":"按钮","select":"列表/菜单","imageButton":"图像按钮","notSet":"<没有设置>","id":"ID","name":"名称","langDir":"语言方向","langDirLtr":"从左到右 (LTR)","langDirRtl":"从右到左 (RTL)","langCode":"语言代码","longDescr":"详细说明 URL","cssClass":"样式类名称","advisoryTitle":"标题","cssStyle":"行内样式","ok":"确定","cancel":"取消","close":"关闭","preview":"预览","resize":"拖拽以改变大小","generalTab":"常规","advancedTab":"高级","validateNumberFailed":"需要输入数字格式","confirmNewPage":"当前文档内容未保存,是否确认新建文档?","confirmCancel":"部分修改尚未保存,是否确认关闭对话框?","options":"选项","target":"目标窗口","targetNew":"新窗口 (_blank)","targetTop":"整页 (_top)","targetSelf":"本窗口 (_self)","targetParent":"父窗口 (_parent)","langDirLTR":"从左到右 (LTR)","langDirRTL":"从右到左 (RTL)","styles":"样式","cssClasses":"样式类","width":"宽度","height":"高度","align":"对齐方式","alignLeft":"左对齐","alignRight":"右对齐","alignCenter":"居中","alignTop":"顶端","alignMiddle":"居中","alignBottom":"底部","invalidValue":"无效的值。","invalidHeight":"高度必须为数字格式","invalidWidth":"宽度必须为数字格式","invalidCssLength":"此“%1”字段的值必须为正数,可以包含或不包含一个有效的 CSS 长度单位(px, %, in, cm, mm, em, ex, pt 或 pc)","invalidHtmlLength":"此“%1”字段的值必须为正数,可以包含或不包含一个有效的 HTML 长度单位(px 或 %)","invalidInlineStyle":"内联样式必须为格式是以分号分隔的一个或多个“属性名 : 属性值”。","cssLengthTooltip":"输入一个表示像素值的数字,或加上一个有效的 CSS 长度单位(px, %, in, cm, mm, em, ex, pt 或 pc)。","unavailable":"%1<span class=\"cke_accessibility\">,不可用</span>"},"about":{"copy":"版权所有 &copy; $1。<br />保留所有权利。","dlgTitle":"关于 CKEditor","help":"访问 $1 以获取帮助。","moreInfo":"相关授权许可信息请访问我们的网站:","title":"关于 CKEditor","userGuide":"CKEditor 用户向导"},"basicstyles":{"bold":"加粗","italic":"倾斜","strike":"删除线","subscript":"下标","superscript":"上标","underline":"下划线"},"blockquote":{"toolbar":"块引用"},"clipboard":{"copy":"复制","copyError":"您的浏览器安全设置不允许编辑器自动执行复制操作,请使用键盘快捷键(Ctrl/Cmd+C)来完成。","cut":"剪切","cutError":"您的浏览器安全设置不允许编辑器自动执行剪切操作,请使用键盘快捷键(Ctrl/Cmd+X)来完成。","paste":"粘贴","pasteArea":"粘贴区域","pasteMsg":"请使用键盘快捷键(<STRONG>Ctrl/Cmd+V</STRONG>)把内容粘贴到下面的方框里,再按 <STRONG>确定</STRONG>","securityMsg":"因为您的浏览器的安全设置原因,本编辑器不能直接访问您的剪贴板内容,你需要在本窗口重新粘贴一次。","title":"粘贴"},"contextmenu":{"options":"快捷菜单选项"},"toolbar":{"toolbarCollapse":"折叠工具栏","toolbarExpand":"展开工具栏","toolbarGroups":{"document":"文档","clipboard":"剪贴板/撤销","editing":"编辑","forms":"表单","basicstyles":"基本格式","paragraph":"段落","links":"链接","insert":"插入","styles":"样式","colors":"颜色","tools":"工具"},"toolbars":"工具栏"},"elementspath":{"eleLabel":"元素路径","eleTitle":"%1 元素"},"format":{"label":"格式","panelTitle":"格式","tag_address":"地址","tag_div":"段落(DIV)","tag_h1":"标题 1","tag_h2":"标题 2","tag_h3":"标题 3","tag_h4":"标题 4","tag_h5":"标题 5","tag_h6":"标题 6","tag_p":"普通","tag_pre":"已编排格式"},"horizontalrule":{"toolbar":"插入水平线"},"image":{"alertUrl":"请输入图像地址","alt":"替换文本","border":"边框大小","btnUpload":"上传到服务器","button2Img":"确定要把当前图像按钮转换为普通图像吗?","hSpace":"水平间距","img2Button":"确定要把当前图像改变为图像按钮吗?","infoTab":"图像信息","linkTab":"链接","lockRatio":"锁定比例","menu":"图像属性","resetSize":"原始尺寸","title":"图像属性","titleButton":"图像域属性","upload":"上传","urlMissing":"缺少图像源文件地址","vSpace":"垂直间距","validateBorder":"边框大小必须为整数格式","validateHSpace":"水平间距必须为整数格式","validateVSpace":"垂直间距必须为整数格式"},"indent":{"indent":"增加缩进量","outdent":"减少缩进量"},"fakeobjects":{"anchor":"锚点","flash":"Flash 动画","hiddenfield":"隐藏域","iframe":"IFrame","unknown":"未知对象"},"link":{"acccessKey":"访问键","advanced":"高级","advisoryContentType":"内容类型","advisoryTitle":"标题","anchor":{"toolbar":"插入/编辑锚点链接","menu":"锚点链接属性","title":"锚点链接属性","name":"锚点名称","errorName":"请输入锚点名称","remove":"删除锚点"},"anchorId":"按锚点 ID","anchorName":"按锚点名称","charset":"字符编码","cssClasses":"样式类名称","emailAddress":"地址","emailBody":"内容","emailSubject":"主题","id":"ID","info":"超链接信息","langCode":"语言代码","langDir":"语言方向","langDirLTR":"从左到右 (LTR)","langDirRTL":"从右到左 (RTL)","menu":"编辑超链接","name":"名称","noAnchors":"(此文档没有可用的锚点)","noEmail":"请输入电子邮件地址","noUrl":"请输入超链接地址","other":"<其他>","popupDependent":"依附 (NS)","popupFeatures":"弹出窗口属性","popupFullScreen":"全屏 (IE)","popupLeft":"左","popupLocationBar":"地址栏","popupMenuBar":"菜单栏","popupResizable":"可缩放","popupScrollBars":"滚动条","popupStatusBar":"状态栏","popupToolbar":"工具栏","popupTop":"右","rel":"关联","selectAnchor":"选择一个锚点","styles":"行内样式","tabIndex":"Tab 键次序","target":"目标","targetFrame":"<框架>","targetFrameName":"目标框架名称","targetPopup":"<弹出窗口>","targetPopupName":"弹出窗口名称","title":"超链接","toAnchor":"页内锚点链接","toEmail":"电子邮件","toUrl":"地址","toolbar":"插入/编辑超链接","type":"超链接类型","unlink":"取消超链接","upload":"上传"},"list":{"bulletedlist":"项目列表","numberedlist":"编号列表"},"magicline":{"title":"在这插入段落"},"maximize":{"maximize":"全屏","minimize":"最小化"},"pastetext":{"button":"粘贴为无格式文本","title":"粘贴为无格式文本"},"pastefromword":{"confirmCleanup":"您要粘贴的内容好像是来自 MS Word,是否要清除 MS Word 格式后再粘贴?","error":"由于内部错误无法清理要粘贴的数据","title":"从 MS Word 粘贴","toolbar":"从 MS Word 粘贴"},"removeformat":{"toolbar":"清除格式"},"sourcearea":{"toolbar":"源码"},"specialchar":{"options":"特殊符号选项","title":"选择特殊符号","toolbar":"插入特殊符号"},"scayt":{"about":"关于即时拼写检查","aboutTab":"关于","addWord":"添加单词","allCaps":"忽略所有大写单词","dic_create":"创建","dic_delete":"删除","dic_field_name":"字典名称","dic_info":"一开始用户词典储存在 Cookie 中, 但是 Cookies 的容量是有限的, 当用户词典增长到超出 Cookie 限制时就无法再储存了, 这时您可以将词典储存到我们的服务器上. 要把您的个人词典到储存到我们的服务器上的话, 需要为您的词典指定一个名称, 如果您在我们的服务器上已经有储存有一个词典, 请输入词典名称并按还原按钮.","dic_rename":"重命名","dic_restore":"还原","dictionariesTab":"字典","disable":"禁用即时拼写检查","emptyDic":"字典名不应为空.","enable":"启用即时拼写检查","ignore":"忽略","ignoreAll":"全部忽略","ignoreDomainNames":"忽略域名","langs":"语言","languagesTab":"语言","mixedCase":"忽略大小写混合的单词","mixedWithDigits":"忽略带数字的单词","moreSuggestions":"更多拼写建议","opera_title":"不支持 Opera 浏览器","options":"选项","optionsTab":"选项","title":"即时拼写检查","toggle":"暂停/启用即时拼写检查","noSuggestions":"No suggestion"},"stylescombo":{"label":"样式","panelTitle":"样式","panelTitle1":"块级元素样式","panelTitle2":"内联元素样式","panelTitle3":"对象元素样式"},"table":{"border":"边框","caption":"标题","cell":{"menu":"单元格","insertBefore":"在左侧插入单元格","insertAfter":"在右侧插入单元格","deleteCell":"删除单元格","merge":"合并单元格","mergeRight":"向右合并单元格","mergeDown":"向下合并单元格","splitHorizontal":"水平拆分单元格","splitVertical":"垂直拆分单元格","title":"单元格属性","cellType":"单元格类型","rowSpan":"纵跨行数","colSpan":"横跨列数","wordWrap":"自动换行","hAlign":"水平对齐","vAlign":"垂直对齐","alignBaseline":"基线","bgColor":"背景颜色","borderColor":"边框颜色","data":"数据","header":"表头","yes":"是","no":"否","invalidWidth":"单元格宽度必须为数字格式","invalidHeight":"单元格高度必须为数字格式","invalidRowSpan":"行跨度必须为整数格式","invalidColSpan":"列跨度必须为整数格式","chooseColor":"选择"},"cellPad":"边距","cellSpace":"间距","column":{"menu":"列","insertBefore":"在左侧插入列","insertAfter":"在右侧插入列","deleteColumn":"删除列"},"columns":"列数","deleteTable":"删除表格","headers":"标题单元格","headersBoth":"第一列和第一行","headersColumn":"第一列","headersNone":"无","headersRow":"第一行","invalidBorder":"边框粗细必须为数字格式","invalidCellPadding":"单元格填充必须为数字格式","invalidCellSpacing":"单元格间距必须为数字格式","invalidCols":"指定的行数必须大于零","invalidHeight":"表格高度必须为数字格式","invalidRows":"指定的列数必须大于零","invalidWidth":"表格宽度必须为数字格式","menu":"表格属性","row":{"menu":"行","insertBefore":"在上方插入行","insertAfter":"在下方插入行","deleteRow":"删除行"},"rows":"行数","summary":"摘要","title":"表格属性","toolbar":"表格","widthPc":"百分比","widthPx":"像素","widthUnit":"宽度单位"},"undo":{"redo":"重做","undo":"撤消"},"wsc":{"btnIgnore":"忽略","btnIgnoreAll":"全部忽略","btnReplace":"替换","btnReplaceAll":"全部替换","btnUndo":"撤消","changeTo":"更改为","errorLoading":"加载应该服务主机时出错: %s.","ieSpellDownload":"拼写检查插件还没安装, 您是否想现在就下载?","manyChanges":"拼写检查完成: 更改了 %1 个单词","noChanges":"拼写检查完成: 没有更改任何单词","noMispell":"拼写检查完成: 没有发现拼写错误","noSuggestions":"- 没有建议 -","notAvailable":"抱歉, 服务目前暂不可用","notInDic":"没有在字典里","oneChange":"拼写检查完成: 更改了一个单词","progress":"正在进行拼写检查...","title":"拼写检查","toolbar":"拼写检查"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/lang/zh.js b/theme/bootstrap/plugins/ckeditor/lang/zh.js new file mode 100644 index 0000000..3e546ce --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/lang/zh.js @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.lang['zh']={"editor":"RTF 編輯器","editorPanel":"RTF 編輯器面板","common":{"editorHelp":"按下 ALT 0 取得說明。","browseServer":"瀏覽伺服器","url":"URL","protocol":"通訊協定","upload":"上傳","uploadSubmit":"傳送至伺服器","image":"圖片","flash":"Flash","form":"表格","checkbox":"核取方塊","radio":"選項按鈕","textField":"文字欄位","textarea":"文字區域","hiddenField":"隱藏欄位","button":"按鈕","select":"選取欄位","imageButton":"影像按鈕","notSet":"<未設定>","id":"ID","name":"名稱","langDir":"語言方向","langDirLtr":"從左至右 (LTR)","langDirRtl":"從右至左 (RTL)","langCode":"語言代碼","longDescr":"完整描述 URL","cssClass":"樣式表類別","advisoryTitle":"標題","cssStyle":"樣式","ok":"確定","cancel":"取消","close":"關閉","preview":"預覽","resize":"調整大小","generalTab":"一般","advancedTab":"進階","validateNumberFailed":"此值不是數值。","confirmNewPage":"現存的修改尚未儲存,要開新檔案?","confirmCancel":"部份選項尚未儲存,要關閉對話框?","options":"選項","target":"目標","targetNew":"開新視窗 (_blank)","targetTop":"最上層視窗 (_top)","targetSelf":"相同視窗 (_self)","targetParent":"父視窗 (_parent)","langDirLTR":"由左至右 (LTR)","langDirRTL":"由右至左 (RTL)","styles":"樣式","cssClasses":"樣式表類別","width":"寬度","height":"高度","align":"對齊方式","alignLeft":"靠左對齊","alignRight":"靠右對齊","alignCenter":"置中對齊","alignTop":"頂端","alignMiddle":"中間對齊","alignBottom":"底端","invalidValue":"無效值。","invalidHeight":"高度必須為數字。","invalidWidth":"寬度必須為數字。","invalidCssLength":"「%1」的值應為正數,並可包含有效的 CSS 單位 (px, %, in, cm, mm, em, ex, pt, 或 pc)。","invalidHtmlLength":"「%1」的值應為正數,並可包含有效的 HTML 單位 (px 或 %)。","invalidInlineStyle":"行內樣式的值應包含一個以上的變數值組,其格式如「名稱:值」,並以分號區隔之。","cssLengthTooltip":"請輸入數值,單位是像素或有效的 CSS 單位 (px, %, in, cm, mm, em, ex, pt, 或 pc)。","unavailable":"%1<span class=\"cke_accessibility\">,無法使用</span>"},"about":{"copy":"Copyright &copy; $1. All rights reserved.","dlgTitle":"關於 CKEditor","help":"檢閱 $1 尋求幫助。","moreInfo":"關於授權資訊,請參閱我們的網站:","title":"關於 CKEditor","userGuide":"CKEditor 使用者手冊"},"basicstyles":{"bold":"粗體","italic":"斜體","strike":"刪除線","subscript":"下標","superscript":"上標","underline":"底線"},"blockquote":{"toolbar":"引用段落"},"clipboard":{"copy":"複製","copyError":"瀏覽器的安全性設定不允許編輯器自動執行複製動作。請使用鍵盤快捷鍵 (Ctrl/Cmd+C) 複製。","cut":"剪下","cutError":"瀏覽器的安全性設定不允許編輯器自動執行剪下動作。請使用鏐盤快捷鍵 (Ctrl/Cmd+X) 剪下。","paste":"貼上","pasteArea":"貼上區","pasteMsg":"請使用鍵盤快捷鍵 (<strong>Ctrl/Cmd+V</strong>) 貼到下方區域中並按下「確定」。","securityMsg":"因為瀏覽器的安全性設定,本編輯器無法直接存取您的剪貼簿資料,請您自行在本視窗進行貼上動作。","title":"貼上"},"contextmenu":{"options":"內容功能表選項"},"toolbar":{"toolbarCollapse":"摺疊工具列","toolbarExpand":"展開工具列","toolbarGroups":{"document":"文件","clipboard":"剪貼簿/復原","editing":"編輯選項","forms":"格式","basicstyles":"基本樣式","paragraph":"段落","links":"連結","insert":"插入","styles":"樣式","colors":"顏色","tools":"工具"},"toolbars":"編輯器工具列"},"elementspath":{"eleLabel":"元件路徑","eleTitle":"%1 個元件"},"format":{"label":"格式","panelTitle":"段落格式","tag_address":"地址","tag_div":"標準 (DIV)","tag_h1":"標題 1","tag_h2":"標題 2","tag_h3":"標題 3","tag_h4":"標題 4","tag_h5":"標題 5","tag_h6":"標題 6","tag_p":"標準","tag_pre":"格式設定"},"horizontalrule":{"toolbar":"插入水平線"},"image":{"alertUrl":"請輸入圖片 URL","alt":"替代文字","border":"框線","btnUpload":"傳送到伺服器","button2Img":"請問您確定要將「圖片按鈕」轉換成「圖片」嗎?","hSpace":"HSpace","img2Button":"請問您確定要將「圖片」轉換成「圖片按鈕」嗎?","infoTab":"影像資訊","linkTab":"連結","lockRatio":"固定比例","menu":"影像屬性","resetSize":"重設大小","title":"影像屬性","titleButton":"影像按鈕屬性","upload":"上傳","urlMissing":"遺失圖片來源之 URL ","vSpace":"VSpace","validateBorder":"框線必須是整數。","validateHSpace":"HSpace 必須是整數。","validateVSpace":"VSpace 必須是整數。"},"indent":{"indent":"增加縮排","outdent":"減少縮排"},"fakeobjects":{"anchor":"錨點","flash":"Flash 動畫","hiddenfield":"隱藏欄位","iframe":"IFrame","unknown":"無法辨識的物件"},"link":{"acccessKey":"便捷鍵","advanced":"進階","advisoryContentType":"建議內容類型","advisoryTitle":"標題","anchor":{"toolbar":"錨點","menu":"編輯錨點","title":"錨點內容","name":"錨點名稱","errorName":"請輸入錨點名稱","remove":"移除錨點"},"anchorId":"依元件編號","anchorName":"依錨點名稱","charset":"連結資源的字元集","cssClasses":"樣式表類別","emailAddress":"電子郵件地址","emailBody":"郵件本文","emailSubject":"郵件主旨","id":"ID","info":"連結資訊","langCode":"語言碼","langDir":"語言方向","langDirLTR":"由左至右 (LTR)","langDirRTL":"由右至左 (RTL)","menu":"編輯連結","name":"名稱","noAnchors":"(本文件中無可用之錨點)","noEmail":"請輸入電子郵件","noUrl":"請輸入連結 URL","other":"<其他>","popupDependent":"獨立 (Netscape)","popupFeatures":"快顯視窗功能","popupFullScreen":"全螢幕 (IE)","popupLeft":"左側位置","popupLocationBar":"位置列","popupMenuBar":"功能表列","popupResizable":"可調大小","popupScrollBars":"捲軸","popupStatusBar":"狀態列","popupToolbar":"工具列","popupTop":"頂端位置","rel":"關係","selectAnchor":"選取一個錨點","styles":"樣式","tabIndex":"定位順序","target":"目標","targetFrame":"<框架>","targetFrameName":"目標框架名稱","targetPopup":"<快顯視窗>","targetPopupName":"快顯視窗名稱","title":"連結","toAnchor":"文字中的錨點連結","toEmail":"電子郵件","toUrl":"網址","toolbar":"連結","type":"連結類型","unlink":"取消連結","upload":"上傳"},"list":{"bulletedlist":"插入/移除項目符號清單","numberedlist":"插入/移除編號清單清單"},"magicline":{"title":"在此插入段落"},"maximize":{"maximize":"最大化","minimize":"最小化"},"pastetext":{"button":"貼成純文字","title":"貼成純文字"},"pastefromword":{"confirmCleanup":"您想貼上的文字似乎是自 Word 複製而來,請問您是否要先清除 Word 的格式後再行貼上?","error":"由於發生內部錯誤,無法清除清除 Word 的格式。","title":"自 Word 貼上","toolbar":"自 Word 貼上"},"removeformat":{"toolbar":"移除格式"},"sourcearea":{"toolbar":"原始碼"},"specialchar":{"options":"特殊字元選項","title":"選取特殊字元","toolbar":"插入特殊字元"},"scayt":{"about":"關於即時拼寫檢查","aboutTab":"關於","addWord":"添加單詞","allCaps":"Ignore All-Caps Words","dic_create":"Create","dic_delete":"Delete","dic_field_name":"Dictionary name","dic_info":"Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.","dic_rename":"Rename","dic_restore":"Restore","dictionariesTab":"字典","disable":"關閉即時拼寫檢查","emptyDic":"字典名不應為空.","enable":"啟用即時拼寫檢查","ignore":"忽略","ignoreAll":"全部忽略","ignoreDomainNames":"Ignore Domain Names","langs":"語言","languagesTab":"語言","mixedCase":"Ignore Words with Mixed Case","mixedWithDigits":"Ignore Words with Numbers","moreSuggestions":"更多拼寫建議","opera_title":"Not supported by Opera","options":"選項","optionsTab":"選項","title":"即時拼寫檢查","toggle":"啟用/關閉即時拼寫檢查","noSuggestions":"No suggestion"},"stylescombo":{"label":"樣式","panelTitle":"Formatting Styles","panelTitle1":"區塊樣式","panelTitle2":"內嵌樣式","panelTitle3":"物件樣式"},"table":{"border":"框線大小","caption":"標題","cell":{"menu":"儲存格","insertBefore":"前方插入儲存格","insertAfter":"後方插入儲存格","deleteCell":"刪除儲存格","merge":"合併儲存格","mergeRight":"向右合併","mergeDown":"向下合併","splitHorizontal":"水平分割儲存格","splitVertical":"垂直分割儲存格","title":"儲存格屬性","cellType":"儲存格類型","rowSpan":"Rows Span","colSpan":"Columns Span","wordWrap":"自動斷行","hAlign":"水平對齊","vAlign":"垂直對齊","alignBaseline":"基準線","bgColor":"背景顏色","borderColor":"框線顏色","data":"資料","header":"Header","yes":"是","no":"否","invalidWidth":"儲存格寬度必須為數字。","invalidHeight":"儲存格高度必須為數字。","invalidRowSpan":"Rows span must be a whole number.","invalidColSpan":"Columns span must be a whole number.","chooseColor":"選擇"},"cellPad":"Cell padding","cellSpace":"Cell spacing","column":{"menu":"行","insertBefore":"Insert Column Before","insertAfter":"Insert Column After","deleteColumn":"Delete Columns"},"columns":"行","deleteTable":"Delete Table","headers":"Headers","headersBoth":"Both","headersColumn":"First column","headersNone":"無","headersRow":"First Row","invalidBorder":"框線大小必須是整數。","invalidCellPadding":"Cell padding must be a positive number.","invalidCellSpacing":"Cell spacing must be a positive number.","invalidCols":"Number of columns must be a number greater than 0.","invalidHeight":"Table height must be a number.","invalidRows":"Number of rows must be a number greater than 0.","invalidWidth":"Table width must be a number.","menu":"Table Properties","row":{"menu":"列","insertBefore":"Insert Row Before","insertAfter":"Insert Row After","deleteRow":"Delete Rows"},"rows":"列","summary":"Summary","title":"Table Properties","toolbar":"Table","widthPc":"百分比","widthPx":"像素","widthUnit":"寬度單位"},"undo":{"redo":"取消復原","undo":"復原"},"wsc":{"btnIgnore":"忽略","btnIgnoreAll":"全部忽略","btnReplace":"取代","btnReplaceAll":"全部取代","btnUndo":"復原","changeTo":"更改為","errorLoading":"無法聯系侍服器: %s.","ieSpellDownload":"尚未安裝拼字檢查元件。您是否想要現在下載?","manyChanges":"拼字檢查完成:更改了 %1 個單字","noChanges":"拼字檢查完成:未更改任何單字","noMispell":"拼字檢查完成:未發現拼字錯誤","noSuggestions":"- 無建議值 -","notAvailable":"抱歉,服務目前暫不可用","notInDic":"不在字典中","oneChange":"拼字檢查完成:更改了 1 個單字","progress":"進行拼字檢查中…","title":"拼字檢查","toolbar":"拼字檢查"}}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js new file mode 100644 index 0000000..b77792a --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("a11yHelp",function(j){var l=j.lang.a11yhelp,m=CKEDITOR.tools.getNextId(),d={8:"BACKSPACE",9:"TAB",13:"ENTER",16:"SHIFT",17:"CTRL",18:"ALT",19:"PAUSE",20:"CAPSLOCK",27:"ESCAPE",33:"PAGE UP",34:"PAGE DOWN",35:"END",36:"HOME",37:"LEFT ARROW",38:"UP ARROW",39:"RIGHT ARROW",40:"DOWN ARROW",45:"INSERT",46:"DELETE",91:"LEFT WINDOW KEY",92:"RIGHT WINDOW KEY",93:"SELECT KEY",96:"NUMPAD 0",97:"NUMPAD 1",98:"NUMPAD 2",99:"NUMPAD 3",100:"NUMPAD 4",101:"NUMPAD 5",102:"NUMPAD 6",103:"NUMPAD 7", +104:"NUMPAD 8",105:"NUMPAD 9",106:"MULTIPLY",107:"ADD",109:"SUBTRACT",110:"DECIMAL POINT",111:"DIVIDE",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NUM LOCK",145:"SCROLL LOCK",186:"SEMI-COLON",187:"EQUAL SIGN",188:"COMMA",189:"DASH",190:"PERIOD",191:"FORWARD SLASH",192:"GRAVE ACCENT",219:"OPEN BRACKET",220:"BACK SLASH",221:"CLOSE BRAKET",222:"SINGLE QUOTE"};d[CKEDITOR.ALT]="ALT";d[CKEDITOR.SHIFT]="SHIFT";d[CKEDITOR.CTRL]="CTRL"; +var e=[CKEDITOR.ALT,CKEDITOR.SHIFT,CKEDITOR.CTRL],n=/\$\{(.*?)\}/g,q=function(){var o=j.keystrokeHandler.keystrokes,f={},b;for(b in o)f[o[b]]=b;return function(b,g){var a;if(f[g]){a=f[g];for(var h,i,k=[],c=0;c<e.length;c++)i=e[c],h=a/e[c],1<h&&2>=h&&(a-=i,k.push(d[i]));k.push(d[a]||String.fromCharCode(a));a=k.join("+")}else a=b;return a}}();return{title:l.title,minWidth:600,minHeight:400,contents:[{id:"info",label:j.lang.common.generalTab,expand:!0,elements:[{type:"html",id:"legends",style:"white-space:normal;", +focus:function(){this.getElement().focus()},html:function(){for(var d='<div class="cke_accessibility_legend" role="document" aria-labelledby="'+m+'_arialbl" tabIndex="-1">%1</div><span id="'+m+'_arialbl" class="cke_voice_label">'+l.contents+" </span>",f=[],b=l.legend,j=b.length,g=0;g<j;g++){for(var a=b[g],h=[],i=a.items,k=i.length,c=0;c<k;c++){var e=i[c],p=e.legend.replace(n,q);p.match(n)||h.push("<dt>%1</dt><dd>%2</dd>".replace("%1",e.name).replace("%2",p))}f.push("<h1>%1</h1><dl>%2</dl>".replace("%1", +a.name).replace("%2",h.join("")))}return d.replace("%1",f.join(""))}()+'<style type="text/css">.cke_accessibility_legend{width:600px;height:400px;padding-right:5px;overflow-y:auto;overflow-x:hidden;}.cke_browser_quirks .cke_accessibility_legend,.cke_browser_ie6 .cke_accessibility_legend{height:390px}.cke_accessibility_legend *{white-space:normal;}.cke_accessibility_legend h1{font-size: 20px;border-bottom: 1px solid #AAA;margin: 5px 0px 15px;}.cke_accessibility_legend dl{margin-left: 5px;}.cke_accessibility_legend dt{font-size: 13px;font-weight: bold;}.cke_accessibility_legend dd{margin:10px}</style>'}]}], +buttons:[CKEDITOR.dialog.cancelButton]}}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/_translationstatus.txt b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/_translationstatus.txt new file mode 100644 index 0000000..989ea46 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/_translationstatus.txt @@ -0,0 +1,25 @@ +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license + +cs.js Found: 30 Missing: 0 +cy.js Found: 30 Missing: 0 +da.js Found: 12 Missing: 18 +de.js Found: 30 Missing: 0 +el.js Found: 25 Missing: 5 +eo.js Found: 30 Missing: 0 +fa.js Found: 30 Missing: 0 +fi.js Found: 30 Missing: 0 +fr.js Found: 30 Missing: 0 +gu.js Found: 12 Missing: 18 +he.js Found: 30 Missing: 0 +it.js Found: 30 Missing: 0 +mk.js Found: 5 Missing: 25 +nb.js Found: 30 Missing: 0 +nl.js Found: 30 Missing: 0 +no.js Found: 30 Missing: 0 +pt-br.js Found: 30 Missing: 0 +ro.js Found: 6 Missing: 24 +tr.js Found: 30 Missing: 0 +ug.js Found: 27 Missing: 3 +vi.js Found: 6 Missing: 24 +zh-cn.js Found: 30 Missing: 0 diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ar.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ar.js new file mode 100644 index 0000000..8aa0328 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ar.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","ar",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"عام",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."}, +{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."}, +{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command", +legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."}, +{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/bg.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/bg.js new file mode 100644 index 0000000..486e22e --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/bg.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","bg",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"Общо",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."}, +{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."}, +{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command", +legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."}, +{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ca.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ca.js new file mode 100644 index 0000000..53b670a --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ca.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","ca",{title:"Instruccions d'Accessibilitat",contents:"Continguts de l'Ajuda. Per tancar aquest quadre de diàleg premi ESC.",legend:[{name:"General",items:[{name:"Editor de barra d'eines",legend:"Premi ${toolbarFocus} per desplaçar-se per la barra d'eines. Vagi en el següent i anterior grup de barra d'eines amb TAB i SHIFT-TAB. Vagi en el següent i anterior botó de la barra d'eines amb RIGHT ARROW i LEFT ARROW. Premi SPACE o ENTER per activar el botó de la barra d'eines."}, +{name:"Editor de quadre de diàleg",legend:"Dins d'un quadre de diàleg, premi la tecla TAB per desplaçar-se al següent camp del quadre de diàleg, premi SHIFT + TAB per desplaçar-se a l'anterior camp, premi ENTER per acceptar el quadre de diàleg, premi ESC per cancel·lar el quadre de diàleg. Per els quadres de diàleg que tenen diverses pestanyes, premi ALT + F10 per anar a la llista de pestanyes. Després podrà desplaçar-se a la següent pestanya amb TAB o RIGHT ARROW. Anar a la pestanya anterior amb SHIFT + TAB o LEFT ARROW. Premi SPACE o ENTER per seleccionar la pestanya."}, +{name:"Editor de menú contextual",legend:"Premi ${contextMenu} o APPLICATION KEY per obrir el menú contextual. Després desplacis a la següent opció del menú amb TAB o DOWN ARROW. Desplacis a l'anterior opció amb SHIFT+TAB o UP ARROW. Premi SPACE o ENTER per seleccionar l'opció del menú. Obri el submenú de l'actual opció utilitzant SPACE o ENTER o RIGHT ARROW. Pot tornar a l'opció del menú pare amb ESC o LEFT ARROW. Tanqui el menú contextual amb ESC."},{name:"Editor de caixa de llista",legend:"Dins d'un quadre de llista, desplacis al següent element de la llista amb TAB o DOWN ARROW. Desplacis a l'anterior element de la llista amb SHIFT + TAB o UP ARROW. Premi SPACE o ENTER per seleccionar l'opció de la llista. Premi ESC per tancar el quadre de llista."}, +{name:"Editor de barra de ruta de l'element",legend:"Premi ${elementsPathFocus} per anar als elements de la barra de ruta. Desplacis al botó de l'element següent amb TAB o RIGHT ARROW. Desplacis a l'anterior botó amb SHIFT+TAB o LEFT ARROW. Premi SPACE o ENTER per seleccionar l'element a l'editor."}]},{name:"Ordres",items:[{name:"Desfer ordre",legend:"Premi ${undo}"},{name:"Refer ordre",legend:"Premi ${redo}"},{name:"Ordre negreta",legend:"Premi ${bold}"},{name:"Ordre cursiva",legend:"Premi ${italic}"}, +{name:"Ordre subratllat",legend:"Premi ${underline}"},{name:"Ordre enllaç",legend:"Premi ${link}"},{name:"Ordre amagar barra d'eines",legend:"Premi ${toolbarCollapse}"},{name:"Ordre per accedir a l'anterior espai enfocat",legend:"Premi ${accessPreviousSpace} per accedir a l'enfocament d'espai més proper inabastable abans del símbol d'intercalació, per exemple: dos elements HR adjacents. Repetiu la combinació de tecles per arribar a enfocaments d'espais distants."},{name:"Ordre per accedir al següent espai enfocat", +legend:"Premi ${accessNextSpace} per accedir a l'enfocament d'espai més proper inabastable després del símbol d'intercalació, per exemple: dos elements HR adjacents. Repetiu la combinació de tecles per arribar a enfocaments d'espais distants."},{name:"Ajuda d'accessibilitat",legend:"Premi ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/cs.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/cs.js new file mode 100644 index 0000000..cb41d4d --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/cs.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","cs",{title:"Instrukce pro přístupnost",contents:"Obsah nápovědy. Pro uzavření tohoto dialogu stiskněte klávesu ESC.",legend:[{name:"Obecné",items:[{name:"Panel nástrojů editoru",legend:"Stiskněte${toolbarFocus} k procházení panelu nástrojů. Přejděte na další a předchozí skupiny pomocí TAB a SHIFT-TAB. Přechod na další a předchozí tlačítko panelu nástrojů je pomocí ŠIPKA VPRAVO nebo ŠIPKA VLEVO. Stisknutím mezerníku nebo klávesy ENTER tlačítko aktivujete."},{name:"Dialogové okno editoru", +legend:"Uvnitř dialogového okna stiskněte TAB pro přesunutí na další pole, stiskněte SHIFT + TAB pro přesun na předchozí pole, stiskněte ENTER pro odeslání dialogu, stiskněte ESC pro jeho zrušení. Pro dialogová okna, která mají mnoho karet stiskněte ALT + F10 pr oprocházení seznamu karet. Pak se přesuňte na další kartu pomocí TAB nebo ŠIPKA VPRAVO. Pro přesun na předchozí stiskněte SHIFT + TAB nebo ŠIPKA VLEVO. Stiskněte MEZERNÍK nebo ENTER pro vybrání stránky karet."},{name:"Kontextové menu editoru", +legend:"Stiskněte ${contextMenu} nebo klávesu APPLICATION k otevření kontextového menu. Pak se přesuňte na další možnost menu pomocí TAB nebo ŠIPKY DOLŮ. Přesuňte se na předchozí možnost pomocí SHIFT+TAB nebo ŠIPKY NAHORU. Stiskněte MEZERNÍK nebo ENTER pro zvolení možnosti menu. Podmenu současné možnosti otevřete pomocí MEZERNÍKU nebo ENTER či ŠIPKY DOLEVA. Kontextové menu uzavřete stiskem ESC."},{name:"Rámeček seznamu editoru",legend:"Uvnitř rámečku seznamu se přesunete na další položku menu pomocí TAB nebo ŠIPKA DOLŮ. Na předchozí položku se přesunete SHIFT + TAB nebo ŠIPKA NAHORU. Stiskněte MEZERNÍK nebo ENTER pro zvolení možnosti seznamu. Stiskněte ESC pro uzavření seznamu."}, +{name:"Lišta cesty prvku v editoru",legend:"Stiskněte ${elementsPathFocus} pro procházení lišty cesty prvku. Na další tlačítko prvku se přesunete pomocí TAB nebo ŠIPKA VPRAVO. Na předchozí položku se přesunete pomocí SHIFT + TAB nebo ŠIPKA VLEVO. Stiskněte MEZERNÍK nebo ENTER pro vybrání prvku v editoru."}]},{name:"Příkazy",items:[{name:" Příkaz Zpět",legend:"Stiskněte ${undo}"},{name:" Příkaz Znovu",legend:"Stiskněte ${redo}"},{name:" Příkaz Tučné",legend:"Stiskněte ${bold}"},{name:" Příkaz Kurzíva", +legend:"Stiskněte ${italic}"},{name:" Příkaz Podtržení",legend:"Stiskněte ${underline}"},{name:" Příkaz Odkaz",legend:"Stiskněte ${link}"},{name:" Příkaz Skrýt panel nástrojů",legend:"Stiskněte ${toolbarCollapse}"},{name:"Příkaz pro přístup k předchozímu prostoru zaměření",legend:"Stiskněte ${accessPreviousSpace} pro přístup k nejbližšímu nedosažitelnému prostoru zaměření před stříškou, například: dva přilehlé prvky HR. Pro dosažení vzdálených prostorů zaměření tuto kombinaci kláves opakujte."},{name:"Příkaz pro přístup k dalšímu prostoru zaměření", +legend:"Stiskněte ${accessNextSpace} pro přístup k nejbližšímu nedosažitelnému prostoru zaměření po stříšce, například: dva přilehlé prvky HR. Pro dosažení vzdálených prostorů zaměření tuto kombinaci kláves opakujte."},{name:" Nápověda přístupnosti",legend:"Stiskněte ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/cy.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/cy.js new file mode 100644 index 0000000..abc48aa --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/cy.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","cy",{title:"Canllawiau Hygyrchedd",contents:"Cynnwys Cymorth. I gau y deialog hwn, pwyswch ESC.",legend:[{name:"Cyffredinol",items:[{name:"Bar Offer y Golygydd",legend:"Pwyswch $ {toolbarFocus} i fynd at y bar offer. Symudwch i'r grŵp bar offer nesaf a blaenorol gyda TAB a SHIFT-TAB. Symudwch i'r botwm bar offer nesaf a blaenorol gyda SAETH DDE neu SAETH CHWITH. Pwyswch SPACE neu ENTER i wneud botwm y bar offer yn weithredol."},{name:"Deialog y Golygydd",legend:"Tu mewn i'r deialog, pwyswch TAB i fynd i'r maes nesaf ar y deialog, pwyswch SHIFT + TAB i symud i faes blaenorol, pwyswch ENTER i gyflwyno'r deialog, pwyswch ESC i ddiddymu'r deialog. Ar gyfer deialogau sydd â thudalennau aml-tab, pwyswch ALT + F10 i lywio'r tab-restr. Yna symudwch i'r tab nesaf gyda TAB neu SAETH DDE. Symudwch i dab blaenorol gyda SHIFT + TAB neu'r SAETH CHWITH. Pwyswch SPACE neu ENTER i ddewis y dudalen tab."}, +{name:"Dewislen Cyd-destun y Golygydd",legend:"Pwyswch $ {contextMenu} neu'r ALLWEDD 'APPLICATION' i agor y ddewislen cyd-destun. Yna symudwch i'r opsiwn ddewislen nesaf gyda'r TAB neu'r SAETH I LAWR. Symudwch i'r opsiwn blaenorol gyda SHIFT + TAB neu'r SAETH I FYNY. Pwyswch SPACE neu ENTER i ddewis yr opsiwn ddewislen. Agorwch is-dewislen yr opsiwn cyfredol gyda SPACE neu ENTER neu SAETH DDE. Ewch yn ôl i'r eitem ar y ddewislen uwch gydag ESC neu SAETH CHWITH. Ceuwch y ddewislen cyd-destun gydag ESC."}, +{name:"Blwch Rhestr y Golygydd",legend:"Tu mewn y blwch rhestr, ewch i'r eitem rhestr nesaf gyda TAB neu'r SAETH I LAWR. Symudwch i restr eitem flaenorol gyda SHIFT + TAB neu SAETH I FYNY. Pwyswch SPACE neu ENTER i ddewis yr opsiwn o'r rhestr. Pwyswch ESC i gau'r rhestr."},{name:"Bar Llwybr Elfen y Golygydd",legend:"Pwyswch ${elementsPathFocus} i fynd i'r bar llwybr elfennau. Symudwch i fotwm yr elfen nesaf gyda TAB neu SAETH DDE. Symudwch i fotwm blaenorol gyda SHIFT + TAB neu SAETH CHWITH. Pwyswch SPACE neu ENTER i ddewis yr elfen yn y golygydd."}]}, +{name:"Gorchmynion",items:[{name:"Gorchymyn dadwneud",legend:"Pwyswch ${undo}"},{name:"Gorchymyn ailadrodd",legend:"Pwyswch ${redo}"},{name:"Gorchymyn Bras",legend:"Pwyswch ${bold}"},{name:"Gorchymyn italig",legend:"Pwyswch ${italig}"},{name:"Gorchymyn tanlinellu",legend:"Pwyso ${underline}"},{name:"Gorchymyn dolen",legend:"Pwyswch ${link}"},{name:"Gorchymyn Cwympo'r Dewislen",legend:"Pwyswch ${toolbarCollapse}"},{name:"Myned i orchymyn bwlch ffocws blaenorol",legend:"Pwyswch ${accessPreviousSpace} i fyned i'r \"blwch ffocws sydd methu ei gyrraedd\" cyn y caret, er enghraifft: dwy elfen HR drws nesaf i'w gilydd. AIladroddwch y cyfuniad allwedd i gyrraedd bylchau ffocws pell."}, +{name:"Ewch i'r gorchymyn blwch ffocws nesaf",legend:"Pwyswch ${accessNextSpace} i fyned i'r blwch ffocws agosaf nad oes modd ei gyrraedd ar ôl y caret, er enghraifft: dwy elfen HR drws nesaf i'w gilydd. Ailadroddwch y cyfuniad allwedd i gyrraedd blychau ffocws pell."},{name:"Cymorth Hygyrchedd",legend:"Pwyswch ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/da.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/da.js new file mode 100644 index 0000000..0cdd952 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/da.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","da",{title:"Tilgængelighedsinstrukser",contents:"Onlinehjælp. For at lukke dette vindue klik ESC",legend:[{name:"Generelt",items:[{name:"Editor værktøjslinje",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."}, +{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."}, +{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Kommandoer",items:[{name:"Fortryd kommando",legend:"Klik på ${undo}"},{name:"Gentag kommando",legend:"Klik ${redo}"},{name:" Bold command",legend:"Klik ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command", +legend:"Klik ${underline}"},{name:" Link command",legend:"Klik ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."}, +{name:" Accessibility Help",legend:"Kilk ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/de.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/de.js new file mode 100644 index 0000000..969901b --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/de.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","de",{title:"Barrierefreiheitinformationen",contents:"Hilfeinhalt. Um den Dialog zu schliessen die Taste 'ESC' drücken.",legend:[{name:"Allgemein",items:[{name:"Editor Symbolleiste",legend:"Drücken Sie ${toolbarFocus} auf der Symbolleiste. Gehen Sie zur nächsten oder vorherigen Symbolleistengruppe mit TAB und SHIFT-TAB. Gehen Sie zur nächsten oder vorherigen Symbolleiste auf die Schaltfläche mit dem RECHTS- oder LINKS-Pfeil. Drücken Sie die Leertaste oder Eingabetaste, um die Schaltfläche in der Symbolleiste aktivieren."}, +{name:"Editor Dialog",legend:"Innerhalb des Dialogs drücken Sie TAB um zum nächsten Dialogfeld zu gelangen, drücken Sie SHIFT-TAG um zum vorherigen Feld zu wechseln, drücken Sie ENTER um den Dialog abzusenden und ESC um den Dialog zu abzubrechen. Um zwischen den Reitern innerhalb eines Dialogs zu wechseln drücken sie ALT-F10. Um zum nächsten Reiter zu gelangen können Sie TAB oder die rechte Pfeiltaste. Zurück gelangt man mit SHIFT-TAB oder der linken Pfeiltaste. Mit der Leertaste oder Enter kann man den Reiter auswählen."}, +{name:"Editor Kontextmenü",legend:"Dürcken Sie ${contextMenu} oder die Anwendungstaste um das Kontextmenü zu öffnen. Man kann die Pfeiltasten zum Wechsel benutzen. Mit der Leertaste oder der Enter-Taste kann man den Menüpunkt aufrufen. Schliessen Sie das Kontextmenü mit der ESC-Taste."},{name:"Editor Listen",legend:"Innerhalb einer Listenbox kann man mit der TAB-Taste oder den Pfeilrunter-Taste den nächsten Menüeintrag wählen. Mit der Shift-TAB Tastenkombination oder der Pfeilhoch-Taste gelangt man zum vorherigen Menüpunkt. Mit der Leertaste oder Enter kann man den Menüpunkt auswählen. Drücken Sie ESC zum Verlassen des Menüs."}, +{name:"Editor Elementpfadleiste",legend:"Drücken Sie ${elementsPathFocus} um sich durch die Pfadleiste zu bewegen. Um zum nächsten Element zu gelangen drücken Sie TAB oder die Pfeilrechts-Taste. Zum vorherigen Element gelangen Sie mit der SHIFT-TAB oder der Pfeillinks-Taste. Drücken Sie die Leertaste oder Enter um das Element auszuwählen."}]},{name:"Befehle",items:[{name:"Wiederholen Befehl",legend:"Drücken Sie ${undo}"},{name:"Rückgängig Befehl",legend:"Drücken Sie ${redo}"},{name:"Fettschrift Befehl", +legend:"Drücken Sie ${bold}"},{name:"Italic Befehl",legend:"Drücken Sie ${italic}"},{name:"Unterstreichung Befehl",legend:"Drücken Sie ${underline}"},{name:"Link Befehl",legend:"Drücken Sie ${link}"},{name:"Symbolleiste zuammenklappen Befehl",legend:"Drücken Sie ${toolbarCollapse}"},{name:"Zugang bisheriger Fokussierung Raumbefehl ",legend:"Drücken Sie ${accessPreviousSpace} auf den am nächsten nicht erreichbar Fokus-Abstand vor die Einfügemarke zugreifen: zwei benachbarte HR-Elemente. Wiederholen Sie die Tastenkombination um entfernte Fokusräume zu erreichen. "}, +{name:"Zugang nächster Schwerpunkt Raumbefehl ",legend:"Drücken Sie $ { accessNextSpace }, um den nächsten unerreichbar Fokus Leerzeichen nach dem Cursor zum Beispiel auf: zwei benachbarten HR Elemente. Wiederholen Sie die Tastenkombination zum fernen Fokus Bereiche zu erreichen. "},{name:"Eingabehilfen",legend:"Drücken Sie ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/el.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/el.js new file mode 100644 index 0000000..ba394e8 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/el.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","el",{title:"Οδηγίες Προσβασιμότητας",contents:"Περιεχόμενα Βοήθειας. Πατήστε ESC για κλείσιμο.",legend:[{name:"Γενικά",items:[{name:"Εργαλειοθήκη Επεξεργαστή",legend:"Πατήστε ${toolbarFocus} για να περιηγηθείτε στην γραμμή εργαλείων. Μετακινηθείτε ανάμεσα στις ομάδες της γραμμής εργαλείων με TAB και SHIFT-TAB. Μετακινηθείτε ανάμεσα στα κουμπιά εργαλείων με το ΔΕΞΙ ή ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να ενεργοποιήσετε το ενεργό κουμπί εργαλείου."},{name:"Παράθυρο Διαλόγου Επεξεργαστή", +legend:"Μέσα σε ένα παράθυρο διαλόγου, πατήστε TAB για να μεταβείτε στο επόμενο πεδίο ή SHIFT + TAB για να μεταβείτε στο προηγούμενο. Πατήστε ENTER για να υποβάλετε την φόρμα. Πατήστε ESC για να ακυρώσετε την διαδικασία της φόρμας. Για παράθυρα διαλόγων που έχουν πολλές σελίδες σε καρτέλες πατήστε ALT + F10 για να μεταβείτε στην λίστα των καρτελών. Στην συνέχεια μπορείτε να μεταβείτε στην επόμενη καρτέλα πατώντας το TAB ή το ΔΕΞΙ ΒΕΛΑΚΙ. Μπορείτε να μεταβείτε στην προηγούμενη καρτέλα πατώντας SHIFT + TAB ή το ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξτε την καρτέλα για προβολή."}, +{name:"Αναδυόμενο Μενού Επεξεργαστή",legend:"Πατήστε ${contextMenu} ή APPLICATION KEY για να ανοίξετε το αναδυόμενο μενού. Μετά μετακινηθείτε στην επόμενη επιλογή του μενού με TAB ή ΚΑΤΩ ΒΕΛΑΚΙ. Μετακινηθείτε στην προηγούμενη επιλογή με SHIFT+TAB ή το ΠΑΝΩ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξτε το τρέχων στοιχείο. Ανοίξτε το αναδυόμενο μενού της τρέχουσας επιλογής με ΔΙΑΣΤΗΜΑ ή ENTER ή το ΔΕΞΙ ΒΕΛΑΚΙ. Μεταβείτε πίσω στο αρχικό στοιχείο μενού με το ESC ή το ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Κλείστε το αναδυόμενο μενού με ESC."}, +{name:"Κουτί Λίστας Επεξεργαστών",legend:"Μέσα σε ένα κουτί λίστας, μετακινηθείτε στο επόμενο στοιχείο με TAB ή ΚΑΤΩ ΒΕΛΑΚΙ. Μετακινηθείτε στο προηγούμενο στοιχείο με SHIFT + TAB ή το ΠΑΝΩ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξετε ένα στοιχείο. Πατήστε ESC για να κλείσετε το κουτί της λίστας."},{name:"Μπάρα Διαδρομών Στοιχείων Επεξεργαστή",legend:"Πατήστε ${elementsPathFocus} για να περιηγηθείτε στην μπάρα διαδρομών στοιχείων του επεξεργαστή. Μετακινηθείτε στο κουμπί του επόμενου στοιχείου με το TAB ή το ΔΕΞΙ ΒΕΛΑΚΙ. Μετακινηθείτε στο κουμπί του προηγούμενου στοιχείου με το SHIFT+TAB ή το ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Πατήστε ΔΙΑΣΤΗΜΑ ή ENTER για να επιλέξετε το στοιχείο στον επεξεργαστή."}]}, +{name:"Εντολές",items:[{name:"Εντολή αναίρεσης",legend:"Πατήστε ${undo}"},{name:"Εντολή επανάληψης",legend:"Πατήστε ${redo}"},{name:"Εντολή έντονης γραφής",legend:"Πατήστε ${bold}"},{name:"Εντολή πλάγιας γραφής",legend:"Πατήστε ${italic}"},{name:"Εντολή υπογράμμισης",legend:"Πατήστε ${underline}"},{name:"Εντολή συνδέσμου",legend:"Πατήστε ${link}"},{name:"Εντολή Σύμπτηξης Εργαλειοθήκης",legend:"Πατήστε ${toolbarCollapse}"},{name:"Πρόσβαση στην προηγούμενη εντολή του χώρου εστίασης ",legend:"Πατήστε ${accessPreviousSpace} για να έχετε πρόσβαση στον πιο κοντινό χώρο εστίασης πριν το δρομέα, για παράδειγμα: δύο παρακείμενα στοιχεία ΥΕ. Επαναλάβετε το συνδυασμό πλήκτρων για να φθάσετε στους χώρους μακρινής εστίασης. "}, +{name:"Πρόσβαση στην επόμενη εντολή του χώρου εστίασης",legend:"Πατήστε ${accessNextSpace} για να έχετε πρόσβαση στον πιο κοντινό χώρο εστίασης μετά το δρομέα, για παράδειγμα: δύο παρακείμενα στοιχεία ΥΕ. Επαναλάβετε το συνδυασμό πλήκτρων για τους χώρους μακρινής εστίασης. "},{name:"Βοήθεια Προσβασιμότητας",legend:"Πατήστε ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/en.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/en.js new file mode 100644 index 0000000..5deb84e --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/en.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","en",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"General",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."}, +{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."}, +{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command", +legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."}, +{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/eo.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/eo.js new file mode 100644 index 0000000..73bdd3a --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/eo.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","eo",{title:"Uzindikoj pri atingeblo",contents:"Helpilenhavo. Por fermi tiun dialogon, premu la ESKAPAN klavon.",legend:[{name:"Ĝeneralaĵoj",items:[{name:"Ilbreto de la redaktilo",legend:"Premu ${toolbarFocus} por atingi la ilbreton. Moviĝu al la sekva aŭ antaŭa grupoj de la ilbreto per la klavoj TABA kaj MAJUSKLIGA-TABA. Moviĝu al la sekva aŭ antaŭa butonoj de la ilbreto per la klavoj SAGO DEKSTREN kaj SAGO MALDEKSTREN. Premu la SPACETklavon aŭ la ENENklavon por aktivigi la ilbretbutonon."}, +{name:"Redaktildialogo",legend:"En dialogo, premu la TABAN klavon por navigi al la sekva dialogkampo, premu la MAJUSKLIGAN + TABAN klavojn por reveni al la antaŭa kampo, premu la ENENklavon por sendi la dialogon, premu la ESKAPAN klavon por nuligi la dialogon. Por dialogoj kun pluraj retpaĝoj sub langetoj, premu ALT + F10 por navigi al la langetlisto. Poste moviĝu al la sekva langeto per la klavo TABA aŭ SAGO DEKSTREN. Moviĝu al la antaŭa langeto per la klavoj MAJUSKLIGA + TABA aŭ SAGO MALDEKSTREN. Premu la SPACETklavon aŭ la ENENklavon por selekti la langetretpaĝon."}, +{name:"Kunteksta menuo de la redaktilo",legend:"Premu ${contextMenu} aŭ entajpu la KLAVKOMBINAĴON por malfermi la kuntekstan menuon. Poste moviĝu al la sekva opcio de la menuo per la klavoj TABA aŭ SAGO SUBEN. Moviĝu al la antaŭa opcio per la klavoj MAJUSKLGA + TABA aŭ SAGO SUPREN. Premu la SPACETklavon aŭ ENENklavon por selekti la menuopcion. Malfermu la submenuon de la kuranta opcio per la SPACETklavo aŭ la ENENklavo aŭ la SAGO DEKSTREN. Revenu al la elemento de la patra menuo per la klavoj ESKAPA aŭ SAGO MALDEKSTREN. Fermu la kuntekstan menuon per la ESKAPA klavo."}, +{name:"Fallisto de la redaktilo",legend:"En fallisto, moviĝu al la sekva listelemento per la klavoj TABA aŭ SAGO SUBEN. Moviĝu al la antaŭa listelemento per la klavoj MAJUSKLIGA + TABA aŭ SAGO SUPREN. Premu la SPACETklavon aŭ ENENklavon por selekti la opcion en la listo. Premu la ESKAPAN klavon por fermi la falmenuon."},{name:"Breto indikanta la vojon al la redaktilelementoj",legend:"Premu ${elementsPathFocus} por navigi al la breto indikanta la vojon al la redaktilelementoj. Moviĝu al la butono de la sekva elemento per la klavoj TABA aŭ SAGO DEKSTREN. Moviĝu al la butono de la antaŭa elemento per la klavoj MAJUSKLIGA + TABA aŭ SAGO MALDEKSTREN. Premu la SPACETklavon aŭ ENENklavon por selekti la elementon en la redaktilo."}]}, +{name:"Komandoj",items:[{name:"Komando malfari",legend:"Premu ${undo}"},{name:"Komando refari",legend:"Premu ${redo}"},{name:"Komando grasa",legend:"Premu ${bold}"},{name:"Komando kursiva",legend:"Premu ${italic}"},{name:"Komando substreki",legend:"Premu ${underline}"},{name:"Komando ligilo",legend:"Premu ${link}"},{name:"Komando faldi la ilbreton",legend:"Premu ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."}, +{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:"Helpilo pri atingeblo",legend:"Premu ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/es.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/es.js new file mode 100644 index 0000000..5e6bdb5 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/es.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","es",{title:"Instrucciones de accesibilidad",contents:"Ayuda. Para cerrar presione ESC.",legend:[{name:"General",items:[{name:"Barra de herramientas del editor",legend:'Presiona ${toolbarFocus} para navegar por la barra de herramientas. Para moverse por los distintos grupos de herramientas usa las teclas TAB y MAY-TAB. Para moverse por las distintas herramientas usa FLECHA DERECHA o FECHA IZQUIERDA. Presiona "espacio" o "intro" para activar la herramienta.'},{name:"Editor de diálogo", +legend:"Dentro de un cuadro de diálogo, presione la tecla TAB para desplazarse al campo siguiente del cuadro de diálogo, pulse SHIFT + TAB para desplazarse al campo anterior, pulse ENTER para presentar cuadro de diálogo, pulse la tecla ESC para cancelar el diálogo. Para los diálogos que tienen varias páginas, presione ALT + F10 para navegar a la pestaña de la lista. Luego pasar a la siguiente pestaña con TAB o FLECHA DERECHA. Para ir a la ficha anterior con SHIFT + TAB o FLECHA IZQUIERDA. Presione ESPACIO o ENTRAR para seleccionar la página de ficha."}, +{name:"Editor del menú contextual",legend:"Presiona ${contextMenu} o TECLA MENÚ para abrir el menú contextual. Entonces muévete a la siguiente opción del menú con TAB o FLECHA ABAJO. Muévete a la opción previa con SHIFT + TAB o FLECHA ARRIBA. Presiona ESPACIO o ENTER para seleccionar la opción del menú. Abre el submenú de la opción actual con ESPACIO o ENTER o FLECHA DERECHA. Regresa al elemento padre del menú con ESC o FLECHA IZQUIERDA. Cierra el menú contextual con ESC."},{name:"Lista del Editor", +legend:"Dentro de una lista, te mueves al siguiente elemento de la lista con TAB o FLECHA ABAJO. Te mueves al elemento previo de la lista con SHIFT + TAB o FLECHA ARRIBA. Presiona ESPACIO o ENTER para elegir la opción de la lista. Presiona ESC para cerrar la lista."},{name:"Barra de Ruta del Elemento en el Editor",legend:"Presiona ${elementsPathFocus} para navegar a los elementos de la barra de ruta. Te mueves al siguiente elemento botón con TAB o FLECHA DERECHA. Te mueves al botón previo con SHIFT + TAB o FLECHA IZQUIERDA. Presiona ESPACIO o ENTER para seleccionar el elemento en el editor."}]}, +{name:"Comandos",items:[{name:"Comando deshacer",legend:"Presiona ${undo}"},{name:"Comando rehacer",legend:"Presiona ${redo}"},{name:"Comando negrita",legend:"Presiona ${bold}"},{name:"Comando itálica",legend:"Presiona ${italic}"},{name:"Comando subrayar",legend:"Presiona ${underline}"},{name:"Comando liga",legend:"Presiona ${liga}"},{name:"Comando colapsar barra de herramientas",legend:"Presiona ${toolbarCollapse}"},{name:"Comando accesar el anterior espacio de foco",legend:"Presiona ${accessPreviousSpace} para accesar el espacio de foco no disponible más cercano anterior al cursor, por ejemplo: dos elementos HR adyacentes. Repite la combinación de teclas para alcanzar espacios de foco distantes."}, +{name:"Comando accesar el siguiente spacio de foco",legend:"Presiona ${accessNextSpace} para accesar el espacio de foco no disponible más cercano después del cursor, por ejemplo: dos elementos HR adyacentes. Repite la combinación de teclas para alcanzar espacios de foco distantes."},{name:"Ayuda de Accesibilidad",legend:"Presiona ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/et.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/et.js new file mode 100644 index 0000000..5cfdb73 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/et.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","et",{title:"Accessibility Instructions",contents:"Abi sisu. Selle dialoogi sulgemiseks vajuta ESC klahvi.",legend:[{name:"Üldine",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."}, +{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."}, +{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command", +legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."}, +{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/fa.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/fa.js new file mode 100644 index 0000000..aa88911 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/fa.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","fa",{title:"دستورالعمل‌های دسترسی",contents:"راهنمای فهرست مطالب. برای بستن این کادر محاوره‌ای ESC را فشار دهید.",legend:[{name:"عمومی",items:[{name:"نوار ابزار ویرایشگر",legend:"${toolbarFocus} را برای باز کردن نوار ابزار بفشارید. با کلید Tab و Shif-Tab در مجموعه نوار ابزار بعدی و قبلی حرکت کنید. برای حرکت در کلید نوار ابزار قبلی و بعدی با کلید جهت‌نمای راست و چپ جابجا شوید. کلید Space یا Enter را برای فعال کردن کلید نوار ابزار بفشارید."},{name:"پنجره محاورهای ویرایشگر", +legend:"در داخل یک پنجره محاورهای، کلید Tab را بفشارید تا به پنجرهی بعدی بروید، Shift+Tab برای حرکت به فیلد قبلی، فشردن Enter برای ثبت اطلاعات پنجره، فشردن Esc برای لغو پنجره محاورهای و برای پنجرههایی که چندین برگه دارند، فشردن Alt+F10 جهت رفتن به Tab-List. در نهایت حرکت به برگه بعدی با Tab یا کلید جهتنمای راست. حرکت به برگه قبلی با Shift+Tab یا کلید جهتنمای چپ. فشردن Space یا Enter برای انتخاب یک برگه."},{name:"منوی متنی ویرایشگر",legend:"${contextMenu} یا کلید برنامههای کاربردی را برای باز کردن منوی متن را بفشارید. سپس میتوانید برای حرکت به گزینه بعدی منو با کلید Tab و یا کلید جهتنمای پایین جابجا شوید. حرکت به گزینه قبلی با Shift+Tab یا کلید جهتنمای بالا. فشردن Space یا Enter برای انتخاب یک گزینه از منو. باز کردن زیر شاخه گزینه منو جاری با کلید Space یا Enter و یا کلید جهتنمای راست و چپ. بازگشت به منوی والد با کلید Esc یا کلید جهتنمای چپ. بستن منوی متن با Esc."}, +{name:"جعبه فهرست ویرایشگر",legend:"در داخل جعبه لیست، قلم دوم از اقلام لیست بعدی را با TAB و یا Arrow Down حرکت دهید. انتقال به قلم دوم از اقلام لیست قبلی را با SHIFT + TAB یا UP ARROW. کلید Space یا ENTER را برای انتخاب گزینه لیست بفشارید. کلید ESC را برای بستن جعبه لیست بفشارید."},{name:"ویرایشگر عنصر نوار راه",legend:"برای رفتن به مسیر عناصر ${elementsPathFocus} را بفشارید. حرکت به کلید عنصر بعدی با کلید Tab یا کلید جهت‌نمای راست. برگشت به کلید قبلی با Shift+Tab یا کلید جهت‌نمای چپ. فشردن Space یا Enter برای انتخاب یک عنصر در ویرایشگر."}]}, +{name:"فرمان‌ها",items:[{name:"بازگشت به آخرین فرمان",legend:"فشردن ${undo}"},{name:"انجام مجدد فرمان",legend:"فشردن ${redo}"},{name:"فرمان درشت کردن متن",legend:"فشردن ${bold}"},{name:"فرمان کج کردن متن",legend:"فشردن ${italic}"},{name:"فرمان زیرخطدار کردن متن",legend:"فشردن ${underline}"},{name:"فرمان پیوند دادن",legend:"فشردن ${link}"},{name:"بستن نوار ابزار فرمان",legend:"فشردن ${toolbarCollapse}"},{name:"دسترسی به فرمان محل تمرکز قبلی",legend:"فشردن ${accessPreviousSpace} برای دسترسی به نزدیک‌ترین فضای قابل دسترسی تمرکز قبل از هشتک، برای مثال: دو عنصر مجاور HR -خط افقی-. تکرار کلید ترکیبی برای رسیدن به فضاهای تمرکز از راه دور."}, +{name:"دسترسی به فضای دستور بعدی",legend:"برای دسترسی به نزدیک‌ترین فضای تمرکز غیر قابل دسترس، ${accessNextSpace} را پس از علامت هشتک بفشارید، برای مثال: دو عنصر مجاور HR -خط افقی-. کلید ترکیبی را برای رسیدن به فضای تمرکز تکرار کنید."},{name:"راهنمای دسترسی",legend:"فشردن ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/fi.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/fi.js new file mode 100644 index 0000000..73ea319 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/fi.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","fi",{title:"Saavutettavuus ohjeet",contents:"Ohjeen sisällöt. Sulkeaksesi tämän dialogin paina ESC.",legend:[{name:"Yleinen",items:[{name:"Editorin työkalupalkki",legend:"Paina ${toolbarFocus} siirtyäksesi työkalupalkkiin. Siirry seuraavaan ja edelliseen työkalupalkin ryhmään TAB ja SHIFT-TAB näppäimillä. Siirry seuraavaan ja edelliseen työkalupainikkeeseen käyttämällä NUOLI OIKEALLE tai NUOLI VASEMMALLE näppäimillä. Paina VÄLILYÖNTI tai ENTER näppäintä aktivoidaksesi työkalupainikkeen."}, +{name:"Editorin dialogi",legend:"Dialogin sisällä, painamalla TAB siirryt seuraavaan dialogin kenttään, painamalla SHIFT+TAB siirryt aiempaan kenttään, painamalla ENTER lähetät dialogin, painamalla ESC peruutat dialogin. Dialogeille joissa on useita välilehtiä, paina ALT+F10 siirtyäksesi välillehtilistaan. Siirtyäksesi seuraavaan välilehteen paina TAB tai NUOLI OIKEALLE. Siirry edelliseen välilehteen painamalla SHIFT+TAB tai nuoli vasemmalle. Paina VÄLILYÖNTI tai ENTER valitaksesi välilehden."},{name:"Editorin oheisvalikko", +legend:"Paina ${contextMenu} tai SOVELLUSPAINIKETTA avataksesi oheisvalikon. Liiku seuraavaan valikon vaihtoehtoon TAB tai NUOLI ALAS näppäimillä. Siirry edelliseen vaihtoehtoon SHIFT+TAB tai NUOLI YLÖS näppäimillä. Paina VÄLILYÖNTI tai ENTER valitaksesi valikon kohdan. Avataksesi nykyisen kohdan alivalikon paina VÄLILYÖNTI tai ENTER tai NUOLI OIKEALLE painiketta. Siirtyäksesi takaisin valikon ylemmälle tasolle paina ESC tai NUOLI vasemmalle. Oheisvalikko suljetaan ESC painikkeella."},{name:"Editorin listalaatikko", +legend:"Listalaatikon sisällä siirry seuraavaan listan kohtaan TAB tai NUOLI ALAS painikkeilla. Siirry edelliseen listan kohtaan SHIFT+TAB tai NUOLI YLÖS painikkeilla. Paina VÄLILYÖNTI tai ENTER valitaksesi listan vaihtoehdon. Paina ESC sulkeaksesi listalaatikon."},{name:"Editorin elementtipolun palkki",legend:"Paina ${elementsPathFocus} siirtyäksesi elementtipolun palkkiin. Siirry seuraavaan elementtipainikkeeseen TAB tai NUOLI OIKEALLE painikkeilla. Siirry aiempaan painikkeeseen SHIFT+TAB tai NUOLI VASEMMALLE painikkeilla. Paina VÄLILYÖNTI tai ENTER valitaksesi elementin editorissa."}]}, +{name:"Komennot",items:[{name:"Peruuta komento",legend:"Paina ${undo}"},{name:"Tee uudelleen komento",legend:"Paina ${redo}"},{name:"Lihavoi komento",legend:"Paina ${bold}"},{name:"Kursivoi komento",legend:"Paina ${italic}"},{name:"Alleviivaa komento",legend:"Paina ${underline}"},{name:"Linkki komento",legend:"Paina ${link}"},{name:"Pienennä työkalupalkki komento",legend:"Paina ${toolbarCollapse}"},{name:"Siirry aiempaan fokustilaan komento",legend:"Paina ${accessPreviousSpace} siiryäksesi lähimpään kursorin edellä olevaan saavuttamattomaan fokustilaan, esimerkiksi: kaksi vierekkäistä HR elementtiä. Toista näppäinyhdistelmää päästäksesi kauempana oleviin fokustiloihin."}, +{name:"Siirry seuraavaan fokustilaan komento",legend:"Paina ${accessPreviousSpace} siiryäksesi lähimpään kursorin jälkeen olevaan saavuttamattomaan fokustilaan, esimerkiksi: kaksi vierekkäistä HR elementtiä. Toista näppäinyhdistelmää päästäksesi kauempana oleviin fokustiloihin."},{name:"Saavutettavuus ohjeet",legend:"Paina ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/fr-ca.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/fr-ca.js new file mode 100644 index 0000000..1c210f0 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/fr-ca.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","fr-ca",{title:"Instructions d'accessibilité",contents:"Contenu de l'aide. Pour fermer cette fenêtre, appuyez sur ESC.",legend:[{name:"Général",items:[{name:"Barre d'outil de l'éditeur",legend:"Appuyer sur ${toolbarFocus} pour accéder à la barre d'outils. Se déplacer vers les groupes suivant ou précédent de la barre d'outil avec les touches TAB et SHIFT-TAB. Se déplacer vers les boutons suivant ou précédent de la barre d'outils avec les touches FLECHE DROITE et FLECHE GAUCHE. Appuyer sur la barre d'espace ou la touche ENTRER pour activer le bouton de barre d'outils."}, +{name:"Dialogue de l'éditeur",legend:"A l'intérieur d'un dialogue, appuyer sur la touche TAB pour naviguer jusqu'au champ de dalogue suivant, appuyez sur les touches SHIFT + TAB pour revenir au champ précédent, appuyez sur la touche ENTRER pour soumettre le dialogue, appuyer sur la touche ESC pour annuler le dialogue. Pour les dialogues avec plusieurs pages d'onglets, appuyer sur ALT + F10 pour naviguer jusqu'à la liste des onglets. Puis se déplacer vers l'onglet suivant avec la touche TAB ou FLECHE DROITE. Se déplacer vers l'onglet précédent avec les touches SHIFT + TAB ou FLECHE GAUCHE. Appuyer sur la barre d'espace ou la touche ENTRER pour sélectionner la page de l'onglet."}, +{name:"Menu contextuel de l'éditeur",legend:"Appuyer sur ${contextMenu} ou entrer le RACCOURCI CLAVIER pour ouvrir le menu contextuel. Puis se déplacer vers l'option suivante du menu avec les touches TAB ou FLECHE BAS. Se déplacer vers l'option précédente avec les touches SHIFT+TAB ou FLECHE HAUT. appuyer sur la BARRE D'ESPACE ou la touche ENTREE pour sélectionner l'option du menu. Oovrir le sous-menu de l'option courante avec la BARRE D'ESPACE ou les touches ENTREE ou FLECHE DROITE. Revenir à l'élément de menu parent avec les touches ESC ou FLECHE GAUCHE. Fermer le menu contextuel avec ESC."}, +{name:"Menu déroulant de l'éditeur",legend:"A l'intérieur d'une liste en menu déroulant, se déplacer vers l'élément suivant de la liste avec les touches TAB ou FLECHE BAS. Se déplacer vers l'élément précédent de la liste avec les touches SHIFT + TAB ou FLECHE HAUT. Appuyer sur la BARRE D'ESPACE ou sur ENTREE pour sélectionner l'option dans la liste. Appuyer sur ESC pour fermer le menu déroulant."},{name:"Barre d'emplacement des éléments de l'éditeur",legend:"Appuyer sur ${elementsPathFocus} pour naviguer vers la barre d'emplacement des éléments de léditeur. Se déplacer vers le bouton d'élément suivant avec les touches TAB ou FLECHE DROITE. Se déplacer vers le bouton d'élément précédent avec les touches SHIFT+TAB ou FLECHE GAUCHE. Appuyer sur la BARRE D'ESPACE ou sur ENTREE pour sélectionner l'élément dans l'éditeur."}]}, +{name:"Commandes",items:[{name:"Annuler",legend:"Appuyer sur ${undo}"},{name:"Refaire",legend:"Appuyer sur ${redo}"},{name:"Gras",legend:"Appuyer sur ${bold}"},{name:"Italique",legend:"Appuyer sur ${italic}"},{name:"Souligné",legend:"Appuyer sur ${underline}"},{name:"Lien",legend:"Appuyer sur ${link}"},{name:"Enrouler la barre d'outils",legend:"Appuyer sur ${toolbarCollapse}"},{name:"Accéder à l'objet de focus précédent",legend:"Appuyer ${accessPreviousSpace} pour accéder au prochain espace disponible avant le curseur, par exemple: deux éléments HR adjacents. Répéter la combinaison pour joindre les éléments d'espaces distantes."}, +{name:"Accéder au prochain objet de focus",legend:"Appuyer ${accessNextSpace} pour accéder au prochain espace disponible après le curseur, par exemple: deux éléments HR adjacents. Répéter la combinaison pour joindre les éléments d'espaces distantes."},{name:"Aide d'accessibilité",legend:"Appuyer sur ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/fr.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/fr.js new file mode 100644 index 0000000..b133415 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/fr.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","fr",{title:"Instructions d'accessibilité",contents:"Contenu de l'aide. Pour fermer ce dialogue, appuyez sur la touche Ech (Echappement).",legend:[{name:"Général",items:[{name:"Barre d'outils de l'éditeur",legend:"Appuyer sur ${toolbarFocus} pour accéder à la barre d'outils. Se déplacer vers les groupes suivant ou précédent de la barre d'outil avec les touches TAB et SHIFT-TAB. Se déplacer vers les boutons suivant ou précédent de la barre d'outils avec les touches FLECHE DROITE et FLECHE GAUCHE. Appuyer sur la barre d'espace ou la touche ENTRER pour activer le bouton de barre d'outils."}, +{name:"Dialogue de l'éditeur",legend:"A l'intérieur d'un dialogue, appuyer sur la touche TAB pour naviguer jusqu'au champ de dalogue suivant, appuyez sur les touches SHIFT + TAB pour revenir au champ précédent, appuyez sur la touche ENTRER pour soumettre le dialogue, appuyer sur la touche ESC pour annuler le dialogue. Pour les dialogues avec plusieurs pages d'onglets, appuyer sur ALT + F10 pour naviguer jusqu'à la liste des onglets. Puis se déplacer vers l'onglet suivant avec la touche TAB ou FLECHE DROITE. Se déplacer vers l'onglet précédent avec les touches SHIFT + TAB ou FLECHE GAUCHE. Appuyer sur la barre d'espace ou la touche ENTRER pour sélectionner la page de l'onglet."}, +{name:"Menu contextuel de l'éditeur",legend:"Appuyer sur ${contextMenu} ou entrer le RACCOURCI CLAVIER pour ouvrir le menu contextuel. Puis se déplacer vers l'option suivante du menu avec les touches TAB ou FLECHE BAS. Se déplacer vers l'option précédente avec les touches SHIFT+TAB ou FLECHE HAUT. appuyer sur la BARRE D'ESPACE ou la touche ENTREE pour sélectionner l'option du menu. Oovrir le sous-menu de l'option courante avec la BARRE D'ESPACE ou les touches ENTREE ou FLECHE DROITE. Revenir à l'élément de menu parent avec les touches Ech ou FLECHE GAUCHE. Fermer le menu contextuel avec Ech."}, +{name:"Zone de liste de l'éditeur",legend:"Dans la liste en menu déroulant, se déplacer vers l'élément suivant de la liste avec les touches TAB ou FLECHE BAS. Se déplacer vers l'élément précédent de la liste avec les touches MAJ + TAB ou FLECHE HAUT. Appuyer sur la BARRE D'ESPACE ou sur ENTREE pour sélectionner l'option dans la liste. Appuyer sur ESC pour fermer le menu déroulant."},{name:"Barre d'emplacement des éléments de l'éditeur",legend:"Appuyer sur ${elementsPathFocus} pour naviguer vers la barre d'emplacement des éléments de l'éditeur. Se déplacer vers le bouton d'élément suivant avec les touches TAB ou FLECHE DROITE. Se déplacer vers le bouton d'élément précédent avec les touches MAJ+TAB ou FLECHE GAUCHE. Appuyer sur la BARRE D'ESPACE ou sur ENTREE pour sélectionner l'élément dans l'éditeur."}]}, +{name:"Commandes",items:[{name:" Annuler la commande",legend:"Appuyer sur ${undo}"},{name:"Refaire la commande",legend:"Appuyer sur ${redo}"},{name:" Commande gras",legend:"Appuyer sur ${bold}"},{name:" Commande italique",legend:"Appuyer sur ${italic}"},{name:" Commande souligné",legend:"Appuyer sur ${underline}"},{name:" Commande lien",legend:"Appuyer sur ${link}"},{name:" Commande enrouler la barre d'outils",legend:"Appuyer sur ${toolbarCollapse}"},{name:"Accéder à la précédente commande d'espace de mise au point", +legend:"Appuyez sur ${accessPreviousSpace} pour accéder à l'espace hors d'atteinte le plus proche avant le caret, par exemple: deux éléments HR adjacents. Répétez la combinaison de touches pour atteindre les espaces de mise au point distants."},{name:"Accès à la prochaine commande de l'espace de mise au point",legend:"Appuyez sur ${accessNextSpace} pour accéder au plus proche espace de mise au point hors d'atteinte après le caret, par exemple: deux éléments HR adjacents. répétez la combinaison de touches pour atteindre les espace de mise au point distants."}, +{name:" Aide Accessibilité",legend:"Appuyer sur ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/gl.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/gl.js new file mode 100644 index 0000000..f6f0c7c --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/gl.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","gl",{title:"Instrucións de accesibilidade",contents:"Axuda. Para pechar este diálogo prema ESC.",legend:[{name:"Xeral",items:[{name:"Barra de ferramentas do editor",legend:"Prema ${toolbarFocus} para navegar pola barra de ferramentas. Para moverse polos distintos grupos de ferramentas use as teclas TAB e MAIÚS+TAB. Para moverse polas distintas ferramentas use FRECHA DEREITA ou FRECHA ESQUERDA. Prema ESPAZO ou INTRO para activar o botón da barra de ferramentas."}, +{name:"Editor de diálogo",legend:"Dentro dun cadro de diálogo, prema a tecla TAB para desprazarse ao campo seguinte do cadro de diálogo, prema MAIÚS + TAB para desprazarse ao campo anterior, prema INTRO para presentar o cadro de diálogo, prema a tecla ESC para cancelar o diálogo. Para os diálogos que teñen varias páxinas, prema ALT + F10 para navegar á lapela da lista. Despois pasar á seguinte lapela con TAB ou FRECHA DEREITA. Para ir á lapela anterior con SHIFT + TAB ou FRECHA ESQUERDA. Prema ESPAZO ou INTRO para seleccionar a lapela da páxina."}, +{name:"Editor do menú contextual",legend:"Prema ${contextMenu} ou a TECLA MENÚ para abrir o menú contextual. A seguir móvase á seguinte opción do menú con TAB ou FRECHA ABAIXO. Móvase á opción anterior con MAIÚS + TAB ou FRECHA ARRIBA. Prema ESPAZO ou INTRO para seleccionar a opción do menú. Abra o submenú da opción actual con ESPAZO ou INTRO ou FRECHA DEREITA. Regrese ao elemento principal do menú con ESC ou FRECHA ESQUERDA. Peche o menú contextual con ESC."},{name:"Lista do editor",legend:"Dentro dunha lista, móvase ao seguinte elemento da lista con TAB ou FRECHA ABAIXO. Móvase ao elemento anterior da lista con MAIÚS + TAB ou FRECHA ARRIBA. Prema ESPAZO ou INTRO para escoller a opción da lista. Prema ESC para pechar a lista."}, +{name:"Barra da ruta ao elemento no editor",legend:"Prema ${elementsPathFocus} para navegar ata os elementos da barra de ruta. Móvase ao seguinte elemento botón con TAB ou FRECHA DEREITA. Móvase ao botón anterior con MAIÚS + TAB ou FRECHA ESQUERDA. Prema ESPAZO ou INTRO para seleccionar o elemento no editor."}]},{name:"Ordes",items:[{name:"Orde «desfacer»",legend:"Prema ${undo}"},{name:"Orde «refacer»",legend:"Prema ${redo}"},{name:"Orde «negra»",legend:"Prema ${bold}"},{name:"Orde «cursiva»",legend:"Prema ${italic}"}, +{name:"Orde «subliñar»",legend:"Prema ${underline}"},{name:"Orde «ligazón»",legend:"Prema ${link}"},{name:"Orde «contraer a barra de ferramentas»",legend:"Prema ${toolbarCollapse}"},{name:"Orde «acceder ao anterior espazo en foco»",legend:"Prema ${accessPreviousSpace} para acceder ao espazo máis próximo de foco inalcanzábel anterior ao cursor, por exemplo: dous elementos HR adxacentes. Repita a combinación de teclas para chegar a espazos de foco distantes."},{name:"Orde «acceder ao seguinte espazo en foco»", +legend:"Prema ${accessNextSpace} para acceder ao espazo máis próximo de foco inalcanzábel posterior ao cursor, por exemplo: dous elementos HR adxacentes. Repita a combinación de teclas para chegar a espazos de foco distantes."},{name:"Axuda da accesibilidade",legend:"Prema ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/gu.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/gu.js new file mode 100644 index 0000000..fb58c12 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/gu.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","gu",{title:"એક્ક્ષેબિલિટી ની વિગતો",contents:"હેલ્પ. આ બંધ કરવા ESC દબાવો.",legend:[{name:"જનરલ",items:[{name:"એડિટર ટૂલબાર",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"એડિટર ડાયલોગ",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."}, +{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."}, +{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"કમાંડસ",items:[{name:"અન્ડું કમાંડ",legend:"$ દબાવો {undo}"},{name:"ફરી કરો કમાંડ",legend:"$ દબાવો {redo}"},{name:"બોલ્દનો કમાંડ",legend:"$ દબાવો {bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command", +legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."}, +{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/he.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/he.js new file mode 100644 index 0000000..c22978e --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/he.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","he",{title:"הוראות נגישות",contents:"הוראות נגישות. לסגירה לחץ אסקייפ (ESC).",legend:[{name:"כללי",items:[{name:"סרגל הכלים",legend:"לחץ על ${toolbarFocus} כדי לנווט לסרגל הכלים. עבור לכפתור הבא עם מקש הטאב (TAB) או חץ שמאלי. עבור לכפתור הקודם עם מקש השיפט (SHIFT) + טאב (TAB) או חץ ימני. לחץ רווח או אנטר (ENTER) כדי להפעיל את הכפתור הנבחר."},{name:"דיאלוגים (חלונות תשאול)",legend:"בתוך דיאלוג, לחץ טאב (TAB) כדי לנווט לשדה הבא, לחץ שיפט (SHIFT) + טאב (TAB) כדי לנווט לשדה הקודם, לחץ אנטר (ENTER) כדי לשלוח את הדיאלוג, לחץ אסקייפ (ESC) כדי לבטל. בתוך דיאלוגים בעלי מספר טאבים (לשוניות), לחץ אלט (ALT) + F10 כדי לנווט לשורת הטאבים. נווט לטאב הבא עם טאב (TAB) או חץ שמאלי. עבור לטאב הקודם עם שיפט (SHIFT) + טאב (TAB) או חץ שמאלי. לחץ רווח או אנטר (ENTER) כדי להיכנס לטאב."}, +{name:"תפריט ההקשר (Context Menu)",legend:"לחץ ${contextMenu} או APPLICATION KEYכדי לפתוח את תפריט ההקשר. עבור לאפשרות הבאה עם טאב (TAB) או חץ למטה. עבור לאפשרות הקודמת עם שיפט (SHIFT) + טאב (TAB) או חץ למעלה. לחץ רווח או אנטר (ENTER) כדי לבחור את האפשרות. פתח את תת התפריט (Sub-menu) של האפשרות הנוכחית עם רווח או אנטר (ENTER) או חץ שמאלי. חזור לתפריט האב עם אסקייפ (ESC) או חץ שמאלי. סגור את תפריט ההקשר עם אסקייפ (ESC)."},{name:"תפריטים צפים (List boxes)",legend:"בתוך תפריט צף, עבור לפריט הבא עם טאב (TAB) או חץ למטה. עבור לתפריט הקודם עם שיפט (SHIFT) + טאב (TAB) or חץ עליון. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."}, +{name:"עץ אלמנטים (Elements Path)",legend:"לחץ ${elementsPathFocus} כדי לנווט לעץ האלמנטים. עבור לפריט הבא עם טאב (TAB) או חץ ימני. עבור לפריט הקודם עם שיפט (SHIFT) + טאב (TAB) או חץ שמאלי. לחץ רווח או אנטר (ENTER) כדי לבחור את האלמנט בעורך."}]},{name:"פקודות",items:[{name:" ביטול צעד אחרון",legend:"לחץ ${undo}"},{name:" חזרה על צעד אחרון",legend:"לחץ ${redo}"},{name:" הדגשה",legend:"לחץ ${bold}"},{name:" הטייה",legend:"לחץ ${italic}"},{name:" הוספת קו תחתון",legend:"לחץ ${underline}"},{name:" הוספת לינק", +legend:"לחץ ${link}"},{name:" כיווץ סרגל הכלים",legend:"לחץ ${toolbarCollapse}"},{name:"גישה למיקום המיקוד הקודם",legend:"לחץ ${accessPreviousSpace} כדי לגשת למיקום המיקוד הלא-נגיש הקרוב לפני הסמן, למשל בין שני אלמנטים סמוכים מסוג HR. חזור על צירוף מקשים זה כדי להגיע למקומות מיקוד רחוקים יותר."},{name:"גישה למיקום המיקוד הבא",legend:"לחץ ${accessNextSpace} כדי לגשת למיקום המיקוד הלא-נגיש הקרוב אחרי הסמן, למשל בין שני אלמנטים סמוכים מסוג HR. חזור על צירוף מקשים זה כדי להגיע למקומות מיקוד רחוקים יותר."}, +{name:" הוראות נגישות",legend:"לחץ ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/hi.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/hi.js new file mode 100644 index 0000000..0f9bbc9 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/hi.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","hi",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"सामान्य",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."}, +{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."}, +{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command", +legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."}, +{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/hr.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/hr.js new file mode 100644 index 0000000..f3c3394 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/hr.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","hr",{title:"Upute dostupnosti",contents:"Sadržaj pomoći. Za zatvaranje pritisnite ESC.",legend:[{name:"Općenito",items:[{name:"Alatna traka",legend:"Pritisni ${toolbarFocus} za navigaciju do alatne trake. Pomicanje do prethodne ili sljedeće alatne grupe vrši se pomoću SHIFT-TAB i TAB. Pomicanje do prethodnog ili sljedećeg gumba u alatnoj traci vrši se pomoću lijeve i desne strelice kursora. Pritisnite SPACE ili ENTER za aktivaciju alatne trake."},{name:"Dijalog", +legend:"Unutar dijaloga, pritisnite TAB za navigaciju do sljedećeg polja, pritisnite SHIFT + TAB za vraćanje na prethodno polje, pritisnite ENTER za slanje dijaloga ili ESC za zatvaranje dijaloga. Za dijaloge koji imaju višestruke kartice, pritisnite ALT + F10 za na navigaciju i zatim TAB ili lijeva strelica kursora ili SHIFT + TAB i desna strelica kursora. SPACE ili ENTER odabiru karticu."},{name:"Kontekstni izbornik",legend:"Pritisnite ${contextMenu} ili APPLICATION tipku za otvaranje kontekstnog izbornika. Pomicanje se vrši TAB ili strelicom kursora prema dolje ili SHIFT+TAB ili strelica kursora prema gore. SPACE ili ENTER odabiru opciju izbornika. Otvorite podizbornik trenutne opcije sa SPACE, ENTER ili desna strelica kursora. Povratak na prethodni izbornik vrši se sa ESC ili lijevom strelicom kursora. Zatvaranje se vrši pritiskom na tipku ESC."}, +{name:"Lista",legend:"Unutar list-boxa, pomicanje na sljedeću stavku vrši se sa TAB ili strelica kursora prema dolje. Na prethodnu sa SHIFT + TAB ili strelica prema gore. Pritiskom na SPACE ili ENTER odabire se stavka ili ESC za zatvaranje."},{name:"Traka putanje elemenata",legend:"Pritisnite ${elementsPathFocus} za navigaciju po putanji elemenata. Pritisnite TAB ili desnu strelicu kursora za pomicanje na sljedeći element ili SHIFT + TAB ili lijeva strelica kursora za pomicanje na prethodni element. Pritiskom na SPACE ili ENTER vrši se odabir elementa."}]}, +{name:"Naredbe",items:[{name:"Vrati naredbu",legend:"Pritisni ${undo}"},{name:"Ponovi naredbu",legend:"Pritisni ${redo}"},{name:"Bold naredba",legend:"Pritisni ${bold}"},{name:"Italic naredba",legend:"Pritisni ${italic}"},{name:"Underline naredba",legend:"Pritisni ${underline}"},{name:"Link naredba",legend:"Pritisni ${link}"},{name:"Smanji alatnu traku naredba",legend:"Pritisni ${toolbarCollapse}"},{name:"Access previous focus space naredba",legend:"Pritisni ${accessPreviousSpace} za pristup najbližem nedostupnom razmaku prije kursora, npr.: dva spojena HR elementa. Ponovnim pritiskom dohvatiti će se sljedeći nedostupni razmak."}, +{name:"Access next focus space naredba",legend:"Pritisni ${accessNextSpace} za pristup najbližem nedostupnom razmaku nakon kursora, npr.: dva spojena HR elementa. Ponovnim pritiskom dohvatiti će se sljedeći nedostupni razmak."},{name:"Pomoć za dostupnost",legend:"Pritisni ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/hu.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/hu.js new file mode 100644 index 0000000..3de0bc0 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/hu.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","hu",{title:"Kisegítő utasítások",contents:"Súgó tartalmak. A párbeszédablak bezárásához nyomjon ESC-et.",legend:[{name:"Általános",items:[{name:"Szerkesztő Eszköztár",legend:"Nyomjon ${toolbarFocus} hogy kijelölje az eszköztárat. A következő és előző eszköztár csoporthoz a TAB és SHIFT TAB-al juthat el. A következő és előző eszköztár gombhoz a BAL NYÍL vagy JOBB NYÍL gombbal juthat el. Nyomjon SPACE-t vagy ENTER-t hogy aktiválja az eszköztár gombot."},{name:"Szerkesző párbeszéd ablak", +legend:"Párbeszédablakban nyomjon TAB-ot a következő párbeszédmezőhöz ugráshoz, nyomjon SHIFT + TAB-ot az előző mezőhöz ugráshoz, nyomjon ENTER-t a párbeszédablak elfogadásához, nyomjon ESC-et a párbeszédablak elvetéséhez. Azokhoz a párbeszédablakokhoz, amik több fület tartalmaznak, nyomjon ALT + F10-et hogy a fülekre ugorjon. Ezután a TAB-al vagy a JOBB NYÍLLAL a következő fülre ugorhat. Az előző fülre ugráshoz használja a SHIFT + TAB-ot vagy a BAL NYILAT. Nyomjon SPACE-t vagy ENTER-t hogy kijelölje a fület."}, +{name:"Szerkesztő helyi menü",legend:"Nyomjon ${contextMenu}-t vagy ALKALMAZÁS BILLENTYŰT a helyi menü megnyitásához. Ezután a következő menüpontra léphet a TAB vagy LEFELÉ NYÍLLAL. Az előző opciót a SHIFT+TAB vagy FELFELÉ NYÍLLAL érheti el. Nyomjon SPACE-t vagy ENTER-t a menüpont kiválasztásához. A jelenlegi menüpont almenüjének megnyitásához nyomjon SPACE-t vagy ENTER-t, vagy JOBB NYILAT. A főmenühöz való visszatéréshez nyomjon ESC-et vagy BAL NYILAT. A helyi menü bezárása az ESC billentyűvel lehetséges."}, +{name:"Szerkesztő lista",legend:"A listán belül a következő elemre a TAB vagy LEFELÉ NYÍLLAL mozoghat. Az előző elem kiválasztásához nyomjon SHIFT+TAB-ot vagy FELFELÉ NYILAT. Nyomjon SPACE-t vagy ENTER-t az elem kiválasztásához. Az ESC billentyű megnyomásával bezárhatja a listát."},{name:"Szerkesztő elem utak sáv",legend:"Nyomj ${elementsPathFocus} hogy kijelöld a elemek út sávját. A következő elem gombhoz a TAB-al vagy a JOBB NYÍLLAL juthatsz el. Az előző gombhoz a SHIFT+TAB vagy BAL NYÍLLAL mehetsz. A SPACE vagy ENTER billentyűvel kiválaszthatod az elemet a szerkesztőben."}]}, +{name:"Parancsok",items:[{name:"Parancs visszavonása",legend:"Nyomj ${undo}"},{name:"Parancs megismétlése",legend:"Nyomjon ${redo}"},{name:"Félkövér parancs",legend:"Nyomjon ${bold}"},{name:"Dőlt parancs",legend:"Nyomjon ${italic}"},{name:"Aláhúzott parancs",legend:"Nyomjon ${underline}"},{name:"Link parancs",legend:"Nyomjon ${link}"},{name:"Szerkesztősáv összecsukása parancs",legend:"Nyomjon ${toolbarCollapse}"},{name:"Hozzáférés az előző fókusz helyhez parancs",legend:"Nyomj ${accessNextSpace} hogy hozzáférj a legközelebbi elérhetetlen fókusz helyhez a hiányjel előtt, például: két szomszédos HR elemhez. Ismételd meg a billentyűkombinációt hogy megtaláld a távolabbi fókusz helyeket."}, +{name:"Hozzáférés a következő fókusz helyhez parancs",legend:"Nyomj ${accessNextSpace} hogy hozzáférj a legközelebbi elérhetetlen fókusz helyhez a hiányjel után, például: két szomszédos HR elemhez. Ismételd meg a billentyűkombinációt hogy megtaláld a távolabbi fókusz helyeket."},{name:"Kisegítő súgó",legend:"Nyomjon ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/id.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/id.js new file mode 100644 index 0000000..fe06349 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/id.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","id",{title:"Accessibility Instructions",contents:"Bantuan. Tekan ESC untuk menutup dialog ini.",legend:[{name:"Umum",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."}, +{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."}, +{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command", +legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."}, +{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/it.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/it.js new file mode 100644 index 0000000..1f4d5a5 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/it.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","it",{title:"Istruzioni di Accessibilità",contents:"Contenuti di Aiuto. Per chiudere questa finestra premi ESC.",legend:[{name:"Generale",items:[{name:"Barra degli strumenti Editor",legend:"Premi ${toolbarFocus} per navigare fino alla barra degli strumenti. Muoviti tra i gruppi della barra degli strumenti con i tasti Tab e Maiusc-Tab. Spostati tra il successivo ed il precedente pulsante della barra degli strumenti usando le frecce direzionali Destra e Sinistra. Premi Spazio o Invio per attivare il pulsante della barra degli strumenti."}, +{name:"Finestra Editor",legend:"All'interno di una finestra di dialogo, premi Tab per navigare fino al campo successivo della finestra di dialogo, premi Maiusc-Tab per tornare al campo precedente, premi Invio per inviare la finestra di dialogo, premi Esc per uscire. Per le finestre che hanno schede multiple, premi Alt+F10 per navigare nella lista delle schede. Quindi spostati alla scheda successiva con il tasto Tab oppure con la Freccia Destra. Torna alla scheda precedente con Maiusc+Tab oppure con la Freccia Sinistra. Premi Spazio o Invio per scegliere la scheda."}, +{name:"Menù contestuale Editor",legend:"Premi ${contextMenu} o TASTO APPLICAZIONE per aprire il menu contestuale. Dunque muoviti all'opzione successiva del menu con il tasto TAB o con la Freccia Sotto. Muoviti all'opzione precedente con MAIUSC+TAB o con Freccia Sopra. Premi SPAZIO o INVIO per scegliere l'opzione di menu. Apri il sottomenu dell'opzione corrente con SPAZIO o INVIO oppure con la Freccia Destra. Torna indietro al menu superiore con ESC oppure Freccia Sinistra. Chiudi il menu contestuale con ESC."}, +{name:"Box Lista Editor",legend:"Dentro un box-lista, muoviti al prossimo elemento della lista con TAB o con la Freccia direzionale giù. Spostati all'elemento precedente con MAIUSC+TAB oppure con Freccia direzionale sopra. Premi SPAZIO o INVIO per scegliere l'opzione della lista. Premi ESC per chiudere il box-lista."},{name:"Barra percorso elementi editor",legend:"Premi ${elementsPathFocus} per navigare tra gli elementi della barra percorso. Muoviti al prossimo pulsante di elemento con TAB o la Freccia direzionale destra. Muoviti al pulsante precedente con MAIUSC+TAB o la Freccia Direzionale Sinistra. Premi SPAZIO o INVIO per scegliere l'elemento nell'editor."}]}, +{name:"Comandi",items:[{name:" Annulla comando",legend:"Premi ${undo}"},{name:" Ripeti comando",legend:"Premi ${redo}"},{name:" Comando Grassetto",legend:"Premi ${bold}"},{name:" Comando Corsivo",legend:"Premi ${italic}"},{name:" Comando Sottolineato",legend:"Premi ${underline}"},{name:" Comando Link",legend:"Premi ${link}"},{name:" Comando riduci barra degli strumenti",legend:"Premi ${toolbarCollapse}"},{name:"Comando di accesso al precedente spazio di focus",legend:"Premi ${accessPreviousSpace} per accedere il più vicino spazio di focus non raggiungibile prima del simbolo caret, per esempio due elementi HR adiacenti. Ripeti la combinazione di tasti per raggiungere spazi di focus distanti."}, +{name:"Comando di accesso al prossimo spazio di focus",legend:"Premi ${accessNextSpace} per accedere il più vicino spazio di focus non raggiungibile dopo il simbolo caret, per esempio due elementi HR adiacenti. Ripeti la combinazione di tasti per raggiungere spazi di focus distanti."},{name:" Aiuto Accessibilità",legend:"Premi ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ja.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ja.js new file mode 100644 index 0000000..0536a94 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ja.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","ja",{title:"ユーザー補助の説明",contents:"ヘルプ このダイアログを閉じるには ESCを押してください。",legend:[{name:"全般",items:[{name:"エディターツールバー",legend:"${toolbarFocus} を押すとツールバーのオン/オフ操作ができます。カーソルをツールバーのグループで移動させるにはTabかSHIFT+Tabを押します。グループ内でカーソルを移動させるには、右カーソルか左カーソルを押します。スペースキーやエンターを押すとボタンを有効/無効にすることができます。"},{name:"編集ダイアログ",legend:"ダイヤログ内では、ダイアログの次の選択肢に移動するにはTabを押します。前の選択肢に移動するには、SHIFT+Tabを押します。ダイアログを決定するには、ENTERを押します。ESCでダイアログをキャンセルできます。複数のタブがあるダイアログではタブリストを操作するにはALT+F10を押します。次のタブに移動するにはTabか右カーソル、前のタブに戻るにはSHIFT+Tabか左カーソルです。タブページを決定するにはスペースもしくは、ENTERキーを押してください。"}, +{name:"エディターのメニュー",legend:"${contextMenu} キーかAPPLICATION KEYを押すとコンテキストメニューが開きます。Tabか下カーソルでメニューのオプション選択が下に移動します。戻るには、SHIFT+Tabか上カーソルです。スペースもしくはENTERキーでメニューオプションを決定できます。現在選んでいるオプションのサブメニューを開くには、スペース、もしくは右カーソルを押します。サブメニューから親メニューに戻るには、ESCか左カーソルを押してください。ESCでコンテキストメニュー自体をキャンセルできます。"},{name:"エディターリストボックス",legend:"リストボックス内で移動するには、Tabか下カーソルで次のアイテムへ移動します。SHIFT+Tabで前のアイテムに戻ります。リストのオプションを選択するには、スペースもしくは、ENTERを押してください。リストボックスを閉じるには、ESCを押してください。"},{name:"エディター要素パスバー",legend:"${elementsPathFocus} を押すとエレメントパスバーを操作出来ます。Tabか右カーソルで次のエレメントを選択できます。前のエレメントを選択するには、SHIFT+Tabか左カーソルです。スペースもしくは、ENTERでエディタ内の対象エレメントを選択出来ます。"}]}, +{name:"コマンド",items:[{name:"元に戻す",legend:"${undo} をクリック"},{name:"やり直し",legend:"${redo} をクリック"},{name:"太字",legend:"${bold} をクリック"},{name:"斜体 ",legend:"${italic} をクリック"},{name:"下線",legend:"${underline} をクリック"},{name:"リンク",legend:"${link} をクリック"},{name:"ツールバーを縮める",legend:"${toolbarCollapse} をクリック"},{name:"前のカーソル移動のできないポイントへ",legend:"${accessPreviousSpace} を押すとカーソルより前にあるカーソルキーで入り込めないスペースへ移動できます。例えば、HRエレメントが2つ接している場合などです。離れた場所へは、複数回キーを押します。"},{name:"次のカーソル移動のできないポイントへ",legend:"${accessNextSpace} を押すとカーソルより後ろにあるカーソルキーで入り込めないスペースへ移動できます。例えば、HRエレメントが2つ接している場合などです。離れた場所へは、複数回キーを押します。"}, +{name:"ユーザー補助ヘルプ",legend:"${a11yHelp} をクリック"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/km.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/km.js new file mode 100644 index 0000000..3dfd4a0 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/km.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","km",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"ទូទៅ",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."}, +{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."}, +{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command", +legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."}, +{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ko.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ko.js new file mode 100644 index 0000000..650b68e --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ko.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","ko",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"General",items:[{name:"편집기 툴바",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"편집기 다이얼로그",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."}, +{name:"편집기 환경 메뉴",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"편집기 목록 박스",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."}, +{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"명령",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command", +legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."}, +{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ku.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ku.js new file mode 100644 index 0000000..6ceb4f7 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ku.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","ku",{title:"ڕێنمای لەبەردەستدابوون",contents:"پێکهاتەی یارمەتی. کلیك ESC بۆ داخستنی ئەم دیالۆگه.",legend:[{name:"گشتی",items:[{name:"تووڵامرازی دەستكاریكەر",legend:"کلیك ${toolbarFocus} بۆ ڕابەری تووڵامراز. بۆ گواستنەوەی پێشوو داهاتووی گرووپی تووڵامرازی داگرتنی کلیلی TAB لەگەڵ‌ SHIFT-TAB. بۆ گواستنەوەی پێشوو داهاتووی دووگمەی تووڵامرازی لەڕێی کلیلی تیری دەستی ڕاست یان کلیلی تیری دەستی چەپ. کلیکی کلیلی SPACE یان ENTER بۆ چالاککردنی دووگمەی تووڵامراز."},{name:"دیالۆگی دەستكاریكەر", +legend:"لەهەمانکاتدا کە تۆ لەدیالۆگی, کلیکی کلیلی TAB بۆ ڕابەری خانەی دیالۆگێکی تر, داگرتنی کلیلی SHIFT + TAB بۆ گواستنەوەی بۆ خانەی پێشووتر, کلیكی کلیلی ENTER بۆ ڕازیکردنی دیالۆگەکە, کلیكی کلیلی ESC بۆ هەڵوەشاندنەوەی دیالۆگەکە. بۆ دیالۆگی لەبازدەری (تابی) زیاتر, کلیكی کلیلی ALT + F10 بۆ ڕابەری لیستی بازدەرەکان. بۆ چوونە بازدەری تابی داهاتوو کلیكی کلیلی TAB یان کلیلی تیری دەستی ڕاست. بۆچوونە بازدەری تابی پێشوو داگرتنی کلیلی SHIFT + TAB یان کلیلی تیری دەستی چەپ. کلیی کلیلی SPACE یان ENTER بۆ هه‌ڵبژاردنی بازدەر (تاب)."}, +{name:"پێڕستی سەرنووسەر",legend:"کلیك ${contextMenu} یان دوگمەی لیسته‌(Menu) بۆ کردنەوەی لیستەی دەق. بۆ چوونە هەڵبژاردەیەکی تر له‌ لیسته‌ کلیکی کلیلی TAB یان کلیلی تیری ڕوو لەخوارەوه‌ بۆ چوون بۆ هەڵبژاردەی پێشوو کلیکی کلیلی SHIFT+TAB یان کلیلی تیری ڕوو له‌ سەرەوە. داگرتنی کلیلی SPACE یان ENTER بۆ هەڵبژاردنی هەڵبژاردەی لیسته‌. بۆ کردنەوەی لقی ژێر لیسته‌ لەهەڵبژاردەی لیستە کلیکی کلیلی SPACE یان ENTER یان کلیلی تیری دەستی ڕاست. بۆ گەڕانەوه بۆ سەرەوەی لیسته‌ کلیکی کلیلی ESC یان کلیلی تیری دەستی چەپ. بۆ داخستنی لیستە کلیكی کلیلی ESC بکە."}, +{name:"لیستی سنووقی سەرنووسەر",legend:"لەناو سنوقی لیست, چۆن بۆ هەڵنبژاردەی لیستێکی تر کلیکی کلیلی TAB یان کلیلی تیری ڕوو لەخوار. چوون بۆ هەڵبژاردەی لیستی پێشوو کلیکی کلیلی SHIFT + TAB یان کلیلی تیری ڕوو لەسەرەوه‌. کلیکی کلیلی SPACE یان ENTER بۆ دیاریکردنی ‌هەڵبژاردەی لیست. کلیکی کلیلی ESC بۆ داخستنی سنوقی لیست."},{name:"تووڵامرازی توخم",legend:"کلیك ${elementsPathFocus} بۆ ڕابەری تووڵامرازی توخمەکان. چوون بۆ دوگمەی توخمێکی تر کلیکی کلیلی TAB یان کلیلی تیری دەستی ڕاست. چوون بۆ دوگمەی توخمی پێشوو کلیلی SHIFT+TAB یان کلیکی کلیلی تیری دەستی چەپ. داگرتنی کلیلی SPACE یان ENTER بۆ دیاریکردنی توخمەکه‌ لەسەرنووسه."}]}, +{name:"فەرمانەکان",items:[{name:"پووچکردنەوەی فەرمان",legend:"کلیك ${undo}"},{name:"هەڵگەڕانەوەی فەرمان",legend:"کلیك ${redo}"},{name:"فەرمانی دەقی قەڵەو",legend:"کلیك ${bold}"},{name:"فەرمانی دەقی لار",legend:"کلیك ${italic}"},{name:"فەرمانی ژێرهێڵ",legend:"کلیك ${underline}"},{name:"فەرمانی به‌ستەر",legend:"کلیك ${link}"},{name:"شاردەنەوەی تووڵامراز",legend:"کلیك ${toolbarCollapse}"},{name:"چوونەناو سەرنجدانی پێشوی فەرمانی بۆشایی",legend:"کلیک ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."}, +{name:"چوونەناو سەرنجدانی داهاتووی فەرمانی بۆشایی",legend:"کلیک ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:"دەستپێگەیشتنی یارمەتی",legend:"کلیك ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/lt.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/lt.js new file mode 100644 index 0000000..550e595 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/lt.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","lt",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"Bendros savybės",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."}, +{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."}, +{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command", +legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."}, +{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/lv.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/lv.js new file mode 100644 index 0000000..0b974bf --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/lv.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","lv",{title:"Pieejamības instrukcija",contents:"Palīdzības saturs. Lai aizvērtu ciet šo dialogu nospiediet ESC.",legend:[{name:"Galvenais",items:[{name:"Redaktora rīkjosla",legend:"Nospiediet ${toolbarFocus} lai pārvietotos uz rīkjoslu. Lai pārvietotos uz nākošo vai iepriekšējo rīkjoslas grupu izmantojiet pogu TAB un SHIFT+TAB. Lai pārvietotos uz nākošo vai iepriekšējo rīkjoslas pogu izmantojiet Kreiso vai Labo bultiņu. Nospiediet Atstarpi vai ENTER lai aktivizētu rīkjosla pogu."}, +{name:"Redaktora dialoga logs",legend:"Dialoga logā nospiediet pogu TAB lai pārvietotos uz nākošo dialoga loga lauku, nospiediet SHIFT+TAB lai atgrieztos iepriekšējā laukā, nospiediet ENTER lai apstiprinātu dialoga datus, nospiediet ESC lai aizvērtu šo dialogu. Dialogam kuram ir vairākas cilnes, nospiediet ALT+F10 lai pārvietotos uz nepieciešamo cilni. Lai pārvietotos uz nākošo cilni izmantojiet pogu TAB vai Labo bultiņu. Lai pārvietotos uz iepriekšējo cilni nospiediet SHIFT+TAB vai kreiso bultiņu. Nospiediet SPACE vai ENTER lai izvēlētos lapas cilni."}, +{name:"Redaktora satura izvēle",legend:"Nospiediet ${contextMenu} vai APPLICATION KEY lai atvērtu satura izvēlni. Lai pārvietotos uz nākošo izvēlnes opciju izmantojiet pogu TAB vai pogu Bultiņu uz leju. Lai pārvietotos uz iepriekšējo opciju izmantojiet SHIFT+TAB vai pogu Bultiņa uz augšu. Nospiediet SPACE vai ENTER lai izvelētos izvēlnes opciju. Atveriet tekošajā opcija apakšizvēlni ar SAPCE vai ENTER ka ari to var izdarīt ar Labo bultiņu. Lai atgrieztos atpakaļ uz sakuma izvēlni nospiediet ESC vai Kreiso bultiņu. Lai aizvērtu ciet izvēlnes saturu nospiediet ESC."}, +{name:"Redaktora saraksta lauks",legend:"Saraksta laukā, lai pārvietotos uz nākošo saraksta elementu nospiediet TAB vai pogu Bultiņa uz leju. Lai pārvietotos uz iepriekšējo saraksta elementu nospiediet SHIFT+TAB vai pogu Bultiņa uz augšu. Nospiediet SPACE vai ENTER lai izvēlētos saraksta opcijas. Nospiediet ESC lai aizvērtu saraksta lauku. "},{name:"Redaktora elementa ceļa josla",legend:"Nospiediet ${elementsPathFocus} lai pārvietotos uz elementa ceļa joslu. Lai pārvietotos uz nākošo elementa pogu izmantojiet TAB vai Labo bultiņu. Lai pārvietotos uz iepriekšējo elementa pogu izmantojiet SHIFT + TAB vai Kreiso bultiņu. Nospiediet SPACE vai ENTER lai izvēlētos elementu redaktorā."}]}, +{name:"Komandas",items:[{name:"Komanda atcelt darbību",legend:"Nospiediet ${undo}"},{name:"Komanda atkārtot darbību",legend:"Nospiediet ${redo}"},{name:"Treknraksta komanda",legend:"Nospiediet ${bold}"},{name:"Kursīva komanda",legend:"Nospiediet ${italic}"},{name:"Apakšsvītras komanda ",legend:"Nospiediet ${underline}"},{name:"Hipersaites komanda",legend:"Nospiediet ${link}"},{name:"Rīkjoslas aizvēršanas komanda",legend:"Nospiediet ${toolbarCollapse}"},{name:"Piekļūt iepriekšējai fokusa vietas komandai", +legend:"Nospiediet ${accessPreviousSpace} lai piekļūtu tuvākajai nepieejamajai fokusa vietai pirms kursora. Piemēram: diviem blakus esošiem līnijas HR elementiem. Atkārtojiet taustiņu kombināciju lai piekļūtu pie tālākām vietām."},{name:"Piekļūt nākošā fokusa apgabala komandai",legend:"Nospiediet ${accessNextSpace} lai piekļūtu tuvākajai nepieejamajai fokusa vietai pēc kursora. Piemēram: diviem blakus esošiem līnijas HR elementiem. Atkārtojiet taustiņu kombināciju lai piekļūtu pie tālākām vietām."}, +{name:"Pieejamības palīdzība",legend:"Nospiediet ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/mk.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/mk.js new file mode 100644 index 0000000..b23b8c2 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/mk.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","mk",{title:"Инструкции за пристапност",contents:"Содржина на делот за помош. За да го затворите овој дијалот притиснете ESC.",legend:[{name:"Општо",items:[{name:"Мени за едиторот",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Дијалот за едиторот", +legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."},{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."}, +{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."},{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]}, +{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command",legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."}, +{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/mn.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/mn.js new file mode 100644 index 0000000..28af84a --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/mn.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","mn",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"Ерөнхий",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."}, +{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."}, +{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command", +legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."}, +{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/nb.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/nb.js new file mode 100644 index 0000000..a0b430c --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/nb.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","nb",{title:"Instruksjoner for tilgjengelighet",contents:"Innhold for hjelp. Trykk ESC for å lukke denne dialogen.",legend:[{name:"Generelt",items:[{name:"Verktøylinje for editor",legend:"Trykk ${toolbarFocus} for å navigere til verktøylinjen. Flytt til neste og forrige verktøylinjegruppe med TAB og SHIFT-TAB. Flytt til neste og forrige verktøylinjeknapp med HØYRE PILTAST og VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å aktivere verktøylinjeknappen."},{name:"Dialog for editor", +legend:"Mens du er i en dialog, trykk TAB for å navigere til neste dialogfelt, press SHIFT + TAB for å flytte til forrige felt, trykk ENTER for å akseptere dialogen, trykk ESC for å avbryte dialogen. For dialoger med flere faner, trykk ALT + F10 for å navigere til listen over faner. Gå til neste fane med TAB eller HØYRE PILTAST. Gå til forrige fane med SHIFT + TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge fanen."},{name:"Kontekstmeny for editor",legend:"Trykk ${contextMenu} eller MENYKNAPP for å åpne kontekstmeny. Gå til neste alternativ i menyen med TAB eller PILTAST NED. Gå til forrige alternativ med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge menyalternativet. Åpne undermenyen på valgt alternativ med MELLOMROM eller ENTER eller HØYRE PILTAST. Gå tilbake til overordnet menyelement med ESC eller VENSTRE PILTAST. Lukk kontekstmenyen med ESC."}, +{name:"Listeboks for editor",legend:"I en listeboks, gå til neste alternativ i listen med TAB eller PILTAST NED. Gå til forrige alternativ i listen med SHIFT + TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge alternativet i listen. Trykk ESC for å lukke listeboksen."},{name:"Verktøylinje for elementsti",legend:"Trykk ${elementsPathFocus} for å navigere til verktøylinjen som viser elementsti. Gå til neste elementknapp med TAB eller HØYRE PILTAST. Gå til forrige elementknapp med SHIFT+TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge elementet i editoren."}]}, +{name:"Hurtigtaster",items:[{name:"Angre",legend:"Trykk ${undo}"},{name:"Gjør om",legend:"Trykk ${redo}"},{name:"Fet tekst",legend:"Trykk ${bold}"},{name:"Kursiv tekst",legend:"Trykk ${italic}"},{name:"Understreking",legend:"Trykk ${underline}"},{name:"Lenke",legend:"Trykk ${link}"},{name:"Skjul verktøylinje",legend:"Trykk ${toolbarCollapse}"},{name:"Gå til forrige fokusområde",legend:"Trykk ${accessPreviousSpace} for å komme til nærmeste fokusområde før skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet."}, +{name:"Gå til neste fokusområde",legend:"Trykk ${accessNextSpace} for å komme til nærmeste fokusområde etter skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet."},{name:"Hjelp for tilgjengelighet",legend:"Trykk ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/nl.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/nl.js new file mode 100644 index 0000000..277cf6e --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/nl.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","nl",{title:"Toegankelijkheidsinstructies",contents:"Help inhoud. Druk op ESC om dit dialoog te sluiten.",legend:[{name:"Algemeen",items:[{name:"Werkbalk tekstverwerker",legend:"Druk op ${toolbarFocus} om naar de werkbalk te navigeren. Om te schakelen naar de volgende en vorige werkbalkgroep, gebruik TAB en SHIFT+TAB. Om te schakelen naar de volgende en vorige werkbalkknop, gebruik de PIJL RECHTS en PIJL LINKS. Druk op SPATIE of ENTER om een werkbalkknop te activeren."}, +{name:"Dialoog tekstverwerker",legend:"In een dialoogvenster, druk op TAB om te navigeren naar het volgende veld. Druk op SHIFT+TAB om naar het vorige veld te navigeren. Druk op ENTER om het dialoogvenster te verzenden. Druk op ESC om het dialoogvenster te sluiten. Voor dialoogvensters met meerdere tabbladen, druk op ALT+F10 om naar de tabset te navigeren. Schakel naar het volgende tabblad met TAB of PIJL RECHTS. Schakel naar het vorige tabblad met SHIFT+TAB of PIJL LINKS. Druk op SPATIE of ENTER om het tabblad te selecteren."}, +{name:"Contextmenu tekstverwerker",legend:"Druk op ${contextMenu} of APPLICATION KEY om het contextmenu te openen. Schakel naar de volgende menuoptie met TAB of PIJL OMLAAG. Schakel naar de vorige menuoptie met SHIFT+TAB of PIJL OMHOOG. Druk op SPATIE of ENTER om een menuoptie te selecteren. Op een submenu van de huidige optie met SPATIE, ENTER of PIJL RECHTS. Ga terug naar de bovenliggende menuoptie met ESC of PIJL LINKS. Sluit het contextmenu met ESC."},{name:"Keuzelijst tekstverwerker",legend:"In een keuzelijst, schakel naar het volgende item met TAB of PIJL OMLAAG. Schakel naar het vorige item met SHIFT+TAB of PIJL OMHOOG. Druk op SPATIE of ENTER om het item te selecteren. Druk op ESC om de keuzelijst te sluiten."}, +{name:"Elementenpad werkbalk tekstverwerker",legend:"Druk op ${elementsPathFocus} om naar het elementenpad te navigeren. Om te schakelen naar het volgende element, gebruik TAB of PIJL RECHTS. Om te schakelen naar het vorige element, gebruik SHIFT+TAB or PIJL LINKS. Druk op SPATIE of ENTER om een element te selecteren in de tekstverwerker."}]},{name:"Opdrachten",items:[{name:"Ongedaan maken opdracht",legend:"Druk op ${undo}"},{name:"Opnieuw uitvoeren opdracht",legend:"Druk op ${redo}"},{name:"Vetgedrukt opdracht", +legend:"Druk op ${bold}"},{name:"Cursief opdracht",legend:"Druk op ${italic}"},{name:"Onderstrepen opdracht",legend:"Druk op ${underline}"},{name:"Link opdracht",legend:"Druk op ${link}"},{name:"Werkbalk inklappen opdracht",legend:"Druk op ${toolbarCollapse}"},{name:"Ga naar vorige focus spatie commando",legend:"Druk ${accessPreviousSpace} om toegang te verkrijgen tot de dichtstbijzijnde onbereikbare focus spatie voor de caret, bijvoorbeeld: twee aangrenzende HR elementen. Herhaal de toetscombinatie om de verste focus spatie te bereiken."}, +{name:"Ga naar volgende focus spatie commando",legend:"Druk ${accessNextSpace} om toegang te verkrijgen tot de dichtstbijzijnde onbereikbare focus spatie na de caret, bijvoorbeeld: twee aangrenzende HR elementen. Herhaal de toetscombinatie om de verste focus spatie te bereiken."},{name:"Toegankelijkheidshulp",legend:"Druk op ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/no.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/no.js new file mode 100644 index 0000000..28a54e8 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/no.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","no",{title:"Instruksjoner for tilgjengelighet",contents:"Innhold for hjelp. Trykk ESC for å lukke denne dialogen.",legend:[{name:"Generelt",items:[{name:"Verktøylinje for editor",legend:"Trykk ${toolbarFocus} for å navigere til verktøylinjen. Flytt til neste og forrige verktøylinjegruppe med TAB og SHIFT-TAB. Flytt til neste og forrige verktøylinjeknapp med HØYRE PILTAST og VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å aktivere verktøylinjeknappen."},{name:"Dialog for editor", +legend:"Mens du er i en dialog, trykk TAB for å navigere til neste dialogfelt, press SHIFT + TAB for å flytte til forrige felt, trykk ENTER for å akseptere dialogen, trykk ESC for å avbryte dialogen. For dialoger med flere faner, trykk ALT + F10 for å navigere til listen over faner. Gå til neste fane med TAB eller HØYRE PILTAST. Gå til forrige fane med SHIFT + TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge fanen."},{name:"Kontekstmeny for editor",legend:"Trykk ${contextMenu} eller MENYKNAPP for å åpne kontekstmeny. Gå til neste alternativ i menyen med TAB eller PILTAST NED. Gå til forrige alternativ med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge menyalternativet. Åpne undermenyen på valgt alternativ med MELLOMROM eller ENTER eller HØYRE PILTAST. Gå tilbake til overordnet menyelement med ESC eller VENSTRE PILTAST. Lukk kontekstmenyen med ESC."}, +{name:"Listeboks for editor",legend:"I en listeboks, gå til neste alternativ i listen med TAB eller PILTAST NED. Gå til forrige alternativ i listen med SHIFT + TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge alternativet i listen. Trykk ESC for å lukke listeboksen."},{name:"Verktøylinje for elementsti",legend:"Trykk ${elementsPathFocus} for å navigere til verktøylinjen som viser elementsti. Gå til neste elementknapp med TAB eller HØYRE PILTAST. Gå til forrige elementknapp med SHIFT+TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge elementet i editoren."}]}, +{name:"Kommandoer",items:[{name:"Angre",legend:"Trykk ${undo}"},{name:"Gjør om",legend:"Trykk ${redo}"},{name:"Fet tekst",legend:"Trykk ${bold}"},{name:"Kursiv tekst",legend:"Trykk ${italic}"},{name:"Understreking",legend:"Trykk ${underline}"},{name:"Link",legend:"Trykk ${link}"},{name:"Skjul verktøylinje",legend:"Trykk ${toolbarCollapse}"},{name:"Gå til forrige fokusområde",legend:"Trykk ${accessPreviousSpace} for å komme til nærmeste fokusområde før skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet."}, +{name:"Gå til neste fokusområde",legend:"Trykk ${accessNextSpace} for å komme til nærmeste fokusområde etter skrivemarkøren som ikke kan nås på vanlig måte, for eksempel to tilstøtende HR-elementer. Gjenta tastekombinasjonen for å komme til fokusområder lenger unna i dokumentet."},{name:"Hjelp for tilgjengelighet",legend:"Trykk ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/pl.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/pl.js new file mode 100644 index 0000000..5031e74 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/pl.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","pl",{title:"Instrukcje dotyczące dostępności",contents:"Zawartość pomocy. Wciśnij ESC, aby zamknąć to okno.",legend:[{name:"Informacje ogólne",items:[{name:"Pasek narzędzi edytora",legend:"Wciśnij ${toolbarFocus} aby przejść do paska narzędzi. Przejdź do następnej i poprzedniej grupy narzędzi używając TAB oraz SHIFT-TAB. Przejdź do następnego i poprzedniego narzędzia używając STRZAŁKI W PRAWO lub STRZAŁKI W LEWO. Wciśnij SPACJĘ lub ENTER, aby aktywować zaznaczone narzędzie."}, +{name:"Okno dialogowe edytora",legend:"Będąc w oknie dialogowym wciśnij TAB aby przejść do następnego pola dialogowego, wciśnij SHIFT + TAB aby przejść do poprzedniego pola, wciśnij ENTER aby wysłać dialog, wciśnij ESC aby anulować dialog. Dla okien dialogowych z wieloma zakładkami, wciśnij ALT + F10 aby przejść do listy zakładek. Gdy to zrobisz przejdź do następnej zakładki wciskając TAB lub STRZAŁKĘ W PRAWO. Przejdź do poprzedniej zakładki wciskając SHIFT + TAB lub STRZAŁKĘ W LEWO. Wciśnij SPACJĘ lub ENTER aby wybrać zakładkę."}, +{name:"Menu kontekstowe edytora",legend:"Wciśnij ${contextMenu} lub PRZYCISK APLIKACJI aby otworzyć menu kontekstowe. Przejdź do następnej pozycji menu wciskając TAB lub STRZAŁKĘ W DÓŁ. Przejdź do poprzedniej pozycji menu wciskając SHIFT + TAB lub STRZAŁKĘ W GÓRĘ. Wciśnij SPACJĘ lub ENTER aby wygrać pozycję menu. Otwórz pod-menu obecnej pozycji wciskając SPACJĘ lub ENTER lub STRZAŁKĘ W PRAWO. Wróć do pozycji nadrzędnego menu wciskając ESC lub STRZAŁKĘ W LEWO. Zamknij menu wciskając ESC."},{name:"Lista w edytorze", +legend:"W polu listy możesz przechodzić do następnego elementu za pomocą klawisza TAB lub STRZAŁKI W DÓŁ. Poprzedni element osiągniesz za pomocą SHIFT+TAB lub STRZAŁKI W GÓRĘ. Za pomocą SPACJI lub ENTERA wybierzesz daną opcję z listy, a za pomocą klawisza ESC opuścisz listę."},{name:"Pasek ścieżki elementów edytora",legend:"Naciśnij ${elementsPathFocus} w celu przejścia do paska ścieżki elementów edytora. W celu przejścia do kolejnego elementu naciśnij klawisz Tab lub Strzałki w prawo. W celu przejścia do poprzedniego elementu naciśnij klawisze Shift+Tab lub Strzałki w lewo. By wybrać element w edytorze, użyj klawisza Spacji lub Enter."}]}, +{name:"Polecenia",items:[{name:"Polecenie Cofnij",legend:"Naciśnij ${undo}"},{name:"Polecenie Ponów",legend:"Naciśnij ${redo}"},{name:"Polecenie Pogrubienie",legend:"Naciśnij ${bold}"},{name:"Polecenie Kursywa",legend:"Naciśnij ${italic}"},{name:"Polecenie Podkreślenie",legend:"Naciśnij ${underline}"},{name:"Polecenie Wstaw/ edytuj odnośnik",legend:"Naciśnij ${link}"},{name:"Polecenie schowaj pasek narzędzi",legend:"Naciśnij ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."}, +{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:"Pomoc dotycząca dostępności",legend:"Naciśnij ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/pt-br.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/pt-br.js new file mode 100644 index 0000000..f5ab7c6 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/pt-br.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","pt-br",{title:"Instruções de Acessibilidade",contents:"Conteúdo da Ajuda. Para fechar este diálogo pressione ESC.",legend:[{name:"Geral",items:[{name:"Barra de Ferramentas do Editor",legend:"Pressione ${toolbarFocus} para navegar para a barra de ferramentas. Mova para o anterior ou próximo grupo de ferramentas com TAB e SHIFT-TAB. Mova para o anterior ou próximo botão com SETA PARA DIREITA or SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para ativar o botão da barra de ferramentas."}, +{name:"Diálogo do Editor",legend:"Dentro de um diálogo, pressione TAB para navegar para o próximo campo, pressione SHIFT + TAB para mover para o campo anterior, pressione ENTER para enviar o diálogo, pressione ESC para cancelar o diálogo. Para diálogos que tem múltiplas abas, pressione ALT + F10 para navegar para a lista de abas, então mova para a próxima aba com SHIFT + TAB ou SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para selecionar a aba."},{name:"Menu de Contexto do Editor",legend:"Pressione ${contextMenu} ou TECLA DE MENU para abrir o menu de contexto, então mova para a próxima opção com TAB ou SETA PARA BAIXO. Mova para a anterior com SHIFT+TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar a opção do menu. Abra o submenu da opção atual com ESPAÇO ou ENTER ou SETA PARA DIREITA. Volte para o menu pai com ESC ou SETA PARA ESQUERDA. Feche o menu de contexto com ESC."}, +{name:"Caixa de Lista do Editor",legend:"Dentro de uma caixa de lista, mova para o próximo item com TAB ou SETA PARA BAIXO. Mova para o item anterior com SHIFT + TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar uma opção na lista. Pressione ESC para fechar a caixa de lista."},{name:"Barra de Caminho do Elementos do Editor",legend:"Pressione ${elementsPathFocus} para a barra de caminho dos elementos. Mova para o próximo botão de elemento com TAB ou SETA PARA DIREITA. Mova para o botão anterior com SHIFT+TAB ou SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para selecionar o elemento no editor."}]}, +{name:"Comandos",items:[{name:" Comando Desfazer",legend:"Pressione ${undo}"},{name:" Comando Refazer",legend:"Pressione ${redo}"},{name:" Comando Negrito",legend:"Pressione ${bold}"},{name:" Comando Itálico",legend:"Pressione ${italic}"},{name:" Comando Sublinhado",legend:"Pressione ${underline}"},{name:" Comando Link",legend:"Pressione ${link}"},{name:" Comando Fechar Barra de Ferramentas",legend:"Pressione ${toolbarCollapse}"},{name:"Acessar o comando anterior de spaço de foco",legend:"Pressione ${accessNextSpace} para acessar o espaço de foco não alcançável mais próximo antes do cursor, por exemplo: dois elementos HR adjacentes. Repita a combinação de teclas para alcançar espaços de foco distantes."}, +{name:"Acessar próximo fomando de spaço de foco",legend:"Pressione ${accessNextSpace} para acessar o espaço de foco não alcançável mais próximo após o cursor, por exemplo: dois elementos HR adjacentes. Repita a combinação de teclas para alcançar espaços de foco distantes."},{name:" Ajuda de Acessibilidade",legend:"Pressione ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/pt.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/pt.js new file mode 100644 index 0000000..79d72b1 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/pt.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","pt",{title:"Instruções de Acessibilidade",contents:"Conteúdos da Ajuda. Pressione em 'ESC' para fechar esta janela.",legend:[{name:"Geral",items:[{name:"Barra de Ferramentas do Editor",legend:"Clique em ${toolbarFocus} para navegar para a barra de ferramentas. Vá para o grupo da barra de ferramentas anterior e seguinte com TAB e SHIFT+TAB. Vá para o botão da barra de ferramentas anterior com a SETA DIREITA ou ESQUERDA. Pressione ESPAÇO ou ENTER para ativar o botão da barra de ferramentas."}, +{name:"Janela do Editor",legend:"Dentro de uma janela, pressione TAB para navigar para o campo da janela seguinte, pressione SHIFT + TAB para mover para o campo anterior, pressione ENTER para submeter a janela, pressione ESC para cancelar a janela. Para as janelas que têm múltiplos páginas com separadores, pressione ALT + F10 para navegar para a lista do separador. Depois mova para o seguinte separador com TAB ou SETA DIREITA. Mover para o separador anterior com SHIFT + TAB ou SETA ESQUERDA. Pressione ESPAÇO ou ENTER para selecionar o separador da página."}, +{name:"Menu de Contexto do Editor",legend:"Clique em ${contextMenu} ou TECLA APLICAÇÃO para abrir o menu de contexto. Depois vá para a opção do menu seguinte com TAB ou SETA PARA BAIXO. Vá para a opção anterior com SHIFT+TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar a opção do menu. Abra o submenu da opção atual com ESPAÇO, ENTER ou SETA DIREITA. GVá para o item do menu parente com ESC ou SETA ESQUERDA. Feche o menu de contexto com ESC."},{name:"Caixa Lista Editor",legend:"Dentro da caixa da lista, vá para o itemda lista seguinte com TAB ou SETA PARA BAIXO. Move Vá parao item da lista anterior com SHIFT+TAB ou SETA PARA BAIXO. Pressione ESPAÇO ou ENTER para selecionar a opção da lista. Pressione ESC para fechar a caisa da lista."}, +{name:"Caminho Barra Elemento Editor",legend:"Clique em ${elementsPathFocus} para navegar para a barra do caminho dos elementos. Vá para o botão do elemento seguinte com TAB ou SETA DIREITA. Vá para o botão anterior com SHIFT+TAB ou SETA ESQUERDA. Pressione ESPAÇO ou ENTER para selecionar o elemento no editor."}]},{name:"Comandos",items:[{name:"Comando de Anular",legend:"Pressione ${undo}"},{name:"Comando de Refazer",legend:"Pressione ${redo}"},{name:"Comando de Negrito",legend:"Pressione ${bold}"}, +{name:"Comando de Itálico",legend:"Pressione ${italic}"},{name:"Comando de Sublinhado",legend:"Pressione ${underline}"},{name:"Comando de Hiperligação",legend:"Pressione ${link}"},{name:"Comando de Ocultar Barra de Ferramentas",legend:"Pressione ${toolbarCollapse}"},{name:"Acesso comando do espaço focus anterior",legend:"Clique em ${accessPreviousSpace} para aceder ao espaço do focos inalcançável mais perto antes do sinal de omissão, por exemplo: dois elementos HR adjacentes. Repetir a combinação da chave para alcançar os espaços dos focos distantes."}, +{name:"Acesso comando do espaço focus seguinte",legend:"Pressione ${accessNextSpace} para aceder ao espaço do focos inalcançável mais perto depois do sinal de omissão, por exemplo: dois elementos HR adjacentes. Repetir a combinação da chave para alcançar os espaços dos focos distantes."},{name:"Ajuda de Acessibilidade",legend:"Pressione ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ro.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ro.js new file mode 100644 index 0000000..b6cda72 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ro.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","ro",{title:"Instrucțiuni de accesibilitate",contents:"Cuprins. Pentru a închide acest dialog, apăsați tasta ESC.",legend:[{name:"General",items:[{name:"Editează bara.",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Dialog editor",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."}, +{name:"Editor meniu contextual",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."}, +{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command", +legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."}, +{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ru.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ru.js new file mode 100644 index 0000000..8ea8f9a --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ru.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","ru",{title:"Горячие клавиши",contents:"Помощь. Для закрытия этого окна нажмите ESC.",legend:[{name:"Основное",items:[{name:"Панель инструментов",legend:"Нажмите ${toolbarFocus} для перехода к панели инструментов. Для перемещения между группами панели инструментов используйте TAB и SHIFT-TAB. Для перемещения между кнопками панели иструментов используйте кнопки ВПРАВО или ВЛЕВО. Нажмите ПРОБЕЛ или ENTER для запуска кнопки панели инструментов."},{name:"Диалоги",legend:"В диалоговом окне, нажмите клавишу TAB для перехода к следующему диалоговому полю, нажмите клавиши SHIFT + TAB, чтобы перейти к предыдущему полю, нажмите ENTER, чтобы отправить данные, нажмите клавишу ESC, для отмены. Для окон, которые имеют несколько вкладок, нажмите ALT + F10 для перехода к списку вкладок. Переход к следующей вкладке TAB ИЛИ ПРАВУЮ СТРЕЛКУ. Переход к предыдущей вкладке с помощью SHIFT + TAB или ЛЕВАЯ СТРЕЛКА. Нажмите ПРОБЕЛ или ENTER, чтобы выбрать вкладку."}, +{name:"Контекстное меню",legend:'Нажмите ${contextMenu} или клавишу APPLICATION, чтобы открыть контекстное меню. Затем перейдите к следующему пункту меню с помощью TAB или стрелкой "ВНИЗ". Переход к предыдущей опции - SHIFT+TAB или стрелкой "ВВЕРХ". Нажмите SPACE, или ENTER, чтобы задействовать опцию меню. Открыть подменю текущей опции - SPACE или ENTER или стрелкой "ВПРАВО". Возврат к родительскому пункту меню - ESC или стрелкой "ВЛЕВО". Закрытие контекстного меню - ESC.'},{name:"Редактор списка", +legend:'Внутри окна списка, переход к следующему пункту списка - TAB или стрелкой "ВНИЗ". Переход к предыдущему пункту списка - SHIFT + TAB или стрелкой "ВВЕРХ". Нажмите SPACE, или ENTER, чтобы задействовать опцию списка. Нажмите ESC, чтобы закрыть окно списка.'},{name:"Путь к элементу",legend:'Нажмите ${elementsPathFocus}, чтобы перейти к панели пути элементов. Переход к следующей кнопке элемента - TAB или стрелкой "ВПРАВО". Переход к предыдущей кнопку - SHIFT+TAB или стрелкой "ВЛЕВО". Нажмите SPACE, или ENTER, чтобы выбрать элемент в редакторе.'}]}, +{name:"Команды",items:[{name:"Отменить",legend:"Нажмите ${undo}"},{name:"Повторить",legend:"Нажмите ${redo}"},{name:"Полужирный",legend:"Нажмите ${bold}"},{name:"Курсив",legend:"Нажмите ${italic}"},{name:"Подчеркнутый",legend:"Нажмите ${underline}"},{name:"Гиперссылка",legend:"Нажмите ${link}"},{name:"Свернуть панель инструментов",legend:"Нажмите ${toolbarCollapse}"},{name:"Команды доступа к предыдущему фокусному пространству",legend:'Нажмите ${accessPreviousSpace}, чтобы обратиться к ближайшему недостижимому фокусному пространству перед символом "^", например: два смежных HR элемента. Повторите комбинацию клавиш, чтобы достичь отдаленных фокусных пространств.'}, +{name:"Команды доступа к следующему фокусному пространству",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:"Справка по горячим клавишам",legend:"Нажмите ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/si.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/si.js new file mode 100644 index 0000000..816dc75 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/si.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","si",{title:"ළඟා වියහැකි ",contents:"උදව් සඳහා අන්තර්ගතය.නික්මයෙමට ESC බොත්තම ඔබන්න",legend:[{name:"පොදු කරුණු",items:[{name:"සංස්කරණ මෙවලම් ",legend:"ඔබන්න ${මෙවලම් තීරු අවධානය} මෙවලම් තීරුවේ එහා මෙහා යෑමට.ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරුකාණ්ඩය හා TAB හා SHIFT-TAB .ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරු බොත්තම සමග RIGHT ARROW හෝ LEFT ARROW.මෙවලම් තීරු බොත්තම සක්‍රිය කර ගැනීමට SPACE හෝ ENTER බොත්තම ඔබන්න."},{name:"සංස්කරණ ",legend:"දෙබසක් තුළ, ඊළඟ දෙබස් පෙදෙසට යෑමට TAB බොත්තම ඔබන්න, කලින් පෙදෙසට යෑමට SHIFT + TAB බොත්තම ද, දෙබස් ඉදිරිපත් කිරීමට ENTER බොත්තම ද, දෙබස් නැවතීමට ESCබොත්තම ද, දෙබස් සහිත ගොනු, පිටු වැඩි සංක්‍යයාවක් ලබා ගෙනිමට,ගොනු තුළ එහාමෙහා යෑමට ALT + F10 බොත්තම් ද, ඊළඟ ගොනුවට යෑමට TAB හෝ RIGTH ARROW බොත්තම ඔබන්න. පෙර ගොනුවට යෑමට SHIFT + TAB හෝ LEFT ARROW බොත්තම් ද ,ගොනු පිටු තේරීමට SPACE හෝ ENTER බොත්තම් ද ඔබන්න."}, +{name:"සංස්කරණ අඩංගුවට ",legend:"ඔබන්න ${අන්තර්ගත මෙනුව} හෝ APPLICATION KEY අන්තර්ගත-මෙනුව විවුරතකිරීමට. ඊළඟ මෙනුව-ව්කල්පයන්ට යෑමට TAB හෝ DOWN ARROW බොත්තම ද, පෙර විකල්පයන්ටයෑමට SHIFT+TAB හෝ UP ARROW බොත්තම ද, මෙනුව-ව්කල්පයන් තේරීමට SPACE හෝ ENTER බොත්තම ද, දැනට විවුර්තව ඇති උප-මෙනුවක වීකල්ප තේරීමට SPACE හෝ ENTER හෝ RIGHT ARROW ද, නැවත පෙර ප්‍රධාන මෙනුවට යෑමට ESC හෝ LEFT ARROW බොත්තම ද. අන්තර්ගත-මෙනුව වැසීමට ESC බොත්තම ද ඔබන්න."},{name:"සංස්කරණ තේරුම් ",legend:"තේරුම් කොටුව තුළ , ඊළඟ අයිතමයට යෑමට TAB හෝ DOWN ARROW , පෙර අයිතමයට යෑමට SHIFT + TAB හෝ UP ARROW . අයිතම විකල්පයන් තේරීමට SPACE හෝ ENTER ,තේරුම් කොටුව වැසීමට ESC බොත්තම් ද ඔබන්න."}, +{name:"සංස්කරණ අංග සහිත ",legend:"ඔබන්න ${මෙවලම් තීරු අවධානය} මෙවලම් තීරුවේ එහා මෙහා යෑමට.ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරුකාණ්ඩය හා TAB හා SHIFT-TAB .ඉදිරියට යෑමට හා ආපසු යෑමට මෙවලම් තීරු බොත්තම සමග RIGHT ARROW හෝ LEFT ARROW.මෙවලම් තීරු බොත්තම සක්‍රිය කර ගැනීමට SPACE හෝ ENTER බොත්තම ඔබන්න."}]},{name:"විධාන",items:[{name:"විධානය වෙනස් ",legend:"ඔබන්න ${වෙනස් කිරීම}"},{name:"විධාන නැවත් පෙර පරිදිම වෙනස්කර ගැනීම.",legend:"ඔබන්න ${නැවත් පෙර පරිදිම වෙනස්කර ගැනීම}"},{name:"තද අකුරින් විධාන",legend:"ඔබන්න ${තද }"}, +{name:"බැධී අකුරු විධාන",legend:"ඔබන්න ${බැධී අකුරු }"},{name:"යටින් ඉරි ඇද ඇති විධාන.",legend:"ඔබන්න ${යටින් ඉරි ඇද ඇති}"},{name:"සම්බන්ධිත විධාන",legend:"ඔබන්න ${සම්බන්ධ }"},{name:"මෙවලම් තීරු හැකුලුම් විධාන",legend:"ඔබන්න ${මෙවලම් තීරු හැකුලුම් }"},{name:"යොමුවීමට පෙර වැදගත් විධාන",legend:"ඔබන්න ${යොමුවීමට ඊළඟ }"},{name:"යොමුවීමට ඊළග වැදගත් විධාන",legend:"ඔබන්න ${යොමුවීමට ඊළඟ }"},{name:"ප්‍රවේශ ",legend:"ඔබන්න ${a11y }"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/sk.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/sk.js new file mode 100644 index 0000000..9d40e79 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/sk.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","sk",{title:"Inštrukcie prístupnosti",contents:"Pomocný obsah. Pre zatvorenie tohto okna, stlačte ESC.",legend:[{name:"Všeobecne",items:[{name:"Lišta nástrojov editora",legend:"Stlačte ${toolbarFocus} pre navigáciu na lištu nástrojov. Medzi ďalšou a predchádzajúcou lištou nástrojov sa pohybujete s TAB a SHIFT-TAB. Medzi ďalším a predchádzajúcim tlačidlom na lište nástrojov sa pohybujete s pravou šípkou a ľavou šípkou. Stlačte medzerník alebo ENTER pre aktiváciu tlačidla lišty nástrojov."}, +{name:"Editorový dialóg",legend:"V dialogu, stlačte TAB pre navigáciu na ďalšie dialógové pole, stlačte STIFT + TAB pre presun na predchádzajúce pole, stlačte ENTER pre odoslanie dialógu, stlačte ESC pre zrušenie dialógu. Pre dialógy, ktoré majú viac záložiek, stlačte ALT + F10 pre navigácou do zoznamu záložiek. Potom sa posúvajte k ďalšej žáložke pomocou TAB alebo pravou šípkou. Pre presun k predchádzajúcej záložke, stlačte SHIFT + TAB alebo ľavú šípku. Stlačte medzerník alebo ENTER pre vybranie záložky."}, +{name:"Editorové kontextové menu",legend:"Stlačte ${contextMenu} alebo APPLICATION KEY pre otvorenie kontextového menu. Potom sa presúvajte na ďalšie možnosti menu s TAB alebo dolnou šípkou. Presunte sa k predchádzajúcej možnosti s SHIFT + TAB alebo hornou šípkou. Stlačte medzerník alebo ENTER pre výber možnosti menu. Otvorte pod-menu danej možnosti s medzerníkom, alebo ENTER, alebo pravou šípkou. Vráťte sa späť do položky rodičovského menu s ESC alebo ľavou šípkou. Zatvorte kontextové menu s ESC."}, +{name:"Editorov box zoznamu",legend:"V boxe zoznamu, presuňte sa na ďalšiu položku v zozname s TAB alebo dolnou šípkou. Presuňte sa k predchádzajúcej položke v zozname so SHIFT + TAB alebo hornou šípkou. Stlačte medzerník alebo ENTER pre výber možnosti zoznamu. Stlačte ESC pre zatvorenie boxu zoznamu."},{name:"Editorove pásmo cesty prvku",legend:"Stlačte ${elementsPathFocus} pre navigovanie na pásmo cesty elementu. Presuňte sa na tlačidlo ďalšieho prvku s TAB alebo pravou šípkou. Presuňte sa k predchádzajúcemu tlačidlu s SHIFT + TAB alebo ľavou šípkou. Stlačte medzerník alebo ENTER pre výber prvku v editore."}]}, +{name:"Príkazy",items:[{name:"Vrátiť príkazy",legend:"Stlačte ${undo}"},{name:"Nanovo vrátiť príkaz",legend:"Stlačte ${redo}"},{name:"Príkaz na stučnenie",legend:"Stlačte ${bold}"},{name:"Príkaz na kurzívu",legend:"Stlačte ${italic}"},{name:"Príkaz na podčiarknutie",legend:"Stlačte ${underline}"},{name:"Príkaz na odkaz",legend:"Stlačte ${link}"},{name:"Príkaz na zbalenie lišty nástrojov",legend:"Stlačte ${toolbarCollapse}"},{name:"Prejsť na predchádzajúcu zamerateľnú medzeru príkazu",legend:"Stlačte ${accessPreviousSpace} pre prístup na najbližšie nedosiahnuteľné zamerateľné medzery pred vsuvkuo. Napríklad: dve za sebou idúce horizontálne čiary. Opakujte kombináciu klávesov pre dosiahnutie vzdialených zamerateľných medzier."}, +{name:"Prejsť na ďalší ",legend:"Stlačte ${accessNextSpace} pre prístup na najbližšie nedosiahnuteľné zamerateľné medzery po vsuvke. Napríklad: dve za sebou idúce horizontálne čiary. Opakujte kombináciu klávesov pre dosiahnutie vzdialených zamerateľných medzier."},{name:"Pomoc prístupnosti",legend:"Stlačte ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/sl.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/sl.js new file mode 100644 index 0000000..f5dd310 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/sl.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","sl",{title:"Navodila Dostopnosti",contents:"Vsebina Pomoči. Če želite zapreti to pogovorno okno pritisnite ESC.",legend:[{name:"Splošno",items:[{name:"Urejevalna Orodna Vrstica",legend:"Pritisnite ${toolbarFocus} za pomik v orodno vrstico. Z TAB in SHIFT-TAB se pomikate na naslednjo in prejšnjo skupino orodne vrstice. Z DESNO PUŠČICO ali LEVO PUŠČICO se pomikate na naslednji in prejšnji gumb orodne vrstice. Pritisnite SPACE ali ENTER, da aktivirate gumb orodne vrstice."}, +{name:"Urejevalno Pogovorno Okno",legend:"Znotraj pogovornega okna, pritisnite tipko TAB za pomik na naslednjo pogovorno polje, pritisnite SHIFT + TAB za pomik v prejšnje polje, pritisnite tipko ENTER za predložitev pogovornega okna, pritisnite tipko ESC, da prekličete okno. Za okna, ki imajo več zavihkov, pritisnite ALT + F10, da pojdete na seznam zavihkov. Na naslednji zavihek se premaknete s tipko TAB ali DESNO PUŠČICO. Z SHIFT + TAB ali LEVO PUŠČICO pa se premaknete na prejšnji zavihek. Pritisnite tipko SPACE ali ENTER za izbiro zavihka."}, +{name:"Urejevalni Kontekstni Meni",legend:"Pritisnite ${contextMenu} ali APPLICATION KEY, da odprete kontekstni meni. Nato se premaknite na naslednjo možnost menija s tipko TAB ali PUŠČICA DOL. Premakniti se na prejšnjo možnost z SHIFT + TAB ali PUŠČICA GOR. Pritisnite SPACE ali ENTER za izbiro možnosti menija. Odprite podmeni trenutne možnosti menija s tipko SPACE ali ENTER ali DESNA PUŠČICA. Vrnite se na matični element menija s tipko ESC ali LEVA PUŠČICA. Zaprite kontekstni meni z ESC."},{name:"Urejevalno Seznamsko Polje", +legend:"Znotraj seznama, se premaknete na naslednji element seznama s tipko TAB ali PUŠČICO DOL. Z SHIFT + TAB ali PUŠČICO GOR se premaknete na prejšnji element seznama. Pritisnite tipko SPACE ali ENTER za izbiro elementa. Pritisnite tipko ESC, da zaprete seznam."},{name:"Urejevalna vrstica poti elementa",legend:"Pritisnite ${elementsPathFocus} za pomikanje po vrstici elementnih poti. S TAB ali DESNA PUŠČICA se premaknete na naslednji gumb elementa. Z SHIFT + TAB ali LEVO PUŠČICO se premaknete na prejšnji gumb elementa. Pritisnite SPACE ali ENTER za izbiro elementa v urejevalniku."}]}, +{name:"Ukazi",items:[{name:"Razveljavi ukaz",legend:"Pritisnite ${undo}"},{name:"Ponovi ukaz",legend:"Pritisnite ${redo}"},{name:"Krepki ukaz",legend:"Pritisnite ${bold}"},{name:"Ležeči ukaz",legend:"Pritisnite ${italic}"},{name:"Poudarni ukaz",legend:"Pritisnite ${underline}"},{name:"Ukaz povezave",legend:"Pritisnite ${link}"},{name:"Skrči Orodno Vrstico Ukaz",legend:"Pritisnite ${toolbarCollapse}"},{name:"Dostop do prejšnjega ukaza ostrenja",legend:"Pritisnite ${accessPreviousSpace} za dostop do najbližjega nedosegljivega osredotočenega prostora pred strešico, npr.: dva sosednja HR elementa. Ponovite kombinacijo tipk, da dosežete oddaljene osredotočene prostore."}, +{name:"Dostop do naslednjega ukaza ostrenja",legend:"Pritisnite ${accessNextSpace} za dostop do najbližjega nedosegljivega osredotočenega prostora po strešici, npr.: dva sosednja HR elementa. Ponovite kombinacijo tipk, da dosežete oddaljene osredotočene prostore."},{name:"Pomoč Dostopnosti",legend:"Pritisnite ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/sq.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/sq.js new file mode 100644 index 0000000..9e4d696 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/sq.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","sq",{title:"Udhëzimet e Qasjes",contents:"Përmbajtja ndihmëse. Për ta mbyllur dialogun shtyp ESC.",legend:[{name:"Të përgjithshme",items:[{name:"Shiriti i Redaktuesit",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Dialogu i Redaktuesit",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."}, +{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."}, +{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Komandat",items:[{name:"Rikthe komandën",legend:"Shtyp ${undo}"},{name:"Ribëj komandën",legend:"Shtyp ${redo}"},{name:"Komanda e trashjes së tekstit",legend:"Shtyp ${bold}"},{name:"Komanda kursive",legend:"Shtyp ${italic}"}, +{name:"Komanda e nënvijëzimit",legend:"Shtyp ${underline}"},{name:"Komanda e Nyjes",legend:"Shtyp ${link}"},{name:" Toolbar Collapse command",legend:"Shtyp ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."}, +{name:"Ndihmë Qasjeje",legend:"Shtyp ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/sr-latn.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/sr-latn.js new file mode 100644 index 0000000..56a4083 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/sr-latn.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","sr-latn",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"Opšte",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."}, +{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."}, +{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command", +legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."}, +{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/sr.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/sr.js new file mode 100644 index 0000000..e2dc7af --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/sr.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","sr",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"Опште",items:[{name:"Editor Toolbar",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."}, +{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."}, +{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"Commands",items:[{name:" Undo command",legend:"Press ${undo}"},{name:" Redo command",legend:"Press ${redo}"},{name:" Bold command",legend:"Press ${bold}"},{name:" Italic command",legend:"Press ${italic}"},{name:" Underline command", +legend:"Press ${underline}"},{name:" Link command",legend:"Press ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."}, +{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/sv.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/sv.js new file mode 100644 index 0000000..1fd8cf1 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/sv.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","sv",{title:"Hjälpmedelsinstruktioner",contents:"Hjälpinnehåll. För att stänga denna dialogruta trycker du på ESC.",legend:[{name:"Allmänt",items:[{name:"Editor verktygsfält",legend:"Tryck på ${toolbarFocus} för att navigera till verktygsfältet. Flytta till nästa och föregående verktygsfältsgrupp med TAB och SHIFT-TAB. Flytta till nästa och föregående knapp i verktygsfältet med HÖGERPIL eller VÄNSTERPIL. Tryck Space eller ENTER för att aktivera knappen i verktygsfältet."}, +{name:"Dialogeditor",legend:"Inuti en dialogruta, tryck TAB för att navigera till nästa fält i dialogrutan. Du trycker SKIFT + TAB för att flytta till föregående fält. Tryck ENTER för att skicka. Du avbryter och stänger dialogen med ESC. För dialogrutor som har flera flikar, tryck ALT + F10 navigera till fliklistan. Flytta sedan till nästa flik med HÖGERPIL. Flytta till föregående flik med SHIFT + TAB eller VÄNSTERPIL. Tryck Space eller ENTER för att välja fliken."},{name:"Editor för innehållsmeny", +legend:"Tryck på $ {contextMenu} eller PROGRAMTANGENTEN för att öppna snabbmenyn. Flytta sedan till nästa menyalternativ med TAB eller NEDPIL. Flytta till föregående alternativ med SHIFT + TABB eller UPPIL. Tryck Space eller ENTER för att välja menyalternativ. Öppna undermeny av nuvarande alternativ med SPACE eller ENTER eller HÖGERPIL. Gå tillbaka till överordnade menyalternativ med ESC eller VÄNSTERPIL. Stäng snabbmenyn med ESC."},{name:"Editor för List Box",legend:"Inuti en list-box, gå till nästa listobjekt med TAB eller NEDPIL. Flytta till föregående listobjekt med SHIFT + TAB eller UPPIL. Tryck Space eller ENTER för att välja listan alternativet. Tryck ESC för att stänga listan-boxen."}, +{name:"Editor för elementens sökväg",legend:"Tryck på $ {elementsPathFocus} för att navigera till verktygsfältet för elementens sökvägar. Flytta till nästa elementknapp med TAB eller HÖGERPIL. Flytta till föregående knapp med SKIFT + TAB eller VÄNSTERPIL. Tryck Space eller ENTER för att välja element i redigeraren."}]},{name:"Kommandon",items:[{name:"Kommandot ångra",legend:"Tryck på ${undo}"},{name:"Kommandot gör om",legend:"Tryck på ${redo}"},{name:"Kommandot fet stil",legend:"Tryck på ${bold}"}, +{name:"Kommandot kursiv",legend:"Tryck på ${italic}"},{name:"Kommandot understruken",legend:"Tryck på ${underline}"},{name:"kommandot länk",legend:"Tryck på ${link}"},{name:"Verktygsfält Dölj kommandot",legend:"Tryck på ${toolbarCollapse}"},{name:"Gå till föregående fokus plats",legend:"Tryck på ${accessPreviousSpace} för att gå till närmast onåbara utrymme före markören, exempel: två intilliggande HR element. Repetera tangentkombinationen för att gå till nästa."},{name:"Tillgå nästa fokuskommandots utrymme", +legend:"Tryck ${accessNextSpace} på för att komma åt den närmaste onåbar fokus utrymme efter cirkumflex, till exempel: två intilliggande HR element. Upprepa tangentkombinationen för att nå avlägsna fokus utrymmen."},{name:"Hjälp om tillgänglighet",legend:"Tryck ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/th.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/th.js new file mode 100644 index 0000000..25cf28c --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/th.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","th",{title:"Accessibility Instructions",contents:"Help Contents. To close this dialog press ESC.",legend:[{name:"ทั่วไป",items:[{name:"แถบเครื่องมือสำหรับเครื่องมือช่วยพิมพ์",legend:"Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button."},{name:"Editor Dialog",legend:"Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page."}, +{name:"Editor Context Menu",legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC."},{name:"Editor List Box",legend:"Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box."}, +{name:"Editor Element Path Bar",legend:"Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor."}]},{name:"คำสั่ง",items:[{name:"เลิกทำคำสั่ง",legend:"วาง ${undo}"},{name:"คำสั่งสำหรับทำซ้ำ",legend:"วาง ${redo}"},{name:"คำสั่งสำหรับตัวหนา",legend:"วาง ${bold}"},{name:"คำสั่งสำหรับตัวเอียง",legend:"วาง ${italic}"},{name:"คำสั่งสำหรับขีดเส้นใต้", +legend:"วาง ${underline}"},{name:"คำสั่งสำหรับลิงก์",legend:"วาง ${link}"},{name:" Toolbar Collapse command",legend:"Press ${toolbarCollapse}"},{name:" Access previous focus space command",legend:"Press ${accessPreviousSpace} to access the closest unreachable focus space before the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."},{name:" Access next focus space command",legend:"Press ${accessNextSpace} to access the closest unreachable focus space after the caret, for example: two adjacent HR elements. Repeat the key combination to reach distant focus spaces."}, +{name:" Accessibility Help",legend:"Press ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/tr.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/tr.js new file mode 100644 index 0000000..768e522 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/tr.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","tr",{title:"Erişilebilirlik Talimatları",contents:"Yardım içeriği. Bu pencereyi kapatmak için ESC tuşuna basın.",legend:[{name:"Genel",items:[{name:"Düzenleyici Araç Çubuğu",legend:"Araç çubuğunda gezinmek için ${toolbarFocus} basın. TAB ve SHIFT-TAB ile önceki ve sonraki araç çubuğu grubuna taşıyın. SAĞ OK veya SOL OK ile önceki ve sonraki bir araç çubuğu düğmesini hareket ettirin. SPACE tuşuna basın veya araç çubuğu düğmesini etkinleştirmek için ENTER tuşna basın."}, +{name:"Diyalog Düzenleyici",legend:"Dialog penceresi içinde, sonraki iletişim alanına gitmek için SEKME tuşuna basın, önceki alana geçmek için SHIFT + TAB tuşuna basın, pencereyi göndermek için ENTER tuşuna basın, dialog penceresini iptal etmek için ESC tuşuna basın. Birden çok sekme sayfaları olan diyalogların, sekme listesine gitmek için ALT + F10 tuşlarına basın. Sonra TAB veya SAĞ OK sonraki sekmeye taşıyın. SHIFT + TAB veya SOL OK ile önceki sekmeye geçin. Sekme sayfayı seçmek için SPACE veya ENTER tuşuna basın."}, +{name:"İçerik Menü Editörü",legend:"İçerik menüsünü açmak için ${contextMenu} veya UYGULAMA TUŞU'na basın. Daha sonra SEKME veya AŞAĞI OK ile bir sonraki menü seçeneği taşıyın. SHIFT + TAB veya YUKARI OK ile önceki seçeneğe gider. Menü seçeneğini seçmek için SPACE veya ENTER tuşuna basın. Seçili seçeneğin alt menüsünü SPACE ya da ENTER veya SAĞ OK açın. Üst menü öğesini geçmek için ESC veya SOL OK ile geri dönün. ESC ile bağlam menüsünü kapatın."},{name:"Liste Kutusu Editörü",legend:"Liste kutusu içinde, bir sonraki liste öğesine SEKME VEYA AŞAĞI OK ile taşıyın. SHIFT + TAB veya YUKARI önceki liste öğesi taşıyın. Liste seçeneği seçmek için SPACE veya ENTER tuşuna basın. Liste kutusunu kapatmak için ESC tuşuna basın."}, +{name:"Element Yol Çubuğu Editörü",legend:"Elementlerin yol çubuğunda gezinmek için ${ElementsPathFocus} basın. SEKME veya SAĞ OK ile sonraki element düğmesine taşıyın. SHIFT + TAB veya SOL OK önceki düğmeye hareket ettirin. Editör içindeki elementi seçmek için ENTER veya SPACE tuşuna basın."}]},{name:"Komutlar",items:[{name:"Komutu geri al",legend:"$(undo)'ya basın"},{name:"Komutu geri al",legend:"${redo} basın"},{name:" Kalın komut",legend:"${bold} basın"},{name:" İtalik komutu",legend:"${italic} basın"}, +{name:" Alttan çizgi komutu",legend:"${underline} basın"},{name:" Bağlantı komutu",legend:"${link} basın"},{name:" Araç çubuğu Toplama komutu",legend:"${toolbarCollapse} basın"},{name:"Önceki komut alanına odaklan",legend:"Düzeltme imleçinden önce, en yakın uzaktaki alana erişmek için ${accessPreviousSpace} basın, örneğin: iki birleşik HR elementleri. Aynı tuş kombinasyonu tekrarıyla diğer alanlarada ulaşın."},{name:"Sonraki komut alanına odaklan",legend:"Düzeltme imleçinden sonra, en yakın uzaktaki alana erişmek için ${accessNextSpace} basın, örneğin: iki birleşik HR elementleri. Aynı tuş kombinasyonu tekrarıyla diğer alanlarada ulaşın."}, +{name:"Erişilebilirlik Yardımı",legend:"${a11yHelp}'e basın"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ug.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ug.js new file mode 100644 index 0000000..0b4441a --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/ug.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","ug",{title:"قوشۇمچە چۈشەندۈرۈش",contents:"ياردەم مەزمۇنى. بۇ سۆزلەشكۈنى ياپماقچى بولسىڭىز ESC نى بېسىڭ.",legend:[{name:"ئادەتتىكى",items:[{name:"قورال بالداق تەھرىر",legend:"${toolbarFocus} بېسىلسا قورال بالداققا يېتەكلەيدۇ، TAB ياكى SHIFT+TAB ئارقىلىق قورال بالداق گۇرۇپپىسى تاللىنىدۇ، ئوڭ سول يا ئوقتا توپچا تاللىنىدۇ، بوشلۇق ياكى Enter كۇنۇپكىسىدا تاللانغان توپچىنى قوللىنىدۇ."},{name:"تەھرىرلىگۈچ سۆزلەشكۈسى",legend:"سۆزلەشكۈدە TAB كۇنۇپكىسىدا كېيىنكى سۆز بۆلىكىگە يۆتكىلىدۇ، SHIFT + TAB بىرىكمە كۇنۇپكىسىدا ئالدىنقى سۆز بۆلىكىگە يۆتكىلىدۇ، ENTER كۇنۇپكىسىدا سۆزلەشكۈنى تاپشۇرىدۇ، ESC كۇنۇپكىسى سۆزلەشكۈدىن ۋاز كېچىدۇ. كۆپ بەتكۈچلۈك سۆزلەشكۈگە نىسبەتەن، ALT + F10 دا بەتكۈچ تىزىمىغا يۆتكەيدۇ. ئاندىن TAB كۇنۇپكىسى ياكى ئوڭ يا ئوق كۇنۇپكىسى كېيىنكى بەتكۈچكە يۆتكەيدۇ؛ SHIFT + TAB كۇنۇپكىسى ياكى سول يا ئوق كۇنۇپكىسى ئالدىنقى بەتكۈچكە يۆتكەيدۇ. بوشلۇق كۇنۇپكىسى ياكى ENTER كۇنۇپكىسى بەتكۈچنى تاللايدۇ."}, +{name:"تەھرىرلىگۈچ تىل مۇھىت تىزىملىكى",legend:"${contextMenu} ياكى ئەپ كۇنۇپكىسىدا تىل مۇھىت تىزىملىكىنى ئاچىدۇ. ئاندىن TAB ياكى ئاستى يا ئوق كۇنۇپكىسىدا كېيىنكى تىزىملىك تۈرىگە يۆتكەيدۇ؛ SHIFT+TAB ياكى ئۈستى يا ئوق كۇنۇپكىسىدا ئالدىنقى تىزىملىك تۈرىگە يۆتكەيدۇ. بوشلۇق ياكى ENTER كۇنۇپكىسىدا تىزىملىك تۈرىنى تاللايدۇ. بوشلۇق، ENTER ياكى ئوڭ يا ئوق كۇنۇپكىسىدا تارماق تىزىملىكنى ئاچىدۇ. قايتىش تىزىملىكىگە ESC ياكى سول يا ئوق كۇنۇپكىسى ئىشلىتىلىدۇ. ESC كۇنۇپكىسىدا تىل مۇھىت تىزىملىكى تاقىلىدۇ."},{name:"تەھرىرلىگۈچ تىزىمى", +legend:"تىزىم قۇتىسىدا، كېيىنكى تىزىم تۈرىگە يۆتكەشتە TAB ياكى ئاستى يا ئوق كۇنۇپكىسى ئىشلىتىلىدۇ. ئالدىنقى تىزىم تۈرىگە يۆتكەشتە SHIFT + TAB ياكى ئۈستى يا ئوق كۇنۇپكىسى ئىشلىتىلىدۇ. بوشلۇق ياكى ENTER كۇنۇپكىسىدا تىزىم تۈرىنى تاللايدۇ.ESC كۇنۇپكىسىدا تىزىم قۇتىسىنى يىغىدۇ."},{name:"تەھرىرلىگۈچ ئېلېمېنت يول بالداق",legend:"${elementsPathFocus} بېسىلسا ئېلېمېنت يول بالداققا يېتەكلەيدۇ، TAB ياكى ئوڭ يا ئوقتا كېيىنكى ئېلېمېنت تاللىنىدۇ، SHIFT+TAB ياكى سول يا ئوقتا ئالدىنقى ئېلېمېنت تاللىنىدۇ، بوشلۇق ياكى Enter كۇنۇپكىسىدا تەھرىرلىگۈچتىكى ئېلېمېنت تاللىنىدۇ."}]}, +{name:"بۇيرۇق",items:[{name:"بۇيرۇقتىن يېنىۋال",legend:"${undo} نى بېسىڭ"},{name:"قايتىلاش بۇيرۇقى",legend:"${redo} نى بېسىڭ"},{name:"توملىتىش بۇيرۇقى",legend:"${bold} نى بېسىڭ"},{name:"يانتۇ بۇيرۇقى",legend:"${italic} نى بېسىڭ"},{name:"ئاستى سىزىق بۇيرۇقى",legend:"${underline} نى بېسىڭ"},{name:"ئۇلانما بۇيرۇقى",legend:"${link} نى بېسىڭ"},{name:"قورال بالداق قاتلاش بۇيرۇقى",legend:"${toolbarCollapse} نى بېسىڭ"},{name:"ئالدىنقى فوكۇس نۇقتىسىنى زىيارەت قىلىدىغان بۇيرۇق",legend:"${accessPreviousSpace} بېسىپ ^ بەلگىسىگە ئەڭ يېقىن زىيارەت قىلغىلى بولمايدىغان فوكۇس نۇقتا رايونىنىڭ ئالدىنى زىيارەت قىلىدۇ، مەسىلەن: ئۆز ئارا قوشنا ئىككى HR ئېلېمېنت. بۇ بىرىكمە كۇنۇپكا تەكرارلانسا يىراقتىكى فوكۇس نۇقتا رايونىغا يەتكىلى بولىدۇ."}, +{name:"كېيىنكى فوكۇس نۇقتىسىنى زىيارەت قىلىدىغان بۇيرۇق",legend:"${accessNextSpace} بېسىپ ^ بەلگىسىگە ئەڭ يېقىن زىيارەت قىلغىلى بولمايدىغان فوكۇس نۇقتا رايونىنىڭ كەينىنى زىيارەت قىلىدۇ، مەسىلەن: ئۆز ئارا قوشنا ئىككى HR ئېلېمېنت. بۇ بىرىكمە كۇنۇپكا تەكرارلانسا يىراقتىكى فوكۇس نۇقتا رايونىغا يەتكىلى بولىدۇ."},{name:"توسالغۇسىز لايىھە چۈشەندۈرۈشى",legend:"${a11yHelp} نى بېسىڭ"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/uk.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/uk.js new file mode 100644 index 0000000..cf1eebf --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/uk.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","uk",{title:"Спеціальні Інструкції",contents:"Довідка. Натисніть ESC і вона зникне.",legend:[{name:"Основне",items:[{name:"Панель Редактора",legend:"Натисніть ${toolbarFocus} для переходу до панелі інструментів. Для переміщення між групами панелі інструментів використовуйте TAB і SHIFT-TAB. Для переміщення між кнопками панелі іструментів використовуйте кнопки СТРІЛКА ВПРАВО або ВЛІВО. Натисніть ПРОПУСК або ENTER для запуску кнопки панелі інструментів"},{name:"Діалог Редактора", +legend:"У діалозі натисніть клавішу TAB для переходу до наступного поля, натисніть SHIFT + TAB, щоб перейти до попереднього поля, натисніть ENTER, щоб відправити дані, натисніть ESC, щоб скасувати. Для вікон, які мають кілька вкладок, натисніть ALT + F10 для переходу до списку вкладок. Перехід до наступної вкладки TAB АБО СТРІЛКА ВПРАВО. Перехід до попередньої вкладки за допомогою SHIFT + TAB або СТРІЛКА ВЛІВО. Натисніть ПРОПУСК або ENTER, щоб вибрати вкладку."},{name:"Контекстне Меню Редактора", +legend:"Press ${contextMenu} or APPLICATION KEY to open context-menu. Потім перейдіть до наступного пункту меню за допомогою TAB або СТРІЛКИ ВНИЗ. Натисніть ПРОПУСК або ENTER для вибору параметру меню. Відкрийте підменю поточного параметру, натиснувши ПРОПУСК або ENTER або СТРІЛКУ ВПРАВО. Перейдіть до батьківського елемента меню, натиснувши ESC або СТРІЛКУ ВЛІВО. Закрийте контекстне меню, натиснувши ESC."},{name:"Скринька Списків Редактора",legend:"Всередині списку переходимо до наступного пункту списку клавішею TAB або СТРІЛКА ВНИЗ. Перейти до попереднього елемента списку можна SHIFT + TAB або СТРІЛКА ВГОРУ. Натисніть ПРОПУСК або ENTER, щоб вибрати параметр списку. Натисніть клавішу ESC, щоб закрити список."}, +{name:"Шлях до елемента редактора",legend:"Натисніть ${elementsPathFocus} для навігації між елементами панелі. Перейдіть до наступного елемента кнопкою TAB або СТРІЛКА ВПРАВО. Перейдіть до попереднього елемента кнопкою SHIFT+TAB або СТРІЛКА ВЛІВО. Натисніть ПРОПУСК або ENTER для вибору елемента в редакторі."}]},{name:"Команди",items:[{name:"Відмінити команду",legend:"Натисніть ${undo}"},{name:"Повторити",legend:"Натисніть ${redo}"},{name:"Жирний",legend:"Натисніть ${bold}"},{name:"Курсив",legend:"Натисніть ${italic}"}, +{name:"Підкреслений",legend:"Натисніть ${underline}"},{name:"Посилання",legend:"Натисніть ${link}"},{name:"Згорнути панель інструментів",legend:"Натисніть ${toolbarCollapse}"},{name:"Доступ до попереднього місця фокусування",legend:"Натисніть ${accessNextSpace} для доступу до найближчої недосяжної області фокусування перед кареткою, наприклад: два сусідні елементи HR. Повторіть комбінацію клавіш для досягнення віддалених областей фокусування."},{name:"Доступ до наступного місця фокусування",legend:"Натисніть ${accessNextSpace} для доступу до найближчої недосяжної області фокусування після каретки, наприклад: два сусідні елементи HR. Повторіть комбінацію клавіш для досягнення віддалених областей фокусування."}, +{name:"Допомога з доступності",legend:"Натисніть ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/vi.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/vi.js new file mode 100644 index 0000000..52ada57 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/vi.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","vi",{title:"Hướng dẫn trợ năng",contents:"Nội dung Hỗ trợ. Nhấn ESC để đóng hộp thoại.",legend:[{name:"Chung",items:[{name:"Thanh công cụ soạn thảo",legend:"Nhấn ${toolbarFocus} để điều hướng đến thanh công cụ. Nhấn TAB và SHIFT-TAB để chuyển đến nhóm thanh công cụ khác. Nhấn MŨI TÊN PHẢI hoặc MŨI TÊN TRÁI để chuyển sang nút khác trên thanh công cụ. Nhấn PHÍM CÁCH hoặc ENTER để kích hoạt nút trên thanh công cụ."},{name:"Hộp thoại Biên t",legend:"Bên trong một hộp thoại, nhấn TAB để chuyển sang trường tiếp theo, nhấn SHIFT + TAB để quay lại trường phía trước, nhấn ENTER để chấp nhận, nhấn ESC để đóng hộp thoại. Đối với các hộp thoại có nhiều tab, nhấn ALT + F10 để chuyển đến danh sách các tab. Sau đó nhấn TAB hoặc MŨI TÊN SANG PHẢI để chuyển sang tab tiếp theo. Nhấn SHIFT + TAB hoặc MŨI TÊN SANG TRÁI để chuyển sang tab trước đó. Nhấn DẤU CÁCH hoặc ENTER để chọn tab."}, +{name:"Trình đơn Ngữ cảnh cBộ soạn thảo",legend:"Nhấn ${contextMenu} hoặc PHÍM ỨNG DỤNG để mở thực đơn ngữ cảnh. Sau đó nhấn TAB hoặc MŨI TÊN XUỐNG để di chuyển đến tuỳ chọn tiếp theo của thực đơn. Nhấn SHIFT+TAB hoặc MŨI TÊN LÊN để quay lại tuỳ chọn trước. Nhấn DẤU CÁCH hoặc ENTER để chọn tuỳ chọn của thực đơn. Nhấn DẤU CÁCH hoặc ENTER hoặc MŨI TÊN SANG PHẢI để mở thực đơn con của tuỳ chọn hiện tại. Nhấn ESC hoặc MŨI TÊN SANG TRÁI để quay trở lại thực đơn gốc. Nhấn ESC để đóng thực đơn ngữ cảnh."}, +{name:"Hộp danh sách trình biên tập",legend:"Trong một danh sách chọn, di chuyển đối tượng tiếp theo với phím Tab hoặc phím mũi tên hướng xuống. Di chuyển đến đối tượng trước đó bằng cách nhấn tổ hợp phím Shift+Tab hoặc mũi tên hướng lên. Phím khoảng cách hoặc phím Enter để chọn các tùy chọn trong danh sách. Nhấn phím Esc để đóng lại danh sách chọn."},{name:"Thanh đường dẫn các đối tượng",legend:"Nhấn ${elementsPathFocus} để điều hướng các đối tượng trong thanh đường dẫn. Di chuyển đến đối tượng tiếp theo bằng phím Tab hoặc phím mũi tên bên phải. Di chuyển đến đối tượng trước đó bằng tổ hợp phím Shift+Tab hoặc phím mũi tên bên trái. Nhấn phím khoảng cách hoặc Enter để chọn đối tượng trong trình soạn thảo."}]}, +{name:"Lệnh",items:[{name:"Làm lại lện",legend:"Ấn ${undo}"},{name:"Làm lại lệnh",legend:"Ấn ${redo}"},{name:"Lệnh in đậm",legend:"Ấn ${bold}"},{name:"Lệnh in nghiêng",legend:"Ấn ${italic}"},{name:"Lệnh gạch dưới",legend:"Ấn ${underline}"},{name:"Lệnh liên kết",legend:"Nhấn ${link}"},{name:"Lệnh hiển thị thanh công cụ",legend:"Nhấn${toolbarCollapse}"},{name:"Truy cập đến lệnh tập trung vào khoảng cách trước đó",legend:"Ấn ${accessPreviousSpace} để truy cập đến phần tập trung khoảng cách sau phần còn sót lại của khoảng cách gần nhất vốn không tác động đến được , thí dụ: hai yếu tố điều chỉnh HR. Lặp lại các phím kết họep này để vươn đến phần khoảng cách."}, +{name:"Truy cập phần đối tượng lệnh khoảng trống",legend:"Ấn ${accessNextSpace} để truy cập đến phần tập trung khoảng cách sau phần còn sót lại của khoảng cách gần nhất vốn không tác động đến được , thí dụ: hai yếu tố điều chỉnh HR. Lặp lại các phím kết họep này để vươn đến phần khoảng cách."},{name:"Trợ giúp liên quan",legend:"Nhấn ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js new file mode 100644 index 0000000..deed9ad --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js @@ -0,0 +1,7 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","zh-cn",{title:"辅助功能说明",contents:"帮助内容。要关闭此对话框请按 ESC 键。",legend:[{name:"常规",items:[{name:"编辑器工具栏",legend:"按 ${toolbarFocus} 导航到工具栏,使用 TAB 键和 SHIFT+TAB 组合键移动到上一个和下一个工具栏组。使用左右箭头键移动到上一个和下一个工具栏按钮。按空格键或回车键以选中工具栏按钮。"},{name:"编辑器对话框",legend:"在对话框内,TAB 键移动到下一个字段,SHIFT + TAB 组合键移动到上一个字段,ENTER 键提交对话框,ESC 键取消对话框。对于有多选项卡的对话框,用ALT + F10来移到选项卡列表。然后用 TAB 键或者向右箭头来移动到下一个选项卡;SHIFT + TAB 组合键或者向左箭头移动到上一个选项卡。用 SPACE 键或者 ENTER 键选择选项卡。"},{name:"编辑器上下文菜单",legend:"用 ${contextMenu} 或者“应用程序键”打开上下文菜单。然后用 TAB 键或者下箭头键来移动到下一个菜单项;SHIFT + TAB 组合键或者上箭头键移动到上一个菜单项。用 SPACE 键或者 ENTER 键选择菜单项。用 SPACE 键,ENTER 键或者右箭头键打开子菜单。返回菜单用 ESC 键或者左箭头键。用 ESC 键关闭上下文菜单。"}, +{name:"编辑器列表框",legend:"在列表框中,移到下一列表项用 TAB 键或者下箭头键。移到上一列表项用SHIFT + TAB 组合键或者上箭头键,用 SPACE 键或者 ENTER 键选择列表项。用 ESC 键收起列表框。"},{name:"编辑器元素路径栏",legend:"按 ${elementsPathFocus} 以导航到元素路径栏,使用 TAB 键或右箭头键选择下一个元素,使用 SHIFT+TAB 组合键或左箭头键选择上一个元素,按空格键或回车键以选定编辑器里的元素。"}]},{name:"命令",items:[{name:" 撤消命令",legend:"按 ${undo}"},{name:" 重做命令",legend:"按 ${redo}"},{name:" 加粗命令",legend:"按 ${bold}"},{name:" 倾斜命令",legend:"按 ${italic}"},{name:" 下划线命令",legend:"按 ${underline}"},{name:" 链接命令",legend:"按 ${link}"},{name:" 工具栏折叠命令",legend:"按 ${toolbarCollapse}"}, +{name:"访问前一个焦点区域的命令",legend:"按 ${accessPreviousSpace} 访问^符号前最近的不可访问的焦点区域,例如:两个相邻的 HR 元素。重复此组合按键可以到达远处的焦点区域。"},{name:"访问下一个焦点区域命令",legend:"按 ${accessNextSpace} 以访问^符号后最近的不可访问的焦点区域。例如:两个相邻的 HR 元素。重复此组合按键可以到达远处的焦点区域。"},{name:"辅助功能帮助",legend:"按 ${a11yHelp}"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/zh.js b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/zh.js new file mode 100644 index 0000000..eb2a8bc --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/a11yhelp/dialogs/lang/zh.js @@ -0,0 +1,7 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("a11yhelp","zh",{title:"輔助工具指南",contents:"說明內容。若要關閉此對話框請按「ESC」。",legend:[{name:"一般",items:[{name:"編輯器工具列",legend:"請按「${toolbarFocus}」以瀏覽工具列。\r\n利用「TAB」或「SHIFT+TAB」以便移動到下一個或前一個工具列群組。\r\n利用「→」或「←」以便移動到下一個或前一個工具列按鈕。\r\n請按下「空白鍵」或「ENTER」鍵啟動工具列按鈕。"},{name:"編輯器對話方塊",legend:"在對話框中,請按 TAB 鍵以便移動到下個欄位,請按 SHIFT + TAB 以便移動到前個欄位;請按 ENTER 以提交對話框資料,或按下 ESC 取消對話框。\r\n若是有多個頁框的對話框,請按 ALT + F10 以移動到頁框列表,並以 TAB 或是 → 方向鍵移動到下個頁框。以 SHIFT + TAB 或是 ← 方向鍵移動到前個頁框。按下 空白鍵 或是 ENTER 以選取頁框。"},{name:"編輯器內容功能表", +legend:"請按下「${contextMenu}」或是「應用程式鍵」以開啟內容選單。以「TAB」或是「↓」鍵移動到下一個選單選項。以「SHIFT + TAB」或是「↑」鍵移動到上一個選單選項。按下「空白鍵」或是「ENTER」鍵以選取選單選項。以「空白鍵」或「ENTER」或「→」開啟目前選項之子選單。以「ESC」或「←」回到父選單。以「ESC」鍵關閉內容選單」。"},{name:"編輯器清單方塊",legend:"在列表中,請利用 TAB 或 ↓ 方向鍵以移動到下一個項目;或利用 SHIFT + TAB 或 ↑ 方向鍵移動到前一個項目。請按下 空白鍵 或是 ENTER 以選取項目。請按 ESC 關閉列表。"},{name:"編輯器元件路徑工具列",legend:"請按「${elementsPathFocus}」以瀏覽元素路徑工具列。\r\n利用「TAB」或「→」以便移動到下一個元素按鈕。\r\n利用「SHIFT+TAB」或「←」以便移動到前一個元素按鈕。\r\n請按下「空白鍵」或「ENTER」鍵選擇編輯器中的元素。"}]},{name:"命令",items:[{name:"復原命令", +legend:"請按下「${undo}」"},{name:"重複命令",legend:"請按下「 ${redo}」"},{name:"粗體命令",legend:"請按下「${bold}」"},{name:"斜體",legend:"請按下「${italic}」"},{name:"底線命令",legend:"請按下「${underline}」"},{name:"連結",legend:"請按下「${link}」"},{name:"隱藏工具列",legend:"請按下「${toolbarCollapse}」"},{name:"存取前一個焦點空間命令",legend:"請按下 ${accessPreviousSpace} 以存取最近但無法靠近之插字符號前的焦點空間。舉例:二個相鄰的 HR 元素。\r\n重複按鍵以存取較遠的焦點空間。"},{name:"存取下一個焦點空間命令",legend:"請按下 ${accessNextSpace} 以存取最近但無法靠近之插字符號後的焦點空間。舉例:二個相鄰的 HR 元素。\r\n重複按鍵以存取較遠的焦點空間。"},{name:"協助工具說明",legend:"請按下「${a11yHelp}」"}]}]}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/about/dialogs/about.js b/theme/bootstrap/plugins/ckeditor/plugins/about/dialogs/about.js new file mode 100644 index 0000000..d9b8194 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/about/dialogs/about.js @@ -0,0 +1,7 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("about",function(a){var a=a.lang.about,b=CKEDITOR.plugins.get("about").path+"dialogs/"+(CKEDITOR.env.hidpi?"hidpi/":"")+"logo_ckeditor.png";return{title:CKEDITOR.env.ie?a.dlgTitle:a.title,minWidth:390,minHeight:230,contents:[{id:"tab1",label:"",title:"",expand:!0,padding:0,elements:[{type:"html",html:'<style type="text/css">.cke_about_container{color:#000 !important;padding:10px 10px 0;margin-top:5px}.cke_about_container p{margin: 0 0 10px;}.cke_about_container .cke_about_logo{height:81px;background-color:#fff;background-image:url('+ +b+");"+(CKEDITOR.env.hidpi?"background-size:163px 58px;":"")+'background-position:center; background-repeat:no-repeat;margin-bottom:10px;}.cke_about_container a{cursor:pointer !important;color:#00B2CE !important;text-decoration:underline !important;}</style><div class="cke_about_container"><div class="cke_about_logo"></div><p>CKEditor '+CKEDITOR.version+" (revision "+CKEDITOR.revision+')<br><a href="http://ckeditor.com/">http://ckeditor.com</a></p><p>'+a.help.replace("$1",'<a href="http://docs.ckeditor.com/user">'+ +a.userGuide+"</a>")+"</p><p>"+a.moreInfo+'<br><a href="http://ckeditor.com/about/license">http://ckeditor.com/about/license</a></p><p>'+a.copy.replace("$1",'<a href="http://cksource.com/">CKSource</a> - Frederico Knabben')+"</p></div>"}]}],buttons:[CKEDITOR.dialog.cancelButton]}}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/about/dialogs/hidpi/logo_ckeditor.png b/theme/bootstrap/plugins/ckeditor/plugins/about/dialogs/hidpi/logo_ckeditor.png new file mode 100644 index 0000000..10cc736 Binary files /dev/null and b/theme/bootstrap/plugins/ckeditor/plugins/about/dialogs/hidpi/logo_ckeditor.png differ diff --git a/theme/bootstrap/plugins/ckeditor/plugins/about/dialogs/logo_ckeditor.png b/theme/bootstrap/plugins/ckeditor/plugins/about/dialogs/logo_ckeditor.png new file mode 100644 index 0000000..f186eb8 Binary files /dev/null and b/theme/bootstrap/plugins/ckeditor/plugins/about/dialogs/logo_ckeditor.png differ diff --git a/theme/bootstrap/plugins/ckeditor/plugins/clipboard/dialogs/paste.js b/theme/bootstrap/plugins/ckeditor/plugins/clipboard/dialogs/paste.js new file mode 100644 index 0000000..0c7e256 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/clipboard/dialogs/paste.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("paste",function(c){function h(a){var b=new CKEDITOR.dom.document(a.document),f=b.getBody(),d=b.getById("cke_actscrpt");d&&d.remove();f.setAttribute("contenteditable",!0);if(CKEDITOR.env.ie&&8>CKEDITOR.env.version)b.getWindow().on("blur",function(){b.$.selection.empty()});b.on("keydown",function(a){var a=a.data,b;switch(a.getKeystroke()){case 27:this.hide();b=1;break;case 9:case CKEDITOR.SHIFT+9:this.changeFocus(1),b=1}b&&a.preventDefault()},this);c.fire("ariaWidget",new CKEDITOR.dom.element(a.frameElement)); +b.getWindow().getFrame().removeCustomData("pendingFocus")&&f.focus()}var e=c.lang.clipboard;c.on("pasteDialogCommit",function(a){a.data&&c.fire("paste",{type:"auto",dataValue:a.data})},null,null,1E3);return{title:e.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?370:350,minHeight:CKEDITOR.env.quirks?250:245,onShow:function(){this.parts.dialog.$.offsetHeight;this.setupContent();this.parts.title.setHtml(this.customTitle||e.title);this.customTitle=null},onLoad:function(){(CKEDITOR.env.ie7Compat|| +CKEDITOR.env.ie6Compat)&&"rtl"==c.lang.dir&&this.parts.contents.setStyle("overflow","hidden")},onOk:function(){this.commitContent()},contents:[{id:"general",label:c.lang.common.generalTab,elements:[{type:"html",id:"securityMsg",html:'<div style="white-space:normal;width:340px">'+e.securityMsg+"</div>"},{type:"html",id:"pasteMsg",html:'<div style="white-space:normal;width:340px">'+e.pasteMsg+"</div>"},{type:"html",id:"editing_area",style:"width:100%;height:100%",html:"",focus:function(){var a=this.getInputElement(), +b=a.getFrameDocument().getBody();!b||b.isReadOnly()?a.setCustomData("pendingFocus",1):b.focus()},setup:function(){var a=this.getDialog(),b='<html dir="'+c.config.contentsLangDirection+'" lang="'+(c.config.contentsLanguage||c.langCode)+'"><head><style>body{margin:3px;height:95%}</style></head><body><script id="cke_actscrpt" type="text/javascript">window.parent.CKEDITOR.tools.callFunction('+CKEDITOR.tools.addFunction(h,a)+",this);<\/script></body></html>",f=CKEDITOR.env.air?"javascript:void(0)":CKEDITOR.env.ie? +"javascript:void((function(){"+encodeURIComponent("document.open();("+CKEDITOR.tools.fixDomain+")();document.close();")+'})())"':"",d=CKEDITOR.dom.element.createFromHtml('<iframe class="cke_pasteframe" frameborder="0" allowTransparency="true" src="'+f+'" role="region" aria-label="'+e.pasteArea+'" aria-describedby="'+a.getContentElement("general","pasteMsg").domId+'" aria-multiple="true"></iframe>');d.on("load",function(a){a.removeListener();a=d.getFrameDocument();a.write(b);c.focusManager.add(a.getBody()); +CKEDITOR.env.air&&h.call(this,a.getWindow().$)},a);d.setCustomData("dialog",a);a=this.getElement();a.setHtml("");a.append(d);if(CKEDITOR.env.ie){var g=CKEDITOR.dom.element.createFromHtml('<span tabindex="-1" style="position:absolute" role="presentation"></span>');g.on("focus",function(){setTimeout(function(){d.$.contentWindow.focus()})});a.append(g);this.focus=function(){g.focus();this.fire("focus")}}this.getInputElement=function(){return d};CKEDITOR.env.ie&&(a.setStyle("display","block"),a.setStyle("height", +d.$.offsetHeight+2+"px"))},commit:function(){var a=this.getDialog().getParentEditor(),b=this.getInputElement().getFrameDocument().getBody(),c=b.getBogus(),d;c&&c.remove();d=b.getHtml();setTimeout(function(){a.fire("pasteDialogCommit",d)},0)}}]}]}}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/dialog/dialogDefinition.js b/theme/bootstrap/plugins/ckeditor/plugins/dialog/dialogDefinition.js new file mode 100644 index 0000000..2186b29 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/dialog/dialogDefinition.js @@ -0,0 +1,4 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ diff --git a/theme/bootstrap/plugins/ckeditor/plugins/fakeobjects/images/spacer.gif b/theme/bootstrap/plugins/ckeditor/plugins/fakeobjects/images/spacer.gif new file mode 100644 index 0000000..5bfd67a Binary files /dev/null and b/theme/bootstrap/plugins/ckeditor/plugins/fakeobjects/images/spacer.gif differ diff --git a/theme/bootstrap/plugins/ckeditor/plugins/icons.png b/theme/bootstrap/plugins/ckeditor/plugins/icons.png new file mode 100644 index 0000000..c71008d Binary files /dev/null and b/theme/bootstrap/plugins/ckeditor/plugins/icons.png differ diff --git a/theme/bootstrap/plugins/ckeditor/plugins/icons_hidpi.png b/theme/bootstrap/plugins/ckeditor/plugins/icons_hidpi.png new file mode 100644 index 0000000..0466c2b Binary files /dev/null and b/theme/bootstrap/plugins/ckeditor/plugins/icons_hidpi.png differ diff --git a/theme/bootstrap/plugins/ckeditor/plugins/image/dialogs/image.js b/theme/bootstrap/plugins/ckeditor/plugins/image/dialogs/image.js new file mode 100644 index 0000000..c86de59 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/image/dialogs/image.js @@ -0,0 +1,43 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){var r=function(c,j){function r(){var a=arguments,b=this.getContentElement("advanced","txtdlgGenStyle");b&&b.commit.apply(b,a);this.foreach(function(b){b.commit&&"txtdlgGenStyle"!=b.id&&b.commit.apply(b,a)})}function i(a){if(!s){s=1;var b=this.getDialog(),d=b.imageElement;if(d){this.commit(f,d);for(var a=[].concat(a),e=a.length,c,g=0;g<e;g++)(c=b.getContentElement.apply(b,a[g].split(":")))&&c.setup(f,d)}s=0}}var f=1,k=/^\s*(\d+)((px)|\%)?\s*$/i,v=/(^\s*(\d+)((px)|\%)?\s*$)|^$/i,o=/^\d+px$/, +w=function(){var a=this.getValue(),b=this.getDialog(),d=a.match(k);d&&("%"==d[2]&&l(b,!1),a=d[1]);b.lockRatio&&(d=b.originalElement,"true"==d.getCustomData("isReady")&&("txtHeight"==this.id?(a&&"0"!=a&&(a=Math.round(d.$.width*(a/d.$.height))),isNaN(a)||b.setValueOf("info","txtWidth",a)):(a&&"0"!=a&&(a=Math.round(d.$.height*(a/d.$.width))),isNaN(a)||b.setValueOf("info","txtHeight",a))));g(b)},g=function(a){if(!a.originalElement||!a.preview)return 1;a.commitContent(4,a.preview);return 0},s,l=function(a, +b){if(!a.getContentElement("info","ratioLock"))return null;var d=a.originalElement;if(!d)return null;if("check"==b){if(!a.userlockRatio&&"true"==d.getCustomData("isReady")){var e=a.getValueOf("info","txtWidth"),c=a.getValueOf("info","txtHeight"),d=1E3*d.$.width/d.$.height,f=1E3*e/c;a.lockRatio=!1;!e&&!c?a.lockRatio=!0:!isNaN(d)&&!isNaN(f)&&Math.round(d)==Math.round(f)&&(a.lockRatio=!0)}}else void 0!=b?a.lockRatio=b:(a.userlockRatio=1,a.lockRatio=!a.lockRatio);e=CKEDITOR.document.getById(p);a.lockRatio? +e.removeClass("cke_btn_unlocked"):e.addClass("cke_btn_unlocked");e.setAttribute("aria-checked",a.lockRatio);CKEDITOR.env.hc&&e.getChild(0).setHtml(a.lockRatio?CKEDITOR.env.ie?"■":"▣":CKEDITOR.env.ie?"□":"▢");return a.lockRatio},x=function(a){var b=a.originalElement;if("true"==b.getCustomData("isReady")){var d=a.getContentElement("info","txtWidth"),e=a.getContentElement("info","txtHeight");d&&d.setValue(b.$.width);e&&e.setValue(b.$.height)}g(a)},y=function(a,b){function d(a,b){var d=a.match(k);return d? +("%"==d[2]&&(d[1]+="%",l(e,!1)),d[1]):b}if(a==f){var e=this.getDialog(),c="",g="txtWidth"==this.id?"width":"height",h=b.getAttribute(g);h&&(c=d(h,c));c=d(b.getStyle(g),c);this.setValue(c)}},t,q=function(){var a=this.originalElement;a.setCustomData("isReady","true");a.removeListener("load",q);a.removeListener("error",h);a.removeListener("abort",h);CKEDITOR.document.getById(m).setStyle("display","none");this.dontResetSize||x(this);this.firstLoad&&CKEDITOR.tools.setTimeout(function(){l(this,"check")}, +0,this);this.dontResetSize=this.firstLoad=!1},h=function(){var a=this.originalElement;a.removeListener("load",q);a.removeListener("error",h);a.removeListener("abort",h);a=CKEDITOR.getUrl(CKEDITOR.plugins.get("image").path+"images/noimage.png");this.preview&&this.preview.setAttribute("src",a);CKEDITOR.document.getById(m).setStyle("display","none");l(this,!1)},n=function(a){return CKEDITOR.tools.getNextId()+"_"+a},p=n("btnLockSizes"),u=n("btnResetSize"),m=n("ImagePreviewLoader"),A=n("previewLink"), +z=n("previewImage");return{title:c.lang.image["image"==j?"title":"titleButton"],minWidth:420,minHeight:360,onShow:function(){this.linkEditMode=this.imageEditMode=this.linkElement=this.imageElement=!1;this.lockRatio=!0;this.userlockRatio=0;this.dontResetSize=!1;this.firstLoad=!0;this.addLink=!1;var a=this.getParentEditor(),b=a.getSelection(),d=(b=b&&b.getSelectedElement())&&a.elementPath(b).contains("a",1);CKEDITOR.document.getById(m).setStyle("display","none");t=new CKEDITOR.dom.element("img",a.document); +this.preview=CKEDITOR.document.getById(z);this.originalElement=a.document.createElement("img");this.originalElement.setAttribute("alt","");this.originalElement.setCustomData("isReady","false");if(d){this.linkElement=d;this.linkEditMode=!0;var c=d.getChildren();if(1==c.count()){var g=c.getItem(0).getName();if("img"==g||"input"==g)this.imageElement=c.getItem(0),"img"==this.imageElement.getName()?this.imageEditMode="img":"input"==this.imageElement.getName()&&(this.imageEditMode="input")}"image"==j&& +this.setupContent(2,d)}if(this.customImageElement)this.imageEditMode="img",this.imageElement=this.customImageElement,delete this.customImageElement;else if(b&&"img"==b.getName()&&!b.data("cke-realelement")||b&&"input"==b.getName()&&"image"==b.getAttribute("type"))this.imageEditMode=b.getName(),this.imageElement=b;this.imageEditMode?(this.cleanImageElement=this.imageElement,this.imageElement=this.cleanImageElement.clone(!0,!0),this.setupContent(f,this.imageElement)):this.imageElement=a.document.createElement("img"); +l(this,!0);CKEDITOR.tools.trim(this.getValueOf("info","txtUrl"))||(this.preview.removeAttribute("src"),this.preview.setStyle("display","none"))},onOk:function(){if(this.imageEditMode){var a=this.imageEditMode;"image"==j&&"input"==a&&confirm(c.lang.image.button2Img)?(this.imageElement=c.document.createElement("img"),this.imageElement.setAttribute("alt",""),c.insertElement(this.imageElement)):"image"!=j&&"img"==a&&confirm(c.lang.image.img2Button)?(this.imageElement=c.document.createElement("input"), +this.imageElement.setAttributes({type:"image",alt:""}),c.insertElement(this.imageElement)):(this.imageElement=this.cleanImageElement,delete this.cleanImageElement)}else"image"==j?this.imageElement=c.document.createElement("img"):(this.imageElement=c.document.createElement("input"),this.imageElement.setAttribute("type","image")),this.imageElement.setAttribute("alt","");this.linkEditMode||(this.linkElement=c.document.createElement("a"));this.commitContent(f,this.imageElement);this.commitContent(2,this.linkElement); +this.imageElement.getAttribute("style")||this.imageElement.removeAttribute("style");this.imageEditMode?!this.linkEditMode&&this.addLink?(c.insertElement(this.linkElement),this.imageElement.appendTo(this.linkElement)):this.linkEditMode&&!this.addLink&&(c.getSelection().selectElement(this.linkElement),c.insertElement(this.imageElement)):this.addLink?this.linkEditMode?c.insertElement(this.imageElement):(c.insertElement(this.linkElement),this.linkElement.append(this.imageElement,!1)):c.insertElement(this.imageElement)}, +onLoad:function(){"image"!=j&&this.hidePage("Link");var a=this._.element.getDocument();this.getContentElement("info","ratioLock")&&(this.addFocusable(a.getById(u),5),this.addFocusable(a.getById(p),5));this.commitContent=r},onHide:function(){this.preview&&this.commitContent(8,this.preview);this.originalElement&&(this.originalElement.removeListener("load",q),this.originalElement.removeListener("error",h),this.originalElement.removeListener("abort",h),this.originalElement.remove(),this.originalElement= +!1);delete this.imageElement},contents:[{id:"info",label:c.lang.image.infoTab,accessKey:"I",elements:[{type:"vbox",padding:0,children:[{type:"hbox",widths:["280px","110px"],align:"right",children:[{id:"txtUrl",type:"text",label:c.lang.common.url,required:!0,onChange:function(){var a=this.getDialog(),b=this.getValue();if(0<b.length){var a=this.getDialog(),d=a.originalElement;a.preview.removeStyle("display");d.setCustomData("isReady","false");var c=CKEDITOR.document.getById(m);c&&c.setStyle("display", +"");d.on("load",q,a);d.on("error",h,a);d.on("abort",h,a);d.setAttribute("src",b);t.setAttribute("src",b);a.preview.setAttribute("src",t.$.src);g(a)}else a.preview&&(a.preview.removeAttribute("src"),a.preview.setStyle("display","none"))},setup:function(a,b){if(a==f){var d=b.data("cke-saved-src")||b.getAttribute("src");this.getDialog().dontResetSize=!0;this.setValue(d);this.setInitValue()}},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())?(b.data("cke-saved-src",this.getValue()),b.setAttribute("src", +this.getValue())):8==a&&(b.setAttribute("src",""),b.removeAttribute("src"))},validate:CKEDITOR.dialog.validate.notEmpty(c.lang.image.urlMissing)},{type:"button",id:"browse",style:"display:inline-block;margin-top:10px;",align:"center",label:c.lang.common.browseServer,hidden:!0,filebrowser:"info:txtUrl"}]}]},{id:"txtAlt",type:"text",label:c.lang.image.alt,accessKey:"T","default":"",onChange:function(){g(this.getDialog())},setup:function(a,b){a==f&&this.setValue(b.getAttribute("alt"))},commit:function(a, +b){a==f?(this.getValue()||this.isChanged())&&b.setAttribute("alt",this.getValue()):4==a?b.setAttribute("alt",this.getValue()):8==a&&b.removeAttribute("alt")}},{type:"hbox",children:[{id:"basic",type:"vbox",children:[{type:"hbox",requiredContent:"img{width,height}",widths:["50%","50%"],children:[{type:"vbox",padding:1,children:[{type:"text",width:"45px",id:"txtWidth",label:c.lang.common.width,onKeyUp:w,onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:function(){var a=this.getValue().match(v); +(a=!!(a&&0!==parseInt(a[1],10)))||alert(c.lang.common.invalidWidth);return a},setup:y,commit:function(a,b,d){var c=this.getValue();a==f?(c?b.setStyle("width",CKEDITOR.tools.cssLength(c)):b.removeStyle("width"),!d&&b.removeAttribute("width")):4==a?c.match(k)?b.setStyle("width",CKEDITOR.tools.cssLength(c)):(a=this.getDialog().originalElement,"true"==a.getCustomData("isReady")&&b.setStyle("width",a.$.width+"px")):8==a&&(b.removeAttribute("width"),b.removeStyle("width"))}},{type:"text",id:"txtHeight", +width:"45px",label:c.lang.common.height,onKeyUp:w,onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:function(){var a=this.getValue().match(v);(a=!!(a&&0!==parseInt(a[1],10)))||alert(c.lang.common.invalidHeight);return a},setup:y,commit:function(a,b,d){var c=this.getValue();a==f?(c?b.setStyle("height",CKEDITOR.tools.cssLength(c)):b.removeStyle("height"),!d&&b.removeAttribute("height")):4==a?c.match(k)?b.setStyle("height",CKEDITOR.tools.cssLength(c)):(a=this.getDialog().originalElement, +"true"==a.getCustomData("isReady")&&b.setStyle("height",a.$.height+"px")):8==a&&(b.removeAttribute("height"),b.removeStyle("height"))}}]},{id:"ratioLock",type:"html",style:"margin-top:30px;width:40px;height:40px;",onLoad:function(){var a=CKEDITOR.document.getById(u),b=CKEDITOR.document.getById(p);a&&(a.on("click",function(a){x(this);a.data&&a.data.preventDefault()},this.getDialog()),a.on("mouseover",function(){this.addClass("cke_btn_over")},a),a.on("mouseout",function(){this.removeClass("cke_btn_over")}, +a));b&&(b.on("click",function(a){l(this);var b=this.originalElement,c=this.getValueOf("info","txtWidth");if(b.getCustomData("isReady")=="true"&&c){b=b.$.height/b.$.width*c;if(!isNaN(b)){this.setValueOf("info","txtHeight",Math.round(b));g(this)}}a.data&&a.data.preventDefault()},this.getDialog()),b.on("mouseover",function(){this.addClass("cke_btn_over")},b),b.on("mouseout",function(){this.removeClass("cke_btn_over")},b))},html:'<div><a href="javascript:void(0)" tabindex="-1" title="'+c.lang.image.lockRatio+ +'" class="cke_btn_locked" id="'+p+'" role="checkbox"><span class="cke_icon"></span><span class="cke_label">'+c.lang.image.lockRatio+'</span></a><a href="javascript:void(0)" tabindex="-1" title="'+c.lang.image.resetSize+'" class="cke_btn_reset" id="'+u+'" role="button"><span class="cke_label">'+c.lang.image.resetSize+"</span></a></div>"}]},{type:"vbox",padding:1,children:[{type:"text",id:"txtBorder",requiredContent:"img{border-width}",width:"60px",label:c.lang.image.border,"default":"",onKeyUp:function(){g(this.getDialog())}, +onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateBorder),setup:function(a,b){if(a==f){var d;d=(d=(d=b.getStyle("border-width"))&&d.match(/^(\d+px)(?: \1 \1 \1)?$/))&&parseInt(d[1],10);isNaN(parseInt(d,10))&&(d=b.getAttribute("border"));this.setValue(d)}},commit:function(a,b,d){var c=parseInt(this.getValue(),10);a==f||4==a?(isNaN(c)?!c&&this.isChanged()&&b.removeStyle("border"):(b.setStyle("border-width",CKEDITOR.tools.cssLength(c)), +b.setStyle("border-style","solid")),!d&&a==f&&b.removeAttribute("border")):8==a&&(b.removeAttribute("border"),b.removeStyle("border-width"),b.removeStyle("border-style"),b.removeStyle("border-color"))}},{type:"text",id:"txtHSpace",requiredContent:"img{margin-left,margin-right}",width:"60px",label:c.lang.image.hSpace,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateHSpace), +setup:function(a,b){if(a==f){var d,c;d=b.getStyle("margin-left");c=b.getStyle("margin-right");d=d&&d.match(o);c=c&&c.match(o);d=parseInt(d,10);c=parseInt(c,10);d=d==c&&d;isNaN(parseInt(d,10))&&(d=b.getAttribute("hspace"));this.setValue(d)}},commit:function(a,b,c){var e=parseInt(this.getValue(),10);a==f||4==a?(isNaN(e)?!e&&this.isChanged()&&(b.removeStyle("margin-left"),b.removeStyle("margin-right")):(b.setStyle("margin-left",CKEDITOR.tools.cssLength(e)),b.setStyle("margin-right",CKEDITOR.tools.cssLength(e))), +!c&&a==f&&b.removeAttribute("hspace")):8==a&&(b.removeAttribute("hspace"),b.removeStyle("margin-left"),b.removeStyle("margin-right"))}},{type:"text",id:"txtVSpace",requiredContent:"img{margin-top,margin-bottom}",width:"60px",label:c.lang.image.vSpace,"default":"",onKeyUp:function(){g(this.getDialog())},onChange:function(){i.call(this,"advanced:txtdlgGenStyle")},validate:CKEDITOR.dialog.validate.integer(c.lang.image.validateVSpace),setup:function(a,b){if(a==f){var c,e;c=b.getStyle("margin-top");e= +b.getStyle("margin-bottom");c=c&&c.match(o);e=e&&e.match(o);c=parseInt(c,10);e=parseInt(e,10);c=c==e&&c;isNaN(parseInt(c,10))&&(c=b.getAttribute("vspace"));this.setValue(c)}},commit:function(a,b,c){var e=parseInt(this.getValue(),10);a==f||4==a?(isNaN(e)?!e&&this.isChanged()&&(b.removeStyle("margin-top"),b.removeStyle("margin-bottom")):(b.setStyle("margin-top",CKEDITOR.tools.cssLength(e)),b.setStyle("margin-bottom",CKEDITOR.tools.cssLength(e))),!c&&a==f&&b.removeAttribute("vspace")):8==a&&(b.removeAttribute("vspace"), +b.removeStyle("margin-top"),b.removeStyle("margin-bottom"))}},{id:"cmbAlign",requiredContent:"img{float}",type:"select",widths:["35%","65%"],style:"width:90px",label:c.lang.common.align,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.alignLeft,"left"],[c.lang.common.alignRight,"right"]],onChange:function(){g(this.getDialog());i.call(this,"advanced:txtdlgGenStyle")},setup:function(a,b){if(a==f){var c=b.getStyle("float");switch(c){case "inherit":case "none":c=""}!c&&(c=(b.getAttribute("align")|| +"").toLowerCase());this.setValue(c)}},commit:function(a,b,c){var e=this.getValue();if(a==f||4==a){if(e?b.setStyle("float",e):b.removeStyle("float"),!c&&a==f)switch(e=(b.getAttribute("align")||"").toLowerCase(),e){case "left":case "right":b.removeAttribute("align")}}else 8==a&&b.removeStyle("float")}}]}]},{type:"vbox",height:"250px",children:[{type:"html",id:"htmlPreview",style:"width:95%;",html:"<div>"+CKEDITOR.tools.htmlEncode(c.lang.common.preview)+'<br><div id="'+m+'" class="ImagePreviewLoader" style="display:none"><div class="loading">&nbsp;</div></div><div class="ImagePreviewBox"><table><tr><td><a href="javascript:void(0)" target="_blank" onclick="return false;" id="'+ +A+'"><img id="'+z+'" alt="" /></a>'+(c.config.image_previewText||"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas feugiat consequat diam. Maecenas metus. Vivamus diam purus, cursus a, commodo non, facilisis vitae, nulla. Aenean dictum lacinia tortor. Nunc iaculis, nibh non iaculis aliquam, orci felis euismod neque, sed ornare massa mauris sed velit. Nulla pretium mi et risus. Fusce mi pede, tempor id, cursus ac, ullamcorper nec, enim. Sed tortor. Curabitur molestie. Duis velit augue, condimentum at, ultrices a, luctus ut, orci. Donec pellentesque egestas eros. Integer cursus, augue in cursus faucibus, eros pede bibendum sem, in tempus tellus justo quis ligula. Etiam eget tortor. Vestibulum rutrum, est ut placerat elementum, lectus nisl aliquam velit, tempor aliquam eros nunc nonummy metus. In eros metus, gravida a, gravida sed, lobortis id, turpis. Ut ultrices, ipsum at venenatis fringilla, sem nulla lacinia tellus, eget aliquet turpis mauris non enim. Nam turpis. Suspendisse lacinia. Curabitur ac tortor ut ipsum egestas elementum. Nunc imperdiet gravida mauris.")+ +"</td></tr></table></div></div>"}]}]}]},{id:"Link",requiredContent:"a[href]",label:c.lang.image.linkTab,padding:0,elements:[{id:"txtUrl",type:"text",label:c.lang.common.url,style:"width: 100%","default":"",setup:function(a,b){if(2==a){var c=b.data("cke-saved-href");c||(c=b.getAttribute("href"));this.setValue(c)}},commit:function(a,b){if(2==a&&(this.getValue()||this.isChanged())){var d=decodeURI(this.getValue());b.data("cke-saved-href",d);b.setAttribute("href",d);if(this.getValue()||!c.config.image_removeLinkByEmptyURL)this.getDialog().addLink= +!0}}},{type:"button",id:"browse",filebrowser:{action:"Browse",target:"Link:txtUrl",url:c.config.filebrowserImageBrowseLinkUrl},style:"float:right",hidden:!0,label:c.lang.common.browseServer},{id:"cmbTarget",type:"select",requiredContent:"a[target]",label:c.lang.common.target,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.targetNew,"_blank"],[c.lang.common.targetTop,"_top"],[c.lang.common.targetSelf,"_self"],[c.lang.common.targetParent,"_parent"]],setup:function(a,b){2==a&&this.setValue(b.getAttribute("target")|| +"")},commit:function(a,b){2==a&&(this.getValue()||this.isChanged())&&b.setAttribute("target",this.getValue())}}]},{id:"Upload",hidden:!0,filebrowser:"uploadButton",label:c.lang.image.upload,elements:[{type:"file",id:"upload",label:c.lang.image.btnUpload,style:"height:40px",size:38},{type:"fileButton",id:"uploadButton",filebrowser:"info:txtUrl",label:c.lang.image.btnUpload,"for":["Upload","upload"]}]},{id:"advanced",label:c.lang.common.advancedTab,elements:[{type:"hbox",widths:["50%","25%","25%"], +children:[{type:"text",id:"linkId",requiredContent:"img[id]",label:c.lang.common.id,setup:function(a,b){a==f&&this.setValue(b.getAttribute("id"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("id",this.getValue())}},{id:"cmbLangDir",type:"select",requiredContent:"img[dir]",style:"width : 100px;",label:c.lang.common.langDir,"default":"",items:[[c.lang.common.notSet,""],[c.lang.common.langDirLtr,"ltr"],[c.lang.common.langDirRtl,"rtl"]],setup:function(a,b){a==f&&this.setValue(b.getAttribute("dir"))}, +commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("dir",this.getValue())}},{type:"text",id:"txtLangCode",requiredContent:"img[lang]",label:c.lang.common.langCode,"default":"",setup:function(a,b){a==f&&this.setValue(b.getAttribute("lang"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("lang",this.getValue())}}]},{type:"text",id:"txtGenLongDescr",requiredContent:"img[longdesc]",label:c.lang.common.longDescr,setup:function(a,b){a==f&&this.setValue(b.getAttribute("longDesc"))}, +commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("longDesc",this.getValue())}},{type:"hbox",widths:["50%","50%"],children:[{type:"text",id:"txtGenClass",requiredContent:"img(cke-xyz)",label:c.lang.common.cssClass,"default":"",setup:function(a,b){a==f&&this.setValue(b.getAttribute("class"))},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("class",this.getValue())}},{type:"text",id:"txtGenTitle",requiredContent:"img[title]",label:c.lang.common.advisoryTitle, +"default":"",onChange:function(){g(this.getDialog())},setup:function(a,b){a==f&&this.setValue(b.getAttribute("title"))},commit:function(a,b){a==f?(this.getValue()||this.isChanged())&&b.setAttribute("title",this.getValue()):4==a?b.setAttribute("title",this.getValue()):8==a&&b.removeAttribute("title")}}]},{type:"text",id:"txtdlgGenStyle",requiredContent:"img{cke-xyz}",label:c.lang.common.cssStyle,validate:CKEDITOR.dialog.validate.inlineStyle(c.lang.common.invalidInlineStyle),"default":"",setup:function(a, +b){if(a==f){var c=b.getAttribute("style");!c&&b.$.style.cssText&&(c=b.$.style.cssText);this.setValue(c);var e=b.$.style.height,c=b.$.style.width,e=(e?e:"").match(k),c=(c?c:"").match(k);this.attributesInStyle={height:!!e,width:!!c}}},onChange:function(){i.call(this,"info:cmbFloat info:cmbAlign info:txtVSpace info:txtHSpace info:txtBorder info:txtWidth info:txtHeight".split(" "));g(this)},commit:function(a,b){a==f&&(this.getValue()||this.isChanged())&&b.setAttribute("style",this.getValue())}}]}]}}; +CKEDITOR.dialog.add("image",function(c){return r(c,"image")});CKEDITOR.dialog.add("imagebutton",function(c){return r(c,"imagebutton")})})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/image/images/noimage.png b/theme/bootstrap/plugins/ckeditor/plugins/image/images/noimage.png new file mode 100644 index 0000000..1598113 Binary files /dev/null and b/theme/bootstrap/plugins/ckeditor/plugins/image/images/noimage.png differ diff --git a/theme/bootstrap/plugins/ckeditor/plugins/link/dialogs/anchor.js b/theme/bootstrap/plugins/ckeditor/plugins/link/dialogs/anchor.js new file mode 100644 index 0000000..562417a --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/link/dialogs/anchor.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("anchor",function(c){var d=function(a){this._.selectedElement=a;this.setValueOf("info","txtName",a.data("cke-saved-name")||"")};return{title:c.lang.link.anchor.title,minWidth:300,minHeight:60,onOk:function(){var a=CKEDITOR.tools.trim(this.getValueOf("info","txtName")),a={id:a,name:a,"data-cke-saved-name":a};if(this._.selectedElement)this._.selectedElement.data("cke-realelement")?(a=c.document.createElement("a",{attributes:a}),c.createFakeElement(a,"cke_anchor","anchor").replace(this._.selectedElement)): +this._.selectedElement.setAttributes(a);else{var b=c.getSelection(),b=b&&b.getRanges()[0];b.collapsed?(CKEDITOR.plugins.link.synAnchorSelector&&(a["class"]="cke_anchor_empty"),CKEDITOR.plugins.link.emptyAnchorFix&&(a.contenteditable="false",a["data-cke-editable"]=1),a=c.document.createElement("a",{attributes:a}),CKEDITOR.plugins.link.fakeAnchor&&(a=c.createFakeElement(a,"cke_anchor","anchor")),b.insertNode(a)):(CKEDITOR.env.ie&&9>CKEDITOR.env.version&&(a["class"]="cke_anchor"),a=new CKEDITOR.style({element:"a", +attributes:a}),a.type=CKEDITOR.STYLE_INLINE,c.applyStyle(a))}},onHide:function(){delete this._.selectedElement},onShow:function(){var a=c.getSelection(),b=a.getSelectedElement();if(b)CKEDITOR.plugins.link.fakeAnchor?((a=CKEDITOR.plugins.link.tryRestoreFakeAnchor(c,b))&&d.call(this,a),this._.selectedElement=b):b.is("a")&&b.hasAttribute("name")&&d.call(this,b);else if(b=CKEDITOR.plugins.link.getSelectedLink(c))d.call(this,b),a.selectElement(b);this.getContentElement("info","txtName").focus()},contents:[{id:"info", +label:c.lang.link.anchor.title,accessKey:"I",elements:[{type:"text",id:"txtName",label:c.lang.link.anchor.name,required:!0,validate:function(){return!this.getValue()?(alert(c.lang.link.anchor.errorName),!1):!0}}]}]}}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/link/dialogs/link.js b/theme/bootstrap/plugins/ckeditor/plugins/link/dialogs/link.js new file mode 100644 index 0000000..37085d3 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/link/dialogs/link.js @@ -0,0 +1,37 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("link",function(n){var p,q;function r(a){return a.replace(/'/g,"\\$&")}function t(a){var g,c=p,d,e;g=[q,"("];for(var b=0;b<c.length;b++)d=c[b].toLowerCase(),e=a[d],0<b&&g.push(","),g.push("'",e?r(encodeURIComponent(a[d])):"","'");g.push(")");return g.join("")}function u(a){for(var g,c=a.length,d=[],e=0;e<c;e++)g=a.charCodeAt(e),d.push(g);return"String.fromCharCode("+d.join(",")+")"}function v(a){return(a=a.getAttribute("class"))?a.replace(/\s*(?:cke_anchor_empty|cke_anchor)(?:\s*$)?/g, +""):""}var w=CKEDITOR.plugins.link,s=function(){var a=this.getDialog(),g=a.getContentElement("target","popupFeatures"),a=a.getContentElement("target","linkTargetName"),c=this.getValue();if(g&&a)switch(g=g.getElement(),g.hide(),a.setValue(""),c){case "frame":a.setLabel(n.lang.link.targetFrameName);a.getElement().show();break;case "popup":g.show();a.setLabel(n.lang.link.targetPopupName);a.getElement().show();break;default:a.setValue(c),a.getElement().hide()}},x=/^javascript:/,y=/^mailto:([^?]+)(?:\?(.+))?$/, +z=/subject=([^;?:@&=$,\/]*)/,A=/body=([^;?:@&=$,\/]*)/,B=/^#(.*)$/,C=/^((?:http|https|ftp|news):\/\/)?(.*)$/,D=/^(_(?:self|top|parent|blank))$/,E=/^javascript:void\(location\.href='mailto:'\+String\.fromCharCode\(([^)]+)\)(?:\+'(.*)')?\)$/,F=/^javascript:([^(]+)\(([^)]+)\)$/,G=/\s*window.open\(\s*this\.href\s*,\s*(?:'([^']*)'|null)\s*,\s*'([^']*)'\s*\)\s*;\s*return\s*false;*\s*/,H=/(?:^|,)([^=]+)=(\d+|yes|no)/gi,I=function(a,g){var c=g&&(g.data("cke-saved-href")||g.getAttribute("href"))||"",d,e,b= +{};c.match(x)&&("encode"==o?c=c.replace(E,function(a,c,b){return"mailto:"+String.fromCharCode.apply(String,c.split(","))+(b&&b.replace(/\\'/g,"'"))}):o&&c.replace(F,function(a,c,d){if(c==q){b.type="email";for(var a=b.email={},c=/(^')|('$)/g,d=d.match(/[^,\s]+/g),e=d.length,g,f,h=0;h<e;h++)g=decodeURIComponent,f=d[h].replace(c,"").replace(/\\'/g,"'"),f=g(f),g=p[h].toLowerCase(),a[g]=f;a.address=[a.name,a.domain].join("@")}}));if(!b.type)if(d=c.match(B))b.type="anchor",b.anchor={},b.anchor.name=b.anchor.id= +d[1];else if(d=c.match(y)){e=c.match(z);c=c.match(A);b.type="email";var f=b.email={};f.address=d[1];e&&(f.subject=decodeURIComponent(e[1]));c&&(f.body=decodeURIComponent(c[1]))}else c&&(e=c.match(C))?(b.type="url",b.url={},b.url.protocol=e[1],b.url.url=e[2]):b.type="url";if(g){d=g.getAttribute("target");b.target={};b.adv={};if(d)d.match(D)?b.target.type=b.target.name=d:(b.target.type="frame",b.target.name=d);else if(d=(d=g.data("cke-pa-onclick")||g.getAttribute("onclick"))&&d.match(G)){b.target.type= +"popup";for(b.target.name=d[1];c=H.exec(d[2]);)("yes"==c[2]||"1"==c[2])&&!(c[1]in{height:1,width:1,top:1,left:1})?b.target[c[1]]=!0:isFinite(c[2])&&(b.target[c[1]]=c[2])}d=function(a,c){var d=g.getAttribute(c);null!==d&&(b.adv[a]=d||"")};d("advId","id");d("advLangDir","dir");d("advAccessKey","accessKey");b.adv.advName=g.data("cke-saved-name")||g.getAttribute("name")||"";d("advLangCode","lang");d("advTabIndex","tabindex");d("advTitle","title");d("advContentType","type");CKEDITOR.plugins.link.synAnchorSelector? +b.adv.advCSSClasses=v(g):d("advCSSClasses","class");d("advCharset","charset");d("advStyles","style");d("advRel","rel")}d=b.anchors=[];var h;if(CKEDITOR.plugins.link.emptyAnchorFix){f=a.document.getElementsByTag("a");c=0;for(e=f.count();c<e;c++)if(h=f.getItem(c),h.data("cke-saved-name")||h.hasAttribute("name"))d.push({name:h.data("cke-saved-name")||h.getAttribute("name"),id:h.getAttribute("id")})}else{f=new CKEDITOR.dom.nodeList(a.document.$.anchors);c=0;for(e=f.count();c<e;c++)h=f.getItem(c),d[c]= +{name:h.getAttribute("name"),id:h.getAttribute("id")}}if(CKEDITOR.plugins.link.fakeAnchor){f=a.document.getElementsByTag("img");c=0;for(e=f.count();c<e;c++)(h=CKEDITOR.plugins.link.tryRestoreFakeAnchor(a,f.getItem(c)))&&d.push({name:h.getAttribute("name"),id:h.getAttribute("id")})}this._.selectedElement=g;return b},j=function(a){a.target&&this.setValue(a.target[this.id]||"")},k=function(a){a.adv&&this.setValue(a.adv[this.id]||"")},l=function(a){a.target||(a.target={});a.target[this.id]=this.getValue()|| +""},m=function(a){a.adv||(a.adv={});a.adv[this.id]=this.getValue()||""},o=n.config.emailProtection||"";o&&"encode"!=o&&(q=p=void 0,o.replace(/^([^(]+)\(([^)]+)\)$/,function(a,b,c){q=b;p=[];c.replace(/[^,\s]+/g,function(a){p.push(a)})}));var i=n.lang.common,b=n.lang.link;return{title:b.title,minWidth:350,minHeight:230,contents:[{id:"info",label:b.info,title:b.info,elements:[{id:"linkType",type:"select",label:b.type,"default":"url",items:[[b.toUrl,"url"],[b.toAnchor,"anchor"],[b.toEmail,"email"]],onChange:function(){var a= +this.getDialog(),b=["urlOptions","anchorOptions","emailOptions"],c=this.getValue(),d=a.definition.getContents("upload"),d=d&&d.hidden;if(c=="url"){n.config.linkShowTargetTab&&a.showPage("target");d||a.showPage("upload")}else{a.hidePage("target");d||a.hidePage("upload")}for(d=0;d<b.length;d++){var e=a.getContentElement("info",b[d]);if(e){e=e.getElement().getParent().getParent();b[d]==c+"Options"?e.show():e.hide()}}a.layout()},setup:function(a){a.type&&this.setValue(a.type)},commit:function(a){a.type= +this.getValue()}},{type:"vbox",id:"urlOptions",children:[{type:"hbox",widths:["25%","75%"],children:[{id:"protocol",type:"select",label:i.protocol,"default":"http://",items:[["http://‎","http://"],["https://‎","https://"],["ftp://‎","ftp://"],["news://‎","news://"],[b.other,""]],setup:function(a){a.url&&this.setValue(a.url.protocol||"")},commit:function(a){if(!a.url)a.url={};a.url.protocol=this.getValue()}},{type:"text",id:"url",label:i.url,required:!0,onLoad:function(){this.allowOnChange=true},onKeyUp:function(){this.allowOnChange= +false;var a=this.getDialog().getContentElement("info","protocol"),b=this.getValue(),c=/^((javascript:)|[#\/\.\?])/i,d=/^(http|https|ftp|news):\/\/(?=.)/i.exec(b);if(d){this.setValue(b.substr(d[0].length));a.setValue(d[0].toLowerCase())}else c.test(b)&&a.setValue("");this.allowOnChange=true},onChange:function(){if(this.allowOnChange)this.onKeyUp()},validate:function(){var a=this.getDialog();if(a.getContentElement("info","linkType")&&a.getValueOf("info","linkType")!="url")return true;if(/javascript\:/.test(this.getValue())){alert(i.invalidValue); +return false}return this.getDialog().fakeObj?true:CKEDITOR.dialog.validate.notEmpty(b.noUrl).apply(this)},setup:function(a){this.allowOnChange=false;a.url&&this.setValue(a.url.url);this.allowOnChange=true},commit:function(a){this.onChange();if(!a.url)a.url={};a.url.url=this.getValue();this.allowOnChange=false}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().show()}},{type:"button",id:"browse",hidden:"true",filebrowser:"info:url",label:i.browseServer}]}, +{type:"vbox",id:"anchorOptions",width:260,align:"center",padding:0,children:[{type:"fieldset",id:"selectAnchorText",label:b.selectAnchor,setup:function(a){a.anchors.length>0?this.getElement().show():this.getElement().hide()},children:[{type:"hbox",id:"selectAnchor",children:[{type:"select",id:"anchorName","default":"",label:b.anchorName,style:"width: 100%;",items:[[""]],setup:function(a){this.clear();this.add("");for(var b=0;b<a.anchors.length;b++)a.anchors[b].name&&this.add(a.anchors[b].name);a.anchor&& +this.setValue(a.anchor.name);(a=this.getDialog().getContentElement("info","linkType"))&&a.getValue()=="email"&&this.focus()},commit:function(a){if(!a.anchor)a.anchor={};a.anchor.name=this.getValue()}},{type:"select",id:"anchorId","default":"",label:b.anchorId,style:"width: 100%;",items:[[""]],setup:function(a){this.clear();this.add("");for(var b=0;b<a.anchors.length;b++)a.anchors[b].id&&this.add(a.anchors[b].id);a.anchor&&this.setValue(a.anchor.id)},commit:function(a){if(!a.anchor)a.anchor={};a.anchor.id= +this.getValue()}}],setup:function(a){a.anchors.length>0?this.getElement().show():this.getElement().hide()}}]},{type:"html",id:"noAnchors",style:"text-align: center;",html:'<div role="note" tabIndex="-1">'+CKEDITOR.tools.htmlEncode(b.noAnchors)+"</div>",focus:!0,setup:function(a){a.anchors.length<1?this.getElement().show():this.getElement().hide()}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().hide()}},{type:"vbox",id:"emailOptions",padding:1,children:[{type:"text", +id:"emailAddress",label:b.emailAddress,required:!0,validate:function(){var a=this.getDialog();return!a.getContentElement("info","linkType")||a.getValueOf("info","linkType")!="email"?true:CKEDITOR.dialog.validate.notEmpty(b.noEmail).apply(this)},setup:function(a){a.email&&this.setValue(a.email.address);(a=this.getDialog().getContentElement("info","linkType"))&&a.getValue()=="email"&&this.select()},commit:function(a){if(!a.email)a.email={};a.email.address=this.getValue()}},{type:"text",id:"emailSubject", +label:b.emailSubject,setup:function(a){a.email&&this.setValue(a.email.subject)},commit:function(a){if(!a.email)a.email={};a.email.subject=this.getValue()}},{type:"textarea",id:"emailBody",label:b.emailBody,rows:3,"default":"",setup:function(a){a.email&&this.setValue(a.email.body)},commit:function(a){if(!a.email)a.email={};a.email.body=this.getValue()}}],setup:function(){this.getDialog().getContentElement("info","linkType")||this.getElement().hide()}}]},{id:"target",requiredContent:"a[target]",label:b.target, +title:b.target,elements:[{type:"hbox",widths:["50%","50%"],children:[{type:"select",id:"linkTargetType",label:i.target,"default":"notSet",style:"width : 100%;",items:[[i.notSet,"notSet"],[b.targetFrame,"frame"],[b.targetPopup,"popup"],[i.targetNew,"_blank"],[i.targetTop,"_top"],[i.targetSelf,"_self"],[i.targetParent,"_parent"]],onChange:s,setup:function(a){a.target&&this.setValue(a.target.type||"notSet");s.call(this)},commit:function(a){if(!a.target)a.target={};a.target.type=this.getValue()}},{type:"text", +id:"linkTargetName",label:b.targetFrameName,"default":"",setup:function(a){a.target&&this.setValue(a.target.name)},commit:function(a){if(!a.target)a.target={};a.target.name=this.getValue().replace(/\W/gi,"")}}]},{type:"vbox",width:"100%",align:"center",padding:2,id:"popupFeatures",children:[{type:"fieldset",label:b.popupFeatures,children:[{type:"hbox",children:[{type:"checkbox",id:"resizable",label:b.popupResizable,setup:j,commit:l},{type:"checkbox",id:"status",label:b.popupStatusBar,setup:j,commit:l}]}, +{type:"hbox",children:[{type:"checkbox",id:"location",label:b.popupLocationBar,setup:j,commit:l},{type:"checkbox",id:"toolbar",label:b.popupToolbar,setup:j,commit:l}]},{type:"hbox",children:[{type:"checkbox",id:"menubar",label:b.popupMenuBar,setup:j,commit:l},{type:"checkbox",id:"fullscreen",label:b.popupFullScreen,setup:j,commit:l}]},{type:"hbox",children:[{type:"checkbox",id:"scrollbars",label:b.popupScrollBars,setup:j,commit:l},{type:"checkbox",id:"dependent",label:b.popupDependent,setup:j,commit:l}]}, +{type:"hbox",children:[{type:"text",widths:["50%","50%"],labelLayout:"horizontal",label:i.width,id:"width",setup:j,commit:l},{type:"text",labelLayout:"horizontal",widths:["50%","50%"],label:b.popupLeft,id:"left",setup:j,commit:l}]},{type:"hbox",children:[{type:"text",labelLayout:"horizontal",widths:["50%","50%"],label:i.height,id:"height",setup:j,commit:l},{type:"text",labelLayout:"horizontal",label:b.popupTop,widths:["50%","50%"],id:"top",setup:j,commit:l}]}]}]}]},{id:"upload",label:b.upload,title:b.upload, +hidden:!0,filebrowser:"uploadButton",elements:[{type:"file",id:"upload",label:i.upload,style:"height:40px",size:29},{type:"fileButton",id:"uploadButton",label:i.uploadSubmit,filebrowser:"info:url","for":["upload","upload"]}]},{id:"advanced",label:b.advanced,title:b.advanced,elements:[{type:"vbox",padding:1,children:[{type:"hbox",widths:["45%","35%","20%"],children:[{type:"text",id:"advId",requiredContent:"a[id]",label:b.id,setup:k,commit:m},{type:"select",id:"advLangDir",requiredContent:"a[dir]", +label:b.langDir,"default":"",style:"width:110px",items:[[i.notSet,""],[b.langDirLTR,"ltr"],[b.langDirRTL,"rtl"]],setup:k,commit:m},{type:"text",id:"advAccessKey",requiredContent:"a[accesskey]",width:"80px",label:b.acccessKey,maxLength:1,setup:k,commit:m}]},{type:"hbox",widths:["45%","35%","20%"],children:[{type:"text",label:b.name,id:"advName",requiredContent:"a[name]",setup:k,commit:m},{type:"text",label:b.langCode,id:"advLangCode",requiredContent:"a[lang]",width:"110px","default":"",setup:k,commit:m}, +{type:"text",label:b.tabIndex,id:"advTabIndex",requiredContent:"a[tabindex]",width:"80px",maxLength:5,setup:k,commit:m}]}]},{type:"vbox",padding:1,children:[{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.advisoryTitle,requiredContent:"a[title]","default":"",id:"advTitle",setup:k,commit:m},{type:"text",label:b.advisoryContentType,requiredContent:"a[type]","default":"",id:"advContentType",setup:k,commit:m}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.cssClasses, +requiredContent:"a(cke-xyz)","default":"",id:"advCSSClasses",setup:k,commit:m},{type:"text",label:b.charset,requiredContent:"a[charset]","default":"",id:"advCharset",setup:k,commit:m}]},{type:"hbox",widths:["45%","55%"],children:[{type:"text",label:b.rel,requiredContent:"a[rel]","default":"",id:"advRel",setup:k,commit:m},{type:"text",label:b.styles,requiredContent:"a{cke-xyz}","default":"",id:"advStyles",validate:CKEDITOR.dialog.validate.inlineStyle(n.lang.common.invalidInlineStyle),setup:k,commit:m}]}]}]}], +onShow:function(){var a=this.getParentEditor(),b=a.getSelection(),c=null;(c=w.getSelectedLink(a))&&c.hasAttribute("href")?b.getSelectedElement()||b.selectElement(c):c=null;this.setupContent(I.apply(this,[a,c]))},onOk:function(){var a={},b=[],c={},d=this.getParentEditor();this.commitContent(c);switch(c.type||"url"){case "url":var e=c.url&&c.url.protocol!=void 0?c.url.protocol:"http://",i=c.url&&CKEDITOR.tools.trim(c.url.url)||"";a["data-cke-saved-href"]=i.indexOf("/")===0?i:e+i;break;case "anchor":e= +c.anchor&&c.anchor.id;a["data-cke-saved-href"]="#"+(c.anchor&&c.anchor.name||e||"");break;case "email":var f=c.email,e=f.address;switch(o){case "":case "encode":var i=encodeURIComponent(f.subject||""),h=encodeURIComponent(f.body||""),f=[];i&&f.push("subject="+i);h&&f.push("body="+h);f=f.length?"?"+f.join("&"):"";if(o=="encode"){e=["javascript:void(location.href='mailto:'+",u(e)];f&&e.push("+'",r(f),"'");e.push(")")}else e=["mailto:",e,f];break;default:e=e.split("@",2);f.name=e[0];f.domain=e[1];e= +["javascript:",t(f)]}a["data-cke-saved-href"]=e.join("")}if(c.target)if(c.target.type=="popup"){for(var e=["window.open(this.href, '",c.target.name||"","', '"],j=["resizable","status","location","toolbar","menubar","fullscreen","scrollbars","dependent"],i=j.length,f=function(a){c.target[a]&&j.push(a+"="+c.target[a])},h=0;h<i;h++)j[h]=j[h]+(c.target[j[h]]?"=yes":"=no");f("width");f("left");f("height");f("top");e.push(j.join(","),"'); return false;");a["data-cke-pa-onclick"]=e.join("");b.push("target")}else{c.target.type!= +"notSet"&&c.target.name?a.target=c.target.name:b.push("target");b.push("data-cke-pa-onclick","onclick")}if(c.adv){e=function(d,e){var f=c.adv[d];f?a[e]=f:b.push(e)};e("advId","id");e("advLangDir","dir");e("advAccessKey","accessKey");c.adv.advName?a.name=a["data-cke-saved-name"]=c.adv.advName:b=b.concat(["data-cke-saved-name","name"]);e("advLangCode","lang");e("advTabIndex","tabindex");e("advTitle","title");e("advContentType","type");e("advCSSClasses","class");e("advCharset","charset");e("advStyles", +"style");e("advRel","rel")}e=d.getSelection();a.href=a["data-cke-saved-href"];if(this._.selectedElement){d=this._.selectedElement;i=d.data("cke-saved-href");f=d.getHtml();d.setAttributes(a);d.removeAttributes(b);c.adv&&(c.adv.advName&&CKEDITOR.plugins.link.synAnchorSelector)&&d.addClass(d.getChildCount()?"cke_anchor":"cke_anchor_empty");if(i==f||c.type=="email"&&f.indexOf("@")!=-1){d.setHtml(c.type=="email"?c.email.address:a["data-cke-saved-href"]);e.selectElement(d)}delete this._.selectedElement}else{e= +e.getRanges()[0];if(e.collapsed){d=new CKEDITOR.dom.text(c.type=="email"?c.email.address:a["data-cke-saved-href"],d.document);e.insertNode(d);e.selectNodeContents(d)}d=new CKEDITOR.style({element:"a",attributes:a});d.type=CKEDITOR.STYLE_INLINE;d.applyToRange(e);e.select()}},onLoad:function(){n.config.linkShowAdvancedTab||this.hidePage("advanced");n.config.linkShowTargetTab||this.hidePage("target")},onFocus:function(){var a=this.getContentElement("info","linkType");if(a&&a.getValue()=="url"){a=this.getContentElement("info", +"url");a.select()}}}}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/link/images/anchor.png b/theme/bootstrap/plugins/ckeditor/plugins/link/images/anchor.png new file mode 100644 index 0000000..c946ba5 Binary files /dev/null and b/theme/bootstrap/plugins/ckeditor/plugins/link/images/anchor.png differ diff --git a/theme/bootstrap/plugins/ckeditor/plugins/link/images/hidpi/anchor.png b/theme/bootstrap/plugins/ckeditor/plugins/link/images/hidpi/anchor.png new file mode 100644 index 0000000..908b9fa Binary files /dev/null and b/theme/bootstrap/plugins/ckeditor/plugins/link/images/hidpi/anchor.png differ diff --git a/theme/bootstrap/plugins/ckeditor/plugins/magicline/images/hidpi/icon.png b/theme/bootstrap/plugins/ckeditor/plugins/magicline/images/hidpi/icon.png new file mode 100644 index 0000000..73a5f43 Binary files /dev/null and b/theme/bootstrap/plugins/ckeditor/plugins/magicline/images/hidpi/icon.png differ diff --git a/theme/bootstrap/plugins/ckeditor/plugins/magicline/images/icon.png b/theme/bootstrap/plugins/ckeditor/plugins/magicline/images/icon.png new file mode 100644 index 0000000..b5de5ba Binary files /dev/null and b/theme/bootstrap/plugins/ckeditor/plugins/magicline/images/icon.png differ diff --git a/theme/bootstrap/plugins/ckeditor/plugins/pastefromword/filter/default.js b/theme/bootstrap/plugins/ckeditor/plugins/pastefromword/filter/default.js new file mode 100644 index 0000000..cc7a2e9 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/pastefromword/filter/default.js @@ -0,0 +1,31 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){function y(a){for(var a=a.toUpperCase(),c=z.length,b=0,f=0;f<c;++f)for(var d=z[f],e=d[1].length;a.substr(0,e)==d[1];a=a.substr(e))b+=d[0];return b}function A(a){for(var a=a.toUpperCase(),c=B.length,b=1,f=1;0<a.length;f*=c)b+=B.indexOf(a.charAt(a.length-1))*f,a=a.substr(0,a.length-1);return b}var C=CKEDITOR.htmlParser.fragment.prototype,o=CKEDITOR.htmlParser.element.prototype;C.onlyChild=o.onlyChild=function(){var a=this.children;return 1==a.length&&a[0]||null};o.removeAnyChildWithName= +function(a){for(var c=this.children,b=[],f,d=0;d<c.length;d++)f=c[d],f.name&&(f.name==a&&(b.push(f),c.splice(d--,1)),b=b.concat(f.removeAnyChildWithName(a)));return b};o.getAncestor=function(a){for(var c=this.parent;c&&(!c.name||!c.name.match(a));)c=c.parent;return c};C.firstChild=o.firstChild=function(a){for(var c,b=0;b<this.children.length;b++)if(c=this.children[b],a(c)||c.name&&(c=c.firstChild(a)))return c;return null};o.addStyle=function(a,c,b){var f="";if("string"==typeof c)f+=a+":"+c+";";else{if("object"== +typeof a)for(var d in a)a.hasOwnProperty(d)&&(f+=d+":"+a[d]+";");else f+=a;b=c}this.attributes||(this.attributes={});a=this.attributes.style||"";a=(b?[f,a]:[a,f]).join(";");this.attributes.style=a.replace(/^;|;(?=;)/,"")};o.getStyle=function(a){var c=this.attributes.style;if(c)return c=CKEDITOR.tools.parseCssText(c,1),c[a]};CKEDITOR.dtd.parentOf=function(a){var c={},b;for(b in this)-1==b.indexOf("$")&&this[b][a]&&(c[b]=1);return c};var H=/^([.\d]*)+(em|ex|px|gd|rem|vw|vh|vm|ch|mm|cm|in|pt|pc|deg|rad|ms|s|hz|khz){1}?/i, +D=/^(?:\b0[^\s]*\s*){1,4}$/,x={ol:{decimal:/\d+/,"lower-roman":/^m{0,4}(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})$/,"upper-roman":/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/,"lower-alpha":/^[a-z]+$/,"upper-alpha":/^[A-Z]+$/},ul:{disc:/[l\u00B7\u2002]/,circle:/[\u006F\u00D8]/,square:/[\u006E\u25C6]/}},z=[[1E3,"M"],[900,"CM"],[500,"D"],[400,"CD"],[100,"C"],[90,"XC"],[50,"L"],[40,"XL"],[10,"X"],[9,"IX"],[5,"V"],[4,"IV"],[1,"I"]],B="ABCDEFGHIJKLMNOPQRSTUVWXYZ",s=0,t=null,w,E=CKEDITOR.plugins.pastefromword= +{utils:{createListBulletMarker:function(a,c){var b=new CKEDITOR.htmlParser.element("cke:listbullet");b.attributes={"cke:listsymbol":a[0]};b.add(new CKEDITOR.htmlParser.text(c));return b},isListBulletIndicator:function(a){if(/mso-list\s*:\s*Ignore/i.test(a.attributes&&a.attributes.style))return!0},isContainingOnlySpaces:function(a){var c;return(c=a.onlyChild())&&/^(:?\s|&nbsp;)+$/.test(c.value)},resolveList:function(a){var c=a.attributes,b;if((b=a.removeAnyChildWithName("cke:listbullet"))&&b.length&& +(b=b[0]))return a.name="cke:li",c.style&&(c.style=E.filters.stylesFilter([["text-indent"],["line-height"],[/^margin(:?-left)?$/,null,function(a){a=a.split(" ");a=CKEDITOR.tools.convertToPx(a[3]||a[1]||a[0]);!s&&(null!==t&&a>t)&&(s=a-t);t=a;c["cke:indent"]=s&&Math.ceil(a/s)+1||1}],[/^mso-list$/,null,function(a){var a=a.split(" "),b=Number(a[0].match(/\d+/)),a=Number(a[1].match(/\d+/));1==a&&(b!==w&&(c["cke:reset"]=1),w=b);c["cke:indent"]=a}]])(c.style,a)||""),c["cke:indent"]||(t=0,c["cke:indent"]= +1),CKEDITOR.tools.extend(c,b.attributes),!0;w=t=s=null;return!1},getStyleComponents:function(){var a=CKEDITOR.dom.element.createFromHtml('<div style="position:absolute;left:-9999px;top:-9999px;"></div>',CKEDITOR.document);CKEDITOR.document.getBody().append(a);return function(c,b,f){a.setStyle(c,b);for(var c={},b=f.length,d=0;d<b;d++)c[f[d]]=a.getStyle(f[d]);return c}}(),listDtdParents:CKEDITOR.dtd.parentOf("ol")},filters:{flattenList:function(a,c){var c="number"==typeof c?c:1,b=a.attributes,f;switch(b.type){case "a":f= +"lower-alpha";break;case "1":f="decimal"}for(var d=a.children,e,h=0;h<d.length;h++)if(e=d[h],e.name in CKEDITOR.dtd.$listItem){var j=e.attributes,g=e.children,m=g[g.length-1];m.name in CKEDITOR.dtd.$list&&(a.add(m,h+1),--g.length||d.splice(h--,1));e.name="cke:li";b.start&&!h&&(j.value=b.start);E.filters.stylesFilter([["tab-stops",null,function(a){(a=a.split(" ")[1].match(H))&&(t=CKEDITOR.tools.convertToPx(a[0]))}],1==c?["mso-list",null,function(a){a=a.split(" ");a=Number(a[0].match(/\d+/));a!==w&& +(j["cke:reset"]=1);w=a}]:null])(j.style);j["cke:indent"]=c;j["cke:listtype"]=a.name;j["cke:list-style-type"]=f}else if(e.name in CKEDITOR.dtd.$list){arguments.callee.apply(this,[e,c+1]);d=d.slice(0,h).concat(e.children).concat(d.slice(h+1));a.children=[];e=0;for(g=d.length;e<g;e++)a.add(d[e]);d=a.children}delete a.name;b["cke:list"]=1},assembleList:function(a){for(var c=a.children,b,f,d,e,h,j,a=[],g,m,i,l,k,p,n=0;n<c.length;n++)if(b=c[n],"cke:li"==b.name)if(b.name="li",f=b.attributes,i=(i=f["cke:listsymbol"])&& +i.match(/^(?:[(]?)([^\s]+?)([.)]?)$/),l=k=p=null,f["cke:ignored"])c.splice(n--,1);else{f["cke:reset"]&&(j=e=h=null);d=Number(f["cke:indent"]);d!=e&&(m=g=null);if(i){if(m&&x[m][g].test(i[1]))l=m,k=g;else for(var q in x)for(var u in x[q])if(x[q][u].test(i[1]))if("ol"==q&&/alpha|roman/.test(u)){if(g=/roman/.test(u)?y(i[1]):A(i[1]),!p||g<p)p=g,l=q,k=u}else{l=q;k=u;break}!l&&(l=i[2]?"ol":"ul")}else l=f["cke:listtype"]||"ol",k=f["cke:list-style-type"];m=l;g=k||("ol"==l?"decimal":"disc");k&&k!=("ol"==l? +"decimal":"disc")&&b.addStyle("list-style-type",k);if("ol"==l&&i){switch(k){case "decimal":p=Number(i[1]);break;case "lower-roman":case "upper-roman":p=y(i[1]);break;case "lower-alpha":case "upper-alpha":p=A(i[1])}b.attributes.value=p}if(j){if(d>e)a.push(j=new CKEDITOR.htmlParser.element(l)),j.add(b),h.add(j);else{if(d<e){e-=d;for(var r;e--&&(r=j.parent);)j=r.parent}j.add(b)}c.splice(n--,1)}else a.push(j=new CKEDITOR.htmlParser.element(l)),j.add(b),c[n]=j;h=b;e=d}else j&&(j=e=h=null);for(n=0;n<a.length;n++)if(j= +a[n],q=j.children,g=g=void 0,u=j.children.length,r=g=void 0,c=/list-style-type:(.*?)(?:;|$)/,e=CKEDITOR.plugins.pastefromword.filters.stylesFilter,g=j.attributes,!c.exec(g.style)){for(h=0;h<u;h++)if(g=q[h],g.attributes.value&&Number(g.attributes.value)==h+1&&delete g.attributes.value,g=c.exec(g.attributes.style))if(g[1]==r||!r)r=g[1];else{r=null;break}if(r){for(h=0;h<u;h++)g=q[h].attributes,g.style&&(g.style=e([["list-style-type"]])(g.style)||"");j.addStyle("list-style-type",r)}}w=t=s=null},falsyFilter:function(){return!1}, +stylesFilter:function(a,c){return function(b,f){var d=[];(b||"").replace(/&quot;/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(b,e,g){e=e.toLowerCase();"font-family"==e&&(g=g.replace(/["']/g,""));for(var m,i,l,k=0;k<a.length;k++)if(a[k]&&(b=a[k][0],m=a[k][1],i=a[k][2],l=a[k][3],e.match(b)&&(!m||g.match(m)))){e=l||e;c&&(i=i||g);"function"==typeof i&&(i=i(g,f,e));i&&i.push&&(e=i[0],i=i[1]);"string"==typeof i&&d.push([e,i]);return}!c&&d.push([e,g])});for(var e=0;e<d.length;e++)d[e]= +d[e].join(":");return d.length?d.join(";")+";":!1}},elementMigrateFilter:function(a,c){return a?function(b){var f=c?(new CKEDITOR.style(a,c))._.definition:a;b.name=f.element;CKEDITOR.tools.extend(b.attributes,CKEDITOR.tools.clone(f.attributes));b.addStyle(CKEDITOR.style.getStyleText(f))}:function(){}},styleMigrateFilter:function(a,c){var b=this.elementMigrateFilter;return a?function(f,d){var e=new CKEDITOR.htmlParser.element(null),h={};h[c]=f;b(a,h)(e);e.children=d.children;d.children=[e];e.filter= +function(){};e.parent=d}:function(){}},bogusAttrFilter:function(a,c){if(-1==c.name.indexOf("cke:"))return!1},applyStyleFilter:null},getRules:function(a,c){var b=CKEDITOR.dtd,f=CKEDITOR.tools.extend({},b.$block,b.$listItem,b.$tableContent),d=a.config,e=this.filters,h=e.falsyFilter,j=e.stylesFilter,g=e.elementMigrateFilter,m=CKEDITOR.tools.bind(this.filters.styleMigrateFilter,this.filters),i=this.utils.createListBulletMarker,l=e.flattenList,k=e.assembleList,p=this.utils.isListBulletIndicator,n=this.utils.isContainingOnlySpaces, +q=this.utils.resolveList,u=function(a){a=CKEDITOR.tools.convertToPx(a);return isNaN(a)?a:a+"px"},r=this.utils.getStyleComponents,t=this.utils.listDtdParents,o=!1!==d.pasteFromWordRemoveFontStyles,s=!1!==d.pasteFromWordRemoveStyles;return{elementNames:[[/meta|link|script/,""]],root:function(a){a.filterChildren(c);k(a)},elements:{"^":function(a){var c;CKEDITOR.env.gecko&&(c=e.applyStyleFilter)&&c(a)},$:function(a){var v=a.name||"",e=a.attributes;v in f&&e.style&&(e.style=j([[/^(:?width|height)$/,null, +u]])(e.style)||"");if(v.match(/h\d/)){a.filterChildren(c);if(q(a))return;g(d["format_"+v])(a)}else if(v in b.$inline)a.filterChildren(c),n(a)&&delete a.name;else if(-1!=v.indexOf(":")&&-1==v.indexOf("cke")){a.filterChildren(c);if("v:imagedata"==v){if(v=a.attributes["o:href"])a.attributes.src=v;a.name="img";return}delete a.name}v in t&&(a.filterChildren(c),k(a))},style:function(a){if(CKEDITOR.env.gecko){var a=(a=a.onlyChild().value.match(/\/\* Style Definitions \*\/([\s\S]*?)\/\*/))&&a[1],c={};a&& +(a.replace(/[\n\r]/g,"").replace(/(.+?)\{(.+?)\}/g,function(a,b,F){for(var b=b.split(","),a=b.length,d=0;d<a;d++)CKEDITOR.tools.trim(b[d]).replace(/^(\w+)(\.[\w-]+)?$/g,function(a,b,d){b=b||"*";d=d.substring(1,d.length);d.match(/MsoNormal/)||(c[b]||(c[b]={}),d?c[b][d]=F:c[b]=F)})}),e.applyStyleFilter=function(a){var b=c["*"]?"*":a.name,d=a.attributes&&a.attributes["class"];b in c&&(b=c[b],"object"==typeof b&&(b=b[d]),b&&a.addStyle(b,!0))})}return!1},p:function(a){if(/MsoListParagraph/i.exec(a.attributes["class"])|| +a.getStyle("mso-list")){var b=a.firstChild(function(a){return a.type==CKEDITOR.NODE_TEXT&&!n(a.parent)});(b=b&&b.parent)&&b.addStyle("mso-list","Ignore")}a.filterChildren(c);q(a)||(d.enterMode==CKEDITOR.ENTER_BR?(delete a.name,a.add(new CKEDITOR.htmlParser.element("br"))):g(d["format_"+(d.enterMode==CKEDITOR.ENTER_P?"p":"div")])(a))},div:function(a){var c=a.onlyChild();if(c&&"table"==c.name){var b=a.attributes;c.attributes=CKEDITOR.tools.extend(c.attributes,b);b.style&&c.addStyle(b.style);c=new CKEDITOR.htmlParser.element("div"); +c.addStyle("clear","both");a.add(c);delete a.name}},td:function(a){a.getAncestor("thead")&&(a.name="th")},ol:l,ul:l,dl:l,font:function(a){if(p(a.parent))delete a.name;else{a.filterChildren(c);var b=a.attributes,d=b.style,e=a.parent;"font"==e.name?(CKEDITOR.tools.extend(e.attributes,a.attributes),d&&e.addStyle(d),delete a.name):(d=d||"",b.color&&("#000000"!=b.color&&(d+="color:"+b.color+";"),delete b.color),b.face&&(d+="font-family:"+b.face+";",delete b.face),b.size&&(d+="font-size:"+(3<b.size?"large": +3>b.size?"small":"medium")+";",delete b.size),a.name="span",a.addStyle(d))}},span:function(a){if(p(a.parent))return!1;a.filterChildren(c);if(n(a))return delete a.name,null;if(p(a)){var b=a.firstChild(function(a){return a.value||"img"==a.name}),e=(b=b&&(b.value||"l."))&&b.match(/^(?:[(]?)([^\s]+?)([.)]?)$/);if(e)return b=i(e,b),(a=a.getAncestor("span"))&&/ mso-hide:\s*all|display:\s*none /.test(a.attributes.style)&&(b.attributes["cke:ignored"]=1),b}if(e=(b=a.attributes)&&b.style)b.style=j([["line-height"], +[/^font-family$/,null,!o?m(d.font_style,"family"):null],[/^font-size$/,null,!o?m(d.fontSize_style,"size"):null],[/^color$/,null,!o?m(d.colorButton_foreStyle,"color"):null],[/^background-color$/,null,!o?m(d.colorButton_backStyle,"color"):null]])(e,a)||"";b.style||delete b.style;CKEDITOR.tools.isEmpty(b)&&delete a.name;return null},b:g(d.coreStyles_bold),i:g(d.coreStyles_italic),u:g(d.coreStyles_underline),s:g(d.coreStyles_strike),sup:g(d.coreStyles_superscript),sub:g(d.coreStyles_subscript),a:function(a){a= +a.attributes;a.href&&a.href.match(/^file:\/\/\/[\S]+#/i)&&(a.href=a.href.replace(/^file:\/\/\/[^#]+/i,""))},"cke:listbullet":function(a){a.getAncestor(/h\d/)&&!d.pasteFromWordNumberedHeadingToList&&delete a.name}},attributeNames:[[/^onmouse(:?out|over)/,""],[/^onload$/,""],[/(?:v|o):\w+/,""],[/^lang/,""]],attributes:{style:j(s?[[/^list-style-type$/,null],[/^margin$|^margin-(?!bottom|top)/,null,function(a,b,c){if(b.name in{p:1,div:1}){b="ltr"==d.contentsLangDirection?"margin-left":"margin-right";if("margin"== +c)a=r(c,a,[b])[b];else if(c!=b)return null;if(a&&!D.test(a))return[b,a]}return null}],[/^clear$/],[/^border.*|margin.*|vertical-align|float$/,null,function(a,b){if("img"==b.name)return a}],[/^width|height$/,null,function(a,b){if(b.name in{table:1,td:1,th:1,img:1})return a}]]:[[/^mso-/],[/-color$/,null,function(a){if("transparent"==a)return!1;if(CKEDITOR.env.gecko)return a.replace(/-moz-use-text-color/g,"transparent")}],[/^margin$/,D],["text-indent","0cm"],["page-break-before"],["tab-stops"],["display", +"none"],o?[/font-?/]:null],s),width:function(a,c){if(c.name in b.$tableContent)return!1},border:function(a,c){if(c.name in b.$tableContent)return!1},"class":h,bgcolor:h,valign:s?h:function(a,b){b.addStyle("vertical-align",a);return!1}},comment:!CKEDITOR.env.ie?function(a,b){var c=a.match(/<img.*?>/),d=a.match(/^\[if !supportLists\]([\s\S]*?)\[endif\]$/);return d?(d=(c=d[1]||c&&"l.")&&c.match(/>(?:[(]?)([^\s]+?)([.)]?)</),i(d,c)):CKEDITOR.env.gecko&&c?(c=CKEDITOR.htmlParser.fragment.fromHtml(c[0]).children[0], +(d=(d=(d=b.previous)&&d.value.match(/<v:imagedata[^>]*o:href=['"](.*?)['"]/))&&d[1])&&(c.attributes.src=d),c):!1}:h}}},G=function(){this.dataFilter=new CKEDITOR.htmlParser.filter};G.prototype={toHtml:function(a){var a=CKEDITOR.htmlParser.fragment.fromHtml(a),c=new CKEDITOR.htmlParser.basicWriter;a.writeHtml(c,this.dataFilter);return c.getHtml(!0)}};CKEDITOR.cleanWord=function(a,c){CKEDITOR.env.gecko&&(a=a.replace(/(<\!--\[if[^<]*?\])--\>([\S\s]*?)<\!--(\[endif\]--\>)/gi,"$1$2$3"));CKEDITOR.env.webkit&& +(a=a.replace(/(class="MsoListParagraph[^>]+><\!--\[if !supportLists\]--\>)([^<]+<span[^<]+<\/span>)(<\!--\[endif\]--\>)/gi,"$1<span>$2</span>$3"));var b=new G,f=b.dataFilter;f.addRules(CKEDITOR.plugins.pastefromword.getRules(c,f));c.fire("beforeCleanWord",{filter:f});try{a=b.toHtml(a)}catch(d){alert(c.lang.pastefromword.error)}a=a.replace(/cke:.*?".*?"/g,"");a=a.replace(/style=""/g,"");return a=a.replace(/<span>/g,"")}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/scayt/LICENSE.md b/theme/bootstrap/plugins/ckeditor/plugins/scayt/LICENSE.md new file mode 100644 index 0000000..844ab4d --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/scayt/LICENSE.md @@ -0,0 +1,28 @@ +Software License Agreement +========================== + +**CKEditor SCAYT Plugin** +Copyright &copy; 2012, [CKSource](http://cksource.com) - Frederico Knabben. All rights reserved. + +Licensed under the terms of any of the following licenses at your choice: + +* GNU General Public License Version 2 or later (the "GPL"): + http://www.gnu.org/licenses/gpl.html + +* GNU Lesser General Public License Version 2.1 or later (the "LGPL"): + http://www.gnu.org/licenses/lgpl.html + +* Mozilla Public License Version 1.1 or later (the "MPL"): + http://www.mozilla.org/MPL/MPL-1.1.html + +You are not required to, but if you want to explicitly declare the license you have chosen to be bound to when using, reproducing, modifying and distributing this software, just include a text file titled "legal.txt" in your version of this software, indicating your license choice. + +Sources of Intellectual Property Included in this plugin +-------------------------------------------------------- + +Where not otherwise indicated, all plugin content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, the plugin will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +CKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product names are trademarks, registered trademarks or service marks of their respective holders. diff --git a/theme/bootstrap/plugins/ckeditor/plugins/scayt/README.md b/theme/bootstrap/plugins/ckeditor/plugins/scayt/README.md new file mode 100644 index 0000000..0f51958 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/scayt/README.md @@ -0,0 +1,25 @@ +CKEditor SCAYT Plugin +===================== + +This plugin brings Spell Check As You Type (SCAYT) into CKEditor. + +SCAYT is a "installation-less", using the web-services of [WebSpellChecker.net](http://www.webspellchecker.net/). It's an out of the box solution. + +Installation +------------ + +1. Clone/copy this repository contents in a new "plugins/scayt" folder in your CKEditor installation. +2. Enable the "scayt" plugin in the CKEditor configuration file (config.js): + + config.extraPlugins = 'scayt'; + +That's all. SCAYT will appear on the editor toolbar and will be ready to use. + +License +------- + +Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html). + +See LICENSE.md for more information. + +Developed in cooperation with [WebSpellChecker.net](http://www.webspellchecker.net/). diff --git a/theme/bootstrap/plugins/ckeditor/plugins/scayt/dialogs/options.js b/theme/bootstrap/plugins/ckeditor/plugins/scayt/dialogs/options.js new file mode 100644 index 0000000..cc97b33 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/scayt/dialogs/options.js @@ -0,0 +1,20 @@ +/* + Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("scaytcheck",function(j){function w(){return"undefined"!=typeof document.forms["optionsbar_"+b]?document.forms["optionsbar_"+b].options:[]}function x(a,b){if(a){var e=a.length;if(void 0==e)a.checked=a.value==b.toString();else for(var d=0;d<e;d++)a[d].checked=!1,a[d].value==b.toString()&&(a[d].checked=!0)}}function n(a){f.getById("dic_message_"+b).setHtml('<span style="color:red;">'+a+"</span>")}function o(a){f.getById("dic_message_"+b).setHtml('<span style="color:blue;">'+a+"</span>")} +function p(a){for(var a=(""+a).split(","),b=0,e=a.length;b<e;b+=1)f.getById(a[b]).$.style.display="inline"}function q(a){for(var a=(""+a).split(","),b=0,e=a.length;b<e;b+=1)f.getById(a[b]).$.style.display="none"}function r(a){f.getById("dic_name_"+b).$.value=a}var s=!0,h,f=CKEDITOR.document,b=j.name,l=CKEDITOR.plugins.scayt.getUiTabs(j),g,t=[],u=0,m=["dic_create_"+b+",dic_restore_"+b,"dic_rename_"+b+",dic_delete_"+b],v=["mixedCase","mixedWithDigits","allCaps","ignoreDomainNames"];g=j.lang.scayt;var z= +[{id:"options",label:g.optionsTab,elements:[{type:"html",id:"options",html:'<form name="optionsbar_'+b+'"><div class="inner_options">\t<div class="messagebox"></div>\t<div style="display:none;">\t\t<input type="checkbox" name="options" id="allCaps_'+b+'" />\t\t<label style = "display: inline" for="allCaps" id="label_allCaps_'+b+'"></label>\t</div>\t<div style="display:none;">\t\t<input name="options" type="checkbox" id="ignoreDomainNames_'+b+'" />\t\t<label style = "display: inline" for="ignoreDomainNames" id="label_ignoreDomainNames_'+ +b+'"></label>\t</div>\t<div style="display:none;">\t<input name="options" type="checkbox" id="mixedCase_'+b+'" />\t\t<label style = "display: inline" for="mixedCase" id="label_mixedCase_'+b+'"></label>\t</div>\t<div style="display:none;">\t\t<input name="options" type="checkbox" id="mixedWithDigits_'+b+'" />\t\t<label style = "display: inline" for="mixedWithDigits" id="label_mixedWithDigits_'+b+'"></label>\t</div></div></form>'}]},{id:"langs",label:g.languagesTab,elements:[{type:"html",id:"langs", +html:'<div class="inner_langs">\t<div class="messagebox"></div>\t <div style="float:left;width:45%;margin-left:5px;" id="scayt_lcol_'+b+'" ></div> <div style="float:left;width:45%;margin-left:15px;" id="scayt_rcol_'+b+'"></div></div>'}]},{id:"dictionaries",label:g.dictionariesTab,elements:[{type:"html",style:"",id:"dictionaries",html:'<form name="dictionarybar_'+b+'"><div class="inner_dictionary" style="text-align:left; white-space:normal; width:320px; overflow: hidden;">\t<div style="margin:5px auto; width:95%;white-space:normal; overflow:hidden;" id="dic_message_'+ +b+'"> </div>\t<div style="margin:5px auto; width:95%;white-space:normal;"> <span class="cke_dialog_ui_labeled_label" >Dictionary name</span><br>\t\t<span class="cke_dialog_ui_labeled_content" >\t\t\t<div class="cke_dialog_ui_input_text">\t\t\t\t<input id="dic_name_'+b+'" type="text" class="cke_dialog_ui_input_text" style = "height: 25px; background: none; padding: 0;"/>\t\t</div></span></div>\t\t<div style="margin:5px auto; width:95%;white-space:normal;">\t\t\t<a style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_create_'+ +b+'">\t\t\t\t</a>\t\t\t<a style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_delete_'+b+'">\t\t\t\t</a>\t\t\t<a style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_rename_'+b+'">\t\t\t\t</a>\t\t\t<a style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_restore_'+b+'">\t\t\t\t</a>\t\t</div>\t<div style="margin:5px auto; width:95%;white-space:normal;" id="dic_info_'+b+'"></div></div></form>'}]},{id:"about", +label:g.aboutTab,elements:[{type:"html",id:"about",style:"margin: 5px 5px;",html:'<div><div id="scayt_about_'+b+'"></div></div>'}]}],B={title:g.title,minWidth:360,minHeight:220,onShow:function(){var a=this;a.data=j.fire("scaytDialog",{});a.options=a.data.scayt_control.option();a.chosed_lang=a.sLang=a.data.scayt_control.sLang;if(!a.data||!a.data.scayt||!a.data.scayt_control)alert("Error loading application service"),a.hide();else{var b=0;s?a.data.scayt.getCaption(j.langCode||"en",function(e){0<b++|| +(h=e,A.apply(a),y.apply(a),s=!1)}):y.apply(a);a.selectPage(a.data.tab)}},onOk:function(){var a=this.data.scayt_control;a.option(this.options);a.setLang(this.chosed_lang);a.refresh()},onCancel:function(){var a=w(),f;for(f in a)a[f].checked=!1;a="undefined"!=typeof document.forms["languagesbar_"+b]?document.forms["languagesbar_"+b].scayt_lang:[];x(a,"")},contents:t};CKEDITOR.plugins.scayt.getScayt(j);for(g=0;g<l.length;g++)1==l[g]&&(t[t.length]=z[g]);1==l[2]&&(u=1);var A=function(){function a(a){var c= +f.getById("dic_name_"+b).getValue();if(!c)return n(" Dictionary name should not be empty. "),!1;try{var d=a.data.getTarget().getParent(),e=/(dic_\w+)_[\w\d]+/.exec(d.getId())[1];j[e].apply(null,[d,c,m])}catch(C){n(" Dictionary error. ")}return!0}var k=this,e=k.data.scayt.getLangList(),d=["dic_create","dic_delete","dic_rename","dic_restore"],g=[],i=[],c;if(u){for(c=0;c<d.length;c++)g[c]=d[c]+"_"+b,f.getById(g[c]).setHtml('<span class="cke_dialog_ui_button">'+h["button_"+d[c]]+"</span>");f.getById("dic_info_"+ +b).setHtml(h.dic_info)}if(1==l[0])for(c in v)d="label_"+v[c],g=f.getById(d+"_"+b),"undefined"!=typeof g&&("undefined"!=typeof h[d]&&"undefined"!=typeof k.options[v[c]])&&(g.setHtml(h[d]),g.getParent().$.style.display="block");d='<p><img src="'+window.scayt.getAboutInfo().logoURL+'" /></p><p>'+h.version+window.scayt.getAboutInfo().version.toString()+"</p><p>"+h.about_throwt_copy+"</p>";f.getById("scayt_about_"+b).setHtml(d);d=function(a,b){var c=f.createElement("label");c.setAttribute("for","cke_option"+ +a);c.setStyle("display","inline");c.setHtml(b[a]);k.sLang==a&&(k.chosed_lang=a);var d=f.createElement("div"),e=CKEDITOR.dom.element.createFromHtml('<input class = "cke_dialog_ui_radio_input" id="cke_option'+a+'" type="radio" '+(k.sLang==a?'checked="checked"':"")+' value="'+a+'" name="scayt_lang" />');e.on("click",function(){this.$.checked=true;k.chosed_lang=a});d.append(e);d.append(c);return{lang:b[a],code:a,radio:d}};if(1==l[1]){for(c in e.rtl)i[i.length]=d(c,e.ltr);for(c in e.ltr)i[i.length]=d(c, +e.ltr);i.sort(function(a,b){return b.lang>a.lang?-1:1});e=f.getById("scayt_lcol_"+b);d=f.getById("scayt_rcol_"+b);for(c=0;c<i.length;c++)(c<i.length/2?e:d).append(i[c].radio)}var j={dic_create:function(a,b,c){var d=c[0]+","+c[1],e=h.err_dic_create,f=h.succ_dic_create;window.scayt.createUserDictionary(b,function(a){q(d);p(c[1]);f=f.replace("%s",a.dname);o(f)},function(a){e=e.replace("%s",a.dname);n(e+"( "+(a.message||"")+")")})},dic_rename:function(a,b){var c=h.err_dic_rename||"",d=h.succ_dic_rename|| +"";window.scayt.renameUserDictionary(b,function(a){d=d.replace("%s",a.dname);r(b);o(d)},function(a){c=c.replace("%s",a.dname);r(b);n(c+"( "+(a.message||"")+" )")})},dic_delete:function(a,b,c){var d=c[0]+","+c[1],e=h.err_dic_delete,f=h.succ_dic_delete;window.scayt.deleteUserDictionary(function(a){f=f.replace("%s",a.dname);q(d);p(c[0]);r("");o(f)},function(a){e=e.replace("%s",a.dname);n(e)})}};j.dic_restore=k.dic_restore||function(a,b,c){var d=c[0]+","+c[1],e=h.err_dic_restore,f=h.succ_dic_restore; +window.scayt.restoreUserDictionary(b,function(a){f=f.replace("%s",a.dname);q(d);p(c[1]);o(f)},function(a){e=e.replace("%s",a.dname);n(e)})};i=(m[0]+","+m[1]).split(",");c=0;for(e=i.length;c<e;c+=1)if(d=f.getById(i[c]))d.on("click",a,this)},y=function(){var a=this;if(1==l[0])for(var g=w(),e=0,d=g.length;e<d;e++){var h=g[e].id,i=f.getById(h);if(i&&(g[e].checked=!1,1==a.options[h.split("_")[0]]&&(g[e].checked=!0),s))i.on("click",function(){a.options[this.getId().split("_")[0]]=this.$.checked?1:0})}1== +l[1]&&(g=f.getById("cke_option"+a.sLang),x(g.$,a.sLang));u&&(window.scayt.getNameUserDictionary(function(a){a=a.dname;q(m[0]+","+m[1]);if(a){f.getById("dic_name_"+b).setValue(a);p(m[1])}else p(m[0])},function(){f.getById("dic_name_"+b).setValue("")}),o(""))};return B}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/scayt/dialogs/toolbar.css b/theme/bootstrap/plugins/ckeditor/plugins/scayt/dialogs/toolbar.css new file mode 100644 index 0000000..861f43e --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/scayt/dialogs/toolbar.css @@ -0,0 +1,71 @@ +a +{ + text-decoration:none; + padding: 2px 4px 4px 6px; + display : block; + border-width: 1px; + border-style: solid; + margin : 0px; +} + +a.cke_scayt_toogle:hover, +a.cke_scayt_toogle:focus, +a.cke_scayt_toogle:active +{ + border-color: #316ac5; + background-color: #dff1ff; + color : #000; + cursor: pointer; + margin : 0px; +} +a.cke_scayt_toogle { + color : #316ac5; + border-color: #fff; +} +.scayt_enabled a.cke_scayt_item { + color : #316ac5; + border-color: #fff; + margin : 0px; +} +.scayt_disabled a.cke_scayt_item { + color : gray; + border-color : #fff; +} +.scayt_enabled a.cke_scayt_item:hover, +.scayt_enabled a.cke_scayt_item:focus, +.scayt_enabled a.cke_scayt_item:active +{ + border-color: #316ac5; + background-color: #dff1ff; + color : #000; + cursor: pointer; +} +.scayt_disabled a.cke_scayt_item:hover, +.scayt_disabled a.cke_scayt_item:focus, +.scayt_disabled a.cke_scayt_item:active +{ + border-color: gray; + background-color: #dff1ff; + color : gray; + cursor: no-drop; +} +.cke_scayt_set_on, .cke_scayt_set_off +{ + display: none; +} +.scayt_enabled .cke_scayt_set_on +{ + display: none; +} +.scayt_disabled .cke_scayt_set_on +{ + display: inline; +} +.scayt_disabled .cke_scayt_set_off +{ + display: none; +} +.scayt_enabled .cke_scayt_set_off +{ + display: inline; +} diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt new file mode 100644 index 0000000..ba95622 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt @@ -0,0 +1,20 @@ +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license + +cs.js Found: 118 Missing: 0 +cy.js Found: 118 Missing: 0 +de.js Found: 118 Missing: 0 +el.js Found: 16 Missing: 102 +eo.js Found: 118 Missing: 0 +et.js Found: 31 Missing: 87 +fa.js Found: 24 Missing: 94 +fi.js Found: 23 Missing: 95 +fr.js Found: 118 Missing: 0 +hr.js Found: 23 Missing: 95 +it.js Found: 118 Missing: 0 +nb.js Found: 118 Missing: 0 +nl.js Found: 118 Missing: 0 +no.js Found: 118 Missing: 0 +tr.js Found: 118 Missing: 0 +ug.js Found: 39 Missing: 79 +zh-cn.js Found: 118 Missing: 0 diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/ar.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/ar.js new file mode 100644 index 0000000..389f3c2 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/ar.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ar",{euro:"رمز اليورو",lsquo:"علامة تنصيص علي اليسار",rsquo:"علامة تنصيص علي اليمين",ldquo:"علامة تنصيص مزدوجة علي اليسار",rdquo:"علامة تنصيص مزدوجة علي اليمين",ndash:"En dash –",mdash:"Em dash —",iexcl:"علامة تعجب مقلوبة",cent:"رمز سنتيم",pound:"رمز الاسترليني",curren:"رمز العملة",yen:"رمز الين الياباني",brvbar:"خط عمودي مكسور",sect:"رمز الفصيلة",uml:"Diaeresis",copy:"علامة حقوق الطبع",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"ليست علامة",reg:"علامة مسجّلة",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"علامة الإستفهام غير صحيحة",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/bg.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/bg.js new file mode 100644 index 0000000..c68b979 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/bg.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","bg",{euro:"Евро знак",lsquo:"Лява маркировка за цитат",rsquo:"Дясна маркировка за цитат",ldquo:"Лява двойна кавичка за цитат",rdquo:"Дясна двойна кавичка за цитат",ndash:"\\\\",mdash:"/",iexcl:"Обърната питанка",cent:"Знак за цент",pound:"Знак за паунд",curren:"Валутен знак",yen:"Знак за йена",brvbar:"Прекъсната линия",sect:"Знак за секция",uml:"Diaeresis",copy:"Знак за Copyright",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/ca.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/ca.js new file mode 100644 index 0000000..907bb04 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/ca.js @@ -0,0 +1,14 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ca",{euro:"Símbol d'euro",lsquo:"Signe de cometa simple esquerra",rsquo:"Signe de cometa simple dreta",ldquo:"Signe de cometa doble esquerra",rdquo:"Signe de cometa doble dreta",ndash:"Guió",mdash:"Guió baix",iexcl:"Signe d'exclamació inversa",cent:"Símbol de percentatge",pound:"Símbol de lliura",curren:"Símbol de moneda",yen:"Símbol de Yen",brvbar:"Barra trencada",sect:"Símbol de secció",uml:"Dièresi",copy:"Símbol de Copyright",ordf:"Indicador ordinal femení", +laquo:"Signe de cometes angulars esquerra",not:"Símbol de negació",reg:"Símbol registrat",macr:"Macron",deg:"Símbol de grau",sup2:"Superíndex dos",sup3:"Superíndex tres",acute:"Accent agut",micro:"Símbol de micro",para:"Símbol de calderó",middot:"Punt volat",cedil:"Ce trencada",sup1:"Superíndex u",ordm:"Indicador ordinal masculí",raquo:"Signe de cometes angulars dreta",frac14:"Fracció vulgar un quart",frac12:"Fracció vulgar una meitat",frac34:"Fracció vulgar tres quarts",iquest:"Símbol d'interrogació invertit", +Agrave:"Lletra majúscula llatina A amb accent greu",Aacute:"Lletra majúscula llatina A amb accent agut",Acirc:"Lletra majúscula llatina A amb circumflex",Atilde:"Lletra majúscula llatina A amb titlla",Auml:"Lletra majúscula llatina A amb dièresi",Aring:"Lletra majúscula llatina A amb anell superior",AElig:"Lletra majúscula llatina Æ",Ccedil:"Lletra majúscula llatina C amb ce trencada",Egrave:"Lletra majúscula llatina E amb accent greu",Eacute:"Lletra majúscula llatina E amb accent agut",Ecirc:"Lletra majúscula llatina E amb circumflex", +Euml:"Lletra majúscula llatina E amb dièresi",Igrave:"Lletra majúscula llatina I amb accent greu",Iacute:"Lletra majúscula llatina I amb accent agut",Icirc:"Lletra majúscula llatina I amb circumflex",Iuml:"Lletra majúscula llatina I amb dièresi",ETH:"Lletra majúscula llatina Eth",Ntilde:"Lletra majúscula llatina N amb titlla",Ograve:"Lletra majúscula llatina O amb accent greu",Oacute:"Lletra majúscula llatina O amb accent agut",Ocirc:"Lletra majúscula llatina O amb circumflex",Otilde:"Lletra majúscula llatina O amb titlla", +Ouml:"Lletra majúscula llatina O amb dièresi",times:"Símbol de multiplicació",Oslash:"Lletra majúscula llatina O amb barra",Ugrave:"Lletra majúscula llatina U amb accent greu",Uacute:"Lletra majúscula llatina U amb accent agut",Ucirc:"Lletra majúscula llatina U amb circumflex",Uuml:"Lletra majúscula llatina U amb dièresi",Yacute:"Lletra majúscula llatina Y amb accent agut",THORN:"Lletra majúscula llatina Thorn",szlig:"Lletra minúscula llatina sharp s",agrave:"Lletra minúscula llatina a amb accent greu", +aacute:"Lletra minúscula llatina a amb accent agut",acirc:"Lletra minúscula llatina a amb circumflex",atilde:"Lletra minúscula llatina a amb titlla",auml:"Lletra minúscula llatina a amb dièresi",aring:"Lletra minúscula llatina a amb anell superior",aelig:"Lletra minúscula llatina æ",ccedil:"Lletra minúscula llatina c amb ce trencada",egrave:"Lletra minúscula llatina e amb accent greu",eacute:"Lletra minúscula llatina e amb accent agut",ecirc:"Lletra minúscula llatina e amb circumflex",euml:"Lletra minúscula llatina e amb dièresi", +igrave:"Lletra minúscula llatina i amb accent greu",iacute:"Lletra minúscula llatina i amb accent agut",icirc:"Lletra minúscula llatina i amb circumflex",iuml:"Lletra minúscula llatina i amb dièresi",eth:"Lletra minúscula llatina eth",ntilde:"Lletra minúscula llatina n amb titlla",ograve:"Lletra minúscula llatina o amb accent greu",oacute:"Lletra minúscula llatina o amb accent agut",ocirc:"Lletra minúscula llatina o amb circumflex",otilde:"Lletra minúscula llatina o amb titlla",ouml:"Lletra minúscula llatina o amb dièresi", +divide:"Símbol de divisió",oslash:"Lletra minúscula llatina o amb barra",ugrave:"Lletra minúscula llatina u amb accent greu",uacute:"Lletra minúscula llatina u amb accent agut",ucirc:"Lletra minúscula llatina u amb circumflex",uuml:"Lletra minúscula llatina u amb dièresi",yacute:"Lletra minúscula llatina y amb accent agut",thorn:"Lletra minúscula llatina thorn",yuml:"Lletra minúscula llatina y amb dièresi",OElig:"Lligadura majúscula llatina OE",oelig:"Lligadura minúscula llatina oe",372:"Lletra majúscula llatina W amb circumflex", +374:"Lletra majúscula llatina Y amb circumflex",373:"Lletra minúscula llatina w amb circumflex",375:"Lletra minúscula llatina y amb circumflex",sbquo:"Signe de cita simple baixa-9",8219:"Signe de cita simple alta-invertida-9",bdquo:"Signe de cita doble baixa-9",hellip:"Punts suspensius",trade:"Símbol de marca registrada",9658:"Punter negre apuntant cap a la dreta",bull:"Vinyeta",rarr:"Fletxa cap a la dreta",rArr:"Doble fletxa cap a la dreta",hArr:"Doble fletxa esquerra dreta",diams:"Vestit negre diamant", +asymp:"Gairebé igual a"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/cs.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/cs.js new file mode 100644 index 0000000..c9500d6 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/cs.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","cs",{euro:"Znak eura",lsquo:"Počáteční uvozovka jednoduchá",rsquo:"Koncová uvozovka jednoduchá",ldquo:"Počáteční uvozovka dvojitá",rdquo:"Koncová uvozovka dvojitá",ndash:"En pomlčka",mdash:"Em pomlčka",iexcl:"Obrácený vykřičník",cent:"Znak centu",pound:"Znak libry",curren:"Znak měny",yen:"Znak jenu",brvbar:"Přerušená svislá čára",sect:"Znak oddílu",uml:"Přehláska",copy:"Znak copyrightu",ordf:"Ženský indikátor rodu",laquo:"Znak dvojitých lomených uvozovek vlevo", +not:"Logistický zápor",reg:"Znak registrace",macr:"Pomlčka nad",deg:"Znak stupně",sup2:"Dvojka jako horní index",sup3:"Trojka jako horní index",acute:"Čárka nad vpravo",micro:"Znak mikro",para:"Znak odstavce",middot:"Tečka uprostřed",cedil:"Ocásek vlevo",sup1:"Jednička jako horní index",ordm:"Mužský indikátor rodu",raquo:"Znak dvojitých lomených uvozovek vpravo",frac14:"Obyčejný zlomek jedna čtvrtina",frac12:"Obyčejný zlomek jedna polovina",frac34:"Obyčejný zlomek tři čtvrtiny",iquest:"Znak obráceného otazníku", +Agrave:"Velké písmeno latinky A s čárkou nad vlevo",Aacute:"Velké písmeno latinky A s čárkou nad vpravo",Acirc:"Velké písmeno latinky A s vokáněm",Atilde:"Velké písmeno latinky A s tildou",Auml:"Velké písmeno latinky A s dvěma tečkami",Aring:"Velké písmeno latinky A s kroužkem nad",AElig:"Velké písmeno latinky Ae",Ccedil:"Velké písmeno latinky C s ocáskem vlevo",Egrave:"Velké písmeno latinky E s čárkou nad vlevo",Eacute:"Velké písmeno latinky E s čárkou nad vpravo",Ecirc:"Velké písmeno latinky E s vokáněm", +Euml:"Velké písmeno latinky E s dvěma tečkami",Igrave:"Velké písmeno latinky I s čárkou nad vlevo",Iacute:"Velké písmeno latinky I s čárkou nad vpravo",Icirc:"Velké písmeno latinky I s vokáněm",Iuml:"Velké písmeno latinky I s dvěma tečkami",ETH:"Velké písmeno latinky Eth",Ntilde:"Velké písmeno latinky N s tildou",Ograve:"Velké písmeno latinky O s čárkou nad vlevo",Oacute:"Velké písmeno latinky O s čárkou nad vpravo",Ocirc:"Velké písmeno latinky O s vokáněm",Otilde:"Velké písmeno latinky O s tildou", +Ouml:"Velké písmeno latinky O s dvěma tečkami",times:"Znak násobení",Oslash:"Velké písmeno latinky O přeškrtnuté",Ugrave:"Velké písmeno latinky U s čárkou nad vlevo",Uacute:"Velké písmeno latinky U s čárkou nad vpravo",Ucirc:"Velké písmeno latinky U s vokáněm",Uuml:"Velké písmeno latinky U s dvěma tečkami",Yacute:"Velké písmeno latinky Y s čárkou nad vpravo",THORN:"Velké písmeno latinky Thorn",szlig:"Malé písmeno latinky ostré s",agrave:"Malé písmeno latinky a s čárkou nad vlevo",aacute:"Malé písmeno latinky a s čárkou nad vpravo", +acirc:"Malé písmeno latinky a s vokáněm",atilde:"Malé písmeno latinky a s tildou",auml:"Malé písmeno latinky a s dvěma tečkami",aring:"Malé písmeno latinky a s kroužkem nad",aelig:"Malé písmeno latinky ae",ccedil:"Malé písmeno latinky c s ocáskem vlevo",egrave:"Malé písmeno latinky e s čárkou nad vlevo",eacute:"Malé písmeno latinky e s čárkou nad vpravo",ecirc:"Malé písmeno latinky e s vokáněm",euml:"Malé písmeno latinky e s dvěma tečkami",igrave:"Malé písmeno latinky i s čárkou nad vlevo",iacute:"Malé písmeno latinky i s čárkou nad vpravo", +icirc:"Malé písmeno latinky i s vokáněm",iuml:"Malé písmeno latinky i s dvěma tečkami",eth:"Malé písmeno latinky eth",ntilde:"Malé písmeno latinky n s tildou",ograve:"Malé písmeno latinky o s čárkou nad vlevo",oacute:"Malé písmeno latinky o s čárkou nad vpravo",ocirc:"Malé písmeno latinky o s vokáněm",otilde:"Malé písmeno latinky o s tildou",ouml:"Malé písmeno latinky o s dvěma tečkami",divide:"Znak dělení",oslash:"Malé písmeno latinky o přeškrtnuté",ugrave:"Malé písmeno latinky u s čárkou nad vlevo", +uacute:"Malé písmeno latinky u s čárkou nad vpravo",ucirc:"Malé písmeno latinky u s vokáněm",uuml:"Malé písmeno latinky u s dvěma tečkami",yacute:"Malé písmeno latinky y s čárkou nad vpravo",thorn:"Malé písmeno latinky thorn",yuml:"Malé písmeno latinky y s dvěma tečkami",OElig:"Velká ligatura latinky OE",oelig:"Malá ligatura latinky OE",372:"Velké písmeno latinky W s vokáněm",374:"Velké písmeno latinky Y s vokáněm",373:"Malé písmeno latinky w s vokáněm",375:"Malé písmeno latinky y s vokáněm",sbquo:"Dolní 9 uvozovka jednoduchá", +8219:"Horní obrácená 9 uvozovka jednoduchá",bdquo:"Dolní 9 uvozovka dvojitá",hellip:"Trojtečkový úvod",trade:"Obchodní značka",9658:"Černý ukazatel směřující vpravo",bull:"Kolečko",rarr:"Šipka vpravo",rArr:"Dvojitá šipka vpravo",hArr:"Dvojitá šipka vlevo a vpravo",diams:"Černé piky",asymp:"Téměř se rovná"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/cy.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/cy.js new file mode 100644 index 0000000..36a074f --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/cy.js @@ -0,0 +1,14 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","cy",{euro:"Arwydd yr Ewro",lsquo:"Dyfynnod chwith unigol",rsquo:"Dyfynnod dde unigol",ldquo:"Dyfynnod chwith dwbl",rdquo:"Dyfynnod dde dwbl",ndash:"Cysylltnod en",mdash:"Cysylltnod em",iexcl:"Ebychnod gwrthdro",cent:"Arwydd sent",pound:"Arwydd punt",curren:"Arwydd arian cyfred",yen:"Arwydd yen",brvbar:"Bar toriedig",sect:"Arwydd adran",uml:"Didolnod",copy:"Arwydd hawlfraint",ordf:"Dangosydd benywaidd",laquo:"Dyfynnod dwbl ar ongl i'r chwith",not:"Arwydd Nid", +reg:"Arwydd cofrestredig",macr:"Macron",deg:"Arwydd gradd",sup2:"Dau uwchsgript",sup3:"Tri uwchsgript",acute:"Acen ddyrchafedig",micro:"Arwydd micro",para:"Arwydd pilcrow",middot:"Dot canol",cedil:"Sedila",sup1:"Un uwchsgript",ordm:"Dangosydd gwrywaidd",raquo:"Dyfynnod dwbl ar ongl i'r dde",frac14:"Ffracsiwn cyffredin un cwarter",frac12:"Ffracsiwn cyffredin un hanner",frac34:"Ffracsiwn cyffredin tri chwarter",iquest:"Marc cwestiwn gwrthdroëdig",Agrave:"Priflythyren A Lladinaidd gydag acen ddisgynedig", +Aacute:"Priflythyren A Lladinaidd gydag acen ddyrchafedig",Acirc:"Priflythyren A Lladinaidd gydag acen grom",Atilde:"Priflythyren A Lladinaidd gyda thild",Auml:"Priflythyren A Lladinaidd gyda didolnod",Aring:"Priflythyren A Lladinaidd gyda chylch uwchben",AElig:"Priflythyren Æ Lladinaidd",Ccedil:"Priflythyren C Lladinaidd gyda sedila",Egrave:"Priflythyren E Lladinaidd gydag acen ddisgynedig",Eacute:"Priflythyren E Lladinaidd gydag acen ddyrchafedig",Ecirc:"Priflythyren E Lladinaidd gydag acen grom", +Euml:"Priflythyren E Lladinaidd gyda didolnod",Igrave:"Priflythyren I Lladinaidd gydag acen ddisgynedig",Iacute:"Priflythyren I Lladinaidd gydag acen ddyrchafedig",Icirc:"Priflythyren I Lladinaidd gydag acen grom",Iuml:"Priflythyren I Lladinaidd gyda didolnod",ETH:"Priflythyren Eth",Ntilde:"Priflythyren N Lladinaidd gyda thild",Ograve:"Priflythyren O Lladinaidd gydag acen ddisgynedig",Oacute:"Priflythyren O Lladinaidd gydag acen ddyrchafedig",Ocirc:"Priflythyren O Lladinaidd gydag acen grom",Otilde:"Priflythyren O Lladinaidd gyda thild", +Ouml:"Priflythyren O Lladinaidd gyda didolnod",times:"Arwydd lluosi",Oslash:"Priflythyren O Lladinaidd gyda strôc",Ugrave:"Priflythyren U Lladinaidd gydag acen ddisgynedig",Uacute:"Priflythyren U Lladinaidd gydag acen ddyrchafedig",Ucirc:"Priflythyren U Lladinaidd gydag acen grom",Uuml:"Priflythyren U Lladinaidd gyda didolnod",Yacute:"Priflythyren Y Lladinaidd gydag acen ddyrchafedig",THORN:"Priflythyren Thorn",szlig:"Llythyren s fach Lladinaidd siarp ",agrave:"Llythyren a fach Lladinaidd gydag acen ddisgynedig", +aacute:"Llythyren a fach Lladinaidd gydag acen ddyrchafedig",acirc:"Llythyren a fach Lladinaidd gydag acen grom",atilde:"Llythyren a fach Lladinaidd gyda thild",auml:"Llythyren a fach Lladinaidd gyda didolnod",aring:"Llythyren a fach Lladinaidd gyda chylch uwchben",aelig:"Llythyren æ fach Lladinaidd",ccedil:"Llythyren c fach Lladinaidd gyda sedila",egrave:"Llythyren e fach Lladinaidd gydag acen ddisgynedig",eacute:"Llythyren e fach Lladinaidd gydag acen ddyrchafedig",ecirc:"Llythyren e fach Lladinaidd gydag acen grom", +euml:"Llythyren e fach Lladinaidd gyda didolnod",igrave:"Llythyren i fach Lladinaidd gydag acen ddisgynedig",iacute:"Llythyren i fach Lladinaidd gydag acen ddyrchafedig",icirc:"Llythyren i fach Lladinaidd gydag acen grom",iuml:"Llythyren i fach Lladinaidd gyda didolnod",eth:"Llythyren eth fach",ntilde:"Llythyren n fach Lladinaidd gyda thild",ograve:"Llythyren o fach Lladinaidd gydag acen ddisgynedig",oacute:"Llythyren o fach Lladinaidd gydag acen ddyrchafedig",ocirc:"Llythyren o fach Lladinaidd gydag acen grom", +otilde:"Llythyren o fach Lladinaidd gyda thild",ouml:"Llythyren o fach Lladinaidd gyda didolnod",divide:"Arwydd rhannu",oslash:"Llythyren o fach Lladinaidd gyda strôc",ugrave:"Llythyren u fach Lladinaidd gydag acen ddisgynedig",uacute:"Llythyren u fach Lladinaidd gydag acen ddyrchafedig",ucirc:"Llythyren u fach Lladinaidd gydag acen grom",uuml:"Llythyren u fach Lladinaidd gyda didolnod",yacute:"Llythyren y fach Lladinaidd gydag acen ddisgynedig",thorn:"Llythyren o fach Lladinaidd gyda strôc",yuml:"Llythyren y fach Lladinaidd gyda didolnod", +OElig:"Priflythyren cwlwm OE Lladinaidd ",oelig:"Priflythyren cwlwm oe Lladinaidd ",372:"Priflythyren W gydag acen grom",374:"Priflythyren Y gydag acen grom",373:"Llythyren w fach gydag acen grom",375:"Llythyren y fach gydag acen grom",sbquo:"Dyfynnod sengl 9-isel",8219:"Dyfynnod sengl 9-uchel cildro",bdquo:"Dyfynnod dwbl 9-isel",hellip:"Coll geiriau llorweddol",trade:"Arwydd marc masnachol",9658:"Pwyntydd du i'r dde",bull:"Bwled",rarr:"Saeth i'r dde",rArr:"Saeth ddwbl i'r dde",hArr:"Saeth ddwbl i'r chwith", +diams:"Siwt diemwnt du",asymp:"Bron yn hafal iddo"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/de.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/de.js new file mode 100644 index 0000000..73325db --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/de.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","de",{euro:"Euro Zeichen",lsquo:"Hochkomma links",rsquo:"Hochkomma rechts",ldquo:"Anführungszeichen links",rdquo:"Anführungszeichen rechts",ndash:"kleiner Strich",mdash:"mittlerer Strich",iexcl:"invertiertes Ausrufezeichen",cent:"Cent",pound:"Pfund",curren:"Währung",yen:"Yen",brvbar:"gestrichelte Linie",sect:"§ Zeichen",uml:"Diäresis",copy:"Copyright",ordf:"Feminine ordinal Anzeige",laquo:"Nach links zeigenden Doppel-Winkel Anführungszeichen",not:"Not-Zeichen", +reg:"Registriert",macr:"Längezeichen",deg:"Grad",sup2:"Hoch 2",sup3:"Hoch 3",acute:"Akzentzeichen ",micro:"Micro",para:"Pilcrow-Zeichen",middot:"Mittelpunkt",cedil:"Cedilla",sup1:"Hoch 1",ordm:"Männliche Ordnungszahl Anzeige",raquo:"Nach rechts zeigenden Doppel-Winkel Anführungszeichen",frac14:"ein Viertel",frac12:"Hälfte",frac34:"Dreiviertel",iquest:"Umgekehrtes Fragezeichen",Agrave:"Lateinischer Buchstabe A mit AkzentGrave",Aacute:"Lateinischer Buchstabe A mit Akutakzent",Acirc:"Lateinischer Buchstabe A mit Zirkumflex", +Atilde:"Lateinischer Buchstabe A mit Tilde",Auml:"Lateinischer Buchstabe A mit Trema",Aring:"Lateinischer Buchstabe A mit Ring oben",AElig:"Lateinischer Buchstabe Æ",Ccedil:"Lateinischer Buchstabe C mit Cedille",Egrave:"Lateinischer Buchstabe E mit AkzentGrave",Eacute:"Lateinischer Buchstabe E mit Akutakzent",Ecirc:"Lateinischer Buchstabe E mit Zirkumflex",Euml:"Lateinischer Buchstabe E Trema",Igrave:"Lateinischer Buchstabe I mit AkzentGrave",Iacute:"Lateinischer Buchstabe I mit Akutakzent",Icirc:"Lateinischer Buchstabe I mit Zirkumflex", +Iuml:"Lateinischer Buchstabe I mit Trema",ETH:"Lateinischer Buchstabe Eth",Ntilde:"Lateinischer Buchstabe N mit Tilde",Ograve:"Lateinischer Buchstabe O mit AkzentGrave",Oacute:"Lateinischer Buchstabe O mit Akutakzent",Ocirc:"Lateinischer Buchstabe O mit Zirkumflex",Otilde:"Lateinischer Buchstabe O mit Tilde",Ouml:"Lateinischer Buchstabe O mit Trema",times:"Multiplikation",Oslash:"Lateinischer Buchstabe O durchgestrichen",Ugrave:"Lateinischer Buchstabe U mit Akzentgrave",Uacute:"Lateinischer Buchstabe U mit Akutakzent", +Ucirc:"Lateinischer Buchstabe U mit Zirkumflex",Uuml:"Lateinischer Buchstabe a mit Trema",Yacute:"Lateinischer Buchstabe a mit Akzent",THORN:"Lateinischer Buchstabe mit Dorn",szlig:"Kleiner lateinischer Buchstabe scharfe s",agrave:"Kleiner lateinischer Buchstabe a mit Accent grave",aacute:"Kleiner lateinischer Buchstabe a mit Akut",acirc:"Lateinischer Buchstabe a mit Zirkumflex",atilde:"Lateinischer Buchstabe a mit Tilde",auml:"Kleiner lateinischer Buchstabe a mit Trema",aring:"Kleiner lateinischer Buchstabe a mit Ring oben", +aelig:"Lateinischer Buchstabe æ",ccedil:"Kleiner lateinischer Buchstabe c mit Cedille",egrave:"Kleiner lateinischer Buchstabe e mit Accent grave",eacute:"Kleiner lateinischer Buchstabe e mit Akut",ecirc:"Kleiner lateinischer Buchstabe e mit Zirkumflex",euml:"Kleiner lateinischer Buchstabe e mit Trema",igrave:"Kleiner lateinischer Buchstabe i mit AkzentGrave",iacute:"Kleiner lateinischer Buchstabe i mit Akzent",icirc:"Kleiner lateinischer Buchstabe i mit Zirkumflex",iuml:"Kleiner lateinischer Buchstabe i mit Trema", +eth:"Kleiner lateinischer Buchstabe eth",ntilde:"Kleiner lateinischer Buchstabe n mit Tilde",ograve:"Kleiner lateinischer Buchstabe o mit Accent grave",oacute:"Kleiner lateinischer Buchstabe o mit Akzent",ocirc:"Kleiner lateinischer Buchstabe o mit Zirkumflex",otilde:"Lateinischer Buchstabe i mit Tilde",ouml:"Kleiner lateinischer Buchstabe o mit Trema",divide:"Divisionszeichen",oslash:"Kleiner lateinischer Buchstabe o durchgestrichen",ugrave:"Kleiner lateinischer Buchstabe u mit Accent grave",uacute:"Kleiner lateinischer Buchstabe u mit Akut", +ucirc:"Kleiner lateinischer Buchstabe u mit Zirkumflex",uuml:"Kleiner lateinischer Buchstabe u mit Trema",yacute:"Kleiner lateinischer Buchstabe y mit Akut",thorn:"Kleiner lateinischer Buchstabe Dorn",yuml:"Kleiner lateinischer Buchstabe y mit Trema",OElig:"Lateinischer Buchstabe Ligatur OE",oelig:"Kleiner lateinischer Buchstabe Ligatur OE",372:"Lateinischer Buchstabe W mit Zirkumflex",374:"Lateinischer Buchstabe Y mit Zirkumflex",373:"Kleiner lateinischer Buchstabe w mit Zirkumflex",375:"Kleiner lateinischer Buchstabe y mit Zirkumflex", +sbquo:"Tiefergestelltes Komma",8219:"Rumgedrehtes Komma",bdquo:"Doppeltes Anführungszeichen unten",hellip:"horizontale Auslassungspunkte",trade:"Handelszeichen",9658:"Dreickspfeil rechts",bull:"Bullet",rarr:"Pfeil rechts",rArr:"Doppelpfeil rechts",hArr:"Doppelpfeil links",diams:"Karo",asymp:"Ungefähr"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/el.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/el.js new file mode 100644 index 0000000..70f90d9 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/el.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","el",{euro:"Σύμβολο Ευρώ",lsquo:"Αριστερός χαρακτήρας μονού εισαγωγικού",rsquo:"Δεξιός χαρακτήρας μονού εισαγωγικού",ldquo:"Αριστερός χαρακτήρας διπλού εισαγωγικού",rdquo:"Δεξιός χαρακτήρας διπλού εισαγωγικού",ndash:"Παύλα en",mdash:"Παύλα em",iexcl:"Ανάποδο θαυμαστικό",cent:"Σύμβολο σεντ",pound:"Σύμβολο λίρας",curren:"Σύμβολο συναλλαγματικής μονάδας",yen:"Σύμβολο Γιεν",brvbar:"Σπασμένη μπάρα",sect:"Σύμβολο τμήματος",uml:"Διαίρεση",copy:"Σύμβολο πνευματικών δικαιωμάτων", +ordf:"Feminine ordinal indicator",laquo:"Αριστερός χαρακτήρας διπλού εισαγωγικού",not:"Not sign",reg:"Σύμβολο σημάτων κατατεθέν",macr:"Μακρόν",deg:"Σύμβολο βαθμού",sup2:"Εκτεθειμένο δύο",sup3:"Εκτεθειμένο τρία",acute:"Οξεία",micro:"Σύμβολο μικρού",para:"Σύμβολο παραγράφου",middot:"Μέση τελεία",cedil:"Υπογεγραμμένη",sup1:"Εκτεθειμένο ένα",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Γνήσιο κλάσμα ενός τετάρτου",frac12:"Γνήσιο κλάσμα ενός δεύτερου",frac34:"Γνήσιο κλάσμα τριών τετάρτων", +iquest:"Ανάποδο θαυμαστικό",Agrave:"Λατινικό κεφαλαίο γράμμα A με βαρεία",Aacute:"Λατινικό κεφαλαίο γράμμα A με οξεία",Acirc:"Λατινικό κεφαλαίο γράμμα A με περισπωμένη",Atilde:"Λατινικό κεφαλαίο γράμμα A με περισπωμένη",Auml:"Λατινικό κεφαλαίο γράμμα A με διαλυτικά",Aring:"Λατινικό κεφαλαίο γράμμα A με δακτύλιο επάνω",AElig:"Λατινικό κεφαλαίο γράμμα Æ",Ccedil:"Λατινικό κεφαλαίο γράμμα C με υπογεγραμμένη",Egrave:"Λατινικό κεφαλαίο γράμμα E με βαρεία",Eacute:"Λατινικό κεφαλαίο γράμμα E με οξεία",Ecirc:"Λατινικό κεφαλαίο γράμμα Ε με περισπωμένη ", +Euml:"Λατινικό κεφαλαίο γράμμα Ε με διαλυτικά",Igrave:"Λατινικό κεφαλαίο γράμμα I με βαρεία",Iacute:"Λατινικό κεφαλαίο γράμμα I με οξεία",Icirc:"Λατινικό κεφαλαίο γράμμα I με περισπωμένη",Iuml:"Λατινικό κεφαλαίο γράμμα I με διαλυτικά ",ETH:"Λατινικό κεφαλαίο γράμμα Eth",Ntilde:"Λατινικό κεφαλαίο γράμμα N με περισπωμένη",Ograve:"Λατινικό κεφαλαίο γράμμα O με βαρεία",Oacute:"Λατινικό κεφαλαίο γράμμα O με οξεία",Ocirc:"Λατινικό κεφαλαίο γράμμα O με περισπωμένη ",Otilde:"Λατινικό κεφαλαίο γράμμα O με περισπωμένη", +Ouml:"Λατινικό κεφαλαίο γράμμα O με διαλυτικά",times:"Σύμβολο πολλαπλασιασμού",Oslash:"Λατινικό κεφαλαίο γράμμα O με μολυβιά",Ugrave:"Λατινικό κεφαλαίο γράμμα U με βαρεία",Uacute:"Λατινικό κεφαλαίο γράμμα U με οξεία",Ucirc:"Λατινικό κεφαλαίο γράμμα U με περισπωμένη",Uuml:"Λατινικό κεφαλαίο γράμμα U με διαλυτικά",Yacute:"Λατινικό κεφαλαίο γράμμα Y με οξεία",THORN:"Λατινικό κεφαλαίο γράμμα Thorn",szlig:"Λατινικό μικρό γράμμα απότομο s",agrave:"Λατινικό μικρό γράμμα a με βαρεία",aacute:"Λατινικό μικρό γράμμα a με οξεία", +acirc:"Λατινικό μικρό γράμμα a με περισπωμένη",atilde:"Λατινικό μικρό γράμμα a με περισπωμένη",auml:"Λατινικό μικρό γράμμα a με διαλυτικά",aring:"Λατινικό μικρό γράμμα a με δακτύλιο πάνω",aelig:"Λατινικό μικρό γράμμα æ",ccedil:"Λατινικό μικρό γράμμα c με υπογεγραμμένη",egrave:"Λατινικό μικρό γράμμα ε με βαρεία",eacute:"Λατινικό μικρό γράμμα e με οξεία",ecirc:"Λατινικό μικρό γράμμα e με περισπωμένη",euml:"Λατινικό μικρό γράμμα e με διαλυτικά",igrave:"Λατινικό μικρό γράμμα i με βαρεία",iacute:"Λατινικό μικρό γράμμα i με οξεία", +icirc:"Λατινικό μικρό γράμμα i με περισπωμένη",iuml:"Λατινικό μικρό γράμμα i με διαλυτικά",eth:"Λατινικό μικρό γράμμα eth",ntilde:"Λατινικό μικρό γράμμα n με περισπωμένη",ograve:"Λατινικό μικρό γράμμα o με βαρεία",oacute:"Λατινικό μικρό γράμμα o με οξεία ",ocirc:"Λατινικό πεζό γράμμα o με περισπωμένη",otilde:"Λατινικό μικρό γράμμα o με περισπωμένη ",ouml:"Λατινικό μικρό γράμμα o με διαλυτικά",divide:"Σύμβολο διαίρεσης",oslash:"Λατινικό μικρό γράμμα o με περισπωμένη",ugrave:"Λατινικό μικρό γράμμα u με βαρεία", +uacute:"Λατινικό μικρό γράμμα u με οξεία",ucirc:"Λατινικό μικρό γράμμα u με περισπωμένη",uuml:"Λατινικό μικρό γράμμα u με διαλυτικά",yacute:"Λατινικό μικρό γράμμα y με οξεία",thorn:"Λατινικό μικρό γράμμα thorn",yuml:"Λατινικό μικρό γράμμα y με διαλυτικά",OElig:"Λατινικό κεφαλαίο σύμπλεγμα ΟΕ",oelig:"Λατινικό μικρό σύμπλεγμα oe",372:"Λατινικό κεφαλαίο γράμμα W με περισπωμένη",374:"Λατινικό κεφαλαίο γράμμα Y με περισπωμένη",373:"Λατινικό μικρό γράμμα w με περισπωμένη",375:"Λατινικό μικρό γράμμα y με περισπωμένη", +sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Οριζόντια αποσιωπητικά",trade:"Σύμβολο εμπορικού κατατεθέν",9658:"Μαύρος δείκτης που δείχνει προς τα δεξιά",bull:"Κουκκίδα",rarr:"Δεξί βελάκι",rArr:"Διπλό δεξί βελάκι",hArr:"Διπλό βελάκι αριστερά-δεξιά",diams:"Μαύρο διαμάντι",asymp:"Σχεδόν ίσο με"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/en.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/en.js new file mode 100644 index 0000000..c973e03 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/en.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","en",{euro:"Euro sign",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"Currency sign",yen:"Yen sign",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/eo.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/eo.js new file mode 100644 index 0000000..f937dc0 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/eo.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","eo",{euro:"Eŭrosigno",lsquo:"Supra 6-citilo",rsquo:"Supra 9-citilo",ldquo:"Supra 66-citilo",rdquo:"Supra 99-citilo",ndash:"Streketo",mdash:"Substreko",iexcl:"Renversita krisigno",cent:"Cendosigno",pound:"Pundosigno",curren:"Monersigno",yen:"Enosigno",brvbar:"Rompita vertikala streko",sect:"Kurba paragrafo",uml:"Tremao",copy:"Kopirajtosigno",ordf:"Adjektiva numerfinaĵo",laquo:"Duobla malplio-citilo",not:"Negohoko",reg:"Registrita marko",macr:"Superstreko",deg:"Gradosigno", +sup2:"Supra indico 2",sup3:"Supra indico 3",acute:"Dekstra korno",micro:"Mikrosigno",para:"Rekta paragrafo",middot:"Meza punkto",cedil:"Zoeto",sup1:"Supra indico 1",ordm:"Substantiva numerfinaĵo",raquo:"Duobla plio-citilo",frac14:"Kvaronosigno",frac12:"Duonosigno",frac34:"Trikvaronosigno",iquest:"renversita demandosigno",Agrave:"Latina ĉeflitero A kun liva korno",Aacute:"Latina ĉeflitero A kun dekstra korno",Acirc:"Latina ĉeflitero A kun ĉapelo",Atilde:"Latina ĉeflitero A kun tildo",Auml:"Latina ĉeflitero A kun tremao", +Aring:"Latina ĉeflitero A kun superringo",AElig:"Latina ĉeflitera ligaturo Æ",Ccedil:"Latina ĉeflitero C kun zoeto",Egrave:"Latina ĉeflitero E kun liva korno",Eacute:"Latina ĉeflitero E kun dekstra korno",Ecirc:"Latina ĉeflitero E kun ĉapelo",Euml:"Latina ĉeflitero E kun tremao",Igrave:"Latina ĉeflitero I kun liva korno",Iacute:"Latina ĉeflitero I kun dekstra korno",Icirc:"Latina ĉeflitero I kun ĉapelo",Iuml:"Latina ĉeflitero I kun tremao",ETH:"Latina ĉeflitero islanda edo",Ntilde:"Latina ĉeflitero N kun tildo", +Ograve:"Latina ĉeflitero O kun liva korno",Oacute:"Latina ĉeflitero O kun dekstra korno",Ocirc:"Latina ĉeflitero O kun ĉapelo",Otilde:"Latina ĉeflitero O kun tildo",Ouml:"Latina ĉeflitero O kun tremao",times:"Multipliko",Oslash:"Latina ĉeflitero O trastrekita",Ugrave:"Latina ĉeflitero U kun liva korno",Uacute:"Latina ĉeflitero U kun dekstra korno",Ucirc:"Latina ĉeflitero U kun ĉapelo",Uuml:"Latina ĉeflitero U kun tremao",Yacute:"Latina ĉeflitero Y kun dekstra korno",THORN:"Latina ĉeflitero islanda dorno", +szlig:"Latina etlitero germana sozo (akra s)",agrave:"Latina etlitero a kun liva korno",aacute:"Latina etlitero a kun dekstra korno",acirc:"Latina etlitero a kun ĉapelo",atilde:"Latina etlitero a kun tildo",auml:"Latina etlitero a kun tremao",aring:"Latina etlitero a kun superringo",aelig:"Latina etlitera ligaturo æ",ccedil:"Latina etlitero c kun zoeto",egrave:"Latina etlitero e kun liva korno",eacute:"Latina etlitero e kun dekstra korno",ecirc:"Latina etlitero e kun ĉapelo",euml:"Latina etlitero e kun tremao", +igrave:"Latina etlitero i kun liva korno",iacute:"Latina etlitero i kun dekstra korno",icirc:"Latina etlitero i kun ĉapelo",iuml:"Latina etlitero i kun tremao",eth:"Latina etlitero islanda edo",ntilde:"Latina etlitero n kun tildo",ograve:"Latina etlitero o kun liva korno",oacute:"Latina etlitero o kun dekstra korno",ocirc:"Latina etlitero o kun ĉapelo",otilde:"Latina etlitero o kun tildo",ouml:"Latina etlitero o kun tremao",divide:"Dividosigno",oslash:"Latina etlitero o trastrekita",ugrave:"Latina etlitero u kun liva korno", +uacute:"Latina etlitero u kun dekstra korno",ucirc:"Latina etlitero u kun ĉapelo",uuml:"Latina etlitero u kun tremao",yacute:"Latina etlitero y kun dekstra korno",thorn:"Latina etlitero islanda dorno",yuml:"Latina etlitero y kun tremao",OElig:"Latina ĉeflitera ligaturo Œ",oelig:"Latina etlitera ligaturo œ",372:"Latina ĉeflitero W kun ĉapelo",374:"Latina ĉeflitero Y kun ĉapelo",373:"Latina etlitero w kun ĉapelo",375:"Latina etlitero y kun ĉapelo",sbquo:"Suba 9-citilo",8219:"Supra renversita 9-citilo", +bdquo:"Suba 99-citilo",hellip:"Tripunkto",trade:"Varmarka signo",9658:"Nigra sago dekstren",bull:"Bulmarko",rarr:"Sago dekstren",rArr:"Duobla sago dekstren",hArr:"Duobla sago maldekstren",diams:"Nigra kvadrato",asymp:"Preskaŭ egala"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/es.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/es.js new file mode 100644 index 0000000..b1254c9 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/es.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","es",{euro:"Símbolo de euro",lsquo:"Comilla simple izquierda",rsquo:"Comilla simple derecha",ldquo:"Comilla doble izquierda",rdquo:"Comilla doble derecha",ndash:"Guión corto",mdash:"Guión medio largo",iexcl:"Signo de admiración invertido",cent:"Símbolo centavo",pound:"Símbolo libra",curren:"Símbolo moneda",yen:"Símbolo yen",brvbar:"Barra vertical rota",sect:"Símbolo sección",uml:"Diéresis",copy:"Signo de derechos de autor",ordf:"Indicador ordinal femenino",laquo:"Abre comillas angulares", +not:"Signo negación",reg:"Signo de marca registrada",macr:"Guión alto",deg:"Signo de grado",sup2:"Superíndice dos",sup3:"Superíndice tres",acute:"Acento agudo",micro:"Signo micro",para:"Signo de pi",middot:"Punto medio",cedil:"Cedilla",sup1:"Superíndice uno",ordm:"Indicador orginal masculino",raquo:"Cierra comillas angulares",frac14:"Fracción ordinaria de un quarto",frac12:"Fracción ordinaria de una mitad",frac34:"Fracción ordinaria de tres cuartos",iquest:"Signo de interrogación invertido",Agrave:"Letra A latina mayúscula con acento grave", +Aacute:"Letra A latina mayúscula con acento agudo",Acirc:"Letra A latina mayúscula con acento circunflejo",Atilde:"Letra A latina mayúscula con tilde",Auml:"Letra A latina mayúscula con diéresis",Aring:"Letra A latina mayúscula con aro arriba",AElig:"Letra Æ latina mayúscula",Ccedil:"Letra C latina mayúscula con cedilla",Egrave:"Letra E latina mayúscula con acento grave",Eacute:"Letra E latina mayúscula con acento agudo",Ecirc:"Letra E latina mayúscula con acento circunflejo",Euml:"Letra E latina mayúscula con diéresis", +Igrave:"Letra I latina mayúscula con acento grave",Iacute:"Letra I latina mayúscula con acento agudo",Icirc:"Letra I latina mayúscula con acento circunflejo",Iuml:"Letra I latina mayúscula con diéresis",ETH:"Letra Eth latina mayúscula",Ntilde:"Letra N latina mayúscula con tilde",Ograve:"Letra O latina mayúscula con acento grave",Oacute:"Letra O latina mayúscula con acento agudo",Ocirc:"Letra O latina mayúscula con acento circunflejo",Otilde:"Letra O latina mayúscula con tilde",Ouml:"Letra O latina mayúscula con diéresis", +times:"Signo de multiplicación",Oslash:"Letra O latina mayúscula con barra inclinada",Ugrave:"Letra U latina mayúscula con acento grave",Uacute:"Letra U latina mayúscula con acento agudo",Ucirc:"Letra U latina mayúscula con acento circunflejo",Uuml:"Letra U latina mayúscula con diéresis",Yacute:"Letra Y latina mayúscula con acento agudo",THORN:"Letra Thorn latina mayúscula",szlig:"Letra s latina fuerte pequeña",agrave:"Letra a latina pequeña con acento grave",aacute:"Letra a latina pequeña con acento agudo", +acirc:"Letra a latina pequeña con acento circunflejo",atilde:"Letra a latina pequeña con tilde",auml:"Letra a latina pequeña con diéresis",aring:"Letra a latina pequeña con aro arriba",aelig:"Letra æ latina pequeña",ccedil:"Letra c latina pequeña con cedilla",egrave:"Letra e latina pequeña con acento grave",eacute:"Letra e latina pequeña con acento agudo",ecirc:"Letra e latina pequeña con acento circunflejo",euml:"Letra e latina pequeña con diéresis",igrave:"Letra i latina pequeña con acento grave", +iacute:"Letra i latina pequeña con acento agudo",icirc:"Letra i latina pequeña con acento circunflejo",iuml:"Letra i latina pequeña con diéresis",eth:"Letra eth latina pequeña",ntilde:"Letra n latina pequeña con tilde",ograve:"Letra o latina pequeña con acento grave",oacute:"Letra o latina pequeña con acento agudo",ocirc:"Letra o latina pequeña con acento circunflejo",otilde:"Letra o latina pequeña con tilde",ouml:"Letra o latina pequeña con diéresis",divide:"Signo de división",oslash:"Letra o latina minúscula con barra inclinada", +ugrave:"Letra u latina pequeña con acento grave",uacute:"Letra u latina pequeña con acento agudo",ucirc:"Letra u latina pequeña con acento circunflejo",uuml:"Letra u latina pequeña con diéresis",yacute:"Letra u latina pequeña con acento agudo",thorn:"Letra thorn latina minúscula",yuml:"Letra y latina pequeña con diéresis",OElig:"Diptongo OE latino en mayúscula",oelig:"Diptongo oe latino en minúscula",372:"Letra W latina mayúscula con acento circunflejo",374:"Letra Y latina mayúscula con acento circunflejo", +373:"Letra w latina pequeña con acento circunflejo",375:"Letra y latina pequeña con acento circunflejo",sbquo:"Comilla simple baja-9",8219:"Comilla simple alta invertida-9",bdquo:"Comillas dobles bajas-9",hellip:"Puntos suspensivos horizontales",trade:"Signo de marca registrada",9658:"Apuntador negro apuntando a la derecha",bull:"Viñeta",rarr:"Flecha a la derecha",rArr:"Flecha doble a la derecha",hArr:"Flecha izquierda derecha doble",diams:"Diamante negro",asymp:"Casi igual a"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/et.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/et.js new file mode 100644 index 0000000..d6e875e --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/et.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","et",{euro:"Euromärk",lsquo:"Alustav ühekordne jutumärk",rsquo:"Lõpetav ühekordne jutumärk",ldquo:"Alustav kahekordne jutumärk",rdquo:"Lõpetav kahekordne jutumärk",ndash:"Enn-kriips",mdash:"Emm-kriips",iexcl:"Pööratud hüüumärk",cent:"Sendimärk",pound:"Naela märk",curren:"Valuutamärk",yen:"Jeeni märk",brvbar:"Katkestatud kriips",sect:"Lõigu märk",uml:"Täpid",copy:"Autoriõiguse märk",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Ei-märk",reg:"Registered sign",macr:"Macron",deg:"Kraadimärk",sup2:"Ülaindeks kaks",sup3:"Ülaindeks kolm",acute:"Acute accent",micro:"Mikro-märk",para:"Pilcrow sign",middot:"Keskpunkt",cedil:"Cedilla",sup1:"Ülaindeks üks",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Ladina suur A tildega",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Täppidega ladina suur O",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Kandilise katusega suur ladina U",Uuml:"Täppidega ladina suur U",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Ladina väike terav s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Kandilise katusega ladina väike a",atilde:"Tildega ladina väike a",auml:"Täppidega ladina väike a",aring:"Latin small letter a with ring above", +aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde", +ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Jagamismärk",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent", +thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Kaubamärgi märk",9658:"Black right-pointing pointer", +bull:"Kuul",rarr:"Nool paremale",rArr:"Topeltnool paremale",hArr:"Topeltnool vasakule",diams:"Black diamond suit",asymp:"Ligikaudu võrdne"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/fa.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/fa.js new file mode 100644 index 0000000..b32ff77 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/fa.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","fa",{euro:"نشان یورو",lsquo:"علامت نقل قول تکی چپ",rsquo:"علامت نقل قول تکی راست",ldquo:"علامت نقل قول دوتایی چپ",rdquo:"علامت نقل قول دوتایی راست",ndash:"خط تیره En",mdash:"خط تیره Em",iexcl:"علامت تعجب وارونه",cent:"نشان سنت",pound:"نشان پوند",curren:"نشان ارز",yen:"نشان ین",brvbar:"نوار شکسته",sect:"نشان بخش",uml:"نشان سواگیری",copy:"نشان کپی رایت",ordf:"شاخص ترتیبی مونث",laquo:"اشاره چپ مکرر برای زاویه علامت نقل قول",not:"نشان ثبت نشده",reg:"نشان ثبت شده", +macr:"نشان خط بالای حرف",deg:"نشان درجه",sup2:"بالانویس دو",sup3:"بالانویس سه",acute:"لهجه غلیظ",micro:"نشان مایکرو",para:"نشان محل بند",middot:"نقطه میانی",cedil:"سدیل",sup1:"بالانویس 1",ordm:"شاخص ترتیبی مذکر",raquo:"نشان زاویه‌دار دوتایی نقل قول راست چین",frac14:"واحد عامیانه 1/4",frac12:"واحد عامینه نصف",frac34:"واحد عامیانه 3/4",iquest:"علامت سوال معکوس",Agrave:"حرف A بزرگ لاتین با تلفظ غلیظ",Aacute:"حرف A بزرگ لاتین با تلفظ شدید",Acirc:"حرف A بزرگ لاتین با دور",Atilde:"حرف A بزرگ لاتین با صدای کامی", +Auml:"حرف A بزرگ لاتین با نشان سواگیری",Aring:"حرف A بزرگ لاتین با حلقه بالا",AElig:"حرف Æ بزرگ لاتین",Ccedil:"حرف C بزرگ لاتین با نشان سواگیری",Egrave:"حرف E بزرگ لاتین با تلفظ درشت",Eacute:"حرف E بزرگ لاتین با تلفظ زیر",Ecirc:"حرف E بزرگ لاتین با خمان",Euml:"حرف E بزرگ لاتین با نشان سواگیری",Igrave:"حرف I بزرگ لاتین با تلفظ درشت",Iacute:"حرف I بزرگ لاتین با تلفظ ریز",Icirc:"حرف I بزرگ لاتین با خمان",Iuml:"حرف I بزرگ لاتین با نشان سواگیری",ETH:"حرف لاتین بزرگ واکه ترتیبی",Ntilde:"حرف N بزرگ لاتین با مد", +Ograve:"حرف O بزرگ لاتین با تلفظ درشت",Oacute:"حرف O بزرگ لاتین با تلفظ ریز",Ocirc:"حرف O بزرگ لاتین با خمان",Otilde:"حرف O بزرگ لاتین با مد",Ouml:"حرف O بزرگ لاتین با نشان سواگیری",times:"نشان ضربدر",Oslash:"حرف O بزرگ لاتین با میان خط",Ugrave:"حرف U بزرگ لاتین با تلفظ درشت",Uacute:"حرف U بزرگ لاتین با تلفظ ریز",Ucirc:"حرف U بزرگ لاتین با خمان",Uuml:"حرف U بزرگ لاتین با نشان سواگیری",Yacute:"حرف Y بزرگ لاتین با تلفظ ریز",THORN:"حرف بزرگ لاتین خاردار",szlig:"حرف کوچک لاتین شارپ s",agrave:"حرف a کوچک لاتین با تلفظ درشت", +aacute:"حرف a کوچک لاتین با تلفظ ریز",acirc:"حرف a کوچک لاتین با خمان",atilde:"حرف a کوچک لاتین با صدای کامی",auml:"حرف a کوچک لاتین با نشان سواگیری",aring:"حرف a کوچک لاتین گوشواره دار",aelig:"حرف کوچک لاتین æ",ccedil:"حرف c کوچک لاتین با نشان سدیل",egrave:"حرف e کوچک لاتین با تلفظ درشت",eacute:"حرف e کوچک لاتین با تلفظ ریز",ecirc:"حرف e کوچک لاتین با خمان",euml:"حرف e کوچک لاتین با نشان سواگیری",igrave:"حرف i کوچک لاتین با تلفظ درشت",iacute:"حرف i کوچک لاتین با تلفظ ریز",icirc:"حرف i کوچک لاتین با خمان", +iuml:"حرف i کوچک لاتین با نشان سواگیری",eth:"حرف کوچک لاتین eth",ntilde:"حرف n کوچک لاتین با صدای کامی",ograve:"حرف o کوچک لاتین با تلفظ درشت",oacute:"حرف o کوچک لاتین با تلفظ زیر",ocirc:"حرف o کوچک لاتین با خمان",otilde:"حرف o کوچک لاتین با صدای کامی",ouml:"حرف o کوچک لاتین با نشان سواگیری",divide:"نشان بخش",oslash:"حرف o کوچک لاتین با میان خط",ugrave:"حرف u کوچک لاتین با تلفظ درشت",uacute:"حرف u کوچک لاتین با تلفظ ریز",ucirc:"حرف u کوچک لاتین با خمان",uuml:"حرف u کوچک لاتین با نشان سواگیری",yacute:"حرف y کوچک لاتین با تلفظ ریز", +thorn:"حرف کوچک لاتین خاردار",yuml:"حرف y کوچک لاتین با نشان سواگیری",OElig:"بند بزرگ لاتین OE",oelig:"بند کوچک لاتین oe",372:"حرف W بزرگ لاتین با خمان",374:"حرف Y بزرگ لاتین با خمان",373:"حرف w کوچک لاتین با خمان",375:"حرف y کوچک لاتین با خمان",sbquo:"نشان نقل قول تکی زیر-9",8219:"نشان نقل قول تکی high-reversed-9",bdquo:"نقل قول دوتایی پایین-9",hellip:"حذف افقی",trade:"نشان تجاری",9658:"نشانگر سیاه جهت راست",bull:"گلوله",rarr:"فلش راست",rArr:"فلش دوتایی راست",hArr:"فلش دوتایی چپ راست",diams:"نشان الماس سیاه", +asymp:"تقریبا برابر با"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/fi.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/fi.js new file mode 100644 index 0000000..33f76c2 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/fi.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","fi",{euro:"Euron merkki",lsquo:"Vasen yksittäinen lainausmerkki",rsquo:"Oikea yksittäinen lainausmerkki",ldquo:"Vasen kaksoislainausmerkki",rdquo:"Oikea kaksoislainausmerkki",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Sentin merkki",pound:"Punnan merkki",curren:"Valuuttamerkki",yen:"Yenin merkki",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Rekisteröity merkki",macr:"Macron",deg:"Asteen merkki",sup2:"Yläindeksi kaksi",sup3:"Yläindeksi kolme",acute:"Acute accent",micro:"Mikron merkki",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Yläindeksi yksi",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Ylösalaisin oleva kysymysmerkki",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Kertomerkki",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Jakomerkki",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Tavaramerkki merkki",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Nuoli oikealle",rArr:"Kaksoisnuoli oikealle",hArr:"Kaksoisnuoli oikealle ja vasemmalle",diams:"Black diamond suit",asymp:"Noin"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js new file mode 100644 index 0000000..92c5afc --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js @@ -0,0 +1,10 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","fr-ca",{euro:"Symbole Euro",lsquo:"Guillemet simple ouvrant",rsquo:"Guillemet simple fermant",ldquo:"Guillemet double ouvrant",rdquo:"Guillemet double fermant",ndash:"Tiret haut",mdash:"Tiret",iexcl:"Point d'exclamation inversé",cent:"Symbole de cent",pound:"Symbole de Livre Sterling",curren:"Symbole monétaire",yen:"Symbole du Yen",brvbar:"Barre scindée",sect:"Symbole de section",uml:"Tréma",copy:"Symbole de copyright",ordf:"Indicateur ordinal féminin",laquo:"Guillemet français ouvrant", +not:"Indicateur de négation",reg:"Symbole de marque déposée",macr:"Macron",deg:"Degré",sup2:"Exposant 2",sup3:"Exposant 3",acute:"Accent aigüe",micro:"Symbole micro",para:"Paragraphe",middot:"Point médian",cedil:"Cédille",sup1:"Exposant 1",ordm:"Indicateur ordinal masculin",raquo:"Guillemet français fermant",frac14:"Un quart",frac12:"Une demi",frac34:"Trois quart",iquest:"Point d'interrogation inversé",Agrave:"A accent grave",Aacute:"A accent aigüe",Acirc:"A circonflexe",Atilde:"A tilde",Auml:"A tréma", +Aring:"A avec un rond au dessus",AElig:"Æ majuscule",Ccedil:"C cédille",Egrave:"E accent grave",Eacute:"E accent aigüe",Ecirc:"E accent circonflexe",Euml:"E tréma",Igrave:"I accent grave",Iacute:"I accent aigüe",Icirc:"I accent circonflexe",Iuml:"I tréma",ETH:"Lettre majuscule islandaise ED",Ntilde:"N tilde",Ograve:"O accent grave",Oacute:"O accent aigüe",Ocirc:"O accent circonflexe",Otilde:"O tilde",Ouml:"O tréma",times:"Symbole de multiplication",Oslash:"O barré",Ugrave:"U accent grave",Uacute:"U accent aigüe", +Ucirc:"U accent circonflexe",Uuml:"U tréma",Yacute:"Y accent aigüe",THORN:"Lettre islandaise Thorn majuscule",szlig:"Lettre minuscule allemande s dur",agrave:"a accent grave",aacute:"a accent aigüe",acirc:"a accent circonflexe",atilde:"a tilde",auml:"a tréma",aring:"a avec un cercle au dessus",aelig:"æ",ccedil:"c cédille",egrave:"e accent grave",eacute:"e accent aigüe",ecirc:"e accent circonflexe",euml:"e tréma",igrave:"i accent grave",iacute:"i accent aigüe",icirc:"i accent circonflexe",iuml:"i tréma", +eth:"Lettre minuscule islandaise ED",ntilde:"n tilde",ograve:"o accent grave",oacute:"o accent aigüe",ocirc:"O accent circonflexe",otilde:"O tilde",ouml:"O tréma",divide:"Symbole de division",oslash:"o barré",ugrave:"u accent grave",uacute:"u accent aigüe",ucirc:"u accent circonflexe",uuml:"u tréma",yacute:"y accent aigüe",thorn:"Lettre islandaise thorn minuscule",yuml:"y tréma",OElig:"ligature majuscule latine Œ",oelig:"ligature minuscule latine œ",372:"W accent circonflexe",374:"Y accent circonflexe", +373:"w accent circonflexe",375:"y accent circonflexe",sbquo:"Guillemet simple fermant",8219:"Guillemet-virgule supérieur culbuté",bdquo:"Guillemet-virgule double inférieur",hellip:"Points de suspension",trade:"Symbole de marque déposée",9658:"Flèche noire pointant vers la droite",bull:"Puce",rarr:"Flèche vers la droite",rArr:"Flèche double vers la droite",hArr:"Flèche double vers la gauche",diams:"Carreau",asymp:"Presque égal"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/fr.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/fr.js new file mode 100644 index 0000000..7a275e4 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/fr.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","fr",{euro:"Symbole Euro",lsquo:"Guillemet simple ouvrant",rsquo:"Guillemet simple fermant",ldquo:"Guillemet double ouvrant",rdquo:"Guillemet double fermant",ndash:"Tiret haut",mdash:"Tiret cadratin",iexcl:"Point d'exclamation inversé",cent:"Symbole Cent",pound:"Symbole Livre Sterling",curren:"Symbole monétaire",yen:"Symbole Yen",brvbar:"Barre verticale scindée",sect:"Section",uml:"Tréma",copy:"Symbole Copyright",ordf:"Indicateur ordinal féminin",laquo:"Guillemet français ouvrant", +not:"Crochet de négation",reg:"Marque déposée",macr:"Macron",deg:"Degré",sup2:"Exposant 2",sup3:"\\tExposant 3",acute:"Accent aigu",micro:"Omicron",para:"Paragraphe",middot:"Point médian",cedil:"Cédille",sup1:"\\tExposant 1",ordm:"Indicateur ordinal masculin",raquo:"Guillemet français fermant",frac14:"Un quart",frac12:"Un demi",frac34:"Trois quarts",iquest:"Point d'interrogation inversé",Agrave:"A majuscule accent grave",Aacute:"A majuscule accent aigu",Acirc:"A majuscule accent circonflexe",Atilde:"A majuscule avec caron", +Auml:"A majuscule tréma",Aring:"A majuscule avec un rond au-dessus",AElig:"Æ majuscule ligaturés",Ccedil:"C majuscule cédille",Egrave:"E majuscule accent grave",Eacute:"E majuscule accent aigu",Ecirc:"E majuscule accent circonflexe",Euml:"E majuscule tréma",Igrave:"I majuscule accent grave",Iacute:"I majuscule accent aigu",Icirc:"I majuscule accent circonflexe",Iuml:"I majuscule tréma",ETH:"Lettre majuscule islandaise ED",Ntilde:"N majuscule avec caron",Ograve:"O majuscule accent grave",Oacute:"O majuscule accent aigu", +Ocirc:"O majuscule accent circonflexe",Otilde:"O majuscule avec caron",Ouml:"O majuscule tréma",times:"Multiplication",Oslash:"O majuscule barré",Ugrave:"U majuscule accent grave",Uacute:"U majuscule accent aigu",Ucirc:"U majuscule accent circonflexe",Uuml:"U majuscule tréma",Yacute:"Y majuscule accent aigu",THORN:"Lettre islandaise Thorn majuscule",szlig:"Lettre minuscule allemande s dur",agrave:"a minuscule accent grave",aacute:"a minuscule accent aigu",acirc:"a minuscule accent circonflexe",atilde:"a minuscule avec caron", +auml:"a minuscule tréma",aring:"a minuscule avec un rond au-dessus",aelig:"æ minuscule ligaturés",ccedil:"c minuscule cédille",egrave:"e minuscule accent grave",eacute:"e minuscule accent aigu",ecirc:"e minuscule accent circonflexe",euml:"e minuscule tréma",igrave:"i minuscule accent grave",iacute:"i minuscule accent aigu",icirc:"i minuscule accent circonflexe",iuml:"i minuscule tréma",eth:"Lettre minuscule islandaise ED",ntilde:"n minuscule avec caron",ograve:"o minuscule accent grave",oacute:"o minuscule accent aigu", +ocirc:"o minuscule accent circonflexe",otilde:"o minuscule avec caron",ouml:"o minuscule tréma",divide:"Division",oslash:"o minuscule barré",ugrave:"u minuscule accent grave",uacute:"u minuscule accent aigu",ucirc:"u minuscule accent circonflexe",uuml:"u minuscule tréma",yacute:"y minuscule accent aigu",thorn:"Lettre islandaise thorn minuscule",yuml:"y minuscule tréma",OElig:"ligature majuscule latine Œ",oelig:"ligature minuscule latine œ",372:"W majuscule accent circonflexe",374:"Y majuscule accent circonflexe", +373:"w minuscule accent circonflexe",375:"y minuscule accent circonflexe",sbquo:"Guillemet simple fermant (anglais)",8219:"Guillemet-virgule supérieur culbuté",bdquo:"Guillemet-virgule double inférieur",hellip:"Points de suspension",trade:"Marque commerciale (trade mark)",9658:"Flèche noire pointant vers la droite",bull:"Gros point médian",rarr:"Flèche vers la droite",rArr:"Double flèche vers la droite",hArr:"Double flèche vers la gauche",diams:"Carreau noir",asymp:"Presque égal"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/gl.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/gl.js new file mode 100644 index 0000000..c659249 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/gl.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","gl",{euro:"Símbolo do euro",lsquo:"Comiña simple esquerda",rsquo:"Comiña simple dereita",ldquo:"Comiñas dobres esquerda",rdquo:"Comiñas dobres dereita",ndash:"Guión",mdash:"Raia",iexcl:"Signo de admiración invertido",cent:"Símbolo do centavo",pound:"Símbolo da libra",curren:"Símbolo de moeda",yen:"Símbolo do yen",brvbar:"Barra vertical rota",sect:"Símbolo de sección",uml:"Diérese",copy:"Símbolo de dereitos de autoría",ordf:"Indicador ordinal feminino",laquo:"Comiñas latinas, apertura", +not:"Signo negación",reg:"Símbolo de marca rexistrada",macr:"Guión alto",deg:"Signo de grao",sup2:"Superíndice dous",sup3:"Superíndice tres",acute:"Acento agudo",micro:"Signo de micro",para:"Signo de pi",middot:"Punto medio",cedil:"Cedilla",sup1:"Superíndice un",ordm:"Indicador ordinal masculino",raquo:"Comiñas latinas, peche",frac14:"Fracción ordinaria de un cuarto",frac12:"Fracción ordinaria de un medio",frac34:"Fracción ordinaria de tres cuartos",iquest:"Signo de interrogación invertido",Agrave:"Letra A latina maiúscula con acento grave", +Aacute:"Letra A latina maiúscula con acento agudo",Acirc:"Letra A latina maiúscula con acento circunflexo",Atilde:"Letra A latina maiúscula con til",Auml:"Letra A latina maiúscula con diérese",Aring:"Letra A latina maiúscula con aro enriba",AElig:"Letra Æ latina maiúscula",Ccedil:"Letra C latina maiúscula con cedilla",Egrave:"Letra E latina maiúscula con acento grave",Eacute:"Letra E latina maiúscula con acento agudo",Ecirc:"Letra E latina maiúscula con acento circunflexo",Euml:"Letra E latina maiúscula con diérese", +Igrave:"Letra I latina maiúscula con acento grave",Iacute:"Letra I latina maiúscula con acento agudo",Icirc:"Letra I latina maiúscula con acento circunflexo",Iuml:"Letra I latina maiúscula con diérese",ETH:"Letra Ed latina maiúscula",Ntilde:"Letra N latina maiúscula con til",Ograve:"Letra O latina maiúscula con acento grave",Oacute:"Letra O latina maiúscula con acento agudo",Ocirc:"Letra O latina maiúscula con acento circunflexo",Otilde:"Letra O latina maiúscula con til",Ouml:"Letra O latina maiúscula con diérese", +times:"Signo de multiplicación",Oslash:"Letra O latina maiúscula con barra transversal",Ugrave:"Letra U latina maiúscula con acento grave",Uacute:"Letra U latina maiúscula con acento agudo",Ucirc:"Letra U latina maiúscula con acento circunflexo",Uuml:"Letra U latina maiúscula con diérese",Yacute:"Letra Y latina maiúscula con acento agudo",THORN:"Letra Thorn latina maiúscula",szlig:"Letra s latina forte minúscula",agrave:"Letra a latina minúscula con acento grave",aacute:"Letra a latina minúscula con acento agudo", +acirc:"Letra a latina minúscula con acento circunflexo",atilde:"Letra a latina minúscula con til",auml:"Letra a latina minúscula con diérese",aring:"Letra a latina minúscula con aro enriba",aelig:"Letra æ latina minúscula",ccedil:"Letra c latina minúscula con cedilla",egrave:"Letra e latina minúscula con acento grave",eacute:"Letra e latina minúscula con acento agudo",ecirc:"Letra e latina minúscula con acento circunflexo",euml:"Letra e latina minúscula con diérese",igrave:"Letra i latina minúscula con acento grave", +iacute:"Letra i latina minúscula con acento agudo",icirc:"Letra i latina minúscula con acento circunflexo",iuml:"Letra i latina minúscula con diérese",eth:"Letra ed latina minúscula",ntilde:"Letra n latina minúscula con til",ograve:"Letra o latina minúscula con acento grave",oacute:"Letra o latina minúscula con acento agudo",ocirc:"Letra o latina minúscula con acento circunflexo",otilde:"Letra o latina minúscula con til",ouml:"Letra o latina minúscula con diérese",divide:"Signo de división",oslash:"Letra o latina minúscula con barra transversal", +ugrave:"Letra u latina minúscula con acento grave",uacute:"Letra u latina minúscula con acento agudo",ucirc:"Letra u latina minúscula con acento circunflexo",uuml:"Letra u latina minúscula con diérese",yacute:"Letra y latina minúscula con acento agudo",thorn:"Letra Thorn latina minúscula",yuml:"Letra y latina minúscula con diérese",OElig:"Ligadura OE latina maiúscula",oelig:"Ligadura oe latina minúscula",372:"Letra W latina maiúscula con acento circunflexo",374:"Letra Y latina maiúscula con acento circunflexo", +373:"Letra w latina minúscula con acento circunflexo",375:"Letra y latina minúscula con acento circunflexo",sbquo:"Comiña simple baixa, de apertura",8219:"Comiña simple alta, de peche",bdquo:"Comiñas dobres baixas, de apertura",hellip:"Elipse, puntos suspensivos",trade:"Signo de marca rexistrada",9658:"Apuntador negro apuntando á dereita",bull:"Viñeta",rarr:"Frecha á dereita",rArr:"Frecha dobre á dereita",hArr:"Frecha dobre da esquerda á dereita",diams:"Diamante negro",asymp:"Case igual a"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/he.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/he.js new file mode 100644 index 0000000..29c7398 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/he.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","he",{euro:"יורו",lsquo:"סימן ציטוט יחיד שמאלי",rsquo:"סימן ציטוט יחיד ימני",ldquo:"סימן ציטוט כפול שמאלי",rdquo:"סימן ציטוט כפול ימני",ndash:"קו מפריד קצר",mdash:"קו מפריד ארוך",iexcl:"סימן קריאה הפוך",cent:"סנט",pound:"פאונד",curren:"מטבע",yen:"ין",brvbar:"קו שבור",sect:"סימן מקטע",uml:"שתי נקודות אופקיות (Diaeresis)",copy:"סימן זכויות יוצרים (Copyright)",ordf:"סימן אורדינאלי נקבי",laquo:"סימן ציטוט זווית כפולה לשמאל",not:"סימן שלילה מתמטי",reg:"סימן רשום", +macr:"מקרון (הגיה ארוכה)",deg:"מעלות",sup2:"2 בכתיב עילי",sup3:"3 בכתיב עילי",acute:"סימן דגוש (Acute)",micro:"מיקרו",para:"סימון פסקה",middot:"נקודה אמצעית",cedil:"סדיליה",sup1:"1 בכתיב עילי",ordm:"סימן אורדינאלי זכרי",raquo:"סימן ציטוט זווית כפולה לימין",frac14:"רבע בשבר פשוט",frac12:"חצי בשבר פשוט",frac34:"שלושה רבעים בשבר פשוט",iquest:"סימן שאלה הפוך",Agrave:"אות לטינית A עם גרש (Grave)",Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde", +Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"אות לטינית Æ גדולה",Ccedil:"Latin capital letter C with cedilla",Egrave:"אות לטינית E עם גרש (Grave)",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"אות לטינית I עם גרש (Grave)",Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis", +ETH:"אות לטינית Eth גדולה",Ntilde:"Latin capital letter N with tilde",Ograve:"אות לטינית O עם גרש (Grave)",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"סימן כפל",Oslash:"Latin capital letter O with stroke",Ugrave:"אות לטינית U עם גרש (Grave)",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis", +Yacute:"Latin capital letter Y with acute accent",THORN:"אות לטינית Thorn גדולה",szlig:"אות לטינית s חדה קטנה",agrave:"אות לטינית a עם גרש (Grave)",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",aelig:"אות לטינית æ קטנה",ccedil:"Latin small letter c with cedilla",egrave:"אות לטינית e עם גרש (Grave)",eacute:"Latin small letter e with acute accent", +ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"אות לטינית i עם גרש (Grave)",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"אות לטינית eth קטנה",ntilde:"Latin small letter n with tilde",ograve:"אות לטינית o עם גרש (Grave)",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis", +divide:"סימן חלוקה",oslash:"Latin small letter o with stroke",ugrave:"אות לטינית u עם גרש (Grave)",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",thorn:"אות לטינית thorn קטנה",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex", +373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"סימן ציטוט נמוך יחיד",8219:"סימן ציטוט",bdquo:"סימן ציטוט נמוך כפול",hellip:"שלוש נקודות",trade:"סימן טריידמארק",9658:"סמן שחור לצד ימין",bull:"תבליט (רשימה)",rarr:"חץ לימין",rArr:"חץ כפול לימין",hArr:"חץ כפול לימין ושמאל",diams:"יהלום מלא",asymp:"כמעט שווה"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/hr.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/hr.js new file mode 100644 index 0000000..f55749e --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/hr.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","hr",{euro:"Euro znak",lsquo:"Lijevi jednostruki navodnik",rsquo:"Desni jednostruki navodnik",ldquo:"Lijevi dvostruki navodnik",rdquo:"Desni dvostruki navodnik",ndash:"En crtica",mdash:"Em crtica",iexcl:"Naopaki uskličnik",cent:"Cent znak",pound:"Funta znak",curren:"Znak valute",yen:"Yen znak",brvbar:"Potrgana prečka",sect:"Znak odjeljka",uml:"Prijeglasi",copy:"Copyright znak",ordf:"Feminine ordinal indicator",laquo:"Lijevi dvostruki uglati navodnik",not:"Not znak", +reg:"Registered znak",macr:"Macron",deg:"Stupanj znak",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Mikro znak",para:"Pilcrow sign",middot:"Srednja točka",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Desni dvostruku uglati navodnik",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Naopaki upitnik",Agrave:"Veliko latinsko slovo A s akcentom",Aacute:"Latin capital letter A with acute accent", +Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent", +Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent", +Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above", +aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde", +ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent", +thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer", +bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/hu.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/hu.js new file mode 100644 index 0000000..52327ec --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/hu.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","hu",{euro:"Euró jel",lsquo:"Bal szimpla idézőjel",rsquo:"Jobb szimpla idézőjel",ldquo:"Bal dupla idézőjel",rdquo:"Jobb dupla idézőjel",ndash:"Rövid gondolatjel",mdash:"Hosszú gondolatjel",iexcl:"Fordított felkiáltójel",cent:"Cent jel",pound:"Font jel",curren:"Valuta jel",yen:"Yen jel",brvbar:"Hosszú kettőspont",sect:"Paragrafus jel",uml:"Kettős hangzó jel",copy:"Szerzői jog jel",ordf:"Női sorrend mutatója",laquo:"Balra mutató duplanyíl",not:"Feltételes kötőjel", +reg:"Bejegyzett védjegy jele",macr:"Hosszúsági jel",deg:"Fok jel",sup2:"Négyzeten jel",sup3:"Köbön jel",acute:"Éles ékezet",micro:"Mikro-jel",para:"Bekezdés jel",middot:"Közép pont",cedil:"Cédille",sup1:"Elsőn jel",ordm:"Férfi sorrend mutatója",raquo:"Jobbra mutató duplanyíl",frac14:"Egy negyed jel",frac12:"Egy ketted jel",frac34:"Három negyed jel",iquest:"Fordított kérdőjel",Agrave:"Latin nagy A fordított ékezettel",Aacute:"Latin nagy A normál ékezettel",Acirc:"Latin nagy A hajtott ékezettel",Atilde:"Latin nagy A hullámjellel", +Auml:"Latin nagy A kettőspont ékezettel",Aring:"Latin nagy A gyűrű ékezettel",AElig:"Latin nagy Æ betű",Ccedil:"Latin nagy C cedillával",Egrave:"Latin nagy E fordított ékezettel",Eacute:"Latin nagy E normál ékezettel",Ecirc:"Latin nagy E hajtott ékezettel",Euml:"Latin nagy E dupla kettőspont ékezettel",Igrave:"Latin nagy I fordított ékezettel",Iacute:"Latin nagy I normál ékezettel",Icirc:"Latin nagy I hajtott ékezettel",Iuml:"Latin nagy I kettőspont ékezettel",ETH:"Latin nagy Eth betű",Ntilde:"Latin nagy N hullámjellel", +Ograve:"Latin nagy O fordított ékezettel",Oacute:"Latin nagy O normál ékezettel",Ocirc:"Latin nagy O hajtott ékezettel",Otilde:"Latin nagy O hullámjellel",Ouml:"Latin nagy O kettőspont ékezettel",times:"Szorzás jel",Oslash:"Latin O betű áthúzással",Ugrave:"Latin nagy U fordított ékezettel",Uacute:"Latin nagy U normál ékezettel",Ucirc:"Latin nagy U hajtott ékezettel",Uuml:"Latin nagy U kettőspont ékezettel",Yacute:"Latin nagy Y normál ékezettel",THORN:"Latin nagy Thorn betű",szlig:"Latin kis s betű", +agrave:"Latin kis a fordított ékezettel",aacute:"Latin kis a normál ékezettel",acirc:"Latin kis a hajtott ékezettel",atilde:"Latin kis a hullámjellel",auml:"Latin kis a kettőspont ékezettel",aring:"Latin kis a gyűrű ékezettel",aelig:"Latin kis æ betű",ccedil:"Latin kis c cedillával",egrave:"Latin kis e fordított ékezettel",eacute:"Latin kis e normál ékezettel",ecirc:"Latin kis e hajtott ékezettel",euml:"Latin kis e dupla kettőspont ékezettel",igrave:"Latin kis i fordított ékezettel",iacute:"Latin kis i normál ékezettel", +icirc:"Latin kis i hajtott ékezettel",iuml:"Latin kis i kettőspont ékezettel",eth:"Latin kis eth betű",ntilde:"Latin kis n hullámjellel",ograve:"Latin kis o fordított ékezettel",oacute:"Latin kis o normál ékezettel",ocirc:"Latin kis o hajtott ékezettel",otilde:"Latin kis o hullámjellel",ouml:"Latin kis o kettőspont ékezettel",divide:"Osztásjel",oslash:"Latin kis o betű áthúzással",ugrave:"Latin kis u fordított ékezettel",uacute:"Latin kis u normál ékezettel",ucirc:"Latin kis u hajtott ékezettel", +uuml:"Latin kis u kettőspont ékezettel",yacute:"Latin kis y normál ékezettel",thorn:"Latin kis thorn jel",yuml:"Latin kis y kettőspont ékezettel",OElig:"Latin nagy OE-jel",oelig:"Latin kis oe-jel",372:"Latin nagy W hajtott ékezettel",374:"Latin nagy Y hajtott ékezettel",373:"Latin kis w hajtott ékezettel",375:"Latin kis y hajtott ékezettel",sbquo:"Nyitó nyomdai szimpla idézőjel",8219:"Záró nyomdai záró idézőjel",bdquo:"Nyitó nyomdai dupla idézőjel",hellip:"Három pont",trade:"Kereskedelmi védjegy jele", +9658:"Jobbra mutató fekete mutató",bull:"Golyó",rarr:"Jobbra mutató nyíl",rArr:"Jobbra mutató duplanyíl",hArr:"Bal-jobb duplanyíl",diams:"Fekete gyémánt jel",asymp:"Majdnem egyenlő jel"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/id.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/id.js new file mode 100644 index 0000000..7c7885a --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/id.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","id",{euro:"Tanda Euro",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"Currency sign",yen:"Tanda Yen",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Tanda Hak Cipta",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Tanda Telah Terdaftar",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/it.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/it.js new file mode 100644 index 0000000..5bc136f --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/it.js @@ -0,0 +1,14 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","it",{euro:"Simbolo Euro",lsquo:"Virgoletta singola sinistra",rsquo:"Virgoletta singola destra",ldquo:"Virgolette aperte",rdquo:"Virgolette chiuse",ndash:"Trattino",mdash:"Trattino lungo",iexcl:"Punto esclavamativo invertito",cent:"Simbolo Cent",pound:"Simbolo Sterlina",curren:"Simbolo Moneta",yen:"Simbolo Yen",brvbar:"Barra interrotta",sect:"Simbolo di sezione",uml:"Dieresi",copy:"Simbolo Copyright",ordf:"Indicatore ordinale femminile",laquo:"Virgolette basse aperte", +not:"Nessun segno",reg:"Simbolo Registrato",macr:"Macron",deg:"Simbolo Grado",sup2:"Apice Due",sup3:"Apice Tre",acute:"Accento acuto",micro:"Simbolo Micro",para:"Simbolo Paragrafo",middot:"Punto centrale",cedil:"Cediglia",sup1:"Apice Uno",ordm:"Indicatore ordinale maschile",raquo:"Virgolette basse chiuse",frac14:"Frazione volgare un quarto",frac12:"Frazione volgare un mezzo",frac34:"Frazione volgare tre quarti",iquest:"Punto interrogativo invertito",Agrave:"Lettera maiuscola latina A con accento grave", +Aacute:"Lettera maiuscola latina A con accento acuto",Acirc:"Lettera maiuscola latina A con accento circonflesso",Atilde:"Lettera maiuscola latina A con tilde",Auml:"Lettera maiuscola latina A con dieresi",Aring:"Lettera maiuscola latina A con anello sopra",AElig:"Lettera maiuscola latina AE",Ccedil:"Lettera maiuscola latina C con cediglia",Egrave:"Lettera maiuscola latina E con accento grave",Eacute:"Lettera maiuscola latina E con accento acuto",Ecirc:"Lettera maiuscola latina E con accento circonflesso", +Euml:"Lettera maiuscola latina E con dieresi",Igrave:"Lettera maiuscola latina I con accento grave",Iacute:"Lettera maiuscola latina I con accento acuto",Icirc:"Lettera maiuscola latina I con accento circonflesso",Iuml:"Lettera maiuscola latina I con dieresi",ETH:"Lettera maiuscola latina Eth",Ntilde:"Lettera maiuscola latina N con tilde",Ograve:"Lettera maiuscola latina O con accento grave",Oacute:"Lettera maiuscola latina O con accento acuto",Ocirc:"Lettera maiuscola latina O con accento circonflesso", +Otilde:"Lettera maiuscola latina O con tilde",Ouml:"Lettera maiuscola latina O con dieresi",times:"Simbolo di moltiplicazione",Oslash:"Lettera maiuscola latina O barrata",Ugrave:"Lettera maiuscola latina U con accento grave",Uacute:"Lettera maiuscola latina U con accento acuto",Ucirc:"Lettera maiuscola latina U con accento circonflesso",Uuml:"Lettera maiuscola latina U con accento circonflesso",Yacute:"Lettera maiuscola latina Y con accento acuto",THORN:"Lettera maiuscola latina Thorn",szlig:"Lettera latina minuscola doppia S", +agrave:"Lettera minuscola latina a con accento grave",aacute:"Lettera minuscola latina a con accento acuto",acirc:"Lettera minuscola latina a con accento circonflesso",atilde:"Lettera minuscola latina a con tilde",auml:"Lettera minuscola latina a con dieresi",aring:"Lettera minuscola latina a con anello superiore",aelig:"Lettera minuscola latina ae",ccedil:"Lettera minuscola latina c con cediglia",egrave:"Lettera minuscola latina e con accento grave",eacute:"Lettera minuscola latina e con accento acuto", +ecirc:"Lettera minuscola latina e con accento circonflesso",euml:"Lettera minuscola latina e con dieresi",igrave:"Lettera minuscola latina i con accento grave",iacute:"Lettera minuscola latina i con accento acuto",icirc:"Lettera minuscola latina i con accento circonflesso",iuml:"Lettera minuscola latina i con dieresi",eth:"Lettera minuscola latina eth",ntilde:"Lettera minuscola latina n con tilde",ograve:"Lettera minuscola latina o con accento grave",oacute:"Lettera minuscola latina o con accento acuto", +ocirc:"Lettera minuscola latina o con accento circonflesso",otilde:"Lettera minuscola latina o con tilde",ouml:"Lettera minuscola latina o con dieresi",divide:"Simbolo di divisione",oslash:"Lettera minuscola latina o barrata",ugrave:"Lettera minuscola latina u con accento grave",uacute:"Lettera minuscola latina u con accento acuto",ucirc:"Lettera minuscola latina u con accento circonflesso",uuml:"Lettera minuscola latina u con dieresi",yacute:"Lettera minuscola latina y con accento acuto",thorn:"Lettera minuscola latina thorn", +yuml:"Lettera minuscola latina y con dieresi",OElig:"Legatura maiuscola latina OE",oelig:"Legatura minuscola latina oe",372:"Lettera maiuscola latina W con accento circonflesso",374:"Lettera maiuscola latina Y con accento circonflesso",373:"Lettera minuscola latina w con accento circonflesso",375:"Lettera minuscola latina y con accento circonflesso",sbquo:"Singola virgoletta bassa low-9",8219:"Singola virgoletta bassa low-9 inversa",bdquo:"Doppia virgoletta bassa low-9",hellip:"Ellissi orizzontale", +trade:"Simbolo TM",9658:"Puntatore nero rivolto verso destra",bull:"Punto",rarr:"Freccia verso destra",rArr:"Doppia freccia verso destra",hArr:"Doppia freccia sinistra destra",diams:"Simbolo nero diamante",asymp:"Quasi uguale a"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/ja.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/ja.js new file mode 100644 index 0000000..0bbee62 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/ja.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ja",{euro:"ユーロ記号",lsquo:"左シングル引用符",rsquo:"右シングル引用符",ldquo:"左ダブル引用符",rdquo:"右ダブル引用符",ndash:"半角ダッシュ",mdash:"全角ダッシュ",iexcl:"逆さ感嘆符",cent:"セント記号",pound:"ポンド記号",curren:"通貨記号",yen:"円記号",brvbar:"上下に分かれた縦棒",sect:"節記号",uml:"分音記号(ウムラウト)",copy:"著作権表示記号",ordf:"女性序数標識",laquo:" 始め二重山括弧引用記号",not:"論理否定記号",reg:"登録商標記号",macr:"長音符",deg:"度記号",sup2:"上つき2, 2乗",sup3:"上つき3, 3乗",acute:"揚音符",micro:"ミクロン記号",para:"段落記号",middot:"中黒",cedil:"セディラ",sup1:"上つき1",ordm:"男性序数標識",raquo:"終わり二重山括弧引用記号", +frac14:"四分の一",frac12:"二分の一",frac34:"四分の三",iquest:"逆疑問符",Agrave:"抑音符つき大文字A",Aacute:"揚音符つき大文字A",Acirc:"曲折アクセントつき大文字A",Atilde:"チルダつき大文字A",Auml:"分音記号つき大文字A",Aring:"リングつき大文字A",AElig:"AとEの合字",Ccedil:"セディラつき大文字C",Egrave:"抑音符つき大文字E",Eacute:"揚音符つき大文字E",Ecirc:"曲折アクセントつき大文字E",Euml:"分音記号つき大文字E",Igrave:"抑音符つき大文字I",Iacute:"揚音符つき大文字I",Icirc:"曲折アクセントつき大文字I",Iuml:"分音記号つき大文字I",ETH:"[アイスランド語]大文字ETH",Ntilde:"チルダつき大文字N",Ograve:"抑音符つき大文字O",Oacute:"揚音符つき大文字O",Ocirc:"曲折アクセントつき大文字O",Otilde:"チルダつき大文字O",Ouml:" 分音記号つき大文字O", +times:"乗算記号",Oslash:"打ち消し線つき大文字O",Ugrave:"抑音符つき大文字U",Uacute:"揚音符つき大文字U",Ucirc:"曲折アクセントつき大文字U",Uuml:"分音記号つき大文字U",Yacute:"揚音符つき大文字Y",THORN:"[アイスランド語]大文字THORN",szlig:"ドイツ語エスツェット",agrave:"抑音符つき小文字a",aacute:"揚音符つき小文字a",acirc:"曲折アクセントつき小文字a",atilde:"チルダつき小文字a",auml:"分音記号つき小文字a",aring:"リングつき小文字a",aelig:"aとeの合字",ccedil:"セディラつき小文字c",egrave:"抑音符つき小文字e",eacute:"揚音符つき小文字e",ecirc:"曲折アクセントつき小文字e",euml:"分音記号つき小文字e",igrave:"抑音符つき小文字i",iacute:"揚音符つき小文字i",icirc:"曲折アクセントつき小文字i",iuml:"分音記号つき小文字i",eth:"アイスランド語小文字eth", +ntilde:"チルダつき小文字n",ograve:"抑音符つき小文字o",oacute:"揚音符つき小文字o",ocirc:"曲折アクセントつき小文字o",otilde:"チルダつき小文字o",ouml:"分音記号つき小文字o",divide:"除算記号",oslash:"打ち消し線つき小文字o",ugrave:"抑音符つき小文字u",uacute:"揚音符つき小文字u",ucirc:"曲折アクセントつき小文字u",uuml:"分音記号つき小文字u",yacute:"揚音符つき小文字y",thorn:"アイスランド語小文字thorn",yuml:"分音記号つき小文字y",OElig:"OとEの合字",oelig:"oとeの合字",372:"曲折アクセントつき大文字W",374:"曲折アクセントつき大文字Y",373:"曲折アクセントつき小文字w",375:"曲折アクセントつき小文字y",sbquo:"シングル下引用符",8219:"左右逆の左引用符",bdquo:"ダブル下引用符",hellip:"三点リーダ",trade:"商標記号",9658:"右黒三角ポインタ",bull:"黒丸", +rarr:"右矢印",rArr:"右二重矢印",hArr:"左右二重矢印",diams:"ダイヤ",asymp:"漸近"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/km.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/km.js new file mode 100644 index 0000000..9568540 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/km.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","km",{euro:"សញ្ញា​អឺរ៉ូ",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"សញ្ញា​សេន",pound:"សញ្ញា​ផោន",curren:"សញ្ញា​រូបិយបណ្ណ",yen:"សញ្ញា​យ៉េន",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"សញ្ញា​រក្សា​សិទ្ធិ",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"សញ្ញា​ដឺក្រេ",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"សញ្ញា​មីក្រូ",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/ku.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/ku.js new file mode 100644 index 0000000..af275c9 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/ku.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ku",{euro:"نیشانەی یۆرۆ",lsquo:"نیشانەی فاریزەی سەرووژێری تاکی چەپ",rsquo:"نیشانەی فاریزەی سەرووژێری تاکی ڕاست",ldquo:"نیشانەی فاریزەی سەرووژێری دووهێندەی چه‌پ",rdquo:"نیشانەی فاریزەی سەرووژێری دووهێندەی ڕاست",ndash:"تەقەڵی کورت",mdash:"تەقەڵی درێژ",iexcl:"نیشانەی هەڵەوگێڕی سەرسوڕهێنەر",cent:"نیشانەی سەنت",pound:"نیشانەی پاوەند",curren:"نیشانەی دراو",yen:"نیشانەی یەنی ژاپۆنی",brvbar:"شریتی ئەستوونی پچڕاو",sect:"نیشانەی دوو s لەسەریەک",uml:"خاڵ",copy:"نیشانەی مافی چاپ", +ordf:"هێڵ لەسەر پیتی a",laquo:"دوو تیری بەدووایەکی چەپ",not:"نیشانەی نەخێر",reg:"نیشانەی R لەناو بازنەدا",macr:"ماکڕۆن",deg:"نیشانەی پلە",sup2:"سەرنووسی دوو",sup3:"سەرنووسی سێ",acute:"لاری تیژ",micro:"نیشانەی u لق درێژی چەپی خواروو",para:"نیشانەی پەڕەگراف",middot:"ناوەڕاستی خاڵ",cedil:"نیشانەی c ژێر چووکرە",sup1:"سەرنووسی یەک",ordm:"هێڵ لەژێر پیتی o",raquo:"دوو تیری بەدووایەکی ڕاست",frac14:"یەک لەسەر چووار",frac12:"یەک لەسەر دوو",frac34:"سێ لەسەر چووار",iquest:"هێمای هەڵەوگێری پرسیار",Agrave:"پیتی لاتینی A-ی گەورە لەگەڵ ڕوومەتداری لار", +Aacute:"پیتی لاتینی A-ی گەورە لەگەڵ ڕوومەتداری تیژ",Acirc:"پیتی لاتینی A-ی گەورە لەگەڵ نیشانە لەسەری",Atilde:"پیتی لاتینی A-ی گەورە لەگەڵ زەڕە",Auml:"پیتی لاتینی A-ی گەورە لەگەڵ نیشانە لەسەری",Aring:"پیتی لاتینی گەورەی Å",AElig:"پیتی لاتینی گەورەی Æ",Ccedil:"پیتی لاتینی C-ی گەورە لەگەڵ ژێر چووکرە",Egrave:"پیتی لاتینی E-ی گەورە لەگەڵ ڕوومەتداری لار",Eacute:"پیتی لاتینی E-ی گەورە لەگەڵ ڕوومەتداری تیژ",Ecirc:"پیتی لاتینی E-ی گەورە لەگەڵ نیشانە لەسەری",Euml:"پیتی لاتینی E-ی گەورە لەگەڵ نیشانە لەسەری", +Igrave:"پیتی لاتینی I-ی گەورە لەگەڵ ڕوومەتداری لار",Iacute:"پیتی لاتینی I-ی گەورە لەگەڵ ڕوومەتداری تیژ",Icirc:"پیتی لاتینی I-ی گەورە لەگەڵ نیشانە لەسەری",Iuml:"پیتی لاتینی I-ی گەورە لەگەڵ نیشانە لەسەری",ETH:"پیتی لاتینی E-ی گەورەی",Ntilde:"پیتی لاتینی N-ی گەورە لەگەڵ زەڕە",Ograve:"پیتی لاتینی O-ی گەورە لەگەڵ ڕوومەتداری لار",Oacute:"پیتی لاتینی O-ی گەورە لەگەڵ ڕوومەتداری تیژ",Ocirc:"پیتی لاتینی O-ی گەورە لەگەڵ نیشانە لەسەری",Otilde:"پیتی لاتینی O-ی گەورە لەگەڵ زەڕە",Ouml:"پیتی لاتینی O-ی گەورە لەگەڵ نیشانە لەسەری", +times:"نیشانەی لێکدان",Oslash:"پیتی لاتینی گەورەی Ø لەگەڵ هێمای دڵ وەستان",Ugrave:"پیتی لاتینی U-ی گەورە لەگەڵ ڕوومەتداری لار",Uacute:"پیتی لاتینی U-ی گەورە لەگەڵ ڕوومەتداری تیژ",Ucirc:"پیتی لاتینی U-ی گەورە لەگەڵ نیشانە لەسەری",Uuml:"پیتی لاتینی U-ی گەورە لەگەڵ نیشانە لەسەری",Yacute:"پیتی لاتینی Y-ی گەورە لەگەڵ ڕوومەتداری تیژ",THORN:"پیتی لاتینی دڕکی گەورە",szlig:"پیتی لاتنی نووک تیژی s",agrave:"پیتی لاتینی a-ی بچووک لەگەڵ ڕوومەتداری لار",aacute:"پیتی لاتینی a-ی بچووك لەگەڵ ڕوومەتداری تیژ",acirc:"پیتی لاتینی a-ی بچووك لەگەڵ نیشانە لەسەری", +atilde:"پیتی لاتینی a-ی بچووك لەگەڵ زەڕە",auml:"پیتی لاتینی a-ی بچووك لەگەڵ نیشانە لەسەری",aring:"پیتی لاتینی å-ی بچووك",aelig:"پیتی لاتینی æ-ی بچووك",ccedil:"پیتی لاتینی c-ی بچووك لەگەڵ ژێر چووکرە",egrave:"پیتی لاتینی e-ی بچووك لەگەڵ ڕوومەتداری لار",eacute:"پیتی لاتینی e-ی بچووك لەگەڵ ڕوومەتداری تیژ",ecirc:"پیتی لاتینی e-ی بچووك لەگەڵ نیشانە لەسەری",euml:"پیتی لاتینی e-ی بچووك لەگەڵ نیشانە لەسەری",igrave:"پیتی لاتینی i-ی بچووك لەگەڵ ڕوومەتداری لار",iacute:"پیتی لاتینی i-ی بچووك لەگەڵ ڕوومەتداری تیژ", +icirc:"پیتی لاتینی i-ی بچووك لەگەڵ نیشانە لەسەری",iuml:"پیتی لاتینی i-ی بچووك لەگەڵ نیشانە لەسەری",eth:"پیتی لاتینی e-ی بچووك",ntilde:"پیتی لاتینی n-ی بچووك لەگەڵ زەڕە",ograve:"پیتی لاتینی o-ی بچووك لەگەڵ ڕوومەتداری لار",oacute:"پیتی لاتینی o-ی بچووك له‌گەڵ ڕوومەتداری تیژ",ocirc:"پیتی لاتینی o-ی بچووك لەگەڵ نیشانە لەسەری",otilde:"پیتی لاتینی o-ی بچووك لەگەڵ زەڕە",ouml:"پیتی لاتینی o-ی بچووك لەگەڵ نیشانە لەسەری",divide:"نیشانەی دابەش",oslash:"پیتی لاتینی گەورەی ø لەگەڵ هێمای دڵ وەستان",ugrave:"پیتی لاتینی u-ی بچووك لەگەڵ ڕوومەتداری لار", +uacute:"پیتی لاتینی u-ی بچووك لەگەڵ ڕوومەتداری تیژ",ucirc:"پیتی لاتینی u-ی بچووك لەگەڵ نیشانە لەسەری",uuml:"پیتی لاتینی u-ی بچووك لەگەڵ نیشانە لەسەری",yacute:"پیتی لاتینی y-ی بچووك لەگەڵ ڕوومەتداری تیژ",thorn:"پیتی لاتینی دڕکی بچووك",yuml:"پیتی لاتینی y-ی بچووك لەگەڵ نیشانە لەسەری",OElig:"پیتی لاتینی گەورەی پێکەوەنووسراوی OE",oelig:"پیتی لاتینی بچووکی پێکەوەنووسراوی oe",372:"پیتی لاتینی W-ی گەورە لەگەڵ نیشانە لەسەری",374:"پیتی لاتینی Y-ی گەورە لەگەڵ نیشانە لەسەری",373:"پیتی لاتینی w-ی بچووکی لەگەڵ نیشانە لەسەری", +375:"پیتی لاتینی y-ی بچووکی لەگەڵ نیشانە لەسەری",sbquo:"نیشانەی فاریزەی نزم",8219:"نیشانەی فاریزەی بەرزی پێچەوانە",bdquo:"دوو فاریزەی تەنیش یەك",hellip:"ئاسۆیی بازنە",trade:"نیشانەی بازرگانی",9658:"ئاراستەی ڕەشی دەستی ڕاست",bull:"فیشەك",rarr:"تیری دەستی ڕاست",rArr:"دووتیری دەستی ڕاست",hArr:"دوو تیری ڕاست و چەپ",diams:"ڕەشی پاقڵاوەیی",asymp:"نیشانەی یەکسانە"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/lv.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/lv.js new file mode 100644 index 0000000..3f76e26 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/lv.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","lv",{euro:"Euro zīme",lsquo:"Kreisā vienkārtīga pēdiņa",rsquo:"Labā vienkārtīga pēdiņa",ldquo:"Kreisā dubult pēdiņa",rdquo:"Labā dubult pēdiņa",ndash:"En svītra",mdash:"Em svītra",iexcl:"Apgriezta izsaukuma zīme",cent:"Centu naudas zīme",pound:"Sterliņu mārciņu naudas zīme",curren:"Valūtas zīme",yen:"Jenu naudas zīme",brvbar:"Vertikāla pārrauta līnija",sect:"Paragrāfa zīme",uml:"Diakritiska zīme",copy:"Autortiesību zīme",ordf:"Sievišķas kārtas rādītājs", +laquo:"Kreisā dubult stūra pēdiņu zīme",not:"Neparakstīts",reg:"Reģistrēta zīme",macr:"Garumzīme",deg:"Grādu zīme",sup2:"Augšraksts divi",sup3:"Augšraksts trīs",acute:"Akūta uzsvara zīme",micro:"Mikro zīme",para:"Rindkopas zīme ",middot:"Vidējs punkts",cedil:"Āķītis zem burta",sup1:"Augšraksts viens",ordm:"Vīrišķīgas kārtas rādītājs",raquo:"Labā dubult stūra pēdiņu zīme",frac14:"Vulgāra frakcija 1/4",frac12:"Vulgāra frakcija 1/2",frac34:"Vulgāra frakcija 3/4",iquest:"Apgriezta jautājuma zīme",Agrave:"Lielais latīņu burts A ar uzsvara zīmi", +Aacute:"Lielais latīņu burts A ar akūtu uzsvara zīmi",Acirc:"Lielais latīņu burts A ar diakritisku zīmi",Atilde:"Lielais latīņu burts A ar tildi ",Auml:"Lielais latīņu burts A ar diakritisko zīmi",Aring:"Lielais latīņu burts A ar aplīti augšā",AElig:"Lielais latīņu burts Æ",Ccedil:"Lielais latīņu burts C ar āķīti zem burta",Egrave:"Lielais latīņu burts E ar apostrofu",Eacute:"Lielais latīņu burts E ar akūtu uzsvara zīmi",Ecirc:"Lielais latīņu burts E ar diakritisko zīmi",Euml:"Lielais latīņu burts E ar diakritisko zīmi", +Igrave:"Lielais latīņu burts I ar uzsvaras zīmi",Iacute:"Lielais latīņu burts I ar akūtu uzsvara zīmi",Icirc:"Lielais latīņu burts I ar diakritisko zīmi",Iuml:"Lielais latīņu burts I ar diakritisko zīmi",ETH:"Lielais latīņu burts Eth",Ntilde:"Lielais latīņu burts N ar tildi",Ograve:"Lielais latīņu burts O ar uzsvara zīmi",Oacute:"Lielais latīņu burts O ar akūto uzsvara zīmi",Ocirc:"Lielais latīņu burts O ar diakritisko zīmi",Otilde:"Lielais latīņu burts O ar tildi",Ouml:"Lielais latīņu burts O ar diakritisko zīmi", +times:"Reizināšanas zīme ",Oslash:"Lielais latīņu burts O ar iesvītrojumu",Ugrave:"Lielais latīņu burts U ar uzsvaras zīmi",Uacute:"Lielais latīņu burts U ar akūto uzsvars zīmi",Ucirc:"Lielais latīņu burts U ar diakritisko zīmi",Uuml:"Lielais latīņu burts U ar diakritisko zīmi",Yacute:"Lielais latīņu burts Y ar akūto uzsvaras zīmi",THORN:"Lielais latīņu burts torn",szlig:"Mazs latīņu burts ar ligatūru",agrave:"Mazs latīņu burts a ar uzsvara zīmi",aacute:"Mazs latīņu burts a ar akūto uzsvara zīmi", +acirc:"Mazs latīņu burts a ar diakritisko zīmi",atilde:"Mazs latīņu burts a ar tildi",auml:"Mazs latīņu burts a ar diakritisko zīmi",aring:"Mazs latīņu burts a ar aplīti augšā",aelig:"Mazs latīņu burts æ",ccedil:"Mazs latīņu burts c ar āķīti zem burta",egrave:"Mazs latīņu burts e ar uzsvara zīmi ",eacute:"Mazs latīņu burts e ar akūtu uzsvara zīmi",ecirc:"Mazs latīņu burts e ar diakritisko zīmi",euml:"Mazs latīņu burts e ar diakritisko zīmi",igrave:"Mazs latīņu burts i ar uzsvara zīmi ",iacute:"Mazs latīņu burts i ar akūtu uzsvara zīmi", +icirc:"Mazs latīņu burts i ar diakritisko zīmi",iuml:"Mazs latīņu burts i ar diakritisko zīmi",eth:"Mazs latīņu burts eth",ntilde:"Mazs latīņu burts n ar tildi",ograve:"Mazs latīņu burts o ar uzsvara zīmi ",oacute:"Mazs latīņu burts o ar akūtu uzsvara zīmi",ocirc:"Mazs latīņu burts o ar diakritisko zīmi",otilde:"Mazs latīņu burts o ar tildi",ouml:"Mazs latīņu burts o ar diakritisko zīmi",divide:"Dalīšanas zīme",oslash:"Mazs latīņu burts o ar iesvītrojumu",ugrave:"Mazs latīņu burts u ar uzsvara zīmi ", +uacute:"Mazs latīņu burts u ar akūtu uzsvara zīmi",ucirc:"Mazs latīņu burts u ar diakritisko zīmi",uuml:"Mazs latīņu burts u ar diakritisko zīmi",yacute:"Mazs latīņu burts y ar akūtu uzsvaras zīmi",thorn:"Mazs latīņu burts torns",yuml:"Mazs latīņu burts y ar diakritisko zīmi",OElig:"Liela latīņu ligatūra OE",oelig:"Maza latīņu ligatūra oe",372:"Liels latīņu burts W ar diakritisko zīmi ",374:"Liels latīņu burts Y ar diakritisko zīmi ",373:"Mazs latīņu burts w ar diakritisko zīmi ",375:"Mazs latīņu burts y ar diakritisko zīmi ", +sbquo:"Mazas-9 vienkārtīgas pēdiņas",8219:"Lielas-9 vienkārtīgas apgrieztas pēdiņas",bdquo:"Mazas-9 dubultas pēdiņas",hellip:"Horizontāli daudzpunkti",trade:"Preču zīmes zīme",9658:"Melns pa labi pagriezts radītājs",bull:"Lode",rarr:"Bulta pa labi",rArr:"Dubulta Bulta pa labi",hArr:"Bulta pa kreisi",diams:"Dubulta Bulta pa kreisi",asymp:"Gandrīz vienāds ar"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/nb.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/nb.js new file mode 100644 index 0000000..1e8a859 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/nb.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","nb",{euro:"Eurosymbol",lsquo:"Venstre enkelt anførselstegn",rsquo:"Høyre enkelt anførselstegn",ldquo:"Venstre dobbelt anførselstegn",rdquo:"Høyre anførsesltegn",ndash:"Kort tankestrek",mdash:"Lang tankestrek",iexcl:"Omvendt utropstegn",cent:"Centsymbol",pound:"Pundsymbol",curren:"Valutategn",yen:"Yensymbol",brvbar:"Brutt loddrett strek",sect:"Paragraftegn",uml:"Tøddel",copy:"Copyrighttegn",ordf:"Feminin ordensindikator",laquo:"Venstre anførselstegn",not:"Negasjonstegn", +reg:"Registrert varemerke-tegn",macr:"Makron",deg:"Gradsymbol",sup2:"Hevet totall",sup3:"Hevet tretall",acute:"Akutt aksent",micro:"Mikrosymbol",para:"Avsnittstegn",middot:"Midtstilt prikk",cedil:"Cedille",sup1:"Hevet ettall",ordm:"Maskulin ordensindikator",raquo:"Høyre anførselstegn",frac14:"Fjerdedelsbrøk",frac12:"Halvbrøk",frac34:"Tre fjerdedelers brøk",iquest:"Omvendt spørsmålstegn",Agrave:"Stor A med grav aksent",Aacute:"Stor A med akutt aksent",Acirc:"Stor A med cirkumfleks",Atilde:"Stor A med tilde", +Auml:"Stor A med tøddel",Aring:"Stor Å",AElig:"Stor Æ",Ccedil:"Stor C med cedille",Egrave:"Stor E med grav aksent",Eacute:"Stor E med akutt aksent",Ecirc:"Stor E med cirkumfleks",Euml:"Stor E med tøddel",Igrave:"Stor I med grav aksent",Iacute:"Stor I med akutt aksent",Icirc:"Stor I med cirkumfleks",Iuml:"Stor I med tøddel",ETH:"Stor Edd/stungen D",Ntilde:"Stor N med tilde",Ograve:"Stor O med grav aksent",Oacute:"Stor O med akutt aksent",Ocirc:"Stor O med cirkumfleks",Otilde:"Stor O med tilde",Ouml:"Stor O med tøddel", +times:"Multiplikasjonstegn",Oslash:"Stor Ø",Ugrave:"Stor U med grav aksent",Uacute:"Stor U med akutt aksent",Ucirc:"Stor U med cirkumfleks",Uuml:"Stor U med tøddel",Yacute:"Stor Y med akutt aksent",THORN:"Stor Thorn",szlig:"Liten dobbelt-s/Eszett",agrave:"Liten a med grav aksent",aacute:"Liten a med akutt aksent",acirc:"Liten a med cirkumfleks",atilde:"Liten a med tilde",auml:"Liten a med tøddel",aring:"Liten å",aelig:"Liten æ",ccedil:"Liten c med cedille",egrave:"Liten e med grav aksent",eacute:"Liten e med akutt aksent", +ecirc:"Liten e med cirkumfleks",euml:"Liten e med tøddel",igrave:"Liten i med grav aksent",iacute:"Liten i med akutt aksent",icirc:"Liten i med cirkumfleks",iuml:"Liten i med tøddel",eth:"Liten edd/stungen d",ntilde:"Liten n med tilde",ograve:"Liten o med grav aksent",oacute:"Liten o med akutt aksent",ocirc:"Liten o med cirkumfleks",otilde:"Liten o med tilde",ouml:"Liten o med tøddel",divide:"Divisjonstegn",oslash:"Liten ø",ugrave:"Liten u med grav aksent",uacute:"Liten u med akutt aksent",ucirc:"Liten u med cirkumfleks", +uuml:"Liten u med tøddel",yacute:"Liten y med akutt aksent",thorn:"Liten thorn",yuml:"Liten y med tøddel",OElig:"Stor ligatur av O og E",oelig:"Liten ligatur av o og e",372:"Stor W med cirkumfleks",374:"Stor Y med cirkumfleks",373:"Liten w med cirkumfleks",375:"Liten y med cirkumfleks",sbquo:"Enkelt lavt 9-anførselstegn",8219:"Enkelt høyt reversert 9-anførselstegn",bdquo:"Dobbelt lavt 9-anførselstegn",hellip:"Ellipse",trade:"Varemerkesymbol",9658:"Svart høyrevendt peker",bull:"Tykk interpunkt",rarr:"Høyrevendt pil", +rArr:"Dobbel høyrevendt pil",hArr:"Dobbel venstrevendt pil",diams:"Svart ruter",asymp:"Omtrent likhetstegn"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/nl.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/nl.js new file mode 100644 index 0000000..9a8fb14 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/nl.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","nl",{euro:"Euro-teken",lsquo:"Linker enkel aanhalingsteken",rsquo:"Rechter enkel aanhalingsteken",ldquo:"Linker dubbel aanhalingsteken",rdquo:"Rechter dubbel aanhalingsteken",ndash:"En dash",mdash:"Em dash",iexcl:"Omgekeerd uitroepteken",cent:"Cent-teken",pound:"Pond-teken",curren:"Valuta-teken",yen:"Yen-teken",brvbar:"Gebroken streep",sect:"Paragraaf-teken",uml:"Trema",copy:"Copyright-teken",ordf:"Vrouwelijk ordinaal",laquo:"Linker guillemet",not:"Ongelijk-teken", +reg:"Geregistreerd handelsmerk-teken",macr:"Macron",deg:"Graden-teken",sup2:"Superscript twee",sup3:"Superscript drie",acute:"Accent aigu",micro:"Micro-teken",para:"Alinea-teken",middot:"Halfhoge punt",cedil:"Cedille",sup1:"Superscript een",ordm:"Mannelijk ordinaal",raquo:"Rechter guillemet",frac14:"Breuk kwart",frac12:"Breuk half",frac34:"Breuk driekwart",iquest:"Omgekeerd vraagteken",Agrave:"Latijnse hoofdletter A met een accent grave",Aacute:"Latijnse hoofdletter A met een accent aigu",Acirc:"Latijnse hoofdletter A met een circonflexe", +Atilde:"Latijnse hoofdletter A met een tilde",Auml:"Latijnse hoofdletter A met een trema",Aring:"Latijnse hoofdletter A met een corona",AElig:"Latijnse hoofdletter Æ",Ccedil:"Latijnse hoofdletter C met een cedille",Egrave:"Latijnse hoofdletter E met een accent grave",Eacute:"Latijnse hoofdletter E met een accent aigu",Ecirc:"Latijnse hoofdletter E met een circonflexe",Euml:"Latijnse hoofdletter E met een trema",Igrave:"Latijnse hoofdletter I met een accent grave",Iacute:"Latijnse hoofdletter I met een accent aigu", +Icirc:"Latijnse hoofdletter I met een circonflexe",Iuml:"Latijnse hoofdletter I met een trema",ETH:"Latijnse hoofdletter Eth",Ntilde:"Latijnse hoofdletter N met een tilde",Ograve:"Latijnse hoofdletter O met een accent grave",Oacute:"Latijnse hoofdletter O met een accent aigu",Ocirc:"Latijnse hoofdletter O met een circonflexe",Otilde:"Latijnse hoofdletter O met een tilde",Ouml:"Latijnse hoofdletter O met een trema",times:"Maal-teken",Oslash:"Latijnse hoofdletter O met een schuine streep",Ugrave:"Latijnse hoofdletter U met een accent grave", +Uacute:"Latijnse hoofdletter U met een accent aigu",Ucirc:"Latijnse hoofdletter U met een circonflexe",Uuml:"Latijnse hoofdletter U met een trema",Yacute:"Latijnse hoofdletter Y met een accent aigu",THORN:"Latijnse hoofdletter Thorn",szlig:"Latijnse kleine ringel-s",agrave:"Latijnse kleine letter a met een accent grave",aacute:"Latijnse kleine letter a met een accent aigu",acirc:"Latijnse kleine letter a met een circonflexe",atilde:"Latijnse kleine letter a met een tilde",auml:"Latijnse kleine letter a met een trema", +aring:"Latijnse kleine letter a met een corona",aelig:"Latijnse kleine letter æ",ccedil:"Latijnse kleine letter c met een cedille",egrave:"Latijnse kleine letter e met een accent grave",eacute:"Latijnse kleine letter e met een accent aigu",ecirc:"Latijnse kleine letter e met een circonflexe",euml:"Latijnse kleine letter e met een trema",igrave:"Latijnse kleine letter i met een accent grave",iacute:"Latijnse kleine letter i met een accent aigu",icirc:"Latijnse kleine letter i met een circonflexe", +iuml:"Latijnse kleine letter i met een trema",eth:"Latijnse kleine letter eth",ntilde:"Latijnse kleine letter n met een tilde",ograve:"Latijnse kleine letter o met een accent grave",oacute:"Latijnse kleine letter o met een accent aigu",ocirc:"Latijnse kleine letter o met een circonflexe",otilde:"Latijnse kleine letter o met een tilde",ouml:"Latijnse kleine letter o met een trema",divide:"Deel-teken",oslash:"Latijnse kleine letter o met een schuine streep",ugrave:"Latijnse kleine letter u met een accent grave", +uacute:"Latijnse kleine letter u met een accent aigu",ucirc:"Latijnse kleine letter u met een circonflexe",uuml:"Latijnse kleine letter u met een trema",yacute:"Latijnse kleine letter y met een accent aigu",thorn:"Latijnse kleine letter thorn",yuml:"Latijnse kleine letter y met een trema",OElig:"Latijnse hoofdletter Œ",oelig:"Latijnse kleine letter œ",372:"Latijnse hoofdletter W met een circonflexe",374:"Latijnse hoofdletter Y met een circonflexe",373:"Latijnse kleine letter w met een circonflexe", +375:"Latijnse kleine letter y met een circonflexe",sbquo:"Lage enkele aanhalingsteken",8219:"Hoge omgekeerde enkele aanhalingsteken",bdquo:"Lage dubbele aanhalingsteken",hellip:"Beletselteken",trade:"Trademark-teken",9658:"Zwarte driehoek naar rechts",bull:"Bullet",rarr:"Pijl naar rechts",rArr:"Dubbele pijl naar rechts",hArr:"Dubbele pijl naar links",diams:"Zwart ruitje",asymp:"Benaderingsteken"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/no.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/no.js new file mode 100644 index 0000000..0787077 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/no.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","no",{euro:"Eurosymbol",lsquo:"Venstre enkelt anførselstegn",rsquo:"Høyre enkelt anførselstegn",ldquo:"Venstre dobbelt anførselstegn",rdquo:"Høyre anførsesltegn",ndash:"Kort tankestrek",mdash:"Lang tankestrek",iexcl:"Omvendt utropstegn",cent:"Centsymbol",pound:"Pundsymbol",curren:"Valutategn",yen:"Yensymbol",brvbar:"Brutt loddrett strek",sect:"Paragraftegn",uml:"Tøddel",copy:"Copyrighttegn",ordf:"Feminin ordensindikator",laquo:"Venstre anførselstegn",not:"Negasjonstegn", +reg:"Registrert varemerke-tegn",macr:"Makron",deg:"Gradsymbol",sup2:"Hevet totall",sup3:"Hevet tretall",acute:"Akutt aksent",micro:"Mikrosymbol",para:"Avsnittstegn",middot:"Midtstilt prikk",cedil:"Cedille",sup1:"Hevet ettall",ordm:"Maskulin ordensindikator",raquo:"Høyre anførselstegn",frac14:"Fjerdedelsbrøk",frac12:"Halvbrøk",frac34:"Tre fjerdedelers brøk",iquest:"Omvendt spørsmålstegn",Agrave:"Stor A med grav aksent",Aacute:"Stor A med akutt aksent",Acirc:"Stor A med cirkumfleks",Atilde:"Stor A med tilde", +Auml:"Stor A med tøddel",Aring:"Stor Å",AElig:"Stor Æ",Ccedil:"Stor C med cedille",Egrave:"Stor E med grav aksent",Eacute:"Stor E med akutt aksent",Ecirc:"Stor E med cirkumfleks",Euml:"Stor E med tøddel",Igrave:"Stor I med grav aksent",Iacute:"Stor I med akutt aksent",Icirc:"Stor I med cirkumfleks",Iuml:"Stor I med tøddel",ETH:"Stor Edd/stungen D",Ntilde:"Stor N med tilde",Ograve:"Stor O med grav aksent",Oacute:"Stor O med akutt aksent",Ocirc:"Stor O med cirkumfleks",Otilde:"Stor O med tilde",Ouml:"Stor O med tøddel", +times:"Multiplikasjonstegn",Oslash:"Stor Ø",Ugrave:"Stor U med grav aksent",Uacute:"Stor U med akutt aksent",Ucirc:"Stor U med cirkumfleks",Uuml:"Stor U med tøddel",Yacute:"Stor Y med akutt aksent",THORN:"Stor Thorn",szlig:"Liten dobbelt-s/Eszett",agrave:"Liten a med grav aksent",aacute:"Liten a med akutt aksent",acirc:"Liten a med cirkumfleks",atilde:"Liten a med tilde",auml:"Liten a med tøddel",aring:"Liten å",aelig:"Liten æ",ccedil:"Liten c med cedille",egrave:"Liten e med grav aksent",eacute:"Liten e med akutt aksent", +ecirc:"Liten e med cirkumfleks",euml:"Liten e med tøddel",igrave:"Liten i med grav aksent",iacute:"Liten i med akutt aksent",icirc:"Liten i med cirkumfleks",iuml:"Liten i med tøddel",eth:"Liten edd/stungen d",ntilde:"Liten n med tilde",ograve:"Liten o med grav aksent",oacute:"Liten o med akutt aksent",ocirc:"Liten o med cirkumfleks",otilde:"Liten o med tilde",ouml:"Liten o med tøddel",divide:"Divisjonstegn",oslash:"Liten ø",ugrave:"Liten u med grav aksent",uacute:"Liten u med akutt aksent",ucirc:"Liten u med cirkumfleks", +uuml:"Liten u med tøddel",yacute:"Liten y med akutt aksent",thorn:"Liten thorn",yuml:"Liten y med tøddel",OElig:"Stor ligatur av O og E",oelig:"Liten ligatur av o og e",372:"Stor W med cirkumfleks",374:"Stor Y med cirkumfleks",373:"Liten w med cirkumfleks",375:"Liten y med cirkumfleks",sbquo:"Enkelt lavt 9-anførselstegn",8219:"Enkelt høyt reversert 9-anførselstegn",bdquo:"Dobbelt lavt 9-anførselstegn",hellip:"Ellipse",trade:"Varemerkesymbol",9658:"Svart høyrevendt peker",bull:"Tykk interpunkt",rarr:"Høyrevendt pil", +rArr:"Dobbel høyrevendt pil",hArr:"Dobbel venstrevendt pil",diams:"Svart ruter",asymp:"Omtrent likhetstegn"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/pl.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/pl.js new file mode 100644 index 0000000..6b0f802 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/pl.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","pl",{euro:"Znak euro",lsquo:"Cudzysłów pojedynczy otwierający",rsquo:"Cudzysłów pojedynczy zamykający",ldquo:"Cudzysłów apostrofowy otwierający",rdquo:"Cudzysłów apostrofowy zamykający",ndash:"Półpauza",mdash:"Pauza",iexcl:"Odwrócony wykrzyknik",cent:"Znak centa",pound:"Znak funta",curren:"Znak waluty",yen:"Znak jena",brvbar:"Przerwana pionowa kreska",sect:"Paragraf",uml:"Diereza",copy:"Znak praw autorskich",ordf:"Wskaźnik rodzaju żeńskiego liczebnika porządkowego", +laquo:"Lewy cudzysłów ostrokątny",not:"Znak negacji",reg:"Zastrzeżony znak towarowy",macr:"Makron",deg:"Znak stopnia",sup2:"Druga potęga",sup3:"Trzecia potęga",acute:"Akcent ostry",micro:"Znak mikro",para:"Znak akapitu",middot:"Kropka środkowa",cedil:"Cedylla",sup1:"Pierwsza potęga",ordm:"Wskaźnik rodzaju męskiego liczebnika porządkowego",raquo:"Prawy cudzysłów ostrokątny",frac14:"Ułamek zwykły jedna czwarta",frac12:"Ułamek zwykły jedna druga",frac34:"Ułamek zwykły trzy czwarte",iquest:"Odwrócony znak zapytania", +Agrave:"Wielka litera A z akcentem ciężkim",Aacute:"Wielka litera A z akcentem ostrym",Acirc:"Wielka litera A z akcentem przeciągłym",Atilde:"Wielka litera A z tyldą",Auml:"Wielka litera A z dierezą",Aring:"Wielka litera A z kółkiem",AElig:"Wielka ligatura Æ",Ccedil:"Wielka litera C z cedyllą",Egrave:"Wielka litera E z akcentem ciężkim",Eacute:"Wielka litera E z akcentem ostrym",Ecirc:"Wielka litera E z akcentem przeciągłym",Euml:"Wielka litera E z dierezą",Igrave:"Wielka litera I z akcentem ciężkim", +Iacute:"Wielka litera I z akcentem ostrym",Icirc:"Wielka litera I z akcentem przeciągłym",Iuml:"Wielka litera I z dierezą",ETH:"Wielka litera Eth",Ntilde:"Wielka litera N z tyldą",Ograve:"Wielka litera O z akcentem ciężkim",Oacute:"Wielka litera O z akcentem ostrym",Ocirc:"Wielka litera O z akcentem przeciągłym",Otilde:"Wielka litera O z tyldą",Ouml:"Wielka litera O z dierezą",times:"Znak mnożenia wektorowego",Oslash:"Wielka litera O z przekreśleniem",Ugrave:"Wielka litera U z akcentem ciężkim",Uacute:"Wielka litera U z akcentem ostrym", +Ucirc:"Wielka litera U z akcentem przeciągłym",Uuml:"Wielka litera U z dierezą",Yacute:"Wielka litera Y z akcentem ostrym",THORN:"Wielka litera Thorn",szlig:"Mała litera ostre s (eszet)",agrave:"Mała litera a z akcentem ciężkim",aacute:"Mała litera a z akcentem ostrym",acirc:"Mała litera a z akcentem przeciągłym",atilde:"Mała litera a z tyldą",auml:"Mała litera a z dierezą",aring:"Mała litera a z kółkiem",aelig:"Mała ligatura æ",ccedil:"Mała litera c z cedyllą",egrave:"Mała litera e z akcentem ciężkim", +eacute:"Mała litera e z akcentem ostrym",ecirc:"Mała litera e z akcentem przeciągłym",euml:"Mała litera e z dierezą",igrave:"Mała litera i z akcentem ciężkim",iacute:"Mała litera i z akcentem ostrym",icirc:"Mała litera i z akcentem przeciągłym",iuml:"Mała litera i z dierezą",eth:"Mała litera eth",ntilde:"Mała litera n z tyldą",ograve:"Mała litera o z akcentem ciężkim",oacute:"Mała litera o z akcentem ostrym",ocirc:"Mała litera o z akcentem przeciągłym",otilde:"Mała litera o z tyldą",ouml:"Mała litera o z dierezą", +divide:"Anglosaski znak dzielenia",oslash:"Mała litera o z przekreśleniem",ugrave:"Mała litera u z akcentem ciężkim",uacute:"Mała litera u z akcentem ostrym",ucirc:"Mała litera u z akcentem przeciągłym",uuml:"Mała litera u z dierezą",yacute:"Mała litera y z akcentem ostrym",thorn:"Mała litera thorn",yuml:"Mała litera y z dierezą",OElig:"Wielka ligatura OE",oelig:"Mała ligatura oe",372:"Wielka litera W z akcentem przeciągłym",374:"Wielka litera Y z akcentem przeciągłym",373:"Mała litera w z akcentem przeciągłym", +375:"Mała litera y z akcentem przeciągłym",sbquo:"Pojedynczy apostrof dolny",8219:"Pojedynczy apostrof górny",bdquo:"Podwójny apostrof dolny",hellip:"Wielokropek",trade:"Znak towarowy",9658:"Czarny wskaźnik wskazujący w prawo",bull:"Punktor",rarr:"Strzałka w prawo",rArr:"Podwójna strzałka w prawo",hArr:"Podwójna strzałka w lewo",diams:"Czarny znak karo",asymp:"Znak prawie równe"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js new file mode 100644 index 0000000..cb4ea1a --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","pt-br",{euro:"Euro",lsquo:"Aspas simples esquerda",rsquo:"Aspas simples direita",ldquo:"Aspas duplas esquerda",rdquo:"Aspas duplas direita",ndash:"Traço",mdash:"Travessão",iexcl:"Ponto de exclamação invertido",cent:"Cent",pound:"Cerquilha",curren:"Dinheiro",yen:"Yen",brvbar:"Bara interrompida",sect:"Símbolo de Parágrafo",uml:"Trema",copy:"Direito de Cópia",ordf:"Indicador ordinal feminino",laquo:"Aspas duplas angulares esquerda",not:"Negação",reg:"Marca Registrada", +macr:"Mácron",deg:"Grau",sup2:"2 Superscrito",sup3:"3 Superscrito",acute:"Acento agudo",micro:"Micro",para:"Pé de mosca",middot:"Ponto mediano",cedil:"Cedilha",sup1:"1 Superscrito",ordm:"Indicador ordinal masculino",raquo:"Aspas duplas angulares direita",frac14:"Um quarto",frac12:"Um meio",frac34:"Três quartos",iquest:"Interrogação invertida",Agrave:"A maiúsculo com acento grave",Aacute:"A maiúsculo com acento agudo",Acirc:"A maiúsculo com acento circunflexo",Atilde:"A maiúsculo com til",Auml:"A maiúsculo com trema", +Aring:"A maiúsculo com anel acima",AElig:"Æ maiúsculo",Ccedil:"Ç maiúlculo",Egrave:"E maiúsculo com acento grave",Eacute:"E maiúsculo com acento agudo",Ecirc:"E maiúsculo com acento circumflexo",Euml:"E maiúsculo com trema",Igrave:"I maiúsculo com acento grave",Iacute:"I maiúsculo com acento agudo",Icirc:"I maiúsculo com acento circunflexo",Iuml:"I maiúsculo com crase",ETH:"Eth maiúsculo",Ntilde:"N maiúsculo com til",Ograve:"O maiúsculo com acento grave",Oacute:"O maiúsculo com acento agudo",Ocirc:"O maiúsculo com acento circunflexo", +Otilde:"O maiúsculo com til",Ouml:"O maiúsculo com trema",times:"Multiplicação",Oslash:"Diâmetro",Ugrave:"U maiúsculo com acento grave",Uacute:"U maiúsculo com acento agudo",Ucirc:"U maiúsculo com acento circunflexo",Uuml:"U maiúsculo com trema",Yacute:"Y maiúsculo com acento agudo",THORN:"Thorn maiúsculo",szlig:"Eszett minúsculo",agrave:"a minúsculo com acento grave",aacute:"a minúsculo com acento agudo",acirc:"a minúsculo com acento circunflexo",atilde:"a minúsculo com til",auml:"a minúsculo com trema", +aring:"a minúsculo com anel acima",aelig:"æ minúsculo",ccedil:"ç minúsculo",egrave:"e minúsculo com acento grave",eacute:"e minúsculo com acento agudo",ecirc:"e minúsculo com acento circunflexo",euml:"e minúsculo com trema",igrave:"i minúsculo com acento grave",iacute:"i minúsculo com acento agudo",icirc:"i minúsculo com acento circunflexo",iuml:"i minúsculo com trema",eth:"eth minúsculo",ntilde:"n minúsculo com til",ograve:"o minúsculo com acento grave",oacute:"o minúsculo com acento agudo",ocirc:"o minúsculo com acento circunflexo", +otilde:"o minúsculo com til",ouml:"o minúsculo com trema",divide:"Divisão",oslash:"o minúsculo com cortado ou diâmetro",ugrave:"u minúsculo com acento grave",uacute:"u minúsculo com acento agudo",ucirc:"u minúsculo com acento circunflexo",uuml:"u minúsculo com trema",yacute:"y minúsculo com acento agudo",thorn:"thorn minúsculo",yuml:"y minúsculo com trema",OElig:"Ligação tipográfica OE maiúscula",oelig:"Ligação tipográfica oe minúscula",372:"W maiúsculo com acento circunflexo",374:"Y maiúsculo com acento circunflexo", +373:"w minúsculo com acento circunflexo",375:"y minúsculo com acento circunflexo",sbquo:"Aspas simples inferior direita",8219:"Aspas simples superior esquerda",bdquo:"Aspas duplas inferior direita",hellip:"Reticências",trade:"Trade mark",9658:"Ponta de seta preta para direita",bull:"Ponto lista",rarr:"Seta para direita",rArr:"Seta dupla para direita",hArr:"Seta dupla direita e esquerda",diams:"Ouros",asymp:"Aproximadamente"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/pt.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/pt.js new file mode 100644 index 0000000..3517162 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/pt.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","pt",{euro:"Símbolo do Euro",lsquo:"Aspa esquerda simples",rsquo:"Aspa direita simples",ldquo:"Aspa esquerda dupla",rdquo:"Aspa direita dupla",ndash:"Travessão Simples",mdash:"Travessão Longo",iexcl:"Ponto de exclamação invertido",cent:"Símbolo do Cêntimo",pound:"Símbolo da Libra",curren:"Símbolo de Moeda",yen:"Símbolo do Iene",brvbar:"Barra quebrada",sect:"Símbolo de Secção",uml:"Trema",copy:"Símbolo dos Direitos de Autor",ordf:"Indicador ordinal feminino", +laquo:"Aspa esquerda ângulo duplo",not:"Não Símbolo",reg:"Símbolo de Registado",macr:"Mácron",deg:"Símbolo de Grau",sup2:"Expoente 2",sup3:"Expoente 3",acute:"Acento agudo",micro:"Símbolo de Micro",para:"Símbolo de Parágrafo",middot:"Ponto do Meio",cedil:"Cedilha",sup1:"Expoente 1",ordm:"Indicador ordinal masculino",raquo:"Aspas ângulo duplo pra Direita",frac14:"Fração vulgar 1/4",frac12:"Fração vulgar 1/2",frac34:"Fração vulgar 3/4",iquest:"Ponto de interrugação invertido",Agrave:"Letra maiúscula latina A com acento grave", +Aacute:"Letra maiúscula latina A com acento agudo",Acirc:"Letra maiúscula latina A com circunflexo",Atilde:"Letra maiúscula latina A com til",Auml:"Letra maiúscula latina A com trema",Aring:"Letra maiúscula latina A com sinal diacrítico",AElig:"Letra Maiúscula Latina Æ",Ccedil:"Letra maiúscula latina C com cedilha",Egrave:"Letra maiúscula latina E com acento grave",Eacute:"Letra maiúscula latina E com acento agudo",Ecirc:"Letra maiúscula latina E com circunflexo",Euml:"Letra maiúscula latina E com trema", +Igrave:"Letra maiúscula latina I com acento grave",Iacute:"Letra maiúscula latina I com acento agudo",Icirc:"Letra maiúscula latina I com cincunflexo",Iuml:"Letra maiúscula latina I com trema",ETH:"Letra maiúscula latina Eth (Ðð)",Ntilde:"Letra maiúscula latina N com til",Ograve:"Letra maiúscula latina O com acento grave",Oacute:"Letra maiúscula latina O com acento agudo",Ocirc:"Letra maiúscula latina I com circunflexo",Otilde:"Letra maiúscula latina O com til",Ouml:"Letra maiúscula latina O com trema", +times:"Símbolo de Multiplicação",Oslash:"Letra maiúscula O com barra",Ugrave:"Letra maiúscula latina U com acento grave",Uacute:"Letra maiúscula latina U com acento agudo",Ucirc:"Letra maiúscula latina U com circunflexo",Uuml:"Letra maiúscula latina E com trema",Yacute:"Letra maiúscula latina Y com acento agudo",THORN:"Letra maiúscula latina Rúnico",szlig:"Letra minúscula latina s forte",agrave:"Letra minúscula latina a com acento grave",aacute:"Letra minúscula latina a com acento agudo",acirc:"Letra minúscula latina a com circunflexo", +atilde:"Letra minúscula latina a com til",auml:"Letra minúscula latina a com trema",aring:"Letra minúscula latina a com sinal diacrítico",aelig:"Letra minúscula latina æ",ccedil:"Letra minúscula latina c com cedilha",egrave:"Letra minúscula latina e com acento grave",eacute:"Letra minúscula latina e com acento agudo",ecirc:"Letra minúscula latina e com circunflexo",euml:"Letra minúscula latina e com trema",igrave:"Letra minúscula latina i com acento grave",iacute:"Letra minúscula latina i com acento agudo", +icirc:"Letra minúscula latina i com circunflexo",iuml:"Letra pequena latina i com trema",eth:"Letra minúscula latina eth",ntilde:"Letra minúscula latina n com til",ograve:"Letra minúscula latina o com acento grave",oacute:"Letra minúscula latina o com acento agudo",ocirc:"Letra minúscula latina o com circunflexo",otilde:"Letra minúscula latina o com til",ouml:"Letra minúscula latina o com trema",divide:"Símbolo de Divisão",oslash:"Letra minúscula latina o com barra",ugrave:"Letra minúscula latina u com acento grave", +uacute:"Letra minúscula latina u com acento agudo",ucirc:"Letra minúscula latina u com circunflexo",uuml:"Letra minúscula latina u com trema",yacute:"Letra minúscula latina y com acento agudo",thorn:"Letra minúscula latina Rúnico",yuml:"Letra minúscula latina y com trema",OElig:"Ligadura maiúscula latina OE",oelig:"Ligadura minúscula latina oe",372:"Letra maiúscula latina W com circunflexo",374:"Letra maiúscula latina Y com circunflexo",373:"Letra minúscula latina w com circunflexo",375:"Letra minúscula latina y com circunflexo", +sbquo:"Aspa Simples inferior-9",8219:"Aspa Simples superior invertida-9",bdquo:"Aspa Duplas inferior-9",hellip:"Elipse Horizontal ",trade:"Símbolo de Marca Registada",9658:"Ponteiro preto direito",bull:"Marca",rarr:"Seta para a direita",rArr:"Seta dupla para a direita",hArr:"Seta dupla direita esquerda",diams:"Naipe diamante preto",asymp:"Quase igual a "}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/ru.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/ru.js new file mode 100644 index 0000000..622078d --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/ru.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ru",{euro:"Знак евро",lsquo:"Левая одинарная кавычка",rsquo:"Правая одинарная кавычка",ldquo:"Левая двойная кавычка",rdquo:"Левая двойная кавычка",ndash:"Среднее тире",mdash:"Длинное тире",iexcl:"перевёрнутый восклицательный знак",cent:"Цент",pound:"Фунт",curren:"Знак валюты",yen:"Йена",brvbar:"Вертикальная черта с разрывом",sect:"Знак параграфа",uml:"Умлаут",copy:"Знак охраны авторского права",ordf:"Указатель окончания женского рода ...ая",laquo:"Левая кавычка-«ёлочка»", +not:"Отрицание",reg:"Знак охраны смежных прав\\t",macr:"Макрон",deg:"Градус",sup2:"Надстрочное два",sup3:"Надстрочное три",acute:"Акут",micro:"Микро",para:"Абзац",middot:"Интерпункт",cedil:"Седиль",sup1:"Надстрочная единица",ordm:"Порядковое числительное",raquo:"Правая кавычка-«ёлочка»",frac14:"Одна четвертая",frac12:"Одна вторая",frac34:"Три четвёртых",iquest:"Перевёрнутый вопросительный знак",Agrave:"Латинская заглавная буква А с апострофом",Aacute:"Латинская заглавная буква A с ударением",Acirc:"Латинская заглавная буква А с циркумфлексом", +Atilde:"Латинская заглавная буква А с тильдой",Auml:"Латинская заглавная буква А с тремой",Aring:"Латинская заглавная буква А с кольцом над ней",AElig:"Латинская большая буква Æ",Ccedil:"Латинская заглавная буква C с седилью",Egrave:"Латинская заглавная буква Е с апострофом",Eacute:"Латинская заглавная буква Е с ударением",Ecirc:"Латинская заглавная буква Е с циркумфлексом",Euml:"Латинская заглавная буква Е с тремой",Igrave:"Латинская заглавная буква I с апострофом",Iacute:"Латинская заглавная буква I с ударением", +Icirc:"Латинская заглавная буква I с циркумфлексом",Iuml:"Латинская заглавная буква I с тремой",ETH:"Латинская большая буква Eth",Ntilde:"Латинская заглавная буква N с тильдой",Ograve:"Латинская заглавная буква O с апострофом",Oacute:"Латинская заглавная буква O с ударением",Ocirc:"Латинская заглавная буква O с циркумфлексом",Otilde:"Латинская заглавная буква O с тильдой",Ouml:"Латинская заглавная буква O с тремой",times:"Знак умножения",Oslash:"Латинская большая перечеркнутая O",Ugrave:"Латинская заглавная буква U с апострофом", +Uacute:"Латинская заглавная буква U с ударением",Ucirc:"Латинская заглавная буква U с циркумфлексом",Uuml:"Латинская заглавная буква U с тремой",Yacute:"Латинская заглавная буква Y с ударением",THORN:"Латинская заглавная буква Thorn",szlig:"Знак диеза",agrave:"Латинская маленькая буква a с апострофом",aacute:"Латинская маленькая буква a с ударением",acirc:"Латинская маленькая буква a с циркумфлексом",atilde:"Латинская маленькая буква a с тильдой",auml:"Латинская маленькая буква a с тремой",aring:"Латинская маленькая буква a с кольцом", +aelig:"Латинская маленькая буква æ",ccedil:"Латинская маленькая буква с с седилью",egrave:"Латинская маленькая буква е с апострофом",eacute:"Латинская маленькая буква е с ударением",ecirc:"Латинская маленькая буква е с циркумфлексом",euml:"Латинская маленькая буква е с тремой",igrave:"Латинская маленькая буква i с апострофом",iacute:"Латинская маленькая буква i с ударением",icirc:"Латинская маленькая буква i с циркумфлексом",iuml:"Латинская маленькая буква i с тремой",eth:"Латинская маленькая буква eth", +ntilde:"Латинская маленькая буква n с тильдой",ograve:"Латинская маленькая буква o с апострофом",oacute:"Латинская маленькая буква o с ударением",ocirc:"Латинская маленькая буква o с циркумфлексом",otilde:"Латинская маленькая буква o с тильдой",ouml:"Латинская маленькая буква o с тремой",divide:"Знак деления",oslash:"Латинская строчная перечеркнутая o",ugrave:"Латинская маленькая буква u с апострофом",uacute:"Латинская маленькая буква u с ударением",ucirc:"Латинская маленькая буква u с циркумфлексом", +uuml:"Латинская маленькая буква u с тремой",yacute:"Латинская маленькая буква y с ударением",thorn:"Латинская маленькая буква thorn",yuml:"Латинская маленькая буква y с тремой",OElig:"Латинская прописная лигатура OE",oelig:"Латинская строчная лигатура oe",372:"Латинская заглавная буква W с циркумфлексом",374:"Латинская заглавная буква Y с циркумфлексом",373:"Латинская маленькая буква w с циркумфлексом",375:"Латинская маленькая буква y с циркумфлексом",sbquo:"Нижняя одинарная кавычка",8219:"Правая одинарная кавычка", +bdquo:"Левая двойная кавычка",hellip:"Горизонтальное многоточие",trade:"Товарный знак",9658:"Черный указатель вправо",bull:"Маркер списка",rarr:"Стрелка вправо",rArr:"Двойная стрелка вправо",hArr:"Двойная стрелка влево-вправо",diams:"Черный ромб",asymp:"Примерно равно"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/si.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/si.js new file mode 100644 index 0000000..eac6894 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/si.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","si",{euro:"යුරෝ සලකුණ",lsquo:"වමේ තනි උපුටා දක්වීම ",rsquo:"දකුණේ තනි උපුටා දක්වීම ",ldquo:"වමේ දිත්ව උපුටා දක්වීම ",rdquo:"දකුණේ දිත්ව උපුටා දක්වීම ",ndash:"En dash",mdash:"Em dash",iexcl:"යටිකුරු හර්ෂදී ",cent:"Cent sign",pound:"Pound sign",curren:"මුල්‍යමය ",yen:"යෙන් ",brvbar:"Broken bar",sect:"තෙරේම් ",uml:"Diaeresis",copy:"පිටපත් අයිතිය ",ordf:"දර්ශකය",laquo:"Left-pointing double angle quotation mark",not:"සලකුණක් නොවේ",reg:"සලකුණක් ලියාපදිංචි කිරීම", +macr:"මුද්‍රිත ",deg:"සලකුණේ ",sup2:"උඩු ලකුණු දෙක",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",Aacute:"Latin capital letter A with acute accent", +Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent", +Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent", +Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above", +aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde", +ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent", +thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer", +bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/sk.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/sk.js new file mode 100644 index 0000000..7a79fb2 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/sk.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","sk",{euro:"Znak eura",lsquo:"Ľavá jednoduchá úvodzovka",rsquo:"Pravá jednoduchá úvodzovka",ldquo:"Pravá dvojitá úvodzovka",rdquo:"Pravá dvojitá úvodzovka",ndash:"En pomlčka",mdash:"Em pomlčka",iexcl:"Obrátený výkričník",cent:"Znak centu",pound:"Znak libry",curren:"Znak meny",yen:"Znak jenu",brvbar:"Prerušená zvislá čiara",sect:"Znak odseku",uml:"Prehláska",copy:"Znak copyrightu",ordf:"Ženský indikátor rodu",laquo:"Znak dvojitých lomených úvodzoviek vľavo",not:"Logistický zápor", +reg:"Znak registrácie",macr:"Pomlčka nad",deg:"Znak stupňa",sup2:"Dvojka ako horný index",sup3:"Trojka ako horný index",acute:"Dĺžeň",micro:"Znak mikro",para:"Znak odstavca",middot:"Bodka uprostred",cedil:"Chvost vľavo",sup1:"Jednotka ako horný index",ordm:"Mužský indikátor rodu",raquo:"Znak dvojitých lomených úvodzoviek vpravo",frac14:"Obyčajný zlomok jedna štvrtina",frac12:"Obyčajný zlomok jedna polovica",frac34:"Obyčajný zlomok tri štvrtiny",iquest:"Otočený otáznik",Agrave:"Veľké písmeno latinky A s accentom", +Aacute:"Veľké písmeno latinky A s dĺžňom",Acirc:"Veľké písmeno latinky A s mäkčeňom",Atilde:"Veľké písmeno latinky A s tildou",Auml:"Veľké písmeno latinky A s dvoma bodkami",Aring:"Veľké písmeno latinky A s krúžkom nad",AElig:"Veľké písmeno latinky Æ",Ccedil:"Veľké písmeno latinky C s chvostom vľavo",Egrave:"Veľké písmeno latinky E s accentom",Eacute:"Veľké písmeno latinky E s dĺžňom",Ecirc:"Veľké písmeno latinky E s mäkčeňom",Euml:"Veľké písmeno latinky E s dvoma bodkami",Igrave:"Veľké písmeno latinky I s accentom", +Iacute:"Veľké písmeno latinky I s dĺžňom",Icirc:"Veľké písmeno latinky I s mäkčeňom",Iuml:"Veľké písmeno latinky I s dvoma bodkami",ETH:"Veľké písmeno latinky Eth",Ntilde:"Veľké písmeno latinky N s tildou",Ograve:"Veľké písmeno latinky O s accentom",Oacute:"Veľké písmeno latinky O s dĺžňom",Ocirc:"Veľké písmeno latinky O s mäkčeňom",Otilde:"Veľké písmeno latinky O s tildou",Ouml:"Veľké písmeno latinky O s dvoma bodkami",times:"Znak násobenia",Oslash:"Veľké písmeno latinky O preškrtnuté",Ugrave:"Veľké písmeno latinky U s accentom", +Uacute:"Veľké písmeno latinky U s dĺžňom",Ucirc:"Veľké písmeno latinky U s mäkčeňom",Uuml:"Veľké písmeno latinky U s dvoma bodkami",Yacute:"Veľké písmeno latinky Y s dĺžňom",THORN:"Veľké písmeno latinky Thorn",szlig:"Malé písmeno latinky ostré s",agrave:"Malé písmeno latinky a s accentom",aacute:"Malé písmeno latinky a s dĺžňom",acirc:"Malé písmeno latinky a s mäkčeňom",atilde:"Malé písmeno latinky a s tildou",auml:"Malé písmeno latinky a s dvoma bodkami",aring:"Malé písmeno latinky a s krúžkom nad", +aelig:"Malé písmeno latinky æ",ccedil:"Malé písmeno latinky c s chvostom vľavo",egrave:"Malé písmeno latinky e s accentom",eacute:"Malé písmeno latinky e s dĺžňom",ecirc:"Malé písmeno latinky e s mäkčeňom",euml:"Malé písmeno latinky e s dvoma bodkami",igrave:"Malé písmeno latinky i s accentom",iacute:"Malé písmeno latinky i s dĺžňom",icirc:"Malé písmeno latinky i s mäkčeňom",iuml:"Malé písmeno latinky i s dvoma bodkami",eth:"Malé písmeno latinky eth",ntilde:"Malé písmeno latinky n s tildou",ograve:"Malé písmeno latinky o s accentom", +oacute:"Malé písmeno latinky o s dĺžňom",ocirc:"Malé písmeno latinky o s mäkčeňom",otilde:"Malé písmeno latinky o s tildou",ouml:"Malé písmeno latinky o s dvoma bodkami",divide:"Znak delenia",oslash:"Malé písmeno latinky o preškrtnuté",ugrave:"Malé písmeno latinky u s accentom",uacute:"Malé písmeno latinky u s dĺžňom",ucirc:"Malé písmeno latinky u s mäkčeňom",uuml:"Malé písmeno latinky u s dvoma bodkami",yacute:"Malé písmeno latinky y s dĺžňom",thorn:"Malé písmeno latinky thorn",yuml:"Malé písmeno latinky y s dvoma bodkami", +OElig:"Veľká ligatúra latinky OE",oelig:"Malá ligatúra latinky OE",372:"Veľké písmeno latinky W s mäkčeňom",374:"Veľké písmeno latinky Y s mäkčeňom",373:"Malé písmeno latinky w s mäkčeňom",375:"Malé písmeno latinky y s mäkčeňom",sbquo:"Dolná jednoduchá 9-úvodzovka",8219:"Horná jednoduchá otočená 9-úvodzovka",bdquo:"Dolná dvojitá 9-úvodzovka",hellip:"Trojbodkový úvod",trade:"Znak ibchodnej značky",9658:"Čierny ukazovateľ smerujúci vpravo",bull:"Kruh",rarr:"Šípka vpravo",rArr:"Dvojitá šipka vpravo", +hArr:"Dvojitá šipka vľavo a vpravo",diams:"Čierne piky",asymp:"Skoro sa rovná"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/sl.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/sl.js new file mode 100644 index 0000000..514e98a --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/sl.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","sl",{euro:"Evro znak",lsquo:"Levi enojni narekovaj",rsquo:"Desni enojni narekovaj",ldquo:"Levi dvojni narekovaj",rdquo:"Desni dvojni narekovaj",ndash:"En pomišljaj",mdash:"Em pomišljaj",iexcl:"Obrnjen klicaj",cent:"Cent znak",pound:"Funt znak",curren:"Znak valute",yen:"Jen znak",brvbar:"Zlomljena črta",sect:"Znak oddelka",uml:"Diaeresis",copy:"Znak avtorskih pravic",ordf:"Ženski zaporedni kazalnik",laquo:"Levi obrnjen dvojni kotni narekovaj",not:"Ne znak",reg:"Registrirani znak", +macr:"Macron",deg:"Znak stopinj",sup2:"Nadpisano dva",sup3:"Nadpisano tri",acute:"Ostrivec",micro:"Mikro znak",para:"Pilcrow znak",middot:"Sredinska pika",cedil:"Cedilla",sup1:"Nadpisano ena",ordm:"Moški zaporedni kazalnik",raquo:"Desno obrnjen dvojni kotni narekovaj",frac14:"Ena četrtina",frac12:"Ena polovica",frac34:"Tri četrtine",iquest:"Obrnjen vprašaj",Agrave:"Velika latinska črka A s krativcem",Aacute:"Velika latinska črka A z ostrivcem",Acirc:"Velika latinska črka A s strešico",Atilde:"Velika latinska črka A z tildo", +Auml:"Velika latinska črka A z diaeresis-om",Aring:"Velika latinska črka A z obročem",AElig:"Velika latinska črka Æ",Ccedil:"Velika latinska črka C s cedillo",Egrave:"Velika latinska črka E s krativcem",Eacute:"Velika latinska črka E z ostrivcem",Ecirc:"Velika latinska črka E s strešico",Euml:"Velika latinska črka E z diaeresis-om",Igrave:"Velika latinska črka I s krativcem",Iacute:"Velika latinska črka I z ostrivcem",Icirc:"Velika latinska črka I s strešico",Iuml:"Velika latinska črka I z diaeresis-om", +ETH:"Velika latinska črka Eth",Ntilde:"Velika latinska črka N s tildo",Ograve:"Velika latinska črka O s krativcem",Oacute:"Velika latinska črka O z ostrivcem",Ocirc:"Velika latinska črka O s strešico",Otilde:"Velika latinska črka O s tildo",Ouml:"Velika latinska črka O z diaeresis-om",times:"Znak za množenje",Oslash:"Velika prečrtana latinska črka O",Ugrave:"Velika latinska črka U s krativcem",Uacute:"Velika latinska črka U z ostrivcem",Ucirc:"Velika latinska črka U s strešico",Uuml:"Velika latinska črka U z diaeresis-om", +Yacute:"Velika latinska črka Y z ostrivcem",THORN:"Velika latinska črka Thorn",szlig:"Mala ostra latinska črka s",agrave:"Mala latinska črka a s krativcem",aacute:"Mala latinska črka a z ostrivcem",acirc:"Mala latinska črka a s strešico",atilde:"Mala latinska črka a s tildo",auml:"Mala latinska črka a z diaeresis-om",aring:"Mala latinska črka a z obročem",aelig:"Mala latinska črka æ",ccedil:"Mala latinska črka c s cedillo",egrave:"Mala latinska črka e s krativcem",eacute:"Mala latinska črka e z ostrivcem", +ecirc:"Mala latinska črka e s strešico",euml:"Mala latinska črka e z diaeresis-om",igrave:"Mala latinska črka i s krativcem",iacute:"Mala latinska črka i z ostrivcem",icirc:"Mala latinska črka i s strešico",iuml:"Mala latinska črka i z diaeresis-om",eth:"Mala latinska črka eth",ntilde:"Mala latinska črka n s tildo",ograve:"Mala latinska črka o s krativcem",oacute:"Mala latinska črka o z ostrivcem",ocirc:"Mala latinska črka o s strešico",otilde:"Mala latinska črka o s tildo",ouml:"Mala latinska črka o z diaeresis-om", +divide:"Znak za deljenje",oslash:"Mala prečrtana latinska črka o",ugrave:"Mala latinska črka u s krativcem",uacute:"Mala latinska črka u z ostrivcem",ucirc:"Mala latinska črka u s strešico",uuml:"Mala latinska črka u z diaeresis-om",yacute:"Mala latinska črka y z ostrivcem",thorn:"Mala latinska črka thorn",yuml:"Mala latinska črka y z diaeresis-om",OElig:"Velika latinska ligatura OE",oelig:"Mala latinska ligatura oe",372:"Velika latinska črka W s strešico",374:"Velika latinska črka Y s strešico", +373:"Mala latinska črka w s strešico",375:"Mala latinska črka y s strešico",sbquo:"Enojni nizki-9 narekovaj",8219:"Enojni visoki-obrnjen-9 narekovaj",bdquo:"Dvojni nizki-9 narekovaj",hellip:"Horizontalni izpust",trade:"Znak blagovne znamke",9658:"Črni desno-usmerjen kazalec",bull:"Krogla",rarr:"Desno-usmerjena puščica",rArr:"Desno-usmerjena dvojna puščica",hArr:"Leva in desna dvojna puščica",diams:"Črna kara",asymp:"Skoraj enako"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/sq.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/sq.js new file mode 100644 index 0000000..bab1b7e --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/sq.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","sq",{euro:"Shenja e Euros",lsquo:"Thonjëza majtas me një vi",rsquo:"Thonjëza djathtas me një vi",ldquo:"Thonjëza majtas",rdquo:"Thonjëza djathtas",ndash:"En viza lidhëse",mdash:"Em viza lidhëse",iexcl:"Pikëçuditëse e përmbysur",cent:"Shenja e Centit",pound:"Shejna e Funtit",curren:"Shenja e valutës",yen:"Shenja e Jenit",brvbar:"Viza e këputur",sect:"Shenja e pjesës",uml:"Diaeresis",copy:"Shenja e të drejtave të kopjimit",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Nuk ka shenjë",reg:"Shenja e të regjistruarit",macr:"Macron",deg:"Shenja e shkallës",sup2:"Super-skripta dy",sup3:"Super-skripta tre",acute:"Theks i mprehtë",micro:"Shjenja e Mikros",para:"Pilcrow sign",middot:"Pika e Mesme",cedil:"Hark nën shkronja",sup1:"Super-skripta një",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Thyesa një të katrat",frac12:"Thyesa një të dytat",frac34:"Thyesa tre të katrat",iquest:"Pikëpyetje e përmbysur",Agrave:"Shkronja e madhe latine A me theks të rëndë", +Aacute:"Shkronja e madhe latine A me theks akute",Acirc:"Shkronja e madhe latine A me theks lakor",Atilde:"Shkronja e madhe latine A me tildë",Auml:"Shkronja e madhe latine A me dy pika",Aring:"Shkronja e madhe latine A me unazë mbi",AElig:"Shkronja e madhe latine Æ",Ccedil:"Shkronja e madhe latine C me hark poshtë",Egrave:"Shkronja e madhe latine E me theks të rëndë",Eacute:"Shkronja e madhe latine E me theks akute",Ecirc:"Shkronja e madhe latine E me theks lakor",Euml:"Shkronja e madhe latine E me dy pika", +Igrave:"Shkronja e madhe latine I me theks të rëndë",Iacute:"Shkronja e madhe latine I me theks akute",Icirc:"Shkronja e madhe latine I me theks lakor",Iuml:"Shkronja e madhe latine I me dy pika",ETH:"Shkronja e madhe latine Eth",Ntilde:"Shkronja e madhe latine N me tildë",Ograve:"Shkronja e madhe latine O me theks të rëndë",Oacute:"Shkronja e madhe latine O me theks akute",Ocirc:"Shkronja e madhe latine O me theks lakor",Otilde:"Shkronja e madhe latine O me tildë",Ouml:"Shkronja e madhe latine O me dy pika", +times:"Shenja e shumëzimit",Oslash:"Shkronja e madhe latine O me vizë në mes",Ugrave:"Shkronja e madhe latine U me theks të rëndë",Uacute:"Shkronja e madhe latine U me theks akute",Ucirc:"Shkronja e madhe latine U me theks lakor",Uuml:"Shkronja e madhe latine U me dy pika",Yacute:"Shkronja e madhe latine Y me theks akute",THORN:"Shkronja e madhe latine Thorn",szlig:"Shkronja e vogë latine s e mprehtë",agrave:"Shkronja e vogë latine a me theks të rëndë",aacute:"Shkronja e vogë latine a me theks të mprehtë", +acirc:"Shkronja e vogël latine a me theks lakor",atilde:"Shkronja e vogël latine a me tildë",auml:"Shkronja e vogël latine a me dy pika",aring:"Shkronja e vogë latine a me unazë mbi",aelig:"Shkronja e vogë latine æ",ccedil:"Shkronja e vogël latine c me hark poshtë",egrave:"Shkronja e vogë latine e me theks të rëndë",eacute:"Shkronja e vogë latine e me theks të mprehtë",ecirc:"Shkronja e vogël latine e me theks lakor",euml:"Shkronja e vogël latine e me dy pika",igrave:"Shkronja e vogë latine i me theks të rëndë", +iacute:"Shkronja e vogë latine i me theks të mprehtë",icirc:"Shkronja e vogël latine i me theks lakor",iuml:"Shkronja e vogël latine i me dy pika",eth:"Shkronja e vogë latine eth",ntilde:"Shkronja e vogël latine n me tildë",ograve:"Shkronja e vogë latine o me theks të rëndë",oacute:"Shkronja e vogë latine o me theks të mprehtë",ocirc:"Shkronja e vogël latine o me theks lakor",otilde:"Shkronja e vogël latine o me tildë",ouml:"Shkronja e vogël latine o me dy pika",divide:"Shenja ndarëse",oslash:"Shkronja e vogël latine o me vizë në mes", +ugrave:"Shkronja e vogë latine u me theks të rëndë",uacute:"Shkronja e vogë latine u me theks të mprehtë",ucirc:"Shkronja e vogël latine u me theks lakor",uuml:"Shkronja e vogël latine u me dy pika",yacute:"Shkronja e vogë latine y me theks të mprehtë",thorn:"Shkronja e vogël latine thorn",yuml:"Shkronja e vogël latine y me dy pika",OElig:"Shkronja e madhe e bashkuar latine OE",oelig:"Shkronja e vogël e bashkuar latine oe",372:"Shkronja e madhe latine W me theks lakor",374:"Shkronja e madhe latine Y me theks lakor", +373:"Shkronja e vogël latine w me theks lakor",375:"Shkronja e vogël latine y me theks lakor",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"Shenja e Simbolit Tregtarë",9658:"Black right-pointing pointer",bull:"Pulla",rarr:"Shigjeta djathtas",rArr:"Shenja të dyfishta djathtas",hArr:"Shigjeta e dyfishë majtas-djathtas",diams:"Black diamond suit",asymp:"Gati e barabar me"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/sv.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/sv.js new file mode 100644 index 0000000..562aba4 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/sv.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","sv",{euro:"Eurotecken",lsquo:"Enkelt vänster citattecken",rsquo:"Enkelt höger citattecken",ldquo:"Dubbelt vänster citattecken",rdquo:"Dubbelt höger citattecken",ndash:"Snedstreck",mdash:"Långt tankstreck",iexcl:"Inverterad utropstecken",cent:"Centtecken",pound:"Pundtecken",curren:"Valutatecken",yen:"Yentecken",brvbar:"Brutet lodrätt streck",sect:"Paragraftecken",uml:"Diaeresis",copy:"Upphovsrättstecken",ordf:"Feminit ordningstalsindikator",laquo:"Vänsterställt dubbelt vinkelcitationstecken", +not:"Icke-tecken",reg:"Registrerad",macr:"Macron",deg:"Grader",sup2:"Upphöjt två",sup3:"Upphöjt tre",acute:"Akut accent",micro:"Mikrotecken",para:"Alinea",middot:"Centrerad prick",cedil:"Cedilj",sup1:"Upphöjt en",ordm:"Maskulina ordningsändelsen",raquo:"Högerställt dubbelt vinkelcitationstecken",frac14:"Bråktal - en kvart",frac12:"Bråktal - en halv",frac34:"Bråktal - tre fjärdedelar",iquest:"Inverterat frågetecken",Agrave:"Stort A med grav accent",Aacute:"Stort A med akutaccent",Acirc:"Stort A med circumflex", +Atilde:"Stort A med tilde",Auml:"Stort A med diaresis",Aring:"Stort A med ring ovan",AElig:"Stort Æ",Ccedil:"Stort C med cedilj",Egrave:"Stort E med grav accent",Eacute:"Stort E med aktuaccent",Ecirc:"Stort E med circumflex",Euml:"Stort E med diaeresis",Igrave:"Stort I med grav accent",Iacute:"Stort I med akutaccent",Icirc:"Stort I med circumflex",Iuml:"Stort I med diaeresis",ETH:"Stort Eth",Ntilde:"Stort N med tilde",Ograve:"Stort O med grav accent",Oacute:"Stort O med aktuaccent",Ocirc:"Stort O med circumflex", +Otilde:"Stort O med tilde",Ouml:"Stort O med diaeresis",times:"Multiplicera",Oslash:"Stor Ø",Ugrave:"Stort U med grav accent",Uacute:"Stort U med akutaccent",Ucirc:"Stort U med circumflex",Uuml:"Stort U med diaeresis",Yacute:"Stort Y med akutaccent",THORN:"Stort Thorn",szlig:"Litet dubbel-s/Eszett",agrave:"Litet a med grav accent",aacute:"Litet a med akutaccent",acirc:"Litet a med circumflex",atilde:"Litet a med tilde",auml:"Litet a med diaeresis",aring:"Litet a med ring ovan",aelig:"Bokstaven æ", +ccedil:"Litet c med cedilj",egrave:"Litet e med grav accent",eacute:"Litet e med akutaccent",ecirc:"Litet e med circumflex",euml:"Litet e med diaeresis",igrave:"Litet i med grav accent",iacute:"Litet i med akutaccent",icirc:"LItet i med circumflex",iuml:"Litet i med didaeresis",eth:"Litet eth",ntilde:"Litet n med tilde",ograve:"LItet o med grav accent",oacute:"LItet o med akutaccent",ocirc:"Litet o med circumflex",otilde:"LItet o med tilde",ouml:"Litet o med diaeresis",divide:"Division",oslash:"ø", +ugrave:"Litet u med grav accent",uacute:"Litet u med akutaccent",ucirc:"LItet u med circumflex",uuml:"Litet u med diaeresis",yacute:"Litet y med akutaccent",thorn:"Litet thorn",yuml:"Litet y med diaeresis",OElig:"Stor ligatur av OE",oelig:"Liten ligatur av oe",372:"Stort W med circumflex",374:"Stort Y med circumflex",373:"Litet w med circumflex",375:"Litet y med circumflex",sbquo:"Enkelt lågt 9-citationstecken",8219:"Enkelt högt bakvänt 9-citationstecken",bdquo:"Dubbelt lågt 9-citationstecken",hellip:"Horisontellt uteslutningstecken", +trade:"Varumärke",9658:"Svart högervänd pekare",bull:"Listpunkt",rarr:"Högerpil",rArr:"Dubbel högerpil",hArr:"Dubbel vänsterpil",diams:"Svart ruter",asymp:"Ungefär lika med"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/th.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/th.js new file mode 100644 index 0000000..77afffc --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/th.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","th",{euro:"Euro sign",lsquo:"Left single quotation mark",rsquo:"Right single quotation mark",ldquo:"Left double quotation mark",rdquo:"Right double quotation mark",ndash:"En dash",mdash:"Em dash",iexcl:"Inverted exclamation mark",cent:"Cent sign",pound:"Pound sign",curren:"สัญลักษณ์สกุลเงิน",yen:"สัญลักษณ์เงินเยน",brvbar:"Broken bar",sect:"Section sign",uml:"Diaeresis",copy:"Copyright sign",ordf:"Feminine ordinal indicator",laquo:"Left-pointing double angle quotation mark", +not:"Not sign",reg:"Registered sign",macr:"Macron",deg:"Degree sign",sup2:"Superscript two",sup3:"Superscript three",acute:"Acute accent",micro:"Micro sign",para:"Pilcrow sign",middot:"Middle dot",cedil:"Cedilla",sup1:"Superscript one",ordm:"Masculine ordinal indicator",raquo:"Right-pointing double angle quotation mark",frac14:"Vulgar fraction one quarter",frac12:"Vulgar fraction one half",frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent", +Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent", +Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke", +Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis", +aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth", +ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis", +yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis", +trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"สัญลักษณ์หัวข้อย่อย",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/tr.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/tr.js new file mode 100644 index 0000000..68836ab --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/tr.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","tr",{euro:"Euro işareti",lsquo:"Sol tek tırnak işareti",rsquo:"Sağ tek tırnak işareti",ldquo:"Sol çift tırnak işareti",rdquo:"Sağ çift tırnak işareti",ndash:"En tire",mdash:"Em tire",iexcl:"Ters ünlem işareti",cent:"Cent işareti",pound:"Pound işareti",curren:"Para birimi işareti",yen:"Yen işareti",brvbar:"Kırık bar",sect:"Bölüm işareti",uml:"İki sesli harfin ayrılması",copy:"Telif hakkı işareti",ordf:"Dişil sıralı gösterge",laquo:"Sol-işaret çift açı tırnak işareti", +not:"Not işareti",reg:"Kayıtlı işareti",macr:"Makron",deg:"Derece işareti",sup2:"İkili üstsimge",sup3:"Üçlü üstsimge",acute:"Aksan işareti",micro:"Mikro işareti",para:"Pilcrow işareti",middot:"Orta nokta",cedil:"Kedilla",sup1:"Üstsimge",ordm:"Eril sıralı gösterge",raquo:"Sağ işaret çift açı tırnak işareti",frac14:"Bayağı kesrin dörtte biri",frac12:"Bayağı kesrin bir yarım",frac34:"Bayağı kesrin dörtte üç",iquest:"Ters soru işareti",Agrave:"Aksanlı latin harfi",Aacute:"Aşırı aksanıyla Latin harfi", +Acirc:"Çarpık Latin harfi",Atilde:"Tilde latin harfi",Auml:"Sesli harf ayrılımlıı latin harfi",Aring:"Halkalı latin büyük A harfi",AElig:"Latin büyük Æ harfi",Ccedil:"Latin büyük C harfi ile kedilla",Egrave:"Aksanlı latin büyük E harfi",Eacute:"Aşırı vurgulu latin büyük E harfi",Ecirc:"Çarpık latin büyük E harfi",Euml:"Sesli harf ayrılımlıı latin büyük E harfi",Igrave:"Aksanlı latin büyük I harfi",Iacute:"Aşırı aksanlı latin büyük I harfi",Icirc:"Çarpık latin büyük I harfi",Iuml:"Sesli harf ayrılımlıı latin büyük I harfi", +ETH:"Latin büyük Eth harfi",Ntilde:"Tildeli latin büyük N harfi",Ograve:"Aksanlı latin büyük O harfi",Oacute:"Aşırı aksanlı latin büyük O harfi",Ocirc:"Çarpık latin büyük O harfi",Otilde:"Tildeli latin büyük O harfi",Ouml:"Sesli harf ayrılımlı latin büyük O harfi",times:"Çarpma işareti",Oslash:"Vurgulu latin büyük O harfi",Ugrave:"Aksanlı latin büyük U harfi",Uacute:"Aşırı aksanlı latin büyük U harfi",Ucirc:"Çarpık latin büyük U harfi",Uuml:"Sesli harf ayrılımlı latin büyük U harfi",Yacute:"Aşırı aksanlı latin büyük Y harfi", +THORN:"Latin büyük Thorn harfi",szlig:"Latin küçük keskin s harfi",agrave:"Aksanlı latin küçük a harfi",aacute:"Aşırı aksanlı latin küçük a harfi",acirc:"Çarpık latin küçük a harfi",atilde:"Tildeli latin küçük a harfi",auml:"Sesli harf ayrılımlı latin küçük a harfi",aring:"Halkalı latin küçük a harfi",aelig:"Latin büyük æ harfi",ccedil:"Kedillalı latin küçük c harfi",egrave:"Aksanlı latin küçük e harfi",eacute:"Aşırı aksanlı latin küçük e harfi",ecirc:"Çarpık latin küçük e harfi",euml:"Sesli harf ayrılımlı latin küçük e harfi", +igrave:"Aksanlı latin küçük i harfi",iacute:"Aşırı aksanlı latin küçük i harfi",icirc:"Çarpık latin küçük i harfi",iuml:"Sesli harf ayrılımlı latin küçük i harfi",eth:"Latin küçük eth harfi",ntilde:"Tildeli latin küçük n harfi",ograve:"Aksanlı latin küçük o harfi",oacute:"Aşırı aksanlı latin küçük o harfi",ocirc:"Çarpık latin küçük o harfi",otilde:"Tildeli latin küçük o harfi",ouml:"Sesli harf ayrılımlı latin küçük o harfi",divide:"Bölme işareti",oslash:"Vurgulu latin küçük o harfi",ugrave:"Aksanlı latin küçük u harfi", +uacute:"Aşırı aksanlı latin küçük u harfi",ucirc:"Çarpık latin küçük u harfi",uuml:"Sesli harf ayrılımlı latin küçük u harfi",yacute:"Aşırı aksanlı latin küçük y harfi",thorn:"Latin küçük thorn harfi",yuml:"Sesli harf ayrılımlı latin küçük y harfi",OElig:"Latin büyük bağlı OE harfi",oelig:"Latin küçük bağlı oe harfi",372:"Çarpık latin büyük W harfi",374:"Çarpık latin büyük Y harfi",373:"Çarpık latin küçük w harfi",375:"Çarpık latin küçük y harfi",sbquo:"Tek düşük-9 tırnak işareti",8219:"Tek yüksek-ters-9 tırnak işareti", +bdquo:"Çift düşük-9 tırnak işareti",hellip:"Yatay elips",trade:"Marka tescili işareti",9658:"Siyah sağ işaret işaretçisi",bull:"Koyu nokta",rarr:"Sağa doğru ok",rArr:"Sağa doğru çift ok",hArr:"Sol, sağ çift ok",diams:"Siyah elmas takımı",asymp:"Hemen hemen eşit"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/ug.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/ug.js new file mode 100644 index 0000000..783aa37 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/ug.js @@ -0,0 +1,13 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","ug",{euro:"ياۋرو بەلگىسى",lsquo:"يالاڭ پەش سول",rsquo:"يالاڭ پەش ئوڭ",ldquo:"قوش پەش سول",rdquo:"قوش پەش ئوڭ",ndash:"سىزىقچە",mdash:"سىزىق",iexcl:"ئۈندەش",cent:"تىيىن بەلگىسى",pound:"فوند ستېرلىڭ",curren:"پۇل بەلگىسى",yen:"ياپونىيە يىنى",brvbar:"ئۈزۈك بالداق",sect:"پاراگراف بەلگىسى",uml:"تاۋۇش ئايرىش بەلگىسى",copy:"نەشر ھوقۇقى بەلگىسى",ordf:"Feminine ordinal indicator",laquo:"قوش تىرناق سول",not:"غەيرى بەلگە",reg:"خەتلەتكەن تاۋار ماركىسى",macr:"سوزۇش بەلگىسى", +deg:"گىرادۇس بەلگىسى",sup2:"يۇقىرى ئىندېكىس 2",sup3:"يۇقىرى ئىندېكىس 3",acute:"ئۇرغۇ بەلگىسى",micro:"Micro sign",para:"ئابزاس بەلگىسى",middot:"ئوتتۇرا چېكىت",cedil:"ئاستىغا قوشۇلىدىغان بەلگە",sup1:"يۇقىرى ئىندېكىس 1",ordm:"Masculine ordinal indicator",raquo:"قوش تىرناق ئوڭ",frac14:"ئاددىي كەسىر تۆتتىن بىر",frac12:"ئاددىي كەسىر ئىككىدىن بىر",frac34:"ئاددىي كەسىر ئۈچتىن تۆرت",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",Aacute:"Latin capital letter A with acute accent", +Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"Latin capital letter A with diaeresis",Aring:"Latin capital letter A with ring above",AElig:"Latin Capital letter Æ",Ccedil:"Latin capital letter C with cedilla",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis",Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent", +Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"قوش پەش ئوڭ",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis",times:"Multiplication sign",Oslash:"Latin capital letter O with stroke",Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent", +Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde",auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",aelig:"Latin small letter æ", +ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis",eth:"Latin small letter eth",ntilde:"تىك موللاق سوئال بەلگىسى",ograve:"Latin small letter o with grave accent", +oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"بۆلۈش بەلگىسى",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex",uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn", +yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark",hellip:"Horizontal ellipsis",trade:"خەتلەتكەن تاۋار ماركىسى بەلگىسى",9658:"Black right-pointing pointer", +bull:"Bullet",rarr:"ئوڭ يا ئوق",rArr:"ئوڭ قوش سىزىق يا ئوق",hArr:"ئوڭ سول قوش سىزىق يا ئوق",diams:"ئۇيۇل غىچ",asymp:"تەخمىنەن تەڭ"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/uk.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/uk.js new file mode 100644 index 0000000..7cb1680 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/uk.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","uk",{euro:"Знак євро",lsquo:"Ліві одинарні лапки",rsquo:"Праві одинарні лапки",ldquo:"Ліві подвійні лапки",rdquo:"Праві подвійні лапки",ndash:"Середнє тире",mdash:"Довге тире",iexcl:"Перевернутий знак оклику",cent:"Знак цента",pound:"Знак фунта",curren:"Знак валюти",yen:"Знак єни",brvbar:"Переривчаста вертикальна лінія",sect:"Знак параграфу",uml:"Умлаут",copy:"Знак авторських прав",ordf:"Жіночий порядковий вказівник",laquo:"ліві вказівні подвійні кутові дужки", +not:"Заперечення",reg:"Знак охорони суміжних прав",macr:"Макрон",deg:"Знак градуса",sup2:"два у верхньому індексі",sup3:"три у верхньому індексі",acute:"Знак акута",micro:"Знак мікро",para:"Знак абзацу",middot:"Інтерпункт",cedil:"Седиль",sup1:"Один у верхньому індексі",ordm:"Чоловічий порядковий вказівник",raquo:"праві вказівні подвійні кутові дужки",frac14:"Одна четвертина",frac12:"Одна друга",frac34:"три четвертих",iquest:"Перевернутий знак питання",Agrave:"Велика латинська A з гравісом",Aacute:"Велика латинська А з акутом", +Acirc:"Велика латинська А з циркумфлексом",Atilde:"Велика латинська А з тильдою",Auml:"Велике латинське А з умлаутом",Aring:"Велика латинська A з кільцем згори",AElig:"Велика латинська Æ",Ccedil:"Велика латинська C з седиллю",Egrave:"Велика латинська E з гравісом",Eacute:"Велика латинська E з акутом",Ecirc:"Велика латинська E з циркумфлексом",Euml:"Велика латинська А з умлаутом",Igrave:"Велика латинська I з гравісом",Iacute:"Велика латинська I з акутом",Icirc:"Велика латинська I з циркумфлексом", +Iuml:"Велика латинська І з умлаутом",ETH:"Велика латинська Eth",Ntilde:"Велика латинська N з тильдою",Ograve:"Велика латинська O з гравісом",Oacute:"Велика латинська O з акутом",Ocirc:"Велика латинська O з циркумфлексом",Otilde:"Велика латинська O з тильдою",Ouml:"Велика латинська О з умлаутом",times:"Знак множення",Oslash:"Велика латинська перекреслена O ",Ugrave:"Велика латинська U з гравісом",Uacute:"Велика латинська U з акутом",Ucirc:"Велика латинська U з циркумфлексом",Uuml:"Велика латинська U з умлаутом", +Yacute:"Велика латинська Y з акутом",THORN:"Велика латинська Торн",szlig:"Мала латинська есцет",agrave:"Мала латинська a з гравісом",aacute:"Мала латинська a з акутом",acirc:"Мала латинська a з циркумфлексом",atilde:"Мала латинська a з тильдою",auml:"Мала латинська a з умлаутом",aring:"Мала латинська a з кільцем згори",aelig:"Мала латинська æ",ccedil:"Мала латинська C з седиллю",egrave:"Мала латинська e з гравісом",eacute:"Мала латинська e з акутом",ecirc:"Мала латинська e з циркумфлексом",euml:"Мала латинська e з умлаутом", +igrave:"Мала латинська i з гравісом",iacute:"Мала латинська i з акутом",icirc:"Мала латинська i з циркумфлексом",iuml:"Мала латинська i з умлаутом",eth:"Мала латинська Eth",ntilde:"Мала латинська n з тильдою",ograve:"Мала латинська o з гравісом",oacute:"Мала латинська o з акутом",ocirc:"Мала латинська o з циркумфлексом",otilde:"Мала латинська o з тильдою",ouml:"Мала латинська o з умлаутом",divide:"Знак ділення",oslash:"Мала латинська перекреслена o",ugrave:"Мала латинська u з гравісом",uacute:"Мала латинська u з акутом", +ucirc:"Мала латинська u з циркумфлексом",uuml:"Мала латинська u з умлаутом",yacute:"Мала латинська y з акутом",thorn:"Мала латинська торн",yuml:"Мала латинська y з умлаутом",OElig:"Велика латинська лігатура OE",oelig:"Мала латинська лігатура oe",372:"Велика латинська W з циркумфлексом",374:"Велика латинська Y з циркумфлексом",373:"Мала латинська w з циркумфлексом",375:"Мала латинська y з циркумфлексом",sbquo:"Одиничні нижні лабки",8219:"Верхні одиничні обернені лабки",bdquo:"Подвійні нижні лабки", +hellip:"Три крапки",trade:"Знак торгової марки",9658:"Чорний правий вказівник",bull:"Маркер списку",rarr:"Стрілка вправо",rArr:"Подвійна стрілка вправо",hArr:"Подвійна стрілка вліво-вправо",diams:"Чорний діамонт",asymp:"Наближено дорівнює"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/vi.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/vi.js new file mode 100644 index 0000000..03a5b75 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/vi.js @@ -0,0 +1,14 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","vi",{euro:"Ký hiệu Euro",lsquo:"Dấu ngoặc đơn trái",rsquo:"Dấu ngoặc đơn phải",ldquo:"Dấu ngoặc đôi trái",rdquo:"Dấu ngoặc đôi phải",ndash:"Gạch ngang tiếng anh",mdash:"Gạch ngang Em",iexcl:"Chuyển đổi dấu chấm than",cent:"Ký tự tiền Mỹ",pound:"Ký tự tiền Anh",curren:"Ký tự tiền tệ",yen:"Ký tự tiền Yên Nhật",brvbar:"Thanh hỏng",sect:"Ký tự khu vực",uml:"Dấu tách đôi",copy:"Ký tự bản quyền",ordf:"Phần chỉ thị giống cái",laquo:"Chọn dấu ngoặc đôi trái",not:"Không có ký tự", +reg:"Ký tự đăng ký",macr:"Dấu nguyên âm dài",deg:"Ký tự độ",sup2:"Chữ trồi lên trên dạng 2",sup3:"Chữ trồi lên trên dạng 3",acute:"Dấu trọng âm",micro:"Ký tự micro",para:"Ký tự đoạn văn",middot:"Dấu chấm tròn",cedil:"Dấu móc lưới",sup1:"Ký tự trồi lên cấp 1",ordm:"Ký tự biểu hiện giống đực",raquo:"Chọn dấu ngoặc đôi phải",frac14:"Tỉ lệ một phần tư",frac12:"Tỉ lệ một nửa",frac34:"Tỉ lệ ba phần tư",iquest:"Chuyển đổi dấu chấm hỏi",Agrave:"Ký tự la-tinh viết hoa A với dấu huyền",Aacute:"Ký tự la-tinh viết hoa A với dấu sắc", +Acirc:"Ký tự la-tinh viết hoa A với dấu mũ",Atilde:"Ký tự la-tinh viết hoa A với dấu ngã",Auml:"Ký tự la-tinh viết hoa A với dấu hai chấm trên đầu",Aring:"Ký tự la-tinh viết hoa A với biểu tượng vòng tròn trên đầu",AElig:"Ký tự la-tinh viết hoa của Æ",Ccedil:"Ký tự la-tinh viết hoa C với dấu móc bên dưới",Egrave:"Ký tự la-tinh viết hoa E với dấu huyền",Eacute:"Ký tự la-tinh viết hoa E với dấu sắc",Ecirc:"Ký tự la-tinh viết hoa E với dấu mũ",Euml:"Ký tự la-tinh viết hoa E với dấu hai chấm trên đầu", +Igrave:"Ký tự la-tinh viết hoa I với dấu huyền",Iacute:"Ký tự la-tinh viết hoa I với dấu sắc",Icirc:"Ký tự la-tinh viết hoa I với dấu mũ",Iuml:"Ký tự la-tinh viết hoa I với dấu hai chấm trên đầu",ETH:"Viết hoa của ký tự Eth",Ntilde:"Ký tự la-tinh viết hoa N với dấu ngã",Ograve:"Ký tự la-tinh viết hoa O với dấu huyền",Oacute:"Ký tự la-tinh viết hoa O với dấu sắc",Ocirc:"Ký tự la-tinh viết hoa O với dấu mũ",Otilde:"Ký tự la-tinh viết hoa O với dấu ngã",Ouml:"Ký tự la-tinh viết hoa O với dấu hai chấm trên đầu", +times:"Ký tự phép toán nhân",Oslash:"Ký tự la-tinh viết hoa A với dấu ngã xuống",Ugrave:"Ký tự la-tinh viết hoa U với dấu huyền",Uacute:"Ký tự la-tinh viết hoa U với dấu sắc",Ucirc:"Ký tự la-tinh viết hoa U với dấu mũ",Uuml:"Ký tự la-tinh viết hoa U với dấu hai chấm trên đầu",Yacute:"Ký tự la-tinh viết hoa Y với dấu sắc",THORN:"Phần viết hoa của ký tự Thorn",szlig:"Ký tự viết nhỏ la-tinh của chữ s",agrave:"Ký tự la-tinh thường với dấu huyền",aacute:"Ký tự la-tinh thường với dấu sắc",acirc:"Ký tự la-tinh thường với dấu mũ", +atilde:"Ký tự la-tinh thường với dấu ngã",auml:"Ký tự la-tinh thường với dấu hai chấm trên đầu",aring:"Ký tự la-tinh viết thường với biểu tượng vòng tròn trên đầu",aelig:"Ký tự la-tinh viết thường của æ",ccedil:"Ký tự la-tinh viết thường của c với dấu móc bên dưới",egrave:"Ký tự la-tinh viết thường e với dấu huyền",eacute:"Ký tự la-tinh viết thường e với dấu sắc",ecirc:"Ký tự la-tinh viết thường e với dấu mũ",euml:"Ký tự la-tinh viết thường e với dấu hai chấm trên đầu",igrave:"Ký tự la-tinh viết thường i với dấu huyền", +iacute:"Ký tự la-tinh viết thường i với dấu sắc",icirc:"Ký tự la-tinh viết thường i với dấu mũ",iuml:"Ký tự la-tinh viết thường i với dấu hai chấm trên đầu",eth:"Ký tự la-tinh viết thường của eth",ntilde:"Ký tự la-tinh viết thường n với dấu ngã",ograve:"Ký tự la-tinh viết thường o với dấu huyền",oacute:"Ký tự la-tinh viết thường o với dấu sắc",ocirc:"Ký tự la-tinh viết thường o với dấu mũ",otilde:"Ký tự la-tinh viết thường o với dấu ngã",ouml:"Ký tự la-tinh viết thường o với dấu hai chấm trên đầu", +divide:"Ký hiệu phép tính chia",oslash:"Ký tự la-tinh viết thường o với dấu ngã",ugrave:"Ký tự la-tinh viết thường u với dấu huyền",uacute:"Ký tự la-tinh viết thường u với dấu sắc",ucirc:"Ký tự la-tinh viết thường u với dấu mũ",uuml:"Ký tự la-tinh viết thường u với dấu hai chấm trên đầu",yacute:"Ký tự la-tinh viết thường y với dấu sắc",thorn:"Ký tự la-tinh viết thường của chữ thorn",yuml:"Ký tự la-tinh viết thường y với dấu hai chấm trên đầu",OElig:"Ký tự la-tinh viết hoa gạch nối OE",oelig:"Ký tự la-tinh viết thường gạch nối OE", +372:"Ký tự la-tinh viết hoa W với dấu mũ",374:"Ký tự la-tinh viết hoa Y với dấu mũ",373:"Ký tự la-tinh viết thường w với dấu mũ",375:"Ký tự la-tinh viết thường y với dấu mũ",sbquo:"Dấu ngoặc đơn thấp số-9",8219:"Dấu ngoặc đơn đảo ngược số-9",bdquo:"Gấp đôi dấu ngoặc đơn số-9",hellip:"Tĩnh dược chiều ngang",trade:"Ký tự thương hiệu",9658:"Ký tự trỏ về hướng bên phải màu đen",bull:"Ký hiệu",rarr:"Mũi tên hướng bên phải",rArr:"Mũi tên hướng bên phải dạng đôi",hArr:"Mũi tên hướng bên trái dạng đôi",diams:"Ký hiệu hình thoi", +asymp:"Gần bằng với"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js new file mode 100644 index 0000000..aa42b83 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js @@ -0,0 +1,9 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","zh-cn",{euro:"欧元符号",lsquo:"左单引号",rsquo:"右单引号",ldquo:"左双引号",rdquo:"右双引号",ndash:"短划线",mdash:"长划线",iexcl:"竖翻叹号",cent:"分币符号",pound:"英镑符号",curren:"货币符号",yen:"日元符号",brvbar:"间断条",sect:"节标记",uml:"分音符",copy:"版权所有标记",ordf:"阴性顺序指示符",laquo:"左指双尖引号",not:"非标记",reg:"注册标记",macr:"长音符",deg:"度标记",sup2:"上标二",sup3:"上标三",acute:"锐音符",micro:"微符",para:"段落标记",middot:"中间点",cedil:"下加符",sup1:"上标一",ordm:"阳性顺序指示符",raquo:"右指双尖引号",frac14:"普通分数四分之一",frac12:"普通分数二分之一",frac34:"普通分数四分之三",iquest:"竖翻问号", +Agrave:"带抑音符的拉丁文大写字母 A",Aacute:"带锐音符的拉丁文大写字母 A",Acirc:"带扬抑符的拉丁文大写字母 A",Atilde:"带颚化符的拉丁文大写字母 A",Auml:"带分音符的拉丁文大写字母 A",Aring:"带上圆圈的拉丁文大写字母 A",AElig:"拉丁文大写字母 Ae",Ccedil:"带下加符的拉丁文大写字母 C",Egrave:"带抑音符的拉丁文大写字母 E",Eacute:"带锐音符的拉丁文大写字母 E",Ecirc:"带扬抑符的拉丁文大写字母 E",Euml:"带分音符的拉丁文大写字母 E",Igrave:"带抑音符的拉丁文大写字母 I",Iacute:"带锐音符的拉丁文大写字母 I",Icirc:"带扬抑符的拉丁文大写字母 I",Iuml:"带分音符的拉丁文大写字母 I",ETH:"拉丁文大写字母 Eth",Ntilde:"带颚化符的拉丁文大写字母 N",Ograve:"带抑音符的拉丁文大写字母 O",Oacute:"带锐音符的拉丁文大写字母 O",Ocirc:"带扬抑符的拉丁文大写字母 O",Otilde:"带颚化符的拉丁文大写字母 O", +Ouml:"带分音符的拉丁文大写字母 O",times:"乘号",Oslash:"带粗线的拉丁文大写字母 O",Ugrave:"带抑音符的拉丁文大写字母 U",Uacute:"带锐音符的拉丁文大写字母 U",Ucirc:"带扬抑符的拉丁文大写字母 U",Uuml:"带分音符的拉丁文大写字母 U",Yacute:"带抑音符的拉丁文大写字母 Y",THORN:"拉丁文大写字母 Thorn",szlig:"拉丁文小写字母清音 S",agrave:"带抑音符的拉丁文小写字母 A",aacute:"带锐音符的拉丁文小写字母 A",acirc:"带扬抑符的拉丁文小写字母 A",atilde:"带颚化符的拉丁文小写字母 A",auml:"带分音符的拉丁文小写字母 A",aring:"带上圆圈的拉丁文小写字母 A",aelig:"拉丁文小写字母 Ae",ccedil:"带下加符的拉丁文小写字母 C",egrave:"带抑音符的拉丁文小写字母 E",eacute:"带锐音符的拉丁文小写字母 E",ecirc:"带扬抑符的拉丁文小写字母 E",euml:"带分音符的拉丁文小写字母 E",igrave:"带抑音符的拉丁文小写字母 I", +iacute:"带锐音符的拉丁文小写字母 I",icirc:"带扬抑符的拉丁文小写字母 I",iuml:"带分音符的拉丁文小写字母 I",eth:"拉丁文小写字母 Eth",ntilde:"带颚化符的拉丁文小写字母 N",ograve:"带抑音符的拉丁文小写字母 O",oacute:"带锐音符的拉丁文小写字母 O",ocirc:"带扬抑符的拉丁文小写字母 O",otilde:"带颚化符的拉丁文小写字母 O",ouml:"带分音符的拉丁文小写字母 O",divide:"除号",oslash:"带粗线的拉丁文小写字母 O",ugrave:"带抑音符的拉丁文小写字母 U",uacute:"带锐音符的拉丁文小写字母 U",ucirc:"带扬抑符的拉丁文小写字母 U",uuml:"带分音符的拉丁文小写字母 U",yacute:"带抑音符的拉丁文小写字母 Y",thorn:"拉丁文小写字母 Thorn",yuml:"带分音符的拉丁文小写字母 Y",OElig:"拉丁文大写连字 Oe",oelig:"拉丁文小写连字 Oe",372:"带扬抑符的拉丁文大写字母 W",374:"带扬抑符的拉丁文大写字母 Y", +373:"带扬抑符的拉丁文小写字母 W",375:"带扬抑符的拉丁文小写字母 Y",sbquo:"单下 9 形引号",8219:"单高横翻 9 形引号",bdquo:"双下 9 形引号",hellip:"水平省略号",trade:"商标标志",9658:"实心右指指针",bull:"加重号",rarr:"向右箭头",rArr:"向右双线箭头",hArr:"左右双线箭头",diams:"实心方块纸牌",asymp:"约等于"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/zh.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/zh.js new file mode 100644 index 0000000..b6e08be --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/lang/zh.js @@ -0,0 +1,12 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.plugins.setLang("specialchar","zh",{euro:"歐元符號",lsquo:"左單引號",rsquo:"右單引號",ldquo:"左雙引號",rdquo:"右雙引號",ndash:"短破折號",mdash:"長破折號",iexcl:"倒置的驚嘆號",cent:"美分符號",pound:"英鎊符號",curren:"貨幣符號",yen:"日圓符號",brvbar:"Broken bar",sect:"章節符號",uml:"分音符號",copy:"版權符號",ordf:"雌性符號",laquo:"左雙角括號",not:"Not 符號",reg:"註冊商標符號",macr:"長音符號",deg:"度數符號",sup2:"上標字 2",sup3:"上標字 3",acute:"尖音符號",micro:"Micro sign",para:"段落符號",middot:"中間點",cedil:"字母 C 下面的尾型符號 ",sup1:"上標",ordm:"雄性符號",raquo:"右雙角括號",frac14:"四分之一符號",frac12:"Vulgar fraction one half", +frac34:"Vulgar fraction three quarters",iquest:"Inverted question mark",Agrave:"Latin capital letter A with grave accent",Aacute:"Latin capital letter A with acute accent",Acirc:"Latin capital letter A with circumflex",Atilde:"Latin capital letter A with tilde",Auml:"拉丁大寫字母 E 帶分音符號",Aring:"拉丁大寫字母 A 帶上圓圈",AElig:"拉丁大寫字母 Æ",Ccedil:"拉丁大寫字母 C 帶下尾符號",Egrave:"Latin capital letter E with grave accent",Eacute:"Latin capital letter E with acute accent",Ecirc:"Latin capital letter E with circumflex",Euml:"Latin capital letter E with diaeresis", +Igrave:"Latin capital letter I with grave accent",Iacute:"Latin capital letter I with acute accent",Icirc:"Latin capital letter I with circumflex",Iuml:"Latin capital letter I with diaeresis",ETH:"Latin capital letter Eth",Ntilde:"Latin capital letter N with tilde",Ograve:"Latin capital letter O with grave accent",Oacute:"Latin capital letter O with acute accent",Ocirc:"Latin capital letter O with circumflex",Otilde:"Latin capital letter O with tilde",Ouml:"Latin capital letter O with diaeresis", +times:"乘號",Oslash:"拉丁大寫字母 O 帶粗線符號",Ugrave:"Latin capital letter U with grave accent",Uacute:"Latin capital letter U with acute accent",Ucirc:"Latin capital letter U with circumflex",Uuml:"Latin capital letter U with diaeresis",Yacute:"Latin capital letter Y with acute accent",THORN:"Latin capital letter Thorn",szlig:"Latin small letter sharp s",agrave:"Latin small letter a with grave accent",aacute:"Latin small letter a with acute accent",acirc:"Latin small letter a with circumflex",atilde:"Latin small letter a with tilde", +auml:"Latin small letter a with diaeresis",aring:"Latin small letter a with ring above",aelig:"Latin small letter æ",ccedil:"Latin small letter c with cedilla",egrave:"Latin small letter e with grave accent",eacute:"Latin small letter e with acute accent",ecirc:"Latin small letter e with circumflex",euml:"Latin small letter e with diaeresis",igrave:"Latin small letter i with grave accent",iacute:"Latin small letter i with acute accent",icirc:"Latin small letter i with circumflex",iuml:"Latin small letter i with diaeresis", +eth:"Latin small letter eth",ntilde:"Latin small letter n with tilde",ograve:"Latin small letter o with grave accent",oacute:"Latin small letter o with acute accent",ocirc:"Latin small letter o with circumflex",otilde:"Latin small letter o with tilde",ouml:"Latin small letter o with diaeresis",divide:"Division sign",oslash:"Latin small letter o with stroke",ugrave:"Latin small letter u with grave accent",uacute:"Latin small letter u with acute accent",ucirc:"Latin small letter u with circumflex", +uuml:"Latin small letter u with diaeresis",yacute:"Latin small letter y with acute accent",thorn:"Latin small letter thorn",yuml:"Latin small letter y with diaeresis",OElig:"Latin capital ligature OE",oelig:"Latin small ligature oe",372:"Latin capital letter W with circumflex",374:"Latin capital letter Y with circumflex",373:"Latin small letter w with circumflex",375:"Latin small letter y with circumflex",sbquo:"Single low-9 quotation mark",8219:"Single high-reversed-9 quotation mark",bdquo:"Double low-9 quotation mark", +hellip:"Horizontal ellipsis",trade:"Trade mark sign",9658:"Black right-pointing pointer",bull:"Bullet",rarr:"Rightwards arrow",rArr:"Rightwards double arrow",hArr:"Left right double arrow",diams:"Black diamond suit",asymp:"Almost equal to"}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/specialchar.js b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/specialchar.js new file mode 100644 index 0000000..7f4348c --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/specialchar/dialogs/specialchar.js @@ -0,0 +1,14 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("specialchar",function(i){var e,l=i.lang.specialchar,k=function(c){var b,c=c.data?c.data.getTarget():new CKEDITOR.dom.element(c);if("a"==c.getName()&&(b=c.getChild(0).getHtml()))c.removeClass("cke_light_background"),e.hide(),c=i.document.createElement("span"),c.setHtml(b),i.insertText(c.getText())},m=CKEDITOR.tools.addFunction(k),j,g=function(c,b){var a,b=b||c.data.getTarget();"span"==b.getName()&&(b=b.getParent());if("a"==b.getName()&&(a=b.getChild(0).getHtml())){j&&d(null,j); +var f=e.getContentElement("info","htmlPreview").getElement();e.getContentElement("info","charPreview").getElement().setHtml(a);f.setHtml(CKEDITOR.tools.htmlEncode(a));b.getParent().addClass("cke_light_background");j=b}},d=function(c,b){b=b||c.data.getTarget();"span"==b.getName()&&(b=b.getParent());"a"==b.getName()&&(e.getContentElement("info","charPreview").getElement().setHtml("&nbsp;"),e.getContentElement("info","htmlPreview").getElement().setHtml("&nbsp;"),b.getParent().removeClass("cke_light_background"), +j=void 0)},n=CKEDITOR.tools.addFunction(function(c){var c=new CKEDITOR.dom.event(c),b=c.getTarget(),a;a=c.getKeystroke();var f="rtl"==i.lang.dir;switch(a){case 38:if(a=b.getParent().getParent().getPrevious())a=a.getChild([b.getParent().getIndex(),0]),a.focus(),d(null,b),g(null,a);c.preventDefault();break;case 40:if(a=b.getParent().getParent().getNext())if((a=a.getChild([b.getParent().getIndex(),0]))&&1==a.type)a.focus(),d(null,b),g(null,a);c.preventDefault();break;case 32:k({data:c});c.preventDefault(); +break;case f?37:39:if(a=b.getParent().getNext())a=a.getChild(0),1==a.type?(a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):d(null,b);else if(a=b.getParent().getParent().getNext())(a=a.getChild([0,0]))&&1==a.type?(a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):d(null,b);break;case f?39:37:(a=b.getParent().getPrevious())?(a=a.getChild(0),a.focus(),d(null,b),g(null,a),c.preventDefault(!0)):(a=b.getParent().getParent().getPrevious())?(a=a.getLast().getChild(0),a.focus(),d(null,b),g(null,a),c.preventDefault(!0)): +d(null,b)}});return{title:l.title,minWidth:430,minHeight:280,buttons:[CKEDITOR.dialog.cancelButton],charColumns:17,onLoad:function(){for(var c=this.definition.charColumns,b=i.config.specialChars,a=CKEDITOR.tools.getNextId()+"_specialchar_table_label",f=['<table role="listbox" aria-labelledby="'+a+'" style="width: 320px; height: 100%; border-collapse: separate;" align="center" cellspacing="2" cellpadding="2" border="0">'],d=0,g=b.length,h,e;d<g;){f.push('<tr role="presentation">');for(var j=0;j<c;j++, +d++){if(h=b[d]){h instanceof Array?(e=h[1],h=h[0]):(e=h.replace("&","").replace(";","").replace("#",""),e=l[e]||h);var k="cke_specialchar_label_"+d+"_"+CKEDITOR.tools.getNextNumber();f.push('<td class="cke_dark_background" style="cursor: default" role="presentation"><a href="javascript: void(0);" role="option" aria-posinset="'+(d+1)+'"',' aria-setsize="'+g+'"',' aria-labelledby="'+k+'"',' class="cke_specialchar" title="',CKEDITOR.tools.htmlEncode(e),'" onkeydown="CKEDITOR.tools.callFunction( '+n+ +', event, this )" onclick="CKEDITOR.tools.callFunction('+m+', this); return false;" tabindex="-1"><span style="margin: 0 auto;cursor: inherit">'+h+'</span><span class="cke_voice_label" id="'+k+'">'+e+"</span></a>")}else f.push('<td class="cke_dark_background">&nbsp;');f.push("</td>")}f.push("</tr>")}f.push("</tbody></table>",'<span id="'+a+'" class="cke_voice_label">'+l.options+"</span>");this.getContentElement("info","charContainer").getElement().setHtml(f.join(""))},contents:[{id:"info",label:i.lang.common.generalTab, +title:i.lang.common.generalTab,padding:0,align:"top",elements:[{type:"hbox",align:"top",widths:["320px","90px"],children:[{type:"html",id:"charContainer",html:"",onMouseover:g,onMouseout:d,focus:function(){var c=this.getElement().getElementsByTag("a").getItem(0);setTimeout(function(){c.focus();g(null,c)},0)},onShow:function(){var c=this.getElement().getChild([0,0,0,0,0]);setTimeout(function(){c.focus();g(null,c)},0)},onLoad:function(c){e=c.sender}},{type:"hbox",align:"top",widths:["100%"],children:[{type:"vbox", +align:"top",children:[{type:"html",html:"<div></div>"},{type:"html",id:"charPreview",className:"cke_dark_background",style:"border:1px solid #eeeeee;font-size:28px;height:40px;width:70px;padding-top:9px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;text-align:center;",html:"<div>&nbsp;</div>"},{type:"html",id:"htmlPreview",className:"cke_dark_background",style:"border:1px solid #eeeeee;font-size:14px;height:20px;width:70px;padding-top:2px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;text-align:center;", +html:"<div>&nbsp;</div>"}]}]}]}]}]}}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/table/dialogs/table.js b/theme/bootstrap/plugins/ckeditor/plugins/table/dialogs/table.js new file mode 100644 index 0000000..cc0b646 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/table/dialogs/table.js @@ -0,0 +1,21 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +(function(){function r(a){for(var e=0,l=0,k=0,m,g=a.$.rows.length;k<g;k++){m=a.$.rows[k];for(var d=e=0,c,b=m.cells.length;d<b;d++)c=m.cells[d],e+=c.colSpan;e>l&&(l=e)}return l}function o(a){return function(){var e=this.getValue(),e=!!(CKEDITOR.dialog.validate.integer()(e)&&0<e);e||(alert(a),this.select());return e}}function n(a,e){var l=function(g){return new CKEDITOR.dom.element(g,a.document)},n=a.editable(),m=a.plugins.dialogadvtab;return{title:a.lang.table.title,minWidth:310,minHeight:CKEDITOR.env.ie? +310:280,onLoad:function(){var g=this,a=g.getContentElement("advanced","advStyles");if(a)a.on("change",function(){var a=this.getStyle("width",""),b=g.getContentElement("info","txtWidth");b&&b.setValue(a,!0);a=this.getStyle("height","");(b=g.getContentElement("info","txtHeight"))&&b.setValue(a,!0)})},onShow:function(){var g=a.getSelection(),d=g.getRanges(),c,b=this.getContentElement("info","txtRows"),h=this.getContentElement("info","txtCols"),p=this.getContentElement("info","txtWidth"),f=this.getContentElement("info", +"txtHeight");"tableProperties"==e&&((g=g.getSelectedElement())&&g.is("table")?c=g:0<d.length&&(CKEDITOR.env.webkit&&d[0].shrink(CKEDITOR.NODE_ELEMENT),c=a.elementPath(d[0].getCommonAncestor(!0)).contains("table",1)),this._.selectedElement=c);c?(this.setupContent(c),b&&b.disable(),h&&h.disable()):(b&&b.enable(),h&&h.enable());p&&p.onChange();f&&f.onChange()},onOk:function(){var g=a.getSelection(),d=this._.selectedElement&&g.createBookmarks(),c=this._.selectedElement||l("table"),b={};this.commitContent(b, +c);if(b.info){b=b.info;if(!this._.selectedElement)for(var h=c.append(l("tbody")),e=parseInt(b.txtRows,10)||0,f=parseInt(b.txtCols,10)||0,i=0;i<e;i++)for(var j=h.append(l("tr")),k=0;k<f;k++)j.append(l("td")).appendBogus();e=b.selHeaders;if(!c.$.tHead&&("row"==e||"both"==e)){j=new CKEDITOR.dom.element(c.$.createTHead());h=c.getElementsByTag("tbody").getItem(0);h=h.getElementsByTag("tr").getItem(0);for(i=0;i<h.getChildCount();i++)f=h.getChild(i),f.type==CKEDITOR.NODE_ELEMENT&&!f.data("cke-bookmark")&& +(f.renameNode("th"),f.setAttribute("scope","col"));j.append(h.remove())}if(null!==c.$.tHead&&!("row"==e||"both"==e)){j=new CKEDITOR.dom.element(c.$.tHead);h=c.getElementsByTag("tbody").getItem(0);for(k=h.getFirst();0<j.getChildCount();){h=j.getFirst();for(i=0;i<h.getChildCount();i++)f=h.getChild(i),f.type==CKEDITOR.NODE_ELEMENT&&(f.renameNode("td"),f.removeAttribute("scope"));h.insertBefore(k)}j.remove()}if(!this.hasColumnHeaders&&("col"==e||"both"==e))for(j=0;j<c.$.rows.length;j++)f=new CKEDITOR.dom.element(c.$.rows[j].cells[0]), +f.renameNode("th"),f.setAttribute("scope","row");if(this.hasColumnHeaders&&!("col"==e||"both"==e))for(i=0;i<c.$.rows.length;i++)j=new CKEDITOR.dom.element(c.$.rows[i]),"tbody"==j.getParent().getName()&&(f=new CKEDITOR.dom.element(j.$.cells[0]),f.renameNode("td"),f.removeAttribute("scope"));b.txtHeight?c.setStyle("height",b.txtHeight):c.removeStyle("height");b.txtWidth?c.setStyle("width",b.txtWidth):c.removeStyle("width");c.getAttribute("style")||c.removeAttribute("style")}if(this._.selectedElement)try{g.selectBookmarks(d)}catch(m){}else a.insertElement(c), +setTimeout(function(){var g=new CKEDITOR.dom.element(c.$.rows[0].cells[0]),b=a.createRange();b.moveToPosition(g,CKEDITOR.POSITION_AFTER_START);b.select()},0)},contents:[{id:"info",label:a.lang.table.title,elements:[{type:"hbox",widths:[null,null],styles:["vertical-align:top"],children:[{type:"vbox",padding:0,children:[{type:"text",id:"txtRows","default":3,label:a.lang.table.rows,required:!0,controlStyle:"width:5em",validate:o(a.lang.table.invalidRows),setup:function(a){this.setValue(a.$.rows.length)}, +commit:k},{type:"text",id:"txtCols","default":2,label:a.lang.table.columns,required:!0,controlStyle:"width:5em",validate:o(a.lang.table.invalidCols),setup:function(a){this.setValue(r(a))},commit:k},{type:"html",html:"&nbsp;"},{type:"select",id:"selHeaders",requiredContent:"th","default":"",label:a.lang.table.headers,items:[[a.lang.table.headersNone,""],[a.lang.table.headersRow,"row"],[a.lang.table.headersColumn,"col"],[a.lang.table.headersBoth,"both"]],setup:function(a){var d=this.getDialog();d.hasColumnHeaders= +!0;for(var c=0;c<a.$.rows.length;c++){var b=a.$.rows[c].cells[0];if(b&&"th"!=b.nodeName.toLowerCase()){d.hasColumnHeaders=!1;break}}null!==a.$.tHead?this.setValue(d.hasColumnHeaders?"both":"row"):this.setValue(d.hasColumnHeaders?"col":"")},commit:k},{type:"text",id:"txtBorder",requiredContent:"table[border]","default":a.filter.check("table[border]")?1:0,label:a.lang.table.border,controlStyle:"width:3em",validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidBorder),setup:function(a){this.setValue(a.getAttribute("border")|| +"")},commit:function(a,d){this.getValue()?d.setAttribute("border",this.getValue()):d.removeAttribute("border")}},{id:"cmbAlign",type:"select",requiredContent:"table[align]","default":"",label:a.lang.common.align,items:[[a.lang.common.notSet,""],[a.lang.common.alignLeft,"left"],[a.lang.common.alignCenter,"center"],[a.lang.common.alignRight,"right"]],setup:function(a){this.setValue(a.getAttribute("align")||"")},commit:function(a,d){this.getValue()?d.setAttribute("align",this.getValue()):d.removeAttribute("align")}}]}, +{type:"vbox",padding:0,children:[{type:"hbox",widths:["5em"],children:[{type:"text",id:"txtWidth",requiredContent:"table{width}",controlStyle:"width:5em",label:a.lang.common.width,title:a.lang.common.cssLengthTooltip,"default":a.filter.check("table{width}")?500>n.getSize("width")?"100%":500:0,getValue:q,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1",a.lang.common.width)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles");a&& +a.updateStyle("width",this.getValue())},setup:function(a){this.setValue(a.getStyle("width"))},commit:k}]},{type:"hbox",widths:["5em"],children:[{type:"text",id:"txtHeight",requiredContent:"table{height}",controlStyle:"width:5em",label:a.lang.common.height,title:a.lang.common.cssLengthTooltip,"default":"",getValue:q,validate:CKEDITOR.dialog.validate.cssLength(a.lang.common.invalidCssLength.replace("%1",a.lang.common.height)),onChange:function(){var a=this.getDialog().getContentElement("advanced","advStyles"); +a&&a.updateStyle("height",this.getValue())},setup:function(a){(a=a.getStyle("height"))&&this.setValue(a)},commit:k}]},{type:"html",html:"&nbsp;"},{type:"text",id:"txtCellSpace",requiredContent:"table[cellspacing]",controlStyle:"width:3em",label:a.lang.table.cellSpace,"default":a.filter.check("table[cellspacing]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellSpacing),setup:function(a){this.setValue(a.getAttribute("cellSpacing")||"")},commit:function(a,d){this.getValue()?d.setAttribute("cellSpacing", +this.getValue()):d.removeAttribute("cellSpacing")}},{type:"text",id:"txtCellPad",requiredContent:"table[cellpadding]",controlStyle:"width:3em",label:a.lang.table.cellPad,"default":a.filter.check("table[cellpadding]")?1:0,validate:CKEDITOR.dialog.validate.number(a.lang.table.invalidCellPadding),setup:function(a){this.setValue(a.getAttribute("cellPadding")||"")},commit:function(a,d){this.getValue()?d.setAttribute("cellPadding",this.getValue()):d.removeAttribute("cellPadding")}}]}]},{type:"html",align:"right", +html:""},{type:"vbox",padding:0,children:[{type:"text",id:"txtCaption",requiredContent:"caption",label:a.lang.table.caption,setup:function(a){this.enable();a=a.getElementsByTag("caption");if(0<a.count()){var a=a.getItem(0),d=a.getFirst(CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT));d&&!d.equals(a.getBogus())?(this.disable(),this.setValue(a.getText())):(a=CKEDITOR.tools.trim(a.getText()),this.setValue(a))}},commit:function(e,d){if(this.isEnabled()){var c=this.getValue(),b=d.getElementsByTag("caption"); +if(c)0<b.count()?(b=b.getItem(0),b.setHtml("")):(b=new CKEDITOR.dom.element("caption",a.document),d.getChildCount()?b.insertBefore(d.getFirst()):b.appendTo(d)),b.append(new CKEDITOR.dom.text(c,a.document));else if(0<b.count())for(c=b.count()-1;0<=c;c--)b.getItem(c).remove()}}},{type:"text",id:"txtSummary",requiredContent:"table[summary]",label:a.lang.table.summary,setup:function(a){this.setValue(a.getAttribute("summary")||"")},commit:function(a,d){this.getValue()?d.setAttribute("summary",this.getValue()): +d.removeAttribute("summary")}}]}]},m&&m.createAdvancedTab(a,null,"table")]}}var q=CKEDITOR.tools.cssLength,k=function(a){var e=this.id;a.info||(a.info={});a.info[e]=this.getValue()};CKEDITOR.dialog.add("table",function(a){return n(a,"table")});CKEDITOR.dialog.add("tableProperties",function(a){return n(a,"tableProperties")})})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/tabletools/dialogs/tableCell.js b/theme/bootstrap/plugins/ckeditor/plugins/tabletools/dialogs/tableCell.js new file mode 100644 index 0000000..a328cc9 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/tabletools/dialogs/tableCell.js @@ -0,0 +1,16 @@ +/* + Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("cellProperties",function(f){var g=f.lang.table,c=g.cell,d=f.lang.common,h=CKEDITOR.dialog.validate,j=/^(\d+(?:\.\d+)?)(px|%)$/,e={type:"html",html:"&nbsp;"},k="rtl"==f.lang.dir,i=f.plugins.colordialog;return{title:c.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?450:410,minHeight:CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?230:220,contents:[{id:"info",label:c.title,accessKey:"I",elements:[{type:"hbox",widths:["40%","5%","40%"],children:[{type:"vbox",padding:0, +children:[{type:"hbox",widths:["70%","30%"],children:[{type:"text",id:"width",width:"100px",label:d.width,validate:h.number(c.invalidWidth),onLoad:function(){var a=this.getDialog().getContentElement("info","widthType").getElement(),b=this.getInputElement(),c=b.getAttribute("aria-labelledby");b.setAttribute("aria-labelledby",[c,a.$.id].join(" "))},setup:function(a){var b=parseInt(a.getAttribute("width"),10),a=parseInt(a.getStyle("width"),10);!isNaN(b)&&this.setValue(b);!isNaN(a)&&this.setValue(a)}, +commit:function(a){var b=parseInt(this.getValue(),10),c=this.getDialog().getValueOf("info","widthType");isNaN(b)?a.removeStyle("width"):a.setStyle("width",b+c);a.removeAttribute("width")},"default":""},{type:"select",id:"widthType",label:f.lang.table.widthUnit,labelStyle:"visibility:hidden","default":"px",items:[[g.widthPx,"px"],[g.widthPc,"%"]],setup:function(a){(a=j.exec(a.getStyle("width")||a.getAttribute("width")))&&this.setValue(a[2])}}]},{type:"hbox",widths:["70%","30%"],children:[{type:"text", +id:"height",label:d.height,width:"100px","default":"",validate:h.number(c.invalidHeight),onLoad:function(){var a=this.getDialog().getContentElement("info","htmlHeightType").getElement(),b=this.getInputElement(),c=b.getAttribute("aria-labelledby");b.setAttribute("aria-labelledby",[c,a.$.id].join(" "))},setup:function(a){var b=parseInt(a.getAttribute("height"),10),a=parseInt(a.getStyle("height"),10);!isNaN(b)&&this.setValue(b);!isNaN(a)&&this.setValue(a)},commit:function(a){var b=parseInt(this.getValue(), +10);isNaN(b)?a.removeStyle("height"):a.setStyle("height",CKEDITOR.tools.cssLength(b));a.removeAttribute("height")}},{id:"htmlHeightType",type:"html",html:"<br />"+g.widthPx}]},e,{type:"select",id:"wordWrap",label:c.wordWrap,"default":"yes",items:[[c.yes,"yes"],[c.no,"no"]],setup:function(a){var b=a.getAttribute("noWrap");("nowrap"==a.getStyle("white-space")||b)&&this.setValue("no")},commit:function(a){"no"==this.getValue()?a.setStyle("white-space","nowrap"):a.removeStyle("white-space");a.removeAttribute("noWrap")}}, +e,{type:"select",id:"hAlign",label:c.hAlign,"default":"",items:[[d.notSet,""],[d.alignLeft,"left"],[d.alignCenter,"center"],[d.alignRight,"right"]],setup:function(a){var b=a.getAttribute("align");this.setValue(a.getStyle("text-align")||b||"")},commit:function(a){var b=this.getValue();b?a.setStyle("text-align",b):a.removeStyle("text-align");a.removeAttribute("align")}},{type:"select",id:"vAlign",label:c.vAlign,"default":"",items:[[d.notSet,""],[d.alignTop,"top"],[d.alignMiddle,"middle"],[d.alignBottom, +"bottom"],[c.alignBaseline,"baseline"]],setup:function(a){var b=a.getAttribute("vAlign"),a=a.getStyle("vertical-align");switch(a){case "top":case "middle":case "bottom":case "baseline":break;default:a=""}this.setValue(a||b||"")},commit:function(a){var b=this.getValue();b?a.setStyle("vertical-align",b):a.removeStyle("vertical-align");a.removeAttribute("vAlign")}}]},e,{type:"vbox",padding:0,children:[{type:"select",id:"cellType",label:c.cellType,"default":"td",items:[[c.data,"td"],[c.header,"th"]], +setup:function(a){this.setValue(a.getName())},commit:function(a){a.renameNode(this.getValue())}},e,{type:"text",id:"rowSpan",label:c.rowSpan,"default":"",validate:h.integer(c.invalidRowSpan),setup:function(a){(a=parseInt(a.getAttribute("rowSpan"),10))&&1!=a&&this.setValue(a)},commit:function(a){var b=parseInt(this.getValue(),10);b&&1!=b?a.setAttribute("rowSpan",this.getValue()):a.removeAttribute("rowSpan")}},{type:"text",id:"colSpan",label:c.colSpan,"default":"",validate:h.integer(c.invalidColSpan), +setup:function(a){(a=parseInt(a.getAttribute("colSpan"),10))&&1!=a&&this.setValue(a)},commit:function(a){var b=parseInt(this.getValue(),10);b&&1!=b?a.setAttribute("colSpan",this.getValue()):a.removeAttribute("colSpan")}},e,{type:"hbox",padding:0,widths:["60%","40%"],children:[{type:"text",id:"bgColor",label:c.bgColor,"default":"",setup:function(a){var b=a.getAttribute("bgColor");this.setValue(a.getStyle("background-color")||b)},commit:function(a){this.getValue()?a.setStyle("background-color",this.getValue()): +a.removeStyle("background-color");a.removeAttribute("bgColor")}},i?{type:"button",id:"bgColorChoose","class":"colorChooser",label:c.chooseColor,onLoad:function(){this.getElement().getParent().setStyle("vertical-align","bottom")},onClick:function(){f.getColorFromDialog(function(a){a&&this.getDialog().getContentElement("info","bgColor").setValue(a);this.focus()},this)}}:e]},e,{type:"hbox",padding:0,widths:["60%","40%"],children:[{type:"text",id:"borderColor",label:c.borderColor,"default":"",setup:function(a){var b= +a.getAttribute("borderColor");this.setValue(a.getStyle("border-color")||b)},commit:function(a){this.getValue()?a.setStyle("border-color",this.getValue()):a.removeStyle("border-color");a.removeAttribute("borderColor")}},i?{type:"button",id:"borderColorChoose","class":"colorChooser",label:c.chooseColor,style:(k?"margin-right":"margin-left")+": 10px",onLoad:function(){this.getElement().getParent().setStyle("vertical-align","bottom")},onClick:function(){f.getColorFromDialog(function(a){a&&this.getDialog().getContentElement("info", +"borderColor").setValue(a);this.focus()},this)}}:e]}]}]}]}],onShow:function(){this.cells=CKEDITOR.plugins.tabletools.getSelectedCells(this._.editor.getSelection());this.setupContent(this.cells[0])},onOk:function(){for(var a=this._.editor.getSelection(),b=a.createBookmarks(),c=this.cells,d=0;d<c.length;d++)this.commitContent(c[d]);this._.editor.forceNextSelectionCheck();a.selectBookmarks(b);this._.editor.selectionChange()}}}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/wsc/LICENSE.md b/theme/bootstrap/plugins/ckeditor/plugins/wsc/LICENSE.md new file mode 100644 index 0000000..6096de2 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/wsc/LICENSE.md @@ -0,0 +1,28 @@ +Software License Agreement +========================== + +**CKEditor WSC Plugin** +Copyright &copy; 2012, [CKSource](http://cksource.com) - Frederico Knabben. All rights reserved. + +Licensed under the terms of any of the following licenses at your choice: + +* GNU General Public License Version 2 or later (the "GPL"): + http://www.gnu.org/licenses/gpl.html + +* GNU Lesser General Public License Version 2.1 or later (the "LGPL"): + http://www.gnu.org/licenses/lgpl.html + +* Mozilla Public License Version 1.1 or later (the "MPL"): + http://www.mozilla.org/MPL/MPL-1.1.html + +You are not required to, but if you want to explicitly declare the license you have chosen to be bound to when using, reproducing, modifying and distributing this software, just include a text file titled "legal.txt" in your version of this software, indicating your license choice. + +Sources of Intellectual Property Included in this plugin +-------------------------------------------------------- + +Where not otherwise indicated, all plugin content is authored by CKSource engineers and consists of CKSource-owned intellectual property. In some specific instances, the plugin will incorporate work done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +CKEditor is a trademark of CKSource - Frederico Knabben. All other brand and product names are trademarks, registered trademarks or service marks of their respective holders. diff --git a/theme/bootstrap/plugins/ckeditor/plugins/wsc/README.md b/theme/bootstrap/plugins/ckeditor/plugins/wsc/README.md new file mode 100644 index 0000000..346e2ab --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/wsc/README.md @@ -0,0 +1,25 @@ +CKEditor WebSpellChecker Plugin +=============================== + +This plugin brings Web Spell Checker (WSC) into CKEditor. + +WSC is "installation-less", using the web-services of [WebSpellChecker.net](http://www.webspellchecker.net/). It's an out of the box solution. + +Installation +------------ + +1. Clone/copy this repository contents in a new "plugins/wsc" folder in your CKEditor installation. +2. Enable the "wsc" plugin in the CKEditor configuration file (config.js): + + config.extraPlugins = 'wsc'; + +That's all. WSC will appear on the editor toolbar and will be ready to use. + +License +------- + +Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html). + +See LICENSE.md for more information. + +Developed in cooperation with [WebSpellChecker.net](http://www.webspellchecker.net/). diff --git a/theme/bootstrap/plugins/ckeditor/plugins/wsc/dialogs/ciframe.html b/theme/bootstrap/plugins/ckeditor/plugins/wsc/dialogs/ciframe.html new file mode 100644 index 0000000..25db3c7 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/wsc/dialogs/ciframe.html @@ -0,0 +1,66 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<!-- +Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +--> +<html> +<head> + <title></title> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <script type="text/javascript"> + +function gup( name ) +{ + name = name.replace( /[\[]/, '\\\[' ).replace( /[\]]/, '\\\]' ) ; + var regexS = '[\\?&]' + name + '=([^&#]*)' ; + var regex = new RegExp( regexS ) ; + var results = regex.exec( window.location.href ) ; + + if ( results ) + return results[ 1 ] ; + else + return '' ; +} + +var interval; + +function sendData2Master() +{ + var destination = window.parent.parent ; + try + { + if ( destination.XDTMaster ) + { + var t = destination.XDTMaster.read( [ gup( 'cmd' ), gup( 'data' ) ] ) ; + window.clearInterval( interval ) ; + } + } + catch (e) {} +} + +function OnMessage (event) { + var message = event.data; + var destination = window.parent.parent; + destination.XDTMaster.read( [ 'end', message, 'fpm' ] ) ; +} + +function listenPostMessage() { + if (window.addEventListener) { // all browsers except IE before version 9 + window.addEventListener ("message", OnMessage, false); + }else { + if (window.attachEvent) { // IE before version 9 + window.attachEvent("onmessage", OnMessage); + } + } +} + +function onLoad() +{ + interval = window.setInterval( sendData2Master, 100 ); + listenPostMessage(); +} + +</script> +</head> +<body onload="onLoad()"><p></p></body> +</html> diff --git a/theme/bootstrap/plugins/ckeditor/plugins/wsc/dialogs/tmp.html b/theme/bootstrap/plugins/ckeditor/plugins/wsc/dialogs/tmp.html new file mode 100644 index 0000000..6e9b012 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/wsc/dialogs/tmp.html @@ -0,0 +1,115 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="UTF-8"> + <title>iframe</title> + + <style> + html,body{ + margin: 0; + height: 100%; + font: 13px/1.555 "Trebuchet MS", sans-serif; + } + a{ + color: #888; + font-weight: bold; + text-decoration: none; + border-bottom: 1px solid #888; + } + .main-box { + color:#252525; + padding: 3px 5px; + text-align: justify; + } + .main-box p{margin: 0 0 14px;} + .main-box .cerr{ + color: #f00000; + border-bottom-color: #f00000; + } + </style> + </head> + <body> + <div id="content" class="main-box"></div> + <iframe src="" frameborder="0" id="spelltext" name="spelltext" style="display:none; width: 100%" ></iframe> + <iframe src="" frameborder="0" id="loadsuggestfirst" name="loadsuggestfirst" style="display:none; width: 100%" ></iframe> + <iframe src="" frameborder="0" id="loadspellsuggestall" name="loadspellsuggestall" style="display:none; width: 100%" ></iframe> + <iframe src="" frameborder="0" id="loadOptionsForm" name="loadOptionsForm" style="display:none; width: 100%" ></iframe> + <script> + (function(window) { + // Constructor Manager PostMessage + + var ManagerPostMessage = function() { + var _init = function(handler) { + if (document.addEventListener) { + window.addEventListener('message', handler, false); + } else { + window.attachEvent("onmessage", handler); + } + }; + var _sendCmd = function(o) { + var str, + type = Object.prototype.toString, + fn = o.fn || null, + id = o.id || '', + target = o.target || window, + message = o.message || { 'id': id }; + + if (type.call(o.message) == "[object Object]") { + (o.message['id']) ? o.message['id'] : o.message['id'] = id; + message = o.message; + } + str = JSON.stringify(message, fn); + target.postMessage(str, '*'); + }; + + return { + init: _init, + send: _sendCmd + }; + }; + + var manageMessageTmp = new ManagerPostMessage; + + + var appString = (function(){ + var spell = parent.CKEDITOR.config.wsc.DefaultParams.scriptPath; + var serverUrl = parent.CKEDITOR.config.wsc.DefaultParams.serviceHost; + return serverUrl + spell; + })(); + + function loadScript(src, callback) { + var scriptTag = document.createElement("script"); + scriptTag.type = "text/javascript"; + callback ? callback : callback = function() {}; + if(scriptTag.readyState) { + //IE + scriptTag.onreadystatechange = function() { + if (scriptTag.readyState == "loaded" || + scriptTag.readyState == "complete") { + scriptTag.onreadystatechange = null; + setTimeout(function(){scriptTag.parentNode.removeChild(scriptTag)},1); + callback(); + } + }; + }else{ + //Others + scriptTag.onload = function() { + setTimeout(function(){scriptTag.parentNode.removeChild(scriptTag)},1); + callback(); + }; + } + scriptTag.src = src; + document.getElementsByTagName("head")[0].appendChild(scriptTag); + } + window.onload = function(){ + loadScript(appString, function(){ + manageMessageTmp.send({ + 'id': 'iframeOnload', + 'target': window.parent + }); + }); + } + })(this); + </script> + </body> +</html> diff --git a/theme/bootstrap/plugins/ckeditor/plugins/wsc/dialogs/tmpFrameset.html b/theme/bootstrap/plugins/ckeditor/plugins/wsc/dialogs/tmpFrameset.html new file mode 100644 index 0000000..0d675f4 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/wsc/dialogs/tmpFrameset.html @@ -0,0 +1,52 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd"> +<!-- +Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +--> +<html> +<head> + <title></title> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <script type="text/javascript"> + +function doLoadScript( url ) +{ + if ( !url ) + return false ; + + var s = document.createElement( "script" ) ; + s.type = "text/javascript" ; + s.src = url ; + document.getElementsByTagName( "head" )[ 0 ].appendChild( s ) ; + + return true ; +} + +var opener; +function tryLoad() +{ + opener = window.parent; + + // get access to global parameters + var oParams = window.opener.oldFramesetPageParams; + + // make frameset rows string prepare + var sFramesetRows = ( parseInt( oParams.firstframeh, 10 ) || '30') + ",*," + ( parseInt( oParams.thirdframeh, 10 ) || '150' ) + ',0' ; + document.getElementById( 'itFrameset' ).rows = sFramesetRows ; + + // dynamic including init frames and crossdomain transport code + // from config sproxy_js_frameset url + var addScriptUrl = oParams.sproxy_js_frameset ; + doLoadScript( addScriptUrl ) ; +} + + </script> +</head> + +<frameset id="itFrameset" onload="tryLoad();" border="0" rows="30,*,*,0"> + <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="0" marginwidth="2" src="" name="navbar"></frame> + <frame scrolling="auto" framespacing="0" frameborder="0" noresize="noresize" marginheight="0" marginwidth="0" src="" name="mid"></frame> + <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="1" marginwidth="1" src="" name="bot"></frame> + <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="1" marginwidth="1" src="" name="spellsuggestall"></frame> +</frameset> +</html> diff --git a/theme/bootstrap/plugins/ckeditor/plugins/wsc/dialogs/wsc.css b/theme/bootstrap/plugins/ckeditor/plugins/wsc/dialogs/wsc.css new file mode 100644 index 0000000..9e834f1 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/wsc/dialogs/wsc.css @@ -0,0 +1,82 @@ +/* +Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ + +html, body +{ + background-color: transparent; + margin: 0px; + padding: 0px; +} + +body +{ + padding: 10px; +} + +body, td, input, select, textarea +{ + font-size: 11px; + font-family: 'Microsoft Sans Serif' , Arial, Helvetica, Verdana; +} + +.midtext +{ + padding:0px; + margin:10px; +} + +.midtext p +{ + padding:0px; + margin:10px; +} + +.Button +{ + border: #737357 1px solid; + color: #3b3b1f; + background-color: #c7c78f; +} + +.PopupTabArea +{ + color: #737357; + background-color: #e3e3c7; +} + +.PopupTitleBorder +{ + border-bottom: #d5d59d 1px solid; +} +.PopupTabEmptyArea +{ + padding-left: 10px; + border-bottom: #d5d59d 1px solid; +} + +.PopupTab, .PopupTabSelected +{ + border-right: #d5d59d 1px solid; + border-top: #d5d59d 1px solid; + border-left: #d5d59d 1px solid; + padding: 3px 5px 3px 5px; + color: #737357; +} + +.PopupTab +{ + margin-top: 1px; + border-bottom: #d5d59d 1px solid; + cursor: pointer; +} + +.PopupTabSelected +{ + font-weight: bold; + cursor: default; + padding-top: 4px; + border-bottom: #f1f1e3 1px solid; + background-color: #f1f1e3; +} diff --git a/theme/bootstrap/plugins/ckeditor/plugins/wsc/dialogs/wsc.js b/theme/bootstrap/plugins/ckeditor/plugins/wsc/dialogs/wsc.js new file mode 100644 index 0000000..22410bd --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/wsc/dialogs/wsc.js @@ -0,0 +1,67 @@ +/* + Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +(function(){function w(a){if(!a)throw"Languages-by-groups list are required for construct selectbox";var c=[],d="",f;for(f in a)for(var g in a[f]){var h=a[f][g];"en_US"==h?d=h:c.push(h)}c.sort();d&&c.unshift(d);return{getCurrentLangGroup:function(c){a:{for(var d in a)for(var f in a[d])if(f.toUpperCase()===c.toUpperCase()){c=d;break a}c=""}return c},setLangList:function(){var c={},d;for(d in a)for(var f in a[d])c[a[d][f]]=f;return c}()}}var e=function(){var a=function(a,b,f){var f=f||{},g=f.expires; +if("number"==typeof g&&g){var h=new Date;h.setTime(h.getTime()+1E3*g);g=f.expires=h}g&&g.toUTCString&&(f.expires=g.toUTCString());var b=encodeURIComponent(b),a=a+"="+b,e;for(e in f)b=f[e],a+="; "+e,!0!==b&&(a+="="+b);document.cookie=a};return{postMessage:{init:function(a){document.addEventListener?window.addEventListener("message",a,!1):window.attachEvent("onmessage",a)},send:function(a){var b=a.fn||null,f=a.id||"",g=a.target||window,h=a.message||{id:f};"[object Object]"==Object.prototype.toString.call(a.message)&& +(a.message.id||(a.message.id=f),h=a.message);a=window.JSON.stringify(h,b);g.postMessage(a,"*")}},hash:{create:function(){},parse:function(){}},cookie:{set:a,get:function(a){return(a=document.cookie.match(RegExp("(?:^|; )"+a.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,"\\$1")+"=([^;]*)")))?decodeURIComponent(a[1]):void 0},remove:function(c){a(c,"",{expires:-1})}}}}(),a=a||{};a.TextAreaNumber=null;a.load=!0;a.cmd={SpellTab:"spell",Thesaurus:"thes",GrammTab:"grammar"};a.dialog=null;a.optionNode=null;a.selectNode= +null;a.grammerSuggest=null;a.textNode={};a.iframeMain=null;a.dataTemp="";a.div_overlay=null;a.textNodeInfo={};a.selectNode={};a.selectNodeResponce={};a.langList=null;a.langSelectbox=null;a.banner="";a.show_grammar=null;a.div_overlay_no_check=null;a.targetFromFrame={};a.onLoadOverlay=null;a.LocalizationComing={};a.OverlayPlace=null;a.LocalizationButton={ChangeTo:{instance:null,text:"Change to"},ChangeAll:{instance:null,text:"Change All"},IgnoreWord:{instance:null,text:"Ignore word"},IgnoreAllWords:{instance:null, +text:"Ignore all words"},Options:{instance:null,text:"Options",optionsDialog:{instance:null}},AddWord:{instance:null,text:"Add word"},FinishChecking:{instance:null,text:"Finish Checking"}};a.LocalizationLabel={ChangeTo:{instance:null,text:"Change to"},Suggestions:{instance:null,text:"Suggestions"}};var x=function(b){for(var c in b)b[c].instance.getElement().setText(a.LocalizationComing[c])},y=function(b){for(var c in b){if(!b[c].instance.setLabel)break;b[c].instance.setLabel(a.LocalizationComing[c])}}, +j,p;a.framesetHtml=function(b){return'<iframe src="'+a.templatePath+'" id='+a.iframeNumber+"_"+b+' frameborder="0" allowtransparency="1" style="width:100%;border: 1px solid #AEB3B9;overflow: auto;background:#fff; border-radius: 3px;"></iframe>'};a.setIframe=function(b,c){var d=a.framesetHtml(c);return b.getElement().setHtml(d)};a.setCurrentIframe=function(b){a.setIframe(a.dialog._.contents[b].Content,b)};a.setHeightBannerFrame=function(){var b=a.dialog.getContentElement("SpellTab","banner").getElement(), +c=a.dialog.getContentElement("GrammTab","banner").getElement(),d=a.dialog.getContentElement("Thesaurus","banner").getElement();b.setStyle("height","90px");c.setStyle("height","90px");d.setStyle("height","90px")};a.setHeightFrame=function(){document.getElementById(a.iframeNumber+"_"+a.dialog._.currentTabId).style.height="240px"};a.sendData=function(b){var c=b._.currentTabId,d=b._.contents[c].Content,f,g;a.setIframe(d,c);b.parts.tabs.removeAllListeners();b.parts.tabs.on("click",function(h){h=h||window.event; +h.data.getTarget().is("a")&&c!=b._.currentTabId&&(c=b._.currentTabId,d=b._.contents[c].Content,f=a.iframeNumber+"_"+c,a.div_overlay.setEnable(),d.getElement().getChildCount()?t(a.targetFromFrame[f],a.cmd[c]):(a.setIframe(d,c),g=document.getElementById(f),a.targetFromFrame[f]=g.contentWindow))})};a.buildSelectLang=function(a){var c=new CKEDITOR.dom.element("div"),d=new CKEDITOR.dom.element("select"),a="wscLang"+a;c.addClass("cke_dialog_ui_input_select");c.setAttribute("role","presentation");c.setStyles({height:"auto", +position:"absolute",right:"0",top:"-1px",width:"160px","white-space":"normal"});d.setAttribute("id",a);d.addClass("cke_dialog_ui_input_select");d.setStyles({width:"160px"});c.append(d);return c};a.buildOptionLang=function(b,c){var d=document.getElementById("wscLang"+c),f=document.createDocumentFragment(),g,h,e=[];if(0===d.options.length){for(g in b)e.push([g,b[g]]);e.sort();for(var k=0;k<e.length;k++)g=document.createElement("option"),g.setAttribute("value",e[k][1]),h=document.createTextNode(e[k][0]), +g.appendChild(h),e[k][1]==a.selectingLang&&g.setAttribute("selected","selected"),f.appendChild(g);d.appendChild(f)}};a.buildOptionSynonyms=function(b){b=a.selectNodeResponce[b];a.selectNode.synonyms.clear();for(var c=0;c<b.length;c++)a.selectNode.synonyms.add(b[c],b[c]);a.selectNode.synonyms.getInputElement().$.firstChild.selected=!0;a.textNode.Thesaurus.setValue(a.selectNode.synonyms.getInputElement().getValue())};var q=function(a){var c=document,d=a.target||c.body,f=a.id||"overlayBlock",g=a.opacity|| +"0.9",a=a.background||"#f1f1f1",e=c.getElementById(f),i=e||c.createElement("div");i.style.cssText="position: absolute;top:30px;bottom:41px;left:1px;right:1px;z-index: 10020;padding:0;margin:0;background:"+a+";opacity: "+g+";filter: alpha(opacity="+100*g+");display: none;";i.id=f;e||d.appendChild(i);return{setDisable:function(){i.style.display="none"},setEnable:function(){i.style.display="block"}}},z=function(b,c,d){var f=new CKEDITOR.dom.element("div"),g=new CKEDITOR.dom.element("input"),e=new CKEDITOR.dom.element("label"), +i="wscGrammerSuggest"+b+"_"+c;f.addClass("cke_dialog_ui_input_radio");f.setAttribute("role","presentation");f.setStyles({width:"97%",padding:"5px","white-space":"normal"});g.setAttributes({type:"radio",value:c,name:"wscGrammerSuggest",id:i});g.setStyles({"float":"left"});g.on("click",function(b){a.textNode.GrammTab.setValue(b.sender.getValue())});d&&g.setAttribute("checked",!0);g.addClass("cke_dialog_ui_radio_input");e.appendText(b);e.setAttribute("for",i);e.setStyles({display:"block","line-height":"16px", +"margin-left":"18px","white-space":"normal"});f.append(g);f.append(e);return f},u=function(a){a=a||"true";null!==a&&"false"==a&&m()},n=function(b){var c=new w(b),b="wscLang"+a.dialog.getParentEditor().name,b=document.getElementById(b),d=a.iframeNumber+"_"+a.dialog._.currentTabId;a.buildOptionLang(c.setLangList,a.dialog.getParentEditor().name);v[c.getCurrentLangGroup(a.selectingLang)]();u(a.show_grammar);b.onchange=function(){v[c.getCurrentLangGroup(this.value)]();u(a.show_grammar);a.div_overlay.setEnable(); +a.selectingLang=this.value;e.postMessage.send({message:{changeLang:a.selectingLang,text:a.dataTemp},target:a.targetFromFrame[d],id:"selectionLang_outer__page"})}},A=function(b){if("no_any_suggestions"==b){b="No suggestions";a.LocalizationButton.ChangeTo.instance.disable();a.LocalizationButton.ChangeAll.instance.disable();var c=function(b){b=a.LocalizationButton[b].instance;b.getElement().hasClass("cke_disabled")?b.getElement().setStyle("color","#a0a0a0"):b.disable()};c("ChangeTo");c("ChangeAll")}else a.LocalizationButton.ChangeTo.instance.enable(), +a.LocalizationButton.ChangeAll.instance.enable(),a.LocalizationButton.ChangeTo.instance.getElement().setStyle("color","#333"),a.LocalizationButton.ChangeAll.instance.getElement().setStyle("color","#333");return b},B={iframeOnload:function(){a.div_overlay.setEnable();var b=a.dialog._.currentTabId;t(a.targetFromFrame[a.iframeNumber+"_"+b],a.cmd[b])},suggestlist:function(b){delete b.id;a.div_overlay_no_check.setDisable();r();n(a.langList);var c=A(b.word),d="";c instanceof Array&&(c=b.word[0]);d=c=c.split(","); +p.clear();a.textNode.SpellTab.setValue(d[0]);for(b=0;b<d.length;b++)p.add(d[b],d[b]);l();a.div_overlay.setDisable()},grammerSuggest:function(b){delete b.id;delete b.mocklangs;r();n(a.langList);var c=b.grammSuggest[0];a.grammerSuggest.getElement().setHtml("");a.textNode.GrammTab.reset();a.textNode.GrammTab.setValue(c);a.textNodeInfo.GrammTab.getElement().setHtml("");a.textNodeInfo.GrammTab.getElement().setText(b.info);for(var b=b.grammSuggest,c=b.length,d=!0,f=0;f<c;f++)a.grammerSuggest.getElement().append(z(b[f], +b[f],d)),d=!1;l();a.div_overlay.setDisable()},thesaurusSuggest:function(b){delete b.id;delete b.mocklangs;r();n(a.langList);a.selectNodeResponce=b;a.textNode.Thesaurus.reset();a.selectNode.categories.clear();for(var c in b)a.selectNode.categories.add(c,c);b=a.selectNode.categories.getInputElement().getChildren().$[0].value;a.selectNode.categories.getInputElement().getChildren().$[0].selected=!0;a.buildOptionSynonyms(b);l();a.div_overlay.setDisable()},finish:function(b){delete b.id;a.dialog.getContentElement(a.dialog._.currentTabId, +"bottomGroup").getElement().hide();a.dialog.getContentElement(a.dialog._.currentTabId,"BlockFinishChecking").getElement().show();a.div_overlay.setDisable()},settext:function(b){delete b.id;a.dialog.getParentEditor().getCommand("checkspell");var c=a.dialog.getParentEditor();c.focus();c.setData(b.text,function(){a.dataTemp="";c.unlockSelection();c.fire("saveSnapshot");a.dialog.hide()})},ReplaceText:function(b){delete b.id;a.div_overlay.setEnable();a.dataTemp=b.text;a.selectingLang=b.currentLang;window.setTimeout(function(){a.div_overlay.setDisable()}, +500);x(a.LocalizationButton);y(a.LocalizationLabel)},options_checkbox_send:function(b){delete b.id;b={osp:e.cookie.get("osp"),udn:e.cookie.get("udn"),cust_dic_ids:a.cust_dic_ids};e.postMessage.send({message:b,target:a.targetFromFrame[a.iframeNumber+"_"+a.dialog._.currentTabId],id:"options_outer__page"})},getOptions:function(b){var c=b.DefOptions.udn;a.LocalizationComing=b.DefOptions.localizationButtonsAndText;a.show_grammar=b.show_grammar;a.langList=b.lang;if(a.bnr=b.bannerId){a.setHeightBannerFrame(); +var d=b.banner;a.dialog.getContentElement(a.dialog._.currentTabId,"banner").getElement().setHtml(d)}else a.setHeightFrame();"undefined"==c&&(a.userDictionaryName?(c=a.userDictionaryName,d={osp:e.cookie.get("osp"),udn:a.userDictionaryName,cust_dic_ids:a.cust_dic_ids,id:"options_dic_send",udnCmd:"create"},e.postMessage.send({message:d,target:a.targetFromFrame[void 0]})):c="");e.cookie.set("osp",b.DefOptions.osp);e.cookie.set("udn",c);e.cookie.set("cust_dic_ids",b.DefOptions.cust_dic_ids);e.postMessage.send({id:"giveOptions"})}, +options_dic_send:function(){var b={osp:e.cookie.get("osp"),udn:e.cookie.get("udn"),cust_dic_ids:a.cust_dic_ids,id:"options_dic_send",udnCmd:e.cookie.get("udnCmd")};e.postMessage.send({message:b,target:a.targetFromFrame[a.iframeNumber+"_"+a.dialog._.currentTabId]})},data:function(a){delete a.id},giveOptions:function(){},setOptionsConfirmF:function(){},setOptionsConfirmT:function(){j.setValue("")},clickBusy:function(){a.div_overlay.setEnable()},suggestAllCame:function(){a.div_overlay.setDisable();a.div_overlay_no_check.setDisable()}, +TextCorrect:function(){n(a.langList)}},C=function(a){a=a||window.event;if((a=window.JSON.parse(a.data))&&a.id)B[a.id](a)},t=function(b,c,d,f){c=c||CKEDITOR.config.wsc_cmd;d=d||a.dataTemp;e.postMessage.send({message:{customerId:a.wsc_customerId,text:d,txt_ctrl:a.TextAreaNumber,cmd:c,cust_dic_ids:a.cust_dic_ids,udn:a.userDictionaryName,slang:a.selectingLang,reset_suggest:f||!1},target:b,id:"data_outer__page"});a.div_overlay.setEnable()},v={superset:function(){a.dialog.showPage("Thesaurus");a.dialog.showPage("GrammTab"); +o()},usual:function(){s();m();o()},rtl:function(){s();m();o()}},D=function(b){var c=new function(a){var b={};return{getCmdByTab:function(c){for(var e in a)b[a[e]]=e;return b[c]}}}(a.cmd);b.selectPage(c.getCmdByTab(CKEDITOR.config.wsc_cmd));a.sendData(b)},s=function(){a.dialog.hidePage("Thesaurus")},m=function(){a.dialog.hidePage("GrammTab")},o=function(){a.dialog.showPage("SpellTab")},l=function(){a.dialog.getContentElement(a.dialog._.currentTabId,"bottomGroup").getElement().show()},r=function(){a.dialog.getContentElement(a.dialog._.currentTabId, +"BlockFinishChecking").getElement().hide()};CKEDITOR.dialog.add("checkspell",function(b){var c=function(){a.div_overlay.setEnable();var c=a.dialog._.currentTabId,f=a.iframeNumber+"_"+c,g=a.textNode[c].getValue(),h=this.getElement().getAttribute("title-cmd");e.postMessage.send({message:{cmd:h,tabId:c,new_word:g},target:a.targetFromFrame[f],id:"cmd_outer__page"});("ChangeTo"==h||"ChangeAll"==h)&&b.fire("saveSnapshot");"FinishChecking"==h&&b.config.wsc_onFinish.call(CKEDITOR.document.getWindow().getFrame())}; +return{title:b.config.wsc_dialogTitle||b.lang.wsc.title,minWidth:560,minHeight:444,buttons:[CKEDITOR.dialog.cancelButton],onLoad:function(){a.dialog=this;s();m();o()},onShow:function(){b.lockSelection(b.getSelection());a.TextAreaNumber="cke_textarea_"+CKEDITOR.currentInstance.name;e.postMessage.init(C);a.dataTemp=CKEDITOR.currentInstance.getData();a.OverlayPlace=a.dialog.parts.tabs.getParent().$;if(CKEDITOR&&CKEDITOR.config){a.wsc_customerId=b.config.wsc_customerId;a.cust_dic_ids=b.config.wsc_customDictionaryIds; +a.userDictionaryName=b.config.wsc_userDictionaryName;a.defaultLanguage=CKEDITOR.config.defaultLanguage;var c="file:"==document.location.protocol?"http:":document.location.protocol;CKEDITOR.scriptLoader.load(b.config.wsc_customLoaderScript||c+"//loader.webspellchecker.net/sproxy_fck/sproxy.php?plugin=fck2&customerid="+a.wsc_customerId+"&cmd=script&doc=wsc&schema=22",function(c){CKEDITOR.config&&CKEDITOR.config.wsc&&CKEDITOR.config.wsc.DefaultParams?(a.serverLocationHash=CKEDITOR.config.wsc.DefaultParams.serviceHost, +a.logotype=CKEDITOR.config.wsc.DefaultParams.logoPath,a.loadIcon=CKEDITOR.config.wsc.DefaultParams.iconPath,a.loadIconEmptyEditor=CKEDITOR.config.wsc.DefaultParams.iconPathEmptyEditor,a.LangComparer=new CKEDITOR.config.wsc.DefaultParams._SP_FCK_LangCompare):(a.serverLocationHash=DefaultParams.serviceHost,a.logotype=DefaultParams.logoPath,a.loadIcon=DefaultParams.iconPath,a.loadIconEmptyEditor=DefaultParams.iconPathEmptyEditor,a.LangComparer=new _SP_FCK_LangCompare);a.pluginPath=CKEDITOR.getUrl(b.plugins.wsc.path); +a.iframeNumber=a.TextAreaNumber;a.templatePath=a.pluginPath+"dialogs/tmp.html";a.LangComparer.setDefaulLangCode(a.defaultLanguage);a.currentLang=b.config.wsc_lang||a.LangComparer.getSPLangCode(b.langCode);a.selectingLang=a.currentLang;a.div_overlay=new q({opacity:"1",background:"#fff url("+a.loadIcon+") no-repeat 50% 50%",target:a.OverlayPlace});var d=a.dialog.parts.tabs.getId(),d=CKEDITOR.document.getById(d);d.setStyle("width","97%");d.getElementsByTag("DIV").count()||d.append(a.buildSelectLang(a.dialog.getParentEditor().name)); +a.div_overlay_no_check=new q({opacity:"1",id:"no_check_over",background:"#fff url("+a.loadIconEmptyEditor+") no-repeat 50% 50%",target:a.OverlayPlace});c&&(D(a.dialog),a.dialog.setupContent(a.dialog))})}else a.dialog.hide()},onHide:function(){a.dataTemp=""},contents:[{id:"SpellTab",label:"SpellChecker",accessKey:"S",elements:[{type:"html",id:"banner",label:"banner",style:"",html:"<div></div>"},{type:"html",id:"Content",label:"spellContent",html:"",setup:function(b){var b=a.iframeNumber+"_"+b._.currentTabId, +c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}},{type:"hbox",id:"bottomGroup",style:"width:560px; margin: 0 auto;",widths:["50%","50%"],children:[{type:"hbox",id:"leftCol",align:"left",width:"50%",children:[{type:"vbox",id:"rightCol1",widths:["50%","50%"],children:[{type:"text",id:"text",label:a.LocalizationLabel.ChangeTo.text+":",labelLayout:"horizontal",labelStyle:"font: 12px/25px arial, sans-serif;",width:"140px","default":"",onShow:function(){a.textNode.SpellTab=this;a.LocalizationLabel.ChangeTo.instance= +this},onHide:function(){this.reset()}},{type:"hbox",id:"rightCol",align:"right",width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"text",id:"labelSuggestions",label:a.LocalizationLabel.Suggestions.text+":",onShow:function(){a.LocalizationLabel.Suggestions.instance=this;this.getInputElement().hide()}},{type:"html",id:"logo",html:'<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">',setup:function(){this.getElement().$.src= +a.logotype;this.getElement().getParent().setStyles({"text-align":"left"})}}]},{type:"select",id:"list_of_suggestions",labelStyle:"font: 12px/25px arial, sans-serif;",size:"6",inputStyle:"width: 140px; height: auto;",items:[["loading..."]],onShow:function(){p=this},onHide:function(){this.clear()},onChange:function(){a.textNode.SpellTab.setValue(this.getValue())}}]}]}]},{type:"hbox",id:"rightCol",align:"right",width:"50%",children:[{type:"vbox",id:"rightCol_col__left",widths:["50%","50%","50%","50%"], +children:[{type:"button",id:"ChangeTo",label:a.LocalizationButton.ChangeTo.text,title:"Change to",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.ChangeTo.instance=this},onClick:c},{type:"button",id:"ChangeAll",label:a.LocalizationButton.ChangeAll.text,title:"Change All",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.ChangeAll.instance=this},onClick:c},{type:"button",id:"AddWord", +label:a.LocalizationButton.AddWord.text,title:"Add word",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.AddWord.instance=this},onClick:c},{type:"button",id:"FinishChecking",label:a.LocalizationButton.FinishChecking.text,title:"Finish Checking",style:"width: 100%;margin-top: 9px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.FinishChecking.instance=this},onClick:c}]},{type:"vbox",id:"rightCol_col__right", +widths:["50%","50%","50%"],children:[{type:"button",id:"IgnoreWord",label:a.LocalizationButton.IgnoreWord.text,title:"Ignore word",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.IgnoreWord.instance=this},onClick:c},{type:"button",id:"IgnoreAllWords",label:a.LocalizationButton.IgnoreAllWords.text,title:"Ignore all words",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);a.LocalizationButton.IgnoreAllWords.instance= +this},onClick:c},{type:"button",id:"option",label:a.LocalizationButton.Options.text,title:"Option",style:"width: 100%;",onLoad:function(){a.LocalizationButton.Options.instance=this;"file:"==document.location.protocol&&this.disable()},onClick:function(){"file:"==document.location.protocol?alert("WSC: Options functionality is disabled when runing from file system"):b.openDialog("options")}}]}]}]},{type:"hbox",id:"BlockFinishChecking",style:"width:560px; margin: 0 auto;",widths:["70%","30%"],onShow:function(){this.getElement().hide()}, +onHide:l,children:[{type:"hbox",id:"leftCol",align:"left",width:"70%",children:[{type:"vbox",id:"rightCol1",setup:function(){this.getChild()[0].getElement().$.src=a.logotype;this.getChild()[0].getElement().getParent().setStyles({"text-align":"center"})},children:[{type:"html",id:"logo",html:'<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">'}]}]},{type:"hbox",id:"rightCol",align:"right",width:"30%",children:[{type:"vbox", +id:"rightCol_col__left",children:[{type:"button",id:"Option_button",label:a.LocalizationButton.Options.text,title:"Option",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id);"file:"==document.location.protocol&&this.disable()},onClick:function(){"file:"==document.location.protocol?alert("WSC: Options functionality is disabled when runing from file system"):b.openDialog("options")}},{type:"button",id:"FinishChecking",label:a.LocalizationButton.FinishChecking.text, +title:"Finish Checking",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]}]},{id:"GrammTab",label:"Grammar",accessKey:"G",elements:[{type:"html",id:"banner",label:"banner",style:"",html:"<div></div>"},{type:"html",id:"Content",label:"GrammarContent",html:"",setup:function(){var b=a.iframeNumber+"_"+a.dialog._.currentTabId,c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}},{type:"vbox",id:"bottomGroup",style:"width:560px; margin: 0 auto;", +children:[{type:"hbox",id:"leftCol",widths:["66%","34%"],children:[{type:"vbox",children:[{type:"text",id:"text",label:"Change to:",labelLayout:"horizontal",labelStyle:"font: 12px/25px arial, sans-serif;",inputStyle:"float: right; width: 200px;","default":"",onShow:function(){a.textNode.GrammTab=this},onHide:function(){this.reset()}},{type:"html",id:"html_text",html:"<div style='min-height: 17px; line-height: 17px; padding: 5px; text-align: left;background: #F1F1F1;color: #595959; white-space: normal!important;'></div>", +onShow:function(){a.textNodeInfo.GrammTab=this}},{type:"html",id:"radio",html:"",onShow:function(){a.grammerSuggest=this}}]},{type:"vbox",children:[{type:"button",id:"ChangeTo",label:"Change to",title:"Change to",style:"width: 133px; float: right;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c},{type:"button",id:"IgnoreWord",label:"Ignore word",title:"Ignore word",style:"width: 133px; float: right;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)}, +onClick:c},{type:"button",id:"IgnoreAllWords",label:"Ignore Problem",title:"Ignore Problem",style:"width: 133px; float: right;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c},{type:"button",id:"FinishChecking",label:"Finish Checking",title:"Finish Checking",style:"width: 133px; float: right; margin-top: 9px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]},{type:"hbox",id:"BlockFinishChecking",style:"width:560px; margin: 0 auto;", +widths:["70%","30%"],onShow:function(){this.getElement().hide()},onHide:l,children:[{type:"hbox",id:"leftCol",align:"left",width:"70%",children:[{type:"vbox",id:"rightCol1",children:[{type:"html",id:"logo",html:'<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">',setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"center"})}}]}]},{type:"hbox",id:"rightCol",align:"right", +width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"button",id:"FinishChecking",label:"Finish Checking",title:"Finish Checking",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]}]},{id:"Thesaurus",label:"Thesaurus",accessKey:"T",elements:[{type:"html",id:"banner",label:"banner",style:"",html:"<div></div>"},{type:"html",id:"Content",label:"spellContent",html:"",setup:function(){var b=a.iframeNumber+"_"+a.dialog._.currentTabId, +c=document.getElementById(b);a.targetFromFrame[b]=c.contentWindow}},{type:"vbox",id:"bottomGroup",style:"width:560px; margin: -10px auto; overflow: hidden;",children:[{type:"hbox",widths:["75%","25%"],children:[{type:"vbox",children:[{type:"hbox",widths:["65%","35%"],children:[{type:"text",id:"ChangeTo",label:"Change to:",labelLayout:"horizontal",inputStyle:"width: 160px;",labelStyle:"font: 12px/25px arial, sans-serif;","default":"",onShow:function(){a.textNode.Thesaurus=this},onHide:function(){this.reset()}}, +{type:"button",id:"ChangeTo",label:"Change to",title:"Change to",style:"width: 121px; margin-top: 1px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]},{type:"hbox",children:[{type:"select",id:"categories",label:"Categories:",labelStyle:"font: 12px/25px arial, sans-serif;",size:"5",inputStyle:"width: 180px; height: auto;",items:[],onShow:function(){a.selectNode.categories=this},onHide:function(){this.clear()},onChange:function(){a.buildOptionSynonyms(this.getValue())}}, +{type:"select",id:"synonyms",label:"Synonyms:",labelStyle:"font: 12px/25px arial, sans-serif;",size:"5",inputStyle:"width: 180px; height: auto;",items:[],onShow:function(){a.selectNode.synonyms=this;a.textNode.Thesaurus.setValue(this.getValue())},onHide:function(){this.clear()},onChange:function(){a.textNode.Thesaurus.setValue(this.getValue())}}]}]},{type:"vbox",width:"120px",style:"margin-top:46px;",children:[{type:"html",id:"logotype",label:"WebSpellChecker.net",html:'<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">', +setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"center"})}},{type:"button",id:"FinishChecking",label:"Finish Checking",title:"Finish Checking",style:"width: 121px; float: right; margin-top: 9px;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]},{type:"hbox",id:"BlockFinishChecking",style:"width:560px; margin: 0 auto;",widths:["70%","30%"],onShow:function(){this.getElement().hide()},children:[{type:"hbox", +id:"leftCol",align:"left",width:"70%",children:[{type:"vbox",id:"rightCol1",children:[{type:"html",id:"logo",html:'<img width="99" height="68" border="0" src="" title="WebSpellChecker.net" alt="WebSpellChecker.net" style="display: inline-block;">',setup:function(){this.getElement().$.src=a.logotype;this.getElement().getParent().setStyles({"text-align":"center"})}}]}]},{type:"hbox",id:"rightCol",align:"right",width:"30%",children:[{type:"vbox",id:"rightCol_col__left",children:[{type:"button",id:"FinishChecking", +label:"Finish Checking",title:"Finish Checking",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onClick:c}]}]}]}]}]}});CKEDITOR.dialog.add("options",function(){var b=null,c={},d={},f=null,g=null;e.cookie.get("udn");e.cookie.get("osp");var h=function(){g=this.getElement().getAttribute("title-cmd");var a=[];a[0]=d.IgnoreAllCapsWords;a[1]=d.IgnoreWordsNumbers;a[2]=d.IgnoreMixedCaseWords;a[3]=d.IgnoreDomainNames;a=a.toString().replace(/,/g,"");e.cookie.set("osp", +a);e.cookie.set("udnCmd",g?g:"ignore");"delete"!=g&&(a="",""!==j.getValue()&&(a=j.getValue()),e.cookie.set("udn",a));e.postMessage.send({id:"options_dic_send"})},i=function(){f.getElement().setHtml(a.LocalizationComing.error);f.getElement().show()};return{title:a.LocalizationComing.Options,minWidth:430,minHeight:130,resizable:CKEDITOR.DIALOG_RESIZE_NONE,contents:[{id:"OptionsTab",label:"Options",accessKey:"O",elements:[{type:"hbox",id:"options_error",children:[{type:"html",style:"display: block;text-align: center;white-space: normal!important; font-size: 12px;color:red", +html:"<div></div>",onShow:function(){f=this}}]},{type:"vbox",id:"Options_content",children:[{type:"hbox",id:"Options_manager",widths:["52%","48%"],children:[{type:"fieldset",label:"Spell Checking Options",style:"border: none;margin-top: 13px;padding: 10px 0 10px 10px",onShow:function(){this.getInputElement().$.children[0].innerHTML=a.LocalizationComing.SpellCheckingOptions},children:[{type:"vbox",id:"Options_checkbox",children:[{type:"checkbox",id:"IgnoreAllCapsWords",label:"Ignore All-Caps Words", +labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=!this.getValue()?0:1}},{type:"checkbox",id:"IgnoreWordsNumbers",label:"Ignore Words with Numbers",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=!this.getValue()?0:1}},{type:"checkbox", +id:"IgnoreMixedCaseWords",label:"Ignore Mixed-Case Words",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]=!this.getValue()?0:1}},{type:"checkbox",id:"IgnoreDomainNames",label:"Ignore Domain Names",labelStyle:"margin-left: 5px; font: 12px/16px arial, sans-serif;display: inline-block;white-space: normal;",style:"float:left; min-height: 16px;","default":"",onClick:function(){d[this.id]= +!this.getValue()?0:1}}]}]},{type:"vbox",id:"Options_DictionaryName",children:[{type:"text",id:"DictionaryName",style:"margin-bottom: 10px",label:"Dictionary Name:",labelLayout:"vertical",labelStyle:"font: 12px/25px arial, sans-serif;","default":"",onLoad:function(){j=this;this.setValue(a.userDictionaryName?a.userDictionaryName:(e.cookie.get("udn"),this.getValue()))},onShow:function(){j=this;this.setValue(!e.cookie.get("udn")?this.getValue():e.cookie.get("udn"));this.setLabel(a.LocalizationComing.DictionaryName)}, +onHide:function(){this.reset()}},{type:"hbox",id:"Options_buttons",children:[{type:"vbox",id:"Options_leftCol_col",widths:["50%","50%"],children:[{type:"button",id:"create",label:"Create",title:"Create",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Create)},onClick:h},{type:"button",id:"restore",label:"Restore",title:"Restore",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd", +this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Restore)},onClick:h}]},{type:"vbox",id:"Options_rightCol_col",widths:["50%","50%"],children:[{type:"button",id:"rename",label:"Rename",title:"Rename",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd",this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Rename)},onClick:h},{type:"button",id:"delete",label:"Remove",title:"Remove",style:"width: 100%;",onLoad:function(){this.getElement().setAttribute("title-cmd", +this.id)},onShow:function(){this.getElement().setText(a.LocalizationComing.Remove)},onClick:h}]}]}]}]},{type:"hbox",id:"Options_text",children:[{type:"html",style:"text-align: justify;margin-top: 15px;white-space: normal!important; font-size: 12px;color:#777;",html:"<div>"+a.LocalizationComing.OptionsTextIntro+"</div>",onShow:function(){this.getElement().setText(a.LocalizationComing.OptionsTextIntro)}}]}]}]}],buttons:[CKEDITOR.dialog.okButton,CKEDITOR.dialog.cancelButton],onOk:function(){var a=[]; +a[0]=d.IgnoreAllCapsWords;a[1]=d.IgnoreWordsNumbers;a[2]=d.IgnoreMixedCaseWords;a[3]=d.IgnoreDomainNames;a=a.toString().replace(/,/g,"");e.cookie.set("osp",a);e.cookie.set("udn",j.getValue());e.postMessage.send({id:"options_checkbox_send"});f.getElement().hide();f.getElement().setHtml(" ")},onLoad:function(){b=this;e.postMessage.init(i);c.IgnoreAllCapsWords=b.getContentElement("OptionsTab","IgnoreAllCapsWords");c.IgnoreWordsNumbers=b.getContentElement("OptionsTab","IgnoreWordsNumbers");c.IgnoreMixedCaseWords= +b.getContentElement("OptionsTab","IgnoreMixedCaseWords");c.IgnoreDomainNames=b.getContentElement("OptionsTab","IgnoreDomainNames")},onShow:function(){var b=e.cookie.get("osp").split("");d.IgnoreAllCapsWords=b[0];d.IgnoreWordsNumbers=b[1];d.IgnoreMixedCaseWords=b[2];d.IgnoreDomainNames=b[3];!parseInt(d.IgnoreAllCapsWords,10)?c.IgnoreAllCapsWords.setValue("",!1):c.IgnoreAllCapsWords.setValue("checked",!1);!parseInt(d.IgnoreWordsNumbers,10)?c.IgnoreWordsNumbers.setValue("",!1):c.IgnoreWordsNumbers.setValue("checked", +!1);!parseInt(d.IgnoreMixedCaseWords,10)?c.IgnoreMixedCaseWords.setValue("",!1):c.IgnoreMixedCaseWords.setValue("checked",!1);!parseInt(d.IgnoreDomainNames,10)?c.IgnoreDomainNames.setValue("",!1):c.IgnoreDomainNames.setValue("checked",!1);d.IgnoreAllCapsWords=!c.IgnoreAllCapsWords.getValue()?0:1;d.IgnoreWordsNumbers=!c.IgnoreWordsNumbers.getValue()?0:1;d.IgnoreMixedCaseWords=!c.IgnoreMixedCaseWords.getValue()?0:1;d.IgnoreDomainNames=!c.IgnoreDomainNames.getValue()?0:1;c.IgnoreAllCapsWords.getElement().$.lastChild.innerHTML= +a.LocalizationComing.IgnoreAllCapsWords;c.IgnoreWordsNumbers.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreWordsWithNumbers;c.IgnoreMixedCaseWords.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreMixedCaseWords;c.IgnoreDomainNames.getElement().$.lastChild.innerHTML=a.LocalizationComing.IgnoreDomainNames}}});CKEDITOR.dialog.on("resize",function(b){var b=b.data,c=b.dialog,d=CKEDITOR.document.getById(a.iframeNumber+"_"+c._.currentTabId);"checkspell"==c._.name&&(a.bnr?d&& +d.setSize("height",b.height-310):d&&d.setSize("height",b.height-220))});CKEDITOR.on("dialogDefinition",function(b){var c=b.data.definition;a.onLoadOverlay=new q({opacity:"1",background:"#fff",target:c.dialog.parts.tabs.getParent().$});a.onLoadOverlay.setEnable();c.dialog.on("show",function(){});c.dialog.on("cancel",function(){c.dialog.getParentEditor().config.wsc_onClose.call(this.document.getWindow().getFrame());a.div_overlay.setDisable();return!1},this,null,-1)})})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/plugins/wsc/dialogs/wsc_ie.js b/theme/bootstrap/plugins/ckeditor/plugins/wsc/dialogs/wsc_ie.js new file mode 100644 index 0000000..6b39b00 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/plugins/wsc/dialogs/wsc_ie.js @@ -0,0 +1,11 @@ +/* + Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. + For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +CKEDITOR.dialog.add("checkspell",function(a){function c(a,c){var d=0;return function(){"function"==typeof window.doSpell?("undefined"!=typeof e&&window.clearInterval(e),j(a)):180==d++&&window._cancelOnError(c)}}function j(c){var f=new window._SP_FCK_LangCompare,b=CKEDITOR.getUrl(a.plugins.wsc.path+"dialogs/"),e=b+"tmpFrameset.html";window.gFCKPluginName="wsc";f.setDefaulLangCode(a.config.defaultLanguage);window.doSpell({ctrl:g,lang:a.config.wsc_lang||f.getSPLangCode(a.langCode),intLang:a.config.wsc_uiLang|| +f.getSPLangCode(a.langCode),winType:d,onCancel:function(){c.hide()},onFinish:function(b){a.focus();c.getParentEditor().setData(b.value);c.hide()},staticFrame:e,framesetPath:e,iframePath:b+"ciframe.html",schemaURI:b+"wsc.css",userDictionaryName:a.config.wsc_userDictionaryName,customDictionaryName:a.config.wsc_customDictionaryIds&&a.config.wsc_customDictionaryIds.split(","),domainName:a.config.wsc_domainName});CKEDITOR.document.getById(h).setStyle("display","none");CKEDITOR.document.getById(d).setStyle("display", +"block")}var b=CKEDITOR.tools.getNextNumber(),d="cke_frame_"+b,g="cke_data_"+b,h="cke_error_"+b,e,b=document.location.protocol||"http:",i=a.lang.wsc.notAvailable,k='<textarea style="display: none" id="'+g+'" rows="10" cols="40"> </textarea><div id="'+h+'" style="display:none;color:red;font-size:16px;font-weight:bold;padding-top:160px;text-align:center;z-index:11;"></div><iframe src="" style="width:100%;background-color:#f1f1e3;" frameborder="0" name="'+d+'" id="'+d+'" allowtransparency="1"></iframe>', +l=a.config.wsc_customLoaderScript||b+"//loader.webspellchecker.net/sproxy_fck/sproxy.php?plugin=fck2&customerid="+a.config.wsc_customerId+"&cmd=script&doc=wsc&schema=22";a.config.wsc_customLoaderScript&&(i+='<p style="color:#000;font-size:11px;font-weight: normal;text-align:center;padding-top:10px">'+a.lang.wsc.errorLoading.replace(/%s/g,a.config.wsc_customLoaderScript)+"</p>");window._cancelOnError=function(c){if("undefined"==typeof window.WSC_Error){CKEDITOR.document.getById(d).setStyle("display", +"none");var b=CKEDITOR.document.getById(h);b.setStyle("display","block");b.setHtml(c||a.lang.wsc.notAvailable)}};return{title:a.config.wsc_dialogTitle||a.lang.wsc.title,minWidth:485,minHeight:380,buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){var b=this.getContentElement("general","content").getElement();b.setHtml(k);b.getChild(2).setStyle("height",this._.contentSize.height+"px");"function"!=typeof window.doSpell&&CKEDITOR.document.getHead().append(CKEDITOR.document.createElement("script", +{attributes:{type:"text/javascript",src:l}}));b=a.getData();CKEDITOR.document.getById(g).setValue(b);e=window.setInterval(c(this,i),250)},onHide:function(){window.ooo=void 0;window.int_framsetLoaded=void 0;window.framesetLoaded=void 0;window.is_window_opened=!1},contents:[{id:"general",label:a.config.wsc_dialogTitle||a.lang.wsc.title,padding:0,elements:[{type:"html",id:"content",html:""}]}]}}); +CKEDITOR.dialog.on("resize",function(a){var a=a.data,c=a.dialog;"checkspell"==c._.name&&((c=(c=c.getContentElement("general","content").getElement())&&c.getChild(2))&&c.setSize("height",a.height),c&&c.setSize("width",a.width))}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/dialog.css b/theme/bootstrap/plugins/ckeditor/skins/moono/dialog.css new file mode 100644 index 0000000..29bbaf9 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/skins/moono/dialog.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%} \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/dialog_ie.css b/theme/bootstrap/plugins/ckeditor/skins/moono/dialog_ie.css new file mode 100644 index 0000000..153b05c --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/skins/moono/dialog_ie.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0} \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/dialog_ie7.css b/theme/bootstrap/plugins/ckeditor/skins/moono/dialog_ie7.css new file mode 100644 index 0000000..459e72b --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/skins/moono/dialog_ie7.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_title{zoom:1}.cke_dialog_footer{border-top:1px solid #bfbfbf}.cke_dialog_footer_buttons{position:static}.cke_dialog_footer_buttons a.cke_dialog_ui_button{vertical-align:top}.cke_dialog .cke_resizer_ltr{padding-left:4px}.cke_dialog .cke_resizer_rtl{padding-right:4px}.cke_dialog_ui_input_text,.cke_dialog_ui_input_password,.cke_dialog_ui_input_textarea,.cke_dialog_ui_input_select{padding:0!important}.cke_dialog_ui_checkbox_input,.cke_dialog_ui_ratio_input,.cke_btn_reset,.cke_btn_locked,.cke_btn_unlocked{border:1px solid transparent!important} \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/dialog_ie8.css b/theme/bootstrap/plugins/ckeditor/skins/moono/dialog_ie8.css new file mode 100644 index 0000000..74e9fa8 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/skins/moono/dialog_ie8.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{display:block} \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/dialog_iequirks.css b/theme/bootstrap/plugins/ckeditor/skins/moono/dialog_iequirks.css new file mode 100644 index 0000000..1c8e055 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/skins/moono/dialog_iequirks.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_footer{filter:""} \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/dialog_opera.css b/theme/bootstrap/plugins/ckeditor/skins/moono/dialog_opera.css new file mode 100644 index 0000000..742ce73 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/skins/moono/dialog_opera.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_browser_gecko19 .cke_dialog_body{position:relative}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0 0 2px 2px;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fafafa),to(#ededed));background-image:-moz-linear-gradient(top,#fafafa,#ededed);background-image:-webkit-linear-gradient(top,#fafafa,#ededed);background-image:-o-linear-gradient(top,#fafafa,#ededed);background-image:-ms-linear-gradient(top,#fafafa,#ededed);background-image:linear-gradient(top,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover{background:#ebebeb;background:-moz-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ebebeb),color-stop(100%,#dfdfdf));background:-webkit-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-o-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:-ms-linear-gradient(top,#ebebeb 0,#dfdfdf 100%);background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover{background:#ededed;background:-moz-linear-gradient(top,#ededed 0,#fff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#ededed),color-stop(100%,#fff));background:-webkit-linear-gradient(top,#ededed 0,#fff 100%);background:-o-linear-gradient(top,#ededed 0,#fff 100%);background:-ms-linear-gradient(top,#ededed 0,#fff 100%);background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:0 0;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;z-index:5}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:3px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 12px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;-moz-box-shadow:0 0 6px rgba(0,0,0,.4) inset;-webkit-box-shadow:0 0 6px rgba(0,0,0,.4) inset;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:20px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:-webkit-gradient(linear,0 0,0 100%,from(#9ad717),to(#69b10b));background-image:-webkit-linear-gradient(top,#9ad717,#69b10b);background-image:-o-linear-gradient(top,#9ad717,#69b10b);background-image:linear-gradient(to bottom,#9ad717,#69b10b);background-image:-moz-linear-gradient(top,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#88be14),color-stop(100%,#5d9c0a));background:-webkit-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:-o-linear-gradient(top,#88be14 0,#5d9c0a 100%);background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);background:-moz-linear-gradient(top,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:2px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:24px;line-height:24px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:2px 6px;outline:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.15) inset;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_dialog_footer{display:block;height:38px}.cke_ltr .cke_dialog_footer>*{float:right}.cke_rtl .cke_dialog_footer>*{float:left} \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/editor.css b/theme/bootstrap/plugins/ckeditor/skins/moono/editor.css new file mode 100644 index 0000000..2df8482 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/skins/moono/editor.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/editor_gecko.css b/theme/bootstrap/plugins/ckeditor/skins/moono/editor_gecko.css new file mode 100644 index 0000000..ecb7990 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/skins/moono/editor_gecko.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/editor_ie.css b/theme/bootstrap/plugins/ckeditor/skins/moono/editor_ie.css new file mode 100644 index 0000000..332d779 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/skins/moono/editor_ie.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/editor_ie7.css b/theme/bootstrap/plugins/ckeditor/skins/moono/editor_ie7.css new file mode 100644 index 0000000..9bfeaa7 --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/skins/moono/editor_ie7.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon,{display:inline-block;vertical-align:top}.cke_toolbox{display:inline-block;padding-bottom:5px;height:100%}.cke_rtl .cke_toolbox{padding-bottom:0}.cke_toolbar{margin-bottom:5px}.cke_rtl .cke_toolbar{margin-bottom:0}.cke_toolgroup{height:26px}.cke_toolgroup,.cke_combo{position:relative}a.cke_button{float:none;vertical-align:top}.cke_toolbar_separator{display:inline-block;float:none;vertical-align:top;background-color:#c0c0c0}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_rtl .cke_button_arrow{padding-top:8px;margin-right:2px}.cke_rtl .cke_combo_inlinelabel{display:table-cell;vertical-align:middle}.cke_menubutton{display:block;height:24px}.cke_menubutton_inner{display:block;position:relative}.cke_menubutton_icon{height:16px;width:16px}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:inline-block}.cke_menubutton_label{width:auto;vertical-align:top;line-height:24px;height:24px;margin:0 10px 0 0}.cke_menuarrow{width:5px;height:6px;padding:0;position:absolute;right:8px;top:10px;background-position:0 0}.cke_rtl .cke_menubutton_icon{position:absolute;right:0;top:0}.cke_rtl .cke_menubutton_label{float:right;clear:both;margin:0 24px 0 10px}.cke_hc .cke_rtl .cke_menubutton_label{margin-right:0}.cke_rtl .cke_menuarrow{left:8px;right:auto;background-position:0 -24px}.cke_hc .cke_menuarrow{top:5px;padding:0 5px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{position:relative}.cke_wysiwyg_div{padding-top:0!important;padding-bottom:0!important}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/editor_ie8.css b/theme/bootstrap/plugins/ckeditor/skins/moono/editor_ie8.css new file mode 100644 index 0000000..955ec8d --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/skins/moono/editor_ie8.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/editor_iequirks.css b/theme/bootstrap/plugins/ckeditor/skins/moono/editor_iequirks.css new file mode 100644 index 0000000..009d08c --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/skins/moono/editor_iequirks.css @@ -0,0 +1,5 @@ +/* +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.md or http://ckeditor.com/license +*/ +.cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none}.cke_reset_all,.cke_reset_all *{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;position:static;-webkit-transition:none;-moz-transition:none;-ms-transition:none;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#cfd1cf));background-image:-moz-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-webkit-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-o-linear-gradient(top,#ebebeb,#cfd1cf);background-image:-ms-linear-gradient(top,#ebebeb,#cfd1cf);background-image:linear-gradient(top,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 0 3px rgba(0,0,0,.15);-webkit-box-shadow:0 0 3px rgba(0,0,0,.15);box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;-moz-border-radius:2px 2px 0 0;-webkit-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0;-moz-box-shadow:0 1px 0 #fff inset;-webkit-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#cfd1cf));background-image:-moz-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-webkit-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-o-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:-ms-linear-gradient(top,#f5f5f5,#cfd1cf);background-image:linear-gradient(top,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup *:first-child{-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0}.cke_rtl .cke_toolgroup *:last-child{-moz-border-radius:2px 0 0 2px;-webkit-border-radius:2px 0 0 2px;border-radius:2px 0 0 2px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}.cke_button_on{-moz-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{-moz-box-shadow:0 0 1px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 1px rgba(0,0,0,.3) inset;box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;-webkit-box-shadow:1px 0 1px rgba(255,255,255,.5);-moz-box-shadow:1px 0 1px rgba(255,255,255,.5);box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;-webkit-box-shadow:-1px 0 1px rgba(255,255,255,.1);-moz-box-shadow:-1px 0 1px rgba(255,255,255,.1);box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;-moz-box-shadow:0 0 2px rgba(0,0,0,.1) inset;-webkit-box-shadow:0 0 2px rgba(0,0,0,.1) inset;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}.cke_combo_button{display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e4e4e4));background-image:-moz-linear-gradient(top,#fff,#e4e4e4);background-image:-webkit-linear-gradient(top,#fff,#e4e4e4);background-image:-o-linear-gradient(top,#fff,#e4e4e4);background-image:-ms-linear-gradient(top,#fff,#e4e4e4);background-image:linear-gradient(top,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:-webkit-gradient(linear,left top,left bottom,from(#f2f2f2),to(#ccc));background-image:-moz-linear-gradient(top,#f2f2f2,#ccc);background-image:-webkit-linear-gradient(top,#f2f2f2,#ccc);background-image:-o-linear-gradient(top,#f2f2f2,#ccc);background-image:-ms-linear-gradient(top,#f2f2f2,#ccc);background-image:linear-gradient(top,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;-moz-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;-webkit-box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:-webkit-gradient(linear,left top,left bottom,from(#aaa),to(#cacaca));background-image:-moz-linear-gradient(top,#aaa,#cacaca);background-image:-webkit-linear-gradient(top,#aaa,#cacaca);background-image:-o-linear-gradient(top,#aaa,#cacaca);background-image:-ms-linear-gradient(top,#aaa,#cacaca);background-image:linear-gradient(top,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{-moz-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);-webkit-box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2);box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}.cke_path_item,.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);-webkit-box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5);box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_top,.cke_contents,.cke_bottom{width:100%}.cke_button_arrow{font-size:0}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon,{display:inline-block;vertical-align:top}.cke_rtl .cke_button_icon{float:none}.cke_resizer{width:10px}.cke_source{white-space:normal}.cke_bottom{position:static}.cke_colorbox{font-size:0}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;} \ No newline at end of file diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/icons.png b/theme/bootstrap/plugins/ckeditor/skins/moono/icons.png new file mode 100644 index 0000000..c71008d Binary files /dev/null and b/theme/bootstrap/plugins/ckeditor/skins/moono/icons.png differ diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/icons_hidpi.png b/theme/bootstrap/plugins/ckeditor/skins/moono/icons_hidpi.png new file mode 100644 index 0000000..0466c2b Binary files /dev/null and b/theme/bootstrap/plugins/ckeditor/skins/moono/icons_hidpi.png differ diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/images/arrow.png b/theme/bootstrap/plugins/ckeditor/skins/moono/images/arrow.png new file mode 100644 index 0000000..0d1eb39 Binary files /dev/null and b/theme/bootstrap/plugins/ckeditor/skins/moono/images/arrow.png differ diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/images/close.png b/theme/bootstrap/plugins/ckeditor/skins/moono/images/close.png new file mode 100644 index 0000000..04b9c97 Binary files /dev/null and b/theme/bootstrap/plugins/ckeditor/skins/moono/images/close.png differ diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/images/hidpi/close.png b/theme/bootstrap/plugins/ckeditor/skins/moono/images/hidpi/close.png new file mode 100644 index 0000000..8abca8e Binary files /dev/null and b/theme/bootstrap/plugins/ckeditor/skins/moono/images/hidpi/close.png differ diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/images/hidpi/lock-open.png b/theme/bootstrap/plugins/ckeditor/skins/moono/images/hidpi/lock-open.png new file mode 100644 index 0000000..aa5e740 Binary files /dev/null and b/theme/bootstrap/plugins/ckeditor/skins/moono/images/hidpi/lock-open.png differ diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/images/hidpi/lock.png b/theme/bootstrap/plugins/ckeditor/skins/moono/images/hidpi/lock.png new file mode 100644 index 0000000..5404b06 Binary files /dev/null and b/theme/bootstrap/plugins/ckeditor/skins/moono/images/hidpi/lock.png differ diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/images/hidpi/refresh.png b/theme/bootstrap/plugins/ckeditor/skins/moono/images/hidpi/refresh.png new file mode 100644 index 0000000..1ebef34 Binary files /dev/null and b/theme/bootstrap/plugins/ckeditor/skins/moono/images/hidpi/refresh.png differ diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/images/lock-open.png b/theme/bootstrap/plugins/ckeditor/skins/moono/images/lock-open.png new file mode 100644 index 0000000..3b256c0 Binary files /dev/null and b/theme/bootstrap/plugins/ckeditor/skins/moono/images/lock-open.png differ diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/images/lock.png b/theme/bootstrap/plugins/ckeditor/skins/moono/images/lock.png new file mode 100644 index 0000000..c127f9e Binary files /dev/null and b/theme/bootstrap/plugins/ckeditor/skins/moono/images/lock.png differ diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/images/refresh.png b/theme/bootstrap/plugins/ckeditor/skins/moono/images/refresh.png new file mode 100644 index 0000000..a1a061c Binary files /dev/null and b/theme/bootstrap/plugins/ckeditor/skins/moono/images/refresh.png differ diff --git a/theme/bootstrap/plugins/ckeditor/skins/moono/readme.md b/theme/bootstrap/plugins/ckeditor/skins/moono/readme.md new file mode 100644 index 0000000..0fa4c1a --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/skins/moono/readme.md @@ -0,0 +1,51 @@ +"Moono" Skin +==================== + +This skin has been chosen for the **default skin** of CKEditor 4.x, elected from the CKEditor +[skin contest](http://ckeditor.com/blog/new_ckeditor_4_skin) and further shaped by +the CKEditor team. "Moono" is maintained by the core developers. + +For more information about skins, please check the [CKEditor Skin SDK](http://docs.cksource.com/CKEditor_4.x/Skin_SDK) +documentation. + +Features +------------------- +"Moono" is a monochromatic skin, which offers a modern look coupled with gradients and transparency. +It comes with the following features: + +- Chameleon feature with brightness, +- high-contrast compatibility, +- graphics source provided in SVG. + +Directory Structure +------------------- + +CSS parts: +- **editor.css**: the main CSS file. It's simply loading several other files, for easier maintenance, +- **mainui.css**: the file contains styles of entire editor outline structures, +- **toolbar.css**: the file contains styles of the editor toolbar space (top), +- **richcombo.css**: the file contains styles of the rich combo ui elements on toolbar, +- **panel.css**: the file contains styles of the rich combo drop-down, it's not loaded +until the first panel open up, +- **elementspath.css**: the file contains styles of the editor elements path bar (bottom), +- **menu.css**: the file contains styles of all editor menus including context menu and button drop-down, +it's not loaded until the first menu open up, +- **dialog.css**: the CSS files for the dialog UI, it's not loaded until the first dialog open, +- **reset.css**: the file defines the basis of style resets among all editor UI spaces, +- **preset.css**: the file defines the default styles of some UI elements reflecting the skin preference, +- **editor_XYZ.css** and **dialog_XYZ.css**: browser specific CSS hacks. + +Other parts: +- **skin.js**: the only JavaScript part of the skin that registers the skin, its browser specific files and its icons and defines the Chameleon feature, +- **icons/**: contains all skin defined icons, +- **images/**: contains a fill general used images, +- **dev/**: contains SVG source of the skin icons. + +License +------- + +Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + +Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html). + +See LICENSE.md for more information. diff --git a/theme/bootstrap/plugins/ckeditor/styles.js b/theme/bootstrap/plugins/ckeditor/styles.js new file mode 100644 index 0000000..b58e0bd --- /dev/null +++ b/theme/bootstrap/plugins/ckeditor/styles.js @@ -0,0 +1,111 @@ +/** + * Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.md or http://ckeditor.com/license + */ + +// This file contains style definitions that can be used by CKEditor plugins. +// +// The most common use for it is the "stylescombo" plugin, which shows a combo +// in the editor toolbar, containing all styles. Other plugins instead, like +// the div plugin, use a subset of the styles on their feature. +// +// If you don't have plugins that depend on this file, you can simply ignore it. +// Otherwise it is strongly recommended to customize this file to match your +// website requirements and design properly. + +CKEDITOR.stylesSet.add( 'default', [ + /* Block Styles */ + + // These styles are already available in the "Format" combo ("format" plugin), + // so they are not needed here by default. You may enable them to avoid + // placing the "Format" combo in the toolbar, maintaining the same features. + /* + { name: 'Paragraph', element: 'p' }, + { name: 'Heading 1', element: 'h1' }, + { name: 'Heading 2', element: 'h2' }, + { name: 'Heading 3', element: 'h3' }, + { name: 'Heading 4', element: 'h4' }, + { name: 'Heading 5', element: 'h5' }, + { name: 'Heading 6', element: 'h6' }, + { name: 'Preformatted Text',element: 'pre' }, + { name: 'Address', element: 'address' }, + */ + + { name: 'Italic Title', element: 'h2', styles: { 'font-style': 'italic' } }, + { name: 'Subtitle', element: 'h3', styles: { 'color': '#aaa', 'font-style': 'italic' } }, + { + name: 'Special Container', + element: 'div', + styles: { + padding: '5px 10px', + background: '#eee', + border: '1px solid #ccc' + } + }, + + /* Inline Styles */ + + // These are core styles available as toolbar buttons. You may opt enabling + // some of them in the Styles combo, removing them from the toolbar. + // (This requires the "stylescombo" plugin) + /* + { name: 'Strong', element: 'strong', overrides: 'b' }, + { name: 'Emphasis', element: 'em' , overrides: 'i' }, + { name: 'Underline', element: 'u' }, + { name: 'Strikethrough', element: 'strike' }, + { name: 'Subscript', element: 'sub' }, + { name: 'Superscript', element: 'sup' }, + */ + + { name: 'Marker', element: 'span', attributes: { 'class': 'marker' } }, + + { name: 'Big', element: 'big' }, + { name: 'Small', element: 'small' }, + { name: 'Typewriter', element: 'tt' }, + + { name: 'Computer Code', element: 'code' }, + { name: 'Keyboard Phrase', element: 'kbd' }, + { name: 'Sample Text', element: 'samp' }, + { name: 'Variable', element: 'var' }, + + { name: 'Deleted Text', element: 'del' }, + { name: 'Inserted Text', element: 'ins' }, + + { name: 'Cited Work', element: 'cite' }, + { name: 'Inline Quotation', element: 'q' }, + + { name: 'Language: RTL', element: 'span', attributes: { 'dir': 'rtl' } }, + { name: 'Language: LTR', element: 'span', attributes: { 'dir': 'ltr' } }, + + /* Object Styles */ + + { + name: 'Styled image (left)', + element: 'img', + attributes: { 'class': 'left' } + }, + + { + name: 'Styled image (right)', + element: 'img', + attributes: { 'class': 'right' } + }, + + { + name: 'Compact table', + element: 'table', + attributes: { + cellpadding: '5', + cellspacing: '0', + border: '1', + bordercolor: '#ccc' + }, + styles: { + 'border-collapse': 'collapse' + } + }, + + { name: 'Borderless Table', element: 'table', styles: { 'border-style': 'hidden', 'background-color': '#E6E6FA' } }, + { name: 'Square Bulleted List', element: 'ul', styles: { 'list-style-type': 'square' } } +]); + diff --git a/theme/bootstrap/plugins/colorpicker/bootstrap-colorpicker.css b/theme/bootstrap/plugins/colorpicker/bootstrap-colorpicker.css new file mode 100644 index 0000000..ba4365e --- /dev/null +++ b/theme/bootstrap/plugins/colorpicker/bootstrap-colorpicker.css @@ -0,0 +1,214 @@ +/*! + * Bootstrap Colorpicker + * http://mjolnic.github.io/bootstrap-colorpicker/ + * + * Originally written by (c) 2012 Stefan Petre + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + */ + +.colorpicker-saturation { + float: left; + width: 100px; + height: 100px; + cursor: crosshair; + background-image: url("img/saturation.png"); +} + +.colorpicker-saturation i { + position: absolute; + top: 0; + left: 0; + display: block; + width: 5px; + height: 5px; + margin: -4px 0 0 -4px; + border: 1px solid #000; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.colorpicker-saturation i b { + display: block; + width: 5px; + height: 5px; + border: 1px solid #fff; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.colorpicker-hue, +.colorpicker-alpha { + float: left; + width: 15px; + height: 100px; + margin-bottom: 4px; + margin-left: 4px; + cursor: row-resize; +} + +.colorpicker-hue i, +.colorpicker-alpha i { + position: absolute; + top: 0; + left: 0; + display: block; + width: 100%; + height: 1px; + margin-top: -1px; + background: #000; + border-top: 1px solid #fff; +} + +.colorpicker-hue { + background-image: url("img/hue.png"); +} + +.colorpicker-alpha { + display: none; + background-image: url("img/alpha.png"); +} + +.colorpicker { + top: 0; + left: 0; + z-index: 2500; + min-width: 130px; + padding: 4px; + margin-top: 1px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *zoom: 1; +} + +.colorpicker:before, +.colorpicker:after { + display: table; + line-height: 0; + content: ""; +} + +.colorpicker:after { + clear: both; +} + +.colorpicker:before { + position: absolute; + top: -7px; + left: 6px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.colorpicker:after { + position: absolute; + top: -6px; + left: 7px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.colorpicker div { + position: relative; +} + +.colorpicker.colorpicker-with-alpha { + min-width: 140px; +} + +.colorpicker.colorpicker-with-alpha .colorpicker-alpha { + display: block; +} + +.colorpicker-color { + height: 10px; + margin-top: 5px; + clear: both; + background-image: url("img/alpha.png"); + background-position: 0 100%; +} + +.colorpicker-color div { + height: 10px; +} + +.colorpicker-element .input-group-addon i { + display: block; + width: 16px; + height: 16px; + cursor: pointer; +} + +.colorpicker.colorpicker-inline { + position: relative; + display: inline-block; + float: none; +} + +.colorpicker.colorpicker-horizontal { + width: 110px; + height: auto; + min-width: 110px; +} + +.colorpicker.colorpicker-horizontal .colorpicker-saturation { + margin-bottom: 4px; +} + +.colorpicker.colorpicker-horizontal .colorpicker-color { + width: 100px; +} + +.colorpicker.colorpicker-horizontal .colorpicker-hue, +.colorpicker.colorpicker-horizontal .colorpicker-alpha { + float: left; + width: 100px; + height: 15px; + margin-bottom: 4px; + margin-left: 0; + cursor: col-resize; +} + +.colorpicker.colorpicker-horizontal .colorpicker-hue i, +.colorpicker.colorpicker-horizontal .colorpicker-alpha i { + position: absolute; + top: 0; + left: 0; + display: block; + width: 1px; + height: 15px; + margin-top: 0; + background: #ffffff; + border: none; +} + +.colorpicker.colorpicker-horizontal .colorpicker-hue { + background-image: url("img/hue-horizontal.png"); +} + +.colorpicker.colorpicker-horizontal .colorpicker-alpha { + background-image: url("img/alpha-horizontal.png"); +} + +.colorpicker.colorpicker-hidden { + display: none; +} + +.colorpicker.colorpicker-visible { + display: block; +} + +.colorpicker-inline.colorpicker-visible { + display: inline-block; +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/colorpicker/bootstrap-colorpicker.js b/theme/bootstrap/plugins/colorpicker/bootstrap-colorpicker.js new file mode 100644 index 0000000..2200b0c --- /dev/null +++ b/theme/bootstrap/plugins/colorpicker/bootstrap-colorpicker.js @@ -0,0 +1,949 @@ +/*! + * Bootstrap Colorpicker + * http://mjolnic.github.io/bootstrap-colorpicker/ + * + * Originally written by (c) 2012 Stefan Petre + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + * @todo Update DOCS + */ +(function($) { + 'use strict'; + + // Color object + var Color = function(val) { + this.value = { + h: 0, + s: 0, + b: 0, + a: 1 + }; + this.origFormat = null; // original string format + if (val) { + if (val.toLowerCase !== undefined) { + this.setColor(val); + } else if (val.h !== undefined) { + this.value = val; + } + } + }; + + Color.prototype = { + constructor: Color, + _sanitizeNumber: function(val) { + if (typeof val === 'number') { + return val; + } + if (isNaN(val) || (val === null) || (val === '') || (val === undefined)) { + return 1; + } + if (val.toLowerCase !== undefined) { + return parseFloat(val); + } + return 1; + }, + //parse a string to HSB + setColor: function(strVal) { + strVal = strVal.toLowerCase(); + this.value = this.stringToHSB(strVal) ||  { + h: 0, + s: 0, + b: 0, + a: 1 + }; + }, + stringToHSB: function(strVal) { + strVal = strVal.toLowerCase(); + var that = this, + result = false; + $.each(this.stringParsers, function(i, parser) { + var match = parser.re.exec(strVal), + values = match && parser.parse.apply(that, [match]), + format = parser.format || 'rgba'; + if (values) { + if (format.match(/hsla?/)) { + result = that.RGBtoHSB.apply(that, that.HSLtoRGB.apply(that, values)); + } else { + result = that.RGBtoHSB.apply(that, values); + } + that.origFormat = format; + return false; + } + return true; + }); + return result; + }, + setHue: function(h) { + this.value.h = 1 - h; + }, + setSaturation: function(s) { + this.value.s = s; + }, + setBrightness: function(b) { + this.value.b = 1 - b; + }, + setAlpha: function(a) { + this.value.a = parseInt((1 - a) * 100, 10) / 100; + }, + toRGB: function(h, s, v, a) { + h = h || this.value.h; + s = s || this.value.s; + v = v || this.value.b; + a = a || this.value.a; + + var r, g, b, i, f, p, q, t; + if (h && s === undefined && v === undefined) { + s = h.s, v = h.v, h = h.h; + } + i = Math.floor(h * 6); + f = h * 6 - i; + p = v * (1 - s); + q = v * (1 - f * s); + t = v * (1 - (1 - f) * s); + switch (i % 6) { + case 0: + r = v, g = t, b = p; + break; + case 1: + r = q, g = v, b = p; + break; + case 2: + r = p, g = v, b = t; + break; + case 3: + r = p, g = q, b = v; + break; + case 4: + r = t, g = p, b = v; + break; + case 5: + r = v, g = p, b = q; + break; + } + return { + r: Math.floor(r * 255), + g: Math.floor(g * 255), + b: Math.floor(b * 255), + a: a + }; + }, + toHex: function(h, s, b, a) { + var rgb = this.toRGB(h, s, b, a); + return '#' + ((1 << 24) | (parseInt(rgb.r) << 16) | (parseInt(rgb.g) << 8) | parseInt(rgb.b)).toString(16).substr(1); + }, + toHSL: function(h, s, b, a) { + h = h || this.value.h; + s = s || this.value.s; + b = b || this.value.b; + a = a || this.value.a; + + var H = h, + L = (2 - s) * b, + S = s * b; + if (L > 0 && L <= 1) { + S /= L; + } else { + S /= 2 - L; + } + L /= 2; + if (S > 1) { + S = 1; + } + return { + h: H, + s: S, + l: L, + a: a + }; + }, + RGBtoHSB: function(r, g, b, a) { + r /= 255; + g /= 255; + b /= 255; + + var H, S, V, C; + V = Math.max(r, g, b); + C = V - Math.min(r, g, b); + H = (C === 0 ? null : + V === r ? (g - b) / C : + V === g ? (b - r) / C + 2 : + (r - g) / C + 4 + ); + H = ((H + 360) % 6) * 60 / 360; + S = C === 0 ? 0 : C / V; + return { + h: this._sanitizeNumber(H), + s: S, + b: V, + a: this._sanitizeNumber(a) + }; + }, + HueToRGB: function(p, q, h) { + if (h < 0) { + h += 1; + } else if (h > 1) { + h -= 1; + } + if ((h * 6) < 1) { + return p + (q - p) * h * 6; + } else if ((h * 2) < 1) { + return q; + } else if ((h * 3) < 2) { + return p + (q - p) * ((2 / 3) - h) * 6; + } else { + return p; + } + }, + HSLtoRGB: function(h, s, l, a) { + if (s < 0) { + s = 0; + } + var q; + if (l <= 0.5) { + q = l * (1 + s); + } else { + q = l + s - (l * s); + } + + var p = 2 * l - q; + + var tr = h + (1 / 3); + var tg = h; + var tb = h - (1 / 3); + + var r = Math.round(this.HueToRGB(p, q, tr) * 255); + var g = Math.round(this.HueToRGB(p, q, tg) * 255); + var b = Math.round(this.HueToRGB(p, q, tb) * 255); + return [r, g, b, this._sanitizeNumber(a)]; + }, + toString: function(format) { + format = format ||  'rgba'; + switch (format) { + case 'rgb': + { + var rgb = this.toRGB(); + return 'rgb(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ')'; + } + break; + case 'rgba': + { + var rgb = this.toRGB(); + return 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + rgb.a + ')'; + } + break; + case 'hsl': + { + var hsl = this.toHSL(); + return 'hsl(' + Math.round(hsl.h * 360) + ',' + Math.round(hsl.s * 100) + '%,' + Math.round(hsl.l * 100) + '%)'; + } + break; + case 'hsla': + { + var hsl = this.toHSL(); + return 'hsla(' + Math.round(hsl.h * 360) + ',' + Math.round(hsl.s * 100) + '%,' + Math.round(hsl.l * 100) + '%,' + hsl.a + ')'; + } + break; + case 'hex': + { + return this.toHex(); + } + break; + default: + { + return false; + } + break; + } + }, + // a set of RE's that can match strings and generate color tuples. + // from John Resig color plugin + // https://github.com/jquery/jquery-color/ + stringParsers: [{ + re: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/, + format: 'hex', + parse: function(execResult) { + return [ + parseInt(execResult[1], 16), + parseInt(execResult[2], 16), + parseInt(execResult[3], 16), + 1 + ]; + } + }, { + re: /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/, + format: 'hex', + parse: function(execResult) { + return [ + parseInt(execResult[1] + execResult[1], 16), + parseInt(execResult[2] + execResult[2], 16), + parseInt(execResult[3] + execResult[3], 16), + 1 + ]; + } + }, { + re: /rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*?\)/, + format: 'rgb', + parse: function(execResult) { + return [ + execResult[1], + execResult[2], + execResult[3], + 1 + ]; + } + }, { + re: /rgb\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/, + format: 'rgb', + parse: function(execResult) { + return [ + 2.55 * execResult[1], + 2.55 * execResult[2], + 2.55 * execResult[3], + 1 + ]; + } + }, { + re: /rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, + format: 'rgba', + parse: function(execResult) { + return [ + execResult[1], + execResult[2], + execResult[3], + execResult[4] + ]; + } + }, { + re: /rgba\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, + format: 'rgba', + parse: function(execResult) { + return [ + 2.55 * execResult[1], + 2.55 * execResult[2], + 2.55 * execResult[3], + execResult[4] + ]; + } + }, { + re: /hsl\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/, + format: 'hsl', + parse: function(execResult) { + return [ + execResult[1] / 360, + execResult[2] / 100, + execResult[3] / 100, + execResult[4] + ]; + } + }, { + re: /hsla\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/, + format: 'hsla', + parse: function(execResult) { + return [ + execResult[1] / 360, + execResult[2] / 100, + execResult[3] / 100, + execResult[4] + ]; + } + }, { + //predefined color name + re: /^([a-z]{3,})$/, + format: 'alias', + parse: function(execResult) { + var hexval = this.colorNameToHex(execResult[0]) ||  '#000000'; + var match = this.stringParsers[0].re.exec(hexval), + values = match && this.stringParsers[0].parse.apply(this, [match]); + return values; + } + }], + colorNameToHex: function(name) { + // 140 predefined colors from the HTML Colors spec + var colors = { + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "black": "#000000", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgreen": "#006400", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "gray": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred ": "#cd5c5c", + "indigo ": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgrey": "#d3d3d3", + "lightgreen": "#90ee90", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370d8", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#d87093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "white": "#ffffff", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32" + }; + + if (typeof colors[name.toLowerCase()] !== 'undefined') { + return colors[name.toLowerCase()]; + } + return false; + } + }; + + + var defaults = { + horizontal: false, // horizontal mode layout ? + inline: false, //forces to show the colorpicker as an inline element + color: false, //forces a color + format: false, //forces a format + input: 'input', // children input selector + container: false, // container selector + component: '.add-on, .input-group-addon', // children component selector + sliders: { + saturation: { + maxLeft: 100, + maxTop: 100, + callLeft: 'setSaturation', + callTop: 'setBrightness' + }, + hue: { + maxLeft: 0, + maxTop: 100, + callLeft: false, + callTop: 'setHue' + }, + alpha: { + maxLeft: 0, + maxTop: 100, + callLeft: false, + callTop: 'setAlpha' + } + }, + slidersHorz: { + saturation: { + maxLeft: 100, + maxTop: 100, + callLeft: 'setSaturation', + callTop: 'setBrightness' + }, + hue: { + maxLeft: 100, + maxTop: 0, + callLeft: 'setHue', + callTop: false + }, + alpha: { + maxLeft: 100, + maxTop: 0, + callLeft: 'setAlpha', + callTop: false + } + }, + template: '<div class="colorpicker dropdown-menu">' + + '<div class="colorpicker-saturation"><i><b></b></i></div>' + + '<div class="colorpicker-hue"><i></i></div>' + + '<div class="colorpicker-alpha"><i></i></div>' + + '<div class="colorpicker-color"><div /></div>' + + '</div>' + }; + + var Colorpicker = function(element, options) { + this.element = $(element).addClass('colorpicker-element'); + this.options = $.extend({}, defaults, this.element.data(), options); + this.component = this.options.component; + this.component = (this.component !== false) ? this.element.find(this.component) : false; + if (this.component && (this.component.length === 0)) { + this.component = false; + } + this.container = (this.options.container === true) ? this.element : this.options.container; + this.container = (this.container !== false) ? $(this.container) : false; + + // Is the element an input? Should we search inside for any input? + this.input = this.element.is('input') ? this.element : (this.options.input ? + this.element.find(this.options.input) : false); + if (this.input && (this.input.length === 0)) { + this.input = false; + } + // Set HSB color + this.color = new Color(this.options.color !== false ? this.options.color : this.getValue()); + this.format = this.options.format !== false ? this.options.format : this.color.origFormat; + + // Setup picker + this.picker = $(this.options.template); + if (this.options.inline) { + this.picker.addClass('colorpicker-inline colorpicker-visible'); + } else { + this.picker.addClass('colorpicker-hidden'); + } + if (this.options.horizontal) { + this.picker.addClass('colorpicker-horizontal'); + } + if (this.format === 'rgba' || this.format === 'hsla') { + this.picker.addClass('colorpicker-with-alpha'); + } + this.picker.on('mousedown.colorpicker', $.proxy(this.mousedown, this)); + this.picker.appendTo(this.container ? this.container : $('body')); + + // Bind events + if (this.input !== false) { + this.input.on({ + 'keyup.colorpicker': $.proxy(this.keyup, this) + }); + if (this.component === false) { + this.element.on({ + 'focus.colorpicker': $.proxy(this.show, this) + }); + } + if (this.options.inline === false) { + this.element.on({ + 'focusout.colorpicker': $.proxy(this.hide, this) + }); + } + } + + if (this.component !== false) { + this.component.on({ + 'click.colorpicker': $.proxy(this.show, this) + }); + } + + if ((this.input === false) && (this.component === false)) { + this.element.on({ + 'click.colorpicker': $.proxy(this.show, this) + }); + } + this.update(); + + $($.proxy(function() { + this.element.trigger('create'); + }, this)); + }; + + Colorpicker.version = '2.0.0-beta'; + + Colorpicker.Color = Color; + + Colorpicker.prototype = { + constructor: Colorpicker, + destroy: function() { + this.picker.remove(); + this.element.removeData('colorpicker').off('.colorpicker'); + if (this.input !== false) { + this.input.off('.colorpicker'); + } + if (this.component !== false) { + this.component.off('.colorpicker'); + } + this.element.removeClass('colorpicker-element'); + this.element.trigger({ + type: 'destroy' + }); + }, + reposition: function() { + if (this.options.inline !== false) { + return false; + } + var offset = this.component ? this.component.offset() : this.element.offset(); + this.picker.css({ + top: offset.top + (this.component ? this.component.outerHeight() : this.element.outerHeight()), + left: offset.left + }); + }, + show: function(e) { + if (this.isDisabled()) { + return false; + } + this.picker.addClass('colorpicker-visible').removeClass('colorpicker-hidden'); + this.reposition(); + $(window).on('resize.colorpicker', $.proxy(this.reposition, this)); + if (!this.hasInput() && e) { + if (e.stopPropagation && e.preventDefault) { + e.stopPropagation(); + e.preventDefault(); + } + } + if (this.options.inline === false) { + $(window.document).on({ + 'mousedown.colorpicker': $.proxy(this.hide, this) + }); + } + this.element.trigger({ + type: 'showPicker', + color: this.color + }); + }, + hide: function() { + this.picker.addClass('colorpicker-hidden').removeClass('colorpicker-visible'); + $(window).off('resize.colorpicker', this.reposition); + $(document).off({ + 'mousedown.colorpicker': this.hide + }); + this.update(); + this.element.trigger({ + type: 'hidePicker', + color: this.color + }); + }, + updateData: function(val) { + val = val ||  this.color.toString(this.format); + this.element.data('color', val); + return val; + }, + updateInput: function(val) { + val = val ||  this.color.toString(this.format); + if (this.input !== false) { + this.input.prop('value', val); + } + return val; + }, + updatePicker: function(val) { + if (val !== undefined) { + this.color = new Color(val); + } + var sl = (this.options.horizontal === false) ? this.options.sliders : this.options.slidersHorz; + var icns = this.picker.find('i'); + if (icns.length === 0) { + return; + } + if (this.options.horizontal === false) { + sl = this.options.sliders; + icns.eq(1).css('top', sl.hue.maxTop * (1 - this.color.value.h)).end() + .eq(2).css('top', sl.alpha.maxTop * (1 - this.color.value.a)); + } else { + sl = this.options.slidersHorz; + icns.eq(1).css('left', sl.hue.maxLeft * (1 - this.color.value.h)).end() + .eq(2).css('left', sl.alpha.maxLeft * (1 - this.color.value.a)); + } + icns.eq(0).css({ + 'top': sl.saturation.maxTop - this.color.value.b * sl.saturation.maxTop, + 'left': this.color.value.s * sl.saturation.maxLeft + }); + this.picker.find('.colorpicker-saturation').css('backgroundColor', this.color.toHex(this.color.value.h, 1, 1, 1)); + this.picker.find('.colorpicker-alpha').css('backgroundColor', this.color.toHex()); + this.picker.find('.colorpicker-color, .colorpicker-color div').css('backgroundColor', this.color.toString(this.format)); + return val; + }, + updateComponent: function(val) { + val = val ||  this.color.toString(this.format); + if (this.component !== false) { + var icn = this.component.find('i').eq(0); + if (icn.length > 0) { + icn.css({ + 'backgroundColor': val + }); + } else { + this.component.css({ + 'backgroundColor': val + }); + } + } + return val; + }, + update: function(force) { + var val = this.updateComponent(); + if ((this.getValue(false) !== false) || (force === true)) { + // Update input/data only if the current value is not blank + this.updateInput(val); + this.updateData(val); + } + this.updatePicker(); + return val; + + }, + setValue: function(val) { // set color manually + this.color = new Color(val); + this.update(); + this.element.trigger({ + type: 'changeColor', + color: this.color, + value: val + }); + }, + getValue: function(defaultValue) { + defaultValue = (defaultValue === undefined) ? '#000000' : defaultValue; + var val; + if (this.hasInput()) { + val = this.input.val(); + } else { + val = this.element.data('color'); + } + if ((val === undefined) || (val === '') || (val === null)) { + // if not defined or empty, return default + val = defaultValue; + } + return val; + }, + hasInput: function() { + return (this.input !== false); + }, + isDisabled: function() { + if (this.hasInput()) { + return (this.input.prop('disabled') === true); + } + return false; + }, + disable: function() { + if (this.hasInput()) { + this.input.prop('disabled', true); + return true; + } + return false; + }, + enable: function() { + if (this.hasInput()) { + this.input.prop('disabled', false); + return true; + } + return false; + }, + currentSlider: null, + mousePointer: { + left: 0, + top: 0 + }, + mousedown: function(e) { + e.stopPropagation(); + e.preventDefault(); + + var target = $(e.target); + + //detect the slider and set the limits and callbacks + var zone = target.closest('div'); + var sl = this.options.horizontal ? this.options.slidersHorz : this.options.sliders; + if (!zone.is('.colorpicker')) { + if (zone.is('.colorpicker-saturation')) { + this.currentSlider = $.extend({}, sl.saturation); + } else if (zone.is('.colorpicker-hue')) { + this.currentSlider = $.extend({}, sl.hue); + } else if (zone.is('.colorpicker-alpha')) { + this.currentSlider = $.extend({}, sl.alpha); + } else { + return false; + } + var offset = zone.offset(); + //reference to guide's style + this.currentSlider.guide = zone.find('i')[0].style; + this.currentSlider.left = e.pageX - offset.left; + this.currentSlider.top = e.pageY - offset.top; + this.mousePointer = { + left: e.pageX, + top: e.pageY + }; + //trigger mousemove to move the guide to the current position + $(document).on({ + 'mousemove.colorpicker': $.proxy(this.mousemove, this), + 'mouseup.colorpicker': $.proxy(this.mouseup, this) + }).trigger('mousemove'); + } + return false; + }, + mousemove: function(e) { + e.stopPropagation(); + e.preventDefault(); + var left = Math.max( + 0, + Math.min( + this.currentSlider.maxLeft, + this.currentSlider.left + ((e.pageX || this.mousePointer.left) - this.mousePointer.left) + ) + ); + var top = Math.max( + 0, + Math.min( + this.currentSlider.maxTop, + this.currentSlider.top + ((e.pageY || this.mousePointer.top) - this.mousePointer.top) + ) + ); + this.currentSlider.guide.left = left + 'px'; + this.currentSlider.guide.top = top + 'px'; + if (this.currentSlider.callLeft) { + this.color[this.currentSlider.callLeft].call(this.color, left / 100); + } + if (this.currentSlider.callTop) { + this.color[this.currentSlider.callTop].call(this.color, top / 100); + } + this.update(true); + + this.element.trigger({ + type: 'changeColor', + color: this.color + }); + return false; + }, + mouseup: function(e) { + e.stopPropagation(); + e.preventDefault(); + $(document).off({ + 'mousemove.colorpicker': this.mousemove, + 'mouseup.colorpicker': this.mouseup + }); + return false; + }, + keyup: function(e) { + if ((e.keyCode === 38)) { + if (this.color.value.a < 1) { + this.color.value.a = Math.round((this.color.value.a + 0.01) * 100) / 100; + } + this.update(true); + } else if ((e.keyCode === 40)) { + if (this.color.value.a > 0) { + this.color.value.a = Math.round((this.color.value.a - 0.01) * 100) / 100; + } + this.update(true); + } else { + var val = this.input.val(); + this.color = new Color(val); + if (this.getValue(false) !== false) { + this.updateData(); + this.updateComponent(); + this.updatePicker(); + } + } + this.element.trigger({ + type: 'changeColor', + color: this.color, + value: val + }); + } + }; + + $.colorpicker = Colorpicker; + + $.fn.colorpicker = function(option) { + return this.each(function() { + var $this = $(this), + inst = $this.data('colorpicker'), + options = ((typeof option === 'object') ? option : {}); + if ((!inst) && (typeof option !== 'string')) { + $this.data('colorpicker', new Colorpicker(this, options)); + } else { + if (typeof option === 'string') { + inst[option].apply(inst, Array.prototype.slice.call(arguments, 1)); + } + } + }); + }; + + $.fn.colorpicker.constructor = Colorpicker; + +})(window.jQuery); diff --git a/theme/bootstrap/plugins/colorpicker/bootstrap-colorpicker.min.css b/theme/bootstrap/plugins/colorpicker/bootstrap-colorpicker.min.css new file mode 100644 index 0000000..16a2d1a --- /dev/null +++ b/theme/bootstrap/plugins/colorpicker/bootstrap-colorpicker.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap Colorpicker + * http://mjolnic.github.io/bootstrap-colorpicker/ + * + * Originally written by (c) 2012 Stefan Petre + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0.txt + * + */.colorpicker-saturation{float:left;width:100px;height:100px;cursor:crosshair;background-image:url("img/saturation.png")}.colorpicker-saturation i{position:absolute;top:0;left:0;display:block;width:5px;height:5px;margin:-4px 0 0 -4px;border:1px solid #000;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-saturation i b{display:block;width:5px;height:5px;border:1px solid #fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-hue,.colorpicker-alpha{float:left;width:15px;height:100px;margin-bottom:4px;margin-left:4px;cursor:row-resize}.colorpicker-hue i,.colorpicker-alpha i{position:absolute;top:0;left:0;display:block;width:100%;height:1px;margin-top:-1px;background:#000;border-top:1px solid #fff}.colorpicker-hue{background-image:url("img/hue.png")}.colorpicker-alpha{display:none;background-image:url("img/alpha.png")}.colorpicker{top:0;left:0;z-index:2500;min-width:130px;padding:4px;margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1}.colorpicker:before,.colorpicker:after{display:table;line-height:0;content:""}.colorpicker:after{clear:both}.colorpicker:before{position:absolute;top:-7px;left:6px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.colorpicker:after{position:absolute;top:-6px;left:7px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.colorpicker div{position:relative}.colorpicker.colorpicker-with-alpha{min-width:140px}.colorpicker.colorpicker-with-alpha .colorpicker-alpha{display:block}.colorpicker-color{height:10px;margin-top:5px;clear:both;background-image:url("img/alpha.png");background-position:0 100%}.colorpicker-color div{height:10px}.colorpicker-element .input-group-addon i{display:block;width:16px;height:16px;cursor:pointer}.colorpicker.colorpicker-inline{position:relative;display:inline-block;float:none}.colorpicker.colorpicker-horizontal{width:110px;height:auto;min-width:110px}.colorpicker.colorpicker-horizontal .colorpicker-saturation{margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-color{width:100px}.colorpicker.colorpicker-horizontal .colorpicker-hue,.colorpicker.colorpicker-horizontal .colorpicker-alpha{float:left;width:100px;height:15px;margin-bottom:4px;margin-left:0;cursor:col-resize}.colorpicker.colorpicker-horizontal .colorpicker-hue i,.colorpicker.colorpicker-horizontal .colorpicker-alpha i{position:absolute;top:0;left:0;display:block;width:1px;height:15px;margin-top:0;background:#fff;border:0}.colorpicker.colorpicker-horizontal .colorpicker-hue{background-image:url("img/hue-horizontal.png")}.colorpicker.colorpicker-horizontal .colorpicker-alpha{background-image:url("img/alpha-horizontal.png")}.colorpicker.colorpicker-hidden{display:none}.colorpicker.colorpicker-visible{display:block}.colorpicker-inline.colorpicker-visible{display:inline-block} \ No newline at end of file diff --git a/theme/bootstrap/plugins/colorpicker/bootstrap-colorpicker.min.js b/theme/bootstrap/plugins/colorpicker/bootstrap-colorpicker.min.js new file mode 100644 index 0000000..bc4fba9 --- /dev/null +++ b/theme/bootstrap/plugins/colorpicker/bootstrap-colorpicker.min.js @@ -0,0 +1 @@ +!function(a){"use strict";var b=function(a){this.value={h:0,s:0,b:0,a:1},this.origFormat=null,a&&(void 0!==a.toLowerCase?this.setColor(a):void 0!==a.h&&(this.value=a))};b.prototype={constructor:b,_sanitizeNumber:function(a){return"number"==typeof a?a:isNaN(a)||null===a||""===a||void 0===a?1:void 0!==a.toLowerCase?parseFloat(a):1},setColor:function(a){a=a.toLowerCase(),this.value=this.stringToHSB(a)||{h:0,s:0,b:0,a:1}},stringToHSB:function(b){b=b.toLowerCase();var c=this,d=!1;return a.each(this.stringParsers,function(a,e){var f=e.re.exec(b),g=f&&e.parse.apply(c,[f]),h=e.format||"rgba";return g?(d=h.match(/hsla?/)?c.RGBtoHSB.apply(c,c.HSLtoRGB.apply(c,g)):c.RGBtoHSB.apply(c,g),c.origFormat=h,!1):!0}),d},setHue:function(a){this.value.h=1-a},setSaturation:function(a){this.value.s=a},setBrightness:function(a){this.value.b=1-a},setAlpha:function(a){this.value.a=parseInt(100*(1-a),10)/100},toRGB:function(a,b,c,d){a=a||this.value.h,b=b||this.value.s,c=c||this.value.b,d=d||this.value.a;var e,f,g,h,i,j,k,l;switch(a&&void 0===b&&void 0===c&&(b=a.s,c=a.v,a=a.h),h=Math.floor(6*a),i=6*a-h,j=c*(1-b),k=c*(1-i*b),l=c*(1-(1-i)*b),h%6){case 0:e=c,f=l,g=j;break;case 1:e=k,f=c,g=j;break;case 2:e=j,f=c,g=l;break;case 3:e=j,f=k,g=c;break;case 4:e=l,f=j,g=c;break;case 5:e=c,f=j,g=k}return{r:Math.floor(255*e),g:Math.floor(255*f),b:Math.floor(255*g),a:d}},toHex:function(a,b,c,d){var e=this.toRGB(a,b,c,d);return"#"+(1<<24|parseInt(e.r)<<16|parseInt(e.g)<<8|parseInt(e.b)).toString(16).substr(1)},toHSL:function(a,b,c,d){a=a||this.value.h,b=b||this.value.s,c=c||this.value.b,d=d||this.value.a;var e=a,f=(2-b)*c,g=b*c;return g/=f>0&&1>=f?f:2-f,f/=2,g>1&&(g=1),{h:e,s:g,l:f,a:d}},RGBtoHSB:function(a,b,c,d){a/=255,b/=255,c/=255;var e,f,g,h;return g=Math.max(a,b,c),h=g-Math.min(a,b,c),e=0===h?null:g===a?(b-c)/h:g===b?(c-a)/h+2:(a-b)/h+4,e=(e+360)%6*60/360,f=0===h?0:h/g,{h:this._sanitizeNumber(e),s:f,b:g,a:this._sanitizeNumber(d)}},HueToRGB:function(a,b,c){return 0>c?c+=1:c>1&&(c-=1),1>6*c?a+(b-a)*c*6:1>2*c?b:2>3*c?a+(b-a)*(2/3-c)*6:a},HSLtoRGB:function(a,b,c,d){0>b&&(b=0);var e;e=.5>=c?c*(1+b):c+b-c*b;var f=2*c-e,g=a+1/3,h=a,i=a-1/3,j=Math.round(255*this.HueToRGB(f,e,g)),k=Math.round(255*this.HueToRGB(f,e,h)),l=Math.round(255*this.HueToRGB(f,e,i));return[j,k,l,this._sanitizeNumber(d)]},toString:function(a){switch(a=a||"rgba"){case"rgb":var b=this.toRGB();return"rgb("+b.r+","+b.g+","+b.b+")";case"rgba":var b=this.toRGB();return"rgba("+b.r+","+b.g+","+b.b+","+b.a+")";case"hsl":var c=this.toHSL();return"hsl("+Math.round(360*c.h)+","+Math.round(100*c.s)+"%,"+Math.round(100*c.l)+"%)";case"hsla":var c=this.toHSL();return"hsla("+Math.round(360*c.h)+","+Math.round(100*c.s)+"%,"+Math.round(100*c.l)+"%,"+c.a+")";case"hex":return this.toHex();default:return!1}},stringParsers:[{re:/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,format:"hex",parse:function(a){return[parseInt(a[1],16),parseInt(a[2],16),parseInt(a[3],16),1]}},{re:/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/,format:"hex",parse:function(a){return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16),1]}},{re:/rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*?\)/,format:"rgb",parse:function(a){return[a[1],a[2],a[3],1]}},{re:/rgb\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/,format:"rgb",parse:function(a){return[2.55*a[1],2.55*a[2],2.55*a[3],1]}},{re:/rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,format:"rgba",parse:function(a){return[a[1],a[2],a[3],a[4]]}},{re:/rgba\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,format:"rgba",parse:function(a){return[2.55*a[1],2.55*a[2],2.55*a[3],a[4]]}},{re:/hsl\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/,format:"hsl",parse:function(a){return[a[1]/360,a[2]/100,a[3]/100,a[4]]}},{re:/hsla\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,format:"hsla",parse:function(a){return[a[1]/360,a[2]/100,a[3]/100,a[4]]}},{re:/^([a-z]{3,})$/,format:"alias",parse:function(a){var b=this.colorNameToHex(a[0])||"#000000",c=this.stringParsers[0].re.exec(b),d=c&&this.stringParsers[0].parse.apply(this,[c]);return d}}],colorNameToHex:function(a){var b={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4","indianred ":"#cd5c5c","indigo ":"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};return"undefined"!=typeof b[a.toLowerCase()]?b[a.toLowerCase()]:!1}};var c={horizontal:!1,inline:!1,color:!1,format:!1,input:"input",container:!1,component:".add-on, .input-group-addon",sliders:{saturation:{maxLeft:100,maxTop:100,callLeft:"setSaturation",callTop:"setBrightness"},hue:{maxLeft:0,maxTop:100,callLeft:!1,callTop:"setHue"},alpha:{maxLeft:0,maxTop:100,callLeft:!1,callTop:"setAlpha"}},slidersHorz:{saturation:{maxLeft:100,maxTop:100,callLeft:"setSaturation",callTop:"setBrightness"},hue:{maxLeft:100,maxTop:0,callLeft:"setHue",callTop:!1},alpha:{maxLeft:100,maxTop:0,callLeft:"setAlpha",callTop:!1}},template:'<div class="colorpicker dropdown-menu"><div class="colorpicker-saturation"><i><b></b></i></div><div class="colorpicker-hue"><i></i></div><div class="colorpicker-alpha"><i></i></div><div class="colorpicker-color"><div /></div></div>'},d=function(d,e){this.element=a(d).addClass("colorpicker-element"),this.options=a.extend({},c,this.element.data(),e),this.component=this.options.component,this.component=this.component!==!1?this.element.find(this.component):!1,this.component&&0===this.component.length&&(this.component=!1),this.container=this.options.container===!0?this.element:this.options.container,this.container=this.container!==!1?a(this.container):!1,this.input=this.element.is("input")?this.element:this.options.input?this.element.find(this.options.input):!1,this.input&&0===this.input.length&&(this.input=!1),this.color=new b(this.options.color!==!1?this.options.color:this.getValue()),this.format=this.options.format!==!1?this.options.format:this.color.origFormat,this.picker=a(this.options.template),this.options.inline?this.picker.addClass("colorpicker-inline colorpicker-visible"):this.picker.addClass("colorpicker-hidden"),this.options.horizontal&&this.picker.addClass("colorpicker-horizontal"),("rgba"===this.format||"hsla"===this.format)&&this.picker.addClass("colorpicker-with-alpha"),this.picker.on("mousedown.colorpicker",a.proxy(this.mousedown,this)),this.picker.appendTo(this.container?this.container:a("body")),this.input!==!1&&(this.input.on({"keyup.colorpicker":a.proxy(this.keyup,this)}),this.component===!1&&this.element.on({"focus.colorpicker":a.proxy(this.show,this)}),this.options.inline===!1&&this.element.on({"focusout.colorpicker":a.proxy(this.hide,this)})),this.component!==!1&&this.component.on({"click.colorpicker":a.proxy(this.show,this)}),this.input===!1&&this.component===!1&&this.element.on({"click.colorpicker":a.proxy(this.show,this)}),this.update(),a(a.proxy(function(){this.element.trigger("create")},this))};d.version="2.0.0-beta",d.Color=b,d.prototype={constructor:d,destroy:function(){this.picker.remove(),this.element.removeData("colorpicker").off(".colorpicker"),this.input!==!1&&this.input.off(".colorpicker"),this.component!==!1&&this.component.off(".colorpicker"),this.element.removeClass("colorpicker-element"),this.element.trigger({type:"destroy"})},reposition:function(){if(this.options.inline!==!1)return!1;var a=this.component?this.component.offset():this.element.offset();this.picker.css({top:a.top+(this.component?this.component.outerHeight():this.element.outerHeight()),left:a.left})},show:function(b){return this.isDisabled()?!1:(this.picker.addClass("colorpicker-visible").removeClass("colorpicker-hidden"),this.reposition(),a(window).on("resize.colorpicker",a.proxy(this.reposition,this)),!this.hasInput()&&b&&b.stopPropagation&&b.preventDefault&&(b.stopPropagation(),b.preventDefault()),this.options.inline===!1&&a(window.document).on({"mousedown.colorpicker":a.proxy(this.hide,this)}),this.element.trigger({type:"showPicker",color:this.color}),void 0)},hide:function(){this.picker.addClass("colorpicker-hidden").removeClass("colorpicker-visible"),a(window).off("resize.colorpicker",this.reposition),a(document).off({"mousedown.colorpicker":this.hide}),this.update(),this.element.trigger({type:"hidePicker",color:this.color})},updateData:function(a){return a=a||this.color.toString(this.format),this.element.data("color",a),a},updateInput:function(a){return a=a||this.color.toString(this.format),this.input!==!1&&this.input.prop("value",a),a},updatePicker:function(a){void 0!==a&&(this.color=new b(a));var c=this.options.horizontal===!1?this.options.sliders:this.options.slidersHorz,d=this.picker.find("i");return 0!==d.length?(this.options.horizontal===!1?(c=this.options.sliders,d.eq(1).css("top",c.hue.maxTop*(1-this.color.value.h)).end().eq(2).css("top",c.alpha.maxTop*(1-this.color.value.a))):(c=this.options.slidersHorz,d.eq(1).css("left",c.hue.maxLeft*(1-this.color.value.h)).end().eq(2).css("left",c.alpha.maxLeft*(1-this.color.value.a))),d.eq(0).css({top:c.saturation.maxTop-this.color.value.b*c.saturation.maxTop,left:this.color.value.s*c.saturation.maxLeft}),this.picker.find(".colorpicker-saturation").css("backgroundColor",this.color.toHex(this.color.value.h,1,1,1)),this.picker.find(".colorpicker-alpha").css("backgroundColor",this.color.toHex()),this.picker.find(".colorpicker-color, .colorpicker-color div").css("backgroundColor",this.color.toString(this.format)),a):void 0},updateComponent:function(a){if(a=a||this.color.toString(this.format),this.component!==!1){var b=this.component.find("i").eq(0);b.length>0?b.css({backgroundColor:a}):this.component.css({backgroundColor:a})}return a},update:function(a){var b=this.updateComponent();return(this.getValue(!1)!==!1||a===!0)&&(this.updateInput(b),this.updateData(b)),this.updatePicker(),b},setValue:function(a){this.color=new b(a),this.update(),this.element.trigger({type:"changeColor",color:this.color,value:a})},getValue:function(a){a=void 0===a?"#000000":a;var b;return b=this.hasInput()?this.input.val():this.element.data("color"),(void 0===b||""===b||null===b)&&(b=a),b},hasInput:function(){return this.input!==!1},isDisabled:function(){return this.hasInput()?this.input.prop("disabled")===!0:!1},disable:function(){return this.hasInput()?(this.input.prop("disabled",!0),!0):!1},enable:function(){return this.hasInput()?(this.input.prop("disabled",!1),!0):!1},currentSlider:null,mousePointer:{left:0,top:0},mousedown:function(b){b.stopPropagation(),b.preventDefault();var c=a(b.target),d=c.closest("div"),e=this.options.horizontal?this.options.slidersHorz:this.options.sliders;if(!d.is(".colorpicker")){if(d.is(".colorpicker-saturation"))this.currentSlider=a.extend({},e.saturation);else if(d.is(".colorpicker-hue"))this.currentSlider=a.extend({},e.hue);else{if(!d.is(".colorpicker-alpha"))return!1;this.currentSlider=a.extend({},e.alpha)}var f=d.offset();this.currentSlider.guide=d.find("i")[0].style,this.currentSlider.left=b.pageX-f.left,this.currentSlider.top=b.pageY-f.top,this.mousePointer={left:b.pageX,top:b.pageY},a(document).on({"mousemove.colorpicker":a.proxy(this.mousemove,this),"mouseup.colorpicker":a.proxy(this.mouseup,this)}).trigger("mousemove")}return!1},mousemove:function(a){a.stopPropagation(),a.preventDefault();var b=Math.max(0,Math.min(this.currentSlider.maxLeft,this.currentSlider.left+((a.pageX||this.mousePointer.left)-this.mousePointer.left))),c=Math.max(0,Math.min(this.currentSlider.maxTop,this.currentSlider.top+((a.pageY||this.mousePointer.top)-this.mousePointer.top)));return this.currentSlider.guide.left=b+"px",this.currentSlider.guide.top=c+"px",this.currentSlider.callLeft&&this.color[this.currentSlider.callLeft].call(this.color,b/100),this.currentSlider.callTop&&this.color[this.currentSlider.callTop].call(this.color,c/100),this.update(!0),this.element.trigger({type:"changeColor",color:this.color}),!1},mouseup:function(b){return b.stopPropagation(),b.preventDefault(),a(document).off({"mousemove.colorpicker":this.mousemove,"mouseup.colorpicker":this.mouseup}),!1},keyup:function(a){if(38===a.keyCode)this.color.value.a<1&&(this.color.value.a=Math.round(100*(this.color.value.a+.01))/100),this.update(!0);else if(40===a.keyCode)this.color.value.a>0&&(this.color.value.a=Math.round(100*(this.color.value.a-.01))/100),this.update(!0);else{var c=this.input.val();this.color=new b(c),this.getValue(!1)!==!1&&(this.updateData(),this.updateComponent(),this.updatePicker())}this.element.trigger({type:"changeColor",color:this.color,value:c})}},a.colorpicker=d,a.fn.colorpicker=function(b){return this.each(function(){var c=a(this),e=c.data("colorpicker"),f="object"==typeof b?b:{};e||"string"==typeof b?"string"==typeof b&&e[b].apply(e,Array.prototype.slice.call(arguments,1)):c.data("colorpicker",new d(this,f))})},a.fn.colorpicker.constructor=d}(window.jQuery); \ No newline at end of file diff --git a/theme/bootstrap/plugins/colorpicker/img/alpha-horizontal.png b/theme/bootstrap/plugins/colorpicker/img/alpha-horizontal.png new file mode 100644 index 0000000..d0a65c0 Binary files /dev/null and b/theme/bootstrap/plugins/colorpicker/img/alpha-horizontal.png differ diff --git a/theme/bootstrap/plugins/colorpicker/img/alpha.png b/theme/bootstrap/plugins/colorpicker/img/alpha.png new file mode 100644 index 0000000..38043f1 Binary files /dev/null and b/theme/bootstrap/plugins/colorpicker/img/alpha.png differ diff --git a/theme/bootstrap/plugins/colorpicker/img/hue-horizontal.png b/theme/bootstrap/plugins/colorpicker/img/hue-horizontal.png new file mode 100644 index 0000000..a0d9add Binary files /dev/null and b/theme/bootstrap/plugins/colorpicker/img/hue-horizontal.png differ diff --git a/theme/bootstrap/plugins/colorpicker/img/hue.png b/theme/bootstrap/plugins/colorpicker/img/hue.png new file mode 100644 index 0000000..d89560e Binary files /dev/null and b/theme/bootstrap/plugins/colorpicker/img/hue.png differ diff --git a/theme/bootstrap/plugins/colorpicker/img/saturation.png b/theme/bootstrap/plugins/colorpicker/img/saturation.png new file mode 100644 index 0000000..594ae50 Binary files /dev/null and b/theme/bootstrap/plugins/colorpicker/img/saturation.png differ diff --git a/theme/bootstrap/plugins/datatables/dataTables.bootstrap.css b/theme/bootstrap/plugins/datatables/dataTables.bootstrap.css new file mode 100644 index 0000000..2ccacaf --- /dev/null +++ b/theme/bootstrap/plugins/datatables/dataTables.bootstrap.css @@ -0,0 +1,372 @@ +div.dataTables_length label { + font-weight: normal; + text-align: left; + white-space: nowrap; +} + +div.dataTables_length select { + width: 75px; + display: inline-block; +} + +div.dataTables_filter { + text-align: right; +} + +div.dataTables_filter label { + font-weight: normal; + white-space: nowrap; + text-align: left; +} + +div.dataTables_filter input { + margin-left: 0.5em; + display: inline-block; + width: auto; +} + +div.dataTables_info { + padding-top: 8px; + white-space: nowrap; +} + +div.dataTables_paginate { + margin: 0; + white-space: nowrap; + text-align: right; +} + +div.dataTables_paginate ul.pagination { + margin: 2px 0; + white-space: nowrap; +} + +@media screen and (max-width: 767px) { + div.dataTables_wrapper > div.row > div, + div.dataTables_length, + div.dataTables_filter, + div.dataTables_info, + div.dataTables_paginate { + text-align: center; + } + + div.DTTT { + margin-bottom: 0.5em; + } +} + + +table.dataTable td, +table.dataTable th { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + + +table.dataTable { + clear: both; + margin-top: 6px !important; + margin-bottom: 6px !important; + max-width: none !important; +} + +table.dataTable thead .sorting, +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc, +table.dataTable thead .sorting_asc_disabled, +table.dataTable thead .sorting_desc_disabled { + cursor: pointer; + position: relative; +} + +table.dataTable thead .sorting:after, +table.dataTable thead .sorting_asc:after, +table.dataTable thead .sorting_desc:after { + position: absolute; + top: 8px; + right: 8px; + display: block; + font-family: 'Glyphicons Halflings'; + opacity: 0.5; +} +table.dataTable thead .sorting:after { + opacity: 0.2; + content: "\e150"; /* sort */ +} +table.dataTable thead .sorting_asc:after { + content: "\e155"; /* sort-by-attributes */ +} +table.dataTable thead .sorting_desc:after { + content: "\e156"; /* sort-by-attributes-alt */ +} +div.dataTables_scrollBody table.dataTable thead .sorting:after, +div.dataTables_scrollBody table.dataTable thead .sorting_asc:after, +div.dataTables_scrollBody table.dataTable thead .sorting_desc:after { + display: none; +} + +table.dataTable thead .sorting_asc_disabled:after, +table.dataTable thead .sorting_desc_disabled:after { + color: #eee; +} + +table.dataTable thead > tr > th { + padding-right: 30px; +} + +table.dataTable th:active { + outline: none; +} + + +/* Condensed */ +table.dataTable.table-condensed thead > tr > th { + padding-right: 20px; +} + +table.dataTable.table-condensed thead .sorting:after, +table.dataTable.table-condensed thead .sorting_asc:after, +table.dataTable.table-condensed thead .sorting_desc:after { + top: 6px; + right: 6px; +} + +/* Scrolling */ +div.dataTables_scrollHead table { + margin-bottom: 0 !important; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +div.dataTables_scrollHead table thead tr:last-child th:first-child, +div.dataTables_scrollHead table thead tr:last-child td:first-child { + border-bottom-left-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} + +div.dataTables_scrollBody table { + border-top: none; + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +div.dataTables_scrollBody tbody tr:first-child th, +div.dataTables_scrollBody tbody tr:first-child td { + border-top: none; +} + +div.dataTables_scrollFoot table { + margin-top: 0 !important; + border-top: none; +} + +/* Frustratingly the border-collapse:collapse used by Bootstrap makes the column + width calculations when using scrolling impossible to align columns. We have + to use separate + */ +table.table-bordered.dataTable { + border-collapse: separate !important; +} +table.table-bordered thead th, +table.table-bordered thead td { + border-left-width: 0; + border-top-width: 0; +} +table.table-bordered tbody th, +table.table-bordered tbody td { + border-left-width: 0; + border-bottom-width: 0; +} +table.table-bordered tfoot th, +table.table-bordered tfoot td { + border-left-width: 0; + border-bottom-width: 0; +} +table.table-bordered th:last-child, +table.table-bordered td:last-child { + border-right-width: 0; +} +div.dataTables_scrollHead table.table-bordered { + border-bottom-width: 0; +} + + + + +/* + * TableTools styles + */ +.table.dataTable tbody tr.active td, +.table.dataTable tbody tr.active th { + background-color: #08C; + color: white; +} + +.table.dataTable tbody tr.active:hover td, +.table.dataTable tbody tr.active:hover th { + background-color: #0075b0 !important; +} + +.table.dataTable tbody tr.active th > a, +.table.dataTable tbody tr.active td > a { + color: white; +} + +.table-striped.dataTable tbody tr.active:nth-child(odd) td, +.table-striped.dataTable tbody tr.active:nth-child(odd) th { + background-color: #017ebc; +} + +table.DTTT_selectable tbody tr { + cursor: pointer; +} + +div.DTTT .btn:hover { + text-decoration: none !important; +} + +ul.DTTT_dropdown.dropdown-menu { + z-index: 2003; +} + +ul.DTTT_dropdown.dropdown-menu a { + color: #333 !important; /* needed only when demo_page.css is included */ +} + +ul.DTTT_dropdown.dropdown-menu li { + position: relative; +} + +ul.DTTT_dropdown.dropdown-menu li:hover a { + background-color: #0088cc; + color: white !important; +} + +div.DTTT_collection_background { + z-index: 2002; +} + +/* TableTools information display */ +div.DTTT_print_info { + position: fixed; + top: 50%; + left: 50%; + width: 400px; + height: 150px; + margin-left: -200px; + margin-top: -75px; + text-align: center; + color: #333; + padding: 10px 30px; + opacity: 0.95; + + background-color: white; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5); +} + +div.DTTT_print_info h6 { + font-weight: normal; + font-size: 28px; + line-height: 28px; + margin: 1em; +} + +div.DTTT_print_info p { + font-size: 14px; + line-height: 20px; +} + +div.dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 100%; + height: 60px; + margin-left: -50%; + margin-top: -25px; + padding-top: 20px; + padding-bottom: 20px; + text-align: center; + font-size: 1.2em; + background-color: white; + background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0))); + background: -webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%); + background: -moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%); + background: -ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%); + background: -o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%); + background: linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%); +} + + + +/* + * FixedColumns styles + */ +div.DTFC_LeftHeadWrapper table, +div.DTFC_LeftFootWrapper table, +div.DTFC_RightHeadWrapper table, +div.DTFC_RightFootWrapper table, +table.DTFC_Cloned tr.even { + background-color: white; + margin-bottom: 0; +} + +div.DTFC_RightHeadWrapper table , +div.DTFC_LeftHeadWrapper table { + border-bottom: none !important; + margin-bottom: 0 !important; + border-top-right-radius: 0 !important; + border-bottom-left-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} + +div.DTFC_RightHeadWrapper table thead tr:last-child th:first-child, +div.DTFC_RightHeadWrapper table thead tr:last-child td:first-child, +div.DTFC_LeftHeadWrapper table thead tr:last-child th:first-child, +div.DTFC_LeftHeadWrapper table thead tr:last-child td:first-child { + border-bottom-left-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} + +div.DTFC_RightBodyWrapper table, +div.DTFC_LeftBodyWrapper table { + border-top: none; + margin: 0 !important; +} + +div.DTFC_RightBodyWrapper tbody tr:first-child th, +div.DTFC_RightBodyWrapper tbody tr:first-child td, +div.DTFC_LeftBodyWrapper tbody tr:first-child th, +div.DTFC_LeftBodyWrapper tbody tr:first-child td { + border-top: none; +} + +div.DTFC_RightFootWrapper table, +div.DTFC_LeftFootWrapper table { + border-top: none; + margin-top: 0 !important; +} + + +div.DTFC_LeftBodyWrapper table.dataTable thead .sorting:after, +div.DTFC_LeftBodyWrapper table.dataTable thead .sorting_asc:after, +div.DTFC_LeftBodyWrapper table.dataTable thead .sorting_desc:after, +div.DTFC_RightBodyWrapper table.dataTable thead .sorting:after, +div.DTFC_RightBodyWrapper table.dataTable thead .sorting_asc:after, +div.DTFC_RightBodyWrapper table.dataTable thead .sorting_desc:after { + display: none; +} + + +/* + * FixedHeader styles + */ +div.FixedHeader_Cloned table { + margin: 0 !important +} + diff --git a/theme/bootstrap/plugins/datatables/dataTables.bootstrap.js b/theme/bootstrap/plugins/datatables/dataTables.bootstrap.js new file mode 100644 index 0000000..dcc561f --- /dev/null +++ b/theme/bootstrap/plugins/datatables/dataTables.bootstrap.js @@ -0,0 +1,206 @@ +/*! DataTables Bootstrap 3 integration + * ©2011-2014 SpryMedia Ltd - datatables.net/license + */ + +/** + * DataTables integration for Bootstrap 3. This requires Bootstrap 3 and + * DataTables 1.10 or newer. + * + * This file sets the defaults and adds options to DataTables to style its + * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap + * for further information. + */ +(function(window, document, undefined){ + +var factory = function( $, DataTable ) { +"use strict"; + + +/* Set the defaults for DataTables initialisation */ +$.extend( true, DataTable.defaults, { + dom: + "<'row'<'col-sm-6'l><'col-sm-6'f>>" + + "<'row'<'col-sm-12'tr>>" + + "<'row'<'col-sm-5'i><'col-sm-7'p>>", + renderer: 'bootstrap' +} ); + + +/* Default class modification */ +$.extend( DataTable.ext.classes, { + sWrapper: "dataTables_wrapper form-inline dt-bootstrap", + sFilterInput: "form-control input-sm", + sLengthSelect: "form-control input-sm" +} ); + + +/* Bootstrap paging button renderer */ +DataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) { + var api = new DataTable.Api( settings ); + var classes = settings.oClasses; + var lang = settings.oLanguage.oPaginate; + var btnDisplay, btnClass, counter=0; + + var attach = function( container, buttons ) { + var i, ien, node, button; + var clickHandler = function ( e ) { + e.preventDefault(); + if ( !$(e.currentTarget).hasClass('disabled') ) { + api.page( e.data.action ).draw( false ); + } + }; + + for ( i=0, ien=buttons.length ; i<ien ; i++ ) { + button = buttons[i]; + + if ( $.isArray( button ) ) { + attach( container, button ); + } + else { + btnDisplay = ''; + btnClass = ''; + + switch ( button ) { + case 'ellipsis': + btnDisplay = '&hellip;'; + btnClass = 'disabled'; + break; + + case 'first': + btnDisplay = lang.sFirst; + btnClass = button + (page > 0 ? + '' : ' disabled'); + break; + + case 'previous': + btnDisplay = lang.sPrevious; + btnClass = button + (page > 0 ? + '' : ' disabled'); + break; + + case 'next': + btnDisplay = lang.sNext; + btnClass = button + (page < pages-1 ? + '' : ' disabled'); + break; + + case 'last': + btnDisplay = lang.sLast; + btnClass = button + (page < pages-1 ? + '' : ' disabled'); + break; + + default: + btnDisplay = button + 1; + btnClass = page === button ? + 'active' : ''; + break; + } + + if ( btnDisplay ) { + node = $('<li>', { + 'class': classes.sPageButton+' '+btnClass, + 'id': idx === 0 && typeof button === 'string' ? + settings.sTableId +'_'+ button : + null + } ) + .append( $('<a>', { + 'href': '#', + 'aria-controls': settings.sTableId, + 'data-dt-idx': counter, + 'tabindex': settings.iTabIndex + } ) + .html( btnDisplay ) + ) + .appendTo( container ); + + settings.oApi._fnBindAction( + node, {action: button}, clickHandler + ); + + counter++; + } + } + } + }; + + // IE9 throws an 'unknown error' if document.activeElement is used + // inside an iframe or frame. + var activeEl; + + try { + // Because this approach is destroying and recreating the paging + // elements, focus is lost on the select button which is bad for + // accessibility. So we want to restore focus once the draw has + // completed + activeEl = $(document.activeElement).data('dt-idx'); + } + catch (e) {} + + attach( + $(host).empty().html('<ul class="pagination"/>').children('ul'), + buttons + ); + + if ( activeEl ) { + $(host).find( '[data-dt-idx='+activeEl+']' ).focus(); + } +}; + + +/* + * TableTools Bootstrap compatibility + * Required TableTools 2.1+ + */ +if ( DataTable.TableTools ) { + // Set the classes that TableTools uses to something suitable for Bootstrap + $.extend( true, DataTable.TableTools.classes, { + "container": "DTTT btn-group", + "buttons": { + "normal": "btn btn-default", + "disabled": "disabled" + }, + "collection": { + "container": "DTTT_dropdown dropdown-menu", + "buttons": { + "normal": "", + "disabled": "disabled" + } + }, + "print": { + "info": "DTTT_print_info" + }, + "select": { + "row": "active" + } + } ); + + // Have the collection use a bootstrap compatible drop down + $.extend( true, DataTable.TableTools.DEFAULTS.oTags, { + "collection": { + "container": "ul", + "button": "li", + "liner": "a" + } + } ); +} + +}; // /factory + + +// Define as an AMD module if possible +if ( typeof define === 'function' && define.amd ) { + define( ['jquery', 'datatables'], factory ); +} +else if ( typeof exports === 'object' ) { + // Node/CommonJS + factory( require('jquery'), require('datatables') ); +} +else if ( jQuery ) { + // Otherwise simply initialise as normal, stopping multiple evaluation + factory( jQuery, jQuery.fn.dataTable ); +} + + +})(window, document); + diff --git a/theme/bootstrap/plugins/datatables/dataTables.bootstrap.min.js b/theme/bootstrap/plugins/datatables/dataTables.bootstrap.min.js new file mode 100644 index 0000000..85f7d06 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/dataTables.bootstrap.min.js @@ -0,0 +1,8 @@ +/*! + DataTables Bootstrap 3 integration + ©2011-2014 SpryMedia Ltd - datatables.net/license +*/ +(function(l,q){var e=function(b,c){b.extend(!0,c.defaults,{dom:"<'row'<'col-sm-6'l><'col-sm-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-5'i><'col-sm-7'p>>",renderer:"bootstrap"});b.extend(c.ext.classes,{sWrapper:"dataTables_wrapper form-inline dt-bootstrap",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm"});c.ext.renderer.pageButton.bootstrap=function(g,e,r,s,i,m){var t=new c.Api(g),u=g.oClasses,j=g.oLanguage.oPaginate,d,f,n=0,p=function(c,e){var k,h,o,a,l=function(a){a.preventDefault(); +b(a.currentTarget).hasClass("disabled")||t.page(a.data.action).draw(!1)};k=0;for(h=e.length;k<h;k++)if(a=e[k],b.isArray(a))p(c,a);else{f=d="";switch(a){case "ellipsis":d="&hellip;";f="disabled";break;case "first":d=j.sFirst;f=a+(0<i?"":" disabled");break;case "previous":d=j.sPrevious;f=a+(0<i?"":" disabled");break;case "next":d=j.sNext;f=a+(i<m-1?"":" disabled");break;case "last":d=j.sLast;f=a+(i<m-1?"":" disabled");break;default:d=a+1,f=i===a?"active":""}d&&(o=b("<li>",{"class":u.sPageButton+" "+ +f,id:0===r&&"string"===typeof a?g.sTableId+"_"+a:null}).append(b("<a>",{href:"#","aria-controls":g.sTableId,"data-dt-idx":n,tabindex:g.iTabIndex}).html(d)).appendTo(c),g.oApi._fnBindAction(o,{action:a},l),n++)}},h;try{h=b(q.activeElement).data("dt-idx")}catch(l){}p(b(e).empty().html('<ul class="pagination"/>').children("ul"),s);h&&b(e).find("[data-dt-idx="+h+"]").focus()};c.TableTools&&(b.extend(!0,c.TableTools.classes,{container:"DTTT btn-group",buttons:{normal:"btn btn-default",disabled:"disabled"}, +collection:{container:"DTTT_dropdown dropdown-menu",buttons:{normal:"",disabled:"disabled"}},print:{info:"DTTT_print_info"},select:{row:"active"}}),b.extend(!0,c.TableTools.DEFAULTS.oTags,{collection:{container:"ul",button:"li",liner:"a"}}))};"function"===typeof define&&define.amd?define(["jquery","datatables"],e):"object"===typeof exports?e(require("jquery"),require("datatables")):jQuery&&e(jQuery,jQuery.fn.dataTable)})(window,document); diff --git a/theme/bootstrap/plugins/datatables/extensions/AutoFill/Readme.txt b/theme/bootstrap/plugins/datatables/extensions/AutoFill/Readme.txt new file mode 100644 index 0000000..017d1d0 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/AutoFill/Readme.txt @@ -0,0 +1,38 @@ +# AutoFill + +AutoFill gives an Excel like option to a DataTable to click and drag over multiple cells, filling in information over the selected cells and incrementing numbers as needed. Key features include: + +* Click and drag cell content insertion +* Automatic incrementing of numeric information +* Enable and disable on any column +* Detailed callback functions for customisation +* Support for both DataTables and browser window scrolling + + +# Installation + +To use AutoFill, first download DataTables ( http://datatables.net/download ) and place the unzipped AutoFill package into a `extensions` directory in the DataTables package. This will allow the pages in the examples to operate correctly. To see the examples running, open the `examples` directory in your web-browser. + + +# Basic usage + +AutoFill is initialised using the `$.fn.dataTable.AutoFill` constructor. For example: + +```js +$(document).ready( function () { + var table = $('#example').dataTable(); + new $.fn.dataTable.AutoFill( table ); +} ); +``` + + +# Documentation / support + +* Documentation: http://datatables.net/extensions/autofill/ +* DataTables support forums: http://datatables.net/forums + + +# GitHub + +If you fancy getting involved with the development of AutoFill and help make it better, please refer to its GitHub repo: https://github.com/DataTables/AutoFill + diff --git a/theme/bootstrap/plugins/datatables/extensions/AutoFill/css/dataTables.autoFill.css b/theme/bootstrap/plugins/datatables/extensions/AutoFill/css/dataTables.autoFill.css new file mode 100644 index 0000000..cab59b3 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/AutoFill/css/dataTables.autoFill.css @@ -0,0 +1,24 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * AutoFill styles + */ + +div.AutoFill_filler { + display: none; + position: absolute; + height: 14px; + width: 14px; + background: url(../images/filler.png) no-repeat center center; + z-index: 1002; +} + +div.AutoFill_border { + display: none; + position: absolute; + background-color: #0063dc; + z-index: 1001; + + box-shadow: 0px 0px 5px #76b4ff; + -moz-box-shadow: 0px 0px 5px #76b4ff; + -webkit-box-shadow: 0px 0px 5px #76b4ff; +} + diff --git a/theme/bootstrap/plugins/datatables/extensions/AutoFill/css/dataTables.autoFill.min.css b/theme/bootstrap/plugins/datatables/extensions/AutoFill/css/dataTables.autoFill.min.css new file mode 100644 index 0000000..b485f21 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/AutoFill/css/dataTables.autoFill.min.css @@ -0,0 +1 @@ +div.AutoFill_filler{display:none;position:absolute;height:14px;width:14px;background:url(../images/filler.png) no-repeat center center;z-index:1002}div.AutoFill_border{display:none;position:absolute;background-color:#0063dc;z-index:1001;box-shadow:0px 0px 5px #76b4ff;-moz-box-shadow:0px 0px 5px #76b4ff;-webkit-box-shadow:0px 0px 5px #76b4ff} diff --git a/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/columns.html b/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/columns.html new file mode 100644 index 0000000..d891b13 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/columns.html @@ -0,0 +1,644 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>AutoFill example - Column options</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.autoFill.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.autoFill.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').dataTable(); + + new $.fn.dataTable.AutoFill( table, { + "columnDefs": [ + { enable: false, targets: [-1, -2] }, + { increment: false, targets: 3 } + ] + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>AutoFill example <span>Column options</span></h1> + + <div class="info"> + <p>Columns can be enabled (which they are by default) and disabled from providing the end user with + AutoFill abilities by using either <code>columns</code> or <code>columnDefs</code> and the + <code>enable</code> option. These two arrays work in exactly the same way <a href= + "http://datatables.net/ref/columns">as in DataTables</a>.</p> + + <p>This example shows how disabling columns counting from the right hand side of the table can be + achieved. In this case, the last three columns.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this + example:</p><code class="multiline brush: js;">$(document).ready(function() { + var table = $('#example').dataTable(); + + new $.fn.dataTable.AutoFill( table, { + &quot;columnDefs&quot;: [ + { enable: false, targets: [-1, -2] }, + { increment: false, targets: 3 } + ] + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this + example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href= + "../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.autoFill.js">../js/dataTables.autoFill.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:</p><code class="multiline brush: js;"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the + table:</p> + + <ul> + <li><a href= + "../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.autoFill.css">../css/dataTables.autoFill.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using <a href="//datatables.net/manual/server-side">the protocol described in the + DataTables documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li class="active"><a href="./columns.html">Column options</a></li> + <li><a href="./scrolling.html">Scrolling DataTable</a></li> + <li><a href="./fill-both.html">Horizontal and vertical fill</a></li> + <li><a href="./fill-horizontal.html">Horizontal fill</a></li> + <li><a href="./complete-callback.html">Complete callback</a></li> + <li><a href="./step-callback.html">Step callback</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/complete-callback.html b/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/complete-callback.html new file mode 100644 index 0000000..2076d4f --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/complete-callback.html @@ -0,0 +1,652 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>AutoFill example - Complete callback</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.autoFill.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.autoFill.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').dataTable(); + + new $.fn.dataTable.AutoFill( table, { + complete: function ( altered ) { + var last = altered[ altered.length-1 ]; + alert( + altered.length+' cells were altered in this auto-fill. The '+ + 'value of the last cell altered was: '+last.oldValue+' and is '+ + 'now '+last.newValue + ); + } + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>AutoFill example <span>Complete callback</span></h1> + + <div class="info"> + <p>AutoFill provides a number of customisable callback functions so you can tailor it's actions to + exactly what you need. This example shows the use of the <code>complete</code> callback function which + is executed at the end of an auto-fill drag, providing information about the cells that were + altered.</p> + + <p>For a complete description of the <code>complete</code> callback, please refer to the <a href= + "//datatables.net/extras/autofill/options">AutoFill documentation</a>.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this + example:</p><code class="multiline brush: js;">$(document).ready(function() { + var table = $('#example').dataTable(); + + new $.fn.dataTable.AutoFill( table, { + complete: function ( altered ) { + var last = altered[ altered.length-1 ]; + alert( + altered.length+' cells were altered in this auto-fill. The '+ + 'value of the last cell altered was: '+last.oldValue+' and is '+ + 'now '+last.newValue + ); + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this + example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href= + "../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.autoFill.js">../js/dataTables.autoFill.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:</p><code class="multiline brush: js;"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the + table:</p> + + <ul> + <li><a href= + "../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.autoFill.css">../css/dataTables.autoFill.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using <a href="//datatables.net/manual/server-side">the protocol described in the + DataTables documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./columns.html">Column options</a></li> + <li><a href="./scrolling.html">Scrolling DataTable</a></li> + <li><a href="./fill-both.html">Horizontal and vertical fill</a></li> + <li><a href="./fill-horizontal.html">Horizontal fill</a></li> + <li class="active"><a href="./complete-callback.html">Complete callback</a></li> + <li><a href="./step-callback.html">Step callback</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/fill-both.html b/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/fill-both.html new file mode 100644 index 0000000..f65076e --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/fill-both.html @@ -0,0 +1,641 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>AutoFill example - Horizontal and vertical fill</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.autoFill.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.autoFill.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable(); + + new $.fn.dataTable.AutoFill( table, { + mode: 'both' + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>AutoFill example <span>Horizontal and vertical fill</span></h1> + + <div class="info"> + <p>By default AutoFill will allow the fill to operate only on a single column at a time (i.e. + vertically). However, it has the ability to provide the fill either horizontally, over both axis or + limited to just one axis depending on the direction of the drag. This option is provided by the + <code>mode</code> sanitisation option.</p> + + <p>In this case it is set to <code>both</code> (i.e. both horizontal and vertical axis) to provide the + filler along a row, rather than a column.</p> + + <p>For the full range of options and syntax for <code>mode</code> please refer to the <a href= + "//datatables.net/extras/autofill/options">AutoFill documentation</a>.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this + example:</p><code class="multiline brush: js;">$(document).ready(function() { + var table = $('#example').DataTable(); + + new $.fn.dataTable.AutoFill( table, { + mode: 'both' + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this + example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href= + "../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.autoFill.js">../js/dataTables.autoFill.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:</p><code class="multiline brush: js;"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the + table:</p> + + <ul> + <li><a href= + "../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.autoFill.css">../css/dataTables.autoFill.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using <a href="//datatables.net/manual/server-side">the protocol described in the + DataTables documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./columns.html">Column options</a></li> + <li><a href="./scrolling.html">Scrolling DataTable</a></li> + <li class="active"><a href="./fill-both.html">Horizontal and vertical fill</a></li> + <li><a href="./fill-horizontal.html">Horizontal fill</a></li> + <li><a href="./complete-callback.html">Complete callback</a></li> + <li><a href="./step-callback.html">Step callback</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/fill-horizontal.html b/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/fill-horizontal.html new file mode 100644 index 0000000..13cadac --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/fill-horizontal.html @@ -0,0 +1,641 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>AutoFill example - Horizontal fill</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.autoFill.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.autoFill.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable(); + + new $.fn.dataTable.AutoFill( table, { + mode: 'x' + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>AutoFill example <span>Horizontal fill</span></h1> + + <div class="info"> + <p>By default AutoFill will allow the fill to operate only on a single column at a time (i.e. + vertically). However, it has the ability to provide the fill either horizontally, over both axis or + limited to just one axis depending on the direction of the drag. This option is provided by the + <code>mode</code> sanitisation option.</p> + + <p>In this case it is set to <code>x</code> (i.e. horizontal axis) to provide the filler along a row, + rather than a column.</p> + + <p>For the full range of options and syntax for <code>mode</code> please refer to the <a href= + "//datatables.net/extras/autofill/options">AutoFill documentation</a>.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this + example:</p><code class="multiline brush: js;">$(document).ready(function() { + var table = $('#example').DataTable(); + + new $.fn.dataTable.AutoFill( table, { + mode: 'x' + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this + example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href= + "../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.autoFill.js">../js/dataTables.autoFill.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:</p><code class="multiline brush: js;"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the + table:</p> + + <ul> + <li><a href= + "../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.autoFill.css">../css/dataTables.autoFill.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using <a href="//datatables.net/manual/server-side">the protocol described in the + DataTables documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./columns.html">Column options</a></li> + <li><a href="./scrolling.html">Scrolling DataTable</a></li> + <li><a href="./fill-both.html">Horizontal and vertical fill</a></li> + <li class="active"><a href="./fill-horizontal.html">Horizontal fill</a></li> + <li><a href="./complete-callback.html">Complete callback</a></li> + <li><a href="./step-callback.html">Step callback</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/index.html b/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/index.html new file mode 100644 index 0000000..9cade86 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/index.html @@ -0,0 +1,66 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + + <title>AutoFill examples - AutoFill examples</title> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>AutoFill example <span>AutoFill examples</span></h1> + + <div class="info"> + <p>AutoFill gives an Excel like option to a DataTable to click and drag over multiple cells, filling in + information over the selected cells and incrementing numbers as needed.</p> + + <p>Thanks to <a href="http://www.phoniax.no/">Phoniax AS</a> for their sponsorship of this plug-in for + DataTables.</p> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./columns.html">Column options</a></li> + <li><a href="./scrolling.html">Scrolling DataTable</a></li> + <li><a href="./fill-both.html">Horizontal and vertical fill</a></li> + <li><a href="./fill-horizontal.html">Horizontal fill</a></li> + <li><a href="./complete-callback.html">Complete callback</a></li> + <li><a href="./step-callback.html">Step callback</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/scrolling.html b/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/scrolling.html new file mode 100644 index 0000000..66871ec --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/scrolling.html @@ -0,0 +1,638 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>AutoFill example - Scrolling DataTable</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.autoFill.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.autoFill.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').dataTable( { + scrollY: 200, + scrollCollapse: false, + paginate: false + } ); + + new $.fn.dataTable.AutoFill( table ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>AutoFill example <span>Scrolling DataTable</span></h1> + + <div class="info"> + <p>When dragging an AutoFill handle, the table (if DataTables scrolling is enabled) or the window will + be automatically scrolled, as you approach the edge of the scrolling component. The example below shows + the effect with DataTables scrolling (and also window if needed).</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this + example:</p><code class="multiline brush: js;">$(document).ready(function() { + var table = $('#example').dataTable( { + scrollY: 200, + scrollCollapse: false, + paginate: false + } ); + + new $.fn.dataTable.AutoFill( table ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this + example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href= + "../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.autoFill.js">../js/dataTables.autoFill.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:</p><code class="multiline brush: js;"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the + table:</p> + + <ul> + <li><a href= + "../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.autoFill.css">../css/dataTables.autoFill.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using <a href="//datatables.net/manual/server-side">the protocol described in the + DataTables documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./columns.html">Column options</a></li> + <li class="active"><a href="./scrolling.html">Scrolling DataTable</a></li> + <li><a href="./fill-both.html">Horizontal and vertical fill</a></li> + <li><a href="./fill-horizontal.html">Horizontal fill</a></li> + <li><a href="./complete-callback.html">Complete callback</a></li> + <li><a href="./step-callback.html">Step callback</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/simple.html b/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/simple.html new file mode 100644 index 0000000..ea3db49 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/simple.html @@ -0,0 +1,631 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>AutoFill example - Basic initialisation</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.autoFill.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.autoFill.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable(); + new $.fn.dataTable.AutoFill( table ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>AutoFill example <span>Basic initialisation</span></h1> + + <div class="info"> + <p>AutoFill gives an Excel like option to a DataTable to click and drag over multiple cells, filling in + information over the selected cells and incrementing numbers as needed.</p> + + <p>AutoFill is initialised using the <code>$.fn.dataTable.AutoFill</code> function as shown in the + example below. It requires one parameter, the DataTable instance that AutoFill is to operate on, and + optionally a second configuration parameter, which is shown in the other AutoFill examples.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this + example:</p><code class="multiline brush: js;">$(document).ready(function() { + var table = $('#example').DataTable(); + new $.fn.dataTable.AutoFill( table ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this + example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href= + "../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.autoFill.js">../js/dataTables.autoFill.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:</p><code class="multiline brush: js;"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the + table:</p> + + <ul> + <li><a href= + "../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.autoFill.css">../css/dataTables.autoFill.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using <a href="//datatables.net/manual/server-side">the protocol described in the + DataTables documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li class="active"><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./columns.html">Column options</a></li> + <li><a href="./scrolling.html">Scrolling DataTable</a></li> + <li><a href="./fill-both.html">Horizontal and vertical fill</a></li> + <li><a href="./fill-horizontal.html">Horizontal fill</a></li> + <li><a href="./complete-callback.html">Complete callback</a></li> + <li><a href="./step-callback.html">Step callback</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/step-callback.html b/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/step-callback.html new file mode 100644 index 0000000..c1255aa --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/AutoFill/examples/step-callback.html @@ -0,0 +1,660 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>AutoFill example - Step callback</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.autoFill.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.autoFill.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').dataTable(); + + new $.fn.dataTable.AutoFill( table, { + columnDefs: [ { + targets: -1, + step: function ( cell, read, last, i, x, y ) { + var val = parseInt( (last || read).replace(/[$,]/g, ''), 10 ); + val += (x<0 || y<0 ? -100 : 100); // - if going back up, + if going down + + // Format for the currency column + return '$'+val.toString().replace( /\B(?=(\d{3})+(?!\d))/g, ',' ); + } + } ] + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>AutoFill example <span>Step callback</span></h1> + + <div class="info"> + <p>By default, AutoFill will increment cells that contain numbers by a single digit for each cell that + is iterated over (try the <em>Age</em> column below for example). This behaviour can be disabled + completely using the <code>increment</code> column option, but it can also be modified to suit your + requirements through use of the <code>step</code> column callback function.</p> + + <p>The <code>step</code> callback is executed for each cell in the auto-fill set and gives complete + control over how data is incremented. The example below shows the step function being used on the + <em>Salary</em> column to increment by 100, rather than 1 for each cell.</p> + + <p>For a complete description of the <code>step</code> callback, please refer to the <a href= + "//datatables.net/extras/autofill/options">AutoFill documentation</a>.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this + example:</p><code class="multiline brush: js;">$(document).ready(function() { + var table = $('#example').dataTable(); + + new $.fn.dataTable.AutoFill( table, { + columnDefs: [ { + targets: -1, + step: function ( cell, read, last, i, x, y ) { + var val = parseInt( (last || read).replace(/[$,]/g, ''), 10 ); + val += (x&lt;0 || y&lt;0 ? -100 : 100); // - if going back up, + if going down + + // Format for the currency column + return '$'+val.toString().replace( /\B(?=(\d{3})+(?!\d))/g, ',' ); + } + } ] + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this + example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href= + "../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.autoFill.js">../js/dataTables.autoFill.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:</p><code class="multiline brush: js;"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the + table:</p> + + <ul> + <li><a href= + "../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.autoFill.css">../css/dataTables.autoFill.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using <a href="//datatables.net/manual/server-side">the protocol described in the + DataTables documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./columns.html">Column options</a></li> + <li><a href="./scrolling.html">Scrolling DataTable</a></li> + <li><a href="./fill-both.html">Horizontal and vertical fill</a></li> + <li><a href="./fill-horizontal.html">Horizontal fill</a></li> + <li><a href="./complete-callback.html">Complete callback</a></li> + <li class="active"><a href="./step-callback.html">Step callback</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/AutoFill/images/filler.png b/theme/bootstrap/plugins/datatables/extensions/AutoFill/images/filler.png new file mode 100644 index 0000000..f2af65d Binary files /dev/null and b/theme/bootstrap/plugins/datatables/extensions/AutoFill/images/filler.png differ diff --git a/theme/bootstrap/plugins/datatables/extensions/AutoFill/js/dataTables.autoFill.js b/theme/bootstrap/plugins/datatables/extensions/AutoFill/js/dataTables.autoFill.js new file mode 100644 index 0000000..6bbfa35 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/AutoFill/js/dataTables.autoFill.js @@ -0,0 +1,855 @@ +/*! AutoFill 1.2.1 + * ©2008-2014 SpryMedia Ltd - datatables.net/license + */ + +/** + * @summary AutoFill + * @description Add Excel like click and drag auto-fill options to DataTables + * @version 1.2.1 + * @file dataTables.autoFill.js + * @author SpryMedia Ltd (www.sprymedia.co.uk) + * @contact www.sprymedia.co.uk/contact + * @copyright Copyright 2010-2014 SpryMedia Ltd. + * + * This source file is free software, available under the following license: + * MIT license - http://datatables.net/license/mit + * + * This source file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. + * + * For details please refer to: http://www.datatables.net + */ + +(function( window, document, undefined ) { + +var factory = function( $, DataTable ) { +"use strict"; + +/** + * AutoFill provides Excel like auto-fill features for a DataTable + * + * @class AutoFill + * @constructor + * @param {object} oTD DataTables settings object + * @param {object} oConfig Configuration object for AutoFill + */ +var AutoFill = function( oDT, oConfig ) +{ + /* Sanity check that we are a new instance */ + if ( ! (this instanceof AutoFill) ) { + throw( "Warning: AutoFill must be initialised with the keyword 'new'" ); + } + + if ( ! $.fn.dataTableExt.fnVersionCheck('1.7.0') ) { + throw( "Warning: AutoFill requires DataTables 1.7 or greater"); + } + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Public class variables + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + this.c = {}; + + /** + * @namespace Settings object which contains customisable information for AutoFill instance + */ + this.s = { + /** + * @namespace Cached information about the little dragging icon (the filler) + */ + "filler": { + "height": 0, + "width": 0 + }, + + /** + * @namespace Cached information about the border display + */ + "border": { + "width": 2 + }, + + /** + * @namespace Store for live information for the current drag + */ + "drag": { + "startX": -1, + "startY": -1, + "startTd": null, + "endTd": null, + "dragging": false + }, + + /** + * @namespace Data cache for information that we need for scrolling the screen when we near + * the edges + */ + "screen": { + "interval": null, + "y": 0, + "height": 0, + "scrollTop": 0 + }, + + /** + * @namespace Data cache for the position of the DataTables scrolling element (when scrolling + * is enabled) + */ + "scroller": { + "top": 0, + "bottom": 0 + }, + + /** + * @namespace Information stored for each column. An array of objects + */ + "columns": [] + }; + + + /** + * @namespace Common and useful DOM elements for the class instance + */ + this.dom = { + "table": null, + "filler": null, + "borderTop": null, + "borderRight": null, + "borderBottom": null, + "borderLeft": null, + "currentTarget": null + }; + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Public class methods + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * Retreieve the settings object from an instance + * @method fnSettings + * @returns {object} AutoFill settings object + */ + this.fnSettings = function () { + return this.s; + }; + + + /* Constructor logic */ + this._fnInit( oDT, oConfig ); + return this; +}; + + + +AutoFill.prototype = { + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Private methods (they are of course public in JS, but recommended as private) + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * Initialisation + * @method _fnInit + * @param {object} dt DataTables settings object + * @param {object} config Configuration object for AutoFill + * @returns void + */ + "_fnInit": function ( dt, config ) + { + var + that = this, + i, iLen; + + // Use DataTables API to get the settings allowing selectors, instances + // etc to be used, or for backwards compatibility get from the old + // fnSettings method + this.s.dt = DataTable.Api ? + new DataTable.Api( dt ).settings()[0] : + dt.fnSettings(); + this.s.init = config || {}; + this.dom.table = this.s.dt.nTable; + + $.extend( true, this.c, AutoFill.defaults, config ); + + /* Add and configure the columns */ + this._initColumns(); + + /* Auto Fill click and drag icon */ + var filler = $('<div/>', { + 'class': 'AutoFill_filler' + } ) + .appendTo( 'body' ); + this.dom.filler = filler[0]; + + // Get the height / width of the click element + this.s.filler.height = filler.height(); + this.s.filler.width = filler.width(); + filler[0].style.display = "none"; + + /* Border display - one div for each side. We can't just use a single + * one with a border, as we want the events to effectively pass through + * the transparent bit of the box + */ + var border; + var appender = document.body; + if ( that.s.dt.oScroll.sY !== "" ) { + that.s.dt.nTable.parentNode.style.position = "relative"; + appender = that.s.dt.nTable.parentNode; + } + + border = $('<div/>', { + "class": "AutoFill_border" + } ); + this.dom.borderTop = border.clone().appendTo( appender )[0]; + this.dom.borderRight = border.clone().appendTo( appender )[0]; + this.dom.borderBottom = border.clone().appendTo( appender )[0]; + this.dom.borderLeft = border.clone().appendTo( appender )[0]; + + /* Events */ + filler.on( 'mousedown.DTAF', function (e) { + this.onselectstart = function() { return false; }; + that._fnFillerDragStart.call( that, e ); + return false; + } ); + + $('tbody', this.dom.table).on( + 'mouseover.DTAF mouseout.DTAF', + '>tr>td, >tr>th', + function (e) { + that._fnFillerDisplay.call( that, e ); + } + ); + + $(this.dom.table).on( 'destroy.dt.DTAF', function () { + filler.off( 'mousedown.DTAF' ).remove(); + $('tbody', this.dom.table).off( 'mouseover.DTAF mouseout.DTAF' ); + } ); + }, + + + _initColumns: function ( ) + { + var that = this; + var i, ien; + var dt = this.s.dt; + var config = this.s.init; + + for ( i=0, ien=dt.aoColumns.length ; i<ien ; i++ ) { + this.s.columns[i] = $.extend( true, {}, AutoFill.defaults.column ); + } + + dt.oApi._fnApplyColumnDefs( + dt, + config.aoColumnDefs || config.columnDefs, + config.aoColumns || config.columns, + function (colIdx, def) { + that._fnColumnOptions( colIdx, def ); + } + ); + + // For columns which don't have read, write, step functions defined, + // use the default ones + for ( i=0, ien=dt.aoColumns.length ; i<ien ; i++ ) { + var column = this.s.columns[i]; + + if ( ! column.read ) { + column.read = this._fnReadCell; + } + if ( ! column.write ) { + column.read = this._fnWriteCell; + } + if ( ! column.step ) { + column.read = this._fnStep; + } + } + }, + + + "_fnColumnOptions": function ( i, opts ) + { + var column = this.s.columns[ i ]; + var set = function ( outProp, inProp ) { + if ( opts[ inProp[0] ] !== undefined ) { + column[ outProp ] = opts[ inProp[0] ]; + } + if ( opts[ inProp[1] ] !== undefined ) { + column[ outProp ] = opts[ inProp[1] ]; + } + }; + + // Compatibility with the old Hungarian style of notation + set( 'enable', ['bEnable', 'enable'] ); + set( 'read', ['fnRead', 'read'] ); + set( 'write', ['fnWrite', 'write'] ); + set( 'step', ['fnStep', 'step'] ); + set( 'increment', ['bIncrement', 'increment'] ); + }, + + + /** + * Find out the coordinates of a given TD cell in a table + * @method _fnTargetCoords + * @param {Node} nTd + * @returns {Object} x and y properties, for the position of the cell in the tables DOM + */ + "_fnTargetCoords": function ( nTd ) + { + var nTr = $(nTd).parents('tr')[0]; + var position = this.s.dt.oInstance.fnGetPosition( nTd ); + + return { + "x": $('td', nTr).index(nTd), + "y": $('tr', nTr.parentNode).index(nTr), + "row": position[0], + "column": position[2] + }; + }, + + + /** + * Display the border around one or more cells (from start to end) + * @method _fnUpdateBorder + * @param {Node} nStart Starting cell + * @param {Node} nEnd Ending cell + * @returns void + */ + "_fnUpdateBorder": function ( nStart, nEnd ) + { + var + border = this.s.border.width, + offsetStart = $(nStart).offset(), + offsetEnd = $(nEnd).offset(), + x1 = offsetStart.left - border, + x2 = offsetEnd.left + $(nEnd).outerWidth(), + y1 = offsetStart.top - border, + y2 = offsetEnd.top + $(nEnd).outerHeight(), + width = offsetEnd.left + $(nEnd).outerWidth() - offsetStart.left + (2*border), + height = offsetEnd.top + $(nEnd).outerHeight() - offsetStart.top + (2*border), + oStyle; + + // Recalculate start and end (when dragging "backwards") + if( offsetStart.left > offsetEnd.left) { + x1 = offsetEnd.left - border; + x2 = offsetStart.left + $(nStart).outerWidth(); + width = offsetStart.left + $(nStart).outerWidth() - offsetEnd.left + (2*border); + } + + if ( this.s.dt.oScroll.sY !== "" ) + { + /* The border elements are inside the DT scroller - so position relative to that */ + var + offsetScroll = $(this.s.dt.nTable.parentNode).offset(), + scrollTop = $(this.s.dt.nTable.parentNode).scrollTop(), + scrollLeft = $(this.s.dt.nTable.parentNode).scrollLeft(); + + x1 -= offsetScroll.left - scrollLeft; + x2 -= offsetScroll.left - scrollLeft; + y1 -= offsetScroll.top - scrollTop; + y2 -= offsetScroll.top - scrollTop; + } + + /* Top */ + oStyle = this.dom.borderTop.style; + oStyle.top = y1+"px"; + oStyle.left = x1+"px"; + oStyle.height = this.s.border.width+"px"; + oStyle.width = width+"px"; + + /* Bottom */ + oStyle = this.dom.borderBottom.style; + oStyle.top = y2+"px"; + oStyle.left = x1+"px"; + oStyle.height = this.s.border.width+"px"; + oStyle.width = width+"px"; + + /* Left */ + oStyle = this.dom.borderLeft.style; + oStyle.top = y1+"px"; + oStyle.left = x1+"px"; + oStyle.height = height+"px"; + oStyle.width = this.s.border.width+"px"; + + /* Right */ + oStyle = this.dom.borderRight.style; + oStyle.top = y1+"px"; + oStyle.left = x2+"px"; + oStyle.height = height+"px"; + oStyle.width = this.s.border.width+"px"; + }, + + + /** + * Mouse down event handler for starting a drag + * @method _fnFillerDragStart + * @param {Object} e Event object + * @returns void + */ + "_fnFillerDragStart": function (e) + { + var that = this; + var startingTd = this.dom.currentTarget; + + this.s.drag.dragging = true; + + that.dom.borderTop.style.display = "block"; + that.dom.borderRight.style.display = "block"; + that.dom.borderBottom.style.display = "block"; + that.dom.borderLeft.style.display = "block"; + + var coords = this._fnTargetCoords( startingTd ); + this.s.drag.startX = coords.x; + this.s.drag.startY = coords.y; + + this.s.drag.startTd = startingTd; + this.s.drag.endTd = startingTd; + + this._fnUpdateBorder( startingTd, startingTd ); + + $(document).bind('mousemove.AutoFill', function (e) { + that._fnFillerDragMove.call( that, e ); + } ); + + $(document).bind('mouseup.AutoFill', function (e) { + that._fnFillerFinish.call( that, e ); + } ); + + /* Scrolling information cache */ + this.s.screen.y = e.pageY; + this.s.screen.height = $(window).height(); + this.s.screen.scrollTop = $(document).scrollTop(); + + if ( this.s.dt.oScroll.sY !== "" ) + { + this.s.scroller.top = $(this.s.dt.nTable.parentNode).offset().top; + this.s.scroller.bottom = this.s.scroller.top + $(this.s.dt.nTable.parentNode).height(); + } + + /* Scrolling handler - we set an interval (which is cancelled on mouse up) which will fire + * regularly and see if we need to do any scrolling + */ + this.s.screen.interval = setInterval( function () { + var iScrollTop = $(document).scrollTop(); + var iScrollDelta = iScrollTop - that.s.screen.scrollTop; + that.s.screen.y += iScrollDelta; + + if ( that.s.screen.height - that.s.screen.y + iScrollTop < 50 ) + { + $('html, body').animate( { + "scrollTop": iScrollTop + 50 + }, 240, 'linear' ); + } + else if ( that.s.screen.y - iScrollTop < 50 ) + { + $('html, body').animate( { + "scrollTop": iScrollTop - 50 + }, 240, 'linear' ); + } + + if ( that.s.dt.oScroll.sY !== "" ) + { + if ( that.s.screen.y > that.s.scroller.bottom - 50 ) + { + $(that.s.dt.nTable.parentNode).animate( { + "scrollTop": $(that.s.dt.nTable.parentNode).scrollTop() + 50 + }, 240, 'linear' ); + } + else if ( that.s.screen.y < that.s.scroller.top + 50 ) + { + $(that.s.dt.nTable.parentNode).animate( { + "scrollTop": $(that.s.dt.nTable.parentNode).scrollTop() - 50 + }, 240, 'linear' ); + } + } + }, 250 ); + }, + + + /** + * Mouse move event handler for during a move. See if we want to update the display based on the + * new cursor position + * @method _fnFillerDragMove + * @param {Object} e Event object + * @returns void + */ + "_fnFillerDragMove": function (e) + { + if ( e.target && e.target.nodeName.toUpperCase() == "TD" && + e.target != this.s.drag.endTd ) + { + var coords = this._fnTargetCoords( e.target ); + + if ( this.c.mode == "y" && coords.x != this.s.drag.startX ) + { + e.target = $('tbody>tr:eq('+coords.y+')>td:eq('+this.s.drag.startX+')', this.dom.table)[0]; + } + if ( this.c.mode == "x" && coords.y != this.s.drag.startY ) + { + e.target = $('tbody>tr:eq('+this.s.drag.startY+')>td:eq('+coords.x+')', this.dom.table)[0]; + } + + if ( this.c.mode == "either") + { + if(coords.x != this.s.drag.startX ) + { + e.target = $('tbody>tr:eq('+this.s.drag.startY+')>td:eq('+coords.x+')', this.dom.table)[0]; + } + else if ( coords.y != this.s.drag.startY ) { + e.target = $('tbody>tr:eq('+coords.y+')>td:eq('+this.s.drag.startX+')', this.dom.table)[0]; + } + } + + // update coords + if ( this.c.mode !== "both" ) { + coords = this._fnTargetCoords( e.target ); + } + + var drag = this.s.drag; + drag.endTd = e.target; + + if ( coords.y >= this.s.drag.startY ) { + this._fnUpdateBorder( drag.startTd, drag.endTd ); + } + else { + this._fnUpdateBorder( drag.endTd, drag.startTd ); + } + this._fnFillerPosition( e.target ); + } + + /* Update the screen information so we can perform scrolling */ + this.s.screen.y = e.pageY; + this.s.screen.scrollTop = $(document).scrollTop(); + + if ( this.s.dt.oScroll.sY !== "" ) + { + this.s.scroller.scrollTop = $(this.s.dt.nTable.parentNode).scrollTop(); + this.s.scroller.top = $(this.s.dt.nTable.parentNode).offset().top; + this.s.scroller.bottom = this.s.scroller.top + $(this.s.dt.nTable.parentNode).height(); + } + }, + + + /** + * Mouse release handler - end the drag and take action to update the cells with the needed values + * @method _fnFillerFinish + * @param {Object} e Event object + * @returns void + */ + "_fnFillerFinish": function (e) + { + var that = this, i, iLen, j; + + $(document).unbind('mousemove.AutoFill mouseup.AutoFill'); + + this.dom.borderTop.style.display = "none"; + this.dom.borderRight.style.display = "none"; + this.dom.borderBottom.style.display = "none"; + this.dom.borderLeft.style.display = "none"; + + this.s.drag.dragging = false; + + clearInterval( this.s.screen.interval ); + + var cells = []; + var table = this.dom.table; + var coordsStart = this._fnTargetCoords( this.s.drag.startTd ); + var coordsEnd = this._fnTargetCoords( this.s.drag.endTd ); + var columnIndex = function ( visIdx ) { + return that.s.dt.oApi._fnVisibleToColumnIndex( that.s.dt, visIdx ); + }; + + // xxx - urgh - there must be a way of reducing this... + if ( coordsStart.y <= coordsEnd.y ) { + for ( i=coordsStart.y ; i<=coordsEnd.y ; i++ ) { + if ( coordsStart.x <= coordsEnd.x ) { + for ( j=coordsStart.x ; j<=coordsEnd.x ; j++ ) { + cells.push( { + node: $('tbody>tr:eq('+i+')>td:eq('+j+')', table)[0], + x: j - coordsStart.x, + y: i - coordsStart.y, + colIdx: columnIndex( j ) + } ); + } + } + else { + for ( j=coordsStart.x ; j>=coordsEnd.x ; j-- ) { + cells.push( { + node: $('tbody>tr:eq('+i+')>td:eq('+j+')', table)[0], + x: j - coordsStart.x, + y: i - coordsStart.y, + colIdx: columnIndex( j ) + } ); + } + } + } + } + else { + for ( i=coordsStart.y ; i>=coordsEnd.y ; i-- ) { + if ( coordsStart.x <= coordsEnd.x ) { + for ( j=coordsStart.x ; j<=coordsEnd.x ; j++ ) { + cells.push( { + node: $('tbody>tr:eq('+i+')>td:eq('+j+')', table)[0], + x: j - coordsStart.x, + y: i - coordsStart.y, + colIdx: columnIndex( j ) + } ); + } + } + else { + for ( j=coordsStart.x ; j>=coordsEnd.x ; j-- ) { + cells.push( { + node: $('tbody>tr:eq('+i+')>td:eq('+j+')', table)[0], + x: coordsStart.x - j, + y: coordsStart.y - i, + colIdx: columnIndex( j ) + } ); + } + } + } + } + + // An auto-fill requires 2 or more cells + if ( cells.length <= 1 ) { + return; + } + + var edited = []; + var previous; + + for ( i=0, iLen=cells.length ; i<iLen ; i++ ) { + var cell = cells[i]; + var column = this.s.columns[ cell.colIdx ]; + var read = column.read.call( column, cell.node ); + var stepValue = column.step.call( column, cell.node, read, previous, i, cell.x, cell.y ); + + column.write.call( column, cell.node, stepValue ); + + previous = stepValue; + edited.push( { + cell: cell, + colIdx: cell.colIdx, + newValue: stepValue, + oldValue: read + } ); + } + + if ( this.c.complete !== null ) { + this.c.complete.call( this, edited ); + } + + // In 1.10 we can do a static draw + if ( DataTable.Api ) { + new DataTable.Api( this.s.dt ).draw( false ); + } + else { + this.s.dt.oInstance.fnDraw(); + } + }, + + + /** + * Display the drag handle on mouse over cell + * @method _fnFillerDisplay + * @param {Object} e Event object + * @returns void + */ + "_fnFillerDisplay": function (e) + { + var filler = this.dom.filler; + + /* Don't display automatically when dragging */ + if ( this.s.drag.dragging) + { + return; + } + + /* Check that we are allowed to AutoFill this column or not */ + var nTd = (e.target.nodeName.toLowerCase() == 'td') ? e.target : $(e.target).parents('td')[0]; + var iX = this._fnTargetCoords(nTd).column; + if ( !this.s.columns[iX].enable ) + { + filler.style.display = "none"; + return; + } + + if (e.type == 'mouseover') + { + this.dom.currentTarget = nTd; + this._fnFillerPosition( nTd ); + + filler.style.display = "block"; + } + else if ( !e.relatedTarget || !e.relatedTarget.className.match(/AutoFill/) ) + { + filler.style.display = "none"; + } + }, + + + /** + * Position the filler icon over a cell + * @method _fnFillerPosition + * @param {Node} nTd Cell to position filler icon over + * @returns void + */ + "_fnFillerPosition": function ( nTd ) + { + var offset = $(nTd).offset(); + var filler = this.dom.filler; + filler.style.top = (offset.top - (this.s.filler.height / 2)-1 + $(nTd).outerHeight())+"px"; + filler.style.left = (offset.left - (this.s.filler.width / 2)-1 + $(nTd).outerWidth())+"px"; + } +}; + + +// Alias for access +DataTable.AutoFill = AutoFill; +DataTable.AutoFill = AutoFill; + + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Constants + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** + * AutoFill version + * @constant version + * @type String + * @default See code + */ +AutoFill.version = "1.2.1"; + + +/** + * AutoFill defaults + * @namespace + */ +AutoFill.defaults = { + /** + * Mode for dragging (restrict to y-axis only, x-axis only, either one or none): + * + * * `y` - y-axis only (default) + * * `x` - x-axis only + * * `either` - either one, but not both axis at the same time + * * `both` - multiple cells allowed + * + * @type {string} + * @default `y` + */ + mode: 'y', + + complete: null, + + /** + * Column definition defaults + * @namespace + */ + column: { + /** + * If AutoFill should be enabled on this column + * + * @type {boolean} + * @default true + */ + enable: true, + + /** + * Allow automatic increment / decrement on this column if a number + * is found. + * + * @type {boolean} + * @default true + */ + increment: true, + + /** + * Cell read function + * + * Default function will simply read the value from the HTML of the + * cell. + * + * @type {function} + * @param {node} cell `th` / `td` element to read the value from + * @return {string} Data that has been read + */ + read: function ( cell ) { + return $(cell).html(); + }, + + /** + * Cell write function + * + * Default function will simply write to the HTML and tell the DataTable + * to update. + * + * @type {function} + * @param {node} cell `th` / `td` element to write the value to + * @return {string} Data two write + */ + write: function ( cell, val ) { + var table = $(cell).parents('table'); + if ( DataTable.Api ) { + // 1.10 + table.DataTable().cell( cell ).data( val ); + } + else { + // 1.9 + var dt = table.dataTable(); + var pos = dt.fnGetPosition( cell ); + dt.fnUpdate( val, pos[0], pos[2], false ); + } + }, + + /** + * Step function. This provides the ability to customise how the values + * are incremented. + * + * @param {node} cell `th` / `td` element that is being operated upon + * @param {string} read Cell value from `read` function + * @param {string} last Value of the previous cell + * @param {integer} i Loop counter + * @param {integer} x Cell x-position in the current auto-fill. The + * starting cell is coordinate 0 regardless of its physical position + * in the DataTable. + * @param {integer} y Cell y-position in the current auto-fill. The + * starting cell is coordinate 0 regardless of its physical position + * in the DataTable. + * @return {string} Value to write + */ + step: function ( cell, read, last, i, x, y ) { + // Increment a number if it is found + var re = /(\-?\d+)/; + var match = this.increment && last ? last.match(re) : null; + if ( match ) { + return last.replace( re, parseInt(match[1],10) + (x<0 || y<0 ? -1 : 1) ); + } + return last === undefined ? + read : + last; + } + } +}; + +return AutoFill; +}; + + +// Define as an AMD module if possible +if ( typeof define === 'function' && define.amd ) { + define( ['jquery', 'datatables'], factory ); +} +else if ( typeof exports === 'object' ) { + // Node/CommonJS + factory( require('jquery'), require('datatables') ); +} +else if ( jQuery && !jQuery.fn.dataTable.AutoFill ) { + // Otherwise simply initialise as normal, stopping multiple evaluation + factory( jQuery, jQuery.fn.dataTable ); +} + + +}(window, document)); + diff --git a/theme/bootstrap/plugins/datatables/extensions/AutoFill/js/dataTables.autoFill.min.js b/theme/bootstrap/plugins/datatables/extensions/AutoFill/js/dataTables.autoFill.min.js new file mode 100644 index 0000000..17f316a --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/AutoFill/js/dataTables.autoFill.min.js @@ -0,0 +1,22 @@ +/*! + AutoFill 1.2.1 + ©2008-2014 SpryMedia Ltd - datatables.net/license +*/ +(function(o,j,m){var l=function(c,k){var h=function(d,b){if(!(this instanceof h))throw"Warning: AutoFill must be initialised with the keyword 'new'";if(!c.fn.dataTableExt.fnVersionCheck("1.7.0"))throw"Warning: AutoFill requires DataTables 1.7 or greater";this.c={};this.s={filler:{height:0,width:0},border:{width:2},drag:{startX:-1,startY:-1,startTd:null,endTd:null,dragging:!1},screen:{interval:null,y:0,height:0,scrollTop:0},scroller:{top:0,bottom:0},columns:[]};this.dom={table:null,filler:null,borderTop:null, +borderRight:null,borderBottom:null,borderLeft:null,currentTarget:null};this.fnSettings=function(){return this.s};this._fnInit(d,b);return this};h.prototype={_fnInit:function(d,b){var a=this;this.s.dt=k.Api?(new k.Api(d)).settings()[0]:d.fnSettings();this.s.init=b||{};this.dom.table=this.s.dt.nTable;c.extend(!0,this.c,h.defaults,b);this._initColumns();var e=c("<div/>",{"class":"AutoFill_filler"}).appendTo("body");this.dom.filler=e[0];this.s.filler.height=e.height();this.s.filler.width=e.width();e[0].style.display= +"none";var g,f=j.body;""!==a.s.dt.oScroll.sY&&(a.s.dt.nTable.parentNode.style.position="relative",f=a.s.dt.nTable.parentNode);g=c("<div/>",{"class":"AutoFill_border"});this.dom.borderTop=g.clone().appendTo(f)[0];this.dom.borderRight=g.clone().appendTo(f)[0];this.dom.borderBottom=g.clone().appendTo(f)[0];this.dom.borderLeft=g.clone().appendTo(f)[0];e.on("mousedown.DTAF",function(b){this.onselectstart=function(){return false};a._fnFillerDragStart.call(a,b);return false});c("tbody",this.dom.table).on("mouseover.DTAF mouseout.DTAF", +">tr>td, >tr>th",function(b){a._fnFillerDisplay.call(a,b)});c(this.dom.table).on("destroy.dt.DTAF",function(){e.off("mousedown.DTAF").remove();c("tbody",this.dom.table).off("mouseover.DTAF mouseout.DTAF")})},_initColumns:function(){var d=this,b,a,e=this.s.dt,g=this.s.init;b=0;for(a=e.aoColumns.length;b<a;b++)this.s.columns[b]=c.extend(!0,{},h.defaults.column);e.oApi._fnApplyColumnDefs(e,g.aoColumnDefs||g.columnDefs,g.aoColumns||g.columns,function(a,b){d._fnColumnOptions(a,b)});b=0;for(a=e.aoColumns.length;b< +a;b++)if(e=this.s.columns[b],e.read||(e.read=this._fnReadCell),e.write||(e.read=this._fnWriteCell),!e.step)e.read=this._fnStep},_fnColumnOptions:function(d,b){var a=this.s.columns[d],c=function(c,d){b[d[0]]!==m&&(a[c]=b[d[0]]);b[d[1]]!==m&&(a[c]=b[d[1]])};c("enable",["bEnable","enable"]);c("read",["fnRead","read"]);c("write",["fnWrite","write"]);c("step",["fnStep","step"]);c("increment",["bIncrement","increment"])},_fnTargetCoords:function(d){var b=c(d).parents("tr")[0],a=this.s.dt.oInstance.fnGetPosition(d); +return{x:c("td",b).index(d),y:c("tr",b.parentNode).index(b),row:a[0],column:a[2]}},_fnUpdateBorder:function(d,b){var a=this.s.border.width,e=c(d).offset(),g=c(b).offset(),f=e.left-a,i=g.left+c(b).outerWidth(),n=e.top-a,h=g.top+c(b).outerHeight(),j=g.left+c(b).outerWidth()-e.left+2*a,k=g.top+c(b).outerHeight()-e.top+2*a;e.left>g.left&&(f=g.left-a,i=e.left+c(d).outerWidth(),j=e.left+c(d).outerWidth()-g.left+2*a);""!==this.s.dt.oScroll.sY&&(a=c(this.s.dt.nTable.parentNode).offset(),e=c(this.s.dt.nTable.parentNode).scrollTop(), +g=c(this.s.dt.nTable.parentNode).scrollLeft(),f-=a.left-g,i-=a.left-g,n-=a.top-e,h-=a.top-e);a=this.dom.borderTop.style;a.top=n+"px";a.left=f+"px";a.height=this.s.border.width+"px";a.width=j+"px";a=this.dom.borderBottom.style;a.top=h+"px";a.left=f+"px";a.height=this.s.border.width+"px";a.width=j+"px";a=this.dom.borderLeft.style;a.top=n+"px";a.left=f+"px";a.height=k+"px";a.width=this.s.border.width+"px";a=this.dom.borderRight.style;a.top=n+"px";a.left=i+"px";a.height=k+"px";a.width=this.s.border.width+ +"px"},_fnFillerDragStart:function(d){var b=this,a=this.dom.currentTarget;this.s.drag.dragging=!0;b.dom.borderTop.style.display="block";b.dom.borderRight.style.display="block";b.dom.borderBottom.style.display="block";b.dom.borderLeft.style.display="block";var e=this._fnTargetCoords(a);this.s.drag.startX=e.x;this.s.drag.startY=e.y;this.s.drag.startTd=a;this.s.drag.endTd=a;this._fnUpdateBorder(a,a);c(j).bind("mousemove.AutoFill",function(a){b._fnFillerDragMove.call(b,a)});c(j).bind("mouseup.AutoFill", +function(a){b._fnFillerFinish.call(b,a)});this.s.screen.y=d.pageY;this.s.screen.height=c(o).height();this.s.screen.scrollTop=c(j).scrollTop();""!==this.s.dt.oScroll.sY&&(this.s.scroller.top=c(this.s.dt.nTable.parentNode).offset().top,this.s.scroller.bottom=this.s.scroller.top+c(this.s.dt.nTable.parentNode).height());this.s.screen.interval=setInterval(function(){var a=c(j).scrollTop();b.s.screen.y=b.s.screen.y+(a-b.s.screen.scrollTop);b.s.screen.height-b.s.screen.y+a<50?c("html, body").animate({scrollTop:a+ +50},240,"linear"):b.s.screen.y-a<50&&c("html, body").animate({scrollTop:a-50},240,"linear");b.s.dt.oScroll.sY!==""&&(b.s.screen.y>b.s.scroller.bottom-50?c(b.s.dt.nTable.parentNode).animate({scrollTop:c(b.s.dt.nTable.parentNode).scrollTop()+50},240,"linear"):b.s.screen.y<b.s.scroller.top+50&&c(b.s.dt.nTable.parentNode).animate({scrollTop:c(b.s.dt.nTable.parentNode).scrollTop()-50},240,"linear"))},250)},_fnFillerDragMove:function(d){if(d.target&&"TD"==d.target.nodeName.toUpperCase()&&d.target!=this.s.drag.endTd){var b= +this._fnTargetCoords(d.target);"y"==this.c.mode&&b.x!=this.s.drag.startX&&(d.target=c("tbody>tr:eq("+b.y+")>td:eq("+this.s.drag.startX+")",this.dom.table)[0]);"x"==this.c.mode&&b.y!=this.s.drag.startY&&(d.target=c("tbody>tr:eq("+this.s.drag.startY+")>td:eq("+b.x+")",this.dom.table)[0]);"either"==this.c.mode&&(b.x!=this.s.drag.startX?d.target=c("tbody>tr:eq("+this.s.drag.startY+")>td:eq("+b.x+")",this.dom.table)[0]:b.y!=this.s.drag.startY&&(d.target=c("tbody>tr:eq("+b.y+")>td:eq("+this.s.drag.startX+ +")",this.dom.table)[0]));"both"!==this.c.mode&&(b=this._fnTargetCoords(d.target));var a=this.s.drag;a.endTd=d.target;b.y>=this.s.drag.startY?this._fnUpdateBorder(a.startTd,a.endTd):this._fnUpdateBorder(a.endTd,a.startTd);this._fnFillerPosition(d.target)}this.s.screen.y=d.pageY;this.s.screen.scrollTop=c(j).scrollTop();""!==this.s.dt.oScroll.sY&&(this.s.scroller.scrollTop=c(this.s.dt.nTable.parentNode).scrollTop(),this.s.scroller.top=c(this.s.dt.nTable.parentNode).offset().top,this.s.scroller.bottom= +this.s.scroller.top+c(this.s.dt.nTable.parentNode).height())},_fnFillerFinish:function(){var d=this,b,a;c(j).unbind("mousemove.AutoFill mouseup.AutoFill");this.dom.borderTop.style.display="none";this.dom.borderRight.style.display="none";this.dom.borderBottom.style.display="none";this.dom.borderLeft.style.display="none";this.s.drag.dragging=!1;clearInterval(this.s.screen.interval);var e=[],g=this.dom.table,f=this._fnTargetCoords(this.s.drag.startTd),i=this._fnTargetCoords(this.s.drag.endTd),h=function(a){return d.s.dt.oApi._fnVisibleToColumnIndex(d.s.dt, +a)};if(f.y<=i.y)for(b=f.y;b<=i.y;b++)if(f.x<=i.x)for(a=f.x;a<=i.x;a++)e.push({node:c("tbody>tr:eq("+b+")>td:eq("+a+")",g)[0],x:a-f.x,y:b-f.y,colIdx:h(a)});else for(a=f.x;a>=i.x;a--)e.push({node:c("tbody>tr:eq("+b+")>td:eq("+a+")",g)[0],x:a-f.x,y:b-f.y,colIdx:h(a)});else for(b=f.y;b>=i.y;b--)if(f.x<=i.x)for(a=f.x;a<=i.x;a++)e.push({node:c("tbody>tr:eq("+b+")>td:eq("+a+")",g)[0],x:a-f.x,y:b-f.y,colIdx:h(a)});else for(a=f.x;a>=i.x;a--)e.push({node:c("tbody>tr:eq("+b+")>td:eq("+a+")",g)[0],x:f.x-a,y:f.y- +b,colIdx:h(a)});if(!(1>=e.length)){var g=[],m;b=0;for(a=e.length;b<a;b++){var f=e[b],i=this.s.columns[f.colIdx],h=i.read.call(i,f.node),l=i.step.call(i,f.node,h,m,b,f.x,f.y);i.write.call(i,f.node,l);m=l;g.push({cell:f,colIdx:f.colIdx,newValue:l,oldValue:h})}null!==this.c.complete&&this.c.complete.call(this,g);k.Api?(new k.Api(this.s.dt)).draw(!1):this.s.dt.oInstance.fnDraw()}},_fnFillerDisplay:function(d){var b=this.dom.filler;if(!this.s.drag.dragging){var a="td"==d.target.nodeName.toLowerCase()? +d.target:c(d.target).parents("td")[0],e=this._fnTargetCoords(a).column;if(this.s.columns[e].enable)if("mouseover"==d.type)this.dom.currentTarget=a,this._fnFillerPosition(a),b.style.display="block";else{if(!d.relatedTarget||!d.relatedTarget.className.match(/AutoFill/))b.style.display="none"}else b.style.display="none"}},_fnFillerPosition:function(d){var b=c(d).offset(),a=this.dom.filler;a.style.top=b.top-this.s.filler.height/2-1+c(d).outerHeight()+"px";a.style.left=b.left-this.s.filler.width/2-1+c(d).outerWidth()+ +"px"}};k.AutoFill=h;k.AutoFill=h;h.version="1.2.1";h.defaults={mode:"y",complete:null,column:{enable:!0,increment:!0,read:function(d){return c(d).html()},write:function(d,b){var a=c(d).parents("table");if(k.Api)a.DataTable().cell(d).data(b);else{var a=a.dataTable(),e=a.fnGetPosition(d);a.fnUpdate(b,e[0],e[2],!1)}},step:function(c,b,a,e,g,f){c=/(\-?\d+)/;return(e=this.increment&&a?a.match(c):null)?a.replace(c,parseInt(e[1],10)+(0>g||0>f?-1:1)):a===m?b:a}}};return h};"function"===typeof define&&define.amd? +define(["jquery","datatables"],l):"object"===typeof exports?l(require("jquery"),require("datatables")):jQuery&&!jQuery.fn.dataTable.AutoFill&&l(jQuery,jQuery.fn.dataTable)})(window,document); diff --git a/theme/bootstrap/plugins/datatables/extensions/ColReorder/License.txt b/theme/bootstrap/plugins/datatables/extensions/ColReorder/License.txt new file mode 100644 index 0000000..9ade2f1 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColReorder/License.txt @@ -0,0 +1,20 @@ +Copyright (c) 2010-2015 SpryMedia Limited +http://datatables.net + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/theme/bootstrap/plugins/datatables/extensions/ColReorder/Readme.md b/theme/bootstrap/plugins/datatables/extensions/ColReorder/Readme.md new file mode 100644 index 0000000..217dd60 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColReorder/Readme.md @@ -0,0 +1,39 @@ +# ColReorder + +ColReorder adds the ability for the end user to click and drag column headers to reorder a table as they see fit, to DataTables. Key features include: + +* Very easy integration with DataTables +* Tight integration with all other DataTables plug-ins +* The ability to exclude the first (or more) column from being movable +* Predefine a column order +* Save staving integration with DataTables + + +# Installation + +To use ColReorder, first download DataTables ( http://datatables.net/download ) and place the unzipped ColReorder package into a `extensions` directory in the DataTables package. This will allow the pages in the examples to operate correctly. To see the examples running, open the `examples` directory in your web-browser. + + +# Basic usage + +ColReorder is initialised using the `$.fn.dataTable.ColReorder` constructor. For example: + +```js +$(document).ready( function () { + $('#example').DataTable(); + + new $.fn.dataTable.ColReorder( table ); +} ); +``` + + +# Documentation / support + +* Documentation: http://datatables.net/extensions/colreorder/ +* DataTables support forums: http://datatables.net/forums + + +# GitHub + +If you fancy getting involved with the development of ColReorder and help make it better, please refer to its GitHub repo: https://github.com/DataTables/ColReorder + diff --git a/theme/bootstrap/plugins/datatables/extensions/ColReorder/css/dataTables.colReorder.css b/theme/bootstrap/plugins/datatables/extensions/ColReorder/css/dataTables.colReorder.css new file mode 100644 index 0000000..bdd6aa0 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColReorder/css/dataTables.colReorder.css @@ -0,0 +1,14 @@ +/* + * Namespace DTCR - "DataTables ColReorder" plug-in + */ + +table.DTCR_clonedTable { + background-color: rgba(255, 255, 255, 0.7); + z-index: 202; +} + +div.DTCR_pointer { + width: 1px; + background-color: #0259C4; + z-index: 201; +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColReorder/css/dataTables.colReorder.min.css b/theme/bootstrap/plugins/datatables/extensions/ColReorder/css/dataTables.colReorder.min.css new file mode 100644 index 0000000..77b230e --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColReorder/css/dataTables.colReorder.min.css @@ -0,0 +1 @@ +table.DTCR_clonedTable{background-color:rgba(255,255,255,0.7);z-index:202}div.DTCR_pointer{width:1px;background-color:#0259C4;z-index:201} diff --git a/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/alt_insert.html b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/alt_insert.html new file mode 100644 index 0000000..16bedcf --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/alt_insert.html @@ -0,0 +1,637 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColReorder example - Alternative insert styling</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + +div.DTCR_pointer { + margin-top: -15px; + margin-left: -9px; + width: 18px; + background: url('../images/insert.png') no-repeat top left; +} + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + dom: 'Rlfrtip' + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColReorder example <span>Alternative insert styling</span></h1> + + <div class="info"> + <p>Using CSS it is easy to modify the insert bar to suit your web-site. This example shows how an arrow can be used to show the insert point rather than the + straight bar used in the other examples by simply adding an extra CSS rule to include the image.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + dom: 'Rlfrtip' + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">div.DTCR_pointer { + margin-top: -15px; + margin-left: -9px; + width: 18px; + background: url('../images/insert.png') no-repeat top left; +}</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">Initialisation using `new`</a></li> + <li class="active"><a href="./alt_insert.html">Alternative insert styling</a></li> + <li><a href="./realtime.html">Realtime updating</a></li> + <li><a href="./state_save.html">State saving</a></li> + <li><a href="./scrolling.html">Scrolling table</a></li> + <li><a href="./predefined.html">Predefined column ordering</a></li> + <li><a href="./reset.html">Reset ordering API</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./fixedcolumns.html">FixedColumns integration</a></li> + <li><a href="./fixedheader.html">FixedHeader integration</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./server_side.html">Server-side processing</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/col_filter.html b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/col_filter.html new file mode 100644 index 0000000..355ff2b --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/col_filter.html @@ -0,0 +1,656 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColReorder example - Individual column filtering</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + // Setup - add a text input to each footer cell + $('#example tfoot th').each( function () { + var title = $('#example thead th').eq( $(this).index() ).text(); + $(this).html( '<input type="text" placeholder="Search '+title+'" />' ); + } ); + + // DataTable + var table = $('#example').DataTable( { + dom: 'Rlfrtip' + } ); + + // Apply the filter + $("#example tfoot input").on( 'keyup change', function () { + table + .column( $(this).parent().index()+':visible' ) + .search( this.value ) + .draw(); + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColReorder example <span>Individual column filtering</span></h1> + + <div class="info"> + <p>This example of how to use ColReorder shows how it can with with DataTables' ability to do individual column filtering. The basic example is exactly the same as + the DataTables column filtering example, but with ColReorder also added to the table (through the <code>R</code> option for <a href= + "//datatables.net/reference/option/dom"><code class="option" title="DataTables initialisation option">dom<span>DT</span></code></a>).</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + // Setup - add a text input to each footer cell + $('#example tfoot th').each( function () { + var title = $('#example thead th').eq( $(this).index() ).text(); + $(this).html( '&lt;input type=&quot;text&quot; placeholder=&quot;Search '+title+'&quot; /&gt;' ); + } ); + + // DataTable + var table = $('#example').DataTable( { + dom: 'Rlfrtip' + } ); + + // Apply the filter + $(&quot;#example tfoot input&quot;).on( 'keyup change', function () { + table + .column( $(this).parent().index()+':visible' ) + .search( this.value ) + .draw(); + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">Initialisation using `new`</a></li> + <li><a href="./alt_insert.html">Alternative insert styling</a></li> + <li><a href="./realtime.html">Realtime updating</a></li> + <li><a href="./state_save.html">State saving</a></li> + <li><a href="./scrolling.html">Scrolling table</a></li> + <li><a href="./predefined.html">Predefined column ordering</a></li> + <li><a href="./reset.html">Reset ordering API</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./fixedcolumns.html">FixedColumns integration</a></li> + <li><a href="./fixedheader.html">FixedHeader integration</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + <li class="active"><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./server_side.html">Server-side processing</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/colvis.html b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/colvis.html new file mode 100644 index 0000000..54c79c2 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/colvis.html @@ -0,0 +1,635 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColReorder example - ColVis integration</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css"> + <link rel="stylesheet" type="text/css" href="../../ColVis/css/dataTables.colVis.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script> + <script type="text/javascript" language="javascript" src="../../ColVis/js/dataTables.colVis.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable( { + dom: 'RC<"clear">lfrtip', + columnDefs: [ + { visible: false, targets: 1 } + ] + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColReorder example <span>ColVis integration</span></h1> + + <div class="info"> + <p>ColReorder interfaces with the <a href="//datatables.net/extensions/colvis">ColVis extension</a> for DataTables by updating the order of the list of columns + whenever a reorder is done. This is shown in the example below, where one column has been initially hidden to add extra emphasis to ColVis.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable( { + dom: 'RC&lt;&quot;clear&quot;&gt;lfrtip', + columnDefs: [ + { visible: false, targets: 1 } + ] + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li> + <li><a href="../../ColVis/js/dataTables.colVis.js">../../ColVis/js/dataTables.colVis.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li> + <li><a href="../../ColVis/css/dataTables.colVis.css">../../ColVis/css/dataTables.colVis.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">Initialisation using `new`</a></li> + <li><a href="./alt_insert.html">Alternative insert styling</a></li> + <li><a href="./realtime.html">Realtime updating</a></li> + <li><a href="./state_save.html">State saving</a></li> + <li><a href="./scrolling.html">Scrolling table</a></li> + <li><a href="./predefined.html">Predefined column ordering</a></li> + <li><a href="./reset.html">Reset ordering API</a></li> + <li class="active"><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./fixedcolumns.html">FixedColumns integration</a></li> + <li><a href="./fixedheader.html">FixedHeader integration</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./server_side.html">Server-side processing</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/fixedcolumns.html b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/fixedcolumns.html new file mode 100644 index 0000000..0599ba4 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/fixedcolumns.html @@ -0,0 +1,831 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColReorder example - FixedColumns integration</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css"> + <link rel="stylesheet" type="text/css" href="../../FixedColumns/css/dataTables.fixedColumns.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script> + <script type="text/javascript" language="javascript" src="../../FixedColumns/js/dataTables.fixedColumns.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + window.table = $('#example').DataTable( { + dom: 'Rlfrtip', + scrollX: true, + scrollCollapse: true, + columnDefs: [ + { orderable: false, targets: 0 }, + { orderable: false, targets: -1 } + ], + ordering: [[ 1, 'asc' ]], + colReorder: { + fixedColumnsLeft: 1, + fixedColumnsRight: 1 + } + } ); + + window.fc = new $.fn.dataTable.FixedColumns( table, { + leftColumns: 1, + rightColumns: 1 + } ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColReorder example <span>FixedColumns integration</span></h1> + + <div class="info"> + <p>While ColReorder works with the built-in scrolling options in DataTables (<a href="//datatables.net/reference/option/scrollY"><code class="option" title= + "DataTables initialisation option">scrollY<span>DT</span></code></a> and <a href="//datatables.net/reference/option/scrollX"><code class="option" title= + "DataTables initialisation option">scrollX<span>DT</span></code></a>) and also the <a href="//datatables.net/extensions/fixedcolumns">FixedColumns + extension</a>.</p> + + <p>ColReorder provides the <code>fixedColumnsLeft</code> and <code>fixedColumnsRight</code> options which allows you disallow reordering of the fixed columns + (which is required).</p> + </div> + + <table id="example" class="display nowrap" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + window.table = $('#example').DataTable( { + dom: 'Rlfrtip', + scrollX: true, + scrollCollapse: true, + columnDefs: [ + { orderable: false, targets: 0 }, + { orderable: false, targets: -1 } + ], + ordering: [[ 1, 'asc' ]], + colReorder: { + fixedColumnsLeft: 1, + fixedColumnsRight: 1 + } + } ); + + window.fc = new $.fn.dataTable.FixedColumns( table, { + leftColumns: 1, + rightColumns: 1 + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li> + <li><a href="../../FixedColumns/js/dataTables.fixedColumns.js">../../FixedColumns/js/dataTables.fixedColumns.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li> + <li><a href="../../FixedColumns/css/dataTables.fixedColumns.css">../../FixedColumns/css/dataTables.fixedColumns.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">Initialisation using `new`</a></li> + <li><a href="./alt_insert.html">Alternative insert styling</a></li> + <li><a href="./realtime.html">Realtime updating</a></li> + <li><a href="./state_save.html">State saving</a></li> + <li><a href="./scrolling.html">Scrolling table</a></li> + <li><a href="./predefined.html">Predefined column ordering</a></li> + <li><a href="./reset.html">Reset ordering API</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li class="active"><a href="./fixedcolumns.html">FixedColumns integration</a></li> + <li><a href="./fixedheader.html">FixedHeader integration</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./server_side.html">Server-side processing</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/fixedheader.html b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/fixedheader.html new file mode 100644 index 0000000..40f0546 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/fixedheader.html @@ -0,0 +1,635 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColReorder example - FixedHeader integration</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css"> + <link rel="stylesheet" type="text/css" href="../../FixedHeader/css/dataTables.fixedHeader.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script> + <script type="text/javascript" language="javascript" src="../../FixedHeader/js/dataTables.fixedHeader.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + var table = $('#example').dataTable( { + dom: 'Rlfrtip' + } ); + + new $.fn.dataTable.fixedHeader( table ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColReorder example <span>FixedHeader integration</span></h1> + + <div class="info"> + <p>FixedHeader is a particularly useful plug-in for DataTables, allowing a table header to float at the top of a scrolling window. ColReorder works well with + FixedHeader, allowing you to reorder columns even using the floating header, as shown in the example below.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').dataTable( { + dom: 'Rlfrtip' + } ); + + new $.fn.dataTable.fixedHeader( table ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li> + <li><a href="../../FixedHeader/js/dataTables.fixedHeader.js">../../FixedHeader/js/dataTables.fixedHeader.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li> + <li><a href="../../FixedHeader/css/dataTables.fixedHeader.css">../../FixedHeader/css/dataTables.fixedHeader.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">Initialisation using `new`</a></li> + <li><a href="./alt_insert.html">Alternative insert styling</a></li> + <li><a href="./realtime.html">Realtime updating</a></li> + <li><a href="./state_save.html">State saving</a></li> + <li><a href="./scrolling.html">Scrolling table</a></li> + <li><a href="./predefined.html">Predefined column ordering</a></li> + <li><a href="./reset.html">Reset ordering API</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./fixedcolumns.html">FixedColumns integration</a></li> + <li class="active"><a href="./fixedheader.html">FixedHeader integration</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./server_side.html">Server-side processing</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/index.html b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/index.html new file mode 100644 index 0000000..65018ab --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/index.html @@ -0,0 +1,74 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + + <title>ColReorder examples - ColReorder examples</title> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColReorder example <span>ColReorder examples</span></h1> + + <div class="info"> + <p>ColReorder adds the ability for the end user to click and drag column headers to reorder a table as they see fit, to DataTables. Key features include:</p> + + <ul class="markdown"> + <li>Very easy integration with DataTables</li> + <li>Tight integration with all other DataTables plug-ins</li> + <li>The ability to exclude the first (or more) column from being movable</li> + <li>Predefine a column order</li> + <li>Save staving integration with DataTables</li> + </ul> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">Initialisation using `new`</a></li> + <li><a href="./alt_insert.html">Alternative insert styling</a></li> + <li><a href="./realtime.html">Realtime updating</a></li> + <li><a href="./state_save.html">State saving</a></li> + <li><a href="./scrolling.html">Scrolling table</a></li> + <li><a href="./predefined.html">Predefined column ordering</a></li> + <li><a href="./reset.html">Reset ordering API</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./fixedcolumns.html">FixedColumns integration</a></li> + <li><a href="./fixedheader.html">FixedHeader integration</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./server_side.html">Server-side processing</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/jqueryui.html b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/jqueryui.html new file mode 100644 index 0000000..8eedf91 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/jqueryui.html @@ -0,0 +1,635 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColReorder example - jQuery UI styling</title> + <link rel="stylesheet" type="text/css" href="//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css"> + <link rel="stylesheet" type="text/css" href="../../Plugins/integration/jqueryui/dataTables.jqueryui.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../../Plugins/integration/jqueryui/dataTables.jqueryui.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + var table = $('#example').dataTable(); + + new $.fn.dataTable.ColReorder( table ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColReorder example <span>jQuery UI styling</span></h1> + + <div class="info"> + <p>This example shows how the jQuery UI ThemeRoller option in DataTables can be used with ColReorder.</p> + + <p>The important thing to note here is that it is easier to use <code>new $.fn.dataTable.ColReorder()</code> to add ColReorder to the table rather than <a href= + "//datatables.net/reference/option/dom"><code class="option" title="DataTables initialisation option">dom<span>DT</span></code></a> as the jQuery UI integration + uses a complex expression for <a href="//datatables.net/reference/option/dom"><code class="option" title= + "DataTables initialisation option">dom<span>DT</span></code></a>.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').dataTable(); + + new $.fn.dataTable.ColReorder( table ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../../Plugins/integration/jqueryui/dataTables.jqueryui.js">../../Plugins/integration/jqueryui/dataTables.jqueryui.js</a></li> + <li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css">//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css</a></li> + <li><a href="../../Plugins/integration/jqueryui/dataTables.jqueryui.css">../../Plugins/integration/jqueryui/dataTables.jqueryui.css</a></li> + <li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">Initialisation using `new`</a></li> + <li><a href="./alt_insert.html">Alternative insert styling</a></li> + <li><a href="./realtime.html">Realtime updating</a></li> + <li><a href="./state_save.html">State saving</a></li> + <li><a href="./scrolling.html">Scrolling table</a></li> + <li><a href="./predefined.html">Predefined column ordering</a></li> + <li><a href="./reset.html">Reset ordering API</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./fixedcolumns.html">FixedColumns integration</a></li> + <li><a href="./fixedheader.html">FixedHeader integration</a></li> + <li class="active"><a href="./jqueryui.html">jQuery UI styling</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./server_side.html">Server-side processing</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/new_init.html b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/new_init.html new file mode 100644 index 0000000..01ab2aa --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/new_init.html @@ -0,0 +1,626 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColReorder example - Initialisation using `new`</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable(); + + new $.fn.dataTable.ColReorder( table ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColReorder example <span>Initialisation using `new`</span></h1> + + <div class="info"> + <p>As well as providing the option to be initialised through the <code>R</code> option of <a href="//datatables.net/reference/option/dom"><code class="option" + title="DataTables initialisation option">dom<span>DT</span></code></a>, ColReorder can also be added to a DataTable using direct initialisation - <code>new + $.fn.dataTable.ColReorder();</code> as shown in this example.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable(); + + new $.fn.dataTable.ColReorder( table ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li class="active"><a href="./new_init.html">Initialisation using `new`</a></li> + <li><a href="./alt_insert.html">Alternative insert styling</a></li> + <li><a href="./realtime.html">Realtime updating</a></li> + <li><a href="./state_save.html">State saving</a></li> + <li><a href="./scrolling.html">Scrolling table</a></li> + <li><a href="./predefined.html">Predefined column ordering</a></li> + <li><a href="./reset.html">Reset ordering API</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./fixedcolumns.html">FixedColumns integration</a></li> + <li><a href="./fixedheader.html">FixedHeader integration</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./server_side.html">Server-side processing</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/predefined.html b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/predefined.html new file mode 100644 index 0000000..3cbb166 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/predefined.html @@ -0,0 +1,636 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColReorder example - Predefined column ordering</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + $('#example').dataTable( { + dom: 'Rlfrtip', + colReorder: { + order: [ 4, 3, 2, 1, 0, 5 ] + } + } ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColReorder example <span>Predefined column ordering</span></h1> + + <div class="info"> + <p>ColReorder provides the ability to specify a column ordering which is not that of the HTML (which typically you will want) through the parameter + <code>colReorder.order</code>. This is an array of integers with the column ordering you want.</p> + + <p>For full information about the ColReorder options, please refer to the <a href="//datatables.net/extensions/colreorder/options">ColReorder options + documentation</a>.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').dataTable( { + dom: 'Rlfrtip', + colReorder: { + order: [ 4, 3, 2, 1, 0, 5 ] + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">Initialisation using `new`</a></li> + <li><a href="./alt_insert.html">Alternative insert styling</a></li> + <li><a href="./realtime.html">Realtime updating</a></li> + <li><a href="./state_save.html">State saving</a></li> + <li><a href="./scrolling.html">Scrolling table</a></li> + <li class="active"><a href="./predefined.html">Predefined column ordering</a></li> + <li><a href="./reset.html">Reset ordering API</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./fixedcolumns.html">FixedColumns integration</a></li> + <li><a href="./fixedheader.html">FixedHeader integration</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./server_side.html">Server-side processing</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/realtime.html b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/realtime.html new file mode 100644 index 0000000..c759409 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/realtime.html @@ -0,0 +1,637 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColReorder example - Realtime updating</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + $('#example').dataTable( { + dom: 'Rlfrtip', + colReorder: { + realtime: true + } + } ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColReorder example <span>Realtime updating</span></h1> + + <div class="info"> + <p>While the ColReorder insertion point indicator can be styled, another option to show the end user what the column will look like when the table has been + reordered is to actually do the reordering while the mouse is still dragging the column header. This is shown in this example and is controlled by the + <code>realtime</code> parameter.</p> + + <p>For full information about the ColReorder options, please refer to the <a href="//datatables.net/extensions/colreorder/options">ColReorder options + documentation</a>.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').dataTable( { + dom: 'Rlfrtip', + colReorder: { + realtime: true + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">Initialisation using `new`</a></li> + <li><a href="./alt_insert.html">Alternative insert styling</a></li> + <li class="active"><a href="./realtime.html">Realtime updating</a></li> + <li><a href="./state_save.html">State saving</a></li> + <li><a href="./scrolling.html">Scrolling table</a></li> + <li><a href="./predefined.html">Predefined column ordering</a></li> + <li><a href="./reset.html">Reset ordering API</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./fixedcolumns.html">FixedColumns integration</a></li> + <li><a href="./fixedheader.html">FixedHeader integration</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./server_side.html">Server-side processing</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/reset.html b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/reset.html new file mode 100644 index 0000000..b2e1fc0 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/reset.html @@ -0,0 +1,649 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColReorder example - Reset ordering API</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + var table = $('#example').DataTable( { + dom: 'Rlfrtip', + colReorder: { + order: [ 4, 3, 2, 1, 0 ] + } + } ); + + $('#reset').click( function (e) { + e.preventDefault(); + + table.colReorder.reset(); + } ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColReorder example <span>Reset ordering API</span></h1> + + <div class="info"> + <p>One useful control option to present the end user when using ColReorder is the ability to reset the column ordering to that which was found in the HTML. This + can be done by calling the <code>reset</code> API function. While ColReorder does not provide a visual element for this itself (in order to provide maximum + flexibility) it is easy to hook to an event handler, as shown in this example.</p> + + <p>For full information about the ColReorder API, please refer to the <a href="//datatables.net/extensions/colreorder/api">ColReorder API documentation</a>.</p> + </div><button id="reset">Reset to original HTML order</button><br> + <br> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable( { + dom: 'Rlfrtip', + colReorder: { + order: [ 4, 3, 2, 1, 0 ] + } + } ); + + $('#reset').click( function (e) { + e.preventDefault(); + + table.colReorder.reset(); + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">Initialisation using `new`</a></li> + <li><a href="./alt_insert.html">Alternative insert styling</a></li> + <li><a href="./realtime.html">Realtime updating</a></li> + <li><a href="./state_save.html">State saving</a></li> + <li><a href="./scrolling.html">Scrolling table</a></li> + <li><a href="./predefined.html">Predefined column ordering</a></li> + <li class="active"><a href="./reset.html">Reset ordering API</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./fixedcolumns.html">FixedColumns integration</a></li> + <li><a href="./fixedheader.html">FixedHeader integration</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./server_side.html">Server-side processing</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/scrolling.html b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/scrolling.html new file mode 100644 index 0000000..860e665 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/scrolling.html @@ -0,0 +1,632 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColReorder example - Scrolling table</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + $('#example').dataTable( { + dom: 'Rlfrtip', + scrollY: '200px', + paging: false + } ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColReorder example <span>Scrolling table</span></h1> + + <div class="info"> + <p>This is a simple example to show ColReorder working with DataTables scrolling (<a href="//datatables.net/reference/option/scrollY"><code class="option" title= + "DataTables initialisation option">scrollY<span>DT</span></code></a> and <a href="//datatables.net/reference/option/scrollX"><code class="option" title= + "DataTables initialisation option">scrollX<span>DT</span></code></a>).</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').dataTable( { + dom: 'Rlfrtip', + scrollY: '200px', + paging: false + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">Initialisation using `new`</a></li> + <li><a href="./alt_insert.html">Alternative insert styling</a></li> + <li><a href="./realtime.html">Realtime updating</a></li> + <li><a href="./state_save.html">State saving</a></li> + <li class="active"><a href="./scrolling.html">Scrolling table</a></li> + <li><a href="./predefined.html">Predefined column ordering</a></li> + <li><a href="./reset.html">Reset ordering API</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./fixedcolumns.html">FixedColumns integration</a></li> + <li><a href="./fixedheader.html">FixedHeader integration</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./server_side.html">Server-side processing</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/server_side.html b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/server_side.html new file mode 100644 index 0000000..f682b7a --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/server_side.html @@ -0,0 +1,192 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColReorder example - Server-side processing</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + $('#example').dataTable( { + dom: 'Rlfrtip', + processing: true, + serverSide: true, + ajax: "../../../examples/server_side/scripts/objects.php", + columns: [ + { data: "first_name" }, + { data: "last_name" }, + { data: "position" }, + { data: "office" }, + { data: "start_date" }, + { data: "salary" } + ] + } ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColReorder example <span>Server-side processing</span></h1> + + <div class="info"> + <p>Server-side processing can be exceptionally useful in DataTables when dealing with massive data sets, and ColReorder works with this as would be expected.</p> + + <p>It is recommend that you use object based data with server-side processing and ColReorder, as this provides easily understandable mapping between the the + columns and the data relation on the server, otherwise you need to work out array indexes on each call!</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Extn.</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Extn.</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').dataTable( { + dom: 'Rlfrtip', + processing: true, + serverSide: true, + ajax: &quot;../../../examples/server_side/scripts/objects.php&quot;, + columns: [ + { data: &quot;first_name&quot; }, + { data: &quot;last_name&quot; }, + { data: &quot;position&quot; }, + { data: &quot;office&quot; }, + { data: &quot;start_date&quot; }, + { data: &quot;salary&quot; } + ] + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">Initialisation using `new`</a></li> + <li><a href="./alt_insert.html">Alternative insert styling</a></li> + <li><a href="./realtime.html">Realtime updating</a></li> + <li><a href="./state_save.html">State saving</a></li> + <li><a href="./scrolling.html">Scrolling table</a></li> + <li><a href="./predefined.html">Predefined column ordering</a></li> + <li><a href="./reset.html">Reset ordering API</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./fixedcolumns.html">FixedColumns integration</a></li> + <li><a href="./fixedheader.html">FixedHeader integration</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li class="active"><a href="./server_side.html">Server-side processing</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/simple.html b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/simple.html new file mode 100644 index 0000000..92cffee --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/simple.html @@ -0,0 +1,630 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColReorder example - Basic initialisation</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + dom: 'Rlfrtip' + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColReorder example <span>Basic initialisation</span></h1> + + <div class="info"> + <p>This example shows the basic use case of the ColReorder plug-in. With ColReorder enabled for a table, the user has the ability to click and drag any table + header cell, and drop it where they wish the column to be inserted. The insert point is shown visually, and the column reordering is done as soon as the mouse + button is released.</p> + + <p>ColReorder is added to a DataTable through the <code>R</code> character that it adds to DataTables feature plug-ins. This means that you simply add the + character <code>R</code> to the <a href="//datatables.net/reference/option/dom"><code class="option" title= + "DataTables initialisation option">dom<span>DT</span></code></a> parameter for your table to add ColReorder - as shown in the example below.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + dom: 'Rlfrtip' + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li class="active"><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">Initialisation using `new`</a></li> + <li><a href="./alt_insert.html">Alternative insert styling</a></li> + <li><a href="./realtime.html">Realtime updating</a></li> + <li><a href="./state_save.html">State saving</a></li> + <li><a href="./scrolling.html">Scrolling table</a></li> + <li><a href="./predefined.html">Predefined column ordering</a></li> + <li><a href="./reset.html">Reset ordering API</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./fixedcolumns.html">FixedColumns integration</a></li> + <li><a href="./fixedheader.html">FixedHeader integration</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./server_side.html">Server-side processing</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/state_save.html b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/state_save.html new file mode 100644 index 0000000..6e4e2e9 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColReorder/examples/state_save.html @@ -0,0 +1,631 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColReorder example - State saving</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colReorder.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colReorder.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + $('#example').dataTable( { + dom: 'Rlfrtip', + stateSave: true + } ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColReorder example <span>State saving</span></h1> + + <div class="info"> + <p>A useful interaction pattern to use in DataTables is state saving, so when the end user reloads or revisits a page its previous state is retained. ColReorder + works seamlessly with state saving in DataTables (<a href="//datatables.net/reference/option/stateSave"><code class="option" title= + "DataTables initialisation option">stateSave<span>DT</span></code></a>), remembering and restoring the column positions, as well as everything else such as sorting + and filtering.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').dataTable( { + dom: 'Rlfrtip', + stateSave: true + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colReorder.js">../js/dataTables.colReorder.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colReorder.css">../css/dataTables.colReorder.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">Initialisation using `new`</a></li> + <li><a href="./alt_insert.html">Alternative insert styling</a></li> + <li><a href="./realtime.html">Realtime updating</a></li> + <li class="active"><a href="./state_save.html">State saving</a></li> + <li><a href="./scrolling.html">Scrolling table</a></li> + <li><a href="./predefined.html">Predefined column ordering</a></li> + <li><a href="./reset.html">Reset ordering API</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./fixedcolumns.html">FixedColumns integration</a></li> + <li><a href="./fixedheader.html">FixedHeader integration</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./server_side.html">Server-side processing</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColReorder/images/insert.png b/theme/bootstrap/plugins/datatables/extensions/ColReorder/images/insert.png new file mode 100644 index 0000000..15d5522 Binary files /dev/null and b/theme/bootstrap/plugins/datatables/extensions/ColReorder/images/insert.png differ diff --git a/theme/bootstrap/plugins/datatables/extensions/ColReorder/js/dataTables.colReorder.js b/theme/bootstrap/plugins/datatables/extensions/ColReorder/js/dataTables.colReorder.js new file mode 100644 index 0000000..c3b2f1e --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColReorder/js/dataTables.colReorder.js @@ -0,0 +1,1372 @@ +/*! ColReorder 1.1.3 + * ©2010-2014 SpryMedia Ltd - datatables.net/license + */ + +/** + * @summary ColReorder + * @description Provide the ability to reorder columns in a DataTable + * @version 1.1.3 + * @file dataTables.colReorder.js + * @author SpryMedia Ltd (www.sprymedia.co.uk) + * @contact www.sprymedia.co.uk/contact + * @copyright Copyright 2010-2014 SpryMedia Ltd. + * + * This source file is free software, available under the following license: + * MIT license - http://datatables.net/license/mit + * + * This source file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. + * + * For details please refer to: http://www.datatables.net + */ + +(function(window, document, undefined) { + + +/** + * Switch the key value pairing of an index array to be value key (i.e. the old value is now the + * key). For example consider [ 2, 0, 1 ] this would be returned as [ 1, 2, 0 ]. + * @method fnInvertKeyValues + * @param array aIn Array to switch around + * @returns array + */ +function fnInvertKeyValues( aIn ) +{ + var aRet=[]; + for ( var i=0, iLen=aIn.length ; i<iLen ; i++ ) + { + aRet[ aIn[i] ] = i; + } + return aRet; +} + + +/** + * Modify an array by switching the position of two elements + * @method fnArraySwitch + * @param array aArray Array to consider, will be modified by reference (i.e. no return) + * @param int iFrom From point + * @param int iTo Insert point + * @returns void + */ +function fnArraySwitch( aArray, iFrom, iTo ) +{ + var mStore = aArray.splice( iFrom, 1 )[0]; + aArray.splice( iTo, 0, mStore ); +} + + +/** + * Switch the positions of nodes in a parent node (note this is specifically designed for + * table rows). Note this function considers all element nodes under the parent! + * @method fnDomSwitch + * @param string sTag Tag to consider + * @param int iFrom Element to move + * @param int Point to element the element to (before this point), can be null for append + * @returns void + */ +function fnDomSwitch( nParent, iFrom, iTo ) +{ + var anTags = []; + for ( var i=0, iLen=nParent.childNodes.length ; i<iLen ; i++ ) + { + if ( nParent.childNodes[i].nodeType == 1 ) + { + anTags.push( nParent.childNodes[i] ); + } + } + var nStore = anTags[ iFrom ]; + + if ( iTo !== null ) + { + nParent.insertBefore( nStore, anTags[iTo] ); + } + else + { + nParent.appendChild( nStore ); + } +} + + + +var factory = function( $, DataTable ) { +"use strict"; + +/** + * Plug-in for DataTables which will reorder the internal column structure by taking the column + * from one position (iFrom) and insert it into a given point (iTo). + * @method $.fn.dataTableExt.oApi.fnColReorder + * @param object oSettings DataTables settings object - automatically added by DataTables! + * @param int iFrom Take the column to be repositioned from this point + * @param int iTo and insert it into this point + * @returns void + */ +$.fn.dataTableExt.oApi.fnColReorder = function ( oSettings, iFrom, iTo ) +{ + var v110 = $.fn.dataTable.Api ? true : false; + var i, iLen, j, jLen, iCols=oSettings.aoColumns.length, nTrs, oCol; + var attrMap = function ( obj, prop, mapping ) { + if ( ! obj[ prop ] ) { + return; + } + + var a = obj[ prop ].split('.'); + var num = a.shift(); + + if ( isNaN( num*1 ) ) { + return; + } + + obj[ prop ] = mapping[ num*1 ]+'.'+a.join('.'); + }; + + /* Sanity check in the input */ + if ( iFrom == iTo ) + { + /* Pointless reorder */ + return; + } + + if ( iFrom < 0 || iFrom >= iCols ) + { + this.oApi._fnLog( oSettings, 1, "ColReorder 'from' index is out of bounds: "+iFrom ); + return; + } + + if ( iTo < 0 || iTo >= iCols ) + { + this.oApi._fnLog( oSettings, 1, "ColReorder 'to' index is out of bounds: "+iTo ); + return; + } + + /* + * Calculate the new column array index, so we have a mapping between the old and new + */ + var aiMapping = []; + for ( i=0, iLen=iCols ; i<iLen ; i++ ) + { + aiMapping[i] = i; + } + fnArraySwitch( aiMapping, iFrom, iTo ); + var aiInvertMapping = fnInvertKeyValues( aiMapping ); + + + /* + * Convert all internal indexing to the new column order indexes + */ + /* Sorting */ + for ( i=0, iLen=oSettings.aaSorting.length ; i<iLen ; i++ ) + { + oSettings.aaSorting[i][0] = aiInvertMapping[ oSettings.aaSorting[i][0] ]; + } + + /* Fixed sorting */ + if ( oSettings.aaSortingFixed !== null ) + { + for ( i=0, iLen=oSettings.aaSortingFixed.length ; i<iLen ; i++ ) + { + oSettings.aaSortingFixed[i][0] = aiInvertMapping[ oSettings.aaSortingFixed[i][0] ]; + } + } + + /* Data column sorting (the column which the sort for a given column should take place on) */ + for ( i=0, iLen=iCols ; i<iLen ; i++ ) + { + oCol = oSettings.aoColumns[i]; + for ( j=0, jLen=oCol.aDataSort.length ; j<jLen ; j++ ) + { + oCol.aDataSort[j] = aiInvertMapping[ oCol.aDataSort[j] ]; + } + + // Update the column indexes + if ( v110 ) { + oCol.idx = aiInvertMapping[ oCol.idx ]; + } + } + + if ( v110 ) { + // Update 1.10 optimised sort class removal variable + $.each( oSettings.aLastSort, function (i, val) { + oSettings.aLastSort[i].src = aiInvertMapping[ val.src ]; + } ); + } + + /* Update the Get and Set functions for each column */ + for ( i=0, iLen=iCols ; i<iLen ; i++ ) + { + oCol = oSettings.aoColumns[i]; + + if ( typeof oCol.mData == 'number' ) { + oCol.mData = aiInvertMapping[ oCol.mData ]; + + // regenerate the get / set functions + oSettings.oApi._fnColumnOptions( oSettings, i, {} ); + } + else if ( $.isPlainObject( oCol.mData ) ) { + // HTML5 data sourced + attrMap( oCol.mData, '_', aiInvertMapping ); + attrMap( oCol.mData, 'filter', aiInvertMapping ); + attrMap( oCol.mData, 'sort', aiInvertMapping ); + attrMap( oCol.mData, 'type', aiInvertMapping ); + + // regenerate the get / set functions + oSettings.oApi._fnColumnOptions( oSettings, i, {} ); + } + } + + + /* + * Move the DOM elements + */ + if ( oSettings.aoColumns[iFrom].bVisible ) + { + /* Calculate the current visible index and the point to insert the node before. The insert + * before needs to take into account that there might not be an element to insert before, + * in which case it will be null, and an appendChild should be used + */ + var iVisibleIndex = this.oApi._fnColumnIndexToVisible( oSettings, iFrom ); + var iInsertBeforeIndex = null; + + i = iTo < iFrom ? iTo : iTo + 1; + while ( iInsertBeforeIndex === null && i < iCols ) + { + iInsertBeforeIndex = this.oApi._fnColumnIndexToVisible( oSettings, i ); + i++; + } + + /* Header */ + nTrs = oSettings.nTHead.getElementsByTagName('tr'); + for ( i=0, iLen=nTrs.length ; i<iLen ; i++ ) + { + fnDomSwitch( nTrs[i], iVisibleIndex, iInsertBeforeIndex ); + } + + /* Footer */ + if ( oSettings.nTFoot !== null ) + { + nTrs = oSettings.nTFoot.getElementsByTagName('tr'); + for ( i=0, iLen=nTrs.length ; i<iLen ; i++ ) + { + fnDomSwitch( nTrs[i], iVisibleIndex, iInsertBeforeIndex ); + } + } + + /* Body */ + for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ ) + { + if ( oSettings.aoData[i].nTr !== null ) + { + fnDomSwitch( oSettings.aoData[i].nTr, iVisibleIndex, iInsertBeforeIndex ); + } + } + } + + /* + * Move the internal array elements + */ + /* Columns */ + fnArraySwitch( oSettings.aoColumns, iFrom, iTo ); + + /* Search columns */ + fnArraySwitch( oSettings.aoPreSearchCols, iFrom, iTo ); + + /* Array array - internal data anodes cache */ + for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ ) + { + var data = oSettings.aoData[i]; + + if ( v110 ) { + // DataTables 1.10+ + if ( data.anCells ) { + fnArraySwitch( data.anCells, iFrom, iTo ); + } + + // For DOM sourced data, the invalidate will reread the cell into + // the data array, but for data sources as an array, they need to + // be flipped + if ( data.src !== 'dom' && $.isArray( data._aData ) ) { + fnArraySwitch( data._aData, iFrom, iTo ); + } + } + else { + // DataTables 1.9- + if ( $.isArray( data._aData ) ) { + fnArraySwitch( data._aData, iFrom, iTo ); + } + fnArraySwitch( data._anHidden, iFrom, iTo ); + } + } + + /* Reposition the header elements in the header layout array */ + for ( i=0, iLen=oSettings.aoHeader.length ; i<iLen ; i++ ) + { + fnArraySwitch( oSettings.aoHeader[i], iFrom, iTo ); + } + + if ( oSettings.aoFooter !== null ) + { + for ( i=0, iLen=oSettings.aoFooter.length ; i<iLen ; i++ ) + { + fnArraySwitch( oSettings.aoFooter[i], iFrom, iTo ); + } + } + + // In 1.10 we need to invalidate row cached data for sorting, filtering etc + if ( v110 ) { + var api = new $.fn.dataTable.Api( oSettings ); + api.rows().invalidate(); + } + + /* + * Update DataTables' event handlers + */ + + /* Sort listener */ + for ( i=0, iLen=iCols ; i<iLen ; i++ ) + { + $(oSettings.aoColumns[i].nTh).off('click.DT'); + this.oApi._fnSortAttachListener( oSettings, oSettings.aoColumns[i].nTh, i ); + } + + + /* Fire an event so other plug-ins can update */ + $(oSettings.oInstance).trigger( 'column-reorder', [ oSettings, { + "iFrom": iFrom, + "iTo": iTo, + "aiInvertMapping": aiInvertMapping + } ] ); +}; + + +/** + * ColReorder provides column visibility control for DataTables + * @class ColReorder + * @constructor + * @param {object} dt DataTables settings object + * @param {object} opts ColReorder options + */ +var ColReorder = function( dt, opts ) +{ + var oDTSettings; + + if ( $.fn.dataTable.Api ) { + oDTSettings = new $.fn.dataTable.Api( dt ).settings()[0]; + } + // 1.9 compatibility + else if ( dt.fnSettings ) { + // DataTables object, convert to the settings object + oDTSettings = dt.fnSettings(); + } + else if ( typeof dt === 'string' ) { + // jQuery selector + if ( $.fn.dataTable.fnIsDataTable( $(dt)[0] ) ) { + oDTSettings = $(dt).eq(0).dataTable().fnSettings(); + } + } + else if ( dt.nodeName && dt.nodeName.toLowerCase() === 'table' ) { + // Table node + if ( $.fn.dataTable.fnIsDataTable( dt.nodeName ) ) { + oDTSettings = $(dt.nodeName).dataTable().fnSettings(); + } + } + else if ( dt instanceof jQuery ) { + // jQuery object + if ( $.fn.dataTable.fnIsDataTable( dt[0] ) ) { + oDTSettings = dt.eq(0).dataTable().fnSettings(); + } + } + else { + // DataTables settings object + oDTSettings = dt; + } + + // Ensure that we can't initialise on the same table twice + if ( oDTSettings._colReorder ) { + throw "ColReorder already initialised on table #"+oDTSettings.nTable.id; + } + + // Convert from camelCase to Hungarian, just as DataTables does + var camelToHungarian = $.fn.dataTable.camelToHungarian; + if ( camelToHungarian ) { + camelToHungarian( ColReorder.defaults, ColReorder.defaults, true ); + camelToHungarian( ColReorder.defaults, opts || {} ); + } + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Public class variables + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * @namespace Settings object which contains customisable information for ColReorder instance + */ + this.s = { + /** + * DataTables settings object + * @property dt + * @type Object + * @default null + */ + "dt": null, + + /** + * Initialisation object used for this instance + * @property init + * @type object + * @default {} + */ + "init": $.extend( true, {}, ColReorder.defaults, opts ), + + /** + * Number of columns to fix (not allow to be reordered) + * @property fixed + * @type int + * @default 0 + */ + "fixed": 0, + + /** + * Number of columns to fix counting from right (not allow to be reordered) + * @property fixedRight + * @type int + * @default 0 + */ + "fixedRight": 0, + + /** + * Callback function for once the reorder has been done + * @property reorderCallback + * @type function + * @default null + */ + "reorderCallback": null, + + /** + * @namespace Information used for the mouse drag + */ + "mouse": { + "startX": -1, + "startY": -1, + "offsetX": -1, + "offsetY": -1, + "target": -1, + "targetIndex": -1, + "fromIndex": -1 + }, + + /** + * Information which is used for positioning the insert cusor and knowing where to do the + * insert. Array of objects with the properties: + * x: x-axis position + * to: insert point + * @property aoTargets + * @type array + * @default [] + */ + "aoTargets": [] + }; + + + /** + * @namespace Common and useful DOM elements for the class instance + */ + this.dom = { + /** + * Dragging element (the one the mouse is moving) + * @property drag + * @type element + * @default null + */ + "drag": null, + + /** + * The insert cursor + * @property pointer + * @type element + * @default null + */ + "pointer": null + }; + + + /* Constructor logic */ + this.s.dt = oDTSettings; + this.s.dt._colReorder = this; + this._fnConstruct(); + + /* Add destroy callback */ + oDTSettings.oApi._fnCallbackReg(oDTSettings, 'aoDestroyCallback', $.proxy(this._fnDestroy, this), 'ColReorder'); + + return this; +}; + + + +ColReorder.prototype = { + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Public methods + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * Reset the column ordering to the original ordering that was detected on + * start up. + * @return {this} Returns `this` for chaining. + * + * @example + * // DataTables initialisation with ColReorder + * var table = $('#example').dataTable( { + * "sDom": 'Rlfrtip' + * } ); + * + * // Add click event to a button to reset the ordering + * $('#resetOrdering').click( function (e) { + * e.preventDefault(); + * $.fn.dataTable.ColReorder( table ).fnReset(); + * } ); + */ + "fnReset": function () + { + var a = []; + for ( var i=0, iLen=this.s.dt.aoColumns.length ; i<iLen ; i++ ) + { + a.push( this.s.dt.aoColumns[i]._ColReorder_iOrigCol ); + } + + this._fnOrderColumns( a ); + + return this; + }, + + /** + * `Deprecated` - Get the current order of the columns, as an array. + * @return {array} Array of column identifiers + * @deprecated `fnOrder` should be used in preference to this method. + * `fnOrder` acts as a getter/setter. + */ + "fnGetCurrentOrder": function () + { + return this.fnOrder(); + }, + + /** + * Get the current order of the columns, as an array. Note that the values + * given in the array are unique identifiers for each column. Currently + * these are the original ordering of the columns that was detected on + * start up, but this could potentially change in future. + * @return {array} Array of column identifiers + * + * @example + * // Get column ordering for the table + * var order = $.fn.dataTable.ColReorder( dataTable ).fnOrder(); + *//** + * Set the order of the columns, from the positions identified in the + * ordering array given. Note that ColReorder takes a brute force approach + * to reordering, so it is possible multiple reordering events will occur + * before the final order is settled upon. + * @param {array} [set] Array of column identifiers in the new order. Note + * that every column must be included, uniquely, in this array. + * @return {this} Returns `this` for chaining. + * + * @example + * // Swap the first and second columns + * $.fn.dataTable.ColReorder( dataTable ).fnOrder( [1, 0, 2, 3, 4] ); + * + * @example + * // Move the first column to the end for the table `#example` + * var curr = $.fn.dataTable.ColReorder( '#example' ).fnOrder(); + * var first = curr.shift(); + * curr.push( first ); + * $.fn.dataTable.ColReorder( '#example' ).fnOrder( curr ); + * + * @example + * // Reverse the table's order + * $.fn.dataTable.ColReorder( '#example' ).fnOrder( + * $.fn.dataTable.ColReorder( '#example' ).fnOrder().reverse() + * ); + */ + "fnOrder": function ( set ) + { + if ( set === undefined ) + { + var a = []; + for ( var i=0, iLen=this.s.dt.aoColumns.length ; i<iLen ; i++ ) + { + a.push( this.s.dt.aoColumns[i]._ColReorder_iOrigCol ); + } + return a; + } + + this._fnOrderColumns( fnInvertKeyValues( set ) ); + + return this; + }, + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Private methods (they are of course public in JS, but recommended as private) + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * Constructor logic + * @method _fnConstruct + * @returns void + * @private + */ + "_fnConstruct": function () + { + var that = this; + var iLen = this.s.dt.aoColumns.length; + var i; + + /* Columns discounted from reordering - counting left to right */ + if ( this.s.init.iFixedColumns ) + { + this.s.fixed = this.s.init.iFixedColumns; + } + + /* Columns discounted from reordering - counting right to left */ + this.s.fixedRight = this.s.init.iFixedColumnsRight ? + this.s.init.iFixedColumnsRight : + 0; + + /* Drop callback initialisation option */ + if ( this.s.init.fnReorderCallback ) + { + this.s.reorderCallback = this.s.init.fnReorderCallback; + } + + /* Add event handlers for the drag and drop, and also mark the original column order */ + for ( i = 0; i < iLen; i++ ) + { + if ( i > this.s.fixed-1 && i < iLen - this.s.fixedRight ) + { + this._fnMouseListener( i, this.s.dt.aoColumns[i].nTh ); + } + + /* Mark the original column order for later reference */ + this.s.dt.aoColumns[i]._ColReorder_iOrigCol = i; + } + + /* State saving */ + this.s.dt.oApi._fnCallbackReg( this.s.dt, 'aoStateSaveParams', function (oS, oData) { + that._fnStateSave.call( that, oData ); + }, "ColReorder_State" ); + + /* An initial column order has been specified */ + var aiOrder = null; + if ( this.s.init.aiOrder ) + { + aiOrder = this.s.init.aiOrder.slice(); + } + + /* State loading, overrides the column order given */ + if ( this.s.dt.oLoadedState && typeof this.s.dt.oLoadedState.ColReorder != 'undefined' && + this.s.dt.oLoadedState.ColReorder.length == this.s.dt.aoColumns.length ) + { + aiOrder = this.s.dt.oLoadedState.ColReorder; + } + + /* If we have an order to apply - do so */ + if ( aiOrder ) + { + /* We might be called during or after the DataTables initialisation. If before, then we need + * to wait until the draw is done, if after, then do what we need to do right away + */ + if ( !that.s.dt._bInitComplete ) + { + var bDone = false; + this.s.dt.aoDrawCallback.push( { + "fn": function () { + if ( !that.s.dt._bInitComplete && !bDone ) + { + bDone = true; + var resort = fnInvertKeyValues( aiOrder ); + that._fnOrderColumns.call( that, resort ); + } + }, + "sName": "ColReorder_Pre" + } ); + } + else + { + var resort = fnInvertKeyValues( aiOrder ); + that._fnOrderColumns.call( that, resort ); + } + } + else { + this._fnSetColumnIndexes(); + } + }, + + + /** + * Set the column order from an array + * @method _fnOrderColumns + * @param array a An array of integers which dictate the column order that should be applied + * @returns void + * @private + */ + "_fnOrderColumns": function ( a ) + { + if ( a.length != this.s.dt.aoColumns.length ) + { + this.s.dt.oInstance.oApi._fnLog( this.s.dt, 1, "ColReorder - array reorder does not "+ + "match known number of columns. Skipping." ); + return; + } + + for ( var i=0, iLen=a.length ; i<iLen ; i++ ) + { + var currIndex = $.inArray( i, a ); + if ( i != currIndex ) + { + /* Reorder our switching array */ + fnArraySwitch( a, currIndex, i ); + + /* Do the column reorder in the table */ + this.s.dt.oInstance.fnColReorder( currIndex, i ); + } + } + + /* When scrolling we need to recalculate the column sizes to allow for the shift */ + if ( this.s.dt.oScroll.sX !== "" || this.s.dt.oScroll.sY !== "" ) + { + this.s.dt.oInstance.fnAdjustColumnSizing( false ); + } + + /* Save the state */ + this.s.dt.oInstance.oApi._fnSaveState( this.s.dt ); + + this._fnSetColumnIndexes(); + + if ( this.s.reorderCallback !== null ) + { + this.s.reorderCallback.call( this ); + } + }, + + + /** + * Because we change the indexes of columns in the table, relative to their starting point + * we need to reorder the state columns to what they are at the starting point so we can + * then rearrange them again on state load! + * @method _fnStateSave + * @param object oState DataTables state + * @returns string JSON encoded cookie string for DataTables + * @private + */ + "_fnStateSave": function ( oState ) + { + var i, iLen, aCopy, iOrigColumn; + var oSettings = this.s.dt; + var columns = oSettings.aoColumns; + + oState.ColReorder = []; + + /* Sorting */ + if ( oState.aaSorting ) { + // 1.10.0- + for ( i=0 ; i<oState.aaSorting.length ; i++ ) { + oState.aaSorting[i][0] = columns[ oState.aaSorting[i][0] ]._ColReorder_iOrigCol; + } + + var aSearchCopy = $.extend( true, [], oState.aoSearchCols ); + + for ( i=0, iLen=columns.length ; i<iLen ; i++ ) + { + iOrigColumn = columns[i]._ColReorder_iOrigCol; + + /* Column filter */ + oState.aoSearchCols[ iOrigColumn ] = aSearchCopy[i]; + + /* Visibility */ + oState.abVisCols[ iOrigColumn ] = columns[i].bVisible; + + /* Column reordering */ + oState.ColReorder.push( iOrigColumn ); + } + } + else if ( oState.order ) { + // 1.10.1+ + for ( i=0 ; i<oState.order.length ; i++ ) { + oState.order[i][0] = columns[ oState.order[i][0] ]._ColReorder_iOrigCol; + } + + var stateColumnsCopy = $.extend( true, [], oState.columns ); + + for ( i=0, iLen=columns.length ; i<iLen ; i++ ) + { + iOrigColumn = columns[i]._ColReorder_iOrigCol; + + /* Columns */ + oState.columns[ iOrigColumn ] = stateColumnsCopy[i]; + + /* Column reordering */ + oState.ColReorder.push( iOrigColumn ); + } + } + }, + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Mouse drop and drag + */ + + /** + * Add a mouse down listener to a particluar TH element + * @method _fnMouseListener + * @param int i Column index + * @param element nTh TH element clicked on + * @returns void + * @private + */ + "_fnMouseListener": function ( i, nTh ) + { + var that = this; + $(nTh).on( 'mousedown.ColReorder', function (e) { + e.preventDefault(); + that._fnMouseDown.call( that, e, nTh ); + } ); + }, + + + /** + * Mouse down on a TH element in the table header + * @method _fnMouseDown + * @param event e Mouse event + * @param element nTh TH element to be dragged + * @returns void + * @private + */ + "_fnMouseDown": function ( e, nTh ) + { + var that = this; + + /* Store information about the mouse position */ + var target = $(e.target).closest('th, td'); + var offset = target.offset(); + var idx = parseInt( $(nTh).attr('data-column-index'), 10 ); + + if ( idx === undefined ) { + return; + } + + this.s.mouse.startX = e.pageX; + this.s.mouse.startY = e.pageY; + this.s.mouse.offsetX = e.pageX - offset.left; + this.s.mouse.offsetY = e.pageY - offset.top; + this.s.mouse.target = this.s.dt.aoColumns[ idx ].nTh;//target[0]; + this.s.mouse.targetIndex = idx; + this.s.mouse.fromIndex = idx; + + this._fnRegions(); + + /* Add event handlers to the document */ + $(document) + .on( 'mousemove.ColReorder', function (e) { + that._fnMouseMove.call( that, e ); + } ) + .on( 'mouseup.ColReorder', function (e) { + that._fnMouseUp.call( that, e ); + } ); + }, + + + /** + * Deal with a mouse move event while dragging a node + * @method _fnMouseMove + * @param event e Mouse event + * @returns void + * @private + */ + "_fnMouseMove": function ( e ) + { + var that = this; + + if ( this.dom.drag === null ) + { + /* Only create the drag element if the mouse has moved a specific distance from the start + * point - this allows the user to make small mouse movements when sorting and not have a + * possibly confusing drag element showing up + */ + if ( Math.pow( + Math.pow(e.pageX - this.s.mouse.startX, 2) + + Math.pow(e.pageY - this.s.mouse.startY, 2), 0.5 ) < 5 ) + { + return; + } + this._fnCreateDragNode(); + } + + /* Position the element - we respect where in the element the click occured */ + this.dom.drag.css( { + left: e.pageX - this.s.mouse.offsetX, + top: e.pageY - this.s.mouse.offsetY + } ); + + /* Based on the current mouse position, calculate where the insert should go */ + var bSet = false; + var lastToIndex = this.s.mouse.toIndex; + + for ( var i=1, iLen=this.s.aoTargets.length ; i<iLen ; i++ ) + { + if ( e.pageX < this.s.aoTargets[i-1].x + ((this.s.aoTargets[i].x-this.s.aoTargets[i-1].x)/2) ) + { + this.dom.pointer.css( 'left', this.s.aoTargets[i-1].x ); + this.s.mouse.toIndex = this.s.aoTargets[i-1].to; + bSet = true; + break; + } + } + + // The insert element wasn't positioned in the array (less than + // operator), so we put it at the end + if ( !bSet ) + { + this.dom.pointer.css( 'left', this.s.aoTargets[this.s.aoTargets.length-1].x ); + this.s.mouse.toIndex = this.s.aoTargets[this.s.aoTargets.length-1].to; + } + + // Perform reordering if realtime updating is on and the column has moved + if ( this.s.init.bRealtime && lastToIndex !== this.s.mouse.toIndex ) { + this.s.dt.oInstance.fnColReorder( this.s.mouse.fromIndex, this.s.mouse.toIndex ); + this.s.mouse.fromIndex = this.s.mouse.toIndex; + this._fnRegions(); + } + }, + + + /** + * Finish off the mouse drag and insert the column where needed + * @method _fnMouseUp + * @param event e Mouse event + * @returns void + * @private + */ + "_fnMouseUp": function ( e ) + { + var that = this; + + $(document).off( 'mousemove.ColReorder mouseup.ColReorder' ); + + if ( this.dom.drag !== null ) + { + /* Remove the guide elements */ + this.dom.drag.remove(); + this.dom.pointer.remove(); + this.dom.drag = null; + this.dom.pointer = null; + + /* Actually do the reorder */ + this.s.dt.oInstance.fnColReorder( this.s.mouse.fromIndex, this.s.mouse.toIndex ); + this._fnSetColumnIndexes(); + + /* When scrolling we need to recalculate the column sizes to allow for the shift */ + if ( this.s.dt.oScroll.sX !== "" || this.s.dt.oScroll.sY !== "" ) + { + this.s.dt.oInstance.fnAdjustColumnSizing( false ); + } + + /* Save the state */ + this.s.dt.oInstance.oApi._fnSaveState( this.s.dt ); + + if ( this.s.reorderCallback !== null ) + { + this.s.reorderCallback.call( this ); + } + } + }, + + + /** + * Calculate a cached array with the points of the column inserts, and the + * 'to' points + * @method _fnRegions + * @returns void + * @private + */ + "_fnRegions": function () + { + var aoColumns = this.s.dt.aoColumns; + + this.s.aoTargets.splice( 0, this.s.aoTargets.length ); + + this.s.aoTargets.push( { + "x": $(this.s.dt.nTable).offset().left, + "to": 0 + } ); + + var iToPoint = 0; + for ( var i=0, iLen=aoColumns.length ; i<iLen ; i++ ) + { + /* For the column / header in question, we want it's position to remain the same if the + * position is just to it's immediate left or right, so we only incremement the counter for + * other columns + */ + if ( i != this.s.mouse.fromIndex ) + { + iToPoint++; + } + + if ( aoColumns[i].bVisible ) + { + this.s.aoTargets.push( { + "x": $(aoColumns[i].nTh).offset().left + $(aoColumns[i].nTh).outerWidth(), + "to": iToPoint + } ); + } + } + + /* Disallow columns for being reordered by drag and drop, counting right to left */ + if ( this.s.fixedRight !== 0 ) + { + this.s.aoTargets.splice( this.s.aoTargets.length - this.s.fixedRight ); + } + + /* Disallow columns for being reordered by drag and drop, counting left to right */ + if ( this.s.fixed !== 0 ) + { + this.s.aoTargets.splice( 0, this.s.fixed ); + } + }, + + + /** + * Copy the TH element that is being drags so the user has the idea that they are actually + * moving it around the page. + * @method _fnCreateDragNode + * @returns void + * @private + */ + "_fnCreateDragNode": function () + { + var scrolling = this.s.dt.oScroll.sX !== "" || this.s.dt.oScroll.sY !== ""; + + var origCell = this.s.dt.aoColumns[ this.s.mouse.targetIndex ].nTh; + var origTr = origCell.parentNode; + var origThead = origTr.parentNode; + var origTable = origThead.parentNode; + var cloneCell = $(origCell).clone(); + + // This is a slightly odd combination of jQuery and DOM, but it is the + // fastest and least resource intensive way I could think of cloning + // the table with just a single header cell in it. + this.dom.drag = $(origTable.cloneNode(false)) + .addClass( 'DTCR_clonedTable' ) + .append( + $(origThead.cloneNode(false)).append( + $(origTr.cloneNode(false)).append( + cloneCell[0] + ) + ) + ) + .css( { + position: 'absolute', + top: 0, + left: 0, + width: $(origCell).outerWidth(), + height: $(origCell).outerHeight() + } ) + .appendTo( 'body' ); + + this.dom.pointer = $('<div></div>') + .addClass( 'DTCR_pointer' ) + .css( { + position: 'absolute', + top: scrolling ? + $('div.dataTables_scroll', this.s.dt.nTableWrapper).offset().top : + $(this.s.dt.nTable).offset().top, + height : scrolling ? + $('div.dataTables_scroll', this.s.dt.nTableWrapper).height() : + $(this.s.dt.nTable).height() + } ) + .appendTo( 'body' ); + }, + + /** + * Clean up ColReorder memory references and event handlers + * @method _fnDestroy + * @returns void + * @private + */ + "_fnDestroy": function () + { + var i, iLen; + + for ( i=0, iLen=this.s.dt.aoDrawCallback.length ; i<iLen ; i++ ) + { + if ( this.s.dt.aoDrawCallback[i].sName === 'ColReorder_Pre' ) + { + this.s.dt.aoDrawCallback.splice( i, 1 ); + break; + } + } + + $(this.s.dt.nTHead).find( '*' ).off( '.ColReorder' ); + + $.each( this.s.dt.aoColumns, function (i, column) { + $(column.nTh).removeAttr('data-column-index'); + } ); + + this.s.dt._colReorder = null; + this.s = null; + }, + + + /** + * Add a data attribute to the column headers, so we know the index of + * the row to be reordered. This allows fast detection of the index, and + * for this plug-in to work with FixedHeader which clones the nodes. + * @private + */ + "_fnSetColumnIndexes": function () + { + $.each( this.s.dt.aoColumns, function (i, column) { + $(column.nTh).attr('data-column-index', i); + } ); + } +}; + + + + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Static parameters + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + +/** + * ColReorder default settings for initialisation + * @namespace + * @static + */ +ColReorder.defaults = { + /** + * Predefined ordering for the columns that will be applied automatically + * on initialisation. If not specified then the order that the columns are + * found to be in the HTML is the order used. + * @type array + * @default null + * @static + * @example + * // Using the `oColReorder` option in the DataTables options object + * $('#example').dataTable( { + * "sDom": 'Rlfrtip', + * "oColReorder": { + * "aiOrder": [ 4, 3, 2, 1, 0 ] + * } + * } ); + * + * @example + * // Using `new` constructor + * $('#example').dataTable() + * + * new $.fn.dataTable.ColReorder( '#example', { + * "aiOrder": [ 4, 3, 2, 1, 0 ] + * } ); + */ + aiOrder: null, + + /** + * Redraw the table's column ordering as the end user draws the column + * (`true`) or wait until the mouse is released (`false` - default). Note + * that this will perform a redraw on each reordering, which involves an + * Ajax request each time if you are using server-side processing in + * DataTables. + * @type boolean + * @default false + * @static + * @example + * // Using the `oColReorder` option in the DataTables options object + * $('#example').dataTable( { + * "sDom": 'Rlfrtip', + * "oColReorder": { + * "bRealtime": true + * } + * } ); + * + * @example + * // Using `new` constructor + * $('#example').dataTable() + * + * new $.fn.dataTable.ColReorder( '#example', { + * "bRealtime": true + * } ); + */ + bRealtime: false, + + /** + * Indicate how many columns should be fixed in position (counting from the + * left). This will typically be 1 if used, but can be as high as you like. + * @type int + * @default 0 + * @static + * @example + * // Using the `oColReorder` option in the DataTables options object + * $('#example').dataTable( { + * "sDom": 'Rlfrtip', + * "oColReorder": { + * "iFixedColumns": 1 + * } + * } ); + * + * @example + * // Using `new` constructor + * $('#example').dataTable() + * + * new $.fn.dataTable.ColReorder( '#example', { + * "iFixedColumns": 1 + * } ); + */ + iFixedColumns: 0, + + /** + * As `iFixedColumnsRight` but counting from the right. + * @type int + * @default 0 + * @static + * @example + * // Using the `oColReorder` option in the DataTables options object + * $('#example').dataTable( { + * "sDom": 'Rlfrtip', + * "oColReorder": { + * "iFixedColumnsRight": 1 + * } + * } ); + * + * @example + * // Using `new` constructor + * $('#example').dataTable() + * + * new $.fn.dataTable.ColReorder( '#example', { + * "iFixedColumnsRight": 1 + * } ); + */ + iFixedColumnsRight: 0, + + /** + * Callback function that is fired when columns are reordered + * @type function():void + * @default null + * @static + * @example + * // Using the `oColReorder` option in the DataTables options object + * $('#example').dataTable( { + * "sDom": 'Rlfrtip', + * "oColReorder": { + * "fnReorderCallback": function () { + * alert( 'Columns reordered' ); + * } + * } + * } ); + * + * @example + * // Using `new` constructor + * $('#example').dataTable() + * + * new $.fn.dataTable.ColReorder( '#example', { + * "fnReorderCallback": function () { + * alert( 'Columns reordered' ); + * } + * } ); + */ + fnReorderCallback: null +}; + + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Constants + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** + * ColReorder version + * @constant version + * @type String + * @default As code + */ +ColReorder.version = "1.1.3"; + + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * DataTables interfaces + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +// Expose +$.fn.dataTable.ColReorder = ColReorder; +$.fn.DataTable.ColReorder = ColReorder; + + +// Register a new feature with DataTables +if ( typeof $.fn.dataTable == "function" && + typeof $.fn.dataTableExt.fnVersionCheck == "function" && + $.fn.dataTableExt.fnVersionCheck('1.9.3') ) +{ + $.fn.dataTableExt.aoFeatures.push( { + "fnInit": function( settings ) { + var table = settings.oInstance; + + if ( ! settings._colReorder ) { + var dtInit = settings.oInit; + var opts = dtInit.colReorder || dtInit.oColReorder || {}; + + new ColReorder( settings, opts ); + } + else { + table.oApi._fnLog( settings, 1, "ColReorder attempted to initialise twice. Ignoring second" ); + } + + return null; /* No node for DataTables to insert */ + }, + "cFeature": "R", + "sFeature": "ColReorder" + } ); +} +else { + alert( "Warning: ColReorder requires DataTables 1.9.3 or greater - www.datatables.net/download"); +} + + +// API augmentation +if ( $.fn.dataTable.Api ) { + $.fn.dataTable.Api.register( 'colReorder.reset()', function () { + return this.iterator( 'table', function ( ctx ) { + ctx._colReorder.fnReset(); + } ); + } ); + + $.fn.dataTable.Api.register( 'colReorder.order()', function ( set ) { + if ( set ) { + return this.iterator( 'table', function ( ctx ) { + ctx._colReorder.fnOrder( set ); + } ); + } + + return this.context.length ? + this.context[0]._colReorder.fnOrder() : + null; + } ); +} + +return ColReorder; +}; // /factory + + +// Define as an AMD module if possible +if ( typeof define === 'function' && define.amd ) { + define( ['jquery', 'datatables'], factory ); +} +else if ( typeof exports === 'object' ) { + // Node/CommonJS + factory( require('jquery'), require('datatables') ); +} +else if ( jQuery && !jQuery.fn.dataTable.ColReorder ) { + // Otherwise simply initialise as normal, stopping multiple evaluation + factory( jQuery, jQuery.fn.dataTable ); +} + + +})(window, document); diff --git a/theme/bootstrap/plugins/datatables/extensions/ColReorder/js/dataTables.colReorder.min.js b/theme/bootstrap/plugins/datatables/extensions/ColReorder/js/dataTables.colReorder.min.js new file mode 100644 index 0000000..b8758c9 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColReorder/js/dataTables.colReorder.min.js @@ -0,0 +1,26 @@ +/*! + ColReorder 1.1.3 + ©2010-2014 SpryMedia Ltd - datatables.net/license +*/ +(function(o,r,s){function p(d){for(var f=[],a=0,b=d.length;a<b;a++)f[d[a]]=a;return f}function l(d,f,a){f=d.splice(f,1)[0];d.splice(a,0,f)}function q(d,f,a){for(var b=[],e=0,h=d.childNodes.length;e<h;e++)1==d.childNodes[e].nodeType&&b.push(d.childNodes[e]);f=b[f];null!==a?d.insertBefore(f,b[a]):d.appendChild(f)}o=function(d){d.fn.dataTableExt.oApi.fnColReorder=function(a,b,e){var h=d.fn.dataTable.Api?!0:!1,c,g,f,m,n=a.aoColumns.length,i,j;i=function(a,b,c){if(a[b]){var e=a[b].split("."),d=e.shift(); +isNaN(1*d)||(a[b]=c[1*d]+"."+e.join("."))}};if(b!=e)if(0>b||b>=n)this.oApi._fnLog(a,1,"ColReorder 'from' index is out of bounds: "+b);else if(0>e||e>=n)this.oApi._fnLog(a,1,"ColReorder 'to' index is out of bounds: "+e);else{f=[];c=0;for(g=n;c<g;c++)f[c]=c;l(f,b,e);var k=p(f);c=0;for(g=a.aaSorting.length;c<g;c++)a.aaSorting[c][0]=k[a.aaSorting[c][0]];if(null!==a.aaSortingFixed){c=0;for(g=a.aaSortingFixed.length;c<g;c++)a.aaSortingFixed[c][0]=k[a.aaSortingFixed[c][0]]}c=0;for(g=n;c<g;c++){j=a.aoColumns[c]; +f=0;for(m=j.aDataSort.length;f<m;f++)j.aDataSort[f]=k[j.aDataSort[f]];h&&(j.idx=k[j.idx])}h&&d.each(a.aLastSort,function(b,c){a.aLastSort[b].src=k[c.src]});c=0;for(g=n;c<g;c++)j=a.aoColumns[c],"number"==typeof j.mData?(j.mData=k[j.mData],a.oApi._fnColumnOptions(a,c,{})):d.isPlainObject(j.mData)&&(i(j.mData,"_",k),i(j.mData,"filter",k),i(j.mData,"sort",k),i(j.mData,"type",k),a.oApi._fnColumnOptions(a,c,{}));if(a.aoColumns[b].bVisible){f=this.oApi._fnColumnIndexToVisible(a,b);m=null;for(c=e<b?e:e+1;null=== +m&&c<n;)m=this.oApi._fnColumnIndexToVisible(a,c),c++;i=a.nTHead.getElementsByTagName("tr");c=0;for(g=i.length;c<g;c++)q(i[c],f,m);if(null!==a.nTFoot){i=a.nTFoot.getElementsByTagName("tr");c=0;for(g=i.length;c<g;c++)q(i[c],f,m)}c=0;for(g=a.aoData.length;c<g;c++)null!==a.aoData[c].nTr&&q(a.aoData[c].nTr,f,m)}l(a.aoColumns,b,e);l(a.aoPreSearchCols,b,e);c=0;for(g=a.aoData.length;c<g;c++)i=a.aoData[c],h?(i.anCells&&l(i.anCells,b,e),"dom"!==i.src&&d.isArray(i._aData)&&l(i._aData,b,e)):(d.isArray(i._aData)&& +l(i._aData,b,e),l(i._anHidden,b,e));c=0;for(g=a.aoHeader.length;c<g;c++)l(a.aoHeader[c],b,e);if(null!==a.aoFooter){c=0;for(g=a.aoFooter.length;c<g;c++)l(a.aoFooter[c],b,e)}h&&(new d.fn.dataTable.Api(a)).rows().invalidate();c=0;for(g=n;c<g;c++)d(a.aoColumns[c].nTh).off("click.DT"),this.oApi._fnSortAttachListener(a,a.aoColumns[c].nTh,c);d(a.oInstance).trigger("column-reorder",[a,{iFrom:b,iTo:e,aiInvertMapping:k}])}};var f=function(a,b){var e;d.fn.dataTable.Api?e=(new d.fn.dataTable.Api(a)).settings()[0]: +a.fnSettings?e=a.fnSettings():"string"===typeof a?d.fn.dataTable.fnIsDataTable(d(a)[0])&&(e=d(a).eq(0).dataTable().fnSettings()):a.nodeName&&"table"===a.nodeName.toLowerCase()?d.fn.dataTable.fnIsDataTable(a.nodeName)&&(e=d(a.nodeName).dataTable().fnSettings()):a instanceof jQuery?d.fn.dataTable.fnIsDataTable(a[0])&&(e=a.eq(0).dataTable().fnSettings()):e=a;if(e._colReorder)throw"ColReorder already initialised on table #"+e.nTable.id;var h=d.fn.dataTable.camelToHungarian;h&&(h(f.defaults,f.defaults, +!0),h(f.defaults,b||{}));this.s={dt:null,init:d.extend(!0,{},f.defaults,b),fixed:0,fixedRight:0,reorderCallback:null,mouse:{startX:-1,startY:-1,offsetX:-1,offsetY:-1,target:-1,targetIndex:-1,fromIndex:-1},aoTargets:[]};this.dom={drag:null,pointer:null};this.s.dt=e;this.s.dt._colReorder=this;this._fnConstruct();e.oApi._fnCallbackReg(e,"aoDestroyCallback",d.proxy(this._fnDestroy,this),"ColReorder");return this};f.prototype={fnReset:function(){for(var a=[],b=0,e=this.s.dt.aoColumns.length;b<e;b++)a.push(this.s.dt.aoColumns[b]._ColReorder_iOrigCol); +this._fnOrderColumns(a);return this},fnGetCurrentOrder:function(){return this.fnOrder()},fnOrder:function(a){if(a===s){for(var a=[],b=0,e=this.s.dt.aoColumns.length;b<e;b++)a.push(this.s.dt.aoColumns[b]._ColReorder_iOrigCol);return a}this._fnOrderColumns(p(a));return this},_fnConstruct:function(){var a=this,b=this.s.dt.aoColumns.length,e;this.s.init.iFixedColumns&&(this.s.fixed=this.s.init.iFixedColumns);this.s.fixedRight=this.s.init.iFixedColumnsRight?this.s.init.iFixedColumnsRight:0;this.s.init.fnReorderCallback&& +(this.s.reorderCallback=this.s.init.fnReorderCallback);for(e=0;e<b;e++)e>this.s.fixed-1&&e<b-this.s.fixedRight&&this._fnMouseListener(e,this.s.dt.aoColumns[e].nTh),this.s.dt.aoColumns[e]._ColReorder_iOrigCol=e;this.s.dt.oApi._fnCallbackReg(this.s.dt,"aoStateSaveParams",function(b,c){a._fnStateSave.call(a,c)},"ColReorder_State");var d=null;this.s.init.aiOrder&&(d=this.s.init.aiOrder.slice());this.s.dt.oLoadedState&&("undefined"!=typeof this.s.dt.oLoadedState.ColReorder&&this.s.dt.oLoadedState.ColReorder.length== +this.s.dt.aoColumns.length)&&(d=this.s.dt.oLoadedState.ColReorder);if(d)if(a.s.dt._bInitComplete)b=p(d),a._fnOrderColumns.call(a,b);else{var c=!1;this.s.dt.aoDrawCallback.push({fn:function(){if(!a.s.dt._bInitComplete&&!c){c=true;var b=p(d);a._fnOrderColumns.call(a,b)}},sName:"ColReorder_Pre"})}else this._fnSetColumnIndexes()},_fnOrderColumns:function(a){if(a.length!=this.s.dt.aoColumns.length)this.s.dt.oInstance.oApi._fnLog(this.s.dt,1,"ColReorder - array reorder does not match known number of columns. Skipping."); +else{for(var b=0,e=a.length;b<e;b++){var h=d.inArray(b,a);b!=h&&(l(a,h,b),this.s.dt.oInstance.fnColReorder(h,b))}(""!==this.s.dt.oScroll.sX||""!==this.s.dt.oScroll.sY)&&this.s.dt.oInstance.fnAdjustColumnSizing(!1);this.s.dt.oInstance.oApi._fnSaveState(this.s.dt);this._fnSetColumnIndexes();null!==this.s.reorderCallback&&this.s.reorderCallback.call(this)}},_fnStateSave:function(a){var b,e,h,c=this.s.dt.aoColumns;a.ColReorder=[];if(a.aaSorting){for(b=0;b<a.aaSorting.length;b++)a.aaSorting[b][0]=c[a.aaSorting[b][0]]._ColReorder_iOrigCol; +var f=d.extend(!0,[],a.aoSearchCols);b=0;for(e=c.length;b<e;b++)h=c[b]._ColReorder_iOrigCol,a.aoSearchCols[h]=f[b],a.abVisCols[h]=c[b].bVisible,a.ColReorder.push(h)}else if(a.order){for(b=0;b<a.order.length;b++)a.order[b][0]=c[a.order[b][0]]._ColReorder_iOrigCol;f=d.extend(!0,[],a.columns);b=0;for(e=c.length;b<e;b++)h=c[b]._ColReorder_iOrigCol,a.columns[h]=f[b],a.ColReorder.push(h)}},_fnMouseListener:function(a,b){var e=this;d(b).on("mousedown.ColReorder",function(a){a.preventDefault();e._fnMouseDown.call(e, +a,b)})},_fnMouseDown:function(a,b){var e=this,f=d(a.target).closest("th, td").offset(),c=parseInt(d(b).attr("data-column-index"),10);c!==s&&(this.s.mouse.startX=a.pageX,this.s.mouse.startY=a.pageY,this.s.mouse.offsetX=a.pageX-f.left,this.s.mouse.offsetY=a.pageY-f.top,this.s.mouse.target=this.s.dt.aoColumns[c].nTh,this.s.mouse.targetIndex=c,this.s.mouse.fromIndex=c,this._fnRegions(),d(r).on("mousemove.ColReorder",function(a){e._fnMouseMove.call(e,a)}).on("mouseup.ColReorder",function(a){e._fnMouseUp.call(e, +a)}))},_fnMouseMove:function(a){if(null===this.dom.drag){if(5>Math.pow(Math.pow(a.pageX-this.s.mouse.startX,2)+Math.pow(a.pageY-this.s.mouse.startY,2),0.5))return;this._fnCreateDragNode()}this.dom.drag.css({left:a.pageX-this.s.mouse.offsetX,top:a.pageY-this.s.mouse.offsetY});for(var b=!1,e=this.s.mouse.toIndex,d=1,c=this.s.aoTargets.length;d<c;d++)if(a.pageX<this.s.aoTargets[d-1].x+(this.s.aoTargets[d].x-this.s.aoTargets[d-1].x)/2){this.dom.pointer.css("left",this.s.aoTargets[d-1].x);this.s.mouse.toIndex= +this.s.aoTargets[d-1].to;b=!0;break}b||(this.dom.pointer.css("left",this.s.aoTargets[this.s.aoTargets.length-1].x),this.s.mouse.toIndex=this.s.aoTargets[this.s.aoTargets.length-1].to);this.s.init.bRealtime&&e!==this.s.mouse.toIndex&&(this.s.dt.oInstance.fnColReorder(this.s.mouse.fromIndex,this.s.mouse.toIndex),this.s.mouse.fromIndex=this.s.mouse.toIndex,this._fnRegions())},_fnMouseUp:function(){d(r).off("mousemove.ColReorder mouseup.ColReorder");null!==this.dom.drag&&(this.dom.drag.remove(),this.dom.pointer.remove(), +this.dom.drag=null,this.dom.pointer=null,this.s.dt.oInstance.fnColReorder(this.s.mouse.fromIndex,this.s.mouse.toIndex),this._fnSetColumnIndexes(),(""!==this.s.dt.oScroll.sX||""!==this.s.dt.oScroll.sY)&&this.s.dt.oInstance.fnAdjustColumnSizing(!1),this.s.dt.oInstance.oApi._fnSaveState(this.s.dt),null!==this.s.reorderCallback&&this.s.reorderCallback.call(this))},_fnRegions:function(){var a=this.s.dt.aoColumns;this.s.aoTargets.splice(0,this.s.aoTargets.length);this.s.aoTargets.push({x:d(this.s.dt.nTable).offset().left, +to:0});for(var b=0,e=0,f=a.length;e<f;e++)e!=this.s.mouse.fromIndex&&b++,a[e].bVisible&&this.s.aoTargets.push({x:d(a[e].nTh).offset().left+d(a[e].nTh).outerWidth(),to:b});0!==this.s.fixedRight&&this.s.aoTargets.splice(this.s.aoTargets.length-this.s.fixedRight);0!==this.s.fixed&&this.s.aoTargets.splice(0,this.s.fixed)},_fnCreateDragNode:function(){var a=""!==this.s.dt.oScroll.sX||""!==this.s.dt.oScroll.sY,b=this.s.dt.aoColumns[this.s.mouse.targetIndex].nTh,e=b.parentNode,f=e.parentNode,c=f.parentNode, +g=d(b).clone();this.dom.drag=d(c.cloneNode(!1)).addClass("DTCR_clonedTable").append(d(f.cloneNode(!1)).append(d(e.cloneNode(!1)).append(g[0]))).css({position:"absolute",top:0,left:0,width:d(b).outerWidth(),height:d(b).outerHeight()}).appendTo("body");this.dom.pointer=d("<div></div>").addClass("DTCR_pointer").css({position:"absolute",top:a?d("div.dataTables_scroll",this.s.dt.nTableWrapper).offset().top:d(this.s.dt.nTable).offset().top,height:a?d("div.dataTables_scroll",this.s.dt.nTableWrapper).height(): +d(this.s.dt.nTable).height()}).appendTo("body")},_fnDestroy:function(){var a,b;a=0;for(b=this.s.dt.aoDrawCallback.length;a<b;a++)if("ColReorder_Pre"===this.s.dt.aoDrawCallback[a].sName){this.s.dt.aoDrawCallback.splice(a,1);break}d(this.s.dt.nTHead).find("*").off(".ColReorder");d.each(this.s.dt.aoColumns,function(a,b){d(b.nTh).removeAttr("data-column-index")});this.s=this.s.dt._colReorder=null},_fnSetColumnIndexes:function(){d.each(this.s.dt.aoColumns,function(a,b){d(b.nTh).attr("data-column-index", +a)})}};f.defaults={aiOrder:null,bRealtime:!1,iFixedColumns:0,iFixedColumnsRight:0,fnReorderCallback:null};f.version="1.1.3";d.fn.dataTable.ColReorder=f;d.fn.DataTable.ColReorder=f;"function"==typeof d.fn.dataTable&&"function"==typeof d.fn.dataTableExt.fnVersionCheck&&d.fn.dataTableExt.fnVersionCheck("1.9.3")?d.fn.dataTableExt.aoFeatures.push({fnInit:function(a){var b=a.oInstance;a._colReorder?b.oApi._fnLog(a,1,"ColReorder attempted to initialise twice. Ignoring second"):(b=a.oInit,new f(a,b.colReorder|| +b.oColReorder||{}));return null},cFeature:"R",sFeature:"ColReorder"}):alert("Warning: ColReorder requires DataTables 1.9.3 or greater - www.datatables.net/download");d.fn.dataTable.Api&&(d.fn.dataTable.Api.register("colReorder.reset()",function(){return this.iterator("table",function(a){a._colReorder.fnReset()})}),d.fn.dataTable.Api.register("colReorder.order()",function(a){return a?this.iterator("table",function(b){b._colReorder.fnOrder(a)}):this.context.length?this.context[0]._colReorder.fnOrder(): +null}));return f};"function"===typeof define&&define.amd?define(["jquery","datatables"],o):"object"===typeof exports?o(require("jquery"),require("datatables")):jQuery&&!jQuery.fn.dataTable.ColReorder&&o(jQuery,jQuery.fn.dataTable)})(window,document); diff --git a/theme/bootstrap/plugins/datatables/extensions/ColVis/License.txt b/theme/bootstrap/plugins/datatables/extensions/ColVis/License.txt new file mode 100644 index 0000000..9ade2f1 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColVis/License.txt @@ -0,0 +1,20 @@ +Copyright (c) 2010-2015 SpryMedia Limited +http://datatables.net + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/theme/bootstrap/plugins/datatables/extensions/ColVis/Readme.md b/theme/bootstrap/plugins/datatables/extensions/ColVis/Readme.md new file mode 100644 index 0000000..62f432d --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColVis/Readme.md @@ -0,0 +1,38 @@ +# ColVis + +ColVis adds a button to the toolbars around DataTables which gives the end user of the table the ability to dynamically change the visibility of the columns in the table: + +* Dynamically show and hide columns in a table +* Very easy integration with DataTables +* Ability to exclude columns from being either hidden or shown +* Save saving integration with DataTables + + +# Installation + +To use ColVis, first download DataTables ( http://datatables.net/download ) and place the unzipped ColVis package into a `extensions` directory in the DataTables package. This will allow the pages in the examples to operate correctly. To see the examples running, open the `examples` directory in your web-browser. + + +# Basic usage + +ColVis is initialised using the `C` option that it adds to DataTables' `dom` option. For example: + +```js +$(document).ready( function () { + $('#example').dataTable( { + "dom": 'C<"clear">lfrtip' + } ); +} ); +``` + + +# Documentation / support + +* Documentation: http://datatables.net/extensions/colvis/ +* DataTables support forums: http://datatables.net/forums + + +# GitHub + +If you fancy getting involved with the development of ColVis and help make it better, please refer to its GitHub repo: https://github.com/DataTables/ColVis + diff --git a/theme/bootstrap/plugins/datatables/extensions/ColVis/css/dataTables.colVis.css b/theme/bootstrap/plugins/datatables/extensions/ColVis/css/dataTables.colVis.css new file mode 100644 index 0000000..51f546d --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColVis/css/dataTables.colVis.css @@ -0,0 +1,185 @@ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * ColVis styles + */ +div.ColVis { + float: right; + margin-bottom: 1em; +} + +button.ColVis_Button, +ul.ColVis_collection li { + position: relative; + float: left; + margin-right: 3px; + padding: 5px 8px; + border: 1px solid #999; + cursor: pointer; + *cursor: hand; + font-size: 0.88em; + color: black !important; + white-space: nowrap; + + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -ms-border-radius: 2px; + -o-border-radius: 2px; + border-radius: 2px; + + -webkit-box-shadow: 1px 1px 3px #ccc; + -moz-box-shadow: 1px 1px 3px #ccc; + -ms-box-shadow: 1px 1px 3px #ccc; + -o-box-shadow: 1px 1px 3px #ccc; + box-shadow: 1px 1px 3px #ccc; + + /* Generated by http://www.colorzilla.com/gradient-editor/ */ + background: #ffffff; /* Old browsers */ + background: -webkit-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* FF3.6+ */ + background: -ms-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* IE10+ */ + background: -o-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Opera 11.10+ */ + background: linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 ); /* IE6-9 */ +} + +.ColVis_Button:hover, +ul.ColVis_collection li:hover { + border: 1px solid #666; + text-decoration: none !important; + + -webkit-box-shadow: 1px 1px 3px #999; + -moz-box-shadow: 1px 1px 3px #999; + -ms-box-shadow: 1px 1px 3px #999; + -o-box-shadow: 1px 1px 3px #999; + box-shadow: 1px 1px 3px #999; + + background: #f3f3f3; /* Old browsers */ + background: -webkit-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* FF3.6+ */ + background: -ms-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* IE10+ */ + background: -o-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* Opera 11.10+ */ + background: linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f3f3f3', endColorstr='#f4f4f4',GradientType=0 ); /* IE6-9 */ +} + +button.ColVis_Button { + height: 30px; + padding: 3px 8px; +} + +button.ColVis_Button::-moz-focus-inner { + border: none !important; + padding: 0; +} + +button.ColVis_Button:active { + outline: none; +} + + +div.ColVis_collectionBackground { + position: fixed; + top: 0; + left: 0; + height: 100%; + width: 100%; + background-color: black; + z-index: 1100; +} + +ul.ColVis_collection { + list-style: none; + width: 150px; + padding: 8px 8px 4px 8px; + margin: 0; + border: 1px solid #ccc; + border: 1px solid rgba( 0, 0, 0, 0.4 ); + background-color: #f3f3f3; + background-color: rgba( 255, 255, 255, 0.3 ); + overflow: hidden; + z-index: 2002; + + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; + border-radius: 5px; + + -webkit-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); + -ms-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); + -o-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); + box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); +} + +ul.ColVis_collection li { + position: relative; + height: auto; + left: 0; + right: 0; + padding: 0.5em; + + display: block; + float: none; + margin-bottom: 4px; + + -webkit-box-shadow: 1px 1px 3px #999; + -moz-box-shadow: 1px 1px 3px #999; + -ms-box-shadow: 1px 1px 3px #999; + -o-box-shadow: 1px 1px 3px #999; + box-shadow: 1px 1px 3px #999; +} + +ul.ColVis_collection li { + text-align: left; +} + +ul.ColVis_collection li.ColVis_Button:hover { + border: 1px solid #999; + background-color: #f0f0f0; +} + +ul.ColVis_collection li span { + display: inline-block; + padding-left: 0.5em; + cursor: pointer; +} + + +ul.ColVis_collection li.ColVis_Special { + border-color: #555; + background: rgb(237,237,237); /* Old browsers */ + background: -webkit-linear-gradient(top, rgba(237,237,237,1) 0%,rgba(214,214,214,1) 77%,rgba(232,232,232,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, rgba(237,237,237,1) 0%, rgba(214,214,214,1) 77%, rgba(232,232,232,1) 100%); /* FF3.6+ */ + background: -ms-linear-gradient(top, rgba(237,237,237,1) 0%,rgba(214,214,214,1) 77%,rgba(232,232,232,1) 100%); /* IE10+ */ + background: -o-linear-gradient(top, rgba(237,237,237,1) 0%,rgba(214,214,214,1) 77%,rgba(232,232,232,1) 100%); /* Opera 11.10+ */ + background: linear-gradient(to bottom, rgba(237,237,237,1) 0%,rgba(214,214,214,1) 77%,rgba(232,232,232,1) 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ededed', endColorstr='#e8e8e8',GradientType=0 ); /* IE6-9 */ +} + +ul.ColVis_collection li.ColVis_Special:hover { + background: #e2e2e2; /* Old browsers */ + background: -webkit-linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* FF3.6+ */ + background: -ms-linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* IE10+ */ + background: -o-linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* Opera 11.10+ */ + background: linear-gradient(top, #d0d0d0 0%,#d5d5d5 89%,#e2e2e2 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f3f3f3', endColorstr='#e2e2e2',GradientType=0 ); /* IE6-9 */ +} + + +span.ColVis_radio { + display: inline-block; + width: 20px; +} + +div.ColVis_catcher { + position: absolute; + z-index: 1101; +} + +.disabled { + color: #999; +} + + diff --git a/theme/bootstrap/plugins/datatables/extensions/ColVis/css/dataTables.colVis.min.css b/theme/bootstrap/plugins/datatables/extensions/ColVis/css/dataTables.colVis.min.css new file mode 100644 index 0000000..00ab37d --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColVis/css/dataTables.colVis.min.css @@ -0,0 +1 @@ +div.ColVis{float:right;margin-bottom:1em}button.ColVis_Button,ul.ColVis_collection li{position:relative;float:left;margin-right:3px;padding:5px 8px;border:1px solid #999;cursor:pointer;*cursor:hand;font-size:0.88em;color:black !important;white-space:nowrap;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:1px 1px 3px #ccc;-moz-box-shadow:1px 1px 3px #ccc;-ms-box-shadow:1px 1px 3px #ccc;-o-box-shadow:1px 1px 3px #ccc;box-shadow:1px 1px 3px #ccc;background:#ffffff;background:-webkit-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-moz-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-ms-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-o-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 )}.ColVis_Button:hover,ul.ColVis_collection li:hover{border:1px solid #666;text-decoration:none !important;-webkit-box-shadow:1px 1px 3px #999;-moz-box-shadow:1px 1px 3px #999;-ms-box-shadow:1px 1px 3px #999;-o-box-shadow:1px 1px 3px #999;box-shadow:1px 1px 3px #999;background:#f3f3f3;background:-webkit-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:-moz-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:-ms-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:-o-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3f3f3', endColorstr='#f4f4f4',GradientType=0 )}button.ColVis_Button{height:30px;padding:3px 8px}button.ColVis_Button::-moz-focus-inner{border:none !important;padding:0}button.ColVis_Button:active{outline:none}div.ColVis_collectionBackground{position:fixed;top:0;left:0;height:100%;width:100%;background-color:black;z-index:1100}ul.ColVis_collection{list-style:none;width:150px;padding:8px 8px 4px 8px;margin:0;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.4);background-color:#f3f3f3;background-color:rgba(255,255,255,0.3);overflow:hidden;z-index:2002;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px;-webkit-box-shadow:3px 3px 5px rgba(0,0,0,0.3);-moz-box-shadow:3px 3px 5px rgba(0,0,0,0.3);-ms-box-shadow:3px 3px 5px rgba(0,0,0,0.3);-o-box-shadow:3px 3px 5px rgba(0,0,0,0.3);box-shadow:3px 3px 5px rgba(0,0,0,0.3)}ul.ColVis_collection li{position:relative;height:auto;left:0;right:0;padding:0.5em;display:block;float:none;margin-bottom:4px;-webkit-box-shadow:1px 1px 3px #999;-moz-box-shadow:1px 1px 3px #999;-ms-box-shadow:1px 1px 3px #999;-o-box-shadow:1px 1px 3px #999;box-shadow:1px 1px 3px #999}ul.ColVis_collection li{text-align:left}ul.ColVis_collection li.ColVis_Button:hover{border:1px solid #999;background-color:#f0f0f0}ul.ColVis_collection li span{display:inline-block;padding-left:0.5em;cursor:pointer}ul.ColVis_collection li.ColVis_Special{border-color:#555;background:#ededed;background:-webkit-linear-gradient(top, #ededed 0%, #d6d6d6 77%, #e8e8e8 100%);background:-moz-linear-gradient(top, #ededed 0%, #d6d6d6 77%, #e8e8e8 100%);background:-ms-linear-gradient(top, #ededed 0%, #d6d6d6 77%, #e8e8e8 100%);background:-o-linear-gradient(top, #ededed 0%, #d6d6d6 77%, #e8e8e8 100%);background:linear-gradient(to bottom, #ededed 0%, #d6d6d6 77%, #e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed', endColorstr='#e8e8e8',GradientType=0 )}ul.ColVis_collection li.ColVis_Special:hover{background:#e2e2e2;background:-webkit-linear-gradient(top, #d0d0d0 0%, #d5d5d5 89%, #e2e2e2 100%);background:-moz-linear-gradient(top, #d0d0d0 0%, #d5d5d5 89%, #e2e2e2 100%);background:-ms-linear-gradient(top, #d0d0d0 0%, #d5d5d5 89%, #e2e2e2 100%);background:-o-linear-gradient(top, #d0d0d0 0%, #d5d5d5 89%, #e2e2e2 100%);background:linear-gradient(top, #d0d0d0 0%, #d5d5d5 89%, #e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3f3f3', endColorstr='#e2e2e2',GradientType=0 )}span.ColVis_radio{display:inline-block;width:20px}div.ColVis_catcher{position:absolute;z-index:1101}.disabled{color:#999} diff --git a/theme/bootstrap/plugins/datatables/extensions/ColVis/css/dataTables.colvis.jqueryui.css b/theme/bootstrap/plugins/datatables/extensions/ColVis/css/dataTables.colvis.jqueryui.css new file mode 100644 index 0000000..0cdf0ba --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColVis/css/dataTables.colvis.jqueryui.css @@ -0,0 +1,41 @@ + +button.ColVis_Button, +ul.ColVis_collection li { + padding: 0.5em; +} + +ul.ColVis_collection { + margin: 0; + padding: 0; + overflow: hidden; + z-index: 2002; +} + +ul.ColVis_collection li { + clear: both; + display: block; + text-align: left; + margin: -1px 0 0 0; +} + +ul.ColVis_collection li span { + display: inline-block; + padding-left: 0.5em; + cursor: pointer; +} + +div.ColVis_collectionBackground { + position: fixed; + top: 0; + left: 0; + height: 100%; + width: 100%; + background-color: black; + z-index: 1100; +} + + +div.ColVis_catcher { + position: absolute; + z-index: 1101; +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/button_order.html b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/button_order.html new file mode 100644 index 0000000..1dffef9 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/button_order.html @@ -0,0 +1,630 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColVis example - Button ordering</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colVis.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + dom: 'C<"clear">lfrtip', + colVis: { + order: 'alpha' + } + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColVis example <span>Button ordering</span></h1> + + <div class="info"> + <p>The list of columns that ColVis displays has two options for the order in which they are displayed. The default mode of operation is to show the buttons in the + same order as they appear in the HTML table, but the second mode of operation is to show the buttons in alphabetical order. This is done by specifying the + <code>order</code> option, set to <code>alpha</code>. Alphabetical button ordering is shown in this example.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + dom: 'C&lt;&quot;clear&quot;&gt;lfrtip', + colVis: { + order: 'alpha' + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colVis.css">../css/dataTables.colVis.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">`new` initialisation</a></li> + <li><a href="./text.html">Custom button text</a></li> + <li><a href="./exclude_columns.html">Exclude columns from list</a></li> + <li><a href="./title_callback.html">Column button callback</a></li> + <li class="active"><a href="./button_order.html">Button ordering</a></li> + <li><a href="./mouseover.html">Mouseover activation</a></li> + <li><a href="./group_columns.html">Group columns</a></li> + <li><a href="./two_tables.html">Two tables with individual controls</a></li> + <li><a href="./two_tables_identical.html">Two tables with shared controls</a></li> + <li><a href="./restore.html">Restore / show all</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/exclude_columns.html b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/exclude_columns.html new file mode 100644 index 0000000..2359d12 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/exclude_columns.html @@ -0,0 +1,632 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColVis example - Exclude columns from list</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colVis.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + dom: 'C<"clear">lfrtip', + colVis: { + exclude: [ 0 ] + } + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColVis example <span>Exclude columns from list</span></h1> + + <div class="info"> + <p>It can at times be useful to exclude columns from being in the 'show / hide' list (for example if you have hidden information that the end user shouldn't be + able to make visible. This can be done by the <code>exclude</code> ColVis configuration parameter when creating the DataTable. This is simply an array of integers, + indicating which columns should be excluded. This example shows the first column being excluded.</p> + + <p>For full information about the ColVis options, please refer to the <a href="//datatables.net/extensions/colvis/options">ColVis options documentation</a>.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + dom: 'C&lt;&quot;clear&quot;&gt;lfrtip', + colVis: { + exclude: [ 0 ] + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colVis.css">../css/dataTables.colVis.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">`new` initialisation</a></li> + <li><a href="./text.html">Custom button text</a></li> + <li class="active"><a href="./exclude_columns.html">Exclude columns from list</a></li> + <li><a href="./title_callback.html">Column button callback</a></li> + <li><a href="./button_order.html">Button ordering</a></li> + <li><a href="./mouseover.html">Mouseover activation</a></li> + <li><a href="./group_columns.html">Group columns</a></li> + <li><a href="./two_tables.html">Two tables with individual controls</a></li> + <li><a href="./two_tables_identical.html">Two tables with shared controls</a></li> + <li><a href="./restore.html">Restore / show all</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/group_columns.html b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/group_columns.html new file mode 100644 index 0000000..9bf73a7 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/group_columns.html @@ -0,0 +1,656 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColVis example - Group columns</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colVis.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + dom: 'C<"clear">lfrtip', + colVis: { + exclude: [], + groups: [ + { + title: "Engine", + columns: [ 0, 3 ] + }, + { + title: "Client", + columns: [ 1, 2 ] + } + ] + } + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColVis example <span>Group columns</span></h1> + + <div class="info"> + <p>It can be useful at times to show and hide multiple columns together - i.e. grouping them together. Groupings are defined by the <code>groups</code> array. + Create a group button by naming it (using the <code>title</code> option) and specifying by index which columns belong to it (using the <code>columns</code> + option).</p> + + <p>Note also that this ability to create groups can be used in combination <code>exclude</code> to remove individual columns from the list (should you wish them to + only be used in the groups), or set <code>exclude = [ 'all' ]</code> to show only the grouping buttons (i.e. individual column control buttons will not be + shown).</p> + + <p>For full information about the ColVis options, please refer to the <a href="//datatables.net/extensions/colvis/options">ColVis options documentation</a>.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + dom: 'C&lt;&quot;clear&quot;&gt;lfrtip', + colVis: { + exclude: [], + groups: [ + { + title: &quot;Engine&quot;, + columns: [ 0, 3 ] + }, + { + title: &quot;Client&quot;, + columns: [ 1, 2 ] + } + ] + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colVis.css">../css/dataTables.colVis.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">`new` initialisation</a></li> + <li><a href="./text.html">Custom button text</a></li> + <li><a href="./exclude_columns.html">Exclude columns from list</a></li> + <li><a href="./title_callback.html">Column button callback</a></li> + <li><a href="./button_order.html">Button ordering</a></li> + <li><a href="./mouseover.html">Mouseover activation</a></li> + <li class="active"><a href="./group_columns.html">Group columns</a></li> + <li><a href="./two_tables.html">Two tables with individual controls</a></li> + <li><a href="./two_tables_identical.html">Two tables with shared controls</a></li> + <li><a href="./restore.html">Restore / show all</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/index.html b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/index.html new file mode 100644 index 0000000..0046c25 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/index.html @@ -0,0 +1,72 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + + <title>ColVis examples - ColVis examples</title> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColVis example <span>ColVis examples</span></h1> + + <div class="info"> + <p>ColVis adds a button to the toolbars around DataTables which gives the end user of the table the ability to dynamically change the visibility of the columns in + the table:</p> + + <ul class="markdown"> + <li>Dynamically show and hide columns in a table</li> + <li>Very easy integration with DataTables</li> + <li>Ability to exclude columns from being either hidden or shown</li> + <li>Save saving integration with DataTables</li> + </ul> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">`new` initialisation</a></li> + <li><a href="./text.html">Custom button text</a></li> + <li><a href="./exclude_columns.html">Exclude columns from list</a></li> + <li><a href="./title_callback.html">Column button callback</a></li> + <li><a href="./button_order.html">Button ordering</a></li> + <li><a href="./mouseover.html">Mouseover activation</a></li> + <li><a href="./group_columns.html">Group columns</a></li> + <li><a href="./two_tables.html">Two tables with individual controls</a></li> + <li><a href="./two_tables_identical.html">Two tables with shared controls</a></li> + <li><a href="./restore.html">Restore / show all</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/jqueryui.html b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/jqueryui.html new file mode 100644 index 0000000..32d176d --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/jqueryui.html @@ -0,0 +1,637 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColVis example - jQuery UI styling</title> + <link rel="stylesheet" type="text/css" href="//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css"> + <link rel="stylesheet" type="text/css" href="../../Plugins/integration/jqueryui/dataTables.jqueryui.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colvis.jqueryui.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../../Plugins/integration/jqueryui/dataTables.jqueryui.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable( { + jQueryUI: true + } ); + var colvis = new $.fn.dataTable.ColVis( table ); + + $( colvis.button() ).insertBefore('div.dataTables_length'); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColVis example <span>jQuery UI styling</span></h1> + + <div class="info"> + <p>This example shows how the jQuery UI ThemeRoller option in DataTables can be used with ColVis.</p> + + <p>The important thing to note here is that it is easier to use <code>new $.fn.dataTable.ColVis()</code> to add ColVis to the table rather than <a href= + "//datatables.net/reference/option/dom"><code class="option" title="DataTables initialisation option">dom<span>DT</span></code></a> as the jQuery UI integration + uses a complex expression for <a href="//datatables.net/reference/option/dom"><code class="option" title= + "DataTables initialisation option">dom<span>DT</span></code></a>.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable( { + jQueryUI: true + } ); + var colvis = new $.fn.dataTable.ColVis( table ); + + $( colvis.button() ).insertBefore('div.dataTables_length'); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../../Plugins/integration/jqueryui/dataTables.jqueryui.js">../../Plugins/integration/jqueryui/dataTables.jqueryui.js</a></li> + <li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css">//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css</a></li> + <li><a href="../../Plugins/integration/jqueryui/dataTables.jqueryui.css">../../Plugins/integration/jqueryui/dataTables.jqueryui.css</a></li> + <li><a href="../css/dataTables.colvis.jqueryui.css">../css/dataTables.colvis.jqueryui.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">`new` initialisation</a></li> + <li><a href="./text.html">Custom button text</a></li> + <li><a href="./exclude_columns.html">Exclude columns from list</a></li> + <li><a href="./title_callback.html">Column button callback</a></li> + <li><a href="./button_order.html">Button ordering</a></li> + <li><a href="./mouseover.html">Mouseover activation</a></li> + <li><a href="./group_columns.html">Group columns</a></li> + <li><a href="./two_tables.html">Two tables with individual controls</a></li> + <li><a href="./two_tables_identical.html">Two tables with shared controls</a></li> + <li><a href="./restore.html">Restore / show all</a></li> + <li class="active"><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/mouseover.html b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/mouseover.html new file mode 100644 index 0000000..c3aee00 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/mouseover.html @@ -0,0 +1,632 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColVis example - Mouseover activation</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colVis.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + dom: 'C<"clear">lfrtip', + colVis: { + activate: "mouseover" + } + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColVis example <span>Mouseover activation</span></h1> + + <div class="info"> + <p>The default activation (showing the columns list) for ColVis is for the user to click the button. This can be altered to a <code>mouseover</code> activation by + making use of the <code>activate</code> initialisation option and setting it to <code class="string" title="String">mouseover</code>. This is shown in the example + below.</p> + + <p>For full information about the ColVis options, please refer to the <a href="//datatables.net/extensions/colvis/options">ColVis options documentation</a>.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + dom: 'C&lt;&quot;clear&quot;&gt;lfrtip', + colVis: { + activate: &quot;mouseover&quot; + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colVis.css">../css/dataTables.colVis.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">`new` initialisation</a></li> + <li><a href="./text.html">Custom button text</a></li> + <li><a href="./exclude_columns.html">Exclude columns from list</a></li> + <li><a href="./title_callback.html">Column button callback</a></li> + <li><a href="./button_order.html">Button ordering</a></li> + <li class="active"><a href="./mouseover.html">Mouseover activation</a></li> + <li><a href="./group_columns.html">Group columns</a></li> + <li><a href="./two_tables.html">Two tables with individual controls</a></li> + <li><a href="./two_tables_identical.html">Two tables with shared controls</a></li> + <li><a href="./restore.html">Restore / show all</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/new_init.html b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/new_init.html new file mode 100644 index 0000000..1cfa25c --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/new_init.html @@ -0,0 +1,629 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColVis example - `new` initialisation</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colVis.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable(); + var colvis = new $.fn.dataTable.ColVis( table ); + + $( colvis.button() ).insertAfter('div.info'); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColVis example <span>`new` initialisation</span></h1> + + <div class="info"> + <p>As well as providing the option to be initialised through the <code>C</code> option of <a href="//datatables.net/reference/option/dom"><code class="option" + title="DataTables initialisation option">dom<span>DT</span></code></a>, ColVis can also be added to a DataTable using direct initialisation - <code>new + $.fn.dataTable.ColVis();</code> as shown in this example. The ColVis control button it available through its <code>button()</code> method, which can then be used + to attach to the document where you need.</p> + + <p>For full information about the ColVis API, please refer to the <a href="//datatables.net/extensions/colvis/api">ColVis API documentation</a>.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable(); + var colvis = new $.fn.dataTable.ColVis( table ); + + $( colvis.button() ).insertAfter('div.info'); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colVis.css">../css/dataTables.colVis.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li class="active"><a href="./new_init.html">`new` initialisation</a></li> + <li><a href="./text.html">Custom button text</a></li> + <li><a href="./exclude_columns.html">Exclude columns from list</a></li> + <li><a href="./title_callback.html">Column button callback</a></li> + <li><a href="./button_order.html">Button ordering</a></li> + <li><a href="./mouseover.html">Mouseover activation</a></li> + <li><a href="./group_columns.html">Group columns</a></li> + <li><a href="./two_tables.html">Two tables with individual controls</a></li> + <li><a href="./two_tables_identical.html">Two tables with shared controls</a></li> + <li><a href="./restore.html">Restore / show all</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/restore.html b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/restore.html new file mode 100644 index 0000000..e9a6464 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/restore.html @@ -0,0 +1,641 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColVis example - Restore / show all</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colVis.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + dom: 'C<"clear">lfrtip', + columnDefs: [ + { visible: false, targets: 2 } + ], + colVis: { + restore: "Restore", + showAll: "Show all", + showNone: "Show none" + } + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColVis example <span>Restore / show all</span></h1> + + <div class="info"> + <p>This demo of ColVis shows its ability to add "Restore", "Show all" and "Show none" buttons to the list of column visibility options. This is done with the + <code>restore</code>, <code>showAll</code> and <code>showNone</code> options which can be enabled individually if needed.</p> + + <p>For full information about the ColVis options, please refer to the <a href="//datatables.net/extensions/colvis/options">ColVis options documentation</a>.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + dom: 'C&lt;&quot;clear&quot;&gt;lfrtip', + columnDefs: [ + { visible: false, targets: 2 } + ], + colVis: { + restore: &quot;Restore&quot;, + showAll: &quot;Show all&quot;, + showNone: &quot;Show none&quot; + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colVis.css">../css/dataTables.colVis.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">`new` initialisation</a></li> + <li><a href="./text.html">Custom button text</a></li> + <li><a href="./exclude_columns.html">Exclude columns from list</a></li> + <li><a href="./title_callback.html">Column button callback</a></li> + <li><a href="./button_order.html">Button ordering</a></li> + <li><a href="./mouseover.html">Mouseover activation</a></li> + <li><a href="./group_columns.html">Group columns</a></li> + <li><a href="./two_tables.html">Two tables with individual controls</a></li> + <li><a href="./two_tables_identical.html">Two tables with shared controls</a></li> + <li class="active"><a href="./restore.html">Restore / show all</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/simple.html b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/simple.html new file mode 100644 index 0000000..0772721 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/simple.html @@ -0,0 +1,627 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColVis example - Basic initialisation</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colVis.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + dom: 'C<"clear">lfrtip' + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColVis example <span>Basic initialisation</span></h1> + + <div class="info"> + <p>ColVis is a plug-in for DataTables which presents a list of all columns to a user and allows them to select which ones they wish to be visible. Click the 'Show + / hide columns' button to be presented with a list of columns in the table, and click the buttons to show and hide them as you wish.</p> + + <p>ColVis is added to a DataTable by specifying the <code>C</code> option for <a href="//datatables.net/reference/option/dom"><code class="option" title= + "DataTables initialisation option">dom<span>DT</span></code></a>. The example below shows the ColVis button added to the table with a clearing element after + it.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + dom: 'C&lt;&quot;clear&quot;&gt;lfrtip' + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colVis.css">../css/dataTables.colVis.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li class="active"><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">`new` initialisation</a></li> + <li><a href="./text.html">Custom button text</a></li> + <li><a href="./exclude_columns.html">Exclude columns from list</a></li> + <li><a href="./title_callback.html">Column button callback</a></li> + <li><a href="./button_order.html">Button ordering</a></li> + <li><a href="./mouseover.html">Mouseover activation</a></li> + <li><a href="./group_columns.html">Group columns</a></li> + <li><a href="./two_tables.html">Two tables with individual controls</a></li> + <li><a href="./two_tables_identical.html">Two tables with shared controls</a></li> + <li><a href="./restore.html">Restore / show all</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/text.html b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/text.html new file mode 100644 index 0000000..7840f74 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/text.html @@ -0,0 +1,631 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColVis example - Custom button text</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colVis.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + "dom": 'C<"clear">lfrtip', + "colVis": { + "buttonText": "Change columns" + } + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColVis example <span>Custom button text</span></h1> + + <div class="info"> + <p>You may wish to use your own text in the ColVis button - this is done by making use of the <code>buttonText</code> initialisation option, as shown in this + example.</p> + + <p>For full information about the ColVis options, please refer to the <a href="//datatables.net/extensions/colvis/options">ColVis options documentation</a>.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + &quot;dom&quot;: 'C&lt;&quot;clear&quot;&gt;lfrtip', + &quot;colVis&quot;: { + &quot;buttonText&quot;: &quot;Change columns&quot; + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colVis.css">../css/dataTables.colVis.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">`new` initialisation</a></li> + <li class="active"><a href="./text.html">Custom button text</a></li> + <li><a href="./exclude_columns.html">Exclude columns from list</a></li> + <li><a href="./title_callback.html">Column button callback</a></li> + <li><a href="./button_order.html">Button ordering</a></li> + <li><a href="./mouseover.html">Mouseover activation</a></li> + <li><a href="./group_columns.html">Group columns</a></li> + <li><a href="./two_tables.html">Two tables with individual controls</a></li> + <li><a href="./two_tables_identical.html">Two tables with shared controls</a></li> + <li><a href="./restore.html">Restore / show all</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/title_callback.html b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/title_callback.html new file mode 100644 index 0000000..d20605e --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/title_callback.html @@ -0,0 +1,636 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColVis example - Column button callback</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colVis.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + "dom": 'C<"clear">lfrtip', + "colVis": { + "label": function ( index, title, th ) { + return (index+1) +'. '+ title; + } + } + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColVis example <span>Column button callback</span></h1> + + <div class="info"> + <p>By default ColVis will use the information in the <code class="tag" title="HTML tag">th</code> cell for each column as the button name to use in ColVis, which + might not always be what you want (for example you might has HTML in the cell that you don't want in the button). The <code>label</code> callback provides the + ability to customise the label used for the button.</p> + + <p>In this example the column index is prefixed to the column title.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + &quot;dom&quot;: 'C&lt;&quot;clear&quot;&gt;lfrtip', + &quot;colVis&quot;: { + &quot;label&quot;: function ( index, title, th ) { + return (index+1) +'. '+ title; + } + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colVis.css">../css/dataTables.colVis.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">`new` initialisation</a></li> + <li><a href="./text.html">Custom button text</a></li> + <li><a href="./exclude_columns.html">Exclude columns from list</a></li> + <li class="active"><a href="./title_callback.html">Column button callback</a></li> + <li><a href="./button_order.html">Button ordering</a></li> + <li><a href="./mouseover.html">Mouseover activation</a></li> + <li><a href="./group_columns.html">Group columns</a></li> + <li><a href="./two_tables.html">Two tables with individual controls</a></li> + <li><a href="./two_tables_identical.html">Two tables with shared controls</a></li> + <li><a href="./restore.html">Restore / show all</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/two_tables.html b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/two_tables.html new file mode 100644 index 0000000..3dc0f0a --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/two_tables.html @@ -0,0 +1,339 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColVis example - Two tables with individual controls</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colVis.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('table.display').DataTable( { + dom: 'C<"clear">lfrtip', + displayLength: 5 + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColVis example <span>Two tables with individual controls</span></h1> + + <div class="info"> + <p>It can be useful to have DataTables initialise more than one table with a single call can for them to each have individual ColVis controllers. All this requires + is a suitable jQuery selector to be used, and DataTables and ColVis will take care of the rest - as shown in this example.</p> + </div> + + <table id="" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>$320,800</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>$433,060</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>$103,600</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>$342,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>$217,500</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>$92,575</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>$324,050</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>$75,650</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>$183,000</td> + </tr> + </tbody> + </table> + + <table id="" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>$90,560</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>$198,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>$132,000</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>$145,000</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>$136,200</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>$163,500</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>$103,500</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('table.display').DataTable( { + dom: 'C&lt;&quot;clear&quot;&gt;lfrtip', + displayLength: 5 + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colVis.css">../css/dataTables.colVis.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">`new` initialisation</a></li> + <li><a href="./text.html">Custom button text</a></li> + <li><a href="./exclude_columns.html">Exclude columns from list</a></li> + <li><a href="./title_callback.html">Column button callback</a></li> + <li><a href="./button_order.html">Button ordering</a></li> + <li><a href="./mouseover.html">Mouseover activation</a></li> + <li><a href="./group_columns.html">Group columns</a></li> + <li class="active"><a href="./two_tables.html">Two tables with individual controls</a></li> + <li><a href="./two_tables_identical.html">Two tables with shared controls</a></li> + <li><a href="./restore.html">Restore / show all</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/two_tables_identical.html b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/two_tables_identical.html new file mode 100644 index 0000000..90ffe07 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColVis/examples/two_tables_identical.html @@ -0,0 +1,363 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>ColVis example - Two tables with shared controls</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.colVis.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.colVis.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var tables = $('table.display').DataTable( { + displayLength: 5 + } ); + + // When the column visibility changes on the firs table, also change it on + // the others + tables.table(0).on('column-visibility', function ( e, settings, colIdx, visibility ) { + tables.tables(':gt(0)').column( colIdx ).visible( visibility ); + } ); + + // Create ColVis on the first table only + var colvis = new $.fn.dataTable.ColVis( tables.table(0) ); + $( colvis.button() ).insertAfter('div.info'); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>ColVis example <span>Two tables with shared controls</span></h1> + + <div class="info"> + <p>This example shows how the DataTables API can be used with ColVis to use a single ColVis control to effect other tables. This is done by applying ColVis to the + first table and then listening for the <a href="//datatables.net/reference/event/column-visibility"><code class="event" title= + "DataTables event">column-visibility<span>DT</span></code></a> event and updating all other tables when triggered.</p> + + <p>This example makes use of the <a href="//datatables.net/reference/api/tables()"><code class="api" title= + "DataTables API method">tables()<span>DT</span></code></a> and <a href="//datatables.net/reference/api/table()"><code class="api" title= + "DataTables API method">table()<span>DT</span></code></a> methods for working with multiple tables, and also initialised ColVis using the <code>new + $.fn.dataTable.ColVis();</code> operator.</p> + </div> + + <table id="" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>$320,800</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>$433,060</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>$103,600</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>$342,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>$217,500</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>$92,575</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>$324,050</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>$75,650</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>$183,000</td> + </tr> + </tbody> + </table> + + <table id="" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>$90,560</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>$198,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>$132,000</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>$145,000</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>$136,200</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>$163,500</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>$103,500</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var tables = $('table.display').DataTable( { + displayLength: 5 + } ); + + // When the column visibility changes on the firs table, also change it on + // the others + tables.table(0).on('column-visibility', function ( e, settings, colIdx, visibility ) { + tables.tables(':gt(0)').column( colIdx ).visible( visibility ); + } ); + + // Create ColVis on the first table only + var colvis = new $.fn.dataTable.ColVis( tables.table(0) ); + $( colvis.button() ).insertAfter('div.info'); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.colVis.js">../js/dataTables.colVis.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.colVis.css">../css/dataTables.colVis.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./new_init.html">`new` initialisation</a></li> + <li><a href="./text.html">Custom button text</a></li> + <li><a href="./exclude_columns.html">Exclude columns from list</a></li> + <li><a href="./title_callback.html">Column button callback</a></li> + <li><a href="./button_order.html">Button ordering</a></li> + <li><a href="./mouseover.html">Mouseover activation</a></li> + <li><a href="./group_columns.html">Group columns</a></li> + <li><a href="./two_tables.html">Two tables with individual controls</a></li> + <li class="active"><a href="./two_tables_identical.html">Two tables with shared controls</a></li> + <li><a href="./restore.html">Restore / show all</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/ColVis/js/dataTables.colVis.js b/theme/bootstrap/plugins/datatables/extensions/ColVis/js/dataTables.colVis.js new file mode 100644 index 0000000..57a4326 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColVis/js/dataTables.colVis.js @@ -0,0 +1,1123 @@ +/*! ColVis 1.1.2 + * ©2010-2015 SpryMedia Ltd - datatables.net/license + */ + +/** + * @summary ColVis + * @description Controls for column visibility in DataTables + * @version 1.1.2 + * @file dataTables.colReorder.js + * @author SpryMedia Ltd (www.sprymedia.co.uk) + * @contact www.sprymedia.co.uk/contact + * @copyright Copyright 2010-2015 SpryMedia Ltd. + * + * This source file is free software, available under the following license: + * MIT license - http://datatables.net/license/mit + * + * This source file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. + * + * For details please refer to: http://www.datatables.net + */ + +(function(window, document, undefined) { + + +var factory = function( $, DataTable ) { +"use strict"; + +/** + * ColVis provides column visibility control for DataTables + * + * @class ColVis + * @constructor + * @param {object} DataTables settings object. With DataTables 1.10 this can + * also be and API instance, table node, jQuery collection or jQuery selector. + * @param {object} ColVis configuration options + */ +var ColVis = function( oDTSettings, oInit ) +{ + /* Santiy check that we are a new instance */ + if ( !this.CLASS || this.CLASS != "ColVis" ) + { + alert( "Warning: ColVis must be initialised with the keyword 'new'" ); + } + + if ( typeof oInit == 'undefined' ) + { + oInit = {}; + } + + var camelToHungarian = $.fn.dataTable.camelToHungarian; + if ( camelToHungarian ) { + camelToHungarian( ColVis.defaults, ColVis.defaults, true ); + camelToHungarian( ColVis.defaults, oInit ); + } + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Public class variables + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * @namespace Settings object which contains customisable information for + * ColVis instance. Augmented by ColVis.defaults + */ + this.s = { + /** + * DataTables settings object + * @property dt + * @type Object + * @default null + */ + "dt": null, + + /** + * Customisation object + * @property oInit + * @type Object + * @default passed in + */ + "oInit": oInit, + + /** + * Flag to say if the collection is hidden + * @property hidden + * @type boolean + * @default true + */ + "hidden": true, + + /** + * Store the original visibility settings so they could be restored + * @property abOriginal + * @type Array + * @default [] + */ + "abOriginal": [] + }; + + + /** + * @namespace Common and useful DOM elements for the class instance + */ + this.dom = { + /** + * Wrapper for the button - given back to DataTables as the node to insert + * @property wrapper + * @type Node + * @default null + */ + "wrapper": null, + + /** + * Activation button + * @property button + * @type Node + * @default null + */ + "button": null, + + /** + * Collection list node + * @property collection + * @type Node + * @default null + */ + "collection": null, + + /** + * Background node used for shading the display and event capturing + * @property background + * @type Node + * @default null + */ + "background": null, + + /** + * Element to position over the activation button to catch mouse events when using mouseover + * @property catcher + * @type Node + * @default null + */ + "catcher": null, + + /** + * List of button elements + * @property buttons + * @type Array + * @default [] + */ + "buttons": [], + + /** + * List of group button elements + * @property groupButtons + * @type Array + * @default [] + */ + "groupButtons": [], + + /** + * Restore button + * @property restore + * @type Node + * @default null + */ + "restore": null + }; + + /* Store global reference */ + ColVis.aInstances.push( this ); + + /* Constructor logic */ + this.s.dt = $.fn.dataTable.Api ? + new $.fn.dataTable.Api( oDTSettings ).settings()[0] : + oDTSettings; + + this._fnConstruct( oInit ); + return this; +}; + + + +ColVis.prototype = { + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Public methods + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * Get the ColVis instance's control button so it can be injected into the + * DOM + * @method button + * @returns {node} ColVis button + */ + button: function () + { + return this.dom.wrapper; + }, + + /** + * Alias of `rebuild` for backwards compatibility + * @method fnRebuild + */ + "fnRebuild": function () + { + this.rebuild(); + }, + + /** + * Rebuild the list of buttons for this instance (i.e. if there is a column + * header update) + * @method fnRebuild + */ + rebuild: function () + { + /* Remove the old buttons */ + for ( var i=this.dom.buttons.length-1 ; i>=0 ; i-- ) { + this.dom.collection.removeChild( this.dom.buttons[i] ); + } + this.dom.buttons.splice( 0, this.dom.buttons.length ); + this.dom.groupButtons.splice(0, this.dom.groupButtons.length); + + if ( this.dom.restore ) { + this.dom.restore.parentNode( this.dom.restore ); + } + + /* Re-add them (this is not the optimal way of doing this, it is fast and effective) */ + this._fnAddGroups(); + this._fnAddButtons(); + + /* Update the checkboxes */ + this._fnDrawCallback(); + }, + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Private methods (they are of course public in JS, but recommended as private) + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * Constructor logic + * @method _fnConstruct + * @returns void + * @private + */ + "_fnConstruct": function ( init ) + { + this._fnApplyCustomisation( init ); + + var that = this; + var i, iLen; + this.dom.wrapper = document.createElement('div'); + this.dom.wrapper.className = "ColVis"; + + this.dom.button = $( '<button />', { + 'class': !this.s.dt.bJUI ? + "ColVis_Button ColVis_MasterButton" : + "ColVis_Button ColVis_MasterButton ui-button ui-state-default" + } ) + .append( '<span>'+this.s.buttonText+'</span>' ) + .bind( this.s.activate=="mouseover" ? "mouseover" : "click", function (e) { + e.preventDefault(); + that._fnCollectionShow(); + } ) + .appendTo( this.dom.wrapper )[0]; + + this.dom.catcher = this._fnDomCatcher(); + this.dom.collection = this._fnDomCollection(); + this.dom.background = this._fnDomBackground(); + + this._fnAddGroups(); + this._fnAddButtons(); + + /* Store the original visibility information */ + for ( i=0, iLen=this.s.dt.aoColumns.length ; i<iLen ; i++ ) + { + this.s.abOriginal.push( this.s.dt.aoColumns[i].bVisible ); + } + + /* Update on each draw */ + this.s.dt.aoDrawCallback.push( { + "fn": function () { + that._fnDrawCallback.call( that ); + }, + "sName": "ColVis" + } ); + + /* If columns are reordered, then we need to update our exclude list and + * rebuild the displayed list + */ + $(this.s.dt.oInstance).bind( 'column-reorder.dt', function ( e, oSettings, oReorder ) { + for ( i=0, iLen=that.s.aiExclude.length ; i<iLen ; i++ ) { + that.s.aiExclude[i] = oReorder.aiInvertMapping[ that.s.aiExclude[i] ]; + } + + var mStore = that.s.abOriginal.splice( oReorder.iFrom, 1 )[0]; + that.s.abOriginal.splice( oReorder.iTo, 0, mStore ); + + that.fnRebuild(); + } ); + + $(this.s.dt.oInstance).bind( 'destroy.dt', function () { + $(that.dom.wrapper).remove(); + } ); + + // Set the initial state + this._fnDrawCallback(); + }, + + + /** + * Apply any customisation to the settings from the DataTables initialisation + * @method _fnApplyCustomisation + * @returns void + * @private + */ + "_fnApplyCustomisation": function ( init ) + { + $.extend( true, this.s, ColVis.defaults, init ); + + // Slightly messy overlap for the camelCase notation + if ( ! this.s.showAll && this.s.bShowAll ) { + this.s.showAll = this.s.sShowAll; + } + + if ( ! this.s.restore && this.s.bRestore ) { + this.s.restore = this.s.sRestore; + } + + // CamelCase to Hungarian for the column groups + var groups = this.s.groups; + var hungarianGroups = this.s.aoGroups; + if ( groups ) { + for ( var i=0, ien=groups.length ; i<ien ; i++ ) { + if ( groups[i].title ) { + hungarianGroups[i].sTitle = groups[i].title; + } + if ( groups[i].columns ) { + hungarianGroups[i].aiColumns = groups[i].columns; + } + } + } + }, + + + /** + * On each table draw, check the visibility checkboxes as needed. This allows any process to + * update the table's column visibility and ColVis will still be accurate. + * @method _fnDrawCallback + * @returns void + * @private + */ + "_fnDrawCallback": function () + { + var columns = this.s.dt.aoColumns; + var buttons = this.dom.buttons; + var groups = this.s.aoGroups; + var button; + + for ( var i=0, ien=buttons.length ; i<ien ; i++ ) { + button = buttons[i]; + + if ( button.__columnIdx !== undefined ) { + $('input', button).prop( 'checked', columns[ button.__columnIdx ].bVisible ); + } + } + + var allVisible = function ( columnIndeces ) { + for ( var k=0, kLen=columnIndeces.length ; k<kLen ; k++ ) + { + if ( columns[columnIndeces[k]].bVisible === false ) { return false; } + } + return true; + }; + var allHidden = function ( columnIndeces ) { + for ( var m=0 , mLen=columnIndeces.length ; m<mLen ; m++ ) + { + if ( columns[columnIndeces[m]].bVisible === true ) { return false; } + } + return true; + }; + + for ( var j=0, jLen=groups.length ; j<jLen ; j++ ) + { + if ( allVisible(groups[j].aiColumns) ) + { + $('input', this.dom.groupButtons[j]).prop('checked', true); + $('input', this.dom.groupButtons[j]).prop('indeterminate', false); + } + else if ( allHidden(groups[j].aiColumns) ) + { + $('input', this.dom.groupButtons[j]).prop('checked', false); + $('input', this.dom.groupButtons[j]).prop('indeterminate', false); + } + else + { + $('input', this.dom.groupButtons[j]).prop('indeterminate', true); + } + } + }, + + + /** + * Loop through the groups (provided in the settings) and create a button for each. + * @method _fnAddgroups + * @returns void + * @private + */ + "_fnAddGroups": function () + { + var nButton; + + if ( typeof this.s.aoGroups != 'undefined' ) + { + for ( var i=0, iLen=this.s.aoGroups.length ; i<iLen ; i++ ) + { + nButton = this._fnDomGroupButton( i ); + this.dom.groupButtons.push( nButton ); + this.dom.buttons.push( nButton ); + this.dom.collection.appendChild( nButton ); + } + } + }, + + + /** + * Loop through the columns in the table and as a new button for each one. + * @method _fnAddButtons + * @returns void + * @private + */ + "_fnAddButtons": function () + { + var + nButton, + columns = this.s.dt.aoColumns; + + if ( $.inArray( 'all', this.s.aiExclude ) === -1 ) { + for ( var i=0, iLen=columns.length ; i<iLen ; i++ ) + { + if ( $.inArray( i, this.s.aiExclude ) === -1 ) + { + nButton = this._fnDomColumnButton( i ); + nButton.__columnIdx = i; + this.dom.buttons.push( nButton ); + } + } + } + + if ( this.s.order === 'alpha' ) { + this.dom.buttons.sort( function ( a, b ) { + var titleA = columns[ a.__columnIdx ].sTitle; + var titleB = columns[ b.__columnIdx ].sTitle; + + return titleA === titleB ? + 0 : + titleA < titleB ? + -1 : + 1; + } ); + } + + if ( this.s.restore ) + { + nButton = this._fnDomRestoreButton(); + nButton.className += " ColVis_Restore"; + this.dom.buttons.push( nButton ); + } + + if ( this.s.showAll ) + { + nButton = this._fnDomShowXButton( this.s.showAll, true ); + nButton.className += " ColVis_ShowAll"; + this.dom.buttons.push( nButton ); + } + + if ( this.s.showNone ) + { + nButton = this._fnDomShowXButton( this.s.showNone, false ); + nButton.className += " ColVis_ShowNone"; + this.dom.buttons.push( nButton ); + } + + $(this.dom.collection).append( this.dom.buttons ); + }, + + + /** + * Create a button which allows a "restore" action + * @method _fnDomRestoreButton + * @returns {Node} Created button + * @private + */ + "_fnDomRestoreButton": function () + { + var + that = this, + dt = this.s.dt; + + return $( + '<li class="ColVis_Special '+(dt.bJUI ? 'ui-button ui-state-default' : '')+'">'+ + this.s.restore+ + '</li>' + ) + .click( function (e) { + for ( var i=0, iLen=that.s.abOriginal.length ; i<iLen ; i++ ) + { + that.s.dt.oInstance.fnSetColumnVis( i, that.s.abOriginal[i], false ); + } + that._fnAdjustOpenRows(); + that.s.dt.oInstance.fnAdjustColumnSizing( false ); + that.s.dt.oInstance.fnDraw( false ); + } )[0]; + }, + + + /** + * Create a button which allows show all and show node actions + * @method _fnDomShowXButton + * @returns {Node} Created button + * @private + */ + "_fnDomShowXButton": function ( str, action ) + { + var + that = this, + dt = this.s.dt; + + return $( + '<li class="ColVis_Special '+(dt.bJUI ? 'ui-button ui-state-default' : '')+'">'+ + str+ + '</li>' + ) + .click( function (e) { + for ( var i=0, iLen=that.s.abOriginal.length ; i<iLen ; i++ ) + { + if (that.s.aiExclude.indexOf(i) === -1) + { + that.s.dt.oInstance.fnSetColumnVis( i, action, false ); + } + } + that._fnAdjustOpenRows(); + that.s.dt.oInstance.fnAdjustColumnSizing( false ); + that.s.dt.oInstance.fnDraw( false ); + } )[0]; + }, + + + /** + * Create the DOM for a show / hide group button + * @method _fnDomGroupButton + * @param {int} i Group in question, order based on that provided in settings + * @returns {Node} Created button + * @private + */ + "_fnDomGroupButton": function ( i ) + { + var + that = this, + dt = this.s.dt, + oGroup = this.s.aoGroups[i]; + + return $( + '<li class="ColVis_Special '+(dt.bJUI ? 'ui-button ui-state-default' : '')+'">'+ + '<label>'+ + '<input type="checkbox" />'+ + '<span>'+oGroup.sTitle+'</span>'+ + '</label>'+ + '</li>' + ) + .click( function (e) { + var showHide = !$('input', this).is(":checked"); + if ( e.target.nodeName.toLowerCase() !== "li" ) + { + showHide = ! showHide; + } + + for ( var j=0 ; j < oGroup.aiColumns.length ; j++ ) + { + that.s.dt.oInstance.fnSetColumnVis( oGroup.aiColumns[j], showHide ); + } + } )[0]; + }, + + + /** + * Create the DOM for a show / hide button + * @method _fnDomColumnButton + * @param {int} i Column in question + * @returns {Node} Created button + * @private + */ + "_fnDomColumnButton": function ( i ) + { + var + that = this, + column = this.s.dt.aoColumns[i], + dt = this.s.dt; + + var title = this.s.fnLabel===null ? + column.sTitle : + this.s.fnLabel( i, column.sTitle, column.nTh ); + + return $( + '<li '+(dt.bJUI ? 'class="ui-button ui-state-default"' : '')+'>'+ + '<label>'+ + '<input type="checkbox" />'+ + '<span>'+title+'</span>'+ + '</label>'+ + '</li>' + ) + .click( function (e) { + var showHide = !$('input', this).is(":checked"); + if ( e.target.nodeName.toLowerCase() !== "li" ) + { + if ( e.target.nodeName.toLowerCase() == "input" || that.s.fnStateChange === null ) + { + showHide = ! showHide; + } + } + + /* Need to consider the case where the initialiser created more than one table - change the + * API index that DataTables is using + */ + var oldIndex = $.fn.dataTableExt.iApiIndex; + $.fn.dataTableExt.iApiIndex = that._fnDataTablesApiIndex.call(that); + + // Optimisation for server-side processing when scrolling - don't do a full redraw + if ( dt.oFeatures.bServerSide ) + { + that.s.dt.oInstance.fnSetColumnVis( i, showHide, false ); + that.s.dt.oInstance.fnAdjustColumnSizing( false ); + if (dt.oScroll.sX !== "" || dt.oScroll.sY !== "" ) + { + that.s.dt.oInstance.oApi._fnScrollDraw( that.s.dt ); + } + that._fnDrawCallback(); + } + else + { + that.s.dt.oInstance.fnSetColumnVis( i, showHide ); + } + + $.fn.dataTableExt.iApiIndex = oldIndex; /* Restore */ + + if ( that.s.fnStateChange !== null ) + { + if ( e.target.nodeName.toLowerCase() == "span" ) + { + e.preventDefault(); + } + that.s.fnStateChange.call( that, i, showHide ); + } + } )[0]; + }, + + + /** + * Get the position in the DataTables instance array of the table for this + * instance of ColVis + * @method _fnDataTablesApiIndex + * @returns {int} Index + * @private + */ + "_fnDataTablesApiIndex": function () + { + for ( var i=0, iLen=this.s.dt.oInstance.length ; i<iLen ; i++ ) + { + if ( this.s.dt.oInstance[i] == this.s.dt.nTable ) + { + return i; + } + } + return 0; + }, + + + /** + * Create the element used to contain list the columns (it is shown and + * hidden as needed) + * @method _fnDomCollection + * @returns {Node} div container for the collection + * @private + */ + "_fnDomCollection": function () + { + return $('<ul />', { + 'class': !this.s.dt.bJUI ? + "ColVis_collection" : + "ColVis_collection ui-buttonset ui-buttonset-multi" + } ) + .css( { + 'display': 'none', + 'opacity': 0, + 'position': ! this.s.bCssPosition ? + 'absolute' : + '' + } )[0]; + }, + + + /** + * An element to be placed on top of the activate button to catch events + * @method _fnDomCatcher + * @returns {Node} div container for the collection + * @private + */ + "_fnDomCatcher": function () + { + var + that = this, + nCatcher = document.createElement('div'); + nCatcher.className = "ColVis_catcher"; + + $(nCatcher).click( function () { + that._fnCollectionHide.call( that, null, null ); + } ); + + return nCatcher; + }, + + + /** + * Create the element used to shade the background, and capture hide events (it is shown and + * hidden as needed) + * @method _fnDomBackground + * @returns {Node} div container for the background + * @private + */ + "_fnDomBackground": function () + { + var that = this; + + var background = $('<div></div>') + .addClass( 'ColVis_collectionBackground' ) + .css( 'opacity', 0 ) + .click( function () { + that._fnCollectionHide.call( that, null, null ); + } ); + + /* When considering a mouse over action for the activation, we also consider a mouse out + * which is the same as a mouse over the background - without all the messing around of + * bubbling events. Use the catcher element to avoid messing around with bubbling + */ + if ( this.s.activate == "mouseover" ) + { + background.mouseover( function () { + that.s.overcollection = false; + that._fnCollectionHide.call( that, null, null ); + } ); + } + + return background[0]; + }, + + + /** + * Show the show / hide list and the background + * @method _fnCollectionShow + * @returns void + * @private + */ + "_fnCollectionShow": function () + { + var that = this, i, iLen, iLeft; + var oPos = $(this.dom.button).offset(); + var nHidden = this.dom.collection; + var nBackground = this.dom.background; + var iDivX = parseInt(oPos.left, 10); + var iDivY = parseInt(oPos.top + $(this.dom.button).outerHeight(), 10); + + if ( ! this.s.bCssPosition ) + { + nHidden.style.top = iDivY+"px"; + nHidden.style.left = iDivX+"px"; + } + + $(nHidden).css( { + 'display': 'block', + 'opacity': 0 + } ); + + nBackground.style.bottom ='0px'; + nBackground.style.right = '0px'; + + var oStyle = this.dom.catcher.style; + oStyle.height = $(this.dom.button).outerHeight()+"px"; + oStyle.width = $(this.dom.button).outerWidth()+"px"; + oStyle.top = oPos.top+"px"; + oStyle.left = iDivX+"px"; + + document.body.appendChild( nBackground ); + document.body.appendChild( nHidden ); + document.body.appendChild( this.dom.catcher ); + + /* This results in a very small delay for the end user but it allows the animation to be + * much smoother. If you don't want the animation, then the setTimeout can be removed + */ + $(nHidden).animate({"opacity": 1}, that.s.iOverlayFade); + $(nBackground).animate({"opacity": 0.1}, that.s.iOverlayFade, 'linear', function () { + /* In IE6 if you set the checked attribute of a hidden checkbox, then this is not visually + * reflected. As such, we need to do it here, once it is visible. Unbelievable. + */ + if ( $.browser && $.browser.msie && $.browser.version == "6.0" ) + { + that._fnDrawCallback(); + } + }); + + /* Visual corrections to try and keep the collection visible */ + if ( !this.s.bCssPosition ) + { + iLeft = ( this.s.sAlign=="left" ) ? + iDivX : + iDivX - $(nHidden).outerWidth() + $(this.dom.button).outerWidth(); + + nHidden.style.left = iLeft+"px"; + + var iDivWidth = $(nHidden).outerWidth(); + var iDivHeight = $(nHidden).outerHeight(); + var iDocWidth = $(document).width(); + + if ( iLeft + iDivWidth > iDocWidth ) + { + nHidden.style.left = (iDocWidth-iDivWidth)+"px"; + } + } + + this.s.hidden = false; + }, + + + /** + * Hide the show / hide list and the background + * @method _fnCollectionHide + * @returns void + * @private + */ + "_fnCollectionHide": function ( ) + { + var that = this; + + if ( !this.s.hidden && this.dom.collection !== null ) + { + this.s.hidden = true; + + $(this.dom.collection).animate({"opacity": 0}, that.s.iOverlayFade, function (e) { + this.style.display = "none"; + } ); + + $(this.dom.background).animate({"opacity": 0}, that.s.iOverlayFade, function (e) { + document.body.removeChild( that.dom.background ); + document.body.removeChild( that.dom.catcher ); + } ); + } + }, + + + /** + * Alter the colspan on any fnOpen rows + */ + "_fnAdjustOpenRows": function () + { + var aoOpen = this.s.dt.aoOpenRows; + var iVisible = this.s.dt.oApi._fnVisbleColumns( this.s.dt ); + + for ( var i=0, iLen=aoOpen.length ; i<iLen ; i++ ) { + aoOpen[i].nTr.getElementsByTagName('td')[0].colSpan = iVisible; + } + } +}; + + + + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Static object methods + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** + * Rebuild the collection for a given table, or all tables if no parameter given + * @method ColVis.fnRebuild + * @static + * @param object oTable DataTable instance to consider - optional + * @returns void + */ +ColVis.fnRebuild = function ( oTable ) +{ + var nTable = null; + if ( typeof oTable != 'undefined' ) + { + nTable = $.fn.dataTable.Api ? + new $.fn.dataTable.Api( oTable ).table().node() : + oTable.fnSettings().nTable; + } + + for ( var i=0, iLen=ColVis.aInstances.length ; i<iLen ; i++ ) + { + if ( typeof oTable == 'undefined' || nTable == ColVis.aInstances[i].s.dt.nTable ) + { + ColVis.aInstances[i].fnRebuild(); + } + } +}; + + +ColVis.defaults = { + /** + * Mode of activation. Can be 'click' or 'mouseover' + * @property activate + * @type string + * @default click + */ + active: 'click', + + /** + * Text used for the button + * @property buttonText + * @type string + * @default Show / hide columns + */ + buttonText: 'Show / hide columns', + + /** + * List of columns (integers) which should be excluded from the list + * @property aiExclude + * @type array + * @default [] + */ + aiExclude: [], + + /** + * Show restore button + * @property bRestore + * @type boolean + * @default false + */ + bRestore: false, + + /** + * Restore button text + * @property sRestore + * @type string + * @default Restore original + */ + sRestore: 'Restore original', + + /** + * Show Show-All button + * @property bShowAll + * @type boolean + * @default false + */ + bShowAll: false, + + /** + * Show All button text + * @property sShowAll + * @type string + * @default Restore original + */ + sShowAll: 'Show All', + + /** + * Position of the collection menu when shown - align "left" or "right" + * @property sAlign + * @type string + * @default left + */ + sAlign: 'left', + + /** + * Callback function to tell the user when the state has changed + * @property fnStateChange + * @type function + * @default null + */ + fnStateChange: null, + + /** + * Overlay animation duration in mS + * @property iOverlayFade + * @type integer|false + * @default 500 + */ + iOverlayFade: 500, + + /** + * Label callback for column names. Takes three parameters: 1. the + * column index, 2. the column title detected by DataTables and 3. the + * TH node for the column + * @property fnLabel + * @type function + * @default null + */ + fnLabel: null, + + /** + * Indicate if the column list should be positioned by Javascript, + * visually below the button or allow CSS to do the positioning + * @property bCssPosition + * @type boolean + * @default false + */ + bCssPosition: false, + + /** + * Group buttons + * @property aoGroups + * @type array + * @default [] + */ + aoGroups: [], + + /** + * Button ordering - 'alpha' (alphabetical) or 'column' (table column + * order) + * @property order + * @type string + * @default column + */ + order: 'column' +}; + + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Static object properties + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** + * Collection of all ColVis instances + * @property ColVis.aInstances + * @static + * @type Array + * @default [] + */ +ColVis.aInstances = []; + + + + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Constants + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** + * Name of this class + * @constant CLASS + * @type String + * @default ColVis + */ +ColVis.prototype.CLASS = "ColVis"; + + +/** + * ColVis version + * @constant VERSION + * @type String + * @default See code + */ +ColVis.VERSION = "1.1.2"; +ColVis.prototype.VERSION = ColVis.VERSION; + + + + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Initialisation + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Register a new feature with DataTables + */ +if ( typeof $.fn.dataTable == "function" && + typeof $.fn.dataTableExt.fnVersionCheck == "function" && + $.fn.dataTableExt.fnVersionCheck('1.7.0') ) +{ + $.fn.dataTableExt.aoFeatures.push( { + "fnInit": function( oDTSettings ) { + var init = oDTSettings.oInit; + var colvis = new ColVis( oDTSettings, init.colVis || init.oColVis || {} ); + return colvis.button(); + }, + "cFeature": "C", + "sFeature": "ColVis" + } ); +} +else +{ + alert( "Warning: ColVis requires DataTables 1.7 or greater - www.datatables.net/download"); +} + + +// Make ColVis accessible from the DataTables instance +$.fn.dataTable.ColVis = ColVis; +$.fn.DataTable.ColVis = ColVis; + + +return ColVis; +}; // /factory + + +// Define as an AMD module if possible +if ( typeof define === 'function' && define.amd ) { + define( ['jquery', 'datatables'], factory ); +} +else if ( typeof exports === 'object' ) { + // Node/CommonJS + factory( require('jquery'), require('datatables') ); +} +else if ( jQuery && !jQuery.fn.dataTable.ColVis ) { + // Otherwise simply initialise as normal, stopping multiple evaluation + factory( jQuery, jQuery.fn.dataTable ); +} + + +})(window, document); + diff --git a/theme/bootstrap/plugins/datatables/extensions/ColVis/js/dataTables.colVis.min.js b/theme/bootstrap/plugins/datatables/extensions/ColVis/js/dataTables.colVis.min.js new file mode 100644 index 0000000..764b102 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/ColVis/js/dataTables.colVis.min.js @@ -0,0 +1,24 @@ +/*! + ColVis 1.1.2 + ©2010-2015 SpryMedia Ltd - datatables.net/license +*/ +(function(j,i,k){j=function(d){var e=function(a,b){(!this.CLASS||"ColVis"!=this.CLASS)&&alert("Warning: ColVis must be initialised with the keyword 'new'");"undefined"==typeof b&&(b={});var c=d.fn.dataTable.camelToHungarian;c&&(c(e.defaults,e.defaults,!0),c(e.defaults,b));this.s={dt:null,oInit:b,hidden:!0,abOriginal:[]};this.dom={wrapper:null,button:null,collection:null,background:null,catcher:null,buttons:[],groupButtons:[],restore:null};e.aInstances.push(this);this.s.dt=d.fn.dataTable.Api?(new d.fn.dataTable.Api(a)).settings()[0]: +a;this._fnConstruct(b);return this};e.prototype={button:function(){return this.dom.wrapper},fnRebuild:function(){this.rebuild()},rebuild:function(){for(var a=this.dom.buttons.length-1;0<=a;a--)this.dom.collection.removeChild(this.dom.buttons[a]);this.dom.buttons.splice(0,this.dom.buttons.length);this.dom.groupButtons.splice(0,this.dom.groupButtons.length);this.dom.restore&&this.dom.restore.parentNode(this.dom.restore);this._fnAddGroups();this._fnAddButtons();this._fnDrawCallback()},_fnConstruct:function(a){this._fnApplyCustomisation(a); +var b=this,c,f;this.dom.wrapper=i.createElement("div");this.dom.wrapper.className="ColVis";this.dom.button=d("<button />",{"class":!this.s.dt.bJUI?"ColVis_Button ColVis_MasterButton":"ColVis_Button ColVis_MasterButton ui-button ui-state-default"}).append("<span>"+this.s.buttonText+"</span>").bind("mouseover"==this.s.activate?"mouseover":"click",function(a){a.preventDefault();b._fnCollectionShow()}).appendTo(this.dom.wrapper)[0];this.dom.catcher=this._fnDomCatcher();this.dom.collection=this._fnDomCollection(); +this.dom.background=this._fnDomBackground();this._fnAddGroups();this._fnAddButtons();c=0;for(f=this.s.dt.aoColumns.length;c<f;c++)this.s.abOriginal.push(this.s.dt.aoColumns[c].bVisible);this.s.dt.aoDrawCallback.push({fn:function(){b._fnDrawCallback.call(b)},sName:"ColVis"});d(this.s.dt.oInstance).bind("column-reorder.dt",function(a,d,e){c=0;for(f=b.s.aiExclude.length;c<f;c++)b.s.aiExclude[c]=e.aiInvertMapping[b.s.aiExclude[c]];a=b.s.abOriginal.splice(e.iFrom,1)[0];b.s.abOriginal.splice(e.iTo,0,a); +b.fnRebuild()});d(this.s.dt.oInstance).bind("destroy.dt",function(){d(b.dom.wrapper).remove()});this._fnDrawCallback()},_fnApplyCustomisation:function(a){d.extend(!0,this.s,e.defaults,a);!this.s.showAll&&this.s.bShowAll&&(this.s.showAll=this.s.sShowAll);!this.s.restore&&this.s.bRestore&&(this.s.restore=this.s.sRestore);var a=this.s.groups,b=this.s.aoGroups;if(a)for(var c=0,f=a.length;c<f;c++)if(a[c].title&&(b[c].sTitle=a[c].title),a[c].columns)b[c].aiColumns=a[c].columns},_fnDrawCallback:function(){for(var a= +this.s.dt.aoColumns,b=this.dom.buttons,c=this.s.aoGroups,f,g=0,h=b.length;g<h;g++)f=b[g],f.__columnIdx!==k&&d("input",f).prop("checked",a[f.__columnIdx].bVisible);b=0;for(f=c.length;b<f;b++){a:{for(var g=c[b].aiColumns,h=0,e=g.length;h<e;h++)if(!1===a[g[h]].bVisible){g=!1;break a}g=!0}if(g)d("input",this.dom.groupButtons[b]).prop("checked",!0),d("input",this.dom.groupButtons[b]).prop("indeterminate",!1);else{a:{g=c[b].aiColumns;h=0;for(e=g.length;h<e;h++)if(!0===a[g[h]].bVisible){g=!1;break a}g=!0}g? +(d("input",this.dom.groupButtons[b]).prop("checked",!1),d("input",this.dom.groupButtons[b]).prop("indeterminate",!1)):d("input",this.dom.groupButtons[b]).prop("indeterminate",!0)}}},_fnAddGroups:function(){var a;if("undefined"!=typeof this.s.aoGroups)for(var b=0,c=this.s.aoGroups.length;b<c;b++)a=this._fnDomGroupButton(b),this.dom.groupButtons.push(a),this.dom.buttons.push(a),this.dom.collection.appendChild(a)},_fnAddButtons:function(){var a,b=this.s.dt.aoColumns;if(-1===d.inArray("all",this.s.aiExclude))for(var c= +0,f=b.length;c<f;c++)-1===d.inArray(c,this.s.aiExclude)&&(a=this._fnDomColumnButton(c),a.__columnIdx=c,this.dom.buttons.push(a));"alpha"===this.s.order&&this.dom.buttons.sort(function(a,c){var d=b[a.__columnIdx].sTitle,f=b[c.__columnIdx].sTitle;return d===f?0:d<f?-1:1});this.s.restore&&(a=this._fnDomRestoreButton(),a.className+=" ColVis_Restore",this.dom.buttons.push(a));this.s.showAll&&(a=this._fnDomShowXButton(this.s.showAll,!0),a.className+=" ColVis_ShowAll",this.dom.buttons.push(a));this.s.showNone&& +(a=this._fnDomShowXButton(this.s.showNone,!1),a.className+=" ColVis_ShowNone",this.dom.buttons.push(a));d(this.dom.collection).append(this.dom.buttons)},_fnDomRestoreButton:function(){var a=this;return d('<li class="ColVis_Special '+(this.s.dt.bJUI?"ui-button ui-state-default":"")+'">'+this.s.restore+"</li>").click(function(){for(var b=0,c=a.s.abOriginal.length;b<c;b++)a.s.dt.oInstance.fnSetColumnVis(b,a.s.abOriginal[b],!1);a._fnAdjustOpenRows();a.s.dt.oInstance.fnAdjustColumnSizing(!1);a.s.dt.oInstance.fnDraw(!1)})[0]}, +_fnDomShowXButton:function(a,b){var c=this;return d('<li class="ColVis_Special '+(this.s.dt.bJUI?"ui-button ui-state-default":"")+'">'+a+"</li>").click(function(){for(var a=0,d=c.s.abOriginal.length;a<d;a++)-1===c.s.aiExclude.indexOf(a)&&c.s.dt.oInstance.fnSetColumnVis(a,b,!1);c._fnAdjustOpenRows();c.s.dt.oInstance.fnAdjustColumnSizing(!1);c.s.dt.oInstance.fnDraw(!1)})[0]},_fnDomGroupButton:function(a){var b=this,c=this.s.aoGroups[a];return d('<li class="ColVis_Special '+(this.s.dt.bJUI?"ui-button ui-state-default": +"")+'"><label><input type="checkbox" /><span>'+c.sTitle+"</span></label></li>").click(function(a){var g=!d("input",this).is(":checked");"li"!==a.target.nodeName.toLowerCase()&&(g=!g);for(a=0;a<c.aiColumns.length;a++)b.s.dt.oInstance.fnSetColumnVis(c.aiColumns[a],g)})[0]},_fnDomColumnButton:function(a){var b=this,c=this.s.dt.aoColumns[a],f=this.s.dt,c=null===this.s.fnLabel?c.sTitle:this.s.fnLabel(a,c.sTitle,c.nTh);return d("<li "+(f.bJUI?'class="ui-button ui-state-default"':"")+'><label><input type="checkbox" /><span>'+ +c+"</span></label></li>").click(function(c){var e=!d("input",this).is(":checked");if("li"!==c.target.nodeName.toLowerCase()&&("input"==c.target.nodeName.toLowerCase()||null===b.s.fnStateChange))e=!e;var i=d.fn.dataTableExt.iApiIndex;d.fn.dataTableExt.iApiIndex=b._fnDataTablesApiIndex.call(b);f.oFeatures.bServerSide?(b.s.dt.oInstance.fnSetColumnVis(a,e,!1),b.s.dt.oInstance.fnAdjustColumnSizing(!1),(""!==f.oScroll.sX||""!==f.oScroll.sY)&&b.s.dt.oInstance.oApi._fnScrollDraw(b.s.dt),b._fnDrawCallback()): +b.s.dt.oInstance.fnSetColumnVis(a,e);d.fn.dataTableExt.iApiIndex=i;null!==b.s.fnStateChange&&("span"==c.target.nodeName.toLowerCase()&&c.preventDefault(),b.s.fnStateChange.call(b,a,e))})[0]},_fnDataTablesApiIndex:function(){for(var a=0,b=this.s.dt.oInstance.length;a<b;a++)if(this.s.dt.oInstance[a]==this.s.dt.nTable)return a;return 0},_fnDomCollection:function(){return d("<ul />",{"class":!this.s.dt.bJUI?"ColVis_collection":"ColVis_collection ui-buttonset ui-buttonset-multi"}).css({display:"none", +opacity:0,position:!this.s.bCssPosition?"absolute":""})[0]},_fnDomCatcher:function(){var a=this,b=i.createElement("div");b.className="ColVis_catcher";d(b).click(function(){a._fnCollectionHide.call(a,null,null)});return b},_fnDomBackground:function(){var a=this,b=d("<div></div>").addClass("ColVis_collectionBackground").css("opacity",0).click(function(){a._fnCollectionHide.call(a,null,null)});"mouseover"==this.s.activate&&b.mouseover(function(){a.s.overcollection=!1;a._fnCollectionHide.call(a,null, +null)});return b[0]},_fnCollectionShow:function(){var a=this,b;b=d(this.dom.button).offset();var c=this.dom.collection,f=this.dom.background,e=parseInt(b.left,10),h=parseInt(b.top+d(this.dom.button).outerHeight(),10);this.s.bCssPosition||(c.style.top=h+"px",c.style.left=e+"px");d(c).css({display:"block",opacity:0});f.style.bottom="0px";f.style.right="0px";h=this.dom.catcher.style;h.height=d(this.dom.button).outerHeight()+"px";h.width=d(this.dom.button).outerWidth()+"px";h.top=b.top+"px";h.left=e+ +"px";i.body.appendChild(f);i.body.appendChild(c);i.body.appendChild(this.dom.catcher);d(c).animate({opacity:1},a.s.iOverlayFade);d(f).animate({opacity:0.1},a.s.iOverlayFade,"linear",function(){d.browser&&(d.browser.msie&&d.browser.version=="6.0")&&a._fnDrawCallback()});this.s.bCssPosition||(b="left"==this.s.sAlign?e:e-d(c).outerWidth()+d(this.dom.button).outerWidth(),c.style.left=b+"px",f=d(c).outerWidth(),d(c).outerHeight(),e=d(i).width(),b+f>e&&(c.style.left=e-f+"px"));this.s.hidden=!1},_fnCollectionHide:function(){var a= +this;!this.s.hidden&&null!==this.dom.collection&&(this.s.hidden=!0,d(this.dom.collection).animate({opacity:0},a.s.iOverlayFade,function(){this.style.display="none"}),d(this.dom.background).animate({opacity:0},a.s.iOverlayFade,function(){i.body.removeChild(a.dom.background);i.body.removeChild(a.dom.catcher)}))},_fnAdjustOpenRows:function(){for(var a=this.s.dt.aoOpenRows,b=this.s.dt.oApi._fnVisbleColumns(this.s.dt),c=0,d=a.length;c<d;c++)a[c].nTr.getElementsByTagName("td")[0].colSpan=b}};e.fnRebuild= +function(a){var b=null;"undefined"!=typeof a&&(b=d.fn.dataTable.Api?(new d.fn.dataTable.Api(a)).table().node():a.fnSettings().nTable);for(var c=0,f=e.aInstances.length;c<f;c++)("undefined"==typeof a||b==e.aInstances[c].s.dt.nTable)&&e.aInstances[c].fnRebuild()};e.defaults={active:"click",buttonText:"Show / hide columns",aiExclude:[],bRestore:!1,sRestore:"Restore original",bShowAll:!1,sShowAll:"Show All",sAlign:"left",fnStateChange:null,iOverlayFade:500,fnLabel:null,bCssPosition:!1,aoGroups:[],order:"column"}; +e.aInstances=[];e.prototype.CLASS="ColVis";e.VERSION="1.1.2";e.prototype.VERSION=e.VERSION;"function"==typeof d.fn.dataTable&&"function"==typeof d.fn.dataTableExt.fnVersionCheck&&d.fn.dataTableExt.fnVersionCheck("1.7.0")?d.fn.dataTableExt.aoFeatures.push({fnInit:function(a){var b=a.oInit;return(new e(a,b.colVis||b.oColVis||{})).button()},cFeature:"C",sFeature:"ColVis"}):alert("Warning: ColVis requires DataTables 1.7 or greater - www.datatables.net/download");d.fn.dataTable.ColVis=e;return d.fn.DataTable.ColVis= +e};"function"===typeof define&&define.amd?define(["jquery","datatables"],j):"object"===typeof exports?j(require("jquery"),require("datatables")):jQuery&&!jQuery.fn.dataTable.ColVis&&j(jQuery,jQuery.fn.dataTable)})(window,document); diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedColumns/License.txt b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/License.txt new file mode 100644 index 0000000..9ade2f1 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/License.txt @@ -0,0 +1,20 @@ +Copyright (c) 2010-2015 SpryMedia Limited +http://datatables.net + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedColumns/Readme.md b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/Readme.md new file mode 100644 index 0000000..15d64c3 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/Readme.md @@ -0,0 +1,42 @@ +# FixedColumns + +When making use of DataTables' x-axis scrolling feature (`scrollX`), you may wish to fix the left or right most columns in place. This plug-in for DataTables provides exactly this option (for non-scrolling tables, please use the FixedHeader plug-in, which can fix headers, footers and columns). Key features include: + +* Freezes the left most column to the side of the table +* Option to freeze two or more columns +* Full integration with DataTables' scrolling options + + +# Installation + +To use FixedColumns, first download DataTables ( http://datatables.net/download ) and place the unzipped FixedColumns package into a `extensions` directory in the DataTables package. This will allow the pages in the examples to operate correctly. To see the examples running, open the `examples` directory in your web-browser. + + +# Basic usage + +FixedColumns is initialised using the `$.fn.dataTable.FixedColumns()` constructor. For example: + +```js +$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: "300px", + scrollX: true, + scrollCollapse: true, + paging: false + } ); + + new $.fn.dataTable.FixedColumns( table ); +} ); +``` + + +# Documentation / support + +* Documentation: http://datatables.net/extensions/FixedColumns/ +* DataTables support forums: http://datatables.net/forums + + +# GitHub + +If you fancy getting involved with the development of FixedColumns and help make it better, please refer to its GitHub repo: https://github.com/DataTables/FixedColumns + diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedColumns/css/dataTables.fixedColumns.css b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/css/dataTables.fixedColumns.css new file mode 100644 index 0000000..0d6e18a --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/css/dataTables.fixedColumns.css @@ -0,0 +1,25 @@ + + +/* Block out what is behind the fixed column's header and footer */ +table.DTFC_Cloned thead, +table.DTFC_Cloned tfoot { + background-color: white; +} + +/* Block out the gap above the scrollbar on the right, when there is a fixed + * right column + */ +div.DTFC_Blocker { + background-color: white; +} + +div.DTFC_LeftWrapper table.dataTable, +div.DTFC_RightWrapper table.dataTable { + margin-bottom: 0; + z-index: 2; +} + +div.DTFC_LeftWrapper table.dataTable.no-footer, +div.DTFC_RightWrapper table.dataTable.no-footer { + border-bottom: none; +} diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedColumns/css/dataTables.fixedColumns.min.css b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/css/dataTables.fixedColumns.min.css new file mode 100644 index 0000000..71e801b --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/css/dataTables.fixedColumns.min.css @@ -0,0 +1 @@ +table.DTFC_Cloned thead,table.DTFC_Cloned tfoot{background-color:white}div.DTFC_Blocker{background-color:white}div.DTFC_LeftWrapper table.dataTable,div.DTFC_RightWrapper table.dataTable{margin-bottom:0;z-index:2}div.DTFC_LeftWrapper table.dataTable.no-footer,div.DTFC_RightWrapper table.dataTable.no-footer{border-bottom:none} diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/bootstrap.html b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/bootstrap.html new file mode 100644 index 0000000..24ccd3e --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/bootstrap.html @@ -0,0 +1,819 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>FixedColumns example - Bootstrap</title> + <link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css"> + <link rel="stylesheet" type="text/css" href="../../Plugins/integration/bootstrap/3/dataTables.bootstrap.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + body { font-size: 140%; } + + /* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + width: 800px; + margin: 0 auto; + } + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script> + <script type="text/javascript" language="javascript" src="../../Plugins/integration/bootstrap/3/dataTables.bootstrap.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: "300px", + scrollX: true, + scrollCollapse: true, + paging: false + } ); + new $.fn.dataTable.FixedColumns( table ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>FixedColumns example <span>Bootstrap</span></h1> + + <div class="info"> + <p>When displaying a table which scrolls along the x-axis, it can sometimes be useful to the end user for the left most column to be fixed in place, if it shows + grouping, index or similar information. This is basically the same idea as 'freeze columns' in Excel. This can be achieved with the FixedColumns plug-in for + DataTables, as shown below.</p> + + <p>Note that FixedColumns is suitable only for use with the scrolling features in <a href="http://datatables.net">DataTables</a>. If you want to achieve a similar + effect without scrolling enabled, please checkout <a href="http://datatables.net/plug-ins">FixedHeader</a>, also for DataTables.</p> + + <p>FixedColumns is initialised using the constructor <code>new $.fn.dataTable.FixedColumns();</code> - shown below.</p> + </div> + + <table id="example" class="table table-striped table-bordered" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: &quot;300px&quot;, + scrollX: true, + scrollCollapse: true, + paging: false + } ); + new $.fn.dataTable.FixedColumns( table ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li> + <li><a href="../../Plugins/integration/bootstrap/3/dataTables.bootstrap.js">../../Plugins/integration/bootstrap/3/dataTables.bootstrap.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">body { font-size: 140%; } + + /* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + width: 800px; + margin: 0 auto; + }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css</a></li> + <li><a href="../../Plugins/integration/bootstrap/3/dataTables.bootstrap.css">../../Plugins/integration/bootstrap/3/dataTables.bootstrap.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./left_right_columns.html">Left and right fixed columns</a></li> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./two_columns.html">Multiple fixed columns</a></li> + <li><a href="./right_column.html">Right column only</a></li> + <li><a href="./rowspan.html">Complex headers</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./server-side-processing.html">Server-side processing</a></li> + <li><a href="./css_size.html">CSS row sizing</a></li> + <li><a href="./size_fixed.html">Assigned column width</a></li> + <li><a href="./size_fluid.html">Fluid column width</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li class="active"><a href="./bootstrap.html">Bootstrap</a></li> + <li><a href="./index_column.html">Index column</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/col_filter.html b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/col_filter.html new file mode 100644 index 0000000..6220d8f --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/col_filter.html @@ -0,0 +1,857 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>FixedColumns example - Individual column filtering</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + /* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + width: 800px; + margin: 0 auto; + } + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + // Setup - add a text input to each footer cell + $('#example tfoot th').each( function () { + var title = $('#example thead th').eq( $(this).index() ).text(); + $(this).html( '<input type="text" placeholder="Search '+title+'" />' ); + } ); + + // DataTable + var table = $('#example').DataTable( { + scrollY: "300px", + scrollX: true, + scrollCollapse: true, + paging: false + } ); + + // Apply the filter + table.columns().indexes().each( function (idx) { + $( 'input', table.column( idx ).footer() ).on( 'keyup change', function () { + table + .column( idx ) + .search( this.value ) + .draw(); + } ); + } ); + + new $.fn.dataTable.FixedColumns( table ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>FixedColumns example <span>Individual column filtering</span></h1> + + <div class="info"> + <p>This example shows FixedColumns being configured with individual column filtering abilities. Note that the event handler for the filtering is applied to the + <code class="tag" title="HTML tag">input</code> elements before FixedColumns is initialised, so when FixedColumns clones nodes it also copies the event.</p> + </div> + + <table id="example" class="stripe row-border order-column" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + // Setup - add a text input to each footer cell + $('#example tfoot th').each( function () { + var title = $('#example thead th').eq( $(this).index() ).text(); + $(this).html( '&lt;input type=&quot;text&quot; placeholder=&quot;Search '+title+'&quot; /&gt;' ); + } ); + + // DataTable + var table = $('#example').DataTable( { + scrollY: &quot;300px&quot;, + scrollX: true, + scrollCollapse: true, + paging: false + } ); + + // Apply the filter + table.columns().indexes().each( function (idx) { + $( 'input', table.column( idx ).footer() ).on( 'keyup change', function () { + table + .column( idx ) + .search( this.value ) + .draw(); + } ); + } ); + + new $.fn.dataTable.FixedColumns( table ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + width: 800px; + margin: 0 auto; + }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./left_right_columns.html">Left and right fixed columns</a></li> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./two_columns.html">Multiple fixed columns</a></li> + <li><a href="./right_column.html">Right column only</a></li> + <li><a href="./rowspan.html">Complex headers</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./server-side-processing.html">Server-side processing</a></li> + <li><a href="./css_size.html">CSS row sizing</a></li> + <li><a href="./size_fixed.html">Assigned column width</a></li> + <li><a href="./size_fluid.html">Fluid column width</a></li> + <li class="active"><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./bootstrap.html">Bootstrap</a></li> + <li><a href="./index_column.html">Index column</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/colvis.html b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/colvis.html new file mode 100644 index 0000000..e5d0aa7 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/colvis.html @@ -0,0 +1,833 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>FixedColumns example - ColVis integration</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../../ColVis/css/dataTables.colVis.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + /* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + width: 800px; + margin: 0 auto; + } + + div.ColVis { + float: left; + } + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../../ColVis/js/dataTables.colVis.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable( { + dom: "Cfrtip", + scrollY: "300px", + scrollX: true, + scrollCollapse: true, + paging: false + } ); + + new $.fn.dataTable.FixedColumns( table, { + leftColumns: 2 + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>FixedColumns example <span>ColVis integration</span></h1> + + <div class="info"> + <p>FixedColumns operates with DataTables' built-in column visibility options (<a href="//datatables.net/reference/option/columns.visible"><code class="option" + title="DataTables initialisation option">columns.visible<span>DT</span></code></a> and <a href="//datatables.net/reference/api/column().visible()"><code class= + "api" title="DataTables API method">column().visible()<span>DT</span></code></a>), which columns that are hidden not being shown in the fixed columns. This + integration also means that FixedColumns works well with <a href="http://datatables.net/extensions/colvis">ColVis</a>, with columns that are dynamically shown and + hidden updated immediately in the fixed columns.</p> + + <p>The example below shows ColVis and FixedColumns working together. Two columns have been fixed on the left hand side of the table to show FixedColumns ability to + work effortlessly with column visibility.</p> + </div> + + <table id="example" class="stripe row-border order-column" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable( { + dom: &quot;Cfrtip&quot;, + scrollY: &quot;300px&quot;, + scrollX: true, + scrollCollapse: true, + paging: false + } ); + + new $.fn.dataTable.FixedColumns( table, { + leftColumns: 2 + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../../ColVis/js/dataTables.colVis.js">../../ColVis/js/dataTables.colVis.js</a></li> + <li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + width: 800px; + margin: 0 auto; + } + + div.ColVis { + float: left; + }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../../ColVis/css/dataTables.colVis.css">../../ColVis/css/dataTables.colVis.css</a></li> + <li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./left_right_columns.html">Left and right fixed columns</a></li> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./two_columns.html">Multiple fixed columns</a></li> + <li><a href="./right_column.html">Right column only</a></li> + <li><a href="./rowspan.html">Complex headers</a></li> + <li class="active"><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./server-side-processing.html">Server-side processing</a></li> + <li><a href="./css_size.html">CSS row sizing</a></li> + <li><a href="./size_fixed.html">Assigned column width</a></li> + <li><a href="./size_fluid.html">Fluid column width</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./bootstrap.html">Bootstrap</a></li> + <li><a href="./index_column.html">Index column</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/css_size.html b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/css_size.html new file mode 100644 index 0000000..dfa525e --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/css_size.html @@ -0,0 +1,828 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>FixedColumns example - CSS row sizing</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + /* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + width: 800px; + margin: 0 auto; + } + + tr { height: 50px; } + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: "300px", + scrollX: true, + scrollCollapse: true, + paging: false + } ); + + new $.fn.dataTable.FixedColumns( table, { + heightMatch: 'none' + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>FixedColumns example <span>CSS row sizing</span></h1> + + <div class="info"> + <p>Because of the method FixedColumns uses to display the fixed columns, an important consideration is the alignment of the rows due to different heights in the + individual rows of the table. There are two different algorithms in FixedColumns which can be used, or you can switch off automatic row sizing all together. This + is controlled through the <code>heightMatch</code> parameter. If can take the following values:</p> + + <ul class="markdown"> + <li><code class="string" title="String">none</code> - no automatic row height matching is performed. CSS can be used in this case and is useful when speed is + of primary importance.</li> + <li><code class="string" title="String">semiauto</code> (default) - the height calculation will be performed once, and the result cached to be used again + (<code>fnRecalculateHeight</code> can be used to force recalculation)</li> + <li><code class="string" title="String">auto</code> - height matching is performed on every draw (slowest but must accurate)</li> + </ul> + + <p>This example shows row height matching switched off but there is a CSS statement of <code>tr { height: 50px }</code> to force all rows to the same height.</p> + </div> + + <table id="example" class="stripe row-border order-column" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: &quot;300px&quot;, + scrollX: true, + scrollCollapse: true, + paging: false + } ); + + new $.fn.dataTable.FixedColumns( table, { + heightMatch: 'none' + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + width: 800px; + margin: 0 auto; + } + + tr { height: 50px; }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./left_right_columns.html">Left and right fixed columns</a></li> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./two_columns.html">Multiple fixed columns</a></li> + <li><a href="./right_column.html">Right column only</a></li> + <li><a href="./rowspan.html">Complex headers</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./server-side-processing.html">Server-side processing</a></li> + <li class="active"><a href="./css_size.html">CSS row sizing</a></li> + <li><a href="./size_fixed.html">Assigned column width</a></li> + <li><a href="./size_fluid.html">Fluid column width</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./bootstrap.html">Bootstrap</a></li> + <li><a href="./index_column.html">Index column</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/index.html b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/index.html new file mode 100644 index 0000000..7cb9a05 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/index.html @@ -0,0 +1,74 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + + <title>FixedColumns examples - FixedColumns examples</title> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>FixedColumns example <span>FixedColumns examples</span></h1> + + <div class="info"> + <p>When making use of DataTables' x-axis scrolling feature (<a href="//datatables.net/reference/option/scrollX"><code class="option" title= + "DataTables initialisation option">scrollX<span>DT</span></code></a>), you may wish to fix the left or right most columns in place. This extension for DataTables + provides exactly this option (for non-scrolling tables, please use the <a href="//datatables.net/extensions/fixedheader">FixedHeader extension</a>, which can fix + headers, footers and columns). Key features include:</p> + + <ul class="markdown"> + <li>Freezes the left most column to the side of the table</li> + <li>Option to freeze two or more columns</li> + <li>Full integration with DataTables' scrolling options</li> + </ul> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc"> + <li><a href="./left_right_columns.html">Left and right fixed columns</a></li> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./two_columns.html">Multiple fixed columns</a></li> + <li><a href="./right_column.html">Right column only</a></li> + <li><a href="./rowspan.html">Complex headers</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./server-side-processing.html">Server-side processing</a></li> + <li><a href="./css_size.html">CSS row sizing</a></li> + <li><a href="./size_fixed.html">Assigned column width</a></li> + <li><a href="./size_fluid.html">Fluid column width</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./bootstrap.html">Bootstrap</a></li> + <li><a href="./index_column.html">Index column</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/index_column.html b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/index_column.html new file mode 100644 index 0000000..e61073e --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/index_column.html @@ -0,0 +1,932 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>FixedColumns example - Index column</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + /* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + width: 800px; + margin: 0 auto; + } + + /* Styling for the index columns */ + th.index, + td.index { + background-color: white !important; + border-top: 1px solid white !important; + border-bottom: none !important; + } + div.DTFC_LeftHeadWrapper table { + border-bottom: 1px solid white !important; + } + div.DTFC_LeftHeadWrapper th { + border-bottom: 1px solid white !important; + } + div.DTFC_LeftBodyWrapper { + border-right: 1px solid black; + } + div.DTFC_LeftFootWrapper th { + border-top: 1px solid white !important; + } + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: "300px", + scrollX: true, + scrollCollapse: true, + paging: false, + columnDefs: [ { + sortable: false, + "class": "index", + targets: 0 + } ], + order: [[ 1, 'asc' ]] + } ); + + table.on( 'order.dt search.dt', function () { + table.column(0, {search:'applied', order:'applied'}).nodes().each( function (cell, i) { + cell.innerHTML = i+1; + } ); + } ).draw(); + + new $.fn.dataTable.FixedColumns( table ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>FixedColumns example <span>Index column</span></h1> + + <div class="info"> + <p>A typical interaction to want to perform with a fixed column, is an index column. A method for how this can be achieved with FixedColumns is shown in this + example, building on the <a href="http://datatables.net/examples/api/counter_column">index column</a> example for DataTables. Also shown in this example is how the + fixed column can be styled with CSS to show it more prominently.</p> + </div> + + <table id="example" class="stripe row-border order-column" cellspacing="0" width="100%"> + <thead> + <tr> + <th></th> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td></td> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td></td> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: &quot;300px&quot;, + scrollX: true, + scrollCollapse: true, + paging: false, + columnDefs: [ { + sortable: false, + &quot;class&quot;: &quot;index&quot;, + targets: 0 + } ], + order: [[ 1, 'asc' ]] + } ); + + table.on( 'order.dt search.dt', function () { + table.column(0, {search:'applied', order:'applied'}).nodes().each( function (cell, i) { + cell.innerHTML = i+1; + } ); + } ).draw(); + + new $.fn.dataTable.FixedColumns( table ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + width: 800px; + margin: 0 auto; + } + + /* Styling for the index columns */ + th.index, + td.index { + background-color: white !important; + border-top: 1px solid white !important; + border-bottom: none !important; + } + div.DTFC_LeftHeadWrapper table { + border-bottom: 1px solid white !important; + } + div.DTFC_LeftHeadWrapper th { + border-bottom: 1px solid white !important; + } + div.DTFC_LeftBodyWrapper { + border-right: 1px solid black; + } + div.DTFC_LeftFootWrapper th { + border-top: 1px solid white !important; + }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./left_right_columns.html">Left and right fixed columns</a></li> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./two_columns.html">Multiple fixed columns</a></li> + <li><a href="./right_column.html">Right column only</a></li> + <li><a href="./rowspan.html">Complex headers</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./server-side-processing.html">Server-side processing</a></li> + <li><a href="./css_size.html">CSS row sizing</a></li> + <li><a href="./size_fixed.html">Assigned column width</a></li> + <li><a href="./size_fluid.html">Fluid column width</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./bootstrap.html">Bootstrap</a></li> + <li class="active"><a href="./index_column.html">Index column</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/left_right_columns.html b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/left_right_columns.html new file mode 100644 index 0000000..f92789c --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/left_right_columns.html @@ -0,0 +1,816 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>FixedColumns example - Left and right fixed columns</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + /* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + width: 800px; + margin: 0 auto; + } + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: "300px", + scrollX: true, + scrollCollapse: true, + paging: false + } ); + + new $.fn.dataTable.FixedColumns( table, { + leftColumns: 1, + rightColumns: 1 + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>FixedColumns example <span>Left and right fixed columns</span></h1> + + <div class="info"> + <p>FixedColumns allows columns to be fixed from both the left and right hand sides of the table. Fixing right hand-side columns is done by using the + <code>rightColumns</code> initialisation parameter, which works just the same as <code>leftColumns</code> does for the left side of the table. This example shows + both the left and right columns being fixed in place.</p> + </div> + + <table id="example" class="stripe row-border order-column" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: &quot;300px&quot;, + scrollX: true, + scrollCollapse: true, + paging: false + } ); + + new $.fn.dataTable.FixedColumns( table, { + leftColumns: 1, + rightColumns: 1 + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + width: 800px; + margin: 0 auto; + }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li class="active"><a href="./left_right_columns.html">Left and right fixed columns</a></li> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./two_columns.html">Multiple fixed columns</a></li> + <li><a href="./right_column.html">Right column only</a></li> + <li><a href="./rowspan.html">Complex headers</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./server-side-processing.html">Server-side processing</a></li> + <li><a href="./css_size.html">CSS row sizing</a></li> + <li><a href="./size_fixed.html">Assigned column width</a></li> + <li><a href="./size_fluid.html">Fluid column width</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./bootstrap.html">Bootstrap</a></li> + <li><a href="./index_column.html">Index column</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/right_column.html b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/right_column.html new file mode 100644 index 0000000..d6bf0f8 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/right_column.html @@ -0,0 +1,816 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>FixedColumns example - Right column only</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + /* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + width: 800px; + margin: 0 auto; + } + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: "300px", + scrollX: true, + scrollCollapse: true, + paging: false + } ); + + new $.fn.dataTable.FixedColumns( table, { + leftColumns: 0, + rightColumns: 1 + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>FixedColumns example <span>Right column only</span></h1> + + <div class="info"> + <p>FixedColumns has the ability to freeze columns on both the left and right hand sides of the table. By default it will fix the first column on the left, but + using the initialisation parameters <code>leftColumns</code> and <code>rightColumns</code> you can alter this to fix the columns on the right as well. This example + shows a single column fixed in place, in this case the right most column.</p> + </div> + + <table id="example" class="stripe row-border order-column" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: &quot;300px&quot;, + scrollX: true, + scrollCollapse: true, + paging: false + } ); + + new $.fn.dataTable.FixedColumns( table, { + leftColumns: 0, + rightColumns: 1 + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + width: 800px; + margin: 0 auto; + }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./left_right_columns.html">Left and right fixed columns</a></li> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./two_columns.html">Multiple fixed columns</a></li> + <li class="active"><a href="./right_column.html">Right column only</a></li> + <li><a href="./rowspan.html">Complex headers</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./server-side-processing.html">Server-side processing</a></li> + <li><a href="./css_size.html">CSS row sizing</a></li> + <li><a href="./size_fixed.html">Assigned column width</a></li> + <li><a href="./size_fluid.html">Fluid column width</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./bootstrap.html">Bootstrap</a></li> + <li><a href="./index_column.html">Index column</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/rowspan.html b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/rowspan.html new file mode 100644 index 0000000..08085e6 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/rowspan.html @@ -0,0 +1,657 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>FixedColumns example - Complex headers</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + /* Ensure that the demo table scrolls */ + th, td { + white-space: nowrap; + padding-left: 40px !important; + padding-right: 40px !important; + } + div.dataTables_wrapper { + width: 800px; + margin: 0 auto; + } + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: "300px", + scrollX: true, + scrollCollapse: true, + paging: false + } ); + new $.fn.dataTable.FixedColumns( table ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>FixedColumns example <span>Complex headers</span></h1> + + <div class="info"> + <p>If you are using multiple rows in the table header, it can be useful to have a rowspanning cell on the column(s) you have fixed in place - equally at other + times it can be useful to not and make use of the two or more cells per column. FixedColumns builds on the complex header support in DataTables to make this + trivial to use in FixedColumns. Just initialise your FixedColumns instance as you normally would!</p> + </div> + + <table id="example" class="stripe row-border order-column" cellspacing="0" width="100%"> + <thead> + <tr> + <th rowspan="2">Name</th> + <th colspan="2">HR Information</th> + <th colspan="3">Contact</th> + </tr> + <tr> + <th>Position</th> + <th>Salary</th> + <th>Office</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Salary</th> + <th>Office</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>$320,800</td> + <td>Edinburgh</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>$170,750</td> + <td>Tokyo</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>$86,000</td> + <td>San Francisco</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>$433,060</td> + <td>Edinburgh</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>$162,700</td> + <td>Tokyo</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>$372,000</td> + <td>New York</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>$137,500</td> + <td>San Francisco</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>$327,900</td> + <td>Tokyo</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>$205,500</td> + <td>San Francisco</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>$103,600</td> + <td>Edinburgh</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>$90,560</td> + <td>London</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>$342,000</td> + <td>Edinburgh</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>$470,600</td> + <td>San Francisco</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>$313,500</td> + <td>London</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>$385,750</td> + <td>London</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>$198,500</td> + <td>London</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>$725,000</td> + <td>New York</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>$237,500</td> + <td>New York</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>$132,000</td> + <td>London</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>$217,500</td> + <td>Edinburgh</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>$345,000</td> + <td>New York</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>$675,000</td> + <td>New York</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>$106,450</td> + <td>New York</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>$85,600</td> + <td>Sidney</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>$1,200,000</td> + <td>London</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>$92,575</td> + <td>Edinburgh</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>$357,650</td> + <td>Singapore</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>$206,850</td> + <td>San Francisco</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>$850,000</td> + <td>San Francisco</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>$163,000</td> + <td>Tokyo</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>$95,400</td> + <td>Sidney</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>$114,500</td> + <td>London</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>$145,000</td> + <td>London</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>$235,500</td> + <td>San Francisco</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>$324,050</td> + <td>Edinburgh</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>$85,675</td> + <td>San Francisco</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>$164,500</td> + <td>San Francisco</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>$109,850</td> + <td>San Francisco</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>$452,500</td> + <td>San Francisco</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>$136,200</td> + <td>London</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>$645,750</td> + <td>New York</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>$234,500</td> + <td>Singapore</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>$163,500</td> + <td>London</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>$139,575</td> + <td>Tokyo</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>$98,540</td> + <td>New York</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>$87,500</td> + <td>San Francisco</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>$138,575</td> + <td>Singapore</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>$125,250</td> + <td>New York</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>$115,000</td> + <td>San Francisco</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>$75,650</td> + <td>Edinburgh</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>$145,600</td> + <td>New York</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>$356,250</td> + <td>London</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>$103,500</td> + <td>London</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>$86,500</td> + <td>San Francisco</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>$183,000</td> + <td>Edinburgh</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>$183,000</td> + <td>Singapore</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>$112,000</td> + <td>New York</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: &quot;300px&quot;, + scrollX: true, + scrollCollapse: true, + paging: false + } ); + new $.fn.dataTable.FixedColumns( table ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */ + th, td { + white-space: nowrap; + padding-left: 40px !important; + padding-right: 40px !important; + } + div.dataTables_wrapper { + width: 800px; + margin: 0 auto; + }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./left_right_columns.html">Left and right fixed columns</a></li> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./two_columns.html">Multiple fixed columns</a></li> + <li><a href="./right_column.html">Right column only</a></li> + <li class="active"><a href="./rowspan.html">Complex headers</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./server-side-processing.html">Server-side processing</a></li> + <li><a href="./css_size.html">CSS row sizing</a></li> + <li><a href="./size_fixed.html">Assigned column width</a></li> + <li><a href="./size_fluid.html">Fluid column width</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./bootstrap.html">Bootstrap</a></li> + <li><a href="./index_column.html">Index column</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/server-side-processing.html b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/server-side-processing.html new file mode 100644 index 0000000..0d976b9 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/server-side-processing.html @@ -0,0 +1,204 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>FixedColumns example - Server-side processing</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + /* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + width: 600px; + margin: 0 auto; + } + + /* Lots of padding for the cells as SSP has limited data in the demo */ + th, + td { + padding-left: 40px !important; + padding-right: 40px !important; + } + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: "300px", + scrollX: true, + scrollCollapse: true, + ajax: "../../../examples/server_side/scripts/server_processing.php", + serverSide: true + } ); + new $.fn.dataTable.FixedColumns( table ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>FixedColumns example <span>Server-side processing</span></h1> + + <div class="info"> + <p>This example shows how FixedColumns can be used with server-side processing in DataTables to cope with very large tables. No special considerations are + required, just initialise FixedColumns as you normally would!</p> + + <p>Note that the table width is constrained in this example to allow scrolling to occur as the server-side processing data set has a limited number of columns in + this demo!</p> + </div> + + <table id="example" class="stripe row-border order-column" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Extn.</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Extn.</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: &quot;300px&quot;, + scrollX: true, + scrollCollapse: true, + ajax: &quot;../../../examples/server_side/scripts/server_processing.php&quot;, + serverSide: true + } ); + new $.fn.dataTable.FixedColumns( table ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + width: 600px; + margin: 0 auto; + } + + /* Lots of padding for the cells as SSP has limited data in the demo */ + th, + td { + padding-left: 40px !important; + padding-right: 40px !important; + }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./left_right_columns.html">Left and right fixed columns</a></li> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./two_columns.html">Multiple fixed columns</a></li> + <li><a href="./right_column.html">Right column only</a></li> + <li><a href="./rowspan.html">Complex headers</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li class="active"><a href="./server-side-processing.html">Server-side processing</a></li> + <li><a href="./css_size.html">CSS row sizing</a></li> + <li><a href="./size_fixed.html">Assigned column width</a></li> + <li><a href="./size_fluid.html">Fluid column width</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./bootstrap.html">Bootstrap</a></li> + <li><a href="./index_column.html">Index column</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/simple.html b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/simple.html new file mode 100644 index 0000000..c5b0dcb --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/simple.html @@ -0,0 +1,813 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>FixedColumns example - Basic initialisation</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + /* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + width: 800px; + margin: 0 auto; + } + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: "300px", + scrollX: true, + scrollCollapse: true, + paging: false + } ); + new $.fn.dataTable.FixedColumns( table ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>FixedColumns example <span>Basic initialisation</span></h1> + + <div class="info"> + <p>When displaying a table which scrolls along the x-axis, it can sometimes be useful to the end user for the left most column to be fixed in place, if it shows + grouping, index or similar information. This is basically the same idea as 'freeze columns' in Excel. This can be achieved with the FixedColumns plug-in for + DataTables, as shown below.</p> + + <p>Note that FixedColumns is suitable only for use with the scrolling features in <a href="http://datatables.net">DataTables</a>. If you want to achieve a similar + effect without scrolling enabled, please checkout <a href="http://datatables.net/plug-ins">FixedHeader</a>, also for DataTables.</p> + + <p>FixedColumns is initialised using the constructor <code>new $.fn.dataTable.FixedColumns();</code> - shown below.</p> + </div> + + <table id="example" class="stripe row-border order-column" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: &quot;300px&quot;, + scrollX: true, + scrollCollapse: true, + paging: false + } ); + new $.fn.dataTable.FixedColumns( table ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + width: 800px; + margin: 0 auto; + }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./left_right_columns.html">Left and right fixed columns</a></li> + <li class="active"><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./two_columns.html">Multiple fixed columns</a></li> + <li><a href="./right_column.html">Right column only</a></li> + <li><a href="./rowspan.html">Complex headers</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./server-side-processing.html">Server-side processing</a></li> + <li><a href="./css_size.html">CSS row sizing</a></li> + <li><a href="./size_fixed.html">Assigned column width</a></li> + <li><a href="./size_fluid.html">Fluid column width</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./bootstrap.html">Bootstrap</a></li> + <li><a href="./index_column.html">Index column</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/size_fixed.html b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/size_fixed.html new file mode 100644 index 0000000..cc17c66 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/size_fixed.html @@ -0,0 +1,824 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>FixedColumns example - Assigned column width</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + /* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + margin: 0 auto; + } + + div.container { + width: 80%; + } + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').removeAttr('width').DataTable( { + scrollY: "300px", + scrollX: true, + scrollCollapse: true, + paging: false, + columnDefs: [ + { width: 200, targets: 0 } + ] + } ); + new $.fn.dataTable.FixedColumns( table ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>FixedColumns example <span>Assigned column width</span></h1> + + <div class="info"> + <p>The columns that are fixed in place by FixedColumns take their width from the parent DataTable. As such, the width of the column can be controlled using the + <a href="//datatables.net/reference/option/columns.width"><code class="option" title="DataTables initialisation option">columns.width<span>DT</span></code></a> + option.</p> + + <p>This example shows the first column being set to <code>width: 200px</code> (note that this is not pixel perfect in a table, the browser will make some + adjustments!), a width that is reflected in the fixed column. Resize the browser window horizontally and you will be able to see that the fixed column retains its + width while the scrolling viewport and the table resize.</p> + </div> + + <table id="example" class="stripe row-border order-column" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').removeAttr('width').DataTable( { + scrollY: &quot;300px&quot;, + scrollX: true, + scrollCollapse: true, + paging: false, + columnDefs: [ + { width: 200, targets: 0 } + ] + } ); + new $.fn.dataTable.FixedColumns( table ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + margin: 0 auto; + } + + div.container { + width: 80%; + }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./left_right_columns.html">Left and right fixed columns</a></li> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./two_columns.html">Multiple fixed columns</a></li> + <li><a href="./right_column.html">Right column only</a></li> + <li><a href="./rowspan.html">Complex headers</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./server-side-processing.html">Server-side processing</a></li> + <li><a href="./css_size.html">CSS row sizing</a></li> + <li class="active"><a href="./size_fixed.html">Assigned column width</a></li> + <li><a href="./size_fluid.html">Fluid column width</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./bootstrap.html">Bootstrap</a></li> + <li><a href="./index_column.html">Index column</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/size_fluid.html b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/size_fluid.html new file mode 100644 index 0000000..ee53388 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/size_fluid.html @@ -0,0 +1,824 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>FixedColumns example - Fluid column width</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + /* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + margin: 0 auto; + } + + div.container { + width: 80%; + } + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: "300px", + scrollX: true, + scrollCollapse: true, + paging: false, + columnDefs: [ + { width: '20%', targets: 0 } + ] + } ); + new $.fn.dataTable.FixedColumns( table ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>FixedColumns example <span>Fluid column width</span></h1> + + <div class="info"> + <p>The columns that are fixed in place by FixedColumns take their width from the parent DataTable. As such, the width of the column can be controlled using the + <a href="//datatables.net/reference/option/columns.width"><code class="option" title="DataTables initialisation option">columns.width<span>DT</span></code></a> + option.</p> + + <p>This example shows the first column being set to <code>width: 20%</code> (note that this is not pixel perfect in a table, the browser will make some + adjustments!), a width that is reflected in the fixed column. Resize the browser window horizontally and you will be able to see that the fixed column retains its + proportional width (again with a small margin dictated by the browser) in the resizing table.</p> + </div> + + <table id="example" class="stripe row-border order-column" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: &quot;300px&quot;, + scrollX: true, + scrollCollapse: true, + paging: false, + columnDefs: [ + { width: '20%', targets: 0 } + ] + } ); + new $.fn.dataTable.FixedColumns( table ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + margin: 0 auto; + } + + div.container { + width: 80%; + }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./left_right_columns.html">Left and right fixed columns</a></li> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./two_columns.html">Multiple fixed columns</a></li> + <li><a href="./right_column.html">Right column only</a></li> + <li><a href="./rowspan.html">Complex headers</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./server-side-processing.html">Server-side processing</a></li> + <li><a href="./css_size.html">CSS row sizing</a></li> + <li><a href="./size_fixed.html">Assigned column width</a></li> + <li class="active"><a href="./size_fluid.html">Fluid column width</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./bootstrap.html">Bootstrap</a></li> + <li><a href="./index_column.html">Index column</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/two_columns.html b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/two_columns.html new file mode 100644 index 0000000..6c3f233 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/examples/two_columns.html @@ -0,0 +1,810 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>FixedColumns example - Multiple fixed columns</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.fixedColumns.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + /* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + width: 800px; + margin: 0 auto; + } + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.fixedColumns.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: "300px", + scrollX: true, + scrollCollapse: true, + paging: false + } ); + new $.fn.dataTable.FixedColumns( table, { + leftColumns: 2 + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>FixedColumns example <span>Multiple fixed columns</span></h1> + + <div class="info"> + <p>FixedColumns allows more than one column to be frozen into place using the <code>leftColumns</code> parameter. The example below shows two columns fixed.</p> + </div> + + <table id="example" class="stripe row-border order-column" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: &quot;300px&quot;, + scrollX: true, + scrollCollapse: true, + paging: false + } ); + new $.fn.dataTable.FixedColumns( table, { + leftColumns: 2 + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.fixedColumns.js">../js/dataTables.fixedColumns.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">/* Ensure that the demo table scrolls */ + th, td { white-space: nowrap; } + div.dataTables_wrapper { + width: 800px; + margin: 0 auto; + }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.fixedColumns.css">../css/dataTables.fixedColumns.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./left_right_columns.html">Left and right fixed columns</a></li> + <li><a href="./simple.html">Basic initialisation</a></li> + <li class="active"><a href="./two_columns.html">Multiple fixed columns</a></li> + <li><a href="./right_column.html">Right column only</a></li> + <li><a href="./rowspan.html">Complex headers</a></li> + <li><a href="./colvis.html">ColVis integration</a></li> + <li><a href="./server-side-processing.html">Server-side processing</a></li> + <li><a href="./css_size.html">CSS row sizing</a></li> + <li><a href="./size_fixed.html">Assigned column width</a></li> + <li><a href="./size_fluid.html">Fluid column width</a></li> + <li><a href="./col_filter.html">Individual column filtering</a></li> + <li><a href="./bootstrap.html">Bootstrap</a></li> + <li><a href="./index_column.html">Index column</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedColumns/js/dataTables.fixedColumns.js b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/js/dataTables.fixedColumns.js new file mode 100644 index 0000000..33c98fa --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/js/dataTables.fixedColumns.js @@ -0,0 +1,1423 @@ +/*! FixedColumns 3.0.4 + * ©2010-2014 SpryMedia Ltd - datatables.net/license + */ + +/** + * @summary FixedColumns + * @description Freeze columns in place on a scrolling DataTable + * @version 3.0.4 + * @file dataTables.fixedColumns.js + * @author SpryMedia Ltd (www.sprymedia.co.uk) + * @contact www.sprymedia.co.uk/contact + * @copyright Copyright 2010-2014 SpryMedia Ltd. + * + * This source file is free software, available under the following license: + * MIT license - http://datatables.net/license/mit + * + * This source file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. + * + * For details please refer to: http://www.datatables.net + */ + + +(function(window, document, undefined) { + + +var factory = function( $, DataTable ) { +"use strict"; + +/** + * When making use of DataTables' x-axis scrolling feature, you may wish to + * fix the left most column in place. This plug-in for DataTables provides + * exactly this option (note for non-scrolling tables, please use the + * FixedHeader plug-in, which can fix headers, footers and columns). Key + * features include: + * + * * Freezes the left or right most columns to the side of the table + * * Option to freeze two or more columns + * * Full integration with DataTables' scrolling options + * * Speed - FixedColumns is fast in its operation + * + * @class + * @constructor + * @global + * @param {object} dt DataTables instance. With DataTables 1.10 this can also + * be a jQuery collection, a jQuery selector, DataTables API instance or + * settings object. + * @param {object} [init={}] Configuration object for FixedColumns. Options are + * defined by {@link FixedColumns.defaults} + * + * @requires jQuery 1.7+ + * @requires DataTables 1.8.0+ + * + * @example + * var table = $('#example').dataTable( { + * "scrollX": "100%" + * } ); + * new $.fn.dataTable.fixedColumns( table ); + */ +var FixedColumns = function ( dt, init ) { + var that = this; + + /* Sanity check - you just know it will happen */ + if ( ! ( this instanceof FixedColumns ) ) + { + alert( "FixedColumns warning: FixedColumns must be initialised with the 'new' keyword." ); + return; + } + + if ( typeof init == 'undefined' ) + { + init = {}; + } + + // Use the DataTables Hungarian notation mapping method, if it exists to + // provide forwards compatibility for camel case variables + var camelToHungarian = $.fn.dataTable.camelToHungarian; + if ( camelToHungarian ) { + camelToHungarian( FixedColumns.defaults, FixedColumns.defaults, true ); + camelToHungarian( FixedColumns.defaults, init ); + } + + // v1.10 allows the settings object to be got form a number of sources + var dtSettings = $.fn.dataTable.Api ? + new $.fn.dataTable.Api( dt ).settings()[0] : + dt.fnSettings(); + + /** + * Settings object which contains customisable information for FixedColumns instance + * @namespace + * @extends FixedColumns.defaults + * @private + */ + this.s = { + /** + * DataTables settings objects + * @type object + * @default Obtained from DataTables instance + */ + "dt": dtSettings, + + /** + * Number of columns in the DataTable - stored for quick access + * @type int + * @default Obtained from DataTables instance + */ + "iTableColumns": dtSettings.aoColumns.length, + + /** + * Original outer widths of the columns as rendered by DataTables - used to calculate + * the FixedColumns grid bounding box + * @type array.<int> + * @default [] + */ + "aiOuterWidths": [], + + /** + * Original inner widths of the columns as rendered by DataTables - used to apply widths + * to the columns + * @type array.<int> + * @default [] + */ + "aiInnerWidths": [] + }; + + + /** + * DOM elements used by the class instance + * @namespace + * @private + * + */ + this.dom = { + /** + * DataTables scrolling element + * @type node + * @default null + */ + "scroller": null, + + /** + * DataTables header table + * @type node + * @default null + */ + "header": null, + + /** + * DataTables body table + * @type node + * @default null + */ + "body": null, + + /** + * DataTables footer table + * @type node + * @default null + */ + "footer": null, + + /** + * Display grid elements + * @namespace + */ + "grid": { + /** + * Grid wrapper. This is the container element for the 3x3 grid + * @type node + * @default null + */ + "wrapper": null, + + /** + * DataTables scrolling element. This element is the DataTables + * component in the display grid (making up the main table - i.e. + * not the fixed columns). + * @type node + * @default null + */ + "dt": null, + + /** + * Left fixed column grid components + * @namespace + */ + "left": { + "wrapper": null, + "head": null, + "body": null, + "foot": null + }, + + /** + * Right fixed column grid components + * @namespace + */ + "right": { + "wrapper": null, + "head": null, + "body": null, + "foot": null + } + }, + + /** + * Cloned table nodes + * @namespace + */ + "clone": { + /** + * Left column cloned table nodes + * @namespace + */ + "left": { + /** + * Cloned header table + * @type node + * @default null + */ + "header": null, + + /** + * Cloned body table + * @type node + * @default null + */ + "body": null, + + /** + * Cloned footer table + * @type node + * @default null + */ + "footer": null + }, + + /** + * Right column cloned table nodes + * @namespace + */ + "right": { + /** + * Cloned header table + * @type node + * @default null + */ + "header": null, + + /** + * Cloned body table + * @type node + * @default null + */ + "body": null, + + /** + * Cloned footer table + * @type node + * @default null + */ + "footer": null + } + } + }; + + /* Attach the instance to the DataTables instance so it can be accessed easily */ + dtSettings._oFixedColumns = this; + + /* Let's do it */ + if ( ! dtSettings._bInitComplete ) + { + dtSettings.oApi._fnCallbackReg( dtSettings, 'aoInitComplete', function () { + that._fnConstruct( init ); + }, 'FixedColumns' ); + } + else + { + this._fnConstruct( init ); + } +}; + + + +FixedColumns.prototype = /** @lends FixedColumns.prototype */{ + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Public methods + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * Update the fixed columns - including headers and footers. Note that FixedColumns will + * automatically update the display whenever the host DataTable redraws. + * @returns {void} + * @example + * var table = $('#example').dataTable( { + * "scrollX": "100%" + * } ); + * var fc = new $.fn.dataTable.fixedColumns( table ); + * + * // at some later point when the table has been manipulated.... + * fc.fnUpdate(); + */ + "fnUpdate": function () + { + this._fnDraw( true ); + }, + + + /** + * Recalculate the resizes of the 3x3 grid that FixedColumns uses for display of the table. + * This is useful if you update the width of the table container. Note that FixedColumns will + * perform this function automatically when the window.resize event is fired. + * @returns {void} + * @example + * var table = $('#example').dataTable( { + * "scrollX": "100%" + * } ); + * var fc = new $.fn.dataTable.fixedColumns( table ); + * + * // Resize the table container and then have FixedColumns adjust its layout.... + * $('#content').width( 1200 ); + * fc.fnRedrawLayout(); + */ + "fnRedrawLayout": function () + { + this._fnColCalc(); + this._fnGridLayout(); + this.fnUpdate(); + }, + + + /** + * Mark a row such that it's height should be recalculated when using 'semiauto' row + * height matching. This function will have no effect when 'none' or 'auto' row height + * matching is used. + * @param {Node} nTr TR element that should have it's height recalculated + * @returns {void} + * @example + * var table = $('#example').dataTable( { + * "scrollX": "100%" + * } ); + * var fc = new $.fn.dataTable.fixedColumns( table ); + * + * // manipulate the table - mark the row as needing an update then update the table + * // this allows the redraw performed by DataTables fnUpdate to recalculate the row + * // height + * fc.fnRecalculateHeight(); + * table.fnUpdate( $('#example tbody tr:eq(0)')[0], ["insert date", 1, 2, 3 ... ]); + */ + "fnRecalculateHeight": function ( nTr ) + { + delete nTr._DTTC_iHeight; + nTr.style.height = 'auto'; + }, + + + /** + * Set the height of a given row - provides cross browser compatibility + * @param {Node} nTarget TR element that should have it's height recalculated + * @param {int} iHeight Height in pixels to set + * @returns {void} + * @example + * var table = $('#example').dataTable( { + * "scrollX": "100%" + * } ); + * var fc = new $.fn.dataTable.fixedColumns( table ); + * + * // You may want to do this after manipulating a row in the fixed column + * fc.fnSetRowHeight( $('#example tbody tr:eq(0)')[0], 50 ); + */ + "fnSetRowHeight": function ( nTarget, iHeight ) + { + nTarget.style.height = iHeight+"px"; + }, + + + /** + * Get data index information about a row or cell in the table body. + * This function is functionally identical to fnGetPosition in DataTables, + * taking the same parameter (TH, TD or TR node) and returning exactly the + * the same information (data index information). THe difference between + * the two is that this method takes into account the fixed columns in the + * table, so you can pass in nodes from the master table, or the cloned + * tables and get the index position for the data in the main table. + * @param {node} node TR, TH or TD element to get the information about + * @returns {int} If nNode is given as a TR, then a single index is + * returned, or if given as a cell, an array of [row index, column index + * (visible), column index (all)] is given. + */ + "fnGetPosition": function ( node ) + { + var idx; + var inst = this.s.dt.oInstance; + + if ( ! $(node).parents('.DTFC_Cloned').length ) + { + // Not in a cloned table + return inst.fnGetPosition( node ); + } + else + { + // Its in the cloned table, so need to look up position + if ( node.nodeName.toLowerCase() === 'tr' ) { + idx = $(node).index(); + return inst.fnGetPosition( $('tr', this.s.dt.nTBody)[ idx ] ); + } + else + { + var colIdx = $(node).index(); + idx = $(node.parentNode).index(); + var row = inst.fnGetPosition( $('tr', this.s.dt.nTBody)[ idx ] ); + + return [ + row, + colIdx, + inst.oApi._fnVisibleToColumnIndex( this.s.dt, colIdx ) + ]; + } + } + }, + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Private methods (they are of course public in JS, but recommended as private) + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * Initialisation for FixedColumns + * @param {Object} oInit User settings for initialisation + * @returns {void} + * @private + */ + "_fnConstruct": function ( oInit ) + { + var i, iLen, iWidth, + that = this; + + /* Sanity checking */ + if ( typeof this.s.dt.oInstance.fnVersionCheck != 'function' || + this.s.dt.oInstance.fnVersionCheck( '1.8.0' ) !== true ) + { + alert( "FixedColumns "+FixedColumns.VERSION+" required DataTables 1.8.0 or later. "+ + "Please upgrade your DataTables installation" ); + return; + } + + if ( this.s.dt.oScroll.sX === "" ) + { + this.s.dt.oInstance.oApi._fnLog( this.s.dt, 1, "FixedColumns is not needed (no "+ + "x-scrolling in DataTables enabled), so no action will be taken. Use 'FixedHeader' for "+ + "column fixing when scrolling is not enabled" ); + return; + } + + /* Apply the settings from the user / defaults */ + this.s = $.extend( true, this.s, FixedColumns.defaults, oInit ); + + /* Set up the DOM as we need it and cache nodes */ + var classes = this.s.dt.oClasses; + this.dom.grid.dt = $(this.s.dt.nTable).parents('div.'+classes.sScrollWrapper)[0]; + this.dom.scroller = $('div.'+classes.sScrollBody, this.dom.grid.dt )[0]; + + /* Set up the DOM that we want for the fixed column layout grid */ + this._fnColCalc(); + this._fnGridSetup(); + + /* Event handlers */ + var mouseController; + + // When the body is scrolled - scroll the left and right columns + $(this.dom.scroller) + .on( 'mouseover.DTFC touchstart.DTFC', function () { + mouseController = 'main'; + } ) + .on( 'scroll.DTFC', function () { + if ( mouseController === 'main' ) { + if ( that.s.iLeftColumns > 0 ) { + that.dom.grid.left.liner.scrollTop = that.dom.scroller.scrollTop; + } + if ( that.s.iRightColumns > 0 ) { + that.dom.grid.right.liner.scrollTop = that.dom.scroller.scrollTop; + } + } + } ); + + var wheelType = 'onwheel' in document.createElement('div') ? + 'wheel.DTFC' : + 'mousewheel.DTFC'; + + if ( that.s.iLeftColumns > 0 ) { + // When scrolling the left column, scroll the body and right column + $(that.dom.grid.left.liner) + .on( 'mouseover.DTFC touchstart.DTFC', function () { + mouseController = 'left'; + } ) + .on( 'scroll.DTFC', function () { + if ( mouseController === 'left' ) { + that.dom.scroller.scrollTop = that.dom.grid.left.liner.scrollTop; + if ( that.s.iRightColumns > 0 ) { + that.dom.grid.right.liner.scrollTop = that.dom.grid.left.liner.scrollTop; + } + } + } ) + .on( wheelType, function(e) { // xxx update the destroy as well + // Pass horizontal scrolling through + var xDelta = e.type === 'wheel' ? + -e.originalEvent.deltaX : + e.originalEvent.wheelDeltaX; + that.dom.scroller.scrollLeft -= xDelta; + } ); + } + + if ( that.s.iRightColumns > 0 ) { + // When scrolling the right column, scroll the body and the left column + $(that.dom.grid.right.liner) + .on( 'mouseover.DTFC touchstart.DTFC', function () { + mouseController = 'right'; + } ) + .on( 'scroll.DTFC', function () { + if ( mouseController === 'right' ) { + that.dom.scroller.scrollTop = that.dom.grid.right.liner.scrollTop; + if ( that.s.iLeftColumns > 0 ) { + that.dom.grid.left.liner.scrollTop = that.dom.grid.right.liner.scrollTop; + } + } + } ) + .on( wheelType, function(e) { + // Pass horizontal scrolling through + var xDelta = e.type === 'wheel' ? + -e.originalEvent.deltaX : + e.originalEvent.wheelDeltaX; + that.dom.scroller.scrollLeft -= xDelta; + } ); + } + + $(window).on( 'resize.DTFC', function () { + that._fnGridLayout.call( that ); + } ); + + var bFirstDraw = true; + var jqTable = $(this.s.dt.nTable); + + jqTable + .on( 'draw.dt.DTFC', function () { + that._fnDraw.call( that, bFirstDraw ); + bFirstDraw = false; + } ) + .on( 'column-sizing.dt.DTFC', function () { + that._fnColCalc(); + that._fnGridLayout( that ); + } ) + .on( 'column-visibility.dt.DTFC', function () { + that._fnColCalc(); + that._fnGridLayout( that ); + that._fnDraw( true ); + } ) + .on( 'destroy.dt.DTFC', function () { + jqTable.off( 'column-sizing.dt.DTFC destroy.dt.DTFC draw.dt.DTFC' ); + + $(that.dom.scroller).off( 'scroll.DTFC mouseover.DTFC' ); + $(window).off( 'resize.DTFC' ); + + $(that.dom.grid.left.liner).off( 'scroll.DTFC mouseover.DTFC '+wheelType ); + $(that.dom.grid.left.wrapper).remove(); + + $(that.dom.grid.right.liner).off( 'scroll.DTFC mouseover.DTFC '+wheelType ); + $(that.dom.grid.right.wrapper).remove(); + } ); + + /* Get things right to start with - note that due to adjusting the columns, there must be + * another redraw of the main table. It doesn't need to be a full redraw however. + */ + this._fnGridLayout(); + this.s.dt.oInstance.fnDraw(false); + }, + + + /** + * Calculate the column widths for the grid layout + * @returns {void} + * @private + */ + "_fnColCalc": function () + { + var that = this; + var iLeftWidth = 0; + var iRightWidth = 0; + + this.s.aiInnerWidths = []; + this.s.aiOuterWidths = []; + + $.each( this.s.dt.aoColumns, function (i, col) { + var th = $(col.nTh); + var border; + + if ( ! th.filter(':visible').length ) { + that.s.aiInnerWidths.push( 0 ); + that.s.aiOuterWidths.push( 0 ); + } + else + { + // Inner width is used to assign widths to cells + // Outer width is used to calculate the container + var iWidth = th.outerWidth(); + + // When working with the left most-cell, need to add on the + // table's border to the outerWidth, since we need to take + // account of it, but it isn't in any cell + if ( that.s.aiOuterWidths.length === 0 ) { + border = $(that.s.dt.nTable).css('border-left-width'); + iWidth += typeof border === 'string' ? 1 : parseInt( border, 10 ); + } + + // Likewise with the final column on the right + if ( that.s.aiOuterWidths.length === that.s.dt.aoColumns.length-1 ) { + border = $(that.s.dt.nTable).css('border-right-width'); + iWidth += typeof border === 'string' ? 1 : parseInt( border, 10 ); + } + + that.s.aiOuterWidths.push( iWidth ); + that.s.aiInnerWidths.push( th.width() ); + + if ( i < that.s.iLeftColumns ) + { + iLeftWidth += iWidth; + } + + if ( that.s.iTableColumns-that.s.iRightColumns <= i ) + { + iRightWidth += iWidth; + } + } + } ); + + this.s.iLeftWidth = iLeftWidth; + this.s.iRightWidth = iRightWidth; + }, + + + /** + * Set up the DOM for the fixed column. The way the layout works is to create a 1x3 grid + * for the left column, the DataTable (for which we just reuse the scrolling element DataTable + * puts into the DOM) and the right column. In each of he two fixed column elements there is a + * grouping wrapper element and then a head, body and footer wrapper. In each of these we then + * place the cloned header, body or footer tables. This effectively gives as 3x3 grid structure. + * @returns {void} + * @private + */ + "_fnGridSetup": function () + { + var that = this; + var oOverflow = this._fnDTOverflow(); + var block; + + this.dom.body = this.s.dt.nTable; + this.dom.header = this.s.dt.nTHead.parentNode; + this.dom.header.parentNode.parentNode.style.position = "relative"; + + var nSWrapper = + $('<div class="DTFC_ScrollWrapper" style="position:relative; clear:both;">'+ + '<div class="DTFC_LeftWrapper" style="position:absolute; top:0; left:0;">'+ + '<div class="DTFC_LeftHeadWrapper" style="position:relative; top:0; left:0; overflow:hidden;"></div>'+ + '<div class="DTFC_LeftBodyWrapper" style="position:relative; top:0; left:0; overflow:hidden;">'+ + '<div class="DTFC_LeftBodyLiner" style="position:relative; top:0; left:0; overflow-y:scroll;"></div>'+ + '</div>'+ + '<div class="DTFC_LeftFootWrapper" style="position:relative; top:0; left:0; overflow:hidden;"></div>'+ + '</div>'+ + '<div class="DTFC_RightWrapper" style="position:absolute; top:0; left:0;">'+ + '<div class="DTFC_RightHeadWrapper" style="position:relative; top:0; left:0;">'+ + '<div class="DTFC_RightHeadBlocker DTFC_Blocker" style="position:absolute; top:0; bottom:0;"></div>'+ + '</div>'+ + '<div class="DTFC_RightBodyWrapper" style="position:relative; top:0; left:0; overflow:hidden;">'+ + '<div class="DTFC_RightBodyLiner" style="position:relative; top:0; left:0; overflow-y:scroll;"></div>'+ + '</div>'+ + '<div class="DTFC_RightFootWrapper" style="position:relative; top:0; left:0;">'+ + '<div class="DTFC_RightFootBlocker DTFC_Blocker" style="position:absolute; top:0; bottom:0;"></div>'+ + '</div>'+ + '</div>'+ + '</div>')[0]; + var nLeft = nSWrapper.childNodes[0]; + var nRight = nSWrapper.childNodes[1]; + + this.dom.grid.dt.parentNode.insertBefore( nSWrapper, this.dom.grid.dt ); + nSWrapper.appendChild( this.dom.grid.dt ); + + this.dom.grid.wrapper = nSWrapper; + + if ( this.s.iLeftColumns > 0 ) + { + this.dom.grid.left.wrapper = nLeft; + this.dom.grid.left.head = nLeft.childNodes[0]; + this.dom.grid.left.body = nLeft.childNodes[1]; + this.dom.grid.left.liner = $('div.DTFC_LeftBodyLiner', nSWrapper)[0]; + + nSWrapper.appendChild( nLeft ); + } + + if ( this.s.iRightColumns > 0 ) + { + this.dom.grid.right.wrapper = nRight; + this.dom.grid.right.head = nRight.childNodes[0]; + this.dom.grid.right.body = nRight.childNodes[1]; + this.dom.grid.right.liner = $('div.DTFC_RightBodyLiner', nSWrapper)[0]; + + block = $('div.DTFC_RightHeadBlocker', nSWrapper)[0]; + block.style.width = oOverflow.bar+"px"; + block.style.right = -oOverflow.bar+"px"; + this.dom.grid.right.headBlock = block; + + block = $('div.DTFC_RightFootBlocker', nSWrapper)[0]; + block.style.width = oOverflow.bar+"px"; + block.style.right = -oOverflow.bar+"px"; + this.dom.grid.right.footBlock = block; + + nSWrapper.appendChild( nRight ); + } + + if ( this.s.dt.nTFoot ) + { + this.dom.footer = this.s.dt.nTFoot.parentNode; + if ( this.s.iLeftColumns > 0 ) + { + this.dom.grid.left.foot = nLeft.childNodes[2]; + } + if ( this.s.iRightColumns > 0 ) + { + this.dom.grid.right.foot = nRight.childNodes[2]; + } + } + }, + + + /** + * Style and position the grid used for the FixedColumns layout + * @returns {void} + * @private + */ + "_fnGridLayout": function () + { + var oGrid = this.dom.grid; + var iWidth = $(oGrid.wrapper).width(); + var iBodyHeight = $(this.s.dt.nTable.parentNode).outerHeight(); + var iFullHeight = $(this.s.dt.nTable.parentNode.parentNode).outerHeight(); + var oOverflow = this._fnDTOverflow(); + var + iLeftWidth = this.s.iLeftWidth, + iRightWidth = this.s.iRightWidth, + iRight; + var scrollbarAdjust = function ( node, width ) { + if ( ! oOverflow.bar ) { + // If there is no scrollbar (Macs) we need to hide the auto scrollbar + node.style.width = (width+20)+"px"; + node.style.paddingRight = "20px"; + node.style.boxSizing = "border-box"; + } + else { + // Otherwise just overflow by the scrollbar + node.style.width = (width+oOverflow.bar)+"px"; + } + }; + + // When x scrolling - don't paint the fixed columns over the x scrollbar + if ( oOverflow.x ) + { + iBodyHeight -= oOverflow.bar; + } + + oGrid.wrapper.style.height = iFullHeight+"px"; + + if ( this.s.iLeftColumns > 0 ) + { + oGrid.left.wrapper.style.width = iLeftWidth+"px"; + oGrid.left.wrapper.style.height = "1px"; + oGrid.left.body.style.height = iBodyHeight+"px"; + if ( oGrid.left.foot ) { + oGrid.left.foot.style.top = (oOverflow.x ? oOverflow.bar : 0)+"px"; // shift footer for scrollbar + } + + scrollbarAdjust( oGrid.left.liner, iLeftWidth ); + oGrid.left.liner.style.height = iBodyHeight+"px"; + } + + if ( this.s.iRightColumns > 0 ) + { + iRight = iWidth - iRightWidth; + if ( oOverflow.y ) + { + iRight -= oOverflow.bar; + } + + oGrid.right.wrapper.style.width = iRightWidth+"px"; + oGrid.right.wrapper.style.left = iRight+"px"; + oGrid.right.wrapper.style.height = "1px"; + oGrid.right.body.style.height = iBodyHeight+"px"; + if ( oGrid.right.foot ) { + oGrid.right.foot.style.top = (oOverflow.x ? oOverflow.bar : 0)+"px"; + } + + scrollbarAdjust( oGrid.right.liner, iRightWidth ); + oGrid.right.liner.style.height = iBodyHeight+"px"; + + oGrid.right.headBlock.style.display = oOverflow.y ? 'block' : 'none'; + oGrid.right.footBlock.style.display = oOverflow.y ? 'block' : 'none'; + } + }, + + + /** + * Get information about the DataTable's scrolling state - specifically if the table is scrolling + * on either the x or y axis, and also the scrollbar width. + * @returns {object} Information about the DataTables scrolling state with the properties: + * 'x', 'y' and 'bar' + * @private + */ + "_fnDTOverflow": function () + { + var nTable = this.s.dt.nTable; + var nTableScrollBody = nTable.parentNode; + var out = { + "x": false, + "y": false, + "bar": this.s.dt.oScroll.iBarWidth + }; + + if ( nTable.offsetWidth > nTableScrollBody.clientWidth ) + { + out.x = true; + } + + if ( nTable.offsetHeight > nTableScrollBody.clientHeight ) + { + out.y = true; + } + + return out; + }, + + + /** + * Clone and position the fixed columns + * @returns {void} + * @param {Boolean} bAll Indicate if the header and footer should be updated as well (true) + * @private + */ + "_fnDraw": function ( bAll ) + { + this._fnGridLayout(); + this._fnCloneLeft( bAll ); + this._fnCloneRight( bAll ); + + /* Draw callback function */ + if ( this.s.fnDrawCallback !== null ) + { + this.s.fnDrawCallback.call( this, this.dom.clone.left, this.dom.clone.right ); + } + + /* Event triggering */ + $(this).trigger( 'draw.dtfc', { + "leftClone": this.dom.clone.left, + "rightClone": this.dom.clone.right + } ); + }, + + + /** + * Clone the right columns + * @returns {void} + * @param {Boolean} bAll Indicate if the header and footer should be updated as well (true) + * @private + */ + "_fnCloneRight": function ( bAll ) + { + if ( this.s.iRightColumns <= 0 ) { + return; + } + + var that = this, + i, jq, + aiColumns = []; + + for ( i=this.s.iTableColumns-this.s.iRightColumns ; i<this.s.iTableColumns ; i++ ) { + if ( this.s.dt.aoColumns[i].bVisible ) { + aiColumns.push( i ); + } + } + + this._fnClone( this.dom.clone.right, this.dom.grid.right, aiColumns, bAll ); + }, + + + /** + * Clone the left columns + * @returns {void} + * @param {Boolean} bAll Indicate if the header and footer should be updated as well (true) + * @private + */ + "_fnCloneLeft": function ( bAll ) + { + if ( this.s.iLeftColumns <= 0 ) { + return; + } + + var that = this, + i, jq, + aiColumns = []; + + for ( i=0 ; i<this.s.iLeftColumns ; i++ ) { + if ( this.s.dt.aoColumns[i].bVisible ) { + aiColumns.push( i ); + } + } + + this._fnClone( this.dom.clone.left, this.dom.grid.left, aiColumns, bAll ); + }, + + + /** + * Make a copy of the layout object for a header or footer element from DataTables. Note that + * this method will clone the nodes in the layout object. + * @returns {Array} Copy of the layout array + * @param {Object} aoOriginal Layout array from DataTables (aoHeader or aoFooter) + * @param {Object} aiColumns Columns to copy + * @private + */ + "_fnCopyLayout": function ( aoOriginal, aiColumns ) + { + var aReturn = []; + var aClones = []; + var aCloned = []; + + for ( var i=0, iLen=aoOriginal.length ; i<iLen ; i++ ) + { + var aRow = []; + aRow.nTr = $(aoOriginal[i].nTr).clone(true, true)[0]; + + for ( var j=0, jLen=this.s.iTableColumns ; j<jLen ; j++ ) + { + if ( $.inArray( j, aiColumns ) === -1 ) + { + continue; + } + + var iCloned = $.inArray( aoOriginal[i][j].cell, aCloned ); + if ( iCloned === -1 ) + { + var nClone = $(aoOriginal[i][j].cell).clone(true, true)[0]; + aClones.push( nClone ); + aCloned.push( aoOriginal[i][j].cell ); + + aRow.push( { + "cell": nClone, + "unique": aoOriginal[i][j].unique + } ); + } + else + { + aRow.push( { + "cell": aClones[ iCloned ], + "unique": aoOriginal[i][j].unique + } ); + } + } + + aReturn.push( aRow ); + } + + return aReturn; + }, + + + /** + * Clone the DataTable nodes and place them in the DOM (sized correctly) + * @returns {void} + * @param {Object} oClone Object containing the header, footer and body cloned DOM elements + * @param {Object} oGrid Grid object containing the display grid elements for the cloned + * column (left or right) + * @param {Array} aiColumns Column indexes which should be operated on from the DataTable + * @param {Boolean} bAll Indicate if the header and footer should be updated as well (true) + * @private + */ + "_fnClone": function ( oClone, oGrid, aiColumns, bAll ) + { + var that = this, + i, iLen, j, jLen, jq, nTarget, iColumn, nClone, iIndex, aoCloneLayout, + jqCloneThead, aoFixedHeader, + dt = this.s.dt; + + /* + * Header + */ + if ( bAll ) + { + if ( oClone.header !== null ) + { + oClone.header.parentNode.removeChild( oClone.header ); + } + oClone.header = $(this.dom.header).clone(true, true)[0]; + oClone.header.className += " DTFC_Cloned"; + oClone.header.style.width = "100%"; + oGrid.head.appendChild( oClone.header ); + + /* Copy the DataTables layout cache for the header for our floating column */ + aoCloneLayout = this._fnCopyLayout( dt.aoHeader, aiColumns ); + jqCloneThead = $('>thead', oClone.header); + jqCloneThead.empty(); + + /* Add the created cloned TR elements to the table */ + for ( i=0, iLen=aoCloneLayout.length ; i<iLen ; i++ ) + { + jqCloneThead[0].appendChild( aoCloneLayout[i].nTr ); + } + + /* Use the handy _fnDrawHead function in DataTables to do the rowspan/colspan + * calculations for us + */ + dt.oApi._fnDrawHead( dt, aoCloneLayout, true ); + } + else + { + /* To ensure that we copy cell classes exactly, regardless of colspan, multiple rows + * etc, we make a copy of the header from the DataTable again, but don't insert the + * cloned cells, just copy the classes across. To get the matching layout for the + * fixed component, we use the DataTables _fnDetectHeader method, allowing 1:1 mapping + */ + aoCloneLayout = this._fnCopyLayout( dt.aoHeader, aiColumns ); + aoFixedHeader=[]; + + dt.oApi._fnDetectHeader( aoFixedHeader, $('>thead', oClone.header)[0] ); + + for ( i=0, iLen=aoCloneLayout.length ; i<iLen ; i++ ) + { + for ( j=0, jLen=aoCloneLayout[i].length ; j<jLen ; j++ ) + { + aoFixedHeader[i][j].cell.className = aoCloneLayout[i][j].cell.className; + + // If jQuery UI theming is used we need to copy those elements as well + $('span.DataTables_sort_icon', aoFixedHeader[i][j].cell).each( function () { + this.className = $('span.DataTables_sort_icon', aoCloneLayout[i][j].cell)[0].className; + } ); + } + } + } + this._fnEqualiseHeights( 'thead', this.dom.header, oClone.header ); + + /* + * Body + */ + if ( this.s.sHeightMatch == 'auto' ) + { + /* Remove any heights which have been applied already and let the browser figure it out */ + $('>tbody>tr', that.dom.body).css('height', 'auto'); + } + + if ( oClone.body !== null ) + { + oClone.body.parentNode.removeChild( oClone.body ); + oClone.body = null; + } + + oClone.body = $(this.dom.body).clone(true)[0]; + oClone.body.className += " DTFC_Cloned"; + oClone.body.style.paddingBottom = dt.oScroll.iBarWidth+"px"; + oClone.body.style.marginBottom = (dt.oScroll.iBarWidth*2)+"px"; /* For IE */ + if ( oClone.body.getAttribute('id') !== null ) + { + oClone.body.removeAttribute('id'); + } + + $('>thead>tr', oClone.body).empty(); + $('>tfoot', oClone.body).remove(); + + var nBody = $('tbody', oClone.body)[0]; + $(nBody).empty(); + if ( dt.aiDisplay.length > 0 ) + { + /* Copy the DataTables' header elements to force the column width in exactly the + * same way that DataTables does it - have the header element, apply the width and + * colapse it down + */ + var nInnerThead = $('>thead>tr', oClone.body)[0]; + for ( iIndex=0 ; iIndex<aiColumns.length ; iIndex++ ) + { + iColumn = aiColumns[iIndex]; + + nClone = $(dt.aoColumns[iColumn].nTh).clone(true)[0]; + nClone.innerHTML = ""; + + var oStyle = nClone.style; + oStyle.paddingTop = "0"; + oStyle.paddingBottom = "0"; + oStyle.borderTopWidth = "0"; + oStyle.borderBottomWidth = "0"; + oStyle.height = 0; + oStyle.width = that.s.aiInnerWidths[iColumn]+"px"; + + nInnerThead.appendChild( nClone ); + } + + /* Add in the tbody elements, cloning form the master table */ + $('>tbody>tr', that.dom.body).each( function (z) { + var n = this.cloneNode(false); + n.removeAttribute('id'); + var i = that.s.dt.oFeatures.bServerSide===false ? + that.s.dt.aiDisplay[ that.s.dt._iDisplayStart+z ] : z; + var aTds = that.s.dt.aoData[ i ].anCells || $(this).children('td, th'); + + for ( iIndex=0 ; iIndex<aiColumns.length ; iIndex++ ) + { + iColumn = aiColumns[iIndex]; + + if ( aTds.length > 0 ) + { + nClone = $( aTds[iColumn] ).clone(true, true)[0]; + n.appendChild( nClone ); + } + } + nBody.appendChild( n ); + } ); + } + else + { + $('>tbody>tr', that.dom.body).each( function (z) { + nClone = this.cloneNode(true); + nClone.className += ' DTFC_NoData'; + $('td', nClone).html(''); + nBody.appendChild( nClone ); + } ); + } + + oClone.body.style.width = "100%"; + oClone.body.style.margin = "0"; + oClone.body.style.padding = "0"; + + // Interop with Scroller - need to use a height forcing element in the + // scrolling area in the same way that Scroller does in the body scroll. + if ( dt.oScroller !== undefined ) + { + var scrollerForcer = dt.oScroller.dom.force; + + if ( ! oGrid.forcer ) { + oGrid.forcer = scrollerForcer.cloneNode( true ); + oGrid.liner.appendChild( oGrid.forcer ); + } + else { + oGrid.forcer.style.height = scrollerForcer.style.height; + } + } + + oGrid.liner.appendChild( oClone.body ); + + this._fnEqualiseHeights( 'tbody', that.dom.body, oClone.body ); + + /* + * Footer + */ + if ( dt.nTFoot !== null ) + { + if ( bAll ) + { + if ( oClone.footer !== null ) + { + oClone.footer.parentNode.removeChild( oClone.footer ); + } + oClone.footer = $(this.dom.footer).clone(true, true)[0]; + oClone.footer.className += " DTFC_Cloned"; + oClone.footer.style.width = "100%"; + oGrid.foot.appendChild( oClone.footer ); + + /* Copy the footer just like we do for the header */ + aoCloneLayout = this._fnCopyLayout( dt.aoFooter, aiColumns ); + var jqCloneTfoot = $('>tfoot', oClone.footer); + jqCloneTfoot.empty(); + + for ( i=0, iLen=aoCloneLayout.length ; i<iLen ; i++ ) + { + jqCloneTfoot[0].appendChild( aoCloneLayout[i].nTr ); + } + dt.oApi._fnDrawHead( dt, aoCloneLayout, true ); + } + else + { + aoCloneLayout = this._fnCopyLayout( dt.aoFooter, aiColumns ); + var aoCurrFooter=[]; + + dt.oApi._fnDetectHeader( aoCurrFooter, $('>tfoot', oClone.footer)[0] ); + + for ( i=0, iLen=aoCloneLayout.length ; i<iLen ; i++ ) + { + for ( j=0, jLen=aoCloneLayout[i].length ; j<jLen ; j++ ) + { + aoCurrFooter[i][j].cell.className = aoCloneLayout[i][j].cell.className; + } + } + } + this._fnEqualiseHeights( 'tfoot', this.dom.footer, oClone.footer ); + } + + /* Equalise the column widths between the header footer and body - body get's priority */ + var anUnique = dt.oApi._fnGetUniqueThs( dt, $('>thead', oClone.header)[0] ); + $(anUnique).each( function (i) { + iColumn = aiColumns[i]; + this.style.width = that.s.aiInnerWidths[iColumn]+"px"; + } ); + + if ( that.s.dt.nTFoot !== null ) + { + anUnique = dt.oApi._fnGetUniqueThs( dt, $('>tfoot', oClone.footer)[0] ); + $(anUnique).each( function (i) { + iColumn = aiColumns[i]; + this.style.width = that.s.aiInnerWidths[iColumn]+"px"; + } ); + } + }, + + + /** + * From a given table node (THEAD etc), get a list of TR direct child elements + * @param {Node} nIn Table element to search for TR elements (THEAD, TBODY or TFOOT element) + * @returns {Array} List of TR elements found + * @private + */ + "_fnGetTrNodes": function ( nIn ) + { + var aOut = []; + for ( var i=0, iLen=nIn.childNodes.length ; i<iLen ; i++ ) + { + if ( nIn.childNodes[i].nodeName.toUpperCase() == "TR" ) + { + aOut.push( nIn.childNodes[i] ); + } + } + return aOut; + }, + + + /** + * Equalise the heights of the rows in a given table node in a cross browser way + * @returns {void} + * @param {String} nodeName Node type - thead, tbody or tfoot + * @param {Node} original Original node to take the heights from + * @param {Node} clone Copy the heights to + * @private + */ + "_fnEqualiseHeights": function ( nodeName, original, clone ) + { + if ( this.s.sHeightMatch == 'none' && nodeName !== 'thead' && nodeName !== 'tfoot' ) + { + return; + } + + var that = this, + i, iLen, iHeight, iHeight2, iHeightOriginal, iHeightClone, + rootOriginal = original.getElementsByTagName(nodeName)[0], + rootClone = clone.getElementsByTagName(nodeName)[0], + jqBoxHack = $('>'+nodeName+'>tr:eq(0)', original).children(':first'), + iBoxHack = jqBoxHack.outerHeight() - jqBoxHack.height(), + anOriginal = this._fnGetTrNodes( rootOriginal ), + anClone = this._fnGetTrNodes( rootClone ), + heights = []; + + for ( i=0, iLen=anClone.length ; i<iLen ; i++ ) + { + iHeightOriginal = anOriginal[i].offsetHeight; + iHeightClone = anClone[i].offsetHeight; + iHeight = iHeightClone > iHeightOriginal ? iHeightClone : iHeightOriginal; + + if ( this.s.sHeightMatch == 'semiauto' ) + { + anOriginal[i]._DTTC_iHeight = iHeight; + } + + heights.push( iHeight ); + } + + for ( i=0, iLen=anClone.length ; i<iLen ; i++ ) + { + anClone[i].style.height = heights[i]+"px"; + anOriginal[i].style.height = heights[i]+"px"; + } + } +}; + + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Statics + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** + * FixedColumns default settings for initialisation + * @name FixedColumns.defaults + * @namespace + * @static + */ +FixedColumns.defaults = /** @lends FixedColumns.defaults */{ + /** + * Number of left hand columns to fix in position + * @type int + * @default 1 + * @static + * @example + * var = $('#example').dataTable( { + * "scrollX": "100%" + * } ); + * new $.fn.dataTable.fixedColumns( table, { + * "leftColumns": 2 + * } ); + */ + "iLeftColumns": 1, + + /** + * Number of right hand columns to fix in position + * @type int + * @default 0 + * @static + * @example + * var table = $('#example').dataTable( { + * "scrollX": "100%" + * } ); + * new $.fn.dataTable.fixedColumns( table, { + * "rightColumns": 1 + * } ); + */ + "iRightColumns": 0, + + /** + * Draw callback function which is called when FixedColumns has redrawn the fixed assets + * @type function(object, object):void + * @default null + * @static + * @example + * var table = $('#example').dataTable( { + * "scrollX": "100%" + * } ); + * new $.fn.dataTable.fixedColumns( table, { + * "drawCallback": function () { + * alert( "FixedColumns redraw" ); + * } + * } ); + */ + "fnDrawCallback": null, + + /** + * Height matching algorthim to use. This can be "none" which will result in no height + * matching being applied by FixedColumns (height matching could be forced by CSS in this + * case), "semiauto" whereby the height calculation will be performed once, and the result + * cached to be used again (fnRecalculateHeight can be used to force recalculation), or + * "auto" when height matching is performed on every draw (slowest but must accurate) + * @type string + * @default semiauto + * @static + * @example + * var table = $('#example').dataTable( { + * "scrollX": "100%" + * } ); + * new $.fn.dataTable.fixedColumns( table, { + * "heightMatch": "auto" + * } ); + */ + "sHeightMatch": "semiauto" +}; + + + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Constants + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** + * FixedColumns version + * @name FixedColumns.version + * @type String + * @default See code + * @static + */ +FixedColumns.version = "3.0.4"; + + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Fired events (for documentation) + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + +/** + * Event fired whenever FixedColumns redraws the fixed columns (i.e. clones the table elements from the main DataTable). This will occur whenever the DataTable that the FixedColumns instance is attached does its own draw. + * @name FixedColumns#draw.dtfc + * @event + * @param {event} e jQuery event object + * @param {object} o Event parameters from FixedColumns + * @param {object} o.leftClone Instance's object dom.clone.left for easy reference. This object contains references to the left fixed clumn column's nodes + * @param {object} o.rightClone Instance's object dom.clone.right for easy reference. This object contains references to the right fixed clumn column's nodes + */ + + +// Make FixedColumns accessible from the DataTables instance +$.fn.dataTable.FixedColumns = FixedColumns; +$.fn.DataTable.FixedColumns = FixedColumns; + + +return FixedColumns; +}; // /factory + + +// Define as an AMD module if possible +if ( typeof define === 'function' && define.amd ) { + define( ['jquery', 'datatables'], factory ); +} +else if ( typeof exports === 'object' ) { + // Node/CommonJS + factory( require('jquery'), require('datatables') ); +} +else if ( jQuery && !jQuery.fn.dataTable.FixedColumns ) { + // Otherwise simply initialise as normal, stopping multiple evaluation + factory( jQuery, jQuery.fn.dataTable ); +} + + +})(window, document); + diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedColumns/js/dataTables.fixedColumns.min.js b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/js/dataTables.fixedColumns.min.js new file mode 100644 index 0000000..6987830 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedColumns/js/dataTables.fixedColumns.min.js @@ -0,0 +1,30 @@ +/*! + FixedColumns 3.0.4 + ©2010-2014 SpryMedia Ltd - datatables.net/license +*/ +(function(r,s,t){var p=function(d){var j=function(a,b){var c=this;if(this instanceof j){"undefined"==typeof b&&(b={});var g=d.fn.dataTable.camelToHungarian;g&&(g(j.defaults,j.defaults,!0),g(j.defaults,b));g=d.fn.dataTable.Api?(new d.fn.dataTable.Api(a)).settings()[0]:a.fnSettings();this.s={dt:g,iTableColumns:g.aoColumns.length,aiOuterWidths:[],aiInnerWidths:[]};this.dom={scroller:null,header:null,body:null,footer:null,grid:{wrapper:null,dt:null,left:{wrapper:null,head:null,body:null,foot:null},right:{wrapper:null, +head:null,body:null,foot:null}},clone:{left:{header:null,body:null,footer:null},right:{header:null,body:null,footer:null}}};g._oFixedColumns=this;g._bInitComplete?this._fnConstruct(b):g.oApi._fnCallbackReg(g,"aoInitComplete",function(){c._fnConstruct(b)},"FixedColumns")}else alert("FixedColumns warning: FixedColumns must be initialised with the 'new' keyword.")};j.prototype={fnUpdate:function(){this._fnDraw(!0)},fnRedrawLayout:function(){this._fnColCalc();this._fnGridLayout();this.fnUpdate()},fnRecalculateHeight:function(a){delete a._DTTC_iHeight; +a.style.height="auto"},fnSetRowHeight:function(a,b){a.style.height=b+"px"},fnGetPosition:function(a){var b=this.s.dt.oInstance;if(d(a).parents(".DTFC_Cloned").length){if("tr"===a.nodeName.toLowerCase())return a=d(a).index(),b.fnGetPosition(d("tr",this.s.dt.nTBody)[a]);var c=d(a).index(),a=d(a.parentNode).index();return[b.fnGetPosition(d("tr",this.s.dt.nTBody)[a]),c,b.oApi._fnVisibleToColumnIndex(this.s.dt,c)]}return b.fnGetPosition(a)},_fnConstruct:function(a){var b=this;if("function"!=typeof this.s.dt.oInstance.fnVersionCheck|| +!0!==this.s.dt.oInstance.fnVersionCheck("1.8.0"))alert("FixedColumns "+j.VERSION+" required DataTables 1.8.0 or later. Please upgrade your DataTables installation");else if(""===this.s.dt.oScroll.sX)this.s.dt.oInstance.oApi._fnLog(this.s.dt,1,"FixedColumns is not needed (no x-scrolling in DataTables enabled), so no action will be taken. Use 'FixedHeader' for column fixing when scrolling is not enabled");else{this.s=d.extend(!0,this.s,j.defaults,a);a=this.s.dt.oClasses;this.dom.grid.dt=d(this.s.dt.nTable).parents("div."+ +a.sScrollWrapper)[0];this.dom.scroller=d("div."+a.sScrollBody,this.dom.grid.dt)[0];this._fnColCalc();this._fnGridSetup();var c;d(this.dom.scroller).on("mouseover.DTFC touchstart.DTFC",function(){c="main"}).on("scroll.DTFC",function(){if("main"===c&&(0<b.s.iLeftColumns&&(b.dom.grid.left.liner.scrollTop=b.dom.scroller.scrollTop),0<b.s.iRightColumns))b.dom.grid.right.liner.scrollTop=b.dom.scroller.scrollTop});var g="onwheel"in s.createElement("div")?"wheel.DTFC":"mousewheel.DTFC";if(0<b.s.iLeftColumns)d(b.dom.grid.left.liner).on("mouseover.DTFC touchstart.DTFC", +function(){c="left"}).on("scroll.DTFC",function(){"left"===c&&(b.dom.scroller.scrollTop=b.dom.grid.left.liner.scrollTop,0<b.s.iRightColumns&&(b.dom.grid.right.liner.scrollTop=b.dom.grid.left.liner.scrollTop))}).on(g,function(a){b.dom.scroller.scrollLeft-="wheel"===a.type?-a.originalEvent.deltaX:a.originalEvent.wheelDeltaX});if(0<b.s.iRightColumns)d(b.dom.grid.right.liner).on("mouseover.DTFC touchstart.DTFC",function(){c="right"}).on("scroll.DTFC",function(){"right"===c&&(b.dom.scroller.scrollTop= +b.dom.grid.right.liner.scrollTop,0<b.s.iLeftColumns&&(b.dom.grid.left.liner.scrollTop=b.dom.grid.right.liner.scrollTop))}).on(g,function(a){b.dom.scroller.scrollLeft-="wheel"===a.type?-a.originalEvent.deltaX:a.originalEvent.wheelDeltaX});d(r).on("resize.DTFC",function(){b._fnGridLayout.call(b)});var f=!0,e=d(this.s.dt.nTable);e.on("draw.dt.DTFC",function(){b._fnDraw.call(b,f);f=!1}).on("column-sizing.dt.DTFC",function(){b._fnColCalc();b._fnGridLayout(b)}).on("column-visibility.dt.DTFC",function(){b._fnColCalc(); +b._fnGridLayout(b);b._fnDraw(!0)}).on("destroy.dt.DTFC",function(){e.off("column-sizing.dt.DTFC destroy.dt.DTFC draw.dt.DTFC");d(b.dom.scroller).off("scroll.DTFC mouseover.DTFC");d(r).off("resize.DTFC");d(b.dom.grid.left.liner).off("scroll.DTFC mouseover.DTFC "+g);d(b.dom.grid.left.wrapper).remove();d(b.dom.grid.right.liner).off("scroll.DTFC mouseover.DTFC "+g);d(b.dom.grid.right.wrapper).remove()});this._fnGridLayout();this.s.dt.oInstance.fnDraw(!1)}},_fnColCalc:function(){var a=this,b=0,c=0;this.s.aiInnerWidths= +[];this.s.aiOuterWidths=[];d.each(this.s.dt.aoColumns,function(g,f){var e=d(f.nTh),h;if(e.filter(":visible").length){var i=e.outerWidth();0===a.s.aiOuterWidths.length&&(h=d(a.s.dt.nTable).css("border-left-width"),i+="string"===typeof h?1:parseInt(h,10));a.s.aiOuterWidths.length===a.s.dt.aoColumns.length-1&&(h=d(a.s.dt.nTable).css("border-right-width"),i+="string"===typeof h?1:parseInt(h,10));a.s.aiOuterWidths.push(i);a.s.aiInnerWidths.push(e.width());g<a.s.iLeftColumns&&(b+=i);a.s.iTableColumns-a.s.iRightColumns<= +g&&(c+=i)}else a.s.aiInnerWidths.push(0),a.s.aiOuterWidths.push(0)});this.s.iLeftWidth=b;this.s.iRightWidth=c},_fnGridSetup:function(){var a=this._fnDTOverflow(),b;this.dom.body=this.s.dt.nTable;this.dom.header=this.s.dt.nTHead.parentNode;this.dom.header.parentNode.parentNode.style.position="relative";var c=d('<div class="DTFC_ScrollWrapper" style="position:relative; clear:both;"><div class="DTFC_LeftWrapper" style="position:absolute; top:0; left:0;"><div class="DTFC_LeftHeadWrapper" style="position:relative; top:0; left:0; overflow:hidden;"></div><div class="DTFC_LeftBodyWrapper" style="position:relative; top:0; left:0; overflow:hidden;"><div class="DTFC_LeftBodyLiner" style="position:relative; top:0; left:0; overflow-y:scroll;"></div></div><div class="DTFC_LeftFootWrapper" style="position:relative; top:0; left:0; overflow:hidden;"></div></div><div class="DTFC_RightWrapper" style="position:absolute; top:0; left:0;"><div class="DTFC_RightHeadWrapper" style="position:relative; top:0; left:0;"><div class="DTFC_RightHeadBlocker DTFC_Blocker" style="position:absolute; top:0; bottom:0;"></div></div><div class="DTFC_RightBodyWrapper" style="position:relative; top:0; left:0; overflow:hidden;"><div class="DTFC_RightBodyLiner" style="position:relative; top:0; left:0; overflow-y:scroll;"></div></div><div class="DTFC_RightFootWrapper" style="position:relative; top:0; left:0;"><div class="DTFC_RightFootBlocker DTFC_Blocker" style="position:absolute; top:0; bottom:0;"></div></div></div></div>')[0], +g=c.childNodes[0],f=c.childNodes[1];this.dom.grid.dt.parentNode.insertBefore(c,this.dom.grid.dt);c.appendChild(this.dom.grid.dt);this.dom.grid.wrapper=c;0<this.s.iLeftColumns&&(this.dom.grid.left.wrapper=g,this.dom.grid.left.head=g.childNodes[0],this.dom.grid.left.body=g.childNodes[1],this.dom.grid.left.liner=d("div.DTFC_LeftBodyLiner",c)[0],c.appendChild(g));0<this.s.iRightColumns&&(this.dom.grid.right.wrapper=f,this.dom.grid.right.head=f.childNodes[0],this.dom.grid.right.body=f.childNodes[1],this.dom.grid.right.liner= +d("div.DTFC_RightBodyLiner",c)[0],b=d("div.DTFC_RightHeadBlocker",c)[0],b.style.width=a.bar+"px",b.style.right=-a.bar+"px",this.dom.grid.right.headBlock=b,b=d("div.DTFC_RightFootBlocker",c)[0],b.style.width=a.bar+"px",b.style.right=-a.bar+"px",this.dom.grid.right.footBlock=b,c.appendChild(f));if(this.s.dt.nTFoot&&(this.dom.footer=this.s.dt.nTFoot.parentNode,0<this.s.iLeftColumns&&(this.dom.grid.left.foot=g.childNodes[2]),0<this.s.iRightColumns))this.dom.grid.right.foot=f.childNodes[2]},_fnGridLayout:function(){var a= +this.dom.grid,b=d(a.wrapper).width(),c=d(this.s.dt.nTable.parentNode).outerHeight(),g=d(this.s.dt.nTable.parentNode.parentNode).outerHeight(),f=this._fnDTOverflow(),e=this.s.iLeftWidth,h=this.s.iRightWidth,i=function(a,b){f.bar?a.style.width=b+f.bar+"px":(a.style.width=b+20+"px",a.style.paddingRight="20px",a.style.boxSizing="border-box")};f.x&&(c-=f.bar);a.wrapper.style.height=g+"px";0<this.s.iLeftColumns&&(a.left.wrapper.style.width=e+"px",a.left.wrapper.style.height="1px",a.left.body.style.height= +c+"px",a.left.foot&&(a.left.foot.style.top=(f.x?f.bar:0)+"px"),i(a.left.liner,e),a.left.liner.style.height=c+"px");0<this.s.iRightColumns&&(b-=h,f.y&&(b-=f.bar),a.right.wrapper.style.width=h+"px",a.right.wrapper.style.left=b+"px",a.right.wrapper.style.height="1px",a.right.body.style.height=c+"px",a.right.foot&&(a.right.foot.style.top=(f.x?f.bar:0)+"px"),i(a.right.liner,h),a.right.liner.style.height=c+"px",a.right.headBlock.style.display=f.y?"block":"none",a.right.footBlock.style.display=f.y?"block": +"none")},_fnDTOverflow:function(){var a=this.s.dt.nTable,b=a.parentNode,c={x:!1,y:!1,bar:this.s.dt.oScroll.iBarWidth};a.offsetWidth>b.clientWidth&&(c.x=!0);a.offsetHeight>b.clientHeight&&(c.y=!0);return c},_fnDraw:function(a){this._fnGridLayout();this._fnCloneLeft(a);this._fnCloneRight(a);null!==this.s.fnDrawCallback&&this.s.fnDrawCallback.call(this,this.dom.clone.left,this.dom.clone.right);d(this).trigger("draw.dtfc",{leftClone:this.dom.clone.left,rightClone:this.dom.clone.right})},_fnCloneRight:function(a){if(!(0>= +this.s.iRightColumns)){var b,c=[];for(b=this.s.iTableColumns-this.s.iRightColumns;b<this.s.iTableColumns;b++)this.s.dt.aoColumns[b].bVisible&&c.push(b);this._fnClone(this.dom.clone.right,this.dom.grid.right,c,a)}},_fnCloneLeft:function(a){if(!(0>=this.s.iLeftColumns)){var b,c=[];for(b=0;b<this.s.iLeftColumns;b++)this.s.dt.aoColumns[b].bVisible&&c.push(b);this._fnClone(this.dom.clone.left,this.dom.grid.left,c,a)}},_fnCopyLayout:function(a,b){for(var c=[],g=[],f=[],e=0,h=a.length;e<h;e++){var i=[]; +i.nTr=d(a[e].nTr).clone(!0,!0)[0];for(var k=0,j=this.s.iTableColumns;k<j;k++)if(-1!==d.inArray(k,b)){var m=d.inArray(a[e][k].cell,f);-1===m?(m=d(a[e][k].cell).clone(!0,!0)[0],g.push(m),f.push(a[e][k].cell),i.push({cell:m,unique:a[e][k].unique})):i.push({cell:g[m],unique:a[e][k].unique})}c.push(i)}return c},_fnClone:function(a,b,c,g){var f=this,e,h,i,k,j,m,o,n,q,l=this.s.dt;if(g){null!==a.header&&a.header.parentNode.removeChild(a.header);a.header=d(this.dom.header).clone(!0,!0)[0];a.header.className+= +" DTFC_Cloned";a.header.style.width="100%";b.head.appendChild(a.header);n=this._fnCopyLayout(l.aoHeader,c);k=d(">thead",a.header);k.empty();e=0;for(h=n.length;e<h;e++)k[0].appendChild(n[e].nTr);l.oApi._fnDrawHead(l,n,!0)}else{n=this._fnCopyLayout(l.aoHeader,c);q=[];l.oApi._fnDetectHeader(q,d(">thead",a.header)[0]);e=0;for(h=n.length;e<h;e++){i=0;for(k=n[e].length;i<k;i++)q[e][i].cell.className=n[e][i].cell.className,d("span.DataTables_sort_icon",q[e][i].cell).each(function(){this.className=d("span.DataTables_sort_icon", +n[e][i].cell)[0].className})}}this._fnEqualiseHeights("thead",this.dom.header,a.header);"auto"==this.s.sHeightMatch&&d(">tbody>tr",f.dom.body).css("height","auto");null!==a.body&&(a.body.parentNode.removeChild(a.body),a.body=null);a.body=d(this.dom.body).clone(!0)[0];a.body.className+=" DTFC_Cloned";a.body.style.paddingBottom=l.oScroll.iBarWidth+"px";a.body.style.marginBottom=2*l.oScroll.iBarWidth+"px";null!==a.body.getAttribute("id")&&a.body.removeAttribute("id");d(">thead>tr",a.body).empty();d(">tfoot", +a.body).remove();var p=d("tbody",a.body)[0];d(p).empty();if(0<l.aiDisplay.length){h=d(">thead>tr",a.body)[0];for(o=0;o<c.length;o++)j=c[o],m=d(l.aoColumns[j].nTh).clone(!0)[0],m.innerHTML="",k=m.style,k.paddingTop="0",k.paddingBottom="0",k.borderTopWidth="0",k.borderBottomWidth="0",k.height=0,k.width=f.s.aiInnerWidths[j]+"px",h.appendChild(m);d(">tbody>tr",f.dom.body).each(function(a){var b=this.cloneNode(false);b.removeAttribute("id");a=f.s.dt.aoData[f.s.dt.oFeatures.bServerSide===false?f.s.dt.aiDisplay[f.s.dt._iDisplayStart+ +a]:a].anCells||d(this).children("td, th");for(o=0;o<c.length;o++){j=c[o];if(a.length>0){m=d(a[j]).clone(true,true)[0];b.appendChild(m)}}p.appendChild(b)})}else d(">tbody>tr",f.dom.body).each(function(){m=this.cloneNode(true);m.className=m.className+" DTFC_NoData";d("td",m).html("");p.appendChild(m)});a.body.style.width="100%";a.body.style.margin="0";a.body.style.padding="0";l.oScroller!==t&&(h=l.oScroller.dom.force,b.forcer?b.forcer.style.height=h.style.height:(b.forcer=h.cloneNode(!0),b.liner.appendChild(b.forcer))); +b.liner.appendChild(a.body);this._fnEqualiseHeights("tbody",f.dom.body,a.body);if(null!==l.nTFoot){if(g){null!==a.footer&&a.footer.parentNode.removeChild(a.footer);a.footer=d(this.dom.footer).clone(!0,!0)[0];a.footer.className+=" DTFC_Cloned";a.footer.style.width="100%";b.foot.appendChild(a.footer);n=this._fnCopyLayout(l.aoFooter,c);b=d(">tfoot",a.footer);b.empty();e=0;for(h=n.length;e<h;e++)b[0].appendChild(n[e].nTr);l.oApi._fnDrawHead(l,n,!0)}else{n=this._fnCopyLayout(l.aoFooter,c);b=[];l.oApi._fnDetectHeader(b, +d(">tfoot",a.footer)[0]);e=0;for(h=n.length;e<h;e++){i=0;for(k=n[e].length;i<k;i++)b[e][i].cell.className=n[e][i].cell.className}}this._fnEqualiseHeights("tfoot",this.dom.footer,a.footer)}b=l.oApi._fnGetUniqueThs(l,d(">thead",a.header)[0]);d(b).each(function(a){j=c[a];this.style.width=f.s.aiInnerWidths[j]+"px"});null!==f.s.dt.nTFoot&&(b=l.oApi._fnGetUniqueThs(l,d(">tfoot",a.footer)[0]),d(b).each(function(a){j=c[a];this.style.width=f.s.aiInnerWidths[j]+"px"}))},_fnGetTrNodes:function(a){for(var b= +[],c=0,d=a.childNodes.length;c<d;c++)"TR"==a.childNodes[c].nodeName.toUpperCase()&&b.push(a.childNodes[c]);return b},_fnEqualiseHeights:function(a,b,c){if(!("none"==this.s.sHeightMatch&&"thead"!==a&&"tfoot"!==a)){var g,f,e=b.getElementsByTagName(a)[0],c=c.getElementsByTagName(a)[0],a=d(">"+a+">tr:eq(0)",b).children(":first");a.outerHeight();a.height();for(var e=this._fnGetTrNodes(e),b=this._fnGetTrNodes(c),h=[],c=0,a=b.length;c<a;c++)g=e[c].offsetHeight,f=b[c].offsetHeight,g=f>g?f:g,"semiauto"==this.s.sHeightMatch&& +(e[c]._DTTC_iHeight=g),h.push(g);c=0;for(a=b.length;c<a;c++)b[c].style.height=h[c]+"px",e[c].style.height=h[c]+"px"}}};j.defaults={iLeftColumns:1,iRightColumns:0,fnDrawCallback:null,sHeightMatch:"semiauto"};j.version="3.0.4";d.fn.dataTable.FixedColumns=j;return d.fn.DataTable.FixedColumns=j};"function"===typeof define&&define.amd?define(["jquery","datatables"],p):"object"===typeof exports?p(require("jquery"),require("datatables")):jQuery&&!jQuery.fn.dataTable.FixedColumns&&p(jQuery,jQuery.fn.dataTable)})(window, +document); diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedHeader/Readme.txt b/theme/bootstrap/plugins/datatables/extensions/FixedHeader/Readme.txt new file mode 100644 index 0000000..875e051 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedHeader/Readme.txt @@ -0,0 +1,36 @@ +# FixedHeader + +At times it can be useful to ensure that column titles will remain always visible on a table, even when a user scrolls down a table. The FixedHeader plug-in for DataTables will float the 'thead' element above the table at all times to help address this issue. The column titles also remain click-able to perform sorting. Key features include: + +* Fix the header to the top of the window +* Ability to fix the footer and left / right columns as well +* z-Index ordering options + + +# Installation + +To use FixedHeader, first download DataTables ( http://datatables.net/download ) and place the unzipped FixedHeader package into a `extensions` directory in the DataTables package. This will allow the pages in the examples to operate correctly. To see the examples running, open the `examples` directory in your web-browser. + + +# Basic usage + +FixedHeader is initialised using the `$.fn.dataTable.FixedHeader()` object. For example: + +```js +$(document).ready( function () { + var table = $('#example').dataTable(); + new $.fn.dataTable.FixedHeader( table ); +} ); +``` + + +# Documentation / support + +* Documentation: http://datatables.net/extensions/FixedHeader/ +* DataTables support forums: http://datatables.net/forums + + +# GitHub + +If you fancy getting involved with the development of FixedHeader and help make it better, please refer to its GitHub repo: https://github.com/DataTables/FixedHeader + diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedHeader/css/dataTables.fixedHeader.css b/theme/bootstrap/plugins/datatables/extensions/FixedHeader/css/dataTables.fixedHeader.css new file mode 100644 index 0000000..724317a --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedHeader/css/dataTables.fixedHeader.css @@ -0,0 +1,7 @@ + + +div.FixedHeader_Cloned th, +div.FixedHeader_Cloned td { + background-color: white !important; +} + diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedHeader/css/dataTables.fixedHeader.min.css b/theme/bootstrap/plugins/datatables/extensions/FixedHeader/css/dataTables.fixedHeader.min.css new file mode 100644 index 0000000..e276a91 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedHeader/css/dataTables.fixedHeader.min.css @@ -0,0 +1 @@ +div.FixedHeader_Cloned th,div.FixedHeader_Cloned td{background-color:white !important} diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedHeader/examples/header_footer.html b/theme/bootstrap/plugins/datatables/extensions/FixedHeader/examples/header_footer.html new file mode 100644 index 0000000..97aae29 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedHeader/examples/header_footer.html @@ -0,0 +1,641 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>FixedHeader example - Header and footer fixed</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.fixedHeader.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.fixedHeader.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable(); + + new $.fn.dataTable.FixedHeader( table, { + bottom: true + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>FixedHeader example <span>Header and footer fixed</span></h1> + + <div class="info"> + <p>FixedHeader provides the ability to fix in place the header, footer, left and right columns of the + table. These are controlled by the options:</p> + + <ul class="markdown"> + <li><code>top</code> - default true</li> + <li><code>bottom</code> - default false</li> + <li><code>left</code> - default false</li> + <li><code>right</code> - default false</li> + </ul> + + <p>This example shows the header and footer of the table fixed by enabling the <code>bottom</code> + option.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this + example:</p><code class="multiline brush: js;">$(document).ready(function() { + var table = $('#example').DataTable(); + + new $.fn.dataTable.FixedHeader( table, { + bottom: true + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this + example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href= + "../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.fixedHeader.js">../js/dataTables.fixedHeader.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:</p><code class="multiline brush: js;"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the + table:</p> + + <ul> + <li><a href= + "../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.fixedHeader.css">../css/dataTables.fixedHeader.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using <a href="//datatables.net/manual/server-side">the protocol described in the + DataTables documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li class="active"><a href="./header_footer.html">Header and footer fixed</a></li> + <li><a href="./top_left_right.html">Header, left and right all fixed</a></li> + <li><a href="./two_tables.html">Multiple tables</a></li> + <li><a href="./zIndexes.html">z-index order control</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedHeader/examples/index.html b/theme/bootstrap/plugins/datatables/extensions/FixedHeader/examples/index.html new file mode 100644 index 0000000..2198d78 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedHeader/examples/index.html @@ -0,0 +1,69 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + + <title>FixedHeader examples - FixedHeader examples</title> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>FixedHeader example <span>FixedHeader examples</span></h1> + + <div class="info"> + <p>At times it can be useful to ensure that column titles will remain always visible on a table, even + when a user scrolls down a table. The FixedHeader plug-in for DataTables will float the <code class= + "tag" title="HTML tag">thead</code> element above the table at all times to help address this issue. + The column titles also remain click-able to perform sorting. Key features include:</p> + + <ul class="markdown"> + <li>Fix the header to the top of the window</li> + <li>Ability to fix the footer and left / right columns as well</li> + <li>z-Index ordering options</li> + </ul> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./header_footer.html">Header and footer fixed</a></li> + <li><a href="./top_left_right.html">Header, left and right all fixed</a></li> + <li><a href="./two_tables.html">Multiple tables</a></li> + <li><a href="./zIndexes.html">z-index order control</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedHeader/examples/simple.html b/theme/bootstrap/plugins/datatables/extensions/FixedHeader/examples/simple.html new file mode 100644 index 0000000..1ad6efa --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedHeader/examples/simple.html @@ -0,0 +1,637 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>FixedHeader example - Basic initialisation</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.fixedHeader.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.fixedHeader.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable(); + + new $.fn.dataTable.FixedHeader( table ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>FixedHeader example <span>Basic initialisation</span></h1> + + <div class="info"> + <p>When displaying large amounts of data in a table, it can often be useful for the end user to have + the column titles (the <code class="tag" title="HTML tag">thead</code> element as a whole in fact) + always visible. This is particularly true if using DataTables with pagination disabled, or the display + length is set to a high value.</p> + + <p>The FixedHeader extension for DataTables will ensure that your column titles will scroll with the + page, showing at the top of the table at all times. Try the demo shown below - you might want to try + resizing the window for full effect! Note also that the column titles remain clickable to perform + sorting on the table.</p> + + <p>FixedHeader is initialised using the constructor <code>new $.fn.dataTable.FixedHeader();</code> - + shown below.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this + example:</p><code class="multiline brush: js;">$(document).ready(function() { + var table = $('#example').DataTable(); + + new $.fn.dataTable.FixedHeader( table ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this + example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href= + "../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.fixedHeader.js">../js/dataTables.fixedHeader.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:</p><code class="multiline brush: js;"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the + table:</p> + + <ul> + <li><a href= + "../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.fixedHeader.css">../css/dataTables.fixedHeader.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using <a href="//datatables.net/manual/server-side">the protocol described in the + DataTables documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li class="active"><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./header_footer.html">Header and footer fixed</a></li> + <li><a href="./top_left_right.html">Header, left and right all fixed</a></li> + <li><a href="./two_tables.html">Multiple tables</a></li> + <li><a href="./zIndexes.html">z-index order control</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedHeader/examples/top_left_right.html b/theme/bootstrap/plugins/datatables/extensions/FixedHeader/examples/top_left_right.html new file mode 100644 index 0000000..f15faeb --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedHeader/examples/top_left_right.html @@ -0,0 +1,236 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>FixedHeader example - Header, left and right all fixed</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.fixedHeader.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + div.dataTables_wrapper { + width: 150%; + } + + div.FixedHeader_Cloned.fixedLeft tbody td { + border-right: 1px solid black; + } + + div.FixedHeader_Cloned.fixedRight tbody td { + border-left: 1px solid black; + } + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.fixedHeader.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable( { + "order": [ 1, 'asc' ], + "ajax": "../../../examples/ajax/data/objects.txt", + "columns": [ + { title: '', data: null, defaultContent: "" }, + { title: 'Name', data: "name" }, + { title: 'Position', data: "position" }, + { title: 'Office', data: "office" }, + { title: 'Extn.', data: "extn" }, + { title: 'Start date', data: "start_date" }, + { title: 'Salary', data: "salary" }, + { title: '', data: null, defaultContent: "" } + ], + initComplete: function () { + new $.fn.dataTable.FixedHeader( table, { + left: true, + right: true + } ); + } + } ); + + table.on( 'order.dt search.dt', function () { + table.column(0, {search:'applied', order:'applied'}).nodes().each( function (cell, i) { + cell.innerHTML = i+1; + } ); + + table.column(-1, {search:'applied', order:'applied'}).nodes().each( function (cell, i) { + cell.innerHTML = i+1; + } ); + } ).draw(); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>FixedHeader example <span>Header, left and right all fixed</span></h1> + + <div class="info"> + <p>FixedHeader provides the ability to fix in place the header, footer, left and right columns of the + table. These are controlled by the options:</p> + + <ul class="markdown"> + <li><code>top</code> - default true</li> + <li><code>bottom</code> - default false</li> + <li><code>left</code> - default false</li> + <li><code>right</code> - default false</li> + </ul> + + <p>This example shows top, left and right enabled with index columns on the left and right.</p> + + <p>Note that in such a situation as this, the <a href= + "//datatables.net/extensions/fixedcolumns">FixedColumns extension</a> might be more useful, + particularly if you want to use the scrolling options built into DataTables.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"></table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this + example:</p><code class="multiline brush: js;">$(document).ready(function() { + var table = $('#example').DataTable( { + &quot;order&quot;: [ 1, 'asc' ], + &quot;ajax&quot;: &quot;../../../examples/ajax/data/objects.txt&quot;, + &quot;columns&quot;: [ + { title: '', data: null, defaultContent: &quot;&quot; }, + { title: 'Name', data: &quot;name&quot; }, + { title: 'Position', data: &quot;position&quot; }, + { title: 'Office', data: &quot;office&quot; }, + { title: 'Extn.', data: &quot;extn&quot; }, + { title: 'Start date', data: &quot;start_date&quot; }, + { title: 'Salary', data: &quot;salary&quot; }, + { title: '', data: null, defaultContent: &quot;&quot; } + ], + initComplete: function () { + new $.fn.dataTable.FixedHeader( table, { + left: true, + right: true + } ); + } + } ); + + table.on( 'order.dt search.dt', function () { + table.column(0, {search:'applied', order:'applied'}).nodes().each( function (cell, i) { + cell.innerHTML = i+1; + } ); + + table.column(-1, {search:'applied', order:'applied'}).nodes().each( function (cell, i) { + cell.innerHTML = i+1; + } ); + } ).draw(); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this + example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href= + "../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.fixedHeader.js">../js/dataTables.fixedHeader.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:</p><code class="multiline brush: js;">div.dataTables_wrapper { + width: 150%; + } + + div.FixedHeader_Cloned.fixedLeft tbody td { + border-right: 1px solid black; + } + + div.FixedHeader_Cloned.fixedRight tbody td { + border-left: 1px solid black; + }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the + table:</p> + + <ul> + <li><a href= + "../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.fixedHeader.css">../css/dataTables.fixedHeader.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using <a href="//datatables.net/manual/server-side">the protocol described in the + DataTables documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./header_footer.html">Header and footer fixed</a></li> + <li class="active"><a href="./top_left_right.html">Header, left and right all + fixed</a></li> + <li><a href="./two_tables.html">Multiple tables</a></li> + <li><a href="./zIndexes.html">z-index order control</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedHeader/examples/two_tables.html b/theme/bootstrap/plugins/datatables/extensions/FixedHeader/examples/two_tables.html new file mode 100644 index 0000000..1fbb3df --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedHeader/examples/two_tables.html @@ -0,0 +1,354 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>FixedHeader example - Multiple tables</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.fixedHeader.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.fixedHeader.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var t1 = $('table.display').eq(0).DataTable(); + new $.fn.dataTable.FixedHeader( t1, { + bottom: true + } ); + + var t2 = $('table.display').eq(1).DataTable(); + new $.fn.dataTable.FixedHeader( t2, { + bottom: true + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>FixedHeader example <span>Multiple tables</span></h1> + + <div class="info"> + <p>The following example shows two DataTables enhanced tables both with FixedHeader enabled on them. + This is done simply by initialising FixedHeader on each table. This example also shows the footer being + fixed in place for the two tables.</p> + </div> + + <table id="" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>$320,800</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>$433,060</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>$103,600</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>$342,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>$217,500</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>$92,575</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>$324,050</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>$75,650</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>$183,000</td> + </tr> + </tbody> + </table> + + <table id="" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>$90,560</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>$198,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>$132,000</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>$145,000</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>$136,200</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>$163,500</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>$103,500</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this + example:</p><code class="multiline brush: js;">$(document).ready(function() { + var t1 = $('table.display').eq(0).DataTable(); + new $.fn.dataTable.FixedHeader( t1, { + bottom: true + } ); + + var t2 = $('table.display').eq(1).DataTable(); + new $.fn.dataTable.FixedHeader( t2, { + bottom: true + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this + example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href= + "../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.fixedHeader.js">../js/dataTables.fixedHeader.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:</p><code class="multiline brush: js;"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the + table:</p> + + <ul> + <li><a href= + "../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.fixedHeader.css">../css/dataTables.fixedHeader.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using <a href="//datatables.net/manual/server-side">the protocol described in the + DataTables documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./header_footer.html">Header and footer fixed</a></li> + <li><a href="./top_left_right.html">Header, left and right all fixed</a></li> + <li class="active"><a href="./two_tables.html">Multiple tables</a></li> + <li><a href="./zIndexes.html">z-index order control</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedHeader/examples/zIndexes.html b/theme/bootstrap/plugins/datatables/extensions/FixedHeader/examples/zIndexes.html new file mode 100644 index 0000000..a3292c4 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedHeader/examples/zIndexes.html @@ -0,0 +1,653 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>FixedHeader example - z-index order control</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.fixedHeader.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + div.dataTables_wrapper { + width: 1500px; + } + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.fixedHeader.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable(); + + new $.fn.dataTable.FixedHeader( table, { + left: true, + zLeft: 105 + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>FixedHeader example <span>z-index order control</span></h1> + + <div class="info"> + <p>When you have two or more columns fixed on a table, there might be occasions when you which to have + one column floating on top of another. This example shows how you can do that with the initialisation + parameters <code>zTop</code>, <code>zBottom</code>, <code>zLeft</code> and <code>zRight</code>. In this + example the left column is set to float on top of the header. The difference is subtle, but can be + effective.</p> + + <p>The default zIndexes are:</p> + + <ul class="markdown"> + <li><code>zTop</code>: 104</li> + <li><code>zBottom</code>: 103</li> + <li><code>zLeft</code>: 102</li> + <li><code>zRight</code>: 101</li> + </ul> + + <p>This example shows the left column being floated on top of the header.</p> + </div> + + <table id="example" class="stripe row-border order-column" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this + example:</p><code class="multiline brush: js;">$(document).ready(function() { + var table = $('#example').DataTable(); + + new $.fn.dataTable.FixedHeader( table, { + left: true, + zLeft: 105 + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this + example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href= + "../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.fixedHeader.js">../js/dataTables.fixedHeader.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:</p><code class="multiline brush: js;">div.dataTables_wrapper { + width: 1500px; + }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the + table:</p> + + <ul> + <li><a href= + "../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.fixedHeader.css">../css/dataTables.fixedHeader.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using <a href="//datatables.net/manual/server-side">the protocol described in the + DataTables documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./header_footer.html">Header and footer fixed</a></li> + <li><a href="./top_left_right.html">Header, left and right all fixed</a></li> + <li><a href="./two_tables.html">Multiple tables</a></li> + <li class="active"><a href="./zIndexes.html">z-index order control</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedHeader/js/dataTables.fixedHeader.js b/theme/bootstrap/plugins/datatables/extensions/FixedHeader/js/dataTables.fixedHeader.js new file mode 100644 index 0000000..90df878 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedHeader/js/dataTables.fixedHeader.js @@ -0,0 +1,1028 @@ +/*! FixedHeader 2.1.2 + * ©2010-2014 SpryMedia Ltd - datatables.net/license + */ + +/** + * @summary FixedHeader + * @description Fix a table's header or footer, so it is always visible while + * Scrolling + * @version 2.1.2 + * @file dataTables.fixedHeader.js + * @author SpryMedia Ltd (www.sprymedia.co.uk) + * @contact www.sprymedia.co.uk/contact + * @copyright Copyright 2009-2014 SpryMedia Ltd. + * + * This source file is free software, available under the following license: + * MIT license - http://datatables.net/license/mit + * + * This source file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. + * + * For details please refer to: http://www.datatables.net + */ + +/* Global scope for FixedColumns for backwards compatibility - will be removed + * in future. Not documented in 1.1.x. + */ + +/* Global scope for FixedColumns */ +var FixedHeader; + +(function(window, document, undefined) { + + +var factory = function( $, DataTable ) { +"use strict"; + +/* + * Function: FixedHeader + * Purpose: Provide 'fixed' header, footer and columns for a DataTable + * Returns: object:FixedHeader - must be called with 'new' + * Inputs: mixed:mTable - target table + * @param {object} dt DataTables instance or HTML table node. With DataTables + * 1.10 this can also be a jQuery collection (with just a single table in its + * result set), a jQuery selector, DataTables API instance or settings + * object. + * @param {object} [oInit] initialisation settings, with the following + * properties (each optional) + * * bool:top - fix the header (default true) + * * bool:bottom - fix the footer (default false) + * * int:left - fix the left column(s) (default 0) + * * int:right - fix the right column(s) (default 0) + * * int:zTop - fixed header zIndex + * * int:zBottom - fixed footer zIndex + * * int:zLeft - fixed left zIndex + * * int:zRight - fixed right zIndex + */ +FixedHeader = function ( mTable, oInit ) { + /* Sanity check - you just know it will happen */ + if ( ! this instanceof FixedHeader ) + { + alert( "FixedHeader warning: FixedHeader must be initialised with the 'new' keyword." ); + return; + } + + var that = this; + var oSettings = { + "aoCache": [], + "oSides": { + "top": true, + "bottom": false, + "left": 0, + "right": 0 + }, + "oZIndexes": { + "top": 104, + "bottom": 103, + "left": 102, + "right": 101 + }, + "oCloneOnDraw": { + "top": false, + "bottom": false, + "left": true, + "right": true + }, + "oMes": { + "iTableWidth": 0, + "iTableHeight": 0, + "iTableLeft": 0, + "iTableRight": 0, /* note this is left+width, not actually "right" */ + "iTableTop": 0, + "iTableBottom": 0 /* note this is top+height, not actually "bottom" */ + }, + "oOffset": { + "top": 0 + }, + "nTable": null, + "bFooter": false, + "bInitComplete": false + }; + + /* + * Function: fnGetSettings + * Purpose: Get the settings for this object + * Returns: object: - settings object + * Inputs: - + */ + this.fnGetSettings = function () { + return oSettings; + }; + + /* + * Function: fnUpdate + * Purpose: Update the positioning and copies of the fixed elements + * Returns: - + * Inputs: - + */ + this.fnUpdate = function () { + this._fnUpdateClones(); + this._fnUpdatePositions(); + }; + + /* + * Function: fnPosition + * Purpose: Update the positioning of the fixed elements + * Returns: - + * Inputs: - + */ + this.fnPosition = function () { + this._fnUpdatePositions(); + }; + + + var dt = $.fn.dataTable.Api ? + new $.fn.dataTable.Api( mTable ).settings()[0] : + mTable.fnSettings(); + + dt._oPluginFixedHeader = this; + + /* Let's do it */ + this.fnInit( dt, oInit ); + +}; + + +/* + * Variable: FixedHeader + * Purpose: Prototype for FixedHeader + * Scope: global + */ +FixedHeader.prototype = { + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Initialisation + */ + + /* + * Function: fnInit + * Purpose: The "constructor" + * Returns: - + * Inputs: {as FixedHeader function} + */ + fnInit: function ( oDtSettings, oInit ) + { + var s = this.fnGetSettings(); + var that = this; + + /* Record the user definable settings */ + this.fnInitSettings( s, oInit ); + + if ( oDtSettings.oScroll.sX !== "" || oDtSettings.oScroll.sY !== "" ) + { + alert( "FixedHeader 2 is not supported with DataTables' scrolling mode at this time" ); + return; + } + + s.nTable = oDtSettings.nTable; + oDtSettings.aoDrawCallback.unshift( { + "fn": function () { + FixedHeader.fnMeasure(); + that._fnUpdateClones.call(that); + that._fnUpdatePositions.call(that); + }, + "sName": "FixedHeader" + } ); + + s.bFooter = ($('>tfoot', s.nTable).length > 0) ? true : false; + + /* Add the 'sides' that are fixed */ + if ( s.oSides.top ) + { + s.aoCache.push( that._fnCloneTable( "fixedHeader", "FixedHeader_Header", that._fnCloneThead ) ); + } + if ( s.oSides.bottom ) + { + s.aoCache.push( that._fnCloneTable( "fixedFooter", "FixedHeader_Footer", that._fnCloneTfoot ) ); + } + if ( s.oSides.left ) + { + s.aoCache.push( that._fnCloneTable( "fixedLeft", "FixedHeader_Left", that._fnCloneTLeft, s.oSides.left ) ); + } + if ( s.oSides.right ) + { + s.aoCache.push( that._fnCloneTable( "fixedRight", "FixedHeader_Right", that._fnCloneTRight, s.oSides.right ) ); + } + + /* Event listeners for window movement */ + FixedHeader.afnScroll.push( function () { + that._fnUpdatePositions.call(that); + } ); + + $(window).resize( function () { + FixedHeader.fnMeasure(); + that._fnUpdateClones.call(that); + that._fnUpdatePositions.call(that); + } ); + + $(s.nTable) + .on('column-reorder.dt', function () { + FixedHeader.fnMeasure(); + that._fnUpdateClones( true ); + that._fnUpdatePositions(); + } ) + .on('column-visibility.dt', function () { + FixedHeader.fnMeasure(); + that._fnUpdateClones( true ); + that._fnUpdatePositions(); + } ); + + /* Get things right to start with */ + FixedHeader.fnMeasure(); + that._fnUpdateClones(); + that._fnUpdatePositions(); + + s.bInitComplete = true; + }, + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Support functions + */ + + /* + * Function: fnInitSettings + * Purpose: Take the user's settings and copy them to our local store + * Returns: - + * Inputs: object:s - the local settings object + * object:oInit - the user's settings object + */ + fnInitSettings: function ( s, oInit ) + { + if ( oInit !== undefined ) + { + if ( oInit.top !== undefined ) { + s.oSides.top = oInit.top; + } + if ( oInit.bottom !== undefined ) { + s.oSides.bottom = oInit.bottom; + } + if ( typeof oInit.left == 'boolean' ) { + s.oSides.left = oInit.left ? 1 : 0; + } + else if ( oInit.left !== undefined ) { + s.oSides.left = oInit.left; + } + if ( typeof oInit.right == 'boolean' ) { + s.oSides.right = oInit.right ? 1 : 0; + } + else if ( oInit.right !== undefined ) { + s.oSides.right = oInit.right; + } + + if ( oInit.zTop !== undefined ) { + s.oZIndexes.top = oInit.zTop; + } + if ( oInit.zBottom !== undefined ) { + s.oZIndexes.bottom = oInit.zBottom; + } + if ( oInit.zLeft !== undefined ) { + s.oZIndexes.left = oInit.zLeft; + } + if ( oInit.zRight !== undefined ) { + s.oZIndexes.right = oInit.zRight; + } + + if ( oInit.offsetTop !== undefined ) { + s.oOffset.top = oInit.offsetTop; + } + if ( oInit.alwaysCloneTop !== undefined ) { + s.oCloneOnDraw.top = oInit.alwaysCloneTop; + } + if ( oInit.alwaysCloneBottom !== undefined ) { + s.oCloneOnDraw.bottom = oInit.alwaysCloneBottom; + } + if ( oInit.alwaysCloneLeft !== undefined ) { + s.oCloneOnDraw.left = oInit.alwaysCloneLeft; + } + if ( oInit.alwaysCloneRight !== undefined ) { + s.oCloneOnDraw.right = oInit.alwaysCloneRight; + } + } + }, + + /* + * Function: _fnCloneTable + * Purpose: Clone the table node and do basic initialisation + * Returns: - + * Inputs: - + */ + _fnCloneTable: function ( sType, sClass, fnClone, iCells ) + { + var s = this.fnGetSettings(); + var nCTable; + + /* We know that the table _MUST_ has a DIV wrapped around it, because this is simply how + * DataTables works. Therefore, we can set this to be relatively position (if it is not + * alreadu absolute, and use this as the base point for the cloned header + */ + if ( $(s.nTable.parentNode).css('position') != "absolute" ) + { + s.nTable.parentNode.style.position = "relative"; + } + + /* Just a shallow clone will do - we only want the table node */ + nCTable = s.nTable.cloneNode( false ); + nCTable.removeAttribute( 'id' ); + + var nDiv = document.createElement( 'div' ); + nDiv.style.position = "absolute"; + nDiv.style.top = "0px"; + nDiv.style.left = "0px"; + nDiv.className += " FixedHeader_Cloned "+sType+" "+sClass; + + /* Set the zIndexes */ + if ( sType == "fixedHeader" ) + { + nDiv.style.zIndex = s.oZIndexes.top; + } + if ( sType == "fixedFooter" ) + { + nDiv.style.zIndex = s.oZIndexes.bottom; + } + if ( sType == "fixedLeft" ) + { + nDiv.style.zIndex = s.oZIndexes.left; + } + else if ( sType == "fixedRight" ) + { + nDiv.style.zIndex = s.oZIndexes.right; + } + + /* remove margins since we are going to position it absolutely */ + nCTable.style.margin = "0"; + + /* Insert the newly cloned table into the DOM, on top of the "real" header */ + nDiv.appendChild( nCTable ); + document.body.appendChild( nDiv ); + + return { + "nNode": nCTable, + "nWrapper": nDiv, + "sType": sType, + "sPosition": "", + "sTop": "", + "sLeft": "", + "fnClone": fnClone, + "iCells": iCells + }; + }, + + /* + * Function: _fnMeasure + * Purpose: Get the current positioning of the table in the DOM + * Returns: - + * Inputs: - + */ + _fnMeasure: function () + { + var + s = this.fnGetSettings(), + m = s.oMes, + jqTable = $(s.nTable), + oOffset = jqTable.offset(), + iParentScrollTop = this._fnSumScroll( s.nTable.parentNode, 'scrollTop' ), + iParentScrollLeft = this._fnSumScroll( s.nTable.parentNode, 'scrollLeft' ); + + m.iTableWidth = jqTable.outerWidth(); + m.iTableHeight = jqTable.outerHeight(); + m.iTableLeft = oOffset.left + s.nTable.parentNode.scrollLeft; + m.iTableTop = oOffset.top + iParentScrollTop; + m.iTableRight = m.iTableLeft + m.iTableWidth; + m.iTableRight = FixedHeader.oDoc.iWidth - m.iTableLeft - m.iTableWidth; + m.iTableBottom = FixedHeader.oDoc.iHeight - m.iTableTop - m.iTableHeight; + }, + + /* + * Function: _fnSumScroll + * Purpose: Sum node parameters all the way to the top + * Returns: int: sum + * Inputs: node:n - node to consider + * string:side - scrollTop or scrollLeft + */ + _fnSumScroll: function ( n, side ) + { + var i = n[side]; + while ( n = n.parentNode ) + { + if ( n.nodeName == 'HTML' || n.nodeName == 'BODY' ) + { + break; + } + i = n[side]; + } + return i; + }, + + /* + * Function: _fnUpdatePositions + * Purpose: Loop over the fixed elements for this table and update their positions + * Returns: - + * Inputs: - + */ + _fnUpdatePositions: function () + { + var s = this.fnGetSettings(); + this._fnMeasure(); + + for ( var i=0, iLen=s.aoCache.length ; i<iLen ; i++ ) + { + if ( s.aoCache[i].sType == "fixedHeader" ) + { + this._fnScrollFixedHeader( s.aoCache[i] ); + } + else if ( s.aoCache[i].sType == "fixedFooter" ) + { + this._fnScrollFixedFooter( s.aoCache[i] ); + } + else if ( s.aoCache[i].sType == "fixedLeft" ) + { + this._fnScrollHorizontalLeft( s.aoCache[i] ); + } + else + { + this._fnScrollHorizontalRight( s.aoCache[i] ); + } + } + }, + + /* + * Function: _fnUpdateClones + * Purpose: Loop over the fixed elements for this table and call their cloning functions + * Returns: - + * Inputs: - + */ + _fnUpdateClones: function ( full ) + { + var s = this.fnGetSettings(); + + if ( full ) { + // This is a little bit of a hack to force a full clone draw. When + // `full` is set to true, we want to reclone the source elements, + // regardless of the clone-on-draw settings + s.bInitComplete = false; + } + + for ( var i=0, iLen=s.aoCache.length ; i<iLen ; i++ ) + { + s.aoCache[i].fnClone.call( this, s.aoCache[i] ); + } + + if ( full ) { + s.bInitComplete = true; + } + }, + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Scrolling functions + */ + + /* + * Function: _fnScrollHorizontalLeft + * Purpose: Update the positioning of the scrolling elements + * Returns: - + * Inputs: object:oCache - the cached values for this fixed element + */ + _fnScrollHorizontalRight: function ( oCache ) + { + var + s = this.fnGetSettings(), + oMes = s.oMes, + oWin = FixedHeader.oWin, + oDoc = FixedHeader.oDoc, + nTable = oCache.nWrapper, + iFixedWidth = $(nTable).outerWidth(); + + if ( oWin.iScrollRight < oMes.iTableRight ) + { + /* Fully right aligned */ + this._fnUpdateCache( oCache, 'sPosition', 'absolute', 'position', nTable.style ); + this._fnUpdateCache( oCache, 'sTop', oMes.iTableTop+"px", 'top', nTable.style ); + this._fnUpdateCache( oCache, 'sLeft', (oMes.iTableLeft+oMes.iTableWidth-iFixedWidth)+"px", 'left', nTable.style ); + } + else if ( oMes.iTableLeft < oDoc.iWidth-oWin.iScrollRight-iFixedWidth ) + { + /* Middle */ + this._fnUpdateCache( oCache, 'sPosition', 'fixed', 'position', nTable.style ); + this._fnUpdateCache( oCache, 'sTop', (oMes.iTableTop-oWin.iScrollTop)+"px", 'top', nTable.style ); + this._fnUpdateCache( oCache, 'sLeft', (oWin.iWidth-iFixedWidth)+"px", 'left', nTable.style ); + } + else + { + /* Fully left aligned */ + this._fnUpdateCache( oCache, 'sPosition', 'absolute', 'position', nTable.style ); + this._fnUpdateCache( oCache, 'sTop', oMes.iTableTop+"px", 'top', nTable.style ); + this._fnUpdateCache( oCache, 'sLeft', oMes.iTableLeft+"px", 'left', nTable.style ); + } + }, + + /* + * Function: _fnScrollHorizontalLeft + * Purpose: Update the positioning of the scrolling elements + * Returns: - + * Inputs: object:oCache - the cached values for this fixed element + */ + _fnScrollHorizontalLeft: function ( oCache ) + { + var + s = this.fnGetSettings(), + oMes = s.oMes, + oWin = FixedHeader.oWin, + oDoc = FixedHeader.oDoc, + nTable = oCache.nWrapper, + iCellWidth = $(nTable).outerWidth(); + + if ( oWin.iScrollLeft < oMes.iTableLeft ) + { + /* Fully left align */ + this._fnUpdateCache( oCache, 'sPosition', 'absolute', 'position', nTable.style ); + this._fnUpdateCache( oCache, 'sTop', oMes.iTableTop+"px", 'top', nTable.style ); + this._fnUpdateCache( oCache, 'sLeft', oMes.iTableLeft+"px", 'left', nTable.style ); + } + else if ( oWin.iScrollLeft < oMes.iTableLeft+oMes.iTableWidth-iCellWidth ) + { + this._fnUpdateCache( oCache, 'sPosition', 'fixed', 'position', nTable.style ); + this._fnUpdateCache( oCache, 'sTop', (oMes.iTableTop-oWin.iScrollTop)+"px", 'top', nTable.style ); + this._fnUpdateCache( oCache, 'sLeft', "0px", 'left', nTable.style ); + } + else + { + /* Fully right align */ + this._fnUpdateCache( oCache, 'sPosition', 'absolute', 'position', nTable.style ); + this._fnUpdateCache( oCache, 'sTop', oMes.iTableTop+"px", 'top', nTable.style ); + this._fnUpdateCache( oCache, 'sLeft', (oMes.iTableLeft+oMes.iTableWidth-iCellWidth)+"px", 'left', nTable.style ); + } + }, + + /* + * Function: _fnScrollFixedFooter + * Purpose: Update the positioning of the scrolling elements + * Returns: - + * Inputs: object:oCache - the cached values for this fixed element + */ + _fnScrollFixedFooter: function ( oCache ) + { + var + s = this.fnGetSettings(), + oMes = s.oMes, + oWin = FixedHeader.oWin, + oDoc = FixedHeader.oDoc, + nTable = oCache.nWrapper, + iTheadHeight = $("thead", s.nTable).outerHeight(), + iCellHeight = $(nTable).outerHeight(); + + if ( oWin.iScrollBottom < oMes.iTableBottom ) + { + /* Below */ + this._fnUpdateCache( oCache, 'sPosition', 'absolute', 'position', nTable.style ); + this._fnUpdateCache( oCache, 'sTop', (oMes.iTableTop+oMes.iTableHeight-iCellHeight)+"px", 'top', nTable.style ); + this._fnUpdateCache( oCache, 'sLeft', oMes.iTableLeft+"px", 'left', nTable.style ); + } + else if ( oWin.iScrollBottom < oMes.iTableBottom+oMes.iTableHeight-iCellHeight-iTheadHeight ) + { + this._fnUpdateCache( oCache, 'sPosition', 'fixed', 'position', nTable.style ); + this._fnUpdateCache( oCache, 'sTop', (oWin.iHeight-iCellHeight)+"px", 'top', nTable.style ); + this._fnUpdateCache( oCache, 'sLeft', (oMes.iTableLeft-oWin.iScrollLeft)+"px", 'left', nTable.style ); + } + else + { + /* Above */ + this._fnUpdateCache( oCache, 'sPosition', 'absolute', 'position', nTable.style ); + this._fnUpdateCache( oCache, 'sTop', (oMes.iTableTop+iCellHeight)+"px", 'top', nTable.style ); + this._fnUpdateCache( oCache, 'sLeft', oMes.iTableLeft+"px", 'left', nTable.style ); + } + }, + + /* + * Function: _fnScrollFixedHeader + * Purpose: Update the positioning of the scrolling elements + * Returns: - + * Inputs: object:oCache - the cached values for this fixed element + */ + _fnScrollFixedHeader: function ( oCache ) + { + var + s = this.fnGetSettings(), + oMes = s.oMes, + oWin = FixedHeader.oWin, + oDoc = FixedHeader.oDoc, + nTable = oCache.nWrapper, + iTbodyHeight = 0, + anTbodies = s.nTable.getElementsByTagName('tbody'); + + for (var i = 0; i < anTbodies.length; ++i) { + iTbodyHeight += anTbodies[i].offsetHeight; + } + + if ( oMes.iTableTop > oWin.iScrollTop + s.oOffset.top ) + { + /* Above the table */ + this._fnUpdateCache( oCache, 'sPosition', "absolute", 'position', nTable.style ); + this._fnUpdateCache( oCache, 'sTop', oMes.iTableTop+"px", 'top', nTable.style ); + this._fnUpdateCache( oCache, 'sLeft', oMes.iTableLeft+"px", 'left', nTable.style ); + } + else if ( oWin.iScrollTop + s.oOffset.top > oMes.iTableTop+iTbodyHeight ) + { + /* At the bottom of the table */ + this._fnUpdateCache( oCache, 'sPosition', "absolute", 'position', nTable.style ); + this._fnUpdateCache( oCache, 'sTop', (oMes.iTableTop+iTbodyHeight)+"px", 'top', nTable.style ); + this._fnUpdateCache( oCache, 'sLeft', oMes.iTableLeft+"px", 'left', nTable.style ); + } + else + { + /* In the middle of the table */ + this._fnUpdateCache( oCache, 'sPosition', 'fixed', 'position', nTable.style ); + this._fnUpdateCache( oCache, 'sTop', s.oOffset.top+"px", 'top', nTable.style ); + this._fnUpdateCache( oCache, 'sLeft', (oMes.iTableLeft-oWin.iScrollLeft)+"px", 'left', nTable.style ); + } + }, + + /* + * Function: _fnUpdateCache + * Purpose: Check the cache and update cache and value if needed + * Returns: - + * Inputs: object:oCache - local cache object + * string:sCache - cache property + * string:sSet - value to set + * string:sProperty - object property to set + * object:oObj - object to update + */ + _fnUpdateCache: function ( oCache, sCache, sSet, sProperty, oObj ) + { + if ( oCache[sCache] != sSet ) + { + oObj[sProperty] = sSet; + oCache[sCache] = sSet; + } + }, + + + + /** + * Copy the classes of all child nodes from one element to another. This implies + * that the two have identical structure - no error checking is performed to that + * fact. + * @param {element} source Node to copy classes from + * @param {element} dest Node to copy classes too + */ + _fnClassUpdate: function ( source, dest ) + { + var that = this; + + if ( source.nodeName.toUpperCase() === "TR" || source.nodeName.toUpperCase() === "TH" || + source.nodeName.toUpperCase() === "TD" || source.nodeName.toUpperCase() === "SPAN" ) + { + dest.className = source.className; + } + + $(source).children().each( function (i) { + that._fnClassUpdate( $(source).children()[i], $(dest).children()[i] ); + } ); + }, + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Cloning functions + */ + + /* + * Function: _fnCloneThead + * Purpose: Clone the thead element + * Returns: - + * Inputs: object:oCache - the cached values for this fixed element + */ + _fnCloneThead: function ( oCache ) + { + var s = this.fnGetSettings(); + var nTable = oCache.nNode; + + if ( s.bInitComplete && !s.oCloneOnDraw.top ) + { + this._fnClassUpdate( $('thead', s.nTable)[0], $('thead', nTable)[0] ); + return; + } + + /* Set the wrapper width to match that of the cloned table */ + var iDtWidth = $(s.nTable).outerWidth(); + oCache.nWrapper.style.width = iDtWidth+"px"; + nTable.style.width = iDtWidth+"px"; + + /* Remove any children the cloned table has */ + while ( nTable.childNodes.length > 0 ) + { + $('thead th', nTable).unbind( 'click' ); + nTable.removeChild( nTable.childNodes[0] ); + } + + /* Clone the DataTables header */ + var nThead = $('thead', s.nTable).clone(true)[0]; + nTable.appendChild( nThead ); + + /* Copy the widths across - apparently a clone isn't good enough for this */ + var a = []; + var b = []; + + $("thead>tr th", s.nTable).each( function (i) { + a.push( $(this).width() ); + } ); + + $("thead>tr td", s.nTable).each( function (i) { + b.push( $(this).width() ); + } ); + + $("thead>tr th", s.nTable).each( function (i) { + $("thead>tr th:eq("+i+")", nTable).width( a[i] ); + $(this).width( a[i] ); + } ); + + $("thead>tr td", s.nTable).each( function (i) { + $("thead>tr td:eq("+i+")", nTable).width( b[i] ); + $(this).width( b[i] ); + } ); + + // Stop DataTables 1.9 from putting a focus ring on the headers when + // clicked to sort + $('th.sorting, th.sorting_desc, th.sorting_asc', nTable).bind( 'click', function () { + this.blur(); + } ); + }, + + /* + * Function: _fnCloneTfoot + * Purpose: Clone the tfoot element + * Returns: - + * Inputs: object:oCache - the cached values for this fixed element + */ + _fnCloneTfoot: function ( oCache ) + { + var s = this.fnGetSettings(); + var nTable = oCache.nNode; + + /* Set the wrapper width to match that of the cloned table */ + oCache.nWrapper.style.width = $(s.nTable).outerWidth()+"px"; + + /* Remove any children the cloned table has */ + while ( nTable.childNodes.length > 0 ) + { + nTable.removeChild( nTable.childNodes[0] ); + } + + /* Clone the DataTables footer */ + var nTfoot = $('tfoot', s.nTable).clone(true)[0]; + nTable.appendChild( nTfoot ); + + /* Copy the widths across - apparently a clone isn't good enough for this */ + $("tfoot:eq(0)>tr th", s.nTable).each( function (i) { + $("tfoot:eq(0)>tr th:eq("+i+")", nTable).width( $(this).width() ); + } ); + + $("tfoot:eq(0)>tr td", s.nTable).each( function (i) { + $("tfoot:eq(0)>tr td:eq("+i+")", nTable).width( $(this).width() ); + } ); + }, + + /* + * Function: _fnCloneTLeft + * Purpose: Clone the left column(s) + * Returns: - + * Inputs: object:oCache - the cached values for this fixed element + */ + _fnCloneTLeft: function ( oCache ) + { + var s = this.fnGetSettings(); + var nTable = oCache.nNode; + var nBody = $('tbody', s.nTable)[0]; + + /* Remove any children the cloned table has */ + while ( nTable.childNodes.length > 0 ) + { + nTable.removeChild( nTable.childNodes[0] ); + } + + /* Is this the most efficient way to do this - it looks horrible... */ + nTable.appendChild( $("thead", s.nTable).clone(true)[0] ); + nTable.appendChild( $("tbody", s.nTable).clone(true)[0] ); + if ( s.bFooter ) + { + nTable.appendChild( $("tfoot", s.nTable).clone(true)[0] ); + } + + /* Remove unneeded cells */ + var sSelector = 'gt(' + (oCache.iCells - 1) + ')'; + $('thead tr', nTable).each( function (k) { + $('th:' + sSelector, this).remove(); + } ); + + $('tfoot tr', nTable).each( function (k) { + $('th:' + sSelector, this).remove(); + } ); + + $('tbody tr', nTable).each( function (k) { + $('td:' + sSelector, this).remove(); + } ); + + this.fnEqualiseHeights( 'thead', nBody.parentNode, nTable ); + this.fnEqualiseHeights( 'tbody', nBody.parentNode, nTable ); + this.fnEqualiseHeights( 'tfoot', nBody.parentNode, nTable ); + + var iWidth = 0; + for (var i = 0; i < oCache.iCells; i++) { + iWidth += $('thead tr th:eq(' + i + ')', s.nTable).outerWidth(); + } + nTable.style.width = iWidth+"px"; + oCache.nWrapper.style.width = iWidth+"px"; + }, + + /* + * Function: _fnCloneTRight + * Purpose: Clone the right most column(s) + * Returns: - + * Inputs: object:oCache - the cached values for this fixed element + */ + _fnCloneTRight: function ( oCache ) + { + var s = this.fnGetSettings(); + var nBody = $('tbody', s.nTable)[0]; + var nTable = oCache.nNode; + var iCols = $('tbody tr:eq(0) td', s.nTable).length; + + /* Remove any children the cloned table has */ + while ( nTable.childNodes.length > 0 ) + { + nTable.removeChild( nTable.childNodes[0] ); + } + + /* Is this the most efficient way to do this - it looks horrible... */ + nTable.appendChild( $("thead", s.nTable).clone(true)[0] ); + nTable.appendChild( $("tbody", s.nTable).clone(true)[0] ); + if ( s.bFooter ) + { + nTable.appendChild( $("tfoot", s.nTable).clone(true)[0] ); + } + $('thead tr th:lt('+(iCols-oCache.iCells)+')', nTable).remove(); + $('tfoot tr th:lt('+(iCols-oCache.iCells)+')', nTable).remove(); + + /* Remove unneeded cells */ + $('tbody tr', nTable).each( function (k) { + $('td:lt('+(iCols-oCache.iCells)+')', this).remove(); + } ); + + this.fnEqualiseHeights( 'thead', nBody.parentNode, nTable ); + this.fnEqualiseHeights( 'tbody', nBody.parentNode, nTable ); + this.fnEqualiseHeights( 'tfoot', nBody.parentNode, nTable ); + + var iWidth = 0; + for (var i = 0; i < oCache.iCells; i++) { + iWidth += $('thead tr th:eq('+(iCols-1-i)+')', s.nTable).outerWidth(); + } + nTable.style.width = iWidth+"px"; + oCache.nWrapper.style.width = iWidth+"px"; + }, + + + /** + * Equalise the heights of the rows in a given table node in a cross browser way. Note that this + * is more or less lifted as is from FixedColumns + * @method fnEqualiseHeights + * @returns void + * @param {string} parent Node type - thead, tbody or tfoot + * @param {element} original Original node to take the heights from + * @param {element} clone Copy the heights to + * @private + */ + "fnEqualiseHeights": function ( parent, original, clone ) + { + var that = this; + var originals = $(parent +' tr', original); + var height; + + $(parent+' tr', clone).each( function (k) { + height = originals.eq( k ).css('height'); + + // This is nasty :-(. IE has a sub-pixel error even when setting + // the height below (the Firefox fix) which causes the fixed column + // to go out of alignment. Need to add a pixel before the assignment + // Can this be feature detected? Not sure how... + if ( navigator.appName == 'Microsoft Internet Explorer' ) { + height = parseInt( height, 10 ) + 1; + } + + $(this).css( 'height', height ); + + // For Firefox to work, we need to also set the height of the + // original row, to the value that we read from it! Otherwise there + // is a sub-pixel rounding error + originals.eq( k ).css( 'height', height ); + } ); + } +}; + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Static properties and methods + * We use these for speed! This information is common to all instances of FixedHeader, so no + * point if having them calculated and stored for each different instance. + */ + +/* + * Variable: oWin + * Purpose: Store information about the window positioning + * Scope: FixedHeader + */ +FixedHeader.oWin = { + "iScrollTop": 0, + "iScrollRight": 0, + "iScrollBottom": 0, + "iScrollLeft": 0, + "iHeight": 0, + "iWidth": 0 +}; + +/* + * Variable: oDoc + * Purpose: Store information about the document size + * Scope: FixedHeader + */ +FixedHeader.oDoc = { + "iHeight": 0, + "iWidth": 0 +}; + +/* + * Variable: afnScroll + * Purpose: Array of functions that are to be used for the scrolling components + * Scope: FixedHeader + */ +FixedHeader.afnScroll = []; + +/* + * Function: fnMeasure + * Purpose: Update the measurements for the window and document + * Returns: - + * Inputs: - + */ +FixedHeader.fnMeasure = function () +{ + var + jqWin = $(window), + jqDoc = $(document), + oWin = FixedHeader.oWin, + oDoc = FixedHeader.oDoc; + + oDoc.iHeight = jqDoc.height(); + oDoc.iWidth = jqDoc.width(); + + oWin.iHeight = jqWin.height(); + oWin.iWidth = jqWin.width(); + oWin.iScrollTop = jqWin.scrollTop(); + oWin.iScrollLeft = jqWin.scrollLeft(); + oWin.iScrollRight = oDoc.iWidth - oWin.iScrollLeft - oWin.iWidth; + oWin.iScrollBottom = oDoc.iHeight - oWin.iScrollTop - oWin.iHeight; +}; + + +FixedHeader.version = "2.1.2"; + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Global processing + */ + +/* + * Just one 'scroll' event handler in FixedHeader, which calls the required components. This is + * done as an optimisation, to reduce calculation and proagation time + */ +$(window).scroll( function () { + FixedHeader.fnMeasure(); + + for ( var i=0, iLen=FixedHeader.afnScroll.length ; i<iLen ; i++ ) { + FixedHeader.afnScroll[i](); + } +} ); + + +$.fn.dataTable.FixedHeader = FixedHeader; +$.fn.DataTable.FixedHeader = FixedHeader; + + +return FixedHeader; +}; // /factory + + +// Define as an AMD module if possible +if ( typeof define === 'function' && define.amd ) { + define( ['jquery', 'datatables'], factory ); +} +else if ( typeof exports === 'object' ) { + // Node/CommonJS + factory( require('jquery'), require('datatables') ); +} +else if ( jQuery && !jQuery.fn.dataTable.FixedHeader ) { + // Otherwise simply initialise as normal, stopping multiple evaluation + factory( jQuery, jQuery.fn.dataTable ); +} + + +})(window, document); + diff --git a/theme/bootstrap/plugins/datatables/extensions/FixedHeader/js/dataTables.fixedHeader.min.js b/theme/bootstrap/plugins/datatables/extensions/FixedHeader/js/dataTables.fixedHeader.min.js new file mode 100644 index 0000000..1716091 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/FixedHeader/js/dataTables.fixedHeader.min.js @@ -0,0 +1,30 @@ +/*! + FixedHeader 2.1.2 + ©2010-2014 SpryMedia Ltd - datatables.net/license +*/ +var FixedHeader; +(function(j,k,h){var l=function(e){FixedHeader=function(a,b){if(!this instanceof FixedHeader)alert("FixedHeader warning: FixedHeader must be initialised with the 'new' keyword.");else{var c={aoCache:[],oSides:{top:!0,bottom:!1,left:0,right:0},oZIndexes:{top:104,bottom:103,left:102,right:101},oCloneOnDraw:{top:!1,bottom:!1,left:!0,right:!0},oMes:{iTableWidth:0,iTableHeight:0,iTableLeft:0,iTableRight:0,iTableTop:0,iTableBottom:0},oOffset:{top:0},nTable:null,bFooter:!1,bInitComplete:!1};this.fnGetSettings= +function(){return c};this.fnUpdate=function(){this._fnUpdateClones();this._fnUpdatePositions()};this.fnPosition=function(){this._fnUpdatePositions()};var d=e.fn.dataTable.Api?(new e.fn.dataTable.Api(a)).settings()[0]:a.fnSettings();d._oPluginFixedHeader=this;this.fnInit(d,b)}};FixedHeader.prototype={fnInit:function(a,b){var c=this.fnGetSettings(),d=this;this.fnInitSettings(c,b);""!==a.oScroll.sX||""!==a.oScroll.sY?alert("FixedHeader 2 is not supported with DataTables' scrolling mode at this time"): +(c.nTable=a.nTable,a.aoDrawCallback.unshift({fn:function(){FixedHeader.fnMeasure();d._fnUpdateClones.call(d);d._fnUpdatePositions.call(d)},sName:"FixedHeader"}),c.bFooter=0<e(">tfoot",c.nTable).length?!0:!1,c.oSides.top&&c.aoCache.push(d._fnCloneTable("fixedHeader","FixedHeader_Header",d._fnCloneThead)),c.oSides.bottom&&c.aoCache.push(d._fnCloneTable("fixedFooter","FixedHeader_Footer",d._fnCloneTfoot)),c.oSides.left&&c.aoCache.push(d._fnCloneTable("fixedLeft","FixedHeader_Left",d._fnCloneTLeft,c.oSides.left)), +c.oSides.right&&c.aoCache.push(d._fnCloneTable("fixedRight","FixedHeader_Right",d._fnCloneTRight,c.oSides.right)),FixedHeader.afnScroll.push(function(){d._fnUpdatePositions.call(d)}),e(j).resize(function(){FixedHeader.fnMeasure();d._fnUpdateClones.call(d);d._fnUpdatePositions.call(d)}),e(c.nTable).on("column-reorder.dt",function(){FixedHeader.fnMeasure();d._fnUpdateClones(!0);d._fnUpdatePositions()}).on("column-visibility.dt",function(){FixedHeader.fnMeasure();d._fnUpdateClones(!0);d._fnUpdatePositions()}), +FixedHeader.fnMeasure(),d._fnUpdateClones(),d._fnUpdatePositions(),c.bInitComplete=!0)},fnInitSettings:function(a,b){if(b!==h&&(b.top!==h&&(a.oSides.top=b.top),b.bottom!==h&&(a.oSides.bottom=b.bottom),"boolean"==typeof b.left?a.oSides.left=b.left?1:0:b.left!==h&&(a.oSides.left=b.left),"boolean"==typeof b.right?a.oSides.right=b.right?1:0:b.right!==h&&(a.oSides.right=b.right),b.zTop!==h&&(a.oZIndexes.top=b.zTop),b.zBottom!==h&&(a.oZIndexes.bottom=b.zBottom),b.zLeft!==h&&(a.oZIndexes.left=b.zLeft),b.zRight!== +h&&(a.oZIndexes.right=b.zRight),b.offsetTop!==h&&(a.oOffset.top=b.offsetTop),b.alwaysCloneTop!==h&&(a.oCloneOnDraw.top=b.alwaysCloneTop),b.alwaysCloneBottom!==h&&(a.oCloneOnDraw.bottom=b.alwaysCloneBottom),b.alwaysCloneLeft!==h&&(a.oCloneOnDraw.left=b.alwaysCloneLeft),b.alwaysCloneRight!==h))a.oCloneOnDraw.right=b.alwaysCloneRight},_fnCloneTable:function(a,b,c,d){var f=this.fnGetSettings(),g;"absolute"!=e(f.nTable.parentNode).css("position")&&(f.nTable.parentNode.style.position="relative");g=f.nTable.cloneNode(!1); +g.removeAttribute("id");var i=k.createElement("div");i.style.position="absolute";i.style.top="0px";i.style.left="0px";i.className+=" FixedHeader_Cloned "+a+" "+b;"fixedHeader"==a&&(i.style.zIndex=f.oZIndexes.top);"fixedFooter"==a&&(i.style.zIndex=f.oZIndexes.bottom);"fixedLeft"==a?i.style.zIndex=f.oZIndexes.left:"fixedRight"==a&&(i.style.zIndex=f.oZIndexes.right);g.style.margin="0";i.appendChild(g);k.body.appendChild(i);return{nNode:g,nWrapper:i,sType:a,sPosition:"",sTop:"",sLeft:"",fnClone:c,iCells:d}}, +_fnMeasure:function(){var a=this.fnGetSettings(),b=a.oMes,c=e(a.nTable),d=c.offset(),f=this._fnSumScroll(a.nTable.parentNode,"scrollTop");this._fnSumScroll(a.nTable.parentNode,"scrollLeft");b.iTableWidth=c.outerWidth();b.iTableHeight=c.outerHeight();b.iTableLeft=d.left+a.nTable.parentNode.scrollLeft;b.iTableTop=d.top+f;b.iTableRight=b.iTableLeft+b.iTableWidth;b.iTableRight=FixedHeader.oDoc.iWidth-b.iTableLeft-b.iTableWidth;b.iTableBottom=FixedHeader.oDoc.iHeight-b.iTableTop-b.iTableHeight},_fnSumScroll:function(a, +b){for(var c=a[b];(a=a.parentNode)&&!("HTML"==a.nodeName||"BODY"==a.nodeName);)c=a[b];return c},_fnUpdatePositions:function(){var a=this.fnGetSettings();this._fnMeasure();for(var b=0,c=a.aoCache.length;b<c;b++)"fixedHeader"==a.aoCache[b].sType?this._fnScrollFixedHeader(a.aoCache[b]):"fixedFooter"==a.aoCache[b].sType?this._fnScrollFixedFooter(a.aoCache[b]):"fixedLeft"==a.aoCache[b].sType?this._fnScrollHorizontalLeft(a.aoCache[b]):this._fnScrollHorizontalRight(a.aoCache[b])},_fnUpdateClones:function(a){var b= +this.fnGetSettings();a&&(b.bInitComplete=!1);for(var c=0,d=b.aoCache.length;c<d;c++)b.aoCache[c].fnClone.call(this,b.aoCache[c]);a&&(b.bInitComplete=!0)},_fnScrollHorizontalRight:function(a){var b=this.fnGetSettings().oMes,c=FixedHeader.oWin,d=FixedHeader.oDoc,f=a.nWrapper,g=e(f).outerWidth();c.iScrollRight<b.iTableRight?(this._fnUpdateCache(a,"sPosition","absolute","position",f.style),this._fnUpdateCache(a,"sTop",b.iTableTop+"px","top",f.style),this._fnUpdateCache(a,"sLeft",b.iTableLeft+b.iTableWidth- +g+"px","left",f.style)):b.iTableLeft<d.iWidth-c.iScrollRight-g?(this._fnUpdateCache(a,"sPosition","fixed","position",f.style),this._fnUpdateCache(a,"sTop",b.iTableTop-c.iScrollTop+"px","top",f.style),this._fnUpdateCache(a,"sLeft",c.iWidth-g+"px","left",f.style)):(this._fnUpdateCache(a,"sPosition","absolute","position",f.style),this._fnUpdateCache(a,"sTop",b.iTableTop+"px","top",f.style),this._fnUpdateCache(a,"sLeft",b.iTableLeft+"px","left",f.style))},_fnScrollHorizontalLeft:function(a){var b=this.fnGetSettings().oMes, +c=FixedHeader.oWin,d=a.nWrapper,f=e(d).outerWidth();c.iScrollLeft<b.iTableLeft?(this._fnUpdateCache(a,"sPosition","absolute","position",d.style),this._fnUpdateCache(a,"sTop",b.iTableTop+"px","top",d.style),this._fnUpdateCache(a,"sLeft",b.iTableLeft+"px","left",d.style)):c.iScrollLeft<b.iTableLeft+b.iTableWidth-f?(this._fnUpdateCache(a,"sPosition","fixed","position",d.style),this._fnUpdateCache(a,"sTop",b.iTableTop-c.iScrollTop+"px","top",d.style),this._fnUpdateCache(a,"sLeft","0px","left",d.style)): +(this._fnUpdateCache(a,"sPosition","absolute","position",d.style),this._fnUpdateCache(a,"sTop",b.iTableTop+"px","top",d.style),this._fnUpdateCache(a,"sLeft",b.iTableLeft+b.iTableWidth-f+"px","left",d.style))},_fnScrollFixedFooter:function(a){var b=this.fnGetSettings(),c=b.oMes,d=FixedHeader.oWin,f=a.nWrapper,b=e("thead",b.nTable).outerHeight(),g=e(f).outerHeight();d.iScrollBottom<c.iTableBottom?(this._fnUpdateCache(a,"sPosition","absolute","position",f.style),this._fnUpdateCache(a,"sTop",c.iTableTop+ +c.iTableHeight-g+"px","top",f.style),this._fnUpdateCache(a,"sLeft",c.iTableLeft+"px","left",f.style)):d.iScrollBottom<c.iTableBottom+c.iTableHeight-g-b?(this._fnUpdateCache(a,"sPosition","fixed","position",f.style),this._fnUpdateCache(a,"sTop",d.iHeight-g+"px","top",f.style),this._fnUpdateCache(a,"sLeft",c.iTableLeft-d.iScrollLeft+"px","left",f.style)):(this._fnUpdateCache(a,"sPosition","absolute","position",f.style),this._fnUpdateCache(a,"sTop",c.iTableTop+g+"px","top",f.style),this._fnUpdateCache(a, +"sLeft",c.iTableLeft+"px","left",f.style))},_fnScrollFixedHeader:function(a){for(var b=this.fnGetSettings(),c=b.oMes,d=FixedHeader.oWin,e=a.nWrapper,g=0,i=b.nTable.getElementsByTagName("tbody"),h=0;h<i.length;++h)g+=i[h].offsetHeight;c.iTableTop>d.iScrollTop+b.oOffset.top?(this._fnUpdateCache(a,"sPosition","absolute","position",e.style),this._fnUpdateCache(a,"sTop",c.iTableTop+"px","top",e.style),this._fnUpdateCache(a,"sLeft",c.iTableLeft+"px","left",e.style)):d.iScrollTop+b.oOffset.top>c.iTableTop+ +g?(this._fnUpdateCache(a,"sPosition","absolute","position",e.style),this._fnUpdateCache(a,"sTop",c.iTableTop+g+"px","top",e.style),this._fnUpdateCache(a,"sLeft",c.iTableLeft+"px","left",e.style)):(this._fnUpdateCache(a,"sPosition","fixed","position",e.style),this._fnUpdateCache(a,"sTop",b.oOffset.top+"px","top",e.style),this._fnUpdateCache(a,"sLeft",c.iTableLeft-d.iScrollLeft+"px","left",e.style))},_fnUpdateCache:function(a,b,c,d,e){a[b]!=c&&(e[d]=c,a[b]=c)},_fnClassUpdate:function(a,b){var c=this; +if("TR"===a.nodeName.toUpperCase()||"TH"===a.nodeName.toUpperCase()||"TD"===a.nodeName.toUpperCase()||"SPAN"===a.nodeName.toUpperCase())b.className=a.className;e(a).children().each(function(d){c._fnClassUpdate(e(a).children()[d],e(b).children()[d])})},_fnCloneThead:function(a){var b=this.fnGetSettings(),c=a.nNode;if(b.bInitComplete&&!b.oCloneOnDraw.top)this._fnClassUpdate(e("thead",b.nTable)[0],e("thead",c)[0]);else{var d=e(b.nTable).outerWidth();a.nWrapper.style.width=d+"px";for(c.style.width=d+ +"px";0<c.childNodes.length;)e("thead th",c).unbind("click"),c.removeChild(c.childNodes[0]);a=e("thead",b.nTable).clone(!0)[0];c.appendChild(a);var f=[],g=[];e("thead>tr th",b.nTable).each(function(){f.push(e(this).width())});e("thead>tr td",b.nTable).each(function(){g.push(e(this).width())});e("thead>tr th",b.nTable).each(function(a){e("thead>tr th:eq("+a+")",c).width(f[a]);e(this).width(f[a])});e("thead>tr td",b.nTable).each(function(a){e("thead>tr td:eq("+a+")",c).width(g[a]);e(this).width(g[a])}); +e("th.sorting, th.sorting_desc, th.sorting_asc",c).bind("click",function(){this.blur()})}},_fnCloneTfoot:function(a){var b=this.fnGetSettings(),c=a.nNode;for(a.nWrapper.style.width=e(b.nTable).outerWidth()+"px";0<c.childNodes.length;)c.removeChild(c.childNodes[0]);a=e("tfoot",b.nTable).clone(!0)[0];c.appendChild(a);e("tfoot:eq(0)>tr th",b.nTable).each(function(a){e("tfoot:eq(0)>tr th:eq("+a+")",c).width(e(this).width())});e("tfoot:eq(0)>tr td",b.nTable).each(function(a){e("tfoot:eq(0)>tr td:eq("+ +a+")",c).width(e(this).width())})},_fnCloneTLeft:function(a){for(var b=this.fnGetSettings(),c=a.nNode,d=e("tbody",b.nTable)[0];0<c.childNodes.length;)c.removeChild(c.childNodes[0]);c.appendChild(e("thead",b.nTable).clone(!0)[0]);c.appendChild(e("tbody",b.nTable).clone(!0)[0]);b.bFooter&&c.appendChild(e("tfoot",b.nTable).clone(!0)[0]);var f="gt("+(a.iCells-1)+")";e("thead tr",c).each(function(){e("th:"+f,this).remove()});e("tfoot tr",c).each(function(){e("th:"+f,this).remove()});e("tbody tr",c).each(function(){e("td:"+ +f,this).remove()});this.fnEqualiseHeights("thead",d.parentNode,c);this.fnEqualiseHeights("tbody",d.parentNode,c);this.fnEqualiseHeights("tfoot",d.parentNode,c);for(var g=d=0;g<a.iCells;g++)d+=e("thead tr th:eq("+g+")",b.nTable).outerWidth();c.style.width=d+"px";a.nWrapper.style.width=d+"px"},_fnCloneTRight:function(a){for(var b=this.fnGetSettings(),c=e("tbody",b.nTable)[0],d=a.nNode,f=e("tbody tr:eq(0) td",b.nTable).length;0<d.childNodes.length;)d.removeChild(d.childNodes[0]);d.appendChild(e("thead", +b.nTable).clone(!0)[0]);d.appendChild(e("tbody",b.nTable).clone(!0)[0]);b.bFooter&&d.appendChild(e("tfoot",b.nTable).clone(!0)[0]);e("thead tr th:lt("+(f-a.iCells)+")",d).remove();e("tfoot tr th:lt("+(f-a.iCells)+")",d).remove();e("tbody tr",d).each(function(){e("td:lt("+(f-a.iCells)+")",this).remove()});this.fnEqualiseHeights("thead",c.parentNode,d);this.fnEqualiseHeights("tbody",c.parentNode,d);this.fnEqualiseHeights("tfoot",c.parentNode,d);for(var g=c=0;g<a.iCells;g++)c+=e("thead tr th:eq("+(f- +1-g)+")",b.nTable).outerWidth();d.style.width=c+"px";a.nWrapper.style.width=c+"px"},fnEqualiseHeights:function(a,b,c){var d=e(a+" tr",b),f;e(a+" tr",c).each(function(a){f=d.eq(a).css("height");"Microsoft Internet Explorer"==navigator.appName&&(f=parseInt(f,10)+1);e(this).css("height",f);d.eq(a).css("height",f)})}};FixedHeader.oWin={iScrollTop:0,iScrollRight:0,iScrollBottom:0,iScrollLeft:0,iHeight:0,iWidth:0};FixedHeader.oDoc={iHeight:0,iWidth:0};FixedHeader.afnScroll=[];FixedHeader.fnMeasure=function(){var a= +e(j),b=e(k),c=FixedHeader.oWin,d=FixedHeader.oDoc;d.iHeight=b.height();d.iWidth=b.width();c.iHeight=a.height();c.iWidth=a.width();c.iScrollTop=a.scrollTop();c.iScrollLeft=a.scrollLeft();c.iScrollRight=d.iWidth-c.iScrollLeft-c.iWidth;c.iScrollBottom=d.iHeight-c.iScrollTop-c.iHeight};FixedHeader.version="2.1.2";e(j).scroll(function(){FixedHeader.fnMeasure();for(var a=0,b=FixedHeader.afnScroll.length;a<b;a++)FixedHeader.afnScroll[a]()});e.fn.dataTable.FixedHeader=FixedHeader;return e.fn.DataTable.FixedHeader= +FixedHeader};"function"===typeof define&&define.amd?define(["jquery","datatables"],l):"object"===typeof exports?l(require("jquery"),require("datatables")):jQuery&&!jQuery.fn.dataTable.FixedHeader&&l(jQuery,jQuery.fn.dataTable)})(window,document); diff --git a/theme/bootstrap/plugins/datatables/extensions/KeyTable/Readme.txt b/theme/bootstrap/plugins/datatables/extensions/KeyTable/Readme.txt new file mode 100644 index 0000000..345e911 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/KeyTable/Readme.txt @@ -0,0 +1,36 @@ +# KeyTable + +KeyTable provides enhanced accessibility and navigation options for DataTables enhanced tables, by allowing Excel like cell navigation on any table. Events (focus, blur, action etc) can be assigned to individual cells, columns, rows or all cells to allow advanced interaction options.. Key features include: + +* Easy to use spreadsheet like interaction +* Fully integrated with DataTables +* Wide range of supported events + + +# Installation + +To use KeyTable, first download DataTables ( http://datatables.net/download ) and place the unzipped KeyTable package into a `extensions` directory in the DataTables package. This will allow the pages in the examples to operate correctly. To see the examples running, open the `examples` directory in your web-browser. + + +# Basic usage + +KeyTable is initialised using the `C` option that it adds to DataTables' `dom` option. For example: + +```js +$(document).ready( function () { + var table = $('#example').DataTable(); + new $.fn.dataTable.KeyTable( table ); +} ); +``` + + +# Documentation / support + +* Documentation: http://datatables.net/extensions/keytable/ +* DataTables support forums: http://datatables.net/forums + + +# GitHub + +If you fancy getting involved with the development of KeyTable and help make it better, please refer to its GitHub repo: https://github.com/DataTables/KeyTable + diff --git a/theme/bootstrap/plugins/datatables/extensions/KeyTable/css/dataTables.keyTable.css b/theme/bootstrap/plugins/datatables/extensions/KeyTable/css/dataTables.keyTable.css new file mode 100644 index 0000000..2759df1 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/KeyTable/css/dataTables.keyTable.css @@ -0,0 +1,7 @@ + + +table.KeyTable th.focus, +table.KeyTable td.focus { + outline: 3px solid #3366FF; + outline-offset: -3px; +} diff --git a/theme/bootstrap/plugins/datatables/extensions/KeyTable/css/dataTables.keyTable.min.css b/theme/bootstrap/plugins/datatables/extensions/KeyTable/css/dataTables.keyTable.min.css new file mode 100644 index 0000000..db04020 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/KeyTable/css/dataTables.keyTable.min.css @@ -0,0 +1 @@ +table.KeyTable th.focus,table.KeyTable td.focus{outline:3px solid #3366FF;outline-offset:-3px} diff --git a/theme/bootstrap/plugins/datatables/extensions/KeyTable/examples/events.html b/theme/bootstrap/plugins/datatables/extensions/KeyTable/examples/events.html new file mode 100644 index 0000000..2ef0a9f --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/KeyTable/examples/events.html @@ -0,0 +1,756 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>KeyTable example - Events</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.keyTable.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.keyTable.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +function eventMsg ( msg ) { + var n = document.getElementById('info'); + n.innerHTML += msg+"<br>"; + n.scrollTop = n.scrollHeight; +} + +$(document).ready(function() { + var table = $('#example').DataTable(); + var keys = new $.fn.dataTable.KeyTable( table ); + + /* Focus handler for all cells in last column */ + keys.event.focus( 4, null, function( node, x, y ) { + eventMsg( "Cell "+x+","+y+" focused ('live' event - column)" ); + } ); + + /* Focus handler for all cells in 8th row */ + keys.event.focus( null, 7, function( node, x, y ) { + eventMsg( "Cell "+x+","+y+" focused ('live' event - row)" ); + } ); + + /* Focus using coords. */ + keys.event.focus( 1, 0, function( node ) { + keys.event.remove.focus( node ); + eventMsg( "Cell 1,0 focus - this event has now been removed" ); + } ); + + keys.event.focus( 1, 3, function() { + eventMsg( "Cell 1,3 focus" ); + } ); + + /* focus with a node */ + keys.event.focus( $('#example tbody tr:eq(2) td:eq(0)')[0], function() { + eventMsg( "Cell 0,2 focus" ); + } ); + + /* Blur using a node */ + keys.event.blur( $('#example tbody tr:eq(1) td:eq(2)')[0], function() { + eventMsg( "Cell 1,2 blur" ); + } ); + + /* Blur using coords */ + keys.event.blur( 2, 4, function() { + eventMsg( "Cell 2,4 blur" ); + } ); + + /* Action */ + keys.event.action( 2, 2, function( node ) { + eventMsg( "Cell 2,2 action" ); + if ( node.style.fontWeight == "" || node.style.fontWeight == "normal" ) { + node.style.fontWeight = "bold"; + } + else { + node.style.fontWeight = "normal"; + } + } ); + + keys.event.action( 2, 5, function( node ) { + eventMsg( "Cell 2,5 action" ); + if ( node.style.fontStyle == "" ) { + node.style.fontStyle = "italic"; + } + else { + node.style.fontStyle = ""; + } + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>KeyTable example <span>Events</span></h1> + + <div class="info"> + <p>KeyTable provides the ability to listen for events such as <code>focus</code>, <code>blur</code>, + <code>esc</code> (the escape key) and 'return' (the return key) can be assigned event handling + functions through KeyTable's the API. This gives you the ability to take an action on a cell.</p> + + <p>The example shown below has a few cells (selected at random, but near the top) with blur and focus + events assigned to them. You can also see the navigation around the table using arrow keys.</p> + </div> + + <div id="info" class="box"> + Event information:<br> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this + example:</p><code class="multiline brush: js;">function eventMsg ( msg ) { + var n = document.getElementById('info'); + n.innerHTML += msg+&quot;&lt;br&gt;&quot;; + n.scrollTop = n.scrollHeight; +} + +$(document).ready(function() { + var table = $('#example').DataTable(); + var keys = new $.fn.dataTable.KeyTable( table ); + + /* Focus handler for all cells in last column */ + keys.event.focus( 4, null, function( node, x, y ) { + eventMsg( &quot;Cell &quot;+x+&quot;,&quot;+y+&quot; focused ('live' event - column)&quot; ); + } ); + + /* Focus handler for all cells in 8th row */ + keys.event.focus( null, 7, function( node, x, y ) { + eventMsg( &quot;Cell &quot;+x+&quot;,&quot;+y+&quot; focused ('live' event - row)&quot; ); + } ); + + /* Focus using coords. */ + keys.event.focus( 1, 0, function( node ) { + keys.event.remove.focus( node ); + eventMsg( &quot;Cell 1,0 focus - this event has now been removed&quot; ); + } ); + + keys.event.focus( 1, 3, function() { + eventMsg( &quot;Cell 1,3 focus&quot; ); + } ); + + /* focus with a node */ + keys.event.focus( $('#example tbody tr:eq(2) td:eq(0)')[0], function() { + eventMsg( &quot;Cell 0,2 focus&quot; ); + } ); + + /* Blur using a node */ + keys.event.blur( $('#example tbody tr:eq(1) td:eq(2)')[0], function() { + eventMsg( &quot;Cell 1,2 blur&quot; ); + } ); + + /* Blur using coords */ + keys.event.blur( 2, 4, function() { + eventMsg( &quot;Cell 2,4 blur&quot; ); + } ); + + /* Action */ + keys.event.action( 2, 2, function( node ) { + eventMsg( &quot;Cell 2,2 action&quot; ); + if ( node.style.fontWeight == &quot;&quot; || node.style.fontWeight == &quot;normal&quot; ) { + node.style.fontWeight = &quot;bold&quot;; + } + else { + node.style.fontWeight = &quot;normal&quot;; + } + } ); + + keys.event.action( 2, 5, function( node ) { + eventMsg( &quot;Cell 2,5 action&quot; ); + if ( node.style.fontStyle == &quot;&quot; ) { + node.style.fontStyle = &quot;italic&quot;; + } + else { + node.style.fontStyle = &quot;&quot;; + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this + example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href= + "../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.keyTable.js">../js/dataTables.keyTable.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:</p><code class="multiline brush: js;"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the + table:</p> + + <ul> + <li><a href= + "../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.keyTable.css">../css/dataTables.keyTable.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using <a href="//datatables.net/manual/server-side">the protocol described in the + DataTables documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li class="active"><a href="./events.html">Events</a></li> + <li><a href="./scrolling.html">Scrolling table</a></li> + <li><a href="./html.html">Plain HTML table</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/KeyTable/examples/html.html b/theme/bootstrap/plugins/datatables/extensions/KeyTable/examples/html.html new file mode 100644 index 0000000..a0a0e10 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/KeyTable/examples/html.html @@ -0,0 +1,627 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>KeyTable example - Plain HTML table</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.keyTable.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.keyTable.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').addClass('KeyTable'); + new $.fn.dataTable.KeyTable(); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>KeyTable example <span>Plain HTML table</span></h1> + + <div class="info"> + <p>As well as being usable with DataTables, KeyTable can also be used with a plain HTML table. Please + note that this ability is deprecated and will be removed in KeyTable 1.3.</p> + + <p>This example shows KeyTable being initialised without any parameter, which instructs it to search + for any table with the class <code>KeyTable</code> which will be used.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this + example:</p><code class="multiline brush: js;">$(document).ready(function() { + $('#example').addClass('KeyTable'); + new $.fn.dataTable.KeyTable(); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this + example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href= + "../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.keyTable.js">../js/dataTables.keyTable.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:</p><code class="multiline brush: js;"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the + table:</p> + + <ul> + <li><a href= + "../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.keyTable.css">../css/dataTables.keyTable.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using <a href="//datatables.net/manual/server-side">the protocol described in the + DataTables documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./events.html">Events</a></li> + <li><a href="./scrolling.html">Scrolling table</a></li> + <li class="active"><a href="./html.html">Plain HTML table</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/KeyTable/examples/index.html b/theme/bootstrap/plugins/datatables/extensions/KeyTable/examples/index.html new file mode 100644 index 0000000..71ab0a8 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/KeyTable/examples/index.html @@ -0,0 +1,69 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + + <title>KeyTable examples - KeyTable examples</title> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>KeyTable example <span>KeyTable examples</span></h1> + + <div class="info"> + <p>KeyTable provides enhanced accessibility and navigation options for DataTables enhanced tables, by + allowing Excel like cell navigation on any table. Events (focus, blur, action etc) can be assigned to + individual cells, columns, rows or all cells to allow advanced interaction options.. Key features + include:</p> + + <ul class="markdown"> + <li>Easy to use spreadsheet like interaction</li> + <li>Fully integrated with DataTables</li> + <li>Wide range of supported events</li> + <li>Works without DataTables if you just want a plain table</li> + </ul> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./events.html">Events</a></li> + <li><a href="./scrolling.html">Scrolling table</a></li> + <li><a href="./html.html">Plain HTML table</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/KeyTable/examples/scrolling.html b/theme/bootstrap/plugins/datatables/extensions/KeyTable/examples/scrolling.html new file mode 100644 index 0000000..6df1580 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/KeyTable/examples/scrolling.html @@ -0,0 +1,637 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>KeyTable example - Scrolling table</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.keyTable.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.keyTable.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: 300, + paging: false + } ); + + new $.fn.dataTable.KeyTable( table ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>KeyTable example <span>Scrolling table</span></h1> + + <div class="info"> + <p>KeyTable supports DataTables' scrolling options (<a href= + "//datatables.net/reference/option/scrollX"><code class="option" title= + "DataTables initialisation option">scrollX<span>DT</span></code></a> and <a href= + "//datatables.net/reference/option/scrollY"><code class="option" title= + "DataTables initialisation option">scrollY<span>DT</span></code></a>) without required any additional + configuration. As the navigation keys are used to alter the focus of the KeyTable, the DataTables + scrolling position is altered to show the focused cell.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this + example:</p><code class="multiline brush: js;">$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: 300, + paging: false + } ); + + new $.fn.dataTable.KeyTable( table ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this + example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href= + "../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.keyTable.js">../js/dataTables.keyTable.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:</p><code class="multiline brush: js;"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the + table:</p> + + <ul> + <li><a href= + "../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.keyTable.css">../css/dataTables.keyTable.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using <a href="//datatables.net/manual/server-side">the protocol described in the + DataTables documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./events.html">Events</a></li> + <li class="active"><a href="./scrolling.html">Scrolling table</a></li> + <li><a href="./html.html">Plain HTML table</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/KeyTable/examples/simple.html b/theme/bootstrap/plugins/datatables/extensions/KeyTable/examples/simple.html new file mode 100644 index 0000000..e18ed1c --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/KeyTable/examples/simple.html @@ -0,0 +1,631 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>KeyTable example - Basic initialisation</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.keyTable.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.keyTable.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable(); + + new $.fn.dataTable.KeyTable( table ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>KeyTable example <span>Basic initialisation</span></h1> + + <div class="info"> + <p>KeyTable allows you to use keyboard navigation on a DataTables enhanced table, like an Excel + spreadsheet. The focused cell is shown through the CSS class ('focus') which in the case below is + simply a blue border. Use your keyboard's arrow keys and click the cells in the table to navigate.</p> + + <p>This example simply shows key table being initialised on a DataTable, but <a href= + "events.html">events</a> can be listened for through the KeyTable API which provide interaction + options.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this + example:</p><code class="multiline brush: js;">$(document).ready(function() { + var table = $('#example').DataTable(); + + new $.fn.dataTable.KeyTable( table ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this + example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href= + "../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.keyTable.js">../js/dataTables.keyTable.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:</p><code class="multiline brush: js;"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the + table:</p> + + <ul> + <li><a href= + "../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.keyTable.css">../css/dataTables.keyTable.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using <a href="//datatables.net/manual/server-side">the protocol described in the + DataTables documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li class="active"><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./events.html">Events</a></li> + <li><a href="./scrolling.html">Scrolling table</a></li> + <li><a href="./html.html">Plain HTML table</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/KeyTable/js/dataTables.keyTable.js b/theme/bootstrap/plugins/datatables/extensions/KeyTable/js/dataTables.keyTable.js new file mode 100644 index 0000000..f303f76 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/KeyTable/js/dataTables.keyTable.js @@ -0,0 +1,1175 @@ +/*! KeyTable 1.2.1 + * ©2010-2014 SpryMedia Ltd - datatables.net/license + */ + +/** + * @summary KeyTable + * @description Spreadsheet like keyboard navigation for DataTables + * @version 1.2.1 + * @file dataTables.keyTable.js + * @author SpryMedia Ltd (www.sprymedia.co.uk) + * @contact www.sprymedia.co.uk/contact + * @copyright Copyright 2009-2014 SpryMedia Ltd. + * + * This source file is free software, available under the following license: + * MIT license - http://datatables.net/license/mit + * + * This source file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. + * + * For details please refer to: http://www.datatables.net + */ + +// Global scope for KeyTable for backwards compatibility. Will be removed in 1.3 +var KeyTable; + + +(function(window, document, undefined) { + + +var factory = function( $, DataTable ) { +"use strict"; + +KeyTable = function ( oInit ) +{ + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * API parameters + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /* + * Variable: block + * Purpose: Flag whether or not KeyTable events should be processed + * Scope: KeyTable - public + */ + this.block = false; + + /* + * Variable: event + * Purpose: Container for all event application methods + * Scope: KeyTable - public + * Notes: This object contains all the public methods for adding and removing events - these + * are dynamically added later on + */ + this.event = { + "remove": {} + }; + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * API methods + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /* + * Function: fnGetCurrentPosition + * Purpose: Get the currently focused cell's position + * Returns: array int: [ x, y ] + * Inputs: void + */ + this.fnGetCurrentPosition = function () + { + return [ _iOldX, _iOldY ]; + }; + + + /* + * Function: fnGetCurrentData + * Purpose: Get the currently focused cell's data (innerHTML) + * Returns: string: - data requested + * Inputs: void + */ + this.fnGetCurrentData = function () + { + return _nOldFocus.innerHTML; + }; + + + /* + * Function: fnGetCurrentTD + * Purpose: Get the currently focused cell + * Returns: node: - focused element + * Inputs: void + */ + this.fnGetCurrentTD = function () + { + return _nOldFocus; + }; + + + /* + * Function: fnSetPosition + * Purpose: Set the position of the focused cell + * Returns: - + * Inputs: int:x - x coordinate + * int:y - y coordinate + * Notes: Thanks to Rohan Daxini for the basis of this function + */ + this.fnSetPosition = function( x, y ) + { + if ( typeof x == 'object' && x.nodeName ) + { + _fnSetFocus( x ); + } + else + { + _fnSetFocus( _fnCellFromCoords(x, y) ); + } + }; + + + /* + * Function: fnBlur + * Purpose: Blur the current focus + * Returns: - + * Inputs: - + */ + this.fnBlur = function() + { + _fnBlur(); + }; + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Private parameters + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /* + * Variable: _nBody + * Purpose: Body node of the table - cached for renference + * Scope: KeyTable - private + */ + var _nBody = null; + + /* + * Variable: + * Purpose: + * Scope: KeyTable - private + */ + var _nOldFocus = null; + + /* + * Variable: _iOldX and _iOldY + * Purpose: X and Y coords of the old elemet that was focused on + * Scope: KeyTable - private + */ + var _iOldX = null; + var _iOldY = null; + + /* + * Variable: _that + * Purpose: Scope saving for 'this' after a jQuery event + * Scope: KeyTable - private + */ + var _that = null; + + /* + * Variable: sFocusClass + * Purpose: Class that should be used for focusing on a cell + * Scope: KeyTable - private + */ + var _sFocusClass = "focus"; + + /* + * Variable: _bKeyCapture + * Purpose: Flag for should KeyTable capture key events or not + * Scope: KeyTable - private + */ + var _bKeyCapture = false; + + /* + * Variable: _oaoEvents + * Purpose: Event cache object, one array for each supported event for speed of searching + * Scope: KeyTable - private + */ + var _oaoEvents = { + "action": [], + "esc": [], + "focus": [], + "blur": [] + }; + + /* + * Variable: _oDatatable + * Purpose: DataTables settings object for if we are actually using a + * DataTables table + * Scope: KeyTable - private + */ + var _oDatatable = null; + + var _bForm; + var _nInput; + var _bInputFocused = false; + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Private methods + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Key table events + */ + + /* + * Function: _fnEventAddTemplate + * Purpose: Create a function (with closure for sKey) event addition API + * Returns: function: - template function + * Inputs: string:sKey - type of event to detect + */ + function _fnEventAddTemplate( sKey ) + { + /* + * Function: - + * Purpose: API function for adding event to cache + * Returns: - + * Inputs: 1. node:x - target node to add event for + * 2. function:y - callback function to apply + * or + * 1. int:x - x coord. of target cell (can be null for live events) + * 2. int:y - y coord. of target cell (can be null for live events) + * 3. function:z - callback function to apply + * Notes: This function is (interally) overloaded (in as much as javascript allows for + * that) - the target cell can be given by either node or coords. + */ + return function ( x, y, z ) { + if ( (x===null || typeof x == "number") && + (y===null || typeof y == "number") && + typeof z == "function" ) + { + _fnEventAdd( sKey, x, y, z ); + } + else if ( typeof x == "object" && typeof y == "function" ) + { + var aCoords = _fnCoordsFromCell( x ); + _fnEventAdd( sKey, aCoords[0], aCoords[1], y ); + } + else + { + alert( "Unhandable event type was added: x" +x+ " y:" +y+ " z:" +z ); + } + }; + } + + + /* + * Function: _fnEventRemoveTemplate + * Purpose: Create a function (with closure for sKey) event removal API + * Returns: function: - template function + * Inputs: string:sKey - type of event to detect + */ + function _fnEventRemoveTemplate( sKey ) + { + /* + * Function: - + * Purpose: API function for removing event from cache + * Returns: int: - number of events removed + * Inputs: 1. node:x - target node to remove event from + * 2. function:y - callback function to apply + * or + * 1. int:x - x coord. of target cell (can be null for live events) + * 2. int:y - y coord. of target cell (can be null for live events) + * 3. function:z - callback function to remove - optional + * Notes: This function is (interally) overloaded (in as much as javascript allows for + * that) - the target cell can be given by either node or coords and the function + * to remove is optional + */ + return function ( x, y, z ) { + if ( (x===null || typeof arguments[0] == "number") && + (y===null || typeof arguments[1] == "number" ) ) + { + if ( typeof arguments[2] == "function" ) + { + _fnEventRemove( sKey, x, y, z ); + } + else + { + _fnEventRemove( sKey, x, y ); + } + } + else if ( typeof arguments[0] == "object" ) + { + var aCoords = _fnCoordsFromCell( x ); + if ( typeof arguments[1] == "function" ) + { + _fnEventRemove( sKey, aCoords[0], aCoords[1], y ); + } + else + { + _fnEventRemove( sKey, aCoords[0], aCoords[1] ); + } + } + else + { + alert( "Unhandable event type was removed: x" +x+ " y:" +y+ " z:" +z ); + } + }; + } + + /* Use the template functions to add the event API functions */ + for ( var sKey in _oaoEvents ) + { + if ( sKey ) + { + this.event[sKey] = _fnEventAddTemplate( sKey ); + this.event.remove[sKey] = _fnEventRemoveTemplate( sKey ); + } + } + + + /* + * Function: _fnEventAdd + * Purpose: Add an event to the internal cache + * Returns: - + * Inputs: string:sType - type of event to add, given by the available elements in _oaoEvents + * int:x - x-coords to add event to - can be null for "blanket" event + * int:y - y-coords to add event to - can be null for "blanket" event + * function:fn - callback function for when triggered + */ + function _fnEventAdd( sType, x, y, fn ) + { + _oaoEvents[sType].push( { + "x": x, + "y": y, + "fn": fn + } ); + } + + + /* + * Function: _fnEventRemove + * Purpose: Remove an event from the event cache + * Returns: int: - number of matching events removed + * Inputs: string:sType - type of event to look for + * node:nTarget - target table cell + * function:fn - optional - remove this function. If not given all handlers of this + * type will be removed + */ + function _fnEventRemove( sType, x, y, fn ) + { + var iCorrector = 0; + + for ( var i=0, iLen=_oaoEvents[sType].length ; i<iLen-iCorrector ; i++ ) + { + if ( typeof fn != 'undefined' ) + { + if ( _oaoEvents[sType][i-iCorrector].x == x && + _oaoEvents[sType][i-iCorrector].y == y && + _oaoEvents[sType][i-iCorrector].fn == fn ) + { + _oaoEvents[sType].splice( i-iCorrector, 1 ); + iCorrector++; + } + } + else + { + if ( _oaoEvents[sType][i-iCorrector].x == x && + _oaoEvents[sType][i-iCorrector].y == y ) + { + _oaoEvents[sType].splice( i, 1 ); + return 1; + } + } + } + return iCorrector; + } + + + /* + * Function: _fnEventFire + * Purpose: Look thought the events cache and fire off the event of interest + * Returns: int:iFired - number of events fired + * Inputs: string:sType - type of event to look for + * int:x - x coord of cell + * int:y - y coord of ell + * Notes: It might be more efficient to return after the first event has been tirggered, + * but that would mean that only one function of a particular type can be + * subscribed to a particular node. + */ + function _fnEventFire ( sType, x, y ) + { + var iFired = 0; + var aEvents = _oaoEvents[sType]; + for ( var i=0 ; i<aEvents.length ; i++ ) + { + if ( (aEvents[i].x == x && aEvents[i].y == y ) || + (aEvents[i].x === null && aEvents[i].y == y ) || + (aEvents[i].x == x && aEvents[i].y === null ) || + (aEvents[i].x === null && aEvents[i].y === null ) + ) + { + aEvents[i].fn( _fnCellFromCoords(x,y), x, y ); + iFired++; + } + } + return iFired; + } + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Focus functions + */ + + /* + * Function: _fnSetFocus + * Purpose: Set focus on a node, and remove from an old node if needed + * Returns: - + * Inputs: node:nTarget - node we want to focus on + * bool:bAutoScroll - optional - should we scroll the view port to the display + */ + function _fnSetFocus( nTarget, bAutoScroll ) + { + /* If node already has focus, just ignore this call */ + if ( _nOldFocus == nTarget ) + { + return; + } + + if ( typeof bAutoScroll == 'undefined' ) + { + bAutoScroll = true; + } + + /* Remove old focus (with blur event if needed) */ + if ( _nOldFocus !== null ) + { + _fnRemoveFocus( _nOldFocus ); + } + + /* Add the new class to highlight the focused cell */ + $(nTarget).addClass( _sFocusClass ); + $(nTarget).parent().addClass( _sFocusClass ); + + /* If it's a DataTable then we need to jump the paging to the relevant page */ + var oSettings; + if ( _oDatatable ) + { + oSettings = _oDatatable; + var iRow = _fnFindDtCell( nTarget )[1]; + var bKeyCaptureCache = _bKeyCapture; + + /* Page forwards */ + while ( iRow >= oSettings.fnDisplayEnd() ) + { + if ( oSettings._iDisplayLength >= 0 ) + { + /* Make sure we are not over running the display array */ + if ( oSettings._iDisplayStart + oSettings._iDisplayLength < oSettings.fnRecordsDisplay() ) + { + oSettings._iDisplayStart += oSettings._iDisplayLength; + } + } + else + { + oSettings._iDisplayStart = 0; + } + _oDatatable.oApi._fnCalculateEnd( oSettings ); + } + + /* Page backwards */ + while ( iRow < oSettings._iDisplayStart ) + { + oSettings._iDisplayStart = oSettings._iDisplayLength>=0 ? + oSettings._iDisplayStart - oSettings._iDisplayLength : + 0; + + if ( oSettings._iDisplayStart < 0 ) + { + oSettings._iDisplayStart = 0; + } + _oDatatable.oApi._fnCalculateEnd( oSettings ); + } + + /* Re-draw the table */ + _oDatatable.oApi._fnDraw( oSettings ); + + /* Restore the key capture */ + _bKeyCapture = bKeyCaptureCache; + } + + /* Cache the information that we are interested in */ + var aNewPos = _fnCoordsFromCell( nTarget ); + _nOldFocus = nTarget; + _iOldX = aNewPos[0]; + _iOldY = aNewPos[1]; + + var iViewportHeight, iViewportWidth, iScrollTop, iScrollLeft, iHeight, iWidth, aiPos; + if ( bAutoScroll ) + { + /* Scroll the viewport such that the new cell is fully visible in the rendered window */ + iViewportHeight = $(window).height(); + iViewportWidth = $(window).width(); + iScrollTop = $(document).scrollTop(); + iScrollLeft = $(document).scrollLeft(); + iHeight = nTarget.offsetHeight; + iWidth = nTarget.offsetWidth; + aiPos = _fnGetPos( nTarget ); + + /* Take account of scrolling in DataTables 1.7 - remove scrolling since that would add to + * the positioning calculation + */ + if ( _oDatatable && typeof oSettings.oScroll != 'undefined' && + (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") ) + { + aiPos[1] -= $(oSettings.nTable.parentNode).scrollTop(); + aiPos[0] -= $(oSettings.nTable.parentNode).scrollLeft(); + } + + /* Correct viewport positioning for vertical scrolling */ + if ( aiPos[1]+iHeight > iScrollTop+iViewportHeight ) + { + /* Displayed element if off the bottom of the viewport */ + _fnSetScrollTop( aiPos[1]+iHeight - iViewportHeight ); + } + else if ( aiPos[1] < iScrollTop ) + { + /* Displayed element if off the top of the viewport */ + _fnSetScrollTop( aiPos[1] ); + } + + /* Correct viewport positioning for horizontal scrolling */ + if ( aiPos[0]+iWidth > iScrollLeft+iViewportWidth ) + { + /* Displayed element is off the bottom of the viewport */ + _fnSetScrollLeft( aiPos[0]+iWidth - iViewportWidth ); + } + else if ( aiPos[0] < iScrollLeft ) + { + /* Displayed element if off the Left of the viewport */ + _fnSetScrollLeft( aiPos[0] ); + } + } + + /* Take account of scrolling in DataTables 1.7 */ + if ( _oDatatable && typeof oSettings.oScroll != 'undefined' && + (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") ) + { + var dtScrollBody = oSettings.nTable.parentNode; + iViewportHeight = dtScrollBody.clientHeight; + iViewportWidth = dtScrollBody.clientWidth; + iScrollTop = dtScrollBody.scrollTop; + iScrollLeft = dtScrollBody.scrollLeft; + iHeight = nTarget.offsetHeight; + iWidth = nTarget.offsetWidth; + + /* Correct for vertical scrolling */ + if ( nTarget.offsetTop + iHeight > iViewportHeight+iScrollTop ) + { + dtScrollBody.scrollTop = (nTarget.offsetTop + iHeight) - iViewportHeight; + } + else if ( nTarget.offsetTop < iScrollTop ) + { + dtScrollBody.scrollTop = nTarget.offsetTop; + } + + /* Correct for horizontal scrolling */ + if ( nTarget.offsetLeft + iWidth > iViewportWidth+iScrollLeft ) + { + dtScrollBody.scrollLeft = (nTarget.offsetLeft + iWidth) - iViewportWidth; + } + else if ( nTarget.offsetLeft < iScrollLeft ) + { + dtScrollBody.scrollLeft = nTarget.offsetLeft; + } + } + + /* Focused - so we want to capture the keys */ + _fnCaptureKeys(); + + /* Fire of the focus event if there is one */ + _fnEventFire( "focus", _iOldX, _iOldY ); + } + + + /* + * Function: _fnBlur + * Purpose: Blur focus from the whole table + * Returns: - + * Inputs: - + */ + function _fnBlur() + { + _fnRemoveFocus( _nOldFocus ); + _iOldX = null; + _iOldY = null; + _nOldFocus = null; + _fnReleaseKeys(); + } + + + /* + * Function: _fnRemoveFocus + * Purpose: Remove focus from a cell and fire any blur events which are attached + * Returns: - + * Inputs: node:nTarget - cell of interest + */ + function _fnRemoveFocus( nTarget ) + { + $(nTarget).removeClass( _sFocusClass ); + $(nTarget).parent().removeClass( _sFocusClass ); + _fnEventFire( "blur", _iOldX, _iOldY ); + } + + + /* + * Function: _fnClick + * Purpose: Focus on the element that has been clicked on by the user + * Returns: - + * Inputs: event:e - click event + */ + function _fnClick ( e ) + { + var nTarget = this; + while ( nTarget.nodeName != "TD" ) + { + nTarget = nTarget.parentNode; + } + + _fnSetFocus( nTarget ); + _fnCaptureKeys(); + } + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Key events + */ + + /* + * Function: _fnKey + * Purpose: Deal with a key events, be it moving the focus or return etc. + * Returns: bool: - allow browser default action + * Inputs: event:e - key event + */ + function _fnKey ( e ) + { + /* If user or system has blocked KeyTable from doing anything, just ignore this event */ + if ( _that.block || !_bKeyCapture ) + { + return true; + } + + /* If a modifier key is pressed (exapct shift), ignore the event */ + if ( e.metaKey || e.altKey || e.ctrlKey ) + { + return true; + } + var + x, y, + iTableWidth = _nBody.getElementsByTagName('tr')[0].getElementsByTagName('td').length, + iTableHeight; + + /* Get table height and width - done here so as to be dynamic (if table is updated) */ + if ( _oDatatable ) + { + /* + * Locate the current node in the DataTable overriding the old positions - the reason for + * is is that there might have been some DataTables interaction between the last focus and + * now + */ + iTableHeight = _oDatatable.aiDisplay.length; + + var aDtPos = _fnFindDtCell( _nOldFocus ); + if ( aDtPos === null ) + { + /* If the table has been updated such that the focused cell can't be seen - do nothing */ + return; + } + _iOldX = aDtPos[ 0 ]; + _iOldY = aDtPos[ 1 ]; + } + else + { + iTableHeight = _nBody.getElementsByTagName('tr').length; + } + + /* Capture shift+tab to match the left arrow key */ + var iKey = (e.keyCode == 9 && e.shiftKey) ? -1 : e.keyCode; + + switch( iKey ) + { + case 13: /* return */ + e.preventDefault(); + e.stopPropagation(); + _fnEventFire( "action", _iOldX, _iOldY ); + return true; + + case 27: /* esc */ + if ( !_fnEventFire( "esc", _iOldX, _iOldY ) ) + { + /* Only lose focus if there isn't an escape handler on the cell */ + _fnBlur(); + return; + } + x = _iOldX; + y = _iOldY; + break; + + case -1: + case 37: /* left arrow */ + if ( _iOldX > 0 ) { + x = _iOldX - 1; + y = _iOldY; + } else if ( _iOldY > 0 ) { + x = iTableWidth-1; + y = _iOldY - 1; + } else { + /* at start of table */ + if ( iKey == -1 && _bForm ) + { + /* If we are in a form, return focus to the 'input' element such that tabbing will + * follow correctly in the browser + */ + _bInputFocused = true; + _nInput.focus(); + + /* This timeout is a little nasty - but IE appears to have some asyhnc behaviour for + * focus + */ + setTimeout( function(){ _bInputFocused = false; }, 0 ); + _bKeyCapture = false; + _fnBlur(); + return true; + } + else + { + return false; + } + } + break; + + case 38: /* up arrow */ + if ( _iOldY > 0 ) { + x = _iOldX; + y = _iOldY - 1; + } else { + return false; + } + break; + + case 36: /* home */ + x = _iOldX; + y = 0; + break; + + case 33: /* page up */ + x = _iOldX; + y = _iOldY - 10; + if (y < 0) { + y = 0; + } + break; + + case 9: /* tab */ + case 39: /* right arrow */ + if ( _iOldX < iTableWidth-1 ) { + x = _iOldX + 1; + y = _iOldY; + } else if ( _iOldY < iTableHeight-1 ) { + x = 0; + y = _iOldY + 1; + } else { + /* at end of table */ + if ( iKey == 9 && _bForm ) + { + /* If we are in a form, return focus to the 'input' element such that tabbing will + * follow correctly in the browser + */ + _bInputFocused = true; + _nInput.focus(); + + /* This timeout is a little nasty - but IE appears to have some asyhnc behaviour for + * focus + */ + setTimeout( function(){ _bInputFocused = false; }, 0 ); + _bKeyCapture = false; + _fnBlur(); + return true; + } + else + { + return false; + } + } + break; + + case 40: /* down arrow */ + if ( _iOldY < iTableHeight-1 ) { + x = _iOldX; + y = _iOldY + 1; + } else { + return false; + } + break; + + case 35: /* end */ + x = _iOldX; + y = iTableHeight-1; + break; + + case 34: /* page down */ + x = _iOldX; + y = _iOldY+10; + if (y > iTableHeight-1) { + y = iTableHeight-1; + } + break; + + default: /* Nothing we are interested in */ + return true; + } + + _fnSetFocus( _fnCellFromCoords(x, y) ); + return false; + } + + + /* + * Function: _fnCaptureKeys + * Purpose: Start capturing key events for this table + * Returns: - + * Inputs: - + */ + function _fnCaptureKeys( ) + { + if ( !_bKeyCapture ) + { + _bKeyCapture = true; + } + } + + + /* + * Function: _fnReleaseKeys + * Purpose: Stop capturing key events for this table + * Returns: - + * Inputs: - + */ + function _fnReleaseKeys( ) + { + _bKeyCapture = false; + } + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Support functions + */ + + /* + * Function: _fnCellFromCoords + * Purpose: Calulate the target TD cell from x and y coordinates + * Returns: node: - TD target + * Inputs: int:x - x coordinate + * int:y - y coordinate + */ + function _fnCellFromCoords( x, y ) + { + if ( _oDatatable ) + { + if ( typeof _oDatatable.aoData[ _oDatatable.aiDisplay[ y ] ] != 'undefined' ) + { + return _oDatatable.aoData[ _oDatatable.aiDisplay[ y ] ].nTr.getElementsByTagName('td')[x]; + } + else + { + return null; + } + } + else + { + return $('tr:eq('+y+')>td:eq('+x+')', _nBody )[0]; + } + } + + + /* + * Function: _fnCoordsFromCell + * Purpose: Calculate the x and y position in a table from a TD cell + * Returns: array[2] int: [x, y] + * Inputs: node:n - TD cell of interest + * Notes: Not actually interested in this for DataTables since it might go out of date + */ + function _fnCoordsFromCell( n ) + { + if ( _oDatatable ) + { + return [ + $('td', n.parentNode).index(n), + $('tr', n.parentNode.parentNode).index(n.parentNode) + _oDatatable._iDisplayStart + ]; + } + else + { + return [ + $('td', n.parentNode).index(n), + $('tr', n.parentNode.parentNode).index(n.parentNode) + ]; + } + } + + + /* + * Function: _fnSetScrollTop + * Purpose: Set the vertical scrolling position + * Returns: - + * Inputs: int:iPos - scrolltop + * Notes: This is so nasty, but without browser detection you can't tell which you should set + * So on browsers that support both, the scroll top will be set twice. I can live with + * that :-) + */ + function _fnSetScrollTop( iPos ) + { + document.documentElement.scrollTop = iPos; + document.body.scrollTop = iPos; + } + + + /* + * Function: _fnSetScrollLeft + * Purpose: Set the horizontal scrolling position + * Returns: - + * Inputs: int:iPos - scrollleft + */ + function _fnSetScrollLeft( iPos ) + { + document.documentElement.scrollLeft = iPos; + document.body.scrollLeft = iPos; + } + + + /* + * Function: _fnGetPos + * Purpose: Get the position of an object on the rendered page + * Returns: array[2] int: [left, right] + * Inputs: node:obj - element of interest + */ + function _fnGetPos ( obj ) + { + var iLeft = 0; + var iTop = 0; + + if (obj.offsetParent) + { + iLeft = obj.offsetLeft; + iTop = obj.offsetTop; + obj = obj.offsetParent; + while (obj) + { + iLeft += obj.offsetLeft; + iTop += obj.offsetTop; + obj = obj.offsetParent; + } + } + return [iLeft,iTop]; + } + + + /* + * Function: _fnFindDtCell + * Purpose: Get the coords. of a cell from the DataTables internal information + * Returns: array[2] int: [x, y] coords. or null if not found + * Inputs: node:nTarget - the node of interest + */ + function _fnFindDtCell( nTarget ) + { + for ( var i=0, iLen=_oDatatable.aiDisplay.length ; i<iLen ; i++ ) + { + var nTr = _oDatatable.aoData[ _oDatatable.aiDisplay[i] ].nTr; + var nTds = nTr.getElementsByTagName('td'); + for ( var j=0, jLen=nTds.length ; j<jLen ; j++ ) + { + if ( nTds[j] == nTarget ) + { + return [ j, i ]; + } + } + } + return null; + } + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Initialisation + */ + + /* + * Function: _fnInit + * Purpose: Initialise the KeyTable + * Returns: - + * Inputs: object:oInit - optional - Initalisation object with the following parameters: + * array[2] int:focus - x and y coordinates of the initial target + * or + * node:focus - the node to set initial focus on + * node:table - the table to use, if not given, first table with class 'KeyTable' will be used + * string:focusClass - focusing class to give to table elements + * object:that - focus + * bool:initScroll - scroll the view port on load, default true + * int:tabIndex - the tab index to give the hidden input element + */ + function _fnInit( table, datatable, oInit, that ) + { + /* Save scope */ + _that = that; + + /* Capture undefined initialisation and apply the defaults */ + if ( typeof oInit == 'undefined' ) { + oInit = {}; + } + + if ( typeof oInit.focus == 'undefined' ) { + oInit.focus = [0,0]; + } + + oInit.table = table; + $(oInit.table).addClass('KeyTable'); + + if ( typeof oInit.focusClass != 'undefined' ) { + _sFocusClass = oInit.focusClass; + } + + if ( typeof datatable != 'undefined' ) { + _oDatatable = datatable; + } + + if ( typeof oInit.initScroll == 'undefined' ) { + oInit.initScroll = true; + } + + if ( typeof oInit.form == 'undefined' ) { + oInit.form = false; + } + _bForm = oInit.form; + + /* Cache the tbody node of interest */ + _nBody = oInit.table.getElementsByTagName('tbody')[0]; + + /* If the table is inside a form, then we need a hidden input box which can be used by the + * browser to catch the browser tabbing for our table + */ + if ( _bForm ) + { + var nDiv = document.createElement('div'); + _nInput = document.createElement('input'); + nDiv.style.height = "1px"; /* Opera requires a little something */ + nDiv.style.width = "0px"; + nDiv.style.overflow = "hidden"; + if ( typeof oInit.tabIndex != 'undefined' ) + { + _nInput.tabIndex = oInit.tabIndex; + } + nDiv.appendChild(_nInput); + oInit.table.parentNode.insertBefore( nDiv, oInit.table.nextSibling ); + + $(_nInput).focus( function () { + /* See if we want to 'tab into' the table or out */ + if ( !_bInputFocused ) + { + _bKeyCapture = true; + _bInputFocused = false; + if ( typeof oInit.focus.nodeName != "undefined" ) + { + _fnSetFocus( oInit.focus, oInit.initScroll ); + } + else + { + _fnSetFocus( _fnCellFromCoords( oInit.focus[0], oInit.focus[1]), oInit.initScroll ); + } + + /* Need to interup the thread for this to work */ + setTimeout( function() { _nInput.blur(); }, 0 ); + } + } ); + _bKeyCapture = false; + } + else + { + /* Set the initial focus on the table */ + if ( typeof oInit.focus.nodeName != "undefined" ) + { + _fnSetFocus( oInit.focus, oInit.initScroll ); + } + else + { + _fnSetFocus( _fnCellFromCoords( oInit.focus[0], oInit.focus[1]), oInit.initScroll ); + } + _fnCaptureKeys(); + } + + /* Add event listeners */ + $(document).bind( "keydown", _fnKey ); + + if ( _oDatatable ) + { + $(_oDatatable.nTable).on( 'click', 'td', _fnClick ); + } + else + { + $(_nBody).on( 'click', 'td', _fnClick ); + } + + /* Loose table focus when click outside the table */ + $(document).click( function(e) { + var nTarget = e.target; + var bTableClick = false; + while ( nTarget ) + { + if ( nTarget == oInit.table ) + { + bTableClick = true; + break; + } + nTarget = nTarget.parentNode; + } + if ( !bTableClick ) + { + _fnBlur(); + } + } ); + } + + var table, datatable; + + if ( oInit === undefined ) { + table = $('table.KeyTable')[0]; + datatable = null; + } + else if ( $.isPlainObject( oInit ) ) { + table = oInit.table; + datatable = oInit.datatable; + } + else { + datatable = new $.fn.dataTable.Api( oInit ).settings()[0]; + table = datatable.nTable; + } + /* Initialise our new object */ + _fnInit( table, datatable, oInit, this ); +}; + + +KeyTable.version = "1.2.1"; + + +$.fn.dataTable.KeyTable = KeyTable; +$.fn.DataTable.KeyTable = KeyTable; + + +return KeyTable; +}; // /factory + + +// Define as an AMD module if possible +if ( typeof define === 'function' && define.amd ) { + define( ['jquery', 'datatables'], factory ); +} +else if ( typeof exports === 'object' ) { + // Node/CommonJS + factory( require('jquery'), require('datatables') ); +} +else if ( jQuery && !jQuery.fn.dataTable.KeyTable ) { + // Otherwise simply initialise as normal, stopping multiple evaluation + factory( jQuery, jQuery.fn.dataTable ); +} + + +})(window, document); diff --git a/theme/bootstrap/plugins/datatables/extensions/KeyTable/js/dataTables.keyTable.min.js b/theme/bootstrap/plugins/datatables/extensions/KeyTable/js/dataTables.keyTable.min.js new file mode 100644 index 0000000..f4c13d2 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/KeyTable/js/dataTables.keyTable.min.js @@ -0,0 +1,18 @@ +/*! + KeyTable 1.2.1 + ©2010-2014 SpryMedia Ltd - datatables.net/license +*/ +var KeyTable; +(function(F,n,K){var A=function(d){KeyTable=function(j){function A(a){return function(e,c,p){(null===e||"number"==typeof e)&&(null===c||"number"==typeof c)&&"function"==typeof p?k[a].push({x:e,y:c,fn:p}):"object"==typeof e&&"function"==typeof c?(e=E(e),k[a].push({x:e[0],y:e[1],fn:c})):alert("Unhandable event type was added: x"+e+" y:"+c+" z:"+p)}}function L(a){return function(e,c,p){(null===e||"number"==typeof e)&&(null===c||"number"==typeof c)?"function"==typeof p?B(a,e,c,p):B(a,e,c):"object"== +typeof e?(e=E(e),"function"==typeof c?B(a,e[0],e[1],c):B(a,e[0],e[1])):alert("Unhandable event type was removed: x"+e+" y:"+c+" z:"+p)}}function B(a,e,c,p){for(var h=0,b=0,d=k[a].length;b<d-h;b++)if("undefined"!=typeof p)k[a][b-h].x==e&&(k[a][b-h].y==c&&k[a][b-h].fn==p)&&(k[a].splice(b-h,1),h++);else if(k[a][b-h].x==e&&k[a][b-h].y==c)return k[a].splice(b,1),1;return h}function C(a,e,c){for(var p=0,a=k[a],b=0;b<a.length;b++)if(a[b].x==e&&a[b].y==c||null===a[b].x&&a[b].y==c||a[b].x==e&&null===a[b].y|| +null===a[b].x&&null===a[b].y)a[b].fn(w(e,c),e,c),p++;return p}function q(a,e){if(t!=a){"undefined"==typeof e&&(e=!0);null!==t&&G(t);d(a).addClass(x);d(a).parent().addClass(x);var c;if(i){c=i;for(var b=H(a)[1],h=o;b>=c.fnDisplayEnd();)0<=c._iDisplayLength?c._iDisplayStart+c._iDisplayLength<c.fnRecordsDisplay()&&(c._iDisplayStart+=c._iDisplayLength):c._iDisplayStart=0,i.oApi._fnCalculateEnd(c);for(;b<c._iDisplayStart;)c._iDisplayStart=0<=c._iDisplayLength?c._iDisplayStart-c._iDisplayLength:0,0>c._iDisplayStart&& +(c._iDisplayStart=0),i.oApi._fnCalculateEnd(c);i.oApi._fnDraw(c);o=h}b=E(a);t=a;l=b[0];g=b[1];var r,j,k,m,f;if(e){r=d(F).height();b=d(F).width();j=d(n).scrollTop();h=d(n).scrollLeft();k=a.offsetHeight;m=a.offsetWidth;f=a;var q=0,s=0;if(f.offsetParent){q=f.offsetLeft;s=f.offsetTop;for(f=f.offsetParent;f;)q+=f.offsetLeft,s+=f.offsetTop,f=f.offsetParent}f=[q,s];if(i&&"undefined"!=typeof c.oScroll&&(""!==c.oScroll.sX||""!==c.oScroll.sY))f[1]-=d(c.nTable.parentNode).scrollTop(),f[0]-=d(c.nTable.parentNode).scrollLeft(); +f[1]+k>j+r?(r=f[1]+k-r,n.documentElement.scrollTop=r,n.body.scrollTop=r):f[1]<j&&(r=f[1],n.documentElement.scrollTop=r,n.body.scrollTop=r);f[0]+m>h+b?(b=f[0]+m-b,n.documentElement.scrollLeft=b,n.body.scrollLeft=b):f[0]<h&&(b=f[0],n.documentElement.scrollLeft=b,n.body.scrollLeft=b)}if(i&&"undefined"!=typeof c.oScroll&&(""!==c.oScroll.sX||""!==c.oScroll.sY))(c=c.nTable.parentNode,r=c.clientHeight,b=c.clientWidth,j=c.scrollTop,h=c.scrollLeft,k=a.offsetHeight,m=a.offsetWidth,a.offsetTop+k>r+j?c.scrollTop= +a.offsetTop+k-r:a.offsetTop<j&&(c.scrollTop=a.offsetTop),a.offsetLeft+m>b+h)?c.scrollLeft=a.offsetLeft+m-b:a.offsetLeft<h&&(c.scrollLeft=a.offsetLeft);o||(o=!0);C("focus",l,g)}}function y(){G(t);t=g=l=null;o=!1}function G(a){d(a).removeClass(x);d(a).parent().removeClass(x);C("blur",l,g)}function I(){for(var a=this;"TD"!=a.nodeName;)a=a.parentNode;q(a);o||(o=!0)}function w(a,b){return i?"undefined"!=typeof i.aoData[i.aiDisplay[b]]?i.aoData[i.aiDisplay[b]].nTr.getElementsByTagName("td")[a]:null:d("tr:eq("+ +b+")>td:eq("+a+")",z)[0]}function E(a){return i?[d("td",a.parentNode).index(a),d("tr",a.parentNode.parentNode).index(a.parentNode)+i._iDisplayStart]:[d("td",a.parentNode).index(a),d("tr",a.parentNode.parentNode).index(a.parentNode)]}function H(a){for(var b=0,c=i.aiDisplay.length;b<c;b++)for(var d=i.aoData[i.aiDisplay[b]].nTr.getElementsByTagName("td"),h=0,g=d.length;h<g;h++)if(d[h]==a)return[h,b];return null}this.block=!1;this.event={remove:{}};this.fnGetCurrentPosition=function(){return[l,g]};this.fnGetCurrentData= +function(){return t.innerHTML};this.fnGetCurrentTD=function(){return t};this.fnSetPosition=function(a,b){"object"==typeof a&&a.nodeName?q(a):q(w(a,b))};this.fnBlur=function(){y()};var z=null,t=null,l=null,g=null,J=null,x="focus",o=!1,k={action:[],esc:[],focus:[],blur:[]},i=null,D,s,u=!1,m;for(m in k)m&&(this.event[m]=A(m),this.event.remove[m]=L(m));var v;j===K?(m=d("table.KeyTable")[0],v=null):d.isPlainObject(j)?(m=j.table,v=j.datatable):(v=(new d.fn.dataTable.Api(j)).settings()[0],m=v.nTable);var b= +j,J=this;"undefined"==typeof b&&(b={});"undefined"==typeof b.focus&&(b.focus=[0,0]);b.table=m;d(b.table).addClass("KeyTable");"undefined"!=typeof b.focusClass&&(x=b.focusClass);"undefined"!=typeof v&&(i=v);"undefined"==typeof b.initScroll&&(b.initScroll=!0);"undefined"==typeof b.form&&(b.form=!1);D=b.form;z=b.table.getElementsByTagName("tbody")[0];D?(j=n.createElement("div"),s=n.createElement("input"),j.style.height="1px",j.style.width="0px",j.style.overflow="hidden","undefined"!=typeof b.tabIndex&& +(s.tabIndex=b.tabIndex),j.appendChild(s),b.table.parentNode.insertBefore(j,b.table.nextSibling),d(s).focus(function(){if(!u){o=true;u=false;typeof b.focus.nodeName!="undefined"?q(b.focus,b.initScroll):q(w(b.focus[0],b.focus[1]),b.initScroll);setTimeout(function(){s.blur()},0)}}),o=!1):("undefined"!=typeof b.focus.nodeName?q(b.focus,b.initScroll):q(w(b.focus[0],b.focus[1]),b.initScroll),o||(o=!0));d(n).bind("keydown",function(a){if(J.block||!o||a.metaKey||a.altKey||a.ctrlKey)return true;var b;b=z.getElementsByTagName("tr")[0].getElementsByTagName("td").length; +var c;if(i){c=i.aiDisplay.length;var d=H(t);if(d===null)return;l=d[0];g=d[1]}else c=z.getElementsByTagName("tr").length;d=a.keyCode==9&&a.shiftKey?-1:a.keyCode;switch(d){case 13:a.preventDefault();a.stopPropagation();C("action",l,g);return true;case 27:if(!C("esc",l,g)){y();return}a=l;b=g;break;case -1:case 37:if(l>0){a=l-1;b=g}else if(g>0){a=b-1;b=g-1}else{if(d==-1&&D){u=true;s.focus();setTimeout(function(){u=false},0);o=false;y();return true}return false}break;case 38:if(g>0){a=l;b=g-1}else return false; +break;case 36:a=l;b=0;break;case 33:a=l;b=g-10;b<0&&(b=0);break;case 9:case 39:if(l<b-1){a=l+1;b=g}else if(g<c-1){a=0;b=g+1}else{if(d==9&&D){u=true;s.focus();setTimeout(function(){u=false},0);o=false;y();return true}return false}break;case 40:if(g<c-1){a=l;b=g+1}else return false;break;case 35:a=l;b=c-1;break;case 34:a=l;b=g+10;b>c-1&&(b=c-1);break;default:return true}q(w(a,b));return false});if(i)d(i.nTable).on("click","td",I);else d(z).on("click","td",I);d(n).click(function(a){for(var a=a.target, +d=false;a;){if(a==b.table){d=true;break}a=a.parentNode}d||y()})};KeyTable.version="1.2.1";d.fn.dataTable.KeyTable=KeyTable;return d.fn.DataTable.KeyTable=KeyTable};"function"===typeof define&&define.amd?define(["jquery","datatables"],A):"object"===typeof exports?A(require("jquery"),require("datatables")):jQuery&&!jQuery.fn.dataTable.KeyTable&&A(jQuery,jQuery.fn.dataTable)})(window,document); diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/License.txt b/theme/bootstrap/plugins/datatables/extensions/Responsive/License.txt new file mode 100644 index 0000000..c0ee1c0 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/License.txt @@ -0,0 +1,20 @@ +Copyright (c) 2014-2015 SpryMedia Limited +http://datatables.net + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/Readme.md b/theme/bootstrap/plugins/datatables/extensions/Responsive/Readme.md new file mode 100644 index 0000000..e69de29 diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/css/dataTables.responsive.css b/theme/bootstrap/plugins/datatables/extensions/Responsive/css/dataTables.responsive.css new file mode 100644 index 0000000..1060f9c --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/css/dataTables.responsive.css @@ -0,0 +1,106 @@ +table.dataTable.dtr-inline.collapsed > tbody > tr > td:first-child, +table.dataTable.dtr-inline.collapsed > tbody > tr > th:first-child { + position: relative; + padding-left: 30px; + cursor: pointer; +} +table.dataTable.dtr-inline.collapsed > tbody > tr > td:first-child:before, +table.dataTable.dtr-inline.collapsed > tbody > tr > th:first-child:before { + top: 8px; + left: 4px; + height: 16px; + width: 16px; + display: block; + position: absolute; + color: white; + border: 2px solid white; + border-radius: 16px; + text-align: center; + line-height: 14px; + box-shadow: 0 0 3px #444; + box-sizing: content-box; + content: '+'; + background-color: #31b131; +} +table.dataTable.dtr-inline.collapsed > tbody > tr > td:first-child.dataTables_empty:before, +table.dataTable.dtr-inline.collapsed > tbody > tr > th:first-child.dataTables_empty:before { + display: none; +} +table.dataTable.dtr-inline.collapsed > tbody > tr.parent > td:first-child:before, +table.dataTable.dtr-inline.collapsed > tbody > tr.parent > th:first-child:before { + content: '-'; + background-color: #d33333; +} +table.dataTable.dtr-inline.collapsed > tbody > tr.child td:before { + display: none; +} +table.dataTable.dtr-inline.collapsed.compact > tbody > tr > td:first-child, +table.dataTable.dtr-inline.collapsed.compact > tbody > tr > th:first-child { + padding-left: 27px; +} +table.dataTable.dtr-inline.collapsed.compact > tbody > tr > td:first-child:before, +table.dataTable.dtr-inline.collapsed.compact > tbody > tr > th:first-child:before { + top: 5px; + left: 4px; + height: 14px; + width: 14px; + border-radius: 14px; + line-height: 12px; +} +table.dataTable.dtr-column > tbody > tr > td.control, +table.dataTable.dtr-column > tbody > tr > th.control { + position: relative; + cursor: pointer; +} +table.dataTable.dtr-column > tbody > tr > td.control:before, +table.dataTable.dtr-column > tbody > tr > th.control:before { + top: 50%; + left: 50%; + height: 16px; + width: 16px; + margin-top: -10px; + margin-left: -10px; + display: block; + position: absolute; + color: white; + border: 2px solid white; + border-radius: 16px; + text-align: center; + line-height: 14px; + box-shadow: 0 0 3px #444; + box-sizing: content-box; + content: '+'; + background-color: #31b131; +} +table.dataTable.dtr-column > tbody > tr.parent td.control:before, +table.dataTable.dtr-column > tbody > tr.parent th.control:before { + content: '-'; + background-color: #d33333; +} +table.dataTable > tbody > tr.child { + padding: 0.5em 1em; +} +table.dataTable > tbody > tr.child:hover { + background: transparent !important; +} +table.dataTable > tbody > tr.child ul { + display: inline-block; + list-style-type: none; + margin: 0; + padding: 0; +} +table.dataTable > tbody > tr.child ul li { + border-bottom: 1px solid #efefef; + padding: 0.5em 0; +} +table.dataTable > tbody > tr.child ul li:first-child { + padding-top: 0; +} +table.dataTable > tbody > tr.child ul li:last-child { + border-bottom: none; +} +table.dataTable > tbody > tr.child span.dtr-title { + display: inline-block; + min-width: 75px; + font-weight: bold; +} diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/css/dataTables.responsive.scss b/theme/bootstrap/plugins/datatables/extensions/Responsive/css/dataTables.responsive.scss new file mode 100644 index 0000000..ed657ff --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/css/dataTables.responsive.scss @@ -0,0 +1,149 @@ + +// +// Mixins +// +@mixin control() { + display: block; + position: absolute; + color: white; + border: 2px solid white; + border-radius: 16px; + text-align: center; + line-height: 14px; + box-shadow: 0 0 3px #444; + box-sizing: content-box; +} + +@mixin control-open() { + content: '+'; + background-color: #31b131; +} + +@mixin control-close() { + content: '-'; + background-color: #d33333; +} + + +// +// Table styles +// +table.dataTable { + // Styling for the `inline` type + &.dtr-inline.collapsed > tbody { + > tr > td:first-child, + > tr > th:first-child { + position: relative; + padding-left: 30px; + cursor: pointer; + + &:before { + top: 8px; + left: 4px; + height: 16px; + width: 16px; + @include control; + @include control-open; + } + + &.dataTables_empty:before { + display: none; + } + } + + > tr.parent { + > td:first-child:before, + > th:first-child:before { + @include control-close; + } + } + + > tr.child td:before { + display: none; + } + } + + // DataTables' `compact` styling + &.dtr-inline.collapsed.compact > tbody { + > tr > td:first-child, + > tr > th:first-child { + padding-left: 27px; + + &:before { + top: 5px; + left: 4px; + height: 14px; + width: 14px; + border-radius: 14px; + line-height: 12px; + } + } + } + + + // Styling for the `column` type + &.dtr-column > tbody { + > tr > td.control, + > tr > th.control { + position: relative; + cursor: pointer; + + &:before { + top: 50%; + left: 50%; + height: 16px; + width: 16px; + margin-top: -10px; + margin-left: -10px; + @include control; + @include control-open; + } + } + + > tr.parent { + td.control:before, + th.control:before { + @include control-close; + } + } + } + + + // Child row styling + > tbody > tr.child { + padding: 0.5em 1em; + + &:hover { + background: transparent !important; + } + + ul { + display: inline-block; + list-style-type: none; + margin: 0; + padding: 0; + + li { + border-bottom: 1px solid #efefef; + padding: 0.5em 0; + + &:first-child { + padding-top: 0; + } + + &:last-child { + border-bottom: none; + } + } + } + + span.dtr-title { + display: inline-block; + min-width: 75px; + font-weight: bold; + } + + span.dtr-data {} + } +} + diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/child-rows/column-control.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/child-rows/column-control.html new file mode 100644 index 0000000..66f213b --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/child-rows/column-control.html @@ -0,0 +1,854 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Responsive example - Column controlled child rows</title> + <link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + $('#example').DataTable( { + responsive: { + details: { + type: 'column' + } + }, + columnDefs: [ { + className: 'control', + orderable: false, + targets: 0 + } ], + order: [ 1, 'asc' ] + } ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>Column controlled child rows</span></h1> + + <div class="info"> + <p>Responsive has two built in methods for displaying the controlling element of the child rows; <code>inline</code> which is the default option and shows the + control in the first column, and <code>column</code> which set a <em>control column</em> as the control. The control column is shown only when there is some other + column hidden, and is dedicated only to the show / hide control for the rows.</p> + + <p>This example shows the <a href="//datatables.net/extensions/responsive/reference/option/responsive.details.type"><code class="option" title= + "Responsive initialisation option">responsive.details.type<span>R</span></code></a> option set to <code>column</code> to activate the control column. Note that by + default the first column is used as the control, so additionally in the initialisation the <a href="//datatables.net/reference/option/order"><code class="option" + title="DataTables initialisation option">order<span>DT</span></code></a> and <a href="//datatables.net/reference/option/columns.orderable"><code class="option" + title="DataTables initialisation option">columns.orderable<span>DT</span></code></a> options are used to disable sorting on this column.</p> + </div> + + <table id="example" class="display nowrap" cellspacing="0" width="100%"> + <thead> + <tr> + <th></th> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + </tr> + </thead> + + <tfoot> + <tr> + <th></th> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td></td> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + </tr> + <tr> + <td></td> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + </tr> + <tr> + <td></td> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + </tr> + <tr> + <td></td> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + </tr> + <tr> + <td></td> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + </tr> + <tr> + <td></td> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + </tr> + <tr> + <td></td> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + </tr> + <tr> + <td></td> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + </tr> + <tr> + <td></td> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + </tr> + <tr> + <td></td> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + </tr> + <tr> + <td></td> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + </tr> + <tr> + <td></td> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + </tr> + <tr> + <td></td> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + </tr> + <tr> + <td></td> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + </tr> + <tr> + <td></td> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + </tr> + <tr> + <td></td> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + </tr> + <tr> + <td></td> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + </tr> + <tr> + <td></td> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + </tr> + <tr> + <td></td> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + </tr> + <tr> + <td></td> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + </tr> + <tr> + <td></td> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + </tr> + <tr> + <td></td> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + </tr> + <tr> + <td></td> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + </tr> + <tr> + <td></td> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + </tr> + <tr> + <td></td> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + </tr> + <tr> + <td></td> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + </tr> + <tr> + <td></td> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + </tr> + <tr> + <td></td> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + </tr> + <tr> + <td></td> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + </tr> + <tr> + <td></td> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + </tr> + <tr> + <td></td> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + </tr> + <tr> + <td></td> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + </tr> + <tr> + <td></td> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + </tr> + <tr> + <td></td> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + </tr> + <tr> + <td></td> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + </tr> + <tr> + <td></td> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + </tr> + <tr> + <td></td> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + </tr> + <tr> + <td></td> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + </tr> + <tr> + <td></td> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + </tr> + <tr> + <td></td> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + </tr> + <tr> + <td></td> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + </tr> + <tr> + <td></td> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + </tr> + <tr> + <td></td> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + </tr> + <tr> + <td></td> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + </tr> + <tr> + <td></td> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + </tr> + <tr> + <td></td> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + </tr> + <tr> + <td></td> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + </tr> + <tr> + <td></td> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + </tr> + <tr> + <td></td> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + </tr> + <tr> + <td></td> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + </tr> + <tr> + <td></td> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + </tr> + <tr> + <td></td> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + </tr> + <tr> + <td></td> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + </tr> + <tr> + <td></td> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + </tr> + <tr> + <td></td> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + </tr> + <tr> + <td></td> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + </tr> + <tr> + <td></td> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + responsive: { + details: { + type: 'column' + } + }, + columnDefs: [ { + className: 'control', + orderable: false, + targets: 0 + } ], + order: [ 1, 'asc' ] + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li> + <li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="../initialisation/index.html">Basic initialisation</a></h3> + <ul class="toc"> + <li><a href="../initialisation/className.html">Class name</a></li> + <li><a href="../initialisation/option.html">Configuration option</a></li> + <li><a href="../initialisation/new.html">`new` constructor</a></li> + <li><a href="../initialisation/ajax.html">Ajax data</a></li> + <li><a href="../initialisation/default.html">Default initialisation</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../styling/index.html">Styling</a></h3> + <ul class="toc"> + <li><a href="../styling/bootstrap.html">Bootstrap styling</a></li> + <li><a href="../styling/foundation.html">Foundation styling</a></li> + <li><a href="../styling/scrolling.html">Vertical scrolling</a></li> + <li><a href="../styling/compact.html">Compact styling</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../display-control/index.html">Display control</a></h3> + <ul class="toc"> + <li><a href="../display-control/auto.html">Automatic column hiding</a></li> + <li><a href="../display-control/classes.html">Class control</a></li> + <li><a href="../display-control/init-classes.html">Assigned class control</a></li> + <li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li> + <li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="./index.html">Child rows</a></h3> + <ul class="toc active"> + <li><a href="./disable-child-rows.html">Disable child rows</a></li> + <li class="active"><a href="./column-control.html">Column controlled child rows</a></li> + <li><a href="./right-column.html">Column control - right</a></li> + <li><a href="./whole-row-control.html">Whole row child row control</a></li> + <li><a href="./custom-renderer.html">Custom child row renderer</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/child-rows/custom-renderer.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/child-rows/custom-renderer.html new file mode 100644 index 0000000..cbf8b8b --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/child-rows/custom-renderer.html @@ -0,0 +1,863 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Responsive example - Custom child row renderer</title> + <link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + $('#example').DataTable( { + responsive: { + details: { + renderer: function ( api, rowIdx ) { + // Select hidden columns for the given row + var data = api.cells( rowIdx, ':hidden' ).eq(0).map( function ( cell ) { + var header = $( api.column( cell.column ).header() ); + + return '<tr>'+ + '<td>'+ + header.text()+':'+ + '</td> '+ + '<td>'+ + api.cell( cell ).data()+ + '</td>'+ + '</tr>'; + } ).toArray().join(''); + + return data ? + $('<table/>').append( data ) : + false; + } + } + } + } ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>Custom child row renderer</span></h1> + + <div class="info"> + <p>The child row's for a collapsed table in Responsive, by default, show a <code class="tag" title="HTML tag">ul/li</code> list of the data from the hidden + columns. The <a href="//datatables.net/extensions/responsive/reference/option/responsive.details.renderer"><code class="option" title= + "Responsive initialisation option">responsive.details.renderer<span>R</span></code></a> option provide the ability to create your own custom renderer. It is given + two parameters: the DataTables API instance for the table and the row index to use.</p> + + <p>This example shows the <a href="//datatables.net/reference/api/cells()"><code class="api" title="DataTables API method">cells()<span>DT</span></code></a> method + being used to select the hidden columns and constructing a table of the data. You could refine the selector to select only certain columns, or show all columns, + etc.</p> + </div> + + <table id="example" class="display nowrap" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + responsive: { + details: { + renderer: function ( api, rowIdx ) { + // Select hidden columns for the given row + var data = api.cells( rowIdx, ':hidden' ).eq(0).map( function ( cell ) { + var header = $( api.column( cell.column ).header() ); + + return '&lt;tr&gt;'+ + '&lt;td&gt;'+ + header.text()+':'+ + '&lt;/td&gt; '+ + '&lt;td&gt;'+ + api.cell( cell ).data()+ + '&lt;/td&gt;'+ + '&lt;/tr&gt;'; + } ).toArray().join(''); + + return data ? + $('&lt;table/&gt;').append( data ) : + false; + } + } + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li> + <li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="../initialisation/index.html">Basic initialisation</a></h3> + <ul class="toc"> + <li><a href="../initialisation/className.html">Class name</a></li> + <li><a href="../initialisation/option.html">Configuration option</a></li> + <li><a href="../initialisation/new.html">`new` constructor</a></li> + <li><a href="../initialisation/ajax.html">Ajax data</a></li> + <li><a href="../initialisation/default.html">Default initialisation</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../styling/index.html">Styling</a></h3> + <ul class="toc"> + <li><a href="../styling/bootstrap.html">Bootstrap styling</a></li> + <li><a href="../styling/foundation.html">Foundation styling</a></li> + <li><a href="../styling/scrolling.html">Vertical scrolling</a></li> + <li><a href="../styling/compact.html">Compact styling</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../display-control/index.html">Display control</a></h3> + <ul class="toc"> + <li><a href="../display-control/auto.html">Automatic column hiding</a></li> + <li><a href="../display-control/classes.html">Class control</a></li> + <li><a href="../display-control/init-classes.html">Assigned class control</a></li> + <li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li> + <li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="./index.html">Child rows</a></h3> + <ul class="toc active"> + <li><a href="./disable-child-rows.html">Disable child rows</a></li> + <li><a href="./column-control.html">Column controlled child rows</a></li> + <li><a href="./right-column.html">Column control - right</a></li> + <li><a href="./whole-row-control.html">Whole row child row control</a></li> + <li class="active"><a href="./custom-renderer.html">Custom child row renderer</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/child-rows/disable-child-rows.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/child-rows/disable-child-rows.html new file mode 100644 index 0000000..482e77a --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/child-rows/disable-child-rows.html @@ -0,0 +1,819 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Responsive example - Disable child rows</title> + <link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + $('#example').DataTable( { + responsive: { + details: false + } + } ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>Disable child rows</span></h1> + + <div class="info"> + <p>By default, when Responsive collapses a table, it will show an option for the end user to expand the row, showing the details of the hidden columns in a child + row. This can be disabled using the <a href="//datatables.net/extensions/responsive/reference/option/responsive.details"><code class="option" title= + "Responsive initialisation option">responsive.details<span>R</span></code></a> option and setting it to <code>false</code>, as shown in the example below. In this + case the hidden data is not directly accessible to the end user.</p> + </div> + + <table id="example" class="display nowrap" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + responsive: { + details: false + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li> + <li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="../initialisation/index.html">Basic initialisation</a></h3> + <ul class="toc"> + <li><a href="../initialisation/className.html">Class name</a></li> + <li><a href="../initialisation/option.html">Configuration option</a></li> + <li><a href="../initialisation/new.html">`new` constructor</a></li> + <li><a href="../initialisation/ajax.html">Ajax data</a></li> + <li><a href="../initialisation/default.html">Default initialisation</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../styling/index.html">Styling</a></h3> + <ul class="toc"> + <li><a href="../styling/bootstrap.html">Bootstrap styling</a></li> + <li><a href="../styling/foundation.html">Foundation styling</a></li> + <li><a href="../styling/scrolling.html">Vertical scrolling</a></li> + <li><a href="../styling/compact.html">Compact styling</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../display-control/index.html">Display control</a></h3> + <ul class="toc"> + <li><a href="../display-control/auto.html">Automatic column hiding</a></li> + <li><a href="../display-control/classes.html">Class control</a></li> + <li><a href="../display-control/init-classes.html">Assigned class control</a></li> + <li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li> + <li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="./index.html">Child rows</a></h3> + <ul class="toc active"> + <li class="active"><a href="./disable-child-rows.html">Disable child rows</a></li> + <li><a href="./column-control.html">Column controlled child rows</a></li> + <li><a href="./right-column.html">Column control - right</a></li> + <li><a href="./whole-row-control.html">Whole row child row control</a></li> + <li><a href="./custom-renderer.html">Custom child row renderer</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/child-rows/index.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/child-rows/index.html new file mode 100644 index 0000000..98b3680 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/child-rows/index.html @@ -0,0 +1,72 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + + <title>Responsive examples - Child row control</title> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>Child row control</span></h1> + + <div class="info"> + <p>When a column is removed from display by Responsive, the data is still available in the table and can be displayed in a DataTables <em>child row</em> (see + <a href="//datatables.net/reference/api/row().child()"><code class="api" title="DataTables API method">row().child()<span>DT</span></code></a>). By default + Responsive will show child row controls in the first column when the table has been collapsed, allowing the end user to show / hide the information from the hidden + columns.</p> + + <p>Responsive has a number of options for display of the child rows:</p> + + <ul class="markdown"> + <li>If child row display is enabled: <a href="//datatables.net/extensions/responsive/reference/option/responsive.details"><code class="option" title= + "Responsive initialisation option">responsive.details<span>R</span></code></a></li> + <li>How the show / hide control is displayed: <a href="//datatables.net/extensions/responsive/reference/option/responsive.details.type"><code class="option" + title="Responsive initialisation option">responsive.details.type<span>R</span></code></a></li> + <li>How the child row is rendered: <a href="//datatables.net/extensions/responsive/reference/option/responsive.details.renderer"><code class="option" title= + "Responsive initialisation option">responsive.details.renderer<span>R</span></code></a></li> + </ul> + + <p>This section shows examples of these options being used.</p> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Child rows</a></h3> + <ul class="toc"> + <li><a href="./disable-child-rows.html">Disable child rows</a></li> + <li><a href="./column-control.html">Column controlled child rows</a></li> + <li><a href="./right-column.html">Column control - right</a></li> + <li><a href="./whole-row-control.html">Whole row child row control</a></li> + <li><a href="./custom-renderer.html">Custom child row renderer</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/child-rows/right-column.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/child-rows/right-column.html new file mode 100644 index 0000000..94c4f23 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/child-rows/right-column.html @@ -0,0 +1,850 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Responsive example - Column control - right</title> + <link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + $('#example').DataTable( { + responsive: { + details: { + type: 'column', + target: -1 + } + }, + columnDefs: [ { + className: 'control', + orderable: false, + targets: -1 + } ] + } ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>Column control - right</span></h1> + + <div class="info"> + <p>When using the <code>column</code> child row control type, Responsive has the ability to use any column or element as the show / hide control for the row + details. This is provided through the <a href="//datatables.net/extensions/responsive/reference/option/responsive.details.target"><code class="option" title= + "Responsive initialisation option">responsive.details.target<span>R</span></code></a> option, which can be either a column index, or a jQuery selector.</p> + + <p>This example shows the last column in the table being used as the control column.</p> + </div> + + <table id="example" class="display nowrap" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th></th> + </tr> + </thead> + + <tfoot> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th></th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td></td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td></td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td></td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td></td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td></td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td></td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td></td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td></td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td></td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td></td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td></td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td></td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td></td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td></td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td></td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td></td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td></td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td></td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td></td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td></td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td></td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td></td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td></td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td></td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td></td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td></td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td></td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td></td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td></td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td></td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td></td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td></td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td></td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td></td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td></td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td></td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td></td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td></td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td></td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td></td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td></td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td></td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td></td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td></td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td></td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td></td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td></td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td></td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td></td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td></td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td></td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td></td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td></td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td></td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td></td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td></td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td></td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + responsive: { + details: { + type: 'column', + target: -1 + } + }, + columnDefs: [ { + className: 'control', + orderable: false, + targets: -1 + } ] + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li> + <li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="../initialisation/index.html">Basic initialisation</a></h3> + <ul class="toc"> + <li><a href="../initialisation/className.html">Class name</a></li> + <li><a href="../initialisation/option.html">Configuration option</a></li> + <li><a href="../initialisation/new.html">`new` constructor</a></li> + <li><a href="../initialisation/ajax.html">Ajax data</a></li> + <li><a href="../initialisation/default.html">Default initialisation</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../styling/index.html">Styling</a></h3> + <ul class="toc"> + <li><a href="../styling/bootstrap.html">Bootstrap styling</a></li> + <li><a href="../styling/foundation.html">Foundation styling</a></li> + <li><a href="../styling/scrolling.html">Vertical scrolling</a></li> + <li><a href="../styling/compact.html">Compact styling</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../display-control/index.html">Display control</a></h3> + <ul class="toc"> + <li><a href="../display-control/auto.html">Automatic column hiding</a></li> + <li><a href="../display-control/classes.html">Class control</a></li> + <li><a href="../display-control/init-classes.html">Assigned class control</a></li> + <li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li> + <li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="./index.html">Child rows</a></h3> + <ul class="toc active"> + <li><a href="./disable-child-rows.html">Disable child rows</a></li> + <li><a href="./column-control.html">Column controlled child rows</a></li> + <li class="active"><a href="./right-column.html">Column control - right</a></li> + <li><a href="./whole-row-control.html">Whole row child row control</a></li> + <li><a href="./custom-renderer.html">Custom child row renderer</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/child-rows/whole-row-control.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/child-rows/whole-row-control.html new file mode 100644 index 0000000..74e1132 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/child-rows/whole-row-control.html @@ -0,0 +1,853 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Responsive example - Whole row child row control</title> + <link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + $('#example').DataTable( { + responsive: { + details: { + type: 'column', + target: 'tr' + } + }, + columnDefs: [ { + className: 'control', + orderable: false, + targets: 0 + } ], + order: [ 1, 'asc' ] + } ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>Whole row child row control</span></h1> + + <div class="info"> + <p>When using the <code>column</code> details type in Responsive the <a href= + "//datatables.net/extensions/responsive/reference/option/responsive.details.target"><code class="option" title= + "Responsive initialisation option">responsive.details.target<span>R</span></code></a> option provides the ability to control what element is used to show / hide + the child rows when the table is collapsed.</p> + + <p>This example uses the <code>tr</code> selector to have the whole row act as the control.</p> + </div> + + <table id="example" class="display nowrap" cellspacing="0" width="100%"> + <thead> + <tr> + <th></th> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + </tr> + </thead> + + <tfoot> + <tr> + <th></th> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td></td> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + </tr> + <tr> + <td></td> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + </tr> + <tr> + <td></td> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + </tr> + <tr> + <td></td> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + </tr> + <tr> + <td></td> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + </tr> + <tr> + <td></td> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + </tr> + <tr> + <td></td> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + </tr> + <tr> + <td></td> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + </tr> + <tr> + <td></td> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + </tr> + <tr> + <td></td> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + </tr> + <tr> + <td></td> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + </tr> + <tr> + <td></td> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + </tr> + <tr> + <td></td> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + </tr> + <tr> + <td></td> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + </tr> + <tr> + <td></td> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + </tr> + <tr> + <td></td> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + </tr> + <tr> + <td></td> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + </tr> + <tr> + <td></td> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + </tr> + <tr> + <td></td> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + </tr> + <tr> + <td></td> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + </tr> + <tr> + <td></td> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + </tr> + <tr> + <td></td> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + </tr> + <tr> + <td></td> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + </tr> + <tr> + <td></td> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + </tr> + <tr> + <td></td> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + </tr> + <tr> + <td></td> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + </tr> + <tr> + <td></td> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + </tr> + <tr> + <td></td> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + </tr> + <tr> + <td></td> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + </tr> + <tr> + <td></td> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + </tr> + <tr> + <td></td> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + </tr> + <tr> + <td></td> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + </tr> + <tr> + <td></td> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + </tr> + <tr> + <td></td> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + </tr> + <tr> + <td></td> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + </tr> + <tr> + <td></td> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + </tr> + <tr> + <td></td> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + </tr> + <tr> + <td></td> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + </tr> + <tr> + <td></td> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + </tr> + <tr> + <td></td> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + </tr> + <tr> + <td></td> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + </tr> + <tr> + <td></td> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + </tr> + <tr> + <td></td> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + </tr> + <tr> + <td></td> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + </tr> + <tr> + <td></td> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + </tr> + <tr> + <td></td> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + </tr> + <tr> + <td></td> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + </tr> + <tr> + <td></td> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + </tr> + <tr> + <td></td> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + </tr> + <tr> + <td></td> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + </tr> + <tr> + <td></td> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + </tr> + <tr> + <td></td> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + </tr> + <tr> + <td></td> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + </tr> + <tr> + <td></td> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + </tr> + <tr> + <td></td> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + </tr> + <tr> + <td></td> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + </tr> + <tr> + <td></td> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + responsive: { + details: { + type: 'column', + target: 'tr' + } + }, + columnDefs: [ { + className: 'control', + orderable: false, + targets: 0 + } ], + order: [ 1, 'asc' ] + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li> + <li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="../initialisation/index.html">Basic initialisation</a></h3> + <ul class="toc"> + <li><a href="../initialisation/className.html">Class name</a></li> + <li><a href="../initialisation/option.html">Configuration option</a></li> + <li><a href="../initialisation/new.html">`new` constructor</a></li> + <li><a href="../initialisation/ajax.html">Ajax data</a></li> + <li><a href="../initialisation/default.html">Default initialisation</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../styling/index.html">Styling</a></h3> + <ul class="toc"> + <li><a href="../styling/bootstrap.html">Bootstrap styling</a></li> + <li><a href="../styling/foundation.html">Foundation styling</a></li> + <li><a href="../styling/scrolling.html">Vertical scrolling</a></li> + <li><a href="../styling/compact.html">Compact styling</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../display-control/index.html">Display control</a></h3> + <ul class="toc"> + <li><a href="../display-control/auto.html">Automatic column hiding</a></li> + <li><a href="../display-control/classes.html">Class control</a></li> + <li><a href="../display-control/init-classes.html">Assigned class control</a></li> + <li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li> + <li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="./index.html">Child rows</a></h3> + <ul class="toc active"> + <li><a href="./disable-child-rows.html">Disable child rows</a></li> + <li><a href="./column-control.html">Column controlled child rows</a></li> + <li><a href="./right-column.html">Column control - right</a></li> + <li class="active"><a href="./whole-row-control.html">Whole row child row control</a></li> + <li><a href="./custom-renderer.html">Custom child row renderer</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/display-control/auto.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/display-control/auto.html new file mode 100644 index 0000000..ef8e272 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/display-control/auto.html @@ -0,0 +1,813 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Responsive example - Automatic column hiding</title> + <link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + $('#example').DataTable(); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>Automatic column hiding</span></h1> + + <div class="info"> + <p>Responsive will automatically detect which columns have breakpoint class names assigned to them for visibility control. If no breakpoint class is found for a + column, Responsive will determine automatically if the column should be shown or not at any particular viewport width. This is done by removing columns which cause + the table to overflow the viewport, with the columns being removed from the right.</p> + + <p>This example shows that simple case. On a desktop browser resize the window horizontally to see columns added and removed on-the-fly. On a tablet or mobile + browser, change the screen's orientation.</p> + </div> + + <table id="example" class="display responsive nowrap" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable(); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li> + <li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="../initialisation/index.html">Basic initialisation</a></h3> + <ul class="toc"> + <li><a href="../initialisation/className.html">Class name</a></li> + <li><a href="../initialisation/option.html">Configuration option</a></li> + <li><a href="../initialisation/new.html">`new` constructor</a></li> + <li><a href="../initialisation/ajax.html">Ajax data</a></li> + <li><a href="../initialisation/default.html">Default initialisation</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../styling/index.html">Styling</a></h3> + <ul class="toc"> + <li><a href="../styling/bootstrap.html">Bootstrap styling</a></li> + <li><a href="../styling/foundation.html">Foundation styling</a></li> + <li><a href="../styling/scrolling.html">Vertical scrolling</a></li> + <li><a href="../styling/compact.html">Compact styling</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="./index.html">Display control</a></h3> + <ul class="toc active"> + <li class="active"><a href="./auto.html">Automatic column hiding</a></li> + <li><a href="./classes.html">Class control</a></li> + <li><a href="./init-classes.html">Assigned class control</a></li> + <li><a href="./fixedHeader.html">With FixedHeader</a></li> + <li><a href="./complexHeader.html">Complex headers (rowspan / colspan)</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../child-rows/index.html">Child rows</a></h3> + <ul class="toc"> + <li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li> + <li><a href="../child-rows/column-control.html">Column controlled child rows</a></li> + <li><a href="../child-rows/right-column.html">Column control - right</a></li> + <li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li> + <li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/display-control/classes.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/display-control/classes.html new file mode 100644 index 0000000..fda2162 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/display-control/classes.html @@ -0,0 +1,247 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Responsive example - Class control</title> + <link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + + </style> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + $('#example').DataTable( { + "ajax": "../../../../examples/ajax/data/objects.txt", + "columns": [ + { "data": "name" }, + { "data": "position" }, + { "data": "office" }, + { "data": "age" }, + { "data": "start_date" }, + { "data": "salary" }, + { "data": "extn" } + ] + } ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>Class control</span></h1> + + <div class="info"> + <p>You can tell Responsive what columns to want to be visible on different devices through the use of class names on the columns. The breakpoints are horizontal + screen resolutions and the defaults are set for common devices:</p> + + <ul class="markdown"> + <li><code>desktop</code> x &gt;= 1024px</li> + <li><code>tablet-l</code> (landscape) 768 &lt;= x &lt; 1024</li> + <li><code>tablet-p</code> (portrait) 480 &lt;= x &lt; 768</li> + <li><code>mobile-l</code> (landscape) 320 &lt;= x &lt; 480</li> + <li><code>mobile-p</code> (portrait) x &lt; 320</li> + </ul> + + <p>You may leave the <code>-[lp]</code> option from the end if you wish to just target all tablet or mobile devices. Additionally to may add <code>min-</code>, + <code>max-</code> or <code>not-</code> as a prefix to the class name to perform logic operations. For example <code>not-mobile</code> would cause a column to + appear as visible on desktop and tablet devices, while <code>min-tablet-l</code> would require at least a horizontal width of 768 for the browser window to be + shown, and be shown at all sizes larger.</p> + + <p>Additionally, there are three special class names:</p> + + <ul class="markdown"> + <li><code>all</code> - Always display</li> + <li><code>none</code> - Don't display as a column, but show in the child row</li> + <li><code>never</code> - Never display</li> + <li><code>control</code> - Used for the <code>column</code> <a href= + "//datatables.net/extensions/responsive/reference/option/responsive.details.type"><code class="option" title= + "Responsive initialisation option">responsive.details.type<span>R</span></code></a> option.</li> + </ul> + + <p>Please <a href="//datatables.net/extensions/responsive/">refer to the Responsive manual</a> for further details of these options.</p> + + <p>This example shows the <code>salary</code> column visible on a desktop only - <code>office</code> and <code>age</code> require a tablet, while the + <code>position</code> column requires a phone in landscape or larger. The <code>name</code> column is always visible and the <code>start date</code> is never + visible.</p> + + <p>This can be useful if you wish to change the format of the data shown on different devices, for example using a combination of <code>mobile</code> and + <code>not-mobile</code> on two different columns would allow information to be formatted suitable for each device type.</p> + </div> + + <div id="breakpoint"></div> + + <table id="example" class="display responsive" width="100%"> + <thead> + <tr> + <th class="all">Name</th> + <th class="min-phone-l">Position</th> + <th class="min-tablet">Office</th> + <th class="min-tablet">Age</th> + <th class="never">Start date</th> + <th class="desktop">Salary</th> + <th class="none">Extn.</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + </tr> + </tfoot> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + &quot;ajax&quot;: &quot;../../../../examples/ajax/data/objects.txt&quot;, + &quot;columns&quot;: [ + { &quot;data&quot;: &quot;name&quot; }, + { &quot;data&quot;: &quot;position&quot; }, + { &quot;data&quot;: &quot;office&quot; }, + { &quot;data&quot;: &quot;age&quot; }, + { &quot;data&quot;: &quot;start_date&quot; }, + { &quot;data&quot;: &quot;salary&quot; }, + { &quot;data&quot;: &quot;extn&quot; } + ] + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li> + <li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="../initialisation/index.html">Basic initialisation</a></h3> + <ul class="toc"> + <li><a href="../initialisation/className.html">Class name</a></li> + <li><a href="../initialisation/option.html">Configuration option</a></li> + <li><a href="../initialisation/new.html">`new` constructor</a></li> + <li><a href="../initialisation/ajax.html">Ajax data</a></li> + <li><a href="../initialisation/default.html">Default initialisation</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../styling/index.html">Styling</a></h3> + <ul class="toc"> + <li><a href="../styling/bootstrap.html">Bootstrap styling</a></li> + <li><a href="../styling/foundation.html">Foundation styling</a></li> + <li><a href="../styling/scrolling.html">Vertical scrolling</a></li> + <li><a href="../styling/compact.html">Compact styling</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="./index.html">Display control</a></h3> + <ul class="toc active"> + <li><a href="./auto.html">Automatic column hiding</a></li> + <li class="active"><a href="./classes.html">Class control</a></li> + <li><a href="./init-classes.html">Assigned class control</a></li> + <li><a href="./fixedHeader.html">With FixedHeader</a></li> + <li><a href="./complexHeader.html">Complex headers (rowspan / colspan)</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../child-rows/index.html">Child rows</a></h3> + <ul class="toc"> + <li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li> + <li><a href="../child-rows/column-control.html">Column controlled child rows</a></li> + <li><a href="../child-rows/right-column.html">Column control - right</a></li> + <li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li> + <li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/display-control/complexHeader.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/display-control/complexHeader.html new file mode 100644 index 0000000..04d051c --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/display-control/complexHeader.html @@ -0,0 +1,708 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Responsive example - Complex headers (rowspan / colspan)</title> + <link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + th { + position: relative; + min-height: 41px; + } + span { + display: block; + position: absolute; + left: 0; + right: 0; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + } + + </style> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + // jQuery update a column title from the demo table to contain a long description + // You would not need to do this in your own code. + $('#example thead tr:eq(0) th:eq(2)').html("This is a really long column title!"); + + // Wrap the colspan'ing header cells with a span so they can be positioned + // absolutely - filling the available space, and no more. + $('#example thead th[colspan]').wrapInner( '<span/>' ).append( '&nbsp;' ); + + // Standard initialisation + $('#example').DataTable( { + responsive: true, + paging: false + } ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>Complex headers (rowspan / colspan)</span></h1> + + <div class="info"> + <p>This example shows how Responsive can be used with <em>complex headers</em> (i.e. headers that contain <code>colspan</code> attributes for one or more cells). + As Responsive will removed columns one at a time the cell with the <code>colspan</code> attribute can end up forcing the width of a column, disrupting the flow. + Rather than removing all columns under the <code>colspan</code> cell, we want to reduce the amount of text that is visible in that cell. This example shows how + that can be achieved thought a little bit of jQuery and CSS.</p> + + <p>We use jQuery to find the header cells which have a <code>colspan</code> attribute and wrap their contents in a <code class="tag" title="HTML tag">span</code> + tag. That <code class="tag" title="HTML tag">span</code> is then set to <code>position: absolute;</code> using <code>text-overflow: ellipsis</code>. The result is + that the text of the <code>colspan</code> cell will reduce automatically to fit the available area based on the contents of the column cells below it.</p> + + <p>This functionality is not currently built into Responsive. It likely will be for v1.1.</p> + </div> + + <table id="example" class="display nowrap" cellspacing="0" width="100%"> + <thead> + <tr> + <th rowspan="2">Name</th> + <th colspan="2">HR Information</th> + <th colspan="3">Contact</th> + </tr> + <tr> + <th>Position</th> + <th>Salary</th> + <th>Office</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Salary</th> + <th>Office</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>$320,800</td> + <td>Edinburgh</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>$170,750</td> + <td>Tokyo</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>$86,000</td> + <td>San Francisco</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>$433,060</td> + <td>Edinburgh</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>$162,700</td> + <td>Tokyo</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>$372,000</td> + <td>New York</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>$137,500</td> + <td>San Francisco</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>$327,900</td> + <td>Tokyo</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>$205,500</td> + <td>San Francisco</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>$103,600</td> + <td>Edinburgh</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>$90,560</td> + <td>London</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>$342,000</td> + <td>Edinburgh</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>$470,600</td> + <td>San Francisco</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>$313,500</td> + <td>London</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>$385,750</td> + <td>London</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>$198,500</td> + <td>London</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>$725,000</td> + <td>New York</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>$237,500</td> + <td>New York</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>$132,000</td> + <td>London</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>$217,500</td> + <td>Edinburgh</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>$345,000</td> + <td>New York</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>$675,000</td> + <td>New York</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>$106,450</td> + <td>New York</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>$85,600</td> + <td>Sidney</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>$1,200,000</td> + <td>London</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>$92,575</td> + <td>Edinburgh</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>$357,650</td> + <td>Singapore</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>$206,850</td> + <td>San Francisco</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>$850,000</td> + <td>San Francisco</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>$163,000</td> + <td>Tokyo</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>$95,400</td> + <td>Sidney</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>$114,500</td> + <td>London</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>$145,000</td> + <td>London</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>$235,500</td> + <td>San Francisco</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>$324,050</td> + <td>Edinburgh</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>$85,675</td> + <td>San Francisco</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>$164,500</td> + <td>San Francisco</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>$109,850</td> + <td>San Francisco</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>$452,500</td> + <td>San Francisco</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>$136,200</td> + <td>London</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>$645,750</td> + <td>New York</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>$234,500</td> + <td>Singapore</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>$163,500</td> + <td>London</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>$139,575</td> + <td>Tokyo</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>$98,540</td> + <td>New York</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>$87,500</td> + <td>San Francisco</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>$138,575</td> + <td>Singapore</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>$125,250</td> + <td>New York</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>$115,000</td> + <td>San Francisco</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>$75,650</td> + <td>Edinburgh</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>$145,600</td> + <td>New York</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>$356,250</td> + <td>London</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>$103,500</td> + <td>London</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>$86,500</td> + <td>San Francisco</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>$183,000</td> + <td>Edinburgh</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>$183,000</td> + <td>Singapore</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>$112,000</td> + <td>New York</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + // jQuery update a column title from the demo table to contain a long description + // You would not need to do this in your own code. + $('#example thead tr:eq(0) th:eq(2)').html(&quot;This is a really long column title!&quot;); + + // Wrap the colspan'ing header cells with a span so they can be positioned + // absolutely - filling the available space, and no more. + $('#example thead th[colspan]').wrapInner( '&lt;span/&gt;' ).append( '&amp;nbsp;' ); + + // Standard initialisation + $('#example').DataTable( { + responsive: true, + paging: false + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li> + <li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">th { + position: relative; + min-height: 41px; + } + span { + display: block; + position: absolute; + left: 0; + right: 0; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="../initialisation/index.html">Basic initialisation</a></h3> + <ul class="toc"> + <li><a href="../initialisation/className.html">Class name</a></li> + <li><a href="../initialisation/option.html">Configuration option</a></li> + <li><a href="../initialisation/new.html">`new` constructor</a></li> + <li><a href="../initialisation/ajax.html">Ajax data</a></li> + <li><a href="../initialisation/default.html">Default initialisation</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../styling/index.html">Styling</a></h3> + <ul class="toc"> + <li><a href="../styling/bootstrap.html">Bootstrap styling</a></li> + <li><a href="../styling/foundation.html">Foundation styling</a></li> + <li><a href="../styling/scrolling.html">Vertical scrolling</a></li> + <li><a href="../styling/compact.html">Compact styling</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="./index.html">Display control</a></h3> + <ul class="toc active"> + <li><a href="./auto.html">Automatic column hiding</a></li> + <li><a href="./classes.html">Class control</a></li> + <li><a href="./init-classes.html">Assigned class control</a></li> + <li><a href="./fixedHeader.html">With FixedHeader</a></li> + <li class="active"><a href="./complexHeader.html">Complex headers (rowspan / colspan)</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../child-rows/index.html">Child rows</a></h3> + <ul class="toc"> + <li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li> + <li><a href="../child-rows/column-control.html">Column controlled child rows</a></li> + <li><a href="../child-rows/right-column.html">Column control - right</a></li> + <li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li> + <li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/display-control/fixedHeader.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/display-control/fixedHeader.html new file mode 100644 index 0000000..fbf57a5 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/display-control/fixedHeader.html @@ -0,0 +1,825 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Responsive example - With FixedHeader</title> + <link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css"> + <link rel="stylesheet" type="text/css" href="../../../FixedHeader/css/dataTables.fixedHeader.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + div.container { max-width: 1200px } + + </style> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script> + <script type="text/javascript" language="javascript" src="../../../FixedHeader/js/dataTables.fixedHeader.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + var table = $('#example').DataTable( { + responsive: true, + paging: false + } ); + + new $.fn.dataTable.FixedHeader( table ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>With FixedHeader</span></h1> + + <div class="info"> + <p>This example shows Responsive being used with the DataTables <a href="http://datatables.net/extensions/fixedheader">FixedHeader</a> extension. FixedHeader will + lock a table's header to the top of the table, ensuring that the user always knows what each column relates to.</p> + </div> + + <table id="example" class="display nowrap" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable( { + responsive: true, + paging: false + } ); + + new $.fn.dataTable.FixedHeader( table ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li> + <li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li> + <li><a href="../../../FixedHeader/js/dataTables.fixedHeader.js">../../../FixedHeader/js/dataTables.fixedHeader.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">div.container { max-width: 1200px }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li> + <li><a href="../../../FixedHeader/css/dataTables.fixedHeader.css">../../../FixedHeader/css/dataTables.fixedHeader.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="../initialisation/index.html">Basic initialisation</a></h3> + <ul class="toc"> + <li><a href="../initialisation/className.html">Class name</a></li> + <li><a href="../initialisation/option.html">Configuration option</a></li> + <li><a href="../initialisation/new.html">`new` constructor</a></li> + <li><a href="../initialisation/ajax.html">Ajax data</a></li> + <li><a href="../initialisation/default.html">Default initialisation</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../styling/index.html">Styling</a></h3> + <ul class="toc"> + <li><a href="../styling/bootstrap.html">Bootstrap styling</a></li> + <li><a href="../styling/foundation.html">Foundation styling</a></li> + <li><a href="../styling/scrolling.html">Vertical scrolling</a></li> + <li><a href="../styling/compact.html">Compact styling</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="./index.html">Display control</a></h3> + <ul class="toc active"> + <li><a href="./auto.html">Automatic column hiding</a></li> + <li><a href="./classes.html">Class control</a></li> + <li><a href="./init-classes.html">Assigned class control</a></li> + <li class="active"><a href="./fixedHeader.html">With FixedHeader</a></li> + <li><a href="./complexHeader.html">Complex headers (rowspan / colspan)</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../child-rows/index.html">Child rows</a></h3> + <ul class="toc"> + <li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li> + <li><a href="../child-rows/column-control.html">Column controlled child rows</a></li> + <li><a href="../child-rows/right-column.html">Column control - right</a></li> + <li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li> + <li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/display-control/index.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/display-control/index.html new file mode 100644 index 0000000..3dc1c47 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/display-control/index.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + + <title>Responsive examples - Display control</title> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>Display control</span></h1> + + <div class="info"> + <p>Responsive has two basic modes of operation for controlling the visibility of columns at different display sizes. These two modes can be using either separately + or together:</p> + + <ul class="markdown"> + <li>Manually assigned class names for breakpoints - Assign a column a class name to tell Responsive which breakpoint(s) to show it in.</li> + <li>Automatically - for columns without a breakpoint class name, it will be automatically removed if there is no room available on screen to show it. Columns + are removed from the right, moving left.</li> + </ul> + + <p>This section explores these two options.</p> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Display control</a></h3> + <ul class="toc"> + <li><a href="./auto.html">Automatic column hiding</a></li> + <li><a href="./classes.html">Class control</a></li> + <li><a href="./init-classes.html">Assigned class control</a></li> + <li><a href="./fixedHeader.html">With FixedHeader</a></li> + <li><a href="./complexHeader.html">Complex headers (rowspan / colspan)</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/display-control/init-classes.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/display-control/init-classes.html new file mode 100644 index 0000000..2524e42 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/display-control/init-classes.html @@ -0,0 +1,215 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Responsive example - Assigned class control</title> + <link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + + </style> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + $('#example').DataTable( { + "ajax": "../../../../examples/ajax/data/objects.txt", + "columns": [ + { "data": "name", className: "all" }, + { "data": "position", className: "min-phone-l" }, + { "data": "office", className: "min-tablet" }, + { "data": "age", className: "min-tablet" }, + { "data": "start_date", className: "never" }, + { "data": "salary", className: "desktop" }, + { "data": "extn", className: "none" } + ] + } ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>Assigned class control</span></h1> + + <div class="info"> + <p>This example exactly matches the functionality of the <a href="classes.xml">class control example</a> but in this case the classes are assigned using the + <a href="//datatables.net/reference/option/columns.className"><code class="option" title= + "DataTables initialisation option">columns.className<span>DT</span></code></a> option.</p> + </div> + + <div id="breakpoint"></div> + + <table id="example" class="display responsive" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + </tr> + </tfoot> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + &quot;ajax&quot;: &quot;../../../../examples/ajax/data/objects.txt&quot;, + &quot;columns&quot;: [ + { &quot;data&quot;: &quot;name&quot;, className: &quot;all&quot; }, + { &quot;data&quot;: &quot;position&quot;, className: &quot;min-phone-l&quot; }, + { &quot;data&quot;: &quot;office&quot;, className: &quot;min-tablet&quot; }, + { &quot;data&quot;: &quot;age&quot;, className: &quot;min-tablet&quot; }, + { &quot;data&quot;: &quot;start_date&quot;, className: &quot;never&quot; }, + { &quot;data&quot;: &quot;salary&quot;, className: &quot;desktop&quot; }, + { &quot;data&quot;: &quot;extn&quot;, className: &quot;none&quot; } + ] + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li> + <li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="../initialisation/index.html">Basic initialisation</a></h3> + <ul class="toc"> + <li><a href="../initialisation/className.html">Class name</a></li> + <li><a href="../initialisation/option.html">Configuration option</a></li> + <li><a href="../initialisation/new.html">`new` constructor</a></li> + <li><a href="../initialisation/ajax.html">Ajax data</a></li> + <li><a href="../initialisation/default.html">Default initialisation</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../styling/index.html">Styling</a></h3> + <ul class="toc"> + <li><a href="../styling/bootstrap.html">Bootstrap styling</a></li> + <li><a href="../styling/foundation.html">Foundation styling</a></li> + <li><a href="../styling/scrolling.html">Vertical scrolling</a></li> + <li><a href="../styling/compact.html">Compact styling</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="./index.html">Display control</a></h3> + <ul class="toc active"> + <li><a href="./auto.html">Automatic column hiding</a></li> + <li><a href="./classes.html">Class control</a></li> + <li class="active"><a href="./init-classes.html">Assigned class control</a></li> + <li><a href="./fixedHeader.html">With FixedHeader</a></li> + <li><a href="./complexHeader.html">Complex headers (rowspan / colspan)</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../child-rows/index.html">Child rows</a></h3> + <ul class="toc"> + <li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li> + <li><a href="../child-rows/column-control.html">Column controlled child rows</a></li> + <li><a href="../child-rows/right-column.html">Column control - right</a></li> + <li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li> + <li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/index.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/index.html new file mode 100644 index 0000000..bb2cfbc --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/index.html @@ -0,0 +1,86 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + + <title>Responsive examples - Responsive DataTables</title> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>Responsive DataTables</span></h1> + + <div class="info"></div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <div class="toc"> + <div class="toc-group"> + <h3><a href="./initialisation/index.html">Basic initialisation</a></h3> + <ul class="toc"> + <li><a href="./initialisation/className.html">Class name</a></li> + <li><a href="./initialisation/option.html">Configuration option</a></li> + <li><a href="./initialisation/new.html">`new` constructor</a></li> + <li><a href="./initialisation/ajax.html">Ajax data</a></li> + <li><a href="./initialisation/default.html">Default initialisation</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="./styling/index.html">Styling</a></h3> + <ul class="toc"> + <li><a href="./styling/bootstrap.html">Bootstrap styling</a></li> + <li><a href="./styling/foundation.html">Foundation styling</a></li> + <li><a href="./styling/scrolling.html">Vertical scrolling</a></li> + <li><a href="./styling/compact.html">Compact styling</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="./display-control/index.html">Display control</a></h3> + <ul class="toc"> + <li><a href="./display-control/auto.html">Automatic column hiding</a></li> + <li><a href="./display-control/classes.html">Class control</a></li> + <li><a href="./display-control/init-classes.html">Assigned class control</a></li> + <li><a href="./display-control/fixedHeader.html">With FixedHeader</a></li> + <li><a href="./display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="./child-rows/index.html">Child rows</a></h3> + <ul class="toc"> + <li><a href="./child-rows/disable-child-rows.html">Disable child rows</a></li> + <li><a href="./child-rows/column-control.html">Column controlled child rows</a></li> + <li><a href="./child-rows/right-column.html">Column control - right</a></li> + <li><a href="./child-rows/whole-row-control.html">Whole row child row control</a></li> + <li><a href="./child-rows/custom-renderer.html">Custom child row renderer</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/initialisation/ajax.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/initialisation/ajax.html new file mode 100644 index 0000000..b60ebfc --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/initialisation/ajax.html @@ -0,0 +1,210 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Responsive example - Ajax data</title> + <link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + div.container { max-width: 1200px } + + </style> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + $('#example').DataTable( { + "ajax": "../../../../examples/ajax/data/objects.txt", + "columns": [ + { "data": "name" }, + { "data": "position" }, + { "data": "office" }, + { "data": "extn" }, + { "data": "start_date" }, + { "data": "salary" } + ] + } ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>Ajax data</span></h1> + + <div class="info"> + <p>This example shows the Responsive extension working with <a href="//datatables.net/manual/data">Ajax sourced data</a> in the DataTable. Note that no special + initialisation is required. Responsive is enabled by adding the <code class="string" title="String">responsive</code> class to the <code class="tag" title= + "HTML tag">table</code> element.</p> + </div> + + <table id="example" class="display responsive nowrap" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Extn.</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Extn.</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + &quot;ajax&quot;: &quot;../../../../examples/ajax/data/objects.txt&quot;, + &quot;columns&quot;: [ + { &quot;data&quot;: &quot;name&quot; }, + { &quot;data&quot;: &quot;position&quot; }, + { &quot;data&quot;: &quot;office&quot; }, + { &quot;data&quot;: &quot;extn&quot; }, + { &quot;data&quot;: &quot;start_date&quot; }, + { &quot;data&quot;: &quot;salary&quot; } + ] + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li> + <li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">div.container { max-width: 1200px }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Basic initialisation</a></h3> + <ul class="toc active"> + <li><a href="./className.html">Class name</a></li> + <li><a href="./option.html">Configuration option</a></li> + <li><a href="./new.html">`new` constructor</a></li> + <li class="active"><a href="./ajax.html">Ajax data</a></li> + <li><a href="./default.html">Default initialisation</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../styling/index.html">Styling</a></h3> + <ul class="toc"> + <li><a href="../styling/bootstrap.html">Bootstrap styling</a></li> + <li><a href="../styling/foundation.html">Foundation styling</a></li> + <li><a href="../styling/scrolling.html">Vertical scrolling</a></li> + <li><a href="../styling/compact.html">Compact styling</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../display-control/index.html">Display control</a></h3> + <ul class="toc"> + <li><a href="../display-control/auto.html">Automatic column hiding</a></li> + <li><a href="../display-control/classes.html">Class control</a></li> + <li><a href="../display-control/init-classes.html">Assigned class control</a></li> + <li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li> + <li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../child-rows/index.html">Child rows</a></h3> + <ul class="toc"> + <li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li> + <li><a href="../child-rows/column-control.html">Column controlled child rows</a></li> + <li><a href="../child-rows/right-column.html">Column control - right</a></li> + <li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li> + <li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/initialisation/className.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/initialisation/className.html new file mode 100644 index 0000000..813b7af --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/initialisation/className.html @@ -0,0 +1,812 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Responsive example - Class name</title> + <link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + $('#example').DataTable(); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>Class name</span></h1> + + <div class="info"> + <p>The easiest way to initialise the Responsive extension for DataTables is simply to add the class <code class="string" title="String">responsive</code> to the + table's class name. When the DataTable is initialised the Responsive extension will automatically enable itself on these tables.</p> + + <p>The may also use the class <code>dt-responsive</code> to perform the same action, since <code>responsive</code> may be used in your stylesheet, or may have some + other meaning in a CSS framework being used (for example Bootstrap).</p> + </div> + + <table id="example" class="display responsive nowrap" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable(); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li> + <li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Basic initialisation</a></h3> + <ul class="toc active"> + <li class="active"><a href="./className.html">Class name</a></li> + <li><a href="./option.html">Configuration option</a></li> + <li><a href="./new.html">`new` constructor</a></li> + <li><a href="./ajax.html">Ajax data</a></li> + <li><a href="./default.html">Default initialisation</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../styling/index.html">Styling</a></h3> + <ul class="toc"> + <li><a href="../styling/bootstrap.html">Bootstrap styling</a></li> + <li><a href="../styling/foundation.html">Foundation styling</a></li> + <li><a href="../styling/scrolling.html">Vertical scrolling</a></li> + <li><a href="../styling/compact.html">Compact styling</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../display-control/index.html">Display control</a></h3> + <ul class="toc"> + <li><a href="../display-control/auto.html">Automatic column hiding</a></li> + <li><a href="../display-control/classes.html">Class control</a></li> + <li><a href="../display-control/init-classes.html">Assigned class control</a></li> + <li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li> + <li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../child-rows/index.html">Child rows</a></h3> + <ul class="toc"> + <li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li> + <li><a href="../child-rows/column-control.html">Column controlled child rows</a></li> + <li><a href="../child-rows/right-column.html">Column control - right</a></li> + <li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li> + <li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/initialisation/default.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/initialisation/default.html new file mode 100644 index 0000000..f196839 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/initialisation/default.html @@ -0,0 +1,822 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Responsive example - Default initialisation</title> + <link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$.extend( $.fn.dataTable.defaults, { + responsive: true +} ); + +$(document).ready(function() { + $('#example').DataTable(); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>Default initialisation</span></h1> + + <div class="info"> + <p>It can often be useful to be able to set a default value for DataTables' initialisation options, providing a common starting point for initialisation when + working with multiple tables over many pages or even just on a single page. DataTables provides that ability through the <code>$.fn.dataTable.defaults</code> + object which can have any of the <a href="//datatables.net/reference/option">initialisation options</a> set.</p> + + <p>Extending that ability, Responsive can also be set to initialise by default, as shown in this example thorugh the + <code>$.fn.dataTable.defaults.responsive</code> property. Extending that, <a href="//datatables.net/extensions/responsive/reference/option/">all of the Responsive + options</a> can also be set using this configuration option (i.e. use <code>responsive</code> as an object).</p> + </div> + + <table id="example" class="display nowrap" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$.extend( $.fn.dataTable.defaults, { + responsive: true +} ); + +$(document).ready(function() { + $('#example').DataTable(); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li> + <li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Basic initialisation</a></h3> + <ul class="toc active"> + <li><a href="./className.html">Class name</a></li> + <li><a href="./option.html">Configuration option</a></li> + <li><a href="./new.html">`new` constructor</a></li> + <li><a href="./ajax.html">Ajax data</a></li> + <li class="active"><a href="./default.html">Default initialisation</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../styling/index.html">Styling</a></h3> + <ul class="toc"> + <li><a href="../styling/bootstrap.html">Bootstrap styling</a></li> + <li><a href="../styling/foundation.html">Foundation styling</a></li> + <li><a href="../styling/scrolling.html">Vertical scrolling</a></li> + <li><a href="../styling/compact.html">Compact styling</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../display-control/index.html">Display control</a></h3> + <ul class="toc"> + <li><a href="../display-control/auto.html">Automatic column hiding</a></li> + <li><a href="../display-control/classes.html">Class control</a></li> + <li><a href="../display-control/init-classes.html">Assigned class control</a></li> + <li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li> + <li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../child-rows/index.html">Child rows</a></h3> + <ul class="toc"> + <li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li> + <li><a href="../child-rows/column-control.html">Column controlled child rows</a></li> + <li><a href="../child-rows/right-column.html">Column control - right</a></li> + <li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li> + <li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/initialisation/index.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/initialisation/index.html new file mode 100644 index 0000000..8ca0f94 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/initialisation/index.html @@ -0,0 +1,65 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + + <title>Responsive examples - Initialisation</title> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>Initialisation</span></h1> + + <div class="info"> + <p>Responsive can be run on a DataTable in a number of different ways:</p> + + <ul class="markdown"> + <li>By adding the class <code>responsive</code> or <code>dt-responsive</code> to the <code class="tag" title="HTML tag">table</code></li> + <li>Using the <a href="//datatables.net/extensions/responsive/reference/option/responsive"><code class="option" title= + "Responsive initialisation option">responsive<span>R</span></code></a> option in the DataTables initialisation</li> + <li>Use the <code>$.fn.dataTable.Responsive</code> constructor.</li> + </ul> + + <p>This set of examples demonstrates these initialisation options.</p> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Basic initialisation</a></h3> + <ul class="toc"> + <li><a href="./className.html">Class name</a></li> + <li><a href="./option.html">Configuration option</a></li> + <li><a href="./new.html">`new` constructor</a></li> + <li><a href="./ajax.html">Ajax data</a></li> + <li><a href="./default.html">Default initialisation</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/initialisation/new.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/initialisation/new.html new file mode 100644 index 0000000..07ecd6f --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/initialisation/new.html @@ -0,0 +1,821 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Responsive example - `new` constructor</title> + <link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + div.container { max-width: 1200px } + + </style> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + var table = $('#example').DataTable(); + + new $.fn.dataTable.Responsive( table ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>`new` constructor</span></h1> + + <div class="info"> + <p>Responsive will automatically detect new DataTable instances being created on a page and initialise itself if it find the <a href= + "//datatables.net/extensions/responsive/reference/option/responsive"><code class="option" title= + "Responsive initialisation option">responsive<span>R</span></code></a> option or <code>responsive</code> class name on the table, as shown in the other + examples.</p> + + <p>The third way of initialising Responsive is manually creating a new instance using the <code>$.fn.dataTable.Responsive</code> class, as shown in this example + (the other two methods are provided using this constructor in a <a href="//datatables.net/reference/event/init"><code class="event" title= + "DataTables event">init<span>DT</span></code></a> event handler!).</p> + </div> + + <table id="example" class="display nowrap" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable(); + + new $.fn.dataTable.Responsive( table ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li> + <li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">div.container { max-width: 1200px }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Basic initialisation</a></h3> + <ul class="toc active"> + <li><a href="./className.html">Class name</a></li> + <li><a href="./option.html">Configuration option</a></li> + <li class="active"><a href="./new.html">`new` constructor</a></li> + <li><a href="./ajax.html">Ajax data</a></li> + <li><a href="./default.html">Default initialisation</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../styling/index.html">Styling</a></h3> + <ul class="toc"> + <li><a href="../styling/bootstrap.html">Bootstrap styling</a></li> + <li><a href="../styling/foundation.html">Foundation styling</a></li> + <li><a href="../styling/scrolling.html">Vertical scrolling</a></li> + <li><a href="../styling/compact.html">Compact styling</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../display-control/index.html">Display control</a></h3> + <ul class="toc"> + <li><a href="../display-control/auto.html">Automatic column hiding</a></li> + <li><a href="../display-control/classes.html">Class control</a></li> + <li><a href="../display-control/init-classes.html">Assigned class control</a></li> + <li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li> + <li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../child-rows/index.html">Child rows</a></h3> + <ul class="toc"> + <li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li> + <li><a href="../child-rows/column-control.html">Column controlled child rows</a></li> + <li><a href="../child-rows/right-column.html">Column control - right</a></li> + <li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li> + <li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/initialisation/option.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/initialisation/option.html new file mode 100644 index 0000000..70785d8 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/initialisation/option.html @@ -0,0 +1,820 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Responsive example - Configuration option</title> + <link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + div.container { max-width: 1200px } + + </style> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + $('#example').DataTable( { + responsive: true + } ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>Configuration option</span></h1> + + <div class="info"> + <p>The Responsive extension for DataTables can be applied to a DataTable in one of two ways; with a specific class name on the table, or using the DataTables + initialisation options. This method shows the latter, with the <a href="//datatables.net/extensions/responsive/reference/option/responsive"><code class="option" + title="Responsive initialisation option">responsive<span>R</span></code></a> option being set to the boolean value <code>true</code>.</p> + + <p>The <a href="//datatables.net/extensions/responsive/reference/option/responsive"><code class="option" title= + "Responsive initialisation option">responsive<span>R</span></code></a> option can be given as a boolean value, or as an object with configuration options. If as a + boolean, as in this case, the default options are used.</p> + </div> + + <table id="example" class="display nowrap" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + responsive: true + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li> + <li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">div.container { max-width: 1200px }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Basic initialisation</a></h3> + <ul class="toc active"> + <li><a href="./className.html">Class name</a></li> + <li class="active"><a href="./option.html">Configuration option</a></li> + <li><a href="./new.html">`new` constructor</a></li> + <li><a href="./ajax.html">Ajax data</a></li> + <li><a href="./default.html">Default initialisation</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../styling/index.html">Styling</a></h3> + <ul class="toc"> + <li><a href="../styling/bootstrap.html">Bootstrap styling</a></li> + <li><a href="../styling/foundation.html">Foundation styling</a></li> + <li><a href="../styling/scrolling.html">Vertical scrolling</a></li> + <li><a href="../styling/compact.html">Compact styling</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../display-control/index.html">Display control</a></h3> + <ul class="toc"> + <li><a href="../display-control/auto.html">Automatic column hiding</a></li> + <li><a href="../display-control/classes.html">Class control</a></li> + <li><a href="../display-control/init-classes.html">Assigned class control</a></li> + <li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li> + <li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../child-rows/index.html">Child rows</a></h3> + <ul class="toc"> + <li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li> + <li><a href="../child-rows/column-control.html">Column controlled child rows</a></li> + <li><a href="../child-rows/right-column.html">Column control - right</a></li> + <li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li> + <li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/styling/bootstrap.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/styling/bootstrap.html new file mode 100644 index 0000000..6a7175f --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/styling/bootstrap.html @@ -0,0 +1,831 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Responsive example - Bootstrap styling</title> + <link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css"> + <link rel="stylesheet" type="text/css" href="../../../Plugins/integration/bootstrap/3/dataTables.bootstrap.css"> + <link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + body { font-size: 140% } + + table.dataTable th, + table.dataTable td { + white-space: nowrap; + } + + </style> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script> + <script type="text/javascript" language="javascript" src="../../../Plugins/integration/bootstrap/3/dataTables.bootstrap.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + $('#example').DataTable(); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>Bootstrap styling</span></h1> + + <div class="info"> + <p>This example shows DataTables and the Responsive extension being used with the <a href="http://getbootstrap.com">Bootstrap</a> framework providing the styling. + The <a href="//datatables.net/manual/styling/bootstrap">DataTables / Bootstrap integration files</a> prove seamless integration for DataTables to be used in a + Bootstrap page.</p> + + <p>Note that the <code>dt-responsive</code> class is used to indicate to the extension that it should be enabled on this page, as <code>responsive</code> <a href= + "http://getbootstrap.com/css/#tables-responsive">has special meaning in Bootstrap</a>. The <a href= + "//datatables.net/extensions/responsive/reference/option/responsive"><code class="option" title= + "Responsive initialisation option">responsive<span>R</span></code></a> option could also be used if required.</p> + </div> + + <table id="example" class="table table-striped table-hover dt-responsive" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable(); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li> + <li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li> + <li><a href="../../../Plugins/integration/bootstrap/3/dataTables.bootstrap.js">../../../Plugins/integration/bootstrap/3/dataTables.bootstrap.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">body { font-size: 140% } + + table.dataTable th, + table.dataTable td { + white-space: nowrap; + }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css</a></li> + <li><a href="../../../Plugins/integration/bootstrap/3/dataTables.bootstrap.css">../../../Plugins/integration/bootstrap/3/dataTables.bootstrap.css</a></li> + <li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="../initialisation/index.html">Basic initialisation</a></h3> + <ul class="toc"> + <li><a href="../initialisation/className.html">Class name</a></li> + <li><a href="../initialisation/option.html">Configuration option</a></li> + <li><a href="../initialisation/new.html">`new` constructor</a></li> + <li><a href="../initialisation/ajax.html">Ajax data</a></li> + <li><a href="../initialisation/default.html">Default initialisation</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="./index.html">Styling</a></h3> + <ul class="toc active"> + <li class="active"><a href="./bootstrap.html">Bootstrap styling</a></li> + <li><a href="./foundation.html">Foundation styling</a></li> + <li><a href="./scrolling.html">Vertical scrolling</a></li> + <li><a href="./compact.html">Compact styling</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../display-control/index.html">Display control</a></h3> + <ul class="toc"> + <li><a href="../display-control/auto.html">Automatic column hiding</a></li> + <li><a href="../display-control/classes.html">Class control</a></li> + <li><a href="../display-control/init-classes.html">Assigned class control</a></li> + <li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li> + <li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../child-rows/index.html">Child rows</a></h3> + <ul class="toc"> + <li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li> + <li><a href="../child-rows/column-control.html">Column controlled child rows</a></li> + <li><a href="../child-rows/right-column.html">Column control - right</a></li> + <li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li> + <li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/styling/compact.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/styling/compact.html new file mode 100644 index 0000000..91d7118 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/styling/compact.html @@ -0,0 +1,816 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Responsive example - Compact styling</title> + <link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + div.container { max-width: 1200px } + + </style> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + var table = $('#example').DataTable(); + + new $.fn.dataTable.Responsive( table ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>Compact styling</span></h1> + + <div class="info"> + <p>DataTables' <a href="http://datatables.net/manual/styling/classes">default stylesheet</a> has a number number of features available that can be enabled by + including a class name on the DataTable. One of those options is <code>compact</code> which displays the DataTable with less whitespace padding that might other be + used to increase the information density of the table. Responsive's own style has support for this <code>compact</code> styling as showing in this example.</p> + </div> + + <table id="example" class="display compact nowrap" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable(); + + new $.fn.dataTable.Responsive( table ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li> + <li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">div.container { max-width: 1200px }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="../initialisation/index.html">Basic initialisation</a></h3> + <ul class="toc"> + <li><a href="../initialisation/className.html">Class name</a></li> + <li><a href="../initialisation/option.html">Configuration option</a></li> + <li><a href="../initialisation/new.html">`new` constructor</a></li> + <li><a href="../initialisation/ajax.html">Ajax data</a></li> + <li><a href="../initialisation/default.html">Default initialisation</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="./index.html">Styling</a></h3> + <ul class="toc active"> + <li><a href="./bootstrap.html">Bootstrap styling</a></li> + <li><a href="./foundation.html">Foundation styling</a></li> + <li><a href="./scrolling.html">Vertical scrolling</a></li> + <li class="active"><a href="./compact.html">Compact styling</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../display-control/index.html">Display control</a></h3> + <ul class="toc"> + <li><a href="../display-control/auto.html">Automatic column hiding</a></li> + <li><a href="../display-control/classes.html">Class control</a></li> + <li><a href="../display-control/init-classes.html">Assigned class control</a></li> + <li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li> + <li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../child-rows/index.html">Child rows</a></h3> + <ul class="toc"> + <li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li> + <li><a href="../child-rows/column-control.html">Column controlled child rows</a></li> + <li><a href="../child-rows/right-column.html">Column control - right</a></li> + <li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li> + <li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/styling/foundation.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/styling/foundation.html new file mode 100644 index 0000000..d41ba40 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/styling/foundation.html @@ -0,0 +1,822 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Responsive example - Foundation styling</title> + <link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/foundation/5.5.1/css/foundation.min.css"> + <link rel="stylesheet" type="text/css" href="../../../Plugins/integration/foundation/dataTables.foundation.css"> + <link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + table.dataTable th, + table.dataTable td { + white-space: nowrap; + } + + </style> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script> + <script type="text/javascript" language="javascript" src="../../../Plugins/integration/foundation/dataTables.foundation.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + $('#example').DataTable(); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>Foundation styling</span></h1> + + <div class="info"> + <p>This example shows DataTables and the Responsive extension being used with the <a href="http://foundation.zurb.com">Foundation</a> framework providing the + styling. The <a href="//datatables.net/manual/styling/foundation">DataTables / Foundation integration files</a> prove seamless integration for DataTables to be + used in a Foundation page.</p> + </div> + + <table id="example" class="tdisplay responsive" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable(); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li> + <li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li> + <li><a href="../../../Plugins/integration/foundation/dataTables.foundation.js">../../../Plugins/integration/foundation/dataTables.foundation.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">table.dataTable th, + table.dataTable td { + white-space: nowrap; + }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="//cdn.jsdelivr.net/foundation/5.5.1/css/foundation.min.css">//cdn.jsdelivr.net/foundation/5.5.1/css/foundation.min.css</a></li> + <li><a href="../../../Plugins/integration/foundation/dataTables.foundation.css">../../../Plugins/integration/foundation/dataTables.foundation.css</a></li> + <li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="../initialisation/index.html">Basic initialisation</a></h3> + <ul class="toc"> + <li><a href="../initialisation/className.html">Class name</a></li> + <li><a href="../initialisation/option.html">Configuration option</a></li> + <li><a href="../initialisation/new.html">`new` constructor</a></li> + <li><a href="../initialisation/ajax.html">Ajax data</a></li> + <li><a href="../initialisation/default.html">Default initialisation</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="./index.html">Styling</a></h3> + <ul class="toc active"> + <li><a href="./bootstrap.html">Bootstrap styling</a></li> + <li class="active"><a href="./foundation.html">Foundation styling</a></li> + <li><a href="./scrolling.html">Vertical scrolling</a></li> + <li><a href="./compact.html">Compact styling</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../display-control/index.html">Display control</a></h3> + <ul class="toc"> + <li><a href="../display-control/auto.html">Automatic column hiding</a></li> + <li><a href="../display-control/classes.html">Class control</a></li> + <li><a href="../display-control/init-classes.html">Assigned class control</a></li> + <li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li> + <li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../child-rows/index.html">Child rows</a></h3> + <ul class="toc"> + <li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li> + <li><a href="../child-rows/column-control.html">Column controlled child rows</a></li> + <li><a href="../child-rows/right-column.html">Column control - right</a></li> + <li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li> + <li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/styling/index.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/styling/index.html new file mode 100644 index 0000000..0de4917 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/styling/index.html @@ -0,0 +1,57 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + + <title>Responsive examples - Styling</title> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>Styling</span></h1> + + <div class="info"> + <p>Responsive requires very little styling information of its own, with styling needed only for the child row display when the table has been collapsed. As such, + integrating Responsive with your application should be as simple as including the Javascript and base stylesheet! This section shows Responsive being styling using + external CSS frameworks.</p> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Styling</a></h3> + <ul class="toc"> + <li><a href="./bootstrap.html">Bootstrap styling</a></li> + <li><a href="./foundation.html">Foundation styling</a></li> + <li><a href="./scrolling.html">Vertical scrolling</a></li> + <li><a href="./compact.html">Compact styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/styling/scrolling.html b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/styling/scrolling.html new file mode 100644 index 0000000..94d77ca --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/examples/styling/scrolling.html @@ -0,0 +1,826 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Responsive example - Vertical scrolling</title> + <link rel="stylesheet" type="text/css" href="../../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../../css/dataTables.responsive.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + div.container { max-width: 1200px } + + </style> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../../js/dataTables.responsive.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: 300, + paging: false + } ); + + new $.fn.dataTable.Responsive( table ); +} ); + + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Responsive example <span>Vertical scrolling</span></h1> + + <div class="info"> + <p>This example shows Responsive in use with the <a href="//datatables.net/reference/option/scrollY"><code class="option" title= + "DataTables initialisation option">scrollY<span>DT</span></code></a> option to present a scrolling table (instead of using paging as the other Responsive examples + do). Responsive will automatically work with the table in such a configuration.</p> + + <p>Responsive can be used with <a href="//datatables.net/reference/option/scrollX"><code class="option" title= + "DataTables initialisation option">scrollX<span>DT</span></code></a>, however it is relatively pointless as Responsive will remove columns to ensure that there is + no horizontal scrolling!</p> + </div> + + <table id="example" class="display nowrap" cellspacing="0" width="100%"> + <thead> + <tr> + <th>First name</th> + <th>Last name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + <th>Extn.</th> + <th>E-mail</th> + </tr> + </thead> + + <tbody> + <tr> + <td>Tiger</td> + <td>Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + <td>5421</td> + <td>t.nixon@datatables.net</td> + </tr> + <tr> + <td>Garrett</td> + <td>Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + <td>8422</td> + <td>g.winters@datatables.net</td> + </tr> + <tr> + <td>Ashton</td> + <td>Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + <td>1562</td> + <td>a.cox@datatables.net</td> + </tr> + <tr> + <td>Cedric</td> + <td>Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + <td>6224</td> + <td>c.kelly@datatables.net</td> + </tr> + <tr> + <td>Airi</td> + <td>Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + <td>5407</td> + <td>a.satou@datatables.net</td> + </tr> + <tr> + <td>Brielle</td> + <td>Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + <td>4804</td> + <td>b.williamson@datatables.net</td> + </tr> + <tr> + <td>Herrod</td> + <td>Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + <td>9608</td> + <td>h.chandler@datatables.net</td> + </tr> + <tr> + <td>Rhona</td> + <td>Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + <td>6200</td> + <td>r.davidson@datatables.net</td> + </tr> + <tr> + <td>Colleen</td> + <td>Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + <td>2360</td> + <td>c.hurst@datatables.net</td> + </tr> + <tr> + <td>Sonya</td> + <td>Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + <td>1667</td> + <td>s.frost@datatables.net</td> + </tr> + <tr> + <td>Jena</td> + <td>Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + <td>3814</td> + <td>j.gaines@datatables.net</td> + </tr> + <tr> + <td>Quinn</td> + <td>Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + <td>9497</td> + <td>q.flynn@datatables.net</td> + </tr> + <tr> + <td>Charde</td> + <td>Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + <td>6741</td> + <td>c.marshall@datatables.net</td> + </tr> + <tr> + <td>Haley</td> + <td>Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + <td>3597</td> + <td>h.kennedy@datatables.net</td> + </tr> + <tr> + <td>Tatyana</td> + <td>Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + <td>1965</td> + <td>t.fitzpatrick@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + <td>1581</td> + <td>m.silva@datatables.net</td> + </tr> + <tr> + <td>Paul</td> + <td>Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + <td>3059</td> + <td>p.byrd@datatables.net</td> + </tr> + <tr> + <td>Gloria</td> + <td>Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + <td>1721</td> + <td>g.little@datatables.net</td> + </tr> + <tr> + <td>Bradley</td> + <td>Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + <td>2558</td> + <td>b.greer@datatables.net</td> + </tr> + <tr> + <td>Dai</td> + <td>Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + <td>2290</td> + <td>d.rios@datatables.net</td> + </tr> + <tr> + <td>Jenette</td> + <td>Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + <td>1937</td> + <td>j.caldwell@datatables.net</td> + </tr> + <tr> + <td>Yuri</td> + <td>Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + <td>6154</td> + <td>y.berry@datatables.net</td> + </tr> + <tr> + <td>Caesar</td> + <td>Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + <td>8330</td> + <td>c.vance@datatables.net</td> + </tr> + <tr> + <td>Doris</td> + <td>Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + <td>3023</td> + <td>d.wilder@datatables.net</td> + </tr> + <tr> + <td>Angelica</td> + <td>Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + <td>5797</td> + <td>a.ramos@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + <td>8822</td> + <td>g.joyce@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + <td>9239</td> + <td>j.chang@datatables.net</td> + </tr> + <tr> + <td>Brenden</td> + <td>Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + <td>1314</td> + <td>b.wagner@datatables.net</td> + </tr> + <tr> + <td>Fiona</td> + <td>Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + <td>2947</td> + <td>f.green@datatables.net</td> + </tr> + <tr> + <td>Shou</td> + <td>Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + <td>8899</td> + <td>s.itou@datatables.net</td> + </tr> + <tr> + <td>Michelle</td> + <td>House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + <td>2769</td> + <td>m.house@datatables.net</td> + </tr> + <tr> + <td>Suki</td> + <td>Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + <td>6832</td> + <td>s.burks@datatables.net</td> + </tr> + <tr> + <td>Prescott</td> + <td>Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + <td>3606</td> + <td>p.bartlett@datatables.net</td> + </tr> + <tr> + <td>Gavin</td> + <td>Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + <td>2860</td> + <td>g.cortez@datatables.net</td> + </tr> + <tr> + <td>Martena</td> + <td>Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + <td>8240</td> + <td>m.mccray@datatables.net</td> + </tr> + <tr> + <td>Unity</td> + <td>Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + <td>5384</td> + <td>u.butler@datatables.net</td> + </tr> + <tr> + <td>Howard</td> + <td>Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + <td>7031</td> + <td>h.hatfield@datatables.net</td> + </tr> + <tr> + <td>Hope</td> + <td>Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + <td>6318</td> + <td>h.fuentes@datatables.net</td> + </tr> + <tr> + <td>Vivian</td> + <td>Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + <td>9422</td> + <td>v.harrell@datatables.net</td> + </tr> + <tr> + <td>Timothy</td> + <td>Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + <td>7580</td> + <td>t.mooney@datatables.net</td> + </tr> + <tr> + <td>Jackson</td> + <td>Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + <td>1042</td> + <td>j.bradshaw@datatables.net</td> + </tr> + <tr> + <td>Olivia</td> + <td>Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + <td>2120</td> + <td>o.liang@datatables.net</td> + </tr> + <tr> + <td>Bruno</td> + <td>Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + <td>6222</td> + <td>b.nash@datatables.net</td> + </tr> + <tr> + <td>Sakura</td> + <td>Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + <td>9383</td> + <td>s.yamamoto@datatables.net</td> + </tr> + <tr> + <td>Thor</td> + <td>Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + <td>8327</td> + <td>t.walton@datatables.net</td> + </tr> + <tr> + <td>Finn</td> + <td>Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + <td>2927</td> + <td>f.camacho@datatables.net</td> + </tr> + <tr> + <td>Serge</td> + <td>Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + <td>8352</td> + <td>s.baldwin@datatables.net</td> + </tr> + <tr> + <td>Zenaida</td> + <td>Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + <td>7439</td> + <td>z.frank@datatables.net</td> + </tr> + <tr> + <td>Zorita</td> + <td>Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + <td>4389</td> + <td>z.serrano@datatables.net</td> + </tr> + <tr> + <td>Jennifer</td> + <td>Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + <td>3431</td> + <td>j.acosta@datatables.net</td> + </tr> + <tr> + <td>Cara</td> + <td>Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + <td>3990</td> + <td>c.stevens@datatables.net</td> + </tr> + <tr> + <td>Hermione</td> + <td>Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + <td>1016</td> + <td>h.butler@datatables.net</td> + </tr> + <tr> + <td>Lael</td> + <td>Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + <td>6733</td> + <td>l.greer@datatables.net</td> + </tr> + <tr> + <td>Jonas</td> + <td>Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + <td>8196</td> + <td>j.alexander@datatables.net</td> + </tr> + <tr> + <td>Shad</td> + <td>Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + <td>6373</td> + <td>s.decker@datatables.net</td> + </tr> + <tr> + <td>Michael</td> + <td>Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + <td>5384</td> + <td>m.bruce@datatables.net</td> + </tr> + <tr> + <td>Donna</td> + <td>Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + <td>4226</td> + <td>d.snider@datatables.net</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable( { + scrollY: 300, + paging: false + } ); + + new $.fn.dataTable.Responsive( table ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../../media/js/jquery.js">../../../../media/js/jquery.js</a></li> + <li><a href="../../../../media/js/jquery.dataTables.js">../../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../../js/dataTables.responsive.js">../../js/dataTables.responsive.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">div.container { max-width: 1200px }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../../media/css/jquery.dataTables.css">../../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../../css/dataTables.responsive.css">../../css/dataTables.responsive.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="../initialisation/index.html">Basic initialisation</a></h3> + <ul class="toc"> + <li><a href="../initialisation/className.html">Class name</a></li> + <li><a href="../initialisation/option.html">Configuration option</a></li> + <li><a href="../initialisation/new.html">`new` constructor</a></li> + <li><a href="../initialisation/ajax.html">Ajax data</a></li> + <li><a href="../initialisation/default.html">Default initialisation</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="./index.html">Styling</a></h3> + <ul class="toc active"> + <li><a href="./bootstrap.html">Bootstrap styling</a></li> + <li><a href="./foundation.html">Foundation styling</a></li> + <li class="active"><a href="./scrolling.html">Vertical scrolling</a></li> + <li><a href="./compact.html">Compact styling</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../display-control/index.html">Display control</a></h3> + <ul class="toc"> + <li><a href="../display-control/auto.html">Automatic column hiding</a></li> + <li><a href="../display-control/classes.html">Class control</a></li> + <li><a href="../display-control/init-classes.html">Assigned class control</a></li> + <li><a href="../display-control/fixedHeader.html">With FixedHeader</a></li> + <li><a href="../display-control/complexHeader.html">Complex headers (rowspan / colspan)</a></li> + </ul> + </div> + + <div class="toc-group"> + <h3><a href="../child-rows/index.html">Child rows</a></h3> + <ul class="toc"> + <li><a href="../child-rows/disable-child-rows.html">Disable child rows</a></li> + <li><a href="../child-rows/column-control.html">Column controlled child rows</a></li> + <li><a href="../child-rows/right-column.html">Column control - right</a></li> + <li><a href="../child-rows/whole-row-control.html">Whole row child row control</a></li> + <li><a href="../child-rows/custom-renderer.html">Custom child row renderer</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/js/dataTables.responsive.js b/theme/bootstrap/plugins/datatables/extensions/Responsive/js/dataTables.responsive.js new file mode 100644 index 0000000..5b4743f --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/js/dataTables.responsive.js @@ -0,0 +1,873 @@ +/*! Responsive 1.0.6 + * 2014-2015 SpryMedia Ltd - datatables.net/license + */ + +/** + * @summary Responsive + * @description Responsive tables plug-in for DataTables + * @version 1.0.6 + * @file dataTables.responsive.js + * @author SpryMedia Ltd (www.sprymedia.co.uk) + * @contact www.sprymedia.co.uk/contact + * @copyright Copyright 2014-2015 SpryMedia Ltd. + * + * This source file is free software, available under the following license: + * MIT license - http://datatables.net/license/mit + * + * This source file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. + * + * For details please refer to: http://www.datatables.net + */ + +(function(window, document, undefined) { + + +var factory = function( $, DataTable ) { +"use strict"; + +/** + * Responsive is a plug-in for the DataTables library that makes use of + * DataTables' ability to change the visibility of columns, changing the + * visibility of columns so the displayed columns fit into the table container. + * The end result is that complex tables will be dynamically adjusted to fit + * into the viewport, be it on a desktop, tablet or mobile browser. + * + * Responsive for DataTables has two modes of operation, which can used + * individually or combined: + * + * * Class name based control - columns assigned class names that match the + * breakpoint logic can be shown / hidden as required for each breakpoint. + * * Automatic control - columns are automatically hidden when there is no + * room left to display them. Columns removed from the right. + * + * In additional to column visibility control, Responsive also has built into + * options to use DataTables' child row display to show / hide the information + * from the table that has been hidden. There are also two modes of operation + * for this child row display: + * + * * Inline - when the control element that the user can use to show / hide + * child rows is displayed inside the first column of the table. + * * Column - where a whole column is dedicated to be the show / hide control. + * + * Initialisation of Responsive is performed by: + * + * * Adding the class `responsive` or `dt-responsive` to the table. In this case + * Responsive will automatically be initialised with the default configuration + * options when the DataTable is created. + * * Using the `responsive` option in the DataTables configuration options. This + * can also be used to specify the configuration options, or simply set to + * `true` to use the defaults. + * + * @class + * @param {object} settings DataTables settings object for the host table + * @param {object} [opts] Configuration options + * @requires jQuery 1.7+ + * @requires DataTables 1.10.1+ + * + * @example + * $('#example').DataTable( { + * responsive: true + * } ); + * } ); + */ +var Responsive = function ( settings, opts ) { + // Sanity check that we are using DataTables 1.10 or newer + if ( ! DataTable.versionCheck || ! DataTable.versionCheck( '1.10.1' ) ) { + throw 'DataTables Responsive requires DataTables 1.10.1 or newer'; + } + + this.s = { + dt: new DataTable.Api( settings ), + columns: [] + }; + + // Check if responsive has already been initialised on this table + if ( this.s.dt.settings()[0].responsive ) { + return; + } + + // details is an object, but for simplicity the user can give it as a string + if ( opts && typeof opts.details === 'string' ) { + opts.details = { type: opts.details }; + } + + this.c = $.extend( true, {}, Responsive.defaults, DataTable.defaults.responsive, opts ); + settings.responsive = this; + this._constructor(); +}; + +Responsive.prototype = { + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Constructor + */ + + /** + * Initialise the Responsive instance + * + * @private + */ + _constructor: function () + { + var that = this; + var dt = this.s.dt; + + dt.settings()[0]._responsive = this; + + // Use DataTables' private throttle function to avoid processor thrashing + $(window).on( 'resize.dtr orientationchange.dtr', dt.settings()[0].oApi._fnThrottle( function () { + that._resize(); + } ) ); + + // Destroy event handler + dt.on( 'destroy.dtr', function () { + $(window).off( 'resize.dtr orientationchange.dtr draw.dtr' ); + } ); + + // Reorder the breakpoints array here in case they have been added out + // of order + this.c.breakpoints.sort( function (a, b) { + return a.width < b.width ? 1 : + a.width > b.width ? -1 : 0; + } ); + + // Determine which columns are already hidden, and should therefore + // remain hidden. todo - should this be done? See thread 22677 + // + // this.s.alwaysHidden = dt.columns(':hidden').indexes(); + + this._classLogic(); + this._resizeAuto(); + + // Details handler + var details = this.c.details; + if ( details.type ) { + that._detailsInit(); + this._detailsVis(); + + dt.on( 'column-visibility.dtr', function () { + that._detailsVis(); + } ); + + // Redraw the details box on each draw. This is used until + // DataTables implements a native `updated` event for rows + dt.on( 'draw.dtr', function () { + dt.rows( {page: 'current'} ).iterator( 'row', function ( settings, idx ) { + var row = dt.row( idx ); + + if ( row.child.isShown() ) { + var info = that.c.details.renderer( dt, idx ); + row.child( info, 'child' ).show(); + } + } ); + } ); + + $(dt.table().node()).addClass( 'dtr-'+details.type ); + } + + // First pass - draw the table for the current viewport size + this._resize(); + }, + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Private methods + */ + + /** + * Calculate the visibility for the columns in a table for a given + * breakpoint. The result is pre-determined based on the class logic if + * class names are used to control all columns, but the width of the table + * is also used if there are columns which are to be automatically shown + * and hidden. + * + * @param {string} breakpoint Breakpoint name to use for the calculation + * @return {array} Array of boolean values initiating the visibility of each + * column. + * @private + */ + _columnsVisiblity: function ( breakpoint ) + { + var dt = this.s.dt; + var columns = this.s.columns; + var i, ien; + + // Class logic - determine which columns are in this breakpoint based + // on the classes. If no class control (i.e. `auto`) then `-` is used + // to indicate this to the rest of the function + var display = $.map( columns, function ( col ) { + return col.auto && col.minWidth === null ? + false : + col.auto === true ? + '-' : + $.inArray( breakpoint, col.includeIn ) !== -1; + } ); + + // Auto column control - first pass: how much width is taken by the + // ones that must be included from the non-auto columns + var requiredWidth = 0; + for ( i=0, ien=display.length ; i<ien ; i++ ) { + if ( display[i] === true ) { + requiredWidth += columns[i].minWidth; + } + } + + // Second pass, use up any remaining width for other columns. For + // scrolling tables we need to subtract the width of the scrollbar. It + // may not be requires which makes this sub-optimal, but it would + // require another full redraw to make complete use of those extra few + // pixels + var scrolling = dt.settings()[0].oScroll; + var bar = scrolling.sY || scrolling.sX ? scrolling.iBarWidth : 0; + var widthAvailable = dt.table().container().offsetWidth - bar; + var usedWidth = widthAvailable - requiredWidth; + + // Control column needs to always be included. This makes it sub- + // optimal in terms of using the available with, but to stop layout + // thrashing or overflow. Also we need to account for the control column + // width first so we know how much width is available for the other + // columns, since the control column might not be the first one shown + for ( i=0, ien=display.length ; i<ien ; i++ ) { + if ( columns[i].control ) { + usedWidth -= columns[i].minWidth; + } + } + + // Allow columns to be shown (counting from the left) until we run out + // of room + var empty = false; + for ( i=0, ien=display.length ; i<ien ; i++ ) { + if ( display[i] === '-' && ! columns[i].control ) { + // Once we've found a column that won't fit we don't let any + // others display either, or columns might disappear in the + // middle of the table + if ( empty || usedWidth - columns[i].minWidth < 0 ) { + empty = true; + display[i] = false; + } + else { + display[i] = true; + } + + usedWidth -= columns[i].minWidth; + } + } + + // Determine if the 'control' column should be shown (if there is one). + // This is the case when there is a hidden column (that is not the + // control column). The two loops look inefficient here, but they are + // trivial and will fly through. We need to know the outcome from the + // first , before the action in the second can be taken + var showControl = false; + + for ( i=0, ien=columns.length ; i<ien ; i++ ) { + if ( ! columns[i].control && ! columns[i].never && ! display[i] ) { + showControl = true; + break; + } + } + + for ( i=0, ien=columns.length ; i<ien ; i++ ) { + if ( columns[i].control ) { + display[i] = showControl; + } + } + + // Finally we need to make sure that there is at least one column that + // is visible + if ( $.inArray( true, display ) === -1 ) { + display[0] = true; + } + + return display; + }, + + + /** + * Create the internal `columns` array with information about the columns + * for the table. This includes determining which breakpoints the column + * will appear in, based upon class names in the column, which makes up the + * vast majority of this method. + * + * @private + */ + _classLogic: function () + { + var that = this; + var calc = {}; + var breakpoints = this.c.breakpoints; + var columns = this.s.dt.columns().eq(0).map( function (i) { + var className = this.column(i).header().className; + + return { + className: className, + includeIn: [], + auto: false, + control: false, + never: className.match(/\bnever\b/) ? true : false + }; + } ); + + // Simply add a breakpoint to `includeIn` array, ensuring that there are + // no duplicates + var add = function ( colIdx, name ) { + var includeIn = columns[ colIdx ].includeIn; + + if ( $.inArray( name, includeIn ) === -1 ) { + includeIn.push( name ); + } + }; + + var column = function ( colIdx, name, operator, matched ) { + var size, i, ien; + + if ( ! operator ) { + columns[ colIdx ].includeIn.push( name ); + } + else if ( operator === 'max-' ) { + // Add this breakpoint and all smaller + size = that._find( name ).width; + + for ( i=0, ien=breakpoints.length ; i<ien ; i++ ) { + if ( breakpoints[i].width <= size ) { + add( colIdx, breakpoints[i].name ); + } + } + } + else if ( operator === 'min-' ) { + // Add this breakpoint and all larger + size = that._find( name ).width; + + for ( i=0, ien=breakpoints.length ; i<ien ; i++ ) { + if ( breakpoints[i].width >= size ) { + add( colIdx, breakpoints[i].name ); + } + } + } + else if ( operator === 'not-' ) { + // Add all but this breakpoint (xxx need extra information) + + for ( i=0, ien=breakpoints.length ; i<ien ; i++ ) { + if ( breakpoints[i].name.indexOf( matched ) === -1 ) { + add( colIdx, breakpoints[i].name ); + } + } + } + }; + + // Loop over each column and determine if it has a responsive control + // class + columns.each( function ( col, i ) { + var classNames = col.className.split(' '); + var hasClass = false; + + // Split the class name up so multiple rules can be applied if needed + for ( var k=0, ken=classNames.length ; k<ken ; k++ ) { + var className = $.trim( classNames[k] ); + + if ( className === 'all' ) { + // Include in all + hasClass = true; + col.includeIn = $.map( breakpoints, function (a) { + return a.name; + } ); + return; + } + else if ( className === 'none' || className === 'never' ) { + // Include in none (default) and no auto + hasClass = true; + return; + } + else if ( className === 'control' ) { + // Special column that is only visible, when one of the other + // columns is hidden. This is used for the details control + hasClass = true; + col.control = true; + return; + } + + $.each( breakpoints, function ( j, breakpoint ) { + // Does this column have a class that matches this breakpoint? + var brokenPoint = breakpoint.name.split('-'); + var re = new RegExp( '(min\\-|max\\-|not\\-)?('+brokenPoint[0]+')(\\-[_a-zA-Z0-9])?' ); + var match = className.match( re ); + + if ( match ) { + hasClass = true; + + if ( match[2] === brokenPoint[0] && match[3] === '-'+brokenPoint[1] ) { + // Class name matches breakpoint name fully + column( i, breakpoint.name, match[1], match[2]+match[3] ); + } + else if ( match[2] === brokenPoint[0] && ! match[3] ) { + // Class name matched primary breakpoint name with no qualifier + column( i, breakpoint.name, match[1], match[2] ); + } + } + } ); + } + + // If there was no control class, then automatic sizing is used + if ( ! hasClass ) { + col.auto = true; + } + } ); + + this.s.columns = columns; + }, + + + /** + * Initialisation for the details handler + * + * @private + */ + _detailsInit: function () + { + var that = this; + var dt = this.s.dt; + var details = this.c.details; + + // The inline type always uses the first child as the target + if ( details.type === 'inline' ) { + details.target = 'td:first-child'; + } + + // type.target can be a string jQuery selector or a column index + var target = details.target; + var selector = typeof target === 'string' ? target : 'td'; + + // Click handler to show / hide the details rows when they are available + $( dt.table().body() ).on( 'click', selector, function (e) { + // If the table is not collapsed (i.e. there is no hidden columns) + // then take no action + if ( ! $(dt.table().node()).hasClass('collapsed' ) ) { + return; + } + + // Check that the row is actually a DataTable's controlled node + if ( ! dt.row( $(this).closest('tr') ).length ) { + return; + } + + // For column index, we determine if we should act or not in the + // handler - otherwise it is already okay + if ( typeof target === 'number' ) { + var targetIdx = target < 0 ? + dt.columns().eq(0).length + target : + target; + + if ( dt.cell( this ).index().column !== targetIdx ) { + return; + } + } + + // $().closest() includes itself in its check + var row = dt.row( $(this).closest('tr') ); + + if ( row.child.isShown() ) { + row.child( false ); + $( row.node() ).removeClass( 'parent' ); + } + else { + var info = that.c.details.renderer( dt, row[0] ); + row.child( info, 'child' ).show(); + $( row.node() ).addClass( 'parent' ); + } + } ); + }, + + + /** + * Update the child rows in the table whenever the column visibility changes + * + * @private + */ + _detailsVis: function () + { + var that = this; + var dt = this.s.dt; + + // Find how many columns are hidden + var hiddenColumns = dt.columns().indexes().filter( function ( idx ) { + var col = dt.column( idx ); + + if ( col.visible() ) { + return null; + } + + // Only counts as hidden if it doesn't have the `never` class + return $( col.header() ).hasClass( 'never' ) ? null : idx; + } ); + var haveHidden = true; + + if ( hiddenColumns.length === 0 || ( hiddenColumns.length === 1 && this.s.columns[ hiddenColumns[0] ].control ) ) { + haveHidden = false; + } + + if ( haveHidden ) { + // Show all existing child rows + dt.rows( { page: 'current' } ).eq(0).each( function (idx) { + var row = dt.row( idx ); + + if ( row.child() ) { + var info = that.c.details.renderer( dt, row[0] ); + + // The renderer can return false to have no child row + if ( info === false ) { + row.child.hide(); + } + else { + row.child( info, 'child' ).show(); + } + } + } ); + } + else { + // Hide all existing child rows + dt.rows( { page: 'current' } ).eq(0).each( function (idx) { + dt.row( idx ).child.hide(); + } ); + } + }, + + + /** + * Find a breakpoint object from a name + * @param {string} name Breakpoint name to find + * @return {object} Breakpoint description object + */ + _find: function ( name ) + { + var breakpoints = this.c.breakpoints; + + for ( var i=0, ien=breakpoints.length ; i<ien ; i++ ) { + if ( breakpoints[i].name === name ) { + return breakpoints[i]; + } + } + }, + + + /** + * Alter the table display for a resized viewport. This involves first + * determining what breakpoint the window currently is in, getting the + * column visibilities to apply and then setting them. + * + * @private + */ + _resize: function () + { + var dt = this.s.dt; + var width = $(window).width(); + var breakpoints = this.c.breakpoints; + var breakpoint = breakpoints[0].name; + var columns = this.s.columns; + var i, ien; + + // Determine what breakpoint we are currently at + for ( i=breakpoints.length-1 ; i>=0 ; i-- ) { + if ( width <= breakpoints[i].width ) { + breakpoint = breakpoints[i].name; + break; + } + } + + // Show the columns for that break point + var columnsVis = this._columnsVisiblity( breakpoint ); + + // Set the class before the column visibility is changed so event + // listeners know what the state is. Need to determine if there are + // any columns that are not visible but can be shown + var collapsedClass = false; + for ( i=0, ien=columns.length ; i<ien ; i++ ) { + if ( columnsVis[i] === false && ! columns[i].never ) { + collapsedClass = true; + break; + } + } + + $( dt.table().node() ).toggleClass('collapsed', collapsedClass ); + + dt.columns().eq(0).each( function ( colIdx, i ) { + dt.column( colIdx ).visible( columnsVis[i] ); + } ); + }, + + + /** + * Determine the width of each column in the table so the auto column hiding + * has that information to work with. This method is never going to be 100% + * perfect since column widths can change slightly per page, but without + * seriously compromising performance this is quite effective. + * + * @private + */ + _resizeAuto: function () + { + var dt = this.s.dt; + var columns = this.s.columns; + + // Are we allowed to do auto sizing? + if ( ! this.c.auto ) { + return; + } + + // Are there any columns that actually need auto-sizing, or do they all + // have classes defined + if ( $.inArray( true, $.map( columns, function (c) { return c.auto; } ) ) === -1 ) { + return; + } + + // Clone the table with the current data in it + var tableWidth = dt.table().node().offsetWidth; + var columnWidths = dt.columns; + var clonedTable = dt.table().node().cloneNode( false ); + var clonedHeader = $( dt.table().header().cloneNode( false ) ).appendTo( clonedTable ); + var clonedBody = $( dt.table().body().cloneNode( false ) ).appendTo( clonedTable ); + + $( dt.table().footer() ).clone( false ).appendTo( clonedTable ); + + // This is a bit slow, but we need to get a clone of each row that + // includes all columns. As such, try to do this as little as possible. + dt.rows( { page: 'current' } ).indexes().flatten().each( function ( idx ) { + var clone = dt.row( idx ).node().cloneNode( true ); + + if ( dt.columns( ':hidden' ).flatten().length ) { + $(clone).append( dt.cells( idx, ':hidden' ).nodes().to$().clone() ); + } + + $(clone).appendTo( clonedBody ); + } ); + + var cells = dt.columns().header().to$().clone( false ); + $('<tr/>') + .append( cells ) + .appendTo( clonedHeader ); + + // In the inline case extra padding is applied to the first column to + // give space for the show / hide icon. We need to use this in the + // calculation + if ( this.c.details.type === 'inline' ) { + $(clonedTable).addClass( 'dtr-inline collapsed' ); + } + + var inserted = $('<div/>') + .css( { + width: 1, + height: 1, + overflow: 'hidden' + } ) + .append( clonedTable ); + + // Remove columns which are not to be included + inserted.find('th.never, td.never').remove(); + + inserted.insertBefore( dt.table().node() ); + + // The cloned header now contains the smallest that each column can be + dt.columns().eq(0).each( function ( idx ) { + columns[idx].minWidth = cells[ idx ].offsetWidth || 0; + } ); + + inserted.remove(); + } +}; + + +/** + * List of default breakpoints. Each item in the array is an object with two + * properties: + * + * * `name` - the breakpoint name. + * * `width` - the breakpoint width + * + * @name Responsive.breakpoints + * @static + */ +Responsive.breakpoints = [ + { name: 'desktop', width: Infinity }, + { name: 'tablet-l', width: 1024 }, + { name: 'tablet-p', width: 768 }, + { name: 'mobile-l', width: 480 }, + { name: 'mobile-p', width: 320 } +]; + + +/** + * Responsive default settings for initialisation + * + * @namespace + * @name Responsive.defaults + * @static + */ +Responsive.defaults = { + /** + * List of breakpoints for the instance. Note that this means that each + * instance can have its own breakpoints. Additionally, the breakpoints + * cannot be changed once an instance has been creased. + * + * @type {Array} + * @default Takes the value of `Responsive.breakpoints` + */ + breakpoints: Responsive.breakpoints, + + /** + * Enable / disable auto hiding calculations. It can help to increase + * performance slightly if you disable this option, but all columns would + * need to have breakpoint classes assigned to them + * + * @type {Boolean} + * @default `true` + */ + auto: true, + + /** + * Details control. If given as a string value, the `type` property of the + * default object is set to that value, and the defaults used for the rest + * of the object - this is for ease of implementation. + * + * The object consists of the following properties: + * + * * `renderer` - function that is called for display of the child row data. + * The default function will show the data from the hidden columns + * * `target` - Used as the selector for what objects to attach the child + * open / close to + * * `type` - `false` to disable the details display, `inline` or `column` + * for the two control types + * + * @type {Object|string} + */ + details: { + renderer: function ( api, rowIdx ) { + var data = api.cells( rowIdx, ':hidden' ).eq(0).map( function ( cell ) { + var header = $( api.column( cell.column ).header() ); + var idx = api.cell( cell ).index(); + + if ( header.hasClass( 'control' ) || header.hasClass( 'never' ) ) { + return ''; + } + + // Use a non-public DT API method to render the data for display + // This needs to be updated when DT adds a suitable method for + // this type of data retrieval + var dtPrivate = api.settings()[0]; + var cellData = dtPrivate.oApi._fnGetCellData( + dtPrivate, idx.row, idx.column, 'display' + ); + var title = header.text(); + if ( title ) { + title = title + ':'; + } + + return '<li data-dtr-index="'+idx.column+'">'+ + '<span class="dtr-title">'+ + title+ + '</span> '+ + '<span class="dtr-data">'+ + cellData+ + '</span>'+ + '</li>'; + } ).toArray().join(''); + + return data ? + $('<ul data-dtr-index="'+rowIdx+'"/>').append( data ) : + false; + }, + + target: 0, + + type: 'inline' + } +}; + + +/* + * API + */ +var Api = $.fn.dataTable.Api; + +// Doesn't do anything - work around for a bug in DT... Not documented +Api.register( 'responsive()', function () { + return this; +} ); + +Api.register( 'responsive.index()', function ( li ) { + li = $(li); + + return { + column: li.data('dtr-index'), + row: li.parent().data('dtr-index') + }; +} ); + +Api.register( 'responsive.rebuild()', function () { + return this.iterator( 'table', function ( ctx ) { + if ( ctx._responsive ) { + ctx._responsive._classLogic(); + } + } ); +} ); + +Api.register( 'responsive.recalc()', function () { + return this.iterator( 'table', function ( ctx ) { + if ( ctx._responsive ) { + ctx._responsive._resizeAuto(); + ctx._responsive._resize(); + } + } ); +} ); + + +/** + * Version information + * + * @name Responsive.version + * @static + */ +Responsive.version = '1.0.6'; + + +$.fn.dataTable.Responsive = Responsive; +$.fn.DataTable.Responsive = Responsive; + +// Attach a listener to the document which listens for DataTables initialisation +// events so we can automatically initialise +$(document).on( 'init.dt.dtr', function (e, settings, json) { + if ( e.namespace !== 'dt' ) { + return; + } + + if ( $(settings.nTable).hasClass( 'responsive' ) || + $(settings.nTable).hasClass( 'dt-responsive' ) || + settings.oInit.responsive || + DataTable.defaults.responsive + ) { + var init = settings.oInit.responsive; + + if ( init !== false ) { + new Responsive( settings, $.isPlainObject( init ) ? init : {} ); + } + } +} ); + +return Responsive; +}; // /factory + + +// Define as an AMD module if possible +if ( typeof define === 'function' && define.amd ) { + define( ['jquery', 'datatables'], factory ); +} +else if ( typeof exports === 'object' ) { + // Node/CommonJS + factory( require('jquery'), require('datatables') ); +} +else if ( jQuery && !jQuery.fn.dataTable.Responsive ) { + // Otherwise simply initialise as normal, stopping multiple evaluation + factory( jQuery, jQuery.fn.dataTable ); +} + + +})(window, document); diff --git a/theme/bootstrap/plugins/datatables/extensions/Responsive/js/dataTables.responsive.min.js b/theme/bootstrap/plugins/datatables/extensions/Responsive/js/dataTables.responsive.min.js new file mode 100644 index 0000000..1142b80 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Responsive/js/dataTables.responsive.min.js @@ -0,0 +1,19 @@ +/*! + Responsive 1.0.6 + 2014-2015 SpryMedia Ltd - datatables.net/license +*/ +(function(n,p){var o=function(e,k){var h=function(d,a){if(!k.versionCheck||!k.versionCheck("1.10.1"))throw"DataTables Responsive requires DataTables 1.10.1 or newer";this.s={dt:new k.Api(d),columns:[]};this.s.dt.settings()[0].responsive||(a&&"string"===typeof a.details&&(a.details={type:a.details}),this.c=e.extend(!0,{},h.defaults,k.defaults.responsive,a),d.responsive=this,this._constructor())};h.prototype={_constructor:function(){var d=this,a=this.s.dt;a.settings()[0]._responsive=this;e(n).on("resize.dtr orientationchange.dtr", +a.settings()[0].oApi._fnThrottle(function(){d._resize()}));a.on("destroy.dtr",function(){e(n).off("resize.dtr orientationchange.dtr draw.dtr")});this.c.breakpoints.sort(function(a,c){return a.width<c.width?1:a.width>c.width?-1:0});this._classLogic();this._resizeAuto();var c=this.c.details;c.type&&(d._detailsInit(),this._detailsVis(),a.on("column-visibility.dtr",function(){d._detailsVis()}),a.on("draw.dtr",function(){a.rows({page:"current"}).iterator("row",function(b,c){var f=a.row(c);if(f.child.isShown()){var i= +d.c.details.renderer(a,c);f.child(i,"child").show()}})}),e(a.table().node()).addClass("dtr-"+c.type));this._resize()},_columnsVisiblity:function(d){var a=this.s.dt,c=this.s.columns,b,g,f=e.map(c,function(a){return a.auto&&null===a.minWidth?!1:!0===a.auto?"-":-1!==e.inArray(d,a.includeIn)}),i=0;b=0;for(g=f.length;b<g;b++)!0===f[b]&&(i+=c[b].minWidth);b=a.settings()[0].oScroll;b=b.sY||b.sX?b.iBarWidth:0;a=a.table().container().offsetWidth-b-i;b=0;for(g=f.length;b<g;b++)c[b].control&&(a-=c[b].minWidth); +i=!1;b=0;for(g=f.length;b<g;b++)"-"===f[b]&&!c[b].control&&(i||0>a-c[b].minWidth?(i=!0,f[b]=!1):f[b]=!0,a-=c[b].minWidth);a=!1;b=0;for(g=c.length;b<g;b++)if(!c[b].control&&!c[b].never&&!f[b]){a=!0;break}b=0;for(g=c.length;b<g;b++)c[b].control&&(f[b]=a);-1===e.inArray(!0,f)&&(f[0]=!0);return f},_classLogic:function(){var d=this,a=this.c.breakpoints,c=this.s.dt.columns().eq(0).map(function(a){a=this.column(a).header().className;return{className:a,includeIn:[],auto:!1,control:!1,never:a.match(/\bnever\b/)? +!0:!1}}),b=function(a,b){var d=c[a].includeIn;-1===e.inArray(b,d)&&d.push(b)},g=function(f,g,e,j){if(e)if("max-"===e){j=d._find(g).width;g=0;for(e=a.length;g<e;g++)a[g].width<=j&&b(f,a[g].name)}else if("min-"===e){j=d._find(g).width;g=0;for(e=a.length;g<e;g++)a[g].width>=j&&b(f,a[g].name)}else{if("not-"===e){g=0;for(e=a.length;g<e;g++)-1===a[g].name.indexOf(j)&&b(f,a[g].name)}}else c[f].includeIn.push(g)};c.each(function(b,c){for(var d=b.className.split(" "),j=!1,h=0,k=d.length;h<k;h++){var l=e.trim(d[h]); +if("all"===l){j=!0;b.includeIn=e.map(a,function(a){return a.name});return}if("none"===l||"never"===l){j=!0;return}if("control"===l){j=!0;b.control=!0;return}e.each(a,function(a,b){var d=b.name.split("-"),e=l.match(RegExp("(min\\-|max\\-|not\\-)?("+d[0]+")(\\-[_a-zA-Z0-9])?"));e&&(j=!0,e[2]===d[0]&&e[3]==="-"+d[1]?g(c,b.name,e[1],e[2]+e[3]):e[2]===d[0]&&!e[3]&&g(c,b.name,e[1],e[2]))})}j||(b.auto=!0)});this.s.columns=c},_detailsInit:function(){var d=this,a=this.s.dt,c=this.c.details;"inline"===c.type&& +(c.target="td:first-child");var b=c.target;e(a.table().body()).on("click","string"===typeof b?b:"td",function(){if(e(a.table().node()).hasClass("collapsed")&&a.row(e(this).closest("tr")).length){if(typeof b==="number"){var c=b<0?a.columns().eq(0).length+b:b;if(a.cell(this).index().column!==c)return}c=a.row(e(this).closest("tr"));if(c.child.isShown()){c.child(false);e(c.node()).removeClass("parent")}else{var f=d.c.details.renderer(a,c[0]);c.child(f,"child").show();e(c.node()).addClass("parent")}}})}, +_detailsVis:function(){var d=this,a=this.s.dt,c=a.columns().indexes().filter(function(b){var c=a.column(b);return c.visible()?null:e(c.header()).hasClass("never")?null:b}),b=!0;if(0===c.length||1===c.length&&this.s.columns[c[0]].control)b=!1;b?a.rows({page:"current"}).eq(0).each(function(b){b=a.row(b);if(b.child()){var c=d.c.details.renderer(a,b[0]);!1===c?b.child.hide():b.child(c,"child").show()}}):a.rows({page:"current"}).eq(0).each(function(b){a.row(b).child.hide()})},_find:function(d){for(var a= +this.c.breakpoints,c=0,b=a.length;c<b;c++)if(a[c].name===d)return a[c]},_resize:function(){var d=this.s.dt,a=e(n).width(),c=this.c.breakpoints,b=c[0].name,g=this.s.columns,f;for(f=c.length-1;0<=f;f--)if(a<=c[f].width){b=c[f].name;break}var i=this._columnsVisiblity(b),c=!1;f=0;for(a=g.length;f<a;f++)if(!1===i[f]&&!g[f].never){c=!0;break}e(d.table().node()).toggleClass("collapsed",c);d.columns().eq(0).each(function(a,b){d.column(a).visible(i[b])})},_resizeAuto:function(){var d=this.s.dt,a=this.s.columns; +if(this.c.auto&&-1!==e.inArray(!0,e.map(a,function(a){return a.auto}))){d.table().node();var c=d.table().node().cloneNode(!1),b=e(d.table().header().cloneNode(!1)).appendTo(c),g=e(d.table().body().cloneNode(!1)).appendTo(c);e(d.table().footer()).clone(!1).appendTo(c);d.rows({page:"current"}).indexes().flatten().each(function(a){var b=d.row(a).node().cloneNode(!0);d.columns(":hidden").flatten().length&&e(b).append(d.cells(a,":hidden").nodes().to$().clone());e(b).appendTo(g)});var f=d.columns().header().to$().clone(!1); +e("<tr/>").append(f).appendTo(b);"inline"===this.c.details.type&&e(c).addClass("dtr-inline collapsed");c=e("<div/>").css({width:1,height:1,overflow:"hidden"}).append(c);c.find("th.never, td.never").remove();c.insertBefore(d.table().node());d.columns().eq(0).each(function(b){a[b].minWidth=f[b].offsetWidth||0});c.remove()}}};h.breakpoints=[{name:"desktop",width:Infinity},{name:"tablet-l",width:1024},{name:"tablet-p",width:768},{name:"mobile-l",width:480},{name:"mobile-p",width:320}];h.defaults={breakpoints:h.breakpoints, +auto:!0,details:{renderer:function(d,a){var c=d.cells(a,":hidden").eq(0).map(function(a){var c=e(d.column(a.column).header()),a=d.cell(a).index();if(c.hasClass("control")||c.hasClass("never"))return"";var f=d.settings()[0],f=f.oApi._fnGetCellData(f,a.row,a.column,"display");(c=c.text())&&(c+=":");return'<li data-dtr-index="'+a.column+'"><span class="dtr-title">'+c+'</span> <span class="dtr-data">'+f+"</span></li>"}).toArray().join("");return c?e('<ul data-dtr-index="'+a+'"/>').append(c):!1},target:0, +type:"inline"}};var m=e.fn.dataTable.Api;m.register("responsive()",function(){return this});m.register("responsive.index()",function(d){d=e(d);return{column:d.data("dtr-index"),row:d.parent().data("dtr-index")}});m.register("responsive.rebuild()",function(){return this.iterator("table",function(d){d._responsive&&d._responsive._classLogic()})});m.register("responsive.recalc()",function(){return this.iterator("table",function(d){d._responsive&&(d._responsive._resizeAuto(),d._responsive._resize())})}); +h.version="1.0.6";e.fn.dataTable.Responsive=h;e.fn.DataTable.Responsive=h;e(p).on("init.dt.dtr",function(d,a){if("dt"===d.namespace&&(e(a.nTable).hasClass("responsive")||e(a.nTable).hasClass("dt-responsive")||a.oInit.responsive||k.defaults.responsive)){var c=a.oInit.responsive;!1!==c&&new h(a,e.isPlainObject(c)?c:{})}});return h};"function"===typeof define&&define.amd?define(["jquery","datatables"],o):"object"===typeof exports?o(require("jquery"),require("datatables")):jQuery&&!jQuery.fn.dataTable.Responsive&& +o(jQuery,jQuery.fn.dataTable)})(window,document); diff --git a/theme/bootstrap/plugins/datatables/extensions/Scroller/Readme.txt b/theme/bootstrap/plugins/datatables/extensions/Scroller/Readme.txt new file mode 100644 index 0000000..d262eaf --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Scroller/Readme.txt @@ -0,0 +1,43 @@ +# Scroller + +Scroller is a virtual rendering plug-in for DataTables which allows large datasets to be drawn on screen every quickly. What the virtual rendering means is that only the visible portion of the table (and a bit to either side to make the scrolling smooth) is drawn, while the scrolling container gives the visual impression that the whole table is visible. This is done by making use of the pagination abilities of DataTables and moving the table around in the scrolling container DataTables adds to the page. The scrolling container is forced to the height it would be for the full table display using an extra element. + +Key features include: + +* Speed! The aim of Scroller for DataTables is to make rendering large data sets fast +* Full compatibility with DataTables' deferred rendering for maximum speed +* Integration with state saving in DataTables (scrolling position is saved) +* Support for scrolling with millions of rows +* Easy to use + + +# Installation + +To use Scroller, first download DataTables ( http://datatables.net/download ) and place the unzipped Scroller package into a `extensions` directory in the DataTables package. This will allow the pages in the examples to operate correctly. To see the examples running, open the `examples` directory in your web-browser. + + +# Basic usage + +Scroller is initialised by simply including the letter `dt-string S` in the `dt-init dom` for the table you want to have this feature enabled on. Note that the `dt-string S` must come after the `dt-string t` parameter in `dom`. For example: + +```js +$(document).ready( function () { + $('#example').DataTable( { + dom: 'lfrtipS' + } ); +} ); +``` + +Note that rows in the table must all be the same height. Information in a cell which expands on to multiple lines will cause some odd behaviour in the scrolling. Additionally, the table's `cellspacing` parameter must be set to 0, again to ensure the information display is correct. + + +# Documentation / support + +* Documentation: http://datatables.net/extensions/scroller/ +* DataTables support forums: http://datatables.net/forums + + +# GitHub + +If you fancy getting involved with the development of Scroller and help make it better, please refer to its GitHub repo: https://github.com/DataTables/Scroller + diff --git a/theme/bootstrap/plugins/datatables/extensions/Scroller/css/dataTables.scroller.css b/theme/bootstrap/plugins/datatables/extensions/Scroller/css/dataTables.scroller.css new file mode 100644 index 0000000..4bbaa57 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Scroller/css/dataTables.scroller.css @@ -0,0 +1,44 @@ + +/* + * Namespace: DTS (DataTables Scroller) + */ + +div.DTS tbody th, +div.DTS tbody td { + white-space: nowrap; +} + +div.DTS tbody tr.even { + background-color: white; +} + +div.DTS div.DTS_Loading { + position: absolute; + top: 50%; + left: 50%; + width: 200px; + height: 20px; + margin-top: -20px; + margin-left: -100px; + z-index: 1; + + border: 1px solid #999; + padding: 20px 0; + text-align: center; + background-color: white; + background-color: rgba(255, 255, 255, 0.5); +} + +div.DTS div.dataTables_scrollHead, +div.DTS div.dataTables_scrollFoot { + background-color: white; +} + +div.DTS div.dataTables_scrollBody { + z-index: 2; +} + +div.DTS div.dataTables_scroll { + background: url('../images/loading-background.png') repeat 0 0; +} + diff --git a/theme/bootstrap/plugins/datatables/extensions/Scroller/css/dataTables.scroller.min.css b/theme/bootstrap/plugins/datatables/extensions/Scroller/css/dataTables.scroller.min.css new file mode 100644 index 0000000..499b85d --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Scroller/css/dataTables.scroller.min.css @@ -0,0 +1 @@ +div.DTS tbody th,div.DTS tbody td{white-space:nowrap}div.DTS tbody tr.even{background-color:white}div.DTS div.DTS_Loading{position:absolute;top:50%;left:50%;width:200px;height:20px;margin-top:-20px;margin-left:-100px;z-index:1;border:1px solid #999;padding:20px 0;text-align:center;background-color:white;background-color:rgba(255,255,255,0.5)}div.DTS div.dataTables_scrollHead,div.DTS div.dataTables_scrollFoot{background-color:white}div.DTS div.dataTables_scrollBody{z-index:2}div.DTS div.dataTables_scroll{background:url("../images/loading-background.png") repeat 0 0} diff --git a/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/api_scrolling.html b/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/api_scrolling.html new file mode 100644 index 0000000..1653d21 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/api_scrolling.html @@ -0,0 +1,174 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Scroller example - API</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.scroller.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.scroller.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + ajax: "data/2500.txt", + deferRender: true, + dom: "frtiS", + scrollY: 200, + scrollCollapse: true, + initComplete: function () { + var api = this.api(); + api.scroller().scrollToRow( 1000 ); + } + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Scroller example <span>API</span></h1> + + <div class="info"> + <p>This example shows a trivial use of the API methods that Scroller adds to the DataTables API to + scroll to a row once the table's data has been loaded. In this case + <code>scroller().scrollToRow()</code> is used to jump to row 1000.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>ID</th> + <th>First name</th> + <th>Last name</th> + <th>ZIP / Post code</th> + <th>Country</th> + </tr> + </thead> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this + example:</p><code class="multiline brush: js;">$(document).ready(function() { + $('#example').DataTable( { + ajax: &quot;data/2500.txt&quot;, + deferRender: true, + dom: &quot;frtiS&quot;, + scrollY: 200, + scrollCollapse: true, + initComplete: function () { + var api = this.api(); + api.scroller().scrollToRow( 1000 ); + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this + example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href= + "../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.scroller.js">../js/dataTables.scroller.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:</p><code class="multiline brush: js;"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the + table:</p> + + <ul> + <li><a href= + "../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.scroller.css">../css/dataTables.scroller.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using <a href="//datatables.net/manual/server-side">the protocol described in the + DataTables documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./state_saving.html">State saving</a></li> + <li><a href="./large_js_source.html">Client-side data source (50,000 rows)</a></li> + <li><a href="./server-side_processing.html">Server-side processing (5,000,000 + rows)</a></li> + <li class="active"><a href="./api_scrolling.html">API</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/data/2500.txt b/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/data/2500.txt new file mode 100644 index 0000000..4e9f706 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/data/2500.txt @@ -0,0 +1,2502 @@ +{ "aaData": [ + [ "1", "Armand", "Warren", "56045", "Taiwan, Province of China" ], + [ "2", "Xenos", "Salas", "71090", "Liberia" ], + [ "3", "Virginia", "Whitaker", "62723", "Nicaragua" ], + [ "4", "Kato", "Patrick", "97662", "Palau" ], + [ "5", "Penelope", "Hensley", "76634", "Greenland" ], + [ "6", "Georgia", "Erickson", "81358", "Bolivia" ], + [ "7", "Shad", "Pena", "20600", "Palestinian Territory, Occupied" ], + [ "8", "Tanisha", "Humphrey", "93371", "Kenya" ], + [ "9", "Claire", "Espinoza", "I8S 2S8", "Panama" ], + [ "10", "Raya", "Tucker", "O8D 8W7", "Botswana" ], + [ "11", "Otto", "Briggs", "57590", "Anguilla" ], + [ "12", "Logan", "Burt", "53041", "Venezuela" ], + [ "13", "Cooper", "Pennington", "36994", "France" ], + [ "14", "Kristen", "Peterson", "52917", "Sao Tome and Principe" ], + [ "15", "Jordan", "Velasquez", "08884", "Switzerland" ], + [ "16", "Zelda", "Freeman", "F9H 1J9", "Holy See (Vatican City State)" ], + [ "17", "Mary", "Pacheco", "A7Y 6X9", "Niger" ], + [ "18", "Tiger", "Robles", "44533", "Malaysia" ], + [ "19", "Zelenia", "Buckner", "Q8N 6E5", "Malawi" ], + [ "20", "Coby", "Johnston", "N6I 2O9", "Rwanda" ], + [ "21", "Gillian", "Strickland", "12258", "Cook Islands" ], + [ "22", "Alfreda", "Mcbride", "K5A 3B6", "Nigeria" ], + [ "23", "Laith", "Ford", "19072", "Czech Republic" ], + [ "24", "Autumn", "Barton", "U9D 9F4", "Angola" ], + [ "25", "Nadine", "Britt", "G4U 8L0", "Liechtenstein" ], + [ "26", "Xaviera", "Hart", "T1N 7D2", "Mali" ], + [ "27", "Neil", "Page", "T3E 9F4", "Korea" ], + [ "28", "Rose", "French", "B7T 8M2", "French Polynesia" ], + [ "29", "Alyssa", "Poole", "S1L 2T5", "Yemen" ], + [ "30", "Chantale", "Lynch", "97316", "United States" ], + [ "31", "Jermaine", "Dawson", "A3H 7A1", "American Samoa" ], + [ "32", "Ann", "Giles", "54258", "Korea" ], + [ "33", "Jerry", "Carr", "04901", "South Georgia and The South Sandwich Islands" ], + [ "34", "Lionel", "Hooper", "67970", "Bahrain" ], + [ "35", "Alyssa", "Hewitt", "R3K 2V8", "Paraguay" ], + [ "36", "Lisandra", "Sheppard", "71886", "Seychelles" ], + [ "37", "Kylan", "Harrison", "96763", "Italy" ], + [ "38", "Kaitlin", "Montgomery", "V5K 5U8", "Niger" ], + [ "39", "Heidi", "Boyd", "B3C 8M9", "Papua New Guinea" ], + [ "40", "Rinah", "Case", "W7M 5K1", "Mali" ], + [ "41", "Thaddeus", "Maynard", "E4V 6W6", "Egypt" ], + [ "42", "Lacota", "Ray", "T3J 8D8", "United Kingdom" ], + [ "43", "Olympia", "Cortez", "F8C 7I5", "Palau" ], + [ "44", "Wendy", "Rojas", "N8T 4K6", "Cook Islands" ], + [ "45", "Arden", "Kelley", "V9N 2T6", "India" ], + [ "46", "Colorado", "Lindsey", "96703", "Chad" ], + [ "47", "Alika", "Weaver", "F6V 1I1", "Bulgaria" ], + [ "48", "Phoebe", "Mack", "E4B 1X2", "El Salvador" ], + [ "49", "Sybill", "Bridges", "Z2G 6A2", "Somalia" ], + [ "50", "Trevor", "Larsen", "K1R 3B9", "United Arab Emirates" ], + [ "51", "Maya", "Battle", "70881", "Australia" ], + [ "52", "Charity", "Walton", "I4I 5R9", "Swaziland" ], + [ "53", "Lane", "Sloan", "79076", "Nauru" ], + [ "54", "Christopher", "Watson", "35116", "Suriname" ], + [ "55", "Clementine", "Shelton", "98232", "Venezuela" ], + [ "56", "Basil", "Hood", "J9I 1R2", "Tonga" ], + [ "57", "Meghan", "Pacheco", "H5Z 6B1", "Dominican Republic" ], + [ "58", "Brennan", "Potts", "51743", "Turkey" ], + [ "59", "Lawrence", "Duran", "63266", "Uruguay" ], + [ "60", "Ina", "Head", "S8P 9J5", "Romania" ], + [ "61", "Castor", "Jacobson", "C9F 6C9", "Albania" ], + [ "62", "Daquan", "Holden", "38571", "Ireland" ], + [ "63", "Donna", "Valencia", "J7B 3I0", "Portugal" ], + [ "64", "Kessie", "Phelps", "61063", "Georgia" ], + [ "65", "Dillon", "Garcia", "13652", "Holy See (Vatican City State)" ], + [ "66", "Russell", "Sweeney", "T8P 2O6", "Saint Kitts and Nevis" ], + [ "67", "Zelda", "Berg", "84946", "Afghanistan" ], + [ "68", "Dexter", "Mann", "73596", "Thailand" ], + [ "69", "Maisie", "Miller", "X3M 6C1", "Seychelles" ], + [ "70", "Lynn", "Mitchell", "N5B 3Z9", "Wallis and Futuna" ], + [ "71", "Gay", "Medina", "66692", "Germany" ], + [ "72", "Olga", "Clark", "M6B 7B6", "Kuwait" ], + [ "73", "Brianna", "Obrien", "Z6Z 5R3", "Bahrain" ], + [ "74", "Daria", "Byers", "R9T 4N7", "Ghana" ], + [ "75", "Chiquita", "Barker", "28435", "Ireland" ], + [ "76", "Gray", "Salazar", "58618", "Chile" ], + [ "77", "Delilah", "Kirby", "42811", "Oman" ], + [ "78", "Xanthus", "Holland", "B8Q 9C4", "Antigua and Barbuda" ], + [ "79", "Reuben", "Brennan", "44693", "Czech Republic" ], + [ "80", "Alden", "Long", "94236", "Slovakia" ], + [ "81", "Blythe", "Bender", "04812", "Guam" ], + [ "82", "Aileen", "Burgess", "47942", "Djibouti" ], + [ "83", "Zeus", "Craig", "43002", "Nicaragua" ], + [ "84", "Jade", "Garza", "F2X 8F3", "New Zealand" ], + [ "85", "Noah", "Barrera", "K9C 8U0", "Malawi" ], + [ "86", "Quyn", "Robertson", "H3X 6J9", "Bosnia and Herzegovina" ], + [ "87", "Serena", "Cabrera", "83671", "Slovenia" ], + [ "88", "Charity", "Chase", "T9Q 7C4", "Solomon Islands" ], + [ "89", "Athena", "Grimes", "62801", "Aruba" ], + [ "90", "Mallory", "Middleton", "D2V 1M5", "Italy" ], + [ "91", "Xenos", "Jones", "46642", "Singapore" ], + [ "92", "Tate", "Gregory", "66538", "Zimbabwe" ], + [ "93", "Blaze", "Taylor", "70282", "Paraguay" ], + [ "94", "Jena", "Duncan", "63057", "Cambodia" ], + [ "95", "Thaddeus", "Chase", "66762", "Netherlands Antilles" ], + [ "96", "Guinevere", "Mcgee", "O9G 4S2", "Lebanon" ], + [ "97", "Kermit", "Ramsey", "41214", "Dominican Republic" ], + [ "98", "Josephine", "Gallagher", "04960", "French Southern Territories" ], + [ "99", "Amela", "Morales", "M9I 1X5", "Sudan" ], + [ "100", "Rina", "Yates", "G3T 7M9", "Dominica" ], + [ "101", "Orson", "Norris", "21660", "Sierra Leone" ], + [ "102", "Graiden", "Silva", "98191", "Saint Lucia" ], + [ "103", "Amaya", "Hood", "45779", "India" ], + [ "104", "Fatima", "Fitzpatrick", "I4R 9Q8", "Viet Nam" ], + [ "105", "Judith", "Stokes", "97596", "Sudan" ], + [ "106", "Jared", "Vaughn", "75521", "Benin" ], + [ "107", "Mira", "Morgan", "35169", "Martinique" ], + [ "108", "Walter", "Perkins", "28618", "San Marino" ], + [ "109", "Megan", "Maxwell", "K6X 3J4", "Oman" ], + [ "110", "Christine", "Christensen", "M7S 8G8", "Netherlands Antilles" ], + [ "111", "Tanner", "Guerra", "S3K 6Y5", "Finland" ], + [ "112", "Meghan", "Rowland", "K7U 3A1", "Rwanda" ], + [ "113", "Patrick", "Mitchell", "V3F 5C4", "Oman" ], + [ "114", "Jackson", "Sanders", "83229", "Greenland" ], + [ "115", "Omar", "Savage", "14082", "Korea" ], + [ "116", "Ulla", "Larsen", "Q2P 4L8", "French Southern Territories" ], + [ "117", "Hop", "Gates", "D9G 9J4", "Poland" ], + [ "118", "Astra", "Mendoza", "R3D 2H9", "Saint Vincent and The Grenadines" ], + [ "119", "Denise", "Cardenas", "73138", "Sao Tome and Principe" ], + [ "120", "Melodie", "Roberts", "L1G 4H2", "India" ], + [ "121", "Cedric", "Joseph", "M4V 8O9", "Korea, Republic of" ], + [ "122", "Linda", "Horn", "24465", "Bosnia and Herzegovina" ], + [ "123", "Mary", "Lyons", "22324", "Norfolk Island" ], + [ "124", "Ciara", "Mcknight", "30784", "Anguilla" ], + [ "125", "Vaughan", "Santiago", "65037", "Guyana" ], + [ "126", "Lamar", "Shepherd", "58040", "France" ], + [ "127", "Xavier", "Webster", "68321", "Afghanistan" ], + [ "128", "Ainsley", "Banks", "46902", "Pakistan" ], + [ "129", "Alika", "Love", "L5O 4B3", "Iran, Islamic Republic of" ], + [ "130", "Maite", "Dickson", "37405", "Saint Kitts and Nevis" ], + [ "131", "Kimberley", "Morrow", "F7C 7J0", "Lebanon" ], + [ "132", "Eugenia", "Stafford", "36282", "Nicaragua" ], + [ "133", "Mira", "Gill", "K1T 8U1", "Uruguay" ], + [ "134", "Herman", "Francis", "C2G 8G9", "Northern Mariana Islands" ], + [ "135", "Veronica", "Peters", "74146", "Cook Islands" ], + [ "136", "Axel", "Cochran", "32240", "Central African Republic" ], + [ "137", "Edan", "Howe", "51862", "Mali" ], + [ "138", "Ignacia", "Bruce", "Q8T 5Q1", "Sao Tome and Principe" ], + [ "139", "Jana", "Mcguire", "89412", "Czech Republic" ], + [ "140", "Alice", "Underwood", "74535", "Slovakia" ], + [ "141", "Tobias", "Kent", "33601", "South Georgia and The South Sandwich Islands" ], + [ "142", "Nasim", "Coleman", "19377", "United States Minor Outlying Islands" ], + [ "143", "Geoffrey", "Byers", "85753", "Netherlands Antilles" ], + [ "144", "Odette", "Sawyer", "55418", "Tunisia" ], + [ "145", "Chaney", "Flowers", "F4W 7O7", "Maldives" ], + [ "146", "Shelly", "Glover", "M5Y 4A6", "Taiwan, Province of China" ], + [ "147", "Uriel", "Thornton", "Z6Q 5B7", "Myanmar" ], + [ "148", "Clio", "Nicholson", "Y8S 7P2", "Martinique" ], + [ "149", "Jana", "Foley", "B1O 9J5", "United Arab Emirates" ], + [ "150", "Fulton", "Rasmussen", "39194", "Solomon Islands" ], + [ "151", "Lisandra", "Boyd", "J2Z 2V7", "French Guiana" ], + [ "152", "Brennan", "Lopez", "Q4M 7Y4", "Burkina Faso" ], + [ "153", "Martha", "Washington", "M7S 4U6", "Iran, Islamic Republic of" ], + [ "154", "Dara", "Ramos", "07799", "Portugal" ], + [ "155", "Virginia", "Harris", "01246", "Bermuda" ], + [ "156", "Maryam", "Patrick", "Y3J 4Y0", "Rwanda" ], + [ "157", "Shana", "Mullen", "61169", "Togo" ], + [ "158", "Rowan", "Hahn", "K6D 5T4", "Guinea-bissau" ], + [ "159", "Hermione", "Shepherd", "M4F 7T6", "Ireland" ], + [ "160", "Jada", "Bright", "P1Z 7E6", "French Southern Territories" ], + [ "161", "Scarlet", "Bray", "57161", "Austria" ], + [ "162", "Haviva", "Conner", "M4T 8O4", "Bermuda" ], + [ "163", "Myra", "Briggs", "Q4B 6L7", "Kenya" ], + [ "164", "Hall", "Floyd", "40411", "Bangladesh" ], + [ "165", "Kyle", "Marquez", "J4T 7C6", "Djibouti" ], + [ "166", "Claudia", "Long", "R7B 1T6", "Macedonia" ], + [ "167", "Hasad", "Clemons", "94009", "Bosnia and Herzegovina" ], + [ "168", "Kameko", "Reeves", "G4V 6D5", "Singapore" ], + [ "169", "Angelica", "Bailey", "Z3Y 7I0", "Micronesia" ], + [ "170", "Shelley", "Jennings", "O3A 9H0", "Christmas Island" ], + [ "171", "Rafael", "Randolph", "Y4L 8B5", "Germany" ], + [ "172", "Winter", "Kinney", "A3K 9A7", "Saint Lucia" ], + [ "173", "Brian", "Larsen", "53752", "Comoros" ], + [ "174", "Melvin", "Cooper", "72416", "Czech Republic" ], + [ "175", "Gil", "Valencia", "95798", "Uganda" ], + [ "176", "Uma", "Cummings", "84649", "Jordan" ], + [ "177", "Micah", "Shannon", "H9L 8R6", "Ghana" ], + [ "178", "Ahmed", "Weiss", "05291", "American Samoa" ], + [ "179", "Hop", "Foster", "W9C 7J7", "Panama" ], + [ "180", "Todd", "Barnett", "T9R 7J4", "Seychelles" ], + [ "181", "Byron", "Meyers", "J4G 9P2", "Congo" ], + [ "182", "Hadassah", "Barnett", "U1A 8V3", "Paraguay" ], + [ "183", "Hermione", "Luna", "L4G 2E5", "New Zealand" ], + [ "184", "Marsden", "Alvarado", "U1V 1Y4", "Aruba" ], + [ "185", "Britanni", "Gregory", "C8O 2T4", "Kazakhstan" ], + [ "186", "Brenda", "Oneil", "R9Q 9B7", "Gibraltar" ], + [ "187", "Reuben", "Hopkins", "C2D 9D0", "Bhutan" ], + [ "188", "Sonia", "Sandoval", "Y2G 5I0", "Guatemala" ], + [ "189", "Yasir", "Holcomb", "A1H 6Y3", "Angola" ], + [ "190", "Aristotle", "Rosa", "51870", "Indonesia" ], + [ "191", "Uriah", "Blair", "X8K 1B9", "Suriname" ], + [ "192", "Vaughan", "Sharp", "L2F 5N8", "Faroe Islands" ], + [ "193", "Cooper", "Beard", "80399", "United States Minor Outlying Islands" ], + [ "194", "Riley", "Greene", "44728", "Russian Federation" ], + [ "195", "Rashad", "Flowers", "L6N 8U7", "Mongolia" ], + [ "196", "Yvonne", "Wilson", "18599", "Svalbard and Jan Mayen" ], + [ "197", "Martena", "Ayers", "A8Z 5F7", "Oman" ], + [ "198", "Eagan", "Cline", "T9P 4L4", "Solomon Islands" ], + [ "199", "Dawn", "Carrillo", "T6O 6E5", "Malawi" ], + [ "200", "Ali", "Singleton", "G6F 3B4", "Italy" ], + [ "201", "Christopher", "Beach", "01655", "Palau" ], + [ "202", "Emma", "Cummings", "W1B 4R6", "Dominica" ], + [ "203", "Ishmael", "Gray", "76928", "Egypt" ], + [ "204", "Megan", "Hines", "F7X 2X5", "New Zealand" ], + [ "205", "Emmanuel", "Steele", "09729", "Netherlands" ], + [ "206", "Alea", "Burris", "08485", "Guatemala" ], + [ "207", "Martina", "Todd", "46863", "Christmas Island" ], + [ "208", "Len", "Valentine", "S6Z 5S8", "Slovenia" ], + [ "209", "Jorden", "Salazar", "U4D 8H6", "Austria" ], + [ "210", "Yvette", "Bradford", "17275", "Heard Island and Mcdonald Islands" ], + [ "211", "Elvis", "Mcmahon", "27586", "Marshall Islands" ], + [ "212", "Gray", "Bonner", "N4V 3U9", "Moldova" ], + [ "213", "Yoshi", "Singleton", "86603", "United Kingdom" ], + [ "214", "Amena", "Burks", "93820", "Reunion" ], + [ "215", "Ocean", "Maldonado", "72026", "Ireland" ], + [ "216", "Allen", "Foley", "75363", "Kiribati" ], + [ "217", "Duncan", "Jimenez", "H3H 3G6", "Oman" ], + [ "218", "Ira", "Maxwell", "53136", "French Polynesia" ], + [ "219", "Astra", "Moon", "D7W 8G2", "Dominican Republic" ], + [ "220", "Orson", "Myers", "06049", "Mali" ], + [ "221", "Brandon", "Estes", "D2B 7P2", "Kenya" ], + [ "222", "Halee", "Luna", "54733", "Moldova" ], + [ "223", "Jillian", "Gonzalez", "E8W 3L9", "Ecuador" ], + [ "224", "Julie", "Acosta", "X7M 1T2", "Equatorial Guinea" ], + [ "225", "Quemby", "Foster", "48596", "Eritrea" ], + [ "226", "Erich", "Chavez", "W4P 7G8", "Mayotte" ], + [ "227", "Roary", "Mcknight", "K9K 2K4", "Chile" ], + [ "228", "Mufutau", "Henderson", "81377", "Mayotte" ], + [ "229", "Herman", "Ferguson", "69405", "Japan" ], + [ "230", "Abdul", "Franks", "L1V 8X2", "Portugal" ], + [ "231", "Dominic", "Logan", "98770", "Saint Lucia" ], + [ "232", "Isadora", "Solis", "Y3A 6H5", "Portugal" ], + [ "233", "Lester", "Davis", "30339", "British Indian Ocean Territory" ], + [ "234", "Joel", "Rojas", "N8E 5T9", "Bahrain" ], + [ "235", "Quinlan", "Carroll", "55785", "Australia" ], + [ "236", "Guinevere", "Pickett", "A7Y 3V3", "Netherlands Antilles" ], + [ "237", "Nita", "Hopkins", "88370", "Albania" ], + [ "238", "Hayley", "Buckley", "F1V 7P5", "Togo" ], + [ "239", "Colorado", "Reyes", "18798", "Congo" ], + [ "240", "Tashya", "Bartlett", "48537", "Sierra Leone" ], + [ "241", "Isabella", "Keith", "48878", "Kiribati" ], + [ "242", "Jessica", "Noble", "D6C 9T9", "Svalbard and Jan Mayen" ], + [ "243", "Cairo", "Edwards", "40598", "Nepal" ], + [ "244", "Camille", "Bradley", "I4U 8F6", "Fiji" ], + [ "245", "Quin", "Mcgee", "O5D 2P0", "Poland" ], + [ "246", "Rina", "Guzman", "44940", "Bahrain" ], + [ "247", "Glenna", "Kirkland", "Z1L 4W2", "San Marino" ], + [ "248", "Tarik", "Todd", "77228", "Turks and Caicos Islands" ], + [ "249", "Yardley", "Burris", "M6U 9D7", "New Caledonia" ], + [ "250", "Hashim", "Casey", "17722", "Lesotho" ], + [ "251", "Maggie", "Raymond", "62540", "Uganda" ], + [ "252", "Christian", "Mcdonald", "R8K 2M1", "United Arab Emirates" ], + [ "253", "Colt", "Cobb", "75393", "Moldova" ], + [ "254", "Aline", "Graves", "I1C 9I6", "Holy See (Vatican City State)" ], + [ "255", "Farrah", "Cannon", "H5W 2Y0", "Bhutan" ], + [ "256", "Wynne", "Ayers", "B6X 6Y8", "Western Sahara" ], + [ "257", "Teegan", "Avery", "33643", "San Marino" ], + [ "258", "Shana", "Sloan", "K9P 9V7", "Gabon" ], + [ "259", "Britanney", "Cook", "Y5D 6K7", "Romania" ], + [ "260", "Kuame", "Schroeder", "12859", "Syrian Arab Republic" ], + [ "261", "Valentine", "Joseph", "P2S 6T6", "Mayotte" ], + [ "262", "Joelle", "Keller", "U6F 3T7", "Fiji" ], + [ "263", "Elaine", "Hickman", "28056", "Tuvalu" ], + [ "264", "Ivor", "Malone", "H2Z 5X5", "Virgin Islands, British" ], + [ "265", "Maris", "Jefferson", "12474", "Czech Republic" ], + [ "266", "Josephine", "Zimmerman", "Z5J 2I4", "Angola" ], + [ "267", "Baker", "Wooten", "X4K 2L8", "Austria" ], + [ "268", "Alyssa", "Mitchell", "97712", "Antarctica" ], + [ "269", "Carlos", "Pearson", "85838", "Gambia" ], + [ "270", "Luke", "Richardson", "73867", "Christmas Island" ], + [ "271", "Davis", "Gardner", "U2E 4D9", "Chile" ], + [ "272", "Thomas", "Conner", "92487", "Mozambique" ], + [ "273", "Kieran", "Baird", "X9G 6G1", "Iceland" ], + [ "274", "Cheyenne", "Morris", "F5V 4S2", "Greece" ], + [ "275", "Hillary", "Reeves", "89804", "Slovakia" ], + [ "276", "Ryder", "Long", "32725", "New Caledonia" ], + [ "277", "Ariel", "Colon", "50675", "Estonia" ], + [ "278", "Vanna", "Hess", "79057", "Saudi Arabia" ], + [ "279", "Hayley", "Cherry", "B5E 9X4", "United States Minor Outlying Islands" ], + [ "280", "Knox", "Blair", "75626", "Central African Republic" ], + [ "281", "Astra", "Mcdaniel", "24493", "Bermuda" ], + [ "282", "Teegan", "Ford", "A8U 1K9", "Iran, Islamic Republic of" ], + [ "283", "Harrison", "Jackson", "43519", "Marshall Islands" ], + [ "284", "Melyssa", "Lawson", "O7E 8E6", "Belize" ], + [ "285", "Shaine", "Francis", "Q5K 5I4", "India" ], + [ "286", "August", "Reed", "S9R 1O8", "Ghana" ], + [ "287", "Aphrodite", "Zimmerman", "28336", "Lesotho" ], + [ "288", "Declan", "Walters", "08662", "Rwanda" ], + [ "289", "Brody", "Pate", "G2G 9D9", "Serbia and Montenegro" ], + [ "290", "Bradley", "Odom", "L2R 6Z9", "Jordan" ], + [ "291", "Phillip", "Cleveland", "E4D 1B7", "Paraguay" ], + [ "292", "Silas", "Wiggins", "F9F 5X3", "Bahrain" ], + [ "293", "Keely", "Donaldson", "B5H 7F2", "Vanuatu" ], + [ "294", "Hammett", "Lancaster", "H2P 4E6", "Svalbard and Jan Mayen" ], + [ "295", "Kiara", "Clarke", "50885", "Thailand" ], + [ "296", "Ayanna", "Wiley", "20773", "Morocco" ], + [ "297", "Tashya", "Stanley", "F5J 5R9", "New Caledonia" ], + [ "298", "Margaret", "Barker", "J5A 9N8", "Marshall Islands" ], + [ "299", "Xandra", "English", "92299", "Korea, Republic of" ], + [ "300", "Jane", "Brock", "86140", "Yemen" ], + [ "301", "Lunea", "Garrett", "96730", "New Caledonia" ], + [ "302", "Slade", "Everett", "16105", "Malawi" ], + [ "303", "Scott", "Booker", "G8V 2R4", "Macedonia" ], + [ "304", "Candice", "Decker", "E5R 2D4", "China" ], + [ "305", "Armando", "Bridges", "87959", "Falkland Islands (Malvinas)" ], + [ "306", "Clayton", "Whitley", "Q6O 4M7", "British Indian Ocean Territory" ], + [ "307", "Driscoll", "Duncan", "M2J 9V5", "Argentina" ], + [ "308", "Devin", "Stafford", "L8F 2V7", "Svalbard and Jan Mayen" ], + [ "309", "Bell", "York", "E5B 7X5", "Lebanon" ], + [ "310", "Haley", "Becker", "19759", "Bhutan" ], + [ "311", "Chava", "Santiago", "04396", "Israel" ], + [ "312", "David", "Mccall", "62087", "Norfolk Island" ], + [ "313", "Clinton", "Jacobson", "06168", "Guam" ], + [ "314", "Melvin", "Kaufman", "C4E 9N6", "Gambia" ], + [ "315", "Dai", "Shepherd", "37490", "Saudi Arabia" ], + [ "316", "Zahir", "Chase", "44340", "Turkey" ], + [ "317", "Leilani", "Parrish", "62576", "Cocos (Keeling) Islands" ], + [ "318", "Oleg", "Wilkins", "Z7S 8Z4", "Latvia" ], + [ "319", "Pearl", "Pena", "82526", "Saudi Arabia" ], + [ "320", "Kelly", "Moody", "W7U 5Y3", "Burundi" ], + [ "321", "Marcia", "Kennedy", "85952", "Panama" ], + [ "322", "Cailin", "Burnett", "M2Z 3L5", "Guyana" ], + [ "323", "Ciara", "Small", "X6C 6M6", "Tanzania, United Republic of" ], + [ "324", "Lillian", "Massey", "Z8A 5U5", "Algeria" ], + [ "325", "Garrett", "Elliott", "R5P 6T0", "Canada" ], + [ "326", "Inga", "Daniels", "40156", "Cocos (Keeling) Islands" ], + [ "327", "Barry", "Pena", "03593", "Tonga" ], + [ "328", "Penelope", "Mcintyre", "29293", "Burkina Faso" ], + [ "329", "Dante", "Kirk", "74038", "Lesotho" ], + [ "330", "Owen", "Cole", "17968", "Rwanda" ], + [ "331", "Brittany", "Edwards", "24507", "Paraguay" ], + [ "332", "Zeph", "Bentley", "12000", "Guam" ], + [ "333", "Ruth", "Palmer", "E8V 9A5", "Ghana" ], + [ "334", "Driscoll", "Ellis", "X1X 2N5", "Angola" ], + [ "335", "Mohammad", "Guerra", "Y9N 3Y5", "Mongolia" ], + [ "336", "Clio", "Baldwin", "67557", "Morocco" ], + [ "337", "Virginia", "Duncan", "J8D 4T2", "Haiti" ], + [ "338", "Dieter", "Sanchez", "H7E 2H4", "Romania" ], + [ "339", "Quinn", "Hurst", "K4E 2X6", "Reunion" ], + [ "340", "Coby", "Kelly", "S1H 8N0", "Equatorial Guinea" ], + [ "341", "Raja", "Solis", "S5G 9T5", "Grenada" ], + [ "342", "Jordan", "Riddle", "J7M 5X3", "Svalbard and Jan Mayen" ], + [ "343", "Dora", "Knox", "25054", "Libyan Arab Jamahiriya" ], + [ "344", "Brendan", "Reilly", "U9U 3F7", "Armenia" ], + [ "345", "Melyssa", "Reyes", "11285", "Viet Nam" ], + [ "346", "Knox", "Rivera", "N8Z 7J0", "Nepal" ], + [ "347", "Quynn", "Irwin", "26524", "Chile" ], + [ "348", "Colin", "Coleman", "22833", "United Arab Emirates" ], + [ "349", "Sybil", "Delgado", "99947", "Belize" ], + [ "350", "Macaulay", "Salinas", "48521", "Heard Island and Mcdonald Islands" ], + [ "351", "Garrison", "Hogan", "68950", "India" ], + [ "352", "Ronan", "Guerra", "55445", "Angola" ], + [ "353", "Regina", "Andrews", "H3E 3T0", "Central African Republic" ], + [ "354", "Colorado", "Joyce", "V6X 5K8", "Anguilla" ], + [ "355", "Basia", "Banks", "85049", "Grenada" ], + [ "356", "Adena", "Berg", "04135", "New Caledonia" ], + [ "357", "Wade", "Richardson", "C8M 9J3", "Dominican Republic" ], + [ "358", "Cody", "Montoya", "22018", "Solomon Islands" ], + [ "359", "Faith", "Barnett", "61475", "China" ], + [ "360", "Cody", "Witt", "C8I 2Q8", "Congo" ], + [ "361", "Brenden", "Carlson", "74007", "Marshall Islands" ], + [ "362", "Gil", "Brooks", "U4S 5N1", "Saint Vincent and The Grenadines" ], + [ "363", "Kirestin", "Watts", "H8I 1D5", "Myanmar" ], + [ "364", "Amelia", "Gilliam", "11461", "Chile" ], + [ "365", "Noelani", "Rhodes", "83320", "Cuba" ], + [ "366", "Len", "Trevino", "W9F 2U5", "Armenia" ], + [ "367", "Galvin", "Middleton", "86707", "Thailand" ], + [ "368", "Germaine", "Bridges", "90283", "Japan" ], + [ "369", "Rose", "Hines", "W7L 7Q6", "Congo" ], + [ "370", "Hop", "Mueller", "I3E 2X8", "Angola" ], + [ "371", "Iliana", "Williamson", "56758", "Lebanon" ], + [ "372", "Raja", "Price", "49603", "Armenia" ], + [ "373", "Jeanette", "Hatfield", "E3K 5N5", "India" ], + [ "374", "Brittany", "Christensen", "04750", "Uruguay" ], + [ "375", "Inga", "Prince", "D4X 6J5", "Switzerland" ], + [ "376", "Cherokee", "Ballard", "U1O 1M0", "Rwanda" ], + [ "377", "Deirdre", "Watson", "46983", "Sri Lanka" ], + [ "378", "Amanda", "Parrish", "99838", "Hong Kong" ], + [ "379", "Leo", "Shannon", "L3N 3J0", "Brunei Darussalam" ], + [ "380", "Kimberly", "Clemons", "88734", "South Africa" ], + [ "381", "Seth", "Langley", "D6A 1Q9", "Guyana" ], + [ "382", "Carol", "Blankenship", "X5N 2A7", "Angola" ], + [ "383", "Dora", "Flores", "F8F 1O5", "Poland" ], + [ "384", "Chava", "Dickson", "P8B 6W6", "Comoros" ], + [ "385", "Trevor", "Mcdowell", "31382", "Solomon Islands" ], + [ "386", "Alec", "Valentine", "P2R 4K7", "Greenland" ], + [ "387", "Philip", "Jenkins", "Q7X 5U5", "Aruba" ], + [ "388", "Kim", "Bowen", "69873", "Saint Kitts and Nevis" ], + [ "389", "Allegra", "Oconnor", "X3Y 1X3", "Holy See (Vatican City State)" ], + [ "390", "Daria", "Briggs", "A7Z 7P4", "Serbia and Montenegro" ], + [ "391", "Amelia", "Wiley", "D4S 1G5", "Montserrat" ], + [ "392", "Erica", "Aguirre", "H5L 2O3", "Andorra" ], + [ "393", "Kibo", "Sawyer", "30638", "Guyana" ], + [ "394", "Jackson", "Meyers", "P4N 9D6", "Bangladesh" ], + [ "395", "Kirk", "Baxter", "F3M 7S6", "Estonia" ], + [ "396", "Sybil", "Christian", "B3Q 2X0", "South Georgia and The South Sandwich Islands" ], + [ "397", "Ina", "Mercer", "N4S 1K8", "Korea" ], + [ "398", "Kiara", "Whitehead", "86023", "Nicaragua" ], + [ "399", "Vielka", "Hays", "29845", "Malta" ], + [ "400", "Stacey", "Carlson", "53218", "Cook Islands" ], + [ "401", "Selma", "Lloyd", "78256", "Turkey" ], + [ "402", "Rhoda", "Mcintosh", "G8X 1C8", "Guatemala" ], + [ "403", "Teagan", "Ochoa", "99752", "Barbados" ], + [ "404", "Rebecca", "Carver", "82661", "Saint Kitts and Nevis" ], + [ "405", "Yael", "Woodward", "66095", "Niger" ], + [ "406", "Calvin", "Huffman", "82172", "Somalia" ], + [ "407", "Sopoline", "Walters", "K5L 3I7", "Spain" ], + [ "408", "Hollee", "Powell", "05572", "Samoa" ], + [ "409", "Fiona", "Frank", "74456", "Timor-leste" ], + [ "410", "Alana", "Hubbard", "76011", "Lithuania" ], + [ "411", "Lillian", "Garcia", "J5Z 2O5", "Sierra Leone" ], + [ "412", "Tad", "Mcleod", "B6A 8Z4", "Australia" ], + [ "413", "Hadassah", "Hall", "47417", "China" ], + [ "414", "Regan", "Summers", "X4L 4I6", "Honduras" ], + [ "415", "Herrod", "Erickson", "R8G 3V0", "Israel" ], + [ "416", "Autumn", "Rojas", "31205", "Cocos (Keeling) Islands" ], + [ "417", "Castor", "Mooney", "92737", "Grenada" ], + [ "418", "Wesley", "Holman", "57125", "Greenland" ], + [ "419", "Kitra", "Wooten", "Q6X 4Y0", "Mongolia" ], + [ "420", "Buckminster", "Rice", "U8B 7B8", "Tokelau" ], + [ "421", "Xavier", "Hardin", "18280", "Iran, Islamic Republic of" ], + [ "422", "Sopoline", "Fleming", "78437", "Singapore" ], + [ "423", "Sydney", "Salinas", "23801", "Cook Islands" ], + [ "424", "Bethany", "Rosales", "89650", "United States" ], + [ "425", "Deirdre", "Hensley", "F3X 1B7", "Micronesia" ], + [ "426", "Bernard", "Vargas", "S4D 9T0", "Uzbekistan" ], + [ "427", "Merrill", "Compton", "17713", "Suriname" ], + [ "428", "Carly", "Baird", "D3H 5G3", "United States Minor Outlying Islands" ], + [ "429", "Grace", "Phelps", "64695", "Nauru" ], + [ "430", "Kareem", "Stone", "65572", "Netherlands" ], + [ "431", "Susan", "Newton", "04627", "Anguilla" ], + [ "432", "Laura", "Miranda", "E1G 2R7", "Finland" ], + [ "433", "Madaline", "Pugh", "J9A 9M5", "Senegal" ], + [ "434", "Sophia", "Mendez", "33789", "Timor-leste" ], + [ "435", "Roary", "Greene", "61774", "Canada" ], + [ "436", "Amos", "Gilliam", "94933", "Sri Lanka" ], + [ "437", "Ivory", "Joyner", "15379", "San Marino" ], + [ "438", "Jorden", "Robbins", "43400", "Russian Federation" ], + [ "439", "Merritt", "Holcomb", "R1I 3C7", "Brazil" ], + [ "440", "Iliana", "Johnston", "U9W 8N2", "Trinidad and Tobago" ], + [ "441", "Ivana", "Patterson", "G5O 6A5", "Georgia" ], + [ "442", "Sydney", "Mccullough", "W9M 2H5", "American Samoa" ], + [ "443", "Alvin", "Fulton", "X8A 8R5", "Antigua and Barbuda" ], + [ "444", "Alfreda", "Lopez", "42499", "Montserrat" ], + [ "445", "Ethan", "Bird", "W9A 8M1", "British Indian Ocean Territory" ], + [ "446", "Zeus", "Logan", "01682", "San Marino" ], + [ "447", "Nehru", "Andrews", "W8J 3C8", "Dominican Republic" ], + [ "448", "Donna", "Booth", "64754", "Nepal" ], + [ "449", "Cruz", "Bruce", "17429", "Burundi" ], + [ "450", "Ronan", "Saunders", "69957", "South Africa" ], + [ "451", "Jordan", "Barnes", "D8K 9L8", "Dominica" ], + [ "452", "Carly", "Love", "D8Z 3P4", "Mauritania" ], + [ "453", "Mari", "George", "60260", "Japan" ], + [ "454", "Karly", "Hodges", "15790", "South Georgia and The South Sandwich Islands" ], + [ "455", "Rana", "Logan", "M1R 6Y6", "Bosnia and Herzegovina" ], + [ "456", "Theodore", "Sims", "C7A 8T2", "Barbados" ], + [ "457", "Quin", "Thompson", "26884", "Bouvet Island" ], + [ "458", "Kimberley", "Sloan", "S5T 8E3", "Costa Rica" ], + [ "459", "Upton", "Valenzuela", "Z6J 6Q1", "Macao" ], + [ "460", "Clinton", "Williams", "Z3O 7C4", "Germany" ], + [ "461", "Samson", "Mathis", "G1T 1V9", "Senegal" ], + [ "462", "Michelle", "Frost", "87113", "Serbia and Montenegro" ], + [ "463", "Tyrone", "Coffey", "80705", "Albania" ], + [ "464", "Alea", "Delaney", "E4S 4K4", "Guyana" ], + [ "465", "Dominique", "Schwartz", "81368", "Falkland Islands (Malvinas)" ], + [ "466", "Benedict", "Norton", "D1C 9C8", "Cyprus" ], + [ "467", "Vaughan", "Stein", "R7K 1L8", "Egypt" ], + [ "468", "Charles", "Foley", "20434", "Anguilla" ], + [ "469", "Arden", "Ramos", "54065", "Gibraltar" ], + [ "470", "Dillon", "Patel", "L6H 1H6", "Liberia" ], + [ "471", "Gretchen", "Davenport", "57188", "Equatorial Guinea" ], + [ "472", "Ivy", "Randall", "52617", "Costa Rica" ], + [ "473", "Brett", "Baird", "45791", "Hungary" ], + [ "474", "Wyoming", "Sparks", "11266", "Luxembourg" ], + [ "475", "Rashad", "Roy", "47012", "Guam" ], + [ "476", "Sopoline", "Le", "M1G 2P8", "United Arab Emirates" ], + [ "477", "Ursa", "Haynes", "53774", "British Indian Ocean Territory" ], + [ "478", "Maia", "Vincent", "26773", "New Caledonia" ], + [ "479", "Salvador", "Pace", "S9E 2C4", "Egypt" ], + [ "480", "Bethany", "Wilcox", "F2H 7N0", "Uzbekistan" ], + [ "481", "Sara", "Brooks", "08176", "Holy See (Vatican City State)" ], + [ "482", "Lillith", "Sampson", "75576", "British Indian Ocean Territory" ], + [ "483", "Brynne", "Browning", "N4K 7P6", "Peru" ], + [ "484", "Beck", "Tran", "06815", "Cambodia" ], + [ "485", "Peter", "Hurley", "05770", "Rwanda" ], + [ "486", "Buffy", "Sharpe", "H8F 8G6", "Georgia" ], + [ "487", "Harrison", "Cross", "Y1A 1R8", "United Kingdom" ], + [ "488", "Ursa", "Wolf", "J8C 9Q8", "French Polynesia" ], + [ "489", "Nayda", "Vasquez", "05523", "Taiwan, Province of China" ], + [ "490", "Gretchen", "Walters", "28628", "Seychelles" ], + [ "491", "Adrian", "Hickman", "17956", "El Salvador" ], + [ "492", "Laura", "Moon", "32103", "Myanmar" ], + [ "493", "Kellie", "Barnett", "L5Z 2U8", "Saint Helena" ], + [ "494", "Illana", "Stanton", "Z5D 2G0", "Australia" ], + [ "495", "Jescie", "Santiago", "D9L 4B5", "Cambodia" ], + [ "496", "Laura", "Hopkins", "X6V 9S5", "Netherlands Antilles" ], + [ "497", "Vielka", "Harding", "U6A 9T2", "Cambodia" ], + [ "498", "Walter", "Gentry", "L3X 9Q9", "Slovenia" ], + [ "499", "Sara", "Atkinson", "67146", "Guinea" ], + [ "500", "Yolanda", "Chambers", "Q8D 3W0", "Zimbabwe" ], + [ "501", "Josiah", "Villarreal", "I1V 6Y7", "Burkina Faso" ], + [ "502", "Hayfa", "Bowman", "77148", "Saudi Arabia" ], + [ "503", "Colette", "Conley", "41232", "Estonia" ], + [ "504", "Lana", "Doyle", "32962", "Cuba" ], + [ "505", "Keegan", "Goodwin", "M2P 1X3", "Cocos (Keeling) Islands" ], + [ "506", "Nina", "Cross", "49580", "Germany" ], + [ "507", "Xenos", "Cervantes", "K6X 7W8", "Mauritius" ], + [ "508", "Jared", "Hester", "30156", "Uzbekistan" ], + [ "509", "Damon", "Curry", "U2J 2D8", "Pitcairn" ], + [ "510", "Amery", "Savage", "O1S 2Z4", "Turkmenistan" ], + [ "511", "Brian", "Wilkinson", "J6O 4T0", "Luxembourg" ], + [ "512", "Ivory", "Mckinney", "L3E 8M2", "Lithuania" ], + [ "513", "Eric", "Dalton", "Y1L 6F4", "Ethiopia" ], + [ "514", "Brandon", "Callahan", "K6Q 9B4", "Haiti" ], + [ "515", "Phillip", "Mclean", "18836", "Ethiopia" ], + [ "516", "Carly", "Greer", "16811", "Mayotte" ], + [ "517", "Stone", "Ware", "58795", "Moldova" ], + [ "518", "Xena", "Hayden", "97158", "Chad" ], + [ "519", "Catherine", "Leonard", "77868", "Azerbaijan" ], + [ "520", "Bernard", "Horton", "04270", "Yemen" ], + [ "521", "Olga", "Richmond", "89169", "Lebanon" ], + [ "522", "Iris", "Cummings", "78836", "Falkland Islands (Malvinas)" ], + [ "523", "Beau", "Mccall", "78638", "Monaco" ], + [ "524", "Michael", "Humphrey", "Q1A 2W9", "Tokelau" ], + [ "525", "Oren", "Stevens", "F4V 9G7", "Heard Island and Mcdonald Islands" ], + [ "526", "Ima", "Shelton", "19295", "Mozambique" ], + [ "527", "Merritt", "Morrison", "K6W 5R0", "Georgia" ], + [ "528", "Vera", "Cherry", "54993", "Angola" ], + [ "529", "Grant", "Turner", "B4V 2J0", "Saint Helena" ], + [ "530", "Odette", "Snyder", "N9L 2V8", "Chad" ], + [ "531", "Uma", "Stewart", "E9A 6X9", "Bhutan" ], + [ "532", "Kylee", "Best", "11393", "Malaysia" ], + [ "533", "Nicholas", "Mercado", "85179", "Switzerland" ], + [ "534", "Nathaniel", "Stuart", "M1Q 6Z6", "Mongolia" ], + [ "535", "Ruth", "Conrad", "T7G 9V6", "Guadeloupe" ], + [ "536", "Deanna", "Dudley", "79721", "Kiribati" ], + [ "537", "David", "Thornton", "C6R 2G3", "Netherlands Antilles" ], + [ "538", "Jane", "Ashley", "48711", "Rwanda" ], + [ "539", "Nero", "Curry", "20590", "Denmark" ], + [ "540", "Kellie", "Poole", "46053", "Martinique" ], + [ "541", "Freya", "Burch", "W5R 8Y5", "Northern Mariana Islands" ], + [ "542", "Maxwell", "Mcbride", "D4W 4M3", "Paraguay" ], + [ "543", "Dawn", "Sargent", "85956", "Gibraltar" ], + [ "544", "Lilah", "Matthews", "J4D 8A9", "Montserrat" ], + [ "545", "Salvador", "Burns", "28067", "Bhutan" ], + [ "546", "Ezekiel", "Ayala", "67153", "Wallis and Futuna" ], + [ "547", "Evan", "Barker", "83026", "Puerto Rico" ], + [ "548", "Jemima", "Case", "U3S 7N6", "Georgia" ], + [ "549", "Belle", "Mcconnell", "H4S 9F8", "Angola" ], + [ "550", "Doris", "Mays", "57387", "Tonga" ], + [ "551", "Carson", "Buchanan", "20457", "Guatemala" ], + [ "552", "Calista", "Lamb", "26851", "Gibraltar" ], + [ "553", "Remedios", "Haley", "A9K 5M1", "Tokelau" ], + [ "554", "Odette", "Mccarty", "Y8B 3V4", "Marshall Islands" ], + [ "555", "Libby", "Pugh", "93261", "Netherlands" ], + [ "556", "Bo", "Maldonado", "C1H 1K7", "Oman" ], + [ "557", "Cameron", "Beasley", "41821", "Northern Mariana Islands" ], + [ "558", "Chadwick", "Crosby", "62855", "New Caledonia" ], + [ "559", "Steven", "Barrett", "92102", "Pakistan" ], + [ "560", "Jonas", "Valdez", "N3V 4R9", "Bulgaria" ], + [ "561", "Harlan", "Larsen", "Z8F 6A0", "Cayman Islands" ], + [ "562", "Iola", "Joyner", "D1J 4C3", "Italy" ], + [ "563", "Abra", "Medina", "Q9O 5J2", "Cambodia" ], + [ "564", "Solomon", "Davidson", "91317", "Turkmenistan" ], + [ "565", "Alisa", "Kim", "33036", "Austria" ], + [ "566", "Deacon", "Silva", "Z5L 6M0", "Djibouti" ], + [ "567", "Bree", "Landry", "43135", "Czech Republic" ], + [ "568", "Molly", "Leach", "71714", "Botswana" ], + [ "569", "Idona", "Cain", "A2J 1R8", "South Georgia and The South Sandwich Islands" ], + [ "570", "Aileen", "Salinas", "90344", "Uzbekistan" ], + [ "571", "Dominique", "Cooper", "31803", "Sao Tome and Principe" ], + [ "572", "Lunea", "Pollard", "S9R 7B0", "Sweden" ], + [ "573", "Leo", "Combs", "W7E 8T4", "Ukraine" ], + [ "574", "Illiana", "Donovan", "D8K 3R4", "Palau" ], + [ "575", "Orlando", "Vaughan", "Q4I 3E3", "Bosnia and Herzegovina" ], + [ "576", "Yuri", "Blake", "I9W 5U5", "Seychelles" ], + [ "577", "Amanda", "Baldwin", "19752", "Turkmenistan" ], + [ "578", "Hanna", "Emerson", "73316", "Antigua and Barbuda" ], + [ "579", "Xyla", "Atkins", "11151", "Uganda" ], + [ "580", "Nathaniel", "Patterson", "00391", "Portugal" ], + [ "581", "Naida", "Cote", "17484", "Mauritius" ], + [ "582", "Scarlett", "Little", "V8N 8A6", "Sao Tome and Principe" ], + [ "583", "Odessa", "Kerr", "56456", "Sweden" ], + [ "584", "Kamal", "Richardson", "F6S 4I1", "Algeria" ], + [ "585", "Griffith", "Morton", "I5H 2Z0", "Vanuatu" ], + [ "586", "Orli", "Santana", "48213", "Burundi" ], + [ "587", "Courtney", "Cook", "R3O 3A9", "Cape Verde" ], + [ "588", "Jolene", "Wallace", "F6Q 7W8", "Zambia" ], + [ "589", "Bert", "Sharp", "X7T 7Z8", "Paraguay" ], + [ "590", "Ila", "Carver", "E4M 7P4", "Paraguay" ], + [ "591", "Merrill", "Wall", "49416", "Fiji" ], + [ "592", "Hanae", "Espinoza", "Y6D 6K8", "Turkey" ], + [ "593", "Stephanie", "Bond", "Z1Q 3P3", "Algeria" ], + [ "594", "Lionel", "Leonard", "U8O 7G6", "Nauru" ], + [ "595", "Faith", "Ramirez", "75181", "Slovakia" ], + [ "596", "Fritz", "Glass", "62878", "El Salvador" ], + [ "597", "Raya", "Gardner", "L3E 2C7", "India" ], + [ "598", "Brynne", "Price", "W1S 6O9", "Lithuania" ], + [ "599", "Karen", "Gray", "O4X 8F6", "Albania" ], + [ "600", "Perry", "Goodwin", "44266", "Libyan Arab Jamahiriya" ], + [ "601", "Dylan", "Glover", "76573", "Estonia" ], + [ "602", "Melinda", "Holloway", "07861", "Grenada" ], + [ "603", "Rahim", "Robinson", "D7M 1E8", "Madagascar" ], + [ "604", "Ori", "Oconnor", "10386", "Antarctica" ], + [ "605", "Candace", "Preston", "03610", "Denmark" ], + [ "606", "Wing", "Howe", "E6U 3H2", "Burundi" ], + [ "607", "Lucy", "Eaton", "26436", "Guinea" ], + [ "608", "Ignatius", "Blevins", "93597", "Serbia and Montenegro" ], + [ "609", "Nadine", "Franco", "80096", "Tonga" ], + [ "610", "Shoshana", "Walters", "S4F 5O8", "Micronesia" ], + [ "611", "Remedios", "Buckner", "29213", "Antigua and Barbuda" ], + [ "612", "Adam", "Horne", "F8V 1V8", "Oman" ], + [ "613", "Kieran", "Saunders", "I7A 7Y5", "Japan" ], + [ "614", "Isabelle", "Fletcher", "K2K 3K5", "Norway" ], + [ "615", "Ryder", "Ballard", "38518", "Tanzania, United Republic of" ], + [ "616", "Nina", "Guerrero", "61142", "Saint Kitts and Nevis" ], + [ "617", "Sheila", "Poole", "E2H 6I6", "Denmark" ], + [ "618", "Melyssa", "Mcdaniel", "08247", "Netherlands Antilles" ], + [ "619", "Leila", "Vang", "Q5Z 3S1", "United States Minor Outlying Islands" ], + [ "620", "Grady", "Aguilar", "R1I 8I8", "Slovenia" ], + [ "621", "Plato", "Terrell", "23916", "Kuwait" ], + [ "622", "Rama", "Perkins", "56506", "Russian Federation" ], + [ "623", "Boris", "Chaney", "66737", "Antigua and Barbuda" ], + [ "624", "Edward", "Clarke", "30722", "Iraq" ], + [ "625", "Skyler", "Wise", "53248", "Taiwan, Province of China" ], + [ "626", "Uta", "Cox", "85242", "Malawi" ], + [ "627", "Lesley", "Watkins", "26710", "Estonia" ], + [ "628", "Gray", "Harrison", "C5L 9Y7", "Nepal" ], + [ "629", "Joan", "Flores", "J5Q 2B9", "Tajikistan" ], + [ "630", "Reece", "Lott", "85152", "Algeria" ], + [ "631", "Jerome", "Faulkner", "V1K 3N2", "Kiribati" ], + [ "632", "Jackson", "Hudson", "85932", "Botswana" ], + [ "633", "Uma", "Booker", "79755", "Senegal" ], + [ "634", "Katelyn", "Gillespie", "Q8P 4V9", "Eritrea" ], + [ "635", "Clio", "Tillman", "67552", "Liberia" ], + [ "636", "Anjolie", "Nixon", "36615", "Botswana" ], + [ "637", "Nell", "Lee", "T9S 4R3", "French Southern Territories" ], + [ "638", "Anthony", "Aguirre", "85443", "Morocco" ], + [ "639", "Aaron", "Green", "90326", "Faroe Islands" ], + [ "640", "Galvin", "Yang", "A4X 8H6", "Ukraine" ], + [ "641", "Yoshi", "Strickland", "52538", "Brazil" ], + [ "642", "Brenden", "Kirkland", "X7P 8V9", "Turks and Caicos Islands" ], + [ "643", "Bree", "Stone", "U4L 2H2", "Hong Kong" ], + [ "644", "Quin", "Tanner", "U4A 1X4", "Faroe Islands" ], + [ "645", "Camilla", "Heath", "91749", "Andorra" ], + [ "646", "Xaviera", "Bullock", "I4U 7W0", "Libyan Arab Jamahiriya" ], + [ "647", "Kay", "Rowe", "59689", "Iceland" ], + [ "648", "Lance", "Bond", "66558", "Spain" ], + [ "649", "Fredericka", "Langley", "48782", "Cayman Islands" ], + [ "650", "Charles", "Avila", "42037", "Papua New Guinea" ], + [ "651", "Ramona", "Rios", "T5M 3E1", "Argentina" ], + [ "652", "Ezekiel", "Young", "W8X 4S7", "French Polynesia" ], + [ "653", "Celeste", "Dodson", "19140", "Benin" ], + [ "654", "Frances", "Mcintosh", "91246", "Swaziland" ], + [ "655", "Deanna", "Hyde", "J8P 3T5", "Croatia" ], + [ "656", "Dahlia", "Blair", "45364", "Kazakhstan" ], + [ "657", "Jade", "Hayes", "I5Q 3S9", "Malawi" ], + [ "658", "Robin", "Bullock", "G9Q 2P8", "Ireland" ], + [ "659", "Nasim", "Bond", "I2V 8N4", "Macedonia" ], + [ "660", "Axel", "Pickett", "18370", "Saint Vincent and The Grenadines" ], + [ "661", "Pearl", "Lee", "G1R 3R8", "Poland" ], + [ "662", "Garth", "Meyers", "90308", "Georgia" ], + [ "663", "Ivory", "Rios", "S8F 8R5", "Mexico" ], + [ "664", "Jerome", "Lambert", "N1Q 6R8", "Saint Lucia" ], + [ "665", "Meredith", "Clark", "27720", "Cocos (Keeling) Islands" ], + [ "666", "Armando", "Holcomb", "M6D 4X0", "Oman" ], + [ "667", "Rowan", "Page", "00307", "Nauru" ], + [ "668", "Kyla", "Brown", "F4W 4C5", "Holy See (Vatican City State)" ], + [ "669", "Leigh", "Sosa", "28499", "Uruguay" ], + [ "670", "Shafira", "Forbes", "26526", "Honduras" ], + [ "671", "Maxine", "Mueller", "90923", "Kazakhstan" ], + [ "672", "Joy", "Sargent", "K6T 3W5", "Malawi" ], + [ "673", "Lamar", "Roberts", "R5F 9C8", "Poland" ], + [ "674", "Madonna", "Love", "15514", "Cyprus" ], + [ "675", "Uriel", "Ware", "Z6V 5J1", "Singapore" ], + [ "676", "Bevis", "Erickson", "M3X 9M8", "Brunei Darussalam" ], + [ "677", "Grant", "Velasquez", "96942", "Antarctica" ], + [ "678", "Lars", "Bullock", "14772", "Guyana" ], + [ "679", "Maryam", "Jones", "01854", "Togo" ], + [ "680", "Blythe", "Goodwin", "51731", "New Caledonia" ], + [ "681", "Kane", "Wiggins", "55727", "Kiribati" ], + [ "682", "Brian", "Rosales", "25896", "Cape Verde" ], + [ "683", "Blaze", "Leach", "P6J 3E5", "Northern Mariana Islands" ], + [ "684", "Cameron", "Neal", "82248", "Marshall Islands" ], + [ "685", "Lydia", "Cunningham", "Q1V 8P7", "San Marino" ], + [ "686", "Troy", "Cook", "32106", "British Indian Ocean Territory" ], + [ "687", "Alexander", "Valenzuela", "S8Z 6B2", "Guadeloupe" ], + [ "688", "Garth", "Beck", "46344", "Cook Islands" ], + [ "689", "Hillary", "Nunez", "29462", "Sri Lanka" ], + [ "690", "Hunter", "Sawyer", "W9M 6T4", "Saint Lucia" ], + [ "691", "Jaquelyn", "Everett", "T1X 2U2", "Guinea-bissau" ], + [ "692", "Indira", "Ortega", "43047", "Italy" ], + [ "693", "Josiah", "Hinton", "N5F 5Y8", "Andorra" ], + [ "694", "Bruno", "Gay", "E3U 3D9", "Palau" ], + [ "695", "Melissa", "Blackburn", "S4V 1K2", "Virgin Islands, U.S." ], + [ "696", "Zeus", "Dawson", "K5S 6Z6", "Belgium" ], + [ "697", "Castor", "Mcmahon", "H3R 1O8", "Cambodia" ], + [ "698", "Elizabeth", "Beasley", "98178", "Northern Mariana Islands" ], + [ "699", "Jescie", "Lee", "08056", "Eritrea" ], + [ "700", "Dennis", "Chapman", "T4O 1Q2", "Bangladesh" ], + [ "701", "Basia", "Wallace", "U3Y 7C1", "Pitcairn" ], + [ "702", "Dante", "Brewer", "53544", "Bosnia and Herzegovina" ], + [ "703", "Adrienne", "Glenn", "32378", "Austria" ], + [ "704", "Kellie", "Acevedo", "51723", "Italy" ], + [ "705", "Scarlet", "Mclaughlin", "43509", "Kiribati" ], + [ "706", "Lillith", "Mullins", "S6L 4Y6", "Kyrgyzstan" ], + [ "707", "Maxine", "Atkins", "Z5T 5R5", "Denmark" ], + [ "708", "Nicholas", "Rose", "40286", "Macedonia" ], + [ "709", "Zenia", "Pugh", "28682", "Venezuela" ], + [ "710", "Keely", "Turner", "34939", "New Zealand" ], + [ "711", "Maisie", "Walton", "S6M 5C5", "Cameroon" ], + [ "712", "Michelle", "Salinas", "T7A 9N6", "Nicaragua" ], + [ "713", "Reece", "Clements", "73923", "Austria" ], + [ "714", "Eliana", "Fox", "V3Y 5T4", "Denmark" ], + [ "715", "Kennedy", "Mullins", "43213", "Virgin Islands, British" ], + [ "716", "Alea", "Glover", "M6P 3Z5", "Turkmenistan" ], + [ "717", "Scarlett", "Hunt", "41461", "Montserrat" ], + [ "718", "Rooney", "Kane", "T8A 3E2", "Madagascar" ], + [ "719", "Cairo", "Ray", "L6M 1E7", "Canada" ], + [ "720", "Wendy", "Burks", "R8V 8F5", "Virgin Islands, U.S." ], + [ "721", "Christine", "Suarez", "67369", "Georgia" ], + [ "722", "Graiden", "Le", "K4M 9V5", "New Caledonia" ], + [ "723", "Zane", "Nunez", "60548", "Haiti" ], + [ "724", "Ali", "Bell", "U4Y 4C3", "Togo" ], + [ "725", "Marsden", "Leon", "39374", "Venezuela" ], + [ "726", "Holmes", "Kidd", "B6K 7Q9", "Iraq" ], + [ "727", "Cameron", "Gardner", "88627", "Brazil" ], + [ "728", "Ava", "George", "K1Z 7Y2", "Monaco" ], + [ "729", "Chantale", "Holland", "H1B 9L8", "Afghanistan" ], + [ "730", "Alika", "Middleton", "W8X 7O1", "Korea" ], + [ "731", "Cameran", "Zimmerman", "78576", "Benin" ], + [ "732", "Barrett", "Blair", "51161", "Virgin Islands, U.S." ], + [ "733", "Brielle", "Ballard", "59538", "Iceland" ], + [ "734", "Teagan", "Morales", "40107", "Kenya" ], + [ "735", "Lunea", "Cantu", "14690", "Oman" ], + [ "736", "Robin", "Gilmore", "17972", "Nauru" ], + [ "737", "Hall", "Mccarty", "86141", "China" ], + [ "738", "Olga", "Rasmussen", "58309", "Virgin Islands, British" ], + [ "739", "Mark", "Griffin", "51542", "Argentina" ], + [ "740", "Medge", "Carrillo", "23192", "Pitcairn" ], + [ "741", "Susan", "Mosley", "32128", "Turkmenistan" ], + [ "742", "Zelda", "Valdez", "46831", "New Caledonia" ], + [ "743", "Ruth", "Donaldson", "F9I 7G7", "Ukraine" ], + [ "744", "Kirby", "Workman", "36679", "Rwanda" ], + [ "745", "Alexa", "King", "66513", "Liberia" ], + [ "746", "Ronan", "Gross", "K2S 6D0", "Saint Lucia" ], + [ "747", "Kylee", "Dillon", "P7Y 1I5", "Faroe Islands" ], + [ "748", "Brenda", "Weaver", "99365", "Uzbekistan" ], + [ "749", "Aristotle", "Orr", "43451", "Canada" ], + [ "750", "Jaquelyn", "Tyler", "B9Q 7P5", "Brunei Darussalam" ], + [ "751", "Madeline", "Stewart", "D4D 2J4", "Zimbabwe" ], + [ "752", "Lacota", "Glass", "89124", "Israel" ], + [ "753", "Adrian", "Ashley", "N8M 4L1", "Sri Lanka" ], + [ "754", "Ignatius", "Waller", "12053", "Thailand" ], + [ "755", "Raven", "Stevens", "88768", "Estonia" ], + [ "756", "Carly", "Camacho", "27075", "Vanuatu" ], + [ "757", "Lee", "Calderon", "19501", "Pitcairn" ], + [ "758", "Amos", "Briggs", "I6A 3L8", "Saint Kitts and Nevis" ], + [ "759", "Cheryl", "Valencia", "90517", "Denmark" ], + [ "760", "Kenyon", "Franco", "B2S 2E2", "Western Sahara" ], + [ "761", "Damian", "Acosta", "A2S 6D0", "Bahamas" ], + [ "762", "Brenda", "Zamora", "T9E 7L3", "Finland" ], + [ "763", "Connor", "Atkinson", "03975", "Sierra Leone" ], + [ "764", "Kaseem", "Waters", "A2K 2X0", "China" ], + [ "765", "Zephania", "Whitfield", "A4Z 9P7", "Eritrea" ], + [ "766", "Emmanuel", "Ballard", "G1M 6Y2", "Finland" ], + [ "767", "Amos", "Walters", "43184", "Oman" ], + [ "768", "Urielle", "Browning", "19959", "Panama" ], + [ "769", "TaShya", "Summers", "B9V 3Y3", "Micronesia" ], + [ "770", "Jermaine", "Mcgee", "X8A 4E1", "Cape Verde" ], + [ "771", "Chaney", "Berry", "G2H 2C8", "Uganda" ], + [ "772", "Jaime", "May", "49723", "Eritrea" ], + [ "773", "Olga", "Cohen", "13403", "Macao" ], + [ "774", "Jacob", "Vaughn", "U7G 1V5", "Greece" ], + [ "775", "Kelly", "Mcdonald", "Z3B 5G7", "Kiribati" ], + [ "776", "Emi", "Gilbert", "W1L 2M4", "Nicaragua" ], + [ "777", "Francis", "Nunez", "K4U 6M5", "Lithuania" ], + [ "778", "Noel", "Nelson", "Z5T 1Y0", "Nauru" ], + [ "779", "Ora", "Ellison", "Y5I 4R8", "Burundi" ], + [ "780", "Kirby", "Glass", "J5X 2E3", "Argentina" ], + [ "781", "Hayley", "Tate", "V1T 6B6", "Greece" ], + [ "782", "Mohammad", "Leblanc", "E3S 5R3", "Oman" ], + [ "783", "Lionel", "Todd", "A1Z 9E1", "Macedonia" ], + [ "784", "Courtney", "Mckay", "D4I 8Z3", "Fiji" ], + [ "785", "Reagan", "West", "84159", "Equatorial Guinea" ], + [ "786", "Noel", "Strickland", "Q7K 6S3", "Mozambique" ], + [ "787", "Lara", "Porter", "49872", "Nigeria" ], + [ "788", "Kyra", "Haley", "I9E 2K3", "Dominican Republic" ], + [ "789", "Wynter", "Beasley", "66330", "Heard Island and Mcdonald Islands" ], + [ "790", "Vladimir", "Briggs", "99538", "Burkina Faso" ], + [ "791", "Rafael", "Campbell", "V8L 2S6", "Algeria" ], + [ "792", "Buffy", "Wilder", "N3U 2X0", "Bahrain" ], + [ "793", "Nyssa", "Dawson", "38434", "Spain" ], + [ "794", "Sylvia", "Swanson", "39714", "Azerbaijan" ], + [ "795", "Jolie", "Diaz", "A1J 5I1", "Cuba" ], + [ "796", "Rosalyn", "Mcdaniel", "F3T 6E2", "Benin" ], + [ "797", "Nelle", "Prince", "K1M 4U6", "Maldives" ], + [ "798", "Luke", "Knight", "05930", "Seychelles" ], + [ "799", "Macaulay", "Conway", "79707", "American Samoa" ], + [ "800", "Freya", "Webb", "U2H 2D7", "Ireland" ], + [ "801", "Clinton", "Meyers", "S9I 7N2", "Malta" ], + [ "802", "Rudyard", "Chandler", "40347", "Bahrain" ], + [ "803", "Courtney", "Hoover", "12325", "French Polynesia" ], + [ "804", "Melissa", "Davenport", "K7P 1S8", "Canada" ], + [ "805", "Noelle", "Nieves", "87427", "Martinique" ], + [ "806", "Myles", "Hart", "V6T 1W0", "Niue" ], + [ "807", "Jasper", "Campos", "78143", "Faroe Islands" ], + [ "808", "Ariana", "Valentine", "J4X 2D4", "Ecuador" ], + [ "809", "Vanna", "Fletcher", "M4Z 1F9", "Faroe Islands" ], + [ "810", "Elijah", "Harper", "Y1B 7E4", "New Zealand" ], + [ "811", "Leilani", "Nunez", "K9W 4F0", "United Arab Emirates" ], + [ "812", "Maia", "Huber", "V4L 8M6", "United Kingdom" ], + [ "813", "Richard", "Riddle", "U8C 8Q2", "Niue" ], + [ "814", "Harper", "Blanchard", "10904", "Cameroon" ], + [ "815", "Aurelia", "Trujillo", "01646", "Dominican Republic" ], + [ "816", "Anthony", "Owen", "J2I 2B4", "Palestinian Territory, Occupied" ], + [ "817", "Kelsie", "Roy", "M3J 6K3", "Maldives" ], + [ "818", "James", "Pearson", "94810", "Mexico" ], + [ "819", "Igor", "Marshall", "Y8M 2D6", "Palau" ], + [ "820", "Aquila", "Willis", "20354", "Samoa" ], + [ "821", "Randall", "Sheppard", "73577", "Sierra Leone" ], + [ "822", "Gray", "Myers", "53651", "Gibraltar" ], + [ "823", "Dana", "Camacho", "89571", "Reunion" ], + [ "824", "Berk", "Hopper", "17794", "Cook Islands" ], + [ "825", "Shannon", "Barry", "70536", "Bouvet Island" ], + [ "826", "Dahlia", "Herman", "F8L 1Q3", "Lesotho" ], + [ "827", "Gillian", "Hayes", "O2C 7X8", "Tajikistan" ], + [ "828", "Leo", "Bolton", "P6V 6E1", "Dominica" ], + [ "829", "Vivien", "Best", "E5E 6N8", "Cuba" ], + [ "830", "Clayton", "Bradley", "E7R 3M5", "Zimbabwe" ], + [ "831", "Lesley", "Collins", "16592", "Mali" ], + [ "832", "Holly", "Hensley", "49080", "Tunisia" ], + [ "833", "Larissa", "Velazquez", "41068", "Haiti" ], + [ "834", "Delilah", "Mejia", "A5I 9Q9", "Croatia" ], + [ "835", "Drew", "Roberson", "U7E 3R1", "Somalia" ], + [ "836", "Jenette", "Patel", "64084", "Denmark" ], + [ "837", "Gillian", "Cleveland", "05659", "Syrian Arab Republic" ], + [ "838", "Noelle", "Lara", "U1N 6V6", "Sri Lanka" ], + [ "839", "Celeste", "Rollins", "26590", "Mayotte" ], + [ "840", "Elvis", "Fletcher", "M8V 6J4", "Bahamas" ], + [ "841", "Caesar", "Hays", "E3D 3T7", "Malta" ], + [ "842", "Rama", "Weber", "25880", "Malta" ], + [ "843", "Lael", "Page", "57135", "Anguilla" ], + [ "844", "Omar", "Hammond", "90213", "Belarus" ], + [ "845", "Simone", "Mcintosh", "L5P 1S0", "Bhutan" ], + [ "846", "Gay", "Harper", "56404", "Virgin Islands, U.S." ], + [ "847", "Joel", "Holman", "C1F 1C4", "Saint Lucia" ], + [ "848", "Clayton", "Pennington", "57003", "Kazakhstan" ], + [ "849", "Susan", "Mckee", "I5U 8F2", "Taiwan, Province of China" ], + [ "850", "Jenna", "Stein", "P2K 6L4", "Reunion" ], + [ "851", "Madonna", "Joyner", "Q4Q 4K6", "Guadeloupe" ], + [ "852", "Deirdre", "Ingram", "N7U 3N9", "Monaco" ], + [ "853", "Juliet", "Hodges", "U2Q 2T0", "Uzbekistan" ], + [ "854", "Naomi", "Rice", "O6T 2Z1", "Nicaragua" ], + [ "855", "Leila", "Alvarado", "Z2V 7L3", "Suriname" ], + [ "856", "George", "Leon", "L6M 1V2", "Norway" ], + [ "857", "Rama", "Cruz", "Y2S 7K6", "Kenya" ], + [ "858", "Clarke", "Mckinney", "34622", "Viet Nam" ], + [ "859", "Savannah", "Bailey", "L3O 1U6", "Solomon Islands" ], + [ "860", "Maxwell", "Gibson", "R9K 9Q1", "Virgin Islands, British" ], + [ "861", "Devin", "Humphrey", "74821", "Costa Rica" ], + [ "862", "Kadeem", "Larsen", "43178", "Luxembourg" ], + [ "863", "Elvis", "Todd", "O3O 3G9", "Azerbaijan" ], + [ "864", "Levi", "Montoya", "G1Y 1N8", "Venezuela" ], + [ "865", "Risa", "Barnes", "86118", "Benin" ], + [ "866", "Dillon", "Riggs", "O3Y 8V2", "Greenland" ], + [ "867", "Stewart", "Marshall", "V8G 8S2", "Mexico" ], + [ "868", "Camden", "Goff", "N3W 2L0", "Bahrain" ], + [ "869", "Sheila", "Meadows", "T6K 7M2", "Yemen" ], + [ "870", "Hop", "Berger", "Q8B 9R7", "Germany" ], + [ "871", "Charissa", "Wilkerson", "08090", "Burundi" ], + [ "872", "Raphael", "Carey", "03667", "United Kingdom" ], + [ "873", "Micah", "Hood", "T9N 4T5", "Georgia" ], + [ "874", "Cathleen", "Mccall", "N6H 6N3", "Tanzania, United Republic of" ], + [ "875", "Lisandra", "Poole", "S7O 1J1", "Greece" ], + [ "876", "Stone", "Blackwell", "90654", "Serbia and Montenegro" ], + [ "877", "Serena", "Mann", "32305", "Trinidad and Tobago" ], + [ "878", "Scarlet", "Turner", "D7Y 8N4", "Oman" ], + [ "879", "Zenaida", "Carrillo", "60361", "Montserrat" ], + [ "880", "Jaime", "Dalton", "F4E 6R5", "Iraq" ], + [ "881", "Wesley", "Drake", "D8J 9U2", "Bulgaria" ], + [ "882", "Armand", "Chandler", "X8Z 9E6", "Saint Kitts and Nevis" ], + [ "883", "Inez", "Dillard", "59975", "Eritrea" ], + [ "884", "Roanna", "Floyd", "65958", "Bolivia" ], + [ "885", "Timon", "Dalton", "O3Q 5B5", "Colombia" ], + [ "886", "Ifeoma", "Lamb", "J9A 9X0", "Papua New Guinea" ], + [ "887", "Brody", "Cash", "75525", "Kazakhstan" ], + [ "888", "Dawn", "Wise", "G7X 5J3", "Samoa" ], + [ "889", "Chaney", "Bartlett", "11112", "Ecuador" ], + [ "890", "Galvin", "Merritt", "59635", "Bahrain" ], + [ "891", "Cynthia", "Nash", "U5P 1H4", "Switzerland" ], + [ "892", "Tara", "Austin", "Q6X 8U0", "Burundi" ], + [ "893", "Roanna", "Petty", "28524", "Northern Mariana Islands" ], + [ "894", "Palmer", "Mcdowell", "78234", "United States Minor Outlying Islands" ], + [ "895", "Sade", "Patton", "28984", "Czech Republic" ], + [ "896", "Yoko", "Compton", "62165", "Saint Kitts and Nevis" ], + [ "897", "Regan", "Mccarthy", "C5D 6G0", "Lebanon" ], + [ "898", "Norman", "Nixon", "E4C 4G0", "Virgin Islands, U.S." ], + [ "899", "Jocelyn", "Baldwin", "X9R 2B3", "Macedonia" ], + [ "900", "Jaquelyn", "Berg", "N6X 6E1", "Saint Lucia" ], + [ "901", "Zane", "Nelson", "G9P 4J8", "Macao" ], + [ "902", "Judith", "Elliott", "R4I 4O3", "Iraq" ], + [ "903", "Maia", "Ellis", "S9V 6P0", "Bahrain" ], + [ "904", "Mechelle", "Stevens", "43406", "Bouvet Island" ], + [ "905", "Sylvester", "Duran", "K5D 8W5", "Costa Rica" ], + [ "906", "Unity", "Cooke", "64362", "Ecuador" ], + [ "907", "Karly", "Velazquez", "43286", "Guam" ], + [ "908", "Damian", "Yates", "84910", "Thailand" ], + [ "909", "Linus", "Gross", "31808", "Israel" ], + [ "910", "Cooper", "Franco", "36700", "Yemen" ], + [ "911", "Gail", "Jones", "09157", "Turkey" ], + [ "912", "Hayfa", "Bennett", "59422", "France" ], + [ "913", "Hermione", "Barber", "I6W 8Z5", "Mozambique" ], + [ "914", "Hedy", "Stevens", "35535", "Cuba" ], + [ "915", "Galvin", "Frederick", "J2W 9A3", "Virgin Islands, British" ], + [ "916", "Lamar", "Rush", "P4O 3H4", "Austria" ], + [ "917", "Brenda", "Walter", "K8Q 9H9", "Tajikistan" ], + [ "918", "Ria", "Guy", "12801", "Gibraltar" ], + [ "919", "Bruno", "Lynch", "I6U 7D0", "Greenland" ], + [ "920", "Kirk", "Pearson", "66242", "Falkland Islands (Malvinas)" ], + [ "921", "Owen", "Sosa", "61483", "Martinique" ], + [ "922", "Rajah", "Mccarty", "G9K 6L2", "Faroe Islands" ], + [ "923", "Erasmus", "Malone", "D6H 7H5", "Sierra Leone" ], + [ "924", "Raja", "Hale", "85590", "Guadeloupe" ], + [ "925", "Logan", "Christensen", "Y6L 8Z0", "Guatemala" ], + [ "926", "Kirestin", "Griffith", "47900", "Micronesia" ], + [ "927", "Kato", "Reeves", "93779", "Uruguay" ], + [ "928", "Jonah", "Suarez", "13708", "Spain" ], + [ "929", "Adam", "Lynn", "E1P 1L3", "Indonesia" ], + [ "930", "Quinn", "Mckinney", "99683", "Faroe Islands" ], + [ "931", "Whilemina", "Macias", "32145", "Iceland" ], + [ "932", "Gillian", "Osborne", "L3L 6G0", "Italy" ], + [ "933", "Venus", "Zamora", "28318", "Comoros" ], + [ "934", "Allegra", "Eaton", "P5X 9S0", "Antarctica" ], + [ "935", "Driscoll", "Preston", "R3L 9R0", "Niue" ], + [ "936", "Joel", "Spencer", "12006", "Monaco" ], + [ "937", "Lucius", "Sharp", "B8V 6U7", "Dominica" ], + [ "938", "Curran", "Robinson", "82216", "Romania" ], + [ "939", "Kerry", "Espinoza", "N4B 7Q1", "Guatemala" ], + [ "940", "Isaac", "Kline", "85674", "Costa Rica" ], + [ "941", "Neil", "Harrison", "I5A 2S2", "Greenland" ], + [ "942", "Ezra", "Rodriguez", "D6P 5Q3", "Angola" ], + [ "943", "Galvin", "Jefferson", "D6H 7G0", "Macedonia" ], + [ "944", "Joseph", "Hahn", "Z8V 9B5", "Uganda" ], + [ "945", "Naida", "Hammond", "40105", "Philippines" ], + [ "946", "Brenna", "Everett", "41704", "Indonesia" ], + [ "947", "Rae", "Parks", "79077", "Sweden" ], + [ "948", "Jessica", "Richard", "Y3I 5R3", "Uganda" ], + [ "949", "Rachel", "Marks", "16157", "Cameroon" ], + [ "950", "Maxwell", "Ferguson", "V6A 6M0", "Ukraine" ], + [ "951", "Alyssa", "Beard", "13936", "Antarctica" ], + [ "952", "Camille", "Gill", "V9Q 9P7", "New Caledonia" ], + [ "953", "Cora", "Bond", "M9X 1A4", "Seychelles" ], + [ "954", "Peter", "Acosta", "07937", "Chile" ], + [ "955", "Ella", "Poole", "A3F 9Z1", "Panama" ], + [ "956", "Ashely", "Guerrero", "37436", "Central African Republic" ], + [ "957", "Mikayla", "Johnston", "L9W 5T8", "Cameroon" ], + [ "958", "Ora", "Weaver", "65897", "Turks and Caicos Islands" ], + [ "959", "Timon", "Barnes", "R6J 1J7", "Djibouti" ], + [ "960", "Jamalia", "Wade", "22211", "United States" ], + [ "961", "Bradley", "Haney", "K1H 1Q1", "Western Sahara" ], + [ "962", "Lance", "Le", "H4R 9T7", "Botswana" ], + [ "963", "Ethan", "Rich", "T8N 1C6", "Netherlands" ], + [ "964", "Jeanette", "Carver", "G1E 5C8", "Cook Islands" ], + [ "965", "Ocean", "Marquez", "15084", "Pakistan" ], + [ "966", "Ifeoma", "Cleveland", "R9D 6M1", "French Guiana" ], + [ "967", "Sylvia", "Herring", "U4R 8P1", "Thailand" ], + [ "968", "Clare", "Huffman", "Q5G 2Q0", "Niger" ], + [ "969", "Colton", "Leach", "V3F 9W6", "Syrian Arab Republic" ], + [ "970", "Maryam", "Hoover", "Y7U 6N3", "Slovakia" ], + [ "971", "Nola", "Snider", "54275", "Bosnia and Herzegovina" ], + [ "972", "Kameko", "Cote", "M3C 8N0", "Cambodia" ], + [ "973", "Julian", "Pugh", "B6E 7J7", "Mauritania" ], + [ "974", "Xena", "Lott", "52294", "Estonia" ], + [ "975", "Fuller", "Kirk", "65396", "Qatar" ], + [ "976", "Lance", "Knox", "78074", "Serbia and Montenegro" ], + [ "977", "Hedwig", "Beck", "T5P 4C8", "Dominican Republic" ], + [ "978", "Martena", "Diaz", "65420", "Saint Pierre and Miquelon" ], + [ "979", "Shafira", "David", "74843", "Senegal" ], + [ "980", "Shafira", "Clark", "T6F 5C7", "Mongolia" ], + [ "981", "Georgia", "Booth", "28183", "Japan" ], + [ "982", "Cameron", "Austin", "I2J 1R1", "Bahrain" ], + [ "983", "Vanna", "Hyde", "82434", "Croatia" ], + [ "984", "Deanna", "Park", "68486", "Zimbabwe" ], + [ "985", "Grady", "Freeman", "U4O 1Q9", "Belarus" ], + [ "986", "Sandra", "Knapp", "31413", "Sudan" ], + [ "987", "Dorian", "Joseph", "90768", "Lithuania" ], + [ "988", "Adria", "Bonner", "15899", "Mongolia" ], + [ "989", "Sebastian", "Guzman", "G9L 9G5", "Yemen" ], + [ "990", "Angelica", "Puckett", "W8D 8W8", "Virgin Islands, U.S." ], + [ "991", "Connor", "Parks", "26175", "Virgin Islands, U.S." ], + [ "992", "Yardley", "Griffith", "H3L 2U3", "Saint Pierre and Miquelon" ], + [ "993", "Charissa", "Beck", "30611", "Zambia" ], + [ "994", "Calvin", "Russo", "79906", "Chile" ], + [ "995", "Yoshi", "Durham", "N2J 8M8", "China" ], + [ "996", "Finn", "Buck", "Q9F 9Z8", "Iraq" ], + [ "997", "Kessie", "Holden", "C4A 1J0", "Syrian Arab Republic" ], + [ "998", "Chloe", "Richards", "63091", "Canada" ], + [ "999", "Uriel", "Snyder", "95487", "Pakistan" ], + [ "1000", "Maite", "Cash", "90705", "Syrian Arab Republic" ], + [ "1001", "Cameron", "Schwartz", "82778", "Taiwan, Province of China" ], + [ "1002", "Faith", "Jimenez", "J6K 2P9", "Saint Pierre and Miquelon" ], + [ "1003", "Otto", "Hancock", "34535", "Andorra" ], + [ "1004", "Harlan", "Blackwell", "N8Y 4E6", "Qatar" ], + [ "1005", "Fitzgerald", "Gilliam", "Y9J 6J5", "Burkina Faso" ], + [ "1006", "Lev", "Ballard", "01956", "American Samoa" ], + [ "1007", "Freya", "Brown", "01190", "Portugal" ], + [ "1008", "Harding", "Osborn", "14814", "San Marino" ], + [ "1009", "Alexander", "Howard", "81842", "Reunion" ], + [ "1010", "Ori", "Marsh", "77738", "Saint Helena" ], + [ "1011", "Brennan", "Rich", "18690", "Cambodia" ], + [ "1012", "Dawn", "Christensen", "Y8F 7R3", "Mali" ], + [ "1013", "Ahmed", "Pearson", "62230", "Sudan" ], + [ "1014", "Tanek", "Head", "25744", "Kiribati" ], + [ "1015", "Meredith", "Cantu", "E6X 2L1", "Kenya" ], + [ "1016", "Levi", "Fisher", "I9Y 9G2", "Djibouti" ], + [ "1017", "Katell", "Cameron", "10278", "Denmark" ], + [ "1018", "Ina", "Orr", "P7H 2O3", "Congo" ], + [ "1019", "Beck", "Hayden", "15115", "Saint Lucia" ], + [ "1020", "Cassady", "Wagner", "R9H 8C5", "Estonia" ], + [ "1021", "Amena", "Herrera", "13286", "Bahrain" ], + [ "1022", "Tarik", "Gross", "C3X 3W0", "Azerbaijan" ], + [ "1023", "Marshall", "Collier", "13416", "Dominica" ], + [ "1024", "Kirestin", "Callahan", "15429", "Micronesia" ], + [ "1025", "Sasha", "Rice", "O6H 6X2", "Denmark" ], + [ "1026", "Ross", "Gonzalez", "D3B 3R5", "Sudan" ], + [ "1027", "Veda", "Arnold", "56611", "Swaziland" ], + [ "1028", "Ferdinand", "Macias", "P1Q 3I2", "Colombia" ], + [ "1029", "Mohammad", "Reed", "74005", "Bhutan" ], + [ "1030", "Reagan", "Sandoval", "19275", "Pitcairn" ], + [ "1031", "Debra", "Nelson", "85945", "Ukraine" ], + [ "1032", "Cleo", "Robertson", "84072", "Guadeloupe" ], + [ "1033", "Tanya", "Vance", "C1F 7F1", "Romania" ], + [ "1034", "Desirae", "Wooten", "74659", "Mongolia" ], + [ "1035", "Hiram", "Estes", "Q5Z 5A0", "Namibia" ], + [ "1036", "Medge", "Weiss", "67079", "Azerbaijan" ], + [ "1037", "Hu", "Chase", "87562", "Cuba" ], + [ "1038", "Shafira", "Everett", "18983", "Georgia" ], + [ "1039", "Mannix", "Lamb", "45542", "Venezuela" ], + [ "1040", "Germaine", "Harvey", "I9G 1U0", "Falkland Islands (Malvinas)" ], + [ "1041", "Brenna", "Leonard", "55573", "New Zealand" ], + [ "1042", "Kylie", "Rivas", "U9J 3O9", "Djibouti" ], + [ "1043", "Alexandra", "Rich", "T4O 6S6", "Cuba" ], + [ "1044", "Dorian", "Spears", "00456", "Brazil" ], + [ "1045", "Laurel", "Abbott", "45449", "Switzerland" ], + [ "1046", "Gabriel", "Drake", "U1S 5O2", "Trinidad and Tobago" ], + [ "1047", "Priscilla", "Mercer", "01401", "Serbia and Montenegro" ], + [ "1048", "Darius", "Hoffman", "49694", "Greece" ], + [ "1049", "Caesar", "Patton", "42322", "Suriname" ], + [ "1050", "Susan", "Clayton", "W1G 5C3", "Maldives" ], + [ "1051", "Zane", "Dunlap", "73722", "Oman" ], + [ "1052", "Leah", "Fuentes", "60412", "Luxembourg" ], + [ "1053", "Yardley", "Hansen", "03194", "Mauritius" ], + [ "1054", "Ingrid", "Talley", "37315", "Solomon Islands" ], + [ "1055", "Demetria", "Evans", "30587", "Tajikistan" ], + [ "1056", "Ignacia", "Alford", "01282", "Bouvet Island" ], + [ "1057", "Destiny", "Wade", "L5R 3V3", "Uganda" ], + [ "1058", "Alden", "Mason", "V7D 2V6", "Dominican Republic" ], + [ "1059", "Pamela", "Wilcox", "L1I 6I1", "Canada" ], + [ "1060", "Melvin", "Buckley", "05478", "Hungary" ], + [ "1061", "Eve", "Holcomb", "B6B 8T1", "Cook Islands" ], + [ "1062", "Arthur", "Weeks", "R5P 7U2", "Bangladesh" ], + [ "1063", "Marah", "Levine", "10075", "Somalia" ], + [ "1064", "Keiko", "Freeman", "90950", "Faroe Islands" ], + [ "1065", "Dorian", "Rose", "T5M 4Z0", "Fiji" ], + [ "1066", "Desirae", "Velez", "T4E 8K2", "Afghanistan" ], + [ "1067", "Rebekah", "Lucas", "T9A 8V5", "Tunisia" ], + [ "1068", "Sylvester", "Copeland", "W6R 3B6", "Jamaica" ], + [ "1069", "Alea", "Preston", "31050", "Netherlands Antilles" ], + [ "1070", "Aphrodite", "Gordon", "T7C 6T8", "Sao Tome and Principe" ], + [ "1071", "Yael", "Delaney", "G9W 9P1", "Mexico" ], + [ "1072", "Sierra", "Perez", "R3O 8H0", "Slovenia" ], + [ "1073", "Avram", "Briggs", "05221", "Norfolk Island" ], + [ "1074", "Troy", "Poole", "W7Q 8O5", "Malta" ], + [ "1075", "Gavin", "Sandoval", "37352", "Greece" ], + [ "1076", "Nerea", "Stokes", "N2Q 6S9", "United States" ], + [ "1077", "Genevieve", "Ramirez", "53829", "Mali" ], + [ "1078", "Oliver", "Boone", "M1Q 8V9", "Bolivia" ], + [ "1079", "Lars", "Ramirez", "L2R 6V2", "Bosnia and Herzegovina" ], + [ "1080", "Abbot", "Horton", "R1R 1V8", "Netherlands Antilles" ], + [ "1081", "Abra", "Avila", "41608", "Congo" ], + [ "1082", "Candice", "Christian", "13930", "Faroe Islands" ], + [ "1083", "Flavia", "Miranda", "93964", "Estonia" ], + [ "1084", "Medge", "Drake", "Q7C 2E2", "Belize" ], + [ "1085", "Lee", "Montgomery", "H3T 4Q6", "Costa Rica" ], + [ "1086", "Aline", "Ratliff", "99839", "Macao" ], + [ "1087", "Shafira", "Fox", "A9S 7C8", "Palestinian Territory, Occupied" ], + [ "1088", "Orson", "Greene", "K9L 7R8", "Myanmar" ], + [ "1089", "Henry", "Joyner", "55853", "South Africa" ], + [ "1090", "Keely", "Boyer", "08996", "Liberia" ], + [ "1091", "Jerome", "Jones", "31770", "Saint Lucia" ], + [ "1092", "Hermione", "Dunlap", "U2R 7R2", "Moldova" ], + [ "1093", "Lenore", "Powers", "73772", "Tunisia" ], + [ "1094", "Alden", "Newman", "V4C 3O8", "Bhutan" ], + [ "1095", "Jasper", "Blevins", "K2H 5W0", "Paraguay" ], + [ "1096", "Robert", "Bender", "R5F 1H9", "Philippines" ], + [ "1097", "Bo", "Richard", "N5R 6T2", "Trinidad and Tobago" ], + [ "1098", "Iliana", "Mcpherson", "23758", "Bangladesh" ], + [ "1099", "Alfreda", "Camacho", "35387", "Saint Helena" ], + [ "1100", "Kirsten", "Giles", "14079", "Romania" ], + [ "1101", "Harlan", "Crawford", "84847", "French Polynesia" ], + [ "1102", "Wynne", "Bauer", "W9D 6F6", "Kazakhstan" ], + [ "1103", "Connor", "Melton", "E2F 4Q2", "Angola" ], + [ "1104", "Evelyn", "Barry", "I9H 8W7", "Turkmenistan" ], + [ "1105", "Barry", "Stephens", "07823", "Gibraltar" ], + [ "1106", "Ferris", "Farrell", "I7H 5Z6", "Saint Vincent and The Grenadines" ], + [ "1107", "Ursa", "Carr", "31124", "Chad" ], + [ "1108", "Laith", "Johnson", "10428", "Cyprus" ], + [ "1109", "Harlan", "Frank", "J6K 7I6", "Gambia" ], + [ "1110", "Gregory", "Ratliff", "P1C 8H2", "Chile" ], + [ "1111", "Rina", "Holloway", "Y7N 1E7", "Estonia" ], + [ "1112", "Maris", "Joyner", "T6R 2H9", "France" ], + [ "1113", "Galvin", "Webster", "V8E 9U4", "Croatia" ], + [ "1114", "Farrah", "Bean", "H2B 8E2", "Palestinian Territory, Occupied" ], + [ "1115", "Martha", "Schroeder", "14485", "Georgia" ], + [ "1116", "Mari", "Boone", "D4C 1Q0", "Comoros" ], + [ "1117", "Nadine", "Mercado", "35046", "Syrian Arab Republic" ], + [ "1118", "Isadora", "Keith", "R5H 8Y7", "Mayotte" ], + [ "1119", "Quinn", "William", "V8Q 3Y6", "India" ], + [ "1120", "Justina", "Gilbert", "11271", "Yemen" ], + [ "1121", "Jordan", "Hull", "F4Z 7R8", "Lesotho" ], + [ "1122", "Mechelle", "Davenport", "A9Z 8P2", "Bermuda" ], + [ "1123", "Isabelle", "Webster", "60972", "Zimbabwe" ], + [ "1124", "Armand", "Butler", "Y3F 4H9", "Nicaragua" ], + [ "1125", "Herman", "Beach", "Q8N 6V3", "Cape Verde" ], + [ "1126", "Brianna", "Love", "D9B 2W8", "Sierra Leone" ], + [ "1127", "Joy", "Brown", "O7V 7C1", "Djibouti" ], + [ "1128", "Amena", "Moss", "P8D 1L9", "Andorra" ], + [ "1129", "Zeph", "Whitehead", "01513", "Tanzania, United Republic of" ], + [ "1130", "Logan", "Matthews", "73541", "Finland" ], + [ "1131", "Amela", "Gregory", "65323", "Swaziland" ], + [ "1132", "Zoe", "Owen", "V5L 5O6", "Zambia" ], + [ "1133", "September", "Hewitt", "R8K 4G9", "Congo" ], + [ "1134", "Holly", "Walter", "S2E 3M4", "Serbia and Montenegro" ], + [ "1135", "Zeph", "Beach", "J6Z 8B5", "Ecuador" ], + [ "1136", "Morgan", "Decker", "M9H 8I5", "Uruguay" ], + [ "1137", "Malcolm", "Maldonado", "S6F 8X6", "Netherlands" ], + [ "1138", "Fay", "Day", "B9R 1U7", "Seychelles" ], + [ "1139", "Charles", "Juarez", "62791", "Virgin Islands, U.S." ], + [ "1140", "Amery", "Stout", "L9A 1F8", "Central African Republic" ], + [ "1141", "Irene", "Ferrell", "52649", "Norway" ], + [ "1142", "Dean", "Stout", "N5C 2S8", "Uruguay" ], + [ "1143", "Eric", "Baxter", "82082", "Chile" ], + [ "1144", "Shelley", "Larsen", "Y4T 4P3", "Antarctica" ], + [ "1145", "Rigel", "Ellis", "E3S 6K8", "Zimbabwe" ], + [ "1146", "Maite", "Rosa", "F6C 5Q9", "Zambia" ], + [ "1147", "Serena", "Blanchard", "99373", "Estonia" ], + [ "1148", "Melanie", "Berger", "C5P 4E2", "Mozambique" ], + [ "1149", "Noah", "Spence", "B8H 7X7", "Martinique" ], + [ "1150", "Elliott", "Pierce", "W5B 8V7", "Swaziland" ], + [ "1151", "Ahmed", "Chang", "E9X 7J0", "Bulgaria" ], + [ "1152", "Ross", "Figueroa", "22458", "China" ], + [ "1153", "Gary", "Calderon", "V3C 4J8", "Algeria" ], + [ "1154", "Montana", "Franklin", "94093", "Haiti" ], + [ "1155", "Rae", "Curry", "45477", "Morocco" ], + [ "1156", "Jillian", "Hogan", "N8L 4B5", "Iceland" ], + [ "1157", "Mia", "Kaufman", "54758", "Burkina Faso" ], + [ "1158", "Remedios", "Wilkerson", "75420", "Saint Vincent and The Grenadines" ], + [ "1159", "Xanthus", "Baldwin", "13961", "Congo" ], + [ "1160", "Madeline", "Gates", "76351", "Saint Helena" ], + [ "1161", "Leroy", "Craig", "12770", "Finland" ], + [ "1162", "Melanie", "Carpenter", "C3B 8L4", "Mayotte" ], + [ "1163", "Ashely", "Mcneil", "E7E 9K5", "French Southern Territories" ], + [ "1164", "Karina", "Mcneil", "39956", "United Arab Emirates" ], + [ "1165", "Nina", "Mills", "92913", "Saint Kitts and Nevis" ], + [ "1166", "Ashton", "Singleton", "73890", "Libyan Arab Jamahiriya" ], + [ "1167", "Meghan", "Black", "31814", "Armenia" ], + [ "1168", "Jolene", "Pope", "U6K 7O6", "Venezuela" ], + [ "1169", "Abel", "Boyd", "37110", "Botswana" ], + [ "1170", "Tiger", "Coffey", "Y6P 3S4", "Faroe Islands" ], + [ "1171", "Aileen", "Rowe", "F7G 8D9", "Netherlands Antilles" ], + [ "1172", "Bryar", "Forbes", "T2N 5H6", "Saint Vincent and The Grenadines" ], + [ "1173", "Vera", "Hoffman", "36299", "Guadeloupe" ], + [ "1174", "Hadassah", "Wright", "S8J 5B2", "Peru" ], + [ "1175", "Bruce", "Blair", "Q8E 7K6", "Cape Verde" ], + [ "1176", "Brianna", "Wolf", "V8S 5A6", "Bahamas" ], + [ "1177", "Kimberley", "Reed", "17652", "Tajikistan" ], + [ "1178", "Colin", "Phelps", "42334", "Brunei Darussalam" ], + [ "1179", "Gil", "Britt", "U3N 6C2", "Swaziland" ], + [ "1180", "Hasad", "Pena", "09526", "United States" ], + [ "1181", "Violet", "Dixon", "48691", "Micronesia" ], + [ "1182", "Uriel", "Bowen", "Z7F 7A7", "Uzbekistan" ], + [ "1183", "Madeline", "Keller", "18227", "Iran, Islamic Republic of" ], + [ "1184", "Buffy", "Mckee", "23861", "Ethiopia" ], + [ "1185", "Doris", "Martin", "V8N 8O7", "Liberia" ], + [ "1186", "Mia", "Burke", "64582", "Virgin Islands, British" ], + [ "1187", "William", "Kemp", "63587", "Tuvalu" ], + [ "1188", "Stacy", "Quinn", "01390", "Nauru" ], + [ "1189", "Halla", "Solomon", "31138", "Pakistan" ], + [ "1190", "Kasimir", "Rodriguez", "67823", "Costa Rica" ], + [ "1191", "Davis", "Lawrence", "27918", "Rwanda" ], + [ "1192", "Nigel", "Bryan", "L5U 2U9", "Seychelles" ], + [ "1193", "Ivana", "Stone", "94862", "Niue" ], + [ "1194", "Naomi", "Yang", "68985", "Haiti" ], + [ "1195", "Roanna", "Brown", "51196", "India" ], + [ "1196", "Colorado", "Chavez", "45634", "Brazil" ], + [ "1197", "Illana", "Levy", "V1A 7R8", "Jordan" ], + [ "1198", "Ali", "Lowe", "N8K 1Y5", "Hungary" ], + [ "1199", "Virginia", "Witt", "Y3O 5W8", "Azerbaijan" ], + [ "1200", "Howard", "Flores", "I9C 3Q7", "Fiji" ], + [ "1201", "Walter", "Odom", "78418", "Thailand" ], + [ "1202", "Thor", "Craig", "00935", "Jamaica" ], + [ "1203", "Petra", "Barry", "E5L 5K5", "Finland" ], + [ "1204", "Lev", "Ellison", "I6S 1K1", "Mongolia" ], + [ "1205", "Roth", "Osborne", "15014", "Swaziland" ], + [ "1206", "Lucius", "Baldwin", "12766", "China" ], + [ "1207", "Candice", "Hyde", "B5E 4B8", "Bahamas" ], + [ "1208", "Maggy", "Bailey", "76781", "Northern Mariana Islands" ], + [ "1209", "Beatrice", "Gregory", "S5S 8S4", "Rwanda" ], + [ "1210", "Adrian", "Bowman", "58500", "Vanuatu" ], + [ "1211", "Brenden", "Chandler", "50326", "Thailand" ], + [ "1212", "Jada", "Richmond", "15990", "Saint Vincent and The Grenadines" ], + [ "1213", "Sawyer", "Page", "G2W 7R7", "Somalia" ], + [ "1214", "Haley", "Jordan", "U7X 4U2", "Equatorial Guinea" ], + [ "1215", "Ruby", "Watson", "30990", "Romania" ], + [ "1216", "Jocelyn", "Knowles", "78987", "Lebanon" ], + [ "1217", "Preston", "Stevenson", "F3L 9B3", "Mali" ], + [ "1218", "Kimberly", "Merritt", "38779", "Venezuela" ], + [ "1219", "Herrod", "Burke", "56225", "French Guiana" ], + [ "1220", "Solomon", "Shannon", "67980", "Cape Verde" ], + [ "1221", "Bradley", "Stokes", "10213", "Botswana" ], + [ "1222", "Grace", "Kinney", "67923", "Montserrat" ], + [ "1223", "Celeste", "Clark", "S7M 6I2", "Guatemala" ], + [ "1224", "Patricia", "Frank", "05615", "Venezuela" ], + [ "1225", "Madonna", "Alford", "10878", "Brunei Darussalam" ], + [ "1226", "May", "Rios", "N7O 2L0", "Georgia" ], + [ "1227", "Driscoll", "Roach", "Y7F 9F8", "Palestinian Territory, Occupied" ], + [ "1228", "Idona", "Cruz", "T6Q 8L4", "Iraq" ], + [ "1229", "Sydney", "Delacruz", "69511", "United Arab Emirates" ], + [ "1230", "Gillian", "Huff", "52624", "French Southern Territories" ], + [ "1231", "Minerva", "Rosario", "29195", "Andorra" ], + [ "1232", "Kerry", "Alvarado", "L3Q 2V5", "Portugal" ], + [ "1233", "Amos", "Bass", "26389", "Holy See (Vatican City State)" ], + [ "1234", "Deanna", "Parks", "57376", "Estonia" ], + [ "1235", "Fitzgerald", "Green", "M3P 9N2", "Slovenia" ], + [ "1236", "Sade", "Hinton", "35561", "Barbados" ], + [ "1237", "Suki", "Parsons", "44591", "Syrian Arab Republic" ], + [ "1238", "Orli", "Weeks", "K2W 9L4", "Peru" ], + [ "1239", "Nicholas", "Copeland", "I5W 7A4", "French Guiana" ], + [ "1240", "Guy", "Vang", "22277", "Pitcairn" ], + [ "1241", "Hunter", "Goodman", "72290", "Malaysia" ], + [ "1242", "Noble", "Rich", "I3B 6T9", "Gibraltar" ], + [ "1243", "Delilah", "Zamora", "96328", "New Zealand" ], + [ "1244", "Sybil", "Mercer", "93665", "Namibia" ], + [ "1245", "Scarlett", "Brock", "Z2E 3J2", "Central African Republic" ], + [ "1246", "Channing", "Alexander", "W5V 8D2", "San Marino" ], + [ "1247", "Carolyn", "Boyle", "Q5Z 9E6", "Gabon" ], + [ "1248", "Irene", "Jennings", "F3H 4O6", "Saint Helena" ], + [ "1249", "Bianca", "Pratt", "66354", "Malaysia" ], + [ "1250", "Dexter", "Cole", "56106", "French Southern Territories" ], + [ "1251", "Berk", "Velez", "26759", "Lesotho" ], + [ "1252", "Barrett", "Richardson", "59446", "Cocos (Keeling) Islands" ], + [ "1253", "Scarlet", "Jacobs", "G9A 7L6", "Dominica" ], + [ "1254", "Aiko", "Brooks", "R6R 9E4", "Liberia" ], + [ "1255", "Jacob", "Moore", "P2Y 6P3", "Cambodia" ], + [ "1256", "Madeline", "Bishop", "D4I 2E7", "Dominican Republic" ], + [ "1257", "Jarrod", "Evans", "C9O 7V7", "Taiwan, Province of China" ], + [ "1258", "Beverly", "Witt", "64850", "Denmark" ], + [ "1259", "Karyn", "Rhodes", "D6G 5Z3", "Cape Verde" ], + [ "1260", "Imani", "Quinn", "01897", "Macao" ], + [ "1261", "Athena", "Eaton", "03568", "Syrian Arab Republic" ], + [ "1262", "Raymond", "Valdez", "21037", "Romania" ], + [ "1263", "Christopher", "Ferguson", "64945", "Indonesia" ], + [ "1264", "Latifah", "Harris", "91381", "Suriname" ], + [ "1265", "Dacey", "Wagner", "81483", "Qatar" ], + [ "1266", "Summer", "Myers", "H6A 1G5", "Angola" ], + [ "1267", "Jasmine", "Rivera", "Y4W 8P2", "Virgin Islands, British" ], + [ "1268", "Cairo", "Massey", "Q6Y 7A7", "Poland" ], + [ "1269", "Jena", "Hill", "89480", "United States Minor Outlying Islands" ], + [ "1270", "Ava", "Benson", "L9H 8V1", "Sri Lanka" ], + [ "1271", "Gillian", "Mercado", "A9W 6V5", "Norway" ], + [ "1272", "Peter", "Marquez", "I5B 3W9", "Guyana" ], + [ "1273", "Price", "Coleman", "X8G 2S0", "Burkina Faso" ], + [ "1274", "Shana", "Harper", "L2B 3U9", "Malaysia" ], + [ "1275", "Serina", "Matthews", "58061", "Lithuania" ], + [ "1276", "Aretha", "Bryant", "Y8J 7A5", "Tonga" ], + [ "1277", "Wesley", "Craig", "20141", "Australia" ], + [ "1278", "Martena", "Mercer", "P6X 2L9", "Sudan" ], + [ "1279", "Tamara", "Dennis", "D3H 9R0", "Mali" ], + [ "1280", "Phelan", "Pena", "D2H 2H7", "United States Minor Outlying Islands" ], + [ "1281", "Rebecca", "Kinney", "B5Z 9S4", "Antarctica" ], + [ "1282", "Josephine", "Delgado", "81010", "Algeria" ], + [ "1283", "Kieran", "Estes", "70093", "Bermuda" ], + [ "1284", "Tamara", "Williamson", "90905", "French Guiana" ], + [ "1285", "Dora", "Serrano", "W8K 6R5", "Nauru" ], + [ "1286", "Morgan", "Bass", "B6F 8R2", "Madagascar" ], + [ "1287", "Margaret", "Austin", "D2C 2C1", "Belgium" ], + [ "1288", "Nasim", "Berry", "J9X 7M5", "Heard Island and Mcdonald Islands" ], + [ "1289", "Jelani", "Rutledge", "34552", "Bolivia" ], + [ "1290", "Cassady", "Hardin", "I2K 4H6", "Hong Kong" ], + [ "1291", "Jenette", "Thornton", "44943", "Uganda" ], + [ "1292", "Alexandra", "Sims", "93937", "Australia" ], + [ "1293", "Ross", "Higgins", "61993", "Nicaragua" ], + [ "1294", "Penelope", "Henson", "90344", "Trinidad and Tobago" ], + [ "1295", "Yoshi", "Blackwell", "C8D 1T4", "Costa Rica" ], + [ "1296", "Daria", "Rodriquez", "X3C 6L0", "Iceland" ], + [ "1297", "Wesley", "Waller", "43947", "Myanmar" ], + [ "1298", "Adam", "Hayden", "88969", "Italy" ], + [ "1299", "Charity", "William", "46439", "Greece" ], + [ "1300", "Ronan", "Hopper", "51955", "Zambia" ], + [ "1301", "Geraldine", "Hatfield", "W9S 7T5", "Luxembourg" ], + [ "1302", "Barry", "Nicholson", "79625", "Liechtenstein" ], + [ "1303", "Donovan", "Ortiz", "68119", "Macao" ], + [ "1304", "Jeanette", "Cooper", "D5P 9L2", "Sri Lanka" ], + [ "1305", "Isadora", "Stephenson", "P4X 4H5", "Mauritania" ], + [ "1306", "Hall", "Hays", "J2Z 2H1", "Svalbard and Jan Mayen" ], + [ "1307", "Idola", "Roberson", "89249", "Niue" ], + [ "1308", "Olympia", "Dennis", "69498", "Guinea" ], + [ "1309", "Naida", "Palmer", "19840", "Gambia" ], + [ "1310", "Maxine", "Rollins", "87856", "Belize" ], + [ "1311", "Rooney", "Phelps", "48424", "Italy" ], + [ "1312", "Shelly", "Edwards", "O7O 1U4", "Mali" ], + [ "1313", "Cassidy", "Holcomb", "98785", "Colombia" ], + [ "1314", "Sybil", "Moran", "F3C 6E4", "Switzerland" ], + [ "1315", "Mufutau", "Larson", "00276", "British Indian Ocean Territory" ], + [ "1316", "Fiona", "Bryant", "U7Y 7N6", "Cocos (Keeling) Islands" ], + [ "1317", "Lenore", "Boyle", "H5G 6P9", "Sudan" ], + [ "1318", "Ignacia", "Avila", "Y5M 1S2", "Romania" ], + [ "1319", "Wendy", "Stein", "25422", "Taiwan, Province of China" ], + [ "1320", "Garrison", "Bass", "B9J 6D9", "Romania" ], + [ "1321", "Curran", "Roy", "X2F 4P2", "Taiwan, Province of China" ], + [ "1322", "Oliver", "Beach", "N6J 1C5", "Kazakhstan" ], + [ "1323", "Bo", "Duran", "D5C 5C2", "Eritrea" ], + [ "1324", "Tashya", "Morrow", "N2J 7O9", "Rwanda" ], + [ "1325", "Cheryl", "Powell", "72413", "Niger" ], + [ "1326", "Justin", "Roth", "18779", "Brunei Darussalam" ], + [ "1327", "Nathaniel", "Foster", "04955", "Bermuda" ], + [ "1328", "Candace", "Nunez", "G7Z 1N2", "Moldova" ], + [ "1329", "Nero", "West", "K3Q 6B3", "Myanmar" ], + [ "1330", "Brendan", "Mcintyre", "C4E 5H7", "Argentina" ], + [ "1331", "Chaney", "Stafford", "V3X 8J4", "Benin" ], + [ "1332", "Sylvia", "Velez", "95851", "Iraq" ], + [ "1333", "Azalia", "Castro", "55986", "Israel" ], + [ "1334", "Emily", "Hogan", "74667", "Botswana" ], + [ "1335", "Buckminster", "Hurst", "N9C 2X6", "Reunion" ], + [ "1336", "Rinah", "Rodriquez", "31896", "Guinea-bissau" ], + [ "1337", "Nash", "Barnett", "Y8X 7H5", "China" ], + [ "1338", "Xanthus", "Barker", "11212", "Trinidad and Tobago" ], + [ "1339", "Minerva", "Huber", "M6M 9U3", "Equatorial Guinea" ], + [ "1340", "Kaseem", "Tillman", "86565", "Bulgaria" ], + [ "1341", "Cassidy", "Dejesus", "93205", "Sierra Leone" ], + [ "1342", "Sheila", "Munoz", "26473", "Benin" ], + [ "1343", "Florence", "Yates", "M5O 1J1", "Russian Federation" ], + [ "1344", "Isadora", "Wagner", "88381", "Philippines" ], + [ "1345", "Hilel", "Kramer", "E5D 4F5", "Lebanon" ], + [ "1346", "Stewart", "Lawson", "67313", "Malaysia" ], + [ "1347", "Ira", "Duffy", "52841", "Greece" ], + [ "1348", "Ignatius", "Robinson", "10035", "Russian Federation" ], + [ "1349", "Baxter", "Carroll", "92288", "Albania" ], + [ "1350", "Palmer", "James", "N5X 5B1", "Germany" ], + [ "1351", "Ava", "Eaton", "76497", "Egypt" ], + [ "1352", "Kiona", "Smith", "09402", "Belize" ], + [ "1353", "Brian", "Barlow", "00156", "Panama" ], + [ "1354", "Nolan", "Rosa", "J2O 9W2", "Uruguay" ], + [ "1355", "Teegan", "Burnett", "02401", "Italy" ], + [ "1356", "Erin", "Knox", "95496", "Egypt" ], + [ "1357", "Amela", "Sanford", "59890", "Virgin Islands, U.S." ], + [ "1358", "Quemby", "Hensley", "17698", "Tuvalu" ], + [ "1359", "Ava", "York", "J1M 1A0", "Nigeria" ], + [ "1360", "Vivien", "Ware", "N9S 1W6", "Bahamas" ], + [ "1361", "Nyssa", "Lamb", "97964", "Estonia" ], + [ "1362", "Brenna", "Slater", "L4P 5V6", "British Indian Ocean Territory" ], + [ "1363", "Kennan", "Larsen", "M2A 4X0", "Angola" ], + [ "1364", "Linda", "Luna", "P8C 4S8", "Gambia" ], + [ "1365", "Boris", "Poole", "U7J 4G1", "Aruba" ], + [ "1366", "Lyle", "Cote", "F5J 3Y2", "Somalia" ], + [ "1367", "Oleg", "Knapp", "K4C 5T8", "Guinea" ], + [ "1368", "Hanae", "Brown", "51395", "Nepal" ], + [ "1369", "India", "Hyde", "E8P 7E8", "Belize" ], + [ "1370", "Madeson", "Hodge", "23265", "Gambia" ], + [ "1371", "Thaddeus", "Hester", "Y7S 5W1", "Saint Helena" ], + [ "1372", "Aaron", "Kemp", "A1Q 8R3", "Albania" ], + [ "1373", "Aurelia", "Thornton", "P8T 9D4", "Swaziland" ], + [ "1374", "Preston", "Sharpe", "97472", "Niue" ], + [ "1375", "Grace", "Gregory", "51767", "Burkina Faso" ], + [ "1376", "Nicole", "Hicks", "81040", "Burkina Faso" ], + [ "1377", "Hall", "Randall", "X1C 7A8", "Cambodia" ], + [ "1378", "Burke", "Silva", "57219", "Romania" ], + [ "1379", "Talon", "Kline", "28200", "Argentina" ], + [ "1380", "Cassady", "Duncan", "Y2M 8F5", "Kenya" ], + [ "1381", "Brielle", "Reed", "06254", "Greece" ], + [ "1382", "Claire", "Stein", "50289", "Viet Nam" ], + [ "1383", "Fleur", "Cabrera", "30131", "Indonesia" ], + [ "1384", "Ella", "Ellison", "Q7Q 4R2", "Netherlands Antilles" ], + [ "1385", "Zachery", "Wolf", "A9Q 6A8", "Jamaica" ], + [ "1386", "Emerson", "Brewer", "Y4R 9M9", "Bosnia and Herzegovina" ], + [ "1387", "Sarah", "Brooks", "27281", "Pitcairn" ], + [ "1388", "Kylan", "Garrison", "S8E 7L8", "Djibouti" ], + [ "1389", "Guinevere", "Mills", "75612", "Comoros" ], + [ "1390", "Claudia", "Stevenson", "73390", "Colombia" ], + [ "1391", "Valentine", "Burton", "Z9P 7R8", "Nauru" ], + [ "1392", "Raymond", "Mclean", "L8W 2K5", "Brunei Darussalam" ], + [ "1393", "Juliet", "Combs", "88712", "Samoa" ], + [ "1394", "Lawrence", "Williamson", "32528", "Netherlands Antilles" ], + [ "1395", "Inga", "Rivers", "12850", "Kuwait" ], + [ "1396", "Mira", "Zimmerman", "D1I 1W2", "Ireland" ], + [ "1397", "Hilda", "Stafford", "11054", "Cuba" ], + [ "1398", "Tanek", "Kim", "88590", "Cayman Islands" ], + [ "1399", "Bryar", "Mcintyre", "H6F 4S5", "Russian Federation" ], + [ "1400", "Sean", "Reed", "P2V 8J9", "Malta" ], + [ "1401", "Serena", "Henderson", "Z5C 8A0", "Madagascar" ], + [ "1402", "Hedley", "Parks", "L8S 6F4", "Angola" ], + [ "1403", "Alice", "Quinn", "06084", "Senegal" ], + [ "1404", "Linda", "Burgess", "H1E 7C0", "Turkmenistan" ], + [ "1405", "Hilda", "Burns", "Q9Q 4S2", "Kyrgyzstan" ], + [ "1406", "Griffith", "Watts", "D4J 7N2", "United States Minor Outlying Islands" ], + [ "1407", "Camden", "Glenn", "12939", "Russian Federation" ], + [ "1408", "Tallulah", "Rush", "G9V 3N2", "Turkey" ], + [ "1409", "Hasad", "Salinas", "H3F 7P9", "Cameroon" ], + [ "1410", "Violet", "Chavez", "T2H 9C6", "Virgin Islands, U.S." ], + [ "1411", "Declan", "Hurley", "32614", "Iran, Islamic Republic of" ], + [ "1412", "Robin", "Dean", "34266", "Northern Mariana Islands" ], + [ "1413", "Mariko", "Avila", "B8F 8Y5", "Burundi" ], + [ "1414", "Bradley", "Pugh", "11453", "Sri Lanka" ], + [ "1415", "Herman", "Hernandez", "F3C 6S2", "Chile" ], + [ "1416", "Montana", "Wynn", "B3M 8M2", "Aruba" ], + [ "1417", "Erin", "Melton", "17022", "France" ], + [ "1418", "Zachery", "Small", "L5O 7O1", "French Southern Territories" ], + [ "1419", "Melanie", "Rivera", "07922", "Korea" ], + [ "1420", "Blossom", "Chase", "75493", "Mauritius" ], + [ "1421", "Stephanie", "Taylor", "U8K 3I9", "Bahamas" ], + [ "1422", "Carter", "Fulton", "T4F 8D1", "Turks and Caicos Islands" ], + [ "1423", "Celeste", "Medina", "75629", "Lebanon" ], + [ "1424", "Katell", "Guzman", "15409", "United Arab Emirates" ], + [ "1425", "Howard", "Rowland", "29003", "Liberia" ], + [ "1426", "Reece", "Taylor", "W8G 7P7", "Samoa" ], + [ "1427", "Bradley", "Peterson", "52568", "Singapore" ], + [ "1428", "Ulric", "Hancock", "07437", "Bolivia" ], + [ "1429", "Francis", "Rogers", "15904", "Albania" ], + [ "1430", "Tatiana", "Mccray", "19604", "Belize" ], + [ "1431", "Merrill", "Rowe", "68539", "Ethiopia" ], + [ "1432", "Kiara", "Taylor", "F6D 8V7", "Burkina Faso" ], + [ "1433", "Buffy", "Shannon", "61880", "Kiribati" ], + [ "1434", "Amber", "Farmer", "K5F 1J7", "Barbados" ], + [ "1435", "Blake", "Wilkins", "O1L 2G2", "Virgin Islands, U.S." ], + [ "1436", "Aimee", "Fulton", "18626", "Chad" ], + [ "1437", "Kai", "Montgomery", "U6S 4W7", "Costa Rica" ], + [ "1438", "Latifah", "Bell", "74589", "Chad" ], + [ "1439", "Ronan", "Herring", "01710", "Palestinian Territory, Occupied" ], + [ "1440", "Macy", "Skinner", "78054", "Gibraltar" ], + [ "1441", "Ignatius", "Berg", "59756", "Liechtenstein" ], + [ "1442", "Prescott", "Pratt", "V6H 6P4", "Kuwait" ], + [ "1443", "Deborah", "Hebert", "11480", "Liberia" ], + [ "1444", "Quentin", "Jones", "G8W 8U6", "Slovenia" ], + [ "1445", "Duncan", "Parsons", "Z9F 5G8", "Cambodia" ], + [ "1446", "Sheila", "George", "18033", "Trinidad and Tobago" ], + [ "1447", "Alyssa", "Padilla", "V3O 6C3", "Qatar" ], + [ "1448", "Amelia", "Orr", "51943", "Canada" ], + [ "1449", "Bethany", "Thomas", "33451", "Liberia" ], + [ "1450", "Kellie", "Pitts", "G4S 1Q3", "Panama" ], + [ "1451", "Stone", "Stout", "L4C 9N0", "Latvia" ], + [ "1452", "Brynne", "Bailey", "B1M 4O0", "Ukraine" ], + [ "1453", "Aquila", "Hurley", "41312", "United Kingdom" ], + [ "1454", "David", "Bradshaw", "11152", "Denmark" ], + [ "1455", "Ryan", "Gates", "Z7O 1U0", "Austria" ], + [ "1456", "Kyle", "Weber", "39871", "Guyana" ], + [ "1457", "Declan", "Moore", "K3B 6L2", "Gibraltar" ], + [ "1458", "Theodore", "Hickman", "W8E 6K1", "Mauritius" ], + [ "1459", "Rebekah", "Merritt", "44042", "Mauritania" ], + [ "1460", "Meredith", "Powell", "98238", "Bhutan" ], + [ "1461", "Paki", "Simmons", "34122", "Norway" ], + [ "1462", "Carissa", "Ballard", "20095", "Antarctica" ], + [ "1463", "James", "Wilson", "96376", "Venezuela" ], + [ "1464", "Pamela", "Gamble", "U7F 7B6", "Turkmenistan" ], + [ "1465", "Rogan", "Davenport", "E6S 4R7", "French Polynesia" ], + [ "1466", "Daphne", "Pearson", "G2H 9M0", "American Samoa" ], + [ "1467", "Maxwell", "Nash", "87205", "Guadeloupe" ], + [ "1468", "Hayes", "Salazar", "55712", "American Samoa" ], + [ "1469", "Justin", "Conner", "03924", "United Kingdom" ], + [ "1470", "Blythe", "Joyner", "T6H 3M0", "Montserrat" ], + [ "1471", "Herrod", "Spears", "19474", "Philippines" ], + [ "1472", "Yvette", "Joyce", "R7Y 7B8", "Botswana" ], + [ "1473", "Chloe", "Reid", "K4Y 1R2", "Philippines" ], + [ "1474", "MacKensie", "Branch", "J5E 3X8", "Saint Kitts and Nevis" ], + [ "1475", "Nasim", "Buchanan", "M4E 4D2", "Portugal" ], + [ "1476", "Aileen", "Rasmussen", "H2V 3F4", "Dominica" ], + [ "1477", "Nicole", "Mullins", "U6Q 9X5", "New Caledonia" ], + [ "1478", "David", "Luna", "11935", "Svalbard and Jan Mayen" ], + [ "1479", "Germaine", "Massey", "G3N 4C7", "Colombia" ], + [ "1480", "Matthew", "Knowles", "V4D 4Z0", "Turkey" ], + [ "1481", "Timon", "Rowe", "14024", "Morocco" ], + [ "1482", "Gail", "Young", "68293", "Bhutan" ], + [ "1483", "Mariam", "Mejia", "O3P 4Q7", "Singapore" ], + [ "1484", "Carla", "Norris", "D7A 3F1", "Liberia" ], + [ "1485", "Ainsley", "Donaldson", "H4Z 1Q8", "Tanzania, United Republic of" ], + [ "1486", "Avye", "Raymond", "44808", "Namibia" ], + [ "1487", "Amanda", "Sargent", "O7F 3S4", "Afghanistan" ], + [ "1488", "Tiger", "Chambers", "I3K 7H4", "United States" ], + [ "1489", "Dylan", "Ford", "04043", "Solomon Islands" ], + [ "1490", "Kaitlin", "Franklin", "99451", "Namibia" ], + [ "1491", "Hayes", "Craft", "D6H 4Y6", "Christmas Island" ], + [ "1492", "Nolan", "Sullivan", "31246", "United States Minor Outlying Islands" ], + [ "1493", "Jennifer", "Romero", "E7I 1R7", "Latvia" ], + [ "1494", "Deanna", "Wall", "36109", "Nepal" ], + [ "1495", "Dara", "Valenzuela", "18359", "Martinique" ], + [ "1496", "Iris", "Blanchard", "84392", "Turks and Caicos Islands" ], + [ "1497", "Rhea", "Burgess", "T7Y 7C5", "Liberia" ], + [ "1498", "Karina", "Small", "B2F 2X5", "Bermuda" ], + [ "1499", "Victor", "Case", "49492", "Vanuatu" ], + [ "1500", "Rose", "Terry", "B4G 8I0", "Timor-leste" ], + [ "1501", "Wyatt", "Berg", "K3B 5N2", "Vanuatu" ], + [ "1502", "Zephania", "Herrera", "E6R 2A5", "Romania" ], + [ "1503", "Felix", "Johns", "X8U 2P1", "Angola" ], + [ "1504", "Melyssa", "George", "M4J 5X8", "Uzbekistan" ], + [ "1505", "Robert", "Spears", "61322", "Papua New Guinea" ], + [ "1506", "Myra", "Wood", "50638", "Afghanistan" ], + [ "1507", "Sean", "Kerr", "40094", "Guadeloupe" ], + [ "1508", "Wesley", "Mcclain", "H7F 1H3", "Mongolia" ], + [ "1509", "Ishmael", "Hoover", "42503", "Czech Republic" ], + [ "1510", "Ocean", "Parker", "L3Z 8G0", "Guyana" ], + [ "1511", "Berk", "Clay", "B6Q 7V7", "Botswana" ], + [ "1512", "Daquan", "Harrison", "78004", "Niger" ], + [ "1513", "Ramona", "Burris", "66986", "Palau" ], + [ "1514", "Jaden", "Miranda", "80086", "Madagascar" ], + [ "1515", "Solomon", "Kirk", "R7M 3M3", "Slovenia" ], + [ "1516", "Tanek", "Rosales", "X5B 5D0", "Tonga" ], + [ "1517", "Jack", "Cooke", "46356", "French Southern Territories" ], + [ "1518", "Naomi", "Sykes", "76541", "Marshall Islands" ], + [ "1519", "Moana", "Vinson", "K4R 3U7", "Saint Pierre and Miquelon" ], + [ "1520", "Kaye", "Sweet", "S6S 2G0", "Dominican Republic" ], + [ "1521", "Bruno", "Beard", "20686", "Israel" ], + [ "1522", "Helen", "Richards", "66393", "Argentina" ], + [ "1523", "Gisela", "Owens", "S8Q 4L3", "Haiti" ], + [ "1524", "Ivy", "Garrett", "P6G 8S8", "United Arab Emirates" ], + [ "1525", "Malik", "Osborne", "78332", "Tajikistan" ], + [ "1526", "Whoopi", "Franco", "T3T 5Y1", "Serbia and Montenegro" ], + [ "1527", "Basil", "Baker", "61233", "Cuba" ], + [ "1528", "Linda", "King", "31410", "Falkland Islands (Malvinas)" ], + [ "1529", "Allegra", "Hobbs", "F2C 9M8", "Andorra" ], + [ "1530", "Kirsten", "Elliott", "T8C 4X3", "Haiti" ], + [ "1531", "Joseph", "Ortiz", "40165", "Falkland Islands (Malvinas)" ], + [ "1532", "Pearl", "Mccormick", "93914", "Falkland Islands (Malvinas)" ], + [ "1533", "Fritz", "Austin", "A3S 7C8", "Canada" ], + [ "1534", "Lunea", "Hickman", "25676", "Cameroon" ], + [ "1535", "Inga", "Cortez", "14707", "Comoros" ], + [ "1536", "Claudia", "Long", "74877", "Tokelau" ], + [ "1537", "Judah", "Williamson", "S9N 6F0", "Paraguay" ], + [ "1538", "Eve", "Beasley", "K8Z 5H7", "Honduras" ], + [ "1539", "Tad", "Lang", "29577", "Equatorial Guinea" ], + [ "1540", "Jack", "Lawson", "46631", "Costa Rica" ], + [ "1541", "Vaughan", "Barron", "N9L 9T4", "Chile" ], + [ "1542", "Solomon", "Bowman", "05734", "Cocos (Keeling) Islands" ], + [ "1543", "Nash", "Giles", "64600", "Denmark" ], + [ "1544", "Xander", "Eaton", "84933", "Bosnia and Herzegovina" ], + [ "1545", "Hanna", "Hull", "61062", "Namibia" ], + [ "1546", "Lee", "Gaines", "V7H 6H7", "Suriname" ], + [ "1547", "Brian", "Sutton", "60055", "Timor-leste" ], + [ "1548", "Azalia", "Henson", "D9J 8E4", "Antarctica" ], + [ "1549", "Russell", "Avila", "01774", "China" ], + [ "1550", "Marsden", "Leblanc", "30201", "New Caledonia" ], + [ "1551", "Tad", "Nichols", "K5V 6N1", "Monaco" ], + [ "1552", "Eliana", "Savage", "06807", "Central African Republic" ], + [ "1553", "Madeline", "Conway", "83513", "Latvia" ], + [ "1554", "Kai", "Caldwell", "S1K 2Q2", "Indonesia" ], + [ "1555", "Wynne", "Goodman", "U9Y 8P7", "Gibraltar" ], + [ "1556", "Nora", "Dudley", "52688", "Netherlands Antilles" ], + [ "1557", "Anastasia", "Gates", "T7T 8C8", "Morocco" ], + [ "1558", "Lester", "Good", "76376", "Heard Island and Mcdonald Islands" ], + [ "1559", "Craig", "Skinner", "S7B 3Z6", "Madagascar" ], + [ "1560", "Kibo", "Craft", "M5C 2I9", "Hong Kong" ], + [ "1561", "Carlos", "Buck", "89343", "Northern Mariana Islands" ], + [ "1562", "Ivor", "Mooney", "M9D 2Y3", "Korea" ], + [ "1563", "Armand", "Shields", "E8O 7X6", "Uzbekistan" ], + [ "1564", "Grace", "Weeks", "G5B 3W5", "Nicaragua" ], + [ "1565", "Reagan", "Mann", "J2E 5I1", "San Marino" ], + [ "1566", "Quin", "Nolan", "Q9E 2Q0", "Turkey" ], + [ "1567", "Kareem", "Jefferson", "91393", "Zambia" ], + [ "1568", "Erica", "Mccoy", "C3P 3L0", "Viet Nam" ], + [ "1569", "Sybill", "Larsen", "J3U 3L9", "Sierra Leone" ], + [ "1570", "Angela", "Weber", "46559", "Croatia" ], + [ "1571", "Mannix", "Noel", "94029", "Belgium" ], + [ "1572", "Martina", "Travis", "20063", "Solomon Islands" ], + [ "1573", "Dominic", "Whitehead", "83547", "Gibraltar" ], + [ "1574", "Vladimir", "Hunter", "L3I 4G7", "Reunion" ], + [ "1575", "Farrah", "Alexander", "18538", "Croatia" ], + [ "1576", "Hop", "Burns", "X1C 7J6", "Saint Lucia" ], + [ "1577", "Zelda", "Trevino", "L8P 7E9", "Guinea" ], + [ "1578", "Nehru", "Decker", "Q1P 4Q9", "Western Sahara" ], + [ "1579", "Shay", "Goff", "68576", "Sweden" ], + [ "1580", "Dominic", "Martin", "C1M 9P2", "Denmark" ], + [ "1581", "Heather", "Doyle", "Y7R 9H1", "Iran, Islamic Republic of" ], + [ "1582", "Honorato", "Rojas", "29414", "India" ], + [ "1583", "Florence", "England", "64669", "China" ], + [ "1584", "Zane", "Reyes", "84771", "Heard Island and Mcdonald Islands" ], + [ "1585", "Scarlett", "Poole", "36928", "Algeria" ], + [ "1586", "Dieter", "Brennan", "Y8V 5L2", "Colombia" ], + [ "1587", "Jamal", "Whitney", "33428", "Turkey" ], + [ "1588", "Evan", "Guy", "72119", "Slovakia" ], + [ "1589", "Candace", "Bauer", "C8L 1P2", "Macedonia" ], + [ "1590", "Naomi", "Pennington", "17350", "Tonga" ], + [ "1591", "Celeste", "Banks", "R8R 4C8", "Anguilla" ], + [ "1592", "Basil", "Elliott", "80065", "Singapore" ], + [ "1593", "Darryl", "Wise", "33140", "Brunei Darussalam" ], + [ "1594", "Marny", "Walls", "S1K 4V1", "Western Sahara" ], + [ "1595", "Anastasia", "Meyer", "Z1F 8C2", "El Salvador" ], + [ "1596", "Brynne", "Rivera", "48070", "Mexico" ], + [ "1597", "Macey", "Johnston", "X9E 9J5", "Guadeloupe" ], + [ "1598", "Bethany", "Marks", "46648", "Bhutan" ], + [ "1599", "Kiayada", "Glass", "13661", "Christmas Island" ], + [ "1600", "Veda", "Bowers", "D7S 1S9", "Korea" ], + [ "1601", "Dante", "Kirk", "58404", "Guinea" ], + [ "1602", "Judah", "Sloan", "04528", "Andorra" ], + [ "1603", "Serena", "Giles", "12139", "Papua New Guinea" ], + [ "1604", "Chase", "Hull", "27203", "Guinea-bissau" ], + [ "1605", "Wallace", "Poole", "58919", "Christmas Island" ], + [ "1606", "Deacon", "Lynn", "Z1H 9G4", "Kenya" ], + [ "1607", "Igor", "Duncan", "X2V 2X1", "Christmas Island" ], + [ "1608", "Walker", "Hopkins", "67256", "Bosnia and Herzegovina" ], + [ "1609", "Serena", "Burnett", "Q4C 7Q0", "Canada" ], + [ "1610", "Hedwig", "Burgess", "O2J 7A5", "Rwanda" ], + [ "1611", "Amal", "Richmond", "34506", "Australia" ], + [ "1612", "Rhona", "Gomez", "W2C 3I7", "Oman" ], + [ "1613", "Kai", "Acosta", "N2O 7M2", "Uganda" ], + [ "1614", "Henry", "Roman", "78113", "Guadeloupe" ], + [ "1615", "Chester", "Good", "88809", "Norway" ], + [ "1616", "Cleo", "Tanner", "73924", "Uganda" ], + [ "1617", "Emi", "Lloyd", "59746", "South Africa" ], + [ "1618", "Christopher", "Lopez", "76264", "Libyan Arab Jamahiriya" ], + [ "1619", "Yvonne", "Mathews", "68655", "Saint Lucia" ], + [ "1620", "Kimberly", "Mullen", "D6J 9G3", "Virgin Islands, British" ], + [ "1621", "Hanna", "Slater", "F8F 9K5", "Montserrat" ], + [ "1622", "Laura", "Dennis", "J6U 2G3", "Viet Nam" ], + [ "1623", "Rogan", "Richards", "R1D 1B3", "Argentina" ], + [ "1624", "Mira", "Rodriquez", "C3D 3E5", "Guinea" ], + [ "1625", "Ezra", "Myers", "Y7Z 7X2", "Kuwait" ], + [ "1626", "Jocelyn", "Martin", "E2F 3F2", "Algeria" ], + [ "1627", "Denton", "Lee", "80903", "Congo" ], + [ "1628", "Grace", "Leach", "86865", "Spain" ], + [ "1629", "Clark", "Morrow", "12834", "Northern Mariana Islands" ], + [ "1630", "Armando", "Calhoun", "I3I 1D4", "Spain" ], + [ "1631", "George", "Decker", "R1B 6Q9", "Mali" ], + [ "1632", "Jerome", "Salazar", "03831", "Faroe Islands" ], + [ "1633", "Logan", "Santiago", "46269", "Hungary" ], + [ "1634", "Gavin", "Tate", "Y3L 6G5", "Italy" ], + [ "1635", "Chloe", "Jennings", "D9B 2H9", "Cambodia" ], + [ "1636", "Rashad", "Knox", "T1V 4G5", "Germany" ], + [ "1637", "Jin", "Roberts", "82928", "Azerbaijan" ], + [ "1638", "Amity", "Guerrero", "F4G 2L4", "Viet Nam" ], + [ "1639", "Carter", "Roberson", "53651", "Niue" ], + [ "1640", "Slade", "Carson", "H9E 1G1", "Guyana" ], + [ "1641", "Buckminster", "Christensen", "F5J 6T5", "Algeria" ], + [ "1642", "Fallon", "Peters", "D9Y 5Q4", "Ethiopia" ], + [ "1643", "Amy", "Barry", "D6F 3R4", "New Caledonia" ], + [ "1644", "Calvin", "Buck", "18354", "Macedonia" ], + [ "1645", "Kaye", "Haynes", "D9K 1X8", "Italy" ], + [ "1646", "Shea", "Hammond", "R7P 3X8", "Guam" ], + [ "1647", "Kiara", "Franks", "01185", "Mozambique" ], + [ "1648", "Armando", "Oneil", "88972", "Bahrain" ], + [ "1649", "Lesley", "Allen", "05171", "Belgium" ], + [ "1650", "Ignatius", "Barrett", "94084", "Georgia" ], + [ "1651", "Graham", "Maldonado", "76354", "Dominican Republic" ], + [ "1652", "Briar", "Roman", "P9M 3A9", "Cayman Islands" ], + [ "1653", "Germane", "Colon", "U3X 7S9", "Brazil" ], + [ "1654", "Alvin", "Mcpherson", "58411", "Guinea" ], + [ "1655", "Belle", "Sandoval", "87172", "Cyprus" ], + [ "1656", "Eric", "Caldwell", "63246", "Guinea" ], + [ "1657", "Nadine", "Dale", "T6E 4B0", "Denmark" ], + [ "1658", "Dora", "Jimenez", "85463", "Nauru" ], + [ "1659", "Mohammad", "Strickland", "H8B 9G2", "Japan" ], + [ "1660", "Reagan", "Preston", "G5E 8S5", "Honduras" ], + [ "1661", "Tamekah", "Daniel", "Z3X 6Q6", "Belarus" ], + [ "1662", "Halee", "Mills", "23332", "Mayotte" ], + [ "1663", "Courtney", "England", "09751", "Saint Kitts and Nevis" ], + [ "1664", "Dai", "Arnold", "A2N 9J4", "Argentina" ], + [ "1665", "Priscilla", "Reyes", "G2B 5M4", "Azerbaijan" ], + [ "1666", "Brenda", "Stanley", "I6O 3I1", "Hungary" ], + [ "1667", "Kasper", "Washington", "H4K 8K7", "Serbia and Montenegro" ], + [ "1668", "Suki", "Hendricks", "L1K 5O9", "Norway" ], + [ "1669", "Rebekah", "Mccormick", "89543", "Slovenia" ], + [ "1670", "Oprah", "Rodriquez", "90034", "Costa Rica" ], + [ "1671", "Ivory", "Matthews", "T9J 2A7", "Panama" ], + [ "1672", "Ferris", "Garner", "93583", "Niue" ], + [ "1673", "Melvin", "White", "X5U 9N8", "Nigeria" ], + [ "1674", "Henry", "Swanson", "E7V 2C9", "Northern Mariana Islands" ], + [ "1675", "Hadassah", "Eaton", "52798", "Albania" ], + [ "1676", "Lisandra", "Sykes", "90838", "Namibia" ], + [ "1677", "Honorato", "Bradshaw", "W3D 1Z9", "United States" ], + [ "1678", "Aurelia", "Paul", "Z6E 6W9", "Malaysia" ], + [ "1679", "Arthur", "Mann", "74673", "Bhutan" ], + [ "1680", "Melissa", "Hernandez", "11742", "Dominican Republic" ], + [ "1681", "Bert", "Mosley", "N2K 5U5", "Kuwait" ], + [ "1682", "Sigourney", "Sharpe", "30204", "South Africa" ], + [ "1683", "Ifeoma", "Woods", "39850", "Haiti" ], + [ "1684", "Tyler", "Medina", "K6L 9V8", "Indonesia" ], + [ "1685", "Karleigh", "Griffin", "G8Z 6W2", "Canada" ], + [ "1686", "Brianna", "Collins", "11919", "New Caledonia" ], + [ "1687", "Allistair", "Hampton", "O1X 2N7", "Cocos (Keeling) Islands" ], + [ "1688", "Carla", "Manning", "76866", "Svalbard and Jan Mayen" ], + [ "1689", "Jakeem", "Brewer", "Y1T 1D7", "Comoros" ], + [ "1690", "Price", "Guerrero", "S7Z 8O1", "Christmas Island" ], + [ "1691", "Harlan", "Sandoval", "58527", "Czech Republic" ], + [ "1692", "Marcia", "Robinson", "64662", "Uganda" ], + [ "1693", "Sylvester", "Hewitt", "81468", "Honduras" ], + [ "1694", "Dawn", "Wood", "77743", "Malawi" ], + [ "1695", "Farrah", "Nielsen", "E4N 9A9", "Christmas Island" ], + [ "1696", "Tanisha", "Benjamin", "L2J 3G7", "Cape Verde" ], + [ "1697", "Cherokee", "Atkins", "L7D 2L5", "Moldova" ], + [ "1698", "Madaline", "Elliott", "H7K 8R4", "Barbados" ], + [ "1699", "Odysseus", "Roy", "65008", "Slovakia" ], + [ "1700", "Eaton", "Stein", "Z2V 7H0", "Moldova" ], + [ "1701", "Rachel", "Hurley", "L6L 2B2", "Antigua and Barbuda" ], + [ "1702", "Stacey", "Hardin", "O9U 1B7", "Montserrat" ], + [ "1703", "Grady", "Montgomery", "75852", "Guinea-bissau" ], + [ "1704", "Serena", "Douglas", "F5M 8Z6", "Mauritius" ], + [ "1705", "Ralph", "Duke", "H7X 3M9", "Tunisia" ], + [ "1706", "Charles", "Moody", "86445", "Pitcairn" ], + [ "1707", "Mariam", "Lara", "07952", "United Kingdom" ], + [ "1708", "Whitney", "Garza", "74001", "Norfolk Island" ], + [ "1709", "Beverly", "Thornton", "69847", "Canada" ], + [ "1710", "Helen", "Gentry", "Z8S 7U4", "Reunion" ], + [ "1711", "Janna", "Gould", "W6C 6E1", "Burundi" ], + [ "1712", "Jana", "Hooper", "A1R 9Y0", "Yemen" ], + [ "1713", "Zachary", "Nicholson", "49616", "Gabon" ], + [ "1714", "Julian", "Davis", "37608", "Anguilla" ], + [ "1715", "Gay", "Knox", "51952", "Croatia" ], + [ "1716", "Iola", "Moses", "16601", "French Polynesia" ], + [ "1717", "Allegra", "Holder", "C9R 8J3", "Dominican Republic" ], + [ "1718", "Cecilia", "Shannon", "62624", "Reunion" ], + [ "1719", "Cora", "Peterson", "I9V 5P5", "Chad" ], + [ "1720", "Stewart", "Mathews", "A5H 1E1", "Mexico" ], + [ "1721", "Kathleen", "Lynn", "82408", "Honduras" ], + [ "1722", "William", "Schneider", "25823", "Tajikistan" ], + [ "1723", "Alice", "Mcconnell", "50155", "Russian Federation" ], + [ "1724", "Timon", "Dillon", "93171", "Croatia" ], + [ "1725", "Tanek", "Ellison", "Y7Q 5B1", "Malawi" ], + [ "1726", "Tamekah", "Cummings", "03764", "Afghanistan" ], + [ "1727", "Charlotte", "Chaney", "U7Y 7B0", "Kyrgyzstan" ], + [ "1728", "Jason", "Conway", "37713", "Martinique" ], + [ "1729", "Graiden", "Combs", "40454", "Turkmenistan" ], + [ "1730", "Virginia", "Ortiz", "K9N 2Q4", "Malta" ], + [ "1731", "Thomas", "Cannon", "W1H 3T9", "Cuba" ], + [ "1732", "Galena", "Dominguez", "68072", "India" ], + [ "1733", "Vaughan", "Petty", "15200", "Lesotho" ], + [ "1734", "Buffy", "Saunders", "K1W 3B1", "Burkina Faso" ], + [ "1735", "Chava", "Hill", "93461", "Iran, Islamic Republic of" ], + [ "1736", "Sage", "Hampton", "R8Y 8J1", "Malta" ], + [ "1737", "Nathaniel", "Whitney", "89097", "Ukraine" ], + [ "1738", "Hector", "Hayden", "70774", "Netherlands" ], + [ "1739", "Mercedes", "Freeman", "80848", "Croatia" ], + [ "1740", "Vance", "Spencer", "25484", "Guyana" ], + [ "1741", "Josephine", "Stevens", "E4D 9D1", "Netherlands Antilles" ], + [ "1742", "Barbara", "Mcclure", "22602", "Cambodia" ], + [ "1743", "Sydney", "Holder", "X4G 1Z7", "British Indian Ocean Territory" ], + [ "1744", "Velma", "Evans", "83914", "New Zealand" ], + [ "1745", "Francis", "Lane", "12545", "Serbia and Montenegro" ], + [ "1746", "Garrison", "Brock", "19993", "Eritrea" ], + [ "1747", "Quentin", "Santiago", "07085", "Norfolk Island" ], + [ "1748", "Ivory", "Wilkerson", "79440", "Libyan Arab Jamahiriya" ], + [ "1749", "Karyn", "Buckner", "D1Y 7D8", "Cocos (Keeling) Islands" ], + [ "1750", "Mari", "Bright", "24721", "Pakistan" ], + [ "1751", "Dexter", "Garrison", "X3X 7G3", "Western Sahara" ], + [ "1752", "Venus", "Acevedo", "V2F 8C0", "Poland" ], + [ "1753", "Nayda", "Camacho", "F6H 6J5", "Northern Mariana Islands" ], + [ "1754", "Avye", "Hartman", "G6V 2H0", "Hong Kong" ], + [ "1755", "Kerry", "Baird", "M3Q 7B7", "Russian Federation" ], + [ "1756", "Uma", "Herman", "C9A 4P3", "Libyan Arab Jamahiriya" ], + [ "1757", "Amaya", "Roman", "97179", "Iceland" ], + [ "1758", "Bruce", "Joyce", "18344", "Denmark" ], + [ "1759", "Jarrod", "Alvarez", "59269", "Liberia" ], + [ "1760", "Olivia", "Reilly", "99058", "Malaysia" ], + [ "1761", "Benedict", "Hensley", "23105", "Uganda" ], + [ "1762", "Lavinia", "Hunter", "44729", "Maldives" ], + [ "1763", "Bradley", "Gomez", "65125", "Belize" ], + [ "1764", "Keely", "Burris", "18390", "Brunei Darussalam" ], + [ "1765", "Autumn", "England", "E5D 7A5", "Kyrgyzstan" ], + [ "1766", "Jane", "Blair", "S1W 4O0", "Bangladesh" ], + [ "1767", "Chancellor", "Barrett", "E9F 1I1", "Fiji" ], + [ "1768", "Whitney", "Morin", "G5T 4E7", "Aruba" ], + [ "1769", "Madeline", "Sparks", "W7L 7E0", "Belize" ], + [ "1770", "Dale", "Estes", "82712", "Guam" ], + [ "1771", "Hakeem", "Buck", "O6K 1I8", "Singapore" ], + [ "1772", "Alexandra", "Burns", "12697", "Portugal" ], + [ "1773", "Winifred", "Gill", "Z8B 8B8", "Uruguay" ], + [ "1774", "Gail", "Gomez", "S1V 3N8", "American Samoa" ], + [ "1775", "Moana", "Brady", "18835", "Wallis and Futuna" ], + [ "1776", "Martha", "Oliver", "81962", "Bolivia" ], + [ "1777", "Nayda", "Wooten", "00071", "Palau" ], + [ "1778", "Bryar", "Collier", "50631", "Mexico" ], + [ "1779", "Penelope", "Bradshaw", "A6A 9M2", "Lebanon" ], + [ "1780", "Wyatt", "Lara", "75486", "Slovenia" ], + [ "1781", "Wang", "Odonnell", "N5X 1N5", "Bahamas" ], + [ "1782", "Chiquita", "Harrell", "21691", "Guadeloupe" ], + [ "1783", "Byron", "Blankenship", "M8A 3L4", "Syrian Arab Republic" ], + [ "1784", "Holmes", "Stokes", "81039", "Mauritania" ], + [ "1785", "Naomi", "Phillips", "56287", "Switzerland" ], + [ "1786", "Quyn", "Johnson", "D2T 6B7", "Czech Republic" ], + [ "1787", "Gillian", "Sanders", "50542", "Colombia" ], + [ "1788", "Hope", "Benjamin", "67423", "Bolivia" ], + [ "1789", "Bryar", "Dean", "U9V 9E5", "Guatemala" ], + [ "1790", "Karyn", "Swanson", "S6H 3R8", "Israel" ], + [ "1791", "Amena", "David", "02286", "French Polynesia" ], + [ "1792", "Ira", "Joyner", "37335", "Cayman Islands" ], + [ "1793", "Tanek", "Oneil", "75041", "Slovenia" ], + [ "1794", "Dolan", "Miles", "K7Q 9U8", "Maldives" ], + [ "1795", "Wang", "Keith", "88116", "Congo" ], + [ "1796", "Wylie", "Bryant", "93369", "Andorra" ], + [ "1797", "Heather", "Bryant", "78015", "French Polynesia" ], + [ "1798", "Regina", "Wagner", "29087", "Virgin Islands, British" ], + [ "1799", "Nathan", "Bush", "J5S 9L0", "Viet Nam" ], + [ "1800", "Charity", "Dawson", "29508", "Greece" ], + [ "1801", "Ulric", "Guzman", "I6R 6P6", "Micronesia" ], + [ "1802", "Keefe", "Scott", "J1R 8T6", "Uzbekistan" ], + [ "1803", "Florence", "Price", "U7P 8F6", "Taiwan, Province of China" ], + [ "1804", "Griffith", "England", "92557", "China" ], + [ "1805", "Kay", "Nielsen", "85991", "Suriname" ], + [ "1806", "Tamekah", "Blackburn", "47324", "Panama" ], + [ "1807", "Indira", "Crosby", "64463", "Trinidad and Tobago" ], + [ "1808", "Pamela", "Vasquez", "K2Q 9A1", "Ghana" ], + [ "1809", "Patricia", "Haley", "51509", "Jordan" ], + [ "1810", "Nevada", "Prince", "41315", "Tokelau" ], + [ "1811", "Martin", "Wilkerson", "Y8X 4Y5", "Palestinian Territory, Occupied" ], + [ "1812", "Deirdre", "Castaneda", "X1S 5E2", "Bahrain" ], + [ "1813", "Cara", "Flynn", "68372", "Azerbaijan" ], + [ "1814", "Sylvia", "Alexander", "E5F 9M5", "Svalbard and Jan Mayen" ], + [ "1815", "Macon", "Suarez", "69866", "Tunisia" ], + [ "1816", "Hammett", "Haney", "09768", "Bangladesh" ], + [ "1817", "Geoffrey", "Simmons", "61986", "Burundi" ], + [ "1818", "Danielle", "Kelly", "71568", "Mali" ], + [ "1819", "Wing", "Brown", "U4D 6L1", "Uzbekistan" ], + [ "1820", "Len", "Barber", "40311", "Suriname" ], + [ "1821", "Richard", "Wilson", "W9E 6D7", "Finland" ], + [ "1822", "Keaton", "Hayes", "55696", "Slovakia" ], + [ "1823", "Dora", "Chaney", "57297", "United States Minor Outlying Islands" ], + [ "1824", "Alexandra", "Pruitt", "17207", "Turkmenistan" ], + [ "1825", "Deanna", "Gomez", "C9M 9K0", "Paraguay" ], + [ "1826", "Laura", "Downs", "74422", "Antigua and Barbuda" ], + [ "1827", "Jolene", "Lucas", "K9E 6U4", "Tokelau" ], + [ "1828", "Lucy", "Marquez", "L1N 4O4", "Argentina" ], + [ "1829", "Abbot", "Bishop", "G8W 7I1", "Guinea-bissau" ], + [ "1830", "Aaron", "Bowman", "K8A 5K7", "Greece" ], + [ "1831", "Candace", "Lee", "58901", "Turks and Caicos Islands" ], + [ "1832", "Larissa", "Allen", "O1I 4X0", "Belgium" ], + [ "1833", "Linda", "Malone", "31211", "United Arab Emirates" ], + [ "1834", "Grace", "Daugherty", "62610", "Cyprus" ], + [ "1835", "Kyra", "Berry", "T2F 3E5", "Netherlands Antilles" ], + [ "1836", "Hadassah", "Willis", "C7H 5V4", "El Salvador" ], + [ "1837", "Kyle", "Fitzgerald", "X1V 2R9", "Croatia" ], + [ "1838", "Graiden", "Atkinson", "L9Q 6H8", "Thailand" ], + [ "1839", "Raymond", "Fletcher", "59574", "Argentina" ], + [ "1840", "Keaton", "Barnett", "O2G 6B4", "Papua New Guinea" ], + [ "1841", "Farrah", "Kramer", "21928", "Netherlands Antilles" ], + [ "1842", "Christian", "Sellers", "55504", "Timor-leste" ], + [ "1843", "Keith", "Cohen", "D9T 7D0", "Italy" ], + [ "1844", "Karleigh", "Bruce", "F2A 5H9", "Montserrat" ], + [ "1845", "Julie", "Avery", "T4T 3Y7", "Nepal" ], + [ "1846", "Hollee", "Deleon", "47524", "Oman" ], + [ "1847", "Charity", "Booker", "61071", "Cocos (Keeling) Islands" ], + [ "1848", "Flynn", "Bond", "E8L 9D2", "Afghanistan" ], + [ "1849", "Sybill", "Roth", "16453", "Saudi Arabia" ], + [ "1850", "Alyssa", "Juarez", "04466", "Singapore" ], + [ "1851", "Jennifer", "Odonnell", "59277", "Tuvalu" ], + [ "1852", "Carissa", "Byrd", "80861", "Palau" ], + [ "1853", "Coby", "Barrett", "04665", "Congo" ], + [ "1854", "Bertha", "Paul", "46442", "Andorra" ], + [ "1855", "Hayden", "Dennis", "K7E 3O1", "France" ], + [ "1856", "Kadeem", "Berry", "39544", "Vanuatu" ], + [ "1857", "Clayton", "Burns", "C2A 6W5", "Andorra" ], + [ "1858", "Breanna", "Hardy", "12284", "Norway" ], + [ "1859", "Yael", "Hester", "69399", "Hong Kong" ], + [ "1860", "Hunter", "Harding", "M4O 6N5", "Bosnia and Herzegovina" ], + [ "1861", "Breanna", "Sutton", "N2C 6K3", "Singapore" ], + [ "1862", "Bo", "Huffman", "54558", "Taiwan, Province of China" ], + [ "1863", "Zena", "Potts", "80326", "Czech Republic" ], + [ "1864", "Lucian", "Sykes", "D4M 6M5", "Trinidad and Tobago" ], + [ "1865", "Gabriel", "Shepherd", "77631", "Bahrain" ], + [ "1866", "Vivian", "Gould", "29510", "Norway" ], + [ "1867", "Ina", "Sherman", "08122", "Portugal" ], + [ "1868", "Constance", "Parsons", "D6E 9J8", "Armenia" ], + [ "1869", "Tallulah", "Woodard", "51380", "Bahamas" ], + [ "1870", "Amos", "Morris", "37846", "Switzerland" ], + [ "1871", "Charles", "Kinney", "45961", "Marshall Islands" ], + [ "1872", "Colby", "Camacho", "02978", "Niger" ], + [ "1873", "Ora", "Hays", "B6F 9Z9", "Martinique" ], + [ "1874", "Ariel", "Cannon", "04559", "Burundi" ], + [ "1875", "Beatrice", "Hull", "66569", "Saint Pierre and Miquelon" ], + [ "1876", "Stacey", "Morrow", "53760", "Zimbabwe" ], + [ "1877", "Naida", "Thomas", "43434", "Virgin Islands, U.S." ], + [ "1878", "Holly", "Holcomb", "31997", "Kazakhstan" ], + [ "1879", "Lee", "Davenport", "99355", "Central African Republic" ], + [ "1880", "Gary", "Higgins", "18703", "Norway" ], + [ "1881", "Kay", "Wolf", "25509", "Switzerland" ], + [ "1882", "Destiny", "Patel", "Q3X 2F8", "Ghana" ], + [ "1883", "Clayton", "Middleton", "Y5C 1I8", "Antigua and Barbuda" ], + [ "1884", "May", "Rivers", "26782", "Uzbekistan" ], + [ "1885", "Hadassah", "Caldwell", "64493", "Chile" ], + [ "1886", "Penelope", "Gentry", "V5N 7A6", "Kyrgyzstan" ], + [ "1887", "James", "Boyle", "95421", "Indonesia" ], + [ "1888", "Yuli", "Cardenas", "W4U 5U1", "Solomon Islands" ], + [ "1889", "George", "Simpson", "30385", "Brazil" ], + [ "1890", "Thaddeus", "Ferrell", "E6Z 2D4", "Norfolk Island" ], + [ "1891", "Piper", "Morrow", "S6I 1L8", "Estonia" ], + [ "1892", "Xaviera", "Heath", "L8I 5G1", "Afghanistan" ], + [ "1893", "Odette", "Patton", "L2S 4I8", "Bosnia and Herzegovina" ], + [ "1894", "Stewart", "Phillips", "E8E 5W6", "El Salvador" ], + [ "1895", "Kellie", "Cooper", "77401", "Cape Verde" ], + [ "1896", "Kathleen", "Salinas", "F3O 4Z9", "Sierra Leone" ], + [ "1897", "Fallon", "Bennett", "X3P 7L1", "Macedonia" ], + [ "1898", "Jesse", "Guerrero", "I2B 1Q0", "Finland" ], + [ "1899", "Zenaida", "Mcguire", "M5R 1X6", "Kenya" ], + [ "1900", "Carolyn", "Richards", "03060", "Paraguay" ], + [ "1901", "Ulla", "Bruce", "20940", "Cambodia" ], + [ "1902", "Adrian", "Shaffer", "M5O 9Y2", "Thailand" ], + [ "1903", "Callum", "Russo", "L3U 5S8", "Holy See (Vatican City State)" ], + [ "1904", "Echo", "Mathews", "49158", "Spain" ], + [ "1905", "Driscoll", "Buckner", "70115", "Solomon Islands" ], + [ "1906", "Nayda", "Phillips", "Y7D 4A9", "Singapore" ], + [ "1907", "Piper", "Livingston", "51701", "Anguilla" ], + [ "1908", "Zoe", "Hoover", "C8D 8W2", "Iraq" ], + [ "1909", "Veronica", "Montoya", "G6B 9S4", "Egypt" ], + [ "1910", "Kato", "Richmond", "41268", "Saint Helena" ], + [ "1911", "Kevyn", "Lancaster", "71863", "Montserrat" ], + [ "1912", "Rowan", "Carr", "90825", "Ethiopia" ], + [ "1913", "Alec", "Wells", "C9P 8I7", "Netherlands" ], + [ "1914", "Graham", "Shields", "S4B 5O9", "Norfolk Island" ], + [ "1915", "Pearl", "Austin", "43642", "Bermuda" ], + [ "1916", "Dana", "Pugh", "H4C 2A9", "Tuvalu" ], + [ "1917", "Lucy", "Ellis", "31272", "Cameroon" ], + [ "1918", "Logan", "Wright", "18651", "Honduras" ], + [ "1919", "Chantale", "Velasquez", "A5D 3X2", "Burundi" ], + [ "1920", "Linda", "Ingram", "R1P 1G8", "Myanmar" ], + [ "1921", "Ginger", "Howell", "Q5D 4E6", "Pakistan" ], + [ "1922", "Unity", "Lester", "P7M 7A4", "Gibraltar" ], + [ "1923", "Brett", "Rutledge", "Q1E 2B4", "Thailand" ], + [ "1924", "Stewart", "Morrow", "84299", "Mali" ], + [ "1925", "Declan", "Aguilar", "35400", "Kenya" ], + [ "1926", "Shad", "Simpson", "N8E 2U3", "Saint Pierre and Miquelon" ], + [ "1927", "Alma", "Benton", "Q6C 5D2", "Pakistan" ], + [ "1928", "Herman", "Bailey", "P5K 2X4", "Ireland" ], + [ "1929", "Keegan", "Mendez", "19421", "Lesotho" ], + [ "1930", "Erasmus", "Foreman", "J9T 1A2", "Panama" ], + [ "1931", "Tarik", "Meyers", "Z8V 5F9", "Cape Verde" ], + [ "1932", "Donovan", "Knox", "B8N 1G7", "Iceland" ], + [ "1933", "Chloe", "Mccray", "67537", "United Arab Emirates" ], + [ "1934", "Marvin", "Edwards", "21809", "Ukraine" ], + [ "1935", "Freya", "Watkins", "80099", "Central African Republic" ], + [ "1936", "Jerry", "Morgan", "C7U 7H5", "Guinea" ], + [ "1937", "Yardley", "Marsh", "23654", "India" ], + [ "1938", "Ava", "Mueller", "83374", "Greece" ], + [ "1939", "Silas", "Joseph", "P5M 7F2", "Sweden" ], + [ "1940", "Winifred", "Solis", "12335", "Viet Nam" ], + [ "1941", "Virginia", "Cantu", "K4C 3S5", "Yemen" ], + [ "1942", "Sade", "Cole", "40295", "Spain" ], + [ "1943", "Ethan", "Hodges", "R7W 8X2", "Congo" ], + [ "1944", "Barbara", "Day", "K6L 7S6", "Nigeria" ], + [ "1945", "Conan", "Simon", "22124", "Guyana" ], + [ "1946", "Lars", "Puckett", "R6Y 4N7", "Trinidad and Tobago" ], + [ "1947", "Quin", "Ewing", "99053", "American Samoa" ], + [ "1948", "Ali", "Haynes", "N6Z 7X0", "China" ], + [ "1949", "Sara", "Wagner", "74544", "Chad" ], + [ "1950", "Griffith", "Fuentes", "R1W 6Z9", "Slovenia" ], + [ "1951", "Sharon", "Crane", "I2Z 9D6", "Philippines" ], + [ "1952", "Marsden", "Acosta", "K6C 8C5", "Jordan" ], + [ "1953", "Whoopi", "Villarreal", "E2O 1T5", "Svalbard and Jan Mayen" ], + [ "1954", "Bruno", "Ball", "31931", "Barbados" ], + [ "1955", "Ulric", "Young", "T4R 3M5", "Solomon Islands" ], + [ "1956", "Noah", "Gonzalez", "L3O 6V5", "Mayotte" ], + [ "1957", "Cheryl", "Gilliam", "F4Q 4H9", "Albania" ], + [ "1958", "Bo", "Rowe", "67020", "Jamaica" ], + [ "1959", "Kelly", "Alexander", "P8Y 9K5", "Somalia" ], + [ "1960", "Hop", "Navarro", "O1G 9R6", "Cayman Islands" ], + [ "1961", "Zachery", "Howard", "67147", "Fiji" ], + [ "1962", "Elvis", "Daugherty", "X8V 7S7", "Jordan" ], + [ "1963", "Mallory", "Hensley", "A5S 1U6", "Swaziland" ], + [ "1964", "Fulton", "Williams", "P4C 4O5", "Viet Nam" ], + [ "1965", "Madison", "Pittman", "F8G 1P9", "Chile" ], + [ "1966", "Kermit", "Bradford", "W2T 6I5", "Uganda" ], + [ "1967", "Gabriel", "Ballard", "N5M 6W0", "Andorra" ], + [ "1968", "Jasmine", "Barber", "M2Z 7G5", "French Guiana" ], + [ "1969", "Thane", "Koch", "21097", "Armenia" ], + [ "1970", "Montana", "Oneal", "L2A 9Q6", "South Africa" ], + [ "1971", "Brett", "Coleman", "79399", "Luxembourg" ], + [ "1972", "Ivy", "Jimenez", "28549", "Senegal" ], + [ "1973", "Shad", "Melton", "Z8N 4Z5", "Cook Islands" ], + [ "1974", "Suki", "Vance", "H1A 1Z3", "Ireland" ], + [ "1975", "Jin", "Hodges", "L2I 3T8", "France" ], + [ "1976", "Diana", "Booth", "M3V 1S8", "Iran, Islamic Republic of" ], + [ "1977", "Martha", "Nunez", "27837", "Northern Mariana Islands" ], + [ "1978", "Silas", "Ayers", "17121", "United States" ], + [ "1979", "Ainsley", "Whitaker", "42695", "Dominica" ], + [ "1980", "Dillon", "Tucker", "N3R 3P3", "Botswana" ], + [ "1981", "Lillian", "West", "57665", "Palau" ], + [ "1982", "Talon", "Hart", "Z6T 4W3", "Serbia and Montenegro" ], + [ "1983", "Desiree", "Booth", "Q1W 9S1", "Gambia" ], + [ "1984", "Chastity", "Merrill", "F3B 9W7", "Puerto Rico" ], + [ "1985", "Nichole", "Leon", "T7V 5D6", "Belize" ], + [ "1986", "Rafael", "Washington", "87676", "Eritrea" ], + [ "1987", "Samson", "Mathews", "G7Q 5V6", "Burkina Faso" ], + [ "1988", "Jasper", "Campbell", "23791", "Thailand" ], + [ "1989", "Mason", "Harrington", "R9R 5S3", "Nigeria" ], + [ "1990", "Jameson", "Frederick", "R1N 4S0", "Guyana" ], + [ "1991", "Cadman", "Woodard", "43080", "Gambia" ], + [ "1992", "Catherine", "Gill", "W4W 8A4", "Philippines" ], + [ "1993", "Yael", "Richards", "99504", "Kenya" ], + [ "1994", "Porter", "Finley", "C8Z 5E0", "Brunei Darussalam" ], + [ "1995", "Alden", "Merritt", "P4E 9F0", "Mali" ], + [ "1996", "Kaye", "Andrews", "I5I 3A4", "Cayman Islands" ], + [ "1997", "Luke", "Bryant", "F3Z 2U1", "Kuwait" ], + [ "1998", "Heather", "Blackburn", "L1T 6B9", "Mongolia" ], + [ "1999", "Gage", "Sykes", "L9Q 7E6", "Palestinian Territory, Occupied" ], + [ "2000", "Kaseem", "Harris", "B9O 1C3", "Korea" ], + [ "2001", "Quail", "Leonard", "88755", "Burkina Faso" ], + [ "2002", "Dennis", "Craft", "13309", "Namibia" ], + [ "2003", "Ivor", "Forbes", "C3P 2E1", "Malta" ], + [ "2004", "Cade", "Herman", "R1E 5X9", "Sri Lanka" ], + [ "2005", "Larissa", "Santiago", "57781", "Dominica" ], + [ "2006", "Hyatt", "Tillman", "45071", "Ghana" ], + [ "2007", "Timothy", "Rodgers", "F8W 9W0", "Andorra" ], + [ "2008", "Hanae", "Powell", "F8B 7P7", "Luxembourg" ], + [ "2009", "Ima", "Pennington", "Z5W 5N5", "Latvia" ], + [ "2010", "Laurel", "Bell", "16805", "Venezuela" ], + [ "2011", "Avye", "Long", "04794", "Dominica" ], + [ "2012", "Lysandra", "Pierce", "H7O 3F4", "Zimbabwe" ], + [ "2013", "Eve", "Pollard", "L5K 6E2", "Algeria" ], + [ "2014", "Ina", "Mcdowell", "65712", "Saint Lucia" ], + [ "2015", "Meredith", "Serrano", "V8M 6K7", "Libyan Arab Jamahiriya" ], + [ "2016", "Daphne", "Irwin", "89933", "Mongolia" ], + [ "2017", "Adam", "Henson", "F6U 9D5", "Chile" ], + [ "2018", "Amery", "Hoover", "13408", "Mongolia" ], + [ "2019", "Quamar", "Hendricks", "20310", "Gambia" ], + [ "2020", "Ori", "Wheeler", "89005", "Nigeria" ], + [ "2021", "Zena", "Douglas", "Z1O 6F9", "Serbia and Montenegro" ], + [ "2022", "Buckminster", "Huffman", "R4V 9L2", "Mali" ], + [ "2023", "Harlan", "Gamble", "U4I 7M4", "Guyana" ], + [ "2024", "Dalton", "Cline", "63829", "Tonga" ], + [ "2025", "Martha", "Weber", "Z9B 4T0", "Bangladesh" ], + [ "2026", "Vernon", "Francis", "M5A 9X7", "Tokelau" ], + [ "2027", "Janna", "Velazquez", "67406", "Qatar" ], + [ "2028", "Fuller", "Keller", "80871", "Burkina Faso" ], + [ "2029", "Jamal", "Spears", "42197", "Norfolk Island" ], + [ "2030", "Christen", "Holcomb", "29806", "Norway" ], + [ "2031", "Mary", "Carter", "C6W 9K9", "Belgium" ], + [ "2032", "Colorado", "Austin", "62904", "Cook Islands" ], + [ "2033", "Fritz", "Hunt", "X8G 2V0", "Morocco" ], + [ "2034", "Isabella", "Bush", "17676", "Monaco" ], + [ "2035", "Adam", "Gilliam", "H7K 9X3", "Indonesia" ], + [ "2036", "John", "Austin", "O7X 4Z0", "Czech Republic" ], + [ "2037", "Cassady", "Yates", "68835", "Christmas Island" ], + [ "2038", "Ori", "Cantrell", "56920", "Guinea" ], + [ "2039", "May", "Horn", "47805", "Kuwait" ], + [ "2040", "Skyler", "Clarke", "64131", "Lebanon" ], + [ "2041", "Levi", "Foster", "S5Q 4B2", "Germany" ], + [ "2042", "Veda", "Wilkinson", "L7Z 9M8", "Niger" ], + [ "2043", "Brendan", "Levine", "L5B 9P4", "Nepal" ], + [ "2044", "Carson", "Sullivan", "93066", "United Arab Emirates" ], + [ "2045", "Steven", "Spencer", "F1V 9A7", "Pitcairn" ], + [ "2046", "Halla", "Michael", "N1U 1E7", "Seychelles" ], + [ "2047", "Jamal", "Hobbs", "G3D 6J7", "New Caledonia" ], + [ "2048", "Steel", "Bush", "U8F 6T2", "Belize" ], + [ "2049", "Ahmed", "Dennis", "M6E 3P3", "Afghanistan" ], + [ "2050", "Aspen", "Estes", "32157", "American Samoa" ], + [ "2051", "Peter", "Kelly", "91773", "Morocco" ], + [ "2052", "Xandra", "Grimes", "66702", "Tokelau" ], + [ "2053", "Michael", "Battle", "J2J 2N5", "Honduras" ], + [ "2054", "Steel", "Wiggins", "34625", "United States Minor Outlying Islands" ], + [ "2055", "Holmes", "Christian", "45402", "Liechtenstein" ], + [ "2056", "Charles", "Barrett", "O4N 9N8", "Lebanon" ], + [ "2057", "Hermione", "Soto", "C8E 4H8", "Congo" ], + [ "2058", "Elton", "Maxwell", "89033", "Madagascar" ], + [ "2059", "Zelda", "Burks", "B7W 5G7", "Sweden" ], + [ "2060", "Lynn", "David", "P3D 5K5", "Chad" ], + [ "2061", "Margaret", "Neal", "47438", "Western Sahara" ], + [ "2062", "David", "Vaughan", "E3L 8D9", "Tokelau" ], + [ "2063", "Vladimir", "Mcfarland", "U9V 1B3", "Belgium" ], + [ "2064", "Uriah", "Harrington", "77051", "United Arab Emirates" ], + [ "2065", "Noel", "Merritt", "J3G 7S1", "Dominican Republic" ], + [ "2066", "Christine", "Key", "54543", "Niger" ], + [ "2067", "Illana", "Hendricks", "07584", "Montserrat" ], + [ "2068", "Pearl", "Lewis", "U5D 2V3", "Libyan Arab Jamahiriya" ], + [ "2069", "Victoria", "Bullock", "17462", "Mauritania" ], + [ "2070", "Benedict", "Marsh", "61479", "Guyana" ], + [ "2071", "Quemby", "Washington", "99774", "French Polynesia" ], + [ "2072", "Shelley", "Noble", "U8S 5Z4", "Philippines" ], + [ "2073", "Olivia", "Britt", "72344", "Holy See (Vatican City State)" ], + [ "2074", "Oleg", "Hendrix", "67567", "Cuba" ], + [ "2075", "Hermione", "Gutierrez", "J5K 2J1", "Mozambique" ], + [ "2076", "Myra", "Dean", "03485", "Andorra" ], + [ "2077", "Deacon", "Moore", "34501", "Tunisia" ], + [ "2078", "Dai", "Baird", "B2P 4R0", "Cambodia" ], + [ "2079", "Levi", "Melton", "K7T 4B1", "Zimbabwe" ], + [ "2080", "Ocean", "Dalton", "66801", "Gabon" ], + [ "2081", "Selma", "Harding", "D7N 3J9", "Kyrgyzstan" ], + [ "2082", "Maisie", "Gill", "56324", "Morocco" ], + [ "2083", "Hillary", "Horne", "Y6O 6G3", "Cyprus" ], + [ "2084", "Joel", "Stokes", "77952", "Burundi" ], + [ "2085", "Channing", "Patterson", "G6B 8H4", "China" ], + [ "2086", "Elliott", "Cleveland", "H3J 9U9", "Namibia" ], + [ "2087", "Petra", "Gay", "44314", "Palestinian Territory, Occupied" ], + [ "2088", "May", "Hatfield", "48918", "Faroe Islands" ], + [ "2089", "Jemima", "Francis", "14347", "Libyan Arab Jamahiriya" ], + [ "2090", "Kyla", "Hale", "46200", "Cocos (Keeling) Islands" ], + [ "2091", "Veda", "Bruce", "F5W 9A6", "Mauritania" ], + [ "2092", "Sybill", "Avila", "58663", "Angola" ], + [ "2093", "Charissa", "Salazar", "35271", "Faroe Islands" ], + [ "2094", "Steven", "Allison", "E5L 4A3", "Wallis and Futuna" ], + [ "2095", "Kane", "Parks", "D5C 6K7", "Norfolk Island" ], + [ "2096", "Alika", "Bishop", "S3P 3O3", "China" ], + [ "2097", "James", "Bonner", "33277", "Canada" ], + [ "2098", "Yoko", "Foster", "B5J 6P9", "Croatia" ], + [ "2099", "Ivy", "Riggs", "94420", "Kiribati" ], + [ "2100", "Urielle", "Rosa", "V6W 2A0", "Falkland Islands (Malvinas)" ], + [ "2101", "Armando", "Shepherd", "Y5C 5W6", "Panama" ], + [ "2102", "Haley", "Ingram", "B4H 5U5", "Fiji" ], + [ "2103", "Brielle", "Dyer", "P2S 4H7", "Malawi" ], + [ "2104", "Francis", "Brady", "24239", "Uruguay" ], + [ "2105", "Fiona", "Webster", "72015", "Belize" ], + [ "2106", "Aiko", "Santos", "K4H 1N0", "Saint Vincent and The Grenadines" ], + [ "2107", "Amir", "Rivas", "02737", "Papua New Guinea" ], + [ "2108", "Mira", "Kerr", "W6E 6Y2", "Sri Lanka" ], + [ "2109", "Harrison", "Jensen", "50193", "Heard Island and Mcdonald Islands" ], + [ "2110", "Merrill", "Randall", "21534", "Colombia" ], + [ "2111", "Benjamin", "Howe", "N8M 4N6", "Turkmenistan" ], + [ "2112", "Melyssa", "Kidd", "97657", "Cameroon" ], + [ "2113", "Henry", "Moore", "95626", "Botswana" ], + [ "2114", "Nash", "Peters", "K3V 9F3", "Wallis and Futuna" ], + [ "2115", "Iliana", "Holt", "E9F 2Q8", "Netherlands Antilles" ], + [ "2116", "Naomi", "Hood", "P6D 2G3", "Anguilla" ], + [ "2117", "Ainsley", "Barron", "94273", "New Caledonia" ], + [ "2118", "Daphne", "Acevedo", "A9I 9E4", "Bermuda" ], + [ "2119", "Kiona", "Keith", "62523", "Saint Lucia" ], + [ "2120", "Kirsten", "Mcgee", "97481", "Macedonia" ], + [ "2121", "Emerald", "Franklin", "Q2I 6D6", "Botswana" ], + [ "2122", "Hall", "Schroeder", "I2D 9L7", "Kenya" ], + [ "2123", "Amaya", "Lynch", "50534", "Costa Rica" ], + [ "2124", "Randall", "Hanson", "B4R 2S3", "United Arab Emirates" ], + [ "2125", "Sasha", "Clarke", "50972", "United States Minor Outlying Islands" ], + [ "2126", "Susan", "Sutton", "Z4T 6K3", "Solomon Islands" ], + [ "2127", "Hiram", "Torres", "C8O 5O7", "Botswana" ], + [ "2128", "Melanie", "Calhoun", "87097", "New Zealand" ], + [ "2129", "Courtney", "Sutton", "07944", "Spain" ], + [ "2130", "Reuben", "Beard", "U6Z 8N5", "Faroe Islands" ], + [ "2131", "Jarrod", "Payne", "94171", "Turkey" ], + [ "2132", "Vincent", "Potts", "V5Z 9G9", "Madagascar" ], + [ "2133", "Kaye", "Kent", "O1B 2Z9", "Fiji" ], + [ "2134", "Carol", "Green", "78719", "Comoros" ], + [ "2135", "Cairo", "Combs", "G3C 8F0", "Indonesia" ], + [ "2136", "Ebony", "Parker", "77377", "Portugal" ], + [ "2137", "Gary", "Shaffer", "F1B 9W7", "French Guiana" ], + [ "2138", "Gay", "Jimenez", "05726", "Nepal" ], + [ "2139", "Patience", "Bryan", "60437", "Macao" ], + [ "2140", "Zenaida", "Bowen", "V3S 1G7", "Mauritania" ], + [ "2141", "Isaac", "Aguirre", "X8S 9K4", "Bermuda" ], + [ "2142", "Lacy", "Harrell", "67362", "Bhutan" ], + [ "2143", "Jael", "Grimes", "95612", "Anguilla" ], + [ "2144", "Catherine", "Galloway", "45834", "Suriname" ], + [ "2145", "Donna", "Burt", "N8C 2M8", "Burkina Faso" ], + [ "2146", "Colleen", "Ball", "N3E 4U8", "Libyan Arab Jamahiriya" ], + [ "2147", "Lael", "Brady", "01369", "Macedonia" ], + [ "2148", "Kermit", "Logan", "Y5P 8Q8", "Honduras" ], + [ "2149", "Katelyn", "Orr", "R7X 9W3", "Switzerland" ], + [ "2150", "Alisa", "Glenn", "17831", "Timor-leste" ], + [ "2151", "Lee", "Bean", "89445", "Guam" ], + [ "2152", "Maryam", "Cotton", "57924", "Gambia" ], + [ "2153", "Amena", "Love", "X1Z 6F7", "Thailand" ], + [ "2154", "Tallulah", "Case", "87477", "Ecuador" ], + [ "2155", "Carlos", "Sanford", "F6S 8J6", "Iraq" ], + [ "2156", "Quamar", "David", "D5F 2M8", "Gabon" ], + [ "2157", "Cassady", "Mays", "12786", "Netherlands" ], + [ "2158", "Jenna", "Rowland", "88845", "China" ], + [ "2159", "Justin", "Tanner", "66071", "Nepal" ], + [ "2160", "Riley", "Santiago", "F8K 2Y6", "Gabon" ], + [ "2161", "Iris", "Gallegos", "K9C 3T9", "Niue" ], + [ "2162", "Kato", "Osborn", "N4C 2L8", "Puerto Rico" ], + [ "2163", "Imogene", "Schroeder", "79710", "United States Minor Outlying Islands" ], + [ "2164", "Olympia", "Hebert", "D4W 1L0", "Saint Lucia" ], + [ "2165", "Skyler", "Burnett", "B2R 5H7", "Antarctica" ], + [ "2166", "Faith", "Sims", "88476", "Egypt" ], + [ "2167", "Emily", "Odom", "U7O 2P6", "Kuwait" ], + [ "2168", "Carly", "Washington", "46063", "Benin" ], + [ "2169", "Jolene", "Meyer", "B2B 9A4", "Australia" ], + [ "2170", "Ayanna", "Conrad", "84360", "Northern Mariana Islands" ], + [ "2171", "Violet", "Blankenship", "W2B 3U1", "New Caledonia" ], + [ "2172", "Rhona", "Gallegos", "10931", "Montserrat" ], + [ "2173", "Alice", "Hodges", "96181", "Burkina Faso" ], + [ "2174", "Brody", "Sandoval", "68959", "Pitcairn" ], + [ "2175", "Isabella", "Dunlap", "U8U 7Y8", "Afghanistan" ], + [ "2176", "Jordan", "Golden", "55152", "Guam" ], + [ "2177", "Gillian", "Thomas", "75633", "Djibouti" ], + [ "2178", "Hollee", "Clay", "79847", "Panama" ], + [ "2179", "Dane", "Knapp", "89535", "Armenia" ], + [ "2180", "Avram", "Martin", "T4S 4E2", "Madagascar" ], + [ "2181", "Fuller", "Newman", "47317", "Jamaica" ], + [ "2182", "Nina", "Berry", "81360", "Mongolia" ], + [ "2183", "Akeem", "Pratt", "56230", "Colombia" ], + [ "2184", "Lacy", "Hayes", "U7T 4F5", "Cyprus" ], + [ "2185", "Alfonso", "Mcclure", "06797", "Swaziland" ], + [ "2186", "Cedric", "Love", "64720", "Bermuda" ], + [ "2187", "Astra", "Fernandez", "H3I 1B0", "Mongolia" ], + [ "2188", "Iliana", "Durham", "R8C 7M8", "Spain" ], + [ "2189", "Gwendolyn", "Livingston", "C7X 5L1", "Northern Mariana Islands" ], + [ "2190", "Caldwell", "Anderson", "69099", "Kuwait" ], + [ "2191", "Risa", "Mejia", "P7A 4U7", "Israel" ], + [ "2192", "Dora", "Navarro", "L6G 2O8", "Ireland" ], + [ "2193", "Kirk", "Dean", "I2T 3E6", "Pitcairn" ], + [ "2194", "Jackson", "Harvey", "53467", "Myanmar" ], + [ "2195", "Thane", "Ballard", "87240", "Solomon Islands" ], + [ "2196", "Nadine", "Estes", "62003", "Malta" ], + [ "2197", "Candace", "Nunez", "57223", "Virgin Islands, British" ], + [ "2198", "Zelda", "Odom", "X4V 7F5", "Mongolia" ], + [ "2199", "Wylie", "Ayala", "S4I 4Q4", "Djibouti" ], + [ "2200", "Azalia", "Page", "57239", "Korea, Republic of" ], + [ "2201", "Joshua", "Burch", "R7B 1N7", "Samoa" ], + [ "2202", "Basil", "Ramos", "71614", "Tunisia" ], + [ "2203", "Jessica", "Shields", "U2D 4X3", "Syrian Arab Republic" ], + [ "2204", "Clio", "Singleton", "I1B 1B0", "Ghana" ], + [ "2205", "Astra", "Dotson", "62378", "Turks and Caicos Islands" ], + [ "2206", "Hamish", "Tucker", "E4Z 3N3", "Anguilla" ], + [ "2207", "Rachel", "Matthews", "U4I 8M3", "Trinidad and Tobago" ], + [ "2208", "Clayton", "Ball", "95319", "India" ], + [ "2209", "Quinn", "Wilkinson", "Y6M 3Q7", "Virgin Islands, U.S." ], + [ "2210", "Phelan", "Talley", "00543", "Philippines" ], + [ "2211", "Carol", "Brock", "M6X 4E2", "Gibraltar" ], + [ "2212", "Nomlanga", "Robles", "56511", "Viet Nam" ], + [ "2213", "Adrian", "Clay", "79479", "France" ], + [ "2214", "Sara", "Riley", "B9N 5P4", "Peru" ], + [ "2215", "Christine", "Sweeney", "W1Z 4S4", "French Polynesia" ], + [ "2216", "Leilani", "Johnston", "W1C 8M8", "American Samoa" ], + [ "2217", "Melyssa", "Lambert", "V1B 4P6", "Iraq" ], + [ "2218", "Talon", "Delacruz", "Y3N 9R2", "Bulgaria" ], + [ "2219", "Garth", "Jennings", "59667", "Malta" ], + [ "2220", "Naida", "Coleman", "45456", "Finland" ], + [ "2221", "Indigo", "Lopez", "77160", "Pitcairn" ], + [ "2222", "Asher", "French", "99064", "British Indian Ocean Territory" ], + [ "2223", "Vivian", "Mcgowan", "46310", "Oman" ], + [ "2224", "Gwendolyn", "Cervantes", "48905", "Cocos (Keeling) Islands" ], + [ "2225", "Logan", "Reid", "87376", "Ethiopia" ], + [ "2226", "Bryar", "Wolfe", "75860", "Comoros" ], + [ "2227", "Demetrius", "Hutchinson", "97252", "Dominican Republic" ], + [ "2228", "Freya", "Becker", "04872", "United States" ], + [ "2229", "Abel", "Brooks", "I7O 1M1", "Comoros" ], + [ "2230", "Silas", "Mcguire", "04101", "Indonesia" ], + [ "2231", "Quinn", "Fletcher", "B6E 2B0", "Niger" ], + [ "2232", "Rooney", "Holden", "29294", "Micronesia" ], + [ "2233", "Iris", "Hale", "N7W 6E9", "Greenland" ], + [ "2234", "Candace", "Barry", "U8I 5A4", "Germany" ], + [ "2235", "Yetta", "Ball", "62055", "Switzerland" ], + [ "2236", "Dai", "Bentley", "P2Y 4C5", "Dominica" ], + [ "2237", "Gannon", "Dunlap", "45728", "Fiji" ], + [ "2238", "Chelsea", "Mays", "36498", "Guinea" ], + [ "2239", "Ruth", "Mcguire", "62924", "Maldives" ], + [ "2240", "Melissa", "Durham", "D6S 1A2", "Armenia" ], + [ "2241", "Eaton", "Salinas", "53689", "Somalia" ], + [ "2242", "Driscoll", "Cunningham", "31194", "Sweden" ], + [ "2243", "Bevis", "Acosta", "V4M 9Z2", "Jamaica" ], + [ "2244", "Anastasia", "Mcknight", "24878", "Sao Tome and Principe" ], + [ "2245", "Anika", "Rowland", "45287", "Chile" ], + [ "2246", "Dexter", "Rollins", "00684", "Iran, Islamic Republic of" ], + [ "2247", "Brielle", "Irwin", "V4U 7R2", "Belgium" ], + [ "2248", "Ocean", "Fields", "08544", "Croatia" ], + [ "2249", "Sonia", "Solis", "C4X 1L5", "Niue" ], + [ "2250", "Joseph", "Haney", "29567", "Argentina" ], + [ "2251", "Lamar", "Heath", "81699", "Italy" ], + [ "2252", "Raya", "Jordan", "R6K 7B3", "Spain" ], + [ "2253", "Brody", "Frost", "34564", "Dominican Republic" ], + [ "2254", "Ann", "Hawkins", "S3A 5K7", "Yemen" ], + [ "2255", "Phillip", "Lindsay", "80544", "Sierra Leone" ], + [ "2256", "Willa", "Maynard", "A6A 4C5", "Mexico" ], + [ "2257", "Carolyn", "Mercer", "V8Z 1X5", "Zimbabwe" ], + [ "2258", "Justin", "Cole", "68764", "Saint Vincent and The Grenadines" ], + [ "2259", "Emmanuel", "Parks", "99769", "Latvia" ], + [ "2260", "Isaiah", "Salazar", "H1K 1X3", "Turks and Caicos Islands" ], + [ "2261", "Vance", "Porter", "49607", "Costa Rica" ], + [ "2262", "Igor", "Kim", "99489", "Turkmenistan" ], + [ "2263", "Emi", "Graves", "F4M 5L8", "El Salvador" ], + [ "2264", "Griffith", "Monroe", "11550", "Tanzania, United Republic of" ], + [ "2265", "Iliana", "Coffey", "30220", "Albania" ], + [ "2266", "Jemima", "Guthrie", "69283", "Saint Pierre and Miquelon" ], + [ "2267", "Zenia", "Farrell", "91872", "Tanzania, United Republic of" ], + [ "2268", "Lucas", "Chambers", "L5Z 1W0", "Bouvet Island" ], + [ "2269", "Zenaida", "Valenzuela", "31700", "Guam" ], + [ "2270", "Bradley", "Wynn", "21222", "Lithuania" ], + [ "2271", "Maite", "Richard", "H4D 7X0", "Cameroon" ], + [ "2272", "Moses", "House", "Y3Z 3K7", "Saint Vincent and The Grenadines" ], + [ "2273", "Erich", "Petersen", "U4N 9R7", "Rwanda" ], + [ "2274", "Stephanie", "Zimmerman", "70097", "Malawi" ], + [ "2275", "Rylee", "Schneider", "15645", "Gibraltar" ], + [ "2276", "Zia", "Craig", "H1K 1N9", "Norway" ], + [ "2277", "Fiona", "Chaney", "Y4U 7K8", "San Marino" ], + [ "2278", "Gil", "Sherman", "64720", "Wallis and Futuna" ], + [ "2279", "Raja", "Sandoval", "11225", "Lithuania" ], + [ "2280", "Illana", "Wyatt", "A2M 9O2", "Brazil" ], + [ "2281", "Declan", "Howell", "E9V 8J5", "San Marino" ], + [ "2282", "Warren", "Cooper", "47160", "Guyana" ], + [ "2283", "Alyssa", "Juarez", "S7G 8F2", "Sweden" ], + [ "2284", "Quynn", "Long", "P1P 5Y4", "Mexico" ], + [ "2285", "Dalton", "Booker", "I5T 1R3", "Mauritius" ], + [ "2286", "Lunea", "Mclaughlin", "I3F 6D4", "Togo" ], + [ "2287", "Irene", "Brock", "04760", "Tajikistan" ], + [ "2288", "Raven", "Floyd", "R2N 2Y5", "Philippines" ], + [ "2289", "Nichole", "Farmer", "81213", "Seychelles" ], + [ "2290", "Sophia", "Mcdonald", "86291", "Chile" ], + [ "2291", "Nehru", "Matthews", "60732", "Central African Republic" ], + [ "2292", "Marah", "Nelson", "44533", "Kenya" ], + [ "2293", "Marvin", "Lyons", "M7Y 1Q6", "Somalia" ], + [ "2294", "Ian", "Fernandez", "D9U 8B6", "Turkey" ], + [ "2295", "Gretchen", "Dotson", "48294", "China" ], + [ "2296", "Brady", "Weaver", "S4U 4I8", "Burundi" ], + [ "2297", "Ella", "Salas", "73771", "Sao Tome and Principe" ], + [ "2298", "Martha", "Irwin", "06554", "Timor-leste" ], + [ "2299", "Penelope", "Pratt", "S1R 4L4", "Gabon" ], + [ "2300", "Kenyon", "Dale", "64548", "Zimbabwe" ], + [ "2301", "Henry", "Myers", "07614", "United Arab Emirates" ], + [ "2302", "Chaney", "Dunlap", "18388", "French Southern Territories" ], + [ "2303", "Palmer", "Le", "10807", "Colombia" ], + [ "2304", "Kaseem", "Madden", "U4E 6L9", "Guyana" ], + [ "2305", "Grant", "Anthony", "F3K 4D8", "Trinidad and Tobago" ], + [ "2306", "Denton", "Moore", "I5O 4I5", "Belize" ], + [ "2307", "Regan", "Pittman", "U8T 9M1", "Romania" ], + [ "2308", "Valentine", "Hunt", "E9O 6H6", "Poland" ], + [ "2309", "Abraham", "Love", "X1T 4K0", "Philippines" ], + [ "2310", "Maggie", "Gaines", "W5Z 6L4", "Chad" ], + [ "2311", "Kylynn", "Sears", "53419", "Ghana" ], + [ "2312", "Abel", "Hudson", "O6C 6K5", "Malaysia" ], + [ "2313", "Aladdin", "Brady", "16465", "Antarctica" ], + [ "2314", "Laurel", "Bush", "42295", "Kyrgyzstan" ], + [ "2315", "Cameron", "Shepherd", "Y8R 5L7", "Finland" ], + [ "2316", "Colin", "Barker", "H8Q 5L0", "Aruba" ], + [ "2317", "Nichole", "Stephens", "B8P 3D5", "Qatar" ], + [ "2318", "Mary", "Dorsey", "J7D 1E5", "Iceland" ], + [ "2319", "Yetta", "Dillon", "I7X 9D3", "Hong Kong" ], + [ "2320", "Hope", "May", "L5W 1T9", "Taiwan, Province of China" ], + [ "2321", "Daphne", "Barr", "W2B 9G2", "Korea, Republic of" ], + [ "2322", "Melissa", "Hartman", "17607", "Reunion" ], + [ "2323", "Acton", "Merritt", "U7M 3Q5", "Cape Verde" ], + [ "2324", "Alika", "Weeks", "45475", "Singapore" ], + [ "2325", "Fitzgerald", "Rowe", "Z3Z 2B6", "Israel" ], + [ "2326", "Frances", "Valentine", "54329", "Kyrgyzstan" ], + [ "2327", "Hollee", "Poole", "56101", "Saint Kitts and Nevis" ], + [ "2328", "Melissa", "Stafford", "R5C 7V0", "Philippines" ], + [ "2329", "Patience", "Jones", "61516", "Mauritius" ], + [ "2330", "Uta", "Sloan", "K1B 9R2", "Timor-leste" ], + [ "2331", "Brent", "West", "69310", "Burundi" ], + [ "2332", "Otto", "Olsen", "88849", "Monaco" ], + [ "2333", "Blossom", "Soto", "E2Q 6E6", "Ukraine" ], + [ "2334", "Anastasia", "Stanton", "S8D 3U5", "Mexico" ], + [ "2335", "Nyssa", "Massey", "A4G 8G7", "Ireland" ], + [ "2336", "Brian", "Moreno", "T6O 4D7", "Myanmar" ], + [ "2337", "Fiona", "Price", "03826", "Benin" ], + [ "2338", "Wyoming", "Knowles", "I5M 7T3", "Chad" ], + [ "2339", "Iola", "Noble", "95251", "Tunisia" ], + [ "2340", "Cameran", "Montgomery", "35748", "Korea" ], + [ "2341", "Wesley", "Sims", "J6O 7C0", "Hungary" ], + [ "2342", "Mona", "Gates", "J6Y 3E2", "Tokelau" ], + [ "2343", "Dominique", "Sellers", "G6U 7I2", "Sudan" ], + [ "2344", "Destiny", "Frazier", "Y2P 5X6", "Madagascar" ], + [ "2345", "Kelsie", "Stokes", "78561", "Yemen" ], + [ "2346", "Julie", "Jordan", "U5H 4H0", "Myanmar" ], + [ "2347", "Xaviera", "Hodge", "36452", "Turkey" ], + [ "2348", "Cain", "Boyd", "74543", "Lebanon" ], + [ "2349", "Devin", "Burch", "94879", "Cyprus" ], + [ "2350", "Michelle", "Manning", "V7T 4A3", "New Zealand" ], + [ "2351", "Quintessa", "Chapman", "95379", "Faroe Islands" ], + [ "2352", "Danielle", "Wells", "27722", "Colombia" ], + [ "2353", "Faith", "Decker", "04881", "Canada" ], + [ "2354", "Gannon", "Chapman", "07687", "Israel" ], + [ "2355", "Jayme", "Black", "A6L 9W1", "Jordan" ], + [ "2356", "Zenia", "Cooley", "A6X 1B7", "Greenland" ], + [ "2357", "Maris", "Burton", "J4G 1Y0", "Ecuador" ], + [ "2358", "Rina", "Vazquez", "G3V 7G6", "Russian Federation" ], + [ "2359", "Nina", "Stanton", "E7Z 1W0", "Dominica" ], + [ "2360", "Alexandra", "Jenkins", "C6N 4R4", "Morocco" ], + [ "2361", "Jerome", "Chen", "68955", "Israel" ], + [ "2362", "Clementine", "Robbins", "X7I 7T3", "Croatia" ], + [ "2363", "Nigel", "Guthrie", "A4N 6X8", "French Southern Territories" ], + [ "2364", "Xaviera", "Griffith", "90489", "Cuba" ], + [ "2365", "Marsden", "Best", "U4B 5R7", "Estonia" ], + [ "2366", "Ebony", "Benson", "H7C 7F7", "Anguilla" ], + [ "2367", "Kylie", "Hansen", "38932", "Eritrea" ], + [ "2368", "Iola", "Copeland", "P4X 9M4", "Rwanda" ], + [ "2369", "Jorden", "Green", "48018", "Namibia" ], + [ "2370", "Hamish", "Porter", "L6F 8L1", "Taiwan, Province of China" ], + [ "2371", "Ezra", "Taylor", "09148", "French Southern Territories" ], + [ "2372", "Dara", "Pratt", "00558", "Saint Kitts and Nevis" ], + [ "2373", "Oliver", "Holt", "C4N 5Z7", "Thailand" ], + [ "2374", "Kato", "Mcgee", "17017", "Micronesia" ], + [ "2375", "Fuller", "Rogers", "M8F 6Y7", "French Polynesia" ], + [ "2376", "Carol", "Stuart", "55980", "Sudan" ], + [ "2377", "Wayne", "Nichols", "37344", "Chile" ], + [ "2378", "Lars", "Gilbert", "27076", "Micronesia" ], + [ "2379", "Todd", "Rollins", "M4I 4X8", "Virgin Islands, U.S." ], + [ "2380", "Colorado", "Justice", "68795", "Yemen" ], + [ "2381", "Jordan", "Chang", "11149", "Mayotte" ], + [ "2382", "Troy", "Haynes", "N2N 1N8", "Reunion" ], + [ "2383", "Amity", "Snyder", "17785", "Argentina" ], + [ "2384", "Kennan", "Turner", "30041", "Brazil" ], + [ "2385", "Dorothy", "Gates", "B7Z 6V4", "Ghana" ], + [ "2386", "Ariana", "Rojas", "70797", "Eritrea" ], + [ "2387", "Desirae", "Joyner", "63493", "Maldives" ], + [ "2388", "Marsden", "Barton", "36343", "Chile" ], + [ "2389", "Graham", "Greer", "65152", "Cayman Islands" ], + [ "2390", "Cameron", "Edwards", "89276", "Montserrat" ], + [ "2391", "Bradley", "White", "80364", "United Kingdom" ], + [ "2392", "Finn", "Cote", "G9P 1P0", "Ghana" ], + [ "2393", "Geoffrey", "Becker", "O5G 4L4", "Wallis and Futuna" ], + [ "2394", "Hayden", "Estes", "Q8G 7F9", "Togo" ], + [ "2395", "Quinlan", "Garrett", "R2C 3E7", "Uganda" ], + [ "2396", "Haviva", "Harrington", "64198", "Bahamas" ], + [ "2397", "Brennan", "Hodge", "35327", "Paraguay" ], + [ "2398", "Halee", "Sykes", "S6J 4S4", "Costa Rica" ], + [ "2399", "Mikayla", "Ruiz", "21686", "Malaysia" ], + [ "2400", "Macy", "Stanley", "F6D 6C4", "Luxembourg" ], + [ "2401", "Petra", "Miles", "O7X 2D2", "Tokelau" ], + [ "2402", "Oprah", "Mendez", "88994", "France" ], + [ "2403", "Upton", "Silva", "17878", "French Southern Territories" ], + [ "2404", "Wade", "Pennington", "S8J 3P2", "Malaysia" ], + [ "2405", "Gannon", "Riddle", "I4A 2H9", "Somalia" ], + [ "2406", "Jana", "Myers", "04982", "Philippines" ], + [ "2407", "Brooke", "Hale", "98272", "Lithuania" ], + [ "2408", "Hashim", "Mendez", "00144", "Saint Helena" ], + [ "2409", "Blythe", "Hanson", "U5Z 6P4", "Saint Helena" ], + [ "2410", "Michelle", "Madden", "B4R 1I9", "Ireland" ], + [ "2411", "Deirdre", "Patton", "B4H 1N7", "Georgia" ], + [ "2412", "Nathaniel", "Chandler", "W1V 8R4", "Sierra Leone" ], + [ "2413", "Tamekah", "Murray", "I8M 1W8", "Guatemala" ], + [ "2414", "Naida", "Boyle", "V4S 2N2", "United Arab Emirates" ], + [ "2415", "Hiroko", "Winters", "K8G 3R9", "Barbados" ], + [ "2416", "Palmer", "Guy", "A4H 5L1", "Saudi Arabia" ], + [ "2417", "Hermione", "Nicholson", "76147", "Marshall Islands" ], + [ "2418", "Russell", "Boyd", "66149", "Switzerland" ], + [ "2419", "Gretchen", "Robles", "B9L 1J7", "Spain" ], + [ "2420", "Leah", "Gibbs", "16682", "Vanuatu" ], + [ "2421", "Amir", "Carlson", "A5C 6F2", "Myanmar" ], + [ "2422", "Merrill", "Ratliff", "A6E 9B2", "Tonga" ], + [ "2423", "Wyatt", "David", "P8G 2M1", "Kiribati" ], + [ "2424", "Violet", "Boyle", "P5X 7B0", "Denmark" ], + [ "2425", "Jared", "Myers", "22131", "Kyrgyzstan" ], + [ "2426", "Lavinia", "Stephenson", "55537", "Turks and Caicos Islands" ], + [ "2427", "Zachary", "Tyson", "C4O 7V4", "Macedonia" ], + [ "2428", "Emma", "Clark", "A7Z 2Z1", "Guam" ], + [ "2429", "Aaron", "Montoya", "Q3U 2X1", "Bahrain" ], + [ "2430", "Dylan", "Roach", "81238", "French Guiana" ], + [ "2431", "Baxter", "Rosario", "H7B 1R2", "Suriname" ], + [ "2432", "Shad", "Bolton", "D1W 5X0", "Barbados" ], + [ "2433", "Hasad", "Hines", "D9U 3H1", "Ukraine" ], + [ "2434", "Maggy", "French", "M3E 5H8", "Nicaragua" ], + [ "2435", "Evangeline", "Jenkins", "57732", "Nigeria" ], + [ "2436", "Eaton", "Shannon", "56854", "Namibia" ], + [ "2437", "Keaton", "Barber", "G5V 7T0", "Svalbard and Jan Mayen" ], + [ "2438", "Lester", "Love", "J5Q 8H3", "United Kingdom" ], + [ "2439", "Olivia", "Foley", "16284", "Mayotte" ], + [ "2440", "Inez", "Craig", "98947", "Poland" ], + [ "2441", "Desirae", "Jacobson", "25950", "French Polynesia" ], + [ "2442", "Amethyst", "Robertson", "78840", "Timor-leste" ], + [ "2443", "Rahim", "Day", "61420", "Maldives" ], + [ "2444", "Kevyn", "Mccarty", "X7T 8Z3", "Guam" ], + [ "2445", "Logan", "Malone", "B6F 8N0", "Madagascar" ], + [ "2446", "Kathleen", "Cote", "L4R 6W9", "Congo" ], + [ "2447", "Porter", "Mclean", "G1Z 1W9", "Mauritius" ], + [ "2448", "Reagan", "Chapman", "86314", "Palestinian Territory, Occupied" ], + [ "2449", "Veda", "Harrington", "R7W 1K4", "Congo" ], + [ "2450", "Dominique", "Hewitt", "P5K 7L4", "San Marino" ], + [ "2451", "Zelda", "Orr", "Z5B 6V1", "Greenland" ], + [ "2452", "Natalie", "Kane", "10491", "Belgium" ], + [ "2453", "Elizabeth", "Bright", "R3V 2R4", "Bangladesh" ], + [ "2454", "Evan", "Knapp", "W3Z 3I5", "Mauritius" ], + [ "2455", "Unity", "Armstrong", "82986", "Kiribati" ], + [ "2456", "Arden", "Winters", "C7D 4M2", "Sweden" ], + [ "2457", "Hayfa", "Henderson", "B8Z 3V3", "Latvia" ], + [ "2458", "Ocean", "Delacruz", "Z3Z 2H8", "Tonga" ], + [ "2459", "Carter", "Harding", "R1Z 8J4", "Ireland" ], + [ "2460", "Harriet", "Simmons", "54757", "Indonesia" ], + [ "2461", "Sopoline", "Hicks", "I5A 6O2", "Argentina" ], + [ "2462", "Jenette", "Ramos", "I4V 3H6", "Portugal" ], + [ "2463", "Abigail", "Berg", "E6P 6L0", "United States" ], + [ "2464", "Sybill", "Fox", "02319", "Svalbard and Jan Mayen" ], + [ "2465", "Wyoming", "Jarvis", "I1R 7V9", "Palestinian Territory, Occupied" ], + [ "2466", "Cynthia", "English", "17983", "Israel" ], + [ "2467", "Jerry", "Little", "33846", "Mauritius" ], + [ "2468", "Quintessa", "Donaldson", "V4N 2K1", "China" ], + [ "2469", "Anne", "Potter", "78596", "United States Minor Outlying Islands" ], + [ "2470", "Madonna", "Hart", "A4A 4T8", "Bahrain" ], + [ "2471", "Madeline", "Walls", "Y3D 4T3", "Comoros" ], + [ "2472", "Fleur", "Blevins", "D1T 9P6", "Guinea-bissau" ], + [ "2473", "Jaden", "Webb", "13917", "Lesotho" ], + [ "2474", "Abdul", "Fleming", "A8A 3Y3", "Canada" ], + [ "2475", "Blaze", "Carroll", "41059", "Marshall Islands" ], + [ "2476", "David", "Hoover", "29132", "Algeria" ], + [ "2477", "Renee", "Nieves", "35843", "Egypt" ], + [ "2478", "Jaime", "Mcclure", "R5K 6B5", "Liechtenstein" ], + [ "2479", "Deborah", "Fletcher", "70399", "Equatorial Guinea" ], + [ "2480", "Otto", "Lopez", "72417", "Belarus" ], + [ "2481", "Bo", "Walls", "F4M 8X8", "Latvia" ], + [ "2482", "Jamal", "Adams", "N9X 3A2", "Spain" ], + [ "2483", "Silas", "Gardner", "25259", "French Guiana" ], + [ "2484", "Aladdin", "Morin", "45179", "Sweden" ], + [ "2485", "Dawn", "Grant", "53613", "Grenada" ], + [ "2486", "Forrest", "Gay", "53606", "Cayman Islands" ], + [ "2487", "Lavinia", "Murphy", "S5L 6X9", "Turkey" ], + [ "2488", "Sylvia", "Wolfe", "37280", "Indonesia" ], + [ "2489", "Wynter", "Adkins", "37391", "Russian Federation" ], + [ "2490", "Iola", "Frank", "I9H 1K7", "Nigeria" ], + [ "2491", "Emmanuel", "Hester", "Z6E 3I4", "Guinea" ], + [ "2492", "Karina", "Christian", "V8M 6F3", "Honduras" ], + [ "2493", "Malcolm", "Holden", "I7J 6U7", "Austria" ], + [ "2494", "Moana", "Holmes", "80402", "Israel" ], + [ "2495", "Ramona", "Hewitt", "U6B 7A6", "Guadeloupe" ], + [ "2496", "Nicholas", "Terry", "V8J 5D9", "Costa Rica" ], + [ "2497", "Erica", "Dunlap", "91596", "Kazakhstan" ], + [ "2498", "Logan", "Harper", "R7V 3T5", "Guinea-bissau" ], + [ "2499", "Bert", "Ortega", "74557", "Paraguay" ], + [ "2500", "Cameron", "Ortiz", "P9C 5B6", "Eritrea" ] +] } \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/data/ssp.php b/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/data/ssp.php new file mode 100644 index 0000000..71057e9 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/data/ssp.php @@ -0,0 +1,58 @@ +<?php + +/* + * DataTables example server-side processing script. + * + * Please note that this script is intentionally extremely simply to show how + * server-side processing can be implemented, and probably shouldn't be used as + * the basis for a large complex system. It is suitable for simple use cases as + * for learning. + * + * See http://datatables.net/usage/server-side for full details on the server- + * side processing requirements of DataTables. + * + * @license MIT - http://datatables.net/license_mit + */ + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Easy set variables + */ + +// DB table to use +$table = 'massive'; + +// Table's primary key +$primaryKey = 'id'; + +// Array of database columns which should be read and sent back to DataTables. +// The `db` parameter represents the column name in the database, while the `dt` +// parameter represents the DataTables column identifier. In this case simple +// indexes +$columns = array( + array( 'db' => 'id', 'dt' => 0 ), + array( 'db' => 'firstname', 'dt' => 1 ), + array( 'db' => 'surname', 'dt' => 2 ), + array( 'db' => 'zip', 'dt' => 3 ), + array( 'db' => 'country', 'dt' => 4 ) +); + +// SQL server connection information +$sql_details = array( + 'user' => '', + 'pass' => '', + 'db' => '', + 'host' => '' +); + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * If you just want to use the basic configuration for DataTables with PHP + * server-side, there is no need to edit below this line. + */ + +require( '../../../../examples/server_side/scripts/ssp.class.php' ); + +echo json_encode( + SSP::simple( $_GET, $sql_details, $table, $primaryKey, $columns ) +); + diff --git a/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/index.html b/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/index.html new file mode 100644 index 0000000..f0b5bcb --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/index.html @@ -0,0 +1,83 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + + <title>Scroller examples - Scroller examples</title> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Scroller example <span>Scroller examples</span></h1> + + <div class="info"> + <p>Scroller is a virtual rendering plug-in for DataTables which allows large datasets to be drawn on + screen every quickly. What the virtual rendering means is that only the visible portion of the table + (and a bit to either side to make the scrolling smooth) is drawn, while the scrolling container gives + the visual impression that the whole table is visible. This is done by making use of the pagination + abilities of DataTables and moving the table around in the scrolling container DataTables adds to the + page. The scrolling container is forced to the height it would be for the full table display using an + extra element.</p> + + <p>Scroller is initialised by simply including the letter <code>S</code> in the <a href= + "//datatables.net/reference/option/dom"><code class="option" title= + "DataTables initialisation option">dom<span>DT</span></code></a> for the table you want to have this + feature enabled on. Note that the <code>S</code> must come after the <code>t</code> parameter in + <a href="//datatables.net/reference/option/dom"><code class="option" title= + "DataTables initialisation option">dom<span>DT</span></code></a>.</p> + + <p>Key features include:</p> + + <ul class="markdown"> + <li>Speed! The aim of Scroller for DataTables is to make rendering large data sets fast</li> + <li>Full compatibility with DataTables' deferred rendering for maximum speed</li> + <li>Integration with state saving in DataTables (scrolling position is saved)</li> + <li>Easy to use</li> + </ul> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./state_saving.html">State saving</a></li> + <li><a href="./large_js_source.html">Client-side data source (50,000 rows)</a></li> + <li><a href="./server-side_processing.html">Server-side processing (5,000,000 + rows)</a></li> + <li><a href="./api_scrolling.html">API</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/large_js_source.html b/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/large_js_source.html new file mode 100644 index 0000000..9d39ffa --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/large_js_source.html @@ -0,0 +1,182 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Scroller example - Client-side data source (50,000 rows)</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.scroller.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.scroller.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + $(document).ready(function() { + var data = []; + for ( var i=0 ; i<50000 ; i++ ) { + data.push( [ i, i, i, i, i ] ); + } + + var oTable = $('#example').dataTable( { + data: data, + deferRender: true, + dom: "frtiS", + scrollY: 200, + scrollCollapse: true + } ); + } ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Scroller example <span>Client-side data source (50,000 rows)</span></h1> + + <div class="info"> + <p>This example is completely artificial in that the data generated is created on the client-side by + just looping around a Javascript array and then passing that to DataTables. However, it does show quite + nicely that DataTables and Scroller can cope with large amounts of data on the client-side quite + nicely. Typically data such as this would be Ajax sourced and server-side processing should be + considered.</p> + + <p>Please be aware that the performance of this page will depend on your browser as the array of data + is generated - for example IE6 will crawl!</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>ID</th> + <th>First name</th> + <th>Last name</th> + <th>ZIP / Post code</th> + <th>Country</th> + </tr> + </thead> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this + example:</p><code class="multiline brush: js;">$(document).ready(function() { + var data = []; + for ( var i=0 ; i&lt;50000 ; i++ ) { + data.push( [ i, i, i, i, i ] ); + } + + var oTable = $('#example').dataTable( { + data: data, + deferRender: true, + dom: &quot;frtiS&quot;, + scrollY: 200, + scrollCollapse: true + } ); + } );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this + example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href= + "../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.scroller.js">../js/dataTables.scroller.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:</p><code class="multiline brush: js;"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the + table:</p> + + <ul> + <li><a href= + "../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.scroller.css">../css/dataTables.scroller.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using <a href="//datatables.net/manual/server-side">the protocol described in the + DataTables documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./state_saving.html">State saving</a></li> + <li class="active"><a href="./large_js_source.html">Client-side data source (50,000 + rows)</a></li> + <li><a href="./server-side_processing.html">Server-side processing (5,000,000 + rows)</a></li> + <li><a href="./api_scrolling.html">API</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/server-side_processing.html b/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/server-side_processing.html new file mode 100644 index 0000000..b1650a9 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/server-side_processing.html @@ -0,0 +1,220 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Scroller example - Server-side processing (5,000,000 rows)</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.scroller.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.scroller.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + serverSide: true, + ordering: false, + searching: false, + ajax: function ( data, callback, settings ) { + var out = []; + + for ( var i=data.start, ien=data.start+data.length ; i<ien ; i++ ) { + out.push( [ i+'-1', i+'-2', i+'-3', i+'-4', i+'-5' ] ); + } + + setTimeout( function () { + callback( { + draw: data.draw, + data: out, + recordsTotal: 5000000, + recordsFiltered: 5000000 + } ); + }, 50 ); + }, + dom: "rtiS", + scrollY: 200, + scroller: { + loadingIndicator: true + } + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Scroller example <span>Server-side processing (5,000,000 rows)</span></h1> + + <div class="info"> + <p>DataTables' server-side processing mode is a feature that naturally fits in with Scroller perfectly. + Server-side processing can be used to show large data sets, with the server being used to do the data + processing, and Scroller optimising the display of the data in a scrolling viewport.</p> + + <p>When using server-side processing, Scroller will wait a small amount of time to allow the scrolling + to finish before requesting more data from the server (200mS by default). This prevents you from DoSing + your own server!</p> + + <p>This example shows Scroller using server-side processing mode and 5 million rows. + <strong>Important</strong> This particular example uses <a href= + "//datatables.net/reference/option/ajax"><code class="option" title= + "DataTables initialisation option">ajax<span>DT</span></code></a> as a function to 'fake' the data to + show Scroller's ability to show large data sets. It does not have a real database behind it! You would + normally not use <a href="//datatables.net/reference/option/ajax"><code class="option" title= + "DataTables initialisation option">ajax<span>DT</span></code></a> as a function to generate data, but + rather as a url for where to fetch the real data!</p> + + <p>In this example we also enable the <code>loadingIndicator</code> option of Scroller to show the end + user what is happening when they scroll passed the currently loaded data.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>ID</th> + <th>First name</th> + <th>Last name</th> + <th>ZIP / Post code</th> + <th>Country</th> + </tr> + </thead> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this + example:</p><code class="multiline brush: js;">$(document).ready(function() { + $('#example').DataTable( { + serverSide: true, + ordering: false, + searching: false, + ajax: function ( data, callback, settings ) { + var out = []; + + for ( var i=data.start, ien=data.start+data.length ; i&lt;ien ; i++ ) { + out.push( [ i+'-1', i+'-2', i+'-3', i+'-4', i+'-5' ] ); + } + + setTimeout( function () { + callback( { + draw: data.draw, + data: out, + recordsTotal: 5000000, + recordsFiltered: 5000000 + } ); + }, 50 ); + }, + dom: &quot;rtiS&quot;, + scrollY: 200, + scroller: { + loadingIndicator: true + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this + example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href= + "../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.scroller.js">../js/dataTables.scroller.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:</p><code class="multiline brush: js;"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the + table:</p> + + <ul> + <li><a href= + "../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.scroller.css">../css/dataTables.scroller.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using <a href="//datatables.net/manual/server-side">the protocol described in the + DataTables documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./state_saving.html">State saving</a></li> + <li><a href="./large_js_source.html">Client-side data source (50,000 rows)</a></li> + <li class="active"><a href="./server-side_processing.html">Server-side processing + (5,000,000 rows)</a></li> + <li><a href="./api_scrolling.html">API</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/simple.html b/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/simple.html new file mode 100644 index 0000000..6d54a6c --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/simple.html @@ -0,0 +1,175 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Scroller example - Basic initialisation</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.scroller.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.scroller.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + ajax: "data/2500.txt", + deferRender: true, + dom: "frtiS", + scrollY: 200, + scrollCollapse: true + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Scroller example <span>Basic initialisation</span></h1> + + <div class="info"> + <p>Scroller is a plug-in for DataTables which enhances DataTables' built-in scrolling features to allow + large amounts of data to be rendered on page very quickly. This is done by Scroller through the use of + a virtual rendering technique that will render only the part of the table that is actually required for + the current view.</p> + + <p>Note that Scroller assumes that all rows are of the same height (in order to preform the required + calculations. You can use <code>td { white-space: nowrap; }</code> in your CSS to ensure that text in + rows does not wrap.</p> + + <p>This example shows how Scroller for DataTables can be initialised by simply including the character + <code>S</code> in sDom (note that the <code>S</code> must come after the <code>t</code> in sDom). + Deferred rendering an and Ajax data source are also used in this example.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>ID</th> + <th>First name</th> + <th>Last name</th> + <th>ZIP / Post code</th> + <th>Country</th> + </tr> + </thead> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this + example:</p><code class="multiline brush: js;">$(document).ready(function() { + $('#example').DataTable( { + ajax: &quot;data/2500.txt&quot;, + deferRender: true, + dom: &quot;frtiS&quot;, + scrollY: 200, + scrollCollapse: true + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this + example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href= + "../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.scroller.js">../js/dataTables.scroller.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:</p><code class="multiline brush: js;"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the + table:</p> + + <ul> + <li><a href= + "../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.scroller.css">../css/dataTables.scroller.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using <a href="//datatables.net/manual/server-side">the protocol described in the + DataTables documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li class="active"><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./state_saving.html">State saving</a></li> + <li><a href="./large_js_source.html">Client-side data source (50,000 rows)</a></li> + <li><a href="./server-side_processing.html">Server-side processing (5,000,000 + rows)</a></li> + <li><a href="./api_scrolling.html">API</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/state_saving.html b/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/state_saving.html new file mode 100644 index 0000000..3dc8c3d --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Scroller/examples/state_saving.html @@ -0,0 +1,170 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>Scroller example - State saving</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.scroller.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.scroller.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + ajax: "data/2500.txt", + deferRender: true, + dom: "frtiS", + scrollY: 200, + scrollCollapse: true, + stateSave: true + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>Scroller example <span>State saving</span></h1> + + <div class="info"> + <p>Scroller will automatically integrate with DataTables in order to save the scrolling position of the + table, if state saving is enabled in the DataTable (<a href= + "//datatables.net/reference/option/stateSave"><code class="option" title= + "DataTables initialisation option">stateSave<span>DT</span></code></a>). This example shows that in + practice - to demonstrate, scroll the table and then reload the page.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>ID</th> + <th>First name</th> + <th>Last name</th> + <th>ZIP / Post code</th> + <th>Country</th> + </tr> + </thead> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this + example:</p><code class="multiline brush: js;">$(document).ready(function() { + $('#example').DataTable( { + ajax: &quot;data/2500.txt&quot;, + deferRender: true, + dom: &quot;frtiS&quot;, + scrollY: 200, + scrollCollapse: true, + stateSave: true + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this + example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href= + "../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.scroller.js">../js/dataTables.scroller.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by + DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library + files (below), in order to correctly display the table. The additional CSS used is shown + below:</p><code class="multiline brush: js;"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the + table:</p> + + <ul> + <li><a href= + "../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.scroller.css">../css/dataTables.scroller.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data + will update automatically as any additional data is loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note + that this is just an example script using PHP. Server-side processing scripts can be written in any + language, using <a href="//datatables.net/manual/server-side">the protocol described in the + DataTables documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li class="active"><a href="./state_saving.html">State saving</a></li> + <li><a href="./large_js_source.html">Client-side data source (50,000 rows)</a></li> + <li><a href="./server-side_processing.html">Server-side processing (5,000,000 + rows)</a></li> + <li><a href="./api_scrolling.html">API</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full + information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and + <a href="http://www.datatables.net/plug-ins">plug-ins</a> which extend the capabilities of + DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href= + "http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2014<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/Scroller/images/loading-background.png b/theme/bootstrap/plugins/datatables/extensions/Scroller/images/loading-background.png new file mode 100644 index 0000000..2d81507 Binary files /dev/null and b/theme/bootstrap/plugins/datatables/extensions/Scroller/images/loading-background.png differ diff --git a/theme/bootstrap/plugins/datatables/extensions/Scroller/js/dataTables.scroller.js b/theme/bootstrap/plugins/datatables/extensions/Scroller/js/dataTables.scroller.js new file mode 100644 index 0000000..2beecdb --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Scroller/js/dataTables.scroller.js @@ -0,0 +1,1262 @@ +/*! Scroller 1.2.2 + * ©2011-2014 SpryMedia Ltd - datatables.net/license + */ + +/** + * @summary Scroller + * @description Virtual rendering for DataTables + * @version 1.2.2 + * @file dataTables.scroller.js + * @author SpryMedia Ltd (www.sprymedia.co.uk) + * @contact www.sprymedia.co.uk/contact + * @copyright Copyright 2011-2014 SpryMedia Ltd. + * + * This source file is free software, available under the following license: + * MIT license - http://datatables.net/license/mit + * + * This source file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. + * + * For details please refer to: http://www.datatables.net + */ + +(function(window, document, undefined){ + + +var factory = function( $, DataTable ) { +"use strict"; + +/** + * Scroller is a virtual rendering plug-in for DataTables which allows large + * datasets to be drawn on screen every quickly. What the virtual rendering means + * is that only the visible portion of the table (and a bit to either side to make + * the scrolling smooth) is drawn, while the scrolling container gives the + * visual impression that the whole table is visible. This is done by making use + * of the pagination abilities of DataTables and moving the table around in the + * scrolling container DataTables adds to the page. The scrolling container is + * forced to the height it would be for the full table display using an extra + * element. + * + * Note that rows in the table MUST all be the same height. Information in a cell + * which expands on to multiple lines will cause some odd behaviour in the scrolling. + * + * Scroller is initialised by simply including the letter 'S' in the sDom for the + * table you want to have this feature enabled on. Note that the 'S' must come + * AFTER the 't' parameter in `dom`. + * + * Key features include: + * <ul class="limit_length"> + * <li>Speed! The aim of Scroller for DataTables is to make rendering large data sets fast</li> + * <li>Full compatibility with deferred rendering in DataTables 1.9 for maximum speed</li> + * <li>Display millions of rows</li> + * <li>Integration with state saving in DataTables (scrolling position is saved)</li> + * <li>Easy to use</li> + * </ul> + * + * @class + * @constructor + * @global + * @param {object} oDT DataTables settings object + * @param {object} [oOpts={}] Configuration object for FixedColumns. Options + * are defined by {@link Scroller.defaults} + * + * @requires jQuery 1.7+ + * @requires DataTables 1.9.0+ + * + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "sScrollY": "200px", + * "sAjaxSource": "media/dataset/large.txt", + * "sDom": "frtiS", + * "bDeferRender": true + * } ); + * } ); + */ +var Scroller = function ( oDTSettings, oOpts ) { + /* Sanity check - you just know it will happen */ + if ( ! this instanceof Scroller ) + { + alert( "Scroller warning: Scroller must be initialised with the 'new' keyword." ); + return; + } + + if ( typeof oOpts == 'undefined' ) + { + oOpts = {}; + } + + /** + * Settings object which contains customisable information for the Scroller instance + * @namespace + * @private + * @extends Scroller.defaults + */ + this.s = { + /** + * DataTables settings object + * @type object + * @default Passed in as first parameter to constructor + */ + "dt": oDTSettings, + + /** + * Pixel location of the top of the drawn table in the viewport + * @type int + * @default 0 + */ + "tableTop": 0, + + /** + * Pixel location of the bottom of the drawn table in the viewport + * @type int + * @default 0 + */ + "tableBottom": 0, + + /** + * Pixel location of the boundary for when the next data set should be loaded and drawn + * when scrolling up the way. + * @type int + * @default 0 + * @private + */ + "redrawTop": 0, + + /** + * Pixel location of the boundary for when the next data set should be loaded and drawn + * when scrolling down the way. Note that this is actually calculated as the offset from + * the top. + * @type int + * @default 0 + * @private + */ + "redrawBottom": 0, + + /** + * Auto row height or not indicator + * @type bool + * @default 0 + */ + "autoHeight": true, + + /** + * Number of rows calculated as visible in the visible viewport + * @type int + * @default 0 + */ + "viewportRows": 0, + + /** + * setTimeout reference for state saving, used when state saving is enabled in the DataTable + * and when the user scrolls the viewport in order to stop the cookie set taking too much + * CPU! + * @type int + * @default 0 + */ + "stateTO": null, + + /** + * setTimeout reference for the redraw, used when server-side processing is enabled in the + * DataTables in order to prevent DoSing the server + * @type int + * @default null + */ + "drawTO": null, + + heights: { + jump: null, + page: null, + virtual: null, + scroll: null, + + /** + * Height of rows in the table + * @type int + * @default 0 + */ + row: null, + + /** + * Pixel height of the viewport + * @type int + * @default 0 + */ + viewport: null + }, + + topRowFloat: 0, + scrollDrawDiff: null, + loaderVisible: false + }; + + // @todo The defaults should extend a `c` property and the internal settings + // only held in the `s` property. At the moment they are mixed + this.s = $.extend( this.s, Scroller.oDefaults, oOpts ); + + // Workaround for row height being read from height object (see above comment) + this.s.heights.row = this.s.rowHeight; + + /** + * DOM elements used by the class instance + * @private + * @namespace + * + */ + this.dom = { + "force": document.createElement('div'), + "scroller": null, + "table": null, + "loader": null + }; + + /* Attach the instance to the DataTables instance so it can be accessed */ + this.s.dt.oScroller = this; + + /* Let's do it */ + this._fnConstruct(); +}; + + + +Scroller.prototype = /** @lends Scroller.prototype */{ + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Public methods + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * Calculate the pixel position from the top of the scrolling container for + * a given row + * @param {int} iRow Row number to calculate the position of + * @returns {int} Pixels + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "sScrollY": "200px", + * "sAjaxSource": "media/dataset/large.txt", + * "sDom": "frtiS", + * "bDeferRender": true, + * "fnInitComplete": function (o) { + * // Find where row 25 is + * alert( o.oScroller.fnRowToPixels( 25 ) ); + * } + * } ); + * } ); + */ + "fnRowToPixels": function ( rowIdx, intParse, virtual ) + { + var pixels; + + if ( virtual ) { + pixels = this._domain( 'virtualToPhysical', rowIdx * this.s.heights.row ); + } + else { + var diff = rowIdx - this.s.baseRowTop; + pixels = this.s.baseScrollTop + (diff * this.s.heights.row); + } + + return intParse || intParse === undefined ? + parseInt( pixels, 10 ) : + pixels; + }, + + + /** + * Calculate the row number that will be found at the given pixel position + * (y-scroll). + * + * Please note that when the height of the full table exceeds 1 million + * pixels, Scroller switches into a non-linear mode for the scrollbar to fit + * all of the records into a finite area, but this function returns a linear + * value (relative to the last non-linear positioning). + * @param {int} iPixels Offset from top to calculate the row number of + * @param {int} [intParse=true] If an integer value should be returned + * @param {int} [virtual=false] Perform the calculations in the virtual domain + * @returns {int} Row index + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "sScrollY": "200px", + * "sAjaxSource": "media/dataset/large.txt", + * "sDom": "frtiS", + * "bDeferRender": true, + * "fnInitComplete": function (o) { + * // Find what row number is at 500px + * alert( o.oScroller.fnPixelsToRow( 500 ) ); + * } + * } ); + * } ); + */ + "fnPixelsToRow": function ( pixels, intParse, virtual ) + { + var diff = pixels - this.s.baseScrollTop; + var row = virtual ? + this._domain( 'physicalToVirtual', pixels ) / this.s.heights.row : + ( diff / this.s.heights.row ) + this.s.baseRowTop; + + return intParse || intParse === undefined ? + parseInt( row, 10 ) : + row; + }, + + + /** + * Calculate the row number that will be found at the given pixel position (y-scroll) + * @param {int} iRow Row index to scroll to + * @param {bool} [bAnimate=true] Animate the transition or not + * @returns {void} + * @example + * $(document).ready(function() { + * $('#example').dataTable( { + * "sScrollY": "200px", + * "sAjaxSource": "media/dataset/large.txt", + * "sDom": "frtiS", + * "bDeferRender": true, + * "fnInitComplete": function (o) { + * // Immediately scroll to row 1000 + * o.oScroller.fnScrollToRow( 1000 ); + * } + * } ); + * + * // Sometime later on use the following to scroll to row 500... + * var oSettings = $('#example').dataTable().fnSettings(); + * oSettings.oScroller.fnScrollToRow( 500 ); + * } ); + */ + "fnScrollToRow": function ( iRow, bAnimate ) + { + var that = this; + var ani = false; + var px = this.fnRowToPixels( iRow ); + + // We need to know if the table will redraw or not before doing the + // scroll. If it will not redraw, then we need to use the currently + // displayed table, and scroll with the physical pixels. Otherwise, we + // need to calculate the table's new position from the virtual + // transform. + var preRows = ((this.s.displayBuffer-1)/2) * this.s.viewportRows; + var drawRow = iRow - preRows; + if ( drawRow < 0 ) { + drawRow = 0; + } + + if ( (px > this.s.redrawBottom || px < this.s.redrawTop) && this.s.dt._iDisplayStart !== drawRow ) { + ani = true; + px = this.fnRowToPixels( iRow, false, true ); + } + + if ( typeof bAnimate == 'undefined' || bAnimate ) + { + this.s.ani = ani; + $(this.dom.scroller).animate( { + "scrollTop": px + }, function () { + // This needs to happen after the animation has completed and + // the final scroll event fired + setTimeout( function () { + that.s.ani = false; + }, 25 ); + } ); + } + else + { + $(this.dom.scroller).scrollTop( px ); + } + }, + + + /** + * Calculate and store information about how many rows are to be displayed + * in the scrolling viewport, based on current dimensions in the browser's + * rendering. This can be particularly useful if the table is initially + * drawn in a hidden element - for example in a tab. + * @param {bool} [bRedraw=true] Redraw the table automatically after the recalculation, with + * the new dimensions forming the basis for the draw. + * @returns {void} + * @example + * $(document).ready(function() { + * // Make the example container hidden to throw off the browser's sizing + * document.getElementById('container').style.display = "none"; + * var oTable = $('#example').dataTable( { + * "sScrollY": "200px", + * "sAjaxSource": "media/dataset/large.txt", + * "sDom": "frtiS", + * "bDeferRender": true, + * "fnInitComplete": function (o) { + * // Immediately scroll to row 1000 + * o.oScroller.fnScrollToRow( 1000 ); + * } + * } ); + * + * setTimeout( function () { + * // Make the example container visible and recalculate the scroller sizes + * document.getElementById('container').style.display = "block"; + * oTable.fnSettings().oScroller.fnMeasure(); + * }, 3000 ); + */ + "fnMeasure": function ( bRedraw ) + { + if ( this.s.autoHeight ) + { + this._fnCalcRowHeight(); + } + + var heights = this.s.heights; + + heights.viewport = $(this.dom.scroller).height(); + this.s.viewportRows = parseInt( heights.viewport / heights.row, 10 )+1; + this.s.dt._iDisplayLength = this.s.viewportRows * this.s.displayBuffer; + + if ( bRedraw === undefined || bRedraw ) + { + this.s.dt.oInstance.fnDraw(); + } + }, + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Private methods (they are of course public in JS, but recommended as private) + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * Initialisation for Scroller + * @returns {void} + * @private + */ + "_fnConstruct": function () + { + var that = this; + + /* Sanity check */ + if ( !this.s.dt.oFeatures.bPaginate ) { + this.s.dt.oApi._fnLog( this.s.dt, 0, 'Pagination must be enabled for Scroller' ); + return; + } + + /* Insert a div element that we can use to force the DT scrolling container to + * the height that would be required if the whole table was being displayed + */ + this.dom.force.style.position = "absolute"; + this.dom.force.style.top = "0px"; + this.dom.force.style.left = "0px"; + this.dom.force.style.width = "1px"; + + this.dom.scroller = $('div.'+this.s.dt.oClasses.sScrollBody, this.s.dt.nTableWrapper)[0]; + this.dom.scroller.appendChild( this.dom.force ); + this.dom.scroller.style.position = "relative"; + + this.dom.table = $('>table', this.dom.scroller)[0]; + this.dom.table.style.position = "absolute"; + this.dom.table.style.top = "0px"; + this.dom.table.style.left = "0px"; + + // Add class to 'announce' that we are a Scroller table + $(this.s.dt.nTableWrapper).addClass('DTS'); + + // Add a 'loading' indicator + if ( this.s.loadingIndicator ) + { + this.dom.loader = $('<div class="DTS_Loading">'+this.s.dt.oLanguage.sLoadingRecords+'</div>') + .css('display', 'none'); + + $(this.dom.scroller.parentNode) + .css('position', 'relative') + .append( this.dom.loader ); + } + + /* Initial size calculations */ + if ( this.s.heights.row && this.s.heights.row != 'auto' ) + { + this.s.autoHeight = false; + } + this.fnMeasure( false ); + + /* Scrolling callback to see if a page change is needed - use a throttled + * function for the save save callback so we aren't hitting it on every + * scroll + */ + this.s.ingnoreScroll = true; + this.s.stateSaveThrottle = this.s.dt.oApi._fnThrottle( function () { + that.s.dt.oApi._fnSaveState( that.s.dt ); + }, 500 ); + $(this.dom.scroller).on( 'scroll.DTS', function (e) { + that._fnScroll.call( that ); + } ); + + /* In iOS we catch the touchstart event in case the user tries to scroll + * while the display is already scrolling + */ + $(this.dom.scroller).on('touchstart.DTS', function () { + that._fnScroll.call( that ); + } ); + + /* Update the scroller when the DataTable is redrawn */ + this.s.dt.aoDrawCallback.push( { + "fn": function () { + if ( that.s.dt.bInitialised ) { + that._fnDrawCallback.call( that ); + } + }, + "sName": "Scroller" + } ); + + /* On resize, update the information element, since the number of rows shown might change */ + $(window).on( 'resize.DTS', function () { + that.fnMeasure( false ); + that._fnInfo(); + } ); + + /* Add a state saving parameter to the DT state saving so we can restore the exact + * position of the scrolling + */ + var initialStateSave = true; + this.s.dt.oApi._fnCallbackReg( this.s.dt, 'aoStateSaveParams', function (oS, oData) { + /* Set iScroller to saved scroll position on initialization. + */ + if(initialStateSave && that.s.dt.oLoadedState){ + oData.iScroller = that.s.dt.oLoadedState.iScroller; + oData.iScrollerTopRow = that.s.dt.oLoadedState.iScrollerTopRow; + initialStateSave = false; + } else { + oData.iScroller = that.dom.scroller.scrollTop; + oData.iScrollerTopRow = that.s.topRowFloat; + } + }, "Scroller_State" ); + + if ( this.s.dt.oLoadedState ) { + this.s.topRowFloat = this.s.dt.oLoadedState.iScrollerTopRow || 0; + } + + /* Destructor */ + this.s.dt.aoDestroyCallback.push( { + "sName": "Scroller", + "fn": function () { + $(window).off( 'resize.DTS' ); + $(that.dom.scroller).off('touchstart.DTS scroll.DTS'); + $(that.s.dt.nTableWrapper).removeClass('DTS'); + $('div.DTS_Loading', that.dom.scroller.parentNode).remove(); + + that.dom.table.style.position = ""; + that.dom.table.style.top = ""; + that.dom.table.style.left = ""; + } + } ); + }, + + + /** + * Scrolling function - fired whenever the scrolling position is changed. + * This method needs to use the stored values to see if the table should be + * redrawn as we are moving towards the end of the information that is + * currently drawn or not. If needed, then it will redraw the table based on + * the new position. + * @returns {void} + * @private + */ + "_fnScroll": function () + { + var + that = this, + heights = this.s.heights, + iScrollTop = this.dom.scroller.scrollTop, + iTopRow; + + if ( this.s.skip ) { + return; + } + + if ( this.s.ingnoreScroll ) { + return; + } + + /* If the table has been sorted or filtered, then we use the redraw that + * DataTables as done, rather than performing our own + */ + if ( this.s.dt.bFiltered || this.s.dt.bSorted ) { + this.s.lastScrollTop = 0; + return; + } + + /* Update the table's information display for what is now in the viewport */ + this._fnInfo(); + + /* We don't want to state save on every scroll event - that's heavy + * handed, so use a timeout to update the state saving only when the + * scrolling has finished + */ + clearTimeout( this.s.stateTO ); + this.s.stateTO = setTimeout( function () { + that.s.dt.oApi._fnSaveState( that.s.dt ); + }, 250 ); + + /* Check if the scroll point is outside the trigger boundary which would required + * a DataTables redraw + */ + if ( iScrollTop < this.s.redrawTop || iScrollTop > this.s.redrawBottom ) { + var preRows = Math.ceil( ((this.s.displayBuffer-1)/2) * this.s.viewportRows ); + + if ( Math.abs( iScrollTop - this.s.lastScrollTop ) > heights.viewport || this.s.ani ) { + iTopRow = parseInt(this._domain( 'physicalToVirtual', iScrollTop ) / heights.row, 10) - preRows; + this.s.topRowFloat = (this._domain( 'physicalToVirtual', iScrollTop ) / heights.row); + } + else { + iTopRow = this.fnPixelsToRow( iScrollTop ) - preRows; + this.s.topRowFloat = this.fnPixelsToRow( iScrollTop, false ); + } + + if ( iTopRow <= 0 ) { + /* At the start of the table */ + iTopRow = 0; + } + else if ( iTopRow + this.s.dt._iDisplayLength > this.s.dt.fnRecordsDisplay() ) { + /* At the end of the table */ + iTopRow = this.s.dt.fnRecordsDisplay() - this.s.dt._iDisplayLength; + if ( iTopRow < 0 ) { + iTopRow = 0; + } + } + else if ( iTopRow % 2 !== 0 ) { + // For the row-striping classes (odd/even) we want only to start + // on evens otherwise the stripes will change between draws and + // look rubbish + iTopRow++; + } + + if ( iTopRow != this.s.dt._iDisplayStart ) { + /* Cache the new table position for quick lookups */ + this.s.tableTop = $(this.s.dt.nTable).offset().top; + this.s.tableBottom = $(this.s.dt.nTable).height() + this.s.tableTop; + + var draw = function () { + if ( that.s.scrollDrawReq === null ) { + that.s.scrollDrawReq = iScrollTop; + } + + that.s.dt._iDisplayStart = iTopRow; + if ( that.s.dt.oApi._fnCalculateEnd ) { // Removed in 1.10 + that.s.dt.oApi._fnCalculateEnd( that.s.dt ); + } + that.s.dt.oApi._fnDraw( that.s.dt ); + }; + + /* Do the DataTables redraw based on the calculated start point - note that when + * using server-side processing we introduce a small delay to not DoS the server... + */ + if ( this.s.dt.oFeatures.bServerSide ) { + clearTimeout( this.s.drawTO ); + this.s.drawTO = setTimeout( draw, this.s.serverWait ); + } + else { + draw(); + } + + if ( this.dom.loader && ! this.s.loaderVisible ) { + this.dom.loader.css( 'display', 'block' ); + this.s.loaderVisible = true; + } + } + } + + this.s.lastScrollTop = iScrollTop; + this.s.stateSaveThrottle(); + }, + + + /** + * Convert from one domain to another. The physical domain is the actual + * pixel count on the screen, while the virtual is if we had browsers which + * had scrolling containers of infinite height (i.e. the absolute value) + * + * @param {string} dir Domain transform direction, `virtualToPhysical` or + * `physicalToVirtual` + * @returns {number} Calculated transform + * @private + */ + _domain: function ( dir, val ) + { + var heights = this.s.heights; + var coeff; + + // If the virtual and physical height match, then we use a linear + // transform between the two, allowing the scrollbar to be linear + if ( heights.virtual === heights.scroll ) { + coeff = (heights.virtual-heights.viewport) / (heights.scroll-heights.viewport); + + if ( dir === 'virtualToPhysical' ) { + return val / coeff; + } + else if ( dir === 'physicalToVirtual' ) { + return val * coeff; + } + } + + // Otherwise, we want a non-linear scrollbar to take account of the + // redrawing regions at the start and end of the table, otherwise these + // can stutter badly - on large tables 30px (for example) scroll might + // be hundreds of rows, so the table would be redrawing every few px at + // the start and end. Use a simple quadratic to stop this. It does mean + // the scrollbar is non-linear, but with such massive data sets, the + // scrollbar is going to be a best guess anyway + var xMax = (heights.scroll - heights.viewport) / 2; + var yMax = (heights.virtual - heights.viewport) / 2; + + coeff = yMax / ( xMax * xMax ); + + if ( dir === 'virtualToPhysical' ) { + if ( val < yMax ) { + return Math.pow(val / coeff, 0.5); + } + else { + val = (yMax*2) - val; + return val < 0 ? + heights.scroll : + (xMax*2) - Math.pow(val / coeff, 0.5); + } + } + else if ( dir === 'physicalToVirtual' ) { + if ( val < xMax ) { + return val * val * coeff; + } + else { + val = (xMax*2) - val; + return val < 0 ? + heights.virtual : + (yMax*2) - (val * val * coeff); + } + } + }, + + + /** + * Draw callback function which is fired when the DataTable is redrawn. The main function of + * this method is to position the drawn table correctly the scrolling container for the rows + * that is displays as a result of the scrolling position. + * @returns {void} + * @private + */ + "_fnDrawCallback": function () + { + var + that = this, + heights = this.s.heights, + iScrollTop = this.dom.scroller.scrollTop, + iActualScrollTop = iScrollTop, + iScrollBottom = iScrollTop + heights.viewport, + iTableHeight = $(this.s.dt.nTable).height(), + displayStart = this.s.dt._iDisplayStart, + displayLen = this.s.dt._iDisplayLength, + displayEnd = this.s.dt.fnRecordsDisplay(); + + // Disable the scroll event listener while we are updating the DOM + this.s.skip = true; + + // Resize the scroll forcing element + this._fnScrollForce(); + + // Reposition the scrolling for the updated virtual position if needed + if ( displayStart === 0 ) { + // Linear calculation at the top of the table + iScrollTop = this.s.topRowFloat * heights.row; + } + else if ( displayStart + displayLen >= displayEnd ) { + // Linear calculation that the bottom as well + iScrollTop = heights.scroll - ((displayEnd - this.s.topRowFloat) * heights.row); + } + else { + // Domain scaled in the middle + iScrollTop = this._domain( 'virtualToPhysical', this.s.topRowFloat * heights.row ); + } + + this.dom.scroller.scrollTop = iScrollTop; + + // Store positional information so positional calculations can be based + // upon the current table draw position + this.s.baseScrollTop = iScrollTop; + this.s.baseRowTop = this.s.topRowFloat; + + // Position the table in the virtual scroller + var tableTop = iScrollTop - ((this.s.topRowFloat - displayStart) * heights.row); + if ( displayStart === 0 ) { + tableTop = 0; + } + else if ( displayStart + displayLen >= displayEnd ) { + tableTop = heights.scroll - iTableHeight; + } + + this.dom.table.style.top = tableTop+'px'; + + /* Cache some information for the scroller */ + this.s.tableTop = tableTop; + this.s.tableBottom = iTableHeight + this.s.tableTop; + + // Calculate the boundaries for where a redraw will be triggered by the + // scroll event listener + var boundaryPx = (iScrollTop - this.s.tableTop) * this.s.boundaryScale; + this.s.redrawTop = iScrollTop - boundaryPx; + this.s.redrawBottom = iScrollTop + boundaryPx; + + this.s.skip = false; + + // Restore the scrolling position that was saved by DataTable's state + // saving Note that this is done on the second draw when data is Ajax + // sourced, and the first draw when DOM soured + if ( this.s.dt.oFeatures.bStateSave && this.s.dt.oLoadedState !== null && + typeof this.s.dt.oLoadedState.iScroller != 'undefined' ) + { + // A quirk of DataTables is that the draw callback will occur on an + // empty set if Ajax sourced, but not if server-side processing. + var ajaxSourced = (this.s.dt.sAjaxSource || that.s.dt.ajax) && ! this.s.dt.oFeatures.bServerSide ? + true : + false; + + if ( ( ajaxSourced && this.s.dt.iDraw == 2) || + (!ajaxSourced && this.s.dt.iDraw == 1) ) + { + setTimeout( function () { + $(that.dom.scroller).scrollTop( that.s.dt.oLoadedState.iScroller ); + that.s.redrawTop = that.s.dt.oLoadedState.iScroller - (heights.viewport/2); + + // In order to prevent layout thrashing we need another + // small delay + setTimeout( function () { + that.s.ingnoreScroll = false; + }, 0 ); + }, 0 ); + } + } + else { + that.s.ingnoreScroll = false; + } + + // Because of the order of the DT callbacks, the info update will + // take precedence over the one we want here. So a 'thread' break is + // needed + setTimeout( function () { + that._fnInfo.call( that ); + }, 0 ); + + // Hide the loading indicator + if ( this.dom.loader && this.s.loaderVisible ) { + this.dom.loader.css( 'display', 'none' ); + this.s.loaderVisible = false; + } + }, + + + /** + * Force the scrolling container to have height beyond that of just the + * table that has been drawn so the user can scroll the whole data set. + * + * Note that if the calculated required scrolling height exceeds a maximum + * value (1 million pixels - hard-coded) the forcing element will be set + * only to that maximum value and virtual / physical domain transforms will + * be used to allow Scroller to display tables of any number of records. + * @returns {void} + * @private + */ + _fnScrollForce: function () + { + var heights = this.s.heights; + var max = 1000000; + + heights.virtual = heights.row * this.s.dt.fnRecordsDisplay(); + heights.scroll = heights.virtual; + + if ( heights.scroll > max ) { + heights.scroll = max; + } + + this.dom.force.style.height = heights.scroll+"px"; + }, + + + /** + * Automatic calculation of table row height. This is just a little tricky here as using + * initialisation DataTables has tale the table out of the document, so we need to create + * a new table and insert it into the document, calculate the row height and then whip the + * table out. + * @returns {void} + * @private + */ + "_fnCalcRowHeight": function () + { + var dt = this.s.dt; + var origTable = dt.nTable; + var nTable = origTable.cloneNode( false ); + var tbody = $('<tbody/>').appendTo( nTable ); + var container = $( + '<div class="'+dt.oClasses.sWrapper+' DTS">'+ + '<div class="'+dt.oClasses.sScrollWrapper+'">'+ + '<div class="'+dt.oClasses.sScrollBody+'"></div>'+ + '</div>'+ + '</div>' + ); + + // Want 3 rows in the sizing table so :first-child and :last-child + // CSS styles don't come into play - take the size of the middle row + $('tbody tr:lt(4)', origTable).clone().appendTo( tbody ); + while( $('tr', tbody).length < 3 ) { + tbody.append( '<tr><td>&nbsp;</td></tr>' ); + } + + $('div.'+dt.oClasses.sScrollBody, container).append( nTable ); + + var appendTo; + if (dt._bInitComplete) { + appendTo = origTable.parentNode; + } else { + if (!this.s.dt.nHolding) { + this.s.dt.nHolding = $( '<div></div>' ).insertBefore( this.s.dt.nTable ); + } + appendTo = this.s.dt.nHolding; + } + + container.appendTo( appendTo ); + this.s.heights.row = $('tr', tbody).eq(1).outerHeight(); + container.remove(); + }, + + + /** + * Update any information elements that are controlled by the DataTable based on the scrolling + * viewport and what rows are visible in it. This function basically acts in the same way as + * _fnUpdateInfo in DataTables, and effectively replaces that function. + * @returns {void} + * @private + */ + "_fnInfo": function () + { + if ( !this.s.dt.oFeatures.bInfo ) + { + return; + } + + var + dt = this.s.dt, + language = dt.oLanguage, + iScrollTop = this.dom.scroller.scrollTop, + iStart = Math.floor( this.fnPixelsToRow(iScrollTop, false, this.s.ani)+1 ), + iMax = dt.fnRecordsTotal(), + iTotal = dt.fnRecordsDisplay(), + iPossibleEnd = Math.ceil( this.fnPixelsToRow(iScrollTop+this.s.heights.viewport, false, this.s.ani) ), + iEnd = iTotal < iPossibleEnd ? iTotal : iPossibleEnd, + sStart = dt.fnFormatNumber( iStart ), + sEnd = dt.fnFormatNumber( iEnd ), + sMax = dt.fnFormatNumber( iMax ), + sTotal = dt.fnFormatNumber( iTotal ), + sOut; + + if ( dt.fnRecordsDisplay() === 0 && + dt.fnRecordsDisplay() == dt.fnRecordsTotal() ) + { + /* Empty record set */ + sOut = language.sInfoEmpty+ language.sInfoPostFix; + } + else if ( dt.fnRecordsDisplay() === 0 ) + { + /* Empty record set after filtering */ + sOut = language.sInfoEmpty +' '+ + language.sInfoFiltered.replace('_MAX_', sMax)+ + language.sInfoPostFix; + } + else if ( dt.fnRecordsDisplay() == dt.fnRecordsTotal() ) + { + /* Normal record set */ + sOut = language.sInfo. + replace('_START_', sStart). + replace('_END_', sEnd). + replace('_MAX_', sMax). + replace('_TOTAL_', sTotal)+ + language.sInfoPostFix; + } + else + { + /* Record set after filtering */ + sOut = language.sInfo. + replace('_START_', sStart). + replace('_END_', sEnd). + replace('_MAX_', sMax). + replace('_TOTAL_', sTotal) +' '+ + language.sInfoFiltered.replace( + '_MAX_', + dt.fnFormatNumber(dt.fnRecordsTotal()) + )+ + language.sInfoPostFix; + } + + var callback = language.fnInfoCallback; + if ( callback ) { + sOut = callback.call( dt.oInstance, + dt, iStart, iEnd, iMax, iTotal, sOut + ); + } + + var n = dt.aanFeatures.i; + if ( typeof n != 'undefined' ) + { + for ( var i=0, iLen=n.length ; i<iLen ; i++ ) + { + $(n[i]).html( sOut ); + } + } + } +}; + + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Statics + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + +/** + * Scroller default settings for initialisation + * @namespace + * @name Scroller.defaults + * @static + */ +Scroller.defaults = /** @lends Scroller.defaults */{ + /** + * Indicate if Scroller show show trace information on the console or not. This can be + * useful when debugging Scroller or if just curious as to what it is doing, but should + * be turned off for production. + * @type bool + * @default false + * @static + * @example + * var oTable = $('#example').dataTable( { + * "sScrollY": "200px", + * "sDom": "frtiS", + * "bDeferRender": true, + * "oScroller": { + * "trace": true + * } + * } ); + */ + "trace": false, + + /** + * Scroller will attempt to automatically calculate the height of rows for it's internal + * calculations. However the height that is used can be overridden using this parameter. + * @type int|string + * @default auto + * @static + * @example + * var oTable = $('#example').dataTable( { + * "sScrollY": "200px", + * "sDom": "frtiS", + * "bDeferRender": true, + * "oScroller": { + * "rowHeight": 30 + * } + * } ); + */ + "rowHeight": "auto", + + /** + * When using server-side processing, Scroller will wait a small amount of time to allow + * the scrolling to finish before requesting more data from the server. This prevents + * you from DoSing your own server! The wait time can be configured by this parameter. + * @type int + * @default 200 + * @static + * @example + * var oTable = $('#example').dataTable( { + * "sScrollY": "200px", + * "sDom": "frtiS", + * "bDeferRender": true, + * "oScroller": { + * "serverWait": 100 + * } + * } ); + */ + "serverWait": 200, + + /** + * The display buffer is what Scroller uses to calculate how many rows it should pre-fetch + * for scrolling. Scroller automatically adjusts DataTables' display length to pre-fetch + * rows that will be shown in "near scrolling" (i.e. just beyond the current display area). + * The value is based upon the number of rows that can be displayed in the viewport (i.e. + * a value of 1), and will apply the display range to records before before and after the + * current viewport - i.e. a factor of 3 will allow Scroller to pre-fetch 1 viewport's worth + * of rows before the current viewport, the current viewport's rows and 1 viewport's worth + * of rows after the current viewport. Adjusting this value can be useful for ensuring + * smooth scrolling based on your data set. + * @type int + * @default 7 + * @static + * @example + * var oTable = $('#example').dataTable( { + * "sScrollY": "200px", + * "sDom": "frtiS", + * "bDeferRender": true, + * "oScroller": { + * "displayBuffer": 10 + * } + * } ); + */ + "displayBuffer": 9, + + /** + * Scroller uses the boundary scaling factor to decide when to redraw the table - which it + * typically does before you reach the end of the currently loaded data set (in order to + * allow the data to look continuous to a user scrolling through the data). If given as 0 + * then the table will be redrawn whenever the viewport is scrolled, while 1 would not + * redraw the table until the currently loaded data has all been shown. You will want + * something in the middle - the default factor of 0.5 is usually suitable. + * @type float + * @default 0.5 + * @static + * @example + * var oTable = $('#example').dataTable( { + * "sScrollY": "200px", + * "sDom": "frtiS", + * "bDeferRender": true, + * "oScroller": { + * "boundaryScale": 0.75 + * } + * } ); + */ + "boundaryScale": 0.5, + + /** + * Show (or not) the loading element in the background of the table. Note that you should + * include the dataTables.scroller.css file for this to be displayed correctly. + * @type boolean + * @default false + * @static + * @example + * var oTable = $('#example').dataTable( { + * "sScrollY": "200px", + * "sDom": "frtiS", + * "bDeferRender": true, + * "oScroller": { + * "loadingIndicator": true + * } + * } ); + */ + "loadingIndicator": false +}; + +Scroller.oDefaults = Scroller.defaults; + + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Constants + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** + * Scroller version + * @type String + * @default See code + * @name Scroller.version + * @static + */ +Scroller.version = "1.2.2"; + + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Initialisation + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Register a new feature with DataTables + */ +if ( typeof $.fn.dataTable == "function" && + typeof $.fn.dataTableExt.fnVersionCheck == "function" && + $.fn.dataTableExt.fnVersionCheck('1.9.0') ) +{ + $.fn.dataTableExt.aoFeatures.push( { + "fnInit": function( oDTSettings ) { + var init = oDTSettings.oInit; + var opts = init.scroller || init.oScroller || {}; + var oScroller = new Scroller( oDTSettings, opts ); + return oScroller.dom.wrapper; + }, + "cFeature": "S", + "sFeature": "Scroller" + } ); +} +else +{ + alert( "Warning: Scroller requires DataTables 1.9.0 or greater - www.datatables.net/download"); +} + + +// Attach Scroller to DataTables so it can be accessed as an 'extra' +$.fn.dataTable.Scroller = Scroller; +$.fn.DataTable.Scroller = Scroller; + + +// DataTables 1.10 API method aliases +if ( $.fn.dataTable.Api ) { + var Api = $.fn.dataTable.Api; + + Api.register( 'scroller()', function () { + return this; + } ); + + Api.register( 'scroller().rowToPixels()', function ( rowIdx, intParse, virtual ) { + var ctx = this.context; + + if ( ctx.length && ctx[0].oScroller ) { + return ctx[0].oScroller.fnRowToPixels( rowIdx, intParse, virtual ); + } + // undefined + } ); + + Api.register( 'scroller().pixelsToRow()', function ( pixels, intParse, virtual ) { + var ctx = this.context; + + if ( ctx.length && ctx[0].oScroller ) { + return ctx[0].oScroller.fnPixelsToRow( pixels, intParse, virtual ); + } + // undefined + } ); + + Api.register( 'scroller().scrollToRow()', function ( row, ani ) { + this.iterator( 'table', function ( ctx ) { + if ( ctx.oScroller ) { + ctx.oScroller.fnScrollToRow( row, ani ); + } + } ); + + return this; + } ); + + Api.register( 'scroller().measure()', function ( redraw ) { + this.iterator( 'table', function ( ctx ) { + if ( ctx.oScroller ) { + ctx.oScroller.fnMeasure( redraw ); + } + } ); + + return this; + } ); +} + + +return Scroller; +}; // /factory + + +// Define as an AMD module if possible +if ( typeof define === 'function' && define.amd ) { + define( ['jquery', 'datatables'], factory ); +} +else if ( typeof exports === 'object' ) { + // Node/CommonJS + factory( require('jquery'), require('datatables') ); +} +else if ( jQuery && !jQuery.fn.dataTable.Scroller ) { + // Otherwise simply initialise as normal, stopping multiple evaluation + factory( jQuery, jQuery.fn.dataTable ); +} + + +})(window, document); + diff --git a/theme/bootstrap/plugins/datatables/extensions/Scroller/js/dataTables.scroller.min.js b/theme/bootstrap/plugins/datatables/extensions/Scroller/js/dataTables.scroller.min.js new file mode 100644 index 0000000..d7aad08 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/Scroller/js/dataTables.scroller.min.js @@ -0,0 +1,25 @@ +/*! + Scroller 1.2.2 + ©2011-2014 SpryMedia Ltd - datatables.net/license +*/ +(function(m,n,k){var l=function(e){var g=function(a,b){!this instanceof g?alert("Scroller warning: Scroller must be initialised with the 'new' keyword."):("undefined"==typeof b&&(b={}),this.s={dt:a,tableTop:0,tableBottom:0,redrawTop:0,redrawBottom:0,autoHeight:!0,viewportRows:0,stateTO:null,drawTO:null,heights:{jump:null,page:null,virtual:null,scroll:null,row:null,viewport:null},topRowFloat:0,scrollDrawDiff:null,loaderVisible:!1},this.s=e.extend(this.s,g.oDefaults,b),this.s.heights.row=this.s.rowHeight, +this.dom={force:n.createElement("div"),scroller:null,table:null,loader:null},this.s.dt.oScroller=this,this._fnConstruct())};g.prototype={fnRowToPixels:function(a,b,c){a=c?this._domain("virtualToPhysical",a*this.s.heights.row):this.s.baseScrollTop+(a-this.s.baseRowTop)*this.s.heights.row;return b||b===k?parseInt(a,10):a},fnPixelsToRow:function(a,b,c){var d=a-this.s.baseScrollTop,a=c?this._domain("physicalToVirtual",a)/this.s.heights.row:d/this.s.heights.row+this.s.baseRowTop;return b||b===k?parseInt(a, +10):a},fnScrollToRow:function(a,b){var c=this,d=!1,f=this.fnRowToPixels(a),h=a-(this.s.displayBuffer-1)/2*this.s.viewportRows;0>h&&(h=0);if((f>this.s.redrawBottom||f<this.s.redrawTop)&&this.s.dt._iDisplayStart!==h)d=!0,f=this.fnRowToPixels(a,!1,!0);"undefined"==typeof b||b?(this.s.ani=d,e(this.dom.scroller).animate({scrollTop:f},function(){setTimeout(function(){c.s.ani=!1},25)})):e(this.dom.scroller).scrollTop(f)},fnMeasure:function(a){this.s.autoHeight&&this._fnCalcRowHeight();var b=this.s.heights; +b.viewport=e(this.dom.scroller).height();this.s.viewportRows=parseInt(b.viewport/b.row,10)+1;this.s.dt._iDisplayLength=this.s.viewportRows*this.s.displayBuffer;(a===k||a)&&this.s.dt.oInstance.fnDraw()},_fnConstruct:function(){var a=this;if(this.s.dt.oFeatures.bPaginate){this.dom.force.style.position="absolute";this.dom.force.style.top="0px";this.dom.force.style.left="0px";this.dom.force.style.width="1px";this.dom.scroller=e("div."+this.s.dt.oClasses.sScrollBody,this.s.dt.nTableWrapper)[0];this.dom.scroller.appendChild(this.dom.force); +this.dom.scroller.style.position="relative";this.dom.table=e(">table",this.dom.scroller)[0];this.dom.table.style.position="absolute";this.dom.table.style.top="0px";this.dom.table.style.left="0px";e(this.s.dt.nTableWrapper).addClass("DTS");this.s.loadingIndicator&&(this.dom.loader=e('<div class="DTS_Loading">'+this.s.dt.oLanguage.sLoadingRecords+"</div>").css("display","none"),e(this.dom.scroller.parentNode).css("position","relative").append(this.dom.loader));this.s.heights.row&&"auto"!=this.s.heights.row&& +(this.s.autoHeight=!1);this.fnMeasure(!1);this.s.ingnoreScroll=!0;this.s.stateSaveThrottle=this.s.dt.oApi._fnThrottle(function(){a.s.dt.oApi._fnSaveState(a.s.dt)},500);e(this.dom.scroller).on("scroll.DTS",function(){a._fnScroll.call(a)});e(this.dom.scroller).on("touchstart.DTS",function(){a._fnScroll.call(a)});this.s.dt.aoDrawCallback.push({fn:function(){a.s.dt.bInitialised&&a._fnDrawCallback.call(a)},sName:"Scroller"});e(m).on("resize.DTS",function(){a.fnMeasure(false);a._fnInfo()});var b=!0;this.s.dt.oApi._fnCallbackReg(this.s.dt, +"aoStateSaveParams",function(c,d){if(b&&a.s.dt.oLoadedState){d.iScroller=a.s.dt.oLoadedState.iScroller;d.iScrollerTopRow=a.s.dt.oLoadedState.iScrollerTopRow;b=false}else{d.iScroller=a.dom.scroller.scrollTop;d.iScrollerTopRow=a.s.topRowFloat}},"Scroller_State");this.s.dt.oLoadedState&&(this.s.topRowFloat=this.s.dt.oLoadedState.iScrollerTopRow||0);this.s.dt.aoDestroyCallback.push({sName:"Scroller",fn:function(){e(m).off("resize.DTS");e(a.dom.scroller).off("touchstart.DTS scroll.DTS");e(a.s.dt.nTableWrapper).removeClass("DTS"); +e("div.DTS_Loading",a.dom.scroller.parentNode).remove();a.dom.table.style.position="";a.dom.table.style.top="";a.dom.table.style.left=""}})}else this.s.dt.oApi._fnLog(this.s.dt,0,"Pagination must be enabled for Scroller")},_fnScroll:function(){var a=this,b=this.s.heights,c=this.dom.scroller.scrollTop,d;if(!this.s.skip&&!this.s.ingnoreScroll)if(this.s.dt.bFiltered||this.s.dt.bSorted)this.s.lastScrollTop=0;else{this._fnInfo();clearTimeout(this.s.stateTO);this.s.stateTO=setTimeout(function(){a.s.dt.oApi._fnSaveState(a.s.dt)}, +250);if(c<this.s.redrawTop||c>this.s.redrawBottom){var f=Math.ceil((this.s.displayBuffer-1)/2*this.s.viewportRows);Math.abs(c-this.s.lastScrollTop)>b.viewport||this.s.ani?(d=parseInt(this._domain("physicalToVirtual",c)/b.row,10)-f,this.s.topRowFloat=this._domain("physicalToVirtual",c)/b.row):(d=this.fnPixelsToRow(c)-f,this.s.topRowFloat=this.fnPixelsToRow(c,!1));0>=d?d=0:d+this.s.dt._iDisplayLength>this.s.dt.fnRecordsDisplay()?(d=this.s.dt.fnRecordsDisplay()-this.s.dt._iDisplayLength,0>d&&(d=0)): +0!==d%2&&d++;if(d!=this.s.dt._iDisplayStart&&(this.s.tableTop=e(this.s.dt.nTable).offset().top,this.s.tableBottom=e(this.s.dt.nTable).height()+this.s.tableTop,b=function(){if(a.s.scrollDrawReq===null)a.s.scrollDrawReq=c;a.s.dt._iDisplayStart=d;a.s.dt.oApi._fnCalculateEnd&&a.s.dt.oApi._fnCalculateEnd(a.s.dt);a.s.dt.oApi._fnDraw(a.s.dt)},this.s.dt.oFeatures.bServerSide?(clearTimeout(this.s.drawTO),this.s.drawTO=setTimeout(b,this.s.serverWait)):b(),this.dom.loader&&!this.s.loaderVisible))this.dom.loader.css("display", +"block"),this.s.loaderVisible=!0}this.s.lastScrollTop=c;this.s.stateSaveThrottle()}},_domain:function(a,b){var c=this.s.heights,d;if(c.virtual===c.scroll){d=(c.virtual-c.viewport)/(c.scroll-c.viewport);if("virtualToPhysical"===a)return b/d;if("physicalToVirtual"===a)return b*d}var e=(c.scroll-c.viewport)/2,h=(c.virtual-c.viewport)/2;d=h/(e*e);if("virtualToPhysical"===a){if(b<h)return Math.pow(b/d,0.5);b=2*h-b;return 0>b?c.scroll:2*e-Math.pow(b/d,0.5)}if("physicalToVirtual"===a){if(b<e)return b*b* +d;b=2*e-b;return 0>b?c.virtual:2*h-b*b*d}},_fnDrawCallback:function(){var a=this,b=this.s.heights,c=this.dom.scroller.scrollTop,d=e(this.s.dt.nTable).height(),f=this.s.dt._iDisplayStart,h=this.s.dt._iDisplayLength,g=this.s.dt.fnRecordsDisplay();this.s.skip=!0;this._fnScrollForce();c=0===f?this.s.topRowFloat*b.row:f+h>=g?b.scroll-(g-this.s.topRowFloat)*b.row:this._domain("virtualToPhysical",this.s.topRowFloat*b.row);this.dom.scroller.scrollTop=c;this.s.baseScrollTop=c;this.s.baseRowTop=this.s.topRowFloat; +var j=c-(this.s.topRowFloat-f)*b.row;0===f?j=0:f+h>=g&&(j=b.scroll-d);this.dom.table.style.top=j+"px";this.s.tableTop=j;this.s.tableBottom=d+this.s.tableTop;d=(c-this.s.tableTop)*this.s.boundaryScale;this.s.redrawTop=c-d;this.s.redrawBottom=c+d;this.s.skip=!1;this.s.dt.oFeatures.bStateSave&&null!==this.s.dt.oLoadedState&&"undefined"!=typeof this.s.dt.oLoadedState.iScroller?((c=(this.s.dt.sAjaxSource||a.s.dt.ajax)&&!this.s.dt.oFeatures.bServerSide?!0:!1)&&2==this.s.dt.iDraw||!c&&1==this.s.dt.iDraw)&& +setTimeout(function(){e(a.dom.scroller).scrollTop(a.s.dt.oLoadedState.iScroller);a.s.redrawTop=a.s.dt.oLoadedState.iScroller-b.viewport/2;setTimeout(function(){a.s.ingnoreScroll=!1},0)},0):a.s.ingnoreScroll=!1;setTimeout(function(){a._fnInfo.call(a)},0);this.dom.loader&&this.s.loaderVisible&&(this.dom.loader.css("display","none"),this.s.loaderVisible=!1)},_fnScrollForce:function(){var a=this.s.heights;a.virtual=a.row*this.s.dt.fnRecordsDisplay();a.scroll=a.virtual;1E6<a.scroll&&(a.scroll=1E6);this.dom.force.style.height= +a.scroll+"px"},_fnCalcRowHeight:function(){var a=this.s.dt,b=a.nTable,c=b.cloneNode(!1),d=e("<tbody/>").appendTo(c),f=e('<div class="'+a.oClasses.sWrapper+' DTS"><div class="'+a.oClasses.sScrollWrapper+'"><div class="'+a.oClasses.sScrollBody+'"></div></div></div>');for(e("tbody tr:lt(4)",b).clone().appendTo(d);3>e("tr",d).length;)d.append("<tr><td>&nbsp;</td></tr>");e("div."+a.oClasses.sScrollBody,f).append(c);a._bInitComplete?a=b.parentNode:(this.s.dt.nHolding||(this.s.dt.nHolding=e("<div></div>").insertBefore(this.s.dt.nTable)), +a=this.s.dt.nHolding);f.appendTo(a);this.s.heights.row=e("tr",d).eq(1).outerHeight();f.remove()},_fnInfo:function(){if(this.s.dt.oFeatures.bInfo){var a=this.s.dt,b=a.oLanguage,c=this.dom.scroller.scrollTop,d=Math.floor(this.fnPixelsToRow(c,!1,this.s.ani)+1),f=a.fnRecordsTotal(),h=a.fnRecordsDisplay(),c=Math.ceil(this.fnPixelsToRow(c+this.s.heights.viewport,!1,this.s.ani)),c=h<c?h:c,g=a.fnFormatNumber(d),j=a.fnFormatNumber(c),i=a.fnFormatNumber(f),k=a.fnFormatNumber(h),g=0===a.fnRecordsDisplay()&& +a.fnRecordsDisplay()==a.fnRecordsTotal()?b.sInfoEmpty+b.sInfoPostFix:0===a.fnRecordsDisplay()?b.sInfoEmpty+" "+b.sInfoFiltered.replace("_MAX_",i)+b.sInfoPostFix:a.fnRecordsDisplay()==a.fnRecordsTotal()?b.sInfo.replace("_START_",g).replace("_END_",j).replace("_MAX_",i).replace("_TOTAL_",k)+b.sInfoPostFix:b.sInfo.replace("_START_",g).replace("_END_",j).replace("_MAX_",i).replace("_TOTAL_",k)+" "+b.sInfoFiltered.replace("_MAX_",a.fnFormatNumber(a.fnRecordsTotal()))+b.sInfoPostFix;(b=b.fnInfoCallback)&& +(g=b.call(a.oInstance,a,d,c,f,h,g));a=a.aanFeatures.i;if("undefined"!=typeof a){d=0;for(f=a.length;d<f;d++)e(a[d]).html(g)}}}};g.defaults={trace:!1,rowHeight:"auto",serverWait:200,displayBuffer:9,boundaryScale:0.5,loadingIndicator:!1};g.oDefaults=g.defaults;g.version="1.2.2";"function"==typeof e.fn.dataTable&&"function"==typeof e.fn.dataTableExt.fnVersionCheck&&e.fn.dataTableExt.fnVersionCheck("1.9.0")?e.fn.dataTableExt.aoFeatures.push({fnInit:function(a){var b=a.oInit;return(new g(a,b.scroller|| +b.oScroller||{})).dom.wrapper},cFeature:"S",sFeature:"Scroller"}):alert("Warning: Scroller requires DataTables 1.9.0 or greater - www.datatables.net/download");e.fn.dataTable.Scroller=g;e.fn.DataTable.Scroller=g;if(e.fn.dataTable.Api){var i=e.fn.dataTable.Api;i.register("scroller()",function(){return this});i.register("scroller().rowToPixels()",function(a,b,c){var d=this.context;if(d.length&&d[0].oScroller)return d[0].oScroller.fnRowToPixels(a,b,c)});i.register("scroller().pixelsToRow()",function(a, +b,c){var d=this.context;if(d.length&&d[0].oScroller)return d[0].oScroller.fnPixelsToRow(a,b,c)});i.register("scroller().scrollToRow()",function(a,b){this.iterator("table",function(c){c.oScroller&&c.oScroller.fnScrollToRow(a,b)});return this});i.register("scroller().measure()",function(a){this.iterator("table",function(b){b.oScroller&&b.oScroller.fnMeasure(a)});return this})}return g};"function"===typeof define&&define.amd?define(["jquery","datatables"],l):"object"===typeof exports?l(require("jquery"), +require("datatables")):jQuery&&!jQuery.fn.dataTable.Scroller&&l(jQuery,jQuery.fn.dataTable)})(window,document); diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/Readme.md b/theme/bootstrap/plugins/datatables/extensions/TableTools/Readme.md new file mode 100644 index 0000000..d83ea9f --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/Readme.md @@ -0,0 +1,41 @@ +# TableTools + +TableTools is a plug-in for the DataTables HTML table enhancer, which adds a highly customisable button toolbar to a DataTable. Key features include: + +* Copy to clipboard +* Save table data as CSV, XLS or PDF files +* Print view for clean printing +* Row selection options +* Easy use predefined buttons +* Simple customisation of buttons +* Well defined API for advanced control + + +# Installation + +To use TableTools, first download DataTables ( http://datatables.net/download ) and place the unzipped TableTools package into a `extensions` directory in the DataTables package (in DataTables 1.9- use the `extras` directory). This will allow the pages in the examples to operate correctly. To see the examples running, open the `examples` directory in your web-browser. + + +# Basic usage + +TableTools is initialised using the `T` option that it adds to DataTables' `dom` option. For example: + +```js +$(document).ready( function () { + $('#example').DataTable( { + dom: 'T<"clear">lfrtip' + } ); +} ); +``` + + +# Documentation / support + +* Documentation: http://datatables.net/extensions/tabletools/ +* DataTables support forums: http://datatables.net/forums + + +# GitHub + +If you fancy getting involved with the development of TableTools and help make it better, please refer to its GitHub repo: https://github.com/DataTables/TableTools + diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/css/dataTables.tableTools.css b/theme/bootstrap/plugins/datatables/extensions/TableTools/css/dataTables.tableTools.css new file mode 100644 index 0000000..c959b11 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/css/dataTables.tableTools.css @@ -0,0 +1,361 @@ +/* + * File: TableTools.css + * Description: Styles for TableTools 2 + * Author: Allan Jardine (www.sprymedia.co.uk) + * Language: Javascript + * License: GPL v2 / 3 point BSD + * Project: DataTables + * + * Copyright 2009-2012 Allan Jardine, all rights reserved. + * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * + * CSS name space: + * DTTT DataTables TableTools + * + * Style sheet provides: + * CONTAINER TableTools container element and styles applying to all components + * BUTTON_STYLES Action specific button styles + * SELECTING Row selection styles + * COLLECTIONS Drop down list (collection) styles + * PRINTING Print display styles + */ + + +/* + * CONTAINER + * TableTools container element and styles applying to all components + */ +div.DTTT_container { + position: relative; + float: right; + margin-bottom: 1em; +} + +@media screen and (max-width: 640px) { + div.DTTT_container { + float: none !important; + text-align: center; + } + + div.DTTT_container:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; + } +} + + +button.DTTT_button, +div.DTTT_button, +a.DTTT_button { + position: relative; + display: inline-block; + margin-right: 3px; + padding: 5px 8px; + border: 1px solid #999; + cursor: pointer; + *cursor: hand; + font-size: 0.88em; + color: black !important; + + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -ms-border-radius: 2px; + -o-border-radius: 2px; + border-radius: 2px; + + -webkit-box-shadow: 1px 1px 3px #ccc; + -moz-box-shadow: 1px 1px 3px #ccc; + -ms-box-shadow: 1px 1px 3px #ccc; + -o-box-shadow: 1px 1px 3px #ccc; + box-shadow: 1px 1px 3px #ccc; + + /* Generated by http://www.colorzilla.com/gradient-editor/ */ + background: #ffffff; /* Old browsers */ + background: -webkit-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* FF3.6+ */ + background: -ms-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* IE10+ */ + background: -o-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Opera 11.10+ */ + background: linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 ); /* IE6-9 */ +} + + +/* Buttons are cunning border-box sizing - we can't just use that for A and DIV due to IE6/7 */ +button.DTTT_button { + height: 30px; + padding: 3px 8px; +} + +.DTTT_button embed { + outline: none; +} + +button.DTTT_button:hover:not(.DTTT_disabled), +div.DTTT_button:hover:not(.DTTT_disabled), +a.DTTT_button:hover:not(.DTTT_disabled) { + border: 1px solid #666; + text-decoration: none !important; + + -webkit-box-shadow: 1px 1px 3px #999; + -moz-box-shadow: 1px 1px 3px #999; + -ms-box-shadow: 1px 1px 3px #999; + -o-box-shadow: 1px 1px 3px #999; + box-shadow: 1px 1px 3px #999; + + background: #f3f3f3; /* Old browsers */ + background: -webkit-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* FF3.6+ */ + background: -ms-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* IE10+ */ + background: -o-linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* Opera 11.10+ */ + background: linear-gradient(top, #f3f3f3 0%,#e2e2e2 89%,#f4f4f4 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f3f3f3', endColorstr='#f4f4f4',GradientType=0 ); /* IE6-9 */ +} + +button.DTTT_button:focus, +div.DTTT_button:focus, +a.DTTT_button:focus { + border: 1px solid #426c9e; + text-shadow: 0 1px 0 #c4def1; + outline: none; + + background-color: #a3d0ef 100%; + background-image: -webkit-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%); + background-image: -moz-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%); + background-image: -ms-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%); + background-image: -o-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%); + background-image: linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%); + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#a3d0ef', EndColorStr='#a3d0ef'); +} + +button.DTTT_button:active:not(.DTTT_disabled), +div.DTTT_button:active:not(.DTTT_disabled), +a.DTTT_button:active:not(.DTTT_disabled) { + -webkit-box-shadow: inset 1px 1px 3px #999999; + -moz-box-shadow: inset 1px 1px 3px #999999; + box-shadow: inset 1px 1px 3px #999999; +} + +button.DTTT_disabled, +div.DTTT_disabled, +a.DTTT_disabled { + color: #999 !important; + border: 1px solid #d0d0d0; + cursor: default; + background: #ffffff; /* Old browsers */ + background: -webkit-linear-gradient(top, #ffffff 0%,#f9f9f9 89%,#fafafa 100%); /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #ffffff 0%,#f9f9f9 89%,#fafafa 100%); /* FF3.6+ */ + background: -ms-linear-gradient(top, #ffffff 0%,#f9f9f9 89%,#fafafa 100%); /* IE10+ */ + background: -o-linear-gradient(top, #ffffff 0%,#f9f9f9 89%,#fafafa 100%); /* Opera 11.10+ */ + background: linear-gradient(top, #ffffff 0%,#f9f9f9 89%,#fafafa 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#fafafa',GradientType=0 ); /* IE6-9 */ +} + + + +/* + * BUTTON_STYLES + * Action specific button styles + * If you want images - comment this back in + +a.DTTT_button_csv, +a.DTTT_button_xls, +a.DTTT_button_copy, +a.DTTT_button_pdf, +a.DTTT_button_print { + padding-right: 0px; +} + +a.DTTT_button_csv span, +a.DTTT_button_xls span, +a.DTTT_button_copy span, +a.DTTT_button_pdf span, +a.DTTT_button_print span { + display: inline-block; + height: 24px; + line-height: 24px; + padding-right: 30px; +} + + +a.DTTT_button_csv span { background: url(../images/csv.png) no-repeat bottom right; } +a.DTTT_button_csv:hover span { background: url(../images/csv_hover.png) no-repeat center right; } + +a.DTTT_button_xls span { background: url(../images/xls.png) no-repeat center right; } +a.DTTT_button_xls:hover span { background: #f0f0f0 url(../images/xls_hover.png) no-repeat center right; } + +a.DTTT_button_copy span { background: url(../images/copy.png) no-repeat center right; } +a.DTTT_button_copy:hover span { background: #f0f0f0 url(../images/copy_hover.png) no-repeat center right; } + +a.DTTT_button_pdf span { background: url(../images/pdf.png) no-repeat center right; } +a.DTTT_button_pdf:hover span { background: #f0f0f0 url(../images/pdf_hover.png) no-repeat center right; } + +a.DTTT_button_print span { background: url(../images/print.png) no-repeat center right; } +a.DTTT_button_print:hover span { background: #f0f0f0 url(../images/print_hover.png) no-repeat center right; } + + */ + +button.DTTT_button_collection span { + padding-right: 17px; + background: url(../images/collection.png) no-repeat center right; +} + +button.DTTT_button_collection:hover span { + padding-right: 17px; + background: #f0f0f0 url(../images/collection_hover.png) no-repeat center right; +} + + +/* + * SELECTING + * Row selection styles + */ +table.DTTT_selectable tbody tr { + cursor: pointer; + *cursor: hand; +} + +table.dataTable tr.DTTT_selected.odd { + background-color: #9FAFD1; +} + +table.dataTable tr.DTTT_selected.odd td.sorting_1 { + background-color: #9FAFD1; +} + +table.dataTable tr.DTTT_selected.odd td.sorting_2 { + background-color: #9FAFD1; +} + +table.dataTable tr.DTTT_selected.odd td.sorting_3 { + background-color: #9FAFD1; +} + + +table.dataTable tr.DTTT_selected.even { + background-color: #B0BED9; +} + +table.dataTable tr.DTTT_selected.even td.sorting_1 { + background-color: #B0BED9; +} + +table.dataTable tr.DTTT_selected.even td.sorting_2 { + background-color: #B0BED9; +} + +table.dataTable tr.DTTT_selected.even td.sorting_3 { + background-color: #B0BED9; +} + + +/* + * COLLECTIONS + * Drop down list (collection) styles + */ + +div.DTTT_collection { + width: 150px; + padding: 8px 8px 4px 8px; + border: 1px solid #ccc; + border: 1px solid rgba( 0, 0, 0, 0.4 ); + background-color: #f3f3f3; + background-color: rgba( 255, 255, 255, 0.3 ); + overflow: hidden; + z-index: 2002; + + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; + border-radius: 5px; + + -webkit-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); + -ms-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); + -o-box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); + box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); +} + +div.DTTT_collection_background { + background: black; + z-index: 2001; +} + +div.DTTT_collection button.DTTT_button, +div.DTTT_collection div.DTTT_button, +div.DTTT_collection a.DTTT_button { + position: relative; + left: 0; + right: 0; + + display: block; + float: none; + margin-bottom: 4px; + + -webkit-box-shadow: 1px 1px 3px #999; + -moz-box-shadow: 1px 1px 3px #999; + -ms-box-shadow: 1px 1px 3px #999; + -o-box-shadow: 1px 1px 3px #999; + box-shadow: 1px 1px 3px #999; +} + + +/* + * PRINTING + * Print display styles + */ + +.DTTT_print_info { + position: fixed; + top: 50%; + left: 50%; + width: 400px; + height: 150px; + margin-left: -200px; + margin-top: -75px; + text-align: center; + color: #333; + padding: 10px 30px; + + background: #ffffff; /* Old browsers */ + background: -webkit-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* FF3.6+ */ + background: -ms-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* IE10+ */ + background: -o-linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* Opera 11.10+ */ + background: linear-gradient(top, #ffffff 0%,#f3f3f3 89%,#f9f9f9 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 ); /* IE6-9 */ + + opacity: 0.95; + + border: 1px solid black; + border: 1px solid rgba(0, 0, 0, 0.5); + + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + -ms-border-radius: 6px; + -o-border-radius: 6px; + border-radius: 6px; + + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5); + -ms-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5); + -o-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5); +} + +.DTTT_print_info h6 { + font-weight: normal; + font-size: 28px; + line-height: 28px; + margin: 1em; +} + +.DTTT_print_info p { + font-size: 14px; + line-height: 20px; +} + diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/css/dataTables.tableTools.min.css b/theme/bootstrap/plugins/datatables/extensions/TableTools/css/dataTables.tableTools.min.css new file mode 100644 index 0000000..61a89d5 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/css/dataTables.tableTools.min.css @@ -0,0 +1 @@ +div.DTTT_container{position:relative;float:right;margin-bottom:1em}@media screen and (max-width: 640px){div.DTTT_container{float:none !important;text-align:center}div.DTTT_container:after{visibility:hidden;display:block;content:"";clear:both;height:0}}button.DTTT_button,div.DTTT_button,a.DTTT_button{position:relative;display:inline-block;margin-right:3px;padding:5px 8px;border:1px solid #999;cursor:pointer;*cursor:hand;font-size:0.88em;color:black !important;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:1px 1px 3px #ccc;-moz-box-shadow:1px 1px 3px #ccc;-ms-box-shadow:1px 1px 3px #ccc;-o-box-shadow:1px 1px 3px #ccc;box-shadow:1px 1px 3px #ccc;background:#ffffff;background:-webkit-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-moz-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-ms-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-o-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 )}button.DTTT_button{height:30px;padding:3px 8px}.DTTT_button embed{outline:none}button.DTTT_button:hover:not(.DTTT_disabled),div.DTTT_button:hover:not(.DTTT_disabled),a.DTTT_button:hover:not(.DTTT_disabled){border:1px solid #666;text-decoration:none !important;-webkit-box-shadow:1px 1px 3px #999;-moz-box-shadow:1px 1px 3px #999;-ms-box-shadow:1px 1px 3px #999;-o-box-shadow:1px 1px 3px #999;box-shadow:1px 1px 3px #999;background:#f3f3f3;background:-webkit-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:-moz-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:-ms-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:-o-linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);background:linear-gradient(top, #f3f3f3 0%, #e2e2e2 89%, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3f3f3', endColorstr='#f4f4f4',GradientType=0 )}button.DTTT_button:focus,div.DTTT_button:focus,a.DTTT_button:focus{border:1px solid #426c9e;text-shadow:0 1px 0 #c4def1;outline:none;background-color:#a3d0ef 100%;background-image:-webkit-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:-moz-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:-ms-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:-o-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#a3d0ef', EndColorStr='#a3d0ef')}button.DTTT_button:active:not(.DTTT_disabled),div.DTTT_button:active:not(.DTTT_disabled),a.DTTT_button:active:not(.DTTT_disabled){-webkit-box-shadow:inset 1px 1px 3px #999999;-moz-box-shadow:inset 1px 1px 3px #999999;box-shadow:inset 1px 1px 3px #999999}button.DTTT_disabled,div.DTTT_disabled,a.DTTT_disabled{color:#999 !important;border:1px solid #d0d0d0;cursor:default;background:#ffffff;background:-webkit-linear-gradient(top, #fff 0%, #f9f9f9 89%, #fafafa 100%);background:-moz-linear-gradient(top, #fff 0%, #f9f9f9 89%, #fafafa 100%);background:-ms-linear-gradient(top, #fff 0%, #f9f9f9 89%, #fafafa 100%);background:-o-linear-gradient(top, #fff 0%, #f9f9f9 89%, #fafafa 100%);background:linear-gradient(top, #fff 0%, #f9f9f9 89%, #fafafa 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#fafafa',GradientType=0 )}button.DTTT_button_collection span{padding-right:17px;background:url(../images/collection.png) no-repeat center right}button.DTTT_button_collection:hover span{padding-right:17px;background:#f0f0f0 url(../images/collection_hover.png) no-repeat center right}table.DTTT_selectable tbody tr{cursor:pointer;*cursor:hand}table.dataTable tr.DTTT_selected.odd{background-color:#9FAFD1}table.dataTable tr.DTTT_selected.odd td.sorting_1{background-color:#9FAFD1}table.dataTable tr.DTTT_selected.odd td.sorting_2{background-color:#9FAFD1}table.dataTable tr.DTTT_selected.odd td.sorting_3{background-color:#9FAFD1}table.dataTable tr.DTTT_selected.even{background-color:#B0BED9}table.dataTable tr.DTTT_selected.even td.sorting_1{background-color:#B0BED9}table.dataTable tr.DTTT_selected.even td.sorting_2{background-color:#B0BED9}table.dataTable tr.DTTT_selected.even td.sorting_3{background-color:#B0BED9}div.DTTT_collection{width:150px;padding:8px 8px 4px 8px;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.4);background-color:#f3f3f3;background-color:rgba(255,255,255,0.3);overflow:hidden;z-index:2002;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px;-webkit-box-shadow:3px 3px 5px rgba(0,0,0,0.3);-moz-box-shadow:3px 3px 5px rgba(0,0,0,0.3);-ms-box-shadow:3px 3px 5px rgba(0,0,0,0.3);-o-box-shadow:3px 3px 5px rgba(0,0,0,0.3);box-shadow:3px 3px 5px rgba(0,0,0,0.3)}div.DTTT_collection_background{background:black;z-index:2001}div.DTTT_collection button.DTTT_button,div.DTTT_collection div.DTTT_button,div.DTTT_collection a.DTTT_button{position:relative;left:0;right:0;display:block;float:none;margin-bottom:4px;-webkit-box-shadow:1px 1px 3px #999;-moz-box-shadow:1px 1px 3px #999;-ms-box-shadow:1px 1px 3px #999;-o-box-shadow:1px 1px 3px #999;box-shadow:1px 1px 3px #999}.DTTT_print_info{position:fixed;top:50%;left:50%;width:400px;height:150px;margin-left:-200px;margin-top:-75px;text-align:center;color:#333;padding:10px 30px;background:#ffffff;background:-webkit-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-moz-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-ms-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:-o-linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);background:linear-gradient(top, #fff 0%, #f3f3f3 89%, #f9f9f9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f9f9f9',GradientType=0 );opacity:0.95;border:1px solid black;border:1px solid rgba(0,0,0,0.5);-webkit-border-radius:6px;-moz-border-radius:6px;-ms-border-radius:6px;-o-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.5);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.5);-ms-box-shadow:0 3px 7px rgba(0,0,0,0.5);-o-box-shadow:0 3px 7px rgba(0,0,0,0.5);box-shadow:0 3px 7px rgba(0,0,0,0.5)}.DTTT_print_info h6{font-weight:normal;font-size:28px;line-height:28px;margin:1em}.DTTT_print_info p{font-size:14px;line-height:20px} diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/ajax.html b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/ajax.html new file mode 100644 index 0000000..a37670a --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/ajax.html @@ -0,0 +1,190 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>TableTools example - Ajax loaded data</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + dom: 'T<"clear">lfrtip', + "ajax": "../../../../examples/ajax/data/objects.txt", + "columns": [ + { "data": "name" }, + { "data": "position" }, + { "data": "office" }, + { "data": "extn" }, + { "data": "start_date" }, + { "data": "salary" } + ], + deferRender: true + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>TableTools example <span>Ajax loaded data</span></h1> + + <div class="info"> + <p>This TableTools example shows DataTables using its ability to <a href="//datatables.net/manual/data#Objects">Ajax load object based data</a> and operate in + exactly the same manner as when the data is read directly from the document.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Extn.</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Extn.</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + dom: 'T&lt;&quot;clear&quot;&gt;lfrtip', + &quot;ajax&quot;: &quot;../../../../examples/ajax/data/objects.txt&quot;, + &quot;columns&quot;: [ + { &quot;data&quot;: &quot;name&quot; }, + { &quot;data&quot;: &quot;position&quot; }, + { &quot;data&quot;: &quot;office&quot; }, + { &quot;data&quot;: &quot;extn&quot; }, + { &quot;data&quot;: &quot;start_date&quot; }, + { &quot;data&quot;: &quot;salary&quot; } + ], + deferRender: true + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./swf_path.html">Setting the SWF path</a></li> + <li><a href="./new_init.html">Initialisation with `new`</a></li> + <li><a href="./defaults.html">Defaults</a></li> + <li><a href="./select_single.html">Row selection - single row select</a></li> + <li><a href="./select_multi.html">Row selection - multi-row select</a></li> + <li><a href="./select_os.html">Row selection - operating system style</a></li> + <li><a href="./select_column.html">Row selection - row selector on specific cells</a></li> + <li><a href="./multiple_tables.html">Multiple tables</a></li> + <li><a href="./multi_instance.html">Multiple toolbars</a></li> + <li><a href="./collection.html">Button collections</a></li> + <li><a href="./plug-in.html">Plug-in button types</a></li> + <li><a href="./button_text.html">Custom button text</a></li> + <li><a href="./alter_buttons.html">Button arrangement</a></li> + <li class="active"><a href="./ajax.html">Ajax loaded data</a></li> + <li><a href="./pdf_message.html">PDF message</a></li> + <li><a href="./bootstrap.html">Bootstrap styling</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/alter_buttons.html b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/alter_buttons.html new file mode 100644 index 0000000..87c4148 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/alter_buttons.html @@ -0,0 +1,637 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>TableTools example - Button arrangement</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + dom: 'T<"clear">lfrtip', + tableTools: { + "aButtons": [ "copy", "print" ] + } + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>TableTools example <span>Button arrangement</span></h1> + + <div class="info"> + <p>TableTools makes it very simple to arrange the buttons in the toolbar as you see fit. Using the <code>aButtons</code> parameter you can use any of the <a href= + "http://datatables.net/extensions/tabletools/buttons">predefined buttons</a> or <a href="http://datatables.net/extensions/tabletools/button_options">customised + buttons</a>. The example below shows how TableTools can be initialised to provide only the 'copy-to-clipboard' and 'print view' options (i.e. no save to local file + option is available).</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + dom: 'T&lt;&quot;clear&quot;&gt;lfrtip', + tableTools: { + &quot;aButtons&quot;: [ &quot;copy&quot;, &quot;print&quot; ] + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./swf_path.html">Setting the SWF path</a></li> + <li><a href="./new_init.html">Initialisation with `new`</a></li> + <li><a href="./defaults.html">Defaults</a></li> + <li><a href="./select_single.html">Row selection - single row select</a></li> + <li><a href="./select_multi.html">Row selection - multi-row select</a></li> + <li><a href="./select_os.html">Row selection - operating system style</a></li> + <li><a href="./select_column.html">Row selection - row selector on specific cells</a></li> + <li><a href="./multiple_tables.html">Multiple tables</a></li> + <li><a href="./multi_instance.html">Multiple toolbars</a></li> + <li><a href="./collection.html">Button collections</a></li> + <li><a href="./plug-in.html">Plug-in button types</a></li> + <li><a href="./button_text.html">Custom button text</a></li> + <li class="active"><a href="./alter_buttons.html">Button arrangement</a></li> + <li><a href="./ajax.html">Ajax loaded data</a></li> + <li><a href="./pdf_message.html">PDF message</a></li> + <li><a href="./bootstrap.html">Bootstrap styling</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/bootstrap.html b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/bootstrap.html new file mode 100644 index 0000000..24b2c0b --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/bootstrap.html @@ -0,0 +1,645 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>TableTools example - Bootstrap styling</title> + <link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css"> + <link rel="stylesheet" type="text/css" href="../../Plugins/integration/bootstrap/3/dataTables.bootstrap.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + body { font-size: 140%; } + div.DTTT { margin-bottom: 0.5em; float: right; } + div.dataTables_wrapper { clear: both; } + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script> + <script type="text/javascript" language="javascript" src="../../Plugins/integration/bootstrap/3/dataTables.bootstrap.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable(); + var tt = new $.fn.dataTable.TableTools( table ); + + $( tt.fnContainer() ).insertBefore('div.dataTables_wrapper'); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>TableTools example <span>Bootstrap styling</span></h1> + + <div class="info"> + <p><a href="http://twitter.github.com/bootstrap/">Twitter Bootstrap</a> is a very powerful design framework for allowing you to very quickly create applications + with a unified look and feel. <a href="http://datatables.net/manual/styling/bootstrap">DataTables integrates well</a> with Bootstrap, and so does TableTools.</p> + + <p>This example shows the default Bootstrap theme being used with a Bootstrap styled DataTable. The <a href="new_init.html"><code>new</code></a> form of + initialising TableTools is used here, as the Bootstrap integration uses a complex <a href="//datatables.net/reference/option/dom"><code class="option" title= + "DataTables initialisation option">dom<span>DT</span></code></a> option (it is possible to provide a custom <a href= + "//datatables.net/reference/option/dom"><code class="option" title="DataTables initialisation option">dom<span>DT</span></code></a> option if you want to, this is + just for simplicity!).</p> + </div> + + <table id="example" class="table table-striped table-bordered" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable(); + var tt = new $.fn.dataTable.TableTools( table ); + + $( tt.fnContainer() ).insertBefore('div.dataTables_wrapper'); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li> + <li><a href="../../Plugins/integration/bootstrap/3/dataTables.bootstrap.js">../../Plugins/integration/bootstrap/3/dataTables.bootstrap.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">body { font-size: 140%; } + div.DTTT { margin-bottom: 0.5em; float: right; } + div.dataTables_wrapper { clear: both; }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css</a></li> + <li><a href="../../Plugins/integration/bootstrap/3/dataTables.bootstrap.css">../../Plugins/integration/bootstrap/3/dataTables.bootstrap.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./swf_path.html">Setting the SWF path</a></li> + <li><a href="./new_init.html">Initialisation with `new`</a></li> + <li><a href="./defaults.html">Defaults</a></li> + <li><a href="./select_single.html">Row selection - single row select</a></li> + <li><a href="./select_multi.html">Row selection - multi-row select</a></li> + <li><a href="./select_os.html">Row selection - operating system style</a></li> + <li><a href="./select_column.html">Row selection - row selector on specific cells</a></li> + <li><a href="./multiple_tables.html">Multiple tables</a></li> + <li><a href="./multi_instance.html">Multiple toolbars</a></li> + <li><a href="./collection.html">Button collections</a></li> + <li><a href="./plug-in.html">Plug-in button types</a></li> + <li><a href="./button_text.html">Custom button text</a></li> + <li><a href="./alter_buttons.html">Button arrangement</a></li> + <li><a href="./ajax.html">Ajax loaded data</a></li> + <li><a href="./pdf_message.html">PDF message</a></li> + <li class="active"><a href="./bootstrap.html">Bootstrap styling</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/button_text.html b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/button_text.html new file mode 100644 index 0000000..20565db --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/button_text.html @@ -0,0 +1,669 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>TableTools example - Custom button text</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + "dom": 'T<"clear">lfrtip', + "tableTools": { + "aButtons": [ + { + "sExtends": "copy", + "sButtonText": "Copy to clipboard" + }, + { + "sExtends": "csv", + "sButtonText": "Save to CSV" + }, + { + "sExtends": "xls", + "oSelectorOpts": { + page: 'current' + } + } + ] + } + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>TableTools example <span>Custom button text</span></h1> + + <div class="info"> + <p>You may wish to set your own text for the buttons in the TableTools toolbar, rather than relying on the default built-in text. This is done by overriding the + <code>sButtonText</code> parameter of whatever button you wish to alter. The way TableTools allows you to alter a predefined button is by 'extending' it (using the + <code>sExtends</code> parameter) and then setting the overriding parameter.</p> + + <p>A full list of the parameters which can be used is <a href="http://datatables.net/extensions/tabletools/button_options">available on the DataTables.net + web-site</a>. This example shows how to set the button text as required.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + &quot;dom&quot;: 'T&lt;&quot;clear&quot;&gt;lfrtip', + &quot;tableTools&quot;: { + &quot;aButtons&quot;: [ + { + &quot;sExtends&quot;: &quot;copy&quot;, + &quot;sButtonText&quot;: &quot;Copy to clipboard&quot; + }, + { + &quot;sExtends&quot;: &quot;csv&quot;, + &quot;sButtonText&quot;: &quot;Save to CSV&quot; + }, + { + &quot;sExtends&quot;: &quot;xls&quot;, + &quot;oSelectorOpts&quot;: { + page: 'current' + } + } + ] + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./swf_path.html">Setting the SWF path</a></li> + <li><a href="./new_init.html">Initialisation with `new`</a></li> + <li><a href="./defaults.html">Defaults</a></li> + <li><a href="./select_single.html">Row selection - single row select</a></li> + <li><a href="./select_multi.html">Row selection - multi-row select</a></li> + <li><a href="./select_os.html">Row selection - operating system style</a></li> + <li><a href="./select_column.html">Row selection - row selector on specific cells</a></li> + <li><a href="./multiple_tables.html">Multiple tables</a></li> + <li><a href="./multi_instance.html">Multiple toolbars</a></li> + <li><a href="./collection.html">Button collections</a></li> + <li><a href="./plug-in.html">Plug-in button types</a></li> + <li class="active"><a href="./button_text.html">Custom button text</a></li> + <li><a href="./alter_buttons.html">Button arrangement</a></li> + <li><a href="./ajax.html">Ajax loaded data</a></li> + <li><a href="./pdf_message.html">PDF message</a></li> + <li><a href="./bootstrap.html">Bootstrap styling</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/collection.html b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/collection.html new file mode 100644 index 0000000..26b4a20 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/collection.html @@ -0,0 +1,654 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>TableTools example - Button collections</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + "dom": 'T<"clear">lfrtip', + "tableTools": { + "aButtons": [ + "copy", + "print", + { + "sExtends": "collection", + "sButtonText": "Save", + "aButtons": [ "csv", "xls", "pdf" ] + } + ] + } + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>TableTools example <span>Button collections</span></h1> + + <div class="info"> + <p>TableTools provides the ability to group buttons into a hidden drop down list, which is activated by clicking on a top-level button. This is achieved by + extending the 'collection' predefined button type and setting it's <code>aButtons</code> parameter with the same options as the top level buttons (note that you + cannot currently use a collection within a collection).</p> + + <p>The example below shows the file save buttons grouped into a collection, while the copy and print buttons are left on the top level.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + &quot;dom&quot;: 'T&lt;&quot;clear&quot;&gt;lfrtip', + &quot;tableTools&quot;: { + &quot;aButtons&quot;: [ + &quot;copy&quot;, + &quot;print&quot;, + { + &quot;sExtends&quot;: &quot;collection&quot;, + &quot;sButtonText&quot;: &quot;Save&quot;, + &quot;aButtons&quot;: [ &quot;csv&quot;, &quot;xls&quot;, &quot;pdf&quot; ] + } + ] + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./swf_path.html">Setting the SWF path</a></li> + <li><a href="./new_init.html">Initialisation with `new`</a></li> + <li><a href="./defaults.html">Defaults</a></li> + <li><a href="./select_single.html">Row selection - single row select</a></li> + <li><a href="./select_multi.html">Row selection - multi-row select</a></li> + <li><a href="./select_os.html">Row selection - operating system style</a></li> + <li><a href="./select_column.html">Row selection - row selector on specific cells</a></li> + <li><a href="./multiple_tables.html">Multiple tables</a></li> + <li><a href="./multi_instance.html">Multiple toolbars</a></li> + <li class="active"><a href="./collection.html">Button collections</a></li> + <li><a href="./plug-in.html">Plug-in button types</a></li> + <li><a href="./button_text.html">Custom button text</a></li> + <li><a href="./alter_buttons.html">Button arrangement</a></li> + <li><a href="./ajax.html">Ajax loaded data</a></li> + <li><a href="./pdf_message.html">PDF message</a></li> + <li><a href="./bootstrap.html">Bootstrap styling</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/defaults.html b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/defaults.html new file mode 100644 index 0000000..e821b4a --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/defaults.html @@ -0,0 +1,634 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>TableTools example - Defaults</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$.fn.dataTable.TableTools.defaults.aButtons = [ "copy", "csv", "xls" ]; + +$(document).ready(function() { + $('#example').DataTable( { + dom: 'T<"clear">lfrtip' + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>TableTools example <span>Defaults</span></h1> + + <div class="info"> + <p>TableTools provides the ability to override the default initialisation parameters that are used when creating a new instance. This this particularly useful if + you have multiple tables which you want to have the same TableTools behaviour - rather than declaring the structure multiple times, you can just set the defaults + once. This example shows how to alter the default buttons.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$.fn.dataTable.TableTools.defaults.aButtons = [ &quot;copy&quot;, &quot;csv&quot;, &quot;xls&quot; ]; + +$(document).ready(function() { + $('#example').DataTable( { + dom: 'T&lt;&quot;clear&quot;&gt;lfrtip' + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./swf_path.html">Setting the SWF path</a></li> + <li><a href="./new_init.html">Initialisation with `new`</a></li> + <li class="active"><a href="./defaults.html">Defaults</a></li> + <li><a href="./select_single.html">Row selection - single row select</a></li> + <li><a href="./select_multi.html">Row selection - multi-row select</a></li> + <li><a href="./select_os.html">Row selection - operating system style</a></li> + <li><a href="./select_column.html">Row selection - row selector on specific cells</a></li> + <li><a href="./multiple_tables.html">Multiple tables</a></li> + <li><a href="./multi_instance.html">Multiple toolbars</a></li> + <li><a href="./collection.html">Button collections</a></li> + <li><a href="./plug-in.html">Plug-in button types</a></li> + <li><a href="./button_text.html">Custom button text</a></li> + <li><a href="./alter_buttons.html">Button arrangement</a></li> + <li><a href="./ajax.html">Ajax loaded data</a></li> + <li><a href="./pdf_message.html">PDF message</a></li> + <li><a href="./bootstrap.html">Bootstrap styling</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/index.html b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/index.html new file mode 100644 index 0000000..f975882 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/index.html @@ -0,0 +1,80 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + + <title>TableTools examples - TableTools examples</title> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>TableTools example <span>TableTools examples</span></h1> + + <div class="info"> + <p>TableTools is a plug-in for the DataTables HTML table enhancer, which adds a highly customisable button toolbar to a DataTable. Key features include:</p> + + <ul class="markdown"> + <li>Copy to clipboard</li> + <li>Save table data as CSV, XLS or PDF files</li> + <li>Print view for clean printing</li> + <li>Row selection options</li> + <li>Easy use predefined buttons</li> + <li>Simple customisation of buttons</li> + <li>Well defined API for advanced control</li> + </ul> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./swf_path.html">Setting the SWF path</a></li> + <li><a href="./new_init.html">Initialisation with `new`</a></li> + <li><a href="./defaults.html">Defaults</a></li> + <li><a href="./select_single.html">Row selection - single row select</a></li> + <li><a href="./select_multi.html">Row selection - multi-row select</a></li> + <li><a href="./select_os.html">Row selection - operating system style</a></li> + <li><a href="./select_column.html">Row selection - row selector on specific cells</a></li> + <li><a href="./multiple_tables.html">Multiple tables</a></li> + <li><a href="./multi_instance.html">Multiple toolbars</a></li> + <li><a href="./collection.html">Button collections</a></li> + <li><a href="./plug-in.html">Plug-in button types</a></li> + <li><a href="./button_text.html">Custom button text</a></li> + <li><a href="./alter_buttons.html">Button arrangement</a></li> + <li><a href="./ajax.html">Ajax loaded data</a></li> + <li><a href="./pdf_message.html">PDF message</a></li> + <li><a href="./bootstrap.html">Bootstrap styling</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/jqueryui.html b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/jqueryui.html new file mode 100644 index 0000000..d075c90 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/jqueryui.html @@ -0,0 +1,637 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>TableTools example - jQuery UI styling</title> + <link rel="stylesheet" type="text/css" href="//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css"> + <link rel="stylesheet" type="text/css" href="../../Plugins/integration/jqueryui/dataTables.jqueryui.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script> + <script type="text/javascript" language="javascript" src="../../Plugins/integration/jqueryui/dataTables.jqueryui.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable( { + lengthChange: false + } ); + + var tt = new $.fn.dataTable.TableTools( table ); + $( tt.fnContainer() ).insertBefore('div.dataTables_filter'); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>TableTools example <span>jQuery UI styling</span></h1> + + <div class="info"> + <p>This example shows the TableTools buttons being styled by jQuery UI ThemeRoller. This allows the TableTools buttons to have the same look-and-feel as other + buttons on your site if you are already using jQuery UI.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable( { + lengthChange: false + } ); + + var tt = new $.fn.dataTable.TableTools( table ); + $( tt.fnContainer() ).insertBefore('div.dataTables_filter'); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li> + <li><a href="../../Plugins/integration/jqueryui/dataTables.jqueryui.js">../../Plugins/integration/jqueryui/dataTables.jqueryui.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css">//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css</a></li> + <li><a href="../../Plugins/integration/jqueryui/dataTables.jqueryui.css">../../Plugins/integration/jqueryui/dataTables.jqueryui.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./swf_path.html">Setting the SWF path</a></li> + <li><a href="./new_init.html">Initialisation with `new`</a></li> + <li><a href="./defaults.html">Defaults</a></li> + <li><a href="./select_single.html">Row selection - single row select</a></li> + <li><a href="./select_multi.html">Row selection - multi-row select</a></li> + <li><a href="./select_os.html">Row selection - operating system style</a></li> + <li><a href="./select_column.html">Row selection - row selector on specific cells</a></li> + <li><a href="./multiple_tables.html">Multiple tables</a></li> + <li><a href="./multi_instance.html">Multiple toolbars</a></li> + <li><a href="./collection.html">Button collections</a></li> + <li><a href="./plug-in.html">Plug-in button types</a></li> + <li><a href="./button_text.html">Custom button text</a></li> + <li><a href="./alter_buttons.html">Button arrangement</a></li> + <li><a href="./ajax.html">Ajax loaded data</a></li> + <li><a href="./pdf_message.html">PDF message</a></li> + <li><a href="./bootstrap.html">Bootstrap styling</a></li> + <li class="active"><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/multi_instance.html b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/multi_instance.html new file mode 100644 index 0000000..caf3317 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/multi_instance.html @@ -0,0 +1,638 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>TableTools example - Multiple toolbars</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + dom: 'T<"clear">lfrtip<"clear spacer">T', + tableTools: { + "aButtons": [ "copy", "print" ] + } + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>TableTools example <span>Multiple toolbars</span></h1> + + <div class="info"> + <p>Like all DataTables control elements, TableTools can have multiple instances specified in the <a href="//datatables.net/reference/option/dom"><code class= + "option" title="DataTables initialisation option">dom<span>DT</span></code></a> parameter of DataTables. This will create two TableTools toolbars next to the + table, providing the same functions.</p> + + <p>An example of when this might be useful is to show the toolbar both above and below the table - as is done in this example.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + dom: 'T&lt;&quot;clear&quot;&gt;lfrtip&lt;&quot;clear spacer&quot;&gt;T', + tableTools: { + &quot;aButtons&quot;: [ &quot;copy&quot;, &quot;print&quot; ] + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./swf_path.html">Setting the SWF path</a></li> + <li><a href="./new_init.html">Initialisation with `new`</a></li> + <li><a href="./defaults.html">Defaults</a></li> + <li><a href="./select_single.html">Row selection - single row select</a></li> + <li><a href="./select_multi.html">Row selection - multi-row select</a></li> + <li><a href="./select_os.html">Row selection - operating system style</a></li> + <li><a href="./select_column.html">Row selection - row selector on specific cells</a></li> + <li><a href="./multiple_tables.html">Multiple tables</a></li> + <li class="active"><a href="./multi_instance.html">Multiple toolbars</a></li> + <li><a href="./collection.html">Button collections</a></li> + <li><a href="./plug-in.html">Plug-in button types</a></li> + <li><a href="./button_text.html">Custom button text</a></li> + <li><a href="./alter_buttons.html">Button arrangement</a></li> + <li><a href="./ajax.html">Ajax loaded data</a></li> + <li><a href="./pdf_message.html">PDF message</a></li> + <li><a href="./bootstrap.html">Bootstrap styling</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/multiple_tables.html b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/multiple_tables.html new file mode 100644 index 0000000..e39d4d0 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/multiple_tables.html @@ -0,0 +1,343 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>TableTools example - Multiple tables</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + dom: 'T<"clear">lfrtip' + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>TableTools example <span>Multiple tables</span></h1> + + <div class="info"> + <p>This example shows how multiple tables can be initialised with DataTables and TableTools in a single call to the <code>$().DataTable()</code> function. + Basically it works as you would expect - no special considerations need be made!</p> + </div> + + <table id="" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>$320,800</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>$433,060</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>$103,600</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>$342,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>$217,500</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>$92,575</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>$324,050</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>$75,650</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>$183,000</td> + </tr> + </tbody> + </table> + + <table id="" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>$90,560</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>$198,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>$132,000</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>$145,000</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>$136,200</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>$163,500</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>$103,500</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + dom: 'T&lt;&quot;clear&quot;&gt;lfrtip' + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./swf_path.html">Setting the SWF path</a></li> + <li><a href="./new_init.html">Initialisation with `new`</a></li> + <li><a href="./defaults.html">Defaults</a></li> + <li><a href="./select_single.html">Row selection - single row select</a></li> + <li><a href="./select_multi.html">Row selection - multi-row select</a></li> + <li><a href="./select_os.html">Row selection - operating system style</a></li> + <li><a href="./select_column.html">Row selection - row selector on specific cells</a></li> + <li class="active"><a href="./multiple_tables.html">Multiple tables</a></li> + <li><a href="./multi_instance.html">Multiple toolbars</a></li> + <li><a href="./collection.html">Button collections</a></li> + <li><a href="./plug-in.html">Plug-in button types</a></li> + <li><a href="./button_text.html">Custom button text</a></li> + <li><a href="./alter_buttons.html">Button arrangement</a></li> + <li><a href="./ajax.html">Ajax loaded data</a></li> + <li><a href="./pdf_message.html">PDF message</a></li> + <li><a href="./bootstrap.html">Bootstrap styling</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/new_init.html b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/new_init.html new file mode 100644 index 0000000..129f9e8 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/new_init.html @@ -0,0 +1,644 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>TableTools example - Initialisation with `new`</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + var table = $('#example').DataTable(); + var tt = new $.fn.dataTable.TableTools( table, { + sRowSelect: 'single' + } ); + + $( tt.fnContainer() ).insertAfter('div.info'); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>TableTools example <span>Initialisation with `new`</span></h1> + + <div class="info"> + <p>Typically when working with TableTools, the initialisation and insertion into the DOM will be done automatically by DataTables, through the use of the <a href= + "//datatables.net/reference/option/dom"><code class="option" title="DataTables initialisation option">dom<span>DT</span></code></a> parameter. However, it is also + possible to initialise TableTools manually as shown in the example below using <code>new $.fn.dataTable.TableTools();</code>. The constructor for TableTools takes + two parameters:</p> + + <ol class="markdown"> + <li>The DataTable that the newly created TableTools instance should attach to</li> + <li>Optionally - A list of options</li> + </ol> + + <p>Once initialised you can insert the TableTools tool bar node anywhere you wish into the DOM using the <code>fnContainer()</code> API method to get the node.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + var table = $('#example').DataTable(); + var tt = new $.fn.dataTable.TableTools( table, { + sRowSelect: 'single' + } ); + + $( tt.fnContainer() ).insertAfter('div.info'); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./swf_path.html">Setting the SWF path</a></li> + <li class="active"><a href="./new_init.html">Initialisation with `new`</a></li> + <li><a href="./defaults.html">Defaults</a></li> + <li><a href="./select_single.html">Row selection - single row select</a></li> + <li><a href="./select_multi.html">Row selection - multi-row select</a></li> + <li><a href="./select_os.html">Row selection - operating system style</a></li> + <li><a href="./select_column.html">Row selection - row selector on specific cells</a></li> + <li><a href="./multiple_tables.html">Multiple tables</a></li> + <li><a href="./multi_instance.html">Multiple toolbars</a></li> + <li><a href="./collection.html">Button collections</a></li> + <li><a href="./plug-in.html">Plug-in button types</a></li> + <li><a href="./button_text.html">Custom button text</a></li> + <li><a href="./alter_buttons.html">Button arrangement</a></li> + <li><a href="./ajax.html">Ajax loaded data</a></li> + <li><a href="./pdf_message.html">PDF message</a></li> + <li><a href="./bootstrap.html">Bootstrap styling</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/pdf_message.html b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/pdf_message.html new file mode 100644 index 0000000..18afd9e --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/pdf_message.html @@ -0,0 +1,655 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>TableTools example - PDF message</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + dom: 'T<"clear">lfrtip', + tableTools: { + "aButtons": [ + "copy", + "csv", + "xls", + { + "sExtends": "pdf", + "sPdfOrientation": "landscape", + "sPdfMessage": "Your custom message would go here." + }, + "print" + ] + } + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>TableTools example <span>PDF message</span></h1> + + <div class="info"> + <p>This example shows how you can add a message to the saved PDF using the <code>sPdfMessage</code> parameter. It also shows that the orientation of the output PDF + can be changed to landscape which is useful if you have a lot of columns.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + dom: 'T&lt;&quot;clear&quot;&gt;lfrtip', + tableTools: { + &quot;aButtons&quot;: [ + &quot;copy&quot;, + &quot;csv&quot;, + &quot;xls&quot;, + { + &quot;sExtends&quot;: &quot;pdf&quot;, + &quot;sPdfOrientation&quot;: &quot;landscape&quot;, + &quot;sPdfMessage&quot;: &quot;Your custom message would go here.&quot; + }, + &quot;print&quot; + ] + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./swf_path.html">Setting the SWF path</a></li> + <li><a href="./new_init.html">Initialisation with `new`</a></li> + <li><a href="./defaults.html">Defaults</a></li> + <li><a href="./select_single.html">Row selection - single row select</a></li> + <li><a href="./select_multi.html">Row selection - multi-row select</a></li> + <li><a href="./select_os.html">Row selection - operating system style</a></li> + <li><a href="./select_column.html">Row selection - row selector on specific cells</a></li> + <li><a href="./multiple_tables.html">Multiple tables</a></li> + <li><a href="./multi_instance.html">Multiple toolbars</a></li> + <li><a href="./collection.html">Button collections</a></li> + <li><a href="./plug-in.html">Plug-in button types</a></li> + <li><a href="./button_text.html">Custom button text</a></li> + <li><a href="./alter_buttons.html">Button arrangement</a></li> + <li><a href="./ajax.html">Ajax loaded data</a></li> + <li class="active"><a href="./pdf_message.html">PDF message</a></li> + <li><a href="./bootstrap.html">Bootstrap styling</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/plug-in.html b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/plug-in.html new file mode 100644 index 0000000..0c6bfb0 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/plug-in.html @@ -0,0 +1,682 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>TableTools example - Plug-in button types</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$.fn.dataTable.TableTools.buttons.copy_to_div = $.extend( + true, + {}, + $.fn.dataTable.TableTools.buttonBase, + { + "sNewLine": "<br>", + "sButtonText": "Copy to element", + "target": "", + "fnClick": function( button, conf ) { + $(conf.target).html( this.fnGetTableData(conf) ); + } + } +); + + +$(document).ready(function() { + $('#example').DataTable( { + dom: 'T<"clear">lfrtip', + tableTools: { + "aButtons": [ { + "sExtends": "copy_to_div", + "sButtonText": "Copy to HTML", + "target": "#copy" + } ] + } + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>TableTools example <span>Plug-in button types</span></h1> + + <div class="info"> + <p>This example shows now a plug-in button type can be created for TableTools. Button types are attached to the <code>$.fn.dataTable.TableTools.buttons</code> + object and extend <code>$.fn.dataTable.TableTools.buttonBase</code>. All of the <a href="//datatables.net/extensions/tabletools/button_options">button options + defined in the documentation</a> are available and can be overridden as required. Finally to use the button simply include its name in the <code>aButtons</code> + array or use it as a button extender (<code>sExtends</code>).</p> + + <p>This example shows a button which will simply get the data contents of a table and set that as the contents of another element.</p> + </div> + + <div id="copy" class="box" style="height: 100px; overflow: auto"> + Copy output will go here + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$.fn.dataTable.TableTools.buttons.copy_to_div = $.extend( + true, + {}, + $.fn.dataTable.TableTools.buttonBase, + { + &quot;sNewLine&quot;: &quot;&lt;br&gt;&quot;, + &quot;sButtonText&quot;: &quot;Copy to element&quot;, + &quot;target&quot;: &quot;&quot;, + &quot;fnClick&quot;: function( button, conf ) { + $(conf.target).html( this.fnGetTableData(conf) ); + } + } +); + + +$(document).ready(function() { + $('#example').DataTable( { + dom: 'T&lt;&quot;clear&quot;&gt;lfrtip', + tableTools: { + &quot;aButtons&quot;: [ { + &quot;sExtends&quot;: &quot;copy_to_div&quot;, + &quot;sButtonText&quot;: &quot;Copy to HTML&quot;, + &quot;target&quot;: &quot;#copy&quot; + } ] + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./swf_path.html">Setting the SWF path</a></li> + <li><a href="./new_init.html">Initialisation with `new`</a></li> + <li><a href="./defaults.html">Defaults</a></li> + <li><a href="./select_single.html">Row selection - single row select</a></li> + <li><a href="./select_multi.html">Row selection - multi-row select</a></li> + <li><a href="./select_os.html">Row selection - operating system style</a></li> + <li><a href="./select_column.html">Row selection - row selector on specific cells</a></li> + <li><a href="./multiple_tables.html">Multiple tables</a></li> + <li><a href="./multi_instance.html">Multiple toolbars</a></li> + <li><a href="./collection.html">Button collections</a></li> + <li class="active"><a href="./plug-in.html">Plug-in button types</a></li> + <li><a href="./button_text.html">Custom button text</a></li> + <li><a href="./alter_buttons.html">Button arrangement</a></li> + <li><a href="./ajax.html">Ajax loaded data</a></li> + <li><a href="./pdf_message.html">PDF message</a></li> + <li><a href="./bootstrap.html">Bootstrap styling</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/select_column.html b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/select_column.html new file mode 100644 index 0000000..e8e3706 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/select_column.html @@ -0,0 +1,228 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>TableTools example - Row selection - row selector on specific cells</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css"> + <link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.0.3/css/font-awesome.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + tr td:first-child { + text-align: center; + } + + tr td:first-child:before { + content: "\f096"; /* fa-square-o */ + font-family: FontAwesome; + } + + tr.selected td:first-child:before { + content: "\f046"; /* fa-check-square-o */ + } + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + $('#example').DataTable( { + ajax: "../../../examples/ajax/data/objects.txt", + columns: [ + { data: null, defaultContent: '', orderable: false }, + { data: 'name' }, + { data: 'position' }, + { data: 'office' }, + { data: 'extn' }, + { data: 'start_date' }, + { data: 'salary' } + ], + order: [ 1, 'asc' ], + dom: 'T<"clear">lfrtip', + tableTools: { + sRowSelect: 'os', + sRowSelector: 'td:first-child', + aButtons: [ 'select_all', 'select_none' ] + } + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>TableTools example <span>Row selection - row selector on specific cells</span></h1> + + <div class="info"> + <p>By default, TableTools' row selector option will register a row selection click on any part of the row. Although this is often desirable, you might wish at + times to limit the row selection to just a single column, or other elements in the row. This might be useful, for example, with <a href= + "//editor.datatables.net">Editor's</a> inline editing, so you don't select the row on click of a cell that is to be edited.</p> + + <p>The <code>sRowSelector</code> method provides this ability, allowing a custom jQuery selector to be passed in. TableTools will use the parent row of any element + that is selected by the end user.</p> + + <p>In this case, the row selector is attached to the cells in the first column of the table, and <a href="http://fortawesome.github.io/Font-Awesome">Font + Awesome</a> is used to display a checkbox indicating the selection state of the row, in addition to the row background colouring.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th> + + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + ajax: &quot;../../../examples/ajax/data/objects.txt&quot;, + columns: [ + { data: null, defaultContent: '', orderable: false }, + { data: 'name' }, + { data: 'position' }, + { data: 'office' }, + { data: 'extn' }, + { data: 'start_date' }, + { data: 'salary' } + ], + order: [ 1, 'asc' ], + dom: 'T&lt;&quot;clear&quot;&gt;lfrtip', + tableTools: { + sRowSelect: 'os', + sRowSelector: 'td:first-child', + aButtons: [ 'select_all', 'select_none' ] + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css">tr td:first-child { + text-align: center; + } + + tr td:first-child:before { + content: &quot;\f096&quot;; /* fa-square-o */ + font-family: FontAwesome; + } + + tr.selected td:first-child:before { + content: &quot;\f046&quot;; /* fa-check-square-o */ + }</code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li> + <li><a href= + "//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.0.3/css/font-awesome.css">//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.0.3/css/font-awesome.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./swf_path.html">Setting the SWF path</a></li> + <li><a href="./new_init.html">Initialisation with `new`</a></li> + <li><a href="./defaults.html">Defaults</a></li> + <li><a href="./select_single.html">Row selection - single row select</a></li> + <li><a href="./select_multi.html">Row selection - multi-row select</a></li> + <li><a href="./select_os.html">Row selection - operating system style</a></li> + <li class="active"><a href="./select_column.html">Row selection - row selector on specific cells</a></li> + <li><a href="./multiple_tables.html">Multiple tables</a></li> + <li><a href="./multi_instance.html">Multiple toolbars</a></li> + <li><a href="./collection.html">Button collections</a></li> + <li><a href="./plug-in.html">Plug-in button types</a></li> + <li><a href="./button_text.html">Custom button text</a></li> + <li><a href="./alter_buttons.html">Button arrangement</a></li> + <li><a href="./ajax.html">Ajax loaded data</a></li> + <li><a href="./pdf_message.html">PDF message</a></li> + <li><a href="./bootstrap.html">Bootstrap styling</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/select_multi.html b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/select_multi.html new file mode 100644 index 0000000..cbcca65 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/select_multi.html @@ -0,0 +1,649 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>TableTools example - Row selection - multi-row select</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + $('#example').DataTable( { + dom: 'T<"clear">lfrtip', + tableTools: { + "sRowSelect": "multi", + "aButtons": [ "select_all", "select_none" ] + } + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>TableTools example <span>Row selection - multi-row select</span></h1> + + <div class="info"> + <p>As well as providing a button toolbar, TableTools provides everything needed to have selectable rows in the table. TableTools has four row selection modes of + operation:</p> + + <ul class="markdown"> + <li><code>none</code> - Default, where no user row selection options are available</li> + <li><code>single</code> - A single row can be selected</li> + <li><code>multi</code> - Multiple rows can be selected simply by clicking on the rows</li> + <li><code>os</code> - Operating System like selection where you can use the shift and ctrl / cmd keys on your keyboard to add / remove rows from the + selection.</li> + </ul> + + <p>This example shows the <code>multi</code> select option. There are also a number of <a href="http://datatables.net/extras/tabletools/buttons">pre-defined + buttons</a> to provide functions such as select-all and select-none, as shown in this example.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + dom: 'T&lt;&quot;clear&quot;&gt;lfrtip', + tableTools: { + &quot;sRowSelect&quot;: &quot;multi&quot;, + &quot;aButtons&quot;: [ &quot;select_all&quot;, &quot;select_none&quot; ] + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./swf_path.html">Setting the SWF path</a></li> + <li><a href="./new_init.html">Initialisation with `new`</a></li> + <li><a href="./defaults.html">Defaults</a></li> + <li><a href="./select_single.html">Row selection - single row select</a></li> + <li class="active"><a href="./select_multi.html">Row selection - multi-row select</a></li> + <li><a href="./select_os.html">Row selection - operating system style</a></li> + <li><a href="./select_column.html">Row selection - row selector on specific cells</a></li> + <li><a href="./multiple_tables.html">Multiple tables</a></li> + <li><a href="./multi_instance.html">Multiple toolbars</a></li> + <li><a href="./collection.html">Button collections</a></li> + <li><a href="./plug-in.html">Plug-in button types</a></li> + <li><a href="./button_text.html">Custom button text</a></li> + <li><a href="./alter_buttons.html">Button arrangement</a></li> + <li><a href="./ajax.html">Ajax loaded data</a></li> + <li><a href="./pdf_message.html">PDF message</a></li> + <li><a href="./bootstrap.html">Bootstrap styling</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/select_os.html b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/select_os.html new file mode 100644 index 0000000..54e0afe --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/select_os.html @@ -0,0 +1,649 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>TableTools example - Row selection - operating system style</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + $('#example').DataTable( { + dom: 'T<"clear">lfrtip', + tableTools: { + "sRowSelect": "os", + "aButtons": [ "select_all", "select_none" ] + } + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>TableTools example <span>Row selection - operating system style</span></h1> + + <div class="info"> + <p>As well as providing a button toolbar, TableTools provides everything needed to have selectable rows in the table. TableTools has four row selection modes of + operation:</p> + + <ul class="markdown"> + <li><code>none</code> - Default, where no user row selection options are available</li> + <li><code>single</code> - A single row can be selected</li> + <li><code>multi</code> - Multiple rows can be selected simply by clicking on the rows</li> + <li><code>os</code> - Operating System like selection where you can use the shift and ctrl / cmd keys on your keyboard to add / remove rows from the + selection.</li> + </ul> + + <p>This example shows the <code>os</code> select option. Without keyboard interaction a single row can be selected at a time, but multiple rows can be selected in + a range using the shift key, while rows can be added and removed from the selection using the ctrl / cmd key.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + dom: 'T&lt;&quot;clear&quot;&gt;lfrtip', + tableTools: { + &quot;sRowSelect&quot;: &quot;os&quot;, + &quot;aButtons&quot;: [ &quot;select_all&quot;, &quot;select_none&quot; ] + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./swf_path.html">Setting the SWF path</a></li> + <li><a href="./new_init.html">Initialisation with `new`</a></li> + <li><a href="./defaults.html">Defaults</a></li> + <li><a href="./select_single.html">Row selection - single row select</a></li> + <li><a href="./select_multi.html">Row selection - multi-row select</a></li> + <li class="active"><a href="./select_os.html">Row selection - operating system style</a></li> + <li><a href="./select_column.html">Row selection - row selector on specific cells</a></li> + <li><a href="./multiple_tables.html">Multiple tables</a></li> + <li><a href="./multi_instance.html">Multiple toolbars</a></li> + <li><a href="./collection.html">Button collections</a></li> + <li><a href="./plug-in.html">Plug-in button types</a></li> + <li><a href="./button_text.html">Custom button text</a></li> + <li><a href="./alter_buttons.html">Button arrangement</a></li> + <li><a href="./ajax.html">Ajax loaded data</a></li> + <li><a href="./pdf_message.html">PDF message</a></li> + <li><a href="./bootstrap.html">Bootstrap styling</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/select_single.html b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/select_single.html new file mode 100644 index 0000000..33cff2f --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/select_single.html @@ -0,0 +1,646 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>TableTools example - Row selection - single row select</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + + +$(document).ready(function() { + $('#example').DataTable( { + dom: 'T<"clear">lfrtip', + tableTools: { + "sRowSelect": "single" + } + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>TableTools example <span>Row selection - single row select</span></h1> + + <div class="info"> + <p>As well as providing a button toolbar, TableTools provides everything needed to have selectable rows in the table. TableTools has four row selection modes of + operation:</p> + + <ul class="markdown"> + <li><code>none</code> - Default, where no user row selection options are available</li> + <li><code>single</code> - A single row can be selected</li> + <li><code>multi</code> - Multiple rows can be selected simply by clicking on the rows</li> + <li><code>os</code> - Operating System like selection where you can use the shift and ctrl / cmd keys on your keyboard to add / remove rows from the + selection.</li> + </ul> + + <p>This example shows the <code>single</code> select option.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + dom: 'T&lt;&quot;clear&quot;&gt;lfrtip', + tableTools: { + &quot;sRowSelect&quot;: &quot;single&quot; + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./swf_path.html">Setting the SWF path</a></li> + <li><a href="./new_init.html">Initialisation with `new`</a></li> + <li><a href="./defaults.html">Defaults</a></li> + <li class="active"><a href="./select_single.html">Row selection - single row select</a></li> + <li><a href="./select_multi.html">Row selection - multi-row select</a></li> + <li><a href="./select_os.html">Row selection - operating system style</a></li> + <li><a href="./select_column.html">Row selection - row selector on specific cells</a></li> + <li><a href="./multiple_tables.html">Multiple tables</a></li> + <li><a href="./multi_instance.html">Multiple toolbars</a></li> + <li><a href="./collection.html">Button collections</a></li> + <li><a href="./plug-in.html">Plug-in button types</a></li> + <li><a href="./button_text.html">Custom button text</a></li> + <li><a href="./alter_buttons.html">Button arrangement</a></li> + <li><a href="./ajax.html">Ajax loaded data</a></li> + <li><a href="./pdf_message.html">PDF message</a></li> + <li><a href="./bootstrap.html">Bootstrap styling</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/simple.html b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/simple.html new file mode 100644 index 0000000..dbc77e4 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/simple.html @@ -0,0 +1,633 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>TableTools example - Basic initialisation</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + dom: 'T<"clear">lfrtip' + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>TableTools example <span>Basic initialisation</span></h1> + + <div class="info"> + <p>This example shows the basic initialisation of TableTools by simply including the <code class="string" title="String">T</code> option in DataTables' <a href= + "//datatables.net/reference/option/dom"><code class="option" title="DataTables initialisation option">dom<span>DT</span></code></a> parameter. This tell DataTables + to insert the TableTools toolbar in that location. Remember to include the Javascript and CSS source files as well!</p> + + <p>It is worth noting that you might need to <a href="swf_path.html">set the <code>sSwfPath</code> parameter</a> to tell TableTools where to find the SWF file for + copy and file save.</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + dom: 'T&lt;&quot;clear&quot;&gt;lfrtip' + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li class="active"><a href="./simple.html">Basic initialisation</a></li> + <li><a href="./swf_path.html">Setting the SWF path</a></li> + <li><a href="./new_init.html">Initialisation with `new`</a></li> + <li><a href="./defaults.html">Defaults</a></li> + <li><a href="./select_single.html">Row selection - single row select</a></li> + <li><a href="./select_multi.html">Row selection - multi-row select</a></li> + <li><a href="./select_os.html">Row selection - operating system style</a></li> + <li><a href="./select_column.html">Row selection - row selector on specific cells</a></li> + <li><a href="./multiple_tables.html">Multiple tables</a></li> + <li><a href="./multi_instance.html">Multiple toolbars</a></li> + <li><a href="./collection.html">Button collections</a></li> + <li><a href="./plug-in.html">Plug-in button types</a></li> + <li><a href="./button_text.html">Custom button text</a></li> + <li><a href="./alter_buttons.html">Button arrangement</a></li> + <li><a href="./ajax.html">Ajax loaded data</a></li> + <li><a href="./pdf_message.html">PDF message</a></li> + <li><a href="./bootstrap.html">Bootstrap styling</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/swf_path.html b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/swf_path.html new file mode 100644 index 0000000..0ab0c13 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/examples/swf_path.html @@ -0,0 +1,639 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <link rel="shortcut icon" type="image/ico" href="http://www.datatables.net/favicon.ico"> + <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0"> + + <title>TableTools example - Setting the SWF path</title> + <link rel="stylesheet" type="text/css" href="../../../media/css/jquery.dataTables.css"> + <link rel="stylesheet" type="text/css" href="../css/dataTables.tableTools.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/syntax/shCore.css"> + <link rel="stylesheet" type="text/css" href="../../../examples/resources/demo.css"> + <style type="text/css" class="init"> + + </style> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.js"></script> + <script type="text/javascript" language="javascript" src="../../../media/js/jquery.dataTables.js"></script> + <script type="text/javascript" language="javascript" src="../js/dataTables.tableTools.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/syntax/shCore.js"></script> + <script type="text/javascript" language="javascript" src="../../../examples/resources/demo.js"></script> + <script type="text/javascript" language="javascript" class="init"> + + +$(document).ready(function() { + $('#example').DataTable( { + dom: 'T<"clear">lfrtip', + tableTools: { + "sSwfPath": "../swf/copy_csv_xls_pdf.swf" + } + } ); +} ); + + + </script> +</head> + +<body class="dt-example"> + <div class="container"> + <section> + <h1>TableTools example <span>Setting the SWF path</span></h1> + + <div class="info"> + <p>TableTools uses a Flash SWF file to provide the ability to copy text to the system clipboard and save files locally. TableTools must be able to load the SWF + file in order to provide these facilities. If you aren't using the same directory structure as the TableTools package, you will need to set the + <code>sSwfPath</code> TableTools parameter, as shown in this example.</p> + + <p>Note that TableTools ships with two different SWF files - the only difference between them is that one of them provides the ability to save PDF files while the + other doesn't. The trade off is that the PDF capable file is significantly larger in size (56K v 2K).</p> + </div> + + <table id="example" class="display" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </thead> + + <tfoot> + <tr> + <th>Name</th> + <th>Position</th> + <th>Office</th> + <th>Age</th> + <th>Start date</th> + <th>Salary</th> + </tr> + </tfoot> + + <tbody> + <tr> + <td>Tiger Nixon</td> + <td>System Architect</td> + <td>Edinburgh</td> + <td>61</td> + <td>2011/04/25</td> + <td>$320,800</td> + </tr> + <tr> + <td>Garrett Winters</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>63</td> + <td>2011/07/25</td> + <td>$170,750</td> + </tr> + <tr> + <td>Ashton Cox</td> + <td>Junior Technical Author</td> + <td>San Francisco</td> + <td>66</td> + <td>2009/01/12</td> + <td>$86,000</td> + </tr> + <tr> + <td>Cedric Kelly</td> + <td>Senior Javascript Developer</td> + <td>Edinburgh</td> + <td>22</td> + <td>2012/03/29</td> + <td>$433,060</td> + </tr> + <tr> + <td>Airi Satou</td> + <td>Accountant</td> + <td>Tokyo</td> + <td>33</td> + <td>2008/11/28</td> + <td>$162,700</td> + </tr> + <tr> + <td>Brielle Williamson</td> + <td>Integration Specialist</td> + <td>New York</td> + <td>61</td> + <td>2012/12/02</td> + <td>$372,000</td> + </tr> + <tr> + <td>Herrod Chandler</td> + <td>Sales Assistant</td> + <td>San Francisco</td> + <td>59</td> + <td>2012/08/06</td> + <td>$137,500</td> + </tr> + <tr> + <td>Rhona Davidson</td> + <td>Integration Specialist</td> + <td>Tokyo</td> + <td>55</td> + <td>2010/10/14</td> + <td>$327,900</td> + </tr> + <tr> + <td>Colleen Hurst</td> + <td>Javascript Developer</td> + <td>San Francisco</td> + <td>39</td> + <td>2009/09/15</td> + <td>$205,500</td> + </tr> + <tr> + <td>Sonya Frost</td> + <td>Software Engineer</td> + <td>Edinburgh</td> + <td>23</td> + <td>2008/12/13</td> + <td>$103,600</td> + </tr> + <tr> + <td>Jena Gaines</td> + <td>Office Manager</td> + <td>London</td> + <td>30</td> + <td>2008/12/19</td> + <td>$90,560</td> + </tr> + <tr> + <td>Quinn Flynn</td> + <td>Support Lead</td> + <td>Edinburgh</td> + <td>22</td> + <td>2013/03/03</td> + <td>$342,000</td> + </tr> + <tr> + <td>Charde Marshall</td> + <td>Regional Director</td> + <td>San Francisco</td> + <td>36</td> + <td>2008/10/16</td> + <td>$470,600</td> + </tr> + <tr> + <td>Haley Kennedy</td> + <td>Senior Marketing Designer</td> + <td>London</td> + <td>43</td> + <td>2012/12/18</td> + <td>$313,500</td> + </tr> + <tr> + <td>Tatyana Fitzpatrick</td> + <td>Regional Director</td> + <td>London</td> + <td>19</td> + <td>2010/03/17</td> + <td>$385,750</td> + </tr> + <tr> + <td>Michael Silva</td> + <td>Marketing Designer</td> + <td>London</td> + <td>66</td> + <td>2012/11/27</td> + <td>$198,500</td> + </tr> + <tr> + <td>Paul Byrd</td> + <td>Chief Financial Officer (CFO)</td> + <td>New York</td> + <td>64</td> + <td>2010/06/09</td> + <td>$725,000</td> + </tr> + <tr> + <td>Gloria Little</td> + <td>Systems Administrator</td> + <td>New York</td> + <td>59</td> + <td>2009/04/10</td> + <td>$237,500</td> + </tr> + <tr> + <td>Bradley Greer</td> + <td>Software Engineer</td> + <td>London</td> + <td>41</td> + <td>2012/10/13</td> + <td>$132,000</td> + </tr> + <tr> + <td>Dai Rios</td> + <td>Personnel Lead</td> + <td>Edinburgh</td> + <td>35</td> + <td>2012/09/26</td> + <td>$217,500</td> + </tr> + <tr> + <td>Jenette Caldwell</td> + <td>Development Lead</td> + <td>New York</td> + <td>30</td> + <td>2011/09/03</td> + <td>$345,000</td> + </tr> + <tr> + <td>Yuri Berry</td> + <td>Chief Marketing Officer (CMO)</td> + <td>New York</td> + <td>40</td> + <td>2009/06/25</td> + <td>$675,000</td> + </tr> + <tr> + <td>Caesar Vance</td> + <td>Pre-Sales Support</td> + <td>New York</td> + <td>21</td> + <td>2011/12/12</td> + <td>$106,450</td> + </tr> + <tr> + <td>Doris Wilder</td> + <td>Sales Assistant</td> + <td>Sidney</td> + <td>23</td> + <td>2010/09/20</td> + <td>$85,600</td> + </tr> + <tr> + <td>Angelica Ramos</td> + <td>Chief Executive Officer (CEO)</td> + <td>London</td> + <td>47</td> + <td>2009/10/09</td> + <td>$1,200,000</td> + </tr> + <tr> + <td>Gavin Joyce</td> + <td>Developer</td> + <td>Edinburgh</td> + <td>42</td> + <td>2010/12/22</td> + <td>$92,575</td> + </tr> + <tr> + <td>Jennifer Chang</td> + <td>Regional Director</td> + <td>Singapore</td> + <td>28</td> + <td>2010/11/14</td> + <td>$357,650</td> + </tr> + <tr> + <td>Brenden Wagner</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>28</td> + <td>2011/06/07</td> + <td>$206,850</td> + </tr> + <tr> + <td>Fiona Green</td> + <td>Chief Operating Officer (COO)</td> + <td>San Francisco</td> + <td>48</td> + <td>2010/03/11</td> + <td>$850,000</td> + </tr> + <tr> + <td>Shou Itou</td> + <td>Regional Marketing</td> + <td>Tokyo</td> + <td>20</td> + <td>2011/08/14</td> + <td>$163,000</td> + </tr> + <tr> + <td>Michelle House</td> + <td>Integration Specialist</td> + <td>Sidney</td> + <td>37</td> + <td>2011/06/02</td> + <td>$95,400</td> + </tr> + <tr> + <td>Suki Burks</td> + <td>Developer</td> + <td>London</td> + <td>53</td> + <td>2009/10/22</td> + <td>$114,500</td> + </tr> + <tr> + <td>Prescott Bartlett</td> + <td>Technical Author</td> + <td>London</td> + <td>27</td> + <td>2011/05/07</td> + <td>$145,000</td> + </tr> + <tr> + <td>Gavin Cortez</td> + <td>Team Leader</td> + <td>San Francisco</td> + <td>22</td> + <td>2008/10/26</td> + <td>$235,500</td> + </tr> + <tr> + <td>Martena Mccray</td> + <td>Post-Sales support</td> + <td>Edinburgh</td> + <td>46</td> + <td>2011/03/09</td> + <td>$324,050</td> + </tr> + <tr> + <td>Unity Butler</td> + <td>Marketing Designer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/12/09</td> + <td>$85,675</td> + </tr> + <tr> + <td>Howard Hatfield</td> + <td>Office Manager</td> + <td>San Francisco</td> + <td>51</td> + <td>2008/12/16</td> + <td>$164,500</td> + </tr> + <tr> + <td>Hope Fuentes</td> + <td>Secretary</td> + <td>San Francisco</td> + <td>41</td> + <td>2010/02/12</td> + <td>$109,850</td> + </tr> + <tr> + <td>Vivian Harrell</td> + <td>Financial Controller</td> + <td>San Francisco</td> + <td>62</td> + <td>2009/02/14</td> + <td>$452,500</td> + </tr> + <tr> + <td>Timothy Mooney</td> + <td>Office Manager</td> + <td>London</td> + <td>37</td> + <td>2008/12/11</td> + <td>$136,200</td> + </tr> + <tr> + <td>Jackson Bradshaw</td> + <td>Director</td> + <td>New York</td> + <td>65</td> + <td>2008/09/26</td> + <td>$645,750</td> + </tr> + <tr> + <td>Olivia Liang</td> + <td>Support Engineer</td> + <td>Singapore</td> + <td>64</td> + <td>2011/02/03</td> + <td>$234,500</td> + </tr> + <tr> + <td>Bruno Nash</td> + <td>Software Engineer</td> + <td>London</td> + <td>38</td> + <td>2011/05/03</td> + <td>$163,500</td> + </tr> + <tr> + <td>Sakura Yamamoto</td> + <td>Support Engineer</td> + <td>Tokyo</td> + <td>37</td> + <td>2009/08/19</td> + <td>$139,575</td> + </tr> + <tr> + <td>Thor Walton</td> + <td>Developer</td> + <td>New York</td> + <td>61</td> + <td>2013/08/11</td> + <td>$98,540</td> + </tr> + <tr> + <td>Finn Camacho</td> + <td>Support Engineer</td> + <td>San Francisco</td> + <td>47</td> + <td>2009/07/07</td> + <td>$87,500</td> + </tr> + <tr> + <td>Serge Baldwin</td> + <td>Data Coordinator</td> + <td>Singapore</td> + <td>64</td> + <td>2012/04/09</td> + <td>$138,575</td> + </tr> + <tr> + <td>Zenaida Frank</td> + <td>Software Engineer</td> + <td>New York</td> + <td>63</td> + <td>2010/01/04</td> + <td>$125,250</td> + </tr> + <tr> + <td>Zorita Serrano</td> + <td>Software Engineer</td> + <td>San Francisco</td> + <td>56</td> + <td>2012/06/01</td> + <td>$115,000</td> + </tr> + <tr> + <td>Jennifer Acosta</td> + <td>Junior Javascript Developer</td> + <td>Edinburgh</td> + <td>43</td> + <td>2013/02/01</td> + <td>$75,650</td> + </tr> + <tr> + <td>Cara Stevens</td> + <td>Sales Assistant</td> + <td>New York</td> + <td>46</td> + <td>2011/12/06</td> + <td>$145,600</td> + </tr> + <tr> + <td>Hermione Butler</td> + <td>Regional Director</td> + <td>London</td> + <td>47</td> + <td>2011/03/21</td> + <td>$356,250</td> + </tr> + <tr> + <td>Lael Greer</td> + <td>Systems Administrator</td> + <td>London</td> + <td>21</td> + <td>2009/02/27</td> + <td>$103,500</td> + </tr> + <tr> + <td>Jonas Alexander</td> + <td>Developer</td> + <td>San Francisco</td> + <td>30</td> + <td>2010/07/14</td> + <td>$86,500</td> + </tr> + <tr> + <td>Shad Decker</td> + <td>Regional Director</td> + <td>Edinburgh</td> + <td>51</td> + <td>2008/11/13</td> + <td>$183,000</td> + </tr> + <tr> + <td>Michael Bruce</td> + <td>Javascript Developer</td> + <td>Singapore</td> + <td>29</td> + <td>2011/06/27</td> + <td>$183,000</td> + </tr> + <tr> + <td>Donna Snider</td> + <td>Customer Support</td> + <td>New York</td> + <td>27</td> + <td>2011/01/25</td> + <td>$112,000</td> + </tr> + </tbody> + </table> + + <ul class="tabs"> + <li class="active">Javascript</li> + <li>HTML</li> + <li>CSS</li> + <li>Ajax</li> + <li>Server-side script</li> + </ul> + + <div class="tabs"> + <div class="js"> + <p>The Javascript shown below is used to initialise the table shown in this example:</p><code class="multiline language-js">$(document).ready(function() { + $('#example').DataTable( { + dom: 'T&lt;&quot;clear&quot;&gt;lfrtip', + tableTools: { + &quot;sSwfPath&quot;: &quot;../swf/copy_csv_xls_pdf.swf&quot; + } + } ); +} );</code> + + <p>In addition to the above code, the following Javascript library files are loaded for use in this example:</p> + + <ul> + <li><a href="../../../media/js/jquery.js">../../../media/js/jquery.js</a></li> + <li><a href="../../../media/js/jquery.dataTables.js">../../../media/js/jquery.dataTables.js</a></li> + <li><a href="../js/dataTables.tableTools.js">../js/dataTables.tableTools.js</a></li> + </ul> + </div> + + <div class="table"> + <p>The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:</p> + </div> + + <div class="css"> + <div> + <p>This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The + additional CSS used is shown below:</p><code class="multiline language-css"></code> + </div> + + <p>The following CSS library files are loaded for use in this example to provide the styling of the table:</p> + + <ul> + <li><a href="../../../media/css/jquery.dataTables.css">../../../media/css/jquery.dataTables.css</a></li> + <li><a href="../css/dataTables.tableTools.css">../css/dataTables.tableTools.css</a></li> + </ul> + </div> + + <div class="ajax"> + <p>This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is + loaded.</p> + </div> + + <div class="php"> + <p>The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side + processing scripts can be written in any language, using <a href="//datatables.net/manual/server-side">the protocol described in the DataTables + documentation</a>.</p> + </div> + </div> + </section> + </div> + + <section> + <div class="footer"> + <div class="gradient"></div> + + <div class="liner"> + <h2>Other examples</h2> + + <div class="toc"> + <div class="toc-group"> + <h3><a href="./index.html">Examples</a></h3> + <ul class="toc active"> + <li><a href="./simple.html">Basic initialisation</a></li> + <li class="active"><a href="./swf_path.html">Setting the SWF path</a></li> + <li><a href="./new_init.html">Initialisation with `new`</a></li> + <li><a href="./defaults.html">Defaults</a></li> + <li><a href="./select_single.html">Row selection - single row select</a></li> + <li><a href="./select_multi.html">Row selection - multi-row select</a></li> + <li><a href="./select_os.html">Row selection - operating system style</a></li> + <li><a href="./select_column.html">Row selection - row selector on specific cells</a></li> + <li><a href="./multiple_tables.html">Multiple tables</a></li> + <li><a href="./multi_instance.html">Multiple toolbars</a></li> + <li><a href="./collection.html">Button collections</a></li> + <li><a href="./plug-in.html">Plug-in button types</a></li> + <li><a href="./button_text.html">Custom button text</a></li> + <li><a href="./alter_buttons.html">Button arrangement</a></li> + <li><a href="./ajax.html">Ajax loaded data</a></li> + <li><a href="./pdf_message.html">PDF message</a></li> + <li><a href="./bootstrap.html">Bootstrap styling</a></li> + <li><a href="./jqueryui.html">jQuery UI styling</a></li> + </ul> + </div> + </div> + + <div class="epilogue"> + <p>Please refer to the <a href="http://www.datatables.net">DataTables documentation</a> for full information about its API properties and methods.<br> + Additionally, there are a wide range of <a href="http://www.datatables.net/extras">extras</a> and <a href="http://www.datatables.net/plug-ins">plug-ins</a> + which extend the capabilities of DataTables.</p> + + <p class="copyright">DataTables designed and created by <a href="http://www.sprymedia.co.uk">SpryMedia Ltd</a> &#169; 2007-2015<br> + DataTables is licensed under the <a href="http://www.datatables.net/mit">MIT license</a>.</p> + </div> + </div> + </div> + </section> +</body> +</html> \ No newline at end of file diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/images/collection.png b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/collection.png new file mode 100644 index 0000000..5dd4dfd Binary files /dev/null and b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/collection.png differ diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/images/collection_hover.png b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/collection_hover.png new file mode 100644 index 0000000..7b37b1e Binary files /dev/null and b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/collection_hover.png differ diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/images/copy.png b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/copy.png new file mode 100644 index 0000000..5b01ab1 Binary files /dev/null and b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/copy.png differ diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/images/copy_hover.png b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/copy_hover.png new file mode 100644 index 0000000..039a7fc Binary files /dev/null and b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/copy_hover.png differ diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/images/csv.png b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/csv.png new file mode 100644 index 0000000..43df155 Binary files /dev/null and b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/csv.png differ diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/images/csv_hover.png b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/csv_hover.png new file mode 100644 index 0000000..10b34d3 Binary files /dev/null and b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/csv_hover.png differ diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/images/pdf.png b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/pdf.png new file mode 100644 index 0000000..1b038d0 Binary files /dev/null and b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/pdf.png differ diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/images/pdf_hover.png b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/pdf_hover.png new file mode 100644 index 0000000..eb06855 Binary files /dev/null and b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/pdf_hover.png differ diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/images/print.png b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/print.png new file mode 100644 index 0000000..2db0824 Binary files /dev/null and b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/print.png differ diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/images/print_hover.png b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/print_hover.png new file mode 100644 index 0000000..9808a9c Binary files /dev/null and b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/print_hover.png differ diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/images/psd/collection.psd b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/psd/collection.psd new file mode 100644 index 0000000..7eb7caf Binary files /dev/null and b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/psd/collection.psd differ diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/images/psd/copy document.psd b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/psd/copy document.psd new file mode 100644 index 0000000..ca207ad Binary files /dev/null and b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/psd/copy document.psd differ diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/images/psd/file_types.psd b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/psd/file_types.psd new file mode 100644 index 0000000..0f280ad Binary files /dev/null and b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/psd/file_types.psd differ diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/images/psd/printer.psd b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/psd/printer.psd new file mode 100644 index 0000000..8c33f7a Binary files /dev/null and b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/psd/printer.psd differ diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/images/xls.png b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/xls.png new file mode 100644 index 0000000..5aaf40d Binary files /dev/null and b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/xls.png differ diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/images/xls_hover.png b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/xls_hover.png new file mode 100644 index 0000000..5b1930a Binary files /dev/null and b/theme/bootstrap/plugins/datatables/extensions/TableTools/images/xls_hover.png differ diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/js/dataTables.tableTools.js b/theme/bootstrap/plugins/datatables/extensions/TableTools/js/dataTables.tableTools.js new file mode 100644 index 0000000..749fcd8 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/js/dataTables.tableTools.js @@ -0,0 +1,3230 @@ +/*! TableTools 2.2.4 + * 2009-2015 SpryMedia Ltd - datatables.net/license + * + * ZeroClipboard 1.0.4 + * Author: Joseph Huckaby - MIT licensed + */ + +/** + * @summary TableTools + * @description Tools and buttons for DataTables + * @version 2.2.4 + * @file dataTables.tableTools.js + * @author SpryMedia Ltd (www.sprymedia.co.uk) + * @contact www.sprymedia.co.uk/contact + * @copyright Copyright 2009-2015 SpryMedia Ltd. + * + * This source file is free software, available under the following license: + * MIT license - http://datatables.net/license/mit + * + * This source file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. + * + * For details please refer to: http://www.datatables.net + */ + + +/* Global scope for TableTools for backwards compatibility. + * Will be removed in 2.3 + */ +var TableTools; + +(function(window, document, undefined) { + + +var factory = function( $, DataTable ) { +"use strict"; + + +//include ZeroClipboard.js +/* ZeroClipboard 1.0.4 + * Author: Joseph Huckaby + */ + +var ZeroClipboard_TableTools = { + + version: "1.0.4-TableTools2", + clients: {}, // registered upload clients on page, indexed by id + moviePath: '', // URL to movie + nextId: 1, // ID of next movie + + $: function(thingy) { + // simple DOM lookup utility function + if (typeof(thingy) == 'string') { + thingy = document.getElementById(thingy); + } + if (!thingy.addClass) { + // extend element with a few useful methods + thingy.hide = function() { this.style.display = 'none'; }; + thingy.show = function() { this.style.display = ''; }; + thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; }; + thingy.removeClass = function(name) { + this.className = this.className.replace( new RegExp("\\s*" + name + "\\s*"), " ").replace(/^\s+/, '').replace(/\s+$/, ''); + }; + thingy.hasClass = function(name) { + return !!this.className.match( new RegExp("\\s*" + name + "\\s*") ); + }; + } + return thingy; + }, + + setMoviePath: function(path) { + // set path to ZeroClipboard.swf + this.moviePath = path; + }, + + dispatch: function(id, eventName, args) { + // receive event from flash movie, send to client + var client = this.clients[id]; + if (client) { + client.receiveEvent(eventName, args); + } + }, + + register: function(id, client) { + // register new client to receive events + this.clients[id] = client; + }, + + getDOMObjectPosition: function(obj) { + // get absolute coordinates for dom element + var info = { + left: 0, + top: 0, + width: obj.width ? obj.width : obj.offsetWidth, + height: obj.height ? obj.height : obj.offsetHeight + }; + + if ( obj.style.width !== "" ) { + info.width = obj.style.width.replace("px",""); + } + + if ( obj.style.height !== "" ) { + info.height = obj.style.height.replace("px",""); + } + + while (obj) { + info.left += obj.offsetLeft; + info.top += obj.offsetTop; + obj = obj.offsetParent; + } + + return info; + }, + + Client: function(elem) { + // constructor for new simple upload client + this.handlers = {}; + + // unique ID + this.id = ZeroClipboard_TableTools.nextId++; + this.movieId = 'ZeroClipboard_TableToolsMovie_' + this.id; + + // register client with singleton to receive flash events + ZeroClipboard_TableTools.register(this.id, this); + + // create movie + if (elem) { + this.glue(elem); + } + } +}; + +ZeroClipboard_TableTools.Client.prototype = { + + id: 0, // unique ID for us + ready: false, // whether movie is ready to receive events or not + movie: null, // reference to movie object + clipText: '', // text to copy to clipboard + fileName: '', // default file save name + action: 'copy', // action to perform + handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor + cssEffects: true, // enable CSS mouse effects on dom container + handlers: null, // user event handlers + sized: false, + + glue: function(elem, title) { + // glue to DOM element + // elem can be ID or actual DOM element object + this.domElement = ZeroClipboard_TableTools.$(elem); + + // float just above object, or zIndex 99 if dom element isn't set + var zIndex = 99; + if (this.domElement.style.zIndex) { + zIndex = parseInt(this.domElement.style.zIndex, 10) + 1; + } + + // find X/Y position of domElement + var box = ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement); + + // create floating DIV above element + this.div = document.createElement('div'); + var style = this.div.style; + style.position = 'absolute'; + style.left = '0px'; + style.top = '0px'; + style.width = (box.width) + 'px'; + style.height = box.height + 'px'; + style.zIndex = zIndex; + + if ( typeof title != "undefined" && title !== "" ) { + this.div.title = title; + } + if ( box.width !== 0 && box.height !== 0 ) { + this.sized = true; + } + + // style.backgroundColor = '#f00'; // debug + if ( this.domElement ) { + this.domElement.appendChild(this.div); + this.div.innerHTML = this.getHTML( box.width, box.height ).replace(/&/g, '&amp;'); + } + }, + + positionElement: function() { + var box = ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement); + var style = this.div.style; + + style.position = 'absolute'; + //style.left = (this.domElement.offsetLeft)+'px'; + //style.top = this.domElement.offsetTop+'px'; + style.width = box.width + 'px'; + style.height = box.height + 'px'; + + if ( box.width !== 0 && box.height !== 0 ) { + this.sized = true; + } else { + return; + } + + var flash = this.div.childNodes[0]; + flash.width = box.width; + flash.height = box.height; + }, + + getHTML: function(width, height) { + // return HTML for movie + var html = ''; + var flashvars = 'id=' + this.id + + '&width=' + width + + '&height=' + height; + + if (navigator.userAgent.match(/MSIE/)) { + // IE gets an OBJECT tag + var protocol = location.href.match(/^https/i) ? 'https://' : 'http://'; + html += '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="'+protocol+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" width="'+width+'" height="'+height+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ZeroClipboard_TableTools.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/><param name="wmode" value="transparent"/></object>'; + } + else { + // all other browsers get an EMBED tag + html += '<embed id="'+this.movieId+'" src="'+ZeroClipboard_TableTools.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+width+'" height="'+height+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" wmode="transparent" />'; + } + return html; + }, + + hide: function() { + // temporarily hide floater offscreen + if (this.div) { + this.div.style.left = '-2000px'; + } + }, + + show: function() { + // show ourselves after a call to hide() + this.reposition(); + }, + + destroy: function() { + // destroy control and floater + if (this.domElement && this.div) { + this.hide(); + this.div.innerHTML = ''; + + var body = document.getElementsByTagName('body')[0]; + try { body.removeChild( this.div ); } catch(e) {} + + this.domElement = null; + this.div = null; + } + }, + + reposition: function(elem) { + // reposition our floating div, optionally to new container + // warning: container CANNOT change size, only position + if (elem) { + this.domElement = ZeroClipboard_TableTools.$(elem); + if (!this.domElement) { + this.hide(); + } + } + + if (this.domElement && this.div) { + var box = ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement); + var style = this.div.style; + style.left = '' + box.left + 'px'; + style.top = '' + box.top + 'px'; + } + }, + + clearText: function() { + // clear the text to be copy / saved + this.clipText = ''; + if (this.ready) { + this.movie.clearText(); + } + }, + + appendText: function(newText) { + // append text to that which is to be copied / saved + this.clipText += newText; + if (this.ready) { this.movie.appendText(newText) ;} + }, + + setText: function(newText) { + // set text to be copied to be copied / saved + this.clipText = newText; + if (this.ready) { this.movie.setText(newText) ;} + }, + + setCharSet: function(charSet) { + // set the character set (UTF16LE or UTF8) + this.charSet = charSet; + if (this.ready) { this.movie.setCharSet(charSet) ;} + }, + + setBomInc: function(bomInc) { + // set if the BOM should be included or not + this.incBom = bomInc; + if (this.ready) { this.movie.setBomInc(bomInc) ;} + }, + + setFileName: function(newText) { + // set the file name + this.fileName = newText; + if (this.ready) { + this.movie.setFileName(newText); + } + }, + + setAction: function(newText) { + // set action (save or copy) + this.action = newText; + if (this.ready) { + this.movie.setAction(newText); + } + }, + + addEventListener: function(eventName, func) { + // add user event listener for event + // event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel + eventName = eventName.toString().toLowerCase().replace(/^on/, ''); + if (!this.handlers[eventName]) { + this.handlers[eventName] = []; + } + this.handlers[eventName].push(func); + }, + + setHandCursor: function(enabled) { + // enable hand cursor (true), or default arrow cursor (false) + this.handCursorEnabled = enabled; + if (this.ready) { + this.movie.setHandCursor(enabled); + } + }, + + setCSSEffects: function(enabled) { + // enable or disable CSS effects on DOM container + this.cssEffects = !!enabled; + }, + + receiveEvent: function(eventName, args) { + var self; + + // receive event from flash + eventName = eventName.toString().toLowerCase().replace(/^on/, ''); + + // special behavior for certain events + switch (eventName) { + case 'load': + // movie claims it is ready, but in IE this isn't always the case... + // bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function + this.movie = document.getElementById(this.movieId); + if (!this.movie) { + self = this; + setTimeout( function() { self.receiveEvent('load', null); }, 1 ); + return; + } + + // firefox on pc needs a "kick" in order to set these in certain cases + if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) { + self = this; + setTimeout( function() { self.receiveEvent('load', null); }, 100 ); + this.ready = true; + return; + } + + this.ready = true; + this.movie.clearText(); + this.movie.appendText( this.clipText ); + this.movie.setFileName( this.fileName ); + this.movie.setAction( this.action ); + this.movie.setCharSet( this.charSet ); + this.movie.setBomInc( this.incBom ); + this.movie.setHandCursor( this.handCursorEnabled ); + break; + + case 'mouseover': + if (this.domElement && this.cssEffects) { + //this.domElement.addClass('hover'); + if (this.recoverActive) { + this.domElement.addClass('active'); + } + } + break; + + case 'mouseout': + if (this.domElement && this.cssEffects) { + this.recoverActive = false; + if (this.domElement.hasClass('active')) { + this.domElement.removeClass('active'); + this.recoverActive = true; + } + //this.domElement.removeClass('hover'); + } + break; + + case 'mousedown': + if (this.domElement && this.cssEffects) { + this.domElement.addClass('active'); + } + break; + + case 'mouseup': + if (this.domElement && this.cssEffects) { + this.domElement.removeClass('active'); + this.recoverActive = false; + } + break; + } // switch eventName + + if (this.handlers[eventName]) { + for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) { + var func = this.handlers[eventName][idx]; + + if (typeof(func) == 'function') { + // actual function reference + func(this, args); + } + else if ((typeof(func) == 'object') && (func.length == 2)) { + // PHP style object + method, i.e. [myObject, 'myMethod'] + func[0][ func[1] ](this, args); + } + else if (typeof(func) == 'string') { + // name of function + window[func](this, args); + } + } // foreach event handler defined + } // user defined handler for event + } + +}; + +// For the Flash binding to work, ZeroClipboard_TableTools must be on the global +// object list +window.ZeroClipboard_TableTools = ZeroClipboard_TableTools; +//include TableTools.js +/* TableTools + * 2009-2015 SpryMedia Ltd - datatables.net/license + */ + +/*globals TableTools,ZeroClipboard_TableTools*/ + + +(function($, window, document) { + +/** + * TableTools provides flexible buttons and other tools for a DataTables enhanced table + * @class TableTools + * @constructor + * @param {Object} oDT DataTables instance. When using DataTables 1.10 this can + * also be a jQuery collection, jQuery selector, table node, DataTables API + * instance or DataTables settings object. + * @param {Object} oOpts TableTools options + * @param {String} oOpts.sSwfPath ZeroClipboard SWF path + * @param {String} oOpts.sRowSelect Row selection options - 'none', 'single', 'multi' or 'os' + * @param {Function} oOpts.fnPreRowSelect Callback function just prior to row selection + * @param {Function} oOpts.fnRowSelected Callback function just after row selection + * @param {Function} oOpts.fnRowDeselected Callback function when row is deselected + * @param {Array} oOpts.aButtons List of buttons to be used + */ +TableTools = function( oDT, oOpts ) +{ + /* Santiy check that we are a new instance */ + if ( ! this instanceof TableTools ) + { + alert( "Warning: TableTools must be initialised with the keyword 'new'" ); + } + + // In 1.10 we can use the API to get the settings object from a number of + // sources + var dtSettings = $.fn.dataTable.Api ? + new $.fn.dataTable.Api( oDT ).settings()[0] : + oDT.fnSettings(); + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Public class variables + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * @namespace Settings object which contains customisable information for TableTools instance + */ + this.s = { + /** + * Store 'this' so the instance can be retrieved from the settings object + * @property that + * @type object + * @default this + */ + "that": this, + + /** + * DataTables settings objects + * @property dt + * @type object + * @default <i>From the oDT init option</i> + */ + "dt": dtSettings, + + /** + * @namespace Print specific information + */ + "print": { + /** + * DataTables draw 'start' point before the printing display was shown + * @property saveStart + * @type int + * @default -1 + */ + "saveStart": -1, + + /** + * DataTables draw 'length' point before the printing display was shown + * @property saveLength + * @type int + * @default -1 + */ + "saveLength": -1, + + /** + * Page scrolling point before the printing display was shown so it can be restored + * @property saveScroll + * @type int + * @default -1 + */ + "saveScroll": -1, + + /** + * Wrapped function to end the print display (to maintain scope) + * @property funcEnd + * @type Function + * @default function () {} + */ + "funcEnd": function () {} + }, + + /** + * A unique ID is assigned to each button in each instance + * @property buttonCounter + * @type int + * @default 0 + */ + "buttonCounter": 0, + + /** + * @namespace Select rows specific information + */ + "select": { + /** + * Select type - can be 'none', 'single' or 'multi' + * @property type + * @type string + * @default "" + */ + "type": "", + + /** + * Array of nodes which are currently selected + * @property selected + * @type array + * @default [] + */ + "selected": [], + + /** + * Function to run before the selection can take place. Will cancel the select if the + * function returns false + * @property preRowSelect + * @type Function + * @default null + */ + "preRowSelect": null, + + /** + * Function to run when a row is selected + * @property postSelected + * @type Function + * @default null + */ + "postSelected": null, + + /** + * Function to run when a row is deselected + * @property postDeselected + * @type Function + * @default null + */ + "postDeselected": null, + + /** + * Indicate if all rows are selected (needed for server-side processing) + * @property all + * @type boolean + * @default false + */ + "all": false, + + /** + * Class name to add to selected TR nodes + * @property selectedClass + * @type String + * @default "" + */ + "selectedClass": "" + }, + + /** + * Store of the user input customisation object + * @property custom + * @type object + * @default {} + */ + "custom": {}, + + /** + * SWF movie path + * @property swfPath + * @type string + * @default "" + */ + "swfPath": "", + + /** + * Default button set + * @property buttonSet + * @type array + * @default [] + */ + "buttonSet": [], + + /** + * When there is more than one TableTools instance for a DataTable, there must be a + * master which controls events (row selection etc) + * @property master + * @type boolean + * @default false + */ + "master": false, + + /** + * Tag names that are used for creating collections and buttons + * @namesapce + */ + "tags": {} + }; + + + /** + * @namespace Common and useful DOM elements for the class instance + */ + this.dom = { + /** + * DIV element that is create and all TableTools buttons (and their children) put into + * @property container + * @type node + * @default null + */ + "container": null, + + /** + * The table node to which TableTools will be applied + * @property table + * @type node + * @default null + */ + "table": null, + + /** + * @namespace Nodes used for the print display + */ + "print": { + /** + * Nodes which have been removed from the display by setting them to display none + * @property hidden + * @type array + * @default [] + */ + "hidden": [], + + /** + * The information display saying telling the user about the print display + * @property message + * @type node + * @default null + */ + "message": null + }, + + /** + * @namespace Nodes used for a collection display. This contains the currently used collection + */ + "collection": { + /** + * The div wrapper containing the buttons in the collection (i.e. the menu) + * @property collection + * @type node + * @default null + */ + "collection": null, + + /** + * Background display to provide focus and capture events + * @property background + * @type node + * @default null + */ + "background": null + } + }; + + /** + * @namespace Name space for the classes that this TableTools instance will use + * @extends TableTools.classes + */ + this.classes = $.extend( true, {}, TableTools.classes ); + if ( this.s.dt.bJUI ) + { + $.extend( true, this.classes, TableTools.classes_themeroller ); + } + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Public class methods + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * Retreieve the settings object from an instance + * @method fnSettings + * @returns {object} TableTools settings object + */ + this.fnSettings = function () { + return this.s; + }; + + + /* Constructor logic */ + if ( typeof oOpts == 'undefined' ) + { + oOpts = {}; + } + + + TableTools._aInstances.push( this ); + this._fnConstruct( oOpts ); + + return this; +}; + + + +TableTools.prototype = { + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Public methods + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * Retreieve the settings object from an instance + * @returns {array} List of TR nodes which are currently selected + * @param {boolean} [filtered=false] Get only selected rows which are + * available given the filtering applied to the table. By default + * this is false - i.e. all rows, regardless of filtering are + selected. + */ + "fnGetSelected": function ( filtered ) + { + var + out = [], + data = this.s.dt.aoData, + displayed = this.s.dt.aiDisplay, + i, iLen; + + if ( filtered ) + { + // Only consider filtered rows + for ( i=0, iLen=displayed.length ; i<iLen ; i++ ) + { + if ( data[ displayed[i] ]._DTTT_selected ) + { + out.push( data[ displayed[i] ].nTr ); + } + } + } + else + { + // Use all rows + for ( i=0, iLen=data.length ; i<iLen ; i++ ) + { + if ( data[i]._DTTT_selected ) + { + out.push( data[i].nTr ); + } + } + } + + return out; + }, + + + /** + * Get the data source objects/arrays from DataTables for the selected rows (same as + * fnGetSelected followed by fnGetData on each row from the table) + * @returns {array} Data from the TR nodes which are currently selected + */ + "fnGetSelectedData": function () + { + var out = []; + var data=this.s.dt.aoData; + var i, iLen; + + for ( i=0, iLen=data.length ; i<iLen ; i++ ) + { + if ( data[i]._DTTT_selected ) + { + out.push( this.s.dt.oInstance.fnGetData(i) ); + } + } + + return out; + }, + + + /** + * Get the indexes of the selected rows + * @returns {array} List of row indexes + * @param {boolean} [filtered=false] Get only selected rows which are + * available given the filtering applied to the table. By default + * this is false - i.e. all rows, regardless of filtering are + selected. + */ + "fnGetSelectedIndexes": function ( filtered ) + { + var + out = [], + data = this.s.dt.aoData, + displayed = this.s.dt.aiDisplay, + i, iLen; + + if ( filtered ) + { + // Only consider filtered rows + for ( i=0, iLen=displayed.length ; i<iLen ; i++ ) + { + if ( data[ displayed[i] ]._DTTT_selected ) + { + out.push( displayed[i] ); + } + } + } + else + { + // Use all rows + for ( i=0, iLen=data.length ; i<iLen ; i++ ) + { + if ( data[i]._DTTT_selected ) + { + out.push( i ); + } + } + } + + return out; + }, + + + /** + * Check to see if a current row is selected or not + * @param {Node} n TR node to check if it is currently selected or not + * @returns {Boolean} true if select, false otherwise + */ + "fnIsSelected": function ( n ) + { + var pos = this.s.dt.oInstance.fnGetPosition( n ); + return (this.s.dt.aoData[pos]._DTTT_selected===true) ? true : false; + }, + + + /** + * Select all rows in the table + * @param {boolean} [filtered=false] Select only rows which are available + * given the filtering applied to the table. By default this is false - + * i.e. all rows, regardless of filtering are selected. + */ + "fnSelectAll": function ( filtered ) + { + this._fnRowSelect( filtered ? + this.s.dt.aiDisplay : + this.s.dt.aoData + ); + }, + + + /** + * Deselect all rows in the table + * @param {boolean} [filtered=false] Deselect only rows which are available + * given the filtering applied to the table. By default this is false - + * i.e. all rows, regardless of filtering are deselected. + */ + "fnSelectNone": function ( filtered ) + { + this._fnRowDeselect( this.fnGetSelectedIndexes(filtered) ); + }, + + + /** + * Select row(s) + * @param {node|object|array} n The row(s) to select. Can be a single DOM + * TR node, an array of TR nodes or a jQuery object. + */ + "fnSelect": function ( n ) + { + if ( this.s.select.type == "single" ) + { + this.fnSelectNone(); + this._fnRowSelect( n ); + } + else + { + this._fnRowSelect( n ); + } + }, + + + /** + * Deselect row(s) + * @param {node|object|array} n The row(s) to deselect. Can be a single DOM + * TR node, an array of TR nodes or a jQuery object. + */ + "fnDeselect": function ( n ) + { + this._fnRowDeselect( n ); + }, + + + /** + * Get the title of the document - useful for file names. The title is retrieved from either + * the configuration object's 'title' parameter, or the HTML document title + * @param {Object} oConfig Button configuration object + * @returns {String} Button title + */ + "fnGetTitle": function( oConfig ) + { + var sTitle = ""; + if ( typeof oConfig.sTitle != 'undefined' && oConfig.sTitle !== "" ) { + sTitle = oConfig.sTitle; + } else { + var anTitle = document.getElementsByTagName('title'); + if ( anTitle.length > 0 ) + { + sTitle = anTitle[0].innerHTML; + } + } + + /* Strip characters which the OS will object to - checking for UTF8 support in the scripting + * engine + */ + if ( "\u00A1".toString().length < 4 ) { + return sTitle.replace(/[^a-zA-Z0-9_\u00A1-\uFFFF\.,\-_ !\(\)]/g, ""); + } else { + return sTitle.replace(/[^a-zA-Z0-9_\.,\-_ !\(\)]/g, ""); + } + }, + + + /** + * Calculate a unity array with the column width by proportion for a set of columns to be + * included for a button. This is particularly useful for PDF creation, where we can use the + * column widths calculated by the browser to size the columns in the PDF. + * @param {Object} oConfig Button configuration object + * @returns {Array} Unity array of column ratios + */ + "fnCalcColRatios": function ( oConfig ) + { + var + aoCols = this.s.dt.aoColumns, + aColumnsInc = this._fnColumnTargets( oConfig.mColumns ), + aColWidths = [], + iWidth = 0, iTotal = 0, i, iLen; + + for ( i=0, iLen=aColumnsInc.length ; i<iLen ; i++ ) + { + if ( aColumnsInc[i] ) + { + iWidth = aoCols[i].nTh.offsetWidth; + iTotal += iWidth; + aColWidths.push( iWidth ); + } + } + + for ( i=0, iLen=aColWidths.length ; i<iLen ; i++ ) + { + aColWidths[i] = aColWidths[i] / iTotal; + } + + return aColWidths.join('\t'); + }, + + + /** + * Get the information contained in a table as a string + * @param {Object} oConfig Button configuration object + * @returns {String} Table data as a string + */ + "fnGetTableData": function ( oConfig ) + { + /* In future this could be used to get data from a plain HTML source as well as DataTables */ + if ( this.s.dt ) + { + return this._fnGetDataTablesData( oConfig ); + } + }, + + + /** + * Pass text to a flash button instance, which will be used on the button's click handler + * @param {Object} clip Flash button object + * @param {String} text Text to set + */ + "fnSetText": function ( clip, text ) + { + this._fnFlashSetText( clip, text ); + }, + + + /** + * Resize the flash elements of the buttons attached to this TableTools instance - this is + * useful for when initialising TableTools when it is hidden (display:none) since sizes can't + * be calculated at that time. + */ + "fnResizeButtons": function () + { + for ( var cli in ZeroClipboard_TableTools.clients ) + { + if ( cli ) + { + var client = ZeroClipboard_TableTools.clients[cli]; + if ( typeof client.domElement != 'undefined' && + client.domElement.parentNode ) + { + client.positionElement(); + } + } + } + }, + + + /** + * Check to see if any of the ZeroClipboard client's attached need to be resized + */ + "fnResizeRequired": function () + { + for ( var cli in ZeroClipboard_TableTools.clients ) + { + if ( cli ) + { + var client = ZeroClipboard_TableTools.clients[cli]; + if ( typeof client.domElement != 'undefined' && + client.domElement.parentNode == this.dom.container && + client.sized === false ) + { + return true; + } + } + } + return false; + }, + + + /** + * Programmatically enable or disable the print view + * @param {boolean} [bView=true] Show the print view if true or not given. If false, then + * terminate the print view and return to normal. + * @param {object} [oConfig={}] Configuration for the print view + * @param {boolean} [oConfig.bShowAll=false] Show all rows in the table if true + * @param {string} [oConfig.sInfo] Information message, displayed as an overlay to the + * user to let them know what the print view is. + * @param {string} [oConfig.sMessage] HTML string to show at the top of the document - will + * be included in the printed document. + */ + "fnPrint": function ( bView, oConfig ) + { + if ( oConfig === undefined ) + { + oConfig = {}; + } + + if ( bView === undefined || bView ) + { + this._fnPrintStart( oConfig ); + } + else + { + this._fnPrintEnd(); + } + }, + + + /** + * Show a message to the end user which is nicely styled + * @param {string} message The HTML string to show to the user + * @param {int} time The duration the message is to be shown on screen for (mS) + */ + "fnInfo": function ( message, time ) { + var info = $('<div/>') + .addClass( this.classes.print.info ) + .html( message ) + .appendTo( 'body' ); + + setTimeout( function() { + info.fadeOut( "normal", function() { + info.remove(); + } ); + }, time ); + }, + + + + /** + * Get the container element of the instance for attaching to the DOM + * @returns {node} DOM node + */ + "fnContainer": function () { + return this.dom.container; + }, + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Private methods (they are of course public in JS, but recommended as private) + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /** + * Constructor logic + * @method _fnConstruct + * @param {Object} oOpts Same as TableTools constructor + * @returns void + * @private + */ + "_fnConstruct": function ( oOpts ) + { + var that = this; + + this._fnCustomiseSettings( oOpts ); + + /* Container element */ + this.dom.container = document.createElement( this.s.tags.container ); + this.dom.container.className = this.classes.container; + + /* Row selection config */ + if ( this.s.select.type != 'none' ) + { + this._fnRowSelectConfig(); + } + + /* Buttons */ + this._fnButtonDefinations( this.s.buttonSet, this.dom.container ); + + /* Destructor */ + this.s.dt.aoDestroyCallback.push( { + "sName": "TableTools", + "fn": function () { + $(that.s.dt.nTBody) + .off( 'click.DTTT_Select', that.s.custom.sRowSelector ) + .off( 'mousedown.DTTT_Select', 'tr' ) + .off( 'mouseup.DTTT_Select', 'tr' ); + + $(that.dom.container).empty(); + + // Remove the instance + var idx = $.inArray( that, TableTools._aInstances ); + if ( idx !== -1 ) { + TableTools._aInstances.splice( idx, 1 ); + } + } + } ); + }, + + + /** + * Take the user defined settings and the default settings and combine them. + * @method _fnCustomiseSettings + * @param {Object} oOpts Same as TableTools constructor + * @returns void + * @private + */ + "_fnCustomiseSettings": function ( oOpts ) + { + /* Is this the master control instance or not? */ + if ( typeof this.s.dt._TableToolsInit == 'undefined' ) + { + this.s.master = true; + this.s.dt._TableToolsInit = true; + } + + /* We can use the table node from comparisons to group controls */ + this.dom.table = this.s.dt.nTable; + + /* Clone the defaults and then the user options */ + this.s.custom = $.extend( {}, TableTools.DEFAULTS, oOpts ); + + /* Flash file location */ + this.s.swfPath = this.s.custom.sSwfPath; + if ( typeof ZeroClipboard_TableTools != 'undefined' ) + { + ZeroClipboard_TableTools.moviePath = this.s.swfPath; + } + + /* Table row selecting */ + this.s.select.type = this.s.custom.sRowSelect; + this.s.select.preRowSelect = this.s.custom.fnPreRowSelect; + this.s.select.postSelected = this.s.custom.fnRowSelected; + this.s.select.postDeselected = this.s.custom.fnRowDeselected; + + // Backwards compatibility - allow the user to specify a custom class in the initialiser + if ( this.s.custom.sSelectedClass ) + { + this.classes.select.row = this.s.custom.sSelectedClass; + } + + this.s.tags = this.s.custom.oTags; + + /* Button set */ + this.s.buttonSet = this.s.custom.aButtons; + }, + + + /** + * Take the user input arrays and expand them to be fully defined, and then add them to a given + * DOM element + * @method _fnButtonDefinations + * @param {array} buttonSet Set of user defined buttons + * @param {node} wrapper Node to add the created buttons to + * @returns void + * @private + */ + "_fnButtonDefinations": function ( buttonSet, wrapper ) + { + var buttonDef; + + for ( var i=0, iLen=buttonSet.length ; i<iLen ; i++ ) + { + if ( typeof buttonSet[i] == "string" ) + { + if ( typeof TableTools.BUTTONS[ buttonSet[i] ] == 'undefined' ) + { + alert( "TableTools: Warning - unknown button type: "+buttonSet[i] ); + continue; + } + buttonDef = $.extend( {}, TableTools.BUTTONS[ buttonSet[i] ], true ); + } + else + { + if ( typeof TableTools.BUTTONS[ buttonSet[i].sExtends ] == 'undefined' ) + { + alert( "TableTools: Warning - unknown button type: "+buttonSet[i].sExtends ); + continue; + } + var o = $.extend( {}, TableTools.BUTTONS[ buttonSet[i].sExtends ], true ); + buttonDef = $.extend( o, buttonSet[i], true ); + } + + var button = this._fnCreateButton( + buttonDef, + $(wrapper).hasClass(this.classes.collection.container) + ); + + if ( button ) { + wrapper.appendChild( button ); + } + } + }, + + + /** + * Create and configure a TableTools button + * @method _fnCreateButton + * @param {Object} oConfig Button configuration object + * @returns {Node} Button element + * @private + */ + "_fnCreateButton": function ( oConfig, bCollectionButton ) + { + var nButton = this._fnButtonBase( oConfig, bCollectionButton ); + + if ( oConfig.sAction.match(/flash/) ) + { + if ( ! this._fnHasFlash() ) { + return false; + } + + this._fnFlashConfig( nButton, oConfig ); + } + else if ( oConfig.sAction == "text" ) + { + this._fnTextConfig( nButton, oConfig ); + } + else if ( oConfig.sAction == "div" ) + { + this._fnTextConfig( nButton, oConfig ); + } + else if ( oConfig.sAction == "collection" ) + { + this._fnTextConfig( nButton, oConfig ); + this._fnCollectionConfig( nButton, oConfig ); + } + + if ( this.s.dt.iTabIndex !== -1 ) { + $(nButton) + .attr( 'tabindex', this.s.dt.iTabIndex ) + .attr( 'aria-controls', this.s.dt.sTableId ) + .on( 'keyup.DTTT', function (e) { + // Trigger the click event on return key when focused. + // Note that for Flash buttons this has no effect since we + // can't programmatically trigger the Flash export + if ( e.keyCode === 13 ) { + e.stopPropagation(); + + $(this).trigger( 'click' ); + } + } ) + .on( 'mousedown.DTTT', function (e) { + // On mousedown we want to stop the focus occurring on the + // button, focus is used only for the keyboard navigation. + // But using preventDefault for the flash buttons stops the + // flash action. However, it is not the button that gets + // focused but the flash element for flash buttons, so this + // works + if ( ! oConfig.sAction.match(/flash/) ) { + e.preventDefault(); + } + } ); + } + + return nButton; + }, + + + /** + * Create the DOM needed for the button and apply some base properties. All buttons start here + * @method _fnButtonBase + * @param {o} oConfig Button configuration object + * @returns {Node} DIV element for the button + * @private + */ + "_fnButtonBase": function ( o, bCollectionButton ) + { + var sTag, sLiner, sClass; + + if ( bCollectionButton ) + { + sTag = o.sTag && o.sTag !== "default" ? o.sTag : this.s.tags.collection.button; + sLiner = o.sLinerTag && o.sLinerTag !== "default" ? o.sLiner : this.s.tags.collection.liner; + sClass = this.classes.collection.buttons.normal; + } + else + { + sTag = o.sTag && o.sTag !== "default" ? o.sTag : this.s.tags.button; + sLiner = o.sLinerTag && o.sLinerTag !== "default" ? o.sLiner : this.s.tags.liner; + sClass = this.classes.buttons.normal; + } + + var + nButton = document.createElement( sTag ), + nSpan = document.createElement( sLiner ), + masterS = this._fnGetMasterSettings(); + + nButton.className = sClass+" "+o.sButtonClass; + nButton.setAttribute('id', "ToolTables_"+this.s.dt.sInstance+"_"+masterS.buttonCounter ); + nButton.appendChild( nSpan ); + nSpan.innerHTML = o.sButtonText; + + masterS.buttonCounter++; + + return nButton; + }, + + + /** + * Get the settings object for the master instance. When more than one TableTools instance is + * assigned to a DataTable, only one of them can be the 'master' (for the select rows). As such, + * we will typically want to interact with that master for global properties. + * @method _fnGetMasterSettings + * @returns {Object} TableTools settings object + * @private + */ + "_fnGetMasterSettings": function () + { + if ( this.s.master ) + { + return this.s; + } + else + { + /* Look for the master which has the same DT as this one */ + var instances = TableTools._aInstances; + for ( var i=0, iLen=instances.length ; i<iLen ; i++ ) + { + if ( this.dom.table == instances[i].s.dt.nTable ) + { + return instances[i].s; + } + } + } + }, + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Button collection functions + */ + + /** + * Create a collection button, when activated will present a drop down list of other buttons + * @param {Node} nButton Button to use for the collection activation + * @param {Object} oConfig Button configuration object + * @returns void + * @private + */ + "_fnCollectionConfig": function ( nButton, oConfig ) + { + var nHidden = document.createElement( this.s.tags.collection.container ); + nHidden.style.display = "none"; + nHidden.className = this.classes.collection.container; + oConfig._collection = nHidden; + document.body.appendChild( nHidden ); + + this._fnButtonDefinations( oConfig.aButtons, nHidden ); + }, + + + /** + * Show a button collection + * @param {Node} nButton Button to use for the collection + * @param {Object} oConfig Button configuration object + * @returns void + * @private + */ + "_fnCollectionShow": function ( nButton, oConfig ) + { + var + that = this, + oPos = $(nButton).offset(), + nHidden = oConfig._collection, + iDivX = oPos.left, + iDivY = oPos.top + $(nButton).outerHeight(), + iWinHeight = $(window).height(), iDocHeight = $(document).height(), + iWinWidth = $(window).width(), iDocWidth = $(document).width(); + + nHidden.style.position = "absolute"; + nHidden.style.left = iDivX+"px"; + nHidden.style.top = iDivY+"px"; + nHidden.style.display = "block"; + $(nHidden).css('opacity',0); + + var nBackground = document.createElement('div'); + nBackground.style.position = "absolute"; + nBackground.style.left = "0px"; + nBackground.style.top = "0px"; + nBackground.style.height = ((iWinHeight>iDocHeight)? iWinHeight : iDocHeight) +"px"; + nBackground.style.width = ((iWinWidth>iDocWidth)? iWinWidth : iDocWidth) +"px"; + nBackground.className = this.classes.collection.background; + $(nBackground).css('opacity',0); + + document.body.appendChild( nBackground ); + document.body.appendChild( nHidden ); + + /* Visual corrections to try and keep the collection visible */ + var iDivWidth = $(nHidden).outerWidth(); + var iDivHeight = $(nHidden).outerHeight(); + + if ( iDivX + iDivWidth > iDocWidth ) + { + nHidden.style.left = (iDocWidth-iDivWidth)+"px"; + } + + if ( iDivY + iDivHeight > iDocHeight ) + { + nHidden.style.top = (iDivY-iDivHeight-$(nButton).outerHeight())+"px"; + } + + this.dom.collection.collection = nHidden; + this.dom.collection.background = nBackground; + + /* This results in a very small delay for the end user but it allows the animation to be + * much smoother. If you don't want the animation, then the setTimeout can be removed + */ + setTimeout( function () { + $(nHidden).animate({"opacity": 1}, 500); + $(nBackground).animate({"opacity": 0.25}, 500); + }, 10 ); + + /* Resize the buttons to the Flash contents fit */ + this.fnResizeButtons(); + + /* Event handler to remove the collection display */ + $(nBackground).click( function () { + that._fnCollectionHide.call( that, null, null ); + } ); + }, + + + /** + * Hide a button collection + * @param {Node} nButton Button to use for the collection + * @param {Object} oConfig Button configuration object + * @returns void + * @private + */ + "_fnCollectionHide": function ( nButton, oConfig ) + { + if ( oConfig !== null && oConfig.sExtends == 'collection' ) + { + return; + } + + if ( this.dom.collection.collection !== null ) + { + $(this.dom.collection.collection).animate({"opacity": 0}, 500, function (e) { + this.style.display = "none"; + } ); + + $(this.dom.collection.background).animate({"opacity": 0}, 500, function (e) { + this.parentNode.removeChild( this ); + } ); + + this.dom.collection.collection = null; + this.dom.collection.background = null; + } + }, + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Row selection functions + */ + + /** + * Add event handlers to a table to allow for row selection + * @method _fnRowSelectConfig + * @returns void + * @private + */ + "_fnRowSelectConfig": function () + { + if ( this.s.master ) + { + var + that = this, + i, iLen, + dt = this.s.dt, + aoOpenRows = this.s.dt.aoOpenRows; + + $(dt.nTable).addClass( this.classes.select.table ); + + // When using OS style selection, we want to cancel the shift text + // selection, but only when the shift key is used (so you can + // actually still select text in the table) + if ( this.s.select.type === 'os' ) { + $(dt.nTBody).on( 'mousedown.DTTT_Select', 'tr', function(e) { + if ( e.shiftKey ) { + + $(dt.nTBody) + .css( '-moz-user-select', 'none' ) + .one('selectstart.DTTT_Select', 'tr', function () { + return false; + } ); + } + } ); + + $(dt.nTBody).on( 'mouseup.DTTT_Select', 'tr', function(e) { + $(dt.nTBody).css( '-moz-user-select', '' ); + } ); + } + + // Row selection + $(dt.nTBody).on( 'click.DTTT_Select', this.s.custom.sRowSelector, function(e) { + var row = this.nodeName.toLowerCase() === 'tr' ? + this : + $(this).parents('tr')[0]; + + var select = that.s.select; + var pos = that.s.dt.oInstance.fnGetPosition( row ); + + /* Sub-table must be ignored (odd that the selector won't do this with >) */ + if ( row.parentNode != dt.nTBody ) { + return; + } + + /* Check that we are actually working with a DataTables controlled row */ + if ( dt.oInstance.fnGetData(row) === null ) { + return; + } + + // Shift click, ctrl click and simple click handling to make + // row selection a lot like a file system in desktop OSs + if ( select.type == 'os' ) { + if ( e.ctrlKey || e.metaKey ) { + // Add or remove from the selection + if ( that.fnIsSelected( row ) ) { + that._fnRowDeselect( row, e ); + } + else { + that._fnRowSelect( row, e ); + } + } + else if ( e.shiftKey ) { + // Add a range of rows, from the last selected row to + // this one + var rowIdxs = that.s.dt.aiDisplay.slice(); // visible rows + var idx1 = $.inArray( select.lastRow, rowIdxs ); + var idx2 = $.inArray( pos, rowIdxs ); + + if ( that.fnGetSelected().length === 0 || idx1 === -1 ) { + // select from top to here - slightly odd, but both + // Windows and Mac OS do this + rowIdxs.splice( $.inArray( pos, rowIdxs )+1, rowIdxs.length ); + } + else { + // reverse so we can shift click 'up' as well as down + if ( idx1 > idx2 ) { + var tmp = idx2; + idx2 = idx1; + idx1 = tmp; + } + + rowIdxs.splice( idx2+1, rowIdxs.length ); + rowIdxs.splice( 0, idx1 ); + } + + if ( ! that.fnIsSelected( row ) ) { + // Select range + that._fnRowSelect( rowIdxs, e ); + } + else { + // Deselect range - need to keep the clicked on row selected + rowIdxs.splice( $.inArray( pos, rowIdxs ), 1 ); + that._fnRowDeselect( rowIdxs, e ); + } + } + else { + // No cmd or shift click. Deselect current if selected, + // or select this row only + if ( that.fnIsSelected( row ) && that.fnGetSelected().length === 1 ) { + that._fnRowDeselect( row, e ); + } + else { + that.fnSelectNone(); + that._fnRowSelect( row, e ); + } + } + } + else if ( that.fnIsSelected( row ) ) { + that._fnRowDeselect( row, e ); + } + else if ( select.type == "single" ) { + that.fnSelectNone(); + that._fnRowSelect( row, e ); + } + else if ( select.type == "multi" ) { + that._fnRowSelect( row, e ); + } + + select.lastRow = pos; + } );//.on('selectstart', function () { return false; } ); + + // Bind a listener to the DataTable for when new rows are created. + // This allows rows to be visually selected when they should be and + // deferred rendering is used. + dt.oApi._fnCallbackReg( dt, 'aoRowCreatedCallback', function (tr, data, index) { + if ( dt.aoData[index]._DTTT_selected ) { + $(tr).addClass( that.classes.select.row ); + } + }, 'TableTools-SelectAll' ); + } + }, + + /** + * Select rows + * @param {*} src Rows to select - see _fnSelectData for a description of valid inputs + * @private + */ + "_fnRowSelect": function ( src, e ) + { + var + that = this, + data = this._fnSelectData( src ), + firstTr = data.length===0 ? null : data[0].nTr, + anSelected = [], + i, len; + + // Get all the rows that will be selected + for ( i=0, len=data.length ; i<len ; i++ ) + { + if ( data[i].nTr ) + { + anSelected.push( data[i].nTr ); + } + } + + // User defined pre-selection function + if ( this.s.select.preRowSelect !== null && !this.s.select.preRowSelect.call(this, e, anSelected, true) ) + { + return; + } + + // Mark them as selected + for ( i=0, len=data.length ; i<len ; i++ ) + { + data[i]._DTTT_selected = true; + + if ( data[i].nTr ) + { + $(data[i].nTr).addClass( that.classes.select.row ); + } + } + + // Post-selection function + if ( this.s.select.postSelected !== null ) + { + this.s.select.postSelected.call( this, anSelected ); + } + + TableTools._fnEventDispatch( this, 'select', anSelected, true ); + }, + + /** + * Deselect rows + * @param {*} src Rows to deselect - see _fnSelectData for a description of valid inputs + * @private + */ + "_fnRowDeselect": function ( src, e ) + { + var + that = this, + data = this._fnSelectData( src ), + firstTr = data.length===0 ? null : data[0].nTr, + anDeselectedTrs = [], + i, len; + + // Get all the rows that will be deselected + for ( i=0, len=data.length ; i<len ; i++ ) + { + if ( data[i].nTr ) + { + anDeselectedTrs.push( data[i].nTr ); + } + } + + // User defined pre-selection function + if ( this.s.select.preRowSelect !== null && !this.s.select.preRowSelect.call(this, e, anDeselectedTrs, false) ) + { + return; + } + + // Mark them as deselected + for ( i=0, len=data.length ; i<len ; i++ ) + { + data[i]._DTTT_selected = false; + + if ( data[i].nTr ) + { + $(data[i].nTr).removeClass( that.classes.select.row ); + } + } + + // Post-deselection function + if ( this.s.select.postDeselected !== null ) + { + this.s.select.postDeselected.call( this, anDeselectedTrs ); + } + + TableTools._fnEventDispatch( this, 'select', anDeselectedTrs, false ); + }, + + /** + * Take a data source for row selection and convert it into aoData points for the DT + * @param {*} src Can be a single DOM TR node, an array of TR nodes (including a + * a jQuery object), a single aoData point from DataTables, an array of aoData + * points or an array of aoData indexes + * @returns {array} An array of aoData points + */ + "_fnSelectData": function ( src ) + { + var out = [], pos, i, iLen; + + if ( src.nodeName ) + { + // Single node + pos = this.s.dt.oInstance.fnGetPosition( src ); + out.push( this.s.dt.aoData[pos] ); + } + else if ( typeof src.length !== 'undefined' ) + { + // jQuery object or an array of nodes, or aoData points + for ( i=0, iLen=src.length ; i<iLen ; i++ ) + { + if ( src[i].nodeName ) + { + pos = this.s.dt.oInstance.fnGetPosition( src[i] ); + out.push( this.s.dt.aoData[pos] ); + } + else if ( typeof src[i] === 'number' ) + { + out.push( this.s.dt.aoData[ src[i] ] ); + } + else + { + out.push( src[i] ); + } + } + + return out; + } + else if ( typeof src === 'number' ) + { + out.push(this.s.dt.aoData[src]); + } + else + { + // A single aoData point + out.push( src ); + } + + return out; + }, + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Text button functions + */ + + /** + * Configure a text based button for interaction events + * @method _fnTextConfig + * @param {Node} nButton Button element which is being considered + * @param {Object} oConfig Button configuration object + * @returns void + * @private + */ + "_fnTextConfig": function ( nButton, oConfig ) + { + var that = this; + + if ( oConfig.fnInit !== null ) + { + oConfig.fnInit.call( this, nButton, oConfig ); + } + + if ( oConfig.sToolTip !== "" ) + { + nButton.title = oConfig.sToolTip; + } + + $(nButton).hover( function () { + if ( oConfig.fnMouseover !== null ) + { + oConfig.fnMouseover.call( this, nButton, oConfig, null ); + } + }, function () { + if ( oConfig.fnMouseout !== null ) + { + oConfig.fnMouseout.call( this, nButton, oConfig, null ); + } + } ); + + if ( oConfig.fnSelect !== null ) + { + TableTools._fnEventListen( this, 'select', function (n) { + oConfig.fnSelect.call( that, nButton, oConfig, n ); + } ); + } + + $(nButton).click( function (e) { + //e.preventDefault(); + + if ( oConfig.fnClick !== null ) + { + oConfig.fnClick.call( that, nButton, oConfig, null, e ); + } + + /* Provide a complete function to match the behaviour of the flash elements */ + if ( oConfig.fnComplete !== null ) + { + oConfig.fnComplete.call( that, nButton, oConfig, null, null ); + } + + that._fnCollectionHide( nButton, oConfig ); + } ); + }, + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Flash button functions + */ + + /** + * Check if the Flash plug-in is available + * @method _fnHasFlash + * @returns {boolean} `true` if Flash available, `false` otherwise + * @private + */ + "_fnHasFlash": function () + { + try { + var fo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash'); + if (fo) { + return true; + } + } + catch (e) { + if ( + navigator.mimeTypes && + navigator.mimeTypes['application/x-shockwave-flash'] !== undefined && + navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin + ) { + return true; + } + } + + return false; + }, + + + /** + * Configure a flash based button for interaction events + * @method _fnFlashConfig + * @param {Node} nButton Button element which is being considered + * @param {o} oConfig Button configuration object + * @returns void + * @private + */ + "_fnFlashConfig": function ( nButton, oConfig ) + { + var that = this; + var flash = new ZeroClipboard_TableTools.Client(); + + if ( oConfig.fnInit !== null ) + { + oConfig.fnInit.call( this, nButton, oConfig ); + } + + flash.setHandCursor( true ); + + if ( oConfig.sAction == "flash_save" ) + { + flash.setAction( 'save' ); + flash.setCharSet( (oConfig.sCharSet=="utf16le") ? 'UTF16LE' : 'UTF8' ); + flash.setBomInc( oConfig.bBomInc ); + flash.setFileName( oConfig.sFileName.replace('*', this.fnGetTitle(oConfig)) ); + } + else if ( oConfig.sAction == "flash_pdf" ) + { + flash.setAction( 'pdf' ); + flash.setFileName( oConfig.sFileName.replace('*', this.fnGetTitle(oConfig)) ); + } + else + { + flash.setAction( 'copy' ); + } + + flash.addEventListener('mouseOver', function(client) { + if ( oConfig.fnMouseover !== null ) + { + oConfig.fnMouseover.call( that, nButton, oConfig, flash ); + } + } ); + + flash.addEventListener('mouseOut', function(client) { + if ( oConfig.fnMouseout !== null ) + { + oConfig.fnMouseout.call( that, nButton, oConfig, flash ); + } + } ); + + flash.addEventListener('mouseDown', function(client) { + if ( oConfig.fnClick !== null ) + { + oConfig.fnClick.call( that, nButton, oConfig, flash ); + } + } ); + + flash.addEventListener('complete', function (client, text) { + if ( oConfig.fnComplete !== null ) + { + oConfig.fnComplete.call( that, nButton, oConfig, flash, text ); + } + that._fnCollectionHide( nButton, oConfig ); + } ); + + if ( oConfig.fnSelect !== null ) + { + TableTools._fnEventListen( this, 'select', function (n) { + oConfig.fnSelect.call( that, nButton, oConfig, n ); + } ); + } + + this._fnFlashGlue( flash, nButton, oConfig.sToolTip ); + }, + + + /** + * Wait until the id is in the DOM before we "glue" the swf. Note that this function will call + * itself (using setTimeout) until it completes successfully + * @method _fnFlashGlue + * @param {Object} clip Zero clipboard object + * @param {Node} node node to glue swf to + * @param {String} text title of the flash movie + * @returns void + * @private + */ + "_fnFlashGlue": function ( flash, node, text ) + { + var that = this; + var id = node.getAttribute('id'); + + if ( document.getElementById(id) ) + { + flash.glue( node, text ); + } + else + { + setTimeout( function () { + that._fnFlashGlue( flash, node, text ); + }, 100 ); + } + }, + + + /** + * Set the text for the flash clip to deal with + * + * This function is required for large information sets. There is a limit on the + * amount of data that can be transferred between Javascript and Flash in a single call, so + * we use this method to build up the text in Flash by sending over chunks. It is estimated + * that the data limit is around 64k, although it is undocumented, and appears to be different + * between different flash versions. We chunk at 8KiB. + * @method _fnFlashSetText + * @param {Object} clip the ZeroClipboard object + * @param {String} sData the data to be set + * @returns void + * @private + */ + "_fnFlashSetText": function ( clip, sData ) + { + var asData = this._fnChunkData( sData, 8192 ); + + clip.clearText(); + for ( var i=0, iLen=asData.length ; i<iLen ; i++ ) + { + clip.appendText( asData[i] ); + } + }, + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Data retrieval functions + */ + + /** + * Convert the mixed columns variable into a boolean array the same size as the columns, which + * indicates which columns we want to include + * @method _fnColumnTargets + * @param {String|Array} mColumns The columns to be included in data retrieval. If a string + * then it can take the value of "visible" or "hidden" (to include all visible or + * hidden columns respectively). Or an array of column indexes + * @returns {Array} A boolean array the length of the columns of the table, which each value + * indicating if the column is to be included or not + * @private + */ + "_fnColumnTargets": function ( mColumns ) + { + var aColumns = []; + var dt = this.s.dt; + var i, iLen; + var columns = dt.aoColumns; + var columnCount = columns.length; + + if ( typeof mColumns == "function" ) + { + var a = mColumns.call( this, dt ); + + for ( i=0, iLen=columnCount ; i<iLen ; i++ ) + { + aColumns.push( $.inArray( i, a ) !== -1 ? true : false ); + } + } + else if ( typeof mColumns == "object" ) + { + for ( i=0, iLen=columnCount ; i<iLen ; i++ ) + { + aColumns.push( false ); + } + + for ( i=0, iLen=mColumns.length ; i<iLen ; i++ ) + { + aColumns[ mColumns[i] ] = true; + } + } + else if ( mColumns == "visible" ) + { + for ( i=0, iLen=columnCount ; i<iLen ; i++ ) + { + aColumns.push( columns[i].bVisible ? true : false ); + } + } + else if ( mColumns == "hidden" ) + { + for ( i=0, iLen=columnCount ; i<iLen ; i++ ) + { + aColumns.push( columns[i].bVisible ? false : true ); + } + } + else if ( mColumns == "sortable" ) + { + for ( i=0, iLen=columnCount ; i<iLen ; i++ ) + { + aColumns.push( columns[i].bSortable ? true : false ); + } + } + else /* all */ + { + for ( i=0, iLen=columnCount ; i<iLen ; i++ ) + { + aColumns.push( true ); + } + } + + return aColumns; + }, + + + /** + * New line character(s) depend on the platforms + * @method method + * @param {Object} oConfig Button configuration object - only interested in oConfig.sNewLine + * @returns {String} Newline character + */ + "_fnNewline": function ( oConfig ) + { + if ( oConfig.sNewLine == "auto" ) + { + return navigator.userAgent.match(/Windows/) ? "\r\n" : "\n"; + } + else + { + return oConfig.sNewLine; + } + }, + + + /** + * Get data from DataTables' internals and format it for output + * @method _fnGetDataTablesData + * @param {Object} oConfig Button configuration object + * @param {String} oConfig.sFieldBoundary Field boundary for the data cells in the string + * @param {String} oConfig.sFieldSeperator Field separator for the data cells + * @param {String} oConfig.sNewline New line options + * @param {Mixed} oConfig.mColumns Which columns should be included in the output + * @param {Boolean} oConfig.bHeader Include the header + * @param {Boolean} oConfig.bFooter Include the footer + * @param {Boolean} oConfig.bSelectedOnly Include only the selected rows in the output + * @returns {String} Concatenated string of data + * @private + */ + "_fnGetDataTablesData": function ( oConfig ) + { + var i, iLen, j, jLen; + var aRow, aData=[], sLoopData='', arr; + var dt = this.s.dt, tr, child; + var regex = new RegExp(oConfig.sFieldBoundary, "g"); /* Do it here for speed */ + var aColumnsInc = this._fnColumnTargets( oConfig.mColumns ); + var bSelectedOnly = (typeof oConfig.bSelectedOnly != 'undefined') ? oConfig.bSelectedOnly : false; + + /* + * Header + */ + if ( oConfig.bHeader ) + { + aRow = []; + + for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ ) + { + if ( aColumnsInc[i] ) + { + sLoopData = dt.aoColumns[i].sTitle.replace(/\n/g," ").replace( /<.*?>/g, "" ).replace(/^\s+|\s+$/g,""); + sLoopData = this._fnHtmlDecode( sLoopData ); + + aRow.push( this._fnBoundData( sLoopData, oConfig.sFieldBoundary, regex ) ); + } + } + + aData.push( aRow.join(oConfig.sFieldSeperator) ); + } + + bSelectedOnly = true; + + /* + * Body + */ + var aDataIndex; + var aSelected = this.fnGetSelectedIndexes(); + bSelectedOnly = this.s.select.type !== "none" && bSelectedOnly && aSelected.length !== 0; + + if ( bSelectedOnly ) { + // Use the selected indexes + aDataIndex = aSelected; + } + else if ( DataTable.Api ) { + // 1.10+ style + aDataIndex = new DataTable.Api( dt ) + .rows( oConfig.oSelectorOpts ) + .indexes() + .flatten() + .toArray(); + } + else { + // 1.9- style + aDataIndex = dt.oInstance + .$('tr', oConfig.oSelectorOpts) + .map( function (id, row) { + return dt.oInstance.fnGetPosition( row ); + } ) + .get(); + } + + for ( j=0, jLen=aDataIndex.length ; j<jLen ; j++ ) + { + tr = dt.aoData[ aDataIndex[j] ].nTr; + aRow = []; + + /* Columns */ + for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ ) + { + if ( aColumnsInc[i] ) + { + /* Convert to strings (with small optimisation) */ + var mTypeData = dt.oApi._fnGetCellData( dt, aDataIndex[j], i, 'display' ); + if ( oConfig.fnCellRender ) + { + sLoopData = oConfig.fnCellRender( mTypeData, i, tr, aDataIndex[j] )+""; + } + else if ( typeof mTypeData == "string" ) + { + /* Strip newlines, replace img tags with alt attr. and finally strip html... */ + sLoopData = mTypeData.replace(/\n/g," "); + sLoopData = + sLoopData.replace(/<img.*?\s+alt\s*=\s*(?:"([^"]+)"|'([^']+)'|([^\s>]+)).*?>/gi, + '$1$2$3'); + sLoopData = sLoopData.replace( /<.*?>/g, "" ); + } + else + { + sLoopData = mTypeData+""; + } + + /* Trim and clean the data */ + sLoopData = sLoopData.replace(/^\s+/, '').replace(/\s+$/, ''); + sLoopData = this._fnHtmlDecode( sLoopData ); + + /* Bound it and add it to the total data */ + aRow.push( this._fnBoundData( sLoopData, oConfig.sFieldBoundary, regex ) ); + } + } + + aData.push( aRow.join(oConfig.sFieldSeperator) ); + + /* Details rows from fnOpen */ + if ( oConfig.bOpenRows ) + { + arr = $.grep(dt.aoOpenRows, function(o) { return o.nParent === tr; }); + + if ( arr.length === 1 ) + { + sLoopData = this._fnBoundData( $('td', arr[0].nTr).html(), oConfig.sFieldBoundary, regex ); + aData.push( sLoopData ); + } + } + } + + /* + * Footer + */ + if ( oConfig.bFooter && dt.nTFoot !== null ) + { + aRow = []; + + for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ ) + { + if ( aColumnsInc[i] && dt.aoColumns[i].nTf !== null ) + { + sLoopData = dt.aoColumns[i].nTf.innerHTML.replace(/\n/g," ").replace( /<.*?>/g, "" ); + sLoopData = this._fnHtmlDecode( sLoopData ); + + aRow.push( this._fnBoundData( sLoopData, oConfig.sFieldBoundary, regex ) ); + } + } + + aData.push( aRow.join(oConfig.sFieldSeperator) ); + } + + var _sLastData = aData.join( this._fnNewline(oConfig) ); + return _sLastData; + }, + + + /** + * Wrap data up with a boundary string + * @method _fnBoundData + * @param {String} sData data to bound + * @param {String} sBoundary bounding char(s) + * @param {RegExp} regex search for the bounding chars - constructed outside for efficiency + * in the loop + * @returns {String} bound data + * @private + */ + "_fnBoundData": function ( sData, sBoundary, regex ) + { + if ( sBoundary === "" ) + { + return sData; + } + else + { + return sBoundary + sData.replace(regex, sBoundary+sBoundary) + sBoundary; + } + }, + + + /** + * Break a string up into an array of smaller strings + * @method _fnChunkData + * @param {String} sData data to be broken up + * @param {Int} iSize chunk size + * @returns {Array} String array of broken up text + * @private + */ + "_fnChunkData": function ( sData, iSize ) + { + var asReturn = []; + var iStrlen = sData.length; + + for ( var i=0 ; i<iStrlen ; i+=iSize ) + { + if ( i+iSize < iStrlen ) + { + asReturn.push( sData.substring( i, i+iSize ) ); + } + else + { + asReturn.push( sData.substring( i, iStrlen ) ); + } + } + + return asReturn; + }, + + + /** + * Decode HTML entities + * @method _fnHtmlDecode + * @param {String} sData encoded string + * @returns {String} decoded string + * @private + */ + "_fnHtmlDecode": function ( sData ) + { + if ( sData.indexOf('&') === -1 ) + { + return sData; + } + + var n = document.createElement('div'); + + return sData.replace( /&([^\s]*?);/g, function( match, match2 ) { + if ( match.substr(1, 1) === '#' ) + { + return String.fromCharCode( Number(match2.substr(1)) ); + } + else + { + n.innerHTML = match; + return n.childNodes[0].nodeValue; + } + } ); + }, + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Printing functions + */ + + /** + * Show print display + * @method _fnPrintStart + * @param {Event} e Event object + * @param {Object} oConfig Button configuration object + * @returns void + * @private + */ + "_fnPrintStart": function ( oConfig ) + { + var that = this; + var oSetDT = this.s.dt; + + /* Parse through the DOM hiding everything that isn't needed for the table */ + this._fnPrintHideNodes( oSetDT.nTable ); + + /* Show the whole table */ + this.s.print.saveStart = oSetDT._iDisplayStart; + this.s.print.saveLength = oSetDT._iDisplayLength; + + if ( oConfig.bShowAll ) + { + oSetDT._iDisplayStart = 0; + oSetDT._iDisplayLength = -1; + if ( oSetDT.oApi._fnCalculateEnd ) { + oSetDT.oApi._fnCalculateEnd( oSetDT ); + } + oSetDT.oApi._fnDraw( oSetDT ); + } + + /* Adjust the display for scrolling which might be done by DataTables */ + if ( oSetDT.oScroll.sX !== "" || oSetDT.oScroll.sY !== "" ) + { + this._fnPrintScrollStart( oSetDT ); + + // If the table redraws while in print view, the DataTables scrolling + // setup would hide the header, so we need to readd it on draw + $(this.s.dt.nTable).bind('draw.DTTT_Print', function () { + that._fnPrintScrollStart( oSetDT ); + } ); + } + + /* Remove the other DataTables feature nodes - but leave the table! and info div */ + var anFeature = oSetDT.aanFeatures; + for ( var cFeature in anFeature ) + { + if ( cFeature != 'i' && cFeature != 't' && cFeature.length == 1 ) + { + for ( var i=0, iLen=anFeature[cFeature].length ; i<iLen ; i++ ) + { + this.dom.print.hidden.push( { + "node": anFeature[cFeature][i], + "display": "block" + } ); + anFeature[cFeature][i].style.display = "none"; + } + } + } + + /* Print class can be used for styling */ + $(document.body).addClass( this.classes.print.body ); + + /* Show information message to let the user know what is happening */ + if ( oConfig.sInfo !== "" ) + { + this.fnInfo( oConfig.sInfo, 3000 ); + } + + /* Add a message at the top of the page */ + if ( oConfig.sMessage ) + { + $('<div/>') + .addClass( this.classes.print.message ) + .html( oConfig.sMessage ) + .prependTo( 'body' ); + } + + /* Cache the scrolling and the jump to the top of the page */ + this.s.print.saveScroll = $(window).scrollTop(); + window.scrollTo( 0, 0 ); + + /* Bind a key event listener to the document for the escape key - + * it is removed in the callback + */ + $(document).bind( "keydown.DTTT", function(e) { + /* Only interested in the escape key */ + if ( e.keyCode == 27 ) + { + e.preventDefault(); + that._fnPrintEnd.call( that, e ); + } + } ); + }, + + + /** + * Printing is finished, resume normal display + * @method _fnPrintEnd + * @param {Event} e Event object + * @returns void + * @private + */ + "_fnPrintEnd": function ( e ) + { + var that = this; + var oSetDT = this.s.dt; + var oSetPrint = this.s.print; + var oDomPrint = this.dom.print; + + /* Show all hidden nodes */ + this._fnPrintShowNodes(); + + /* Restore DataTables' scrolling */ + if ( oSetDT.oScroll.sX !== "" || oSetDT.oScroll.sY !== "" ) + { + $(this.s.dt.nTable).unbind('draw.DTTT_Print'); + + this._fnPrintScrollEnd(); + } + + /* Restore the scroll */ + window.scrollTo( 0, oSetPrint.saveScroll ); + + /* Drop the print message */ + $('div.'+this.classes.print.message).remove(); + + /* Styling class */ + $(document.body).removeClass( 'DTTT_Print' ); + + /* Restore the table length */ + oSetDT._iDisplayStart = oSetPrint.saveStart; + oSetDT._iDisplayLength = oSetPrint.saveLength; + if ( oSetDT.oApi._fnCalculateEnd ) { + oSetDT.oApi._fnCalculateEnd( oSetDT ); + } + oSetDT.oApi._fnDraw( oSetDT ); + + $(document).unbind( "keydown.DTTT" ); + }, + + + /** + * Take account of scrolling in DataTables by showing the full table + * @returns void + * @private + */ + "_fnPrintScrollStart": function () + { + var + oSetDT = this.s.dt, + nScrollHeadInner = oSetDT.nScrollHead.getElementsByTagName('div')[0], + nScrollHeadTable = nScrollHeadInner.getElementsByTagName('table')[0], + nScrollBody = oSetDT.nTable.parentNode, + nTheadSize, nTfootSize; + + /* Copy the header in the thead in the body table, this way we show one single table when + * in print view. Note that this section of code is more or less verbatim from DT 1.7.0 + */ + nTheadSize = oSetDT.nTable.getElementsByTagName('thead'); + if ( nTheadSize.length > 0 ) + { + oSetDT.nTable.removeChild( nTheadSize[0] ); + } + + if ( oSetDT.nTFoot !== null ) + { + nTfootSize = oSetDT.nTable.getElementsByTagName('tfoot'); + if ( nTfootSize.length > 0 ) + { + oSetDT.nTable.removeChild( nTfootSize[0] ); + } + } + + nTheadSize = oSetDT.nTHead.cloneNode(true); + oSetDT.nTable.insertBefore( nTheadSize, oSetDT.nTable.childNodes[0] ); + + if ( oSetDT.nTFoot !== null ) + { + nTfootSize = oSetDT.nTFoot.cloneNode(true); + oSetDT.nTable.insertBefore( nTfootSize, oSetDT.nTable.childNodes[1] ); + } + + /* Now adjust the table's viewport so we can actually see it */ + if ( oSetDT.oScroll.sX !== "" ) + { + oSetDT.nTable.style.width = $(oSetDT.nTable).outerWidth()+"px"; + nScrollBody.style.width = $(oSetDT.nTable).outerWidth()+"px"; + nScrollBody.style.overflow = "visible"; + } + + if ( oSetDT.oScroll.sY !== "" ) + { + nScrollBody.style.height = $(oSetDT.nTable).outerHeight()+"px"; + nScrollBody.style.overflow = "visible"; + } + }, + + + /** + * Take account of scrolling in DataTables by showing the full table. Note that the redraw of + * the DataTable that we do will actually deal with the majority of the hard work here + * @returns void + * @private + */ + "_fnPrintScrollEnd": function () + { + var + oSetDT = this.s.dt, + nScrollBody = oSetDT.nTable.parentNode; + + if ( oSetDT.oScroll.sX !== "" ) + { + nScrollBody.style.width = oSetDT.oApi._fnStringToCss( oSetDT.oScroll.sX ); + nScrollBody.style.overflow = "auto"; + } + + if ( oSetDT.oScroll.sY !== "" ) + { + nScrollBody.style.height = oSetDT.oApi._fnStringToCss( oSetDT.oScroll.sY ); + nScrollBody.style.overflow = "auto"; + } + }, + + + /** + * Resume the display of all TableTools hidden nodes + * @method _fnPrintShowNodes + * @returns void + * @private + */ + "_fnPrintShowNodes": function ( ) + { + var anHidden = this.dom.print.hidden; + + for ( var i=0, iLen=anHidden.length ; i<iLen ; i++ ) + { + anHidden[i].node.style.display = anHidden[i].display; + } + anHidden.splice( 0, anHidden.length ); + }, + + + /** + * Hide nodes which are not needed in order to display the table. Note that this function is + * recursive + * @method _fnPrintHideNodes + * @param {Node} nNode Element which should be showing in a 'print' display + * @returns void + * @private + */ + "_fnPrintHideNodes": function ( nNode ) + { + var anHidden = this.dom.print.hidden; + + var nParent = nNode.parentNode; + var nChildren = nParent.childNodes; + for ( var i=0, iLen=nChildren.length ; i<iLen ; i++ ) + { + if ( nChildren[i] != nNode && nChildren[i].nodeType == 1 ) + { + /* If our node is shown (don't want to show nodes which were previously hidden) */ + var sDisplay = $(nChildren[i]).css("display"); + if ( sDisplay != "none" ) + { + /* Cache the node and it's previous state so we can restore it */ + anHidden.push( { + "node": nChildren[i], + "display": sDisplay + } ); + nChildren[i].style.display = "none"; + } + } + } + + if ( nParent.nodeName.toUpperCase() != "BODY" ) + { + this._fnPrintHideNodes( nParent ); + } + } +}; + + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Static variables + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** + * Store of all instances that have been created of TableTools, so one can look up other (when + * there is need of a master) + * @property _aInstances + * @type Array + * @default [] + * @private + */ +TableTools._aInstances = []; + + +/** + * Store of all listeners and their callback functions + * @property _aListeners + * @type Array + * @default [] + */ +TableTools._aListeners = []; + + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Static methods + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/** + * Get an array of all the master instances + * @method fnGetMasters + * @returns {Array} List of master TableTools instances + * @static + */ +TableTools.fnGetMasters = function () +{ + var a = []; + for ( var i=0, iLen=TableTools._aInstances.length ; i<iLen ; i++ ) + { + if ( TableTools._aInstances[i].s.master ) + { + a.push( TableTools._aInstances[i] ); + } + } + return a; +}; + +/** + * Get the master instance for a table node (or id if a string is given) + * @method fnGetInstance + * @returns {Object} ID of table OR table node, for which we want the TableTools instance + * @static + */ +TableTools.fnGetInstance = function ( node ) +{ + if ( typeof node != 'object' ) + { + node = document.getElementById(node); + } + + for ( var i=0, iLen=TableTools._aInstances.length ; i<iLen ; i++ ) + { + if ( TableTools._aInstances[i].s.master && TableTools._aInstances[i].dom.table == node ) + { + return TableTools._aInstances[i]; + } + } + return null; +}; + + +/** + * Add a listener for a specific event + * @method _fnEventListen + * @param {Object} that Scope of the listening function (i.e. 'this' in the caller) + * @param {String} type Event type + * @param {Function} fn Function + * @returns void + * @private + * @static + */ +TableTools._fnEventListen = function ( that, type, fn ) +{ + TableTools._aListeners.push( { + "that": that, + "type": type, + "fn": fn + } ); +}; + + +/** + * An event has occurred - look up every listener and fire it off. We check that the event we are + * going to fire is attached to the same table (using the table node as reference) before firing + * @method _fnEventDispatch + * @param {Object} that Scope of the listening function (i.e. 'this' in the caller) + * @param {String} type Event type + * @param {Node} node Element that the event occurred on (may be null) + * @param {boolean} [selected] Indicate if the node was selected (true) or deselected (false) + * @returns void + * @private + * @static + */ +TableTools._fnEventDispatch = function ( that, type, node, selected ) +{ + var listeners = TableTools._aListeners; + for ( var i=0, iLen=listeners.length ; i<iLen ; i++ ) + { + if ( that.dom.table == listeners[i].that.dom.table && listeners[i].type == type ) + { + listeners[i].fn( node, selected ); + } + } +}; + + + + + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Constants + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + + +TableTools.buttonBase = { + // Button base + "sAction": "text", + "sTag": "default", + "sLinerTag": "default", + "sButtonClass": "DTTT_button_text", + "sButtonText": "Button text", + "sTitle": "", + "sToolTip": "", + + // Common button specific options + "sCharSet": "utf8", + "bBomInc": false, + "sFileName": "*.csv", + "sFieldBoundary": "", + "sFieldSeperator": "\t", + "sNewLine": "auto", + "mColumns": "all", /* "all", "visible", "hidden" or array of column integers */ + "bHeader": true, + "bFooter": true, + "bOpenRows": false, + "bSelectedOnly": false, + "oSelectorOpts": undefined, // See http://datatables.net/docs/DataTables/1.9.4/#$ for full options + + // Callbacks + "fnMouseover": null, + "fnMouseout": null, + "fnClick": null, + "fnSelect": null, + "fnComplete": null, + "fnInit": null, + "fnCellRender": null +}; + + +/** + * @namespace Default button configurations + */ +TableTools.BUTTONS = { + "csv": $.extend( {}, TableTools.buttonBase, { + "sAction": "flash_save", + "sButtonClass": "DTTT_button_csv", + "sButtonText": "CSV", + "sFieldBoundary": '"', + "sFieldSeperator": ",", + "fnClick": function( nButton, oConfig, flash ) { + this.fnSetText( flash, this.fnGetTableData(oConfig) ); + } + } ), + + "xls": $.extend( {}, TableTools.buttonBase, { + "sAction": "flash_save", + "sCharSet": "utf16le", + "bBomInc": true, + "sButtonClass": "DTTT_button_xls", + "sButtonText": "Excel", + "fnClick": function( nButton, oConfig, flash ) { + this.fnSetText( flash, this.fnGetTableData(oConfig) ); + } + } ), + + "copy": $.extend( {}, TableTools.buttonBase, { + "sAction": "flash_copy", + "sButtonClass": "DTTT_button_copy", + "sButtonText": "Copy", + "fnClick": function( nButton, oConfig, flash ) { + this.fnSetText( flash, this.fnGetTableData(oConfig) ); + }, + "fnComplete": function(nButton, oConfig, flash, text) { + var lines = text.split('\n').length; + if (oConfig.bHeader) lines--; + if (this.s.dt.nTFoot !== null && oConfig.bFooter) lines--; + var plural = (lines==1) ? "" : "s"; + this.fnInfo( '<h6>Table copied</h6>'+ + '<p>Copied '+lines+' row'+plural+' to the clipboard.</p>', + 1500 + ); + } + } ), + + "pdf": $.extend( {}, TableTools.buttonBase, { + "sAction": "flash_pdf", + "sNewLine": "\n", + "sFileName": "*.pdf", + "sButtonClass": "DTTT_button_pdf", + "sButtonText": "PDF", + "sPdfOrientation": "portrait", + "sPdfSize": "A4", + "sPdfMessage": "", + "fnClick": function( nButton, oConfig, flash ) { + this.fnSetText( flash, + "title:"+ this.fnGetTitle(oConfig) +"\n"+ + "message:"+ oConfig.sPdfMessage +"\n"+ + "colWidth:"+ this.fnCalcColRatios(oConfig) +"\n"+ + "orientation:"+ oConfig.sPdfOrientation +"\n"+ + "size:"+ oConfig.sPdfSize +"\n"+ + "--/TableToolsOpts--\n" + + this.fnGetTableData(oConfig) + ); + } + } ), + + "print": $.extend( {}, TableTools.buttonBase, { + "sInfo": "<h6>Print view</h6><p>Please use your browser's print function to "+ + "print this table. Press escape when finished.</p>", + "sMessage": null, + "bShowAll": true, + "sToolTip": "View print view", + "sButtonClass": "DTTT_button_print", + "sButtonText": "Print", + "fnClick": function ( nButton, oConfig ) { + this.fnPrint( true, oConfig ); + } + } ), + + "text": $.extend( {}, TableTools.buttonBase ), + + "select": $.extend( {}, TableTools.buttonBase, { + "sButtonText": "Select button", + "fnSelect": function( nButton, oConfig ) { + if ( this.fnGetSelected().length !== 0 ) { + $(nButton).removeClass( this.classes.buttons.disabled ); + } else { + $(nButton).addClass( this.classes.buttons.disabled ); + } + }, + "fnInit": function( nButton, oConfig ) { + $(nButton).addClass( this.classes.buttons.disabled ); + } + } ), + + "select_single": $.extend( {}, TableTools.buttonBase, { + "sButtonText": "Select button", + "fnSelect": function( nButton, oConfig ) { + var iSelected = this.fnGetSelected().length; + if ( iSelected == 1 ) { + $(nButton).removeClass( this.classes.buttons.disabled ); + } else { + $(nButton).addClass( this.classes.buttons.disabled ); + } + }, + "fnInit": function( nButton, oConfig ) { + $(nButton).addClass( this.classes.buttons.disabled ); + } + } ), + + "select_all": $.extend( {}, TableTools.buttonBase, { + "sButtonText": "Select all", + "fnClick": function( nButton, oConfig ) { + this.fnSelectAll(); + }, + "fnSelect": function( nButton, oConfig ) { + if ( this.fnGetSelected().length == this.s.dt.fnRecordsDisplay() ) { + $(nButton).addClass( this.classes.buttons.disabled ); + } else { + $(nButton).removeClass( this.classes.buttons.disabled ); + } + } + } ), + + "select_none": $.extend( {}, TableTools.buttonBase, { + "sButtonText": "Deselect all", + "fnClick": function( nButton, oConfig ) { + this.fnSelectNone(); + }, + "fnSelect": function( nButton, oConfig ) { + if ( this.fnGetSelected().length !== 0 ) { + $(nButton).removeClass( this.classes.buttons.disabled ); + } else { + $(nButton).addClass( this.classes.buttons.disabled ); + } + }, + "fnInit": function( nButton, oConfig ) { + $(nButton).addClass( this.classes.buttons.disabled ); + } + } ), + + "ajax": $.extend( {}, TableTools.buttonBase, { + "sAjaxUrl": "/xhr.php", + "sButtonText": "Ajax button", + "fnClick": function( nButton, oConfig ) { + var sData = this.fnGetTableData(oConfig); + $.ajax( { + "url": oConfig.sAjaxUrl, + "data": [ + { "name": "tableData", "value": sData } + ], + "success": oConfig.fnAjaxComplete, + "dataType": "json", + "type": "POST", + "cache": false, + "error": function () { + alert( "Error detected when sending table data to server" ); + } + } ); + }, + "fnAjaxComplete": function( json ) { + alert( 'Ajax complete' ); + } + } ), + + "div": $.extend( {}, TableTools.buttonBase, { + "sAction": "div", + "sTag": "div", + "sButtonClass": "DTTT_nonbutton", + "sButtonText": "Text button" + } ), + + "collection": $.extend( {}, TableTools.buttonBase, { + "sAction": "collection", + "sButtonClass": "DTTT_button_collection", + "sButtonText": "Collection", + "fnClick": function( nButton, oConfig ) { + this._fnCollectionShow(nButton, oConfig); + } + } ) +}; +/* + * on* callback parameters: + * 1. node - button element + * 2. object - configuration object for this button + * 3. object - ZeroClipboard reference (flash button only) + * 4. string - Returned string from Flash (flash button only - and only on 'complete') + */ + +// Alias to match the other plug-ins styling +TableTools.buttons = TableTools.BUTTONS; + + +/** + * @namespace Classes used by TableTools - allows the styles to be override easily. + * Note that when TableTools initialises it will take a copy of the classes object + * and will use its internal copy for the remainder of its run time. + */ +TableTools.classes = { + "container": "DTTT_container", + "buttons": { + "normal": "DTTT_button", + "disabled": "DTTT_disabled" + }, + "collection": { + "container": "DTTT_collection", + "background": "DTTT_collection_background", + "buttons": { + "normal": "DTTT_button", + "disabled": "DTTT_disabled" + } + }, + "select": { + "table": "DTTT_selectable", + "row": "DTTT_selected selected" + }, + "print": { + "body": "DTTT_Print", + "info": "DTTT_print_info", + "message": "DTTT_PrintMessage" + } +}; + + +/** + * @namespace ThemeRoller classes - built in for compatibility with DataTables' + * bJQueryUI option. + */ +TableTools.classes_themeroller = { + "container": "DTTT_container ui-buttonset ui-buttonset-multi", + "buttons": { + "normal": "DTTT_button ui-button ui-state-default" + }, + "collection": { + "container": "DTTT_collection ui-buttonset ui-buttonset-multi" + } +}; + + +/** + * @namespace TableTools default settings for initialisation + */ +TableTools.DEFAULTS = { + "sSwfPath": "../swf/copy_csv_xls_pdf.swf", + "sRowSelect": "none", + "sRowSelector": "tr", + "sSelectedClass": null, + "fnPreRowSelect": null, + "fnRowSelected": null, + "fnRowDeselected": null, + "aButtons": [ "copy", "csv", "xls", "pdf", "print" ], + "oTags": { + "container": "div", + "button": "a", // We really want to use buttons here, but Firefox and IE ignore the + // click on the Flash element in the button (but not mouse[in|out]). + "liner": "span", + "collection": { + "container": "div", + "button": "a", + "liner": "span" + } + } +}; + +// Alias to match the other plug-ins +TableTools.defaults = TableTools.DEFAULTS; + + +/** + * Name of this class + * @constant CLASS + * @type String + * @default TableTools + */ +TableTools.prototype.CLASS = "TableTools"; + + +/** + * TableTools version + * @constant VERSION + * @type String + * @default See code + */ +TableTools.version = "2.2.4"; + + + +// DataTables 1.10 API +// +// This will be extended in a big way in in TableTools 3 to provide API methods +// such as rows().select() and rows.selected() etc, but for the moment the +// tabletools() method simply returns the instance. + +if ( $.fn.dataTable.Api ) { + $.fn.dataTable.Api.register( 'tabletools()', function () { + var tt = null; + + if ( this.context.length > 0 ) { + tt = TableTools.fnGetInstance( this.context[0].nTable ); + } + + return tt; + } ); +} + + + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Initialisation + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Register a new feature with DataTables + */ +if ( typeof $.fn.dataTable == "function" && + typeof $.fn.dataTableExt.fnVersionCheck == "function" && + $.fn.dataTableExt.fnVersionCheck('1.9.0') ) +{ + $.fn.dataTableExt.aoFeatures.push( { + "fnInit": function( oDTSettings ) { + var init = oDTSettings.oInit; + var opts = init ? + init.tableTools || init.oTableTools || {} : + {}; + + return new TableTools( oDTSettings.oInstance, opts ).dom.container; + }, + "cFeature": "T", + "sFeature": "TableTools" + } ); +} +else +{ + alert( "Warning: TableTools requires DataTables 1.9.0 or newer - www.datatables.net/download"); +} + +$.fn.DataTable.TableTools = TableTools; + +})(jQuery, window, document); + +/* + * Register a new feature with DataTables + */ +if ( typeof $.fn.dataTable == "function" && + typeof $.fn.dataTableExt.fnVersionCheck == "function" && + $.fn.dataTableExt.fnVersionCheck('1.9.0') ) +{ + $.fn.dataTableExt.aoFeatures.push( { + "fnInit": function( oDTSettings ) { + var oOpts = typeof oDTSettings.oInit.oTableTools != 'undefined' ? + oDTSettings.oInit.oTableTools : {}; + + var oTT = new TableTools( oDTSettings.oInstance, oOpts ); + TableTools._aInstances.push( oTT ); + + return oTT.dom.container; + }, + "cFeature": "T", + "sFeature": "TableTools" + } ); +} +else +{ + alert( "Warning: TableTools 2 requires DataTables 1.9.0 or newer - www.datatables.net/download"); +} + + +$.fn.dataTable.TableTools = TableTools; +$.fn.DataTable.TableTools = TableTools; + + +return TableTools; +}; // /factory + + +// Define as an AMD module if possible +if ( typeof define === 'function' && define.amd ) { + define( ['jquery', 'datatables'], factory ); +} +else if ( typeof exports === 'object' ) { + // Node/CommonJS + factory( require('jquery'), require('datatables') ); +} +else if ( jQuery && !jQuery.fn.dataTable.TableTools ) { + // Otherwise simply initialise as normal, stopping multiple evaluation + factory( jQuery, jQuery.fn.dataTable ); +} + + +})(window, document); + diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/js/dataTables.tableTools.min.js b/theme/bootstrap/plugins/datatables/extensions/TableTools/js/dataTables.tableTools.min.js new file mode 100644 index 0000000..e8c8705 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/extensions/TableTools/js/dataTables.tableTools.min.js @@ -0,0 +1,70 @@ +/*! + TableTools 2.2.4 + 2009-2015 SpryMedia Ltd - datatables.net/license + + ZeroClipboard 1.0.4 + Author: Joseph Huckaby - MIT licensed +*/ +var TableTools; +(function(n,k,q){var p=function(m,p){var g={version:"1.0.4-TableTools2",clients:{},moviePath:"",nextId:1,$:function(a){"string"==typeof a&&(a=k.getElementById(a));a.addClass||(a.hide=function(){this.style.display="none"},a.show=function(){this.style.display=""},a.addClass=function(a){this.removeClass(a);this.className+=" "+a},a.removeClass=function(a){this.className=this.className.replace(RegExp("\\s*"+a+"\\s*")," ").replace(/^\s+/,"").replace(/\s+$/,"")},a.hasClass=function(a){return!!this.className.match(RegExp("\\s*"+a+ +"\\s*"))});return a},setMoviePath:function(a){this.moviePath=a},dispatch:function(a,b,c){(a=this.clients[a])&&a.receiveEvent(b,c)},register:function(a,b){this.clients[a]=b},getDOMObjectPosition:function(a){var b={left:0,top:0,width:a.width?a.width:a.offsetWidth,height:a.height?a.height:a.offsetHeight};""!==a.style.width&&(b.width=a.style.width.replace("px",""));""!==a.style.height&&(b.height=a.style.height.replace("px",""));for(;a;)b.left+=a.offsetLeft,b.top+=a.offsetTop,a=a.offsetParent;return b}, +Client:function(a){this.handlers={};this.id=g.nextId++;this.movieId="ZeroClipboard_TableToolsMovie_"+this.id;g.register(this.id,this);a&&this.glue(a)}};g.Client.prototype={id:0,ready:!1,movie:null,clipText:"",fileName:"",action:"copy",handCursorEnabled:!0,cssEffects:!0,handlers:null,sized:!1,glue:function(a,b){this.domElement=g.$(a);var c=99;this.domElement.style.zIndex&&(c=parseInt(this.domElement.style.zIndex,10)+1);var d=g.getDOMObjectPosition(this.domElement);this.div=k.createElement("div");var f= +this.div.style;f.position="absolute";f.left="0px";f.top="0px";f.width=d.width+"px";f.height=d.height+"px";f.zIndex=c;"undefined"!=typeof b&&""!==b&&(this.div.title=b);0!==d.width&&0!==d.height&&(this.sized=!0);this.domElement&&(this.domElement.appendChild(this.div),this.div.innerHTML=this.getHTML(d.width,d.height).replace(/&/g,"&amp;"))},positionElement:function(){var a=g.getDOMObjectPosition(this.domElement),b=this.div.style;b.position="absolute";b.width=a.width+"px";b.height=a.height+"px";0!==a.width&& +0!==a.height&&(this.sized=!0,b=this.div.childNodes[0],b.width=a.width,b.height=a.height)},getHTML:function(a,b){var c="",d="id="+this.id+"&width="+a+"&height="+b;if(navigator.userAgent.match(/MSIE/))var f=location.href.match(/^https/i)?"https://":"http://",c=c+('<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="'+f+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" width="'+a+'" height="'+b+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ +g.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+d+'"/><param name="wmode" value="transparent"/></object>');else c+='<embed id="'+this.movieId+'" src="'+g.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+a+'" height="'+b+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+ +d+'" wmode="transparent" />';return c},hide:function(){this.div&&(this.div.style.left="-2000px")},show:function(){this.reposition()},destroy:function(){if(this.domElement&&this.div){this.hide();this.div.innerHTML="";var a=k.getElementsByTagName("body")[0];try{a.removeChild(this.div)}catch(b){}this.div=this.domElement=null}},reposition:function(a){a&&((this.domElement=g.$(a))||this.hide());if(this.domElement&&this.div){var a=g.getDOMObjectPosition(this.domElement),b=this.div.style;b.left=""+a.left+ +"px";b.top=""+a.top+"px"}},clearText:function(){this.clipText="";this.ready&&this.movie.clearText()},appendText:function(a){this.clipText+=a;this.ready&&this.movie.appendText(a)},setText:function(a){this.clipText=a;this.ready&&this.movie.setText(a)},setCharSet:function(a){this.charSet=a;this.ready&&this.movie.setCharSet(a)},setBomInc:function(a){this.incBom=a;this.ready&&this.movie.setBomInc(a)},setFileName:function(a){this.fileName=a;this.ready&&this.movie.setFileName(a)},setAction:function(a){this.action= +a;this.ready&&this.movie.setAction(a)},addEventListener:function(a,b){a=a.toString().toLowerCase().replace(/^on/,"");this.handlers[a]||(this.handlers[a]=[]);this.handlers[a].push(b)},setHandCursor:function(a){this.handCursorEnabled=a;this.ready&&this.movie.setHandCursor(a)},setCSSEffects:function(a){this.cssEffects=!!a},receiveEvent:function(a,b){var c,a=a.toString().toLowerCase().replace(/^on/,"");switch(a){case "load":this.movie=k.getElementById(this.movieId);if(!this.movie){c=this;setTimeout(function(){c.receiveEvent("load", +null)},1);return}if(!this.ready&&navigator.userAgent.match(/Firefox/)&&navigator.userAgent.match(/Windows/)){c=this;setTimeout(function(){c.receiveEvent("load",null)},100);this.ready=!0;return}this.ready=!0;this.movie.clearText();this.movie.appendText(this.clipText);this.movie.setFileName(this.fileName);this.movie.setAction(this.action);this.movie.setCharSet(this.charSet);this.movie.setBomInc(this.incBom);this.movie.setHandCursor(this.handCursorEnabled);break;case "mouseover":this.domElement&&this.cssEffects&& +this.recoverActive&&this.domElement.addClass("active");break;case "mouseout":this.domElement&&this.cssEffects&&(this.recoverActive=!1,this.domElement.hasClass("active")&&(this.domElement.removeClass("active"),this.recoverActive=!0));break;case "mousedown":this.domElement&&this.cssEffects&&this.domElement.addClass("active");break;case "mouseup":this.domElement&&this.cssEffects&&(this.domElement.removeClass("active"),this.recoverActive=!1)}if(this.handlers[a])for(var d=0,f=this.handlers[a].length;d< +f;d++){var e=this.handlers[a][d];if("function"==typeof e)e(this,b);else if("object"==typeof e&&2==e.length)e[0][e[1]](this,b);else if("string"==typeof e)n[e](this,b)}}};n.ZeroClipboard_TableTools=g;var e=jQuery;TableTools=function(a,b){!this instanceof TableTools&&alert("Warning: TableTools must be initialised with the keyword 'new'");this.s={that:this,dt:e.fn.dataTable.Api?(new e.fn.dataTable.Api(a)).settings()[0]:a.fnSettings(),print:{saveStart:-1,saveLength:-1,saveScroll:-1,funcEnd:function(){}}, +buttonCounter:0,select:{type:"",selected:[],preRowSelect:null,postSelected:null,postDeselected:null,all:!1,selectedClass:""},custom:{},swfPath:"",buttonSet:[],master:!1,tags:{}};this.dom={container:null,table:null,print:{hidden:[],message:null},collection:{collection:null,background:null}};this.classes=e.extend(!0,{},TableTools.classes);this.s.dt.bJUI&&e.extend(!0,this.classes,TableTools.classes_themeroller);this.fnSettings=function(){return this.s};"undefined"==typeof b&&(b={});TableTools._aInstances.push(this); +this._fnConstruct(b);return this};TableTools.prototype={fnGetSelected:function(a){var b=[],c=this.s.dt.aoData,d=this.s.dt.aiDisplay,f;if(a){a=0;for(f=d.length;a<f;a++)c[d[a]]._DTTT_selected&&b.push(c[d[a]].nTr)}else{a=0;for(f=c.length;a<f;a++)c[a]._DTTT_selected&&b.push(c[a].nTr)}return b},fnGetSelectedData:function(){var a=[],b=this.s.dt.aoData,c,d;c=0;for(d=b.length;c<d;c++)b[c]._DTTT_selected&&a.push(this.s.dt.oInstance.fnGetData(c));return a},fnGetSelectedIndexes:function(a){var b=[],c=this.s.dt.aoData, +d=this.s.dt.aiDisplay,f;if(a){a=0;for(f=d.length;a<f;a++)c[d[a]]._DTTT_selected&&b.push(d[a])}else{a=0;for(f=c.length;a<f;a++)c[a]._DTTT_selected&&b.push(a)}return b},fnIsSelected:function(a){a=this.s.dt.oInstance.fnGetPosition(a);return!0===this.s.dt.aoData[a]._DTTT_selected?!0:!1},fnSelectAll:function(a){this._fnRowSelect(a?this.s.dt.aiDisplay:this.s.dt.aoData)},fnSelectNone:function(a){this._fnRowDeselect(this.fnGetSelectedIndexes(a))},fnSelect:function(a){"single"==this.s.select.type&&this.fnSelectNone(); +this._fnRowSelect(a)},fnDeselect:function(a){this._fnRowDeselect(a)},fnGetTitle:function(a){var b="";"undefined"!=typeof a.sTitle&&""!==a.sTitle?b=a.sTitle:(a=k.getElementsByTagName("title"),0<a.length&&(b=a[0].innerHTML));return 4>"¡".toString().length?b.replace(/[^a-zA-Z0-9_\u00A1-\uFFFF\.,\-_ !\(\)]/g,""):b.replace(/[^a-zA-Z0-9_\.,\-_ !\(\)]/g,"")},fnCalcColRatios:function(a){var b=this.s.dt.aoColumns,a=this._fnColumnTargets(a.mColumns),c=[],d=0,f=0,e,i;e=0;for(i=a.length;e<i;e++)a[e]&&(d=b[e].nTh.offsetWidth, +f+=d,c.push(d));e=0;for(i=c.length;e<i;e++)c[e]/=f;return c.join("\t")},fnGetTableData:function(a){if(this.s.dt)return this._fnGetDataTablesData(a)},fnSetText:function(a,b){this._fnFlashSetText(a,b)},fnResizeButtons:function(){for(var a in g.clients)if(a){var b=g.clients[a];"undefined"!=typeof b.domElement&&b.domElement.parentNode&&b.positionElement()}},fnResizeRequired:function(){for(var a in g.clients)if(a){var b=g.clients[a];if("undefined"!=typeof b.domElement&&b.domElement.parentNode==this.dom.container&& +!1===b.sized)return!0}return!1},fnPrint:function(a,b){b===q&&(b={});a===q||a?this._fnPrintStart(b):this._fnPrintEnd()},fnInfo:function(a,b){var c=e("<div/>").addClass(this.classes.print.info).html(a).appendTo("body");setTimeout(function(){c.fadeOut("normal",function(){c.remove()})},b)},fnContainer:function(){return this.dom.container},_fnConstruct:function(a){var b=this;this._fnCustomiseSettings(a);this.dom.container=k.createElement(this.s.tags.container);this.dom.container.className=this.classes.container; +"none"!=this.s.select.type&&this._fnRowSelectConfig();this._fnButtonDefinations(this.s.buttonSet,this.dom.container);this.s.dt.aoDestroyCallback.push({sName:"TableTools",fn:function(){e(b.s.dt.nTBody).off("click.DTTT_Select",b.s.custom.sRowSelector).off("mousedown.DTTT_Select","tr").off("mouseup.DTTT_Select","tr");e(b.dom.container).empty();var a=e.inArray(b,TableTools._aInstances);-1!==a&&TableTools._aInstances.splice(a,1)}})},_fnCustomiseSettings:function(a){"undefined"==typeof this.s.dt._TableToolsInit&& +(this.s.master=!0,this.s.dt._TableToolsInit=!0);this.dom.table=this.s.dt.nTable;this.s.custom=e.extend({},TableTools.DEFAULTS,a);this.s.swfPath=this.s.custom.sSwfPath;"undefined"!=typeof g&&(g.moviePath=this.s.swfPath);this.s.select.type=this.s.custom.sRowSelect;this.s.select.preRowSelect=this.s.custom.fnPreRowSelect;this.s.select.postSelected=this.s.custom.fnRowSelected;this.s.select.postDeselected=this.s.custom.fnRowDeselected;this.s.custom.sSelectedClass&&(this.classes.select.row=this.s.custom.sSelectedClass); +this.s.tags=this.s.custom.oTags;this.s.buttonSet=this.s.custom.aButtons},_fnButtonDefinations:function(a,b){for(var c,d=0,f=a.length;d<f;d++){if("string"==typeof a[d]){if("undefined"==typeof TableTools.BUTTONS[a[d]]){alert("TableTools: Warning - unknown button type: "+a[d]);continue}c=e.extend({},TableTools.BUTTONS[a[d]],!0)}else{if("undefined"==typeof TableTools.BUTTONS[a[d].sExtends]){alert("TableTools: Warning - unknown button type: "+a[d].sExtends);continue}c=e.extend({},TableTools.BUTTONS[a[d].sExtends], +!0);c=e.extend(c,a[d],!0)}(c=this._fnCreateButton(c,e(b).hasClass(this.classes.collection.container)))&&b.appendChild(c)}},_fnCreateButton:function(a,b){var c=this._fnButtonBase(a,b);if(a.sAction.match(/flash/)){if(!this._fnHasFlash())return!1;this._fnFlashConfig(c,a)}else"text"==a.sAction?this._fnTextConfig(c,a):"div"==a.sAction?this._fnTextConfig(c,a):"collection"==a.sAction&&(this._fnTextConfig(c,a),this._fnCollectionConfig(c,a));if(-1!==this.s.dt.iTabIndex)e(c).attr("tabindex",this.s.dt.iTabIndex).attr("aria-controls", +this.s.dt.sTableId).on("keyup.DTTT",function(a){13===a.keyCode&&(a.stopPropagation(),e(this).trigger("click"))}).on("mousedown.DTTT",function(b){a.sAction.match(/flash/)||b.preventDefault()});return c},_fnButtonBase:function(a,b){var c,d,f;b?(c=a.sTag&&"default"!==a.sTag?a.sTag:this.s.tags.collection.button,d=a.sLinerTag&&"default"!==a.sLinerTag?a.sLiner:this.s.tags.collection.liner,f=this.classes.collection.buttons.normal):(c=a.sTag&&"default"!==a.sTag?a.sTag:this.s.tags.button,d=a.sLinerTag&&"default"!== +a.sLinerTag?a.sLiner:this.s.tags.liner,f=this.classes.buttons.normal);c=k.createElement(c);d=k.createElement(d);var e=this._fnGetMasterSettings();c.className=f+" "+a.sButtonClass;c.setAttribute("id","ToolTables_"+this.s.dt.sInstance+"_"+e.buttonCounter);c.appendChild(d);d.innerHTML=a.sButtonText;e.buttonCounter++;return c},_fnGetMasterSettings:function(){if(this.s.master)return this.s;for(var a=TableTools._aInstances,b=0,c=a.length;b<c;b++)if(this.dom.table==a[b].s.dt.nTable)return a[b].s},_fnCollectionConfig:function(a, +b){var c=k.createElement(this.s.tags.collection.container);c.style.display="none";c.className=this.classes.collection.container;b._collection=c;k.body.appendChild(c);this._fnButtonDefinations(b.aButtons,c)},_fnCollectionShow:function(a,b){var c=this,d=e(a).offset(),f=b._collection,j=d.left,d=d.top+e(a).outerHeight(),i=e(n).height(),h=e(k).height(),o=e(n).width(),g=e(k).width();f.style.position="absolute";f.style.left=j+"px";f.style.top=d+"px";f.style.display="block";e(f).css("opacity",0);var l=k.createElement("div"); +l.style.position="absolute";l.style.left="0px";l.style.top="0px";l.style.height=(i>h?i:h)+"px";l.style.width=(o>g?o:g)+"px";l.className=this.classes.collection.background;e(l).css("opacity",0);k.body.appendChild(l);k.body.appendChild(f);i=e(f).outerWidth();o=e(f).outerHeight();j+i>g&&(f.style.left=g-i+"px");d+o>h&&(f.style.top=d-o-e(a).outerHeight()+"px");this.dom.collection.collection=f;this.dom.collection.background=l;setTimeout(function(){e(f).animate({opacity:1},500);e(l).animate({opacity:0.25}, +500)},10);this.fnResizeButtons();e(l).click(function(){c._fnCollectionHide.call(c,null,null)})},_fnCollectionHide:function(a,b){!(null!==b&&"collection"==b.sExtends)&&null!==this.dom.collection.collection&&(e(this.dom.collection.collection).animate({opacity:0},500,function(){this.style.display="none"}),e(this.dom.collection.background).animate({opacity:0},500,function(){this.parentNode.removeChild(this)}),this.dom.collection.collection=null,this.dom.collection.background=null)},_fnRowSelectConfig:function(){if(this.s.master){var a= +this,b=this.s.dt;e(b.nTable).addClass(this.classes.select.table);"os"===this.s.select.type&&(e(b.nTBody).on("mousedown.DTTT_Select","tr",function(a){if(a.shiftKey)e(b.nTBody).css("-moz-user-select","none").one("selectstart.DTTT_Select","tr",function(){return!1})}),e(b.nTBody).on("mouseup.DTTT_Select","tr",function(){e(b.nTBody).css("-moz-user-select","")}));e(b.nTBody).on("click.DTTT_Select",this.s.custom.sRowSelector,function(c){var d=this.nodeName.toLowerCase()==="tr"?this:e(this).parents("tr")[0], +f=a.s.select,j=a.s.dt.oInstance.fnGetPosition(d);if(d.parentNode==b.nTBody&&b.oInstance.fnGetData(d)!==null){if(f.type=="os")if(c.ctrlKey||c.metaKey)a.fnIsSelected(d)?a._fnRowDeselect(d,c):a._fnRowSelect(d,c);else if(c.shiftKey){var i=a.s.dt.aiDisplay.slice(),h=e.inArray(f.lastRow,i),o=e.inArray(j,i);if(a.fnGetSelected().length===0||h===-1)i.splice(e.inArray(j,i)+1,i.length);else{if(h>o)var g=o,o=h,h=g;i.splice(o+1,i.length);i.splice(0,h)}if(a.fnIsSelected(d)){i.splice(e.inArray(j,i),1);a._fnRowDeselect(i, +c)}else a._fnRowSelect(i,c)}else if(a.fnIsSelected(d)&&a.fnGetSelected().length===1)a._fnRowDeselect(d,c);else{a.fnSelectNone();a._fnRowSelect(d,c)}else if(a.fnIsSelected(d))a._fnRowDeselect(d,c);else if(f.type=="single"){a.fnSelectNone();a._fnRowSelect(d,c)}else f.type=="multi"&&a._fnRowSelect(d,c);f.lastRow=j}});b.oApi._fnCallbackReg(b,"aoRowCreatedCallback",function(c,d,f){b.aoData[f]._DTTT_selected&&e(c).addClass(a.classes.select.row)},"TableTools-SelectAll")}},_fnRowSelect:function(a,b){var c= +this._fnSelectData(a),d=[],f,j;f=0;for(j=c.length;f<j;f++)c[f].nTr&&d.push(c[f].nTr);if(null===this.s.select.preRowSelect||this.s.select.preRowSelect.call(this,b,d,!0)){f=0;for(j=c.length;f<j;f++)c[f]._DTTT_selected=!0,c[f].nTr&&e(c[f].nTr).addClass(this.classes.select.row);null!==this.s.select.postSelected&&this.s.select.postSelected.call(this,d);TableTools._fnEventDispatch(this,"select",d,!0)}},_fnRowDeselect:function(a,b){var c=this._fnSelectData(a),d=[],f,j;f=0;for(j=c.length;f<j;f++)c[f].nTr&& +d.push(c[f].nTr);if(null===this.s.select.preRowSelect||this.s.select.preRowSelect.call(this,b,d,!1)){f=0;for(j=c.length;f<j;f++)c[f]._DTTT_selected=!1,c[f].nTr&&e(c[f].nTr).removeClass(this.classes.select.row);null!==this.s.select.postDeselected&&this.s.select.postDeselected.call(this,d);TableTools._fnEventDispatch(this,"select",d,!1)}},_fnSelectData:function(a){var b=[],c,d,f;if(a.nodeName)c=this.s.dt.oInstance.fnGetPosition(a),b.push(this.s.dt.aoData[c]);else if("undefined"!==typeof a.length){d= +0;for(f=a.length;d<f;d++)a[d].nodeName?(c=this.s.dt.oInstance.fnGetPosition(a[d]),b.push(this.s.dt.aoData[c])):"number"===typeof a[d]?b.push(this.s.dt.aoData[a[d]]):b.push(a[d])}else"number"===typeof a?b.push(this.s.dt.aoData[a]):b.push(a);return b},_fnTextConfig:function(a,b){var c=this;null!==b.fnInit&&b.fnInit.call(this,a,b);""!==b.sToolTip&&(a.title=b.sToolTip);e(a).hover(function(){b.fnMouseover!==null&&b.fnMouseover.call(this,a,b,null)},function(){b.fnMouseout!==null&&b.fnMouseout.call(this, +a,b,null)});null!==b.fnSelect&&TableTools._fnEventListen(this,"select",function(d){b.fnSelect.call(c,a,b,d)});e(a).click(function(d){b.fnClick!==null&&b.fnClick.call(c,a,b,null,d);b.fnComplete!==null&&b.fnComplete.call(c,a,b,null,null);c._fnCollectionHide(a,b)})},_fnHasFlash:function(){try{if(new ActiveXObject("ShockwaveFlash.ShockwaveFlash"))return!0}catch(a){if(navigator.mimeTypes&&navigator.mimeTypes["application/x-shockwave-flash"]!==q&&navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin)return!0}return!1}, +_fnFlashConfig:function(a,b){var c=this,d=new g.Client;null!==b.fnInit&&b.fnInit.call(this,a,b);d.setHandCursor(!0);"flash_save"==b.sAction?(d.setAction("save"),d.setCharSet("utf16le"==b.sCharSet?"UTF16LE":"UTF8"),d.setBomInc(b.bBomInc),d.setFileName(b.sFileName.replace("*",this.fnGetTitle(b)))):"flash_pdf"==b.sAction?(d.setAction("pdf"),d.setFileName(b.sFileName.replace("*",this.fnGetTitle(b)))):d.setAction("copy");d.addEventListener("mouseOver",function(){b.fnMouseover!==null&&b.fnMouseover.call(c, +a,b,d)});d.addEventListener("mouseOut",function(){b.fnMouseout!==null&&b.fnMouseout.call(c,a,b,d)});d.addEventListener("mouseDown",function(){b.fnClick!==null&&b.fnClick.call(c,a,b,d)});d.addEventListener("complete",function(f,e){b.fnComplete!==null&&b.fnComplete.call(c,a,b,d,e);c._fnCollectionHide(a,b)});null!==b.fnSelect&&TableTools._fnEventListen(this,"select",function(d){b.fnSelect.call(c,a,b,d)});this._fnFlashGlue(d,a,b.sToolTip)},_fnFlashGlue:function(a,b,c){var d=this,f=b.getAttribute("id"); +k.getElementById(f)?a.glue(b,c):setTimeout(function(){d._fnFlashGlue(a,b,c)},100)},_fnFlashSetText:function(a,b){var c=this._fnChunkData(b,8192);a.clearText();for(var d=0,f=c.length;d<f;d++)a.appendText(c[d])},_fnColumnTargets:function(a){var b=[],c=this.s.dt,d,f=c.aoColumns;d=f.length;if("function"==typeof a){a=a.call(this,c);for(c=0;c<d;c++)b.push(-1!==e.inArray(c,a)?!0:!1)}else if("object"==typeof a){for(c=0;c<d;c++)b.push(!1);c=0;for(d=a.length;c<d;c++)b[a[c]]=!0}else if("visible"==a)for(c=0;c< +d;c++)b.push(f[c].bVisible?!0:!1);else if("hidden"==a)for(c=0;c<d;c++)b.push(f[c].bVisible?!1:!0);else if("sortable"==a)for(c=0;c<d;c++)b.push(f[c].bSortable?!0:!1);else for(c=0;c<d;c++)b.push(!0);return b},_fnNewline:function(a){return"auto"==a.sNewLine?navigator.userAgent.match(/Windows/)?"\r\n":"\n":a.sNewLine},_fnGetDataTablesData:function(a){var b,c,d,f,j,i=[],h="",g=this.s.dt,k,l=RegExp(a.sFieldBoundary,"g"),n=this._fnColumnTargets(a.mColumns);d="undefined"!=typeof a.bSelectedOnly?a.bSelectedOnly: +!1;if(a.bHeader){j=[];b=0;for(c=g.aoColumns.length;b<c;b++)n[b]&&(h=g.aoColumns[b].sTitle.replace(/\n/g," ").replace(/<.*?>/g,"").replace(/^\s+|\s+$/g,""),h=this._fnHtmlDecode(h),j.push(this._fnBoundData(h,a.sFieldBoundary,l)));i.push(j.join(a.sFieldSeperator))}d=!0;var m;f=this.fnGetSelectedIndexes();m=(d="none"!==this.s.select.type&&d&&0!==f.length)?f:p.Api?(new p.Api(g)).rows(a.oSelectorOpts).indexes().flatten().toArray():g.oInstance.$("tr",a.oSelectorOpts).map(function(a,b){return g.oInstance.fnGetPosition(b)}).get(); +d=0;for(f=m.length;d<f;d++){k=g.aoData[m[d]].nTr;j=[];b=0;for(c=g.aoColumns.length;b<c;b++)n[b]&&(h=g.oApi._fnGetCellData(g,m[d],b,"display"),a.fnCellRender?h=a.fnCellRender(h,b,k,m[d])+"":"string"==typeof h?(h=h.replace(/\n/g," "),h=h.replace(/<img.*?\s+alt\s*=\s*(?:"([^"]+)"|'([^']+)'|([^\s>]+)).*?>/gi,"$1$2$3"),h=h.replace(/<.*?>/g,"")):h+="",h=h.replace(/^\s+/,"").replace(/\s+$/,""),h=this._fnHtmlDecode(h),j.push(this._fnBoundData(h,a.sFieldBoundary,l)));i.push(j.join(a.sFieldSeperator));a.bOpenRows&& +(b=e.grep(g.aoOpenRows,function(a){return a.nParent===k}),1===b.length&&(h=this._fnBoundData(e("td",b[0].nTr).html(),a.sFieldBoundary,l),i.push(h)))}if(a.bFooter&&null!==g.nTFoot){j=[];b=0;for(c=g.aoColumns.length;b<c;b++)n[b]&&null!==g.aoColumns[b].nTf&&(h=g.aoColumns[b].nTf.innerHTML.replace(/\n/g," ").replace(/<.*?>/g,""),h=this._fnHtmlDecode(h),j.push(this._fnBoundData(h,a.sFieldBoundary,l)));i.push(j.join(a.sFieldSeperator))}return i.join(this._fnNewline(a))},_fnBoundData:function(a,b,c){return""=== +b?a:b+a.replace(c,b+b)+b},_fnChunkData:function(a,b){for(var c=[],d=a.length,f=0;f<d;f+=b)f+b<d?c.push(a.substring(f,f+b)):c.push(a.substring(f,d));return c},_fnHtmlDecode:function(a){if(-1===a.indexOf("&"))return a;var b=k.createElement("div");return a.replace(/&([^\s]*?);/g,function(a,d){if("#"===a.substr(1,1))return String.fromCharCode(Number(d.substr(1)));b.innerHTML=a;return b.childNodes[0].nodeValue})},_fnPrintStart:function(a){var b=this,c=this.s.dt;this._fnPrintHideNodes(c.nTable);this.s.print.saveStart= +c._iDisplayStart;this.s.print.saveLength=c._iDisplayLength;a.bShowAll&&(c._iDisplayStart=0,c._iDisplayLength=-1,c.oApi._fnCalculateEnd&&c.oApi._fnCalculateEnd(c),c.oApi._fnDraw(c));if(""!==c.oScroll.sX||""!==c.oScroll.sY)this._fnPrintScrollStart(c),e(this.s.dt.nTable).bind("draw.DTTT_Print",function(){b._fnPrintScrollStart(c)});var d=c.aanFeatures,f;for(f in d)if("i"!=f&&"t"!=f&&1==f.length)for(var g=0,i=d[f].length;g<i;g++)this.dom.print.hidden.push({node:d[f][g],display:"block"}),d[f][g].style.display= +"none";e(k.body).addClass(this.classes.print.body);""!==a.sInfo&&this.fnInfo(a.sInfo,3E3);a.sMessage&&e("<div/>").addClass(this.classes.print.message).html(a.sMessage).prependTo("body");this.s.print.saveScroll=e(n).scrollTop();n.scrollTo(0,0);e(k).bind("keydown.DTTT",function(a){if(a.keyCode==27){a.preventDefault();b._fnPrintEnd.call(b,a)}})},_fnPrintEnd:function(){var a=this.s.dt,b=this.s.print;this._fnPrintShowNodes();if(""!==a.oScroll.sX||""!==a.oScroll.sY)e(this.s.dt.nTable).unbind("draw.DTTT_Print"), +this._fnPrintScrollEnd();n.scrollTo(0,b.saveScroll);e("div."+this.classes.print.message).remove();e(k.body).removeClass("DTTT_Print");a._iDisplayStart=b.saveStart;a._iDisplayLength=b.saveLength;a.oApi._fnCalculateEnd&&a.oApi._fnCalculateEnd(a);a.oApi._fnDraw(a);e(k).unbind("keydown.DTTT")},_fnPrintScrollStart:function(){var a=this.s.dt;a.nScrollHead.getElementsByTagName("div")[0].getElementsByTagName("table");var b=a.nTable.parentNode,c;c=a.nTable.getElementsByTagName("thead");0<c.length&&a.nTable.removeChild(c[0]); +null!==a.nTFoot&&(c=a.nTable.getElementsByTagName("tfoot"),0<c.length&&a.nTable.removeChild(c[0]));c=a.nTHead.cloneNode(!0);a.nTable.insertBefore(c,a.nTable.childNodes[0]);null!==a.nTFoot&&(c=a.nTFoot.cloneNode(!0),a.nTable.insertBefore(c,a.nTable.childNodes[1]));""!==a.oScroll.sX&&(a.nTable.style.width=e(a.nTable).outerWidth()+"px",b.style.width=e(a.nTable).outerWidth()+"px",b.style.overflow="visible");""!==a.oScroll.sY&&(b.style.height=e(a.nTable).outerHeight()+"px",b.style.overflow="visible")}, +_fnPrintScrollEnd:function(){var a=this.s.dt,b=a.nTable.parentNode;""!==a.oScroll.sX&&(b.style.width=a.oApi._fnStringToCss(a.oScroll.sX),b.style.overflow="auto");""!==a.oScroll.sY&&(b.style.height=a.oApi._fnStringToCss(a.oScroll.sY),b.style.overflow="auto")},_fnPrintShowNodes:function(){for(var a=this.dom.print.hidden,b=0,c=a.length;b<c;b++)a[b].node.style.display=a[b].display;a.splice(0,a.length)},_fnPrintHideNodes:function(a){for(var b=this.dom.print.hidden,c=a.parentNode,d=c.childNodes,f=0,g=d.length;f< +g;f++)if(d[f]!=a&&1==d[f].nodeType){var i=e(d[f]).css("display");"none"!=i&&(b.push({node:d[f],display:i}),d[f].style.display="none")}"BODY"!=c.nodeName.toUpperCase()&&this._fnPrintHideNodes(c)}};TableTools._aInstances=[];TableTools._aListeners=[];TableTools.fnGetMasters=function(){for(var a=[],b=0,c=TableTools._aInstances.length;b<c;b++)TableTools._aInstances[b].s.master&&a.push(TableTools._aInstances[b]);return a};TableTools.fnGetInstance=function(a){"object"!=typeof a&&(a=k.getElementById(a)); +for(var b=0,c=TableTools._aInstances.length;b<c;b++)if(TableTools._aInstances[b].s.master&&TableTools._aInstances[b].dom.table==a)return TableTools._aInstances[b];return null};TableTools._fnEventListen=function(a,b,c){TableTools._aListeners.push({that:a,type:b,fn:c})};TableTools._fnEventDispatch=function(a,b,c,d){for(var f=TableTools._aListeners,e=0,g=f.length;e<g;e++)a.dom.table==f[e].that.dom.table&&f[e].type==b&&f[e].fn(c,d)};TableTools.buttonBase={sAction:"text",sTag:"default",sLinerTag:"default", +sButtonClass:"DTTT_button_text",sButtonText:"Button text",sTitle:"",sToolTip:"",sCharSet:"utf8",bBomInc:!1,sFileName:"*.csv",sFieldBoundary:"",sFieldSeperator:"\t",sNewLine:"auto",mColumns:"all",bHeader:!0,bFooter:!0,bOpenRows:!1,bSelectedOnly:!1,oSelectorOpts:q,fnMouseover:null,fnMouseout:null,fnClick:null,fnSelect:null,fnComplete:null,fnInit:null,fnCellRender:null};TableTools.BUTTONS={csv:e.extend({},TableTools.buttonBase,{sAction:"flash_save",sButtonClass:"DTTT_button_csv",sButtonText:"CSV",sFieldBoundary:'"', +sFieldSeperator:",",fnClick:function(a,b,c){this.fnSetText(c,this.fnGetTableData(b))}}),xls:e.extend({},TableTools.buttonBase,{sAction:"flash_save",sCharSet:"utf16le",bBomInc:!0,sButtonClass:"DTTT_button_xls",sButtonText:"Excel",fnClick:function(a,b,c){this.fnSetText(c,this.fnGetTableData(b))}}),copy:e.extend({},TableTools.buttonBase,{sAction:"flash_copy",sButtonClass:"DTTT_button_copy",sButtonText:"Copy",fnClick:function(a,b,c){this.fnSetText(c,this.fnGetTableData(b))},fnComplete:function(a,b,c, +d){a=d.split("\n").length;b.bHeader&&a--;null!==this.s.dt.nTFoot&&b.bFooter&&a--;this.fnInfo("<h6>Table copied</h6><p>Copied "+a+" row"+(1==a?"":"s")+" to the clipboard.</p>",1500)}}),pdf:e.extend({},TableTools.buttonBase,{sAction:"flash_pdf",sNewLine:"\n",sFileName:"*.pdf",sButtonClass:"DTTT_button_pdf",sButtonText:"PDF",sPdfOrientation:"portrait",sPdfSize:"A4",sPdfMessage:"",fnClick:function(a,b,c){this.fnSetText(c,"title:"+this.fnGetTitle(b)+"\nmessage:"+b.sPdfMessage+"\ncolWidth:"+this.fnCalcColRatios(b)+ +"\norientation:"+b.sPdfOrientation+"\nsize:"+b.sPdfSize+"\n--/TableToolsOpts--\n"+this.fnGetTableData(b))}}),print:e.extend({},TableTools.buttonBase,{sInfo:"<h6>Print view</h6><p>Please use your browser's print function to print this table. Press escape when finished.</p>",sMessage:null,bShowAll:!0,sToolTip:"View print view",sButtonClass:"DTTT_button_print",sButtonText:"Print",fnClick:function(a,b){this.fnPrint(!0,b)}}),text:e.extend({},TableTools.buttonBase),select:e.extend({},TableTools.buttonBase, +{sButtonText:"Select button",fnSelect:function(a){0!==this.fnGetSelected().length?e(a).removeClass(this.classes.buttons.disabled):e(a).addClass(this.classes.buttons.disabled)},fnInit:function(a){e(a).addClass(this.classes.buttons.disabled)}}),select_single:e.extend({},TableTools.buttonBase,{sButtonText:"Select button",fnSelect:function(a){1==this.fnGetSelected().length?e(a).removeClass(this.classes.buttons.disabled):e(a).addClass(this.classes.buttons.disabled)},fnInit:function(a){e(a).addClass(this.classes.buttons.disabled)}}), +select_all:e.extend({},TableTools.buttonBase,{sButtonText:"Select all",fnClick:function(){this.fnSelectAll()},fnSelect:function(a){this.fnGetSelected().length==this.s.dt.fnRecordsDisplay()?e(a).addClass(this.classes.buttons.disabled):e(a).removeClass(this.classes.buttons.disabled)}}),select_none:e.extend({},TableTools.buttonBase,{sButtonText:"Deselect all",fnClick:function(){this.fnSelectNone()},fnSelect:function(a){0!==this.fnGetSelected().length?e(a).removeClass(this.classes.buttons.disabled):e(a).addClass(this.classes.buttons.disabled)}, +fnInit:function(a){e(a).addClass(this.classes.buttons.disabled)}}),ajax:e.extend({},TableTools.buttonBase,{sAjaxUrl:"/xhr.php",sButtonText:"Ajax button",fnClick:function(a,b){var c=this.fnGetTableData(b);e.ajax({url:b.sAjaxUrl,data:[{name:"tableData",value:c}],success:b.fnAjaxComplete,dataType:"json",type:"POST",cache:!1,error:function(){alert("Error detected when sending table data to server")}})},fnAjaxComplete:function(){alert("Ajax complete")}}),div:e.extend({},TableTools.buttonBase,{sAction:"div", +sTag:"div",sButtonClass:"DTTT_nonbutton",sButtonText:"Text button"}),collection:e.extend({},TableTools.buttonBase,{sAction:"collection",sButtonClass:"DTTT_button_collection",sButtonText:"Collection",fnClick:function(a,b){this._fnCollectionShow(a,b)}})};TableTools.buttons=TableTools.BUTTONS;TableTools.classes={container:"DTTT_container",buttons:{normal:"DTTT_button",disabled:"DTTT_disabled"},collection:{container:"DTTT_collection",background:"DTTT_collection_background",buttons:{normal:"DTTT_button", +disabled:"DTTT_disabled"}},select:{table:"DTTT_selectable",row:"DTTT_selected selected"},print:{body:"DTTT_Print",info:"DTTT_print_info",message:"DTTT_PrintMessage"}};TableTools.classes_themeroller={container:"DTTT_container ui-buttonset ui-buttonset-multi",buttons:{normal:"DTTT_button ui-button ui-state-default"},collection:{container:"DTTT_collection ui-buttonset ui-buttonset-multi"}};TableTools.DEFAULTS={sSwfPath:"../swf/copy_csv_xls_pdf.swf",sRowSelect:"none",sRowSelector:"tr",sSelectedClass:null, +fnPreRowSelect:null,fnRowSelected:null,fnRowDeselected:null,aButtons:["copy","csv","xls","pdf","print"],oTags:{container:"div",button:"a",liner:"span",collection:{container:"div",button:"a",liner:"span"}}};TableTools.defaults=TableTools.DEFAULTS;TableTools.prototype.CLASS="TableTools";TableTools.version="2.2.4";e.fn.dataTable.Api&&e.fn.dataTable.Api.register("tabletools()",function(){var a=null;0<this.context.length&&(a=TableTools.fnGetInstance(this.context[0].nTable));return a});"function"==typeof e.fn.dataTable&& +"function"==typeof e.fn.dataTableExt.fnVersionCheck&&e.fn.dataTableExt.fnVersionCheck("1.9.0")?e.fn.dataTableExt.aoFeatures.push({fnInit:function(a){var b=a.oInit;return(new TableTools(a.oInstance,b?b.tableTools||b.oTableTools||{}:{})).dom.container},cFeature:"T",sFeature:"TableTools"}):alert("Warning: TableTools requires DataTables 1.9.0 or newer - www.datatables.net/download");e.fn.DataTable.TableTools=TableTools;"function"==typeof m.fn.dataTable&&"function"==typeof m.fn.dataTableExt.fnVersionCheck&& +m.fn.dataTableExt.fnVersionCheck("1.9.0")?m.fn.dataTableExt.aoFeatures.push({fnInit:function(a){a=new TableTools(a.oInstance,"undefined"!=typeof a.oInit.oTableTools?a.oInit.oTableTools:{});TableTools._aInstances.push(a);return a.dom.container},cFeature:"T",sFeature:"TableTools"}):alert("Warning: TableTools 2 requires DataTables 1.9.0 or newer - www.datatables.net/download");m.fn.dataTable.TableTools=TableTools;return m.fn.DataTable.TableTools=TableTools};"function"===typeof define&&define.amd?define(["jquery", +"datatables"],p):"object"===typeof exports?p(require("jquery"),require("datatables")):jQuery&&!jQuery.fn.dataTable.TableTools&&p(jQuery,jQuery.fn.dataTable)})(window,document); diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/swf/copy_csv_xls.swf b/theme/bootstrap/plugins/datatables/extensions/TableTools/swf/copy_csv_xls.swf new file mode 100644 index 0000000..8976009 Binary files /dev/null and b/theme/bootstrap/plugins/datatables/extensions/TableTools/swf/copy_csv_xls.swf differ diff --git a/theme/bootstrap/plugins/datatables/extensions/TableTools/swf/copy_csv_xls_pdf.swf b/theme/bootstrap/plugins/datatables/extensions/TableTools/swf/copy_csv_xls_pdf.swf new file mode 100644 index 0000000..10f6d95 Binary files /dev/null and b/theme/bootstrap/plugins/datatables/extensions/TableTools/swf/copy_csv_xls_pdf.swf differ diff --git a/theme/bootstrap/plugins/datatables/images/sort_asc.png b/theme/bootstrap/plugins/datatables/images/sort_asc.png new file mode 100644 index 0000000..e1ba61a Binary files /dev/null and b/theme/bootstrap/plugins/datatables/images/sort_asc.png differ diff --git a/theme/bootstrap/plugins/datatables/images/sort_asc_disabled.png b/theme/bootstrap/plugins/datatables/images/sort_asc_disabled.png new file mode 100644 index 0000000..fb11dfe Binary files /dev/null and b/theme/bootstrap/plugins/datatables/images/sort_asc_disabled.png differ diff --git a/theme/bootstrap/plugins/datatables/images/sort_both.png b/theme/bootstrap/plugins/datatables/images/sort_both.png new file mode 100644 index 0000000..af5bc7c Binary files /dev/null and b/theme/bootstrap/plugins/datatables/images/sort_both.png differ diff --git a/theme/bootstrap/plugins/datatables/images/sort_desc.png b/theme/bootstrap/plugins/datatables/images/sort_desc.png new file mode 100644 index 0000000..0e156de Binary files /dev/null and b/theme/bootstrap/plugins/datatables/images/sort_desc.png differ diff --git a/theme/bootstrap/plugins/datatables/images/sort_desc_disabled.png b/theme/bootstrap/plugins/datatables/images/sort_desc_disabled.png new file mode 100644 index 0000000..c9fdd8a Binary files /dev/null and b/theme/bootstrap/plugins/datatables/images/sort_desc_disabled.png differ diff --git a/theme/bootstrap/plugins/datatables/jquery.dataTables.css b/theme/bootstrap/plugins/datatables/jquery.dataTables.css new file mode 100644 index 0000000..eec02ef --- /dev/null +++ b/theme/bootstrap/plugins/datatables/jquery.dataTables.css @@ -0,0 +1,455 @@ +/* + * Table styles + */ +table.dataTable { + width: 100%; + margin: 0 auto; + clear: both; + border-collapse: separate; + border-spacing: 0; + /* + * Header and footer styles + */ + /* + * Body styles + */ +} +table.dataTable thead th, +table.dataTable tfoot th { + font-weight: bold; +} +table.dataTable thead th, +table.dataTable thead td { + padding: 10px 18px; + border-bottom: 1px solid #111; +} +table.dataTable thead th:active, +table.dataTable thead td:active { + outline: none; +} +table.dataTable tfoot th, +table.dataTable tfoot td { + padding: 10px 18px 6px 18px; + border-top: 1px solid #111; +} +table.dataTable thead .sorting, +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc { + cursor: pointer; + *cursor: hand; +} +table.dataTable thead .sorting, +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc, +table.dataTable thead .sorting_asc_disabled, +table.dataTable thead .sorting_desc_disabled { + background-repeat: no-repeat; + background-position: center right; +} +table.dataTable thead .sorting { + background-image: url("../images/sort_both.png"); +} +table.dataTable thead .sorting_asc { + background-image: url("../images/sort_asc.png"); +} +table.dataTable thead .sorting_desc { + background-image: url("../images/sort_desc.png"); +} +table.dataTable thead .sorting_asc_disabled { + background-image: url("../images/sort_asc_disabled.png"); +} +table.dataTable thead .sorting_desc_disabled { + background-image: url("../images/sort_desc_disabled.png"); +} +table.dataTable tbody tr { + background-color: #ffffff; +} +table.dataTable tbody tr.selected { + background-color: #B0BED9; +} +table.dataTable tbody th, +table.dataTable tbody td { + padding: 8px 10px; +} +table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td { + border-top: 1px solid #ddd; +} +table.dataTable.row-border tbody tr:first-child th, +table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th, +table.dataTable.display tbody tr:first-child td { + border-top: none; +} +table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td { + border-top: 1px solid #ddd; + border-right: 1px solid #ddd; +} +table.dataTable.cell-border tbody tr th:first-child, +table.dataTable.cell-border tbody tr td:first-child { + border-left: 1px solid #ddd; +} +table.dataTable.cell-border tbody tr:first-child th, +table.dataTable.cell-border tbody tr:first-child td { + border-top: none; +} +table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd { + background-color: #f9f9f9; +} +table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected { + background-color: #abb9d3; +} +table.dataTable.hover tbody tr:hover, table.dataTable.display tbody tr:hover { + background-color: whitesmoke; +} +table.dataTable.hover tbody tr:hover.selected, table.dataTable.display tbody tr:hover.selected { + background-color: #a9b7d1; +} +table.dataTable.order-column tbody tr > .sorting_1, +table.dataTable.order-column tbody tr > .sorting_2, +table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1, +table.dataTable.display tbody tr > .sorting_2, +table.dataTable.display tbody tr > .sorting_3 { + background-color: #f9f9f9; +} +table.dataTable.order-column tbody tr.selected > .sorting_1, +table.dataTable.order-column tbody tr.selected > .sorting_2, +table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1, +table.dataTable.display tbody tr.selected > .sorting_2, +table.dataTable.display tbody tr.selected > .sorting_3 { + background-color: #acbad4; +} +table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 { + background-color: #f1f1f1; +} +table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 { + background-color: #f3f3f3; +} +table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 { + background-color: whitesmoke; +} +table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 { + background-color: #a6b3cd; +} +table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 { + background-color: #a7b5ce; +} +table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 { + background-color: #a9b6d0; +} +table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 { + background-color: #f9f9f9; +} +table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 { + background-color: #fbfbfb; +} +table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 { + background-color: #fdfdfd; +} +table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 { + background-color: #acbad4; +} +table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 { + background-color: #adbbd6; +} +table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 { + background-color: #afbdd8; +} +table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1 { + background-color: #eaeaea; +} +table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2 { + background-color: #ebebeb; +} +table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3 { + background-color: #eeeeee; +} +table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1 { + background-color: #a1aec7; +} +table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2 { + background-color: #a2afc8; +} +table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3 { + background-color: #a4b2cb; +} +table.dataTable.no-footer { + border-bottom: 1px solid #111; +} +table.dataTable.nowrap th, table.dataTable.nowrap td { + white-space: nowrap; +} +table.dataTable.compact thead th, +table.dataTable.compact thead td { + padding: 4px 17px 4px 4px; +} +table.dataTable.compact tfoot th, +table.dataTable.compact tfoot td { + padding: 4px; +} +table.dataTable.compact tbody th, +table.dataTable.compact tbody td { + padding: 4px; +} +table.dataTable th.dt-left, +table.dataTable td.dt-left { + text-align: left; +} +table.dataTable th.dt-center, +table.dataTable td.dt-center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.dt-right, +table.dataTable td.dt-right { + text-align: right; +} +table.dataTable th.dt-justify, +table.dataTable td.dt-justify { + text-align: justify; +} +table.dataTable th.dt-nowrap, +table.dataTable td.dt-nowrap { + white-space: nowrap; +} +table.dataTable thead th.dt-head-left, +table.dataTable thead td.dt-head-left, +table.dataTable tfoot th.dt-head-left, +table.dataTable tfoot td.dt-head-left { + text-align: left; +} +table.dataTable thead th.dt-head-center, +table.dataTable thead td.dt-head-center, +table.dataTable tfoot th.dt-head-center, +table.dataTable tfoot td.dt-head-center { + text-align: center; +} +table.dataTable thead th.dt-head-right, +table.dataTable thead td.dt-head-right, +table.dataTable tfoot th.dt-head-right, +table.dataTable tfoot td.dt-head-right { + text-align: right; +} +table.dataTable thead th.dt-head-justify, +table.dataTable thead td.dt-head-justify, +table.dataTable tfoot th.dt-head-justify, +table.dataTable tfoot td.dt-head-justify { + text-align: justify; +} +table.dataTable thead th.dt-head-nowrap, +table.dataTable thead td.dt-head-nowrap, +table.dataTable tfoot th.dt-head-nowrap, +table.dataTable tfoot td.dt-head-nowrap { + white-space: nowrap; +} +table.dataTable tbody th.dt-body-left, +table.dataTable tbody td.dt-body-left { + text-align: left; +} +table.dataTable tbody th.dt-body-center, +table.dataTable tbody td.dt-body-center { + text-align: center; +} +table.dataTable tbody th.dt-body-right, +table.dataTable tbody td.dt-body-right { + text-align: right; +} +table.dataTable tbody th.dt-body-justify, +table.dataTable tbody td.dt-body-justify { + text-align: justify; +} +table.dataTable tbody th.dt-body-nowrap, +table.dataTable tbody td.dt-body-nowrap { + white-space: nowrap; +} + +table.dataTable, +table.dataTable th, +table.dataTable td { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +/* + * Control feature layout + */ +.dataTables_wrapper { + position: relative; + clear: both; + *zoom: 1; + zoom: 1; +} +.dataTables_wrapper .dataTables_length { + float: left; +} +.dataTables_wrapper .dataTables_filter { + float: right; + text-align: right; +} +.dataTables_wrapper .dataTables_filter input { + margin-left: 0.5em; +} +.dataTables_wrapper .dataTables_info { + clear: both; + float: left; + padding-top: 0.755em; +} +.dataTables_wrapper .dataTables_paginate { + float: right; + text-align: right; + padding-top: 0.25em; +} +.dataTables_wrapper .dataTables_paginate .paginate_button { + box-sizing: border-box; + display: inline-block; + min-width: 1.5em; + padding: 0.5em 1em; + margin-left: 2px; + text-align: center; + text-decoration: none !important; + cursor: pointer; + *cursor: hand; + color: #333 !important; + border: 1px solid transparent; +} +.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover { + color: #333 !important; + border: 1px solid #cacaca; + background-color: white; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, #dcdcdc)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, white 0%, #dcdcdc 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, white 0%, #dcdcdc 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, white 0%, #dcdcdc 100%); + /* IE10+ */ + background: -o-linear-gradient(top, white 0%, #dcdcdc 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, white 0%, #dcdcdc 100%); + /* W3C */ +} +.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active { + cursor: default; + color: #666 !important; + border: 1px solid transparent; + background: transparent; + box-shadow: none; +} +.dataTables_wrapper .dataTables_paginate .paginate_button:hover { + color: white !important; + border: 1px solid #111; + background-color: #585858; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #585858 0%, #111 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #585858 0%, #111 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, #585858 0%, #111 100%); + /* IE10+ */ + background: -o-linear-gradient(top, #585858 0%, #111 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, #585858 0%, #111 100%); + /* W3C */ +} +.dataTables_wrapper .dataTables_paginate .paginate_button:active { + outline: none; + background-color: #2b2b2b; + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c)); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* IE10+ */ + background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%); + /* Opera 11.10+ */ + background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%); + /* W3C */ + box-shadow: inset 0 0 3px #111; +} +.dataTables_wrapper .dataTables_paginate .ellipsis { + padding: 0 1em; +} +.dataTables_wrapper .dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 100%; + height: 40px; + margin-left: -50%; + margin-top: -25px; + padding-top: 20px; + text-align: center; + font-size: 1.2em; + background-color: white; + background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0))); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* IE10+ */ + background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* Opera 11.10+ */ + background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* W3C */ +} +.dataTables_wrapper .dataTables_length, +.dataTables_wrapper .dataTables_filter, +.dataTables_wrapper .dataTables_info, +.dataTables_wrapper .dataTables_processing, +.dataTables_wrapper .dataTables_paginate { + color: #333; +} +.dataTables_wrapper .dataTables_scroll { + clear: both; +} +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody { + *margin-top: -1px; + -webkit-overflow-scrolling: touch; +} +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th > div.dataTables_sizing, +.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td > div.dataTables_sizing { + height: 0; + overflow: hidden; + margin: 0 !important; + padding: 0 !important; +} +.dataTables_wrapper.no-footer .dataTables_scrollBody { + border-bottom: 1px solid #111; +} +.dataTables_wrapper.no-footer div.dataTables_scrollHead table, +.dataTables_wrapper.no-footer div.dataTables_scrollBody table { + border-bottom: none; +} +.dataTables_wrapper:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; +} + +@media screen and (max-width: 767px) { + .dataTables_wrapper .dataTables_info, + .dataTables_wrapper .dataTables_paginate { + float: none; + text-align: center; + } + .dataTables_wrapper .dataTables_paginate { + margin-top: 0.5em; + } +} +@media screen and (max-width: 640px) { + .dataTables_wrapper .dataTables_length, + .dataTables_wrapper .dataTables_filter { + float: none; + text-align: center; + } + .dataTables_wrapper .dataTables_filter { + margin-top: 0.5em; + } +} diff --git a/theme/bootstrap/plugins/datatables/jquery.dataTables.js b/theme/bootstrap/plugins/datatables/jquery.dataTables.js new file mode 100644 index 0000000..2a9bdb3 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/jquery.dataTables.js @@ -0,0 +1,14951 @@ +/*! DataTables 1.10.7 + * ©2008-2014 SpryMedia Ltd - datatables.net/license + */ + +/** + * @summary DataTables + * @description Paginate, search and order HTML tables + * @version 1.10.7 + * @file jquery.dataTables.js + * @author SpryMedia Ltd (www.sprymedia.co.uk) + * @contact www.sprymedia.co.uk/contact + * @copyright Copyright 2008-2014 SpryMedia Ltd. + * + * This source file is free software, available under the following license: + * MIT license - http://datatables.net/license + * + * This source file is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. + * + * For details please refer to: http://www.datatables.net + */ + +/*jslint evil: true, undef: true, browser: true */ +/*globals $,require,jQuery,define,_selector_run,_selector_opts,_selector_first,_selector_row_indexes,_ext,_Api,_api_register,_api_registerPlural,_re_new_lines,_re_html,_re_formatted_numeric,_re_escape_regex,_empty,_intVal,_numToDecimal,_isNumber,_isHtml,_htmlNumeric,_pluck,_pluck_order,_range,_stripHtml,_unique,_fnBuildAjax,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnAjaxDataSrc,_fnAddColumn,_fnColumnOptions,_fnAdjustColumnSizing,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnVisbleColumns,_fnGetColumns,_fnColumnTypes,_fnApplyColumnDefs,_fnHungarianMap,_fnCamelToHungarian,_fnLanguageCompat,_fnBrowserDetect,_fnAddData,_fnAddTr,_fnNodeToDataIndex,_fnNodeToColumnIndex,_fnGetCellData,_fnSetCellData,_fnSplitObjNotation,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnGetDataMaster,_fnClearTable,_fnDeleteIndex,_fnInvalidate,_fnGetRowElements,_fnCreateTr,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAddOptionsHtml,_fnDetectHeader,_fnGetUniqueThs,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnFilterCreateSearch,_fnEscapeRegex,_fnFilterData,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnInfoMacros,_fnInitialise,_fnInitComplete,_fnLengthChange,_fnFeatureHtmlLength,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnFeatureHtmlTable,_fnScrollDraw,_fnApplyToChildren,_fnCalculateColumnWidths,_fnThrottle,_fnConvertToWidth,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnScrollBarWidth,_fnSortFlatten,_fnSort,_fnSortAria,_fnSortListener,_fnSortAttachListener,_fnSortingClasses,_fnSortData,_fnSaveState,_fnLoadState,_fnSettingsFromNode,_fnLog,_fnMap,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnLengthOverflow,_fnRenderer,_fnDataSource,_fnRowAttributes*/ + +(/** @lends <global> */function( window, document, undefined ) { + +(function( factory ) { + "use strict"; + + if ( typeof define === 'function' && define.amd ) { + // Define as an AMD module if possible + define( 'datatables', ['jquery'], factory ); + } + else if ( typeof exports === 'object' ) { + // Node/CommonJS + module.exports = factory( require( 'jquery' ) ); + } + else if ( jQuery && !jQuery.fn.dataTable ) { + // Define using browser globals otherwise + // Prevent multiple instantiations if the script is loaded twice + factory( jQuery ); + } +} +(/** @lends <global> */function( $ ) { + "use strict"; + + /** + * DataTables is a plug-in for the jQuery Javascript library. It is a highly + * flexible tool, based upon the foundations of progressive enhancement, + * which will add advanced interaction controls to any HTML table. For a + * full list of features please refer to + * [DataTables.net](href="http://datatables.net). + * + * Note that the `DataTable` object is not a global variable but is aliased + * to `jQuery.fn.DataTable` and `jQuery.fn.dataTable` through which it may + * be accessed. + * + * @class + * @param {object} [init={}] Configuration object for DataTables. Options + * are defined by {@link DataTable.defaults} + * @requires jQuery 1.7+ + * + * @example + * // Basic initialisation + * $(document).ready( function { + * $('#example').dataTable(); + * } ); + * + * @example + * // Initialisation with configuration options - in this case, disable + * // pagination and sorting. + * $(document).ready( function { + * $('#example').dataTable( { + * "paginate": false, + * "sort": false + * } ); + * } ); + */ + var DataTable; + + + /* + * It is useful to have variables which are scoped locally so only the + * DataTables functions can access them and they don't leak into global space. + * At the same time these functions are often useful over multiple files in the + * core and API, so we list, or at least document, all variables which are used + * by DataTables as private variables here. This also ensures that there is no + * clashing of variable names and that they can easily referenced for reuse. + */ + + + // Defined else where + // _selector_run + // _selector_opts + // _selector_first + // _selector_row_indexes + + var _ext; // DataTable.ext + var _Api; // DataTable.Api + var _api_register; // DataTable.Api.register + var _api_registerPlural; // DataTable.Api.registerPlural + + var _re_dic = {}; + var _re_new_lines = /[\r\n]/g; + var _re_html = /<.*?>/g; + var _re_date_start = /^[\w\+\-]/; + var _re_date_end = /[\w\+\-]$/; + + // Escape regular expression special characters + var _re_escape_regex = new RegExp( '(\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ].join('|\\') + ')', 'g' ); + + // http://en.wikipedia.org/wiki/Foreign_exchange_market + // - \u20BD - Russian ruble. + // - \u20a9 - South Korean Won + // - \u20BA - Turkish Lira + // - \u20B9 - Indian Rupee + // - R - Brazil (R$) and South Africa + // - fr - Swiss Franc + // - kr - Swedish krona, Norwegian krone and Danish krone + // - \u2009 is thin space and \u202F is narrow no-break space, both used in many + // standards as thousands separators. + var _re_formatted_numeric = /[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi; + + + var _empty = function ( d ) { + return !d || d === true || d === '-' ? true : false; + }; + + + var _intVal = function ( s ) { + var integer = parseInt( s, 10 ); + return !isNaN(integer) && isFinite(s) ? integer : null; + }; + + // Convert from a formatted number with characters other than `.` as the + // decimal place, to a Javascript number + var _numToDecimal = function ( num, decimalPoint ) { + // Cache created regular expressions for speed as this function is called often + if ( ! _re_dic[ decimalPoint ] ) { + _re_dic[ decimalPoint ] = new RegExp( _fnEscapeRegex( decimalPoint ), 'g' ); + } + return typeof num === 'string' && decimalPoint !== '.' ? + num.replace( /\./g, '' ).replace( _re_dic[ decimalPoint ], '.' ) : + num; + }; + + + var _isNumber = function ( d, decimalPoint, formatted ) { + var strType = typeof d === 'string'; + + // If empty return immediately so there must be a number if it is a + // formatted string (this stops the string "k", or "kr", etc being detected + // as a formatted number for currency + if ( _empty( d ) ) { + return true; + } + + if ( decimalPoint && strType ) { + d = _numToDecimal( d, decimalPoint ); + } + + if ( formatted && strType ) { + d = d.replace( _re_formatted_numeric, '' ); + } + + return !isNaN( parseFloat(d) ) && isFinite( d ); + }; + + + // A string without HTML in it can be considered to be HTML still + var _isHtml = function ( d ) { + return _empty( d ) || typeof d === 'string'; + }; + + + var _htmlNumeric = function ( d, decimalPoint, formatted ) { + if ( _empty( d ) ) { + return true; + } + + var html = _isHtml( d ); + return ! html ? + null : + _isNumber( _stripHtml( d ), decimalPoint, formatted ) ? + true : + null; + }; + + + var _pluck = function ( a, prop, prop2 ) { + var out = []; + var i=0, ien=a.length; + + // Could have the test in the loop for slightly smaller code, but speed + // is essential here + if ( prop2 !== undefined ) { + for ( ; i<ien ; i++ ) { + if ( a[i] && a[i][ prop ] ) { + out.push( a[i][ prop ][ prop2 ] ); + } + } + } + else { + for ( ; i<ien ; i++ ) { + if ( a[i] ) { + out.push( a[i][ prop ] ); + } + } + } + + return out; + }; + + + // Basically the same as _pluck, but rather than looping over `a` we use `order` + // as the indexes to pick from `a` + var _pluck_order = function ( a, order, prop, prop2 ) + { + var out = []; + var i=0, ien=order.length; + + // Could have the test in the loop for slightly smaller code, but speed + // is essential here + if ( prop2 !== undefined ) { + for ( ; i<ien ; i++ ) { + if ( a[ order[i] ][ prop ] ) { + out.push( a[ order[i] ][ prop ][ prop2 ] ); + } + } + } + else { + for ( ; i<ien ; i++ ) { + out.push( a[ order[i] ][ prop ] ); + } + } + + return out; + }; + + + var _range = function ( len, start ) + { + var out = []; + var end; + + if ( start === undefined ) { + start = 0; + end = len; + } + else { + end = start; + start = len; + } + + for ( var i=start ; i<end ; i++ ) { + out.push( i ); + } + + return out; + }; + + + var _removeEmpty = function ( a ) + { + var out = []; + + for ( var i=0, ien=a.length ; i<ien ; i++ ) { + if ( a[i] ) { // careful - will remove all falsy values! + out.push( a[i] ); + } + } + + return out; + }; + + + var _stripHtml = function ( d ) { + return d.replace( _re_html, '' ); + }; + + + /** + * Find the unique elements in a source array. + * + * @param {array} src Source array + * @return {array} Array of unique items + * @ignore + */ + var _unique = function ( src ) + { + // A faster unique method is to use object keys to identify used values, + // but this doesn't work with arrays or objects, which we must also + // consider. See jsperf.com/compare-array-unique-versions/4 for more + // information. + var + out = [], + val, + i, ien=src.length, + j, k=0; + + again: for ( i=0 ; i<ien ; i++ ) { + val = src[i]; + + for ( j=0 ; j<k ; j++ ) { + if ( out[j] === val ) { + continue again; + } + } + + out.push( val ); + k++; + } + + return out; + }; + + + + /** + * Create a mapping object that allows camel case parameters to be looked up + * for their Hungarian counterparts. The mapping is stored in a private + * parameter called `_hungarianMap` which can be accessed on the source object. + * @param {object} o + * @memberof DataTable#oApi + */ + function _fnHungarianMap ( o ) + { + var + hungarian = 'a aa ai ao as b fn i m o s ', + match, + newKey, + map = {}; + + $.each( o, function (key, val) { + match = key.match(/^([^A-Z]+?)([A-Z])/); + + if ( match && hungarian.indexOf(match[1]+' ') !== -1 ) + { + newKey = key.replace( match[0], match[2].toLowerCase() ); + map[ newKey ] = key; + + if ( match[1] === 'o' ) + { + _fnHungarianMap( o[key] ); + } + } + } ); + + o._hungarianMap = map; + } + + + /** + * Convert from camel case parameters to Hungarian, based on a Hungarian map + * created by _fnHungarianMap. + * @param {object} src The model object which holds all parameters that can be + * mapped. + * @param {object} user The object to convert from camel case to Hungarian. + * @param {boolean} force When set to `true`, properties which already have a + * Hungarian value in the `user` object will be overwritten. Otherwise they + * won't be. + * @memberof DataTable#oApi + */ + function _fnCamelToHungarian ( src, user, force ) + { + if ( ! src._hungarianMap ) { + _fnHungarianMap( src ); + } + + var hungarianKey; + + $.each( user, function (key, val) { + hungarianKey = src._hungarianMap[ key ]; + + if ( hungarianKey !== undefined && (force || user[hungarianKey] === undefined) ) + { + // For objects, we need to buzz down into the object to copy parameters + if ( hungarianKey.charAt(0) === 'o' ) + { + // Copy the camelCase options over to the hungarian + if ( ! user[ hungarianKey ] ) { + user[ hungarianKey ] = {}; + } + $.extend( true, user[hungarianKey], user[key] ); + + _fnCamelToHungarian( src[hungarianKey], user[hungarianKey], force ); + } + else { + user[hungarianKey] = user[ key ]; + } + } + } ); + } + + + /** + * Language compatibility - when certain options are given, and others aren't, we + * need to duplicate the values over, in order to provide backwards compatibility + * with older language files. + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnLanguageCompat( lang ) + { + var defaults = DataTable.defaults.oLanguage; + var zeroRecords = lang.sZeroRecords; + + /* Backwards compatibility - if there is no sEmptyTable given, then use the same as + * sZeroRecords - assuming that is given. + */ + if ( ! lang.sEmptyTable && zeroRecords && + defaults.sEmptyTable === "No data available in table" ) + { + _fnMap( lang, lang, 'sZeroRecords', 'sEmptyTable' ); + } + + /* Likewise with loading records */ + if ( ! lang.sLoadingRecords && zeroRecords && + defaults.sLoadingRecords === "Loading..." ) + { + _fnMap( lang, lang, 'sZeroRecords', 'sLoadingRecords' ); + } + + // Old parameter name of the thousands separator mapped onto the new + if ( lang.sInfoThousands ) { + lang.sThousands = lang.sInfoThousands; + } + + var decimal = lang.sDecimal; + if ( decimal ) { + _addNumericSort( decimal ); + } + } + + + /** + * Map one parameter onto another + * @param {object} o Object to map + * @param {*} knew The new parameter name + * @param {*} old The old parameter name + */ + var _fnCompatMap = function ( o, knew, old ) { + if ( o[ knew ] !== undefined ) { + o[ old ] = o[ knew ]; + } + }; + + + /** + * Provide backwards compatibility for the main DT options. Note that the new + * options are mapped onto the old parameters, so this is an external interface + * change only. + * @param {object} init Object to map + */ + function _fnCompatOpts ( init ) + { + _fnCompatMap( init, 'ordering', 'bSort' ); + _fnCompatMap( init, 'orderMulti', 'bSortMulti' ); + _fnCompatMap( init, 'orderClasses', 'bSortClasses' ); + _fnCompatMap( init, 'orderCellsTop', 'bSortCellsTop' ); + _fnCompatMap( init, 'order', 'aaSorting' ); + _fnCompatMap( init, 'orderFixed', 'aaSortingFixed' ); + _fnCompatMap( init, 'paging', 'bPaginate' ); + _fnCompatMap( init, 'pagingType', 'sPaginationType' ); + _fnCompatMap( init, 'pageLength', 'iDisplayLength' ); + _fnCompatMap( init, 'searching', 'bFilter' ); + + // Column search objects are in an array, so it needs to be converted + // element by element + var searchCols = init.aoSearchCols; + + if ( searchCols ) { + for ( var i=0, ien=searchCols.length ; i<ien ; i++ ) { + if ( searchCols[i] ) { + _fnCamelToHungarian( DataTable.models.oSearch, searchCols[i] ); + } + } + } + } + + + /** + * Provide backwards compatibility for column options. Note that the new options + * are mapped onto the old parameters, so this is an external interface change + * only. + * @param {object} init Object to map + */ + function _fnCompatCols ( init ) + { + _fnCompatMap( init, 'orderable', 'bSortable' ); + _fnCompatMap( init, 'orderData', 'aDataSort' ); + _fnCompatMap( init, 'orderSequence', 'asSorting' ); + _fnCompatMap( init, 'orderDataType', 'sortDataType' ); + + // orderData can be given as an integer + var dataSort = init.aDataSort; + if ( dataSort && ! $.isArray( dataSort ) ) { + init.aDataSort = [ dataSort ]; + } + } + + + /** + * Browser feature detection for capabilities, quirks + * @param {object} settings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnBrowserDetect( settings ) + { + var browser = settings.oBrowser; + + // Scrolling feature / quirks detection + var n = $('<div/>') + .css( { + position: 'absolute', + top: 0, + left: 0, + height: 1, + width: 1, + overflow: 'hidden' + } ) + .append( + $('<div/>') + .css( { + position: 'absolute', + top: 1, + left: 1, + width: 100, + overflow: 'scroll' + } ) + .append( + $('<div class="test"/>') + .css( { + width: '100%', + height: 10 + } ) + ) + ) + .appendTo( 'body' ); + + var test = n.find('.test'); + + // IE6/7 will oversize a width 100% element inside a scrolling element, to + // include the width of the scrollbar, while other browsers ensure the inner + // element is contained without forcing scrolling + browser.bScrollOversize = test[0].offsetWidth === 100; + + // In rtl text layout, some browsers (most, but not all) will place the + // scrollbar on the left, rather than the right. + browser.bScrollbarLeft = Math.round( test.offset().left ) !== 1; + + n.remove(); + } + + + /** + * Array.prototype reduce[Right] method, used for browsers which don't support + * JS 1.6. Done this way to reduce code size, since we iterate either way + * @param {object} settings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnReduce ( that, fn, init, start, end, inc ) + { + var + i = start, + value, + isSet = false; + + if ( init !== undefined ) { + value = init; + isSet = true; + } + + while ( i !== end ) { + if ( ! that.hasOwnProperty(i) ) { + continue; + } + + value = isSet ? + fn( value, that[i], i, that ) : + that[i]; + + isSet = true; + i += inc; + } + + return value; + } + + /** + * Add a column to the list used for the table with default values + * @param {object} oSettings dataTables settings object + * @param {node} nTh The th element for this column + * @memberof DataTable#oApi + */ + function _fnAddColumn( oSettings, nTh ) + { + // Add column to aoColumns array + var oDefaults = DataTable.defaults.column; + var iCol = oSettings.aoColumns.length; + var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, { + "nTh": nTh ? nTh : document.createElement('th'), + "sTitle": oDefaults.sTitle ? oDefaults.sTitle : nTh ? nTh.innerHTML : '', + "aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol], + "mData": oDefaults.mData ? oDefaults.mData : iCol, + idx: iCol + } ); + oSettings.aoColumns.push( oCol ); + + // Add search object for column specific search. Note that the `searchCols[ iCol ]` + // passed into extend can be undefined. This allows the user to give a default + // with only some of the parameters defined, and also not give a default + var searchCols = oSettings.aoPreSearchCols; + searchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch, searchCols[ iCol ] ); + + // Use the default column options function to initialise classes etc + _fnColumnOptions( oSettings, iCol, $(nTh).data() ); + } + + + /** + * Apply options for a column + * @param {object} oSettings dataTables settings object + * @param {int} iCol column index to consider + * @param {object} oOptions object with sType, bVisible and bSearchable etc + * @memberof DataTable#oApi + */ + function _fnColumnOptions( oSettings, iCol, oOptions ) + { + var oCol = oSettings.aoColumns[ iCol ]; + var oClasses = oSettings.oClasses; + var th = $(oCol.nTh); + + // Try to get width information from the DOM. We can't get it from CSS + // as we'd need to parse the CSS stylesheet. `width` option can override + if ( ! oCol.sWidthOrig ) { + // Width attribute + oCol.sWidthOrig = th.attr('width') || null; + + // Style attribute + var t = (th.attr('style') || '').match(/width:\s*(\d+[pxem%]+)/); + if ( t ) { + oCol.sWidthOrig = t[1]; + } + } + + /* User specified column options */ + if ( oOptions !== undefined && oOptions !== null ) + { + // Backwards compatibility + _fnCompatCols( oOptions ); + + // Map camel case parameters to their Hungarian counterparts + _fnCamelToHungarian( DataTable.defaults.column, oOptions ); + + /* Backwards compatibility for mDataProp */ + if ( oOptions.mDataProp !== undefined && !oOptions.mData ) + { + oOptions.mData = oOptions.mDataProp; + } + + if ( oOptions.sType ) + { + oCol._sManualType = oOptions.sType; + } + + // `class` is a reserved word in Javascript, so we need to provide + // the ability to use a valid name for the camel case input + if ( oOptions.className && ! oOptions.sClass ) + { + oOptions.sClass = oOptions.className; + } + + $.extend( oCol, oOptions ); + _fnMap( oCol, oOptions, "sWidth", "sWidthOrig" ); + + /* iDataSort to be applied (backwards compatibility), but aDataSort will take + * priority if defined + */ + if ( oOptions.iDataSort !== undefined ) + { + oCol.aDataSort = [ oOptions.iDataSort ]; + } + _fnMap( oCol, oOptions, "aDataSort" ); + } + + /* Cache the data get and set functions for speed */ + var mDataSrc = oCol.mData; + var mData = _fnGetObjectDataFn( mDataSrc ); + var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null; + + var attrTest = function( src ) { + return typeof src === 'string' && src.indexOf('@') !== -1; + }; + oCol._bAttrSrc = $.isPlainObject( mDataSrc ) && ( + attrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter) + ); + + oCol.fnGetData = function (rowData, type, meta) { + var innerData = mData( rowData, type, undefined, meta ); + + return mRender && type ? + mRender( innerData, type, rowData, meta ) : + innerData; + }; + oCol.fnSetData = function ( rowData, val, meta ) { + return _fnSetObjectDataFn( mDataSrc )( rowData, val, meta ); + }; + + // Indicate if DataTables should read DOM data as an object or array + // Used in _fnGetRowElements + if ( typeof mDataSrc !== 'number' ) { + oSettings._rowReadObject = true; + } + + /* Feature sorting overrides column specific when off */ + if ( !oSettings.oFeatures.bSort ) + { + oCol.bSortable = false; + th.addClass( oClasses.sSortableNone ); // Have to add class here as order event isn't called + } + + /* Check that the class assignment is correct for sorting */ + var bAsc = $.inArray('asc', oCol.asSorting) !== -1; + var bDesc = $.inArray('desc', oCol.asSorting) !== -1; + if ( !oCol.bSortable || (!bAsc && !bDesc) ) + { + oCol.sSortingClass = oClasses.sSortableNone; + oCol.sSortingClassJUI = ""; + } + else if ( bAsc && !bDesc ) + { + oCol.sSortingClass = oClasses.sSortableAsc; + oCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed; + } + else if ( !bAsc && bDesc ) + { + oCol.sSortingClass = oClasses.sSortableDesc; + oCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed; + } + else + { + oCol.sSortingClass = oClasses.sSortable; + oCol.sSortingClassJUI = oClasses.sSortJUI; + } + } + + + /** + * Adjust the table column widths for new data. Note: you would probably want to + * do a redraw after calling this function! + * @param {object} settings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnAdjustColumnSizing ( settings ) + { + /* Not interested in doing column width calculation if auto-width is disabled */ + if ( settings.oFeatures.bAutoWidth !== false ) + { + var columns = settings.aoColumns; + + _fnCalculateColumnWidths( settings ); + for ( var i=0 , iLen=columns.length ; i<iLen ; i++ ) + { + columns[i].nTh.style.width = columns[i].sWidth; + } + } + + var scroll = settings.oScroll; + if ( scroll.sY !== '' || scroll.sX !== '') + { + _fnScrollDraw( settings ); + } + + _fnCallbackFire( settings, null, 'column-sizing', [settings] ); + } + + + /** + * Covert the index of a visible column to the index in the data array (take account + * of hidden columns) + * @param {object} oSettings dataTables settings object + * @param {int} iMatch Visible column index to lookup + * @returns {int} i the data index + * @memberof DataTable#oApi + */ + function _fnVisibleToColumnIndex( oSettings, iMatch ) + { + var aiVis = _fnGetColumns( oSettings, 'bVisible' ); + + return typeof aiVis[iMatch] === 'number' ? + aiVis[iMatch] : + null; + } + + + /** + * Covert the index of an index in the data array and convert it to the visible + * column index (take account of hidden columns) + * @param {int} iMatch Column index to lookup + * @param {object} oSettings dataTables settings object + * @returns {int} i the data index + * @memberof DataTable#oApi + */ + function _fnColumnIndexToVisible( oSettings, iMatch ) + { + var aiVis = _fnGetColumns( oSettings, 'bVisible' ); + var iPos = $.inArray( iMatch, aiVis ); + + return iPos !== -1 ? iPos : null; + } + + + /** + * Get the number of visible columns + * @param {object} oSettings dataTables settings object + * @returns {int} i the number of visible columns + * @memberof DataTable#oApi + */ + function _fnVisbleColumns( oSettings ) + { + return _fnGetColumns( oSettings, 'bVisible' ).length; + } + + + /** + * Get an array of column indexes that match a given property + * @param {object} oSettings dataTables settings object + * @param {string} sParam Parameter in aoColumns to look for - typically + * bVisible or bSearchable + * @returns {array} Array of indexes with matched properties + * @memberof DataTable#oApi + */ + function _fnGetColumns( oSettings, sParam ) + { + var a = []; + + $.map( oSettings.aoColumns, function(val, i) { + if ( val[sParam] ) { + a.push( i ); + } + } ); + + return a; + } + + + /** + * Calculate the 'type' of a column + * @param {object} settings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnColumnTypes ( settings ) + { + var columns = settings.aoColumns; + var data = settings.aoData; + var types = DataTable.ext.type.detect; + var i, ien, j, jen, k, ken; + var col, cell, detectedType, cache; + + // For each column, spin over the + for ( i=0, ien=columns.length ; i<ien ; i++ ) { + col = columns[i]; + cache = []; + + if ( ! col.sType && col._sManualType ) { + col.sType = col._sManualType; + } + else if ( ! col.sType ) { + for ( j=0, jen=types.length ; j<jen ; j++ ) { + for ( k=0, ken=data.length ; k<ken ; k++ ) { + // Use a cache array so we only need to get the type data + // from the formatter once (when using multiple detectors) + if ( cache[k] === undefined ) { + cache[k] = _fnGetCellData( settings, k, i, 'type' ); + } + + detectedType = types[j]( cache[k], settings ); + + // If null, then this type can't apply to this column, so + // rather than testing all cells, break out. There is an + // exception for the last type which is `html`. We need to + // scan all rows since it is possible to mix string and HTML + // types + if ( ! detectedType && j !== types.length-1 ) { + break; + } + + // Only a single match is needed for html type since it is + // bottom of the pile and very similar to string + if ( detectedType === 'html' ) { + break; + } + } + + // Type is valid for all data points in the column - use this + // type + if ( detectedType ) { + col.sType = detectedType; + break; + } + } + + // Fall back - if no type was detected, always use string + if ( ! col.sType ) { + col.sType = 'string'; + } + } + } + } + + + /** + * Take the column definitions and static columns arrays and calculate how + * they relate to column indexes. The callback function will then apply the + * definition found for a column to a suitable configuration object. + * @param {object} oSettings dataTables settings object + * @param {array} aoColDefs The aoColumnDefs array that is to be applied + * @param {array} aoCols The aoColumns array that defines columns individually + * @param {function} fn Callback function - takes two parameters, the calculated + * column index and the definition for that column. + * @memberof DataTable#oApi + */ + function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn ) + { + var i, iLen, j, jLen, k, kLen, def; + var columns = oSettings.aoColumns; + + // Column definitions with aTargets + if ( aoColDefs ) + { + /* Loop over the definitions array - loop in reverse so first instance has priority */ + for ( i=aoColDefs.length-1 ; i>=0 ; i-- ) + { + def = aoColDefs[i]; + + /* Each definition can target multiple columns, as it is an array */ + var aTargets = def.targets !== undefined ? + def.targets : + def.aTargets; + + if ( ! $.isArray( aTargets ) ) + { + aTargets = [ aTargets ]; + } + + for ( j=0, jLen=aTargets.length ; j<jLen ; j++ ) + { + if ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 ) + { + /* Add columns that we don't yet know about */ + while( columns.length <= aTargets[j] ) + { + _fnAddColumn( oSettings ); + } + + /* Integer, basic index */ + fn( aTargets[j], def ); + } + else if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 ) + { + /* Negative integer, right to left column counting */ + fn( columns.length+aTargets[j], def ); + } + else if ( typeof aTargets[j] === 'string' ) + { + /* Class name matching on TH element */ + for ( k=0, kLen=columns.length ; k<kLen ; k++ ) + { + if ( aTargets[j] == "_all" || + $(columns[k].nTh).hasClass( aTargets[j] ) ) + { + fn( k, def ); + } + } + } + } + } + } + + // Statically defined columns array + if ( aoCols ) + { + for ( i=0, iLen=aoCols.length ; i<iLen ; i++ ) + { + fn( i, aoCols[i] ); + } + } + } + + /** + * Add a data array to the table, creating DOM node etc. This is the parallel to + * _fnGatherData, but for adding rows from a Javascript source, rather than a + * DOM source. + * @param {object} oSettings dataTables settings object + * @param {array} aData data array to be added + * @param {node} [nTr] TR element to add to the table - optional. If not given, + * DataTables will create a row automatically + * @param {array} [anTds] Array of TD|TH elements for the row - must be given + * if nTr is. + * @returns {int} >=0 if successful (index of new aoData entry), -1 if failed + * @memberof DataTable#oApi + */ + function _fnAddData ( oSettings, aDataIn, nTr, anTds ) + { + /* Create the object for storing information about this new row */ + var iRow = oSettings.aoData.length; + var oData = $.extend( true, {}, DataTable.models.oRow, { + src: nTr ? 'dom' : 'data' + } ); + + oData._aData = aDataIn; + oSettings.aoData.push( oData ); + + /* Create the cells */ + var nTd, sThisType; + var columns = oSettings.aoColumns; + for ( var i=0, iLen=columns.length ; i<iLen ; i++ ) + { + // When working with a row, the data source object must be populated. In + // all other cases, the data source object is already populated, so we + // don't overwrite it, which might break bindings etc + if ( nTr ) { + _fnSetCellData( oSettings, iRow, i, _fnGetCellData( oSettings, iRow, i ) ); + } + columns[i].sType = null; + } + + /* Add to the display array */ + oSettings.aiDisplayMaster.push( iRow ); + + /* Create the DOM information, or register it if already present */ + if ( nTr || ! oSettings.oFeatures.bDeferRender ) + { + _fnCreateTr( oSettings, iRow, nTr, anTds ); + } + + return iRow; + } + + + /** + * Add one or more TR elements to the table. Generally we'd expect to + * use this for reading data from a DOM sourced table, but it could be + * used for an TR element. Note that if a TR is given, it is used (i.e. + * it is not cloned). + * @param {object} settings dataTables settings object + * @param {array|node|jQuery} trs The TR element(s) to add to the table + * @returns {array} Array of indexes for the added rows + * @memberof DataTable#oApi + */ + function _fnAddTr( settings, trs ) + { + var row; + + // Allow an individual node to be passed in + if ( ! (trs instanceof $) ) { + trs = $(trs); + } + + return trs.map( function (i, el) { + row = _fnGetRowElements( settings, el ); + return _fnAddData( settings, row.data, el, row.cells ); + } ); + } + + + /** + * Take a TR element and convert it to an index in aoData + * @param {object} oSettings dataTables settings object + * @param {node} n the TR element to find + * @returns {int} index if the node is found, null if not + * @memberof DataTable#oApi + */ + function _fnNodeToDataIndex( oSettings, n ) + { + return (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null; + } + + + /** + * Take a TD element and convert it into a column data index (not the visible index) + * @param {object} oSettings dataTables settings object + * @param {int} iRow The row number the TD/TH can be found in + * @param {node} n The TD/TH element to find + * @returns {int} index if the node is found, -1 if not + * @memberof DataTable#oApi + */ + function _fnNodeToColumnIndex( oSettings, iRow, n ) + { + return $.inArray( n, oSettings.aoData[ iRow ].anCells ); + } + + + /** + * Get the data for a given cell from the internal cache, taking into account data mapping + * @param {object} settings dataTables settings object + * @param {int} rowIdx aoData row id + * @param {int} colIdx Column index + * @param {string} type data get type ('display', 'type' 'filter' 'sort') + * @returns {*} Cell data + * @memberof DataTable#oApi + */ + function _fnGetCellData( settings, rowIdx, colIdx, type ) + { + var draw = settings.iDraw; + var col = settings.aoColumns[colIdx]; + var rowData = settings.aoData[rowIdx]._aData; + var defaultContent = col.sDefaultContent; + var cellData = col.fnGetData( rowData, type, { + settings: settings, + row: rowIdx, + col: colIdx + } ); + + if ( cellData === undefined ) { + if ( settings.iDrawError != draw && defaultContent === null ) { + _fnLog( settings, 0, "Requested unknown parameter "+ + (typeof col.mData=='function' ? '{function}' : "'"+col.mData+"'")+ + " for row "+rowIdx, 4 ); + settings.iDrawError = draw; + } + return defaultContent; + } + + /* When the data source is null, we can use default column data */ + if ( (cellData === rowData || cellData === null) && defaultContent !== null ) { + cellData = defaultContent; + } + else if ( typeof cellData === 'function' ) { + // If the data source is a function, then we run it and use the return, + // executing in the scope of the data object (for instances) + return cellData.call( rowData ); + } + + if ( cellData === null && type == 'display' ) { + return ''; + } + return cellData; + } + + + /** + * Set the value for a specific cell, into the internal data cache + * @param {object} settings dataTables settings object + * @param {int} rowIdx aoData row id + * @param {int} colIdx Column index + * @param {*} val Value to set + * @memberof DataTable#oApi + */ + function _fnSetCellData( settings, rowIdx, colIdx, val ) + { + var col = settings.aoColumns[colIdx]; + var rowData = settings.aoData[rowIdx]._aData; + + col.fnSetData( rowData, val, { + settings: settings, + row: rowIdx, + col: colIdx + } ); + } + + + // Private variable that is used to match action syntax in the data property object + var __reArray = /\[.*?\]$/; + var __reFn = /\(\)$/; + + /** + * Split string on periods, taking into account escaped periods + * @param {string} str String to split + * @return {array} Split string + */ + function _fnSplitObjNotation( str ) + { + return $.map( str.match(/(\\.|[^\.])+/g), function ( s ) { + return s.replace(/\\./g, '.'); + } ); + } + + + /** + * Return a function that can be used to get data from a source object, taking + * into account the ability to use nested objects as a source + * @param {string|int|function} mSource The data source for the object + * @returns {function} Data get function + * @memberof DataTable#oApi + */ + function _fnGetObjectDataFn( mSource ) + { + if ( $.isPlainObject( mSource ) ) + { + /* Build an object of get functions, and wrap them in a single call */ + var o = {}; + $.each( mSource, function (key, val) { + if ( val ) { + o[key] = _fnGetObjectDataFn( val ); + } + } ); + + return function (data, type, row, meta) { + var t = o[type] || o._; + return t !== undefined ? + t(data, type, row, meta) : + data; + }; + } + else if ( mSource === null ) + { + /* Give an empty string for rendering / sorting etc */ + return function (data) { // type, row and meta also passed, but not used + return data; + }; + } + else if ( typeof mSource === 'function' ) + { + return function (data, type, row, meta) { + return mSource( data, type, row, meta ); + }; + } + else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || + mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) ) + { + /* If there is a . in the source string then the data source is in a + * nested object so we loop over the data for each level to get the next + * level down. On each loop we test for undefined, and if found immediately + * return. This allows entire objects to be missing and sDefaultContent to + * be used if defined, rather than throwing an error + */ + var fetchData = function (data, type, src) { + var arrayNotation, funcNotation, out, innerSrc; + + if ( src !== "" ) + { + var a = _fnSplitObjNotation( src ); + + for ( var i=0, iLen=a.length ; i<iLen ; i++ ) + { + // Check if we are dealing with special notation + arrayNotation = a[i].match(__reArray); + funcNotation = a[i].match(__reFn); + + if ( arrayNotation ) + { + // Array notation + a[i] = a[i].replace(__reArray, ''); + + // Condition allows simply [] to be passed in + if ( a[i] !== "" ) { + data = data[ a[i] ]; + } + out = []; + + // Get the remainder of the nested object to get + a.splice( 0, i+1 ); + innerSrc = a.join('.'); + + // Traverse each entry in the array getting the properties requested + for ( var j=0, jLen=data.length ; j<jLen ; j++ ) { + out.push( fetchData( data[j], type, innerSrc ) ); + } + + // If a string is given in between the array notation indicators, that + // is used to join the strings together, otherwise an array is returned + var join = arrayNotation[0].substring(1, arrayNotation[0].length-1); + data = (join==="") ? out : out.join(join); + + // The inner call to fetchData has already traversed through the remainder + // of the source requested, so we exit from the loop + break; + } + else if ( funcNotation ) + { + // Function call + a[i] = a[i].replace(__reFn, ''); + data = data[ a[i] ](); + continue; + } + + if ( data === null || data[ a[i] ] === undefined ) + { + return undefined; + } + data = data[ a[i] ]; + } + } + + return data; + }; + + return function (data, type) { // row and meta also passed, but not used + return fetchData( data, type, mSource ); + }; + } + else + { + /* Array or flat object mapping */ + return function (data, type) { // row and meta also passed, but not used + return data[mSource]; + }; + } + } + + + /** + * Return a function that can be used to set data from a source object, taking + * into account the ability to use nested objects as a source + * @param {string|int|function} mSource The data source for the object + * @returns {function} Data set function + * @memberof DataTable#oApi + */ + function _fnSetObjectDataFn( mSource ) + { + if ( $.isPlainObject( mSource ) ) + { + /* Unlike get, only the underscore (global) option is used for for + * setting data since we don't know the type here. This is why an object + * option is not documented for `mData` (which is read/write), but it is + * for `mRender` which is read only. + */ + return _fnSetObjectDataFn( mSource._ ); + } + else if ( mSource === null ) + { + /* Nothing to do when the data source is null */ + return function () {}; + } + else if ( typeof mSource === 'function' ) + { + return function (data, val, meta) { + mSource( data, 'set', val, meta ); + }; + } + else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || + mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) ) + { + /* Like the get, we need to get data from a nested object */ + var setData = function (data, val, src) { + var a = _fnSplitObjNotation( src ), b; + var aLast = a[a.length-1]; + var arrayNotation, funcNotation, o, innerSrc; + + for ( var i=0, iLen=a.length-1 ; i<iLen ; i++ ) + { + // Check if we are dealing with an array notation request + arrayNotation = a[i].match(__reArray); + funcNotation = a[i].match(__reFn); + + if ( arrayNotation ) + { + a[i] = a[i].replace(__reArray, ''); + data[ a[i] ] = []; + + // Get the remainder of the nested object to set so we can recurse + b = a.slice(); + b.splice( 0, i+1 ); + innerSrc = b.join('.'); + + // Traverse each entry in the array setting the properties requested + for ( var j=0, jLen=val.length ; j<jLen ; j++ ) + { + o = {}; + setData( o, val[j], innerSrc ); + data[ a[i] ].push( o ); + } + + // The inner call to setData has already traversed through the remainder + // of the source and has set the data, thus we can exit here + return; + } + else if ( funcNotation ) + { + // Function call + a[i] = a[i].replace(__reFn, ''); + data = data[ a[i] ]( val ); + } + + // If the nested object doesn't currently exist - since we are + // trying to set the value - create it + if ( data[ a[i] ] === null || data[ a[i] ] === undefined ) + { + data[ a[i] ] = {}; + } + data = data[ a[i] ]; + } + + // Last item in the input - i.e, the actual set + if ( aLast.match(__reFn ) ) + { + // Function call + data = data[ aLast.replace(__reFn, '') ]( val ); + } + else + { + // If array notation is used, we just want to strip it and use the property name + // and assign the value. If it isn't used, then we get the result we want anyway + data[ aLast.replace(__reArray, '') ] = val; + } + }; + + return function (data, val) { // meta is also passed in, but not used + return setData( data, val, mSource ); + }; + } + else + { + /* Array or flat object mapping */ + return function (data, val) { // meta is also passed in, but not used + data[mSource] = val; + }; + } + } + + + /** + * Return an array with the full table data + * @param {object} oSettings dataTables settings object + * @returns array {array} aData Master data array + * @memberof DataTable#oApi + */ + function _fnGetDataMaster ( settings ) + { + return _pluck( settings.aoData, '_aData' ); + } + + + /** + * Nuke the table + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnClearTable( settings ) + { + settings.aoData.length = 0; + settings.aiDisplayMaster.length = 0; + settings.aiDisplay.length = 0; + } + + + /** + * Take an array of integers (index array) and remove a target integer (value - not + * the key!) + * @param {array} a Index array to target + * @param {int} iTarget value to find + * @memberof DataTable#oApi + */ + function _fnDeleteIndex( a, iTarget, splice ) + { + var iTargetIndex = -1; + + for ( var i=0, iLen=a.length ; i<iLen ; i++ ) + { + if ( a[i] == iTarget ) + { + iTargetIndex = i; + } + else if ( a[i] > iTarget ) + { + a[i]--; + } + } + + if ( iTargetIndex != -1 && splice === undefined ) + { + a.splice( iTargetIndex, 1 ); + } + } + + + /** + * Mark cached data as invalid such that a re-read of the data will occur when + * the cached data is next requested. Also update from the data source object. + * + * @param {object} settings DataTables settings object + * @param {int} rowIdx Row index to invalidate + * @param {string} [src] Source to invalidate from: undefined, 'auto', 'dom' + * or 'data' + * @param {int} [colIdx] Column index to invalidate. If undefined the whole + * row will be invalidated + * @memberof DataTable#oApi + * + * @todo For the modularisation of v1.11 this will need to become a callback, so + * the sort and filter methods can subscribe to it. That will required + * initialisation options for sorting, which is why it is not already baked in + */ + function _fnInvalidate( settings, rowIdx, src, colIdx ) + { + var row = settings.aoData[ rowIdx ]; + var i, ien; + var cellWrite = function ( cell, col ) { + // This is very frustrating, but in IE if you just write directly + // to innerHTML, and elements that are overwritten are GC'ed, + // even if there is a reference to them elsewhere + while ( cell.childNodes.length ) { + cell.removeChild( cell.firstChild ); + } + + cell.innerHTML = _fnGetCellData( settings, rowIdx, col, 'display' ); + }; + + // Are we reading last data from DOM or the data object? + if ( src === 'dom' || ((! src || src === 'auto') && row.src === 'dom') ) { + // Read the data from the DOM + row._aData = _fnGetRowElements( + settings, row, colIdx, colIdx === undefined ? undefined : row._aData + ) + .data; + } + else { + // Reading from data object, update the DOM + var cells = row.anCells; + + if ( cells ) { + if ( colIdx !== undefined ) { + cellWrite( cells[colIdx], colIdx ); + } + else { + for ( i=0, ien=cells.length ; i<ien ; i++ ) { + cellWrite( cells[i], i ); + } + } + } + } + + // For both row and cell invalidation, the cached data for sorting and + // filtering is nulled out + row._aSortData = null; + row._aFilterData = null; + + // Invalidate the type for a specific column (if given) or all columns since + // the data might have changed + var cols = settings.aoColumns; + if ( colIdx !== undefined ) { + cols[ colIdx ].sType = null; + } + else { + for ( i=0, ien=cols.length ; i<ien ; i++ ) { + cols[i].sType = null; + } + + // Update DataTables special `DT_*` attributes for the row + _fnRowAttributes( row ); + } + } + + + /** + * Build a data source object from an HTML row, reading the contents of the + * cells that are in the row. + * + * @param {object} settings DataTables settings object + * @param {node|object} TR element from which to read data or existing row + * object from which to re-read the data from the cells + * @param {int} [colIdx] Optional column index + * @param {array|object} [d] Data source object. If `colIdx` is given then this + * parameter should also be given and will be used to write the data into. + * Only the column in question will be written + * @returns {object} Object with two parameters: `data` the data read, in + * document order, and `cells` and array of nodes (they can be useful to the + * caller, so rather than needing a second traversal to get them, just return + * them from here). + * @memberof DataTable#oApi + */ + function _fnGetRowElements( settings, row, colIdx, d ) + { + var + tds = [], + td = row.firstChild, + name, col, o, i=0, contents, + columns = settings.aoColumns, + objectRead = settings._rowReadObject; + + // Allow the data object to be passed in, or construct + d = d || objectRead ? {} : []; + + var attr = function ( str, td ) { + if ( typeof str === 'string' ) { + var idx = str.indexOf('@'); + + if ( idx !== -1 ) { + var attr = str.substring( idx+1 ); + var setter = _fnSetObjectDataFn( str ); + setter( d, td.getAttribute( attr ) ); + } + } + }; + + // Read data from a cell and store into the data object + var cellProcess = function ( cell ) { + if ( colIdx === undefined || colIdx === i ) { + col = columns[i]; + contents = $.trim(cell.innerHTML); + + if ( col && col._bAttrSrc ) { + var setter = _fnSetObjectDataFn( col.mData._ ); + setter( d, contents ); + + attr( col.mData.sort, cell ); + attr( col.mData.type, cell ); + attr( col.mData.filter, cell ); + } + else { + // Depending on the `data` option for the columns the data can + // be read to either an object or an array. + if ( objectRead ) { + if ( ! col._setter ) { + // Cache the setter function + col._setter = _fnSetObjectDataFn( col.mData ); + } + col._setter( d, contents ); + } + else { + d[i] = contents; + } + } + } + + i++; + }; + + if ( td ) { + // `tr` element was passed in + while ( td ) { + name = td.nodeName.toUpperCase(); + + if ( name == "TD" || name == "TH" ) { + cellProcess( td ); + tds.push( td ); + } + + td = td.nextSibling; + } + } + else { + // Existing row object passed in + tds = row.anCells; + + for ( var j=0, jen=tds.length ; j<jen ; j++ ) { + cellProcess( tds[j] ); + } + } + + return { + data: d, + cells: tds + }; + } + /** + * Create a new TR element (and it's TD children) for a row + * @param {object} oSettings dataTables settings object + * @param {int} iRow Row to consider + * @param {node} [nTrIn] TR element to add to the table - optional. If not given, + * DataTables will create a row automatically + * @param {array} [anTds] Array of TD|TH elements for the row - must be given + * if nTr is. + * @memberof DataTable#oApi + */ + function _fnCreateTr ( oSettings, iRow, nTrIn, anTds ) + { + var + row = oSettings.aoData[iRow], + rowData = row._aData, + cells = [], + nTr, nTd, oCol, + i, iLen; + + if ( row.nTr === null ) + { + nTr = nTrIn || document.createElement('tr'); + + row.nTr = nTr; + row.anCells = cells; + + /* Use a private property on the node to allow reserve mapping from the node + * to the aoData array for fast look up + */ + nTr._DT_RowIndex = iRow; + + /* Special parameters can be given by the data source to be used on the row */ + _fnRowAttributes( row ); + + /* Process each column */ + for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) + { + oCol = oSettings.aoColumns[i]; + + nTd = nTrIn ? anTds[i] : document.createElement( oCol.sCellType ); + cells.push( nTd ); + + // Need to create the HTML if new, or if a rendering function is defined + if ( !nTrIn || oCol.mRender || oCol.mData !== i ) + { + nTd.innerHTML = _fnGetCellData( oSettings, iRow, i, 'display' ); + } + + /* Add user defined class */ + if ( oCol.sClass ) + { + nTd.className += ' '+oCol.sClass; + } + + // Visibility - add or remove as required + if ( oCol.bVisible && ! nTrIn ) + { + nTr.appendChild( nTd ); + } + else if ( ! oCol.bVisible && nTrIn ) + { + nTd.parentNode.removeChild( nTd ); + } + + if ( oCol.fnCreatedCell ) + { + oCol.fnCreatedCell.call( oSettings.oInstance, + nTd, _fnGetCellData( oSettings, iRow, i ), rowData, iRow, i + ); + } + } + + _fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow] ); + } + + // Remove once webkit bug 131819 and Chromium bug 365619 have been resolved + // and deployed + row.nTr.setAttribute( 'role', 'row' ); + } + + + /** + * Add attributes to a row based on the special `DT_*` parameters in a data + * source object. + * @param {object} DataTables row object for the row to be modified + * @memberof DataTable#oApi + */ + function _fnRowAttributes( row ) + { + var tr = row.nTr; + var data = row._aData; + + if ( tr ) { + if ( data.DT_RowId ) { + tr.id = data.DT_RowId; + } + + if ( data.DT_RowClass ) { + // Remove any classes added by DT_RowClass before + var a = data.DT_RowClass.split(' '); + row.__rowc = row.__rowc ? + _unique( row.__rowc.concat( a ) ) : + a; + + $(tr) + .removeClass( row.__rowc.join(' ') ) + .addClass( data.DT_RowClass ); + } + + if ( data.DT_RowAttr ) { + $(tr).attr( data.DT_RowAttr ); + } + + if ( data.DT_RowData ) { + $(tr).data( data.DT_RowData ); + } + } + } + + + /** + * Create the HTML header for the table + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnBuildHead( oSettings ) + { + var i, ien, cell, row, column; + var thead = oSettings.nTHead; + var tfoot = oSettings.nTFoot; + var createHeader = $('th, td', thead).length === 0; + var classes = oSettings.oClasses; + var columns = oSettings.aoColumns; + + if ( createHeader ) { + row = $('<tr/>').appendTo( thead ); + } + + for ( i=0, ien=columns.length ; i<ien ; i++ ) { + column = columns[i]; + cell = $( column.nTh ).addClass( column.sClass ); + + if ( createHeader ) { + cell.appendTo( row ); + } + + // 1.11 move into sorting + if ( oSettings.oFeatures.bSort ) { + cell.addClass( column.sSortingClass ); + + if ( column.bSortable !== false ) { + cell + .attr( 'tabindex', oSettings.iTabIndex ) + .attr( 'aria-controls', oSettings.sTableId ); + + _fnSortAttachListener( oSettings, column.nTh, i ); + } + } + + if ( column.sTitle != cell.html() ) { + cell.html( column.sTitle ); + } + + _fnRenderer( oSettings, 'header' )( + oSettings, cell, column, classes + ); + } + + if ( createHeader ) { + _fnDetectHeader( oSettings.aoHeader, thead ); + } + + /* ARIA role for the rows */ + $(thead).find('>tr').attr('role', 'row'); + + /* Deal with the footer - add classes if required */ + $(thead).find('>tr>th, >tr>td').addClass( classes.sHeaderTH ); + $(tfoot).find('>tr>th, >tr>td').addClass( classes.sFooterTH ); + + // Cache the footer cells. Note that we only take the cells from the first + // row in the footer. If there is more than one row the user wants to + // interact with, they need to use the table().foot() method. Note also this + // allows cells to be used for multiple columns using colspan + if ( tfoot !== null ) { + var cells = oSettings.aoFooter[0]; + + for ( i=0, ien=cells.length ; i<ien ; i++ ) { + column = columns[i]; + column.nTf = cells[i].cell; + + if ( column.sClass ) { + $(column.nTf).addClass( column.sClass ); + } + } + } + } + + + /** + * Draw the header (or footer) element based on the column visibility states. The + * methodology here is to use the layout array from _fnDetectHeader, modified for + * the instantaneous column visibility, to construct the new layout. The grid is + * traversed over cell at a time in a rows x columns grid fashion, although each + * cell insert can cover multiple elements in the grid - which is tracks using the + * aApplied array. Cell inserts in the grid will only occur where there isn't + * already a cell in that position. + * @param {object} oSettings dataTables settings object + * @param array {objects} aoSource Layout array from _fnDetectHeader + * @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc, + * @memberof DataTable#oApi + */ + function _fnDrawHead( oSettings, aoSource, bIncludeHidden ) + { + var i, iLen, j, jLen, k, kLen, n, nLocalTr; + var aoLocal = []; + var aApplied = []; + var iColumns = oSettings.aoColumns.length; + var iRowspan, iColspan; + + if ( ! aoSource ) + { + return; + } + + if ( bIncludeHidden === undefined ) + { + bIncludeHidden = false; + } + + /* Make a copy of the master layout array, but without the visible columns in it */ + for ( i=0, iLen=aoSource.length ; i<iLen ; i++ ) + { + aoLocal[i] = aoSource[i].slice(); + aoLocal[i].nTr = aoSource[i].nTr; + + /* Remove any columns which are currently hidden */ + for ( j=iColumns-1 ; j>=0 ; j-- ) + { + if ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden ) + { + aoLocal[i].splice( j, 1 ); + } + } + + /* Prep the applied array - it needs an element for each row */ + aApplied.push( [] ); + } + + for ( i=0, iLen=aoLocal.length ; i<iLen ; i++ ) + { + nLocalTr = aoLocal[i].nTr; + + /* All cells are going to be replaced, so empty out the row */ + if ( nLocalTr ) + { + while( (n = nLocalTr.firstChild) ) + { + nLocalTr.removeChild( n ); + } + } + + for ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ ) + { + iRowspan = 1; + iColspan = 1; + + /* Check to see if there is already a cell (row/colspan) covering our target + * insert point. If there is, then there is nothing to do. + */ + if ( aApplied[i][j] === undefined ) + { + nLocalTr.appendChild( aoLocal[i][j].cell ); + aApplied[i][j] = 1; + + /* Expand the cell to cover as many rows as needed */ + while ( aoLocal[i+iRowspan] !== undefined && + aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell ) + { + aApplied[i+iRowspan][j] = 1; + iRowspan++; + } + + /* Expand the cell to cover as many columns as needed */ + while ( aoLocal[i][j+iColspan] !== undefined && + aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell ) + { + /* Must update the applied array over the rows for the columns */ + for ( k=0 ; k<iRowspan ; k++ ) + { + aApplied[i+k][j+iColspan] = 1; + } + iColspan++; + } + + /* Do the actual expansion in the DOM */ + $(aoLocal[i][j].cell) + .attr('rowspan', iRowspan) + .attr('colspan', iColspan); + } + } + } + } + + + /** + * Insert the required TR nodes into the table for display + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnDraw( oSettings ) + { + /* Provide a pre-callback function which can be used to cancel the draw is false is returned */ + var aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] ); + if ( $.inArray( false, aPreDraw ) !== -1 ) + { + _fnProcessingDisplay( oSettings, false ); + return; + } + + var i, iLen, n; + var anRows = []; + var iRowCount = 0; + var asStripeClasses = oSettings.asStripeClasses; + var iStripes = asStripeClasses.length; + var iOpenRows = oSettings.aoOpenRows.length; + var oLang = oSettings.oLanguage; + var iInitDisplayStart = oSettings.iInitDisplayStart; + var bServerSide = _fnDataSource( oSettings ) == 'ssp'; + var aiDisplay = oSettings.aiDisplay; + + oSettings.bDrawing = true; + + /* Check and see if we have an initial draw position from state saving */ + if ( iInitDisplayStart !== undefined && iInitDisplayStart !== -1 ) + { + oSettings._iDisplayStart = bServerSide ? + iInitDisplayStart : + iInitDisplayStart >= oSettings.fnRecordsDisplay() ? + 0 : + iInitDisplayStart; + + oSettings.iInitDisplayStart = -1; + } + + var iDisplayStart = oSettings._iDisplayStart; + var iDisplayEnd = oSettings.fnDisplayEnd(); + + /* Server-side processing draw intercept */ + if ( oSettings.bDeferLoading ) + { + oSettings.bDeferLoading = false; + oSettings.iDraw++; + _fnProcessingDisplay( oSettings, false ); + } + else if ( !bServerSide ) + { + oSettings.iDraw++; + } + else if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) ) + { + return; + } + + if ( aiDisplay.length !== 0 ) + { + var iStart = bServerSide ? 0 : iDisplayStart; + var iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd; + + for ( var j=iStart ; j<iEnd ; j++ ) + { + var iDataIndex = aiDisplay[j]; + var aoData = oSettings.aoData[ iDataIndex ]; + if ( aoData.nTr === null ) + { + _fnCreateTr( oSettings, iDataIndex ); + } + + var nRow = aoData.nTr; + + /* Remove the old striping classes and then add the new one */ + if ( iStripes !== 0 ) + { + var sStripe = asStripeClasses[ iRowCount % iStripes ]; + if ( aoData._sRowStripe != sStripe ) + { + $(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe ); + aoData._sRowStripe = sStripe; + } + } + + // Row callback functions - might want to manipulate the row + // iRowCount and j are not currently documented. Are they at all + // useful? + _fnCallbackFire( oSettings, 'aoRowCallback', null, + [nRow, aoData._aData, iRowCount, j] ); + + anRows.push( nRow ); + iRowCount++; + } + } + else + { + /* Table is empty - create a row with an empty message in it */ + var sZero = oLang.sZeroRecords; + if ( oSettings.iDraw == 1 && _fnDataSource( oSettings ) == 'ajax' ) + { + sZero = oLang.sLoadingRecords; + } + else if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 ) + { + sZero = oLang.sEmptyTable; + } + + anRows[ 0 ] = $( '<tr/>', { 'class': iStripes ? asStripeClasses[0] : '' } ) + .append( $('<td />', { + 'valign': 'top', + 'colSpan': _fnVisbleColumns( oSettings ), + 'class': oSettings.oClasses.sRowEmpty + } ).html( sZero ) )[0]; + } + + /* Header and footer callbacks */ + _fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0], + _fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] ); + + _fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0], + _fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] ); + + var body = $(oSettings.nTBody); + + body.children().detach(); + body.append( $(anRows) ); + + /* Call all required callback functions for the end of a draw */ + _fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] ); + + /* Draw is complete, sorting and filtering must be as well */ + oSettings.bSorted = false; + oSettings.bFiltered = false; + oSettings.bDrawing = false; + } + + + /** + * Redraw the table - taking account of the various features which are enabled + * @param {object} oSettings dataTables settings object + * @param {boolean} [holdPosition] Keep the current paging position. By default + * the paging is reset to the first page + * @memberof DataTable#oApi + */ + function _fnReDraw( settings, holdPosition ) + { + var + features = settings.oFeatures, + sort = features.bSort, + filter = features.bFilter; + + if ( sort ) { + _fnSort( settings ); + } + + if ( filter ) { + _fnFilterComplete( settings, settings.oPreviousSearch ); + } + else { + // No filtering, so we want to just use the display master + settings.aiDisplay = settings.aiDisplayMaster.slice(); + } + + if ( holdPosition !== true ) { + settings._iDisplayStart = 0; + } + + // Let any modules know about the draw hold position state (used by + // scrolling internally) + settings._drawHold = holdPosition; + + _fnDraw( settings ); + + settings._drawHold = false; + } + + + /** + * Add the options to the page HTML for the table + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnAddOptionsHtml ( oSettings ) + { + var classes = oSettings.oClasses; + var table = $(oSettings.nTable); + var holding = $('<div/>').insertBefore( table ); // Holding element for speed + var features = oSettings.oFeatures; + + // All DataTables are wrapped in a div + var insert = $('<div/>', { + id: oSettings.sTableId+'_wrapper', + 'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' '+classes.sNoFooter) + } ); + + oSettings.nHolding = holding[0]; + oSettings.nTableWrapper = insert[0]; + oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling; + + /* Loop over the user set positioning and place the elements as needed */ + var aDom = oSettings.sDom.split(''); + var featureNode, cOption, nNewNode, cNext, sAttr, j; + for ( var i=0 ; i<aDom.length ; i++ ) + { + featureNode = null; + cOption = aDom[i]; + + if ( cOption == '<' ) + { + /* New container div */ + nNewNode = $('<div/>')[0]; + + /* Check to see if we should append an id and/or a class name to the container */ + cNext = aDom[i+1]; + if ( cNext == "'" || cNext == '"' ) + { + sAttr = ""; + j = 2; + while ( aDom[i+j] != cNext ) + { + sAttr += aDom[i+j]; + j++; + } + + /* Replace jQuery UI constants @todo depreciated */ + if ( sAttr == "H" ) + { + sAttr = classes.sJUIHeader; + } + else if ( sAttr == "F" ) + { + sAttr = classes.sJUIFooter; + } + + /* The attribute can be in the format of "#id.class", "#id" or "class" This logic + * breaks the string into parts and applies them as needed + */ + if ( sAttr.indexOf('.') != -1 ) + { + var aSplit = sAttr.split('.'); + nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1); + nNewNode.className = aSplit[1]; + } + else if ( sAttr.charAt(0) == "#" ) + { + nNewNode.id = sAttr.substr(1, sAttr.length-1); + } + else + { + nNewNode.className = sAttr; + } + + i += j; /* Move along the position array */ + } + + insert.append( nNewNode ); + insert = $(nNewNode); + } + else if ( cOption == '>' ) + { + /* End container div */ + insert = insert.parent(); + } + // @todo Move options into their own plugins? + else if ( cOption == 'l' && features.bPaginate && features.bLengthChange ) + { + /* Length */ + featureNode = _fnFeatureHtmlLength( oSettings ); + } + else if ( cOption == 'f' && features.bFilter ) + { + /* Filter */ + featureNode = _fnFeatureHtmlFilter( oSettings ); + } + else if ( cOption == 'r' && features.bProcessing ) + { + /* pRocessing */ + featureNode = _fnFeatureHtmlProcessing( oSettings ); + } + else if ( cOption == 't' ) + { + /* Table */ + featureNode = _fnFeatureHtmlTable( oSettings ); + } + else if ( cOption == 'i' && features.bInfo ) + { + /* Info */ + featureNode = _fnFeatureHtmlInfo( oSettings ); + } + else if ( cOption == 'p' && features.bPaginate ) + { + /* Pagination */ + featureNode = _fnFeatureHtmlPaginate( oSettings ); + } + else if ( DataTable.ext.feature.length !== 0 ) + { + /* Plug-in features */ + var aoFeatures = DataTable.ext.feature; + for ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ ) + { + if ( cOption == aoFeatures[k].cFeature ) + { + featureNode = aoFeatures[k].fnInit( oSettings ); + break; + } + } + } + + /* Add to the 2D features array */ + if ( featureNode ) + { + var aanFeatures = oSettings.aanFeatures; + + if ( ! aanFeatures[cOption] ) + { + aanFeatures[cOption] = []; + } + + aanFeatures[cOption].push( featureNode ); + insert.append( featureNode ); + } + } + + /* Built our DOM structure - replace the holding div with what we want */ + holding.replaceWith( insert ); + } + + + /** + * Use the DOM source to create up an array of header cells. The idea here is to + * create a layout grid (array) of rows x columns, which contains a reference + * to the cell that that point in the grid (regardless of col/rowspan), such that + * any column / row could be removed and the new grid constructed + * @param array {object} aLayout Array to store the calculated layout in + * @param {node} nThead The header/footer element for the table + * @memberof DataTable#oApi + */ + function _fnDetectHeader ( aLayout, nThead ) + { + var nTrs = $(nThead).children('tr'); + var nTr, nCell; + var i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan; + var bUnique; + var fnShiftCol = function ( a, i, j ) { + var k = a[i]; + while ( k[j] ) { + j++; + } + return j; + }; + + aLayout.splice( 0, aLayout.length ); + + /* We know how many rows there are in the layout - so prep it */ + for ( i=0, iLen=nTrs.length ; i<iLen ; i++ ) + { + aLayout.push( [] ); + } + + /* Calculate a layout array */ + for ( i=0, iLen=nTrs.length ; i<iLen ; i++ ) + { + nTr = nTrs[i]; + iColumn = 0; + + /* For every cell in the row... */ + nCell = nTr.firstChild; + while ( nCell ) { + if ( nCell.nodeName.toUpperCase() == "TD" || + nCell.nodeName.toUpperCase() == "TH" ) + { + /* Get the col and rowspan attributes from the DOM and sanitise them */ + iColspan = nCell.getAttribute('colspan') * 1; + iRowspan = nCell.getAttribute('rowspan') * 1; + iColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan; + iRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan; + + /* There might be colspan cells already in this row, so shift our target + * accordingly + */ + iColShifted = fnShiftCol( aLayout, i, iColumn ); + + /* Cache calculation for unique columns */ + bUnique = iColspan === 1 ? true : false; + + /* If there is col / rowspan, copy the information into the layout grid */ + for ( l=0 ; l<iColspan ; l++ ) + { + for ( k=0 ; k<iRowspan ; k++ ) + { + aLayout[i+k][iColShifted+l] = { + "cell": nCell, + "unique": bUnique + }; + aLayout[i+k].nTr = nTr; + } + } + } + nCell = nCell.nextSibling; + } + } + } + + + /** + * Get an array of unique th elements, one for each column + * @param {object} oSettings dataTables settings object + * @param {node} nHeader automatically detect the layout from this node - optional + * @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional + * @returns array {node} aReturn list of unique th's + * @memberof DataTable#oApi + */ + function _fnGetUniqueThs ( oSettings, nHeader, aLayout ) + { + var aReturn = []; + if ( !aLayout ) + { + aLayout = oSettings.aoHeader; + if ( nHeader ) + { + aLayout = []; + _fnDetectHeader( aLayout, nHeader ); + } + } + + for ( var i=0, iLen=aLayout.length ; i<iLen ; i++ ) + { + for ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ ) + { + if ( aLayout[i][j].unique && + (!aReturn[j] || !oSettings.bSortCellsTop) ) + { + aReturn[j] = aLayout[i][j].cell; + } + } + } + + return aReturn; + } + + /** + * Create an Ajax call based on the table's settings, taking into account that + * parameters can have multiple forms, and backwards compatibility. + * + * @param {object} oSettings dataTables settings object + * @param {array} data Data to send to the server, required by + * DataTables - may be augmented by developer callbacks + * @param {function} fn Callback function to run when data is obtained + */ + function _fnBuildAjax( oSettings, data, fn ) + { + // Compatibility with 1.9-, allow fnServerData and event to manipulate + _fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [data] ); + + // Convert to object based for 1.10+ if using the old array scheme which can + // come from server-side processing or serverParams + if ( data && $.isArray(data) ) { + var tmp = {}; + var rbracket = /(.*?)\[\]$/; + + $.each( data, function (key, val) { + var match = val.name.match(rbracket); + + if ( match ) { + // Support for arrays + var name = match[0]; + + if ( ! tmp[ name ] ) { + tmp[ name ] = []; + } + tmp[ name ].push( val.value ); + } + else { + tmp[val.name] = val.value; + } + } ); + data = tmp; + } + + var ajaxData; + var ajax = oSettings.ajax; + var instance = oSettings.oInstance; + var callback = function ( json ) { + _fnCallbackFire( oSettings, null, 'xhr', [oSettings, json, oSettings.jqXHR] ); + fn( json ); + }; + + if ( $.isPlainObject( ajax ) && ajax.data ) + { + ajaxData = ajax.data; + + var newData = $.isFunction( ajaxData ) ? + ajaxData( data, oSettings ) : // fn can manipulate data or return + ajaxData; // an object object or array to merge + + // If the function returned something, use that alone + data = $.isFunction( ajaxData ) && newData ? + newData : + $.extend( true, data, newData ); + + // Remove the data property as we've resolved it already and don't want + // jQuery to do it again (it is restored at the end of the function) + delete ajax.data; + } + + var baseAjax = { + "data": data, + "success": function (json) { + var error = json.error || json.sError; + if ( error ) { + _fnLog( oSettings, 0, error ); + } + + oSettings.json = json; + callback( json ); + }, + "dataType": "json", + "cache": false, + "type": oSettings.sServerMethod, + "error": function (xhr, error, thrown) { + var ret = _fnCallbackFire( oSettings, null, 'xhr', [oSettings, null, oSettings.jqXHR] ); + + if ( $.inArray( true, ret ) === -1 ) { + if ( error == "parsererror" ) { + _fnLog( oSettings, 0, 'Invalid JSON response', 1 ); + } + else if ( xhr.readyState === 4 ) { + _fnLog( oSettings, 0, 'Ajax error', 7 ); + } + } + + _fnProcessingDisplay( oSettings, false ); + } + }; + + // Store the data submitted for the API + oSettings.oAjaxData = data; + + // Allow plug-ins and external processes to modify the data + _fnCallbackFire( oSettings, null, 'preXhr', [oSettings, data] ); + + if ( oSettings.fnServerData ) + { + // DataTables 1.9- compatibility + oSettings.fnServerData.call( instance, + oSettings.sAjaxSource, + $.map( data, function (val, key) { // Need to convert back to 1.9 trad format + return { name: key, value: val }; + } ), + callback, + oSettings + ); + } + else if ( oSettings.sAjaxSource || typeof ajax === 'string' ) + { + // DataTables 1.9- compatibility + oSettings.jqXHR = $.ajax( $.extend( baseAjax, { + url: ajax || oSettings.sAjaxSource + } ) ); + } + else if ( $.isFunction( ajax ) ) + { + // Is a function - let the caller define what needs to be done + oSettings.jqXHR = ajax.call( instance, data, callback, oSettings ); + } + else + { + // Object to extend the base settings + oSettings.jqXHR = $.ajax( $.extend( baseAjax, ajax ) ); + + // Restore for next time around + ajax.data = ajaxData; + } + } + + + /** + * Update the table using an Ajax call + * @param {object} settings dataTables settings object + * @returns {boolean} Block the table drawing or not + * @memberof DataTable#oApi + */ + function _fnAjaxUpdate( settings ) + { + if ( settings.bAjaxDataGet ) { + settings.iDraw++; + _fnProcessingDisplay( settings, true ); + + _fnBuildAjax( + settings, + _fnAjaxParameters( settings ), + function(json) { + _fnAjaxUpdateDraw( settings, json ); + } + ); + + return false; + } + return true; + } + + + /** + * Build up the parameters in an object needed for a server-side processing + * request. Note that this is basically done twice, is different ways - a modern + * method which is used by default in DataTables 1.10 which uses objects and + * arrays, or the 1.9- method with is name / value pairs. 1.9 method is used if + * the sAjaxSource option is used in the initialisation, or the legacyAjax + * option is set. + * @param {object} oSettings dataTables settings object + * @returns {bool} block the table drawing or not + * @memberof DataTable#oApi + */ + function _fnAjaxParameters( settings ) + { + var + columns = settings.aoColumns, + columnCount = columns.length, + features = settings.oFeatures, + preSearch = settings.oPreviousSearch, + preColSearch = settings.aoPreSearchCols, + i, data = [], dataProp, column, columnSearch, + sort = _fnSortFlatten( settings ), + displayStart = settings._iDisplayStart, + displayLength = features.bPaginate !== false ? + settings._iDisplayLength : + -1; + + var param = function ( name, value ) { + data.push( { 'name': name, 'value': value } ); + }; + + // DataTables 1.9- compatible method + param( 'sEcho', settings.iDraw ); + param( 'iColumns', columnCount ); + param( 'sColumns', _pluck( columns, 'sName' ).join(',') ); + param( 'iDisplayStart', displayStart ); + param( 'iDisplayLength', displayLength ); + + // DataTables 1.10+ method + var d = { + draw: settings.iDraw, + columns: [], + order: [], + start: displayStart, + length: displayLength, + search: { + value: preSearch.sSearch, + regex: preSearch.bRegex + } + }; + + for ( i=0 ; i<columnCount ; i++ ) { + column = columns[i]; + columnSearch = preColSearch[i]; + dataProp = typeof column.mData=="function" ? 'function' : column.mData ; + + d.columns.push( { + data: dataProp, + name: column.sName, + searchable: column.bSearchable, + orderable: column.bSortable, + search: { + value: columnSearch.sSearch, + regex: columnSearch.bRegex + } + } ); + + param( "mDataProp_"+i, dataProp ); + + if ( features.bFilter ) { + param( 'sSearch_'+i, columnSearch.sSearch ); + param( 'bRegex_'+i, columnSearch.bRegex ); + param( 'bSearchable_'+i, column.bSearchable ); + } + + if ( features.bSort ) { + param( 'bSortable_'+i, column.bSortable ); + } + } + + if ( features.bFilter ) { + param( 'sSearch', preSearch.sSearch ); + param( 'bRegex', preSearch.bRegex ); + } + + if ( features.bSort ) { + $.each( sort, function ( i, val ) { + d.order.push( { column: val.col, dir: val.dir } ); + + param( 'iSortCol_'+i, val.col ); + param( 'sSortDir_'+i, val.dir ); + } ); + + param( 'iSortingCols', sort.length ); + } + + // If the legacy.ajax parameter is null, then we automatically decide which + // form to use, based on sAjaxSource + var legacy = DataTable.ext.legacy.ajax; + if ( legacy === null ) { + return settings.sAjaxSource ? data : d; + } + + // Otherwise, if legacy has been specified then we use that to decide on the + // form + return legacy ? data : d; + } + + + /** + * Data the data from the server (nuking the old) and redraw the table + * @param {object} oSettings dataTables settings object + * @param {object} json json data return from the server. + * @param {string} json.sEcho Tracking flag for DataTables to match requests + * @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering + * @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering + * @param {array} json.aaData The data to display on this page + * @param {string} [json.sColumns] Column ordering (sName, comma separated) + * @memberof DataTable#oApi + */ + function _fnAjaxUpdateDraw ( settings, json ) + { + // v1.10 uses camelCase variables, while 1.9 uses Hungarian notation. + // Support both + var compat = function ( old, modern ) { + return json[old] !== undefined ? json[old] : json[modern]; + }; + + var data = _fnAjaxDataSrc( settings, json ); + var draw = compat( 'sEcho', 'draw' ); + var recordsTotal = compat( 'iTotalRecords', 'recordsTotal' ); + var recordsFiltered = compat( 'iTotalDisplayRecords', 'recordsFiltered' ); + + if ( draw ) { + // Protect against out of sequence returns + if ( draw*1 < settings.iDraw ) { + return; + } + settings.iDraw = draw * 1; + } + + _fnClearTable( settings ); + settings._iRecordsTotal = parseInt(recordsTotal, 10); + settings._iRecordsDisplay = parseInt(recordsFiltered, 10); + + for ( var i=0, ien=data.length ; i<ien ; i++ ) { + _fnAddData( settings, data[i] ); + } + settings.aiDisplay = settings.aiDisplayMaster.slice(); + + settings.bAjaxDataGet = false; + _fnDraw( settings ); + + if ( ! settings._bInitComplete ) { + _fnInitComplete( settings, json ); + } + + settings.bAjaxDataGet = true; + _fnProcessingDisplay( settings, false ); + } + + + /** + * Get the data from the JSON data source to use for drawing a table. Using + * `_fnGetObjectDataFn` allows the data to be sourced from a property of the + * source object, or from a processing function. + * @param {object} oSettings dataTables settings object + * @param {object} json Data source object / array from the server + * @return {array} Array of data to use + */ + function _fnAjaxDataSrc ( oSettings, json ) + { + var dataSrc = $.isPlainObject( oSettings.ajax ) && oSettings.ajax.dataSrc !== undefined ? + oSettings.ajax.dataSrc : + oSettings.sAjaxDataProp; // Compatibility with 1.9-. + + // Compatibility with 1.9-. In order to read from aaData, check if the + // default has been changed, if not, check for aaData + if ( dataSrc === 'data' ) { + return json.aaData || json[dataSrc]; + } + + return dataSrc !== "" ? + _fnGetObjectDataFn( dataSrc )( json ) : + json; + } + + /** + * Generate the node required for filtering text + * @returns {node} Filter control element + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnFeatureHtmlFilter ( settings ) + { + var classes = settings.oClasses; + var tableId = settings.sTableId; + var language = settings.oLanguage; + var previousSearch = settings.oPreviousSearch; + var features = settings.aanFeatures; + var input = '<input type="search" class="'+classes.sFilterInput+'"/>'; + + var str = language.sSearch; + str = str.match(/_INPUT_/) ? + str.replace('_INPUT_', input) : + str+input; + + var filter = $('<div/>', { + 'id': ! features.f ? tableId+'_filter' : null, + 'class': classes.sFilter + } ) + .append( $('<label/>' ).append( str ) ); + + var searchFn = function() { + /* Update all other filter input elements for the new display */ + var n = features.f; + var val = !this.value ? "" : this.value; // mental IE8 fix :-( + + /* Now do the filter */ + if ( val != previousSearch.sSearch ) { + _fnFilterComplete( settings, { + "sSearch": val, + "bRegex": previousSearch.bRegex, + "bSmart": previousSearch.bSmart , + "bCaseInsensitive": previousSearch.bCaseInsensitive + } ); + + // Need to redraw, without resorting + settings._iDisplayStart = 0; + _fnDraw( settings ); + } + }; + + var searchDelay = settings.searchDelay !== null ? + settings.searchDelay : + _fnDataSource( settings ) === 'ssp' ? + 400 : + 0; + + var jqFilter = $('input', filter) + .val( previousSearch.sSearch ) + .attr( 'placeholder', language.sSearchPlaceholder ) + .bind( + 'keyup.DT search.DT input.DT paste.DT cut.DT', + searchDelay ? + _fnThrottle( searchFn, searchDelay ) : + searchFn + ) + .bind( 'keypress.DT', function(e) { + /* Prevent form submission */ + if ( e.keyCode == 13 ) { + return false; + } + } ) + .attr('aria-controls', tableId); + + // Update the input elements whenever the table is filtered + $(settings.nTable).on( 'search.dt.DT', function ( ev, s ) { + if ( settings === s ) { + // IE9 throws an 'unknown error' if document.activeElement is used + // inside an iframe or frame... + try { + if ( jqFilter[0] !== document.activeElement ) { + jqFilter.val( previousSearch.sSearch ); + } + } + catch ( e ) {} + } + } ); + + return filter[0]; + } + + + /** + * Filter the table using both the global filter and column based filtering + * @param {object} oSettings dataTables settings object + * @param {object} oSearch search information + * @param {int} [iForce] force a research of the master array (1) or not (undefined or 0) + * @memberof DataTable#oApi + */ + function _fnFilterComplete ( oSettings, oInput, iForce ) + { + var oPrevSearch = oSettings.oPreviousSearch; + var aoPrevSearch = oSettings.aoPreSearchCols; + var fnSaveFilter = function ( oFilter ) { + /* Save the filtering values */ + oPrevSearch.sSearch = oFilter.sSearch; + oPrevSearch.bRegex = oFilter.bRegex; + oPrevSearch.bSmart = oFilter.bSmart; + oPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive; + }; + var fnRegex = function ( o ) { + // Backwards compatibility with the bEscapeRegex option + return o.bEscapeRegex !== undefined ? !o.bEscapeRegex : o.bRegex; + }; + + // Resolve any column types that are unknown due to addition or invalidation + // @todo As per sort - can this be moved into an event handler? + _fnColumnTypes( oSettings ); + + /* In server-side processing all filtering is done by the server, so no point hanging around here */ + if ( _fnDataSource( oSettings ) != 'ssp' ) + { + /* Global filter */ + _fnFilter( oSettings, oInput.sSearch, iForce, fnRegex(oInput), oInput.bSmart, oInput.bCaseInsensitive ); + fnSaveFilter( oInput ); + + /* Now do the individual column filter */ + for ( var i=0 ; i<aoPrevSearch.length ; i++ ) + { + _fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, fnRegex(aoPrevSearch[i]), + aoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive ); + } + + /* Custom filtering */ + _fnFilterCustom( oSettings ); + } + else + { + fnSaveFilter( oInput ); + } + + /* Tell the draw function we have been filtering */ + oSettings.bFiltered = true; + _fnCallbackFire( oSettings, null, 'search', [oSettings] ); + } + + + /** + * Apply custom filtering functions + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnFilterCustom( settings ) + { + var filters = DataTable.ext.search; + var displayRows = settings.aiDisplay; + var row, rowIdx; + + for ( var i=0, ien=filters.length ; i<ien ; i++ ) { + var rows = []; + + // Loop over each row and see if it should be included + for ( var j=0, jen=displayRows.length ; j<jen ; j++ ) { + rowIdx = displayRows[ j ]; + row = settings.aoData[ rowIdx ]; + + if ( filters[i]( settings, row._aFilterData, rowIdx, row._aData, j ) ) { + rows.push( rowIdx ); + } + } + + // So the array reference doesn't break set the results into the + // existing array + displayRows.length = 0; + displayRows.push.apply( displayRows, rows ); + } + } + + + /** + * Filter the table on a per-column basis + * @param {object} oSettings dataTables settings object + * @param {string} sInput string to filter on + * @param {int} iColumn column to filter + * @param {bool} bRegex treat search string as a regular expression or not + * @param {bool} bSmart use smart filtering or not + * @param {bool} bCaseInsensitive Do case insenstive matching or not + * @memberof DataTable#oApi + */ + function _fnFilterColumn ( settings, searchStr, colIdx, regex, smart, caseInsensitive ) + { + if ( searchStr === '' ) { + return; + } + + var data; + var display = settings.aiDisplay; + var rpSearch = _fnFilterCreateSearch( searchStr, regex, smart, caseInsensitive ); + + for ( var i=display.length-1 ; i>=0 ; i-- ) { + data = settings.aoData[ display[i] ]._aFilterData[ colIdx ]; + + if ( ! rpSearch.test( data ) ) { + display.splice( i, 1 ); + } + } + } + + + /** + * Filter the data table based on user input and draw the table + * @param {object} settings dataTables settings object + * @param {string} input string to filter on + * @param {int} force optional - force a research of the master array (1) or not (undefined or 0) + * @param {bool} regex treat as a regular expression or not + * @param {bool} smart perform smart filtering or not + * @param {bool} caseInsensitive Do case insenstive matching or not + * @memberof DataTable#oApi + */ + function _fnFilter( settings, input, force, regex, smart, caseInsensitive ) + { + var rpSearch = _fnFilterCreateSearch( input, regex, smart, caseInsensitive ); + var prevSearch = settings.oPreviousSearch.sSearch; + var displayMaster = settings.aiDisplayMaster; + var display, invalidated, i; + + // Need to take account of custom filtering functions - always filter + if ( DataTable.ext.search.length !== 0 ) { + force = true; + } + + // Check if any of the rows were invalidated + invalidated = _fnFilterData( settings ); + + // If the input is blank - we just want the full data set + if ( input.length <= 0 ) { + settings.aiDisplay = displayMaster.slice(); + } + else { + // New search - start from the master array + if ( invalidated || + force || + prevSearch.length > input.length || + input.indexOf(prevSearch) !== 0 || + settings.bSorted // On resort, the display master needs to be + // re-filtered since indexes will have changed + ) { + settings.aiDisplay = displayMaster.slice(); + } + + // Search the display array + display = settings.aiDisplay; + + for ( i=display.length-1 ; i>=0 ; i-- ) { + if ( ! rpSearch.test( settings.aoData[ display[i] ]._sFilterRow ) ) { + display.splice( i, 1 ); + } + } + } + } + + + /** + * Build a regular expression object suitable for searching a table + * @param {string} sSearch string to search for + * @param {bool} bRegex treat as a regular expression or not + * @param {bool} bSmart perform smart filtering or not + * @param {bool} bCaseInsensitive Do case insensitive matching or not + * @returns {RegExp} constructed object + * @memberof DataTable#oApi + */ + function _fnFilterCreateSearch( search, regex, smart, caseInsensitive ) + { + search = regex ? + search : + _fnEscapeRegex( search ); + + if ( smart ) { + /* For smart filtering we want to allow the search to work regardless of + * word order. We also want double quoted text to be preserved, so word + * order is important - a la google. So this is what we want to + * generate: + * + * ^(?=.*?\bone\b)(?=.*?\btwo three\b)(?=.*?\bfour\b).*$ + */ + var a = $.map( search.match( /"[^"]+"|[^ ]+/g ) || [''], function ( word ) { + if ( word.charAt(0) === '"' ) { + var m = word.match( /^"(.*)"$/ ); + word = m ? m[1] : word; + } + + return word.replace('"', ''); + } ); + + search = '^(?=.*?'+a.join( ')(?=.*?' )+').*$'; + } + + return new RegExp( search, caseInsensitive ? 'i' : '' ); + } + + + /** + * Escape a string such that it can be used in a regular expression + * @param {string} sVal string to escape + * @returns {string} escaped string + * @memberof DataTable#oApi + */ + function _fnEscapeRegex ( sVal ) + { + return sVal.replace( _re_escape_regex, '\\$1' ); + } + + + + var __filter_div = $('<div>')[0]; + var __filter_div_textContent = __filter_div.textContent !== undefined; + + // Update the filtering data for each row if needed (by invalidation or first run) + function _fnFilterData ( settings ) + { + var columns = settings.aoColumns; + var column; + var i, j, ien, jen, filterData, cellData, row; + var fomatters = DataTable.ext.type.search; + var wasInvalidated = false; + + for ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) { + row = settings.aoData[i]; + + if ( ! row._aFilterData ) { + filterData = []; + + for ( j=0, jen=columns.length ; j<jen ; j++ ) { + column = columns[j]; + + if ( column.bSearchable ) { + cellData = _fnGetCellData( settings, i, j, 'filter' ); + + if ( fomatters[ column.sType ] ) { + cellData = fomatters[ column.sType ]( cellData ); + } + + // Search in DataTables 1.10 is string based. In 1.11 this + // should be altered to also allow strict type checking. + if ( cellData === null ) { + cellData = ''; + } + + if ( typeof cellData !== 'string' && cellData.toString ) { + cellData = cellData.toString(); + } + } + else { + cellData = ''; + } + + // If it looks like there is an HTML entity in the string, + // attempt to decode it so sorting works as expected. Note that + // we could use a single line of jQuery to do this, but the DOM + // method used here is much faster http://jsperf.com/html-decode + if ( cellData.indexOf && cellData.indexOf('&') !== -1 ) { + __filter_div.innerHTML = cellData; + cellData = __filter_div_textContent ? + __filter_div.textContent : + __filter_div.innerText; + } + + if ( cellData.replace ) { + cellData = cellData.replace(/[\r\n]/g, ''); + } + + filterData.push( cellData ); + } + + row._aFilterData = filterData; + row._sFilterRow = filterData.join(' '); + wasInvalidated = true; + } + } + + return wasInvalidated; + } + + + /** + * Convert from the internal Hungarian notation to camelCase for external + * interaction + * @param {object} obj Object to convert + * @returns {object} Inverted object + * @memberof DataTable#oApi + */ + function _fnSearchToCamel ( obj ) + { + return { + search: obj.sSearch, + smart: obj.bSmart, + regex: obj.bRegex, + caseInsensitive: obj.bCaseInsensitive + }; + } + + + + /** + * Convert from camelCase notation to the internal Hungarian. We could use the + * Hungarian convert function here, but this is cleaner + * @param {object} obj Object to convert + * @returns {object} Inverted object + * @memberof DataTable#oApi + */ + function _fnSearchToHung ( obj ) + { + return { + sSearch: obj.search, + bSmart: obj.smart, + bRegex: obj.regex, + bCaseInsensitive: obj.caseInsensitive + }; + } + + /** + * Generate the node required for the info display + * @param {object} oSettings dataTables settings object + * @returns {node} Information element + * @memberof DataTable#oApi + */ + function _fnFeatureHtmlInfo ( settings ) + { + var + tid = settings.sTableId, + nodes = settings.aanFeatures.i, + n = $('<div/>', { + 'class': settings.oClasses.sInfo, + 'id': ! nodes ? tid+'_info' : null + } ); + + if ( ! nodes ) { + // Update display on each draw + settings.aoDrawCallback.push( { + "fn": _fnUpdateInfo, + "sName": "information" + } ); + + n + .attr( 'role', 'status' ) + .attr( 'aria-live', 'polite' ); + + // Table is described by our info div + $(settings.nTable).attr( 'aria-describedby', tid+'_info' ); + } + + return n[0]; + } + + + /** + * Update the information elements in the display + * @param {object} settings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnUpdateInfo ( settings ) + { + /* Show information about the table */ + var nodes = settings.aanFeatures.i; + if ( nodes.length === 0 ) { + return; + } + + var + lang = settings.oLanguage, + start = settings._iDisplayStart+1, + end = settings.fnDisplayEnd(), + max = settings.fnRecordsTotal(), + total = settings.fnRecordsDisplay(), + out = total ? + lang.sInfo : + lang.sInfoEmpty; + + if ( total !== max ) { + /* Record set after filtering */ + out += ' ' + lang.sInfoFiltered; + } + + // Convert the macros + out += lang.sInfoPostFix; + out = _fnInfoMacros( settings, out ); + + var callback = lang.fnInfoCallback; + if ( callback !== null ) { + out = callback.call( settings.oInstance, + settings, start, end, max, total, out + ); + } + + $(nodes).html( out ); + } + + + function _fnInfoMacros ( settings, str ) + { + // When infinite scrolling, we are always starting at 1. _iDisplayStart is used only + // internally + var + formatter = settings.fnFormatNumber, + start = settings._iDisplayStart+1, + len = settings._iDisplayLength, + vis = settings.fnRecordsDisplay(), + all = len === -1; + + return str. + replace(/_START_/g, formatter.call( settings, start ) ). + replace(/_END_/g, formatter.call( settings, settings.fnDisplayEnd() ) ). + replace(/_MAX_/g, formatter.call( settings, settings.fnRecordsTotal() ) ). + replace(/_TOTAL_/g, formatter.call( settings, vis ) ). + replace(/_PAGE_/g, formatter.call( settings, all ? 1 : Math.ceil( start / len ) ) ). + replace(/_PAGES_/g, formatter.call( settings, all ? 1 : Math.ceil( vis / len ) ) ); + } + + + + /** + * Draw the table for the first time, adding all required features + * @param {object} settings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnInitialise ( settings ) + { + var i, iLen, iAjaxStart=settings.iInitDisplayStart; + var columns = settings.aoColumns, column; + var features = settings.oFeatures; + + /* Ensure that the table data is fully initialised */ + if ( ! settings.bInitialised ) { + setTimeout( function(){ _fnInitialise( settings ); }, 200 ); + return; + } + + /* Show the display HTML options */ + _fnAddOptionsHtml( settings ); + + /* Build and draw the header / footer for the table */ + _fnBuildHead( settings ); + _fnDrawHead( settings, settings.aoHeader ); + _fnDrawHead( settings, settings.aoFooter ); + + /* Okay to show that something is going on now */ + _fnProcessingDisplay( settings, true ); + + /* Calculate sizes for columns */ + if ( features.bAutoWidth ) { + _fnCalculateColumnWidths( settings ); + } + + for ( i=0, iLen=columns.length ; i<iLen ; i++ ) { + column = columns[i]; + + if ( column.sWidth ) { + column.nTh.style.width = _fnStringToCss( column.sWidth ); + } + } + + // If there is default sorting required - let's do it. The sort function + // will do the drawing for us. Otherwise we draw the table regardless of the + // Ajax source - this allows the table to look initialised for Ajax sourcing + // data (show 'loading' message possibly) + _fnReDraw( settings ); + + // Server-side processing init complete is done by _fnAjaxUpdateDraw + var dataSrc = _fnDataSource( settings ); + if ( dataSrc != 'ssp' ) { + // if there is an ajax source load the data + if ( dataSrc == 'ajax' ) { + _fnBuildAjax( settings, [], function(json) { + var aData = _fnAjaxDataSrc( settings, json ); + + // Got the data - add it to the table + for ( i=0 ; i<aData.length ; i++ ) { + _fnAddData( settings, aData[i] ); + } + + // Reset the init display for cookie saving. We've already done + // a filter, and therefore cleared it before. So we need to make + // it appear 'fresh' + settings.iInitDisplayStart = iAjaxStart; + + _fnReDraw( settings ); + + _fnProcessingDisplay( settings, false ); + _fnInitComplete( settings, json ); + }, settings ); + } + else { + _fnProcessingDisplay( settings, false ); + _fnInitComplete( settings ); + } + } + } + + + /** + * Draw the table for the first time, adding all required features + * @param {object} oSettings dataTables settings object + * @param {object} [json] JSON from the server that completed the table, if using Ajax source + * with client-side processing (optional) + * @memberof DataTable#oApi + */ + function _fnInitComplete ( settings, json ) + { + settings._bInitComplete = true; + + // On an Ajax load we now have data and therefore want to apply the column + // sizing + if ( json ) { + _fnAdjustColumnSizing( settings ); + } + + _fnCallbackFire( settings, 'aoInitComplete', 'init', [settings, json] ); + } + + + function _fnLengthChange ( settings, val ) + { + var len = parseInt( val, 10 ); + settings._iDisplayLength = len; + + _fnLengthOverflow( settings ); + + // Fire length change event + _fnCallbackFire( settings, null, 'length', [settings, len] ); + } + + + /** + * Generate the node required for user display length changing + * @param {object} settings dataTables settings object + * @returns {node} Display length feature node + * @memberof DataTable#oApi + */ + function _fnFeatureHtmlLength ( settings ) + { + var + classes = settings.oClasses, + tableId = settings.sTableId, + menu = settings.aLengthMenu, + d2 = $.isArray( menu[0] ), + lengths = d2 ? menu[0] : menu, + language = d2 ? menu[1] : menu; + + var select = $('<select/>', { + 'name': tableId+'_length', + 'aria-controls': tableId, + 'class': classes.sLengthSelect + } ); + + for ( var i=0, ien=lengths.length ; i<ien ; i++ ) { + select[0][ i ] = new Option( language[i], lengths[i] ); + } + + var div = $('<div><label/></div>').addClass( classes.sLength ); + if ( ! settings.aanFeatures.l ) { + div[0].id = tableId+'_length'; + } + + div.children().append( + settings.oLanguage.sLengthMenu.replace( '_MENU_', select[0].outerHTML ) + ); + + // Can't use `select` variable as user might provide their own and the + // reference is broken by the use of outerHTML + $('select', div) + .val( settings._iDisplayLength ) + .bind( 'change.DT', function(e) { + _fnLengthChange( settings, $(this).val() ); + _fnDraw( settings ); + } ); + + // Update node value whenever anything changes the table's length + $(settings.nTable).bind( 'length.dt.DT', function (e, s, len) { + if ( settings === s ) { + $('select', div).val( len ); + } + } ); + + return div[0]; + } + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Note that most of the paging logic is done in + * DataTable.ext.pager + */ + + /** + * Generate the node required for default pagination + * @param {object} oSettings dataTables settings object + * @returns {node} Pagination feature node + * @memberof DataTable#oApi + */ + function _fnFeatureHtmlPaginate ( settings ) + { + var + type = settings.sPaginationType, + plugin = DataTable.ext.pager[ type ], + modern = typeof plugin === 'function', + redraw = function( settings ) { + _fnDraw( settings ); + }, + node = $('<div/>').addClass( settings.oClasses.sPaging + type )[0], + features = settings.aanFeatures; + + if ( ! modern ) { + plugin.fnInit( settings, node, redraw ); + } + + /* Add a draw callback for the pagination on first instance, to update the paging display */ + if ( ! features.p ) + { + node.id = settings.sTableId+'_paginate'; + + settings.aoDrawCallback.push( { + "fn": function( settings ) { + if ( modern ) { + var + start = settings._iDisplayStart, + len = settings._iDisplayLength, + visRecords = settings.fnRecordsDisplay(), + all = len === -1, + page = all ? 0 : Math.ceil( start / len ), + pages = all ? 1 : Math.ceil( visRecords / len ), + buttons = plugin(page, pages), + i, ien; + + for ( i=0, ien=features.p.length ; i<ien ; i++ ) { + _fnRenderer( settings, 'pageButton' )( + settings, features.p[i], i, buttons, page, pages + ); + } + } + else { + plugin.fnUpdate( settings, redraw ); + } + }, + "sName": "pagination" + } ); + } + + return node; + } + + + /** + * Alter the display settings to change the page + * @param {object} settings DataTables settings object + * @param {string|int} action Paging action to take: "first", "previous", + * "next" or "last" or page number to jump to (integer) + * @param [bool] redraw Automatically draw the update or not + * @returns {bool} true page has changed, false - no change + * @memberof DataTable#oApi + */ + function _fnPageChange ( settings, action, redraw ) + { + var + start = settings._iDisplayStart, + len = settings._iDisplayLength, + records = settings.fnRecordsDisplay(); + + if ( records === 0 || len === -1 ) + { + start = 0; + } + else if ( typeof action === "number" ) + { + start = action * len; + + if ( start > records ) + { + start = 0; + } + } + else if ( action == "first" ) + { + start = 0; + } + else if ( action == "previous" ) + { + start = len >= 0 ? + start - len : + 0; + + if ( start < 0 ) + { + start = 0; + } + } + else if ( action == "next" ) + { + if ( start + len < records ) + { + start += len; + } + } + else if ( action == "last" ) + { + start = Math.floor( (records-1) / len) * len; + } + else + { + _fnLog( settings, 0, "Unknown paging action: "+action, 5 ); + } + + var changed = settings._iDisplayStart !== start; + settings._iDisplayStart = start; + + if ( changed ) { + _fnCallbackFire( settings, null, 'page', [settings] ); + + if ( redraw ) { + _fnDraw( settings ); + } + } + + return changed; + } + + + + /** + * Generate the node required for the processing node + * @param {object} settings dataTables settings object + * @returns {node} Processing element + * @memberof DataTable#oApi + */ + function _fnFeatureHtmlProcessing ( settings ) + { + return $('<div/>', { + 'id': ! settings.aanFeatures.r ? settings.sTableId+'_processing' : null, + 'class': settings.oClasses.sProcessing + } ) + .html( settings.oLanguage.sProcessing ) + .insertBefore( settings.nTable )[0]; + } + + + /** + * Display or hide the processing indicator + * @param {object} settings dataTables settings object + * @param {bool} show Show the processing indicator (true) or not (false) + * @memberof DataTable#oApi + */ + function _fnProcessingDisplay ( settings, show ) + { + if ( settings.oFeatures.bProcessing ) { + $(settings.aanFeatures.r).css( 'display', show ? 'block' : 'none' ); + } + + _fnCallbackFire( settings, null, 'processing', [settings, show] ); + } + + /** + * Add any control elements for the table - specifically scrolling + * @param {object} settings dataTables settings object + * @returns {node} Node to add to the DOM + * @memberof DataTable#oApi + */ + function _fnFeatureHtmlTable ( settings ) + { + var table = $(settings.nTable); + + // Add the ARIA grid role to the table + table.attr( 'role', 'grid' ); + + // Scrolling from here on in + var scroll = settings.oScroll; + + if ( scroll.sX === '' && scroll.sY === '' ) { + return settings.nTable; + } + + var scrollX = scroll.sX; + var scrollY = scroll.sY; + var classes = settings.oClasses; + var caption = table.children('caption'); + var captionSide = caption.length ? caption[0]._captionSide : null; + var headerClone = $( table[0].cloneNode(false) ); + var footerClone = $( table[0].cloneNode(false) ); + var footer = table.children('tfoot'); + var _div = '<div/>'; + var size = function ( s ) { + return !s ? null : _fnStringToCss( s ); + }; + + // This is fairly messy, but with x scrolling enabled, if the table has a + // width attribute, regardless of any width applied using the column width + // options, the browser will shrink or grow the table as needed to fit into + // that 100%. That would make the width options useless. So we remove it. + // This is okay, under the assumption that width:100% is applied to the + // table in CSS (it is in the default stylesheet) which will set the table + // width as appropriate (the attribute and css behave differently...) + if ( scroll.sX && table.attr('width') === '100%' ) { + table.removeAttr('width'); + } + + if ( ! footer.length ) { + footer = null; + } + + /* + * The HTML structure that we want to generate in this function is: + * div - scroller + * div - scroll head + * div - scroll head inner + * table - scroll head table + * thead - thead + * div - scroll body + * table - table (master table) + * thead - thead clone for sizing + * tbody - tbody + * div - scroll foot + * div - scroll foot inner + * table - scroll foot table + * tfoot - tfoot + */ + var scroller = $( _div, { 'class': classes.sScrollWrapper } ) + .append( + $(_div, { 'class': classes.sScrollHead } ) + .css( { + overflow: 'hidden', + position: 'relative', + border: 0, + width: scrollX ? size(scrollX) : '100%' + } ) + .append( + $(_div, { 'class': classes.sScrollHeadInner } ) + .css( { + 'box-sizing': 'content-box', + width: scroll.sXInner || '100%' + } ) + .append( + headerClone + .removeAttr('id') + .css( 'margin-left', 0 ) + .append( captionSide === 'top' ? caption : null ) + .append( + table.children('thead') + ) + ) + ) + ) + .append( + $(_div, { 'class': classes.sScrollBody } ) + .css( { + overflow: 'auto', + height: size( scrollY ), + width: size( scrollX ) + } ) + .append( table ) + ); + + if ( footer ) { + scroller.append( + $(_div, { 'class': classes.sScrollFoot } ) + .css( { + overflow: 'hidden', + border: 0, + width: scrollX ? size(scrollX) : '100%' + } ) + .append( + $(_div, { 'class': classes.sScrollFootInner } ) + .append( + footerClone + .removeAttr('id') + .css( 'margin-left', 0 ) + .append( captionSide === 'bottom' ? caption : null ) + .append( + table.children('tfoot') + ) + ) + ) + ); + } + + var children = scroller.children(); + var scrollHead = children[0]; + var scrollBody = children[1]; + var scrollFoot = footer ? children[2] : null; + + // When the body is scrolled, then we also want to scroll the headers + if ( scrollX ) { + $(scrollBody).on( 'scroll.DT', function (e) { + var scrollLeft = this.scrollLeft; + + scrollHead.scrollLeft = scrollLeft; + + if ( footer ) { + scrollFoot.scrollLeft = scrollLeft; + } + } ); + } + + settings.nScrollHead = scrollHead; + settings.nScrollBody = scrollBody; + settings.nScrollFoot = scrollFoot; + + // On redraw - align columns + settings.aoDrawCallback.push( { + "fn": _fnScrollDraw, + "sName": "scrolling" + } ); + + return scroller[0]; + } + + + + /** + * Update the header, footer and body tables for resizing - i.e. column + * alignment. + * + * Welcome to the most horrible function DataTables. The process that this + * function follows is basically: + * 1. Re-create the table inside the scrolling div + * 2. Take live measurements from the DOM + * 3. Apply the measurements to align the columns + * 4. Clean up + * + * @param {object} settings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnScrollDraw ( settings ) + { + // Given that this is such a monster function, a lot of variables are use + // to try and keep the minimised size as small as possible + var + scroll = settings.oScroll, + scrollX = scroll.sX, + scrollXInner = scroll.sXInner, + scrollY = scroll.sY, + barWidth = scroll.iBarWidth, + divHeader = $(settings.nScrollHead), + divHeaderStyle = divHeader[0].style, + divHeaderInner = divHeader.children('div'), + divHeaderInnerStyle = divHeaderInner[0].style, + divHeaderTable = divHeaderInner.children('table'), + divBodyEl = settings.nScrollBody, + divBody = $(divBodyEl), + divBodyStyle = divBodyEl.style, + divFooter = $(settings.nScrollFoot), + divFooterInner = divFooter.children('div'), + divFooterTable = divFooterInner.children('table'), + header = $(settings.nTHead), + table = $(settings.nTable), + tableEl = table[0], + tableStyle = tableEl.style, + footer = settings.nTFoot ? $(settings.nTFoot) : null, + browser = settings.oBrowser, + ie67 = browser.bScrollOversize, + headerTrgEls, footerTrgEls, + headerSrcEls, footerSrcEls, + headerCopy, footerCopy, + headerWidths=[], footerWidths=[], + headerContent=[], + idx, correction, sanityWidth, + zeroOut = function(nSizer) { + var style = nSizer.style; + style.paddingTop = "0"; + style.paddingBottom = "0"; + style.borderTopWidth = "0"; + style.borderBottomWidth = "0"; + style.height = 0; + }; + + /* + * 1. Re-create the table inside the scrolling div + */ + + // Remove the old minimised thead and tfoot elements in the inner table + table.children('thead, tfoot').remove(); + + // Clone the current header and footer elements and then place it into the inner table + headerCopy = header.clone().prependTo( table ); + headerTrgEls = header.find('tr'); // original header is in its own table + headerSrcEls = headerCopy.find('tr'); + headerCopy.find('th, td').removeAttr('tabindex'); + + if ( footer ) { + footerCopy = footer.clone().prependTo( table ); + footerTrgEls = footer.find('tr'); // the original tfoot is in its own table and must be sized + footerSrcEls = footerCopy.find('tr'); + } + + + /* + * 2. Take live measurements from the DOM - do not alter the DOM itself! + */ + + // Remove old sizing and apply the calculated column widths + // Get the unique column headers in the newly created (cloned) header. We want to apply the + // calculated sizes to this header + if ( ! scrollX ) + { + divBodyStyle.width = '100%'; + divHeader[0].style.width = '100%'; + } + + $.each( _fnGetUniqueThs( settings, headerCopy ), function ( i, el ) { + idx = _fnVisibleToColumnIndex( settings, i ); + el.style.width = settings.aoColumns[idx].sWidth; + } ); + + if ( footer ) { + _fnApplyToChildren( function(n) { + n.style.width = ""; + }, footerSrcEls ); + } + + // If scroll collapse is enabled, when we put the headers back into the body for sizing, we + // will end up forcing the scrollbar to appear, making our measurements wrong for when we + // then hide it (end of this function), so add the header height to the body scroller. + if ( scroll.bCollapse && scrollY !== "" ) { + divBodyStyle.height = (divBody[0].offsetHeight + header[0].offsetHeight)+"px"; + } + + // Size the table as a whole + sanityWidth = table.outerWidth(); + if ( scrollX === "" ) { + // No x scrolling + tableStyle.width = "100%"; + + // IE7 will make the width of the table when 100% include the scrollbar + // - which is shouldn't. When there is a scrollbar we need to take this + // into account. + if ( ie67 && (table.find('tbody').height() > divBodyEl.offsetHeight || + divBody.css('overflow-y') == "scroll") + ) { + tableStyle.width = _fnStringToCss( table.outerWidth() - barWidth); + } + } + else + { + // x scrolling + if ( scrollXInner !== "" ) { + // x scroll inner has been given - use it + tableStyle.width = _fnStringToCss(scrollXInner); + } + else if ( sanityWidth == divBody.width() && divBody.height() < table.height() ) { + // There is y-scrolling - try to take account of the y scroll bar + tableStyle.width = _fnStringToCss( sanityWidth-barWidth ); + if ( table.outerWidth() > sanityWidth-barWidth ) { + // Not possible to take account of it + tableStyle.width = _fnStringToCss( sanityWidth ); + } + } + else { + // When all else fails + tableStyle.width = _fnStringToCss( sanityWidth ); + } + } + + // Recalculate the sanity width - now that we've applied the required width, + // before it was a temporary variable. This is required because the column + // width calculation is done before this table DOM is created. + sanityWidth = table.outerWidth(); + + // Hidden header should have zero height, so remove padding and borders. Then + // set the width based on the real headers + + // Apply all styles in one pass + _fnApplyToChildren( zeroOut, headerSrcEls ); + + // Read all widths in next pass + _fnApplyToChildren( function(nSizer) { + headerContent.push( nSizer.innerHTML ); + headerWidths.push( _fnStringToCss( $(nSizer).css('width') ) ); + }, headerSrcEls ); + + // Apply all widths in final pass + _fnApplyToChildren( function(nToSize, i) { + nToSize.style.width = headerWidths[i]; + }, headerTrgEls ); + + $(headerSrcEls).height(0); + + /* Same again with the footer if we have one */ + if ( footer ) + { + _fnApplyToChildren( zeroOut, footerSrcEls ); + + _fnApplyToChildren( function(nSizer) { + footerWidths.push( _fnStringToCss( $(nSizer).css('width') ) ); + }, footerSrcEls ); + + _fnApplyToChildren( function(nToSize, i) { + nToSize.style.width = footerWidths[i]; + }, footerTrgEls ); + + $(footerSrcEls).height(0); + } + + + /* + * 3. Apply the measurements + */ + + // "Hide" the header and footer that we used for the sizing. We need to keep + // the content of the cell so that the width applied to the header and body + // both match, but we want to hide it completely. We want to also fix their + // width to what they currently are + _fnApplyToChildren( function(nSizer, i) { + nSizer.innerHTML = '<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+headerContent[i]+'</div>'; + nSizer.style.width = headerWidths[i]; + }, headerSrcEls ); + + if ( footer ) + { + _fnApplyToChildren( function(nSizer, i) { + nSizer.innerHTML = ""; + nSizer.style.width = footerWidths[i]; + }, footerSrcEls ); + } + + // Sanity check that the table is of a sensible width. If not then we are going to get + // misalignment - try to prevent this by not allowing the table to shrink below its min width + if ( table.outerWidth() < sanityWidth ) + { + // The min width depends upon if we have a vertical scrollbar visible or not */ + correction = ((divBodyEl.scrollHeight > divBodyEl.offsetHeight || + divBody.css('overflow-y') == "scroll")) ? + sanityWidth+barWidth : + sanityWidth; + + // IE6/7 are a law unto themselves... + if ( ie67 && (divBodyEl.scrollHeight > + divBodyEl.offsetHeight || divBody.css('overflow-y') == "scroll") + ) { + tableStyle.width = _fnStringToCss( correction-barWidth ); + } + + // And give the user a warning that we've stopped the table getting too small + if ( scrollX === "" || scrollXInner !== "" ) { + _fnLog( settings, 1, 'Possible column misalignment', 6 ); + } + } + else + { + correction = '100%'; + } + + // Apply to the container elements + divBodyStyle.width = _fnStringToCss( correction ); + divHeaderStyle.width = _fnStringToCss( correction ); + + if ( footer ) { + settings.nScrollFoot.style.width = _fnStringToCss( correction ); + } + + + /* + * 4. Clean up + */ + if ( ! scrollY ) { + /* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting + * the scrollbar height from the visible display, rather than adding it on. We need to + * set the height in order to sort this. Don't want to do it in any other browsers. + */ + if ( ie67 ) { + divBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+barWidth ); + } + } + + if ( scrollY && scroll.bCollapse ) { + divBodyStyle.height = _fnStringToCss( scrollY ); + + var iExtra = (scrollX && tableEl.offsetWidth > divBodyEl.offsetWidth) ? + barWidth : + 0; + + if ( tableEl.offsetHeight < divBodyEl.offsetHeight ) { + divBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+iExtra ); + } + } + + /* Finally set the width's of the header and footer tables */ + var iOuterWidth = table.outerWidth(); + divHeaderTable[0].style.width = _fnStringToCss( iOuterWidth ); + divHeaderInnerStyle.width = _fnStringToCss( iOuterWidth ); + + // Figure out if there are scrollbar present - if so then we need a the header and footer to + // provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar) + var bScrolling = table.height() > divBodyEl.clientHeight || divBody.css('overflow-y') == "scroll"; + var padding = 'padding' + (browser.bScrollbarLeft ? 'Left' : 'Right' ); + divHeaderInnerStyle[ padding ] = bScrolling ? barWidth+"px" : "0px"; + + if ( footer ) { + divFooterTable[0].style.width = _fnStringToCss( iOuterWidth ); + divFooterInner[0].style.width = _fnStringToCss( iOuterWidth ); + divFooterInner[0].style[padding] = bScrolling ? barWidth+"px" : "0px"; + } + + /* Adjust the position of the header in case we loose the y-scrollbar */ + divBody.scroll(); + + // If sorting or filtering has occurred, jump the scrolling back to the top + // only if we aren't holding the position + if ( (settings.bSorted || settings.bFiltered) && ! settings._drawHold ) { + divBodyEl.scrollTop = 0; + } + } + + + + /** + * Apply a given function to the display child nodes of an element array (typically + * TD children of TR rows + * @param {function} fn Method to apply to the objects + * @param array {nodes} an1 List of elements to look through for display children + * @param array {nodes} an2 Another list (identical structure to the first) - optional + * @memberof DataTable#oApi + */ + function _fnApplyToChildren( fn, an1, an2 ) + { + var index=0, i=0, iLen=an1.length; + var nNode1, nNode2; + + while ( i < iLen ) { + nNode1 = an1[i].firstChild; + nNode2 = an2 ? an2[i].firstChild : null; + + while ( nNode1 ) { + if ( nNode1.nodeType === 1 ) { + if ( an2 ) { + fn( nNode1, nNode2, index ); + } + else { + fn( nNode1, index ); + } + + index++; + } + + nNode1 = nNode1.nextSibling; + nNode2 = an2 ? nNode2.nextSibling : null; + } + + i++; + } + } + + + + var __re_html_remove = /<.*?>/g; + + + /** + * Calculate the width of columns for the table + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnCalculateColumnWidths ( oSettings ) + { + var + table = oSettings.nTable, + columns = oSettings.aoColumns, + scroll = oSettings.oScroll, + scrollY = scroll.sY, + scrollX = scroll.sX, + scrollXInner = scroll.sXInner, + columnCount = columns.length, + visibleColumns = _fnGetColumns( oSettings, 'bVisible' ), + headerCells = $('th', oSettings.nTHead), + tableWidthAttr = table.getAttribute('width'), // from DOM element + tableContainer = table.parentNode, + userInputs = false, + i, column, columnIdx, width, outerWidth; + + var styleWidth = table.style.width; + if ( styleWidth && styleWidth.indexOf('%') !== -1 ) { + tableWidthAttr = styleWidth; + } + + /* Convert any user input sizes into pixel sizes */ + for ( i=0 ; i<visibleColumns.length ; i++ ) { + column = columns[ visibleColumns[i] ]; + + if ( column.sWidth !== null ) { + column.sWidth = _fnConvertToWidth( column.sWidthOrig, tableContainer ); + + userInputs = true; + } + } + + /* If the number of columns in the DOM equals the number that we have to + * process in DataTables, then we can use the offsets that are created by + * the web- browser. No custom sizes can be set in order for this to happen, + * nor scrolling used + */ + if ( ! userInputs && ! scrollX && ! scrollY && + columnCount == _fnVisbleColumns( oSettings ) && + columnCount == headerCells.length + ) { + for ( i=0 ; i<columnCount ; i++ ) { + columns[i].sWidth = _fnStringToCss( headerCells.eq(i).width() ); + } + } + else + { + // Otherwise construct a single row, worst case, table with the widest + // node in the data, assign any user defined widths, then insert it into + // the DOM and allow the browser to do all the hard work of calculating + // table widths + var tmpTable = $(table).clone() // don't use cloneNode - IE8 will remove events on the main table + .css( 'visibility', 'hidden' ) + .removeAttr( 'id' ); + + // Clean up the table body + tmpTable.find('tbody tr').remove(); + var tr = $('<tr/>').appendTo( tmpTable.find('tbody') ); + + // Remove any assigned widths from the footer (from scrolling) + tmpTable.find('tfoot th, tfoot td').css('width', ''); + + // Apply custom sizing to the cloned header + headerCells = _fnGetUniqueThs( oSettings, tmpTable.find('thead')[0] ); + + for ( i=0 ; i<visibleColumns.length ; i++ ) { + column = columns[ visibleColumns[i] ]; + + headerCells[i].style.width = column.sWidthOrig !== null && column.sWidthOrig !== '' ? + _fnStringToCss( column.sWidthOrig ) : + ''; + } + + // Find the widest cell for each column and put it into the table + if ( oSettings.aoData.length ) { + for ( i=0 ; i<visibleColumns.length ; i++ ) { + columnIdx = visibleColumns[i]; + column = columns[ columnIdx ]; + + $( _fnGetWidestNode( oSettings, columnIdx ) ) + .clone( false ) + .append( column.sContentPadding ) + .appendTo( tr ); + } + } + + // Table has been built, attach to the document so we can work with it + tmpTable.appendTo( tableContainer ); + + // When scrolling (X or Y) we want to set the width of the table as + // appropriate. However, when not scrolling leave the table width as it + // is. This results in slightly different, but I think correct behaviour + if ( scrollX && scrollXInner ) { + tmpTable.width( scrollXInner ); + } + else if ( scrollX ) { + tmpTable.css( 'width', 'auto' ); + + if ( tmpTable.width() < tableContainer.offsetWidth ) { + tmpTable.width( tableContainer.offsetWidth ); + } + } + else if ( scrollY ) { + tmpTable.width( tableContainer.offsetWidth ); + } + else if ( tableWidthAttr ) { + tmpTable.width( tableWidthAttr ); + } + + // Take into account the y scrollbar + _fnScrollingWidthAdjust( oSettings, tmpTable[0] ); + + // Browsers need a bit of a hand when a width is assigned to any columns + // when x-scrolling as they tend to collapse the table to the min-width, + // even if we sent the column widths. So we need to keep track of what + // the table width should be by summing the user given values, and the + // automatic values + if ( scrollX ) + { + var total = 0; + + for ( i=0 ; i<visibleColumns.length ; i++ ) { + column = columns[ visibleColumns[i] ]; + outerWidth = $(headerCells[i]).outerWidth(); + + total += column.sWidthOrig === null ? + outerWidth : + parseInt( column.sWidth, 10 ) + outerWidth - $(headerCells[i]).width(); + } + + tmpTable.width( _fnStringToCss( total ) ); + table.style.width = _fnStringToCss( total ); + } + + // Get the width of each column in the constructed table + for ( i=0 ; i<visibleColumns.length ; i++ ) { + column = columns[ visibleColumns[i] ]; + width = $(headerCells[i]).width(); + + if ( width ) { + column.sWidth = _fnStringToCss( width ); + } + } + + table.style.width = _fnStringToCss( tmpTable.css('width') ); + + // Finished with the table - ditch it + tmpTable.remove(); + } + + // If there is a width attr, we want to attach an event listener which + // allows the table sizing to automatically adjust when the window is + // resized. Use the width attr rather than CSS, since we can't know if the + // CSS is a relative value or absolute - DOM read is always px. + if ( tableWidthAttr ) { + table.style.width = _fnStringToCss( tableWidthAttr ); + } + + if ( (tableWidthAttr || scrollX) && ! oSettings._reszEvt ) { + var bindResize = function () { + $(window).bind('resize.DT-'+oSettings.sInstance, _fnThrottle( function () { + _fnAdjustColumnSizing( oSettings ); + } ) ); + }; + + // IE6/7 will crash if we bind a resize event handler on page load. + // To be removed in 1.11 which drops IE6/7 support + if ( oSettings.oBrowser.bScrollOversize ) { + setTimeout( bindResize, 1000 ); + } + else { + bindResize(); + } + + oSettings._reszEvt = true; + } + } + + + /** + * Throttle the calls to a function. Arguments and context are maintained for + * the throttled function + * @param {function} fn Function to be called + * @param {int} [freq=200] call frequency in mS + * @returns {function} wrapped function + * @memberof DataTable#oApi + */ + function _fnThrottle( fn, freq ) { + var + frequency = freq !== undefined ? freq : 200, + last, + timer; + + return function () { + var + that = this, + now = +new Date(), + args = arguments; + + if ( last && now < last + frequency ) { + clearTimeout( timer ); + + timer = setTimeout( function () { + last = undefined; + fn.apply( that, args ); + }, frequency ); + } + else { + last = now; + fn.apply( that, args ); + } + }; + } + + + /** + * Convert a CSS unit width to pixels (e.g. 2em) + * @param {string} width width to be converted + * @param {node} parent parent to get the with for (required for relative widths) - optional + * @returns {int} width in pixels + * @memberof DataTable#oApi + */ + function _fnConvertToWidth ( width, parent ) + { + if ( ! width ) { + return 0; + } + + var n = $('<div/>') + .css( 'width', _fnStringToCss( width ) ) + .appendTo( parent || document.body ); + + var val = n[0].offsetWidth; + n.remove(); + + return val; + } + + + /** + * Adjust a table's width to take account of vertical scroll bar + * @param {object} oSettings dataTables settings object + * @param {node} n table node + * @memberof DataTable#oApi + */ + + function _fnScrollingWidthAdjust ( settings, n ) + { + var scroll = settings.oScroll; + + if ( scroll.sX || scroll.sY ) { + // When y-scrolling only, we want to remove the width of the scroll bar + // so the table + scroll bar will fit into the area available, otherwise + // we fix the table at its current size with no adjustment + var correction = ! scroll.sX ? scroll.iBarWidth : 0; + n.style.width = _fnStringToCss( $(n).outerWidth() - correction ); + } + } + + + /** + * Get the widest node + * @param {object} settings dataTables settings object + * @param {int} colIdx column of interest + * @returns {node} widest table node + * @memberof DataTable#oApi + */ + function _fnGetWidestNode( settings, colIdx ) + { + var idx = _fnGetMaxLenString( settings, colIdx ); + if ( idx < 0 ) { + return null; + } + + var data = settings.aoData[ idx ]; + return ! data.nTr ? // Might not have been created when deferred rendering + $('<td/>').html( _fnGetCellData( settings, idx, colIdx, 'display' ) )[0] : + data.anCells[ colIdx ]; + } + + + /** + * Get the maximum strlen for each data column + * @param {object} settings dataTables settings object + * @param {int} colIdx column of interest + * @returns {string} max string length for each column + * @memberof DataTable#oApi + */ + function _fnGetMaxLenString( settings, colIdx ) + { + var s, max=-1, maxIdx = -1; + + for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) { + s = _fnGetCellData( settings, i, colIdx, 'display' )+''; + s = s.replace( __re_html_remove, '' ); + + if ( s.length > max ) { + max = s.length; + maxIdx = i; + } + } + + return maxIdx; + } + + + /** + * Append a CSS unit (only if required) to a string + * @param {string} value to css-ify + * @returns {string} value with css unit + * @memberof DataTable#oApi + */ + function _fnStringToCss( s ) + { + if ( s === null ) { + return '0px'; + } + + if ( typeof s == 'number' ) { + return s < 0 ? + '0px' : + s+'px'; + } + + // Check it has a unit character already + return s.match(/\d$/) ? + s+'px' : + s; + } + + + /** + * Get the width of a scroll bar in this browser being used + * @returns {int} width in pixels + * @memberof DataTable#oApi + */ + function _fnScrollBarWidth () + { + // On first run a static variable is set, since this is only needed once. + // Subsequent runs will just use the previously calculated value + var width = DataTable.__scrollbarWidth; + + if ( width === undefined ) { + var sizer = $('<p/>').css( { + position: 'absolute', + top: 0, + left: 0, + width: '100%', + height: 150, + padding: 0, + overflow: 'scroll', + visibility: 'hidden' + } ) + .appendTo('body'); + + width = sizer[0].offsetWidth - sizer[0].clientWidth; + DataTable.__scrollbarWidth = width; + + sizer.remove(); + } + + return width; + } + + + + function _fnSortFlatten ( settings ) + { + var + i, iLen, k, kLen, + aSort = [], + aiOrig = [], + aoColumns = settings.aoColumns, + aDataSort, iCol, sType, srcCol, + fixed = settings.aaSortingFixed, + fixedObj = $.isPlainObject( fixed ), + nestedSort = [], + add = function ( a ) { + if ( a.length && ! $.isArray( a[0] ) ) { + // 1D array + nestedSort.push( a ); + } + else { + // 2D array + nestedSort.push.apply( nestedSort, a ); + } + }; + + // Build the sort array, with pre-fix and post-fix options if they have been + // specified + if ( $.isArray( fixed ) ) { + add( fixed ); + } + + if ( fixedObj && fixed.pre ) { + add( fixed.pre ); + } + + add( settings.aaSorting ); + + if (fixedObj && fixed.post ) { + add( fixed.post ); + } + + for ( i=0 ; i<nestedSort.length ; i++ ) + { + srcCol = nestedSort[i][0]; + aDataSort = aoColumns[ srcCol ].aDataSort; + + for ( k=0, kLen=aDataSort.length ; k<kLen ; k++ ) + { + iCol = aDataSort[k]; + sType = aoColumns[ iCol ].sType || 'string'; + + if ( nestedSort[i]._idx === undefined ) { + nestedSort[i]._idx = $.inArray( nestedSort[i][1], aoColumns[iCol].asSorting ); + } + + aSort.push( { + src: srcCol, + col: iCol, + dir: nestedSort[i][1], + index: nestedSort[i]._idx, + type: sType, + formatter: DataTable.ext.type.order[ sType+"-pre" ] + } ); + } + } + + return aSort; + } + + /** + * Change the order of the table + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + * @todo This really needs split up! + */ + function _fnSort ( oSettings ) + { + var + i, ien, iLen, j, jLen, k, kLen, + sDataType, nTh, + aiOrig = [], + oExtSort = DataTable.ext.type.order, + aoData = oSettings.aoData, + aoColumns = oSettings.aoColumns, + aDataSort, data, iCol, sType, oSort, + formatters = 0, + sortCol, + displayMaster = oSettings.aiDisplayMaster, + aSort; + + // Resolve any column types that are unknown due to addition or invalidation + // @todo Can this be moved into a 'data-ready' handler which is called when + // data is going to be used in the table? + _fnColumnTypes( oSettings ); + + aSort = _fnSortFlatten( oSettings ); + + for ( i=0, ien=aSort.length ; i<ien ; i++ ) { + sortCol = aSort[i]; + + // Track if we can use the fast sort algorithm + if ( sortCol.formatter ) { + formatters++; + } + + // Load the data needed for the sort, for each cell + _fnSortData( oSettings, sortCol.col ); + } + + /* No sorting required if server-side or no sorting array */ + if ( _fnDataSource( oSettings ) != 'ssp' && aSort.length !== 0 ) + { + // Create a value - key array of the current row positions such that we can use their + // current position during the sort, if values match, in order to perform stable sorting + for ( i=0, iLen=displayMaster.length ; i<iLen ; i++ ) { + aiOrig[ displayMaster[i] ] = i; + } + + /* Do the sort - here we want multi-column sorting based on a given data source (column) + * and sorting function (from oSort) in a certain direction. It's reasonably complex to + * follow on it's own, but this is what we want (example two column sorting): + * fnLocalSorting = function(a,b){ + * var iTest; + * iTest = oSort['string-asc']('data11', 'data12'); + * if (iTest !== 0) + * return iTest; + * iTest = oSort['numeric-desc']('data21', 'data22'); + * if (iTest !== 0) + * return iTest; + * return oSort['numeric-asc']( aiOrig[a], aiOrig[b] ); + * } + * Basically we have a test for each sorting column, if the data in that column is equal, + * test the next column. If all columns match, then we use a numeric sort on the row + * positions in the original data array to provide a stable sort. + * + * Note - I know it seems excessive to have two sorting methods, but the first is around + * 15% faster, so the second is only maintained for backwards compatibility with sorting + * methods which do not have a pre-sort formatting function. + */ + if ( formatters === aSort.length ) { + // All sort types have formatting functions + displayMaster.sort( function ( a, b ) { + var + x, y, k, test, sort, + len=aSort.length, + dataA = aoData[a]._aSortData, + dataB = aoData[b]._aSortData; + + for ( k=0 ; k<len ; k++ ) { + sort = aSort[k]; + + x = dataA[ sort.col ]; + y = dataB[ sort.col ]; + + test = x<y ? -1 : x>y ? 1 : 0; + if ( test !== 0 ) { + return sort.dir === 'asc' ? test : -test; + } + } + + x = aiOrig[a]; + y = aiOrig[b]; + return x<y ? -1 : x>y ? 1 : 0; + } ); + } + else { + // Depreciated - remove in 1.11 (providing a plug-in option) + // Not all sort types have formatting methods, so we have to call their sorting + // methods. + displayMaster.sort( function ( a, b ) { + var + x, y, k, l, test, sort, fn, + len=aSort.length, + dataA = aoData[a]._aSortData, + dataB = aoData[b]._aSortData; + + for ( k=0 ; k<len ; k++ ) { + sort = aSort[k]; + + x = dataA[ sort.col ]; + y = dataB[ sort.col ]; + + fn = oExtSort[ sort.type+"-"+sort.dir ] || oExtSort[ "string-"+sort.dir ]; + test = fn( x, y ); + if ( test !== 0 ) { + return test; + } + } + + x = aiOrig[a]; + y = aiOrig[b]; + return x<y ? -1 : x>y ? 1 : 0; + } ); + } + } + + /* Tell the draw function that we have sorted the data */ + oSettings.bSorted = true; + } + + + function _fnSortAria ( settings ) + { + var label; + var nextSort; + var columns = settings.aoColumns; + var aSort = _fnSortFlatten( settings ); + var oAria = settings.oLanguage.oAria; + + // ARIA attributes - need to loop all columns, to update all (removing old + // attributes as needed) + for ( var i=0, iLen=columns.length ; i<iLen ; i++ ) + { + var col = columns[i]; + var asSorting = col.asSorting; + var sTitle = col.sTitle.replace( /<.*?>/g, "" ); + var th = col.nTh; + + // IE7 is throwing an error when setting these properties with jQuery's + // attr() and removeAttr() methods... + th.removeAttribute('aria-sort'); + + /* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */ + if ( col.bSortable ) { + if ( aSort.length > 0 && aSort[0].col == i ) { + th.setAttribute('aria-sort', aSort[0].dir=="asc" ? "ascending" : "descending" ); + nextSort = asSorting[ aSort[0].index+1 ] || asSorting[0]; + } + else { + nextSort = asSorting[0]; + } + + label = sTitle + ( nextSort === "asc" ? + oAria.sSortAscending : + oAria.sSortDescending + ); + } + else { + label = sTitle; + } + + th.setAttribute('aria-label', label); + } + } + + + /** + * Function to run on user sort request + * @param {object} settings dataTables settings object + * @param {node} attachTo node to attach the handler to + * @param {int} colIdx column sorting index + * @param {boolean} [append=false] Append the requested sort to the existing + * sort if true (i.e. multi-column sort) + * @param {function} [callback] callback function + * @memberof DataTable#oApi + */ + function _fnSortListener ( settings, colIdx, append, callback ) + { + var col = settings.aoColumns[ colIdx ]; + var sorting = settings.aaSorting; + var asSorting = col.asSorting; + var nextSortIdx; + var next = function ( a, overflow ) { + var idx = a._idx; + if ( idx === undefined ) { + idx = $.inArray( a[1], asSorting ); + } + + return idx+1 < asSorting.length ? + idx+1 : + overflow ? + null : + 0; + }; + + // Convert to 2D array if needed + if ( typeof sorting[0] === 'number' ) { + sorting = settings.aaSorting = [ sorting ]; + } + + // If appending the sort then we are multi-column sorting + if ( append && settings.oFeatures.bSortMulti ) { + // Are we already doing some kind of sort on this column? + var sortIdx = $.inArray( colIdx, _pluck(sorting, '0') ); + + if ( sortIdx !== -1 ) { + // Yes, modify the sort + nextSortIdx = next( sorting[sortIdx], true ); + + if ( nextSortIdx === null && sorting.length === 1 ) { + nextSortIdx = 0; // can't remove sorting completely + } + + if ( nextSortIdx === null ) { + sorting.splice( sortIdx, 1 ); + } + else { + sorting[sortIdx][1] = asSorting[ nextSortIdx ]; + sorting[sortIdx]._idx = nextSortIdx; + } + } + else { + // No sort on this column yet + sorting.push( [ colIdx, asSorting[0], 0 ] ); + sorting[sorting.length-1]._idx = 0; + } + } + else if ( sorting.length && sorting[0][0] == colIdx ) { + // Single column - already sorting on this column, modify the sort + nextSortIdx = next( sorting[0] ); + + sorting.length = 1; + sorting[0][1] = asSorting[ nextSortIdx ]; + sorting[0]._idx = nextSortIdx; + } + else { + // Single column - sort only on this column + sorting.length = 0; + sorting.push( [ colIdx, asSorting[0] ] ); + sorting[0]._idx = 0; + } + + // Run the sort by calling a full redraw + _fnReDraw( settings ); + + // callback used for async user interaction + if ( typeof callback == 'function' ) { + callback( settings ); + } + } + + + /** + * Attach a sort handler (click) to a node + * @param {object} settings dataTables settings object + * @param {node} attachTo node to attach the handler to + * @param {int} colIdx column sorting index + * @param {function} [callback] callback function + * @memberof DataTable#oApi + */ + function _fnSortAttachListener ( settings, attachTo, colIdx, callback ) + { + var col = settings.aoColumns[ colIdx ]; + + _fnBindAction( attachTo, {}, function (e) { + /* If the column is not sortable - don't to anything */ + if ( col.bSortable === false ) { + return; + } + + // If processing is enabled use a timeout to allow the processing + // display to be shown - otherwise to it synchronously + if ( settings.oFeatures.bProcessing ) { + _fnProcessingDisplay( settings, true ); + + setTimeout( function() { + _fnSortListener( settings, colIdx, e.shiftKey, callback ); + + // In server-side processing, the draw callback will remove the + // processing display + if ( _fnDataSource( settings ) !== 'ssp' ) { + _fnProcessingDisplay( settings, false ); + } + }, 0 ); + } + else { + _fnSortListener( settings, colIdx, e.shiftKey, callback ); + } + } ); + } + + + /** + * Set the sorting classes on table's body, Note: it is safe to call this function + * when bSort and bSortClasses are false + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnSortingClasses( settings ) + { + var oldSort = settings.aLastSort; + var sortClass = settings.oClasses.sSortColumn; + var sort = _fnSortFlatten( settings ); + var features = settings.oFeatures; + var i, ien, colIdx; + + if ( features.bSort && features.bSortClasses ) { + // Remove old sorting classes + for ( i=0, ien=oldSort.length ; i<ien ; i++ ) { + colIdx = oldSort[i].src; + + // Remove column sorting + $( _pluck( settings.aoData, 'anCells', colIdx ) ) + .removeClass( sortClass + (i<2 ? i+1 : 3) ); + } + + // Add new column sorting + for ( i=0, ien=sort.length ; i<ien ; i++ ) { + colIdx = sort[i].src; + + $( _pluck( settings.aoData, 'anCells', colIdx ) ) + .addClass( sortClass + (i<2 ? i+1 : 3) ); + } + } + + settings.aLastSort = sort; + } + + + // Get the data to sort a column, be it from cache, fresh (populating the + // cache), or from a sort formatter + function _fnSortData( settings, idx ) + { + // Custom sorting function - provided by the sort data type + var column = settings.aoColumns[ idx ]; + var customSort = DataTable.ext.order[ column.sSortDataType ]; + var customData; + + if ( customSort ) { + customData = customSort.call( settings.oInstance, settings, idx, + _fnColumnIndexToVisible( settings, idx ) + ); + } + + // Use / populate cache + var row, cellData; + var formatter = DataTable.ext.type.order[ column.sType+"-pre" ]; + + for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) { + row = settings.aoData[i]; + + if ( ! row._aSortData ) { + row._aSortData = []; + } + + if ( ! row._aSortData[idx] || customSort ) { + cellData = customSort ? + customData[i] : // If there was a custom sort function, use data from there + _fnGetCellData( settings, i, idx, 'sort' ); + + row._aSortData[ idx ] = formatter ? + formatter( cellData ) : + cellData; + } + } + } + + + + /** + * Save the state of a table + * @param {object} oSettings dataTables settings object + * @memberof DataTable#oApi + */ + function _fnSaveState ( settings ) + { + if ( !settings.oFeatures.bStateSave || settings.bDestroying ) + { + return; + } + + /* Store the interesting variables */ + var state = { + time: +new Date(), + start: settings._iDisplayStart, + length: settings._iDisplayLength, + order: $.extend( true, [], settings.aaSorting ), + search: _fnSearchToCamel( settings.oPreviousSearch ), + columns: $.map( settings.aoColumns, function ( col, i ) { + return { + visible: col.bVisible, + search: _fnSearchToCamel( settings.aoPreSearchCols[i] ) + }; + } ) + }; + + _fnCallbackFire( settings, "aoStateSaveParams", 'stateSaveParams', [settings, state] ); + + settings.oSavedState = state; + settings.fnStateSaveCallback.call( settings.oInstance, settings, state ); + } + + + /** + * Attempt to load a saved table state + * @param {object} oSettings dataTables settings object + * @param {object} oInit DataTables init object so we can override settings + * @memberof DataTable#oApi + */ + function _fnLoadState ( settings, oInit ) + { + var i, ien; + var columns = settings.aoColumns; + + if ( ! settings.oFeatures.bStateSave ) { + return; + } + + var state = settings.fnStateLoadCallback.call( settings.oInstance, settings ); + if ( ! state || ! state.time ) { + return; + } + + /* Allow custom and plug-in manipulation functions to alter the saved data set and + * cancelling of loading by returning false + */ + var abStateLoad = _fnCallbackFire( settings, 'aoStateLoadParams', 'stateLoadParams', [settings, state] ); + if ( $.inArray( false, abStateLoad ) !== -1 ) { + return; + } + + /* Reject old data */ + var duration = settings.iStateDuration; + if ( duration > 0 && state.time < +new Date() - (duration*1000) ) { + return; + } + + // Number of columns have changed - all bets are off, no restore of settings + if ( columns.length !== state.columns.length ) { + return; + } + + // Store the saved state so it might be accessed at any time + settings.oLoadedState = $.extend( true, {}, state ); + + // Restore key features - todo - for 1.11 this needs to be done by + // subscribed events + if ( state.start !== undefined ) { + settings._iDisplayStart = state.start; + settings.iInitDisplayStart = state.start; + } + if ( state.length !== undefined ) { + settings._iDisplayLength = state.length; + } + + // Order + if ( state.order !== undefined ) { + settings.aaSorting = []; + $.each( state.order, function ( i, col ) { + settings.aaSorting.push( col[0] >= columns.length ? + [ 0, col[1] ] : + col + ); + } ); + } + + // Search + if ( state.search !== undefined ) { + $.extend( settings.oPreviousSearch, _fnSearchToHung( state.search ) ); + } + + // Columns + for ( i=0, ien=state.columns.length ; i<ien ; i++ ) { + var col = state.columns[i]; + + // Visibility + if ( col.visible !== undefined ) { + columns[i].bVisible = col.visible; + } + + // Search + if ( col.search !== undefined ) { + $.extend( settings.aoPreSearchCols[i], _fnSearchToHung( col.search ) ); + } + } + + _fnCallbackFire( settings, 'aoStateLoaded', 'stateLoaded', [settings, state] ); + } + + + /** + * Return the settings object for a particular table + * @param {node} table table we are using as a dataTable + * @returns {object} Settings object - or null if not found + * @memberof DataTable#oApi + */ + function _fnSettingsFromNode ( table ) + { + var settings = DataTable.settings; + var idx = $.inArray( table, _pluck( settings, 'nTable' ) ); + + return idx !== -1 ? + settings[ idx ] : + null; + } + + + /** + * Log an error message + * @param {object} settings dataTables settings object + * @param {int} level log error messages, or display them to the user + * @param {string} msg error message + * @param {int} tn Technical note id to get more information about the error. + * @memberof DataTable#oApi + */ + function _fnLog( settings, level, msg, tn ) + { + msg = 'DataTables warning: '+ + (settings!==null ? 'table id='+settings.sTableId+' - ' : '')+msg; + + if ( tn ) { + msg += '. For more information about this error, please see '+ + 'http://datatables.net/tn/'+tn; + } + + if ( ! level ) { + // Backwards compatibility pre 1.10 + var ext = DataTable.ext; + var type = ext.sErrMode || ext.errMode; + + _fnCallbackFire( settings, null, 'error', [ settings, tn, msg ] ); + + if ( type == 'alert' ) { + alert( msg ); + } + else if ( type == 'throw' ) { + throw new Error(msg); + } + else if ( typeof type == 'function' ) { + type( settings, tn, msg ); + } + } + else if ( window.console && console.log ) { + console.log( msg ); + } + } + + + /** + * See if a property is defined on one object, if so assign it to the other object + * @param {object} ret target object + * @param {object} src source object + * @param {string} name property + * @param {string} [mappedName] name to map too - optional, name used if not given + * @memberof DataTable#oApi + */ + function _fnMap( ret, src, name, mappedName ) + { + if ( $.isArray( name ) ) { + $.each( name, function (i, val) { + if ( $.isArray( val ) ) { + _fnMap( ret, src, val[0], val[1] ); + } + else { + _fnMap( ret, src, val ); + } + } ); + + return; + } + + if ( mappedName === undefined ) { + mappedName = name; + } + + if ( src[name] !== undefined ) { + ret[mappedName] = src[name]; + } + } + + + /** + * Extend objects - very similar to jQuery.extend, but deep copy objects, and + * shallow copy arrays. The reason we need to do this, is that we don't want to + * deep copy array init values (such as aaSorting) since the dev wouldn't be + * able to override them, but we do want to deep copy arrays. + * @param {object} out Object to extend + * @param {object} extender Object from which the properties will be applied to + * out + * @param {boolean} breakRefs If true, then arrays will be sliced to take an + * independent copy with the exception of the `data` or `aaData` parameters + * if they are present. This is so you can pass in a collection to + * DataTables and have that used as your data source without breaking the + * references + * @returns {object} out Reference, just for convenience - out === the return. + * @memberof DataTable#oApi + * @todo This doesn't take account of arrays inside the deep copied objects. + */ + function _fnExtend( out, extender, breakRefs ) + { + var val; + + for ( var prop in extender ) { + if ( extender.hasOwnProperty(prop) ) { + val = extender[prop]; + + if ( $.isPlainObject( val ) ) { + if ( ! $.isPlainObject( out[prop] ) ) { + out[prop] = {}; + } + $.extend( true, out[prop], val ); + } + else if ( breakRefs && prop !== 'data' && prop !== 'aaData' && $.isArray(val) ) { + out[prop] = val.slice(); + } + else { + out[prop] = val; + } + } + } + + return out; + } + + + /** + * Bind an event handers to allow a click or return key to activate the callback. + * This is good for accessibility since a return on the keyboard will have the + * same effect as a click, if the element has focus. + * @param {element} n Element to bind the action to + * @param {object} oData Data object to pass to the triggered function + * @param {function} fn Callback function for when the event is triggered + * @memberof DataTable#oApi + */ + function _fnBindAction( n, oData, fn ) + { + $(n) + .bind( 'click.DT', oData, function (e) { + n.blur(); // Remove focus outline for mouse users + fn(e); + } ) + .bind( 'keypress.DT', oData, function (e){ + if ( e.which === 13 ) { + e.preventDefault(); + fn(e); + } + } ) + .bind( 'selectstart.DT', function () { + /* Take the brutal approach to cancelling text selection */ + return false; + } ); + } + + + /** + * Register a callback function. Easily allows a callback function to be added to + * an array store of callback functions that can then all be called together. + * @param {object} oSettings dataTables settings object + * @param {string} sStore Name of the array storage for the callbacks in oSettings + * @param {function} fn Function to be called back + * @param {string} sName Identifying name for the callback (i.e. a label) + * @memberof DataTable#oApi + */ + function _fnCallbackReg( oSettings, sStore, fn, sName ) + { + if ( fn ) + { + oSettings[sStore].push( { + "fn": fn, + "sName": sName + } ); + } + } + + + /** + * Fire callback functions and trigger events. Note that the loop over the + * callback array store is done backwards! Further note that you do not want to + * fire off triggers in time sensitive applications (for example cell creation) + * as its slow. + * @param {object} settings dataTables settings object + * @param {string} callbackArr Name of the array storage for the callbacks in + * oSettings + * @param {string} eventName Name of the jQuery custom event to trigger. If + * null no trigger is fired + * @param {array} args Array of arguments to pass to the callback function / + * trigger + * @memberof DataTable#oApi + */ + function _fnCallbackFire( settings, callbackArr, eventName, args ) + { + var ret = []; + + if ( callbackArr ) { + ret = $.map( settings[callbackArr].slice().reverse(), function (val, i) { + return val.fn.apply( settings.oInstance, args ); + } ); + } + + if ( eventName !== null ) { + var e = $.Event( eventName+'.dt' ); + + $(settings.nTable).trigger( e, args ); + + ret.push( e.result ); + } + + return ret; + } + + + function _fnLengthOverflow ( settings ) + { + var + start = settings._iDisplayStart, + end = settings.fnDisplayEnd(), + len = settings._iDisplayLength; + + /* If we have space to show extra rows (backing up from the end point - then do so */ + if ( start >= end ) + { + start = end - len; + } + + // Keep the start record on the current page + start -= (start % len); + + if ( len === -1 || start < 0 ) + { + start = 0; + } + + settings._iDisplayStart = start; + } + + + function _fnRenderer( settings, type ) + { + var renderer = settings.renderer; + var host = DataTable.ext.renderer[type]; + + if ( $.isPlainObject( renderer ) && renderer[type] ) { + // Specific renderer for this type. If available use it, otherwise use + // the default. + return host[renderer[type]] || host._; + } + else if ( typeof renderer === 'string' ) { + // Common renderer - if there is one available for this type use it, + // otherwise use the default + return host[renderer] || host._; + } + + // Use the default + return host._; + } + + + /** + * Detect the data source being used for the table. Used to simplify the code + * a little (ajax) and to make it compress a little smaller. + * + * @param {object} settings dataTables settings object + * @returns {string} Data source + * @memberof DataTable#oApi + */ + function _fnDataSource ( settings ) + { + if ( settings.oFeatures.bServerSide ) { + return 'ssp'; + } + else if ( settings.ajax || settings.sAjaxSource ) { + return 'ajax'; + } + return 'dom'; + } + + + DataTable = function( options ) + { + /** + * Perform a jQuery selector action on the table's TR elements (from the tbody) and + * return the resulting jQuery object. + * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on + * @param {object} [oOpts] Optional parameters for modifying the rows to be included + * @param {string} [oOpts.filter=none] Select TR elements that meet the current filter + * criterion ("applied") or all TR elements (i.e. no filter). + * @param {string} [oOpts.order=current] Order of the TR elements in the processed array. + * Can be either 'current', whereby the current sorting of the table is used, or + * 'original' whereby the original order the data was read into the table is used. + * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page + * ("current") or not ("all"). If 'current' is given, then order is assumed to be + * 'current' and filter is 'applied', regardless of what they might be given as. + * @returns {object} jQuery object, filtered by the given selector. + * @dtopt API + * @deprecated Since v1.10 + * + * @example + * $(document).ready(function() { + * var oTable = $('#example').dataTable(); + * + * // Highlight every second row + * oTable.$('tr:odd').css('backgroundColor', 'blue'); + * } ); + * + * @example + * $(document).ready(function() { + * var oTable = $('#example').dataTable(); + * + * // Filter to rows with 'Webkit' in them, add a background colour and then + * // remove the filter, thus highlighting the 'Webkit' rows only. + * oTable.fnFilter('Webkit'); + * oTable.$('tr', {"search": "applied"}).css('backgroundColor', 'blue'); + * oTable.fnFilter(''); + * } ); + */ + this.$ = function ( sSelector, oOpts ) + { + return this.api(true).$( sSelector, oOpts ); + }; + + + /** + * Almost identical to $ in operation, but in this case returns the data for the matched + * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes + * rather than any descendants, so the data can be obtained for the row/cell. If matching + * rows are found, the data returned is the original data array/object that was used to + * create the row (or a generated array if from a DOM source). + * + * This method is often useful in-combination with $ where both functions are given the + * same parameters and the array indexes will match identically. + * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on + * @param {object} [oOpts] Optional parameters for modifying the rows to be included + * @param {string} [oOpts.filter=none] Select elements that meet the current filter + * criterion ("applied") or all elements (i.e. no filter). + * @param {string} [oOpts.order=current] Order of the data in the processed array. + * Can be either 'current', whereby the current sorting of the table is used, or + * 'original' whereby the original order the data was read into the table is used. + * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page + * ("current") or not ("all"). If 'current' is given, then order is assumed to be + * 'current' and filter is 'applied', regardless of what they might be given as. + * @returns {array} Data for the matched elements. If any elements, as a result of the + * selector, were not TR, TD or TH elements in the DataTable, they will have a null + * entry in the array. + * @dtopt API + * @deprecated Since v1.10 + * + * @example + * $(document).ready(function() { + * var oTable = $('#example').dataTable(); + * + * // Get the data from the first row in the table + * var data = oTable._('tr:first'); + * + * // Do something useful with the data + * alert( "First cell is: "+data[0] ); + * } ); + * + * @example + * $(document).ready(function() { + * var oTable = $('#example').dataTable(); + * + * // Filter to 'Webkit' and get all data for + * oTable.fnFilter('Webkit'); + * var data = oTable._('tr', {"search": "applied"}); + * + * // Do something with the data + * alert( data.length+" rows matched the search" ); + * } ); + */ + this._ = function ( sSelector, oOpts ) + { + return this.api(true).rows( sSelector, oOpts ).data(); + }; + + + /** + * Create a DataTables Api instance, with the currently selected tables for + * the Api's context. + * @param {boolean} [traditional=false] Set the API instance's context to be + * only the table referred to by the `DataTable.ext.iApiIndex` option, as was + * used in the API presented by DataTables 1.9- (i.e. the traditional mode), + * or if all tables captured in the jQuery object should be used. + * @return {DataTables.Api} + */ + this.api = function ( traditional ) + { + return traditional ? + new _Api( + _fnSettingsFromNode( this[ _ext.iApiIndex ] ) + ) : + new _Api( this ); + }; + + + /** + * Add a single new row or multiple rows of data to the table. Please note + * that this is suitable for client-side processing only - if you are using + * server-side processing (i.e. "bServerSide": true), then to add data, you + * must add it to the data source, i.e. the server-side, through an Ajax call. + * @param {array|object} data The data to be added to the table. This can be: + * <ul> + * <li>1D array of data - add a single row with the data provided</li> + * <li>2D array of arrays - add multiple rows in a single call</li> + * <li>object - data object when using <i>mData</i></li> + * <li>array of objects - multiple data objects when using <i>mData</i></li> + * </ul> + * @param {bool} [redraw=true] redraw the table or not + * @returns {array} An array of integers, representing the list of indexes in + * <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to + * the table. + * @dtopt API + * @deprecated Since v1.10 + * + * @example + * // Global var for counter + * var giCount = 2; + * + * $(document).ready(function() { + * $('#example').dataTable(); + * } ); + * + * function fnClickAddRow() { + * $('#example').dataTable().fnAddData( [ + * giCount+".1", + * giCount+".2", + * giCount+".3", + * giCount+".4" ] + * ); + * + * giCount++; + * } + */ + this.fnAddData = function( data, redraw ) + { + var api = this.api( true ); + + /* Check if we want to add multiple rows or not */ + var rows = $.isArray(data) && ( $.isArray(data[0]) || $.isPlainObject(data[0]) ) ? + api.rows.add( data ) : + api.row.add( data ); + + if ( redraw === undefined || redraw ) { + api.draw(); + } + + return rows.flatten().toArray(); + }; + + + /** + * This function will make DataTables recalculate the column sizes, based on the data + * contained in the table and the sizes applied to the columns (in the DOM, CSS or + * through the sWidth parameter). This can be useful when the width of the table's + * parent element changes (for example a window resize). + * @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to + * @dtopt API + * @deprecated Since v1.10 + * + * @example + * $(document).ready(function() { + * var oTable = $('#example').dataTable( { + * "sScrollY": "200px", + * "bPaginate": false + * } ); + * + * $(window).bind('resize', function () { + * oTable.fnAdjustColumnSizing(); + * } ); + * } ); + */ + this.fnAdjustColumnSizing = function ( bRedraw ) + { + var api = this.api( true ).columns.adjust(); + var settings = api.settings()[0]; + var scroll = settings.oScroll; + + if ( bRedraw === undefined || bRedraw ) { + api.draw( false ); + } + else if ( scroll.sX !== "" || scroll.sY !== "" ) { + /* If not redrawing, but scrolling, we want to apply the new column sizes anyway */ + _fnScrollDraw( settings ); + } + }; + + + /** + * Quickly and simply clear a table + * @param {bool} [bRedraw=true] redraw the table or not + * @dtopt API + * @deprecated Since v1.10 + * + * @example + * $(document).ready(function() { + * var oTable = $('#example').dataTable(); + * + * // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...) + * oTable.fnClearTable(); + * } ); + */ + this.fnClearTable = function( bRedraw ) + { + var api = this.api( true ).clear(); + + if ( bRedraw === undefined || bRedraw ) { + api.draw(); + } + }; + + + /** + * The exact opposite of 'opening' a row, this function will close any rows which + * are currently 'open'. + * @param {node} nTr the table row to 'close' + * @returns {int} 0 on success, or 1 if failed (can't find the row) + * @dtopt API + * @deprecated Since v1.10 + * + * @example + * $(document).ready(function() { + * var oTable; + * + * // 'open' an information row when a row is clicked on + * $('#example tbody tr').click( function () { + * if ( oTable.fnIsOpen(this) ) { + * oTable.fnClose( this ); + * } else { + * oTable.fnOpen( this, "Temporary row opened", "info_row" ); + * } + * } ); + * + * oTable = $('#example').dataTable(); + * } ); + */ + this.fnClose = function( nTr ) + { + this.api( true ).row( nTr ).child.hide(); + }; + + + /** + * Remove a row for the table + * @param {mixed} target The index of the row from aoData to be deleted, or + * the TR element you want to delete + * @param {function|null} [callBack] Callback function + * @param {bool} [redraw=true] Redraw the table or not + * @returns {array} The row that was deleted + * @dtopt API + * @deprecated Since v1.10 + * + * @example + * $(document).ready(function() { + * var oTable = $('#example').dataTable(); + * + * // Immediately remove the first row + * oTable.fnDeleteRow( 0 ); + * } ); + */ + this.fnDeleteRow = function( target, callback, redraw ) + { + var api = this.api( true ); + var rows = api.rows( target ); + var settings = rows.settings()[0]; + var data = settings.aoData[ rows[0][0] ]; + + rows.remove(); + + if ( callback ) { + callback.call( this, settings, data ); + } + + if ( redraw === undefined || redraw ) { + api.draw(); + } + + return data; + }; + + + /** + * Restore the table to it's original state in the DOM by removing all of DataTables + * enhancements, alterations to the DOM structure of the table and event listeners. + * @param {boolean} [remove=false] Completely remove the table from the DOM + * @dtopt API + * @deprecated Since v1.10 + * + * @example + * $(document).ready(function() { + * // This example is fairly pointless in reality, but shows how fnDestroy can be used + * var oTable = $('#example').dataTable(); + * oTable.fnDestroy(); + * } ); + */ + this.fnDestroy = function ( remove ) + { + this.api( true ).destroy( remove ); + }; + + + /** + * Redraw the table + * @param {bool} [complete=true] Re-filter and resort (if enabled) the table before the draw. + * @dtopt API + * @deprecated Since v1.10 + * + * @example + * $(document).ready(function() { + * var oTable = $('#example').dataTable(); + * + * // Re-draw the table - you wouldn't want to do it here, but it's an example :-) + * oTable.fnDraw(); + * } ); + */ + this.fnDraw = function( complete ) + { + // Note that this isn't an exact match to the old call to _fnDraw - it takes + // into account the new data, but can hold position. + this.api( true ).draw( complete ); + }; + + + /** + * Filter the input based on data + * @param {string} sInput String to filter the table on + * @param {int|null} [iColumn] Column to limit filtering to + * @param {bool} [bRegex=false] Treat as regular expression or not + * @param {bool} [bSmart=true] Perform smart filtering or not + * @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es) + * @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false) + * @dtopt API + * @deprecated Since v1.10 + * + * @example + * $(document).ready(function() { + * var oTable = $('#example').dataTable(); + * + * // Sometime later - filter... + * oTable.fnFilter( 'test string' ); + * } ); + */ + this.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive ) + { + var api = this.api( true ); + + if ( iColumn === null || iColumn === undefined ) { + api.search( sInput, bRegex, bSmart, bCaseInsensitive ); + } + else { + api.column( iColumn ).search( sInput, bRegex, bSmart, bCaseInsensitive ); + } + + api.draw(); + }; + + + /** + * Get the data for the whole table, an individual row or an individual cell based on the + * provided parameters. + * @param {int|node} [src] A TR row node, TD/TH cell node or an integer. If given as + * a TR node then the data source for the whole row will be returned. If given as a + * TD/TH cell node then iCol will be automatically calculated and the data for the + * cell returned. If given as an integer, then this is treated as the aoData internal + * data index for the row (see fnGetPosition) and the data for that row used. + * @param {int} [col] Optional column index that you want the data of. + * @returns {array|object|string} If mRow is undefined, then the data for all rows is + * returned. If mRow is defined, just data for that row, and is iCol is + * defined, only data for the designated cell is returned. + * @dtopt API + * @deprecated Since v1.10 + * + * @example + * // Row data + * $(document).ready(function() { + * oTable = $('#example').dataTable(); + * + * oTable.$('tr').click( function () { + * var data = oTable.fnGetData( this ); + * // ... do something with the array / object of data for the row + * } ); + * } ); + * + * @example + * // Individual cell data + * $(document).ready(function() { + * oTable = $('#example').dataTable(); + * + * oTable.$('td').click( function () { + * var sData = oTable.fnGetData( this ); + * alert( 'The cell clicked on had the value of '+sData ); + * } ); + * } ); + */ + this.fnGetData = function( src, col ) + { + var api = this.api( true ); + + if ( src !== undefined ) { + var type = src.nodeName ? src.nodeName.toLowerCase() : ''; + + return col !== undefined || type == 'td' || type == 'th' ? + api.cell( src, col ).data() : + api.row( src ).data() || null; + } + + return api.data().toArray(); + }; + + + /** + * Get an array of the TR nodes that are used in the table's body. Note that you will + * typically want to use the '$' API method in preference to this as it is more + * flexible. + * @param {int} [iRow] Optional row index for the TR element you want + * @returns {array|node} If iRow is undefined, returns an array of all TR elements + * in the table's body, or iRow is defined, just the TR element requested. + * @dtopt API + * @deprecated Since v1.10 + * + * @example + * $(document).ready(function() { + * var oTable = $('#example').dataTable(); + * + * // Get the nodes from the table + * var nNodes = oTable.fnGetNodes( ); + * } ); + */ + this.fnGetNodes = function( iRow ) + { + var api = this.api( true ); + + return iRow !== undefined ? + api.row( iRow ).node() : + api.rows().nodes().flatten().toArray(); + }; + + + /** + * Get the array indexes of a particular cell from it's DOM element + * and column index including hidden columns + * @param {node} node this can either be a TR, TD or TH in the table's body + * @returns {int} If nNode is given as a TR, then a single index is returned, or + * if given as a cell, an array of [row index, column index (visible), + * column index (all)] is given. + * @dtopt API + * @deprecated Since v1.10 + * + * @example + * $(document).ready(function() { + * $('#example tbody td').click( function () { + * // Get the position of the current data from the node + * var aPos = oTable.fnGetPosition( this ); + * + * // Get the data array for this row + * var aData = oTable.fnGetData( aPos[0] ); + * + * // Update the data array and return the value + * aData[ aPos[1] ] = 'clicked'; + * this.innerHTML = 'clicked'; + * } ); + * + * // Init DataTables + * oTable = $('#example').dataTable(); + * } ); + */ + this.fnGetPosition = function( node ) + { + var api = this.api( true ); + var nodeName = node.nodeName.toUpperCase(); + + if ( nodeName == 'TR' ) { + return api.row( node ).index(); + } + else if ( nodeName == 'TD' || nodeName == 'TH' ) { + var cell = api.cell( node ).index(); + + return [ + cell.row, + cell.columnVisible, + cell.column + ]; + } + return null; + }; + + + /** + * Check to see if a row is 'open' or not. + * @param {node} nTr the table row to check + * @returns {boolean} true if the row is currently open, false otherwise + * @dtopt API + * @deprecated Since v1.10 + * + * @example + * $(document).ready(function() { + * var oTable; + * + * // 'open' an information row when a row is clicked on + * $('#example tbody tr').click( function () { + * if ( oTable.fnIsOpen(this) ) { + * oTable.fnClose( this ); + * } else { + * oTable.fnOpen( this, "Temporary row opened", "info_row" ); + * } + * } ); + * + * oTable = $('#example').dataTable(); + * } ); + */ + this.fnIsOpen = function( nTr ) + { + return this.api( true ).row( nTr ).child.isShown(); + }; + + + /** + * This function will place a new row directly after a row which is currently + * on display on the page, with the HTML contents that is passed into the + * function. This can be used, for example, to ask for confirmation that a + * particular record should be deleted. + * @param {node} nTr The table row to 'open' + * @param {string|node|jQuery} mHtml The HTML to put into the row + * @param {string} sClass Class to give the new TD cell + * @returns {node} The row opened. Note that if the table row passed in as the + * first parameter, is not found in the table, this method will silently + * return. + * @dtopt API + * @deprecated Since v1.10 + * + * @example + * $(document).ready(function() { + * var oTable; + * + * // 'open' an information row when a row is clicked on + * $('#example tbody tr').click( function () { + * if ( oTable.fnIsOpen(this) ) { + * oTable.fnClose( this ); + * } else { + * oTable.fnOpen( this, "Temporary row opened", "info_row" ); + * } + * } ); + * + * oTable = $('#example').dataTable(); + * } ); + */ + this.fnOpen = function( nTr, mHtml, sClass ) + { + return this.api( true ) + .row( nTr ) + .child( mHtml, sClass ) + .show() + .child()[0]; + }; + + + /** + * Change the pagination - provides the internal logic for pagination in a simple API + * function. With this function you can have a DataTables table go to the next, + * previous, first or last pages. + * @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last" + * or page number to jump to (integer), note that page 0 is the first page. + * @param {bool} [bRedraw=true] Redraw the table or not + * @dtopt API + * @deprecated Since v1.10 + * + * @example + * $(document).ready(function() { + * var oTable = $('#example').dataTable(); + * oTable.fnPageChange( 'next' ); + * } ); + */ + this.fnPageChange = function ( mAction, bRedraw ) + { + var api = this.api( true ).page( mAction ); + + if ( bRedraw === undefined || bRedraw ) { + api.draw(false); + } + }; + + + /** + * Show a particular column + * @param {int} iCol The column whose display should be changed + * @param {bool} bShow Show (true) or hide (false) the column + * @param {bool} [bRedraw=true] Redraw the table or not + * @dtopt API + * @deprecated Since v1.10 + * + * @example + * $(document).ready(function() { + * var oTable = $('#example').dataTable(); + * + * // Hide the second column after initialisation + * oTable.fnSetColumnVis( 1, false ); + * } ); + */ + this.fnSetColumnVis = function ( iCol, bShow, bRedraw ) + { + var api = this.api( true ).column( iCol ).visible( bShow ); + + if ( bRedraw === undefined || bRedraw ) { + api.columns.adjust().draw(); + } + }; + + + /** + * Get the settings for a particular table for external manipulation + * @returns {object} DataTables settings object. See + * {@link DataTable.models.oSettings} + * @dtopt API + * @deprecated Since v1.10 + * + * @example + * $(document).ready(function() { + * var oTable = $('#example').dataTable(); + * var oSettings = oTable.fnSettings(); + * + * // Show an example parameter from the settings + * alert( oSettings._iDisplayStart ); + * } ); + */ + this.fnSettings = function() + { + return _fnSettingsFromNode( this[_ext.iApiIndex] ); + }; + + + /** + * Sort the table by a particular column + * @param {int} iCol the data index to sort on. Note that this will not match the + * 'display index' if you have hidden data entries + * @dtopt API + * @deprecated Since v1.10 + * + * @example + * $(document).ready(function() { + * var oTable = $('#example').dataTable(); + * + * // Sort immediately with columns 0 and 1 + * oTable.fnSort( [ [0,'asc'], [1,'asc'] ] ); + * } ); + */ + this.fnSort = function( aaSort ) + { + this.api( true ).order( aaSort ).draw(); + }; + + + /** + * Attach a sort listener to an element for a given column + * @param {node} nNode the element to attach the sort listener to + * @param {int} iColumn the column that a click on this node will sort on + * @param {function} [fnCallback] callback function when sort is run + * @dtopt API + * @deprecated Since v1.10 + * + * @example + * $(document).ready(function() { + * var oTable = $('#example').dataTable(); + * + * // Sort on column 1, when 'sorter' is clicked on + * oTable.fnSortListener( document.getElementById('sorter'), 1 ); + * } ); + */ + this.fnSortListener = function( nNode, iColumn, fnCallback ) + { + this.api( true ).order.listener( nNode, iColumn, fnCallback ); + }; + + + /** + * Update a table cell or row - this method will accept either a single value to + * update the cell with, an array of values with one element for each column or + * an object in the same format as the original data source. The function is + * self-referencing in order to make the multi column updates easier. + * @param {object|array|string} mData Data to update the cell/row with + * @param {node|int} mRow TR element you want to update or the aoData index + * @param {int} [iColumn] The column to update, give as null or undefined to + * update a whole row. + * @param {bool} [bRedraw=true] Redraw the table or not + * @param {bool} [bAction=true] Perform pre-draw actions or not + * @returns {int} 0 on success, 1 on error + * @dtopt API + * @deprecated Since v1.10 + * + * @example + * $(document).ready(function() { + * var oTable = $('#example').dataTable(); + * oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell + * oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], $('tbody tr')[0] ); // Row + * } ); + */ + this.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction ) + { + var api = this.api( true ); + + if ( iColumn === undefined || iColumn === null ) { + api.row( mRow ).data( mData ); + } + else { + api.cell( mRow, iColumn ).data( mData ); + } + + if ( bAction === undefined || bAction ) { + api.columns.adjust(); + } + + if ( bRedraw === undefined || bRedraw ) { + api.draw(); + } + return 0; + }; + + + /** + * Provide a common method for plug-ins to check the version of DataTables being used, in order + * to ensure compatibility. + * @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the + * formats "X" and "X.Y" are also acceptable. + * @returns {boolean} true if this version of DataTables is greater or equal to the required + * version, or false if this version of DataTales is not suitable + * @method + * @dtopt API + * @deprecated Since v1.10 + * + * @example + * $(document).ready(function() { + * var oTable = $('#example').dataTable(); + * alert( oTable.fnVersionCheck( '1.9.0' ) ); + * } ); + */ + this.fnVersionCheck = _ext.fnVersionCheck; + + + var _that = this; + var emptyInit = options === undefined; + var len = this.length; + + if ( emptyInit ) { + options = {}; + } + + this.oApi = this.internal = _ext.internal; + + // Extend with old style plug-in API methods + for ( var fn in DataTable.ext.internal ) { + if ( fn ) { + this[fn] = _fnExternApiFunc(fn); + } + } + + this.each(function() { + // For each initialisation we want to give it a clean initialisation + // object that can be bashed around + var o = {}; + var oInit = len > 1 ? // optimisation for single table case + _fnExtend( o, options, true ) : + options; + + /*global oInit,_that,emptyInit*/ + var i=0, iLen, j, jLen, k, kLen; + var sId = this.getAttribute( 'id' ); + var bInitHandedOff = false; + var defaults = DataTable.defaults; + var $this = $(this); + + + /* Sanity check */ + if ( this.nodeName.toLowerCase() != 'table' ) + { + _fnLog( null, 0, 'Non-table node initialisation ('+this.nodeName+')', 2 ); + return; + } + + /* Backwards compatibility for the defaults */ + _fnCompatOpts( defaults ); + _fnCompatCols( defaults.column ); + + /* Convert the camel-case defaults to Hungarian */ + _fnCamelToHungarian( defaults, defaults, true ); + _fnCamelToHungarian( defaults.column, defaults.column, true ); + + /* Setting up the initialisation object */ + _fnCamelToHungarian( defaults, $.extend( oInit, $this.data() ) ); + + + + /* Check to see if we are re-initialising a table */ + var allSettings = DataTable.settings; + for ( i=0, iLen=allSettings.length ; i<iLen ; i++ ) + { + var s = allSettings[i]; + + /* Base check on table node */ + if ( s.nTable == this || s.nTHead.parentNode == this || (s.nTFoot && s.nTFoot.parentNode == this) ) + { + var bRetrieve = oInit.bRetrieve !== undefined ? oInit.bRetrieve : defaults.bRetrieve; + var bDestroy = oInit.bDestroy !== undefined ? oInit.bDestroy : defaults.bDestroy; + + if ( emptyInit || bRetrieve ) + { + return s.oInstance; + } + else if ( bDestroy ) + { + s.oInstance.fnDestroy(); + break; + } + else + { + _fnLog( s, 0, 'Cannot reinitialise DataTable', 3 ); + return; + } + } + + /* If the element we are initialising has the same ID as a table which was previously + * initialised, but the table nodes don't match (from before) then we destroy the old + * instance by simply deleting it. This is under the assumption that the table has been + * destroyed by other methods. Anyone using non-id selectors will need to do this manually + */ + if ( s.sTableId == this.id ) + { + allSettings.splice( i, 1 ); + break; + } + } + + /* Ensure the table has an ID - required for accessibility */ + if ( sId === null || sId === "" ) + { + sId = "DataTables_Table_"+(DataTable.ext._unique++); + this.id = sId; + } + + /* Create the settings object for this table and set some of the default parameters */ + var oSettings = $.extend( true, {}, DataTable.models.oSettings, { + "sDestroyWidth": $this[0].style.width, + "sInstance": sId, + "sTableId": sId + } ); + oSettings.nTable = this; + oSettings.oApi = _that.internal; + oSettings.oInit = oInit; + + allSettings.push( oSettings ); + + // Need to add the instance after the instance after the settings object has been added + // to the settings array, so we can self reference the table instance if more than one + oSettings.oInstance = (_that.length===1) ? _that : $this.dataTable(); + + // Backwards compatibility, before we apply all the defaults + _fnCompatOpts( oInit ); + + if ( oInit.oLanguage ) + { + _fnLanguageCompat( oInit.oLanguage ); + } + + // If the length menu is given, but the init display length is not, use the length menu + if ( oInit.aLengthMenu && ! oInit.iDisplayLength ) + { + oInit.iDisplayLength = $.isArray( oInit.aLengthMenu[0] ) ? + oInit.aLengthMenu[0][0] : oInit.aLengthMenu[0]; + } + + // Apply the defaults and init options to make a single init object will all + // options defined from defaults and instance options. + oInit = _fnExtend( $.extend( true, {}, defaults ), oInit ); + + + // Map the initialisation options onto the settings object + _fnMap( oSettings.oFeatures, oInit, [ + "bPaginate", + "bLengthChange", + "bFilter", + "bSort", + "bSortMulti", + "bInfo", + "bProcessing", + "bAutoWidth", + "bSortClasses", + "bServerSide", + "bDeferRender" + ] ); + _fnMap( oSettings, oInit, [ + "asStripeClasses", + "ajax", + "fnServerData", + "fnFormatNumber", + "sServerMethod", + "aaSorting", + "aaSortingFixed", + "aLengthMenu", + "sPaginationType", + "sAjaxSource", + "sAjaxDataProp", + "iStateDuration", + "sDom", + "bSortCellsTop", + "iTabIndex", + "fnStateLoadCallback", + "fnStateSaveCallback", + "renderer", + "searchDelay", + [ "iCookieDuration", "iStateDuration" ], // backwards compat + [ "oSearch", "oPreviousSearch" ], + [ "aoSearchCols", "aoPreSearchCols" ], + [ "iDisplayLength", "_iDisplayLength" ], + [ "bJQueryUI", "bJUI" ] + ] ); + _fnMap( oSettings.oScroll, oInit, [ + [ "sScrollX", "sX" ], + [ "sScrollXInner", "sXInner" ], + [ "sScrollY", "sY" ], + [ "bScrollCollapse", "bCollapse" ] + ] ); + _fnMap( oSettings.oLanguage, oInit, "fnInfoCallback" ); + + /* Callback functions which are array driven */ + _fnCallbackReg( oSettings, 'aoDrawCallback', oInit.fnDrawCallback, 'user' ); + _fnCallbackReg( oSettings, 'aoServerParams', oInit.fnServerParams, 'user' ); + _fnCallbackReg( oSettings, 'aoStateSaveParams', oInit.fnStateSaveParams, 'user' ); + _fnCallbackReg( oSettings, 'aoStateLoadParams', oInit.fnStateLoadParams, 'user' ); + _fnCallbackReg( oSettings, 'aoStateLoaded', oInit.fnStateLoaded, 'user' ); + _fnCallbackReg( oSettings, 'aoRowCallback', oInit.fnRowCallback, 'user' ); + _fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow, 'user' ); + _fnCallbackReg( oSettings, 'aoHeaderCallback', oInit.fnHeaderCallback, 'user' ); + _fnCallbackReg( oSettings, 'aoFooterCallback', oInit.fnFooterCallback, 'user' ); + _fnCallbackReg( oSettings, 'aoInitComplete', oInit.fnInitComplete, 'user' ); + _fnCallbackReg( oSettings, 'aoPreDrawCallback', oInit.fnPreDrawCallback, 'user' ); + + var oClasses = oSettings.oClasses; + + // @todo Remove in 1.11 + if ( oInit.bJQueryUI ) + { + /* Use the JUI classes object for display. You could clone the oStdClasses object if + * you want to have multiple tables with multiple independent classes + */ + $.extend( oClasses, DataTable.ext.oJUIClasses, oInit.oClasses ); + + if ( oInit.sDom === defaults.sDom && defaults.sDom === "lfrtip" ) + { + /* Set the DOM to use a layout suitable for jQuery UI's theming */ + oSettings.sDom = '<"H"lfr>t<"F"ip>'; + } + + if ( ! oSettings.renderer ) { + oSettings.renderer = 'jqueryui'; + } + else if ( $.isPlainObject( oSettings.renderer ) && ! oSettings.renderer.header ) { + oSettings.renderer.header = 'jqueryui'; + } + } + else + { + $.extend( oClasses, DataTable.ext.classes, oInit.oClasses ); + } + $this.addClass( oClasses.sTable ); + + /* Calculate the scroll bar width and cache it for use later on */ + if ( oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "" ) + { + oSettings.oScroll.iBarWidth = _fnScrollBarWidth(); + } + if ( oSettings.oScroll.sX === true ) { // Easy initialisation of x-scrolling + oSettings.oScroll.sX = '100%'; + } + + if ( oSettings.iInitDisplayStart === undefined ) + { + /* Display start point, taking into account the save saving */ + oSettings.iInitDisplayStart = oInit.iDisplayStart; + oSettings._iDisplayStart = oInit.iDisplayStart; + } + + if ( oInit.iDeferLoading !== null ) + { + oSettings.bDeferLoading = true; + var tmp = $.isArray( oInit.iDeferLoading ); + oSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading; + oSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading; + } + + /* Language definitions */ + var oLanguage = oSettings.oLanguage; + $.extend( true, oLanguage, oInit.oLanguage ); + + if ( oLanguage.sUrl !== "" ) + { + /* Get the language definitions from a file - because this Ajax call makes the language + * get async to the remainder of this function we use bInitHandedOff to indicate that + * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor + */ + $.ajax( { + dataType: 'json', + url: oLanguage.sUrl, + success: function ( json ) { + _fnLanguageCompat( json ); + _fnCamelToHungarian( defaults.oLanguage, json ); + $.extend( true, oLanguage, json ); + _fnInitialise( oSettings ); + }, + error: function () { + // Error occurred loading language file, continue on as best we can + _fnInitialise( oSettings ); + } + } ); + bInitHandedOff = true; + } + + /* + * Stripes + */ + if ( oInit.asStripeClasses === null ) + { + oSettings.asStripeClasses =[ + oClasses.sStripeOdd, + oClasses.sStripeEven + ]; + } + + /* Remove row stripe classes if they are already on the table row */ + var stripeClasses = oSettings.asStripeClasses; + var rowOne = $this.children('tbody').find('tr').eq(0); + if ( $.inArray( true, $.map( stripeClasses, function(el, i) { + return rowOne.hasClass(el); + } ) ) !== -1 ) { + $('tbody tr', this).removeClass( stripeClasses.join(' ') ); + oSettings.asDestroyStripes = stripeClasses.slice(); + } + + /* + * Columns + * See if we should load columns automatically or use defined ones + */ + var anThs = []; + var aoColumnsInit; + var nThead = this.getElementsByTagName('thead'); + if ( nThead.length !== 0 ) + { + _fnDetectHeader( oSettings.aoHeader, nThead[0] ); + anThs = _fnGetUniqueThs( oSettings ); + } + + /* If not given a column array, generate one with nulls */ + if ( oInit.aoColumns === null ) + { + aoColumnsInit = []; + for ( i=0, iLen=anThs.length ; i<iLen ; i++ ) + { + aoColumnsInit.push( null ); + } + } + else + { + aoColumnsInit = oInit.aoColumns; + } + + /* Add the columns */ + for ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ ) + { + _fnAddColumn( oSettings, anThs ? anThs[i] : null ); + } + + /* Apply the column definitions */ + _fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) { + _fnColumnOptions( oSettings, iCol, oDef ); + } ); + + /* HTML5 attribute detection - build an mData object automatically if the + * attributes are found + */ + if ( rowOne.length ) { + var a = function ( cell, name ) { + return cell.getAttribute( 'data-'+name ) !== null ? name : null; + }; + + $.each( _fnGetRowElements( oSettings, rowOne[0] ).cells, function (i, cell) { + var col = oSettings.aoColumns[i]; + + if ( col.mData === i ) { + var sort = a( cell, 'sort' ) || a( cell, 'order' ); + var filter = a( cell, 'filter' ) || a( cell, 'search' ); + + if ( sort !== null || filter !== null ) { + col.mData = { + _: i+'.display', + sort: sort !== null ? i+'.@data-'+sort : undefined, + type: sort !== null ? i+'.@data-'+sort : undefined, + filter: filter !== null ? i+'.@data-'+filter : undefined + }; + + _fnColumnOptions( oSettings, i ); + } + } + } ); + } + + var features = oSettings.oFeatures; + + /* Must be done after everything which can be overridden by the state saving! */ + if ( oInit.bStateSave ) + { + features.bStateSave = true; + _fnLoadState( oSettings, oInit ); + _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' ); + } + + + /* + * Sorting + * @todo For modularisation (1.11) this needs to do into a sort start up handler + */ + + // If aaSorting is not defined, then we use the first indicator in asSorting + // in case that has been altered, so the default sort reflects that option + if ( oInit.aaSorting === undefined ) + { + var sorting = oSettings.aaSorting; + for ( i=0, iLen=sorting.length ; i<iLen ; i++ ) + { + sorting[i][1] = oSettings.aoColumns[ i ].asSorting[0]; + } + } + + /* Do a first pass on the sorting classes (allows any size changes to be taken into + * account, and also will apply sorting disabled classes if disabled + */ + _fnSortingClasses( oSettings ); + + if ( features.bSort ) + { + _fnCallbackReg( oSettings, 'aoDrawCallback', function () { + if ( oSettings.bSorted ) { + var aSort = _fnSortFlatten( oSettings ); + var sortedColumns = {}; + + $.each( aSort, function (i, val) { + sortedColumns[ val.src ] = val.dir; + } ); + + _fnCallbackFire( oSettings, null, 'order', [oSettings, aSort, sortedColumns] ); + _fnSortAria( oSettings ); + } + } ); + } + + _fnCallbackReg( oSettings, 'aoDrawCallback', function () { + if ( oSettings.bSorted || _fnDataSource( oSettings ) === 'ssp' || features.bDeferRender ) { + _fnSortingClasses( oSettings ); + } + }, 'sc' ); + + + /* + * Final init + * Cache the header, body and footer as required, creating them if needed + */ + + /* Browser support detection */ + _fnBrowserDetect( oSettings ); + + // Work around for Webkit bug 83867 - store the caption-side before removing from doc + var captions = $this.children('caption').each( function () { + this._captionSide = $this.css('caption-side'); + } ); + + var thead = $this.children('thead'); + if ( thead.length === 0 ) + { + thead = $('<thead/>').appendTo(this); + } + oSettings.nTHead = thead[0]; + + var tbody = $this.children('tbody'); + if ( tbody.length === 0 ) + { + tbody = $('<tbody/>').appendTo(this); + } + oSettings.nTBody = tbody[0]; + + var tfoot = $this.children('tfoot'); + if ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") ) + { + // If we are a scrolling table, and no footer has been given, then we need to create + // a tfoot element for the caption element to be appended to + tfoot = $('<tfoot/>').appendTo(this); + } + + if ( tfoot.length === 0 || tfoot.children().length === 0 ) { + $this.addClass( oClasses.sNoFooter ); + } + else if ( tfoot.length > 0 ) { + oSettings.nTFoot = tfoot[0]; + _fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot ); + } + + /* Check if there is data passing into the constructor */ + if ( oInit.aaData ) + { + for ( i=0 ; i<oInit.aaData.length ; i++ ) + { + _fnAddData( oSettings, oInit.aaData[ i ] ); + } + } + else if ( oSettings.bDeferLoading || _fnDataSource( oSettings ) == 'dom' ) + { + /* Grab the data from the page - only do this when deferred loading or no Ajax + * source since there is no point in reading the DOM data if we are then going + * to replace it with Ajax data + */ + _fnAddTr( oSettings, $(oSettings.nTBody).children('tr') ); + } + + /* Copy the data index array */ + oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); + + /* Initialisation complete - table can be drawn */ + oSettings.bInitialised = true; + + /* Check if we need to initialise the table (it might not have been handed off to the + * language processor) + */ + if ( bInitHandedOff === false ) + { + _fnInitialise( oSettings ); + } + } ); + _that = null; + return this; + }; + + + + /** + * Computed structure of the DataTables API, defined by the options passed to + * `DataTable.Api.register()` when building the API. + * + * The structure is built in order to speed creation and extension of the Api + * objects since the extensions are effectively pre-parsed. + * + * The array is an array of objects with the following structure, where this + * base array represents the Api prototype base: + * + * [ + * { + * name: 'data' -- string - Property name + * val: function () {}, -- function - Api method (or undefined if just an object + * methodExt: [ ... ], -- array - Array of Api object definitions to extend the method result + * propExt: [ ... ] -- array - Array of Api object definitions to extend the property + * }, + * { + * name: 'row' + * val: {}, + * methodExt: [ ... ], + * propExt: [ + * { + * name: 'data' + * val: function () {}, + * methodExt: [ ... ], + * propExt: [ ... ] + * }, + * ... + * ] + * } + * ] + * + * @type {Array} + * @ignore + */ + var __apiStruct = []; + + + /** + * `Array.prototype` reference. + * + * @type object + * @ignore + */ + var __arrayProto = Array.prototype; + + + /** + * Abstraction for `context` parameter of the `Api` constructor to allow it to + * take several different forms for ease of use. + * + * Each of the input parameter types will be converted to a DataTables settings + * object where possible. + * + * @param {string|node|jQuery|object} mixed DataTable identifier. Can be one + * of: + * + * * `string` - jQuery selector. Any DataTables' matching the given selector + * with be found and used. + * * `node` - `TABLE` node which has already been formed into a DataTable. + * * `jQuery` - A jQuery object of `TABLE` nodes. + * * `object` - DataTables settings object + * * `DataTables.Api` - API instance + * @return {array|null} Matching DataTables settings objects. `null` or + * `undefined` is returned if no matching DataTable is found. + * @ignore + */ + var _toSettings = function ( mixed ) + { + var idx, jq; + var settings = DataTable.settings; + var tables = $.map( settings, function (el, i) { + return el.nTable; + } ); + + if ( ! mixed ) { + return []; + } + else if ( mixed.nTable && mixed.oApi ) { + // DataTables settings object + return [ mixed ]; + } + else if ( mixed.nodeName && mixed.nodeName.toLowerCase() === 'table' ) { + // Table node + idx = $.inArray( mixed, tables ); + return idx !== -1 ? [ settings[idx] ] : null; + } + else if ( mixed && typeof mixed.settings === 'function' ) { + return mixed.settings().toArray(); + } + else if ( typeof mixed === 'string' ) { + // jQuery selector + jq = $(mixed); + } + else if ( mixed instanceof $ ) { + // jQuery object (also DataTables instance) + jq = mixed; + } + + if ( jq ) { + return jq.map( function(i) { + idx = $.inArray( this, tables ); + return idx !== -1 ? settings[idx] : null; + } ).toArray(); + } + }; + + + /** + * DataTables API class - used to control and interface with one or more + * DataTables enhanced tables. + * + * The API class is heavily based on jQuery, presenting a chainable interface + * that you can use to interact with tables. Each instance of the API class has + * a "context" - i.e. the tables that it will operate on. This could be a single + * table, all tables on a page or a sub-set thereof. + * + * Additionally the API is designed to allow you to easily work with the data in + * the tables, retrieving and manipulating it as required. This is done by + * presenting the API class as an array like interface. The contents of the + * array depend upon the actions requested by each method (for example + * `rows().nodes()` will return an array of nodes, while `rows().data()` will + * return an array of objects or arrays depending upon your table's + * configuration). The API object has a number of array like methods (`push`, + * `pop`, `reverse` etc) as well as additional helper methods (`each`, `pluck`, + * `unique` etc) to assist your working with the data held in a table. + * + * Most methods (those which return an Api instance) are chainable, which means + * the return from a method call also has all of the methods available that the + * top level object had. For example, these two calls are equivalent: + * + * // Not chained + * api.row.add( {...} ); + * api.draw(); + * + * // Chained + * api.row.add( {...} ).draw(); + * + * @class DataTable.Api + * @param {array|object|string|jQuery} context DataTable identifier. This is + * used to define which DataTables enhanced tables this API will operate on. + * Can be one of: + * + * * `string` - jQuery selector. Any DataTables' matching the given selector + * with be found and used. + * * `node` - `TABLE` node which has already been formed into a DataTable. + * * `jQuery` - A jQuery object of `TABLE` nodes. + * * `object` - DataTables settings object + * @param {array} [data] Data to initialise the Api instance with. + * + * @example + * // Direct initialisation during DataTables construction + * var api = $('#example').DataTable(); + * + * @example + * // Initialisation using a DataTables jQuery object + * var api = $('#example').dataTable().api(); + * + * @example + * // Initialisation as a constructor + * var api = new $.fn.DataTable.Api( 'table.dataTable' ); + */ + _Api = function ( context, data ) + { + if ( ! (this instanceof _Api) ) { + return new _Api( context, data ); + } + + var settings = []; + var ctxSettings = function ( o ) { + var a = _toSettings( o ); + if ( a ) { + settings.push.apply( settings, a ); + } + }; + + if ( $.isArray( context ) ) { + for ( var i=0, ien=context.length ; i<ien ; i++ ) { + ctxSettings( context[i] ); + } + } + else { + ctxSettings( context ); + } + + // Remove duplicates + this.context = _unique( settings ); + + // Initial data + if ( data ) { + this.push.apply( this, data.toArray ? data.toArray() : data ); + } + + // selector + this.selector = { + rows: null, + cols: null, + opts: null + }; + + _Api.extend( this, this, __apiStruct ); + }; + + DataTable.Api = _Api; + + _Api.prototype = /** @lends DataTables.Api */{ + any: function () + { + return this.flatten().length !== 0; + }, + + + concat: __arrayProto.concat, + + + context: [], // array of table settings objects + + + each: function ( fn ) + { + for ( var i=0, ien=this.length ; i<ien; i++ ) { + fn.call( this, this[i], i, this ); + } + + return this; + }, + + + eq: function ( idx ) + { + var ctx = this.context; + + return ctx.length > idx ? + new _Api( ctx[idx], this[idx] ) : + null; + }, + + + filter: function ( fn ) + { + var a = []; + + if ( __arrayProto.filter ) { + a = __arrayProto.filter.call( this, fn, this ); + } + else { + // Compatibility for browsers without EMCA-252-5 (JS 1.6) + for ( var i=0, ien=this.length ; i<ien ; i++ ) { + if ( fn.call( this, this[i], i, this ) ) { + a.push( this[i] ); + } + } + } + + return new _Api( this.context, a ); + }, + + + flatten: function () + { + var a = []; + return new _Api( this.context, a.concat.apply( a, this.toArray() ) ); + }, + + + join: __arrayProto.join, + + + indexOf: __arrayProto.indexOf || function (obj, start) + { + for ( var i=(start || 0), ien=this.length ; i<ien ; i++ ) { + if ( this[i] === obj ) { + return i; + } + } + return -1; + }, + + iterator: function ( flatten, type, fn, alwaysNew ) { + var + a = [], ret, + i, ien, j, jen, + context = this.context, + rows, items, item, + selector = this.selector; + + // Argument shifting + if ( typeof flatten === 'string' ) { + alwaysNew = fn; + fn = type; + type = flatten; + flatten = false; + } + + for ( i=0, ien=context.length ; i<ien ; i++ ) { + var apiInst = new _Api( context[i] ); + + if ( type === 'table' ) { + ret = fn.call( apiInst, context[i], i ); + + if ( ret !== undefined ) { + a.push( ret ); + } + } + else if ( type === 'columns' || type === 'rows' ) { + // this has same length as context - one entry for each table + ret = fn.call( apiInst, context[i], this[i], i ); + + if ( ret !== undefined ) { + a.push( ret ); + } + } + else if ( type === 'column' || type === 'column-rows' || type === 'row' || type === 'cell' ) { + // columns and rows share the same structure. + // 'this' is an array of column indexes for each context + items = this[i]; + + if ( type === 'column-rows' ) { + rows = _selector_row_indexes( context[i], selector.opts ); + } + + for ( j=0, jen=items.length ; j<jen ; j++ ) { + item = items[j]; + + if ( type === 'cell' ) { + ret = fn.call( apiInst, context[i], item.row, item.column, i, j ); + } + else { + ret = fn.call( apiInst, context[i], item, i, j, rows ); + } + + if ( ret !== undefined ) { + a.push( ret ); + } + } + } + } + + if ( a.length || alwaysNew ) { + var api = new _Api( context, flatten ? a.concat.apply( [], a ) : a ); + var apiSelector = api.selector; + apiSelector.rows = selector.rows; + apiSelector.cols = selector.cols; + apiSelector.opts = selector.opts; + return api; + } + return this; + }, + + + lastIndexOf: __arrayProto.lastIndexOf || function (obj, start) + { + // Bit cheeky... + return this.indexOf.apply( this.toArray.reverse(), arguments ); + }, + + + length: 0, + + + map: function ( fn ) + { + var a = []; + + if ( __arrayProto.map ) { + a = __arrayProto.map.call( this, fn, this ); + } + else { + // Compatibility for browsers without EMCA-252-5 (JS 1.6) + for ( var i=0, ien=this.length ; i<ien ; i++ ) { + a.push( fn.call( this, this[i], i ) ); + } + } + + return new _Api( this.context, a ); + }, + + + pluck: function ( prop ) + { + return this.map( function ( el ) { + return el[ prop ]; + } ); + }, + + pop: __arrayProto.pop, + + + push: __arrayProto.push, + + + // Does not return an API instance + reduce: __arrayProto.reduce || function ( fn, init ) + { + return _fnReduce( this, fn, init, 0, this.length, 1 ); + }, + + + reduceRight: __arrayProto.reduceRight || function ( fn, init ) + { + return _fnReduce( this, fn, init, this.length-1, -1, -1 ); + }, + + + reverse: __arrayProto.reverse, + + + // Object with rows, columns and opts + selector: null, + + + shift: __arrayProto.shift, + + + sort: __arrayProto.sort, // ? name - order? + + + splice: __arrayProto.splice, + + + toArray: function () + { + return __arrayProto.slice.call( this ); + }, + + + to$: function () + { + return $( this ); + }, + + + toJQuery: function () + { + return $( this ); + }, + + + unique: function () + { + return new _Api( this.context, _unique(this) ); + }, + + + unshift: __arrayProto.unshift + }; + + + _Api.extend = function ( scope, obj, ext ) + { + // Only extend API instances and static properties of the API + if ( ! ext.length || ! obj || ( ! (obj instanceof _Api) && ! obj.__dt_wrapper ) ) { + return; + } + + var + i, ien, + j, jen, + struct, inner, + methodScoping = function ( scope, fn, struc ) { + return function () { + var ret = fn.apply( scope, arguments ); + + // Method extension + _Api.extend( ret, ret, struc.methodExt ); + return ret; + }; + }; + + for ( i=0, ien=ext.length ; i<ien ; i++ ) { + struct = ext[i]; + + // Value + obj[ struct.name ] = typeof struct.val === 'function' ? + methodScoping( scope, struct.val, struct ) : + $.isPlainObject( struct.val ) ? + {} : + struct.val; + + obj[ struct.name ].__dt_wrapper = true; + + // Property extension + _Api.extend( scope, obj[ struct.name ], struct.propExt ); + } + }; + + + // @todo - Is there need for an augment function? + // _Api.augment = function ( inst, name ) + // { + // // Find src object in the structure from the name + // var parts = name.split('.'); + + // _Api.extend( inst, obj ); + // }; + + + // [ + // { + // name: 'data' -- string - Property name + // val: function () {}, -- function - Api method (or undefined if just an object + // methodExt: [ ... ], -- array - Array of Api object definitions to extend the method result + // propExt: [ ... ] -- array - Array of Api object definitions to extend the property + // }, + // { + // name: 'row' + // val: {}, + // methodExt: [ ... ], + // propExt: [ + // { + // name: 'data' + // val: function () {}, + // methodExt: [ ... ], + // propExt: [ ... ] + // }, + // ... + // ] + // } + // ] + + _Api.register = _api_register = function ( name, val ) + { + if ( $.isArray( name ) ) { + for ( var j=0, jen=name.length ; j<jen ; j++ ) { + _Api.register( name[j], val ); + } + return; + } + + var + i, ien, + heir = name.split('.'), + struct = __apiStruct, + key, method; + + var find = function ( src, name ) { + for ( var i=0, ien=src.length ; i<ien ; i++ ) { + if ( src[i].name === name ) { + return src[i]; + } + } + return null; + }; + + for ( i=0, ien=heir.length ; i<ien ; i++ ) { + method = heir[i].indexOf('()') !== -1; + key = method ? + heir[i].replace('()', '') : + heir[i]; + + var src = find( struct, key ); + if ( ! src ) { + src = { + name: key, + val: {}, + methodExt: [], + propExt: [] + }; + struct.push( src ); + } + + if ( i === ien-1 ) { + src.val = val; + } + else { + struct = method ? + src.methodExt : + src.propExt; + } + } + }; + + + _Api.registerPlural = _api_registerPlural = function ( pluralName, singularName, val ) { + _Api.register( pluralName, val ); + + _Api.register( singularName, function () { + var ret = val.apply( this, arguments ); + + if ( ret === this ) { + // Returned item is the API instance that was passed in, return it + return this; + } + else if ( ret instanceof _Api ) { + // New API instance returned, want the value from the first item + // in the returned array for the singular result. + return ret.length ? + $.isArray( ret[0] ) ? + new _Api( ret.context, ret[0] ) : // Array results are 'enhanced' + ret[0] : + undefined; + } + + // Non-API return - just fire it back + return ret; + } ); + }; + + + /** + * Selector for HTML tables. Apply the given selector to the give array of + * DataTables settings objects. + * + * @param {string|integer} [selector] jQuery selector string or integer + * @param {array} Array of DataTables settings objects to be filtered + * @return {array} + * @ignore + */ + var __table_selector = function ( selector, a ) + { + // Integer is used to pick out a table by index + if ( typeof selector === 'number' ) { + return [ a[ selector ] ]; + } + + // Perform a jQuery selector on the table nodes + var nodes = $.map( a, function (el, i) { + return el.nTable; + } ); + + return $(nodes) + .filter( selector ) + .map( function (i) { + // Need to translate back from the table node to the settings + var idx = $.inArray( this, nodes ); + return a[ idx ]; + } ) + .toArray(); + }; + + + + /** + * Context selector for the API's context (i.e. the tables the API instance + * refers to. + * + * @name DataTable.Api#tables + * @param {string|integer} [selector] Selector to pick which tables the iterator + * should operate on. If not given, all tables in the current context are + * used. This can be given as a jQuery selector (for example `':gt(0)'`) to + * select multiple tables or as an integer to select a single table. + * @returns {DataTable.Api} Returns a new API instance if a selector is given. + */ + _api_register( 'tables()', function ( selector ) { + // A new instance is created if there was a selector specified + return selector ? + new _Api( __table_selector( selector, this.context ) ) : + this; + } ); + + + _api_register( 'table()', function ( selector ) { + var tables = this.tables( selector ); + var ctx = tables.context; + + // Truncate to the first matched table + return ctx.length ? + new _Api( ctx[0] ) : + tables; + } ); + + + _api_registerPlural( 'tables().nodes()', 'table().node()' , function () { + return this.iterator( 'table', function ( ctx ) { + return ctx.nTable; + }, 1 ); + } ); + + + _api_registerPlural( 'tables().body()', 'table().body()' , function () { + return this.iterator( 'table', function ( ctx ) { + return ctx.nTBody; + }, 1 ); + } ); + + + _api_registerPlural( 'tables().header()', 'table().header()' , function () { + return this.iterator( 'table', function ( ctx ) { + return ctx.nTHead; + }, 1 ); + } ); + + + _api_registerPlural( 'tables().footer()', 'table().footer()' , function () { + return this.iterator( 'table', function ( ctx ) { + return ctx.nTFoot; + }, 1 ); + } ); + + + _api_registerPlural( 'tables().containers()', 'table().container()' , function () { + return this.iterator( 'table', function ( ctx ) { + return ctx.nTableWrapper; + }, 1 ); + } ); + + + + /** + * Redraw the tables in the current context. + * + * @param {boolean} [reset=true] Reset (default) or hold the current paging + * position. A full re-sort and re-filter is performed when this method is + * called, which is why the pagination reset is the default action. + * @returns {DataTables.Api} this + */ + _api_register( 'draw()', function ( resetPaging ) { + return this.iterator( 'table', function ( settings ) { + _fnReDraw( settings, resetPaging===false ); + } ); + } ); + + + + /** + * Get the current page index. + * + * @return {integer} Current page index (zero based) + *//** + * Set the current page. + * + * Note that if you attempt to show a page which does not exist, DataTables will + * not throw an error, but rather reset the paging. + * + * @param {integer|string} action The paging action to take. This can be one of: + * * `integer` - The page index to jump to + * * `string` - An action to take: + * * `first` - Jump to first page. + * * `next` - Jump to the next page + * * `previous` - Jump to previous page + * * `last` - Jump to the last page. + * @returns {DataTables.Api} this + */ + _api_register( 'page()', function ( action ) { + if ( action === undefined ) { + return this.page.info().page; // not an expensive call + } + + // else, have an action to take on all tables + return this.iterator( 'table', function ( settings ) { + _fnPageChange( settings, action ); + } ); + } ); + + + /** + * Paging information for the first table in the current context. + * + * If you require paging information for another table, use the `table()` method + * with a suitable selector. + * + * @return {object} Object with the following properties set: + * * `page` - Current page index (zero based - i.e. the first page is `0`) + * * `pages` - Total number of pages + * * `start` - Display index for the first record shown on the current page + * * `end` - Display index for the last record shown on the current page + * * `length` - Display length (number of records). Note that generally `start + * + length = end`, but this is not always true, for example if there are + * only 2 records to show on the final page, with a length of 10. + * * `recordsTotal` - Full data set length + * * `recordsDisplay` - Data set length once the current filtering criterion + * are applied. + */ + _api_register( 'page.info()', function ( action ) { + if ( this.context.length === 0 ) { + return undefined; + } + + var + settings = this.context[0], + start = settings._iDisplayStart, + len = settings._iDisplayLength, + visRecords = settings.fnRecordsDisplay(), + all = len === -1; + + return { + "page": all ? 0 : Math.floor( start / len ), + "pages": all ? 1 : Math.ceil( visRecords / len ), + "start": start, + "end": settings.fnDisplayEnd(), + "length": len, + "recordsTotal": settings.fnRecordsTotal(), + "recordsDisplay": visRecords + }; + } ); + + + /** + * Get the current page length. + * + * @return {integer} Current page length. Note `-1` indicates that all records + * are to be shown. + *//** + * Set the current page length. + * + * @param {integer} Page length to set. Use `-1` to show all records. + * @returns {DataTables.Api} this + */ + _api_register( 'page.len()', function ( len ) { + // Note that we can't call this function 'length()' because `length` + // is a Javascript property of functions which defines how many arguments + // the function expects. + if ( len === undefined ) { + return this.context.length !== 0 ? + this.context[0]._iDisplayLength : + undefined; + } + + // else, set the page length + return this.iterator( 'table', function ( settings ) { + _fnLengthChange( settings, len ); + } ); + } ); + + + + var __reload = function ( settings, holdPosition, callback ) { + // Use the draw event to trigger a callback + if ( callback ) { + var api = new _Api( settings ); + + api.one( 'draw', function () { + callback( api.ajax.json() ); + } ); + } + + if ( _fnDataSource( settings ) == 'ssp' ) { + _fnReDraw( settings, holdPosition ); + } + else { + // Trigger xhr + _fnProcessingDisplay( settings, true ); + + _fnBuildAjax( settings, [], function( json ) { + _fnClearTable( settings ); + + var data = _fnAjaxDataSrc( settings, json ); + for ( var i=0, ien=data.length ; i<ien ; i++ ) { + _fnAddData( settings, data[i] ); + } + + _fnReDraw( settings, holdPosition ); + _fnProcessingDisplay( settings, false ); + } ); + } + }; + + + /** + * Get the JSON response from the last Ajax request that DataTables made to the + * server. Note that this returns the JSON from the first table in the current + * context. + * + * @return {object} JSON received from the server. + */ + _api_register( 'ajax.json()', function () { + var ctx = this.context; + + if ( ctx.length > 0 ) { + return ctx[0].json; + } + + // else return undefined; + } ); + + + /** + * Get the data submitted in the last Ajax request + */ + _api_register( 'ajax.params()', function () { + var ctx = this.context; + + if ( ctx.length > 0 ) { + return ctx[0].oAjaxData; + } + + // else return undefined; + } ); + + + /** + * Reload tables from the Ajax data source. Note that this function will + * automatically re-draw the table when the remote data has been loaded. + * + * @param {boolean} [reset=true] Reset (default) or hold the current paging + * position. A full re-sort and re-filter is performed when this method is + * called, which is why the pagination reset is the default action. + * @returns {DataTables.Api} this + */ + _api_register( 'ajax.reload()', function ( callback, resetPaging ) { + return this.iterator( 'table', function (settings) { + __reload( settings, resetPaging===false, callback ); + } ); + } ); + + + /** + * Get the current Ajax URL. Note that this returns the URL from the first + * table in the current context. + * + * @return {string} Current Ajax source URL + *//** + * Set the Ajax URL. Note that this will set the URL for all tables in the + * current context. + * + * @param {string} url URL to set. + * @returns {DataTables.Api} this + */ + _api_register( 'ajax.url()', function ( url ) { + var ctx = this.context; + + if ( url === undefined ) { + // get + if ( ctx.length === 0 ) { + return undefined; + } + ctx = ctx[0]; + + return ctx.ajax ? + $.isPlainObject( ctx.ajax ) ? + ctx.ajax.url : + ctx.ajax : + ctx.sAjaxSource; + } + + // set + return this.iterator( 'table', function ( settings ) { + if ( $.isPlainObject( settings.ajax ) ) { + settings.ajax.url = url; + } + else { + settings.ajax = url; + } + // No need to consider sAjaxSource here since DataTables gives priority + // to `ajax` over `sAjaxSource`. So setting `ajax` here, renders any + // value of `sAjaxSource` redundant. + } ); + } ); + + + /** + * Load data from the newly set Ajax URL. Note that this method is only + * available when `ajax.url()` is used to set a URL. Additionally, this method + * has the same effect as calling `ajax.reload()` but is provided for + * convenience when setting a new URL. Like `ajax.reload()` it will + * automatically redraw the table once the remote data has been loaded. + * + * @returns {DataTables.Api} this + */ + _api_register( 'ajax.url().load()', function ( callback, resetPaging ) { + // Same as a reload, but makes sense to present it for easy access after a + // url change + return this.iterator( 'table', function ( ctx ) { + __reload( ctx, resetPaging===false, callback ); + } ); + } ); + + + + + var _selector_run = function ( type, selector, selectFn, settings, opts ) + { + var + out = [], res, + a, i, ien, j, jen, + selectorType = typeof selector; + + // Can't just check for isArray here, as an API or jQuery instance might be + // given with their array like look + if ( ! selector || selectorType === 'string' || selectorType === 'function' || selector.length === undefined ) { + selector = [ selector ]; + } + + for ( i=0, ien=selector.length ; i<ien ; i++ ) { + a = selector[i] && selector[i].split ? + selector[i].split(',') : + [ selector[i] ]; + + for ( j=0, jen=a.length ; j<jen ; j++ ) { + res = selectFn( typeof a[j] === 'string' ? $.trim(a[j]) : a[j] ); + + if ( res && res.length ) { + out.push.apply( out, res ); + } + } + } + + // selector extensions + var ext = _ext.selector[ type ]; + if ( ext.length ) { + for ( i=0, ien=ext.length ; i<ien ; i++ ) { + out = ext[i]( settings, opts, out ); + } + } + + return out; + }; + + + var _selector_opts = function ( opts ) + { + if ( ! opts ) { + opts = {}; + } + + // Backwards compatibility for 1.9- which used the terminology filter rather + // than search + if ( opts.filter && opts.search === undefined ) { + opts.search = opts.filter; + } + + return $.extend( { + search: 'none', + order: 'current', + page: 'all' + }, opts ); + }; + + + var _selector_first = function ( inst ) + { + // Reduce the API instance to the first item found + for ( var i=0, ien=inst.length ; i<ien ; i++ ) { + if ( inst[i].length > 0 ) { + // Assign the first element to the first item in the instance + // and truncate the instance and context + inst[0] = inst[i]; + inst[0].length = 1; + inst.length = 1; + inst.context = [ inst.context[i] ]; + + return inst; + } + } + + // Not found - return an empty instance + inst.length = 0; + return inst; + }; + + + var _selector_row_indexes = function ( settings, opts ) + { + var + i, ien, tmp, a=[], + displayFiltered = settings.aiDisplay, + displayMaster = settings.aiDisplayMaster; + + var + search = opts.search, // none, applied, removed + order = opts.order, // applied, current, index (original - compatibility with 1.9) + page = opts.page; // all, current + + if ( _fnDataSource( settings ) == 'ssp' ) { + // In server-side processing mode, most options are irrelevant since + // rows not shown don't exist and the index order is the applied order + // Removed is a special case - for consistency just return an empty + // array + return search === 'removed' ? + [] : + _range( 0, displayMaster.length ); + } + else if ( page == 'current' ) { + // Current page implies that order=current and fitler=applied, since it is + // fairly senseless otherwise, regardless of what order and search actually + // are + for ( i=settings._iDisplayStart, ien=settings.fnDisplayEnd() ; i<ien ; i++ ) { + a.push( displayFiltered[i] ); + } + } + else if ( order == 'current' || order == 'applied' ) { + a = search == 'none' ? + displayMaster.slice() : // no search + search == 'applied' ? + displayFiltered.slice() : // applied search + $.map( displayMaster, function (el, i) { // removed search + return $.inArray( el, displayFiltered ) === -1 ? el : null; + } ); + } + else if ( order == 'index' || order == 'original' ) { + for ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) { + if ( search == 'none' ) { + a.push( i ); + } + else { // applied | removed + tmp = $.inArray( i, displayFiltered ); + + if ((tmp === -1 && search == 'removed') || + (tmp >= 0 && search == 'applied') ) + { + a.push( i ); + } + } + } + } + + return a; + }; + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Rows + * + * {} - no selector - use all available rows + * {integer} - row aoData index + * {node} - TR node + * {string} - jQuery selector to apply to the TR elements + * {array} - jQuery array of nodes, or simply an array of TR nodes + * + */ + + + var __row_selector = function ( settings, selector, opts ) + { + var run = function ( sel ) { + var selInt = _intVal( sel ); + var i, ien; + + // Short cut - selector is a number and no options provided (default is + // all records, so no need to check if the index is in there, since it + // must be - dev error if the index doesn't exist). + if ( selInt !== null && ! opts ) { + return [ selInt ]; + } + + var rows = _selector_row_indexes( settings, opts ); + + if ( selInt !== null && $.inArray( selInt, rows ) !== -1 ) { + // Selector - integer + return [ selInt ]; + } + else if ( ! sel ) { + // Selector - none + return rows; + } + + // Selector - function + if ( typeof sel === 'function' ) { + return $.map( rows, function (idx) { + var row = settings.aoData[ idx ]; + return sel( idx, row._aData, row.nTr ) ? idx : null; + } ); + } + + // Get nodes in the order from the `rows` array with null values removed + var nodes = _removeEmpty( + _pluck_order( settings.aoData, rows, 'nTr' ) + ); + + // Selector - node + if ( sel.nodeName ) { + if ( $.inArray( sel, nodes ) !== -1 ) { + return [ sel._DT_RowIndex ]; // sel is a TR node that is in the table + // and DataTables adds a prop for fast lookup + } + } + + // Selector - jQuery selector string, array of nodes or jQuery object/ + // As jQuery's .filter() allows jQuery objects to be passed in filter, + // it also allows arrays, so this will cope with all three options + return $(nodes) + .filter( sel ) + .map( function () { + return this._DT_RowIndex; + } ) + .toArray(); + }; + + return _selector_run( 'row', selector, run, settings, opts ); + }; + + + _api_register( 'rows()', function ( selector, opts ) { + // argument shifting + if ( selector === undefined ) { + selector = ''; + } + else if ( $.isPlainObject( selector ) ) { + opts = selector; + selector = ''; + } + + opts = _selector_opts( opts ); + + var inst = this.iterator( 'table', function ( settings ) { + return __row_selector( settings, selector, opts ); + }, 1 ); + + // Want argument shifting here and in __row_selector? + inst.selector.rows = selector; + inst.selector.opts = opts; + + return inst; + } ); + + _api_register( 'rows().nodes()', function () { + return this.iterator( 'row', function ( settings, row ) { + return settings.aoData[ row ].nTr || undefined; + }, 1 ); + } ); + + _api_register( 'rows().data()', function () { + return this.iterator( true, 'rows', function ( settings, rows ) { + return _pluck_order( settings.aoData, rows, '_aData' ); + }, 1 ); + } ); + + _api_registerPlural( 'rows().cache()', 'row().cache()', function ( type ) { + return this.iterator( 'row', function ( settings, row ) { + var r = settings.aoData[ row ]; + return type === 'search' ? r._aFilterData : r._aSortData; + }, 1 ); + } ); + + _api_registerPlural( 'rows().invalidate()', 'row().invalidate()', function ( src ) { + return this.iterator( 'row', function ( settings, row ) { + _fnInvalidate( settings, row, src ); + } ); + } ); + + _api_registerPlural( 'rows().indexes()', 'row().index()', function () { + return this.iterator( 'row', function ( settings, row ) { + return row; + }, 1 ); + } ); + + _api_registerPlural( 'rows().remove()', 'row().remove()', function () { + var that = this; + + return this.iterator( 'row', function ( settings, row, thatIdx ) { + var data = settings.aoData; + + data.splice( row, 1 ); + + // Update the _DT_RowIndex parameter on all rows in the table + for ( var i=0, ien=data.length ; i<ien ; i++ ) { + if ( data[i].nTr !== null ) { + data[i].nTr._DT_RowIndex = i; + } + } + + // Remove the target row from the search array + var displayIndex = $.inArray( row, settings.aiDisplay ); + + // Delete from the display arrays + _fnDeleteIndex( settings.aiDisplayMaster, row ); + _fnDeleteIndex( settings.aiDisplay, row ); + _fnDeleteIndex( that[ thatIdx ], row, false ); // maintain local indexes + + // Check for an 'overflow' they case for displaying the table + _fnLengthOverflow( settings ); + } ); + } ); + + + _api_register( 'rows.add()', function ( rows ) { + var newRows = this.iterator( 'table', function ( settings ) { + var row, i, ien; + var out = []; + + for ( i=0, ien=rows.length ; i<ien ; i++ ) { + row = rows[i]; + + if ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) { + out.push( _fnAddTr( settings, row )[0] ); + } + else { + out.push( _fnAddData( settings, row ) ); + } + } + + return out; + }, 1 ); + + // Return an Api.rows() extended instance, so rows().nodes() etc can be used + var modRows = this.rows( -1 ); + modRows.pop(); + modRows.push.apply( modRows, newRows.toArray() ); + + return modRows; + } ); + + + + + + /** + * + */ + _api_register( 'row()', function ( selector, opts ) { + return _selector_first( this.rows( selector, opts ) ); + } ); + + + _api_register( 'row().data()', function ( data ) { + var ctx = this.context; + + if ( data === undefined ) { + // Get + return ctx.length && this.length ? + ctx[0].aoData[ this[0] ]._aData : + undefined; + } + + // Set + ctx[0].aoData[ this[0] ]._aData = data; + + // Automatically invalidate + _fnInvalidate( ctx[0], this[0], 'data' ); + + return this; + } ); + + + _api_register( 'row().node()', function () { + var ctx = this.context; + + return ctx.length && this.length ? + ctx[0].aoData[ this[0] ].nTr || null : + null; + } ); + + + _api_register( 'row.add()', function ( row ) { + // Allow a jQuery object to be passed in - only a single row is added from + // it though - the first element in the set + if ( row instanceof $ && row.length ) { + row = row[0]; + } + + var rows = this.iterator( 'table', function ( settings ) { + if ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) { + return _fnAddTr( settings, row )[0]; + } + return _fnAddData( settings, row ); + } ); + + // Return an Api.rows() extended instance, with the newly added row selected + return this.row( rows[0] ); + } ); + + + + var __details_add = function ( ctx, row, data, klass ) + { + // Convert to array of TR elements + var rows = []; + var addRow = function ( r, k ) { + // Recursion to allow for arrays of jQuery objects + if ( $.isArray( r ) || r instanceof $ ) { + for ( var i=0, ien=r.length ; i<ien ; i++ ) { + addRow( r[i], k ); + } + return; + } + + // If we get a TR element, then just add it directly - up to the dev + // to add the correct number of columns etc + if ( r.nodeName && r.nodeName.toLowerCase() === 'tr' ) { + rows.push( r ); + } + else { + // Otherwise create a row with a wrapper + var created = $('<tr><td/></tr>').addClass( k ); + $('td', created) + .addClass( k ) + .html( r ) + [0].colSpan = _fnVisbleColumns( ctx ); + + rows.push( created[0] ); + } + }; + + addRow( data, klass ); + + if ( row._details ) { + row._details.remove(); + } + + row._details = $(rows); + + // If the children were already shown, that state should be retained + if ( row._detailsShow ) { + row._details.insertAfter( row.nTr ); + } + }; + + + var __details_remove = function ( api, idx ) + { + var ctx = api.context; + + if ( ctx.length ) { + var row = ctx[0].aoData[ idx !== undefined ? idx : api[0] ]; + + if ( row._details ) { + row._details.remove(); + + row._detailsShow = undefined; + row._details = undefined; + } + } + }; + + + var __details_display = function ( api, show ) { + var ctx = api.context; + + if ( ctx.length && api.length ) { + var row = ctx[0].aoData[ api[0] ]; + + if ( row._details ) { + row._detailsShow = show; + + if ( show ) { + row._details.insertAfter( row.nTr ); + } + else { + row._details.detach(); + } + + __details_events( ctx[0] ); + } + } + }; + + + var __details_events = function ( settings ) + { + var api = new _Api( settings ); + var namespace = '.dt.DT_details'; + var drawEvent = 'draw'+namespace; + var colvisEvent = 'column-visibility'+namespace; + var destroyEvent = 'destroy'+namespace; + var data = settings.aoData; + + api.off( drawEvent +' '+ colvisEvent +' '+ destroyEvent ); + + if ( _pluck( data, '_details' ).length > 0 ) { + // On each draw, insert the required elements into the document + api.on( drawEvent, function ( e, ctx ) { + if ( settings !== ctx ) { + return; + } + + api.rows( {page:'current'} ).eq(0).each( function (idx) { + // Internal data grab + var row = data[ idx ]; + + if ( row._detailsShow ) { + row._details.insertAfter( row.nTr ); + } + } ); + } ); + + // Column visibility change - update the colspan + api.on( colvisEvent, function ( e, ctx, idx, vis ) { + if ( settings !== ctx ) { + return; + } + + // Update the colspan for the details rows (note, only if it already has + // a colspan) + var row, visible = _fnVisbleColumns( ctx ); + + for ( var i=0, ien=data.length ; i<ien ; i++ ) { + row = data[i]; + + if ( row._details ) { + row._details.children('td[colspan]').attr('colspan', visible ); + } + } + } ); + + // Table destroyed - nuke any child rows + api.on( destroyEvent, function ( e, ctx ) { + if ( settings !== ctx ) { + return; + } + + for ( var i=0, ien=data.length ; i<ien ; i++ ) { + if ( data[i]._details ) { + __details_remove( api, i ); + } + } + } ); + } + }; + + // Strings for the method names to help minification + var _emp = ''; + var _child_obj = _emp+'row().child'; + var _child_mth = _child_obj+'()'; + + // data can be: + // tr + // string + // jQuery or array of any of the above + _api_register( _child_mth, function ( data, klass ) { + var ctx = this.context; + + if ( data === undefined ) { + // get + return ctx.length && this.length ? + ctx[0].aoData[ this[0] ]._details : + undefined; + } + else if ( data === true ) { + // show + this.child.show(); + } + else if ( data === false ) { + // remove + __details_remove( this ); + } + else if ( ctx.length && this.length ) { + // set + __details_add( ctx[0], ctx[0].aoData[ this[0] ], data, klass ); + } + + return this; + } ); + + + _api_register( [ + _child_obj+'.show()', + _child_mth+'.show()' // only when `child()` was called with parameters (without + ], function ( show ) { // it returns an object and this method is not executed) + __details_display( this, true ); + return this; + } ); + + + _api_register( [ + _child_obj+'.hide()', + _child_mth+'.hide()' // only when `child()` was called with parameters (without + ], function () { // it returns an object and this method is not executed) + __details_display( this, false ); + return this; + } ); + + + _api_register( [ + _child_obj+'.remove()', + _child_mth+'.remove()' // only when `child()` was called with parameters (without + ], function () { // it returns an object and this method is not executed) + __details_remove( this ); + return this; + } ); + + + _api_register( _child_obj+'.isShown()', function () { + var ctx = this.context; + + if ( ctx.length && this.length ) { + // _detailsShown as false or undefined will fall through to return false + return ctx[0].aoData[ this[0] ]._detailsShow || false; + } + return false; + } ); + + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Columns + * + * {integer} - column index (>=0 count from left, <0 count from right) + * "{integer}:visIdx" - visible column index (i.e. translate to column index) (>=0 count from left, <0 count from right) + * "{integer}:visible" - alias for {integer}:visIdx (>=0 count from left, <0 count from right) + * "{string}:name" - column name + * "{string}" - jQuery selector on column header nodes + * + */ + + // can be an array of these items, comma separated list, or an array of comma + // separated lists + + var __re_column_selector = /^(.+):(name|visIdx|visible)$/; + + + // r1 and r2 are redundant - but it means that the parameters match for the + // iterator callback in columns().data() + var __columnData = function ( settings, column, r1, r2, rows ) { + var a = []; + for ( var row=0, ien=rows.length ; row<ien ; row++ ) { + a.push( _fnGetCellData( settings, rows[row], column ) ); + } + return a; + }; + + + var __column_selector = function ( settings, selector, opts ) + { + var + columns = settings.aoColumns, + names = _pluck( columns, 'sName' ), + nodes = _pluck( columns, 'nTh' ); + + var run = function ( s ) { + var selInt = _intVal( s ); + + // Selector - all + if ( s === '' ) { + return _range( columns.length ); + } + + // Selector - index + if ( selInt !== null ) { + return [ selInt >= 0 ? + selInt : // Count from left + columns.length + selInt // Count from right (+ because its a negative value) + ]; + } + + // Selector = function + if ( typeof s === 'function' ) { + var rows = _selector_row_indexes( settings, opts ); + + return $.map( columns, function (col, idx) { + return s( + idx, + __columnData( settings, idx, 0, 0, rows ), + nodes[ idx ] + ) ? idx : null; + } ); + } + + // jQuery or string selector + var match = typeof s === 'string' ? + s.match( __re_column_selector ) : + ''; + + if ( match ) { + switch( match[2] ) { + case 'visIdx': + case 'visible': + var idx = parseInt( match[1], 10 ); + // Visible index given, convert to column index + if ( idx < 0 ) { + // Counting from the right + var visColumns = $.map( columns, function (col,i) { + return col.bVisible ? i : null; + } ); + return [ visColumns[ visColumns.length + idx ] ]; + } + // Counting from the left + return [ _fnVisibleToColumnIndex( settings, idx ) ]; + + case 'name': + // match by name. `names` is column index complete and in order + return $.map( names, function (name, i) { + return name === match[1] ? i : null; + } ); + } + } + else { + // jQuery selector on the TH elements for the columns + return $( nodes ) + .filter( s ) + .map( function () { + return $.inArray( this, nodes ); // `nodes` is column index complete and in order + } ) + .toArray(); + } + }; + + return _selector_run( 'column', selector, run, settings, opts ); + }; + + + var __setColumnVis = function ( settings, column, vis, recalc ) { + var + cols = settings.aoColumns, + col = cols[ column ], + data = settings.aoData, + row, cells, i, ien, tr; + + // Get + if ( vis === undefined ) { + return col.bVisible; + } + + // Set + // No change + if ( col.bVisible === vis ) { + return; + } + + if ( vis ) { + // Insert column + // Need to decide if we should use appendChild or insertBefore + var insertBefore = $.inArray( true, _pluck(cols, 'bVisible'), column+1 ); + + for ( i=0, ien=data.length ; i<ien ; i++ ) { + tr = data[i].nTr; + cells = data[i].anCells; + + if ( tr ) { + // insertBefore can act like appendChild if 2nd arg is null + tr.insertBefore( cells[ column ], cells[ insertBefore ] || null ); + } + } + } + else { + // Remove column + $( _pluck( settings.aoData, 'anCells', column ) ).detach(); + } + + // Common actions + col.bVisible = vis; + _fnDrawHead( settings, settings.aoHeader ); + _fnDrawHead( settings, settings.aoFooter ); + + if ( recalc === undefined || recalc ) { + // Automatically adjust column sizing + _fnAdjustColumnSizing( settings ); + + // Realign columns for scrolling + if ( settings.oScroll.sX || settings.oScroll.sY ) { + _fnScrollDraw( settings ); + } + } + + _fnCallbackFire( settings, null, 'column-visibility', [settings, column, vis] ); + + _fnSaveState( settings ); + }; + + + _api_register( 'columns()', function ( selector, opts ) { + // argument shifting + if ( selector === undefined ) { + selector = ''; + } + else if ( $.isPlainObject( selector ) ) { + opts = selector; + selector = ''; + } + + opts = _selector_opts( opts ); + + var inst = this.iterator( 'table', function ( settings ) { + return __column_selector( settings, selector, opts ); + }, 1 ); + + // Want argument shifting here and in _row_selector? + inst.selector.cols = selector; + inst.selector.opts = opts; + + return inst; + } ); + + _api_registerPlural( 'columns().header()', 'column().header()', function ( selector, opts ) { + return this.iterator( 'column', function ( settings, column ) { + return settings.aoColumns[column].nTh; + }, 1 ); + } ); + + _api_registerPlural( 'columns().footer()', 'column().footer()', function ( selector, opts ) { + return this.iterator( 'column', function ( settings, column ) { + return settings.aoColumns[column].nTf; + }, 1 ); + } ); + + _api_registerPlural( 'columns().data()', 'column().data()', function () { + return this.iterator( 'column-rows', __columnData, 1 ); + } ); + + _api_registerPlural( 'columns().dataSrc()', 'column().dataSrc()', function () { + return this.iterator( 'column', function ( settings, column ) { + return settings.aoColumns[column].mData; + }, 1 ); + } ); + + _api_registerPlural( 'columns().cache()', 'column().cache()', function ( type ) { + return this.iterator( 'column-rows', function ( settings, column, i, j, rows ) { + return _pluck_order( settings.aoData, rows, + type === 'search' ? '_aFilterData' : '_aSortData', column + ); + }, 1 ); + } ); + + _api_registerPlural( 'columns().nodes()', 'column().nodes()', function () { + return this.iterator( 'column-rows', function ( settings, column, i, j, rows ) { + return _pluck_order( settings.aoData, rows, 'anCells', column ) ; + }, 1 ); + } ); + + _api_registerPlural( 'columns().visible()', 'column().visible()', function ( vis, calc ) { + return this.iterator( 'column', function ( settings, column ) { + if ( vis === undefined ) { + return settings.aoColumns[ column ].bVisible; + } // else + __setColumnVis( settings, column, vis, calc ); + } ); + } ); + + _api_registerPlural( 'columns().indexes()', 'column().index()', function ( type ) { + return this.iterator( 'column', function ( settings, column ) { + return type === 'visible' ? + _fnColumnIndexToVisible( settings, column ) : + column; + }, 1 ); + } ); + + _api_register( 'columns.adjust()', function () { + return this.iterator( 'table', function ( settings ) { + _fnAdjustColumnSizing( settings ); + }, 1 ); + } ); + + _api_register( 'column.index()', function ( type, idx ) { + if ( this.context.length !== 0 ) { + var ctx = this.context[0]; + + if ( type === 'fromVisible' || type === 'toData' ) { + return _fnVisibleToColumnIndex( ctx, idx ); + } + else if ( type === 'fromData' || type === 'toVisible' ) { + return _fnColumnIndexToVisible( ctx, idx ); + } + } + } ); + + _api_register( 'column()', function ( selector, opts ) { + return _selector_first( this.columns( selector, opts ) ); + } ); + + + + + var __cell_selector = function ( settings, selector, opts ) + { + var data = settings.aoData; + var rows = _selector_row_indexes( settings, opts ); + var cells = _removeEmpty( _pluck_order( data, rows, 'anCells' ) ); + var allCells = $( [].concat.apply([], cells) ); + var row; + var columns = settings.aoColumns.length; + var a, i, ien, j, o, host; + + var run = function ( s ) { + var fnSelector = typeof s === 'function'; + + if ( s === null || s === undefined || fnSelector ) { + // All cells and function selectors + a = []; + + for ( i=0, ien=rows.length ; i<ien ; i++ ) { + row = rows[i]; + + for ( j=0 ; j<columns ; j++ ) { + o = { + row: row, + column: j + }; + + if ( fnSelector ) { + // Selector - function + host = settings.aoData[ row ]; + + if ( s( o, _fnGetCellData(settings, row, j), host.anCells ? host.anCells[j] : null ) ) { + a.push( o ); + } + } + else { + // Selector - all + a.push( o ); + } + } + } + + return a; + } + + // Selector - index + if ( $.isPlainObject( s ) ) { + return [s]; + } + + // Selector - jQuery filtered cells + return allCells + .filter( s ) + .map( function (i, el) { + row = el.parentNode._DT_RowIndex; + + return { + row: row, + column: $.inArray( el, data[ row ].anCells ) + }; + } ) + .toArray(); + }; + + return _selector_run( 'cell', selector, run, settings, opts ); + }; + + + + + _api_register( 'cells()', function ( rowSelector, columnSelector, opts ) { + // Argument shifting + if ( $.isPlainObject( rowSelector ) ) { + // Indexes + if ( rowSelector.row === undefined ) { + // Selector options in first parameter + opts = rowSelector; + rowSelector = null; + } + else { + // Cell index objects in first parameter + opts = columnSelector; + columnSelector = null; + } + } + if ( $.isPlainObject( columnSelector ) ) { + opts = columnSelector; + columnSelector = null; + } + + // Cell selector + if ( columnSelector === null || columnSelector === undefined ) { + return this.iterator( 'table', function ( settings ) { + return __cell_selector( settings, rowSelector, _selector_opts( opts ) ); + } ); + } + + // Row + column selector + var columns = this.columns( columnSelector, opts ); + var rows = this.rows( rowSelector, opts ); + var a, i, ien, j, jen; + + var cells = this.iterator( 'table', function ( settings, idx ) { + a = []; + + for ( i=0, ien=rows[idx].length ; i<ien ; i++ ) { + for ( j=0, jen=columns[idx].length ; j<jen ; j++ ) { + a.push( { + row: rows[idx][i], + column: columns[idx][j] + } ); + } + } + + return a; + }, 1 ); + + $.extend( cells.selector, { + cols: columnSelector, + rows: rowSelector, + opts: opts + } ); + + return cells; + } ); + + + _api_registerPlural( 'cells().nodes()', 'cell().node()', function () { + return this.iterator( 'cell', function ( settings, row, column ) { + var cells = settings.aoData[ row ].anCells; + return cells ? + cells[ column ] : + undefined; + }, 1 ); + } ); + + + _api_register( 'cells().data()', function () { + return this.iterator( 'cell', function ( settings, row, column ) { + return _fnGetCellData( settings, row, column ); + }, 1 ); + } ); + + + _api_registerPlural( 'cells().cache()', 'cell().cache()', function ( type ) { + type = type === 'search' ? '_aFilterData' : '_aSortData'; + + return this.iterator( 'cell', function ( settings, row, column ) { + return settings.aoData[ row ][ type ][ column ]; + }, 1 ); + } ); + + + _api_registerPlural( 'cells().render()', 'cell().render()', function ( type ) { + return this.iterator( 'cell', function ( settings, row, column ) { + return _fnGetCellData( settings, row, column, type ); + }, 1 ); + } ); + + + _api_registerPlural( 'cells().indexes()', 'cell().index()', function () { + return this.iterator( 'cell', function ( settings, row, column ) { + return { + row: row, + column: column, + columnVisible: _fnColumnIndexToVisible( settings, column ) + }; + }, 1 ); + } ); + + + _api_registerPlural( 'cells().invalidate()', 'cell().invalidate()', function ( src ) { + return this.iterator( 'cell', function ( settings, row, column ) { + _fnInvalidate( settings, row, src, column ); + } ); + } ); + + + + _api_register( 'cell()', function ( rowSelector, columnSelector, opts ) { + return _selector_first( this.cells( rowSelector, columnSelector, opts ) ); + } ); + + + _api_register( 'cell().data()', function ( data ) { + var ctx = this.context; + var cell = this[0]; + + if ( data === undefined ) { + // Get + return ctx.length && cell.length ? + _fnGetCellData( ctx[0], cell[0].row, cell[0].column ) : + undefined; + } + + // Set + _fnSetCellData( ctx[0], cell[0].row, cell[0].column, data ); + _fnInvalidate( ctx[0], cell[0].row, 'data', cell[0].column ); + + return this; + } ); + + + + /** + * Get current ordering (sorting) that has been applied to the table. + * + * @returns {array} 2D array containing the sorting information for the first + * table in the current context. Each element in the parent array represents + * a column being sorted upon (i.e. multi-sorting with two columns would have + * 2 inner arrays). The inner arrays may have 2 or 3 elements. The first is + * the column index that the sorting condition applies to, the second is the + * direction of the sort (`desc` or `asc`) and, optionally, the third is the + * index of the sorting order from the `column.sorting` initialisation array. + *//** + * Set the ordering for the table. + * + * @param {integer} order Column index to sort upon. + * @param {string} direction Direction of the sort to be applied (`asc` or `desc`) + * @returns {DataTables.Api} this + *//** + * Set the ordering for the table. + * + * @param {array} order 1D array of sorting information to be applied. + * @param {array} [...] Optional additional sorting conditions + * @returns {DataTables.Api} this + *//** + * Set the ordering for the table. + * + * @param {array} order 2D array of sorting information to be applied. + * @returns {DataTables.Api} this + */ + _api_register( 'order()', function ( order, dir ) { + var ctx = this.context; + + if ( order === undefined ) { + // get + return ctx.length !== 0 ? + ctx[0].aaSorting : + undefined; + } + + // set + if ( typeof order === 'number' ) { + // Simple column / direction passed in + order = [ [ order, dir ] ]; + } + else if ( ! $.isArray( order[0] ) ) { + // Arguments passed in (list of 1D arrays) + order = Array.prototype.slice.call( arguments ); + } + // otherwise a 2D array was passed in + + return this.iterator( 'table', function ( settings ) { + settings.aaSorting = order.slice(); + } ); + } ); + + + /** + * Attach a sort listener to an element for a given column + * + * @param {node|jQuery|string} node Identifier for the element(s) to attach the + * listener to. This can take the form of a single DOM node, a jQuery + * collection of nodes or a jQuery selector which will identify the node(s). + * @param {integer} column the column that a click on this node will sort on + * @param {function} [callback] callback function when sort is run + * @returns {DataTables.Api} this + */ + _api_register( 'order.listener()', function ( node, column, callback ) { + return this.iterator( 'table', function ( settings ) { + _fnSortAttachListener( settings, node, column, callback ); + } ); + } ); + + + // Order by the selected column(s) + _api_register( [ + 'columns().order()', + 'column().order()' + ], function ( dir ) { + var that = this; + + return this.iterator( 'table', function ( settings, i ) { + var sort = []; + + $.each( that[i], function (j, col) { + sort.push( [ col, dir ] ); + } ); + + settings.aaSorting = sort; + } ); + } ); + + + + _api_register( 'search()', function ( input, regex, smart, caseInsen ) { + var ctx = this.context; + + if ( input === undefined ) { + // get + return ctx.length !== 0 ? + ctx[0].oPreviousSearch.sSearch : + undefined; + } + + // set + return this.iterator( 'table', function ( settings ) { + if ( ! settings.oFeatures.bFilter ) { + return; + } + + _fnFilterComplete( settings, $.extend( {}, settings.oPreviousSearch, { + "sSearch": input+"", + "bRegex": regex === null ? false : regex, + "bSmart": smart === null ? true : smart, + "bCaseInsensitive": caseInsen === null ? true : caseInsen + } ), 1 ); + } ); + } ); + + + _api_registerPlural( + 'columns().search()', + 'column().search()', + function ( input, regex, smart, caseInsen ) { + return this.iterator( 'column', function ( settings, column ) { + var preSearch = settings.aoPreSearchCols; + + if ( input === undefined ) { + // get + return preSearch[ column ].sSearch; + } + + // set + if ( ! settings.oFeatures.bFilter ) { + return; + } + + $.extend( preSearch[ column ], { + "sSearch": input+"", + "bRegex": regex === null ? false : regex, + "bSmart": smart === null ? true : smart, + "bCaseInsensitive": caseInsen === null ? true : caseInsen + } ); + + _fnFilterComplete( settings, settings.oPreviousSearch, 1 ); + } ); + } + ); + + /* + * State API methods + */ + + _api_register( 'state()', function () { + return this.context.length ? + this.context[0].oSavedState : + null; + } ); + + + _api_register( 'state.clear()', function () { + return this.iterator( 'table', function ( settings ) { + // Save an empty object + settings.fnStateSaveCallback.call( settings.oInstance, settings, {} ); + } ); + } ); + + + _api_register( 'state.loaded()', function () { + return this.context.length ? + this.context[0].oLoadedState : + null; + } ); + + + _api_register( 'state.save()', function () { + return this.iterator( 'table', function ( settings ) { + _fnSaveState( settings ); + } ); + } ); + + + + /** + * Provide a common method for plug-ins to check the version of DataTables being + * used, in order to ensure compatibility. + * + * @param {string} version Version string to check for, in the format "X.Y.Z". + * Note that the formats "X" and "X.Y" are also acceptable. + * @returns {boolean} true if this version of DataTables is greater or equal to + * the required version, or false if this version of DataTales is not + * suitable + * @static + * @dtopt API-Static + * + * @example + * alert( $.fn.dataTable.versionCheck( '1.9.0' ) ); + */ + DataTable.versionCheck = DataTable.fnVersionCheck = function( version ) + { + var aThis = DataTable.version.split('.'); + var aThat = version.split('.'); + var iThis, iThat; + + for ( var i=0, iLen=aThat.length ; i<iLen ; i++ ) { + iThis = parseInt( aThis[i], 10 ) || 0; + iThat = parseInt( aThat[i], 10 ) || 0; + + // Parts are the same, keep comparing + if (iThis === iThat) { + continue; + } + + // Parts are different, return immediately + return iThis > iThat; + } + + return true; + }; + + + /** + * Check if a `<table>` node is a DataTable table already or not. + * + * @param {node|jquery|string} table Table node, jQuery object or jQuery + * selector for the table to test. Note that if more than more than one + * table is passed on, only the first will be checked + * @returns {boolean} true the table given is a DataTable, or false otherwise + * @static + * @dtopt API-Static + * + * @example + * if ( ! $.fn.DataTable.isDataTable( '#example' ) ) { + * $('#example').dataTable(); + * } + */ + DataTable.isDataTable = DataTable.fnIsDataTable = function ( table ) + { + var t = $(table).get(0); + var is = false; + + $.each( DataTable.settings, function (i, o) { + var head = o.nScrollHead ? $('table', o.nScrollHead)[0] : null; + var foot = o.nScrollFoot ? $('table', o.nScrollFoot)[0] : null; + + if ( o.nTable === t || head === t || foot === t ) { + is = true; + } + } ); + + return is; + }; + + + /** + * Get all DataTable tables that have been initialised - optionally you can + * select to get only currently visible tables. + * + * @param {boolean} [visible=false] Flag to indicate if you want all (default) + * or visible tables only. + * @returns {array} Array of `table` nodes (not DataTable instances) which are + * DataTables + * @static + * @dtopt API-Static + * + * @example + * $.each( $.fn.dataTable.tables(true), function () { + * $(table).DataTable().columns.adjust(); + * } ); + */ + DataTable.tables = DataTable.fnTables = function ( visible ) + { + return $.map( DataTable.settings, function (o) { + if ( !visible || (visible && $(o.nTable).is(':visible')) ) { + return o.nTable; + } + } ); + }; + + + /** + * DataTables utility methods + * + * This namespace provides helper methods that DataTables uses internally to + * create a DataTable, but which are not exclusively used only for DataTables. + * These methods can be used by extension authors to save the duplication of + * code. + * + * @namespace + */ + DataTable.util = { + /** + * Throttle the calls to a function. Arguments and context are maintained + * for the throttled function. + * + * @param {function} fn Function to be called + * @param {integer} freq Call frequency in mS + * @return {function} Wrapped function + */ + throttle: _fnThrottle, + + + /** + * Escape a string such that it can be used in a regular expression + * + * @param {string} sVal string to escape + * @returns {string} escaped string + */ + escapeRegex: _fnEscapeRegex + }; + + + /** + * Convert from camel case parameters to Hungarian notation. This is made public + * for the extensions to provide the same ability as DataTables core to accept + * either the 1.9 style Hungarian notation, or the 1.10+ style camelCase + * parameters. + * + * @param {object} src The model object which holds all parameters that can be + * mapped. + * @param {object} user The object to convert from camel case to Hungarian. + * @param {boolean} force When set to `true`, properties which already have a + * Hungarian value in the `user` object will be overwritten. Otherwise they + * won't be. + */ + DataTable.camelToHungarian = _fnCamelToHungarian; + + + + /** + * + */ + _api_register( '$()', function ( selector, opts ) { + var + rows = this.rows( opts ).nodes(), // Get all rows + jqRows = $(rows); + + return $( [].concat( + jqRows.filter( selector ).toArray(), + jqRows.find( selector ).toArray() + ) ); + } ); + + + // jQuery functions to operate on the tables + $.each( [ 'on', 'one', 'off' ], function (i, key) { + _api_register( key+'()', function ( /* event, handler */ ) { + var args = Array.prototype.slice.call(arguments); + + // Add the `dt` namespace automatically if it isn't already present + if ( ! args[0].match(/\.dt\b/) ) { + args[0] += '.dt'; + } + + var inst = $( this.tables().nodes() ); + inst[key].apply( inst, args ); + return this; + } ); + } ); + + + _api_register( 'clear()', function () { + return this.iterator( 'table', function ( settings ) { + _fnClearTable( settings ); + } ); + } ); + + + _api_register( 'settings()', function () { + return new _Api( this.context, this.context ); + } ); + + + _api_register( 'init()', function () { + var ctx = this.context; + return ctx.length ? ctx[0].oInit : null; + } ); + + + _api_register( 'data()', function () { + return this.iterator( 'table', function ( settings ) { + return _pluck( settings.aoData, '_aData' ); + } ).flatten(); + } ); + + + _api_register( 'destroy()', function ( remove ) { + remove = remove || false; + + return this.iterator( 'table', function ( settings ) { + var orig = settings.nTableWrapper.parentNode; + var classes = settings.oClasses; + var table = settings.nTable; + var tbody = settings.nTBody; + var thead = settings.nTHead; + var tfoot = settings.nTFoot; + var jqTable = $(table); + var jqTbody = $(tbody); + var jqWrapper = $(settings.nTableWrapper); + var rows = $.map( settings.aoData, function (r) { return r.nTr; } ); + var i, ien; + + // Flag to note that the table is currently being destroyed - no action + // should be taken + settings.bDestroying = true; + + // Fire off the destroy callbacks for plug-ins etc + _fnCallbackFire( settings, "aoDestroyCallback", "destroy", [settings] ); + + // If not being removed from the document, make all columns visible + if ( ! remove ) { + new _Api( settings ).columns().visible( true ); + } + + // Blitz all `DT` namespaced events (these are internal events, the + // lowercase, `dt` events are user subscribed and they are responsible + // for removing them + jqWrapper.unbind('.DT').find(':not(tbody *)').unbind('.DT'); + $(window).unbind('.DT-'+settings.sInstance); + + // When scrolling we had to break the table up - restore it + if ( table != thead.parentNode ) { + jqTable.children('thead').detach(); + jqTable.append( thead ); + } + + if ( tfoot && table != tfoot.parentNode ) { + jqTable.children('tfoot').detach(); + jqTable.append( tfoot ); + } + + // Remove the DataTables generated nodes, events and classes + jqTable.detach(); + jqWrapper.detach(); + + settings.aaSorting = []; + settings.aaSortingFixed = []; + _fnSortingClasses( settings ); + + $( rows ).removeClass( settings.asStripeClasses.join(' ') ); + + $('th, td', thead).removeClass( classes.sSortable+' '+ + classes.sSortableAsc+' '+classes.sSortableDesc+' '+classes.sSortableNone + ); + + if ( settings.bJUI ) { + $('th span.'+classes.sSortIcon+ ', td span.'+classes.sSortIcon, thead).detach(); + $('th, td', thead).each( function () { + var wrapper = $('div.'+classes.sSortJUIWrapper, this); + $(this).append( wrapper.contents() ); + wrapper.detach(); + } ); + } + + if ( ! remove && orig ) { + // insertBefore acts like appendChild if !arg[1] + orig.insertBefore( table, settings.nTableReinsertBefore ); + } + + // Add the TR elements back into the table in their original order + jqTbody.children().detach(); + jqTbody.append( rows ); + + // Restore the width of the original table - was read from the style property, + // so we can restore directly to that + jqTable + .css( 'width', settings.sDestroyWidth ) + .removeClass( classes.sTable ); + + // If the were originally stripe classes - then we add them back here. + // Note this is not fool proof (for example if not all rows had stripe + // classes - but it's a good effort without getting carried away + ien = settings.asDestroyStripes.length; + + if ( ien ) { + jqTbody.children().each( function (i) { + $(this).addClass( settings.asDestroyStripes[i % ien] ); + } ); + } + + /* Remove the settings object from the settings array */ + var idx = $.inArray( settings, DataTable.settings ); + if ( idx !== -1 ) { + DataTable.settings.splice( idx, 1 ); + } + } ); + } ); + + + // Add the `every()` method for rows, columns and cells in a compact form + $.each( [ 'column', 'row', 'cell' ], function ( i, type ) { + _api_register( type+'s().every()', function ( fn ) { + return this.iterator( type, function ( settings, idx, idx2 ) { + // idx2 is undefined for rows and columns. + fn.call( new _Api( settings )[ type ]( idx, idx2 ) ); + } ); + } ); + } ); + + + // i18n method for extensions to be able to use the language object from the + // DataTable + _api_register( 'i18n()', function ( token, def, plural ) { + var ctx = this.context[0]; + var resolved = _fnGetObjectDataFn( token )( ctx.oLanguage ); + + if ( resolved === undefined ) { + resolved = def; + } + + if ( plural !== undefined && $.isPlainObject( resolved ) ) { + resolved = resolved[ plural ] !== undefined ? + resolved[ plural ] : + resolved._; + } + + return resolved.replace( '%d', plural ); // nb: plural might be undefined, + } ); + + /** + * Version string for plug-ins to check compatibility. Allowed format is + * `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used + * only for non-release builds. See http://semver.org/ for more information. + * @member + * @type string + * @default Version number + */ + DataTable.version = "1.10.7"; + + /** + * Private data store, containing all of the settings objects that are + * created for the tables on a given page. + * + * Note that the `DataTable.settings` object is aliased to + * `jQuery.fn.dataTableExt` through which it may be accessed and + * manipulated, or `jQuery.fn.dataTable.settings`. + * @member + * @type array + * @default [] + * @private + */ + DataTable.settings = []; + + /** + * Object models container, for the various models that DataTables has + * available to it. These models define the objects that are used to hold + * the active state and configuration of the table. + * @namespace + */ + DataTable.models = {}; + + + + /** + * Template object for the way in which DataTables holds information about + * search information for the global filter and individual column filters. + * @namespace + */ + DataTable.models.oSearch = { + /** + * Flag to indicate if the filtering should be case insensitive or not + * @type boolean + * @default true + */ + "bCaseInsensitive": true, + + /** + * Applied search term + * @type string + * @default <i>Empty string</i> + */ + "sSearch": "", + + /** + * Flag to indicate if the search term should be interpreted as a + * regular expression (true) or not (false) and therefore and special + * regex characters escaped. + * @type boolean + * @default false + */ + "bRegex": false, + + /** + * Flag to indicate if DataTables is to use its smart filtering or not. + * @type boolean + * @default true + */ + "bSmart": true + }; + + + + + /** + * Template object for the way in which DataTables holds information about + * each individual row. This is the object format used for the settings + * aoData array. + * @namespace + */ + DataTable.models.oRow = { + /** + * TR element for the row + * @type node + * @default null + */ + "nTr": null, + + /** + * Array of TD elements for each row. This is null until the row has been + * created. + * @type array nodes + * @default [] + */ + "anCells": null, + + /** + * Data object from the original data source for the row. This is either + * an array if using the traditional form of DataTables, or an object if + * using mData options. The exact type will depend on the passed in + * data from the data source, or will be an array if using DOM a data + * source. + * @type array|object + * @default [] + */ + "_aData": [], + + /** + * Sorting data cache - this array is ostensibly the same length as the + * number of columns (although each index is generated only as it is + * needed), and holds the data that is used for sorting each column in the + * row. We do this cache generation at the start of the sort in order that + * the formatting of the sort data need be done only once for each cell + * per sort. This array should not be read from or written to by anything + * other than the master sorting methods. + * @type array + * @default null + * @private + */ + "_aSortData": null, + + /** + * Per cell filtering data cache. As per the sort data cache, used to + * increase the performance of the filtering in DataTables + * @type array + * @default null + * @private + */ + "_aFilterData": null, + + /** + * Filtering data cache. This is the same as the cell filtering cache, but + * in this case a string rather than an array. This is easily computed with + * a join on `_aFilterData`, but is provided as a cache so the join isn't + * needed on every search (memory traded for performance) + * @type array + * @default null + * @private + */ + "_sFilterRow": null, + + /** + * Cache of the class name that DataTables has applied to the row, so we + * can quickly look at this variable rather than needing to do a DOM check + * on className for the nTr property. + * @type string + * @default <i>Empty string</i> + * @private + */ + "_sRowStripe": "", + + /** + * Denote if the original data source was from the DOM, or the data source + * object. This is used for invalidating data, so DataTables can + * automatically read data from the original source, unless uninstructed + * otherwise. + * @type string + * @default null + * @private + */ + "src": null + }; + + + /** + * Template object for the column information object in DataTables. This object + * is held in the settings aoColumns array and contains all the information that + * DataTables needs about each individual column. + * + * Note that this object is related to {@link DataTable.defaults.column} + * but this one is the internal data store for DataTables's cache of columns. + * It should NOT be manipulated outside of DataTables. Any configuration should + * be done through the initialisation options. + * @namespace + */ + DataTable.models.oColumn = { + /** + * Column index. This could be worked out on-the-fly with $.inArray, but it + * is faster to just hold it as a variable + * @type integer + * @default null + */ + "idx": null, + + /** + * A list of the columns that sorting should occur on when this column + * is sorted. That this property is an array allows multi-column sorting + * to be defined for a column (for example first name / last name columns + * would benefit from this). The values are integers pointing to the + * columns to be sorted on (typically it will be a single integer pointing + * at itself, but that doesn't need to be the case). + * @type array + */ + "aDataSort": null, + + /** + * Define the sorting directions that are applied to the column, in sequence + * as the column is repeatedly sorted upon - i.e. the first value is used + * as the sorting direction when the column if first sorted (clicked on). + * Sort it again (click again) and it will move on to the next index. + * Repeat until loop. + * @type array + */ + "asSorting": null, + + /** + * Flag to indicate if the column is searchable, and thus should be included + * in the filtering or not. + * @type boolean + */ + "bSearchable": null, + + /** + * Flag to indicate if the column is sortable or not. + * @type boolean + */ + "bSortable": null, + + /** + * Flag to indicate if the column is currently visible in the table or not + * @type boolean + */ + "bVisible": null, + + /** + * Store for manual type assignment using the `column.type` option. This + * is held in store so we can manipulate the column's `sType` property. + * @type string + * @default null + * @private + */ + "_sManualType": null, + + /** + * Flag to indicate if HTML5 data attributes should be used as the data + * source for filtering or sorting. True is either are. + * @type boolean + * @default false + * @private + */ + "_bAttrSrc": false, + + /** + * Developer definable function that is called whenever a cell is created (Ajax source, + * etc) or processed for input (DOM source). This can be used as a compliment to mRender + * allowing you to modify the DOM element (add background colour for example) when the + * element is available. + * @type function + * @param {element} nTd The TD node that has been created + * @param {*} sData The Data for the cell + * @param {array|object} oData The data for the whole row + * @param {int} iRow The row index for the aoData data store + * @default null + */ + "fnCreatedCell": null, + + /** + * Function to get data from a cell in a column. You should <b>never</b> + * access data directly through _aData internally in DataTables - always use + * the method attached to this property. It allows mData to function as + * required. This function is automatically assigned by the column + * initialisation method + * @type function + * @param {array|object} oData The data array/object for the array + * (i.e. aoData[]._aData) + * @param {string} sSpecific The specific data type you want to get - + * 'display', 'type' 'filter' 'sort' + * @returns {*} The data for the cell from the given row's data + * @default null + */ + "fnGetData": null, + + /** + * Function to set data for a cell in the column. You should <b>never</b> + * set the data directly to _aData internally in DataTables - always use + * this method. It allows mData to function as required. This function + * is automatically assigned by the column initialisation method + * @type function + * @param {array|object} oData The data array/object for the array + * (i.e. aoData[]._aData) + * @param {*} sValue Value to set + * @default null + */ + "fnSetData": null, + + /** + * Property to read the value for the cells in the column from the data + * source array / object. If null, then the default content is used, if a + * function is given then the return from the function is used. + * @type function|int|string|null + * @default null + */ + "mData": null, + + /** + * Partner property to mData which is used (only when defined) to get + * the data - i.e. it is basically the same as mData, but without the + * 'set' option, and also the data fed to it is the result from mData. + * This is the rendering method to match the data method of mData. + * @type function|int|string|null + * @default null + */ + "mRender": null, + + /** + * Unique header TH/TD element for this column - this is what the sorting + * listener is attached to (if sorting is enabled.) + * @type node + * @default null + */ + "nTh": null, + + /** + * Unique footer TH/TD element for this column (if there is one). Not used + * in DataTables as such, but can be used for plug-ins to reference the + * footer for each column. + * @type node + * @default null + */ + "nTf": null, + + /** + * The class to apply to all TD elements in the table's TBODY for the column + * @type string + * @default null + */ + "sClass": null, + + /** + * When DataTables calculates the column widths to assign to each column, + * it finds the longest string in each column and then constructs a + * temporary table and reads the widths from that. The problem with this + * is that "mmm" is much wider then "iiii", but the latter is a longer + * string - thus the calculation can go wrong (doing it properly and putting + * it into an DOM object and measuring that is horribly(!) slow). Thus as + * a "work around" we provide this option. It will append its value to the + * text that is found to be the longest string for the column - i.e. padding. + * @type string + */ + "sContentPadding": null, + + /** + * Allows a default value to be given for a column's data, and will be used + * whenever a null data source is encountered (this can be because mData + * is set to null, or because the data source itself is null). + * @type string + * @default null + */ + "sDefaultContent": null, + + /** + * Name for the column, allowing reference to the column by name as well as + * by index (needs a lookup to work by name). + * @type string + */ + "sName": null, + + /** + * Custom sorting data type - defines which of the available plug-ins in + * afnSortData the custom sorting will use - if any is defined. + * @type string + * @default std + */ + "sSortDataType": 'std', + + /** + * Class to be applied to the header element when sorting on this column + * @type string + * @default null + */ + "sSortingClass": null, + + /** + * Class to be applied to the header element when sorting on this column - + * when jQuery UI theming is used. + * @type string + * @default null + */ + "sSortingClassJUI": null, + + /** + * Title of the column - what is seen in the TH element (nTh). + * @type string + */ + "sTitle": null, + + /** + * Column sorting and filtering type + * @type string + * @default null + */ + "sType": null, + + /** + * Width of the column + * @type string + * @default null + */ + "sWidth": null, + + /** + * Width of the column when it was first "encountered" + * @type string + * @default null + */ + "sWidthOrig": null + }; + + + /* + * Developer note: The properties of the object below are given in Hungarian + * notation, that was used as the interface for DataTables prior to v1.10, however + * from v1.10 onwards the primary interface is camel case. In order to avoid + * breaking backwards compatibility utterly with this change, the Hungarian + * version is still, internally the primary interface, but is is not documented + * - hence the @name tags in each doc comment. This allows a Javascript function + * to create a map from Hungarian notation to camel case (going the other direction + * would require each property to be listed, which would at around 3K to the size + * of DataTables, while this method is about a 0.5K hit. + * + * Ultimately this does pave the way for Hungarian notation to be dropped + * completely, but that is a massive amount of work and will break current + * installs (therefore is on-hold until v2). + */ + + /** + * Initialisation options that can be given to DataTables at initialisation + * time. + * @namespace + */ + DataTable.defaults = { + /** + * An array of data to use for the table, passed in at initialisation which + * will be used in preference to any data which is already in the DOM. This is + * particularly useful for constructing tables purely in Javascript, for + * example with a custom Ajax call. + * @type array + * @default null + * + * @dtopt Option + * @name DataTable.defaults.data + * + * @example + * // Using a 2D array data source + * $(document).ready( function () { + * $('#example').dataTable( { + * "data": [ + * ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'], + * ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'], + * ], + * "columns": [ + * { "title": "Engine" }, + * { "title": "Browser" }, + * { "title": "Platform" }, + * { "title": "Version" }, + * { "title": "Grade" } + * ] + * } ); + * } ); + * + * @example + * // Using an array of objects as a data source (`data`) + * $(document).ready( function () { + * $('#example').dataTable( { + * "data": [ + * { + * "engine": "Trident", + * "browser": "Internet Explorer 4.0", + * "platform": "Win 95+", + * "version": 4, + * "grade": "X" + * }, + * { + * "engine": "Trident", + * "browser": "Internet Explorer 5.0", + * "platform": "Win 95+", + * "version": 5, + * "grade": "C" + * } + * ], + * "columns": [ + * { "title": "Engine", "data": "engine" }, + * { "title": "Browser", "data": "browser" }, + * { "title": "Platform", "data": "platform" }, + * { "title": "Version", "data": "version" }, + * { "title": "Grade", "data": "grade" } + * ] + * } ); + * } ); + */ + "aaData": null, + + + /** + * If ordering is enabled, then DataTables will perform a first pass sort on + * initialisation. You can define which column(s) the sort is performed + * upon, and the sorting direction, with this variable. The `sorting` array + * should contain an array for each column to be sorted initially containing + * the column's index and a direction string ('asc' or 'desc'). + * @type array + * @default [[0,'asc']] + * + * @dtopt Option + * @name DataTable.defaults.order + * + * @example + * // Sort by 3rd column first, and then 4th column + * $(document).ready( function() { + * $('#example').dataTable( { + * "order": [[2,'asc'], [3,'desc']] + * } ); + * } ); + * + * // No initial sorting + * $(document).ready( function() { + * $('#example').dataTable( { + * "order": [] + * } ); + * } ); + */ + "aaSorting": [[0,'asc']], + + + /** + * This parameter is basically identical to the `sorting` parameter, but + * cannot be overridden by user interaction with the table. What this means + * is that you could have a column (visible or hidden) which the sorting + * will always be forced on first - any sorting after that (from the user) + * will then be performed as required. This can be useful for grouping rows + * together. + * @type array + * @default null + * + * @dtopt Option + * @name DataTable.defaults.orderFixed + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "orderFixed": [[0,'asc']] + * } ); + * } ) + */ + "aaSortingFixed": [], + + + /** + * DataTables can be instructed to load data to display in the table from a + * Ajax source. This option defines how that Ajax call is made and where to. + * + * The `ajax` property has three different modes of operation, depending on + * how it is defined. These are: + * + * * `string` - Set the URL from where the data should be loaded from. + * * `object` - Define properties for `jQuery.ajax`. + * * `function` - Custom data get function + * + * `string` + * -------- + * + * As a string, the `ajax` property simply defines the URL from which + * DataTables will load data. + * + * `object` + * -------- + * + * As an object, the parameters in the object are passed to + * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control + * of the Ajax request. DataTables has a number of default parameters which + * you can override using this option. Please refer to the jQuery + * documentation for a full description of the options available, although + * the following parameters provide additional options in DataTables or + * require special consideration: + * + * * `data` - As with jQuery, `data` can be provided as an object, but it + * can also be used as a function to manipulate the data DataTables sends + * to the server. The function takes a single parameter, an object of + * parameters with the values that DataTables has readied for sending. An + * object may be returned which will be merged into the DataTables + * defaults, or you can add the items to the object that was passed in and + * not return anything from the function. This supersedes `fnServerParams` + * from DataTables 1.9-. + * + * * `dataSrc` - By default DataTables will look for the property `data` (or + * `aaData` for compatibility with DataTables 1.9-) when obtaining data + * from an Ajax source or for server-side processing - this parameter + * allows that property to be changed. You can use Javascript dotted + * object notation to get a data source for multiple levels of nesting, or + * it my be used as a function. As a function it takes a single parameter, + * the JSON returned from the server, which can be manipulated as + * required, with the returned value being that used by DataTables as the + * data source for the table. This supersedes `sAjaxDataProp` from + * DataTables 1.9-. + * + * * `success` - Should not be overridden it is used internally in + * DataTables. To manipulate / transform the data returned by the server + * use `ajax.dataSrc`, or use `ajax` as a function (see below). + * + * `function` + * ---------- + * + * As a function, making the Ajax call is left up to yourself allowing + * complete control of the Ajax request. Indeed, if desired, a method other + * than Ajax could be used to obtain the required data, such as Web storage + * or an AIR database. + * + * The function is given four parameters and no return is required. The + * parameters are: + * + * 1. _object_ - Data to send to the server + * 2. _function_ - Callback function that must be executed when the required + * data has been obtained. That data should be passed into the callback + * as the only parameter + * 3. _object_ - DataTables settings object for the table + * + * Note that this supersedes `fnServerData` from DataTables 1.9-. + * + * @type string|object|function + * @default null + * + * @dtopt Option + * @name DataTable.defaults.ajax + * @since 1.10.0 + * + * @example + * // Get JSON data from a file via Ajax. + * // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default). + * $('#example').dataTable( { + * "ajax": "data.json" + * } ); + * + * @example + * // Get JSON data from a file via Ajax, using `dataSrc` to change + * // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`) + * $('#example').dataTable( { + * "ajax": { + * "url": "data.json", + * "dataSrc": "tableData" + * } + * } ); + * + * @example + * // Get JSON data from a file via Ajax, using `dataSrc` to read data + * // from a plain array rather than an array in an object + * $('#example').dataTable( { + * "ajax": { + * "url": "data.json", + * "dataSrc": "" + * } + * } ); + * + * @example + * // Manipulate the data returned from the server - add a link to data + * // (note this can, should, be done using `render` for the column - this + * // is just a simple example of how the data can be manipulated). + * $('#example').dataTable( { + * "ajax": { + * "url": "data.json", + * "dataSrc": function ( json ) { + * for ( var i=0, ien=json.length ; i<ien ; i++ ) { + * json[i][0] = '<a href="/message/'+json[i][0]+'>View message</a>'; + * } + * return json; + * } + * } + * } ); + * + * @example + * // Add data to the request + * $('#example').dataTable( { + * "ajax": { + * "url": "data.json", + * "data": function ( d ) { + * return { + * "extra_search": $('#extra').val() + * }; + * } + * } + * } ); + * + * @example + * // Send request as POST + * $('#example').dataTable( { + * "ajax": { + * "url": "data.json", + * "type": "POST" + * } + * } ); + * + * @example + * // Get the data from localStorage (could interface with a form for + * // adding, editing and removing rows). + * $('#example').dataTable( { + * "ajax": function (data, callback, settings) { + * callback( + * JSON.parse( localStorage.getItem('dataTablesData') ) + * ); + * } + * } ); + */ + "ajax": null, + + + /** + * This parameter allows you to readily specify the entries in the length drop + * down menu that DataTables shows when pagination is enabled. It can be + * either a 1D array of options which will be used for both the displayed + * option and the value, or a 2D array which will use the array in the first + * position as the value, and the array in the second position as the + * displayed options (useful for language strings such as 'All'). + * + * Note that the `pageLength` property will be automatically set to the + * first value given in this array, unless `pageLength` is also provided. + * @type array + * @default [ 10, 25, 50, 100 ] + * + * @dtopt Option + * @name DataTable.defaults.lengthMenu + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]] + * } ); + * } ); + */ + "aLengthMenu": [ 10, 25, 50, 100 ], + + + /** + * The `columns` option in the initialisation parameter allows you to define + * details about the way individual columns behave. For a full list of + * column options that can be set, please see + * {@link DataTable.defaults.column}. Note that if you use `columns` to + * define your columns, you must have an entry in the array for every single + * column that you have in your table (these can be null if you don't which + * to specify any options). + * @member + * + * @name DataTable.defaults.column + */ + "aoColumns": null, + + /** + * Very similar to `columns`, `columnDefs` allows you to target a specific + * column, multiple columns, or all columns, using the `targets` property of + * each object in the array. This allows great flexibility when creating + * tables, as the `columnDefs` arrays can be of any length, targeting the + * columns you specifically want. `columnDefs` may use any of the column + * options available: {@link DataTable.defaults.column}, but it _must_ + * have `targets` defined in each object in the array. Values in the `targets` + * array may be: + * <ul> + * <li>a string - class name will be matched on the TH for the column</li> + * <li>0 or a positive integer - column index counting from the left</li> + * <li>a negative integer - column index counting from the right</li> + * <li>the string "_all" - all columns (i.e. assign a default)</li> + * </ul> + * @member + * + * @name DataTable.defaults.columnDefs + */ + "aoColumnDefs": null, + + + /** + * Basically the same as `search`, this parameter defines the individual column + * filtering state at initialisation time. The array must be of the same size + * as the number of columns, and each element be an object with the parameters + * `search` and `escapeRegex` (the latter is optional). 'null' is also + * accepted and the default will be used. + * @type array + * @default [] + * + * @dtopt Option + * @name DataTable.defaults.searchCols + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "searchCols": [ + * null, + * { "search": "My filter" }, + * null, + * { "search": "^[0-9]", "escapeRegex": false } + * ] + * } ); + * } ) + */ + "aoSearchCols": [], + + + /** + * An array of CSS classes that should be applied to displayed rows. This + * array may be of any length, and DataTables will apply each class + * sequentially, looping when required. + * @type array + * @default null <i>Will take the values determined by the `oClasses.stripe*` + * options</i> + * + * @dtopt Option + * @name DataTable.defaults.stripeClasses + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "stripeClasses": [ 'strip1', 'strip2', 'strip3' ] + * } ); + * } ) + */ + "asStripeClasses": null, + + + /** + * Enable or disable automatic column width calculation. This can be disabled + * as an optimisation (it takes some time to calculate the widths) if the + * tables widths are passed in using `columns`. + * @type boolean + * @default true + * + * @dtopt Features + * @name DataTable.defaults.autoWidth + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "autoWidth": false + * } ); + * } ); + */ + "bAutoWidth": true, + + + /** + * Deferred rendering can provide DataTables with a huge speed boost when you + * are using an Ajax or JS data source for the table. This option, when set to + * true, will cause DataTables to defer the creation of the table elements for + * each row until they are needed for a draw - saving a significant amount of + * time. + * @type boolean + * @default false + * + * @dtopt Features + * @name DataTable.defaults.deferRender + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "ajax": "sources/arrays.txt", + * "deferRender": true + * } ); + * } ); + */ + "bDeferRender": false, + + + /** + * Replace a DataTable which matches the given selector and replace it with + * one which has the properties of the new initialisation object passed. If no + * table matches the selector, then the new DataTable will be constructed as + * per normal. + * @type boolean + * @default false + * + * @dtopt Options + * @name DataTable.defaults.destroy + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "srollY": "200px", + * "paginate": false + * } ); + * + * // Some time later.... + * $('#example').dataTable( { + * "filter": false, + * "destroy": true + * } ); + * } ); + */ + "bDestroy": false, + + + /** + * Enable or disable filtering of data. Filtering in DataTables is "smart" in + * that it allows the end user to input multiple words (space separated) and + * will match a row containing those words, even if not in the order that was + * specified (this allow matching across multiple columns). Note that if you + * wish to use filtering in DataTables this must remain 'true' - to remove the + * default filtering input box and retain filtering abilities, please use + * {@link DataTable.defaults.dom}. + * @type boolean + * @default true + * + * @dtopt Features + * @name DataTable.defaults.searching + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "searching": false + * } ); + * } ); + */ + "bFilter": true, + + + /** + * Enable or disable the table information display. This shows information + * about the data that is currently visible on the page, including information + * about filtered data if that action is being performed. + * @type boolean + * @default true + * + * @dtopt Features + * @name DataTable.defaults.info + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "info": false + * } ); + * } ); + */ + "bInfo": true, + + + /** + * Enable jQuery UI ThemeRoller support (required as ThemeRoller requires some + * slightly different and additional mark-up from what DataTables has + * traditionally used). + * @type boolean + * @default false + * + * @dtopt Features + * @name DataTable.defaults.jQueryUI + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "jQueryUI": true + * } ); + * } ); + */ + "bJQueryUI": false, + + + /** + * Allows the end user to select the size of a formatted page from a select + * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`). + * @type boolean + * @default true + * + * @dtopt Features + * @name DataTable.defaults.lengthChange + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "lengthChange": false + * } ); + * } ); + */ + "bLengthChange": true, + + + /** + * Enable or disable pagination. + * @type boolean + * @default true + * + * @dtopt Features + * @name DataTable.defaults.paging + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "paging": false + * } ); + * } ); + */ + "bPaginate": true, + + + /** + * Enable or disable the display of a 'processing' indicator when the table is + * being processed (e.g. a sort). This is particularly useful for tables with + * large amounts of data where it can take a noticeable amount of time to sort + * the entries. + * @type boolean + * @default false + * + * @dtopt Features + * @name DataTable.defaults.processing + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "processing": true + * } ); + * } ); + */ + "bProcessing": false, + + + /** + * Retrieve the DataTables object for the given selector. Note that if the + * table has already been initialised, this parameter will cause DataTables + * to simply return the object that has already been set up - it will not take + * account of any changes you might have made to the initialisation object + * passed to DataTables (setting this parameter to true is an acknowledgement + * that you understand this). `destroy` can be used to reinitialise a table if + * you need. + * @type boolean + * @default false + * + * @dtopt Options + * @name DataTable.defaults.retrieve + * + * @example + * $(document).ready( function() { + * initTable(); + * tableActions(); + * } ); + * + * function initTable () + * { + * return $('#example').dataTable( { + * "scrollY": "200px", + * "paginate": false, + * "retrieve": true + * } ); + * } + * + * function tableActions () + * { + * var table = initTable(); + * // perform API operations with oTable + * } + */ + "bRetrieve": false, + + + /** + * When vertical (y) scrolling is enabled, DataTables will force the height of + * the table's viewport to the given height at all times (useful for layout). + * However, this can look odd when filtering data down to a small data set, + * and the footer is left "floating" further down. This parameter (when + * enabled) will cause DataTables to collapse the table's viewport down when + * the result set will fit within the given Y height. + * @type boolean + * @default false + * + * @dtopt Options + * @name DataTable.defaults.scrollCollapse + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "scrollY": "200", + * "scrollCollapse": true + * } ); + * } ); + */ + "bScrollCollapse": false, + + + /** + * Configure DataTables to use server-side processing. Note that the + * `ajax` parameter must also be given in order to give DataTables a + * source to obtain the required data for each draw. + * @type boolean + * @default false + * + * @dtopt Features + * @dtopt Server-side + * @name DataTable.defaults.serverSide + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "serverSide": true, + * "ajax": "xhr.php" + * } ); + * } ); + */ + "bServerSide": false, + + + /** + * Enable or disable sorting of columns. Sorting of individual columns can be + * disabled by the `sortable` option for each column. + * @type boolean + * @default true + * + * @dtopt Features + * @name DataTable.defaults.ordering + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "ordering": false + * } ); + * } ); + */ + "bSort": true, + + + /** + * Enable or display DataTables' ability to sort multiple columns at the + * same time (activated by shift-click by the user). + * @type boolean + * @default true + * + * @dtopt Options + * @name DataTable.defaults.orderMulti + * + * @example + * // Disable multiple column sorting ability + * $(document).ready( function () { + * $('#example').dataTable( { + * "orderMulti": false + * } ); + * } ); + */ + "bSortMulti": true, + + + /** + * Allows control over whether DataTables should use the top (true) unique + * cell that is found for a single column, or the bottom (false - default). + * This is useful when using complex headers. + * @type boolean + * @default false + * + * @dtopt Options + * @name DataTable.defaults.orderCellsTop + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "orderCellsTop": true + * } ); + * } ); + */ + "bSortCellsTop": false, + + + /** + * Enable or disable the addition of the classes `sorting\_1`, `sorting\_2` and + * `sorting\_3` to the columns which are currently being sorted on. This is + * presented as a feature switch as it can increase processing time (while + * classes are removed and added) so for large data sets you might want to + * turn this off. + * @type boolean + * @default true + * + * @dtopt Features + * @name DataTable.defaults.orderClasses + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "orderClasses": false + * } ); + * } ); + */ + "bSortClasses": true, + + + /** + * Enable or disable state saving. When enabled HTML5 `localStorage` will be + * used to save table display information such as pagination information, + * display length, filtering and sorting. As such when the end user reloads + * the page the display display will match what thy had previously set up. + * + * Due to the use of `localStorage` the default state saving is not supported + * in IE6 or 7. If state saving is required in those browsers, use + * `stateSaveCallback` to provide a storage solution such as cookies. + * @type boolean + * @default false + * + * @dtopt Features + * @name DataTable.defaults.stateSave + * + * @example + * $(document).ready( function () { + * $('#example').dataTable( { + * "stateSave": true + * } ); + * } ); + */ + "bStateSave": false, + + + /** + * This function is called when a TR element is created (and all TD child + * elements have been inserted), or registered if using a DOM source, allowing + * manipulation of the TR element (adding classes etc). + * @type function + * @param {node} row "TR" element for the current row + * @param {array} data Raw data array for this row + * @param {int} dataIndex The index of this row in the internal aoData array + * + * @dtopt Callbacks + * @name DataTable.defaults.createdRow + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "createdRow": function( row, data, dataIndex ) { + * // Bold the grade for all 'A' grade browsers + * if ( data[4] == "A" ) + * { + * $('td:eq(4)', row).html( '<b>A</b>' ); + * } + * } + * } ); + * } ); + */ + "fnCreatedRow": null, + + + /** + * This function is called on every 'draw' event, and allows you to + * dynamically modify any aspect you want about the created DOM. + * @type function + * @param {object} settings DataTables settings object + * + * @dtopt Callbacks + * @name DataTable.defaults.drawCallback + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "drawCallback": function( settings ) { + * alert( 'DataTables has redrawn the table' ); + * } + * } ); + * } ); + */ + "fnDrawCallback": null, + + + /** + * Identical to fnHeaderCallback() but for the table footer this function + * allows you to modify the table footer on every 'draw' event. + * @type function + * @param {node} foot "TR" element for the footer + * @param {array} data Full table data (as derived from the original HTML) + * @param {int} start Index for the current display starting point in the + * display array + * @param {int} end Index for the current display ending point in the + * display array + * @param {array int} display Index array to translate the visual position + * to the full data array + * + * @dtopt Callbacks + * @name DataTable.defaults.footerCallback + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "footerCallback": function( tfoot, data, start, end, display ) { + * tfoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+start; + * } + * } ); + * } ) + */ + "fnFooterCallback": null, + + + /** + * When rendering large numbers in the information element for the table + * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers + * to have a comma separator for the 'thousands' units (e.g. 1 million is + * rendered as "1,000,000") to help readability for the end user. This + * function will override the default method DataTables uses. + * @type function + * @member + * @param {int} toFormat number to be formatted + * @returns {string} formatted string for DataTables to show the number + * + * @dtopt Callbacks + * @name DataTable.defaults.formatNumber + * + * @example + * // Format a number using a single quote for the separator (note that + * // this can also be done with the language.thousands option) + * $(document).ready( function() { + * $('#example').dataTable( { + * "formatNumber": function ( toFormat ) { + * return toFormat.toString().replace( + * /\B(?=(\d{3})+(?!\d))/g, "'" + * ); + * }; + * } ); + * } ); + */ + "fnFormatNumber": function ( toFormat ) { + return toFormat.toString().replace( + /\B(?=(\d{3})+(?!\d))/g, + this.oLanguage.sThousands + ); + }, + + + /** + * This function is called on every 'draw' event, and allows you to + * dynamically modify the header row. This can be used to calculate and + * display useful information about the table. + * @type function + * @param {node} head "TR" element for the header + * @param {array} data Full table data (as derived from the original HTML) + * @param {int} start Index for the current display starting point in the + * display array + * @param {int} end Index for the current display ending point in the + * display array + * @param {array int} display Index array to translate the visual position + * to the full data array + * + * @dtopt Callbacks + * @name DataTable.defaults.headerCallback + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "fheaderCallback": function( head, data, start, end, display ) { + * head.getElementsByTagName('th')[0].innerHTML = "Displaying "+(end-start)+" records"; + * } + * } ); + * } ) + */ + "fnHeaderCallback": null, + + + /** + * The information element can be used to convey information about the current + * state of the table. Although the internationalisation options presented by + * DataTables are quite capable of dealing with most customisations, there may + * be times where you wish to customise the string further. This callback + * allows you to do exactly that. + * @type function + * @param {object} oSettings DataTables settings object + * @param {int} start Starting position in data for the draw + * @param {int} end End position in data for the draw + * @param {int} max Total number of rows in the table (regardless of + * filtering) + * @param {int} total Total number of rows in the data set, after filtering + * @param {string} pre The string that DataTables has formatted using it's + * own rules + * @returns {string} The string to be displayed in the information element. + * + * @dtopt Callbacks + * @name DataTable.defaults.infoCallback + * + * @example + * $('#example').dataTable( { + * "infoCallback": function( settings, start, end, max, total, pre ) { + * return start +" to "+ end; + * } + * } ); + */ + "fnInfoCallback": null, + + + /** + * Called when the table has been initialised. Normally DataTables will + * initialise sequentially and there will be no need for this function, + * however, this does not hold true when using external language information + * since that is obtained using an async XHR call. + * @type function + * @param {object} settings DataTables settings object + * @param {object} json The JSON object request from the server - only + * present if client-side Ajax sourced data is used + * + * @dtopt Callbacks + * @name DataTable.defaults.initComplete + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "initComplete": function(settings, json) { + * alert( 'DataTables has finished its initialisation.' ); + * } + * } ); + * } ) + */ + "fnInitComplete": null, + + + /** + * Called at the very start of each table draw and can be used to cancel the + * draw by returning false, any other return (including undefined) results in + * the full draw occurring). + * @type function + * @param {object} settings DataTables settings object + * @returns {boolean} False will cancel the draw, anything else (including no + * return) will allow it to complete. + * + * @dtopt Callbacks + * @name DataTable.defaults.preDrawCallback + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "preDrawCallback": function( settings ) { + * if ( $('#test').val() == 1 ) { + * return false; + * } + * } + * } ); + * } ); + */ + "fnPreDrawCallback": null, + + + /** + * This function allows you to 'post process' each row after it have been + * generated for each table draw, but before it is rendered on screen. This + * function might be used for setting the row class name etc. + * @type function + * @param {node} row "TR" element for the current row + * @param {array} data Raw data array for this row + * @param {int} displayIndex The display index for the current table draw + * @param {int} displayIndexFull The index of the data in the full list of + * rows (after filtering) + * + * @dtopt Callbacks + * @name DataTable.defaults.rowCallback + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "rowCallback": function( row, data, displayIndex, displayIndexFull ) { + * // Bold the grade for all 'A' grade browsers + * if ( data[4] == "A" ) { + * $('td:eq(4)', row).html( '<b>A</b>' ); + * } + * } + * } ); + * } ); + */ + "fnRowCallback": null, + + + /** + * __Deprecated__ The functionality provided by this parameter has now been + * superseded by that provided through `ajax`, which should be used instead. + * + * This parameter allows you to override the default function which obtains + * the data from the server so something more suitable for your application. + * For example you could use POST data, or pull information from a Gears or + * AIR database. + * @type function + * @member + * @param {string} source HTTP source to obtain the data from (`ajax`) + * @param {array} data A key/value pair object containing the data to send + * to the server + * @param {function} callback to be called on completion of the data get + * process that will draw the data on the page. + * @param {object} settings DataTables settings object + * + * @dtopt Callbacks + * @dtopt Server-side + * @name DataTable.defaults.serverData + * + * @deprecated 1.10. Please use `ajax` for this functionality now. + */ + "fnServerData": null, + + + /** + * __Deprecated__ The functionality provided by this parameter has now been + * superseded by that provided through `ajax`, which should be used instead. + * + * It is often useful to send extra data to the server when making an Ajax + * request - for example custom filtering information, and this callback + * function makes it trivial to send extra information to the server. The + * passed in parameter is the data set that has been constructed by + * DataTables, and you can add to this or modify it as you require. + * @type function + * @param {array} data Data array (array of objects which are name/value + * pairs) that has been constructed by DataTables and will be sent to the + * server. In the case of Ajax sourced data with server-side processing + * this will be an empty array, for server-side processing there will be a + * significant number of parameters! + * @returns {undefined} Ensure that you modify the data array passed in, + * as this is passed by reference. + * + * @dtopt Callbacks + * @dtopt Server-side + * @name DataTable.defaults.serverParams + * + * @deprecated 1.10. Please use `ajax` for this functionality now. + */ + "fnServerParams": null, + + + /** + * Load the table state. With this function you can define from where, and how, the + * state of a table is loaded. By default DataTables will load from `localStorage` + * but you might wish to use a server-side database or cookies. + * @type function + * @member + * @param {object} settings DataTables settings object + * @return {object} The DataTables state object to be loaded + * + * @dtopt Callbacks + * @name DataTable.defaults.stateLoadCallback + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "stateSave": true, + * "stateLoadCallback": function (settings) { + * var o; + * + * // Send an Ajax request to the server to get the data. Note that + * // this is a synchronous request. + * $.ajax( { + * "url": "/state_load", + * "async": false, + * "dataType": "json", + * "success": function (json) { + * o = json; + * } + * } ); + * + * return o; + * } + * } ); + * } ); + */ + "fnStateLoadCallback": function ( settings ) { + try { + return JSON.parse( + (settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem( + 'DataTables_'+settings.sInstance+'_'+location.pathname + ) + ); + } catch (e) {} + }, + + + /** + * Callback which allows modification of the saved state prior to loading that state. + * This callback is called when the table is loading state from the stored data, but + * prior to the settings object being modified by the saved state. Note that for + * plug-in authors, you should use the `stateLoadParams` event to load parameters for + * a plug-in. + * @type function + * @param {object} settings DataTables settings object + * @param {object} data The state object that is to be loaded + * + * @dtopt Callbacks + * @name DataTable.defaults.stateLoadParams + * + * @example + * // Remove a saved filter, so filtering is never loaded + * $(document).ready( function() { + * $('#example').dataTable( { + * "stateSave": true, + * "stateLoadParams": function (settings, data) { + * data.oSearch.sSearch = ""; + * } + * } ); + * } ); + * + * @example + * // Disallow state loading by returning false + * $(document).ready( function() { + * $('#example').dataTable( { + * "stateSave": true, + * "stateLoadParams": function (settings, data) { + * return false; + * } + * } ); + * } ); + */ + "fnStateLoadParams": null, + + + /** + * Callback that is called when the state has been loaded from the state saving method + * and the DataTables settings object has been modified as a result of the loaded state. + * @type function + * @param {object} settings DataTables settings object + * @param {object} data The state object that was loaded + * + * @dtopt Callbacks + * @name DataTable.defaults.stateLoaded + * + * @example + * // Show an alert with the filtering value that was saved + * $(document).ready( function() { + * $('#example').dataTable( { + * "stateSave": true, + * "stateLoaded": function (settings, data) { + * alert( 'Saved filter was: '+data.oSearch.sSearch ); + * } + * } ); + * } ); + */ + "fnStateLoaded": null, + + + /** + * Save the table state. This function allows you to define where and how the state + * information for the table is stored By default DataTables will use `localStorage` + * but you might wish to use a server-side database or cookies. + * @type function + * @member + * @param {object} settings DataTables settings object + * @param {object} data The state object to be saved + * + * @dtopt Callbacks + * @name DataTable.defaults.stateSaveCallback + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "stateSave": true, + * "stateSaveCallback": function (settings, data) { + * // Send an Ajax request to the server with the state object + * $.ajax( { + * "url": "/state_save", + * "data": data, + * "dataType": "json", + * "method": "POST" + * "success": function () {} + * } ); + * } + * } ); + * } ); + */ + "fnStateSaveCallback": function ( settings, data ) { + try { + (settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem( + 'DataTables_'+settings.sInstance+'_'+location.pathname, + JSON.stringify( data ) + ); + } catch (e) {} + }, + + + /** + * Callback which allows modification of the state to be saved. Called when the table + * has changed state a new state save is required. This method allows modification of + * the state saving object prior to actually doing the save, including addition or + * other state properties or modification. Note that for plug-in authors, you should + * use the `stateSaveParams` event to save parameters for a plug-in. + * @type function + * @param {object} settings DataTables settings object + * @param {object} data The state object to be saved + * + * @dtopt Callbacks + * @name DataTable.defaults.stateSaveParams + * + * @example + * // Remove a saved filter, so filtering is never saved + * $(document).ready( function() { + * $('#example').dataTable( { + * "stateSave": true, + * "stateSaveParams": function (settings, data) { + * data.oSearch.sSearch = ""; + * } + * } ); + * } ); + */ + "fnStateSaveParams": null, + + + /** + * Duration for which the saved state information is considered valid. After this period + * has elapsed the state will be returned to the default. + * Value is given in seconds. + * @type int + * @default 7200 <i>(2 hours)</i> + * + * @dtopt Options + * @name DataTable.defaults.stateDuration + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "stateDuration": 60*60*24; // 1 day + * } ); + * } ) + */ + "iStateDuration": 7200, + + + /** + * When enabled DataTables will not make a request to the server for the first + * page draw - rather it will use the data already on the page (no sorting etc + * will be applied to it), thus saving on an XHR at load time. `deferLoading` + * is used to indicate that deferred loading is required, but it is also used + * to tell DataTables how many records there are in the full table (allowing + * the information element and pagination to be displayed correctly). In the case + * where a filtering is applied to the table on initial load, this can be + * indicated by giving the parameter as an array, where the first element is + * the number of records available after filtering and the second element is the + * number of records without filtering (allowing the table information element + * to be shown correctly). + * @type int | array + * @default null + * + * @dtopt Options + * @name DataTable.defaults.deferLoading + * + * @example + * // 57 records available in the table, no filtering applied + * $(document).ready( function() { + * $('#example').dataTable( { + * "serverSide": true, + * "ajax": "scripts/server_processing.php", + * "deferLoading": 57 + * } ); + * } ); + * + * @example + * // 57 records after filtering, 100 without filtering (an initial filter applied) + * $(document).ready( function() { + * $('#example').dataTable( { + * "serverSide": true, + * "ajax": "scripts/server_processing.php", + * "deferLoading": [ 57, 100 ], + * "search": { + * "search": "my_filter" + * } + * } ); + * } ); + */ + "iDeferLoading": null, + + + /** + * Number of rows to display on a single page when using pagination. If + * feature enabled (`lengthChange`) then the end user will be able to override + * this to a custom setting using a pop-up menu. + * @type int + * @default 10 + * + * @dtopt Options + * @name DataTable.defaults.pageLength + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "pageLength": 50 + * } ); + * } ) + */ + "iDisplayLength": 10, + + + /** + * Define the starting point for data display when using DataTables with + * pagination. Note that this parameter is the number of records, rather than + * the page number, so if you have 10 records per page and want to start on + * the third page, it should be "20". + * @type int + * @default 0 + * + * @dtopt Options + * @name DataTable.defaults.displayStart + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "displayStart": 20 + * } ); + * } ) + */ + "iDisplayStart": 0, + + + /** + * By default DataTables allows keyboard navigation of the table (sorting, paging, + * and filtering) by adding a `tabindex` attribute to the required elements. This + * allows you to tab through the controls and press the enter key to activate them. + * The tabindex is default 0, meaning that the tab follows the flow of the document. + * You can overrule this using this parameter if you wish. Use a value of -1 to + * disable built-in keyboard navigation. + * @type int + * @default 0 + * + * @dtopt Options + * @name DataTable.defaults.tabIndex + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "tabIndex": 1 + * } ); + * } ); + */ + "iTabIndex": 0, + + + /** + * Classes that DataTables assigns to the various components and features + * that it adds to the HTML table. This allows classes to be configured + * during initialisation in addition to through the static + * {@link DataTable.ext.oStdClasses} object). + * @namespace + * @name DataTable.defaults.classes + */ + "oClasses": {}, + + + /** + * All strings that DataTables uses in the user interface that it creates + * are defined in this object, allowing you to modified them individually or + * completely replace them all as required. + * @namespace + * @name DataTable.defaults.language + */ + "oLanguage": { + /** + * Strings that are used for WAI-ARIA labels and controls only (these are not + * actually visible on the page, but will be read by screenreaders, and thus + * must be internationalised as well). + * @namespace + * @name DataTable.defaults.language.aria + */ + "oAria": { + /** + * ARIA label that is added to the table headers when the column may be + * sorted ascending by activing the column (click or return when focused). + * Note that the column header is prefixed to this string. + * @type string + * @default : activate to sort column ascending + * + * @dtopt Language + * @name DataTable.defaults.language.aria.sortAscending + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "aria": { + * "sortAscending": " - click/return to sort ascending" + * } + * } + * } ); + * } ); + */ + "sSortAscending": ": activate to sort column ascending", + + /** + * ARIA label that is added to the table headers when the column may be + * sorted descending by activing the column (click or return when focused). + * Note that the column header is prefixed to this string. + * @type string + * @default : activate to sort column ascending + * + * @dtopt Language + * @name DataTable.defaults.language.aria.sortDescending + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "aria": { + * "sortDescending": " - click/return to sort descending" + * } + * } + * } ); + * } ); + */ + "sSortDescending": ": activate to sort column descending" + }, + + /** + * Pagination string used by DataTables for the built-in pagination + * control types. + * @namespace + * @name DataTable.defaults.language.paginate + */ + "oPaginate": { + /** + * Text to use when using the 'full_numbers' type of pagination for the + * button to take the user to the first page. + * @type string + * @default First + * + * @dtopt Language + * @name DataTable.defaults.language.paginate.first + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "paginate": { + * "first": "First page" + * } + * } + * } ); + * } ); + */ + "sFirst": "First", + + + /** + * Text to use when using the 'full_numbers' type of pagination for the + * button to take the user to the last page. + * @type string + * @default Last + * + * @dtopt Language + * @name DataTable.defaults.language.paginate.last + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "paginate": { + * "last": "Last page" + * } + * } + * } ); + * } ); + */ + "sLast": "Last", + + + /** + * Text to use for the 'next' pagination button (to take the user to the + * next page). + * @type string + * @default Next + * + * @dtopt Language + * @name DataTable.defaults.language.paginate.next + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "paginate": { + * "next": "Next page" + * } + * } + * } ); + * } ); + */ + "sNext": "Next", + + + /** + * Text to use for the 'previous' pagination button (to take the user to + * the previous page). + * @type string + * @default Previous + * + * @dtopt Language + * @name DataTable.defaults.language.paginate.previous + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "paginate": { + * "previous": "Previous page" + * } + * } + * } ); + * } ); + */ + "sPrevious": "Previous" + }, + + /** + * This string is shown in preference to `zeroRecords` when the table is + * empty of data (regardless of filtering). Note that this is an optional + * parameter - if it is not given, the value of `zeroRecords` will be used + * instead (either the default or given value). + * @type string + * @default No data available in table + * + * @dtopt Language + * @name DataTable.defaults.language.emptyTable + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "emptyTable": "No data available in table" + * } + * } ); + * } ); + */ + "sEmptyTable": "No data available in table", + + + /** + * This string gives information to the end user about the information + * that is current on display on the page. The following tokens can be + * used in the string and will be dynamically replaced as the table + * display updates. This tokens can be placed anywhere in the string, or + * removed as needed by the language requires: + * + * * `\_START\_` - Display index of the first record on the current page + * * `\_END\_` - Display index of the last record on the current page + * * `\_TOTAL\_` - Number of records in the table after filtering + * * `\_MAX\_` - Number of records in the table without filtering + * * `\_PAGE\_` - Current page number + * * `\_PAGES\_` - Total number of pages of data in the table + * + * @type string + * @default Showing _START_ to _END_ of _TOTAL_ entries + * + * @dtopt Language + * @name DataTable.defaults.language.info + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "info": "Showing page _PAGE_ of _PAGES_" + * } + * } ); + * } ); + */ + "sInfo": "Showing _START_ to _END_ of _TOTAL_ entries", + + + /** + * Display information string for when the table is empty. Typically the + * format of this string should match `info`. + * @type string + * @default Showing 0 to 0 of 0 entries + * + * @dtopt Language + * @name DataTable.defaults.language.infoEmpty + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "infoEmpty": "No entries to show" + * } + * } ); + * } ); + */ + "sInfoEmpty": "Showing 0 to 0 of 0 entries", + + + /** + * When a user filters the information in a table, this string is appended + * to the information (`info`) to give an idea of how strong the filtering + * is. The variable _MAX_ is dynamically updated. + * @type string + * @default (filtered from _MAX_ total entries) + * + * @dtopt Language + * @name DataTable.defaults.language.infoFiltered + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "infoFiltered": " - filtering from _MAX_ records" + * } + * } ); + * } ); + */ + "sInfoFiltered": "(filtered from _MAX_ total entries)", + + + /** + * If can be useful to append extra information to the info string at times, + * and this variable does exactly that. This information will be appended to + * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are + * being used) at all times. + * @type string + * @default <i>Empty string</i> + * + * @dtopt Language + * @name DataTable.defaults.language.infoPostFix + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "infoPostFix": "All records shown are derived from real information." + * } + * } ); + * } ); + */ + "sInfoPostFix": "", + + + /** + * This decimal place operator is a little different from the other + * language options since DataTables doesn't output floating point + * numbers, so it won't ever use this for display of a number. Rather, + * what this parameter does is modify the sort methods of the table so + * that numbers which are in a format which has a character other than + * a period (`.`) as a decimal place will be sorted numerically. + * + * Note that numbers with different decimal places cannot be shown in + * the same table and still be sortable, the table must be consistent. + * However, multiple different tables on the page can use different + * decimal place characters. + * @type string + * @default + * + * @dtopt Language + * @name DataTable.defaults.language.decimal + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "decimal": "," + * "thousands": "." + * } + * } ); + * } ); + */ + "sDecimal": "", + + + /** + * DataTables has a build in number formatter (`formatNumber`) which is + * used to format large numbers that are used in the table information. + * By default a comma is used, but this can be trivially changed to any + * character you wish with this parameter. + * @type string + * @default , + * + * @dtopt Language + * @name DataTable.defaults.language.thousands + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "thousands": "'" + * } + * } ); + * } ); + */ + "sThousands": ",", + + + /** + * Detail the action that will be taken when the drop down menu for the + * pagination length option is changed. The '_MENU_' variable is replaced + * with a default select list of 10, 25, 50 and 100, and can be replaced + * with a custom select box if required. + * @type string + * @default Show _MENU_ entries + * + * @dtopt Language + * @name DataTable.defaults.language.lengthMenu + * + * @example + * // Language change only + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "lengthMenu": "Display _MENU_ records" + * } + * } ); + * } ); + * + * @example + * // Language and options change + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "lengthMenu": 'Display <select>'+ + * '<option value="10">10</option>'+ + * '<option value="20">20</option>'+ + * '<option value="30">30</option>'+ + * '<option value="40">40</option>'+ + * '<option value="50">50</option>'+ + * '<option value="-1">All</option>'+ + * '</select> records' + * } + * } ); + * } ); + */ + "sLengthMenu": "Show _MENU_ entries", + + + /** + * When using Ajax sourced data and during the first draw when DataTables is + * gathering the data, this message is shown in an empty row in the table to + * indicate to the end user the the data is being loaded. Note that this + * parameter is not used when loading data by server-side processing, just + * Ajax sourced data with client-side processing. + * @type string + * @default Loading... + * + * @dtopt Language + * @name DataTable.defaults.language.loadingRecords + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "loadingRecords": "Please wait - loading..." + * } + * } ); + * } ); + */ + "sLoadingRecords": "Loading...", + + + /** + * Text which is displayed when the table is processing a user action + * (usually a sort command or similar). + * @type string + * @default Processing... + * + * @dtopt Language + * @name DataTable.defaults.language.processing + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "processing": "DataTables is currently busy" + * } + * } ); + * } ); + */ + "sProcessing": "Processing...", + + + /** + * Details the actions that will be taken when the user types into the + * filtering input text box. The variable "_INPUT_", if used in the string, + * is replaced with the HTML text box for the filtering input allowing + * control over where it appears in the string. If "_INPUT_" is not given + * then the input box is appended to the string automatically. + * @type string + * @default Search: + * + * @dtopt Language + * @name DataTable.defaults.language.search + * + * @example + * // Input text box will be appended at the end automatically + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "search": "Filter records:" + * } + * } ); + * } ); + * + * @example + * // Specify where the filter should appear + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "search": "Apply filter _INPUT_ to table" + * } + * } ); + * } ); + */ + "sSearch": "Search:", + + + /** + * Assign a `placeholder` attribute to the search `input` element + * @type string + * @default + * + * @dtopt Language + * @name DataTable.defaults.language.searchPlaceholder + */ + "sSearchPlaceholder": "", + + + /** + * All of the language information can be stored in a file on the + * server-side, which DataTables will look up if this parameter is passed. + * It must store the URL of the language file, which is in a JSON format, + * and the object has the same properties as the oLanguage object in the + * initialiser object (i.e. the above parameters). Please refer to one of + * the example language files to see how this works in action. + * @type string + * @default <i>Empty string - i.e. disabled</i> + * + * @dtopt Language + * @name DataTable.defaults.language.url + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "url": "http://www.sprymedia.co.uk/dataTables/lang.txt" + * } + * } ); + * } ); + */ + "sUrl": "", + + + /** + * Text shown inside the table records when the is no information to be + * displayed after filtering. `emptyTable` is shown when there is simply no + * information in the table at all (regardless of filtering). + * @type string + * @default No matching records found + * + * @dtopt Language + * @name DataTable.defaults.language.zeroRecords + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "language": { + * "zeroRecords": "No records to display" + * } + * } ); + * } ); + */ + "sZeroRecords": "No matching records found" + }, + + + /** + * This parameter allows you to have define the global filtering state at + * initialisation time. As an object the `search` parameter must be + * defined, but all other parameters are optional. When `regex` is true, + * the search string will be treated as a regular expression, when false + * (default) it will be treated as a straight string. When `smart` + * DataTables will use it's smart filtering methods (to word match at + * any point in the data), when false this will not be done. + * @namespace + * @extends DataTable.models.oSearch + * + * @dtopt Options + * @name DataTable.defaults.search + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "search": {"search": "Initial search"} + * } ); + * } ) + */ + "oSearch": $.extend( {}, DataTable.models.oSearch ), + + + /** + * __Deprecated__ The functionality provided by this parameter has now been + * superseded by that provided through `ajax`, which should be used instead. + * + * By default DataTables will look for the property `data` (or `aaData` for + * compatibility with DataTables 1.9-) when obtaining data from an Ajax + * source or for server-side processing - this parameter allows that + * property to be changed. You can use Javascript dotted object notation to + * get a data source for multiple levels of nesting. + * @type string + * @default data + * + * @dtopt Options + * @dtopt Server-side + * @name DataTable.defaults.ajaxDataProp + * + * @deprecated 1.10. Please use `ajax` for this functionality now. + */ + "sAjaxDataProp": "data", + + + /** + * __Deprecated__ The functionality provided by this parameter has now been + * superseded by that provided through `ajax`, which should be used instead. + * + * You can instruct DataTables to load data from an external + * source using this parameter (use aData if you want to pass data in you + * already have). Simply provide a url a JSON object can be obtained from. + * @type string + * @default null + * + * @dtopt Options + * @dtopt Server-side + * @name DataTable.defaults.ajaxSource + * + * @deprecated 1.10. Please use `ajax` for this functionality now. + */ + "sAjaxSource": null, + + + /** + * This initialisation variable allows you to specify exactly where in the + * DOM you want DataTables to inject the various controls it adds to the page + * (for example you might want the pagination controls at the top of the + * table). DIV elements (with or without a custom class) can also be added to + * aid styling. The follow syntax is used: + * <ul> + * <li>The following options are allowed: + * <ul> + * <li>'l' - Length changing</li> + * <li>'f' - Filtering input</li> + * <li>'t' - The table!</li> + * <li>'i' - Information</li> + * <li>'p' - Pagination</li> + * <li>'r' - pRocessing</li> + * </ul> + * </li> + * <li>The following constants are allowed: + * <ul> + * <li>'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li> + * <li>'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li> + * </ul> + * </li> + * <li>The following syntax is expected: + * <ul> + * <li>'&lt;' and '&gt;' - div elements</li> + * <li>'&lt;"class" and '&gt;' - div with a class</li> + * <li>'&lt;"#id" and '&gt;' - div with an ID</li> + * </ul> + * </li> + * <li>Examples: + * <ul> + * <li>'&lt;"wrapper"flipt&gt;'</li> + * <li>'&lt;lf&lt;t&gt;ip&gt;'</li> + * </ul> + * </li> + * </ul> + * @type string + * @default lfrtip <i>(when `jQueryUI` is false)</i> <b>or</b> + * <"H"lfr>t<"F"ip> <i>(when `jQueryUI` is true)</i> + * + * @dtopt Options + * @name DataTable.defaults.dom + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "dom": '&lt;"top"i&gt;rt&lt;"bottom"flp&gt;&lt;"clear"&gt;' + * } ); + * } ); + */ + "sDom": "lfrtip", + + + /** + * Search delay option. This will throttle full table searches that use the + * DataTables provided search input element (it does not effect calls to + * `dt-api search()`, providing a delay before the search is made. + * @type integer + * @default 0 + * + * @dtopt Options + * @name DataTable.defaults.searchDelay + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "searchDelay": 200 + * } ); + * } ) + */ + "searchDelay": null, + + + /** + * DataTables features four different built-in options for the buttons to + * display for pagination control: + * + * * `simple` - 'Previous' and 'Next' buttons only + * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers + * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons + * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus + * page numbers + * + * Further methods can be added using {@link DataTable.ext.oPagination}. + * @type string + * @default simple_numbers + * + * @dtopt Options + * @name DataTable.defaults.pagingType + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "pagingType": "full_numbers" + * } ); + * } ) + */ + "sPaginationType": "simple_numbers", + + + /** + * Enable horizontal scrolling. When a table is too wide to fit into a + * certain layout, or you have a large number of columns in the table, you + * can enable x-scrolling to show the table in a viewport, which can be + * scrolled. This property can be `true` which will allow the table to + * scroll horizontally when needed, or any CSS unit, or a number (in which + * case it will be treated as a pixel measurement). Setting as simply `true` + * is recommended. + * @type boolean|string + * @default <i>blank string - i.e. disabled</i> + * + * @dtopt Features + * @name DataTable.defaults.scrollX + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "scrollX": true, + * "scrollCollapse": true + * } ); + * } ); + */ + "sScrollX": "", + + + /** + * This property can be used to force a DataTable to use more width than it + * might otherwise do when x-scrolling is enabled. For example if you have a + * table which requires to be well spaced, this parameter is useful for + * "over-sizing" the table, and thus forcing scrolling. This property can by + * any CSS unit, or a number (in which case it will be treated as a pixel + * measurement). + * @type string + * @default <i>blank string - i.e. disabled</i> + * + * @dtopt Options + * @name DataTable.defaults.scrollXInner + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "scrollX": "100%", + * "scrollXInner": "110%" + * } ); + * } ); + */ + "sScrollXInner": "", + + + /** + * Enable vertical scrolling. Vertical scrolling will constrain the DataTable + * to the given height, and enable scrolling for any data which overflows the + * current viewport. This can be used as an alternative to paging to display + * a lot of data in a small area (although paging and scrolling can both be + * enabled at the same time). This property can be any CSS unit, or a number + * (in which case it will be treated as a pixel measurement). + * @type string + * @default <i>blank string - i.e. disabled</i> + * + * @dtopt Features + * @name DataTable.defaults.scrollY + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "scrollY": "200px", + * "paginate": false + * } ); + * } ); + */ + "sScrollY": "", + + + /** + * __Deprecated__ The functionality provided by this parameter has now been + * superseded by that provided through `ajax`, which should be used instead. + * + * Set the HTTP method that is used to make the Ajax call for server-side + * processing or Ajax sourced data. + * @type string + * @default GET + * + * @dtopt Options + * @dtopt Server-side + * @name DataTable.defaults.serverMethod + * + * @deprecated 1.10. Please use `ajax` for this functionality now. + */ + "sServerMethod": "GET", + + + /** + * DataTables makes use of renderers when displaying HTML elements for + * a table. These renderers can be added or modified by plug-ins to + * generate suitable mark-up for a site. For example the Bootstrap + * integration plug-in for DataTables uses a paging button renderer to + * display pagination buttons in the mark-up required by Bootstrap. + * + * For further information about the renderers available see + * DataTable.ext.renderer + * @type string|object + * @default null + * + * @name DataTable.defaults.renderer + * + */ + "renderer": null + }; + + _fnHungarianMap( DataTable.defaults ); + + + + /* + * Developer note - See note in model.defaults.js about the use of Hungarian + * notation and camel case. + */ + + /** + * Column options that can be given to DataTables at initialisation time. + * @namespace + */ + DataTable.defaults.column = { + /** + * Define which column(s) an order will occur on for this column. This + * allows a column's ordering to take multiple columns into account when + * doing a sort or use the data from a different column. For example first + * name / last name columns make sense to do a multi-column sort over the + * two columns. + * @type array|int + * @default null <i>Takes the value of the column index automatically</i> + * + * @name DataTable.defaults.column.orderData + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { "orderData": [ 0, 1 ], "targets": [ 0 ] }, + * { "orderData": [ 1, 0 ], "targets": [ 1 ] }, + * { "orderData": 2, "targets": [ 2 ] } + * ] + * } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * { "orderData": [ 0, 1 ] }, + * { "orderData": [ 1, 0 ] }, + * { "orderData": 2 }, + * null, + * null + * ] + * } ); + * } ); + */ + "aDataSort": null, + "iDataSort": -1, + + + /** + * You can control the default ordering direction, and even alter the + * behaviour of the sort handler (i.e. only allow ascending ordering etc) + * using this parameter. + * @type array + * @default [ 'asc', 'desc' ] + * + * @name DataTable.defaults.column.orderSequence + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { "orderSequence": [ "asc" ], "targets": [ 1 ] }, + * { "orderSequence": [ "desc", "asc", "asc" ], "targets": [ 2 ] }, + * { "orderSequence": [ "desc" ], "targets": [ 3 ] } + * ] + * } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * null, + * { "orderSequence": [ "asc" ] }, + * { "orderSequence": [ "desc", "asc", "asc" ] }, + * { "orderSequence": [ "desc" ] }, + * null + * ] + * } ); + * } ); + */ + "asSorting": [ 'asc', 'desc' ], + + + /** + * Enable or disable filtering on the data in this column. + * @type boolean + * @default true + * + * @name DataTable.defaults.column.searchable + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { "searchable": false, "targets": [ 0 ] } + * ] } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * { "searchable": false }, + * null, + * null, + * null, + * null + * ] } ); + * } ); + */ + "bSearchable": true, + + + /** + * Enable or disable ordering on this column. + * @type boolean + * @default true + * + * @name DataTable.defaults.column.orderable + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { "orderable": false, "targets": [ 0 ] } + * ] } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * { "orderable": false }, + * null, + * null, + * null, + * null + * ] } ); + * } ); + */ + "bSortable": true, + + + /** + * Enable or disable the display of this column. + * @type boolean + * @default true + * + * @name DataTable.defaults.column.visible + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { "visible": false, "targets": [ 0 ] } + * ] } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * { "visible": false }, + * null, + * null, + * null, + * null + * ] } ); + * } ); + */ + "bVisible": true, + + + /** + * Developer definable function that is called whenever a cell is created (Ajax source, + * etc) or processed for input (DOM source). This can be used as a compliment to mRender + * allowing you to modify the DOM element (add background colour for example) when the + * element is available. + * @type function + * @param {element} td The TD node that has been created + * @param {*} cellData The Data for the cell + * @param {array|object} rowData The data for the whole row + * @param {int} row The row index for the aoData data store + * @param {int} col The column index for aoColumns + * + * @name DataTable.defaults.column.createdCell + * @dtopt Columns + * + * @example + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ { + * "targets": [3], + * "createdCell": function (td, cellData, rowData, row, col) { + * if ( cellData == "1.7" ) { + * $(td).css('color', 'blue') + * } + * } + * } ] + * }); + * } ); + */ + "fnCreatedCell": null, + + + /** + * This parameter has been replaced by `data` in DataTables to ensure naming + * consistency. `dataProp` can still be used, as there is backwards + * compatibility in DataTables for this option, but it is strongly + * recommended that you use `data` in preference to `dataProp`. + * @name DataTable.defaults.column.dataProp + */ + + + /** + * This property can be used to read data from any data source property, + * including deeply nested objects / properties. `data` can be given in a + * number of different ways which effect its behaviour: + * + * * `integer` - treated as an array index for the data source. This is the + * default that DataTables uses (incrementally increased for each column). + * * `string` - read an object property from the data source. There are + * three 'special' options that can be used in the string to alter how + * DataTables reads the data from the source object: + * * `.` - Dotted Javascript notation. Just as you use a `.` in + * Javascript to read from nested objects, so to can the options + * specified in `data`. For example: `browser.version` or + * `browser.name`. If your object parameter name contains a period, use + * `\\` to escape it - i.e. `first\\.name`. + * * `[]` - Array notation. DataTables can automatically combine data + * from and array source, joining the data with the characters provided + * between the two brackets. For example: `name[, ]` would provide a + * comma-space separated list from the source array. If no characters + * are provided between the brackets, the original array source is + * returned. + * * `()` - Function notation. Adding `()` to the end of a parameter will + * execute a function of the name given. For example: `browser()` for a + * simple function on the data source, `browser.version()` for a + * function in a nested property or even `browser().version` to get an + * object property if the function called returns an object. Note that + * function notation is recommended for use in `render` rather than + * `data` as it is much simpler to use as a renderer. + * * `null` - use the original data source for the row rather than plucking + * data directly from it. This action has effects on two other + * initialisation options: + * * `defaultContent` - When null is given as the `data` option and + * `defaultContent` is specified for the column, the value defined by + * `defaultContent` will be used for the cell. + * * `render` - When null is used for the `data` option and the `render` + * option is specified for the column, the whole data source for the + * row is used for the renderer. + * * `function` - the function given will be executed whenever DataTables + * needs to set or get the data for a cell in the column. The function + * takes three parameters: + * * Parameters: + * * `{array|object}` The data source for the row + * * `{string}` The type call data requested - this will be 'set' when + * setting data or 'filter', 'display', 'type', 'sort' or undefined + * when gathering data. Note that when `undefined` is given for the + * type DataTables expects to get the raw data for the object back< + * * `{*}` Data to set when the second parameter is 'set'. + * * Return: + * * The return value from the function is not required when 'set' is + * the type of call, but otherwise the return is what will be used + * for the data requested. + * + * Note that `data` is a getter and setter option. If you just require + * formatting of data for output, you will likely want to use `render` which + * is simply a getter and thus simpler to use. + * + * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The + * name change reflects the flexibility of this property and is consistent + * with the naming of mRender. If 'mDataProp' is given, then it will still + * be used by DataTables, as it automatically maps the old name to the new + * if required. + * + * @type string|int|function|null + * @default null <i>Use automatically calculated column index</i> + * + * @name DataTable.defaults.column.data + * @dtopt Columns + * + * @example + * // Read table data from objects + * // JSON structure for each row: + * // { + * // "engine": {value}, + * // "browser": {value}, + * // "platform": {value}, + * // "version": {value}, + * // "grade": {value} + * // } + * $(document).ready( function() { + * $('#example').dataTable( { + * "ajaxSource": "sources/objects.txt", + * "columns": [ + * { "data": "engine" }, + * { "data": "browser" }, + * { "data": "platform" }, + * { "data": "version" }, + * { "data": "grade" } + * ] + * } ); + * } ); + * + * @example + * // Read information from deeply nested objects + * // JSON structure for each row: + * // { + * // "engine": {value}, + * // "browser": {value}, + * // "platform": { + * // "inner": {value} + * // }, + * // "details": [ + * // {value}, {value} + * // ] + * // } + * $(document).ready( function() { + * $('#example').dataTable( { + * "ajaxSource": "sources/deep.txt", + * "columns": [ + * { "data": "engine" }, + * { "data": "browser" }, + * { "data": "platform.inner" }, + * { "data": "platform.details.0" }, + * { "data": "platform.details.1" } + * ] + * } ); + * } ); + * + * @example + * // Using `data` as a function to provide different information for + * // sorting, filtering and display. In this case, currency (price) + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ { + * "targets": [ 0 ], + * "data": function ( source, type, val ) { + * if (type === 'set') { + * source.price = val; + * // Store the computed dislay and filter values for efficiency + * source.price_display = val=="" ? "" : "$"+numberFormat(val); + * source.price_filter = val=="" ? "" : "$"+numberFormat(val)+" "+val; + * return; + * } + * else if (type === 'display') { + * return source.price_display; + * } + * else if (type === 'filter') { + * return source.price_filter; + * } + * // 'sort', 'type' and undefined all just use the integer + * return source.price; + * } + * } ] + * } ); + * } ); + * + * @example + * // Using default content + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ { + * "targets": [ 0 ], + * "data": null, + * "defaultContent": "Click to edit" + * } ] + * } ); + * } ); + * + * @example + * // Using array notation - outputting a list from an array + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ { + * "targets": [ 0 ], + * "data": "name[, ]" + * } ] + * } ); + * } ); + * + */ + "mData": null, + + + /** + * This property is the rendering partner to `data` and it is suggested that + * when you want to manipulate data for display (including filtering, + * sorting etc) without altering the underlying data for the table, use this + * property. `render` can be considered to be the the read only companion to + * `data` which is read / write (then as such more complex). Like `data` + * this option can be given in a number of different ways to effect its + * behaviour: + * + * * `integer` - treated as an array index for the data source. This is the + * default that DataTables uses (incrementally increased for each column). + * * `string` - read an object property from the data source. There are + * three 'special' options that can be used in the string to alter how + * DataTables reads the data from the source object: + * * `.` - Dotted Javascript notation. Just as you use a `.` in + * Javascript to read from nested objects, so to can the options + * specified in `data`. For example: `browser.version` or + * `browser.name`. If your object parameter name contains a period, use + * `\\` to escape it - i.e. `first\\.name`. + * * `[]` - Array notation. DataTables can automatically combine data + * from and array source, joining the data with the characters provided + * between the two brackets. For example: `name[, ]` would provide a + * comma-space separated list from the source array. If no characters + * are provided between the brackets, the original array source is + * returned. + * * `()` - Function notation. Adding `()` to the end of a parameter will + * execute a function of the name given. For example: `browser()` for a + * simple function on the data source, `browser.version()` for a + * function in a nested property or even `browser().version` to get an + * object property if the function called returns an object. + * * `object` - use different data for the different data types requested by + * DataTables ('filter', 'display', 'type' or 'sort'). The property names + * of the object is the data type the property refers to and the value can + * defined using an integer, string or function using the same rules as + * `render` normally does. Note that an `_` option _must_ be specified. + * This is the default value to use if you haven't specified a value for + * the data type requested by DataTables. + * * `function` - the function given will be executed whenever DataTables + * needs to set or get the data for a cell in the column. The function + * takes three parameters: + * * Parameters: + * * {array|object} The data source for the row (based on `data`) + * * {string} The type call data requested - this will be 'filter', + * 'display', 'type' or 'sort'. + * * {array|object} The full data source for the row (not based on + * `data`) + * * Return: + * * The return value from the function is what will be used for the + * data requested. + * + * @type string|int|function|object|null + * @default null Use the data source value. + * + * @name DataTable.defaults.column.render + * @dtopt Columns + * + * @example + * // Create a comma separated list from an array of objects + * $(document).ready( function() { + * $('#example').dataTable( { + * "ajaxSource": "sources/deep.txt", + * "columns": [ + * { "data": "engine" }, + * { "data": "browser" }, + * { + * "data": "platform", + * "render": "[, ].name" + * } + * ] + * } ); + * } ); + * + * @example + * // Execute a function to obtain data + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ { + * "targets": [ 0 ], + * "data": null, // Use the full data source object for the renderer's source + * "render": "browserName()" + * } ] + * } ); + * } ); + * + * @example + * // As an object, extracting different data for the different types + * // This would be used with a data source such as: + * // { "phone": 5552368, "phone_filter": "5552368 555-2368", "phone_display": "555-2368" } + * // Here the `phone` integer is used for sorting and type detection, while `phone_filter` + * // (which has both forms) is used for filtering for if a user inputs either format, while + * // the formatted phone number is the one that is shown in the table. + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ { + * "targets": [ 0 ], + * "data": null, // Use the full data source object for the renderer's source + * "render": { + * "_": "phone", + * "filter": "phone_filter", + * "display": "phone_display" + * } + * } ] + * } ); + * } ); + * + * @example + * // Use as a function to create a link from the data source + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ { + * "targets": [ 0 ], + * "data": "download_link", + * "render": function ( data, type, full ) { + * return '<a href="'+data+'">Download</a>'; + * } + * } ] + * } ); + * } ); + */ + "mRender": null, + + + /** + * Change the cell type created for the column - either TD cells or TH cells. This + * can be useful as TH cells have semantic meaning in the table body, allowing them + * to act as a header for a row (you may wish to add scope='row' to the TH elements). + * @type string + * @default td + * + * @name DataTable.defaults.column.cellType + * @dtopt Columns + * + * @example + * // Make the first column use TH cells + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ { + * "targets": [ 0 ], + * "cellType": "th" + * } ] + * } ); + * } ); + */ + "sCellType": "td", + + + /** + * Class to give to each cell in this column. + * @type string + * @default <i>Empty string</i> + * + * @name DataTable.defaults.column.class + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { "class": "my_class", "targets": [ 0 ] } + * ] + * } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * { "class": "my_class" }, + * null, + * null, + * null, + * null + * ] + * } ); + * } ); + */ + "sClass": "", + + /** + * When DataTables calculates the column widths to assign to each column, + * it finds the longest string in each column and then constructs a + * temporary table and reads the widths from that. The problem with this + * is that "mmm" is much wider then "iiii", but the latter is a longer + * string - thus the calculation can go wrong (doing it properly and putting + * it into an DOM object and measuring that is horribly(!) slow). Thus as + * a "work around" we provide this option. It will append its value to the + * text that is found to be the longest string for the column - i.e. padding. + * Generally you shouldn't need this! + * @type string + * @default <i>Empty string<i> + * + * @name DataTable.defaults.column.contentPadding + * @dtopt Columns + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * null, + * null, + * null, + * { + * "contentPadding": "mmm" + * } + * ] + * } ); + * } ); + */ + "sContentPadding": "", + + + /** + * Allows a default value to be given for a column's data, and will be used + * whenever a null data source is encountered (this can be because `data` + * is set to null, or because the data source itself is null). + * @type string + * @default null + * + * @name DataTable.defaults.column.defaultContent + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { + * "data": null, + * "defaultContent": "Edit", + * "targets": [ -1 ] + * } + * ] + * } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * null, + * null, + * null, + * { + * "data": null, + * "defaultContent": "Edit" + * } + * ] + * } ); + * } ); + */ + "sDefaultContent": null, + + + /** + * This parameter is only used in DataTables' server-side processing. It can + * be exceptionally useful to know what columns are being displayed on the + * client side, and to map these to database fields. When defined, the names + * also allow DataTables to reorder information from the server if it comes + * back in an unexpected order (i.e. if you switch your columns around on the + * client-side, your server-side code does not also need updating). + * @type string + * @default <i>Empty string</i> + * + * @name DataTable.defaults.column.name + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { "name": "engine", "targets": [ 0 ] }, + * { "name": "browser", "targets": [ 1 ] }, + * { "name": "platform", "targets": [ 2 ] }, + * { "name": "version", "targets": [ 3 ] }, + * { "name": "grade", "targets": [ 4 ] } + * ] + * } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * { "name": "engine" }, + * { "name": "browser" }, + * { "name": "platform" }, + * { "name": "version" }, + * { "name": "grade" } + * ] + * } ); + * } ); + */ + "sName": "", + + + /** + * Defines a data source type for the ordering which can be used to read + * real-time information from the table (updating the internally cached + * version) prior to ordering. This allows ordering to occur on user + * editable elements such as form inputs. + * @type string + * @default std + * + * @name DataTable.defaults.column.orderDataType + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { "orderDataType": "dom-text", "targets": [ 2, 3 ] }, + * { "type": "numeric", "targets": [ 3 ] }, + * { "orderDataType": "dom-select", "targets": [ 4 ] }, + * { "orderDataType": "dom-checkbox", "targets": [ 5 ] } + * ] + * } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * null, + * null, + * { "orderDataType": "dom-text" }, + * { "orderDataType": "dom-text", "type": "numeric" }, + * { "orderDataType": "dom-select" }, + * { "orderDataType": "dom-checkbox" } + * ] + * } ); + * } ); + */ + "sSortDataType": "std", + + + /** + * The title of this column. + * @type string + * @default null <i>Derived from the 'TH' value for this column in the + * original HTML table.</i> + * + * @name DataTable.defaults.column.title + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { "title": "My column title", "targets": [ 0 ] } + * ] + * } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * { "title": "My column title" }, + * null, + * null, + * null, + * null + * ] + * } ); + * } ); + */ + "sTitle": null, + + + /** + * The type allows you to specify how the data for this column will be + * ordered. Four types (string, numeric, date and html (which will strip + * HTML tags before ordering)) are currently available. Note that only date + * formats understood by Javascript's Date() object will be accepted as type + * date. For example: "Mar 26, 2008 5:03 PM". May take the values: 'string', + * 'numeric', 'date' or 'html' (by default). Further types can be adding + * through plug-ins. + * @type string + * @default null <i>Auto-detected from raw data</i> + * + * @name DataTable.defaults.column.type + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { "type": "html", "targets": [ 0 ] } + * ] + * } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * { "type": "html" }, + * null, + * null, + * null, + * null + * ] + * } ); + * } ); + */ + "sType": null, + + + /** + * Defining the width of the column, this parameter may take any CSS value + * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not + * been given a specific width through this interface ensuring that the table + * remains readable. + * @type string + * @default null <i>Automatic</i> + * + * @name DataTable.defaults.column.width + * @dtopt Columns + * + * @example + * // Using `columnDefs` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columnDefs": [ + * { "width": "20%", "targets": [ 0 ] } + * ] + * } ); + * } ); + * + * @example + * // Using `columns` + * $(document).ready( function() { + * $('#example').dataTable( { + * "columns": [ + * { "width": "20%" }, + * null, + * null, + * null, + * null + * ] + * } ); + * } ); + */ + "sWidth": null + }; + + _fnHungarianMap( DataTable.defaults.column ); + + + + /** + * DataTables settings object - this holds all the information needed for a + * given table, including configuration, data and current application of the + * table options. DataTables does not have a single instance for each DataTable + * with the settings attached to that instance, but rather instances of the + * DataTable "class" are created on-the-fly as needed (typically by a + * $().dataTable() call) and the settings object is then applied to that + * instance. + * + * Note that this object is related to {@link DataTable.defaults} but this + * one is the internal data store for DataTables's cache of columns. It should + * NOT be manipulated outside of DataTables. Any configuration should be done + * through the initialisation options. + * @namespace + * @todo Really should attach the settings object to individual instances so we + * don't need to create new instances on each $().dataTable() call (if the + * table already exists). It would also save passing oSettings around and + * into every single function. However, this is a very significant + * architecture change for DataTables and will almost certainly break + * backwards compatibility with older installations. This is something that + * will be done in 2.0. + */ + DataTable.models.oSettings = { + /** + * Primary features of DataTables and their enablement state. + * @namespace + */ + "oFeatures": { + + /** + * Flag to say if DataTables should automatically try to calculate the + * optimum table and columns widths (true) or not (false). + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bAutoWidth": null, + + /** + * Delay the creation of TR and TD elements until they are actually + * needed by a driven page draw. This can give a significant speed + * increase for Ajax source and Javascript source data, but makes no + * difference at all fro DOM and server-side processing tables. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bDeferRender": null, + + /** + * Enable filtering on the table or not. Note that if this is disabled + * then there is no filtering at all on the table, including fnFilter. + * To just remove the filtering input use sDom and remove the 'f' option. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bFilter": null, + + /** + * Table information element (the 'Showing x of y records' div) enable + * flag. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bInfo": null, + + /** + * Present a user control allowing the end user to change the page size + * when pagination is enabled. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bLengthChange": null, + + /** + * Pagination enabled or not. Note that if this is disabled then length + * changing must also be disabled. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bPaginate": null, + + /** + * Processing indicator enable flag whenever DataTables is enacting a + * user request - typically an Ajax request for server-side processing. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bProcessing": null, + + /** + * Server-side processing enabled flag - when enabled DataTables will + * get all data from the server for every draw - there is no filtering, + * sorting or paging done on the client-side. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bServerSide": null, + + /** + * Sorting enablement flag. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bSort": null, + + /** + * Multi-column sorting + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bSortMulti": null, + + /** + * Apply a class to the columns which are being sorted to provide a + * visual highlight or not. This can slow things down when enabled since + * there is a lot of DOM interaction. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bSortClasses": null, + + /** + * State saving enablement flag. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bStateSave": null + }, + + + /** + * Scrolling settings for a table. + * @namespace + */ + "oScroll": { + /** + * When the table is shorter in height than sScrollY, collapse the + * table container down to the height of the table (when true). + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bCollapse": null, + + /** + * Width of the scrollbar for the web-browser's platform. Calculated + * during table initialisation. + * @type int + * @default 0 + */ + "iBarWidth": 0, + + /** + * Viewport width for horizontal scrolling. Horizontal scrolling is + * disabled if an empty string. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + */ + "sX": null, + + /** + * Width to expand the table to when using x-scrolling. Typically you + * should not need to use this. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + * @deprecated + */ + "sXInner": null, + + /** + * Viewport height for vertical scrolling. Vertical scrolling is disabled + * if an empty string. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + */ + "sY": null + }, + + /** + * Language information for the table. + * @namespace + * @extends DataTable.defaults.oLanguage + */ + "oLanguage": { + /** + * Information callback function. See + * {@link DataTable.defaults.fnInfoCallback} + * @type function + * @default null + */ + "fnInfoCallback": null + }, + + /** + * Browser support parameters + * @namespace + */ + "oBrowser": { + /** + * Indicate if the browser incorrectly calculates width:100% inside a + * scrolling element (IE6/7) + * @type boolean + * @default false + */ + "bScrollOversize": false, + + /** + * Determine if the vertical scrollbar is on the right or left of the + * scrolling container - needed for rtl language layout, although not + * all browsers move the scrollbar (Safari). + * @type boolean + * @default false + */ + "bScrollbarLeft": false + }, + + + "ajax": null, + + + /** + * Array referencing the nodes which are used for the features. The + * parameters of this object match what is allowed by sDom - i.e. + * <ul> + * <li>'l' - Length changing</li> + * <li>'f' - Filtering input</li> + * <li>'t' - The table!</li> + * <li>'i' - Information</li> + * <li>'p' - Pagination</li> + * <li>'r' - pRocessing</li> + * </ul> + * @type array + * @default [] + */ + "aanFeatures": [], + + /** + * Store data information - see {@link DataTable.models.oRow} for detailed + * information. + * @type array + * @default [] + */ + "aoData": [], + + /** + * Array of indexes which are in the current display (after filtering etc) + * @type array + * @default [] + */ + "aiDisplay": [], + + /** + * Array of indexes for display - no filtering + * @type array + * @default [] + */ + "aiDisplayMaster": [], + + /** + * Store information about each column that is in use + * @type array + * @default [] + */ + "aoColumns": [], + + /** + * Store information about the table's header + * @type array + * @default [] + */ + "aoHeader": [], + + /** + * Store information about the table's footer + * @type array + * @default [] + */ + "aoFooter": [], + + /** + * Store the applied global search information in case we want to force a + * research or compare the old search to a new one. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @namespace + * @extends DataTable.models.oSearch + */ + "oPreviousSearch": {}, + + /** + * Store the applied search for each column - see + * {@link DataTable.models.oSearch} for the format that is used for the + * filtering information for each column. + * @type array + * @default [] + */ + "aoPreSearchCols": [], + + /** + * Sorting that is applied to the table. Note that the inner arrays are + * used in the following manner: + * <ul> + * <li>Index 0 - column number</li> + * <li>Index 1 - current sorting direction</li> + * </ul> + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type array + * @todo These inner arrays should really be objects + */ + "aaSorting": null, + + /** + * Sorting that is always applied to the table (i.e. prefixed in front of + * aaSorting). + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type array + * @default [] + */ + "aaSortingFixed": [], + + /** + * Classes to use for the striping of a table. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type array + * @default [] + */ + "asStripeClasses": null, + + /** + * If restoring a table - we should restore its striping classes as well + * @type array + * @default [] + */ + "asDestroyStripes": [], + + /** + * If restoring a table - we should restore its width + * @type int + * @default 0 + */ + "sDestroyWidth": 0, + + /** + * Callback functions array for every time a row is inserted (i.e. on a draw). + * @type array + * @default [] + */ + "aoRowCallback": [], + + /** + * Callback functions for the header on each draw. + * @type array + * @default [] + */ + "aoHeaderCallback": [], + + /** + * Callback function for the footer on each draw. + * @type array + * @default [] + */ + "aoFooterCallback": [], + + /** + * Array of callback functions for draw callback functions + * @type array + * @default [] + */ + "aoDrawCallback": [], + + /** + * Array of callback functions for row created function + * @type array + * @default [] + */ + "aoRowCreatedCallback": [], + + /** + * Callback functions for just before the table is redrawn. A return of + * false will be used to cancel the draw. + * @type array + * @default [] + */ + "aoPreDrawCallback": [], + + /** + * Callback functions for when the table has been initialised. + * @type array + * @default [] + */ + "aoInitComplete": [], + + + /** + * Callbacks for modifying the settings to be stored for state saving, prior to + * saving state. + * @type array + * @default [] + */ + "aoStateSaveParams": [], + + /** + * Callbacks for modifying the settings that have been stored for state saving + * prior to using the stored values to restore the state. + * @type array + * @default [] + */ + "aoStateLoadParams": [], + + /** + * Callbacks for operating on the settings object once the saved state has been + * loaded + * @type array + * @default [] + */ + "aoStateLoaded": [], + + /** + * Cache the table ID for quick access + * @type string + * @default <i>Empty string</i> + */ + "sTableId": "", + + /** + * The TABLE node for the main table + * @type node + * @default null + */ + "nTable": null, + + /** + * Permanent ref to the thead element + * @type node + * @default null + */ + "nTHead": null, + + /** + * Permanent ref to the tfoot element - if it exists + * @type node + * @default null + */ + "nTFoot": null, + + /** + * Permanent ref to the tbody element + * @type node + * @default null + */ + "nTBody": null, + + /** + * Cache the wrapper node (contains all DataTables controlled elements) + * @type node + * @default null + */ + "nTableWrapper": null, + + /** + * Indicate if when using server-side processing the loading of data + * should be deferred until the second draw. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + * @default false + */ + "bDeferLoading": false, + + /** + * Indicate if all required information has been read in + * @type boolean + * @default false + */ + "bInitialised": false, + + /** + * Information about open rows. Each object in the array has the parameters + * 'nTr' and 'nParent' + * @type array + * @default [] + */ + "aoOpenRows": [], + + /** + * Dictate the positioning of DataTables' control elements - see + * {@link DataTable.model.oInit.sDom}. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + * @default null + */ + "sDom": null, + + /** + * Search delay (in mS) + * @type integer + * @default null + */ + "searchDelay": null, + + /** + * Which type of pagination should be used. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + * @default two_button + */ + "sPaginationType": "two_button", + + /** + * The state duration (for `stateSave`) in seconds. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type int + * @default 0 + */ + "iStateDuration": 0, + + /** + * Array of callback functions for state saving. Each array element is an + * object with the following parameters: + * <ul> + * <li>function:fn - function to call. Takes two parameters, oSettings + * and the JSON string to save that has been thus far created. Returns + * a JSON string to be inserted into a json object + * (i.e. '"param": [ 0, 1, 2]')</li> + * <li>string:sName - name of callback</li> + * </ul> + * @type array + * @default [] + */ + "aoStateSave": [], + + /** + * Array of callback functions for state loading. Each array element is an + * object with the following parameters: + * <ul> + * <li>function:fn - function to call. Takes two parameters, oSettings + * and the object stored. May return false to cancel state loading</li> + * <li>string:sName - name of callback</li> + * </ul> + * @type array + * @default [] + */ + "aoStateLoad": [], + + /** + * State that was saved. Useful for back reference + * @type object + * @default null + */ + "oSavedState": null, + + /** + * State that was loaded. Useful for back reference + * @type object + * @default null + */ + "oLoadedState": null, + + /** + * Source url for AJAX data for the table. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + * @default null + */ + "sAjaxSource": null, + + /** + * Property from a given object from which to read the table data from. This + * can be an empty string (when not server-side processing), in which case + * it is assumed an an array is given directly. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + */ + "sAjaxDataProp": null, + + /** + * Note if draw should be blocked while getting data + * @type boolean + * @default true + */ + "bAjaxDataGet": true, + + /** + * The last jQuery XHR object that was used for server-side data gathering. + * This can be used for working with the XHR information in one of the + * callbacks + * @type object + * @default null + */ + "jqXHR": null, + + /** + * JSON returned from the server in the last Ajax request + * @type object + * @default undefined + */ + "json": undefined, + + /** + * Data submitted as part of the last Ajax request + * @type object + * @default undefined + */ + "oAjaxData": undefined, + + /** + * Function to get the server-side data. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type function + */ + "fnServerData": null, + + /** + * Functions which are called prior to sending an Ajax request so extra + * parameters can easily be sent to the server + * @type array + * @default [] + */ + "aoServerParams": [], + + /** + * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if + * required). + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type string + */ + "sServerMethod": null, + + /** + * Format numbers for display. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type function + */ + "fnFormatNumber": null, + + /** + * List of options that can be used for the user selectable length menu. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type array + * @default [] + */ + "aLengthMenu": null, + + /** + * Counter for the draws that the table does. Also used as a tracker for + * server-side processing + * @type int + * @default 0 + */ + "iDraw": 0, + + /** + * Indicate if a redraw is being done - useful for Ajax + * @type boolean + * @default false + */ + "bDrawing": false, + + /** + * Draw index (iDraw) of the last error when parsing the returned data + * @type int + * @default -1 + */ + "iDrawError": -1, + + /** + * Paging display length + * @type int + * @default 10 + */ + "_iDisplayLength": 10, + + /** + * Paging start point - aiDisplay index + * @type int + * @default 0 + */ + "_iDisplayStart": 0, + + /** + * Server-side processing - number of records in the result set + * (i.e. before filtering), Use fnRecordsTotal rather than + * this property to get the value of the number of records, regardless of + * the server-side processing setting. + * @type int + * @default 0 + * @private + */ + "_iRecordsTotal": 0, + + /** + * Server-side processing - number of records in the current display set + * (i.e. after filtering). Use fnRecordsDisplay rather than + * this property to get the value of the number of records, regardless of + * the server-side processing setting. + * @type boolean + * @default 0 + * @private + */ + "_iRecordsDisplay": 0, + + /** + * Flag to indicate if jQuery UI marking and classes should be used. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bJUI": null, + + /** + * The classes to use for the table + * @type object + * @default {} + */ + "oClasses": {}, + + /** + * Flag attached to the settings object so you can check in the draw + * callback if filtering has been done in the draw. Deprecated in favour of + * events. + * @type boolean + * @default false + * @deprecated + */ + "bFiltered": false, + + /** + * Flag attached to the settings object so you can check in the draw + * callback if sorting has been done in the draw. Deprecated in favour of + * events. + * @type boolean + * @default false + * @deprecated + */ + "bSorted": false, + + /** + * Indicate that if multiple rows are in the header and there is more than + * one unique cell per column, if the top one (true) or bottom one (false) + * should be used for sorting / title by DataTables. + * Note that this parameter will be set by the initialisation routine. To + * set a default use {@link DataTable.defaults}. + * @type boolean + */ + "bSortCellsTop": null, + + /** + * Initialisation object that is used for the table + * @type object + * @default null + */ + "oInit": null, + + /** + * Destroy callback functions - for plug-ins to attach themselves to the + * destroy so they can clean up markup and events. + * @type array + * @default [] + */ + "aoDestroyCallback": [], + + + /** + * Get the number of records in the current record set, before filtering + * @type function + */ + "fnRecordsTotal": function () + { + return _fnDataSource( this ) == 'ssp' ? + this._iRecordsTotal * 1 : + this.aiDisplayMaster.length; + }, + + /** + * Get the number of records in the current record set, after filtering + * @type function + */ + "fnRecordsDisplay": function () + { + return _fnDataSource( this ) == 'ssp' ? + this._iRecordsDisplay * 1 : + this.aiDisplay.length; + }, + + /** + * Get the display end point - aiDisplay index + * @type function + */ + "fnDisplayEnd": function () + { + var + len = this._iDisplayLength, + start = this._iDisplayStart, + calc = start + len, + records = this.aiDisplay.length, + features = this.oFeatures, + paginate = features.bPaginate; + + if ( features.bServerSide ) { + return paginate === false || len === -1 ? + start + records : + Math.min( start+len, this._iRecordsDisplay ); + } + else { + return ! paginate || calc>records || len===-1 ? + records : + calc; + } + }, + + /** + * The DataTables object for this table + * @type object + * @default null + */ + "oInstance": null, + + /** + * Unique identifier for each instance of the DataTables object. If there + * is an ID on the table node, then it takes that value, otherwise an + * incrementing internal counter is used. + * @type string + * @default null + */ + "sInstance": null, + + /** + * tabindex attribute value that is added to DataTables control elements, allowing + * keyboard navigation of the table and its controls. + */ + "iTabIndex": 0, + + /** + * DIV container for the footer scrolling table if scrolling + */ + "nScrollHead": null, + + /** + * DIV container for the footer scrolling table if scrolling + */ + "nScrollFoot": null, + + /** + * Last applied sort + * @type array + * @default [] + */ + "aLastSort": [], + + /** + * Stored plug-in instances + * @type object + * @default {} + */ + "oPlugins": {} + }; + + /** + * Extension object for DataTables that is used to provide all extension + * options. + * + * Note that the `DataTable.ext` object is available through + * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is + * also aliased to `jQuery.fn.dataTableExt` for historic reasons. + * @namespace + * @extends DataTable.models.ext + */ + + + /** + * DataTables extensions + * + * This namespace acts as a collection area for plug-ins that can be used to + * extend DataTables capabilities. Indeed many of the build in methods + * use this method to provide their own capabilities (sorting methods for + * example). + * + * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy + * reasons + * + * @namespace + */ + DataTable.ext = _ext = { + /** + * Buttons. For use with the Buttons extension for DataTables. This is + * defined here so other extensions can define buttons regardless of load + * order. It is _not_ used by DataTables core. + * + * @type object + * @default {} + */ + buttons: {}, + + + /** + * Element class names + * + * @type object + * @default {} + */ + classes: {}, + + + /** + * Error reporting. + * + * How should DataTables report an error. Can take the value 'alert', + * 'throw', 'none' or a function. + * + * @type string|function + * @default alert + */ + errMode: "alert", + + + /** + * Feature plug-ins. + * + * This is an array of objects which describe the feature plug-ins that are + * available to DataTables. These feature plug-ins are then available for + * use through the `dom` initialisation option. + * + * Each feature plug-in is described by an object which must have the + * following properties: + * + * * `fnInit` - function that is used to initialise the plug-in, + * * `cFeature` - a character so the feature can be enabled by the `dom` + * instillation option. This is case sensitive. + * + * The `fnInit` function has the following input parameters: + * + * 1. `{object}` DataTables settings object: see + * {@link DataTable.models.oSettings} + * + * And the following return is expected: + * + * * {node|null} The element which contains your feature. Note that the + * return may also be void if your plug-in does not require to inject any + * DOM elements into DataTables control (`dom`) - for example this might + * be useful when developing a plug-in which allows table control via + * keyboard entry + * + * @type array + * + * @example + * $.fn.dataTable.ext.features.push( { + * "fnInit": function( oSettings ) { + * return new TableTools( { "oDTSettings": oSettings } ); + * }, + * "cFeature": "T" + * } ); + */ + feature: [], + + + /** + * Row searching. + * + * This method of searching is complimentary to the default type based + * searching, and a lot more comprehensive as it allows you complete control + * over the searching logic. Each element in this array is a function + * (parameters described below) that is called for every row in the table, + * and your logic decides if it should be included in the searching data set + * or not. + * + * Searching functions have the following input parameters: + * + * 1. `{object}` DataTables settings object: see + * {@link DataTable.models.oSettings} + * 2. `{array|object}` Data for the row to be processed (same as the + * original format that was passed in as the data source, or an array + * from a DOM data source + * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which + * can be useful to retrieve the `TR` element if you need DOM interaction. + * + * And the following return is expected: + * + * * {boolean} Include the row in the searched result set (true) or not + * (false) + * + * Note that as with the main search ability in DataTables, technically this + * is "filtering", since it is subtractive. However, for consistency in + * naming we call it searching here. + * + * @type array + * @default [] + * + * @example + * // The following example shows custom search being applied to the + * // fourth column (i.e. the data[3] index) based on two input values + * // from the end-user, matching the data in a certain range. + * $.fn.dataTable.ext.search.push( + * function( settings, data, dataIndex ) { + * var min = document.getElementById('min').value * 1; + * var max = document.getElementById('max').value * 1; + * var version = data[3] == "-" ? 0 : data[3]*1; + * + * if ( min == "" && max == "" ) { + * return true; + * } + * else if ( min == "" && version < max ) { + * return true; + * } + * else if ( min < version && "" == max ) { + * return true; + * } + * else if ( min < version && version < max ) { + * return true; + * } + * return false; + * } + * ); + */ + search: [], + + + /** + * Selector extensions + * + * The `selector` option can be used to extend the options available for the + * selector modifier options (`selector-modifier` object data type) that + * each of the three built in selector types offer (row, column and cell + + * their plural counterparts). For example the Select extension uses this + * mechanism to provide an option to select only rows, columns and cells + * that have been marked as selected by the end user (`{selected: true}`), + * which can be used in conjunction with the existing built in selector + * options. + * + * Each property is an array to which functions can be pushed. The functions + * take three attributes: + * + * * Settings object for the host table + * * Options object (`selector-modifier` object type) + * * Array of selected item indexes + * + * The return is an array of the resulting item indexes after the custom + * selector has been applied. + * + * @type object + */ + selector: { + cell: [], + column: [], + row: [] + }, + + + /** + * Internal functions, exposed for used in plug-ins. + * + * Please note that you should not need to use the internal methods for + * anything other than a plug-in (and even then, try to avoid if possible). + * The internal function may change between releases. + * + * @type object + * @default {} + */ + internal: {}, + + + /** + * Legacy configuration options. Enable and disable legacy options that + * are available in DataTables. + * + * @type object + */ + legacy: { + /** + * Enable / disable DataTables 1.9 compatible server-side processing + * requests + * + * @type boolean + * @default null + */ + ajax: null + }, + + + /** + * Pagination plug-in methods. + * + * Each entry in this object is a function and defines which buttons should + * be shown by the pagination rendering method that is used for the table: + * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the + * buttons are displayed in the document, while the functions here tell it + * what buttons to display. This is done by returning an array of button + * descriptions (what each button will do). + * + * Pagination types (the four built in options and any additional plug-in + * options defined here) can be used through the `paginationType` + * initialisation parameter. + * + * The functions defined take two parameters: + * + * 1. `{int} page` The current page index + * 2. `{int} pages` The number of pages in the table + * + * Each function is expected to return an array where each element of the + * array can be one of: + * + * * `first` - Jump to first page when activated + * * `last` - Jump to last page when activated + * * `previous` - Show previous page when activated + * * `next` - Show next page when activated + * * `{int}` - Show page of the index given + * * `{array}` - A nested array containing the above elements to add a + * containing 'DIV' element (might be useful for styling). + * + * Note that DataTables v1.9- used this object slightly differently whereby + * an object with two functions would be defined for each plug-in. That + * ability is still supported by DataTables 1.10+ to provide backwards + * compatibility, but this option of use is now decremented and no longer + * documented in DataTables 1.10+. + * + * @type object + * @default {} + * + * @example + * // Show previous, next and current page buttons only + * $.fn.dataTableExt.oPagination.current = function ( page, pages ) { + * return [ 'previous', page, 'next' ]; + * }; + */ + pager: {}, + + + renderer: { + pageButton: {}, + header: {} + }, + + + /** + * Ordering plug-ins - custom data source + * + * The extension options for ordering of data available here is complimentary + * to the default type based ordering that DataTables typically uses. It + * allows much greater control over the the data that is being used to + * order a column, but is necessarily therefore more complex. + * + * This type of ordering is useful if you want to do ordering based on data + * live from the DOM (for example the contents of an 'input' element) rather + * than just the static string that DataTables knows of. + * + * The way these plug-ins work is that you create an array of the values you + * wish to be ordering for the column in question and then return that + * array. The data in the array much be in the index order of the rows in + * the table (not the currently ordering order!). Which order data gathering + * function is run here depends on the `dt-init columns.orderDataType` + * parameter that is used for the column (if any). + * + * The functions defined take two parameters: + * + * 1. `{object}` DataTables settings object: see + * {@link DataTable.models.oSettings} + * 2. `{int}` Target column index + * + * Each function is expected to return an array: + * + * * `{array}` Data for the column to be ordering upon + * + * @type array + * + * @example + * // Ordering using `input` node values + * $.fn.dataTable.ext.order['dom-text'] = function ( settings, col ) + * { + * return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) { + * return $('input', td).val(); + * } ); + * } + */ + order: {}, + + + /** + * Type based plug-ins. + * + * Each column in DataTables has a type assigned to it, either by automatic + * detection or by direct assignment using the `type` option for the column. + * The type of a column will effect how it is ordering and search (plug-ins + * can also make use of the column type if required). + * + * @namespace + */ + type: { + /** + * Type detection functions. + * + * The functions defined in this object are used to automatically detect + * a column's type, making initialisation of DataTables super easy, even + * when complex data is in the table. + * + * The functions defined take two parameters: + * + * 1. `{*}` Data from the column cell to be analysed + * 2. `{settings}` DataTables settings object. This can be used to + * perform context specific type detection - for example detection + * based on language settings such as using a comma for a decimal + * place. Generally speaking the options from the settings will not + * be required + * + * Each function is expected to return: + * + * * `{string|null}` Data type detected, or null if unknown (and thus + * pass it on to the other type detection functions. + * + * @type array + * + * @example + * // Currency type detection plug-in: + * $.fn.dataTable.ext.type.detect.push( + * function ( data, settings ) { + * // Check the numeric part + * if ( ! $.isNumeric( data.substring(1) ) ) { + * return null; + * } + * + * // Check prefixed by currency + * if ( data.charAt(0) == '$' || data.charAt(0) == '&pound;' ) { + * return 'currency'; + * } + * return null; + * } + * ); + */ + detect: [], + + + /** + * Type based search formatting. + * + * The type based searching functions can be used to pre-format the + * data to be search on. For example, it can be used to strip HTML + * tags or to de-format telephone numbers for numeric only searching. + * + * Note that is a search is not defined for a column of a given type, + * no search formatting will be performed. + * + * Pre-processing of searching data plug-ins - When you assign the sType + * for a column (or have it automatically detected for you by DataTables + * or a type detection plug-in), you will typically be using this for + * custom sorting, but it can also be used to provide custom searching + * by allowing you to pre-processing the data and returning the data in + * the format that should be searched upon. This is done by adding + * functions this object with a parameter name which matches the sType + * for that target column. This is the corollary of <i>afnSortData</i> + * for searching data. + * + * The functions defined take a single parameter: + * + * 1. `{*}` Data from the column cell to be prepared for searching + * + * Each function is expected to return: + * + * * `{string|null}` Formatted string that will be used for the searching. + * + * @type object + * @default {} + * + * @example + * $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) { + * return d.replace(/\n/g," ").replace( /<.*?>/g, "" ); + * } + */ + search: {}, + + + /** + * Type based ordering. + * + * The column type tells DataTables what ordering to apply to the table + * when a column is sorted upon. The order for each type that is defined, + * is defined by the functions available in this object. + * + * Each ordering option can be described by three properties added to + * this object: + * + * * `{type}-pre` - Pre-formatting function + * * `{type}-asc` - Ascending order function + * * `{type}-desc` - Descending order function + * + * All three can be used together, only `{type}-pre` or only + * `{type}-asc` and `{type}-desc` together. It is generally recommended + * that only `{type}-pre` is used, as this provides the optimal + * implementation in terms of speed, although the others are provided + * for compatibility with existing Javascript sort functions. + * + * `{type}-pre`: Functions defined take a single parameter: + * + * 1. `{*}` Data from the column cell to be prepared for ordering + * + * And return: + * + * * `{*}` Data to be sorted upon + * + * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort + * functions, taking two parameters: + * + * 1. `{*}` Data to compare to the second parameter + * 2. `{*}` Data to compare to the first parameter + * + * And returning: + * + * * `{*}` Ordering match: <0 if first parameter should be sorted lower + * than the second parameter, ===0 if the two parameters are equal and + * >0 if the first parameter should be sorted height than the second + * parameter. + * + * @type object + * @default {} + * + * @example + * // Numeric ordering of formatted numbers with a pre-formatter + * $.extend( $.fn.dataTable.ext.type.order, { + * "string-pre": function(x) { + * a = (a === "-" || a === "") ? 0 : a.replace( /[^\d\-\.]/g, "" ); + * return parseFloat( a ); + * } + * } ); + * + * @example + * // Case-sensitive string ordering, with no pre-formatting method + * $.extend( $.fn.dataTable.ext.order, { + * "string-case-asc": function(x,y) { + * return ((x < y) ? -1 : ((x > y) ? 1 : 0)); + * }, + * "string-case-desc": function(x,y) { + * return ((x < y) ? 1 : ((x > y) ? -1 : 0)); + * } + * } ); + */ + order: {} + }, + + /** + * Unique DataTables instance counter + * + * @type int + * @private + */ + _unique: 0, + + + // + // Depreciated + // The following properties are retained for backwards compatiblity only. + // The should not be used in new projects and will be removed in a future + // version + // + + /** + * Version check function. + * @type function + * @depreciated Since 1.10 + */ + fnVersionCheck: DataTable.fnVersionCheck, + + + /** + * Index for what 'this' index API functions should use + * @type int + * @deprecated Since v1.10 + */ + iApiIndex: 0, + + + /** + * jQuery UI class container + * @type object + * @deprecated Since v1.10 + */ + oJUIClasses: {}, + + + /** + * Software version + * @type string + * @deprecated Since v1.10 + */ + sVersion: DataTable.version + }; + + + // + // Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts + // + $.extend( _ext, { + afnFiltering: _ext.search, + aTypes: _ext.type.detect, + ofnSearch: _ext.type.search, + oSort: _ext.type.order, + afnSortData: _ext.order, + aoFeatures: _ext.feature, + oApi: _ext.internal, + oStdClasses: _ext.classes, + oPagination: _ext.pager + } ); + + + $.extend( DataTable.ext.classes, { + "sTable": "dataTable", + "sNoFooter": "no-footer", + + /* Paging buttons */ + "sPageButton": "paginate_button", + "sPageButtonActive": "current", + "sPageButtonDisabled": "disabled", + + /* Striping classes */ + "sStripeOdd": "odd", + "sStripeEven": "even", + + /* Empty row */ + "sRowEmpty": "dataTables_empty", + + /* Features */ + "sWrapper": "dataTables_wrapper", + "sFilter": "dataTables_filter", + "sInfo": "dataTables_info", + "sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */ + "sLength": "dataTables_length", + "sProcessing": "dataTables_processing", + + /* Sorting */ + "sSortAsc": "sorting_asc", + "sSortDesc": "sorting_desc", + "sSortable": "sorting", /* Sortable in both directions */ + "sSortableAsc": "sorting_asc_disabled", + "sSortableDesc": "sorting_desc_disabled", + "sSortableNone": "sorting_disabled", + "sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */ + + /* Filtering */ + "sFilterInput": "", + + /* Page length */ + "sLengthSelect": "", + + /* Scrolling */ + "sScrollWrapper": "dataTables_scroll", + "sScrollHead": "dataTables_scrollHead", + "sScrollHeadInner": "dataTables_scrollHeadInner", + "sScrollBody": "dataTables_scrollBody", + "sScrollFoot": "dataTables_scrollFoot", + "sScrollFootInner": "dataTables_scrollFootInner", + + /* Misc */ + "sHeaderTH": "", + "sFooterTH": "", + + // Deprecated + "sSortJUIAsc": "", + "sSortJUIDesc": "", + "sSortJUI": "", + "sSortJUIAscAllowed": "", + "sSortJUIDescAllowed": "", + "sSortJUIWrapper": "", + "sSortIcon": "", + "sJUIHeader": "", + "sJUIFooter": "" + } ); + + + (function() { + + // Reused strings for better compression. Closure compiler appears to have a + // weird edge case where it is trying to expand strings rather than use the + // variable version. This results in about 200 bytes being added, for very + // little preference benefit since it this run on script load only. + var _empty = ''; + _empty = ''; + + var _stateDefault = _empty + 'ui-state-default'; + var _sortIcon = _empty + 'css_right ui-icon ui-icon-'; + var _headerFooter = _empty + 'fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix'; + + $.extend( DataTable.ext.oJUIClasses, DataTable.ext.classes, { + /* Full numbers paging buttons */ + "sPageButton": "fg-button ui-button "+_stateDefault, + "sPageButtonActive": "ui-state-disabled", + "sPageButtonDisabled": "ui-state-disabled", + + /* Features */ + "sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi "+ + "ui-buttonset-multi paging_", /* Note that the type is postfixed */ + + /* Sorting */ + "sSortAsc": _stateDefault+" sorting_asc", + "sSortDesc": _stateDefault+" sorting_desc", + "sSortable": _stateDefault+" sorting", + "sSortableAsc": _stateDefault+" sorting_asc_disabled", + "sSortableDesc": _stateDefault+" sorting_desc_disabled", + "sSortableNone": _stateDefault+" sorting_disabled", + "sSortJUIAsc": _sortIcon+"triangle-1-n", + "sSortJUIDesc": _sortIcon+"triangle-1-s", + "sSortJUI": _sortIcon+"carat-2-n-s", + "sSortJUIAscAllowed": _sortIcon+"carat-1-n", + "sSortJUIDescAllowed": _sortIcon+"carat-1-s", + "sSortJUIWrapper": "DataTables_sort_wrapper", + "sSortIcon": "DataTables_sort_icon", + + /* Scrolling */ + "sScrollHead": "dataTables_scrollHead "+_stateDefault, + "sScrollFoot": "dataTables_scrollFoot "+_stateDefault, + + /* Misc */ + "sHeaderTH": _stateDefault, + "sFooterTH": _stateDefault, + "sJUIHeader": _headerFooter+" ui-corner-tl ui-corner-tr", + "sJUIFooter": _headerFooter+" ui-corner-bl ui-corner-br" + } ); + + }()); + + + + var extPagination = DataTable.ext.pager; + + function _numbers ( page, pages ) { + var + numbers = [], + buttons = extPagination.numbers_length, + half = Math.floor( buttons / 2 ), + i = 1; + + if ( pages <= buttons ) { + numbers = _range( 0, pages ); + } + else if ( page <= half ) { + numbers = _range( 0, buttons-2 ); + numbers.push( 'ellipsis' ); + numbers.push( pages-1 ); + } + else if ( page >= pages - 1 - half ) { + numbers = _range( pages-(buttons-2), pages ); + numbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6 + numbers.splice( 0, 0, 0 ); + } + else { + numbers = _range( page-half+2, page+half-1 ); + numbers.push( 'ellipsis' ); + numbers.push( pages-1 ); + numbers.splice( 0, 0, 'ellipsis' ); + numbers.splice( 0, 0, 0 ); + } + + numbers.DT_el = 'span'; + return numbers; + } + + + $.extend( extPagination, { + simple: function ( page, pages ) { + return [ 'previous', 'next' ]; + }, + + full: function ( page, pages ) { + return [ 'first', 'previous', 'next', 'last' ]; + }, + + simple_numbers: function ( page, pages ) { + return [ 'previous', _numbers(page, pages), 'next' ]; + }, + + full_numbers: function ( page, pages ) { + return [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ]; + }, + + // For testing and plug-ins to use + _numbers: _numbers, + + // Number of number buttons (including ellipsis) to show. _Must be odd!_ + numbers_length: 7 + } ); + + + $.extend( true, DataTable.ext.renderer, { + pageButton: { + _: function ( settings, host, idx, buttons, page, pages ) { + var classes = settings.oClasses; + var lang = settings.oLanguage.oPaginate; + var btnDisplay, btnClass, counter=0; + + var attach = function( container, buttons ) { + var i, ien, node, button; + var clickHandler = function ( e ) { + _fnPageChange( settings, e.data.action, true ); + }; + + for ( i=0, ien=buttons.length ; i<ien ; i++ ) { + button = buttons[i]; + + if ( $.isArray( button ) ) { + var inner = $( '<'+(button.DT_el || 'div')+'/>' ) + .appendTo( container ); + attach( inner, button ); + } + else { + btnDisplay = ''; + btnClass = ''; + + switch ( button ) { + case 'ellipsis': + container.append('<span class="ellipsis">&#x2026;</span>'); + break; + + case 'first': + btnDisplay = lang.sFirst; + btnClass = button + (page > 0 ? + '' : ' '+classes.sPageButtonDisabled); + break; + + case 'previous': + btnDisplay = lang.sPrevious; + btnClass = button + (page > 0 ? + '' : ' '+classes.sPageButtonDisabled); + break; + + case 'next': + btnDisplay = lang.sNext; + btnClass = button + (page < pages-1 ? + '' : ' '+classes.sPageButtonDisabled); + break; + + case 'last': + btnDisplay = lang.sLast; + btnClass = button + (page < pages-1 ? + '' : ' '+classes.sPageButtonDisabled); + break; + + default: + btnDisplay = button + 1; + btnClass = page === button ? + classes.sPageButtonActive : ''; + break; + } + + if ( btnDisplay ) { + node = $('<a>', { + 'class': classes.sPageButton+' '+btnClass, + 'aria-controls': settings.sTableId, + 'data-dt-idx': counter, + 'tabindex': settings.iTabIndex, + 'id': idx === 0 && typeof button === 'string' ? + settings.sTableId +'_'+ button : + null + } ) + .html( btnDisplay ) + .appendTo( container ); + + _fnBindAction( + node, {action: button}, clickHandler + ); + + counter++; + } + } + } + }; + + // IE9 throws an 'unknown error' if document.activeElement is used + // inside an iframe or frame. Try / catch the error. Not good for + // accessibility, but neither are frames. + var activeEl; + + try { + // Because this approach is destroying and recreating the paging + // elements, focus is lost on the select button which is bad for + // accessibility. So we want to restore focus once the draw has + // completed + activeEl = $(document.activeElement).data('dt-idx'); + } + catch (e) {} + + attach( $(host).empty(), buttons ); + + if ( activeEl ) { + $(host).find( '[data-dt-idx='+activeEl+']' ).focus(); + } + } + } + } ); + + + + // Built in type detection. See model.ext.aTypes for information about + // what is required from this methods. + $.extend( DataTable.ext.type.detect, [ + // Plain numbers - first since V8 detects some plain numbers as dates + // e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...). + function ( d, settings ) + { + var decimal = settings.oLanguage.sDecimal; + return _isNumber( d, decimal ) ? 'num'+decimal : null; + }, + + // Dates (only those recognised by the browser's Date.parse) + function ( d, settings ) + { + // V8 will remove any unknown characters at the start and end of the + // expression, leading to false matches such as `$245.12` or `10%` being + // a valid date. See forum thread 18941 for detail. + if ( d && !(d instanceof Date) && ( ! _re_date_start.test(d) || ! _re_date_end.test(d) ) ) { + return null; + } + var parsed = Date.parse(d); + return (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null; + }, + + // Formatted numbers + function ( d, settings ) + { + var decimal = settings.oLanguage.sDecimal; + return _isNumber( d, decimal, true ) ? 'num-fmt'+decimal : null; + }, + + // HTML numeric + function ( d, settings ) + { + var decimal = settings.oLanguage.sDecimal; + return _htmlNumeric( d, decimal ) ? 'html-num'+decimal : null; + }, + + // HTML numeric, formatted + function ( d, settings ) + { + var decimal = settings.oLanguage.sDecimal; + return _htmlNumeric( d, decimal, true ) ? 'html-num-fmt'+decimal : null; + }, + + // HTML (this is strict checking - there must be html) + function ( d, settings ) + { + return _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ? + 'html' : null; + } + ] ); + + + + // Filter formatting functions. See model.ext.ofnSearch for information about + // what is required from these methods. + // + // Note that additional search methods are added for the html numbers and + // html formatted numbers by `_addNumericSort()` when we know what the decimal + // place is + + + $.extend( DataTable.ext.type.search, { + html: function ( data ) { + return _empty(data) ? + data : + typeof data === 'string' ? + data + .replace( _re_new_lines, " " ) + .replace( _re_html, "" ) : + ''; + }, + + string: function ( data ) { + return _empty(data) ? + data : + typeof data === 'string' ? + data.replace( _re_new_lines, " " ) : + data; + } + } ); + + + + var __numericReplace = function ( d, decimalPlace, re1, re2 ) { + if ( d !== 0 && (!d || d === '-') ) { + return -Infinity; + } + + // If a decimal place other than `.` is used, it needs to be given to the + // function so we can detect it and replace with a `.` which is the only + // decimal place Javascript recognises - it is not locale aware. + if ( decimalPlace ) { + d = _numToDecimal( d, decimalPlace ); + } + + if ( d.replace ) { + if ( re1 ) { + d = d.replace( re1, '' ); + } + + if ( re2 ) { + d = d.replace( re2, '' ); + } + } + + return d * 1; + }; + + + // Add the numeric 'deformatting' functions for sorting and search. This is done + // in a function to provide an easy ability for the language options to add + // additional methods if a non-period decimal place is used. + function _addNumericSort ( decimalPlace ) { + $.each( + { + // Plain numbers + "num": function ( d ) { + return __numericReplace( d, decimalPlace ); + }, + + // Formatted numbers + "num-fmt": function ( d ) { + return __numericReplace( d, decimalPlace, _re_formatted_numeric ); + }, + + // HTML numeric + "html-num": function ( d ) { + return __numericReplace( d, decimalPlace, _re_html ); + }, + + // HTML numeric, formatted + "html-num-fmt": function ( d ) { + return __numericReplace( d, decimalPlace, _re_html, _re_formatted_numeric ); + } + }, + function ( key, fn ) { + // Add the ordering method + _ext.type.order[ key+decimalPlace+'-pre' ] = fn; + + // For HTML types add a search formatter that will strip the HTML + if ( key.match(/^html\-/) ) { + _ext.type.search[ key+decimalPlace ] = _ext.type.search.html; + } + } + ); + } + + + // Default sort methods + $.extend( _ext.type.order, { + // Dates + "date-pre": function ( d ) { + return Date.parse( d ) || 0; + }, + + // html + "html-pre": function ( a ) { + return _empty(a) ? + '' : + a.replace ? + a.replace( /<.*?>/g, "" ).toLowerCase() : + a+''; + }, + + // string + "string-pre": function ( a ) { + // This is a little complex, but faster than always calling toString, + // http://jsperf.com/tostring-v-check + return _empty(a) ? + '' : + typeof a === 'string' ? + a.toLowerCase() : + ! a.toString ? + '' : + a.toString(); + }, + + // string-asc and -desc are retained only for compatibility with the old + // sort methods + "string-asc": function ( x, y ) { + return ((x < y) ? -1 : ((x > y) ? 1 : 0)); + }, + + "string-desc": function ( x, y ) { + return ((x < y) ? 1 : ((x > y) ? -1 : 0)); + } + } ); + + + // Numeric sorting types - order doesn't matter here + _addNumericSort( '' ); + + + $.extend( true, DataTable.ext.renderer, { + header: { + _: function ( settings, cell, column, classes ) { + // No additional mark-up required + // Attach a sort listener to update on sort - note that using the + // `DT` namespace will allow the event to be removed automatically + // on destroy, while the `dt` namespaced event is the one we are + // listening for + $(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) { + if ( settings !== ctx ) { // need to check this this is the host + return; // table, not a nested one + } + + var colIdx = column.idx; + + cell + .removeClass( + column.sSortingClass +' '+ + classes.sSortAsc +' '+ + classes.sSortDesc + ) + .addClass( columns[ colIdx ] == 'asc' ? + classes.sSortAsc : columns[ colIdx ] == 'desc' ? + classes.sSortDesc : + column.sSortingClass + ); + } ); + }, + + jqueryui: function ( settings, cell, column, classes ) { + $('<div/>') + .addClass( classes.sSortJUIWrapper ) + .append( cell.contents() ) + .append( $('<span/>') + .addClass( classes.sSortIcon+' '+column.sSortingClassJUI ) + ) + .appendTo( cell ); + + // Attach a sort listener to update on sort + $(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) { + if ( settings !== ctx ) { + return; + } + + var colIdx = column.idx; + + cell + .removeClass( classes.sSortAsc +" "+classes.sSortDesc ) + .addClass( columns[ colIdx ] == 'asc' ? + classes.sSortAsc : columns[ colIdx ] == 'desc' ? + classes.sSortDesc : + column.sSortingClass + ); + + cell + .find( 'span.'+classes.sSortIcon ) + .removeClass( + classes.sSortJUIAsc +" "+ + classes.sSortJUIDesc +" "+ + classes.sSortJUI +" "+ + classes.sSortJUIAscAllowed +" "+ + classes.sSortJUIDescAllowed + ) + .addClass( columns[ colIdx ] == 'asc' ? + classes.sSortJUIAsc : columns[ colIdx ] == 'desc' ? + classes.sSortJUIDesc : + column.sSortingClassJUI + ); + } ); + } + } + } ); + + /* + * Public helper functions. These aren't used internally by DataTables, or + * called by any of the options passed into DataTables, but they can be used + * externally by developers working with DataTables. They are helper functions + * to make working with DataTables a little bit easier. + */ + + /** + * Helpers for `columns.render`. + * + * The options defined here can be used with the `columns.render` initialisation + * option to provide a display renderer. The following functions are defined: + * + * * `number` - Will format numeric data (defined by `columns.data`) for + * display, retaining the original unformatted data for sorting and filtering. + * It takes 4 parameters: + * * `string` - Thousands grouping separator + * * `string` - Decimal point indicator + * * `integer` - Number of decimal points to show + * * `string` (optional) - Prefix. + * + * @example + * // Column definition using the number renderer + * { + * data: "salary", + * render: $.fn.dataTable.render.number( '\'', '.', 0, '$' ) + * } + * + * @namespace + */ + DataTable.render = { + number: function ( thousands, decimal, precision, prefix ) { + return { + display: function ( d ) { + if ( typeof d !== 'number' && typeof d !== 'string' ) { + return d; + } + + var negative = d < 0 ? '-' : ''; + d = Math.abs( parseFloat( d ) ); + + var intPart = parseInt( d, 10 ); + var floatPart = precision ? + decimal+(d - intPart).toFixed( precision ).substring( 2 ): + ''; + + return negative + (prefix||'') + + intPart.toString().replace( + /\B(?=(\d{3})+(?!\d))/g, thousands + ) + + floatPart; + } + }; + } + }; + + + /* + * This is really a good bit rubbish this method of exposing the internal methods + * publicly... - To be fixed in 2.0 using methods on the prototype + */ + + + /** + * Create a wrapper function for exporting an internal functions to an external API. + * @param {string} fn API function name + * @returns {function} wrapped function + * @memberof DataTable#internal + */ + function _fnExternApiFunc (fn) + { + return function() { + var args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat( + Array.prototype.slice.call(arguments) + ); + return DataTable.ext.internal[fn].apply( this, args ); + }; + } + + + /** + * Reference to internal functions for use by plug-in developers. Note that + * these methods are references to internal functions and are considered to be + * private. If you use these methods, be aware that they are liable to change + * between versions. + * @namespace + */ + $.extend( DataTable.ext.internal, { + _fnExternApiFunc: _fnExternApiFunc, + _fnBuildAjax: _fnBuildAjax, + _fnAjaxUpdate: _fnAjaxUpdate, + _fnAjaxParameters: _fnAjaxParameters, + _fnAjaxUpdateDraw: _fnAjaxUpdateDraw, + _fnAjaxDataSrc: _fnAjaxDataSrc, + _fnAddColumn: _fnAddColumn, + _fnColumnOptions: _fnColumnOptions, + _fnAdjustColumnSizing: _fnAdjustColumnSizing, + _fnVisibleToColumnIndex: _fnVisibleToColumnIndex, + _fnColumnIndexToVisible: _fnColumnIndexToVisible, + _fnVisbleColumns: _fnVisbleColumns, + _fnGetColumns: _fnGetColumns, + _fnColumnTypes: _fnColumnTypes, + _fnApplyColumnDefs: _fnApplyColumnDefs, + _fnHungarianMap: _fnHungarianMap, + _fnCamelToHungarian: _fnCamelToHungarian, + _fnLanguageCompat: _fnLanguageCompat, + _fnBrowserDetect: _fnBrowserDetect, + _fnAddData: _fnAddData, + _fnAddTr: _fnAddTr, + _fnNodeToDataIndex: _fnNodeToDataIndex, + _fnNodeToColumnIndex: _fnNodeToColumnIndex, + _fnGetCellData: _fnGetCellData, + _fnSetCellData: _fnSetCellData, + _fnSplitObjNotation: _fnSplitObjNotation, + _fnGetObjectDataFn: _fnGetObjectDataFn, + _fnSetObjectDataFn: _fnSetObjectDataFn, + _fnGetDataMaster: _fnGetDataMaster, + _fnClearTable: _fnClearTable, + _fnDeleteIndex: _fnDeleteIndex, + _fnInvalidate: _fnInvalidate, + _fnGetRowElements: _fnGetRowElements, + _fnCreateTr: _fnCreateTr, + _fnBuildHead: _fnBuildHead, + _fnDrawHead: _fnDrawHead, + _fnDraw: _fnDraw, + _fnReDraw: _fnReDraw, + _fnAddOptionsHtml: _fnAddOptionsHtml, + _fnDetectHeader: _fnDetectHeader, + _fnGetUniqueThs: _fnGetUniqueThs, + _fnFeatureHtmlFilter: _fnFeatureHtmlFilter, + _fnFilterComplete: _fnFilterComplete, + _fnFilterCustom: _fnFilterCustom, + _fnFilterColumn: _fnFilterColumn, + _fnFilter: _fnFilter, + _fnFilterCreateSearch: _fnFilterCreateSearch, + _fnEscapeRegex: _fnEscapeRegex, + _fnFilterData: _fnFilterData, + _fnFeatureHtmlInfo: _fnFeatureHtmlInfo, + _fnUpdateInfo: _fnUpdateInfo, + _fnInfoMacros: _fnInfoMacros, + _fnInitialise: _fnInitialise, + _fnInitComplete: _fnInitComplete, + _fnLengthChange: _fnLengthChange, + _fnFeatureHtmlLength: _fnFeatureHtmlLength, + _fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate, + _fnPageChange: _fnPageChange, + _fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing, + _fnProcessingDisplay: _fnProcessingDisplay, + _fnFeatureHtmlTable: _fnFeatureHtmlTable, + _fnScrollDraw: _fnScrollDraw, + _fnApplyToChildren: _fnApplyToChildren, + _fnCalculateColumnWidths: _fnCalculateColumnWidths, + _fnThrottle: _fnThrottle, + _fnConvertToWidth: _fnConvertToWidth, + _fnScrollingWidthAdjust: _fnScrollingWidthAdjust, + _fnGetWidestNode: _fnGetWidestNode, + _fnGetMaxLenString: _fnGetMaxLenString, + _fnStringToCss: _fnStringToCss, + _fnScrollBarWidth: _fnScrollBarWidth, + _fnSortFlatten: _fnSortFlatten, + _fnSort: _fnSort, + _fnSortAria: _fnSortAria, + _fnSortListener: _fnSortListener, + _fnSortAttachListener: _fnSortAttachListener, + _fnSortingClasses: _fnSortingClasses, + _fnSortData: _fnSortData, + _fnSaveState: _fnSaveState, + _fnLoadState: _fnLoadState, + _fnSettingsFromNode: _fnSettingsFromNode, + _fnLog: _fnLog, + _fnMap: _fnMap, + _fnBindAction: _fnBindAction, + _fnCallbackReg: _fnCallbackReg, + _fnCallbackFire: _fnCallbackFire, + _fnLengthOverflow: _fnLengthOverflow, + _fnRenderer: _fnRenderer, + _fnDataSource: _fnDataSource, + _fnRowAttributes: _fnRowAttributes, + _fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant + // in 1.10, so this dead-end function is + // added to prevent errors + } ); + + + // jQuery access + $.fn.dataTable = DataTable; + + // Legacy aliases + $.fn.dataTableSettings = DataTable.settings; + $.fn.dataTableExt = DataTable.ext; + + // With a capital `D` we return a DataTables API instance rather than a + // jQuery object + $.fn.DataTable = function ( opts ) { + return $(this).dataTable( opts ).api(); + }; + + // All properties that are available to $.fn.dataTable should also be + // available on $.fn.DataTable + $.each( DataTable, function ( prop, val ) { + $.fn.DataTable[ prop ] = val; + } ); + + + // Information about events fired by DataTables - for documentation. + /** + * Draw event, fired whenever the table is redrawn on the page, at the same + * point as fnDrawCallback. This may be useful for binding events or + * performing calculations when the table is altered at all. + * @name DataTable#draw.dt + * @event + * @param {event} e jQuery event object + * @param {object} o DataTables settings object {@link DataTable.models.oSettings} + */ + + /** + * Search event, fired when the searching applied to the table (using the + * built-in global search, or column filters) is altered. + * @name DataTable#search.dt + * @event + * @param {event} e jQuery event object + * @param {object} o DataTables settings object {@link DataTable.models.oSettings} + */ + + /** + * Page change event, fired when the paging of the table is altered. + * @name DataTable#page.dt + * @event + * @param {event} e jQuery event object + * @param {object} o DataTables settings object {@link DataTable.models.oSettings} + */ + + /** + * Order event, fired when the ordering applied to the table is altered. + * @name DataTable#order.dt + * @event + * @param {event} e jQuery event object + * @param {object} o DataTables settings object {@link DataTable.models.oSettings} + */ + + /** + * DataTables initialisation complete event, fired when the table is fully + * drawn, including Ajax data loaded, if Ajax data is required. + * @name DataTable#init.dt + * @event + * @param {event} e jQuery event object + * @param {object} oSettings DataTables settings object + * @param {object} json The JSON object request from the server - only + * present if client-side Ajax sourced data is used</li></ol> + */ + + /** + * State save event, fired when the table has changed state a new state save + * is required. This event allows modification of the state saving object + * prior to actually doing the save, including addition or other state + * properties (for plug-ins) or modification of a DataTables core property. + * @name DataTable#stateSaveParams.dt + * @event + * @param {event} e jQuery event object + * @param {object} oSettings DataTables settings object + * @param {object} json The state information to be saved + */ + + /** + * State load event, fired when the table is loading state from the stored + * data, but prior to the settings object being modified by the saved state + * - allowing modification of the saved state is required or loading of + * state for a plug-in. + * @name DataTable#stateLoadParams.dt + * @event + * @param {event} e jQuery event object + * @param {object} oSettings DataTables settings object + * @param {object} json The saved state information + */ + + /** + * State loaded event, fired when state has been loaded from stored data and + * the settings object has been modified by the loaded data. + * @name DataTable#stateLoaded.dt + * @event + * @param {event} e jQuery event object + * @param {object} oSettings DataTables settings object + * @param {object} json The saved state information + */ + + /** + * Processing event, fired when DataTables is doing some kind of processing + * (be it, order, searcg or anything else). It can be used to indicate to + * the end user that there is something happening, or that something has + * finished. + * @name DataTable#processing.dt + * @event + * @param {event} e jQuery event object + * @param {object} oSettings DataTables settings object + * @param {boolean} bShow Flag for if DataTables is doing processing or not + */ + + /** + * Ajax (XHR) event, fired whenever an Ajax request is completed from a + * request to made to the server for new data. This event is called before + * DataTables processed the returned data, so it can also be used to pre- + * process the data returned from the server, if needed. + * + * Note that this trigger is called in `fnServerData`, if you override + * `fnServerData` and which to use this event, you need to trigger it in you + * success function. + * @name DataTable#xhr.dt + * @event + * @param {event} e jQuery event object + * @param {object} o DataTables settings object {@link DataTable.models.oSettings} + * @param {object} json JSON returned from the server + * + * @example + * // Use a custom property returned from the server in another DOM element + * $('#table').dataTable().on('xhr.dt', function (e, settings, json) { + * $('#status').html( json.status ); + * } ); + * + * @example + * // Pre-process the data returned from the server + * $('#table').dataTable().on('xhr.dt', function (e, settings, json) { + * for ( var i=0, ien=json.aaData.length ; i<ien ; i++ ) { + * json.aaData[i].sum = json.aaData[i].one + json.aaData[i].two; + * } + * // Note no return - manipulate the data directly in the JSON object. + * } ); + */ + + /** + * Destroy event, fired when the DataTable is destroyed by calling fnDestroy + * or passing the bDestroy:true parameter in the initialisation object. This + * can be used to remove bound events, added DOM nodes, etc. + * @name DataTable#destroy.dt + * @event + * @param {event} e jQuery event object + * @param {object} o DataTables settings object {@link DataTable.models.oSettings} + */ + + /** + * Page length change event, fired when number of records to show on each + * page (the length) is changed. + * @name DataTable#length.dt + * @event + * @param {event} e jQuery event object + * @param {object} o DataTables settings object {@link DataTable.models.oSettings} + * @param {integer} len New length + */ + + /** + * Column sizing has changed. + * @name DataTable#column-sizing.dt + * @event + * @param {event} e jQuery event object + * @param {object} o DataTables settings object {@link DataTable.models.oSettings} + */ + + /** + * Column visibility has changed. + * @name DataTable#column-visibility.dt + * @event + * @param {event} e jQuery event object + * @param {object} o DataTables settings object {@link DataTable.models.oSettings} + * @param {int} column Column index + * @param {bool} vis `false` if column now hidden, or `true` if visible + */ + + return $.fn.dataTable; +})); + +}(window, document)); + diff --git a/theme/bootstrap/plugins/datatables/jquery.dataTables.min.css b/theme/bootstrap/plugins/datatables/jquery.dataTables.min.css new file mode 100644 index 0000000..2edb32f --- /dev/null +++ b/theme/bootstrap/plugins/datatables/jquery.dataTables.min.css @@ -0,0 +1 @@ +table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc{cursor:pointer;*cursor:hand}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("../images/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("../images/sort_asc.png")}table.dataTable thead .sorting_desc{background-image:url("../images/sort_desc.png")}table.dataTable thead .sorting_asc_disabled{background-image:url("../images/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("../images/sort_desc_disabled.png")}table.dataTable tbody tr{background-color:#fff}table.dataTable tbody tr.selected{background-color:#B0BED9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#abb9d3}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f5f5f5}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#a9b7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#f9f9f9}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad4}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:#f5f5f5}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b3cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a7b5ce}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b6d0}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#f9f9f9}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fbfbfb}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fdfdfd}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad4}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#adbbd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ebebeb}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#eee}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a1aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a2afc8}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a4b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #cacaca;background-color:#fff;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table,.dataTables_wrapper.no-footer div.dataTables_scrollBody table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}} diff --git a/theme/bootstrap/plugins/datatables/jquery.dataTables.min.js b/theme/bootstrap/plugins/datatables/jquery.dataTables.min.js new file mode 100644 index 0000000..85dd817 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/jquery.dataTables.min.js @@ -0,0 +1,160 @@ +/*! DataTables 1.10.7 + * ©2008-2015 SpryMedia Ltd - datatables.net/license + */ +(function(Ea,Q,k){var P=function(h){function W(a){var b,c,e={};h.each(a,function(d){if((b=d.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" "))c=d.replace(b[0],b[2].toLowerCase()),e[c]=d,"o"===b[1]&&W(a[d])});a._hungarianMap=e}function H(a,b,c){a._hungarianMap||W(a);var e;h.each(b,function(d){e=a._hungarianMap[d];if(e!==k&&(c||b[e]===k))"o"===e.charAt(0)?(b[e]||(b[e]={}),h.extend(!0,b[e],b[d]),H(a[e],b[e],c)):b[e]=b[d]})}function P(a){var b=m.defaults.oLanguage,c=a.sZeroRecords; +!a.sEmptyTable&&(c&&"No data available in table"===b.sEmptyTable)&&E(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&(c&&"Loading..."===b.sLoadingRecords)&&E(a,a,"sZeroRecords","sLoadingRecords");a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&db(a)}function eb(a){A(a,"ordering","bSort");A(a,"orderMulti","bSortMulti");A(a,"orderClasses","bSortClasses");A(a,"orderCellsTop","bSortCellsTop");A(a,"order","aaSorting");A(a,"orderFixed","aaSortingFixed");A(a,"paging","bPaginate"); +A(a,"pagingType","sPaginationType");A(a,"pageLength","iDisplayLength");A(a,"searching","bFilter");if(a=a.aoSearchCols)for(var b=0,c=a.length;b<c;b++)a[b]&&H(m.models.oSearch,a[b])}function fb(a){A(a,"orderable","bSortable");A(a,"orderData","aDataSort");A(a,"orderSequence","asSorting");A(a,"orderDataType","sortDataType");var b=a.aDataSort;b&&!h.isArray(b)&&(a.aDataSort=[b])}function gb(a){var a=a.oBrowser,b=h("<div/>").css({position:"absolute",top:0,left:0,height:1,width:1,overflow:"hidden"}).append(h("<div/>").css({position:"absolute", +top:1,left:1,width:100,overflow:"scroll"}).append(h('<div class="test"/>').css({width:"100%",height:10}))).appendTo("body"),c=b.find(".test");a.bScrollOversize=100===c[0].offsetWidth;a.bScrollbarLeft=1!==Math.round(c.offset().left);b.remove()}function hb(a,b,c,e,d,f){var g,j=!1;c!==k&&(g=c,j=!0);for(;e!==d;)a.hasOwnProperty(e)&&(g=j?b(g,a[e],e,a):a[e],j=!0,e+=f);return g}function Fa(a,b){var c=m.defaults.column,e=a.aoColumns.length,c=h.extend({},m.models.oColumn,c,{nTh:b?b:Q.createElement("th"),sTitle:c.sTitle? +c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[e],mData:c.mData?c.mData:e,idx:e});a.aoColumns.push(c);c=a.aoPreSearchCols;c[e]=h.extend({},m.models.oSearch,c[e]);ka(a,e,h(b).data())}function ka(a,b,c){var b=a.aoColumns[b],e=a.oClasses,d=h(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=d.attr("width")||null;var f=(d.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==k&&null!==c&&(fb(c),H(m.defaults.column,c),c.mDataProp!==k&&!c.mData&&(c.mData=c.mDataProp),c.sType&& +(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),h.extend(b,c),E(b,c,"sWidth","sWidthOrig"),c.iDataSort!==k&&(b.aDataSort=[c.iDataSort]),E(b,c,"aDataSort"));var g=b.mData,j=R(g),i=b.mRender?R(b.mRender):null,c=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};b._bAttrSrc=h.isPlainObject(g)&&(c(g.sort)||c(g.type)||c(g.filter));b.fnGetData=function(a,b,c){var e=j(a,b,k,c);return i&&b?i(e,b,a,c):e};b.fnSetData=function(a,b,c){return S(g)(a,b,c)};"number"!==typeof g&& +(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,d.addClass(e.sSortableNone));a=-1!==h.inArray("asc",b.asSorting);c=-1!==h.inArray("desc",b.asSorting);!b.bSortable||!a&&!c?(b.sSortingClass=e.sSortableNone,b.sSortingClassJUI=""):a&&!c?(b.sSortingClass=e.sSortableAsc,b.sSortingClassJUI=e.sSortJUIAscAllowed):!a&&c?(b.sSortingClass=e.sSortableDesc,b.sSortingClassJUI=e.sSortJUIDescAllowed):(b.sSortingClass=e.sSortable,b.sSortingClassJUI=e.sSortJUI)}function X(a){if(!1!==a.oFeatures.bAutoWidth){var b= +a.aoColumns;Ga(a);for(var c=0,e=b.length;c<e;c++)b[c].nTh.style.width=b[c].sWidth}b=a.oScroll;(""!==b.sY||""!==b.sX)&&Y(a);w(a,null,"column-sizing",[a])}function la(a,b){var c=Z(a,"bVisible");return"number"===typeof c[b]?c[b]:null}function $(a,b){var c=Z(a,"bVisible"),c=h.inArray(b,c);return-1!==c?c:null}function aa(a){return Z(a,"bVisible").length}function Z(a,b){var c=[];h.map(a.aoColumns,function(a,d){a[b]&&c.push(d)});return c}function Ha(a){var b=a.aoColumns,c=a.aoData,e=m.ext.type.detect,d, +f,g,j,i,h,l,q,n;d=0;for(f=b.length;d<f;d++)if(l=b[d],n=[],!l.sType&&l._sManualType)l.sType=l._sManualType;else if(!l.sType){g=0;for(j=e.length;g<j;g++){i=0;for(h=c.length;i<h;i++){n[i]===k&&(n[i]=x(a,i,d,"type"));q=e[g](n[i],a);if(!q&&g!==e.length-1)break;if("html"===q)break}if(q){l.sType=q;break}}l.sType||(l.sType="string")}}function ib(a,b,c,e){var d,f,g,j,i,o,l=a.aoColumns;if(b)for(d=b.length-1;0<=d;d--){o=b[d];var q=o.targets!==k?o.targets:o.aTargets;h.isArray(q)||(q=[q]);f=0;for(g=q.length;f< +g;f++)if("number"===typeof q[f]&&0<=q[f]){for(;l.length<=q[f];)Fa(a);e(q[f],o)}else if("number"===typeof q[f]&&0>q[f])e(l.length+q[f],o);else if("string"===typeof q[f]){j=0;for(i=l.length;j<i;j++)("_all"==q[f]||h(l[j].nTh).hasClass(q[f]))&&e(j,o)}}if(c){d=0;for(a=c.length;d<a;d++)e(d,c[d])}}function K(a,b,c,e){var d=a.aoData.length,f=h.extend(!0,{},m.models.oRow,{src:c?"dom":"data"});f._aData=b;a.aoData.push(f);for(var b=a.aoColumns,f=0,g=b.length;f<g;f++)c&&Ia(a,d,f,x(a,d,f)),b[f].sType=null;a.aiDisplayMaster.push(d); +(c||!a.oFeatures.bDeferRender)&&Ja(a,d,c,e);return d}function ma(a,b){var c;b instanceof h||(b=h(b));return b.map(function(b,d){c=na(a,d);return K(a,c.data,d,c.cells)})}function x(a,b,c,e){var d=a.iDraw,f=a.aoColumns[c],g=a.aoData[b]._aData,j=f.sDefaultContent,c=f.fnGetData(g,e,{settings:a,row:b,col:c});if(c===k)return a.iDrawError!=d&&null===j&&(I(a,0,"Requested unknown parameter "+("function"==typeof f.mData?"{function}":"'"+f.mData+"'")+" for row "+b,4),a.iDrawError=d),j;if((c===g||null===c)&& +null!==j)c=j;else if("function"===typeof c)return c.call(g);return null===c&&"display"==e?"":c}function Ia(a,b,c,e){a.aoColumns[c].fnSetData(a.aoData[b]._aData,e,{settings:a,row:b,col:c})}function Ka(a){return h.map(a.match(/(\\.|[^\.])+/g),function(a){return a.replace(/\\./g,".")})}function R(a){if(h.isPlainObject(a)){var b={};h.each(a,function(a,c){c&&(b[a]=R(c))});return function(a,c,f,g){var j=b[c]||b._;return j!==k?j(a,c,f,g):a}}if(null===a)return function(a){return a};if("function"===typeof a)return function(b, +c,f,g){return a(b,c,f,g)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var c=function(a,b,f){var g,j;if(""!==f){j=Ka(f);for(var i=0,h=j.length;i<h;i++){f=j[i].match(ba);g=j[i].match(T);if(f){j[i]=j[i].replace(ba,"");""!==j[i]&&(a=a[j[i]]);g=[];j.splice(0,i+1);j=j.join(".");i=0;for(h=a.length;i<h;i++)g.push(c(a[i],b,j));a=f[0].substring(1,f[0].length-1);a=""===a?g:g.join(a);break}else if(g){j[i]=j[i].replace(T,"");a=a[j[i]]();continue}if(null===a||a[j[i]]=== +k)return k;a=a[j[i]]}}return a};return function(b,d){return c(b,d,a)}}return function(b){return b[a]}}function S(a){if(h.isPlainObject(a))return S(a._);if(null===a)return function(){};if("function"===typeof a)return function(b,e,d){a(b,"set",e,d)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var b=function(a,e,d){var d=Ka(d),f;f=d[d.length-1];for(var g,j,i=0,h=d.length-1;i<h;i++){g=d[i].match(ba);j=d[i].match(T);if(g){d[i]=d[i].replace(ba,"");a[d[i]]=[]; +f=d.slice();f.splice(0,i+1);g=f.join(".");j=0;for(h=e.length;j<h;j++)f={},b(f,e[j],g),a[d[i]].push(f);return}j&&(d[i]=d[i].replace(T,""),a=a[d[i]](e));if(null===a[d[i]]||a[d[i]]===k)a[d[i]]={};a=a[d[i]]}if(f.match(T))a[f.replace(T,"")](e);else a[f.replace(ba,"")]=e};return function(c,e){return b(c,e,a)}}return function(b,e){b[a]=e}}function La(a){return D(a.aoData,"_aData")}function oa(a){a.aoData.length=0;a.aiDisplayMaster.length=0;a.aiDisplay.length=0}function pa(a,b,c){for(var e=-1,d=0,f=a.length;d< +f;d++)a[d]==b?e=d:a[d]>b&&a[d]--; -1!=e&&c===k&&a.splice(e,1)}function ca(a,b,c,e){var d=a.aoData[b],f,g=function(c,f){for(;c.childNodes.length;)c.removeChild(c.firstChild);c.innerHTML=x(a,b,f,"display")};if("dom"===c||(!c||"auto"===c)&&"dom"===d.src)d._aData=na(a,d,e,e===k?k:d._aData).data;else{var j=d.anCells;if(j)if(e!==k)g(j[e],e);else{c=0;for(f=j.length;c<f;c++)g(j[c],c)}}d._aSortData=null;d._aFilterData=null;g=a.aoColumns;if(e!==k)g[e].sType=null;else{c=0;for(f=g.length;c<f;c++)g[c].sType=null; +Ma(d)}}function na(a,b,c,e){var d=[],f=b.firstChild,g,j=0,i,o=a.aoColumns,l=a._rowReadObject,e=e||l?{}:[],q=function(a,b){if("string"===typeof a){var c=a.indexOf("@");-1!==c&&(c=a.substring(c+1),S(a)(e,b.getAttribute(c)))}},a=function(a){if(c===k||c===j)g=o[j],i=h.trim(a.innerHTML),g&&g._bAttrSrc?(S(g.mData._)(e,i),q(g.mData.sort,a),q(g.mData.type,a),q(g.mData.filter,a)):l?(g._setter||(g._setter=S(g.mData)),g._setter(e,i)):e[j]=i;j++};if(f)for(;f;){b=f.nodeName.toUpperCase();if("TD"==b||"TH"==b)a(f), +d.push(f);f=f.nextSibling}else{d=b.anCells;f=0;for(b=d.length;f<b;f++)a(d[f])}return{data:e,cells:d}}function Ja(a,b,c,e){var d=a.aoData[b],f=d._aData,g=[],j,i,h,l,q;if(null===d.nTr){j=c||Q.createElement("tr");d.nTr=j;d.anCells=g;j._DT_RowIndex=b;Ma(d);l=0;for(q=a.aoColumns.length;l<q;l++){h=a.aoColumns[l];i=c?e[l]:Q.createElement(h.sCellType);g.push(i);if(!c||h.mRender||h.mData!==l)i.innerHTML=x(a,b,l,"display");h.sClass&&(i.className+=" "+h.sClass);h.bVisible&&!c?j.appendChild(i):!h.bVisible&&c&& +i.parentNode.removeChild(i);h.fnCreatedCell&&h.fnCreatedCell.call(a.oInstance,i,x(a,b,l),f,b,l)}w(a,"aoRowCreatedCallback",null,[j,f,b])}d.nTr.setAttribute("role","row")}function Ma(a){var b=a.nTr,c=a._aData;if(b){c.DT_RowId&&(b.id=c.DT_RowId);if(c.DT_RowClass){var e=c.DT_RowClass.split(" ");a.__rowc=a.__rowc?Na(a.__rowc.concat(e)):e;h(b).removeClass(a.__rowc.join(" ")).addClass(c.DT_RowClass)}c.DT_RowAttr&&h(b).attr(c.DT_RowAttr);c.DT_RowData&&h(b).data(c.DT_RowData)}}function jb(a){var b,c,e,d, +f,g=a.nTHead,j=a.nTFoot,i=0===h("th, td",g).length,o=a.oClasses,l=a.aoColumns;i&&(d=h("<tr/>").appendTo(g));b=0;for(c=l.length;b<c;b++)f=l[b],e=h(f.nTh).addClass(f.sClass),i&&e.appendTo(d),a.oFeatures.bSort&&(e.addClass(f.sSortingClass),!1!==f.bSortable&&(e.attr("tabindex",a.iTabIndex).attr("aria-controls",a.sTableId),Oa(a,f.nTh,b))),f.sTitle!=e.html()&&e.html(f.sTitle),Pa(a,"header")(a,e,f,o);i&&da(a.aoHeader,g);h(g).find(">tr").attr("role","row");h(g).find(">tr>th, >tr>td").addClass(o.sHeaderTH); +h(j).find(">tr>th, >tr>td").addClass(o.sFooterTH);if(null!==j){a=a.aoFooter[0];b=0;for(c=a.length;b<c;b++)f=l[b],f.nTf=a[b].cell,f.sClass&&h(f.nTf).addClass(f.sClass)}}function ea(a,b,c){var e,d,f,g=[],j=[],i=a.aoColumns.length,o;if(b){c===k&&(c=!1);e=0;for(d=b.length;e<d;e++){g[e]=b[e].slice();g[e].nTr=b[e].nTr;for(f=i-1;0<=f;f--)!a.aoColumns[f].bVisible&&!c&&g[e].splice(f,1);j.push([])}e=0;for(d=g.length;e<d;e++){if(a=g[e].nTr)for(;f=a.firstChild;)a.removeChild(f);f=0;for(b=g[e].length;f<b;f++)if(o= +i=1,j[e][f]===k){a.appendChild(g[e][f].cell);for(j[e][f]=1;g[e+i]!==k&&g[e][f].cell==g[e+i][f].cell;)j[e+i][f]=1,i++;for(;g[e][f+o]!==k&&g[e][f].cell==g[e][f+o].cell;){for(c=0;c<i;c++)j[e+c][f+o]=1;o++}h(g[e][f].cell).attr("rowspan",i).attr("colspan",o)}}}}function M(a){var b=w(a,"aoPreDrawCallback","preDraw",[a]);if(-1!==h.inArray(!1,b))C(a,!1);else{var b=[],c=0,e=a.asStripeClasses,d=e.length,f=a.oLanguage,g=a.iInitDisplayStart,j="ssp"==B(a),i=a.aiDisplay;a.bDrawing=!0;g!==k&&-1!==g&&(a._iDisplayStart= +j?g:g>=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=-1);var g=a._iDisplayStart,o=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,C(a,!1);else if(j){if(!a.bDestroying&&!kb(a))return}else a.iDraw++;if(0!==i.length){f=j?a.aoData.length:o;for(j=j?0:g;j<f;j++){var l=i[j],q=a.aoData[l];null===q.nTr&&Ja(a,l);l=q.nTr;if(0!==d){var n=e[c%d];q._sRowStripe!=n&&(h(l).removeClass(q._sRowStripe).addClass(n),q._sRowStripe=n)}w(a,"aoRowCallback",null,[l,q._aData,c,j]);b.push(l);c++}}else c=f.sZeroRecords, +1==a.iDraw&&"ajax"==B(a)?c=f.sLoadingRecords:f.sEmptyTable&&0===a.fnRecordsTotal()&&(c=f.sEmptyTable),b[0]=h("<tr/>",{"class":d?e[0]:""}).append(h("<td />",{valign:"top",colSpan:aa(a),"class":a.oClasses.sRowEmpty}).html(c))[0];w(a,"aoHeaderCallback","header",[h(a.nTHead).children("tr")[0],La(a),g,o,i]);w(a,"aoFooterCallback","footer",[h(a.nTFoot).children("tr")[0],La(a),g,o,i]);e=h(a.nTBody);e.children().detach();e.append(h(b));w(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing= +!1}}function N(a,b){var c=a.oFeatures,e=c.bFilter;c.bSort&&lb(a);e?fa(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;M(a);a._drawHold=!1}function mb(a){var b=a.oClasses,c=h(a.nTable),c=h("<div/>").insertBefore(c),e=a.oFeatures,d=h("<div/>",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=d[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var f=a.sDom.split(""),g,j,i,o,l,q,n=0;n<f.length;n++){g= +null;j=f[n];if("<"==j){i=h("<div/>")[0];o=f[n+1];if("'"==o||'"'==o){l="";for(q=2;f[n+q]!=o;)l+=f[n+q],q++;"H"==l?l=b.sJUIHeader:"F"==l&&(l=b.sJUIFooter);-1!=l.indexOf(".")?(o=l.split("."),i.id=o[0].substr(1,o[0].length-1),i.className=o[1]):"#"==l.charAt(0)?i.id=l.substr(1,l.length-1):i.className=l;n+=q}d.append(i);d=h(i)}else if(">"==j)d=d.parent();else if("l"==j&&e.bPaginate&&e.bLengthChange)g=nb(a);else if("f"==j&&e.bFilter)g=ob(a);else if("r"==j&&e.bProcessing)g=pb(a);else if("t"==j)g=qb(a);else if("i"== +j&&e.bInfo)g=rb(a);else if("p"==j&&e.bPaginate)g=sb(a);else if(0!==m.ext.feature.length){i=m.ext.feature;q=0;for(o=i.length;q<o;q++)if(j==i[q].cFeature){g=i[q].fnInit(a);break}}g&&(i=a.aanFeatures,i[j]||(i[j]=[]),i[j].push(g),d.append(g))}c.replaceWith(d)}function da(a,b){var c=h(b).children("tr"),e,d,f,g,j,i,o,l,q,n;a.splice(0,a.length);f=0;for(i=c.length;f<i;f++)a.push([]);f=0;for(i=c.length;f<i;f++){e=c[f];for(d=e.firstChild;d;){if("TD"==d.nodeName.toUpperCase()||"TH"==d.nodeName.toUpperCase()){l= +1*d.getAttribute("colspan");q=1*d.getAttribute("rowspan");l=!l||0===l||1===l?1:l;q=!q||0===q||1===q?1:q;g=0;for(j=a[f];j[g];)g++;o=g;n=1===l?!0:!1;for(j=0;j<l;j++)for(g=0;g<q;g++)a[f+g][o+j]={cell:d,unique:n},a[f+g].nTr=e}d=d.nextSibling}}}function qa(a,b,c){var e=[];c||(c=a.aoHeader,b&&(c=[],da(c,b)));for(var b=0,d=c.length;b<d;b++)for(var f=0,g=c[b].length;f<g;f++)if(c[b][f].unique&&(!e[f]||!a.bSortCellsTop))e[f]=c[b][f].cell;return e}function ra(a,b,c){w(a,"aoServerParams","serverParams",[b]); +if(b&&h.isArray(b)){var e={},d=/(.*?)\[\]$/;h.each(b,function(a,b){var c=b.name.match(d);c?(c=c[0],e[c]||(e[c]=[]),e[c].push(b.value)):e[b.name]=b.value});b=e}var f,g=a.ajax,j=a.oInstance,i=function(b){w(a,null,"xhr",[a,b,a.jqXHR]);c(b)};if(h.isPlainObject(g)&&g.data){f=g.data;var o=h.isFunction(f)?f(b,a):f,b=h.isFunction(f)&&o?o:h.extend(!0,b,o);delete g.data}o={data:b,success:function(b){var c=b.error||b.sError;c&&I(a,0,c);a.json=b;i(b)},dataType:"json",cache:!1,type:a.sServerMethod,error:function(b, +c){var f=w(a,null,"xhr",[a,null,a.jqXHR]);-1===h.inArray(!0,f)&&("parsererror"==c?I(a,0,"Invalid JSON response",1):4===b.readyState&&I(a,0,"Ajax error",7));C(a,!1)}};a.oAjaxData=b;w(a,null,"preXhr",[a,b]);a.fnServerData?a.fnServerData.call(j,a.sAjaxSource,h.map(b,function(a,b){return{name:b,value:a}}),i,a):a.sAjaxSource||"string"===typeof g?a.jqXHR=h.ajax(h.extend(o,{url:g||a.sAjaxSource})):h.isFunction(g)?a.jqXHR=g.call(j,b,i,a):(a.jqXHR=h.ajax(h.extend(o,g)),g.data=f)}function kb(a){return a.bAjaxDataGet? +(a.iDraw++,C(a,!0),ra(a,tb(a),function(b){ub(a,b)}),!1):!0}function tb(a){var b=a.aoColumns,c=b.length,e=a.oFeatures,d=a.oPreviousSearch,f=a.aoPreSearchCols,g,j=[],i,o,l,q=U(a);g=a._iDisplayStart;i=!1!==e.bPaginate?a._iDisplayLength:-1;var n=function(a,b){j.push({name:a,value:b})};n("sEcho",a.iDraw);n("iColumns",c);n("sColumns",D(b,"sName").join(","));n("iDisplayStart",g);n("iDisplayLength",i);var k={draw:a.iDraw,columns:[],order:[],start:g,length:i,search:{value:d.sSearch,regex:d.bRegex}};for(g= +0;g<c;g++)o=b[g],l=f[g],i="function"==typeof o.mData?"function":o.mData,k.columns.push({data:i,name:o.sName,searchable:o.bSearchable,orderable:o.bSortable,search:{value:l.sSearch,regex:l.bRegex}}),n("mDataProp_"+g,i),e.bFilter&&(n("sSearch_"+g,l.sSearch),n("bRegex_"+g,l.bRegex),n("bSearchable_"+g,o.bSearchable)),e.bSort&&n("bSortable_"+g,o.bSortable);e.bFilter&&(n("sSearch",d.sSearch),n("bRegex",d.bRegex));e.bSort&&(h.each(q,function(a,b){k.order.push({column:b.col,dir:b.dir});n("iSortCol_"+a,b.col); +n("sSortDir_"+a,b.dir)}),n("iSortingCols",q.length));b=m.ext.legacy.ajax;return null===b?a.sAjaxSource?j:k:b?j:k}function ub(a,b){var c=sa(a,b),e=b.sEcho!==k?b.sEcho:b.draw,d=b.iTotalRecords!==k?b.iTotalRecords:b.recordsTotal,f=b.iTotalDisplayRecords!==k?b.iTotalDisplayRecords:b.recordsFiltered;if(e){if(1*e<a.iDraw)return;a.iDraw=1*e}oa(a);a._iRecordsTotal=parseInt(d,10);a._iRecordsDisplay=parseInt(f,10);e=0;for(d=c.length;e<d;e++)K(a,c[e]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=!1; +M(a);a._bInitComplete||ta(a,b);a.bAjaxDataGet=!0;C(a,!1)}function sa(a,b){var c=h.isPlainObject(a.ajax)&&a.ajax.dataSrc!==k?a.ajax.dataSrc:a.sAjaxDataProp;return"data"===c?b.aaData||b[c]:""!==c?R(c)(b):b}function ob(a){var b=a.oClasses,c=a.sTableId,e=a.oLanguage,d=a.oPreviousSearch,f=a.aanFeatures,g='<input type="search" class="'+b.sFilterInput+'"/>',j=e.sSearch,j=j.match(/_INPUT_/)?j.replace("_INPUT_",g):j+g,b=h("<div/>",{id:!f.f?c+"_filter":null,"class":b.sFilter}).append(h("<label/>").append(j)), +f=function(){var b=!this.value?"":this.value;b!=d.sSearch&&(fa(a,{sSearch:b,bRegex:d.bRegex,bSmart:d.bSmart,bCaseInsensitive:d.bCaseInsensitive}),a._iDisplayStart=0,M(a))},g=null!==a.searchDelay?a.searchDelay:"ssp"===B(a)?400:0,i=h("input",b).val(d.sSearch).attr("placeholder",e.sSearchPlaceholder).bind("keyup.DT search.DT input.DT paste.DT cut.DT",g?ua(f,g):f).bind("keypress.DT",function(a){if(13==a.keyCode)return!1}).attr("aria-controls",c);h(a.nTable).on("search.dt.DT",function(b,c){if(a===c)try{i[0]!== +Q.activeElement&&i.val(d.sSearch)}catch(f){}});return b[0]}function fa(a,b,c){var e=a.oPreviousSearch,d=a.aoPreSearchCols,f=function(a){e.sSearch=a.sSearch;e.bRegex=a.bRegex;e.bSmart=a.bSmart;e.bCaseInsensitive=a.bCaseInsensitive};Ha(a);if("ssp"!=B(a)){vb(a,b.sSearch,c,b.bEscapeRegex!==k?!b.bEscapeRegex:b.bRegex,b.bSmart,b.bCaseInsensitive);f(b);for(b=0;b<d.length;b++)wb(a,d[b].sSearch,b,d[b].bEscapeRegex!==k?!d[b].bEscapeRegex:d[b].bRegex,d[b].bSmart,d[b].bCaseInsensitive);xb(a)}else f(b);a.bFiltered= +!0;w(a,null,"search",[a])}function xb(a){for(var b=m.ext.search,c=a.aiDisplay,e,d,f=0,g=b.length;f<g;f++){for(var j=[],i=0,h=c.length;i<h;i++)d=c[i],e=a.aoData[d],b[f](a,e._aFilterData,d,e._aData,i)&&j.push(d);c.length=0;c.push.apply(c,j)}}function wb(a,b,c,e,d,f){if(""!==b)for(var g=a.aiDisplay,e=Qa(b,e,d,f),d=g.length-1;0<=d;d--)b=a.aoData[g[d]]._aFilterData[c],e.test(b)||g.splice(d,1)}function vb(a,b,c,e,d,f){var e=Qa(b,e,d,f),d=a.oPreviousSearch.sSearch,f=a.aiDisplayMaster,g;0!==m.ext.search.length&& +(c=!0);g=yb(a);if(0>=b.length)a.aiDisplay=f.slice();else{if(g||c||d.length>b.length||0!==b.indexOf(d)||a.bSorted)a.aiDisplay=f.slice();b=a.aiDisplay;for(c=b.length-1;0<=c;c--)e.test(a.aoData[b[c]]._sFilterRow)||b.splice(c,1)}}function Qa(a,b,c,e){a=b?a:va(a);c&&(a="^(?=.*?"+h.map(a.match(/"[^"]+"|[^ ]+/g)||[""],function(a){if('"'===a.charAt(0))var b=a.match(/^"(.*)"$/),a=b?b[1]:a;return a.replace('"',"")}).join(")(?=.*?")+").*$");return RegExp(a,e?"i":"")}function va(a){return a.replace(Yb,"\\$1")} +function yb(a){var b=a.aoColumns,c,e,d,f,g,j,i,h,l=m.ext.type.search;c=!1;e=0;for(f=a.aoData.length;e<f;e++)if(h=a.aoData[e],!h._aFilterData){j=[];d=0;for(g=b.length;d<g;d++)c=b[d],c.bSearchable?(i=x(a,e,d,"filter"),l[c.sType]&&(i=l[c.sType](i)),null===i&&(i=""),"string"!==typeof i&&i.toString&&(i=i.toString())):i="",i.indexOf&&-1!==i.indexOf("&")&&(wa.innerHTML=i,i=Zb?wa.textContent:wa.innerText),i.replace&&(i=i.replace(/[\r\n]/g,"")),j.push(i);h._aFilterData=j;h._sFilterRow=j.join(" ");c=!0}return c} +function zb(a){return{search:a.sSearch,smart:a.bSmart,regex:a.bRegex,caseInsensitive:a.bCaseInsensitive}}function Ab(a){return{sSearch:a.search,bSmart:a.smart,bRegex:a.regex,bCaseInsensitive:a.caseInsensitive}}function rb(a){var b=a.sTableId,c=a.aanFeatures.i,e=h("<div/>",{"class":a.oClasses.sInfo,id:!c?b+"_info":null});c||(a.aoDrawCallback.push({fn:Bb,sName:"information"}),e.attr("role","status").attr("aria-live","polite"),h(a.nTable).attr("aria-describedby",b+"_info"));return e[0]}function Bb(a){var b= +a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage,e=a._iDisplayStart+1,d=a.fnDisplayEnd(),f=a.fnRecordsTotal(),g=a.fnRecordsDisplay(),j=g?c.sInfo:c.sInfoEmpty;g!==f&&(j+=" "+c.sInfoFiltered);j+=c.sInfoPostFix;j=Cb(a,j);c=c.fnInfoCallback;null!==c&&(j=c.call(a.oInstance,a,e,d,f,g,j));h(b).html(j)}}function Cb(a,b){var c=a.fnFormatNumber,e=a._iDisplayStart+1,d=a._iDisplayLength,f=a.fnRecordsDisplay(),g=-1===d;return b.replace(/_START_/g,c.call(a,e)).replace(/_END_/g,c.call(a,a.fnDisplayEnd())).replace(/_MAX_/g, +c.call(a,a.fnRecordsTotal())).replace(/_TOTAL_/g,c.call(a,f)).replace(/_PAGE_/g,c.call(a,g?1:Math.ceil(e/d))).replace(/_PAGES_/g,c.call(a,g?1:Math.ceil(f/d)))}function ga(a){var b,c,e=a.iInitDisplayStart,d=a.aoColumns,f;c=a.oFeatures;if(a.bInitialised){mb(a);jb(a);ea(a,a.aoHeader);ea(a,a.aoFooter);C(a,!0);c.bAutoWidth&&Ga(a);b=0;for(c=d.length;b<c;b++)f=d[b],f.sWidth&&(f.nTh.style.width=s(f.sWidth));N(a);d=B(a);"ssp"!=d&&("ajax"==d?ra(a,[],function(c){var f=sa(a,c);for(b=0;b<f.length;b++)K(a,f[b]); +a.iInitDisplayStart=e;N(a);C(a,!1);ta(a,c)},a):(C(a,!1),ta(a)))}else setTimeout(function(){ga(a)},200)}function ta(a,b){a._bInitComplete=!0;b&&X(a);w(a,"aoInitComplete","init",[a,b])}function Ra(a,b){var c=parseInt(b,10);a._iDisplayLength=c;Sa(a);w(a,null,"length",[a,c])}function nb(a){for(var b=a.oClasses,c=a.sTableId,e=a.aLengthMenu,d=h.isArray(e[0]),f=d?e[0]:e,e=d?e[1]:e,d=h("<select/>",{name:c+"_length","aria-controls":c,"class":b.sLengthSelect}),g=0,j=f.length;g<j;g++)d[0][g]=new Option(e[g], +f[g]);var i=h("<div><label/></div>").addClass(b.sLength);a.aanFeatures.l||(i[0].id=c+"_length");i.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",d[0].outerHTML));h("select",i).val(a._iDisplayLength).bind("change.DT",function(){Ra(a,h(this).val());M(a)});h(a.nTable).bind("length.dt.DT",function(b,c,f){a===c&&h("select",i).val(f)});return i[0]}function sb(a){var b=a.sPaginationType,c=m.ext.pager[b],e="function"===typeof c,d=function(a){M(a)},b=h("<div/>").addClass(a.oClasses.sPaging+b)[0], +f=a.aanFeatures;e||c.fnInit(a,b,d);f.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(a){if(e){var b=a._iDisplayStart,i=a._iDisplayLength,h=a.fnRecordsDisplay(),l=-1===i,b=l?0:Math.ceil(b/i),i=l?1:Math.ceil(h/i),h=c(b,i),q,l=0;for(q=f.p.length;l<q;l++)Pa(a,"pageButton")(a,f.p[l],l,h,b,i)}else c.fnUpdate(a,d)},sName:"pagination"}));return b}function Ta(a,b,c){var e=a._iDisplayStart,d=a._iDisplayLength,f=a.fnRecordsDisplay();0===f||-1===d?e=0:"number"===typeof b?(e=b*d,e>f&&(e=0)): +"first"==b?e=0:"previous"==b?(e=0<=d?e-d:0,0>e&&(e=0)):"next"==b?e+d<f&&(e+=d):"last"==b?e=Math.floor((f-1)/d)*d:I(a,0,"Unknown paging action: "+b,5);b=a._iDisplayStart!==e;a._iDisplayStart=e;b&&(w(a,null,"page",[a]),c&&M(a));return b}function pb(a){return h("<div/>",{id:!a.aanFeatures.r?a.sTableId+"_processing":null,"class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function C(a,b){a.oFeatures.bProcessing&&h(a.aanFeatures.r).css("display",b?"block":"none");w(a, +null,"processing",[a,b])}function qb(a){var b=h(a.nTable);b.attr("role","grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var e=c.sX,d=c.sY,f=a.oClasses,g=b.children("caption"),j=g.length?g[0]._captionSide:null,i=h(b[0].cloneNode(!1)),o=h(b[0].cloneNode(!1)),l=b.children("tfoot");c.sX&&"100%"===b.attr("width")&&b.removeAttr("width");l.length||(l=null);c=h("<div/>",{"class":f.sScrollWrapper}).append(h("<div/>",{"class":f.sScrollHead}).css({overflow:"hidden",position:"relative",border:0, +width:e?!e?null:s(e):"100%"}).append(h("<div/>",{"class":f.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||"100%"}).append(i.removeAttr("id").css("margin-left",0).append("top"===j?g:null).append(b.children("thead"))))).append(h("<div/>",{"class":f.sScrollBody}).css({overflow:"auto",height:!d?null:s(d),width:!e?null:s(e)}).append(b));l&&c.append(h("<div/>",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:e?!e?null:s(e):"100%"}).append(h("<div/>",{"class":f.sScrollFootInner}).append(o.removeAttr("id").css("margin-left", +0).append("bottom"===j?g:null).append(b.children("tfoot")))));var b=c.children(),q=b[0],f=b[1],n=l?b[2]:null;if(e)h(f).on("scroll.DT",function(){var a=this.scrollLeft;q.scrollLeft=a;l&&(n.scrollLeft=a)});a.nScrollHead=q;a.nScrollBody=f;a.nScrollFoot=n;a.aoDrawCallback.push({fn:Y,sName:"scrolling"});return c[0]}function Y(a){var b=a.oScroll,c=b.sX,e=b.sXInner,d=b.sY,f=b.iBarWidth,g=h(a.nScrollHead),j=g[0].style,i=g.children("div"),o=i[0].style,l=i.children("table"),i=a.nScrollBody,q=h(i),n=i.style, +k=h(a.nScrollFoot).children("div"),p=k.children("table"),m=h(a.nTHead),r=h(a.nTable),t=r[0],O=t.style,L=a.nTFoot?h(a.nTFoot):null,ha=a.oBrowser,w=ha.bScrollOversize,v,u,y,x,z,A=[],B=[],C=[],D,E=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};r.children("thead, tfoot").remove();z=m.clone().prependTo(r);v=m.find("tr");y=z.find("tr");z.find("th, td").removeAttr("tabindex");L&&(x=L.clone().prependTo(r),u=L.find("tr"),x=x.find("tr")); +c||(n.width="100%",g[0].style.width="100%");h.each(qa(a,z),function(b,c){D=la(a,b);c.style.width=a.aoColumns[D].sWidth});L&&G(function(a){a.style.width=""},x);b.bCollapse&&""!==d&&(n.height=q[0].offsetHeight+m[0].offsetHeight+"px");g=r.outerWidth();if(""===c){if(O.width="100%",w&&(r.find("tbody").height()>i.offsetHeight||"scroll"==q.css("overflow-y")))O.width=s(r.outerWidth()-f)}else""!==e?O.width=s(e):g==q.width()&&q.height()<r.height()?(O.width=s(g-f),r.outerWidth()>g-f&&(O.width=s(g))):O.width= +s(g);g=r.outerWidth();G(E,y);G(function(a){C.push(a.innerHTML);A.push(s(h(a).css("width")))},y);G(function(a,b){a.style.width=A[b]},v);h(y).height(0);L&&(G(E,x),G(function(a){B.push(s(h(a).css("width")))},x),G(function(a,b){a.style.width=B[b]},u),h(x).height(0));G(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+C[b]+"</div>";a.style.width=A[b]},y);L&&G(function(a,b){a.innerHTML="";a.style.width=B[b]},x);if(r.outerWidth()<g){u=i.scrollHeight>i.offsetHeight|| +"scroll"==q.css("overflow-y")?g+f:g;if(w&&(i.scrollHeight>i.offsetHeight||"scroll"==q.css("overflow-y")))O.width=s(u-f);(""===c||""!==e)&&I(a,1,"Possible column misalignment",6)}else u="100%";n.width=s(u);j.width=s(u);L&&(a.nScrollFoot.style.width=s(u));!d&&w&&(n.height=s(t.offsetHeight+f));d&&b.bCollapse&&(n.height=s(d),b=c&&t.offsetWidth>i.offsetWidth?f:0,t.offsetHeight<i.offsetHeight&&(n.height=s(t.offsetHeight+b)));b=r.outerWidth();l[0].style.width=s(b);o.width=s(b);l=r.height()>i.clientHeight|| +"scroll"==q.css("overflow-y");ha="padding"+(ha.bScrollbarLeft?"Left":"Right");o[ha]=l?f+"px":"0px";L&&(p[0].style.width=s(b),k[0].style.width=s(b),k[0].style[ha]=l?f+"px":"0px");q.scroll();if((a.bSorted||a.bFiltered)&&!a._drawHold)i.scrollTop=0}function G(a,b,c){for(var e=0,d=0,f=b.length,g,j;d<f;){g=b[d].firstChild;for(j=c?c[d].firstChild:null;g;)1===g.nodeType&&(c?a(g,j,e):a(g,e),e++),g=g.nextSibling,j=c?j.nextSibling:null;d++}}function Ga(a){var b=a.nTable,c=a.aoColumns,e=a.oScroll,d=e.sY,f=e.sX, +g=e.sXInner,j=c.length,e=Z(a,"bVisible"),i=h("th",a.nTHead),o=b.getAttribute("width"),l=b.parentNode,k=!1,n,m;(n=b.style.width)&&-1!==n.indexOf("%")&&(o=n);for(n=0;n<e.length;n++)m=c[e[n]],null!==m.sWidth&&(m.sWidth=Db(m.sWidthOrig,l),k=!0);if(!k&&!f&&!d&&j==aa(a)&&j==i.length)for(n=0;n<j;n++)c[n].sWidth=s(i.eq(n).width());else{j=h(b).clone().css("visibility","hidden").removeAttr("id");j.find("tbody tr").remove();var p=h("<tr/>").appendTo(j.find("tbody"));j.find("tfoot th, tfoot td").css("width", +"");i=qa(a,j.find("thead")[0]);for(n=0;n<e.length;n++)m=c[e[n]],i[n].style.width=null!==m.sWidthOrig&&""!==m.sWidthOrig?s(m.sWidthOrig):"";if(a.aoData.length)for(n=0;n<e.length;n++)k=e[n],m=c[k],h(Eb(a,k)).clone(!1).append(m.sContentPadding).appendTo(p);j.appendTo(l);f&&g?j.width(g):f?(j.css("width","auto"),j.width()<l.offsetWidth&&j.width(l.offsetWidth)):d?j.width(l.offsetWidth):o&&j.width(o);Fb(a,j[0]);if(f){for(n=g=0;n<e.length;n++)m=c[e[n]],d=h(i[n]).outerWidth(),g+=null===m.sWidthOrig?d:parseInt(m.sWidth, +10)+d-h(i[n]).width();j.width(s(g));b.style.width=s(g)}for(n=0;n<e.length;n++)if(m=c[e[n]],d=h(i[n]).width())m.sWidth=s(d);b.style.width=s(j.css("width"));j.remove()}o&&(b.style.width=s(o));if((o||f)&&!a._reszEvt)b=function(){h(Ea).bind("resize.DT-"+a.sInstance,ua(function(){X(a)}))},a.oBrowser.bScrollOversize?setTimeout(b,1E3):b(),a._reszEvt=!0}function ua(a,b){var c=b!==k?b:200,e,d;return function(){var b=this,g=+new Date,j=arguments;e&&g<e+c?(clearTimeout(d),d=setTimeout(function(){e=k;a.apply(b, +j)},c)):(e=g,a.apply(b,j))}}function Db(a,b){if(!a)return 0;var c=h("<div/>").css("width",s(a)).appendTo(b||Q.body),e=c[0].offsetWidth;c.remove();return e}function Fb(a,b){var c=a.oScroll;if(c.sX||c.sY)c=!c.sX?c.iBarWidth:0,b.style.width=s(h(b).outerWidth()-c)}function Eb(a,b){var c=Gb(a,b);if(0>c)return null;var e=a.aoData[c];return!e.nTr?h("<td/>").html(x(a,c,b,"display"))[0]:e.anCells[b]}function Gb(a,b){for(var c,e=-1,d=-1,f=0,g=a.aoData.length;f<g;f++)c=x(a,f,b,"display")+"",c=c.replace($b,""), +c.length>e&&(e=c.length,d=f);return d}function s(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function Hb(){var a=m.__scrollbarWidth;if(a===k){var b=h("<p/>").css({position:"absolute",top:0,left:0,width:"100%",height:150,padding:0,overflow:"scroll",visibility:"hidden"}).appendTo("body"),a=b[0].offsetWidth-b[0].clientWidth;m.__scrollbarWidth=a;b.remove()}return a}function U(a){var b,c,e=[],d=a.aoColumns,f,g,j,i;b=a.aaSortingFixed;c=h.isPlainObject(b);var o=[]; +f=function(a){a.length&&!h.isArray(a[0])?o.push(a):o.push.apply(o,a)};h.isArray(b)&&f(b);c&&b.pre&&f(b.pre);f(a.aaSorting);c&&b.post&&f(b.post);for(a=0;a<o.length;a++){i=o[a][0];f=d[i].aDataSort;b=0;for(c=f.length;b<c;b++)g=f[b],j=d[g].sType||"string",o[a]._idx===k&&(o[a]._idx=h.inArray(o[a][1],d[g].asSorting)),e.push({src:i,col:g,dir:o[a][1],index:o[a]._idx,type:j,formatter:m.ext.type.order[j+"-pre"]})}return e}function lb(a){var b,c,e=[],d=m.ext.type.order,f=a.aoData,g=0,j,i=a.aiDisplayMaster,h; +Ha(a);h=U(a);b=0;for(c=h.length;b<c;b++)j=h[b],j.formatter&&g++,Ib(a,j.col);if("ssp"!=B(a)&&0!==h.length){b=0;for(c=i.length;b<c;b++)e[i[b]]=b;g===h.length?i.sort(function(a,b){var c,d,g,j,i=h.length,k=f[a]._aSortData,m=f[b]._aSortData;for(g=0;g<i;g++)if(j=h[g],c=k[j.col],d=m[j.col],c=c<d?-1:c>d?1:0,0!==c)return"asc"===j.dir?c:-c;c=e[a];d=e[b];return c<d?-1:c>d?1:0}):i.sort(function(a,b){var c,g,j,i,k=h.length,m=f[a]._aSortData,r=f[b]._aSortData;for(j=0;j<k;j++)if(i=h[j],c=m[i.col],g=r[i.col],i=d[i.type+ +"-"+i.dir]||d["string-"+i.dir],c=i(c,g),0!==c)return c;c=e[a];g=e[b];return c<g?-1:c>g?1:0})}a.bSorted=!0}function Jb(a){for(var b,c,e=a.aoColumns,d=U(a),a=a.oLanguage.oAria,f=0,g=e.length;f<g;f++){c=e[f];var j=c.asSorting;b=c.sTitle.replace(/<.*?>/g,"");var i=c.nTh;i.removeAttribute("aria-sort");c.bSortable&&(0<d.length&&d[0].col==f?(i.setAttribute("aria-sort","asc"==d[0].dir?"ascending":"descending"),c=j[d[0].index+1]||j[0]):c=j[0],b+="asc"===c?a.sSortAscending:a.sSortDescending);i.setAttribute("aria-label", +b)}}function Ua(a,b,c,e){var d=a.aaSorting,f=a.aoColumns[b].asSorting,g=function(a,b){var c=a._idx;c===k&&(c=h.inArray(a[1],f));return c+1<f.length?c+1:b?null:0};"number"===typeof d[0]&&(d=a.aaSorting=[d]);c&&a.oFeatures.bSortMulti?(c=h.inArray(b,D(d,"0")),-1!==c?(b=g(d[c],!0),null===b&&1===d.length&&(b=0),null===b?d.splice(c,1):(d[c][1]=f[b],d[c]._idx=b)):(d.push([b,f[0],0]),d[d.length-1]._idx=0)):d.length&&d[0][0]==b?(b=g(d[0]),d.length=1,d[0][1]=f[b],d[0]._idx=b):(d.length=0,d.push([b,f[0]]),d[0]._idx= +0);N(a);"function"==typeof e&&e(a)}function Oa(a,b,c,e){var d=a.aoColumns[c];Va(b,{},function(b){!1!==d.bSortable&&(a.oFeatures.bProcessing?(C(a,!0),setTimeout(function(){Ua(a,c,b.shiftKey,e);"ssp"!==B(a)&&C(a,!1)},0)):Ua(a,c,b.shiftKey,e))})}function xa(a){var b=a.aLastSort,c=a.oClasses.sSortColumn,e=U(a),d=a.oFeatures,f,g;if(d.bSort&&d.bSortClasses){d=0;for(f=b.length;d<f;d++)g=b[d].src,h(D(a.aoData,"anCells",g)).removeClass(c+(2>d?d+1:3));d=0;for(f=e.length;d<f;d++)g=e[d].src,h(D(a.aoData,"anCells", +g)).addClass(c+(2>d?d+1:3))}a.aLastSort=e}function Ib(a,b){var c=a.aoColumns[b],e=m.ext.order[c.sSortDataType],d;e&&(d=e.call(a.oInstance,a,b,$(a,b)));for(var f,g=m.ext.type.order[c.sType+"-pre"],j=0,i=a.aoData.length;j<i;j++)if(c=a.aoData[j],c._aSortData||(c._aSortData=[]),!c._aSortData[b]||e)f=e?d[j]:x(a,j,b,"sort"),c._aSortData[b]=g?g(f):f}function ya(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b={time:+new Date,start:a._iDisplayStart,length:a._iDisplayLength,order:h.extend(!0,[],a.aaSorting), +search:zb(a.oPreviousSearch),columns:h.map(a.aoColumns,function(b,e){return{visible:b.bVisible,search:zb(a.aoPreSearchCols[e])}})};w(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=b;a.fnStateSaveCallback.call(a.oInstance,a,b)}}function Kb(a){var b,c,e=a.aoColumns;if(a.oFeatures.bStateSave){var d=a.fnStateLoadCallback.call(a.oInstance,a);if(d&&d.time&&(b=w(a,"aoStateLoadParams","stateLoadParams",[a,d]),-1===h.inArray(!1,b)&&(b=a.iStateDuration,!(0<b&&d.time<+new Date-1E3*b)&&e.length=== +d.columns.length))){a.oLoadedState=h.extend(!0,{},d);d.start!==k&&(a._iDisplayStart=d.start,a.iInitDisplayStart=d.start);d.length!==k&&(a._iDisplayLength=d.length);d.order!==k&&(a.aaSorting=[],h.each(d.order,function(b,c){a.aaSorting.push(c[0]>=e.length?[0,c[1]]:c)}));d.search!==k&&h.extend(a.oPreviousSearch,Ab(d.search));b=0;for(c=d.columns.length;b<c;b++){var f=d.columns[b];f.visible!==k&&(e[b].bVisible=f.visible);f.search!==k&&h.extend(a.aoPreSearchCols[b],Ab(f.search))}w(a,"aoStateLoaded","stateLoaded", +[a,d])}}}function za(a){var b=m.settings,a=h.inArray(a,D(b,"nTable"));return-1!==a?b[a]:null}function I(a,b,c,e){c="DataTables warning: "+(null!==a?"table id="+a.sTableId+" - ":"")+c;e&&(c+=". For more information about this error, please see http://datatables.net/tn/"+e);if(b)Ea.console&&console.log&&console.log(c);else if(b=m.ext,b=b.sErrMode||b.errMode,w(a,null,"error",[a,e,c]),"alert"==b)alert(c);else{if("throw"==b)throw Error(c);"function"==typeof b&&b(a,e,c)}}function E(a,b,c,e){h.isArray(c)? +h.each(c,function(c,f){h.isArray(f)?E(a,b,f[0],f[1]):E(a,b,f)}):(e===k&&(e=c),b[c]!==k&&(a[e]=b[c]))}function Lb(a,b,c){var e,d;for(d in b)b.hasOwnProperty(d)&&(e=b[d],h.isPlainObject(e)?(h.isPlainObject(a[d])||(a[d]={}),h.extend(!0,a[d],e)):a[d]=c&&"data"!==d&&"aaData"!==d&&h.isArray(e)?e.slice():e);return a}function Va(a,b,c){h(a).bind("click.DT",b,function(b){a.blur();c(b)}).bind("keypress.DT",b,function(a){13===a.which&&(a.preventDefault(),c(a))}).bind("selectstart.DT",function(){return!1})}function z(a, +b,c,e){c&&a[b].push({fn:c,sName:e})}function w(a,b,c,e){var d=[];b&&(d=h.map(a[b].slice().reverse(),function(b){return b.fn.apply(a.oInstance,e)}));null!==c&&(b=h.Event(c+".dt"),h(a.nTable).trigger(b,e),d.push(b.result));return d}function Sa(a){var b=a._iDisplayStart,c=a.fnDisplayEnd(),e=a._iDisplayLength;b>=c&&(b=c-e);b-=b%e;if(-1===e||0>b)b=0;a._iDisplayStart=b}function Pa(a,b){var c=a.renderer,e=m.ext.renderer[b];return h.isPlainObject(c)&&c[b]?e[c[b]]||e._:"string"===typeof c?e[c]||e._:e._}function B(a){return a.oFeatures.bServerSide? +"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function Wa(a,b){var c=[],c=Mb.numbers_length,e=Math.floor(c/2);b<=c?c=V(0,b):a<=e?(c=V(0,c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-e?c=V(b-(c-2),b):(c=V(a-e+2,a+e-1),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function db(a){h.each({num:function(b){return Aa(b,a)},"num-fmt":function(b){return Aa(b,a,Xa)},"html-num":function(b){return Aa(b,a,Ba)},"html-num-fmt":function(b){return Aa(b,a,Ba,Xa)}},function(b, +c){u.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(u.type.search[b+a]=u.type.search.html)})}function Nb(a){return function(){var b=[za(this[m.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return m.ext.internal[a].apply(this,b)}}var m,u,t,r,v,Ya={},Ob=/[\r\n]/g,Ba=/<.*?>/g,ac=/^[\w\+\-]/,bc=/[\w\+\-]$/,Yb=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)","g"),Xa=/[',$\u00a3\u20ac\u00a5%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi,J=function(a){return!a||!0===a|| +"-"===a?!0:!1},Pb=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},Qb=function(a,b){Ya[b]||(Ya[b]=RegExp(va(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(Ya[b],"."):a},Za=function(a,b,c){var e="string"===typeof a;if(J(a))return!0;b&&e&&(a=Qb(a,b));c&&e&&(a=a.replace(Xa,""));return!isNaN(parseFloat(a))&&isFinite(a)},Rb=function(a,b,c){return J(a)?!0:!(J(a)||"string"===typeof a)?null:Za(a.replace(Ba,""),b,c)?!0:null},D=function(a,b,c){var e=[],d=0,f=a.length; +if(c!==k)for(;d<f;d++)a[d]&&a[d][b]&&e.push(a[d][b][c]);else for(;d<f;d++)a[d]&&e.push(a[d][b]);return e},ia=function(a,b,c,e){var d=[],f=0,g=b.length;if(e!==k)for(;f<g;f++)a[b[f]][c]&&d.push(a[b[f]][c][e]);else for(;f<g;f++)d.push(a[b[f]][c]);return d},V=function(a,b){var c=[],e;b===k?(b=0,e=a):(e=b,b=a);for(var d=b;d<e;d++)c.push(d);return c},Sb=function(a){for(var b=[],c=0,e=a.length;c<e;c++)a[c]&&b.push(a[c]);return b},Na=function(a){var b=[],c,e,d=a.length,f,g=0;e=0;a:for(;e<d;e++){c=a[e];for(f= +0;f<g;f++)if(b[f]===c)continue a;b.push(c);g++}return b},A=function(a,b,c){a[b]!==k&&(a[c]=a[b])},ba=/\[.*?\]$/,T=/\(\)$/,wa=h("<div>")[0],Zb=wa.textContent!==k,$b=/<.*?>/g;m=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new t(za(this[u.iApiIndex])):new t(this)};this.fnAddData=function(a,b){var c=this.api(!0),e=h.isArray(a)&&(h.isArray(a[0])||h.isPlainObject(a[0]))?c.rows.add(a):c.row.add(a);(b=== +k||b)&&c.draw();return e.flatten().toArray()};this.fnAdjustColumnSizing=function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],e=c.oScroll;a===k||a?b.draw(!1):(""!==e.sX||""!==e.sY)&&Y(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===k||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,b,c){var e=this.api(!0),a=e.rows(a),d=a.settings()[0],h=d.aoData[a[0][0]];a.remove();b&&b.call(this,d,h);(c===k||c)&&e.draw();return h}; +this.fnDestroy=function(a){this.api(!0).destroy(a)};this.fnDraw=function(a){this.api(!0).draw(a)};this.fnFilter=function(a,b,c,e,d,h){d=this.api(!0);null===b||b===k?d.search(a,c,e,h):d.column(b).search(a,c,e,h);d.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==k){var e=a.nodeName?a.nodeName.toLowerCase():"";return b!==k||"td"==e||"th"==e?c.cell(a,b).data():c.row(a).data()||null}return c.data().toArray()};this.fnGetNodes=function(a){var b=this.api(!0);return a!==k?b.row(a).node():b.rows().nodes().flatten().toArray()}; +this.fnGetPosition=function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.cell(a).index(),[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};this.fnPageChange=function(a,b){var c=this.api(!0).page(a);(b===k||b)&&c.draw(!1)};this.fnSetColumnVis=function(a,b,c){a=this.api(!0).column(a).visible(b);(c=== +k||c)&&a.columns.adjust().draw()};this.fnSettings=function(){return za(this[u.iApiIndex])};this.fnSort=function(a){this.api(!0).order(a).draw()};this.fnSortListener=function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,e,d){var h=this.api(!0);c===k||null===c?h.row(b).data(a):h.cell(b,c).data(a);(d===k||d)&&h.columns.adjust();(e===k||e)&&h.draw();return 0};this.fnVersionCheck=u.fnVersionCheck;var b=this,c=a===k,e=this.length;c&&(a={});this.oApi=this.internal=u.internal;for(var d in m.ext.internal)d&& +(this[d]=Nb(d));this.each(function(){var d={},d=1<e?Lb(d,a,!0):a,g=0,j,i=this.getAttribute("id"),o=!1,l=m.defaults,q=h(this);if("table"!=this.nodeName.toLowerCase())I(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{eb(l);fb(l.column);H(l,l,!0);H(l.column,l.column,!0);H(l,h.extend(d,q.data()));var n=m.settings,g=0;for(j=n.length;g<j;g++){var r=n[g];if(r.nTable==this||r.nTHead.parentNode==this||r.nTFoot&&r.nTFoot.parentNode==this){g=d.bRetrieve!==k?d.bRetrieve:l.bRetrieve;if(c||g)return r.oInstance; +if(d.bDestroy!==k?d.bDestroy:l.bDestroy){r.oInstance.fnDestroy();break}else{I(r,0,"Cannot reinitialise DataTable",3);return}}if(r.sTableId==this.id){n.splice(g,1);break}}if(null===i||""===i)this.id=i="DataTables_Table_"+m.ext._unique++;var p=h.extend(!0,{},m.models.oSettings,{sDestroyWidth:q[0].style.width,sInstance:i,sTableId:i});p.nTable=this;p.oApi=b.internal;p.oInit=d;n.push(p);p.oInstance=1===b.length?b:q.dataTable();eb(d);d.oLanguage&&P(d.oLanguage);d.aLengthMenu&&!d.iDisplayLength&&(d.iDisplayLength= +h.isArray(d.aLengthMenu[0])?d.aLengthMenu[0][0]:d.aLengthMenu[0]);d=Lb(h.extend(!0,{},l),d);E(p.oFeatures,d,"bPaginate bLengthChange bFilter bSort bSortMulti bInfo bProcessing bAutoWidth bSortClasses bServerSide bDeferRender".split(" "));E(p,d,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu","sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback", +"renderer","searchDelay",["iCookieDuration","iStateDuration"],["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"],["bJQueryUI","bJUI"]]);E(p.oScroll,d,[["sScrollX","sX"],["sScrollXInner","sXInner"],["sScrollY","sY"],["bScrollCollapse","bCollapse"]]);E(p.oLanguage,d,"fnInfoCallback");z(p,"aoDrawCallback",d.fnDrawCallback,"user");z(p,"aoServerParams",d.fnServerParams,"user");z(p,"aoStateSaveParams",d.fnStateSaveParams,"user");z(p,"aoStateLoadParams", +d.fnStateLoadParams,"user");z(p,"aoStateLoaded",d.fnStateLoaded,"user");z(p,"aoRowCallback",d.fnRowCallback,"user");z(p,"aoRowCreatedCallback",d.fnCreatedRow,"user");z(p,"aoHeaderCallback",d.fnHeaderCallback,"user");z(p,"aoFooterCallback",d.fnFooterCallback,"user");z(p,"aoInitComplete",d.fnInitComplete,"user");z(p,"aoPreDrawCallback",d.fnPreDrawCallback,"user");i=p.oClasses;d.bJQueryUI?(h.extend(i,m.ext.oJUIClasses,d.oClasses),d.sDom===l.sDom&&"lfrtip"===l.sDom&&(p.sDom='<"H"lfr>t<"F"ip>'),p.renderer)? +h.isPlainObject(p.renderer)&&!p.renderer.header&&(p.renderer.header="jqueryui"):p.renderer="jqueryui":h.extend(i,m.ext.classes,d.oClasses);q.addClass(i.sTable);if(""!==p.oScroll.sX||""!==p.oScroll.sY)p.oScroll.iBarWidth=Hb();!0===p.oScroll.sX&&(p.oScroll.sX="100%");p.iInitDisplayStart===k&&(p.iInitDisplayStart=d.iDisplayStart,p._iDisplayStart=d.iDisplayStart);null!==d.iDeferLoading&&(p.bDeferLoading=!0,g=h.isArray(d.iDeferLoading),p._iRecordsDisplay=g?d.iDeferLoading[0]:d.iDeferLoading,p._iRecordsTotal= +g?d.iDeferLoading[1]:d.iDeferLoading);var t=p.oLanguage;h.extend(!0,t,d.oLanguage);""!==t.sUrl&&(h.ajax({dataType:"json",url:t.sUrl,success:function(a){P(a);H(l.oLanguage,a);h.extend(true,t,a);ga(p)},error:function(){ga(p)}}),o=!0);null===d.asStripeClasses&&(p.asStripeClasses=[i.sStripeOdd,i.sStripeEven]);var g=p.asStripeClasses,s=q.children("tbody").find("tr").eq(0);-1!==h.inArray(!0,h.map(g,function(a){return s.hasClass(a)}))&&(h("tbody tr",this).removeClass(g.join(" ")),p.asDestroyStripes=g.slice()); +n=[];g=this.getElementsByTagName("thead");0!==g.length&&(da(p.aoHeader,g[0]),n=qa(p));if(null===d.aoColumns){r=[];g=0;for(j=n.length;g<j;g++)r.push(null)}else r=d.aoColumns;g=0;for(j=r.length;g<j;g++)Fa(p,n?n[g]:null);ib(p,d.aoColumnDefs,r,function(a,b){ka(p,a,b)});if(s.length){var u=function(a,b){return a.getAttribute("data-"+b)!==null?b:null};h.each(na(p,s[0]).cells,function(a,b){var c=p.aoColumns[a];if(c.mData===a){var d=u(b,"sort")||u(b,"order"),e=u(b,"filter")||u(b,"search");if(d!==null||e!== +null){c.mData={_:a+".display",sort:d!==null?a+".@data-"+d:k,type:d!==null?a+".@data-"+d:k,filter:e!==null?a+".@data-"+e:k};ka(p,a)}}})}var v=p.oFeatures;d.bStateSave&&(v.bStateSave=!0,Kb(p,d),z(p,"aoDrawCallback",ya,"state_save"));if(d.aaSorting===k){n=p.aaSorting;g=0;for(j=n.length;g<j;g++)n[g][1]=p.aoColumns[g].asSorting[0]}xa(p);v.bSort&&z(p,"aoDrawCallback",function(){if(p.bSorted){var a=U(p),b={};h.each(a,function(a,c){b[c.src]=c.dir});w(p,null,"order",[p,a,b]);Jb(p)}});z(p,"aoDrawCallback", +function(){(p.bSorted||B(p)==="ssp"||v.bDeferRender)&&xa(p)},"sc");gb(p);g=q.children("caption").each(function(){this._captionSide=q.css("caption-side")});j=q.children("thead");0===j.length&&(j=h("<thead/>").appendTo(this));p.nTHead=j[0];j=q.children("tbody");0===j.length&&(j=h("<tbody/>").appendTo(this));p.nTBody=j[0];j=q.children("tfoot");if(0===j.length&&0<g.length&&(""!==p.oScroll.sX||""!==p.oScroll.sY))j=h("<tfoot/>").appendTo(this);0===j.length||0===j.children().length?q.addClass(i.sNoFooter): +0<j.length&&(p.nTFoot=j[0],da(p.aoFooter,p.nTFoot));if(d.aaData)for(g=0;g<d.aaData.length;g++)K(p,d.aaData[g]);else(p.bDeferLoading||"dom"==B(p))&&ma(p,h(p.nTBody).children("tr"));p.aiDisplay=p.aiDisplayMaster.slice();p.bInitialised=!0;!1===o&&ga(p)}});b=null;return this};var Tb=[],y=Array.prototype,cc=function(a){var b,c,e=m.settings,d=h.map(e,function(a){return a.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase())return b=h.inArray(a,d),-1!==b?[e[b]]: +null;if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===typeof a?c=h(a):a instanceof h&&(c=a)}else return[];if(c)return c.map(function(){b=h.inArray(this,d);return-1!==b?e[b]:null}).toArray()};t=function(a,b){if(!(this instanceof t))return new t(a,b);var c=[],e=function(a){(a=cc(a))&&c.push.apply(c,a)};if(h.isArray(a))for(var d=0,f=a.length;d<f;d++)e(a[d]);else e(a);this.context=Na(c);b&&this.push.apply(this,b.toArray?b.toArray():b);this.selector={rows:null,cols:null,opts:null}; +t.extend(this,this,Tb)};m.Api=t;t.prototype={any:function(){return 0!==this.flatten().length},concat:y.concat,context:[],each:function(a){for(var b=0,c=this.length;b<c;b++)a.call(this,this[b],b,this);return this},eq:function(a){var b=this.context;return b.length>a?new t(b[a],this[a]):null},filter:function(a){var b=[];if(y.filter)b=y.filter.call(this,a,this);else for(var c=0,e=this.length;c<e;c++)a.call(this,this[c],c,this)&&b.push(this[c]);return new t(this.context,b)},flatten:function(){var a=[]; +return new t(this.context,a.concat.apply(a,this.toArray()))},join:y.join,indexOf:y.indexOf||function(a,b){for(var c=b||0,e=this.length;c<e;c++)if(this[c]===a)return c;return-1},iterator:function(a,b,c,e){var d=[],f,g,h,i,o,l=this.context,q,n,m=this.selector;"string"===typeof a&&(e=c,c=b,b=a,a=!1);g=0;for(h=l.length;g<h;g++){var p=new t(l[g]);if("table"===b)f=c.call(p,l[g],g),f!==k&&d.push(f);else if("columns"===b||"rows"===b)f=c.call(p,l[g],this[g],g),f!==k&&d.push(f);else if("column"===b||"column-rows"=== +b||"row"===b||"cell"===b){n=this[g];"column-rows"===b&&(q=Ca(l[g],m.opts));i=0;for(o=n.length;i<o;i++)f=n[i],f="cell"===b?c.call(p,l[g],f.row,f.column,g,i):c.call(p,l[g],f,g,i,q),f!==k&&d.push(f)}}return d.length||e?(a=new t(l,a?d.concat.apply([],d):d),b=a.selector,b.rows=m.rows,b.cols=m.cols,b.opts=m.opts,a):this},lastIndexOf:y.lastIndexOf||function(a,b){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(a){var b=[];if(y.map)b=y.map.call(this,a,this);else for(var c= +0,e=this.length;c<e;c++)b.push(a.call(this,this[c],c));return new t(this.context,b)},pluck:function(a){return this.map(function(b){return b[a]})},pop:y.pop,push:y.push,reduce:y.reduce||function(a,b){return hb(this,a,b,0,this.length,1)},reduceRight:y.reduceRight||function(a,b){return hb(this,a,b,this.length-1,-1,-1)},reverse:y.reverse,selector:null,shift:y.shift,sort:y.sort,splice:y.splice,toArray:function(){return y.slice.call(this)},to$:function(){return h(this)},toJQuery:function(){return h(this)}, +unique:function(){return new t(this.context,Na(this))},unshift:y.unshift};t.extend=function(a,b,c){if(c.length&&b&&(b instanceof t||b.__dt_wrapper)){var e,d,f,g=function(a,b,c){return function(){var d=b.apply(a,arguments);t.extend(d,d,c.methodExt);return d}};e=0;for(d=c.length;e<d;e++)f=c[e],b[f.name]="function"===typeof f.val?g(a,f.val,f):h.isPlainObject(f.val)?{}:f.val,b[f.name].__dt_wrapper=!0,t.extend(a,b[f.name],f.propExt)}};t.register=r=function(a,b){if(h.isArray(a))for(var c=0,e=a.length;c< +e;c++)t.register(a[c],b);else for(var d=a.split("."),f=Tb,g,j,c=0,e=d.length;c<e;c++){g=(j=-1!==d[c].indexOf("()"))?d[c].replace("()",""):d[c];var i;a:{i=0;for(var o=f.length;i<o;i++)if(f[i].name===g){i=f[i];break a}i=null}i||(i={name:g,val:{},methodExt:[],propExt:[]},f.push(i));c===e-1?i.val=b:f=j?i.methodExt:i.propExt}};t.registerPlural=v=function(a,b,c){t.register(a,c);t.register(b,function(){var a=c.apply(this,arguments);return a===this?this:a instanceof t?a.length?h.isArray(a[0])?new t(a.context, +a[0]):a[0]:k:a})};r("tables()",function(a){var b;if(a){b=t;var c=this.context;if("number"===typeof a)a=[c[a]];else var e=h.map(c,function(a){return a.nTable}),a=h(e).filter(a).map(function(){var a=h.inArray(this,e);return c[a]}).toArray();b=new b(a)}else b=this;return b});r("table()",function(a){var a=this.tables(a),b=a.context;return b.length?new t(b[0]):a});v("tables().nodes()","table().node()",function(){return this.iterator("table",function(a){return a.nTable},1)});v("tables().body()","table().body()", +function(){return this.iterator("table",function(a){return a.nTBody},1)});v("tables().header()","table().header()",function(){return this.iterator("table",function(a){return a.nTHead},1)});v("tables().footer()","table().footer()",function(){return this.iterator("table",function(a){return a.nTFoot},1)});v("tables().containers()","table().container()",function(){return this.iterator("table",function(a){return a.nTableWrapper},1)});r("draw()",function(a){return this.iterator("table",function(b){N(b, +!1===a)})});r("page()",function(a){return a===k?this.page.info().page:this.iterator("table",function(b){Ta(b,a)})});r("page.info()",function(){if(0===this.context.length)return k;var a=this.context[0],b=a._iDisplayStart,c=a._iDisplayLength,e=a.fnRecordsDisplay(),d=-1===c;return{page:d?0:Math.floor(b/c),pages:d?1:Math.ceil(e/c),start:b,end:a.fnDisplayEnd(),length:c,recordsTotal:a.fnRecordsTotal(),recordsDisplay:e}});r("page.len()",function(a){return a===k?0!==this.context.length?this.context[0]._iDisplayLength: +k:this.iterator("table",function(b){Ra(b,a)})});var Ub=function(a,b,c){if(c){var e=new t(a);e.one("draw",function(){c(e.ajax.json())})}"ssp"==B(a)?N(a,b):(C(a,!0),ra(a,[],function(c){oa(a);for(var c=sa(a,c),e=0,g=c.length;e<g;e++)K(a,c[e]);N(a,b);C(a,!1)}))};r("ajax.json()",function(){var a=this.context;if(0<a.length)return a[0].json});r("ajax.params()",function(){var a=this.context;if(0<a.length)return a[0].oAjaxData});r("ajax.reload()",function(a,b){return this.iterator("table",function(c){Ub(c, +!1===b,a)})});r("ajax.url()",function(a){var b=this.context;if(a===k){if(0===b.length)return k;b=b[0];return b.ajax?h.isPlainObject(b.ajax)?b.ajax.url:b.ajax:b.sAjaxSource}return this.iterator("table",function(b){h.isPlainObject(b.ajax)?b.ajax.url=a:b.ajax=a})});r("ajax.url().load()",function(a,b){return this.iterator("table",function(c){Ub(c,!1===b,a)})});var $a=function(a,b,c,e,d){var f=[],g,j,i,o,l,q;i=typeof b;if(!b||"string"===i||"function"===i||b.length===k)b=[b];i=0;for(o=b.length;i<o;i++){j= +b[i]&&b[i].split?b[i].split(","):[b[i]];l=0;for(q=j.length;l<q;l++)(g=c("string"===typeof j[l]?h.trim(j[l]):j[l]))&&g.length&&f.push.apply(f,g)}a=u.selector[a];if(a.length){i=0;for(o=a.length;i<o;i++)f=a[i](e,d,f)}return f},ab=function(a){a||(a={});a.filter&&a.search===k&&(a.search=a.filter);return h.extend({search:"none",order:"current",page:"all"},a)},bb=function(a){for(var b=0,c=a.length;b<c;b++)if(0<a[b].length)return a[0]=a[b],a[0].length=1,a.length=1,a.context=[a.context[b]],a;a.length=0;return a}, +Ca=function(a,b){var c,e,d,f=[],g=a.aiDisplay;c=a.aiDisplayMaster;var j=b.search;e=b.order;d=b.page;if("ssp"==B(a))return"removed"===j?[]:V(0,c.length);if("current"==d){c=a._iDisplayStart;for(e=a.fnDisplayEnd();c<e;c++)f.push(g[c])}else if("current"==e||"applied"==e)f="none"==j?c.slice():"applied"==j?g.slice():h.map(c,function(a){return-1===h.inArray(a,g)?a:null});else if("index"==e||"original"==e){c=0;for(e=a.aoData.length;c<e;c++)"none"==j?f.push(c):(d=h.inArray(c,g),(-1===d&&"removed"==j||0<=d&& +"applied"==j)&&f.push(c))}return f};r("rows()",function(a,b){a===k?a="":h.isPlainObject(a)&&(b=a,a="");var b=ab(b),c=this.iterator("table",function(c){var d=b;return $a("row",a,function(a){var b=Pb(a);if(b!==null&&!d)return[b];var j=Ca(c,d);if(b!==null&&h.inArray(b,j)!==-1)return[b];if(!a)return j;if(typeof a==="function")return h.map(j,function(b){var d=c.aoData[b];return a(b,d._aData,d.nTr)?b:null});b=Sb(ia(c.aoData,j,"nTr"));return a.nodeName&&h.inArray(a,b)!==-1?[a._DT_RowIndex]:h(b).filter(a).map(function(){return this._DT_RowIndex}).toArray()}, +c,d)},1);c.selector.rows=a;c.selector.opts=b;return c});r("rows().nodes()",function(){return this.iterator("row",function(a,b){return a.aoData[b].nTr||k},1)});r("rows().data()",function(){return this.iterator(!0,"rows",function(a,b){return ia(a.aoData,b,"_aData")},1)});v("rows().cache()","row().cache()",function(a){return this.iterator("row",function(b,c){var e=b.aoData[c];return"search"===a?e._aFilterData:e._aSortData},1)});v("rows().invalidate()","row().invalidate()",function(a){return this.iterator("row", +function(b,c){ca(b,c,a)})});v("rows().indexes()","row().index()",function(){return this.iterator("row",function(a,b){return b},1)});v("rows().remove()","row().remove()",function(){var a=this;return this.iterator("row",function(b,c,e){var d=b.aoData;d.splice(c,1);for(var f=0,g=d.length;f<g;f++)null!==d[f].nTr&&(d[f].nTr._DT_RowIndex=f);h.inArray(c,b.aiDisplay);pa(b.aiDisplayMaster,c);pa(b.aiDisplay,c);pa(a[e],c,!1);Sa(b)})});r("rows.add()",function(a){var b=this.iterator("table",function(b){var c, +f,g,h=[];f=0;for(g=a.length;f<g;f++)c=a[f],c.nodeName&&"TR"===c.nodeName.toUpperCase()?h.push(ma(b,c)[0]):h.push(K(b,c));return h},1),c=this.rows(-1);c.pop();c.push.apply(c,b.toArray());return c});r("row()",function(a,b){return bb(this.rows(a,b))});r("row().data()",function(a){var b=this.context;if(a===k)return b.length&&this.length?b[0].aoData[this[0]]._aData:k;b[0].aoData[this[0]]._aData=a;ca(b[0],this[0],"data");return this});r("row().node()",function(){var a=this.context;return a.length&&this.length? +a[0].aoData[this[0]].nTr||null:null});r("row.add()",function(a){a instanceof h&&a.length&&(a=a[0]);var b=this.iterator("table",function(b){return a.nodeName&&"TR"===a.nodeName.toUpperCase()?ma(b,a)[0]:K(b,a)});return this.row(b[0])});var cb=function(a,b){var c=a.context;c.length&&(c=c[0].aoData[b!==k?b:a[0]],c._details&&(c._details.remove(),c._detailsShow=k,c._details=k))},Vb=function(a,b){var c=a.context;if(c.length&&a.length){var e=c[0].aoData[a[0]];if(e._details){(e._detailsShow=b)?e._details.insertAfter(e.nTr): +e._details.detach();var d=c[0],f=new t(d),g=d.aoData;f.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");0<D(g,"_details").length&&(f.on("draw.dt.DT_details",function(a,b){d===b&&f.rows({page:"current"}).eq(0).each(function(a){a=g[a];a._detailsShow&&a._details.insertAfter(a.nTr)})}),f.on("column-visibility.dt.DT_details",function(a,b){if(d===b)for(var c,e=aa(b),f=0,h=g.length;f<h;f++)c=g[f],c._details&&c._details.children("td[colspan]").attr("colspan",e)}),f.on("destroy.dt.DT_details", +function(a,b){if(d===b)for(var c=0,e=g.length;c<e;c++)g[c]._details&&cb(f,c)}))}}};r("row().child()",function(a,b){var c=this.context;if(a===k)return c.length&&this.length?c[0].aoData[this[0]]._details:k;if(!0===a)this.child.show();else if(!1===a)cb(this);else if(c.length&&this.length){var e=c[0],c=c[0].aoData[this[0]],d=[],f=function(a,b){if(h.isArray(a)||a instanceof h)for(var c=0,k=a.length;c<k;c++)f(a[c],b);else a.nodeName&&"tr"===a.nodeName.toLowerCase()?d.push(a):(c=h("<tr><td/></tr>").addClass(b), +h("td",c).addClass(b).html(a)[0].colSpan=aa(e),d.push(c[0]))};f(a,b);c._details&&c._details.remove();c._details=h(d);c._detailsShow&&c._details.insertAfter(c.nTr)}return this});r(["row().child.show()","row().child().show()"],function(){Vb(this,!0);return this});r(["row().child.hide()","row().child().hide()"],function(){Vb(this,!1);return this});r(["row().child.remove()","row().child().remove()"],function(){cb(this);return this});r("row().child.isShown()",function(){var a=this.context;return a.length&& +this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var dc=/^(.+):(name|visIdx|visible)$/,Wb=function(a,b,c,e,d){for(var c=[],e=0,f=d.length;e<f;e++)c.push(x(a,d[e],b));return c};r("columns()",function(a,b){a===k?a="":h.isPlainObject(a)&&(b=a,a="");var b=ab(b),c=this.iterator("table",function(c){var d=a,f=b,g=c.aoColumns,j=D(g,"sName"),i=D(g,"nTh");return $a("column",d,function(a){var b=Pb(a);if(a==="")return V(g.length);if(b!==null)return[b>=0?b:g.length+b];if(typeof a==="function"){var d=Ca(c, +f);return h.map(g,function(b,f){return a(f,Wb(c,f,0,0,d),i[f])?f:null})}var k=typeof a==="string"?a.match(dc):"";if(k)switch(k[2]){case "visIdx":case "visible":b=parseInt(k[1],10);if(b<0){var m=h.map(g,function(a,b){return a.bVisible?b:null});return[m[m.length+b]]}return[la(c,b)];case "name":return h.map(j,function(a,b){return a===k[1]?b:null})}else return h(i).filter(a).map(function(){return h.inArray(this,i)}).toArray()},c,f)},1);c.selector.cols=a;c.selector.opts=b;return c});v("columns().header()", +"column().header()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTh},1)});v("columns().footer()","column().footer()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf},1)});v("columns().data()","column().data()",function(){return this.iterator("column-rows",Wb,1)});v("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});v("columns().cache()","column().cache()", +function(a){return this.iterator("column-rows",function(b,c,e,d,f){return ia(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});v("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,e,d){return ia(a.aoData,d,"anCells",b)},1)});v("columns().visible()","column().visible()",function(a,b){return this.iterator("column",function(c,e){if(a===k)return c.aoColumns[e].bVisible;var d=c.aoColumns,f=d[e],g=c.aoData,j,i,m;if(a!==k&&f.bVisible!==a){if(a){var l= +h.inArray(!0,D(d,"bVisible"),e+1);j=0;for(i=g.length;j<i;j++)m=g[j].nTr,d=g[j].anCells,m&&m.insertBefore(d[e],d[l]||null)}else h(D(c.aoData,"anCells",e)).detach();f.bVisible=a;ea(c,c.aoHeader);ea(c,c.aoFooter);if(b===k||b)X(c),(c.oScroll.sX||c.oScroll.sY)&&Y(c);w(c,null,"column-visibility",[c,e,a]);ya(c)}})});v("columns().indexes()","column().index()",function(a){return this.iterator("column",function(b,c){return"visible"===a?$(b,c):c},1)});r("columns.adjust()",function(){return this.iterator("table", +function(a){X(a)},1)});r("column.index()",function(a,b){if(0!==this.context.length){var c=this.context[0];if("fromVisible"===a||"toData"===a)return la(c,b);if("fromData"===a||"toVisible"===a)return $(c,b)}});r("column()",function(a,b){return bb(this.columns(a,b))});r("cells()",function(a,b,c){h.isPlainObject(a)&&(a.row===k?(c=a,a=null):(c=b,b=null));h.isPlainObject(b)&&(c=b,b=null);if(null===b||b===k)return this.iterator("table",function(b){var d=a,e=ab(c),f=b.aoData,g=Ca(b,e),i=Sb(ia(f,g,"anCells")), +j=h([].concat.apply([],i)),l,m=b.aoColumns.length,o,r,t,s,u,v;return $a("cell",d,function(a){var c=typeof a==="function";if(a===null||a===k||c){o=[];r=0;for(t=g.length;r<t;r++){l=g[r];for(s=0;s<m;s++){u={row:l,column:s};if(c){v=b.aoData[l];a(u,x(b,l,s),v.anCells?v.anCells[s]:null)&&o.push(u)}else o.push(u)}}return o}return h.isPlainObject(a)?[a]:j.filter(a).map(function(a,b){l=b.parentNode._DT_RowIndex;return{row:l,column:h.inArray(b,f[l].anCells)}}).toArray()},b,e)});var e=this.columns(b,c),d=this.rows(a, +c),f,g,j,i,m,l=this.iterator("table",function(a,b){f=[];g=0;for(j=d[b].length;g<j;g++){i=0;for(m=e[b].length;i<m;i++)f.push({row:d[b][g],column:e[b][i]})}return f},1);h.extend(l.selector,{cols:b,rows:a,opts:c});return l});v("cells().nodes()","cell().node()",function(){return this.iterator("cell",function(a,b,c){return(a=a.aoData[b].anCells)?a[c]:k},1)});r("cells().data()",function(){return this.iterator("cell",function(a,b,c){return x(a,b,c)},1)});v("cells().cache()","cell().cache()",function(a){a= +"search"===a?"_aFilterData":"_aSortData";return this.iterator("cell",function(b,c,e){return b.aoData[c][a][e]},1)});v("cells().render()","cell().render()",function(a){return this.iterator("cell",function(b,c,e){return x(b,c,e,a)},1)});v("cells().indexes()","cell().index()",function(){return this.iterator("cell",function(a,b,c){return{row:b,column:c,columnVisible:$(a,c)}},1)});v("cells().invalidate()","cell().invalidate()",function(a){return this.iterator("cell",function(b,c,e){ca(b,c,a,e)})});r("cell()", +function(a,b,c){return bb(this.cells(a,b,c))});r("cell().data()",function(a){var b=this.context,c=this[0];if(a===k)return b.length&&c.length?x(b[0],c[0].row,c[0].column):k;Ia(b[0],c[0].row,c[0].column,a);ca(b[0],c[0].row,"data",c[0].column);return this});r("order()",function(a,b){var c=this.context;if(a===k)return 0!==c.length?c[0].aaSorting:k;"number"===typeof a?a=[[a,b]]:h.isArray(a[0])||(a=Array.prototype.slice.call(arguments));return this.iterator("table",function(b){b.aaSorting=a.slice()})}); +r("order.listener()",function(a,b,c){return this.iterator("table",function(e){Oa(e,a,b,c)})});r(["columns().order()","column().order()"],function(a){var b=this;return this.iterator("table",function(c,e){var d=[];h.each(b[e],function(b,c){d.push([c,a])});c.aaSorting=d})});r("search()",function(a,b,c,e){var d=this.context;return a===k?0!==d.length?d[0].oPreviousSearch.sSearch:k:this.iterator("table",function(d){d.oFeatures.bFilter&&fa(d,h.extend({},d.oPreviousSearch,{sSearch:a+"",bRegex:null===b?!1: +b,bSmart:null===c?!0:c,bCaseInsensitive:null===e?!0:e}),1)})});v("columns().search()","column().search()",function(a,b,c,e){return this.iterator("column",function(d,f){var g=d.aoPreSearchCols;if(a===k)return g[f].sSearch;d.oFeatures.bFilter&&(h.extend(g[f],{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===e?!0:e}),fa(d,d.oPreviousSearch,1))})});r("state()",function(){return this.context.length?this.context[0].oSavedState:null});r("state.clear()",function(){return this.iterator("table", +function(a){a.fnStateSaveCallback.call(a.oInstance,a,{})})});r("state.loaded()",function(){return this.context.length?this.context[0].oLoadedState:null});r("state.save()",function(){return this.iterator("table",function(a){ya(a)})});m.versionCheck=m.fnVersionCheck=function(a){for(var b=m.version.split("."),a=a.split("."),c,e,d=0,f=a.length;d<f;d++)if(c=parseInt(b[d],10)||0,e=parseInt(a[d],10)||0,c!==e)return c>e;return!0};m.isDataTable=m.fnIsDataTable=function(a){var b=h(a).get(0),c=!1;h.each(m.settings, +function(a,d){var f=d.nScrollHead?h("table",d.nScrollHead)[0]:null,g=d.nScrollFoot?h("table",d.nScrollFoot)[0]:null;if(d.nTable===b||f===b||g===b)c=!0});return c};m.tables=m.fnTables=function(a){return h.map(m.settings,function(b){if(!a||a&&h(b.nTable).is(":visible"))return b.nTable})};m.util={throttle:ua,escapeRegex:va};m.camelToHungarian=H;r("$()",function(a,b){var c=this.rows(b).nodes(),c=h(c);return h([].concat(c.filter(a).toArray(),c.find(a).toArray()))});h.each(["on","one","off"],function(a, +b){r(b+"()",function(){var a=Array.prototype.slice.call(arguments);a[0].match(/\.dt\b/)||(a[0]+=".dt");var e=h(this.tables().nodes());e[b].apply(e,a);return this})});r("clear()",function(){return this.iterator("table",function(a){oa(a)})});r("settings()",function(){return new t(this.context,this.context)});r("init()",function(){var a=this.context;return a.length?a[0].oInit:null});r("data()",function(){return this.iterator("table",function(a){return D(a.aoData,"_aData")}).flatten()});r("destroy()", +function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,e=b.oClasses,d=b.nTable,f=b.nTBody,g=b.nTHead,j=b.nTFoot,i=h(d),f=h(f),k=h(b.nTableWrapper),l=h.map(b.aoData,function(a){return a.nTr}),q;b.bDestroying=!0;w(b,"aoDestroyCallback","destroy",[b]);a||(new t(b)).columns().visible(!0);k.unbind(".DT").find(":not(tbody *)").unbind(".DT");h(Ea).unbind(".DT-"+b.sInstance);d!=g.parentNode&&(i.children("thead").detach(),i.append(g));j&&d!=j.parentNode&&(i.children("tfoot").detach(), +i.append(j));i.detach();k.detach();b.aaSorting=[];b.aaSortingFixed=[];xa(b);h(l).removeClass(b.asStripeClasses.join(" "));h("th, td",g).removeClass(e.sSortable+" "+e.sSortableAsc+" "+e.sSortableDesc+" "+e.sSortableNone);b.bJUI&&(h("th span."+e.sSortIcon+", td span."+e.sSortIcon,g).detach(),h("th, td",g).each(function(){var a=h("div."+e.sSortJUIWrapper,this);h(this).append(a.contents());a.detach()}));!a&&c&&c.insertBefore(d,b.nTableReinsertBefore);f.children().detach();f.append(l);i.css("width",b.sDestroyWidth).removeClass(e.sTable); +(q=b.asDestroyStripes.length)&&f.children().each(function(a){h(this).addClass(b.asDestroyStripes[a%q])});c=h.inArray(b,m.settings);-1!==c&&m.settings.splice(c,1)})});h.each(["column","row","cell"],function(a,b){r(b+"s().every()",function(a){return this.iterator(b,function(e,d,f){a.call((new t(e))[b](d,f))})})});r("i18n()",function(a,b,c){var e=this.context[0],a=R(a)(e.oLanguage);a===k&&(a=b);c!==k&&h.isPlainObject(a)&&(a=a[c]!==k?a[c]:a._);return a.replace("%d",c)});m.version="1.10.7";m.settings= +[];m.models={};m.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};m.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null};m.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std", +sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};m.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bJQueryUI:!1,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1, +fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){}},fnStateLoadParams:null, +fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"}, +sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:h.extend({},m.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null, +sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null};W(m.defaults);m.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};W(m.defaults.column);m.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null, +bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[], +sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null, +bAjaxDataGet:!0,jqXHR:null,json:k,oAjaxData:k,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,bJUI:null,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==B(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==B(this)?1*this._iRecordsDisplay: +this.aiDisplay.length},fnDisplayEnd:function(){var a=this._iDisplayLength,b=this._iDisplayStart,c=b+a,e=this.aiDisplay.length,d=this.oFeatures,f=d.bPaginate;return d.bServerSide?!1===f||-1===a?b+e:Math.min(b+a,this._iRecordsDisplay):!f||c>e||-1===a?e:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{}};m.ext=u={buttons:{},classes:{},errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{}, +header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:m.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:m.version};h.extend(u,{afnFiltering:u.search,aTypes:u.type.detect,ofnSearch:u.type.search,oSort:u.type.order,afnSortData:u.order,aoFeatures:u.feature,oApi:u.internal,oStdClasses:u.classes,oPagination:u.pager});h.extend(m.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd", +sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead", +sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var Da="",Da="",F=Da+"ui-state-default",ja=Da+"css_right ui-icon ui-icon-",Xb=Da+"fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix";h.extend(m.ext.oJUIClasses, +m.ext.classes,{sPageButton:"fg-button ui-button "+F,sPageButtonActive:"ui-state-disabled",sPageButtonDisabled:"ui-state-disabled",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",sSortAsc:F+" sorting_asc",sSortDesc:F+" sorting_desc",sSortable:F+" sorting",sSortableAsc:F+" sorting_asc_disabled",sSortableDesc:F+" sorting_desc_disabled",sSortableNone:F+" sorting_disabled",sSortJUIAsc:ja+"triangle-1-n",sSortJUIDesc:ja+"triangle-1-s",sSortJUI:ja+"carat-2-n-s", +sSortJUIAscAllowed:ja+"carat-1-n",sSortJUIDescAllowed:ja+"carat-1-s",sSortJUIWrapper:"DataTables_sort_wrapper",sSortIcon:"DataTables_sort_icon",sScrollHead:"dataTables_scrollHead "+F,sScrollFoot:"dataTables_scrollFoot "+F,sHeaderTH:F,sFooterTH:F,sJUIHeader:Xb+" ui-corner-tl ui-corner-tr",sJUIFooter:Xb+" ui-corner-bl ui-corner-br"});var Mb=m.ext.pager;h.extend(Mb,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},simple_numbers:function(a,b){return["previous", +Wa(a,b),"next"]},full_numbers:function(a,b){return["first","previous",Wa(a,b),"next","last"]},_numbers:Wa,numbers_length:7});h.extend(!0,m.ext.renderer,{pageButton:{_:function(a,b,c,e,d,f){var g=a.oClasses,j=a.oLanguage.oPaginate,i,k,l=0,m=function(b,e){var n,r,t,s,u=function(b){Ta(a,b.data.action,true)};n=0;for(r=e.length;n<r;n++){s=e[n];if(h.isArray(s)){t=h("<"+(s.DT_el||"div")+"/>").appendTo(b);m(t,s)}else{k=i="";switch(s){case "ellipsis":b.append('<span class="ellipsis">&#x2026;</span>');break; +case "first":i=j.sFirst;k=s+(d>0?"":" "+g.sPageButtonDisabled);break;case "previous":i=j.sPrevious;k=s+(d>0?"":" "+g.sPageButtonDisabled);break;case "next":i=j.sNext;k=s+(d<f-1?"":" "+g.sPageButtonDisabled);break;case "last":i=j.sLast;k=s+(d<f-1?"":" "+g.sPageButtonDisabled);break;default:i=s+1;k=d===s?g.sPageButtonActive:""}if(i){t=h("<a>",{"class":g.sPageButton+" "+k,"aria-controls":a.sTableId,"data-dt-idx":l,tabindex:a.iTabIndex,id:c===0&&typeof s==="string"?a.sTableId+"_"+s:null}).html(i).appendTo(b); +Va(t,{action:s},u);l++}}}},n;try{n=h(Q.activeElement).data("dt-idx")}catch(r){}m(h(b).empty(),e);n&&h(b).find("[data-dt-idx="+n+"]").focus()}}});h.extend(m.ext.type.detect,[function(a,b){var c=b.oLanguage.sDecimal;return Za(a,c)?"num"+c:null},function(a){if(a&&!(a instanceof Date)&&(!ac.test(a)||!bc.test(a)))return null;var b=Date.parse(a);return null!==b&&!isNaN(b)||J(a)?"date":null},function(a,b){var c=b.oLanguage.sDecimal;return Za(a,c,!0)?"num-fmt"+c:null},function(a,b){var c=b.oLanguage.sDecimal; +return Rb(a,c)?"html-num"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Rb(a,c,!0)?"html-num-fmt"+c:null},function(a){return J(a)||"string"===typeof a&&-1!==a.indexOf("<")?"html":null}]);h.extend(m.ext.type.search,{html:function(a){return J(a)?a:"string"===typeof a?a.replace(Ob," ").replace(Ba,""):""},string:function(a){return J(a)?a:"string"===typeof a?a.replace(Ob," "):a}});var Aa=function(a,b,c,e){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Qb(a,b));a.replace&&(c&&(a=a.replace(c,"")), +e&&(a=a.replace(e,"")));return 1*a};h.extend(u.type.order,{"date-pre":function(a){return Date.parse(a)||0},"html-pre":function(a){return J(a)?"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return J(a)?"":"string"===typeof a?a.toLowerCase():!a.toString?"":a.toString()},"string-asc":function(a,b){return a<b?-1:a>b?1:0},"string-desc":function(a,b){return a<b?1:a>b?-1:0}});db("");h.extend(!0,m.ext.renderer,{header:{_:function(a,b,c,e){h(a.nTable).on("order.dt.DT",function(d, +f,g,h){if(a===f){d=c.idx;b.removeClass(c.sSortingClass+" "+e.sSortAsc+" "+e.sSortDesc).addClass(h[d]=="asc"?e.sSortAsc:h[d]=="desc"?e.sSortDesc:c.sSortingClass)}})},jqueryui:function(a,b,c,e){h("<div/>").addClass(e.sSortJUIWrapper).append(b.contents()).append(h("<span/>").addClass(e.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);h(a.nTable).on("order.dt.DT",function(d,f,g,h){if(a===f){d=c.idx;b.removeClass(e.sSortAsc+" "+e.sSortDesc).addClass(h[d]=="asc"?e.sSortAsc:h[d]=="desc"?e.sSortDesc:c.sSortingClass); +b.find("span."+e.sSortIcon).removeClass(e.sSortJUIAsc+" "+e.sSortJUIDesc+" "+e.sSortJUI+" "+e.sSortJUIAscAllowed+" "+e.sSortJUIDescAllowed).addClass(h[d]=="asc"?e.sSortJUIAsc:h[d]=="desc"?e.sSortJUIDesc:c.sSortingClassJUI)}})}}});m.render={number:function(a,b,c,e){return{display:function(d){if("number"!==typeof d&&"string"!==typeof d)return d;var f=0>d?"-":"",d=Math.abs(parseFloat(d)),g=parseInt(d,10),d=c?b+(d-g).toFixed(c).substring(2):"";return f+(e||"")+g.toString().replace(/\B(?=(\d{3})+(?!\d))/g, +a)+d}}}};h.extend(m.ext.internal,{_fnExternApiFunc:Nb,_fnBuildAjax:ra,_fnAjaxUpdate:kb,_fnAjaxParameters:tb,_fnAjaxUpdateDraw:ub,_fnAjaxDataSrc:sa,_fnAddColumn:Fa,_fnColumnOptions:ka,_fnAdjustColumnSizing:X,_fnVisibleToColumnIndex:la,_fnColumnIndexToVisible:$,_fnVisbleColumns:aa,_fnGetColumns:Z,_fnColumnTypes:Ha,_fnApplyColumnDefs:ib,_fnHungarianMap:W,_fnCamelToHungarian:H,_fnLanguageCompat:P,_fnBrowserDetect:gb,_fnAddData:K,_fnAddTr:ma,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==k?b._DT_RowIndex: +null},_fnNodeToColumnIndex:function(a,b,c){return h.inArray(c,a.aoData[b].anCells)},_fnGetCellData:x,_fnSetCellData:Ia,_fnSplitObjNotation:Ka,_fnGetObjectDataFn:R,_fnSetObjectDataFn:S,_fnGetDataMaster:La,_fnClearTable:oa,_fnDeleteIndex:pa,_fnInvalidate:ca,_fnGetRowElements:na,_fnCreateTr:Ja,_fnBuildHead:jb,_fnDrawHead:ea,_fnDraw:M,_fnReDraw:N,_fnAddOptionsHtml:mb,_fnDetectHeader:da,_fnGetUniqueThs:qa,_fnFeatureHtmlFilter:ob,_fnFilterComplete:fa,_fnFilterCustom:xb,_fnFilterColumn:wb,_fnFilter:vb,_fnFilterCreateSearch:Qa, +_fnEscapeRegex:va,_fnFilterData:yb,_fnFeatureHtmlInfo:rb,_fnUpdateInfo:Bb,_fnInfoMacros:Cb,_fnInitialise:ga,_fnInitComplete:ta,_fnLengthChange:Ra,_fnFeatureHtmlLength:nb,_fnFeatureHtmlPaginate:sb,_fnPageChange:Ta,_fnFeatureHtmlProcessing:pb,_fnProcessingDisplay:C,_fnFeatureHtmlTable:qb,_fnScrollDraw:Y,_fnApplyToChildren:G,_fnCalculateColumnWidths:Ga,_fnThrottle:ua,_fnConvertToWidth:Db,_fnScrollingWidthAdjust:Fb,_fnGetWidestNode:Eb,_fnGetMaxLenString:Gb,_fnStringToCss:s,_fnScrollBarWidth:Hb,_fnSortFlatten:U, +_fnSort:lb,_fnSortAria:Jb,_fnSortListener:Ua,_fnSortAttachListener:Oa,_fnSortingClasses:xa,_fnSortData:Ib,_fnSaveState:ya,_fnLoadState:Kb,_fnSettingsFromNode:za,_fnLog:I,_fnMap:E,_fnBindAction:Va,_fnCallbackReg:z,_fnCallbackFire:w,_fnLengthOverflow:Sa,_fnRenderer:Pa,_fnDataSource:B,_fnRowAttributes:Ma,_fnCalculateEnd:function(){}});h.fn.dataTable=m;h.fn.dataTableSettings=m.settings;h.fn.dataTableExt=m.ext;h.fn.DataTable=function(a){return h(this).dataTable(a).api()};h.each(m,function(a,b){h.fn.DataTable[a]= +b});return h.fn.dataTable};"function"===typeof define&&define.amd?define("datatables",["jquery"],P):"object"===typeof exports?module.exports=P(require("jquery")):jQuery&&!jQuery.fn.dataTable&&P(jQuery)})(window,document); diff --git a/theme/bootstrap/plugins/datatables/jquery.dataTables_themeroller.css b/theme/bootstrap/plugins/datatables/jquery.dataTables_themeroller.css new file mode 100644 index 0000000..1426a44 --- /dev/null +++ b/theme/bootstrap/plugins/datatables/jquery.dataTables_themeroller.css @@ -0,0 +1,416 @@ +/* + * Table styles + */ +table.dataTable { + width: 100%; + margin: 0 auto; + clear: both; + border-collapse: separate; + border-spacing: 0; + /* + * Header and footer styles + */ + /* + * Body styles + */ +} +table.dataTable thead th, +table.dataTable thead td, +table.dataTable tfoot th, +table.dataTable tfoot td { + padding: 4px 10px; +} +table.dataTable thead th, +table.dataTable tfoot th { + font-weight: bold; +} +table.dataTable thead th:active, +table.dataTable thead td:active { + outline: none; +} +table.dataTable thead .sorting_asc, +table.dataTable thead .sorting_desc, +table.dataTable thead .sorting { + cursor: pointer; + *cursor: hand; +} +table.dataTable thead th div.DataTables_sort_wrapper { + position: relative; + padding-right: 10px; +} +table.dataTable thead th div.DataTables_sort_wrapper span { + position: absolute; + top: 50%; + margin-top: -8px; + right: -5px; +} +table.dataTable thead th.ui-state-default { + border-right-width: 0; +} +table.dataTable thead th.ui-state-default:last-child { + border-right-width: 1px; +} +table.dataTable tbody tr { + background-color: #ffffff; +} +table.dataTable tbody tr.selected { + background-color: #B0BED9; +} +table.dataTable tbody th, +table.dataTable tbody td { + padding: 8px 10px; +} +table.dataTable th.center, +table.dataTable td.center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.right, +table.dataTable td.right { + text-align: right; +} +table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td { + border-top: 1px solid #ddd; +} +table.dataTable.row-border tbody tr:first-child th, +table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th, +table.dataTable.display tbody tr:first-child td { + border-top: none; +} +table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td { + border-top: 1px solid #ddd; + border-right: 1px solid #ddd; +} +table.dataTable.cell-border tbody tr th:first-child, +table.dataTable.cell-border tbody tr td:first-child { + border-left: 1px solid #ddd; +} +table.dataTable.cell-border tbody tr:first-child th, +table.dataTable.cell-border tbody tr:first-child td { + border-top: none; +} +table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd { + background-color: #f9f9f9; +} +table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected { + background-color: #abb9d3; +} +table.dataTable.hover tbody tr:hover, +table.dataTable.hover tbody tr.odd:hover, +table.dataTable.hover tbody tr.even:hover, table.dataTable.display tbody tr:hover, +table.dataTable.display tbody tr.odd:hover, +table.dataTable.display tbody tr.even:hover { + background-color: whitesmoke; +} +table.dataTable.hover tbody tr:hover.selected, +table.dataTable.hover tbody tr.odd:hover.selected, +table.dataTable.hover tbody tr.even:hover.selected, table.dataTable.display tbody tr:hover.selected, +table.dataTable.display tbody tr.odd:hover.selected, +table.dataTable.display tbody tr.even:hover.selected { + background-color: #a9b7d1; +} +table.dataTable.order-column tbody tr > .sorting_1, +table.dataTable.order-column tbody tr > .sorting_2, +table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1, +table.dataTable.display tbody tr > .sorting_2, +table.dataTable.display tbody tr > .sorting_3 { + background-color: #f9f9f9; +} +table.dataTable.order-column tbody tr.selected > .sorting_1, +table.dataTable.order-column tbody tr.selected > .sorting_2, +table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1, +table.dataTable.display tbody tr.selected > .sorting_2, +table.dataTable.display tbody tr.selected > .sorting_3 { + background-color: #acbad4; +} +table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 { + background-color: #f1f1f1; +} +table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 { + background-color: #f3f3f3; +} +table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 { + background-color: whitesmoke; +} +table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 { + background-color: #a6b3cd; +} +table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 { + background-color: #a7b5ce; +} +table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 { + background-color: #a9b6d0; +} +table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 { + background-color: #f9f9f9; +} +table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 { + background-color: #fbfbfb; +} +table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 { + background-color: #fdfdfd; +} +table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 { + background-color: #acbad4; +} +table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 { + background-color: #adbbd6; +} +table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 { + background-color: #afbdd8; +} +table.dataTable.display tbody tr:hover > .sorting_1, +table.dataTable.display tbody tr.odd:hover > .sorting_1, +table.dataTable.display tbody tr.even:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1, +table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_1, +table.dataTable.order-column.hover tbody tr.even:hover > .sorting_1 { + background-color: #eaeaea; +} +table.dataTable.display tbody tr:hover > .sorting_2, +table.dataTable.display tbody tr.odd:hover > .sorting_2, +table.dataTable.display tbody tr.even:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2, +table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_2, +table.dataTable.order-column.hover tbody tr.even:hover > .sorting_2 { + background-color: #ebebeb; +} +table.dataTable.display tbody tr:hover > .sorting_3, +table.dataTable.display tbody tr.odd:hover > .sorting_3, +table.dataTable.display tbody tr.even:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3, +table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_3, +table.dataTable.order-column.hover tbody tr.even:hover > .sorting_3 { + background-color: #eeeeee; +} +table.dataTable.display tbody tr:hover.selected > .sorting_1, +table.dataTable.display tbody tr.odd:hover.selected > .sorting_1, +table.dataTable.display tbody tr.even:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1, +table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_1, +table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_1 { + background-color: #a1aec7; +} +table.dataTable.display tbody tr:hover.selected > .sorting_2, +table.dataTable.display tbody tr.odd:hover.selected > .sorting_2, +table.dataTable.display tbody tr.even:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2, +table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_2, +table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_2 { + background-color: #a2afc8; +} +table.dataTable.display tbody tr:hover.selected > .sorting_3, +table.dataTable.display tbody tr.odd:hover.selected > .sorting_3, +table.dataTable.display tbody tr.even:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3, +table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_3, +table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_3 { + background-color: #a4b2cb; +} +table.dataTable.nowrap th, table.dataTable.nowrap td { + white-space: nowrap; +} +table.dataTable.compact thead th, +table.dataTable.compact thead td { + padding: 5px 9px; +} +table.dataTable.compact tfoot th, +table.dataTable.compact tfoot td { + padding: 5px 9px 3px 9px; +} +table.dataTable.compact tbody th, +table.dataTable.compact tbody td { + padding: 4px 5px; +} +table.dataTable th.dt-left, +table.dataTable td.dt-left { + text-align: left; +} +table.dataTable th.dt-center, +table.dataTable td.dt-center, +table.dataTable td.dataTables_empty { + text-align: center; +} +table.dataTable th.dt-right, +table.dataTable td.dt-right { + text-align: right; +} +table.dataTable th.dt-justify, +table.dataTable td.dt-justify { + text-align: justify; +} +table.dataTable th.dt-nowrap, +table.dataTable td.dt-nowrap { + white-space: nowrap; +} +table.dataTable thead th.dt-head-left, +table.dataTable thead td.dt-head-left, +table.dataTable tfoot th.dt-head-left, +table.dataTable tfoot td.dt-head-left { + text-align: left; +} +table.dataTable thead th.dt-head-center, +table.dataTable thead td.dt-head-center, +table.dataTable tfoot th.dt-head-center, +table.dataTable tfoot td.dt-head-center { + text-align: center; +} +table.dataTable thead th.dt-head-right, +table.dataTable thead td.dt-head-right, +table.dataTable tfoot th.dt-head-right, +table.dataTable tfoot td.dt-head-right { + text-align: right; +} +table.dataTable thead th.dt-head-justify, +table.dataTable thead td.dt-head-justify, +table.dataTable tfoot th.dt-head-justify, +table.dataTable tfoot td.dt-head-justify { + text-align: justify; +} +table.dataTable thead th.dt-head-nowrap, +table.dataTable thead td.dt-head-nowrap, +table.dataTable tfoot th.dt-head-nowrap, +table.dataTable tfoot td.dt-head-nowrap { + white-space: nowrap; +} +table.dataTable tbody th.dt-body-left, +table.dataTable tbody td.dt-body-left { + text-align: left; +} +table.dataTable tbody th.dt-body-center, +table.dataTable tbody td.dt-body-center { + text-align: center; +} +table.dataTable tbody th.dt-body-right, +table.dataTable tbody td.dt-body-right { + text-align: right; +} +table.dataTable tbody th.dt-body-justify, +table.dataTable tbody td.dt-body-justify { + text-align: justify; +} +table.dataTable tbody th.dt-body-nowrap, +table.dataTable tbody td.dt-body-nowrap { + white-space: nowrap; +} + +table.dataTable, +table.dataTable th, +table.dataTable td { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +/* + * Control feature layout + */ +.dataTables_wrapper { + position: relative; + clear: both; + *zoom: 1; + zoom: 1; +} +.dataTables_wrapper .dataTables_length { + float: left; +} +.dataTables_wrapper .dataTables_filter { + float: right; + text-align: right; +} +.dataTables_wrapper .dataTables_filter input { + margin-left: 0.5em; +} +.dataTables_wrapper .dataTables_info { + clear: both; + float: left; + padding-top: 0.55em; +} +.dataTables_wrapper .dataTables_paginate { + float: right; + text-align: right; +} +.dataTables_wrapper .dataTables_paginate .fg-button { + box-sizing: border-box; + display: inline-block; + min-width: 1.5em; + padding: 0.5em; + margin-left: 2px; + text-align: center; + text-decoration: none !important; + cursor: pointer; + *cursor: hand; + color: #333 !important; + border: 1px solid transparent; +} +.dataTables_wrapper .dataTables_paginate .fg-button:active { + outline: none; +} +.dataTables_wrapper .dataTables_paginate .fg-button:first-child { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.dataTables_wrapper .dataTables_paginate .fg-button:last-child { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.dataTables_wrapper .dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 100%; + height: 40px; + margin-left: -50%; + margin-top: -25px; + padding-top: 20px; + text-align: center; + font-size: 1.2em; + background-color: white; + background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0))); + /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* Chrome10+,Safari5.1+ */ + background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* FF3.6+ */ + background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* IE10+ */ + background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* Opera 11.10+ */ + background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); + /* W3C */ +} +.dataTables_wrapper .dataTables_length, +.dataTables_wrapper .dataTables_filter, +.dataTables_wrapper .dataTables_info, +.dataTables_wrapper .dataTables_processing, +.dataTables_wrapper .dataTables_paginate { + color: #333; +} +.dataTables_wrapper .dataTables_scroll { + clear: both; +} +.dataTables_wrapper .dataTables_scrollBody { + *margin-top: -1px; + -webkit-overflow-scrolling: touch; +} +.dataTables_wrapper .ui-widget-header { + font-weight: normal; +} +.dataTables_wrapper .ui-toolbar { + padding: 8px; +} +.dataTables_wrapper:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; +} + +@media screen and (max-width: 767px) { + .dataTables_wrapper .dataTables_length, + .dataTables_wrapper .dataTables_filter, + .dataTables_wrapper .dataTables_info, + .dataTables_wrapper .dataTables_paginate { + float: none; + text-align: center; + } + .dataTables_wrapper .dataTables_filter, + .dataTables_wrapper .dataTables_paginate { + margin-top: 0.5em; + } +} diff --git a/theme/bootstrap/plugins/datepicker/bootstrap-datepicker.js b/theme/bootstrap/plugins/datepicker/bootstrap-datepicker.js new file mode 100644 index 0000000..e53af25 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/bootstrap-datepicker.js @@ -0,0 +1,1671 @@ +/* ========================================================= + * bootstrap-datepicker.js + * Repo: https://github.com/eternicode/bootstrap-datepicker/ + * Demo: http://eternicode.github.io/bootstrap-datepicker/ + * Docs: http://bootstrap-datepicker.readthedocs.org/ + * Forked from http://www.eyecon.ro/bootstrap-datepicker + * ========================================================= + * Started by Stefan Petre; improvements by Andrew Rowls + contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================= */ + +(function($, undefined){ + + var $window = $(window); + + function UTCDate(){ + return new Date(Date.UTC.apply(Date, arguments)); + } + function UTCToday(){ + var today = new Date(); + return UTCDate(today.getFullYear(), today.getMonth(), today.getDate()); + } + function alias(method){ + return function(){ + return this[method].apply(this, arguments); + }; + } + + var DateArray = (function(){ + var extras = { + get: function(i){ + return this.slice(i)[0]; + }, + contains: function(d){ + // Array.indexOf is not cross-browser; + // $.inArray doesn't work with Dates + var val = d && d.valueOf(); + for (var i=0, l=this.length; i < l; i++) + if (this[i].valueOf() === val) + return i; + return -1; + }, + remove: function(i){ + this.splice(i,1); + }, + replace: function(new_array){ + if (!new_array) + return; + if (!$.isArray(new_array)) + new_array = [new_array]; + this.clear(); + this.push.apply(this, new_array); + }, + clear: function(){ + this.splice(0); + }, + copy: function(){ + var a = new DateArray(); + a.replace(this); + return a; + } + }; + + return function(){ + var a = []; + a.push.apply(a, arguments); + $.extend(a, extras); + return a; + }; + })(); + + + // Picker object + + var Datepicker = function(element, options){ + this.dates = new DateArray(); + this.viewDate = UTCToday(); + this.focusDate = null; + + this._process_options(options); + + this.element = $(element); + this.isInline = false; + this.isInput = this.element.is('input'); + this.component = this.element.is('.date') ? this.element.find('.add-on, .input-group-addon, .btn') : false; + this.hasInput = this.component && this.element.find('input').length; + if (this.component && this.component.length === 0) + this.component = false; + + this.picker = $(DPGlobal.template); + this._buildEvents(); + this._attachEvents(); + + if (this.isInline){ + this.picker.addClass('datepicker-inline').appendTo(this.element); + } + else { + this.picker.addClass('datepicker-dropdown dropdown-menu'); + } + + if (this.o.rtl){ + this.picker.addClass('datepicker-rtl'); + } + + this.viewMode = this.o.startView; + + if (this.o.calendarWeeks) + this.picker.find('tfoot th.today') + .attr('colspan', function(i, val){ + return parseInt(val) + 1; + }); + + this._allow_update = false; + + this.setStartDate(this._o.startDate); + this.setEndDate(this._o.endDate); + this.setDaysOfWeekDisabled(this.o.daysOfWeekDisabled); + + this.fillDow(); + this.fillMonths(); + + this._allow_update = true; + + this.update(); + this.showMode(); + + if (this.isInline){ + this.show(); + } + }; + + Datepicker.prototype = { + constructor: Datepicker, + + _process_options: function(opts){ + // Store raw options for reference + this._o = $.extend({}, this._o, opts); + // Processed options + var o = this.o = $.extend({}, this._o); + + // Check if "de-DE" style date is available, if not language should + // fallback to 2 letter code eg "de" + var lang = o.language; + if (!dates[lang]){ + lang = lang.split('-')[0]; + if (!dates[lang]) + lang = defaults.language; + } + o.language = lang; + + switch (o.startView){ + case 2: + case 'decade': + o.startView = 2; + break; + case 1: + case 'year': + o.startView = 1; + break; + default: + o.startView = 0; + } + + switch (o.minViewMode){ + case 1: + case 'months': + o.minViewMode = 1; + break; + case 2: + case 'years': + o.minViewMode = 2; + break; + default: + o.minViewMode = 0; + } + + o.startView = Math.max(o.startView, o.minViewMode); + + // true, false, or Number > 0 + if (o.multidate !== true){ + o.multidate = Number(o.multidate) || false; + if (o.multidate !== false) + o.multidate = Math.max(0, o.multidate); + else + o.multidate = 1; + } + o.multidateSeparator = String(o.multidateSeparator); + + o.weekStart %= 7; + o.weekEnd = ((o.weekStart + 6) % 7); + + var format = DPGlobal.parseFormat(o.format); + if (o.startDate !== -Infinity){ + if (!!o.startDate){ + if (o.startDate instanceof Date) + o.startDate = this._local_to_utc(this._zero_time(o.startDate)); + else + o.startDate = DPGlobal.parseDate(o.startDate, format, o.language); + } + else { + o.startDate = -Infinity; + } + } + if (o.endDate !== Infinity){ + if (!!o.endDate){ + if (o.endDate instanceof Date) + o.endDate = this._local_to_utc(this._zero_time(o.endDate)); + else + o.endDate = DPGlobal.parseDate(o.endDate, format, o.language); + } + else { + o.endDate = Infinity; + } + } + + o.daysOfWeekDisabled = o.daysOfWeekDisabled||[]; + if (!$.isArray(o.daysOfWeekDisabled)) + o.daysOfWeekDisabled = o.daysOfWeekDisabled.split(/[,\s]*/); + o.daysOfWeekDisabled = $.map(o.daysOfWeekDisabled, function(d){ + return parseInt(d, 10); + }); + + var plc = String(o.orientation).toLowerCase().split(/\s+/g), + _plc = o.orientation.toLowerCase(); + plc = $.grep(plc, function(word){ + return (/^auto|left|right|top|bottom$/).test(word); + }); + o.orientation = {x: 'auto', y: 'auto'}; + if (!_plc || _plc === 'auto') + ; // no action + else if (plc.length === 1){ + switch (plc[0]){ + case 'top': + case 'bottom': + o.orientation.y = plc[0]; + break; + case 'left': + case 'right': + o.orientation.x = plc[0]; + break; + } + } + else { + _plc = $.grep(plc, function(word){ + return (/^left|right$/).test(word); + }); + o.orientation.x = _plc[0] || 'auto'; + + _plc = $.grep(plc, function(word){ + return (/^top|bottom$/).test(word); + }); + o.orientation.y = _plc[0] || 'auto'; + } + }, + _events: [], + _secondaryEvents: [], + _applyEvents: function(evs){ + for (var i=0, el, ch, ev; i < evs.length; i++){ + el = evs[i][0]; + if (evs[i].length === 2){ + ch = undefined; + ev = evs[i][1]; + } + else if (evs[i].length === 3){ + ch = evs[i][1]; + ev = evs[i][2]; + } + el.on(ev, ch); + } + }, + _unapplyEvents: function(evs){ + for (var i=0, el, ev, ch; i < evs.length; i++){ + el = evs[i][0]; + if (evs[i].length === 2){ + ch = undefined; + ev = evs[i][1]; + } + else if (evs[i].length === 3){ + ch = evs[i][1]; + ev = evs[i][2]; + } + el.off(ev, ch); + } + }, + _buildEvents: function(){ + if (this.isInput){ // single input + this._events = [ + [this.element, { + focus: $.proxy(this.show, this), + keyup: $.proxy(function(e){ + if ($.inArray(e.keyCode, [27,37,39,38,40,32,13,9]) === -1) + this.update(); + }, this), + keydown: $.proxy(this.keydown, this) + }] + ]; + } + else if (this.component && this.hasInput){ // component: input + button + this._events = [ + // For components that are not readonly, allow keyboard nav + [this.element.find('input'), { + focus: $.proxy(this.show, this), + keyup: $.proxy(function(e){ + if ($.inArray(e.keyCode, [27,37,39,38,40,32,13,9]) === -1) + this.update(); + }, this), + keydown: $.proxy(this.keydown, this) + }], + [this.component, { + click: $.proxy(this.show, this) + }] + ]; + } + else if (this.element.is('div')){ // inline datepicker + this.isInline = true; + } + else { + this._events = [ + [this.element, { + click: $.proxy(this.show, this) + }] + ]; + } + this._events.push( + // Component: listen for blur on element descendants + [this.element, '*', { + blur: $.proxy(function(e){ + this._focused_from = e.target; + }, this) + }], + // Input: listen for blur on element + [this.element, { + blur: $.proxy(function(e){ + this._focused_from = e.target; + }, this) + }] + ); + + this._secondaryEvents = [ + [this.picker, { + click: $.proxy(this.click, this) + }], + [$(window), { + resize: $.proxy(this.place, this) + }], + [$(document), { + 'mousedown touchstart': $.proxy(function(e){ + // Clicked outside the datepicker, hide it + if (!( + this.element.is(e.target) || + this.element.find(e.target).length || + this.picker.is(e.target) || + this.picker.find(e.target).length + )){ + this.hide(); + } + }, this) + }] + ]; + }, + _attachEvents: function(){ + this._detachEvents(); + this._applyEvents(this._events); + }, + _detachEvents: function(){ + this._unapplyEvents(this._events); + }, + _attachSecondaryEvents: function(){ + this._detachSecondaryEvents(); + this._applyEvents(this._secondaryEvents); + }, + _detachSecondaryEvents: function(){ + this._unapplyEvents(this._secondaryEvents); + }, + _trigger: function(event, altdate){ + var date = altdate || this.dates.get(-1), + local_date = this._utc_to_local(date); + + this.element.trigger({ + type: event, + date: local_date, + dates: $.map(this.dates, this._utc_to_local), + format: $.proxy(function(ix, format){ + if (arguments.length === 0){ + ix = this.dates.length - 1; + format = this.o.format; + } + else if (typeof ix === 'string'){ + format = ix; + ix = this.dates.length - 1; + } + format = format || this.o.format; + var date = this.dates.get(ix); + return DPGlobal.formatDate(date, format, this.o.language); + }, this) + }); + }, + + show: function(){ + if (!this.isInline) + this.picker.appendTo('body'); + this.picker.show(); + this.place(); + this._attachSecondaryEvents(); + this._trigger('show'); + }, + + hide: function(){ + if (this.isInline) + return; + if (!this.picker.is(':visible')) + return; + this.focusDate = null; + this.picker.hide().detach(); + this._detachSecondaryEvents(); + this.viewMode = this.o.startView; + this.showMode(); + + if ( + this.o.forceParse && + ( + this.isInput && this.element.val() || + this.hasInput && this.element.find('input').val() + ) + ) + this.setValue(); + this._trigger('hide'); + }, + + remove: function(){ + this.hide(); + this._detachEvents(); + this._detachSecondaryEvents(); + this.picker.remove(); + delete this.element.data().datepicker; + if (!this.isInput){ + delete this.element.data().date; + } + }, + + _utc_to_local: function(utc){ + return utc && new Date(utc.getTime() + (utc.getTimezoneOffset()*60000)); + }, + _local_to_utc: function(local){ + return local && new Date(local.getTime() - (local.getTimezoneOffset()*60000)); + }, + _zero_time: function(local){ + return local && new Date(local.getFullYear(), local.getMonth(), local.getDate()); + }, + _zero_utc_time: function(utc){ + return utc && new Date(Date.UTC(utc.getUTCFullYear(), utc.getUTCMonth(), utc.getUTCDate())); + }, + + getDates: function(){ + return $.map(this.dates, this._utc_to_local); + }, + + getUTCDates: function(){ + return $.map(this.dates, function(d){ + return new Date(d); + }); + }, + + getDate: function(){ + return this._utc_to_local(this.getUTCDate()); + }, + + getUTCDate: function(){ + return new Date(this.dates.get(-1)); + }, + + setDates: function(){ + var args = $.isArray(arguments[0]) ? arguments[0] : arguments; + this.update.apply(this, args); + this._trigger('changeDate'); + this.setValue(); + }, + + setUTCDates: function(){ + var args = $.isArray(arguments[0]) ? arguments[0] : arguments; + this.update.apply(this, $.map(args, this._utc_to_local)); + this._trigger('changeDate'); + this.setValue(); + }, + + setDate: alias('setDates'), + setUTCDate: alias('setUTCDates'), + + setValue: function(){ + var formatted = this.getFormattedDate(); + if (!this.isInput){ + if (this.component){ + this.element.find('input').val(formatted).change(); + } + } + else { + this.element.val(formatted).change(); + } + }, + + getFormattedDate: function(format){ + if (format === undefined) + format = this.o.format; + + var lang = this.o.language; + return $.map(this.dates, function(d){ + return DPGlobal.formatDate(d, format, lang); + }).join(this.o.multidateSeparator); + }, + + setStartDate: function(startDate){ + this._process_options({startDate: startDate}); + this.update(); + this.updateNavArrows(); + }, + + setEndDate: function(endDate){ + this._process_options({endDate: endDate}); + this.update(); + this.updateNavArrows(); + }, + + setDaysOfWeekDisabled: function(daysOfWeekDisabled){ + this._process_options({daysOfWeekDisabled: daysOfWeekDisabled}); + this.update(); + this.updateNavArrows(); + }, + + place: function(){ + if (this.isInline) + return; + var calendarWidth = this.picker.outerWidth(), + calendarHeight = this.picker.outerHeight(), + visualPadding = 10, + windowWidth = $window.width(), + windowHeight = $window.height(), + scrollTop = $window.scrollTop(); + + var zIndex = parseInt(this.element.parents().filter(function(){ + return $(this).css('z-index') !== 'auto'; + }).first().css('z-index'))+10; + var offset = this.component ? this.component.parent().offset() : this.element.offset(); + var height = this.component ? this.component.outerHeight(true) : this.element.outerHeight(false); + var width = this.component ? this.component.outerWidth(true) : this.element.outerWidth(false); + var left = offset.left, + top = offset.top; + + this.picker.removeClass( + 'datepicker-orient-top datepicker-orient-bottom '+ + 'datepicker-orient-right datepicker-orient-left' + ); + + if (this.o.orientation.x !== 'auto'){ + this.picker.addClass('datepicker-orient-' + this.o.orientation.x); + if (this.o.orientation.x === 'right') + left -= calendarWidth - width; + } + // auto x orientation is best-placement: if it crosses a window + // edge, fudge it sideways + else { + // Default to left + this.picker.addClass('datepicker-orient-left'); + if (offset.left < 0) + left -= offset.left - visualPadding; + else if (offset.left + calendarWidth > windowWidth) + left = windowWidth - calendarWidth - visualPadding; + } + + // auto y orientation is best-situation: top or bottom, no fudging, + // decision based on which shows more of the calendar + var yorient = this.o.orientation.y, + top_overflow, bottom_overflow; + if (yorient === 'auto'){ + top_overflow = -scrollTop + offset.top - calendarHeight; + bottom_overflow = scrollTop + windowHeight - (offset.top + height + calendarHeight); + if (Math.max(top_overflow, bottom_overflow) === bottom_overflow) + yorient = 'top'; + else + yorient = 'bottom'; + } + this.picker.addClass('datepicker-orient-' + yorient); + if (yorient === 'top') + top += height; + else + top -= calendarHeight + parseInt(this.picker.css('padding-top')); + + this.picker.css({ + top: top, + left: left, + zIndex: zIndex + }); + }, + + _allow_update: true, + update: function(){ + if (!this._allow_update) + return; + + var oldDates = this.dates.copy(), + dates = [], + fromArgs = false; + if (arguments.length){ + $.each(arguments, $.proxy(function(i, date){ + if (date instanceof Date) + date = this._local_to_utc(date); + dates.push(date); + }, this)); + fromArgs = true; + } + else { + dates = this.isInput + ? this.element.val() + : this.element.data('date') || this.element.find('input').val(); + if (dates && this.o.multidate) + dates = dates.split(this.o.multidateSeparator); + else + dates = [dates]; + delete this.element.data().date; + } + + dates = $.map(dates, $.proxy(function(date){ + return DPGlobal.parseDate(date, this.o.format, this.o.language); + }, this)); + dates = $.grep(dates, $.proxy(function(date){ + return ( + date < this.o.startDate || + date > this.o.endDate || + !date + ); + }, this), true); + this.dates.replace(dates); + + if (this.dates.length) + this.viewDate = new Date(this.dates.get(-1)); + else if (this.viewDate < this.o.startDate) + this.viewDate = new Date(this.o.startDate); + else if (this.viewDate > this.o.endDate) + this.viewDate = new Date(this.o.endDate); + + if (fromArgs){ + // setting date by clicking + this.setValue(); + } + else if (dates.length){ + // setting date by typing + if (String(oldDates) !== String(this.dates)) + this._trigger('changeDate'); + } + if (!this.dates.length && oldDates.length) + this._trigger('clearDate'); + + this.fill(); + }, + + fillDow: function(){ + var dowCnt = this.o.weekStart, + html = '<tr>'; + if (this.o.calendarWeeks){ + var cell = '<th class="cw">&nbsp;</th>'; + html += cell; + this.picker.find('.datepicker-days thead tr:first-child').prepend(cell); + } + while (dowCnt < this.o.weekStart + 7){ + html += '<th class="dow">'+dates[this.o.language].daysMin[(dowCnt++)%7]+'</th>'; + } + html += '</tr>'; + this.picker.find('.datepicker-days thead').append(html); + }, + + fillMonths: function(){ + var html = '', + i = 0; + while (i < 12){ + html += '<span class="month">'+dates[this.o.language].monthsShort[i++]+'</span>'; + } + this.picker.find('.datepicker-months td').html(html); + }, + + setRange: function(range){ + if (!range || !range.length) + delete this.range; + else + this.range = $.map(range, function(d){ + return d.valueOf(); + }); + this.fill(); + }, + + getClassNames: function(date){ + var cls = [], + year = this.viewDate.getUTCFullYear(), + month = this.viewDate.getUTCMonth(), + today = new Date(); + if (date.getUTCFullYear() < year || (date.getUTCFullYear() === year && date.getUTCMonth() < month)){ + cls.push('old'); + } + else if (date.getUTCFullYear() > year || (date.getUTCFullYear() === year && date.getUTCMonth() > month)){ + cls.push('new'); + } + if (this.focusDate && date.valueOf() === this.focusDate.valueOf()) + cls.push('focused'); + // Compare internal UTC date with local today, not UTC today + if (this.o.todayHighlight && + date.getUTCFullYear() === today.getFullYear() && + date.getUTCMonth() === today.getMonth() && + date.getUTCDate() === today.getDate()){ + cls.push('today'); + } + if (this.dates.contains(date) !== -1) + cls.push('active'); + if (date.valueOf() < this.o.startDate || date.valueOf() > this.o.endDate || + $.inArray(date.getUTCDay(), this.o.daysOfWeekDisabled) !== -1){ + cls.push('disabled'); + } + if (this.range){ + if (date > this.range[0] && date < this.range[this.range.length-1]){ + cls.push('range'); + } + if ($.inArray(date.valueOf(), this.range) !== -1){ + cls.push('selected'); + } + } + return cls; + }, + + fill: function(){ + var d = new Date(this.viewDate), + year = d.getUTCFullYear(), + month = d.getUTCMonth(), + startYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity, + startMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity, + endYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity, + endMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity, + todaytxt = dates[this.o.language].today || dates['en'].today || '', + cleartxt = dates[this.o.language].clear || dates['en'].clear || '', + tooltip; + this.picker.find('.datepicker-days thead th.datepicker-switch') + .text(dates[this.o.language].months[month]+' '+year); + this.picker.find('tfoot th.today') + .text(todaytxt) + .toggle(this.o.todayBtn !== false); + this.picker.find('tfoot th.clear') + .text(cleartxt) + .toggle(this.o.clearBtn !== false); + this.updateNavArrows(); + this.fillMonths(); + var prevMonth = UTCDate(year, month-1, 28), + day = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth()); + prevMonth.setUTCDate(day); + prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.o.weekStart + 7)%7); + var nextMonth = new Date(prevMonth); + nextMonth.setUTCDate(nextMonth.getUTCDate() + 42); + nextMonth = nextMonth.valueOf(); + var html = []; + var clsName; + while (prevMonth.valueOf() < nextMonth){ + if (prevMonth.getUTCDay() === this.o.weekStart){ + html.push('<tr>'); + if (this.o.calendarWeeks){ + // ISO 8601: First week contains first thursday. + // ISO also states week starts on Monday, but we can be more abstract here. + var + // Start of current week: based on weekstart/current date + ws = new Date(+prevMonth + (this.o.weekStart - prevMonth.getUTCDay() - 7) % 7 * 864e5), + // Thursday of this week + th = new Date(Number(ws) + (7 + 4 - ws.getUTCDay()) % 7 * 864e5), + // First Thursday of year, year from thursday + yth = new Date(Number(yth = UTCDate(th.getUTCFullYear(), 0, 1)) + (7 + 4 - yth.getUTCDay())%7*864e5), + // Calendar week: ms between thursdays, div ms per day, div 7 days + calWeek = (th - yth) / 864e5 / 7 + 1; + html.push('<td class="cw">'+ calWeek +'</td>'); + + } + } + clsName = this.getClassNames(prevMonth); + clsName.push('day'); + + if (this.o.beforeShowDay !== $.noop){ + var before = this.o.beforeShowDay(this._utc_to_local(prevMonth)); + if (before === undefined) + before = {}; + else if (typeof(before) === 'boolean') + before = {enabled: before}; + else if (typeof(before) === 'string') + before = {classes: before}; + if (before.enabled === false) + clsName.push('disabled'); + if (before.classes) + clsName = clsName.concat(before.classes.split(/\s+/)); + if (before.tooltip) + tooltip = before.tooltip; + } + + clsName = $.unique(clsName); + html.push('<td class="'+clsName.join(' ')+'"' + (tooltip ? ' title="'+tooltip+'"' : '') + '>'+prevMonth.getUTCDate() + '</td>'); + if (prevMonth.getUTCDay() === this.o.weekEnd){ + html.push('</tr>'); + } + prevMonth.setUTCDate(prevMonth.getUTCDate()+1); + } + this.picker.find('.datepicker-days tbody').empty().append(html.join('')); + + var months = this.picker.find('.datepicker-months') + .find('th:eq(1)') + .text(year) + .end() + .find('span').removeClass('active'); + + $.each(this.dates, function(i, d){ + if (d.getUTCFullYear() === year) + months.eq(d.getUTCMonth()).addClass('active'); + }); + + if (year < startYear || year > endYear){ + months.addClass('disabled'); + } + if (year === startYear){ + months.slice(0, startMonth).addClass('disabled'); + } + if (year === endYear){ + months.slice(endMonth+1).addClass('disabled'); + } + + html = ''; + year = parseInt(year/10, 10) * 10; + var yearCont = this.picker.find('.datepicker-years') + .find('th:eq(1)') + .text(year + '-' + (year + 9)) + .end() + .find('td'); + year -= 1; + var years = $.map(this.dates, function(d){ + return d.getUTCFullYear(); + }), + classes; + for (var i = -1; i < 11; i++){ + classes = ['year']; + if (i === -1) + classes.push('old'); + else if (i === 10) + classes.push('new'); + if ($.inArray(year, years) !== -1) + classes.push('active'); + if (year < startYear || year > endYear) + classes.push('disabled'); + html += '<span class="' + classes.join(' ') + '">'+year+'</span>'; + year += 1; + } + yearCont.html(html); + }, + + updateNavArrows: function(){ + if (!this._allow_update) + return; + + var d = new Date(this.viewDate), + year = d.getUTCFullYear(), + month = d.getUTCMonth(); + switch (this.viewMode){ + case 0: + if (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear() && month <= this.o.startDate.getUTCMonth()){ + this.picker.find('.prev').css({visibility: 'hidden'}); + } + else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear() && month >= this.o.endDate.getUTCMonth()){ + this.picker.find('.next').css({visibility: 'hidden'}); + } + else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + case 1: + case 2: + if (this.o.startDate !== -Infinity && year <= this.o.startDate.getUTCFullYear()){ + this.picker.find('.prev').css({visibility: 'hidden'}); + } + else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (this.o.endDate !== Infinity && year >= this.o.endDate.getUTCFullYear()){ + this.picker.find('.next').css({visibility: 'hidden'}); + } + else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + } + }, + + click: function(e){ + e.preventDefault(); + var target = $(e.target).closest('span, td, th'), + year, month, day; + if (target.length === 1){ + switch (target[0].nodeName.toLowerCase()){ + case 'th': + switch (target[0].className){ + case 'datepicker-switch': + this.showMode(1); + break; + case 'prev': + case 'next': + var dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1); + switch (this.viewMode){ + case 0: + this.viewDate = this.moveMonth(this.viewDate, dir); + this._trigger('changeMonth', this.viewDate); + break; + case 1: + case 2: + this.viewDate = this.moveYear(this.viewDate, dir); + if (this.viewMode === 1) + this._trigger('changeYear', this.viewDate); + break; + } + this.fill(); + break; + case 'today': + var date = new Date(); + date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0); + + this.showMode(-2); + var which = this.o.todayBtn === 'linked' ? null : 'view'; + this._setDate(date, which); + break; + case 'clear': + var element; + if (this.isInput) + element = this.element; + else if (this.component) + element = this.element.find('input'); + if (element) + element.val("").change(); + this.update(); + this._trigger('changeDate'); + if (this.o.autoclose) + this.hide(); + break; + } + break; + case 'span': + if (!target.is('.disabled')){ + this.viewDate.setUTCDate(1); + if (target.is('.month')){ + day = 1; + month = target.parent().find('span').index(target); + year = this.viewDate.getUTCFullYear(); + this.viewDate.setUTCMonth(month); + this._trigger('changeMonth', this.viewDate); + if (this.o.minViewMode === 1){ + this._setDate(UTCDate(year, month, day)); + } + } + else { + day = 1; + month = 0; + year = parseInt(target.text(), 10)||0; + this.viewDate.setUTCFullYear(year); + this._trigger('changeYear', this.viewDate); + if (this.o.minViewMode === 2){ + this._setDate(UTCDate(year, month, day)); + } + } + this.showMode(-1); + this.fill(); + } + break; + case 'td': + if (target.is('.day') && !target.is('.disabled')){ + day = parseInt(target.text(), 10)||1; + year = this.viewDate.getUTCFullYear(); + month = this.viewDate.getUTCMonth(); + if (target.is('.old')){ + if (month === 0){ + month = 11; + year -= 1; + } + else { + month -= 1; + } + } + else if (target.is('.new')){ + if (month === 11){ + month = 0; + year += 1; + } + else { + month += 1; + } + } + this._setDate(UTCDate(year, month, day)); + } + break; + } + } + if (this.picker.is(':visible') && this._focused_from){ + $(this._focused_from).focus(); + } + delete this._focused_from; + }, + + _toggle_multidate: function(date){ + var ix = this.dates.contains(date); + if (!date){ + this.dates.clear(); + } + else if (ix !== -1){ + this.dates.remove(ix); + } + else { + this.dates.push(date); + } + if (typeof this.o.multidate === 'number') + while (this.dates.length > this.o.multidate) + this.dates.remove(0); + }, + + _setDate: function(date, which){ + if (!which || which === 'date') + this._toggle_multidate(date && new Date(date)); + if (!which || which === 'view') + this.viewDate = date && new Date(date); + + this.fill(); + this.setValue(); + this._trigger('changeDate'); + var element; + if (this.isInput){ + element = this.element; + } + else if (this.component){ + element = this.element.find('input'); + } + if (element){ + element.change(); + } + if (this.o.autoclose && (!which || which === 'date')){ + this.hide(); + } + }, + + moveMonth: function(date, dir){ + if (!date) + return undefined; + if (!dir) + return date; + var new_date = new Date(date.valueOf()), + day = new_date.getUTCDate(), + month = new_date.getUTCMonth(), + mag = Math.abs(dir), + new_month, test; + dir = dir > 0 ? 1 : -1; + if (mag === 1){ + test = dir === -1 + // If going back one month, make sure month is not current month + // (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02) + ? function(){ + return new_date.getUTCMonth() === month; + } + // If going forward one month, make sure month is as expected + // (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02) + : function(){ + return new_date.getUTCMonth() !== new_month; + }; + new_month = month + dir; + new_date.setUTCMonth(new_month); + // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11 + if (new_month < 0 || new_month > 11) + new_month = (new_month + 12) % 12; + } + else { + // For magnitudes >1, move one month at a time... + for (var i=0; i < mag; i++) + // ...which might decrease the day (eg, Jan 31 to Feb 28, etc)... + new_date = this.moveMonth(new_date, dir); + // ...then reset the day, keeping it in the new month + new_month = new_date.getUTCMonth(); + new_date.setUTCDate(day); + test = function(){ + return new_month !== new_date.getUTCMonth(); + }; + } + // Common date-resetting loop -- if date is beyond end of month, make it + // end of month + while (test()){ + new_date.setUTCDate(--day); + new_date.setUTCMonth(new_month); + } + return new_date; + }, + + moveYear: function(date, dir){ + return this.moveMonth(date, dir*12); + }, + + dateWithinRange: function(date){ + return date >= this.o.startDate && date <= this.o.endDate; + }, + + keydown: function(e){ + if (this.picker.is(':not(:visible)')){ + if (e.keyCode === 27) // allow escape to hide and re-show picker + this.show(); + return; + } + var dateChanged = false, + dir, newDate, newViewDate, + focusDate = this.focusDate || this.viewDate; + switch (e.keyCode){ + case 27: // escape + if (this.focusDate){ + this.focusDate = null; + this.viewDate = this.dates.get(-1) || this.viewDate; + this.fill(); + } + else + this.hide(); + e.preventDefault(); + break; + case 37: // left + case 39: // right + if (!this.o.keyboardNavigation) + break; + dir = e.keyCode === 37 ? -1 : 1; + if (e.ctrlKey){ + newDate = this.moveYear(this.dates.get(-1) || UTCToday(), dir); + newViewDate = this.moveYear(focusDate, dir); + this._trigger('changeYear', this.viewDate); + } + else if (e.shiftKey){ + newDate = this.moveMonth(this.dates.get(-1) || UTCToday(), dir); + newViewDate = this.moveMonth(focusDate, dir); + this._trigger('changeMonth', this.viewDate); + } + else { + newDate = new Date(this.dates.get(-1) || UTCToday()); + newDate.setUTCDate(newDate.getUTCDate() + dir); + newViewDate = new Date(focusDate); + newViewDate.setUTCDate(focusDate.getUTCDate() + dir); + } + if (this.dateWithinRange(newDate)){ + this.focusDate = this.viewDate = newViewDate; + this.setValue(); + this.fill(); + e.preventDefault(); + } + break; + case 38: // up + case 40: // down + if (!this.o.keyboardNavigation) + break; + dir = e.keyCode === 38 ? -1 : 1; + if (e.ctrlKey){ + newDate = this.moveYear(this.dates.get(-1) || UTCToday(), dir); + newViewDate = this.moveYear(focusDate, dir); + this._trigger('changeYear', this.viewDate); + } + else if (e.shiftKey){ + newDate = this.moveMonth(this.dates.get(-1) || UTCToday(), dir); + newViewDate = this.moveMonth(focusDate, dir); + this._trigger('changeMonth', this.viewDate); + } + else { + newDate = new Date(this.dates.get(-1) || UTCToday()); + newDate.setUTCDate(newDate.getUTCDate() + dir * 7); + newViewDate = new Date(focusDate); + newViewDate.setUTCDate(focusDate.getUTCDate() + dir * 7); + } + if (this.dateWithinRange(newDate)){ + this.focusDate = this.viewDate = newViewDate; + this.setValue(); + this.fill(); + e.preventDefault(); + } + break; + case 32: // spacebar + // Spacebar is used in manually typing dates in some formats. + // As such, its behavior should not be hijacked. + break; + case 13: // enter + focusDate = this.focusDate || this.dates.get(-1) || this.viewDate; + this._toggle_multidate(focusDate); + dateChanged = true; + this.focusDate = null; + this.viewDate = this.dates.get(-1) || this.viewDate; + this.setValue(); + this.fill(); + if (this.picker.is(':visible')){ + e.preventDefault(); + if (this.o.autoclose) + this.hide(); + } + break; + case 9: // tab + this.focusDate = null; + this.viewDate = this.dates.get(-1) || this.viewDate; + this.fill(); + this.hide(); + break; + } + if (dateChanged){ + if (this.dates.length) + this._trigger('changeDate'); + else + this._trigger('clearDate'); + var element; + if (this.isInput){ + element = this.element; + } + else if (this.component){ + element = this.element.find('input'); + } + if (element){ + element.change(); + } + } + }, + + showMode: function(dir){ + if (dir){ + this.viewMode = Math.max(this.o.minViewMode, Math.min(2, this.viewMode + dir)); + } + this.picker + .find('>div') + .hide() + .filter('.datepicker-'+DPGlobal.modes[this.viewMode].clsName) + .css('display', 'block'); + this.updateNavArrows(); + } + }; + + var DateRangePicker = function(element, options){ + this.element = $(element); + this.inputs = $.map(options.inputs, function(i){ + return i.jquery ? i[0] : i; + }); + delete options.inputs; + + $(this.inputs) + .datepicker(options) + .bind('changeDate', $.proxy(this.dateUpdated, this)); + + this.pickers = $.map(this.inputs, function(i){ + return $(i).data('datepicker'); + }); + this.updateDates(); + }; + DateRangePicker.prototype = { + updateDates: function(){ + this.dates = $.map(this.pickers, function(i){ + return i.getUTCDate(); + }); + this.updateRanges(); + }, + updateRanges: function(){ + var range = $.map(this.dates, function(d){ + return d.valueOf(); + }); + $.each(this.pickers, function(i, p){ + p.setRange(range); + }); + }, + dateUpdated: function(e){ + // `this.updating` is a workaround for preventing infinite recursion + // between `changeDate` triggering and `setUTCDate` calling. Until + // there is a better mechanism. + if (this.updating) + return; + this.updating = true; + + var dp = $(e.target).data('datepicker'), + new_date = dp.getUTCDate(), + i = $.inArray(e.target, this.inputs), + l = this.inputs.length; + if (i === -1) + return; + + $.each(this.pickers, function(i, p){ + if (!p.getUTCDate()) + p.setUTCDate(new_date); + }); + + if (new_date < this.dates[i]){ + // Date being moved earlier/left + while (i >= 0 && new_date < this.dates[i]){ + this.pickers[i--].setUTCDate(new_date); + } + } + else if (new_date > this.dates[i]){ + // Date being moved later/right + while (i < l && new_date > this.dates[i]){ + this.pickers[i++].setUTCDate(new_date); + } + } + this.updateDates(); + + delete this.updating; + }, + remove: function(){ + $.map(this.pickers, function(p){ p.remove(); }); + delete this.element.data().datepicker; + } + }; + + function opts_from_el(el, prefix){ + // Derive options from element data-attrs + var data = $(el).data(), + out = {}, inkey, + replace = new RegExp('^' + prefix.toLowerCase() + '([A-Z])'); + prefix = new RegExp('^' + prefix.toLowerCase()); + function re_lower(_,a){ + return a.toLowerCase(); + } + for (var key in data) + if (prefix.test(key)){ + inkey = key.replace(replace, re_lower); + out[inkey] = data[key]; + } + return out; + } + + function opts_from_locale(lang){ + // Derive options from locale plugins + var out = {}; + // Check if "de-DE" style date is available, if not language should + // fallback to 2 letter code eg "de" + if (!dates[lang]){ + lang = lang.split('-')[0]; + if (!dates[lang]) + return; + } + var d = dates[lang]; + $.each(locale_opts, function(i,k){ + if (k in d) + out[k] = d[k]; + }); + return out; + } + + var old = $.fn.datepicker; + $.fn.datepicker = function(option){ + var args = Array.apply(null, arguments); + args.shift(); + var internal_return; + this.each(function(){ + var $this = $(this), + data = $this.data('datepicker'), + options = typeof option === 'object' && option; + if (!data){ + var elopts = opts_from_el(this, 'date'), + // Preliminary otions + xopts = $.extend({}, defaults, elopts, options), + locopts = opts_from_locale(xopts.language), + // Options priority: js args, data-attrs, locales, defaults + opts = $.extend({}, defaults, locopts, elopts, options); + if ($this.is('.input-daterange') || opts.inputs){ + var ropts = { + inputs: opts.inputs || $this.find('input').toArray() + }; + $this.data('datepicker', (data = new DateRangePicker(this, $.extend(opts, ropts)))); + } + else { + $this.data('datepicker', (data = new Datepicker(this, opts))); + } + } + if (typeof option === 'string' && typeof data[option] === 'function'){ + internal_return = data[option].apply(data, args); + if (internal_return !== undefined) + return false; + } + }); + if (internal_return !== undefined) + return internal_return; + else + return this; + }; + + var defaults = $.fn.datepicker.defaults = { + autoclose: false, + beforeShowDay: $.noop, + calendarWeeks: false, + clearBtn: false, + daysOfWeekDisabled: [], + endDate: Infinity, + forceParse: true, + format: 'mm/dd/yyyy', + keyboardNavigation: true, + language: 'en', + minViewMode: 0, + multidate: false, + multidateSeparator: ',', + orientation: "auto", + rtl: false, + startDate: -Infinity, + startView: 0, + todayBtn: false, + todayHighlight: false, + weekStart: 0 + }; + var locale_opts = $.fn.datepicker.locale_opts = [ + 'format', + 'rtl', + 'weekStart' + ]; + $.fn.datepicker.Constructor = Datepicker; + var dates = $.fn.datepicker.dates = { + en: { + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], + daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], + daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"], + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + today: "Today", + clear: "Clear" + } + }; + + var DPGlobal = { + modes: [ + { + clsName: 'days', + navFnc: 'Month', + navStep: 1 + }, + { + clsName: 'months', + navFnc: 'FullYear', + navStep: 1 + }, + { + clsName: 'years', + navFnc: 'FullYear', + navStep: 10 + }], + isLeapYear: function(year){ + return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)); + }, + getDaysInMonth: function(year, month){ + return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; + }, + validParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g, + nonpunctuation: /[^ -\/:-@\[\u3400-\u9fff-`{-~\t\n\r]+/g, + parseFormat: function(format){ + // IE treats \0 as a string end in inputs (truncating the value), + // so it's a bad format delimiter, anyway + var separators = format.replace(this.validParts, '\0').split('\0'), + parts = format.match(this.validParts); + if (!separators || !separators.length || !parts || parts.length === 0){ + throw new Error("Invalid date format."); + } + return {separators: separators, parts: parts}; + }, + parseDate: function(date, format, language){ + if (!date) + return undefined; + if (date instanceof Date) + return date; + if (typeof format === 'string') + format = DPGlobal.parseFormat(format); + var part_re = /([\-+]\d+)([dmwy])/, + parts = date.match(/([\-+]\d+)([dmwy])/g), + part, dir, i; + if (/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/.test(date)){ + date = new Date(); + for (i=0; i < parts.length; i++){ + part = part_re.exec(parts[i]); + dir = parseInt(part[1]); + switch (part[2]){ + case 'd': + date.setUTCDate(date.getUTCDate() + dir); + break; + case 'm': + date = Datepicker.prototype.moveMonth.call(Datepicker.prototype, date, dir); + break; + case 'w': + date.setUTCDate(date.getUTCDate() + dir * 7); + break; + case 'y': + date = Datepicker.prototype.moveYear.call(Datepicker.prototype, date, dir); + break; + } + } + return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 0, 0, 0); + } + parts = date && date.match(this.nonpunctuation) || []; + date = new Date(); + var parsed = {}, + setters_order = ['yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'], + setters_map = { + yyyy: function(d,v){ + return d.setUTCFullYear(v); + }, + yy: function(d,v){ + return d.setUTCFullYear(2000+v); + }, + m: function(d,v){ + if (isNaN(d)) + return d; + v -= 1; + while (v < 0) v += 12; + v %= 12; + d.setUTCMonth(v); + while (d.getUTCMonth() !== v) + d.setUTCDate(d.getUTCDate()-1); + return d; + }, + d: function(d,v){ + return d.setUTCDate(v); + } + }, + val, filtered; + setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m']; + setters_map['dd'] = setters_map['d']; + date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0); + var fparts = format.parts.slice(); + // Remove noop parts + if (parts.length !== fparts.length){ + fparts = $(fparts).filter(function(i,p){ + return $.inArray(p, setters_order) !== -1; + }).toArray(); + } + // Process remainder + function match_part(){ + var m = this.slice(0, parts[i].length), + p = parts[i].slice(0, m.length); + return m === p; + } + if (parts.length === fparts.length){ + var cnt; + for (i=0, cnt = fparts.length; i < cnt; i++){ + val = parseInt(parts[i], 10); + part = fparts[i]; + if (isNaN(val)){ + switch (part){ + case 'MM': + filtered = $(dates[language].months).filter(match_part); + val = $.inArray(filtered[0], dates[language].months) + 1; + break; + case 'M': + filtered = $(dates[language].monthsShort).filter(match_part); + val = $.inArray(filtered[0], dates[language].monthsShort) + 1; + break; + } + } + parsed[part] = val; + } + var _date, s; + for (i=0; i < setters_order.length; i++){ + s = setters_order[i]; + if (s in parsed && !isNaN(parsed[s])){ + _date = new Date(date); + setters_map[s](_date, parsed[s]); + if (!isNaN(_date)) + date = _date; + } + } + } + return date; + }, + formatDate: function(date, format, language){ + if (!date) + return ''; + if (typeof format === 'string') + format = DPGlobal.parseFormat(format); + var val = { + d: date.getUTCDate(), + D: dates[language].daysShort[date.getUTCDay()], + DD: dates[language].days[date.getUTCDay()], + m: date.getUTCMonth() + 1, + M: dates[language].monthsShort[date.getUTCMonth()], + MM: dates[language].months[date.getUTCMonth()], + yy: date.getUTCFullYear().toString().substring(2), + yyyy: date.getUTCFullYear() + }; + val.dd = (val.d < 10 ? '0' : '') + val.d; + val.mm = (val.m < 10 ? '0' : '') + val.m; + date = []; + var seps = $.extend([], format.separators); + for (var i=0, cnt = format.parts.length; i <= cnt; i++){ + if (seps.length) + date.push(seps.shift()); + date.push(val[format.parts[i]]); + } + return date.join(''); + }, + headTemplate: '<thead>'+ + '<tr>'+ + '<th class="prev">&laquo;</th>'+ + '<th colspan="5" class="datepicker-switch"></th>'+ + '<th class="next">&raquo;</th>'+ + '</tr>'+ + '</thead>', + contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>', + footTemplate: '<tfoot>'+ + '<tr>'+ + '<th colspan="7" class="today"></th>'+ + '</tr>'+ + '<tr>'+ + '<th colspan="7" class="clear"></th>'+ + '</tr>'+ + '</tfoot>' + }; + DPGlobal.template = '<div class="datepicker">'+ + '<div class="datepicker-days">'+ + '<table class="table table-condensed">'+ + DPGlobal.headTemplate+ + '<tbody></tbody>'+ + DPGlobal.footTemplate+ + '</table>'+ + '</div>'+ + '<div class="datepicker-months">'+ + '<table class="table table-condensed">'+ + DPGlobal.headTemplate+ + DPGlobal.contTemplate+ + DPGlobal.footTemplate+ + '</table>'+ + '</div>'+ + '<div class="datepicker-years">'+ + '<table class="table table-condensed">'+ + DPGlobal.headTemplate+ + DPGlobal.contTemplate+ + DPGlobal.footTemplate+ + '</table>'+ + '</div>'+ + '</div>'; + + $.fn.datepicker.DPGlobal = DPGlobal; + + + /* DATEPICKER NO CONFLICT + * =================== */ + + $.fn.datepicker.noConflict = function(){ + $.fn.datepicker = old; + return this; + }; + + + /* DATEPICKER DATA-API + * ================== */ + + $(document).on( + 'focus.datepicker.data-api click.datepicker.data-api', + '[data-provide="datepicker"]', + function(e){ + var $this = $(this); + if ($this.data('datepicker')) + return; + e.preventDefault(); + // component click requires us to explicitly show it + $this.datepicker('show'); + } + ); + $(function(){ + $('[data-provide="datepicker-inline"]').datepicker(); + }); + +}(window.jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/datepicker3.css b/theme/bootstrap/plugins/datepicker/datepicker3.css new file mode 100644 index 0000000..d9c3fb6 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/datepicker3.css @@ -0,0 +1,790 @@ +/*! + * Datepicker for Bootstrap + * + * Copyright 2012 Stefan Petre + * Improvements by Andrew Rowls + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + */ +.datepicker { + padding: 4px; + border-radius: 4px; + direction: ltr; + /*.dow { + border-top: 1px solid #ddd !important; + }*/ +} +.datepicker-inline { + width: 100%; +} +.datepicker.datepicker-rtl { + direction: rtl; +} +.datepicker.datepicker-rtl table tr td span { + float: right; +} +.datepicker-dropdown { + top: 0; + left: 0; +} +.datepicker-dropdown:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-top: 0; + border-bottom-color: rgba(0, 0, 0, 0.2); + position: absolute; +} +.datepicker-dropdown:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + border-top: 0; + position: absolute; +} +.datepicker-dropdown.datepicker-orient-left:before { + left: 6px; +} +.datepicker-dropdown.datepicker-orient-left:after { + left: 7px; +} +.datepicker-dropdown.datepicker-orient-right:before { + right: 6px; +} +.datepicker-dropdown.datepicker-orient-right:after { + right: 7px; +} +.datepicker-dropdown.datepicker-orient-top:before { + top: -7px; +} +.datepicker-dropdown.datepicker-orient-top:after { + top: -6px; +} +.datepicker-dropdown.datepicker-orient-bottom:before { + bottom: -7px; + border-bottom: 0; + border-top: 7px solid #999; +} +.datepicker-dropdown.datepicker-orient-bottom:after { + bottom: -6px; + border-bottom: 0; + border-top: 6px solid #fff; +} +.datepicker > div { + display: none; +} +.datepicker.days div.datepicker-days { + display: block; +} +.datepicker.months div.datepicker-months { + display: block; +} +.datepicker.years div.datepicker-years { + display: block; +} +.datepicker table { + margin: 0; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.datepicker table tr td, +.datepicker table tr th { + text-align: center; + width: 30px; + height: 30px; + border-radius: 4px; + border: none; +} +.table-striped .datepicker table tr td, +.table-striped .datepicker table tr th { + background-color: transparent; +} +.datepicker table tr td.day:hover, +.datepicker table tr td.day.focused { + background: rgba(0,0,0,0.2); + cursor: pointer; +} +.datepicker table tr td.old, +.datepicker table tr td.new { + color: #777; +} +.datepicker table tr td.disabled, +.datepicker table tr td.disabled:hover { + background: none; + color: #444; + cursor: default; +} +.datepicker table tr td.today, +.datepicker table tr td.today:hover, +.datepicker table tr td.today.disabled, +.datepicker table tr td.today.disabled:hover { + color: #000000; + background: rgba(0,0,0,0.2); + border-color: #ffb733; +} +.datepicker table tr td.today:hover, +.datepicker table tr td.today:hover:hover, +.datepicker table tr td.today.disabled:hover, +.datepicker table tr td.today.disabled:hover:hover, +.datepicker table tr td.today:focus, +.datepicker table tr td.today:hover:focus, +.datepicker table tr td.today.disabled:focus, +.datepicker table tr td.today.disabled:hover:focus, +.datepicker table tr td.today:active, +.datepicker table tr td.today:hover:active, +.datepicker table tr td.today.disabled:active, +.datepicker table tr td.today.disabled:hover:active, +.datepicker table tr td.today.active, +.datepicker table tr td.today:hover.active, +.datepicker table tr td.today.disabled.active, +.datepicker table tr td.today.disabled:hover.active, +.open .dropdown-toggle.datepicker table tr td.today, +.open .dropdown-toggle.datepicker table tr td.today:hover, +.open .dropdown-toggle.datepicker table tr td.today.disabled, +.open .dropdown-toggle.datepicker table tr td.today.disabled:hover { + color: #000000; + background: rgba(0,0,0,0.2); + border-color: #f59e00; +} +.datepicker table tr td.today:active, +.datepicker table tr td.today:hover:active, +.datepicker table tr td.today.disabled:active, +.datepicker table tr td.today.disabled:hover:active, +.datepicker table tr td.today.active, +.datepicker table tr td.today:hover.active, +.datepicker table tr td.today.disabled.active, +.datepicker table tr td.today.disabled:hover.active, +.open .dropdown-toggle.datepicker table tr td.today, +.open .dropdown-toggle.datepicker table tr td.today:hover, +.open .dropdown-toggle.datepicker table tr td.today.disabled, +.open .dropdown-toggle.datepicker table tr td.today.disabled:hover { + background-image: none; +} +.datepicker table tr td.today.disabled, +.datepicker table tr td.today:hover.disabled, +.datepicker table tr td.today.disabled.disabled, +.datepicker table tr td.today.disabled:hover.disabled, +.datepicker table tr td.today[disabled], +.datepicker table tr td.today:hover[disabled], +.datepicker table tr td.today.disabled[disabled], +.datepicker table tr td.today.disabled:hover[disabled], +fieldset[disabled] .datepicker table tr td.today, +fieldset[disabled] .datepicker table tr td.today:hover, +fieldset[disabled] .datepicker table tr td.today.disabled, +fieldset[disabled] .datepicker table tr td.today.disabled:hover, +.datepicker table tr td.today.disabled:hover, +.datepicker table tr td.today:hover.disabled:hover, +.datepicker table tr td.today.disabled.disabled:hover, +.datepicker table tr td.today.disabled:hover.disabled:hover, +.datepicker table tr td.today[disabled]:hover, +.datepicker table tr td.today:hover[disabled]:hover, +.datepicker table tr td.today.disabled[disabled]:hover, +.datepicker table tr td.today.disabled:hover[disabled]:hover, +fieldset[disabled] .datepicker table tr td.today:hover, +fieldset[disabled] .datepicker table tr td.today:hover:hover, +fieldset[disabled] .datepicker table tr td.today.disabled:hover, +fieldset[disabled] .datepicker table tr td.today.disabled:hover:hover, +.datepicker table tr td.today.disabled:focus, +.datepicker table tr td.today:hover.disabled:focus, +.datepicker table tr td.today.disabled.disabled:focus, +.datepicker table tr td.today.disabled:hover.disabled:focus, +.datepicker table tr td.today[disabled]:focus, +.datepicker table tr td.today:hover[disabled]:focus, +.datepicker table tr td.today.disabled[disabled]:focus, +.datepicker table tr td.today.disabled:hover[disabled]:focus, +fieldset[disabled] .datepicker table tr td.today:focus, +fieldset[disabled] .datepicker table tr td.today:hover:focus, +fieldset[disabled] .datepicker table tr td.today.disabled:focus, +fieldset[disabled] .datepicker table tr td.today.disabled:hover:focus, +.datepicker table tr td.today.disabled:active, +.datepicker table tr td.today:hover.disabled:active, +.datepicker table tr td.today.disabled.disabled:active, +.datepicker table tr td.today.disabled:hover.disabled:active, +.datepicker table tr td.today[disabled]:active, +.datepicker table tr td.today:hover[disabled]:active, +.datepicker table tr td.today.disabled[disabled]:active, +.datepicker table tr td.today.disabled:hover[disabled]:active, +fieldset[disabled] .datepicker table tr td.today:active, +fieldset[disabled] .datepicker table tr td.today:hover:active, +fieldset[disabled] .datepicker table tr td.today.disabled:active, +fieldset[disabled] .datepicker table tr td.today.disabled:hover:active, +.datepicker table tr td.today.disabled.active, +.datepicker table tr td.today:hover.disabled.active, +.datepicker table tr td.today.disabled.disabled.active, +.datepicker table tr td.today.disabled:hover.disabled.active, +.datepicker table tr td.today[disabled].active, +.datepicker table tr td.today:hover[disabled].active, +.datepicker table tr td.today.disabled[disabled].active, +.datepicker table tr td.today.disabled:hover[disabled].active, +fieldset[disabled] .datepicker table tr td.today.active, +fieldset[disabled] .datepicker table tr td.today:hover.active, +fieldset[disabled] .datepicker table tr td.today.disabled.active, +fieldset[disabled] .datepicker table tr td.today.disabled:hover.active { + background: rgba(0,0,0,0.2); + border-color: #ffb733; +} +.datepicker table tr td.today:hover:hover { + color: #000; +} +.datepicker table tr td.today.active:hover { + color: #fff; +} +.datepicker table tr td.range, +.datepicker table tr td.range:hover, +.datepicker table tr td.range.disabled, +.datepicker table tr td.range.disabled:hover { + background: rgba(0,0,0,0.2); + border-radius: 0; +} +.datepicker table tr td.range.today, +.datepicker table tr td.range.today:hover, +.datepicker table tr td.range.today.disabled, +.datepicker table tr td.range.today.disabled:hover { + color: #000000; + background: rgba(0,0,0,0.2); + border-color: #f1a417; + border-radius: 0; +} +.datepicker table tr td.range.today:hover, +.datepicker table tr td.range.today:hover:hover, +.datepicker table tr td.range.today.disabled:hover, +.datepicker table tr td.range.today.disabled:hover:hover, +.datepicker table tr td.range.today:focus, +.datepicker table tr td.range.today:hover:focus, +.datepicker table tr td.range.today.disabled:focus, +.datepicker table tr td.range.today.disabled:hover:focus, +.datepicker table tr td.range.today:active, +.datepicker table tr td.range.today:hover:active, +.datepicker table tr td.range.today.disabled:active, +.datepicker table tr td.range.today.disabled:hover:active, +.datepicker table tr td.range.today.active, +.datepicker table tr td.range.today:hover.active, +.datepicker table tr td.range.today.disabled.active, +.datepicker table tr td.range.today.disabled:hover.active, +.open .dropdown-toggle.datepicker table tr td.range.today, +.open .dropdown-toggle.datepicker table tr td.range.today:hover, +.open .dropdown-toggle.datepicker table tr td.range.today.disabled, +.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover { + color: #000000; + background: rgba(0,0,0,0.2); + border-color: #bf800c; +} +.datepicker table tr td.range.today:active, +.datepicker table tr td.range.today:hover:active, +.datepicker table tr td.range.today.disabled:active, +.datepicker table tr td.range.today.disabled:hover:active, +.datepicker table tr td.range.today.active, +.datepicker table tr td.range.today:hover.active, +.datepicker table tr td.range.today.disabled.active, +.datepicker table tr td.range.today.disabled:hover.active, +.open .dropdown-toggle.datepicker table tr td.range.today, +.open .dropdown-toggle.datepicker table tr td.range.today:hover, +.open .dropdown-toggle.datepicker table tr td.range.today.disabled, +.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover { + background-image: none; +} +.datepicker table tr td.range.today.disabled, +.datepicker table tr td.range.today:hover.disabled, +.datepicker table tr td.range.today.disabled.disabled, +.datepicker table tr td.range.today.disabled:hover.disabled, +.datepicker table tr td.range.today[disabled], +.datepicker table tr td.range.today:hover[disabled], +.datepicker table tr td.range.today.disabled[disabled], +.datepicker table tr td.range.today.disabled:hover[disabled], +fieldset[disabled] .datepicker table tr td.range.today, +fieldset[disabled] .datepicker table tr td.range.today:hover, +fieldset[disabled] .datepicker table tr td.range.today.disabled, +fieldset[disabled] .datepicker table tr td.range.today.disabled:hover, +.datepicker table tr td.range.today.disabled:hover, +.datepicker table tr td.range.today:hover.disabled:hover, +.datepicker table tr td.range.today.disabled.disabled:hover, +.datepicker table tr td.range.today.disabled:hover.disabled:hover, +.datepicker table tr td.range.today[disabled]:hover, +.datepicker table tr td.range.today:hover[disabled]:hover, +.datepicker table tr td.range.today.disabled[disabled]:hover, +.datepicker table tr td.range.today.disabled:hover[disabled]:hover, +fieldset[disabled] .datepicker table tr td.range.today:hover, +fieldset[disabled] .datepicker table tr td.range.today:hover:hover, +fieldset[disabled] .datepicker table tr td.range.today.disabled:hover, +fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:hover, +.datepicker table tr td.range.today.disabled:focus, +.datepicker table tr td.range.today:hover.disabled:focus, +.datepicker table tr td.range.today.disabled.disabled:focus, +.datepicker table tr td.range.today.disabled:hover.disabled:focus, +.datepicker table tr td.range.today[disabled]:focus, +.datepicker table tr td.range.today:hover[disabled]:focus, +.datepicker table tr td.range.today.disabled[disabled]:focus, +.datepicker table tr td.range.today.disabled:hover[disabled]:focus, +fieldset[disabled] .datepicker table tr td.range.today:focus, +fieldset[disabled] .datepicker table tr td.range.today:hover:focus, +fieldset[disabled] .datepicker table tr td.range.today.disabled:focus, +fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:focus, +.datepicker table tr td.range.today.disabled:active, +.datepicker table tr td.range.today:hover.disabled:active, +.datepicker table tr td.range.today.disabled.disabled:active, +.datepicker table tr td.range.today.disabled:hover.disabled:active, +.datepicker table tr td.range.today[disabled]:active, +.datepicker table tr td.range.today:hover[disabled]:active, +.datepicker table tr td.range.today.disabled[disabled]:active, +.datepicker table tr td.range.today.disabled:hover[disabled]:active, +fieldset[disabled] .datepicker table tr td.range.today:active, +fieldset[disabled] .datepicker table tr td.range.today:hover:active, +fieldset[disabled] .datepicker table tr td.range.today.disabled:active, +fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:active, +.datepicker table tr td.range.today.disabled.active, +.datepicker table tr td.range.today:hover.disabled.active, +.datepicker table tr td.range.today.disabled.disabled.active, +.datepicker table tr td.range.today.disabled:hover.disabled.active, +.datepicker table tr td.range.today[disabled].active, +.datepicker table tr td.range.today:hover[disabled].active, +.datepicker table tr td.range.today.disabled[disabled].active, +.datepicker table tr td.range.today.disabled:hover[disabled].active, +fieldset[disabled] .datepicker table tr td.range.today.active, +fieldset[disabled] .datepicker table tr td.range.today:hover.active, +fieldset[disabled] .datepicker table tr td.range.today.disabled.active, +fieldset[disabled] .datepicker table tr td.range.today.disabled:hover.active { + background: rgba(0,0,0,0.2); + border-color: #f1a417; +} +.datepicker table tr td.selected, +.datepicker table tr td.selected:hover, +.datepicker table tr td.selected.disabled, +.datepicker table tr td.selected.disabled:hover { + color: #ffffff; + background: rgba(0,0,0,0.2); + border-color: #555555; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td.selected:hover, +.datepicker table tr td.selected:hover:hover, +.datepicker table tr td.selected.disabled:hover, +.datepicker table tr td.selected.disabled:hover:hover, +.datepicker table tr td.selected:focus, +.datepicker table tr td.selected:hover:focus, +.datepicker table tr td.selected.disabled:focus, +.datepicker table tr td.selected.disabled:hover:focus, +.datepicker table tr td.selected:active, +.datepicker table tr td.selected:hover:active, +.datepicker table tr td.selected.disabled:active, +.datepicker table tr td.selected.disabled:hover:active, +.datepicker table tr td.selected.active, +.datepicker table tr td.selected:hover.active, +.datepicker table tr td.selected.disabled.active, +.datepicker table tr td.selected.disabled:hover.active, +.open .dropdown-toggle.datepicker table tr td.selected, +.open .dropdown-toggle.datepicker table tr td.selected:hover, +.open .dropdown-toggle.datepicker table tr td.selected.disabled, +.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover { + color: #ffffff; + background: rgba(0,0,0,0.2); + border-color: #373737; +} +.datepicker table tr td.selected:active, +.datepicker table tr td.selected:hover:active, +.datepicker table tr td.selected.disabled:active, +.datepicker table tr td.selected.disabled:hover:active, +.datepicker table tr td.selected.active, +.datepicker table tr td.selected:hover.active, +.datepicker table tr td.selected.disabled.active, +.datepicker table tr td.selected.disabled:hover.active, +.open .dropdown-toggle.datepicker table tr td.selected, +.open .dropdown-toggle.datepicker table tr td.selected:hover, +.open .dropdown-toggle.datepicker table tr td.selected.disabled, +.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover { + background-image: none; +} +.datepicker table tr td.selected.disabled, +.datepicker table tr td.selected:hover.disabled, +.datepicker table tr td.selected.disabled.disabled, +.datepicker table tr td.selected.disabled:hover.disabled, +.datepicker table tr td.selected[disabled], +.datepicker table tr td.selected:hover[disabled], +.datepicker table tr td.selected.disabled[disabled], +.datepicker table tr td.selected.disabled:hover[disabled], +fieldset[disabled] .datepicker table tr td.selected, +fieldset[disabled] .datepicker table tr td.selected:hover, +fieldset[disabled] .datepicker table tr td.selected.disabled, +fieldset[disabled] .datepicker table tr td.selected.disabled:hover, +.datepicker table tr td.selected.disabled:hover, +.datepicker table tr td.selected:hover.disabled:hover, +.datepicker table tr td.selected.disabled.disabled:hover, +.datepicker table tr td.selected.disabled:hover.disabled:hover, +.datepicker table tr td.selected[disabled]:hover, +.datepicker table tr td.selected:hover[disabled]:hover, +.datepicker table tr td.selected.disabled[disabled]:hover, +.datepicker table tr td.selected.disabled:hover[disabled]:hover, +fieldset[disabled] .datepicker table tr td.selected:hover, +fieldset[disabled] .datepicker table tr td.selected:hover:hover, +fieldset[disabled] .datepicker table tr td.selected.disabled:hover, +fieldset[disabled] .datepicker table tr td.selected.disabled:hover:hover, +.datepicker table tr td.selected.disabled:focus, +.datepicker table tr td.selected:hover.disabled:focus, +.datepicker table tr td.selected.disabled.disabled:focus, +.datepicker table tr td.selected.disabled:hover.disabled:focus, +.datepicker table tr td.selected[disabled]:focus, +.datepicker table tr td.selected:hover[disabled]:focus, +.datepicker table tr td.selected.disabled[disabled]:focus, +.datepicker table tr td.selected.disabled:hover[disabled]:focus, +fieldset[disabled] .datepicker table tr td.selected:focus, +fieldset[disabled] .datepicker table tr td.selected:hover:focus, +fieldset[disabled] .datepicker table tr td.selected.disabled:focus, +fieldset[disabled] .datepicker table tr td.selected.disabled:hover:focus, +.datepicker table tr td.selected.disabled:active, +.datepicker table tr td.selected:hover.disabled:active, +.datepicker table tr td.selected.disabled.disabled:active, +.datepicker table tr td.selected.disabled:hover.disabled:active, +.datepicker table tr td.selected[disabled]:active, +.datepicker table tr td.selected:hover[disabled]:active, +.datepicker table tr td.selected.disabled[disabled]:active, +.datepicker table tr td.selected.disabled:hover[disabled]:active, +fieldset[disabled] .datepicker table tr td.selected:active, +fieldset[disabled] .datepicker table tr td.selected:hover:active, +fieldset[disabled] .datepicker table tr td.selected.disabled:active, +fieldset[disabled] .datepicker table tr td.selected.disabled:hover:active, +.datepicker table tr td.selected.disabled.active, +.datepicker table tr td.selected:hover.disabled.active, +.datepicker table tr td.selected.disabled.disabled.active, +.datepicker table tr td.selected.disabled:hover.disabled.active, +.datepicker table tr td.selected[disabled].active, +.datepicker table tr td.selected:hover[disabled].active, +.datepicker table tr td.selected.disabled[disabled].active, +.datepicker table tr td.selected.disabled:hover[disabled].active, +fieldset[disabled] .datepicker table tr td.selected.active, +fieldset[disabled] .datepicker table tr td.selected:hover.active, +fieldset[disabled] .datepicker table tr td.selected.disabled.active, +fieldset[disabled] .datepicker table tr td.selected.disabled:hover.active { + background: rgba(0,0,0,0.2); + border-color: #555555; +} +.datepicker table tr td.active, +.datepicker table tr td.active:hover, +.datepicker table tr td.active.disabled, +.datepicker table tr td.active.disabled:hover { + color: #ffffff; + background: rgba(0,0,0,0.2); + border-color: #357ebd; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td.active:hover, +.datepicker table tr td.active:hover:hover, +.datepicker table tr td.active.disabled:hover, +.datepicker table tr td.active.disabled:hover:hover, +.datepicker table tr td.active:focus, +.datepicker table tr td.active:hover:focus, +.datepicker table tr td.active.disabled:focus, +.datepicker table tr td.active.disabled:hover:focus, +.datepicker table tr td.active:active, +.datepicker table tr td.active:hover:active, +.datepicker table tr td.active.disabled:active, +.datepicker table tr td.active.disabled:hover:active, +.datepicker table tr td.active.active, +.datepicker table tr td.active:hover.active, +.datepicker table tr td.active.disabled.active, +.datepicker table tr td.active.disabled:hover.active, +.open .dropdown-toggle.datepicker table tr td.active, +.open .dropdown-toggle.datepicker table tr td.active:hover, +.open .dropdown-toggle.datepicker table tr td.active.disabled, +.open .dropdown-toggle.datepicker table tr td.active.disabled:hover { + color: #ffffff; + background: rgba(0,0,0,0.5); + border-color: #285e8e; +} +.datepicker table tr td.active:active, +.datepicker table tr td.active:hover:active, +.datepicker table tr td.active.disabled:active, +.datepicker table tr td.active.disabled:hover:active, +.datepicker table tr td.active.active, +.datepicker table tr td.active:hover.active, +.datepicker table tr td.active.disabled.active, +.datepicker table tr td.active.disabled:hover.active, +.open .dropdown-toggle.datepicker table tr td.active, +.open .dropdown-toggle.datepicker table tr td.active:hover, +.open .dropdown-toggle.datepicker table tr td.active.disabled, +.open .dropdown-toggle.datepicker table tr td.active.disabled:hover { + background-image: none; +} +.datepicker table tr td.active.disabled, +.datepicker table tr td.active:hover.disabled, +.datepicker table tr td.active.disabled.disabled, +.datepicker table tr td.active.disabled:hover.disabled, +.datepicker table tr td.active[disabled], +.datepicker table tr td.active:hover[disabled], +.datepicker table tr td.active.disabled[disabled], +.datepicker table tr td.active.disabled:hover[disabled], +fieldset[disabled] .datepicker table tr td.active, +fieldset[disabled] .datepicker table tr td.active:hover, +fieldset[disabled] .datepicker table tr td.active.disabled, +fieldset[disabled] .datepicker table tr td.active.disabled:hover, +.datepicker table tr td.active.disabled:hover, +.datepicker table tr td.active:hover.disabled:hover, +.datepicker table tr td.active.disabled.disabled:hover, +.datepicker table tr td.active.disabled:hover.disabled:hover, +.datepicker table tr td.active[disabled]:hover, +.datepicker table tr td.active:hover[disabled]:hover, +.datepicker table tr td.active.disabled[disabled]:hover, +.datepicker table tr td.active.disabled:hover[disabled]:hover, +fieldset[disabled] .datepicker table tr td.active:hover, +fieldset[disabled] .datepicker table tr td.active:hover:hover, +fieldset[disabled] .datepicker table tr td.active.disabled:hover, +fieldset[disabled] .datepicker table tr td.active.disabled:hover:hover, +.datepicker table tr td.active.disabled:focus, +.datepicker table tr td.active:hover.disabled:focus, +.datepicker table tr td.active.disabled.disabled:focus, +.datepicker table tr td.active.disabled:hover.disabled:focus, +.datepicker table tr td.active[disabled]:focus, +.datepicker table tr td.active:hover[disabled]:focus, +.datepicker table tr td.active.disabled[disabled]:focus, +.datepicker table tr td.active.disabled:hover[disabled]:focus, +fieldset[disabled] .datepicker table tr td.active:focus, +fieldset[disabled] .datepicker table tr td.active:hover:focus, +fieldset[disabled] .datepicker table tr td.active.disabled:focus, +fieldset[disabled] .datepicker table tr td.active.disabled:hover:focus, +.datepicker table tr td.active.disabled:active, +.datepicker table tr td.active:hover.disabled:active, +.datepicker table tr td.active.disabled.disabled:active, +.datepicker table tr td.active.disabled:hover.disabled:active, +.datepicker table tr td.active[disabled]:active, +.datepicker table tr td.active:hover[disabled]:active, +.datepicker table tr td.active.disabled[disabled]:active, +.datepicker table tr td.active.disabled:hover[disabled]:active, +fieldset[disabled] .datepicker table tr td.active:active, +fieldset[disabled] .datepicker table tr td.active:hover:active, +fieldset[disabled] .datepicker table tr td.active.disabled:active, +fieldset[disabled] .datepicker table tr td.active.disabled:hover:active, +.datepicker table tr td.active.disabled.active, +.datepicker table tr td.active:hover.disabled.active, +.datepicker table tr td.active.disabled.disabled.active, +.datepicker table tr td.active.disabled:hover.disabled.active, +.datepicker table tr td.active[disabled].active, +.datepicker table tr td.active:hover[disabled].active, +.datepicker table tr td.active.disabled[disabled].active, +.datepicker table tr td.active.disabled:hover[disabled].active, +fieldset[disabled] .datepicker table tr td.active.active, +fieldset[disabled] .datepicker table tr td.active:hover.active, +fieldset[disabled] .datepicker table tr td.active.disabled.active, +fieldset[disabled] .datepicker table tr td.active.disabled:hover.active { + background-color: #428bca; + border-color: #357ebd; +} +.datepicker table tr td span { + display: block; + width: 23%; + height: 54px; + line-height: 54px; + float: left; + margin: 1%; + cursor: pointer; + border-radius: 4px; +} +.datepicker table tr td span:hover { + background: rgba(0,0,0,0.2); +} +.datepicker table tr td span.disabled, +.datepicker table tr td span.disabled:hover { + background: none; + color: #444; + cursor: default; +} +.datepicker table tr td span.active, +.datepicker table tr td span.active:hover, +.datepicker table tr td span.active.disabled, +.datepicker table tr td span.active.disabled:hover { + color: #ffffff; + background-color: #428bca; + border-color: #357ebd; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.datepicker table tr td span.active:hover, +.datepicker table tr td span.active:hover:hover, +.datepicker table tr td span.active.disabled:hover, +.datepicker table tr td span.active.disabled:hover:hover, +.datepicker table tr td span.active:focus, +.datepicker table tr td span.active:hover:focus, +.datepicker table tr td span.active.disabled:focus, +.datepicker table tr td span.active.disabled:hover:focus, +.datepicker table tr td span.active:active, +.datepicker table tr td span.active:hover:active, +.datepicker table tr td span.active.disabled:active, +.datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.active, +.datepicker table tr td span.active:hover.active, +.datepicker table tr td span.active.disabled.active, +.datepicker table tr td span.active.disabled:hover.active, +.open .dropdown-toggle.datepicker table tr td span.active, +.open .dropdown-toggle.datepicker table tr td span.active:hover, +.open .dropdown-toggle.datepicker table tr td span.active.disabled, +.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover { + color: #ffffff; + background-color: #3276b1; + border-color: #285e8e; +} +.datepicker table tr td span.active:active, +.datepicker table tr td span.active:hover:active, +.datepicker table tr td span.active.disabled:active, +.datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.active, +.datepicker table tr td span.active:hover.active, +.datepicker table tr td span.active.disabled.active, +.datepicker table tr td span.active.disabled:hover.active, +.open .dropdown-toggle.datepicker table tr td span.active, +.open .dropdown-toggle.datepicker table tr td span.active:hover, +.open .dropdown-toggle.datepicker table tr td span.active.disabled, +.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover { + background-image: none; +} +.datepicker table tr td span.active.disabled, +.datepicker table tr td span.active:hover.disabled, +.datepicker table tr td span.active.disabled.disabled, +.datepicker table tr td span.active.disabled:hover.disabled, +.datepicker table tr td span.active[disabled], +.datepicker table tr td span.active:hover[disabled], +.datepicker table tr td span.active.disabled[disabled], +.datepicker table tr td span.active.disabled:hover[disabled], +fieldset[disabled] .datepicker table tr td span.active, +fieldset[disabled] .datepicker table tr td span.active:hover, +fieldset[disabled] .datepicker table tr td span.active.disabled, +fieldset[disabled] .datepicker table tr td span.active.disabled:hover, +.datepicker table tr td span.active.disabled:hover, +.datepicker table tr td span.active:hover.disabled:hover, +.datepicker table tr td span.active.disabled.disabled:hover, +.datepicker table tr td span.active.disabled:hover.disabled:hover, +.datepicker table tr td span.active[disabled]:hover, +.datepicker table tr td span.active:hover[disabled]:hover, +.datepicker table tr td span.active.disabled[disabled]:hover, +.datepicker table tr td span.active.disabled:hover[disabled]:hover, +fieldset[disabled] .datepicker table tr td span.active:hover, +fieldset[disabled] .datepicker table tr td span.active:hover:hover, +fieldset[disabled] .datepicker table tr td span.active.disabled:hover, +fieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover, +.datepicker table tr td span.active.disabled:focus, +.datepicker table tr td span.active:hover.disabled:focus, +.datepicker table tr td span.active.disabled.disabled:focus, +.datepicker table tr td span.active.disabled:hover.disabled:focus, +.datepicker table tr td span.active[disabled]:focus, +.datepicker table tr td span.active:hover[disabled]:focus, +.datepicker table tr td span.active.disabled[disabled]:focus, +.datepicker table tr td span.active.disabled:hover[disabled]:focus, +fieldset[disabled] .datepicker table tr td span.active:focus, +fieldset[disabled] .datepicker table tr td span.active:hover:focus, +fieldset[disabled] .datepicker table tr td span.active.disabled:focus, +fieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus, +.datepicker table tr td span.active.disabled:active, +.datepicker table tr td span.active:hover.disabled:active, +.datepicker table tr td span.active.disabled.disabled:active, +.datepicker table tr td span.active.disabled:hover.disabled:active, +.datepicker table tr td span.active[disabled]:active, +.datepicker table tr td span.active:hover[disabled]:active, +.datepicker table tr td span.active.disabled[disabled]:active, +.datepicker table tr td span.active.disabled:hover[disabled]:active, +fieldset[disabled] .datepicker table tr td span.active:active, +fieldset[disabled] .datepicker table tr td span.active:hover:active, +fieldset[disabled] .datepicker table tr td span.active.disabled:active, +fieldset[disabled] .datepicker table tr td span.active.disabled:hover:active, +.datepicker table tr td span.active.disabled.active, +.datepicker table tr td span.active:hover.disabled.active, +.datepicker table tr td span.active.disabled.disabled.active, +.datepicker table tr td span.active.disabled:hover.disabled.active, +.datepicker table tr td span.active[disabled].active, +.datepicker table tr td span.active:hover[disabled].active, +.datepicker table tr td span.active.disabled[disabled].active, +.datepicker table tr td span.active.disabled:hover[disabled].active, +fieldset[disabled] .datepicker table tr td span.active.active, +fieldset[disabled] .datepicker table tr td span.active:hover.active, +fieldset[disabled] .datepicker table tr td span.active.disabled.active, +fieldset[disabled] .datepicker table tr td span.active.disabled:hover.active { + background-color: #428bca; + border-color: #357ebd; +} +.datepicker table tr td span.old, +.datepicker table tr td span.new { + color: #444; +} +.datepicker th.datepicker-switch { + width: 145px; +} +.datepicker thead tr:first-child th, +.datepicker tfoot tr th { + cursor: pointer; +} +.datepicker thead tr:first-child th:hover, +.datepicker tfoot tr th:hover { + background: rgba(0,0,0,0.2); +} +.datepicker .cw { + font-size: 10px; + width: 12px; + padding: 0 2px 0 5px; + vertical-align: middle; +} +.datepicker thead tr:first-child th.cw { + cursor: default; + background-color: transparent; +} +.input-group.date .input-group-addon i { + cursor: pointer; + width: 16px; + height: 16px; +} +.input-daterange input { + text-align: center; +} +.input-daterange input:first-child { + border-radius: 3px 0 0 3px; +} +.input-daterange input:last-child { + border-radius: 0 3px 3px 0; +} +.input-daterange .input-group-addon { + width: auto; + min-width: 16px; + padding: 4px 5px; + font-weight: normal; + line-height: 1.428571429; + text-align: center; + text-shadow: 0 1px 0 #fff; + vertical-align: middle; + background-color: #eeeeee; + border: solid #cccccc; + border-width: 1px 0; + margin-left: -5px; + margin-right: -5px; +} +.datepicker.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + float: left; + display: none; + min-width: 160px; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 5px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + *border-right-width: 2px; + *border-bottom-width: 2px; + color: #333333; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + line-height: 1.428571429; +} +.datepicker.dropdown-menu th, +.datepicker.dropdown-menu td { + padding: 4px 5px; +} diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ar.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ar.js new file mode 100644 index 0000000..12ae182 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ar.js @@ -0,0 +1,15 @@ +/** + * Arabic translation for bootstrap-datepicker + * Mohammed Alshehri <alshehri866@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates['ar'] = { + days: ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت", "الأحد"], + daysShort: ["أحد", "اثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت", "أحد"], + daysMin: ["ح", "ن", "ث", "ع", "خ", "ج", "س", "ح"], + months: ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], + monthsShort: ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"], + today: "هذا اليوم", + rtl: true + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.az.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.az.js new file mode 100644 index 0000000..0285341 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.az.js @@ -0,0 +1,12 @@ +// Azerbaijani +;(function($){ + $.fn.datepicker.dates['az'] = { + days: ["Bazar", "Bazar ertəsi", "Çərşənbə axşamı", "Çərşənbə", "Cümə axşamı", "Cümə", "Şənbə", "Bazar"], + daysShort: ["B.", "B.e", "Ç.a", "Ç.", "C.a", "C.", "Ş.", "B."], + daysMin: ["B.", "B.e", "Ç.a", "Ç.", "C.a", "C.", "Ş.", "B."], + months: ["Yanvar", "Fevral", "Mart", "Aprel", "May", "İyun", "İyul", "Avqust", "Sentyabr", "Oktyabr", "Noyabr", "Dekabr"], + monthsShort: ["Yan", "Fev", "Mar", "Apr", "May", "İyun", "İyul", "Avq", "Sen", "Okt", "Noy", "Dek"], + today: "Bu gün", + weekStart: 1 + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.bg.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.bg.js new file mode 100644 index 0000000..6837afd --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.bg.js @@ -0,0 +1,14 @@ +/** + * Bulgarian translation for bootstrap-datepicker + * Apostol Apostolov <apostol.s.apostolov@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates['bg'] = { + days: ["Неделя", "Понеделник", "Вторник", "Сряда", "Четвъртък", "Петък", "Събота", "Неделя"], + daysShort: ["Нед", "Пон", "Вто", "Сря", "Чет", "Пет", "Съб", "Нед"], + daysMin: ["Н", "П", "В", "С", "Ч", "П", "С", "Н"], + months: ["Януари", "Февруари", "Март", "Април", "Май", "Юни", "Юли", "Август", "Септември", "Октомври", "Ноември", "Декември"], + monthsShort: ["Ян", "Фев", "Мар", "Апр", "Май", "Юни", "Юли", "Авг", "Сеп", "Окт", "Ное", "Дек"], + today: "днес" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ca.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ca.js new file mode 100644 index 0000000..3fc4d84 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ca.js @@ -0,0 +1,14 @@ +/** + * Catalan translation for bootstrap-datepicker + * J. Garcia <jogaco.en@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates['ca'] = { + days: ["Diumenge", "Dilluns", "Dimarts", "Dimecres", "Dijous", "Divendres", "Dissabte", "Diumenge"], + daysShort: ["Diu", "Dil", "Dmt", "Dmc", "Dij", "Div", "Dis", "Diu"], + daysMin: ["dg", "dl", "dt", "dc", "dj", "dv", "ds", "dg"], + months: ["Gener", "Febrer", "Març", "Abril", "Maig", "Juny", "Juliol", "Agost", "Setembre", "Octubre", "Novembre", "Desembre"], + monthsShort: ["Gen", "Feb", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Oct", "Nov", "Des"], + today: "Avui" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.cs.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.cs.js new file mode 100644 index 0000000..f76a2c0 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.cs.js @@ -0,0 +1,15 @@ +/** + * Czech translation for bootstrap-datepicker + * Matěj Koubík <matej@koubik.name> + * Fixes by Michal Remiš <michal.remis@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates['cs'] = { + days: ["Neděle", "Pondělí", "Úterý", "Středa", "Čtvrtek", "Pátek", "Sobota", "Neděle"], + daysShort: ["Ned", "Pon", "Úte", "Stř", "Čtv", "Pát", "Sob", "Ned"], + daysMin: ["Ne", "Po", "Út", "St", "Čt", "Pá", "So", "Ne"], + months: ["Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", "Listopad", "Prosinec"], + monthsShort: ["Led", "Úno", "Bře", "Dub", "Kvě", "Čer", "Čnc", "Srp", "Zář", "Říj", "Lis", "Pro"], + today: "Dnes" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.cy.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.cy.js new file mode 100644 index 0000000..7e1136a --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.cy.js @@ -0,0 +1,14 @@ +/** + * Welsh translation for bootstrap-datepicker + * S. Morris <s.morris@bangor.ac.uk> + */ +;(function($){ + $.fn.datepicker.dates['cy'] = { + days: ["Sul", "Llun", "Mawrth", "Mercher", "Iau", "Gwener", "Sadwrn", "Sul"], + daysShort: ["Sul", "Llu", "Maw", "Mer", "Iau", "Gwe", "Sad", "Sul"], + daysMin: ["Su", "Ll", "Ma", "Me", "Ia", "Gwe", "Sa", "Su"], + months: ["Ionawr", "Chewfror", "Mawrth", "Ebrill", "Mai", "Mehefin", "Gorfennaf", "Awst", "Medi", "Hydref", "Tachwedd", "Rhagfyr"], + monthsShort: ["Ion", "Chw", "Maw", "Ebr", "Mai", "Meh", "Gor", "Aws", "Med", "Hyd", "Tach", "Rha"], + today: "Heddiw" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.da.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.da.js new file mode 100644 index 0000000..c3d702d --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.da.js @@ -0,0 +1,15 @@ +/** + * Danish translation for bootstrap-datepicker + * Christian Pedersen <http://github.com/chripede> + */ +;(function($){ + $.fn.datepicker.dates['da'] = { + days: ["Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag", "Søndag"], + daysShort: ["Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør", "Søn"], + daysMin: ["Sø", "Ma", "Ti", "On", "To", "Fr", "Lø", "Sø"], + months: ["Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"], + today: "I Dag", + clear: "Nulstil" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.de.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.de.js new file mode 100644 index 0000000..a27ba57 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.de.js @@ -0,0 +1,17 @@ +/** + * German translation for bootstrap-datepicker + * Sam Zurcher <sam@orelias.ch> + */ +;(function($){ + $.fn.datepicker.dates['de'] = { + days: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"], + daysShort: ["Son", "Mon", "Die", "Mit", "Don", "Fre", "Sam", "Son"], + daysMin: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"], + months: ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"], + monthsShort: ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"], + today: "Heute", + clear: "Löschen", + weekStart: 1, + format: "dd.mm.yyyy" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.el.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.el.js new file mode 100644 index 0000000..3b630f3 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.el.js @@ -0,0 +1,13 @@ +/** + * Greek translation for bootstrap-datepicker + */ +;(function($){ + $.fn.datepicker.dates['el'] = { + days: ["Κυριακή", "Δευτέρα", "Τρίτη", "Τετάρτη", "Πέμπτη", "Παρασκευή", "Σάββατο", "Κυριακή"], + daysShort: ["Κυρ", "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ", "Κυρ"], + daysMin: ["Κυ", "Δε", "Τρ", "Τε", "Πε", "Πα", "Σα", "Κυ"], + months: ["Ιανουάριος", "Φεβρουάριος", "Μάρτιος", "Απρίλιος", "Μάιος", "Ιούνιος", "Ιούλιος", "Αύγουστος", "Σεπτέμβριος", "Οκτώβριος", "Νοέμβριος", "Δεκέμβριος"], + monthsShort: ["Ιαν", "Φεβ", "Μαρ", "Απρ", "Μάι", "Ιουν", "Ιουλ", "Αυγ", "Σεπ", "Οκτ", "Νοε", "Δεκ"], + today: "Σήμερα" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.es.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.es.js new file mode 100644 index 0000000..7217690 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.es.js @@ -0,0 +1,14 @@ +/** + * Spanish translation for bootstrap-datepicker + * Bruno Bonamin <bruno.bonamin@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates['es'] = { + days: ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"], + daysShort: ["Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb", "Dom"], + daysMin: ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa", "Do"], + months: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"], + monthsShort: ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"], + today: "Hoy" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.et.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.et.js new file mode 100644 index 0000000..87c812e --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.et.js @@ -0,0 +1,18 @@ +/** + * Estonian translation for bootstrap-datepicker + * Ando Roots <https://github.com/anroots> + * Fixes by Illimar Tambek <<https://github.com/ragulka> + */ +;(function($){ + $.fn.datepicker.dates['et'] = { + days: ["Pühapäev", "Esmaspäev", "Teisipäev", "Kolmapäev", "Neljapäev", "Reede", "Laupäev", "Pühapäev"], + daysShort: ["Pühap", "Esmasp", "Teisip", "Kolmap", "Neljap", "Reede", "Laup", "Pühap"], + daysMin: ["P", "E", "T", "K", "N", "R", "L", "P"], + months: ["Jaanuar", "Veebruar", "Märts", "Aprill", "Mai", "Juuni", "Juuli", "August", "September", "Oktoober", "November", "Detsember"], + monthsShort: ["Jaan", "Veebr", "Märts", "Apr", "Mai", "Juuni", "Juuli", "Aug", "Sept", "Okt", "Nov", "Dets"], + today: "Täna", + clear: "Tühjenda", + weekStart: 1, + format: "dd.mm.yyyy" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.fa.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.fa.js new file mode 100644 index 0000000..6503c85 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.fa.js @@ -0,0 +1,17 @@ +/** + * Persian translation for bootstrap-datepicker + * Mostafa Rokooie <mostafa.rokooie@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates['fa'] = { + days: ["یک‌شنبه", "دوشنبه", "سه‌شنبه", "چهارشنبه", "پنج‌شنبه", "جمعه", "شنبه", "یک‌شنبه"], + daysShort: ["یک", "دو", "سه", "چهار", "پنج", "جمعه", "شنبه", "یک"], + daysMin: ["ی", "د", "س", "چ", "پ", "ج", "ش", "ی"], + months: ["ژانویه", "فوریه", "مارس", "آوریل", "مه", "ژوئن", "ژوئیه", "اوت", "سپتامبر", "اکتبر", "نوامبر", "دسامبر"], + monthsShort: ["ژان", "فور", "مار", "آور", "مه", "ژون", "ژوی", "اوت", "سپت", "اکت", "نوا", "دسا"], + today: "امروز", + clear: "پاک کن", + weekStart: 1, + format: "yyyy/mm/dd" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.fi.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.fi.js new file mode 100644 index 0000000..01f40dc --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.fi.js @@ -0,0 +1,16 @@ +/** + * Finnish translation for bootstrap-datepicker + * Jaakko Salonen <https://github.com/jsalonen> + */ +;(function($){ + $.fn.datepicker.dates['fi'] = { + days: ["sunnuntai", "maanantai", "tiistai", "keskiviikko", "torstai", "perjantai", "lauantai", "sunnuntai"], + daysShort: ["sun", "maa", "tii", "kes", "tor", "per", "lau", "sun"], + daysMin: ["su", "ma", "ti", "ke", "to", "pe", "la", "su"], + months: ["tammikuu", "helmikuu", "maaliskuu", "huhtikuu", "toukokuu", "kesäkuu", "heinäkuu", "elokuu", "syyskuu", "lokakuu", "marraskuu", "joulukuu"], + monthsShort: ["tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mar", "jou"], + today: "tänään", + weekStart: 1, + format: "d.m.yyyy" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.fr.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.fr.js new file mode 100644 index 0000000..eff07aa --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.fr.js @@ -0,0 +1,17 @@ +/** + * French translation for bootstrap-datepicker + * Nico Mollet <nico.mollet@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates['fr'] = { + days: ["Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"], + daysShort: ["Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dim"], + daysMin: ["D", "L", "Ma", "Me", "J", "V", "S", "D"], + months: ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"], + monthsShort: ["Jan", "Fév", "Mar", "Avr", "Mai", "Jui", "Jul", "Aou", "Sep", "Oct", "Nov", "Déc"], + today: "Aujourd'hui", + clear: "Effacer", + weekStart: 1, + format: "dd/mm/yyyy" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.gl.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.gl.js new file mode 100644 index 0000000..538fd5e --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.gl.js @@ -0,0 +1,11 @@ +;(function($){ + $.fn.datepicker.dates['gl'] = { + days: ["Domingo", "Luns", "Martes", "Mércores", "Xoves", "Venres", "Sábado", "Domingo"], + daysShort: ["Dom", "Lun", "Mar", "Mér", "Xov", "Ven", "Sáb", "Dom"], + daysMin: ["Do", "Lu", "Ma", "Me", "Xo", "Ve", "Sa", "Do"], + months: ["Xaneiro", "Febreiro", "Marzo", "Abril", "Maio", "Xuño", "Xullo", "Agosto", "Setembro", "Outubro", "Novembro", "Decembro"], + monthsShort: ["Xan", "Feb", "Mar", "Abr", "Mai", "Xun", "Xul", "Ago", "Sep", "Out", "Nov", "Dec"], + today: "Hoxe", + clear: "Limpar" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.he.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.he.js new file mode 100644 index 0000000..2e17393 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.he.js @@ -0,0 +1,15 @@ +/** + * Hebrew translation for bootstrap-datepicker + * Sagie Maoz <sagie@maoz.info> + */ +;(function($){ + $.fn.datepicker.dates['he'] = { + days: ["ראשון", "שני", "שלישי", "רביעי", "חמישי", "שישי", "שבת", "ראשון"], + daysShort: ["א", "ב", "ג", "ד", "ה", "ו", "ש", "א"], + daysMin: ["א", "ב", "ג", "ד", "ה", "ו", "ש", "א"], + months: ["ינואר", "פברואר", "מרץ", "אפריל", "מאי", "יוני", "יולי", "אוגוסט", "ספטמבר", "אוקטובר", "נובמבר", "דצמבר"], + monthsShort: ["ינו", "פבר", "מרץ", "אפר", "מאי", "יונ", "יול", "אוג", "ספט", "אוק", "נוב", "דצמ"], + today: "היום", + rtl: true + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.hr.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.hr.js new file mode 100644 index 0000000..655ea54 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.hr.js @@ -0,0 +1,13 @@ +/** + * Croatian localisation + */ +;(function($){ + $.fn.datepicker.dates['hr'] = { + days: ["Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "Četvrtak", "Petak", "Subota", "Nedjelja"], + daysShort: ["Ned", "Pon", "Uto", "Sri", "Čet", "Pet", "Sub", "Ned"], + daysMin: ["Ne", "Po", "Ut", "Sr", "Če", "Pe", "Su", "Ne"], + months: ["Siječanj", "Veljača", "Ožujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"], + monthsShort: ["Sij", "Velj", "Ožu", "Tra", "Svi", "Lip", "Srp", "Kol", "Ruj", "Lis", "Stu", "Pro"], + today: "Danas" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.hu.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.hu.js new file mode 100644 index 0000000..bf5308a --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.hu.js @@ -0,0 +1,16 @@ +/** + * Hungarian translation for bootstrap-datepicker + * Sotus László <lacisan@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates['hu'] = { + days: ["Vasárnap", "Hétfő", "Kedd", "Szerda", "Csütörtök", "Péntek", "Szombat", "Vasárnap"], + daysShort: ["Vas", "Hét", "Ked", "Sze", "Csü", "Pén", "Szo", "Vas"], + daysMin: ["Va", "Hé", "Ke", "Sz", "Cs", "Pé", "Sz", "Va"], + months: ["Január", "Február", "Március", "Április", "Május", "Június", "Július", "Augusztus", "Szeptember", "Október", "November", "December"], + monthsShort: ["Jan", "Feb", "Már", "Ápr", "Máj", "Jún", "Júl", "Aug", "Sze", "Okt", "Nov", "Dec"], + today: "Ma", + weekStart: 1, + format: "yyyy.mm.dd" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.id.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.id.js new file mode 100644 index 0000000..aae6e89 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.id.js @@ -0,0 +1,15 @@ +/** + * Bahasa translation for bootstrap-datepicker + * Azwar Akbar <azwar.akbar@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates['id'] = { + days: ["Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"], + daysShort: ["Mgu", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab", "Mgu"], + daysMin: ["Mg", "Sn", "Sl", "Ra", "Ka", "Ju", "Sa", "Mg"], + months: ["Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Ags", "Sep", "Okt", "Nov", "Des"], + today: "Hari Ini", + clear: "Kosongkan" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.is.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.is.js new file mode 100644 index 0000000..0e57a91 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.is.js @@ -0,0 +1,14 @@ +/** + * Icelandic translation for bootstrap-datepicker + * Hinrik Örn Sigurðsson <hinrik.sig@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates['is'] = { + days: ["Sunnudagur", "Mánudagur", "Þriðjudagur", "Miðvikudagur", "Fimmtudagur", "Föstudagur", "Laugardagur", "Sunnudagur"], + daysShort: ["Sun", "Mán", "Þri", "Mið", "Fim", "Fös", "Lau", "Sun"], + daysMin: ["Su", "Má", "Þr", "Mi", "Fi", "Fö", "La", "Su"], + months: ["Janúar", "Febrúar", "Mars", "Apríl", "Maí", "Júní", "Júlí", "Ágúst", "September", "Október", "Nóvember", "Desember"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maí", "Jún", "Júl", "Ágú", "Sep", "Okt", "Nóv", "Des"], + today: "Í Dag" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.it.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.it.js new file mode 100644 index 0000000..9f476fa --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.it.js @@ -0,0 +1,17 @@ +/** + * Italian translation for bootstrap-datepicker + * Enrico Rubboli <rubboli@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates['it'] = { + days: ["Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato", "Domenica"], + daysShort: ["Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab", "Dom"], + daysMin: ["Do", "Lu", "Ma", "Me", "Gi", "Ve", "Sa", "Do"], + months: ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"], + monthsShort: ["Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"], + today: "Oggi", + clear: "Cancella", + weekStart: 1, + format: "dd/mm/yyyy" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ja.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ja.js new file mode 100644 index 0000000..ed0bc0f --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ja.js @@ -0,0 +1,15 @@ +/** + * Japanese translation for bootstrap-datepicker + * Norio Suzuki <https://github.com/suzuki/> + */ +;(function($){ + $.fn.datepicker.dates['ja'] = { + days: ["日曜", "月曜", "火曜", "水曜", "木曜", "金曜", "土曜", "日曜"], + daysShort: ["日", "月", "火", "水", "木", "金", "土", "日"], + daysMin: ["日", "月", "火", "水", "木", "金", "土", "日"], + months: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], + monthsShort: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"], + today: "今日", + format: "yyyy/mm/dd" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ka.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ka.js new file mode 100644 index 0000000..5434454 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ka.js @@ -0,0 +1,17 @@ +/** + * Georgian translation for bootstrap-datepicker + * Levan Melikishvili <levani0101@yahoo.com> + */ +;(function($){ + $.fn.datepicker.dates['ka'] = { + days: ["კვირა", "ორშაბათი", "სამშაბათი", "ოთხშაბათი", "ხუთშაბათი", "პარასკევი", "შაბათი", "კვირა"], + daysShort: ["კვი", "ორშ", "სამ", "ოთხ", "ხუთ", "პარ", "შაბ", "კვი"], + daysMin: ["კვ", "ორ", "სა", "ოთ", "ხუ", "პა", "შა", "კვ"], + months: ["იანვარი", "თებერვალი", "მარტი", "აპრილი", "მაისი", "ივნისი", "ივლისი", "აგვისტო", "სექტემბერი", "ოქტომები", "ნოემბერი", "დეკემბერი"], + monthsShort: ["იან", "თებ", "მარ", "აპრ", "მაი", "ივნ", "ივლ", "აგვ", "სექ", "ოქტ", "ნოე", "დეკ"], + today: "დღეს", + clear: "გასუფთავება", + weekStart: 1, + format: "dd.mm.yyyy" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.kk.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.kk.js new file mode 100644 index 0000000..94dd6b8 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.kk.js @@ -0,0 +1,15 @@ +/** + * Kazakh translation for bootstrap-datepicker + * Yerzhan Tolekov <era.tolekov@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates['kk'] = { + days: ["Жексенбі", "Дүйсенбі", "Сейсенбі", "Сәрсенбі", "Бейсенбі", "Жұма", "Сенбі", "Жексенбі"], + daysShort: ["Жек", "Дүй", "Сей", "Сәр", "Бей", "Жұм", "Сен", "Жек"], + daysMin: ["Жк", "Дс", "Сс", "Ср", "Бс", "Жм", "Сн", "Жк"], + months: ["Қаңтар", "Ақпан", "Наурыз", "Сәуір", "Мамыр", "Маусым", "Шілде", "Тамыз", "Қыркүйек", "Қазан", "Қараша", "Желтоқсан"], + monthsShort: ["Қаң", "Ақп", "Нау", "Сәу", "Мамыр", "Мау", "Шлд", "Тмз", "Қыр", "Қзн", "Қар", "Жел"], + today: "Бүгін", + weekStart: 1 + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.kr.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.kr.js new file mode 100644 index 0000000..183a88d --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.kr.js @@ -0,0 +1,13 @@ +/** + * Korean translation for bootstrap-datepicker + * Gu Youn <http://github.com/guyoun> + */ +;(function($){ + $.fn.datepicker.dates['kr'] = { + days: ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일", "일요일"], + daysShort: ["일", "월", "화", "수", "목", "금", "토", "일"], + daysMin: ["일", "월", "화", "수", "목", "금", "토", "일"], + months: ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"], + monthsShort: ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"] + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.lt.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.lt.js new file mode 100644 index 0000000..11c1b3a --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.lt.js @@ -0,0 +1,16 @@ +/** + * Lithuanian translation for bootstrap-datepicker + * Šarūnas Gliebus <ssharunas@yahoo.co.uk> + */ + +;(function($){ + $.fn.datepicker.dates['lt'] = { + days: ["Sekmadienis", "Pirmadienis", "Antradienis", "Trečiadienis", "Ketvirtadienis", "Penktadienis", "Šeštadienis", "Sekmadienis"], + daysShort: ["S", "Pr", "A", "T", "K", "Pn", "Š", "S"], + daysMin: ["Sk", "Pr", "An", "Tr", "Ke", "Pn", "Št", "Sk"], + months: ["Sausis", "Vasaris", "Kovas", "Balandis", "Gegužė", "Birželis", "Liepa", "Rugpjūtis", "Rugsėjis", "Spalis", "Lapkritis", "Gruodis"], + monthsShort: ["Sau", "Vas", "Kov", "Bal", "Geg", "Bir", "Lie", "Rugp", "Rugs", "Spa", "Lap", "Gru"], + today: "Šiandien", + weekStart: 1 + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.lv.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.lv.js new file mode 100644 index 0000000..76d0f3a --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.lv.js @@ -0,0 +1,16 @@ +/** + * Latvian translation for bootstrap-datepicker + * Artis Avotins <artis@apit.lv> + */ + +;(function($){ + $.fn.datepicker.dates['lv'] = { + days: ["Svētdiena", "Pirmdiena", "Otrdiena", "Trešdiena", "Ceturtdiena", "Piektdiena", "Sestdiena", "Svētdiena"], + daysShort: ["Sv", "P", "O", "T", "C", "Pk", "S", "Sv"], + daysMin: ["Sv", "Pr", "Ot", "Tr", "Ce", "Pk", "Se", "Sv"], + months: ["Janvāris", "Februāris", "Marts", "Aprīlis", "Maijs", "Jūnijs", "Jūlijs", "Augusts", "Septembris", "Oktobris", "Novembris", "Decembris"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mai", "Jūn", "Jūl", "Aug", "Sep", "Okt", "Nov", "Dec"], + today: "Šodien", + weekStart: 1 + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.mk.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.mk.js new file mode 100644 index 0000000..0ab8cf6 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.mk.js @@ -0,0 +1,15 @@ +/** + * Macedonian translation for bootstrap-datepicker + * Marko Aleksic <psybaron@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates['mk'] = { + days: ["Недела", "Понеделник", "Вторник", "Среда", "Четврток", "Петок", "Сабота", "Недела"], + daysShort: ["Нед", "Пон", "Вто", "Сре", "Чет", "Пет", "Саб", "Нед"], + daysMin: ["Не", "По", "Вт", "Ср", "Че", "Пе", "Са", "Не"], + months: ["Јануари", "Февруари", "Март", "Април", "Мај", "Јуни", "Јули", "Август", "Септември", "Октомври", "Ноември", "Декември"], + monthsShort: ["Јан", "Фев", "Мар", "Апр", "Мај", "Јун", "Јул", "Авг", "Сеп", "Окт", "Ное", "Дек"], + today: "Денес", + format: "dd.mm.yyyy" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ms.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ms.js new file mode 100644 index 0000000..fa3a21a --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ms.js @@ -0,0 +1,14 @@ +/** + * Malay translation for bootstrap-datepicker + * Ateman Faiz <noorulfaiz@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates['ms'] = { + days: ["Ahad", "Isnin", "Selasa", "Rabu", "Khamis", "Jumaat", "Sabtu", "Ahad"], + daysShort: ["Aha", "Isn", "Sel", "Rab", "Kha", "Jum", "Sab", "Aha"], + daysMin: ["Ah", "Is", "Se", "Ra", "Kh", "Ju", "Sa", "Ah"], + months: ["Januari", "Februari", "Mac", "April", "Mei", "Jun", "Julai", "Ogos", "September", "Oktober", "November", "Disember"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Ogo", "Sep", "Okt", "Nov", "Dis"], + today: "Hari Ini" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.nb.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.nb.js new file mode 100644 index 0000000..7b28e84 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.nb.js @@ -0,0 +1,14 @@ +/** + * Norwegian (bokmål) translation for bootstrap-datepicker + * Fredrik Sundmyhr <http://github.com/fsundmyhr> + */ +;(function($){ + $.fn.datepicker.dates['nb'] = { + days: ["Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag", "Søndag"], + daysShort: ["Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør", "Søn"], + daysMin: ["Sø", "Ma", "Ti", "On", "To", "Fr", "Lø", "Sø"], + months: ["Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Des"], + today: "I Dag" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.nl-BE.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.nl-BE.js new file mode 100644 index 0000000..ee4201a --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.nl-BE.js @@ -0,0 +1,17 @@ +/** + * Belgium-Dutch translation for bootstrap-datepicker + * Julien Poulin <poulin_julien@hotmail.com> + */ +;(function($){ + $.fn.datepicker.dates['nl-BE'] = { + days: ["Zondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag", "Zondag"], + daysShort: ["Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za", "Zo"], + daysMin: ["Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za", "Zo"], + months: ["Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "Oktober", "November", "December"], + monthsShort: ["Jan", "Feb", "Mrt", "Apr", "Mei", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"], + today: "Vandaag", + clear: "Leegmaken", + weekStart: 1, + format: "dd/mm/yyyy" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.nl.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.nl.js new file mode 100644 index 0000000..13a2f1a --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.nl.js @@ -0,0 +1,14 @@ +/** + * Dutch translation for bootstrap-datepicker + * Reinier Goltstein <mrgoltstein@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates['nl'] = { + days: ["Zondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", "Zaterdag", "Zondag"], + daysShort: ["Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za", "Zo"], + daysMin: ["Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za", "Zo"], + months: ["Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "Oktober", "November", "December"], + monthsShort: ["Jan", "Feb", "Mrt", "Apr", "Mei", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"], + today: "Vandaag" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.no.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.no.js new file mode 100644 index 0000000..c29ec83 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.no.js @@ -0,0 +1,16 @@ +/** + * Norwegian translation for bootstrap-datepicker + **/ +;(function($){ + $.fn.datepicker.dates['no'] = { + days: ['Søndag','Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag'], + daysShort: ['Søn','Man','Tir','Ons','Tor','Fre','Lør'], + daysMin: ['Sø','Ma','Ti','On','To','Fr','Lø'], + months: ['Januar','Februar','Mars','April','Mai','Juni','Juli','August','September','Oktober','November','Desember'], + monthsShort: ['Jan','Feb','Mar','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Des'], + today: 'I dag', + clear: 'Nullstill', + weekStart: 1, + format: 'dd.mm.yyyy' + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.pl.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.pl.js new file mode 100644 index 0000000..f3fff8c --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.pl.js @@ -0,0 +1,15 @@ +/** + * Polish translation for bootstrap-datepicker + * Robert <rtpm@gazeta.pl> + */ +;(function($){ + $.fn.datepicker.dates['pl'] = { + days: ["Niedziela", "Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota", "Niedziela"], + daysShort: ["Nie", "Pn", "Wt", "Śr", "Czw", "Pt", "So", "Nie"], + daysMin: ["N", "Pn", "Wt", "Śr", "Cz", "Pt", "So", "N"], + months: ["Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"], + monthsShort: ["Sty", "Lu", "Mar", "Kw", "Maj", "Cze", "Lip", "Sie", "Wrz", "Pa", "Lis", "Gru"], + today: "Dzisiaj", + weekStart: 1 + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.pt-BR.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.pt-BR.js new file mode 100644 index 0000000..eb642b7 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.pt-BR.js @@ -0,0 +1,15 @@ +/** + * Brazilian translation for bootstrap-datepicker + * Cauan Cabral <cauan@radig.com.br> + */ +;(function($){ + $.fn.datepicker.dates['pt-BR'] = { + days: ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado", "Domingo"], + daysShort: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb", "Dom"], + daysMin: ["Do", "Se", "Te", "Qu", "Qu", "Se", "Sa", "Do"], + months: ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], + monthsShort: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"], + today: "Hoje", + clear: "Limpar" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.pt.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.pt.js new file mode 100644 index 0000000..e54981d --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.pt.js @@ -0,0 +1,16 @@ +/** + * Portuguese translation for bootstrap-datepicker + * Original code: Cauan Cabral <cauan@radig.com.br> + * Tiago Melo <tiago.blackcode@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates['pt'] = { + days: ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado", "Domingo"], + daysShort: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb", "Dom"], + daysMin: ["Do", "Se", "Te", "Qu", "Qu", "Se", "Sa", "Do"], + months: ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"], + monthsShort: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"], + today: "Hoje", + clear: "Limpar" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ro.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ro.js new file mode 100644 index 0000000..e1e65df --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ro.js @@ -0,0 +1,16 @@ +/** + * Romanian translation for bootstrap-datepicker + * Cristian Vasile <cristi.mie@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates['ro'] = { + days: ["Duminică", "Luni", "Marţi", "Miercuri", "Joi", "Vineri", "Sâmbătă", "Duminică"], + daysShort: ["Dum", "Lun", "Mar", "Mie", "Joi", "Vin", "Sâm", "Dum"], + daysMin: ["Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sâ", "Du"], + months: ["Ianuarie", "Februarie", "Martie", "Aprilie", "Mai", "Iunie", "Iulie", "August", "Septembrie", "Octombrie", "Noiembrie", "Decembrie"], + monthsShort: ["Ian", "Feb", "Mar", "Apr", "Mai", "Iun", "Iul", "Aug", "Sep", "Oct", "Nov", "Dec"], + today: "Astăzi", + clear: "Șterge", + weekStart: 1 + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.rs-latin.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.rs-latin.js new file mode 100644 index 0000000..d942485 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.rs-latin.js @@ -0,0 +1,14 @@ +/** + * Serbian latin translation for bootstrap-datepicker + * Bojan Milosavlević <milboj@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates['rs-latin'] = { + days: ["Nedelja","Ponedeljak", "Utorak", "Sreda", "Četvrtak", "Petak", "Subota", "Nedelja"], + daysShort: ["Ned", "Pon", "Uto", "Sre", "Čet", "Pet", "Sub", "Ned"], + daysMin: ["N", "Po", "U", "Sr", "Č", "Pe", "Su", "N"], + months: ["Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Avg", "Sep", "Okt", "Nov", "Dec"], + today: "Danas" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.rs.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.rs.js new file mode 100644 index 0000000..6b65747 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.rs.js @@ -0,0 +1,14 @@ +/** + * Serbian cyrillic translation for bootstrap-datepicker + * Bojan Milosavlević <milboj@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates['rs'] = { + days: ["Недеља","Понедељак", "Уторак", "Среда", "Четвртак", "Петак", "Субота", "Недеља"], + daysShort: ["Нед", "Пон", "Уто", "Сре", "Чет", "Пет", "Суб", "Нед"], + daysMin: ["Н", "По", "У", "Ср", "Ч", "Пе", "Су", "Н"], + months: ["Јануар", "Фебруар", "Март", "Април", "Мај", "Јун", "Јул", "Август", "Септембар", "Октобар", "Новембар", "Децембар"], + monthsShort: ["Јан", "Феб", "Мар", "Апр", "Мај", "Јун", "Јул", "Авг", "Сеп", "Окт", "Нов", "Дец"], + today: "Данас" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ru.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ru.js new file mode 100644 index 0000000..e230aa9 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ru.js @@ -0,0 +1,15 @@ +/** + * Russian translation for bootstrap-datepicker + * Victor Taranenko <darwin@snowdale.com> + */ +;(function($){ + $.fn.datepicker.dates['ru'] = { + days: ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"], + daysShort: ["Вск", "Пнд", "Втр", "Срд", "Чтв", "Птн", "Суб", "Вск"], + daysMin: ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"], + months: ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"], + monthsShort: ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"], + today: "Сегодня", + weekStart: 1 + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.sk.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.sk.js new file mode 100644 index 0000000..c48032a --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.sk.js @@ -0,0 +1,15 @@ +/** + * Slovak translation for bootstrap-datepicker + * Marek Lichtner <marek@licht.sk> + * Fixes by Michal Remiš <michal.remis@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates["sk"] = { + days: ["Nedeľa", "Pondelok", "Utorok", "Streda", "Štvrtok", "Piatok", "Sobota", "Nedeľa"], + daysShort: ["Ned", "Pon", "Uto", "Str", "Štv", "Pia", "Sob", "Ned"], + daysMin: ["Ne", "Po", "Ut", "St", "Št", "Pia", "So", "Ne"], + months: ["Január", "Február", "Marec", "Apríl", "Máj", "Jún", "Júl", "August", "September", "Október", "November", "December"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Máj", "Jún", "Júl", "Aug", "Sep", "Okt", "Nov", "Dec"], + today: "Dnes" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.sl.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.sl.js new file mode 100644 index 0000000..41b0e06 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.sl.js @@ -0,0 +1,14 @@ +/** + * Slovene translation for bootstrap-datepicker + * Gregor Rudolf <gregor.rudolf@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates['sl'] = { + days: ["Nedelja", "Ponedeljek", "Torek", "Sreda", "Četrtek", "Petek", "Sobota", "Nedelja"], + daysShort: ["Ned", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob", "Ned"], + daysMin: ["Ne", "Po", "To", "Sr", "Če", "Pe", "So", "Ne"], + months: ["Januar", "Februar", "Marec", "April", "Maj", "Junij", "Julij", "Avgust", "September", "Oktober", "November", "December"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Avg", "Sep", "Okt", "Nov", "Dec"], + today: "Danes" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.sq.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.sq.js new file mode 100644 index 0000000..a045a9d --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.sq.js @@ -0,0 +1,15 @@ +/** + * Albanian translation for bootstrap-datepicker + * Tomor Pupovci <http://www.github.com/ttomor> + */ +;(function($){ + $.fn.datepicker.dates['sq'] = { + days: ["E Diel", "E Hënë", "E martē", "E mërkurë", "E Enjte", "E Premte", "E Shtunë", "E Diel"], + daysShort: ["Die", "Hën", "Mar", "Mër", "Enj", "Pre", "Shtu", "Die"], + daysMin: ["Di", "Hë", "Ma", "Më", "En", "Pr", "Sht", "Di"], + months: ["Janar", "Shkurt", "Mars", "Prill", "Maj", "Qershor", "Korrik", "Gusht", "Shtator", "Tetor", "Nëntor", "Dhjetor"], + monthsShort: ["Jan", "Shk", "Mar", "Pri", "Maj", "Qer", "Korr", "Gu", "Sht", "Tet", "Nën", "Dhjet"], + today: "Sot" + }; +}(jQuery)); + diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.sv.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.sv.js new file mode 100644 index 0000000..029cea0 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.sv.js @@ -0,0 +1,16 @@ +/** + * Swedish translation for bootstrap-datepicker + * Patrik Ragnarsson <patrik@starkast.net> + */ +;(function($){ + $.fn.datepicker.dates['sv'] = { + days: ["Söndag", "Måndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "Lördag", "Söndag"], + daysShort: ["Sön", "Mån", "Tis", "Ons", "Tor", "Fre", "Lör", "Sön"], + daysMin: ["Sö", "Må", "Ti", "On", "To", "Fr", "Lö", "Sö"], + months: ["Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"], + today: "Idag", + format: "yyyy-mm-dd", + weekStart: 1 + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.sw.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.sw.js new file mode 100644 index 0000000..622e0ef --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.sw.js @@ -0,0 +1,15 @@ +/** + * Swahili translation for bootstrap-datepicker + * Edwin Mugendi <https://github.com/edwinmugendi> + * Source: http://scriptsource.org/cms/scripts/page.php?item_id=entry_detail&uid=xnfaqyzcku + */ +;(function($){ + $.fn.datepicker.dates['sw'] = { + days: ["Jumapili", "Jumatatu", "Jumanne", "Jumatano", "Alhamisi", "Ijumaa", "Jumamosi", "Jumapili"], + daysShort: ["J2", "J3", "J4", "J5", "Alh", "Ij", "J1", "J2"], + daysMin: ["2", "3", "4", "5", "A", "I", "1", "2"], + months: ["Januari", "Februari", "Machi", "Aprili", "Mei", "Juni", "Julai", "Agosti", "Septemba", "Oktoba", "Novemba", "Desemba"], + monthsShort: ["Jan", "Feb", "Mac", "Apr", "Mei", "Jun", "Jul", "Ago", "Sep", "Okt", "Nov", "Des"], + today: "Leo" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.th.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.th.js new file mode 100644 index 0000000..562b063 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.th.js @@ -0,0 +1,14 @@ +/** + * Thai translation for bootstrap-datepicker + * Suchau Jiraprapot <seroz24@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates['th'] = { + days: ["อาทิตย์", "จันทร์", "อังคาร", "พุธ", "พฤหัส", "ศุกร์", "เสาร์", "อาทิตย์"], + daysShort: ["อา", "จ", "อ", "พ", "พฤ", "ศ", "ส", "อา"], + daysMin: ["อา", "จ", "อ", "พ", "พฤ", "ศ", "ส", "อา"], + months: ["มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม"], + monthsShort: ["ม.ค.", "ก.พ.", "มี.ค.", "เม.ย.", "พ.ค.", "มิ.ย.", "ก.ค.", "ส.ค.", "ก.ย.", "ต.ค.", "พ.ย.", "ธ.ค."], + today: "วันนี้" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.tr.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.tr.js new file mode 100644 index 0000000..2be8b6d --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.tr.js @@ -0,0 +1,16 @@ +/** + * Turkish translation for bootstrap-datepicker + * Serkan Algur <kaisercrazy_2@hotmail.com> + */ +;(function($){ + $.fn.datepicker.dates['tr'] = { + days: ["Pazar", "Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi", "Pazar"], + daysShort: ["Pz", "Pzt", "Sal", "Çrş", "Prş", "Cu", "Cts", "Pz"], + daysMin: ["Pz", "Pzt", "Sa", "Çr", "Pr", "Cu", "Ct", "Pz"], + months: ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"], + monthsShort: ["Oca", "Şub", "Mar", "Nis", "May", "Haz", "Tem", "Ağu", "Eyl", "Eki", "Kas", "Ara"], + today: "Bugün", + format: "dd.mm.yyyy" + }; +}(jQuery)); + diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ua.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ua.js new file mode 100644 index 0000000..d4bb0f0 --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.ua.js @@ -0,0 +1,15 @@ +/** + * Ukrainian translation for bootstrap-datepicker + * Igor Polynets + */ +;(function($){ + $.fn.datepicker.dates['ua'] = { + days: ["Неділя", "Понеділок", "Вівторок", "Середа", "Четвер", "П'ятница", "Субота", "Неділя"], + daysShort: ["Нед", "Пнд", "Втр", "Срд", "Чтв", "Птн", "Суб", "Нед"], + daysMin: ["Нд", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Нд"], + months: ["Cічень", "Лютий", "Березень", "Квітень", "Травень", "Червень", "Липень", "Серпень", "Вересень", "Жовтень", "Листопад", "Грудень"], + monthsShort: ["Січ", "Лют", "Бер", "Кві", "Тра", "Чер", "Лип", "Сер", "Вер", "Жов", "Лис", "Гру"], + today: "Сьогодні", + weekStart: 1 + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.vi.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.vi.js new file mode 100644 index 0000000..a8cc52e --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.vi.js @@ -0,0 +1,16 @@ +/** + * Vietnamese translation for bootstrap-datepicker + * An Vo <https://github.com/anvoz/> + */ +;(function($){ + $.fn.datepicker.dates['vi'] = { + days: ["Chủ nhật", "Thứ hai", "Thứ ba", "Thứ tư", "Thứ năm", "Thứ sáu", "Thứ bảy", "Chủ nhật"], + daysShort: ["CN", "Thứ 2", "Thứ 3", "Thứ 4", "Thứ 5", "Thứ 6", "Thứ 7", "CN"], + daysMin: ["CN", "T2", "T3", "T4", "T5", "T6", "T7", "CN"], + months: ["Tháng 1", "Tháng 2", "Tháng 3", "Tháng 4", "Tháng 5", "Tháng 6", "Tháng 7", "Tháng 8", "Tháng 9", "Tháng 10", "Tháng 11", "Tháng 12"], + monthsShort: ["Th1", "Th2", "Th3", "Th4", "Th5", "Th6", "Th7", "Th8", "Th9", "Th10", "Th11", "Th12"], + today: "Hôm nay", + clear: "Xóa", + format: "dd/mm/yyyy" + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.zh-CN.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.zh-CN.js new file mode 100644 index 0000000..d6625ec --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.zh-CN.js @@ -0,0 +1,16 @@ +/** + * Simplified Chinese translation for bootstrap-datepicker + * Yuan Cheung <advanimal@gmail.com> + */ +;(function($){ + $.fn.datepicker.dates['zh-CN'] = { + days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"], + daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"], + daysMin: ["日", "一", "二", "三", "四", "五", "六", "日"], + months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], + monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], + today: "今日", + format: "yyyy年mm月dd日", + weekStart: 1 + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.zh-TW.js b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.zh-TW.js new file mode 100644 index 0000000..53337ae --- /dev/null +++ b/theme/bootstrap/plugins/datepicker/locales/bootstrap-datepicker.zh-TW.js @@ -0,0 +1,17 @@ +/** + * Traditional Chinese translation for bootstrap-datepicker + * Rung-Sheng Jang <daniel@i-trend.co.cc> + * FrankWu <frankwu100@gmail.com> Fix more appropriate use of Traditional Chinese habit + */ +;(function($){ + $.fn.datepicker.dates['zh-TW'] = { + days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"], + daysShort: ["週日", "週一", "週二", "週三", "週四", "週五", "週六", "週日"], + daysMin: ["日", "一", "二", "三", "四", "五", "六", "日"], + months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], + monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], + today: "今天", + format: "yyyy年mm月dd日", + weekStart: 1 + }; +}(jQuery)); diff --git a/theme/bootstrap/plugins/daterangepicker/daterangepicker-bs3.css b/theme/bootstrap/plugins/daterangepicker/daterangepicker-bs3.css new file mode 100644 index 0000000..7a501fb --- /dev/null +++ b/theme/bootstrap/plugins/daterangepicker/daterangepicker-bs3.css @@ -0,0 +1,335 @@ +/*! + * Stylesheet for the Date Range Picker, for use with Bootstrap 3.x + * + * Copyright 2013-2015 Dan Grossman ( http://www.dangrossman.info ) + * Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php + * + * Built for http://www.improvely.com + */ + + .daterangepicker.dropdown-menu { + max-width: none; + z-index: 3000; +} + +.daterangepicker.opensleft .ranges, .daterangepicker.opensleft .calendar { + float: left; + margin: 4px; +} + +.daterangepicker.opensright .ranges, .daterangepicker.opensright .calendar, +.daterangepicker.openscenter .ranges, .daterangepicker.openscenter .calendar { + float: right; + margin: 4px; +} + +.daterangepicker.single .ranges, .daterangepicker.single .calendar { + float: none; +} + +.daterangepicker .ranges { + width: 160px; + text-align: left; +} + +.daterangepicker .ranges .range_inputs>div { + float: left; +} + +.daterangepicker .ranges .range_inputs>div:nth-child(2) { + padding-left: 11px; +} + +.daterangepicker .calendar { + display: none; + max-width: 270px; +} + +.daterangepicker.show-calendar .calendar { + display: block; +} + +.daterangepicker .calendar.single .calendar-date { + border: none; +} + +.daterangepicker .calendar th, .daterangepicker .calendar td { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; + white-space: nowrap; + text-align: center; + min-width: 32px; +} + +.daterangepicker .daterangepicker_start_input label, +.daterangepicker .daterangepicker_end_input label { + color: #333; + display: block; + font-size: 11px; + font-weight: normal; + height: 20px; + line-height: 20px; + margin-bottom: 2px; + text-shadow: #fff 1px 1px 0px; + text-transform: uppercase; + width: 74px; +} + +.daterangepicker .ranges input { + font-size: 11px; +} + +.daterangepicker .ranges .input-mini { + border: 1px solid #ccc; + border-radius: 4px; + color: #555; + display: block; + font-size: 11px; + height: 30px; + line-height: 30px; + vertical-align: middle; + margin: 0 0 10px 0; + padding: 0 6px; + width: 74px; +} + +.daterangepicker .ranges ul { + list-style: none; + margin: 0; + padding: 0; +} + +.daterangepicker .ranges li { + font-size: 13px; + background: #f5f5f5; + border: 1px solid #f5f5f5; + color: #08c; + padding: 3px 12px; + margin-bottom: 8px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + cursor: pointer; +} + +.daterangepicker .ranges li.active, .daterangepicker .ranges li:hover { + background: #08c; + border: 1px solid #08c; + color: #fff; +} + +.daterangepicker .calendar-date { + border: 1px solid #ddd; + padding: 4px; + border-radius: 4px; + background: #fff; +} + +.daterangepicker .calendar-time { + text-align: center; + margin: 8px auto 0 auto; + line-height: 30px; +} + +.daterangepicker { + position: absolute; + background: #fff; + top: 100px; + left: 20px; + padding: 4px; + margin-top: 1px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.daterangepicker.opensleft:before { + position: absolute; + top: -7px; + right: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.daterangepicker.opensleft:after { + position: absolute; + top: -6px; + right: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + border-left: 6px solid transparent; + content: ''; +} + +.daterangepicker.openscenter:before { + position: absolute; + top: -7px; + left: 0; + right: 0; + width: 0; + margin-left: auto; + margin-right: auto; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.daterangepicker.openscenter:after { + position: absolute; + top: -6px; + left: 0; + right: 0; + width: 0; + margin-left: auto; + margin-right: auto; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + border-left: 6px solid transparent; + content: ''; +} + +.daterangepicker.opensright:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.daterangepicker.opensright:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + border-left: 6px solid transparent; + content: ''; +} + +.daterangepicker.dropup{ + margin-top: -5px; +} +.daterangepicker.dropup:before{ + top: initial; + bottom:-7px; + border-bottom: initial; + border-top: 7px solid #ccc; +} +.daterangepicker.dropup:after{ + top: initial; + bottom:-6px; + border-bottom: initial; + border-top: 6px solid #fff; +} + +.daterangepicker table { + width: 100%; + margin: 0; +} + +.daterangepicker td, .daterangepicker th { + text-align: center; + width: 20px; + height: 20px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + cursor: pointer; + white-space: nowrap; +} + +.daterangepicker td.off { + color: #999; +} + +.daterangepicker td.disabled, .daterangepicker option.disabled { + color: #999; +} + +.daterangepicker td.available:hover, .daterangepicker th.available:hover { + background: #eee; +} + +.daterangepicker td.in-range { + background: #ebf4f8; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.daterangepicker td.start-date { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.daterangepicker td.end-date { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.daterangepicker td.start-date.end-date { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.daterangepicker td.active, .daterangepicker td.active:hover { + background-color: #357ebd; + border-color: #3071a9; + color: #fff; +} + +.daterangepicker td.week, .daterangepicker th.week { + font-size: 80%; + color: #ccc; +} + +.daterangepicker select.monthselect, .daterangepicker select.yearselect { + font-size: 12px; + padding: 1px; + height: auto; + margin: 0; + cursor: default; +} + +.daterangepicker select.monthselect { + margin-right: 2%; + width: 56%; +} + +.daterangepicker select.yearselect { + width: 40%; +} + +.daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.secondselect, .daterangepicker select.ampmselect { + width: 50px; + margin-bottom: 0; +} + +.daterangepicker_start_input { + float: left; +} + +.daterangepicker_end_input { + float: left; + padding-left: 11px +} + +.daterangepicker th.month { + width: auto; +} diff --git a/theme/bootstrap/plugins/daterangepicker/daterangepicker.js b/theme/bootstrap/plugins/daterangepicker/daterangepicker.js new file mode 100644 index 0000000..228612b --- /dev/null +++ b/theme/bootstrap/plugins/daterangepicker/daterangepicker.js @@ -0,0 +1,1304 @@ +/** +* @version: 1.3.21 +* @author: Dan Grossman http://www.dangrossman.info/ +* @copyright: Copyright (c) 2012-2015 Dan Grossman. All rights reserved. +* @license: Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php +* @website: https://www.improvely.com/ +*/ + +(function(root, factory) { + + if (typeof define === 'function' && define.amd) { + define(['moment', 'jquery', 'exports'], function(momentjs, $, exports) { + root.daterangepicker = factory(root, exports, momentjs, $); + }); + + } else if (typeof exports !== 'undefined') { + var momentjs = require('moment'); + var jQuery; + try { + jQuery = require('jquery'); + } catch (err) { + jQuery = window.jQuery; + if (!jQuery) throw new Error('jQuery dependency not found'); + } + + factory(root, exports, momentjs, jQuery); + + // Finally, as a browser global. + } else { + root.daterangepicker = factory(root, {}, root.moment, (root.jQuery || root.Zepto || root.ender || root.$)); + } + +}(this, function(root, daterangepicker, moment, $) { + + var DateRangePicker = function (element, options, cb) { + + // by default, the daterangepicker element is placed at the bottom of HTML body + this.parentEl = 'body'; + + //element that triggered the date range picker + this.element = $(element); + + //tracks visible state + this.isShowing = false; + + //create the picker HTML object + var DRPTemplate = '<div class="daterangepicker dropdown-menu">' + + '<div class="calendar first left"></div>' + + '<div class="calendar second right"></div>' + + '<div class="ranges">' + + '<div class="range_inputs">' + + '<div class="daterangepicker_start_input">' + + '<label for="daterangepicker_start"></label>' + + '<input class="input-mini" type="text" name="daterangepicker_start" value="" />' + + '</div>' + + '<div class="daterangepicker_end_input">' + + '<label for="daterangepicker_end"></label>' + + '<input class="input-mini" type="text" name="daterangepicker_end" value="" />' + + '</div>' + + '<button class="applyBtn" disabled="disabled"></button>&nbsp;' + + '<button class="cancelBtn"></button>' + + '</div>' + + '</div>' + + '</div>'; + + //custom options + if (typeof options !== 'object' || options === null) + options = {}; + + this.parentEl = (typeof options === 'object' && options.parentEl && $(options.parentEl).length) ? $(options.parentEl) : $(this.parentEl); + this.container = $(DRPTemplate).appendTo(this.parentEl); + + this.setOptions(options, cb); + + //event listeners + this.container.find('.calendar') + .on('click.daterangepicker', '.prev', $.proxy(this.clickPrev, this)) + .on('click.daterangepicker', '.next', $.proxy(this.clickNext, this)) + .on('click.daterangepicker', 'td.available', $.proxy(this.clickDate, this)) + .on('mouseenter.daterangepicker', 'td.available', $.proxy(this.hoverDate, this)) + .on('mouseleave.daterangepicker', 'td.available', $.proxy(this.updateFormInputs, this)) + .on('change.daterangepicker', 'select.yearselect', $.proxy(this.updateMonthYear, this)) + .on('change.daterangepicker', 'select.monthselect', $.proxy(this.updateMonthYear, this)) + .on('change.daterangepicker', 'select.hourselect,select.minuteselect,select.secondselect,select.ampmselect', $.proxy(this.updateTime, this)); + + this.container.find('.ranges') + .on('click.daterangepicker', 'button.applyBtn', $.proxy(this.clickApply, this)) + .on('click.daterangepicker', 'button.cancelBtn', $.proxy(this.clickCancel, this)) + .on('click.daterangepicker', '.daterangepicker_start_input,.daterangepicker_end_input', $.proxy(this.showCalendars, this)) + .on('change.daterangepicker', '.daterangepicker_start_input,.daterangepicker_end_input', $.proxy(this.inputsChanged, this)) + .on('keydown.daterangepicker', '.daterangepicker_start_input,.daterangepicker_end_input', $.proxy(this.inputsKeydown, this)) + .on('click.daterangepicker', 'li', $.proxy(this.clickRange, this)) + .on('mouseenter.daterangepicker', 'li', $.proxy(this.enterRange, this)) + .on('mouseleave.daterangepicker', 'li', $.proxy(this.updateFormInputs, this)); + + if (this.element.is('input')) { + this.element.on({ + 'click.daterangepicker': $.proxy(this.show, this), + 'focus.daterangepicker': $.proxy(this.show, this), + 'keyup.daterangepicker': $.proxy(this.updateFromControl, this), + 'keydown.daterangepicker': $.proxy(this.keydown, this) + }); + } else { + this.element.on('click.daterangepicker', $.proxy(this.toggle, this)); + } + + }; + + DateRangePicker.prototype = { + + constructor: DateRangePicker, + + setOptions: function(options, callback) { + + this.startDate = moment().startOf('day'); + this.endDate = moment().endOf('day'); + this.timeZone = moment().utcOffset(); + this.minDate = false; + this.maxDate = false; + this.dateLimit = false; + + this.showDropdowns = false; + this.showWeekNumbers = false; + this.timePicker = false; + this.timePickerSeconds = false; + this.timePickerIncrement = 30; + this.timePicker12Hour = true; + this.singleDatePicker = false; + this.ranges = {}; + + this.opens = 'right'; + if (this.element.hasClass('pull-right')) + this.opens = 'left'; + + this.drops = 'down'; + if (this.element.hasClass('dropup')) + this.drops = 'up'; + + this.buttonClasses = ['btn', 'btn-small btn-sm']; + this.applyClass = 'btn-success'; + this.cancelClass = 'btn-default'; + + this.format = 'MM/DD/YYYY'; + this.separator = ' - '; + + this.locale = { + applyLabel: 'Apply', + cancelLabel: 'Cancel', + fromLabel: 'From', + toLabel: 'To', + weekLabel: 'W', + customRangeLabel: 'Custom Range', + daysOfWeek: moment.weekdaysMin(), + monthNames: moment.monthsShort(), + firstDay: moment.localeData()._week.dow + }; + + this.cb = function () { }; + + if (typeof options.format === 'string') + this.format = options.format; + + if (typeof options.separator === 'string') + this.separator = options.separator; + + if (typeof options.startDate === 'string') + this.startDate = moment(options.startDate, this.format); + + if (typeof options.endDate === 'string') + this.endDate = moment(options.endDate, this.format); + + if (typeof options.minDate === 'string') + this.minDate = moment(options.minDate, this.format); + + if (typeof options.maxDate === 'string') + this.maxDate = moment(options.maxDate, this.format); + + if (typeof options.startDate === 'object') + this.startDate = moment(options.startDate); + + if (typeof options.endDate === 'object') + this.endDate = moment(options.endDate); + + if (typeof options.minDate === 'object') + this.minDate = moment(options.minDate); + + if (typeof options.maxDate === 'object') + this.maxDate = moment(options.maxDate); + + if (typeof options.applyClass === 'string') + this.applyClass = options.applyClass; + + if (typeof options.cancelClass === 'string') + this.cancelClass = options.cancelClass; + + if (typeof options.dateLimit === 'object') + this.dateLimit = options.dateLimit; + + if (typeof options.locale === 'object') { + + if (typeof options.locale.daysOfWeek === 'object') { + // Create a copy of daysOfWeek to avoid modification of original + // options object for reusability in multiple daterangepicker instances + this.locale.daysOfWeek = options.locale.daysOfWeek.slice(); + } + + if (typeof options.locale.monthNames === 'object') { + this.locale.monthNames = options.locale.monthNames.slice(); + } + + if (typeof options.locale.firstDay === 'number') { + this.locale.firstDay = options.locale.firstDay; + } + + if (typeof options.locale.applyLabel === 'string') { + this.locale.applyLabel = options.locale.applyLabel; + } + + if (typeof options.locale.cancelLabel === 'string') { + this.locale.cancelLabel = options.locale.cancelLabel; + } + + if (typeof options.locale.fromLabel === 'string') { + this.locale.fromLabel = options.locale.fromLabel; + } + + if (typeof options.locale.toLabel === 'string') { + this.locale.toLabel = options.locale.toLabel; + } + + if (typeof options.locale.weekLabel === 'string') { + this.locale.weekLabel = options.locale.weekLabel; + } + + if (typeof options.locale.customRangeLabel === 'string') { + this.locale.customRangeLabel = options.locale.customRangeLabel; + } + } + + if (typeof options.opens === 'string') + this.opens = options.opens; + + if (typeof options.drops === 'string') + this.drops = options.drops; + + if (typeof options.showWeekNumbers === 'boolean') { + this.showWeekNumbers = options.showWeekNumbers; + } + + if (typeof options.buttonClasses === 'string') { + this.buttonClasses = [options.buttonClasses]; + } + + if (typeof options.buttonClasses === 'object') { + this.buttonClasses = options.buttonClasses; + } + + if (typeof options.showDropdowns === 'boolean') { + this.showDropdowns = options.showDropdowns; + } + + if (typeof options.singleDatePicker === 'boolean') { + this.singleDatePicker = options.singleDatePicker; + if (this.singleDatePicker) { + this.endDate = this.startDate.clone(); + } + } + + if (typeof options.timePicker === 'boolean') { + this.timePicker = options.timePicker; + } + + if (typeof options.timePickerSeconds === 'boolean') { + this.timePickerSeconds = options.timePickerSeconds; + } + + if (typeof options.timePickerIncrement === 'number') { + this.timePickerIncrement = options.timePickerIncrement; + } + + if (typeof options.timePicker12Hour === 'boolean') { + this.timePicker12Hour = options.timePicker12Hour; + } + + // update day names order to firstDay + if (this.locale.firstDay != 0) { + var iterator = this.locale.firstDay; + while (iterator > 0) { + this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift()); + iterator--; + } + } + + var start, end, range; + + //if no start/end dates set, check if an input element contains initial values + if (typeof options.startDate === 'undefined' && typeof options.endDate === 'undefined') { + if ($(this.element).is('input[type=text]')) { + var val = $(this.element).val(), + split = val.split(this.separator); + + start = end = null; + + if (split.length == 2) { + start = moment(split[0], this.format); + end = moment(split[1], this.format); + } else if (this.singleDatePicker && val !== "") { + start = moment(val, this.format); + end = moment(val, this.format); + } + if (start !== null && end !== null) { + this.startDate = start; + this.endDate = end; + } + } + } + + // bind the time zone used to build the calendar to either the timeZone passed in through the options or the zone of the startDate (which will be the local time zone by default) + if (typeof options.timeZone === 'string' || typeof options.timeZone === 'number') { + if (typeof options.timeZone === 'string' && typeof moment.tz !== 'undefined') { + this.timeZone = moment.tz.zone(options.timeZone).parse(new Date) * -1; // Offset is positive if the timezone is behind UTC and negative if it is ahead. + } else { + this.timeZone = options.timeZone; + } + this.startDate.utcOffset(this.timeZone); + this.endDate.utcOffset(this.timeZone); + } else { + this.timeZone = moment(this.startDate).utcOffset(); + } + + if (typeof options.ranges === 'object') { + for (range in options.ranges) { + + if (typeof options.ranges[range][0] === 'string') + start = moment(options.ranges[range][0], this.format); + else + start = moment(options.ranges[range][0]); + + if (typeof options.ranges[range][1] === 'string') + end = moment(options.ranges[range][1], this.format); + else + end = moment(options.ranges[range][1]); + + // If we have a min/max date set, bound this range + // to it, but only if it would otherwise fall + // outside of the min/max. + if (this.minDate && start.isBefore(this.minDate)) + start = moment(this.minDate); + + if (this.maxDate && end.isAfter(this.maxDate)) + end = moment(this.maxDate); + + // If the end of the range is before the minimum (if min is set) OR + // the start of the range is after the max (also if set) don't display this + // range option. + if ((this.minDate && end.isBefore(this.minDate)) || (this.maxDate && start.isAfter(this.maxDate))) { + continue; + } + + this.ranges[range] = [start, end]; + } + + var list = '<ul>'; + for (range in this.ranges) { + list += '<li>' + range + '</li>'; + } + list += '<li>' + this.locale.customRangeLabel + '</li>'; + list += '</ul>'; + this.container.find('.ranges ul').remove(); + this.container.find('.ranges').prepend(list); + } + + if (typeof callback === 'function') { + this.cb = callback; + } + + if (!this.timePicker) { + this.startDate = this.startDate.startOf('day'); + this.endDate = this.endDate.endOf('day'); + } + + if (this.singleDatePicker) { + this.opens = 'right'; + this.container.addClass('single'); + this.container.find('.calendar.right').show(); + this.container.find('.calendar.left').hide(); + if (!this.timePicker) { + this.container.find('.ranges').hide(); + } else { + this.container.find('.ranges .daterangepicker_start_input, .ranges .daterangepicker_end_input').hide(); + } + if (!this.container.find('.calendar.right').hasClass('single')) + this.container.find('.calendar.right').addClass('single'); + } else { + this.container.removeClass('single'); + this.container.find('.calendar.right').removeClass('single'); + this.container.find('.ranges').show(); + } + + this.oldStartDate = this.startDate.clone(); + this.oldEndDate = this.endDate.clone(); + this.oldChosenLabel = this.chosenLabel; + + this.leftCalendar = { + month: moment([this.startDate.year(), this.startDate.month(), 1, this.startDate.hour(), this.startDate.minute(), this.startDate.second()]), + calendar: [] + }; + + this.rightCalendar = { + month: moment([this.endDate.year(), this.endDate.month(), 1, this.endDate.hour(), this.endDate.minute(), this.endDate.second()]), + calendar: [] + }; + + if (this.opens == 'right' || this.opens == 'center') { + //swap calendar positions + var first = this.container.find('.calendar.first'); + var second = this.container.find('.calendar.second'); + + if (second.hasClass('single')) { + second.removeClass('single'); + first.addClass('single'); + } + + first.removeClass('left').addClass('right'); + second.removeClass('right').addClass('left'); + + if (this.singleDatePicker) { + first.show(); + second.hide(); + } + } + + if (typeof options.ranges === 'undefined' && !this.singleDatePicker) { + this.container.addClass('show-calendar'); + } + + this.container.removeClass('opensleft opensright').addClass('opens' + this.opens); + + this.updateView(); + this.updateCalendars(); + + //apply CSS classes and labels to buttons + var c = this.container; + $.each(this.buttonClasses, function (idx, val) { + c.find('button').addClass(val); + }); + this.container.find('.daterangepicker_start_input label').html(this.locale.fromLabel); + this.container.find('.daterangepicker_end_input label').html(this.locale.toLabel); + if (this.applyClass.length) + this.container.find('.applyBtn').addClass(this.applyClass); + if (this.cancelClass.length) + this.container.find('.cancelBtn').addClass(this.cancelClass); + this.container.find('.applyBtn').html(this.locale.applyLabel); + this.container.find('.cancelBtn').html(this.locale.cancelLabel); + }, + + setStartDate: function(startDate) { + if (typeof startDate === 'string') + this.startDate = moment(startDate, this.format).utcOffset(this.timeZone); + + if (typeof startDate === 'object') + this.startDate = moment(startDate); + + if (!this.timePicker) + this.startDate = this.startDate.startOf('day'); + + this.oldStartDate = this.startDate.clone(); + + this.updateView(); + this.updateCalendars(); + this.updateInputText(); + }, + + setEndDate: function(endDate) { + if (typeof endDate === 'string') + this.endDate = moment(endDate, this.format).utcOffset(this.timeZone); + + if (typeof endDate === 'object') + this.endDate = moment(endDate); + + if (!this.timePicker) + this.endDate = this.endDate.endOf('day'); + + this.oldEndDate = this.endDate.clone(); + + this.updateView(); + this.updateCalendars(); + this.updateInputText(); + }, + + updateView: function () { + this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()).hour(this.startDate.hour()).minute(this.startDate.minute()); + this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()).hour(this.endDate.hour()).minute(this.endDate.minute()); + this.updateFormInputs(); + }, + + updateFormInputs: function () { + this.container.find('input[name=daterangepicker_start]').val(this.startDate.format(this.format)); + this.container.find('input[name=daterangepicker_end]').val(this.endDate.format(this.format)); + + if (this.startDate.isSame(this.endDate) || this.startDate.isBefore(this.endDate)) { + this.container.find('button.applyBtn').removeAttr('disabled'); + } else { + this.container.find('button.applyBtn').attr('disabled', 'disabled'); + } + }, + + updateFromControl: function () { + if (!this.element.is('input')) return; + if (!this.element.val().length) return; + + var dateString = this.element.val().split(this.separator), + start = null, + end = null; + + if(dateString.length === 2) { + start = moment(dateString[0], this.format).utcOffset(this.timeZone); + end = moment(dateString[1], this.format).utcOffset(this.timeZone); + } + + if (this.singleDatePicker || start === null || end === null) { + start = moment(this.element.val(), this.format).utcOffset(this.timeZone); + end = start; + } + + if (end.isBefore(start)) return; + + this.oldStartDate = this.startDate.clone(); + this.oldEndDate = this.endDate.clone(); + + this.startDate = start; + this.endDate = end; + + if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate)) + this.notify(); + + this.updateCalendars(); + }, + + keydown: function (e) { + //hide on tab or enter + if ((e.keyCode === 9) || (e.keyCode === 13)) { + this.hide(); + } + }, + + notify: function () { + this.updateView(); + this.cb(this.startDate, this.endDate, this.chosenLabel); + }, + + move: function () { + var parentOffset = { top: 0, left: 0 }, + containerTop; + var parentRightEdge = $(window).width(); + if (!this.parentEl.is('body')) { + parentOffset = { + top: this.parentEl.offset().top - this.parentEl.scrollTop(), + left: this.parentEl.offset().left - this.parentEl.scrollLeft() + }; + parentRightEdge = this.parentEl[0].clientWidth + this.parentEl.offset().left; + } + + if (this.drops == 'up') + containerTop = this.element.offset().top - this.container.outerHeight() - parentOffset.top; + else + containerTop = this.element.offset().top + this.element.outerHeight() - parentOffset.top; + this.container[this.drops == 'up' ? 'addClass' : 'removeClass']('dropup'); + + if (this.opens == 'left') { + this.container.css({ + top: containerTop, + right: parentRightEdge - this.element.offset().left - this.element.outerWidth(), + left: 'auto' + }); + if (this.container.offset().left < 0) { + this.container.css({ + right: 'auto', + left: 9 + }); + } + } else if (this.opens == 'center') { + this.container.css({ + top: containerTop, + left: this.element.offset().left - parentOffset.left + this.element.outerWidth() / 2 + - this.container.outerWidth() / 2, + right: 'auto' + }); + if (this.container.offset().left < 0) { + this.container.css({ + right: 'auto', + left: 9 + }); + } + } else { + this.container.css({ + top: containerTop, + left: this.element.offset().left - parentOffset.left, + right: 'auto' + }); + if (this.container.offset().left + this.container.outerWidth() > $(window).width()) { + this.container.css({ + left: 'auto', + right: 0 + }); + } + } + }, + + toggle: function (e) { + if (this.element.hasClass('active')) { + this.hide(); + } else { + this.show(); + } + }, + + show: function (e) { + if (this.isShowing) return; + + this.element.addClass('active'); + this.container.show(); + this.move(); + + // Create a click proxy that is private to this instance of datepicker, for unbinding + this._outsideClickProxy = $.proxy(function (e) { this.outsideClick(e); }, this); + // Bind global datepicker mousedown for hiding and + $(document) + .on('mousedown.daterangepicker', this._outsideClickProxy) + // also support mobile devices + .on('touchend.daterangepicker', this._outsideClickProxy) + // also explicitly play nice with Bootstrap dropdowns, which stopPropagation when clicking them + .on('click.daterangepicker', '[data-toggle=dropdown]', this._outsideClickProxy) + // and also close when focus changes to outside the picker (eg. tabbing between controls) + .on('focusin.daterangepicker', this._outsideClickProxy); + + this.isShowing = true; + this.element.trigger('show.daterangepicker', this); + }, + + outsideClick: function (e) { + var target = $(e.target); + // if the page is clicked anywhere except within the daterangerpicker/button + // itself then call this.hide() + if ( + // ie modal dialog fix + e.type == "focusin" || + target.closest(this.element).length || + target.closest(this.container).length || + target.closest('.calendar-date').length + ) return; + this.hide(); + }, + + hide: function (e) { + if (!this.isShowing) return; + + $(document) + .off('.daterangepicker'); + + this.element.removeClass('active'); + this.container.hide(); + + if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate)) + this.notify(); + + this.oldStartDate = this.startDate.clone(); + this.oldEndDate = this.endDate.clone(); + + this.isShowing = false; + this.element.trigger('hide.daterangepicker', this); + }, + + enterRange: function (e) { + // mouse pointer has entered a range label + var label = e.target.innerHTML; + if (label == this.locale.customRangeLabel) { + this.updateView(); + } else { + var dates = this.ranges[label]; + this.container.find('input[name=daterangepicker_start]').val(dates[0].format(this.format)); + this.container.find('input[name=daterangepicker_end]').val(dates[1].format(this.format)); + } + }, + + showCalendars: function() { + this.container.addClass('show-calendar'); + this.move(); + this.element.trigger('showCalendar.daterangepicker', this); + }, + + hideCalendars: function() { + this.container.removeClass('show-calendar'); + this.element.trigger('hideCalendar.daterangepicker', this); + }, + + // when a date is typed into the start to end date textboxes + inputsChanged: function (e) { + var el = $(e.target); + var date = moment(el.val(), this.format); + if (!date.isValid()) return; + + var startDate, endDate; + if (el.attr('name') === 'daterangepicker_start') { + startDate = (false !== this.minDate && date.isBefore(this.minDate)) ? this.minDate : date; + endDate = this.endDate; + } else { + startDate = this.startDate; + endDate = (false !== this.maxDate && date.isAfter(this.maxDate)) ? this.maxDate : date; + } + this.setCustomDates(startDate, endDate); + }, + + inputsKeydown: function(e) { + if (e.keyCode === 13) { + this.inputsChanged(e); + this.notify(); + } + }, + + updateInputText: function() { + if (this.element.is('input') && !this.singleDatePicker) { + this.element.val(this.startDate.format(this.format) + this.separator + this.endDate.format(this.format)); + this.element.trigger('change'); + } else if (this.element.is('input')) { + this.element.val(this.endDate.format(this.format)); + this.element.trigger('change'); + } + }, + + clickRange: function (e) { + var label = e.target.innerHTML; + this.chosenLabel = label; + if (label == this.locale.customRangeLabel) { + this.showCalendars(); + } else { + var dates = this.ranges[label]; + + this.startDate = dates[0]; + this.endDate = dates[1]; + + if (!this.timePicker) { + this.startDate.startOf('day'); + this.endDate.endOf('day'); + } + + this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()).hour(this.startDate.hour()).minute(this.startDate.minute()); + this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()).hour(this.endDate.hour()).minute(this.endDate.minute()); + this.updateCalendars(); + + this.updateInputText(); + + this.hideCalendars(); + this.hide(); + this.element.trigger('apply.daterangepicker', this); + } + }, + + clickPrev: function (e) { + var cal = $(e.target).parents('.calendar'); + if (cal.hasClass('left')) { + this.leftCalendar.month.subtract(1, 'month'); + } else { + this.rightCalendar.month.subtract(1, 'month'); + } + this.updateCalendars(); + }, + + clickNext: function (e) { + var cal = $(e.target).parents('.calendar'); + if (cal.hasClass('left')) { + this.leftCalendar.month.add(1, 'month'); + } else { + this.rightCalendar.month.add(1, 'month'); + } + this.updateCalendars(); + }, + + hoverDate: function (e) { + var title = $(e.target).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(e.target).parents('.calendar'); + + if (cal.hasClass('left')) { + this.container.find('input[name=daterangepicker_start]').val(this.leftCalendar.calendar[row][col].format(this.format)); + } else { + this.container.find('input[name=daterangepicker_end]').val(this.rightCalendar.calendar[row][col].format(this.format)); + } + }, + + setCustomDates: function(startDate, endDate) { + this.chosenLabel = this.locale.customRangeLabel; + if (startDate.isAfter(endDate)) { + var difference = this.endDate.diff(this.startDate); + endDate = moment(startDate).add(difference, 'ms'); + if (this.maxDate && endDate.isAfter(this.maxDate)) { + endDate = this.maxDate.clone(); + } + } + this.startDate = startDate; + this.endDate = endDate; + + this.updateView(); + this.updateCalendars(); + }, + + clickDate: function (e) { + var title = $(e.target).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(e.target).parents('.calendar'); + + var startDate, endDate; + if (cal.hasClass('left')) { + startDate = this.leftCalendar.calendar[row][col]; + endDate = this.endDate; + if (typeof this.dateLimit === 'object') { + var maxDate = moment(startDate).add(this.dateLimit).startOf('day'); + if (endDate.isAfter(maxDate)) { + endDate = maxDate; + } + } + } else { + startDate = this.startDate; + endDate = this.rightCalendar.calendar[row][col]; + if (typeof this.dateLimit === 'object') { + var minDate = moment(endDate).subtract(this.dateLimit).startOf('day'); + if (startDate.isBefore(minDate)) { + startDate = minDate; + } + } + } + + if (this.singleDatePicker && cal.hasClass('left')) { + endDate = startDate.clone(); + } else if (this.singleDatePicker && cal.hasClass('right')) { + startDate = endDate.clone(); + } + + cal.find('td').removeClass('active'); + + $(e.target).addClass('active'); + + this.setCustomDates(startDate, endDate); + + if (!this.timePicker) + endDate.endOf('day'); + + if (this.singleDatePicker && !this.timePicker) + this.clickApply(); + }, + + clickApply: function (e) { + this.updateInputText(); + this.hide(); + this.element.trigger('apply.daterangepicker', this); + }, + + clickCancel: function (e) { + this.startDate = this.oldStartDate; + this.endDate = this.oldEndDate; + this.chosenLabel = this.oldChosenLabel; + this.updateView(); + this.updateCalendars(); + this.hide(); + this.element.trigger('cancel.daterangepicker', this); + }, + + updateMonthYear: function (e) { + var isLeft = $(e.target).closest('.calendar').hasClass('left'), + leftOrRight = isLeft ? 'left' : 'right', + cal = this.container.find('.calendar.'+leftOrRight); + + // Month must be Number for new moment versions + var month = parseInt(cal.find('.monthselect').val(), 10); + var year = cal.find('.yearselect').val(); + + if (!isLeft && !this.singleDatePicker) { + if (year < this.startDate.year() || (year == this.startDate.year() && month < this.startDate.month())) { + month = this.startDate.month(); + year = this.startDate.year(); + } + } + + if (this.minDate) { + if (year < this.minDate.year() || (year == this.minDate.year() && month < this.minDate.month())) { + month = this.minDate.month(); + year = this.minDate.year(); + } + } + + if (this.maxDate) { + if (year > this.maxDate.year() || (year == this.maxDate.year() && month > this.maxDate.month())) { + month = this.maxDate.month(); + year = this.maxDate.year(); + } + } + + + this[leftOrRight+'Calendar'].month.month(month).year(year); + this.updateCalendars(); + }, + + updateTime: function(e) { + + var cal = $(e.target).closest('.calendar'), + isLeft = cal.hasClass('left'); + + var hour = parseInt(cal.find('.hourselect').val(), 10); + var minute = parseInt(cal.find('.minuteselect').val(), 10); + var second = 0; + + if (this.timePickerSeconds) { + second = parseInt(cal.find('.secondselect').val(), 10); + } + + if (this.timePicker12Hour) { + var ampm = cal.find('.ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + + if (isLeft) { + var start = this.startDate.clone(); + start.hour(hour); + start.minute(minute); + start.second(second); + this.startDate = start; + this.leftCalendar.month.hour(hour).minute(minute).second(second); + if (this.singleDatePicker) + this.endDate = start.clone(); + } else { + var end = this.endDate.clone(); + end.hour(hour); + end.minute(minute); + end.second(second); + this.endDate = end; + if (this.singleDatePicker) + this.startDate = end.clone(); + this.rightCalendar.month.hour(hour).minute(minute).second(second); + } + + this.updateView(); + this.updateCalendars(); + }, + + updateCalendars: function () { + this.leftCalendar.calendar = this.buildCalendar(this.leftCalendar.month.month(), this.leftCalendar.month.year(), this.leftCalendar.month.hour(), this.leftCalendar.month.minute(), this.leftCalendar.month.second(), 'left'); + this.rightCalendar.calendar = this.buildCalendar(this.rightCalendar.month.month(), this.rightCalendar.month.year(), this.rightCalendar.month.hour(), this.rightCalendar.month.minute(), this.rightCalendar.month.second(), 'right'); + this.container.find('.calendar.left').empty().html(this.renderCalendar(this.leftCalendar.calendar, this.startDate, this.minDate, this.maxDate, 'left')); + this.container.find('.calendar.right').empty().html(this.renderCalendar(this.rightCalendar.calendar, this.endDate, this.singleDatePicker ? this.minDate : this.startDate, this.maxDate, 'right')); + + this.container.find('.ranges li').removeClass('active'); + var customRange = true; + var i = 0; + for (var range in this.ranges) { + if (this.timePicker) { + if (this.startDate.isSame(this.ranges[range][0]) && this.endDate.isSame(this.ranges[range][1])) { + customRange = false; + this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')') + .addClass('active').html(); + } + } else { + //ignore times when comparing dates if time picker is not enabled + if (this.startDate.format('YYYY-MM-DD') == this.ranges[range][0].format('YYYY-MM-DD') && this.endDate.format('YYYY-MM-DD') == this.ranges[range][1].format('YYYY-MM-DD')) { + customRange = false; + this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')') + .addClass('active').html(); + } + } + i++; + } + if (customRange) { + this.chosenLabel = this.container.find('.ranges li:last').addClass('active').html(); + this.showCalendars(); + } + }, + + buildCalendar: function (month, year, hour, minute, second, side) { + var daysInMonth = moment([year, month]).daysInMonth(); + var firstDay = moment([year, month, 1]); + var lastDay = moment([year, month, daysInMonth]); + var lastMonth = moment(firstDay).subtract(1, 'month').month(); + var lastYear = moment(firstDay).subtract(1, 'month').year(); + + var daysInLastMonth = moment([lastYear, lastMonth]).daysInMonth(); + + var dayOfWeek = firstDay.day(); + + var i; + + //initialize a 6 rows x 7 columns array for the calendar + var calendar = []; + calendar.firstDay = firstDay; + calendar.lastDay = lastDay; + + for (i = 0; i < 6; i++) { + calendar[i] = []; + } + + //populate the calendar with date objects + var startDay = daysInLastMonth - dayOfWeek + this.locale.firstDay + 1; + if (startDay > daysInLastMonth) + startDay -= 7; + + if (dayOfWeek == this.locale.firstDay) + startDay = daysInLastMonth - 6; + + var curDate = moment([lastYear, lastMonth, startDay, 12, minute, second]).utcOffset(this.timeZone); + + var col, row; + for (i = 0, col = 0, row = 0; i < 42; i++, col++, curDate = moment(curDate).add(24, 'hour')) { + if (i > 0 && col % 7 === 0) { + col = 0; + row++; + } + calendar[row][col] = curDate.clone().hour(hour); + curDate.hour(12); + + if (this.minDate && calendar[row][col].format('YYYY-MM-DD') == this.minDate.format('YYYY-MM-DD') && calendar[row][col].isBefore(this.minDate) && side == 'left') { + calendar[row][col] = this.minDate.clone(); + } + + if (this.maxDate && calendar[row][col].format('YYYY-MM-DD') == this.maxDate.format('YYYY-MM-DD') && calendar[row][col].isAfter(this.maxDate) && side == 'right') { + calendar[row][col] = this.maxDate.clone(); + } + + } + + return calendar; + }, + + renderDropdowns: function (selected, minDate, maxDate) { + var currentMonth = selected.month(); + var currentYear = selected.year(); + var maxYear = (maxDate && maxDate.year()) || (currentYear + 5); + var minYear = (minDate && minDate.year()) || (currentYear - 50); + + var monthHtml = '<select class="monthselect">'; + var inMinYear = currentYear == minYear; + var inMaxYear = currentYear == maxYear; + + for (var m = 0; m < 12; m++) { + if ((!inMinYear || m >= minDate.month()) && (!inMaxYear || m <= maxDate.month())) { + monthHtml += "<option value='" + m + "'" + + (m === currentMonth ? " selected='selected'" : "") + + ">" + this.locale.monthNames[m] + "</option>"; + } + } + monthHtml += "</select>"; + + var yearHtml = '<select class="yearselect">'; + + for (var y = minYear; y <= maxYear; y++) { + yearHtml += '<option value="' + y + '"' + + (y === currentYear ? ' selected="selected"' : '') + + '>' + y + '</option>'; + } + + yearHtml += '</select>'; + + return monthHtml + yearHtml; + }, + + renderCalendar: function (calendar, selected, minDate, maxDate, side) { + + var html = '<div class="calendar-date">'; + html += '<table class="table-condensed">'; + html += '<thead>'; + html += '<tr>'; + + // add empty cell for week number + if (this.showWeekNumbers) + html += '<th></th>'; + + if (!minDate || minDate.isBefore(calendar.firstDay)) { + html += '<th class="prev available"><i class="fa fa-arrow-left icon icon-arrow-left glyphicon glyphicon-arrow-left"></i></th>'; + } else { + html += '<th></th>'; + } + + var dateHtml = this.locale.monthNames[calendar[1][1].month()] + calendar[1][1].format(" YYYY"); + + if (this.showDropdowns) { + dateHtml = this.renderDropdowns(calendar[1][1], minDate, maxDate); + } + + html += '<th colspan="5" class="month">' + dateHtml + '</th>'; + if (!maxDate || maxDate.isAfter(calendar.lastDay)) { + html += '<th class="next available"><i class="fa fa-arrow-right icon icon-arrow-right glyphicon glyphicon-arrow-right"></i></th>'; + } else { + html += '<th></th>'; + } + + html += '</tr>'; + html += '<tr>'; + + // add week number label + if (this.showWeekNumbers) + html += '<th class="week">' + this.locale.weekLabel + '</th>'; + + $.each(this.locale.daysOfWeek, function (index, dayOfWeek) { + html += '<th>' + dayOfWeek + '</th>'; + }); + + html += '</tr>'; + html += '</thead>'; + html += '<tbody>'; + + for (var row = 0; row < 6; row++) { + html += '<tr>'; + + // add week number + if (this.showWeekNumbers) + html += '<td class="week">' + calendar[row][0].week() + '</td>'; + + for (var col = 0; col < 7; col++) { + var cname = 'available '; + cname += (calendar[row][col].month() == calendar[1][1].month()) ? '' : 'off'; + + if ((minDate && calendar[row][col].isBefore(minDate, 'day')) || (maxDate && calendar[row][col].isAfter(maxDate, 'day'))) { + cname = ' off disabled '; + } else if (calendar[row][col].format('YYYY-MM-DD') == selected.format('YYYY-MM-DD')) { + cname += ' active '; + if (calendar[row][col].format('YYYY-MM-DD') == this.startDate.format('YYYY-MM-DD')) { + cname += ' start-date '; + } + if (calendar[row][col].format('YYYY-MM-DD') == this.endDate.format('YYYY-MM-DD')) { + cname += ' end-date '; + } + } else if (calendar[row][col] >= this.startDate && calendar[row][col] <= this.endDate) { + cname += ' in-range '; + if (calendar[row][col].isSame(this.startDate)) { cname += ' start-date '; } + if (calendar[row][col].isSame(this.endDate)) { cname += ' end-date '; } + } + + var title = 'r' + row + 'c' + col; + html += '<td class="' + cname.replace(/\s+/g, ' ').replace(/^\s?(.*?)\s?$/, '$1') + '" data-title="' + title + '">' + calendar[row][col].date() + '</td>'; + } + html += '</tr>'; + } + + html += '</tbody>'; + html += '</table>'; + html += '</div>'; + + var i; + if (this.timePicker) { + + html += '<div class="calendar-time">'; + html += '<select class="hourselect">'; + + // Disallow selections before the minDate or after the maxDate + var min_hour = 0; + var max_hour = 23; + + if (minDate && (side == 'left' || this.singleDatePicker) && selected.format('YYYY-MM-DD') == minDate.format('YYYY-MM-DD')) { + min_hour = minDate.hour(); + if (selected.hour() < min_hour) + selected.hour(min_hour); + if (this.timePicker12Hour && min_hour >= 12 && selected.hour() >= 12) + min_hour -= 12; + if (this.timePicker12Hour && min_hour == 12) + min_hour = 1; + } + + if (maxDate && (side == 'right' || this.singleDatePicker) && selected.format('YYYY-MM-DD') == maxDate.format('YYYY-MM-DD')) { + max_hour = maxDate.hour(); + if (selected.hour() > max_hour) + selected.hour(max_hour); + if (this.timePicker12Hour && max_hour >= 12 && selected.hour() >= 12) + max_hour -= 12; + } + + var start = 0; + var end = 23; + var selected_hour = selected.hour(); + if (this.timePicker12Hour) { + start = 1; + end = 12; + if (selected_hour >= 12) + selected_hour -= 12; + if (selected_hour === 0) + selected_hour = 12; + } + + for (i = start; i <= end; i++) { + + if (i == selected_hour) { + html += '<option value="' + i + '" selected="selected">' + i + '</option>'; + } else if (i < min_hour || i > max_hour) { + html += '<option value="' + i + '" disabled="disabled" class="disabled">' + i + '</option>'; + } else { + html += '<option value="' + i + '">' + i + '</option>'; + } + } + + html += '</select> : '; + + html += '<select class="minuteselect">'; + + // Disallow selections before the minDate or after the maxDate + var min_minute = 0; + var max_minute = 59; + + if (minDate && (side == 'left' || this.singleDatePicker) && selected.format('YYYY-MM-DD h A') == minDate.format('YYYY-MM-DD h A')) { + min_minute = minDate.minute(); + if (selected.minute() < min_minute) + selected.minute(min_minute); + } + + if (maxDate && (side == 'right' || this.singleDatePicker) && selected.format('YYYY-MM-DD h A') == maxDate.format('YYYY-MM-DD h A')) { + max_minute = maxDate.minute(); + if (selected.minute() > max_minute) + selected.minute(max_minute); + } + + for (i = 0; i < 60; i += this.timePickerIncrement) { + var num = i; + if (num < 10) + num = '0' + num; + if (i == selected.minute()) { + html += '<option value="' + i + '" selected="selected">' + num + '</option>'; + } else if (i < min_minute || i > max_minute) { + html += '<option value="' + i + '" disabled="disabled" class="disabled">' + num + '</option>'; + } else { + html += '<option value="' + i + '">' + num + '</option>'; + } + } + + html += '</select> '; + + if (this.timePickerSeconds) { + html += ': <select class="secondselect">'; + + for (i = 0; i < 60; i += this.timePickerIncrement) { + var num = i; + if (num < 10) + num = '0' + num; + if (i == selected.second()) { + html += '<option value="' + i + '" selected="selected">' + num + '</option>'; + } else { + html += '<option value="' + i + '">' + num + '</option>'; + } + } + + html += '</select>'; + } + + if (this.timePicker12Hour) { + html += '<select class="ampmselect">'; + + // Disallow selection before the minDate or after the maxDate + var am_html = ''; + var pm_html = ''; + + if (minDate && (side == 'left' || this.singleDatePicker) && selected.format('YYYY-MM-DD') == minDate.format('YYYY-MM-DD') && minDate.hour() >= 12) { + am_html = ' disabled="disabled" class="disabled"'; + } + + if (maxDate && (side == 'right' || this.singleDatePicker) && selected.format('YYYY-MM-DD') == maxDate.format('YYYY-MM-DD') && maxDate.hour() < 12) { + pm_html = ' disabled="disabled" class="disabled"'; + } + + if (selected.hour() >= 12) { + html += '<option value="AM"' + am_html + '>AM</option><option value="PM" selected="selected"' + pm_html + '>PM</option>'; + } else { + html += '<option value="AM" selected="selected"' + am_html + '>AM</option><option value="PM"' + pm_html + '>PM</option>'; + } + html += '</select>'; + } + + html += '</div>'; + + } + + return html; + + }, + + remove: function() { + + this.container.remove(); + this.element.off('.daterangepicker'); + this.element.removeData('daterangepicker'); + + } + + }; + + $.fn.daterangepicker = function (options, cb) { + this.each(function () { + var el = $(this); + if (el.data('daterangepicker')) + el.data('daterangepicker').remove(); + el.data('daterangepicker', new DateRangePicker(el, options, cb)); + }); + return this; + }; + +})); diff --git a/theme/bootstrap/plugins/daterangepicker/moment.js b/theme/bootstrap/plugins/daterangepicker/moment.js new file mode 100644 index 0000000..c635ec0 --- /dev/null +++ b/theme/bootstrap/plugins/daterangepicker/moment.js @@ -0,0 +1,3043 @@ +//! moment.js +//! version : 2.9.0 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com + +(function (undefined) { + /************************************ + Constants + ************************************/ + + var moment, + VERSION = '2.9.0', + // the global-scope this is NOT the global object in Node.js + globalScope = (typeof global !== 'undefined' && (typeof window === 'undefined' || window === global.window)) ? global : this, + oldGlobalMoment, + round = Math.round, + hasOwnProperty = Object.prototype.hasOwnProperty, + i, + + YEAR = 0, + MONTH = 1, + DATE = 2, + HOUR = 3, + MINUTE = 4, + SECOND = 5, + MILLISECOND = 6, + + // internal storage for locale config files + locales = {}, + + // extra moment internal properties (plugins register props here) + momentProperties = [], + + // check for nodeJS + hasModule = (typeof module !== 'undefined' && module && module.exports), + + // ASP.NET json date format regex + aspNetJsonRegex = /^\/?Date\((\-?\d+)/i, + aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/, + + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/, + + // format tokens + formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g, + localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, + + // parsing token regexes + parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99 + parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999 + parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999 + parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999 + parseTokenDigits = /\d+/, // nonzero number of digits + parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic. + parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z + parseTokenT = /T/i, // T (ISO separator) + parseTokenOffsetMs = /[\+\-]?\d+/, // 1234567890123 + parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 + + //strict parsing regexes + parseTokenOneDigit = /\d/, // 0 - 9 + parseTokenTwoDigits = /\d\d/, // 00 - 99 + parseTokenThreeDigits = /\d{3}/, // 000 - 999 + parseTokenFourDigits = /\d{4}/, // 0000 - 9999 + parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999 + parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf + + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/, + + isoFormat = 'YYYY-MM-DDTHH:mm:ssZ', + + isoDates = [ + ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/], + ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/], + ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/], + ['GGGG-[W]WW', /\d{4}-W\d{2}/], + ['YYYY-DDD', /\d{4}-\d{3}/] + ], + + // iso time formats and regexes + isoTimes = [ + ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/], + ['HH:mm', /(T| )\d\d:\d\d/], + ['HH', /(T| )\d\d/] + ], + + // timezone chunker '+10:00' > ['10', '00'] or '-1530' > ['-', '15', '30'] + parseTimezoneChunker = /([\+\-]|\d\d)/gi, + + // getter and setter names + proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'), + unitMillisecondFactors = { + 'Milliseconds' : 1, + 'Seconds' : 1e3, + 'Minutes' : 6e4, + 'Hours' : 36e5, + 'Days' : 864e5, + 'Months' : 2592e6, + 'Years' : 31536e6 + }, + + unitAliases = { + ms : 'millisecond', + s : 'second', + m : 'minute', + h : 'hour', + d : 'day', + D : 'date', + w : 'week', + W : 'isoWeek', + M : 'month', + Q : 'quarter', + y : 'year', + DDD : 'dayOfYear', + e : 'weekday', + E : 'isoWeekday', + gg: 'weekYear', + GG: 'isoWeekYear' + }, + + camelFunctions = { + dayofyear : 'dayOfYear', + isoweekday : 'isoWeekday', + isoweek : 'isoWeek', + weekyear : 'weekYear', + isoweekyear : 'isoWeekYear' + }, + + // format function strings + formatFunctions = {}, + + // default relative time thresholds + relativeTimeThresholds = { + s: 45, // seconds to minute + m: 45, // minutes to hour + h: 22, // hours to day + d: 26, // days to month + M: 11 // months to year + }, + + // tokens to ordinalize and pad + ordinalizeTokens = 'DDD w W M D d'.split(' '), + paddedTokens = 'M D H h m s w W'.split(' '), + + formatTokenFunctions = { + M : function () { + return this.month() + 1; + }, + MMM : function (format) { + return this.localeData().monthsShort(this, format); + }, + MMMM : function (format) { + return this.localeData().months(this, format); + }, + D : function () { + return this.date(); + }, + DDD : function () { + return this.dayOfYear(); + }, + d : function () { + return this.day(); + }, + dd : function (format) { + return this.localeData().weekdaysMin(this, format); + }, + ddd : function (format) { + return this.localeData().weekdaysShort(this, format); + }, + dddd : function (format) { + return this.localeData().weekdays(this, format); + }, + w : function () { + return this.week(); + }, + W : function () { + return this.isoWeek(); + }, + YY : function () { + return leftZeroFill(this.year() % 100, 2); + }, + YYYY : function () { + return leftZeroFill(this.year(), 4); + }, + YYYYY : function () { + return leftZeroFill(this.year(), 5); + }, + YYYYYY : function () { + var y = this.year(), sign = y >= 0 ? '+' : '-'; + return sign + leftZeroFill(Math.abs(y), 6); + }, + gg : function () { + return leftZeroFill(this.weekYear() % 100, 2); + }, + gggg : function () { + return leftZeroFill(this.weekYear(), 4); + }, + ggggg : function () { + return leftZeroFill(this.weekYear(), 5); + }, + GG : function () { + return leftZeroFill(this.isoWeekYear() % 100, 2); + }, + GGGG : function () { + return leftZeroFill(this.isoWeekYear(), 4); + }, + GGGGG : function () { + return leftZeroFill(this.isoWeekYear(), 5); + }, + e : function () { + return this.weekday(); + }, + E : function () { + return this.isoWeekday(); + }, + a : function () { + return this.localeData().meridiem(this.hours(), this.minutes(), true); + }, + A : function () { + return this.localeData().meridiem(this.hours(), this.minutes(), false); + }, + H : function () { + return this.hours(); + }, + h : function () { + return this.hours() % 12 || 12; + }, + m : function () { + return this.minutes(); + }, + s : function () { + return this.seconds(); + }, + S : function () { + return toInt(this.milliseconds() / 100); + }, + SS : function () { + return leftZeroFill(toInt(this.milliseconds() / 10), 2); + }, + SSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + SSSS : function () { + return leftZeroFill(this.milliseconds(), 3); + }, + Z : function () { + var a = this.utcOffset(), + b = '+'; + if (a < 0) { + a = -a; + b = '-'; + } + return b + leftZeroFill(toInt(a / 60), 2) + ':' + leftZeroFill(toInt(a) % 60, 2); + }, + ZZ : function () { + var a = this.utcOffset(), + b = '+'; + if (a < 0) { + a = -a; + b = '-'; + } + return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2); + }, + z : function () { + return this.zoneAbbr(); + }, + zz : function () { + return this.zoneName(); + }, + x : function () { + return this.valueOf(); + }, + X : function () { + return this.unix(); + }, + Q : function () { + return this.quarter(); + } + }, + + deprecations = {}, + + lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'], + + updateInProgress = false; + + // Pick the first defined of two or three arguments. dfl comes from + // default. + function dfl(a, b, c) { + switch (arguments.length) { + case 2: return a != null ? a : b; + case 3: return a != null ? a : b != null ? b : c; + default: throw new Error('Implement me'); + } + } + + function hasOwnProp(a, b) { + return hasOwnProperty.call(a, b); + } + + function defaultParsingFlags() { + // We need to deep clone this object, and es5 standard is not very + // helpful. + return { + empty : false, + unusedTokens : [], + unusedInput : [], + overflow : -2, + charsLeftOver : 0, + nullInput : false, + invalidMonth : null, + invalidFormat : false, + userInvalidated : false, + iso: false + }; + } + + function printMsg(msg) { + if (moment.suppressDeprecationWarnings === false && + typeof console !== 'undefined' && console.warn) { + console.warn('Deprecation warning: ' + msg); + } + } + + function deprecate(msg, fn) { + var firstTime = true; + return extend(function () { + if (firstTime) { + printMsg(msg); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); + } + + function deprecateSimple(name, msg) { + if (!deprecations[name]) { + printMsg(msg); + deprecations[name] = true; + } + } + + function padToken(func, count) { + return function (a) { + return leftZeroFill(func.call(this, a), count); + }; + } + function ordinalizeToken(func, period) { + return function (a) { + return this.localeData().ordinal(func.call(this, a), period); + }; + } + + function monthDiff(a, b) { + // difference in months + var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), + // b is in (anchor - 1 month, anchor + 1 month) + anchor = a.clone().add(wholeMonthDiff, 'months'), + anchor2, adjust; + + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor2 - anchor); + } + + return -(wholeMonthDiff + adjust); + } + + while (ordinalizeTokens.length) { + i = ordinalizeTokens.pop(); + formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i); + } + while (paddedTokens.length) { + i = paddedTokens.pop(); + formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2); + } + formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3); + + + function meridiemFixWrap(locale, hour, meridiem) { + var isPm; + + if (meridiem == null) { + // nothing to do + return hour; + } + if (locale.meridiemHour != null) { + return locale.meridiemHour(hour, meridiem); + } else if (locale.isPM != null) { + // Fallback + isPm = locale.isPM(meridiem); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; + } else { + // thie is not supposed to happen + return hour; + } + } + + /************************************ + Constructors + ************************************/ + + function Locale() { + } + + // Moment prototype object + function Moment(config, skipOverflow) { + if (skipOverflow !== false) { + checkOverflow(config); + } + copyConfig(this, config); + this._d = new Date(+config._d); + // Prevent infinite loop in case updateOffset creates new moment + // objects. + if (updateInProgress === false) { + updateInProgress = true; + moment.updateOffset(this); + updateInProgress = false; + } + } + + // Duration Constructor + function Duration(duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; + + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 36e5; // 1000 * 60 * 60 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; + + this._data = {}; + + this._locale = moment.localeData(); + + this._bubble(); + } + + /************************************ + Helpers + ************************************/ + + + function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } + + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } + + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } + + return a; + } + + function copyConfig(to, from) { + var i, prop, val; + + if (typeof from._isAMomentObject !== 'undefined') { + to._isAMomentObject = from._isAMomentObject; + } + if (typeof from._i !== 'undefined') { + to._i = from._i; + } + if (typeof from._f !== 'undefined') { + to._f = from._f; + } + if (typeof from._l !== 'undefined') { + to._l = from._l; + } + if (typeof from._strict !== 'undefined') { + to._strict = from._strict; + } + if (typeof from._tzm !== 'undefined') { + to._tzm = from._tzm; + } + if (typeof from._isUTC !== 'undefined') { + to._isUTC = from._isUTC; + } + if (typeof from._offset !== 'undefined') { + to._offset = from._offset; + } + if (typeof from._pf !== 'undefined') { + to._pf = from._pf; + } + if (typeof from._locale !== 'undefined') { + to._locale = from._locale; + } + + if (momentProperties.length > 0) { + for (i in momentProperties) { + prop = momentProperties[i]; + val = from[prop]; + if (typeof val !== 'undefined') { + to[prop] = val; + } + } + } + + return to; + } + + function absRound(number) { + if (number < 0) { + return Math.ceil(number); + } else { + return Math.floor(number); + } + } + + // left zero fill a number + // see http://jsperf.com/left-zero-filling for performance comparison + function leftZeroFill(number, targetLength, forceSign) { + var output = '' + Math.abs(number), + sign = number >= 0; + + while (output.length < targetLength) { + output = '0' + output; + } + return (sign ? (forceSign ? '+' : '') : '-') + output; + } + + function positiveMomentsDifference(base, other) { + var res = {milliseconds: 0, months: 0}; + + res.months = other.month() - base.month() + + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } + + res.milliseconds = +other - +(base.clone().add(res.months, 'M')); + + return res; + } + + function momentsDifference(base, other) { + var res; + other = makeAs(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } + + return res; + } + + // TODO: remove 'name' arg after deprecation is removed + function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).'); + tmp = val; val = period; period = tmp; + } + + val = typeof val === 'string' ? +val : val; + dur = moment.duration(val, period); + addOrSubtractDurationFromMoment(this, dur, direction); + return this; + }; + } + + function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = duration._days, + months = duration._months; + updateOffset = updateOffset == null ? true : updateOffset; + + if (milliseconds) { + mom._d.setTime(+mom._d + milliseconds * isAdding); + } + if (days) { + rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding); + } + if (months) { + rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding); + } + if (updateOffset) { + moment.updateOffset(mom, days || months); + } + } + + // check if is an array + function isArray(input) { + return Object.prototype.toString.call(input) === '[object Array]'; + } + + function isDate(input) { + return Object.prototype.toString.call(input) === '[object Date]' || + input instanceof Date; + } + + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; + } + + function normalizeUnits(units) { + if (units) { + var lowered = units.toLowerCase().replace(/(.)s$/, '$1'); + units = unitAliases[units] || camelFunctions[lowered] || lowered; + } + return units; + } + + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; + + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; + } + } + } + + return normalizedInput; + } + + function makeList(field) { + var count, setter; + + if (field.indexOf('week') === 0) { + count = 7; + setter = 'day'; + } + else if (field.indexOf('month') === 0) { + count = 12; + setter = 'month'; + } + else { + return; + } + + moment[field] = function (format, index) { + var i, getter, + method = moment._locale[field], + results = []; + + if (typeof format === 'number') { + index = format; + format = undefined; + } + + getter = function (i) { + var m = moment().utc().set(setter, i); + return method.call(moment._locale, m, format || ''); + }; + + if (index != null) { + return getter(index); + } + else { + for (i = 0; i < count; i++) { + results.push(getter(i)); + } + return results; + } + }; + } + + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; + + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + if (coercedNumber >= 0) { + value = Math.floor(coercedNumber); + } else { + value = Math.ceil(coercedNumber); + } + } + + return value; + } + + function daysInMonth(year, month) { + return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); + } + + function weeksInYear(year, dow, doy) { + return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week; + } + + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } + + function checkOverflow(m) { + var overflow; + if (m._a && m._pf.overflow === -2) { + overflow = + m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH : + m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE : + m._a[HOUR] < 0 || m._a[HOUR] > 24 || + (m._a[HOUR] === 24 && (m._a[MINUTE] !== 0 || + m._a[SECOND] !== 0 || + m._a[MILLISECOND] !== 0)) ? HOUR : + m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE : + m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND : + m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND : + -1; + + if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + + m._pf.overflow = overflow; + } + } + + function isValid(m) { + if (m._isValid == null) { + m._isValid = !isNaN(m._d.getTime()) && + m._pf.overflow < 0 && + !m._pf.empty && + !m._pf.invalidMonth && + !m._pf.nullInput && + !m._pf.invalidFormat && + !m._pf.userInvalidated; + + if (m._strict) { + m._isValid = m._isValid && + m._pf.charsLeftOver === 0 && + m._pf.unusedTokens.length === 0 && + m._pf.bigHour === undefined; + } + } + return m._isValid; + } + + function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; + } + + // pick the locale from the array + // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + function chooseLocale(names) { + var i = 0, j, next, locale, split; + + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; + } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; + } + j--; + } + i++; + } + return null; + } + + function loadLocale(name) { + var oldLocale = null; + if (!locales[name] && hasModule) { + try { + oldLocale = moment.locale(); + require('./locale/' + name); + // because defineLocale currently also sets the global locale, we want to undo that for lazy loaded locales + moment.locale(oldLocale); + } catch (e) { } + } + return locales[name]; + } + + // Return a moment from input, that is local/utc/utcOffset equivalent to + // model. + function makeAs(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = (moment.isMoment(input) || isDate(input) ? + +input : +moment(input)) - (+res); + // Use low-level api, because this fn is low-level api. + res._d.setTime(+res._d + diff); + moment.updateOffset(res, false); + return res; + } else { + return moment(input).local(); + } + } + + /************************************ + Locale + ************************************/ + + + extend(Locale.prototype, { + + set : function (config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (typeof prop === 'function') { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _ordinalParseLenient. + this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + /\d{1,2}/.source); + }, + + _months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), + months : function (m) { + return this._months[m.month()]; + }, + + _monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), + monthsShort : function (m) { + return this._monthsShort[m.month()]; + }, + + monthsParse : function (monthName, format, strict) { + var i, mom, regex; + + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } + + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = moment.utc([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); + } + if (!strict && !this._monthsParse[i]) { + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } + }, + + _weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), + weekdays : function (m) { + return this._weekdays[m.day()]; + }, + + _weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), + weekdaysShort : function (m) { + return this._weekdaysShort[m.day()]; + }, + + _weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), + weekdaysMin : function (m) { + return this._weekdaysMin[m.day()]; + }, + + weekdaysParse : function (weekdayName) { + var i, mom, regex; + + if (!this._weekdaysParse) { + this._weekdaysParse = []; + } + + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + if (!this._weekdaysParse[i]) { + mom = moment([2000, 1]).day(i); + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + }, + + _longDateFormat : { + LTS : 'h:mm:ss A', + LT : 'h:mm A', + L : 'MM/DD/YYYY', + LL : 'MMMM D, YYYY', + LLL : 'MMMM D, YYYY LT', + LLLL : 'dddd, MMMM D, YYYY LT' + }, + longDateFormat : function (key) { + var output = this._longDateFormat[key]; + if (!output && this._longDateFormat[key.toUpperCase()]) { + output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + this._longDateFormat[key] = output; + } + return output; + }, + + isPM : function (input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); + }, + + _meridiemParse : /[ap]\.?m?\.?/i, + meridiem : function (hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? 'am' : 'AM'; + } + }, + + + _calendar : { + sameDay : '[Today at] LT', + nextDay : '[Tomorrow at] LT', + nextWeek : 'dddd [at] LT', + lastDay : '[Yesterday at] LT', + lastWeek : '[Last] dddd [at] LT', + sameElse : 'L' + }, + calendar : function (key, mom, now) { + var output = this._calendar[key]; + return typeof output === 'function' ? output.apply(mom, [now]) : output; + }, + + _relativeTime : { + future : 'in %s', + past : '%s ago', + s : 'a few seconds', + m : 'a minute', + mm : '%d minutes', + h : 'an hour', + hh : '%d hours', + d : 'a day', + dd : '%d days', + M : 'a month', + MM : '%d months', + y : 'a year', + yy : '%d years' + }, + + relativeTime : function (number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (typeof output === 'function') ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + }, + + pastFuture : function (diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return typeof format === 'function' ? format(output) : format.replace(/%s/i, output); + }, + + ordinal : function (number) { + return this._ordinal.replace('%d', number); + }, + _ordinal : '%d', + _ordinalParse : /\d{1,2}/, + + preparse : function (string) { + return string; + }, + + postformat : function (string) { + return string; + }, + + week : function (mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + }, + + _week : { + dow : 0, // Sunday is the first day of the week. + doy : 6 // The week that contains Jan 1st is the first week of the year. + }, + + firstDayOfWeek : function () { + return this._week.dow; + }, + + firstDayOfYear : function () { + return this._week.doy; + }, + + _invalidDate: 'Invalid date', + invalidDate: function () { + return this._invalidDate; + } + }); + + /************************************ + Formatting + ************************************/ + + + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); + } + + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = ''; + for (i = 0; i < length; i++) { + output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; + } + return output; + }; + } + + // format date using native date object + function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } + + format = expandFormat(format, m.localeData()); + + if (!formatFunctions[format]) { + formatFunctions[format] = makeFormatFunction(format); + } + + return formatFunctions[format](m); + } + + function expandFormat(format, locale) { + var i = 5; + + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } + + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + + return format; + } + + + /************************************ + Parsing + ************************************/ + + + // get the regex to find the next token + function getParseRegexForToken(token, config) { + var a, strict = config._strict; + switch (token) { + case 'Q': + return parseTokenOneDigit; + case 'DDDD': + return parseTokenThreeDigits; + case 'YYYY': + case 'GGGG': + case 'gggg': + return strict ? parseTokenFourDigits : parseTokenOneToFourDigits; + case 'Y': + case 'G': + case 'g': + return parseTokenSignedNumber; + case 'YYYYYY': + case 'YYYYY': + case 'GGGGG': + case 'ggggg': + return strict ? parseTokenSixDigits : parseTokenOneToSixDigits; + case 'S': + if (strict) { + return parseTokenOneDigit; + } + /* falls through */ + case 'SS': + if (strict) { + return parseTokenTwoDigits; + } + /* falls through */ + case 'SSS': + if (strict) { + return parseTokenThreeDigits; + } + /* falls through */ + case 'DDD': + return parseTokenOneToThreeDigits; + case 'MMM': + case 'MMMM': + case 'dd': + case 'ddd': + case 'dddd': + return parseTokenWord; + case 'a': + case 'A': + return config._locale._meridiemParse; + case 'x': + return parseTokenOffsetMs; + case 'X': + return parseTokenTimestampMs; + case 'Z': + case 'ZZ': + return parseTokenTimezone; + case 'T': + return parseTokenT; + case 'SSSS': + return parseTokenDigits; + case 'MM': + case 'DD': + case 'YY': + case 'GG': + case 'gg': + case 'HH': + case 'hh': + case 'mm': + case 'ss': + case 'ww': + case 'WW': + return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits; + case 'M': + case 'D': + case 'd': + case 'H': + case 'h': + case 'm': + case 's': + case 'w': + case 'W': + case 'e': + case 'E': + return parseTokenOneOrTwoDigits; + case 'Do': + return strict ? config._locale._ordinalParse : config._locale._ordinalParseLenient; + default : + a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), 'i')); + return a; + } + } + + function utcOffsetFromString(string) { + string = string || ''; + var possibleTzMatches = (string.match(parseTokenTimezone) || []), + tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [], + parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0], + minutes = +(parts[1] * 60) + toInt(parts[2]); + + return parts[0] === '+' ? minutes : -minutes; + } + + // function to convert string input to date + function addTimeToArrayFromToken(token, input, config) { + var a, datePartArray = config._a; + + switch (token) { + // QUARTER + case 'Q': + if (input != null) { + datePartArray[MONTH] = (toInt(input) - 1) * 3; + } + break; + // MONTH + case 'M' : // fall through to MM + case 'MM' : + if (input != null) { + datePartArray[MONTH] = toInt(input) - 1; + } + break; + case 'MMM' : // fall through to MMMM + case 'MMMM' : + a = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (a != null) { + datePartArray[MONTH] = a; + } else { + config._pf.invalidMonth = input; + } + break; + // DAY OF MONTH + case 'D' : // fall through to DD + case 'DD' : + if (input != null) { + datePartArray[DATE] = toInt(input); + } + break; + case 'Do' : + if (input != null) { + datePartArray[DATE] = toInt(parseInt( + input.match(/\d{1,2}/)[0], 10)); + } + break; + // DAY OF YEAR + case 'DDD' : // fall through to DDDD + case 'DDDD' : + if (input != null) { + config._dayOfYear = toInt(input); + } + + break; + // YEAR + case 'YY' : + datePartArray[YEAR] = moment.parseTwoDigitYear(input); + break; + case 'YYYY' : + case 'YYYYY' : + case 'YYYYYY' : + datePartArray[YEAR] = toInt(input); + break; + // AM / PM + case 'a' : // fall through to A + case 'A' : + config._meridiem = input; + // config._isPm = config._locale.isPM(input); + break; + // HOUR + case 'h' : // fall through to hh + case 'hh' : + config._pf.bigHour = true; + /* falls through */ + case 'H' : // fall through to HH + case 'HH' : + datePartArray[HOUR] = toInt(input); + break; + // MINUTE + case 'm' : // fall through to mm + case 'mm' : + datePartArray[MINUTE] = toInt(input); + break; + // SECOND + case 's' : // fall through to ss + case 'ss' : + datePartArray[SECOND] = toInt(input); + break; + // MILLISECOND + case 'S' : + case 'SS' : + case 'SSS' : + case 'SSSS' : + datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000); + break; + // UNIX OFFSET (MILLISECONDS) + case 'x': + config._d = new Date(toInt(input)); + break; + // UNIX TIMESTAMP WITH MS + case 'X': + config._d = new Date(parseFloat(input) * 1000); + break; + // TIMEZONE + case 'Z' : // fall through to ZZ + case 'ZZ' : + config._useUTC = true; + config._tzm = utcOffsetFromString(input); + break; + // WEEKDAY - human + case 'dd': + case 'ddd': + case 'dddd': + a = config._locale.weekdaysParse(input); + // if we didn't get a weekday name, mark the date as invalid + if (a != null) { + config._w = config._w || {}; + config._w['d'] = a; + } else { + config._pf.invalidWeekday = input; + } + break; + // WEEK, WEEK DAY - numeric + case 'w': + case 'ww': + case 'W': + case 'WW': + case 'd': + case 'e': + case 'E': + token = token.substr(0, 1); + /* falls through */ + case 'gggg': + case 'GGGG': + case 'GGGGG': + token = token.substr(0, 2); + if (input) { + config._w = config._w || {}; + config._w[token] = toInt(input); + } + break; + case 'gg': + case 'GG': + config._w = config._w || {}; + config._w[token] = moment.parseTwoDigitYear(input); + } + } + + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year); + week = dfl(w.W, 1); + weekday = dfl(w.E, 1); + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; + + weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year); + week = dfl(w.w, 1); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < dow) { + ++week; + } + } else if (w.e != null) { + // local weekday -- counting starts from begining of week + weekday = w.e + dow; + } else { + // default to begining of week + weekday = dow; + } + } + temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); + + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } + + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function dateFromConfig(config) { + var i, date, input = [], currentDate, yearToUse; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear) { + yearToUse = dfl(config._a[YEAR], currentDate[YEAR]); + + if (config._dayOfYear > daysInYear(yearToUse)) { + config._pf._overflowDayOfYear = true; + } + + date = makeUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // Check for 24:00:00.000 + if (config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; + } + + config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input); + // Apply timezone offset from input. The actual utcOffset can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + } + + if (config._nextDay) { + config._a[HOUR] = 24; + } + } + + function dateFromObject(config) { + var normalizedInput; + + if (config._d) { + return; + } + + normalizedInput = normalizeObjectUnits(config._i); + config._a = [ + normalizedInput.year, + normalizedInput.month, + normalizedInput.day || normalizedInput.date, + normalizedInput.hour, + normalizedInput.minute, + normalizedInput.second, + normalizedInput.millisecond + ]; + + dateFromConfig(config); + } + + function currentDateArray(config) { + var now = new Date(); + if (config._useUTC) { + return [ + now.getUTCFullYear(), + now.getUTCMonth(), + now.getUTCDate() + ]; + } else { + return [now.getFullYear(), now.getMonth(), now.getDate()]; + } + } + + // date from string and format string + function makeDateFromStringAndFormat(config) { + if (config._f === moment.ISO_8601) { + parseISO(config); + return; + } + + config._a = []; + config._pf.empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; + + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + config._pf.unusedInput.push(skipped); + } + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + config._pf.empty = false; + } + else { + config._pf.unusedTokens.push(token); + } + addTimeToArrayFromToken(token, parsedInput, config); + } + else if (config._strict && !parsedInput) { + config._pf.unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + config._pf.charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + config._pf.unusedInput.push(string); + } + + // clear _12h flag if hour is <= 12 + if (config._pf.bigHour === true && config._a[HOUR] <= 12) { + config._pf.bigHour = undefined; + } + // handle meridiem + config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], + config._meridiem); + dateFromConfig(config); + checkOverflow(config); + } + + function unescapeFormat(s) { + return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + }); + } + + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function regexpEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + + // date from string and array of format strings + function makeDateFromStringAndArray(config) { + var tempConfig, + bestMoment, + + scoreToBeat, + i, + currentScore; + + if (config._f.length === 0) { + config._pf.invalidFormat = true; + config._d = new Date(NaN); + return; + } + + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._pf = defaultParsingFlags(); + tempConfig._f = config._f[i]; + makeDateFromStringAndFormat(tempConfig); + + if (!isValid(tempConfig)) { + continue; + } + + // if there is any input that was not parsed add a penalty for that format + currentScore += tempConfig._pf.charsLeftOver; + + //or tokens + currentScore += tempConfig._pf.unusedTokens.length * 10; + + tempConfig._pf.score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + + extend(config, bestMoment || tempConfig); + } + + // date from iso format + function parseISO(config) { + var i, l, + string = config._i, + match = isoRegex.exec(string); + + if (match) { + config._pf.iso = true; + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(string)) { + // match[5] should be 'T' or undefined + config._f = isoDates[i][0] + (match[6] || ' '); + break; + } + } + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(string)) { + config._f += isoTimes[i][0]; + break; + } + } + if (string.match(parseTokenTimezone)) { + config._f += 'Z'; + } + makeDateFromStringAndFormat(config); + } else { + config._isValid = false; + } + } + + // date from iso format or fallback + function makeDateFromString(config) { + parseISO(config); + if (config._isValid === false) { + delete config._isValid; + moment.createFromInputFallback(config); + } + } + + function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; + } + + function makeDateFromInput(config) { + var input = config._i, matched; + if (input === undefined) { + config._d = new Date(); + } else if (isDate(input)) { + config._d = new Date(+input); + } else if ((matched = aspNetJsonRegex.exec(input)) !== null) { + config._d = new Date(+matched[1]); + } else if (typeof input === 'string') { + makeDateFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + dateFromConfig(config); + } else if (typeof(input) === 'object') { + dateFromObject(config); + } else if (typeof(input) === 'number') { + // from milliseconds + config._d = new Date(input); + } else { + moment.createFromInputFallback(config); + } + } + + function makeDate(y, m, d, h, M, s, ms) { + //can't just apply() to create a date: + //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply + var date = new Date(y, m, d, h, M, s, ms); + + //the date constructor doesn't accept years < 1970 + if (y < 1970) { + date.setFullYear(y); + } + return date; + } + + function makeUTCDate(y) { + var date = new Date(Date.UTC.apply(null, arguments)); + if (y < 1970) { + date.setUTCFullYear(y); + } + return date; + } + + function parseWeekday(input, locale) { + if (typeof input === 'string') { + if (!isNaN(input)) { + input = parseInt(input, 10); + } + else { + input = locale.weekdaysParse(input); + if (typeof input !== 'number') { + return null; + } + } + } + return input; + } + + /************************************ + Relative Time + ************************************/ + + + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } + + function relativeTime(posNegDuration, withoutSuffix, locale) { + var duration = moment.duration(posNegDuration).abs(), + seconds = round(duration.as('s')), + minutes = round(duration.as('m')), + hours = round(duration.as('h')), + days = round(duration.as('d')), + months = round(duration.as('M')), + years = round(duration.as('y')), + + args = seconds < relativeTimeThresholds.s && ['s', seconds] || + minutes === 1 && ['m'] || + minutes < relativeTimeThresholds.m && ['mm', minutes] || + hours === 1 && ['h'] || + hours < relativeTimeThresholds.h && ['hh', hours] || + days === 1 && ['d'] || + days < relativeTimeThresholds.d && ['dd', days] || + months === 1 && ['M'] || + months < relativeTimeThresholds.M && ['MM', months] || + years === 1 && ['y'] || ['yy', years]; + + args[2] = withoutSuffix; + args[3] = +posNegDuration > 0; + args[4] = locale; + return substituteTimeAgo.apply({}, args); + } + + + /************************************ + Week of Year + ************************************/ + + + // firstDayOfWeek 0 = sun, 6 = sat + // the day of the week that starts the week + // (usually sunday or monday) + // firstDayOfWeekOfYear 0 = sun, 6 = sat + // the first week is the week that contains the first + // of this day of the week + // (eg. ISO weeks use thursday (4)) + function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { + var end = firstDayOfWeekOfYear - firstDayOfWeek, + daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), + adjustedMoment; + + + if (daysToDayOfWeek > end) { + daysToDayOfWeek -= 7; + } + + if (daysToDayOfWeek < end - 7) { + daysToDayOfWeek += 7; + } + + adjustedMoment = moment(mom).add(daysToDayOfWeek, 'd'); + return { + week: Math.ceil(adjustedMoment.dayOfYear() / 7), + year: adjustedMoment.year() + }; + } + + //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { + var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear; + + d = d === 0 ? 7 : d; + weekday = weekday != null ? weekday : firstDayOfWeek; + daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0); + dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; + + return { + year: dayOfYear > 0 ? year : year - 1, + dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear + }; + } + + /************************************ + Top Level Functions + ************************************/ + + function makeMoment(config) { + var input = config._i, + format = config._f, + res; + + config._locale = config._locale || moment.localeData(config._l); + + if (input === null || (format === undefined && input === '')) { + return moment.invalid({nullInput: true}); + } + + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); + } + + if (moment.isMoment(input)) { + return new Moment(input, true); + } else if (format) { + if (isArray(format)) { + makeDateFromStringAndArray(config); + } else { + makeDateFromStringAndFormat(config); + } + } else { + makeDateFromInput(config); + } + + res = new Moment(config); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; + } + + return res; + } + + moment = function (input, format, locale, strict) { + var c; + + if (typeof(locale) === 'boolean') { + strict = locale; + locale = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._i = input; + c._f = format; + c._l = locale; + c._strict = strict; + c._isUTC = false; + c._pf = defaultParsingFlags(); + + return makeMoment(c); + }; + + moment.suppressDeprecationWarnings = false; + + moment.createFromInputFallback = deprecate( + 'moment construction falls back to js Date. This is ' + + 'discouraged and will be removed in upcoming major ' + + 'release. Please refer to ' + + 'https://github.com/moment/moment/issues/1407 for more info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } + ); + + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return moment(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } + + moment.min = function () { + var args = [].slice.call(arguments, 0); + + return pickBy('isBefore', args); + }; + + moment.max = function () { + var args = [].slice.call(arguments, 0); + + return pickBy('isAfter', args); + }; + + // creating with utc + moment.utc = function (input, format, locale, strict) { + var c; + + if (typeof(locale) === 'boolean') { + strict = locale; + locale = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c = {}; + c._isAMomentObject = true; + c._useUTC = true; + c._isUTC = true; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; + c._pf = defaultParsingFlags(); + + return makeMoment(c).utc(); + }; + + // creating with unix timestamp (in seconds) + moment.unix = function (input) { + return moment(input * 1000); + }; + + // duration + moment.duration = function (input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + parseIso, + diffRes; + + if (moment.isDuration(input)) { + duration = { + ms: input._milliseconds, + d: input._days, + M: input._months + }; + } else if (typeof input === 'number') { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y: 0, + d: toInt(match[DATE]) * sign, + h: toInt(match[HOUR]) * sign, + m: toInt(match[MINUTE]) * sign, + s: toInt(match[SECOND]) * sign, + ms: toInt(match[MILLISECOND]) * sign + }; + } else if (!!(match = isoDurationRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + parseIso = function (inp) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + }; + duration = { + y: parseIso(match[2]), + M: parseIso(match[3]), + d: parseIso(match[4]), + h: parseIso(match[5]), + m: parseIso(match[6]), + s: parseIso(match[7]), + w: parseIso(match[8]) + }; + } else if (duration == null) {// checks for null or undefined + duration = {}; + } else if (typeof duration === 'object' && + ('from' in duration || 'to' in duration)) { + diffRes = momentsDifference(moment(duration.from), moment(duration.to)); + + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + + ret = new Duration(duration); + + if (moment.isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } + + return ret; + }; + + // version number + moment.version = VERSION; + + // default format + moment.defaultFormat = isoFormat; + + // constant that refers to the ISO standard + moment.ISO_8601 = function () {}; + + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. + moment.momentProperties = momentProperties; + + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + moment.updateOffset = function () {}; + + // This function allows you to set a threshold for relative time strings + moment.relativeTimeThreshold = function (threshold, limit) { + if (relativeTimeThresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return relativeTimeThresholds[threshold]; + } + relativeTimeThresholds[threshold] = limit; + return true; + }; + + moment.lang = deprecate( + 'moment.lang is deprecated. Use moment.locale instead.', + function (key, value) { + return moment.locale(key, value); + } + ); + + // This function will load locale and then set the global locale. If + // no arguments are passed in, it will simply return the current global + // locale key. + moment.locale = function (key, values) { + var data; + if (key) { + if (typeof(values) !== 'undefined') { + data = moment.defineLocale(key, values); + } + else { + data = moment.localeData(key); + } + + if (data) { + moment.duration._locale = moment._locale = data; + } + } + + return moment._locale._abbr; + }; + + moment.defineLocale = function (name, values) { + if (values !== null) { + values.abbr = name; + if (!locales[name]) { + locales[name] = new Locale(); + } + locales[name].set(values); + + // backwards compat for now: also set the locale + moment.locale(name); + + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } + }; + + moment.langData = deprecate( + 'moment.langData is deprecated. Use moment.localeData instead.', + function (key) { + return moment.localeData(key); + } + ); + + // returns locale data + moment.localeData = function (key) { + var locale; + + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } + + if (!key) { + return moment._locale; + } + + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } + + return chooseLocale(key); + }; + + // compare moment object + moment.isMoment = function (obj) { + return obj instanceof Moment || + (obj != null && hasOwnProp(obj, '_isAMomentObject')); + }; + + // for typechecking Duration objects + moment.isDuration = function (obj) { + return obj instanceof Duration; + }; + + for (i = lists.length - 1; i >= 0; --i) { + makeList(lists[i]); + } + + moment.normalizeUnits = function (units) { + return normalizeUnits(units); + }; + + moment.invalid = function (flags) { + var m = moment.utc(NaN); + if (flags != null) { + extend(m._pf, flags); + } + else { + m._pf.userInvalidated = true; + } + + return m; + }; + + moment.parseZone = function () { + return moment.apply(null, arguments).parseZone(); + }; + + moment.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + }; + + moment.isDate = isDate; + + /************************************ + Moment Prototype + ************************************/ + + + extend(moment.fn = Moment.prototype, { + + clone : function () { + return moment(this); + }, + + valueOf : function () { + return +this._d - ((this._offset || 0) * 60000); + }, + + unix : function () { + return Math.floor(+this / 1000); + }, + + toString : function () { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); + }, + + toDate : function () { + return this._offset ? new Date(+this) : this._d; + }, + + toISOString : function () { + var m = moment(this).utc(); + if (0 < m.year() && m.year() <= 9999) { + if ('function' === typeof Date.prototype.toISOString) { + // native implementation is ~50x faster, use it when we can + return this.toDate().toISOString(); + } else { + return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + } else { + return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); + } + }, + + toArray : function () { + var m = this; + return [ + m.year(), + m.month(), + m.date(), + m.hours(), + m.minutes(), + m.seconds(), + m.milliseconds() + ]; + }, + + isValid : function () { + return isValid(this); + }, + + isDSTShifted : function () { + if (this._a) { + return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0; + } + + return false; + }, + + parsingFlags : function () { + return extend({}, this._pf); + }, + + invalidAt: function () { + return this._pf.overflow; + }, + + utc : function (keepLocalTime) { + return this.utcOffset(0, keepLocalTime); + }, + + local : function (keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; + + if (keepLocalTime) { + this.subtract(this._dateUtcOffset(), 'm'); + } + } + return this; + }, + + format : function (inputString) { + var output = formatMoment(this, inputString || moment.defaultFormat); + return this.localeData().postformat(output); + }, + + add : createAdder(1, 'add'), + + subtract : createAdder(-1, 'subtract'), + + diff : function (input, units, asFloat) { + var that = makeAs(input, this), + zoneDiff = (that.utcOffset() - this.utcOffset()) * 6e4, + anchor, diff, output, daysAdjust; + + units = normalizeUnits(units); + + if (units === 'year' || units === 'month' || units === 'quarter') { + output = monthDiff(this, that); + if (units === 'quarter') { + output = output / 3; + } else if (units === 'year') { + output = output / 12; + } + } else { + diff = this - that; + output = units === 'second' ? diff / 1e3 : // 1000 + units === 'minute' ? diff / 6e4 : // 1000 * 60 + units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60 + units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst + units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst + diff; + } + return asFloat ? output : absRound(output); + }, + + from : function (time, withoutSuffix) { + return moment.duration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); + }, + + fromNow : function (withoutSuffix) { + return this.from(moment(), withoutSuffix); + }, + + calendar : function (time) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're locat/utc/offset + // or not. + var now = time || moment(), + sod = makeAs(now, this).startOf('day'), + diff = this.diff(sod, 'days', true), + format = diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + return this.format(this.localeData().calendar(format, this, moment(now))); + }, + + isLeapYear : function () { + return isLeapYear(this.year()); + }, + + isDST : function () { + return (this.utcOffset() > this.clone().month(0).utcOffset() || + this.utcOffset() > this.clone().month(5).utcOffset()); + }, + + day : function (input) { + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } + }, + + month : makeAccessor('Month', true), + + startOf : function (units) { + units = normalizeUnits(units); + // the following switch intentionally omits break keywords + // to utilize falling through the cases. + switch (units) { + case 'year': + this.month(0); + /* falls through */ + case 'quarter': + case 'month': + this.date(1); + /* falls through */ + case 'week': + case 'isoWeek': + case 'day': + this.hours(0); + /* falls through */ + case 'hour': + this.minutes(0); + /* falls through */ + case 'minute': + this.seconds(0); + /* falls through */ + case 'second': + this.milliseconds(0); + /* falls through */ + } + + // weeks are a special case + if (units === 'week') { + this.weekday(0); + } else if (units === 'isoWeek') { + this.isoWeekday(1); + } + + // quarters are also special + if (units === 'quarter') { + this.month(Math.floor(this.month() / 3) * 3); + } + + return this; + }, + + endOf: function (units) { + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond') { + return this; + } + return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); + }, + + isAfter: function (input, units) { + var inputMs; + units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this > +input; + } else { + inputMs = moment.isMoment(input) ? +input : +moment(input); + return inputMs < +this.clone().startOf(units); + } + }, + + isBefore: function (input, units) { + var inputMs; + units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this < +input; + } else { + inputMs = moment.isMoment(input) ? +input : +moment(input); + return +this.clone().endOf(units) < inputMs; + } + }, + + isBetween: function (from, to, units) { + return this.isAfter(from, units) && this.isBefore(to, units); + }, + + isSame: function (input, units) { + var inputMs; + units = normalizeUnits(units || 'millisecond'); + if (units === 'millisecond') { + input = moment.isMoment(input) ? input : moment(input); + return +this === +input; + } else { + inputMs = +moment(input); + return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units)); + } + }, + + min: deprecate( + 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548', + function (other) { + other = moment.apply(null, arguments); + return other < this ? this : other; + } + ), + + max: deprecate( + 'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548', + function (other) { + other = moment.apply(null, arguments); + return other > this ? this : other; + } + ), + + zone : deprecate( + 'moment().zone is deprecated, use moment().utcOffset instead. ' + + 'https://github.com/moment/moment/issues/1779', + function (input, keepLocalTime) { + if (input != null) { + if (typeof input !== 'string') { + input = -input; + } + + this.utcOffset(input, keepLocalTime); + + return this; + } else { + return -this.utcOffset(); + } + } + ), + + // keepLocalTime = true means only change the timezone, without + // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> + // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset + // +0200, so we adjust the time as needed, to be valid. + // + // Keeping the time actually adds/subtracts (one hour) + // from the actual represented time. That is why we call updateOffset + // a second time. In case it wants us to change the offset again + // _changeInProgress == true case, then we have to adjust, because + // there is no such time in the given timezone. + utcOffset : function (input, keepLocalTime) { + var offset = this._offset || 0, + localAdjust; + if (input != null) { + if (typeof input === 'string') { + input = utcOffsetFromString(input); + } + if (Math.abs(input) < 16) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = this._dateUtcOffset(); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + addOrSubtractDurationFromMoment(this, + moment.duration(input - offset, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + moment.updateOffset(this, true); + this._changeInProgress = null; + } + } + + return this; + } else { + return this._isUTC ? offset : this._dateUtcOffset(); + } + }, + + isLocal : function () { + return !this._isUTC; + }, + + isUtcOffset : function () { + return this._isUTC; + }, + + isUtc : function () { + return this._isUTC && this._offset === 0; + }, + + zoneAbbr : function () { + return this._isUTC ? 'UTC' : ''; + }, + + zoneName : function () { + return this._isUTC ? 'Coordinated Universal Time' : ''; + }, + + parseZone : function () { + if (this._tzm) { + this.utcOffset(this._tzm); + } else if (typeof this._i === 'string') { + this.utcOffset(utcOffsetFromString(this._i)); + } + return this; + }, + + hasAlignedHourOffset : function (input) { + if (!input) { + input = 0; + } + else { + input = moment(input).utcOffset(); + } + + return (this.utcOffset() - input) % 60 === 0; + }, + + daysInMonth : function () { + return daysInMonth(this.year(), this.month()); + }, + + dayOfYear : function (input) { + var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); + }, + + quarter : function (input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); + }, + + weekYear : function (input) { + var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year; + return input == null ? year : this.add((input - year), 'y'); + }, + + isoWeekYear : function (input) { + var year = weekOfYear(this, 1, 4).year; + return input == null ? year : this.add((input - year), 'y'); + }, + + week : function (input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); + }, + + isoWeek : function (input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); + }, + + weekday : function (input) { + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); + }, + + isoWeekday : function (input) { + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); + }, + + isoWeeksInYear : function () { + return weeksInYear(this.year(), 1, 4); + }, + + weeksInYear : function () { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); + }, + + get : function (units) { + units = normalizeUnits(units); + return this[units](); + }, + + set : function (units, value) { + var unit; + if (typeof units === 'object') { + for (unit in units) { + this.set(unit, units[unit]); + } + } + else { + units = normalizeUnits(units); + if (typeof this[units] === 'function') { + this[units](value); + } + } + return this; + }, + + // If passed a locale key, it will set the locale for this + // instance. Otherwise, it will return the locale configuration + // variables for this instance. + locale : function (key) { + var newLocaleData; + + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = moment.localeData(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; + } + }, + + lang : deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } + } + ), + + localeData : function () { + return this._locale; + }, + + _dateUtcOffset : function () { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return -Math.round(this._d.getTimezoneOffset() / 15) * 15; + } + + }); + + function rawMonthSetter(mom, value) { + var dayOfMonth; + + // TODO: Move this out of here! + if (typeof value === 'string') { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (typeof value !== 'number') { + return mom; + } + } + + dayOfMonth = Math.min(mom.date(), + daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; + } + + function rawGetter(mom, unit) { + return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit](); + } + + function rawSetter(mom, unit, value) { + if (unit === 'Month') { + return rawMonthSetter(mom, value); + } else { + return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } + + function makeAccessor(unit, keepTime) { + return function (value) { + if (value != null) { + rawSetter(this, unit, value); + moment.updateOffset(this, keepTime); + return this; + } else { + return rawGetter(this, unit); + } + }; + } + + moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false); + moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false); + moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false); + // Setting the hour should keep the time, because the user explicitly + // specified which hour he wants. So trying to maintain the same hour (in + // a new timezone) makes sense. Adding/subtracting hours does not follow + // this rule. + moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true); + // moment.fn.month is defined separately + moment.fn.date = makeAccessor('Date', true); + moment.fn.dates = deprecate('dates accessor is deprecated. Use date instead.', makeAccessor('Date', true)); + moment.fn.year = makeAccessor('FullYear', true); + moment.fn.years = deprecate('years accessor is deprecated. Use year instead.', makeAccessor('FullYear', true)); + + // add plural methods + moment.fn.days = moment.fn.day; + moment.fn.months = moment.fn.month; + moment.fn.weeks = moment.fn.week; + moment.fn.isoWeeks = moment.fn.isoWeek; + moment.fn.quarters = moment.fn.quarter; + + // add aliased format methods + moment.fn.toJSON = moment.fn.toISOString; + + // alias isUtc for dev-friendliness + moment.fn.isUTC = moment.fn.isUtc; + + /************************************ + Duration Prototype + ************************************/ + + + function daysToYears (days) { + // 400 years have 146097 days (taking into account leap year rules) + return days * 400 / 146097; + } + + function yearsToDays (years) { + // years * 365 + absRound(years / 4) - + // absRound(years / 100) + absRound(years / 400); + return years * 146097 / 400; + } + + extend(moment.duration.fn = Duration.prototype, { + + _bubble : function () { + var milliseconds = this._milliseconds, + days = this._days, + months = this._months, + data = this._data, + seconds, minutes, hours, years = 0; + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absRound(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absRound(seconds / 60); + data.minutes = minutes % 60; + + hours = absRound(minutes / 60); + data.hours = hours % 24; + + days += absRound(hours / 24); + + // Accurately convert days to years, assume start from year 0. + years = absRound(daysToYears(days)); + days -= absRound(yearsToDays(years)); + + // 30 days to a month + // TODO (iskren): Use anchor date (like 1st Jan) to compute this. + months += absRound(days / 30); + days %= 30; + + // 12 months -> 1 year + years += absRound(months / 12); + months %= 12; + + data.days = days; + data.months = months; + data.years = years; + }, + + abs : function () { + this._milliseconds = Math.abs(this._milliseconds); + this._days = Math.abs(this._days); + this._months = Math.abs(this._months); + + this._data.milliseconds = Math.abs(this._data.milliseconds); + this._data.seconds = Math.abs(this._data.seconds); + this._data.minutes = Math.abs(this._data.minutes); + this._data.hours = Math.abs(this._data.hours); + this._data.months = Math.abs(this._data.months); + this._data.years = Math.abs(this._data.years); + + return this; + }, + + weeks : function () { + return absRound(this.days() / 7); + }, + + valueOf : function () { + return this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6; + }, + + humanize : function (withSuffix) { + var output = relativeTime(this, !withSuffix, this.localeData()); + + if (withSuffix) { + output = this.localeData().pastFuture(+this, output); + } + + return this.localeData().postformat(output); + }, + + add : function (input, val) { + // supports only 2.0-style add(1, 's') or add(moment) + var dur = moment.duration(input, val); + + this._milliseconds += dur._milliseconds; + this._days += dur._days; + this._months += dur._months; + + this._bubble(); + + return this; + }, + + subtract : function (input, val) { + var dur = moment.duration(input, val); + + this._milliseconds -= dur._milliseconds; + this._days -= dur._days; + this._months -= dur._months; + + this._bubble(); + + return this; + }, + + get : function (units) { + units = normalizeUnits(units); + return this[units.toLowerCase() + 's'](); + }, + + as : function (units) { + var days, months; + units = normalizeUnits(units); + + if (units === 'month' || units === 'year') { + days = this._days + this._milliseconds / 864e5; + months = this._months + daysToYears(days) * 12; + return units === 'month' ? months : months / 12; + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(yearsToDays(this._months / 12)); + switch (units) { + case 'week': return days / 7 + this._milliseconds / 6048e5; + case 'day': return days + this._milliseconds / 864e5; + case 'hour': return days * 24 + this._milliseconds / 36e5; + case 'minute': return days * 24 * 60 + this._milliseconds / 6e4; + case 'second': return days * 24 * 60 * 60 + this._milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': return Math.floor(days * 24 * 60 * 60 * 1000) + this._milliseconds; + default: throw new Error('Unknown unit ' + units); + } + } + }, + + lang : moment.fn.lang, + locale : moment.fn.locale, + + toIsoString : deprecate( + 'toIsoString() is deprecated. Please use toISOString() instead ' + + '(notice the capitals)', + function () { + return this.toISOString(); + } + ), + + toISOString : function () { + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var years = Math.abs(this.years()), + months = Math.abs(this.months()), + days = Math.abs(this.days()), + hours = Math.abs(this.hours()), + minutes = Math.abs(this.minutes()), + seconds = Math.abs(this.seconds() + this.milliseconds() / 1000); + + if (!this.asSeconds()) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + return (this.asSeconds() < 0 ? '-' : '') + + 'P' + + (years ? years + 'Y' : '') + + (months ? months + 'M' : '') + + (days ? days + 'D' : '') + + ((hours || minutes || seconds) ? 'T' : '') + + (hours ? hours + 'H' : '') + + (minutes ? minutes + 'M' : '') + + (seconds ? seconds + 'S' : ''); + }, + + localeData : function () { + return this._locale; + }, + + toJSON : function () { + return this.toISOString(); + } + }); + + moment.duration.fn.toString = moment.duration.fn.toISOString; + + function makeDurationGetter(name) { + moment.duration.fn[name] = function () { + return this._data[name]; + }; + } + + for (i in unitMillisecondFactors) { + if (hasOwnProp(unitMillisecondFactors, i)) { + makeDurationGetter(i.toLowerCase()); + } + } + + moment.duration.fn.asMilliseconds = function () { + return this.as('ms'); + }; + moment.duration.fn.asSeconds = function () { + return this.as('s'); + }; + moment.duration.fn.asMinutes = function () { + return this.as('m'); + }; + moment.duration.fn.asHours = function () { + return this.as('h'); + }; + moment.duration.fn.asDays = function () { + return this.as('d'); + }; + moment.duration.fn.asWeeks = function () { + return this.as('weeks'); + }; + moment.duration.fn.asMonths = function () { + return this.as('M'); + }; + moment.duration.fn.asYears = function () { + return this.as('y'); + }; + + /************************************ + Default Locale + ************************************/ + + + // Set default locale, other locale will inherit from English. + moment.locale('en', { + ordinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal : function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); + + /* EMBED_LOCALES */ + + /************************************ + Exposing Moment + ************************************/ + + function makeGlobal(shouldDeprecate) { + /*global ender:false */ + if (typeof ender !== 'undefined') { + return; + } + oldGlobalMoment = globalScope.moment; + if (shouldDeprecate) { + globalScope.moment = deprecate( + 'Accessing Moment through the global scope is ' + + 'deprecated, and will be removed in an upcoming ' + + 'release.', + moment); + } else { + globalScope.moment = moment; + } + } + + // CommonJS module is defined + if (hasModule) { + module.exports = moment; + } else if (typeof define === 'function' && define.amd) { + define(function (require, exports, module) { + if (module.config && module.config() && module.config().noGlobal === true) { + // release the global variable + globalScope.moment = oldGlobalMoment; + } + + return moment; + }); + makeGlobal(true); + } else { + makeGlobal(); + } +}).call(this); diff --git a/theme/bootstrap/plugins/daterangepicker/moment.min.js b/theme/bootstrap/plugins/daterangepicker/moment.min.js new file mode 100644 index 0000000..024d488 --- /dev/null +++ b/theme/bootstrap/plugins/daterangepicker/moment.min.js @@ -0,0 +1,7 @@ +//! moment.js +//! version : 2.9.0 +//! authors : Tim Wood, Iskren Chernev, Moment.js contributors +//! license : MIT +//! momentjs.com +(function(a){function b(a,b,c){switch(arguments.length){case 2:return null!=a?a:b;case 3:return null!=a?a:null!=b?b:c;default:throw new Error("Implement me")}}function c(a,b){return Bb.call(a,b)}function d(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function e(a){vb.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+a)}function f(a,b){var c=!0;return o(function(){return c&&(e(a),c=!1),b.apply(this,arguments)},b)}function g(a,b){sc[a]||(e(b),sc[a]=!0)}function h(a,b){return function(c){return r(a.call(this,c),b)}}function i(a,b){return function(c){return this.localeData().ordinal(a.call(this,c),b)}}function j(a,b){var c,d,e=12*(b.year()-a.year())+(b.month()-a.month()),f=a.clone().add(e,"months");return 0>b-f?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)}function k(a,b,c){var d;return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&12>b&&(b+=12),d||12!==b||(b=0),b):b}function l(){}function m(a,b){b!==!1&&H(a),p(this,a),this._d=new Date(+a._d),uc===!1&&(uc=!0,vb.updateOffset(this),uc=!1)}function n(a){var b=A(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0;this._milliseconds=+k+1e3*j+6e4*i+36e5*h,this._days=+g+7*f,this._months=+e+3*d+12*c,this._data={},this._locale=vb.localeData(),this._bubble()}function o(a,b){for(var d in b)c(b,d)&&(a[d]=b[d]);return c(b,"toString")&&(a.toString=b.toString),c(b,"valueOf")&&(a.valueOf=b.valueOf),a}function p(a,b){var c,d,e;if("undefined"!=typeof b._isAMomentObject&&(a._isAMomentObject=b._isAMomentObject),"undefined"!=typeof b._i&&(a._i=b._i),"undefined"!=typeof b._f&&(a._f=b._f),"undefined"!=typeof b._l&&(a._l=b._l),"undefined"!=typeof b._strict&&(a._strict=b._strict),"undefined"!=typeof b._tzm&&(a._tzm=b._tzm),"undefined"!=typeof b._isUTC&&(a._isUTC=b._isUTC),"undefined"!=typeof b._offset&&(a._offset=b._offset),"undefined"!=typeof b._pf&&(a._pf=b._pf),"undefined"!=typeof b._locale&&(a._locale=b._locale),Kb.length>0)for(c in Kb)d=Kb[c],e=b[d],"undefined"!=typeof e&&(a[d]=e);return a}function q(a){return 0>a?Math.ceil(a):Math.floor(a)}function r(a,b,c){for(var d=""+Math.abs(a),e=a>=0;d.length<b;)d="0"+d;return(e?c?"+":"":"-")+d}function s(a,b){var c={milliseconds:0,months:0};return c.months=b.month()-a.month()+12*(b.year()-a.year()),a.clone().add(c.months,"M").isAfter(b)&&--c.months,c.milliseconds=+b-+a.clone().add(c.months,"M"),c}function t(a,b){var c;return b=M(b,a),a.isBefore(b)?c=s(a,b):(c=s(b,a),c.milliseconds=-c.milliseconds,c.months=-c.months),c}function u(a,b){return function(c,d){var e,f;return null===d||isNaN(+d)||(g(b,"moment()."+b+"(period, number) is deprecated. Please use moment()."+b+"(number, period)."),f=c,c=d,d=f),c="string"==typeof c?+c:c,e=vb.duration(c,d),v(this,e,a),this}}function v(a,b,c,d){var e=b._milliseconds,f=b._days,g=b._months;d=null==d?!0:d,e&&a._d.setTime(+a._d+e*c),f&&pb(a,"Date",ob(a,"Date")+f*c),g&&nb(a,ob(a,"Month")+g*c),d&&vb.updateOffset(a,f||g)}function w(a){return"[object Array]"===Object.prototype.toString.call(a)}function x(a){return"[object Date]"===Object.prototype.toString.call(a)||a instanceof Date}function y(a,b,c){var d,e=Math.min(a.length,b.length),f=Math.abs(a.length-b.length),g=0;for(d=0;e>d;d++)(c&&a[d]!==b[d]||!c&&C(a[d])!==C(b[d]))&&g++;return g+f}function z(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,"$1");a=lc[a]||mc[b]||b}return a}function A(a){var b,d,e={};for(d in a)c(a,d)&&(b=z(d),b&&(e[b]=a[d]));return e}function B(b){var c,d;if(0===b.indexOf("week"))c=7,d="day";else{if(0!==b.indexOf("month"))return;c=12,d="month"}vb[b]=function(e,f){var g,h,i=vb._locale[b],j=[];if("number"==typeof e&&(f=e,e=a),h=function(a){var b=vb().utc().set(d,a);return i.call(vb._locale,b,e||"")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function C(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function D(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function E(a,b,c){return jb(vb([a,11,31+b-c]),b,c).week}function F(a){return G(a)?366:365}function G(a){return a%4===0&&a%100!==0||a%400===0}function H(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[Db]<0||a._a[Db]>11?Db:a._a[Eb]<1||a._a[Eb]>D(a._a[Cb],a._a[Db])?Eb:a._a[Fb]<0||a._a[Fb]>24||24===a._a[Fb]&&(0!==a._a[Gb]||0!==a._a[Hb]||0!==a._a[Ib])?Fb:a._a[Gb]<0||a._a[Gb]>59?Gb:a._a[Hb]<0||a._a[Hb]>59?Hb:a._a[Ib]<0||a._a[Ib]>999?Ib:-1,a._pf._overflowDayOfYear&&(Cb>b||b>Eb)&&(b=Eb),a._pf.overflow=b)}function I(b){return null==b._isValid&&(b._isValid=!isNaN(b._d.getTime())&&b._pf.overflow<0&&!b._pf.empty&&!b._pf.invalidMonth&&!b._pf.nullInput&&!b._pf.invalidFormat&&!b._pf.userInvalidated,b._strict&&(b._isValid=b._isValid&&0===b._pf.charsLeftOver&&0===b._pf.unusedTokens.length&&b._pf.bigHour===a)),b._isValid}function J(a){return a?a.toLowerCase().replace("_","-"):a}function K(a){for(var b,c,d,e,f=0;f<a.length;){for(e=J(a[f]).split("-"),b=e.length,c=J(a[f+1]),c=c?c.split("-"):null;b>0;){if(d=L(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&y(e,c,!0)>=b-1)break;b--}f++}return null}function L(a){var b=null;if(!Jb[a]&&Lb)try{b=vb.locale(),require("./locale/"+a),vb.locale(b)}catch(c){}return Jb[a]}function M(a,b){var c,d;return b._isUTC?(c=b.clone(),d=(vb.isMoment(a)||x(a)?+a:+vb(a))-+c,c._d.setTime(+c._d+d),vb.updateOffset(c,!1),c):vb(a).local()}function N(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function O(a){var b,c,d=a.match(Pb);for(b=0,c=d.length;c>b;b++)d[b]=rc[d[b]]?rc[d[b]]:N(d[b]);return function(e){var f="";for(b=0;c>b;b++)f+=d[b]instanceof Function?d[b].call(e,a):d[b];return f}}function P(a,b){return a.isValid()?(b=Q(b,a.localeData()),nc[b]||(nc[b]=O(b)),nc[b](a)):a.localeData().invalidDate()}function Q(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(Qb.lastIndex=0;d>=0&&Qb.test(a);)a=a.replace(Qb,c),Qb.lastIndex=0,d-=1;return a}function R(a,b){var c,d=b._strict;switch(a){case"Q":return _b;case"DDDD":return bc;case"YYYY":case"GGGG":case"gggg":return d?cc:Tb;case"Y":case"G":case"g":return ec;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return d?dc:Ub;case"S":if(d)return _b;case"SS":if(d)return ac;case"SSS":if(d)return bc;case"DDD":return Sb;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Wb;case"a":case"A":return b._locale._meridiemParse;case"x":return Zb;case"X":return $b;case"Z":case"ZZ":return Xb;case"T":return Yb;case"SSSS":return Vb;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return d?ac:Rb;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Rb;case"Do":return d?b._locale._ordinalParse:b._locale._ordinalParseLenient;default:return c=new RegExp($(Z(a.replace("\\","")),"i"))}}function S(a){a=a||"";var b=a.match(Xb)||[],c=b[b.length-1]||[],d=(c+"").match(jc)||["-",0,0],e=+(60*d[1])+C(d[2]);return"+"===d[0]?e:-e}function T(a,b,c){var d,e=c._a;switch(a){case"Q":null!=b&&(e[Db]=3*(C(b)-1));break;case"M":case"MM":null!=b&&(e[Db]=C(b)-1);break;case"MMM":case"MMMM":d=c._locale.monthsParse(b,a,c._strict),null!=d?e[Db]=d:c._pf.invalidMonth=b;break;case"D":case"DD":null!=b&&(e[Eb]=C(b));break;case"Do":null!=b&&(e[Eb]=C(parseInt(b.match(/\d{1,2}/)[0],10)));break;case"DDD":case"DDDD":null!=b&&(c._dayOfYear=C(b));break;case"YY":e[Cb]=vb.parseTwoDigitYear(b);break;case"YYYY":case"YYYYY":case"YYYYYY":e[Cb]=C(b);break;case"a":case"A":c._meridiem=b;break;case"h":case"hh":c._pf.bigHour=!0;case"H":case"HH":e[Fb]=C(b);break;case"m":case"mm":e[Gb]=C(b);break;case"s":case"ss":e[Hb]=C(b);break;case"S":case"SS":case"SSS":case"SSSS":e[Ib]=C(1e3*("0."+b));break;case"x":c._d=new Date(C(b));break;case"X":c._d=new Date(1e3*parseFloat(b));break;case"Z":case"ZZ":c._useUTC=!0,c._tzm=S(b);break;case"dd":case"ddd":case"dddd":d=c._locale.weekdaysParse(b),null!=d?(c._w=c._w||{},c._w.d=d):c._pf.invalidWeekday=b;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":a=a.substr(0,1);case"gggg":case"GGGG":case"GGGGG":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=C(b));break;case"gg":case"GG":c._w=c._w||{},c._w[a]=vb.parseTwoDigitYear(b)}}function U(a){var c,d,e,f,g,h,i;c=a._w,null!=c.GG||null!=c.W||null!=c.E?(g=1,h=4,d=b(c.GG,a._a[Cb],jb(vb(),1,4).year),e=b(c.W,1),f=b(c.E,1)):(g=a._locale._week.dow,h=a._locale._week.doy,d=b(c.gg,a._a[Cb],jb(vb(),g,h).year),e=b(c.w,1),null!=c.d?(f=c.d,g>f&&++e):f=null!=c.e?c.e+g:g),i=kb(d,e,f,h,g),a._a[Cb]=i.year,a._dayOfYear=i.dayOfYear}function V(a){var c,d,e,f,g=[];if(!a._d){for(e=X(a),a._w&&null==a._a[Eb]&&null==a._a[Db]&&U(a),a._dayOfYear&&(f=b(a._a[Cb],e[Cb]),a._dayOfYear>F(f)&&(a._pf._overflowDayOfYear=!0),d=fb(f,0,a._dayOfYear),a._a[Db]=d.getUTCMonth(),a._a[Eb]=d.getUTCDate()),c=0;3>c&&null==a._a[c];++c)a._a[c]=g[c]=e[c];for(;7>c;c++)a._a[c]=g[c]=null==a._a[c]?2===c?1:0:a._a[c];24===a._a[Fb]&&0===a._a[Gb]&&0===a._a[Hb]&&0===a._a[Ib]&&(a._nextDay=!0,a._a[Fb]=0),a._d=(a._useUTC?fb:eb).apply(null,g),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[Fb]=24)}}function W(a){var b;a._d||(b=A(a._i),a._a=[b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],V(a))}function X(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function Y(b){if(b._f===vb.ISO_8601)return void ab(b);b._a=[],b._pf.empty=!0;var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=Q(b._f,b._locale).match(Pb)||[],c=0;c<e.length;c++)f=e[c],d=(h.match(R(f,b))||[])[0],d&&(g=h.substr(0,h.indexOf(d)),g.length>0&&b._pf.unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length),rc[f]?(d?b._pf.empty=!1:b._pf.unusedTokens.push(f),T(f,d,b)):b._strict&&!d&&b._pf.unusedTokens.push(f);b._pf.charsLeftOver=i-j,h.length>0&&b._pf.unusedInput.push(h),b._pf.bigHour===!0&&b._a[Fb]<=12&&(b._pf.bigHour=a),b._a[Fb]=k(b._locale,b._a[Fb],b._meridiem),V(b),H(b)}function Z(a){return a.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function $(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function _(a){var b,c,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,void(a._d=new Date(0/0));for(f=0;f<a._f.length;f++)g=0,b=p({},a),null!=a._useUTC&&(b._useUTC=a._useUTC),b._pf=d(),b._f=a._f[f],Y(b),I(b)&&(g+=b._pf.charsLeftOver,g+=10*b._pf.unusedTokens.length,b._pf.score=g,(null==e||e>g)&&(e=g,c=b));o(a,c||b)}function ab(a){var b,c,d=a._i,e=fc.exec(d);if(e){for(a._pf.iso=!0,b=0,c=hc.length;c>b;b++)if(hc[b][1].exec(d)){a._f=hc[b][0]+(e[6]||" ");break}for(b=0,c=ic.length;c>b;b++)if(ic[b][1].exec(d)){a._f+=ic[b][0];break}d.match(Xb)&&(a._f+="Z"),Y(a)}else a._isValid=!1}function bb(a){ab(a),a._isValid===!1&&(delete a._isValid,vb.createFromInputFallback(a))}function cb(a,b){var c,d=[];for(c=0;c<a.length;++c)d.push(b(a[c],c));return d}function db(b){var c,d=b._i;d===a?b._d=new Date:x(d)?b._d=new Date(+d):null!==(c=Mb.exec(d))?b._d=new Date(+c[1]):"string"==typeof d?bb(b):w(d)?(b._a=cb(d.slice(0),function(a){return parseInt(a,10)}),V(b)):"object"==typeof d?W(b):"number"==typeof d?b._d=new Date(d):vb.createFromInputFallback(b)}function eb(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return 1970>a&&h.setFullYear(a),h}function fb(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function gb(a,b){if("string"==typeof a)if(isNaN(a)){if(a=b.weekdaysParse(a),"number"!=typeof a)return null}else a=parseInt(a,10);return a}function hb(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function ib(a,b,c){var d=vb.duration(a).abs(),e=Ab(d.as("s")),f=Ab(d.as("m")),g=Ab(d.as("h")),h=Ab(d.as("d")),i=Ab(d.as("M")),j=Ab(d.as("y")),k=e<oc.s&&["s",e]||1===f&&["m"]||f<oc.m&&["mm",f]||1===g&&["h"]||g<oc.h&&["hh",g]||1===h&&["d"]||h<oc.d&&["dd",h]||1===i&&["M"]||i<oc.M&&["MM",i]||1===j&&["y"]||["yy",j];return k[2]=b,k[3]=+a>0,k[4]=c,hb.apply({},k)}function jb(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=vb(a).add(f,"d"),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function kb(a,b,c,d,e){var f,g,h=fb(a,0,1).getUTCDay();return h=0===h?7:h,c=null!=c?c:e,f=e-h+(h>d?7:0)-(e>h?7:0),g=7*(b-1)+(c-e)+f+1,{year:g>0?a:a-1,dayOfYear:g>0?g:F(a-1)+g}}function lb(b){var c,d=b._i,e=b._f;return b._locale=b._locale||vb.localeData(b._l),null===d||e===a&&""===d?vb.invalid({nullInput:!0}):("string"==typeof d&&(b._i=d=b._locale.preparse(d)),vb.isMoment(d)?new m(d,!0):(e?w(e)?_(b):Y(b):db(b),c=new m(b),c._nextDay&&(c.add(1,"d"),c._nextDay=a),c))}function mb(a,b){var c,d;if(1===b.length&&w(b[0])&&(b=b[0]),!b.length)return vb();for(c=b[0],d=1;d<b.length;++d)b[d][a](c)&&(c=b[d]);return c}function nb(a,b){var c;return"string"==typeof b&&(b=a.localeData().monthsParse(b),"number"!=typeof b)?a:(c=Math.min(a.date(),D(a.year(),b)),a._d["set"+(a._isUTC?"UTC":"")+"Month"](b,c),a)}function ob(a,b){return a._d["get"+(a._isUTC?"UTC":"")+b]()}function pb(a,b,c){return"Month"===b?nb(a,c):a._d["set"+(a._isUTC?"UTC":"")+b](c)}function qb(a,b){return function(c){return null!=c?(pb(this,a,c),vb.updateOffset(this,b),this):ob(this,a)}}function rb(a){return 400*a/146097}function sb(a){return 146097*a/400}function tb(a){vb.duration.fn[a]=function(){return this._data[a]}}function ub(a){"undefined"==typeof ender&&(wb=zb.moment,zb.moment=a?f("Accessing Moment through the global scope is deprecated, and will be removed in an upcoming release.",vb):vb)}for(var vb,wb,xb,yb="2.9.0",zb="undefined"==typeof global||"undefined"!=typeof window&&window!==global.window?this:global,Ab=Math.round,Bb=Object.prototype.hasOwnProperty,Cb=0,Db=1,Eb=2,Fb=3,Gb=4,Hb=5,Ib=6,Jb={},Kb=[],Lb="undefined"!=typeof module&&module&&module.exports,Mb=/^\/?Date\((\-?\d+)/i,Nb=/(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,Ob=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,Pb=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g,Qb=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,Rb=/\d\d?/,Sb=/\d{1,3}/,Tb=/\d{1,4}/,Ub=/[+\-]?\d{1,6}/,Vb=/\d+/,Wb=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,Xb=/Z|[\+\-]\d\d:?\d\d/gi,Yb=/T/i,Zb=/[\+\-]?\d+/,$b=/[\+\-]?\d+(\.\d{1,3})?/,_b=/\d/,ac=/\d\d/,bc=/\d{3}/,cc=/\d{4}/,dc=/[+-]?\d{6}/,ec=/[+-]?\d+/,fc=/^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,gc="YYYY-MM-DDTHH:mm:ssZ",hc=[["YYYYYY-MM-DD",/[+-]\d{6}-\d{2}-\d{2}/],["YYYY-MM-DD",/\d{4}-\d{2}-\d{2}/],["GGGG-[W]WW-E",/\d{4}-W\d{2}-\d/],["GGGG-[W]WW",/\d{4}-W\d{2}/],["YYYY-DDD",/\d{4}-\d{3}/]],ic=[["HH:mm:ss.SSSS",/(T| )\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss",/(T| )\d\d:\d\d:\d\d/],["HH:mm",/(T| )\d\d:\d\d/],["HH",/(T| )\d\d/]],jc=/([\+\-]|\d\d)/gi,kc=("Date|Hours|Minutes|Seconds|Milliseconds".split("|"),{Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6}),lc={ms:"millisecond",s:"second",m:"minute",h:"hour",d:"day",D:"date",w:"week",W:"isoWeek",M:"month",Q:"quarter",y:"year",DDD:"dayOfYear",e:"weekday",E:"isoWeekday",gg:"weekYear",GG:"isoWeekYear"},mc={dayofyear:"dayOfYear",isoweekday:"isoWeekday",isoweek:"isoWeek",weekyear:"weekYear",isoweekyear:"isoWeekYear"},nc={},oc={s:45,m:45,h:22,d:26,M:11},pc="DDD w W M D d".split(" "),qc="M D H h m s w W".split(" "),rc={M:function(){return this.month()+1},MMM:function(a){return this.localeData().monthsShort(this,a)},MMMM:function(a){return this.localeData().months(this,a)},D:function(){return this.date()},DDD:function(){return this.dayOfYear()},d:function(){return this.day()},dd:function(a){return this.localeData().weekdaysMin(this,a)},ddd:function(a){return this.localeData().weekdaysShort(this,a)},dddd:function(a){return this.localeData().weekdays(this,a)},w:function(){return this.week()},W:function(){return this.isoWeek()},YY:function(){return r(this.year()%100,2)},YYYY:function(){return r(this.year(),4)},YYYYY:function(){return r(this.year(),5)},YYYYYY:function(){var a=this.year(),b=a>=0?"+":"-";return b+r(Math.abs(a),6)},gg:function(){return r(this.weekYear()%100,2)},gggg:function(){return r(this.weekYear(),4)},ggggg:function(){return r(this.weekYear(),5)},GG:function(){return r(this.isoWeekYear()%100,2)},GGGG:function(){return r(this.isoWeekYear(),4)},GGGGG:function(){return r(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return C(this.milliseconds()/100)},SS:function(){return r(C(this.milliseconds()/10),2)},SSS:function(){return r(this.milliseconds(),3)},SSSS:function(){return r(this.milliseconds(),3)},Z:function(){var a=this.utcOffset(),b="+";return 0>a&&(a=-a,b="-"),b+r(C(a/60),2)+":"+r(C(a)%60,2)},ZZ:function(){var a=this.utcOffset(),b="+";return 0>a&&(a=-a,b="-"),b+r(C(a/60),2)+r(C(a)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},x:function(){return this.valueOf()},X:function(){return this.unix()},Q:function(){return this.quarter()}},sc={},tc=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"],uc=!1;pc.length;)xb=pc.pop(),rc[xb+"o"]=i(rc[xb],xb);for(;qc.length;)xb=qc.pop(),rc[xb+xb]=h(rc[xb],2);rc.DDDD=h(rc.DDD,3),o(l.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(a){return this._months[a.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(a){return this._monthsShort[a.month()]},monthsParse:function(a,b,c){var d,e,f;for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),d=0;12>d;d++){if(e=vb.utc([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(a){return this._weekdays[a.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(a){return this._weekdaysShort[a.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(a){return this._weekdaysMin[a.day()]},weekdaysParse:function(a){var b,c,d;for(this._weekdaysParse||(this._weekdaysParse=[]),b=0;7>b;b++)if(this._weekdaysParse[b]||(c=vb([2e3,1]).day(b),d="^"+this.weekdays(c,"")+"|^"+this.weekdaysShort(c,"")+"|^"+this.weekdaysMin(c,""),this._weekdaysParse[b]=new RegExp(d.replace(".",""),"i")),this._weekdaysParse[b].test(a))return b},_longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM D, YYYY LT"},longDateFormat:function(a){var b=this._longDateFormat[a];return!b&&this._longDateFormat[a.toUpperCase()]&&(b=this._longDateFormat[a.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a]=b),b},isPM:function(a){return"p"===(a+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(a,b,c){var d=this._calendar[a];return"function"==typeof d?d.apply(b,[c]):d},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(a,b,c,d){var e=this._relativeTime[c];return"function"==typeof e?e(a,b,c,d):e.replace(/%d/i,a)},pastFuture:function(a,b){var c=this._relativeTime[a>0?"future":"past"];return"function"==typeof c?c(b):c.replace(/%s/i,b)},ordinal:function(a){return this._ordinal.replace("%d",a)},_ordinal:"%d",_ordinalParse:/\d{1,2}/,preparse:function(a){return a},postformat:function(a){return a},week:function(a){return jb(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},firstDayOfWeek:function(){return this._week.dow},firstDayOfYear:function(){return this._week.doy},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),vb=function(b,c,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._i=b,g._f=c,g._l=e,g._strict=f,g._isUTC=!1,g._pf=d(),lb(g)},vb.suppressDeprecationWarnings=!1,vb.createFromInputFallback=f("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),vb.min=function(){var a=[].slice.call(arguments,0);return mb("isBefore",a)},vb.max=function(){var a=[].slice.call(arguments,0);return mb("isAfter",a)},vb.utc=function(b,c,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._useUTC=!0,g._isUTC=!0,g._l=e,g._i=b,g._f=c,g._strict=f,g._pf=d(),lb(g).utc()},vb.unix=function(a){return vb(1e3*a)},vb.duration=function(a,b){var d,e,f,g,h=a,i=null;return vb.isDuration(a)?h={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(h={},b?h[b]=a:h.milliseconds=a):(i=Nb.exec(a))?(d="-"===i[1]?-1:1,h={y:0,d:C(i[Eb])*d,h:C(i[Fb])*d,m:C(i[Gb])*d,s:C(i[Hb])*d,ms:C(i[Ib])*d}):(i=Ob.exec(a))?(d="-"===i[1]?-1:1,f=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*d},h={y:f(i[2]),M:f(i[3]),d:f(i[4]),h:f(i[5]),m:f(i[6]),s:f(i[7]),w:f(i[8])}):null==h?h={}:"object"==typeof h&&("from"in h||"to"in h)&&(g=t(vb(h.from),vb(h.to)),h={},h.ms=g.milliseconds,h.M=g.months),e=new n(h),vb.isDuration(a)&&c(a,"_locale")&&(e._locale=a._locale),e},vb.version=yb,vb.defaultFormat=gc,vb.ISO_8601=function(){},vb.momentProperties=Kb,vb.updateOffset=function(){},vb.relativeTimeThreshold=function(b,c){return oc[b]===a?!1:c===a?oc[b]:(oc[b]=c,!0)},vb.lang=f("moment.lang is deprecated. Use moment.locale instead.",function(a,b){return vb.locale(a,b)}),vb.locale=function(a,b){var c;return a&&(c="undefined"!=typeof b?vb.defineLocale(a,b):vb.localeData(a),c&&(vb.duration._locale=vb._locale=c)),vb._locale._abbr},vb.defineLocale=function(a,b){return null!==b?(b.abbr=a,Jb[a]||(Jb[a]=new l),Jb[a].set(b),vb.locale(a),Jb[a]):(delete Jb[a],null)},vb.langData=f("moment.langData is deprecated. Use moment.localeData instead.",function(a){return vb.localeData(a)}),vb.localeData=function(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return vb._locale;if(!w(a)){if(b=L(a))return b;a=[a]}return K(a)},vb.isMoment=function(a){return a instanceof m||null!=a&&c(a,"_isAMomentObject")},vb.isDuration=function(a){return a instanceof n};for(xb=tc.length-1;xb>=0;--xb)B(tc[xb]);vb.normalizeUnits=function(a){return z(a)},vb.invalid=function(a){var b=vb.utc(0/0);return null!=a?o(b._pf,a):b._pf.userInvalidated=!0,b},vb.parseZone=function(){return vb.apply(null,arguments).parseZone()},vb.parseTwoDigitYear=function(a){return C(a)+(C(a)>68?1900:2e3)},vb.isDate=x,o(vb.fn=m.prototype,{clone:function(){return vb(this)},valueOf:function(){return+this._d-6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var a=vb(this).utc();return 0<a.year()&&a.year()<=9999?"function"==typeof Date.prototype.toISOString?this.toDate().toISOString():P(a,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):P(a,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]")},toArray:function(){var a=this;return[a.year(),a.month(),a.date(),a.hours(),a.minutes(),a.seconds(),a.milliseconds()]},isValid:function(){return I(this)},isDSTShifted:function(){return this._a?this.isValid()&&y(this._a,(this._isUTC?vb.utc(this._a):vb(this._a)).toArray())>0:!1},parsingFlags:function(){return o({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(a){return this.utcOffset(0,a)},local:function(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(this._dateUtcOffset(),"m")),this},format:function(a){var b=P(this,a||vb.defaultFormat);return this.localeData().postformat(b)},add:u(1,"add"),subtract:u(-1,"subtract"),diff:function(a,b,c){var d,e,f=M(a,this),g=6e4*(f.utcOffset()-this.utcOffset());return b=z(b),"year"===b||"month"===b||"quarter"===b?(e=j(this,f),"quarter"===b?e/=3:"year"===b&&(e/=12)):(d=this-f,e="second"===b?d/1e3:"minute"===b?d/6e4:"hour"===b?d/36e5:"day"===b?(d-g)/864e5:"week"===b?(d-g)/6048e5:d),c?e:q(e)},from:function(a,b){return vb.duration({to:this,from:a}).locale(this.locale()).humanize(!b)},fromNow:function(a){return this.from(vb(),a)},calendar:function(a){var b=a||vb(),c=M(b,this).startOf("day"),d=this.diff(c,"days",!0),e=-6>d?"sameElse":-1>d?"lastWeek":0>d?"lastDay":1>d?"sameDay":2>d?"nextDay":7>d?"nextWeek":"sameElse";return this.format(this.localeData().calendar(e,this,vb(b)))},isLeapYear:function(){return G(this.year())},isDST:function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},day:function(a){var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=gb(a,this.localeData()),this.add(a-b,"d")):b},month:qb("Month",!0),startOf:function(a){switch(a=z(a)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===a?this.weekday(0):"isoWeek"===a&&this.isoWeekday(1),"quarter"===a&&this.month(3*Math.floor(this.month()/3)),this},endOf:function(b){return b=z(b),b===a||"millisecond"===b?this:this.startOf(b).add(1,"isoWeek"===b?"week":b).subtract(1,"ms")},isAfter:function(a,b){var c;return b=z("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=vb.isMoment(a)?a:vb(a),+this>+a):(c=vb.isMoment(a)?+a:+vb(a),c<+this.clone().startOf(b))},isBefore:function(a,b){var c;return b=z("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=vb.isMoment(a)?a:vb(a),+a>+this):(c=vb.isMoment(a)?+a:+vb(a),+this.clone().endOf(b)<c)},isBetween:function(a,b,c){return this.isAfter(a,c)&&this.isBefore(b,c)},isSame:function(a,b){var c;return b=z(b||"millisecond"),"millisecond"===b?(a=vb.isMoment(a)?a:vb(a),+this===+a):(c=+vb(a),+this.clone().startOf(b)<=c&&c<=+this.clone().endOf(b))},min:f("moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548",function(a){return a=vb.apply(null,arguments),this>a?this:a}),max:f("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(a){return a=vb.apply(null,arguments),a>this?this:a}),zone:f("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",function(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}),utcOffset:function(a,b){var c,d=this._offset||0;return null!=a?("string"==typeof a&&(a=S(a)),Math.abs(a)<16&&(a=60*a),!this._isUTC&&b&&(c=this._dateUtcOffset()),this._offset=a,this._isUTC=!0,null!=c&&this.add(c,"m"),d!==a&&(!b||this._changeInProgress?v(this,vb.duration(a-d,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,vb.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?d:this._dateUtcOffset()},isLocal:function(){return!this._isUTC},isUtcOffset:function(){return this._isUTC},isUtc:function(){return this._isUTC&&0===this._offset},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(S(this._i)),this},hasAlignedHourOffset:function(a){return a=a?vb(a).utcOffset():0,(this.utcOffset()-a)%60===0},daysInMonth:function(){return D(this.year(),this.month())},dayOfYear:function(a){var b=Ab((vb(this).startOf("day")-vb(this).startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")},quarter:function(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)},weekYear:function(a){var b=jb(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return null==a?b:this.add(a-b,"y")},isoWeekYear:function(a){var b=jb(this,1,4).year;return null==a?b:this.add(a-b,"y")},week:function(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")},isoWeek:function(a){var b=jb(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")},weekday:function(a){var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},isoWeeksInYear:function(){return E(this.year(),1,4)},weeksInYear:function(){var a=this.localeData()._week;return E(this.year(),a.dow,a.doy)},get:function(a){return a=z(a),this[a]()},set:function(a,b){var c;if("object"==typeof a)for(c in a)this.set(c,a[c]);else a=z(a),"function"==typeof this[a]&&this[a](b);return this},locale:function(b){var c;return b===a?this._locale._abbr:(c=vb.localeData(b),null!=c&&(this._locale=c),this)},lang:f("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(b){return b===a?this.localeData():this.locale(b)}),localeData:function(){return this._locale},_dateUtcOffset:function(){return 15*-Math.round(this._d.getTimezoneOffset()/15)}}),vb.fn.millisecond=vb.fn.milliseconds=qb("Milliseconds",!1),vb.fn.second=vb.fn.seconds=qb("Seconds",!1),vb.fn.minute=vb.fn.minutes=qb("Minutes",!1),vb.fn.hour=vb.fn.hours=qb("Hours",!0),vb.fn.date=qb("Date",!0),vb.fn.dates=f("dates accessor is deprecated. Use date instead.",qb("Date",!0)),vb.fn.year=qb("FullYear",!0),vb.fn.years=f("years accessor is deprecated. Use year instead.",qb("FullYear",!0)),vb.fn.days=vb.fn.day,vb.fn.months=vb.fn.month,vb.fn.weeks=vb.fn.week,vb.fn.isoWeeks=vb.fn.isoWeek,vb.fn.quarters=vb.fn.quarter,vb.fn.toJSON=vb.fn.toISOString,vb.fn.isUTC=vb.fn.isUtc,o(vb.duration.fn=n.prototype,{_bubble:function(){var a,b,c,d=this._milliseconds,e=this._days,f=this._months,g=this._data,h=0;g.milliseconds=d%1e3,a=q(d/1e3),g.seconds=a%60,b=q(a/60),g.minutes=b%60,c=q(b/60),g.hours=c%24,e+=q(c/24),h=q(rb(e)),e-=q(sb(h)),f+=q(e/30),e%=30,h+=q(f/12),f%=12,g.days=e,g.months=f,g.years=h},abs:function(){return this._milliseconds=Math.abs(this._milliseconds),this._days=Math.abs(this._days),this._months=Math.abs(this._months),this._data.milliseconds=Math.abs(this._data.milliseconds),this._data.seconds=Math.abs(this._data.seconds),this._data.minutes=Math.abs(this._data.minutes),this._data.hours=Math.abs(this._data.hours),this._data.months=Math.abs(this._data.months),this._data.years=Math.abs(this._data.years),this},weeks:function(){return q(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*C(this._months/12) +},humanize:function(a){var b=ib(this,!a,this.localeData());return a&&(b=this.localeData().pastFuture(+this,b)),this.localeData().postformat(b)},add:function(a,b){var c=vb.duration(a,b);return this._milliseconds+=c._milliseconds,this._days+=c._days,this._months+=c._months,this._bubble(),this},subtract:function(a,b){var c=vb.duration(a,b);return this._milliseconds-=c._milliseconds,this._days-=c._days,this._months-=c._months,this._bubble(),this},get:function(a){return a=z(a),this[a.toLowerCase()+"s"]()},as:function(a){var b,c;if(a=z(a),"month"===a||"year"===a)return b=this._days+this._milliseconds/864e5,c=this._months+12*rb(b),"month"===a?c:c/12;switch(b=this._days+Math.round(sb(this._months/12)),a){case"week":return b/7+this._milliseconds/6048e5;case"day":return b+this._milliseconds/864e5;case"hour":return 24*b+this._milliseconds/36e5;case"minute":return 24*b*60+this._milliseconds/6e4;case"second":return 24*b*60*60+this._milliseconds/1e3;case"millisecond":return Math.floor(24*b*60*60*1e3)+this._milliseconds;default:throw new Error("Unknown unit "+a)}},lang:vb.fn.lang,locale:vb.fn.locale,toIsoString:f("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",function(){return this.toISOString()}),toISOString:function(){var a=Math.abs(this.years()),b=Math.abs(this.months()),c=Math.abs(this.days()),d=Math.abs(this.hours()),e=Math.abs(this.minutes()),f=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(a?a+"Y":"")+(b?b+"M":"")+(c?c+"D":"")+(d||e||f?"T":"")+(d?d+"H":"")+(e?e+"M":"")+(f?f+"S":""):"P0D"},localeData:function(){return this._locale},toJSON:function(){return this.toISOString()}}),vb.duration.fn.toString=vb.duration.fn.toISOString;for(xb in kc)c(kc,xb)&&tb(xb.toLowerCase());vb.duration.fn.asMilliseconds=function(){return this.as("ms")},vb.duration.fn.asSeconds=function(){return this.as("s")},vb.duration.fn.asMinutes=function(){return this.as("m")},vb.duration.fn.asHours=function(){return this.as("h")},vb.duration.fn.asDays=function(){return this.as("d")},vb.duration.fn.asWeeks=function(){return this.as("weeks")},vb.duration.fn.asMonths=function(){return this.as("M")},vb.duration.fn.asYears=function(){return this.as("y")},vb.locale("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===C(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),Lb?module.exports=vb:"function"==typeof define&&define.amd?(define(function(a,b,c){return c.config&&c.config()&&c.config().noGlobal===!0&&(zb.moment=wb),vb}),ub(!0)):ub()}).call(this); \ No newline at end of file diff --git a/theme/bootstrap/plugins/fastclick/fastclick.js b/theme/bootstrap/plugins/fastclick/fastclick.js new file mode 100644 index 0000000..3af4f9d --- /dev/null +++ b/theme/bootstrap/plugins/fastclick/fastclick.js @@ -0,0 +1,841 @@ +;(function () { + 'use strict'; + + /** + * @preserve FastClick: polyfill to remove click delays on browsers with touch UIs. + * + * @codingstandard ftlabs-jsv2 + * @copyright The Financial Times Limited [All Rights Reserved] + * @license MIT License (see LICENSE.txt) + */ + + /*jslint browser:true, node:true*/ + /*global define, Event, Node*/ + + + /** + * Instantiate fast-clicking listeners on the specified layer. + * + * @constructor + * @param {Element} layer The layer to listen on + * @param {Object} [options={}] The options to override the defaults + */ + function FastClick(layer, options) { + var oldOnClick; + + options = options || {}; + + /** + * Whether a click is currently being tracked. + * + * @type boolean + */ + this.trackingClick = false; + + + /** + * Timestamp for when click tracking started. + * + * @type number + */ + this.trackingClickStart = 0; + + + /** + * The element being tracked for a click. + * + * @type EventTarget + */ + this.targetElement = null; + + + /** + * X-coordinate of touch start event. + * + * @type number + */ + this.touchStartX = 0; + + + /** + * Y-coordinate of touch start event. + * + * @type number + */ + this.touchStartY = 0; + + + /** + * ID of the last touch, retrieved from Touch.identifier. + * + * @type number + */ + this.lastTouchIdentifier = 0; + + + /** + * Touchmove boundary, beyond which a click will be cancelled. + * + * @type number + */ + this.touchBoundary = options.touchBoundary || 10; + + + /** + * The FastClick layer. + * + * @type Element + */ + this.layer = layer; + + /** + * The minimum time between tap(touchstart and touchend) events + * + * @type number + */ + this.tapDelay = options.tapDelay || 200; + + /** + * The maximum time for a tap + * + * @type number + */ + this.tapTimeout = options.tapTimeout || 700; + + if (FastClick.notNeeded(layer)) { + return; + } + + // Some old versions of Android don't have Function.prototype.bind + function bind(method, context) { + return function() { return method.apply(context, arguments); }; + } + + + var methods = ['onMouse', 'onClick', 'onTouchStart', 'onTouchMove', 'onTouchEnd', 'onTouchCancel']; + var context = this; + for (var i = 0, l = methods.length; i < l; i++) { + context[methods[i]] = bind(context[methods[i]], context); + } + + // Set up event handlers as required + if (deviceIsAndroid) { + layer.addEventListener('mouseover', this.onMouse, true); + layer.addEventListener('mousedown', this.onMouse, true); + layer.addEventListener('mouseup', this.onMouse, true); + } + + layer.addEventListener('click', this.onClick, true); + layer.addEventListener('touchstart', this.onTouchStart, false); + layer.addEventListener('touchmove', this.onTouchMove, false); + layer.addEventListener('touchend', this.onTouchEnd, false); + layer.addEventListener('touchcancel', this.onTouchCancel, false); + + // Hack is required for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2) + // which is how FastClick normally stops click events bubbling to callbacks registered on the FastClick + // layer when they are cancelled. + if (!Event.prototype.stopImmediatePropagation) { + layer.removeEventListener = function(type, callback, capture) { + var rmv = Node.prototype.removeEventListener; + if (type === 'click') { + rmv.call(layer, type, callback.hijacked || callback, capture); + } else { + rmv.call(layer, type, callback, capture); + } + }; + + layer.addEventListener = function(type, callback, capture) { + var adv = Node.prototype.addEventListener; + if (type === 'click') { + adv.call(layer, type, callback.hijacked || (callback.hijacked = function(event) { + if (!event.propagationStopped) { + callback(event); + } + }), capture); + } else { + adv.call(layer, type, callback, capture); + } + }; + } + + // If a handler is already declared in the element's onclick attribute, it will be fired before + // FastClick's onClick handler. Fix this by pulling out the user-defined handler function and + // adding it as listener. + if (typeof layer.onclick === 'function') { + + // Android browser on at least 3.2 requires a new reference to the function in layer.onclick + // - the old one won't work if passed to addEventListener directly. + oldOnClick = layer.onclick; + layer.addEventListener('click', function(event) { + oldOnClick(event); + }, false); + layer.onclick = null; + } + } + + /** + * Windows Phone 8.1 fakes user agent string to look like Android and iPhone. + * + * @type boolean + */ + var deviceIsWindowsPhone = navigator.userAgent.indexOf("Windows Phone") >= 0; + + /** + * Android requires exceptions. + * + * @type boolean + */ + var deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0 && !deviceIsWindowsPhone; + + + /** + * iOS requires exceptions. + * + * @type boolean + */ + var deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent) && !deviceIsWindowsPhone; + + + /** + * iOS 4 requires an exception for select elements. + * + * @type boolean + */ + var deviceIsIOS4 = deviceIsIOS && (/OS 4_\d(_\d)?/).test(navigator.userAgent); + + + /** + * iOS 6.0-7.* requires the target element to be manually derived + * + * @type boolean + */ + var deviceIsIOSWithBadTarget = deviceIsIOS && (/OS [6-7]_\d/).test(navigator.userAgent); + + /** + * BlackBerry requires exceptions. + * + * @type boolean + */ + var deviceIsBlackBerry10 = navigator.userAgent.indexOf('BB10') > 0; + + /** + * Determine whether a given element requires a native click. + * + * @param {EventTarget|Element} target Target DOM element + * @returns {boolean} Returns true if the element needs a native click + */ + FastClick.prototype.needsClick = function(target) { + switch (target.nodeName.toLowerCase()) { + + // Don't send a synthetic click to disabled inputs (issue #62) + case 'button': + case 'select': + case 'textarea': + if (target.disabled) { + return true; + } + + break; + case 'input': + + // File inputs need real clicks on iOS 6 due to a browser bug (issue #68) + if ((deviceIsIOS && target.type === 'file') || target.disabled) { + return true; + } + + break; + case 'label': + case 'iframe': // iOS8 homescreen apps can prevent events bubbling into frames + case 'video': + return true; + } + + return (/\bneedsclick\b/).test(target.className); + }; + + + /** + * Determine whether a given element requires a call to focus to simulate click into element. + * + * @param {EventTarget|Element} target Target DOM element + * @returns {boolean} Returns true if the element requires a call to focus to simulate native click. + */ + FastClick.prototype.needsFocus = function(target) { + switch (target.nodeName.toLowerCase()) { + case 'textarea': + return true; + case 'select': + return !deviceIsAndroid; + case 'input': + switch (target.type) { + case 'button': + case 'checkbox': + case 'file': + case 'image': + case 'radio': + case 'submit': + return false; + } + + // No point in attempting to focus disabled inputs + return !target.disabled && !target.readOnly; + default: + return (/\bneedsfocus\b/).test(target.className); + } + }; + + + /** + * Send a click event to the specified element. + * + * @param {EventTarget|Element} targetElement + * @param {Event} event + */ + FastClick.prototype.sendClick = function(targetElement, event) { + var clickEvent, touch; + + // On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect (#24) + if (document.activeElement && document.activeElement !== targetElement) { + document.activeElement.blur(); + } + + touch = event.changedTouches[0]; + + // Synthesise a click event, with an extra attribute so it can be tracked + clickEvent = document.createEvent('MouseEvents'); + clickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null); + clickEvent.forwardedTouchEvent = true; + targetElement.dispatchEvent(clickEvent); + }; + + FastClick.prototype.determineEventType = function(targetElement) { + + //Issue #159: Android Chrome Select Box does not open with a synthetic click event + if (deviceIsAndroid && targetElement.tagName.toLowerCase() === 'select') { + return 'mousedown'; + } + + return 'click'; + }; + + + /** + * @param {EventTarget|Element} targetElement + */ + FastClick.prototype.focus = function(targetElement) { + var length; + + // Issue #160: on iOS 7, some input elements (e.g. date datetime month) throw a vague TypeError on setSelectionRange. These elements don't have an integer value for the selectionStart and selectionEnd properties, but unfortunately that can't be used for detection because accessing the properties also throws a TypeError. Just check the type instead. Filed as Apple bug #15122724. + if (deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time' && targetElement.type !== 'month') { + length = targetElement.value.length; + targetElement.setSelectionRange(length, length); + } else { + targetElement.focus(); + } + }; + + + /** + * Check whether the given target element is a child of a scrollable layer and if so, set a flag on it. + * + * @param {EventTarget|Element} targetElement + */ + FastClick.prototype.updateScrollParent = function(targetElement) { + var scrollParent, parentElement; + + scrollParent = targetElement.fastClickScrollParent; + + // Attempt to discover whether the target element is contained within a scrollable layer. Re-check if the + // target element was moved to another parent. + if (!scrollParent || !scrollParent.contains(targetElement)) { + parentElement = targetElement; + do { + if (parentElement.scrollHeight > parentElement.offsetHeight) { + scrollParent = parentElement; + targetElement.fastClickScrollParent = parentElement; + break; + } + + parentElement = parentElement.parentElement; + } while (parentElement); + } + + // Always update the scroll top tracker if possible. + if (scrollParent) { + scrollParent.fastClickLastScrollTop = scrollParent.scrollTop; + } + }; + + + /** + * @param {EventTarget} targetElement + * @returns {Element|EventTarget} + */ + FastClick.prototype.getTargetElementFromEventTarget = function(eventTarget) { + + // On some older browsers (notably Safari on iOS 4.1 - see issue #56) the event target may be a text node. + if (eventTarget.nodeType === Node.TEXT_NODE) { + return eventTarget.parentNode; + } + + return eventTarget; + }; + + + /** + * On touch start, record the position and scroll offset. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.onTouchStart = function(event) { + var targetElement, touch, selection; + + // Ignore multiple touches, otherwise pinch-to-zoom is prevented if both fingers are on the FastClick element (issue #111). + if (event.targetTouches.length > 1) { + return true; + } + + targetElement = this.getTargetElementFromEventTarget(event.target); + touch = event.targetTouches[0]; + + if (deviceIsIOS) { + + // Only trusted events will deselect text on iOS (issue #49) + selection = window.getSelection(); + if (selection.rangeCount && !selection.isCollapsed) { + return true; + } + + if (!deviceIsIOS4) { + + // Weird things happen on iOS when an alert or confirm dialog is opened from a click event callback (issue #23): + // when the user next taps anywhere else on the page, new touchstart and touchend events are dispatched + // with the same identifier as the touch event that previously triggered the click that triggered the alert. + // Sadly, there is an issue on iOS 4 that causes some normal touch events to have the same identifier as an + // immediately preceeding touch event (issue #52), so this fix is unavailable on that platform. + // Issue 120: touch.identifier is 0 when Chrome dev tools 'Emulate touch events' is set with an iOS device UA string, + // which causes all touch events to be ignored. As this block only applies to iOS, and iOS identifiers are always long, + // random integers, it's safe to to continue if the identifier is 0 here. + if (touch.identifier && touch.identifier === this.lastTouchIdentifier) { + event.preventDefault(); + return false; + } + + this.lastTouchIdentifier = touch.identifier; + + // If the target element is a child of a scrollable layer (using -webkit-overflow-scrolling: touch) and: + // 1) the user does a fling scroll on the scrollable layer + // 2) the user stops the fling scroll with another tap + // then the event.target of the last 'touchend' event will be the element that was under the user's finger + // when the fling scroll was started, causing FastClick to send a click event to that layer - unless a check + // is made to ensure that a parent layer was not scrolled before sending a synthetic click (issue #42). + this.updateScrollParent(targetElement); + } + } + + this.trackingClick = true; + this.trackingClickStart = event.timeStamp; + this.targetElement = targetElement; + + this.touchStartX = touch.pageX; + this.touchStartY = touch.pageY; + + // Prevent phantom clicks on fast double-tap (issue #36) + if ((event.timeStamp - this.lastClickTime) < this.tapDelay) { + event.preventDefault(); + } + + return true; + }; + + + /** + * Based on a touchmove event object, check whether the touch has moved past a boundary since it started. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.touchHasMoved = function(event) { + var touch = event.changedTouches[0], boundary = this.touchBoundary; + + if (Math.abs(touch.pageX - this.touchStartX) > boundary || Math.abs(touch.pageY - this.touchStartY) > boundary) { + return true; + } + + return false; + }; + + + /** + * Update the last position. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.onTouchMove = function(event) { + if (!this.trackingClick) { + return true; + } + + // If the touch has moved, cancel the click tracking + if (this.targetElement !== this.getTargetElementFromEventTarget(event.target) || this.touchHasMoved(event)) { + this.trackingClick = false; + this.targetElement = null; + } + + return true; + }; + + + /** + * Attempt to find the labelled control for the given label element. + * + * @param {EventTarget|HTMLLabelElement} labelElement + * @returns {Element|null} + */ + FastClick.prototype.findControl = function(labelElement) { + + // Fast path for newer browsers supporting the HTML5 control attribute + if (labelElement.control !== undefined) { + return labelElement.control; + } + + // All browsers under test that support touch events also support the HTML5 htmlFor attribute + if (labelElement.htmlFor) { + return document.getElementById(labelElement.htmlFor); + } + + // If no for attribute exists, attempt to retrieve the first labellable descendant element + // the list of which is defined here: http://www.w3.org/TR/html5/forms.html#category-label + return labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea'); + }; + + + /** + * On touch end, determine whether to send a click event at once. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.onTouchEnd = function(event) { + var forElement, trackingClickStart, targetTagName, scrollParent, touch, targetElement = this.targetElement; + + if (!this.trackingClick) { + return true; + } + + // Prevent phantom clicks on fast double-tap (issue #36) + if ((event.timeStamp - this.lastClickTime) < this.tapDelay) { + this.cancelNextClick = true; + return true; + } + + if ((event.timeStamp - this.trackingClickStart) > this.tapTimeout) { + return true; + } + + // Reset to prevent wrong click cancel on input (issue #156). + this.cancelNextClick = false; + + this.lastClickTime = event.timeStamp; + + trackingClickStart = this.trackingClickStart; + this.trackingClick = false; + this.trackingClickStart = 0; + + // On some iOS devices, the targetElement supplied with the event is invalid if the layer + // is performing a transition or scroll, and has to be re-detected manually. Note that + // for this to function correctly, it must be called *after* the event target is checked! + // See issue #57; also filed as rdar://13048589 . + if (deviceIsIOSWithBadTarget) { + touch = event.changedTouches[0]; + + // In certain cases arguments of elementFromPoint can be negative, so prevent setting targetElement to null + targetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset) || targetElement; + targetElement.fastClickScrollParent = this.targetElement.fastClickScrollParent; + } + + targetTagName = targetElement.tagName.toLowerCase(); + if (targetTagName === 'label') { + forElement = this.findControl(targetElement); + if (forElement) { + this.focus(targetElement); + if (deviceIsAndroid) { + return false; + } + + targetElement = forElement; + } + } else if (this.needsFocus(targetElement)) { + + // Case 1: If the touch started a while ago (best guess is 100ms based on tests for issue #36) then focus will be triggered anyway. Return early and unset the target element reference so that the subsequent click will be allowed through. + // Case 2: Without this exception for input elements tapped when the document is contained in an iframe, then any inputted text won't be visible even though the value attribute is updated as the user types (issue #37). + if ((event.timeStamp - trackingClickStart) > 100 || (deviceIsIOS && window.top !== window && targetTagName === 'input')) { + this.targetElement = null; + return false; + } + + this.focus(targetElement); + this.sendClick(targetElement, event); + + // Select elements need the event to go through on iOS 4, otherwise the selector menu won't open. + // Also this breaks opening selects when VoiceOver is active on iOS6, iOS7 (and possibly others) + if (!deviceIsIOS || targetTagName !== 'select') { + this.targetElement = null; + event.preventDefault(); + } + + return false; + } + + if (deviceIsIOS && !deviceIsIOS4) { + + // Don't send a synthetic click event if the target element is contained within a parent layer that was scrolled + // and this tap is being used to stop the scrolling (usually initiated by a fling - issue #42). + scrollParent = targetElement.fastClickScrollParent; + if (scrollParent && scrollParent.fastClickLastScrollTop !== scrollParent.scrollTop) { + return true; + } + } + + // Prevent the actual click from going though - unless the target node is marked as requiring + // real clicks or if it is in the whitelist in which case only non-programmatic clicks are permitted. + if (!this.needsClick(targetElement)) { + event.preventDefault(); + this.sendClick(targetElement, event); + } + + return false; + }; + + + /** + * On touch cancel, stop tracking the click. + * + * @returns {void} + */ + FastClick.prototype.onTouchCancel = function() { + this.trackingClick = false; + this.targetElement = null; + }; + + + /** + * Determine mouse events which should be permitted. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.onMouse = function(event) { + + // If a target element was never set (because a touch event was never fired) allow the event + if (!this.targetElement) { + return true; + } + + if (event.forwardedTouchEvent) { + return true; + } + + // Programmatically generated events targeting a specific element should be permitted + if (!event.cancelable) { + return true; + } + + // Derive and check the target element to see whether the mouse event needs to be permitted; + // unless explicitly enabled, prevent non-touch click events from triggering actions, + // to prevent ghost/doubleclicks. + if (!this.needsClick(this.targetElement) || this.cancelNextClick) { + + // Prevent any user-added listeners declared on FastClick element from being fired. + if (event.stopImmediatePropagation) { + event.stopImmediatePropagation(); + } else { + + // Part of the hack for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2) + event.propagationStopped = true; + } + + // Cancel the event + event.stopPropagation(); + event.preventDefault(); + + return false; + } + + // If the mouse event is permitted, return true for the action to go through. + return true; + }; + + + /** + * On actual clicks, determine whether this is a touch-generated click, a click action occurring + * naturally after a delay after a touch (which needs to be cancelled to avoid duplication), or + * an actual click which should be permitted. + * + * @param {Event} event + * @returns {boolean} + */ + FastClick.prototype.onClick = function(event) { + var permitted; + + // It's possible for another FastClick-like library delivered with third-party code to fire a click event before FastClick does (issue #44). In that case, set the click-tracking flag back to false and return early. This will cause onTouchEnd to return early. + if (this.trackingClick) { + this.targetElement = null; + this.trackingClick = false; + return true; + } + + // Very odd behaviour on iOS (issue #18): if a submit element is present inside a form and the user hits enter in the iOS simulator or clicks the Go button on the pop-up OS keyboard the a kind of 'fake' click event will be triggered with the submit-type input element as the target. + if (event.target.type === 'submit' && event.detail === 0) { + return true; + } + + permitted = this.onMouse(event); + + // Only unset targetElement if the click is not permitted. This will ensure that the check for !targetElement in onMouse fails and the browser's click doesn't go through. + if (!permitted) { + this.targetElement = null; + } + + // If clicks are permitted, return true for the action to go through. + return permitted; + }; + + + /** + * Remove all FastClick's event listeners. + * + * @returns {void} + */ + FastClick.prototype.destroy = function() { + var layer = this.layer; + + if (deviceIsAndroid) { + layer.removeEventListener('mouseover', this.onMouse, true); + layer.removeEventListener('mousedown', this.onMouse, true); + layer.removeEventListener('mouseup', this.onMouse, true); + } + + layer.removeEventListener('click', this.onClick, true); + layer.removeEventListener('touchstart', this.onTouchStart, false); + layer.removeEventListener('touchmove', this.onTouchMove, false); + layer.removeEventListener('touchend', this.onTouchEnd, false); + layer.removeEventListener('touchcancel', this.onTouchCancel, false); + }; + + + /** + * Check whether FastClick is needed. + * + * @param {Element} layer The layer to listen on + */ + FastClick.notNeeded = function(layer) { + var metaViewport; + var chromeVersion; + var blackberryVersion; + var firefoxVersion; + + // Devices that don't support touch don't need FastClick + if (typeof window.ontouchstart === 'undefined') { + return true; + } + + // Chrome version - zero for other browsers + chromeVersion = +(/Chrome\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1]; + + if (chromeVersion) { + + if (deviceIsAndroid) { + metaViewport = document.querySelector('meta[name=viewport]'); + + if (metaViewport) { + // Chrome on Android with user-scalable="no" doesn't need FastClick (issue #89) + if (metaViewport.content.indexOf('user-scalable=no') !== -1) { + return true; + } + // Chrome 32 and above with width=device-width or less don't need FastClick + if (chromeVersion > 31 && document.documentElement.scrollWidth <= window.outerWidth) { + return true; + } + } + + // Chrome desktop doesn't need FastClick (issue #15) + } else { + return true; + } + } + + if (deviceIsBlackBerry10) { + blackberryVersion = navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/); + + // BlackBerry 10.3+ does not require Fastclick library. + // https://github.com/ftlabs/fastclick/issues/251 + if (blackberryVersion[1] >= 10 && blackberryVersion[2] >= 3) { + metaViewport = document.querySelector('meta[name=viewport]'); + + if (metaViewport) { + // user-scalable=no eliminates click delay. + if (metaViewport.content.indexOf('user-scalable=no') !== -1) { + return true; + } + // width=device-width (or less than device-width) eliminates click delay. + if (document.documentElement.scrollWidth <= window.outerWidth) { + return true; + } + } + } + } + + // IE10 with -ms-touch-action: none or manipulation, which disables double-tap-to-zoom (issue #97) + if (layer.style.msTouchAction === 'none' || layer.style.touchAction === 'manipulation') { + return true; + } + + // Firefox version - zero for other browsers + firefoxVersion = +(/Firefox\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1]; + + if (firefoxVersion >= 27) { + // Firefox 27+ does not have tap delay if the content is not zoomable - https://bugzilla.mozilla.org/show_bug.cgi?id=922896 + + metaViewport = document.querySelector('meta[name=viewport]'); + if (metaViewport && (metaViewport.content.indexOf('user-scalable=no') !== -1 || document.documentElement.scrollWidth <= window.outerWidth)) { + return true; + } + } + + // IE11: prefixed -ms-touch-action is no longer supported and it's recomended to use non-prefixed version + // http://msdn.microsoft.com/en-us/library/windows/apps/Hh767313.aspx + if (layer.style.touchAction === 'none' || layer.style.touchAction === 'manipulation') { + return true; + } + + return false; + }; + + + /** + * Factory method for creating a FastClick object + * + * @param {Element} layer The layer to listen on + * @param {Object} [options={}] The options to override the defaults + */ + FastClick.attach = function(layer, options) { + return new FastClick(layer, options); + }; + + + if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) { + + // AMD. Register as an anonymous module. + define(function() { + return FastClick; + }); + } else if (typeof module !== 'undefined' && module.exports) { + module.exports = FastClick.attach; + module.exports.FastClick = FastClick; + } else { + window.FastClick = FastClick; + } +}()); diff --git a/theme/bootstrap/plugins/fastclick/fastclick.min.js b/theme/bootstrap/plugins/fastclick/fastclick.min.js new file mode 100644 index 0000000..131e29e --- /dev/null +++ b/theme/bootstrap/plugins/fastclick/fastclick.min.js @@ -0,0 +1 @@ +!function e(t,n,r){function i(s,a){if(!n[s]){if(!t[s]){var c="function"==typeof require&&require;if(!a&&c)return c(s,!0);if(o)return o(s,!0);var l=new Error("Cannot find module '"+s+"'");throw l.code="MODULE_NOT_FOUND",l}var u=n[s]={exports:{}};t[s][0].call(u.exports,function(e){var n=t[s][1][e];return i(n?n:e)},u,u.exports,e,t,n,r)}return n[s].exports}for(var o="function"==typeof require&&require,s=0;s<r.length;s++)i(r[s]);return i}({1:[function(e,t){!function(){"use strict";function e(t,n){function i(e,t){return function(){return e.apply(t,arguments)}}var o;if(n=n||{},this.trackingClick=!1,this.trackingClickStart=0,this.targetElement=null,this.touchStartX=0,this.touchStartY=0,this.lastTouchIdentifier=0,this.touchBoundary=n.touchBoundary||10,this.layer=t,this.tapDelay=n.tapDelay||200,this.tapTimeout=n.tapTimeout||700,!e.notNeeded(t)){for(var s=["onMouse","onClick","onTouchStart","onTouchMove","onTouchEnd","onTouchCancel"],a=this,c=0,l=s.length;l>c;c++)a[s[c]]=i(a[s[c]],a);r&&(t.addEventListener("mouseover",this.onMouse,!0),t.addEventListener("mousedown",this.onMouse,!0),t.addEventListener("mouseup",this.onMouse,!0)),t.addEventListener("click",this.onClick,!0),t.addEventListener("touchstart",this.onTouchStart,!1),t.addEventListener("touchmove",this.onTouchMove,!1),t.addEventListener("touchend",this.onTouchEnd,!1),t.addEventListener("touchcancel",this.onTouchCancel,!1),Event.prototype.stopImmediatePropagation||(t.removeEventListener=function(e,n,r){var i=Node.prototype.removeEventListener;"click"===e?i.call(t,e,n.hijacked||n,r):i.call(t,e,n,r)},t.addEventListener=function(e,n,r){var i=Node.prototype.addEventListener;"click"===e?i.call(t,e,n.hijacked||(n.hijacked=function(e){e.propagationStopped||n(e)}),r):i.call(t,e,n,r)}),"function"==typeof t.onclick&&(o=t.onclick,t.addEventListener("click",function(e){o(e)},!1),t.onclick=null)}}var n=navigator.userAgent.indexOf("Windows Phone")>=0,r=navigator.userAgent.indexOf("Android")>0&&!n,i=/iP(ad|hone|od)/.test(navigator.userAgent)&&!n,o=i&&/OS 4_\d(_\d)?/.test(navigator.userAgent),s=i&&/OS [6-7]_\d/.test(navigator.userAgent),a=navigator.userAgent.indexOf("BB10")>0;e.prototype.needsClick=function(e){switch(e.nodeName.toLowerCase()){case"button":case"select":case"textarea":if(e.disabled)return!0;break;case"input":if(i&&"file"===e.type||e.disabled)return!0;break;case"label":case"iframe":case"video":return!0}return/\bneedsclick\b/.test(e.className)},e.prototype.needsFocus=function(e){switch(e.nodeName.toLowerCase()){case"textarea":return!0;case"select":return!r;case"input":switch(e.type){case"button":case"checkbox":case"file":case"image":case"radio":case"submit":return!1}return!e.disabled&&!e.readOnly;default:return/\bneedsfocus\b/.test(e.className)}},e.prototype.sendClick=function(e,t){var n,r;document.activeElement&&document.activeElement!==e&&document.activeElement.blur(),r=t.changedTouches[0],n=document.createEvent("MouseEvents"),n.initMouseEvent(this.determineEventType(e),!0,!0,window,1,r.screenX,r.screenY,r.clientX,r.clientY,!1,!1,!1,!1,0,null),n.forwardedTouchEvent=!0,e.dispatchEvent(n)},e.prototype.determineEventType=function(e){return r&&"select"===e.tagName.toLowerCase()?"mousedown":"click"},e.prototype.focus=function(e){var t;i&&e.setSelectionRange&&0!==e.type.indexOf("date")&&"time"!==e.type&&"month"!==e.type?(t=e.value.length,e.setSelectionRange(t,t)):e.focus()},e.prototype.updateScrollParent=function(e){var t,n;if(t=e.fastClickScrollParent,!t||!t.contains(e)){n=e;do{if(n.scrollHeight>n.offsetHeight){t=n,e.fastClickScrollParent=n;break}n=n.parentElement}while(n)}t&&(t.fastClickLastScrollTop=t.scrollTop)},e.prototype.getTargetElementFromEventTarget=function(e){return e.nodeType===Node.TEXT_NODE?e.parentNode:e},e.prototype.onTouchStart=function(e){var t,n,r;if(e.targetTouches.length>1)return!0;if(t=this.getTargetElementFromEventTarget(e.target),n=e.targetTouches[0],i){if(r=window.getSelection(),r.rangeCount&&!r.isCollapsed)return!0;if(!o){if(n.identifier&&n.identifier===this.lastTouchIdentifier)return e.preventDefault(),!1;this.lastTouchIdentifier=n.identifier,this.updateScrollParent(t)}}return this.trackingClick=!0,this.trackingClickStart=e.timeStamp,this.targetElement=t,this.touchStartX=n.pageX,this.touchStartY=n.pageY,e.timeStamp-this.lastClickTime<this.tapDelay&&e.preventDefault(),!0},e.prototype.touchHasMoved=function(e){var t=e.changedTouches[0],n=this.touchBoundary;return Math.abs(t.pageX-this.touchStartX)>n||Math.abs(t.pageY-this.touchStartY)>n?!0:!1},e.prototype.onTouchMove=function(e){return this.trackingClick?((this.targetElement!==this.getTargetElementFromEventTarget(e.target)||this.touchHasMoved(e))&&(this.trackingClick=!1,this.targetElement=null),!0):!0},e.prototype.findControl=function(e){return void 0!==e.control?e.control:e.htmlFor?document.getElementById(e.htmlFor):e.querySelector("button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea")},e.prototype.onTouchEnd=function(e){var t,n,a,c,l,u=this.targetElement;if(!this.trackingClick)return!0;if(e.timeStamp-this.lastClickTime<this.tapDelay)return this.cancelNextClick=!0,!0;if(e.timeStamp-this.trackingClickStart>this.tapTimeout)return!0;if(this.cancelNextClick=!1,this.lastClickTime=e.timeStamp,n=this.trackingClickStart,this.trackingClick=!1,this.trackingClickStart=0,s&&(l=e.changedTouches[0],u=document.elementFromPoint(l.pageX-window.pageXOffset,l.pageY-window.pageYOffset)||u,u.fastClickScrollParent=this.targetElement.fastClickScrollParent),a=u.tagName.toLowerCase(),"label"===a){if(t=this.findControl(u)){if(this.focus(u),r)return!1;u=t}}else if(this.needsFocus(u))return e.timeStamp-n>100||i&&window.top!==window&&"input"===a?(this.targetElement=null,!1):(this.focus(u),this.sendClick(u,e),i&&"select"===a||(this.targetElement=null,e.preventDefault()),!1);return i&&!o&&(c=u.fastClickScrollParent,c&&c.fastClickLastScrollTop!==c.scrollTop)?!0:(this.needsClick(u)||(e.preventDefault(),this.sendClick(u,e)),!1)},e.prototype.onTouchCancel=function(){this.trackingClick=!1,this.targetElement=null},e.prototype.onMouse=function(e){return this.targetElement?e.forwardedTouchEvent?!0:e.cancelable&&(!this.needsClick(this.targetElement)||this.cancelNextClick)?(e.stopImmediatePropagation?e.stopImmediatePropagation():e.propagationStopped=!0,e.stopPropagation(),e.preventDefault(),!1):!0:!0},e.prototype.onClick=function(e){var t;return this.trackingClick?(this.targetElement=null,this.trackingClick=!1,!0):"submit"===e.target.type&&0===e.detail?!0:(t=this.onMouse(e),t||(this.targetElement=null),t)},e.prototype.destroy=function(){var e=this.layer;r&&(e.removeEventListener("mouseover",this.onMouse,!0),e.removeEventListener("mousedown",this.onMouse,!0),e.removeEventListener("mouseup",this.onMouse,!0)),e.removeEventListener("click",this.onClick,!0),e.removeEventListener("touchstart",this.onTouchStart,!1),e.removeEventListener("touchmove",this.onTouchMove,!1),e.removeEventListener("touchend",this.onTouchEnd,!1),e.removeEventListener("touchcancel",this.onTouchCancel,!1)},e.notNeeded=function(e){var t,n,i,o;if("undefined"==typeof window.ontouchstart)return!0;if(n=+(/Chrome\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1]){if(!r)return!0;if(t=document.querySelector("meta[name=viewport]")){if(-1!==t.content.indexOf("user-scalable=no"))return!0;if(n>31&&document.documentElement.scrollWidth<=window.outerWidth)return!0}}if(a&&(i=navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/),i[1]>=10&&i[2]>=3&&(t=document.querySelector("meta[name=viewport]")))){if(-1!==t.content.indexOf("user-scalable=no"))return!0;if(document.documentElement.scrollWidth<=window.outerWidth)return!0}return"none"===e.style.msTouchAction||"manipulation"===e.style.touchAction?!0:(o=+(/Firefox\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1],o>=27&&(t=document.querySelector("meta[name=viewport]"),t&&(-1!==t.content.indexOf("user-scalable=no")||document.documentElement.scrollWidth<=window.outerWidth))?!0:"none"===e.style.touchAction||"manipulation"===e.style.touchAction?!0:!1)},e.attach=function(t,n){return new e(t,n)},"function"==typeof define&&"object"==typeof define.amd&&define.amd?define(function(){return e}):"undefined"!=typeof t&&t.exports?(t.exports=e.attach,t.exports.FastClick=e):window.FastClick=e}()},{}],2:[function(e){window.Origami={fastclick:e("./bower_components/fastclick/lib/fastclick.js")}},{"./bower_components/fastclick/lib/fastclick.js":1}]},{},[2]);;(function() {function trigger(){document.dispatchEvent(new CustomEvent('o.load'))};document.addEventListener('load',trigger);if (document.readyState==='ready') trigger();}());(function() {function trigger(){document.dispatchEvent(new CustomEvent('o.DOMContentLoaded'))};document.addEventListener('DOMContentLoaded',trigger);if (document.readyState==='interactive') trigger();}()) \ No newline at end of file diff --git a/theme/bootstrap/plugins/flot/excanvas.js b/theme/bootstrap/plugins/flot/excanvas.js new file mode 100644 index 0000000..f45bf03 --- /dev/null +++ b/theme/bootstrap/plugins/flot/excanvas.js @@ -0,0 +1,1427 @@ +// Copyright 2006 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// Known Issues: +// +// * Patterns only support repeat. +// * Radial gradient are not implemented. The VML version of these look very +// different from the canvas one. +// * Clipping paths are not implemented. +// * Coordsize. The width and height attribute have higher priority than the +// width and height style values which isn't correct. +// * Painting mode isn't implemented. +// * Canvas width/height should is using content-box by default. IE in +// Quirks mode will draw the canvas using border-box. Either change your +// doctype to HTML5 +// (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype) +// or use Box Sizing Behavior from WebFX +// (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html) +// * Non uniform scaling does not correctly scale strokes. +// * Filling very large shapes (above 5000 points) is buggy. +// * Optimize. There is always room for speed improvements. + +// Only add this code if we do not already have a canvas implementation +if (!document.createElement('canvas').getContext) { + +(function() { + + // alias some functions to make (compiled) code shorter + var m = Math; + var mr = m.round; + var ms = m.sin; + var mc = m.cos; + var abs = m.abs; + var sqrt = m.sqrt; + + // this is used for sub pixel precision + var Z = 10; + var Z2 = Z / 2; + + var IE_VERSION = +navigator.userAgent.match(/MSIE ([\d.]+)?/)[1]; + + /** + * This funtion is assigned to the <canvas> elements as element.getContext(). + * @this {HTMLElement} + * @return {CanvasRenderingContext2D_} + */ + function getContext() { + return this.context_ || + (this.context_ = new CanvasRenderingContext2D_(this)); + } + + var slice = Array.prototype.slice; + + /** + * Binds a function to an object. The returned function will always use the + * passed in {@code obj} as {@code this}. + * + * Example: + * + * g = bind(f, obj, a, b) + * g(c, d) // will do f.call(obj, a, b, c, d) + * + * @param {Function} f The function to bind the object to + * @param {Object} obj The object that should act as this when the function + * is called + * @param {*} var_args Rest arguments that will be used as the initial + * arguments when the function is called + * @return {Function} A new function that has bound this + */ + function bind(f, obj, var_args) { + var a = slice.call(arguments, 2); + return function() { + return f.apply(obj, a.concat(slice.call(arguments))); + }; + } + + function encodeHtmlAttribute(s) { + return String(s).replace(/&/g, '&amp;').replace(/"/g, '&quot;'); + } + + function addNamespace(doc, prefix, urn) { + if (!doc.namespaces[prefix]) { + doc.namespaces.add(prefix, urn, '#default#VML'); + } + } + + function addNamespacesAndStylesheet(doc) { + addNamespace(doc, 'g_vml_', 'urn:schemas-microsoft-com:vml'); + addNamespace(doc, 'g_o_', 'urn:schemas-microsoft-com:office:office'); + + // Setup default CSS. Only add one style sheet per document + if (!doc.styleSheets['ex_canvas_']) { + var ss = doc.createStyleSheet(); + ss.owningElement.id = 'ex_canvas_'; + ss.cssText = 'canvas{display:inline-block;overflow:hidden;' + + // default size is 300x150 in Gecko and Opera + 'text-align:left;width:300px;height:150px}'; + } + } + + // Add namespaces and stylesheet at startup. + addNamespacesAndStylesheet(document); + + var G_vmlCanvasManager_ = { + init: function(opt_doc) { + var doc = opt_doc || document; + // Create a dummy element so that IE will allow canvas elements to be + // recognized. + doc.createElement('canvas'); + doc.attachEvent('onreadystatechange', bind(this.init_, this, doc)); + }, + + init_: function(doc) { + // find all canvas elements + var els = doc.getElementsByTagName('canvas'); + for (var i = 0; i < els.length; i++) { + this.initElement(els[i]); + } + }, + + /** + * Public initializes a canvas element so that it can be used as canvas + * element from now on. This is called automatically before the page is + * loaded but if you are creating elements using createElement you need to + * make sure this is called on the element. + * @param {HTMLElement} el The canvas element to initialize. + * @return {HTMLElement} the element that was created. + */ + initElement: function(el) { + if (!el.getContext) { + el.getContext = getContext; + + // Add namespaces and stylesheet to document of the element. + addNamespacesAndStylesheet(el.ownerDocument); + + // Remove fallback content. There is no way to hide text nodes so we + // just remove all childNodes. We could hide all elements and remove + // text nodes but who really cares about the fallback content. + el.innerHTML = ''; + + // do not use inline function because that will leak memory + el.attachEvent('onpropertychange', onPropertyChange); + el.attachEvent('onresize', onResize); + + var attrs = el.attributes; + if (attrs.width && attrs.width.specified) { + // TODO: use runtimeStyle and coordsize + // el.getContext().setWidth_(attrs.width.nodeValue); + el.style.width = attrs.width.nodeValue + 'px'; + } else { + el.width = el.clientWidth; + } + if (attrs.height && attrs.height.specified) { + // TODO: use runtimeStyle and coordsize + // el.getContext().setHeight_(attrs.height.nodeValue); + el.style.height = attrs.height.nodeValue + 'px'; + } else { + el.height = el.clientHeight; + } + //el.getContext().setCoordsize_() + } + return el; + } + }; + + function onPropertyChange(e) { + var el = e.srcElement; + + switch (e.propertyName) { + case 'width': + el.getContext().clearRect(); + el.style.width = el.attributes.width.nodeValue + 'px'; + // In IE8 this does not trigger onresize. + el.firstChild.style.width = el.clientWidth + 'px'; + break; + case 'height': + el.getContext().clearRect(); + el.style.height = el.attributes.height.nodeValue + 'px'; + el.firstChild.style.height = el.clientHeight + 'px'; + break; + } + } + + function onResize(e) { + var el = e.srcElement; + if (el.firstChild) { + el.firstChild.style.width = el.clientWidth + 'px'; + el.firstChild.style.height = el.clientHeight + 'px'; + } + } + + G_vmlCanvasManager_.init(); + + // precompute "00" to "FF" + var decToHex = []; + for (var i = 0; i < 16; i++) { + for (var j = 0; j < 16; j++) { + decToHex[i * 16 + j] = i.toString(16) + j.toString(16); + } + } + + function createMatrixIdentity() { + return [ + [1, 0, 0], + [0, 1, 0], + [0, 0, 1] + ]; + } + + function matrixMultiply(m1, m2) { + var result = createMatrixIdentity(); + + for (var x = 0; x < 3; x++) { + for (var y = 0; y < 3; y++) { + var sum = 0; + + for (var z = 0; z < 3; z++) { + sum += m1[x][z] * m2[z][y]; + } + + result[x][y] = sum; + } + } + return result; + } + + function copyState(o1, o2) { + o2.fillStyle = o1.fillStyle; + o2.lineCap = o1.lineCap; + o2.lineJoin = o1.lineJoin; + o2.lineWidth = o1.lineWidth; + o2.miterLimit = o1.miterLimit; + o2.shadowBlur = o1.shadowBlur; + o2.shadowColor = o1.shadowColor; + o2.shadowOffsetX = o1.shadowOffsetX; + o2.shadowOffsetY = o1.shadowOffsetY; + o2.strokeStyle = o1.strokeStyle; + o2.globalAlpha = o1.globalAlpha; + o2.font = o1.font; + o2.textAlign = o1.textAlign; + o2.textBaseline = o1.textBaseline; + o2.arcScaleX_ = o1.arcScaleX_; + o2.arcScaleY_ = o1.arcScaleY_; + o2.lineScale_ = o1.lineScale_; + } + + var colorData = { + aliceblue: '#F0F8FF', + antiquewhite: '#FAEBD7', + aquamarine: '#7FFFD4', + azure: '#F0FFFF', + beige: '#F5F5DC', + bisque: '#FFE4C4', + black: '#000000', + blanchedalmond: '#FFEBCD', + blueviolet: '#8A2BE2', + brown: '#A52A2A', + burlywood: '#DEB887', + cadetblue: '#5F9EA0', + chartreuse: '#7FFF00', + chocolate: '#D2691E', + coral: '#FF7F50', + cornflowerblue: '#6495ED', + cornsilk: '#FFF8DC', + crimson: '#DC143C', + cyan: '#00FFFF', + darkblue: '#00008B', + darkcyan: '#008B8B', + darkgoldenrod: '#B8860B', + darkgray: '#A9A9A9', + darkgreen: '#006400', + darkgrey: '#A9A9A9', + darkkhaki: '#BDB76B', + darkmagenta: '#8B008B', + darkolivegreen: '#556B2F', + darkorange: '#FF8C00', + darkorchid: '#9932CC', + darkred: '#8B0000', + darksalmon: '#E9967A', + darkseagreen: '#8FBC8F', + darkslateblue: '#483D8B', + darkslategray: '#2F4F4F', + darkslategrey: '#2F4F4F', + darkturquoise: '#00CED1', + darkviolet: '#9400D3', + deeppink: '#FF1493', + deepskyblue: '#00BFFF', + dimgray: '#696969', + dimgrey: '#696969', + dodgerblue: '#1E90FF', + firebrick: '#B22222', + floralwhite: '#FFFAF0', + forestgreen: '#228B22', + gainsboro: '#DCDCDC', + ghostwhite: '#F8F8FF', + gold: '#FFD700', + goldenrod: '#DAA520', + grey: '#808080', + greenyellow: '#ADFF2F', + honeydew: '#F0FFF0', + hotpink: '#FF69B4', + indianred: '#CD5C5C', + indigo: '#4B0082', + ivory: '#FFFFF0', + khaki: '#F0E68C', + lavender: '#E6E6FA', + lavenderblush: '#FFF0F5', + lawngreen: '#7CFC00', + lemonchiffon: '#FFFACD', + lightblue: '#ADD8E6', + lightcoral: '#F08080', + lightcyan: '#E0FFFF', + lightgoldenrodyellow: '#FAFAD2', + lightgreen: '#90EE90', + lightgrey: '#D3D3D3', + lightpink: '#FFB6C1', + lightsalmon: '#FFA07A', + lightseagreen: '#20B2AA', + lightskyblue: '#87CEFA', + lightslategray: '#778899', + lightslategrey: '#778899', + lightsteelblue: '#B0C4DE', + lightyellow: '#FFFFE0', + limegreen: '#32CD32', + linen: '#FAF0E6', + magenta: '#FF00FF', + mediumaquamarine: '#66CDAA', + mediumblue: '#0000CD', + mediumorchid: '#BA55D3', + mediumpurple: '#9370DB', + mediumseagreen: '#3CB371', + mediumslateblue: '#7B68EE', + mediumspringgreen: '#00FA9A', + mediumturquoise: '#48D1CC', + mediumvioletred: '#C71585', + midnightblue: '#191970', + mintcream: '#F5FFFA', + mistyrose: '#FFE4E1', + moccasin: '#FFE4B5', + navajowhite: '#FFDEAD', + oldlace: '#FDF5E6', + olivedrab: '#6B8E23', + orange: '#FFA500', + orangered: '#FF4500', + orchid: '#DA70D6', + palegoldenrod: '#EEE8AA', + palegreen: '#98FB98', + paleturquoise: '#AFEEEE', + palevioletred: '#DB7093', + papayawhip: '#FFEFD5', + peachpuff: '#FFDAB9', + peru: '#CD853F', + pink: '#FFC0CB', + plum: '#DDA0DD', + powderblue: '#B0E0E6', + rosybrown: '#BC8F8F', + royalblue: '#4169E1', + saddlebrown: '#8B4513', + salmon: '#FA8072', + sandybrown: '#F4A460', + seagreen: '#2E8B57', + seashell: '#FFF5EE', + sienna: '#A0522D', + skyblue: '#87CEEB', + slateblue: '#6A5ACD', + slategray: '#708090', + slategrey: '#708090', + snow: '#FFFAFA', + springgreen: '#00FF7F', + steelblue: '#4682B4', + tan: '#D2B48C', + thistle: '#D8BFD8', + tomato: '#FF6347', + turquoise: '#40E0D0', + violet: '#EE82EE', + wheat: '#F5DEB3', + whitesmoke: '#F5F5F5', + yellowgreen: '#9ACD32' + }; + + + function getRgbHslContent(styleString) { + var start = styleString.indexOf('(', 3); + var end = styleString.indexOf(')', start + 1); + var parts = styleString.substring(start + 1, end).split(','); + // add alpha if needed + if (parts.length != 4 || styleString.charAt(3) != 'a') { + parts[3] = 1; + } + return parts; + } + + function percent(s) { + return parseFloat(s) / 100; + } + + function clamp(v, min, max) { + return Math.min(max, Math.max(min, v)); + } + + function hslToRgb(parts){ + var r, g, b, h, s, l; + h = parseFloat(parts[0]) / 360 % 360; + if (h < 0) + h++; + s = clamp(percent(parts[1]), 0, 1); + l = clamp(percent(parts[2]), 0, 1); + if (s == 0) { + r = g = b = l; // achromatic + } else { + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hueToRgb(p, q, h + 1 / 3); + g = hueToRgb(p, q, h); + b = hueToRgb(p, q, h - 1 / 3); + } + + return '#' + decToHex[Math.floor(r * 255)] + + decToHex[Math.floor(g * 255)] + + decToHex[Math.floor(b * 255)]; + } + + function hueToRgb(m1, m2, h) { + if (h < 0) + h++; + if (h > 1) + h--; + + if (6 * h < 1) + return m1 + (m2 - m1) * 6 * h; + else if (2 * h < 1) + return m2; + else if (3 * h < 2) + return m1 + (m2 - m1) * (2 / 3 - h) * 6; + else + return m1; + } + + var processStyleCache = {}; + + function processStyle(styleString) { + if (styleString in processStyleCache) { + return processStyleCache[styleString]; + } + + var str, alpha = 1; + + styleString = String(styleString); + if (styleString.charAt(0) == '#') { + str = styleString; + } else if (/^rgb/.test(styleString)) { + var parts = getRgbHslContent(styleString); + var str = '#', n; + for (var i = 0; i < 3; i++) { + if (parts[i].indexOf('%') != -1) { + n = Math.floor(percent(parts[i]) * 255); + } else { + n = +parts[i]; + } + str += decToHex[clamp(n, 0, 255)]; + } + alpha = +parts[3]; + } else if (/^hsl/.test(styleString)) { + var parts = getRgbHslContent(styleString); + str = hslToRgb(parts); + alpha = parts[3]; + } else { + str = colorData[styleString] || styleString; + } + return processStyleCache[styleString] = {color: str, alpha: alpha}; + } + + var DEFAULT_STYLE = { + style: 'normal', + variant: 'normal', + weight: 'normal', + size: 10, + family: 'sans-serif' + }; + + // Internal text style cache + var fontStyleCache = {}; + + function processFontStyle(styleString) { + if (fontStyleCache[styleString]) { + return fontStyleCache[styleString]; + } + + var el = document.createElement('div'); + var style = el.style; + try { + style.font = styleString; + } catch (ex) { + // Ignore failures to set to invalid font. + } + + return fontStyleCache[styleString] = { + style: style.fontStyle || DEFAULT_STYLE.style, + variant: style.fontVariant || DEFAULT_STYLE.variant, + weight: style.fontWeight || DEFAULT_STYLE.weight, + size: style.fontSize || DEFAULT_STYLE.size, + family: style.fontFamily || DEFAULT_STYLE.family + }; + } + + function getComputedStyle(style, element) { + var computedStyle = {}; + + for (var p in style) { + computedStyle[p] = style[p]; + } + + // Compute the size + var canvasFontSize = parseFloat(element.currentStyle.fontSize), + fontSize = parseFloat(style.size); + + if (typeof style.size == 'number') { + computedStyle.size = style.size; + } else if (style.size.indexOf('px') != -1) { + computedStyle.size = fontSize; + } else if (style.size.indexOf('em') != -1) { + computedStyle.size = canvasFontSize * fontSize; + } else if(style.size.indexOf('%') != -1) { + computedStyle.size = (canvasFontSize / 100) * fontSize; + } else if (style.size.indexOf('pt') != -1) { + computedStyle.size = fontSize / .75; + } else { + computedStyle.size = canvasFontSize; + } + + // Different scaling between normal text and VML text. This was found using + // trial and error to get the same size as non VML text. + computedStyle.size *= 0.981; + + return computedStyle; + } + + function buildStyle(style) { + return style.style + ' ' + style.variant + ' ' + style.weight + ' ' + + style.size + 'px ' + style.family; + } + + var lineCapMap = { + 'butt': 'flat', + 'round': 'round' + }; + + function processLineCap(lineCap) { + return lineCapMap[lineCap] || 'square'; + } + + /** + * This class implements CanvasRenderingContext2D interface as described by + * the WHATWG. + * @param {HTMLElement} canvasElement The element that the 2D context should + * be associated with + */ + function CanvasRenderingContext2D_(canvasElement) { + this.m_ = createMatrixIdentity(); + + this.mStack_ = []; + this.aStack_ = []; + this.currentPath_ = []; + + // Canvas context properties + this.strokeStyle = '#000'; + this.fillStyle = '#000'; + + this.lineWidth = 1; + this.lineJoin = 'miter'; + this.lineCap = 'butt'; + this.miterLimit = Z * 1; + this.globalAlpha = 1; + this.font = '10px sans-serif'; + this.textAlign = 'left'; + this.textBaseline = 'alphabetic'; + this.canvas = canvasElement; + + var cssText = 'width:' + canvasElement.clientWidth + 'px;height:' + + canvasElement.clientHeight + 'px;overflow:hidden;position:absolute'; + var el = canvasElement.ownerDocument.createElement('div'); + el.style.cssText = cssText; + canvasElement.appendChild(el); + + var overlayEl = el.cloneNode(false); + // Use a non transparent background. + overlayEl.style.backgroundColor = 'red'; + overlayEl.style.filter = 'alpha(opacity=0)'; + canvasElement.appendChild(overlayEl); + + this.element_ = el; + this.arcScaleX_ = 1; + this.arcScaleY_ = 1; + this.lineScale_ = 1; + } + + var contextPrototype = CanvasRenderingContext2D_.prototype; + contextPrototype.clearRect = function() { + if (this.textMeasureEl_) { + this.textMeasureEl_.removeNode(true); + this.textMeasureEl_ = null; + } + this.element_.innerHTML = ''; + }; + + contextPrototype.beginPath = function() { + // TODO: Branch current matrix so that save/restore has no effect + // as per safari docs. + this.currentPath_ = []; + }; + + contextPrototype.moveTo = function(aX, aY) { + var p = getCoords(this, aX, aY); + this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y}); + this.currentX_ = p.x; + this.currentY_ = p.y; + }; + + contextPrototype.lineTo = function(aX, aY) { + var p = getCoords(this, aX, aY); + this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y}); + + this.currentX_ = p.x; + this.currentY_ = p.y; + }; + + contextPrototype.bezierCurveTo = function(aCP1x, aCP1y, + aCP2x, aCP2y, + aX, aY) { + var p = getCoords(this, aX, aY); + var cp1 = getCoords(this, aCP1x, aCP1y); + var cp2 = getCoords(this, aCP2x, aCP2y); + bezierCurveTo(this, cp1, cp2, p); + }; + + // Helper function that takes the already fixed cordinates. + function bezierCurveTo(self, cp1, cp2, p) { + self.currentPath_.push({ + type: 'bezierCurveTo', + cp1x: cp1.x, + cp1y: cp1.y, + cp2x: cp2.x, + cp2y: cp2.y, + x: p.x, + y: p.y + }); + self.currentX_ = p.x; + self.currentY_ = p.y; + } + + contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) { + // the following is lifted almost directly from + // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes + + var cp = getCoords(this, aCPx, aCPy); + var p = getCoords(this, aX, aY); + + var cp1 = { + x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_), + y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_) + }; + var cp2 = { + x: cp1.x + (p.x - this.currentX_) / 3.0, + y: cp1.y + (p.y - this.currentY_) / 3.0 + }; + + bezierCurveTo(this, cp1, cp2, p); + }; + + contextPrototype.arc = function(aX, aY, aRadius, + aStartAngle, aEndAngle, aClockwise) { + aRadius *= Z; + var arcType = aClockwise ? 'at' : 'wa'; + + var xStart = aX + mc(aStartAngle) * aRadius - Z2; + var yStart = aY + ms(aStartAngle) * aRadius - Z2; + + var xEnd = aX + mc(aEndAngle) * aRadius - Z2; + var yEnd = aY + ms(aEndAngle) * aRadius - Z2; + + // IE won't render arches drawn counter clockwise if xStart == xEnd. + if (xStart == xEnd && !aClockwise) { + xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something + // that can be represented in binary + } + + var p = getCoords(this, aX, aY); + var pStart = getCoords(this, xStart, yStart); + var pEnd = getCoords(this, xEnd, yEnd); + + this.currentPath_.push({type: arcType, + x: p.x, + y: p.y, + radius: aRadius, + xStart: pStart.x, + yStart: pStart.y, + xEnd: pEnd.x, + yEnd: pEnd.y}); + + }; + + contextPrototype.rect = function(aX, aY, aWidth, aHeight) { + this.moveTo(aX, aY); + this.lineTo(aX + aWidth, aY); + this.lineTo(aX + aWidth, aY + aHeight); + this.lineTo(aX, aY + aHeight); + this.closePath(); + }; + + contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) { + var oldPath = this.currentPath_; + this.beginPath(); + + this.moveTo(aX, aY); + this.lineTo(aX + aWidth, aY); + this.lineTo(aX + aWidth, aY + aHeight); + this.lineTo(aX, aY + aHeight); + this.closePath(); + this.stroke(); + + this.currentPath_ = oldPath; + }; + + contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) { + var oldPath = this.currentPath_; + this.beginPath(); + + this.moveTo(aX, aY); + this.lineTo(aX + aWidth, aY); + this.lineTo(aX + aWidth, aY + aHeight); + this.lineTo(aX, aY + aHeight); + this.closePath(); + this.fill(); + + this.currentPath_ = oldPath; + }; + + contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) { + var gradient = new CanvasGradient_('gradient'); + gradient.x0_ = aX0; + gradient.y0_ = aY0; + gradient.x1_ = aX1; + gradient.y1_ = aY1; + return gradient; + }; + + contextPrototype.createRadialGradient = function(aX0, aY0, aR0, + aX1, aY1, aR1) { + var gradient = new CanvasGradient_('gradientradial'); + gradient.x0_ = aX0; + gradient.y0_ = aY0; + gradient.r0_ = aR0; + gradient.x1_ = aX1; + gradient.y1_ = aY1; + gradient.r1_ = aR1; + return gradient; + }; + + contextPrototype.drawImage = function(image, var_args) { + var dx, dy, dw, dh, sx, sy, sw, sh; + + // to find the original width we overide the width and height + var oldRuntimeWidth = image.runtimeStyle.width; + var oldRuntimeHeight = image.runtimeStyle.height; + image.runtimeStyle.width = 'auto'; + image.runtimeStyle.height = 'auto'; + + // get the original size + var w = image.width; + var h = image.height; + + // and remove overides + image.runtimeStyle.width = oldRuntimeWidth; + image.runtimeStyle.height = oldRuntimeHeight; + + if (arguments.length == 3) { + dx = arguments[1]; + dy = arguments[2]; + sx = sy = 0; + sw = dw = w; + sh = dh = h; + } else if (arguments.length == 5) { + dx = arguments[1]; + dy = arguments[2]; + dw = arguments[3]; + dh = arguments[4]; + sx = sy = 0; + sw = w; + sh = h; + } else if (arguments.length == 9) { + sx = arguments[1]; + sy = arguments[2]; + sw = arguments[3]; + sh = arguments[4]; + dx = arguments[5]; + dy = arguments[6]; + dw = arguments[7]; + dh = arguments[8]; + } else { + throw Error('Invalid number of arguments'); + } + + var d = getCoords(this, dx, dy); + + var w2 = sw / 2; + var h2 = sh / 2; + + var vmlStr = []; + + var W = 10; + var H = 10; + + // For some reason that I've now forgotten, using divs didn't work + vmlStr.push(' <g_vml_:group', + ' coordsize="', Z * W, ',', Z * H, '"', + ' coordorigin="0,0"' , + ' style="width:', W, 'px;height:', H, 'px;position:absolute;'); + + // If filters are necessary (rotation exists), create them + // filters are bog-slow, so only create them if abbsolutely necessary + // The following check doesn't account for skews (which don't exist + // in the canvas spec (yet) anyway. + + if (this.m_[0][0] != 1 || this.m_[0][1] || + this.m_[1][1] != 1 || this.m_[1][0]) { + var filter = []; + + // Note the 12/21 reversal + filter.push('M11=', this.m_[0][0], ',', + 'M12=', this.m_[1][0], ',', + 'M21=', this.m_[0][1], ',', + 'M22=', this.m_[1][1], ',', + 'Dx=', mr(d.x / Z), ',', + 'Dy=', mr(d.y / Z), ''); + + // Bounding box calculation (need to minimize displayed area so that + // filters don't waste time on unused pixels. + var max = d; + var c2 = getCoords(this, dx + dw, dy); + var c3 = getCoords(this, dx, dy + dh); + var c4 = getCoords(this, dx + dw, dy + dh); + + max.x = m.max(max.x, c2.x, c3.x, c4.x); + max.y = m.max(max.y, c2.y, c3.y, c4.y); + + vmlStr.push('padding:0 ', mr(max.x / Z), 'px ', mr(max.y / Z), + 'px 0;filter:progid:DXImageTransform.Microsoft.Matrix(', + filter.join(''), ", sizingmethod='clip');"); + + } else { + vmlStr.push('top:', mr(d.y / Z), 'px;left:', mr(d.x / Z), 'px;'); + } + + vmlStr.push(' ">' , + '<g_vml_:image src="', image.src, '"', + ' style="width:', Z * dw, 'px;', + ' height:', Z * dh, 'px"', + ' cropleft="', sx / w, '"', + ' croptop="', sy / h, '"', + ' cropright="', (w - sx - sw) / w, '"', + ' cropbottom="', (h - sy - sh) / h, '"', + ' />', + '</g_vml_:group>'); + + this.element_.insertAdjacentHTML('BeforeEnd', vmlStr.join('')); + }; + + contextPrototype.stroke = function(aFill) { + var W = 10; + var H = 10; + // Divide the shape into chunks if it's too long because IE has a limit + // somewhere for how long a VML shape can be. This simple division does + // not work with fills, only strokes, unfortunately. + var chunkSize = 5000; + + var min = {x: null, y: null}; + var max = {x: null, y: null}; + + for (var j = 0; j < this.currentPath_.length; j += chunkSize) { + var lineStr = []; + var lineOpen = false; + + lineStr.push('<g_vml_:shape', + ' filled="', !!aFill, '"', + ' style="position:absolute;width:', W, 'px;height:', H, 'px;"', + ' coordorigin="0,0"', + ' coordsize="', Z * W, ',', Z * H, '"', + ' stroked="', !aFill, '"', + ' path="'); + + var newSeq = false; + + for (var i = j; i < Math.min(j + chunkSize, this.currentPath_.length); i++) { + if (i % chunkSize == 0 && i > 0) { // move into position for next chunk + lineStr.push(' m ', mr(this.currentPath_[i-1].x), ',', mr(this.currentPath_[i-1].y)); + } + + var p = this.currentPath_[i]; + var c; + + switch (p.type) { + case 'moveTo': + c = p; + lineStr.push(' m ', mr(p.x), ',', mr(p.y)); + break; + case 'lineTo': + lineStr.push(' l ', mr(p.x), ',', mr(p.y)); + break; + case 'close': + lineStr.push(' x '); + p = null; + break; + case 'bezierCurveTo': + lineStr.push(' c ', + mr(p.cp1x), ',', mr(p.cp1y), ',', + mr(p.cp2x), ',', mr(p.cp2y), ',', + mr(p.x), ',', mr(p.y)); + break; + case 'at': + case 'wa': + lineStr.push(' ', p.type, ' ', + mr(p.x - this.arcScaleX_ * p.radius), ',', + mr(p.y - this.arcScaleY_ * p.radius), ' ', + mr(p.x + this.arcScaleX_ * p.radius), ',', + mr(p.y + this.arcScaleY_ * p.radius), ' ', + mr(p.xStart), ',', mr(p.yStart), ' ', + mr(p.xEnd), ',', mr(p.yEnd)); + break; + } + + + // TODO: Following is broken for curves due to + // move to proper paths. + + // Figure out dimensions so we can do gradient fills + // properly + if (p) { + if (min.x == null || p.x < min.x) { + min.x = p.x; + } + if (max.x == null || p.x > max.x) { + max.x = p.x; + } + if (min.y == null || p.y < min.y) { + min.y = p.y; + } + if (max.y == null || p.y > max.y) { + max.y = p.y; + } + } + } + lineStr.push(' ">'); + + if (!aFill) { + appendStroke(this, lineStr); + } else { + appendFill(this, lineStr, min, max); + } + + lineStr.push('</g_vml_:shape>'); + + this.element_.insertAdjacentHTML('beforeEnd', lineStr.join('')); + } + }; + + function appendStroke(ctx, lineStr) { + var a = processStyle(ctx.strokeStyle); + var color = a.color; + var opacity = a.alpha * ctx.globalAlpha; + var lineWidth = ctx.lineScale_ * ctx.lineWidth; + + // VML cannot correctly render a line if the width is less than 1px. + // In that case, we dilute the color to make the line look thinner. + if (lineWidth < 1) { + opacity *= lineWidth; + } + + lineStr.push( + '<g_vml_:stroke', + ' opacity="', opacity, '"', + ' joinstyle="', ctx.lineJoin, '"', + ' miterlimit="', ctx.miterLimit, '"', + ' endcap="', processLineCap(ctx.lineCap), '"', + ' weight="', lineWidth, 'px"', + ' color="', color, '" />' + ); + } + + function appendFill(ctx, lineStr, min, max) { + var fillStyle = ctx.fillStyle; + var arcScaleX = ctx.arcScaleX_; + var arcScaleY = ctx.arcScaleY_; + var width = max.x - min.x; + var height = max.y - min.y; + if (fillStyle instanceof CanvasGradient_) { + // TODO: Gradients transformed with the transformation matrix. + var angle = 0; + var focus = {x: 0, y: 0}; + + // additional offset + var shift = 0; + // scale factor for offset + var expansion = 1; + + if (fillStyle.type_ == 'gradient') { + var x0 = fillStyle.x0_ / arcScaleX; + var y0 = fillStyle.y0_ / arcScaleY; + var x1 = fillStyle.x1_ / arcScaleX; + var y1 = fillStyle.y1_ / arcScaleY; + var p0 = getCoords(ctx, x0, y0); + var p1 = getCoords(ctx, x1, y1); + var dx = p1.x - p0.x; + var dy = p1.y - p0.y; + angle = Math.atan2(dx, dy) * 180 / Math.PI; + + // The angle should be a non-negative number. + if (angle < 0) { + angle += 360; + } + + // Very small angles produce an unexpected result because they are + // converted to a scientific notation string. + if (angle < 1e-6) { + angle = 0; + } + } else { + var p0 = getCoords(ctx, fillStyle.x0_, fillStyle.y0_); + focus = { + x: (p0.x - min.x) / width, + y: (p0.y - min.y) / height + }; + + width /= arcScaleX * Z; + height /= arcScaleY * Z; + var dimension = m.max(width, height); + shift = 2 * fillStyle.r0_ / dimension; + expansion = 2 * fillStyle.r1_ / dimension - shift; + } + + // We need to sort the color stops in ascending order by offset, + // otherwise IE won't interpret it correctly. + var stops = fillStyle.colors_; + stops.sort(function(cs1, cs2) { + return cs1.offset - cs2.offset; + }); + + var length = stops.length; + var color1 = stops[0].color; + var color2 = stops[length - 1].color; + var opacity1 = stops[0].alpha * ctx.globalAlpha; + var opacity2 = stops[length - 1].alpha * ctx.globalAlpha; + + var colors = []; + for (var i = 0; i < length; i++) { + var stop = stops[i]; + colors.push(stop.offset * expansion + shift + ' ' + stop.color); + } + + // When colors attribute is used, the meanings of opacity and o:opacity2 + // are reversed. + lineStr.push('<g_vml_:fill type="', fillStyle.type_, '"', + ' method="none" focus="100%"', + ' color="', color1, '"', + ' color2="', color2, '"', + ' colors="', colors.join(','), '"', + ' opacity="', opacity2, '"', + ' g_o_:opacity2="', opacity1, '"', + ' angle="', angle, '"', + ' focusposition="', focus.x, ',', focus.y, '" />'); + } else if (fillStyle instanceof CanvasPattern_) { + if (width && height) { + var deltaLeft = -min.x; + var deltaTop = -min.y; + lineStr.push('<g_vml_:fill', + ' position="', + deltaLeft / width * arcScaleX * arcScaleX, ',', + deltaTop / height * arcScaleY * arcScaleY, '"', + ' type="tile"', + // TODO: Figure out the correct size to fit the scale. + //' size="', w, 'px ', h, 'px"', + ' src="', fillStyle.src_, '" />'); + } + } else { + var a = processStyle(ctx.fillStyle); + var color = a.color; + var opacity = a.alpha * ctx.globalAlpha; + lineStr.push('<g_vml_:fill color="', color, '" opacity="', opacity, + '" />'); + } + } + + contextPrototype.fill = function() { + this.stroke(true); + }; + + contextPrototype.closePath = function() { + this.currentPath_.push({type: 'close'}); + }; + + function getCoords(ctx, aX, aY) { + var m = ctx.m_; + return { + x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2, + y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2 + }; + } + contextPrototype.save = function() { + var o = {}; + copyState(this, o); + this.aStack_.push(o); + this.mStack_.push(this.m_); + this.m_ = matrixMultiply(createMatrixIdentity(), this.m_); + }; + + contextPrototype.restore = function() { + if (this.aStack_.length) { + copyState(this.aStack_.pop(), this); + this.m_ = this.mStack_.pop(); + } + }; + + function matrixIsFinite(m) { + return isFinite(m[0][0]) && isFinite(m[0][1]) && + isFinite(m[1][0]) && isFinite(m[1][1]) && + isFinite(m[2][0]) && isFinite(m[2][1]); + } + + function setM(ctx, m, updateLineScale) { + if (!matrixIsFinite(m)) { + return; + } + ctx.m_ = m; + + if (updateLineScale) { + // Get the line scale. + // Determinant of this.m_ means how much the area is enlarged by the + // transformation. So its square root can be used as a scale factor + // for width. + var det = m[0][0] * m[1][1] - m[0][1] * m[1][0]; + ctx.lineScale_ = sqrt(abs(det)); + } + } + + contextPrototype.translate = function(aX, aY) { + var m1 = [ + [1, 0, 0], + [0, 1, 0], + [aX, aY, 1] + ]; + + setM(this, matrixMultiply(m1, this.m_), false); + }; + + contextPrototype.rotate = function(aRot) { + var c = mc(aRot); + var s = ms(aRot); + + var m1 = [ + [c, s, 0], + [-s, c, 0], + [0, 0, 1] + ]; + + setM(this, matrixMultiply(m1, this.m_), false); + }; + + contextPrototype.scale = function(aX, aY) { + this.arcScaleX_ *= aX; + this.arcScaleY_ *= aY; + var m1 = [ + [aX, 0, 0], + [0, aY, 0], + [0, 0, 1] + ]; + + setM(this, matrixMultiply(m1, this.m_), true); + }; + + contextPrototype.transform = function(m11, m12, m21, m22, dx, dy) { + var m1 = [ + [m11, m12, 0], + [m21, m22, 0], + [dx, dy, 1] + ]; + + setM(this, matrixMultiply(m1, this.m_), true); + }; + + contextPrototype.setTransform = function(m11, m12, m21, m22, dx, dy) { + var m = [ + [m11, m12, 0], + [m21, m22, 0], + [dx, dy, 1] + ]; + + setM(this, m, true); + }; + + /** + * The text drawing function. + * The maxWidth argument isn't taken in account, since no browser supports + * it yet. + */ + contextPrototype.drawText_ = function(text, x, y, maxWidth, stroke) { + var m = this.m_, + delta = 1000, + left = 0, + right = delta, + offset = {x: 0, y: 0}, + lineStr = []; + + var fontStyle = getComputedStyle(processFontStyle(this.font), + this.element_); + + var fontStyleString = buildStyle(fontStyle); + + var elementStyle = this.element_.currentStyle; + var textAlign = this.textAlign.toLowerCase(); + switch (textAlign) { + case 'left': + case 'center': + case 'right': + break; + case 'end': + textAlign = elementStyle.direction == 'ltr' ? 'right' : 'left'; + break; + case 'start': + textAlign = elementStyle.direction == 'rtl' ? 'right' : 'left'; + break; + default: + textAlign = 'left'; + } + + // 1.75 is an arbitrary number, as there is no info about the text baseline + switch (this.textBaseline) { + case 'hanging': + case 'top': + offset.y = fontStyle.size / 1.75; + break; + case 'middle': + break; + default: + case null: + case 'alphabetic': + case 'ideographic': + case 'bottom': + offset.y = -fontStyle.size / 2.25; + break; + } + + switch(textAlign) { + case 'right': + left = delta; + right = 0.05; + break; + case 'center': + left = right = delta / 2; + break; + } + + var d = getCoords(this, x + offset.x, y + offset.y); + + lineStr.push('<g_vml_:line from="', -left ,' 0" to="', right ,' 0.05" ', + ' coordsize="100 100" coordorigin="0 0"', + ' filled="', !stroke, '" stroked="', !!stroke, + '" style="position:absolute;width:1px;height:1px;">'); + + if (stroke) { + appendStroke(this, lineStr); + } else { + // TODO: Fix the min and max params. + appendFill(this, lineStr, {x: -left, y: 0}, + {x: right, y: fontStyle.size}); + } + + var skewM = m[0][0].toFixed(3) + ',' + m[1][0].toFixed(3) + ',' + + m[0][1].toFixed(3) + ',' + m[1][1].toFixed(3) + ',0,0'; + + var skewOffset = mr(d.x / Z) + ',' + mr(d.y / Z); + + lineStr.push('<g_vml_:skew on="t" matrix="', skewM ,'" ', + ' offset="', skewOffset, '" origin="', left ,' 0" />', + '<g_vml_:path textpathok="true" />', + '<g_vml_:textpath on="true" string="', + encodeHtmlAttribute(text), + '" style="v-text-align:', textAlign, + ';font:', encodeHtmlAttribute(fontStyleString), + '" /></g_vml_:line>'); + + this.element_.insertAdjacentHTML('beforeEnd', lineStr.join('')); + }; + + contextPrototype.fillText = function(text, x, y, maxWidth) { + this.drawText_(text, x, y, maxWidth, false); + }; + + contextPrototype.strokeText = function(text, x, y, maxWidth) { + this.drawText_(text, x, y, maxWidth, true); + }; + + contextPrototype.measureText = function(text) { + if (!this.textMeasureEl_) { + var s = '<span style="position:absolute;' + + 'top:-20000px;left:0;padding:0;margin:0;border:none;' + + 'white-space:pre;"></span>'; + this.element_.insertAdjacentHTML('beforeEnd', s); + this.textMeasureEl_ = this.element_.lastChild; + } + var doc = this.element_.ownerDocument; + this.textMeasureEl_.innerHTML = ''; + this.textMeasureEl_.style.font = this.font; + // Don't use innerHTML or innerText because they allow markup/whitespace. + this.textMeasureEl_.appendChild(doc.createTextNode(text)); + return {width: this.textMeasureEl_.offsetWidth}; + }; + + /******** STUBS ********/ + contextPrototype.clip = function() { + // TODO: Implement + }; + + contextPrototype.arcTo = function() { + // TODO: Implement + }; + + contextPrototype.createPattern = function(image, repetition) { + return new CanvasPattern_(image, repetition); + }; + + // Gradient / Pattern Stubs + function CanvasGradient_(aType) { + this.type_ = aType; + this.x0_ = 0; + this.y0_ = 0; + this.r0_ = 0; + this.x1_ = 0; + this.y1_ = 0; + this.r1_ = 0; + this.colors_ = []; + } + + CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) { + aColor = processStyle(aColor); + this.colors_.push({offset: aOffset, + color: aColor.color, + alpha: aColor.alpha}); + }; + + function CanvasPattern_(image, repetition) { + assertImageIsValid(image); + switch (repetition) { + case 'repeat': + case null: + case '': + this.repetition_ = 'repeat'; + break; + case 'repeat-x': + case 'repeat-y': + case 'no-repeat': + this.repetition_ = repetition; + break; + default: + throwException('SYNTAX_ERR'); + } + + this.src_ = image.src; + this.width_ = image.width; + this.height_ = image.height; + } + + function throwException(s) { + throw new DOMException_(s); + } + + function assertImageIsValid(img) { + if (!img || img.nodeType != 1 || img.tagName != 'IMG') { + throwException('TYPE_MISMATCH_ERR'); + } + if (img.readyState != 'complete') { + throwException('INVALID_STATE_ERR'); + } + } + + function DOMException_(s) { + this.code = this[s]; + this.message = s +': DOM Exception ' + this.code; + } + var p = DOMException_.prototype = new Error; + p.INDEX_SIZE_ERR = 1; + p.DOMSTRING_SIZE_ERR = 2; + p.HIERARCHY_REQUEST_ERR = 3; + p.WRONG_DOCUMENT_ERR = 4; + p.INVALID_CHARACTER_ERR = 5; + p.NO_DATA_ALLOWED_ERR = 6; + p.NO_MODIFICATION_ALLOWED_ERR = 7; + p.NOT_FOUND_ERR = 8; + p.NOT_SUPPORTED_ERR = 9; + p.INUSE_ATTRIBUTE_ERR = 10; + p.INVALID_STATE_ERR = 11; + p.SYNTAX_ERR = 12; + p.INVALID_MODIFICATION_ERR = 13; + p.NAMESPACE_ERR = 14; + p.INVALID_ACCESS_ERR = 15; + p.VALIDATION_ERR = 16; + p.TYPE_MISMATCH_ERR = 17; + + // set up externs + G_vmlCanvasManager = G_vmlCanvasManager_; + CanvasRenderingContext2D = CanvasRenderingContext2D_; + CanvasGradient = CanvasGradient_; + CanvasPattern = CanvasPattern_; + DOMException = DOMException_; +})(); + +} // if diff --git a/theme/bootstrap/plugins/flot/excanvas.min.js b/theme/bootstrap/plugins/flot/excanvas.min.js new file mode 100644 index 0000000..fcf876c --- /dev/null +++ b/theme/bootstrap/plugins/flot/excanvas.min.js @@ -0,0 +1 @@ +if(!document.createElement("canvas").getContext){(function(){var ab=Math;var n=ab.round;var l=ab.sin;var A=ab.cos;var H=ab.abs;var N=ab.sqrt;var d=10;var f=d/2;var z=+navigator.userAgent.match(/MSIE ([\d.]+)?/)[1];function y(){return this.context_||(this.context_=new D(this))}var t=Array.prototype.slice;function g(j,m,p){var i=t.call(arguments,2);return function(){return j.apply(m,i.concat(t.call(arguments)))}}function af(i){return String(i).replace(/&/g,"&amp;").replace(/"/g,"&quot;")}function Y(m,j,i){if(!m.namespaces[j]){m.namespaces.add(j,i,"#default#VML")}}function R(j){Y(j,"g_vml_","urn:schemas-microsoft-com:vml");Y(j,"g_o_","urn:schemas-microsoft-com:office:office");if(!j.styleSheets.ex_canvas_){var i=j.createStyleSheet();i.owningElement.id="ex_canvas_";i.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}R(document);var e={init:function(i){var j=i||document;j.createElement("canvas");j.attachEvent("onreadystatechange",g(this.init_,this,j))},init_:function(p){var m=p.getElementsByTagName("canvas");for(var j=0;j<m.length;j++){this.initElement(m[j])}},initElement:function(j){if(!j.getContext){j.getContext=y;R(j.ownerDocument);j.innerHTML="";j.attachEvent("onpropertychange",x);j.attachEvent("onresize",W);var i=j.attributes;if(i.width&&i.width.specified){j.style.width=i.width.nodeValue+"px"}else{j.width=j.clientWidth}if(i.height&&i.height.specified){j.style.height=i.height.nodeValue+"px"}else{j.height=j.clientHeight}}return j}};function x(j){var i=j.srcElement;switch(j.propertyName){case"width":i.getContext().clearRect();i.style.width=i.attributes.width.nodeValue+"px";i.firstChild.style.width=i.clientWidth+"px";break;case"height":i.getContext().clearRect();i.style.height=i.attributes.height.nodeValue+"px";i.firstChild.style.height=i.clientHeight+"px";break}}function W(j){var i=j.srcElement;if(i.firstChild){i.firstChild.style.width=i.clientWidth+"px";i.firstChild.style.height=i.clientHeight+"px"}}e.init();var k=[];for(var ae=0;ae<16;ae++){for(var ad=0;ad<16;ad++){k[ae*16+ad]=ae.toString(16)+ad.toString(16)}}function B(){return[[1,0,0],[0,1,0],[0,0,1]]}function J(p,m){var j=B();for(var i=0;i<3;i++){for(var ah=0;ah<3;ah++){var Z=0;for(var ag=0;ag<3;ag++){Z+=p[i][ag]*m[ag][ah]}j[i][ah]=Z}}return j}function v(j,i){i.fillStyle=j.fillStyle;i.lineCap=j.lineCap;i.lineJoin=j.lineJoin;i.lineWidth=j.lineWidth;i.miterLimit=j.miterLimit;i.shadowBlur=j.shadowBlur;i.shadowColor=j.shadowColor;i.shadowOffsetX=j.shadowOffsetX;i.shadowOffsetY=j.shadowOffsetY;i.strokeStyle=j.strokeStyle;i.globalAlpha=j.globalAlpha;i.font=j.font;i.textAlign=j.textAlign;i.textBaseline=j.textBaseline;i.arcScaleX_=j.arcScaleX_;i.arcScaleY_=j.arcScaleY_;i.lineScale_=j.lineScale_}var b={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"};function M(j){var p=j.indexOf("(",3);var i=j.indexOf(")",p+1);var m=j.substring(p+1,i).split(",");if(m.length!=4||j.charAt(3)!="a"){m[3]=1}return m}function c(i){return parseFloat(i)/100}function r(j,m,i){return Math.min(i,Math.max(m,j))}function I(ag){var i,ai,aj,ah,ak,Z;ah=parseFloat(ag[0])/360%360;if(ah<0){ah++}ak=r(c(ag[1]),0,1);Z=r(c(ag[2]),0,1);if(ak==0){i=ai=aj=Z}else{var j=Z<0.5?Z*(1+ak):Z+ak-Z*ak;var m=2*Z-j;i=a(m,j,ah+1/3);ai=a(m,j,ah);aj=a(m,j,ah-1/3)}return"#"+k[Math.floor(i*255)]+k[Math.floor(ai*255)]+k[Math.floor(aj*255)]}function a(j,i,m){if(m<0){m++}if(m>1){m--}if(6*m<1){return j+(i-j)*6*m}else{if(2*m<1){return i}else{if(3*m<2){return j+(i-j)*(2/3-m)*6}else{return j}}}}var C={};function F(j){if(j in C){return C[j]}var ag,Z=1;j=String(j);if(j.charAt(0)=="#"){ag=j}else{if(/^rgb/.test(j)){var p=M(j);var ag="#",ah;for(var m=0;m<3;m++){if(p[m].indexOf("%")!=-1){ah=Math.floor(c(p[m])*255)}else{ah=+p[m]}ag+=k[r(ah,0,255)]}Z=+p[3]}else{if(/^hsl/.test(j)){var p=M(j);ag=I(p);Z=p[3]}else{ag=b[j]||j}}}return C[j]={color:ag,alpha:Z}}var o={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var L={};function E(i){if(L[i]){return L[i]}var p=document.createElement("div");var m=p.style;try{m.font=i}catch(j){}return L[i]={style:m.fontStyle||o.style,variant:m.fontVariant||o.variant,weight:m.fontWeight||o.weight,size:m.fontSize||o.size,family:m.fontFamily||o.family}}function u(m,j){var i={};for(var ah in m){i[ah]=m[ah]}var ag=parseFloat(j.currentStyle.fontSize),Z=parseFloat(m.size);if(typeof m.size=="number"){i.size=m.size}else{if(m.size.indexOf("px")!=-1){i.size=Z}else{if(m.size.indexOf("em")!=-1){i.size=ag*Z}else{if(m.size.indexOf("%")!=-1){i.size=(ag/100)*Z}else{if(m.size.indexOf("pt")!=-1){i.size=Z/0.75}else{i.size=ag}}}}}i.size*=0.981;return i}function ac(i){return i.style+" "+i.variant+" "+i.weight+" "+i.size+"px "+i.family}var s={butt:"flat",round:"round"};function S(i){return s[i]||"square"}function D(i){this.m_=B();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=d*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var m="width:"+i.clientWidth+"px;height:"+i.clientHeight+"px;overflow:hidden;position:absolute";var j=i.ownerDocument.createElement("div");j.style.cssText=m;i.appendChild(j);var p=j.cloneNode(false);p.style.backgroundColor="red";p.style.filter="alpha(opacity=0)";i.appendChild(p);this.element_=j;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var q=D.prototype;q.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};q.beginPath=function(){this.currentPath_=[]};q.moveTo=function(j,i){var m=V(this,j,i);this.currentPath_.push({type:"moveTo",x:m.x,y:m.y});this.currentX_=m.x;this.currentY_=m.y};q.lineTo=function(j,i){var m=V(this,j,i);this.currentPath_.push({type:"lineTo",x:m.x,y:m.y});this.currentX_=m.x;this.currentY_=m.y};q.bezierCurveTo=function(m,j,ak,aj,ai,ag){var i=V(this,ai,ag);var ah=V(this,m,j);var Z=V(this,ak,aj);K(this,ah,Z,i)};function K(i,Z,m,j){i.currentPath_.push({type:"bezierCurveTo",cp1x:Z.x,cp1y:Z.y,cp2x:m.x,cp2y:m.y,x:j.x,y:j.y});i.currentX_=j.x;i.currentY_=j.y}q.quadraticCurveTo=function(ai,m,j,i){var ah=V(this,ai,m);var ag=V(this,j,i);var aj={x:this.currentX_+2/3*(ah.x-this.currentX_),y:this.currentY_+2/3*(ah.y-this.currentY_)};var Z={x:aj.x+(ag.x-this.currentX_)/3,y:aj.y+(ag.y-this.currentY_)/3};K(this,aj,Z,ag)};q.arc=function(al,aj,ak,ag,j,m){ak*=d;var ap=m?"at":"wa";var am=al+A(ag)*ak-f;var ao=aj+l(ag)*ak-f;var i=al+A(j)*ak-f;var an=aj+l(j)*ak-f;if(am==i&&!m){am+=0.125}var Z=V(this,al,aj);var ai=V(this,am,ao);var ah=V(this,i,an);this.currentPath_.push({type:ap,x:Z.x,y:Z.y,radius:ak,xStart:ai.x,yStart:ai.y,xEnd:ah.x,yEnd:ah.y})};q.rect=function(m,j,i,p){this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath()};q.strokeRect=function(m,j,i,p){var Z=this.currentPath_;this.beginPath();this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath();this.stroke();this.currentPath_=Z};q.fillRect=function(m,j,i,p){var Z=this.currentPath_;this.beginPath();this.moveTo(m,j);this.lineTo(m+i,j);this.lineTo(m+i,j+p);this.lineTo(m,j+p);this.closePath();this.fill();this.currentPath_=Z};q.createLinearGradient=function(j,p,i,m){var Z=new U("gradient");Z.x0_=j;Z.y0_=p;Z.x1_=i;Z.y1_=m;return Z};q.createRadialGradient=function(p,ag,m,j,Z,i){var ah=new U("gradientradial");ah.x0_=p;ah.y0_=ag;ah.r0_=m;ah.x1_=j;ah.y1_=Z;ah.r1_=i;return ah};q.drawImage=function(aq,m){var aj,ah,al,ay,ao,am,at,aA;var ak=aq.runtimeStyle.width;var ap=aq.runtimeStyle.height;aq.runtimeStyle.width="auto";aq.runtimeStyle.height="auto";var ai=aq.width;var aw=aq.height;aq.runtimeStyle.width=ak;aq.runtimeStyle.height=ap;if(arguments.length==3){aj=arguments[1];ah=arguments[2];ao=am=0;at=al=ai;aA=ay=aw}else{if(arguments.length==5){aj=arguments[1];ah=arguments[2];al=arguments[3];ay=arguments[4];ao=am=0;at=ai;aA=aw}else{if(arguments.length==9){ao=arguments[1];am=arguments[2];at=arguments[3];aA=arguments[4];aj=arguments[5];ah=arguments[6];al=arguments[7];ay=arguments[8]}else{throw Error("Invalid number of arguments")}}}var az=V(this,aj,ah);var p=at/2;var j=aA/2;var ax=[];var i=10;var ag=10;ax.push(" <g_vml_:group",' coordsize="',d*i,",",d*ag,'"',' coordorigin="0,0"',' style="width:',i,"px;height:",ag,"px;position:absolute;");if(this.m_[0][0]!=1||this.m_[0][1]||this.m_[1][1]!=1||this.m_[1][0]){var Z=[];Z.push("M11=",this.m_[0][0],",","M12=",this.m_[1][0],",","M21=",this.m_[0][1],",","M22=",this.m_[1][1],",","Dx=",n(az.x/d),",","Dy=",n(az.y/d),"");var av=az;var au=V(this,aj+al,ah);var ar=V(this,aj,ah+ay);var an=V(this,aj+al,ah+ay);av.x=ab.max(av.x,au.x,ar.x,an.x);av.y=ab.max(av.y,au.y,ar.y,an.y);ax.push("padding:0 ",n(av.x/d),"px ",n(av.y/d),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",Z.join(""),", sizingmethod='clip');")}else{ax.push("top:",n(az.y/d),"px;left:",n(az.x/d),"px;")}ax.push(' ">','<g_vml_:image src="',aq.src,'"',' style="width:',d*al,"px;"," height:",d*ay,'px"',' cropleft="',ao/ai,'"',' croptop="',am/aw,'"',' cropright="',(ai-ao-at)/ai,'"',' cropbottom="',(aw-am-aA)/aw,'"'," />","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",ax.join(""))};q.stroke=function(ao){var Z=10;var ap=10;var ag=5000;var ai={x:null,y:null};var an={x:null,y:null};for(var aj=0;aj<this.currentPath_.length;aj+=ag){var am=[];var ah=false;am.push("<g_vml_:shape",' filled="',!!ao,'"',' style="position:absolute;width:',Z,"px;height:",ap,'px;"',' coordorigin="0,0"',' coordsize="',d*Z,",",d*ap,'"',' stroked="',!ao,'"',' path="');var aq=false;for(var ak=aj;ak<Math.min(aj+ag,this.currentPath_.length);ak++){if(ak%ag==0&&ak>0){am.push(" m ",n(this.currentPath_[ak-1].x),",",n(this.currentPath_[ak-1].y))}var m=this.currentPath_[ak];var al;switch(m.type){case"moveTo":al=m;am.push(" m ",n(m.x),",",n(m.y));break;case"lineTo":am.push(" l ",n(m.x),",",n(m.y));break;case"close":am.push(" x ");m=null;break;case"bezierCurveTo":am.push(" c ",n(m.cp1x),",",n(m.cp1y),",",n(m.cp2x),",",n(m.cp2y),",",n(m.x),",",n(m.y));break;case"at":case"wa":am.push(" ",m.type," ",n(m.x-this.arcScaleX_*m.radius),",",n(m.y-this.arcScaleY_*m.radius)," ",n(m.x+this.arcScaleX_*m.radius),",",n(m.y+this.arcScaleY_*m.radius)," ",n(m.xStart),",",n(m.yStart)," ",n(m.xEnd),",",n(m.yEnd));break}if(m){if(ai.x==null||m.x<ai.x){ai.x=m.x}if(an.x==null||m.x>an.x){an.x=m.x}if(ai.y==null||m.y<ai.y){ai.y=m.y}if(an.y==null||m.y>an.y){an.y=m.y}}}am.push(' ">');if(!ao){w(this,am)}else{G(this,am,ai,an)}am.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",am.join(""))}};function w(m,ag){var j=F(m.strokeStyle);var p=j.color;var Z=j.alpha*m.globalAlpha;var i=m.lineScale_*m.lineWidth;if(i<1){Z*=i}ag.push("<g_vml_:stroke",' opacity="',Z,'"',' joinstyle="',m.lineJoin,'"',' miterlimit="',m.miterLimit,'"',' endcap="',S(m.lineCap),'"',' weight="',i,'px"',' color="',p,'" />')}function G(aq,ai,aK,ar){var aj=aq.fillStyle;var aB=aq.arcScaleX_;var aA=aq.arcScaleY_;var j=ar.x-aK.x;var p=ar.y-aK.y;if(aj instanceof U){var an=0;var aF={x:0,y:0};var ax=0;var am=1;if(aj.type_=="gradient"){var al=aj.x0_/aB;var m=aj.y0_/aA;var ak=aj.x1_/aB;var aM=aj.y1_/aA;var aJ=V(aq,al,m);var aI=V(aq,ak,aM);var ag=aI.x-aJ.x;var Z=aI.y-aJ.y;an=Math.atan2(ag,Z)*180/Math.PI;if(an<0){an+=360}if(an<0.000001){an=0}}else{var aJ=V(aq,aj.x0_,aj.y0_);aF={x:(aJ.x-aK.x)/j,y:(aJ.y-aK.y)/p};j/=aB*d;p/=aA*d;var aD=ab.max(j,p);ax=2*aj.r0_/aD;am=2*aj.r1_/aD-ax}var av=aj.colors_;av.sort(function(aN,i){return aN.offset-i.offset});var ap=av.length;var au=av[0].color;var at=av[ap-1].color;var az=av[0].alpha*aq.globalAlpha;var ay=av[ap-1].alpha*aq.globalAlpha;var aE=[];for(var aH=0;aH<ap;aH++){var ao=av[aH];aE.push(ao.offset*am+ax+" "+ao.color)}ai.push('<g_vml_:fill type="',aj.type_,'"',' method="none" focus="100%"',' color="',au,'"',' color2="',at,'"',' colors="',aE.join(","),'"',' opacity="',ay,'"',' g_o_:opacity2="',az,'"',' angle="',an,'"',' focusposition="',aF.x,",",aF.y,'" />')}else{if(aj instanceof T){if(j&&p){var ah=-aK.x;var aC=-aK.y;ai.push("<g_vml_:fill",' position="',ah/j*aB*aB,",",aC/p*aA*aA,'"',' type="tile"',' src="',aj.src_,'" />')}}else{var aL=F(aq.fillStyle);var aw=aL.color;var aG=aL.alpha*aq.globalAlpha;ai.push('<g_vml_:fill color="',aw,'" opacity="',aG,'" />')}}}q.fill=function(){this.stroke(true)};q.closePath=function(){this.currentPath_.push({type:"close"})};function V(j,Z,p){var i=j.m_;return{x:d*(Z*i[0][0]+p*i[1][0]+i[2][0])-f,y:d*(Z*i[0][1]+p*i[1][1]+i[2][1])-f}}q.save=function(){var i={};v(this,i);this.aStack_.push(i);this.mStack_.push(this.m_);this.m_=J(B(),this.m_)};q.restore=function(){if(this.aStack_.length){v(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function h(i){return isFinite(i[0][0])&&isFinite(i[0][1])&&isFinite(i[1][0])&&isFinite(i[1][1])&&isFinite(i[2][0])&&isFinite(i[2][1])}function aa(j,i,p){if(!h(i)){return}j.m_=i;if(p){var Z=i[0][0]*i[1][1]-i[0][1]*i[1][0];j.lineScale_=N(H(Z))}}q.translate=function(m,j){var i=[[1,0,0],[0,1,0],[m,j,1]];aa(this,J(i,this.m_),false)};q.rotate=function(j){var p=A(j);var m=l(j);var i=[[p,m,0],[-m,p,0],[0,0,1]];aa(this,J(i,this.m_),false)};q.scale=function(m,j){this.arcScaleX_*=m;this.arcScaleY_*=j;var i=[[m,0,0],[0,j,0],[0,0,1]];aa(this,J(i,this.m_),true)};q.transform=function(Z,p,ah,ag,j,i){var m=[[Z,p,0],[ah,ag,0],[j,i,1]];aa(this,J(m,this.m_),true)};q.setTransform=function(ag,Z,ai,ah,p,j){var i=[[ag,Z,0],[ai,ah,0],[p,j,1]];aa(this,i,true)};q.drawText_=function(am,ak,aj,ap,ai){var ao=this.m_,at=1000,j=0,ar=at,ah={x:0,y:0},ag=[];var i=u(E(this.font),this.element_);var p=ac(i);var au=this.element_.currentStyle;var Z=this.textAlign.toLowerCase();switch(Z){case"left":case"center":case"right":break;case"end":Z=au.direction=="ltr"?"right":"left";break;case"start":Z=au.direction=="rtl"?"right":"left";break;default:Z="left"}switch(this.textBaseline){case"hanging":case"top":ah.y=i.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":ah.y=-i.size/2.25;break}switch(Z){case"right":j=at;ar=0.05;break;case"center":j=ar=at/2;break}var aq=V(this,ak+ah.x,aj+ah.y);ag.push('<g_vml_:line from="',-j,' 0" to="',ar,' 0.05" ',' coordsize="100 100" coordorigin="0 0"',' filled="',!ai,'" stroked="',!!ai,'" style="position:absolute;width:1px;height:1px;">');if(ai){w(this,ag)}else{G(this,ag,{x:-j,y:0},{x:ar,y:i.size})}var an=ao[0][0].toFixed(3)+","+ao[1][0].toFixed(3)+","+ao[0][1].toFixed(3)+","+ao[1][1].toFixed(3)+",0,0";var al=n(aq.x/d)+","+n(aq.y/d);ag.push('<g_vml_:skew on="t" matrix="',an,'" ',' offset="',al,'" origin="',j,' 0" />','<g_vml_:path textpathok="true" />','<g_vml_:textpath on="true" string="',af(am),'" style="v-text-align:',Z,";font:",af(p),'" /></g_vml_:line>');this.element_.insertAdjacentHTML("beforeEnd",ag.join(""))};q.fillText=function(m,i,p,j){this.drawText_(m,i,p,j,false)};q.strokeText=function(m,i,p,j){this.drawText_(m,i,p,j,true)};q.measureText=function(m){if(!this.textMeasureEl_){var i='<span style="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;"></span>';this.element_.insertAdjacentHTML("beforeEnd",i);this.textMeasureEl_=this.element_.lastChild}var j=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(j.createTextNode(m));return{width:this.textMeasureEl_.offsetWidth}};q.clip=function(){};q.arcTo=function(){};q.createPattern=function(j,i){return new T(j,i)};function U(i){this.type_=i;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}U.prototype.addColorStop=function(j,i){i=F(i);this.colors_.push({offset:j,color:i.color,alpha:i.alpha})};function T(j,i){Q(j);switch(i){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=i;break;default:O("SYNTAX_ERR")}this.src_=j.src;this.width_=j.width;this.height_=j.height}function O(i){throw new P(i)}function Q(i){if(!i||i.nodeType!=1||i.tagName!="IMG"){O("TYPE_MISMATCH_ERR")}if(i.readyState!="complete"){O("INVALID_STATE_ERR")}}function P(i){this.code=this[i];this.message=i+": DOM Exception "+this.code}var X=P.prototype=new Error;X.INDEX_SIZE_ERR=1;X.DOMSTRING_SIZE_ERR=2;X.HIERARCHY_REQUEST_ERR=3;X.WRONG_DOCUMENT_ERR=4;X.INVALID_CHARACTER_ERR=5;X.NO_DATA_ALLOWED_ERR=6;X.NO_MODIFICATION_ALLOWED_ERR=7;X.NOT_FOUND_ERR=8;X.NOT_SUPPORTED_ERR=9;X.INUSE_ATTRIBUTE_ERR=10;X.INVALID_STATE_ERR=11;X.SYNTAX_ERR=12;X.INVALID_MODIFICATION_ERR=13;X.NAMESPACE_ERR=14;X.INVALID_ACCESS_ERR=15;X.VALIDATION_ERR=16;X.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=e;CanvasRenderingContext2D=D;CanvasGradient=U;CanvasPattern=T;DOMException=P})()}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/flot/jquery.colorhelpers.js b/theme/bootstrap/plugins/flot/jquery.colorhelpers.js new file mode 100644 index 0000000..cc1643b --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.colorhelpers.js @@ -0,0 +1,180 @@ +/* Plugin for jQuery for working with colors. + * + * Version 1.1. + * + * Inspiration from jQuery color animation plugin by John Resig. + * + * Released under the MIT license by Ole Laursen, October 2009. + * + * Examples: + * + * $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString() + * var c = $.color.extract($("#mydiv"), 'background-color'); + * console.log(c.r, c.g, c.b, c.a); + * $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)" + * + * Note that .scale() and .add() return the same modified object + * instead of making a new one. + * + * V. 1.1: Fix error handling so e.g. parsing an empty string does + * produce a color rather than just crashing. + */ + +(function($) { + $.color = {}; + + // construct color object with some convenient chainable helpers + $.color.make = function (r, g, b, a) { + var o = {}; + o.r = r || 0; + o.g = g || 0; + o.b = b || 0; + o.a = a != null ? a : 1; + + o.add = function (c, d) { + for (var i = 0; i < c.length; ++i) + o[c.charAt(i)] += d; + return o.normalize(); + }; + + o.scale = function (c, f) { + for (var i = 0; i < c.length; ++i) + o[c.charAt(i)] *= f; + return o.normalize(); + }; + + o.toString = function () { + if (o.a >= 1.0) { + return "rgb("+[o.r, o.g, o.b].join(",")+")"; + } else { + return "rgba("+[o.r, o.g, o.b, o.a].join(",")+")"; + } + }; + + o.normalize = function () { + function clamp(min, value, max) { + return value < min ? min: (value > max ? max: value); + } + + o.r = clamp(0, parseInt(o.r), 255); + o.g = clamp(0, parseInt(o.g), 255); + o.b = clamp(0, parseInt(o.b), 255); + o.a = clamp(0, o.a, 1); + return o; + }; + + o.clone = function () { + return $.color.make(o.r, o.b, o.g, o.a); + }; + + return o.normalize(); + }; + + // extract CSS color property from element, going up in the DOM + // if it's "transparent" + $.color.extract = function (elem, css) { + var c; + + do { + c = elem.css(css).toLowerCase(); + // keep going until we find an element that has color, or + // we hit the body or root (have no parent) + if (c != '' && c != 'transparent') + break; + elem = elem.parent(); + } while (elem.length && !$.nodeName(elem.get(0), "body")); + + // catch Safari's way of signalling transparent + if (c == "rgba(0, 0, 0, 0)") + c = "transparent"; + + return $.color.parse(c); + }; + + // parse CSS color string (like "rgb(10, 32, 43)" or "#fff"), + // returns color object, if parsing failed, you get black (0, 0, + // 0) out + $.color.parse = function (str) { + var res, m = $.color.make; + + // Look for rgb(num,num,num) + if (res = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str)) + return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10)); + + // Look for rgba(num,num,num,num) + if (res = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str)) + return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10), parseFloat(res[4])); + + // Look for rgb(num%,num%,num%) + if (res = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str)) + return m(parseFloat(res[1])*2.55, parseFloat(res[2])*2.55, parseFloat(res[3])*2.55); + + // Look for rgba(num%,num%,num%,num) + if (res = /rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str)) + return m(parseFloat(res[1])*2.55, parseFloat(res[2])*2.55, parseFloat(res[3])*2.55, parseFloat(res[4])); + + // Look for #a0b1c2 + if (res = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str)) + return m(parseInt(res[1], 16), parseInt(res[2], 16), parseInt(res[3], 16)); + + // Look for #fff + if (res = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str)) + return m(parseInt(res[1]+res[1], 16), parseInt(res[2]+res[2], 16), parseInt(res[3]+res[3], 16)); + + // Otherwise, we're most likely dealing with a named color + var name = $.trim(str).toLowerCase(); + if (name == "transparent") + return m(255, 255, 255, 0); + else { + // default to black + res = lookupColors[name] || [0, 0, 0]; + return m(res[0], res[1], res[2]); + } + }; + + var lookupColors = { + aqua:[0,255,255], + azure:[240,255,255], + beige:[245,245,220], + black:[0,0,0], + blue:[0,0,255], + brown:[165,42,42], + cyan:[0,255,255], + darkblue:[0,0,139], + darkcyan:[0,139,139], + darkgrey:[169,169,169], + darkgreen:[0,100,0], + darkkhaki:[189,183,107], + darkmagenta:[139,0,139], + darkolivegreen:[85,107,47], + darkorange:[255,140,0], + darkorchid:[153,50,204], + darkred:[139,0,0], + darksalmon:[233,150,122], + darkviolet:[148,0,211], + fuchsia:[255,0,255], + gold:[255,215,0], + green:[0,128,0], + indigo:[75,0,130], + khaki:[240,230,140], + lightblue:[173,216,230], + lightcyan:[224,255,255], + lightgreen:[144,238,144], + lightgrey:[211,211,211], + lightpink:[255,182,193], + lightyellow:[255,255,224], + lime:[0,255,0], + magenta:[255,0,255], + maroon:[128,0,0], + navy:[0,0,128], + olive:[128,128,0], + orange:[255,165,0], + pink:[255,192,203], + purple:[128,0,128], + violet:[128,0,128], + red:[255,0,0], + silver:[192,192,192], + white:[255,255,255], + yellow:[255,255,0] + }; +})(jQuery); diff --git a/theme/bootstrap/plugins/flot/jquery.colorhelpers.min.js b/theme/bootstrap/plugins/flot/jquery.colorhelpers.min.js new file mode 100644 index 0000000..7f42659 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.colorhelpers.min.js @@ -0,0 +1 @@ +(function($){$.color={};$.color.make=function(r,g,b,a){var o={};o.r=r||0;o.g=g||0;o.b=b||0;o.a=a!=null?a:1;o.add=function(c,d){for(var i=0;i<c.length;++i)o[c.charAt(i)]+=d;return o.normalize()};o.scale=function(c,f){for(var i=0;i<c.length;++i)o[c.charAt(i)]*=f;return o.normalize()};o.toString=function(){if(o.a>=1){return"rgb("+[o.r,o.g,o.b].join(",")+")"}else{return"rgba("+[o.r,o.g,o.b,o.a].join(",")+")"}};o.normalize=function(){function clamp(min,value,max){return value<min?min:value>max?max:value}o.r=clamp(0,parseInt(o.r),255);o.g=clamp(0,parseInt(o.g),255);o.b=clamp(0,parseInt(o.b),255);o.a=clamp(0,o.a,1);return o};o.clone=function(){return $.color.make(o.r,o.b,o.g,o.a)};return o.normalize()};$.color.extract=function(elem,css){var c;do{c=elem.css(css).toLowerCase();if(c!=""&&c!="transparent")break;elem=elem.parent()}while(elem.length&&!$.nodeName(elem.get(0),"body"));if(c=="rgba(0, 0, 0, 0)")c="transparent";return $.color.parse(c)};$.color.parse=function(str){var res,m=$.color.make;if(res=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10));if(res=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10),parseFloat(res[4]));if(res=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55);if(res=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55,parseFloat(res[4]));if(res=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))return m(parseInt(res[1],16),parseInt(res[2],16),parseInt(res[3],16));if(res=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))return m(parseInt(res[1]+res[1],16),parseInt(res[2]+res[2],16),parseInt(res[3]+res[3],16));var name=$.trim(str).toLowerCase();if(name=="transparent")return m(255,255,255,0);else{res=lookupColors[name]||[0,0,0];return m(res[0],res[1],res[2])}};var lookupColors={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/plugins/flot/jquery.flot.canvas.js b/theme/bootstrap/plugins/flot/jquery.flot.canvas.js new file mode 100644 index 0000000..d94b961 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.canvas.js @@ -0,0 +1,345 @@ +/* Flot plugin for drawing all elements of a plot on the canvas. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +Flot normally produces certain elements, like axis labels and the legend, using +HTML elements. This permits greater interactivity and customization, and often +looks better, due to cross-browser canvas text inconsistencies and limitations. + +It can also be desirable to render the plot entirely in canvas, particularly +if the goal is to save it as an image, or if Flot is being used in a context +where the HTML DOM does not exist, as is the case within Node.js. This plugin +switches out Flot's standard drawing operations for canvas-only replacements. + +Currently the plugin supports only axis labels, but it will eventually allow +every element of the plot to be rendered directly to canvas. + +The plugin supports these options: + +{ + canvas: boolean +} + +The "canvas" option controls whether full canvas drawing is enabled, making it +possible to toggle on and off. This is useful when a plot uses HTML text in the +browser, but needs to redraw with canvas text when exporting as an image. + +*/ + +(function($) { + + var options = { + canvas: true + }; + + var render, getTextInfo, addText; + + // Cache the prototype hasOwnProperty for faster access + + var hasOwnProperty = Object.prototype.hasOwnProperty; + + function init(plot, classes) { + + var Canvas = classes.Canvas; + + // We only want to replace the functions once; the second time around + // we would just get our new function back. This whole replacing of + // prototype functions is a disaster, and needs to be changed ASAP. + + if (render == null) { + getTextInfo = Canvas.prototype.getTextInfo, + addText = Canvas.prototype.addText, + render = Canvas.prototype.render; + } + + // Finishes rendering the canvas, including overlaid text + + Canvas.prototype.render = function() { + + if (!plot.getOptions().canvas) { + return render.call(this); + } + + var context = this.context, + cache = this._textCache; + + // For each text layer, render elements marked as active + + context.save(); + context.textBaseline = "middle"; + + for (var layerKey in cache) { + if (hasOwnProperty.call(cache, layerKey)) { + var layerCache = cache[layerKey]; + for (var styleKey in layerCache) { + if (hasOwnProperty.call(layerCache, styleKey)) { + var styleCache = layerCache[styleKey], + updateStyles = true; + for (var key in styleCache) { + if (hasOwnProperty.call(styleCache, key)) { + + var info = styleCache[key], + positions = info.positions, + lines = info.lines; + + // Since every element at this level of the cache have the + // same font and fill styles, we can just change them once + // using the values from the first element. + + if (updateStyles) { + context.fillStyle = info.font.color; + context.font = info.font.definition; + updateStyles = false; + } + + for (var i = 0, position; position = positions[i]; i++) { + if (position.active) { + for (var j = 0, line; line = position.lines[j]; j++) { + context.fillText(lines[j].text, line[0], line[1]); + } + } else { + positions.splice(i--, 1); + } + } + + if (positions.length == 0) { + delete styleCache[key]; + } + } + } + } + } + } + } + + context.restore(); + }; + + // Creates (if necessary) and returns a text info object. + // + // When the canvas option is set, the object looks like this: + // + // { + // width: Width of the text's bounding box. + // height: Height of the text's bounding box. + // positions: Array of positions at which this text is drawn. + // lines: [{ + // height: Height of this line. + // widths: Width of this line. + // text: Text on this line. + // }], + // font: { + // definition: Canvas font property string. + // color: Color of the text. + // }, + // } + // + // The positions array contains objects that look like this: + // + // { + // active: Flag indicating whether the text should be visible. + // lines: Array of [x, y] coordinates at which to draw the line. + // x: X coordinate at which to draw the text. + // y: Y coordinate at which to draw the text. + // } + + Canvas.prototype.getTextInfo = function(layer, text, font, angle, width) { + + if (!plot.getOptions().canvas) { + return getTextInfo.call(this, layer, text, font, angle, width); + } + + var textStyle, layerCache, styleCache, info; + + // Cast the value to a string, in case we were given a number + + text = "" + text; + + // If the font is a font-spec object, generate a CSS definition + + if (typeof font === "object") { + textStyle = font.style + " " + font.variant + " " + font.weight + " " + font.size + "px " + font.family; + } else { + textStyle = font; + } + + // Retrieve (or create) the cache for the text's layer and styles + + layerCache = this._textCache[layer]; + + if (layerCache == null) { + layerCache = this._textCache[layer] = {}; + } + + styleCache = layerCache[textStyle]; + + if (styleCache == null) { + styleCache = layerCache[textStyle] = {}; + } + + info = styleCache[text]; + + if (info == null) { + + var context = this.context; + + // If the font was provided as CSS, create a div with those + // classes and examine it to generate a canvas font spec. + + if (typeof font !== "object") { + + var element = $("<div>&nbsp;</div>") + .css("position", "absolute") + .addClass(typeof font === "string" ? font : null) + .appendTo(this.getTextLayer(layer)); + + font = { + lineHeight: element.height(), + style: element.css("font-style"), + variant: element.css("font-variant"), + weight: element.css("font-weight"), + family: element.css("font-family"), + color: element.css("color") + }; + + // Setting line-height to 1, without units, sets it equal + // to the font-size, even if the font-size is abstract, + // like 'smaller'. This enables us to read the real size + // via the element's height, working around browsers that + // return the literal 'smaller' value. + + font.size = element.css("line-height", 1).height(); + + element.remove(); + } + + textStyle = font.style + " " + font.variant + " " + font.weight + " " + font.size + "px " + font.family; + + // Create a new info object, initializing the dimensions to + // zero so we can count them up line-by-line. + + info = styleCache[text] = { + width: 0, + height: 0, + positions: [], + lines: [], + font: { + definition: textStyle, + color: font.color + } + }; + + context.save(); + context.font = textStyle; + + // Canvas can't handle multi-line strings; break on various + // newlines, including HTML brs, to build a list of lines. + // Note that we could split directly on regexps, but IE < 9 is + // broken; revisit when we drop IE 7/8 support. + + var lines = (text + "").replace(/<br ?\/?>|\r\n|\r/g, "\n").split("\n"); + + for (var i = 0; i < lines.length; ++i) { + + var lineText = lines[i], + measured = context.measureText(lineText); + + info.width = Math.max(measured.width, info.width); + info.height += font.lineHeight; + + info.lines.push({ + text: lineText, + width: measured.width, + height: font.lineHeight + }); + } + + context.restore(); + } + + return info; + }; + + // Adds a text string to the canvas text overlay. + + Canvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) { + + if (!plot.getOptions().canvas) { + return addText.call(this, layer, x, y, text, font, angle, width, halign, valign); + } + + var info = this.getTextInfo(layer, text, font, angle, width), + positions = info.positions, + lines = info.lines; + + // Text is drawn with baseline 'middle', which we need to account + // for by adding half a line's height to the y position. + + y += info.height / lines.length / 2; + + // Tweak the initial y-position to match vertical alignment + + if (valign == "middle") { + y = Math.round(y - info.height / 2); + } else if (valign == "bottom") { + y = Math.round(y - info.height); + } else { + y = Math.round(y); + } + + // FIXME: LEGACY BROWSER FIX + // AFFECTS: Opera < 12.00 + + // Offset the y coordinate, since Opera is off pretty + // consistently compared to the other browsers. + + if (!!(window.opera && window.opera.version().split(".")[0] < 12)) { + y -= 2; + } + + // Determine whether this text already exists at this position. + // If so, mark it for inclusion in the next render pass. + + for (var i = 0, position; position = positions[i]; i++) { + if (position.x == x && position.y == y) { + position.active = true; + return; + } + } + + // If the text doesn't exist at this position, create a new entry + + position = { + active: true, + lines: [], + x: x, + y: y + }; + + positions.push(position); + + // Fill in the x & y positions of each line, adjusting them + // individually for horizontal alignment. + + for (var i = 0, line; line = lines[i]; i++) { + if (halign == "center") { + position.lines.push([Math.round(x - line.width / 2), y]); + } else if (halign == "right") { + position.lines.push([Math.round(x - line.width), y]); + } else { + position.lines.push([Math.round(x), y]); + } + y += line.height; + } + }; + } + + $.plot.plugins.push({ + init: init, + options: options, + name: "canvas", + version: "1.0" + }); + +})(jQuery); diff --git a/theme/bootstrap/plugins/flot/jquery.flot.canvas.min.js b/theme/bootstrap/plugins/flot/jquery.flot.canvas.min.js new file mode 100644 index 0000000..826d217 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.canvas.min.js @@ -0,0 +1 @@ +(function($){var options={canvas:true};var render,getTextInfo,addText;var hasOwnProperty=Object.prototype.hasOwnProperty;function init(plot,classes){var Canvas=classes.Canvas;if(render==null){getTextInfo=Canvas.prototype.getTextInfo,addText=Canvas.prototype.addText,render=Canvas.prototype.render}Canvas.prototype.render=function(){if(!plot.getOptions().canvas){return render.call(this)}var context=this.context,cache=this._textCache;context.save();context.textBaseline="middle";for(var layerKey in cache){if(hasOwnProperty.call(cache,layerKey)){var layerCache=cache[layerKey];for(var styleKey in layerCache){if(hasOwnProperty.call(layerCache,styleKey)){var styleCache=layerCache[styleKey],updateStyles=true;for(var key in styleCache){if(hasOwnProperty.call(styleCache,key)){var info=styleCache[key],positions=info.positions,lines=info.lines;if(updateStyles){context.fillStyle=info.font.color;context.font=info.font.definition;updateStyles=false}for(var i=0,position;position=positions[i];i++){if(position.active){for(var j=0,line;line=position.lines[j];j++){context.fillText(lines[j].text,line[0],line[1])}}else{positions.splice(i--,1)}}if(positions.length==0){delete styleCache[key]}}}}}}}context.restore()};Canvas.prototype.getTextInfo=function(layer,text,font,angle,width){if(!plot.getOptions().canvas){return getTextInfo.call(this,layer,text,font,angle,width)}var textStyle,layerCache,styleCache,info;text=""+text;if(typeof font==="object"){textStyle=font.style+" "+font.variant+" "+font.weight+" "+font.size+"px "+font.family}else{textStyle=font}layerCache=this._textCache[layer];if(layerCache==null){layerCache=this._textCache[layer]={}}styleCache=layerCache[textStyle];if(styleCache==null){styleCache=layerCache[textStyle]={}}info=styleCache[text];if(info==null){var context=this.context;if(typeof font!=="object"){var element=$("<div>&nbsp;</div>").css("position","absolute").addClass(typeof font==="string"?font:null).appendTo(this.getTextLayer(layer));font={lineHeight:element.height(),style:element.css("font-style"),variant:element.css("font-variant"),weight:element.css("font-weight"),family:element.css("font-family"),color:element.css("color")};font.size=element.css("line-height",1).height();element.remove()}textStyle=font.style+" "+font.variant+" "+font.weight+" "+font.size+"px "+font.family;info=styleCache[text]={width:0,height:0,positions:[],lines:[],font:{definition:textStyle,color:font.color}};context.save();context.font=textStyle;var lines=(text+"").replace(/<br ?\/?>|\r\n|\r/g,"\n").split("\n");for(var i=0;i<lines.length;++i){var lineText=lines[i],measured=context.measureText(lineText);info.width=Math.max(measured.width,info.width);info.height+=font.lineHeight;info.lines.push({text:lineText,width:measured.width,height:font.lineHeight})}context.restore()}return info};Canvas.prototype.addText=function(layer,x,y,text,font,angle,width,halign,valign){if(!plot.getOptions().canvas){return addText.call(this,layer,x,y,text,font,angle,width,halign,valign)}var info=this.getTextInfo(layer,text,font,angle,width),positions=info.positions,lines=info.lines;y+=info.height/lines.length/2;if(valign=="middle"){y=Math.round(y-info.height/2)}else if(valign=="bottom"){y=Math.round(y-info.height)}else{y=Math.round(y)}if(!!(window.opera&&window.opera.version().split(".")[0]<12)){y-=2}for(var i=0,position;position=positions[i];i++){if(position.x==x&&position.y==y){position.active=true;return}}position={active:true,lines:[],x:x,y:y};positions.push(position);for(var i=0,line;line=lines[i];i++){if(halign=="center"){position.lines.push([Math.round(x-line.width/2),y])}else if(halign=="right"){position.lines.push([Math.round(x-line.width),y])}else{position.lines.push([Math.round(x),y])}y+=line.height}}}$.plot.plugins.push({init:init,options:options,name:"canvas",version:"1.0"})})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/plugins/flot/jquery.flot.categories.js b/theme/bootstrap/plugins/flot/jquery.flot.categories.js new file mode 100644 index 0000000..6e6e8ba --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.categories.js @@ -0,0 +1,190 @@ +/* Flot plugin for plotting textual data or categories. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +Consider a dataset like [["February", 34], ["March", 20], ...]. This plugin +allows you to plot such a dataset directly. + +To enable it, you must specify mode: "categories" on the axis with the textual +labels, e.g. + + $.plot("#placeholder", data, { xaxis: { mode: "categories" } }); + +By default, the labels are ordered as they are met in the data series. If you +need a different ordering, you can specify "categories" on the axis options +and list the categories there: + + xaxis: { + mode: "categories", + categories: ["February", "March", "April"] + } + +If you need to customize the distances between the categories, you can specify +"categories" as an object mapping labels to values + + xaxis: { + mode: "categories", + categories: { "February": 1, "March": 3, "April": 4 } + } + +If you don't specify all categories, the remaining categories will be numbered +from the max value plus 1 (with a spacing of 1 between each). + +Internally, the plugin works by transforming the input data through an auto- +generated mapping where the first category becomes 0, the second 1, etc. +Hence, a point like ["February", 34] becomes [0, 34] internally in Flot (this +is visible in hover and click events that return numbers rather than the +category labels). The plugin also overrides the tick generator to spit out the +categories as ticks instead of the values. + +If you need to map a value back to its label, the mapping is always accessible +as "categories" on the axis object, e.g. plot.getAxes().xaxis.categories. + +*/ + +(function ($) { + var options = { + xaxis: { + categories: null + }, + yaxis: { + categories: null + } + }; + + function processRawData(plot, series, data, datapoints) { + // if categories are enabled, we need to disable + // auto-transformation to numbers so the strings are intact + // for later processing + + var xCategories = series.xaxis.options.mode == "categories", + yCategories = series.yaxis.options.mode == "categories"; + + if (!(xCategories || yCategories)) + return; + + var format = datapoints.format; + + if (!format) { + // FIXME: auto-detection should really not be defined here + var s = series; + format = []; + format.push({ x: true, number: true, required: true }); + format.push({ y: true, number: true, required: true }); + + if (s.bars.show || (s.lines.show && s.lines.fill)) { + var autoscale = !!((s.bars.show && s.bars.zero) || (s.lines.show && s.lines.zero)); + format.push({ y: true, number: true, required: false, defaultValue: 0, autoscale: autoscale }); + if (s.bars.horizontal) { + delete format[format.length - 1].y; + format[format.length - 1].x = true; + } + } + + datapoints.format = format; + } + + for (var m = 0; m < format.length; ++m) { + if (format[m].x && xCategories) + format[m].number = false; + + if (format[m].y && yCategories) + format[m].number = false; + } + } + + function getNextIndex(categories) { + var index = -1; + + for (var v in categories) + if (categories[v] > index) + index = categories[v]; + + return index + 1; + } + + function categoriesTickGenerator(axis) { + var res = []; + for (var label in axis.categories) { + var v = axis.categories[label]; + if (v >= axis.min && v <= axis.max) + res.push([v, label]); + } + + res.sort(function (a, b) { return a[0] - b[0]; }); + + return res; + } + + function setupCategoriesForAxis(series, axis, datapoints) { + if (series[axis].options.mode != "categories") + return; + + if (!series[axis].categories) { + // parse options + var c = {}, o = series[axis].options.categories || {}; + if ($.isArray(o)) { + for (var i = 0; i < o.length; ++i) + c[o[i]] = i; + } + else { + for (var v in o) + c[v] = o[v]; + } + + series[axis].categories = c; + } + + // fix ticks + if (!series[axis].options.ticks) + series[axis].options.ticks = categoriesTickGenerator; + + transformPointsOnAxis(datapoints, axis, series[axis].categories); + } + + function transformPointsOnAxis(datapoints, axis, categories) { + // go through the points, transforming them + var points = datapoints.points, + ps = datapoints.pointsize, + format = datapoints.format, + formatColumn = axis.charAt(0), + index = getNextIndex(categories); + + for (var i = 0; i < points.length; i += ps) { + if (points[i] == null) + continue; + + for (var m = 0; m < ps; ++m) { + var val = points[i + m]; + + if (val == null || !format[m][formatColumn]) + continue; + + if (!(val in categories)) { + categories[val] = index; + ++index; + } + + points[i + m] = categories[val]; + } + } + } + + function processDatapoints(plot, series, datapoints) { + setupCategoriesForAxis(series, "xaxis", datapoints); + setupCategoriesForAxis(series, "yaxis", datapoints); + } + + function init(plot) { + plot.hooks.processRawData.push(processRawData); + plot.hooks.processDatapoints.push(processDatapoints); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'categories', + version: '1.0' + }); +})(jQuery); diff --git a/theme/bootstrap/plugins/flot/jquery.flot.categories.min.js b/theme/bootstrap/plugins/flot/jquery.flot.categories.min.js new file mode 100644 index 0000000..552dd90 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.categories.min.js @@ -0,0 +1 @@ +(function($){var options={xaxis:{categories:null},yaxis:{categories:null}};function processRawData(plot,series,data,datapoints){var xCategories=series.xaxis.options.mode=="categories",yCategories=series.yaxis.options.mode=="categories";if(!(xCategories||yCategories))return;var format=datapoints.format;if(!format){var s=series;format=[];format.push({x:true,number:true,required:true});format.push({y:true,number:true,required:true});if(s.bars.show||s.lines.show&&s.lines.fill){var autoscale=!!(s.bars.show&&s.bars.zero||s.lines.show&&s.lines.zero);format.push({y:true,number:true,required:false,defaultValue:0,autoscale:autoscale});if(s.bars.horizontal){delete format[format.length-1].y;format[format.length-1].x=true}}datapoints.format=format}for(var m=0;m<format.length;++m){if(format[m].x&&xCategories)format[m].number=false;if(format[m].y&&yCategories)format[m].number=false}}function getNextIndex(categories){var index=-1;for(var v in categories)if(categories[v]>index)index=categories[v];return index+1}function categoriesTickGenerator(axis){var res=[];for(var label in axis.categories){var v=axis.categories[label];if(v>=axis.min&&v<=axis.max)res.push([v,label])}res.sort(function(a,b){return a[0]-b[0]});return res}function setupCategoriesForAxis(series,axis,datapoints){if(series[axis].options.mode!="categories")return;if(!series[axis].categories){var c={},o=series[axis].options.categories||{};if($.isArray(o)){for(var i=0;i<o.length;++i)c[o[i]]=i}else{for(var v in o)c[v]=o[v]}series[axis].categories=c}if(!series[axis].options.ticks)series[axis].options.ticks=categoriesTickGenerator;transformPointsOnAxis(datapoints,axis,series[axis].categories)}function transformPointsOnAxis(datapoints,axis,categories){var points=datapoints.points,ps=datapoints.pointsize,format=datapoints.format,formatColumn=axis.charAt(0),index=getNextIndex(categories);for(var i=0;i<points.length;i+=ps){if(points[i]==null)continue;for(var m=0;m<ps;++m){var val=points[i+m];if(val==null||!format[m][formatColumn])continue;if(!(val in categories)){categories[val]=index;++index}points[i+m]=categories[val]}}}function processDatapoints(plot,series,datapoints){setupCategoriesForAxis(series,"xaxis",datapoints);setupCategoriesForAxis(series,"yaxis",datapoints)}function init(plot){plot.hooks.processRawData.push(processRawData);plot.hooks.processDatapoints.push(processDatapoints)}$.plot.plugins.push({init:init,options:options,name:"categories",version:"1.0"})})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/plugins/flot/jquery.flot.crosshair.js b/theme/bootstrap/plugins/flot/jquery.flot.crosshair.js new file mode 100644 index 0000000..c5df9d9 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.crosshair.js @@ -0,0 +1,176 @@ +/* Flot plugin for showing crosshairs when the mouse hovers over the plot. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +The plugin supports these options: + + crosshair: { + mode: null or "x" or "y" or "xy" + color: color + lineWidth: number + } + +Set the mode to one of "x", "y" or "xy". The "x" mode enables a vertical +crosshair that lets you trace the values on the x axis, "y" enables a +horizontal crosshair and "xy" enables them both. "color" is the color of the +crosshair (default is "rgba(170, 0, 0, 0.80)"), "lineWidth" is the width of +the drawn lines (default is 1). + +The plugin also adds four public methods: + + - setCrosshair( pos ) + + Set the position of the crosshair. Note that this is cleared if the user + moves the mouse. "pos" is in coordinates of the plot and should be on the + form { x: xpos, y: ypos } (you can use x2/x3/... if you're using multiple + axes), which is coincidentally the same format as what you get from a + "plothover" event. If "pos" is null, the crosshair is cleared. + + - clearCrosshair() + + Clear the crosshair. + + - lockCrosshair(pos) + + Cause the crosshair to lock to the current location, no longer updating if + the user moves the mouse. Optionally supply a position (passed on to + setCrosshair()) to move it to. + + Example usage: + + var myFlot = $.plot( $("#graph"), ..., { crosshair: { mode: "x" } } }; + $("#graph").bind( "plothover", function ( evt, position, item ) { + if ( item ) { + // Lock the crosshair to the data point being hovered + myFlot.lockCrosshair({ + x: item.datapoint[ 0 ], + y: item.datapoint[ 1 ] + }); + } else { + // Return normal crosshair operation + myFlot.unlockCrosshair(); + } + }); + + - unlockCrosshair() + + Free the crosshair to move again after locking it. +*/ + +(function ($) { + var options = { + crosshair: { + mode: null, // one of null, "x", "y" or "xy", + color: "rgba(170, 0, 0, 0.80)", + lineWidth: 1 + } + }; + + function init(plot) { + // position of crosshair in pixels + var crosshair = { x: -1, y: -1, locked: false }; + + plot.setCrosshair = function setCrosshair(pos) { + if (!pos) + crosshair.x = -1; + else { + var o = plot.p2c(pos); + crosshair.x = Math.max(0, Math.min(o.left, plot.width())); + crosshair.y = Math.max(0, Math.min(o.top, plot.height())); + } + + plot.triggerRedrawOverlay(); + }; + + plot.clearCrosshair = plot.setCrosshair; // passes null for pos + + plot.lockCrosshair = function lockCrosshair(pos) { + if (pos) + plot.setCrosshair(pos); + crosshair.locked = true; + }; + + plot.unlockCrosshair = function unlockCrosshair() { + crosshair.locked = false; + }; + + function onMouseOut(e) { + if (crosshair.locked) + return; + + if (crosshair.x != -1) { + crosshair.x = -1; + plot.triggerRedrawOverlay(); + } + } + + function onMouseMove(e) { + if (crosshair.locked) + return; + + if (plot.getSelection && plot.getSelection()) { + crosshair.x = -1; // hide the crosshair while selecting + return; + } + + var offset = plot.offset(); + crosshair.x = Math.max(0, Math.min(e.pageX - offset.left, plot.width())); + crosshair.y = Math.max(0, Math.min(e.pageY - offset.top, plot.height())); + plot.triggerRedrawOverlay(); + } + + plot.hooks.bindEvents.push(function (plot, eventHolder) { + if (!plot.getOptions().crosshair.mode) + return; + + eventHolder.mouseout(onMouseOut); + eventHolder.mousemove(onMouseMove); + }); + + plot.hooks.drawOverlay.push(function (plot, ctx) { + var c = plot.getOptions().crosshair; + if (!c.mode) + return; + + var plotOffset = plot.getPlotOffset(); + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + if (crosshair.x != -1) { + var adj = plot.getOptions().crosshair.lineWidth % 2 === 0 ? 0 : 0.5; + + ctx.strokeStyle = c.color; + ctx.lineWidth = c.lineWidth; + ctx.lineJoin = "round"; + + ctx.beginPath(); + if (c.mode.indexOf("x") != -1) { + var drawX = Math.round(crosshair.x) + adj; + ctx.moveTo(drawX, 0); + ctx.lineTo(drawX, plot.height()); + } + if (c.mode.indexOf("y") != -1) { + var drawY = Math.round(crosshair.y) + adj; + ctx.moveTo(0, drawY); + ctx.lineTo(plot.width(), drawY); + } + ctx.stroke(); + } + ctx.restore(); + }); + + plot.hooks.shutdown.push(function (plot, eventHolder) { + eventHolder.unbind("mouseout", onMouseOut); + eventHolder.unbind("mousemove", onMouseMove); + }); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'crosshair', + version: '1.0' + }); +})(jQuery); diff --git a/theme/bootstrap/plugins/flot/jquery.flot.crosshair.min.js b/theme/bootstrap/plugins/flot/jquery.flot.crosshair.min.js new file mode 100644 index 0000000..f97ce65 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.crosshair.min.js @@ -0,0 +1 @@ +(function($){var options={crosshair:{mode:null,color:"rgba(170, 0, 0, 0.80)",lineWidth:1}};function init(plot){var crosshair={x:-1,y:-1,locked:false};plot.setCrosshair=function setCrosshair(pos){if(!pos)crosshair.x=-1;else{var o=plot.p2c(pos);crosshair.x=Math.max(0,Math.min(o.left,plot.width()));crosshair.y=Math.max(0,Math.min(o.top,plot.height()))}plot.triggerRedrawOverlay()};plot.clearCrosshair=plot.setCrosshair;plot.lockCrosshair=function lockCrosshair(pos){if(pos)plot.setCrosshair(pos);crosshair.locked=true};plot.unlockCrosshair=function unlockCrosshair(){crosshair.locked=false};function onMouseOut(e){if(crosshair.locked)return;if(crosshair.x!=-1){crosshair.x=-1;plot.triggerRedrawOverlay()}}function onMouseMove(e){if(crosshair.locked)return;if(plot.getSelection&&plot.getSelection()){crosshair.x=-1;return}var offset=plot.offset();crosshair.x=Math.max(0,Math.min(e.pageX-offset.left,plot.width()));crosshair.y=Math.max(0,Math.min(e.pageY-offset.top,plot.height()));plot.triggerRedrawOverlay()}plot.hooks.bindEvents.push(function(plot,eventHolder){if(!plot.getOptions().crosshair.mode)return;eventHolder.mouseout(onMouseOut);eventHolder.mousemove(onMouseMove)});plot.hooks.drawOverlay.push(function(plot,ctx){var c=plot.getOptions().crosshair;if(!c.mode)return;var plotOffset=plot.getPlotOffset();ctx.save();ctx.translate(plotOffset.left,plotOffset.top);if(crosshair.x!=-1){var adj=plot.getOptions().crosshair.lineWidth%2===0?0:.5;ctx.strokeStyle=c.color;ctx.lineWidth=c.lineWidth;ctx.lineJoin="round";ctx.beginPath();if(c.mode.indexOf("x")!=-1){var drawX=Math.round(crosshair.x)+adj;ctx.moveTo(drawX,0);ctx.lineTo(drawX,plot.height())}if(c.mode.indexOf("y")!=-1){var drawY=Math.round(crosshair.y)+adj;ctx.moveTo(0,drawY);ctx.lineTo(plot.width(),drawY)}ctx.stroke()}ctx.restore()});plot.hooks.shutdown.push(function(plot,eventHolder){eventHolder.unbind("mouseout",onMouseOut);eventHolder.unbind("mousemove",onMouseMove)})}$.plot.plugins.push({init:init,options:options,name:"crosshair",version:"1.0"})})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/plugins/flot/jquery.flot.errorbars.js b/theme/bootstrap/plugins/flot/jquery.flot.errorbars.js new file mode 100644 index 0000000..7298436 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.errorbars.js @@ -0,0 +1,353 @@ +/* Flot plugin for plotting error bars. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +Error bars are used to show standard deviation and other statistical +properties in a plot. + +* Created by Rui Pereira - rui (dot) pereira (at) gmail (dot) com + +This plugin allows you to plot error-bars over points. Set "errorbars" inside +the points series to the axis name over which there will be error values in +your data array (*even* if you do not intend to plot them later, by setting +"show: null" on xerr/yerr). + +The plugin supports these options: + + series: { + points: { + errorbars: "x" or "y" or "xy", + xerr: { + show: null/false or true, + asymmetric: null/false or true, + upperCap: null or "-" or function, + lowerCap: null or "-" or function, + color: null or color, + radius: null or number + }, + yerr: { same options as xerr } + } + } + +Each data point array is expected to be of the type: + + "x" [ x, y, xerr ] + "y" [ x, y, yerr ] + "xy" [ x, y, xerr, yerr ] + +Where xerr becomes xerr_lower,xerr_upper for the asymmetric error case, and +equivalently for yerr. Eg., a datapoint for the "xy" case with symmetric +error-bars on X and asymmetric on Y would be: + + [ x, y, xerr, yerr_lower, yerr_upper ] + +By default no end caps are drawn. Setting upperCap and/or lowerCap to "-" will +draw a small cap perpendicular to the error bar. They can also be set to a +user-defined drawing function, with (ctx, x, y, radius) as parameters, as eg. + + function drawSemiCircle( ctx, x, y, radius ) { + ctx.beginPath(); + ctx.arc( x, y, radius, 0, Math.PI, false ); + ctx.moveTo( x - radius, y ); + ctx.lineTo( x + radius, y ); + ctx.stroke(); + } + +Color and radius both default to the same ones of the points series if not +set. The independent radius parameter on xerr/yerr is useful for the case when +we may want to add error-bars to a line, without showing the interconnecting +points (with radius: 0), and still showing end caps on the error-bars. +shadowSize and lineWidth are derived as well from the points series. + +*/ + +(function ($) { + var options = { + series: { + points: { + errorbars: null, //should be 'x', 'y' or 'xy' + xerr: { err: 'x', show: null, asymmetric: null, upperCap: null, lowerCap: null, color: null, radius: null}, + yerr: { err: 'y', show: null, asymmetric: null, upperCap: null, lowerCap: null, color: null, radius: null} + } + } + }; + + function processRawData(plot, series, data, datapoints){ + if (!series.points.errorbars) + return; + + // x,y values + var format = [ + { x: true, number: true, required: true }, + { y: true, number: true, required: true } + ]; + + var errors = series.points.errorbars; + // error bars - first X then Y + if (errors == 'x' || errors == 'xy') { + // lower / upper error + if (series.points.xerr.asymmetric) { + format.push({ x: true, number: true, required: true }); + format.push({ x: true, number: true, required: true }); + } else + format.push({ x: true, number: true, required: true }); + } + if (errors == 'y' || errors == 'xy') { + // lower / upper error + if (series.points.yerr.asymmetric) { + format.push({ y: true, number: true, required: true }); + format.push({ y: true, number: true, required: true }); + } else + format.push({ y: true, number: true, required: true }); + } + datapoints.format = format; + } + + function parseErrors(series, i){ + + var points = series.datapoints.points; + + // read errors from points array + var exl = null, + exu = null, + eyl = null, + eyu = null; + var xerr = series.points.xerr, + yerr = series.points.yerr; + + var eb = series.points.errorbars; + // error bars - first X + if (eb == 'x' || eb == 'xy') { + if (xerr.asymmetric) { + exl = points[i + 2]; + exu = points[i + 3]; + if (eb == 'xy') + if (yerr.asymmetric){ + eyl = points[i + 4]; + eyu = points[i + 5]; + } else eyl = points[i + 4]; + } else { + exl = points[i + 2]; + if (eb == 'xy') + if (yerr.asymmetric) { + eyl = points[i + 3]; + eyu = points[i + 4]; + } else eyl = points[i + 3]; + } + // only Y + } else if (eb == 'y') + if (yerr.asymmetric) { + eyl = points[i + 2]; + eyu = points[i + 3]; + } else eyl = points[i + 2]; + + // symmetric errors? + if (exu == null) exu = exl; + if (eyu == null) eyu = eyl; + + var errRanges = [exl, exu, eyl, eyu]; + // nullify if not showing + if (!xerr.show){ + errRanges[0] = null; + errRanges[1] = null; + } + if (!yerr.show){ + errRanges[2] = null; + errRanges[3] = null; + } + return errRanges; + } + + function drawSeriesErrors(plot, ctx, s){ + + var points = s.datapoints.points, + ps = s.datapoints.pointsize, + ax = [s.xaxis, s.yaxis], + radius = s.points.radius, + err = [s.points.xerr, s.points.yerr]; + + //sanity check, in case some inverted axis hack is applied to flot + var invertX = false; + if (ax[0].p2c(ax[0].max) < ax[0].p2c(ax[0].min)) { + invertX = true; + var tmp = err[0].lowerCap; + err[0].lowerCap = err[0].upperCap; + err[0].upperCap = tmp; + } + + var invertY = false; + if (ax[1].p2c(ax[1].min) < ax[1].p2c(ax[1].max)) { + invertY = true; + var tmp = err[1].lowerCap; + err[1].lowerCap = err[1].upperCap; + err[1].upperCap = tmp; + } + + for (var i = 0; i < s.datapoints.points.length; i += ps) { + + //parse + var errRanges = parseErrors(s, i); + + //cycle xerr & yerr + for (var e = 0; e < err.length; e++){ + + var minmax = [ax[e].min, ax[e].max]; + + //draw this error? + if (errRanges[e * err.length]){ + + //data coordinates + var x = points[i], + y = points[i + 1]; + + //errorbar ranges + var upper = [x, y][e] + errRanges[e * err.length + 1], + lower = [x, y][e] - errRanges[e * err.length]; + + //points outside of the canvas + if (err[e].err == 'x') + if (y > ax[1].max || y < ax[1].min || upper < ax[0].min || lower > ax[0].max) + continue; + if (err[e].err == 'y') + if (x > ax[0].max || x < ax[0].min || upper < ax[1].min || lower > ax[1].max) + continue; + + // prevent errorbars getting out of the canvas + var drawUpper = true, + drawLower = true; + + if (upper > minmax[1]) { + drawUpper = false; + upper = minmax[1]; + } + if (lower < minmax[0]) { + drawLower = false; + lower = minmax[0]; + } + + //sanity check, in case some inverted axis hack is applied to flot + if ((err[e].err == 'x' && invertX) || (err[e].err == 'y' && invertY)) { + //swap coordinates + var tmp = lower; + lower = upper; + upper = tmp; + tmp = drawLower; + drawLower = drawUpper; + drawUpper = tmp; + tmp = minmax[0]; + minmax[0] = minmax[1]; + minmax[1] = tmp; + } + + // convert to pixels + x = ax[0].p2c(x), + y = ax[1].p2c(y), + upper = ax[e].p2c(upper); + lower = ax[e].p2c(lower); + minmax[0] = ax[e].p2c(minmax[0]); + minmax[1] = ax[e].p2c(minmax[1]); + + //same style as points by default + var lw = err[e].lineWidth ? err[e].lineWidth : s.points.lineWidth, + sw = s.points.shadowSize != null ? s.points.shadowSize : s.shadowSize; + + //shadow as for points + if (lw > 0 && sw > 0) { + var w = sw / 2; + ctx.lineWidth = w; + ctx.strokeStyle = "rgba(0,0,0,0.1)"; + drawError(ctx, err[e], x, y, upper, lower, drawUpper, drawLower, radius, w + w/2, minmax); + + ctx.strokeStyle = "rgba(0,0,0,0.2)"; + drawError(ctx, err[e], x, y, upper, lower, drawUpper, drawLower, radius, w/2, minmax); + } + + ctx.strokeStyle = err[e].color? err[e].color: s.color; + ctx.lineWidth = lw; + //draw it + drawError(ctx, err[e], x, y, upper, lower, drawUpper, drawLower, radius, 0, minmax); + } + } + } + } + + function drawError(ctx,err,x,y,upper,lower,drawUpper,drawLower,radius,offset,minmax){ + + //shadow offset + y += offset; + upper += offset; + lower += offset; + + // error bar - avoid plotting over circles + if (err.err == 'x'){ + if (upper > x + radius) drawPath(ctx, [[upper,y],[Math.max(x + radius,minmax[0]),y]]); + else drawUpper = false; + if (lower < x - radius) drawPath(ctx, [[Math.min(x - radius,minmax[1]),y],[lower,y]] ); + else drawLower = false; + } + else { + if (upper < y - radius) drawPath(ctx, [[x,upper],[x,Math.min(y - radius,minmax[0])]] ); + else drawUpper = false; + if (lower > y + radius) drawPath(ctx, [[x,Math.max(y + radius,minmax[1])],[x,lower]] ); + else drawLower = false; + } + + //internal radius value in errorbar, allows to plot radius 0 points and still keep proper sized caps + //this is a way to get errorbars on lines without visible connecting dots + radius = err.radius != null? err.radius: radius; + + // upper cap + if (drawUpper) { + if (err.upperCap == '-'){ + if (err.err=='x') drawPath(ctx, [[upper,y - radius],[upper,y + radius]] ); + else drawPath(ctx, [[x - radius,upper],[x + radius,upper]] ); + } else if ($.isFunction(err.upperCap)){ + if (err.err=='x') err.upperCap(ctx, upper, y, radius); + else err.upperCap(ctx, x, upper, radius); + } + } + // lower cap + if (drawLower) { + if (err.lowerCap == '-'){ + if (err.err=='x') drawPath(ctx, [[lower,y - radius],[lower,y + radius]] ); + else drawPath(ctx, [[x - radius,lower],[x + radius,lower]] ); + } else if ($.isFunction(err.lowerCap)){ + if (err.err=='x') err.lowerCap(ctx, lower, y, radius); + else err.lowerCap(ctx, x, lower, radius); + } + } + } + + function drawPath(ctx, pts){ + ctx.beginPath(); + ctx.moveTo(pts[0][0], pts[0][1]); + for (var p=1; p < pts.length; p++) + ctx.lineTo(pts[p][0], pts[p][1]); + ctx.stroke(); + } + + function draw(plot, ctx){ + var plotOffset = plot.getPlotOffset(); + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + $.each(plot.getData(), function (i, s) { + if (s.points.errorbars && (s.points.xerr.show || s.points.yerr.show)) + drawSeriesErrors(plot, ctx, s); + }); + ctx.restore(); + } + + function init(plot) { + plot.hooks.processRawData.push(processRawData); + plot.hooks.draw.push(draw); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'errorbars', + version: '1.0' + }); +})(jQuery); diff --git a/theme/bootstrap/plugins/flot/jquery.flot.errorbars.min.js b/theme/bootstrap/plugins/flot/jquery.flot.errorbars.min.js new file mode 100644 index 0000000..a7bd042 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.errorbars.min.js @@ -0,0 +1 @@ +(function($){var options={series:{points:{errorbars:null,xerr:{err:"x",show:null,asymmetric:null,upperCap:null,lowerCap:null,color:null,radius:null},yerr:{err:"y",show:null,asymmetric:null,upperCap:null,lowerCap:null,color:null,radius:null}}}};function processRawData(plot,series,data,datapoints){if(!series.points.errorbars)return;var format=[{x:true,number:true,required:true},{y:true,number:true,required:true}];var errors=series.points.errorbars;if(errors=="x"||errors=="xy"){if(series.points.xerr.asymmetric){format.push({x:true,number:true,required:true});format.push({x:true,number:true,required:true})}else format.push({x:true,number:true,required:true})}if(errors=="y"||errors=="xy"){if(series.points.yerr.asymmetric){format.push({y:true,number:true,required:true});format.push({y:true,number:true,required:true})}else format.push({y:true,number:true,required:true})}datapoints.format=format}function parseErrors(series,i){var points=series.datapoints.points;var exl=null,exu=null,eyl=null,eyu=null;var xerr=series.points.xerr,yerr=series.points.yerr;var eb=series.points.errorbars;if(eb=="x"||eb=="xy"){if(xerr.asymmetric){exl=points[i+2];exu=points[i+3];if(eb=="xy")if(yerr.asymmetric){eyl=points[i+4];eyu=points[i+5]}else eyl=points[i+4]}else{exl=points[i+2];if(eb=="xy")if(yerr.asymmetric){eyl=points[i+3];eyu=points[i+4]}else eyl=points[i+3]}}else if(eb=="y")if(yerr.asymmetric){eyl=points[i+2];eyu=points[i+3]}else eyl=points[i+2];if(exu==null)exu=exl;if(eyu==null)eyu=eyl;var errRanges=[exl,exu,eyl,eyu];if(!xerr.show){errRanges[0]=null;errRanges[1]=null}if(!yerr.show){errRanges[2]=null;errRanges[3]=null}return errRanges}function drawSeriesErrors(plot,ctx,s){var points=s.datapoints.points,ps=s.datapoints.pointsize,ax=[s.xaxis,s.yaxis],radius=s.points.radius,err=[s.points.xerr,s.points.yerr];var invertX=false;if(ax[0].p2c(ax[0].max)<ax[0].p2c(ax[0].min)){invertX=true;var tmp=err[0].lowerCap;err[0].lowerCap=err[0].upperCap;err[0].upperCap=tmp}var invertY=false;if(ax[1].p2c(ax[1].min)<ax[1].p2c(ax[1].max)){invertY=true;var tmp=err[1].lowerCap;err[1].lowerCap=err[1].upperCap;err[1].upperCap=tmp}for(var i=0;i<s.datapoints.points.length;i+=ps){var errRanges=parseErrors(s,i);for(var e=0;e<err.length;e++){var minmax=[ax[e].min,ax[e].max];if(errRanges[e*err.length]){var x=points[i],y=points[i+1];var upper=[x,y][e]+errRanges[e*err.length+1],lower=[x,y][e]-errRanges[e*err.length];if(err[e].err=="x")if(y>ax[1].max||y<ax[1].min||upper<ax[0].min||lower>ax[0].max)continue;if(err[e].err=="y")if(x>ax[0].max||x<ax[0].min||upper<ax[1].min||lower>ax[1].max)continue;var drawUpper=true,drawLower=true;if(upper>minmax[1]){drawUpper=false;upper=minmax[1]}if(lower<minmax[0]){drawLower=false;lower=minmax[0]}if(err[e].err=="x"&&invertX||err[e].err=="y"&&invertY){var tmp=lower;lower=upper;upper=tmp;tmp=drawLower;drawLower=drawUpper;drawUpper=tmp;tmp=minmax[0];minmax[0]=minmax[1];minmax[1]=tmp}x=ax[0].p2c(x),y=ax[1].p2c(y),upper=ax[e].p2c(upper);lower=ax[e].p2c(lower);minmax[0]=ax[e].p2c(minmax[0]);minmax[1]=ax[e].p2c(minmax[1]);var lw=err[e].lineWidth?err[e].lineWidth:s.points.lineWidth,sw=s.points.shadowSize!=null?s.points.shadowSize:s.shadowSize;if(lw>0&&sw>0){var w=sw/2;ctx.lineWidth=w;ctx.strokeStyle="rgba(0,0,0,0.1)";drawError(ctx,err[e],x,y,upper,lower,drawUpper,drawLower,radius,w+w/2,minmax);ctx.strokeStyle="rgba(0,0,0,0.2)";drawError(ctx,err[e],x,y,upper,lower,drawUpper,drawLower,radius,w/2,minmax)}ctx.strokeStyle=err[e].color?err[e].color:s.color;ctx.lineWidth=lw;drawError(ctx,err[e],x,y,upper,lower,drawUpper,drawLower,radius,0,minmax)}}}}function drawError(ctx,err,x,y,upper,lower,drawUpper,drawLower,radius,offset,minmax){y+=offset;upper+=offset;lower+=offset;if(err.err=="x"){if(upper>x+radius)drawPath(ctx,[[upper,y],[Math.max(x+radius,minmax[0]),y]]);else drawUpper=false;if(lower<x-radius)drawPath(ctx,[[Math.min(x-radius,minmax[1]),y],[lower,y]]);else drawLower=false}else{if(upper<y-radius)drawPath(ctx,[[x,upper],[x,Math.min(y-radius,minmax[0])]]);else drawUpper=false;if(lower>y+radius)drawPath(ctx,[[x,Math.max(y+radius,minmax[1])],[x,lower]]);else drawLower=false}radius=err.radius!=null?err.radius:radius;if(drawUpper){if(err.upperCap=="-"){if(err.err=="x")drawPath(ctx,[[upper,y-radius],[upper,y+radius]]);else drawPath(ctx,[[x-radius,upper],[x+radius,upper]])}else if($.isFunction(err.upperCap)){if(err.err=="x")err.upperCap(ctx,upper,y,radius);else err.upperCap(ctx,x,upper,radius)}}if(drawLower){if(err.lowerCap=="-"){if(err.err=="x")drawPath(ctx,[[lower,y-radius],[lower,y+radius]]);else drawPath(ctx,[[x-radius,lower],[x+radius,lower]])}else if($.isFunction(err.lowerCap)){if(err.err=="x")err.lowerCap(ctx,lower,y,radius);else err.lowerCap(ctx,x,lower,radius)}}}function drawPath(ctx,pts){ctx.beginPath();ctx.moveTo(pts[0][0],pts[0][1]);for(var p=1;p<pts.length;p++)ctx.lineTo(pts[p][0],pts[p][1]);ctx.stroke()}function draw(plot,ctx){var plotOffset=plot.getPlotOffset();ctx.save();ctx.translate(plotOffset.left,plotOffset.top);$.each(plot.getData(),function(i,s){if(s.points.errorbars&&(s.points.xerr.show||s.points.yerr.show))drawSeriesErrors(plot,ctx,s)});ctx.restore()}function init(plot){plot.hooks.processRawData.push(processRawData);plot.hooks.draw.push(draw)}$.plot.plugins.push({init:init,options:options,name:"errorbars",version:"1.0"})})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/plugins/flot/jquery.flot.fillbetween.js b/theme/bootstrap/plugins/flot/jquery.flot.fillbetween.js new file mode 100644 index 0000000..2854d2d --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.fillbetween.js @@ -0,0 +1,226 @@ +/* Flot plugin for computing bottoms for filled line and bar charts. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +The case: you've got two series that you want to fill the area between. In Flot +terms, you need to use one as the fill bottom of the other. You can specify the +bottom of each data point as the third coordinate manually, or you can use this +plugin to compute it for you. + +In order to name the other series, you need to give it an id, like this: + + var dataset = [ + { data: [ ... ], id: "foo" } , // use default bottom + { data: [ ... ], fillBetween: "foo" }, // use first dataset as bottom + ]; + + $.plot($("#placeholder"), dataset, { lines: { show: true, fill: true }}); + +As a convenience, if the id given is a number that doesn't appear as an id in +the series, it is interpreted as the index in the array instead (so fillBetween: +0 can also mean the first series). + +Internally, the plugin modifies the datapoints in each series. For line series, +extra data points might be inserted through interpolation. Note that at points +where the bottom line is not defined (due to a null point or start/end of line), +the current line will show a gap too. The algorithm comes from the +jquery.flot.stack.js plugin, possibly some code could be shared. + +*/ + +(function ( $ ) { + + var options = { + series: { + fillBetween: null // or number + } + }; + + function init( plot ) { + + function findBottomSeries( s, allseries ) { + + var i; + + for ( i = 0; i < allseries.length; ++i ) { + if ( allseries[ i ].id === s.fillBetween ) { + return allseries[ i ]; + } + } + + if ( typeof s.fillBetween === "number" ) { + if ( s.fillBetween < 0 || s.fillBetween >= allseries.length ) { + return null; + } + return allseries[ s.fillBetween ]; + } + + return null; + } + + function computeFillBottoms( plot, s, datapoints ) { + + if ( s.fillBetween == null ) { + return; + } + + var other = findBottomSeries( s, plot.getData() ); + + if ( !other ) { + return; + } + + var ps = datapoints.pointsize, + points = datapoints.points, + otherps = other.datapoints.pointsize, + otherpoints = other.datapoints.points, + newpoints = [], + px, py, intery, qx, qy, bottom, + withlines = s.lines.show, + withbottom = ps > 2 && datapoints.format[2].y, + withsteps = withlines && s.lines.steps, + fromgap = true, + i = 0, + j = 0, + l, m; + + while ( true ) { + + if ( i >= points.length ) { + break; + } + + l = newpoints.length; + + if ( points[ i ] == null ) { + + // copy gaps + + for ( m = 0; m < ps; ++m ) { + newpoints.push( points[ i + m ] ); + } + + i += ps; + + } else if ( j >= otherpoints.length ) { + + // for lines, we can't use the rest of the points + + if ( !withlines ) { + for ( m = 0; m < ps; ++m ) { + newpoints.push( points[ i + m ] ); + } + } + + i += ps; + + } else if ( otherpoints[ j ] == null ) { + + // oops, got a gap + + for ( m = 0; m < ps; ++m ) { + newpoints.push( null ); + } + + fromgap = true; + j += otherps; + + } else { + + // cases where we actually got two points + + px = points[ i ]; + py = points[ i + 1 ]; + qx = otherpoints[ j ]; + qy = otherpoints[ j + 1 ]; + bottom = 0; + + if ( px === qx ) { + + for ( m = 0; m < ps; ++m ) { + newpoints.push( points[ i + m ] ); + } + + //newpoints[ l + 1 ] += qy; + bottom = qy; + + i += ps; + j += otherps; + + } else if ( px > qx ) { + + // we got past point below, might need to + // insert interpolated extra point + + if ( withlines && i > 0 && points[ i - ps ] != null ) { + intery = py + ( points[ i - ps + 1 ] - py ) * ( qx - px ) / ( points[ i - ps ] - px ); + newpoints.push( qx ); + newpoints.push( intery ); + for ( m = 2; m < ps; ++m ) { + newpoints.push( points[ i + m ] ); + } + bottom = qy; + } + + j += otherps; + + } else { // px < qx + + // if we come from a gap, we just skip this point + + if ( fromgap && withlines ) { + i += ps; + continue; + } + + for ( m = 0; m < ps; ++m ) { + newpoints.push( points[ i + m ] ); + } + + // we might be able to interpolate a point below, + // this can give us a better y + + if ( withlines && j > 0 && otherpoints[ j - otherps ] != null ) { + bottom = qy + ( otherpoints[ j - otherps + 1 ] - qy ) * ( px - qx ) / ( otherpoints[ j - otherps ] - qx ); + } + + //newpoints[l + 1] += bottom; + + i += ps; + } + + fromgap = false; + + if ( l !== newpoints.length && withbottom ) { + newpoints[ l + 2 ] = bottom; + } + } + + // maintain the line steps invariant + + if ( withsteps && l !== newpoints.length && l > 0 && + newpoints[ l ] !== null && + newpoints[ l ] !== newpoints[ l - ps ] && + newpoints[ l + 1 ] !== newpoints[ l - ps + 1 ] ) { + for (m = 0; m < ps; ++m) { + newpoints[ l + ps + m ] = newpoints[ l + m ]; + } + newpoints[ l + 1 ] = newpoints[ l - ps + 1 ]; + } + } + + datapoints.points = newpoints; + } + + plot.hooks.processDatapoints.push( computeFillBottoms ); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: "fillbetween", + version: "1.0" + }); + +})(jQuery); diff --git a/theme/bootstrap/plugins/flot/jquery.flot.fillbetween.min.js b/theme/bootstrap/plugins/flot/jquery.flot.fillbetween.min.js new file mode 100644 index 0000000..5bdad05 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.fillbetween.min.js @@ -0,0 +1 @@ +(function($){var options={series:{fillBetween:null}};function init(plot){function findBottomSeries(s,allseries){var i;for(i=0;i<allseries.length;++i){if(allseries[i].id===s.fillBetween){return allseries[i]}}if(typeof s.fillBetween==="number"){if(s.fillBetween<0||s.fillBetween>=allseries.length){return null}return allseries[s.fillBetween]}return null}function computeFillBottoms(plot,s,datapoints){if(s.fillBetween==null){return}var other=findBottomSeries(s,plot.getData());if(!other){return}var ps=datapoints.pointsize,points=datapoints.points,otherps=other.datapoints.pointsize,otherpoints=other.datapoints.points,newpoints=[],px,py,intery,qx,qy,bottom,withlines=s.lines.show,withbottom=ps>2&&datapoints.format[2].y,withsteps=withlines&&s.lines.steps,fromgap=true,i=0,j=0,l,m;while(true){if(i>=points.length){break}l=newpoints.length;if(points[i]==null){for(m=0;m<ps;++m){newpoints.push(points[i+m])}i+=ps}else if(j>=otherpoints.length){if(!withlines){for(m=0;m<ps;++m){newpoints.push(points[i+m])}}i+=ps}else if(otherpoints[j]==null){for(m=0;m<ps;++m){newpoints.push(null)}fromgap=true;j+=otherps}else{px=points[i];py=points[i+1];qx=otherpoints[j];qy=otherpoints[j+1];bottom=0;if(px===qx){for(m=0;m<ps;++m){newpoints.push(points[i+m])}bottom=qy;i+=ps;j+=otherps}else if(px>qx){if(withlines&&i>0&&points[i-ps]!=null){intery=py+(points[i-ps+1]-py)*(qx-px)/(points[i-ps]-px);newpoints.push(qx);newpoints.push(intery);for(m=2;m<ps;++m){newpoints.push(points[i+m])}bottom=qy}j+=otherps}else{if(fromgap&&withlines){i+=ps;continue}for(m=0;m<ps;++m){newpoints.push(points[i+m])}if(withlines&&j>0&&otherpoints[j-otherps]!=null){bottom=qy+(otherpoints[j-otherps+1]-qy)*(px-qx)/(otherpoints[j-otherps]-qx)}i+=ps}fromgap=false;if(l!==newpoints.length&&withbottom){newpoints[l+2]=bottom}}if(withsteps&&l!==newpoints.length&&l>0&&newpoints[l]!==null&&newpoints[l]!==newpoints[l-ps]&&newpoints[l+1]!==newpoints[l-ps+1]){for(m=0;m<ps;++m){newpoints[l+ps+m]=newpoints[l+m]}newpoints[l+1]=newpoints[l-ps+1]}}datapoints.points=newpoints}plot.hooks.processDatapoints.push(computeFillBottoms)}$.plot.plugins.push({init:init,options:options,name:"fillbetween",version:"1.0"})})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/plugins/flot/jquery.flot.image.js b/theme/bootstrap/plugins/flot/jquery.flot.image.js new file mode 100644 index 0000000..2e00ab1 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.image.js @@ -0,0 +1,241 @@ +/* Flot plugin for plotting images. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +The data syntax is [ [ image, x1, y1, x2, y2 ], ... ] where (x1, y1) and +(x2, y2) are where you intend the two opposite corners of the image to end up +in the plot. Image must be a fully loaded Javascript image (you can make one +with new Image()). If the image is not complete, it's skipped when plotting. + +There are two helpers included for retrieving images. The easiest work the way +that you put in URLs instead of images in the data, like this: + + [ "myimage.png", 0, 0, 10, 10 ] + +Then call $.plot.image.loadData( data, options, callback ) where data and +options are the same as you pass in to $.plot. This loads the images, replaces +the URLs in the data with the corresponding images and calls "callback" when +all images are loaded (or failed loading). In the callback, you can then call +$.plot with the data set. See the included example. + +A more low-level helper, $.plot.image.load(urls, callback) is also included. +Given a list of URLs, it calls callback with an object mapping from URL to +Image object when all images are loaded or have failed loading. + +The plugin supports these options: + + series: { + images: { + show: boolean + anchor: "corner" or "center" + alpha: [ 0, 1 ] + } + } + +They can be specified for a specific series: + + $.plot( $("#placeholder"), [{ + data: [ ... ], + images: { ... } + ]) + +Note that because the data format is different from usual data points, you +can't use images with anything else in a specific data series. + +Setting "anchor" to "center" causes the pixels in the image to be anchored at +the corner pixel centers inside of at the pixel corners, effectively letting +half a pixel stick out to each side in the plot. + +A possible future direction could be support for tiling for large images (like +Google Maps). + +*/ + +(function ($) { + var options = { + series: { + images: { + show: false, + alpha: 1, + anchor: "corner" // or "center" + } + } + }; + + $.plot.image = {}; + + $.plot.image.loadDataImages = function (series, options, callback) { + var urls = [], points = []; + + var defaultShow = options.series.images.show; + + $.each(series, function (i, s) { + if (!(defaultShow || s.images.show)) + return; + + if (s.data) + s = s.data; + + $.each(s, function (i, p) { + if (typeof p[0] == "string") { + urls.push(p[0]); + points.push(p); + } + }); + }); + + $.plot.image.load(urls, function (loadedImages) { + $.each(points, function (i, p) { + var url = p[0]; + if (loadedImages[url]) + p[0] = loadedImages[url]; + }); + + callback(); + }); + }; + + $.plot.image.load = function (urls, callback) { + var missing = urls.length, loaded = {}; + if (missing == 0) + callback({}); + + $.each(urls, function (i, url) { + var handler = function () { + --missing; + + loaded[url] = this; + + if (missing == 0) + callback(loaded); + }; + + $('<img />').load(handler).error(handler).attr('src', url); + }); + }; + + function drawSeries(plot, ctx, series) { + var plotOffset = plot.getPlotOffset(); + + if (!series.images || !series.images.show) + return; + + var points = series.datapoints.points, + ps = series.datapoints.pointsize; + + for (var i = 0; i < points.length; i += ps) { + var img = points[i], + x1 = points[i + 1], y1 = points[i + 2], + x2 = points[i + 3], y2 = points[i + 4], + xaxis = series.xaxis, yaxis = series.yaxis, + tmp; + + // actually we should check img.complete, but it + // appears to be a somewhat unreliable indicator in + // IE6 (false even after load event) + if (!img || img.width <= 0 || img.height <= 0) + continue; + + if (x1 > x2) { + tmp = x2; + x2 = x1; + x1 = tmp; + } + if (y1 > y2) { + tmp = y2; + y2 = y1; + y1 = tmp; + } + + // if the anchor is at the center of the pixel, expand the + // image by 1/2 pixel in each direction + if (series.images.anchor == "center") { + tmp = 0.5 * (x2-x1) / (img.width - 1); + x1 -= tmp; + x2 += tmp; + tmp = 0.5 * (y2-y1) / (img.height - 1); + y1 -= tmp; + y2 += tmp; + } + + // clip + if (x1 == x2 || y1 == y2 || + x1 >= xaxis.max || x2 <= xaxis.min || + y1 >= yaxis.max || y2 <= yaxis.min) + continue; + + var sx1 = 0, sy1 = 0, sx2 = img.width, sy2 = img.height; + if (x1 < xaxis.min) { + sx1 += (sx2 - sx1) * (xaxis.min - x1) / (x2 - x1); + x1 = xaxis.min; + } + + if (x2 > xaxis.max) { + sx2 += (sx2 - sx1) * (xaxis.max - x2) / (x2 - x1); + x2 = xaxis.max; + } + + if (y1 < yaxis.min) { + sy2 += (sy1 - sy2) * (yaxis.min - y1) / (y2 - y1); + y1 = yaxis.min; + } + + if (y2 > yaxis.max) { + sy1 += (sy1 - sy2) * (yaxis.max - y2) / (y2 - y1); + y2 = yaxis.max; + } + + x1 = xaxis.p2c(x1); + x2 = xaxis.p2c(x2); + y1 = yaxis.p2c(y1); + y2 = yaxis.p2c(y2); + + // the transformation may have swapped us + if (x1 > x2) { + tmp = x2; + x2 = x1; + x1 = tmp; + } + if (y1 > y2) { + tmp = y2; + y2 = y1; + y1 = tmp; + } + + tmp = ctx.globalAlpha; + ctx.globalAlpha *= series.images.alpha; + ctx.drawImage(img, + sx1, sy1, sx2 - sx1, sy2 - sy1, + x1 + plotOffset.left, y1 + plotOffset.top, + x2 - x1, y2 - y1); + ctx.globalAlpha = tmp; + } + } + + function processRawData(plot, series, data, datapoints) { + if (!series.images.show) + return; + + // format is Image, x1, y1, x2, y2 (opposite corners) + datapoints.format = [ + { required: true }, + { x: true, number: true, required: true }, + { y: true, number: true, required: true }, + { x: true, number: true, required: true }, + { y: true, number: true, required: true } + ]; + } + + function init(plot) { + plot.hooks.processRawData.push(processRawData); + plot.hooks.drawSeries.push(drawSeries); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'image', + version: '1.1' + }); +})(jQuery); diff --git a/theme/bootstrap/plugins/flot/jquery.flot.image.min.js b/theme/bootstrap/plugins/flot/jquery.flot.image.min.js new file mode 100644 index 0000000..6060024 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.image.min.js @@ -0,0 +1 @@ +(function($){var options={series:{images:{show:false,alpha:1,anchor:"corner"}}};$.plot.image={};$.plot.image.loadDataImages=function(series,options,callback){var urls=[],points=[];var defaultShow=options.series.images.show;$.each(series,function(i,s){if(!(defaultShow||s.images.show))return;if(s.data)s=s.data;$.each(s,function(i,p){if(typeof p[0]=="string"){urls.push(p[0]);points.push(p)}})});$.plot.image.load(urls,function(loadedImages){$.each(points,function(i,p){var url=p[0];if(loadedImages[url])p[0]=loadedImages[url]});callback()})};$.plot.image.load=function(urls,callback){var missing=urls.length,loaded={};if(missing==0)callback({});$.each(urls,function(i,url){var handler=function(){--missing;loaded[url]=this;if(missing==0)callback(loaded)};$("<img />").load(handler).error(handler).attr("src",url)})};function drawSeries(plot,ctx,series){var plotOffset=plot.getPlotOffset();if(!series.images||!series.images.show)return;var points=series.datapoints.points,ps=series.datapoints.pointsize;for(var i=0;i<points.length;i+=ps){var img=points[i],x1=points[i+1],y1=points[i+2],x2=points[i+3],y2=points[i+4],xaxis=series.xaxis,yaxis=series.yaxis,tmp;if(!img||img.width<=0||img.height<=0)continue;if(x1>x2){tmp=x2;x2=x1;x1=tmp}if(y1>y2){tmp=y2;y2=y1;y1=tmp}if(series.images.anchor=="center"){tmp=.5*(x2-x1)/(img.width-1);x1-=tmp;x2+=tmp;tmp=.5*(y2-y1)/(img.height-1);y1-=tmp;y2+=tmp}if(x1==x2||y1==y2||x1>=xaxis.max||x2<=xaxis.min||y1>=yaxis.max||y2<=yaxis.min)continue;var sx1=0,sy1=0,sx2=img.width,sy2=img.height;if(x1<xaxis.min){sx1+=(sx2-sx1)*(xaxis.min-x1)/(x2-x1);x1=xaxis.min}if(x2>xaxis.max){sx2+=(sx2-sx1)*(xaxis.max-x2)/(x2-x1);x2=xaxis.max}if(y1<yaxis.min){sy2+=(sy1-sy2)*(yaxis.min-y1)/(y2-y1);y1=yaxis.min}if(y2>yaxis.max){sy1+=(sy1-sy2)*(yaxis.max-y2)/(y2-y1);y2=yaxis.max}x1=xaxis.p2c(x1);x2=xaxis.p2c(x2);y1=yaxis.p2c(y1);y2=yaxis.p2c(y2);if(x1>x2){tmp=x2;x2=x1;x1=tmp}if(y1>y2){tmp=y2;y2=y1;y1=tmp}tmp=ctx.globalAlpha;ctx.globalAlpha*=series.images.alpha;ctx.drawImage(img,sx1,sy1,sx2-sx1,sy2-sy1,x1+plotOffset.left,y1+plotOffset.top,x2-x1,y2-y1);ctx.globalAlpha=tmp}}function processRawData(plot,series,data,datapoints){if(!series.images.show)return;datapoints.format=[{required:true},{x:true,number:true,required:true},{y:true,number:true,required:true},{x:true,number:true,required:true},{y:true,number:true,required:true}]}function init(plot){plot.hooks.processRawData.push(processRawData);plot.hooks.drawSeries.push(drawSeries)}$.plot.plugins.push({init:init,options:options,name:"image",version:"1.1"})})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/plugins/flot/jquery.flot.js b/theme/bootstrap/plugins/flot/jquery.flot.js new file mode 100644 index 0000000..965e78e --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.js @@ -0,0 +1,3137 @@ +/* Javascript plotting library for jQuery, version 0.8.2. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +*/ + +// first an inline dependency, jquery.colorhelpers.js, we inline it here +// for convenience + +/* Plugin for jQuery for working with colors. + * + * Version 1.1. + * + * Inspiration from jQuery color animation plugin by John Resig. + * + * Released under the MIT license by Ole Laursen, October 2009. + * + * Examples: + * + * $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString() + * var c = $.color.extract($("#mydiv"), 'background-color'); + * console.log(c.r, c.g, c.b, c.a); + * $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)" + * + * Note that .scale() and .add() return the same modified object + * instead of making a new one. + * + * V. 1.1: Fix error handling so e.g. parsing an empty string does + * produce a color rather than just crashing. + */ +(function($){$.color={};$.color.make=function(r,g,b,a){var o={};o.r=r||0;o.g=g||0;o.b=b||0;o.a=a!=null?a:1;o.add=function(c,d){for(var i=0;i<c.length;++i)o[c.charAt(i)]+=d;return o.normalize()};o.scale=function(c,f){for(var i=0;i<c.length;++i)o[c.charAt(i)]*=f;return o.normalize()};o.toString=function(){if(o.a>=1){return"rgb("+[o.r,o.g,o.b].join(",")+")"}else{return"rgba("+[o.r,o.g,o.b,o.a].join(",")+")"}};o.normalize=function(){function clamp(min,value,max){return value<min?min:value>max?max:value}o.r=clamp(0,parseInt(o.r),255);o.g=clamp(0,parseInt(o.g),255);o.b=clamp(0,parseInt(o.b),255);o.a=clamp(0,o.a,1);return o};o.clone=function(){return $.color.make(o.r,o.b,o.g,o.a)};return o.normalize()};$.color.extract=function(elem,css){var c;do{c=elem.css(css).toLowerCase();if(c!=""&&c!="transparent")break;elem=elem.parent()}while(elem.length&&!$.nodeName(elem.get(0),"body"));if(c=="rgba(0, 0, 0, 0)")c="transparent";return $.color.parse(c)};$.color.parse=function(str){var res,m=$.color.make;if(res=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10));if(res=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10),parseFloat(res[4]));if(res=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55);if(res=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55,parseFloat(res[4]));if(res=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))return m(parseInt(res[1],16),parseInt(res[2],16),parseInt(res[3],16));if(res=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))return m(parseInt(res[1]+res[1],16),parseInt(res[2]+res[2],16),parseInt(res[3]+res[3],16));var name=$.trim(str).toLowerCase();if(name=="transparent")return m(255,255,255,0);else{res=lookupColors[name]||[0,0,0];return m(res[0],res[1],res[2])}};var lookupColors={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery); + +// the actual Flot code +(function($) { + + // Cache the prototype hasOwnProperty for faster access + + var hasOwnProperty = Object.prototype.hasOwnProperty; + + /////////////////////////////////////////////////////////////////////////// + // The Canvas object is a wrapper around an HTML5 <canvas> tag. + // + // @constructor + // @param {string} cls List of classes to apply to the canvas. + // @param {element} container Element onto which to append the canvas. + // + // Requiring a container is a little iffy, but unfortunately canvas + // operations don't work unless the canvas is attached to the DOM. + + function Canvas(cls, container) { + + var element = container.children("." + cls)[0]; + + if (element == null) { + + element = document.createElement("canvas"); + element.className = cls; + + $(element).css({ direction: "ltr", position: "absolute", left: 0, top: 0 }) + .appendTo(container); + + // If HTML5 Canvas isn't available, fall back to [Ex|Flash]canvas + + if (!element.getContext) { + if (window.G_vmlCanvasManager) { + element = window.G_vmlCanvasManager.initElement(element); + } else { + throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode."); + } + } + } + + this.element = element; + + var context = this.context = element.getContext("2d"); + + // Determine the screen's ratio of physical to device-independent + // pixels. This is the ratio between the canvas width that the browser + // advertises and the number of pixels actually present in that space. + + // The iPhone 4, for example, has a device-independent width of 320px, + // but its screen is actually 640px wide. It therefore has a pixel + // ratio of 2, while most normal devices have a ratio of 1. + + var devicePixelRatio = window.devicePixelRatio || 1, + backingStoreRatio = + context.webkitBackingStorePixelRatio || + context.mozBackingStorePixelRatio || + context.msBackingStorePixelRatio || + context.oBackingStorePixelRatio || + context.backingStorePixelRatio || 1; + + this.pixelRatio = devicePixelRatio / backingStoreRatio; + + // Size the canvas to match the internal dimensions of its container + + this.resize(container.width(), container.height()); + + // Collection of HTML div layers for text overlaid onto the canvas + + this.textContainer = null; + this.text = {}; + + // Cache of text fragments and metrics, so we can avoid expensively + // re-calculating them when the plot is re-rendered in a loop. + + this._textCache = {}; + } + + // Resizes the canvas to the given dimensions. + // + // @param {number} width New width of the canvas, in pixels. + // @param {number} width New height of the canvas, in pixels. + + Canvas.prototype.resize = function(width, height) { + + if (width <= 0 || height <= 0) { + throw new Error("Invalid dimensions for plot, width = " + width + ", height = " + height); + } + + var element = this.element, + context = this.context, + pixelRatio = this.pixelRatio; + + // Resize the canvas, increasing its density based on the display's + // pixel ratio; basically giving it more pixels without increasing the + // size of its element, to take advantage of the fact that retina + // displays have that many more pixels in the same advertised space. + + // Resizing should reset the state (excanvas seems to be buggy though) + + if (this.width != width) { + element.width = width * pixelRatio; + element.style.width = width + "px"; + this.width = width; + } + + if (this.height != height) { + element.height = height * pixelRatio; + element.style.height = height + "px"; + this.height = height; + } + + // Save the context, so we can reset in case we get replotted. The + // restore ensure that we're really back at the initial state, and + // should be safe even if we haven't saved the initial state yet. + + context.restore(); + context.save(); + + // Scale the coordinate space to match the display density; so even though we + // may have twice as many pixels, we still want lines and other drawing to + // appear at the same size; the extra pixels will just make them crisper. + + context.scale(pixelRatio, pixelRatio); + }; + + // Clears the entire canvas area, not including any overlaid HTML text + + Canvas.prototype.clear = function() { + this.context.clearRect(0, 0, this.width, this.height); + }; + + // Finishes rendering the canvas, including managing the text overlay. + + Canvas.prototype.render = function() { + + var cache = this._textCache; + + // For each text layer, add elements marked as active that haven't + // already been rendered, and remove those that are no longer active. + + for (var layerKey in cache) { + if (hasOwnProperty.call(cache, layerKey)) { + + var layer = this.getTextLayer(layerKey), + layerCache = cache[layerKey]; + + layer.hide(); + + for (var styleKey in layerCache) { + if (hasOwnProperty.call(layerCache, styleKey)) { + var styleCache = layerCache[styleKey]; + for (var key in styleCache) { + if (hasOwnProperty.call(styleCache, key)) { + + var positions = styleCache[key].positions; + + for (var i = 0, position; position = positions[i]; i++) { + if (position.active) { + if (!position.rendered) { + layer.append(position.element); + position.rendered = true; + } + } else { + positions.splice(i--, 1); + if (position.rendered) { + position.element.detach(); + } + } + } + + if (positions.length == 0) { + delete styleCache[key]; + } + } + } + } + } + + layer.show(); + } + } + }; + + // Creates (if necessary) and returns the text overlay container. + // + // @param {string} classes String of space-separated CSS classes used to + // uniquely identify the text layer. + // @return {object} The jQuery-wrapped text-layer div. + + Canvas.prototype.getTextLayer = function(classes) { + + var layer = this.text[classes]; + + // Create the text layer if it doesn't exist + + if (layer == null) { + + // Create the text layer container, if it doesn't exist + + if (this.textContainer == null) { + this.textContainer = $("<div class='flot-text'></div>") + .css({ + position: "absolute", + top: 0, + left: 0, + bottom: 0, + right: 0, + 'font-size': "smaller", + color: "#545454" + }) + .insertAfter(this.element); + } + + layer = this.text[classes] = $("<div></div>") + .addClass(classes) + .css({ + position: "absolute", + top: 0, + left: 0, + bottom: 0, + right: 0 + }) + .appendTo(this.textContainer); + } + + return layer; + }; + + // Creates (if necessary) and returns a text info object. + // + // The object looks like this: + // + // { + // width: Width of the text's wrapper div. + // height: Height of the text's wrapper div. + // element: The jQuery-wrapped HTML div containing the text. + // positions: Array of positions at which this text is drawn. + // } + // + // The positions array contains objects that look like this: + // + // { + // active: Flag indicating whether the text should be visible. + // rendered: Flag indicating whether the text is currently visible. + // element: The jQuery-wrapped HTML div containing the text. + // x: X coordinate at which to draw the text. + // y: Y coordinate at which to draw the text. + // } + // + // Each position after the first receives a clone of the original element. + // + // The idea is that that the width, height, and general 'identity' of the + // text is constant no matter where it is placed; the placements are a + // secondary property. + // + // Canvas maintains a cache of recently-used text info objects; getTextInfo + // either returns the cached element or creates a new entry. + // + // @param {string} layer A string of space-separated CSS classes uniquely + // identifying the layer containing this text. + // @param {string} text Text string to retrieve info for. + // @param {(string|object)=} font Either a string of space-separated CSS + // classes or a font-spec object, defining the text's font and style. + // @param {number=} angle Angle at which to rotate the text, in degrees. + // Angle is currently unused, it will be implemented in the future. + // @param {number=} width Maximum width of the text before it wraps. + // @return {object} a text info object. + + Canvas.prototype.getTextInfo = function(layer, text, font, angle, width) { + + var textStyle, layerCache, styleCache, info; + + // Cast the value to a string, in case we were given a number or such + + text = "" + text; + + // If the font is a font-spec object, generate a CSS font definition + + if (typeof font === "object") { + textStyle = font.style + " " + font.variant + " " + font.weight + " " + font.size + "px/" + font.lineHeight + "px " + font.family; + } else { + textStyle = font; + } + + // Retrieve (or create) the cache for the text's layer and styles + + layerCache = this._textCache[layer]; + + if (layerCache == null) { + layerCache = this._textCache[layer] = {}; + } + + styleCache = layerCache[textStyle]; + + if (styleCache == null) { + styleCache = layerCache[textStyle] = {}; + } + + info = styleCache[text]; + + // If we can't find a matching element in our cache, create a new one + + if (info == null) { + + var element = $("<div></div>").html(text) + .css({ + position: "absolute", + 'max-width': width, + top: -9999 + }) + .appendTo(this.getTextLayer(layer)); + + if (typeof font === "object") { + element.css({ + font: textStyle, + color: font.color + }); + } else if (typeof font === "string") { + element.addClass(font); + } + + info = styleCache[text] = { + width: element.outerWidth(true), + height: element.outerHeight(true), + element: element, + positions: [] + }; + + element.detach(); + } + + return info; + }; + + // Adds a text string to the canvas text overlay. + // + // The text isn't drawn immediately; it is marked as rendering, which will + // result in its addition to the canvas on the next render pass. + // + // @param {string} layer A string of space-separated CSS classes uniquely + // identifying the layer containing this text. + // @param {number} x X coordinate at which to draw the text. + // @param {number} y Y coordinate at which to draw the text. + // @param {string} text Text string to draw. + // @param {(string|object)=} font Either a string of space-separated CSS + // classes or a font-spec object, defining the text's font and style. + // @param {number=} angle Angle at which to rotate the text, in degrees. + // Angle is currently unused, it will be implemented in the future. + // @param {number=} width Maximum width of the text before it wraps. + // @param {string=} halign Horizontal alignment of the text; either "left", + // "center" or "right". + // @param {string=} valign Vertical alignment of the text; either "top", + // "middle" or "bottom". + + Canvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) { + + var info = this.getTextInfo(layer, text, font, angle, width), + positions = info.positions; + + // Tweak the div's position to match the text's alignment + + if (halign == "center") { + x -= info.width / 2; + } else if (halign == "right") { + x -= info.width; + } + + if (valign == "middle") { + y -= info.height / 2; + } else if (valign == "bottom") { + y -= info.height; + } + + // Determine whether this text already exists at this position. + // If so, mark it for inclusion in the next render pass. + + for (var i = 0, position; position = positions[i]; i++) { + if (position.x == x && position.y == y) { + position.active = true; + return; + } + } + + // If the text doesn't exist at this position, create a new entry + + // For the very first position we'll re-use the original element, + // while for subsequent ones we'll clone it. + + position = { + active: true, + rendered: false, + element: positions.length ? info.element.clone() : info.element, + x: x, + y: y + }; + + positions.push(position); + + // Move the element to its final position within the container + + position.element.css({ + top: Math.round(y), + left: Math.round(x), + 'text-align': halign // In case the text wraps + }); + }; + + // Removes one or more text strings from the canvas text overlay. + // + // If no parameters are given, all text within the layer is removed. + // + // Note that the text is not immediately removed; it is simply marked as + // inactive, which will result in its removal on the next render pass. + // This avoids the performance penalty for 'clear and redraw' behavior, + // where we potentially get rid of all text on a layer, but will likely + // add back most or all of it later, as when redrawing axes, for example. + // + // @param {string} layer A string of space-separated CSS classes uniquely + // identifying the layer containing this text. + // @param {number=} x X coordinate of the text. + // @param {number=} y Y coordinate of the text. + // @param {string=} text Text string to remove. + // @param {(string|object)=} font Either a string of space-separated CSS + // classes or a font-spec object, defining the text's font and style. + // @param {number=} angle Angle at which the text is rotated, in degrees. + // Angle is currently unused, it will be implemented in the future. + + Canvas.prototype.removeText = function(layer, x, y, text, font, angle) { + if (text == null) { + var layerCache = this._textCache[layer]; + if (layerCache != null) { + for (var styleKey in layerCache) { + if (hasOwnProperty.call(layerCache, styleKey)) { + var styleCache = layerCache[styleKey]; + for (var key in styleCache) { + if (hasOwnProperty.call(styleCache, key)) { + var positions = styleCache[key].positions; + for (var i = 0, position; position = positions[i]; i++) { + position.active = false; + } + } + } + } + } + } + } else { + var positions = this.getTextInfo(layer, text, font, angle).positions; + for (var i = 0, position; position = positions[i]; i++) { + if (position.x == x && position.y == y) { + position.active = false; + } + } + } + }; + + /////////////////////////////////////////////////////////////////////////// + // The top-level container for the entire plot. + + function Plot(placeholder, data_, options_, plugins) { + // data is on the form: + // [ series1, series2 ... ] + // where series is either just the data as [ [x1, y1], [x2, y2], ... ] + // or { data: [ [x1, y1], [x2, y2], ... ], label: "some label", ... } + + var series = [], + options = { + // the color theme used for graphs + colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"], + legend: { + show: true, + noColumns: 1, // number of colums in legend table + labelFormatter: null, // fn: string -> string + labelBoxBorderColor: "#ccc", // border color for the little label boxes + container: null, // container (as jQuery object) to put legend in, null means default on top of graph + position: "ne", // position of default legend container within plot + margin: 5, // distance from grid edge to default legend container within plot + backgroundColor: null, // null means auto-detect + backgroundOpacity: 0.85, // set to 0 to avoid background + sorted: null // default to no legend sorting + }, + xaxis: { + show: null, // null = auto-detect, true = always, false = never + position: "bottom", // or "top" + mode: null, // null or "time" + font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: "italic", weight: "bold", family: "sans-serif", variant: "small-caps" } + color: null, // base color, labels, ticks + tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)" + transform: null, // null or f: number -> number to transform axis + inverseTransform: null, // if transform is set, this should be the inverse function + min: null, // min. value to show, null means set automatically + max: null, // max. value to show, null means set automatically + autoscaleMargin: null, // margin in % to add if auto-setting min/max + ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks + tickFormatter: null, // fn: number -> string + labelWidth: null, // size of tick labels in pixels + labelHeight: null, + reserveSpace: null, // whether to reserve space even if axis isn't shown + tickLength: null, // size in pixels of ticks, or "full" for whole line + alignTicksWithAxis: null, // axis number or null for no sync + tickDecimals: null, // no. of decimals, null means auto + tickSize: null, // number or [number, "unit"] + minTickSize: null // number or [number, "unit"] + }, + yaxis: { + autoscaleMargin: 0.02, + position: "left" // or "right" + }, + xaxes: [], + yaxes: [], + series: { + points: { + show: false, + radius: 3, + lineWidth: 2, // in pixels + fill: true, + fillColor: "#ffffff", + symbol: "circle" // or callback + }, + lines: { + // we don't put in show: false so we can see + // whether lines were actively disabled + lineWidth: 2, // in pixels + fill: false, + fillColor: null, + steps: false + // Omit 'zero', so we can later default its value to + // match that of the 'fill' option. + }, + bars: { + show: false, + lineWidth: 2, // in pixels + barWidth: 1, // in units of the x axis + fill: true, + fillColor: null, + align: "left", // "left", "right", or "center" + horizontal: false, + zero: true + }, + shadowSize: 3, + highlightColor: null + }, + grid: { + show: true, + aboveData: false, + color: "#545454", // primary color used for outline and labels + backgroundColor: null, // null for transparent, else color + borderColor: null, // set if different from the grid color + tickColor: null, // color for the ticks, e.g. "rgba(0,0,0,0.15)" + margin: 0, // distance from the canvas edge to the grid + labelMargin: 5, // in pixels + axisMargin: 8, // in pixels + borderWidth: 2, // in pixels + minBorderMargin: null, // in pixels, null means taken from points radius + markings: null, // array of ranges or fn: axes -> array of ranges + markingsColor: "#f4f4f4", + markingsLineWidth: 2, + // interactive stuff + clickable: false, + hoverable: false, + autoHighlight: true, // highlight in case mouse is near + mouseActiveRadius: 10 // how far the mouse can be away to activate an item + }, + interaction: { + redrawOverlayInterval: 1000/60 // time between updates, -1 means in same flow + }, + hooks: {} + }, + surface = null, // the canvas for the plot itself + overlay = null, // canvas for interactive stuff on top of plot + eventHolder = null, // jQuery object that events should be bound to + ctx = null, octx = null, + xaxes = [], yaxes = [], + plotOffset = { left: 0, right: 0, top: 0, bottom: 0}, + plotWidth = 0, plotHeight = 0, + hooks = { + processOptions: [], + processRawData: [], + processDatapoints: [], + processOffset: [], + drawBackground: [], + drawSeries: [], + draw: [], + bindEvents: [], + drawOverlay: [], + shutdown: [] + }, + plot = this; + + // public functions + plot.setData = setData; + plot.setupGrid = setupGrid; + plot.draw = draw; + plot.getPlaceholder = function() { return placeholder; }; + plot.getCanvas = function() { return surface.element; }; + plot.getPlotOffset = function() { return plotOffset; }; + plot.width = function () { return plotWidth; }; + plot.height = function () { return plotHeight; }; + plot.offset = function () { + var o = eventHolder.offset(); + o.left += plotOffset.left; + o.top += plotOffset.top; + return o; + }; + plot.getData = function () { return series; }; + plot.getAxes = function () { + var res = {}, i; + $.each(xaxes.concat(yaxes), function (_, axis) { + if (axis) + res[axis.direction + (axis.n != 1 ? axis.n : "") + "axis"] = axis; + }); + return res; + }; + plot.getXAxes = function () { return xaxes; }; + plot.getYAxes = function () { return yaxes; }; + plot.c2p = canvasToAxisCoords; + plot.p2c = axisToCanvasCoords; + plot.getOptions = function () { return options; }; + plot.highlight = highlight; + plot.unhighlight = unhighlight; + plot.triggerRedrawOverlay = triggerRedrawOverlay; + plot.pointOffset = function(point) { + return { + left: parseInt(xaxes[axisNumber(point, "x") - 1].p2c(+point.x) + plotOffset.left, 10), + top: parseInt(yaxes[axisNumber(point, "y") - 1].p2c(+point.y) + plotOffset.top, 10) + }; + }; + plot.shutdown = shutdown; + plot.destroy = function () { + shutdown(); + placeholder.removeData("plot").empty(); + + series = []; + options = null; + surface = null; + overlay = null; + eventHolder = null; + ctx = null; + octx = null; + xaxes = []; + yaxes = []; + hooks = null; + highlights = []; + plot = null; + }; + plot.resize = function () { + var width = placeholder.width(), + height = placeholder.height(); + surface.resize(width, height); + overlay.resize(width, height); + }; + + // public attributes + plot.hooks = hooks; + + // initialize + initPlugins(plot); + parseOptions(options_); + setupCanvases(); + setData(data_); + setupGrid(); + draw(); + bindEvents(); + + + function executeHooks(hook, args) { + args = [plot].concat(args); + for (var i = 0; i < hook.length; ++i) + hook[i].apply(this, args); + } + + function initPlugins() { + + // References to key classes, allowing plugins to modify them + + var classes = { + Canvas: Canvas + }; + + for (var i = 0; i < plugins.length; ++i) { + var p = plugins[i]; + p.init(plot, classes); + if (p.options) + $.extend(true, options, p.options); + } + } + + function parseOptions(opts) { + + $.extend(true, options, opts); + + // $.extend merges arrays, rather than replacing them. When less + // colors are provided than the size of the default palette, we + // end up with those colors plus the remaining defaults, which is + // not expected behavior; avoid it by replacing them here. + + if (opts && opts.colors) { + options.colors = opts.colors; + } + + if (options.xaxis.color == null) + options.xaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString(); + if (options.yaxis.color == null) + options.yaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString(); + + if (options.xaxis.tickColor == null) // grid.tickColor for back-compatibility + options.xaxis.tickColor = options.grid.tickColor || options.xaxis.color; + if (options.yaxis.tickColor == null) // grid.tickColor for back-compatibility + options.yaxis.tickColor = options.grid.tickColor || options.yaxis.color; + + if (options.grid.borderColor == null) + options.grid.borderColor = options.grid.color; + if (options.grid.tickColor == null) + options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString(); + + // Fill in defaults for axis options, including any unspecified + // font-spec fields, if a font-spec was provided. + + // If no x/y axis options were provided, create one of each anyway, + // since the rest of the code assumes that they exist. + + var i, axisOptions, axisCount, + fontSize = placeholder.css("font-size"), + fontSizeDefault = fontSize ? +fontSize.replace("px", "") : 13, + fontDefaults = { + style: placeholder.css("font-style"), + size: Math.round(0.8 * fontSizeDefault), + variant: placeholder.css("font-variant"), + weight: placeholder.css("font-weight"), + family: placeholder.css("font-family") + }; + + axisCount = options.xaxes.length || 1; + for (i = 0; i < axisCount; ++i) { + + axisOptions = options.xaxes[i]; + if (axisOptions && !axisOptions.tickColor) { + axisOptions.tickColor = axisOptions.color; + } + + axisOptions = $.extend(true, {}, options.xaxis, axisOptions); + options.xaxes[i] = axisOptions; + + if (axisOptions.font) { + axisOptions.font = $.extend({}, fontDefaults, axisOptions.font); + if (!axisOptions.font.color) { + axisOptions.font.color = axisOptions.color; + } + if (!axisOptions.font.lineHeight) { + axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15); + } + } + } + + axisCount = options.yaxes.length || 1; + for (i = 0; i < axisCount; ++i) { + + axisOptions = options.yaxes[i]; + if (axisOptions && !axisOptions.tickColor) { + axisOptions.tickColor = axisOptions.color; + } + + axisOptions = $.extend(true, {}, options.yaxis, axisOptions); + options.yaxes[i] = axisOptions; + + if (axisOptions.font) { + axisOptions.font = $.extend({}, fontDefaults, axisOptions.font); + if (!axisOptions.font.color) { + axisOptions.font.color = axisOptions.color; + } + if (!axisOptions.font.lineHeight) { + axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15); + } + } + } + + // backwards compatibility, to be removed in future + if (options.xaxis.noTicks && options.xaxis.ticks == null) + options.xaxis.ticks = options.xaxis.noTicks; + if (options.yaxis.noTicks && options.yaxis.ticks == null) + options.yaxis.ticks = options.yaxis.noTicks; + if (options.x2axis) { + options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis); + options.xaxes[1].position = "top"; + } + if (options.y2axis) { + options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis); + options.yaxes[1].position = "right"; + } + if (options.grid.coloredAreas) + options.grid.markings = options.grid.coloredAreas; + if (options.grid.coloredAreasColor) + options.grid.markingsColor = options.grid.coloredAreasColor; + if (options.lines) + $.extend(true, options.series.lines, options.lines); + if (options.points) + $.extend(true, options.series.points, options.points); + if (options.bars) + $.extend(true, options.series.bars, options.bars); + if (options.shadowSize != null) + options.series.shadowSize = options.shadowSize; + if (options.highlightColor != null) + options.series.highlightColor = options.highlightColor; + + // save options on axes for future reference + for (i = 0; i < options.xaxes.length; ++i) + getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i]; + for (i = 0; i < options.yaxes.length; ++i) + getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i]; + + // add hooks from options + for (var n in hooks) + if (options.hooks[n] && options.hooks[n].length) + hooks[n] = hooks[n].concat(options.hooks[n]); + + executeHooks(hooks.processOptions, [options]); + } + + function setData(d) { + series = parseData(d); + fillInSeriesOptions(); + processData(); + } + + function parseData(d) { + var res = []; + for (var i = 0; i < d.length; ++i) { + var s = $.extend(true, {}, options.series); + + if (d[i].data != null) { + s.data = d[i].data; // move the data instead of deep-copy + delete d[i].data; + + $.extend(true, s, d[i]); + + d[i].data = s.data; + } + else + s.data = d[i]; + res.push(s); + } + + return res; + } + + function axisNumber(obj, coord) { + var a = obj[coord + "axis"]; + if (typeof a == "object") // if we got a real axis, extract number + a = a.n; + if (typeof a != "number") + a = 1; // default to first axis + return a; + } + + function allAxes() { + // return flat array without annoying null entries + return $.grep(xaxes.concat(yaxes), function (a) { return a; }); + } + + function canvasToAxisCoords(pos) { + // return an object with x/y corresponding to all used axes + var res = {}, i, axis; + for (i = 0; i < xaxes.length; ++i) { + axis = xaxes[i]; + if (axis && axis.used) + res["x" + axis.n] = axis.c2p(pos.left); + } + + for (i = 0; i < yaxes.length; ++i) { + axis = yaxes[i]; + if (axis && axis.used) + res["y" + axis.n] = axis.c2p(pos.top); + } + + if (res.x1 !== undefined) + res.x = res.x1; + if (res.y1 !== undefined) + res.y = res.y1; + + return res; + } + + function axisToCanvasCoords(pos) { + // get canvas coords from the first pair of x/y found in pos + var res = {}, i, axis, key; + + for (i = 0; i < xaxes.length; ++i) { + axis = xaxes[i]; + if (axis && axis.used) { + key = "x" + axis.n; + if (pos[key] == null && axis.n == 1) + key = "x"; + + if (pos[key] != null) { + res.left = axis.p2c(pos[key]); + break; + } + } + } + + for (i = 0; i < yaxes.length; ++i) { + axis = yaxes[i]; + if (axis && axis.used) { + key = "y" + axis.n; + if (pos[key] == null && axis.n == 1) + key = "y"; + + if (pos[key] != null) { + res.top = axis.p2c(pos[key]); + break; + } + } + } + + return res; + } + + function getOrCreateAxis(axes, number) { + if (!axes[number - 1]) + axes[number - 1] = { + n: number, // save the number for future reference + direction: axes == xaxes ? "x" : "y", + options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis) + }; + + return axes[number - 1]; + } + + function fillInSeriesOptions() { + + var neededColors = series.length, maxIndex = -1, i; + + // Subtract the number of series that already have fixed colors or + // color indexes from the number that we still need to generate. + + for (i = 0; i < series.length; ++i) { + var sc = series[i].color; + if (sc != null) { + neededColors--; + if (typeof sc == "number" && sc > maxIndex) { + maxIndex = sc; + } + } + } + + // If any of the series have fixed color indexes, then we need to + // generate at least as many colors as the highest index. + + if (neededColors <= maxIndex) { + neededColors = maxIndex + 1; + } + + // Generate all the colors, using first the option colors and then + // variations on those colors once they're exhausted. + + var c, colors = [], colorPool = options.colors, + colorPoolSize = colorPool.length, variation = 0; + + for (i = 0; i < neededColors; i++) { + + c = $.color.parse(colorPool[i % colorPoolSize] || "#666"); + + // Each time we exhaust the colors in the pool we adjust + // a scaling factor used to produce more variations on + // those colors. The factor alternates negative/positive + // to produce lighter/darker colors. + + // Reset the variation after every few cycles, or else + // it will end up producing only white or black colors. + + if (i % colorPoolSize == 0 && i) { + if (variation >= 0) { + if (variation < 0.5) { + variation = -variation - 0.2; + } else variation = 0; + } else variation = -variation; + } + + colors[i] = c.scale('rgb', 1 + variation); + } + + // Finalize the series options, filling in their colors + + var colori = 0, s; + for (i = 0; i < series.length; ++i) { + s = series[i]; + + // assign colors + if (s.color == null) { + s.color = colors[colori].toString(); + ++colori; + } + else if (typeof s.color == "number") + s.color = colors[s.color].toString(); + + // turn on lines automatically in case nothing is set + if (s.lines.show == null) { + var v, show = true; + for (v in s) + if (s[v] && s[v].show) { + show = false; + break; + } + if (show) + s.lines.show = true; + } + + // If nothing was provided for lines.zero, default it to match + // lines.fill, since areas by default should extend to zero. + + if (s.lines.zero == null) { + s.lines.zero = !!s.lines.fill; + } + + // setup axes + s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, "x")); + s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, "y")); + } + } + + function processData() { + var topSentry = Number.POSITIVE_INFINITY, + bottomSentry = Number.NEGATIVE_INFINITY, + fakeInfinity = Number.MAX_VALUE, + i, j, k, m, length, + s, points, ps, x, y, axis, val, f, p, + data, format; + + function updateAxis(axis, min, max) { + if (min < axis.datamin && min != -fakeInfinity) + axis.datamin = min; + if (max > axis.datamax && max != fakeInfinity) + axis.datamax = max; + } + + $.each(allAxes(), function (_, axis) { + // init axis + axis.datamin = topSentry; + axis.datamax = bottomSentry; + axis.used = false; + }); + + for (i = 0; i < series.length; ++i) { + s = series[i]; + s.datapoints = { points: [] }; + + executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]); + } + + // first pass: clean and copy data + for (i = 0; i < series.length; ++i) { + s = series[i]; + + data = s.data; + format = s.datapoints.format; + + if (!format) { + format = []; + // find out how to copy + format.push({ x: true, number: true, required: true }); + format.push({ y: true, number: true, required: true }); + + if (s.bars.show || (s.lines.show && s.lines.fill)) { + var autoscale = !!((s.bars.show && s.bars.zero) || (s.lines.show && s.lines.zero)); + format.push({ y: true, number: true, required: false, defaultValue: 0, autoscale: autoscale }); + if (s.bars.horizontal) { + delete format[format.length - 1].y; + format[format.length - 1].x = true; + } + } + + s.datapoints.format = format; + } + + if (s.datapoints.pointsize != null) + continue; // already filled in + + s.datapoints.pointsize = format.length; + + ps = s.datapoints.pointsize; + points = s.datapoints.points; + + var insertSteps = s.lines.show && s.lines.steps; + s.xaxis.used = s.yaxis.used = true; + + for (j = k = 0; j < data.length; ++j, k += ps) { + p = data[j]; + + var nullify = p == null; + if (!nullify) { + for (m = 0; m < ps; ++m) { + val = p[m]; + f = format[m]; + + if (f) { + if (f.number && val != null) { + val = +val; // convert to number + if (isNaN(val)) + val = null; + else if (val == Infinity) + val = fakeInfinity; + else if (val == -Infinity) + val = -fakeInfinity; + } + + if (val == null) { + if (f.required) + nullify = true; + + if (f.defaultValue != null) + val = f.defaultValue; + } + } + + points[k + m] = val; + } + } + + if (nullify) { + for (m = 0; m < ps; ++m) { + val = points[k + m]; + if (val != null) { + f = format[m]; + // extract min/max info + if (f.autoscale !== false) { + if (f.x) { + updateAxis(s.xaxis, val, val); + } + if (f.y) { + updateAxis(s.yaxis, val, val); + } + } + } + points[k + m] = null; + } + } + else { + // a little bit of line specific stuff that + // perhaps shouldn't be here, but lacking + // better means... + if (insertSteps && k > 0 + && points[k - ps] != null + && points[k - ps] != points[k] + && points[k - ps + 1] != points[k + 1]) { + // copy the point to make room for a middle point + for (m = 0; m < ps; ++m) + points[k + ps + m] = points[k + m]; + + // middle point has same y + points[k + 1] = points[k - ps + 1]; + + // we've added a point, better reflect that + k += ps; + } + } + } + } + + // give the hooks a chance to run + for (i = 0; i < series.length; ++i) { + s = series[i]; + + executeHooks(hooks.processDatapoints, [ s, s.datapoints]); + } + + // second pass: find datamax/datamin for auto-scaling + for (i = 0; i < series.length; ++i) { + s = series[i]; + points = s.datapoints.points; + ps = s.datapoints.pointsize; + format = s.datapoints.format; + + var xmin = topSentry, ymin = topSentry, + xmax = bottomSentry, ymax = bottomSentry; + + for (j = 0; j < points.length; j += ps) { + if (points[j] == null) + continue; + + for (m = 0; m < ps; ++m) { + val = points[j + m]; + f = format[m]; + if (!f || f.autoscale === false || val == fakeInfinity || val == -fakeInfinity) + continue; + + if (f.x) { + if (val < xmin) + xmin = val; + if (val > xmax) + xmax = val; + } + if (f.y) { + if (val < ymin) + ymin = val; + if (val > ymax) + ymax = val; + } + } + } + + if (s.bars.show) { + // make sure we got room for the bar on the dancing floor + var delta; + + switch (s.bars.align) { + case "left": + delta = 0; + break; + case "right": + delta = -s.bars.barWidth; + break; + default: + delta = -s.bars.barWidth / 2; + } + + if (s.bars.horizontal) { + ymin += delta; + ymax += delta + s.bars.barWidth; + } + else { + xmin += delta; + xmax += delta + s.bars.barWidth; + } + } + + updateAxis(s.xaxis, xmin, xmax); + updateAxis(s.yaxis, ymin, ymax); + } + + $.each(allAxes(), function (_, axis) { + if (axis.datamin == topSentry) + axis.datamin = null; + if (axis.datamax == bottomSentry) + axis.datamax = null; + }); + } + + function setupCanvases() { + + // Make sure the placeholder is clear of everything except canvases + // from a previous plot in this container that we'll try to re-use. + + placeholder.css("padding", 0) // padding messes up the positioning + .children().filter(function(){ + return !$(this).hasClass("flot-overlay") && !$(this).hasClass('flot-base'); + }).remove(); + + if (placeholder.css("position") == 'static') + placeholder.css("position", "relative"); // for positioning labels and overlay + + surface = new Canvas("flot-base", placeholder); + overlay = new Canvas("flot-overlay", placeholder); // overlay canvas for interactive features + + ctx = surface.context; + octx = overlay.context; + + // define which element we're listening for events on + eventHolder = $(overlay.element).unbind(); + + // If we're re-using a plot object, shut down the old one + + var existing = placeholder.data("plot"); + + if (existing) { + existing.shutdown(); + overlay.clear(); + } + + // save in case we get replotted + placeholder.data("plot", plot); + } + + function bindEvents() { + // bind events + if (options.grid.hoverable) { + eventHolder.mousemove(onMouseMove); + + // Use bind, rather than .mouseleave, because we officially + // still support jQuery 1.2.6, which doesn't define a shortcut + // for mouseenter or mouseleave. This was a bug/oversight that + // was fixed somewhere around 1.3.x. We can return to using + // .mouseleave when we drop support for 1.2.6. + + eventHolder.bind("mouseleave", onMouseLeave); + } + + if (options.grid.clickable) + eventHolder.click(onClick); + + executeHooks(hooks.bindEvents, [eventHolder]); + } + + function shutdown() { + if (redrawTimeout) + clearTimeout(redrawTimeout); + + eventHolder.unbind("mousemove", onMouseMove); + eventHolder.unbind("mouseleave", onMouseLeave); + eventHolder.unbind("click", onClick); + + executeHooks(hooks.shutdown, [eventHolder]); + } + + function setTransformationHelpers(axis) { + // set helper functions on the axis, assumes plot area + // has been computed already + + function identity(x) { return x; } + + var s, m, t = axis.options.transform || identity, + it = axis.options.inverseTransform; + + // precompute how much the axis is scaling a point + // in canvas space + if (axis.direction == "x") { + s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min)); + m = Math.min(t(axis.max), t(axis.min)); + } + else { + s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min)); + s = -s; + m = Math.max(t(axis.max), t(axis.min)); + } + + // data point to canvas coordinate + if (t == identity) // slight optimization + axis.p2c = function (p) { return (p - m) * s; }; + else + axis.p2c = function (p) { return (t(p) - m) * s; }; + // canvas coordinate to data point + if (!it) + axis.c2p = function (c) { return m + c / s; }; + else + axis.c2p = function (c) { return it(m + c / s); }; + } + + function measureTickLabels(axis) { + + var opts = axis.options, + ticks = axis.ticks || [], + labelWidth = opts.labelWidth || 0, + labelHeight = opts.labelHeight || 0, + maxWidth = labelWidth || (axis.direction == "x" ? Math.floor(surface.width / (ticks.length || 1)) : null), + legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis", + layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles, + font = opts.font || "flot-tick-label tickLabel"; + + for (var i = 0; i < ticks.length; ++i) { + + var t = ticks[i]; + + if (!t.label) + continue; + + var info = surface.getTextInfo(layer, t.label, font, null, maxWidth); + + labelWidth = Math.max(labelWidth, info.width); + labelHeight = Math.max(labelHeight, info.height); + } + + axis.labelWidth = opts.labelWidth || labelWidth; + axis.labelHeight = opts.labelHeight || labelHeight; + } + + function allocateAxisBoxFirstPhase(axis) { + // find the bounding box of the axis by looking at label + // widths/heights and ticks, make room by diminishing the + // plotOffset; this first phase only looks at one + // dimension per axis, the other dimension depends on the + // other axes so will have to wait + + var lw = axis.labelWidth, + lh = axis.labelHeight, + pos = axis.options.position, + isXAxis = axis.direction === "x", + tickLength = axis.options.tickLength, + axisMargin = options.grid.axisMargin, + padding = options.grid.labelMargin, + innermost = true, + outermost = true, + first = true, + found = false; + + // Determine the axis's position in its direction and on its side + + $.each(isXAxis ? xaxes : yaxes, function(i, a) { + if (a && a.reserveSpace) { + if (a === axis) { + found = true; + } else if (a.options.position === pos) { + if (found) { + outermost = false; + } else { + innermost = false; + } + } + if (!found) { + first = false; + } + } + }); + + // The outermost axis on each side has no margin + + if (outermost) { + axisMargin = 0; + } + + // The ticks for the first axis in each direction stretch across + + if (tickLength == null) { + tickLength = first ? "full" : 5; + } + + if (!isNaN(+tickLength)) + padding += +tickLength; + + if (isXAxis) { + lh += padding; + + if (pos == "bottom") { + plotOffset.bottom += lh + axisMargin; + axis.box = { top: surface.height - plotOffset.bottom, height: lh }; + } + else { + axis.box = { top: plotOffset.top + axisMargin, height: lh }; + plotOffset.top += lh + axisMargin; + } + } + else { + lw += padding; + + if (pos == "left") { + axis.box = { left: plotOffset.left + axisMargin, width: lw }; + plotOffset.left += lw + axisMargin; + } + else { + plotOffset.right += lw + axisMargin; + axis.box = { left: surface.width - plotOffset.right, width: lw }; + } + } + + // save for future reference + axis.position = pos; + axis.tickLength = tickLength; + axis.box.padding = padding; + axis.innermost = innermost; + } + + function allocateAxisBoxSecondPhase(axis) { + // now that all axis boxes have been placed in one + // dimension, we can set the remaining dimension coordinates + if (axis.direction == "x") { + axis.box.left = plotOffset.left - axis.labelWidth / 2; + axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.labelWidth; + } + else { + axis.box.top = plotOffset.top - axis.labelHeight / 2; + axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.labelHeight; + } + } + + function adjustLayoutForThingsStickingOut() { + // possibly adjust plot offset to ensure everything stays + // inside the canvas and isn't clipped off + + var minMargin = options.grid.minBorderMargin, + axis, i; + + // check stuff from the plot (FIXME: this should just read + // a value from the series, otherwise it's impossible to + // customize) + if (minMargin == null) { + minMargin = 0; + for (i = 0; i < series.length; ++i) + minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth/2)); + } + + var margins = { + left: minMargin, + right: minMargin, + top: minMargin, + bottom: minMargin + }; + + // check axis labels, note we don't check the actual + // labels but instead use the overall width/height to not + // jump as much around with replots + $.each(allAxes(), function (_, axis) { + if (axis.reserveSpace && axis.ticks && axis.ticks.length) { + var lastTick = axis.ticks[axis.ticks.length - 1]; + if (axis.direction === "x") { + margins.left = Math.max(margins.left, axis.labelWidth / 2); + if (lastTick.v <= axis.max) { + margins.right = Math.max(margins.right, axis.labelWidth / 2); + } + } else { + margins.bottom = Math.max(margins.bottom, axis.labelHeight / 2); + if (lastTick.v <= axis.max) { + margins.top = Math.max(margins.top, axis.labelHeight / 2); + } + } + } + }); + + plotOffset.left = Math.ceil(Math.max(margins.left, plotOffset.left)); + plotOffset.right = Math.ceil(Math.max(margins.right, plotOffset.right)); + plotOffset.top = Math.ceil(Math.max(margins.top, plotOffset.top)); + plotOffset.bottom = Math.ceil(Math.max(margins.bottom, plotOffset.bottom)); + } + + function setupGrid() { + var i, axes = allAxes(), showGrid = options.grid.show; + + // Initialize the plot's offset from the edge of the canvas + + for (var a in plotOffset) { + var margin = options.grid.margin || 0; + plotOffset[a] = typeof margin == "number" ? margin : margin[a] || 0; + } + + executeHooks(hooks.processOffset, [plotOffset]); + + // If the grid is visible, add its border width to the offset + + for (var a in plotOffset) { + if(typeof(options.grid.borderWidth) == "object") { + plotOffset[a] += showGrid ? options.grid.borderWidth[a] : 0; + } + else { + plotOffset[a] += showGrid ? options.grid.borderWidth : 0; + } + } + + // init axes + $.each(axes, function (_, axis) { + axis.show = axis.options.show; + if (axis.show == null) + axis.show = axis.used; // by default an axis is visible if it's got data + + axis.reserveSpace = axis.show || axis.options.reserveSpace; + + setRange(axis); + }); + + if (showGrid) { + + var allocatedAxes = $.grep(axes, function (axis) { return axis.reserveSpace; }); + + $.each(allocatedAxes, function (_, axis) { + // make the ticks + setupTickGeneration(axis); + setTicks(axis); + snapRangeToTicks(axis, axis.ticks); + // find labelWidth/Height for axis + measureTickLabels(axis); + }); + + // with all dimensions calculated, we can compute the + // axis bounding boxes, start from the outside + // (reverse order) + for (i = allocatedAxes.length - 1; i >= 0; --i) + allocateAxisBoxFirstPhase(allocatedAxes[i]); + + // make sure we've got enough space for things that + // might stick out + adjustLayoutForThingsStickingOut(); + + $.each(allocatedAxes, function (_, axis) { + allocateAxisBoxSecondPhase(axis); + }); + } + + plotWidth = surface.width - plotOffset.left - plotOffset.right; + plotHeight = surface.height - plotOffset.bottom - plotOffset.top; + + // now we got the proper plot dimensions, we can compute the scaling + $.each(axes, function (_, axis) { + setTransformationHelpers(axis); + }); + + if (showGrid) { + drawAxisLabels(); + } + + insertLegend(); + } + + function setRange(axis) { + var opts = axis.options, + min = +(opts.min != null ? opts.min : axis.datamin), + max = +(opts.max != null ? opts.max : axis.datamax), + delta = max - min; + + if (delta == 0.0) { + // degenerate case + var widen = max == 0 ? 1 : 0.01; + + if (opts.min == null) + min -= widen; + // always widen max if we couldn't widen min to ensure we + // don't fall into min == max which doesn't work + if (opts.max == null || opts.min != null) + max += widen; + } + else { + // consider autoscaling + var margin = opts.autoscaleMargin; + if (margin != null) { + if (opts.min == null) { + min -= delta * margin; + // make sure we don't go below zero if all values + // are positive + if (min < 0 && axis.datamin != null && axis.datamin >= 0) + min = 0; + } + if (opts.max == null) { + max += delta * margin; + if (max > 0 && axis.datamax != null && axis.datamax <= 0) + max = 0; + } + } + } + axis.min = min; + axis.max = max; + } + + function setupTickGeneration(axis) { + var opts = axis.options; + + // estimate number of ticks + var noTicks; + if (typeof opts.ticks == "number" && opts.ticks > 0) + noTicks = opts.ticks; + else + // heuristic based on the model a*sqrt(x) fitted to + // some data points that seemed reasonable + noTicks = 0.3 * Math.sqrt(axis.direction == "x" ? surface.width : surface.height); + + var delta = (axis.max - axis.min) / noTicks, + dec = -Math.floor(Math.log(delta) / Math.LN10), + maxDec = opts.tickDecimals; + + if (maxDec != null && dec > maxDec) { + dec = maxDec; + } + + var magn = Math.pow(10, -dec), + norm = delta / magn, // norm is between 1.0 and 10.0 + size; + + if (norm < 1.5) { + size = 1; + } else if (norm < 3) { + size = 2; + // special case for 2.5, requires an extra decimal + if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) { + size = 2.5; + ++dec; + } + } else if (norm < 7.5) { + size = 5; + } else { + size = 10; + } + + size *= magn; + + if (opts.minTickSize != null && size < opts.minTickSize) { + size = opts.minTickSize; + } + + axis.delta = delta; + axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec); + axis.tickSize = opts.tickSize || size; + + // Time mode was moved to a plug-in in 0.8, but since so many people use this + // we'll add an especially friendly make sure they remembered to include it. + + if (opts.mode == "time" && !axis.tickGenerator) { + throw new Error("Time mode requires the flot.time plugin."); + } + + // Flot supports base-10 axes; any other mode else is handled by a plug-in, + // like flot.time.js. + + if (!axis.tickGenerator) { + + axis.tickGenerator = function (axis) { + + var ticks = [], + start = floorInBase(axis.min, axis.tickSize), + i = 0, + v = Number.NaN, + prev; + + do { + prev = v; + v = start + i * axis.tickSize; + ticks.push(v); + ++i; + } while (v < axis.max && v != prev); + return ticks; + }; + + axis.tickFormatter = function (value, axis) { + + var factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1; + var formatted = "" + Math.round(value * factor) / factor; + + // If tickDecimals was specified, ensure that we have exactly that + // much precision; otherwise default to the value's own precision. + + if (axis.tickDecimals != null) { + var decimal = formatted.indexOf("."); + var precision = decimal == -1 ? 0 : formatted.length - decimal - 1; + if (precision < axis.tickDecimals) { + return (precision ? formatted : formatted + ".") + ("" + factor).substr(1, axis.tickDecimals - precision); + } + } + + return formatted; + }; + } + + if ($.isFunction(opts.tickFormatter)) + axis.tickFormatter = function (v, axis) { return "" + opts.tickFormatter(v, axis); }; + + if (opts.alignTicksWithAxis != null) { + var otherAxis = (axis.direction == "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1]; + if (otherAxis && otherAxis.used && otherAxis != axis) { + // consider snapping min/max to outermost nice ticks + var niceTicks = axis.tickGenerator(axis); + if (niceTicks.length > 0) { + if (opts.min == null) + axis.min = Math.min(axis.min, niceTicks[0]); + if (opts.max == null && niceTicks.length > 1) + axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]); + } + + axis.tickGenerator = function (axis) { + // copy ticks, scaled to this axis + var ticks = [], v, i; + for (i = 0; i < otherAxis.ticks.length; ++i) { + v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min); + v = axis.min + v * (axis.max - axis.min); + ticks.push(v); + } + return ticks; + }; + + // we might need an extra decimal since forced + // ticks don't necessarily fit naturally + if (!axis.mode && opts.tickDecimals == null) { + var extraDec = Math.max(0, -Math.floor(Math.log(axis.delta) / Math.LN10) + 1), + ts = axis.tickGenerator(axis); + + // only proceed if the tick interval rounded + // with an extra decimal doesn't give us a + // zero at end + if (!(ts.length > 1 && /\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec)))) + axis.tickDecimals = extraDec; + } + } + } + } + + function setTicks(axis) { + var oticks = axis.options.ticks, ticks = []; + if (oticks == null || (typeof oticks == "number" && oticks > 0)) + ticks = axis.tickGenerator(axis); + else if (oticks) { + if ($.isFunction(oticks)) + // generate the ticks + ticks = oticks(axis); + else + ticks = oticks; + } + + // clean up/labelify the supplied ticks, copy them over + var i, v; + axis.ticks = []; + for (i = 0; i < ticks.length; ++i) { + var label = null; + var t = ticks[i]; + if (typeof t == "object") { + v = +t[0]; + if (t.length > 1) + label = t[1]; + } + else + v = +t; + if (label == null) + label = axis.tickFormatter(v, axis); + if (!isNaN(v)) + axis.ticks.push({ v: v, label: label }); + } + } + + function snapRangeToTicks(axis, ticks) { + if (axis.options.autoscaleMargin && ticks.length > 0) { + // snap to ticks + if (axis.options.min == null) + axis.min = Math.min(axis.min, ticks[0].v); + if (axis.options.max == null && ticks.length > 1) + axis.max = Math.max(axis.max, ticks[ticks.length - 1].v); + } + } + + function draw() { + + surface.clear(); + + executeHooks(hooks.drawBackground, [ctx]); + + var grid = options.grid; + + // draw background, if any + if (grid.show && grid.backgroundColor) + drawBackground(); + + if (grid.show && !grid.aboveData) { + drawGrid(); + } + + for (var i = 0; i < series.length; ++i) { + executeHooks(hooks.drawSeries, [ctx, series[i]]); + drawSeries(series[i]); + } + + executeHooks(hooks.draw, [ctx]); + + if (grid.show && grid.aboveData) { + drawGrid(); + } + + surface.render(); + + // A draw implies that either the axes or data have changed, so we + // should probably update the overlay highlights as well. + + triggerRedrawOverlay(); + } + + function extractRange(ranges, coord) { + var axis, from, to, key, axes = allAxes(); + + for (var i = 0; i < axes.length; ++i) { + axis = axes[i]; + if (axis.direction == coord) { + key = coord + axis.n + "axis"; + if (!ranges[key] && axis.n == 1) + key = coord + "axis"; // support x1axis as xaxis + if (ranges[key]) { + from = ranges[key].from; + to = ranges[key].to; + break; + } + } + } + + // backwards-compat stuff - to be removed in future + if (!ranges[key]) { + axis = coord == "x" ? xaxes[0] : yaxes[0]; + from = ranges[coord + "1"]; + to = ranges[coord + "2"]; + } + + // auto-reverse as an added bonus + if (from != null && to != null && from > to) { + var tmp = from; + from = to; + to = tmp; + } + + return { from: from, to: to, axis: axis }; + } + + function drawBackground() { + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)"); + ctx.fillRect(0, 0, plotWidth, plotHeight); + ctx.restore(); + } + + function drawGrid() { + var i, axes, bw, bc; + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + // draw markings + var markings = options.grid.markings; + if (markings) { + if ($.isFunction(markings)) { + axes = plot.getAxes(); + // xmin etc. is backwards compatibility, to be + // removed in the future + axes.xmin = axes.xaxis.min; + axes.xmax = axes.xaxis.max; + axes.ymin = axes.yaxis.min; + axes.ymax = axes.yaxis.max; + + markings = markings(axes); + } + + for (i = 0; i < markings.length; ++i) { + var m = markings[i], + xrange = extractRange(m, "x"), + yrange = extractRange(m, "y"); + + // fill in missing + if (xrange.from == null) + xrange.from = xrange.axis.min; + if (xrange.to == null) + xrange.to = xrange.axis.max; + if (yrange.from == null) + yrange.from = yrange.axis.min; + if (yrange.to == null) + yrange.to = yrange.axis.max; + + // clip + if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max || + yrange.to < yrange.axis.min || yrange.from > yrange.axis.max) + continue; + + xrange.from = Math.max(xrange.from, xrange.axis.min); + xrange.to = Math.min(xrange.to, xrange.axis.max); + yrange.from = Math.max(yrange.from, yrange.axis.min); + yrange.to = Math.min(yrange.to, yrange.axis.max); + + if (xrange.from == xrange.to && yrange.from == yrange.to) + continue; + + // then draw + xrange.from = xrange.axis.p2c(xrange.from); + xrange.to = xrange.axis.p2c(xrange.to); + yrange.from = yrange.axis.p2c(yrange.from); + yrange.to = yrange.axis.p2c(yrange.to); + + if (xrange.from == xrange.to || yrange.from == yrange.to) { + // draw line + ctx.beginPath(); + ctx.strokeStyle = m.color || options.grid.markingsColor; + ctx.lineWidth = m.lineWidth || options.grid.markingsLineWidth; + ctx.moveTo(xrange.from, yrange.from); + ctx.lineTo(xrange.to, yrange.to); + ctx.stroke(); + } + else { + // fill area + ctx.fillStyle = m.color || options.grid.markingsColor; + ctx.fillRect(xrange.from, yrange.to, + xrange.to - xrange.from, + yrange.from - yrange.to); + } + } + } + + // draw the ticks + axes = allAxes(); + bw = options.grid.borderWidth; + + for (var j = 0; j < axes.length; ++j) { + var axis = axes[j], box = axis.box, + t = axis.tickLength, x, y, xoff, yoff; + if (!axis.show || axis.ticks.length == 0) + continue; + + ctx.lineWidth = 1; + + // find the edges + if (axis.direction == "x") { + x = 0; + if (t == "full") + y = (axis.position == "top" ? 0 : plotHeight); + else + y = box.top - plotOffset.top + (axis.position == "top" ? box.height : 0); + } + else { + y = 0; + if (t == "full") + x = (axis.position == "left" ? 0 : plotWidth); + else + x = box.left - plotOffset.left + (axis.position == "left" ? box.width : 0); + } + + // draw tick bar + if (!axis.innermost) { + ctx.strokeStyle = axis.options.color; + ctx.beginPath(); + xoff = yoff = 0; + if (axis.direction == "x") + xoff = plotWidth + 1; + else + yoff = plotHeight + 1; + + if (ctx.lineWidth == 1) { + if (axis.direction == "x") { + y = Math.floor(y) + 0.5; + } else { + x = Math.floor(x) + 0.5; + } + } + + ctx.moveTo(x, y); + ctx.lineTo(x + xoff, y + yoff); + ctx.stroke(); + } + + // draw ticks + + ctx.strokeStyle = axis.options.tickColor; + + ctx.beginPath(); + for (i = 0; i < axis.ticks.length; ++i) { + var v = axis.ticks[i].v; + + xoff = yoff = 0; + + if (isNaN(v) || v < axis.min || v > axis.max + // skip those lying on the axes if we got a border + || (t == "full" + && ((typeof bw == "object" && bw[axis.position] > 0) || bw > 0) + && (v == axis.min || v == axis.max))) + continue; + + if (axis.direction == "x") { + x = axis.p2c(v); + yoff = t == "full" ? -plotHeight : t; + + if (axis.position == "top") + yoff = -yoff; + } + else { + y = axis.p2c(v); + xoff = t == "full" ? -plotWidth : t; + + if (axis.position == "left") + xoff = -xoff; + } + + if (ctx.lineWidth == 1) { + if (axis.direction == "x") + x = Math.floor(x) + 0.5; + else + y = Math.floor(y) + 0.5; + } + + ctx.moveTo(x, y); + ctx.lineTo(x + xoff, y + yoff); + } + + ctx.stroke(); + } + + + // draw border + if (bw) { + // If either borderWidth or borderColor is an object, then draw the border + // line by line instead of as one rectangle + bc = options.grid.borderColor; + if(typeof bw == "object" || typeof bc == "object") { + if (typeof bw !== "object") { + bw = {top: bw, right: bw, bottom: bw, left: bw}; + } + if (typeof bc !== "object") { + bc = {top: bc, right: bc, bottom: bc, left: bc}; + } + + if (bw.top > 0) { + ctx.strokeStyle = bc.top; + ctx.lineWidth = bw.top; + ctx.beginPath(); + ctx.moveTo(0 - bw.left, 0 - bw.top/2); + ctx.lineTo(plotWidth, 0 - bw.top/2); + ctx.stroke(); + } + + if (bw.right > 0) { + ctx.strokeStyle = bc.right; + ctx.lineWidth = bw.right; + ctx.beginPath(); + ctx.moveTo(plotWidth + bw.right / 2, 0 - bw.top); + ctx.lineTo(plotWidth + bw.right / 2, plotHeight); + ctx.stroke(); + } + + if (bw.bottom > 0) { + ctx.strokeStyle = bc.bottom; + ctx.lineWidth = bw.bottom; + ctx.beginPath(); + ctx.moveTo(plotWidth + bw.right, plotHeight + bw.bottom / 2); + ctx.lineTo(0, plotHeight + bw.bottom / 2); + ctx.stroke(); + } + + if (bw.left > 0) { + ctx.strokeStyle = bc.left; + ctx.lineWidth = bw.left; + ctx.beginPath(); + ctx.moveTo(0 - bw.left/2, plotHeight + bw.bottom); + ctx.lineTo(0- bw.left/2, 0); + ctx.stroke(); + } + } + else { + ctx.lineWidth = bw; + ctx.strokeStyle = options.grid.borderColor; + ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw); + } + } + + ctx.restore(); + } + + function drawAxisLabels() { + + $.each(allAxes(), function (_, axis) { + var box = axis.box, + legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis", + layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles, + font = axis.options.font || "flot-tick-label tickLabel", + tick, x, y, halign, valign; + + // Remove text before checking for axis.show and ticks.length; + // otherwise plugins, like flot-tickrotor, that draw their own + // tick labels will end up with both theirs and the defaults. + + surface.removeText(layer); + + if (!axis.show || axis.ticks.length == 0) + return; + + for (var i = 0; i < axis.ticks.length; ++i) { + + tick = axis.ticks[i]; + if (!tick.label || tick.v < axis.min || tick.v > axis.max) + continue; + + if (axis.direction == "x") { + halign = "center"; + x = plotOffset.left + axis.p2c(tick.v); + if (axis.position == "bottom") { + y = box.top + box.padding; + } else { + y = box.top + box.height - box.padding; + valign = "bottom"; + } + } else { + valign = "middle"; + y = plotOffset.top + axis.p2c(tick.v); + if (axis.position == "left") { + x = box.left + box.width - box.padding; + halign = "right"; + } else { + x = box.left + box.padding; + } + } + + surface.addText(layer, x, y, tick.label, font, null, null, halign, valign); + } + }); + } + + function drawSeries(series) { + if (series.lines.show) + drawSeriesLines(series); + if (series.bars.show) + drawSeriesBars(series); + if (series.points.show) + drawSeriesPoints(series); + } + + function drawSeriesLines(series) { + function plotLine(datapoints, xoffset, yoffset, axisx, axisy) { + var points = datapoints.points, + ps = datapoints.pointsize, + prevx = null, prevy = null; + + ctx.beginPath(); + for (var i = ps; i < points.length; i += ps) { + var x1 = points[i - ps], y1 = points[i - ps + 1], + x2 = points[i], y2 = points[i + 1]; + + if (x1 == null || x2 == null) + continue; + + // clip with ymin + if (y1 <= y2 && y1 < axisy.min) { + if (y2 < axisy.min) + continue; // line segment is outside + // compute new intersection point + x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.min; + } + else if (y2 <= y1 && y2 < axisy.min) { + if (y1 < axisy.min) + continue; + x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.min; + } + + // clip with ymax + if (y1 >= y2 && y1 > axisy.max) { + if (y2 > axisy.max) + continue; + x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.max; + } + else if (y2 >= y1 && y2 > axisy.max) { + if (y1 > axisy.max) + continue; + x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.max; + } + + // clip with xmin + if (x1 <= x2 && x1 < axisx.min) { + if (x2 < axisx.min) + continue; + y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.min; + } + else if (x2 <= x1 && x2 < axisx.min) { + if (x1 < axisx.min) + continue; + y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.min; + } + + // clip with xmax + if (x1 >= x2 && x1 > axisx.max) { + if (x2 > axisx.max) + continue; + y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.max; + } + else if (x2 >= x1 && x2 > axisx.max) { + if (x1 > axisx.max) + continue; + y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.max; + } + + if (x1 != prevx || y1 != prevy) + ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset); + + prevx = x2; + prevy = y2; + ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset); + } + ctx.stroke(); + } + + function plotLineArea(datapoints, axisx, axisy) { + var points = datapoints.points, + ps = datapoints.pointsize, + bottom = Math.min(Math.max(0, axisy.min), axisy.max), + i = 0, top, areaOpen = false, + ypos = 1, segmentStart = 0, segmentEnd = 0; + + // we process each segment in two turns, first forward + // direction to sketch out top, then once we hit the + // end we go backwards to sketch the bottom + while (true) { + if (ps > 0 && i > points.length + ps) + break; + + i += ps; // ps is negative if going backwards + + var x1 = points[i - ps], + y1 = points[i - ps + ypos], + x2 = points[i], y2 = points[i + ypos]; + + if (areaOpen) { + if (ps > 0 && x1 != null && x2 == null) { + // at turning point + segmentEnd = i; + ps = -ps; + ypos = 2; + continue; + } + + if (ps < 0 && i == segmentStart + ps) { + // done with the reverse sweep + ctx.fill(); + areaOpen = false; + ps = -ps; + ypos = 1; + i = segmentStart = segmentEnd + ps; + continue; + } + } + + if (x1 == null || x2 == null) + continue; + + // clip x values + + // clip with xmin + if (x1 <= x2 && x1 < axisx.min) { + if (x2 < axisx.min) + continue; + y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.min; + } + else if (x2 <= x1 && x2 < axisx.min) { + if (x1 < axisx.min) + continue; + y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.min; + } + + // clip with xmax + if (x1 >= x2 && x1 > axisx.max) { + if (x2 > axisx.max) + continue; + y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.max; + } + else if (x2 >= x1 && x2 > axisx.max) { + if (x1 > axisx.max) + continue; + y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.max; + } + + if (!areaOpen) { + // open area + ctx.beginPath(); + ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom)); + areaOpen = true; + } + + // now first check the case where both is outside + if (y1 >= axisy.max && y2 >= axisy.max) { + ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max)); + continue; + } + else if (y1 <= axisy.min && y2 <= axisy.min) { + ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min)); + continue; + } + + // else it's a bit more complicated, there might + // be a flat maxed out rectangle first, then a + // triangular cutout or reverse; to find these + // keep track of the current x values + var x1old = x1, x2old = x2; + + // clip the y values, without shortcutting, we + // go through all cases in turn + + // clip with ymin + if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) { + x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.min; + } + else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) { + x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.min; + } + + // clip with ymax + if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) { + x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.max; + } + else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) { + x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.max; + } + + // if the x value was changed we got a rectangle + // to fill + if (x1 != x1old) { + ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1)); + // it goes to (x1, y1), but we fill that below + } + + // fill triangular section, this sometimes result + // in redundant points if (x1, y1) hasn't changed + // from previous line to, but we just ignore that + ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); + + // fill the other rectangle if it's there + if (x2 != x2old) { + ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); + ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2)); + } + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + ctx.lineJoin = "round"; + + var lw = series.lines.lineWidth, + sw = series.shadowSize; + // FIXME: consider another form of shadow when filling is turned on + if (lw > 0 && sw > 0) { + // draw shadow as a thick and thin line with transparency + ctx.lineWidth = sw; + ctx.strokeStyle = "rgba(0,0,0,0.1)"; + // position shadow at angle from the mid of line + var angle = Math.PI/18; + plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis); + ctx.lineWidth = sw/2; + plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis); + } + + ctx.lineWidth = lw; + ctx.strokeStyle = series.color; + var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight); + if (fillStyle) { + ctx.fillStyle = fillStyle; + plotLineArea(series.datapoints, series.xaxis, series.yaxis); + } + + if (lw > 0) + plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis); + ctx.restore(); + } + + function drawSeriesPoints(series) { + function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) { + var points = datapoints.points, ps = datapoints.pointsize; + + for (var i = 0; i < points.length; i += ps) { + var x = points[i], y = points[i + 1]; + if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) + continue; + + ctx.beginPath(); + x = axisx.p2c(x); + y = axisy.p2c(y) + offset; + if (symbol == "circle") + ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false); + else + symbol(ctx, x, y, radius, shadow); + ctx.closePath(); + + if (fillStyle) { + ctx.fillStyle = fillStyle; + ctx.fill(); + } + ctx.stroke(); + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + var lw = series.points.lineWidth, + sw = series.shadowSize, + radius = series.points.radius, + symbol = series.points.symbol; + + // If the user sets the line width to 0, we change it to a very + // small value. A line width of 0 seems to force the default of 1. + // Doing the conditional here allows the shadow setting to still be + // optional even with a lineWidth of 0. + + if( lw == 0 ) + lw = 0.0001; + + if (lw > 0 && sw > 0) { + // draw shadow in two steps + var w = sw / 2; + ctx.lineWidth = w; + ctx.strokeStyle = "rgba(0,0,0,0.1)"; + plotPoints(series.datapoints, radius, null, w + w/2, true, + series.xaxis, series.yaxis, symbol); + + ctx.strokeStyle = "rgba(0,0,0,0.2)"; + plotPoints(series.datapoints, radius, null, w/2, true, + series.xaxis, series.yaxis, symbol); + } + + ctx.lineWidth = lw; + ctx.strokeStyle = series.color; + plotPoints(series.datapoints, radius, + getFillStyle(series.points, series.color), 0, false, + series.xaxis, series.yaxis, symbol); + ctx.restore(); + } + + function drawBar(x, y, b, barLeft, barRight, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) { + var left, right, bottom, top, + drawLeft, drawRight, drawTop, drawBottom, + tmp; + + // in horizontal mode, we start the bar from the left + // instead of from the bottom so it appears to be + // horizontal rather than vertical + if (horizontal) { + drawBottom = drawRight = drawTop = true; + drawLeft = false; + left = b; + right = x; + top = y + barLeft; + bottom = y + barRight; + + // account for negative bars + if (right < left) { + tmp = right; + right = left; + left = tmp; + drawLeft = true; + drawRight = false; + } + } + else { + drawLeft = drawRight = drawTop = true; + drawBottom = false; + left = x + barLeft; + right = x + barRight; + bottom = b; + top = y; + + // account for negative bars + if (top < bottom) { + tmp = top; + top = bottom; + bottom = tmp; + drawBottom = true; + drawTop = false; + } + } + + // clip + if (right < axisx.min || left > axisx.max || + top < axisy.min || bottom > axisy.max) + return; + + if (left < axisx.min) { + left = axisx.min; + drawLeft = false; + } + + if (right > axisx.max) { + right = axisx.max; + drawRight = false; + } + + if (bottom < axisy.min) { + bottom = axisy.min; + drawBottom = false; + } + + if (top > axisy.max) { + top = axisy.max; + drawTop = false; + } + + left = axisx.p2c(left); + bottom = axisy.p2c(bottom); + right = axisx.p2c(right); + top = axisy.p2c(top); + + // fill the bar + if (fillStyleCallback) { + c.fillStyle = fillStyleCallback(bottom, top); + c.fillRect(left, top, right - left, bottom - top) + } + + // draw outline + if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) { + c.beginPath(); + + // FIXME: inline moveTo is buggy with excanvas + c.moveTo(left, bottom); + if (drawLeft) + c.lineTo(left, top); + else + c.moveTo(left, top); + if (drawTop) + c.lineTo(right, top); + else + c.moveTo(right, top); + if (drawRight) + c.lineTo(right, bottom); + else + c.moveTo(right, bottom); + if (drawBottom) + c.lineTo(left, bottom); + else + c.moveTo(left, bottom); + c.stroke(); + } + } + + function drawSeriesBars(series) { + function plotBars(datapoints, barLeft, barRight, fillStyleCallback, axisx, axisy) { + var points = datapoints.points, ps = datapoints.pointsize; + + for (var i = 0; i < points.length; i += ps) { + if (points[i] == null) + continue; + drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth); + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + // FIXME: figure out a way to add shadows (for instance along the right edge) + ctx.lineWidth = series.bars.lineWidth; + ctx.strokeStyle = series.color; + + var barLeft; + + switch (series.bars.align) { + case "left": + barLeft = 0; + break; + case "right": + barLeft = -series.bars.barWidth; + break; + default: + barLeft = -series.bars.barWidth / 2; + } + + var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null; + plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, fillStyleCallback, series.xaxis, series.yaxis); + ctx.restore(); + } + + function getFillStyle(filloptions, seriesColor, bottom, top) { + var fill = filloptions.fill; + if (!fill) + return null; + + if (filloptions.fillColor) + return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor); + + var c = $.color.parse(seriesColor); + c.a = typeof fill == "number" ? fill : 0.4; + c.normalize(); + return c.toString(); + } + + function insertLegend() { + + if (options.legend.container != null) { + $(options.legend.container).html(""); + } else { + placeholder.find(".legend").remove(); + } + + if (!options.legend.show) { + return; + } + + var fragments = [], entries = [], rowStarted = false, + lf = options.legend.labelFormatter, s, label; + + // Build a list of legend entries, with each having a label and a color + + for (var i = 0; i < series.length; ++i) { + s = series[i]; + if (s.label) { + label = lf ? lf(s.label, s) : s.label; + if (label) { + entries.push({ + label: label, + color: s.color + }); + } + } + } + + // Sort the legend using either the default or a custom comparator + + if (options.legend.sorted) { + if ($.isFunction(options.legend.sorted)) { + entries.sort(options.legend.sorted); + } else if (options.legend.sorted == "reverse") { + entries.reverse(); + } else { + var ascending = options.legend.sorted != "descending"; + entries.sort(function(a, b) { + return a.label == b.label ? 0 : ( + (a.label < b.label) != ascending ? 1 : -1 // Logical XOR + ); + }); + } + } + + // Generate markup for the list of entries, in their final order + + for (var i = 0; i < entries.length; ++i) { + + var entry = entries[i]; + + if (i % options.legend.noColumns == 0) { + if (rowStarted) + fragments.push('</tr>'); + fragments.push('<tr>'); + rowStarted = true; + } + + fragments.push( + '<td class="legendColorBox"><div style="border:1px solid ' + options.legend.labelBoxBorderColor + ';padding:1px"><div style="width:4px;height:0;border:5px solid ' + entry.color + ';overflow:hidden"></div></div></td>' + + '<td class="legendLabel">' + entry.label + '</td>' + ); + } + + if (rowStarted) + fragments.push('</tr>'); + + if (fragments.length == 0) + return; + + var table = '<table style="font-size:smaller;color:' + options.grid.color + '">' + fragments.join("") + '</table>'; + if (options.legend.container != null) + $(options.legend.container).html(table); + else { + var pos = "", + p = options.legend.position, + m = options.legend.margin; + if (m[0] == null) + m = [m, m]; + if (p.charAt(0) == "n") + pos += 'top:' + (m[1] + plotOffset.top) + 'px;'; + else if (p.charAt(0) == "s") + pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;'; + if (p.charAt(1) == "e") + pos += 'right:' + (m[0] + plotOffset.right) + 'px;'; + else if (p.charAt(1) == "w") + pos += 'left:' + (m[0] + plotOffset.left) + 'px;'; + var legend = $('<div class="legend">' + table.replace('style="', 'style="position:absolute;' + pos +';') + '</div>').appendTo(placeholder); + if (options.legend.backgroundOpacity != 0.0) { + // put in the transparent background + // separately to avoid blended labels and + // label boxes + var c = options.legend.backgroundColor; + if (c == null) { + c = options.grid.backgroundColor; + if (c && typeof c == "string") + c = $.color.parse(c); + else + c = $.color.extract(legend, 'background-color'); + c.a = 1; + c = c.toString(); + } + var div = legend.children(); + $('<div style="position:absolute;width:' + div.width() + 'px;height:' + div.height() + 'px;' + pos +'background-color:' + c + ';"> </div>').prependTo(legend).css('opacity', options.legend.backgroundOpacity); + } + } + } + + + // interactive features + + var highlights = [], + redrawTimeout = null; + + // returns the data item the mouse is over, or null if none is found + function findNearbyItem(mouseX, mouseY, seriesFilter) { + var maxDistance = options.grid.mouseActiveRadius, + smallestDistance = maxDistance * maxDistance + 1, + item = null, foundPoint = false, i, j, ps; + + for (i = series.length - 1; i >= 0; --i) { + if (!seriesFilter(series[i])) + continue; + + var s = series[i], + axisx = s.xaxis, + axisy = s.yaxis, + points = s.datapoints.points, + mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster + my = axisy.c2p(mouseY), + maxx = maxDistance / axisx.scale, + maxy = maxDistance / axisy.scale; + + ps = s.datapoints.pointsize; + // with inverse transforms, we can't use the maxx/maxy + // optimization, sadly + if (axisx.options.inverseTransform) + maxx = Number.MAX_VALUE; + if (axisy.options.inverseTransform) + maxy = Number.MAX_VALUE; + + if (s.lines.show || s.points.show) { + for (j = 0; j < points.length; j += ps) { + var x = points[j], y = points[j + 1]; + if (x == null) + continue; + + // For points and lines, the cursor must be within a + // certain distance to the data point + if (x - mx > maxx || x - mx < -maxx || + y - my > maxy || y - my < -maxy) + continue; + + // We have to calculate distances in pixels, not in + // data units, because the scales of the axes may be different + var dx = Math.abs(axisx.p2c(x) - mouseX), + dy = Math.abs(axisy.p2c(y) - mouseY), + dist = dx * dx + dy * dy; // we save the sqrt + + // use <= to ensure last point takes precedence + // (last generally means on top of) + if (dist < smallestDistance) { + smallestDistance = dist; + item = [i, j / ps]; + } + } + } + + if (s.bars.show && !item) { // no other point can be nearby + + var barLeft, barRight; + + switch (s.bars.align) { + case "left": + barLeft = 0; + break; + case "right": + barLeft = -s.bars.barWidth; + break; + default: + barLeft = -s.bars.barWidth / 2; + } + + barRight = barLeft + s.bars.barWidth; + + for (j = 0; j < points.length; j += ps) { + var x = points[j], y = points[j + 1], b = points[j + 2]; + if (x == null) + continue; + + // for a bar graph, the cursor must be inside the bar + if (series[i].bars.horizontal ? + (mx <= Math.max(b, x) && mx >= Math.min(b, x) && + my >= y + barLeft && my <= y + barRight) : + (mx >= x + barLeft && mx <= x + barRight && + my >= Math.min(b, y) && my <= Math.max(b, y))) + item = [i, j / ps]; + } + } + } + + if (item) { + i = item[0]; + j = item[1]; + ps = series[i].datapoints.pointsize; + + return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps), + dataIndex: j, + series: series[i], + seriesIndex: i }; + } + + return null; + } + + function onMouseMove(e) { + if (options.grid.hoverable) + triggerClickHoverEvent("plothover", e, + function (s) { return s["hoverable"] != false; }); + } + + function onMouseLeave(e) { + if (options.grid.hoverable) + triggerClickHoverEvent("plothover", e, + function (s) { return false; }); + } + + function onClick(e) { + triggerClickHoverEvent("plotclick", e, + function (s) { return s["clickable"] != false; }); + } + + // trigger click or hover event (they send the same parameters + // so we share their code) + function triggerClickHoverEvent(eventname, event, seriesFilter) { + var offset = eventHolder.offset(), + canvasX = event.pageX - offset.left - plotOffset.left, + canvasY = event.pageY - offset.top - plotOffset.top, + pos = canvasToAxisCoords({ left: canvasX, top: canvasY }); + + pos.pageX = event.pageX; + pos.pageY = event.pageY; + + var item = findNearbyItem(canvasX, canvasY, seriesFilter); + + if (item) { + // fill in mouse pos for any listeners out there + item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left, 10); + item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top, 10); + } + + if (options.grid.autoHighlight) { + // clear auto-highlights + for (var i = 0; i < highlights.length; ++i) { + var h = highlights[i]; + if (h.auto == eventname && + !(item && h.series == item.series && + h.point[0] == item.datapoint[0] && + h.point[1] == item.datapoint[1])) + unhighlight(h.series, h.point); + } + + if (item) + highlight(item.series, item.datapoint, eventname); + } + + placeholder.trigger(eventname, [ pos, item ]); + } + + function triggerRedrawOverlay() { + var t = options.interaction.redrawOverlayInterval; + if (t == -1) { // skip event queue + drawOverlay(); + return; + } + + if (!redrawTimeout) + redrawTimeout = setTimeout(drawOverlay, t); + } + + function drawOverlay() { + redrawTimeout = null; + + // draw highlights + octx.save(); + overlay.clear(); + octx.translate(plotOffset.left, plotOffset.top); + + var i, hi; + for (i = 0; i < highlights.length; ++i) { + hi = highlights[i]; + + if (hi.series.bars.show) + drawBarHighlight(hi.series, hi.point); + else + drawPointHighlight(hi.series, hi.point); + } + octx.restore(); + + executeHooks(hooks.drawOverlay, [octx]); + } + + function highlight(s, point, auto) { + if (typeof s == "number") + s = series[s]; + + if (typeof point == "number") { + var ps = s.datapoints.pointsize; + point = s.datapoints.points.slice(ps * point, ps * (point + 1)); + } + + var i = indexOfHighlight(s, point); + if (i == -1) { + highlights.push({ series: s, point: point, auto: auto }); + + triggerRedrawOverlay(); + } + else if (!auto) + highlights[i].auto = false; + } + + function unhighlight(s, point) { + if (s == null && point == null) { + highlights = []; + triggerRedrawOverlay(); + return; + } + + if (typeof s == "number") + s = series[s]; + + if (typeof point == "number") { + var ps = s.datapoints.pointsize; + point = s.datapoints.points.slice(ps * point, ps * (point + 1)); + } + + var i = indexOfHighlight(s, point); + if (i != -1) { + highlights.splice(i, 1); + + triggerRedrawOverlay(); + } + } + + function indexOfHighlight(s, p) { + for (var i = 0; i < highlights.length; ++i) { + var h = highlights[i]; + if (h.series == s && h.point[0] == p[0] + && h.point[1] == p[1]) + return i; + } + return -1; + } + + function drawPointHighlight(series, point) { + var x = point[0], y = point[1], + axisx = series.xaxis, axisy = series.yaxis, + highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(); + + if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) + return; + + var pointRadius = series.points.radius + series.points.lineWidth / 2; + octx.lineWidth = pointRadius; + octx.strokeStyle = highlightColor; + var radius = 1.5 * pointRadius; + x = axisx.p2c(x); + y = axisy.p2c(y); + + octx.beginPath(); + if (series.points.symbol == "circle") + octx.arc(x, y, radius, 0, 2 * Math.PI, false); + else + series.points.symbol(octx, x, y, radius, false); + octx.closePath(); + octx.stroke(); + } + + function drawBarHighlight(series, point) { + var highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(), + fillStyle = highlightColor, + barLeft; + + switch (series.bars.align) { + case "left": + barLeft = 0; + break; + case "right": + barLeft = -series.bars.barWidth; + break; + default: + barLeft = -series.bars.barWidth / 2; + } + + octx.lineWidth = series.bars.lineWidth; + octx.strokeStyle = highlightColor; + + drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth, + function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth); + } + + function getColorOrGradient(spec, bottom, top, defaultColor) { + if (typeof spec == "string") + return spec; + else { + // assume this is a gradient spec; IE currently only + // supports a simple vertical gradient properly, so that's + // what we support too + var gradient = ctx.createLinearGradient(0, top, 0, bottom); + + for (var i = 0, l = spec.colors.length; i < l; ++i) { + var c = spec.colors[i]; + if (typeof c != "string") { + var co = $.color.parse(defaultColor); + if (c.brightness != null) + co = co.scale('rgb', c.brightness); + if (c.opacity != null) + co.a *= c.opacity; + c = co.toString(); + } + gradient.addColorStop(i / (l - 1), c); + } + + return gradient; + } + } + } + + // Add the plot function to the top level of the jQuery object + + $.plot = function(placeholder, data, options) { + //var t0 = new Date(); + var plot = new Plot($(placeholder), data, options, $.plot.plugins); + //(window.console ? console.log : alert)("time used (msecs): " + ((new Date()).getTime() - t0.getTime())); + return plot; + }; + + $.plot.version = "0.8.2"; + + $.plot.plugins = []; + + // Also add the plot function as a chainable property + + $.fn.plot = function(data, options) { + return this.each(function() { + $.plot(this, data, options); + }); + }; + + // round to nearby lower multiple of base + function floorInBase(n, base) { + return base * Math.floor(n / base); + } + +})(jQuery); diff --git a/theme/bootstrap/plugins/flot/jquery.flot.min.js b/theme/bootstrap/plugins/flot/jquery.flot.min.js new file mode 100644 index 0000000..9620fc0 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.min.js @@ -0,0 +1,2 @@ +(function($){$.color={};$.color.make=function(r,g,b,a){var o={};o.r=r||0;o.g=g||0;o.b=b||0;o.a=a!=null?a:1;o.add=function(c,d){for(var i=0;i<c.length;++i)o[c.charAt(i)]+=d;return o.normalize()};o.scale=function(c,f){for(var i=0;i<c.length;++i)o[c.charAt(i)]*=f;return o.normalize()};o.toString=function(){if(o.a>=1){return"rgb("+[o.r,o.g,o.b].join(",")+")"}else{return"rgba("+[o.r,o.g,o.b,o.a].join(",")+")"}};o.normalize=function(){function clamp(min,value,max){return value<min?min:value>max?max:value}o.r=clamp(0,parseInt(o.r),255);o.g=clamp(0,parseInt(o.g),255);o.b=clamp(0,parseInt(o.b),255);o.a=clamp(0,o.a,1);return o};o.clone=function(){return $.color.make(o.r,o.b,o.g,o.a)};return o.normalize()};$.color.extract=function(elem,css){var c;do{c=elem.css(css).toLowerCase();if(c!=""&&c!="transparent")break;elem=elem.parent()}while(elem.length&&!$.nodeName(elem.get(0),"body"));if(c=="rgba(0, 0, 0, 0)")c="transparent";return $.color.parse(c)};$.color.parse=function(str){var res,m=$.color.make;if(res=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10));if(res=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10),parseFloat(res[4]));if(res=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55);if(res=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55,parseFloat(res[4]));if(res=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))return m(parseInt(res[1],16),parseInt(res[2],16),parseInt(res[3],16));if(res=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))return m(parseInt(res[1]+res[1],16),parseInt(res[2]+res[2],16),parseInt(res[3]+res[3],16));var name=$.trim(str).toLowerCase();if(name=="transparent")return m(255,255,255,0);else{res=lookupColors[name]||[0,0,0];return m(res[0],res[1],res[2])}};var lookupColors={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);(function($){var hasOwnProperty=Object.prototype.hasOwnProperty;function Canvas(cls,container){var element=container.children("."+cls)[0];if(element==null){element=document.createElement("canvas");element.className=cls;$(element).css({direction:"ltr",position:"absolute",left:0,top:0}).appendTo(container);if(!element.getContext){if(window.G_vmlCanvasManager){element=window.G_vmlCanvasManager.initElement(element)}else{throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode.")}}}this.element=element;var context=this.context=element.getContext("2d");var devicePixelRatio=window.devicePixelRatio||1,backingStoreRatio=context.webkitBackingStorePixelRatio||context.mozBackingStorePixelRatio||context.msBackingStorePixelRatio||context.oBackingStorePixelRatio||context.backingStorePixelRatio||1;this.pixelRatio=devicePixelRatio/backingStoreRatio;this.resize(container.width(),container.height());this.textContainer=null;this.text={};this._textCache={}}Canvas.prototype.resize=function(width,height){if(width<=0||height<=0){throw new Error("Invalid dimensions for plot, width = "+width+", height = "+height)}var element=this.element,context=this.context,pixelRatio=this.pixelRatio;if(this.width!=width){element.width=width*pixelRatio;element.style.width=width+"px";this.width=width}if(this.height!=height){element.height=height*pixelRatio;element.style.height=height+"px";this.height=height}context.restore();context.save();context.scale(pixelRatio,pixelRatio)};Canvas.prototype.clear=function(){this.context.clearRect(0,0,this.width,this.height)};Canvas.prototype.render=function(){var cache=this._textCache;for(var layerKey in cache){if(hasOwnProperty.call(cache,layerKey)){var layer=this.getTextLayer(layerKey),layerCache=cache[layerKey];layer.hide();for(var styleKey in layerCache){if(hasOwnProperty.call(layerCache,styleKey)){var styleCache=layerCache[styleKey];for(var key in styleCache){if(hasOwnProperty.call(styleCache,key)){var positions=styleCache[key].positions;for(var i=0,position;position=positions[i];i++){if(position.active){if(!position.rendered){layer.append(position.element);position.rendered=true}}else{positions.splice(i--,1);if(position.rendered){position.element.detach()}}}if(positions.length==0){delete styleCache[key]}}}}}layer.show()}}};Canvas.prototype.getTextLayer=function(classes){var layer=this.text[classes];if(layer==null){if(this.textContainer==null){this.textContainer=$("<div class='flot-text'></div>").css({position:"absolute",top:0,left:0,bottom:0,right:0,"font-size":"smaller",color:"#545454"}).insertAfter(this.element)}layer=this.text[classes]=$("<div></div>").addClass(classes).css({position:"absolute",top:0,left:0,bottom:0,right:0}).appendTo(this.textContainer)}return layer};Canvas.prototype.getTextInfo=function(layer,text,font,angle,width){var textStyle,layerCache,styleCache,info;text=""+text;if(typeof font==="object"){textStyle=font.style+" "+font.variant+" "+font.weight+" "+font.size+"px/"+font.lineHeight+"px "+font.family}else{textStyle=font}layerCache=this._textCache[layer];if(layerCache==null){layerCache=this._textCache[layer]={}}styleCache=layerCache[textStyle];if(styleCache==null){styleCache=layerCache[textStyle]={}}info=styleCache[text];if(info==null){var element=$("<div></div>").html(text).css({position:"absolute","max-width":width,top:-9999}).appendTo(this.getTextLayer(layer));if(typeof font==="object"){element.css({font:textStyle,color:font.color})}else if(typeof font==="string"){element.addClass(font)}info=styleCache[text]={width:element.outerWidth(true),height:element.outerHeight(true),element:element,positions:[]};element.detach()}return info};Canvas.prototype.addText=function(layer,x,y,text,font,angle,width,halign,valign){var info=this.getTextInfo(layer,text,font,angle,width),positions=info.positions;if(halign=="center"){x-=info.width/2}else if(halign=="right"){x-=info.width}if(valign=="middle"){y-=info.height/2}else if(valign=="bottom"){y-=info.height}for(var i=0,position;position=positions[i];i++){if(position.x==x&&position.y==y){position.active=true;return}}position={active:true,rendered:false,element:positions.length?info.element.clone():info.element,x:x,y:y};positions.push(position);position.element.css({top:Math.round(y),left:Math.round(x),"text-align":halign})};Canvas.prototype.removeText=function(layer,x,y,text,font,angle){if(text==null){var layerCache=this._textCache[layer];if(layerCache!=null){for(var styleKey in layerCache){if(hasOwnProperty.call(layerCache,styleKey)){var styleCache=layerCache[styleKey];for(var key in styleCache){if(hasOwnProperty.call(styleCache,key)){var positions=styleCache[key].positions;for(var i=0,position;position=positions[i];i++){position.active=false}}}}}}}else{var positions=this.getTextInfo(layer,text,font,angle).positions;for(var i=0,position;position=positions[i];i++){if(position.x==x&&position.y==y){position.active=false}}}};function Plot(placeholder,data_,options_,plugins){var series=[],options={colors:["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"],legend:{show:true,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:.85,sorted:null},xaxis:{show:null,position:"bottom",mode:null,font:null,color:null,tickColor:null,transform:null,inverseTransform:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,labelWidth:null,labelHeight:null,reserveSpace:null,tickLength:null,alignTicksWithAxis:null,tickDecimals:null,tickSize:null,minTickSize:null},yaxis:{autoscaleMargin:.02,position:"left"},xaxes:[],yaxes:[],series:{points:{show:false,radius:3,lineWidth:2,fill:true,fillColor:"#ffffff",symbol:"circle"},lines:{lineWidth:2,fill:false,fillColor:null,steps:false},bars:{show:false,lineWidth:2,barWidth:1,fill:true,fillColor:null,align:"left",horizontal:false,zero:true},shadowSize:3,highlightColor:null},grid:{show:true,aboveData:false,color:"#545454",backgroundColor:null,borderColor:null,tickColor:null,margin:0,labelMargin:5,axisMargin:8,borderWidth:2,minBorderMargin:null,markings:null,markingsColor:"#f4f4f4",markingsLineWidth:2,clickable:false,hoverable:false,autoHighlight:true,mouseActiveRadius:10},interaction:{redrawOverlayInterval:1e3/60},hooks:{}},surface=null,overlay=null,eventHolder=null,ctx=null,octx=null,xaxes=[],yaxes=[],plotOffset={left:0,right:0,top:0,bottom:0},plotWidth=0,plotHeight=0,hooks={processOptions:[],processRawData:[],processDatapoints:[],processOffset:[],drawBackground:[],drawSeries:[],draw:[],bindEvents:[],drawOverlay:[],shutdown:[]},plot=this;plot.setData=setData;plot.setupGrid=setupGrid;plot.draw=draw;plot.getPlaceholder=function(){return placeholder};plot.getCanvas=function(){return surface.element};plot.getPlotOffset=function(){return plotOffset};plot.width=function(){return plotWidth};plot.height=function(){return plotHeight};plot.offset=function(){var o=eventHolder.offset();o.left+=plotOffset.left;o.top+=plotOffset.top;return o};plot.getData=function(){return series};plot.getAxes=function(){var res={},i;$.each(xaxes.concat(yaxes),function(_,axis){if(axis)res[axis.direction+(axis.n!=1?axis.n:"")+"axis"]=axis});return res};plot.getXAxes=function(){return xaxes};plot.getYAxes=function(){return yaxes};plot.c2p=canvasToAxisCoords;plot.p2c=axisToCanvasCoords;plot.getOptions=function(){return options};plot.highlight=highlight;plot.unhighlight=unhighlight;plot.triggerRedrawOverlay=triggerRedrawOverlay;plot.pointOffset=function(point){return{left:parseInt(xaxes[axisNumber(point,"x")-1].p2c(+point.x)+plotOffset.left,10),top:parseInt(yaxes[axisNumber(point,"y")-1].p2c(+point.y)+plotOffset.top,10)}};plot.shutdown=shutdown;plot.destroy=function(){shutdown();placeholder.removeData("plot").empty();series=[];options=null;surface=null;overlay=null;eventHolder=null;ctx=null;octx=null;xaxes=[];yaxes=[];hooks=null;highlights=[];plot=null};plot.resize=function(){var width=placeholder.width(),height=placeholder.height();surface.resize(width,height);overlay.resize(width,height)};plot.hooks=hooks;initPlugins(plot);parseOptions(options_);setupCanvases();setData(data_);setupGrid();draw();bindEvents();function executeHooks(hook,args){args=[plot].concat(args);for(var i=0;i<hook.length;++i)hook[i].apply(this,args)}function initPlugins(){var classes={Canvas:Canvas};for(var i=0;i<plugins.length;++i){var p=plugins[i];p.init(plot,classes);if(p.options)$.extend(true,options,p.options)}}function parseOptions(opts){$.extend(true,options,opts);if(opts&&opts.colors){options.colors=opts.colors}if(options.xaxis.color==null)options.xaxis.color=$.color.parse(options.grid.color).scale("a",.22).toString();if(options.yaxis.color==null)options.yaxis.color=$.color.parse(options.grid.color).scale("a",.22).toString();if(options.xaxis.tickColor==null)options.xaxis.tickColor=options.grid.tickColor||options.xaxis.color;if(options.yaxis.tickColor==null)options.yaxis.tickColor=options.grid.tickColor||options.yaxis.color;if(options.grid.borderColor==null)options.grid.borderColor=options.grid.color;if(options.grid.tickColor==null)options.grid.tickColor=$.color.parse(options.grid.color).scale("a",.22).toString();var i,axisOptions,axisCount,fontSize=placeholder.css("font-size"),fontSizeDefault=fontSize?+fontSize.replace("px",""):13,fontDefaults={style:placeholder.css("font-style"),size:Math.round(.8*fontSizeDefault),variant:placeholder.css("font-variant"),weight:placeholder.css("font-weight"),family:placeholder.css("font-family")};axisCount=options.xaxes.length||1;for(i=0;i<axisCount;++i){axisOptions=options.xaxes[i];if(axisOptions&&!axisOptions.tickColor){axisOptions.tickColor=axisOptions.color}axisOptions=$.extend(true,{},options.xaxis,axisOptions);options.xaxes[i]=axisOptions;if(axisOptions.font){axisOptions.font=$.extend({},fontDefaults,axisOptions.font);if(!axisOptions.font.color){axisOptions.font.color=axisOptions.color}if(!axisOptions.font.lineHeight){axisOptions.font.lineHeight=Math.round(axisOptions.font.size*1.15)}}}axisCount=options.yaxes.length||1;for(i=0;i<axisCount;++i){axisOptions=options.yaxes[i];if(axisOptions&&!axisOptions.tickColor){axisOptions.tickColor=axisOptions.color}axisOptions=$.extend(true,{},options.yaxis,axisOptions);options.yaxes[i]=axisOptions;if(axisOptions.font){axisOptions.font=$.extend({},fontDefaults,axisOptions.font);if(!axisOptions.font.color){axisOptions.font.color=axisOptions.color}if(!axisOptions.font.lineHeight){axisOptions.font.lineHeight=Math.round(axisOptions.font.size*1.15)}}}if(options.xaxis.noTicks&&options.xaxis.ticks==null)options.xaxis.ticks=options.xaxis.noTicks;if(options.yaxis.noTicks&&options.yaxis.ticks==null)options.yaxis.ticks=options.yaxis.noTicks;if(options.x2axis){options.xaxes[1]=$.extend(true,{},options.xaxis,options.x2axis);options.xaxes[1].position="top"}if(options.y2axis){options.yaxes[1]=$.extend(true,{},options.yaxis,options.y2axis);options.yaxes[1].position="right"}if(options.grid.coloredAreas)options.grid.markings=options.grid.coloredAreas;if(options.grid.coloredAreasColor)options.grid.markingsColor=options.grid.coloredAreasColor;if(options.lines)$.extend(true,options.series.lines,options.lines);if(options.points)$.extend(true,options.series.points,options.points);if(options.bars)$.extend(true,options.series.bars,options.bars);if(options.shadowSize!=null)options.series.shadowSize=options.shadowSize;if(options.highlightColor!=null)options.series.highlightColor=options.highlightColor;for(i=0;i<options.xaxes.length;++i)getOrCreateAxis(xaxes,i+1).options=options.xaxes[i];for(i=0;i<options.yaxes.length;++i)getOrCreateAxis(yaxes,i+1).options=options.yaxes[i];for(var n in hooks)if(options.hooks[n]&&options.hooks[n].length)hooks[n]=hooks[n].concat(options.hooks[n]);executeHooks(hooks.processOptions,[options])}function setData(d){series=parseData(d);fillInSeriesOptions();processData()}function parseData(d){var res=[];for(var i=0;i<d.length;++i){var s=$.extend(true,{},options.series);if(d[i].data!=null){s.data=d[i].data;delete d[i].data;$.extend(true,s,d[i]);d[i].data=s.data}else s.data=d[i];res.push(s)}return res}function axisNumber(obj,coord){var a=obj[coord+"axis"];if(typeof a=="object")a=a.n;if(typeof a!="number")a=1;return a}function allAxes(){return $.grep(xaxes.concat(yaxes),function(a){return a})}function canvasToAxisCoords(pos){var res={},i,axis;for(i=0;i<xaxes.length;++i){axis=xaxes[i];if(axis&&axis.used)res["x"+axis.n]=axis.c2p(pos.left)}for(i=0;i<yaxes.length;++i){axis=yaxes[i];if(axis&&axis.used)res["y"+axis.n]=axis.c2p(pos.top)}if(res.x1!==undefined)res.x=res.x1;if(res.y1!==undefined)res.y=res.y1;return res}function axisToCanvasCoords(pos){var res={},i,axis,key;for(i=0;i<xaxes.length;++i){axis=xaxes[i];if(axis&&axis.used){key="x"+axis.n;if(pos[key]==null&&axis.n==1)key="x";if(pos[key]!=null){res.left=axis.p2c(pos[key]);break}}}for(i=0;i<yaxes.length;++i){axis=yaxes[i];if(axis&&axis.used){key="y"+axis.n;if(pos[key]==null&&axis.n==1)key="y";if(pos[key]!=null){res.top=axis.p2c(pos[key]);break}}}return res}function getOrCreateAxis(axes,number){if(!axes[number-1])axes[number-1]={n:number,direction:axes==xaxes?"x":"y",options:$.extend(true,{},axes==xaxes?options.xaxis:options.yaxis)};return axes[number-1]}function fillInSeriesOptions(){var neededColors=series.length,maxIndex=-1,i;for(i=0;i<series.length;++i){var sc=series[i].color;if(sc!=null){neededColors--;if(typeof sc=="number"&&sc>maxIndex){maxIndex=sc}}}if(neededColors<=maxIndex){neededColors=maxIndex+1}var c,colors=[],colorPool=options.colors,colorPoolSize=colorPool.length,variation=0;for(i=0;i<neededColors;i++){c=$.color.parse(colorPool[i%colorPoolSize]||"#666");if(i%colorPoolSize==0&&i){if(variation>=0){if(variation<.5){variation=-variation-.2}else variation=0}else variation=-variation}colors[i]=c.scale("rgb",1+variation)}var colori=0,s;for(i=0;i<series.length;++i){s=series[i];if(s.color==null){s.color=colors[colori].toString();++colori}else if(typeof s.color=="number")s.color=colors[s.color].toString();if(s.lines.show==null){var v,show=true;for(v in s)if(s[v]&&s[v].show){show=false;break}if(show)s.lines.show=true}if(s.lines.zero==null){s.lines.zero=!!s.lines.fill}s.xaxis=getOrCreateAxis(xaxes,axisNumber(s,"x"));s.yaxis=getOrCreateAxis(yaxes,axisNumber(s,"y"))}}function processData(){var topSentry=Number.POSITIVE_INFINITY,bottomSentry=Number.NEGATIVE_INFINITY,fakeInfinity=Number.MAX_VALUE,i,j,k,m,length,s,points,ps,x,y,axis,val,f,p,data,format;function updateAxis(axis,min,max){if(min<axis.datamin&&min!=-fakeInfinity)axis.datamin=min;if(max>axis.datamax&&max!=fakeInfinity)axis.datamax=max}$.each(allAxes(),function(_,axis){axis.datamin=topSentry;axis.datamax=bottomSentry;axis.used=false});for(i=0;i<series.length;++i){s=series[i];s.datapoints={points:[]};executeHooks(hooks.processRawData,[s,s.data,s.datapoints])}for(i=0;i<series.length;++i){s=series[i];data=s.data;format=s.datapoints.format;if(!format){format=[];format.push({x:true,number:true,required:true});format.push({y:true,number:true,required:true});if(s.bars.show||s.lines.show&&s.lines.fill){var autoscale=!!(s.bars.show&&s.bars.zero||s.lines.show&&s.lines.zero);format.push({y:true,number:true,required:false,defaultValue:0,autoscale:autoscale});if(s.bars.horizontal){delete format[format.length-1].y;format[format.length-1].x=true}}s.datapoints.format=format}if(s.datapoints.pointsize!=null)continue;s.datapoints.pointsize=format.length;ps=s.datapoints.pointsize;points=s.datapoints.points;var insertSteps=s.lines.show&&s.lines.steps;s.xaxis.used=s.yaxis.used=true;for(j=k=0;j<data.length;++j,k+=ps){p=data[j];var nullify=p==null;if(!nullify){for(m=0;m<ps;++m){val=p[m];f=format[m];if(f){if(f.number&&val!=null){val=+val;if(isNaN(val))val=null;else if(val==Infinity)val=fakeInfinity;else if(val==-Infinity)val=-fakeInfinity}if(val==null){if(f.required)nullify=true;if(f.defaultValue!=null)val=f.defaultValue}}points[k+m]=val}}if(nullify){for(m=0;m<ps;++m){val=points[k+m];if(val!=null){f=format[m];if(f.autoscale!==false){if(f.x){updateAxis(s.xaxis,val,val)}if(f.y){updateAxis(s.yaxis,val,val)}}}points[k+m]=null}}else{if(insertSteps&&k>0&&points[k-ps]!=null&&points[k-ps]!=points[k]&&points[k-ps+1]!=points[k+1]){for(m=0;m<ps;++m)points[k+ps+m]=points[k+m];points[k+1]=points[k-ps+1];k+=ps}}}}for(i=0;i<series.length;++i){s=series[i];executeHooks(hooks.processDatapoints,[s,s.datapoints])}for(i=0;i<series.length;++i){s=series[i];points=s.datapoints.points;ps=s.datapoints.pointsize;format=s.datapoints.format;var xmin=topSentry,ymin=topSentry,xmax=bottomSentry,ymax=bottomSentry;for(j=0;j<points.length;j+=ps){if(points[j]==null)continue;for(m=0;m<ps;++m){val=points[j+m];f=format[m];if(!f||f.autoscale===false||val==fakeInfinity||val==-fakeInfinity)continue;if(f.x){if(val<xmin)xmin=val;if(val>xmax)xmax=val}if(f.y){if(val<ymin)ymin=val;if(val>ymax)ymax=val}}}if(s.bars.show){var delta;switch(s.bars.align){case"left":delta=0;break;case"right":delta=-s.bars.barWidth;break;default:delta=-s.bars.barWidth/2}if(s.bars.horizontal){ymin+=delta;ymax+=delta+s.bars.barWidth}else{xmin+=delta;xmax+=delta+s.bars.barWidth}}updateAxis(s.xaxis,xmin,xmax);updateAxis(s.yaxis,ymin,ymax)}$.each(allAxes(),function(_,axis){if(axis.datamin==topSentry)axis.datamin=null;if(axis.datamax==bottomSentry)axis.datamax=null})}function setupCanvases(){placeholder.css("padding",0).children().filter(function(){return!$(this).hasClass("flot-overlay")&&!$(this).hasClass("flot-base")}).remove();if(placeholder.css("position")=="static")placeholder.css("position","relative");surface=new Canvas("flot-base",placeholder);overlay=new Canvas("flot-overlay",placeholder);ctx=surface.context;octx=overlay.context;eventHolder=$(overlay.element).unbind();var existing=placeholder.data("plot");if(existing){existing.shutdown();overlay.clear()}placeholder.data("plot",plot)}function bindEvents(){if(options.grid.hoverable){eventHolder.mousemove(onMouseMove);eventHolder.bind("mouseleave",onMouseLeave)}if(options.grid.clickable)eventHolder.click(onClick);executeHooks(hooks.bindEvents,[eventHolder])}function shutdown(){if(redrawTimeout)clearTimeout(redrawTimeout);eventHolder.unbind("mousemove",onMouseMove);eventHolder.unbind("mouseleave",onMouseLeave);eventHolder.unbind("click",onClick);executeHooks(hooks.shutdown,[eventHolder])}function setTransformationHelpers(axis){function identity(x){return x}var s,m,t=axis.options.transform||identity,it=axis.options.inverseTransform;if(axis.direction=="x"){s=axis.scale=plotWidth/Math.abs(t(axis.max)-t(axis.min));m=Math.min(t(axis.max),t(axis.min))}else{s=axis.scale=plotHeight/Math.abs(t(axis.max)-t(axis.min));s=-s;m=Math.max(t(axis.max),t(axis.min))}if(t==identity)axis.p2c=function(p){return(p-m)*s};else axis.p2c=function(p){return(t(p)-m)*s};if(!it)axis.c2p=function(c){return m+c/s};else axis.c2p=function(c){return it(m+c/s)}}function measureTickLabels(axis){var opts=axis.options,ticks=axis.ticks||[],labelWidth=opts.labelWidth||0,labelHeight=opts.labelHeight||0,maxWidth=labelWidth||(axis.direction=="x"?Math.floor(surface.width/(ticks.length||1)):null),legacyStyles=axis.direction+"Axis "+axis.direction+axis.n+"Axis",layer="flot-"+axis.direction+"-axis flot-"+axis.direction+axis.n+"-axis "+legacyStyles,font=opts.font||"flot-tick-label tickLabel";for(var i=0;i<ticks.length;++i){var t=ticks[i];if(!t.label)continue;var info=surface.getTextInfo(layer,t.label,font,null,maxWidth);labelWidth=Math.max(labelWidth,info.width);labelHeight=Math.max(labelHeight,info.height)}axis.labelWidth=opts.labelWidth||labelWidth;axis.labelHeight=opts.labelHeight||labelHeight}function allocateAxisBoxFirstPhase(axis){var lw=axis.labelWidth,lh=axis.labelHeight,pos=axis.options.position,isXAxis=axis.direction==="x",tickLength=axis.options.tickLength,axisMargin=options.grid.axisMargin,padding=options.grid.labelMargin,innermost=true,outermost=true,first=true,found=false;$.each(isXAxis?xaxes:yaxes,function(i,a){if(a&&a.reserveSpace){if(a===axis){found=true}else if(a.options.position===pos){if(found){outermost=false}else{innermost=false}}if(!found){first=false}}});if(outermost){axisMargin=0}if(tickLength==null){tickLength=first?"full":5}if(!isNaN(+tickLength))padding+=+tickLength;if(isXAxis){lh+=padding;if(pos=="bottom"){plotOffset.bottom+=lh+axisMargin;axis.box={top:surface.height-plotOffset.bottom,height:lh}}else{axis.box={top:plotOffset.top+axisMargin,height:lh};plotOffset.top+=lh+axisMargin}}else{lw+=padding;if(pos=="left"){axis.box={left:plotOffset.left+axisMargin,width:lw};plotOffset.left+=lw+axisMargin}else{plotOffset.right+=lw+axisMargin;axis.box={left:surface.width-plotOffset.right,width:lw}}}axis.position=pos;axis.tickLength=tickLength;axis.box.padding=padding;axis.innermost=innermost}function allocateAxisBoxSecondPhase(axis){if(axis.direction=="x"){axis.box.left=plotOffset.left-axis.labelWidth/2;axis.box.width=surface.width-plotOffset.left-plotOffset.right+axis.labelWidth}else{axis.box.top=plotOffset.top-axis.labelHeight/2;axis.box.height=surface.height-plotOffset.bottom-plotOffset.top+axis.labelHeight}}function adjustLayoutForThingsStickingOut(){var minMargin=options.grid.minBorderMargin,axis,i;if(minMargin==null){minMargin=0;for(i=0;i<series.length;++i)minMargin=Math.max(minMargin,2*(series[i].points.radius+series[i].points.lineWidth/2))}var margins={left:minMargin,right:minMargin,top:minMargin,bottom:minMargin};$.each(allAxes(),function(_,axis){if(axis.reserveSpace&&axis.ticks&&axis.ticks.length){var lastTick=axis.ticks[axis.ticks.length-1];if(axis.direction==="x"){margins.left=Math.max(margins.left,axis.labelWidth/2);if(lastTick.v<=axis.max){margins.right=Math.max(margins.right,axis.labelWidth/2)}}else{margins.bottom=Math.max(margins.bottom,axis.labelHeight/2);if(lastTick.v<=axis.max){margins.top=Math.max(margins.top,axis.labelHeight/2)}}}});plotOffset.left=Math.ceil(Math.max(margins.left,plotOffset.left));plotOffset.right=Math.ceil(Math.max(margins.right,plotOffset.right));plotOffset.top=Math.ceil(Math.max(margins.top,plotOffset.top));plotOffset.bottom=Math.ceil(Math.max(margins.bottom,plotOffset.bottom))}function setupGrid(){var i,axes=allAxes(),showGrid=options.grid.show;for(var a in plotOffset){var margin=options.grid.margin||0;plotOffset[a]=typeof margin=="number"?margin:margin[a]||0}executeHooks(hooks.processOffset,[plotOffset]);for(var a in plotOffset){if(typeof options.grid.borderWidth=="object"){plotOffset[a]+=showGrid?options.grid.borderWidth[a]:0}else{plotOffset[a]+=showGrid?options.grid.borderWidth:0}}$.each(axes,function(_,axis){axis.show=axis.options.show;if(axis.show==null)axis.show=axis.used;axis.reserveSpace=axis.show||axis.options.reserveSpace;setRange(axis)});if(showGrid){var allocatedAxes=$.grep(axes,function(axis){return axis.reserveSpace});$.each(allocatedAxes,function(_,axis){setupTickGeneration(axis);setTicks(axis);snapRangeToTicks(axis,axis.ticks);measureTickLabels(axis)});for(i=allocatedAxes.length-1;i>=0;--i)allocateAxisBoxFirstPhase(allocatedAxes[i]);adjustLayoutForThingsStickingOut();$.each(allocatedAxes,function(_,axis){allocateAxisBoxSecondPhase(axis)})}plotWidth=surface.width-plotOffset.left-plotOffset.right;plotHeight=surface.height-plotOffset.bottom-plotOffset.top;$.each(axes,function(_,axis){setTransformationHelpers(axis)});if(showGrid){drawAxisLabels()}insertLegend()}function setRange(axis){var opts=axis.options,min=+(opts.min!=null?opts.min:axis.datamin),max=+(opts.max!=null?opts.max:axis.datamax),delta=max-min;if(delta==0){var widen=max==0?1:.01;if(opts.min==null)min-=widen;if(opts.max==null||opts.min!=null)max+=widen}else{var margin=opts.autoscaleMargin;if(margin!=null){if(opts.min==null){min-=delta*margin;if(min<0&&axis.datamin!=null&&axis.datamin>=0)min=0}if(opts.max==null){max+=delta*margin;if(max>0&&axis.datamax!=null&&axis.datamax<=0)max=0}}}axis.min=min;axis.max=max}function setupTickGeneration(axis){var opts=axis.options;var noTicks;if(typeof opts.ticks=="number"&&opts.ticks>0)noTicks=opts.ticks;else noTicks=.3*Math.sqrt(axis.direction=="x"?surface.width:surface.height);var delta=(axis.max-axis.min)/noTicks,dec=-Math.floor(Math.log(delta)/Math.LN10),maxDec=opts.tickDecimals;if(maxDec!=null&&dec>maxDec){dec=maxDec}var magn=Math.pow(10,-dec),norm=delta/magn,size;if(norm<1.5){size=1}else if(norm<3){size=2;if(norm>2.25&&(maxDec==null||dec+1<=maxDec)){size=2.5;++dec}}else if(norm<7.5){size=5}else{size=10}size*=magn;if(opts.minTickSize!=null&&size<opts.minTickSize){size=opts.minTickSize}axis.delta=delta;axis.tickDecimals=Math.max(0,maxDec!=null?maxDec:dec);axis.tickSize=opts.tickSize||size;if(opts.mode=="time"&&!axis.tickGenerator){throw new Error("Time mode requires the flot.time plugin.")}if(!axis.tickGenerator){axis.tickGenerator=function(axis){var ticks=[],start=floorInBase(axis.min,axis.tickSize),i=0,v=Number.NaN,prev;do{prev=v;v=start+i*axis.tickSize;ticks.push(v);++i}while(v<axis.max&&v!=prev);return ticks};axis.tickFormatter=function(value,axis){var factor=axis.tickDecimals?Math.pow(10,axis.tickDecimals):1;var formatted=""+Math.round(value*factor)/factor;if(axis.tickDecimals!=null){var decimal=formatted.indexOf(".");var precision=decimal==-1?0:formatted.length-decimal-1;if(precision<axis.tickDecimals){return(precision?formatted:formatted+".")+(""+factor).substr(1,axis.tickDecimals-precision)}}return formatted}}if($.isFunction(opts.tickFormatter))axis.tickFormatter=function(v,axis){return""+opts.tickFormatter(v,axis)};if(opts.alignTicksWithAxis!=null){var otherAxis=(axis.direction=="x"?xaxes:yaxes)[opts.alignTicksWithAxis-1];if(otherAxis&&otherAxis.used&&otherAxis!=axis){var niceTicks=axis.tickGenerator(axis);if(niceTicks.length>0){if(opts.min==null)axis.min=Math.min(axis.min,niceTicks[0]);if(opts.max==null&&niceTicks.length>1)axis.max=Math.max(axis.max,niceTicks[niceTicks.length-1])}axis.tickGenerator=function(axis){var ticks=[],v,i;for(i=0;i<otherAxis.ticks.length;++i){v=(otherAxis.ticks[i].v-otherAxis.min)/(otherAxis.max-otherAxis.min);v=axis.min+v*(axis.max-axis.min);ticks.push(v)}return ticks};if(!axis.mode&&opts.tickDecimals==null){var extraDec=Math.max(0,-Math.floor(Math.log(axis.delta)/Math.LN10)+1),ts=axis.tickGenerator(axis);if(!(ts.length>1&&/\..*0$/.test((ts[1]-ts[0]).toFixed(extraDec))))axis.tickDecimals=extraDec}}}}function setTicks(axis){var oticks=axis.options.ticks,ticks=[];if(oticks==null||typeof oticks=="number"&&oticks>0)ticks=axis.tickGenerator(axis);else if(oticks){if($.isFunction(oticks))ticks=oticks(axis);else ticks=oticks}var i,v;axis.ticks=[];for(i=0;i<ticks.length;++i){var label=null;var t=ticks[i];if(typeof t=="object"){v=+t[0];if(t.length>1)label=t[1]}else v=+t;if(label==null)label=axis.tickFormatter(v,axis);if(!isNaN(v))axis.ticks.push({v:v,label:label})}}function snapRangeToTicks(axis,ticks){if(axis.options.autoscaleMargin&&ticks.length>0){if(axis.options.min==null)axis.min=Math.min(axis.min,ticks[0].v);if(axis.options.max==null&&ticks.length>1)axis.max=Math.max(axis.max,ticks[ticks.length-1].v)}}function draw(){surface.clear();executeHooks(hooks.drawBackground,[ctx]);var grid=options.grid;if(grid.show&&grid.backgroundColor)drawBackground();if(grid.show&&!grid.aboveData){drawGrid()}for(var i=0;i<series.length;++i){executeHooks(hooks.drawSeries,[ctx,series[i]]);drawSeries(series[i])}executeHooks(hooks.draw,[ctx]);if(grid.show&&grid.aboveData){drawGrid()}surface.render();triggerRedrawOverlay()}function extractRange(ranges,coord){var axis,from,to,key,axes=allAxes();for(var i=0;i<axes.length;++i){axis=axes[i];if(axis.direction==coord){key=coord+axis.n+"axis";if(!ranges[key]&&axis.n==1)key=coord+"axis";if(ranges[key]){from=ranges[key].from;to=ranges[key].to;break}}}if(!ranges[key]){axis=coord=="x"?xaxes[0]:yaxes[0];from=ranges[coord+"1"];to=ranges[coord+"2"]}if(from!=null&&to!=null&&from>to){var tmp=from;from=to;to=tmp}return{from:from,to:to,axis:axis}}function drawBackground(){ctx.save();ctx.translate(plotOffset.left,plotOffset.top);ctx.fillStyle=getColorOrGradient(options.grid.backgroundColor,plotHeight,0,"rgba(255, 255, 255, 0)");ctx.fillRect(0,0,plotWidth,plotHeight);ctx.restore()}function drawGrid(){var i,axes,bw,bc;ctx.save();ctx.translate(plotOffset.left,plotOffset.top);var markings=options.grid.markings;if(markings){if($.isFunction(markings)){axes=plot.getAxes();axes.xmin=axes.xaxis.min;axes.xmax=axes.xaxis.max;axes.ymin=axes.yaxis.min;axes.ymax=axes.yaxis.max;markings=markings(axes)}for(i=0;i<markings.length;++i){var m=markings[i],xrange=extractRange(m,"x"),yrange=extractRange(m,"y");if(xrange.from==null)xrange.from=xrange.axis.min;if(xrange.to==null)xrange.to=xrange.axis.max;if(yrange.from==null)yrange.from=yrange.axis.min;if(yrange.to==null)yrange.to=yrange.axis.max;if(xrange.to<xrange.axis.min||xrange.from>xrange.axis.max||yrange.to<yrange.axis.min||yrange.from>yrange.axis.max)continue;xrange.from=Math.max(xrange.from,xrange.axis.min);xrange.to=Math.min(xrange.to,xrange.axis.max); +yrange.from=Math.max(yrange.from,yrange.axis.min);yrange.to=Math.min(yrange.to,yrange.axis.max);if(xrange.from==xrange.to&&yrange.from==yrange.to)continue;xrange.from=xrange.axis.p2c(xrange.from);xrange.to=xrange.axis.p2c(xrange.to);yrange.from=yrange.axis.p2c(yrange.from);yrange.to=yrange.axis.p2c(yrange.to);if(xrange.from==xrange.to||yrange.from==yrange.to){ctx.beginPath();ctx.strokeStyle=m.color||options.grid.markingsColor;ctx.lineWidth=m.lineWidth||options.grid.markingsLineWidth;ctx.moveTo(xrange.from,yrange.from);ctx.lineTo(xrange.to,yrange.to);ctx.stroke()}else{ctx.fillStyle=m.color||options.grid.markingsColor;ctx.fillRect(xrange.from,yrange.to,xrange.to-xrange.from,yrange.from-yrange.to)}}}axes=allAxes();bw=options.grid.borderWidth;for(var j=0;j<axes.length;++j){var axis=axes[j],box=axis.box,t=axis.tickLength,x,y,xoff,yoff;if(!axis.show||axis.ticks.length==0)continue;ctx.lineWidth=1;if(axis.direction=="x"){x=0;if(t=="full")y=axis.position=="top"?0:plotHeight;else y=box.top-plotOffset.top+(axis.position=="top"?box.height:0)}else{y=0;if(t=="full")x=axis.position=="left"?0:plotWidth;else x=box.left-plotOffset.left+(axis.position=="left"?box.width:0)}if(!axis.innermost){ctx.strokeStyle=axis.options.color;ctx.beginPath();xoff=yoff=0;if(axis.direction=="x")xoff=plotWidth+1;else yoff=plotHeight+1;if(ctx.lineWidth==1){if(axis.direction=="x"){y=Math.floor(y)+.5}else{x=Math.floor(x)+.5}}ctx.moveTo(x,y);ctx.lineTo(x+xoff,y+yoff);ctx.stroke()}ctx.strokeStyle=axis.options.tickColor;ctx.beginPath();for(i=0;i<axis.ticks.length;++i){var v=axis.ticks[i].v;xoff=yoff=0;if(isNaN(v)||v<axis.min||v>axis.max||t=="full"&&(typeof bw=="object"&&bw[axis.position]>0||bw>0)&&(v==axis.min||v==axis.max))continue;if(axis.direction=="x"){x=axis.p2c(v);yoff=t=="full"?-plotHeight:t;if(axis.position=="top")yoff=-yoff}else{y=axis.p2c(v);xoff=t=="full"?-plotWidth:t;if(axis.position=="left")xoff=-xoff}if(ctx.lineWidth==1){if(axis.direction=="x")x=Math.floor(x)+.5;else y=Math.floor(y)+.5}ctx.moveTo(x,y);ctx.lineTo(x+xoff,y+yoff)}ctx.stroke()}if(bw){bc=options.grid.borderColor;if(typeof bw=="object"||typeof bc=="object"){if(typeof bw!=="object"){bw={top:bw,right:bw,bottom:bw,left:bw}}if(typeof bc!=="object"){bc={top:bc,right:bc,bottom:bc,left:bc}}if(bw.top>0){ctx.strokeStyle=bc.top;ctx.lineWidth=bw.top;ctx.beginPath();ctx.moveTo(0-bw.left,0-bw.top/2);ctx.lineTo(plotWidth,0-bw.top/2);ctx.stroke()}if(bw.right>0){ctx.strokeStyle=bc.right;ctx.lineWidth=bw.right;ctx.beginPath();ctx.moveTo(plotWidth+bw.right/2,0-bw.top);ctx.lineTo(plotWidth+bw.right/2,plotHeight);ctx.stroke()}if(bw.bottom>0){ctx.strokeStyle=bc.bottom;ctx.lineWidth=bw.bottom;ctx.beginPath();ctx.moveTo(plotWidth+bw.right,plotHeight+bw.bottom/2);ctx.lineTo(0,plotHeight+bw.bottom/2);ctx.stroke()}if(bw.left>0){ctx.strokeStyle=bc.left;ctx.lineWidth=bw.left;ctx.beginPath();ctx.moveTo(0-bw.left/2,plotHeight+bw.bottom);ctx.lineTo(0-bw.left/2,0);ctx.stroke()}}else{ctx.lineWidth=bw;ctx.strokeStyle=options.grid.borderColor;ctx.strokeRect(-bw/2,-bw/2,plotWidth+bw,plotHeight+bw)}}ctx.restore()}function drawAxisLabels(){$.each(allAxes(),function(_,axis){var box=axis.box,legacyStyles=axis.direction+"Axis "+axis.direction+axis.n+"Axis",layer="flot-"+axis.direction+"-axis flot-"+axis.direction+axis.n+"-axis "+legacyStyles,font=axis.options.font||"flot-tick-label tickLabel",tick,x,y,halign,valign;surface.removeText(layer);if(!axis.show||axis.ticks.length==0)return;for(var i=0;i<axis.ticks.length;++i){tick=axis.ticks[i];if(!tick.label||tick.v<axis.min||tick.v>axis.max)continue;if(axis.direction=="x"){halign="center";x=plotOffset.left+axis.p2c(tick.v);if(axis.position=="bottom"){y=box.top+box.padding}else{y=box.top+box.height-box.padding;valign="bottom"}}else{valign="middle";y=plotOffset.top+axis.p2c(tick.v);if(axis.position=="left"){x=box.left+box.width-box.padding;halign="right"}else{x=box.left+box.padding}}surface.addText(layer,x,y,tick.label,font,null,null,halign,valign)}})}function drawSeries(series){if(series.lines.show)drawSeriesLines(series);if(series.bars.show)drawSeriesBars(series);if(series.points.show)drawSeriesPoints(series)}function drawSeriesLines(series){function plotLine(datapoints,xoffset,yoffset,axisx,axisy){var points=datapoints.points,ps=datapoints.pointsize,prevx=null,prevy=null;ctx.beginPath();for(var i=ps;i<points.length;i+=ps){var x1=points[i-ps],y1=points[i-ps+1],x2=points[i],y2=points[i+1];if(x1==null||x2==null)continue;if(y1<=y2&&y1<axisy.min){if(y2<axisy.min)continue;x1=(axisy.min-y1)/(y2-y1)*(x2-x1)+x1;y1=axisy.min}else if(y2<=y1&&y2<axisy.min){if(y1<axisy.min)continue;x2=(axisy.min-y1)/(y2-y1)*(x2-x1)+x1;y2=axisy.min}if(y1>=y2&&y1>axisy.max){if(y2>axisy.max)continue;x1=(axisy.max-y1)/(y2-y1)*(x2-x1)+x1;y1=axisy.max}else if(y2>=y1&&y2>axisy.max){if(y1>axisy.max)continue;x2=(axisy.max-y1)/(y2-y1)*(x2-x1)+x1;y2=axisy.max}if(x1<=x2&&x1<axisx.min){if(x2<axisx.min)continue;y1=(axisx.min-x1)/(x2-x1)*(y2-y1)+y1;x1=axisx.min}else if(x2<=x1&&x2<axisx.min){if(x1<axisx.min)continue;y2=(axisx.min-x1)/(x2-x1)*(y2-y1)+y1;x2=axisx.min}if(x1>=x2&&x1>axisx.max){if(x2>axisx.max)continue;y1=(axisx.max-x1)/(x2-x1)*(y2-y1)+y1;x1=axisx.max}else if(x2>=x1&&x2>axisx.max){if(x1>axisx.max)continue;y2=(axisx.max-x1)/(x2-x1)*(y2-y1)+y1;x2=axisx.max}if(x1!=prevx||y1!=prevy)ctx.moveTo(axisx.p2c(x1)+xoffset,axisy.p2c(y1)+yoffset);prevx=x2;prevy=y2;ctx.lineTo(axisx.p2c(x2)+xoffset,axisy.p2c(y2)+yoffset)}ctx.stroke()}function plotLineArea(datapoints,axisx,axisy){var points=datapoints.points,ps=datapoints.pointsize,bottom=Math.min(Math.max(0,axisy.min),axisy.max),i=0,top,areaOpen=false,ypos=1,segmentStart=0,segmentEnd=0;while(true){if(ps>0&&i>points.length+ps)break;i+=ps;var x1=points[i-ps],y1=points[i-ps+ypos],x2=points[i],y2=points[i+ypos];if(areaOpen){if(ps>0&&x1!=null&&x2==null){segmentEnd=i;ps=-ps;ypos=2;continue}if(ps<0&&i==segmentStart+ps){ctx.fill();areaOpen=false;ps=-ps;ypos=1;i=segmentStart=segmentEnd+ps;continue}}if(x1==null||x2==null)continue;if(x1<=x2&&x1<axisx.min){if(x2<axisx.min)continue;y1=(axisx.min-x1)/(x2-x1)*(y2-y1)+y1;x1=axisx.min}else if(x2<=x1&&x2<axisx.min){if(x1<axisx.min)continue;y2=(axisx.min-x1)/(x2-x1)*(y2-y1)+y1;x2=axisx.min}if(x1>=x2&&x1>axisx.max){if(x2>axisx.max)continue;y1=(axisx.max-x1)/(x2-x1)*(y2-y1)+y1;x1=axisx.max}else if(x2>=x1&&x2>axisx.max){if(x1>axisx.max)continue;y2=(axisx.max-x1)/(x2-x1)*(y2-y1)+y1;x2=axisx.max}if(!areaOpen){ctx.beginPath();ctx.moveTo(axisx.p2c(x1),axisy.p2c(bottom));areaOpen=true}if(y1>=axisy.max&&y2>=axisy.max){ctx.lineTo(axisx.p2c(x1),axisy.p2c(axisy.max));ctx.lineTo(axisx.p2c(x2),axisy.p2c(axisy.max));continue}else if(y1<=axisy.min&&y2<=axisy.min){ctx.lineTo(axisx.p2c(x1),axisy.p2c(axisy.min));ctx.lineTo(axisx.p2c(x2),axisy.p2c(axisy.min));continue}var x1old=x1,x2old=x2;if(y1<=y2&&y1<axisy.min&&y2>=axisy.min){x1=(axisy.min-y1)/(y2-y1)*(x2-x1)+x1;y1=axisy.min}else if(y2<=y1&&y2<axisy.min&&y1>=axisy.min){x2=(axisy.min-y1)/(y2-y1)*(x2-x1)+x1;y2=axisy.min}if(y1>=y2&&y1>axisy.max&&y2<=axisy.max){x1=(axisy.max-y1)/(y2-y1)*(x2-x1)+x1;y1=axisy.max}else if(y2>=y1&&y2>axisy.max&&y1<=axisy.max){x2=(axisy.max-y1)/(y2-y1)*(x2-x1)+x1;y2=axisy.max}if(x1!=x1old){ctx.lineTo(axisx.p2c(x1old),axisy.p2c(y1))}ctx.lineTo(axisx.p2c(x1),axisy.p2c(y1));ctx.lineTo(axisx.p2c(x2),axisy.p2c(y2));if(x2!=x2old){ctx.lineTo(axisx.p2c(x2),axisy.p2c(y2));ctx.lineTo(axisx.p2c(x2old),axisy.p2c(y2))}}}ctx.save();ctx.translate(plotOffset.left,plotOffset.top);ctx.lineJoin="round";var lw=series.lines.lineWidth,sw=series.shadowSize;if(lw>0&&sw>0){ctx.lineWidth=sw;ctx.strokeStyle="rgba(0,0,0,0.1)";var angle=Math.PI/18;plotLine(series.datapoints,Math.sin(angle)*(lw/2+sw/2),Math.cos(angle)*(lw/2+sw/2),series.xaxis,series.yaxis);ctx.lineWidth=sw/2;plotLine(series.datapoints,Math.sin(angle)*(lw/2+sw/4),Math.cos(angle)*(lw/2+sw/4),series.xaxis,series.yaxis)}ctx.lineWidth=lw;ctx.strokeStyle=series.color;var fillStyle=getFillStyle(series.lines,series.color,0,plotHeight);if(fillStyle){ctx.fillStyle=fillStyle;plotLineArea(series.datapoints,series.xaxis,series.yaxis)}if(lw>0)plotLine(series.datapoints,0,0,series.xaxis,series.yaxis);ctx.restore()}function drawSeriesPoints(series){function plotPoints(datapoints,radius,fillStyle,offset,shadow,axisx,axisy,symbol){var points=datapoints.points,ps=datapoints.pointsize;for(var i=0;i<points.length;i+=ps){var x=points[i],y=points[i+1];if(x==null||x<axisx.min||x>axisx.max||y<axisy.min||y>axisy.max)continue;ctx.beginPath();x=axisx.p2c(x);y=axisy.p2c(y)+offset;if(symbol=="circle")ctx.arc(x,y,radius,0,shadow?Math.PI:Math.PI*2,false);else symbol(ctx,x,y,radius,shadow);ctx.closePath();if(fillStyle){ctx.fillStyle=fillStyle;ctx.fill()}ctx.stroke()}}ctx.save();ctx.translate(plotOffset.left,plotOffset.top);var lw=series.points.lineWidth,sw=series.shadowSize,radius=series.points.radius,symbol=series.points.symbol;if(lw==0)lw=1e-4;if(lw>0&&sw>0){var w=sw/2;ctx.lineWidth=w;ctx.strokeStyle="rgba(0,0,0,0.1)";plotPoints(series.datapoints,radius,null,w+w/2,true,series.xaxis,series.yaxis,symbol);ctx.strokeStyle="rgba(0,0,0,0.2)";plotPoints(series.datapoints,radius,null,w/2,true,series.xaxis,series.yaxis,symbol)}ctx.lineWidth=lw;ctx.strokeStyle=series.color;plotPoints(series.datapoints,radius,getFillStyle(series.points,series.color),0,false,series.xaxis,series.yaxis,symbol);ctx.restore()}function drawBar(x,y,b,barLeft,barRight,fillStyleCallback,axisx,axisy,c,horizontal,lineWidth){var left,right,bottom,top,drawLeft,drawRight,drawTop,drawBottom,tmp;if(horizontal){drawBottom=drawRight=drawTop=true;drawLeft=false;left=b;right=x;top=y+barLeft;bottom=y+barRight;if(right<left){tmp=right;right=left;left=tmp;drawLeft=true;drawRight=false}}else{drawLeft=drawRight=drawTop=true;drawBottom=false;left=x+barLeft;right=x+barRight;bottom=b;top=y;if(top<bottom){tmp=top;top=bottom;bottom=tmp;drawBottom=true;drawTop=false}}if(right<axisx.min||left>axisx.max||top<axisy.min||bottom>axisy.max)return;if(left<axisx.min){left=axisx.min;drawLeft=false}if(right>axisx.max){right=axisx.max;drawRight=false}if(bottom<axisy.min){bottom=axisy.min;drawBottom=false}if(top>axisy.max){top=axisy.max;drawTop=false}left=axisx.p2c(left);bottom=axisy.p2c(bottom);right=axisx.p2c(right);top=axisy.p2c(top);if(fillStyleCallback){c.fillStyle=fillStyleCallback(bottom,top);c.fillRect(left,top,right-left,bottom-top)}if(lineWidth>0&&(drawLeft||drawRight||drawTop||drawBottom)){c.beginPath();c.moveTo(left,bottom);if(drawLeft)c.lineTo(left,top);else c.moveTo(left,top);if(drawTop)c.lineTo(right,top);else c.moveTo(right,top);if(drawRight)c.lineTo(right,bottom);else c.moveTo(right,bottom);if(drawBottom)c.lineTo(left,bottom);else c.moveTo(left,bottom);c.stroke()}}function drawSeriesBars(series){function plotBars(datapoints,barLeft,barRight,fillStyleCallback,axisx,axisy){var points=datapoints.points,ps=datapoints.pointsize;for(var i=0;i<points.length;i+=ps){if(points[i]==null)continue;drawBar(points[i],points[i+1],points[i+2],barLeft,barRight,fillStyleCallback,axisx,axisy,ctx,series.bars.horizontal,series.bars.lineWidth)}}ctx.save();ctx.translate(plotOffset.left,plotOffset.top);ctx.lineWidth=series.bars.lineWidth;ctx.strokeStyle=series.color;var barLeft;switch(series.bars.align){case"left":barLeft=0;break;case"right":barLeft=-series.bars.barWidth;break;default:barLeft=-series.bars.barWidth/2}var fillStyleCallback=series.bars.fill?function(bottom,top){return getFillStyle(series.bars,series.color,bottom,top)}:null;plotBars(series.datapoints,barLeft,barLeft+series.bars.barWidth,fillStyleCallback,series.xaxis,series.yaxis);ctx.restore()}function getFillStyle(filloptions,seriesColor,bottom,top){var fill=filloptions.fill;if(!fill)return null;if(filloptions.fillColor)return getColorOrGradient(filloptions.fillColor,bottom,top,seriesColor);var c=$.color.parse(seriesColor);c.a=typeof fill=="number"?fill:.4;c.normalize();return c.toString()}function insertLegend(){if(options.legend.container!=null){$(options.legend.container).html("")}else{placeholder.find(".legend").remove()}if(!options.legend.show){return}var fragments=[],entries=[],rowStarted=false,lf=options.legend.labelFormatter,s,label;for(var i=0;i<series.length;++i){s=series[i];if(s.label){label=lf?lf(s.label,s):s.label;if(label){entries.push({label:label,color:s.color})}}}if(options.legend.sorted){if($.isFunction(options.legend.sorted)){entries.sort(options.legend.sorted)}else if(options.legend.sorted=="reverse"){entries.reverse()}else{var ascending=options.legend.sorted!="descending";entries.sort(function(a,b){return a.label==b.label?0:a.label<b.label!=ascending?1:-1})}}for(var i=0;i<entries.length;++i){var entry=entries[i];if(i%options.legend.noColumns==0){if(rowStarted)fragments.push("</tr>");fragments.push("<tr>");rowStarted=true}fragments.push('<td class="legendColorBox"><div style="border:1px solid '+options.legend.labelBoxBorderColor+';padding:1px"><div style="width:4px;height:0;border:5px solid '+entry.color+';overflow:hidden"></div></div></td>'+'<td class="legendLabel">'+entry.label+"</td>")}if(rowStarted)fragments.push("</tr>");if(fragments.length==0)return;var table='<table style="font-size:smaller;color:'+options.grid.color+'">'+fragments.join("")+"</table>";if(options.legend.container!=null)$(options.legend.container).html(table);else{var pos="",p=options.legend.position,m=options.legend.margin;if(m[0]==null)m=[m,m];if(p.charAt(0)=="n")pos+="top:"+(m[1]+plotOffset.top)+"px;";else if(p.charAt(0)=="s")pos+="bottom:"+(m[1]+plotOffset.bottom)+"px;";if(p.charAt(1)=="e")pos+="right:"+(m[0]+plotOffset.right)+"px;";else if(p.charAt(1)=="w")pos+="left:"+(m[0]+plotOffset.left)+"px;";var legend=$('<div class="legend">'+table.replace('style="','style="position:absolute;'+pos+";")+"</div>").appendTo(placeholder);if(options.legend.backgroundOpacity!=0){var c=options.legend.backgroundColor;if(c==null){c=options.grid.backgroundColor;if(c&&typeof c=="string")c=$.color.parse(c);else c=$.color.extract(legend,"background-color");c.a=1;c=c.toString()}var div=legend.children();$('<div style="position:absolute;width:'+div.width()+"px;height:"+div.height()+"px;"+pos+"background-color:"+c+';"> </div>').prependTo(legend).css("opacity",options.legend.backgroundOpacity)}}}var highlights=[],redrawTimeout=null;function findNearbyItem(mouseX,mouseY,seriesFilter){var maxDistance=options.grid.mouseActiveRadius,smallestDistance=maxDistance*maxDistance+1,item=null,foundPoint=false,i,j,ps;for(i=series.length-1;i>=0;--i){if(!seriesFilter(series[i]))continue;var s=series[i],axisx=s.xaxis,axisy=s.yaxis,points=s.datapoints.points,mx=axisx.c2p(mouseX),my=axisy.c2p(mouseY),maxx=maxDistance/axisx.scale,maxy=maxDistance/axisy.scale;ps=s.datapoints.pointsize;if(axisx.options.inverseTransform)maxx=Number.MAX_VALUE;if(axisy.options.inverseTransform)maxy=Number.MAX_VALUE;if(s.lines.show||s.points.show){for(j=0;j<points.length;j+=ps){var x=points[j],y=points[j+1];if(x==null)continue;if(x-mx>maxx||x-mx<-maxx||y-my>maxy||y-my<-maxy)continue;var dx=Math.abs(axisx.p2c(x)-mouseX),dy=Math.abs(axisy.p2c(y)-mouseY),dist=dx*dx+dy*dy;if(dist<smallestDistance){smallestDistance=dist;item=[i,j/ps]}}}if(s.bars.show&&!item){var barLeft,barRight;switch(s.bars.align){case"left":barLeft=0;break;case"right":barLeft=-s.bars.barWidth;break;default:barLeft=-s.bars.barWidth/2}barRight=barLeft+s.bars.barWidth;for(j=0;j<points.length;j+=ps){var x=points[j],y=points[j+1],b=points[j+2];if(x==null)continue;if(series[i].bars.horizontal?mx<=Math.max(b,x)&&mx>=Math.min(b,x)&&my>=y+barLeft&&my<=y+barRight:mx>=x+barLeft&&mx<=x+barRight&&my>=Math.min(b,y)&&my<=Math.max(b,y))item=[i,j/ps]}}}if(item){i=item[0];j=item[1];ps=series[i].datapoints.pointsize;return{datapoint:series[i].datapoints.points.slice(j*ps,(j+1)*ps),dataIndex:j,series:series[i],seriesIndex:i}}return null}function onMouseMove(e){if(options.grid.hoverable)triggerClickHoverEvent("plothover",e,function(s){return s["hoverable"]!=false})}function onMouseLeave(e){if(options.grid.hoverable)triggerClickHoverEvent("plothover",e,function(s){return false})}function onClick(e){triggerClickHoverEvent("plotclick",e,function(s){return s["clickable"]!=false})}function triggerClickHoverEvent(eventname,event,seriesFilter){var offset=eventHolder.offset(),canvasX=event.pageX-offset.left-plotOffset.left,canvasY=event.pageY-offset.top-plotOffset.top,pos=canvasToAxisCoords({left:canvasX,top:canvasY});pos.pageX=event.pageX;pos.pageY=event.pageY;var item=findNearbyItem(canvasX,canvasY,seriesFilter);if(item){item.pageX=parseInt(item.series.xaxis.p2c(item.datapoint[0])+offset.left+plotOffset.left,10);item.pageY=parseInt(item.series.yaxis.p2c(item.datapoint[1])+offset.top+plotOffset.top,10)}if(options.grid.autoHighlight){for(var i=0;i<highlights.length;++i){var h=highlights[i];if(h.auto==eventname&&!(item&&h.series==item.series&&h.point[0]==item.datapoint[0]&&h.point[1]==item.datapoint[1]))unhighlight(h.series,h.point)}if(item)highlight(item.series,item.datapoint,eventname)}placeholder.trigger(eventname,[pos,item])}function triggerRedrawOverlay(){var t=options.interaction.redrawOverlayInterval;if(t==-1){drawOverlay();return}if(!redrawTimeout)redrawTimeout=setTimeout(drawOverlay,t)}function drawOverlay(){redrawTimeout=null;octx.save();overlay.clear();octx.translate(plotOffset.left,plotOffset.top);var i,hi;for(i=0;i<highlights.length;++i){hi=highlights[i];if(hi.series.bars.show)drawBarHighlight(hi.series,hi.point);else drawPointHighlight(hi.series,hi.point)}octx.restore();executeHooks(hooks.drawOverlay,[octx])}function highlight(s,point,auto){if(typeof s=="number")s=series[s];if(typeof point=="number"){var ps=s.datapoints.pointsize;point=s.datapoints.points.slice(ps*point,ps*(point+1))}var i=indexOfHighlight(s,point);if(i==-1){highlights.push({series:s,point:point,auto:auto});triggerRedrawOverlay()}else if(!auto)highlights[i].auto=false}function unhighlight(s,point){if(s==null&&point==null){highlights=[];triggerRedrawOverlay();return}if(typeof s=="number")s=series[s];if(typeof point=="number"){var ps=s.datapoints.pointsize;point=s.datapoints.points.slice(ps*point,ps*(point+1))}var i=indexOfHighlight(s,point);if(i!=-1){highlights.splice(i,1);triggerRedrawOverlay()}}function indexOfHighlight(s,p){for(var i=0;i<highlights.length;++i){var h=highlights[i];if(h.series==s&&h.point[0]==p[0]&&h.point[1]==p[1])return i}return-1}function drawPointHighlight(series,point){var x=point[0],y=point[1],axisx=series.xaxis,axisy=series.yaxis,highlightColor=typeof series.highlightColor==="string"?series.highlightColor:$.color.parse(series.color).scale("a",.5).toString();if(x<axisx.min||x>axisx.max||y<axisy.min||y>axisy.max)return;var pointRadius=series.points.radius+series.points.lineWidth/2;octx.lineWidth=pointRadius;octx.strokeStyle=highlightColor;var radius=1.5*pointRadius;x=axisx.p2c(x);y=axisy.p2c(y);octx.beginPath();if(series.points.symbol=="circle")octx.arc(x,y,radius,0,2*Math.PI,false);else series.points.symbol(octx,x,y,radius,false);octx.closePath();octx.stroke()}function drawBarHighlight(series,point){var highlightColor=typeof series.highlightColor==="string"?series.highlightColor:$.color.parse(series.color).scale("a",.5).toString(),fillStyle=highlightColor,barLeft;switch(series.bars.align){case"left":barLeft=0;break;case"right":barLeft=-series.bars.barWidth;break;default:barLeft=-series.bars.barWidth/2}octx.lineWidth=series.bars.lineWidth;octx.strokeStyle=highlightColor;drawBar(point[0],point[1],point[2]||0,barLeft,barLeft+series.bars.barWidth,function(){return fillStyle},series.xaxis,series.yaxis,octx,series.bars.horizontal,series.bars.lineWidth)}function getColorOrGradient(spec,bottom,top,defaultColor){if(typeof spec=="string")return spec;else{var gradient=ctx.createLinearGradient(0,top,0,bottom);for(var i=0,l=spec.colors.length;i<l;++i){var c=spec.colors[i];if(typeof c!="string"){var co=$.color.parse(defaultColor);if(c.brightness!=null)co=co.scale("rgb",c.brightness);if(c.opacity!=null)co.a*=c.opacity;c=co.toString()}gradient.addColorStop(i/(l-1),c)}return gradient}}}$.plot=function(placeholder,data,options){var plot=new Plot($(placeholder),data,options,$.plot.plugins);return plot};$.plot.version="0.8.2";$.plot.plugins=[];$.fn.plot=function(data,options){return this.each(function(){$.plot(this,data,options)})};function floorInBase(n,base){return base*Math.floor(n/base)}})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/plugins/flot/jquery.flot.navigate.js b/theme/bootstrap/plugins/flot/jquery.flot.navigate.js new file mode 100644 index 0000000..10256b8 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.navigate.js @@ -0,0 +1,346 @@ +/* Flot plugin for adding the ability to pan and zoom the plot. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +The default behaviour is double click and scrollwheel up/down to zoom in, drag +to pan. The plugin defines plot.zoom({ center }), plot.zoomOut() and +plot.pan( offset ) so you easily can add custom controls. It also fires +"plotpan" and "plotzoom" events, useful for synchronizing plots. + +The plugin supports these options: + + zoom: { + interactive: false + trigger: "dblclick" // or "click" for single click + amount: 1.5 // 2 = 200% (zoom in), 0.5 = 50% (zoom out) + } + + pan: { + interactive: false + cursor: "move" // CSS mouse cursor value used when dragging, e.g. "pointer" + frameRate: 20 + } + + xaxis, yaxis, x2axis, y2axis: { + zoomRange: null // or [ number, number ] (min range, max range) or false + panRange: null // or [ number, number ] (min, max) or false + } + +"interactive" enables the built-in drag/click behaviour. If you enable +interactive for pan, then you'll have a basic plot that supports moving +around; the same for zoom. + +"amount" specifies the default amount to zoom in (so 1.5 = 150%) relative to +the current viewport. + +"cursor" is a standard CSS mouse cursor string used for visual feedback to the +user when dragging. + +"frameRate" specifies the maximum number of times per second the plot will +update itself while the user is panning around on it (set to null to disable +intermediate pans, the plot will then not update until the mouse button is +released). + +"zoomRange" is the interval in which zooming can happen, e.g. with zoomRange: +[1, 100] the zoom will never scale the axis so that the difference between min +and max is smaller than 1 or larger than 100. You can set either end to null +to ignore, e.g. [1, null]. If you set zoomRange to false, zooming on that axis +will be disabled. + +"panRange" confines the panning to stay within a range, e.g. with panRange: +[-10, 20] panning stops at -10 in one end and at 20 in the other. Either can +be null, e.g. [-10, null]. If you set panRange to false, panning on that axis +will be disabled. + +Example API usage: + + plot = $.plot(...); + + // zoom default amount in on the pixel ( 10, 20 ) + plot.zoom({ center: { left: 10, top: 20 } }); + + // zoom out again + plot.zoomOut({ center: { left: 10, top: 20 } }); + + // zoom 200% in on the pixel (10, 20) + plot.zoom({ amount: 2, center: { left: 10, top: 20 } }); + + // pan 100 pixels to the left and 20 down + plot.pan({ left: -100, top: 20 }) + +Here, "center" specifies where the center of the zooming should happen. Note +that this is defined in pixel space, not the space of the data points (you can +use the p2c helpers on the axes in Flot to help you convert between these). + +"amount" is the amount to zoom the viewport relative to the current range, so +1 is 100% (i.e. no change), 1.5 is 150% (zoom in), 0.7 is 70% (zoom out). You +can set the default in the options. + +*/ + +// First two dependencies, jquery.event.drag.js and +// jquery.mousewheel.js, we put them inline here to save people the +// effort of downloading them. + +/* +jquery.event.drag.js ~ v1.5 ~ Copyright (c) 2008, Three Dub Media (http://threedubmedia.com) +Licensed under the MIT License ~ http://threedubmedia.googlecode.com/files/MIT-LICENSE.txt +*/ +(function(a){function e(h){var k,j=this,l=h.data||{};if(l.elem)j=h.dragTarget=l.elem,h.dragProxy=d.proxy||j,h.cursorOffsetX=l.pageX-l.left,h.cursorOffsetY=l.pageY-l.top,h.offsetX=h.pageX-h.cursorOffsetX,h.offsetY=h.pageY-h.cursorOffsetY;else if(d.dragging||l.which>0&&h.which!=l.which||a(h.target).is(l.not))return;switch(h.type){case"mousedown":return a.extend(l,a(j).offset(),{elem:j,target:h.target,pageX:h.pageX,pageY:h.pageY}),b.add(document,"mousemove mouseup",e,l),i(j,!1),d.dragging=null,!1;case!d.dragging&&"mousemove":if(g(h.pageX-l.pageX)+g(h.pageY-l.pageY)<l.distance)break;h.target=l.target,k=f(h,"dragstart",j),k!==!1&&(d.dragging=j,d.proxy=h.dragProxy=a(k||j)[0]);case"mousemove":if(d.dragging){if(k=f(h,"drag",j),c.drop&&(c.drop.allowed=k!==!1,c.drop.handler(h)),k!==!1)break;h.type="mouseup"}case"mouseup":b.remove(document,"mousemove mouseup",e),d.dragging&&(c.drop&&c.drop.handler(h),f(h,"dragend",j)),i(j,!0),d.dragging=d.proxy=l.elem=!1}return!0}function f(b,c,d){b.type=c;var e=a.event.dispatch.call(d,b);return e===!1?!1:e||b.result}function g(a){return Math.pow(a,2)}function h(){return d.dragging===!1}function i(a,b){a&&(a.unselectable=b?"off":"on",a.onselectstart=function(){return b},a.style&&(a.style.MozUserSelect=b?"":"none"))}a.fn.drag=function(a,b,c){return b&&this.bind("dragstart",a),c&&this.bind("dragend",c),a?this.bind("drag",b?b:a):this.trigger("drag")};var b=a.event,c=b.special,d=c.drag={not:":input",distance:0,which:1,dragging:!1,setup:function(c){c=a.extend({distance:d.distance,which:d.which,not:d.not},c||{}),c.distance=g(c.distance),b.add(this,"mousedown",e,c),this.attachEvent&&this.attachEvent("ondragstart",h)},teardown:function(){b.remove(this,"mousedown",e),this===d.dragging&&(d.dragging=d.proxy=!1),i(this,!0),this.detachEvent&&this.detachEvent("ondragstart",h)}};c.dragstart=c.dragend={setup:function(){},teardown:function(){}}})(jQuery); + +/* jquery.mousewheel.min.js + * Copyright (c) 2011 Brandon Aaron (http://brandonaaron.net) + * Licensed under the MIT License (LICENSE.txt). + * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers. + * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix. + * Thanks to: Seamus Leahy for adding deltaX and deltaY + * + * Version: 3.0.6 + * + * Requires: 1.2.2+ + */ +(function(d){function e(a){var b=a||window.event,c=[].slice.call(arguments,1),f=0,e=0,g=0,a=d.event.fix(b);a.type="mousewheel";b.wheelDelta&&(f=b.wheelDelta/120);b.detail&&(f=-b.detail/3);g=f;void 0!==b.axis&&b.axis===b.HORIZONTAL_AXIS&&(g=0,e=-1*f);void 0!==b.wheelDeltaY&&(g=b.wheelDeltaY/120);void 0!==b.wheelDeltaX&&(e=-1*b.wheelDeltaX/120);c.unshift(a,f,e,g);return(d.event.dispatch||d.event.handle).apply(this,c)}var c=["DOMMouseScroll","mousewheel"];if(d.event.fixHooks)for(var h=c.length;h;)d.event.fixHooks[c[--h]]=d.event.mouseHooks;d.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var a=c.length;a;)this.addEventListener(c[--a],e,!1);else this.onmousewheel=e},teardown:function(){if(this.removeEventListener)for(var a=c.length;a;)this.removeEventListener(c[--a],e,!1);else this.onmousewheel=null}};d.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})})(jQuery); + + + + +(function ($) { + var options = { + xaxis: { + zoomRange: null, // or [number, number] (min range, max range) + panRange: null // or [number, number] (min, max) + }, + zoom: { + interactive: false, + trigger: "dblclick", // or "click" for single click + amount: 1.5 // how much to zoom relative to current position, 2 = 200% (zoom in), 0.5 = 50% (zoom out) + }, + pan: { + interactive: false, + cursor: "move", + frameRate: 20 + } + }; + + function init(plot) { + function onZoomClick(e, zoomOut) { + var c = plot.offset(); + c.left = e.pageX - c.left; + c.top = e.pageY - c.top; + if (zoomOut) + plot.zoomOut({ center: c }); + else + plot.zoom({ center: c }); + } + + function onMouseWheel(e, delta) { + e.preventDefault(); + onZoomClick(e, delta < 0); + return false; + } + + var prevCursor = 'default', prevPageX = 0, prevPageY = 0, + panTimeout = null; + + function onDragStart(e) { + if (e.which != 1) // only accept left-click + return false; + var c = plot.getPlaceholder().css('cursor'); + if (c) + prevCursor = c; + plot.getPlaceholder().css('cursor', plot.getOptions().pan.cursor); + prevPageX = e.pageX; + prevPageY = e.pageY; + } + + function onDrag(e) { + var frameRate = plot.getOptions().pan.frameRate; + if (panTimeout || !frameRate) + return; + + panTimeout = setTimeout(function () { + plot.pan({ left: prevPageX - e.pageX, + top: prevPageY - e.pageY }); + prevPageX = e.pageX; + prevPageY = e.pageY; + + panTimeout = null; + }, 1 / frameRate * 1000); + } + + function onDragEnd(e) { + if (panTimeout) { + clearTimeout(panTimeout); + panTimeout = null; + } + + plot.getPlaceholder().css('cursor', prevCursor); + plot.pan({ left: prevPageX - e.pageX, + top: prevPageY - e.pageY }); + } + + function bindEvents(plot, eventHolder) { + var o = plot.getOptions(); + if (o.zoom.interactive) { + eventHolder[o.zoom.trigger](onZoomClick); + eventHolder.mousewheel(onMouseWheel); + } + + if (o.pan.interactive) { + eventHolder.bind("dragstart", { distance: 10 }, onDragStart); + eventHolder.bind("drag", onDrag); + eventHolder.bind("dragend", onDragEnd); + } + } + + plot.zoomOut = function (args) { + if (!args) + args = {}; + + if (!args.amount) + args.amount = plot.getOptions().zoom.amount; + + args.amount = 1 / args.amount; + plot.zoom(args); + }; + + plot.zoom = function (args) { + if (!args) + args = {}; + + var c = args.center, + amount = args.amount || plot.getOptions().zoom.amount, + w = plot.width(), h = plot.height(); + + if (!c) + c = { left: w / 2, top: h / 2 }; + + var xf = c.left / w, + yf = c.top / h, + minmax = { + x: { + min: c.left - xf * w / amount, + max: c.left + (1 - xf) * w / amount + }, + y: { + min: c.top - yf * h / amount, + max: c.top + (1 - yf) * h / amount + } + }; + + $.each(plot.getAxes(), function(_, axis) { + var opts = axis.options, + min = minmax[axis.direction].min, + max = minmax[axis.direction].max, + zr = opts.zoomRange, + pr = opts.panRange; + + if (zr === false) // no zooming on this axis + return; + + min = axis.c2p(min); + max = axis.c2p(max); + if (min > max) { + // make sure min < max + var tmp = min; + min = max; + max = tmp; + } + + //Check that we are in panRange + if (pr) { + if (pr[0] != null && min < pr[0]) { + min = pr[0]; + } + if (pr[1] != null && max > pr[1]) { + max = pr[1]; + } + } + + var range = max - min; + if (zr && + ((zr[0] != null && range < zr[0]) || + (zr[1] != null && range > zr[1]))) + return; + + opts.min = min; + opts.max = max; + }); + + plot.setupGrid(); + plot.draw(); + + if (!args.preventEvent) + plot.getPlaceholder().trigger("plotzoom", [ plot, args ]); + }; + + plot.pan = function (args) { + var delta = { + x: +args.left, + y: +args.top + }; + + if (isNaN(delta.x)) + delta.x = 0; + if (isNaN(delta.y)) + delta.y = 0; + + $.each(plot.getAxes(), function (_, axis) { + var opts = axis.options, + min, max, d = delta[axis.direction]; + + min = axis.c2p(axis.p2c(axis.min) + d), + max = axis.c2p(axis.p2c(axis.max) + d); + + var pr = opts.panRange; + if (pr === false) // no panning on this axis + return; + + if (pr) { + // check whether we hit the wall + if (pr[0] != null && pr[0] > min) { + d = pr[0] - min; + min += d; + max += d; + } + + if (pr[1] != null && pr[1] < max) { + d = pr[1] - max; + min += d; + max += d; + } + } + + opts.min = min; + opts.max = max; + }); + + plot.setupGrid(); + plot.draw(); + + if (!args.preventEvent) + plot.getPlaceholder().trigger("plotpan", [ plot, args ]); + }; + + function shutdown(plot, eventHolder) { + eventHolder.unbind(plot.getOptions().zoom.trigger, onZoomClick); + eventHolder.unbind("mousewheel", onMouseWheel); + eventHolder.unbind("dragstart", onDragStart); + eventHolder.unbind("drag", onDrag); + eventHolder.unbind("dragend", onDragEnd); + if (panTimeout) + clearTimeout(panTimeout); + } + + plot.hooks.bindEvents.push(bindEvents); + plot.hooks.shutdown.push(shutdown); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'navigate', + version: '1.3' + }); +})(jQuery); diff --git a/theme/bootstrap/plugins/flot/jquery.flot.navigate.min.js b/theme/bootstrap/plugins/flot/jquery.flot.navigate.min.js new file mode 100644 index 0000000..a69a939 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.navigate.min.js @@ -0,0 +1 @@ +(function(a){function e(h){var k,j=this,l=h.data||{};if(l.elem)j=h.dragTarget=l.elem,h.dragProxy=d.proxy||j,h.cursorOffsetX=l.pageX-l.left,h.cursorOffsetY=l.pageY-l.top,h.offsetX=h.pageX-h.cursorOffsetX,h.offsetY=h.pageY-h.cursorOffsetY;else if(d.dragging||l.which>0&&h.which!=l.which||a(h.target).is(l.not))return;switch(h.type){case"mousedown":return a.extend(l,a(j).offset(),{elem:j,target:h.target,pageX:h.pageX,pageY:h.pageY}),b.add(document,"mousemove mouseup",e,l),i(j,!1),d.dragging=null,!1;case!d.dragging&&"mousemove":if(g(h.pageX-l.pageX)+g(h.pageY-l.pageY)<l.distance)break;h.target=l.target,k=f(h,"dragstart",j),k!==!1&&(d.dragging=j,d.proxy=h.dragProxy=a(k||j)[0]);case"mousemove":if(d.dragging){if(k=f(h,"drag",j),c.drop&&(c.drop.allowed=k!==!1,c.drop.handler(h)),k!==!1)break;h.type="mouseup"}case"mouseup":b.remove(document,"mousemove mouseup",e),d.dragging&&(c.drop&&c.drop.handler(h),f(h,"dragend",j)),i(j,!0),d.dragging=d.proxy=l.elem=!1}return!0}function f(b,c,d){b.type=c;var e=a.event.dispatch.call(d,b);return e===!1?!1:e||b.result}function g(a){return Math.pow(a,2)}function h(){return d.dragging===!1}function i(a,b){a&&(a.unselectable=b?"off":"on",a.onselectstart=function(){return b},a.style&&(a.style.MozUserSelect=b?"":"none"))}a.fn.drag=function(a,b,c){return b&&this.bind("dragstart",a),c&&this.bind("dragend",c),a?this.bind("drag",b?b:a):this.trigger("drag")};var b=a.event,c=b.special,d=c.drag={not:":input",distance:0,which:1,dragging:!1,setup:function(c){c=a.extend({distance:d.distance,which:d.which,not:d.not},c||{}),c.distance=g(c.distance),b.add(this,"mousedown",e,c),this.attachEvent&&this.attachEvent("ondragstart",h)},teardown:function(){b.remove(this,"mousedown",e),this===d.dragging&&(d.dragging=d.proxy=!1),i(this,!0),this.detachEvent&&this.detachEvent("ondragstart",h)}};c.dragstart=c.dragend={setup:function(){},teardown:function(){}}})(jQuery);(function(d){function e(a){var b=a||window.event,c=[].slice.call(arguments,1),f=0,e=0,g=0,a=d.event.fix(b);a.type="mousewheel";b.wheelDelta&&(f=b.wheelDelta/120);b.detail&&(f=-b.detail/3);g=f;void 0!==b.axis&&b.axis===b.HORIZONTAL_AXIS&&(g=0,e=-1*f);void 0!==b.wheelDeltaY&&(g=b.wheelDeltaY/120);void 0!==b.wheelDeltaX&&(e=-1*b.wheelDeltaX/120);c.unshift(a,f,e,g);return(d.event.dispatch||d.event.handle).apply(this,c)}var c=["DOMMouseScroll","mousewheel"];if(d.event.fixHooks)for(var h=c.length;h;)d.event.fixHooks[c[--h]]=d.event.mouseHooks;d.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var a=c.length;a;)this.addEventListener(c[--a],e,!1);else this.onmousewheel=e},teardown:function(){if(this.removeEventListener)for(var a=c.length;a;)this.removeEventListener(c[--a],e,!1);else this.onmousewheel=null}};d.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})})(jQuery);(function($){var options={xaxis:{zoomRange:null,panRange:null},zoom:{interactive:false,trigger:"dblclick",amount:1.5},pan:{interactive:false,cursor:"move",frameRate:20}};function init(plot){function onZoomClick(e,zoomOut){var c=plot.offset();c.left=e.pageX-c.left;c.top=e.pageY-c.top;if(zoomOut)plot.zoomOut({center:c});else plot.zoom({center:c})}function onMouseWheel(e,delta){e.preventDefault();onZoomClick(e,delta<0);return false}var prevCursor="default",prevPageX=0,prevPageY=0,panTimeout=null;function onDragStart(e){if(e.which!=1)return false;var c=plot.getPlaceholder().css("cursor");if(c)prevCursor=c;plot.getPlaceholder().css("cursor",plot.getOptions().pan.cursor);prevPageX=e.pageX;prevPageY=e.pageY}function onDrag(e){var frameRate=plot.getOptions().pan.frameRate;if(panTimeout||!frameRate)return;panTimeout=setTimeout(function(){plot.pan({left:prevPageX-e.pageX,top:prevPageY-e.pageY});prevPageX=e.pageX;prevPageY=e.pageY;panTimeout=null},1/frameRate*1e3)}function onDragEnd(e){if(panTimeout){clearTimeout(panTimeout);panTimeout=null}plot.getPlaceholder().css("cursor",prevCursor);plot.pan({left:prevPageX-e.pageX,top:prevPageY-e.pageY})}function bindEvents(plot,eventHolder){var o=plot.getOptions();if(o.zoom.interactive){eventHolder[o.zoom.trigger](onZoomClick);eventHolder.mousewheel(onMouseWheel)}if(o.pan.interactive){eventHolder.bind("dragstart",{distance:10},onDragStart);eventHolder.bind("drag",onDrag);eventHolder.bind("dragend",onDragEnd)}}plot.zoomOut=function(args){if(!args)args={};if(!args.amount)args.amount=plot.getOptions().zoom.amount;args.amount=1/args.amount;plot.zoom(args)};plot.zoom=function(args){if(!args)args={};var c=args.center,amount=args.amount||plot.getOptions().zoom.amount,w=plot.width(),h=plot.height();if(!c)c={left:w/2,top:h/2};var xf=c.left/w,yf=c.top/h,minmax={x:{min:c.left-xf*w/amount,max:c.left+(1-xf)*w/amount},y:{min:c.top-yf*h/amount,max:c.top+(1-yf)*h/amount}};$.each(plot.getAxes(),function(_,axis){var opts=axis.options,min=minmax[axis.direction].min,max=minmax[axis.direction].max,zr=opts.zoomRange,pr=opts.panRange;if(zr===false)return;min=axis.c2p(min);max=axis.c2p(max);if(min>max){var tmp=min;min=max;max=tmp}if(pr){if(pr[0]!=null&&min<pr[0]){min=pr[0]}if(pr[1]!=null&&max>pr[1]){max=pr[1]}}var range=max-min;if(zr&&(zr[0]!=null&&range<zr[0]||zr[1]!=null&&range>zr[1]))return;opts.min=min;opts.max=max});plot.setupGrid();plot.draw();if(!args.preventEvent)plot.getPlaceholder().trigger("plotzoom",[plot,args])};plot.pan=function(args){var delta={x:+args.left,y:+args.top};if(isNaN(delta.x))delta.x=0;if(isNaN(delta.y))delta.y=0;$.each(plot.getAxes(),function(_,axis){var opts=axis.options,min,max,d=delta[axis.direction];min=axis.c2p(axis.p2c(axis.min)+d),max=axis.c2p(axis.p2c(axis.max)+d);var pr=opts.panRange;if(pr===false)return;if(pr){if(pr[0]!=null&&pr[0]>min){d=pr[0]-min;min+=d;max+=d}if(pr[1]!=null&&pr[1]<max){d=pr[1]-max;min+=d;max+=d}}opts.min=min;opts.max=max});plot.setupGrid();plot.draw();if(!args.preventEvent)plot.getPlaceholder().trigger("plotpan",[plot,args])};function shutdown(plot,eventHolder){eventHolder.unbind(plot.getOptions().zoom.trigger,onZoomClick);eventHolder.unbind("mousewheel",onMouseWheel);eventHolder.unbind("dragstart",onDragStart);eventHolder.unbind("drag",onDrag);eventHolder.unbind("dragend",onDragEnd);if(panTimeout)clearTimeout(panTimeout)}plot.hooks.bindEvents.push(bindEvents);plot.hooks.shutdown.push(shutdown)}$.plot.plugins.push({init:init,options:options,name:"navigate",version:"1.3"})})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/plugins/flot/jquery.flot.pie.js b/theme/bootstrap/plugins/flot/jquery.flot.pie.js new file mode 100644 index 0000000..bf190e1 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.pie.js @@ -0,0 +1,817 @@ +/* Flot plugin for rendering pie charts. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +The plugin assumes that each series has a single data value, and that each +value is a positive integer or zero. Negative numbers don't make sense for a +pie chart, and have unpredictable results. The values do NOT need to be +passed in as percentages; the plugin will calculate the total and per-slice +percentages internally. + +* Created by Brian Medendorp + +* Updated with contributions from btburnett3, Anthony Aragues and Xavi Ivars + +The plugin supports these options: + + series: { + pie: { + show: true/false + radius: 0-1 for percentage of fullsize, or a specified pixel length, or 'auto' + innerRadius: 0-1 for percentage of fullsize or a specified pixel length, for creating a donut effect + startAngle: 0-2 factor of PI used for starting angle (in radians) i.e 3/2 starts at the top, 0 and 2 have the same result + tilt: 0-1 for percentage to tilt the pie, where 1 is no tilt, and 0 is completely flat (nothing will show) + offset: { + top: integer value to move the pie up or down + left: integer value to move the pie left or right, or 'auto' + }, + stroke: { + color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#FFF') + width: integer pixel width of the stroke + }, + label: { + show: true/false, or 'auto' + formatter: a user-defined function that modifies the text/style of the label text + radius: 0-1 for percentage of fullsize, or a specified pixel length + background: { + color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#000') + opacity: 0-1 + }, + threshold: 0-1 for the percentage value at which to hide labels (if they're too small) + }, + combine: { + threshold: 0-1 for the percentage value at which to combine slices (if they're too small) + color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#CCC'), if null, the plugin will automatically use the color of the first slice to be combined + label: any text value of what the combined slice should be labeled + } + highlight: { + opacity: 0-1 + } + } + } + +More detail and specific examples can be found in the included HTML file. + +*/ + +(function($) { + + // Maximum redraw attempts when fitting labels within the plot + + var REDRAW_ATTEMPTS = 10; + + // Factor by which to shrink the pie when fitting labels within the plot + + var REDRAW_SHRINK = 0.95; + + function init(plot) { + + var canvas = null, + target = null, + options = null, + maxRadius = null, + centerLeft = null, + centerTop = null, + processed = false, + ctx = null; + + // interactive variables + + var highlights = []; + + // add hook to determine if pie plugin in enabled, and then perform necessary operations + + plot.hooks.processOptions.push(function(plot, options) { + if (options.series.pie.show) { + + options.grid.show = false; + + // set labels.show + + if (options.series.pie.label.show == "auto") { + if (options.legend.show) { + options.series.pie.label.show = false; + } else { + options.series.pie.label.show = true; + } + } + + // set radius + + if (options.series.pie.radius == "auto") { + if (options.series.pie.label.show) { + options.series.pie.radius = 3/4; + } else { + options.series.pie.radius = 1; + } + } + + // ensure sane tilt + + if (options.series.pie.tilt > 1) { + options.series.pie.tilt = 1; + } else if (options.series.pie.tilt < 0) { + options.series.pie.tilt = 0; + } + } + }); + + plot.hooks.bindEvents.push(function(plot, eventHolder) { + var options = plot.getOptions(); + if (options.series.pie.show) { + if (options.grid.hoverable) { + eventHolder.unbind("mousemove").mousemove(onMouseMove); + } + if (options.grid.clickable) { + eventHolder.unbind("click").click(onClick); + } + } + }); + + plot.hooks.processDatapoints.push(function(plot, series, data, datapoints) { + var options = plot.getOptions(); + if (options.series.pie.show) { + processDatapoints(plot, series, data, datapoints); + } + }); + + plot.hooks.drawOverlay.push(function(plot, octx) { + var options = plot.getOptions(); + if (options.series.pie.show) { + drawOverlay(plot, octx); + } + }); + + plot.hooks.draw.push(function(plot, newCtx) { + var options = plot.getOptions(); + if (options.series.pie.show) { + draw(plot, newCtx); + } + }); + + function processDatapoints(plot, series, datapoints) { + if (!processed) { + processed = true; + canvas = plot.getCanvas(); + target = $(canvas).parent(); + options = plot.getOptions(); + plot.setData(combine(plot.getData())); + } + } + + function combine(data) { + + var total = 0, + combined = 0, + numCombined = 0, + color = options.series.pie.combine.color, + newdata = []; + + // Fix up the raw data from Flot, ensuring the data is numeric + + for (var i = 0; i < data.length; ++i) { + + var value = data[i].data; + + // If the data is an array, we'll assume that it's a standard + // Flot x-y pair, and are concerned only with the second value. + + // Note how we use the original array, rather than creating a + // new one; this is more efficient and preserves any extra data + // that the user may have stored in higher indexes. + + if ($.isArray(value) && value.length == 1) { + value = value[0]; + } + + if ($.isArray(value)) { + // Equivalent to $.isNumeric() but compatible with jQuery < 1.7 + if (!isNaN(parseFloat(value[1])) && isFinite(value[1])) { + value[1] = +value[1]; + } else { + value[1] = 0; + } + } else if (!isNaN(parseFloat(value)) && isFinite(value)) { + value = [1, +value]; + } else { + value = [1, 0]; + } + + data[i].data = [value]; + } + + // Sum up all the slices, so we can calculate percentages for each + + for (var i = 0; i < data.length; ++i) { + total += data[i].data[0][1]; + } + + // Count the number of slices with percentages below the combine + // threshold; if it turns out to be just one, we won't combine. + + for (var i = 0; i < data.length; ++i) { + var value = data[i].data[0][1]; + if (value / total <= options.series.pie.combine.threshold) { + combined += value; + numCombined++; + if (!color) { + color = data[i].color; + } + } + } + + for (var i = 0; i < data.length; ++i) { + var value = data[i].data[0][1]; + if (numCombined < 2 || value / total > options.series.pie.combine.threshold) { + newdata.push({ + data: [[1, value]], + color: data[i].color, + label: data[i].label, + angle: value * Math.PI * 2 / total, + percent: value / (total / 100) + }); + } + } + + if (numCombined > 1) { + newdata.push({ + data: [[1, combined]], + color: color, + label: options.series.pie.combine.label, + angle: combined * Math.PI * 2 / total, + percent: combined / (total / 100) + }); + } + + return newdata; + } + + function draw(plot, newCtx) { + + if (!target) { + return; // if no series were passed + } + + var canvasWidth = plot.getPlaceholder().width(), + canvasHeight = plot.getPlaceholder().height(), + legendWidth = target.children().filter(".legend").children().width() || 0; + + ctx = newCtx; + + // WARNING: HACK! REWRITE THIS CODE AS SOON AS POSSIBLE! + + // When combining smaller slices into an 'other' slice, we need to + // add a new series. Since Flot gives plugins no way to modify the + // list of series, the pie plugin uses a hack where the first call + // to processDatapoints results in a call to setData with the new + // list of series, then subsequent processDatapoints do nothing. + + // The plugin-global 'processed' flag is used to control this hack; + // it starts out false, and is set to true after the first call to + // processDatapoints. + + // Unfortunately this turns future setData calls into no-ops; they + // call processDatapoints, the flag is true, and nothing happens. + + // To fix this we'll set the flag back to false here in draw, when + // all series have been processed, so the next sequence of calls to + // processDatapoints once again starts out with a slice-combine. + // This is really a hack; in 0.9 we need to give plugins a proper + // way to modify series before any processing begins. + + processed = false; + + // calculate maximum radius and center point + + maxRadius = Math.min(canvasWidth, canvasHeight / options.series.pie.tilt) / 2; + centerTop = canvasHeight / 2 + options.series.pie.offset.top; + centerLeft = canvasWidth / 2; + + if (options.series.pie.offset.left == "auto") { + if (options.legend.position.match("w")) { + centerLeft += legendWidth / 2; + } else { + centerLeft -= legendWidth / 2; + } + if (centerLeft < maxRadius) { + centerLeft = maxRadius; + } else if (centerLeft > canvasWidth - maxRadius) { + centerLeft = canvasWidth - maxRadius; + } + } else { + centerLeft += options.series.pie.offset.left; + } + + var slices = plot.getData(), + attempts = 0; + + // Keep shrinking the pie's radius until drawPie returns true, + // indicating that all the labels fit, or we try too many times. + + do { + if (attempts > 0) { + maxRadius *= REDRAW_SHRINK; + } + attempts += 1; + clear(); + if (options.series.pie.tilt <= 0.8) { + drawShadow(); + } + } while (!drawPie() && attempts < REDRAW_ATTEMPTS); + + if (attempts >= REDRAW_ATTEMPTS) { + clear(); + target.prepend("<div class='error'>Could not draw pie with labels contained inside canvas</div>"); + } + + if (plot.setSeries && plot.insertLegend) { + plot.setSeries(slices); + plot.insertLegend(); + } + + // we're actually done at this point, just defining internal functions at this point + + function clear() { + ctx.clearRect(0, 0, canvasWidth, canvasHeight); + target.children().filter(".pieLabel, .pieLabelBackground").remove(); + } + + function drawShadow() { + + var shadowLeft = options.series.pie.shadow.left; + var shadowTop = options.series.pie.shadow.top; + var edge = 10; + var alpha = options.series.pie.shadow.alpha; + var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; + + if (radius >= canvasWidth / 2 - shadowLeft || radius * options.series.pie.tilt >= canvasHeight / 2 - shadowTop || radius <= edge) { + return; // shadow would be outside canvas, so don't draw it + } + + ctx.save(); + ctx.translate(shadowLeft,shadowTop); + ctx.globalAlpha = alpha; + ctx.fillStyle = "#000"; + + // center and rotate to starting position + + ctx.translate(centerLeft,centerTop); + ctx.scale(1, options.series.pie.tilt); + + //radius -= edge; + + for (var i = 1; i <= edge; i++) { + ctx.beginPath(); + ctx.arc(0, 0, radius, 0, Math.PI * 2, false); + ctx.fill(); + radius -= i; + } + + ctx.restore(); + } + + function drawPie() { + + var startAngle = Math.PI * options.series.pie.startAngle; + var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; + + // center and rotate to starting position + + ctx.save(); + ctx.translate(centerLeft,centerTop); + ctx.scale(1, options.series.pie.tilt); + //ctx.rotate(startAngle); // start at top; -- This doesn't work properly in Opera + + // draw slices + + ctx.save(); + var currentAngle = startAngle; + for (var i = 0; i < slices.length; ++i) { + slices[i].startAngle = currentAngle; + drawSlice(slices[i].angle, slices[i].color, true); + } + ctx.restore(); + + // draw slice outlines + + if (options.series.pie.stroke.width > 0) { + ctx.save(); + ctx.lineWidth = options.series.pie.stroke.width; + currentAngle = startAngle; + for (var i = 0; i < slices.length; ++i) { + drawSlice(slices[i].angle, options.series.pie.stroke.color, false); + } + ctx.restore(); + } + + // draw donut hole + + drawDonutHole(ctx); + + ctx.restore(); + + // Draw the labels, returning true if they fit within the plot + + if (options.series.pie.label.show) { + return drawLabels(); + } else return true; + + function drawSlice(angle, color, fill) { + + if (angle <= 0 || isNaN(angle)) { + return; + } + + if (fill) { + ctx.fillStyle = color; + } else { + ctx.strokeStyle = color; + ctx.lineJoin = "round"; + } + + ctx.beginPath(); + if (Math.abs(angle - Math.PI * 2) > 0.000000001) { + ctx.moveTo(0, 0); // Center of the pie + } + + //ctx.arc(0, 0, radius, 0, angle, false); // This doesn't work properly in Opera + ctx.arc(0, 0, radius,currentAngle, currentAngle + angle / 2, false); + ctx.arc(0, 0, radius,currentAngle + angle / 2, currentAngle + angle, false); + ctx.closePath(); + //ctx.rotate(angle); // This doesn't work properly in Opera + currentAngle += angle; + + if (fill) { + ctx.fill(); + } else { + ctx.stroke(); + } + } + + function drawLabels() { + + var currentAngle = startAngle; + var radius = options.series.pie.label.radius > 1 ? options.series.pie.label.radius : maxRadius * options.series.pie.label.radius; + + for (var i = 0; i < slices.length; ++i) { + if (slices[i].percent >= options.series.pie.label.threshold * 100) { + if (!drawLabel(slices[i], currentAngle, i)) { + return false; + } + } + currentAngle += slices[i].angle; + } + + return true; + + function drawLabel(slice, startAngle, index) { + + if (slice.data[0][1] == 0) { + return true; + } + + // format label text + + var lf = options.legend.labelFormatter, text, plf = options.series.pie.label.formatter; + + if (lf) { + text = lf(slice.label, slice); + } else { + text = slice.label; + } + + if (plf) { + text = plf(text, slice); + } + + var halfAngle = ((startAngle + slice.angle) + startAngle) / 2; + var x = centerLeft + Math.round(Math.cos(halfAngle) * radius); + var y = centerTop + Math.round(Math.sin(halfAngle) * radius) * options.series.pie.tilt; + + var html = "<span class='pieLabel' id='pieLabel" + index + "' style='position:absolute;top:" + y + "px;left:" + x + "px;'>" + text + "</span>"; + target.append(html); + + var label = target.children("#pieLabel" + index); + var labelTop = (y - label.height() / 2); + var labelLeft = (x - label.width() / 2); + + label.css("top", labelTop); + label.css("left", labelLeft); + + // check to make sure that the label is not outside the canvas + + if (0 - labelTop > 0 || 0 - labelLeft > 0 || canvasHeight - (labelTop + label.height()) < 0 || canvasWidth - (labelLeft + label.width()) < 0) { + return false; + } + + if (options.series.pie.label.background.opacity != 0) { + + // put in the transparent background separately to avoid blended labels and label boxes + + var c = options.series.pie.label.background.color; + + if (c == null) { + c = slice.color; + } + + var pos = "top:" + labelTop + "px;left:" + labelLeft + "px;"; + $("<div class='pieLabelBackground' style='position:absolute;width:" + label.width() + "px;height:" + label.height() + "px;" + pos + "background-color:" + c + ";'></div>") + .css("opacity", options.series.pie.label.background.opacity) + .insertBefore(label); + } + + return true; + } // end individual label function + } // end drawLabels function + } // end drawPie function + } // end draw function + + // Placed here because it needs to be accessed from multiple locations + + function drawDonutHole(layer) { + if (options.series.pie.innerRadius > 0) { + + // subtract the center + + layer.save(); + var innerRadius = options.series.pie.innerRadius > 1 ? options.series.pie.innerRadius : maxRadius * options.series.pie.innerRadius; + layer.globalCompositeOperation = "destination-out"; // this does not work with excanvas, but it will fall back to using the stroke color + layer.beginPath(); + layer.fillStyle = options.series.pie.stroke.color; + layer.arc(0, 0, innerRadius, 0, Math.PI * 2, false); + layer.fill(); + layer.closePath(); + layer.restore(); + + // add inner stroke + + layer.save(); + layer.beginPath(); + layer.strokeStyle = options.series.pie.stroke.color; + layer.arc(0, 0, innerRadius, 0, Math.PI * 2, false); + layer.stroke(); + layer.closePath(); + layer.restore(); + + // TODO: add extra shadow inside hole (with a mask) if the pie is tilted. + } + } + + //-- Additional Interactive related functions -- + + function isPointInPoly(poly, pt) { + for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i) + ((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || (poly[j][1] <= pt[1] && pt[1]< poly[i][1])) + && (pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0]) + && (c = !c); + return c; + } + + function findNearbySlice(mouseX, mouseY) { + + var slices = plot.getData(), + options = plot.getOptions(), + radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius, + x, y; + + for (var i = 0; i < slices.length; ++i) { + + var s = slices[i]; + + if (s.pie.show) { + + ctx.save(); + ctx.beginPath(); + ctx.moveTo(0, 0); // Center of the pie + //ctx.scale(1, options.series.pie.tilt); // this actually seems to break everything when here. + ctx.arc(0, 0, radius, s.startAngle, s.startAngle + s.angle / 2, false); + ctx.arc(0, 0, radius, s.startAngle + s.angle / 2, s.startAngle + s.angle, false); + ctx.closePath(); + x = mouseX - centerLeft; + y = mouseY - centerTop; + + if (ctx.isPointInPath) { + if (ctx.isPointInPath(mouseX - centerLeft, mouseY - centerTop)) { + ctx.restore(); + return { + datapoint: [s.percent, s.data], + dataIndex: 0, + series: s, + seriesIndex: i + }; + } + } else { + + // excanvas for IE doesn;t support isPointInPath, this is a workaround. + + var p1X = radius * Math.cos(s.startAngle), + p1Y = radius * Math.sin(s.startAngle), + p2X = radius * Math.cos(s.startAngle + s.angle / 4), + p2Y = radius * Math.sin(s.startAngle + s.angle / 4), + p3X = radius * Math.cos(s.startAngle + s.angle / 2), + p3Y = radius * Math.sin(s.startAngle + s.angle / 2), + p4X = radius * Math.cos(s.startAngle + s.angle / 1.5), + p4Y = radius * Math.sin(s.startAngle + s.angle / 1.5), + p5X = radius * Math.cos(s.startAngle + s.angle), + p5Y = radius * Math.sin(s.startAngle + s.angle), + arrPoly = [[0, 0], [p1X, p1Y], [p2X, p2Y], [p3X, p3Y], [p4X, p4Y], [p5X, p5Y]], + arrPoint = [x, y]; + + // TODO: perhaps do some mathmatical trickery here with the Y-coordinate to compensate for pie tilt? + + if (isPointInPoly(arrPoly, arrPoint)) { + ctx.restore(); + return { + datapoint: [s.percent, s.data], + dataIndex: 0, + series: s, + seriesIndex: i + }; + } + } + + ctx.restore(); + } + } + + return null; + } + + function onMouseMove(e) { + triggerClickHoverEvent("plothover", e); + } + + function onClick(e) { + triggerClickHoverEvent("plotclick", e); + } + + // trigger click or hover event (they send the same parameters so we share their code) + + function triggerClickHoverEvent(eventname, e) { + + var offset = plot.offset(); + var canvasX = parseInt(e.pageX - offset.left); + var canvasY = parseInt(e.pageY - offset.top); + var item = findNearbySlice(canvasX, canvasY); + + if (options.grid.autoHighlight) { + + // clear auto-highlights + + for (var i = 0; i < highlights.length; ++i) { + var h = highlights[i]; + if (h.auto == eventname && !(item && h.series == item.series)) { + unhighlight(h.series); + } + } + } + + // highlight the slice + + if (item) { + highlight(item.series, eventname); + } + + // trigger any hover bind events + + var pos = { pageX: e.pageX, pageY: e.pageY }; + target.trigger(eventname, [pos, item]); + } + + function highlight(s, auto) { + //if (typeof s == "number") { + // s = series[s]; + //} + + var i = indexOfHighlight(s); + + if (i == -1) { + highlights.push({ series: s, auto: auto }); + plot.triggerRedrawOverlay(); + } else if (!auto) { + highlights[i].auto = false; + } + } + + function unhighlight(s) { + if (s == null) { + highlights = []; + plot.triggerRedrawOverlay(); + } + + //if (typeof s == "number") { + // s = series[s]; + //} + + var i = indexOfHighlight(s); + + if (i != -1) { + highlights.splice(i, 1); + plot.triggerRedrawOverlay(); + } + } + + function indexOfHighlight(s) { + for (var i = 0; i < highlights.length; ++i) { + var h = highlights[i]; + if (h.series == s) + return i; + } + return -1; + } + + function drawOverlay(plot, octx) { + + var options = plot.getOptions(); + + var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; + + octx.save(); + octx.translate(centerLeft, centerTop); + octx.scale(1, options.series.pie.tilt); + + for (var i = 0; i < highlights.length; ++i) { + drawHighlight(highlights[i].series); + } + + drawDonutHole(octx); + + octx.restore(); + + function drawHighlight(series) { + + if (series.angle <= 0 || isNaN(series.angle)) { + return; + } + + //octx.fillStyle = parseColor(options.series.pie.highlight.color).scale(null, null, null, options.series.pie.highlight.opacity).toString(); + octx.fillStyle = "rgba(255, 255, 255, " + options.series.pie.highlight.opacity + ")"; // this is temporary until we have access to parseColor + octx.beginPath(); + if (Math.abs(series.angle - Math.PI * 2) > 0.000000001) { + octx.moveTo(0, 0); // Center of the pie + } + octx.arc(0, 0, radius, series.startAngle, series.startAngle + series.angle / 2, false); + octx.arc(0, 0, radius, series.startAngle + series.angle / 2, series.startAngle + series.angle, false); + octx.closePath(); + octx.fill(); + } + } + } // end init (plugin body) + + // define pie specific options and their default values + + var options = { + series: { + pie: { + show: false, + radius: "auto", // actual radius of the visible pie (based on full calculated radius if <=1, or hard pixel value) + innerRadius: 0, /* for donut */ + startAngle: 3/2, + tilt: 1, + shadow: { + left: 5, // shadow left offset + top: 15, // shadow top offset + alpha: 0.02 // shadow alpha + }, + offset: { + top: 0, + left: "auto" + }, + stroke: { + color: "#fff", + width: 1 + }, + label: { + show: "auto", + formatter: function(label, slice) { + return "<div style='font-size:x-small;text-align:center;padding:2px;color:" + slice.color + ";'>" + label + "<br/>" + Math.round(slice.percent) + "%</div>"; + }, // formatter function + radius: 1, // radius at which to place the labels (based on full calculated radius if <=1, or hard pixel value) + background: { + color: null, + opacity: 0 + }, + threshold: 0 // percentage at which to hide the label (i.e. the slice is too narrow) + }, + combine: { + threshold: -1, // percentage at which to combine little slices into one larger slice + color: null, // color to give the new slice (auto-generated if null) + label: "Other" // label to give the new slice + }, + highlight: { + //color: "#fff", // will add this functionality once parseColor is available + opacity: 0.5 + } + } + } + }; + + $.plot.plugins.push({ + init: init, + options: options, + name: "pie", + version: "1.1" + }); + +})(jQuery); diff --git a/theme/bootstrap/plugins/flot/jquery.flot.pie.min.js b/theme/bootstrap/plugins/flot/jquery.flot.pie.min.js new file mode 100644 index 0000000..88ffc9c --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.pie.min.js @@ -0,0 +1 @@ +(function($){var REDRAW_ATTEMPTS=10;var REDRAW_SHRINK=.95;function init(plot){var canvas=null,target=null,options=null,maxRadius=null,centerLeft=null,centerTop=null,processed=false,ctx=null;var highlights=[];plot.hooks.processOptions.push(function(plot,options){if(options.series.pie.show){options.grid.show=false;if(options.series.pie.label.show=="auto"){if(options.legend.show){options.series.pie.label.show=false}else{options.series.pie.label.show=true}}if(options.series.pie.radius=="auto"){if(options.series.pie.label.show){options.series.pie.radius=3/4}else{options.series.pie.radius=1}}if(options.series.pie.tilt>1){options.series.pie.tilt=1}else if(options.series.pie.tilt<0){options.series.pie.tilt=0}}});plot.hooks.bindEvents.push(function(plot,eventHolder){var options=plot.getOptions();if(options.series.pie.show){if(options.grid.hoverable){eventHolder.unbind("mousemove").mousemove(onMouseMove)}if(options.grid.clickable){eventHolder.unbind("click").click(onClick)}}});plot.hooks.processDatapoints.push(function(plot,series,data,datapoints){var options=plot.getOptions();if(options.series.pie.show){processDatapoints(plot,series,data,datapoints)}});plot.hooks.drawOverlay.push(function(plot,octx){var options=plot.getOptions();if(options.series.pie.show){drawOverlay(plot,octx)}});plot.hooks.draw.push(function(plot,newCtx){var options=plot.getOptions();if(options.series.pie.show){draw(plot,newCtx)}});function processDatapoints(plot,series,datapoints){if(!processed){processed=true;canvas=plot.getCanvas();target=$(canvas).parent();options=plot.getOptions();plot.setData(combine(plot.getData()))}}function combine(data){var total=0,combined=0,numCombined=0,color=options.series.pie.combine.color,newdata=[];for(var i=0;i<data.length;++i){var value=data[i].data;if($.isArray(value)&&value.length==1){value=value[0]}if($.isArray(value)){if(!isNaN(parseFloat(value[1]))&&isFinite(value[1])){value[1]=+value[1]}else{value[1]=0}}else if(!isNaN(parseFloat(value))&&isFinite(value)){value=[1,+value]}else{value=[1,0]}data[i].data=[value]}for(var i=0;i<data.length;++i){total+=data[i].data[0][1]}for(var i=0;i<data.length;++i){var value=data[i].data[0][1];if(value/total<=options.series.pie.combine.threshold){combined+=value;numCombined++;if(!color){color=data[i].color}}}for(var i=0;i<data.length;++i){var value=data[i].data[0][1];if(numCombined<2||value/total>options.series.pie.combine.threshold){newdata.push({data:[[1,value]],color:data[i].color,label:data[i].label,angle:value*Math.PI*2/total,percent:value/(total/100)})}}if(numCombined>1){newdata.push({data:[[1,combined]],color:color,label:options.series.pie.combine.label,angle:combined*Math.PI*2/total,percent:combined/(total/100)})}return newdata}function draw(plot,newCtx){if(!target){return}var canvasWidth=plot.getPlaceholder().width(),canvasHeight=plot.getPlaceholder().height(),legendWidth=target.children().filter(".legend").children().width()||0;ctx=newCtx;processed=false;maxRadius=Math.min(canvasWidth,canvasHeight/options.series.pie.tilt)/2;centerTop=canvasHeight/2+options.series.pie.offset.top;centerLeft=canvasWidth/2;if(options.series.pie.offset.left=="auto"){if(options.legend.position.match("w")){centerLeft+=legendWidth/2}else{centerLeft-=legendWidth/2}if(centerLeft<maxRadius){centerLeft=maxRadius}else if(centerLeft>canvasWidth-maxRadius){centerLeft=canvasWidth-maxRadius}}else{centerLeft+=options.series.pie.offset.left}var slices=plot.getData(),attempts=0;do{if(attempts>0){maxRadius*=REDRAW_SHRINK}attempts+=1;clear();if(options.series.pie.tilt<=.8){drawShadow()}}while(!drawPie()&&attempts<REDRAW_ATTEMPTS);if(attempts>=REDRAW_ATTEMPTS){clear();target.prepend("<div class='error'>Could not draw pie with labels contained inside canvas</div>")}if(plot.setSeries&&plot.insertLegend){plot.setSeries(slices);plot.insertLegend()}function clear(){ctx.clearRect(0,0,canvasWidth,canvasHeight);target.children().filter(".pieLabel, .pieLabelBackground").remove()}function drawShadow(){var shadowLeft=options.series.pie.shadow.left;var shadowTop=options.series.pie.shadow.top;var edge=10;var alpha=options.series.pie.shadow.alpha;var radius=options.series.pie.radius>1?options.series.pie.radius:maxRadius*options.series.pie.radius;if(radius>=canvasWidth/2-shadowLeft||radius*options.series.pie.tilt>=canvasHeight/2-shadowTop||radius<=edge){return}ctx.save();ctx.translate(shadowLeft,shadowTop);ctx.globalAlpha=alpha;ctx.fillStyle="#000";ctx.translate(centerLeft,centerTop);ctx.scale(1,options.series.pie.tilt);for(var i=1;i<=edge;i++){ctx.beginPath();ctx.arc(0,0,radius,0,Math.PI*2,false);ctx.fill();radius-=i}ctx.restore()}function drawPie(){var startAngle=Math.PI*options.series.pie.startAngle;var radius=options.series.pie.radius>1?options.series.pie.radius:maxRadius*options.series.pie.radius;ctx.save();ctx.translate(centerLeft,centerTop);ctx.scale(1,options.series.pie.tilt);ctx.save();var currentAngle=startAngle;for(var i=0;i<slices.length;++i){slices[i].startAngle=currentAngle;drawSlice(slices[i].angle,slices[i].color,true)}ctx.restore();if(options.series.pie.stroke.width>0){ctx.save();ctx.lineWidth=options.series.pie.stroke.width;currentAngle=startAngle;for(var i=0;i<slices.length;++i){drawSlice(slices[i].angle,options.series.pie.stroke.color,false)}ctx.restore()}drawDonutHole(ctx);ctx.restore();if(options.series.pie.label.show){return drawLabels()}else return true;function drawSlice(angle,color,fill){if(angle<=0||isNaN(angle)){return}if(fill){ctx.fillStyle=color}else{ctx.strokeStyle=color;ctx.lineJoin="round"}ctx.beginPath();if(Math.abs(angle-Math.PI*2)>1e-9){ctx.moveTo(0,0)}ctx.arc(0,0,radius,currentAngle,currentAngle+angle/2,false);ctx.arc(0,0,radius,currentAngle+angle/2,currentAngle+angle,false);ctx.closePath();currentAngle+=angle;if(fill){ctx.fill()}else{ctx.stroke()}}function drawLabels(){var currentAngle=startAngle;var radius=options.series.pie.label.radius>1?options.series.pie.label.radius:maxRadius*options.series.pie.label.radius;for(var i=0;i<slices.length;++i){if(slices[i].percent>=options.series.pie.label.threshold*100){if(!drawLabel(slices[i],currentAngle,i)){return false}}currentAngle+=slices[i].angle}return true;function drawLabel(slice,startAngle,index){if(slice.data[0][1]==0){return true}var lf=options.legend.labelFormatter,text,plf=options.series.pie.label.formatter;if(lf){text=lf(slice.label,slice)}else{text=slice.label}if(plf){text=plf(text,slice)}var halfAngle=(startAngle+slice.angle+startAngle)/2;var x=centerLeft+Math.round(Math.cos(halfAngle)*radius);var y=centerTop+Math.round(Math.sin(halfAngle)*radius)*options.series.pie.tilt;var html="<span class='pieLabel' id='pieLabel"+index+"' style='position:absolute;top:"+y+"px;left:"+x+"px;'>"+text+"</span>";target.append(html);var label=target.children("#pieLabel"+index);var labelTop=y-label.height()/2;var labelLeft=x-label.width()/2;label.css("top",labelTop);label.css("left",labelLeft);if(0-labelTop>0||0-labelLeft>0||canvasHeight-(labelTop+label.height())<0||canvasWidth-(labelLeft+label.width())<0){return false}if(options.series.pie.label.background.opacity!=0){var c=options.series.pie.label.background.color;if(c==null){c=slice.color}var pos="top:"+labelTop+"px;left:"+labelLeft+"px;";$("<div class='pieLabelBackground' style='position:absolute;width:"+label.width()+"px;height:"+label.height()+"px;"+pos+"background-color:"+c+";'></div>").css("opacity",options.series.pie.label.background.opacity).insertBefore(label)}return true}}}}function drawDonutHole(layer){if(options.series.pie.innerRadius>0){layer.save();var innerRadius=options.series.pie.innerRadius>1?options.series.pie.innerRadius:maxRadius*options.series.pie.innerRadius;layer.globalCompositeOperation="destination-out";layer.beginPath();layer.fillStyle=options.series.pie.stroke.color;layer.arc(0,0,innerRadius,0,Math.PI*2,false);layer.fill();layer.closePath();layer.restore();layer.save();layer.beginPath();layer.strokeStyle=options.series.pie.stroke.color;layer.arc(0,0,innerRadius,0,Math.PI*2,false);layer.stroke();layer.closePath();layer.restore()}}function isPointInPoly(poly,pt){for(var c=false,i=-1,l=poly.length,j=l-1;++i<l;j=i)(poly[i][1]<=pt[1]&&pt[1]<poly[j][1]||poly[j][1]<=pt[1]&&pt[1]<poly[i][1])&&pt[0]<(poly[j][0]-poly[i][0])*(pt[1]-poly[i][1])/(poly[j][1]-poly[i][1])+poly[i][0]&&(c=!c);return c}function findNearbySlice(mouseX,mouseY){var slices=plot.getData(),options=plot.getOptions(),radius=options.series.pie.radius>1?options.series.pie.radius:maxRadius*options.series.pie.radius,x,y;for(var i=0;i<slices.length;++i){var s=slices[i];if(s.pie.show){ctx.save();ctx.beginPath();ctx.moveTo(0,0);ctx.arc(0,0,radius,s.startAngle,s.startAngle+s.angle/2,false);ctx.arc(0,0,radius,s.startAngle+s.angle/2,s.startAngle+s.angle,false);ctx.closePath();x=mouseX-centerLeft;y=mouseY-centerTop;if(ctx.isPointInPath){if(ctx.isPointInPath(mouseX-centerLeft,mouseY-centerTop)){ctx.restore();return{datapoint:[s.percent,s.data],dataIndex:0,series:s,seriesIndex:i}}}else{var p1X=radius*Math.cos(s.startAngle),p1Y=radius*Math.sin(s.startAngle),p2X=radius*Math.cos(s.startAngle+s.angle/4),p2Y=radius*Math.sin(s.startAngle+s.angle/4),p3X=radius*Math.cos(s.startAngle+s.angle/2),p3Y=radius*Math.sin(s.startAngle+s.angle/2),p4X=radius*Math.cos(s.startAngle+s.angle/1.5),p4Y=radius*Math.sin(s.startAngle+s.angle/1.5),p5X=radius*Math.cos(s.startAngle+s.angle),p5Y=radius*Math.sin(s.startAngle+s.angle),arrPoly=[[0,0],[p1X,p1Y],[p2X,p2Y],[p3X,p3Y],[p4X,p4Y],[p5X,p5Y]],arrPoint=[x,y];if(isPointInPoly(arrPoly,arrPoint)){ctx.restore();return{datapoint:[s.percent,s.data],dataIndex:0,series:s,seriesIndex:i}}}ctx.restore()}}return null}function onMouseMove(e){triggerClickHoverEvent("plothover",e)}function onClick(e){triggerClickHoverEvent("plotclick",e)}function triggerClickHoverEvent(eventname,e){var offset=plot.offset();var canvasX=parseInt(e.pageX-offset.left);var canvasY=parseInt(e.pageY-offset.top);var item=findNearbySlice(canvasX,canvasY);if(options.grid.autoHighlight){for(var i=0;i<highlights.length;++i){var h=highlights[i];if(h.auto==eventname&&!(item&&h.series==item.series)){unhighlight(h.series)}}}if(item){highlight(item.series,eventname)}var pos={pageX:e.pageX,pageY:e.pageY};target.trigger(eventname,[pos,item])}function highlight(s,auto){var i=indexOfHighlight(s);if(i==-1){highlights.push({series:s,auto:auto});plot.triggerRedrawOverlay()}else if(!auto){highlights[i].auto=false}}function unhighlight(s){if(s==null){highlights=[];plot.triggerRedrawOverlay()}var i=indexOfHighlight(s);if(i!=-1){highlights.splice(i,1);plot.triggerRedrawOverlay()}}function indexOfHighlight(s){for(var i=0;i<highlights.length;++i){var h=highlights[i];if(h.series==s)return i}return-1}function drawOverlay(plot,octx){var options=plot.getOptions();var radius=options.series.pie.radius>1?options.series.pie.radius:maxRadius*options.series.pie.radius;octx.save();octx.translate(centerLeft,centerTop);octx.scale(1,options.series.pie.tilt);for(var i=0;i<highlights.length;++i){drawHighlight(highlights[i].series)}drawDonutHole(octx);octx.restore();function drawHighlight(series){if(series.angle<=0||isNaN(series.angle)){return}octx.fillStyle="rgba(255, 255, 255, "+options.series.pie.highlight.opacity+")";octx.beginPath();if(Math.abs(series.angle-Math.PI*2)>1e-9){octx.moveTo(0,0)}octx.arc(0,0,radius,series.startAngle,series.startAngle+series.angle/2,false);octx.arc(0,0,radius,series.startAngle+series.angle/2,series.startAngle+series.angle,false);octx.closePath();octx.fill()}}}var options={series:{pie:{show:false,radius:"auto",innerRadius:0,startAngle:3/2,tilt:1,shadow:{left:5,top:15,alpha:.02},offset:{top:0,left:"auto"},stroke:{color:"#fff",width:1},label:{show:"auto",formatter:function(label,slice){return"<div style='font-size:x-small;text-align:center;padding:2px;color:"+slice.color+";'>"+label+"<br/>"+Math.round(slice.percent)+"%</div>"},radius:1,background:{color:null,opacity:0},threshold:0},combine:{threshold:-1,color:null,label:"Other"},highlight:{opacity:.5}}}};$.plot.plugins.push({init:init,options:options,name:"pie",version:"1.1"})})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/plugins/flot/jquery.flot.resize.js b/theme/bootstrap/plugins/flot/jquery.flot.resize.js new file mode 100644 index 0000000..44e04f8 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.resize.js @@ -0,0 +1,60 @@ +/* Flot plugin for automatically redrawing plots as the placeholder resizes. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +It works by listening for changes on the placeholder div (through the jQuery +resize event plugin) - if the size changes, it will redraw the plot. + +There are no options. If you need to disable the plugin for some plots, you +can just fix the size of their placeholders. + +*/ + +/* Inline dependency: + * jQuery resize event - v1.1 - 3/14/2010 + * http://benalman.com/projects/jquery-resize-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ + +(function($,t,n){function p(){for(var n=r.length-1;n>=0;n--){var o=$(r[n]);if(o[0]==t||o.is(":visible")){var h=o.width(),d=o.height(),v=o.data(a);!v||h===v.w&&d===v.h?i[f]=i[l]:(i[f]=i[c],o.trigger(u,[v.w=h,v.h=d]))}else v=o.data(a),v.w=0,v.h=0}s!==null&&(s=t.requestAnimationFrame(p))}var r=[],i=$.resize=$.extend($.resize,{}),s,o="setTimeout",u="resize",a=u+"-special-event",f="delay",l="pendingDelay",c="activeDelay",h="throttleWindow";i[l]=250,i[c]=20,i[f]=i[l],i[h]=!0,$.event.special[u]={setup:function(){if(!i[h]&&this[o])return!1;var t=$(this);r.push(this),t.data(a,{w:t.width(),h:t.height()}),r.length===1&&(s=n,p())},teardown:function(){if(!i[h]&&this[o])return!1;var t=$(this);for(var n=r.length-1;n>=0;n--)if(r[n]==this){r.splice(n,1);break}t.removeData(a),r.length||(cancelAnimationFrame(s),s=null)},add:function(t){function s(t,i,s){var o=$(this),u=o.data(a);u.w=i!==n?i:o.width(),u.h=s!==n?s:o.height(),r.apply(this,arguments)}if(!i[h]&&this[o])return!1;var r;if($.isFunction(t))return r=t,s;r=t.handler,t.handler=s}},t.requestAnimationFrame||(t.requestAnimationFrame=function(){return t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||t.msRequestAnimationFrame||function(e,n){return t.setTimeout(e,i[f])}}()),t.cancelAnimationFrame||(t.cancelAnimationFrame=function(){return t.webkitCancelRequestAnimationFrame||t.mozCancelRequestAnimationFrame||t.oCancelRequestAnimationFrame||t.msCancelRequestAnimationFrame||clearTimeout}())})(jQuery,this); + +(function ($) { + var options = { }; // no options + + function init(plot) { + function onResize() { + var placeholder = plot.getPlaceholder(); + + // somebody might have hidden us and we can't plot + // when we don't have the dimensions + if (placeholder.width() == 0 || placeholder.height() == 0) + return; + + plot.resize(); + plot.setupGrid(); + plot.draw(); + } + + function bindEvents(plot, eventHolder) { + plot.getPlaceholder().resize(onResize); + } + + function shutdown(plot, eventHolder) { + plot.getPlaceholder().unbind("resize", onResize); + } + + plot.hooks.bindEvents.push(bindEvents); + plot.hooks.shutdown.push(shutdown); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'resize', + version: '1.0' + }); +})(jQuery); diff --git a/theme/bootstrap/plugins/flot/jquery.flot.resize.min.js b/theme/bootstrap/plugins/flot/jquery.flot.resize.min.js new file mode 100644 index 0000000..2983842 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.resize.min.js @@ -0,0 +1 @@ +(function($,t,n){function p(){for(var n=r.length-1;n>=0;n--){var o=$(r[n]);if(o[0]==t||o.is(":visible")){var h=o.width(),d=o.height(),v=o.data(a);!v||h===v.w&&d===v.h?i[f]=i[l]:(i[f]=i[c],o.trigger(u,[v.w=h,v.h=d]))}else v=o.data(a),v.w=0,v.h=0}s!==null&&(s=t.requestAnimationFrame(p))}var r=[],i=$.resize=$.extend($.resize,{}),s,o="setTimeout",u="resize",a=u+"-special-event",f="delay",l="pendingDelay",c="activeDelay",h="throttleWindow";i[l]=250,i[c]=20,i[f]=i[l],i[h]=!0,$.event.special[u]={setup:function(){if(!i[h]&&this[o])return!1;var t=$(this);r.push(this),t.data(a,{w:t.width(),h:t.height()}),r.length===1&&(s=n,p())},teardown:function(){if(!i[h]&&this[o])return!1;var t=$(this);for(var n=r.length-1;n>=0;n--)if(r[n]==this){r.splice(n,1);break}t.removeData(a),r.length||(cancelAnimationFrame(s),s=null)},add:function(t){function s(t,i,s){var o=$(this),u=o.data(a);u.w=i!==n?i:o.width(),u.h=s!==n?s:o.height(),r.apply(this,arguments)}if(!i[h]&&this[o])return!1;var r;if($.isFunction(t))return r=t,s;r=t.handler,t.handler=s}},t.requestAnimationFrame||(t.requestAnimationFrame=function(){return t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||t.msRequestAnimationFrame||function(e,n){return t.setTimeout(e,i[f])}}()),t.cancelAnimationFrame||(t.cancelAnimationFrame=function(){return t.webkitCancelRequestAnimationFrame||t.mozCancelRequestAnimationFrame||t.oCancelRequestAnimationFrame||t.msCancelRequestAnimationFrame||clearTimeout}())})(jQuery,this);(function($){var options={};function init(plot){function onResize(){var placeholder=plot.getPlaceholder();if(placeholder.width()==0||placeholder.height()==0)return;plot.resize();plot.setupGrid();plot.draw()}function bindEvents(plot,eventHolder){plot.getPlaceholder().resize(onResize)}function shutdown(plot,eventHolder){plot.getPlaceholder().unbind("resize",onResize)}plot.hooks.bindEvents.push(bindEvents);plot.hooks.shutdown.push(shutdown)}$.plot.plugins.push({init:init,options:options,name:"resize",version:"1.0"})})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/plugins/flot/jquery.flot.selection.js b/theme/bootstrap/plugins/flot/jquery.flot.selection.js new file mode 100644 index 0000000..f8fa668 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.selection.js @@ -0,0 +1,360 @@ +/* Flot plugin for selecting regions of a plot. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +The plugin supports these options: + +selection: { + mode: null or "x" or "y" or "xy", + color: color, + shape: "round" or "miter" or "bevel", + minSize: number of pixels +} + +Selection support is enabled by setting the mode to one of "x", "y" or "xy". +In "x" mode, the user will only be able to specify the x range, similarly for +"y" mode. For "xy", the selection becomes a rectangle where both ranges can be +specified. "color" is color of the selection (if you need to change the color +later on, you can get to it with plot.getOptions().selection.color). "shape" +is the shape of the corners of the selection. + +"minSize" is the minimum size a selection can be in pixels. This value can +be customized to determine the smallest size a selection can be and still +have the selection rectangle be displayed. When customizing this value, the +fact that it refers to pixels, not axis units must be taken into account. +Thus, for example, if there is a bar graph in time mode with BarWidth set to 1 +minute, setting "minSize" to 1 will not make the minimum selection size 1 +minute, but rather 1 pixel. Note also that setting "minSize" to 0 will prevent +"plotunselected" events from being fired when the user clicks the mouse without +dragging. + +When selection support is enabled, a "plotselected" event will be emitted on +the DOM element you passed into the plot function. The event handler gets a +parameter with the ranges selected on the axes, like this: + + placeholder.bind( "plotselected", function( event, ranges ) { + alert("You selected " + ranges.xaxis.from + " to " + ranges.xaxis.to) + // similar for yaxis - with multiple axes, the extra ones are in + // x2axis, x3axis, ... + }); + +The "plotselected" event is only fired when the user has finished making the +selection. A "plotselecting" event is fired during the process with the same +parameters as the "plotselected" event, in case you want to know what's +happening while it's happening, + +A "plotunselected" event with no arguments is emitted when the user clicks the +mouse to remove the selection. As stated above, setting "minSize" to 0 will +destroy this behavior. + +The plugin allso adds the following methods to the plot object: + +- setSelection( ranges, preventEvent ) + + Set the selection rectangle. The passed in ranges is on the same form as + returned in the "plotselected" event. If the selection mode is "x", you + should put in either an xaxis range, if the mode is "y" you need to put in + an yaxis range and both xaxis and yaxis if the selection mode is "xy", like + this: + + setSelection({ xaxis: { from: 0, to: 10 }, yaxis: { from: 40, to: 60 } }); + + setSelection will trigger the "plotselected" event when called. If you don't + want that to happen, e.g. if you're inside a "plotselected" handler, pass + true as the second parameter. If you are using multiple axes, you can + specify the ranges on any of those, e.g. as x2axis/x3axis/... instead of + xaxis, the plugin picks the first one it sees. + +- clearSelection( preventEvent ) + + Clear the selection rectangle. Pass in true to avoid getting a + "plotunselected" event. + +- getSelection() + + Returns the current selection in the same format as the "plotselected" + event. If there's currently no selection, the function returns null. + +*/ + +(function ($) { + function init(plot) { + var selection = { + first: { x: -1, y: -1}, second: { x: -1, y: -1}, + show: false, + active: false + }; + + // FIXME: The drag handling implemented here should be + // abstracted out, there's some similar code from a library in + // the navigation plugin, this should be massaged a bit to fit + // the Flot cases here better and reused. Doing this would + // make this plugin much slimmer. + var savedhandlers = {}; + + var mouseUpHandler = null; + + function onMouseMove(e) { + if (selection.active) { + updateSelection(e); + + plot.getPlaceholder().trigger("plotselecting", [ getSelection() ]); + } + } + + function onMouseDown(e) { + if (e.which != 1) // only accept left-click + return; + + // cancel out any text selections + document.body.focus(); + + // prevent text selection and drag in old-school browsers + if (document.onselectstart !== undefined && savedhandlers.onselectstart == null) { + savedhandlers.onselectstart = document.onselectstart; + document.onselectstart = function () { return false; }; + } + if (document.ondrag !== undefined && savedhandlers.ondrag == null) { + savedhandlers.ondrag = document.ondrag; + document.ondrag = function () { return false; }; + } + + setSelectionPos(selection.first, e); + + selection.active = true; + + // this is a bit silly, but we have to use a closure to be + // able to whack the same handler again + mouseUpHandler = function (e) { onMouseUp(e); }; + + $(document).one("mouseup", mouseUpHandler); + } + + function onMouseUp(e) { + mouseUpHandler = null; + + // revert drag stuff for old-school browsers + if (document.onselectstart !== undefined) + document.onselectstart = savedhandlers.onselectstart; + if (document.ondrag !== undefined) + document.ondrag = savedhandlers.ondrag; + + // no more dragging + selection.active = false; + updateSelection(e); + + if (selectionIsSane()) + triggerSelectedEvent(); + else { + // this counts as a clear + plot.getPlaceholder().trigger("plotunselected", [ ]); + plot.getPlaceholder().trigger("plotselecting", [ null ]); + } + + return false; + } + + function getSelection() { + if (!selectionIsSane()) + return null; + + if (!selection.show) return null; + + var r = {}, c1 = selection.first, c2 = selection.second; + $.each(plot.getAxes(), function (name, axis) { + if (axis.used) { + var p1 = axis.c2p(c1[axis.direction]), p2 = axis.c2p(c2[axis.direction]); + r[name] = { from: Math.min(p1, p2), to: Math.max(p1, p2) }; + } + }); + return r; + } + + function triggerSelectedEvent() { + var r = getSelection(); + + plot.getPlaceholder().trigger("plotselected", [ r ]); + + // backwards-compat stuff, to be removed in future + if (r.xaxis && r.yaxis) + plot.getPlaceholder().trigger("selected", [ { x1: r.xaxis.from, y1: r.yaxis.from, x2: r.xaxis.to, y2: r.yaxis.to } ]); + } + + function clamp(min, value, max) { + return value < min ? min: (value > max ? max: value); + } + + function setSelectionPos(pos, e) { + var o = plot.getOptions(); + var offset = plot.getPlaceholder().offset(); + var plotOffset = plot.getPlotOffset(); + pos.x = clamp(0, e.pageX - offset.left - plotOffset.left, plot.width()); + pos.y = clamp(0, e.pageY - offset.top - plotOffset.top, plot.height()); + + if (o.selection.mode == "y") + pos.x = pos == selection.first ? 0 : plot.width(); + + if (o.selection.mode == "x") + pos.y = pos == selection.first ? 0 : plot.height(); + } + + function updateSelection(pos) { + if (pos.pageX == null) + return; + + setSelectionPos(selection.second, pos); + if (selectionIsSane()) { + selection.show = true; + plot.triggerRedrawOverlay(); + } + else + clearSelection(true); + } + + function clearSelection(preventEvent) { + if (selection.show) { + selection.show = false; + plot.triggerRedrawOverlay(); + if (!preventEvent) + plot.getPlaceholder().trigger("plotunselected", [ ]); + } + } + + // function taken from markings support in Flot + function extractRange(ranges, coord) { + var axis, from, to, key, axes = plot.getAxes(); + + for (var k in axes) { + axis = axes[k]; + if (axis.direction == coord) { + key = coord + axis.n + "axis"; + if (!ranges[key] && axis.n == 1) + key = coord + "axis"; // support x1axis as xaxis + if (ranges[key]) { + from = ranges[key].from; + to = ranges[key].to; + break; + } + } + } + + // backwards-compat stuff - to be removed in future + if (!ranges[key]) { + axis = coord == "x" ? plot.getXAxes()[0] : plot.getYAxes()[0]; + from = ranges[coord + "1"]; + to = ranges[coord + "2"]; + } + + // auto-reverse as an added bonus + if (from != null && to != null && from > to) { + var tmp = from; + from = to; + to = tmp; + } + + return { from: from, to: to, axis: axis }; + } + + function setSelection(ranges, preventEvent) { + var axis, range, o = plot.getOptions(); + + if (o.selection.mode == "y") { + selection.first.x = 0; + selection.second.x = plot.width(); + } + else { + range = extractRange(ranges, "x"); + + selection.first.x = range.axis.p2c(range.from); + selection.second.x = range.axis.p2c(range.to); + } + + if (o.selection.mode == "x") { + selection.first.y = 0; + selection.second.y = plot.height(); + } + else { + range = extractRange(ranges, "y"); + + selection.first.y = range.axis.p2c(range.from); + selection.second.y = range.axis.p2c(range.to); + } + + selection.show = true; + plot.triggerRedrawOverlay(); + if (!preventEvent && selectionIsSane()) + triggerSelectedEvent(); + } + + function selectionIsSane() { + var minSize = plot.getOptions().selection.minSize; + return Math.abs(selection.second.x - selection.first.x) >= minSize && + Math.abs(selection.second.y - selection.first.y) >= minSize; + } + + plot.clearSelection = clearSelection; + plot.setSelection = setSelection; + plot.getSelection = getSelection; + + plot.hooks.bindEvents.push(function(plot, eventHolder) { + var o = plot.getOptions(); + if (o.selection.mode != null) { + eventHolder.mousemove(onMouseMove); + eventHolder.mousedown(onMouseDown); + } + }); + + + plot.hooks.drawOverlay.push(function (plot, ctx) { + // draw selection + if (selection.show && selectionIsSane()) { + var plotOffset = plot.getPlotOffset(); + var o = plot.getOptions(); + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + var c = $.color.parse(o.selection.color); + + ctx.strokeStyle = c.scale('a', 0.8).toString(); + ctx.lineWidth = 1; + ctx.lineJoin = o.selection.shape; + ctx.fillStyle = c.scale('a', 0.4).toString(); + + var x = Math.min(selection.first.x, selection.second.x) + 0.5, + y = Math.min(selection.first.y, selection.second.y) + 0.5, + w = Math.abs(selection.second.x - selection.first.x) - 1, + h = Math.abs(selection.second.y - selection.first.y) - 1; + + ctx.fillRect(x, y, w, h); + ctx.strokeRect(x, y, w, h); + + ctx.restore(); + } + }); + + plot.hooks.shutdown.push(function (plot, eventHolder) { + eventHolder.unbind("mousemove", onMouseMove); + eventHolder.unbind("mousedown", onMouseDown); + + if (mouseUpHandler) + $(document).unbind("mouseup", mouseUpHandler); + }); + + } + + $.plot.plugins.push({ + init: init, + options: { + selection: { + mode: null, // one of null, "x", "y" or "xy" + color: "#e8cfac", + shape: "round", // one of "round", "miter", or "bevel" + minSize: 5 // minimum number of pixels + } + }, + name: 'selection', + version: '1.1' + }); +})(jQuery); diff --git a/theme/bootstrap/plugins/flot/jquery.flot.selection.min.js b/theme/bootstrap/plugins/flot/jquery.flot.selection.min.js new file mode 100644 index 0000000..6e31978 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.selection.min.js @@ -0,0 +1 @@ +(function($){function init(plot){var selection={first:{x:-1,y:-1},second:{x:-1,y:-1},show:false,active:false};var savedhandlers={};var mouseUpHandler=null;function onMouseMove(e){if(selection.active){updateSelection(e);plot.getPlaceholder().trigger("plotselecting",[getSelection()])}}function onMouseDown(e){if(e.which!=1)return;document.body.focus();if(document.onselectstart!==undefined&&savedhandlers.onselectstart==null){savedhandlers.onselectstart=document.onselectstart;document.onselectstart=function(){return false}}if(document.ondrag!==undefined&&savedhandlers.ondrag==null){savedhandlers.ondrag=document.ondrag;document.ondrag=function(){return false}}setSelectionPos(selection.first,e);selection.active=true;mouseUpHandler=function(e){onMouseUp(e)};$(document).one("mouseup",mouseUpHandler)}function onMouseUp(e){mouseUpHandler=null;if(document.onselectstart!==undefined)document.onselectstart=savedhandlers.onselectstart;if(document.ondrag!==undefined)document.ondrag=savedhandlers.ondrag;selection.active=false;updateSelection(e);if(selectionIsSane())triggerSelectedEvent();else{plot.getPlaceholder().trigger("plotunselected",[]);plot.getPlaceholder().trigger("plotselecting",[null])}return false}function getSelection(){if(!selectionIsSane())return null;if(!selection.show)return null;var r={},c1=selection.first,c2=selection.second;$.each(plot.getAxes(),function(name,axis){if(axis.used){var p1=axis.c2p(c1[axis.direction]),p2=axis.c2p(c2[axis.direction]);r[name]={from:Math.min(p1,p2),to:Math.max(p1,p2)}}});return r}function triggerSelectedEvent(){var r=getSelection();plot.getPlaceholder().trigger("plotselected",[r]);if(r.xaxis&&r.yaxis)plot.getPlaceholder().trigger("selected",[{x1:r.xaxis.from,y1:r.yaxis.from,x2:r.xaxis.to,y2:r.yaxis.to}])}function clamp(min,value,max){return value<min?min:value>max?max:value}function setSelectionPos(pos,e){var o=plot.getOptions();var offset=plot.getPlaceholder().offset();var plotOffset=plot.getPlotOffset();pos.x=clamp(0,e.pageX-offset.left-plotOffset.left,plot.width());pos.y=clamp(0,e.pageY-offset.top-plotOffset.top,plot.height());if(o.selection.mode=="y")pos.x=pos==selection.first?0:plot.width();if(o.selection.mode=="x")pos.y=pos==selection.first?0:plot.height()}function updateSelection(pos){if(pos.pageX==null)return;setSelectionPos(selection.second,pos);if(selectionIsSane()){selection.show=true;plot.triggerRedrawOverlay()}else clearSelection(true)}function clearSelection(preventEvent){if(selection.show){selection.show=false;plot.triggerRedrawOverlay();if(!preventEvent)plot.getPlaceholder().trigger("plotunselected",[])}}function extractRange(ranges,coord){var axis,from,to,key,axes=plot.getAxes();for(var k in axes){axis=axes[k];if(axis.direction==coord){key=coord+axis.n+"axis";if(!ranges[key]&&axis.n==1)key=coord+"axis";if(ranges[key]){from=ranges[key].from;to=ranges[key].to;break}}}if(!ranges[key]){axis=coord=="x"?plot.getXAxes()[0]:plot.getYAxes()[0];from=ranges[coord+"1"];to=ranges[coord+"2"]}if(from!=null&&to!=null&&from>to){var tmp=from;from=to;to=tmp}return{from:from,to:to,axis:axis}}function setSelection(ranges,preventEvent){var axis,range,o=plot.getOptions();if(o.selection.mode=="y"){selection.first.x=0;selection.second.x=plot.width()}else{range=extractRange(ranges,"x");selection.first.x=range.axis.p2c(range.from);selection.second.x=range.axis.p2c(range.to)}if(o.selection.mode=="x"){selection.first.y=0;selection.second.y=plot.height()}else{range=extractRange(ranges,"y");selection.first.y=range.axis.p2c(range.from);selection.second.y=range.axis.p2c(range.to)}selection.show=true;plot.triggerRedrawOverlay();if(!preventEvent&&selectionIsSane())triggerSelectedEvent()}function selectionIsSane(){var minSize=plot.getOptions().selection.minSize;return Math.abs(selection.second.x-selection.first.x)>=minSize&&Math.abs(selection.second.y-selection.first.y)>=minSize}plot.clearSelection=clearSelection;plot.setSelection=setSelection;plot.getSelection=getSelection;plot.hooks.bindEvents.push(function(plot,eventHolder){var o=plot.getOptions();if(o.selection.mode!=null){eventHolder.mousemove(onMouseMove);eventHolder.mousedown(onMouseDown)}});plot.hooks.drawOverlay.push(function(plot,ctx){if(selection.show&&selectionIsSane()){var plotOffset=plot.getPlotOffset();var o=plot.getOptions();ctx.save();ctx.translate(plotOffset.left,plotOffset.top);var c=$.color.parse(o.selection.color);ctx.strokeStyle=c.scale("a",.8).toString();ctx.lineWidth=1;ctx.lineJoin=o.selection.shape;ctx.fillStyle=c.scale("a",.4).toString();var x=Math.min(selection.first.x,selection.second.x)+.5,y=Math.min(selection.first.y,selection.second.y)+.5,w=Math.abs(selection.second.x-selection.first.x)-1,h=Math.abs(selection.second.y-selection.first.y)-1;ctx.fillRect(x,y,w,h);ctx.strokeRect(x,y,w,h);ctx.restore()}});plot.hooks.shutdown.push(function(plot,eventHolder){eventHolder.unbind("mousemove",onMouseMove);eventHolder.unbind("mousedown",onMouseDown);if(mouseUpHandler)$(document).unbind("mouseup",mouseUpHandler)})}$.plot.plugins.push({init:init,options:{selection:{mode:null,color:"#e8cfac",shape:"round",minSize:5}},name:"selection",version:"1.1"})})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/plugins/flot/jquery.flot.stack.js b/theme/bootstrap/plugins/flot/jquery.flot.stack.js new file mode 100644 index 0000000..c01de67 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.stack.js @@ -0,0 +1,188 @@ +/* Flot plugin for stacking data sets rather than overlyaing them. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +The plugin assumes the data is sorted on x (or y if stacking horizontally). +For line charts, it is assumed that if a line has an undefined gap (from a +null point), then the line above it should have the same gap - insert zeros +instead of "null" if you want another behaviour. This also holds for the start +and end of the chart. Note that stacking a mix of positive and negative values +in most instances doesn't make sense (so it looks weird). + +Two or more series are stacked when their "stack" attribute is set to the same +key (which can be any number or string or just "true"). To specify the default +stack, you can set the stack option like this: + + series: { + stack: null/false, true, or a key (number/string) + } + +You can also specify it for a single series, like this: + + $.plot( $("#placeholder"), [{ + data: [ ... ], + stack: true + }]) + +The stacking order is determined by the order of the data series in the array +(later series end up on top of the previous). + +Internally, the plugin modifies the datapoints in each series, adding an +offset to the y value. For line series, extra data points are inserted through +interpolation. If there's a second y value, it's also adjusted (e.g for bar +charts or filled areas). + +*/ + +(function ($) { + var options = { + series: { stack: null } // or number/string + }; + + function init(plot) { + function findMatchingSeries(s, allseries) { + var res = null; + for (var i = 0; i < allseries.length; ++i) { + if (s == allseries[i]) + break; + + if (allseries[i].stack == s.stack) + res = allseries[i]; + } + + return res; + } + + function stackData(plot, s, datapoints) { + if (s.stack == null || s.stack === false) + return; + + var other = findMatchingSeries(s, plot.getData()); + if (!other) + return; + + var ps = datapoints.pointsize, + points = datapoints.points, + otherps = other.datapoints.pointsize, + otherpoints = other.datapoints.points, + newpoints = [], + px, py, intery, qx, qy, bottom, + withlines = s.lines.show, + horizontal = s.bars.horizontal, + withbottom = ps > 2 && (horizontal ? datapoints.format[2].x : datapoints.format[2].y), + withsteps = withlines && s.lines.steps, + fromgap = true, + keyOffset = horizontal ? 1 : 0, + accumulateOffset = horizontal ? 0 : 1, + i = 0, j = 0, l, m; + + while (true) { + if (i >= points.length) + break; + + l = newpoints.length; + + if (points[i] == null) { + // copy gaps + for (m = 0; m < ps; ++m) + newpoints.push(points[i + m]); + i += ps; + } + else if (j >= otherpoints.length) { + // for lines, we can't use the rest of the points + if (!withlines) { + for (m = 0; m < ps; ++m) + newpoints.push(points[i + m]); + } + i += ps; + } + else if (otherpoints[j] == null) { + // oops, got a gap + for (m = 0; m < ps; ++m) + newpoints.push(null); + fromgap = true; + j += otherps; + } + else { + // cases where we actually got two points + px = points[i + keyOffset]; + py = points[i + accumulateOffset]; + qx = otherpoints[j + keyOffset]; + qy = otherpoints[j + accumulateOffset]; + bottom = 0; + + if (px == qx) { + for (m = 0; m < ps; ++m) + newpoints.push(points[i + m]); + + newpoints[l + accumulateOffset] += qy; + bottom = qy; + + i += ps; + j += otherps; + } + else if (px > qx) { + // we got past point below, might need to + // insert interpolated extra point + if (withlines && i > 0 && points[i - ps] != null) { + intery = py + (points[i - ps + accumulateOffset] - py) * (qx - px) / (points[i - ps + keyOffset] - px); + newpoints.push(qx); + newpoints.push(intery + qy); + for (m = 2; m < ps; ++m) + newpoints.push(points[i + m]); + bottom = qy; + } + + j += otherps; + } + else { // px < qx + if (fromgap && withlines) { + // if we come from a gap, we just skip this point + i += ps; + continue; + } + + for (m = 0; m < ps; ++m) + newpoints.push(points[i + m]); + + // we might be able to interpolate a point below, + // this can give us a better y + if (withlines && j > 0 && otherpoints[j - otherps] != null) + bottom = qy + (otherpoints[j - otherps + accumulateOffset] - qy) * (px - qx) / (otherpoints[j - otherps + keyOffset] - qx); + + newpoints[l + accumulateOffset] += bottom; + + i += ps; + } + + fromgap = false; + + if (l != newpoints.length && withbottom) + newpoints[l + 2] += bottom; + } + + // maintain the line steps invariant + if (withsteps && l != newpoints.length && l > 0 + && newpoints[l] != null + && newpoints[l] != newpoints[l - ps] + && newpoints[l + 1] != newpoints[l - ps + 1]) { + for (m = 0; m < ps; ++m) + newpoints[l + ps + m] = newpoints[l + m]; + newpoints[l + 1] = newpoints[l - ps + 1]; + } + } + + datapoints.points = newpoints; + } + + plot.hooks.processDatapoints.push(stackData); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'stack', + version: '1.2' + }); +})(jQuery); diff --git a/theme/bootstrap/plugins/flot/jquery.flot.stack.min.js b/theme/bootstrap/plugins/flot/jquery.flot.stack.min.js new file mode 100644 index 0000000..57785eb --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.stack.min.js @@ -0,0 +1 @@ +(function($){var options={series:{stack:null}};function init(plot){function findMatchingSeries(s,allseries){var res=null;for(var i=0;i<allseries.length;++i){if(s==allseries[i])break;if(allseries[i].stack==s.stack)res=allseries[i]}return res}function stackData(plot,s,datapoints){if(s.stack==null||s.stack===false)return;var other=findMatchingSeries(s,plot.getData());if(!other)return;var ps=datapoints.pointsize,points=datapoints.points,otherps=other.datapoints.pointsize,otherpoints=other.datapoints.points,newpoints=[],px,py,intery,qx,qy,bottom,withlines=s.lines.show,horizontal=s.bars.horizontal,withbottom=ps>2&&(horizontal?datapoints.format[2].x:datapoints.format[2].y),withsteps=withlines&&s.lines.steps,fromgap=true,keyOffset=horizontal?1:0,accumulateOffset=horizontal?0:1,i=0,j=0,l,m;while(true){if(i>=points.length)break;l=newpoints.length;if(points[i]==null){for(m=0;m<ps;++m)newpoints.push(points[i+m]);i+=ps}else if(j>=otherpoints.length){if(!withlines){for(m=0;m<ps;++m)newpoints.push(points[i+m])}i+=ps}else if(otherpoints[j]==null){for(m=0;m<ps;++m)newpoints.push(null);fromgap=true;j+=otherps}else{px=points[i+keyOffset];py=points[i+accumulateOffset];qx=otherpoints[j+keyOffset];qy=otherpoints[j+accumulateOffset];bottom=0;if(px==qx){for(m=0;m<ps;++m)newpoints.push(points[i+m]);newpoints[l+accumulateOffset]+=qy;bottom=qy;i+=ps;j+=otherps}else if(px>qx){if(withlines&&i>0&&points[i-ps]!=null){intery=py+(points[i-ps+accumulateOffset]-py)*(qx-px)/(points[i-ps+keyOffset]-px);newpoints.push(qx);newpoints.push(intery+qy);for(m=2;m<ps;++m)newpoints.push(points[i+m]);bottom=qy}j+=otherps}else{if(fromgap&&withlines){i+=ps;continue}for(m=0;m<ps;++m)newpoints.push(points[i+m]);if(withlines&&j>0&&otherpoints[j-otherps]!=null)bottom=qy+(otherpoints[j-otherps+accumulateOffset]-qy)*(px-qx)/(otherpoints[j-otherps+keyOffset]-qx);newpoints[l+accumulateOffset]+=bottom;i+=ps}fromgap=false;if(l!=newpoints.length&&withbottom)newpoints[l+2]+=bottom}if(withsteps&&l!=newpoints.length&&l>0&&newpoints[l]!=null&&newpoints[l]!=newpoints[l-ps]&&newpoints[l+1]!=newpoints[l-ps+1]){for(m=0;m<ps;++m)newpoints[l+ps+m]=newpoints[l+m];newpoints[l+1]=newpoints[l-ps+1]}}datapoints.points=newpoints}plot.hooks.processDatapoints.push(stackData)}$.plot.plugins.push({init:init,options:options,name:"stack",version:"1.2"})})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/plugins/flot/jquery.flot.symbol.js b/theme/bootstrap/plugins/flot/jquery.flot.symbol.js new file mode 100644 index 0000000..cc181ff --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.symbol.js @@ -0,0 +1,71 @@ +/* Flot plugin that adds some extra symbols for plotting points. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +The symbols are accessed as strings through the standard symbol options: + + series: { + points: { + symbol: "square" // or "diamond", "triangle", "cross" + } + } + +*/ + +(function ($) { + function processRawData(plot, series, datapoints) { + // we normalize the area of each symbol so it is approximately the + // same as a circle of the given radius + + var handlers = { + square: function (ctx, x, y, radius, shadow) { + // pi * r^2 = (2s)^2 => s = r * sqrt(pi)/2 + var size = radius * Math.sqrt(Math.PI) / 2; + ctx.rect(x - size, y - size, size + size, size + size); + }, + diamond: function (ctx, x, y, radius, shadow) { + // pi * r^2 = 2s^2 => s = r * sqrt(pi/2) + var size = radius * Math.sqrt(Math.PI / 2); + ctx.moveTo(x - size, y); + ctx.lineTo(x, y - size); + ctx.lineTo(x + size, y); + ctx.lineTo(x, y + size); + ctx.lineTo(x - size, y); + }, + triangle: function (ctx, x, y, radius, shadow) { + // pi * r^2 = 1/2 * s^2 * sin (pi / 3) => s = r * sqrt(2 * pi / sin(pi / 3)) + var size = radius * Math.sqrt(2 * Math.PI / Math.sin(Math.PI / 3)); + var height = size * Math.sin(Math.PI / 3); + ctx.moveTo(x - size/2, y + height/2); + ctx.lineTo(x + size/2, y + height/2); + if (!shadow) { + ctx.lineTo(x, y - height/2); + ctx.lineTo(x - size/2, y + height/2); + } + }, + cross: function (ctx, x, y, radius, shadow) { + // pi * r^2 = (2s)^2 => s = r * sqrt(pi)/2 + var size = radius * Math.sqrt(Math.PI) / 2; + ctx.moveTo(x - size, y - size); + ctx.lineTo(x + size, y + size); + ctx.moveTo(x - size, y + size); + ctx.lineTo(x + size, y - size); + } + }; + + var s = series.points.symbol; + if (handlers[s]) + series.points.symbol = handlers[s]; + } + + function init(plot) { + plot.hooks.processDatapoints.push(processRawData); + } + + $.plot.plugins.push({ + init: init, + name: 'symbols', + version: '1.0' + }); +})(jQuery); diff --git a/theme/bootstrap/plugins/flot/jquery.flot.symbol.min.js b/theme/bootstrap/plugins/flot/jquery.flot.symbol.min.js new file mode 100644 index 0000000..3eab213 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.symbol.min.js @@ -0,0 +1 @@ +(function($){function processRawData(plot,series,datapoints){var handlers={square:function(ctx,x,y,radius,shadow){var size=radius*Math.sqrt(Math.PI)/2;ctx.rect(x-size,y-size,size+size,size+size)},diamond:function(ctx,x,y,radius,shadow){var size=radius*Math.sqrt(Math.PI/2);ctx.moveTo(x-size,y);ctx.lineTo(x,y-size);ctx.lineTo(x+size,y);ctx.lineTo(x,y+size);ctx.lineTo(x-size,y)},triangle:function(ctx,x,y,radius,shadow){var size=radius*Math.sqrt(2*Math.PI/Math.sin(Math.PI/3));var height=size*Math.sin(Math.PI/3);ctx.moveTo(x-size/2,y+height/2);ctx.lineTo(x+size/2,y+height/2);if(!shadow){ctx.lineTo(x,y-height/2);ctx.lineTo(x-size/2,y+height/2)}},cross:function(ctx,x,y,radius,shadow){var size=radius*Math.sqrt(Math.PI)/2;ctx.moveTo(x-size,y-size);ctx.lineTo(x+size,y+size);ctx.moveTo(x-size,y+size);ctx.lineTo(x+size,y-size)}};var s=series.points.symbol;if(handlers[s])series.points.symbol=handlers[s]}function init(plot){plot.hooks.processDatapoints.push(processRawData)}$.plot.plugins.push({init:init,name:"symbols",version:"1.0"})})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/plugins/flot/jquery.flot.threshold.js b/theme/bootstrap/plugins/flot/jquery.flot.threshold.js new file mode 100644 index 0000000..2f6e635 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.threshold.js @@ -0,0 +1,142 @@ +/* Flot plugin for thresholding data. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +The plugin supports these options: + + series: { + threshold: { + below: number + color: colorspec + } + } + +It can also be applied to a single series, like this: + + $.plot( $("#placeholder"), [{ + data: [ ... ], + threshold: { ... } + }]) + +An array can be passed for multiple thresholding, like this: + + threshold: [{ + below: number1 + color: color1 + },{ + below: number2 + color: color2 + }] + +These multiple threshold objects can be passed in any order since they are +sorted by the processing function. + +The data points below "below" are drawn with the specified color. This makes +it easy to mark points below 0, e.g. for budget data. + +Internally, the plugin works by splitting the data into two series, above and +below the threshold. The extra series below the threshold will have its label +cleared and the special "originSeries" attribute set to the original series. +You may need to check for this in hover events. + +*/ + +(function ($) { + var options = { + series: { threshold: null } // or { below: number, color: color spec} + }; + + function init(plot) { + function thresholdData(plot, s, datapoints, below, color) { + var ps = datapoints.pointsize, i, x, y, p, prevp, + thresholded = $.extend({}, s); // note: shallow copy + + thresholded.datapoints = { points: [], pointsize: ps, format: datapoints.format }; + thresholded.label = null; + thresholded.color = color; + thresholded.threshold = null; + thresholded.originSeries = s; + thresholded.data = []; + + var origpoints = datapoints.points, + addCrossingPoints = s.lines.show; + + var threspoints = []; + var newpoints = []; + var m; + + for (i = 0; i < origpoints.length; i += ps) { + x = origpoints[i]; + y = origpoints[i + 1]; + + prevp = p; + if (y < below) + p = threspoints; + else + p = newpoints; + + if (addCrossingPoints && prevp != p && x != null + && i > 0 && origpoints[i - ps] != null) { + var interx = x + (below - y) * (x - origpoints[i - ps]) / (y - origpoints[i - ps + 1]); + prevp.push(interx); + prevp.push(below); + for (m = 2; m < ps; ++m) + prevp.push(origpoints[i + m]); + + p.push(null); // start new segment + p.push(null); + for (m = 2; m < ps; ++m) + p.push(origpoints[i + m]); + p.push(interx); + p.push(below); + for (m = 2; m < ps; ++m) + p.push(origpoints[i + m]); + } + + p.push(x); + p.push(y); + for (m = 2; m < ps; ++m) + p.push(origpoints[i + m]); + } + + datapoints.points = newpoints; + thresholded.datapoints.points = threspoints; + + if (thresholded.datapoints.points.length > 0) { + var origIndex = $.inArray(s, plot.getData()); + // Insert newly-generated series right after original one (to prevent it from becoming top-most) + plot.getData().splice(origIndex + 1, 0, thresholded); + } + + // FIXME: there are probably some edge cases left in bars + } + + function processThresholds(plot, s, datapoints) { + if (!s.threshold) + return; + + if (s.threshold instanceof Array) { + s.threshold.sort(function(a, b) { + return a.below - b.below; + }); + + $(s.threshold).each(function(i, th) { + thresholdData(plot, s, datapoints, th.below, th.color); + }); + } + else { + thresholdData(plot, s, datapoints, s.threshold.below, s.threshold.color); + } + } + + plot.hooks.processDatapoints.push(processThresholds); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'threshold', + version: '1.2' + }); +})(jQuery); diff --git a/theme/bootstrap/plugins/flot/jquery.flot.threshold.min.js b/theme/bootstrap/plugins/flot/jquery.flot.threshold.min.js new file mode 100644 index 0000000..a53849a --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.threshold.min.js @@ -0,0 +1 @@ +(function($){var options={series:{threshold:null}};function init(plot){function thresholdData(plot,s,datapoints,below,color){var ps=datapoints.pointsize,i,x,y,p,prevp,thresholded=$.extend({},s);thresholded.datapoints={points:[],pointsize:ps,format:datapoints.format};thresholded.label=null;thresholded.color=color;thresholded.threshold=null;thresholded.originSeries=s;thresholded.data=[];var origpoints=datapoints.points,addCrossingPoints=s.lines.show;var threspoints=[];var newpoints=[];var m;for(i=0;i<origpoints.length;i+=ps){x=origpoints[i];y=origpoints[i+1];prevp=p;if(y<below)p=threspoints;else p=newpoints;if(addCrossingPoints&&prevp!=p&&x!=null&&i>0&&origpoints[i-ps]!=null){var interx=x+(below-y)*(x-origpoints[i-ps])/(y-origpoints[i-ps+1]);prevp.push(interx);prevp.push(below);for(m=2;m<ps;++m)prevp.push(origpoints[i+m]);p.push(null);p.push(null);for(m=2;m<ps;++m)p.push(origpoints[i+m]);p.push(interx);p.push(below);for(m=2;m<ps;++m)p.push(origpoints[i+m])}p.push(x);p.push(y);for(m=2;m<ps;++m)p.push(origpoints[i+m])}datapoints.points=newpoints;thresholded.datapoints.points=threspoints;if(thresholded.datapoints.points.length>0){var origIndex=$.inArray(s,plot.getData());plot.getData().splice(origIndex+1,0,thresholded)}}function processThresholds(plot,s,datapoints){if(!s.threshold)return;if(s.threshold instanceof Array){s.threshold.sort(function(a,b){return a.below-b.below});$(s.threshold).each(function(i,th){thresholdData(plot,s,datapoints,th.below,th.color)})}else{thresholdData(plot,s,datapoints,s.threshold.below,s.threshold.color)}}plot.hooks.processDatapoints.push(processThresholds)}$.plot.plugins.push({init:init,options:options,name:"threshold",version:"1.2"})})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/plugins/flot/jquery.flot.time.js b/theme/bootstrap/plugins/flot/jquery.flot.time.js new file mode 100644 index 0000000..ac9e666 --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.time.js @@ -0,0 +1,429 @@ +/* Pretty handling of time axes. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +Set axis.mode to "time" to enable. See the section "Time series data" in +API.txt for details. + +*/ + +(function($) { + + var options = { + xaxis: { + timezone: null, // "browser" for local to the client or timezone for timezone-js + timeformat: null, // format string to use + twelveHourClock: false, // 12 or 24 time in time mode + monthNames: null // list of names of months + } + }; + + // round to nearby lower multiple of base + + function floorInBase(n, base) { + return base * Math.floor(n / base); + } + + // Returns a string with the date d formatted according to fmt. + // A subset of the Open Group's strftime format is supported. + + function formatDate(d, fmt, monthNames, dayNames) { + + if (typeof d.strftime == "function") { + return d.strftime(fmt); + } + + var leftPad = function(n, pad) { + n = "" + n; + pad = "" + (pad == null ? "0" : pad); + return n.length == 1 ? pad + n : n; + }; + + var r = []; + var escape = false; + var hours = d.getHours(); + var isAM = hours < 12; + + if (monthNames == null) { + monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + } + + if (dayNames == null) { + dayNames = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; + } + + var hours12; + + if (hours > 12) { + hours12 = hours - 12; + } else if (hours == 0) { + hours12 = 12; + } else { + hours12 = hours; + } + + for (var i = 0; i < fmt.length; ++i) { + + var c = fmt.charAt(i); + + if (escape) { + switch (c) { + case 'a': c = "" + dayNames[d.getDay()]; break; + case 'b': c = "" + monthNames[d.getMonth()]; break; + case 'd': c = leftPad(d.getDate()); break; + case 'e': c = leftPad(d.getDate(), " "); break; + case 'h': // For back-compat with 0.7; remove in 1.0 + case 'H': c = leftPad(hours); break; + case 'I': c = leftPad(hours12); break; + case 'l': c = leftPad(hours12, " "); break; + case 'm': c = leftPad(d.getMonth() + 1); break; + case 'M': c = leftPad(d.getMinutes()); break; + // quarters not in Open Group's strftime specification + case 'q': + c = "" + (Math.floor(d.getMonth() / 3) + 1); break; + case 'S': c = leftPad(d.getSeconds()); break; + case 'y': c = leftPad(d.getFullYear() % 100); break; + case 'Y': c = "" + d.getFullYear(); break; + case 'p': c = (isAM) ? ("" + "am") : ("" + "pm"); break; + case 'P': c = (isAM) ? ("" + "AM") : ("" + "PM"); break; + case 'w': c = "" + d.getDay(); break; + } + r.push(c); + escape = false; + } else { + if (c == "%") { + escape = true; + } else { + r.push(c); + } + } + } + + return r.join(""); + } + + // To have a consistent view of time-based data independent of which time + // zone the client happens to be in we need a date-like object independent + // of time zones. This is done through a wrapper that only calls the UTC + // versions of the accessor methods. + + function makeUtcWrapper(d) { + + function addProxyMethod(sourceObj, sourceMethod, targetObj, targetMethod) { + sourceObj[sourceMethod] = function() { + return targetObj[targetMethod].apply(targetObj, arguments); + }; + } + var utc = { + date: d + }; + + // support strftime, if found + + if (d.strftime != undefined) { + addProxyMethod(utc, "strftime", d, "strftime"); + } + + addProxyMethod(utc, "getTime", d, "getTime"); + addProxyMethod(utc, "setTime", d, "setTime"); + + var props = ["Date", "Day", "FullYear", "Hours", "Milliseconds", "Minutes", "Month", "Seconds"]; + + for (var p = 0; p < props.length; p++) { + addProxyMethod(utc, "get" + props[p], d, "getUTC" + props[p]); + addProxyMethod(utc, "set" + props[p], d, "setUTC" + props[p]); + } + + return utc; + } + // select time zone strategy. This returns a date-like object tied to the + // desired timezone + + function dateGenerator(ts, opts) { + if (opts.timezone == "browser") { + return new Date(ts); + } else if (!opts.timezone || opts.timezone == "utc") { + return makeUtcWrapper(new Date(ts)); + } else if (typeof timezoneJS != "undefined" && typeof timezoneJS.Date != "undefined") { + var d = new timezoneJS.Date(); + // timezone-js is fickle, so be sure to set the time zone before + // setting the time. + d.setTimezone(opts.timezone); + d.setTime(ts); + return d; + } else { + return makeUtcWrapper(new Date(ts)); + } + } + + // map of app. size of time units in milliseconds + + var timeUnitSize = { + "second": 1000, + "minute": 60 * 1000, + "hour": 60 * 60 * 1000, + "day": 24 * 60 * 60 * 1000, + "month": 30 * 24 * 60 * 60 * 1000, + "quarter": 3 * 30 * 24 * 60 * 60 * 1000, + "year": 365.2425 * 24 * 60 * 60 * 1000 + }; + + // the allowed tick sizes, after 1 year we use + // an integer algorithm + + var baseSpec = [ + [1, "second"], [2, "second"], [5, "second"], [10, "second"], + [30, "second"], + [1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"], + [30, "minute"], + [1, "hour"], [2, "hour"], [4, "hour"], + [8, "hour"], [12, "hour"], + [1, "day"], [2, "day"], [3, "day"], + [0.25, "month"], [0.5, "month"], [1, "month"], + [2, "month"] + ]; + + // we don't know which variant(s) we'll need yet, but generating both is + // cheap + + var specMonths = baseSpec.concat([[3, "month"], [6, "month"], + [1, "year"]]); + var specQuarters = baseSpec.concat([[1, "quarter"], [2, "quarter"], + [1, "year"]]); + + function init(plot) { + plot.hooks.processOptions.push(function (plot, options) { + $.each(plot.getAxes(), function(axisName, axis) { + + var opts = axis.options; + + if (opts.mode == "time") { + axis.tickGenerator = function(axis) { + + var ticks = []; + var d = dateGenerator(axis.min, opts); + var minSize = 0; + + // make quarter use a possibility if quarters are + // mentioned in either of these options + + var spec = (opts.tickSize && opts.tickSize[1] === + "quarter") || + (opts.minTickSize && opts.minTickSize[1] === + "quarter") ? specQuarters : specMonths; + + if (opts.minTickSize != null) { + if (typeof opts.tickSize == "number") { + minSize = opts.tickSize; + } else { + minSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]]; + } + } + + for (var i = 0; i < spec.length - 1; ++i) { + if (axis.delta < (spec[i][0] * timeUnitSize[spec[i][1]] + + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2 + && spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) { + break; + } + } + + var size = spec[i][0]; + var unit = spec[i][1]; + + // special-case the possibility of several years + + if (unit == "year") { + + // if given a minTickSize in years, just use it, + // ensuring that it's an integer + + if (opts.minTickSize != null && opts.minTickSize[1] == "year") { + size = Math.floor(opts.minTickSize[0]); + } else { + + var magn = Math.pow(10, Math.floor(Math.log(axis.delta / timeUnitSize.year) / Math.LN10)); + var norm = (axis.delta / timeUnitSize.year) / magn; + + if (norm < 1.5) { + size = 1; + } else if (norm < 3) { + size = 2; + } else if (norm < 7.5) { + size = 5; + } else { + size = 10; + } + + size *= magn; + } + + // minimum size for years is 1 + + if (size < 1) { + size = 1; + } + } + + axis.tickSize = opts.tickSize || [size, unit]; + var tickSize = axis.tickSize[0]; + unit = axis.tickSize[1]; + + var step = tickSize * timeUnitSize[unit]; + + if (unit == "second") { + d.setSeconds(floorInBase(d.getSeconds(), tickSize)); + } else if (unit == "minute") { + d.setMinutes(floorInBase(d.getMinutes(), tickSize)); + } else if (unit == "hour") { + d.setHours(floorInBase(d.getHours(), tickSize)); + } else if (unit == "month") { + d.setMonth(floorInBase(d.getMonth(), tickSize)); + } else if (unit == "quarter") { + d.setMonth(3 * floorInBase(d.getMonth() / 3, + tickSize)); + } else if (unit == "year") { + d.setFullYear(floorInBase(d.getFullYear(), tickSize)); + } + + // reset smaller components + + d.setMilliseconds(0); + + if (step >= timeUnitSize.minute) { + d.setSeconds(0); + } + if (step >= timeUnitSize.hour) { + d.setMinutes(0); + } + if (step >= timeUnitSize.day) { + d.setHours(0); + } + if (step >= timeUnitSize.day * 4) { + d.setDate(1); + } + if (step >= timeUnitSize.month * 2) { + d.setMonth(floorInBase(d.getMonth(), 3)); + } + if (step >= timeUnitSize.quarter * 2) { + d.setMonth(floorInBase(d.getMonth(), 6)); + } + if (step >= timeUnitSize.year) { + d.setMonth(0); + } + + var carry = 0; + var v = Number.NaN; + var prev; + + do { + + prev = v; + v = d.getTime(); + ticks.push(v); + + if (unit == "month" || unit == "quarter") { + if (tickSize < 1) { + + // a bit complicated - we'll divide the + // month/quarter up but we need to take + // care of fractions so we don't end up in + // the middle of a day + + d.setDate(1); + var start = d.getTime(); + d.setMonth(d.getMonth() + + (unit == "quarter" ? 3 : 1)); + var end = d.getTime(); + d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize); + carry = d.getHours(); + d.setHours(0); + } else { + d.setMonth(d.getMonth() + + tickSize * (unit == "quarter" ? 3 : 1)); + } + } else if (unit == "year") { + d.setFullYear(d.getFullYear() + tickSize); + } else { + d.setTime(v + step); + } + } while (v < axis.max && v != prev); + + return ticks; + }; + + axis.tickFormatter = function (v, axis) { + + var d = dateGenerator(v, axis.options); + + // first check global format + + if (opts.timeformat != null) { + return formatDate(d, opts.timeformat, opts.monthNames, opts.dayNames); + } + + // possibly use quarters if quarters are mentioned in + // any of these places + + var useQuarters = (axis.options.tickSize && + axis.options.tickSize[1] == "quarter") || + (axis.options.minTickSize && + axis.options.minTickSize[1] == "quarter"); + + var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]]; + var span = axis.max - axis.min; + var suffix = (opts.twelveHourClock) ? " %p" : ""; + var hourCode = (opts.twelveHourClock) ? "%I" : "%H"; + var fmt; + + if (t < timeUnitSize.minute) { + fmt = hourCode + ":%M:%S" + suffix; + } else if (t < timeUnitSize.day) { + if (span < 2 * timeUnitSize.day) { + fmt = hourCode + ":%M" + suffix; + } else { + fmt = "%b %d " + hourCode + ":%M" + suffix; + } + } else if (t < timeUnitSize.month) { + fmt = "%b %d"; + } else if ((useQuarters && t < timeUnitSize.quarter) || + (!useQuarters && t < timeUnitSize.year)) { + if (span < timeUnitSize.year) { + fmt = "%b"; + } else { + fmt = "%b %Y"; + } + } else if (useQuarters && t < timeUnitSize.year) { + if (span < timeUnitSize.year) { + fmt = "Q%q"; + } else { + fmt = "Q%q %Y"; + } + } else { + fmt = "%Y"; + } + + var rt = formatDate(d, fmt, opts.monthNames, opts.dayNames); + + return rt; + }; + } + }); + }); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'time', + version: '1.0' + }); + + // Time-axis support used to be in Flot core, which exposed the + // formatDate function on the plot object. Various plugins depend + // on the function, so we need to re-expose it here. + + $.plot.formatDate = formatDate; + +})(jQuery); diff --git a/theme/bootstrap/plugins/flot/jquery.flot.time.min.js b/theme/bootstrap/plugins/flot/jquery.flot.time.min.js new file mode 100644 index 0000000..aaf319c --- /dev/null +++ b/theme/bootstrap/plugins/flot/jquery.flot.time.min.js @@ -0,0 +1 @@ +(function($){var options={xaxis:{timezone:null,timeformat:null,twelveHourClock:false,monthNames:null}};function floorInBase(n,base){return base*Math.floor(n/base)}function formatDate(d,fmt,monthNames,dayNames){if(typeof d.strftime=="function"){return d.strftime(fmt)}var leftPad=function(n,pad){n=""+n;pad=""+(pad==null?"0":pad);return n.length==1?pad+n:n};var r=[];var escape=false;var hours=d.getHours();var isAM=hours<12;if(monthNames==null){monthNames=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]}if(dayNames==null){dayNames=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]}var hours12;if(hours>12){hours12=hours-12}else if(hours==0){hours12=12}else{hours12=hours}for(var i=0;i<fmt.length;++i){var c=fmt.charAt(i);if(escape){switch(c){case"a":c=""+dayNames[d.getDay()];break;case"b":c=""+monthNames[d.getMonth()];break;case"d":c=leftPad(d.getDate());break;case"e":c=leftPad(d.getDate()," ");break;case"h":case"H":c=leftPad(hours);break;case"I":c=leftPad(hours12);break;case"l":c=leftPad(hours12," ");break;case"m":c=leftPad(d.getMonth()+1);break;case"M":c=leftPad(d.getMinutes());break;case"q":c=""+(Math.floor(d.getMonth()/3)+1);break;case"S":c=leftPad(d.getSeconds());break;case"y":c=leftPad(d.getFullYear()%100);break;case"Y":c=""+d.getFullYear();break;case"p":c=isAM?""+"am":""+"pm";break;case"P":c=isAM?""+"AM":""+"PM";break;case"w":c=""+d.getDay();break}r.push(c);escape=false}else{if(c=="%"){escape=true}else{r.push(c)}}}return r.join("")}function makeUtcWrapper(d){function addProxyMethod(sourceObj,sourceMethod,targetObj,targetMethod){sourceObj[sourceMethod]=function(){return targetObj[targetMethod].apply(targetObj,arguments)}}var utc={date:d};if(d.strftime!=undefined){addProxyMethod(utc,"strftime",d,"strftime")}addProxyMethod(utc,"getTime",d,"getTime");addProxyMethod(utc,"setTime",d,"setTime");var props=["Date","Day","FullYear","Hours","Milliseconds","Minutes","Month","Seconds"];for(var p=0;p<props.length;p++){addProxyMethod(utc,"get"+props[p],d,"getUTC"+props[p]);addProxyMethod(utc,"set"+props[p],d,"setUTC"+props[p])}return utc}function dateGenerator(ts,opts){if(opts.timezone=="browser"){return new Date(ts)}else if(!opts.timezone||opts.timezone=="utc"){return makeUtcWrapper(new Date(ts))}else if(typeof timezoneJS!="undefined"&&typeof timezoneJS.Date!="undefined"){var d=new timezoneJS.Date;d.setTimezone(opts.timezone);d.setTime(ts);return d}else{return makeUtcWrapper(new Date(ts))}}var timeUnitSize={second:1e3,minute:60*1e3,hour:60*60*1e3,day:24*60*60*1e3,month:30*24*60*60*1e3,quarter:3*30*24*60*60*1e3,year:365.2425*24*60*60*1e3};var baseSpec=[[1,"second"],[2,"second"],[5,"second"],[10,"second"],[30,"second"],[1,"minute"],[2,"minute"],[5,"minute"],[10,"minute"],[30,"minute"],[1,"hour"],[2,"hour"],[4,"hour"],[8,"hour"],[12,"hour"],[1,"day"],[2,"day"],[3,"day"],[.25,"month"],[.5,"month"],[1,"month"],[2,"month"]];var specMonths=baseSpec.concat([[3,"month"],[6,"month"],[1,"year"]]);var specQuarters=baseSpec.concat([[1,"quarter"],[2,"quarter"],[1,"year"]]);function init(plot){plot.hooks.processOptions.push(function(plot,options){$.each(plot.getAxes(),function(axisName,axis){var opts=axis.options;if(opts.mode=="time"){axis.tickGenerator=function(axis){var ticks=[];var d=dateGenerator(axis.min,opts);var minSize=0;var spec=opts.tickSize&&opts.tickSize[1]==="quarter"||opts.minTickSize&&opts.minTickSize[1]==="quarter"?specQuarters:specMonths;if(opts.minTickSize!=null){if(typeof opts.tickSize=="number"){minSize=opts.tickSize}else{minSize=opts.minTickSize[0]*timeUnitSize[opts.minTickSize[1]]}}for(var i=0;i<spec.length-1;++i){if(axis.delta<(spec[i][0]*timeUnitSize[spec[i][1]]+spec[i+1][0]*timeUnitSize[spec[i+1][1]])/2&&spec[i][0]*timeUnitSize[spec[i][1]]>=minSize){break}}var size=spec[i][0];var unit=spec[i][1];if(unit=="year"){if(opts.minTickSize!=null&&opts.minTickSize[1]=="year"){size=Math.floor(opts.minTickSize[0])}else{var magn=Math.pow(10,Math.floor(Math.log(axis.delta/timeUnitSize.year)/Math.LN10));var norm=axis.delta/timeUnitSize.year/magn;if(norm<1.5){size=1}else if(norm<3){size=2}else if(norm<7.5){size=5}else{size=10}size*=magn}if(size<1){size=1}}axis.tickSize=opts.tickSize||[size,unit];var tickSize=axis.tickSize[0];unit=axis.tickSize[1];var step=tickSize*timeUnitSize[unit];if(unit=="second"){d.setSeconds(floorInBase(d.getSeconds(),tickSize))}else if(unit=="minute"){d.setMinutes(floorInBase(d.getMinutes(),tickSize))}else if(unit=="hour"){d.setHours(floorInBase(d.getHours(),tickSize))}else if(unit=="month"){d.setMonth(floorInBase(d.getMonth(),tickSize))}else if(unit=="quarter"){d.setMonth(3*floorInBase(d.getMonth()/3,tickSize))}else if(unit=="year"){d.setFullYear(floorInBase(d.getFullYear(),tickSize))}d.setMilliseconds(0);if(step>=timeUnitSize.minute){d.setSeconds(0)}if(step>=timeUnitSize.hour){d.setMinutes(0)}if(step>=timeUnitSize.day){d.setHours(0)}if(step>=timeUnitSize.day*4){d.setDate(1)}if(step>=timeUnitSize.month*2){d.setMonth(floorInBase(d.getMonth(),3))}if(step>=timeUnitSize.quarter*2){d.setMonth(floorInBase(d.getMonth(),6))}if(step>=timeUnitSize.year){d.setMonth(0)}var carry=0;var v=Number.NaN;var prev;do{prev=v;v=d.getTime();ticks.push(v);if(unit=="month"||unit=="quarter"){if(tickSize<1){d.setDate(1);var start=d.getTime();d.setMonth(d.getMonth()+(unit=="quarter"?3:1));var end=d.getTime();d.setTime(v+carry*timeUnitSize.hour+(end-start)*tickSize);carry=d.getHours();d.setHours(0)}else{d.setMonth(d.getMonth()+tickSize*(unit=="quarter"?3:1))}}else if(unit=="year"){d.setFullYear(d.getFullYear()+tickSize)}else{d.setTime(v+step)}}while(v<axis.max&&v!=prev);return ticks};axis.tickFormatter=function(v,axis){var d=dateGenerator(v,axis.options);if(opts.timeformat!=null){return formatDate(d,opts.timeformat,opts.monthNames,opts.dayNames)}var useQuarters=axis.options.tickSize&&axis.options.tickSize[1]=="quarter"||axis.options.minTickSize&&axis.options.minTickSize[1]=="quarter";var t=axis.tickSize[0]*timeUnitSize[axis.tickSize[1]];var span=axis.max-axis.min;var suffix=opts.twelveHourClock?" %p":"";var hourCode=opts.twelveHourClock?"%I":"%H";var fmt;if(t<timeUnitSize.minute){fmt=hourCode+":%M:%S"+suffix}else if(t<timeUnitSize.day){if(span<2*timeUnitSize.day){fmt=hourCode+":%M"+suffix}else{fmt="%b %d "+hourCode+":%M"+suffix}}else if(t<timeUnitSize.month){fmt="%b %d"}else if(useQuarters&&t<timeUnitSize.quarter||!useQuarters&&t<timeUnitSize.year){if(span<timeUnitSize.year){fmt="%b"}else{fmt="%b %Y"}}else if(useQuarters&&t<timeUnitSize.year){if(span<timeUnitSize.year){fmt="Q%q"}else{fmt="Q%q %Y"}}else{fmt="%Y"}var rt=formatDate(d,fmt,opts.monthNames,opts.dayNames);return rt}}})})}$.plot.plugins.push({init:init,options:options,name:"time",version:"1.0"});$.plot.formatDate=formatDate})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/plugins/fullcalendar/fullcalendar.css b/theme/bootstrap/plugins/fullcalendar/fullcalendar.css new file mode 100644 index 0000000..624f2c4 --- /dev/null +++ b/theme/bootstrap/plugins/fullcalendar/fullcalendar.css @@ -0,0 +1,977 @@ +/*! + * FullCalendar v2.2.5 Stylesheet + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */ + + +.fc { + direction: ltr; + text-align: left; +} + +.fc-rtl { + text-align: right; +} + +body .fc { /* extra precedence to overcome jqui */ + font-size: 1em; +} + + +/* Colors +--------------------------------------------------------------------------------------------------*/ + +.fc-unthemed th, +.fc-unthemed td, +.fc-unthemed hr, +.fc-unthemed thead, +.fc-unthemed tbody, +.fc-unthemed .fc-row, +.fc-unthemed .fc-popover { + border-color: #ddd; +} + +.fc-unthemed .fc-popover { + background-color: #fff; +} + +.fc-unthemed hr, +.fc-unthemed .fc-popover .fc-header { + background: #eee; +} + +.fc-unthemed .fc-popover .fc-header .fc-close { + color: #666; +} + +.fc-unthemed .fc-today { + background: #fcf8e3; +} + +.fc-highlight { /* when user is selecting cells */ + background: #bce8f1; + opacity: .3; + filter: alpha(opacity=30); /* for IE */ +} + +.fc-bgevent { /* default look for background events */ + background: rgb(143, 223, 130); + opacity: .3; + filter: alpha(opacity=30); /* for IE */ +} + +.fc-nonbusiness { /* default look for non-business-hours areas */ + /* will inherit .fc-bgevent's styles */ + background: #ccc; +} + + +/* Icons (inline elements with styled text that mock arrow icons) +--------------------------------------------------------------------------------------------------*/ + +.fc-icon { + display: inline-block; + font-size: 2em; + line-height: .5em; + height: .5em; /* will make the total height 1em */ + font-family: "Courier New", Courier, monospace; +} + +.fc-icon-left-single-arrow:after { + content: "\02039"; + font-weight: bold; +} + +.fc-icon-right-single-arrow:after { + content: "\0203A"; + font-weight: bold; +} + +.fc-icon-left-double-arrow:after { + content: "\000AB"; +} + +.fc-icon-right-double-arrow:after { + content: "\000BB"; +} + +.fc-icon-x:after { + content: "\000D7"; +} + + +/* Buttons (styled <button> tags, normalized to work cross-browser) +--------------------------------------------------------------------------------------------------*/ + +.fc button { + /* force height to include the border and padding */ + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + + /* dimensions */ + margin: 0; + height: 2.1em; + padding: 0 .6em; + + /* text & cursor */ + font-size: 1em; /* normalize */ + white-space: nowrap; + cursor: pointer; +} + +/* Firefox has an annoying inner border */ +.fc button::-moz-focus-inner { margin: 0; padding: 0; } + +.fc-state-default { /* non-theme */ + border: 1px solid; +} + +.fc-state-default.fc-corner-left { /* non-theme */ + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} + +.fc-state-default.fc-corner-right { /* non-theme */ + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} + +/* icons in buttons */ + +.fc button .fc-icon { /* non-theme */ + position: relative; + top: .05em; /* seems to be a good adjustment across browsers */ + margin: 0 .1em; +} + +/* + button states + borrowed from twitter bootstrap (http://twitter.github.com/bootstrap/) +*/ + +.fc-state-default { + background-color: #f5f5f5; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + color: #333; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.fc-state-hover, +.fc-state-down, +.fc-state-active, +.fc-state-disabled { + color: #333333; + background-color: #e6e6e6; +} + +.fc-state-hover { + color: #333333; + text-decoration: none; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.fc-state-down, +.fc-state-active { + background-color: #cccccc; + background-image: none; + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.fc-state-disabled { + cursor: default; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + box-shadow: none; +} + + +/* Buttons Groups +--------------------------------------------------------------------------------------------------*/ + +.fc-button-group { + display: inline-block; +} + +/* +every button that is not first in a button group should scootch over one pixel and cover the +previous button's border... +*/ + +.fc .fc-button-group > * { /* extra precedence b/c buttons have margin set to zero */ + float: left; + margin: 0 0 0 -1px; +} + +.fc .fc-button-group > :first-child { /* same */ + margin-left: 0; +} + + +/* Popover +--------------------------------------------------------------------------------------------------*/ + +.fc-popover { + position: absolute; + box-shadow: 0 2px 6px rgba(0,0,0,.15); +} + +.fc-popover .fc-header { + padding: 2px 4px; +} + +.fc-popover .fc-header .fc-title { + margin: 0 2px; +} + +.fc-popover .fc-header .fc-close { + cursor: pointer; +} + +.fc-ltr .fc-popover .fc-header .fc-title, +.fc-rtl .fc-popover .fc-header .fc-close { + float: left; +} + +.fc-rtl .fc-popover .fc-header .fc-title, +.fc-ltr .fc-popover .fc-header .fc-close { + float: right; +} + +/* unthemed */ + +.fc-unthemed .fc-popover { + border-width: 1px; + border-style: solid; +} + +.fc-unthemed .fc-popover .fc-header .fc-close { + font-size: 25px; + margin-top: 4px; +} + +/* jqui themed */ + +.fc-popover > .ui-widget-header + .ui-widget-content { + border-top: 0; /* where they meet, let the header have the border */ +} + + +/* Misc Reusable Components +--------------------------------------------------------------------------------------------------*/ + +.fc hr { + height: 0; + margin: 0; + padding: 0 0 2px; /* height is unreliable across browsers, so use padding */ + border-style: solid; + border-width: 1px 0; +} + +.fc-clear { + clear: both; +} + +.fc-bg, +.fc-bgevent-skeleton, +.fc-highlight-skeleton, +.fc-helper-skeleton { + /* these element should always cling to top-left/right corners */ + position: absolute; + top: 0; + left: 0; + right: 0; +} + +.fc-bg { + bottom: 0; /* strech bg to bottom edge */ +} + +.fc-bg table { + height: 100%; /* strech bg to bottom edge */ +} + + +/* Tables +--------------------------------------------------------------------------------------------------*/ + +.fc table { + width: 100%; + table-layout: fixed; + border-collapse: collapse; + border-spacing: 0; + font-size: 1em; /* normalize cross-browser */ +} + +.fc th { + text-align: center; +} + +.fc th, +.fc td { + border-style: solid; + border-width: 1px; + padding: 0; + vertical-align: top; +} + +.fc td.fc-today { + border-style: double; /* overcome neighboring borders */ +} + + +/* Fake Table Rows +--------------------------------------------------------------------------------------------------*/ + +.fc .fc-row { /* extra precedence to overcome themes w/ .ui-widget-content forcing a 1px border */ + /* no visible border by default. but make available if need be (scrollbar width compensation) */ + border-style: solid; + border-width: 0; +} + +.fc-row table { + /* don't put left/right border on anything within a fake row. + the outer tbody will worry about this */ + border-left: 0 hidden transparent; + border-right: 0 hidden transparent; + + /* no bottom borders on rows */ + border-bottom: 0 hidden transparent; +} + +.fc-row:first-child table { + border-top: 0 hidden transparent; /* no top border on first row */ +} + + +/* Day Row (used within the header and the DayGrid) +--------------------------------------------------------------------------------------------------*/ + +.fc-row { + position: relative; +} + +.fc-row .fc-bg { + z-index: 1; +} + +/* highlighting cells & background event skeleton */ + +.fc-row .fc-bgevent-skeleton, +.fc-row .fc-highlight-skeleton { + bottom: 0; /* stretch skeleton to bottom of row */ +} + +.fc-row .fc-bgevent-skeleton table, +.fc-row .fc-highlight-skeleton table { + height: 100%; /* stretch skeleton to bottom of row */ +} + +.fc-row .fc-highlight-skeleton td, +.fc-row .fc-bgevent-skeleton td { + border-color: transparent; +} + +.fc-row .fc-bgevent-skeleton { + z-index: 2; + +} + +.fc-row .fc-highlight-skeleton { + z-index: 3; +} + +/* +row content (which contains day/week numbers and events) as well as "helper" (which contains +temporary rendered events). +*/ + +.fc-row .fc-content-skeleton { + position: relative; + z-index: 4; + padding-bottom: 2px; /* matches the space above the events */ +} + +.fc-row .fc-helper-skeleton { + z-index: 5; +} + +.fc-row .fc-content-skeleton td, +.fc-row .fc-helper-skeleton td { + /* see-through to the background below */ + background: none; /* in case <td>s are globally styled */ + border-color: transparent; + + /* don't put a border between events and/or the day number */ + border-bottom: 0; +} + +.fc-row .fc-content-skeleton tbody td, /* cells with events inside (so NOT the day number cell) */ +.fc-row .fc-helper-skeleton tbody td { + /* don't put a border between event cells */ + border-top: 0; +} + + +/* Scrolling Container +--------------------------------------------------------------------------------------------------*/ + +.fc-scroller { /* this class goes on elements for guaranteed vertical scrollbars */ + overflow-y: scroll; + overflow-x: hidden; +} + +.fc-scroller > * { /* we expect an immediate inner element */ + position: relative; /* re-scope all positions */ + width: 100%; /* hack to force re-sizing this inner element when scrollbars appear/disappear */ + overflow: hidden; /* don't let negative margins or absolute positioning create further scroll */ +} + + +/* Global Event Styles +--------------------------------------------------------------------------------------------------*/ + +.fc-event { + position: relative; /* for resize handle and other inner positioning */ + display: block; /* make the <a> tag block */ + font-size: .85em; + line-height: 1.3; + border-radius: 3px; + border: 1px solid #3a87ad; /* default BORDER color */ + background-color: #3a87ad; /* default BACKGROUND color */ + font-weight: normal; /* undo jqui's ui-widget-header bold */ +} + +/* overpower some of bootstrap's and jqui's styles on <a> tags */ +.fc-event, +.fc-event:hover, +.ui-widget .fc-event { + color: #fff; /* default TEXT color */ + text-decoration: none; /* if <a> has an href */ +} + +.fc-event[href], +.fc-event.fc-draggable { + cursor: pointer; /* give events with links and draggable events a hand mouse pointer */ +} + +.fc-not-allowed, /* causes a "warning" cursor. applied on body */ +.fc-not-allowed .fc-event { /* to override an event's custom cursor */ + cursor: not-allowed; +} + + +/* DayGrid events +---------------------------------------------------------------------------------------------------- +We use the full "fc-day-grid-event" class instead of using descendants because the event won't +be a descendant of the grid when it is being dragged. +*/ + +.fc-day-grid-event { + margin: 1px 2px 0; /* spacing between events and edges */ + padding: 0 1px; +} + +/* events that are continuing to/from another week. kill rounded corners and butt up against edge */ + +.fc-ltr .fc-day-grid-event.fc-not-start, +.fc-rtl .fc-day-grid-event.fc-not-end { + margin-left: 0; + border-left-width: 0; + padding-left: 1px; /* replace the border with padding */ + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.fc-ltr .fc-day-grid-event.fc-not-end, +.fc-rtl .fc-day-grid-event.fc-not-start { + margin-right: 0; + border-right-width: 0; + padding-right: 1px; /* replace the border with padding */ + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.fc-day-grid-event > .fc-content { /* force events to be one-line tall */ + white-space: nowrap; + overflow: hidden; +} + +.fc-day-grid-event .fc-time { + font-weight: bold; +} + +/* resize handle (outside of fc-content, so can go outside of bounds) */ + +.fc-day-grid-event .fc-resizer { + position: absolute; + top: 0; + bottom: 0; + width: 7px; +} + +.fc-ltr .fc-day-grid-event .fc-resizer { + right: -3px; + cursor: e-resize; +} + +.fc-rtl .fc-day-grid-event .fc-resizer { + left: -3px; + cursor: w-resize; +} + + +/* Event Limiting +--------------------------------------------------------------------------------------------------*/ + +/* "more" link that represents hidden events */ + +a.fc-more { + margin: 1px 3px; + font-size: .85em; + cursor: pointer; + text-decoration: none; +} + +a.fc-more:hover { + text-decoration: underline; +} + +.fc-limited { /* rows and cells that are hidden because of a "more" link */ + display: none; +} + +/* popover that appears when "more" link is clicked */ + +.fc-day-grid .fc-row { + z-index: 1; /* make the "more" popover one higher than this */ +} + +.fc-more-popover { + z-index: 2; + width: 220px; +} + +.fc-more-popover .fc-event-container { + padding: 10px; +} + +/* Toolbar +--------------------------------------------------------------------------------------------------*/ + +.fc-toolbar { + text-align: center; + margin-bottom: 1em; +} + +.fc-toolbar .fc-left { + float: left; +} + +.fc-toolbar .fc-right { + float: right; +} + +.fc-toolbar .fc-center { + display: inline-block; +} + +/* the things within each left/right/center section */ +.fc .fc-toolbar > * > * { /* extra precedence to override button border margins */ + float: left; + margin-left: .75em; +} + +/* the first thing within each left/center/right section */ +.fc .fc-toolbar > * > :first-child { /* extra precedence to override button border margins */ + margin-left: 0; +} + +/* title text */ + +.fc-toolbar h2 { + margin: 0; +} + +/* button layering (for border precedence) */ + +.fc-toolbar button { + position: relative; +} + +.fc-toolbar .fc-state-hover, +.fc-toolbar .ui-state-hover { + z-index: 2; +} + +.fc-toolbar .fc-state-down { + z-index: 3; +} + +.fc-toolbar .fc-state-active, +.fc-toolbar .ui-state-active { + z-index: 4; +} + +.fc-toolbar button:focus { + z-index: 5; +} + + +/* View Structure +--------------------------------------------------------------------------------------------------*/ + +/* undo twitter bootstrap's box-sizing rules. normalizes positioning techniques */ +/* don't do this for the toolbar because we'll want bootstrap to style those buttons as some pt */ +.fc-view-container *, +.fc-view-container *:before, +.fc-view-container *:after { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +.fc-view, /* scope positioning and z-index's for everything within the view */ +.fc-view > table { /* so dragged elements can be above the view's main element */ + position: relative; + z-index: 1; +} + +/* BasicView +--------------------------------------------------------------------------------------------------*/ + +/* day row structure */ + +.fc-basicWeek-view .fc-content-skeleton, +.fc-basicDay-view .fc-content-skeleton { + /* we are sure there are no day numbers in these views, so... */ + padding-top: 1px; /* add a pixel to make sure there are 2px padding above events */ + padding-bottom: 1em; /* ensure a space at bottom of cell for user selecting/clicking */ +} + +.fc-basic-view tbody .fc-row { + min-height: 4em; /* ensure that all rows are at least this tall */ +} + +/* a "rigid" row will take up a constant amount of height because content-skeleton is absolute */ + +.fc-row.fc-rigid { + overflow: hidden; +} + +.fc-row.fc-rigid .fc-content-skeleton { + position: absolute; + top: 0; + left: 0; + right: 0; +} + +/* week and day number styling */ + +.fc-basic-view .fc-week-number, +.fc-basic-view .fc-day-number { + padding: 0 2px; +} + +.fc-basic-view td.fc-week-number span, +.fc-basic-view td.fc-day-number { + padding-top: 2px; + padding-bottom: 2px; +} + +.fc-basic-view .fc-week-number { + text-align: center; +} + +.fc-basic-view .fc-week-number span { + /* work around the way we do column resizing and ensure a minimum width */ + display: inline-block; + min-width: 1.25em; +} + +.fc-ltr .fc-basic-view .fc-day-number { + text-align: right; +} + +.fc-rtl .fc-basic-view .fc-day-number { + text-align: left; +} + +.fc-day-number.fc-other-month { + opacity: 0.3; + filter: alpha(opacity=30); /* for IE */ + /* opacity with small font can sometimes look too faded + might want to set the 'color' property instead + making day-numbers bold also fixes the problem */ +} + +/* AgendaView all-day area +--------------------------------------------------------------------------------------------------*/ + +.fc-agenda-view .fc-day-grid { + position: relative; + z-index: 2; /* so the "more.." popover will be over the time grid */ +} + +.fc-agenda-view .fc-day-grid .fc-row { + min-height: 3em; /* all-day section will never get shorter than this */ +} + +.fc-agenda-view .fc-day-grid .fc-row .fc-content-skeleton { + padding-top: 1px; /* add a pixel to make sure there are 2px padding above events */ + padding-bottom: 1em; /* give space underneath events for clicking/selecting days */ +} + + +/* TimeGrid axis running down the side (for both the all-day area and the slot area) +--------------------------------------------------------------------------------------------------*/ + +.fc .fc-axis { /* .fc to overcome default cell styles */ + vertical-align: middle; + padding: 0 4px; + white-space: nowrap; +} + +.fc-ltr .fc-axis { + text-align: right; +} + +.fc-rtl .fc-axis { + text-align: left; +} + +.ui-widget td.fc-axis { + font-weight: normal; /* overcome jqui theme making it bold */ +} + + +/* TimeGrid Structure +--------------------------------------------------------------------------------------------------*/ + +.fc-time-grid-container, /* so scroll container's z-index is below all-day */ +.fc-time-grid { /* so slats/bg/content/etc positions get scoped within here */ + position: relative; + z-index: 1; +} + +.fc-time-grid { + min-height: 100%; /* so if height setting is 'auto', .fc-bg stretches to fill height */ +} + +.fc-time-grid table { /* don't put outer borders on slats/bg/content/etc */ + border: 0 hidden transparent; +} + +.fc-time-grid > .fc-bg { + z-index: 1; +} + +.fc-time-grid .fc-slats, +.fc-time-grid > hr { /* the <hr> AgendaView injects when grid is shorter than scroller */ + position: relative; + z-index: 2; +} + +.fc-time-grid .fc-bgevent-skeleton, +.fc-time-grid .fc-content-skeleton { + position: absolute; + top: 0; + left: 0; + right: 0; +} + +.fc-time-grid .fc-bgevent-skeleton { + z-index: 3; +} + +.fc-time-grid .fc-highlight-skeleton { + z-index: 4; +} + +.fc-time-grid .fc-content-skeleton { + z-index: 5; +} + +.fc-time-grid .fc-helper-skeleton { + z-index: 6; +} + + +/* TimeGrid Slats (lines that run horizontally) +--------------------------------------------------------------------------------------------------*/ + +.fc-slats td { + height: 1.5em; + border-bottom: 0; /* each cell is responsible for its top border */ +} + +.fc-slats .fc-minor td { + border-top-style: dotted; +} + +.fc-slats .ui-widget-content { /* for jqui theme */ + background: none; /* see through to fc-bg */ +} + + +/* TimeGrid Highlighting Slots +--------------------------------------------------------------------------------------------------*/ + +.fc-time-grid .fc-highlight-container { /* a div within a cell within the fc-highlight-skeleton */ + position: relative; /* scopes the left/right of the fc-highlight to be in the column */ +} + +.fc-time-grid .fc-highlight { + position: absolute; + left: 0; + right: 0; + /* top and bottom will be in by JS */ +} + + +/* TimeGrid Event Containment +--------------------------------------------------------------------------------------------------*/ + +.fc-time-grid .fc-event-container, /* a div within a cell within the fc-content-skeleton */ +.fc-time-grid .fc-bgevent-container { /* a div within a cell within the fc-bgevent-skeleton */ + position: relative; +} + +.fc-ltr .fc-time-grid .fc-event-container { /* space on the sides of events for LTR (default) */ + margin: 0 2.5% 0 2px; +} + +.fc-rtl .fc-time-grid .fc-event-container { /* space on the sides of events for RTL */ + margin: 0 2px 0 2.5%; +} + +.fc-time-grid .fc-event, +.fc-time-grid .fc-bgevent { + position: absolute; + z-index: 1; /* scope inner z-index's */ +} + +.fc-time-grid .fc-bgevent { + /* background events always span full width */ + left: 0; + right: 0; +} + + +/* TimeGrid Event Styling +---------------------------------------------------------------------------------------------------- +We use the full "fc-time-grid-event" class instead of using descendants because the event won't +be a descendant of the grid when it is being dragged. +*/ + +.fc-time-grid-event.fc-not-start { /* events that are continuing from another day */ + /* replace space made by the top border with padding */ + border-top-width: 0; + padding-top: 1px; + + /* remove top rounded corners */ + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.fc-time-grid-event.fc-not-end { + /* replace space made by the top border with padding */ + border-bottom-width: 0; + padding-bottom: 1px; + + /* remove bottom rounded corners */ + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.fc-time-grid-event { + overflow: hidden; /* don't let the bg flow over rounded corners */ +} + +.fc-time-grid-event > .fc-content { /* contains the time and title, but no bg and resizer */ + position: relative; + z-index: 2; /* above the bg */ +} + +.fc-time-grid-event .fc-time, +.fc-time-grid-event .fc-title { + padding: 0 1px; +} + +.fc-time-grid-event .fc-time { + font-size: .85em; + white-space: nowrap; +} + +.fc-time-grid-event .fc-bg { + z-index: 1; + background: #fff; + opacity: .25; + filter: alpha(opacity=25); /* for IE */ +} + +/* short mode, where time and title are on the same line */ + +.fc-time-grid-event.fc-short .fc-content { + /* don't wrap to second line (now that contents will be inline) */ + white-space: nowrap; +} + +.fc-time-grid-event.fc-short .fc-time, +.fc-time-grid-event.fc-short .fc-title { + /* put the time and title on the same line */ + display: inline-block; + vertical-align: top; +} + +.fc-time-grid-event.fc-short .fc-time span { + display: none; /* don't display the full time text... */ +} + +.fc-time-grid-event.fc-short .fc-time:before { + content: attr(data-start); /* ...instead, display only the start time */ +} + +.fc-time-grid-event.fc-short .fc-time:after { + content: "\000A0-\000A0"; /* seperate with a dash, wrapped in nbsp's */ +} + +.fc-time-grid-event.fc-short .fc-title { + font-size: .85em; /* make the title text the same size as the time */ + padding: 0; /* undo padding from above */ +} + +/* resizer */ + +.fc-time-grid-event .fc-resizer { + position: absolute; + z-index: 3; /* above content */ + left: 0; + right: 0; + bottom: 0; + height: 8px; + overflow: hidden; + line-height: 8px; + font-size: 11px; + font-family: monospace; + text-align: center; + cursor: s-resize; +} + +.fc-time-grid-event .fc-resizer:after { + content: "="; +} diff --git a/theme/bootstrap/plugins/fullcalendar/fullcalendar.js b/theme/bootstrap/plugins/fullcalendar/fullcalendar.js new file mode 100644 index 0000000..d52e824 --- /dev/null +++ b/theme/bootstrap/plugins/fullcalendar/fullcalendar.js @@ -0,0 +1,9732 @@ +/*! + * FullCalendar v2.2.5 + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */ + +(function(factory) { + if (typeof define === 'function' && define.amd) { + define([ 'jquery', 'moment' ], factory); + } + else { + factory(jQuery, moment); + } +})(function($, moment) { + + var defaults = { + + titleRangeSeparator: ' \u2014 ', // emphasized dash + monthYearFormat: 'MMMM YYYY', // required for en. other languages rely on datepicker computable option + + defaultTimedEventDuration: '02:00:00', + defaultAllDayEventDuration: { days: 1 }, + forceEventDuration: false, + nextDayThreshold: '09:00:00', // 9am + + // display + defaultView: 'month', + aspectRatio: 1.35, + header: { + left: 'title', + center: '', + right: 'today prev,next' + }, + weekends: true, + weekNumbers: false, + + weekNumberTitle: 'W', + weekNumberCalculation: 'local', + + //editable: false, + + // event ajax + lazyFetching: true, + startParam: 'start', + endParam: 'end', + timezoneParam: 'timezone', + + timezone: false, + + //allDayDefault: undefined, + + // locale + isRTL: false, + defaultButtonText: { + prev: "prev", + next: "next", + prevYear: "prev year", + nextYear: "next year", + today: 'today', + month: 'month', + week: 'week', + day: 'day' + }, + + buttonIcons: { + prev: 'left-single-arrow', + next: 'right-single-arrow', + prevYear: 'left-double-arrow', + nextYear: 'right-double-arrow' + }, + + // jquery-ui theming + theme: false, + themeButtonIcons: { + prev: 'circle-triangle-w', + next: 'circle-triangle-e', + prevYear: 'seek-prev', + nextYear: 'seek-next' + }, + + dragOpacity: .75, + dragRevertDuration: 500, + dragScroll: true, + + //selectable: false, + unselectAuto: true, + + dropAccept: '*', + + eventLimit: false, + eventLimitText: 'more', + eventLimitClick: 'popover', + dayPopoverFormat: 'LL', + + handleWindowResize: true, + windowResizeDelay: 200 // milliseconds before an updateSize happens + +}; + + +var englishDefaults = { + dayPopoverFormat: 'dddd, MMMM D' +}; + + +// right-to-left defaults +var rtlDefaults = { + header: { + left: 'next,prev today', + center: '', + right: 'title' + }, + buttonIcons: { + prev: 'right-single-arrow', + next: 'left-single-arrow', + prevYear: 'right-double-arrow', + nextYear: 'left-double-arrow' + }, + themeButtonIcons: { + prev: 'circle-triangle-e', + next: 'circle-triangle-w', + nextYear: 'seek-prev', + prevYear: 'seek-next' + } +}; + + var fc = $.fullCalendar = { version: "2.2.5" }; +var fcViews = fc.views = {}; + + +$.fn.fullCalendar = function(options) { + var args = Array.prototype.slice.call(arguments, 1); // for a possible method call + var res = this; // what this function will return (this jQuery object by default) + + this.each(function(i, _element) { // loop each DOM element involved + var element = $(_element); + var calendar = element.data('fullCalendar'); // get the existing calendar object (if any) + var singleRes; // the returned value of this single method call + + // a method call + if (typeof options === 'string') { + if (calendar && $.isFunction(calendar[options])) { + singleRes = calendar[options].apply(calendar, args); + if (!i) { + res = singleRes; // record the first method call result + } + if (options === 'destroy') { // for the destroy method, must remove Calendar object data + element.removeData('fullCalendar'); + } + } + } + // a new calendar initialization + else if (!calendar) { // don't initialize twice + calendar = new Calendar(element, options); + element.data('fullCalendar', calendar); + calendar.render(); + } + }); + + return res; +}; + + +// function for adding/overriding defaults +function setDefaults(d) { + mergeOptions(defaults, d); +} + + +// Recursively combines option hash-objects. +// Better than `$.extend(true, ...)` because arrays are not traversed/copied. +// +// called like: +// mergeOptions(target, obj1, obj2, ...) +// +function mergeOptions(target) { + + function mergeIntoTarget(name, value) { + if ($.isPlainObject(value) && $.isPlainObject(target[name]) && !isForcedAtomicOption(name)) { + // merge into a new object to avoid destruction + target[name] = mergeOptions({}, target[name], value); // combine. `value` object takes precedence + } + else if (value !== undefined) { // only use values that are set and not undefined + target[name] = value; + } + } + + for (var i=1; i<arguments.length; i++) { + $.each(arguments[i], mergeIntoTarget); + } + + return target; +} + + +// overcome sucky view-option-hash and option-merging behavior messing with options it shouldn't +function isForcedAtomicOption(name) { + // Any option that ends in "Time" or "Duration" is probably a Duration, + // and these will commonly be specified as plain objects, which we don't want to mess up. + return /(Time|Duration)$/.test(name); +} +// FIX: find a different solution for view-option-hashes and have a whitelist +// for options that can be recursively merged. + + var langOptionHash = fc.langs = {}; // initialize and expose + + +// TODO: document the structure and ordering of a FullCalendar lang file +// TODO: rename everything "lang" to "locale", like what the moment project did + + +// Initialize jQuery UI datepicker translations while using some of the translations +// Will set this as the default language for datepicker. +fc.datepickerLang = function(langCode, dpLangCode, dpOptions) { + + // get the FullCalendar internal option hash for this language. create if necessary + var fcOptions = langOptionHash[langCode] || (langOptionHash[langCode] = {}); + + // transfer some simple options from datepicker to fc + fcOptions.isRTL = dpOptions.isRTL; + fcOptions.weekNumberTitle = dpOptions.weekHeader; + + // compute some more complex options from datepicker + $.each(dpComputableOptions, function(name, func) { + fcOptions[name] = func(dpOptions); + }); + + // is jQuery UI Datepicker is on the page? + if ($.datepicker) { + + // Register the language data. + // FullCalendar and MomentJS use language codes like "pt-br" but Datepicker + // does it like "pt-BR" or if it doesn't have the language, maybe just "pt". + // Make an alias so the language can be referenced either way. + $.datepicker.regional[dpLangCode] = + $.datepicker.regional[langCode] = // alias + dpOptions; + + // Alias 'en' to the default language data. Do this every time. + $.datepicker.regional.en = $.datepicker.regional['']; + + // Set as Datepicker's global defaults. + $.datepicker.setDefaults(dpOptions); + } +}; + + +// Sets FullCalendar-specific translations. Will set the language as the global default. +fc.lang = function(langCode, newFcOptions) { + var fcOptions; + var momOptions; + + // get the FullCalendar internal option hash for this language. create if necessary + fcOptions = langOptionHash[langCode] || (langOptionHash[langCode] = {}); + + // provided new options for this language? merge them in + if (newFcOptions) { + mergeOptions(fcOptions, newFcOptions); + } + + // compute language options that weren't defined. + // always do this. newFcOptions can be undefined when initializing from i18n file, + // so no way to tell if this is an initialization or a default-setting. + momOptions = getMomentLocaleData(langCode); // will fall back to en + $.each(momComputableOptions, function(name, func) { + if (fcOptions[name] === undefined) { + fcOptions[name] = func(momOptions, fcOptions); + } + }); + + // set it as the default language for FullCalendar + defaults.lang = langCode; +}; + + +// NOTE: can't guarantee any of these computations will run because not every language has datepicker +// configs, so make sure there are English fallbacks for these in the defaults file. +var dpComputableOptions = { + + defaultButtonText: function(dpOptions) { + return { + // the translations sometimes wrongly contain HTML entities + prev: stripHtmlEntities(dpOptions.prevText), + next: stripHtmlEntities(dpOptions.nextText), + today: stripHtmlEntities(dpOptions.currentText) + }; + }, + + // Produces format strings like "MMMM YYYY" -> "September 2014" + monthYearFormat: function(dpOptions) { + return dpOptions.showMonthAfterYear ? + 'YYYY[' + dpOptions.yearSuffix + '] MMMM' : + 'MMMM YYYY[' + dpOptions.yearSuffix + ']'; + } + +}; + +var momComputableOptions = { + + // Produces format strings like "ddd MM/DD" -> "Fri 12/10" + dayOfMonthFormat: function(momOptions, fcOptions) { + var format = momOptions.longDateFormat('l'); // for the format like "M/D/YYYY" + + // strip the year off the edge, as well as other misc non-whitespace chars + format = format.replace(/^Y+[^\w\s]*|[^\w\s]*Y+$/g, ''); + + if (fcOptions.isRTL) { + format += ' ddd'; // for RTL, add day-of-week to end + } + else { + format = 'ddd ' + format; // for LTR, add day-of-week to beginning + } + return format; + }, + + // Produces format strings like "H(:mm)a" -> "6pm" or "6:30pm" + smallTimeFormat: function(momOptions) { + return momOptions.longDateFormat('LT') + .replace(':mm', '(:mm)') + .replace(/(\Wmm)$/, '($1)') // like above, but for foreign langs + .replace(/\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand + }, + + // Produces format strings like "H(:mm)t" -> "6p" or "6:30p" + extraSmallTimeFormat: function(momOptions) { + return momOptions.longDateFormat('LT') + .replace(':mm', '(:mm)') + .replace(/(\Wmm)$/, '($1)') // like above, but for foreign langs + .replace(/\s*a$/i, 't'); // convert to AM/PM/am/pm to lowercase one-letter. remove any spaces beforehand + }, + + // Produces format strings like "H:mm" -> "6:30" (with no AM/PM) + noMeridiemTimeFormat: function(momOptions) { + return momOptions.longDateFormat('LT') + .replace(/\s*a$/i, ''); // remove trailing AM/PM + } + +}; + + +// Returns moment's internal locale data. If doesn't exist, returns English. +// Works with moment-pre-2.8 +function getMomentLocaleData(langCode) { + var func = moment.localeData || moment.langData; + return func.call(moment, langCode) || + func.call(moment, 'en'); // the newer localData could return null, so fall back to en +} + + +// Initialize English by forcing computation of moment-derived options. +// Also, sets it as the default. +fc.lang('en', englishDefaults); + +// exports +fc.intersectionToSeg = intersectionToSeg; +fc.applyAll = applyAll; +fc.debounce = debounce; + + +/* FullCalendar-specific DOM Utilities +----------------------------------------------------------------------------------------------------------------------*/ + + +// Given the scrollbar widths of some other container, create borders/margins on rowEls in order to match the left +// and right space that was offset by the scrollbars. A 1-pixel border first, then margin beyond that. +function compensateScroll(rowEls, scrollbarWidths) { + if (scrollbarWidths.left) { + rowEls.css({ + 'border-left-width': 1, + 'margin-left': scrollbarWidths.left - 1 + }); + } + if (scrollbarWidths.right) { + rowEls.css({ + 'border-right-width': 1, + 'margin-right': scrollbarWidths.right - 1 + }); + } +} + + +// Undoes compensateScroll and restores all borders/margins +function uncompensateScroll(rowEls) { + rowEls.css({ + 'margin-left': '', + 'margin-right': '', + 'border-left-width': '', + 'border-right-width': '' + }); +} + + +// Make the mouse cursor express that an event is not allowed in the current area +function disableCursor() { + $('body').addClass('fc-not-allowed'); +} + + +// Returns the mouse cursor to its original look +function enableCursor() { + $('body').removeClass('fc-not-allowed'); +} + + +// Given a total available height to fill, have `els` (essentially child rows) expand to accomodate. +// By default, all elements that are shorter than the recommended height are expanded uniformly, not considering +// any other els that are already too tall. if `shouldRedistribute` is on, it considers these tall rows and +// reduces the available height. +function distributeHeight(els, availableHeight, shouldRedistribute) { + + // *FLOORING NOTE*: we floor in certain places because zoom can give inaccurate floating-point dimensions, + // and it is better to be shorter than taller, to avoid creating unnecessary scrollbars. + + var minOffset1 = Math.floor(availableHeight / els.length); // for non-last element + var minOffset2 = Math.floor(availableHeight - minOffset1 * (els.length - 1)); // for last element *FLOORING NOTE* + var flexEls = []; // elements that are allowed to expand. array of DOM nodes + var flexOffsets = []; // amount of vertical space it takes up + var flexHeights = []; // actual css height + var usedHeight = 0; + + undistributeHeight(els); // give all elements their natural height + + // find elements that are below the recommended height (expandable). + // important to query for heights in a single first pass (to avoid reflow oscillation). + els.each(function(i, el) { + var minOffset = i === els.length - 1 ? minOffset2 : minOffset1; + var naturalOffset = $(el).outerHeight(true); + + if (naturalOffset < minOffset) { + flexEls.push(el); + flexOffsets.push(naturalOffset); + flexHeights.push($(el).height()); + } + else { + // this element stretches past recommended height (non-expandable). mark the space as occupied. + usedHeight += naturalOffset; + } + }); + + // readjust the recommended height to only consider the height available to non-maxed-out rows. + if (shouldRedistribute) { + availableHeight -= usedHeight; + minOffset1 = Math.floor(availableHeight / flexEls.length); + minOffset2 = Math.floor(availableHeight - minOffset1 * (flexEls.length - 1)); // *FLOORING NOTE* + } + + // assign heights to all expandable elements + $(flexEls).each(function(i, el) { + var minOffset = i === flexEls.length - 1 ? minOffset2 : minOffset1; + var naturalOffset = flexOffsets[i]; + var naturalHeight = flexHeights[i]; + var newHeight = minOffset - (naturalOffset - naturalHeight); // subtract the margin/padding + + if (naturalOffset < minOffset) { // we check this again because redistribution might have changed things + $(el).height(newHeight); + } + }); +} + + +// Undoes distrubuteHeight, restoring all els to their natural height +function undistributeHeight(els) { + els.height(''); +} + + +// Given `els`, a jQuery set of <td> cells, find the cell with the largest natural width and set the widths of all the +// cells to be that width. +// PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline +function matchCellWidths(els) { + var maxInnerWidth = 0; + + els.find('> *').each(function(i, innerEl) { + var innerWidth = $(innerEl).outerWidth(); + if (innerWidth > maxInnerWidth) { + maxInnerWidth = innerWidth; + } + }); + + maxInnerWidth++; // sometimes not accurate of width the text needs to stay on one line. insurance + + els.width(maxInnerWidth); + + return maxInnerWidth; +} + + +// Turns a container element into a scroller if its contents is taller than the allotted height. +// Returns true if the element is now a scroller, false otherwise. +// NOTE: this method is best because it takes weird zooming dimensions into account +function setPotentialScroller(containerEl, height) { + containerEl.height(height).addClass('fc-scroller'); + + // are scrollbars needed? + if (containerEl[0].scrollHeight - 1 > containerEl[0].clientHeight) { // !!! -1 because IE is often off-by-one :( + return true; + } + + unsetScroller(containerEl); // undo + return false; +} + + +// Takes an element that might have been a scroller, and turns it back into a normal element. +function unsetScroller(containerEl) { + containerEl.height('').removeClass('fc-scroller'); +} + + +/* General DOM Utilities +----------------------------------------------------------------------------------------------------------------------*/ + + +// borrowed from https://github.com/jquery/jquery-ui/blob/1.11.0/ui/core.js#L51 +function getScrollParent(el) { + var position = el.css('position'), + scrollParent = el.parents().filter(function() { + var parent = $(this); + return (/(auto|scroll)/).test( + parent.css('overflow') + parent.css('overflow-y') + parent.css('overflow-x') + ); + }).eq(0); + + return position === 'fixed' || !scrollParent.length ? $(el[0].ownerDocument || document) : scrollParent; +} + + +// Given a container element, return an object with the pixel values of the left/right scrollbars. +// Left scrollbars might occur on RTL browsers (IE maybe?) but I have not tested. +// PREREQUISITE: container element must have a single child with display:block +function getScrollbarWidths(container) { + var containerLeft = container.offset().left; + var containerRight = containerLeft + container.width(); + var inner = container.children(); + var innerLeft = inner.offset().left; + var innerRight = innerLeft + inner.outerWidth(); + + return { + left: innerLeft - containerLeft, + right: containerRight - innerRight + }; +} + + +// Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac) +function isPrimaryMouseButton(ev) { + return ev.which == 1 && !ev.ctrlKey; +} + + +/* FullCalendar-specific Misc Utilities +----------------------------------------------------------------------------------------------------------------------*/ + + +// Creates a basic segment with the intersection of the two ranges. Returns undefined if no intersection. +// Expects all dates to be normalized to the same timezone beforehand. +// TODO: move to date section? +function intersectionToSeg(subjectRange, constraintRange) { + var subjectStart = subjectRange.start; + var subjectEnd = subjectRange.end; + var constraintStart = constraintRange.start; + var constraintEnd = constraintRange.end; + var segStart, segEnd; + var isStart, isEnd; + + if (subjectEnd > constraintStart && subjectStart < constraintEnd) { // in bounds at all? + + if (subjectStart >= constraintStart) { + segStart = subjectStart.clone(); + isStart = true; + } + else { + segStart = constraintStart.clone(); + isStart = false; + } + + if (subjectEnd <= constraintEnd) { + segEnd = subjectEnd.clone(); + isEnd = true; + } + else { + segEnd = constraintEnd.clone(); + isEnd = false; + } + + return { + start: segStart, + end: segEnd, + isStart: isStart, + isEnd: isEnd + }; + } +} + + +function smartProperty(obj, name) { // get a camel-cased/namespaced property of an object + obj = obj || {}; + if (obj[name] !== undefined) { + return obj[name]; + } + var parts = name.split(/(?=[A-Z])/), + i = parts.length - 1, res; + for (; i>=0; i--) { + res = obj[parts[i].toLowerCase()]; + if (res !== undefined) { + return res; + } + } + return obj['default']; +} + + +/* Date Utilities +----------------------------------------------------------------------------------------------------------------------*/ + +var dayIDs = [ 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat' ]; +var intervalUnits = [ 'year', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond' ]; + + +// Diffs the two moments into a Duration where full-days are recorded first, then the remaining time. +// Moments will have their timezones normalized. +function diffDayTime(a, b) { + return moment.duration({ + days: a.clone().stripTime().diff(b.clone().stripTime(), 'days'), + ms: a.time() - b.time() // time-of-day from day start. disregards timezone + }); +} + + +// Diffs the two moments via their start-of-day (regardless of timezone). Produces whole-day durations. +function diffDay(a, b) { + return moment.duration({ + days: a.clone().stripTime().diff(b.clone().stripTime(), 'days') + }); +} + + +// Computes the larges whole-unit period of time, as a duration object. +// For example, 48 hours will be {days:2} whereas 49 hours will be {hours:49}. +// Accepts start/end, a range object, or an original duration object. +/* (never used) +function computeIntervalDuration(start, end) { + var durationInput = {}; + var i, unit; + var val; + + for (i = 0; i < intervalUnits.length; i++) { + unit = intervalUnits[i]; + val = computeIntervalAs(unit, start, end); + if (val) { + break; + } + } + + durationInput[unit] = val; + return moment.duration(durationInput); +} +*/ + + +// Computes the unit name of the largest whole-unit period of time. +// For example, 48 hours will be "days" wherewas 49 hours will be "hours". +// Accepts start/end, a range object, or an original duration object. +function computeIntervalUnit(start, end) { + var i, unit; + + for (i = 0; i < intervalUnits.length; i++) { + unit = intervalUnits[i]; + if (computeIntervalAs(unit, start, end)) { + break; + } + } + + return unit; // will be "milliseconds" if nothing else matches +} + + +// Computes the number of units the interval is cleanly comprised of. +// If the given unit does not cleanly divide the interval a whole number of times, `false` is returned. +// Accepts start/end, a range object, or an original duration object. +function computeIntervalAs(unit, start, end) { + var val; + + if (end != null) { // given start, end + val = end.diff(start, unit, true); + } + else if (moment.isDuration(start)) { // given duration + val = start.as(unit); + } + else { // given { start, end } range object + val = start.end.diff(start.start, unit, true); + } + + if (val >= 1 && isInt(val)) { + return val; + } + + return false; +} + + +function isNativeDate(input) { + return Object.prototype.toString.call(input) === '[object Date]' || input instanceof Date; +} + + +// Returns a boolean about whether the given input is a time string, like "06:40:00" or "06:00" +function isTimeString(str) { + return /^\d+\:\d+(?:\:\d+\.?(?:\d{3})?)?$/.test(str); +} + + +/* General Utilities +----------------------------------------------------------------------------------------------------------------------*/ + +var hasOwnPropMethod = {}.hasOwnProperty; + + +// Create an object that has the given prototype. Just like Object.create +function createObject(proto) { + var f = function() {}; + f.prototype = proto; + return new f(); +} + + +function copyOwnProps(src, dest) { + for (var name in src) { + if (hasOwnProp(src, name)) { + dest[name] = src[name]; + } + } +} + + +function hasOwnProp(obj, name) { + return hasOwnPropMethod.call(obj, name); +} + + +// Is the given value a non-object non-function value? +function isAtomic(val) { + return /undefined|null|boolean|number|string/.test($.type(val)); +} + + +function applyAll(functions, thisObj, args) { + if ($.isFunction(functions)) { + functions = [ functions ]; + } + if (functions) { + var i; + var ret; + for (i=0; i<functions.length; i++) { + ret = functions[i].apply(thisObj, args) || ret; + } + return ret; + } +} + + +function firstDefined() { + for (var i=0; i<arguments.length; i++) { + if (arguments[i] !== undefined) { + return arguments[i]; + } + } +} + + +function htmlEscape(s) { + return (s + '').replace(/&/g, '&amp;') + .replace(/</g, '&lt;') + .replace(/>/g, '&gt;') + .replace(/'/g, '&#039;') + .replace(/"/g, '&quot;') + .replace(/\n/g, '<br />'); +} + + +function stripHtmlEntities(text) { + return text.replace(/&.*?;/g, ''); +} + + +function capitaliseFirstLetter(str) { + return str.charAt(0).toUpperCase() + str.slice(1); +} + + +function compareNumbers(a, b) { // for .sort() + return a - b; +} + + +function isInt(n) { + return n % 1 === 0; +} + + +// Returns a function, that, as long as it continues to be invoked, will not +// be triggered. The function will be called after it stops being called for +// N milliseconds. +// https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714 +function debounce(func, wait) { + var timeoutId; + var args; + var context; + var timestamp; // of most recent call + var later = function() { + var last = +new Date() - timestamp; + if (last < wait && last > 0) { + timeoutId = setTimeout(later, wait - last); + } + else { + timeoutId = null; + func.apply(context, args); + if (!timeoutId) { + context = args = null; + } + } + }; + + return function() { + context = this; + args = arguments; + timestamp = +new Date(); + if (!timeoutId) { + timeoutId = setTimeout(later, wait); + } + }; +} + + var ambigDateOfMonthRegex = /^\s*\d{4}-\d\d$/; +var ambigTimeOrZoneRegex = + /^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?)?$/; +var newMomentProto = moment.fn; // where we will attach our new methods +var oldMomentProto = $.extend({}, newMomentProto); // copy of original moment methods +var allowValueOptimization; +var setUTCValues; // function defined below +var setLocalValues; // function defined below + + +// Creating +// ------------------------------------------------------------------------------------------------- + +// Creates a new moment, similar to the vanilla moment(...) constructor, but with +// extra features (ambiguous time, enhanced formatting). When given an existing moment, +// it will function as a clone (and retain the zone of the moment). Anything else will +// result in a moment in the local zone. +fc.moment = function() { + return makeMoment(arguments); +}; + +// Sames as fc.moment, but forces the resulting moment to be in the UTC timezone. +fc.moment.utc = function() { + var mom = makeMoment(arguments, true); + + // Force it into UTC because makeMoment doesn't guarantee it + // (if given a pre-existing moment for example) + if (mom.hasTime()) { // don't give ambiguously-timed moments a UTC zone + mom.utc(); + } + + return mom; +}; + +// Same as fc.moment, but when given an ISO8601 string, the timezone offset is preserved. +// ISO8601 strings with no timezone offset will become ambiguously zoned. +fc.moment.parseZone = function() { + return makeMoment(arguments, true, true); +}; + +// Builds an enhanced moment from args. When given an existing moment, it clones. When given a +// native Date, or called with no arguments (the current time), the resulting moment will be local. +// Anything else needs to be "parsed" (a string or an array), and will be affected by: +// parseAsUTC - if there is no zone information, should we parse the input in UTC? +// parseZone - if there is zone information, should we force the zone of the moment? +function makeMoment(args, parseAsUTC, parseZone) { + var input = args[0]; + var isSingleString = args.length == 1 && typeof input === 'string'; + var isAmbigTime; + var isAmbigZone; + var ambigMatch; + var mom; + + if (moment.isMoment(input)) { + mom = moment.apply(null, args); // clone it + transferAmbigs(input, mom); // the ambig flags weren't transfered with the clone + } + else if (isNativeDate(input) || input === undefined) { + mom = moment.apply(null, args); // will be local + } + else { // "parsing" is required + isAmbigTime = false; + isAmbigZone = false; + + if (isSingleString) { + if (ambigDateOfMonthRegex.test(input)) { + // accept strings like '2014-05', but convert to the first of the month + input += '-01'; + args = [ input ]; // for when we pass it on to moment's constructor + isAmbigTime = true; + isAmbigZone = true; + } + else if ((ambigMatch = ambigTimeOrZoneRegex.exec(input))) { + isAmbigTime = !ambigMatch[5]; // no time part? + isAmbigZone = true; + } + } + else if ($.isArray(input)) { + // arrays have no timezone information, so assume ambiguous zone + isAmbigZone = true; + } + // otherwise, probably a string with a format + + if (parseAsUTC || isAmbigTime) { + mom = moment.utc.apply(moment, args); + } + else { + mom = moment.apply(null, args); + } + + if (isAmbigTime) { + mom._ambigTime = true; + mom._ambigZone = true; // ambiguous time always means ambiguous zone + } + else if (parseZone) { // let's record the inputted zone somehow + if (isAmbigZone) { + mom._ambigZone = true; + } + else if (isSingleString) { + mom.zone(input); // if not a valid zone, will assign UTC + } + } + } + + mom._fullCalendar = true; // flag for extended functionality + + return mom; +} + + +// A clone method that works with the flags related to our enhanced functionality. +// In the future, use moment.momentProperties +newMomentProto.clone = function() { + var mom = oldMomentProto.clone.apply(this, arguments); + + // these flags weren't transfered with the clone + transferAmbigs(this, mom); + if (this._fullCalendar) { + mom._fullCalendar = true; + } + + return mom; +}; + + +// Time-of-day +// ------------------------------------------------------------------------------------------------- + +// GETTER +// Returns a Duration with the hours/minutes/seconds/ms values of the moment. +// If the moment has an ambiguous time, a duration of 00:00 will be returned. +// +// SETTER +// You can supply a Duration, a Moment, or a Duration-like argument. +// When setting the time, and the moment has an ambiguous time, it then becomes unambiguous. +newMomentProto.time = function(time) { + + // Fallback to the original method (if there is one) if this moment wasn't created via FullCalendar. + // `time` is a generic enough method name where this precaution is necessary to avoid collisions w/ other plugins. + if (!this._fullCalendar) { + return oldMomentProto.time.apply(this, arguments); + } + + if (time == null) { // getter + return moment.duration({ + hours: this.hours(), + minutes: this.minutes(), + seconds: this.seconds(), + milliseconds: this.milliseconds() + }); + } + else { // setter + + this._ambigTime = false; // mark that the moment now has a time + + if (!moment.isDuration(time) && !moment.isMoment(time)) { + time = moment.duration(time); + } + + // The day value should cause overflow (so 24 hours becomes 00:00:00 of next day). + // Only for Duration times, not Moment times. + var dayHours = 0; + if (moment.isDuration(time)) { + dayHours = Math.floor(time.asDays()) * 24; + } + + // We need to set the individual fields. + // Can't use startOf('day') then add duration. In case of DST at start of day. + return this.hours(dayHours + time.hours()) + .minutes(time.minutes()) + .seconds(time.seconds()) + .milliseconds(time.milliseconds()); + } +}; + +// Converts the moment to UTC, stripping out its time-of-day and timezone offset, +// but preserving its YMD. A moment with a stripped time will display no time +// nor timezone offset when .format() is called. +newMomentProto.stripTime = function() { + var a; + + if (!this._ambigTime) { + + // get the values before any conversion happens + a = this.toArray(); // array of y/m/d/h/m/s/ms + + this.utc(); // set the internal UTC flag (will clear the ambig flags) + setUTCValues(this, a.slice(0, 3)); // set the year/month/date. time will be zero + + // Mark the time as ambiguous. This needs to happen after the .utc() call, which calls .zone(), + // which clears all ambig flags. Same with setUTCValues with moment-timezone. + this._ambigTime = true; + this._ambigZone = true; // if ambiguous time, also ambiguous timezone offset + } + + return this; // for chaining +}; + +// Returns if the moment has a non-ambiguous time (boolean) +newMomentProto.hasTime = function() { + return !this._ambigTime; +}; + + +// Timezone +// ------------------------------------------------------------------------------------------------- + +// Converts the moment to UTC, stripping out its timezone offset, but preserving its +// YMD and time-of-day. A moment with a stripped timezone offset will display no +// timezone offset when .format() is called. +newMomentProto.stripZone = function() { + var a, wasAmbigTime; + + if (!this._ambigZone) { + + // get the values before any conversion happens + a = this.toArray(); // array of y/m/d/h/m/s/ms + wasAmbigTime = this._ambigTime; + + this.utc(); // set the internal UTC flag (will clear the ambig flags) + setUTCValues(this, a); // will set the year/month/date/hours/minutes/seconds/ms + + if (wasAmbigTime) { + // the above call to .utc()/.zone() unfortunately clears the ambig flags, so reassign + this._ambigTime = true; + } + + // Mark the zone as ambiguous. This needs to happen after the .utc() call, which calls .zone(), + // which clears all ambig flags. Same with setUTCValues with moment-timezone. + this._ambigZone = true; + } + + return this; // for chaining +}; + +// Returns of the moment has a non-ambiguous timezone offset (boolean) +newMomentProto.hasZone = function() { + return !this._ambigZone; +}; + +// this method implicitly marks a zone (will get called upon .utc() and .local()) +newMomentProto.zone = function(tzo) { + + if (tzo != null) { // setter + // these assignments needs to happen before the original zone method is called. + // I forget why, something to do with a browser crash. + this._ambigTime = false; + this._ambigZone = false; + } + + return oldMomentProto.zone.apply(this, arguments); +}; + +// this method implicitly marks a zone +newMomentProto.local = function() { + var a = this.toArray(); // year,month,date,hours,minutes,seconds,ms as an array + var wasAmbigZone = this._ambigZone; + + oldMomentProto.local.apply(this, arguments); // will clear ambig flags + + if (wasAmbigZone) { + // If the moment was ambiguously zoned, the date fields were stored as UTC. + // We want to preserve these, but in local time. + setLocalValues(this, a); + } + + return this; // for chaining +}; + + +// Formatting +// ------------------------------------------------------------------------------------------------- + +newMomentProto.format = function() { + if (this._fullCalendar && arguments[0]) { // an enhanced moment? and a format string provided? + return formatDate(this, arguments[0]); // our extended formatting + } + if (this._ambigTime) { + return oldMomentFormat(this, 'YYYY-MM-DD'); + } + if (this._ambigZone) { + return oldMomentFormat(this, 'YYYY-MM-DD[T]HH:mm:ss'); + } + return oldMomentProto.format.apply(this, arguments); +}; + +newMomentProto.toISOString = function() { + if (this._ambigTime) { + return oldMomentFormat(this, 'YYYY-MM-DD'); + } + if (this._ambigZone) { + return oldMomentFormat(this, 'YYYY-MM-DD[T]HH:mm:ss'); + } + return oldMomentProto.toISOString.apply(this, arguments); +}; + + +// Querying +// ------------------------------------------------------------------------------------------------- + +// Is the moment within the specified range? `end` is exclusive. +// FYI, this method is not a standard Moment method, so always do our enhanced logic. +newMomentProto.isWithin = function(start, end) { + var a = commonlyAmbiguate([ this, start, end ]); + return a[0] >= a[1] && a[0] < a[2]; +}; + +// When isSame is called with units, timezone ambiguity is normalized before the comparison happens. +// If no units specified, the two moments must be identically the same, with matching ambig flags. +newMomentProto.isSame = function(input, units) { + var a; + + // only do custom logic if this is an enhanced moment + if (!this._fullCalendar) { + return oldMomentProto.isSame.apply(this, arguments); + } + + if (units) { + a = commonlyAmbiguate([ this, input ], true); // normalize timezones but don't erase times + return oldMomentProto.isSame.call(a[0], a[1], units); + } + else { + input = fc.moment.parseZone(input); // normalize input + return oldMomentProto.isSame.call(this, input) && + Boolean(this._ambigTime) === Boolean(input._ambigTime) && + Boolean(this._ambigZone) === Boolean(input._ambigZone); + } +}; + +// Make these query methods work with ambiguous moments +$.each([ + 'isBefore', + 'isAfter' +], function(i, methodName) { + newMomentProto[methodName] = function(input, units) { + var a; + + // only do custom logic if this is an enhanced moment + if (!this._fullCalendar) { + return oldMomentProto[methodName].apply(this, arguments); + } + + a = commonlyAmbiguate([ this, input ]); + return oldMomentProto[methodName].call(a[0], a[1], units); + }; +}); + + +// Misc Internals +// ------------------------------------------------------------------------------------------------- + +// given an array of moment-like inputs, return a parallel array w/ moments similarly ambiguated. +// for example, of one moment has ambig time, but not others, all moments will have their time stripped. +// set `preserveTime` to `true` to keep times, but only normalize zone ambiguity. +// returns the original moments if no modifications are necessary. +function commonlyAmbiguate(inputs, preserveTime) { + var anyAmbigTime = false; + var anyAmbigZone = false; + var len = inputs.length; + var moms = []; + var i, mom; + + // parse inputs into real moments and query their ambig flags + for (i = 0; i < len; i++) { + mom = inputs[i]; + if (!moment.isMoment(mom)) { + mom = fc.moment.parseZone(mom); + } + anyAmbigTime = anyAmbigTime || mom._ambigTime; + anyAmbigZone = anyAmbigZone || mom._ambigZone; + moms.push(mom); + } + + // strip each moment down to lowest common ambiguity + // use clones to avoid modifying the original moments + for (i = 0; i < len; i++) { + mom = moms[i]; + if (!preserveTime && anyAmbigTime && !mom._ambigTime) { + moms[i] = mom.clone().stripTime(); + } + else if (anyAmbigZone && !mom._ambigZone) { + moms[i] = mom.clone().stripZone(); + } + } + + return moms; +} + +// Transfers all the flags related to ambiguous time/zone from the `src` moment to the `dest` moment +function transferAmbigs(src, dest) { + if (src._ambigTime) { + dest._ambigTime = true; + } + else if (dest._ambigTime) { + dest._ambigTime = false; + } + + if (src._ambigZone) { + dest._ambigZone = true; + } + else if (dest._ambigZone) { + dest._ambigZone = false; + } +} + + +// Sets the year/month/date/etc values of the moment from the given array. +// Inefficient because it calls each individual setter. +function setMomentValues(mom, a) { + mom.year(a[0] || 0) + .month(a[1] || 0) + .date(a[2] || 0) + .hours(a[3] || 0) + .minutes(a[4] || 0) + .seconds(a[5] || 0) + .milliseconds(a[6] || 0); +} + +// Can we set the moment's internal date directly? +allowValueOptimization = '_d' in moment() && 'updateOffset' in moment; + +// Utility function. Accepts a moment and an array of the UTC year/month/date/etc values to set. +// Assumes the given moment is already in UTC mode. +setUTCValues = allowValueOptimization ? function(mom, a) { + // simlate what moment's accessors do + mom._d.setTime(Date.UTC.apply(Date, a)); + moment.updateOffset(mom, false); // keepTime=false +} : setMomentValues; + +// Utility function. Accepts a moment and an array of the local year/month/date/etc values to set. +// Assumes the given moment is already in local mode. +setLocalValues = allowValueOptimization ? function(mom, a) { + // simlate what moment's accessors do + mom._d.setTime(+new Date( // FYI, there is now way to apply an array of args to a constructor + a[0] || 0, + a[1] || 0, + a[2] || 0, + a[3] || 0, + a[4] || 0, + a[5] || 0, + a[6] || 0 + )); + moment.updateOffset(mom, false); // keepTime=false +} : setMomentValues; + +// Single Date Formatting +// ------------------------------------------------------------------------------------------------- + + +// call this if you want Moment's original format method to be used +function oldMomentFormat(mom, formatStr) { + return oldMomentProto.format.call(mom, formatStr); // oldMomentProto defined in moment-ext.js +} + + +// Formats `date` with a Moment formatting string, but allow our non-zero areas and +// additional token. +function formatDate(date, formatStr) { + return formatDateWithChunks(date, getFormatStringChunks(formatStr)); +} + + +function formatDateWithChunks(date, chunks) { + var s = ''; + var i; + + for (i=0; i<chunks.length; i++) { + s += formatDateWithChunk(date, chunks[i]); + } + + return s; +} + + +// addition formatting tokens we want recognized +var tokenOverrides = { + t: function(date) { // "a" or "p" + return oldMomentFormat(date, 'a').charAt(0); + }, + T: function(date) { // "A" or "P" + return oldMomentFormat(date, 'A').charAt(0); + } +}; + + +function formatDateWithChunk(date, chunk) { + var token; + var maybeStr; + + if (typeof chunk === 'string') { // a literal string + return chunk; + } + else if ((token = chunk.token)) { // a token, like "YYYY" + if (tokenOverrides[token]) { + return tokenOverrides[token](date); // use our custom token + } + return oldMomentFormat(date, token); + } + else if (chunk.maybe) { // a grouping of other chunks that must be non-zero + maybeStr = formatDateWithChunks(date, chunk.maybe); + if (maybeStr.match(/[1-9]/)) { + return maybeStr; + } + } + + return ''; +} + + +// Date Range Formatting +// ------------------------------------------------------------------------------------------------- +// TODO: make it work with timezone offset + +// Using a formatting string meant for a single date, generate a range string, like +// "Sep 2 - 9 2013", that intelligently inserts a separator where the dates differ. +// If the dates are the same as far as the format string is concerned, just return a single +// rendering of one date, without any separator. +function formatRange(date1, date2, formatStr, separator, isRTL) { + var localeData; + + date1 = fc.moment.parseZone(date1); + date2 = fc.moment.parseZone(date2); + + localeData = (date1.localeData || date1.lang).call(date1); // works with moment-pre-2.8 + + // Expand localized format strings, like "LL" -> "MMMM D YYYY" + formatStr = localeData.longDateFormat(formatStr) || formatStr; + // BTW, this is not important for `formatDate` because it is impossible to put custom tokens + // or non-zero areas in Moment's localized format strings. + + separator = separator || ' - '; + + return formatRangeWithChunks( + date1, + date2, + getFormatStringChunks(formatStr), + separator, + isRTL + ); +} +fc.formatRange = formatRange; // expose + + +function formatRangeWithChunks(date1, date2, chunks, separator, isRTL) { + var chunkStr; // the rendering of the chunk + var leftI; + var leftStr = ''; + var rightI; + var rightStr = ''; + var middleI; + var middleStr1 = ''; + var middleStr2 = ''; + var middleStr = ''; + + // Start at the leftmost side of the formatting string and continue until you hit a token + // that is not the same between dates. + for (leftI=0; leftI<chunks.length; leftI++) { + chunkStr = formatSimilarChunk(date1, date2, chunks[leftI]); + if (chunkStr === false) { + break; + } + leftStr += chunkStr; + } + + // Similarly, start at the rightmost side of the formatting string and move left + for (rightI=chunks.length-1; rightI>leftI; rightI--) { + chunkStr = formatSimilarChunk(date1, date2, chunks[rightI]); + if (chunkStr === false) { + break; + } + rightStr = chunkStr + rightStr; + } + + // The area in the middle is different for both of the dates. + // Collect them distinctly so we can jam them together later. + for (middleI=leftI; middleI<=rightI; middleI++) { + middleStr1 += formatDateWithChunk(date1, chunks[middleI]); + middleStr2 += formatDateWithChunk(date2, chunks[middleI]); + } + + if (middleStr1 || middleStr2) { + if (isRTL) { + middleStr = middleStr2 + separator + middleStr1; + } + else { + middleStr = middleStr1 + separator + middleStr2; + } + } + + return leftStr + middleStr + rightStr; +} + + +var similarUnitMap = { + Y: 'year', + M: 'month', + D: 'day', // day of month + d: 'day', // day of week + // prevents a separator between anything time-related... + A: 'second', // AM/PM + a: 'second', // am/pm + T: 'second', // A/P + t: 'second', // a/p + H: 'second', // hour (24) + h: 'second', // hour (12) + m: 'second', // minute + s: 'second' // second +}; +// TODO: week maybe? + + +// Given a formatting chunk, and given that both dates are similar in the regard the +// formatting chunk is concerned, format date1 against `chunk`. Otherwise, return `false`. +function formatSimilarChunk(date1, date2, chunk) { + var token; + var unit; + + if (typeof chunk === 'string') { // a literal string + return chunk; + } + else if ((token = chunk.token)) { + unit = similarUnitMap[token.charAt(0)]; + // are the dates the same for this unit of measurement? + if (unit && date1.isSame(date2, unit)) { + return oldMomentFormat(date1, token); // would be the same if we used `date2` + // BTW, don't support custom tokens + } + } + + return false; // the chunk is NOT the same for the two dates + // BTW, don't support splitting on non-zero areas +} + + +// Chunking Utils +// ------------------------------------------------------------------------------------------------- + + +var formatStringChunkCache = {}; + + +function getFormatStringChunks(formatStr) { + if (formatStr in formatStringChunkCache) { + return formatStringChunkCache[formatStr]; + } + return (formatStringChunkCache[formatStr] = chunkFormatString(formatStr)); +} + + +// Break the formatting string into an array of chunks +function chunkFormatString(formatStr) { + var chunks = []; + var chunker = /\[([^\]]*)\]|\(([^\)]*)\)|(LT|(\w)\4*o?)|([^\w\[\(]+)/g; // TODO: more descrimination + var match; + + while ((match = chunker.exec(formatStr))) { + if (match[1]) { // a literal string inside [ ... ] + chunks.push(match[1]); + } + else if (match[2]) { // non-zero formatting inside ( ... ) + chunks.push({ maybe: chunkFormatString(match[2]) }); + } + else if (match[3]) { // a formatting token + chunks.push({ token: match[3] }); + } + else if (match[5]) { // an unenclosed literal string + chunks.push(match[5]); + } + } + + return chunks; +} + + fc.Class = Class; // export + +// class that all other classes will inherit from +function Class() { } + +// called upon a class to create a subclass +Class.extend = function(members) { + var superClass = this; + var subClass; + + members = members || {}; + + // ensure a constructor for the subclass, forwarding all arguments to the super-constructor if it doesn't exist + if (hasOwnProp(members, 'constructor')) { + subClass = members.constructor; + } + if (typeof subClass !== 'function') { + subClass = members.constructor = function() { + superClass.apply(this, arguments); + }; + } + + // build the base prototype for the subclass, which is an new object chained to the superclass's prototype + subClass.prototype = createObject(superClass.prototype); + + // copy each member variable/method onto the the subclass's prototype + copyOwnProps(members, subClass.prototype); + + // copy over all class variables/methods to the subclass, such as `extend` and `mixin` + copyOwnProps(superClass, subClass); + + return subClass; +}; + +// adds new member variables/methods to the class's prototype. +// can be called with another class, or a plain object hash containing new members. +Class.mixin = function(members) { + copyOwnProps(members.prototype || members, this.prototype); +}; + /* A rectangular panel that is absolutely positioned over other content +------------------------------------------------------------------------------------------------------------------------ +Options: + - className (string) + - content (HTML string or jQuery element set) + - parentEl + - top + - left + - right (the x coord of where the right edge should be. not a "CSS" right) + - autoHide (boolean) + - show (callback) + - hide (callback) +*/ + +var Popover = Class.extend({ + + isHidden: true, + options: null, + el: null, // the container element for the popover. generated by this object + documentMousedownProxy: null, // document mousedown handler bound to `this` + margin: 10, // the space required between the popover and the edges of the scroll container + + + constructor: function(options) { + this.options = options || {}; + }, + + + // Shows the popover on the specified position. Renders it if not already + show: function() { + if (this.isHidden) { + if (!this.el) { + this.render(); + } + this.el.show(); + this.position(); + this.isHidden = false; + this.trigger('show'); + } + }, + + + // Hides the popover, through CSS, but does not remove it from the DOM + hide: function() { + if (!this.isHidden) { + this.el.hide(); + this.isHidden = true; + this.trigger('hide'); + } + }, + + + // Creates `this.el` and renders content inside of it + render: function() { + var _this = this; + var options = this.options; + + this.el = $('<div class="fc-popover"/>') + .addClass(options.className || '') + .css({ + // position initially to the top left to avoid creating scrollbars + top: 0, + left: 0 + }) + .append(options.content) + .appendTo(options.parentEl); + + // when a click happens on anything inside with a 'fc-close' className, hide the popover + this.el.on('click', '.fc-close', function() { + _this.hide(); + }); + + if (options.autoHide) { + $(document).on('mousedown', this.documentMousedownProxy = $.proxy(this, 'documentMousedown')); + } + }, + + + // Triggered when the user clicks *anywhere* in the document, for the autoHide feature + documentMousedown: function(ev) { + // only hide the popover if the click happened outside the popover + if (this.el && !$(ev.target).closest(this.el).length) { + this.hide(); + } + }, + + + // Hides and unregisters any handlers + destroy: function() { + this.hide(); + + if (this.el) { + this.el.remove(); + this.el = null; + } + + $(document).off('mousedown', this.documentMousedownProxy); + }, + + + // Positions the popover optimally, using the top/left/right options + position: function() { + var options = this.options; + var origin = this.el.offsetParent().offset(); + var width = this.el.outerWidth(); + var height = this.el.outerHeight(); + var windowEl = $(window); + var viewportEl = getScrollParent(this.el); + var viewportTop; + var viewportLeft; + var viewportOffset; + var top; // the "position" (not "offset") values for the popover + var left; // + + // compute top and left + top = options.top || 0; + if (options.left !== undefined) { + left = options.left; + } + else if (options.right !== undefined) { + left = options.right - width; // derive the left value from the right value + } + else { + left = 0; + } + + if (viewportEl.is(window) || viewportEl.is(document)) { // normalize getScrollParent's result + viewportEl = windowEl; + viewportTop = 0; // the window is always at the top left + viewportLeft = 0; // (and .offset() won't work if called here) + } + else { + viewportOffset = viewportEl.offset(); + viewportTop = viewportOffset.top; + viewportLeft = viewportOffset.left; + } + + // if the window is scrolled, it causes the visible area to be further down + viewportTop += windowEl.scrollTop(); + viewportLeft += windowEl.scrollLeft(); + + // constrain to the view port. if constrained by two edges, give precedence to top/left + if (options.viewportConstrain !== false) { + top = Math.min(top, viewportTop + viewportEl.outerHeight() - height - this.margin); + top = Math.max(top, viewportTop + this.margin); + left = Math.min(left, viewportLeft + viewportEl.outerWidth() - width - this.margin); + left = Math.max(left, viewportLeft + this.margin); + } + + this.el.css({ + top: top - origin.top, + left: left - origin.left + }); + }, + + + // Triggers a callback. Calls a function in the option hash of the same name. + // Arguments beyond the first `name` are forwarded on. + // TODO: better code reuse for this. Repeat code + trigger: function(name) { + if (this.options[name]) { + this.options[name].apply(this, Array.prototype.slice.call(arguments, 1)); + } + } + +}); + + /* A "coordinate map" converts pixel coordinates into an associated cell, which has an associated date +------------------------------------------------------------------------------------------------------------------------ +Common interface: + + CoordMap.prototype = { + build: function() {}, + getCell: function(x, y) {} + }; + +*/ + +/* Coordinate map for a grid component +----------------------------------------------------------------------------------------------------------------------*/ + +var GridCoordMap = Class.extend({ + + grid: null, // reference to the Grid + rowCoords: null, // array of {top,bottom} objects + colCoords: null, // array of {left,right} objects + + containerEl: null, // container element that all coordinates are constrained to. optionally assigned + minX: null, + maxX: null, // exclusive + minY: null, + maxY: null, // exclusive + + + constructor: function(grid) { + this.grid = grid; + }, + + + // Queries the grid for the coordinates of all the cells + build: function() { + this.rowCoords = this.grid.computeRowCoords(); + this.colCoords = this.grid.computeColCoords(); + this.computeBounds(); + }, + + + // Clears the coordinates data to free up memory + clear: function() { + this.rowCoords = null; + this.colCoords = null; + }, + + + // Given a coordinate of the document, gets the associated cell. If no cell is underneath, returns null + getCell: function(x, y) { + var rowCoords = this.rowCoords; + var colCoords = this.colCoords; + var hitRow = null; + var hitCol = null; + var i, coords; + var cell; + + if (this.inBounds(x, y)) { + + for (i = 0; i < rowCoords.length; i++) { + coords = rowCoords[i]; + if (y >= coords.top && y < coords.bottom) { + hitRow = i; + break; + } + } + + for (i = 0; i < colCoords.length; i++) { + coords = colCoords[i]; + if (x >= coords.left && x < coords.right) { + hitCol = i; + break; + } + } + + if (hitRow !== null && hitCol !== null) { + cell = this.grid.getCell(hitRow, hitCol); + cell.grid = this.grid; // for DragListener's isCellsEqual. dragging between grids + return cell; + } + } + + return null; + }, + + + // If there is a containerEl, compute the bounds into min/max values + computeBounds: function() { + var containerOffset; + + if (this.containerEl) { + containerOffset = this.containerEl.offset(); + this.minX = containerOffset.left; + this.maxX = containerOffset.left + this.containerEl.outerWidth(); + this.minY = containerOffset.top; + this.maxY = containerOffset.top + this.containerEl.outerHeight(); + } + }, + + + // Determines if the given coordinates are in bounds. If no `containerEl`, always true + inBounds: function(x, y) { + if (this.containerEl) { + return x >= this.minX && x < this.maxX && y >= this.minY && y < this.maxY; + } + return true; + } + +}); + + +/* Coordinate map that is a combination of multiple other coordinate maps +----------------------------------------------------------------------------------------------------------------------*/ + +var ComboCoordMap = Class.extend({ + + coordMaps: null, // an array of CoordMaps + + + constructor: function(coordMaps) { + this.coordMaps = coordMaps; + }, + + + // Builds all coordMaps + build: function() { + var coordMaps = this.coordMaps; + var i; + + for (i = 0; i < coordMaps.length; i++) { + coordMaps[i].build(); + } + }, + + + // Queries all coordMaps for the cell underneath the given coordinates, returning the first result + getCell: function(x, y) { + var coordMaps = this.coordMaps; + var cell = null; + var i; + + for (i = 0; i < coordMaps.length && !cell; i++) { + cell = coordMaps[i].getCell(x, y); + } + + return cell; + }, + + + // Clears all coordMaps + clear: function() { + var coordMaps = this.coordMaps; + var i; + + for (i = 0; i < coordMaps.length; i++) { + coordMaps[i].clear(); + } + } + +}); + + /* Tracks mouse movements over a CoordMap and raises events about which cell the mouse is over. +----------------------------------------------------------------------------------------------------------------------*/ +// TODO: very useful to have a handler that gets called upon cellOut OR when dragging stops (for cleanup) + +var DragListener = Class.extend({ + + coordMap: null, + options: null, + + isListening: false, + isDragging: false, + + // the cell the mouse was over when listening started + origCell: null, + + // the cell the mouse is over + cell: null, + + // coordinates of the initial mousedown + mouseX0: null, + mouseY0: null, + + // handler attached to the document, bound to the DragListener's `this` + mousemoveProxy: null, + mouseupProxy: null, + + scrollEl: null, + scrollBounds: null, // { top, bottom, left, right } + scrollTopVel: null, // pixels per second + scrollLeftVel: null, // pixels per second + scrollIntervalId: null, // ID of setTimeout for scrolling animation loop + scrollHandlerProxy: null, // this-scoped function for handling when scrollEl is scrolled + + scrollSensitivity: 30, // pixels from edge for scrolling to start + scrollSpeed: 200, // pixels per second, at maximum speed + scrollIntervalMs: 50, // millisecond wait between scroll increment + + + constructor: function(coordMap, options) { + this.coordMap = coordMap; + this.options = options || {}; + }, + + + // Call this when the user does a mousedown. Will probably lead to startListening + mousedown: function(ev) { + if (isPrimaryMouseButton(ev)) { + + ev.preventDefault(); // prevents native selection in most browsers + + this.startListening(ev); + + // start the drag immediately if there is no minimum distance for a drag start + if (!this.options.distance) { + this.startDrag(ev); + } + } + }, + + + // Call this to start tracking mouse movements + startListening: function(ev) { + var scrollParent; + var cell; + + if (!this.isListening) { + + // grab scroll container and attach handler + if (ev && this.options.scroll) { + scrollParent = getScrollParent($(ev.target)); + if (!scrollParent.is(window) && !scrollParent.is(document)) { + this.scrollEl = scrollParent; + + // scope to `this`, and use `debounce` to make sure rapid calls don't happen + this.scrollHandlerProxy = debounce($.proxy(this, 'scrollHandler'), 100); + this.scrollEl.on('scroll', this.scrollHandlerProxy); + } + } + + this.computeCoords(); // relies on `scrollEl` + + // get info on the initial cell and its coordinates + if (ev) { + cell = this.getCell(ev); + this.origCell = cell; + + this.mouseX0 = ev.pageX; + this.mouseY0 = ev.pageY; + } + + $(document) + .on('mousemove', this.mousemoveProxy = $.proxy(this, 'mousemove')) + .on('mouseup', this.mouseupProxy = $.proxy(this, 'mouseup')) + .on('selectstart', this.preventDefault); // prevents native selection in IE<=8 + + this.isListening = true; + this.trigger('listenStart', ev); + } + }, + + + // Recomputes the drag-critical positions of elements + computeCoords: function() { + this.coordMap.build(); + this.computeScrollBounds(); + }, + + + // Called when the user moves the mouse + mousemove: function(ev) { + var minDistance; + var distanceSq; // current distance from mouseX0/mouseY0, squared + + if (!this.isDragging) { // if not already dragging... + // then start the drag if the minimum distance criteria is met + minDistance = this.options.distance || 1; + distanceSq = Math.pow(ev.pageX - this.mouseX0, 2) + Math.pow(ev.pageY - this.mouseY0, 2); + if (distanceSq >= minDistance * minDistance) { // use pythagorean theorem + this.startDrag(ev); + } + } + + if (this.isDragging) { + this.drag(ev); // report a drag, even if this mousemove initiated the drag + } + }, + + + // Call this to initiate a legitimate drag. + // This function is called internally from this class, but can also be called explicitly from outside + startDrag: function(ev) { + var cell; + + if (!this.isListening) { // startDrag must have manually initiated + this.startListening(); + } + + if (!this.isDragging) { + this.isDragging = true; + this.trigger('dragStart', ev); + + // report the initial cell the mouse is over + // especially important if no min-distance and drag starts immediately + cell = this.getCell(ev); // this might be different from this.origCell if the min-distance is large + if (cell) { + this.cellOver(cell); + } + } + }, + + + // Called while the mouse is being moved and when we know a legitimate drag is taking place + drag: function(ev) { + var cell; + + if (this.isDragging) { + cell = this.getCell(ev); + + if (!isCellsEqual(cell, this.cell)) { // a different cell than before? + if (this.cell) { + this.cellOut(); + } + if (cell) { + this.cellOver(cell); + } + } + + this.dragScroll(ev); // will possibly cause scrolling + } + }, + + + // Called when a the mouse has just moved over a new cell + cellOver: function(cell) { + this.cell = cell; + this.trigger('cellOver', cell, isCellsEqual(cell, this.origCell)); + }, + + + // Called when the mouse has just moved out of a cell + cellOut: function() { + if (this.cell) { + this.trigger('cellOut', this.cell); + this.cell = null; + } + }, + + + // Called when the user does a mouseup + mouseup: function(ev) { + this.stopDrag(ev); + this.stopListening(ev); + }, + + + // Called when the drag is over. Will not cause listening to stop however. + // A concluding 'cellOut' event will NOT be triggered. + stopDrag: function(ev) { + if (this.isDragging) { + this.stopScrolling(); + this.trigger('dragStop', ev); + this.isDragging = false; + } + }, + + + // Call this to stop listening to the user's mouse events + stopListening: function(ev) { + if (this.isListening) { + + // remove the scroll handler if there is a scrollEl + if (this.scrollEl) { + this.scrollEl.off('scroll', this.scrollHandlerProxy); + this.scrollHandlerProxy = null; + } + + $(document) + .off('mousemove', this.mousemoveProxy) + .off('mouseup', this.mouseupProxy) + .off('selectstart', this.preventDefault); + + this.mousemoveProxy = null; + this.mouseupProxy = null; + + this.isListening = false; + this.trigger('listenStop', ev); + + this.origCell = this.cell = null; + this.coordMap.clear(); + } + }, + + + // Gets the cell underneath the coordinates for the given mouse event + getCell: function(ev) { + return this.coordMap.getCell(ev.pageX, ev.pageY); + }, + + + // Triggers a callback. Calls a function in the option hash of the same name. + // Arguments beyond the first `name` are forwarded on. + trigger: function(name) { + if (this.options[name]) { + this.options[name].apply(this, Array.prototype.slice.call(arguments, 1)); + } + }, + + + // Stops a given mouse event from doing it's native browser action. In our case, text selection. + preventDefault: function(ev) { + ev.preventDefault(); + }, + + + /* Scrolling + ------------------------------------------------------------------------------------------------------------------*/ + + + // Computes and stores the bounding rectangle of scrollEl + computeScrollBounds: function() { + var el = this.scrollEl; + var offset; + + if (el) { + offset = el.offset(); + this.scrollBounds = { + top: offset.top, + left: offset.left, + bottom: offset.top + el.outerHeight(), + right: offset.left + el.outerWidth() + }; + } + }, + + + // Called when the dragging is in progress and scrolling should be updated + dragScroll: function(ev) { + var sensitivity = this.scrollSensitivity; + var bounds = this.scrollBounds; + var topCloseness, bottomCloseness; + var leftCloseness, rightCloseness; + var topVel = 0; + var leftVel = 0; + + if (bounds) { // only scroll if scrollEl exists + + // compute closeness to edges. valid range is from 0.0 - 1.0 + topCloseness = (sensitivity - (ev.pageY - bounds.top)) / sensitivity; + bottomCloseness = (sensitivity - (bounds.bottom - ev.pageY)) / sensitivity; + leftCloseness = (sensitivity - (ev.pageX - bounds.left)) / sensitivity; + rightCloseness = (sensitivity - (bounds.right - ev.pageX)) / sensitivity; + + // translate vertical closeness into velocity. + // mouse must be completely in bounds for velocity to happen. + if (topCloseness >= 0 && topCloseness <= 1) { + topVel = topCloseness * this.scrollSpeed * -1; // negative. for scrolling up + } + else if (bottomCloseness >= 0 && bottomCloseness <= 1) { + topVel = bottomCloseness * this.scrollSpeed; + } + + // translate horizontal closeness into velocity + if (leftCloseness >= 0 && leftCloseness <= 1) { + leftVel = leftCloseness * this.scrollSpeed * -1; // negative. for scrolling left + } + else if (rightCloseness >= 0 && rightCloseness <= 1) { + leftVel = rightCloseness * this.scrollSpeed; + } + } + + this.setScrollVel(topVel, leftVel); + }, + + + // Sets the speed-of-scrolling for the scrollEl + setScrollVel: function(topVel, leftVel) { + + this.scrollTopVel = topVel; + this.scrollLeftVel = leftVel; + + this.constrainScrollVel(); // massages into realistic values + + // if there is non-zero velocity, and an animation loop hasn't already started, then START + if ((this.scrollTopVel || this.scrollLeftVel) && !this.scrollIntervalId) { + this.scrollIntervalId = setInterval( + $.proxy(this, 'scrollIntervalFunc'), // scope to `this` + this.scrollIntervalMs + ); + } + }, + + + // Forces scrollTopVel and scrollLeftVel to be zero if scrolling has already gone all the way + constrainScrollVel: function() { + var el = this.scrollEl; + + if (this.scrollTopVel < 0) { // scrolling up? + if (el.scrollTop() <= 0) { // already scrolled all the way up? + this.scrollTopVel = 0; + } + } + else if (this.scrollTopVel > 0) { // scrolling down? + if (el.scrollTop() + el[0].clientHeight >= el[0].scrollHeight) { // already scrolled all the way down? + this.scrollTopVel = 0; + } + } + + if (this.scrollLeftVel < 0) { // scrolling left? + if (el.scrollLeft() <= 0) { // already scrolled all the left? + this.scrollLeftVel = 0; + } + } + else if (this.scrollLeftVel > 0) { // scrolling right? + if (el.scrollLeft() + el[0].clientWidth >= el[0].scrollWidth) { // already scrolled all the way right? + this.scrollLeftVel = 0; + } + } + }, + + + // This function gets called during every iteration of the scrolling animation loop + scrollIntervalFunc: function() { + var el = this.scrollEl; + var frac = this.scrollIntervalMs / 1000; // considering animation frequency, what the vel should be mult'd by + + // change the value of scrollEl's scroll + if (this.scrollTopVel) { + el.scrollTop(el.scrollTop() + this.scrollTopVel * frac); + } + if (this.scrollLeftVel) { + el.scrollLeft(el.scrollLeft() + this.scrollLeftVel * frac); + } + + this.constrainScrollVel(); // since the scroll values changed, recompute the velocities + + // if scrolled all the way, which causes the vels to be zero, stop the animation loop + if (!this.scrollTopVel && !this.scrollLeftVel) { + this.stopScrolling(); + } + }, + + + // Kills any existing scrolling animation loop + stopScrolling: function() { + if (this.scrollIntervalId) { + clearInterval(this.scrollIntervalId); + this.scrollIntervalId = null; + + // when all done with scrolling, recompute positions since they probably changed + this.computeCoords(); + } + }, + + + // Get called when the scrollEl is scrolled (NOTE: this is delayed via debounce) + scrollHandler: function() { + // recompute all coordinates, but *only* if this is *not* part of our scrolling animation + if (!this.scrollIntervalId) { + this.computeCoords(); + } + } + +}); + + +// Returns `true` if the cells are identically equal. `false` otherwise. +// They must have the same row, col, and be from the same grid. +// Two null values will be considered equal, as two "out of the grid" states are the same. +function isCellsEqual(cell1, cell2) { + + if (!cell1 && !cell2) { + return true; + } + + if (cell1 && cell2) { + return cell1.grid === cell2.grid && + cell1.row === cell2.row && + cell1.col === cell2.col; + } + + return false; +} + + /* Creates a clone of an element and lets it track the mouse as it moves +----------------------------------------------------------------------------------------------------------------------*/ + +var MouseFollower = Class.extend({ + + options: null, + + sourceEl: null, // the element that will be cloned and made to look like it is dragging + el: null, // the clone of `sourceEl` that will track the mouse + parentEl: null, // the element that `el` (the clone) will be attached to + + // the initial position of el, relative to the offset parent. made to match the initial offset of sourceEl + top0: null, + left0: null, + + // the initial position of the mouse + mouseY0: null, + mouseX0: null, + + // the number of pixels the mouse has moved from its initial position + topDelta: null, + leftDelta: null, + + mousemoveProxy: null, // document mousemove handler, bound to the MouseFollower's `this` + + isFollowing: false, + isHidden: false, + isAnimating: false, // doing the revert animation? + + constructor: function(sourceEl, options) { + this.options = options = options || {}; + this.sourceEl = sourceEl; + this.parentEl = options.parentEl ? $(options.parentEl) : sourceEl.parent(); // default to sourceEl's parent + }, + + + // Causes the element to start following the mouse + start: function(ev) { + if (!this.isFollowing) { + this.isFollowing = true; + + this.mouseY0 = ev.pageY; + this.mouseX0 = ev.pageX; + this.topDelta = 0; + this.leftDelta = 0; + + if (!this.isHidden) { + this.updatePosition(); + } + + $(document).on('mousemove', this.mousemoveProxy = $.proxy(this, 'mousemove')); + } + }, + + + // Causes the element to stop following the mouse. If shouldRevert is true, will animate back to original position. + // `callback` gets invoked when the animation is complete. If no animation, it is invoked immediately. + stop: function(shouldRevert, callback) { + var _this = this; + var revertDuration = this.options.revertDuration; + + function complete() { + this.isAnimating = false; + _this.destroyEl(); + + this.top0 = this.left0 = null; // reset state for future updatePosition calls + + if (callback) { + callback(); + } + } + + if (this.isFollowing && !this.isAnimating) { // disallow more than one stop animation at a time + this.isFollowing = false; + + $(document).off('mousemove', this.mousemoveProxy); + + if (shouldRevert && revertDuration && !this.isHidden) { // do a revert animation? + this.isAnimating = true; + this.el.animate({ + top: this.top0, + left: this.left0 + }, { + duration: revertDuration, + complete: complete + }); + } + else { + complete(); + } + } + }, + + + // Gets the tracking element. Create it if necessary + getEl: function() { + var el = this.el; + + if (!el) { + this.sourceEl.width(); // hack to force IE8 to compute correct bounding box + el = this.el = this.sourceEl.clone() + .css({ + position: 'absolute', + visibility: '', // in case original element was hidden (commonly through hideEvents()) + display: this.isHidden ? 'none' : '', // for when initially hidden + margin: 0, + right: 'auto', // erase and set width instead + bottom: 'auto', // erase and set height instead + width: this.sourceEl.width(), // explicit height in case there was a 'right' value + height: this.sourceEl.height(), // explicit width in case there was a 'bottom' value + opacity: this.options.opacity || '', + zIndex: this.options.zIndex + }) + .appendTo(this.parentEl); + } + + return el; + }, + + + // Removes the tracking element if it has already been created + destroyEl: function() { + if (this.el) { + this.el.remove(); + this.el = null; + } + }, + + + // Update the CSS position of the tracking element + updatePosition: function() { + var sourceOffset; + var origin; + + this.getEl(); // ensure this.el + + // make sure origin info was computed + if (this.top0 === null) { + this.sourceEl.width(); // hack to force IE8 to compute correct bounding box + sourceOffset = this.sourceEl.offset(); + origin = this.el.offsetParent().offset(); + this.top0 = sourceOffset.top - origin.top; + this.left0 = sourceOffset.left - origin.left; + } + + this.el.css({ + top: this.top0 + this.topDelta, + left: this.left0 + this.leftDelta + }); + }, + + + // Gets called when the user moves the mouse + mousemove: function(ev) { + this.topDelta = ev.pageY - this.mouseY0; + this.leftDelta = ev.pageX - this.mouseX0; + + if (!this.isHidden) { + this.updatePosition(); + } + }, + + + // Temporarily makes the tracking element invisible. Can be called before following starts + hide: function() { + if (!this.isHidden) { + this.isHidden = true; + if (this.el) { + this.el.hide(); + } + } + }, + + + // Show the tracking element after it has been temporarily hidden + show: function() { + if (this.isHidden) { + this.isHidden = false; + this.updatePosition(); + this.getEl().show(); + } + } + +}); + + /* A utility class for rendering <tr> rows. +----------------------------------------------------------------------------------------------------------------------*/ +// It leverages methods of the subclass and the View to determine custom rendering behavior for each row "type" +// (such as highlight rows, day rows, helper rows, etc). + +var RowRenderer = Class.extend({ + + view: null, // a View object + isRTL: null, // shortcut to the view's isRTL option + cellHtml: '<td/>', // plain default HTML used for a cell when no other is available + + + constructor: function(view) { + this.view = view; + this.isRTL = view.opt('isRTL'); + }, + + + // Renders the HTML for a row, leveraging custom cell-HTML-renderers based on the `rowType`. + // Also applies the "intro" and "outro" cells, which are specified by the subclass and views. + // `row` is an optional row number. + rowHtml: function(rowType, row) { + var renderCell = this.getHtmlRenderer('cell', rowType); + var rowCellHtml = ''; + var col; + var cell; + + row = row || 0; + + for (col = 0; col < this.colCnt; col++) { + cell = this.getCell(row, col); + rowCellHtml += renderCell(cell); + } + + rowCellHtml = this.bookendCells(rowCellHtml, rowType, row); // apply intro and outro + + return '<tr>' + rowCellHtml + '</tr>'; + }, + + + // Applies the "intro" and "outro" HTML to the given cells. + // Intro means the leftmost cell when the calendar is LTR and the rightmost cell when RTL. Vice-versa for outro. + // `cells` can be an HTML string of <td>'s or a jQuery <tr> element + // `row` is an optional row number. + bookendCells: function(cells, rowType, row) { + var intro = this.getHtmlRenderer('intro', rowType)(row || 0); + var outro = this.getHtmlRenderer('outro', rowType)(row || 0); + var prependHtml = this.isRTL ? outro : intro; + var appendHtml = this.isRTL ? intro : outro; + + if (typeof cells === 'string') { + return prependHtml + cells + appendHtml; + } + else { // a jQuery <tr> element + return cells.prepend(prependHtml).append(appendHtml); + } + }, + + + // Returns an HTML-rendering function given a specific `rendererName` (like cell, intro, or outro) and a specific + // `rowType` (like day, eventSkeleton, helperSkeleton), which is optional. + // If a renderer for the specific rowType doesn't exist, it will fall back to a generic renderer. + // We will query the View object first for any custom rendering functions, then the methods of the subclass. + getHtmlRenderer: function(rendererName, rowType) { + var view = this.view; + var generalName; // like "cellHtml" + var specificName; // like "dayCellHtml". based on rowType + var provider; // either the View or the RowRenderer subclass, whichever provided the method + var renderer; + + generalName = rendererName + 'Html'; + if (rowType) { + specificName = rowType + capitaliseFirstLetter(rendererName) + 'Html'; + } + + if (specificName && (renderer = view[specificName])) { + provider = view; + } + else if (specificName && (renderer = this[specificName])) { + provider = this; + } + else if ((renderer = view[generalName])) { + provider = view; + } + else if ((renderer = this[generalName])) { + provider = this; + } + + if (typeof renderer === 'function') { + return function() { + return renderer.apply(provider, arguments) || ''; // use correct `this` and always return a string + }; + } + + // the rendered can be a plain string as well. if not specified, always an empty string. + return function() { + return renderer || ''; + }; + } + +}); + + /* An abstract class comprised of a "grid" of cells that each represent a specific datetime +----------------------------------------------------------------------------------------------------------------------*/ + +var Grid = fc.Grid = RowRenderer.extend({ + + start: null, // the date of the first cell + end: null, // the date after the last cell + + rowCnt: 0, // number of rows + colCnt: 0, // number of cols + rowData: null, // array of objects, holding misc data for each row + colData: null, // array of objects, holding misc data for each column + + el: null, // the containing element + coordMap: null, // a GridCoordMap that converts pixel values to datetimes + elsByFill: null, // a hash of jQuery element sets used for rendering each fill. Keyed by fill name. + + documentDragStartProxy: null, // binds the Grid's scope to documentDragStart (in DayGrid.events) + + // derived from options + colHeadFormat: null, // TODO: move to another class. not applicable to all Grids + eventTimeFormat: null, + displayEventEnd: null, + + + constructor: function() { + RowRenderer.apply(this, arguments); // call the super-constructor + + this.coordMap = new GridCoordMap(this); + this.elsByFill = {}; + this.documentDragStartProxy = $.proxy(this, 'documentDragStart'); + }, + + + // Renders the grid into the `el` element. + // Subclasses should override and call this super-method when done. + render: function() { + this.bindHandlers(); + }, + + + // Called when the grid's resources need to be cleaned up + destroy: function() { + this.unbindHandlers(); + }, + + + /* Options + ------------------------------------------------------------------------------------------------------------------*/ + + + // Generates the format string used for the text in column headers, if not explicitly defined by 'columnFormat' + // TODO: move to another class. not applicable to all Grids + computeColHeadFormat: function() { + // subclasses must implement if they want to use headHtml() + }, + + + // Generates the format string used for event time text, if not explicitly defined by 'timeFormat' + computeEventTimeFormat: function() { + return this.view.opt('smallTimeFormat'); + }, + + + // Determines whether events should have their end times displayed, if not explicitly defined by 'displayEventEnd' + computeDisplayEventEnd: function() { + return false; + }, + + + /* Dates + ------------------------------------------------------------------------------------------------------------------*/ + + + // Tells the grid about what period of time to display. Grid will subsequently compute dates for cell system. + setRange: function(range) { + var view = this.view; + + this.start = range.start.clone(); + this.end = range.end.clone(); + + this.rowData = []; + this.colData = []; + this.updateCells(); + + // Populate option-derived settings. Look for override first, then compute if necessary. + this.colHeadFormat = view.opt('columnFormat') || this.computeColHeadFormat(); + this.eventTimeFormat = view.opt('timeFormat') || this.computeEventTimeFormat(); + this.displayEventEnd = view.opt('displayEventEnd'); + if (this.displayEventEnd == null) { + this.displayEventEnd = this.computeDisplayEventEnd(); + } + }, + + + // Responsible for setting rowCnt/colCnt and any other row/col data + updateCells: function() { + // subclasses must implement + }, + + + // Converts a range with an inclusive `start` and an exclusive `end` into an array of segment objects + rangeToSegs: function(range) { + // subclasses must implement + }, + + + /* Cells + ------------------------------------------------------------------------------------------------------------------*/ + // NOTE: columns are ordered left-to-right + + + // Gets an object containing row/col number, misc data, and range information about the cell. + // Accepts row/col values, an object with row/col properties, or a single-number offset from the first cell. + getCell: function(row, col) { + var cell; + + if (col == null) { + if (typeof row === 'number') { // a single-number offset + col = row % this.colCnt; + row = Math.floor(row / this.colCnt); + } + else { // an object with row/col properties + col = row.col; + row = row.row; + } + } + + cell = { row: row, col: col }; + + $.extend(cell, this.getRowData(row), this.getColData(col)); + $.extend(cell, this.computeCellRange(cell)); + + return cell; + }, + + + // Given a cell object with index and misc data, generates a range object + computeCellRange: function(cell) { + // subclasses must implement + }, + + + // Retrieves misc data about the given row + getRowData: function(row) { + return this.rowData[row] || {}; + }, + + + // Retrieves misc data baout the given column + getColData: function(col) { + return this.colData[col] || {}; + }, + + + // Retrieves the element representing the given row + getRowEl: function(row) { + // subclasses should implement if leveraging the default getCellDayEl() or computeRowCoords() + }, + + + // Retrieves the element representing the given column + getColEl: function(col) { + // subclasses should implement if leveraging the default getCellDayEl() or computeColCoords() + }, + + + // Given a cell object, returns the element that represents the cell's whole-day + getCellDayEl: function(cell) { + return this.getColEl(cell.col) || this.getRowEl(cell.row); + }, + + + /* Cell Coordinates + ------------------------------------------------------------------------------------------------------------------*/ + + + // Computes the top/bottom coordinates of all rows. + // By default, queries the dimensions of the element provided by getRowEl(). + computeRowCoords: function() { + var items = []; + var i, el; + var item; + + for (i = 0; i < this.rowCnt; i++) { + el = this.getRowEl(i); + item = { + top: el.offset().top + }; + if (i > 0) { + items[i - 1].bottom = item.top; + } + items.push(item); + } + item.bottom = item.top + el.outerHeight(); + + return items; + }, + + + // Computes the left/right coordinates of all rows. + // By default, queries the dimensions of the element provided by getColEl(). + computeColCoords: function() { + var items = []; + var i, el; + var item; + + for (i = 0; i < this.colCnt; i++) { + el = this.getColEl(i); + item = { + left: el.offset().left + }; + if (i > 0) { + items[i - 1].right = item.left; + } + items.push(item); + } + item.right = item.left + el.outerWidth(); + + return items; + }, + + + /* Handlers + ------------------------------------------------------------------------------------------------------------------*/ + + + // Attaches handlers to DOM + bindHandlers: function() { + var _this = this; + + // attach a handler to the grid's root element. + // we don't need to clean up in unbindHandlers or destroy, because when jQuery removes the element from the + // DOM it automatically unregisters the handlers. + this.el.on('mousedown', function(ev) { + if ( + !$(ev.target).is('.fc-event-container *, .fc-more') && // not an an event element, or "more.." link + !$(ev.target).closest('.fc-popover').length // not on a popover (like the "more.." events one) + ) { + _this.dayMousedown(ev); + } + }); + + // attach event-element-related handlers. in Grid.events + // same garbage collection note as above. + this.bindSegHandlers(); + + $(document).on('dragstart', this.documentDragStartProxy); // jqui drag + }, + + + // Unattaches handlers from the DOM + unbindHandlers: function() { + $(document).off('dragstart', this.documentDragStartProxy); // jqui drag + }, + + + // Process a mousedown on an element that represents a day. For day clicking and selecting. + dayMousedown: function(ev) { + var _this = this; + var view = this.view; + var isSelectable = view.opt('selectable'); + var dayClickCell; // null if invalid dayClick + var selectionRange; // null if invalid selection + + // this listener tracks a mousedown on a day element, and a subsequent drag. + // if the drag ends on the same day, it is a 'dayClick'. + // if 'selectable' is enabled, this listener also detects selections. + var dragListener = new DragListener(this.coordMap, { + //distance: 5, // needs more work if we want dayClick to fire correctly + scroll: view.opt('dragScroll'), + dragStart: function() { + view.unselect(); // since we could be rendering a new selection, we want to clear any old one + }, + cellOver: function(cell, isOrig) { + var origCell = dragListener.origCell; + if (origCell) { // click needs to have started on a cell + dayClickCell = isOrig ? cell : null; // single-cell selection is a day click + if (isSelectable) { + selectionRange = _this.computeSelection(origCell, cell); + if (selectionRange) { + _this.renderSelection(selectionRange); + } + else { + disableCursor(); + } + } + } + }, + cellOut: function(cell) { + dayClickCell = null; + selectionRange = null; + _this.destroySelection(); + enableCursor(); + }, + listenStop: function(ev) { + if (dayClickCell) { + view.trigger('dayClick', _this.getCellDayEl(dayClickCell), dayClickCell.start, ev); + } + if (selectionRange) { + // the selection will already have been rendered. just report it + view.reportSelection(selectionRange, ev); + } + enableCursor(); + } + }); + + dragListener.mousedown(ev); // start listening, which will eventually initiate a dragStart + }, + + + /* Event Helper + ------------------------------------------------------------------------------------------------------------------*/ + // TODO: should probably move this to Grid.events, like we did event dragging / resizing + + + // Renders a mock event over the given range. + // The range's end can be null, in which case the mock event that is rendered will have a null end time. + // `sourceSeg` is the internal segment object involved in the drag. If null, something external is dragging. + renderRangeHelper: function(range, sourceSeg) { + var fakeEvent; + + fakeEvent = sourceSeg ? createObject(sourceSeg.event) : {}; // mask the original event object if possible + fakeEvent.start = range.start.clone(); + fakeEvent.end = range.end ? range.end.clone() : null; + fakeEvent.allDay = null; // force it to be freshly computed by normalizeEventDateProps + this.view.calendar.normalizeEventDateProps(fakeEvent); + + // this extra className will be useful for differentiating real events from mock events in CSS + fakeEvent.className = (fakeEvent.className || []).concat('fc-helper'); + + // if something external is being dragged in, don't render a resizer + if (!sourceSeg) { + fakeEvent.editable = false; + } + + this.renderHelper(fakeEvent, sourceSeg); // do the actual rendering + }, + + + // Renders a mock event + renderHelper: function(event, sourceSeg) { + // subclasses must implement + }, + + + // Unrenders a mock event + destroyHelper: function() { + // subclasses must implement + }, + + + /* Selection + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of a selection. Will highlight by default but can be overridden by subclasses. + renderSelection: function(range) { + this.renderHighlight(range); + }, + + + // Unrenders any visual indications of a selection. Will unrender a highlight by default. + destroySelection: function() { + this.destroyHighlight(); + }, + + + // Given the first and last cells of a selection, returns a range object. + // Will return something falsy if the selection is invalid (when outside of selectionConstraint for example). + // Subclasses can override and provide additional data in the range object. Will be passed to renderSelection(). + computeSelection: function(firstCell, lastCell) { + var dates = [ + firstCell.start, + firstCell.end, + lastCell.start, + lastCell.end + ]; + var range; + + dates.sort(compareNumbers); // sorts chronologically. works with Moments + + range = { + start: dates[0].clone(), + end: dates[3].clone() + }; + + if (!this.view.calendar.isSelectionRangeAllowed(range)) { + return null; + } + + return range; + }, + + + /* Highlight + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders an emphasis on the given date range. `start` is inclusive. `end` is exclusive. + renderHighlight: function(range) { + this.renderFill('highlight', this.rangeToSegs(range)); + }, + + + // Unrenders the emphasis on a date range + destroyHighlight: function() { + this.destroyFill('highlight'); + }, + + + // Generates an array of classNames for rendering the highlight. Used by the fill system. + highlightSegClasses: function() { + return [ 'fc-highlight' ]; + }, + + + /* Fill System (highlight, background events, business hours) + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a set of rectangles over the given segments of time. + // Returns a subset of segs, the segs that were actually rendered. + // Responsible for populating this.elsByFill. TODO: better API for expressing this requirement + renderFill: function(type, segs) { + // subclasses must implement + }, + + + // Unrenders a specific type of fill that is currently rendered on the grid + destroyFill: function(type) { + var el = this.elsByFill[type]; + + if (el) { + el.remove(); + delete this.elsByFill[type]; + } + }, + + + // Renders and assigns an `el` property for each fill segment. Generic enough to work with different types. + // Only returns segments that successfully rendered. + // To be harnessed by renderFill (implemented by subclasses). + // Analagous to renderFgSegEls. + renderFillSegEls: function(type, segs) { + var _this = this; + var segElMethod = this[type + 'SegEl']; + var html = ''; + var renderedSegs = []; + var i; + + if (segs.length) { + + // build a large concatenation of segment HTML + for (i = 0; i < segs.length; i++) { + html += this.fillSegHtml(type, segs[i]); + } + + // Grab individual elements from the combined HTML string. Use each as the default rendering. + // Then, compute the 'el' for each segment. + $(html).each(function(i, node) { + var seg = segs[i]; + var el = $(node); + + // allow custom filter methods per-type + if (segElMethod) { + el = segElMethod.call(_this, seg, el); + } + + if (el) { // custom filters did not cancel the render + el = $(el); // allow custom filter to return raw DOM node + + // correct element type? (would be bad if a non-TD were inserted into a table for example) + if (el.is(_this.fillSegTag)) { + seg.el = el; + renderedSegs.push(seg); + } + } + }); + } + + return renderedSegs; + }, + + + fillSegTag: 'div', // subclasses can override + + + // Builds the HTML needed for one fill segment. Generic enought o work with different types. + fillSegHtml: function(type, seg) { + var classesMethod = this[type + 'SegClasses']; // custom hooks per-type + var stylesMethod = this[type + 'SegStyles']; // + var classes = classesMethod ? classesMethod.call(this, seg) : []; + var styles = stylesMethod ? stylesMethod.call(this, seg) : ''; // a semi-colon separated CSS property string + + return '<' + this.fillSegTag + + (classes.length ? ' class="' + classes.join(' ') + '"' : '') + + (styles ? ' style="' + styles + '"' : '') + + ' />'; + }, + + + /* Generic rendering utilities for subclasses + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a day-of-week header row. + // TODO: move to another class. not applicable to all Grids + headHtml: function() { + return '' + + '<div class="fc-row ' + this.view.widgetHeaderClass + '">' + + '<table>' + + '<thead>' + + this.rowHtml('head') + // leverages RowRenderer + '</thead>' + + '</table>' + + '</div>'; + }, + + + // Used by the `headHtml` method, via RowRenderer, for rendering the HTML of a day-of-week header cell + // TODO: move to another class. not applicable to all Grids + headCellHtml: function(cell) { + var view = this.view; + var date = cell.start; + + return '' + + '<th class="fc-day-header ' + view.widgetHeaderClass + ' fc-' + dayIDs[date.day()] + '">' + + htmlEscape(date.format(this.colHeadFormat)) + + '</th>'; + }, + + + // Renders the HTML for a single-day background cell + bgCellHtml: function(cell) { + var view = this.view; + var date = cell.start; + var classes = this.getDayClasses(date); + + classes.unshift('fc-day', view.widgetContentClass); + + return '<td class="' + classes.join(' ') + '"' + + ' data-date="' + date.format('YYYY-MM-DD') + '"' + // if date has a time, won't format it + '></td>'; + }, + + + // Computes HTML classNames for a single-day cell + getDayClasses: function(date) { + var view = this.view; + var today = view.calendar.getNow().stripTime(); + var classes = [ 'fc-' + dayIDs[date.day()] ]; + + if ( + view.name === 'month' && + date.month() != view.intervalStart.month() + ) { + classes.push('fc-other-month'); + } + + if (date.isSame(today, 'day')) { + classes.push( + 'fc-today', + view.highlightStateClass + ); + } + else if (date < today) { + classes.push('fc-past'); + } + else { + classes.push('fc-future'); + } + + return classes; + } + +}); + + /* Event-rendering and event-interaction methods for the abstract Grid class +----------------------------------------------------------------------------------------------------------------------*/ + +Grid.mixin({ + + mousedOverSeg: null, // the segment object the user's mouse is over. null if over nothing + isDraggingSeg: false, // is a segment being dragged? boolean + isResizingSeg: false, // is a segment being resized? boolean + segs: null, // the event segments currently rendered in the grid + + + // Renders the given events onto the grid + renderEvents: function(events) { + var segs = this.eventsToSegs(events); + var bgSegs = []; + var fgSegs = []; + var i, seg; + + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + + if (isBgEvent(seg.event)) { + bgSegs.push(seg); + } + else { + fgSegs.push(seg); + } + } + + // Render each different type of segment. + // Each function may return a subset of the segs, segs that were actually rendered. + bgSegs = this.renderBgSegs(bgSegs) || bgSegs; + fgSegs = this.renderFgSegs(fgSegs) || fgSegs; + + this.segs = bgSegs.concat(fgSegs); + }, + + + // Unrenders all events currently rendered on the grid + destroyEvents: function() { + this.triggerSegMouseout(); // trigger an eventMouseout if user's mouse is over an event + + this.destroyFgSegs(); + this.destroyBgSegs(); + + this.segs = null; + }, + + + // Retrieves all rendered segment objects currently rendered on the grid + getEventSegs: function() { + return this.segs || []; + }, + + + /* Foreground Segment Rendering + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders foreground event segments onto the grid. May return a subset of segs that were rendered. + renderFgSegs: function(segs) { + // subclasses must implement + }, + + + // Unrenders all currently rendered foreground segments + destroyFgSegs: function() { + // subclasses must implement + }, + + + // Renders and assigns an `el` property for each foreground event segment. + // Only returns segments that successfully rendered. + // A utility that subclasses may use. + renderFgSegEls: function(segs, disableResizing) { + var view = this.view; + var html = ''; + var renderedSegs = []; + var i; + + if (segs.length) { // don't build an empty html string + + // build a large concatenation of event segment HTML + for (i = 0; i < segs.length; i++) { + html += this.fgSegHtml(segs[i], disableResizing); + } + + // Grab individual elements from the combined HTML string. Use each as the default rendering. + // Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false. + $(html).each(function(i, node) { + var seg = segs[i]; + var el = view.resolveEventEl(seg.event, $(node)); + + if (el) { + el.data('fc-seg', seg); // used by handlers + seg.el = el; + renderedSegs.push(seg); + } + }); + } + + return renderedSegs; + }, + + + // Generates the HTML for the default rendering of a foreground event segment. Used by renderFgSegEls() + fgSegHtml: function(seg, disableResizing) { + // subclasses should implement + }, + + + /* Background Segment Rendering + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders the given background event segments onto the grid. + // Returns a subset of the segs that were actually rendered. + renderBgSegs: function(segs) { + return this.renderFill('bgEvent', segs); + }, + + + // Unrenders all the currently rendered background event segments + destroyBgSegs: function() { + this.destroyFill('bgEvent'); + }, + + + // Renders a background event element, given the default rendering. Called by the fill system. + bgEventSegEl: function(seg, el) { + return this.view.resolveEventEl(seg.event, el); // will filter through eventRender + }, + + + // Generates an array of classNames to be used for the default rendering of a background event. + // Called by the fill system. + bgEventSegClasses: function(seg) { + var event = seg.event; + var source = event.source || {}; + + return [ 'fc-bgevent' ].concat( + event.className, + source.className || [] + ); + }, + + + // Generates a semicolon-separated CSS string to be used for the default rendering of a background event. + // Called by the fill system. + // TODO: consolidate with getEventSkinCss? + bgEventSegStyles: function(seg) { + var view = this.view; + var event = seg.event; + var source = event.source || {}; + var eventColor = event.color; + var sourceColor = source.color; + var optionColor = view.opt('eventColor'); + var backgroundColor = + event.backgroundColor || + eventColor || + source.backgroundColor || + sourceColor || + view.opt('eventBackgroundColor') || + optionColor; + + if (backgroundColor) { + return 'background-color:' + backgroundColor; + } + + return ''; + }, + + + // Generates an array of classNames to be used for the rendering business hours overlay. Called by the fill system. + businessHoursSegClasses: function(seg) { + return [ 'fc-nonbusiness', 'fc-bgevent' ]; + }, + + + /* Handlers + ------------------------------------------------------------------------------------------------------------------*/ + + + // Attaches event-element-related handlers to the container element and leverage bubbling + bindSegHandlers: function() { + var _this = this; + var view = this.view; + + $.each( + { + mouseenter: function(seg, ev) { + _this.triggerSegMouseover(seg, ev); + }, + mouseleave: function(seg, ev) { + _this.triggerSegMouseout(seg, ev); + }, + click: function(seg, ev) { + return view.trigger('eventClick', this, seg.event, ev); // can return `false` to cancel + }, + mousedown: function(seg, ev) { + if ($(ev.target).is('.fc-resizer') && view.isEventResizable(seg.event)) { + _this.segResizeMousedown(seg, ev); + } + else if (view.isEventDraggable(seg.event)) { + _this.segDragMousedown(seg, ev); + } + } + }, + function(name, func) { + // attach the handler to the container element and only listen for real event elements via bubbling + _this.el.on(name, '.fc-event-container > *', function(ev) { + var seg = $(this).data('fc-seg'); // grab segment data. put there by View::renderEvents + + // only call the handlers if there is not a drag/resize in progress + if (seg && !_this.isDraggingSeg && !_this.isResizingSeg) { + return func.call(this, seg, ev); // `this` will be the event element + } + }); + } + ); + }, + + + // Updates internal state and triggers handlers for when an event element is moused over + triggerSegMouseover: function(seg, ev) { + if (!this.mousedOverSeg) { + this.mousedOverSeg = seg; + this.view.trigger('eventMouseover', seg.el[0], seg.event, ev); + } + }, + + + // Updates internal state and triggers handlers for when an event element is moused out. + // Can be given no arguments, in which case it will mouseout the segment that was previously moused over. + triggerSegMouseout: function(seg, ev) { + ev = ev || {}; // if given no args, make a mock mouse event + + if (this.mousedOverSeg) { + seg = seg || this.mousedOverSeg; // if given no args, use the currently moused-over segment + this.mousedOverSeg = null; + this.view.trigger('eventMouseout', seg.el[0], seg.event, ev); + } + }, + + + /* Event Dragging + ------------------------------------------------------------------------------------------------------------------*/ + + + // Called when the user does a mousedown on an event, which might lead to dragging. + // Generic enough to work with any type of Grid. + segDragMousedown: function(seg, ev) { + var _this = this; + var view = this.view; + var el = seg.el; + var event = seg.event; + var dropLocation; + + // A clone of the original element that will move with the mouse + var mouseFollower = new MouseFollower(seg.el, { + parentEl: view.el, + opacity: view.opt('dragOpacity'), + revertDuration: view.opt('dragRevertDuration'), + zIndex: 2 // one above the .fc-view + }); + + // Tracks mouse movement over the *view's* coordinate map. Allows dragging and dropping between subcomponents + // of the view. + var dragListener = new DragListener(view.coordMap, { + distance: 5, + scroll: view.opt('dragScroll'), + listenStart: function(ev) { + mouseFollower.hide(); // don't show until we know this is a real drag + mouseFollower.start(ev); + }, + dragStart: function(ev) { + _this.triggerSegMouseout(seg, ev); // ensure a mouseout on the manipulated event has been reported + _this.isDraggingSeg = true; + view.hideEvent(event); // hide all event segments. our mouseFollower will take over + view.trigger('eventDragStart', el[0], event, ev, {}); // last argument is jqui dummy + }, + cellOver: function(cell, isOrig) { + var origCell = seg.cell || dragListener.origCell; // starting cell could be forced (DayGrid.limit) + + dropLocation = _this.computeEventDrop(origCell, cell, event); + if (dropLocation) { + if (view.renderDrag(dropLocation, seg)) { // have the subclass render a visual indication + mouseFollower.hide(); // if the subclass is already using a mock event "helper", hide our own + } + else { + mouseFollower.show(); + } + if (isOrig) { + dropLocation = null; // needs to have moved cells to be a valid drop + } + } + else { + // have the helper follow the mouse (no snapping) with a warning-style cursor + mouseFollower.show(); + disableCursor(); + } + }, + cellOut: function() { // called before mouse moves to a different cell OR moved out of all cells + dropLocation = null; + view.destroyDrag(); // unrender whatever was done in renderDrag + mouseFollower.show(); // show in case we are moving out of all cells + enableCursor(); + }, + dragStop: function(ev) { + // do revert animation if hasn't changed. calls a callback when finished (whether animation or not) + mouseFollower.stop(!dropLocation, function() { + _this.isDraggingSeg = false; + view.destroyDrag(); + view.showEvent(event); + view.trigger('eventDragStop', el[0], event, ev, {}); // last argument is jqui dummy + + if (dropLocation) { + view.reportEventDrop(event, dropLocation, el, ev); + } + }); + enableCursor(); + }, + listenStop: function() { + mouseFollower.stop(); // put in listenStop in case there was a mousedown but the drag never started + } + }); + + dragListener.mousedown(ev); // start listening, which will eventually lead to a dragStart + }, + + + // Given the cell an event drag began, and the cell event was dropped, calculates the new start/end/allDay + // values for the event. Subclasses may override and set additional properties to be used by renderDrag. + // A falsy returned value indicates an invalid drop. + computeEventDrop: function(startCell, endCell, event) { + var dragStart = startCell.start; + var dragEnd = endCell.start; + var delta; + var newStart; + var newEnd; + var newAllDay; + var dropLocation; + + if (dragStart.hasTime() === dragEnd.hasTime()) { + delta = diffDayTime(dragEnd, dragStart); + newStart = event.start.clone().add(delta); + if (event.end === null) { // do we need to compute an end? + newEnd = null; + } + else { + newEnd = event.end.clone().add(delta); + } + newAllDay = event.allDay; // keep it the same + } + else { + // if switching from day <-> timed, start should be reset to the dropped date, and the end cleared + newStart = dragEnd.clone(); + newEnd = null; // end should be cleared + newAllDay = !dragEnd.hasTime(); + } + + dropLocation = { + start: newStart, + end: newEnd, + allDay: newAllDay + }; + + if (!this.view.calendar.isEventRangeAllowed(dropLocation, event)) { + return null; + } + + return dropLocation; + }, + + + /* External Element Dragging + ------------------------------------------------------------------------------------------------------------------*/ + + + // Called when a jQuery UI drag is initiated anywhere in the DOM + documentDragStart: function(ev, ui) { + var view = this.view; + var el; + var accept; + + if (view.opt('droppable')) { // only listen if this setting is on + el = $(ev.target); + + // Test that the dragged element passes the dropAccept selector or filter function. + // FYI, the default is "*" (matches all) + accept = view.opt('dropAccept'); + if ($.isFunction(accept) ? accept.call(el[0], el) : el.is(accept)) { + + this.startExternalDrag(el, ev, ui); + } + } + }, + + + // Called when a jQuery UI drag starts and it needs to be monitored for cell dropping + startExternalDrag: function(el, ev, ui) { + var _this = this; + var meta = getDraggedElMeta(el); // extra data about event drop, including possible event to create + var dragListener; + var dropLocation; // a null value signals an unsuccessful drag + + // listener that tracks mouse movement over date-associated pixel regions + dragListener = new DragListener(this.coordMap, { + cellOver: function(cell) { + dropLocation = _this.computeExternalDrop(cell, meta); + if (dropLocation) { + _this.renderDrag(dropLocation); // called without a seg parameter + } + else { // invalid drop cell + disableCursor(); + } + }, + cellOut: function() { + dropLocation = null; // signal unsuccessful + _this.destroyDrag(); + enableCursor(); + } + }); + + // gets called, only once, when jqui drag is finished + $(document).one('dragstop', function(ev, ui) { + _this.destroyDrag(); + enableCursor(); + + if (dropLocation) { // element was dropped on a valid date/time cell + _this.view.reportExternalDrop(meta, dropLocation, el, ev, ui); + } + }); + + dragListener.startDrag(ev); // start listening immediately + }, + + + // Given a cell to be dropped upon, and misc data associated with the jqui drag (guaranteed to be a plain object), + // returns start/end dates for the event that would result from the hypothetical drop. end might be null. + // Returning a null value signals an invalid drop cell. + computeExternalDrop: function(cell, meta) { + var dropLocation = { + start: cell.start.clone(), + end: null + }; + + // if dropped on an all-day cell, and element's metadata specified a time, set it + if (meta.startTime && !dropLocation.start.hasTime()) { + dropLocation.start.time(meta.startTime); + } + + if (meta.duration) { + dropLocation.end = dropLocation.start.clone().add(meta.duration); + } + + if (!this.view.calendar.isExternalDropRangeAllowed(dropLocation, meta.eventProps)) { + return null; + } + + return dropLocation; + }, + + + + /* Drag Rendering (for both events and an external elements) + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of an event or external element being dragged. + // `dropLocation` contains hypothetical start/end/allDay values the event would have if dropped. end can be null. + // `seg` is the internal segment object that is being dragged. If dragging an external element, `seg` is null. + // A truthy returned value indicates this method has rendered a helper element. + renderDrag: function(dropLocation, seg) { + // subclasses must implement + }, + + + // Unrenders a visual indication of an event or external element being dragged + destroyDrag: function() { + // subclasses must implement + }, + + + /* Resizing + ------------------------------------------------------------------------------------------------------------------*/ + + + // Called when the user does a mousedown on an event's resizer, which might lead to resizing. + // Generic enough to work with any type of Grid. + segResizeMousedown: function(seg, ev) { + var _this = this; + var view = this.view; + var calendar = view.calendar; + var el = seg.el; + var event = seg.event; + var start = event.start; + var oldEnd = calendar.getEventEnd(event); + var newEnd; // falsy if invalid resize + var dragListener; + + function destroy() { // resets the rendering to show the original event + _this.destroyEventResize(); + view.showEvent(event); + enableCursor(); + } + + // Tracks mouse movement over the *grid's* coordinate map + dragListener = new DragListener(this.coordMap, { + distance: 5, + scroll: view.opt('dragScroll'), + dragStart: function(ev) { + _this.triggerSegMouseout(seg, ev); // ensure a mouseout on the manipulated event has been reported + _this.isResizingSeg = true; + view.trigger('eventResizeStart', el[0], event, ev, {}); // last argument is jqui dummy + }, + cellOver: function(cell) { + newEnd = cell.end; + + if (!newEnd.isAfter(start)) { // was end moved before start? + newEnd = start.clone().add( // make the event span a single slot + diffDayTime(cell.end, cell.start) // assumes all slot durations are the same + ); + } + + if (newEnd.isSame(oldEnd)) { + newEnd = null; + } + else if (!calendar.isEventRangeAllowed({ start: start, end: newEnd }, event)) { + newEnd = null; + disableCursor(); + } + else { + _this.renderEventResize({ start: start, end: newEnd }, seg); + view.hideEvent(event); + } + }, + cellOut: function() { // called before mouse moves to a different cell OR moved out of all cells + newEnd = null; + destroy(); + }, + dragStop: function(ev) { + _this.isResizingSeg = false; + destroy(); + view.trigger('eventResizeStop', el[0], event, ev, {}); // last argument is jqui dummy + + if (newEnd) { // valid date to resize to? + view.reportEventResize(event, newEnd, el, ev); + } + } + }); + + dragListener.mousedown(ev); // start listening, which will eventually lead to a dragStart + }, + + + // Renders a visual indication of an event being resized. + // `range` has the updated dates of the event. `seg` is the original segment object involved in the drag. + renderEventResize: function(range, seg) { + // subclasses must implement + }, + + + // Unrenders a visual indication of an event being resized. + destroyEventResize: function() { + // subclasses must implement + }, + + + /* Rendering Utils + ------------------------------------------------------------------------------------------------------------------*/ + + + // Compute the text that should be displayed on an event's element. + // `range` can be the Event object itself, or something range-like, with at least a `start`. + // The `timeFormat` options and the grid's default format is used, but `formatStr` can override. + getEventTimeText: function(range, formatStr) { + + formatStr = formatStr || this.eventTimeFormat; + + if (range.end && this.displayEventEnd) { + return this.view.formatRange(range, formatStr); + } + else { + return range.start.format(formatStr); + } + }, + + + // Generic utility for generating the HTML classNames for an event segment's element + getSegClasses: function(seg, isDraggable, isResizable) { + var event = seg.event; + var classes = [ + 'fc-event', + seg.isStart ? 'fc-start' : 'fc-not-start', + seg.isEnd ? 'fc-end' : 'fc-not-end' + ].concat( + event.className, + event.source ? event.source.className : [] + ); + + if (isDraggable) { + classes.push('fc-draggable'); + } + if (isResizable) { + classes.push('fc-resizable'); + } + + return classes; + }, + + + // Utility for generating a CSS string with all the event skin-related properties + getEventSkinCss: function(event) { + var view = this.view; + var source = event.source || {}; + var eventColor = event.color; + var sourceColor = source.color; + var optionColor = view.opt('eventColor'); + var backgroundColor = + event.backgroundColor || + eventColor || + source.backgroundColor || + sourceColor || + view.opt('eventBackgroundColor') || + optionColor; + var borderColor = + event.borderColor || + eventColor || + source.borderColor || + sourceColor || + view.opt('eventBorderColor') || + optionColor; + var textColor = + event.textColor || + source.textColor || + view.opt('eventTextColor'); + var statements = []; + if (backgroundColor) { + statements.push('background-color:' + backgroundColor); + } + if (borderColor) { + statements.push('border-color:' + borderColor); + } + if (textColor) { + statements.push('color:' + textColor); + } + return statements.join(';'); + }, + + + /* Converting events -> ranges -> segs + ------------------------------------------------------------------------------------------------------------------*/ + + + // Converts an array of event objects into an array of event segment objects. + // A custom `rangeToSegsFunc` may be given for arbitrarily slicing up events. + eventsToSegs: function(events, rangeToSegsFunc) { + var eventRanges = this.eventsToRanges(events); + var segs = []; + var i; + + for (i = 0; i < eventRanges.length; i++) { + segs.push.apply( + segs, + this.eventRangeToSegs(eventRanges[i], rangeToSegsFunc) + ); + } + + return segs; + }, + + + // Converts an array of events into an array of "range" objects. + // A "range" object is a plain object with start/end properties denoting the time it covers. Also an event property. + // For "normal" events, this will be identical to the event's start/end, but for "inverse-background" events, + // will create an array of ranges that span the time *not* covered by the given event. + eventsToRanges: function(events) { + var _this = this; + var eventsById = groupEventsById(events); + var ranges = []; + + // group by ID so that related inverse-background events can be rendered together + $.each(eventsById, function(id, eventGroup) { + if (eventGroup.length) { + ranges.push.apply( + ranges, + isInverseBgEvent(eventGroup[0]) ? + _this.eventsToInverseRanges(eventGroup) : + _this.eventsToNormalRanges(eventGroup) + ); + } + }); + + return ranges; + }, + + + // Converts an array of "normal" events (not inverted rendering) into a parallel array of ranges + eventsToNormalRanges: function(events) { + var calendar = this.view.calendar; + var ranges = []; + var i, event; + var eventStart, eventEnd; + + for (i = 0; i < events.length; i++) { + event = events[i]; + + // make copies and normalize by stripping timezone + eventStart = event.start.clone().stripZone(); + eventEnd = calendar.getEventEnd(event).stripZone(); + + ranges.push({ + event: event, + start: eventStart, + end: eventEnd, + eventStartMS: +eventStart, + eventDurationMS: eventEnd - eventStart + }); + } + + return ranges; + }, + + + // Converts an array of events, with inverse-background rendering, into an array of range objects. + // The range objects will cover all the time NOT covered by the events. + eventsToInverseRanges: function(events) { + var view = this.view; + var viewStart = view.start.clone().stripZone(); // normalize timezone + var viewEnd = view.end.clone().stripZone(); // normalize timezone + var normalRanges = this.eventsToNormalRanges(events); // will give us normalized dates we can use w/o copies + var inverseRanges = []; + var event0 = events[0]; // assign this to each range's `.event` + var start = viewStart; // the end of the previous range. the start of the new range + var i, normalRange; + + // ranges need to be in order. required for our date-walking algorithm + normalRanges.sort(compareNormalRanges); + + for (i = 0; i < normalRanges.length; i++) { + normalRange = normalRanges[i]; + + // add the span of time before the event (if there is any) + if (normalRange.start > start) { // compare millisecond time (skip any ambig logic) + inverseRanges.push({ + event: event0, + start: start, + end: normalRange.start + }); + } + + start = normalRange.end; + } + + // add the span of time after the last event (if there is any) + if (start < viewEnd) { // compare millisecond time (skip any ambig logic) + inverseRanges.push({ + event: event0, + start: start, + end: viewEnd + }); + } + + return inverseRanges; + }, + + + // Slices the given event range into one or more segment objects. + // A `rangeToSegsFunc` custom slicing function can be given. + eventRangeToSegs: function(eventRange, rangeToSegsFunc) { + var segs; + var i, seg; + + if (rangeToSegsFunc) { + segs = rangeToSegsFunc(eventRange); + } + else { + segs = this.rangeToSegs(eventRange); // defined by the subclass + } + + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + seg.event = eventRange.event; + seg.eventStartMS = eventRange.eventStartMS; + seg.eventDurationMS = eventRange.eventDurationMS; + } + + return segs; + } + +}); + + +/* Utilities +----------------------------------------------------------------------------------------------------------------------*/ + + +function isBgEvent(event) { // returns true if background OR inverse-background + var rendering = getEventRendering(event); + return rendering === 'background' || rendering === 'inverse-background'; +} + + +function isInverseBgEvent(event) { + return getEventRendering(event) === 'inverse-background'; +} + + +function getEventRendering(event) { + return firstDefined((event.source || {}).rendering, event.rendering); +} + + +function groupEventsById(events) { + var eventsById = {}; + var i, event; + + for (i = 0; i < events.length; i++) { + event = events[i]; + (eventsById[event._id] || (eventsById[event._id] = [])).push(event); + } + + return eventsById; +} + + +// A cmp function for determining which non-inverted "ranges" (see above) happen earlier +function compareNormalRanges(range1, range2) { + return range1.eventStartMS - range2.eventStartMS; // earlier ranges go first +} + + +// A cmp function for determining which segments should take visual priority +// DOES NOT WORK ON INVERTED BACKGROUND EVENTS because they have no eventStartMS/eventDurationMS +function compareSegs(seg1, seg2) { + return seg1.eventStartMS - seg2.eventStartMS || // earlier events go first + seg2.eventDurationMS - seg1.eventDurationMS || // tie? longer events go first + seg2.event.allDay - seg1.event.allDay || // tie? put all-day events first (booleans cast to 0/1) + (seg1.event.title || '').localeCompare(seg2.event.title); // tie? alphabetically by title +} + +fc.compareSegs = compareSegs; // export + + +/* External-Dragging-Element Data +----------------------------------------------------------------------------------------------------------------------*/ + +// Require all HTML5 data-* attributes used by FullCalendar to have this prefix. +// A value of '' will query attributes like data-event. A value of 'fc' will query attributes like data-fc-event. +fc.dataAttrPrefix = ''; + +// Given a jQuery element that might represent a dragged FullCalendar event, returns an intermediate data structure +// to be used for Event Object creation. +// A defined `.eventProps`, even when empty, indicates that an event should be created. +function getDraggedElMeta(el) { + var prefix = fc.dataAttrPrefix; + var eventProps; // properties for creating the event, not related to date/time + var startTime; // a Duration + var duration; + var stick; + + if (prefix) { prefix += '-'; } + eventProps = el.data(prefix + 'event') || null; + + if (eventProps) { + if (typeof eventProps === 'object') { + eventProps = $.extend({}, eventProps); // make a copy + } + else { // something like 1 or true. still signal event creation + eventProps = {}; + } + + // pluck special-cased date/time properties + startTime = eventProps.start; + if (startTime == null) { startTime = eventProps.time; } // accept 'time' as well + duration = eventProps.duration; + stick = eventProps.stick; + delete eventProps.start; + delete eventProps.time; + delete eventProps.duration; + delete eventProps.stick; + } + + // fallback to standalone attribute values for each of the date/time properties + if (startTime == null) { startTime = el.data(prefix + 'start'); } + if (startTime == null) { startTime = el.data(prefix + 'time'); } // accept 'time' as well + if (duration == null) { duration = el.data(prefix + 'duration'); } + if (stick == null) { stick = el.data(prefix + 'stick'); } + + // massage into correct data types + startTime = startTime != null ? moment.duration(startTime) : null; + duration = duration != null ? moment.duration(duration) : null; + stick = Boolean(stick); + + return { eventProps: eventProps, startTime: startTime, duration: duration, stick: stick }; +} + + + /* A component that renders a grid of whole-days that runs horizontally. There can be multiple rows, one per week. +----------------------------------------------------------------------------------------------------------------------*/ + +var DayGrid = Grid.extend({ + + numbersVisible: false, // should render a row for day/week numbers? set by outside view. TODO: make internal + bottomCoordPadding: 0, // hack for extending the hit area for the last row of the coordinate grid + breakOnWeeks: null, // should create a new row for each week? set by outside view + + cellDates: null, // flat chronological array of each cell's dates + dayToCellOffsets: null, // maps days offsets from grid's start date, to cell offsets + + rowEls: null, // set of fake row elements + dayEls: null, // set of whole-day elements comprising the row's background + helperEls: null, // set of cell skeleton elements for rendering the mock event "helper" + + + // Renders the rows and columns into the component's `this.el`, which should already be assigned. + // isRigid determins whether the individual rows should ignore the contents and be a constant height. + // Relies on the view's colCnt and rowCnt. In the future, this component should probably be self-sufficient. + render: function(isRigid) { + var view = this.view; + var rowCnt = this.rowCnt; + var colCnt = this.colCnt; + var cellCnt = rowCnt * colCnt; + var html = ''; + var row; + var i, cell; + + for (row = 0; row < rowCnt; row++) { + html += this.dayRowHtml(row, isRigid); + } + this.el.html(html); + + this.rowEls = this.el.find('.fc-row'); + this.dayEls = this.el.find('.fc-day'); + + // trigger dayRender with each cell's element + for (i = 0; i < cellCnt; i++) { + cell = this.getCell(i); + view.trigger('dayRender', null, cell.start, this.dayEls.eq(i)); + } + + Grid.prototype.render.call(this); // call the super-method + }, + + + destroy: function() { + this.destroySegPopover(); + Grid.prototype.destroy.call(this); // call the super-method + }, + + + // Generates the HTML for a single row. `row` is the row number. + dayRowHtml: function(row, isRigid) { + var view = this.view; + var classes = [ 'fc-row', 'fc-week', view.widgetContentClass ]; + + if (isRigid) { + classes.push('fc-rigid'); + } + + return '' + + '<div class="' + classes.join(' ') + '">' + + '<div class="fc-bg">' + + '<table>' + + this.rowHtml('day', row) + // leverages RowRenderer. calls dayCellHtml() + '</table>' + + '</div>' + + '<div class="fc-content-skeleton">' + + '<table>' + + (this.numbersVisible ? + '<thead>' + + this.rowHtml('number', row) + // leverages RowRenderer. View will define render method + '</thead>' : + '' + ) + + '</table>' + + '</div>' + + '</div>'; + }, + + + // Renders the HTML for a whole-day cell. Will eventually end up in the day-row's background. + // We go through a 'day' row type instead of just doing a 'bg' row type so that the View can do custom rendering + // specifically for whole-day rows, whereas a 'bg' might also be used for other purposes (TimeGrid bg for example). + dayCellHtml: function(cell) { + return this.bgCellHtml(cell); + }, + + + /* Options + ------------------------------------------------------------------------------------------------------------------*/ + + + // Computes a default column header formatting string if `colFormat` is not explicitly defined + computeColHeadFormat: function() { + if (this.rowCnt > 1) { // more than one week row. day numbers will be in each cell + return 'ddd'; // "Sat" + } + else if (this.colCnt > 1) { // multiple days, so full single date string WON'T be in title text + return this.view.opt('dayOfMonthFormat'); // "Sat 12/10" + } + else { // single day, so full single date string will probably be in title text + return 'dddd'; // "Saturday" + } + }, + + + // Computes a default event time formatting string if `timeFormat` is not explicitly defined + computeEventTimeFormat: function() { + return this.view.opt('extraSmallTimeFormat'); // like "6p" or "6:30p" + }, + + + // Computes a default `displayEventEnd` value if one is not expliclty defined + computeDisplayEventEnd: function() { + return this.colCnt == 1; // we'll likely have space if there's only one day + }, + + + /* Cell System + ------------------------------------------------------------------------------------------------------------------*/ + + + // Initializes row/col information + updateCells: function() { + var cellDates; + var firstDay; + var rowCnt; + var colCnt; + + this.updateCellDates(); // populates cellDates and dayToCellOffsets + cellDates = this.cellDates; + + if (this.breakOnWeeks) { + // count columns until the day-of-week repeats + firstDay = cellDates[0].day(); + for (colCnt = 1; colCnt < cellDates.length; colCnt++) { + if (cellDates[colCnt].day() == firstDay) { + break; + } + } + rowCnt = Math.ceil(cellDates.length / colCnt); + } + else { + rowCnt = 1; + colCnt = cellDates.length; + } + + this.rowCnt = rowCnt; + this.colCnt = colCnt; + }, + + + // Populates cellDates and dayToCellOffsets + updateCellDates: function() { + var view = this.view; + var date = this.start.clone(); + var dates = []; + var offset = -1; + var offsets = []; + + while (date.isBefore(this.end)) { // loop each day from start to end + if (view.isHiddenDay(date)) { + offsets.push(offset + 0.5); // mark that it's between offsets + } + else { + offset++; + offsets.push(offset); + dates.push(date.clone()); + } + date.add(1, 'days'); + } + + this.cellDates = dates; + this.dayToCellOffsets = offsets; + }, + + + // Given a cell object, generates a range object + computeCellRange: function(cell) { + var colCnt = this.colCnt; + var index = cell.row * colCnt + (this.isRTL ? colCnt - cell.col - 1 : cell.col); + var start = this.cellDates[index].clone(); + var end = start.clone().add(1, 'day'); + + return { start: start, end: end }; + }, + + + // Retrieves the element representing the given row + getRowEl: function(row) { + return this.rowEls.eq(row); + }, + + + // Retrieves the element representing the given column + getColEl: function(col) { + return this.dayEls.eq(col); + }, + + + // Gets the whole-day element associated with the cell + getCellDayEl: function(cell) { + return this.dayEls.eq(cell.row * this.colCnt + cell.col); + }, + + + // Overrides Grid's method for when row coordinates are computed + computeRowCoords: function() { + var rowCoords = Grid.prototype.computeRowCoords.call(this); // call the super-method + + // hack for extending last row (used by AgendaView) + rowCoords[rowCoords.length - 1].bottom += this.bottomCoordPadding; + + return rowCoords; + }, + + + /* Dates + ------------------------------------------------------------------------------------------------------------------*/ + + + // Slices up a date range by row into an array of segments + rangeToSegs: function(range) { + var isRTL = this.isRTL; + var rowCnt = this.rowCnt; + var colCnt = this.colCnt; + var segs = []; + var first, last; // inclusive cell-offset range for given range + var row; + var rowFirst, rowLast; // inclusive cell-offset range for current row + var isStart, isEnd; + var segFirst, segLast; // inclusive cell-offset range for segment + var seg; + + range = this.view.computeDayRange(range); // make whole-day range, considering nextDayThreshold + first = this.dateToCellOffset(range.start); + last = this.dateToCellOffset(range.end.subtract(1, 'days')); // offset of inclusive end date + + for (row = 0; row < rowCnt; row++) { + rowFirst = row * colCnt; + rowLast = rowFirst + colCnt - 1; + + // intersect segment's offset range with the row's + segFirst = Math.max(rowFirst, first); + segLast = Math.min(rowLast, last); + + // deal with in-between indices + segFirst = Math.ceil(segFirst); // in-between starts round to next cell + segLast = Math.floor(segLast); // in-between ends round to prev cell + + if (segFirst <= segLast) { // was there any intersection with the current row? + + // must be matching integers to be the segment's start/end + isStart = segFirst === first; + isEnd = segLast === last; + + // translate offsets to be relative to start-of-row + segFirst -= rowFirst; + segLast -= rowFirst; + + seg = { row: row, isStart: isStart, isEnd: isEnd }; + if (isRTL) { + seg.leftCol = colCnt - segLast - 1; + seg.rightCol = colCnt - segFirst - 1; + } + else { + seg.leftCol = segFirst; + seg.rightCol = segLast; + } + segs.push(seg); + } + } + + return segs; + }, + + + // Given a date, returns its chronolocial cell-offset from the first cell of the grid. + // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets. + // If before the first offset, returns a negative number. + // If after the last offset, returns an offset past the last cell offset. + // Only works for *start* dates of cells. Will not work for exclusive end dates for cells. + dateToCellOffset: function(date) { + var offsets = this.dayToCellOffsets; + var day = date.diff(this.start, 'days'); + + if (day < 0) { + return offsets[0] - 1; + } + else if (day >= offsets.length) { + return offsets[offsets.length - 1] + 1; + } + else { + return offsets[day]; + } + }, + + + /* Event Drag Visualization + ------------------------------------------------------------------------------------------------------------------*/ + // TODO: move to DayGrid.event, similar to what we did with Grid's drag methods + + + // Renders a visual indication of an event or external element being dragged. + // The dropLocation's end can be null. seg can be null. See Grid::renderDrag for more info. + renderDrag: function(dropLocation, seg) { + var opacity; + + // always render a highlight underneath + this.renderHighlight( + this.view.calendar.ensureVisibleEventRange(dropLocation) // needs to be a proper range + ); + + // if a segment from the same calendar but another component is being dragged, render a helper event + if (seg && !seg.el.closest(this.el).length) { + + this.renderRangeHelper(dropLocation, seg); + + opacity = this.view.opt('dragOpacity'); + if (opacity !== undefined) { + this.helperEls.css('opacity', opacity); + } + + return true; // a helper has been rendered + } + }, + + + // Unrenders any visual indication of a hovering event + destroyDrag: function() { + this.destroyHighlight(); + this.destroyHelper(); + }, + + + /* Event Resize Visualization + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of an event being resized + renderEventResize: function(range, seg) { + this.renderHighlight(range); + this.renderRangeHelper(range, seg); + }, + + + // Unrenders a visual indication of an event being resized + destroyEventResize: function() { + this.destroyHighlight(); + this.destroyHelper(); + }, + + + /* Event Helper + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a mock "helper" event. `sourceSeg` is the associated internal segment object. It can be null. + renderHelper: function(event, sourceSeg) { + var helperNodes = []; + var segs = this.eventsToSegs([ event ]); + var rowStructs; + + segs = this.renderFgSegEls(segs); // assigns each seg's el and returns a subset of segs that were rendered + rowStructs = this.renderSegRows(segs); + + // inject each new event skeleton into each associated row + this.rowEls.each(function(row, rowNode) { + var rowEl = $(rowNode); // the .fc-row + var skeletonEl = $('<div class="fc-helper-skeleton"><table/></div>'); // will be absolutely positioned + var skeletonTop; + + // If there is an original segment, match the top position. Otherwise, put it at the row's top level + if (sourceSeg && sourceSeg.row === row) { + skeletonTop = sourceSeg.el.position().top; + } + else { + skeletonTop = rowEl.find('.fc-content-skeleton tbody').position().top; + } + + skeletonEl.css('top', skeletonTop) + .find('table') + .append(rowStructs[row].tbodyEl); + + rowEl.append(skeletonEl); + helperNodes.push(skeletonEl[0]); + }); + + this.helperEls = $(helperNodes); // array -> jQuery set + }, + + + // Unrenders any visual indication of a mock helper event + destroyHelper: function() { + if (this.helperEls) { + this.helperEls.remove(); + this.helperEls = null; + } + }, + + + /* Fill System (highlight, background events, business hours) + ------------------------------------------------------------------------------------------------------------------*/ + + + fillSegTag: 'td', // override the default tag name + + + // Renders a set of rectangles over the given segments of days. + // Only returns segments that successfully rendered. + renderFill: function(type, segs) { + var nodes = []; + var i, seg; + var skeletonEl; + + segs = this.renderFillSegEls(type, segs); // assignes `.el` to each seg. returns successfully rendered segs + + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + skeletonEl = this.renderFillRow(type, seg); + this.rowEls.eq(seg.row).append(skeletonEl); + nodes.push(skeletonEl[0]); + } + + this.elsByFill[type] = $(nodes); + + return segs; + }, + + + // Generates the HTML needed for one row of a fill. Requires the seg's el to be rendered. + renderFillRow: function(type, seg) { + var colCnt = this.colCnt; + var startCol = seg.leftCol; + var endCol = seg.rightCol + 1; + var skeletonEl; + var trEl; + + skeletonEl = $( + '<div class="fc-' + type.toLowerCase() + '-skeleton">' + + '<table><tr/></table>' + + '</div>' + ); + trEl = skeletonEl.find('tr'); + + if (startCol > 0) { + trEl.append('<td colspan="' + startCol + '"/>'); + } + + trEl.append( + seg.el.attr('colspan', endCol - startCol) + ); + + if (endCol < colCnt) { + trEl.append('<td colspan="' + (colCnt - endCol) + '"/>'); + } + + this.bookendCells(trEl, type); + + return skeletonEl; + } + +}); + + /* Event-rendering methods for the DayGrid class +----------------------------------------------------------------------------------------------------------------------*/ + +DayGrid.mixin({ + + rowStructs: null, // an array of objects, each holding information about a row's foreground event-rendering + + + // Unrenders all events currently rendered on the grid + destroyEvents: function() { + this.destroySegPopover(); // removes the "more.." events popover + Grid.prototype.destroyEvents.apply(this, arguments); // calls the super-method + }, + + + // Retrieves all rendered segment objects currently rendered on the grid + getEventSegs: function() { + return Grid.prototype.getEventSegs.call(this) // get the segments from the super-method + .concat(this.popoverSegs || []); // append the segments from the "more..." popover + }, + + + // Renders the given background event segments onto the grid + renderBgSegs: function(segs) { + + // don't render timed background events + var allDaySegs = $.grep(segs, function(seg) { + return seg.event.allDay; + }); + + return Grid.prototype.renderBgSegs.call(this, allDaySegs); // call the super-method + }, + + + // Renders the given foreground event segments onto the grid + renderFgSegs: function(segs) { + var rowStructs; + + // render an `.el` on each seg + // returns a subset of the segs. segs that were actually rendered + segs = this.renderFgSegEls(segs); + + rowStructs = this.rowStructs = this.renderSegRows(segs); + + // append to each row's content skeleton + this.rowEls.each(function(i, rowNode) { + $(rowNode).find('.fc-content-skeleton > table').append( + rowStructs[i].tbodyEl + ); + }); + + return segs; // return only the segs that were actually rendered + }, + + + // Unrenders all currently rendered foreground event segments + destroyFgSegs: function() { + var rowStructs = this.rowStructs || []; + var rowStruct; + + while ((rowStruct = rowStructs.pop())) { + rowStruct.tbodyEl.remove(); + } + + this.rowStructs = null; + }, + + + // Uses the given events array to generate <tbody> elements that should be appended to each row's content skeleton. + // Returns an array of rowStruct objects (see the bottom of `renderSegRow`). + // PRECONDITION: each segment shoud already have a rendered and assigned `.el` + renderSegRows: function(segs) { + var rowStructs = []; + var segRows; + var row; + + segRows = this.groupSegRows(segs); // group into nested arrays + + // iterate each row of segment groupings + for (row = 0; row < segRows.length; row++) { + rowStructs.push( + this.renderSegRow(row, segRows[row]) + ); + } + + return rowStructs; + }, + + + // Builds the HTML to be used for the default element for an individual segment + fgSegHtml: function(seg, disableResizing) { + var view = this.view; + var event = seg.event; + var isDraggable = view.isEventDraggable(event); + var isResizable = !disableResizing && event.allDay && seg.isEnd && view.isEventResizable(event); + var classes = this.getSegClasses(seg, isDraggable, isResizable); + var skinCss = this.getEventSkinCss(event); + var timeHtml = ''; + var titleHtml; + + classes.unshift('fc-day-grid-event'); + + // Only display a timed events time if it is the starting segment + if (!event.allDay && seg.isStart) { + timeHtml = '<span class="fc-time">' + htmlEscape(this.getEventTimeText(event)) + '</span>'; + } + + titleHtml = + '<span class="fc-title">' + + (htmlEscape(event.title || '') || '&nbsp;') + // we always want one line of height + '</span>'; + + return '<a class="' + classes.join(' ') + '"' + + (event.url ? + ' href="' + htmlEscape(event.url) + '"' : + '' + ) + + (skinCss ? + ' style="' + skinCss + '"' : + '' + ) + + '>' + + '<div class="fc-content">' + + (this.isRTL ? + titleHtml + ' ' + timeHtml : // put a natural space in between + timeHtml + ' ' + titleHtml // + ) + + '</div>' + + (isResizable ? + '<div class="fc-resizer"/>' : + '' + ) + + '</a>'; + }, + + + // Given a row # and an array of segments all in the same row, render a <tbody> element, a skeleton that contains + // the segments. Returns object with a bunch of internal data about how the render was calculated. + renderSegRow: function(row, rowSegs) { + var colCnt = this.colCnt; + var segLevels = this.buildSegLevels(rowSegs); // group into sub-arrays of levels + var levelCnt = Math.max(1, segLevels.length); // ensure at least one level + var tbody = $('<tbody/>'); + var segMatrix = []; // lookup for which segments are rendered into which level+col cells + var cellMatrix = []; // lookup for all <td> elements of the level+col matrix + var loneCellMatrix = []; // lookup for <td> elements that only take up a single column + var i, levelSegs; + var col; + var tr; + var j, seg; + var td; + + // populates empty cells from the current column (`col`) to `endCol` + function emptyCellsUntil(endCol) { + while (col < endCol) { + // try to grab a cell from the level above and extend its rowspan. otherwise, create a fresh cell + td = (loneCellMatrix[i - 1] || [])[col]; + if (td) { + td.attr( + 'rowspan', + parseInt(td.attr('rowspan') || 1, 10) + 1 + ); + } + else { + td = $('<td/>'); + tr.append(td); + } + cellMatrix[i][col] = td; + loneCellMatrix[i][col] = td; + col++; + } + } + + for (i = 0; i < levelCnt; i++) { // iterate through all levels + levelSegs = segLevels[i]; + col = 0; + tr = $('<tr/>'); + + segMatrix.push([]); + cellMatrix.push([]); + loneCellMatrix.push([]); + + // levelCnt might be 1 even though there are no actual levels. protect against this. + // this single empty row is useful for styling. + if (levelSegs) { + for (j = 0; j < levelSegs.length; j++) { // iterate through segments in level + seg = levelSegs[j]; + + emptyCellsUntil(seg.leftCol); + + // create a container that occupies or more columns. append the event element. + td = $('<td class="fc-event-container"/>').append(seg.el); + if (seg.leftCol != seg.rightCol) { + td.attr('colspan', seg.rightCol - seg.leftCol + 1); + } + else { // a single-column segment + loneCellMatrix[i][col] = td; + } + + while (col <= seg.rightCol) { + cellMatrix[i][col] = td; + segMatrix[i][col] = seg; + col++; + } + + tr.append(td); + } + } + + emptyCellsUntil(colCnt); // finish off the row + this.bookendCells(tr, 'eventSkeleton'); + tbody.append(tr); + } + + return { // a "rowStruct" + row: row, // the row number + tbodyEl: tbody, + cellMatrix: cellMatrix, + segMatrix: segMatrix, + segLevels: segLevels, + segs: rowSegs + }; + }, + + + // Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels. + buildSegLevels: function(segs) { + var levels = []; + var i, seg; + var j; + + // Give preference to elements with certain criteria, so they have + // a chance to be closer to the top. + segs.sort(compareSegs); + + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + + // loop through levels, starting with the topmost, until the segment doesn't collide with other segments + for (j = 0; j < levels.length; j++) { + if (!isDaySegCollision(seg, levels[j])) { + break; + } + } + // `j` now holds the desired subrow index + seg.level = j; + + // create new level array if needed and append segment + (levels[j] || (levels[j] = [])).push(seg); + } + + // order segments left-to-right. very important if calendar is RTL + for (j = 0; j < levels.length; j++) { + levels[j].sort(compareDaySegCols); + } + + return levels; + }, + + + // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row + groupSegRows: function(segs) { + var segRows = []; + var i; + + for (i = 0; i < this.rowCnt; i++) { + segRows.push([]); + } + + for (i = 0; i < segs.length; i++) { + segRows[segs[i].row].push(segs[i]); + } + + return segRows; + } + +}); + + +// Computes whether two segments' columns collide. They are assumed to be in the same row. +function isDaySegCollision(seg, otherSegs) { + var i, otherSeg; + + for (i = 0; i < otherSegs.length; i++) { + otherSeg = otherSegs[i]; + + if ( + otherSeg.leftCol <= seg.rightCol && + otherSeg.rightCol >= seg.leftCol + ) { + return true; + } + } + + return false; +} + + +// A cmp function for determining the leftmost event +function compareDaySegCols(a, b) { + return a.leftCol - b.leftCol; +} + + /* Methods relate to limiting the number events for a given day on a DayGrid +----------------------------------------------------------------------------------------------------------------------*/ +// NOTE: all the segs being passed around in here are foreground segs + +DayGrid.mixin({ + + segPopover: null, // the Popover that holds events that can't fit in a cell. null when not visible + popoverSegs: null, // an array of segment objects that the segPopover holds. null when not visible + + + destroySegPopover: function() { + if (this.segPopover) { + this.segPopover.hide(); // will trigger destruction of `segPopover` and `popoverSegs` + } + }, + + + // Limits the number of "levels" (vertically stacking layers of events) for each row of the grid. + // `levelLimit` can be false (don't limit), a number, or true (should be computed). + limitRows: function(levelLimit) { + var rowStructs = this.rowStructs || []; + var row; // row # + var rowLevelLimit; + + for (row = 0; row < rowStructs.length; row++) { + this.unlimitRow(row); + + if (!levelLimit) { + rowLevelLimit = false; + } + else if (typeof levelLimit === 'number') { + rowLevelLimit = levelLimit; + } + else { + rowLevelLimit = this.computeRowLevelLimit(row); + } + + if (rowLevelLimit !== false) { + this.limitRow(row, rowLevelLimit); + } + } + }, + + + // Computes the number of levels a row will accomodate without going outside its bounds. + // Assumes the row is "rigid" (maintains a constant height regardless of what is inside). + // `row` is the row number. + computeRowLevelLimit: function(row) { + var rowEl = this.rowEls.eq(row); // the containing "fake" row div + var rowHeight = rowEl.height(); // TODO: cache somehow? + var trEls = this.rowStructs[row].tbodyEl.children(); + var i, trEl; + + // Reveal one level <tr> at a time and stop when we find one out of bounds + for (i = 0; i < trEls.length; i++) { + trEl = trEls.eq(i).removeClass('fc-limited'); // get and reveal + if (trEl.position().top + trEl.outerHeight() > rowHeight) { + return i; + } + } + + return false; // should not limit at all + }, + + + // Limits the given grid row to the maximum number of levels and injects "more" links if necessary. + // `row` is the row number. + // `levelLimit` is a number for the maximum (inclusive) number of levels allowed. + limitRow: function(row, levelLimit) { + var _this = this; + var rowStruct = this.rowStructs[row]; + var moreNodes = []; // array of "more" <a> links and <td> DOM nodes + var col = 0; // col #, left-to-right (not chronologically) + var cell; + var levelSegs; // array of segment objects in the last allowable level, ordered left-to-right + var cellMatrix; // a matrix (by level, then column) of all <td> jQuery elements in the row + var limitedNodes; // array of temporarily hidden level <tr> and segment <td> DOM nodes + var i, seg; + var segsBelow; // array of segment objects below `seg` in the current `col` + var totalSegsBelow; // total number of segments below `seg` in any of the columns `seg` occupies + var colSegsBelow; // array of segment arrays, below seg, one for each column (offset from segs's first column) + var td, rowspan; + var segMoreNodes; // array of "more" <td> cells that will stand-in for the current seg's cell + var j; + var moreTd, moreWrap, moreLink; + + // Iterates through empty level cells and places "more" links inside if need be + function emptyCellsUntil(endCol) { // goes from current `col` to `endCol` + while (col < endCol) { + cell = _this.getCell(row, col); + segsBelow = _this.getCellSegs(cell, levelLimit); + if (segsBelow.length) { + td = cellMatrix[levelLimit - 1][col]; + moreLink = _this.renderMoreLink(cell, segsBelow); + moreWrap = $('<div/>').append(moreLink); + td.append(moreWrap); + moreNodes.push(moreWrap[0]); + } + col++; + } + } + + if (levelLimit && levelLimit < rowStruct.segLevels.length) { // is it actually over the limit? + levelSegs = rowStruct.segLevels[levelLimit - 1]; + cellMatrix = rowStruct.cellMatrix; + + limitedNodes = rowStruct.tbodyEl.children().slice(levelLimit) // get level <tr> elements past the limit + .addClass('fc-limited').get(); // hide elements and get a simple DOM-nodes array + + // iterate though segments in the last allowable level + for (i = 0; i < levelSegs.length; i++) { + seg = levelSegs[i]; + emptyCellsUntil(seg.leftCol); // process empty cells before the segment + + // determine *all* segments below `seg` that occupy the same columns + colSegsBelow = []; + totalSegsBelow = 0; + while (col <= seg.rightCol) { + cell = this.getCell(row, col); + segsBelow = this.getCellSegs(cell, levelLimit); + colSegsBelow.push(segsBelow); + totalSegsBelow += segsBelow.length; + col++; + } + + if (totalSegsBelow) { // do we need to replace this segment with one or many "more" links? + td = cellMatrix[levelLimit - 1][seg.leftCol]; // the segment's parent cell + rowspan = td.attr('rowspan') || 1; + segMoreNodes = []; + + // make a replacement <td> for each column the segment occupies. will be one for each colspan + for (j = 0; j < colSegsBelow.length; j++) { + moreTd = $('<td class="fc-more-cell"/>').attr('rowspan', rowspan); + segsBelow = colSegsBelow[j]; + cell = this.getCell(row, seg.leftCol + j); + moreLink = this.renderMoreLink(cell, [ seg ].concat(segsBelow)); // count seg as hidden too + moreWrap = $('<div/>').append(moreLink); + moreTd.append(moreWrap); + segMoreNodes.push(moreTd[0]); + moreNodes.push(moreTd[0]); + } + + td.addClass('fc-limited').after($(segMoreNodes)); // hide original <td> and inject replacements + limitedNodes.push(td[0]); + } + } + + emptyCellsUntil(this.colCnt); // finish off the level + rowStruct.moreEls = $(moreNodes); // for easy undoing later + rowStruct.limitedEls = $(limitedNodes); // for easy undoing later + } + }, + + + // Reveals all levels and removes all "more"-related elements for a grid's row. + // `row` is a row number. + unlimitRow: function(row) { + var rowStruct = this.rowStructs[row]; + + if (rowStruct.moreEls) { + rowStruct.moreEls.remove(); + rowStruct.moreEls = null; + } + + if (rowStruct.limitedEls) { + rowStruct.limitedEls.removeClass('fc-limited'); + rowStruct.limitedEls = null; + } + }, + + + // Renders an <a> element that represents hidden event element for a cell. + // Responsible for attaching click handler as well. + renderMoreLink: function(cell, hiddenSegs) { + var _this = this; + var view = this.view; + + return $('<a class="fc-more"/>') + .text( + this.getMoreLinkText(hiddenSegs.length) + ) + .on('click', function(ev) { + var clickOption = view.opt('eventLimitClick'); + var date = cell.start; + var moreEl = $(this); + var dayEl = _this.getCellDayEl(cell); + var allSegs = _this.getCellSegs(cell); + + // rescope the segments to be within the cell's date + var reslicedAllSegs = _this.resliceDaySegs(allSegs, date); + var reslicedHiddenSegs = _this.resliceDaySegs(hiddenSegs, date); + + if (typeof clickOption === 'function') { + // the returned value can be an atomic option + clickOption = view.trigger('eventLimitClick', null, { + date: date, + dayEl: dayEl, + moreEl: moreEl, + segs: reslicedAllSegs, + hiddenSegs: reslicedHiddenSegs + }, ev); + } + + if (clickOption === 'popover') { + _this.showSegPopover(cell, moreEl, reslicedAllSegs); + } + else if (typeof clickOption === 'string') { // a view name + view.calendar.zoomTo(date, clickOption); + } + }); + }, + + + // Reveals the popover that displays all events within a cell + showSegPopover: function(cell, moreLink, segs) { + var _this = this; + var view = this.view; + var moreWrap = moreLink.parent(); // the <div> wrapper around the <a> + var topEl; // the element we want to match the top coordinate of + var options; + + if (this.rowCnt == 1) { + topEl = view.el; // will cause the popover to cover any sort of header + } + else { + topEl = this.rowEls.eq(cell.row); // will align with top of row + } + + options = { + className: 'fc-more-popover', + content: this.renderSegPopoverContent(cell, segs), + parentEl: this.el, + top: topEl.offset().top, + autoHide: true, // when the user clicks elsewhere, hide the popover + viewportConstrain: view.opt('popoverViewportConstrain'), + hide: function() { + // destroy everything when the popover is hidden + _this.segPopover.destroy(); + _this.segPopover = null; + _this.popoverSegs = null; + } + }; + + // Determine horizontal coordinate. + // We use the moreWrap instead of the <td> to avoid border confusion. + if (this.isRTL) { + options.right = moreWrap.offset().left + moreWrap.outerWidth() + 1; // +1 to be over cell border + } + else { + options.left = moreWrap.offset().left - 1; // -1 to be over cell border + } + + this.segPopover = new Popover(options); + this.segPopover.show(); + }, + + + // Builds the inner DOM contents of the segment popover + renderSegPopoverContent: function(cell, segs) { + var view = this.view; + var isTheme = view.opt('theme'); + var title = cell.start.format(view.opt('dayPopoverFormat')); + var content = $( + '<div class="fc-header ' + view.widgetHeaderClass + '">' + + '<span class="fc-close ' + + (isTheme ? 'ui-icon ui-icon-closethick' : 'fc-icon fc-icon-x') + + '"></span>' + + '<span class="fc-title">' + + htmlEscape(title) + + '</span>' + + '<div class="fc-clear"/>' + + '</div>' + + '<div class="fc-body ' + view.widgetContentClass + '">' + + '<div class="fc-event-container"></div>' + + '</div>' + ); + var segContainer = content.find('.fc-event-container'); + var i; + + // render each seg's `el` and only return the visible segs + segs = this.renderFgSegEls(segs, true); // disableResizing=true + this.popoverSegs = segs; + + for (i = 0; i < segs.length; i++) { + + // because segments in the popover are not part of a grid coordinate system, provide a hint to any + // grids that want to do drag-n-drop about which cell it came from + segs[i].cell = cell; + + segContainer.append(segs[i].el); + } + + return content; + }, + + + // Given the events within an array of segment objects, reslice them to be in a single day + resliceDaySegs: function(segs, dayDate) { + + // build an array of the original events + var events = $.map(segs, function(seg) { + return seg.event; + }); + + var dayStart = dayDate.clone().stripTime(); + var dayEnd = dayStart.clone().add(1, 'days'); + var dayRange = { start: dayStart, end: dayEnd }; + + // slice the events with a custom slicing function + return this.eventsToSegs( + events, + function(range) { + var seg = intersectionToSeg(range, dayRange); // undefind if no intersection + return seg ? [ seg ] : []; // must return an array of segments + } + ); + }, + + + // Generates the text that should be inside a "more" link, given the number of events it represents + getMoreLinkText: function(num) { + var opt = this.view.opt('eventLimitText'); + + if (typeof opt === 'function') { + return opt(num); + } + else { + return '+' + num + ' ' + opt; + } + }, + + + // Returns segments within a given cell. + // If `startLevel` is specified, returns only events including and below that level. Otherwise returns all segs. + getCellSegs: function(cell, startLevel) { + var segMatrix = this.rowStructs[cell.row].segMatrix; + var level = startLevel || 0; + var segs = []; + var seg; + + while (level < segMatrix.length) { + seg = segMatrix[level][cell.col]; + if (seg) { + segs.push(seg); + } + level++; + } + + return segs; + } + +}); + + /* A component that renders one or more columns of vertical time slots +----------------------------------------------------------------------------------------------------------------------*/ + +var TimeGrid = Grid.extend({ + + slotDuration: null, // duration of a "slot", a distinct time segment on given day, visualized by lines + snapDuration: null, // granularity of time for dragging and selecting + + minTime: null, // Duration object that denotes the first visible time of any given day + maxTime: null, // Duration object that denotes the exclusive visible end time of any given day + + axisFormat: null, // formatting string for times running along vertical axis + + dayEls: null, // cells elements in the day-row background + slatEls: null, // elements running horizontally across all columns + + slatTops: null, // an array of top positions, relative to the container. last item holds bottom of last slot + + helperEl: null, // cell skeleton element for rendering the mock event "helper" + + businessHourSegs: null, + + + constructor: function() { + Grid.apply(this, arguments); // call the super-constructor + this.processOptions(); + }, + + + // Renders the time grid into `this.el`, which should already be assigned. + // Relies on the view's colCnt. In the future, this component should probably be self-sufficient. + render: function() { + this.el.html(this.renderHtml()); + this.dayEls = this.el.find('.fc-day'); + this.slatEls = this.el.find('.fc-slats tr'); + + this.computeSlatTops(); + this.renderBusinessHours(); + Grid.prototype.render.call(this); // call the super-method + }, + + + renderBusinessHours: function() { + var events = this.view.calendar.getBusinessHoursEvents(); + this.businessHourSegs = this.renderFill('businessHours', this.eventsToSegs(events), 'bgevent'); + }, + + + // Renders the basic HTML skeleton for the grid + renderHtml: function() { + return '' + + '<div class="fc-bg">' + + '<table>' + + this.rowHtml('slotBg') + // leverages RowRenderer, which will call slotBgCellHtml + '</table>' + + '</div>' + + '<div class="fc-slats">' + + '<table>' + + this.slatRowHtml() + + '</table>' + + '</div>'; + }, + + + // Renders the HTML for a vertical background cell behind the slots. + // This method is distinct from 'bg' because we wanted a new `rowType` so the View could customize the rendering. + slotBgCellHtml: function(cell) { + return this.bgCellHtml(cell); + }, + + + // Generates the HTML for the horizontal "slats" that run width-wise. Has a time axis on a side. Depends on RTL. + slatRowHtml: function() { + var view = this.view; + var isRTL = this.isRTL; + var html = ''; + var slotNormal = this.slotDuration.asMinutes() % 15 === 0; + var slotTime = moment.duration(+this.minTime); // wish there was .clone() for durations + var slotDate; // will be on the view's first day, but we only care about its time + var minutes; + var axisHtml; + + // Calculate the time for each slot + while (slotTime < this.maxTime) { + slotDate = this.start.clone().time(slotTime); // will be in UTC but that's good. to avoid DST issues + minutes = slotDate.minutes(); + + axisHtml = + '<td class="fc-axis fc-time ' + view.widgetContentClass + '" ' + view.axisStyleAttr() + '>' + + ((!slotNormal || !minutes) ? // if irregular slot duration, or on the hour, then display the time + '<span>' + // for matchCellWidths + htmlEscape(slotDate.format(this.axisFormat)) + + '</span>' : + '' + ) + + '</td>'; + + html += + '<tr ' + (!minutes ? '' : 'class="fc-minor"') + '>' + + (!isRTL ? axisHtml : '') + + '<td class="' + view.widgetContentClass + '"/>' + + (isRTL ? axisHtml : '') + + "</tr>"; + + slotTime.add(this.slotDuration); + } + + return html; + }, + + + /* Options + ------------------------------------------------------------------------------------------------------------------*/ + + + // Parses various options into properties of this object + processOptions: function() { + var view = this.view; + var slotDuration = view.opt('slotDuration'); + var snapDuration = view.opt('snapDuration'); + + slotDuration = moment.duration(slotDuration); + snapDuration = snapDuration ? moment.duration(snapDuration) : slotDuration; + + this.slotDuration = slotDuration; + this.snapDuration = snapDuration; + + this.minTime = moment.duration(view.opt('minTime')); + this.maxTime = moment.duration(view.opt('maxTime')); + + this.axisFormat = view.opt('axisFormat') || view.opt('smallTimeFormat'); + }, + + + // Computes a default column header formatting string if `colFormat` is not explicitly defined + computeColHeadFormat: function() { + if (this.colCnt > 1) { // multiple days, so full single date string WON'T be in title text + return this.view.opt('dayOfMonthFormat'); // "Sat 12/10" + } + else { // single day, so full single date string will probably be in title text + return 'dddd'; // "Saturday" + } + }, + + + // Computes a default event time formatting string if `timeFormat` is not explicitly defined + computeEventTimeFormat: function() { + return this.view.opt('noMeridiemTimeFormat'); // like "6:30" (no AM/PM) + }, + + + // Computes a default `displayEventEnd` value if one is not expliclty defined + computeDisplayEventEnd: function() { + return true; + }, + + + /* Cell System + ------------------------------------------------------------------------------------------------------------------*/ + + + // Initializes row/col information + updateCells: function() { + var view = this.view; + var colData = []; + var date; + + date = this.start.clone(); + while (date.isBefore(this.end)) { + colData.push({ + day: date.clone() + }); + date.add(1, 'day'); + date = view.skipHiddenDays(date); + } + + if (this.isRTL) { + colData.reverse(); + } + + this.colData = colData; + this.colCnt = colData.length; + this.rowCnt = Math.ceil((this.maxTime - this.minTime) / this.snapDuration); // # of vertical snaps + }, + + + // Given a cell object, generates a range object + computeCellRange: function(cell) { + var time = this.computeSnapTime(cell.row); + var start = this.view.calendar.rezoneDate(cell.day).time(time); + var end = start.clone().add(this.snapDuration); + + return { start: start, end: end }; + }, + + + // Retrieves the element representing the given column + getColEl: function(col) { + return this.dayEls.eq(col); + }, + + + /* Dates + ------------------------------------------------------------------------------------------------------------------*/ + + + // Given a row number of the grid, representing a "snap", returns a time (Duration) from its start-of-day + computeSnapTime: function(row) { + return moment.duration(this.minTime + this.snapDuration * row); + }, + + + // Slices up a date range by column into an array of segments + rangeToSegs: function(range) { + var colCnt = this.colCnt; + var segs = []; + var seg; + var col; + var colDate; + var colRange; + + // normalize :( + range = { + start: range.start.clone().stripZone(), + end: range.end.clone().stripZone() + }; + + for (col = 0; col < colCnt; col++) { + colDate = this.colData[col].day; // will be ambig time/timezone + colRange = { + start: colDate.clone().time(this.minTime), + end: colDate.clone().time(this.maxTime) + }; + seg = intersectionToSeg(range, colRange); // both will be ambig timezone + if (seg) { + seg.col = col; + segs.push(seg); + } + } + + return segs; + }, + + + /* Coordinates + ------------------------------------------------------------------------------------------------------------------*/ + + + // Called when there is a window resize/zoom and we need to recalculate coordinates for the grid + resize: function() { + this.computeSlatTops(); + this.updateSegVerticals(); + }, + + + // Computes the top/bottom coordinates of each "snap" rows + computeRowCoords: function() { + var originTop = this.el.offset().top; + var items = []; + var i; + var item; + + for (i = 0; i < this.rowCnt; i++) { + item = { + top: originTop + this.computeTimeTop(this.computeSnapTime(i)) + }; + if (i > 0) { + items[i - 1].bottom = item.top; + } + items.push(item); + } + item.bottom = item.top + this.computeTimeTop(this.computeSnapTime(i)); + + return items; + }, + + + // Computes the top coordinate, relative to the bounds of the grid, of the given date. + // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight. + computeDateTop: function(date, startOfDayDate) { + return this.computeTimeTop( + moment.duration( + date.clone().stripZone() - startOfDayDate.clone().stripTime() + ) + ); + }, + + + // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration). + computeTimeTop: function(time) { + var slatCoverage = (time - this.minTime) / this.slotDuration; // floating-point value of # of slots covered + var slatIndex; + var slatRemainder; + var slatTop; + var slatBottom; + + // constrain. because minTime/maxTime might be customized + slatCoverage = Math.max(0, slatCoverage); + slatCoverage = Math.min(this.slatEls.length, slatCoverage); + + slatIndex = Math.floor(slatCoverage); // an integer index of the furthest whole slot + slatRemainder = slatCoverage - slatIndex; + slatTop = this.slatTops[slatIndex]; // the top position of the furthest whole slot + + if (slatRemainder) { // time spans part-way into the slot + slatBottom = this.slatTops[slatIndex + 1]; + return slatTop + (slatBottom - slatTop) * slatRemainder; // part-way between slots + } + else { + return slatTop; + } + }, + + + // Queries each `slatEl` for its position relative to the grid's container and stores it in `slatTops`. + // Includes the the bottom of the last slat as the last item in the array. + computeSlatTops: function() { + var tops = []; + var top; + + this.slatEls.each(function(i, node) { + top = $(node).position().top; + tops.push(top); + }); + + tops.push(top + this.slatEls.last().outerHeight()); // bottom of the last slat + + this.slatTops = tops; + }, + + + /* Event Drag Visualization + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of an event being dragged over the specified date(s). + // dropLocation's end might be null, as well as `seg`. See Grid::renderDrag for more info. + // A returned value of `true` signals that a mock "helper" event has been rendered. + renderDrag: function(dropLocation, seg) { + var opacity; + + if (seg) { // if there is event information for this drag, render a helper event + this.renderRangeHelper(dropLocation, seg); + + opacity = this.view.opt('dragOpacity'); + if (opacity !== undefined) { + this.helperEl.css('opacity', opacity); + } + + return true; // signal that a helper has been rendered + } + else { + // otherwise, just render a highlight + this.renderHighlight( + this.view.calendar.ensureVisibleEventRange(dropLocation) // needs to be a proper range + ); + } + }, + + + // Unrenders any visual indication of an event being dragged + destroyDrag: function() { + this.destroyHelper(); + this.destroyHighlight(); + }, + + + /* Event Resize Visualization + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of an event being resized + renderEventResize: function(range, seg) { + this.renderRangeHelper(range, seg); + }, + + + // Unrenders any visual indication of an event being resized + destroyEventResize: function() { + this.destroyHelper(); + }, + + + /* Event Helper + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a mock "helper" event. `sourceSeg` is the original segment object and might be null (an external drag) + renderHelper: function(event, sourceSeg) { + var segs = this.eventsToSegs([ event ]); + var tableEl; + var i, seg; + var sourceEl; + + segs = this.renderFgSegEls(segs); // assigns each seg's el and returns a subset of segs that were rendered + tableEl = this.renderSegTable(segs); + + // Try to make the segment that is in the same row as sourceSeg look the same + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + if (sourceSeg && sourceSeg.col === seg.col) { + sourceEl = sourceSeg.el; + seg.el.css({ + left: sourceEl.css('left'), + right: sourceEl.css('right'), + 'margin-left': sourceEl.css('margin-left'), + 'margin-right': sourceEl.css('margin-right') + }); + } + } + + this.helperEl = $('<div class="fc-helper-skeleton"/>') + .append(tableEl) + .appendTo(this.el); + }, + + + // Unrenders any mock helper event + destroyHelper: function() { + if (this.helperEl) { + this.helperEl.remove(); + this.helperEl = null; + } + }, + + + /* Selection + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of a selection. Overrides the default, which was to simply render a highlight. + renderSelection: function(range) { + if (this.view.opt('selectHelper')) { // this setting signals that a mock helper event should be rendered + this.renderRangeHelper(range); + } + else { + this.renderHighlight(range); + } + }, + + + // Unrenders any visual indication of a selection + destroySelection: function() { + this.destroyHelper(); + this.destroyHighlight(); + }, + + + /* Fill System (highlight, background events, business hours) + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a set of rectangles over the given time segments. + // Only returns segments that successfully rendered. + renderFill: function(type, segs, className) { + var segCols; + var skeletonEl; + var trEl; + var col, colSegs; + var tdEl; + var containerEl; + var dayDate; + var i, seg; + + if (segs.length) { + + segs = this.renderFillSegEls(type, segs); // assignes `.el` to each seg. returns successfully rendered segs + segCols = this.groupSegCols(segs); // group into sub-arrays, and assigns 'col' to each seg + + className = className || type.toLowerCase(); + skeletonEl = $( + '<div class="fc-' + className + '-skeleton">' + + '<table><tr/></table>' + + '</div>' + ); + trEl = skeletonEl.find('tr'); + + for (col = 0; col < segCols.length; col++) { + colSegs = segCols[col]; + tdEl = $('<td/>').appendTo(trEl); + + if (colSegs.length) { + containerEl = $('<div class="fc-' + className + '-container"/>').appendTo(tdEl); + dayDate = this.colData[col].day; + + for (i = 0; i < colSegs.length; i++) { + seg = colSegs[i]; + containerEl.append( + seg.el.css({ + top: this.computeDateTop(seg.start, dayDate), + bottom: -this.computeDateTop(seg.end, dayDate) // the y position of the bottom edge + }) + ); + } + } + } + + this.bookendCells(trEl, type); + + this.el.append(skeletonEl); + this.elsByFill[type] = skeletonEl; + } + + return segs; + } + +}); + + /* Event-rendering methods for the TimeGrid class +----------------------------------------------------------------------------------------------------------------------*/ + +TimeGrid.mixin({ + + eventSkeletonEl: null, // has cells with event-containers, which contain absolutely positioned event elements + + + // Renders the given foreground event segments onto the grid + renderFgSegs: function(segs) { + segs = this.renderFgSegEls(segs); // returns a subset of the segs. segs that were actually rendered + + this.el.append( + this.eventSkeletonEl = $('<div class="fc-content-skeleton"/>') + .append(this.renderSegTable(segs)) + ); + + return segs; // return only the segs that were actually rendered + }, + + + // Unrenders all currently rendered foreground event segments + destroyFgSegs: function(segs) { + if (this.eventSkeletonEl) { + this.eventSkeletonEl.remove(); + this.eventSkeletonEl = null; + } + }, + + + // Renders and returns the <table> portion of the event-skeleton. + // Returns an object with properties 'tbodyEl' and 'segs'. + renderSegTable: function(segs) { + var tableEl = $('<table><tr/></table>'); + var trEl = tableEl.find('tr'); + var segCols; + var i, seg; + var col, colSegs; + var containerEl; + + segCols = this.groupSegCols(segs); // group into sub-arrays, and assigns 'col' to each seg + + this.computeSegVerticals(segs); // compute and assign top/bottom + + for (col = 0; col < segCols.length; col++) { // iterate each column grouping + colSegs = segCols[col]; + placeSlotSegs(colSegs); // compute horizontal coordinates, z-index's, and reorder the array + + containerEl = $('<div class="fc-event-container"/>'); + + // assign positioning CSS and insert into container + for (i = 0; i < colSegs.length; i++) { + seg = colSegs[i]; + seg.el.css(this.generateSegPositionCss(seg)); + + // if the height is short, add a className for alternate styling + if (seg.bottom - seg.top < 30) { + seg.el.addClass('fc-short'); + } + + containerEl.append(seg.el); + } + + trEl.append($('<td/>').append(containerEl)); + } + + this.bookendCells(trEl, 'eventSkeleton'); + + return tableEl; + }, + + + // Refreshes the CSS top/bottom coordinates for each segment element. Probably after a window resize/zoom. + // Repositions business hours segs too, so not just for events. Maybe shouldn't be here. + updateSegVerticals: function() { + var allSegs = (this.segs || []).concat(this.businessHourSegs || []); + var i; + + this.computeSegVerticals(allSegs); + + for (i = 0; i < allSegs.length; i++) { + allSegs[i].el.css( + this.generateSegVerticalCss(allSegs[i]) + ); + } + }, + + + // For each segment in an array, computes and assigns its top and bottom properties + computeSegVerticals: function(segs) { + var i, seg; + + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + seg.top = this.computeDateTop(seg.start, seg.start); + seg.bottom = this.computeDateTop(seg.end, seg.start); + } + }, + + + // Renders the HTML for a single event segment's default rendering + fgSegHtml: function(seg, disableResizing) { + var view = this.view; + var event = seg.event; + var isDraggable = view.isEventDraggable(event); + var isResizable = !disableResizing && seg.isEnd && view.isEventResizable(event); + var classes = this.getSegClasses(seg, isDraggable, isResizable); + var skinCss = this.getEventSkinCss(event); + var timeText; + var fullTimeText; // more verbose time text. for the print stylesheet + var startTimeText; // just the start time text + + classes.unshift('fc-time-grid-event'); + + if (view.isMultiDayEvent(event)) { // if the event appears to span more than one day... + // Don't display time text on segments that run entirely through a day. + // That would appear as midnight-midnight and would look dumb. + // Otherwise, display the time text for the *segment's* times (like 6pm-midnight or midnight-10am) + if (seg.isStart || seg.isEnd) { + timeText = this.getEventTimeText(seg); + fullTimeText = this.getEventTimeText(seg, 'LT'); + startTimeText = this.getEventTimeText({ start: seg.start }); + } + } else { + // Display the normal time text for the *event's* times + timeText = this.getEventTimeText(event); + fullTimeText = this.getEventTimeText(event, 'LT'); + startTimeText = this.getEventTimeText({ start: event.start }); + } + + return '<a class="' + classes.join(' ') + '"' + + (event.url ? + ' href="' + htmlEscape(event.url) + '"' : + '' + ) + + (skinCss ? + ' style="' + skinCss + '"' : + '' + ) + + '>' + + '<div class="fc-content">' + + (timeText ? + '<div class="fc-time"' + + ' data-start="' + htmlEscape(startTimeText) + '"' + + ' data-full="' + htmlEscape(fullTimeText) + '"' + + '>' + + '<span>' + htmlEscape(timeText) + '</span>' + + '</div>' : + '' + ) + + (event.title ? + '<div class="fc-title">' + + htmlEscape(event.title) + + '</div>' : + '' + ) + + '</div>' + + '<div class="fc-bg"/>' + + (isResizable ? + '<div class="fc-resizer"/>' : + '' + ) + + '</a>'; + }, + + + // Generates an object with CSS properties/values that should be applied to an event segment element. + // Contains important positioning-related properties that should be applied to any event element, customized or not. + generateSegPositionCss: function(seg) { + var shouldOverlap = this.view.opt('slotEventOverlap'); + var backwardCoord = seg.backwardCoord; // the left side if LTR. the right side if RTL. floating-point + var forwardCoord = seg.forwardCoord; // the right side if LTR. the left side if RTL. floating-point + var props = this.generateSegVerticalCss(seg); // get top/bottom first + var left; // amount of space from left edge, a fraction of the total width + var right; // amount of space from right edge, a fraction of the total width + + if (shouldOverlap) { + // double the width, but don't go beyond the maximum forward coordinate (1.0) + forwardCoord = Math.min(1, backwardCoord + (forwardCoord - backwardCoord) * 2); + } + + if (this.isRTL) { + left = 1 - forwardCoord; + right = backwardCoord; + } + else { + left = backwardCoord; + right = 1 - forwardCoord; + } + + props.zIndex = seg.level + 1; // convert from 0-base to 1-based + props.left = left * 100 + '%'; + props.right = right * 100 + '%'; + + if (shouldOverlap && seg.forwardPressure) { + // add padding to the edge so that forward stacked events don't cover the resizer's icon + props[this.isRTL ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width + } + + return props; + }, + + + // Generates an object with CSS properties for the top/bottom coordinates of a segment element + generateSegVerticalCss: function(seg) { + return { + top: seg.top, + bottom: -seg.bottom // flipped because needs to be space beyond bottom edge of event container + }; + }, + + + // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's col + groupSegCols: function(segs) { + var segCols = []; + var i; + + for (i = 0; i < this.colCnt; i++) { + segCols.push([]); + } + + for (i = 0; i < segs.length; i++) { + segCols[segs[i].col].push(segs[i]); + } + + return segCols; + } + +}); + + +// Given an array of segments that are all in the same column, sets the backwardCoord and forwardCoord on each. +// Also reorders the given array by date! +function placeSlotSegs(segs) { + var levels; + var level0; + var i; + + segs.sort(compareSegs); // order by date + levels = buildSlotSegLevels(segs); + computeForwardSlotSegs(levels); + + if ((level0 = levels[0])) { + + for (i = 0; i < level0.length; i++) { + computeSlotSegPressures(level0[i]); + } + + for (i = 0; i < level0.length; i++) { + computeSlotSegCoords(level0[i], 0, 0); + } + } +} + + +// Builds an array of segments "levels". The first level will be the leftmost tier of segments if the calendar is +// left-to-right, or the rightmost if the calendar is right-to-left. Assumes the segments are already ordered by date. +function buildSlotSegLevels(segs) { + var levels = []; + var i, seg; + var j; + + for (i=0; i<segs.length; i++) { + seg = segs[i]; + + // go through all the levels and stop on the first level where there are no collisions + for (j=0; j<levels.length; j++) { + if (!computeSlotSegCollisions(seg, levels[j]).length) { + break; + } + } + + seg.level = j; + + (levels[j] || (levels[j] = [])).push(seg); + } + + return levels; +} + + +// For every segment, figure out the other segments that are in subsequent +// levels that also occupy the same vertical space. Accumulate in seg.forwardSegs +function computeForwardSlotSegs(levels) { + var i, level; + var j, seg; + var k; + + for (i=0; i<levels.length; i++) { + level = levels[i]; + + for (j=0; j<level.length; j++) { + seg = level[j]; + + seg.forwardSegs = []; + for (k=i+1; k<levels.length; k++) { + computeSlotSegCollisions(seg, levels[k], seg.forwardSegs); + } + } + } +} + + +// Figure out which path forward (via seg.forwardSegs) results in the longest path until +// the furthest edge is reached. The number of segments in this path will be seg.forwardPressure +function computeSlotSegPressures(seg) { + var forwardSegs = seg.forwardSegs; + var forwardPressure = 0; + var i, forwardSeg; + + if (seg.forwardPressure === undefined) { // not already computed + + for (i=0; i<forwardSegs.length; i++) { + forwardSeg = forwardSegs[i]; + + // figure out the child's maximum forward path + computeSlotSegPressures(forwardSeg); + + // either use the existing maximum, or use the child's forward pressure + // plus one (for the forwardSeg itself) + forwardPressure = Math.max( + forwardPressure, + 1 + forwardSeg.forwardPressure + ); + } + + seg.forwardPressure = forwardPressure; + } +} + + +// Calculate seg.forwardCoord and seg.backwardCoord for the segment, where both values range +// from 0 to 1. If the calendar is left-to-right, the seg.backwardCoord maps to "left" and +// seg.forwardCoord maps to "right" (via percentage). Vice-versa if the calendar is right-to-left. +// +// The segment might be part of a "series", which means consecutive segments with the same pressure +// who's width is unknown until an edge has been hit. `seriesBackwardPressure` is the number of +// segments behind this one in the current series, and `seriesBackwardCoord` is the starting +// coordinate of the first segment in the series. +function computeSlotSegCoords(seg, seriesBackwardPressure, seriesBackwardCoord) { + var forwardSegs = seg.forwardSegs; + var i; + + if (seg.forwardCoord === undefined) { // not already computed + + if (!forwardSegs.length) { + + // if there are no forward segments, this segment should butt up against the edge + seg.forwardCoord = 1; + } + else { + + // sort highest pressure first + forwardSegs.sort(compareForwardSlotSegs); + + // this segment's forwardCoord will be calculated from the backwardCoord of the + // highest-pressure forward segment. + computeSlotSegCoords(forwardSegs[0], seriesBackwardPressure + 1, seriesBackwardCoord); + seg.forwardCoord = forwardSegs[0].backwardCoord; + } + + // calculate the backwardCoord from the forwardCoord. consider the series + seg.backwardCoord = seg.forwardCoord - + (seg.forwardCoord - seriesBackwardCoord) / // available width for series + (seriesBackwardPressure + 1); // # of segments in the series + + // use this segment's coordinates to computed the coordinates of the less-pressurized + // forward segments + for (i=0; i<forwardSegs.length; i++) { + computeSlotSegCoords(forwardSegs[i], 0, seg.forwardCoord); + } + } +} + + +// Find all the segments in `otherSegs` that vertically collide with `seg`. +// Append into an optionally-supplied `results` array and return. +function computeSlotSegCollisions(seg, otherSegs, results) { + results = results || []; + + for (var i=0; i<otherSegs.length; i++) { + if (isSlotSegCollision(seg, otherSegs[i])) { + results.push(otherSegs[i]); + } + } + + return results; +} + + +// Do these segments occupy the same vertical space? +function isSlotSegCollision(seg1, seg2) { + return seg1.bottom > seg2.top && seg1.top < seg2.bottom; +} + + +// A cmp function for determining which forward segment to rely on more when computing coordinates. +function compareForwardSlotSegs(seg1, seg2) { + // put higher-pressure first + return seg2.forwardPressure - seg1.forwardPressure || + // put segments that are closer to initial edge first (and favor ones with no coords yet) + (seg1.backwardCoord || 0) - (seg2.backwardCoord || 0) || + // do normal sorting... + compareSegs(seg1, seg2); +} + + /* An abstract class from which other views inherit from +----------------------------------------------------------------------------------------------------------------------*/ + +var View = fc.View = Class.extend({ + + type: null, // subclass' view name (string) + name: null, // deprecated. use `type` instead + + calendar: null, // owner Calendar object + options: null, // view-specific options + coordMap: null, // a CoordMap object for converting pixel regions to dates + el: null, // the view's containing element. set by Calendar + + // range the view is actually displaying (moments) + start: null, + end: null, // exclusive + + // range the view is formally responsible for (moments) + // may be different from start/end. for example, a month view might have 1st-31st, excluding padded dates + intervalStart: null, + intervalEnd: null, // exclusive + + intervalDuration: null, // the whole-unit duration that is being displayed + intervalUnit: null, // name of largest unit being displayed, like "month" or "week" + + isSelected: false, // boolean whether a range of time is user-selected or not + + // subclasses can optionally use a scroll container + scrollerEl: null, // the element that will most likely scroll when content is too tall + scrollTop: null, // cached vertical scroll value + + // classNames styled by jqui themes + widgetHeaderClass: null, + widgetContentClass: null, + highlightStateClass: null, + + // for date utils, computed from options + nextDayThreshold: null, + isHiddenDayHash: null, + + // document handlers, bound to `this` object + documentMousedownProxy: null, // TODO: doesn't work with touch + + + constructor: function(calendar, viewOptions, viewType) { + this.calendar = calendar; + this.options = viewOptions; + this.type = this.name = viewType; // .name is deprecated + + this.nextDayThreshold = moment.duration(this.opt('nextDayThreshold')); + this.initTheming(); + this.initHiddenDays(); + + this.documentMousedownProxy = $.proxy(this, 'documentMousedown'); + + this.initialize(); + }, + + + // A good place for subclasses to initialize member variables + initialize: function() { + // subclasses can implement + }, + + + // Retrieves an option with the given name + opt: function(name) { + var val; + + val = this.options[name]; // look at view-specific options first + if (val !== undefined) { + return val; + } + + val = this.calendar.options[name]; + if ($.isPlainObject(val) && !isForcedAtomicOption(name)) { // view-option-hashes are deprecated + return smartProperty(val, this.type); + } + + return val; + }, + + + // Triggers handlers that are view-related. Modifies args before passing to calendar. + trigger: function(name, thisObj) { // arguments beyond thisObj are passed along + var calendar = this.calendar; + + return calendar.trigger.apply( + calendar, + [name, thisObj || this].concat( + Array.prototype.slice.call(arguments, 2), // arguments beyond thisObj + [ this ] // always make the last argument a reference to the view. TODO: deprecate + ) + ); + }, + + + /* Dates + ------------------------------------------------------------------------------------------------------------------*/ + + + // Updates all internal dates to center around the given current date + setDate: function(date) { + this.setRange(this.computeRange(date)); + }, + + + // Updates all internal dates for displaying the given range. + // Expects all values to be normalized (like what computeRange does). + setRange: function(range) { + $.extend(this, range); + }, + + + // Given a single current date, produce information about what range to display. + // Subclasses can override. Must return all properties. + computeRange: function(date) { + var intervalDuration = moment.duration(this.opt('duration') || this.constructor.duration || { days: 1 }); + var intervalUnit = computeIntervalUnit(intervalDuration); + var intervalStart = date.clone().startOf(intervalUnit); + var intervalEnd = intervalStart.clone().add(intervalDuration); + var start, end; + + // normalize the range's time-ambiguity + if (computeIntervalAs('days', intervalDuration)) { // whole-days? + intervalStart.stripTime(); + intervalEnd.stripTime(); + } + else { // needs to have a time? + if (!intervalStart.hasTime()) { + intervalStart = this.calendar.rezoneDate(intervalStart); // convert to current timezone, with 00:00 + } + if (!intervalEnd.hasTime()) { + intervalEnd = this.calendar.rezoneDate(intervalEnd); // convert to current timezone, with 00:00 + } + } + + start = intervalStart.clone(); + start = this.skipHiddenDays(start); + end = intervalEnd.clone(); + end = this.skipHiddenDays(end, -1, true); // exclusively move backwards + + return { + intervalDuration: intervalDuration, + intervalUnit: intervalUnit, + intervalStart: intervalStart, + intervalEnd: intervalEnd, + start: start, + end: end + }; + }, + + + // Computes the new date when the user hits the prev button, given the current date + computePrevDate: function(date) { + return this.skipHiddenDays( + date.clone().startOf(this.intervalUnit).subtract(this.intervalDuration), -1 + ); + }, + + + // Computes the new date when the user hits the next button, given the current date + computeNextDate: function(date) { + return this.skipHiddenDays( + date.clone().startOf(this.intervalUnit).add(this.intervalDuration) + ); + }, + + + /* Title and Date Formatting + ------------------------------------------------------------------------------------------------------------------*/ + + + // Computes what the title at the top of the calendar should be for this view + computeTitle: function() { + return this.formatRange( + { start: this.intervalStart, end: this.intervalEnd }, + this.opt('titleFormat') || this.computeTitleFormat(), + this.opt('titleRangeSeparator') + ); + }, + + + // Generates the format string that should be used to generate the title for the current date range. + // Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`. + computeTitleFormat: function() { + if (this.intervalUnit == 'year') { + return 'YYYY'; + } + else if (this.intervalUnit == 'month') { + return this.opt('monthYearFormat'); // like "September 2014" + } + else if (this.intervalDuration.as('days') > 1) { + return 'll'; // multi-day range. shorter, like "Sep 9 - 10 2014" + } + else { + return 'LL'; // one day. longer, like "September 9 2014" + } + }, + + + // Utility for formatting a range. Accepts a range object, formatting string, and optional separator. + // Displays all-day ranges naturally, with an inclusive end. Takes the current isRTL into account. + formatRange: function(range, formatStr, separator) { + var end = range.end; + + if (!end.hasTime()) { // all-day? + end = end.clone().subtract(1); // convert to inclusive. last ms of previous day + } + + return formatRange(range.start, end, formatStr, separator, this.opt('isRTL')); + }, + + + /* Rendering + ------------------------------------------------------------------------------------------------------------------*/ + + + // Wraps the basic render() method with more View-specific logic. Called by the owner Calendar. + renderView: function() { + this.render(); + this.updateSize(); + this.initializeScroll(); + this.trigger('viewRender', this, this, this.el); + + // attach handlers to document. do it here to allow for destroy/rerender + $(document).on('mousedown', this.documentMousedownProxy); + }, + + + // Renders the view inside an already-defined `this.el` + render: function() { + // subclasses should implement + }, + + + // Wraps the basic destroy() method with more View-specific logic. Called by the owner Calendar. + destroyView: function() { + this.unselect(); + this.destroyViewEvents(); + this.destroy(); + this.trigger('viewDestroy', this, this, this.el); + + $(document).off('mousedown', this.documentMousedownProxy); + }, + + + // Clears the view's rendering + destroy: function() { + this.el.empty(); // removes inner contents but leaves the element intact + }, + + + // Initializes internal variables related to theming + initTheming: function() { + var tm = this.opt('theme') ? 'ui' : 'fc'; + + this.widgetHeaderClass = tm + '-widget-header'; + this.widgetContentClass = tm + '-widget-content'; + this.highlightStateClass = tm + '-state-highlight'; + }, + + + /* Dimensions + ------------------------------------------------------------------------------------------------------------------*/ + + + // Refreshes anything dependant upon sizing of the container element of the grid + updateSize: function(isResize) { + if (isResize) { + this.recordScroll(); + } + this.updateHeight(); + this.updateWidth(); + }, + + + // Refreshes the horizontal dimensions of the calendar + updateWidth: function() { + // subclasses should implement + }, + + + // Refreshes the vertical dimensions of the calendar + updateHeight: function() { + var calendar = this.calendar; // we poll the calendar for height information + + this.setHeight( + calendar.getSuggestedViewHeight(), + calendar.isHeightAuto() + ); + }, + + + // Updates the vertical dimensions of the calendar to the specified height. + // if `isAuto` is set to true, height becomes merely a suggestion and the view should use its "natural" height. + setHeight: function(height, isAuto) { + // subclasses should implement + }, + + + /* Scroller + ------------------------------------------------------------------------------------------------------------------*/ + + + // Given the total height of the view, return the number of pixels that should be used for the scroller. + // By default, uses this.scrollerEl, but can pass this in as well. + // Utility for subclasses. + computeScrollerHeight: function(totalHeight, scrollerEl) { + var both; + var otherHeight; // cumulative height of everything that is not the scrollerEl in the view (header+borders) + + scrollerEl = scrollerEl || this.scrollerEl; + both = this.el.add(scrollerEl); + + // fuckin IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked + both.css({ + position: 'relative', // cause a reflow, which will force fresh dimension recalculation + left: -1 // ensure reflow in case the el was already relative. negative is less likely to cause new scroll + }); + otherHeight = this.el.outerHeight() - scrollerEl.height(); // grab the dimensions + both.css({ position: '', left: '' }); // undo hack + + return totalHeight - otherHeight; + }, + + + // Sets the scroll value of the scroller to the initial pre-configured state prior to allowing the user to change it + initializeScroll: function() { + }, + + + // Called for remembering the current scroll value of the scroller. + // Should be called before there is a destructive operation (like removing DOM elements) that might inadvertently + // change the scroll of the container. + recordScroll: function() { + if (this.scrollerEl) { + this.scrollTop = this.scrollerEl.scrollTop(); + } + }, + + + // Set the scroll value of the scroller to the previously recorded value. + // Should be called after we know the view's dimensions have been restored following some type of destructive + // operation (like temporarily removing DOM elements). + restoreScroll: function() { + if (this.scrollTop !== null) { + this.scrollerEl.scrollTop(this.scrollTop); + } + }, + + + /* Event Elements / Segments + ------------------------------------------------------------------------------------------------------------------*/ + + + // Wraps the basic renderEvents() method with more View-specific logic + renderViewEvents: function(events) { + this.renderEvents(events); + + this.eventSegEach(function(seg) { + this.trigger('eventAfterRender', seg.event, seg.event, seg.el); + }); + this.trigger('eventAfterAllRender'); + }, + + + // Renders the events onto the view. + renderEvents: function() { + // subclasses should implement + }, + + + // Wraps the basic destroyEvents() method with more View-specific logic + destroyViewEvents: function() { + this.eventSegEach(function(seg) { + this.trigger('eventDestroy', seg.event, seg.event, seg.el); + }); + + this.destroyEvents(); + }, + + + // Removes event elements from the view. + destroyEvents: function() { + // subclasses should implement + }, + + + // Given an event and the default element used for rendering, returns the element that should actually be used. + // Basically runs events and elements through the eventRender hook. + resolveEventEl: function(event, el) { + var custom = this.trigger('eventRender', event, event, el); + + if (custom === false) { // means don't render at all + el = null; + } + else if (custom && custom !== true) { + el = $(custom); + } + + return el; + }, + + + // Hides all rendered event segments linked to the given event + showEvent: function(event) { + this.eventSegEach(function(seg) { + seg.el.css('visibility', ''); + }, event); + }, + + + // Shows all rendered event segments linked to the given event + hideEvent: function(event) { + this.eventSegEach(function(seg) { + seg.el.css('visibility', 'hidden'); + }, event); + }, + + + // Iterates through event segments. Goes through all by default. + // If the optional `event` argument is specified, only iterates through segments linked to that event. + // The `this` value of the callback function will be the view. + eventSegEach: function(func, event) { + var segs = this.getEventSegs(); + var i; + + for (i = 0; i < segs.length; i++) { + if (!event || segs[i].event._id === event._id) { + func.call(this, segs[i]); + } + } + }, + + + // Retrieves all the rendered segment objects for the view + getEventSegs: function() { + // subclasses must implement + return []; + }, + + + /* Event Drag-n-Drop + ------------------------------------------------------------------------------------------------------------------*/ + + + // Computes if the given event is allowed to be dragged by the user + isEventDraggable: function(event) { + var source = event.source || {}; + + return firstDefined( + event.startEditable, + source.startEditable, + this.opt('eventStartEditable'), + event.editable, + source.editable, + this.opt('editable') + ); + }, + + + // Must be called when an event in the view is dropped onto new location. + // `dropLocation` is an object that contains the new start/end/allDay values for the event. + reportEventDrop: function(event, dropLocation, el, ev) { + var calendar = this.calendar; + var mutateResult = calendar.mutateEvent(event, dropLocation); + var undoFunc = function() { + mutateResult.undo(); + calendar.reportEventChange(); + }; + + this.triggerEventDrop(event, mutateResult.dateDelta, undoFunc, el, ev); + calendar.reportEventChange(); // will rerender events + }, + + + // Triggers event-drop handlers that have subscribed via the API + triggerEventDrop: function(event, dateDelta, undoFunc, el, ev) { + this.trigger('eventDrop', el[0], event, dateDelta, undoFunc, ev, {}); // {} = jqui dummy + }, + + + /* External Element Drag-n-Drop + ------------------------------------------------------------------------------------------------------------------*/ + + + // Must be called when an external element, via jQuery UI, has been dropped onto the calendar. + // `meta` is the parsed data that has been embedded into the dragging event. + // `dropLocation` is an object that contains the new start/end/allDay values for the event. + reportExternalDrop: function(meta, dropLocation, el, ev, ui) { + var eventProps = meta.eventProps; + var eventInput; + var event; + + // Try to build an event object and render it. TODO: decouple the two + if (eventProps) { + eventInput = $.extend({}, eventProps, dropLocation); + event = this.calendar.renderEvent(eventInput, meta.stick)[0]; // renderEvent returns an array + } + + this.triggerExternalDrop(event, dropLocation, el, ev, ui); + }, + + + // Triggers external-drop handlers that have subscribed via the API + triggerExternalDrop: function(event, dropLocation, el, ev, ui) { + + // trigger 'drop' regardless of whether element represents an event + this.trigger('drop', el[0], dropLocation.start, ev, ui); + + if (event) { + this.trigger('eventReceive', null, event); // signal an external event landed + } + }, + + + /* Drag-n-Drop Rendering (for both events and external elements) + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of a event or external-element drag over the given drop zone. + // If an external-element, seg will be `null` + renderDrag: function(dropLocation, seg) { + // subclasses must implement + }, + + + // Unrenders a visual indication of an event or external-element being dragged. + destroyDrag: function() { + // subclasses must implement + }, + + + /* Event Resizing + ------------------------------------------------------------------------------------------------------------------*/ + + + // Computes if the given event is allowed to be resize by the user + isEventResizable: function(event) { + var source = event.source || {}; + + return firstDefined( + event.durationEditable, + source.durationEditable, + this.opt('eventDurationEditable'), + event.editable, + source.editable, + this.opt('editable') + ); + }, + + + // Must be called when an event in the view has been resized to a new length + reportEventResize: function(event, newEnd, el, ev) { + var calendar = this.calendar; + var mutateResult = calendar.mutateEvent(event, { end: newEnd }); + var undoFunc = function() { + mutateResult.undo(); + calendar.reportEventChange(); + }; + + this.triggerEventResize(event, mutateResult.durationDelta, undoFunc, el, ev); + calendar.reportEventChange(); // will rerender events + }, + + + // Triggers event-resize handlers that have subscribed via the API + triggerEventResize: function(event, durationDelta, undoFunc, el, ev) { + this.trigger('eventResize', el[0], event, durationDelta, undoFunc, ev, {}); // {} = jqui dummy + }, + + + /* Selection + ------------------------------------------------------------------------------------------------------------------*/ + + + // Selects a date range on the view. `start` and `end` are both Moments. + // `ev` is the native mouse event that begin the interaction. + select: function(range, ev) { + this.unselect(ev); + this.renderSelection(range); + this.reportSelection(range, ev); + }, + + + // Renders a visual indication of the selection + renderSelection: function(range) { + // subclasses should implement + }, + + + // Called when a new selection is made. Updates internal state and triggers handlers. + reportSelection: function(range, ev) { + this.isSelected = true; + this.trigger('select', null, range.start, range.end, ev); + }, + + + // Undoes a selection. updates in the internal state and triggers handlers. + // `ev` is the native mouse event that began the interaction. + unselect: function(ev) { + if (this.isSelected) { + this.isSelected = false; + this.destroySelection(); + this.trigger('unselect', null, ev); + } + }, + + + // Unrenders a visual indication of selection + destroySelection: function() { + // subclasses should implement + }, + + + // Handler for unselecting when the user clicks something and the 'unselectAuto' setting is on + documentMousedown: function(ev) { + var ignore; + + // is there a selection, and has the user made a proper left click? + if (this.isSelected && this.opt('unselectAuto') && isPrimaryMouseButton(ev)) { + + // only unselect if the clicked element is not identical to or inside of an 'unselectCancel' element + ignore = this.opt('unselectCancel'); + if (!ignore || !$(ev.target).closest(ignore).length) { + this.unselect(ev); + } + } + }, + + + /* Date Utils + ------------------------------------------------------------------------------------------------------------------*/ + + + // Initializes internal variables related to calculating hidden days-of-week + initHiddenDays: function() { + var hiddenDays = this.opt('hiddenDays') || []; // array of day-of-week indices that are hidden + var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool) + var dayCnt = 0; + var i; + + if (this.opt('weekends') === false) { + hiddenDays.push(0, 6); // 0=sunday, 6=saturday + } + + for (i = 0; i < 7; i++) { + if ( + !(isHiddenDayHash[i] = $.inArray(i, hiddenDays) !== -1) + ) { + dayCnt++; + } + } + + if (!dayCnt) { + throw 'invalid hiddenDays'; // all days were hidden? bad. + } + + this.isHiddenDayHash = isHiddenDayHash; + }, + + + // Is the current day hidden? + // `day` is a day-of-week index (0-6), or a Moment + isHiddenDay: function(day) { + if (moment.isMoment(day)) { + day = day.day(); + } + return this.isHiddenDayHash[day]; + }, + + + // Incrementing the current day until it is no longer a hidden day, returning a copy. + // If the initial value of `date` is not a hidden day, don't do anything. + // Pass `isExclusive` as `true` if you are dealing with an end date. + // `inc` defaults to `1` (increment one day forward each time) + skipHiddenDays: function(date, inc, isExclusive) { + var out = date.clone(); + inc = inc || 1; + while ( + this.isHiddenDayHash[(out.day() + (isExclusive ? inc : 0) + 7) % 7] + ) { + out.add(inc, 'days'); + } + return out; + }, + + + // Returns the date range of the full days the given range visually appears to occupy. + // Returns a new range object. + computeDayRange: function(range) { + var startDay = range.start.clone().stripTime(); // the beginning of the day the range starts + var end = range.end; + var endDay = null; + var endTimeMS; + + if (end) { + endDay = end.clone().stripTime(); // the beginning of the day the range exclusively ends + endTimeMS = +end.time(); // # of milliseconds into `endDay` + + // If the end time is actually inclusively part of the next day and is equal to or + // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`. + // Otherwise, leaving it as inclusive will cause it to exclude `endDay`. + if (endTimeMS && endTimeMS >= this.nextDayThreshold) { + endDay.add(1, 'days'); + } + } + + // If no end was specified, or if it is within `startDay` but not past nextDayThreshold, + // assign the default duration of one day. + if (!end || endDay <= startDay) { + endDay = startDay.clone().add(1, 'days'); + } + + return { start: startDay, end: endDay }; + }, + + + // Does the given event visually appear to occupy more than one day? + isMultiDayEvent: function(event) { + var range = this.computeDayRange(event); // event is range-ish + + return range.end.diff(range.start, 'days') > 1; + } + +}); + + function Calendar(element, instanceOptions) { + var t = this; + + + + // Build options object + // ----------------------------------------------------------------------------------- + // Precedence (lowest to highest): defaults, rtlDefaults, langOptions, instanceOptions + + instanceOptions = instanceOptions || {}; + + var options = mergeOptions({}, defaults, instanceOptions); + var langOptions; + + // determine language options + if (options.lang in langOptionHash) { + langOptions = langOptionHash[options.lang]; + } + else { + langOptions = langOptionHash[defaults.lang]; + } + + if (langOptions) { // if language options exist, rebuild... + options = mergeOptions({}, defaults, langOptions, instanceOptions); + } + + if (options.isRTL) { // is isRTL, rebuild... + options = mergeOptions({}, defaults, rtlDefaults, langOptions || {}, instanceOptions); + } + + + + // Exports + // ----------------------------------------------------------------------------------- + + t.options = options; + t.render = render; + t.destroy = destroy; + t.refetchEvents = refetchEvents; + t.reportEvents = reportEvents; + t.reportEventChange = reportEventChange; + t.rerenderEvents = renderEvents; // `renderEvents` serves as a rerender. an API method + t.changeView = changeView; + t.select = select; + t.unselect = unselect; + t.prev = prev; + t.next = next; + t.prevYear = prevYear; + t.nextYear = nextYear; + t.today = today; + t.gotoDate = gotoDate; + t.incrementDate = incrementDate; + t.zoomTo = zoomTo; + t.getDate = getDate; + t.getCalendar = getCalendar; + t.getView = getView; + t.option = option; + t.trigger = trigger; + t.isValidViewType = isValidViewType; + t.getViewButtonText = getViewButtonText; + + + + // Language-data Internals + // ----------------------------------------------------------------------------------- + // Apply overrides to the current language's data + + + var localeData = createObject( // make a cheap copy + getMomentLocaleData(options.lang) // will fall back to en + ); + + if (options.monthNames) { + localeData._months = options.monthNames; + } + if (options.monthNamesShort) { + localeData._monthsShort = options.monthNamesShort; + } + if (options.dayNames) { + localeData._weekdays = options.dayNames; + } + if (options.dayNamesShort) { + localeData._weekdaysShort = options.dayNamesShort; + } + if (options.firstDay != null) { + var _week = createObject(localeData._week); // _week: { dow: # } + _week.dow = options.firstDay; + localeData._week = _week; + } + + + + // Calendar-specific Date Utilities + // ----------------------------------------------------------------------------------- + + + t.defaultAllDayEventDuration = moment.duration(options.defaultAllDayEventDuration); + t.defaultTimedEventDuration = moment.duration(options.defaultTimedEventDuration); + + + // Builds a moment using the settings of the current calendar: timezone and language. + // Accepts anything the vanilla moment() constructor accepts. + t.moment = function() { + var mom; + + if (options.timezone === 'local') { + mom = fc.moment.apply(null, arguments); + + // Force the moment to be local, because fc.moment doesn't guarantee it. + if (mom.hasTime()) { // don't give ambiguously-timed moments a local zone + mom.local(); + } + } + else if (options.timezone === 'UTC') { + mom = fc.moment.utc.apply(null, arguments); // process as UTC + } + else { + mom = fc.moment.parseZone.apply(null, arguments); // let the input decide the zone + } + + if ('_locale' in mom) { // moment 2.8 and above + mom._locale = localeData; + } + else { // pre-moment-2.8 + mom._lang = localeData; + } + + return mom; + }; + + + // Returns a boolean about whether or not the calendar knows how to calculate + // the timezone offset of arbitrary dates in the current timezone. + t.getIsAmbigTimezone = function() { + return options.timezone !== 'local' && options.timezone !== 'UTC'; + }; + + + // Returns a copy of the given date in the current timezone of it is ambiguously zoned. + // This will also give the date an unambiguous time. + t.rezoneDate = function(date) { + return t.moment(date.toArray()); + }; + + + // Returns a moment for the current date, as defined by the client's computer, + // or overridden by the `now` option. + t.getNow = function() { + var now = options.now; + if (typeof now === 'function') { + now = now(); + } + return t.moment(now); + }; + + + // Calculates the week number for a moment according to the calendar's + // `weekNumberCalculation` setting. + t.calculateWeekNumber = function(mom) { + var calc = options.weekNumberCalculation; + + if (typeof calc === 'function') { + return calc(mom); + } + else if (calc === 'local') { + return mom.week(); + } + else if (calc.toUpperCase() === 'ISO') { + return mom.isoWeek(); + } + }; + + + // Get an event's normalized end date. If not present, calculate it from the defaults. + t.getEventEnd = function(event) { + if (event.end) { + return event.end.clone(); + } + else { + return t.getDefaultEventEnd(event.allDay, event.start); + } + }; + + + // Given an event's allDay status and start date, return swhat its fallback end date should be. + t.getDefaultEventEnd = function(allDay, start) { // TODO: rename to computeDefaultEventEnd + var end = start.clone(); + + if (allDay) { + end.stripTime().add(t.defaultAllDayEventDuration); + } + else { + end.add(t.defaultTimedEventDuration); + } + + if (t.getIsAmbigTimezone()) { + end.stripZone(); // we don't know what the tzo should be + } + + return end; + }; + + + // Produces a human-readable string for the given duration. + // Side-effect: changes the locale of the given duration. + function humanizeDuration(duration) { + return (duration.locale || duration.lang).call(duration, options.lang) // works moment-pre-2.8 + .humanize(); + } + + + + // Imports + // ----------------------------------------------------------------------------------- + + + EventManager.call(t, options); + var isFetchNeeded = t.isFetchNeeded; + var fetchEvents = t.fetchEvents; + + + + // Locals + // ----------------------------------------------------------------------------------- + + + var _element = element[0]; + var header; + var headerElement; + var content; + var tm; // for making theme classes + var viewSpecCache = {}; + var currentView; + var suggestedViewHeight; + var windowResizeProxy; // wraps the windowResize function + var ignoreWindowResize = 0; + var date; + var events = []; + + + + // Main Rendering + // ----------------------------------------------------------------------------------- + + + if (options.defaultDate != null) { + date = t.moment(options.defaultDate); + } + else { + date = t.getNow(); + } + + + function render(inc) { + if (!content) { + initialRender(); + } + else if (elementVisible()) { + // mainly for the public API + calcSize(); + renderView(inc); + } + } + + + function initialRender() { + tm = options.theme ? 'ui' : 'fc'; + element.addClass('fc'); + + if (options.isRTL) { + element.addClass('fc-rtl'); + } + else { + element.addClass('fc-ltr'); + } + + if (options.theme) { + element.addClass('ui-widget'); + } + else { + element.addClass('fc-unthemed'); + } + + content = $("<div class='fc-view-container'/>").prependTo(element); + + header = new Header(t, options); + headerElement = header.render(); + if (headerElement) { + element.prepend(headerElement); + } + + changeView(options.defaultView); + + if (options.handleWindowResize) { + windowResizeProxy = debounce(windowResize, options.windowResizeDelay); // prevents rapid calls + $(window).resize(windowResizeProxy); + } + } + + + function destroy() { + + if (currentView) { + currentView.destroyView(); + } + + header.destroy(); + content.remove(); + element.removeClass('fc fc-ltr fc-rtl fc-unthemed ui-widget'); + + $(window).unbind('resize', windowResizeProxy); + } + + + function elementVisible() { + return element.is(':visible'); + } + + + + // View Rendering + // ----------------------------------------------------------------------------------- + + + function changeView(viewType) { + renderView(0, viewType); + } + + + // Renders a view because of a date change, view-type change, or for the first time + function renderView(delta, viewType) { + ignoreWindowResize++; + + // if viewType is changing, destroy the old view + if (currentView && viewType && currentView.type !== viewType) { + header.deactivateButton(currentView.type); + freezeContentHeight(); // prevent a scroll jump when view element is removed + if (currentView.start) { // rendered before? + currentView.destroyView(); + } + currentView.el.remove(); + currentView = null; + } + + // if viewType changed, or the view was never created, create a fresh view + if (!currentView && viewType) { + currentView = instantiateView(viewType); + currentView.el = $("<div class='fc-view fc-" + viewType + "-view' />").appendTo(content); + header.activateButton(viewType); + } + + if (currentView) { + + // let the view determine what the delta means + if (delta < 0) { + date = currentView.computePrevDate(date); + } + else if (delta > 0) { + date = currentView.computeNextDate(date); + } + + // render or rerender the view + if ( + !currentView.start || // never rendered before + delta || // explicit date window change + !date.isWithin(currentView.intervalStart, currentView.intervalEnd) // implicit date window change + ) { + if (elementVisible()) { + + freezeContentHeight(); + if (currentView.start) { // rendered before? + currentView.destroyView(); + } + currentView.setDate(date); + currentView.renderView(); + unfreezeContentHeight(); + + // need to do this after View::render, so dates are calculated + updateTitle(); + updateTodayButton(); + + getAndRenderEvents(); + } + } + } + + unfreezeContentHeight(); // undo any lone freezeContentHeight calls + ignoreWindowResize--; + } + + + + // View Instantiation + // ----------------------------------------------------------------------------------- + + + // Given a view name for a custom view or a standard view, creates a ready-to-go View object + function instantiateView(viewType) { + var spec = getViewSpec(viewType); + + return new spec['class'](t, spec.options, viewType); + } + + + // Gets information about how to create a view + function getViewSpec(requestedViewType) { + var allDefaultButtonText = options.defaultButtonText || {}; + var allButtonText = options.buttonText || {}; + var hash = options.views || {}; // the `views` option object + var viewType = requestedViewType; + var viewOptionsChain = []; + var viewOptions; + var viewClass; + var duration, unit, unitIsSingle = false; + var buttonText; + + if (viewSpecCache[requestedViewType]) { + return viewSpecCache[requestedViewType]; + } + + function processSpecInput(input) { + if (typeof input === 'function') { + viewClass = input; + } + else if (typeof input === 'object') { + $.extend(viewOptions, input); + } + } + + // iterate up a view's spec ancestor chain util we find a class to instantiate + while (viewType && !viewClass) { + viewOptions = {}; // only for this specific view in the ancestry + processSpecInput(fcViews[viewType]); // $.fullCalendar.views, lower precedence + processSpecInput(hash[viewType]); // options at initialization, higher precedence + viewOptionsChain.unshift(viewOptions); // record older ancestors first + viewType = viewOptions.type; + } + + viewOptionsChain.unshift({}); // jQuery's extend needs at least one arg + viewOptions = $.extend.apply($, viewOptionsChain); // combine all, newer ancestors overwritting old + + if (viewClass) { + + duration = viewOptions.duration || viewClass.duration; + if (duration) { + duration = moment.duration(duration); + unit = computeIntervalUnit(duration); + unitIsSingle = computeIntervalAs(unit, duration) === 1; + } + + // options that are specified per the view's duration, like "week" or "day" + if (unitIsSingle && hash[unit]) { + viewOptions = $.extend({}, hash[unit], viewOptions); // lowest priority + } + + // compute the final text for the button representing this view + buttonText = + allButtonText[requestedViewType] || // init options, like "agendaWeek" + (unitIsSingle ? allButtonText[unit] : null) || // init options, like "week" + allDefaultButtonText[requestedViewType] || // lang data, like "agendaWeek" + (unitIsSingle ? allDefaultButtonText[unit] : null) || // lang data, like "week" + viewOptions.buttonText || + viewClass.buttonText || + (duration ? humanizeDuration(duration) : null) || + requestedViewType; + + return (viewSpecCache[requestedViewType] = { + 'class': viewClass, + options: viewOptions, + buttonText: buttonText + }); + } + } + + + // Returns a boolean about whether the view is okay to instantiate at some point + function isValidViewType(viewType) { + return Boolean(getViewSpec(viewType)); + } + + + // Gets the text that should be displayed on a view's button in the header + function getViewButtonText(viewType) { + var spec = getViewSpec(viewType); + + if (spec) { + return spec.buttonText; + } + } + + + + // Resizing + // ----------------------------------------------------------------------------------- + + + t.getSuggestedViewHeight = function() { + if (suggestedViewHeight === undefined) { + calcSize(); + } + return suggestedViewHeight; + }; + + + t.isHeightAuto = function() { + return options.contentHeight === 'auto' || options.height === 'auto'; + }; + + + function updateSize(shouldRecalc) { + if (elementVisible()) { + + if (shouldRecalc) { + _calcSize(); + } + + ignoreWindowResize++; + currentView.updateSize(true); // isResize=true. will poll getSuggestedViewHeight() and isHeightAuto() + ignoreWindowResize--; + + return true; // signal success + } + } + + + function calcSize() { + if (elementVisible()) { + _calcSize(); + } + } + + + function _calcSize() { // assumes elementVisible + if (typeof options.contentHeight === 'number') { // exists and not 'auto' + suggestedViewHeight = options.contentHeight; + } + else if (typeof options.height === 'number') { // exists and not 'auto' + suggestedViewHeight = options.height - (headerElement ? headerElement.outerHeight(true) : 0); + } + else { + suggestedViewHeight = Math.round(content.width() / Math.max(options.aspectRatio, .5)); + } + } + + + function windowResize(ev) { + if ( + !ignoreWindowResize && + ev.target === window && // so we don't process jqui "resize" events that have bubbled up + currentView.start // view has already been rendered + ) { + if (updateSize(true)) { + currentView.trigger('windowResize', _element); + } + } + } + + + + /* Event Fetching/Rendering + -----------------------------------------------------------------------------*/ + // TODO: going forward, most of this stuff should be directly handled by the view + + + function refetchEvents() { // can be called as an API method + destroyEvents(); // so that events are cleared before user starts waiting for AJAX + fetchAndRenderEvents(); + } + + + function renderEvents() { // destroys old events if previously rendered + if (elementVisible()) { + freezeContentHeight(); + currentView.destroyViewEvents(); // no performance cost if never rendered + currentView.renderViewEvents(events); + unfreezeContentHeight(); + } + } + + + function destroyEvents() { + freezeContentHeight(); + currentView.destroyViewEvents(); + unfreezeContentHeight(); + } + + + function getAndRenderEvents() { + if (!options.lazyFetching || isFetchNeeded(currentView.start, currentView.end)) { + fetchAndRenderEvents(); + } + else { + renderEvents(); + } + } + + + function fetchAndRenderEvents() { + fetchEvents(currentView.start, currentView.end); + // ... will call reportEvents + // ... which will call renderEvents + } + + + // called when event data arrives + function reportEvents(_events) { + events = _events; + renderEvents(); + } + + + // called when a single event's data has been changed + function reportEventChange() { + renderEvents(); + } + + + + /* Header Updating + -----------------------------------------------------------------------------*/ + + + function updateTitle() { + header.updateTitle(currentView.computeTitle()); + } + + + function updateTodayButton() { + var now = t.getNow(); + if (now.isWithin(currentView.intervalStart, currentView.intervalEnd)) { + header.disableButton('today'); + } + else { + header.enableButton('today'); + } + } + + + + /* Selection + -----------------------------------------------------------------------------*/ + + + function select(start, end) { + + start = t.moment(start); + if (end) { + end = t.moment(end); + } + else if (start.hasTime()) { + end = start.clone().add(t.defaultTimedEventDuration); + } + else { + end = start.clone().add(t.defaultAllDayEventDuration); + } + + currentView.select({ start: start, end: end }); // accepts a range + } + + + function unselect() { // safe to be called before renderView + if (currentView) { + currentView.unselect(); + } + } + + + + /* Date + -----------------------------------------------------------------------------*/ + + + function prev() { + renderView(-1); + } + + + function next() { + renderView(1); + } + + + function prevYear() { + date.add(-1, 'years'); + renderView(); + } + + + function nextYear() { + date.add(1, 'years'); + renderView(); + } + + + function today() { + date = t.getNow(); + renderView(); + } + + + function gotoDate(dateInput) { + date = t.moment(dateInput); + renderView(); + } + + + function incrementDate(delta) { + date.add(moment.duration(delta)); + renderView(); + } + + + // Forces navigation to a view for the given date. + // `viewType` can be a specific view name or a generic one like "week" or "day". + function zoomTo(newDate, viewType) { + var viewStr; + var match; + + if (!viewType || !isValidViewType(viewType)) { // a general view name, or "auto" + viewType = viewType || 'day'; + viewStr = header.getViewsWithButtons().join(' '); // space-separated string of all the views in the header + + // try to match a general view name, like "week", against a specific one, like "agendaWeek" + match = viewStr.match(new RegExp('\\w+' + capitaliseFirstLetter(viewType))); + + // fall back to the day view being used in the header + if (!match) { + match = viewStr.match(/\w+Day/); + } + + viewType = match ? match[0] : 'agendaDay'; // fall back to agendaDay + } + + date = newDate; + changeView(viewType); + } + + + function getDate() { + return date.clone(); + } + + + + /* Height "Freezing" + -----------------------------------------------------------------------------*/ + + + function freezeContentHeight() { + content.css({ + width: '100%', + height: content.height(), + overflow: 'hidden' + }); + } + + + function unfreezeContentHeight() { + content.css({ + width: '', + height: '', + overflow: '' + }); + } + + + + /* Misc + -----------------------------------------------------------------------------*/ + + + function getCalendar() { + return t; + } + + + function getView() { + return currentView; + } + + + function option(name, value) { + if (value === undefined) { + return options[name]; + } + if (name == 'height' || name == 'contentHeight' || name == 'aspectRatio') { + options[name] = value; + updateSize(true); // true = allow recalculation of height + } + } + + + function trigger(name, thisObj) { + if (options[name]) { + return options[name].apply( + thisObj || _element, + Array.prototype.slice.call(arguments, 2) + ); + } + } + +} + + /* Top toolbar area with buttons and title +----------------------------------------------------------------------------------------------------------------------*/ +// TODO: rename all header-related things to "toolbar" + +function Header(calendar, options) { + var t = this; + + // exports + t.render = render; + t.destroy = destroy; + t.updateTitle = updateTitle; + t.activateButton = activateButton; + t.deactivateButton = deactivateButton; + t.disableButton = disableButton; + t.enableButton = enableButton; + t.getViewsWithButtons = getViewsWithButtons; + + // locals + var el = $(); + var viewsWithButtons = []; + var tm; + + + function render() { + var sections = options.header; + + tm = options.theme ? 'ui' : 'fc'; + + if (sections) { + el = $("<div class='fc-toolbar'/>") + .append(renderSection('left')) + .append(renderSection('right')) + .append(renderSection('center')) + .append('<div class="fc-clear"/>'); + + return el; + } + } + + + function destroy() { + el.remove(); + } + + + function renderSection(position) { + var sectionEl = $('<div class="fc-' + position + '"/>'); + var buttonStr = options.header[position]; + + if (buttonStr) { + $.each(buttonStr.split(' '), function(i) { + var groupChildren = $(); + var isOnlyButtons = true; + var groupEl; + + $.each(this.split(','), function(j, buttonName) { + var buttonClick; + var themeIcon; + var normalIcon; + var defaultText; + var viewText; // highest priority + var customText; + var innerHtml; + var classes; + var button; + + if (buttonName == 'title') { + groupChildren = groupChildren.add($('<h2>&nbsp;</h2>')); // we always want it to take up height + isOnlyButtons = false; + } + else { + if (calendar[buttonName]) { // a calendar method + buttonClick = function() { + calendar[buttonName](); + }; + } + else if (calendar.isValidViewType(buttonName)) { // a view type + buttonClick = function() { + calendar.changeView(buttonName); + }; + viewsWithButtons.push(buttonName); + viewText = calendar.getViewButtonText(buttonName); + } + if (buttonClick) { + + // smartProperty allows different text per view button (ex: "Agenda Week" vs "Basic Week") + themeIcon = smartProperty(options.themeButtonIcons, buttonName); + normalIcon = smartProperty(options.buttonIcons, buttonName); + defaultText = smartProperty(options.defaultButtonText, buttonName); // from languages + customText = smartProperty(options.buttonText, buttonName); + + if (viewText || customText) { + innerHtml = htmlEscape(viewText || customText); + } + else if (themeIcon && options.theme) { + innerHtml = "<span class='ui-icon ui-icon-" + themeIcon + "'></span>"; + } + else if (normalIcon && !options.theme) { + innerHtml = "<span class='fc-icon fc-icon-" + normalIcon + "'></span>"; + } + else { + innerHtml = htmlEscape(defaultText || buttonName); + } + + classes = [ + 'fc-' + buttonName + '-button', + tm + '-button', + tm + '-state-default' + ]; + + button = $( // type="button" so that it doesn't submit a form + '<button type="button" class="' + classes.join(' ') + '">' + + innerHtml + + '</button>' + ) + .click(function() { + // don't process clicks for disabled buttons + if (!button.hasClass(tm + '-state-disabled')) { + + buttonClick(); + + // after the click action, if the button becomes the "active" tab, or disabled, + // it should never have a hover class, so remove it now. + if ( + button.hasClass(tm + '-state-active') || + button.hasClass(tm + '-state-disabled') + ) { + button.removeClass(tm + '-state-hover'); + } + } + }) + .mousedown(function() { + // the *down* effect (mouse pressed in). + // only on buttons that are not the "active" tab, or disabled + button + .not('.' + tm + '-state-active') + .not('.' + tm + '-state-disabled') + .addClass(tm + '-state-down'); + }) + .mouseup(function() { + // undo the *down* effect + button.removeClass(tm + '-state-down'); + }) + .hover( + function() { + // the *hover* effect. + // only on buttons that are not the "active" tab, or disabled + button + .not('.' + tm + '-state-active') + .not('.' + tm + '-state-disabled') + .addClass(tm + '-state-hover'); + }, + function() { + // undo the *hover* effect + button + .removeClass(tm + '-state-hover') + .removeClass(tm + '-state-down'); // if mouseleave happens before mouseup + } + ); + + groupChildren = groupChildren.add(button); + } + } + }); + + if (isOnlyButtons) { + groupChildren + .first().addClass(tm + '-corner-left').end() + .last().addClass(tm + '-corner-right').end(); + } + + if (groupChildren.length > 1) { + groupEl = $('<div/>'); + if (isOnlyButtons) { + groupEl.addClass('fc-button-group'); + } + groupEl.append(groupChildren); + sectionEl.append(groupEl); + } + else { + sectionEl.append(groupChildren); // 1 or 0 children + } + }); + } + + return sectionEl; + } + + + function updateTitle(text) { + el.find('h2').text(text); + } + + + function activateButton(buttonName) { + el.find('.fc-' + buttonName + '-button') + .addClass(tm + '-state-active'); + } + + + function deactivateButton(buttonName) { + el.find('.fc-' + buttonName + '-button') + .removeClass(tm + '-state-active'); + } + + + function disableButton(buttonName) { + el.find('.fc-' + buttonName + '-button') + .attr('disabled', 'disabled') + .addClass(tm + '-state-disabled'); + } + + + function enableButton(buttonName) { + el.find('.fc-' + buttonName + '-button') + .removeAttr('disabled') + .removeClass(tm + '-state-disabled'); + } + + + function getViewsWithButtons() { + return viewsWithButtons; + } + +} + + fc.sourceNormalizers = []; +fc.sourceFetchers = []; + +var ajaxDefaults = { + dataType: 'json', + cache: false +}; + +var eventGUID = 1; + + +function EventManager(options) { // assumed to be a calendar + var t = this; + + + // exports + t.isFetchNeeded = isFetchNeeded; + t.fetchEvents = fetchEvents; + t.addEventSource = addEventSource; + t.removeEventSource = removeEventSource; + t.updateEvent = updateEvent; + t.renderEvent = renderEvent; + t.removeEvents = removeEvents; + t.clientEvents = clientEvents; + t.mutateEvent = mutateEvent; + t.normalizeEventDateProps = normalizeEventDateProps; + t.ensureVisibleEventRange = ensureVisibleEventRange; + + + // imports + var trigger = t.trigger; + var getView = t.getView; + var reportEvents = t.reportEvents; + + + // locals + var stickySource = { events: [] }; + var sources = [ stickySource ]; + var rangeStart, rangeEnd; + var currentFetchID = 0; + var pendingSourceCnt = 0; + var loadingLevel = 0; + var cache = []; // holds events that have already been expanded + + + $.each( + (options.events ? [ options.events ] : []).concat(options.eventSources || []), + function(i, sourceInput) { + var source = buildEventSource(sourceInput); + if (source) { + sources.push(source); + } + } + ); + + + + /* Fetching + -----------------------------------------------------------------------------*/ + + + function isFetchNeeded(start, end) { + return !rangeStart || // nothing has been fetched yet? + // or, a part of the new range is outside of the old range? (after normalizing) + start.clone().stripZone() < rangeStart.clone().stripZone() || + end.clone().stripZone() > rangeEnd.clone().stripZone(); + } + + + function fetchEvents(start, end) { + rangeStart = start; + rangeEnd = end; + cache = []; + var fetchID = ++currentFetchID; + var len = sources.length; + pendingSourceCnt = len; + for (var i=0; i<len; i++) { + fetchEventSource(sources[i], fetchID); + } + } + + + function fetchEventSource(source, fetchID) { + _fetchEventSource(source, function(eventInputs) { + var isArraySource = $.isArray(source.events); + var i, eventInput; + var abstractEvent; + + if (fetchID == currentFetchID) { + + if (eventInputs) { + for (i = 0; i < eventInputs.length; i++) { + eventInput = eventInputs[i]; + + if (isArraySource) { // array sources have already been convert to Event Objects + abstractEvent = eventInput; + } + else { + abstractEvent = buildEventFromInput(eventInput, source); + } + + if (abstractEvent) { // not false (an invalid event) + cache.push.apply( + cache, + expandEvent(abstractEvent) // add individual expanded events to the cache + ); + } + } + } + + pendingSourceCnt--; + if (!pendingSourceCnt) { + reportEvents(cache); + } + } + }); + } + + + function _fetchEventSource(source, callback) { + var i; + var fetchers = fc.sourceFetchers; + var res; + + for (i=0; i<fetchers.length; i++) { + res = fetchers[i].call( + t, // this, the Calendar object + source, + rangeStart.clone(), + rangeEnd.clone(), + options.timezone, + callback + ); + + if (res === true) { + // the fetcher is in charge. made its own async request + return; + } + else if (typeof res == 'object') { + // the fetcher returned a new source. process it + _fetchEventSource(res, callback); + return; + } + } + + var events = source.events; + if (events) { + if ($.isFunction(events)) { + pushLoading(); + events.call( + t, // this, the Calendar object + rangeStart.clone(), + rangeEnd.clone(), + options.timezone, + function(events) { + callback(events); + popLoading(); + } + ); + } + else if ($.isArray(events)) { + callback(events); + } + else { + callback(); + } + }else{ + var url = source.url; + if (url) { + var success = source.success; + var error = source.error; + var complete = source.complete; + + // retrieve any outbound GET/POST $.ajax data from the options + var customData; + if ($.isFunction(source.data)) { + // supplied as a function that returns a key/value object + customData = source.data(); + } + else { + // supplied as a straight key/value object + customData = source.data; + } + + // use a copy of the custom data so we can modify the parameters + // and not affect the passed-in object. + var data = $.extend({}, customData || {}); + + var startParam = firstDefined(source.startParam, options.startParam); + var endParam = firstDefined(source.endParam, options.endParam); + var timezoneParam = firstDefined(source.timezoneParam, options.timezoneParam); + + if (startParam) { + data[startParam] = rangeStart.format(); + } + if (endParam) { + data[endParam] = rangeEnd.format(); + } + if (options.timezone && options.timezone != 'local') { + data[timezoneParam] = options.timezone; + } + + pushLoading(); + $.ajax($.extend({}, ajaxDefaults, source, { + data: data, + success: function(events) { + events = events || []; + var res = applyAll(success, this, arguments); + if ($.isArray(res)) { + events = res; + } + callback(events); + }, + error: function() { + applyAll(error, this, arguments); + callback(); + }, + complete: function() { + applyAll(complete, this, arguments); + popLoading(); + } + })); + }else{ + callback(); + } + } + } + + + + /* Sources + -----------------------------------------------------------------------------*/ + + + function addEventSource(sourceInput) { + var source = buildEventSource(sourceInput); + if (source) { + sources.push(source); + pendingSourceCnt++; + fetchEventSource(source, currentFetchID); // will eventually call reportEvents + } + } + + + function buildEventSource(sourceInput) { // will return undefined if invalid source + var normalizers = fc.sourceNormalizers; + var source; + var i; + + if ($.isFunction(sourceInput) || $.isArray(sourceInput)) { + source = { events: sourceInput }; + } + else if (typeof sourceInput === 'string') { + source = { url: sourceInput }; + } + else if (typeof sourceInput === 'object') { + source = $.extend({}, sourceInput); // shallow copy + } + + if (source) { + + // TODO: repeat code, same code for event classNames + if (source.className) { + if (typeof source.className === 'string') { + source.className = source.className.split(/\s+/); + } + // otherwise, assumed to be an array + } + else { + source.className = []; + } + + // for array sources, we convert to standard Event Objects up front + if ($.isArray(source.events)) { + source.origArray = source.events; // for removeEventSource + source.events = $.map(source.events, function(eventInput) { + return buildEventFromInput(eventInput, source); + }); + } + + for (i=0; i<normalizers.length; i++) { + normalizers[i].call(t, source); + } + + return source; + } + } + + + function removeEventSource(source) { + sources = $.grep(sources, function(src) { + return !isSourcesEqual(src, source); + }); + // remove all client events from that source + cache = $.grep(cache, function(e) { + return !isSourcesEqual(e.source, source); + }); + reportEvents(cache); + } + + + function isSourcesEqual(source1, source2) { + return source1 && source2 && getSourcePrimitive(source1) == getSourcePrimitive(source2); + } + + + function getSourcePrimitive(source) { + return ( + (typeof source === 'object') ? // a normalized event source? + (source.origArray || source.googleCalendarId || source.url || source.events) : // get the primitive + null + ) || + source; // the given argument *is* the primitive + } + + + + /* Manipulation + -----------------------------------------------------------------------------*/ + + + // Only ever called from the externally-facing API + function updateEvent(event) { + + // massage start/end values, even if date string values + event.start = t.moment(event.start); + if (event.end) { + event.end = t.moment(event.end); + } + else { + event.end = null; + } + + mutateEvent(event, getMiscEventProps(event)); // will handle start/end/allDay normalization + reportEvents(cache); // reports event modifications (so we can redraw) + } + + + // Returns a hash of misc event properties that should be copied over to related events. + function getMiscEventProps(event) { + var props = {}; + + $.each(event, function(name, val) { + if (isMiscEventPropName(name)) { + if (val !== undefined && isAtomic(val)) { // a defined non-object + props[name] = val; + } + } + }); + + return props; + } + + // non-date-related, non-id-related, non-secret + function isMiscEventPropName(name) { + return !/^_|^(id|allDay|start|end)$/.test(name); + } + + + // returns the expanded events that were created + function renderEvent(eventInput, stick) { + var abstractEvent = buildEventFromInput(eventInput); + var events; + var i, event; + + if (abstractEvent) { // not false (a valid input) + events = expandEvent(abstractEvent); + + for (i = 0; i < events.length; i++) { + event = events[i]; + + if (!event.source) { + if (stick) { + stickySource.events.push(event); + event.source = stickySource; + } + cache.push(event); + } + } + + reportEvents(cache); + + return events; + } + + return []; + } + + + function removeEvents(filter) { + var eventID; + var i; + + if (filter == null) { // null or undefined. remove all events + filter = function() { return true; }; // will always match + } + else if (!$.isFunction(filter)) { // an event ID + eventID = filter + ''; + filter = function(event) { + return event._id == eventID; + }; + } + + // Purge event(s) from our local cache + cache = $.grep(cache, filter, true); // inverse=true + + // Remove events from array sources. + // This works because they have been converted to official Event Objects up front. + // (and as a result, event._id has been calculated). + for (i=0; i<sources.length; i++) { + if ($.isArray(sources[i].events)) { + sources[i].events = $.grep(sources[i].events, filter, true); + } + } + + reportEvents(cache); + } + + + function clientEvents(filter) { + if ($.isFunction(filter)) { + return $.grep(cache, filter); + } + else if (filter != null) { // not null, not undefined. an event ID + filter += ''; + return $.grep(cache, function(e) { + return e._id == filter; + }); + } + return cache; // else, return all + } + + + + /* Loading State + -----------------------------------------------------------------------------*/ + + + function pushLoading() { + if (!(loadingLevel++)) { + trigger('loading', null, true, getView()); + } + } + + + function popLoading() { + if (!(--loadingLevel)) { + trigger('loading', null, false, getView()); + } + } + + + + /* Event Normalization + -----------------------------------------------------------------------------*/ + + + // Given a raw object with key/value properties, returns an "abstract" Event object. + // An "abstract" event is an event that, if recurring, will not have been expanded yet. + // Will return `false` when input is invalid. + // `source` is optional + function buildEventFromInput(input, source) { + var out = {}; + var start, end; + var allDay; + + if (options.eventDataTransform) { + input = options.eventDataTransform(input); + } + if (source && source.eventDataTransform) { + input = source.eventDataTransform(input); + } + + // Copy all properties over to the resulting object. + // The special-case properties will be copied over afterwards. + $.extend(out, input); + + if (source) { + out.source = source; + } + + out._id = input._id || (input.id === undefined ? '_fc' + eventGUID++ : input.id + ''); + + if (input.className) { + if (typeof input.className == 'string') { + out.className = input.className.split(/\s+/); + } + else { // assumed to be an array + out.className = input.className; + } + } + else { + out.className = []; + } + + start = input.start || input.date; // "date" is an alias for "start" + end = input.end; + + // parse as a time (Duration) if applicable + if (isTimeString(start)) { + start = moment.duration(start); + } + if (isTimeString(end)) { + end = moment.duration(end); + } + + if (input.dow || moment.isDuration(start) || moment.isDuration(end)) { + + // the event is "abstract" (recurring) so don't calculate exact start/end dates just yet + out.start = start ? moment.duration(start) : null; // will be a Duration or null + out.end = end ? moment.duration(end) : null; // will be a Duration or null + out._recurring = true; // our internal marker + } + else { + + if (start) { + start = t.moment(start); + if (!start.isValid()) { + return false; + } + } + + if (end) { + end = t.moment(end); + if (!end.isValid()) { + end = null; // let defaults take over + } + } + + allDay = input.allDay; + if (allDay === undefined) { // still undefined? fallback to default + allDay = firstDefined( + source ? source.allDayDefault : undefined, + options.allDayDefault + ); + // still undefined? normalizeEventDateProps will calculate it + } + + assignDatesToEvent(start, end, allDay, out); + } + + return out; + } + + + // Normalizes and assigns the given dates to the given partially-formed event object. + // NOTE: mutates the given start/end moments. does not make a copy. + function assignDatesToEvent(start, end, allDay, event) { + event.start = start; + event.end = end; + event.allDay = allDay; + normalizeEventDateProps(event); + backupEventDates(event); + } + + + // Ensures the allDay property exists. + // Ensures the start/end dates are consistent with allDay and forceEventDuration. + // Accepts an Event object, or a plain object with event-ish properties. + // NOTE: Will modify the given object. + function normalizeEventDateProps(props) { + + if (props.allDay == null) { + props.allDay = !(props.start.hasTime() || (props.end && props.end.hasTime())); + } + + if (props.allDay) { + props.start.stripTime(); + if (props.end) { + props.end.stripTime(); + } + } + else { + if (!props.start.hasTime()) { + props.start = t.rezoneDate(props.start); // will also give it a 00:00 time + } + if (props.end && !props.end.hasTime()) { + props.end = t.rezoneDate(props.end); // will also give it a 00:00 time + } + } + + if (props.end && !props.end.isAfter(props.start)) { + props.end = null; + } + + if (!props.end) { + if (options.forceEventDuration) { + props.end = t.getDefaultEventEnd(props.allDay, props.start); + } + else { + props.end = null; + } + } + } + + + // If `range` is a proper range with a start and end, returns the original object. + // If missing an end, computes a new range with an end, computing it as if it were an event. + // TODO: make this a part of the event -> eventRange system + function ensureVisibleEventRange(range) { + var allDay; + + if (!range.end) { + + allDay = range.allDay; // range might be more event-ish than we think + if (allDay == null) { + allDay = !range.start.hasTime(); + } + + range = { + start: range.start, + end: t.getDefaultEventEnd(allDay, range.start) + }; + } + return range; + } + + + // If the given event is a recurring event, break it down into an array of individual instances. + // If not a recurring event, return an array with the single original event. + // If given a falsy input (probably because of a failed buildEventFromInput call), returns an empty array. + // HACK: can override the recurring window by providing custom rangeStart/rangeEnd (for businessHours). + function expandEvent(abstractEvent, _rangeStart, _rangeEnd) { + var events = []; + var dowHash; + var dow; + var i; + var date; + var startTime, endTime; + var start, end; + var event; + + _rangeStart = _rangeStart || rangeStart; + _rangeEnd = _rangeEnd || rangeEnd; + + if (abstractEvent) { + if (abstractEvent._recurring) { + + // make a boolean hash as to whether the event occurs on each day-of-week + if ((dow = abstractEvent.dow)) { + dowHash = {}; + for (i = 0; i < dow.length; i++) { + dowHash[dow[i]] = true; + } + } + + // iterate through every day in the current range + date = _rangeStart.clone().stripTime(); // holds the date of the current day + while (date.isBefore(_rangeEnd)) { + + if (!dowHash || dowHash[date.day()]) { // if everyday, or this particular day-of-week + + startTime = abstractEvent.start; // the stored start and end properties are times (Durations) + endTime = abstractEvent.end; // " + start = date.clone(); + end = null; + + if (startTime) { + start = start.time(startTime); + } + if (endTime) { + end = date.clone().time(endTime); + } + + event = $.extend({}, abstractEvent); // make a copy of the original + assignDatesToEvent( + start, end, + !startTime && !endTime, // allDay? + event + ); + events.push(event); + } + + date.add(1, 'days'); + } + } + else { + events.push(abstractEvent); // return the original event. will be a one-item array + } + } + + return events; + } + + + + /* Event Modification Math + -----------------------------------------------------------------------------------------*/ + + + // Modifies an event and all related events by applying the given properties. + // Special date-diffing logic is used for manipulation of dates. + // If `props` does not contain start/end dates, the updated values are assumed to be the event's current start/end. + // All date comparisons are done against the event's pristine _start and _end dates. + // Returns an object with delta information and a function to undo all operations. + // + function mutateEvent(event, props) { + var miscProps = {}; + var clearEnd; + var dateDelta; + var durationDelta; + var undoFunc; + + props = props || {}; + + // ensure new date-related values to compare against + if (!props.start) { + props.start = event.start.clone(); + } + if (props.end === undefined) { + props.end = event.end ? event.end.clone() : null; + } + if (props.allDay == null) { // is null or undefined? + props.allDay = event.allDay; + } + + normalizeEventDateProps(props); // massages start/end/allDay + + // clear the end date if explicitly changed to null + clearEnd = event._end !== null && props.end === null; + + // compute the delta for moving the start and end dates together + if (props.allDay) { + dateDelta = diffDay(props.start, event._start); // whole-day diff from start-of-day + } + else { + dateDelta = diffDayTime(props.start, event._start); + } + + // compute the delta for moving the end date (after applying dateDelta) + if (!clearEnd && props.end) { + durationDelta = diffDayTime( + // new duration + props.end, + props.start + ).subtract(diffDayTime( + // subtract old duration + event._end || t.getDefaultEventEnd(event._allDay, event._start), + event._start + )); + } + + // gather all non-date-related properties + $.each(props, function(name, val) { + if (isMiscEventPropName(name)) { + if (val !== undefined) { + miscProps[name] = val; + } + } + }); + + // apply the operations to the event and all related events + undoFunc = mutateEvents( + clientEvents(event._id), // get events with this ID + clearEnd, + props.allDay, + dateDelta, + durationDelta, + miscProps + ); + + return { + dateDelta: dateDelta, + durationDelta: durationDelta, + undo: undoFunc + }; + } + + + // Modifies an array of events in the following ways (operations are in order): + // - clear the event's `end` + // - convert the event to allDay + // - add `dateDelta` to the start and end + // - add `durationDelta` to the event's duration + // - assign `miscProps` to the event + // + // Returns a function that can be called to undo all the operations. + // + // TODO: don't use so many closures. possible memory issues when lots of events with same ID. + // + function mutateEvents(events, clearEnd, allDay, dateDelta, durationDelta, miscProps) { + var isAmbigTimezone = t.getIsAmbigTimezone(); + var undoFunctions = []; + + // normalize zero-length deltas to be null + if (dateDelta && !dateDelta.valueOf()) { dateDelta = null; } + if (durationDelta && !durationDelta.valueOf()) { durationDelta = null; } + + $.each(events, function(i, event) { + var oldProps; + var newProps; + + // build an object holding all the old values, both date-related and misc. + // for the undo function. + oldProps = { + start: event.start.clone(), + end: event.end ? event.end.clone() : null, + allDay: event.allDay + }; + $.each(miscProps, function(name) { + oldProps[name] = event[name]; + }); + + // new date-related properties. work off the original date snapshot. + // ok to use references because they will be thrown away when backupEventDates is called. + newProps = { + start: event._start, + end: event._end, + allDay: event._allDay + }; + + if (clearEnd) { + newProps.end = null; + } + + newProps.allDay = allDay; + + normalizeEventDateProps(newProps); // massages start/end/allDay + + if (dateDelta) { + newProps.start.add(dateDelta); + if (newProps.end) { + newProps.end.add(dateDelta); + } + } + + if (durationDelta) { + if (!newProps.end) { + newProps.end = t.getDefaultEventEnd(newProps.allDay, newProps.start); + } + newProps.end.add(durationDelta); + } + + // if the dates have changed, and we know it is impossible to recompute the + // timezone offsets, strip the zone. + if ( + isAmbigTimezone && + !newProps.allDay && + (dateDelta || durationDelta) + ) { + newProps.start.stripZone(); + if (newProps.end) { + newProps.end.stripZone(); + } + } + + $.extend(event, miscProps, newProps); // copy over misc props, then date-related props + backupEventDates(event); // regenerate internal _start/_end/_allDay + + undoFunctions.push(function() { + $.extend(event, oldProps); + backupEventDates(event); // regenerate internal _start/_end/_allDay + }); + }); + + return function() { + for (var i = 0; i < undoFunctions.length; i++) { + undoFunctions[i](); + } + }; + } + + + /* Business Hours + -----------------------------------------------------------------------------------------*/ + + t.getBusinessHoursEvents = getBusinessHoursEvents; + + + // Returns an array of events as to when the business hours occur in the given view. + // Abuse of our event system :( + function getBusinessHoursEvents() { + var optionVal = options.businessHours; + var defaultVal = { + className: 'fc-nonbusiness', + start: '09:00', + end: '17:00', + dow: [ 1, 2, 3, 4, 5 ], // monday - friday + rendering: 'inverse-background' + }; + var view = t.getView(); + var eventInput; + + if (optionVal) { + if (typeof optionVal === 'object') { + // option value is an object that can override the default business hours + eventInput = $.extend({}, defaultVal, optionVal); + } + else { + // option value is `true`. use default business hours + eventInput = defaultVal; + } + } + + if (eventInput) { + return expandEvent( + buildEventFromInput(eventInput), + view.start, + view.end + ); + } + + return []; + } + + + /* Overlapping / Constraining + -----------------------------------------------------------------------------------------*/ + + t.isEventRangeAllowed = isEventRangeAllowed; + t.isSelectionRangeAllowed = isSelectionRangeAllowed; + t.isExternalDropRangeAllowed = isExternalDropRangeAllowed; + + + function isEventRangeAllowed(range, event) { + var source = event.source || {}; + var constraint = firstDefined( + event.constraint, + source.constraint, + options.eventConstraint + ); + var overlap = firstDefined( + event.overlap, + source.overlap, + options.eventOverlap + ); + + range = ensureVisibleEventRange(range); // ensure a proper range with an end for isRangeAllowed + + return isRangeAllowed(range, constraint, overlap, event); + } + + + function isSelectionRangeAllowed(range) { + return isRangeAllowed(range, options.selectConstraint, options.selectOverlap); + } + + + // when `eventProps` is defined, consider this an event. + // `eventProps` can contain misc non-date-related info about the event. + function isExternalDropRangeAllowed(range, eventProps) { + var eventInput; + var event; + + // note: very similar logic is in View's reportExternalDrop + if (eventProps) { + eventInput = $.extend({}, eventProps, range); + event = expandEvent(buildEventFromInput(eventInput))[0]; + } + + if (event) { + return isEventRangeAllowed(range, event); + } + else { // treat it as a selection + + range = ensureVisibleEventRange(range); // ensure a proper range with an end for isSelectionRangeAllowed + + return isSelectionRangeAllowed(range); + } + } + + + // Returns true if the given range (caused by an event drop/resize or a selection) is allowed to exist + // according to the constraint/overlap settings. + // `event` is not required if checking a selection. + function isRangeAllowed(range, constraint, overlap, event) { + var constraintEvents; + var anyContainment; + var i, otherEvent; + var otherOverlap; + + // normalize. fyi, we're normalizing in too many places :( + range = { + start: range.start.clone().stripZone(), + end: range.end.clone().stripZone() + }; + + // the range must be fully contained by at least one of produced constraint events + if (constraint != null) { + + // not treated as an event! intermediate data structure + // TODO: use ranges in the future + constraintEvents = constraintToEvents(constraint); + + anyContainment = false; + for (i = 0; i < constraintEvents.length; i++) { + if (eventContainsRange(constraintEvents[i], range)) { + anyContainment = true; + break; + } + } + + if (!anyContainment) { + return false; + } + } + + for (i = 0; i < cache.length; i++) { // loop all events and detect overlap + otherEvent = cache[i]; + + // don't compare the event to itself or other related [repeating] events + if (event && event._id === otherEvent._id) { + continue; + } + + // there needs to be an actual intersection before disallowing anything + if (eventIntersectsRange(otherEvent, range)) { + + // evaluate overlap for the given range and short-circuit if necessary + if (overlap === false) { + return false; + } + else if (typeof overlap === 'function' && !overlap(otherEvent, event)) { + return false; + } + + // if we are computing if the given range is allowable for an event, consider the other event's + // EventObject-specific or Source-specific `overlap` property + if (event) { + otherOverlap = firstDefined( + otherEvent.overlap, + (otherEvent.source || {}).overlap + // we already considered the global `eventOverlap` + ); + if (otherOverlap === false) { + return false; + } + if (typeof otherOverlap === 'function' && !otherOverlap(event, otherEvent)) { + return false; + } + } + } + } + + return true; + } + + + // Given an event input from the API, produces an array of event objects. Possible event inputs: + // 'businessHours' + // An event ID (number or string) + // An object with specific start/end dates or a recurring event (like what businessHours accepts) + function constraintToEvents(constraintInput) { + + if (constraintInput === 'businessHours') { + return getBusinessHoursEvents(); + } + + if (typeof constraintInput === 'object') { + return expandEvent(buildEventFromInput(constraintInput)); + } + + return clientEvents(constraintInput); // probably an ID + } + + + // Does the event's date range fully contain the given range? + // start/end already assumed to have stripped zones :( + function eventContainsRange(event, range) { + var eventStart = event.start.clone().stripZone(); + var eventEnd = t.getEventEnd(event).stripZone(); + + return range.start >= eventStart && range.end <= eventEnd; + } + + + // Does the event's date range intersect with the given range? + // start/end already assumed to have stripped zones :( + function eventIntersectsRange(event, range) { + var eventStart = event.start.clone().stripZone(); + var eventEnd = t.getEventEnd(event).stripZone(); + + return range.start < eventEnd && range.end > eventStart; + } + +} + + +// updates the "backup" properties, which are preserved in order to compute diffs later on. +function backupEventDates(event) { + event._allDay = event.allDay; + event._start = event.start.clone(); + event._end = event.end ? event.end.clone() : null; +} + + /* An abstract class for the "basic" views, as well as month view. Renders one or more rows of day cells. +----------------------------------------------------------------------------------------------------------------------*/ +// It is a manager for a DayGrid subcomponent, which does most of the heavy lifting. +// It is responsible for managing width/height. + +var BasicView = fcViews.basic = View.extend({ + + dayGrid: null, // the main subcomponent that does most of the heavy lifting + + dayNumbersVisible: false, // display day numbers on each day cell? + weekNumbersVisible: false, // display week numbers along the side? + + weekNumberWidth: null, // width of all the week-number cells running down the side + + headRowEl: null, // the fake row element of the day-of-week header + + + initialize: function() { + this.dayGrid = new DayGrid(this); + this.coordMap = this.dayGrid.coordMap; // the view's date-to-cell mapping is identical to the subcomponent's + }, + + + // Sets the display range and computes all necessary dates + setRange: function(range) { + View.prototype.setRange.call(this, range); // call the super-method + + this.dayGrid.breakOnWeeks = /year|month|week/.test(this.intervalUnit); // do before setRange + this.dayGrid.setRange(range); + }, + + + // Compute the value to feed into setRange. Overrides superclass. + computeRange: function(date) { + var range = View.prototype.computeRange.call(this, date); // get value from the super-method + + // year and month views should be aligned with weeks. this is already done for week + if (/year|month/.test(range.intervalUnit)) { + range.start.startOf('week'); + range.start = this.skipHiddenDays(range.start); + + // make end-of-week if not already + if (range.end.weekday()) { + range.end.add(1, 'week').startOf('week'); + range.end = this.skipHiddenDays(range.end, -1, true); // exclusively move backwards + } + } + + return range; + }, + + + // Renders the view into `this.el`, which should already be assigned + render: function() { + + this.dayNumbersVisible = this.dayGrid.rowCnt > 1; // TODO: make grid responsible + this.weekNumbersVisible = this.opt('weekNumbers'); + this.dayGrid.numbersVisible = this.dayNumbersVisible || this.weekNumbersVisible; + + this.el.addClass('fc-basic-view').html(this.renderHtml()); + + this.headRowEl = this.el.find('thead .fc-row'); + + this.scrollerEl = this.el.find('.fc-day-grid-container'); + this.dayGrid.coordMap.containerEl = this.scrollerEl; // constrain clicks/etc to the dimensions of the scroller + + this.dayGrid.el = this.el.find('.fc-day-grid'); + this.dayGrid.render(this.hasRigidRows()); + }, + + + // Make subcomponents ready for cleanup + destroy: function() { + this.dayGrid.destroy(); + View.prototype.destroy.call(this); // call the super-method + }, + + + // Builds the HTML skeleton for the view. + // The day-grid component will render inside of a container defined by this HTML. + renderHtml: function() { + return '' + + '<table>' + + '<thead>' + + '<tr>' + + '<td class="' + this.widgetHeaderClass + '">' + + this.dayGrid.headHtml() + // render the day-of-week headers + '</td>' + + '</tr>' + + '</thead>' + + '<tbody>' + + '<tr>' + + '<td class="' + this.widgetContentClass + '">' + + '<div class="fc-day-grid-container">' + + '<div class="fc-day-grid"/>' + + '</div>' + + '</td>' + + '</tr>' + + '</tbody>' + + '</table>'; + }, + + + // Generates the HTML that will go before the day-of week header cells. + // Queried by the DayGrid subcomponent when generating rows. Ordering depends on isRTL. + headIntroHtml: function() { + if (this.weekNumbersVisible) { + return '' + + '<th class="fc-week-number ' + this.widgetHeaderClass + '" ' + this.weekNumberStyleAttr() + '>' + + '<span>' + // needed for matchCellWidths + htmlEscape(this.opt('weekNumberTitle')) + + '</span>' + + '</th>'; + } + }, + + + // Generates the HTML that will go before content-skeleton cells that display the day/week numbers. + // Queried by the DayGrid subcomponent. Ordering depends on isRTL. + numberIntroHtml: function(row) { + if (this.weekNumbersVisible) { + return '' + + '<td class="fc-week-number" ' + this.weekNumberStyleAttr() + '>' + + '<span>' + // needed for matchCellWidths + this.calendar.calculateWeekNumber(this.dayGrid.getCell(row, 0).start) + + '</span>' + + '</td>'; + } + }, + + + // Generates the HTML that goes before the day bg cells for each day-row. + // Queried by the DayGrid subcomponent. Ordering depends on isRTL. + dayIntroHtml: function() { + if (this.weekNumbersVisible) { + return '<td class="fc-week-number ' + this.widgetContentClass + '" ' + + this.weekNumberStyleAttr() + '></td>'; + } + }, + + + // Generates the HTML that goes before every other type of row generated by DayGrid. Ordering depends on isRTL. + // Affects helper-skeleton and highlight-skeleton rows. + introHtml: function() { + if (this.weekNumbersVisible) { + return '<td class="fc-week-number" ' + this.weekNumberStyleAttr() + '></td>'; + } + }, + + + // Generates the HTML for the <td>s of the "number" row in the DayGrid's content skeleton. + // The number row will only exist if either day numbers or week numbers are turned on. + numberCellHtml: function(cell) { + var date = cell.start; + var classes; + + if (!this.dayNumbersVisible) { // if there are week numbers but not day numbers + return '<td/>'; // will create an empty space above events :( + } + + classes = this.dayGrid.getDayClasses(date); + classes.unshift('fc-day-number'); + + return '' + + '<td class="' + classes.join(' ') + '" data-date="' + date.format() + '">' + + date.date() + + '</td>'; + }, + + + // Generates an HTML attribute string for setting the width of the week number column, if it is known + weekNumberStyleAttr: function() { + if (this.weekNumberWidth !== null) { + return 'style="width:' + this.weekNumberWidth + 'px"'; + } + return ''; + }, + + + // Determines whether each row should have a constant height + hasRigidRows: function() { + var eventLimit = this.opt('eventLimit'); + return eventLimit && typeof eventLimit !== 'number'; + }, + + + /* Dimensions + ------------------------------------------------------------------------------------------------------------------*/ + + + // Refreshes the horizontal dimensions of the view + updateWidth: function() { + if (this.weekNumbersVisible) { + // Make sure all week number cells running down the side have the same width. + // Record the width for cells created later. + this.weekNumberWidth = matchCellWidths( + this.el.find('.fc-week-number') + ); + } + }, + + + // Adjusts the vertical dimensions of the view to the specified values + setHeight: function(totalHeight, isAuto) { + var eventLimit = this.opt('eventLimit'); + var scrollerHeight; + + // reset all heights to be natural + unsetScroller(this.scrollerEl); + uncompensateScroll(this.headRowEl); + + this.dayGrid.destroySegPopover(); // kill the "more" popover if displayed + + // is the event limit a constant level number? + if (eventLimit && typeof eventLimit === 'number') { + this.dayGrid.limitRows(eventLimit); // limit the levels first so the height can redistribute after + } + + scrollerHeight = this.computeScrollerHeight(totalHeight); + this.setGridHeight(scrollerHeight, isAuto); + + // is the event limit dynamically calculated? + if (eventLimit && typeof eventLimit !== 'number') { + this.dayGrid.limitRows(eventLimit); // limit the levels after the grid's row heights have been set + } + + if (!isAuto && setPotentialScroller(this.scrollerEl, scrollerHeight)) { // using scrollbars? + + compensateScroll(this.headRowEl, getScrollbarWidths(this.scrollerEl)); + + // doing the scrollbar compensation might have created text overflow which created more height. redo + scrollerHeight = this.computeScrollerHeight(totalHeight); + this.scrollerEl.height(scrollerHeight); + + this.restoreScroll(); + } + }, + + + // Sets the height of just the DayGrid component in this view + setGridHeight: function(height, isAuto) { + if (isAuto) { + undistributeHeight(this.dayGrid.rowEls); // let the rows be their natural height with no expanding + } + else { + distributeHeight(this.dayGrid.rowEls, height, true); // true = compensate for height-hogging rows + } + }, + + + /* Events + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders the given events onto the view and populates the segments array + renderEvents: function(events) { + this.dayGrid.renderEvents(events); + + this.updateHeight(); // must compensate for events that overflow the row + }, + + + // Retrieves all segment objects that are rendered in the view + getEventSegs: function() { + return this.dayGrid.getEventSegs(); + }, + + + // Unrenders all event elements and clears internal segment data + destroyEvents: function() { + this.recordScroll(); // removing events will reduce height and mess with the scroll, so record beforehand + this.dayGrid.destroyEvents(); + + // we DON'T need to call updateHeight() because: + // A) a renderEvents() call always happens after this, which will eventually call updateHeight() + // B) in IE8, this causes a flash whenever events are rerendered + }, + + + /* Dragging (for both events and external elements) + ------------------------------------------------------------------------------------------------------------------*/ + + + // A returned value of `true` signals that a mock "helper" event has been rendered. + renderDrag: function(dropLocation, seg) { + return this.dayGrid.renderDrag(dropLocation, seg); + }, + + + destroyDrag: function() { + this.dayGrid.destroyDrag(); + }, + + + /* Selection + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of a selection + renderSelection: function(range) { + this.dayGrid.renderSelection(range); + }, + + + // Unrenders a visual indications of a selection + destroySelection: function() { + this.dayGrid.destroySelection(); + } + +}); + + /* A month view with day cells running in rows (one-per-week) and columns +----------------------------------------------------------------------------------------------------------------------*/ + +setDefaults({ + fixedWeekCount: true +}); + +var MonthView = fcViews.month = BasicView.extend({ + + // Produces information about what range to display + computeRange: function(date) { + var range = BasicView.prototype.computeRange.call(this, date); // get value from super-method + + if (this.isFixedWeeks()) { + // ensure 6 weeks + range.end.add( + 6 - range.end.diff(range.start, 'weeks'), + 'weeks' + ); + } + + return range; + }, + + + // Overrides the default BasicView behavior to have special multi-week auto-height logic + setGridHeight: function(height, isAuto) { + + isAuto = isAuto || this.opt('weekMode') === 'variable'; // LEGACY: weekMode is deprecated + + // if auto, make the height of each row the height that it would be if there were 6 weeks + if (isAuto) { + height *= this.rowCnt / 6; + } + + distributeHeight(this.dayGrid.rowEls, height, !isAuto); // if auto, don't compensate for height-hogging rows + }, + + + isFixedWeeks: function() { + var weekMode = this.opt('weekMode'); // LEGACY: weekMode is deprecated + if (weekMode) { + return weekMode === 'fixed'; // if any other type of weekMode, assume NOT fixed + } + + return this.opt('fixedWeekCount'); + } + +}); + +MonthView.duration = { months: 1 }; + + /* A week view with simple day cells running horizontally +----------------------------------------------------------------------------------------------------------------------*/ + +fcViews.basicWeek = { + type: 'basic', + duration: { weeks: 1 } +}; + /* A view with a single simple day cell +----------------------------------------------------------------------------------------------------------------------*/ + +fcViews.basicDay = { + type: 'basic', + duration: { days: 1 } +}; + /* An abstract class for all agenda-related views. Displays one more columns with time slots running vertically. +----------------------------------------------------------------------------------------------------------------------*/ +// Is a manager for the TimeGrid subcomponent and possibly the DayGrid subcomponent (if allDaySlot is on). +// Responsible for managing width/height. + +setDefaults({ + allDaySlot: true, + allDayText: 'all-day', + scrollTime: '06:00:00', + slotDuration: '00:30:00', + minTime: '00:00:00', + maxTime: '24:00:00', + slotEventOverlap: true +}); + +var AGENDA_ALL_DAY_EVENT_LIMIT = 5; + +fcViews.agenda = View.extend({ // AgendaView + + timeGrid: null, // the main time-grid subcomponent of this view + dayGrid: null, // the "all-day" subcomponent. if all-day is turned off, this will be null + + axisWidth: null, // the width of the time axis running down the side + + noScrollRowEls: null, // set of fake row elements that must compensate when scrollerEl has scrollbars + + // when the time-grid isn't tall enough to occupy the given height, we render an <hr> underneath + bottomRuleEl: null, + bottomRuleHeight: null, + + + initialize: function() { + this.timeGrid = new TimeGrid(this); + + if (this.opt('allDaySlot')) { // should we display the "all-day" area? + this.dayGrid = new DayGrid(this); // the all-day subcomponent of this view + + // the coordinate grid will be a combination of both subcomponents' grids + this.coordMap = new ComboCoordMap([ + this.dayGrid.coordMap, + this.timeGrid.coordMap + ]); + } + else { + this.coordMap = this.timeGrid.coordMap; + } + }, + + + /* Rendering + ------------------------------------------------------------------------------------------------------------------*/ + + + // Sets the display range and computes all necessary dates + setRange: function(range) { + View.prototype.setRange.call(this, range); // call the super-method + + this.timeGrid.setRange(range); + if (this.dayGrid) { + this.dayGrid.setRange(range); + } + }, + + + // Renders the view into `this.el`, which has already been assigned + render: function() { + + this.el.addClass('fc-agenda-view').html(this.renderHtml()); + + // the element that wraps the time-grid that will probably scroll + this.scrollerEl = this.el.find('.fc-time-grid-container'); + this.timeGrid.coordMap.containerEl = this.scrollerEl; // don't accept clicks/etc outside of this + + this.timeGrid.el = this.el.find('.fc-time-grid'); + this.timeGrid.render(); + + // the <hr> that sometimes displays under the time-grid + this.bottomRuleEl = $('<hr class="' + this.widgetHeaderClass + '"/>') + .appendTo(this.timeGrid.el); // inject it into the time-grid + + if (this.dayGrid) { + this.dayGrid.el = this.el.find('.fc-day-grid'); + this.dayGrid.render(); + + // have the day-grid extend it's coordinate area over the <hr> dividing the two grids + this.dayGrid.bottomCoordPadding = this.dayGrid.el.next('hr').outerHeight(); + } + + this.noScrollRowEls = this.el.find('.fc-row:not(.fc-scroller *)'); // fake rows not within the scroller + }, + + + // Make subcomponents ready for cleanup + destroy: function() { + this.timeGrid.destroy(); + if (this.dayGrid) { + this.dayGrid.destroy(); + } + View.prototype.destroy.call(this); // call the super-method + }, + + + // Builds the HTML skeleton for the view. + // The day-grid and time-grid components will render inside containers defined by this HTML. + renderHtml: function() { + return '' + + '<table>' + + '<thead>' + + '<tr>' + + '<td class="' + this.widgetHeaderClass + '">' + + this.timeGrid.headHtml() + // render the day-of-week headers + '</td>' + + '</tr>' + + '</thead>' + + '<tbody>' + + '<tr>' + + '<td class="' + this.widgetContentClass + '">' + + (this.dayGrid ? + '<div class="fc-day-grid"/>' + + '<hr class="' + this.widgetHeaderClass + '"/>' : + '' + ) + + '<div class="fc-time-grid-container">' + + '<div class="fc-time-grid"/>' + + '</div>' + + '</td>' + + '</tr>' + + '</tbody>' + + '</table>'; + }, + + + // Generates the HTML that will go before the day-of week header cells. + // Queried by the TimeGrid subcomponent when generating rows. Ordering depends on isRTL. + headIntroHtml: function() { + var date; + var weekNumber; + var weekTitle; + var weekText; + + if (this.opt('weekNumbers')) { + date = this.timeGrid.getCell(0).start; + weekNumber = this.calendar.calculateWeekNumber(date); + weekTitle = this.opt('weekNumberTitle'); + + if (this.opt('isRTL')) { + weekText = weekNumber + weekTitle; + } + else { + weekText = weekTitle + weekNumber; + } + + return '' + + '<th class="fc-axis fc-week-number ' + this.widgetHeaderClass + '" ' + this.axisStyleAttr() + '>' + + '<span>' + // needed for matchCellWidths + htmlEscape(weekText) + + '</span>' + + '</th>'; + } + else { + return '<th class="fc-axis ' + this.widgetHeaderClass + '" ' + this.axisStyleAttr() + '></th>'; + } + }, + + + // Generates the HTML that goes before the all-day cells. + // Queried by the DayGrid subcomponent when generating rows. Ordering depends on isRTL. + dayIntroHtml: function() { + return '' + + '<td class="fc-axis ' + this.widgetContentClass + '" ' + this.axisStyleAttr() + '>' + + '<span>' + // needed for matchCellWidths + (this.opt('allDayHtml') || htmlEscape(this.opt('allDayText'))) + + '</span>' + + '</td>'; + }, + + + // Generates the HTML that goes before the bg of the TimeGrid slot area. Long vertical column. + slotBgIntroHtml: function() { + return '<td class="fc-axis ' + this.widgetContentClass + '" ' + this.axisStyleAttr() + '></td>'; + }, + + + // Generates the HTML that goes before all other types of cells. + // Affects content-skeleton, helper-skeleton, highlight-skeleton for both the time-grid and day-grid. + // Queried by the TimeGrid and DayGrid subcomponents when generating rows. Ordering depends on isRTL. + introHtml: function() { + return '<td class="fc-axis" ' + this.axisStyleAttr() + '></td>'; + }, + + + // Generates an HTML attribute string for setting the width of the axis, if it is known + axisStyleAttr: function() { + if (this.axisWidth !== null) { + return 'style="width:' + this.axisWidth + 'px"'; + } + return ''; + }, + + + /* Dimensions + ------------------------------------------------------------------------------------------------------------------*/ + + + updateSize: function(isResize) { + if (isResize) { + this.timeGrid.resize(); + } + View.prototype.updateSize.call(this, isResize); + }, + + + // Refreshes the horizontal dimensions of the view + updateWidth: function() { + // make all axis cells line up, and record the width so newly created axis cells will have it + this.axisWidth = matchCellWidths(this.el.find('.fc-axis')); + }, + + + // Adjusts the vertical dimensions of the view to the specified values + setHeight: function(totalHeight, isAuto) { + var eventLimit; + var scrollerHeight; + + if (this.bottomRuleHeight === null) { + // calculate the height of the rule the very first time + this.bottomRuleHeight = this.bottomRuleEl.outerHeight(); + } + this.bottomRuleEl.hide(); // .show() will be called later if this <hr> is necessary + + // reset all dimensions back to the original state + this.scrollerEl.css('overflow', ''); + unsetScroller(this.scrollerEl); + uncompensateScroll(this.noScrollRowEls); + + // limit number of events in the all-day area + if (this.dayGrid) { + this.dayGrid.destroySegPopover(); // kill the "more" popover if displayed + + eventLimit = this.opt('eventLimit'); + if (eventLimit && typeof eventLimit !== 'number') { + eventLimit = AGENDA_ALL_DAY_EVENT_LIMIT; // make sure "auto" goes to a real number + } + if (eventLimit) { + this.dayGrid.limitRows(eventLimit); + } + } + + if (!isAuto) { // should we force dimensions of the scroll container, or let the contents be natural height? + + scrollerHeight = this.computeScrollerHeight(totalHeight); + if (setPotentialScroller(this.scrollerEl, scrollerHeight)) { // using scrollbars? + + // make the all-day and header rows lines up + compensateScroll(this.noScrollRowEls, getScrollbarWidths(this.scrollerEl)); + + // the scrollbar compensation might have changed text flow, which might affect height, so recalculate + // and reapply the desired height to the scroller. + scrollerHeight = this.computeScrollerHeight(totalHeight); + this.scrollerEl.height(scrollerHeight); + + this.restoreScroll(); + } + else { // no scrollbars + // still, force a height and display the bottom rule (marks the end of day) + this.scrollerEl.height(scrollerHeight).css('overflow', 'hidden'); // in case <hr> goes outside + this.bottomRuleEl.show(); + } + } + }, + + + // Sets the scroll value of the scroller to the initial pre-configured state prior to allowing the user to change it + initializeScroll: function() { + var _this = this; + var scrollTime = moment.duration(this.opt('scrollTime')); + var top = this.timeGrid.computeTimeTop(scrollTime); + + // zoom can give weird floating-point values. rather scroll a little bit further + top = Math.ceil(top); + + if (top) { + top++; // to overcome top border that slots beyond the first have. looks better + } + + function scroll() { + _this.scrollerEl.scrollTop(top); + } + + scroll(); + setTimeout(scroll, 0); // overrides any previous scroll state made by the browser + }, + + + /* Events + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders events onto the view and populates the View's segment array + renderEvents: function(events) { + var dayEvents = []; + var timedEvents = []; + var daySegs = []; + var timedSegs; + var i; + + // separate the events into all-day and timed + for (i = 0; i < events.length; i++) { + if (events[i].allDay) { + dayEvents.push(events[i]); + } + else { + timedEvents.push(events[i]); + } + } + + // render the events in the subcomponents + timedSegs = this.timeGrid.renderEvents(timedEvents); + if (this.dayGrid) { + daySegs = this.dayGrid.renderEvents(dayEvents); + } + + // the all-day area is flexible and might have a lot of events, so shift the height + this.updateHeight(); + }, + + + // Retrieves all segment objects that are rendered in the view + getEventSegs: function() { + return this.timeGrid.getEventSegs().concat( + this.dayGrid ? this.dayGrid.getEventSegs() : [] + ); + }, + + + // Unrenders all event elements and clears internal segment data + destroyEvents: function() { + + // if destroyEvents is being called as part of an event rerender, renderEvents will be called shortly + // after, so remember what the scroll value was so we can restore it. + this.recordScroll(); + + // destroy the events in the subcomponents + this.timeGrid.destroyEvents(); + if (this.dayGrid) { + this.dayGrid.destroyEvents(); + } + + // we DON'T need to call updateHeight() because: + // A) a renderEvents() call always happens after this, which will eventually call updateHeight() + // B) in IE8, this causes a flash whenever events are rerendered + }, + + + /* Dragging (for events and external elements) + ------------------------------------------------------------------------------------------------------------------*/ + + + // A returned value of `true` signals that a mock "helper" event has been rendered. + renderDrag: function(dropLocation, seg) { + if (dropLocation.start.hasTime()) { + return this.timeGrid.renderDrag(dropLocation, seg); + } + else if (this.dayGrid) { + return this.dayGrid.renderDrag(dropLocation, seg); + } + }, + + + destroyDrag: function() { + this.timeGrid.destroyDrag(); + if (this.dayGrid) { + this.dayGrid.destroyDrag(); + } + }, + + + /* Selection + ------------------------------------------------------------------------------------------------------------------*/ + + + // Renders a visual indication of a selection + renderSelection: function(range) { + if (range.start.hasTime() || range.end.hasTime()) { + this.timeGrid.renderSelection(range); + } + else if (this.dayGrid) { + this.dayGrid.renderSelection(range); + } + }, + + + // Unrenders a visual indications of a selection + destroySelection: function() { + this.timeGrid.destroySelection(); + if (this.dayGrid) { + this.dayGrid.destroySelection(); + } + } + +}); + + /* A week view with an all-day cell area at the top, and a time grid below +----------------------------------------------------------------------------------------------------------------------*/ + +fcViews.agendaWeek = { + type: 'agenda', + duration: { weeks: 1 } +}; + /* A day view with an all-day cell area at the top, and a time grid below +----------------------------------------------------------------------------------------------------------------------*/ + +fcViews.agendaDay = { + type: 'agenda', + duration: { days: 1 } +}; +}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/fullcalendar/fullcalendar.min.css b/theme/bootstrap/plugins/fullcalendar/fullcalendar.min.css new file mode 100644 index 0000000..083ec9d --- /dev/null +++ b/theme/bootstrap/plugins/fullcalendar/fullcalendar.min.css @@ -0,0 +1,5 @@ +/*! + * FullCalendar v2.2.5 Stylesheet + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */.fc{direction:ltr;text-align:left}.fc-rtl{text-align:right}body .fc{font-size:1em}.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed hr,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#ddd}.fc-unthemed .fc-popover{background-color:#fff}.fc-unthemed .fc-popover .fc-header,.fc-unthemed hr{background:#eee}.fc-unthemed .fc-popover .fc-header .fc-close{color:#666}.fc-unthemed .fc-today{background:#fcf8e3}.fc-highlight{background:#bce8f1;opacity:.3;filter:alpha(opacity=30)}.fc-bgevent{background:#8fdf82;opacity:.3;filter:alpha(opacity=30)}.fc-nonbusiness{background:#ccc}.fc-icon{display:inline-block;font-size:2em;line-height:.5em;height:.5em;font-family:"Courier New",Courier,monospace}.fc-icon-left-single-arrow:after{content:"\02039";font-weight:700}.fc-icon-right-single-arrow:after{content:"\0203A";font-weight:700}.fc-icon-left-double-arrow:after{content:"\000AB"}.fc-icon-right-double-arrow:after{content:"\000BB"}.fc-icon-x:after{content:"\000D7"}.fc button{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;height:2.1em;padding:0 .6em;font-size:1em;white-space:nowrap;cursor:pointer}.fc button::-moz-focus-inner{margin:0;padding:0}.fc-state-default{border:1px solid}.fc-state-default.fc-corner-left{border-top-left-radius:4px;border-bottom-left-radius:4px}.fc-state-default.fc-corner-right{border-top-right-radius:4px;border-bottom-right-radius:4px}.fc button .fc-icon{position:relative;top:.05em;margin:0 .1em}.fc-state-default{background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);color:#333;text-shadow:0 1px 1px rgba(255,255,255,.75);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.fc-state-active,.fc-state-disabled,.fc-state-down,.fc-state-hover{color:#333;background-color:#e6e6e6}.fc-state-hover{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.fc-state-active,.fc-state-down{background-color:#ccc;background-image:none;box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.fc-state-disabled{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);box-shadow:none}.fc-button-group{display:inline-block}.fc .fc-button-group>*{float:left;margin:0 0 0 -1px}.fc .fc-button-group>:first-child{margin-left:0}.fc-popover{position:absolute;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc-popover .fc-header{padding:2px 4px}.fc-popover .fc-header .fc-title{margin:0 2px}.fc-popover .fc-header .fc-close{cursor:pointer}.fc-ltr .fc-popover .fc-header .fc-title,.fc-rtl .fc-popover .fc-header .fc-close{float:left}.fc-ltr .fc-popover .fc-header .fc-close,.fc-rtl .fc-popover .fc-header .fc-title{float:right}.fc-unthemed .fc-popover{border-width:1px;border-style:solid}.fc-unthemed .fc-popover .fc-header .fc-close{font-size:25px;margin-top:4px}.fc-popover>.ui-widget-header+.ui-widget-content{border-top:0}.fc hr{height:0;margin:0;padding:0 0 2px;border-style:solid;border-width:1px 0}.fc-clear{clear:both}.fc-bg,.fc-bgevent-skeleton,.fc-helper-skeleton,.fc-highlight-skeleton{position:absolute;top:0;left:0;right:0}.fc-bg{bottom:0}.fc-bg table{height:100%}.fc table{width:100%;table-layout:fixed;border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{border-style:solid;border-width:1px;padding:0;vertical-align:top}.fc td.fc-today{border-style:double}.fc .fc-row{border-style:solid;border-width:0}.fc-row table{border-left:0 hidden transparent;border-right:0 hidden transparent;border-bottom:0 hidden transparent}.fc-row:first-child table{border-top:0 hidden transparent}.fc-row{position:relative}.fc-row .fc-bg{z-index:1}.fc-row .fc-bgevent-skeleton,.fc-row .fc-highlight-skeleton{bottom:0}.fc-row .fc-bgevent-skeleton table,.fc-row .fc-highlight-skeleton table{height:100%}.fc-row .fc-bgevent-skeleton td,.fc-row .fc-highlight-skeleton td{border-color:transparent}.fc-row .fc-bgevent-skeleton{z-index:2}.fc-row .fc-highlight-skeleton{z-index:3}.fc-row .fc-content-skeleton{position:relative;z-index:4;padding-bottom:2px}.fc-row .fc-helper-skeleton{z-index:5}.fc-row .fc-content-skeleton td,.fc-row .fc-helper-skeleton td{background:0 0;border-color:transparent;border-bottom:0}.fc-row .fc-content-skeleton tbody td,.fc-row .fc-helper-skeleton tbody td{border-top:0}.fc-scroller{overflow-y:scroll;overflow-x:hidden}.fc-scroller>*{position:relative;width:100%;overflow:hidden}.fc-event{position:relative;display:block;font-size:.85em;line-height:1.3;border-radius:3px;border:1px solid #3a87ad;background-color:#3a87ad;font-weight:400}.fc-event,.fc-event:hover,.ui-widget .fc-event{color:#fff;text-decoration:none}.fc-event.fc-draggable,.fc-event[href]{cursor:pointer}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-day-grid-event{margin:1px 2px 0;padding:0 1px}.fc-ltr .fc-day-grid-event.fc-not-start,.fc-rtl .fc-day-grid-event.fc-not-end{margin-left:0;border-left-width:0;padding-left:1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-ltr .fc-day-grid-event.fc-not-end,.fc-rtl .fc-day-grid-event.fc-not-start{margin-right:0;border-right-width:0;padding-right:1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-day-grid-event>.fc-content{white-space:nowrap;overflow:hidden}.fc-day-grid-event .fc-time{font-weight:700}.fc-day-grid-event .fc-resizer{position:absolute;top:0;bottom:0;width:7px}.fc-ltr .fc-day-grid-event .fc-resizer{right:-3px;cursor:e-resize}.fc-rtl .fc-day-grid-event .fc-resizer{left:-3px;cursor:w-resize}a.fc-more{margin:1px 3px;font-size:.85em;cursor:pointer;text-decoration:none}a.fc-more:hover{text-decoration:underline}.fc-limited{display:none}.fc-day-grid .fc-row{z-index:1}.fc-more-popover{z-index:2;width:220px}.fc-more-popover .fc-event-container{padding:10px}.fc-toolbar{text-align:center;margin-bottom:1em}.fc-toolbar .fc-left{float:left}.fc-toolbar .fc-right{float:right}.fc-toolbar .fc-center{display:inline-block}.fc .fc-toolbar>*>*{float:left;margin-left:.75em}.fc .fc-toolbar>*>:first-child{margin-left:0}.fc-toolbar h2{margin:0}.fc-toolbar button{position:relative}.fc-toolbar .fc-state-hover,.fc-toolbar .ui-state-hover{z-index:2}.fc-toolbar .fc-state-down{z-index:3}.fc-toolbar .fc-state-active,.fc-toolbar .ui-state-active{z-index:4}.fc-toolbar button:focus{z-index:5}.fc-view-container *,.fc-view-container :after,.fc-view-container :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fc-view,.fc-view>table{position:relative;z-index:1}.fc-basicDay-view .fc-content-skeleton,.fc-basicWeek-view .fc-content-skeleton{padding-top:1px;padding-bottom:1em}.fc-basic-view tbody .fc-row{min-height:4em}.fc-row.fc-rigid{overflow:hidden}.fc-row.fc-rigid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-basic-view .fc-day-number,.fc-basic-view .fc-week-number{padding:0 2px}.fc-basic-view td.fc-day-number,.fc-basic-view td.fc-week-number span{padding-top:2px;padding-bottom:2px}.fc-basic-view .fc-week-number{text-align:center}.fc-basic-view .fc-week-number span{display:inline-block;min-width:1.25em}.fc-ltr .fc-basic-view .fc-day-number{text-align:right}.fc-rtl .fc-basic-view .fc-day-number{text-align:left}.fc-day-number.fc-other-month{opacity:.3;filter:alpha(opacity=30)}.fc-agenda-view .fc-day-grid{position:relative;z-index:2}.fc-agenda-view .fc-day-grid .fc-row{min-height:3em}.fc-agenda-view .fc-day-grid .fc-row .fc-content-skeleton{padding-top:1px;padding-bottom:1em}.fc .fc-axis{vertical-align:middle;padding:0 4px;white-space:nowrap}.fc-ltr .fc-axis{text-align:right}.fc-rtl .fc-axis{text-align:left}.ui-widget td.fc-axis{font-weight:400}.fc-time-grid,.fc-time-grid-container{position:relative;z-index:1}.fc-time-grid{min-height:100%}.fc-time-grid table{border:0 hidden transparent}.fc-time-grid>.fc-bg{z-index:1}.fc-time-grid .fc-slats,.fc-time-grid>hr{position:relative;z-index:2}.fc-time-grid .fc-bgevent-skeleton,.fc-time-grid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-time-grid .fc-bgevent-skeleton{z-index:3}.fc-time-grid .fc-highlight-skeleton{z-index:4}.fc-time-grid .fc-content-skeleton{z-index:5}.fc-time-grid .fc-helper-skeleton{z-index:6}.fc-slats td{height:1.5em;border-bottom:0}.fc-slats .fc-minor td{border-top-style:dotted}.fc-slats .ui-widget-content{background:0 0}.fc-time-grid .fc-highlight-container{position:relative}.fc-time-grid .fc-highlight{position:absolute;left:0;right:0}.fc-time-grid .fc-bgevent-container,.fc-time-grid .fc-event-container{position:relative}.fc-ltr .fc-time-grid .fc-event-container{margin:0 2.5% 0 2px}.fc-rtl .fc-time-grid .fc-event-container{margin:0 2px 0 2.5%}.fc-time-grid .fc-bgevent,.fc-time-grid .fc-event{position:absolute;z-index:1}.fc-time-grid .fc-bgevent{left:0;right:0}.fc-time-grid-event.fc-not-start{border-top-width:0;padding-top:1px;border-top-left-radius:0;border-top-right-radius:0}.fc-time-grid-event.fc-not-end{border-bottom-width:0;padding-bottom:1px;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-time-grid-event{overflow:hidden}.fc-time-grid-event>.fc-content{position:relative;z-index:2}.fc-time-grid-event .fc-time,.fc-time-grid-event .fc-title{padding:0 1px}.fc-time-grid-event .fc-time{font-size:.85em;white-space:nowrap}.fc-time-grid-event .fc-bg{z-index:1;background:#fff;opacity:.25;filter:alpha(opacity=25)}.fc-time-grid-event.fc-short .fc-content{white-space:nowrap}.fc-time-grid-event.fc-short .fc-time,.fc-time-grid-event.fc-short .fc-title{display:inline-block;vertical-align:top}.fc-time-grid-event.fc-short .fc-time span{display:none}.fc-time-grid-event.fc-short .fc-time:before{content:attr(data-start)}.fc-time-grid-event.fc-short .fc-time:after{content:"\000A0-\000A0"}.fc-time-grid-event.fc-short .fc-title{font-size:.85em;padding:0}.fc-time-grid-event .fc-resizer{position:absolute;z-index:3;left:0;right:0;bottom:0;height:8px;overflow:hidden;line-height:8px;font-size:11px;font-family:monospace;text-align:center;cursor:s-resize}.fc-time-grid-event .fc-resizer:after{content:"="} \ No newline at end of file diff --git a/theme/bootstrap/plugins/fullcalendar/fullcalendar.min.js b/theme/bootstrap/plugins/fullcalendar/fullcalendar.min.js new file mode 100644 index 0000000..343d907 --- /dev/null +++ b/theme/bootstrap/plugins/fullcalendar/fullcalendar.min.js @@ -0,0 +1,8 @@ +/*! + * FullCalendar v2.2.5 + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */ +(function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):t(jQuery,moment)})(function(t,e){function n(t){i(Ee,t)}function i(e){function n(n,s){t.isPlainObject(s)&&t.isPlainObject(e[n])&&!r(n)?e[n]=i({},e[n],s):void 0!==s&&(e[n]=s)}for(var s=1;arguments.length>s;s++)t.each(arguments[s],n);return e}function r(t){return/(Time|Duration)$/.test(t)}function s(t){var n=e.localeData||e.langData;return n.call(e,t)||n.call(e,"en")}function o(t,e){e.left&&t.css({"border-left-width":1,"margin-left":e.left-1}),e.right&&t.css({"border-right-width":1,"margin-right":e.right-1})}function l(t){t.css({"margin-left":"","margin-right":"","border-left-width":"","border-right-width":""})}function a(){t("body").addClass("fc-not-allowed")}function u(){t("body").removeClass("fc-not-allowed")}function d(e,n,i){var r=Math.floor(n/e.length),s=Math.floor(n-r*(e.length-1)),o=[],l=[],a=[],u=0;c(e),e.each(function(n,i){var d=n===e.length-1?s:r,c=t(i).outerHeight(!0);d>c?(o.push(i),l.push(c),a.push(t(i).height())):u+=c}),i&&(n-=u,r=Math.floor(n/o.length),s=Math.floor(n-r*(o.length-1))),t(o).each(function(e,n){var i=e===o.length-1?s:r,u=l[e],d=a[e],c=i-(u-d);i>u&&t(n).height(c)})}function c(t){t.height("")}function h(e){var n=0;return e.find("> *").each(function(e,i){var r=t(i).outerWidth();r>n&&(n=r)}),n++,e.width(n),n}function f(t,e){return t.height(e).addClass("fc-scroller"),t[0].scrollHeight-1>t[0].clientHeight?!0:(g(t),!1)}function g(t){t.height("").removeClass("fc-scroller")}function p(e){var n=e.css("position"),i=e.parents().filter(function(){var e=t(this);return/(auto|scroll)/.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==n&&i.length?i:t(e[0].ownerDocument||document)}function m(t){var e=t.offset().left,n=e+t.width(),i=t.children(),r=i.offset().left,s=r+i.outerWidth();return{left:r-e,right:n-s}}function v(t){return 1==t.which&&!t.ctrlKey}function y(t,e){var n,i,r,s,o=t.start,l=t.end,a=e.start,u=e.end;return l>a&&u>o?(o>=a?(n=o.clone(),r=!0):(n=a.clone(),r=!1),u>=l?(i=l.clone(),s=!0):(i=u.clone(),s=!1),{start:n,end:i,isStart:r,isEnd:s}):void 0}function w(t,e){if(t=t||{},void 0!==t[e])return t[e];for(var n,i=e.split(/(?=[A-Z])/),r=i.length-1;r>=0;r--)if(n=t[i[r].toLowerCase()],void 0!==n)return n;return t["default"]}function E(t,n){return e.duration({days:t.clone().stripTime().diff(n.clone().stripTime(),"days"),ms:t.time()-n.time()})}function S(t,n){return e.duration({days:t.clone().stripTime().diff(n.clone().stripTime(),"days")})}function b(t,e){var n,i;for(n=0;ze.length>n&&(i=ze[n],!D(i,t,e));n++);return i}function D(t,n,i){var r;return r=null!=i?i.diff(n,t,!0):e.isDuration(n)?n.as(t):n.end.diff(n.start,t,!0),r>=1&&_(r)?r:!1}function C(t){return"[object Date]"===Object.prototype.toString.call(t)||t instanceof Date}function T(t){return/^\d+\:\d+(?:\:\d+\.?(?:\d{3})?)?$/.test(t)}function x(t){var e=function(){};return e.prototype=t,new e}function H(t,e){for(var n in t)R(t,n)&&(e[n]=t[n])}function R(t,e){return Le.call(t,e)}function k(e){return/undefined|null|boolean|number|string/.test(t.type(e))}function M(e,n,i){if(t.isFunction(e)&&(e=[e]),e){var r,s;for(r=0;e.length>r;r++)s=e[r].apply(n,i)||s;return s}}function F(){for(var t=0;arguments.length>t;t++)if(void 0!==arguments[t])return arguments[t]}function z(t){return(t+"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#039;").replace(/"/g,"&quot;").replace(/\n/g,"<br />")}function L(t){return t.replace(/&.*?;/g,"")}function P(t){return t.charAt(0).toUpperCase()+t.slice(1)}function V(t,e){return t-e}function _(t){return 0===t%1}function G(t,e){var n,i,r,s,o=function(){var l=+new Date-s;e>l&&l>0?n=setTimeout(o,e-l):(n=null,t.apply(r,i),n||(r=i=null))};return function(){r=this,i=arguments,s=+new Date,n||(n=setTimeout(o,e))}}function A(n,i,r){var s,o,l,a,u=n[0],d=1==n.length&&"string"==typeof u;return e.isMoment(u)?(a=e.apply(null,n),Y(u,a)):C(u)||void 0===u?a=e.apply(null,n):(s=!1,o=!1,d?Pe.test(u)?(u+="-01",n=[u],s=!0,o=!0):(l=Ve.exec(u))&&(s=!l[5],o=!0):t.isArray(u)&&(o=!0),a=i||s?e.utc.apply(e,n):e.apply(null,n),s?(a._ambigTime=!0,a._ambigZone=!0):r&&(o?a._ambigZone=!0:d&&a.zone(u))),a._fullCalendar=!0,a}function N(t,n){var i,r,s=!1,o=!1,l=t.length,a=[];for(i=0;l>i;i++)r=t[i],e.isMoment(r)||(r=De.moment.parseZone(r)),s=s||r._ambigTime,o=o||r._ambigZone,a.push(r);for(i=0;l>i;i++)r=a[i],n||!s||r._ambigTime?o&&!r._ambigZone&&(a[i]=r.clone().stripZone()):a[i]=r.clone().stripTime();return a}function Y(t,e){t._ambigTime?e._ambigTime=!0:e._ambigTime&&(e._ambigTime=!1),t._ambigZone?e._ambigZone=!0:e._ambigZone&&(e._ambigZone=!1)}function O(t,e){t.year(e[0]||0).month(e[1]||0).date(e[2]||0).hours(e[3]||0).minutes(e[4]||0).seconds(e[5]||0).milliseconds(e[6]||0)}function B(t,e){return Ge.format.call(t,e)}function Z(t,e){return I(t,U(e))}function I(t,e){var n,i="";for(n=0;e.length>n;n++)i+=W(t,e[n]);return i}function W(t,e){var n,i;return"string"==typeof e?e:(n=e.token)?Ae[n]?Ae[n](t):B(t,n):e.maybe&&(i=I(t,e.maybe),i.match(/[1-9]/))?i:""}function j(t,e,n,i,r){var s;return t=De.moment.parseZone(t),e=De.moment.parseZone(e),s=(t.localeData||t.lang).call(t),n=s.longDateFormat(n)||n,i=i||" - ",X(t,e,U(n),i,r)}function X(t,e,n,i,r){var s,o,l,a,u="",d="",c="",h="",f="";for(o=0;n.length>o&&(s=$(t,e,n[o]),s!==!1);o++)u+=s;for(l=n.length-1;l>o&&(s=$(t,e,n[l]),s!==!1);l--)d=s+d;for(a=o;l>=a;a++)c+=W(t,n[a]),h+=W(e,n[a]);return(c||h)&&(f=r?h+i+c:c+i+h),u+f+d}function $(t,e,n){var i,r;return"string"==typeof n?n:(i=n.token)&&(r=Ne[i.charAt(0)],r&&t.isSame(e,r))?B(t,i):!1}function U(t){return t in Ye?Ye[t]:Ye[t]=q(t)}function q(t){for(var e,n=[],i=/\[([^\]]*)\]|\(([^\)]*)\)|(LT|(\w)\4*o?)|([^\w\[\(]+)/g;e=i.exec(t);)e[1]?n.push(e[1]):e[2]?n.push({maybe:q(e[2])}):e[3]?n.push({token:e[3]}):e[5]&&n.push(e[5]);return n}function K(){}function Q(t,e){return t||e?t&&e?t.grid===e.grid&&t.row===e.row&&t.col===e.col:!1:!0}function J(t){var e=ee(t);return"background"===e||"inverse-background"===e}function te(t){return"inverse-background"===ee(t)}function ee(t){return F((t.source||{}).rendering,t.rendering)}function ne(t){var e,n,i={};for(e=0;t.length>e;e++)n=t[e],(i[n._id]||(i[n._id]=[])).push(n);return i}function ie(t,e){return t.eventStartMS-e.eventStartMS}function re(t,e){return t.eventStartMS-e.eventStartMS||e.eventDurationMS-t.eventDurationMS||e.event.allDay-t.event.allDay||(t.event.title||"").localeCompare(e.event.title)}function se(n){var i,r,s,o,l=De.dataAttrPrefix;return l&&(l+="-"),i=n.data(l+"event")||null,i&&(i="object"==typeof i?t.extend({},i):{},r=i.start,null==r&&(r=i.time),s=i.duration,o=i.stick,delete i.start,delete i.time,delete i.duration,delete i.stick),null==r&&(r=n.data(l+"start")),null==r&&(r=n.data(l+"time")),null==s&&(s=n.data(l+"duration")),null==o&&(o=n.data(l+"stick")),r=null!=r?e.duration(r):null,s=null!=s?e.duration(s):null,o=Boolean(o),{eventProps:i,startTime:r,duration:s,stick:o}}function oe(t,e){var n,i;for(n=0;e.length>n;n++)if(i=e[n],i.leftCol<=t.rightCol&&i.rightCol>=t.leftCol)return!0;return!1}function le(t,e){return t.leftCol-e.leftCol}function ae(t){var e,n,i;if(t.sort(re),e=ue(t),de(e),n=e[0]){for(i=0;n.length>i;i++)ce(n[i]);for(i=0;n.length>i;i++)he(n[i],0,0)}}function ue(t){var e,n,i,r=[];for(e=0;t.length>e;e++){for(n=t[e],i=0;r.length>i&&fe(n,r[i]).length;i++);n.level=i,(r[i]||(r[i]=[])).push(n)}return r}function de(t){var e,n,i,r,s;for(e=0;t.length>e;e++)for(n=t[e],i=0;n.length>i;i++)for(r=n[i],r.forwardSegs=[],s=e+1;t.length>s;s++)fe(r,t[s],r.forwardSegs)}function ce(t){var e,n,i=t.forwardSegs,r=0;if(void 0===t.forwardPressure){for(e=0;i.length>e;e++)n=i[e],ce(n),r=Math.max(r,1+n.forwardPressure);t.forwardPressure=r}}function he(t,e,n){var i,r=t.forwardSegs;if(void 0===t.forwardCoord)for(r.length?(r.sort(pe),he(r[0],e+1,n),t.forwardCoord=r[0].backwardCoord):t.forwardCoord=1,t.backwardCoord=t.forwardCoord-(t.forwardCoord-n)/(e+1),i=0;r.length>i;i++)he(r[i],0,t.forwardCoord)}function fe(t,e,n){n=n||[];for(var i=0;e.length>i;i++)ge(t,e[i])&&n.push(e[i]);return n}function ge(t,e){return t.bottom>e.top&&t.top<e.bottom}function pe(t,e){return e.forwardPressure-t.forwardPressure||(t.backwardCoord||0)-(e.backwardCoord||0)||re(t,e)}function me(n,r){function o(t){return(t.locale||t.lang).call(t,te.lang).humanize()}function l(t){se?d()&&(y(),h(t)):a()}function a(){oe=te.theme?"ui":"fc",n.addClass("fc"),te.isRTL?n.addClass("fc-rtl"):n.addClass("fc-ltr"),te.theme?n.addClass("ui-widget"):n.addClass("fc-unthemed"),se=t("<div class='fc-view-container'/>").prependTo(n),ie=new ve(Q,te),re=ie.render(),re&&n.prepend(re),c(te.defaultView),te.handleWindowResize&&(ue=G(E,te.windowResizeDelay),t(window).resize(ue))}function u(){le&&le.destroyView(),ie.destroy(),se.remove(),n.removeClass("fc fc-ltr fc-rtl fc-unthemed ui-widget"),t(window).unbind("resize",ue)}function d(){return n.is(":visible")}function c(t){h(0,t)}function h(e,n){pe++,le&&n&&le.type!==n&&(ie.deactivateButton(le.type),j(),le.start&&le.destroyView(),le.el.remove(),le=null),!le&&n&&(le=f(n),le.el=t("<div class='fc-view fc-"+n+"-view' />").appendTo(se),ie.activateButton(n)),le&&(0>e?de=le.computePrevDate(de):e>0&&(de=le.computeNextDate(de)),le.start&&!e&&de.isWithin(le.intervalStart,le.intervalEnd)||d()&&(j(),le.start&&le.destroyView(),le.setDate(de),le.renderView(),X(),F(),z(),H())),X(),pe--}function f(t){var e=g(t);return new e["class"](Q,e.options,t)}function g(n){function i(e){"function"==typeof e?s=e:"object"==typeof e&&t.extend(r,e)}var r,s,l,a,u,d=te.defaultButtonText||{},c=te.buttonText||{},h=te.views||{},f=n,g=[],p=!1;if(ge[n])return ge[n];for(;f&&!s;)r={},i(Ce[f]),i(h[f]),g.unshift(r),f=r.type;return g.unshift({}),r=t.extend.apply(t,g),s?(l=r.duration||s.duration,l&&(l=e.duration(l),a=b(l),p=1===D(a,l)),p&&h[a]&&(r=t.extend({},h[a],r)),u=c[n]||(p?c[a]:null)||d[n]||(p?d[a]:null)||r.buttonText||s.buttonText||(l?o(l):null)||n,ge[n]={"class":s,options:r,buttonText:u}):void 0}function p(t){return Boolean(g(t))}function m(t){var e=g(t);return e?e.buttonText:void 0}function v(t){return d()?(t&&w(),pe++,le.updateSize(!0),pe--,!0):void 0}function y(){d()&&w()}function w(){ae="number"==typeof te.contentHeight?te.contentHeight:"number"==typeof te.height?te.height-(re?re.outerHeight(!0):0):Math.round(se.width()/Math.max(te.aspectRatio,.5))}function E(t){!pe&&t.target===window&&le.start&&v(!0)&&le.trigger("windowResize",fe)}function S(){T(),R()}function C(){d()&&(j(),le.destroyViewEvents(),le.renderViewEvents(me),X())}function T(){j(),le.destroyViewEvents(),X()}function H(){!te.lazyFetching||ce(le.start,le.end)?R():C()}function R(){he(le.start,le.end)}function k(t){me=t,C()}function M(){C()}function F(){ie.updateTitle(le.computeTitle())}function z(){var t=Q.getNow();t.isWithin(le.intervalStart,le.intervalEnd)?ie.disableButton("today"):ie.enableButton("today")}function L(t,e){t=Q.moment(t),e=e?Q.moment(e):t.hasTime()?t.clone().add(Q.defaultTimedEventDuration):t.clone().add(Q.defaultAllDayEventDuration),le.select({start:t,end:e})}function V(){le&&le.unselect()}function _(){h(-1)}function A(){h(1)}function N(){de.add(-1,"years"),h()}function Y(){de.add(1,"years"),h()}function O(){de=Q.getNow(),h()}function B(t){de=Q.moment(t),h()}function Z(t){de.add(e.duration(t)),h()}function I(t,e){var n,i;e&&p(e)||(e=e||"day",n=ie.getViewsWithButtons().join(" "),i=n.match(RegExp("\\w+"+P(e))),i||(i=n.match(/\w+Day/)),e=i?i[0]:"agendaDay"),de=t,c(e)}function W(){return de.clone()}function j(){se.css({width:"100%",height:se.height(),overflow:"hidden"})}function X(){se.css({width:"",height:"",overflow:""})}function $(){return Q}function U(){return le}function q(t,e){return void 0===e?te[t]:(("height"==t||"contentHeight"==t||"aspectRatio"==t)&&(te[t]=e,v(!0)),void 0)}function K(t,e){return te[t]?te[t].apply(e||fe,Array.prototype.slice.call(arguments,2)):void 0}var Q=this;r=r||{};var J,te=i({},Ee,r);J=te.lang in Te?Te[te.lang]:Te[Ee.lang],J&&(te=i({},Ee,J,r)),te.isRTL&&(te=i({},Ee,be,J||{},r)),Q.options=te,Q.render=l,Q.destroy=u,Q.refetchEvents=S,Q.reportEvents=k,Q.reportEventChange=M,Q.rerenderEvents=C,Q.changeView=c,Q.select=L,Q.unselect=V,Q.prev=_,Q.next=A,Q.prevYear=N,Q.nextYear=Y,Q.today=O,Q.gotoDate=B,Q.incrementDate=Z,Q.zoomTo=I,Q.getDate=W,Q.getCalendar=$,Q.getView=U,Q.option=q,Q.trigger=K,Q.isValidViewType=p,Q.getViewButtonText=m;var ee=x(s(te.lang));if(te.monthNames&&(ee._months=te.monthNames),te.monthNamesShort&&(ee._monthsShort=te.monthNamesShort),te.dayNames&&(ee._weekdays=te.dayNames),te.dayNamesShort&&(ee._weekdaysShort=te.dayNamesShort),null!=te.firstDay){var ne=x(ee._week);ne.dow=te.firstDay,ee._week=ne}Q.defaultAllDayEventDuration=e.duration(te.defaultAllDayEventDuration),Q.defaultTimedEventDuration=e.duration(te.defaultTimedEventDuration),Q.moment=function(){var t;return"local"===te.timezone?(t=De.moment.apply(null,arguments),t.hasTime()&&t.local()):t="UTC"===te.timezone?De.moment.utc.apply(null,arguments):De.moment.parseZone.apply(null,arguments),"_locale"in t?t._locale=ee:t._lang=ee,t},Q.getIsAmbigTimezone=function(){return"local"!==te.timezone&&"UTC"!==te.timezone},Q.rezoneDate=function(t){return Q.moment(t.toArray())},Q.getNow=function(){var t=te.now;return"function"==typeof t&&(t=t()),Q.moment(t)},Q.calculateWeekNumber=function(t){var e=te.weekNumberCalculation;return"function"==typeof e?e(t):"local"===e?t.week():"ISO"===e.toUpperCase()?t.isoWeek():void 0},Q.getEventEnd=function(t){return t.end?t.end.clone():Q.getDefaultEventEnd(t.allDay,t.start)},Q.getDefaultEventEnd=function(t,e){var n=e.clone();return t?n.stripTime().add(Q.defaultAllDayEventDuration):n.add(Q.defaultTimedEventDuration),Q.getIsAmbigTimezone()&&n.stripZone(),n},ye.call(Q,te);var ie,re,se,oe,le,ae,ue,de,ce=Q.isFetchNeeded,he=Q.fetchEvents,fe=n[0],ge={},pe=0,me=[];de=null!=te.defaultDate?Q.moment(te.defaultDate):Q.getNow(),Q.getSuggestedViewHeight=function(){return void 0===ae&&y(),ae},Q.isHeightAuto=function(){return"auto"===te.contentHeight||"auto"===te.height}}function ve(e,n){function i(){var e=n.header;return f=n.theme?"ui":"fc",e?g=t("<div class='fc-toolbar'/>").append(s("left")).append(s("right")).append(s("center")).append('<div class="fc-clear"/>'):void 0}function r(){g.remove()}function s(i){var r=t('<div class="fc-'+i+'"/>'),s=n.header[i];return s&&t.each(s.split(" "),function(){var i,s=t(),o=!0;t.each(this.split(","),function(i,r){var l,a,u,d,c,h,g,m,v;"title"==r?(s=s.add(t("<h2>&nbsp;</h2>")),o=!1):(e[r]?l=function(){e[r]()}:e.isValidViewType(r)&&(l=function(){e.changeView(r)},p.push(r),c=e.getViewButtonText(r)),l&&(a=w(n.themeButtonIcons,r),u=w(n.buttonIcons,r),d=w(n.defaultButtonText,r),h=w(n.buttonText,r),g=c||h?z(c||h):a&&n.theme?"<span class='ui-icon ui-icon-"+a+"'></span>":u&&!n.theme?"<span class='fc-icon fc-icon-"+u+"'></span>":z(d||r),m=["fc-"+r+"-button",f+"-button",f+"-state-default"],v=t('<button type="button" class="'+m.join(" ")+'">'+g+"</button>").click(function(){v.hasClass(f+"-state-disabled")||(l(),(v.hasClass(f+"-state-active")||v.hasClass(f+"-state-disabled"))&&v.removeClass(f+"-state-hover"))}).mousedown(function(){v.not("."+f+"-state-active").not("."+f+"-state-disabled").addClass(f+"-state-down")}).mouseup(function(){v.removeClass(f+"-state-down")}).hover(function(){v.not("."+f+"-state-active").not("."+f+"-state-disabled").addClass(f+"-state-hover")},function(){v.removeClass(f+"-state-hover").removeClass(f+"-state-down")}),s=s.add(v)))}),o&&s.first().addClass(f+"-corner-left").end().last().addClass(f+"-corner-right").end(),s.length>1?(i=t("<div/>"),o&&i.addClass("fc-button-group"),i.append(s),r.append(i)):r.append(s)}),r}function o(t){g.find("h2").text(t)}function l(t){g.find(".fc-"+t+"-button").addClass(f+"-state-active")}function a(t){g.find(".fc-"+t+"-button").removeClass(f+"-state-active")}function u(t){g.find(".fc-"+t+"-button").attr("disabled","disabled").addClass(f+"-state-disabled")}function d(t){g.find(".fc-"+t+"-button").removeAttr("disabled").removeClass(f+"-state-disabled")}function c(){return p}var h=this;h.render=i,h.destroy=r,h.updateTitle=o,h.activateButton=l,h.deactivateButton=a,h.disableButton=u,h.enableButton=d,h.getViewsWithButtons=c;var f,g=t(),p=[]}function ye(n){function i(t,e){return!B||t.clone().stripZone()<B.clone().stripZone()||e.clone().stripZone()>Z.clone().stripZone()}function r(t,e){B=t,Z=e,Q=[];var n=++U,i=$.length;q=i;for(var r=0;i>r;r++)s($[r],n)}function s(e,n){o(e,function(i){var r,s,o,l=t.isArray(e.events);if(n==U){if(i)for(r=0;i.length>r;r++)s=i[r],o=l?s:b(s,e),o&&Q.push.apply(Q,H(o));q--,q||j(Q)}})}function o(e,i){var r,s,l=De.sourceFetchers;for(r=0;l.length>r;r++){if(s=l[r].call(O,e,B.clone(),Z.clone(),n.timezone,i),s===!0)return;if("object"==typeof s)return o(s,i),void 0}var a=e.events;if(a)t.isFunction(a)?(y(),a.call(O,B.clone(),Z.clone(),n.timezone,function(t){i(t),w()})):t.isArray(a)?i(a):i();else{var u=e.url;if(u){var d,c=e.success,h=e.error,f=e.complete;d=t.isFunction(e.data)?e.data():e.data;var g=t.extend({},d||{}),p=F(e.startParam,n.startParam),m=F(e.endParam,n.endParam),v=F(e.timezoneParam,n.timezoneParam);p&&(g[p]=B.format()),m&&(g[m]=Z.format()),n.timezone&&"local"!=n.timezone&&(g[v]=n.timezone),y(),t.ajax(t.extend({},Ke,e,{data:g,success:function(e){e=e||[];var n=M(c,this,arguments);t.isArray(n)&&(e=n),i(e)},error:function(){M(h,this,arguments),i()},complete:function(){M(f,this,arguments),w()}}))}else i()}}function l(t){var e=a(t);e&&($.push(e),q++,s(e,U))}function a(e){var n,i,r=De.sourceNormalizers;if(t.isFunction(e)||t.isArray(e)?n={events:e}:"string"==typeof e?n={url:e}:"object"==typeof e&&(n=t.extend({},e)),n){for(n.className?"string"==typeof n.className&&(n.className=n.className.split(/\s+/)):n.className=[],t.isArray(n.events)&&(n.origArray=n.events,n.events=t.map(n.events,function(t){return b(t,n)})),i=0;r.length>i;i++)r[i].call(O,n);return n}}function u(e){$=t.grep($,function(t){return!d(t,e)}),Q=t.grep(Q,function(t){return!d(t.source,e)}),j(Q)}function d(t,e){return t&&e&&c(t)==c(e)}function c(t){return("object"==typeof t?t.origArray||t.googleCalendarId||t.url||t.events:null)||t}function h(t){t.start=O.moment(t.start),t.end=t.end?O.moment(t.end):null,R(t,f(t)),j(Q)}function f(e){var n={};return t.each(e,function(t,e){g(t)&&void 0!==e&&k(e)&&(n[t]=e)}),n}function g(t){return!/^_|^(id|allDay|start|end)$/.test(t)}function p(t,e){var n,i,r,s=b(t);if(s){for(n=H(s),i=0;n.length>i;i++)r=n[i],r.source||(e&&(X.events.push(r),r.source=X),Q.push(r));return j(Q),n}return[]}function m(e){var n,i;for(null==e?e=function(){return!0}:t.isFunction(e)||(n=e+"",e=function(t){return t._id==n}),Q=t.grep(Q,e,!0),i=0;$.length>i;i++)t.isArray($[i].events)&&($[i].events=t.grep($[i].events,e,!0));j(Q)}function v(e){return t.isFunction(e)?t.grep(Q,e):null!=e?(e+="",t.grep(Q,function(t){return t._id==e})):Q}function y(){K++||I("loading",null,!0,W())}function w(){--K||I("loading",null,!1,W())}function b(i,r){var s,o,l,a={};if(n.eventDataTransform&&(i=n.eventDataTransform(i)),r&&r.eventDataTransform&&(i=r.eventDataTransform(i)),t.extend(a,i),r&&(a.source=r),a._id=i._id||(void 0===i.id?"_fc"+Qe++:i.id+""),a.className=i.className?"string"==typeof i.className?i.className.split(/\s+/):i.className:[],s=i.start||i.date,o=i.end,T(s)&&(s=e.duration(s)),T(o)&&(o=e.duration(o)),i.dow||e.isDuration(s)||e.isDuration(o))a.start=s?e.duration(s):null,a.end=o?e.duration(o):null,a._recurring=!0;else{if(s&&(s=O.moment(s),!s.isValid()))return!1;o&&(o=O.moment(o),o.isValid()||(o=null)),l=i.allDay,void 0===l&&(l=F(r?r.allDayDefault:void 0,n.allDayDefault)),D(s,o,l,a)}return a}function D(t,e,n,i){i.start=t,i.end=e,i.allDay=n,C(i),we(i)}function C(t){null==t.allDay&&(t.allDay=!(t.start.hasTime()||t.end&&t.end.hasTime())),t.allDay?(t.start.stripTime(),t.end&&t.end.stripTime()):(t.start.hasTime()||(t.start=O.rezoneDate(t.start)),t.end&&!t.end.hasTime()&&(t.end=O.rezoneDate(t.end))),t.end&&!t.end.isAfter(t.start)&&(t.end=null),t.end||(t.end=n.forceEventDuration?O.getDefaultEventEnd(t.allDay,t.start):null)}function x(t){var e;return t.end||(e=t.allDay,null==e&&(e=!t.start.hasTime()),t={start:t.start,end:O.getDefaultEventEnd(e,t.start)}),t}function H(e,n,i){var r,s,o,l,a,u,d,c,h,f=[];if(n=n||B,i=i||Z,e)if(e._recurring){if(s=e.dow)for(r={},o=0;s.length>o;o++)r[s[o]]=!0;for(l=n.clone().stripTime();l.isBefore(i);)(!r||r[l.day()])&&(a=e.start,u=e.end,d=l.clone(),c=null,a&&(d=d.time(a)),u&&(c=l.clone().time(u)),h=t.extend({},e),D(d,c,!a&&!u,h),f.push(h)),l.add(1,"days")}else f.push(e);return f}function R(e,n){var i,r,s,o,l={};return n=n||{},n.start||(n.start=e.start.clone()),void 0===n.end&&(n.end=e.end?e.end.clone():null),null==n.allDay&&(n.allDay=e.allDay),C(n),i=null!==e._end&&null===n.end,r=n.allDay?S(n.start,e._start):E(n.start,e._start),!i&&n.end&&(s=E(n.end,n.start).subtract(E(e._end||O.getDefaultEventEnd(e._allDay,e._start),e._start))),t.each(n,function(t,e){g(t)&&void 0!==e&&(l[t]=e)}),o=z(v(e._id),i,n.allDay,r,s,l),{dateDelta:r,durationDelta:s,undo:o}}function z(e,n,i,r,s,o){var l=O.getIsAmbigTimezone(),a=[];return r&&!r.valueOf()&&(r=null),s&&!s.valueOf()&&(s=null),t.each(e,function(e,u){var d,c;d={start:u.start.clone(),end:u.end?u.end.clone():null,allDay:u.allDay},t.each(o,function(t){d[t]=u[t]}),c={start:u._start,end:u._end,allDay:u._allDay},n&&(c.end=null),c.allDay=i,C(c),r&&(c.start.add(r),c.end&&c.end.add(r)),s&&(c.end||(c.end=O.getDefaultEventEnd(c.allDay,c.start)),c.end.add(s)),l&&!c.allDay&&(r||s)&&(c.start.stripZone(),c.end&&c.end.stripZone()),t.extend(u,o,c),we(u),a.push(function(){t.extend(u,d),we(u)})}),function(){for(var t=0;a.length>t;t++)a[t]()}}function L(){var e,i=n.businessHours,r={className:"fc-nonbusiness",start:"09:00",end:"17:00",dow:[1,2,3,4,5],rendering:"inverse-background"},s=O.getView();return i&&(e="object"==typeof i?t.extend({},r,i):r),e?H(b(e),s.start,s.end):[]}function P(t,e){var i=e.source||{},r=F(e.constraint,i.constraint,n.eventConstraint),s=F(e.overlap,i.overlap,n.eventOverlap);return t=x(t),G(t,r,s,e)}function V(t){return G(t,n.selectConstraint,n.selectOverlap)}function _(e,n){var i,r;return n&&(i=t.extend({},n,e),r=H(b(i))[0]),r?P(e,r):(e=x(e),V(e))}function G(t,e,n,i){var r,s,o,l,a;if(t={start:t.start.clone().stripZone(),end:t.end.clone().stripZone()},null!=e){for(r=A(e),s=!1,o=0;r.length>o;o++)if(N(r[o],t)){s=!0;break}if(!s)return!1}for(o=0;Q.length>o;o++)if(l=Q[o],(!i||i._id!==l._id)&&Y(l,t)){if(n===!1)return!1;if("function"==typeof n&&!n(l,i))return!1;if(i){if(a=F(l.overlap,(l.source||{}).overlap),a===!1)return!1;if("function"==typeof a&&!a(i,l))return!1}}return!0}function A(t){return"businessHours"===t?L():"object"==typeof t?H(b(t)):v(t)}function N(t,e){var n=t.start.clone().stripZone(),i=O.getEventEnd(t).stripZone();return e.start>=n&&i>=e.end}function Y(t,e){var n=t.start.clone().stripZone(),i=O.getEventEnd(t).stripZone();return i>e.start&&e.end>n}var O=this;O.isFetchNeeded=i,O.fetchEvents=r,O.addEventSource=l,O.removeEventSource=u,O.updateEvent=h,O.renderEvent=p,O.removeEvents=m,O.clientEvents=v,O.mutateEvent=R,O.normalizeEventDateProps=C,O.ensureVisibleEventRange=x;var B,Z,I=O.trigger,W=O.getView,j=O.reportEvents,X={events:[]},$=[X],U=0,q=0,K=0,Q=[];t.each((n.events?[n.events]:[]).concat(n.eventSources||[]),function(t,e){var n=a(e);n&&$.push(n)}),O.getBusinessHoursEvents=L,O.isEventRangeAllowed=P,O.isSelectionRangeAllowed=V,O.isExternalDropRangeAllowed=_}function we(t){t._allDay=t.allDay,t._start=t.start.clone(),t._end=t.end?t.end.clone():null}var Ee={titleRangeSeparator:" — ",monthYearFormat:"MMMM YYYY",defaultTimedEventDuration:"02:00:00",defaultAllDayEventDuration:{days:1},forceEventDuration:!1,nextDayThreshold:"09:00:00",defaultView:"month",aspectRatio:1.35,header:{left:"title",center:"",right:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberTitle:"W",weekNumberCalculation:"local",lazyFetching:!0,startParam:"start",endParam:"end",timezoneParam:"timezone",timezone:!1,isRTL:!1,defaultButtonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",today:"today",month:"month",week:"week",day:"day"},buttonIcons:{prev:"left-single-arrow",next:"right-single-arrow",prevYear:"left-double-arrow",nextYear:"right-double-arrow"},theme:!1,themeButtonIcons:{prev:"circle-triangle-w",next:"circle-triangle-e",prevYear:"seek-prev",nextYear:"seek-next"},dragOpacity:.75,dragRevertDuration:500,dragScroll:!0,unselectAuto:!0,dropAccept:"*",eventLimit:!1,eventLimitText:"more",eventLimitClick:"popover",dayPopoverFormat:"LL",handleWindowResize:!0,windowResizeDelay:200},Se={dayPopoverFormat:"dddd, MMMM D"},be={header:{left:"next,prev today",center:"",right:"title"},buttonIcons:{prev:"right-single-arrow",next:"left-single-arrow",prevYear:"right-double-arrow",nextYear:"left-double-arrow"},themeButtonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w",nextYear:"seek-prev",prevYear:"seek-next"}},De=t.fullCalendar={version:"2.2.5"},Ce=De.views={};t.fn.fullCalendar=function(e){var n=Array.prototype.slice.call(arguments,1),i=this;return this.each(function(r,s){var o,l=t(s),a=l.data("fullCalendar");"string"==typeof e?a&&t.isFunction(a[e])&&(o=a[e].apply(a,n),r||(i=o),"destroy"===e&&l.removeData("fullCalendar")):a||(a=new me(l,e),l.data("fullCalendar",a),a.render())}),i};var Te=De.langs={};De.datepickerLang=function(e,n,i){var r=Te[e]||(Te[e]={});r.isRTL=i.isRTL,r.weekNumberTitle=i.weekHeader,t.each(xe,function(t,e){r[t]=e(i)}),t.datepicker&&(t.datepicker.regional[n]=t.datepicker.regional[e]=i,t.datepicker.regional.en=t.datepicker.regional[""],t.datepicker.setDefaults(i))},De.lang=function(e,n){var r,o;r=Te[e]||(Te[e]={}),n&&i(r,n),o=s(e),t.each(He,function(t,e){void 0===r[t]&&(r[t]=e(o,r))}),Ee.lang=e};var xe={defaultButtonText:function(t){return{prev:L(t.prevText),next:L(t.nextText),today:L(t.currentText)}},monthYearFormat:function(t){return t.showMonthAfterYear?"YYYY["+t.yearSuffix+"] MMMM":"MMMM YYYY["+t.yearSuffix+"]"}},He={dayOfMonthFormat:function(t,e){var n=t.longDateFormat("l");return n=n.replace(/^Y+[^\w\s]*|[^\w\s]*Y+$/g,""),e.isRTL?n+=" ddd":n="ddd "+n,n},smallTimeFormat:function(t){return t.longDateFormat("LT").replace(":mm","(:mm)").replace(/(\Wmm)$/,"($1)").replace(/\s*a$/i,"a")},extraSmallTimeFormat:function(t){return t.longDateFormat("LT").replace(":mm","(:mm)").replace(/(\Wmm)$/,"($1)").replace(/\s*a$/i,"t")},noMeridiemTimeFormat:function(t){return t.longDateFormat("LT").replace(/\s*a$/i,"")}};De.lang("en",Se),De.intersectionToSeg=y,De.applyAll=M,De.debounce=G;var Re,ke,Me,Fe=["sun","mon","tue","wed","thu","fri","sat"],ze=["year","month","week","day","hour","minute","second","millisecond"],Le={}.hasOwnProperty,Pe=/^\s*\d{4}-\d\d$/,Ve=/^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?)?$/,_e=e.fn,Ge=t.extend({},_e);De.moment=function(){return A(arguments)},De.moment.utc=function(){var t=A(arguments,!0);return t.hasTime()&&t.utc(),t},De.moment.parseZone=function(){return A(arguments,!0,!0)},_e.clone=function(){var t=Ge.clone.apply(this,arguments);return Y(this,t),this._fullCalendar&&(t._fullCalendar=!0),t},_e.time=function(t){if(!this._fullCalendar)return Ge.time.apply(this,arguments);if(null==t)return e.duration({hours:this.hours(),minutes:this.minutes(),seconds:this.seconds(),milliseconds:this.milliseconds()});this._ambigTime=!1,e.isDuration(t)||e.isMoment(t)||(t=e.duration(t));var n=0;return e.isDuration(t)&&(n=24*Math.floor(t.asDays())),this.hours(n+t.hours()).minutes(t.minutes()).seconds(t.seconds()).milliseconds(t.milliseconds())},_e.stripTime=function(){var t;return this._ambigTime||(t=this.toArray(),this.utc(),ke(this,t.slice(0,3)),this._ambigTime=!0,this._ambigZone=!0),this},_e.hasTime=function(){return!this._ambigTime},_e.stripZone=function(){var t,e;return this._ambigZone||(t=this.toArray(),e=this._ambigTime,this.utc(),ke(this,t),e&&(this._ambigTime=!0),this._ambigZone=!0),this},_e.hasZone=function(){return!this._ambigZone},_e.zone=function(t){return null!=t&&(this._ambigTime=!1,this._ambigZone=!1),Ge.zone.apply(this,arguments)},_e.local=function(){var t=this.toArray(),e=this._ambigZone;return Ge.local.apply(this,arguments),e&&Me(this,t),this},_e.format=function(){return this._fullCalendar&&arguments[0]?Z(this,arguments[0]):this._ambigTime?B(this,"YYYY-MM-DD"):this._ambigZone?B(this,"YYYY-MM-DD[T]HH:mm:ss"):Ge.format.apply(this,arguments)},_e.toISOString=function(){return this._ambigTime?B(this,"YYYY-MM-DD"):this._ambigZone?B(this,"YYYY-MM-DD[T]HH:mm:ss"):Ge.toISOString.apply(this,arguments)},_e.isWithin=function(t,e){var n=N([this,t,e]);return n[0]>=n[1]&&n[0]<n[2]},_e.isSame=function(t,e){var n;return this._fullCalendar?e?(n=N([this,t],!0),Ge.isSame.call(n[0],n[1],e)):(t=De.moment.parseZone(t),Ge.isSame.call(this,t)&&Boolean(this._ambigTime)===Boolean(t._ambigTime)&&Boolean(this._ambigZone)===Boolean(t._ambigZone)):Ge.isSame.apply(this,arguments)},t.each(["isBefore","isAfter"],function(t,e){_e[e]=function(t,n){var i;return this._fullCalendar?(i=N([this,t]),Ge[e].call(i[0],i[1],n)):Ge[e].apply(this,arguments)}}),Re="_d"in e()&&"updateOffset"in e,ke=Re?function(t,n){t._d.setTime(Date.UTC.apply(Date,n)),e.updateOffset(t,!1)}:O,Me=Re?function(t,n){t._d.setTime(+new Date(n[0]||0,n[1]||0,n[2]||0,n[3]||0,n[4]||0,n[5]||0,n[6]||0)),e.updateOffset(t,!1)}:O;var Ae={t:function(t){return B(t,"a").charAt(0)},T:function(t){return B(t,"A").charAt(0)}};De.formatRange=j;var Ne={Y:"year",M:"month",D:"day",d:"day",A:"second",a:"second",T:"second",t:"second",H:"second",h:"second",m:"second",s:"second"},Ye={};De.Class=K,K.extend=function(t){var e,n=this;return t=t||{},R(t,"constructor")&&(e=t.constructor),"function"!=typeof e&&(e=t.constructor=function(){n.apply(this,arguments)}),e.prototype=x(n.prototype),H(t,e.prototype),H(n,e),e},K.mixin=function(t){H(t.prototype||t,this.prototype)};var Oe=K.extend({isHidden:!0,options:null,el:null,documentMousedownProxy:null,margin:10,constructor:function(t){this.options=t||{}},show:function(){this.isHidden&&(this.el||this.render(),this.el.show(),this.position(),this.isHidden=!1,this.trigger("show"))},hide:function(){this.isHidden||(this.el.hide(),this.isHidden=!0,this.trigger("hide"))},render:function(){var e=this,n=this.options;this.el=t('<div class="fc-popover"/>').addClass(n.className||"").css({top:0,left:0}).append(n.content).appendTo(n.parentEl),this.el.on("click",".fc-close",function(){e.hide()}),n.autoHide&&t(document).on("mousedown",this.documentMousedownProxy=t.proxy(this,"documentMousedown"))},documentMousedown:function(e){this.el&&!t(e.target).closest(this.el).length&&this.hide()},destroy:function(){this.hide(),this.el&&(this.el.remove(),this.el=null),t(document).off("mousedown",this.documentMousedownProxy)},position:function(){var e,n,i,r,s,o=this.options,l=this.el.offsetParent().offset(),a=this.el.outerWidth(),u=this.el.outerHeight(),d=t(window),c=p(this.el);r=o.top||0,s=void 0!==o.left?o.left:void 0!==o.right?o.right-a:0,c.is(window)||c.is(document)?(c=d,e=0,n=0):(i=c.offset(),e=i.top,n=i.left),e+=d.scrollTop(),n+=d.scrollLeft(),o.viewportConstrain!==!1&&(r=Math.min(r,e+c.outerHeight()-u-this.margin),r=Math.max(r,e+this.margin),s=Math.min(s,n+c.outerWidth()-a-this.margin),s=Math.max(s,n+this.margin)),this.el.css({top:r-l.top,left:s-l.left})},trigger:function(t){this.options[t]&&this.options[t].apply(this,Array.prototype.slice.call(arguments,1))}}),Be=K.extend({grid:null,rowCoords:null,colCoords:null,containerEl:null,minX:null,maxX:null,minY:null,maxY:null,constructor:function(t){this.grid=t},build:function(){this.rowCoords=this.grid.computeRowCoords(),this.colCoords=this.grid.computeColCoords(),this.computeBounds()},clear:function(){this.rowCoords=null,this.colCoords=null},getCell:function(t,e){var n,i,r,s=this.rowCoords,o=this.colCoords,l=null,a=null;if(this.inBounds(t,e)){for(n=0;s.length>n;n++)if(i=s[n],e>=i.top&&i.bottom>e){l=n;break}for(n=0;o.length>n;n++)if(i=o[n],t>=i.left&&i.right>t){a=n;break}if(null!==l&&null!==a)return r=this.grid.getCell(l,a),r.grid=this.grid,r}return null},computeBounds:function(){var t;this.containerEl&&(t=this.containerEl.offset(),this.minX=t.left,this.maxX=t.left+this.containerEl.outerWidth(),this.minY=t.top,this.maxY=t.top+this.containerEl.outerHeight()) +},inBounds:function(t,e){return this.containerEl?t>=this.minX&&this.maxX>t&&e>=this.minY&&this.maxY>e:!0}}),Ze=K.extend({coordMaps:null,constructor:function(t){this.coordMaps=t},build:function(){var t,e=this.coordMaps;for(t=0;e.length>t;t++)e[t].build()},getCell:function(t,e){var n,i=this.coordMaps,r=null;for(n=0;i.length>n&&!r;n++)r=i[n].getCell(t,e);return r},clear:function(){var t,e=this.coordMaps;for(t=0;e.length>t;t++)e[t].clear()}}),Ie=K.extend({coordMap:null,options:null,isListening:!1,isDragging:!1,origCell:null,cell:null,mouseX0:null,mouseY0:null,mousemoveProxy:null,mouseupProxy:null,scrollEl:null,scrollBounds:null,scrollTopVel:null,scrollLeftVel:null,scrollIntervalId:null,scrollHandlerProxy:null,scrollSensitivity:30,scrollSpeed:200,scrollIntervalMs:50,constructor:function(t,e){this.coordMap=t,this.options=e||{}},mousedown:function(t){v(t)&&(t.preventDefault(),this.startListening(t),this.options.distance||this.startDrag(t))},startListening:function(e){var n,i;this.isListening||(e&&this.options.scroll&&(n=p(t(e.target)),n.is(window)||n.is(document)||(this.scrollEl=n,this.scrollHandlerProxy=G(t.proxy(this,"scrollHandler"),100),this.scrollEl.on("scroll",this.scrollHandlerProxy))),this.computeCoords(),e&&(i=this.getCell(e),this.origCell=i,this.mouseX0=e.pageX,this.mouseY0=e.pageY),t(document).on("mousemove",this.mousemoveProxy=t.proxy(this,"mousemove")).on("mouseup",this.mouseupProxy=t.proxy(this,"mouseup")).on("selectstart",this.preventDefault),this.isListening=!0,this.trigger("listenStart",e))},computeCoords:function(){this.coordMap.build(),this.computeScrollBounds()},mousemove:function(t){var e,n;this.isDragging||(e=this.options.distance||1,n=Math.pow(t.pageX-this.mouseX0,2)+Math.pow(t.pageY-this.mouseY0,2),n>=e*e&&this.startDrag(t)),this.isDragging&&this.drag(t)},startDrag:function(t){var e;this.isListening||this.startListening(),this.isDragging||(this.isDragging=!0,this.trigger("dragStart",t),e=this.getCell(t),e&&this.cellOver(e))},drag:function(t){var e;this.isDragging&&(e=this.getCell(t),Q(e,this.cell)||(this.cell&&this.cellOut(),e&&this.cellOver(e)),this.dragScroll(t))},cellOver:function(t){this.cell=t,this.trigger("cellOver",t,Q(t,this.origCell))},cellOut:function(){this.cell&&(this.trigger("cellOut",this.cell),this.cell=null)},mouseup:function(t){this.stopDrag(t),this.stopListening(t)},stopDrag:function(t){this.isDragging&&(this.stopScrolling(),this.trigger("dragStop",t),this.isDragging=!1)},stopListening:function(e){this.isListening&&(this.scrollEl&&(this.scrollEl.off("scroll",this.scrollHandlerProxy),this.scrollHandlerProxy=null),t(document).off("mousemove",this.mousemoveProxy).off("mouseup",this.mouseupProxy).off("selectstart",this.preventDefault),this.mousemoveProxy=null,this.mouseupProxy=null,this.isListening=!1,this.trigger("listenStop",e),this.origCell=this.cell=null,this.coordMap.clear())},getCell:function(t){return this.coordMap.getCell(t.pageX,t.pageY)},trigger:function(t){this.options[t]&&this.options[t].apply(this,Array.prototype.slice.call(arguments,1))},preventDefault:function(t){t.preventDefault()},computeScrollBounds:function(){var t,e=this.scrollEl;e&&(t=e.offset(),this.scrollBounds={top:t.top,left:t.left,bottom:t.top+e.outerHeight(),right:t.left+e.outerWidth()})},dragScroll:function(t){var e,n,i,r,s=this.scrollSensitivity,o=this.scrollBounds,l=0,a=0;o&&(e=(s-(t.pageY-o.top))/s,n=(s-(o.bottom-t.pageY))/s,i=(s-(t.pageX-o.left))/s,r=(s-(o.right-t.pageX))/s,e>=0&&1>=e?l=-1*e*this.scrollSpeed:n>=0&&1>=n&&(l=n*this.scrollSpeed),i>=0&&1>=i?a=-1*i*this.scrollSpeed:r>=0&&1>=r&&(a=r*this.scrollSpeed)),this.setScrollVel(l,a)},setScrollVel:function(e,n){this.scrollTopVel=e,this.scrollLeftVel=n,this.constrainScrollVel(),!this.scrollTopVel&&!this.scrollLeftVel||this.scrollIntervalId||(this.scrollIntervalId=setInterval(t.proxy(this,"scrollIntervalFunc"),this.scrollIntervalMs))},constrainScrollVel:function(){var t=this.scrollEl;0>this.scrollTopVel?0>=t.scrollTop()&&(this.scrollTopVel=0):this.scrollTopVel>0&&t.scrollTop()+t[0].clientHeight>=t[0].scrollHeight&&(this.scrollTopVel=0),0>this.scrollLeftVel?0>=t.scrollLeft()&&(this.scrollLeftVel=0):this.scrollLeftVel>0&&t.scrollLeft()+t[0].clientWidth>=t[0].scrollWidth&&(this.scrollLeftVel=0)},scrollIntervalFunc:function(){var t=this.scrollEl,e=this.scrollIntervalMs/1e3;this.scrollTopVel&&t.scrollTop(t.scrollTop()+this.scrollTopVel*e),this.scrollLeftVel&&t.scrollLeft(t.scrollLeft()+this.scrollLeftVel*e),this.constrainScrollVel(),this.scrollTopVel||this.scrollLeftVel||this.stopScrolling()},stopScrolling:function(){this.scrollIntervalId&&(clearInterval(this.scrollIntervalId),this.scrollIntervalId=null,this.computeCoords())},scrollHandler:function(){this.scrollIntervalId||this.computeCoords()}}),We=K.extend({options:null,sourceEl:null,el:null,parentEl:null,top0:null,left0:null,mouseY0:null,mouseX0:null,topDelta:null,leftDelta:null,mousemoveProxy:null,isFollowing:!1,isHidden:!1,isAnimating:!1,constructor:function(e,n){this.options=n=n||{},this.sourceEl=e,this.parentEl=n.parentEl?t(n.parentEl):e.parent()},start:function(e){this.isFollowing||(this.isFollowing=!0,this.mouseY0=e.pageY,this.mouseX0=e.pageX,this.topDelta=0,this.leftDelta=0,this.isHidden||this.updatePosition(),t(document).on("mousemove",this.mousemoveProxy=t.proxy(this,"mousemove")))},stop:function(e,n){function i(){this.isAnimating=!1,r.destroyEl(),this.top0=this.left0=null,n&&n()}var r=this,s=this.options.revertDuration;this.isFollowing&&!this.isAnimating&&(this.isFollowing=!1,t(document).off("mousemove",this.mousemoveProxy),e&&s&&!this.isHidden?(this.isAnimating=!0,this.el.animate({top:this.top0,left:this.left0},{duration:s,complete:i})):i())},getEl:function(){var t=this.el;return t||(this.sourceEl.width(),t=this.el=this.sourceEl.clone().css({position:"absolute",visibility:"",display:this.isHidden?"none":"",margin:0,right:"auto",bottom:"auto",width:this.sourceEl.width(),height:this.sourceEl.height(),opacity:this.options.opacity||"",zIndex:this.options.zIndex}).appendTo(this.parentEl)),t},destroyEl:function(){this.el&&(this.el.remove(),this.el=null)},updatePosition:function(){var t,e;this.getEl(),null===this.top0&&(this.sourceEl.width(),t=this.sourceEl.offset(),e=this.el.offsetParent().offset(),this.top0=t.top-e.top,this.left0=t.left-e.left),this.el.css({top:this.top0+this.topDelta,left:this.left0+this.leftDelta})},mousemove:function(t){this.topDelta=t.pageY-this.mouseY0,this.leftDelta=t.pageX-this.mouseX0,this.isHidden||this.updatePosition()},hide:function(){this.isHidden||(this.isHidden=!0,this.el&&this.el.hide())},show:function(){this.isHidden&&(this.isHidden=!1,this.updatePosition(),this.getEl().show())}}),je=K.extend({view:null,isRTL:null,cellHtml:"<td/>",constructor:function(t){this.view=t,this.isRTL=t.opt("isRTL")},rowHtml:function(t,e){var n,i,r=this.getHtmlRenderer("cell",t),s="";for(e=e||0,n=0;this.colCnt>n;n++)i=this.getCell(e,n),s+=r(i);return s=this.bookendCells(s,t,e),"<tr>"+s+"</tr>"},bookendCells:function(t,e,n){var i=this.getHtmlRenderer("intro",e)(n||0),r=this.getHtmlRenderer("outro",e)(n||0),s=this.isRTL?r:i,o=this.isRTL?i:r;return"string"==typeof t?s+t+o:t.prepend(s).append(o)},getHtmlRenderer:function(t,e){var n,i,r,s,o=this.view;return n=t+"Html",e&&(i=e+P(t)+"Html"),i&&(s=o[i])?r=o:i&&(s=this[i])?r=this:(s=o[n])?r=o:(s=this[n])&&(r=this),"function"==typeof s?function(){return s.apply(r,arguments)||""}:function(){return s||""}}}),Xe=De.Grid=je.extend({start:null,end:null,rowCnt:0,colCnt:0,rowData:null,colData:null,el:null,coordMap:null,elsByFill:null,documentDragStartProxy:null,colHeadFormat:null,eventTimeFormat:null,displayEventEnd:null,constructor:function(){je.apply(this,arguments),this.coordMap=new Be(this),this.elsByFill={},this.documentDragStartProxy=t.proxy(this,"documentDragStart")},render:function(){this.bindHandlers()},destroy:function(){this.unbindHandlers()},computeColHeadFormat:function(){},computeEventTimeFormat:function(){return this.view.opt("smallTimeFormat")},computeDisplayEventEnd:function(){return!1},setRange:function(t){var e=this.view;this.start=t.start.clone(),this.end=t.end.clone(),this.rowData=[],this.colData=[],this.updateCells(),this.colHeadFormat=e.opt("columnFormat")||this.computeColHeadFormat(),this.eventTimeFormat=e.opt("timeFormat")||this.computeEventTimeFormat(),this.displayEventEnd=e.opt("displayEventEnd"),null==this.displayEventEnd&&(this.displayEventEnd=this.computeDisplayEventEnd())},updateCells:function(){},rangeToSegs:function(){},getCell:function(e,n){var i;return null==n&&("number"==typeof e?(n=e%this.colCnt,e=Math.floor(e/this.colCnt)):(n=e.col,e=e.row)),i={row:e,col:n},t.extend(i,this.getRowData(e),this.getColData(n)),t.extend(i,this.computeCellRange(i)),i},computeCellRange:function(){},getRowData:function(t){return this.rowData[t]||{}},getColData:function(t){return this.colData[t]||{}},getRowEl:function(){},getColEl:function(){},getCellDayEl:function(t){return this.getColEl(t.col)||this.getRowEl(t.row)},computeRowCoords:function(){var t,e,n,i=[];for(t=0;this.rowCnt>t;t++)e=this.getRowEl(t),n={top:e.offset().top},t>0&&(i[t-1].bottom=n.top),i.push(n);return n.bottom=n.top+e.outerHeight(),i},computeColCoords:function(){var t,e,n,i=[];for(t=0;this.colCnt>t;t++)e=this.getColEl(t),n={left:e.offset().left},t>0&&(i[t-1].right=n.left),i.push(n);return n.right=n.left+e.outerWidth(),i},bindHandlers:function(){var e=this;this.el.on("mousedown",function(n){t(n.target).is(".fc-event-container *, .fc-more")||t(n.target).closest(".fc-popover").length||e.dayMousedown(n)}),this.bindSegHandlers(),t(document).on("dragstart",this.documentDragStartProxy)},unbindHandlers:function(){t(document).off("dragstart",this.documentDragStartProxy)},dayMousedown:function(t){var e,n,i=this,r=this.view,s=r.opt("selectable"),o=new Ie(this.coordMap,{scroll:r.opt("dragScroll"),dragStart:function(){r.unselect()},cellOver:function(t,r){var l=o.origCell;l&&(e=r?t:null,s&&(n=i.computeSelection(l,t),n?i.renderSelection(n):a()))},cellOut:function(){e=null,n=null,i.destroySelection(),u()},listenStop:function(t){e&&r.trigger("dayClick",i.getCellDayEl(e),e.start,t),n&&r.reportSelection(n,t),u()}});o.mousedown(t)},renderRangeHelper:function(t,e){var n;n=e?x(e.event):{},n.start=t.start.clone(),n.end=t.end?t.end.clone():null,n.allDay=null,this.view.calendar.normalizeEventDateProps(n),n.className=(n.className||[]).concat("fc-helper"),e||(n.editable=!1),this.renderHelper(n,e)},renderHelper:function(){},destroyHelper:function(){},renderSelection:function(t){this.renderHighlight(t)},destroySelection:function(){this.destroyHighlight()},computeSelection:function(t,e){var n,i=[t.start,t.end,e.start,e.end];return i.sort(V),n={start:i[0].clone(),end:i[3].clone()},this.view.calendar.isSelectionRangeAllowed(n)?n:null},renderHighlight:function(t){this.renderFill("highlight",this.rangeToSegs(t))},destroyHighlight:function(){this.destroyFill("highlight")},highlightSegClasses:function(){return["fc-highlight"]},renderFill:function(){},destroyFill:function(t){var e=this.elsByFill[t];e&&(e.remove(),delete this.elsByFill[t])},renderFillSegEls:function(e,n){var i,r=this,s=this[e+"SegEl"],o="",l=[];if(n.length){for(i=0;n.length>i;i++)o+=this.fillSegHtml(e,n[i]);t(o).each(function(e,i){var o=n[e],a=t(i);s&&(a=s.call(r,o,a)),a&&(a=t(a),a.is(r.fillSegTag)&&(o.el=a,l.push(o)))})}return l},fillSegTag:"div",fillSegHtml:function(t,e){var n=this[t+"SegClasses"],i=this[t+"SegStyles"],r=n?n.call(this,e):[],s=i?i.call(this,e):"";return"<"+this.fillSegTag+(r.length?' class="'+r.join(" ")+'"':"")+(s?' style="'+s+'"':"")+" />"},headHtml:function(){return'<div class="fc-row '+this.view.widgetHeaderClass+'">'+"<table>"+"<thead>"+this.rowHtml("head")+"</thead>"+"</table>"+"</div>"},headCellHtml:function(t){var e=this.view,n=t.start;return'<th class="fc-day-header '+e.widgetHeaderClass+" fc-"+Fe[n.day()]+'">'+z(n.format(this.colHeadFormat))+"</th>"},bgCellHtml:function(t){var e=this.view,n=t.start,i=this.getDayClasses(n);return i.unshift("fc-day",e.widgetContentClass),'<td class="'+i.join(" ")+'"'+' data-date="'+n.format("YYYY-MM-DD")+'"'+"></td>"},getDayClasses:function(t){var e=this.view,n=e.calendar.getNow().stripTime(),i=["fc-"+Fe[t.day()]];return"month"===e.name&&t.month()!=e.intervalStart.month()&&i.push("fc-other-month"),t.isSame(n,"day")?i.push("fc-today",e.highlightStateClass):n>t?i.push("fc-past"):i.push("fc-future"),i}});Xe.mixin({mousedOverSeg:null,isDraggingSeg:!1,isResizingSeg:!1,segs:null,renderEvents:function(t){var e,n,i=this.eventsToSegs(t),r=[],s=[];for(e=0;i.length>e;e++)n=i[e],J(n.event)?r.push(n):s.push(n);r=this.renderBgSegs(r)||r,s=this.renderFgSegs(s)||s,this.segs=r.concat(s)},destroyEvents:function(){this.triggerSegMouseout(),this.destroyFgSegs(),this.destroyBgSegs(),this.segs=null},getEventSegs:function(){return this.segs||[]},renderFgSegs:function(){},destroyFgSegs:function(){},renderFgSegEls:function(e,n){var i,r=this.view,s="",o=[];if(e.length){for(i=0;e.length>i;i++)s+=this.fgSegHtml(e[i],n);t(s).each(function(n,i){var s=e[n],l=r.resolveEventEl(s.event,t(i));l&&(l.data("fc-seg",s),s.el=l,o.push(s))})}return o},fgSegHtml:function(){},renderBgSegs:function(t){return this.renderFill("bgEvent",t)},destroyBgSegs:function(){this.destroyFill("bgEvent")},bgEventSegEl:function(t,e){return this.view.resolveEventEl(t.event,e)},bgEventSegClasses:function(t){var e=t.event,n=e.source||{};return["fc-bgevent"].concat(e.className,n.className||[])},bgEventSegStyles:function(t){var e=this.view,n=t.event,i=n.source||{},r=n.color,s=i.color,o=e.opt("eventColor"),l=n.backgroundColor||r||i.backgroundColor||s||e.opt("eventBackgroundColor")||o;return l?"background-color:"+l:""},businessHoursSegClasses:function(){return["fc-nonbusiness","fc-bgevent"]},bindSegHandlers:function(){var e=this,n=this.view;t.each({mouseenter:function(t,n){e.triggerSegMouseover(t,n)},mouseleave:function(t,n){e.triggerSegMouseout(t,n)},click:function(t,e){return n.trigger("eventClick",this,t.event,e)},mousedown:function(i,r){t(r.target).is(".fc-resizer")&&n.isEventResizable(i.event)?e.segResizeMousedown(i,r):n.isEventDraggable(i.event)&&e.segDragMousedown(i,r)}},function(n,i){e.el.on(n,".fc-event-container > *",function(n){var r=t(this).data("fc-seg");return!r||e.isDraggingSeg||e.isResizingSeg?void 0:i.call(this,r,n)})})},triggerSegMouseover:function(t,e){this.mousedOverSeg||(this.mousedOverSeg=t,this.view.trigger("eventMouseover",t.el[0],t.event,e))},triggerSegMouseout:function(t,e){e=e||{},this.mousedOverSeg&&(t=t||this.mousedOverSeg,this.mousedOverSeg=null,this.view.trigger("eventMouseout",t.el[0],t.event,e))},segDragMousedown:function(t,e){var n,i=this,r=this.view,s=t.el,o=t.event,l=new We(t.el,{parentEl:r.el,opacity:r.opt("dragOpacity"),revertDuration:r.opt("dragRevertDuration"),zIndex:2}),d=new Ie(r.coordMap,{distance:5,scroll:r.opt("dragScroll"),listenStart:function(t){l.hide(),l.start(t)},dragStart:function(e){i.triggerSegMouseout(t,e),i.isDraggingSeg=!0,r.hideEvent(o),r.trigger("eventDragStart",s[0],o,e,{})},cellOver:function(e,s){var u=t.cell||d.origCell;n=i.computeEventDrop(u,e,o),n?(r.renderDrag(n,t)?l.hide():l.show(),s&&(n=null)):(l.show(),a())},cellOut:function(){n=null,r.destroyDrag(),l.show(),u()},dragStop:function(t){l.stop(!n,function(){i.isDraggingSeg=!1,r.destroyDrag(),r.showEvent(o),r.trigger("eventDragStop",s[0],o,t,{}),n&&r.reportEventDrop(o,n,s,t)}),u()},listenStop:function(){l.stop()}});d.mousedown(e)},computeEventDrop:function(t,e,n){var i,r,s,o,l,a=t.start,u=e.start;return a.hasTime()===u.hasTime()?(i=E(u,a),r=n.start.clone().add(i),s=null===n.end?null:n.end.clone().add(i),o=n.allDay):(r=u.clone(),s=null,o=!u.hasTime()),l={start:r,end:s,allDay:o},this.view.calendar.isEventRangeAllowed(l,n)?l:null},documentDragStart:function(e,n){var i,r,s=this.view;s.opt("droppable")&&(i=t(e.target),r=s.opt("dropAccept"),(t.isFunction(r)?r.call(i[0],i):i.is(r))&&this.startExternalDrag(i,e,n))},startExternalDrag:function(e,n){var i,r,s=this,o=se(e);i=new Ie(this.coordMap,{cellOver:function(t){r=s.computeExternalDrop(t,o),r?s.renderDrag(r):a()},cellOut:function(){r=null,s.destroyDrag(),u()}}),t(document).one("dragstop",function(t,n){s.destroyDrag(),u(),r&&s.view.reportExternalDrop(o,r,e,t,n)}),i.startDrag(n)},computeExternalDrop:function(t,e){var n={start:t.start.clone(),end:null};return e.startTime&&!n.start.hasTime()&&n.start.time(e.startTime),e.duration&&(n.end=n.start.clone().add(e.duration)),this.view.calendar.isExternalDropRangeAllowed(n,e.eventProps)?n:null},renderDrag:function(){},destroyDrag:function(){},segResizeMousedown:function(t,e){function n(){s.destroyEventResize(),o.showEvent(c),u()}var i,r,s=this,o=this.view,l=o.calendar,d=t.el,c=t.event,h=c.start,f=l.getEventEnd(c);r=new Ie(this.coordMap,{distance:5,scroll:o.opt("dragScroll"),dragStart:function(e){s.triggerSegMouseout(t,e),s.isResizingSeg=!0,o.trigger("eventResizeStart",d[0],c,e,{})},cellOver:function(e){i=e.end,i.isAfter(h)||(i=h.clone().add(E(e.end,e.start))),i.isSame(f)?i=null:l.isEventRangeAllowed({start:h,end:i},c)?(s.renderEventResize({start:h,end:i},t),o.hideEvent(c)):(i=null,a())},cellOut:function(){i=null,n()},dragStop:function(t){s.isResizingSeg=!1,n(),o.trigger("eventResizeStop",d[0],c,t,{}),i&&o.reportEventResize(c,i,d,t)}}),r.mousedown(e)},renderEventResize:function(){},destroyEventResize:function(){},getEventTimeText:function(t,e){return e=e||this.eventTimeFormat,t.end&&this.displayEventEnd?this.view.formatRange(t,e):t.start.format(e)},getSegClasses:function(t,e,n){var i=t.event,r=["fc-event",t.isStart?"fc-start":"fc-not-start",t.isEnd?"fc-end":"fc-not-end"].concat(i.className,i.source?i.source.className:[]);return e&&r.push("fc-draggable"),n&&r.push("fc-resizable"),r},getEventSkinCss:function(t){var e=this.view,n=t.source||{},i=t.color,r=n.color,s=e.opt("eventColor"),o=t.backgroundColor||i||n.backgroundColor||r||e.opt("eventBackgroundColor")||s,l=t.borderColor||i||n.borderColor||r||e.opt("eventBorderColor")||s,a=t.textColor||n.textColor||e.opt("eventTextColor"),u=[];return o&&u.push("background-color:"+o),l&&u.push("border-color:"+l),a&&u.push("color:"+a),u.join(";")},eventsToSegs:function(t,e){var n,i=this.eventsToRanges(t),r=[];for(n=0;i.length>n;n++)r.push.apply(r,this.eventRangeToSegs(i[n],e));return r},eventsToRanges:function(e){var n=this,i=ne(e),r=[];return t.each(i,function(t,e){e.length&&r.push.apply(r,te(e[0])?n.eventsToInverseRanges(e):n.eventsToNormalRanges(e))}),r},eventsToNormalRanges:function(t){var e,n,i,r,s=this.view.calendar,o=[];for(e=0;t.length>e;e++)n=t[e],i=n.start.clone().stripZone(),r=s.getEventEnd(n).stripZone(),o.push({event:n,start:i,end:r,eventStartMS:+i,eventDurationMS:r-i});return o},eventsToInverseRanges:function(t){var e,n,i=this.view,r=i.start.clone().stripZone(),s=i.end.clone().stripZone(),o=this.eventsToNormalRanges(t),l=[],a=t[0],u=r;for(o.sort(ie),e=0;o.length>e;e++)n=o[e],n.start>u&&l.push({event:a,start:u,end:n.start}),u=n.end;return s>u&&l.push({event:a,start:u,end:s}),l},eventRangeToSegs:function(t,e){var n,i,r;for(n=e?e(t):this.rangeToSegs(t),i=0;n.length>i;i++)r=n[i],r.event=t.event,r.eventStartMS=t.eventStartMS,r.eventDurationMS=t.eventDurationMS;return n}}),De.compareSegs=re,De.dataAttrPrefix="";var $e=Xe.extend({numbersVisible:!1,bottomCoordPadding:0,breakOnWeeks:null,cellDates:null,dayToCellOffsets:null,rowEls:null,dayEls:null,helperEls:null,render:function(t){var e,n,i,r=this.view,s=this.rowCnt,o=this.colCnt,l=s*o,a="";for(e=0;s>e;e++)a+=this.dayRowHtml(e,t);for(this.el.html(a),this.rowEls=this.el.find(".fc-row"),this.dayEls=this.el.find(".fc-day"),n=0;l>n;n++)i=this.getCell(n),r.trigger("dayRender",null,i.start,this.dayEls.eq(n));Xe.prototype.render.call(this)},destroy:function(){this.destroySegPopover(),Xe.prototype.destroy.call(this)},dayRowHtml:function(t,e){var n=this.view,i=["fc-row","fc-week",n.widgetContentClass];return e&&i.push("fc-rigid"),'<div class="'+i.join(" ")+'">'+'<div class="fc-bg">'+"<table>"+this.rowHtml("day",t)+"</table>"+"</div>"+'<div class="fc-content-skeleton">'+"<table>"+(this.numbersVisible?"<thead>"+this.rowHtml("number",t)+"</thead>":"")+"</table>"+"</div>"+"</div>"},dayCellHtml:function(t){return this.bgCellHtml(t)},computeColHeadFormat:function(){return this.rowCnt>1?"ddd":this.colCnt>1?this.view.opt("dayOfMonthFormat"):"dddd"},computeEventTimeFormat:function(){return this.view.opt("extraSmallTimeFormat")},computeDisplayEventEnd:function(){return 1==this.colCnt},updateCells:function(){var t,e,n,i;if(this.updateCellDates(),t=this.cellDates,this.breakOnWeeks){for(e=t[0].day(),i=1;t.length>i&&t[i].day()!=e;i++);n=Math.ceil(t.length/i)}else n=1,i=t.length;this.rowCnt=n,this.colCnt=i},updateCellDates:function(){for(var t=this.view,e=this.start.clone(),n=[],i=-1,r=[];e.isBefore(this.end);)t.isHiddenDay(e)?r.push(i+.5):(i++,r.push(i),n.push(e.clone())),e.add(1,"days");this.cellDates=n,this.dayToCellOffsets=r},computeCellRange:function(t){var e=this.colCnt,n=t.row*e+(this.isRTL?e-t.col-1:t.col),i=this.cellDates[n].clone(),r=i.clone().add(1,"day");return{start:i,end:r}},getRowEl:function(t){return this.rowEls.eq(t)},getColEl:function(t){return this.dayEls.eq(t)},getCellDayEl:function(t){return this.dayEls.eq(t.row*this.colCnt+t.col)},computeRowCoords:function(){var t=Xe.prototype.computeRowCoords.call(this);return t[t.length-1].bottom+=this.bottomCoordPadding,t},rangeToSegs:function(t){var e,n,i,r,s,o,l,a,u,d,c=this.isRTL,h=this.rowCnt,f=this.colCnt,g=[];for(t=this.view.computeDayRange(t),e=this.dateToCellOffset(t.start),n=this.dateToCellOffset(t.end.subtract(1,"days")),i=0;h>i;i++)r=i*f,s=r+f-1,a=Math.max(r,e),u=Math.min(s,n),a=Math.ceil(a),u=Math.floor(u),u>=a&&(o=a===e,l=u===n,a-=r,u-=r,d={row:i,isStart:o,isEnd:l},c?(d.leftCol=f-u-1,d.rightCol=f-a-1):(d.leftCol=a,d.rightCol=u),g.push(d));return g},dateToCellOffset:function(t){var e=this.dayToCellOffsets,n=t.diff(this.start,"days");return 0>n?e[0]-1:n>=e.length?e[e.length-1]+1:e[n]},renderDrag:function(t,e){var n;return this.renderHighlight(this.view.calendar.ensureVisibleEventRange(t)),e&&!e.el.closest(this.el).length?(this.renderRangeHelper(t,e),n=this.view.opt("dragOpacity"),void 0!==n&&this.helperEls.css("opacity",n),!0):void 0},destroyDrag:function(){this.destroyHighlight(),this.destroyHelper()},renderEventResize:function(t,e){this.renderHighlight(t),this.renderRangeHelper(t,e)},destroyEventResize:function(){this.destroyHighlight(),this.destroyHelper()},renderHelper:function(e,n){var i,r=[],s=this.eventsToSegs([e]);s=this.renderFgSegEls(s),i=this.renderSegRows(s),this.rowEls.each(function(e,s){var o,l=t(s),a=t('<div class="fc-helper-skeleton"><table/></div>');o=n&&n.row===e?n.el.position().top:l.find(".fc-content-skeleton tbody").position().top,a.css("top",o).find("table").append(i[e].tbodyEl),l.append(a),r.push(a[0])}),this.helperEls=t(r)},destroyHelper:function(){this.helperEls&&(this.helperEls.remove(),this.helperEls=null)},fillSegTag:"td",renderFill:function(e,n){var i,r,s,o=[];for(n=this.renderFillSegEls(e,n),i=0;n.length>i;i++)r=n[i],s=this.renderFillRow(e,r),this.rowEls.eq(r.row).append(s),o.push(s[0]);return this.elsByFill[e]=t(o),n},renderFillRow:function(e,n){var i,r,s=this.colCnt,o=n.leftCol,l=n.rightCol+1;return i=t('<div class="fc-'+e.toLowerCase()+'-skeleton">'+"<table><tr/></table>"+"</div>"),r=i.find("tr"),o>0&&r.append('<td colspan="'+o+'"/>'),r.append(n.el.attr("colspan",l-o)),s>l&&r.append('<td colspan="'+(s-l)+'"/>'),this.bookendCells(r,e),i}});$e.mixin({rowStructs:null,destroyEvents:function(){this.destroySegPopover(),Xe.prototype.destroyEvents.apply(this,arguments)},getEventSegs:function(){return Xe.prototype.getEventSegs.call(this).concat(this.popoverSegs||[])},renderBgSegs:function(e){var n=t.grep(e,function(t){return t.event.allDay});return Xe.prototype.renderBgSegs.call(this,n)},renderFgSegs:function(e){var n;return e=this.renderFgSegEls(e),n=this.rowStructs=this.renderSegRows(e),this.rowEls.each(function(e,i){t(i).find(".fc-content-skeleton > table").append(n[e].tbodyEl)}),e},destroyFgSegs:function(){for(var t,e=this.rowStructs||[];t=e.pop();)t.tbodyEl.remove();this.rowStructs=null},renderSegRows:function(t){var e,n,i=[];for(e=this.groupSegRows(t),n=0;e.length>n;n++)i.push(this.renderSegRow(n,e[n]));return i},fgSegHtml:function(t,e){var n,i=this.view,r=t.event,s=i.isEventDraggable(r),o=!e&&r.allDay&&t.isEnd&&i.isEventResizable(r),l=this.getSegClasses(t,s,o),a=this.getEventSkinCss(r),u="";return l.unshift("fc-day-grid-event"),!r.allDay&&t.isStart&&(u='<span class="fc-time">'+z(this.getEventTimeText(r))+"</span>"),n='<span class="fc-title">'+(z(r.title||"")||"&nbsp;")+"</span>",'<a class="'+l.join(" ")+'"'+(r.url?' href="'+z(r.url)+'"':"")+(a?' style="'+a+'"':"")+">"+'<div class="fc-content">'+(this.isRTL?n+" "+u:u+" "+n)+"</div>"+(o?'<div class="fc-resizer"/>':"")+"</a>"},renderSegRow:function(e,n){function i(e){for(;e>o;)d=(v[r-1]||[])[o],d?d.attr("rowspan",parseInt(d.attr("rowspan")||1,10)+1):(d=t("<td/>"),l.append(d)),m[r][o]=d,v[r][o]=d,o++}var r,s,o,l,a,u,d,c=this.colCnt,h=this.buildSegLevels(n),f=Math.max(1,h.length),g=t("<tbody/>"),p=[],m=[],v=[];for(r=0;f>r;r++){if(s=h[r],o=0,l=t("<tr/>"),p.push([]),m.push([]),v.push([]),s)for(a=0;s.length>a;a++){for(u=s[a],i(u.leftCol),d=t('<td class="fc-event-container"/>').append(u.el),u.leftCol!=u.rightCol?d.attr("colspan",u.rightCol-u.leftCol+1):v[r][o]=d;u.rightCol>=o;)m[r][o]=d,p[r][o]=u,o++;l.append(d)}i(c),this.bookendCells(l,"eventSkeleton"),g.append(l)}return{row:e,tbodyEl:g,cellMatrix:m,segMatrix:p,segLevels:h,segs:n}},buildSegLevels:function(t){var e,n,i,r=[];for(t.sort(re),e=0;t.length>e;e++){for(n=t[e],i=0;r.length>i&&oe(n,r[i]);i++);n.level=i,(r[i]||(r[i]=[])).push(n)}for(i=0;r.length>i;i++)r[i].sort(le);return r},groupSegRows:function(t){var e,n=[];for(e=0;this.rowCnt>e;e++)n.push([]);for(e=0;t.length>e;e++)n[t[e].row].push(t[e]);return n}}),$e.mixin({segPopover:null,popoverSegs:null,destroySegPopover:function(){this.segPopover&&this.segPopover.hide()},limitRows:function(t){var e,n,i=this.rowStructs||[];for(e=0;i.length>e;e++)this.unlimitRow(e),n=t?"number"==typeof t?t:this.computeRowLevelLimit(e):!1,n!==!1&&this.limitRow(e,n)},computeRowLevelLimit:function(t){var e,n,i=this.rowEls.eq(t),r=i.height(),s=this.rowStructs[t].tbodyEl.children();for(e=0;s.length>e;e++)if(n=s.eq(e).removeClass("fc-limited"),n.position().top+n.outerHeight()>r)return e;return!1},limitRow:function(e,n){function i(i){for(;i>D;)r=E.getCell(e,D),d=E.getCellSegs(r,n),d.length&&(f=o[n-1][D],w=E.renderMoreLink(r,d),y=t("<div/>").append(w),f.append(y),b.push(y[0])),D++}var r,s,o,l,a,u,d,c,h,f,g,p,m,v,y,w,E=this,S=this.rowStructs[e],b=[],D=0;if(n&&S.segLevels.length>n){for(s=S.segLevels[n-1],o=S.cellMatrix,l=S.tbodyEl.children().slice(n).addClass("fc-limited").get(),a=0;s.length>a;a++){for(u=s[a],i(u.leftCol),h=[],c=0;u.rightCol>=D;)r=this.getCell(e,D),d=this.getCellSegs(r,n),h.push(d),c+=d.length,D++;if(c){for(f=o[n-1][u.leftCol],g=f.attr("rowspan")||1,p=[],m=0;h.length>m;m++)v=t('<td class="fc-more-cell"/>').attr("rowspan",g),d=h[m],r=this.getCell(e,u.leftCol+m),w=this.renderMoreLink(r,[u].concat(d)),y=t("<div/>").append(w),v.append(y),p.push(v[0]),b.push(v[0]);f.addClass("fc-limited").after(t(p)),l.push(f[0])}}i(this.colCnt),S.moreEls=t(b),S.limitedEls=t(l)}},unlimitRow:function(t){var e=this.rowStructs[t];e.moreEls&&(e.moreEls.remove(),e.moreEls=null),e.limitedEls&&(e.limitedEls.removeClass("fc-limited"),e.limitedEls=null)},renderMoreLink:function(e,n){var i=this,r=this.view;return t('<a class="fc-more"/>').text(this.getMoreLinkText(n.length)).on("click",function(s){var o=r.opt("eventLimitClick"),l=e.start,a=t(this),u=i.getCellDayEl(e),d=i.getCellSegs(e),c=i.resliceDaySegs(d,l),h=i.resliceDaySegs(n,l);"function"==typeof o&&(o=r.trigger("eventLimitClick",null,{date:l,dayEl:u,moreEl:a,segs:c,hiddenSegs:h},s)),"popover"===o?i.showSegPopover(e,a,c):"string"==typeof o&&r.calendar.zoomTo(l,o)})},showSegPopover:function(t,e,n){var i,r,s=this,o=this.view,l=e.parent();i=1==this.rowCnt?o.el:this.rowEls.eq(t.row),r={className:"fc-more-popover",content:this.renderSegPopoverContent(t,n),parentEl:this.el,top:i.offset().top,autoHide:!0,viewportConstrain:o.opt("popoverViewportConstrain"),hide:function(){s.segPopover.destroy(),s.segPopover=null,s.popoverSegs=null}},this.isRTL?r.right=l.offset().left+l.outerWidth()+1:r.left=l.offset().left-1,this.segPopover=new Oe(r),this.segPopover.show()},renderSegPopoverContent:function(e,n){var i,r=this.view,s=r.opt("theme"),o=e.start.format(r.opt("dayPopoverFormat")),l=t('<div class="fc-header '+r.widgetHeaderClass+'">'+'<span class="fc-close '+(s?"ui-icon ui-icon-closethick":"fc-icon fc-icon-x")+'"></span>'+'<span class="fc-title">'+z(o)+"</span>"+'<div class="fc-clear"/>'+"</div>"+'<div class="fc-body '+r.widgetContentClass+'">'+'<div class="fc-event-container"></div>'+"</div>"),a=l.find(".fc-event-container");for(n=this.renderFgSegEls(n,!0),this.popoverSegs=n,i=0;n.length>i;i++)n[i].cell=e,a.append(n[i].el);return l},resliceDaySegs:function(e,n){var i=t.map(e,function(t){return t.event}),r=n.clone().stripTime(),s=r.clone().add(1,"days"),o={start:r,end:s};return this.eventsToSegs(i,function(t){var e=y(t,o);return e?[e]:[]})},getMoreLinkText:function(t){var e=this.view.opt("eventLimitText");return"function"==typeof e?e(t):"+"+t+" "+e},getCellSegs:function(t,e){for(var n,i=this.rowStructs[t.row].segMatrix,r=e||0,s=[];i.length>r;)n=i[r][t.col],n&&s.push(n),r++;return s}});var Ue=Xe.extend({slotDuration:null,snapDuration:null,minTime:null,maxTime:null,axisFormat:null,dayEls:null,slatEls:null,slatTops:null,helperEl:null,businessHourSegs:null,constructor:function(){Xe.apply(this,arguments),this.processOptions()},render:function(){this.el.html(this.renderHtml()),this.dayEls=this.el.find(".fc-day"),this.slatEls=this.el.find(".fc-slats tr"),this.computeSlatTops(),this.renderBusinessHours(),Xe.prototype.render.call(this)},renderBusinessHours:function(){var t=this.view.calendar.getBusinessHoursEvents();this.businessHourSegs=this.renderFill("businessHours",this.eventsToSegs(t),"bgevent")},renderHtml:function(){return'<div class="fc-bg"><table>'+this.rowHtml("slotBg")+"</table>"+"</div>"+'<div class="fc-slats">'+"<table>"+this.slatRowHtml()+"</table>"+"</div>"},slotBgCellHtml:function(t){return this.bgCellHtml(t)},slatRowHtml:function(){for(var t,n,i,r=this.view,s=this.isRTL,o="",l=0===this.slotDuration.asMinutes()%15,a=e.duration(+this.minTime);this.maxTime>a;)t=this.start.clone().time(a),n=t.minutes(),i='<td class="fc-axis fc-time '+r.widgetContentClass+'" '+r.axisStyleAttr()+">"+(l&&n?"":"<span>"+z(t.format(this.axisFormat))+"</span>")+"</td>",o+="<tr "+(n?'class="fc-minor"':"")+">"+(s?"":i)+'<td class="'+r.widgetContentClass+'"/>'+(s?i:"")+"</tr>",a.add(this.slotDuration);return o},processOptions:function(){var t=this.view,n=t.opt("slotDuration"),i=t.opt("snapDuration");n=e.duration(n),i=i?e.duration(i):n,this.slotDuration=n,this.snapDuration=i,this.minTime=e.duration(t.opt("minTime")),this.maxTime=e.duration(t.opt("maxTime")),this.axisFormat=t.opt("axisFormat")||t.opt("smallTimeFormat")},computeColHeadFormat:function(){return this.colCnt>1?this.view.opt("dayOfMonthFormat"):"dddd"},computeEventTimeFormat:function(){return this.view.opt("noMeridiemTimeFormat")},computeDisplayEventEnd:function(){return!0},updateCells:function(){var t,e=this.view,n=[];for(t=this.start.clone();t.isBefore(this.end);)n.push({day:t.clone()}),t.add(1,"day"),t=e.skipHiddenDays(t);this.isRTL&&n.reverse(),this.colData=n,this.colCnt=n.length,this.rowCnt=Math.ceil((this.maxTime-this.minTime)/this.snapDuration)},computeCellRange:function(t){var e=this.computeSnapTime(t.row),n=this.view.calendar.rezoneDate(t.day).time(e),i=n.clone().add(this.snapDuration);return{start:n,end:i}},getColEl:function(t){return this.dayEls.eq(t)},computeSnapTime:function(t){return e.duration(this.minTime+this.snapDuration*t)},rangeToSegs:function(t){var e,n,i,r,s=this.colCnt,o=[];for(t={start:t.start.clone().stripZone(),end:t.end.clone().stripZone()},n=0;s>n;n++)i=this.colData[n].day,r={start:i.clone().time(this.minTime),end:i.clone().time(this.maxTime)},e=y(t,r),e&&(e.col=n,o.push(e)); +return o},resize:function(){this.computeSlatTops(),this.updateSegVerticals()},computeRowCoords:function(){var t,e,n=this.el.offset().top,i=[];for(t=0;this.rowCnt>t;t++)e={top:n+this.computeTimeTop(this.computeSnapTime(t))},t>0&&(i[t-1].bottom=e.top),i.push(e);return e.bottom=e.top+this.computeTimeTop(this.computeSnapTime(t)),i},computeDateTop:function(t,n){return this.computeTimeTop(e.duration(t.clone().stripZone()-n.clone().stripTime()))},computeTimeTop:function(t){var e,n,i,r,s=(t-this.minTime)/this.slotDuration;return s=Math.max(0,s),s=Math.min(this.slatEls.length,s),e=Math.floor(s),n=s-e,i=this.slatTops[e],n?(r=this.slatTops[e+1],i+(r-i)*n):i},computeSlatTops:function(){var e,n=[];this.slatEls.each(function(i,r){e=t(r).position().top,n.push(e)}),n.push(e+this.slatEls.last().outerHeight()),this.slatTops=n},renderDrag:function(t,e){var n;return e?(this.renderRangeHelper(t,e),n=this.view.opt("dragOpacity"),void 0!==n&&this.helperEl.css("opacity",n),!0):(this.renderHighlight(this.view.calendar.ensureVisibleEventRange(t)),void 0)},destroyDrag:function(){this.destroyHelper(),this.destroyHighlight()},renderEventResize:function(t,e){this.renderRangeHelper(t,e)},destroyEventResize:function(){this.destroyHelper()},renderHelper:function(e,n){var i,r,s,o,l=this.eventsToSegs([e]);for(l=this.renderFgSegEls(l),i=this.renderSegTable(l),r=0;l.length>r;r++)s=l[r],n&&n.col===s.col&&(o=n.el,s.el.css({left:o.css("left"),right:o.css("right"),"margin-left":o.css("margin-left"),"margin-right":o.css("margin-right")}));this.helperEl=t('<div class="fc-helper-skeleton"/>').append(i).appendTo(this.el)},destroyHelper:function(){this.helperEl&&(this.helperEl.remove(),this.helperEl=null)},renderSelection:function(t){this.view.opt("selectHelper")?this.renderRangeHelper(t):this.renderHighlight(t)},destroySelection:function(){this.destroyHelper(),this.destroyHighlight()},renderFill:function(e,n,i){var r,s,o,l,a,u,d,c,h,f;if(n.length){for(n=this.renderFillSegEls(e,n),r=this.groupSegCols(n),i=i||e.toLowerCase(),s=t('<div class="fc-'+i+'-skeleton">'+"<table><tr/></table>"+"</div>"),o=s.find("tr"),l=0;r.length>l;l++)if(a=r[l],u=t("<td/>").appendTo(o),a.length)for(d=t('<div class="fc-'+i+'-container"/>').appendTo(u),c=this.colData[l].day,h=0;a.length>h;h++)f=a[h],d.append(f.el.css({top:this.computeDateTop(f.start,c),bottom:-this.computeDateTop(f.end,c)}));this.bookendCells(o,e),this.el.append(s),this.elsByFill[e]=s}return n}});Ue.mixin({eventSkeletonEl:null,renderFgSegs:function(e){return e=this.renderFgSegEls(e),this.el.append(this.eventSkeletonEl=t('<div class="fc-content-skeleton"/>').append(this.renderSegTable(e))),e},destroyFgSegs:function(){this.eventSkeletonEl&&(this.eventSkeletonEl.remove(),this.eventSkeletonEl=null)},renderSegTable:function(e){var n,i,r,s,o,l,a=t("<table><tr/></table>"),u=a.find("tr");for(n=this.groupSegCols(e),this.computeSegVerticals(e),s=0;n.length>s;s++){for(o=n[s],ae(o),l=t('<div class="fc-event-container"/>'),i=0;o.length>i;i++)r=o[i],r.el.css(this.generateSegPositionCss(r)),30>r.bottom-r.top&&r.el.addClass("fc-short"),l.append(r.el);u.append(t("<td/>").append(l))}return this.bookendCells(u,"eventSkeleton"),a},updateSegVerticals:function(){var t,e=(this.segs||[]).concat(this.businessHourSegs||[]);for(this.computeSegVerticals(e),t=0;e.length>t;t++)e[t].el.css(this.generateSegVerticalCss(e[t]))},computeSegVerticals:function(t){var e,n;for(e=0;t.length>e;e++)n=t[e],n.top=this.computeDateTop(n.start,n.start),n.bottom=this.computeDateTop(n.end,n.start)},fgSegHtml:function(t,e){var n,i,r,s=this.view,o=t.event,l=s.isEventDraggable(o),a=!e&&t.isEnd&&s.isEventResizable(o),u=this.getSegClasses(t,l,a),d=this.getEventSkinCss(o);return u.unshift("fc-time-grid-event"),s.isMultiDayEvent(o)?(t.isStart||t.isEnd)&&(n=this.getEventTimeText(t),i=this.getEventTimeText(t,"LT"),r=this.getEventTimeText({start:t.start})):(n=this.getEventTimeText(o),i=this.getEventTimeText(o,"LT"),r=this.getEventTimeText({start:o.start})),'<a class="'+u.join(" ")+'"'+(o.url?' href="'+z(o.url)+'"':"")+(d?' style="'+d+'"':"")+">"+'<div class="fc-content">'+(n?'<div class="fc-time" data-start="'+z(r)+'"'+' data-full="'+z(i)+'"'+">"+"<span>"+z(n)+"</span>"+"</div>":"")+(o.title?'<div class="fc-title">'+z(o.title)+"</div>":"")+"</div>"+'<div class="fc-bg"/>'+(a?'<div class="fc-resizer"/>':"")+"</a>"},generateSegPositionCss:function(t){var e,n,i=this.view.opt("slotEventOverlap"),r=t.backwardCoord,s=t.forwardCoord,o=this.generateSegVerticalCss(t);return i&&(s=Math.min(1,r+2*(s-r))),this.isRTL?(e=1-s,n=r):(e=r,n=1-s),o.zIndex=t.level+1,o.left=100*e+"%",o.right=100*n+"%",i&&t.forwardPressure&&(o[this.isRTL?"marginLeft":"marginRight"]=20),o},generateSegVerticalCss:function(t){return{top:t.top,bottom:-t.bottom}},groupSegCols:function(t){var e,n=[];for(e=0;this.colCnt>e;e++)n.push([]);for(e=0;t.length>e;e++)n[t[e].col].push(t[e]);return n}});var qe=De.View=K.extend({type:null,name:null,calendar:null,options:null,coordMap:null,el:null,start:null,end:null,intervalStart:null,intervalEnd:null,intervalDuration:null,intervalUnit:null,isSelected:!1,scrollerEl:null,scrollTop:null,widgetHeaderClass:null,widgetContentClass:null,highlightStateClass:null,nextDayThreshold:null,isHiddenDayHash:null,documentMousedownProxy:null,constructor:function(n,i,r){this.calendar=n,this.options=i,this.type=this.name=r,this.nextDayThreshold=e.duration(this.opt("nextDayThreshold")),this.initTheming(),this.initHiddenDays(),this.documentMousedownProxy=t.proxy(this,"documentMousedown"),this.initialize()},initialize:function(){},opt:function(e){var n;return n=this.options[e],void 0!==n?n:(n=this.calendar.options[e],t.isPlainObject(n)&&!r(e)?w(n,this.type):n)},trigger:function(t,e){var n=this.calendar;return n.trigger.apply(n,[t,e||this].concat(Array.prototype.slice.call(arguments,2),[this]))},setDate:function(t){this.setRange(this.computeRange(t))},setRange:function(e){t.extend(this,e)},computeRange:function(t){var n,i,r=e.duration(this.opt("duration")||this.constructor.duration||{days:1}),s=b(r),o=t.clone().startOf(s),l=o.clone().add(r);return D("days",r)?(o.stripTime(),l.stripTime()):(o.hasTime()||(o=this.calendar.rezoneDate(o)),l.hasTime()||(l=this.calendar.rezoneDate(l))),n=o.clone(),n=this.skipHiddenDays(n),i=l.clone(),i=this.skipHiddenDays(i,-1,!0),{intervalDuration:r,intervalUnit:s,intervalStart:o,intervalEnd:l,start:n,end:i}},computePrevDate:function(t){return this.skipHiddenDays(t.clone().startOf(this.intervalUnit).subtract(this.intervalDuration),-1)},computeNextDate:function(t){return this.skipHiddenDays(t.clone().startOf(this.intervalUnit).add(this.intervalDuration))},computeTitle:function(){return this.formatRange({start:this.intervalStart,end:this.intervalEnd},this.opt("titleFormat")||this.computeTitleFormat(),this.opt("titleRangeSeparator"))},computeTitleFormat:function(){return"year"==this.intervalUnit?"YYYY":"month"==this.intervalUnit?this.opt("monthYearFormat"):this.intervalDuration.as("days")>1?"ll":"LL"},formatRange:function(t,e,n){var i=t.end;return i.hasTime()||(i=i.clone().subtract(1)),j(t.start,i,e,n,this.opt("isRTL"))},renderView:function(){this.render(),this.updateSize(),this.initializeScroll(),this.trigger("viewRender",this,this,this.el),t(document).on("mousedown",this.documentMousedownProxy)},render:function(){},destroyView:function(){this.unselect(),this.destroyViewEvents(),this.destroy(),this.trigger("viewDestroy",this,this,this.el),t(document).off("mousedown",this.documentMousedownProxy)},destroy:function(){this.el.empty()},initTheming:function(){var t=this.opt("theme")?"ui":"fc";this.widgetHeaderClass=t+"-widget-header",this.widgetContentClass=t+"-widget-content",this.highlightStateClass=t+"-state-highlight"},updateSize:function(t){t&&this.recordScroll(),this.updateHeight(),this.updateWidth()},updateWidth:function(){},updateHeight:function(){var t=this.calendar;this.setHeight(t.getSuggestedViewHeight(),t.isHeightAuto())},setHeight:function(){},computeScrollerHeight:function(t,e){var n,i;return e=e||this.scrollerEl,n=this.el.add(e),n.css({position:"relative",left:-1}),i=this.el.outerHeight()-e.height(),n.css({position:"",left:""}),t-i},initializeScroll:function(){},recordScroll:function(){this.scrollerEl&&(this.scrollTop=this.scrollerEl.scrollTop())},restoreScroll:function(){null!==this.scrollTop&&this.scrollerEl.scrollTop(this.scrollTop)},renderViewEvents:function(t){this.renderEvents(t),this.eventSegEach(function(t){this.trigger("eventAfterRender",t.event,t.event,t.el)}),this.trigger("eventAfterAllRender")},renderEvents:function(){},destroyViewEvents:function(){this.eventSegEach(function(t){this.trigger("eventDestroy",t.event,t.event,t.el)}),this.destroyEvents()},destroyEvents:function(){},resolveEventEl:function(e,n){var i=this.trigger("eventRender",e,e,n);return i===!1?n=null:i&&i!==!0&&(n=t(i)),n},showEvent:function(t){this.eventSegEach(function(t){t.el.css("visibility","")},t)},hideEvent:function(t){this.eventSegEach(function(t){t.el.css("visibility","hidden")},t)},eventSegEach:function(t,e){var n,i=this.getEventSegs();for(n=0;i.length>n;n++)e&&i[n].event._id!==e._id||t.call(this,i[n])},getEventSegs:function(){return[]},isEventDraggable:function(t){var e=t.source||{};return F(t.startEditable,e.startEditable,this.opt("eventStartEditable"),t.editable,e.editable,this.opt("editable"))},reportEventDrop:function(t,e,n,i){var r=this.calendar,s=r.mutateEvent(t,e),o=function(){s.undo(),r.reportEventChange()};this.triggerEventDrop(t,s.dateDelta,o,n,i),r.reportEventChange()},triggerEventDrop:function(t,e,n,i,r){this.trigger("eventDrop",i[0],t,e,n,r,{})},reportExternalDrop:function(e,n,i,r,s){var o,l,a=e.eventProps;a&&(o=t.extend({},a,n),l=this.calendar.renderEvent(o,e.stick)[0]),this.triggerExternalDrop(l,n,i,r,s)},triggerExternalDrop:function(t,e,n,i,r){this.trigger("drop",n[0],e.start,i,r),t&&this.trigger("eventReceive",null,t)},renderDrag:function(){},destroyDrag:function(){},isEventResizable:function(t){var e=t.source||{};return F(t.durationEditable,e.durationEditable,this.opt("eventDurationEditable"),t.editable,e.editable,this.opt("editable"))},reportEventResize:function(t,e,n,i){var r=this.calendar,s=r.mutateEvent(t,{end:e}),o=function(){s.undo(),r.reportEventChange()};this.triggerEventResize(t,s.durationDelta,o,n,i),r.reportEventChange()},triggerEventResize:function(t,e,n,i,r){this.trigger("eventResize",i[0],t,e,n,r,{})},select:function(t,e){this.unselect(e),this.renderSelection(t),this.reportSelection(t,e)},renderSelection:function(){},reportSelection:function(t,e){this.isSelected=!0,this.trigger("select",null,t.start,t.end,e)},unselect:function(t){this.isSelected&&(this.isSelected=!1,this.destroySelection(),this.trigger("unselect",null,t))},destroySelection:function(){},documentMousedown:function(e){var n;this.isSelected&&this.opt("unselectAuto")&&v(e)&&(n=this.opt("unselectCancel"),n&&t(e.target).closest(n).length||this.unselect(e))},initHiddenDays:function(){var e,n=this.opt("hiddenDays")||[],i=[],r=0;for(this.opt("weekends")===!1&&n.push(0,6),e=0;7>e;e++)(i[e]=-1!==t.inArray(e,n))||r++;if(!r)throw"invalid hiddenDays";this.isHiddenDayHash=i},isHiddenDay:function(t){return e.isMoment(t)&&(t=t.day()),this.isHiddenDayHash[t]},skipHiddenDays:function(t,e,n){var i=t.clone();for(e=e||1;this.isHiddenDayHash[(i.day()+(n?e:0)+7)%7];)i.add(e,"days");return i},computeDayRange:function(t){var e,n=t.start.clone().stripTime(),i=t.end,r=null;return i&&(r=i.clone().stripTime(),e=+i.time(),e&&e>=this.nextDayThreshold&&r.add(1,"days")),(!i||n>=r)&&(r=n.clone().add(1,"days")),{start:n,end:r}},isMultiDayEvent:function(t){var e=this.computeDayRange(t);return e.end.diff(e.start,"days")>1}});De.sourceNormalizers=[],De.sourceFetchers=[];var Ke={dataType:"json",cache:!1},Qe=1,Je=Ce.basic=qe.extend({dayGrid:null,dayNumbersVisible:!1,weekNumbersVisible:!1,weekNumberWidth:null,headRowEl:null,initialize:function(){this.dayGrid=new $e(this),this.coordMap=this.dayGrid.coordMap},setRange:function(t){qe.prototype.setRange.call(this,t),this.dayGrid.breakOnWeeks=/year|month|week/.test(this.intervalUnit),this.dayGrid.setRange(t)},computeRange:function(t){var e=qe.prototype.computeRange.call(this,t);return/year|month/.test(e.intervalUnit)&&(e.start.startOf("week"),e.start=this.skipHiddenDays(e.start),e.end.weekday()&&(e.end.add(1,"week").startOf("week"),e.end=this.skipHiddenDays(e.end,-1,!0))),e},render:function(){this.dayNumbersVisible=this.dayGrid.rowCnt>1,this.weekNumbersVisible=this.opt("weekNumbers"),this.dayGrid.numbersVisible=this.dayNumbersVisible||this.weekNumbersVisible,this.el.addClass("fc-basic-view").html(this.renderHtml()),this.headRowEl=this.el.find("thead .fc-row"),this.scrollerEl=this.el.find(".fc-day-grid-container"),this.dayGrid.coordMap.containerEl=this.scrollerEl,this.dayGrid.el=this.el.find(".fc-day-grid"),this.dayGrid.render(this.hasRigidRows())},destroy:function(){this.dayGrid.destroy(),qe.prototype.destroy.call(this)},renderHtml:function(){return'<table><thead><tr><td class="'+this.widgetHeaderClass+'">'+this.dayGrid.headHtml()+"</td>"+"</tr>"+"</thead>"+"<tbody>"+"<tr>"+'<td class="'+this.widgetContentClass+'">'+'<div class="fc-day-grid-container">'+'<div class="fc-day-grid"/>'+"</div>"+"</td>"+"</tr>"+"</tbody>"+"</table>"},headIntroHtml:function(){return this.weekNumbersVisible?'<th class="fc-week-number '+this.widgetHeaderClass+'" '+this.weekNumberStyleAttr()+">"+"<span>"+z(this.opt("weekNumberTitle"))+"</span>"+"</th>":void 0},numberIntroHtml:function(t){return this.weekNumbersVisible?'<td class="fc-week-number" '+this.weekNumberStyleAttr()+">"+"<span>"+this.calendar.calculateWeekNumber(this.dayGrid.getCell(t,0).start)+"</span>"+"</td>":void 0},dayIntroHtml:function(){return this.weekNumbersVisible?'<td class="fc-week-number '+this.widgetContentClass+'" '+this.weekNumberStyleAttr()+"></td>":void 0},introHtml:function(){return this.weekNumbersVisible?'<td class="fc-week-number" '+this.weekNumberStyleAttr()+"></td>":void 0},numberCellHtml:function(t){var e,n=t.start;return this.dayNumbersVisible?(e=this.dayGrid.getDayClasses(n),e.unshift("fc-day-number"),'<td class="'+e.join(" ")+'" data-date="'+n.format()+'">'+n.date()+"</td>"):"<td/>"},weekNumberStyleAttr:function(){return null!==this.weekNumberWidth?'style="width:'+this.weekNumberWidth+'px"':""},hasRigidRows:function(){var t=this.opt("eventLimit");return t&&"number"!=typeof t},updateWidth:function(){this.weekNumbersVisible&&(this.weekNumberWidth=h(this.el.find(".fc-week-number")))},setHeight:function(t,e){var n,i=this.opt("eventLimit");g(this.scrollerEl),l(this.headRowEl),this.dayGrid.destroySegPopover(),i&&"number"==typeof i&&this.dayGrid.limitRows(i),n=this.computeScrollerHeight(t),this.setGridHeight(n,e),i&&"number"!=typeof i&&this.dayGrid.limitRows(i),!e&&f(this.scrollerEl,n)&&(o(this.headRowEl,m(this.scrollerEl)),n=this.computeScrollerHeight(t),this.scrollerEl.height(n),this.restoreScroll())},setGridHeight:function(t,e){e?c(this.dayGrid.rowEls):d(this.dayGrid.rowEls,t,!0)},renderEvents:function(t){this.dayGrid.renderEvents(t),this.updateHeight()},getEventSegs:function(){return this.dayGrid.getEventSegs()},destroyEvents:function(){this.recordScroll(),this.dayGrid.destroyEvents()},renderDrag:function(t,e){return this.dayGrid.renderDrag(t,e)},destroyDrag:function(){this.dayGrid.destroyDrag()},renderSelection:function(t){this.dayGrid.renderSelection(t)},destroySelection:function(){this.dayGrid.destroySelection()}});n({fixedWeekCount:!0});var tn=Ce.month=Je.extend({computeRange:function(t){var e=Je.prototype.computeRange.call(this,t);return this.isFixedWeeks()&&e.end.add(6-e.end.diff(e.start,"weeks"),"weeks"),e},setGridHeight:function(t,e){e=e||"variable"===this.opt("weekMode"),e&&(t*=this.rowCnt/6),d(this.dayGrid.rowEls,t,!e)},isFixedWeeks:function(){var t=this.opt("weekMode");return t?"fixed"===t:this.opt("fixedWeekCount")}});tn.duration={months:1},Ce.basicWeek={type:"basic",duration:{weeks:1}},Ce.basicDay={type:"basic",duration:{days:1}},n({allDaySlot:!0,allDayText:"all-day",scrollTime:"06:00:00",slotDuration:"00:30:00",minTime:"00:00:00",maxTime:"24:00:00",slotEventOverlap:!0});var en=5;Ce.agenda=qe.extend({timeGrid:null,dayGrid:null,axisWidth:null,noScrollRowEls:null,bottomRuleEl:null,bottomRuleHeight:null,initialize:function(){this.timeGrid=new Ue(this),this.opt("allDaySlot")?(this.dayGrid=new $e(this),this.coordMap=new Ze([this.dayGrid.coordMap,this.timeGrid.coordMap])):this.coordMap=this.timeGrid.coordMap},setRange:function(t){qe.prototype.setRange.call(this,t),this.timeGrid.setRange(t),this.dayGrid&&this.dayGrid.setRange(t)},render:function(){this.el.addClass("fc-agenda-view").html(this.renderHtml()),this.scrollerEl=this.el.find(".fc-time-grid-container"),this.timeGrid.coordMap.containerEl=this.scrollerEl,this.timeGrid.el=this.el.find(".fc-time-grid"),this.timeGrid.render(),this.bottomRuleEl=t('<hr class="'+this.widgetHeaderClass+'"/>').appendTo(this.timeGrid.el),this.dayGrid&&(this.dayGrid.el=this.el.find(".fc-day-grid"),this.dayGrid.render(),this.dayGrid.bottomCoordPadding=this.dayGrid.el.next("hr").outerHeight()),this.noScrollRowEls=this.el.find(".fc-row:not(.fc-scroller *)")},destroy:function(){this.timeGrid.destroy(),this.dayGrid&&this.dayGrid.destroy(),qe.prototype.destroy.call(this)},renderHtml:function(){return'<table><thead><tr><td class="'+this.widgetHeaderClass+'">'+this.timeGrid.headHtml()+"</td>"+"</tr>"+"</thead>"+"<tbody>"+"<tr>"+'<td class="'+this.widgetContentClass+'">'+(this.dayGrid?'<div class="fc-day-grid"/><hr class="'+this.widgetHeaderClass+'"/>':"")+'<div class="fc-time-grid-container">'+'<div class="fc-time-grid"/>'+"</div>"+"</td>"+"</tr>"+"</tbody>"+"</table>"},headIntroHtml:function(){var t,e,n,i;return this.opt("weekNumbers")?(t=this.timeGrid.getCell(0).start,e=this.calendar.calculateWeekNumber(t),n=this.opt("weekNumberTitle"),i=this.opt("isRTL")?e+n:n+e,'<th class="fc-axis fc-week-number '+this.widgetHeaderClass+'" '+this.axisStyleAttr()+">"+"<span>"+z(i)+"</span>"+"</th>"):'<th class="fc-axis '+this.widgetHeaderClass+'" '+this.axisStyleAttr()+"></th>"},dayIntroHtml:function(){return'<td class="fc-axis '+this.widgetContentClass+'" '+this.axisStyleAttr()+">"+"<span>"+(this.opt("allDayHtml")||z(this.opt("allDayText")))+"</span>"+"</td>"},slotBgIntroHtml:function(){return'<td class="fc-axis '+this.widgetContentClass+'" '+this.axisStyleAttr()+"></td>"},introHtml:function(){return'<td class="fc-axis" '+this.axisStyleAttr()+"></td>"},axisStyleAttr:function(){return null!==this.axisWidth?'style="width:'+this.axisWidth+'px"':""},updateSize:function(t){t&&this.timeGrid.resize(),qe.prototype.updateSize.call(this,t)},updateWidth:function(){this.axisWidth=h(this.el.find(".fc-axis"))},setHeight:function(t,e){var n,i;null===this.bottomRuleHeight&&(this.bottomRuleHeight=this.bottomRuleEl.outerHeight()),this.bottomRuleEl.hide(),this.scrollerEl.css("overflow",""),g(this.scrollerEl),l(this.noScrollRowEls),this.dayGrid&&(this.dayGrid.destroySegPopover(),n=this.opt("eventLimit"),n&&"number"!=typeof n&&(n=en),n&&this.dayGrid.limitRows(n)),e||(i=this.computeScrollerHeight(t),f(this.scrollerEl,i)?(o(this.noScrollRowEls,m(this.scrollerEl)),i=this.computeScrollerHeight(t),this.scrollerEl.height(i),this.restoreScroll()):(this.scrollerEl.height(i).css("overflow","hidden"),this.bottomRuleEl.show()))},initializeScroll:function(){function t(){n.scrollerEl.scrollTop(r)}var n=this,i=e.duration(this.opt("scrollTime")),r=this.timeGrid.computeTimeTop(i);r=Math.ceil(r),r&&r++,t(),setTimeout(t,0)},renderEvents:function(t){var e,n,i=[],r=[],s=[];for(n=0;t.length>n;n++)t[n].allDay?i.push(t[n]):r.push(t[n]);e=this.timeGrid.renderEvents(r),this.dayGrid&&(s=this.dayGrid.renderEvents(i)),this.updateHeight()},getEventSegs:function(){return this.timeGrid.getEventSegs().concat(this.dayGrid?this.dayGrid.getEventSegs():[])},destroyEvents:function(){this.recordScroll(),this.timeGrid.destroyEvents(),this.dayGrid&&this.dayGrid.destroyEvents()},renderDrag:function(t,e){return t.start.hasTime()?this.timeGrid.renderDrag(t,e):this.dayGrid?this.dayGrid.renderDrag(t,e):void 0},destroyDrag:function(){this.timeGrid.destroyDrag(),this.dayGrid&&this.dayGrid.destroyDrag()},renderSelection:function(t){t.start.hasTime()||t.end.hasTime()?this.timeGrid.renderSelection(t):this.dayGrid&&this.dayGrid.renderSelection(t)},destroySelection:function(){this.timeGrid.destroySelection(),this.dayGrid&&this.dayGrid.destroySelection()}}),Ce.agendaWeek={type:"agenda",duration:{weeks:1}},Ce.agendaDay={type:"agenda",duration:{days:1}}}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/fullcalendar/fullcalendar.print.css b/theme/bootstrap/plugins/fullcalendar/fullcalendar.print.css new file mode 100644 index 0000000..e29366a --- /dev/null +++ b/theme/bootstrap/plugins/fullcalendar/fullcalendar.print.css @@ -0,0 +1,202 @@ +/*! + * FullCalendar v2.2.5 Print Stylesheet + * Docs & License: http://arshaw.com/fullcalendar/ + * (c) 2013 Adam Shaw + */ + +/* + * Include this stylesheet on your page to get a more printer-friendly calendar. + * When including this stylesheet, use the media='print' attribute of the <link> tag. + * Make sure to include this stylesheet IN ADDITION to the regular fullcalendar.css. + */ + +.fc { + max-width: 100% !important; +} + + +/* Global Event Restyling +--------------------------------------------------------------------------------------------------*/ + +.fc-event { + background: #fff !important; + color: #000 !important; + page-break-inside: avoid; +} + +.fc-event .fc-resizer { + display: none; +} + + +/* Table & Day-Row Restyling +--------------------------------------------------------------------------------------------------*/ + +th, +td, +hr, +thead, +tbody, +.fc-row { + border-color: #ccc !important; + background: #fff !important; +} + +/* kill the overlaid, absolutely-positioned common components */ +.fc-bg, +.fc-bgevent-skeleton, +.fc-highlight-skeleton, +.fc-helper-skeleton { + display: none; +} + +/* don't force a min-height on rows (for DayGrid) */ +.fc tbody .fc-row { + height: auto !important; /* undo height that JS set in distributeHeight */ + min-height: 0 !important; /* undo the min-height from each view's specific stylesheet */ +} + +.fc tbody .fc-row .fc-content-skeleton { + position: static; /* undo .fc-rigid */ + padding-bottom: 0 !important; /* use a more border-friendly method for this... */ +} + +.fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td { /* only works in newer browsers */ + padding-bottom: 1em; /* ...gives space within the skeleton. also ensures min height in a way */ +} + +.fc tbody .fc-row .fc-content-skeleton table { + /* provides a min-height for the row, but only effective for IE, which exaggerates this value, + making it look more like 3em. for other browers, it will already be this tall */ + height: 1em; +} + + +/* Undo month-view event limiting. Display all events and hide the "more" links +--------------------------------------------------------------------------------------------------*/ + +.fc-more-cell, +.fc-more { + display: none !important; +} + +.fc tr.fc-limited { + display: table-row !important; +} + +.fc td.fc-limited { + display: table-cell !important; +} + +.fc-popover { + display: none; /* never display the "more.." popover in print mode */ +} + + +/* TimeGrid Restyling +--------------------------------------------------------------------------------------------------*/ + +/* undo the min-height 100% trick used to fill the container's height */ +.fc-time-grid { + min-height: 0 !important; +} + +/* don't display the side axis at all ("all-day" and time cells) */ +.fc-agenda-view .fc-axis { + display: none; +} + +/* don't display the horizontal lines */ +.fc-slats, +.fc-time-grid hr { /* this hr is used when height is underused and needs to be filled */ + display: none !important; /* important overrides inline declaration */ +} + +/* let the container that holds the events be naturally positioned and create real height */ +.fc-time-grid .fc-content-skeleton { + position: static; +} + +/* in case there are no events, we still want some height */ +.fc-time-grid .fc-content-skeleton table { + height: 4em; +} + +/* kill the horizontal spacing made by the event container. event margins will be done below */ +.fc-time-grid .fc-event-container { + margin: 0 !important; +} + + +/* TimeGrid *Event* Restyling +--------------------------------------------------------------------------------------------------*/ + +/* naturally position events, vertically stacking them */ +.fc-time-grid .fc-event { + position: static !important; + margin: 3px 2px !important; +} + +/* for events that continue to a future day, give the bottom border back */ +.fc-time-grid .fc-event.fc-not-end { + border-bottom-width: 1px !important; +} + +/* indicate the event continues via "..." text */ +.fc-time-grid .fc-event.fc-not-end:after { + content: "..."; +} + +/* for events that are continuations from previous days, give the top border back */ +.fc-time-grid .fc-event.fc-not-start { + border-top-width: 1px !important; +} + +/* indicate the event is a continuation via "..." text */ +.fc-time-grid .fc-event.fc-not-start:before { + content: "..."; +} + +/* time */ + +/* undo a previous declaration and let the time text span to a second line */ +.fc-time-grid .fc-event .fc-time { + white-space: normal !important; +} + +/* hide the the time that is normally displayed... */ +.fc-time-grid .fc-event .fc-time span { + display: none; +} + +/* ...replace it with a more verbose version (includes AM/PM) stored in an html attribute */ +.fc-time-grid .fc-event .fc-time:after { + content: attr(data-full); +} + + +/* Vertical Scroller & Containers +--------------------------------------------------------------------------------------------------*/ + +/* kill the scrollbars and allow natural height */ +.fc-scroller, +.fc-day-grid-container, /* these divs might be assigned height, which we need to cleared */ +.fc-time-grid-container { /* */ + overflow: visible !important; + height: auto !important; +} + +/* kill the horizontal border/padding used to compensate for scrollbars */ +.fc-row { + border: 0 !important; + margin: 0 !important; +} + + +/* Button Controls +--------------------------------------------------------------------------------------------------*/ + +.fc-button-group, +.fc button { + display: none; /* don't display any button-related controls */ +} diff --git a/theme/bootstrap/plugins/iCheck/all.css b/theme/bootstrap/plugins/iCheck/all.css new file mode 100644 index 0000000..6439b74 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/all.css @@ -0,0 +1,61 @@ +/* iCheck plugin skins +----------------------------------- */ +@import url("minimal/_all.css"); +/* +@import url("minimal/minimal.css"); +@import url("minimal/red.css"); +@import url("minimal/green.css"); +@import url("minimal/blue.css"); +@import url("minimal/aero.css"); +@import url("minimal/grey.css"); +@import url("minimal/orange.css"); +@import url("minimal/yellow.css"); +@import url("minimal/pink.css"); +@import url("minimal/purple.css"); +*/ + +@import url("square/_all.css"); +/* +@import url("square/square.css"); +@import url("square/red.css"); +@import url("square/green.css"); +@import url("square/blue.css"); +@import url("square/aero.css"); +@import url("square/grey.css"); +@import url("square/orange.css"); +@import url("square/yellow.css"); +@import url("square/pink.css"); +@import url("square/purple.css"); +*/ + +@import url("flat/_all.css"); +/* +@import url("flat/flat.css"); +@import url("flat/red.css"); +@import url("flat/green.css"); +@import url("flat/blue.css"); +@import url("flat/aero.css"); +@import url("flat/grey.css"); +@import url("flat/orange.css"); +@import url("flat/yellow.css"); +@import url("flat/pink.css"); +@import url("flat/purple.css"); +*/ + +@import url("line/_all.css"); +/* +@import url("line/line.css"); +@import url("line/red.css"); +@import url("line/green.css"); +@import url("line/blue.css"); +@import url("line/aero.css"); +@import url("line/grey.css"); +@import url("line/orange.css"); +@import url("line/yellow.css"); +@import url("line/pink.css"); +@import url("line/purple.css"); +*/ + +@import url("polaris/polaris.css"); + +@import url("futurico/futurico.css"); \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/flat/_all.css b/theme/bootstrap/plugins/iCheck/flat/_all.css new file mode 100644 index 0000000..21647b5 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/flat/_all.css @@ -0,0 +1,560 @@ +/* iCheck plugin Flat skin +----------------------------------- */ +.icheckbox_flat, +.iradio_flat { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(flat.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat { + background-position: 0 0; +} + .icheckbox_flat.checked { + background-position: -22px 0; + } + .icheckbox_flat.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat { + background-position: -88px 0; +} + .iradio_flat.checked { + background-position: -110px 0; + } + .iradio_flat.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat.checked.disabled { + background-position: -154px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_flat, + .iradio_flat { + background-image: url(flat@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} + +/* red */ +.icheckbox_flat-red, +.iradio_flat-red { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(red.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-red { + background-position: 0 0; +} + .icheckbox_flat-red.checked { + background-position: -22px 0; + } + .icheckbox_flat-red.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-red.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-red { + background-position: -88px 0; +} + .iradio_flat-red.checked { + background-position: -110px 0; + } + .iradio_flat-red.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-red.checked.disabled { + background-position: -154px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_flat-red, + .iradio_flat-red { + background-image: url(red@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} + +/* green */ +.icheckbox_flat-green, +.iradio_flat-green { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(green.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-green { + background-position: 0 0; +} + .icheckbox_flat-green.checked { + background-position: -22px 0; + } + .icheckbox_flat-green.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-green.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-green { + background-position: -88px 0; +} + .iradio_flat-green.checked { + background-position: -110px 0; + } + .iradio_flat-green.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-green.checked.disabled { + background-position: -154px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_flat-green, + .iradio_flat-green { + background-image: url(green@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} + +/* blue */ +.icheckbox_flat-blue, +.iradio_flat-blue { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(blue.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-blue { + background-position: 0 0; +} + .icheckbox_flat-blue.checked { + background-position: -22px 0; + } + .icheckbox_flat-blue.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-blue.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-blue { + background-position: -88px 0; +} + .iradio_flat-blue.checked { + background-position: -110px 0; + } + .iradio_flat-blue.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-blue.checked.disabled { + background-position: -154px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_flat-blue, + .iradio_flat-blue { + background-image: url(blue@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} + +/* aero */ +.icheckbox_flat-aero, +.iradio_flat-aero { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(aero.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-aero { + background-position: 0 0; +} + .icheckbox_flat-aero.checked { + background-position: -22px 0; + } + .icheckbox_flat-aero.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-aero.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-aero { + background-position: -88px 0; +} + .iradio_flat-aero.checked { + background-position: -110px 0; + } + .iradio_flat-aero.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-aero.checked.disabled { + background-position: -154px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_flat-aero, + .iradio_flat-aero { + background-image: url(aero@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} + +/* grey */ +.icheckbox_flat-grey, +.iradio_flat-grey { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(grey.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-grey { + background-position: 0 0; +} + .icheckbox_flat-grey.checked { + background-position: -22px 0; + } + .icheckbox_flat-grey.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-grey.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-grey { + background-position: -88px 0; +} + .iradio_flat-grey.checked { + background-position: -110px 0; + } + .iradio_flat-grey.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-grey.checked.disabled { + background-position: -154px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_flat-grey, + .iradio_flat-grey { + background-image: url(grey@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} + +/* orange */ +.icheckbox_flat-orange, +.iradio_flat-orange { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(orange.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-orange { + background-position: 0 0; +} + .icheckbox_flat-orange.checked { + background-position: -22px 0; + } + .icheckbox_flat-orange.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-orange.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-orange { + background-position: -88px 0; +} + .iradio_flat-orange.checked { + background-position: -110px 0; + } + .iradio_flat-orange.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-orange.checked.disabled { + background-position: -154px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_flat-orange, + .iradio_flat-orange { + background-image: url(orange@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} + +/* yellow */ +.icheckbox_flat-yellow, +.iradio_flat-yellow { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(yellow.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-yellow { + background-position: 0 0; +} + .icheckbox_flat-yellow.checked { + background-position: -22px 0; + } + .icheckbox_flat-yellow.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-yellow.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-yellow { + background-position: -88px 0; +} + .iradio_flat-yellow.checked { + background-position: -110px 0; + } + .iradio_flat-yellow.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-yellow.checked.disabled { + background-position: -154px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_flat-yellow, + .iradio_flat-yellow { + background-image: url(yellow@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} + +/* pink */ +.icheckbox_flat-pink, +.iradio_flat-pink { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(pink.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-pink { + background-position: 0 0; +} + .icheckbox_flat-pink.checked { + background-position: -22px 0; + } + .icheckbox_flat-pink.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-pink.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-pink { + background-position: -88px 0; +} + .iradio_flat-pink.checked { + background-position: -110px 0; + } + .iradio_flat-pink.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-pink.checked.disabled { + background-position: -154px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_flat-pink, + .iradio_flat-pink { + background-image: url(pink@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} + +/* purple */ +.icheckbox_flat-purple, +.iradio_flat-purple { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(purple.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-purple { + background-position: 0 0; +} + .icheckbox_flat-purple.checked { + background-position: -22px 0; + } + .icheckbox_flat-purple.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-purple.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-purple { + background-position: -88px 0; +} + .iradio_flat-purple.checked { + background-position: -110px 0; + } + .iradio_flat-purple.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-purple.checked.disabled { + background-position: -154px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_flat-purple, + .iradio_flat-purple { + background-image: url(purple@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/flat/aero.css b/theme/bootstrap/plugins/iCheck/flat/aero.css new file mode 100644 index 0000000..98fd65c --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/flat/aero.css @@ -0,0 +1,56 @@ +/* iCheck plugin Flat skin, aero +----------------------------------- */ +.icheckbox_flat-aero, +.iradio_flat-aero { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(aero.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-aero { + background-position: 0 0; +} + .icheckbox_flat-aero.checked { + background-position: -22px 0; + } + .icheckbox_flat-aero.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-aero.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-aero { + background-position: -88px 0; +} + .iradio_flat-aero.checked { + background-position: -110px 0; + } + .iradio_flat-aero.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-aero.checked.disabled { + background-position: -154px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_flat-aero, + .iradio_flat-aero { + background-image: url(aero@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/flat/aero.png b/theme/bootstrap/plugins/iCheck/flat/aero.png new file mode 100644 index 0000000..f4277aa Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/flat/aero.png differ diff --git a/theme/bootstrap/plugins/iCheck/flat/aero@2x.png b/theme/bootstrap/plugins/iCheck/flat/aero@2x.png new file mode 100644 index 0000000..a9a7494 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/flat/aero@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/flat/blue.css b/theme/bootstrap/plugins/iCheck/flat/blue.css new file mode 100644 index 0000000..0783674 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/flat/blue.css @@ -0,0 +1,56 @@ +/* iCheck plugin Flat skin, blue +----------------------------------- */ +.icheckbox_flat-blue, +.iradio_flat-blue { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(blue.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-blue { + background-position: 0 0; +} + .icheckbox_flat-blue.checked { + background-position: -22px 0; + } + .icheckbox_flat-blue.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-blue.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-blue { + background-position: -88px 0; +} + .iradio_flat-blue.checked { + background-position: -110px 0; + } + .iradio_flat-blue.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-blue.checked.disabled { + background-position: -154px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_flat-blue, + .iradio_flat-blue { + background-image: url(blue@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/flat/blue.png b/theme/bootstrap/plugins/iCheck/flat/blue.png new file mode 100644 index 0000000..4b6ef98 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/flat/blue.png differ diff --git a/theme/bootstrap/plugins/iCheck/flat/blue@2x.png b/theme/bootstrap/plugins/iCheck/flat/blue@2x.png new file mode 100644 index 0000000..d52da05 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/flat/blue@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/flat/flat.css b/theme/bootstrap/plugins/iCheck/flat/flat.css new file mode 100644 index 0000000..418620e --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/flat/flat.css @@ -0,0 +1,56 @@ +/* iCheck plugin flat skin, black +----------------------------------- */ +.icheckbox_flat, +.iradio_flat { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(flat.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat { + background-position: 0 0; +} + .icheckbox_flat.checked { + background-position: -22px 0; + } + .icheckbox_flat.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat { + background-position: -88px 0; +} + .iradio_flat.checked { + background-position: -110px 0; + } + .iradio_flat.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat.checked.disabled { + background-position: -154px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_flat, + .iradio_flat { + background-image: url(flat@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/flat/flat.png b/theme/bootstrap/plugins/iCheck/flat/flat.png new file mode 100644 index 0000000..15af826 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/flat/flat.png differ diff --git a/theme/bootstrap/plugins/iCheck/flat/flat@2x.png b/theme/bootstrap/plugins/iCheck/flat/flat@2x.png new file mode 100644 index 0000000..e70e438 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/flat/flat@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/flat/green.css b/theme/bootstrap/plugins/iCheck/flat/green.css new file mode 100644 index 0000000..c9d17c1 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/flat/green.css @@ -0,0 +1,56 @@ +/* iCheck plugin Flat skin, green +----------------------------------- */ +.icheckbox_flat-green, +.iradio_flat-green { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(green.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-green { + background-position: 0 0; +} + .icheckbox_flat-green.checked { + background-position: -22px 0; + } + .icheckbox_flat-green.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-green.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-green { + background-position: -88px 0; +} + .iradio_flat-green.checked { + background-position: -110px 0; + } + .iradio_flat-green.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-green.checked.disabled { + background-position: -154px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_flat-green, + .iradio_flat-green { + background-image: url(green@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/flat/green.png b/theme/bootstrap/plugins/iCheck/flat/green.png new file mode 100644 index 0000000..6b303fb Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/flat/green.png differ diff --git a/theme/bootstrap/plugins/iCheck/flat/green@2x.png b/theme/bootstrap/plugins/iCheck/flat/green@2x.png new file mode 100644 index 0000000..92b4411 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/flat/green@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/flat/grey.css b/theme/bootstrap/plugins/iCheck/flat/grey.css new file mode 100644 index 0000000..a451650 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/flat/grey.css @@ -0,0 +1,56 @@ +/* iCheck plugin Flat skin, grey +----------------------------------- */ +.icheckbox_flat-grey, +.iradio_flat-grey { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(grey.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-grey { + background-position: 0 0; +} + .icheckbox_flat-grey.checked { + background-position: -22px 0; + } + .icheckbox_flat-grey.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-grey.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-grey { + background-position: -88px 0; +} + .iradio_flat-grey.checked { + background-position: -110px 0; + } + .iradio_flat-grey.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-grey.checked.disabled { + background-position: -154px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_flat-grey, + .iradio_flat-grey { + background-image: url(grey@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/flat/grey.png b/theme/bootstrap/plugins/iCheck/flat/grey.png new file mode 100644 index 0000000..c6e2873 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/flat/grey.png differ diff --git a/theme/bootstrap/plugins/iCheck/flat/grey@2x.png b/theme/bootstrap/plugins/iCheck/flat/grey@2x.png new file mode 100644 index 0000000..0b47b1c Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/flat/grey@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/flat/orange.css b/theme/bootstrap/plugins/iCheck/flat/orange.css new file mode 100644 index 0000000..8c9c929 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/flat/orange.css @@ -0,0 +1,56 @@ +/* iCheck plugin Flat skin, orange +----------------------------------- */ +.icheckbox_flat-orange, +.iradio_flat-orange { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(orange.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-orange { + background-position: 0 0; +} + .icheckbox_flat-orange.checked { + background-position: -22px 0; + } + .icheckbox_flat-orange.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-orange.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-orange { + background-position: -88px 0; +} + .iradio_flat-orange.checked { + background-position: -110px 0; + } + .iradio_flat-orange.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-orange.checked.disabled { + background-position: -154px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_flat-orange, + .iradio_flat-orange { + background-image: url(orange@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/flat/orange.png b/theme/bootstrap/plugins/iCheck/flat/orange.png new file mode 100644 index 0000000..ec2532e Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/flat/orange.png differ diff --git a/theme/bootstrap/plugins/iCheck/flat/orange@2x.png b/theme/bootstrap/plugins/iCheck/flat/orange@2x.png new file mode 100644 index 0000000..9350b50 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/flat/orange@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/flat/pink.css b/theme/bootstrap/plugins/iCheck/flat/pink.css new file mode 100644 index 0000000..afa4956 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/flat/pink.css @@ -0,0 +1,56 @@ +/* iCheck plugin Flat skin, pink +----------------------------------- */ +.icheckbox_flat-pink, +.iradio_flat-pink { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(pink.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-pink { + background-position: 0 0; +} + .icheckbox_flat-pink.checked { + background-position: -22px 0; + } + .icheckbox_flat-pink.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-pink.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-pink { + background-position: -88px 0; +} + .iradio_flat-pink.checked { + background-position: -110px 0; + } + .iradio_flat-pink.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-pink.checked.disabled { + background-position: -154px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_flat-pink, + .iradio_flat-pink { + background-image: url(pink@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/flat/pink.png b/theme/bootstrap/plugins/iCheck/flat/pink.png new file mode 100644 index 0000000..3e65d9d Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/flat/pink.png differ diff --git a/theme/bootstrap/plugins/iCheck/flat/pink@2x.png b/theme/bootstrap/plugins/iCheck/flat/pink@2x.png new file mode 100644 index 0000000..281ba06 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/flat/pink@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/flat/purple.css b/theme/bootstrap/plugins/iCheck/flat/purple.css new file mode 100644 index 0000000..a9760b3 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/flat/purple.css @@ -0,0 +1,56 @@ +/* iCheck plugin Flat skin, purple +----------------------------------- */ +.icheckbox_flat-purple, +.iradio_flat-purple { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(purple.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-purple { + background-position: 0 0; +} + .icheckbox_flat-purple.checked { + background-position: -22px 0; + } + .icheckbox_flat-purple.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-purple.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-purple { + background-position: -88px 0; +} + .iradio_flat-purple.checked { + background-position: -110px 0; + } + .iradio_flat-purple.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-purple.checked.disabled { + background-position: -154px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_flat-purple, + .iradio_flat-purple { + background-image: url(purple@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/flat/purple.png b/theme/bootstrap/plugins/iCheck/flat/purple.png new file mode 100644 index 0000000..3699fd5 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/flat/purple.png differ diff --git a/theme/bootstrap/plugins/iCheck/flat/purple@2x.png b/theme/bootstrap/plugins/iCheck/flat/purple@2x.png new file mode 100644 index 0000000..7f4be74 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/flat/purple@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/flat/red.css b/theme/bootstrap/plugins/iCheck/flat/red.css new file mode 100644 index 0000000..34b71e4 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/flat/red.css @@ -0,0 +1,56 @@ +/* iCheck plugin Flat skin, red +----------------------------------- */ +.icheckbox_flat-red, +.iradio_flat-red { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(red.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-red { + background-position: 0 0; +} + .icheckbox_flat-red.checked { + background-position: -22px 0; + } + .icheckbox_flat-red.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-red.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-red { + background-position: -88px 0; +} + .iradio_flat-red.checked { + background-position: -110px 0; + } + .iradio_flat-red.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-red.checked.disabled { + background-position: -154px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_flat-red, + .iradio_flat-red { + background-image: url(red@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/flat/red.png b/theme/bootstrap/plugins/iCheck/flat/red.png new file mode 100644 index 0000000..0d5ac38 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/flat/red.png differ diff --git a/theme/bootstrap/plugins/iCheck/flat/red@2x.png b/theme/bootstrap/plugins/iCheck/flat/red@2x.png new file mode 100644 index 0000000..38590d9 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/flat/red@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/flat/yellow.css b/theme/bootstrap/plugins/iCheck/flat/yellow.css new file mode 100644 index 0000000..96ae5b1 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/flat/yellow.css @@ -0,0 +1,56 @@ +/* iCheck plugin Flat skin, yellow +----------------------------------- */ +.icheckbox_flat-yellow, +.iradio_flat-yellow { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 20px; + height: 20px; + background: url(yellow.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_flat-yellow { + background-position: 0 0; +} + .icheckbox_flat-yellow.checked { + background-position: -22px 0; + } + .icheckbox_flat-yellow.disabled { + background-position: -44px 0; + cursor: default; + } + .icheckbox_flat-yellow.checked.disabled { + background-position: -66px 0; + } + +.iradio_flat-yellow { + background-position: -88px 0; +} + .iradio_flat-yellow.checked { + background-position: -110px 0; + } + .iradio_flat-yellow.disabled { + background-position: -132px 0; + cursor: default; + } + .iradio_flat-yellow.checked.disabled { + background-position: -154px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_flat-yellow, + .iradio_flat-yellow { + background-image: url(yellow@2x.png); + -webkit-background-size: 176px 22px; + background-size: 176px 22px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/flat/yellow.png b/theme/bootstrap/plugins/iCheck/flat/yellow.png new file mode 100644 index 0000000..909dadc Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/flat/yellow.png differ diff --git a/theme/bootstrap/plugins/iCheck/flat/yellow@2x.png b/theme/bootstrap/plugins/iCheck/flat/yellow@2x.png new file mode 100644 index 0000000..9fd5d73 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/flat/yellow@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/futurico/futurico.css b/theme/bootstrap/plugins/iCheck/futurico/futurico.css new file mode 100644 index 0000000..2654cf4 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/futurico/futurico.css @@ -0,0 +1,56 @@ +/* iCheck plugin Futurico skin +----------------------------------- */ +.icheckbox_futurico, +.iradio_futurico { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 16px; + height: 17px; + background: url(futurico.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_futurico { + background-position: 0 0; +} + .icheckbox_futurico.checked { + background-position: -18px 0; + } + .icheckbox_futurico.disabled { + background-position: -36px 0; + cursor: default; + } + .icheckbox_futurico.checked.disabled { + background-position: -54px 0; + } + +.iradio_futurico { + background-position: -72px 0; +} + .iradio_futurico.checked { + background-position: -90px 0; + } + .iradio_futurico.disabled { + background-position: -108px 0; + cursor: default; + } + .iradio_futurico.checked.disabled { + background-position: -126px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_futurico, + .iradio_futurico { + background-image: url(futurico@2x.png); + -webkit-background-size: 144px 19px; + background-size: 144px 19px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/futurico/futurico.png b/theme/bootstrap/plugins/iCheck/futurico/futurico.png new file mode 100644 index 0000000..50d62b5 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/futurico/futurico.png differ diff --git a/theme/bootstrap/plugins/iCheck/futurico/futurico@2x.png b/theme/bootstrap/plugins/iCheck/futurico/futurico@2x.png new file mode 100644 index 0000000..f7eb45a Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/futurico/futurico@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/icheck.js b/theme/bootstrap/plugins/iCheck/icheck.js new file mode 100644 index 0000000..4da1937 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/icheck.js @@ -0,0 +1,478 @@ +/*! + * iCheck v1.0.1, http://git.io/arlzeA + * ================================= + * Powerful jQuery and Zepto plugin for checkboxes and radio buttons customization + * + * (c) 2013 Damir Sultanov, http://fronteed.com + * MIT Licensed + */ + +(function($) { + + // Cached vars + var _iCheck = 'iCheck', + _iCheckHelper = _iCheck + '-helper', + _checkbox = 'checkbox', + _radio = 'radio', + _checked = 'checked', + _unchecked = 'un' + _checked, + _disabled = 'disabled', + _determinate = 'determinate', + _indeterminate = 'in' + _determinate, + _update = 'update', + _type = 'type', + _click = 'click', + _touch = 'touchbegin.i touchend.i', + _add = 'addClass', + _remove = 'removeClass', + _callback = 'trigger', + _label = 'label', + _cursor = 'cursor', + _mobile = /ipad|iphone|ipod|android|blackberry|windows phone|opera mini|silk/i.test(navigator.userAgent); + + // Plugin init + $.fn[_iCheck] = function(options, fire) { + + // Walker + var handle = 'input[type="' + _checkbox + '"], input[type="' + _radio + '"]', + stack = $(), + walker = function(object) { + object.each(function() { + var self = $(this); + + if (self.is(handle)) { + stack = stack.add(self); + } else { + stack = stack.add(self.find(handle)); + } + }); + }; + + // Check if we should operate with some method + if (/^(check|uncheck|toggle|indeterminate|determinate|disable|enable|update|destroy)$/i.test(options)) { + + // Normalize method's name + options = options.toLowerCase(); + + // Find checkboxes and radio buttons + walker(this); + + return stack.each(function() { + var self = $(this); + + if (options == 'destroy') { + tidy(self, 'ifDestroyed'); + } else { + operate(self, true, options); + } + // Fire method's callback + if ($.isFunction(fire)) { + fire(); + } + }); + + // Customization + } else if (typeof options == 'object' || !options) { + + // Check if any options were passed + var settings = $.extend({ + checkedClass: _checked, + disabledClass: _disabled, + indeterminateClass: _indeterminate, + labelHover: true, + aria: false + }, options), + + selector = settings.handle, + hoverClass = settings.hoverClass || 'hover', + focusClass = settings.focusClass || 'focus', + activeClass = settings.activeClass || 'active', + labelHover = !!settings.labelHover, + labelHoverClass = settings.labelHoverClass || 'hover', + + // Setup clickable area + area = ('' + settings.increaseArea).replace('%', '') | 0; + + // Selector limit + if (selector == _checkbox || selector == _radio) { + handle = 'input[type="' + selector + '"]'; + } + // Clickable area limit + if (area < -50) { + area = -50; + } + // Walk around the selector + walker(this); + + return stack.each(function() { + var self = $(this); + + // If already customized + tidy(self); + + var node = this, + id = node.id, + + // Layer styles + offset = -area + '%', + size = 100 + (area * 2) + '%', + layer = { + position: 'absolute', + top: offset, + left: offset, + display: 'block', + width: size, + height: size, + margin: 0, + padding: 0, + background: '#fff', + border: 0, + opacity: 0 + }, + + // Choose how to hide input + hide = _mobile ? { + position: 'absolute', + visibility: 'hidden' + } : area ? layer : { + position: 'absolute', + opacity: 0 + }, + + // Get proper class + className = node[_type] == _checkbox ? settings.checkboxClass || 'i' + _checkbox : settings.radioClass || 'i' + _radio, + + // Find assigned labels + label = $(_label + '[for="' + id + '"]').add(self.closest(_label)), + + // Check ARIA option + aria = !!settings.aria, + + // Set ARIA placeholder + ariaID = _iCheck + '-' + Math.random().toString(36).replace('0.', ''), + + // Parent & helper + parent = '<div class="' + className + '" ' + (aria ? 'role="' + node[_type] + '" ' : ''), + helper; + + // Set ARIA "labelledby" + if (label.length && aria) { + label.each(function() { + parent += 'aria-labelledby="'; + + if (this.id) { + parent += this.id; + } else { + this.id = ariaID; + parent += ariaID; + } + + parent += '"'; + }); + } + // Wrap input + parent = self.wrap(parent + '/>')[_callback]('ifCreated').parent().append(settings.insert); + + // Layer addition + helper = $('<ins class="' + _iCheckHelper + '"/>').css(layer).appendTo(parent); + + // Finalize customization + self.data(_iCheck, {o: settings, s: self.attr('style')}).css(hide); + !!settings.inheritClass && parent[_add](node.className || ''); + !!settings.inheritID && id && parent.attr('id', _iCheck + '-' + id); + parent.css('position') == 'static' && parent.css('position', 'relative'); + operate(self, true, _update); + + // Label events + if (label.length) { + label.on(_click + '.i mouseover.i mouseout.i ' + _touch, function(event) { + var type = event[_type], + item = $(this); + + // Do nothing if input is disabled + if (!node[_disabled]) { + + // Click + if (type == _click) { + if ($(event.target).is('a')) { + return; + } + operate(self, false, true); + + // Hover state + } else if (labelHover) { + + // mouseout|touchend + if (/ut|nd/.test(type)) { + parent[_remove](hoverClass); + item[_remove](labelHoverClass); + } else { + parent[_add](hoverClass); + item[_add](labelHoverClass); + } + } + if (_mobile) { + event.stopPropagation(); + } else { + return false; + } + } + }); + } + // Input events + self.on(_click + '.i focus.i blur.i keyup.i keydown.i keypress.i', function(event) { + var type = event[_type], + key = event.keyCode; + + // Click + if (type == _click) { + return false; + + // Keydown + } else if (type == 'keydown' && key == 32) { + if (!(node[_type] == _radio && node[_checked])) { + if (node[_checked]) { + off(self, _checked); + } else { + on(self, _checked); + } + } + return false; + + // Keyup + } else if (type == 'keyup' && node[_type] == _radio) { + !node[_checked] && on(self, _checked); + + // Focus/blur + } else if (/us|ur/.test(type)) { + parent[type == 'blur' ? _remove : _add](focusClass); + } + }); + + // Helper events + helper.on(_click + ' mousedown mouseup mouseover mouseout ' + _touch, function(event) { + var type = event[_type], + + // mousedown|mouseup + toggle = /wn|up/.test(type) ? activeClass : hoverClass; + + // Do nothing if input is disabled + if (!node[_disabled]) { + + // Click + if (type == _click) { + operate(self, false, true); + + // Active and hover states + } else { + + // State is on + if (/wn|er|in/.test(type)) { + + // mousedown|mouseover|touchbegin + parent[_add](toggle); + + // State is off + } else { + parent[_remove](toggle + ' ' + activeClass); + } + // Label hover + if (label.length && labelHover && toggle == hoverClass) { + + // mouseout|touchend + label[/ut|nd/.test(type) ? _remove : _add](labelHoverClass); + } + } + if (_mobile) { + event.stopPropagation(); + } else { + return false; + } + } + }); + }); + } else { + return this; + } + }; + + // Do something with inputs + function operate(input, direct, method) { + var node = input[0], + state = /er/.test(method) ? _indeterminate : /bl/.test(method) ? _disabled : _checked, + active = method == _update ? { + checked: node[_checked], + disabled: node[_disabled], + indeterminate: input.attr(_indeterminate) == 'true' || input.attr(_determinate) == 'false' + } : node[state]; + + // Check, disable or indeterminate + if (/^(ch|di|in)/.test(method) && !active) { + on(input, state); + + // Uncheck, enable or determinate + } else if (/^(un|en|de)/.test(method) && active) { + off(input, state); + + // Update + } else if (method == _update) { + + // Handle states + for (var state in active) { + if (active[state]) { + on(input, state, true); + } else { + off(input, state, true); + } + } + } else if (!direct || method == 'toggle') { + + // Helper or label was clicked + if (!direct) { + input[_callback]('ifClicked'); + } + // Toggle checked state + if (active) { + if (node[_type] !== _radio) { + off(input, state); + } + } else { + on(input, state); + } + } + } + // Add checked, disabled or indeterminate state + function on(input, state, keep) { + var node = input[0], + parent = input.parent(), + checked = state == _checked, + indeterminate = state == _indeterminate, + disabled = state == _disabled, + callback = indeterminate ? _determinate : checked ? _unchecked : 'enabled', + regular = option(input, callback + capitalize(node[_type])), + specific = option(input, state + capitalize(node[_type])); + + // Prevent unnecessary actions + if (node[state] !== true) { + + // Toggle assigned radio buttons + if (!keep && state == _checked && node[_type] == _radio && node.name) { + var form = input.closest('form'), + inputs = 'input[name="' + node.name + '"]'; + + inputs = form.length ? form.find(inputs) : $(inputs); + + inputs.each(function() { + if (this !== node && $(this).data(_iCheck)) { + off($(this), state); + } + }); + } + // Indeterminate state + if (indeterminate) { + + // Add indeterminate state + node[state] = true; + + // Remove checked state + if (node[_checked]) { + off(input, _checked, 'force'); + } + // Checked or disabled state + } else { + + // Add checked or disabled state + if (!keep) { + node[state] = true; + } + // Remove indeterminate state + if (checked && node[_indeterminate]) { + off(input, _indeterminate, false); + } + } + // Trigger callbacks + callbacks(input, checked, state, keep); + } + // Add proper cursor + if (node[_disabled] && !!option(input, _cursor, true)) { + parent.find('.' + _iCheckHelper).css(_cursor, 'default'); + } + // Add state class + parent[_add](specific || option(input, state) || ''); + + // Set ARIA attribute + disabled ? parent.attr('aria-disabled', 'true') : parent.attr('aria-checked', indeterminate ? 'mixed' : 'true'); + + // Remove regular state class + parent[_remove](regular || option(input, callback) || ''); + } + // Remove checked, disabled or indeterminate state + function off(input, state, keep) { + var node = input[0], + parent = input.parent(), + checked = state == _checked, + indeterminate = state == _indeterminate, + disabled = state == _disabled, + callback = indeterminate ? _determinate : checked ? _unchecked : 'enabled', + regular = option(input, callback + capitalize(node[_type])), + specific = option(input, state + capitalize(node[_type])); + + // Prevent unnecessary actions + if (node[state] !== false) { + + // Toggle state + if (indeterminate || !keep || keep == 'force') { + node[state] = false; + } + // Trigger callbacks + callbacks(input, checked, callback, keep); + } + // Add proper cursor + if (!node[_disabled] && !!option(input, _cursor, true)) { + parent.find('.' + _iCheckHelper).css(_cursor, 'pointer'); + } + // Remove state class + parent[_remove](specific || option(input, state) || ''); + + // Set ARIA attribute + disabled ? parent.attr('aria-disabled', 'false') : parent.attr('aria-checked', 'false'); + + // Add regular state class + parent[_add](regular || option(input, callback) || ''); + } + // Remove all traces + function tidy(input, callback) { + if (input.data(_iCheck)) { + + // Remove everything except input + input.parent().html(input.attr('style', input.data(_iCheck).s || '')); + + // Callback + if (callback) { + input[_callback](callback); + } + // Unbind events + input.off('.i').unwrap(); + $(_label + '[for="' + input[0].id + '"]').add(input.closest(_label)).off('.i'); + } + } + // Get some option + function option(input, state, regular) { + if (input.data(_iCheck)) { + return input.data(_iCheck).o[state + (regular ? '' : 'Class')]; + } + } + // Capitalize some string + function capitalize(string) { + return string.charAt(0).toUpperCase() + string.slice(1); + } + // Executable handlers + function callbacks(input, checked, callback, keep) { + if (!keep) { + if (checked) { + input[_callback]('ifToggled'); + } + input[_callback]('ifChanged')[_callback]('if' + capitalize(callback)); + } + } +})(window.jQuery || window.Zepto); diff --git a/theme/bootstrap/plugins/iCheck/icheck.min.js b/theme/bootstrap/plugins/iCheck/icheck.min.js new file mode 100644 index 0000000..d2720ed --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/icheck.min.js @@ -0,0 +1,10 @@ +/*! iCheck v1.0.1 by Damir Sultanov, http://git.io/arlzeA, MIT Licensed */ +(function(h){function F(a,b,d){var c=a[0],e=/er/.test(d)?m:/bl/.test(d)?s:l,f=d==H?{checked:c[l],disabled:c[s],indeterminate:"true"==a.attr(m)||"false"==a.attr(w)}:c[e];if(/^(ch|di|in)/.test(d)&&!f)D(a,e);else if(/^(un|en|de)/.test(d)&&f)t(a,e);else if(d==H)for(e in f)f[e]?D(a,e,!0):t(a,e,!0);else if(!b||"toggle"==d){if(!b)a[p]("ifClicked");f?c[n]!==u&&t(a,e):D(a,e)}}function D(a,b,d){var c=a[0],e=a.parent(),f=b==l,A=b==m,B=b==s,K=A?w:f?E:"enabled",p=k(a,K+x(c[n])),N=k(a,b+x(c[n]));if(!0!==c[b]){if(!d&& +b==l&&c[n]==u&&c.name){var C=a.closest("form"),r='input[name="'+c.name+'"]',r=C.length?C.find(r):h(r);r.each(function(){this!==c&&h(this).data(q)&&t(h(this),b)})}A?(c[b]=!0,c[l]&&t(a,l,"force")):(d||(c[b]=!0),f&&c[m]&&t(a,m,!1));L(a,f,b,d)}c[s]&&k(a,y,!0)&&e.find("."+I).css(y,"default");e[v](N||k(a,b)||"");B?e.attr("aria-disabled","true"):e.attr("aria-checked",A?"mixed":"true");e[z](p||k(a,K)||"")}function t(a,b,d){var c=a[0],e=a.parent(),f=b==l,h=b==m,q=b==s,p=h?w:f?E:"enabled",t=k(a,p+x(c[n])), +u=k(a,b+x(c[n]));if(!1!==c[b]){if(h||!d||"force"==d)c[b]=!1;L(a,f,p,d)}!c[s]&&k(a,y,!0)&&e.find("."+I).css(y,"pointer");e[z](u||k(a,b)||"");q?e.attr("aria-disabled","false"):e.attr("aria-checked","false");e[v](t||k(a,p)||"")}function M(a,b){if(a.data(q)){a.parent().html(a.attr("style",a.data(q).s||""));if(b)a[p](b);a.off(".i").unwrap();h(G+'[for="'+a[0].id+'"]').add(a.closest(G)).off(".i")}}function k(a,b,d){if(a.data(q))return a.data(q).o[b+(d?"":"Class")]}function x(a){return a.charAt(0).toUpperCase()+ +a.slice(1)}function L(a,b,d,c){if(!c){if(b)a[p]("ifToggled");a[p]("ifChanged")[p]("if"+x(d))}}var q="iCheck",I=q+"-helper",u="radio",l="checked",E="un"+l,s="disabled",w="determinate",m="in"+w,H="update",n="type",v="addClass",z="removeClass",p="trigger",G="label",y="cursor",J=/ipad|iphone|ipod|android|blackberry|windows phone|opera mini|silk/i.test(navigator.userAgent);h.fn[q]=function(a,b){var d='input[type="checkbox"], input[type="'+u+'"]',c=h(),e=function(a){a.each(function(){var a=h(this);c=a.is(d)? +c.add(a):c.add(a.find(d))})};if(/^(check|uncheck|toggle|indeterminate|determinate|disable|enable|update|destroy)$/i.test(a))return a=a.toLowerCase(),e(this),c.each(function(){var c=h(this);"destroy"==a?M(c,"ifDestroyed"):F(c,!0,a);h.isFunction(b)&&b()});if("object"!=typeof a&&a)return this;var f=h.extend({checkedClass:l,disabledClass:s,indeterminateClass:m,labelHover:!0,aria:!1},a),k=f.handle,B=f.hoverClass||"hover",x=f.focusClass||"focus",w=f.activeClass||"active",y=!!f.labelHover,C=f.labelHoverClass|| +"hover",r=(""+f.increaseArea).replace("%","")|0;if("checkbox"==k||k==u)d='input[type="'+k+'"]';-50>r&&(r=-50);e(this);return c.each(function(){var a=h(this);M(a);var c=this,b=c.id,e=-r+"%",d=100+2*r+"%",d={position:"absolute",top:e,left:e,display:"block",width:d,height:d,margin:0,padding:0,background:"#fff",border:0,opacity:0},e=J?{position:"absolute",visibility:"hidden"}:r?d:{position:"absolute",opacity:0},k="checkbox"==c[n]?f.checkboxClass||"icheckbox":f.radioClass||"i"+u,m=h(G+'[for="'+b+'"]').add(a.closest(G)), +A=!!f.aria,E=q+"-"+Math.random().toString(36).replace("0.",""),g='<div class="'+k+'" '+(A?'role="'+c[n]+'" ':"");m.length&&A&&m.each(function(){g+='aria-labelledby="';this.id?g+=this.id:(this.id=E,g+=E);g+='"'});g=a.wrap(g+"/>")[p]("ifCreated").parent().append(f.insert);d=h('<ins class="'+I+'"/>').css(d).appendTo(g);a.data(q,{o:f,s:a.attr("style")}).css(e);f.inheritClass&&g[v](c.className||"");f.inheritID&&b&&g.attr("id",q+"-"+b);"static"==g.css("position")&&g.css("position","relative");F(a,!0,H); +if(m.length)m.on("click.i mouseover.i mouseout.i touchbegin.i touchend.i",function(b){var d=b[n],e=h(this);if(!c[s]){if("click"==d){if(h(b.target).is("a"))return;F(a,!1,!0)}else y&&(/ut|nd/.test(d)?(g[z](B),e[z](C)):(g[v](B),e[v](C)));if(J)b.stopPropagation();else return!1}});a.on("click.i focus.i blur.i keyup.i keydown.i keypress.i",function(b){var d=b[n];b=b.keyCode;if("click"==d)return!1;if("keydown"==d&&32==b)return c[n]==u&&c[l]||(c[l]?t(a,l):D(a,l)),!1;if("keyup"==d&&c[n]==u)!c[l]&&D(a,l);else if(/us|ur/.test(d))g["blur"== +d?z:v](x)});d.on("click mousedown mouseup mouseover mouseout touchbegin.i touchend.i",function(b){var d=b[n],e=/wn|up/.test(d)?w:B;if(!c[s]){if("click"==d)F(a,!1,!0);else{if(/wn|er|in/.test(d))g[v](e);else g[z](e+" "+w);if(m.length&&y&&e==B)m[/ut|nd/.test(d)?z:v](C)}if(J)b.stopPropagation();else return!1}})})}})(window.jQuery||window.Zepto); diff --git a/theme/bootstrap/plugins/iCheck/line/_all.css b/theme/bootstrap/plugins/iCheck/line/_all.css new file mode 100644 index 0000000..a18d0d9 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/line/_all.css @@ -0,0 +1,740 @@ +/* iCheck plugin Line skin +----------------------------------- */ +.icheckbox_line, +.iradio_line { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #000; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line .icheck_line-icon, + .iradio_line .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line.hover, + .icheckbox_line.checked.hover, + .iradio_line.hover { + background: #444; + } + .icheckbox_line.checked, + .iradio_line.checked { + background: #000; + } + .icheckbox_line.checked .icheck_line-icon, + .iradio_line.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line.disabled, + .iradio_line.disabled { + background: #ccc; + cursor: default; + } + .icheckbox_line.disabled .icheck_line-icon, + .iradio_line.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line.checked.disabled, + .iradio_line.checked.disabled { + background: #ccc; + } + .icheckbox_line.checked.disabled .icheck_line-icon, + .iradio_line.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_line .icheck_line-icon, + .iradio_line .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} + +/* red */ +.icheckbox_line-red, +.iradio_line-red { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #e56c69; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-red .icheck_line-icon, + .iradio_line-red .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-red.hover, + .icheckbox_line-red.checked.hover, + .iradio_line-red.hover { + background: #E98582; + } + .icheckbox_line-red.checked, + .iradio_line-red.checked { + background: #e56c69; + } + .icheckbox_line-red.checked .icheck_line-icon, + .iradio_line-red.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-red.disabled, + .iradio_line-red.disabled { + background: #F7D3D2; + cursor: default; + } + .icheckbox_line-red.disabled .icheck_line-icon, + .iradio_line-red.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-red.checked.disabled, + .iradio_line-red.checked.disabled { + background: #F7D3D2; + } + .icheckbox_line-red.checked.disabled .icheck_line-icon, + .iradio_line-red.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_line-red .icheck_line-icon, + .iradio_line-red .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} + +/* green */ +.icheckbox_line-green, +.iradio_line-green { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #1b7e5a; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-green .icheck_line-icon, + .iradio_line-green .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-green.hover, + .icheckbox_line-green.checked.hover, + .iradio_line-green.hover { + background: #24AA7A; + } + .icheckbox_line-green.checked, + .iradio_line-green.checked { + background: #1b7e5a; + } + .icheckbox_line-green.checked .icheck_line-icon, + .iradio_line-green.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-green.disabled, + .iradio_line-green.disabled { + background: #89E6C4; + cursor: default; + } + .icheckbox_line-green.disabled .icheck_line-icon, + .iradio_line-green.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-green.checked.disabled, + .iradio_line-green.checked.disabled { + background: #89E6C4; + } + .icheckbox_line-green.checked.disabled .icheck_line-icon, + .iradio_line-green.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_line-green .icheck_line-icon, + .iradio_line-green .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} + +/* blue */ +.icheckbox_line-blue, +.iradio_line-blue { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #2489c5; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-blue .icheck_line-icon, + .iradio_line-blue .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-blue.hover, + .icheckbox_line-blue.checked.hover, + .iradio_line-blue.hover { + background: #3DA0DB; + } + .icheckbox_line-blue.checked, + .iradio_line-blue.checked { + background: #2489c5; + } + .icheckbox_line-blue.checked .icheck_line-icon, + .iradio_line-blue.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-blue.disabled, + .iradio_line-blue.disabled { + background: #ADD7F0; + cursor: default; + } + .icheckbox_line-blue.disabled .icheck_line-icon, + .iradio_line-blue.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-blue.checked.disabled, + .iradio_line-blue.checked.disabled { + background: #ADD7F0; + } + .icheckbox_line-blue.checked.disabled .icheck_line-icon, + .iradio_line-blue.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_line-blue .icheck_line-icon, + .iradio_line-blue .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} + +/* aero */ +.icheckbox_line-aero, +.iradio_line-aero { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #9cc2cb; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-aero .icheck_line-icon, + .iradio_line-aero .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-aero.hover, + .icheckbox_line-aero.checked.hover, + .iradio_line-aero.hover { + background: #B5D1D8; + } + .icheckbox_line-aero.checked, + .iradio_line-aero.checked { + background: #9cc2cb; + } + .icheckbox_line-aero.checked .icheck_line-icon, + .iradio_line-aero.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-aero.disabled, + .iradio_line-aero.disabled { + background: #D2E4E8; + cursor: default; + } + .icheckbox_line-aero.disabled .icheck_line-icon, + .iradio_line-aero.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-aero.checked.disabled, + .iradio_line-aero.checked.disabled { + background: #D2E4E8; + } + .icheckbox_line-aero.checked.disabled .icheck_line-icon, + .iradio_line-aero.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_line-aero .icheck_line-icon, + .iradio_line-aero .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} + +/* grey */ +.icheckbox_line-grey, +.iradio_line-grey { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #73716e; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-grey .icheck_line-icon, + .iradio_line-grey .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-grey.hover, + .icheckbox_line-grey.checked.hover, + .iradio_line-grey.hover { + background: #8B8986; + } + .icheckbox_line-grey.checked, + .iradio_line-grey.checked { + background: #73716e; + } + .icheckbox_line-grey.checked .icheck_line-icon, + .iradio_line-grey.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-grey.disabled, + .iradio_line-grey.disabled { + background: #D5D4D3; + cursor: default; + } + .icheckbox_line-grey.disabled .icheck_line-icon, + .iradio_line-grey.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-grey.checked.disabled, + .iradio_line-grey.checked.disabled { + background: #D5D4D3; + } + .icheckbox_line-grey.checked.disabled .icheck_line-icon, + .iradio_line-grey.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_line-grey .icheck_line-icon, + .iradio_line-grey .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} + +/* orange */ +.icheckbox_line-orange, +.iradio_line-orange { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #f70; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-orange .icheck_line-icon, + .iradio_line-orange .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-orange.hover, + .icheckbox_line-orange.checked.hover, + .iradio_line-orange.hover { + background: #FF9233; + } + .icheckbox_line-orange.checked, + .iradio_line-orange.checked { + background: #f70; + } + .icheckbox_line-orange.checked .icheck_line-icon, + .iradio_line-orange.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-orange.disabled, + .iradio_line-orange.disabled { + background: #FFD6B3; + cursor: default; + } + .icheckbox_line-orange.disabled .icheck_line-icon, + .iradio_line-orange.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-orange.checked.disabled, + .iradio_line-orange.checked.disabled { + background: #FFD6B3; + } + .icheckbox_line-orange.checked.disabled .icheck_line-icon, + .iradio_line-orange.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_line-orange .icheck_line-icon, + .iradio_line-orange .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} + +/* yellow */ +.icheckbox_line-yellow, +.iradio_line-yellow { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #FFC414; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-yellow .icheck_line-icon, + .iradio_line-yellow .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-yellow.hover, + .icheckbox_line-yellow.checked.hover, + .iradio_line-yellow.hover { + background: #FFD34F; + } + .icheckbox_line-yellow.checked, + .iradio_line-yellow.checked { + background: #FFC414; + } + .icheckbox_line-yellow.checked .icheck_line-icon, + .iradio_line-yellow.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-yellow.disabled, + .iradio_line-yellow.disabled { + background: #FFE495; + cursor: default; + } + .icheckbox_line-yellow.disabled .icheck_line-icon, + .iradio_line-yellow.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-yellow.checked.disabled, + .iradio_line-yellow.checked.disabled { + background: #FFE495; + } + .icheckbox_line-yellow.checked.disabled .icheck_line-icon, + .iradio_line-yellow.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_line-yellow .icheck_line-icon, + .iradio_line-yellow .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} + +/* pink */ +.icheckbox_line-pink, +.iradio_line-pink { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #a77a94; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-pink .icheck_line-icon, + .iradio_line-pink .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-pink.hover, + .icheckbox_line-pink.checked.hover, + .iradio_line-pink.hover { + background: #B995A9; + } + .icheckbox_line-pink.checked, + .iradio_line-pink.checked { + background: #a77a94; + } + .icheckbox_line-pink.checked .icheck_line-icon, + .iradio_line-pink.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-pink.disabled, + .iradio_line-pink.disabled { + background: #E0D0DA; + cursor: default; + } + .icheckbox_line-pink.disabled .icheck_line-icon, + .iradio_line-pink.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-pink.checked.disabled, + .iradio_line-pink.checked.disabled { + background: #E0D0DA; + } + .icheckbox_line-pink.checked.disabled .icheck_line-icon, + .iradio_line-pink.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_line-pink .icheck_line-icon, + .iradio_line-pink .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} + +/* purple */ +.icheckbox_line-purple, +.iradio_line-purple { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #6a5a8c; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-purple .icheck_line-icon, + .iradio_line-purple .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-purple.hover, + .icheckbox_line-purple.checked.hover, + .iradio_line-purple.hover { + background: #8677A7; + } + .icheckbox_line-purple.checked, + .iradio_line-purple.checked { + background: #6a5a8c; + } + .icheckbox_line-purple.checked .icheck_line-icon, + .iradio_line-purple.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-purple.disabled, + .iradio_line-purple.disabled { + background: #D2CCDE; + cursor: default; + } + .icheckbox_line-purple.disabled .icheck_line-icon, + .iradio_line-purple.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-purple.checked.disabled, + .iradio_line-purple.checked.disabled { + background: #D2CCDE; + } + .icheckbox_line-purple.checked.disabled .icheck_line-icon, + .iradio_line-purple.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_line-purple .icheck_line-icon, + .iradio_line-purple .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/line/aero.css b/theme/bootstrap/plugins/iCheck/line/aero.css new file mode 100644 index 0000000..44989a4 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/line/aero.css @@ -0,0 +1,74 @@ +/* iCheck plugin Line skin, aero +----------------------------------- */ +.icheckbox_line-aero, +.iradio_line-aero { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #9cc2cb; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-aero .icheck_line-icon, + .iradio_line-aero .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-aero.hover, + .icheckbox_line-aero.checked.hover, + .iradio_line-aero.hover { + background: #B5D1D8; + } + .icheckbox_line-aero.checked, + .iradio_line-aero.checked { + background: #9cc2cb; + } + .icheckbox_line-aero.checked .icheck_line-icon, + .iradio_line-aero.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-aero.disabled, + .iradio_line-aero.disabled { + background: #D2E4E8; + cursor: default; + } + .icheckbox_line-aero.disabled .icheck_line-icon, + .iradio_line-aero.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-aero.checked.disabled, + .iradio_line-aero.checked.disabled { + background: #D2E4E8; + } + .icheckbox_line-aero.checked.disabled .icheck_line-icon, + .iradio_line-aero.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_line-aero .icheck_line-icon, + .iradio_line-aero .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/line/blue.css b/theme/bootstrap/plugins/iCheck/line/blue.css new file mode 100644 index 0000000..5c9c0a7 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/line/blue.css @@ -0,0 +1,74 @@ +/* iCheck plugin Line skin, blue +----------------------------------- */ +.icheckbox_line-blue, +.iradio_line-blue { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #2489c5; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-blue .icheck_line-icon, + .iradio_line-blue .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-blue.hover, + .icheckbox_line-blue.checked.hover, + .iradio_line-blue.hover { + background: #3DA0DB; + } + .icheckbox_line-blue.checked, + .iradio_line-blue.checked { + background: #2489c5; + } + .icheckbox_line-blue.checked .icheck_line-icon, + .iradio_line-blue.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-blue.disabled, + .iradio_line-blue.disabled { + background: #ADD7F0; + cursor: default; + } + .icheckbox_line-blue.disabled .icheck_line-icon, + .iradio_line-blue.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-blue.checked.disabled, + .iradio_line-blue.checked.disabled { + background: #ADD7F0; + } + .icheckbox_line-blue.checked.disabled .icheck_line-icon, + .iradio_line-blue.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_line-blue .icheck_line-icon, + .iradio_line-blue .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/line/green.css b/theme/bootstrap/plugins/iCheck/line/green.css new file mode 100644 index 0000000..8bbe514 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/line/green.css @@ -0,0 +1,74 @@ +/* iCheck plugin Line skin, green +----------------------------------- */ +.icheckbox_line-green, +.iradio_line-green { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #1b7e5a; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-green .icheck_line-icon, + .iradio_line-green .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-green.hover, + .icheckbox_line-green.checked.hover, + .iradio_line-green.hover { + background: #24AA7A; + } + .icheckbox_line-green.checked, + .iradio_line-green.checked { + background: #1b7e5a; + } + .icheckbox_line-green.checked .icheck_line-icon, + .iradio_line-green.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-green.disabled, + .iradio_line-green.disabled { + background: #89E6C4; + cursor: default; + } + .icheckbox_line-green.disabled .icheck_line-icon, + .iradio_line-green.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-green.checked.disabled, + .iradio_line-green.checked.disabled { + background: #89E6C4; + } + .icheckbox_line-green.checked.disabled .icheck_line-icon, + .iradio_line-green.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_line-green .icheck_line-icon, + .iradio_line-green .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/line/grey.css b/theme/bootstrap/plugins/iCheck/line/grey.css new file mode 100644 index 0000000..fc16a80 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/line/grey.css @@ -0,0 +1,74 @@ +/* iCheck plugin Line skin, grey +----------------------------------- */ +.icheckbox_line-grey, +.iradio_line-grey { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #73716e; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-grey .icheck_line-icon, + .iradio_line-grey .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-grey.hover, + .icheckbox_line-grey.checked.hover, + .iradio_line-grey.hover { + background: #8B8986; + } + .icheckbox_line-grey.checked, + .iradio_line-grey.checked { + background: #73716e; + } + .icheckbox_line-grey.checked .icheck_line-icon, + .iradio_line-grey.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-grey.disabled, + .iradio_line-grey.disabled { + background: #D5D4D3; + cursor: default; + } + .icheckbox_line-grey.disabled .icheck_line-icon, + .iradio_line-grey.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-grey.checked.disabled, + .iradio_line-grey.checked.disabled { + background: #D5D4D3; + } + .icheckbox_line-grey.checked.disabled .icheck_line-icon, + .iradio_line-grey.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_line-grey .icheck_line-icon, + .iradio_line-grey .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/line/line.css b/theme/bootstrap/plugins/iCheck/line/line.css new file mode 100644 index 0000000..dbde8d4 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/line/line.css @@ -0,0 +1,74 @@ +/* iCheck plugin Line skin, black +----------------------------------- */ +.icheckbox_line, +.iradio_line { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #000; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line .icheck_line-icon, + .iradio_line .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line.hover, + .icheckbox_line.checked.hover, + .iradio_line.hover { + background: #444; + } + .icheckbox_line.checked, + .iradio_line.checked { + background: #000; + } + .icheckbox_line.checked .icheck_line-icon, + .iradio_line.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line.disabled, + .iradio_line.disabled { + background: #ccc; + cursor: default; + } + .icheckbox_line.disabled .icheck_line-icon, + .iradio_line.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line.checked.disabled, + .iradio_line.checked.disabled { + background: #ccc; + } + .icheckbox_line.checked.disabled .icheck_line-icon, + .iradio_line.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_line .icheck_line-icon, + .iradio_line .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/line/line.png b/theme/bootstrap/plugins/iCheck/line/line.png new file mode 100644 index 0000000..d21d7a7 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/line/line.png differ diff --git a/theme/bootstrap/plugins/iCheck/line/line@2x.png b/theme/bootstrap/plugins/iCheck/line/line@2x.png new file mode 100644 index 0000000..62900a2 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/line/line@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/line/orange.css b/theme/bootstrap/plugins/iCheck/line/orange.css new file mode 100644 index 0000000..210f334 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/line/orange.css @@ -0,0 +1,74 @@ +/* iCheck plugin Line skin, orange +----------------------------------- */ +.icheckbox_line-orange, +.iradio_line-orange { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #f70; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-orange .icheck_line-icon, + .iradio_line-orange .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-orange.hover, + .icheckbox_line-orange.checked.hover, + .iradio_line-orange.hover { + background: #FF9233; + } + .icheckbox_line-orange.checked, + .iradio_line-orange.checked { + background: #f70; + } + .icheckbox_line-orange.checked .icheck_line-icon, + .iradio_line-orange.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-orange.disabled, + .iradio_line-orange.disabled { + background: #FFD6B3; + cursor: default; + } + .icheckbox_line-orange.disabled .icheck_line-icon, + .iradio_line-orange.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-orange.checked.disabled, + .iradio_line-orange.checked.disabled { + background: #FFD6B3; + } + .icheckbox_line-orange.checked.disabled .icheck_line-icon, + .iradio_line-orange.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_line-orange .icheck_line-icon, + .iradio_line-orange .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/line/pink.css b/theme/bootstrap/plugins/iCheck/line/pink.css new file mode 100644 index 0000000..44c9cea --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/line/pink.css @@ -0,0 +1,74 @@ +/* iCheck plugin Line skin, pink +----------------------------------- */ +.icheckbox_line-pink, +.iradio_line-pink { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #a77a94; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-pink .icheck_line-icon, + .iradio_line-pink .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-pink.hover, + .icheckbox_line-pink.checked.hover, + .iradio_line-pink.hover { + background: #B995A9; + } + .icheckbox_line-pink.checked, + .iradio_line-pink.checked { + background: #a77a94; + } + .icheckbox_line-pink.checked .icheck_line-icon, + .iradio_line-pink.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-pink.disabled, + .iradio_line-pink.disabled { + background: #E0D0DA; + cursor: default; + } + .icheckbox_line-pink.disabled .icheck_line-icon, + .iradio_line-pink.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-pink.checked.disabled, + .iradio_line-pink.checked.disabled { + background: #E0D0DA; + } + .icheckbox_line-pink.checked.disabled .icheck_line-icon, + .iradio_line-pink.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_line-pink .icheck_line-icon, + .iradio_line-pink .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/line/purple.css b/theme/bootstrap/plugins/iCheck/line/purple.css new file mode 100644 index 0000000..be4c4e2 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/line/purple.css @@ -0,0 +1,74 @@ +/* iCheck plugin Line skin, purple +----------------------------------- */ +.icheckbox_line-purple, +.iradio_line-purple { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #6a5a8c; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-purple .icheck_line-icon, + .iradio_line-purple .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-purple.hover, + .icheckbox_line-purple.checked.hover, + .iradio_line-purple.hover { + background: #8677A7; + } + .icheckbox_line-purple.checked, + .iradio_line-purple.checked { + background: #6a5a8c; + } + .icheckbox_line-purple.checked .icheck_line-icon, + .iradio_line-purple.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-purple.disabled, + .iradio_line-purple.disabled { + background: #D2CCDE; + cursor: default; + } + .icheckbox_line-purple.disabled .icheck_line-icon, + .iradio_line-purple.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-purple.checked.disabled, + .iradio_line-purple.checked.disabled { + background: #D2CCDE; + } + .icheckbox_line-purple.checked.disabled .icheck_line-icon, + .iradio_line-purple.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_line-purple .icheck_line-icon, + .iradio_line-purple .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/line/red.css b/theme/bootstrap/plugins/iCheck/line/red.css new file mode 100644 index 0000000..ebcd8be --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/line/red.css @@ -0,0 +1,74 @@ +/* iCheck plugin Line skin, red +----------------------------------- */ +.icheckbox_line-red, +.iradio_line-red { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #e56c69; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-red .icheck_line-icon, + .iradio_line-red .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-red.hover, + .icheckbox_line-red.checked.hover, + .iradio_line-red.hover { + background: #E98582; + } + .icheckbox_line-red.checked, + .iradio_line-red.checked { + background: #e56c69; + } + .icheckbox_line-red.checked .icheck_line-icon, + .iradio_line-red.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-red.disabled, + .iradio_line-red.disabled { + background: #F7D3D2; + cursor: default; + } + .icheckbox_line-red.disabled .icheck_line-icon, + .iradio_line-red.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-red.checked.disabled, + .iradio_line-red.checked.disabled { + background: #F7D3D2; + } + .icheckbox_line-red.checked.disabled .icheck_line-icon, + .iradio_line-red.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_line-red .icheck_line-icon, + .iradio_line-red .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/line/yellow.css b/theme/bootstrap/plugins/iCheck/line/yellow.css new file mode 100644 index 0000000..8e08871 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/line/yellow.css @@ -0,0 +1,74 @@ +/* iCheck plugin Line skin, yellow +----------------------------------- */ +.icheckbox_line-yellow, +.iradio_line-yellow { + position: relative; + display: block; + margin: 0; + padding: 5px 15px 5px 38px; + font-size: 13px; + line-height: 17px; + color: #fff; + background: #FFC414; + border: none; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + cursor: pointer; +} + .icheckbox_line-yellow .icheck_line-icon, + .iradio_line-yellow .icheck_line-icon { + position: absolute; + top: 50%; + left: 13px; + width: 13px; + height: 11px; + margin: -5px 0 0 0; + padding: 0; + overflow: hidden; + background: url(line.png) no-repeat; + border: none; + } + .icheckbox_line-yellow.hover, + .icheckbox_line-yellow.checked.hover, + .iradio_line-yellow.hover { + background: #FFD34F; + } + .icheckbox_line-yellow.checked, + .iradio_line-yellow.checked { + background: #FFC414; + } + .icheckbox_line-yellow.checked .icheck_line-icon, + .iradio_line-yellow.checked .icheck_line-icon { + background-position: -15px 0; + } + .icheckbox_line-yellow.disabled, + .iradio_line-yellow.disabled { + background: #FFE495; + cursor: default; + } + .icheckbox_line-yellow.disabled .icheck_line-icon, + .iradio_line-yellow.disabled .icheck_line-icon { + background-position: -30px 0; + } + .icheckbox_line-yellow.checked.disabled, + .iradio_line-yellow.checked.disabled { + background: #FFE495; + } + .icheckbox_line-yellow.checked.disabled .icheck_line-icon, + .iradio_line-yellow.checked.disabled .icheck_line-icon { + background-position: -45px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_line-yellow .icheck_line-icon, + .iradio_line-yellow .icheck_line-icon { + background-image: url(line@2x.png); + -webkit-background-size: 60px 13px; + background-size: 60px 13px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/minimal/_all.css b/theme/bootstrap/plugins/iCheck/minimal/_all.css new file mode 100644 index 0000000..b2165ec --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/minimal/_all.css @@ -0,0 +1,557 @@ +/* red */ +.icheckbox_minimal-red, +.iradio_minimal-red { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(red.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-red { + background-position: 0 0; +} + .icheckbox_minimal-red.hover { + background-position: -20px 0; + } + .icheckbox_minimal-red.checked { + background-position: -40px 0; + } + .icheckbox_minimal-red.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-red.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-red { + background-position: -100px 0; +} + .iradio_minimal-red.hover { + background-position: -120px 0; + } + .iradio_minimal-red.checked { + background-position: -140px 0; + } + .iradio_minimal-red.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-red.checked.disabled { + background-position: -180px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 1.5), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_minimal-red, + .iradio_minimal-red { + background-image: url(red@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} + +/* green */ +.icheckbox_minimal-green, +.iradio_minimal-green { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(green.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-green { + background-position: 0 0; +} + .icheckbox_minimal-green.hover { + background-position: -20px 0; + } + .icheckbox_minimal-green.checked { + background-position: -40px 0; + } + .icheckbox_minimal-green.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-green.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-green { + background-position: -100px 0; +} + .iradio_minimal-green.hover { + background-position: -120px 0; + } + .iradio_minimal-green.checked { + background-position: -140px 0; + } + .iradio_minimal-green.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-green.checked.disabled { + background-position: -180px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 1.5), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_minimal-green, + .iradio_minimal-green { + background-image: url(green@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} + +/* blue */ +.icheckbox_minimal-blue, +.iradio_minimal-blue { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(blue.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-blue { + background-position: 0 0; +} + .icheckbox_minimal-blue.hover { + background-position: -20px 0; + } + .icheckbox_minimal-blue.checked { + background-position: -40px 0; + } + .icheckbox_minimal-blue.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-blue.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-blue { + background-position: -100px 0; +} + .iradio_minimal-blue.hover { + background-position: -120px 0; + } + .iradio_minimal-blue.checked { + background-position: -140px 0; + } + .iradio_minimal-blue.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-blue.checked.disabled { + background-position: -180px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_minimal-blue, + .iradio_minimal-blue { + background-image: url(blue@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} + +/* aero */ +.icheckbox_minimal-aero, +.iradio_minimal-aero { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(aero.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-aero { + background-position: 0 0; +} + .icheckbox_minimal-aero.hover { + background-position: -20px 0; + } + .icheckbox_minimal-aero.checked { + background-position: -40px 0; + } + .icheckbox_minimal-aero.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-aero.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-aero { + background-position: -100px 0; +} + .iradio_minimal-aero.hover { + background-position: -120px 0; + } + .iradio_minimal-aero.checked { + background-position: -140px 0; + } + .iradio_minimal-aero.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-aero.checked.disabled { + background-position: -180px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_minimal-aero, + .iradio_minimal-aero { + background-image: url(aero@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} + +/* grey */ +.icheckbox_minimal-grey, +.iradio_minimal-grey { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(grey.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-grey { + background-position: 0 0; +} + .icheckbox_minimal-grey.hover { + background-position: -20px 0; + } + .icheckbox_minimal-grey.checked { + background-position: -40px 0; + } + .icheckbox_minimal-grey.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-grey.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-grey { + background-position: -100px 0; +} + .iradio_minimal-grey.hover { + background-position: -120px 0; + } + .iradio_minimal-grey.checked { + background-position: -140px 0; + } + .iradio_minimal-grey.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-grey.checked.disabled { + background-position: -180px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 1.5), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_minimal-grey, + .iradio_minimal-grey { + background-image: url(grey@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} + +/* orange */ +.icheckbox_minimal-orange, +.iradio_minimal-orange { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(orange.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-orange { + background-position: 0 0; +} + .icheckbox_minimal-orange.hover { + background-position: -20px 0; + } + .icheckbox_minimal-orange.checked { + background-position: -40px 0; + } + .icheckbox_minimal-orange.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-orange.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-orange { + background-position: -100px 0; +} + .iradio_minimal-orange.hover { + background-position: -120px 0; + } + .iradio_minimal-orange.checked { + background-position: -140px 0; + } + .iradio_minimal-orange.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-orange.checked.disabled { + background-position: -180px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 1.5), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_minimal-orange, + .iradio_minimal-orange { + background-image: url(orange@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} + +/* yellow */ +.icheckbox_minimal-yellow, +.iradio_minimal-yellow { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(yellow.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-yellow { + background-position: 0 0; +} + .icheckbox_minimal-yellow.hover { + background-position: -20px 0; + } + .icheckbox_minimal-yellow.checked { + background-position: -40px 0; + } + .icheckbox_minimal-yellow.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-yellow.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-yellow { + background-position: -100px 0; +} + .iradio_minimal-yellow.hover { + background-position: -120px 0; + } + .iradio_minimal-yellow.checked { + background-position: -140px 0; + } + .iradio_minimal-yellow.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-yellow.checked.disabled { + background-position: -180px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 1.5), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_minimal-yellow, + .iradio_minimal-yellow { + background-image: url(yellow@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} + +/* pink */ +.icheckbox_minimal-pink, +.iradio_minimal-pink { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(pink.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-pink { + background-position: 0 0; +} + .icheckbox_minimal-pink.hover { + background-position: -20px 0; + } + .icheckbox_minimal-pink.checked { + background-position: -40px 0; + } + .icheckbox_minimal-pink.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-pink.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-pink { + background-position: -100px 0; +} + .iradio_minimal-pink.hover { + background-position: -120px 0; + } + .iradio_minimal-pink.checked { + background-position: -140px 0; + } + .iradio_minimal-pink.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-pink.checked.disabled { + background-position: -180px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 1.5), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_minimal-pink, + .iradio_minimal-pink { + background-image: url(pink@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} + +/* purple */ +.icheckbox_minimal-purple, +.iradio_minimal-purple { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(purple.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-purple { + background-position: 0 0; +} + .icheckbox_minimal-purple.hover { + background-position: -20px 0; + } + .icheckbox_minimal-purple.checked { + background-position: -40px 0; + } + .icheckbox_minimal-purple.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-purple.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-purple { + background-position: -100px 0; +} + .iradio_minimal-purple.hover { + background-position: -120px 0; + } + .iradio_minimal-purple.checked { + background-position: -140px 0; + } + .iradio_minimal-purple.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-purple.checked.disabled { + background-position: -180px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 1.5), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_minimal-purple, + .iradio_minimal-purple { + background-image: url(purple@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/minimal/aero.css b/theme/bootstrap/plugins/iCheck/minimal/aero.css new file mode 100644 index 0000000..c97acc8 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/minimal/aero.css @@ -0,0 +1,62 @@ +/* iCheck plugin Minimal skin, aero +----------------------------------- */ +.icheckbox_minimal-aero, +.iradio_minimal-aero { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(aero.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-aero { + background-position: 0 0; +} + .icheckbox_minimal-aero.hover { + background-position: -20px 0; + } + .icheckbox_minimal-aero.checked { + background-position: -40px 0; + } + .icheckbox_minimal-aero.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-aero.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-aero { + background-position: -100px 0; +} + .iradio_minimal-aero.hover { + background-position: -120px 0; + } + .iradio_minimal-aero.checked { + background-position: -140px 0; + } + .iradio_minimal-aero.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-aero.checked.disabled { + background-position: -180px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_minimal-aero, + .iradio_minimal-aero { + background-image: url(aero@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/minimal/aero.png b/theme/bootstrap/plugins/iCheck/minimal/aero.png new file mode 100644 index 0000000..dccf774 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/minimal/aero.png differ diff --git a/theme/bootstrap/plugins/iCheck/minimal/aero@2x.png b/theme/bootstrap/plugins/iCheck/minimal/aero@2x.png new file mode 100644 index 0000000..5537ee3 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/minimal/aero@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/minimal/blue.css b/theme/bootstrap/plugins/iCheck/minimal/blue.css new file mode 100644 index 0000000..42477cd --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/minimal/blue.css @@ -0,0 +1,62 @@ +/* iCheck plugin Minimal skin, blue +----------------------------------- */ +.icheckbox_minimal-blue, +.iradio_minimal-blue { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(blue.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-blue { + background-position: 0 0; +} + .icheckbox_minimal-blue.hover { + background-position: -20px 0; + } + .icheckbox_minimal-blue.checked { + background-position: -40px 0; + } + .icheckbox_minimal-blue.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-blue.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-blue { + background-position: -100px 0; +} + .iradio_minimal-blue.hover { + background-position: -120px 0; + } + .iradio_minimal-blue.checked { + background-position: -140px 0; + } + .iradio_minimal-blue.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-blue.checked.disabled { + background-position: -180px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_minimal-blue, + .iradio_minimal-blue { + background-image: url(blue@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/minimal/blue.png b/theme/bootstrap/plugins/iCheck/minimal/blue.png new file mode 100644 index 0000000..af04cee Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/minimal/blue.png differ diff --git a/theme/bootstrap/plugins/iCheck/minimal/blue@2x.png b/theme/bootstrap/plugins/iCheck/minimal/blue@2x.png new file mode 100644 index 0000000..f19210a Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/minimal/blue@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/minimal/green.css b/theme/bootstrap/plugins/iCheck/minimal/green.css new file mode 100644 index 0000000..bd1e3d0 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/minimal/green.css @@ -0,0 +1,62 @@ +/* iCheck plugin Minimal skin, green +----------------------------------- */ +.icheckbox_minimal-green, +.iradio_minimal-green { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(green.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-green { + background-position: 0 0; +} + .icheckbox_minimal-green.hover { + background-position: -20px 0; + } + .icheckbox_minimal-green.checked { + background-position: -40px 0; + } + .icheckbox_minimal-green.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-green.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-green { + background-position: -100px 0; +} + .iradio_minimal-green.hover { + background-position: -120px 0; + } + .iradio_minimal-green.checked { + background-position: -140px 0; + } + .iradio_minimal-green.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-green.checked.disabled { + background-position: -180px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 1.5), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_minimal-green, + .iradio_minimal-green { + background-image: url(green@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/minimal/green.png b/theme/bootstrap/plugins/iCheck/minimal/green.png new file mode 100644 index 0000000..9171ebc Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/minimal/green.png differ diff --git a/theme/bootstrap/plugins/iCheck/minimal/green@2x.png b/theme/bootstrap/plugins/iCheck/minimal/green@2x.png new file mode 100644 index 0000000..7f18f96 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/minimal/green@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/minimal/grey.css b/theme/bootstrap/plugins/iCheck/minimal/grey.css new file mode 100644 index 0000000..6e2730c --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/minimal/grey.css @@ -0,0 +1,62 @@ +/* iCheck plugin Minimal skin, grey +----------------------------------- */ +.icheckbox_minimal-grey, +.iradio_minimal-grey { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(grey.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-grey { + background-position: 0 0; +} + .icheckbox_minimal-grey.hover { + background-position: -20px 0; + } + .icheckbox_minimal-grey.checked { + background-position: -40px 0; + } + .icheckbox_minimal-grey.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-grey.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-grey { + background-position: -100px 0; +} + .iradio_minimal-grey.hover { + background-position: -120px 0; + } + .iradio_minimal-grey.checked { + background-position: -140px 0; + } + .iradio_minimal-grey.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-grey.checked.disabled { + background-position: -180px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 1.5), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_minimal-grey, + .iradio_minimal-grey { + background-image: url(grey@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/minimal/grey.png b/theme/bootstrap/plugins/iCheck/minimal/grey.png new file mode 100644 index 0000000..22dcdbc Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/minimal/grey.png differ diff --git a/theme/bootstrap/plugins/iCheck/minimal/grey@2x.png b/theme/bootstrap/plugins/iCheck/minimal/grey@2x.png new file mode 100644 index 0000000..85e82dd Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/minimal/grey@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/minimal/minimal.css b/theme/bootstrap/plugins/iCheck/minimal/minimal.css new file mode 100644 index 0000000..7c0e52e --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/minimal/minimal.css @@ -0,0 +1,62 @@ +/* iCheck plugin Minimal skin, black +----------------------------------- */ +.icheckbox_minimal, +.iradio_minimal { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(minimal.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal { + background-position: 0 0; +} + .icheckbox_minimal.hover { + background-position: -20px 0; + } + .icheckbox_minimal.checked { + background-position: -40px 0; + } + .icheckbox_minimal.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal { + background-position: -100px 0; +} + .iradio_minimal.hover { + background-position: -120px 0; + } + .iradio_minimal.checked { + background-position: -140px 0; + } + .iradio_minimal.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal.checked.disabled { + background-position: -180px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_minimal, + .iradio_minimal { + background-image: url(minimal@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/minimal/minimal.png b/theme/bootstrap/plugins/iCheck/minimal/minimal.png new file mode 100644 index 0000000..943be16 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/minimal/minimal.png differ diff --git a/theme/bootstrap/plugins/iCheck/minimal/minimal@2x.png b/theme/bootstrap/plugins/iCheck/minimal/minimal@2x.png new file mode 100644 index 0000000..d62291d Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/minimal/minimal@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/minimal/orange.css b/theme/bootstrap/plugins/iCheck/minimal/orange.css new file mode 100644 index 0000000..842e400 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/minimal/orange.css @@ -0,0 +1,62 @@ +/* iCheck plugin Minimal skin, orange +----------------------------------- */ +.icheckbox_minimal-orange, +.iradio_minimal-orange { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(orange.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-orange { + background-position: 0 0; +} + .icheckbox_minimal-orange.hover { + background-position: -20px 0; + } + .icheckbox_minimal-orange.checked { + background-position: -40px 0; + } + .icheckbox_minimal-orange.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-orange.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-orange { + background-position: -100px 0; +} + .iradio_minimal-orange.hover { + background-position: -120px 0; + } + .iradio_minimal-orange.checked { + background-position: -140px 0; + } + .iradio_minimal-orange.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-orange.checked.disabled { + background-position: -180px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 1.5), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_minimal-orange, + .iradio_minimal-orange { + background-image: url(orange@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/minimal/orange.png b/theme/bootstrap/plugins/iCheck/minimal/orange.png new file mode 100644 index 0000000..f2a3149 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/minimal/orange.png differ diff --git a/theme/bootstrap/plugins/iCheck/minimal/orange@2x.png b/theme/bootstrap/plugins/iCheck/minimal/orange@2x.png new file mode 100644 index 0000000..68c8359 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/minimal/orange@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/minimal/pink.css b/theme/bootstrap/plugins/iCheck/minimal/pink.css new file mode 100644 index 0000000..10ace21 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/minimal/pink.css @@ -0,0 +1,62 @@ +/* iCheck plugin Minimal skin, pink +----------------------------------- */ +.icheckbox_minimal-pink, +.iradio_minimal-pink { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(pink.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-pink { + background-position: 0 0; +} + .icheckbox_minimal-pink.hover { + background-position: -20px 0; + } + .icheckbox_minimal-pink.checked { + background-position: -40px 0; + } + .icheckbox_minimal-pink.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-pink.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-pink { + background-position: -100px 0; +} + .iradio_minimal-pink.hover { + background-position: -120px 0; + } + .iradio_minimal-pink.checked { + background-position: -140px 0; + } + .iradio_minimal-pink.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-pink.checked.disabled { + background-position: -180px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 1.5), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_minimal-pink, + .iradio_minimal-pink { + background-image: url(pink@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/minimal/pink.png b/theme/bootstrap/plugins/iCheck/minimal/pink.png new file mode 100644 index 0000000..660553c Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/minimal/pink.png differ diff --git a/theme/bootstrap/plugins/iCheck/minimal/pink@2x.png b/theme/bootstrap/plugins/iCheck/minimal/pink@2x.png new file mode 100644 index 0000000..7d7b385 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/minimal/pink@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/minimal/purple.css b/theme/bootstrap/plugins/iCheck/minimal/purple.css new file mode 100644 index 0000000..1c5dcbc --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/minimal/purple.css @@ -0,0 +1,62 @@ +/* iCheck plugin Minimal skin, purple +----------------------------------- */ +.icheckbox_minimal-purple, +.iradio_minimal-purple { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(purple.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-purple { + background-position: 0 0; +} + .icheckbox_minimal-purple.hover { + background-position: -20px 0; + } + .icheckbox_minimal-purple.checked { + background-position: -40px 0; + } + .icheckbox_minimal-purple.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-purple.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-purple { + background-position: -100px 0; +} + .iradio_minimal-purple.hover { + background-position: -120px 0; + } + .iradio_minimal-purple.checked { + background-position: -140px 0; + } + .iradio_minimal-purple.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-purple.checked.disabled { + background-position: -180px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 1.5), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_minimal-purple, + .iradio_minimal-purple { + background-image: url(purple@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/minimal/purple.png b/theme/bootstrap/plugins/iCheck/minimal/purple.png new file mode 100644 index 0000000..48dec79 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/minimal/purple.png differ diff --git a/theme/bootstrap/plugins/iCheck/minimal/purple@2x.png b/theme/bootstrap/plugins/iCheck/minimal/purple@2x.png new file mode 100644 index 0000000..3bb7041 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/minimal/purple@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/minimal/red.css b/theme/bootstrap/plugins/iCheck/minimal/red.css new file mode 100644 index 0000000..9340c4f --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/minimal/red.css @@ -0,0 +1,62 @@ +/* iCheck plugin Minimal skin, red +----------------------------------- */ +.icheckbox_minimal-red, +.iradio_minimal-red { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(red.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-red { + background-position: 0 0; +} + .icheckbox_minimal-red.hover { + background-position: -20px 0; + } + .icheckbox_minimal-red.checked { + background-position: -40px 0; + } + .icheckbox_minimal-red.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-red.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-red { + background-position: -100px 0; +} + .iradio_minimal-red.hover { + background-position: -120px 0; + } + .iradio_minimal-red.checked { + background-position: -140px 0; + } + .iradio_minimal-red.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-red.checked.disabled { + background-position: -180px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 1.5), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_minimal-red, + .iradio_minimal-red { + background-image: url(red@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/minimal/red.png b/theme/bootstrap/plugins/iCheck/minimal/red.png new file mode 100644 index 0000000..4443f80 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/minimal/red.png differ diff --git a/theme/bootstrap/plugins/iCheck/minimal/red@2x.png b/theme/bootstrap/plugins/iCheck/minimal/red@2x.png new file mode 100644 index 0000000..2eb55a6 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/minimal/red@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/minimal/yellow.css b/theme/bootstrap/plugins/iCheck/minimal/yellow.css new file mode 100644 index 0000000..2c38423 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/minimal/yellow.css @@ -0,0 +1,62 @@ +/* iCheck plugin Minimal skin, yellow +----------------------------------- */ +.icheckbox_minimal-yellow, +.iradio_minimal-yellow { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 18px; + height: 18px; + background: url(yellow.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_minimal-yellow { + background-position: 0 0; +} + .icheckbox_minimal-yellow.hover { + background-position: -20px 0; + } + .icheckbox_minimal-yellow.checked { + background-position: -40px 0; + } + .icheckbox_minimal-yellow.disabled { + background-position: -60px 0; + cursor: default; + } + .icheckbox_minimal-yellow.checked.disabled { + background-position: -80px 0; + } + +.iradio_minimal-yellow { + background-position: -100px 0; +} + .iradio_minimal-yellow.hover { + background-position: -120px 0; + } + .iradio_minimal-yellow.checked { + background-position: -140px 0; + } + .iradio_minimal-yellow.disabled { + background-position: -160px 0; + cursor: default; + } + .iradio_minimal-yellow.checked.disabled { + background-position: -180px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 1.5), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_minimal-yellow, + .iradio_minimal-yellow { + background-image: url(yellow@2x.png); + -webkit-background-size: 200px 20px; + background-size: 200px 20px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/minimal/yellow.png b/theme/bootstrap/plugins/iCheck/minimal/yellow.png new file mode 100644 index 0000000..0999b7e Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/minimal/yellow.png differ diff --git a/theme/bootstrap/plugins/iCheck/minimal/yellow@2x.png b/theme/bootstrap/plugins/iCheck/minimal/yellow@2x.png new file mode 100644 index 0000000..c16f2b7 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/minimal/yellow@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/polaris/polaris.css b/theme/bootstrap/plugins/iCheck/polaris/polaris.css new file mode 100644 index 0000000..1cb4bcc --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/polaris/polaris.css @@ -0,0 +1,62 @@ +/* iCheck plugin Polaris skin +----------------------------------- */ +.icheckbox_polaris, +.iradio_polaris { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 29px; + height: 29px; + background: url(polaris.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_polaris { + background-position: 0 0; +} + .icheckbox_polaris.hover { + background-position: -31px 0; + } + .icheckbox_polaris.checked { + background-position: -62px 0; + } + .icheckbox_polaris.disabled { + background-position: -93px 0; + cursor: default; + } + .icheckbox_polaris.checked.disabled { + background-position: -124px 0; + } + +.iradio_polaris { + background-position: -155px 0; +} + .iradio_polaris.hover { + background-position: -186px 0; + } + .iradio_polaris.checked { + background-position: -217px 0; + } + .iradio_polaris.disabled { + background-position: -248px 0; + cursor: default; + } + .iradio_polaris.checked.disabled { + background-position: -279px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_polaris, + .iradio_polaris { + background-image: url(polaris@2x.png); + -webkit-background-size: 310px 31px; + background-size: 310px 31px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/polaris/polaris.png b/theme/bootstrap/plugins/iCheck/polaris/polaris.png new file mode 100644 index 0000000..60c14e6 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/polaris/polaris.png differ diff --git a/theme/bootstrap/plugins/iCheck/polaris/polaris@2x.png b/theme/bootstrap/plugins/iCheck/polaris/polaris@2x.png new file mode 100644 index 0000000..c75b826 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/polaris/polaris@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/square/_all.css b/theme/bootstrap/plugins/iCheck/square/_all.css new file mode 100644 index 0000000..a2ff036 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/square/_all.css @@ -0,0 +1,620 @@ +/* iCheck plugin Square skin +----------------------------------- */ +.icheckbox_square, +.iradio_square { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(square.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square { + background-position: 0 0; +} + .icheckbox_square.hover { + background-position: -24px 0; + } + .icheckbox_square.checked { + background-position: -48px 0; + } + .icheckbox_square.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square.checked.disabled { + background-position: -96px 0; + } + +.iradio_square { + background-position: -120px 0; +} + .iradio_square.hover { + background-position: -144px 0; + } + .iradio_square.checked { + background-position: -168px 0; + } + .iradio_square.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square.checked.disabled { + background-position: -216px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_square, + .iradio_square { + background-image: url(square@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} + +/* red */ +.icheckbox_square-red, +.iradio_square-red { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(red.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-red { + background-position: 0 0; +} + .icheckbox_square-red.hover { + background-position: -24px 0; + } + .icheckbox_square-red.checked { + background-position: -48px 0; + } + .icheckbox_square-red.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-red.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-red { + background-position: -120px 0; +} + .iradio_square-red.hover { + background-position: -144px 0; + } + .iradio_square-red.checked { + background-position: -168px 0; + } + .iradio_square-red.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-red.checked.disabled { + background-position: -216px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_square-red, + .iradio_square-red { + background-image: url(red@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} + +/* green */ +.icheckbox_square-green, +.iradio_square-green { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(green.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-green { + background-position: 0 0; +} + .icheckbox_square-green.hover { + background-position: -24px 0; + } + .icheckbox_square-green.checked { + background-position: -48px 0; + } + .icheckbox_square-green.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-green.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-green { + background-position: -120px 0; +} + .iradio_square-green.hover { + background-position: -144px 0; + } + .iradio_square-green.checked { + background-position: -168px 0; + } + .iradio_square-green.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-green.checked.disabled { + background-position: -216px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_square-green, + .iradio_square-green { + background-image: url(green@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} + +/* blue */ +.icheckbox_square-blue, +.iradio_square-blue { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(blue.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-blue { + background-position: 0 0; +} + .icheckbox_square-blue.hover { + background-position: -24px 0; + } + .icheckbox_square-blue.checked { + background-position: -48px 0; + } + .icheckbox_square-blue.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-blue.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-blue { + background-position: -120px 0; +} + .iradio_square-blue.hover { + background-position: -144px 0; + } + .iradio_square-blue.checked { + background-position: -168px 0; + } + .iradio_square-blue.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-blue.checked.disabled { + background-position: -216px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_square-blue, + .iradio_square-blue { + background-image: url(blue@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} + +/* aero */ +.icheckbox_square-aero, +.iradio_square-aero { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(aero.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-aero { + background-position: 0 0; +} + .icheckbox_square-aero.hover { + background-position: -24px 0; + } + .icheckbox_square-aero.checked { + background-position: -48px 0; + } + .icheckbox_square-aero.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-aero.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-aero { + background-position: -120px 0; +} + .iradio_square-aero.hover { + background-position: -144px 0; + } + .iradio_square-aero.checked { + background-position: -168px 0; + } + .iradio_square-aero.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-aero.checked.disabled { + background-position: -216px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_square-aero, + .iradio_square-aero { + background-image: url(aero@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} + +/* grey */ +.icheckbox_square-grey, +.iradio_square-grey { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(grey.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-grey { + background-position: 0 0; +} + .icheckbox_square-grey.hover { + background-position: -24px 0; + } + .icheckbox_square-grey.checked { + background-position: -48px 0; + } + .icheckbox_square-grey.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-grey.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-grey { + background-position: -120px 0; +} + .iradio_square-grey.hover { + background-position: -144px 0; + } + .iradio_square-grey.checked { + background-position: -168px 0; + } + .iradio_square-grey.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-grey.checked.disabled { + background-position: -216px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_square-grey, + .iradio_square-grey { + background-image: url(grey@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} + +/* orange */ +.icheckbox_square-orange, +.iradio_square-orange { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(orange.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-orange { + background-position: 0 0; +} + .icheckbox_square-orange.hover { + background-position: -24px 0; + } + .icheckbox_square-orange.checked { + background-position: -48px 0; + } + .icheckbox_square-orange.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-orange.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-orange { + background-position: -120px 0; +} + .iradio_square-orange.hover { + background-position: -144px 0; + } + .iradio_square-orange.checked { + background-position: -168px 0; + } + .iradio_square-orange.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-orange.checked.disabled { + background-position: -216px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_square-orange, + .iradio_square-orange { + background-image: url(orange@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} + +/* yellow */ +.icheckbox_square-yellow, +.iradio_square-yellow { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(yellow.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-yellow { + background-position: 0 0; +} + .icheckbox_square-yellow.hover { + background-position: -24px 0; + } + .icheckbox_square-yellow.checked { + background-position: -48px 0; + } + .icheckbox_square-yellow.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-yellow.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-yellow { + background-position: -120px 0; +} + .iradio_square-yellow.hover { + background-position: -144px 0; + } + .iradio_square-yellow.checked { + background-position: -168px 0; + } + .iradio_square-yellow.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-yellow.checked.disabled { + background-position: -216px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_square-yellow, + .iradio_square-yellow { + background-image: url(yellow@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} + +/* pink */ +.icheckbox_square-pink, +.iradio_square-pink { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(pink.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-pink { + background-position: 0 0; +} + .icheckbox_square-pink.hover { + background-position: -24px 0; + } + .icheckbox_square-pink.checked { + background-position: -48px 0; + } + .icheckbox_square-pink.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-pink.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-pink { + background-position: -120px 0; +} + .iradio_square-pink.hover { + background-position: -144px 0; + } + .iradio_square-pink.checked { + background-position: -168px 0; + } + .iradio_square-pink.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-pink.checked.disabled { + background-position: -216px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_square-pink, + .iradio_square-pink { + background-image: url(pink@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} + +/* purple */ +.icheckbox_square-purple, +.iradio_square-purple { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(purple.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-purple { + background-position: 0 0; +} + .icheckbox_square-purple.hover { + background-position: -24px 0; + } + .icheckbox_square-purple.checked { + background-position: -48px 0; + } + .icheckbox_square-purple.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-purple.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-purple { + background-position: -120px 0; +} + .iradio_square-purple.hover { + background-position: -144px 0; + } + .iradio_square-purple.checked { + background-position: -168px 0; + } + .iradio_square-purple.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-purple.checked.disabled { + background-position: -216px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_square-purple, + .iradio_square-purple { + background-image: url(purple@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/square/aero.css b/theme/bootstrap/plugins/iCheck/square/aero.css new file mode 100644 index 0000000..51fca0a --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/square/aero.css @@ -0,0 +1,62 @@ +/* iCheck plugin Square skin, aero +----------------------------------- */ +.icheckbox_square-aero, +.iradio_square-aero { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(aero.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-aero { + background-position: 0 0; +} + .icheckbox_square-aero.hover { + background-position: -24px 0; + } + .icheckbox_square-aero.checked { + background-position: -48px 0; + } + .icheckbox_square-aero.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-aero.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-aero { + background-position: -120px 0; +} + .iradio_square-aero.hover { + background-position: -144px 0; + } + .iradio_square-aero.checked { + background-position: -168px 0; + } + .iradio_square-aero.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-aero.checked.disabled { + background-position: -216px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_square-aero, + .iradio_square-aero { + background-image: url(aero@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/square/aero.png b/theme/bootstrap/plugins/iCheck/square/aero.png new file mode 100644 index 0000000..1a332e6 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/square/aero.png differ diff --git a/theme/bootstrap/plugins/iCheck/square/aero@2x.png b/theme/bootstrap/plugins/iCheck/square/aero@2x.png new file mode 100644 index 0000000..07c5a02 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/square/aero@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/square/blue.css b/theme/bootstrap/plugins/iCheck/square/blue.css new file mode 100644 index 0000000..95340fe --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/square/blue.css @@ -0,0 +1,62 @@ +/* iCheck plugin Square skin, blue +----------------------------------- */ +.icheckbox_square-blue, +.iradio_square-blue { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(blue.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-blue { + background-position: 0 0; +} + .icheckbox_square-blue.hover { + background-position: -24px 0; + } + .icheckbox_square-blue.checked { + background-position: -48px 0; + } + .icheckbox_square-blue.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-blue.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-blue { + background-position: -120px 0; +} + .iradio_square-blue.hover { + background-position: -144px 0; + } + .iradio_square-blue.checked { + background-position: -168px 0; + } + .iradio_square-blue.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-blue.checked.disabled { + background-position: -216px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_square-blue, + .iradio_square-blue { + background-image: url(blue@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/square/blue.png b/theme/bootstrap/plugins/iCheck/square/blue.png new file mode 100644 index 0000000..a3e040f Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/square/blue.png differ diff --git a/theme/bootstrap/plugins/iCheck/square/blue@2x.png b/theme/bootstrap/plugins/iCheck/square/blue@2x.png new file mode 100644 index 0000000..8fdea12 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/square/blue@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/square/green.css b/theme/bootstrap/plugins/iCheck/square/green.css new file mode 100644 index 0000000..eb43f2a --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/square/green.css @@ -0,0 +1,62 @@ +/* iCheck plugin Square skin, green +----------------------------------- */ +.icheckbox_square-green, +.iradio_square-green { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(green.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-green { + background-position: 0 0; +} + .icheckbox_square-green.hover { + background-position: -24px 0; + } + .icheckbox_square-green.checked { + background-position: -48px 0; + } + .icheckbox_square-green.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-green.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-green { + background-position: -120px 0; +} + .iradio_square-green.hover { + background-position: -144px 0; + } + .iradio_square-green.checked { + background-position: -168px 0; + } + .iradio_square-green.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-green.checked.disabled { + background-position: -216px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_square-green, + .iradio_square-green { + background-image: url(green@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/square/green.png b/theme/bootstrap/plugins/iCheck/square/green.png new file mode 100644 index 0000000..465824e Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/square/green.png differ diff --git a/theme/bootstrap/plugins/iCheck/square/green@2x.png b/theme/bootstrap/plugins/iCheck/square/green@2x.png new file mode 100644 index 0000000..784e874 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/square/green@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/square/grey.css b/theme/bootstrap/plugins/iCheck/square/grey.css new file mode 100644 index 0000000..ecc57ff --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/square/grey.css @@ -0,0 +1,62 @@ +/* iCheck plugin Square skin, grey +----------------------------------- */ +.icheckbox_square-grey, +.iradio_square-grey { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(grey.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-grey { + background-position: 0 0; +} + .icheckbox_square-grey.hover { + background-position: -24px 0; + } + .icheckbox_square-grey.checked { + background-position: -48px 0; + } + .icheckbox_square-grey.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-grey.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-grey { + background-position: -120px 0; +} + .iradio_square-grey.hover { + background-position: -144px 0; + } + .iradio_square-grey.checked { + background-position: -168px 0; + } + .iradio_square-grey.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-grey.checked.disabled { + background-position: -216px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_square-grey, + .iradio_square-grey { + background-image: url(grey@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/square/grey.png b/theme/bootstrap/plugins/iCheck/square/grey.png new file mode 100644 index 0000000..f693758 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/square/grey.png differ diff --git a/theme/bootstrap/plugins/iCheck/square/grey@2x.png b/theme/bootstrap/plugins/iCheck/square/grey@2x.png new file mode 100644 index 0000000..5d6341c Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/square/grey@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/square/orange.css b/theme/bootstrap/plugins/iCheck/square/orange.css new file mode 100644 index 0000000..d0c7a2c --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/square/orange.css @@ -0,0 +1,62 @@ +/* iCheck plugin Square skin, orange +----------------------------------- */ +.icheckbox_square-orange, +.iradio_square-orange { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(orange.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-orange { + background-position: 0 0; +} + .icheckbox_square-orange.hover { + background-position: -24px 0; + } + .icheckbox_square-orange.checked { + background-position: -48px 0; + } + .icheckbox_square-orange.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-orange.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-orange { + background-position: -120px 0; +} + .iradio_square-orange.hover { + background-position: -144px 0; + } + .iradio_square-orange.checked { + background-position: -168px 0; + } + .iradio_square-orange.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-orange.checked.disabled { + background-position: -216px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_square-orange, + .iradio_square-orange { + background-image: url(orange@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/square/orange.png b/theme/bootstrap/plugins/iCheck/square/orange.png new file mode 100644 index 0000000..8460850 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/square/orange.png differ diff --git a/theme/bootstrap/plugins/iCheck/square/orange@2x.png b/theme/bootstrap/plugins/iCheck/square/orange@2x.png new file mode 100644 index 0000000..b1f2319 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/square/orange@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/square/pink.css b/theme/bootstrap/plugins/iCheck/square/pink.css new file mode 100644 index 0000000..6b706f6 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/square/pink.css @@ -0,0 +1,62 @@ +/* iCheck plugin Square skin, pink +----------------------------------- */ +.icheckbox_square-pink, +.iradio_square-pink { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(pink.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-pink { + background-position: 0 0; +} + .icheckbox_square-pink.hover { + background-position: -24px 0; + } + .icheckbox_square-pink.checked { + background-position: -48px 0; + } + .icheckbox_square-pink.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-pink.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-pink { + background-position: -120px 0; +} + .iradio_square-pink.hover { + background-position: -144px 0; + } + .iradio_square-pink.checked { + background-position: -168px 0; + } + .iradio_square-pink.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-pink.checked.disabled { + background-position: -216px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_square-pink, + .iradio_square-pink { + background-image: url(pink@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/square/pink.png b/theme/bootstrap/plugins/iCheck/square/pink.png new file mode 100644 index 0000000..9c8b4e2 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/square/pink.png differ diff --git a/theme/bootstrap/plugins/iCheck/square/pink@2x.png b/theme/bootstrap/plugins/iCheck/square/pink@2x.png new file mode 100644 index 0000000..b1f3a6e Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/square/pink@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/square/purple.css b/theme/bootstrap/plugins/iCheck/square/purple.css new file mode 100644 index 0000000..43051d3 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/square/purple.css @@ -0,0 +1,62 @@ +/* iCheck plugin Square skin, purple +----------------------------------- */ +.icheckbox_square-purple, +.iradio_square-purple { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(purple.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-purple { + background-position: 0 0; +} + .icheckbox_square-purple.hover { + background-position: -24px 0; + } + .icheckbox_square-purple.checked { + background-position: -48px 0; + } + .icheckbox_square-purple.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-purple.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-purple { + background-position: -120px 0; +} + .iradio_square-purple.hover { + background-position: -144px 0; + } + .iradio_square-purple.checked { + background-position: -168px 0; + } + .iradio_square-purple.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-purple.checked.disabled { + background-position: -216px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_square-purple, + .iradio_square-purple { + background-image: url(purple@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/square/purple.png b/theme/bootstrap/plugins/iCheck/square/purple.png new file mode 100644 index 0000000..6bfc16a Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/square/purple.png differ diff --git a/theme/bootstrap/plugins/iCheck/square/purple@2x.png b/theme/bootstrap/plugins/iCheck/square/purple@2x.png new file mode 100644 index 0000000..6d3c8b1 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/square/purple@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/square/red.css b/theme/bootstrap/plugins/iCheck/square/red.css new file mode 100644 index 0000000..40013c4 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/square/red.css @@ -0,0 +1,62 @@ +/* iCheck plugin Square skin, red +----------------------------------- */ +.icheckbox_square-red, +.iradio_square-red { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(red.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-red { + background-position: 0 0; +} + .icheckbox_square-red.hover { + background-position: -24px 0; + } + .icheckbox_square-red.checked { + background-position: -48px 0; + } + .icheckbox_square-red.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-red.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-red { + background-position: -120px 0; +} + .iradio_square-red.hover { + background-position: -144px 0; + } + .iradio_square-red.checked { + background-position: -168px 0; + } + .iradio_square-red.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-red.checked.disabled { + background-position: -216px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_square-red, + .iradio_square-red { + background-image: url(red@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/square/red.png b/theme/bootstrap/plugins/iCheck/square/red.png new file mode 100644 index 0000000..749675a Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/square/red.png differ diff --git a/theme/bootstrap/plugins/iCheck/square/red@2x.png b/theme/bootstrap/plugins/iCheck/square/red@2x.png new file mode 100644 index 0000000..c05700a Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/square/red@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/square/square.css b/theme/bootstrap/plugins/iCheck/square/square.css new file mode 100644 index 0000000..b604fa8 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/square/square.css @@ -0,0 +1,62 @@ +/* iCheck plugin Square skin, black +----------------------------------- */ +.icheckbox_square, +.iradio_square { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(square.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square { + background-position: 0 0; +} + .icheckbox_square.hover { + background-position: -24px 0; + } + .icheckbox_square.checked { + background-position: -48px 0; + } + .icheckbox_square.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square.checked.disabled { + background-position: -96px 0; + } + +.iradio_square { + background-position: -120px 0; +} + .iradio_square.hover { + background-position: -144px 0; + } + .iradio_square.checked { + background-position: -168px 0; + } + .iradio_square.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square.checked.disabled { + background-position: -216px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_square, + .iradio_square { + background-image: url(square@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/square/square.png b/theme/bootstrap/plugins/iCheck/square/square.png new file mode 100644 index 0000000..2a3c881 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/square/square.png differ diff --git a/theme/bootstrap/plugins/iCheck/square/square@2x.png b/theme/bootstrap/plugins/iCheck/square/square@2x.png new file mode 100644 index 0000000..9b56c44 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/square/square@2x.png differ diff --git a/theme/bootstrap/plugins/iCheck/square/yellow.css b/theme/bootstrap/plugins/iCheck/square/yellow.css new file mode 100644 index 0000000..5511349 --- /dev/null +++ b/theme/bootstrap/plugins/iCheck/square/yellow.css @@ -0,0 +1,62 @@ +/* iCheck plugin Square skin, yellow +----------------------------------- */ +.icheckbox_square-yellow, +.iradio_square-yellow { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(yellow.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-yellow { + background-position: 0 0; +} + .icheckbox_square-yellow.hover { + background-position: -24px 0; + } + .icheckbox_square-yellow.checked { + background-position: -48px 0; + } + .icheckbox_square-yellow.disabled { + background-position: -72px 0; + cursor: default; + } + .icheckbox_square-yellow.checked.disabled { + background-position: -96px 0; + } + +.iradio_square-yellow { + background-position: -120px 0; +} + .iradio_square-yellow.hover { + background-position: -144px 0; + } + .iradio_square-yellow.checked { + background-position: -168px 0; + } + .iradio_square-yellow.disabled { + background-position: -192px 0; + cursor: default; + } + .iradio_square-yellow.checked.disabled { + background-position: -216px 0; + } + +/* Retina support */ +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), + only screen and (-moz-min-device-pixel-ratio: 1.5), + only screen and (-o-min-device-pixel-ratio: 3/2), + only screen and (min-device-pixel-ratio: 1.5) { + .icheckbox_square-yellow, + .iradio_square-yellow { + background-image: url(yellow@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/iCheck/square/yellow.png b/theme/bootstrap/plugins/iCheck/square/yellow.png new file mode 100644 index 0000000..b6c0330 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/square/yellow.png differ diff --git a/theme/bootstrap/plugins/iCheck/square/yellow@2x.png b/theme/bootstrap/plugins/iCheck/square/yellow@2x.png new file mode 100644 index 0000000..6b8e328 Binary files /dev/null and b/theme/bootstrap/plugins/iCheck/square/yellow@2x.png differ diff --git a/theme/bootstrap/plugins/input-mask/jquery.inputmask.date.extensions.js b/theme/bootstrap/plugins/input-mask/jquery.inputmask.date.extensions.js new file mode 100644 index 0000000..18f76c8 --- /dev/null +++ b/theme/bootstrap/plugins/input-mask/jquery.inputmask.date.extensions.js @@ -0,0 +1,488 @@ +/* +Input Mask plugin extensions +http://github.com/RobinHerbots/jquery.inputmask +Copyright (c) 2010 - 2014 Robin Herbots +Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) +Version: 0.0.0 + +Optional extensions on the jquery.inputmask base +*/ +(function ($) { + //date & time aliases + $.extend($.inputmask.defaults.definitions, { + 'h': { //hours + validator: "[01][0-9]|2[0-3]", + cardinality: 2, + prevalidator: [{ validator: "[0-2]", cardinality: 1 }] + }, + 's': { //seconds || minutes + validator: "[0-5][0-9]", + cardinality: 2, + prevalidator: [{ validator: "[0-5]", cardinality: 1 }] + }, + 'd': { //basic day + validator: "0[1-9]|[12][0-9]|3[01]", + cardinality: 2, + prevalidator: [{ validator: "[0-3]", cardinality: 1 }] + }, + 'm': { //basic month + validator: "0[1-9]|1[012]", + cardinality: 2, + prevalidator: [{ validator: "[01]", cardinality: 1 }] + }, + 'y': { //basic year + validator: "(19|20)\\d{2}", + cardinality: 4, + prevalidator: [ + { validator: "[12]", cardinality: 1 }, + { validator: "(19|20)", cardinality: 2 }, + { validator: "(19|20)\\d", cardinality: 3 } + ] + } + }); + $.extend($.inputmask.defaults.aliases, { + 'dd/mm/yyyy': { + mask: "1/2/y", + placeholder: "dd/mm/yyyy", + regex: { + val1pre: new RegExp("[0-3]"), //daypre + val1: new RegExp("0[1-9]|[12][0-9]|3[01]"), //day + val2pre: function (separator) { var escapedSeparator = $.inputmask.escapeRegex.call(this, separator); return new RegExp("((0[1-9]|[12][0-9]|3[01])" + escapedSeparator + "[01])"); }, //monthpre + val2: function (separator) { var escapedSeparator = $.inputmask.escapeRegex.call(this, separator); return new RegExp("((0[1-9]|[12][0-9])" + escapedSeparator + "(0[1-9]|1[012]))|(30" + escapedSeparator + "(0[13-9]|1[012]))|(31" + escapedSeparator + "(0[13578]|1[02]))"); }//month + }, + leapday: "29/02/", + separator: '/', + yearrange: { minyear: 1900, maxyear: 2099 }, + isInYearRange: function (chrs, minyear, maxyear) { + var enteredyear = parseInt(chrs.concat(minyear.toString().slice(chrs.length))); + var enteredyear2 = parseInt(chrs.concat(maxyear.toString().slice(chrs.length))); + return (enteredyear != NaN ? minyear <= enteredyear && enteredyear <= maxyear : false) || + (enteredyear2 != NaN ? minyear <= enteredyear2 && enteredyear2 <= maxyear : false); + }, + determinebaseyear: function (minyear, maxyear, hint) { + var currentyear = (new Date()).getFullYear(); + if (minyear > currentyear) return minyear; + if (maxyear < currentyear) { + var maxYearPrefix = maxyear.toString().slice(0, 2); + var maxYearPostfix = maxyear.toString().slice(2, 4); + while (maxyear < maxYearPrefix + hint) { + maxYearPrefix--; + } + var maxxYear = maxYearPrefix + maxYearPostfix; + return minyear > maxxYear ? minyear : maxxYear; + } + + return currentyear; + }, + onKeyUp: function (e, buffer, opts) { + var $input = $(this); + if (e.ctrlKey && e.keyCode == opts.keyCode.RIGHT) { + var today = new Date(); + $input.val(today.getDate().toString() + (today.getMonth() + 1).toString() + today.getFullYear().toString()); + } + }, + definitions: { + '1': { //val1 ~ day or month + validator: function (chrs, buffer, pos, strict, opts) { + var isValid = opts.regex.val1.test(chrs); + if (!strict && !isValid) { + if (chrs.charAt(1) == opts.separator || "-./".indexOf(chrs.charAt(1)) != -1) { + isValid = opts.regex.val1.test("0" + chrs.charAt(0)); + if (isValid) { + buffer[pos - 1] = "0"; + return { "pos": pos, "c": chrs.charAt(0) }; + } + } + } + return isValid; + }, + cardinality: 2, + prevalidator: [{ + validator: function (chrs, buffer, pos, strict, opts) { + var isValid = opts.regex.val1pre.test(chrs); + if (!strict && !isValid) { + isValid = opts.regex.val1.test("0" + chrs); + if (isValid) { + buffer[pos] = "0"; + pos++; + return { "pos": pos }; + } + } + return isValid; + }, cardinality: 1 + }] + }, + '2': { //val2 ~ day or month + validator: function (chrs, buffer, pos, strict, opts) { + var frontValue = buffer.join('').substr(0, 3); + if (frontValue.indexOf(opts.placeholder[0]) != -1) frontValue = "01" + opts.separator; + var isValid = opts.regex.val2(opts.separator).test(frontValue + chrs); + if (!strict && !isValid) { + if (chrs.charAt(1) == opts.separator || "-./".indexOf(chrs.charAt(1)) != -1) { + isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs.charAt(0)); + if (isValid) { + buffer[pos - 1] = "0"; + return { "pos": pos, "c": chrs.charAt(0) }; + } + } + } + return isValid; + }, + cardinality: 2, + prevalidator: [{ + validator: function (chrs, buffer, pos, strict, opts) { + var frontValue = buffer.join('').substr(0, 3); + if (frontValue.indexOf(opts.placeholder[0]) != -1) frontValue = "01" + opts.separator; + var isValid = opts.regex.val2pre(opts.separator).test(frontValue + chrs); + if (!strict && !isValid) { + isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs); + if (isValid) { + buffer[pos] = "0"; + pos++; + return { "pos": pos }; + } + } + return isValid; + }, cardinality: 1 + }] + }, + 'y': { //year + validator: function (chrs, buffer, pos, strict, opts) { + if (opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) { + var dayMonthValue = buffer.join('').substr(0, 6); + if (dayMonthValue != opts.leapday) + return true; + else { + var year = parseInt(chrs, 10);//detect leap year + if (year % 4 === 0) + if (year % 100 === 0) + if (year % 400 === 0) + return true; + else return false; + else return true; + else return false; + } + } else return false; + }, + cardinality: 4, + prevalidator: [ + { + validator: function (chrs, buffer, pos, strict, opts) { + var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); + if (!strict && !isValid) { + var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 1); + + isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear); + if (isValid) { + buffer[pos++] = yearPrefix[0]; + return { "pos": pos }; + } + yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 2); + + isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear); + if (isValid) { + buffer[pos++] = yearPrefix[0]; + buffer[pos++] = yearPrefix[1]; + return { "pos": pos }; + } + } + return isValid; + }, + cardinality: 1 + }, + { + validator: function (chrs, buffer, pos, strict, opts) { + var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); + if (!strict && !isValid) { + var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2); + + isValid = opts.isInYearRange(chrs[0] + yearPrefix[1] + chrs[1], opts.yearrange.minyear, opts.yearrange.maxyear); + if (isValid) { + buffer[pos++] = yearPrefix[1]; + return { "pos": pos }; + } + + yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2); + if (opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) { + var dayMonthValue = buffer.join('').substr(0, 6); + if (dayMonthValue != opts.leapday) + isValid = true; + else { + var year = parseInt(chrs, 10);//detect leap year + if (year % 4 === 0) + if (year % 100 === 0) + if (year % 400 === 0) + isValid = true; + else isValid = false; + else isValid = true; + else isValid = false; + } + } else isValid = false; + if (isValid) { + buffer[pos - 1] = yearPrefix[0]; + buffer[pos++] = yearPrefix[1]; + buffer[pos++] = chrs[0]; + return { "pos": pos }; + } + } + return isValid; + }, cardinality: 2 + }, + { + validator: function (chrs, buffer, pos, strict, opts) { + return opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); + }, cardinality: 3 + } + ] + } + }, + insertMode: false, + autoUnmask: false + }, + 'mm/dd/yyyy': { + placeholder: "mm/dd/yyyy", + alias: "dd/mm/yyyy", //reuse functionality of dd/mm/yyyy alias + regex: { + val2pre: function (separator) { var escapedSeparator = $.inputmask.escapeRegex.call(this, separator); return new RegExp("((0[13-9]|1[012])" + escapedSeparator + "[0-3])|(02" + escapedSeparator + "[0-2])"); }, //daypre + val2: function (separator) { var escapedSeparator = $.inputmask.escapeRegex.call(this, separator); return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[13-9]|1[012])" + escapedSeparator + "30)|((0[13578]|1[02])" + escapedSeparator + "31)"); }, //day + val1pre: new RegExp("[01]"), //monthpre + val1: new RegExp("0[1-9]|1[012]") //month + }, + leapday: "02/29/", + onKeyUp: function (e, buffer, opts) { + var $input = $(this); + if (e.ctrlKey && e.keyCode == opts.keyCode.RIGHT) { + var today = new Date(); + $input.val((today.getMonth() + 1).toString() + today.getDate().toString() + today.getFullYear().toString()); + } + } + }, + 'yyyy/mm/dd': { + mask: "y/1/2", + placeholder: "yyyy/mm/dd", + alias: "mm/dd/yyyy", + leapday: "/02/29", + onKeyUp: function (e, buffer, opts) { + var $input = $(this); + if (e.ctrlKey && e.keyCode == opts.keyCode.RIGHT) { + var today = new Date(); + $input.val(today.getFullYear().toString() + (today.getMonth() + 1).toString() + today.getDate().toString()); + } + }, + definitions: { + '2': { //val2 ~ day or month + validator: function (chrs, buffer, pos, strict, opts) { + var frontValue = buffer.join('').substr(5, 3); + if (frontValue.indexOf(opts.placeholder[5]) != -1) frontValue = "01" + opts.separator; + var isValid = opts.regex.val2(opts.separator).test(frontValue + chrs); + if (!strict && !isValid) { + if (chrs.charAt(1) == opts.separator || "-./".indexOf(chrs.charAt(1)) != -1) { + isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs.charAt(0)); + if (isValid) { + buffer[pos - 1] = "0"; + return { "pos": pos, "c": chrs.charAt(0) }; + } + } + } + + //check leap yeap + if (isValid) { + var dayMonthValue = buffer.join('').substr(4, 4) + chrs; + if (dayMonthValue != opts.leapday) + return true; + else { + var year = parseInt(buffer.join('').substr(0, 4), 10); //detect leap year + if (year % 4 === 0) + if (year % 100 === 0) + if (year % 400 === 0) + return true; + else return false; + else return true; + else return false; + } + } + + return isValid; + }, + cardinality: 2, + prevalidator: [{ + validator: function (chrs, buffer, pos, strict, opts) { + var frontValue = buffer.join('').substr(5, 3); + if (frontValue.indexOf(opts.placeholder[5]) != -1) frontValue = "01" + opts.separator; + var isValid = opts.regex.val2pre(opts.separator).test(frontValue + chrs); + if (!strict && !isValid) { + isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs); + if (isValid) { + buffer[pos] = "0"; + pos++; + return { "pos": pos }; + } + } + return isValid; + }, cardinality: 1 + }] + } + } + }, + 'dd.mm.yyyy': { + mask: "1.2.y", + placeholder: "dd.mm.yyyy", + leapday: "29.02.", + separator: '.', + alias: "dd/mm/yyyy" + }, + 'dd-mm-yyyy': { + mask: "1-2-y", + placeholder: "dd-mm-yyyy", + leapday: "29-02-", + separator: '-', + alias: "dd/mm/yyyy" + }, + 'mm.dd.yyyy': { + mask: "1.2.y", + placeholder: "mm.dd.yyyy", + leapday: "02.29.", + separator: '.', + alias: "mm/dd/yyyy" + }, + 'mm-dd-yyyy': { + mask: "1-2-y", + placeholder: "mm-dd-yyyy", + leapday: "02-29-", + separator: '-', + alias: "mm/dd/yyyy" + }, + 'yyyy.mm.dd': { + mask: "y.1.2", + placeholder: "yyyy.mm.dd", + leapday: ".02.29", + separator: '.', + alias: "yyyy/mm/dd" + }, + 'yyyy-mm-dd': { + mask: "y-1-2", + placeholder: "yyyy-mm-dd", + leapday: "-02-29", + separator: '-', + alias: "yyyy/mm/dd" + }, + 'datetime': { + mask: "1/2/y h:s", + placeholder: "dd/mm/yyyy hh:mm", + alias: "dd/mm/yyyy", + regex: { + hrspre: new RegExp("[012]"), //hours pre + hrs24: new RegExp("2[0-9]|1[3-9]"), + hrs: new RegExp("[01][0-9]|2[0-3]"), //hours + ampm: new RegExp("^[a|p|A|P][m|M]") + }, + timeseparator: ':', + hourFormat: "24", // or 12 + definitions: { + 'h': { //hours + validator: function (chrs, buffer, pos, strict, opts) { + var isValid = opts.regex.hrs.test(chrs); + if (!strict && !isValid) { + if (chrs.charAt(1) == opts.timeseparator || "-.:".indexOf(chrs.charAt(1)) != -1) { + isValid = opts.regex.hrs.test("0" + chrs.charAt(0)); + if (isValid) { + buffer[pos - 1] = "0"; + buffer[pos] = chrs.charAt(0); + pos++; + return { "pos": pos }; + } + } + } + + if (isValid && opts.hourFormat !== "24" && opts.regex.hrs24.test(chrs)) { + + var tmp = parseInt(chrs, 10); + + if (tmp == 24) { + buffer[pos + 5] = "a"; + buffer[pos + 6] = "m"; + } else { + buffer[pos + 5] = "p"; + buffer[pos + 6] = "m"; + } + + tmp = tmp - 12; + + if (tmp < 10) { + buffer[pos] = tmp.toString(); + buffer[pos - 1] = "0"; + } else { + buffer[pos] = tmp.toString().charAt(1); + buffer[pos - 1] = tmp.toString().charAt(0); + } + + return { "pos": pos, "c": buffer[pos] }; + } + + return isValid; + }, + cardinality: 2, + prevalidator: [{ + validator: function (chrs, buffer, pos, strict, opts) { + var isValid = opts.regex.hrspre.test(chrs); + if (!strict && !isValid) { + isValid = opts.regex.hrs.test("0" + chrs); + if (isValid) { + buffer[pos] = "0"; + pos++; + return { "pos": pos }; + } + } + return isValid; + }, cardinality: 1 + }] + }, + 't': { //am/pm + validator: function (chrs, buffer, pos, strict, opts) { + return opts.regex.ampm.test(chrs + "m"); + }, + casing: "lower", + cardinality: 1 + } + }, + insertMode: false, + autoUnmask: false + }, + 'datetime12': { + mask: "1/2/y h:s t\\m", + placeholder: "dd/mm/yyyy hh:mm xm", + alias: "datetime", + hourFormat: "12" + }, + 'hh:mm t': { + mask: "h:s t\\m", + placeholder: "hh:mm xm", + alias: "datetime", + hourFormat: "12" + }, + 'h:s t': { + mask: "h:s t\\m", + placeholder: "hh:mm xm", + alias: "datetime", + hourFormat: "12" + }, + 'hh:mm:ss': { + mask: "h:s:s", + autoUnmask: false + }, + 'hh:mm': { + mask: "h:s", + autoUnmask: false + }, + 'date': { + alias: "dd/mm/yyyy" // "mm/dd/yyyy" + }, + 'mm/yyyy': { + mask: "1/y", + placeholder: "mm/yyyy", + leapday: "donotuse", + separator: '/', + alias: "mm/dd/yyyy" + } + }); +})(jQuery); diff --git a/theme/bootstrap/plugins/input-mask/jquery.inputmask.extensions.js b/theme/bootstrap/plugins/input-mask/jquery.inputmask.extensions.js new file mode 100644 index 0000000..c89f91e --- /dev/null +++ b/theme/bootstrap/plugins/input-mask/jquery.inputmask.extensions.js @@ -0,0 +1,122 @@ +/* +Input Mask plugin extensions +http://github.com/RobinHerbots/jquery.inputmask +Copyright (c) 2010 - 2014 Robin Herbots +Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) +Version: 0.0.0 + +Optional extensions on the jquery.inputmask base +*/ +(function ($) { + //extra definitions + $.extend($.inputmask.defaults.definitions, { + 'A': { + validator: "[A-Za-z]", + cardinality: 1, + casing: "upper" //auto uppercasing + }, + '#': { + validator: "[A-Za-z\u0410-\u044F\u0401\u04510-9]", + cardinality: 1, + casing: "upper" + } + }); + $.extend($.inputmask.defaults.aliases, { + 'url': { + mask: "ir", + placeholder: "", + separator: "", + defaultPrefix: "http://", + regex: { + urlpre1: new RegExp("[fh]"), + urlpre2: new RegExp("(ft|ht)"), + urlpre3: new RegExp("(ftp|htt)"), + urlpre4: new RegExp("(ftp:|http|ftps)"), + urlpre5: new RegExp("(ftp:/|ftps:|http:|https)"), + urlpre6: new RegExp("(ftp://|ftps:/|http:/|https:)"), + urlpre7: new RegExp("(ftp://|ftps://|http://|https:/)"), + urlpre8: new RegExp("(ftp://|ftps://|http://|https://)") + }, + definitions: { + 'i': { + validator: function (chrs, buffer, pos, strict, opts) { + return true; + }, + cardinality: 8, + prevalidator: (function () { + var result = [], prefixLimit = 8; + for (var i = 0; i < prefixLimit; i++) { + result[i] = (function () { + var j = i; + return { + validator: function (chrs, buffer, pos, strict, opts) { + if (opts.regex["urlpre" + (j + 1)]) { + var tmp = chrs, k; + if (((j + 1) - chrs.length) > 0) { + tmp = buffer.join('').substring(0, ((j + 1) - chrs.length)) + "" + tmp; + } + var isValid = opts.regex["urlpre" + (j + 1)].test(tmp); + if (!strict && !isValid) { + pos = pos - j; + for (k = 0; k < opts.defaultPrefix.length; k++) { + buffer[pos] = opts.defaultPrefix[k]; pos++; + } + for (k = 0; k < tmp.length - 1; k++) { + buffer[pos] = tmp[k]; pos++; + } + return { "pos": pos }; + } + return isValid; + } else { + return false; + } + }, cardinality: j + }; + })(); + } + return result; + })() + }, + "r": { + validator: ".", + cardinality: 50 + } + }, + insertMode: false, + autoUnmask: false + }, + "ip": { //ip-address mask + mask: ["[[x]y]z.[[x]y]z.[[x]y]z.x[yz]", "[[x]y]z.[[x]y]z.[[x]y]z.[[x]y][z]"], + definitions: { + 'x': { + validator: "[012]", + cardinality: 1, + definitionSymbol: "i" + }, + 'y': { + validator: function (chrs, buffer, pos, strict, opts) { + if (pos - 1 > -1 && buffer[pos - 1] != ".") + chrs = buffer[pos - 1] + chrs; + else chrs = "0" + chrs; + return new RegExp("2[0-5]|[01][0-9]").test(chrs); + }, + cardinality: 1, + definitionSymbol: "i" + }, + 'z': { + validator: function (chrs, buffer, pos, strict, opts) { + if (pos - 1 > -1 && buffer[pos - 1] != ".") { + chrs = buffer[pos - 1] + chrs; + if (pos - 2 > -1 && buffer[pos - 2] != ".") { + chrs = buffer[pos - 2] + chrs; + } else chrs = "0" + chrs; + } else chrs = "00" + chrs; + return new RegExp("25[0-5]|2[0-4][0-9]|[01][0-9][0-9]").test(chrs); + }, + cardinality: 1, + definitionSymbol: "i" + } + } + } + }); +})(jQuery); diff --git a/theme/bootstrap/plugins/input-mask/jquery.inputmask.js b/theme/bootstrap/plugins/input-mask/jquery.inputmask.js new file mode 100644 index 0000000..86cb320 --- /dev/null +++ b/theme/bootstrap/plugins/input-mask/jquery.inputmask.js @@ -0,0 +1,1627 @@ +/** +* @license Input Mask plugin for jquery +* http://github.com/RobinHerbots/jquery.inputmask +* Copyright (c) 2010 - 2014 Robin Herbots +* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) +* Version: 0.0.0 +*/ + +(function ($) { + if ($.fn.inputmask === undefined) { + //helper functions + function isInputEventSupported(eventName) { + var el = document.createElement('input'), + eventName = 'on' + eventName, + isSupported = (eventName in el); + if (!isSupported) { + el.setAttribute(eventName, 'return;'); + isSupported = typeof el[eventName] == 'function'; + } + el = null; + return isSupported; + } + function resolveAlias(aliasStr, options, opts) { + var aliasDefinition = opts.aliases[aliasStr]; + if (aliasDefinition) { + if (aliasDefinition.alias) resolveAlias(aliasDefinition.alias, undefined, opts); //alias is another alias + $.extend(true, opts, aliasDefinition); //merge alias definition in the options + $.extend(true, opts, options); //reapply extra given options + return true; + } + return false; + } + function generateMaskSets(opts) { + var ms = []; + var genmasks = []; //used to keep track of the masks that where processed, to avoid duplicates + function getMaskTemplate(mask) { + if (opts.numericInput) { + mask = mask.split('').reverse().join(''); + } + var escaped = false, outCount = 0, greedy = opts.greedy, repeat = opts.repeat; + if (repeat == "*") greedy = false; + //if (greedy == true && opts.placeholder == "") opts.placeholder = " "; + if (mask.length == 1 && greedy == false && repeat != 0) { opts.placeholder = ""; } //hide placeholder with single non-greedy mask + var singleMask = $.map(mask.split(""), function (element, index) { + var outElem = []; + if (element == opts.escapeChar) { + escaped = true; + } + else if ((element != opts.optionalmarker.start && element != opts.optionalmarker.end) || escaped) { + var maskdef = opts.definitions[element]; + if (maskdef && !escaped) { + for (var i = 0; i < maskdef.cardinality; i++) { + outElem.push(opts.placeholder.charAt((outCount + i) % opts.placeholder.length)); + } + } else { + outElem.push(element); + escaped = false; + } + outCount += outElem.length; + return outElem; + } + }); + + //allocate repetitions + var repeatedMask = singleMask.slice(); + for (var i = 1; i < repeat && greedy; i++) { + repeatedMask = repeatedMask.concat(singleMask.slice()); + } + + return { "mask": repeatedMask, "repeat": repeat, "greedy": greedy }; + } + //test definition => {fn: RegExp/function, cardinality: int, optionality: bool, newBlockMarker: bool, offset: int, casing: null/upper/lower, def: definitionSymbol} + function getTestingChain(mask) { + if (opts.numericInput) { + mask = mask.split('').reverse().join(''); + } + var isOptional = false, escaped = false; + var newBlockMarker = false; //indicates wheter the begin/ending of a block should be indicated + + return $.map(mask.split(""), function (element, index) { + var outElem = []; + + if (element == opts.escapeChar) { + escaped = true; + } else if (element == opts.optionalmarker.start && !escaped) { + isOptional = true; + newBlockMarker = true; + } + else if (element == opts.optionalmarker.end && !escaped) { + isOptional = false; + newBlockMarker = true; + } + else { + var maskdef = opts.definitions[element]; + if (maskdef && !escaped) { + var prevalidators = maskdef["prevalidator"], prevalidatorsL = prevalidators ? prevalidators.length : 0; + for (var i = 1; i < maskdef.cardinality; i++) { + var prevalidator = prevalidatorsL >= i ? prevalidators[i - 1] : [], validator = prevalidator["validator"], cardinality = prevalidator["cardinality"]; + outElem.push({ fn: validator ? typeof validator == 'string' ? new RegExp(validator) : new function () { this.test = validator; } : new RegExp("."), cardinality: cardinality ? cardinality : 1, optionality: isOptional, newBlockMarker: isOptional == true ? newBlockMarker : false, offset: 0, casing: maskdef["casing"], def: maskdef["definitionSymbol"] || element }); + if (isOptional == true) //reset newBlockMarker + newBlockMarker = false; + } + outElem.push({ fn: maskdef.validator ? typeof maskdef.validator == 'string' ? new RegExp(maskdef.validator) : new function () { this.test = maskdef.validator; } : new RegExp("."), cardinality: maskdef.cardinality, optionality: isOptional, newBlockMarker: newBlockMarker, offset: 0, casing: maskdef["casing"], def: maskdef["definitionSymbol"] || element }); + } else { + outElem.push({ fn: null, cardinality: 0, optionality: isOptional, newBlockMarker: newBlockMarker, offset: 0, casing: null, def: element }); + escaped = false; + } + //reset newBlockMarker + newBlockMarker = false; + return outElem; + } + }); + } + function markOptional(maskPart) { //needed for the clearOptionalTail functionality + return opts.optionalmarker.start + maskPart + opts.optionalmarker.end; + } + function splitFirstOptionalEndPart(maskPart) { + var optionalStartMarkers = 0, optionalEndMarkers = 0, mpl = maskPart.length; + for (var i = 0; i < mpl; i++) { + if (maskPart.charAt(i) == opts.optionalmarker.start) { + optionalStartMarkers++; + } + if (maskPart.charAt(i) == opts.optionalmarker.end) { + optionalEndMarkers++; + } + if (optionalStartMarkers > 0 && optionalStartMarkers == optionalEndMarkers) + break; + } + var maskParts = [maskPart.substring(0, i)]; + if (i < mpl) { + maskParts.push(maskPart.substring(i + 1, mpl)); + } + return maskParts; + } + function splitFirstOptionalStartPart(maskPart) { + var mpl = maskPart.length; + for (var i = 0; i < mpl; i++) { + if (maskPart.charAt(i) == opts.optionalmarker.start) { + break; + } + } + var maskParts = [maskPart.substring(0, i)]; + if (i < mpl) { + maskParts.push(maskPart.substring(i + 1, mpl)); + } + return maskParts; + } + function generateMask(maskPrefix, maskPart, metadata) { + var maskParts = splitFirstOptionalEndPart(maskPart); + var newMask, maskTemplate; + + var masks = splitFirstOptionalStartPart(maskParts[0]); + if (masks.length > 1) { + newMask = maskPrefix + masks[0] + markOptional(masks[1]) + (maskParts.length > 1 ? maskParts[1] : ""); + if ($.inArray(newMask, genmasks) == -1 && newMask != "") { + genmasks.push(newMask); + maskTemplate = getMaskTemplate(newMask); + ms.push({ + "mask": newMask, + "_buffer": maskTemplate["mask"], + "buffer": maskTemplate["mask"].slice(), + "tests": getTestingChain(newMask), + "lastValidPosition": -1, + "greedy": maskTemplate["greedy"], + "repeat": maskTemplate["repeat"], + "metadata": metadata + }); + } + newMask = maskPrefix + masks[0] + (maskParts.length > 1 ? maskParts[1] : ""); + if ($.inArray(newMask, genmasks) == -1 && newMask != "") { + genmasks.push(newMask); + maskTemplate = getMaskTemplate(newMask); + ms.push({ + "mask": newMask, + "_buffer": maskTemplate["mask"], + "buffer": maskTemplate["mask"].slice(), + "tests": getTestingChain(newMask), + "lastValidPosition": -1, + "greedy": maskTemplate["greedy"], + "repeat": maskTemplate["repeat"], + "metadata": metadata + }); + } + if (splitFirstOptionalStartPart(masks[1]).length > 1) { //optional contains another optional + generateMask(maskPrefix + masks[0], masks[1] + maskParts[1], metadata); + } + if (maskParts.length > 1 && splitFirstOptionalStartPart(maskParts[1]).length > 1) { + generateMask(maskPrefix + masks[0] + markOptional(masks[1]), maskParts[1], metadata); + generateMask(maskPrefix + masks[0], maskParts[1], metadata); + } + } + else { + newMask = maskPrefix + maskParts; + if ($.inArray(newMask, genmasks) == -1 && newMask != "") { + genmasks.push(newMask); + maskTemplate = getMaskTemplate(newMask); + ms.push({ + "mask": newMask, + "_buffer": maskTemplate["mask"], + "buffer": maskTemplate["mask"].slice(), + "tests": getTestingChain(newMask), + "lastValidPosition": -1, + "greedy": maskTemplate["greedy"], + "repeat": maskTemplate["repeat"], + "metadata": metadata + }); + } + } + + } + + if ($.isFunction(opts.mask)) { //allow mask to be a preprocessing fn - should return a valid mask + opts.mask = opts.mask.call(this, opts); + } + if ($.isArray(opts.mask)) { + $.each(opts.mask, function (ndx, msk) { + if (msk["mask"] != undefined) { + generateMask("", msk["mask"].toString(), msk); + } else + generateMask("", msk.toString()); + }); + } else generateMask("", opts.mask.toString()); + + return opts.greedy ? ms : ms.sort(function (a, b) { return a["mask"].length - b["mask"].length; }); + } + + var msie10 = navigator.userAgent.match(new RegExp("msie 10", "i")) !== null, + iphone = navigator.userAgent.match(new RegExp("iphone", "i")) !== null, + android = navigator.userAgent.match(new RegExp("android.*safari.*", "i")) !== null, + androidchrome = navigator.userAgent.match(new RegExp("android.*chrome.*", "i")) !== null, + pasteEvent = isInputEventSupported('paste') ? 'paste' : isInputEventSupported('input') ? 'input' : "propertychange"; + + + //masking scope + //actionObj definition see below + function maskScope(masksets, activeMasksetIndex, opts, actionObj) { + var isRTL = false, + valueOnFocus = getActiveBuffer().join(''), + $el, chromeValueOnInput, + skipKeyPressEvent = false, //Safari 5.1.x - modal dialog fires keypress twice workaround + skipInputEvent = false, //skip when triggered from within inputmask + ignorable = false; + + + //maskset helperfunctions + + function getActiveMaskSet() { + return masksets[activeMasksetIndex]; + } + + function getActiveTests() { + return getActiveMaskSet()['tests']; + } + + function getActiveBufferTemplate() { + return getActiveMaskSet()['_buffer']; + } + + function getActiveBuffer() { + return getActiveMaskSet()['buffer']; + } + + function isValid(pos, c, strict) { //strict true ~ no correction or autofill + strict = strict === true; //always set a value to strict to prevent possible strange behavior in the extensions + + function _isValid(position, activeMaskset, c, strict) { + var testPos = determineTestPosition(position), loopend = c ? 1 : 0, chrs = '', buffer = activeMaskset["buffer"]; + for (var i = activeMaskset['tests'][testPos].cardinality; i > loopend; i--) { + chrs += getBufferElement(buffer, testPos - (i - 1)); + } + + if (c) { + chrs += c; + } + + //return is false or a json object => { pos: ??, c: ??} or true + return activeMaskset['tests'][testPos].fn != null ? + activeMaskset['tests'][testPos].fn.test(chrs, buffer, position, strict, opts) + : (c == getBufferElement(activeMaskset['_buffer'], position, true) || c == opts.skipOptionalPartCharacter) ? + { "refresh": true, c: getBufferElement(activeMaskset['_buffer'], position, true), pos: position } + : false; + } + + function PostProcessResults(maskForwards, results) { + var hasValidActual = false; + $.each(results, function (ndx, rslt) { + hasValidActual = $.inArray(rslt["activeMasksetIndex"], maskForwards) == -1 && rslt["result"] !== false; + if (hasValidActual) return false; + }); + if (hasValidActual) { //strip maskforwards + results = $.map(results, function (rslt, ndx) { + if ($.inArray(rslt["activeMasksetIndex"], maskForwards) == -1) { + return rslt; + } else { + masksets[rslt["activeMasksetIndex"]]["lastValidPosition"] = actualLVP; + } + }); + } else { //keep maskforwards with the least forward + var lowestPos = -1, lowestIndex = -1, rsltValid; + $.each(results, function (ndx, rslt) { + if ($.inArray(rslt["activeMasksetIndex"], maskForwards) != -1 && rslt["result"] !== false & (lowestPos == -1 || lowestPos > rslt["result"]["pos"])) { + lowestPos = rslt["result"]["pos"]; + lowestIndex = rslt["activeMasksetIndex"]; + } + }); + results = $.map(results, function (rslt, ndx) { + if ($.inArray(rslt["activeMasksetIndex"], maskForwards) != -1) { + if (rslt["result"]["pos"] == lowestPos) { + return rslt; + } else if (rslt["result"] !== false) { + for (var i = pos; i < lowestPos; i++) { + rsltValid = _isValid(i, masksets[rslt["activeMasksetIndex"]], masksets[lowestIndex]["buffer"][i], true); + if (rsltValid === false) { + masksets[rslt["activeMasksetIndex"]]["lastValidPosition"] = lowestPos - 1; + break; + } else { + setBufferElement(masksets[rslt["activeMasksetIndex"]]["buffer"], i, masksets[lowestIndex]["buffer"][i], true); + masksets[rslt["activeMasksetIndex"]]["lastValidPosition"] = i; + } + } + //also check check for the lowestpos with the new input + rsltValid = _isValid(lowestPos, masksets[rslt["activeMasksetIndex"]], c, true); + if (rsltValid !== false) { + setBufferElement(masksets[rslt["activeMasksetIndex"]]["buffer"], lowestPos, c, true); + masksets[rslt["activeMasksetIndex"]]["lastValidPosition"] = lowestPos; + } + //console.log("ndx " + rslt["activeMasksetIndex"] + " validate " + masksets[rslt["activeMasksetIndex"]]["buffer"].join('') + " lv " + masksets[rslt["activeMasksetIndex"]]['lastValidPosition']); + return rslt; + } + } + }); + } + return results; + } + + if (strict) { + var result = _isValid(pos, getActiveMaskSet(), c, strict); //only check validity in current mask when validating strict + if (result === true) { + result = { "pos": pos }; //always take a possible corrected maskposition into account + } + return result; + } + + var results = [], result = false, currentActiveMasksetIndex = activeMasksetIndex, + actualBuffer = getActiveBuffer().slice(), actualLVP = getActiveMaskSet()["lastValidPosition"], + actualPrevious = seekPrevious(pos), + maskForwards = []; + $.each(masksets, function (index, value) { + if (typeof (value) == "object") { + activeMasksetIndex = index; + + var maskPos = pos; + var lvp = getActiveMaskSet()['lastValidPosition'], + rsltValid; + if (lvp == actualLVP) { + if ((maskPos - actualLVP) > 1) { + for (var i = lvp == -1 ? 0 : lvp; i < maskPos; i++) { + rsltValid = _isValid(i, getActiveMaskSet(), actualBuffer[i], true); + if (rsltValid === false) { + break; + } else { + setBufferElement(getActiveBuffer(), i, actualBuffer[i], true); + if (rsltValid === true) { + rsltValid = { "pos": i }; //always take a possible corrected maskposition into account + } + var newValidPosition = rsltValid.pos || i; + if (getActiveMaskSet()['lastValidPosition'] < newValidPosition) + getActiveMaskSet()['lastValidPosition'] = newValidPosition; //set new position from isValid + } + } + } + //does the input match on a further position? + if (!isMask(maskPos) && !_isValid(maskPos, getActiveMaskSet(), c, strict)) { + var maxForward = seekNext(maskPos) - maskPos; + for (var fw = 0; fw < maxForward; fw++) { + if (_isValid(++maskPos, getActiveMaskSet(), c, strict) !== false) + break; + } + maskForwards.push(activeMasksetIndex); + //console.log('maskforward ' + activeMasksetIndex + " pos " + pos + " maskPos " + maskPos); + } + } + + if (getActiveMaskSet()['lastValidPosition'] >= actualLVP || activeMasksetIndex == currentActiveMasksetIndex) { + if (maskPos >= 0 && maskPos < getMaskLength()) { + result = _isValid(maskPos, getActiveMaskSet(), c, strict); + if (result !== false) { + if (result === true) { + result = { "pos": maskPos }; //always take a possible corrected maskposition into account + } + var newValidPosition = result.pos || maskPos; + if (getActiveMaskSet()['lastValidPosition'] < newValidPosition) + getActiveMaskSet()['lastValidPosition'] = newValidPosition; //set new position from isValid + } + //console.log("pos " + pos + " ndx " + activeMasksetIndex + " validate " + getActiveBuffer().join('') + " lv " + getActiveMaskSet()['lastValidPosition']); + results.push({ "activeMasksetIndex": index, "result": result }); + } + } + } + }); + activeMasksetIndex = currentActiveMasksetIndex; //reset activeMasksetIndex + + return PostProcessResults(maskForwards, results); //return results of the multiple mask validations + } + + function determineActiveMasksetIndex() { + var currentMasksetIndex = activeMasksetIndex, + highestValid = { "activeMasksetIndex": 0, "lastValidPosition": -1, "next": -1 }; + $.each(masksets, function (index, value) { + if (typeof (value) == "object") { + activeMasksetIndex = index; + if (getActiveMaskSet()['lastValidPosition'] > highestValid['lastValidPosition']) { + highestValid["activeMasksetIndex"] = index; + highestValid["lastValidPosition"] = getActiveMaskSet()['lastValidPosition']; + highestValid["next"] = seekNext(getActiveMaskSet()['lastValidPosition']); + } else if (getActiveMaskSet()['lastValidPosition'] == highestValid['lastValidPosition'] && + (highestValid['next'] == -1 || highestValid['next'] > seekNext(getActiveMaskSet()['lastValidPosition']))) { + highestValid["activeMasksetIndex"] = index; + highestValid["lastValidPosition"] = getActiveMaskSet()['lastValidPosition']; + highestValid["next"] = seekNext(getActiveMaskSet()['lastValidPosition']); + } + } + }); + + activeMasksetIndex = highestValid["lastValidPosition"] != -1 && masksets[currentMasksetIndex]["lastValidPosition"] == highestValid["lastValidPosition"] ? currentMasksetIndex : highestValid["activeMasksetIndex"]; + if (currentMasksetIndex != activeMasksetIndex) { + clearBuffer(getActiveBuffer(), seekNext(highestValid["lastValidPosition"]), getMaskLength()); + getActiveMaskSet()["writeOutBuffer"] = true; + } + $el.data('_inputmask')['activeMasksetIndex'] = activeMasksetIndex; //store the activeMasksetIndex + } + + function isMask(pos) { + var testPos = determineTestPosition(pos); + var test = getActiveTests()[testPos]; + + return test != undefined ? test.fn : false; + } + + function determineTestPosition(pos) { + return pos % getActiveTests().length; + } + + function getMaskLength() { + return opts.getMaskLength(getActiveBufferTemplate(), getActiveMaskSet()['greedy'], getActiveMaskSet()['repeat'], getActiveBuffer(), opts); + } + + //pos: from position + + function seekNext(pos) { + var maskL = getMaskLength(); + if (pos >= maskL) return maskL; + var position = pos; + while (++position < maskL && !isMask(position)) { + } + return position; + } + + //pos: from position + + function seekPrevious(pos) { + var position = pos; + if (position <= 0) return 0; + + while (--position > 0 && !isMask(position)) { + } + return position; + } + + function setBufferElement(buffer, position, element, autoPrepare) { + if (autoPrepare) position = prepareBuffer(buffer, position); + + var test = getActiveTests()[determineTestPosition(position)]; + var elem = element; + if (elem != undefined && test != undefined) { + switch (test.casing) { + case "upper": + elem = element.toUpperCase(); + break; + case "lower": + elem = element.toLowerCase(); + break; + } + } + + buffer[position] = elem; + } + + function getBufferElement(buffer, position, autoPrepare) { + if (autoPrepare) position = prepareBuffer(buffer, position); + return buffer[position]; + } + + //needed to handle the non-greedy mask repetitions + + function prepareBuffer(buffer, position) { + var j; + while (buffer[position] == undefined && buffer.length < getMaskLength()) { + j = 0; + while (getActiveBufferTemplate()[j] !== undefined) { //add a new buffer + buffer.push(getActiveBufferTemplate()[j++]); + } + } + + return position; + } + + function writeBuffer(input, buffer, caretPos) { + input._valueSet(buffer.join('')); + if (caretPos != undefined) { + caret(input, caretPos); + } + } + + function clearBuffer(buffer, start, end, stripNomasks) { + for (var i = start, maskL = getMaskLength() ; i < end && i < maskL; i++) { + if (stripNomasks === true) { + if (!isMask(i)) + setBufferElement(buffer, i, ""); + } else + setBufferElement(buffer, i, getBufferElement(getActiveBufferTemplate().slice(), i, true)); + } + } + + function setReTargetPlaceHolder(buffer, pos) { + var testPos = determineTestPosition(pos); + setBufferElement(buffer, pos, getBufferElement(getActiveBufferTemplate(), testPos)); + } + + function getPlaceHolder(pos) { + return opts.placeholder.charAt(pos % opts.placeholder.length); + } + + function checkVal(input, writeOut, strict, nptvl, intelliCheck) { + var inputValue = nptvl != undefined ? nptvl.slice() : truncateInput(input._valueGet()).split(''); + + $.each(masksets, function (ndx, ms) { + if (typeof (ms) == "object") { + ms["buffer"] = ms["_buffer"].slice(); + ms["lastValidPosition"] = -1; + ms["p"] = -1; + } + }); + if (strict !== true) activeMasksetIndex = 0; + if (writeOut) input._valueSet(""); //initial clear + var ml = getMaskLength(); + $.each(inputValue, function (ndx, charCode) { + if (intelliCheck === true) { + var p = getActiveMaskSet()["p"], lvp = p == -1 ? p : seekPrevious(p), + pos = lvp == -1 ? ndx : seekNext(lvp); + if ($.inArray(charCode, getActiveBufferTemplate().slice(lvp + 1, pos)) == -1) { + keypressEvent.call(input, undefined, true, charCode.charCodeAt(0), writeOut, strict, ndx); + } + } else { + keypressEvent.call(input, undefined, true, charCode.charCodeAt(0), writeOut, strict, ndx); + } + }); + + if (strict === true && getActiveMaskSet()["p"] != -1) { + getActiveMaskSet()["lastValidPosition"] = seekPrevious(getActiveMaskSet()["p"]); + } + } + + function escapeRegex(str) { + return $.inputmask.escapeRegex.call(this, str); + } + + function truncateInput(inputValue) { + return inputValue.replace(new RegExp("(" + escapeRegex(getActiveBufferTemplate().join('')) + ")*$"), ""); + } + + function clearOptionalTail(input) { + var buffer = getActiveBuffer(), tmpBuffer = buffer.slice(), testPos, pos; + for (var pos = tmpBuffer.length - 1; pos >= 0; pos--) { + var testPos = determineTestPosition(pos); + if (getActiveTests()[testPos].optionality) { + if (!isMask(pos) || !isValid(pos, buffer[pos], true)) + tmpBuffer.pop(); + else break; + } else break; + } + writeBuffer(input, tmpBuffer); + } + + function unmaskedvalue($input, skipDatepickerCheck) { + if (getActiveTests() && (skipDatepickerCheck === true || !$input.hasClass('hasDatepicker'))) { + //checkVal(input, false, true); + var umValue = $.map(getActiveBuffer(), function (element, index) { + return isMask(index) && isValid(index, element, true) ? element : null; + }); + var unmaskedValue = (isRTL ? umValue.reverse() : umValue).join(''); + return opts.onUnMask != undefined ? opts.onUnMask.call(this, getActiveBuffer().join(''), unmaskedValue) : unmaskedValue; + } else { + return $input[0]._valueGet(); + } + } + + function TranslatePosition(pos) { + if (isRTL && typeof pos == 'number' && (!opts.greedy || opts.placeholder != "")) { + var bffrLght = getActiveBuffer().length; + pos = bffrLght - pos; + } + return pos; + } + + function caret(input, begin, end) { + var npt = input.jquery && input.length > 0 ? input[0] : input, range; + if (typeof begin == 'number') { + begin = TranslatePosition(begin); + end = TranslatePosition(end); + if (!$(input).is(':visible')) { + return; + } + end = (typeof end == 'number') ? end : begin; + npt.scrollLeft = npt.scrollWidth; + if (opts.insertMode == false && begin == end) end++; //set visualization for insert/overwrite mode + if (npt.setSelectionRange) { + npt.selectionStart = begin; + npt.selectionEnd = android ? begin : end; + + } else if (npt.createTextRange) { + range = npt.createTextRange(); + range.collapse(true); + range.moveEnd('character', end); + range.moveStart('character', begin); + range.select(); + } + } else { + if (!$(input).is(':visible')) { + return { "begin": 0, "end": 0 }; + } + if (npt.setSelectionRange) { + begin = npt.selectionStart; + end = npt.selectionEnd; + } else if (document.selection && document.selection.createRange) { + range = document.selection.createRange(); + begin = 0 - range.duplicate().moveStart('character', -100000); + end = begin + range.text.length; + } + begin = TranslatePosition(begin); + end = TranslatePosition(end); + return { "begin": begin, "end": end }; + } + } + + function isComplete(buffer) { //return true / false / undefined (repeat *) + if (opts.repeat == "*") return undefined; + var complete = false, highestValidPosition = 0, currentActiveMasksetIndex = activeMasksetIndex; + $.each(masksets, function (ndx, ms) { + if (typeof (ms) == "object") { + activeMasksetIndex = ndx; + var aml = seekPrevious(getMaskLength()); + if (ms["lastValidPosition"] >= highestValidPosition && ms["lastValidPosition"] == aml) { + var msComplete = true; + for (var i = 0; i <= aml; i++) { + var mask = isMask(i), testPos = determineTestPosition(i); + if ((mask && (buffer[i] == undefined || buffer[i] == getPlaceHolder(i))) || (!mask && buffer[i] != getActiveBufferTemplate()[testPos])) { + msComplete = false; + break; + } + } + complete = complete || msComplete; + if (complete) //break loop + return false; + } + highestValidPosition = ms["lastValidPosition"]; + } + }); + activeMasksetIndex = currentActiveMasksetIndex; //reset activeMaskset + return complete; + } + + function isSelection(begin, end) { + return isRTL ? (begin - end) > 1 || ((begin - end) == 1 && opts.insertMode) : + (end - begin) > 1 || ((end - begin) == 1 && opts.insertMode); + } + + + //private functions + function installEventRuler(npt) { + var events = $._data(npt).events; + + $.each(events, function (eventType, eventHandlers) { + $.each(eventHandlers, function (ndx, eventHandler) { + if (eventHandler.namespace == "inputmask") { + if (eventHandler.type != "setvalue") { + var handler = eventHandler.handler; + eventHandler.handler = function (e) { + if (this.readOnly || this.disabled) + e.preventDefault; + else + return handler.apply(this, arguments); + }; + } + } + }); + }); + } + + function patchValueProperty(npt) { + var valueProperty; + if (Object.getOwnPropertyDescriptor) + valueProperty = Object.getOwnPropertyDescriptor(npt, "value"); + if (valueProperty && valueProperty.get) { + if (!npt._valueGet) { + var valueGet = valueProperty.get; + var valueSet = valueProperty.set; + npt._valueGet = function () { + return isRTL ? valueGet.call(this).split('').reverse().join('') : valueGet.call(this); + }; + npt._valueSet = function (value) { + valueSet.call(this, isRTL ? value.split('').reverse().join('') : value); + }; + + Object.defineProperty(npt, "value", { + get: function () { + var $self = $(this), inputData = $(this).data('_inputmask'), masksets = inputData['masksets'], + activeMasksetIndex = inputData['activeMasksetIndex']; + return inputData && inputData['opts'].autoUnmask ? $self.inputmask('unmaskedvalue') : valueGet.call(this) != masksets[activeMasksetIndex]['_buffer'].join('') ? valueGet.call(this) : ''; + }, + set: function (value) { + valueSet.call(this, value); + $(this).triggerHandler('setvalue.inputmask'); + } + }); + } + } else if (document.__lookupGetter__ && npt.__lookupGetter__("value")) { + if (!npt._valueGet) { + var valueGet = npt.__lookupGetter__("value"); + var valueSet = npt.__lookupSetter__("value"); + npt._valueGet = function () { + return isRTL ? valueGet.call(this).split('').reverse().join('') : valueGet.call(this); + }; + npt._valueSet = function (value) { + valueSet.call(this, isRTL ? value.split('').reverse().join('') : value); + }; + + npt.__defineGetter__("value", function () { + var $self = $(this), inputData = $(this).data('_inputmask'), masksets = inputData['masksets'], + activeMasksetIndex = inputData['activeMasksetIndex']; + return inputData && inputData['opts'].autoUnmask ? $self.inputmask('unmaskedvalue') : valueGet.call(this) != masksets[activeMasksetIndex]['_buffer'].join('') ? valueGet.call(this) : ''; + }); + npt.__defineSetter__("value", function (value) { + valueSet.call(this, value); + $(this).triggerHandler('setvalue.inputmask'); + }); + } + } else { + if (!npt._valueGet) { + npt._valueGet = function () { return isRTL ? this.value.split('').reverse().join('') : this.value; }; + npt._valueSet = function (value) { this.value = isRTL ? value.split('').reverse().join('') : value; }; + } + if ($.valHooks.text == undefined || $.valHooks.text.inputmaskpatch != true) { + var valueGet = $.valHooks.text && $.valHooks.text.get ? $.valHooks.text.get : function (elem) { return elem.value; }; + var valueSet = $.valHooks.text && $.valHooks.text.set ? $.valHooks.text.set : function (elem, value) { + elem.value = value; + return elem; + }; + + jQuery.extend($.valHooks, { + text: { + get: function (elem) { + var $elem = $(elem); + if ($elem.data('_inputmask')) { + if ($elem.data('_inputmask')['opts'].autoUnmask) + return $elem.inputmask('unmaskedvalue'); + else { + var result = valueGet(elem), + inputData = $elem.data('_inputmask'), masksets = inputData['masksets'], + activeMasksetIndex = inputData['activeMasksetIndex']; + return result != masksets[activeMasksetIndex]['_buffer'].join('') ? result : ''; + } + } else return valueGet(elem); + }, + set: function (elem, value) { + var $elem = $(elem); + var result = valueSet(elem, value); + if ($elem.data('_inputmask')) $elem.triggerHandler('setvalue.inputmask'); + return result; + }, + inputmaskpatch: true + } + }); + } + } + } + + //shift chars to left from start to end and put c at end position if defined + + function shiftL(start, end, c, maskJumps) { + var buffer = getActiveBuffer(); + if (maskJumps !== false) //jumping over nonmask position + while (!isMask(start) && start - 1 >= 0) start--; + for (var i = start; i < end && i < getMaskLength() ; i++) { + if (isMask(i)) { + setReTargetPlaceHolder(buffer, i); + var j = seekNext(i); + var p = getBufferElement(buffer, j); + if (p != getPlaceHolder(j)) { + if (j < getMaskLength() && isValid(i, p, true) !== false && getActiveTests()[determineTestPosition(i)].def == getActiveTests()[determineTestPosition(j)].def) { + setBufferElement(buffer, i, p, true); + } else { + if (isMask(i)) + break; + } + } + } else { + setReTargetPlaceHolder(buffer, i); + } + } + if (c != undefined) + setBufferElement(buffer, seekPrevious(end), c); + + if (getActiveMaskSet()["greedy"] == false) { + var trbuffer = truncateInput(buffer.join('')).split(''); + buffer.length = trbuffer.length; + for (var i = 0, bl = buffer.length; i < bl; i++) { + buffer[i] = trbuffer[i]; + } + if (buffer.length == 0) getActiveMaskSet()["buffer"] = getActiveBufferTemplate().slice(); + } + return start; //return the used start position + } + + function shiftR(start, end, c) { + var buffer = getActiveBuffer(); + if (getBufferElement(buffer, start, true) != getPlaceHolder(start)) { + for (var i = seekPrevious(end) ; i > start && i >= 0; i--) { + if (isMask(i)) { + var j = seekPrevious(i); + var t = getBufferElement(buffer, j); + if (t != getPlaceHolder(j)) { + if (isValid(j, t, true) !== false && getActiveTests()[determineTestPosition(i)].def == getActiveTests()[determineTestPosition(j)].def) { + setBufferElement(buffer, i, t, true); + setReTargetPlaceHolder(buffer, j); + } //else break; + } + } else + setReTargetPlaceHolder(buffer, i); + } + } + if (c != undefined && getBufferElement(buffer, start) == getPlaceHolder(start)) + setBufferElement(buffer, start, c); + var lengthBefore = buffer.length; + if (getActiveMaskSet()["greedy"] == false) { + var trbuffer = truncateInput(buffer.join('')).split(''); + buffer.length = trbuffer.length; + for (var i = 0, bl = buffer.length; i < bl; i++) { + buffer[i] = trbuffer[i]; + } + if (buffer.length == 0) getActiveMaskSet()["buffer"] = getActiveBufferTemplate().slice(); + } + return end - (lengthBefore - buffer.length); //return new start position + } + + function HandleRemove(input, k, pos) { + if (opts.numericInput || isRTL) { + switch (k) { + case opts.keyCode.BACKSPACE: + k = opts.keyCode.DELETE; + break; + case opts.keyCode.DELETE: + k = opts.keyCode.BACKSPACE; + break; + } + if (isRTL) { + var pend = pos.end; + pos.end = pos.begin; + pos.begin = pend; + } + } + + var isSelection = true; + if (pos.begin == pos.end) { + var posBegin = k == opts.keyCode.BACKSPACE ? pos.begin - 1 : pos.begin; + if (opts.isNumeric && opts.radixPoint != "" && getActiveBuffer()[posBegin] == opts.radixPoint) { + pos.begin = (getActiveBuffer().length - 1 == posBegin) /* radixPoint is latest? delete it */ ? pos.begin : k == opts.keyCode.BACKSPACE ? posBegin : seekNext(posBegin); + pos.end = pos.begin; + } + isSelection = false; + if (k == opts.keyCode.BACKSPACE) + pos.begin--; + else if (k == opts.keyCode.DELETE) + pos.end++; + } else if (pos.end - pos.begin == 1 && !opts.insertMode) { + isSelection = false; + if (k == opts.keyCode.BACKSPACE) + pos.begin--; + } + + clearBuffer(getActiveBuffer(), pos.begin, pos.end); + + var ml = getMaskLength(); + if (opts.greedy == false) { + shiftL(pos.begin, ml, undefined, !isRTL && (k == opts.keyCode.BACKSPACE && !isSelection)); + } else { + var newpos = pos.begin; + for (var i = pos.begin; i < pos.end; i++) { //seeknext to skip placeholders at start in selection + if (isMask(i) || !isSelection) + newpos = shiftL(pos.begin, ml, undefined, !isRTL && (k == opts.keyCode.BACKSPACE && !isSelection)); + } + if (!isSelection) pos.begin = newpos; + } + var firstMaskPos = seekNext(-1); + clearBuffer(getActiveBuffer(), pos.begin, pos.end, true); + checkVal(input, false, masksets[1] == undefined || firstMaskPos >= pos.end, getActiveBuffer()); + if (getActiveMaskSet()['lastValidPosition'] < firstMaskPos) { + getActiveMaskSet()["lastValidPosition"] = -1; + getActiveMaskSet()["p"] = firstMaskPos; + } else { + getActiveMaskSet()["p"] = pos.begin; + } + } + + function keydownEvent(e) { + //Safari 5.1.x - modal dialog fires keypress twice workaround + skipKeyPressEvent = false; + var input = this, $input = $(input), k = e.keyCode, pos = caret(input); + + //backspace, delete, and escape get special treatment + if (k == opts.keyCode.BACKSPACE || k == opts.keyCode.DELETE || (iphone && k == 127) || e.ctrlKey && k == 88) { //backspace/delete + e.preventDefault(); //stop default action but allow propagation + if (k == 88) valueOnFocus = getActiveBuffer().join(''); + HandleRemove(input, k, pos); + determineActiveMasksetIndex(); + writeBuffer(input, getActiveBuffer(), getActiveMaskSet()["p"]); + if (input._valueGet() == getActiveBufferTemplate().join('')) + $input.trigger('cleared'); + + if (opts.showTooltip) { //update tooltip + $input.prop("title", getActiveMaskSet()["mask"]); + } + } else if (k == opts.keyCode.END || k == opts.keyCode.PAGE_DOWN) { //when END or PAGE_DOWN pressed set position at lastmatch + setTimeout(function () { + var caretPos = seekNext(getActiveMaskSet()["lastValidPosition"]); + if (!opts.insertMode && caretPos == getMaskLength() && !e.shiftKey) caretPos--; + caret(input, e.shiftKey ? pos.begin : caretPos, caretPos); + }, 0); + } else if ((k == opts.keyCode.HOME && !e.shiftKey) || k == opts.keyCode.PAGE_UP) { //Home or page_up + caret(input, 0, e.shiftKey ? pos.begin : 0); + } else if (k == opts.keyCode.ESCAPE || (k == 90 && e.ctrlKey)) { //escape && undo + checkVal(input, true, false, valueOnFocus.split('')); + $input.click(); + } else if (k == opts.keyCode.INSERT && !(e.shiftKey || e.ctrlKey)) { //insert + opts.insertMode = !opts.insertMode; + caret(input, !opts.insertMode && pos.begin == getMaskLength() ? pos.begin - 1 : pos.begin); + } else if (opts.insertMode == false && !e.shiftKey) { + if (k == opts.keyCode.RIGHT) { + setTimeout(function () { + var caretPos = caret(input); + caret(input, caretPos.begin); + }, 0); + } else if (k == opts.keyCode.LEFT) { + setTimeout(function () { + var caretPos = caret(input); + caret(input, caretPos.begin - 1); + }, 0); + } + } + + var currentCaretPos = caret(input); + if (opts.onKeyDown.call(this, e, getActiveBuffer(), opts) === true) //extra stuff to execute on keydown + caret(input, currentCaretPos.begin, currentCaretPos.end); + ignorable = $.inArray(k, opts.ignorables) != -1; + } + + + function keypressEvent(e, checkval, k, writeOut, strict, ndx) { + //Safari 5.1.x - modal dialog fires keypress twice workaround + if (k == undefined && skipKeyPressEvent) return false; + skipKeyPressEvent = true; + + var input = this, $input = $(input); + + e = e || window.event; + var k = checkval ? k : (e.which || e.charCode || e.keyCode); + + if (checkval !== true && (!(e.ctrlKey && e.altKey) && (e.ctrlKey || e.metaKey || ignorable))) { + return true; + } else { + if (k) { + //special treat the decimal separator + if (checkval !== true && k == 46 && e.shiftKey == false && opts.radixPoint == ",") k = 44; + + var pos, results, result, c = String.fromCharCode(k); + if (checkval) { + var pcaret = strict ? ndx : getActiveMaskSet()["lastValidPosition"] + 1; + pos = { begin: pcaret, end: pcaret }; + } else { + pos = caret(input); + } + + //should we clear a possible selection?? + var isSlctn = isSelection(pos.begin, pos.end), redetermineLVP = false, + initialIndex = activeMasksetIndex; + if (isSlctn) { + activeMasksetIndex = initialIndex; + $.each(masksets, function (ndx, lmnt) { //init undobuffer for recovery when not valid + if (typeof (lmnt) == "object") { + activeMasksetIndex = ndx; + getActiveMaskSet()["undoBuffer"] = getActiveBuffer().join(''); + } + }); + HandleRemove(input, opts.keyCode.DELETE, pos); + if (!opts.insertMode) { //preserve some space + $.each(masksets, function (ndx, lmnt) { + if (typeof (lmnt) == "object") { + activeMasksetIndex = ndx; + shiftR(pos.begin, getMaskLength()); + getActiveMaskSet()["lastValidPosition"] = seekNext(getActiveMaskSet()["lastValidPosition"]); + } + }); + } + activeMasksetIndex = initialIndex; //restore index + } + + var radixPosition = getActiveBuffer().join('').indexOf(opts.radixPoint); + if (opts.isNumeric && checkval !== true && radixPosition != -1) { + if (opts.greedy && pos.begin <= radixPosition) { + pos.begin = seekPrevious(pos.begin); + pos.end = pos.begin; + } else if (c == opts.radixPoint) { + pos.begin = radixPosition; + pos.end = pos.begin; + } + } + + + var p = pos.begin; + results = isValid(p, c, strict); + if (strict === true) results = [{ "activeMasksetIndex": activeMasksetIndex, "result": results }]; + var minimalForwardPosition = -1; + $.each(results, function (index, result) { + activeMasksetIndex = result["activeMasksetIndex"]; + getActiveMaskSet()["writeOutBuffer"] = true; + var np = result["result"]; + if (np !== false) { + var refresh = false, buffer = getActiveBuffer(); + if (np !== true) { + refresh = np["refresh"]; //only rewrite buffer from isValid + p = np.pos != undefined ? np.pos : p; //set new position from isValid + c = np.c != undefined ? np.c : c; //set new char from isValid + } + if (refresh !== true) { + if (opts.insertMode == true) { + var lastUnmaskedPosition = getMaskLength(); + var bfrClone = buffer.slice(); + while (getBufferElement(bfrClone, lastUnmaskedPosition, true) != getPlaceHolder(lastUnmaskedPosition) && lastUnmaskedPosition >= p) { + lastUnmaskedPosition = lastUnmaskedPosition == 0 ? -1 : seekPrevious(lastUnmaskedPosition); + } + if (lastUnmaskedPosition >= p) { + shiftR(p, getMaskLength(), c); + //shift the lvp if needed + var lvp = getActiveMaskSet()["lastValidPosition"], nlvp = seekNext(lvp); + if (nlvp != getMaskLength() && lvp >= p && (getBufferElement(getActiveBuffer(), nlvp, true) != getPlaceHolder(nlvp))) { + getActiveMaskSet()["lastValidPosition"] = nlvp; + } + } else getActiveMaskSet()["writeOutBuffer"] = false; + } else setBufferElement(buffer, p, c, true); + if (minimalForwardPosition == -1 || minimalForwardPosition > seekNext(p)) { + minimalForwardPosition = seekNext(p); + } + } else if (!strict) { + var nextPos = p < getMaskLength() ? p + 1 : p; + if (minimalForwardPosition == -1 || minimalForwardPosition > nextPos) { + minimalForwardPosition = nextPos; + } + } + if (minimalForwardPosition > getActiveMaskSet()["p"]) + getActiveMaskSet()["p"] = minimalForwardPosition; //needed for checkval strict + } + }); + + if (strict !== true) { + activeMasksetIndex = initialIndex; + determineActiveMasksetIndex(); + } + if (writeOut !== false) { + $.each(results, function (ndx, rslt) { + if (rslt["activeMasksetIndex"] == activeMasksetIndex) { + result = rslt; + return false; + } + }); + if (result != undefined) { + var self = this; + setTimeout(function () { opts.onKeyValidation.call(self, result["result"], opts); }, 0); + if (getActiveMaskSet()["writeOutBuffer"] && result["result"] !== false) { + var buffer = getActiveBuffer(); + + var newCaretPosition; + if (checkval) { + newCaretPosition = undefined; + } else if (opts.numericInput) { + if (p > radixPosition) { + newCaretPosition = seekPrevious(minimalForwardPosition); + } else if (c == opts.radixPoint) { + newCaretPosition = minimalForwardPosition - 1; + } else newCaretPosition = seekPrevious(minimalForwardPosition - 1); + } else { + newCaretPosition = minimalForwardPosition; + } + + writeBuffer(input, buffer, newCaretPosition); + if (checkval !== true) { + setTimeout(function () { //timeout needed for IE + if (isComplete(buffer) === true) + $input.trigger("complete"); + skipInputEvent = true; + $input.trigger("input"); + }, 0); + } + } else if (isSlctn) { + getActiveMaskSet()["buffer"] = getActiveMaskSet()["undoBuffer"].split(''); + } + } + } + + if (opts.showTooltip) { //update tooltip + $input.prop("title", getActiveMaskSet()["mask"]); + } + + //needed for IE8 and below + if (e) e.preventDefault ? e.preventDefault() : e.returnValue = false; + } + } + } + + function keyupEvent(e) { + var $input = $(this), input = this, k = e.keyCode, buffer = getActiveBuffer(); + + if (androidchrome && k == opts.keyCode.BACKSPACE) { + if (chromeValueOnInput == input._valueGet()) + keydownEvent.call(this, e); + } + + opts.onKeyUp.call(this, e, buffer, opts); //extra stuff to execute on keyup + if (k == opts.keyCode.TAB && opts.showMaskOnFocus) { + if ($input.hasClass('focus.inputmask') && input._valueGet().length == 0) { + buffer = getActiveBufferTemplate().slice(); + writeBuffer(input, buffer); + caret(input, 0); + valueOnFocus = getActiveBuffer().join(''); + } else { + writeBuffer(input, buffer); + if (buffer.join('') == getActiveBufferTemplate().join('') && $.inArray(opts.radixPoint, buffer) != -1) { + caret(input, TranslatePosition(0)); + $input.click(); + } else + caret(input, TranslatePosition(0), TranslatePosition(getMaskLength())); + } + } + } + + function inputEvent(e) { + if (skipInputEvent === true) { + skipInputEvent = false; + return true; + } + var input = this, $input = $(input); + + chromeValueOnInput = getActiveBuffer().join(''); + checkVal(input, false, false); + writeBuffer(input, getActiveBuffer()); + if (isComplete(getActiveBuffer()) === true) + $input.trigger("complete"); + $input.click(); + } + + function mask(el) { + $el = $(el); + if ($el.is(":input")) { + //store tests & original buffer in the input element - used to get the unmasked value + $el.data('_inputmask', { + 'masksets': masksets, + 'activeMasksetIndex': activeMasksetIndex, + 'opts': opts, + 'isRTL': false + }); + + //show tooltip + if (opts.showTooltip) { + $el.prop("title", getActiveMaskSet()["mask"]); + } + + //correct greedy setting if needed + getActiveMaskSet()['greedy'] = getActiveMaskSet()['greedy'] ? getActiveMaskSet()['greedy'] : getActiveMaskSet()['repeat'] == 0; + + //handle maxlength attribute + if ($el.attr("maxLength") != null) //only when the attribute is set + { + var maxLength = $el.prop('maxLength'); + if (maxLength > -1) { //handle *-repeat + $.each(masksets, function (ndx, ms) { + if (typeof (ms) == "object") { + if (ms["repeat"] == "*") { + ms["repeat"] = maxLength; + } + } + }); + } + if (getMaskLength() >= maxLength && maxLength > -1) { //FF sets no defined max length to -1 + if (maxLength < getActiveBufferTemplate().length) getActiveBufferTemplate().length = maxLength; + if (getActiveMaskSet()['greedy'] == false) { + getActiveMaskSet()['repeat'] = Math.round(maxLength / getActiveBufferTemplate().length); + } + $el.prop('maxLength', getMaskLength() * 2); + } + } + + patchValueProperty(el); + + if (opts.numericInput) opts.isNumeric = opts.numericInput; + if (el.dir == "rtl" || (opts.numericInput && opts.rightAlignNumerics) || (opts.isNumeric && opts.rightAlignNumerics)) + $el.css("text-align", "right"); + + if (el.dir == "rtl" || opts.numericInput) { + el.dir = "ltr"; + $el.removeAttr("dir"); + var inputData = $el.data('_inputmask'); + inputData['isRTL'] = true; + $el.data('_inputmask', inputData); + isRTL = true; + } + + //unbind all events - to make sure that no other mask will interfere when re-masking + $el.unbind(".inputmask"); + $el.removeClass('focus.inputmask'); + //bind events + $el.closest('form').bind("submit", function () { //trigger change on submit if any + if (valueOnFocus != getActiveBuffer().join('')) { + $el.change(); + } + }).bind('reset', function () { + setTimeout(function () { + $el.trigger("setvalue"); + }, 0); + }); + $el.bind("mouseenter.inputmask", function () { + var $input = $(this), input = this; + if (!$input.hasClass('focus.inputmask') && opts.showMaskOnHover) { + if (input._valueGet() != getActiveBuffer().join('')) { + writeBuffer(input, getActiveBuffer()); + } + } + }).bind("blur.inputmask", function () { + var $input = $(this), input = this, nptValue = input._valueGet(), buffer = getActiveBuffer(); + $input.removeClass('focus.inputmask'); + if (valueOnFocus != getActiveBuffer().join('')) { + $input.change(); + } + if (opts.clearMaskOnLostFocus && nptValue != '') { + if (nptValue == getActiveBufferTemplate().join('')) + input._valueSet(''); + else { //clearout optional tail of the mask + clearOptionalTail(input); + } + } + if (isComplete(buffer) === false) { + $input.trigger("incomplete"); + if (opts.clearIncomplete) { + $.each(masksets, function (ndx, ms) { + if (typeof (ms) == "object") { + ms["buffer"] = ms["_buffer"].slice(); + ms["lastValidPosition"] = -1; + } + }); + activeMasksetIndex = 0; + if (opts.clearMaskOnLostFocus) + input._valueSet(''); + else { + buffer = getActiveBufferTemplate().slice(); + writeBuffer(input, buffer); + } + } + } + }).bind("focus.inputmask", function () { + var $input = $(this), input = this, nptValue = input._valueGet(); + if (opts.showMaskOnFocus && !$input.hasClass('focus.inputmask') && (!opts.showMaskOnHover || (opts.showMaskOnHover && nptValue == ''))) { + if (input._valueGet() != getActiveBuffer().join('')) { + writeBuffer(input, getActiveBuffer(), seekNext(getActiveMaskSet()["lastValidPosition"])); + } + } + $input.addClass('focus.inputmask'); + valueOnFocus = getActiveBuffer().join(''); + }).bind("mouseleave.inputmask", function () { + var $input = $(this), input = this; + if (opts.clearMaskOnLostFocus) { + if (!$input.hasClass('focus.inputmask') && input._valueGet() != $input.attr("placeholder")) { + if (input._valueGet() == getActiveBufferTemplate().join('') || input._valueGet() == '') + input._valueSet(''); + else { //clearout optional tail of the mask + clearOptionalTail(input); + } + } + } + }).bind("click.inputmask", function () { + var input = this; + setTimeout(function () { + var selectedCaret = caret(input), buffer = getActiveBuffer(); + if (selectedCaret.begin == selectedCaret.end) { + var clickPosition = isRTL ? TranslatePosition(selectedCaret.begin) : selectedCaret.begin, + lvp = getActiveMaskSet()["lastValidPosition"], + lastPosition; + if (opts.isNumeric) { + lastPosition = opts.skipRadixDance === false && opts.radixPoint != "" && $.inArray(opts.radixPoint, buffer) != -1 ? + (opts.numericInput ? seekNext($.inArray(opts.radixPoint, buffer)) : $.inArray(opts.radixPoint, buffer)) : + seekNext(lvp); + } else { + lastPosition = seekNext(lvp); + } + if (clickPosition < lastPosition) { + if (isMask(clickPosition)) + caret(input, clickPosition); + else caret(input, seekNext(clickPosition)); + } else + caret(input, lastPosition); + } + }, 0); + }).bind('dblclick.inputmask', function () { + var input = this; + setTimeout(function () { + caret(input, 0, seekNext(getActiveMaskSet()["lastValidPosition"])); + }, 0); + }).bind(pasteEvent + ".inputmask dragdrop.inputmask drop.inputmask", function (e) { + if (skipInputEvent === true) { + skipInputEvent = false; + return true; + } + var input = this, $input = $(input); + + //paste event for IE8 and lower I guess ;-) + if (e.type == "propertychange" && input._valueGet().length <= getMaskLength()) { + return true; + } + setTimeout(function () { + var pasteValue = opts.onBeforePaste != undefined ? opts.onBeforePaste.call(this, input._valueGet()) : input._valueGet(); + checkVal(input, true, false, pasteValue.split(''), true); + if (isComplete(getActiveBuffer()) === true) + $input.trigger("complete"); + $input.click(); + }, 0); + }).bind('setvalue.inputmask', function () { + var input = this; + checkVal(input, true); + valueOnFocus = getActiveBuffer().join(''); + if (input._valueGet() == getActiveBufferTemplate().join('')) + input._valueSet(''); + }).bind('complete.inputmask', opts.oncomplete + ).bind('incomplete.inputmask', opts.onincomplete + ).bind('cleared.inputmask', opts.oncleared + ).bind("keyup.inputmask", keyupEvent); + + if (androidchrome) { + $el.bind("input.inputmask", inputEvent); + } else { + $el.bind("keydown.inputmask", keydownEvent + ).bind("keypress.inputmask", keypressEvent); + } + + if (msie10) + $el.bind("input.inputmask", inputEvent); + + //apply mask + checkVal(el, true, false); + valueOnFocus = getActiveBuffer().join(''); + // Wrap document.activeElement in a try/catch block since IE9 throw "Unspecified error" if document.activeElement is undefined when we are in an IFrame. + var activeElement; + try { + activeElement = document.activeElement; + } catch (e) { + } + if (activeElement === el) { //position the caret when in focus + $el.addClass('focus.inputmask'); + caret(el, seekNext(getActiveMaskSet()["lastValidPosition"])); + } else if (opts.clearMaskOnLostFocus) { + if (getActiveBuffer().join('') == getActiveBufferTemplate().join('')) { + el._valueSet(''); + } else { + clearOptionalTail(el); + } + } else { + writeBuffer(el, getActiveBuffer()); + } + + installEventRuler(el); + } + } + + //action object + if (actionObj != undefined) { + switch (actionObj["action"]) { + case "isComplete": + return isComplete(actionObj["buffer"]); + case "unmaskedvalue": + isRTL = actionObj["$input"].data('_inputmask')['isRTL']; + return unmaskedvalue(actionObj["$input"], actionObj["skipDatepickerCheck"]); + case "mask": + mask(actionObj["el"]); + break; + case "format": + $el = $({}); + $el.data('_inputmask', { + 'masksets': masksets, + 'activeMasksetIndex': activeMasksetIndex, + 'opts': opts, + 'isRTL': opts.numericInput + }); + if (opts.numericInput) { + opts.isNumeric = opts.numericInput; + isRTL = true; + } + + checkVal($el, false, false, actionObj["value"].split(''), true); + return getActiveBuffer().join(''); + } + } + } + $.inputmask = { + //options default + defaults: { + placeholder: "_", + optionalmarker: { start: "[", end: "]" }, + quantifiermarker: { start: "{", end: "}" }, + groupmarker: { start: "(", end: ")" }, + escapeChar: "\\", + mask: null, + oncomplete: $.noop, //executes when the mask is complete + onincomplete: $.noop, //executes when the mask is incomplete and focus is lost + oncleared: $.noop, //executes when the mask is cleared + repeat: 0, //repetitions of the mask: * ~ forever, otherwise specify an integer + greedy: true, //true: allocated buffer for the mask and repetitions - false: allocate only if needed + autoUnmask: false, //automatically unmask when retrieving the value with $.fn.val or value if the browser supports __lookupGetter__ or getOwnPropertyDescriptor + clearMaskOnLostFocus: true, + insertMode: true, //insert the input or overwrite the input + clearIncomplete: false, //clear the incomplete input on blur + aliases: {}, //aliases definitions => see jquery.inputmask.extensions.js + onKeyUp: $.noop, //override to implement autocomplete on certain keys for example + onKeyDown: $.noop, //override to implement autocomplete on certain keys for example + onBeforePaste: undefined, //executes before masking the pasted value to allow preprocessing of the pasted value. args => pastedValue => return processedValue + onUnMask: undefined, //executes after unmasking to allow postprocessing of the unmaskedvalue. args => maskedValue, unmaskedValue + showMaskOnFocus: true, //show the mask-placeholder when the input has focus + showMaskOnHover: true, //show the mask-placeholder when hovering the empty input + onKeyValidation: $.noop, //executes on every key-press with the result of isValid. Params: result, opts + skipOptionalPartCharacter: " ", //a character which can be used to skip an optional part of a mask + showTooltip: false, //show the activemask as tooltip + numericInput: false, //numericInput input direction style (input shifts to the left while holding the caret position) + //numeric basic properties + isNumeric: false, //enable numeric features + radixPoint: "", //".", // | "," + skipRadixDance: false, //disable radixpoint caret positioning + rightAlignNumerics: true, //align numerics to the right + //numeric basic properties + definitions: { + '9': { + validator: "[0-9]", + cardinality: 1 + }, + 'a': { + validator: "[A-Za-z\u0410-\u044F\u0401\u0451]", + cardinality: 1 + }, + '*': { + validator: "[A-Za-z\u0410-\u044F\u0401\u04510-9]", + cardinality: 1 + } + }, + keyCode: { + ALT: 18, BACKSPACE: 8, CAPS_LOCK: 20, COMMA: 188, COMMAND: 91, COMMAND_LEFT: 91, COMMAND_RIGHT: 93, CONTROL: 17, DELETE: 46, DOWN: 40, END: 35, ENTER: 13, ESCAPE: 27, HOME: 36, INSERT: 45, LEFT: 37, MENU: 93, NUMPAD_ADD: 107, NUMPAD_DECIMAL: 110, NUMPAD_DIVIDE: 111, NUMPAD_ENTER: 108, + NUMPAD_MULTIPLY: 106, NUMPAD_SUBTRACT: 109, PAGE_DOWN: 34, PAGE_UP: 33, PERIOD: 190, RIGHT: 39, SHIFT: 16, SPACE: 32, TAB: 9, UP: 38, WINDOWS: 91 + }, + //specify keycodes which should not be considered in the keypress event, otherwise the preventDefault will stop their default behavior especially in FF + ignorables: [8, 9, 13, 19, 27, 33, 34, 35, 36, 37, 38, 39, 40, 45, 46, 93, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123], + getMaskLength: function (buffer, greedy, repeat, currentBuffer, opts) { + var calculatedLength = buffer.length; + if (!greedy) { + if (repeat == "*") { + calculatedLength = currentBuffer.length + 1; + } else if (repeat > 1) { + calculatedLength += (buffer.length * (repeat - 1)); + } + } + return calculatedLength; + } + }, + escapeRegex: function (str) { + var specials = ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\']; + return str.replace(new RegExp('(\\' + specials.join('|\\') + ')', 'gim'), '\\$1'); + }, + format: function (value, options) { + var opts = $.extend(true, {}, $.inputmask.defaults, options); + resolveAlias(opts.alias, options, opts); + return maskScope(generateMaskSets(opts), 0, opts, { "action": "format", "value": value }); + } + }; + + $.fn.inputmask = function (fn, options) { + var opts = $.extend(true, {}, $.inputmask.defaults, options), + masksets, + activeMasksetIndex = 0; + + if (typeof fn === "string") { + switch (fn) { + case "mask": + //resolve possible aliases given by options + resolveAlias(opts.alias, options, opts); + masksets = generateMaskSets(opts); + if (masksets.length == 0) { return this; } + + return this.each(function () { + maskScope($.extend(true, {}, masksets), 0, opts, { "action": "mask", "el": this }); + }); + case "unmaskedvalue": + var $input = $(this), input = this; + if ($input.data('_inputmask')) { + masksets = $input.data('_inputmask')['masksets']; + activeMasksetIndex = $input.data('_inputmask')['activeMasksetIndex']; + opts = $input.data('_inputmask')['opts']; + return maskScope(masksets, activeMasksetIndex, opts, { "action": "unmaskedvalue", "$input": $input }); + } else return $input.val(); + case "remove": + return this.each(function () { + var $input = $(this), input = this; + if ($input.data('_inputmask')) { + masksets = $input.data('_inputmask')['masksets']; + activeMasksetIndex = $input.data('_inputmask')['activeMasksetIndex']; + opts = $input.data('_inputmask')['opts']; + //writeout the unmaskedvalue + input._valueSet(maskScope(masksets, activeMasksetIndex, opts, { "action": "unmaskedvalue", "$input": $input, "skipDatepickerCheck": true })); + //clear data + $input.removeData('_inputmask'); + //unbind all events + $input.unbind(".inputmask"); + $input.removeClass('focus.inputmask'); + //restore the value property + var valueProperty; + if (Object.getOwnPropertyDescriptor) + valueProperty = Object.getOwnPropertyDescriptor(input, "value"); + if (valueProperty && valueProperty.get) { + if (input._valueGet) { + Object.defineProperty(input, "value", { + get: input._valueGet, + set: input._valueSet + }); + } + } else if (document.__lookupGetter__ && input.__lookupGetter__("value")) { + if (input._valueGet) { + input.__defineGetter__("value", input._valueGet); + input.__defineSetter__("value", input._valueSet); + } + } + try { //try catch needed for IE7 as it does not supports deleting fns + delete input._valueGet; + delete input._valueSet; + } catch (e) { + input._valueGet = undefined; + input._valueSet = undefined; + + } + } + }); + break; + case "getemptymask": //return the default (empty) mask value, usefull for setting the default value in validation + if (this.data('_inputmask')) { + masksets = this.data('_inputmask')['masksets']; + activeMasksetIndex = this.data('_inputmask')['activeMasksetIndex']; + return masksets[activeMasksetIndex]['_buffer'].join(''); + } + else return ""; + case "hasMaskedValue": //check wheter the returned value is masked or not; currently only works reliable when using jquery.val fn to retrieve the value + return this.data('_inputmask') ? !this.data('_inputmask')['opts'].autoUnmask : false; + case "isComplete": + masksets = this.data('_inputmask')['masksets']; + activeMasksetIndex = this.data('_inputmask')['activeMasksetIndex']; + opts = this.data('_inputmask')['opts']; + return maskScope(masksets, activeMasksetIndex, opts, { "action": "isComplete", "buffer": this[0]._valueGet().split('') }); + case "getmetadata": //return mask metadata if exists + if (this.data('_inputmask')) { + masksets = this.data('_inputmask')['masksets']; + activeMasksetIndex = this.data('_inputmask')['activeMasksetIndex']; + return masksets[activeMasksetIndex]['metadata']; + } + else return undefined; + default: + //check if the fn is an alias + if (!resolveAlias(fn, options, opts)) { + //maybe fn is a mask so we try + //set mask + opts.mask = fn; + } + masksets = generateMaskSets(opts); + if (masksets.length == 0) { return this; } + return this.each(function () { + maskScope($.extend(true, {}, masksets), activeMasksetIndex, opts, { "action": "mask", "el": this }); + }); + + break; + } + } else if (typeof fn == "object") { + opts = $.extend(true, {}, $.inputmask.defaults, fn); + + resolveAlias(opts.alias, fn, opts); //resolve aliases + masksets = generateMaskSets(opts); + if (masksets.length == 0) { return this; } + return this.each(function () { + maskScope($.extend(true, {}, masksets), activeMasksetIndex, opts, { "action": "mask", "el": this }); + }); + } else if (fn == undefined) { + //look for data-inputmask atribute - the attribute should only contain optipns + return this.each(function () { + var attrOptions = $(this).attr("data-inputmask"); + if (attrOptions && attrOptions != "") { + try { + attrOptions = attrOptions.replace(new RegExp("'", "g"), '"'); + var dataoptions = $.parseJSON("{" + attrOptions + "}"); + $.extend(true, dataoptions, options); + opts = $.extend(true, {}, $.inputmask.defaults, dataoptions); + resolveAlias(opts.alias, dataoptions, opts); + opts.alias = undefined; + $(this).inputmask(opts); + } catch (ex) { } //need a more relax parseJSON + } + }); + } + }; + } +})(jQuery); diff --git a/theme/bootstrap/plugins/input-mask/jquery.inputmask.numeric.extensions.js b/theme/bootstrap/plugins/input-mask/jquery.inputmask.numeric.extensions.js new file mode 100644 index 0000000..2efb33f --- /dev/null +++ b/theme/bootstrap/plugins/input-mask/jquery.inputmask.numeric.extensions.js @@ -0,0 +1,177 @@ +/* +Input Mask plugin extensions +http://github.com/RobinHerbots/jquery.inputmask +Copyright (c) 2010 - 2014 Robin Herbots +Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) +Version: 0.0.0 + +Optional extensions on the jquery.inputmask base +*/ +(function ($) { + //number aliases + $.extend($.inputmask.defaults.aliases, { + 'decimal': { + mask: "~", + placeholder: "", + repeat: "*", + greedy: false, + numericInput: false, + isNumeric: true, + digits: "*", //number of fractionalDigits + groupSeparator: "",//",", // | "." + radixPoint: ".", + groupSize: 3, + autoGroup: false, + allowPlus: true, + allowMinus: true, + //todo + integerDigits: "*", //number of integerDigits + defaultValue: "", + prefix: "", + suffix: "", + + //todo + getMaskLength: function (buffer, greedy, repeat, currentBuffer, opts) { //custom getMaskLength to take the groupSeparator into account + var calculatedLength = buffer.length; + + if (!greedy) { + if (repeat == "*") { + calculatedLength = currentBuffer.length + 1; + } else if (repeat > 1) { + calculatedLength += (buffer.length * (repeat - 1)); + } + } + + var escapedGroupSeparator = $.inputmask.escapeRegex.call(this, opts.groupSeparator); + var escapedRadixPoint = $.inputmask.escapeRegex.call(this, opts.radixPoint); + var currentBufferStr = currentBuffer.join(''), strippedBufferStr = currentBufferStr.replace(new RegExp(escapedGroupSeparator, "g"), "").replace(new RegExp(escapedRadixPoint), ""), + groupOffset = currentBufferStr.length - strippedBufferStr.length; + return calculatedLength + groupOffset; + }, + postFormat: function (buffer, pos, reformatOnly, opts) { + if (opts.groupSeparator == "") return pos; + var cbuf = buffer.slice(), + radixPos = $.inArray(opts.radixPoint, buffer); + if (!reformatOnly) { + cbuf.splice(pos, 0, "?"); //set position indicator + } + var bufVal = cbuf.join(''); + if (opts.autoGroup || (reformatOnly && bufVal.indexOf(opts.groupSeparator) != -1)) { + var escapedGroupSeparator = $.inputmask.escapeRegex.call(this, opts.groupSeparator); + bufVal = bufVal.replace(new RegExp(escapedGroupSeparator, "g"), ''); + var radixSplit = bufVal.split(opts.radixPoint); + bufVal = radixSplit[0]; + var reg = new RegExp('([-\+]?[\\d\?]+)([\\d\?]{' + opts.groupSize + '})'); + while (reg.test(bufVal)) { + bufVal = bufVal.replace(reg, '$1' + opts.groupSeparator + '$2'); + bufVal = bufVal.replace(opts.groupSeparator + opts.groupSeparator, opts.groupSeparator); + } + if (radixSplit.length > 1) + bufVal += opts.radixPoint + radixSplit[1]; + } + buffer.length = bufVal.length; //align the length + for (var i = 0, l = bufVal.length; i < l; i++) { + buffer[i] = bufVal.charAt(i); + } + var newPos = $.inArray("?", buffer); + if (!reformatOnly) buffer.splice(newPos, 1); + + return reformatOnly ? pos : newPos; + }, + regex: { + number: function (opts) { + var escapedGroupSeparator = $.inputmask.escapeRegex.call(this, opts.groupSeparator); + var escapedRadixPoint = $.inputmask.escapeRegex.call(this, opts.radixPoint); + var digitExpression = isNaN(opts.digits) ? opts.digits : '{0,' + opts.digits + '}'; + var signedExpression = opts.allowPlus || opts.allowMinus ? "[" + (opts.allowPlus ? "\+" : "") + (opts.allowMinus ? "-" : "") + "]?" : ""; + return new RegExp("^" + signedExpression + "(\\d+|\\d{1," + opts.groupSize + "}((" + escapedGroupSeparator + "\\d{" + opts.groupSize + "})?)+)(" + escapedRadixPoint + "\\d" + digitExpression + ")?$"); + } + }, + onKeyDown: function (e, buffer, opts) { + var $input = $(this), input = this; + if (e.keyCode == opts.keyCode.TAB) { + var radixPosition = $.inArray(opts.radixPoint, buffer); + if (radixPosition != -1) { + var masksets = $input.data('_inputmask')['masksets']; + var activeMasksetIndex = $input.data('_inputmask')['activeMasksetIndex']; + for (var i = 1; i <= opts.digits && i < opts.getMaskLength(masksets[activeMasksetIndex]["_buffer"], masksets[activeMasksetIndex]["greedy"], masksets[activeMasksetIndex]["repeat"], buffer, opts) ; i++) { + if (buffer[radixPosition + i] == undefined || buffer[radixPosition + i] == "") buffer[radixPosition + i] = "0"; + } + input._valueSet(buffer.join('')); + } + } else if (e.keyCode == opts.keyCode.DELETE || e.keyCode == opts.keyCode.BACKSPACE) { + opts.postFormat(buffer, 0, true, opts); + input._valueSet(buffer.join('')); + return true; + } + }, + definitions: { + '~': { //real number + validator: function (chrs, buffer, pos, strict, opts) { + if (chrs == "") return false; + if (!strict && pos <= 1 && buffer[0] === '0' && new RegExp("[\\d-]").test(chrs) && buffer.join('').length == 1) { //handle first char + buffer[0] = ""; + return { "pos": 0 }; + } + + var cbuf = strict ? buffer.slice(0, pos) : buffer.slice(); + + cbuf.splice(pos, 0, chrs); + var bufferStr = cbuf.join(''); + + //strip groupseparator + var escapedGroupSeparator = $.inputmask.escapeRegex.call(this, opts.groupSeparator); + bufferStr = bufferStr.replace(new RegExp(escapedGroupSeparator, "g"), ''); + + var isValid = opts.regex.number(opts).test(bufferStr); + if (!isValid) { + //let's help the regex a bit + bufferStr += "0"; + isValid = opts.regex.number(opts).test(bufferStr); + if (!isValid) { + //make a valid group + var lastGroupSeparator = bufferStr.lastIndexOf(opts.groupSeparator); + for (var i = bufferStr.length - lastGroupSeparator; i <= 3; i++) { + bufferStr += "0"; + } + + isValid = opts.regex.number(opts).test(bufferStr); + if (!isValid && !strict) { + if (chrs == opts.radixPoint) { + isValid = opts.regex.number(opts).test("0" + bufferStr + "0"); + if (isValid) { + buffer[pos] = "0"; + pos++; + return { "pos": pos }; + } + } + } + } + } + + if (isValid != false && !strict && chrs != opts.radixPoint) { + var newPos = opts.postFormat(buffer, pos, false, opts); + return { "pos": newPos }; + } + + return isValid; + }, + cardinality: 1, + prevalidator: null + } + }, + insertMode: true, + autoUnmask: false + }, + 'integer': { + regex: { + number: function (opts) { + var escapedGroupSeparator = $.inputmask.escapeRegex.call(this, opts.groupSeparator); + var signedExpression = opts.allowPlus || opts.allowMinus ? "[" + (opts.allowPlus ? "\+" : "") + (opts.allowMinus ? "-" : "") + "]?" : ""; + return new RegExp("^" + signedExpression + "(\\d+|\\d{1," + opts.groupSize + "}((" + escapedGroupSeparator + "\\d{" + opts.groupSize + "})?)+)$"); + } + }, + alias: "decimal" + } + }); +})(jQuery); diff --git a/theme/bootstrap/plugins/input-mask/jquery.inputmask.phone.extensions.js b/theme/bootstrap/plugins/input-mask/jquery.inputmask.phone.extensions.js new file mode 100644 index 0000000..554d4ef --- /dev/null +++ b/theme/bootstrap/plugins/input-mask/jquery.inputmask.phone.extensions.js @@ -0,0 +1,50 @@ +/* +Input Mask plugin extensions +http://github.com/RobinHerbots/jquery.inputmask +Copyright (c) 2010 - 2014 Robin Herbots +Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) +Version: 0.0.0 + +Phone extension. +When using this extension make sure you specify the correct url to get the masks + + $(selector).inputmask("phone", { + url: "Scripts/jquery.inputmask/phone-codes/phone-codes.json", + onKeyValidation: function () { //show some metadata in the console + console.log($(this).inputmask("getmetadata")["name_en"]); + } + }); + + +*/ +(function ($) { + $.extend($.inputmask.defaults.aliases, { + 'phone': { + url: "phone-codes/phone-codes.json", + mask: function (opts) { + opts.definitions = { + 'p': { + validator: function () { return false; }, + cardinality: 1 + }, + '#': { + validator: "[0-9]", + cardinality: 1 + } + }; + var maskList = []; + $.ajax({ + url: opts.url, + async: false, + dataType: 'json', + success: function (response) { + maskList = response; + } + }); + + maskList.splice(0, 0, "+p(ppp)ppp-pppp"); + return maskList; + } + } + }); +})(jQuery); diff --git a/theme/bootstrap/plugins/input-mask/jquery.inputmask.regex.extensions.js b/theme/bootstrap/plugins/input-mask/jquery.inputmask.regex.extensions.js new file mode 100644 index 0000000..e956569 --- /dev/null +++ b/theme/bootstrap/plugins/input-mask/jquery.inputmask.regex.extensions.js @@ -0,0 +1,169 @@ +/* +Input Mask plugin extensions +http://github.com/RobinHerbots/jquery.inputmask +Copyright (c) 2010 - 2014 Robin Herbots +Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) +Version: 0.0.0 + +Regex extensions on the jquery.inputmask base +Allows for using regular expressions as a mask +*/ +(function ($) { + $.extend($.inputmask.defaults.aliases, { // $(selector).inputmask("Regex", { regex: "[0-9]*"} + 'Regex': { + mask: "r", + greedy: false, + repeat: "*", + regex: null, + regexTokens: null, + //Thx to https://github.com/slevithan/regex-colorizer for the tokenizer regex + tokenizer: /\[\^?]?(?:[^\\\]]+|\\[\S\s]?)*]?|\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9][0-9]*|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|c[A-Za-z]|[\S\s]?)|\((?:\?[:=!]?)?|(?:[?*+]|\{[0-9]+(?:,[0-9]*)?\})\??|[^.?*+^${[()|\\]+|./g, + quantifierFilter: /[0-9]+[^,]/, + definitions: { + 'r': { + validator: function (chrs, buffer, pos, strict, opts) { + function regexToken() { + this.matches = []; + this.isGroup = false; + this.isQuantifier = false; + this.isLiteral = false; + } + function analyseRegex() { + var currentToken = new regexToken(), match, m, opengroups = []; + + opts.regexTokens = []; + + // The tokenizer regex does most of the tokenization grunt work + while (match = opts.tokenizer.exec(opts.regex)) { + m = match[0]; + switch (m.charAt(0)) { + case "[": // Character class + case "\\": // Escape or backreference + if (opengroups.length > 0) { + opengroups[opengroups.length - 1]["matches"].push(m); + } else { + currentToken.matches.push(m); + } + break; + case "(": // Group opening + if (!currentToken.isGroup && currentToken.matches.length > 0) + opts.regexTokens.push(currentToken); + currentToken = new regexToken(); + currentToken.isGroup = true; + opengroups.push(currentToken); + break; + case ")": // Group closing + var groupToken = opengroups.pop(); + if (opengroups.length > 0) { + opengroups[opengroups.length - 1]["matches"].push(groupToken); + } else { + opts.regexTokens.push(groupToken); + currentToken = new regexToken(); + } + break; + case "{": //Quantifier + var quantifier = new regexToken(); + quantifier.isQuantifier = true; + quantifier.matches.push(m); + if (opengroups.length > 0) { + opengroups[opengroups.length - 1]["matches"].push(quantifier); + } else { + currentToken.matches.push(quantifier); + } + break; + default: + // Vertical bar (alternator) + // ^ or $ anchor + // Dot (.) + // Literal character sequence + var literal = new regexToken(); + literal.isLiteral = true; + literal.matches.push(m); + if (opengroups.length > 0) { + opengroups[opengroups.length - 1]["matches"].push(literal); + } else { + currentToken.matches.push(literal); + } + } + } + + if (currentToken.matches.length > 0) + opts.regexTokens.push(currentToken); + } + function validateRegexToken(token, fromGroup) { + var isvalid = false; + if (fromGroup) { + regexPart += "("; + openGroupCount++; + } + for (var mndx = 0; mndx < token["matches"].length; mndx++) { + var matchToken = token["matches"][mndx]; + if (matchToken["isGroup"] == true) { + isvalid = validateRegexToken(matchToken, true); + } else if (matchToken["isQuantifier"] == true) { + matchToken = matchToken["matches"][0]; + var quantifierMax = opts.quantifierFilter.exec(matchToken)[0].replace("}", ""); + var testExp = regexPart + "{1," + quantifierMax + "}"; //relax quantifier validation + for (var j = 0; j < openGroupCount; j++) { + testExp += ")"; + } + var exp = new RegExp("^(" + testExp + ")$"); + isvalid = exp.test(bufferStr); + regexPart += matchToken; + } else if (matchToken["isLiteral"] == true) { + matchToken = matchToken["matches"][0]; + var testExp = regexPart, openGroupCloser = ""; + for (var j = 0; j < openGroupCount; j++) { + openGroupCloser += ")"; + } + for (var k = 0; k < matchToken.length; k++) { //relax literal validation + testExp = (testExp + matchToken[k]).replace(/\|$/, ""); + var exp = new RegExp("^(" + testExp + openGroupCloser + ")$"); + isvalid = exp.test(bufferStr); + if (isvalid) break; + } + regexPart += matchToken; + //console.log(bufferStr + " " + exp + " " + isvalid); + } else { + regexPart += matchToken; + var testExp = regexPart.replace(/\|$/, ""); + for (var j = 0; j < openGroupCount; j++) { + testExp += ")"; + } + var exp = new RegExp("^(" + testExp + ")$"); + isvalid = exp.test(bufferStr); + //console.log(bufferStr + " " + exp + " " + isvalid); + } + if (isvalid) break; + } + + if (fromGroup) { + regexPart += ")"; + openGroupCount--; + } + + return isvalid; + } + + + if (opts.regexTokens == null) { + analyseRegex(); + } + + var cbuffer = buffer.slice(), regexPart = "", isValid = false, openGroupCount = 0; + cbuffer.splice(pos, 0, chrs); + var bufferStr = cbuffer.join(''); + for (var i = 0; i < opts.regexTokens.length; i++) { + var regexToken = opts.regexTokens[i]; + isValid = validateRegexToken(regexToken, regexToken["isGroup"]); + if (isValid) break; + } + + return isValid; + }, + cardinality: 1 + } + } + } + }); +})(jQuery); diff --git a/theme/bootstrap/plugins/input-mask/phone-codes/phone-be.json b/theme/bootstrap/plugins/input-mask/phone-codes/phone-be.json new file mode 100644 index 0000000..b510b78 --- /dev/null +++ b/theme/bootstrap/plugins/input-mask/phone-codes/phone-be.json @@ -0,0 +1,45 @@ +[ + { "mask": "+32(53)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Aalst (Alost)" }, + { "mask": "+32(3)###-##-##", "cc": "BE", "cd": "Belgium", "city": "Antwerpen (Anvers)" }, + { "mask": "+32(63)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Arlon" }, + { "mask": "+32(67)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Ath" }, + { "mask": "+32(50)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Brugge (Bruges)" }, + { "mask": "+32(2)###-##-##", "cc": "BE", "cd": "Belgium", "city": "Brussel/Bruxelles (Brussels)" }, + { "mask": "+32(71)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Charleroi" }, + { "mask": "+32(60)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Chimay" }, + { "mask": "+32(83)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Ciney" }, + { "mask": "+32(52)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Dendermonde" }, + { "mask": "+32(13)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Diest" }, + { "mask": "+32(82)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Dinant" }, + { "mask": "+32(86)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Durbuy" }, + { "mask": "+32(89)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Genk" }, + { "mask": "+32(9)###-##-##", "cc": "BE", "cd": "Belgium", "city": "Gent (Gand)" }, + { "mask": "+32(11)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Hasselt" }, + { "mask": "+32(14)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Herentals" }, + { "mask": "+32(85)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Huy (Hoei)" }, + { "mask": "+32(64)##-##-##", "cc": "BE", "cd": "Belgium", "city": "La Louvière" }, + { "mask": "+32(16)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Leuven (Louvain)" }, + { "mask": "+32(61)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Libramont" }, + { "mask": "+32(4)###-##-##", "cc": "BE", "cd": "Belgium", "city": "Liège (Luik)" }, + { "mask": "+32(15)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Mechelen (Malines)" }, + { "mask": "+32(47#)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Mobile Phones" }, + { "mask": "+32(48#)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Mobile Phones" }, + { "mask": "+32(49#)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Mobile Phones" }, + { "mask": "+32(65)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Mons (Bergen)" }, + { "mask": "+32(81)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Namur (Namen)" }, + { "mask": "+32(58)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Nieuwpoort (Nieuport)" }, + { "mask": "+32(54)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Ninove" }, + { "mask": "+32(67)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Nivelles (Nijvel)" }, + { "mask": "+32(59)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Oostende (Ostende)" }, + { "mask": "+32(51)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Roeselare (Roulers)" }, + { "mask": "+32(55)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Ronse" }, + { "mask": "+32(80)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Stavelot" }, + { "mask": "+32(12)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Tongeren (Tongres)" }, + { "mask": "+32(69)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Tounai" }, + { "mask": "+32(14)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Turnhout" }, + { "mask": "+32(87)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Verviers" }, + { "mask": "+32(58)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Veurne" }, + { "mask": "+32(19)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Wareme" }, + { "mask": "+32(10)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Wavre (Waver)" }, + { "mask": "+32(50)##-##-##", "cc": "BE", "cd": "Belgium", "city": "Zeebrugge" } +] \ No newline at end of file diff --git a/theme/bootstrap/plugins/input-mask/phone-codes/phone-codes.json b/theme/bootstrap/plugins/input-mask/phone-codes/phone-codes.json new file mode 100644 index 0000000..15bbd3a --- /dev/null +++ b/theme/bootstrap/plugins/input-mask/phone-codes/phone-codes.json @@ -0,0 +1,294 @@ +[ + { "mask": "+247-####", "cc": "AC", "name_en": "Ascension", "desc_en": "", "name_ru": "Остров Вознесения", "desc_ru": "" }, + { "mask": "+376-###-###", "cc": "AD", "name_en": "Andorra", "desc_en": "", "name_ru": "Андорра", "desc_ru": "" }, + { "mask": "+971-5#-###-####", "cc": "AE", "name_en": "United Arab Emirates", "desc_en": "mobile", "name_ru": "Объединенные Арабские Эмираты", "desc_ru": "мобильные" }, + { "mask": "+971-#-###-####", "cc": "AE", "name_en": "United Arab Emirates", "desc_en": "", "name_ru": "Объединенные Арабские Эмираты", "desc_ru": "" }, + { "mask": "+93-##-###-####", "cc": "AF", "name_en": "Afghanistan", "desc_en": "", "name_ru": "Афганистан", "desc_ru": "" }, + { "mask": "+1(268)###-####", "cc": "AG", "name_en": "Antigua & Barbuda", "desc_en": "", "name_ru": "Антигуа и Барбуда", "desc_ru": "" }, + { "mask": "+1(264)###-####", "cc": "AI", "name_en": "Anguilla", "desc_en": "", "name_ru": "Ангилья", "desc_ru": "" }, + { "mask": "+355(###)###-###", "cc": "AL", "name_en": "Albania", "desc_en": "", "name_ru": "Албания", "desc_ru": "" }, + { "mask": "+374-##-###-###", "cc": "AM", "name_en": "Armenia", "desc_en": "", "name_ru": "Армения", "desc_ru": "" }, + { "mask": "+599-###-####", "cc": "AN", "name_en": "Caribbean Netherlands", "desc_en": "", "name_ru": "Карибские Нидерланды", "desc_ru": "" }, + { "mask": "+599-###-####", "cc": "AN", "name_en": "Netherlands Antilles", "desc_en": "", "name_ru": "Нидерландские Антильские острова", "desc_ru": "" }, + { "mask": "+599-9###-####", "cc": "AN", "name_en": "Netherlands Antilles", "desc_en": "Curacao", "name_ru": "Нидерландские Антильские острова", "desc_ru": "Кюрасао" }, + { "mask": "+244(###)###-###", "cc": "AO", "name_en": "Angola", "desc_en": "", "name_ru": "Ангола", "desc_ru": "" }, + { "mask": "+672-1##-###", "cc": "AQ", "name_en": "Australian bases in Antarctica", "desc_en": "", "name_ru": "Австралийская антарктическая база", "desc_ru": "" }, + { "mask": "+54(###)###-####", "cc": "AR", "name_en": "Argentina", "desc_en": "", "name_ru": "Аргентина", "desc_ru": "" }, + { "mask": "+1(684)###-####", "cc": "AS", "name_en": "American Samoa", "desc_en": "", "name_ru": "Американское Самоа", "desc_ru": "" }, + { "mask": "+43(###)###-####", "cc": "AT", "name_en": "Austria", "desc_en": "", "name_ru": "Австрия", "desc_ru": "" }, + { "mask": "+61-#-####-####", "cc": "AU", "name_en": "Australia", "desc_en": "", "name_ru": "Австралия", "desc_ru": "" }, + { "mask": "+297-###-####", "cc": "AW", "name_en": "Aruba", "desc_en": "", "name_ru": "Аруба", "desc_ru": "" }, + { "mask": "+994-##-###-##-##", "cc": "AZ", "name_en": "Azerbaijan", "desc_en": "", "name_ru": "Азербайджан", "desc_ru": "" }, + { "mask": "+387-##-#####", "cc": "BA", "name_en": "Bosnia and Herzegovina", "desc_en": "", "name_ru": "Босния и Герцеговина", "desc_ru": "" }, + { "mask": "+387-##-####", "cc": "BA", "name_en": "Bosnia and Herzegovina", "desc_en": "", "name_ru": "Босния и Герцеговина", "desc_ru": "" }, + { "mask": "+1(246)###-####", "cc": "BB", "name_en": "Barbados", "desc_en": "", "name_ru": "Барбадос", "desc_ru": "" }, + { "mask": "+880-##-###-###", "cc": "BD", "name_en": "Bangladesh", "desc_en": "", "name_ru": "Бангладеш", "desc_ru": "" }, + { "mask": "+32(###)###-###", "cc": "BE", "name_en": "Belgium", "desc_en": "", "name_ru": "Бельгия", "desc_ru": "" }, + { "mask": "+226-##-##-####", "cc": "BF", "name_en": "Burkina Faso", "desc_en": "", "name_ru": "Буркина Фасо", "desc_ru": "" }, + { "mask": "+359(###)###-###", "cc": "BG", "name_en": "Bulgaria", "desc_en": "", "name_ru": "Болгария", "desc_ru": "" }, + { "mask": "+973-####-####", "cc": "BH", "name_en": "Bahrain", "desc_en": "", "name_ru": "Бахрейн", "desc_ru": "" }, + { "mask": "+257-##-##-####", "cc": "BI", "name_en": "Burundi", "desc_en": "", "name_ru": "Бурунди", "desc_ru": "" }, + { "mask": "+229-##-##-####", "cc": "BJ", "name_en": "Benin", "desc_en": "", "name_ru": "Бенин", "desc_ru": "" }, + { "mask": "+1(441)###-####", "cc": "BM", "name_en": "Bermuda", "desc_en": "", "name_ru": "Бермудские острова", "desc_ru": "" }, + { "mask": "+673-###-####", "cc": "BN", "name_en": "Brunei Darussalam", "desc_en": "", "name_ru": "Бруней-Даруссалам", "desc_ru": "" }, + { "mask": "+591-#-###-####", "cc": "BO", "name_en": "Bolivia", "desc_en": "", "name_ru": "Боливия", "desc_ru": "" }, + { "mask": "+55-##-####[#]-####", "cc": "BR", "name_en": "Brazil", "desc_en": "", "name_ru": "Бразилия", "desc_ru": "" }, + { "mask": "+1(242)###-####", "cc": "BS", "name_en": "Bahamas", "desc_en": "", "name_ru": "Багамские Острова", "desc_ru": "" }, + { "mask": "+975-17-###-###", "cc": "BT", "name_en": "Bhutan", "desc_en": "", "name_ru": "Бутан", "desc_ru": "" }, + { "mask": "+975-#-###-###", "cc": "BT", "name_en": "Bhutan", "desc_en": "", "name_ru": "Бутан", "desc_ru": "" }, + { "mask": "+267-##-###-###", "cc": "BW", "name_en": "Botswana", "desc_en": "", "name_ru": "Ботсвана", "desc_ru": "" }, + { "mask": "+375(##)###-##-##", "cc": "BY", "name_en": "Belarus", "desc_en": "", "name_ru": "Беларусь (Белоруссия)", "desc_ru": "" }, + { "mask": "+501-###-####", "cc": "BZ", "name_en": "Belize", "desc_en": "", "name_ru": "Белиз", "desc_ru": "" }, + { "mask": "+243(###)###-###", "cc": "CD", "name_en": "Dem. Rep. Congo", "desc_en": "", "name_ru": "Дем. Респ. Конго (Киншаса)", "desc_ru": "" }, + { "mask": "+236-##-##-####", "cc": "CF", "name_en": "Central African Republic", "desc_en": "", "name_ru": "Центральноафриканская Республика", "desc_ru": "" }, + { "mask": "+242-##-###-####", "cc": "CG", "name_en": "Congo (Brazzaville)", "desc_en": "", "name_ru": "Конго (Браззавиль)", "desc_ru": "" }, + { "mask": "+41-##-###-####", "cc": "CH", "name_en": "Switzerland", "desc_en": "", "name_ru": "Швейцария", "desc_ru": "" }, + { "mask": "+225-##-###-###", "cc": "CI", "name_en": "Cote d’Ivoire (Ivory Coast)", "desc_en": "", "name_ru": "Кот-д’Ивуар", "desc_ru": "" }, + { "mask": "+682-##-###", "cc": "CK", "name_en": "Cook Islands", "desc_en": "", "name_ru": "Острова Кука", "desc_ru": "" }, + { "mask": "+56-#-####-####", "cc": "CL", "name_en": "Chile", "desc_en": "", "name_ru": "Чили", "desc_ru": "" }, + { "mask": "+237-####-####", "cc": "CM", "name_en": "Cameroon", "desc_en": "", "name_ru": "Камерун", "desc_ru": "" }, + { "mask": "+86(###)####-####", "cc": "CN", "name_en": "China (PRC)", "desc_en": "", "name_ru": "Китайская Н.Р.", "desc_ru": "" }, + { "mask": "+86(###)####-###", "cc": "CN", "name_en": "China (PRC)", "desc_en": "", "name_ru": "Китайская Н.Р.", "desc_ru": "" }, + { "mask": "+86-##-#####-#####", "cc": "CN", "name_en": "China (PRC)", "desc_en": "", "name_ru": "Китайская Н.Р.", "desc_ru": "" }, + { "mask": "+57(###)###-####", "cc": "CO", "name_en": "Colombia", "desc_en": "", "name_ru": "Колумбия", "desc_ru": "" }, + { "mask": "+506-####-####", "cc": "CR", "name_en": "Costa Rica", "desc_en": "", "name_ru": "Коста-Рика", "desc_ru": "" }, + { "mask": "+53-#-###-####", "cc": "CU", "name_en": "Cuba", "desc_en": "", "name_ru": "Куба", "desc_ru": "" }, + { "mask": "+238(###)##-##", "cc": "CV", "name_en": "Cape Verde", "desc_en": "", "name_ru": "Кабо-Верде", "desc_ru": "" }, + { "mask": "+599-###-####", "cc": "CW", "name_en": "Curacao", "desc_en": "", "name_ru": "Кюрасао", "desc_ru": "" }, + { "mask": "+357-##-###-###", "cc": "CY", "name_en": "Cyprus", "desc_en": "", "name_ru": "Кипр", "desc_ru": "" }, + { "mask": "+420(###)###-###", "cc": "CZ", "name_en": "Czech Republic", "desc_en": "", "name_ru": "Чехия", "desc_ru": "" }, + { "mask": "+49(####)###-####", "cc": "DE", "name_en": "Germany", "desc_en": "", "name_ru": "Германия", "desc_ru": "" }, + { "mask": "+49(###)###-####", "cc": "DE", "name_en": "Germany", "desc_en": "", "name_ru": "Германия", "desc_ru": "" }, + { "mask": "+49(###)##-####", "cc": "DE", "name_en": "Germany", "desc_en": "", "name_ru": "Германия", "desc_ru": "" }, + { "mask": "+49(###)##-###", "cc": "DE", "name_en": "Germany", "desc_en": "", "name_ru": "Германия", "desc_ru": "" }, + { "mask": "+49(###)##-##", "cc": "DE", "name_en": "Germany", "desc_en": "", "name_ru": "Германия", "desc_ru": "" }, + { "mask": "+49-###-###", "cc": "DE", "name_en": "Germany", "desc_en": "", "name_ru": "Германия", "desc_ru": "" }, + { "mask": "+253-##-##-##-##", "cc": "DJ", "name_en": "Djibouti", "desc_en": "", "name_ru": "Джибути", "desc_ru": "" }, + { "mask": "+45-##-##-##-##", "cc": "DK", "name_en": "Denmark", "desc_en": "", "name_ru": "Дания", "desc_ru": "" }, + { "mask": "+1(767)###-####", "cc": "DM", "name_en": "Dominica", "desc_en": "", "name_ru": "Доминика", "desc_ru": "" }, + { "mask": "+1(809)###-####", "cc": "DO", "name_en": "Dominican Republic", "desc_en": "", "name_ru": "Доминиканская Республика", "desc_ru": "" }, + { "mask": "+1(829)###-####", "cc": "DO", "name_en": "Dominican Republic", "desc_en": "", "name_ru": "Доминиканская Республика", "desc_ru": "" }, + { "mask": "+1(849)###-####", "cc": "DO", "name_en": "Dominican Republic", "desc_en": "", "name_ru": "Доминиканская Республика", "desc_ru": "" }, + { "mask": "+213-##-###-####", "cc": "DZ", "name_en": "Algeria", "desc_en": "", "name_ru": "Алжир", "desc_ru": "" }, + { "mask": "+593-##-###-####", "cc": "EC", "name_en": "Ecuador ", "desc_en": "mobile", "name_ru": "Эквадор ", "desc_ru": "мобильные" }, + { "mask": "+593-#-###-####", "cc": "EC", "name_en": "Ecuador", "desc_en": "", "name_ru": "Эквадор", "desc_ru": "" }, + { "mask": "+372-####-####", "cc": "EE", "name_en": "Estonia ", "desc_en": "mobile", "name_ru": "Эстония ", "desc_ru": "мобильные" }, + { "mask": "+372-###-####", "cc": "EE", "name_en": "Estonia", "desc_en": "", "name_ru": "Эстония", "desc_ru": "" }, + { "mask": "+20(###)###-####", "cc": "EG", "name_en": "Egypt", "desc_en": "", "name_ru": "Египет", "desc_ru": "" }, + { "mask": "+291-#-###-###", "cc": "ER", "name_en": "Eritrea", "desc_en": "", "name_ru": "Эритрея", "desc_ru": "" }, + { "mask": "+34(###)###-###", "cc": "ES", "name_en": "Spain", "desc_en": "", "name_ru": "Испания", "desc_ru": "" }, + { "mask": "+251-##-###-####", "cc": "ET", "name_en": "Ethiopia", "desc_en": "", "name_ru": "Эфиопия", "desc_ru": "" }, + { "mask": "+358(###)###-##-##", "cc": "FI", "name_en": "Finland", "desc_en": "", "name_ru": "Финляндия", "desc_ru": "" }, + { "mask": "+679-##-#####", "cc": "FJ", "name_en": "Fiji", "desc_en": "", "name_ru": "Фиджи", "desc_ru": "" }, + { "mask": "+500-#####", "cc": "FK", "name_en": "Falkland Islands", "desc_en": "", "name_ru": "Фолклендские острова", "desc_ru": "" }, + { "mask": "+691-###-####", "cc": "FM", "name_en": "F.S. Micronesia", "desc_en": "", "name_ru": "Ф.Ш. Микронезии", "desc_ru": "" }, + { "mask": "+298-###-###", "cc": "FO", "name_en": "Faroe Islands", "desc_en": "", "name_ru": "Фарерские острова", "desc_ru": "" }, + { "mask": "+262-#####-####", "cc": "FR", "name_en": "Mayotte", "desc_en": "", "name_ru": "Майотта", "desc_ru": "" }, + { "mask": "+33(###)###-###", "cc": "FR", "name_en": "France", "desc_en": "", "name_ru": "Франция", "desc_ru": "" }, + { "mask": "+508-##-####", "cc": "FR", "name_en": "St Pierre & Miquelon", "desc_en": "", "name_ru": "Сен-Пьер и Микелон", "desc_ru": "" }, + { "mask": "+590(###)###-###", "cc": "FR", "name_en": "Guadeloupe", "desc_en": "", "name_ru": "Гваделупа", "desc_ru": "" }, + { "mask": "+241-#-##-##-##", "cc": "GA", "name_en": "Gabon", "desc_en": "", "name_ru": "Габон", "desc_ru": "" }, + { "mask": "+1(473)###-####", "cc": "GD", "name_en": "Grenada", "desc_en": "", "name_ru": "Гренада", "desc_ru": "" }, + { "mask": "+995(###)###-###", "cc": "GE", "name_en": "Rep. of Georgia", "desc_en": "", "name_ru": "Грузия", "desc_ru": "" }, + { "mask": "+594-#####-####", "cc": "GF", "name_en": "Guiana (French)", "desc_en": "", "name_ru": "Фр. Гвиана", "desc_ru": "" }, + { "mask": "+233(###)###-###", "cc": "GH", "name_en": "Ghana", "desc_en": "", "name_ru": "Гана", "desc_ru": "" }, + { "mask": "+350-###-#####", "cc": "GI", "name_en": "Gibraltar", "desc_en": "", "name_ru": "Гибралтар", "desc_ru": "" }, + { "mask": "+299-##-##-##", "cc": "GL", "name_en": "Greenland", "desc_en": "", "name_ru": "Гренландия", "desc_ru": "" }, + { "mask": "+220(###)##-##", "cc": "GM", "name_en": "Gambia", "desc_en": "", "name_ru": "Гамбия", "desc_ru": "" }, + { "mask": "+224-##-###-###", "cc": "GN", "name_en": "Guinea", "desc_en": "", "name_ru": "Гвинея", "desc_ru": "" }, + { "mask": "+240-##-###-####", "cc": "GQ", "name_en": "Equatorial Guinea", "desc_en": "", "name_ru": "Экваториальная Гвинея", "desc_ru": "" }, + { "mask": "+30(###)###-####", "cc": "GR", "name_en": "Greece", "desc_en": "", "name_ru": "Греция", "desc_ru": "" }, + { "mask": "+502-#-###-####", "cc": "GT", "name_en": "Guatemala", "desc_en": "", "name_ru": "Гватемала", "desc_ru": "" }, + { "mask": "+1(671)###-####", "cc": "GU", "name_en": "Guam", "desc_en": "", "name_ru": "Гуам", "desc_ru": "" }, + { "mask": "+245-#-######", "cc": "GW", "name_en": "Guinea-Bissau", "desc_en": "", "name_ru": "Гвинея-Бисау", "desc_ru": "" }, + { "mask": "+592-###-####", "cc": "GY", "name_en": "Guyana", "desc_en": "", "name_ru": "Гайана", "desc_ru": "" }, + { "mask": "+852-####-####", "cc": "HK", "name_en": "Hong Kong", "desc_en": "", "name_ru": "Гонконг", "desc_ru": "" }, + { "mask": "+504-####-####", "cc": "HN", "name_en": "Honduras", "desc_en": "", "name_ru": "Гондурас", "desc_ru": "" }, + { "mask": "+385-##-###-###", "cc": "HR", "name_en": "Croatia", "desc_en": "", "name_ru": "Хорватия", "desc_ru": "" }, + { "mask": "+509-##-##-####", "cc": "HT", "name_en": "Haiti", "desc_en": "", "name_ru": "Гаити", "desc_ru": "" }, + { "mask": "+36(###)###-###", "cc": "HU", "name_en": "Hungary", "desc_en": "", "name_ru": "Венгрия", "desc_ru": "" }, + { "mask": "+62(8##)###-####", "cc": "ID", "name_en": "Indonesia ", "desc_en": "mobile", "name_ru": "Индонезия ", "desc_ru": "мобильные" }, + { "mask": "+62-##-###-##", "cc": "ID", "name_en": "Indonesia", "desc_en": "", "name_ru": "Индонезия", "desc_ru": "" }, + { "mask": "+62-##-###-###", "cc": "ID", "name_en": "Indonesia", "desc_en": "", "name_ru": "Индонезия", "desc_ru": "" }, + { "mask": "+62-##-###-####", "cc": "ID", "name_en": "Indonesia", "desc_en": "", "name_ru": "Индонезия", "desc_ru": "" }, + { "mask": "+62(8##)###-###", "cc": "ID", "name_en": "Indonesia ", "desc_en": "mobile", "name_ru": "Индонезия ", "desc_ru": "мобильные" }, + { "mask": "+62(8##)###-##-###", "cc": "ID", "name_en": "Indonesia ", "desc_en": "mobile", "name_ru": "Индонезия ", "desc_ru": "мобильные" }, + { "mask": "+353(###)###-###", "cc": "IE", "name_en": "Ireland", "desc_en": "", "name_ru": "Ирландия", "desc_ru": "" }, + { "mask": "+972-5#-###-####", "cc": "IL", "name_en": "Israel ", "desc_en": "mobile", "name_ru": "Израиль ", "desc_ru": "мобильные" }, + { "mask": "+972-#-###-####", "cc": "IL", "name_en": "Israel", "desc_en": "", "name_ru": "Израиль", "desc_ru": "" }, + { "mask": "+91(####)###-###", "cc": "IN", "name_en": "India", "desc_en": "", "name_ru": "Индия", "desc_ru": "" }, + { "mask": "+246-###-####", "cc": "IO", "name_en": "Diego Garcia", "desc_en": "", "name_ru": "Диего-Гарсия", "desc_ru": "" }, + { "mask": "+964(###)###-####", "cc": "IQ", "name_en": "Iraq", "desc_en": "", "name_ru": "Ирак", "desc_ru": "" }, + { "mask": "+98(###)###-####", "cc": "IR", "name_en": "Iran", "desc_en": "", "name_ru": "Иран", "desc_ru": "" }, + { "mask": "+354-###-####", "cc": "IS", "name_en": "Iceland", "desc_en": "", "name_ru": "Исландия", "desc_ru": "" }, + { "mask": "+39(###)####-###", "cc": "IT", "name_en": "Italy", "desc_en": "", "name_ru": "Италия", "desc_ru": "" }, + { "mask": "+1(876)###-####", "cc": "JM", "name_en": "Jamaica", "desc_en": "", "name_ru": "Ямайка", "desc_ru": "" }, + { "mask": "+962-#-####-####", "cc": "JO", "name_en": "Jordan", "desc_en": "", "name_ru": "Иордания", "desc_ru": "" }, + { "mask": "+81-##-####-####", "cc": "JP", "name_en": "Japan ", "desc_en": "mobile", "name_ru": "Япония ", "desc_ru": "мобильные" }, + { "mask": "+81(###)###-###", "cc": "JP", "name_en": "Japan", "desc_en": "", "name_ru": "Япония", "desc_ru": "" }, + { "mask": "+254-###-######", "cc": "KE", "name_en": "Kenya", "desc_en": "", "name_ru": "Кения", "desc_ru": "" }, + { "mask": "+996(###)###-###", "cc": "KG", "name_en": "Kyrgyzstan", "desc_en": "", "name_ru": "Киргизия", "desc_ru": "" }, + { "mask": "+855-##-###-###", "cc": "KH", "name_en": "Cambodia", "desc_en": "", "name_ru": "Камбоджа", "desc_ru": "" }, + { "mask": "+686-##-###", "cc": "KI", "name_en": "Kiribati", "desc_en": "", "name_ru": "Кирибати", "desc_ru": "" }, + { "mask": "+269-##-#####", "cc": "KM", "name_en": "Comoros", "desc_en": "", "name_ru": "Коморы", "desc_ru": "" }, + { "mask": "+1(869)###-####", "cc": "KN", "name_en": "Saint Kitts & Nevis", "desc_en": "", "name_ru": "Сент-Китс и Невис", "desc_ru": "" }, + { "mask": "+850-191-###-####", "cc": "KP", "name_en": "DPR Korea (North) ", "desc_en": "mobile", "name_ru": "Корейская НДР ", "desc_ru": "мобильные" }, + { "mask": "+850-##-###-###", "cc": "KP", "name_en": "DPR Korea (North)", "desc_en": "", "name_ru": "Корейская НДР", "desc_ru": "" }, + { "mask": "+850-###-####-###", "cc": "KP", "name_en": "DPR Korea (North)", "desc_en": "", "name_ru": "Корейская НДР", "desc_ru": "" }, + { "mask": "+850-###-###", "cc": "KP", "name_en": "DPR Korea (North)", "desc_en": "", "name_ru": "Корейская НДР", "desc_ru": "" }, + { "mask": "+850-####-####", "cc": "KP", "name_en": "DPR Korea (North)", "desc_en": "", "name_ru": "Корейская НДР", "desc_ru": "" }, + { "mask": "+850-####-#############", "cc": "KP", "name_en": "DPR Korea (North)", "desc_en": "", "name_ru": "Корейская НДР", "desc_ru": "" }, + { "mask": "+82-##-###-####", "cc": "KR", "name_en": "Korea (South)", "desc_en": "", "name_ru": "Респ. Корея", "desc_ru": "" }, + { "mask": "+965-####-####", "cc": "KW", "name_en": "Kuwait", "desc_en": "", "name_ru": "Кувейт", "desc_ru": "" }, + { "mask": "+1(345)###-####", "cc": "KY", "name_en": "Cayman Islands", "desc_en": "", "name_ru": "Каймановы острова", "desc_ru": "" }, + { "mask": "+7(6##)###-##-##", "cc": "KZ", "name_en": "Kazakhstan", "desc_en": "", "name_ru": "Казахстан", "desc_ru": "" }, + { "mask": "+7(7##)###-##-##", "cc": "KZ", "name_en": "Kazakhstan", "desc_en": "", "name_ru": "Казахстан", "desc_ru": "" }, + { "mask": "+856(20##)###-###", "cc": "LA", "name_en": "Laos ", "desc_en": "mobile", "name_ru": "Лаос ", "desc_ru": "мобильные" }, + { "mask": "+856-##-###-###", "cc": "LA", "name_en": "Laos", "desc_en": "", "name_ru": "Лаос", "desc_ru": "" }, + { "mask": "+961-##-###-###", "cc": "LB", "name_en": "Lebanon ", "desc_en": "mobile", "name_ru": "Ливан ", "desc_ru": "мобильные" }, + { "mask": "+961-#-###-###", "cc": "LB", "name_en": "Lebanon", "desc_en": "", "name_ru": "Ливан", "desc_ru": "" }, + { "mask": "+1(758)###-####", "cc": "LC", "name_en": "Saint Lucia", "desc_en": "", "name_ru": "Сент-Люсия", "desc_ru": "" }, + { "mask": "+423(###)###-####", "cc": "LI", "name_en": "Liechtenstein", "desc_en": "", "name_ru": "Лихтенштейн", "desc_ru": "" }, + { "mask": "+94-##-###-####", "cc": "LK", "name_en": "Sri Lanka", "desc_en": "", "name_ru": "Шри-Ланка", "desc_ru": "" }, + { "mask": "+231-##-###-###", "cc": "LR", "name_en": "Liberia", "desc_en": "", "name_ru": "Либерия", "desc_ru": "" }, + { "mask": "+266-#-###-####", "cc": "LS", "name_en": "Lesotho", "desc_en": "", "name_ru": "Лесото", "desc_ru": "" }, + { "mask": "+370(###)##-###", "cc": "LT", "name_en": "Lithuania", "desc_en": "", "name_ru": "Литва", "desc_ru": "" }, + { "mask": "+352(###)###-###", "cc": "LU", "name_en": "Luxembourg", "desc_en": "", "name_ru": "Люксембург", "desc_ru": "" }, + { "mask": "+371-##-###-###", "cc": "LV", "name_en": "Latvia", "desc_en": "", "name_ru": "Латвия", "desc_ru": "" }, + { "mask": "+218-##-###-###", "cc": "LY", "name_en": "Libya", "desc_en": "", "name_ru": "Ливия", "desc_ru": "" }, + { "mask": "+218-21-###-####", "cc": "LY", "name_en": "Libya", "desc_en": "Tripoli", "name_ru": "Ливия", "desc_ru": "Триполи" }, + { "mask": "+212-##-####-###", "cc": "MA", "name_en": "Morocco", "desc_en": "", "name_ru": "Марокко", "desc_ru": "" }, + { "mask": "+377(###)###-###", "cc": "MC", "name_en": "Monaco", "desc_en": "", "name_ru": "Монако", "desc_ru": "" }, + { "mask": "+377-##-###-###", "cc": "MC", "name_en": "Monaco", "desc_en": "", "name_ru": "Монако", "desc_ru": "" }, + { "mask": "+373-####-####", "cc": "MD", "name_en": "Moldova", "desc_en": "", "name_ru": "Молдова", "desc_ru": "" }, + { "mask": "+382-##-###-###", "cc": "ME", "name_en": "Montenegro", "desc_en": "", "name_ru": "Черногория", "desc_ru": "" }, + { "mask": "+261-##-##-#####", "cc": "MG", "name_en": "Madagascar", "desc_en": "", "name_ru": "Мадагаскар", "desc_ru": "" }, + { "mask": "+692-###-####", "cc": "MH", "name_en": "Marshall Islands", "desc_en": "", "name_ru": "Маршалловы Острова", "desc_ru": "" }, + { "mask": "+389-##-###-###", "cc": "MK", "name_en": "Republic of Macedonia", "desc_en": "", "name_ru": "Респ. Македония", "desc_ru": "" }, + { "mask": "+223-##-##-####", "cc": "ML", "name_en": "Mali", "desc_en": "", "name_ru": "Мали", "desc_ru": "" }, + { "mask": "+95-##-###-###", "cc": "MM", "name_en": "Burma (Myanmar)", "desc_en": "", "name_ru": "Бирма (Мьянма)", "desc_ru": "" }, + { "mask": "+95-#-###-###", "cc": "MM", "name_en": "Burma (Myanmar)", "desc_en": "", "name_ru": "Бирма (Мьянма)", "desc_ru": "" }, + { "mask": "+95-###-###", "cc": "MM", "name_en": "Burma (Myanmar)", "desc_en": "", "name_ru": "Бирма (Мьянма)", "desc_ru": "" }, + { "mask": "+976-##-##-####", "cc": "MN", "name_en": "Mongolia", "desc_en": "", "name_ru": "Монголия", "desc_ru": "" }, + { "mask": "+853-####-####", "cc": "MO", "name_en": "Macau", "desc_en": "", "name_ru": "Макао", "desc_ru": "" }, + { "mask": "+1(670)###-####", "cc": "MP", "name_en": "Northern Mariana Islands", "desc_en": "", "name_ru": "Северные Марианские острова Сайпан", "desc_ru": "" }, + { "mask": "+596(###)##-##-##", "cc": "MQ", "name_en": "Martinique", "desc_en": "", "name_ru": "Мартиника", "desc_ru": "" }, + { "mask": "+222-##-##-####", "cc": "MR", "name_en": "Mauritania", "desc_en": "", "name_ru": "Мавритания", "desc_ru": "" }, + { "mask": "+1(664)###-####", "cc": "MS", "name_en": "Montserrat", "desc_en": "", "name_ru": "Монтсеррат", "desc_ru": "" }, + { "mask": "+356-####-####", "cc": "MT", "name_en": "Malta", "desc_en": "", "name_ru": "Мальта", "desc_ru": "" }, + { "mask": "+230-###-####", "cc": "MU", "name_en": "Mauritius", "desc_en": "", "name_ru": "Маврикий", "desc_ru": "" }, + { "mask": "+960-###-####", "cc": "MV", "name_en": "Maldives", "desc_en": "", "name_ru": "Мальдивские острова", "desc_ru": "" }, + { "mask": "+265-1-###-###", "cc": "MW", "name_en": "Malawi", "desc_en": "Telecom Ltd", "name_ru": "Малави", "desc_ru": "Telecom Ltd" }, + { "mask": "+265-#-####-####", "cc": "MW", "name_en": "Malawi", "desc_en": "", "name_ru": "Малави", "desc_ru": "" }, + { "mask": "+52(###)###-####", "cc": "MX", "name_en": "Mexico", "desc_en": "", "name_ru": "Мексика", "desc_ru": "" }, + { "mask": "+52-##-##-####", "cc": "MX", "name_en": "Mexico", "desc_en": "", "name_ru": "Мексика", "desc_ru": "" }, + { "mask": "+60-##-###-####", "cc": "MY", "name_en": "Malaysia ", "desc_en": "mobile", "name_ru": "Малайзия ", "desc_ru": "мобильные" }, + { "mask": "+60(###)###-###", "cc": "MY", "name_en": "Malaysia", "desc_en": "", "name_ru": "Малайзия", "desc_ru": "" }, + { "mask": "+60-##-###-###", "cc": "MY", "name_en": "Malaysia", "desc_en": "", "name_ru": "Малайзия", "desc_ru": "" }, + { "mask": "+60-#-###-###", "cc": "MY", "name_en": "Malaysia", "desc_en": "", "name_ru": "Малайзия", "desc_ru": "" }, + { "mask": "+258-##-###-###", "cc": "MZ", "name_en": "Mozambique", "desc_en": "", "name_ru": "Мозамбик", "desc_ru": "" }, + { "mask": "+264-##-###-####", "cc": "NA", "name_en": "Namibia", "desc_en": "", "name_ru": "Намибия", "desc_ru": "" }, + { "mask": "+687-##-####", "cc": "NC", "name_en": "New Caledonia", "desc_en": "", "name_ru": "Новая Каледония", "desc_ru": "" }, + { "mask": "+227-##-##-####", "cc": "NE", "name_en": "Niger", "desc_en": "", "name_ru": "Нигер", "desc_ru": "" }, + { "mask": "+672-3##-###", "cc": "NF", "name_en": "Norfolk Island", "desc_en": "", "name_ru": "Норфолк (остров)", "desc_ru": "" }, + { "mask": "+234(###)###-####", "cc": "NG", "name_en": "Nigeria", "desc_en": "", "name_ru": "Нигерия", "desc_ru": "" }, + { "mask": "+234-##-###-###", "cc": "NG", "name_en": "Nigeria", "desc_en": "", "name_ru": "Нигерия", "desc_ru": "" }, + { "mask": "+234-##-###-##", "cc": "NG", "name_en": "Nigeria", "desc_en": "", "name_ru": "Нигерия", "desc_ru": "" }, + { "mask": "+234(###)###-####", "cc": "NG", "name_en": "Nigeria ", "desc_en": "mobile", "name_ru": "Нигерия ", "desc_ru": "мобильные" }, + { "mask": "+505-####-####", "cc": "NI", "name_en": "Nicaragua", "desc_en": "", "name_ru": "Никарагуа", "desc_ru": "" }, + { "mask": "+31-##-###-####", "cc": "NL", "name_en": "Netherlands", "desc_en": "", "name_ru": "Нидерланды", "desc_ru": "" }, + { "mask": "+47(###)##-###", "cc": "NO", "name_en": "Norway", "desc_en": "", "name_ru": "Норвегия", "desc_ru": "" }, + { "mask": "+977-##-###-###", "cc": "NP", "name_en": "Nepal", "desc_en": "", "name_ru": "Непал", "desc_ru": "" }, + { "mask": "+674-###-####", "cc": "NR", "name_en": "Nauru", "desc_en": "", "name_ru": "Науру", "desc_ru": "" }, + { "mask": "+683-####", "cc": "NU", "name_en": "Niue", "desc_en": "", "name_ru": "Ниуэ", "desc_ru": "" }, + { "mask": "+64(###)###-###", "cc": "NZ", "name_en": "New Zealand", "desc_en": "", "name_ru": "Новая Зеландия", "desc_ru": "" }, + { "mask": "+64-##-###-###", "cc": "NZ", "name_en": "New Zealand", "desc_en": "", "name_ru": "Новая Зеландия", "desc_ru": "" }, + { "mask": "+64(###)###-####", "cc": "NZ", "name_en": "New Zealand", "desc_en": "", "name_ru": "Новая Зеландия", "desc_ru": "" }, + { "mask": "+968-##-###-###", "cc": "OM", "name_en": "Oman", "desc_en": "", "name_ru": "Оман", "desc_ru": "" }, + { "mask": "+507-###-####", "cc": "PA", "name_en": "Panama", "desc_en": "", "name_ru": "Панама", "desc_ru": "" }, + { "mask": "+51(###)###-###", "cc": "PE", "name_en": "Peru", "desc_en": "", "name_ru": "Перу", "desc_ru": "" }, + { "mask": "+689-##-##-##", "cc": "PF", "name_en": "French Polynesia", "desc_en": "", "name_ru": "Французская Полинезия (Таити)", "desc_ru": "" }, + { "mask": "+675(###)##-###", "cc": "PG", "name_en": "Papua New Guinea", "desc_en": "", "name_ru": "Папуа-Новая Гвинея", "desc_ru": "" }, + { "mask": "+63(###)###-####", "cc": "PH", "name_en": "Philippines", "desc_en": "", "name_ru": "Филиппины", "desc_ru": "" }, + { "mask": "+92(###)###-####", "cc": "PK", "name_en": "Pakistan", "desc_en": "", "name_ru": "Пакистан", "desc_ru": "" }, + { "mask": "+48(###)###-###", "cc": "PL", "name_en": "Poland", "desc_en": "", "name_ru": "Польша", "desc_ru": "" }, + { "mask": "+970-##-###-####", "cc": "PS", "name_en": "Palestine", "desc_en": "", "name_ru": "Палестина", "desc_ru": "" }, + { "mask": "+351-##-###-####", "cc": "PT", "name_en": "Portugal", "desc_en": "", "name_ru": "Португалия", "desc_ru": "" }, + { "mask": "+680-###-####", "cc": "PW", "name_en": "Palau", "desc_en": "", "name_ru": "Палау", "desc_ru": "" }, + { "mask": "+595(###)###-###", "cc": "PY", "name_en": "Paraguay", "desc_en": "", "name_ru": "Парагвай", "desc_ru": "" }, + { "mask": "+974-####-####", "cc": "QA", "name_en": "Qatar", "desc_en": "", "name_ru": "Катар", "desc_ru": "" }, + { "mask": "+262-#####-####", "cc": "RE", "name_en": "Reunion", "desc_en": "", "name_ru": "Реюньон", "desc_ru": "" }, + { "mask": "+40-##-###-####", "cc": "RO", "name_en": "Romania", "desc_en": "", "name_ru": "Румыния", "desc_ru": "" }, + { "mask": "+381-##-###-####", "cc": "RS", "name_en": "Serbia", "desc_en": "", "name_ru": "Сербия", "desc_ru": "" }, + { "mask": "+7(###)###-##-##", "cc": "RU", "name_en": "Russia", "desc_en": "", "name_ru": "Россия", "desc_ru": "" }, + { "mask": "+250(###)###-###", "cc": "RW", "name_en": "Rwanda", "desc_en": "", "name_ru": "Руанда", "desc_ru": "" }, + { "mask": "+966-5-####-####", "cc": "SA", "name_en": "Saudi Arabia ", "desc_en": "mobile", "name_ru": "Саудовская Аравия ", "desc_ru": "мобильные" }, + { "mask": "+966-#-###-####", "cc": "SA", "name_en": "Saudi Arabia", "desc_en": "", "name_ru": "Саудовская Аравия", "desc_ru": "" }, + { "mask": "+677-###-####", "cc": "SB", "name_en": "Solomon Islands ", "desc_en": "mobile", "name_ru": "Соломоновы Острова ", "desc_ru": "мобильные" }, + { "mask": "+677-#####", "cc": "SB", "name_en": "Solomon Islands", "desc_en": "", "name_ru": "Соломоновы Острова", "desc_ru": "" }, + { "mask": "+248-#-###-###", "cc": "SC", "name_en": "Seychelles", "desc_en": "", "name_ru": "Сейшелы", "desc_ru": "" }, + { "mask": "+249-##-###-####", "cc": "SD", "name_en": "Sudan", "desc_en": "", "name_ru": "Судан", "desc_ru": "" }, + { "mask": "+46-##-###-####", "cc": "SE", "name_en": "Sweden", "desc_en": "", "name_ru": "Швеция", "desc_ru": "" }, + { "mask": "+65-####-####", "cc": "SG", "name_en": "Singapore", "desc_en": "", "name_ru": "Сингапур", "desc_ru": "" }, + { "mask": "+290-####", "cc": "SH", "name_en": "Saint Helena", "desc_en": "", "name_ru": "Остров Святой Елены", "desc_ru": "" }, + { "mask": "+290-####", "cc": "SH", "name_en": "Tristan da Cunha", "desc_en": "", "name_ru": "Тристан-да-Кунья", "desc_ru": "" }, + { "mask": "+386-##-###-###", "cc": "SI", "name_en": "Slovenia", "desc_en": "", "name_ru": "Словения", "desc_ru": "" }, + { "mask": "+421(###)###-###", "cc": "SK", "name_en": "Slovakia", "desc_en": "", "name_ru": "Словакия", "desc_ru": "" }, + { "mask": "+232-##-######", "cc": "SL", "name_en": "Sierra Leone", "desc_en": "", "name_ru": "Сьерра-Леоне", "desc_ru": "" }, + { "mask": "+378-####-######", "cc": "SM", "name_en": "San Marino", "desc_en": "", "name_ru": "Сан-Марино", "desc_ru": "" }, + { "mask": "+221-##-###-####", "cc": "SN", "name_en": "Senegal", "desc_en": "", "name_ru": "Сенегал", "desc_ru": "" }, + { "mask": "+252-##-###-###", "cc": "SO", "name_en": "Somalia", "desc_en": "", "name_ru": "Сомали", "desc_ru": "" }, + { "mask": "+252-#-###-###", "cc": "SO", "name_en": "Somalia", "desc_en": "", "name_ru": "Сомали", "desc_ru": "" }, + { "mask": "+252-#-###-###", "cc": "SO", "name_en": "Somalia ", "desc_en": "mobile", "name_ru": "Сомали ", "desc_ru": "мобильные" }, + { "mask": "+597-###-####", "cc": "SR", "name_en": "Suriname ", "desc_en": "mobile", "name_ru": "Суринам ", "desc_ru": "мобильные" }, + { "mask": "+597-###-###", "cc": "SR", "name_en": "Suriname", "desc_en": "", "name_ru": "Суринам", "desc_ru": "" }, + { "mask": "+211-##-###-####", "cc": "SS", "name_en": "South Sudan", "desc_en": "", "name_ru": "Южный Судан", "desc_ru": "" }, + { "mask": "+239-##-#####", "cc": "ST", "name_en": "Sao Tome and Principe", "desc_en": "", "name_ru": "Сан-Томе и Принсипи", "desc_ru": "" }, + { "mask": "+503-##-##-####", "cc": "SV", "name_en": "El Salvador", "desc_en": "", "name_ru": "Сальвадор", "desc_ru": "" }, + { "mask": "+1(721)###-####", "cc": "SX", "name_en": "Sint Maarten", "desc_en": "", "name_ru": "Синт-Маартен", "desc_ru": "" }, + { "mask": "+963-##-####-###", "cc": "SY", "name_en": "Syrian Arab Republic", "desc_en": "", "name_ru": "Сирийская арабская республика", "desc_ru": "" }, + { "mask": "+268-##-##-####", "cc": "SZ", "name_en": "Swaziland", "desc_en": "", "name_ru": "Свазиленд", "desc_ru": "" }, + { "mask": "+1(649)###-####", "cc": "TC", "name_en": "Turks & Caicos", "desc_en": "", "name_ru": "Тёркс и Кайкос", "desc_ru": "" }, + { "mask": "+235-##-##-##-##", "cc": "TD", "name_en": "Chad", "desc_en": "", "name_ru": "Чад", "desc_ru": "" }, + { "mask": "+228-##-###-###", "cc": "TG", "name_en": "Togo", "desc_en": "", "name_ru": "Того", "desc_ru": "" }, + { "mask": "+66-##-###-####", "cc": "TH", "name_en": "Thailand ", "desc_en": "mobile", "name_ru": "Таиланд ", "desc_ru": "мобильные" }, + { "mask": "+66-##-###-###", "cc": "TH", "name_en": "Thailand", "desc_en": "", "name_ru": "Таиланд", "desc_ru": "" }, + { "mask": "+992-##-###-####", "cc": "TJ", "name_en": "Tajikistan", "desc_en": "", "name_ru": "Таджикистан", "desc_ru": "" }, + { "mask": "+690-####", "cc": "TK", "name_en": "Tokelau", "desc_en": "", "name_ru": "Токелау", "desc_ru": "" }, + { "mask": "+670-###-####", "cc": "TL", "name_en": "East Timor", "desc_en": "", "name_ru": "Восточный Тимор", "desc_ru": "" }, + { "mask": "+670-77#-#####", "cc": "TL", "name_en": "East Timor", "desc_en": "Timor Telecom", "name_ru": "Восточный Тимор", "desc_ru": "Timor Telecom" }, + { "mask": "+670-78#-#####", "cc": "TL", "name_en": "East Timor", "desc_en": "Timor Telecom", "name_ru": "Восточный Тимор", "desc_ru": "Timor Telecom" }, + { "mask": "+993-#-###-####", "cc": "TM", "name_en": "Turkmenistan", "desc_en": "", "name_ru": "Туркменистан", "desc_ru": "" }, + { "mask": "+216-##-###-###", "cc": "TN", "name_en": "Tunisia", "desc_en": "", "name_ru": "Тунис", "desc_ru": "" }, + { "mask": "+676-#####", "cc": "TO", "name_en": "Tonga", "desc_en": "", "name_ru": "Тонга", "desc_ru": "" }, + { "mask": "+90(###)###-####", "cc": "TR", "name_en": "Turkey", "desc_en": "", "name_ru": "Турция", "desc_ru": "" }, + { "mask": "+1(868)###-####", "cc": "TT", "name_en": "Trinidad & Tobago", "desc_en": "", "name_ru": "Тринидад и Тобаго", "desc_ru": "" }, + { "mask": "+688-90####", "cc": "TV", "name_en": "Tuvalu ", "desc_en": "mobile", "name_ru": "Тувалу ", "desc_ru": "мобильные" }, + { "mask": "+688-2####", "cc": "TV", "name_en": "Tuvalu", "desc_en": "", "name_ru": "Тувалу", "desc_ru": "" }, + { "mask": "+886-#-####-####", "cc": "TW", "name_en": "Taiwan", "desc_en": "", "name_ru": "Тайвань", "desc_ru": "" }, + { "mask": "+886-####-####", "cc": "TW", "name_en": "Taiwan", "desc_en": "", "name_ru": "Тайвань", "desc_ru": "" }, + { "mask": "+255-##-###-####", "cc": "TZ", "name_en": "Tanzania", "desc_en": "", "name_ru": "Танзания", "desc_ru": "" }, + { "mask": "+380(##)###-##-##", "cc": "UA", "name_en": "Ukraine", "desc_en": "", "name_ru": "Украина", "desc_ru": "" }, + { "mask": "+256(###)###-###", "cc": "UG", "name_en": "Uganda", "desc_en": "", "name_ru": "Уганда", "desc_ru": "" }, + { "mask": "+44-##-####-####", "cc": "UK", "name_en": "United Kingdom", "desc_en": "", "name_ru": "Великобритания", "desc_ru": "" }, + { "mask": "+598-#-###-##-##", "cc": "UY", "name_en": "Uruguay", "desc_en": "", "name_ru": "Уругвай", "desc_ru": "" }, + { "mask": "+998-##-###-####", "cc": "UZ", "name_en": "Uzbekistan", "desc_en": "", "name_ru": "Узбекистан", "desc_ru": "" }, + { "mask": "+39-6-698-#####", "cc": "VA", "name_en": "Vatican City", "desc_en": "", "name_ru": "Ватикан", "desc_ru": "" }, + { "mask": "+1(784)###-####", "cc": "VC", "name_en": "Saint Vincent & the Grenadines", "desc_en": "", "name_ru": "Сент-Винсент и Гренадины", "desc_ru": "" }, + { "mask": "+58(###)###-####", "cc": "VE", "name_en": "Venezuela", "desc_en": "", "name_ru": "Венесуэла", "desc_ru": "" }, + { "mask": "+1(284)###-####", "cc": "VG", "name_en": "British Virgin Islands", "desc_en": "", "name_ru": "Британские Виргинские острова", "desc_ru": "" }, + { "mask": "+1(340)###-####", "cc": "VI", "name_en": "US Virgin Islands", "desc_en": "", "name_ru": "Американские Виргинские острова", "desc_ru": "" }, + { "mask": "+84-##-####-###", "cc": "VN", "name_en": "Vietnam", "desc_en": "", "name_ru": "Вьетнам", "desc_ru": "" }, + { "mask": "+84(###)####-###", "cc": "VN", "name_en": "Vietnam", "desc_en": "", "name_ru": "Вьетнам", "desc_ru": "" }, + { "mask": "+678-##-#####", "cc": "VU", "name_en": "Vanuatu ", "desc_en": "mobile", "name_ru": "Вануату ", "desc_ru": "мобильные" }, + { "mask": "+678-#####", "cc": "VU", "name_en": "Vanuatu", "desc_en": "", "name_ru": "Вануату", "desc_ru": "" }, + { "mask": "+681-##-####", "cc": "WF", "name_en": "Wallis and Futuna", "desc_en": "", "name_ru": "Уоллис и Футуна", "desc_ru": "" }, + { "mask": "+685-##-####", "cc": "WS", "name_en": "Samoa", "desc_en": "", "name_ru": "Самоа", "desc_ru": "" }, + { "mask": "+967-###-###-###", "cc": "YE", "name_en": "Yemen ", "desc_en": "mobile", "name_ru": "Йемен ", "desc_ru": "мобильные" }, + { "mask": "+967-#-###-###", "cc": "YE", "name_en": "Yemen", "desc_en": "", "name_ru": "Йемен", "desc_ru": "" }, + { "mask": "+967-##-###-###", "cc": "YE", "name_en": "Yemen", "desc_en": "", "name_ru": "Йемен", "desc_ru": "" }, + { "mask": "+27-##-###-####", "cc": "ZA", "name_en": "South Africa", "desc_en": "", "name_ru": "Южно-Африканская Респ.", "desc_ru": "" }, + { "mask": "+260-##-###-####", "cc": "ZM", "name_en": "Zambia", "desc_en": "", "name_ru": "Замбия", "desc_ru": "" }, + { "mask": "+263-#-######", "cc": "ZW", "name_en": "Zimbabwe", "desc_en": "", "name_ru": "Зимбабве", "desc_ru": "" }, + { "mask": "+1(###)###-####", "cc": ["US", "CA"], "name_en": "USA and Canada", "desc_en": "", "name_ru": "США и Канада", "desc_ru": "" } +] diff --git a/theme/bootstrap/plugins/input-mask/phone-codes/readme.txt b/theme/bootstrap/plugins/input-mask/phone-codes/readme.txt new file mode 100644 index 0000000..0a170a7 --- /dev/null +++ b/theme/bootstrap/plugins/input-mask/phone-codes/readme.txt @@ -0,0 +1 @@ +more phone masks can be found at https://github.com/andr-04/inputmask-multi \ No newline at end of file diff --git a/theme/bootstrap/plugins/ionslider/img/sprite-skin-flat.png b/theme/bootstrap/plugins/ionslider/img/sprite-skin-flat.png new file mode 100644 index 0000000..3055db7 Binary files /dev/null and b/theme/bootstrap/plugins/ionslider/img/sprite-skin-flat.png differ diff --git a/theme/bootstrap/plugins/ionslider/img/sprite-skin-nice.png b/theme/bootstrap/plugins/ionslider/img/sprite-skin-nice.png new file mode 100644 index 0000000..d62f818 Binary files /dev/null and b/theme/bootstrap/plugins/ionslider/img/sprite-skin-nice.png differ diff --git a/theme/bootstrap/plugins/ionslider/ion.rangeSlider.css b/theme/bootstrap/plugins/ionslider/ion.rangeSlider.css new file mode 100644 index 0000000..052d477 --- /dev/null +++ b/theme/bootstrap/plugins/ionslider/ion.rangeSlider.css @@ -0,0 +1,126 @@ +/* Ion.RangeSlider +// css version 1.8.5 +// by Denis Ineshin | ionden.com +// ===================================================================================================================*/ + +/* ===================================================================================================================== +// RangeSlider */ + +.irs { + position: relative; display: block; +} + .irs-line { + position: relative; display: block; + overflow: hidden; + } + .irs-line-left, .irs-line-mid, .irs-line-right { + position: absolute; display: block; + top: 0; + } + .irs-line-left { + left: 0; width: 10%; + } + .irs-line-mid { + left: 10%; width: 80%; + } + .irs-line-right { + right: 0; width: 10%; + } + + .irs-diapason { + position: absolute; display: block; + left: 0; width: 100%; + } + .irs-slider { + position: absolute; display: block; + cursor: default; + z-index: 1; + } + .irs-slider.single { + left: 10px; + } + .irs-slider.single:before { + position: absolute; display: block; content: ""; + top: -30%; left: -30%; + width: 160%; height: 160%; + background: rgba(0,0,0,0.0); + } + .irs-slider.from { + left: 100px; + } + .irs-slider.from:before { + position: absolute; display: block; content: ""; + top: -30%; left: -30%; + width: 130%; height: 160%; + background: rgba(0,0,0,0.0); + } + .irs-slider.to { + left: 300px; + } + .irs-slider.to:before { + position: absolute; display: block; content: ""; + top: -30%; left: 0; + width: 130%; height: 160%; + background: rgba(0,0,0,0.0); + } + .irs-slider.last { + z-index: 2; + } + + .irs-min { + position: absolute; display: block; + left: 0; + cursor: default; + } + .irs-max { + position: absolute; display: block; + right: 0; + cursor: default; + } + + .irs-from, .irs-to, .irs-single { + position: absolute; display: block; + top: 0; left: 0; + cursor: default; + white-space: nowrap; + } + + +.irs-grid { + position: absolute; display: none; + bottom: 0; left: 0; + width: 100%; height: 20px; +} +.irs-with-grid .irs-grid { + display: block; +} + .irs-grid-pol { + position: absolute; + top: 0; left: 0; + width: 1px; height: 8px; + background: #000; + } + .irs-grid-pol.small { + height: 4px; + } + .irs-grid-text { + position: absolute; + bottom: 0; left: 0; + width: 100px; + white-space: nowrap; + text-align: center; + font-size: 9px; line-height: 9px; + color: #000; + } + +.irs-disable-mask { + position: absolute; display: block; + top: 0; left: 0; + width: 100%; height: 100%; + cursor: default; + background: rgba(0,0,0,0.0); + z-index: 2; +} +.irs-disabled { + opacity: 0.4; +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/ionslider/ion.rangeSlider.min.js b/theme/bootstrap/plugins/ionslider/ion.rangeSlider.min.js new file mode 100644 index 0000000..f352609 --- /dev/null +++ b/theme/bootstrap/plugins/ionslider/ion.rangeSlider.min.js @@ -0,0 +1,22 @@ +// Ion.RangeSlider +// version 1.8.2 +// https://github.com/IonDen/ion.rangeSlider +(function(c,X,ea,S){var Y=0,O=function(){var c=S.userAgent,a=/msie\s\d+/i;return 0<c.search(a)&&(c=a.exec(c).toString(),c=c.split(" ")[1],9>c)?!0:!1}(),H;try{X.createEvent("TouchEvent"),H=!0}catch(ga){H=!1}var N={init:function(A){return this.each(function(){var a=c.extend({min:10,max:100,from:null,to:null,type:"single",step:1,prefix:"",postfix:"",hasGrid:!1,hideMinMax:!1,hideFromTo:!1,prettify:!0,onChange:null,onLoad:null,onFinish:null},A),d=c(this),u=this;if(!d.data("isActive")){d.data("isActive", +!0);this.pluginCount=Y+=1;d.prop("value")&&(a.min=parseInt(d.prop("value").split(";")[0],10),a.max=parseInt(d.prop("value").split(";")[1],10));"number"!==typeof a.from&&(a.from=a.min);"number"!==typeof a.to&&(a.to=a.max);"number"===typeof d.data("from")&&(a.from=parseFloat(d.data("from")));"number"===typeof d.data("to")&&(a.to=parseFloat(d.data("to")));d.data("step")&&(a.step=parseFloat(d.data("step")));d.data("type")&&(a.type=d.data("type"));d.data("prefix")&&(a.prefix=d.data("prefix"));d.data("postfix")&& +(a.postfix=d.data("postfix"));d.data("hasgrid")&&(a.hasGrid=d.data("hasgrid"));d.data("hideminmax")&&(a.hideMinMax=d.data("hideminmax"));d.data("hidefromto")&&(a.hideFromTo=d.data("hidefromto"));d.data("prettify")&&(a.prettify=d.data("prettify"));a.from<a.min&&(a.from=a.min);a.to>a.max&&(a.to=a.max);"double"===a.type&&(a.from>a.to&&(a.from=a.to),a.to<a.from&&(a.to=a.from));var v=function(b){b=b.toString();a.prettify&&(b=b.replace(/(\d{1,3}(?=(?:\d\d\d)+(?!\d)))/g,"$1 "));return b},N='<span class="irs" id="irs-'+ +this.pluginCount+'"></span>';d[0].style.display="none";d.before(N);var w=c("#irs-"+this.pluginCount),C=c(X.body),I=c(ea),l,D,E,x,y,q,r,e,m,s,T,Z,p=!1,t=!1,P=!0,g={},U=0,J=0,K=0,k=0,B=0,L=0,V=0,Q=0,R=0,$=0,n=0;parseInt(a.step,10)!==parseFloat(a.step)&&(n=a.step.toString().split(".")[1],n=Math.pow(10,n.length));this.updateData=function(b){P=!0;a=c.extend(a,b);w.find("*").off();I.off("mouseup.irs"+u.pluginCount);C.off("mouseup.irs"+u.pluginCount);C.off("mousemove.irs"+u.pluginCount);w.html("");aa()}; +this.removeSlider=function(){w.find("*").off();I.off("mouseup.irs"+u.pluginCount);C.off("mouseup.irs"+u.pluginCount);C.off("mousemove.irs"+u.pluginCount);w.html("").remove();d.data("isActive",!1);d.show()};var aa=function(){w.html('<span class="irs"><span class="irs-line"><span class="irs-line-left"></span><span class="irs-line-mid"></span><span class="irs-line-right"></span></span><span class="irs-min">0</span><span class="irs-max">1</span><span class="irs-from">0</span><span class="irs-to">0</span><span class="irs-single">0</span></span><span class="irs-grid"></span>'); +l=w.find(".irs");D=l.find(".irs-min");E=l.find(".irs-max");x=l.find(".irs-from");y=l.find(".irs-to");q=l.find(".irs-single");Z=w.find(".irs-grid");a.hideMinMax&&(D[0].style.display="none",E[0].style.display="none",K=J=0);a.hideFromTo&&(x[0].style.display="none",y[0].style.display="none",q[0].style.display="none");a.hideMinMax||(D.html(a.prefix+v(a.min)+a.postfix),E.html(a.prefix+v(a.max)+a.postfix),J=D.outerWidth(),K=E.outerWidth());if("single"===a.type){if(l.append('<span class="irs-slider single"></span>'), +r=l.find(".single"),r.on("mousedown",function(a){a.preventDefault();a.stopPropagation();F(a,c(this),null);t=p=!0;O&&c("*").prop("unselectable",!0)}),H)r.on("touchstart",function(a){a.preventDefault();a.stopPropagation();F(a.originalEvent.touches[0],c(this),null);t=p=!0})}else"double"===a.type&&(l.append('<span class="irs-diapason"></span><span class="irs-slider from"></span><span class="irs-slider to"></span>'),e=l.find(".from"),m=l.find(".to"),T=l.find(".irs-diapason"),M(),e.on("mousedown",function(a){a.preventDefault(); +a.stopPropagation();c(this).addClass("last");m.removeClass("last");F(a,c(this),"from");t=p=!0;O&&c("*").prop("unselectable",!0)}),m.on("mousedown",function(a){a.preventDefault();a.stopPropagation();c(this).addClass("last");e.removeClass("last");F(a,c(this),"to");t=p=!0;O&&c("*").prop("unselectable",!0)}),H&&(e.on("touchstart",function(a){a.preventDefault();a.stopPropagation();c(this).addClass("last");m.removeClass("last");F(a.originalEvent.touches[0],c(this),"from");t=p=!0}),m.on("touchstart",function(a){a.preventDefault(); +a.stopPropagation();c(this).addClass("last");e.removeClass("last");F(a.originalEvent.touches[0],c(this),"to");t=p=!0})),a.to===a.max&&e.addClass("last"));var b=function(){p&&(p=t=!1,s.removeAttr("id"),s=null,"double"===a.type&&M(),W(),O&&c("*").prop("unselectable",!1))};C.on("mouseup.irs"+u.pluginCount,function(){b()});I.on("mouseup.irs"+u.pluginCount,function(){b()});C.on("mousemove.irs"+u.pluginCount,function(a){p&&(U=a.pageX,ba())});H&&(I.on("touchend",function(){p&&(p=t=!1,s.removeAttr("id"), +s=null,"double"===a.type&&M(),W())}),I.on("touchmove",function(a){p&&(U=a.originalEvent.touches[0].pageX,ba())}));ca();S();a.hasGrid&&fa()},ca=function(){k=l.width();L=r?r.width():e.width();B=k-L},F=function(b,f,c){ca();P=!1;s=f;s.attr("id","irs-active-slider");f=s.offset().left;$=f+(b.pageX-f)-s.position().left;"single"===a.type?V=l.width()-L:"double"===a.type&&("from"===c?(Q=0,R=parseInt(m.css("left"),10)):(Q=parseInt(e.css("left"),10),R=l.width()-L))},M=function(){var a=e.width(),f=c.data(e[0], +"x")||parseInt(e[0].style.left,10)||e.position().left,G=(c.data(m[0],"x")||parseInt(m[0].style.left,10)||m.position().left)-f;T[0].style.left=f+a/2+"px";T[0].style.width=G+"px"},ba=function(){var b=U-$;"single"===a.type?(0>b&&(b=0),b>V&&(b=V)):"double"===a.type&&(b<Q&&(b=Q),b>R&&(b=R),M());c.data(s[0],"x",b);W();b=Math.round(b);s[0].style.left=b+"px"},W=function(){var b={fromNumber:0,toNumber:0,fromPers:0,toPers:0,fromX:0,toX:0},f=a.max-a.min,G;"single"===a.type?(b.fromX=c.data(r[0],"x")||parseInt(r[0].style.left, +10)||r.position().left,b.fromPers=b.fromX/B*100,G=f/100*b.fromPers+parseInt(a.min,10),b.fromNumber=Math.round(G/a.step)*a.step,n&&(b.fromNumber=parseInt(b.fromNumber*n,10)/n)):"double"===a.type&&(b.fromX=c.data(e[0],"x")||parseInt(e[0].style.left,10)||e.position().left,b.fromPers=b.fromX/B*100,G=f/100*b.fromPers+parseInt(a.min,10),b.fromNumber=Math.round(G/a.step)*a.step,b.toX=c.data(m[0],"x")||parseInt(m[0].style.left,10)||m.position().left,b.toPers=b.toX/B*100,f=f/100*b.toPers+parseInt(a.min,10), +b.toNumber=Math.round(f/a.step)*a.step,n&&(b.fromNumber=parseInt(b.fromNumber*n,10)/n,b.toNumber=parseInt(b.toNumber*n,10)/n));g=b;da()},S=function(){var b={fromNumber:a.from,toNumber:a.to,fromPers:0,toPers:0,fromX:0,fromX_pure:0,toX:0,toX_pure:0},f=a.max-a.min;"single"===a.type?(b.fromPers=(b.fromNumber-a.min)/f*100,b.fromX_pure=B/100*b.fromPers,b.fromX=Math.round(b.fromX_pure),r[0].style.left=b.fromX+"px",c.data(r[0],"x",b.fromX_pure)):"double"===a.type&&(b.fromPers=(b.fromNumber-a.min)/f*100,b.fromX_pure= +B/100*b.fromPers,b.fromX=Math.round(b.fromX_pure),e[0].style.left=b.fromX+"px",c.data(e[0],"x",b.fromX_pure),b.toPers=(b.toNumber-a.min)/f*100,b.toX_pure=B/100*b.toPers,b.toX=Math.round(b.toX_pure),m[0].style.left=b.toX+"px",c.data(m[0],"x",b.toX_pure),M());g=b;da()},da=function(){var b,f,c,z,e,h;h=L/2;"single"===a.type?(a.hideText||(x[0].style.display="none",y[0].style.display="none",c=a.prefix+v(g.fromNumber)+a.postfix,q.html(c),e=q.outerWidth(),h=g.fromX-e/2+h,0>h&&(h=0),h>k-e&&(h=k-e),q[0].style.left= +h+"px",a.hideMinMax||a.hideFromTo||(D[0].style.display=h<J?"none":"block",E[0].style.display=h+e>k-K?"none":"block")),d.attr("value",parseInt(g.fromNumber,10))):"double"===a.type&&(a.hideText||(b=a.prefix+v(g.fromNumber)+a.postfix,f=a.prefix+v(g.toNumber)+a.postfix,c=g.fromNumber!==g.toNumber?a.prefix+v(g.fromNumber)+" \u2014 "+a.prefix+v(g.toNumber)+a.postfix:a.prefix+v(g.fromNumber)+a.postfix,x.html(b),y.html(f),q.html(c),b=x.outerWidth(),f=g.fromX-b/2+h,0>f&&(f=0),f>k-b&&(f=k-b),x[0].style.left= +f+"px",c=y.outerWidth(),z=g.toX-c/2+h,0>z&&(z=0),z>k-c&&(z=k-c),y[0].style.left=z+"px",e=q.outerWidth(),h=g.fromX+(g.toX-g.fromX)/2-e/2+h,0>h&&(h=0),h>k-e&&(h=k-e),q[0].style.left=h+"px",f+b<z?(q[0].style.display="none",x[0].style.display="block",y[0].style.display="block"):(q[0].style.display="block",x[0].style.display="none",y[0].style.display="none"),a.hideMinMax||a.hideFromTo||(D[0].style.display=h<J||f<J?"none":"block",E[0].style.display=h+e>k-K||z+c>k-K?"none":"block")),d.attr("value",parseInt(g.fromNumber, +10)+";"+parseInt(g.toNumber,10)));"function"===typeof a.onChange&&a.onChange.call(this,g);"function"!==typeof a.onFinish||t||P||a.onFinish.call(this,g);"function"===typeof a.onLoad&&!t&&P&&a.onLoad.call(this,g)},fa=function(){w.addClass("irs-with-grid");var b,c="",d=0,d=0,e="";for(b=0;20>=b;b+=1)d=Math.floor(k/20*b),d>=k&&(d=k-1),e+='<span class="irs-grid-pol small" style="left: '+d+'px;"></span>';for(b=0;4>=b;b+=1)d=Math.floor(k/4*b),d>=k&&(d=k-1),e+='<span class="irs-grid-pol" style="left: '+d+ +'px;"></span>',n?(c=a.min+(a.max-a.min)/4*b,c=c/a.step*a.step,c=parseInt(c*n,10)/n):(c=Math.round(a.min+(a.max-a.min)/4*b),c=Math.round(c/a.step)*a.step,c=v(c)),0===b?e+='<span class="irs-grid-text" style="left: '+d+'px; text-align: left;">'+c+"</span>":4===b?(d-=100,e+='<span class="irs-grid-text" style="left: '+d+'px; text-align: right;">'+c+"</span>"):(d-=50,e+='<span class="irs-grid-text" style="left: '+d+'px;">'+c+"</span>");Z.html(e)};aa()}})},update:function(c){return this.each(function(){this.updateData(c)})}, +remove:function(){return this.each(function(){this.removeSlider()})}};c.fn.ionRangeSlider=function(A){if(N[A])return N[A].apply(this,Array.prototype.slice.call(arguments,1));if("object"!==typeof A&&A)c.error("Method "+A+" does not exist for jQuery.ionRangeSlider");else return N.init.apply(this,arguments)}})(jQuery,document,window,navigator); \ No newline at end of file diff --git a/theme/bootstrap/plugins/ionslider/ion.rangeSlider.skinFlat.css b/theme/bootstrap/plugins/ionslider/ion.rangeSlider.skinFlat.css new file mode 100644 index 0000000..0f141be --- /dev/null +++ b/theme/bootstrap/plugins/ionslider/ion.rangeSlider.skinFlat.css @@ -0,0 +1,89 @@ +/* Ion.RangeSlider, Flat UI Skin +// css version 1.8.5 +// by Denis Ineshin | ionden.com +// ===================================================================================================================*/ + +/* ===================================================================================================================== +// Skin details */ + +.irs-line-mid, +.irs-line-left, +.irs-line-right, +.irs-diapason, +.irs-slider { + background: url(img/sprite-skin-flat.png) repeat-x; +} + +.irs { + height: 40px; +} +.irs-with-grid { + height: 60px; +} +.irs-line { + height: 12px; top: 25px; +} + .irs-line-left { + height: 12px; + background-position: 0 -30px; + } + .irs-line-mid { + height: 12px; + background-position: 0 0; + } + .irs-line-right { + height: 12px; + background-position: 100% -30px; + } + +.irs-diapason { + height: 12px; top: 25px; + background-position: 0 -60px; +} + +.irs-slider { + width: 16px; height: 18px; + top: 22px; + background-position: 0 -90px; +} +#irs-active-slider, .irs-slider:hover { + background-position: 0 -120px; +} + +.irs-min, .irs-max { + color: #999; + font-size: 10px; line-height: 1.333; + text-shadow: none; + top: 0; padding: 1px 3px; + background: #e1e4e9; + border-radius: 4px; +} + +.irs-from, .irs-to, .irs-single { + color: #fff; + font-size: 10px; line-height: 1.333; + text-shadow: none; + padding: 1px 5px; + background: #ed5565; + border-radius: 4px; +} +.irs-from:after, .irs-to:after, .irs-single:after { + position: absolute; display: block; content: ""; + bottom: -6px; left: 50%; + width: 0; height: 0; + margin-left: -3px; + overflow: hidden; + border: 3px solid transparent; + border-top-color: #ed5565; +} + + +.irs-grid-pol { + background: #e1e4e9; +} +.irs-grid-text { + color: #999; +} + +.irs-disabled { +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/ionslider/ion.rangeSlider.skinNice.css b/theme/bootstrap/plugins/ionslider/ion.rangeSlider.skinNice.css new file mode 100644 index 0000000..89e2810 --- /dev/null +++ b/theme/bootstrap/plugins/ionslider/ion.rangeSlider.skinNice.css @@ -0,0 +1,85 @@ +/* Ion.RangeSlider, Nice Skin +// css version 1.8.5 +// by Denis Ineshin | ionden.com +// ===================================================================================================================*/ + +/* ===================================================================================================================== +// Skin details */ + +.irs-line-mid, +.irs-line-left, +.irs-line-right, +.irs-diapason, +.irs-slider { + background: url(img/sprite-skin-nice.png) repeat-x; +} + +.irs { + height: 40px; +} +.irs-with-grid { + height: 60px; +} +.irs-line { + height: 8px; top: 25px; +} + .irs-line-left { + height: 8px; + background-position: 0 -30px; + } + .irs-line-mid { + height: 8px; + background-position: 0 0; + } + .irs-line-right { + height: 8px; + background-position: 100% -30px; + } + +.irs-diapason { + height: 8px; top: 25px; + background-position: 0 -60px; +} + +.irs-slider { + width: 22px; height: 22px; + top: 17px; + background-position: 0 -90px; +} +#irs-active-slider, .irs-slider:hover { + background-position: 0 -120px; +} + +.irs-min, .irs-max { + color: #999; + font-size: 10px; line-height: 1.333; + text-shadow: none; + top: 0; padding: 1px 3px; + background: rgba(0,0,0,0.1); + border-radius: 3px; +} +.lt-ie9 .irs-min, .lt-ie9 .irs-max { + background: #ccc; +} + +.irs-from, .irs-to, .irs-single { + color: #fff; + font-size: 10px; line-height: 1.333; + text-shadow: none; + padding: 1px 5px; + background: rgba(0,0,0,0.3); + border-radius: 3px; +} +.lt-ie9 .irs-from, .lt-ie9 .irs-to, .lt-ie9 .irs-single { + background: #999; +} + +.irs-grid-pol { + background: #99a4ac; +} +.irs-grid-text { + color: #99a4ac; +} + +.irs-disabled { +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/jQuery/jQuery-2.1.4.min.js b/theme/bootstrap/plugins/jQuery/jQuery-2.1.4.min.js new file mode 100644 index 0000000..49990d6 --- /dev/null +++ b/theme/bootstrap/plugins/jQuery/jQuery-2.1.4.min.js @@ -0,0 +1,4 @@ +/*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){ +return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=L.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,R=["Top","Right","Bottom","Left"],S=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement("div")),c=l.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||l,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=l),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?Z:$):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=Z,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return n().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|&#?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ia={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1></$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=qa[0].contentDocument,b.write(),b.close(),c=sa(a,b),qa.detach()),ra[a]=c),c}var ua=/^margin/,va=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wa=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)};function xa(a,b,c){var d,e,f,g,h=a.style;return c=c||wa(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),va.test(g)&&ua.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function ya(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),f.removeChild(c),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var za=/^(none|table(?!-c[ea]).+)/,Aa=new RegExp("^("+Q+")(.*)$","i"),Ba=new RegExp("^([+-])=("+Q+")","i"),Ca={position:"absolute",visibility:"hidden",display:"block"},Da={letterSpacing:"0",fontWeight:"400"},Ea=["Webkit","O","Moz","ms"];function Fa(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Ea.length;while(e--)if(b=Ea[e]+c,b in a)return b;return d}function Ga(a,b,c){var d=Aa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Ha(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ia(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wa(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xa(a,b,f),(0>e||null==e)&&(e=a.style[b]),va.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Ha(a,b,c||(g?"border":"content"),d,f)+"px"}function Ja(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",ta(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xa(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fa(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Ba.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fa(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xa(a,b,d)),"normal"===e&&b in Da&&(e=Da[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?za.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Ca,function(){return Ia(a,b,d)}):Ia(a,b,d):void 0},set:function(a,c,d){var e=d&&wa(a);return Ga(a,c,d?Ha(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=ya(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ua.test(a)||(n.cssHooks[a+b].set=Ga)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wa(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Ja(this,!0)},hide:function(){return Ja(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Ka(a,b,c,d,e){return new Ka.prototype.init(a,b,c,d,e)}n.Tween=Ka,Ka.prototype={constructor:Ka,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ka.propHooks[this.prop];return a&&a.get?a.get(this):Ka.propHooks._default.get(this)},run:function(a){var b,c=Ka.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ka.propHooks._default.set(this),this}},Ka.prototype.init.prototype=Ka.prototype,Ka.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Ka.propHooks.scrollTop=Ka.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Ka.prototype.init,n.fx.step={};var La,Ma,Na=/^(?:toggle|show|hide)$/,Oa=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pa=/queueHooks$/,Qa=[Va],Ra={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Oa.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Oa.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sa(){return setTimeout(function(){La=void 0}),La=n.now()}function Ta(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ua(a,b,c){for(var d,e=(Ra[b]||[]).concat(Ra["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Va(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||ta(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Na.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?ta(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ua(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wa(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xa(a,b,c){var d,e,f=0,g=Qa.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=La||Sa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:La||Sa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wa(k,j.opts.specialEasing);g>f;f++)if(d=Qa[f].call(j,a,k,j.opts))return d;return n.map(k,Ua,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xa,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Ra[c]=Ra[c]||[],Ra[c].unshift(b)},prefilter:function(a,b){b?Qa.unshift(a):Qa.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xa(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pa.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Ta(b,!0),a,d,e)}}),n.each({slideDown:Ta("show"),slideUp:Ta("hide"),slideToggle:Ta("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(La=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),La=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Ma||(Ma=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(Ma),Ma=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=l.createElement("input"),b=l.createElement("select"),c=b.appendChild(l.createElement("option"));a.type="checkbox",k.checkOn=""!==a.value,k.optSelected=c.selected,b.disabled=!0,k.optDisabled=!c.disabled,a=l.createElement("input"),a.value="t",a.type="radio",k.radioValue="t"===a.value}();var Ya,Za,$a=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return J(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Za:Ya)), +void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Za={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$a[b]||n.find.attr;$a[b]=function(a,b,d){var e,f;return d||(f=$a[b],$a[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$a[b]=f),e}});var _a=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_a.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ab=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ab," ").indexOf(b)>=0)return!0;return!1}});var bb=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cb=n.now(),db=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+a),b};var eb=/#.*$/,fb=/([?&])_=[^&]*/,gb=/^(.*?):[ \t]*([^\r\n]*)$/gm,hb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,ib=/^(?:GET|HEAD)$/,jb=/^\/\//,kb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,lb={},mb={},nb="*/".concat("*"),ob=a.location.href,pb=kb.exec(ob.toLowerCase())||[];function qb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function rb(a,b,c,d){var e={},f=a===mb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function sb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function tb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function ub(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ob,type:"GET",isLocal:hb.test(pb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":nb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?sb(sb(a,n.ajaxSettings),b):sb(n.ajaxSettings,a)},ajaxPrefilter:qb(lb),ajaxTransport:qb(mb),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=gb.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||ob)+"").replace(eb,"").replace(jb,pb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=kb.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===pb[1]&&h[2]===pb[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(pb[3]||("http:"===pb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),rb(lb,k,b,v),2===t)return v;i=n.event&&k.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!ib.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(db.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=fb.test(d)?d.replace(fb,"$1_="+cb++):d+(db.test(d)?"&":"?")+"_="+cb++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader("If-Modified-Since",n.lastModified[d]),n.etag[d]&&v.setRequestHeader("If-None-Match",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+nb+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=rb(mb,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=tb(k,v,f)),u=ub(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(n.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var vb=/%20/g,wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&").replace(vb,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Bb=0,Cb={},Db={0:200,1223:204},Eb=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Cb)Cb[a]()}),k.cors=!!Eb&&"withCredentials"in Eb,k.ajax=Eb=!!Eb,n.ajaxTransport(function(a){var b;return k.cors||Eb&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Bb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Cb[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Db[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Cb[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),l.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Fb=[],Gb=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Fb.pop()||n.expando+"_"+cb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Gb.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Gb.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Gb,"$1"+e):b.jsonp!==!1&&(b.url+=(db.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Fb.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||l;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var Hb=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Hb)return Hb.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var Ib=a.document.documentElement;function Jb(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Jb(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Ib;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Ib})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;n.fn[b]=function(e){return J(this,function(b,e,f){var g=Jb(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=ya(k.pixelPosition,function(a,c){return c?(c=xa(a,b),va.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return J(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Kb=a.jQuery,Lb=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Lb),b&&a.jQuery===n&&(a.jQuery=Kb),n},typeof b===U&&(a.jQuery=a.$=n),n}); diff --git a/theme/bootstrap/plugins/jQueryUI/jquery-ui.js b/theme/bootstrap/plugins/jQueryUI/jquery-ui.js new file mode 100644 index 0000000..31ee9cd --- /dev/null +++ b/theme/bootstrap/plugins/jQueryUI/jquery-ui.js @@ -0,0 +1,16617 @@ +/*! jQuery UI - v1.11.4 - 2015-03-11 +* http://jqueryui.com +* Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js, menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js, sortable.js, spinner.js, tabs.js, tooltip.js +* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */ + +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "jquery" ], factory ); + } else { + + // Browser globals + factory( jQuery ); + } +}(function( $ ) { +/*! + * jQuery UI Core 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/category/ui-core/ + */ + + +// $.ui might exist from components with no dependencies, e.g., $.ui.position +$.ui = $.ui || {}; + +$.extend( $.ui, { + version: "1.11.4", + + keyCode: { + BACKSPACE: 8, + COMMA: 188, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + LEFT: 37, + PAGE_DOWN: 34, + PAGE_UP: 33, + PERIOD: 190, + RIGHT: 39, + SPACE: 32, + TAB: 9, + UP: 38 + } +}); + +// plugins +$.fn.extend({ + scrollParent: function( includeHidden ) { + var position = this.css( "position" ), + excludeStaticParent = position === "absolute", + overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/, + scrollParent = this.parents().filter( function() { + var parent = $( this ); + if ( excludeStaticParent && parent.css( "position" ) === "static" ) { + return false; + } + return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + parent.css( "overflow-x" ) ); + }).eq( 0 ); + + return position === "fixed" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent; + }, + + uniqueId: (function() { + var uuid = 0; + + return function() { + return this.each(function() { + if ( !this.id ) { + this.id = "ui-id-" + ( ++uuid ); + } + }); + }; + })(), + + removeUniqueId: function() { + return this.each(function() { + if ( /^ui-id-\d+$/.test( this.id ) ) { + $( this ).removeAttr( "id" ); + } + }); + } +}); + +// selectors +function focusable( element, isTabIndexNotNaN ) { + var map, mapName, img, + nodeName = element.nodeName.toLowerCase(); + if ( "area" === nodeName ) { + map = element.parentNode; + mapName = map.name; + if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) { + return false; + } + img = $( "img[usemap='#" + mapName + "']" )[ 0 ]; + return !!img && visible( img ); + } + return ( /^(input|select|textarea|button|object)$/.test( nodeName ) ? + !element.disabled : + "a" === nodeName ? + element.href || isTabIndexNotNaN : + isTabIndexNotNaN) && + // the element and all of its ancestors must be visible + visible( element ); +} + +function visible( element ) { + return $.expr.filters.visible( element ) && + !$( element ).parents().addBack().filter(function() { + return $.css( this, "visibility" ) === "hidden"; + }).length; +} + +$.extend( $.expr[ ":" ], { + data: $.expr.createPseudo ? + $.expr.createPseudo(function( dataName ) { + return function( elem ) { + return !!$.data( elem, dataName ); + }; + }) : + // support: jQuery <1.8 + function( elem, i, match ) { + return !!$.data( elem, match[ 3 ] ); + }, + + focusable: function( element ) { + return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) ); + }, + + tabbable: function( element ) { + var tabIndex = $.attr( element, "tabindex" ), + isTabIndexNaN = isNaN( tabIndex ); + return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN ); + } +}); + +// support: jQuery <1.8 +if ( !$( "<a>" ).outerWidth( 1 ).jquery ) { + $.each( [ "Width", "Height" ], function( i, name ) { + var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ], + type = name.toLowerCase(), + orig = { + innerWidth: $.fn.innerWidth, + innerHeight: $.fn.innerHeight, + outerWidth: $.fn.outerWidth, + outerHeight: $.fn.outerHeight + }; + + function reduce( elem, size, border, margin ) { + $.each( side, function() { + size -= parseFloat( $.css( elem, "padding" + this ) ) || 0; + if ( border ) { + size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0; + } + if ( margin ) { + size -= parseFloat( $.css( elem, "margin" + this ) ) || 0; + } + }); + return size; + } + + $.fn[ "inner" + name ] = function( size ) { + if ( size === undefined ) { + return orig[ "inner" + name ].call( this ); + } + + return this.each(function() { + $( this ).css( type, reduce( this, size ) + "px" ); + }); + }; + + $.fn[ "outer" + name] = function( size, margin ) { + if ( typeof size !== "number" ) { + return orig[ "outer" + name ].call( this, size ); + } + + return this.each(function() { + $( this).css( type, reduce( this, size, true, margin ) + "px" ); + }); + }; + }); +} + +// support: jQuery <1.8 +if ( !$.fn.addBack ) { + $.fn.addBack = function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + }; +} + +// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413) +if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) { + $.fn.removeData = (function( removeData ) { + return function( key ) { + if ( arguments.length ) { + return removeData.call( this, $.camelCase( key ) ); + } else { + return removeData.call( this ); + } + }; + })( $.fn.removeData ); +} + +// deprecated +$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() ); + +$.fn.extend({ + focus: (function( orig ) { + return function( delay, fn ) { + return typeof delay === "number" ? + this.each(function() { + var elem = this; + setTimeout(function() { + $( elem ).focus(); + if ( fn ) { + fn.call( elem ); + } + }, delay ); + }) : + orig.apply( this, arguments ); + }; + })( $.fn.focus ), + + disableSelection: (function() { + var eventType = "onselectstart" in document.createElement( "div" ) ? + "selectstart" : + "mousedown"; + + return function() { + return this.bind( eventType + ".ui-disableSelection", function( event ) { + event.preventDefault(); + }); + }; + })(), + + enableSelection: function() { + return this.unbind( ".ui-disableSelection" ); + }, + + zIndex: function( zIndex ) { + if ( zIndex !== undefined ) { + return this.css( "zIndex", zIndex ); + } + + if ( this.length ) { + var elem = $( this[ 0 ] ), position, value; + while ( elem.length && elem[ 0 ] !== document ) { + // Ignore z-index if position is set to a value where z-index is ignored by the browser + // This makes behavior of this function consistent across browsers + // WebKit always returns auto if the element is positioned + position = elem.css( "position" ); + if ( position === "absolute" || position === "relative" || position === "fixed" ) { + // IE returns 0 when zIndex is not specified + // other browsers return a string + // we ignore the case of nested elements with an explicit value of 0 + // <div style="z-index: -10;"><div style="z-index: 0;"></div></div> + value = parseInt( elem.css( "zIndex" ), 10 ); + if ( !isNaN( value ) && value !== 0 ) { + return value; + } + } + elem = elem.parent(); + } + } + + return 0; + } +}); + +// $.ui.plugin is deprecated. Use $.widget() extensions instead. +$.ui.plugin = { + add: function( module, option, set ) { + var i, + proto = $.ui[ module ].prototype; + for ( i in set ) { + proto.plugins[ i ] = proto.plugins[ i ] || []; + proto.plugins[ i ].push( [ option, set[ i ] ] ); + } + }, + call: function( instance, name, args, allowDisconnected ) { + var i, + set = instance.plugins[ name ]; + + if ( !set ) { + return; + } + + if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) { + return; + } + + for ( i = 0; i < set.length; i++ ) { + if ( instance.options[ set[ i ][ 0 ] ] ) { + set[ i ][ 1 ].apply( instance.element, args ); + } + } + } +}; + + +/*! + * jQuery UI Widget 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/jQuery.widget/ + */ + + +var widget_uuid = 0, + widget_slice = Array.prototype.slice; + +$.cleanData = (function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; (elem = elems[i]) != null; i++ ) { + try { + + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + + // http://bugs.jquery.com/ticket/8235 + } catch ( e ) {} + } + orig( elems ); + }; +})( $.cleanData ); + +$.widget = function( name, base, prototype ) { + var fullName, existingConstructor, constructor, basePrototype, + // proxiedPrototype allows the provided prototype to remain unmodified + // so that it can be used as a mixin for multiple widgets (#8876) + proxiedPrototype = {}, + namespace = name.split( "." )[ 0 ]; + + name = name.split( "." )[ 1 ]; + fullName = namespace + "-" + name; + + if ( !prototype ) { + prototype = base; + base = $.Widget; + } + + // create selector for plugin + $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) { + return !!$.data( elem, fullName ); + }; + + $[ namespace ] = $[ namespace ] || {}; + existingConstructor = $[ namespace ][ name ]; + constructor = $[ namespace ][ name ] = function( options, element ) { + // allow instantiation without "new" keyword + if ( !this._createWidget ) { + return new constructor( options, element ); + } + + // allow instantiation without initializing for simple inheritance + // must use "new" keyword (the code above always passes args) + if ( arguments.length ) { + this._createWidget( options, element ); + } + }; + // extend with the existing constructor to carry over any static properties + $.extend( constructor, existingConstructor, { + version: prototype.version, + // copy the object used to create the prototype in case we need to + // redefine the widget later + _proto: $.extend( {}, prototype ), + // track widgets that inherit from this widget in case this widget is + // redefined after a widget inherits from it + _childConstructors: [] + }); + + basePrototype = new base(); + // we need to make the options hash a property directly on the new instance + // otherwise we'll modify the options hash on the prototype that we're + // inheriting from + basePrototype.options = $.widget.extend( {}, basePrototype.options ); + $.each( prototype, function( prop, value ) { + if ( !$.isFunction( value ) ) { + proxiedPrototype[ prop ] = value; + return; + } + proxiedPrototype[ prop ] = (function() { + var _super = function() { + return base.prototype[ prop ].apply( this, arguments ); + }, + _superApply = function( args ) { + return base.prototype[ prop ].apply( this, args ); + }; + return function() { + var __super = this._super, + __superApply = this._superApply, + returnValue; + + this._super = _super; + this._superApply = _superApply; + + returnValue = value.apply( this, arguments ); + + this._super = __super; + this._superApply = __superApply; + + return returnValue; + }; + })(); + }); + constructor.prototype = $.widget.extend( basePrototype, { + // TODO: remove support for widgetEventPrefix + // always use the name + a colon as the prefix, e.g., draggable:start + // don't prefix for widgets that aren't DOM-based + widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name + }, proxiedPrototype, { + constructor: constructor, + namespace: namespace, + widgetName: name, + widgetFullName: fullName + }); + + // If this widget is being redefined then we need to find all widgets that + // are inheriting from it and redefine all of them so that they inherit from + // the new version of this widget. We're essentially trying to replace one + // level in the prototype chain. + if ( existingConstructor ) { + $.each( existingConstructor._childConstructors, function( i, child ) { + var childPrototype = child.prototype; + + // redefine the child widget using the same prototype that was + // originally used, but inherit from the new version of the base + $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto ); + }); + // remove the list of existing child constructors from the old constructor + // so the old child constructors can be garbage collected + delete existingConstructor._childConstructors; + } else { + base._childConstructors.push( constructor ); + } + + $.widget.bridge( name, constructor ); + + return constructor; +}; + +$.widget.extend = function( target ) { + var input = widget_slice.call( arguments, 1 ), + inputIndex = 0, + inputLength = input.length, + key, + value; + for ( ; inputIndex < inputLength; inputIndex++ ) { + for ( key in input[ inputIndex ] ) { + value = input[ inputIndex ][ key ]; + if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) { + // Clone objects + if ( $.isPlainObject( value ) ) { + target[ key ] = $.isPlainObject( target[ key ] ) ? + $.widget.extend( {}, target[ key ], value ) : + // Don't extend strings, arrays, etc. with objects + $.widget.extend( {}, value ); + // Copy everything else by reference + } else { + target[ key ] = value; + } + } + } + } + return target; +}; + +$.widget.bridge = function( name, object ) { + var fullName = object.prototype.widgetFullName || name; + $.fn[ name ] = function( options ) { + var isMethodCall = typeof options === "string", + args = widget_slice.call( arguments, 1 ), + returnValue = this; + + if ( isMethodCall ) { + this.each(function() { + var methodValue, + instance = $.data( this, fullName ); + if ( options === "instance" ) { + returnValue = instance; + return false; + } + if ( !instance ) { + return $.error( "cannot call methods on " + name + " prior to initialization; " + + "attempted to call method '" + options + "'" ); + } + if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) { + return $.error( "no such method '" + options + "' for " + name + " widget instance" ); + } + methodValue = instance[ options ].apply( instance, args ); + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue && methodValue.jquery ? + returnValue.pushStack( methodValue.get() ) : + methodValue; + return false; + } + }); + } else { + + // Allow multiple hashes to be passed on init + if ( args.length ) { + options = $.widget.extend.apply( null, [ options ].concat(args) ); + } + + this.each(function() { + var instance = $.data( this, fullName ); + if ( instance ) { + instance.option( options || {} ); + if ( instance._init ) { + instance._init(); + } + } else { + $.data( this, fullName, new object( options, this ) ); + } + }); + } + + return returnValue; + }; +}; + +$.Widget = function( /* options, element */ ) {}; +$.Widget._childConstructors = []; + +$.Widget.prototype = { + widgetName: "widget", + widgetEventPrefix: "", + defaultElement: "<div>", + options: { + disabled: false, + + // callbacks + create: null + }, + _createWidget: function( options, element ) { + element = $( element || this.defaultElement || this )[ 0 ]; + this.element = $( element ); + this.uuid = widget_uuid++; + this.eventNamespace = "." + this.widgetName + this.uuid; + + this.bindings = $(); + this.hoverable = $(); + this.focusable = $(); + + if ( element !== this ) { + $.data( element, this.widgetFullName, this ); + this._on( true, this.element, { + remove: function( event ) { + if ( event.target === element ) { + this.destroy(); + } + } + }); + this.document = $( element.style ? + // element within the document + element.ownerDocument : + // element is window or document + element.document || element ); + this.window = $( this.document[0].defaultView || this.document[0].parentWindow ); + } + + this.options = $.widget.extend( {}, + this.options, + this._getCreateOptions(), + options ); + + this._create(); + this._trigger( "create", null, this._getCreateEventData() ); + this._init(); + }, + _getCreateOptions: $.noop, + _getCreateEventData: $.noop, + _create: $.noop, + _init: $.noop, + + destroy: function() { + this._destroy(); + // we can probably remove the unbind calls in 2.0 + // all event bindings should go through this._on() + this.element + .unbind( this.eventNamespace ) + .removeData( this.widgetFullName ) + // support: jquery <1.6.3 + // http://bugs.jquery.com/ticket/9413 + .removeData( $.camelCase( this.widgetFullName ) ); + this.widget() + .unbind( this.eventNamespace ) + .removeAttr( "aria-disabled" ) + .removeClass( + this.widgetFullName + "-disabled " + + "ui-state-disabled" ); + + // clean up events and states + this.bindings.unbind( this.eventNamespace ); + this.hoverable.removeClass( "ui-state-hover" ); + this.focusable.removeClass( "ui-state-focus" ); + }, + _destroy: $.noop, + + widget: function() { + return this.element; + }, + + option: function( key, value ) { + var options = key, + parts, + curOption, + i; + + if ( arguments.length === 0 ) { + // don't return a reference to the internal hash + return $.widget.extend( {}, this.options ); + } + + if ( typeof key === "string" ) { + // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } + options = {}; + parts = key.split( "." ); + key = parts.shift(); + if ( parts.length ) { + curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); + for ( i = 0; i < parts.length - 1; i++ ) { + curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; + curOption = curOption[ parts[ i ] ]; + } + key = parts.pop(); + if ( arguments.length === 1 ) { + return curOption[ key ] === undefined ? null : curOption[ key ]; + } + curOption[ key ] = value; + } else { + if ( arguments.length === 1 ) { + return this.options[ key ] === undefined ? null : this.options[ key ]; + } + options[ key ] = value; + } + } + + this._setOptions( options ); + + return this; + }, + _setOptions: function( options ) { + var key; + + for ( key in options ) { + this._setOption( key, options[ key ] ); + } + + return this; + }, + _setOption: function( key, value ) { + this.options[ key ] = value; + + if ( key === "disabled" ) { + this.widget() + .toggleClass( this.widgetFullName + "-disabled", !!value ); + + // If the widget is becoming disabled, then nothing is interactive + if ( value ) { + this.hoverable.removeClass( "ui-state-hover" ); + this.focusable.removeClass( "ui-state-focus" ); + } + } + + return this; + }, + + enable: function() { + return this._setOptions({ disabled: false }); + }, + disable: function() { + return this._setOptions({ disabled: true }); + }, + + _on: function( suppressDisabledCheck, element, handlers ) { + var delegateElement, + instance = this; + + // no suppressDisabledCheck flag, shuffle arguments + if ( typeof suppressDisabledCheck !== "boolean" ) { + handlers = element; + element = suppressDisabledCheck; + suppressDisabledCheck = false; + } + + // no element argument, shuffle and use this.element + if ( !handlers ) { + handlers = element; + element = this.element; + delegateElement = this.widget(); + } else { + element = delegateElement = $( element ); + this.bindings = this.bindings.add( element ); + } + + $.each( handlers, function( event, handler ) { + function handlerProxy() { + // allow widgets to customize the disabled handling + // - disabled as an array instead of boolean + // - disabled class as method for disabling individual parts + if ( !suppressDisabledCheck && + ( instance.options.disabled === true || + $( this ).hasClass( "ui-state-disabled" ) ) ) { + return; + } + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + + // copy the guid so direct unbinding works + if ( typeof handler !== "string" ) { + handlerProxy.guid = handler.guid = + handler.guid || handlerProxy.guid || $.guid++; + } + + var match = event.match( /^([\w:-]*)\s*(.*)$/ ), + eventName = match[1] + instance.eventNamespace, + selector = match[2]; + if ( selector ) { + delegateElement.delegate( selector, eventName, handlerProxy ); + } else { + element.bind( eventName, handlerProxy ); + } + }); + }, + + _off: function( element, eventName ) { + eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + + this.eventNamespace; + element.unbind( eventName ).undelegate( eventName ); + + // Clear the stack to avoid memory leaks (#10056) + this.bindings = $( this.bindings.not( element ).get() ); + this.focusable = $( this.focusable.not( element ).get() ); + this.hoverable = $( this.hoverable.not( element ).get() ); + }, + + _delay: function( handler, delay ) { + function handlerProxy() { + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + var instance = this; + return setTimeout( handlerProxy, delay || 0 ); + }, + + _hoverable: function( element ) { + this.hoverable = this.hoverable.add( element ); + this._on( element, { + mouseenter: function( event ) { + $( event.currentTarget ).addClass( "ui-state-hover" ); + }, + mouseleave: function( event ) { + $( event.currentTarget ).removeClass( "ui-state-hover" ); + } + }); + }, + + _focusable: function( element ) { + this.focusable = this.focusable.add( element ); + this._on( element, { + focusin: function( event ) { + $( event.currentTarget ).addClass( "ui-state-focus" ); + }, + focusout: function( event ) { + $( event.currentTarget ).removeClass( "ui-state-focus" ); + } + }); + }, + + _trigger: function( type, event, data ) { + var prop, orig, + callback = this.options[ type ]; + + data = data || {}; + event = $.Event( event ); + event.type = ( type === this.widgetEventPrefix ? + type : + this.widgetEventPrefix + type ).toLowerCase(); + // the original event may come from any element + // so we need to reset the target on the new event + event.target = this.element[ 0 ]; + + // copy original event properties over to the new event + orig = event.originalEvent; + if ( orig ) { + for ( prop in orig ) { + if ( !( prop in event ) ) { + event[ prop ] = orig[ prop ]; + } + } + } + + this.element.trigger( event, data ); + return !( $.isFunction( callback ) && + callback.apply( this.element[0], [ event ].concat( data ) ) === false || + event.isDefaultPrevented() ); + } +}; + +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { + $.Widget.prototype[ "_" + method ] = function( element, options, callback ) { + if ( typeof options === "string" ) { + options = { effect: options }; + } + var hasOptions, + effectName = !options ? + method : + options === true || typeof options === "number" ? + defaultEffect : + options.effect || defaultEffect; + options = options || {}; + if ( typeof options === "number" ) { + options = { duration: options }; + } + hasOptions = !$.isEmptyObject( options ); + options.complete = callback; + if ( options.delay ) { + element.delay( options.delay ); + } + if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { + element[ method ]( options ); + } else if ( effectName !== method && element[ effectName ] ) { + element[ effectName ]( options.duration, options.easing, callback ); + } else { + element.queue(function( next ) { + $( this )[ method ](); + if ( callback ) { + callback.call( element[ 0 ] ); + } + next(); + }); + } + }; +}); + +var widget = $.widget; + + +/*! + * jQuery UI Mouse 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/mouse/ + */ + + +var mouseHandled = false; +$( document ).mouseup( function() { + mouseHandled = false; +}); + +var mouse = $.widget("ui.mouse", { + version: "1.11.4", + options: { + cancel: "input,textarea,button,select,option", + distance: 1, + delay: 0 + }, + _mouseInit: function() { + var that = this; + + this.element + .bind("mousedown." + this.widgetName, function(event) { + return that._mouseDown(event); + }) + .bind("click." + this.widgetName, function(event) { + if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) { + $.removeData(event.target, that.widgetName + ".preventClickEvent"); + event.stopImmediatePropagation(); + return false; + } + }); + + this.started = false; + }, + + // TODO: make sure destroying one instance of mouse doesn't mess with + // other instances of mouse + _mouseDestroy: function() { + this.element.unbind("." + this.widgetName); + if ( this._mouseMoveDelegate ) { + this.document + .unbind("mousemove." + this.widgetName, this._mouseMoveDelegate) + .unbind("mouseup." + this.widgetName, this._mouseUpDelegate); + } + }, + + _mouseDown: function(event) { + // don't let more than one widget handle mouseStart + if ( mouseHandled ) { + return; + } + + this._mouseMoved = false; + + // we may have missed mouseup (out of window) + (this._mouseStarted && this._mouseUp(event)); + + this._mouseDownEvent = event; + + var that = this, + btnIsLeft = (event.which === 1), + // event.target.nodeName works around a bug in IE 8 with + // disabled inputs (#7620) + elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false); + if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { + return true; + } + + this.mouseDelayMet = !this.options.delay; + if (!this.mouseDelayMet) { + this._mouseDelayTimer = setTimeout(function() { + that.mouseDelayMet = true; + }, this.options.delay); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = (this._mouseStart(event) !== false); + if (!this._mouseStarted) { + event.preventDefault(); + return true; + } + } + + // Click event may never have fired (Gecko & Opera) + if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) { + $.removeData(event.target, this.widgetName + ".preventClickEvent"); + } + + // these delegates are required to keep context + this._mouseMoveDelegate = function(event) { + return that._mouseMove(event); + }; + this._mouseUpDelegate = function(event) { + return that._mouseUp(event); + }; + + this.document + .bind( "mousemove." + this.widgetName, this._mouseMoveDelegate ) + .bind( "mouseup." + this.widgetName, this._mouseUpDelegate ); + + event.preventDefault(); + + mouseHandled = true; + return true; + }, + + _mouseMove: function(event) { + // Only check for mouseups outside the document if you've moved inside the document + // at least once. This prevents the firing of mouseup in the case of IE<9, which will + // fire a mousemove event if content is placed under the cursor. See #7778 + // Support: IE <9 + if ( this._mouseMoved ) { + // IE mouseup check - mouseup happened when mouse was out of window + if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) { + return this._mouseUp(event); + + // Iframe mouseup check - mouseup occurred in another document + } else if ( !event.which ) { + return this._mouseUp( event ); + } + } + + if ( event.which || event.button ) { + this._mouseMoved = true; + } + + if (this._mouseStarted) { + this._mouseDrag(event); + return event.preventDefault(); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = + (this._mouseStart(this._mouseDownEvent, event) !== false); + (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event)); + } + + return !this._mouseStarted; + }, + + _mouseUp: function(event) { + this.document + .unbind( "mousemove." + this.widgetName, this._mouseMoveDelegate ) + .unbind( "mouseup." + this.widgetName, this._mouseUpDelegate ); + + if (this._mouseStarted) { + this._mouseStarted = false; + + if (event.target === this._mouseDownEvent.target) { + $.data(event.target, this.widgetName + ".preventClickEvent", true); + } + + this._mouseStop(event); + } + + mouseHandled = false; + return false; + }, + + _mouseDistanceMet: function(event) { + return (Math.max( + Math.abs(this._mouseDownEvent.pageX - event.pageX), + Math.abs(this._mouseDownEvent.pageY - event.pageY) + ) >= this.options.distance + ); + }, + + _mouseDelayMet: function(/* event */) { + return this.mouseDelayMet; + }, + + // These are placeholder methods, to be overriden by extending plugin + _mouseStart: function(/* event */) {}, + _mouseDrag: function(/* event */) {}, + _mouseStop: function(/* event */) {}, + _mouseCapture: function(/* event */) { return true; } +}); + + +/*! + * jQuery UI Position 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/position/ + */ + +(function() { + +$.ui = $.ui || {}; + +var cachedScrollbarWidth, supportsOffsetFractions, + max = Math.max, + abs = Math.abs, + round = Math.round, + rhorizontal = /left|center|right/, + rvertical = /top|center|bottom/, + roffset = /[\+\-]\d+(\.[\d]+)?%?/, + rposition = /^\w+/, + rpercent = /%$/, + _position = $.fn.position; + +function getOffsets( offsets, width, height ) { + return [ + parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ), + parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 ) + ]; +} + +function parseCss( element, property ) { + return parseInt( $.css( element, property ), 10 ) || 0; +} + +function getDimensions( elem ) { + var raw = elem[0]; + if ( raw.nodeType === 9 ) { + return { + width: elem.width(), + height: elem.height(), + offset: { top: 0, left: 0 } + }; + } + if ( $.isWindow( raw ) ) { + return { + width: elem.width(), + height: elem.height(), + offset: { top: elem.scrollTop(), left: elem.scrollLeft() } + }; + } + if ( raw.preventDefault ) { + return { + width: 0, + height: 0, + offset: { top: raw.pageY, left: raw.pageX } + }; + } + return { + width: elem.outerWidth(), + height: elem.outerHeight(), + offset: elem.offset() + }; +} + +$.position = { + scrollbarWidth: function() { + if ( cachedScrollbarWidth !== undefined ) { + return cachedScrollbarWidth; + } + var w1, w2, + div = $( "<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ), + innerDiv = div.children()[0]; + + $( "body" ).append( div ); + w1 = innerDiv.offsetWidth; + div.css( "overflow", "scroll" ); + + w2 = innerDiv.offsetWidth; + + if ( w1 === w2 ) { + w2 = div[0].clientWidth; + } + + div.remove(); + + return (cachedScrollbarWidth = w1 - w2); + }, + getScrollInfo: function( within ) { + var overflowX = within.isWindow || within.isDocument ? "" : + within.element.css( "overflow-x" ), + overflowY = within.isWindow || within.isDocument ? "" : + within.element.css( "overflow-y" ), + hasOverflowX = overflowX === "scroll" || + ( overflowX === "auto" && within.width < within.element[0].scrollWidth ), + hasOverflowY = overflowY === "scroll" || + ( overflowY === "auto" && within.height < within.element[0].scrollHeight ); + return { + width: hasOverflowY ? $.position.scrollbarWidth() : 0, + height: hasOverflowX ? $.position.scrollbarWidth() : 0 + }; + }, + getWithinInfo: function( element ) { + var withinElement = $( element || window ), + isWindow = $.isWindow( withinElement[0] ), + isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9; + return { + element: withinElement, + isWindow: isWindow, + isDocument: isDocument, + offset: withinElement.offset() || { left: 0, top: 0 }, + scrollLeft: withinElement.scrollLeft(), + scrollTop: withinElement.scrollTop(), + + // support: jQuery 1.6.x + // jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows + width: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(), + height: isWindow || isDocument ? withinElement.height() : withinElement.outerHeight() + }; + } +}; + +$.fn.position = function( options ) { + if ( !options || !options.of ) { + return _position.apply( this, arguments ); + } + + // make a copy, we don't want to modify arguments + options = $.extend( {}, options ); + + var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions, + target = $( options.of ), + within = $.position.getWithinInfo( options.within ), + scrollInfo = $.position.getScrollInfo( within ), + collision = ( options.collision || "flip" ).split( " " ), + offsets = {}; + + dimensions = getDimensions( target ); + if ( target[0].preventDefault ) { + // force left top to allow flipping + options.at = "left top"; + } + targetWidth = dimensions.width; + targetHeight = dimensions.height; + targetOffset = dimensions.offset; + // clone to reuse original targetOffset later + basePosition = $.extend( {}, targetOffset ); + + // force my and at to have valid horizontal and vertical positions + // if a value is missing or invalid, it will be converted to center + $.each( [ "my", "at" ], function() { + var pos = ( options[ this ] || "" ).split( " " ), + horizontalOffset, + verticalOffset; + + if ( pos.length === 1) { + pos = rhorizontal.test( pos[ 0 ] ) ? + pos.concat( [ "center" ] ) : + rvertical.test( pos[ 0 ] ) ? + [ "center" ].concat( pos ) : + [ "center", "center" ]; + } + pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center"; + pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center"; + + // calculate offsets + horizontalOffset = roffset.exec( pos[ 0 ] ); + verticalOffset = roffset.exec( pos[ 1 ] ); + offsets[ this ] = [ + horizontalOffset ? horizontalOffset[ 0 ] : 0, + verticalOffset ? verticalOffset[ 0 ] : 0 + ]; + + // reduce to just the positions without the offsets + options[ this ] = [ + rposition.exec( pos[ 0 ] )[ 0 ], + rposition.exec( pos[ 1 ] )[ 0 ] + ]; + }); + + // normalize collision option + if ( collision.length === 1 ) { + collision[ 1 ] = collision[ 0 ]; + } + + if ( options.at[ 0 ] === "right" ) { + basePosition.left += targetWidth; + } else if ( options.at[ 0 ] === "center" ) { + basePosition.left += targetWidth / 2; + } + + if ( options.at[ 1 ] === "bottom" ) { + basePosition.top += targetHeight; + } else if ( options.at[ 1 ] === "center" ) { + basePosition.top += targetHeight / 2; + } + + atOffset = getOffsets( offsets.at, targetWidth, targetHeight ); + basePosition.left += atOffset[ 0 ]; + basePosition.top += atOffset[ 1 ]; + + return this.each(function() { + var collisionPosition, using, + elem = $( this ), + elemWidth = elem.outerWidth(), + elemHeight = elem.outerHeight(), + marginLeft = parseCss( this, "marginLeft" ), + marginTop = parseCss( this, "marginTop" ), + collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width, + collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height, + position = $.extend( {}, basePosition ), + myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() ); + + if ( options.my[ 0 ] === "right" ) { + position.left -= elemWidth; + } else if ( options.my[ 0 ] === "center" ) { + position.left -= elemWidth / 2; + } + + if ( options.my[ 1 ] === "bottom" ) { + position.top -= elemHeight; + } else if ( options.my[ 1 ] === "center" ) { + position.top -= elemHeight / 2; + } + + position.left += myOffset[ 0 ]; + position.top += myOffset[ 1 ]; + + // if the browser doesn't support fractions, then round for consistent results + if ( !supportsOffsetFractions ) { + position.left = round( position.left ); + position.top = round( position.top ); + } + + collisionPosition = { + marginLeft: marginLeft, + marginTop: marginTop + }; + + $.each( [ "left", "top" ], function( i, dir ) { + if ( $.ui.position[ collision[ i ] ] ) { + $.ui.position[ collision[ i ] ][ dir ]( position, { + targetWidth: targetWidth, + targetHeight: targetHeight, + elemWidth: elemWidth, + elemHeight: elemHeight, + collisionPosition: collisionPosition, + collisionWidth: collisionWidth, + collisionHeight: collisionHeight, + offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ], + my: options.my, + at: options.at, + within: within, + elem: elem + }); + } + }); + + if ( options.using ) { + // adds feedback as second argument to using callback, if present + using = function( props ) { + var left = targetOffset.left - position.left, + right = left + targetWidth - elemWidth, + top = targetOffset.top - position.top, + bottom = top + targetHeight - elemHeight, + feedback = { + target: { + element: target, + left: targetOffset.left, + top: targetOffset.top, + width: targetWidth, + height: targetHeight + }, + element: { + element: elem, + left: position.left, + top: position.top, + width: elemWidth, + height: elemHeight + }, + horizontal: right < 0 ? "left" : left > 0 ? "right" : "center", + vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle" + }; + if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) { + feedback.horizontal = "center"; + } + if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) { + feedback.vertical = "middle"; + } + if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) { + feedback.important = "horizontal"; + } else { + feedback.important = "vertical"; + } + options.using.call( this, props, feedback ); + }; + } + + elem.offset( $.extend( position, { using: using } ) ); + }); +}; + +$.ui.position = { + fit: { + left: function( position, data ) { + var within = data.within, + withinOffset = within.isWindow ? within.scrollLeft : within.offset.left, + outerWidth = within.width, + collisionPosLeft = position.left - data.collisionPosition.marginLeft, + overLeft = withinOffset - collisionPosLeft, + overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset, + newOverRight; + + // element is wider than within + if ( data.collisionWidth > outerWidth ) { + // element is initially over the left side of within + if ( overLeft > 0 && overRight <= 0 ) { + newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset; + position.left += overLeft - newOverRight; + // element is initially over right side of within + } else if ( overRight > 0 && overLeft <= 0 ) { + position.left = withinOffset; + // element is initially over both left and right sides of within + } else { + if ( overLeft > overRight ) { + position.left = withinOffset + outerWidth - data.collisionWidth; + } else { + position.left = withinOffset; + } + } + // too far left -> align with left edge + } else if ( overLeft > 0 ) { + position.left += overLeft; + // too far right -> align with right edge + } else if ( overRight > 0 ) { + position.left -= overRight; + // adjust based on position and margin + } else { + position.left = max( position.left - collisionPosLeft, position.left ); + } + }, + top: function( position, data ) { + var within = data.within, + withinOffset = within.isWindow ? within.scrollTop : within.offset.top, + outerHeight = data.within.height, + collisionPosTop = position.top - data.collisionPosition.marginTop, + overTop = withinOffset - collisionPosTop, + overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset, + newOverBottom; + + // element is taller than within + if ( data.collisionHeight > outerHeight ) { + // element is initially over the top of within + if ( overTop > 0 && overBottom <= 0 ) { + newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset; + position.top += overTop - newOverBottom; + // element is initially over bottom of within + } else if ( overBottom > 0 && overTop <= 0 ) { + position.top = withinOffset; + // element is initially over both top and bottom of within + } else { + if ( overTop > overBottom ) { + position.top = withinOffset + outerHeight - data.collisionHeight; + } else { + position.top = withinOffset; + } + } + // too far up -> align with top + } else if ( overTop > 0 ) { + position.top += overTop; + // too far down -> align with bottom edge + } else if ( overBottom > 0 ) { + position.top -= overBottom; + // adjust based on position and margin + } else { + position.top = max( position.top - collisionPosTop, position.top ); + } + } + }, + flip: { + left: function( position, data ) { + var within = data.within, + withinOffset = within.offset.left + within.scrollLeft, + outerWidth = within.width, + offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left, + collisionPosLeft = position.left - data.collisionPosition.marginLeft, + overLeft = collisionPosLeft - offsetLeft, + overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft, + myOffset = data.my[ 0 ] === "left" ? + -data.elemWidth : + data.my[ 0 ] === "right" ? + data.elemWidth : + 0, + atOffset = data.at[ 0 ] === "left" ? + data.targetWidth : + data.at[ 0 ] === "right" ? + -data.targetWidth : + 0, + offset = -2 * data.offset[ 0 ], + newOverRight, + newOverLeft; + + if ( overLeft < 0 ) { + newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset; + if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) { + position.left += myOffset + atOffset + offset; + } + } else if ( overRight > 0 ) { + newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft; + if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) { + position.left += myOffset + atOffset + offset; + } + } + }, + top: function( position, data ) { + var within = data.within, + withinOffset = within.offset.top + within.scrollTop, + outerHeight = within.height, + offsetTop = within.isWindow ? within.scrollTop : within.offset.top, + collisionPosTop = position.top - data.collisionPosition.marginTop, + overTop = collisionPosTop - offsetTop, + overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop, + top = data.my[ 1 ] === "top", + myOffset = top ? + -data.elemHeight : + data.my[ 1 ] === "bottom" ? + data.elemHeight : + 0, + atOffset = data.at[ 1 ] === "top" ? + data.targetHeight : + data.at[ 1 ] === "bottom" ? + -data.targetHeight : + 0, + offset = -2 * data.offset[ 1 ], + newOverTop, + newOverBottom; + if ( overTop < 0 ) { + newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset; + if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) { + position.top += myOffset + atOffset + offset; + } + } else if ( overBottom > 0 ) { + newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop; + if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) { + position.top += myOffset + atOffset + offset; + } + } + } + }, + flipfit: { + left: function() { + $.ui.position.flip.left.apply( this, arguments ); + $.ui.position.fit.left.apply( this, arguments ); + }, + top: function() { + $.ui.position.flip.top.apply( this, arguments ); + $.ui.position.fit.top.apply( this, arguments ); + } + } +}; + +// fraction support test +(function() { + var testElement, testElementParent, testElementStyle, offsetLeft, i, + body = document.getElementsByTagName( "body" )[ 0 ], + div = document.createElement( "div" ); + + //Create a "fake body" for testing based on method used in jQuery.support + testElement = document.createElement( body ? "div" : "body" ); + testElementStyle = { + visibility: "hidden", + width: 0, + height: 0, + border: 0, + margin: 0, + background: "none" + }; + if ( body ) { + $.extend( testElementStyle, { + position: "absolute", + left: "-1000px", + top: "-1000px" + }); + } + for ( i in testElementStyle ) { + testElement.style[ i ] = testElementStyle[ i ]; + } + testElement.appendChild( div ); + testElementParent = body || document.documentElement; + testElementParent.insertBefore( testElement, testElementParent.firstChild ); + + div.style.cssText = "position: absolute; left: 10.7432222px;"; + + offsetLeft = $( div ).offset().left; + supportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11; + + testElement.innerHTML = ""; + testElementParent.removeChild( testElement ); +})(); + +})(); + +var position = $.ui.position; + + +/*! + * jQuery UI Accordion 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/accordion/ + */ + + +var accordion = $.widget( "ui.accordion", { + version: "1.11.4", + options: { + active: 0, + animate: {}, + collapsible: false, + event: "click", + header: "> li > :first-child,> :not(li):even", + heightStyle: "auto", + icons: { + activeHeader: "ui-icon-triangle-1-s", + header: "ui-icon-triangle-1-e" + }, + + // callbacks + activate: null, + beforeActivate: null + }, + + hideProps: { + borderTopWidth: "hide", + borderBottomWidth: "hide", + paddingTop: "hide", + paddingBottom: "hide", + height: "hide" + }, + + showProps: { + borderTopWidth: "show", + borderBottomWidth: "show", + paddingTop: "show", + paddingBottom: "show", + height: "show" + }, + + _create: function() { + var options = this.options; + this.prevShow = this.prevHide = $(); + this.element.addClass( "ui-accordion ui-widget ui-helper-reset" ) + // ARIA + .attr( "role", "tablist" ); + + // don't allow collapsible: false and active: false / null + if ( !options.collapsible && (options.active === false || options.active == null) ) { + options.active = 0; + } + + this._processPanels(); + // handle negative values + if ( options.active < 0 ) { + options.active += this.headers.length; + } + this._refresh(); + }, + + _getCreateEventData: function() { + return { + header: this.active, + panel: !this.active.length ? $() : this.active.next() + }; + }, + + _createIcons: function() { + var icons = this.options.icons; + if ( icons ) { + $( "<span>" ) + .addClass( "ui-accordion-header-icon ui-icon " + icons.header ) + .prependTo( this.headers ); + this.active.children( ".ui-accordion-header-icon" ) + .removeClass( icons.header ) + .addClass( icons.activeHeader ); + this.headers.addClass( "ui-accordion-icons" ); + } + }, + + _destroyIcons: function() { + this.headers + .removeClass( "ui-accordion-icons" ) + .children( ".ui-accordion-header-icon" ) + .remove(); + }, + + _destroy: function() { + var contents; + + // clean up main element + this.element + .removeClass( "ui-accordion ui-widget ui-helper-reset" ) + .removeAttr( "role" ); + + // clean up headers + this.headers + .removeClass( "ui-accordion-header ui-accordion-header-active ui-state-default " + + "ui-corner-all ui-state-active ui-state-disabled ui-corner-top" ) + .removeAttr( "role" ) + .removeAttr( "aria-expanded" ) + .removeAttr( "aria-selected" ) + .removeAttr( "aria-controls" ) + .removeAttr( "tabIndex" ) + .removeUniqueId(); + + this._destroyIcons(); + + // clean up content panels + contents = this.headers.next() + .removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom " + + "ui-accordion-content ui-accordion-content-active ui-state-disabled" ) + .css( "display", "" ) + .removeAttr( "role" ) + .removeAttr( "aria-hidden" ) + .removeAttr( "aria-labelledby" ) + .removeUniqueId(); + + if ( this.options.heightStyle !== "content" ) { + contents.css( "height", "" ); + } + }, + + _setOption: function( key, value ) { + if ( key === "active" ) { + // _activate() will handle invalid values and update this.options + this._activate( value ); + return; + } + + if ( key === "event" ) { + if ( this.options.event ) { + this._off( this.headers, this.options.event ); + } + this._setupEvents( value ); + } + + this._super( key, value ); + + // setting collapsible: false while collapsed; open first panel + if ( key === "collapsible" && !value && this.options.active === false ) { + this._activate( 0 ); + } + + if ( key === "icons" ) { + this._destroyIcons(); + if ( value ) { + this._createIcons(); + } + } + + // #5332 - opacity doesn't cascade to positioned elements in IE + // so we need to add the disabled class to the headers and panels + if ( key === "disabled" ) { + this.element + .toggleClass( "ui-state-disabled", !!value ) + .attr( "aria-disabled", value ); + this.headers.add( this.headers.next() ) + .toggleClass( "ui-state-disabled", !!value ); + } + }, + + _keydown: function( event ) { + if ( event.altKey || event.ctrlKey ) { + return; + } + + var keyCode = $.ui.keyCode, + length = this.headers.length, + currentIndex = this.headers.index( event.target ), + toFocus = false; + + switch ( event.keyCode ) { + case keyCode.RIGHT: + case keyCode.DOWN: + toFocus = this.headers[ ( currentIndex + 1 ) % length ]; + break; + case keyCode.LEFT: + case keyCode.UP: + toFocus = this.headers[ ( currentIndex - 1 + length ) % length ]; + break; + case keyCode.SPACE: + case keyCode.ENTER: + this._eventHandler( event ); + break; + case keyCode.HOME: + toFocus = this.headers[ 0 ]; + break; + case keyCode.END: + toFocus = this.headers[ length - 1 ]; + break; + } + + if ( toFocus ) { + $( event.target ).attr( "tabIndex", -1 ); + $( toFocus ).attr( "tabIndex", 0 ); + toFocus.focus(); + event.preventDefault(); + } + }, + + _panelKeyDown: function( event ) { + if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) { + $( event.currentTarget ).prev().focus(); + } + }, + + refresh: function() { + var options = this.options; + this._processPanels(); + + // was collapsed or no panel + if ( ( options.active === false && options.collapsible === true ) || !this.headers.length ) { + options.active = false; + this.active = $(); + // active false only when collapsible is true + } else if ( options.active === false ) { + this._activate( 0 ); + // was active, but active panel is gone + } else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) { + // all remaining panel are disabled + if ( this.headers.length === this.headers.find(".ui-state-disabled").length ) { + options.active = false; + this.active = $(); + // activate previous panel + } else { + this._activate( Math.max( 0, options.active - 1 ) ); + } + // was active, active panel still exists + } else { + // make sure active index is correct + options.active = this.headers.index( this.active ); + } + + this._destroyIcons(); + + this._refresh(); + }, + + _processPanels: function() { + var prevHeaders = this.headers, + prevPanels = this.panels; + + this.headers = this.element.find( this.options.header ) + .addClass( "ui-accordion-header ui-state-default ui-corner-all" ); + + this.panels = this.headers.next() + .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" ) + .filter( ":not(.ui-accordion-content-active)" ) + .hide(); + + // Avoid memory leaks (#10056) + if ( prevPanels ) { + this._off( prevHeaders.not( this.headers ) ); + this._off( prevPanels.not( this.panels ) ); + } + }, + + _refresh: function() { + var maxHeight, + options = this.options, + heightStyle = options.heightStyle, + parent = this.element.parent(); + + this.active = this._findActive( options.active ) + .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" ) + .removeClass( "ui-corner-all" ); + this.active.next() + .addClass( "ui-accordion-content-active" ) + .show(); + + this.headers + .attr( "role", "tab" ) + .each(function() { + var header = $( this ), + headerId = header.uniqueId().attr( "id" ), + panel = header.next(), + panelId = panel.uniqueId().attr( "id" ); + header.attr( "aria-controls", panelId ); + panel.attr( "aria-labelledby", headerId ); + }) + .next() + .attr( "role", "tabpanel" ); + + this.headers + .not( this.active ) + .attr({ + "aria-selected": "false", + "aria-expanded": "false", + tabIndex: -1 + }) + .next() + .attr({ + "aria-hidden": "true" + }) + .hide(); + + // make sure at least one header is in the tab order + if ( !this.active.length ) { + this.headers.eq( 0 ).attr( "tabIndex", 0 ); + } else { + this.active.attr({ + "aria-selected": "true", + "aria-expanded": "true", + tabIndex: 0 + }) + .next() + .attr({ + "aria-hidden": "false" + }); + } + + this._createIcons(); + + this._setupEvents( options.event ); + + if ( heightStyle === "fill" ) { + maxHeight = parent.height(); + this.element.siblings( ":visible" ).each(function() { + var elem = $( this ), + position = elem.css( "position" ); + + if ( position === "absolute" || position === "fixed" ) { + return; + } + maxHeight -= elem.outerHeight( true ); + }); + + this.headers.each(function() { + maxHeight -= $( this ).outerHeight( true ); + }); + + this.headers.next() + .each(function() { + $( this ).height( Math.max( 0, maxHeight - + $( this ).innerHeight() + $( this ).height() ) ); + }) + .css( "overflow", "auto" ); + } else if ( heightStyle === "auto" ) { + maxHeight = 0; + this.headers.next() + .each(function() { + maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() ); + }) + .height( maxHeight ); + } + }, + + _activate: function( index ) { + var active = this._findActive( index )[ 0 ]; + + // trying to activate the already active panel + if ( active === this.active[ 0 ] ) { + return; + } + + // trying to collapse, simulate a click on the currently active header + active = active || this.active[ 0 ]; + + this._eventHandler({ + target: active, + currentTarget: active, + preventDefault: $.noop + }); + }, + + _findActive: function( selector ) { + return typeof selector === "number" ? this.headers.eq( selector ) : $(); + }, + + _setupEvents: function( event ) { + var events = { + keydown: "_keydown" + }; + if ( event ) { + $.each( event.split( " " ), function( index, eventName ) { + events[ eventName ] = "_eventHandler"; + }); + } + + this._off( this.headers.add( this.headers.next() ) ); + this._on( this.headers, events ); + this._on( this.headers.next(), { keydown: "_panelKeyDown" }); + this._hoverable( this.headers ); + this._focusable( this.headers ); + }, + + _eventHandler: function( event ) { + var options = this.options, + active = this.active, + clicked = $( event.currentTarget ), + clickedIsActive = clicked[ 0 ] === active[ 0 ], + collapsing = clickedIsActive && options.collapsible, + toShow = collapsing ? $() : clicked.next(), + toHide = active.next(), + eventData = { + oldHeader: active, + oldPanel: toHide, + newHeader: collapsing ? $() : clicked, + newPanel: toShow + }; + + event.preventDefault(); + + if ( + // click on active header, but not collapsible + ( clickedIsActive && !options.collapsible ) || + // allow canceling activation + ( this._trigger( "beforeActivate", event, eventData ) === false ) ) { + return; + } + + options.active = collapsing ? false : this.headers.index( clicked ); + + // when the call to ._toggle() comes after the class changes + // it causes a very odd bug in IE 8 (see #6720) + this.active = clickedIsActive ? $() : clicked; + this._toggle( eventData ); + + // switch classes + // corner classes on the previously active header stay after the animation + active.removeClass( "ui-accordion-header-active ui-state-active" ); + if ( options.icons ) { + active.children( ".ui-accordion-header-icon" ) + .removeClass( options.icons.activeHeader ) + .addClass( options.icons.header ); + } + + if ( !clickedIsActive ) { + clicked + .removeClass( "ui-corner-all" ) + .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" ); + if ( options.icons ) { + clicked.children( ".ui-accordion-header-icon" ) + .removeClass( options.icons.header ) + .addClass( options.icons.activeHeader ); + } + + clicked + .next() + .addClass( "ui-accordion-content-active" ); + } + }, + + _toggle: function( data ) { + var toShow = data.newPanel, + toHide = this.prevShow.length ? this.prevShow : data.oldPanel; + + // handle activating a panel during the animation for another activation + this.prevShow.add( this.prevHide ).stop( true, true ); + this.prevShow = toShow; + this.prevHide = toHide; + + if ( this.options.animate ) { + this._animate( toShow, toHide, data ); + } else { + toHide.hide(); + toShow.show(); + this._toggleComplete( data ); + } + + toHide.attr({ + "aria-hidden": "true" + }); + toHide.prev().attr({ + "aria-selected": "false", + "aria-expanded": "false" + }); + // if we're switching panels, remove the old header from the tab order + // if we're opening from collapsed state, remove the previous header from the tab order + // if we're collapsing, then keep the collapsing header in the tab order + if ( toShow.length && toHide.length ) { + toHide.prev().attr({ + "tabIndex": -1, + "aria-expanded": "false" + }); + } else if ( toShow.length ) { + this.headers.filter(function() { + return parseInt( $( this ).attr( "tabIndex" ), 10 ) === 0; + }) + .attr( "tabIndex", -1 ); + } + + toShow + .attr( "aria-hidden", "false" ) + .prev() + .attr({ + "aria-selected": "true", + "aria-expanded": "true", + tabIndex: 0 + }); + }, + + _animate: function( toShow, toHide, data ) { + var total, easing, duration, + that = this, + adjust = 0, + boxSizing = toShow.css( "box-sizing" ), + down = toShow.length && + ( !toHide.length || ( toShow.index() < toHide.index() ) ), + animate = this.options.animate || {}, + options = down && animate.down || animate, + complete = function() { + that._toggleComplete( data ); + }; + + if ( typeof options === "number" ) { + duration = options; + } + if ( typeof options === "string" ) { + easing = options; + } + // fall back from options to animation in case of partial down settings + easing = easing || options.easing || animate.easing; + duration = duration || options.duration || animate.duration; + + if ( !toHide.length ) { + return toShow.animate( this.showProps, duration, easing, complete ); + } + if ( !toShow.length ) { + return toHide.animate( this.hideProps, duration, easing, complete ); + } + + total = toShow.show().outerHeight(); + toHide.animate( this.hideProps, { + duration: duration, + easing: easing, + step: function( now, fx ) { + fx.now = Math.round( now ); + } + }); + toShow + .hide() + .animate( this.showProps, { + duration: duration, + easing: easing, + complete: complete, + step: function( now, fx ) { + fx.now = Math.round( now ); + if ( fx.prop !== "height" ) { + if ( boxSizing === "content-box" ) { + adjust += fx.now; + } + } else if ( that.options.heightStyle !== "content" ) { + fx.now = Math.round( total - toHide.outerHeight() - adjust ); + adjust = 0; + } + } + }); + }, + + _toggleComplete: function( data ) { + var toHide = data.oldPanel; + + toHide + .removeClass( "ui-accordion-content-active" ) + .prev() + .removeClass( "ui-corner-top" ) + .addClass( "ui-corner-all" ); + + // Work around for rendering bug in IE (#5421) + if ( toHide.length ) { + toHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className; + } + this._trigger( "activate", null, data ); + } +}); + + +/*! + * jQuery UI Menu 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/menu/ + */ + + +var menu = $.widget( "ui.menu", { + version: "1.11.4", + defaultElement: "<ul>", + delay: 300, + options: { + icons: { + submenu: "ui-icon-carat-1-e" + }, + items: "> *", + menus: "ul", + position: { + my: "left-1 top", + at: "right top" + }, + role: "menu", + + // callbacks + blur: null, + focus: null, + select: null + }, + + _create: function() { + this.activeMenu = this.element; + + // Flag used to prevent firing of the click handler + // as the event bubbles up through nested menus + this.mouseHandled = false; + this.element + .uniqueId() + .addClass( "ui-menu ui-widget ui-widget-content" ) + .toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length ) + .attr({ + role: this.options.role, + tabIndex: 0 + }); + + if ( this.options.disabled ) { + this.element + .addClass( "ui-state-disabled" ) + .attr( "aria-disabled", "true" ); + } + + this._on({ + // Prevent focus from sticking to links inside menu after clicking + // them (focus should always stay on UL during navigation). + "mousedown .ui-menu-item": function( event ) { + event.preventDefault(); + }, + "click .ui-menu-item": function( event ) { + var target = $( event.target ); + if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) { + this.select( event ); + + // Only set the mouseHandled flag if the event will bubble, see #9469. + if ( !event.isPropagationStopped() ) { + this.mouseHandled = true; + } + + // Open submenu on click + if ( target.has( ".ui-menu" ).length ) { + this.expand( event ); + } else if ( !this.element.is( ":focus" ) && $( this.document[ 0 ].activeElement ).closest( ".ui-menu" ).length ) { + + // Redirect focus to the menu + this.element.trigger( "focus", [ true ] ); + + // If the active item is on the top level, let it stay active. + // Otherwise, blur the active item since it is no longer visible. + if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) { + clearTimeout( this.timer ); + } + } + } + }, + "mouseenter .ui-menu-item": function( event ) { + // Ignore mouse events while typeahead is active, see #10458. + // Prevents focusing the wrong item when typeahead causes a scroll while the mouse + // is over an item in the menu + if ( this.previousFilter ) { + return; + } + var target = $( event.currentTarget ); + // Remove ui-state-active class from siblings of the newly focused menu item + // to avoid a jump caused by adjacent elements both having a class with a border + target.siblings( ".ui-state-active" ).removeClass( "ui-state-active" ); + this.focus( event, target ); + }, + mouseleave: "collapseAll", + "mouseleave .ui-menu": "collapseAll", + focus: function( event, keepActiveItem ) { + // If there's already an active item, keep it active + // If not, activate the first item + var item = this.active || this.element.find( this.options.items ).eq( 0 ); + + if ( !keepActiveItem ) { + this.focus( event, item ); + } + }, + blur: function( event ) { + this._delay(function() { + if ( !$.contains( this.element[0], this.document[0].activeElement ) ) { + this.collapseAll( event ); + } + }); + }, + keydown: "_keydown" + }); + + this.refresh(); + + // Clicks outside of a menu collapse any open menus + this._on( this.document, { + click: function( event ) { + if ( this._closeOnDocumentClick( event ) ) { + this.collapseAll( event ); + } + + // Reset the mouseHandled flag + this.mouseHandled = false; + } + }); + }, + + _destroy: function() { + // Destroy (sub)menus + this.element + .removeAttr( "aria-activedescendant" ) + .find( ".ui-menu" ).addBack() + .removeClass( "ui-menu ui-widget ui-widget-content ui-menu-icons ui-front" ) + .removeAttr( "role" ) + .removeAttr( "tabIndex" ) + .removeAttr( "aria-labelledby" ) + .removeAttr( "aria-expanded" ) + .removeAttr( "aria-hidden" ) + .removeAttr( "aria-disabled" ) + .removeUniqueId() + .show(); + + // Destroy menu items + this.element.find( ".ui-menu-item" ) + .removeClass( "ui-menu-item" ) + .removeAttr( "role" ) + .removeAttr( "aria-disabled" ) + .removeUniqueId() + .removeClass( "ui-state-hover" ) + .removeAttr( "tabIndex" ) + .removeAttr( "role" ) + .removeAttr( "aria-haspopup" ) + .children().each( function() { + var elem = $( this ); + if ( elem.data( "ui-menu-submenu-carat" ) ) { + elem.remove(); + } + }); + + // Destroy menu dividers + this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" ); + }, + + _keydown: function( event ) { + var match, prev, character, skip, + preventDefault = true; + + switch ( event.keyCode ) { + case $.ui.keyCode.PAGE_UP: + this.previousPage( event ); + break; + case $.ui.keyCode.PAGE_DOWN: + this.nextPage( event ); + break; + case $.ui.keyCode.HOME: + this._move( "first", "first", event ); + break; + case $.ui.keyCode.END: + this._move( "last", "last", event ); + break; + case $.ui.keyCode.UP: + this.previous( event ); + break; + case $.ui.keyCode.DOWN: + this.next( event ); + break; + case $.ui.keyCode.LEFT: + this.collapse( event ); + break; + case $.ui.keyCode.RIGHT: + if ( this.active && !this.active.is( ".ui-state-disabled" ) ) { + this.expand( event ); + } + break; + case $.ui.keyCode.ENTER: + case $.ui.keyCode.SPACE: + this._activate( event ); + break; + case $.ui.keyCode.ESCAPE: + this.collapse( event ); + break; + default: + preventDefault = false; + prev = this.previousFilter || ""; + character = String.fromCharCode( event.keyCode ); + skip = false; + + clearTimeout( this.filterTimer ); + + if ( character === prev ) { + skip = true; + } else { + character = prev + character; + } + + match = this._filterMenuItems( character ); + match = skip && match.index( this.active.next() ) !== -1 ? + this.active.nextAll( ".ui-menu-item" ) : + match; + + // If no matches on the current filter, reset to the last character pressed + // to move down the menu to the first item that starts with that character + if ( !match.length ) { + character = String.fromCharCode( event.keyCode ); + match = this._filterMenuItems( character ); + } + + if ( match.length ) { + this.focus( event, match ); + this.previousFilter = character; + this.filterTimer = this._delay(function() { + delete this.previousFilter; + }, 1000 ); + } else { + delete this.previousFilter; + } + } + + if ( preventDefault ) { + event.preventDefault(); + } + }, + + _activate: function( event ) { + if ( !this.active.is( ".ui-state-disabled" ) ) { + if ( this.active.is( "[aria-haspopup='true']" ) ) { + this.expand( event ); + } else { + this.select( event ); + } + } + }, + + refresh: function() { + var menus, items, + that = this, + icon = this.options.icons.submenu, + submenus = this.element.find( this.options.menus ); + + this.element.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length ); + + // Initialize nested menus + submenus.filter( ":not(.ui-menu)" ) + .addClass( "ui-menu ui-widget ui-widget-content ui-front" ) + .hide() + .attr({ + role: this.options.role, + "aria-hidden": "true", + "aria-expanded": "false" + }) + .each(function() { + var menu = $( this ), + item = menu.parent(), + submenuCarat = $( "<span>" ) + .addClass( "ui-menu-icon ui-icon " + icon ) + .data( "ui-menu-submenu-carat", true ); + + item + .attr( "aria-haspopup", "true" ) + .prepend( submenuCarat ); + menu.attr( "aria-labelledby", item.attr( "id" ) ); + }); + + menus = submenus.add( this.element ); + items = menus.find( this.options.items ); + + // Initialize menu-items containing spaces and/or dashes only as dividers + items.not( ".ui-menu-item" ).each(function() { + var item = $( this ); + if ( that._isDivider( item ) ) { + item.addClass( "ui-widget-content ui-menu-divider" ); + } + }); + + // Don't refresh list items that are already adapted + items.not( ".ui-menu-item, .ui-menu-divider" ) + .addClass( "ui-menu-item" ) + .uniqueId() + .attr({ + tabIndex: -1, + role: this._itemRole() + }); + + // Add aria-disabled attribute to any disabled menu item + items.filter( ".ui-state-disabled" ).attr( "aria-disabled", "true" ); + + // If the active item has been removed, blur the menu + if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) { + this.blur(); + } + }, + + _itemRole: function() { + return { + menu: "menuitem", + listbox: "option" + }[ this.options.role ]; + }, + + _setOption: function( key, value ) { + if ( key === "icons" ) { + this.element.find( ".ui-menu-icon" ) + .removeClass( this.options.icons.submenu ) + .addClass( value.submenu ); + } + if ( key === "disabled" ) { + this.element + .toggleClass( "ui-state-disabled", !!value ) + .attr( "aria-disabled", value ); + } + this._super( key, value ); + }, + + focus: function( event, item ) { + var nested, focused; + this.blur( event, event && event.type === "focus" ); + + this._scrollIntoView( item ); + + this.active = item.first(); + focused = this.active.addClass( "ui-state-focus" ).removeClass( "ui-state-active" ); + // Only update aria-activedescendant if there's a role + // otherwise we assume focus is managed elsewhere + if ( this.options.role ) { + this.element.attr( "aria-activedescendant", focused.attr( "id" ) ); + } + + // Highlight active parent menu item, if any + this.active + .parent() + .closest( ".ui-menu-item" ) + .addClass( "ui-state-active" ); + + if ( event && event.type === "keydown" ) { + this._close(); + } else { + this.timer = this._delay(function() { + this._close(); + }, this.delay ); + } + + nested = item.children( ".ui-menu" ); + if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) { + this._startOpening(nested); + } + this.activeMenu = item.parent(); + + this._trigger( "focus", event, { item: item } ); + }, + + _scrollIntoView: function( item ) { + var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight; + if ( this._hasScroll() ) { + borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0; + paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0; + offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop; + scroll = this.activeMenu.scrollTop(); + elementHeight = this.activeMenu.height(); + itemHeight = item.outerHeight(); + + if ( offset < 0 ) { + this.activeMenu.scrollTop( scroll + offset ); + } else if ( offset + itemHeight > elementHeight ) { + this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight ); + } + } + }, + + blur: function( event, fromFocus ) { + if ( !fromFocus ) { + clearTimeout( this.timer ); + } + + if ( !this.active ) { + return; + } + + this.active.removeClass( "ui-state-focus" ); + this.active = null; + + this._trigger( "blur", event, { item: this.active } ); + }, + + _startOpening: function( submenu ) { + clearTimeout( this.timer ); + + // Don't open if already open fixes a Firefox bug that caused a .5 pixel + // shift in the submenu position when mousing over the carat icon + if ( submenu.attr( "aria-hidden" ) !== "true" ) { + return; + } + + this.timer = this._delay(function() { + this._close(); + this._open( submenu ); + }, this.delay ); + }, + + _open: function( submenu ) { + var position = $.extend({ + of: this.active + }, this.options.position ); + + clearTimeout( this.timer ); + this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) ) + .hide() + .attr( "aria-hidden", "true" ); + + submenu + .show() + .removeAttr( "aria-hidden" ) + .attr( "aria-expanded", "true" ) + .position( position ); + }, + + collapseAll: function( event, all ) { + clearTimeout( this.timer ); + this.timer = this._delay(function() { + // If we were passed an event, look for the submenu that contains the event + var currentMenu = all ? this.element : + $( event && event.target ).closest( this.element.find( ".ui-menu" ) ); + + // If we found no valid submenu ancestor, use the main menu to close all sub menus anyway + if ( !currentMenu.length ) { + currentMenu = this.element; + } + + this._close( currentMenu ); + + this.blur( event ); + this.activeMenu = currentMenu; + }, this.delay ); + }, + + // With no arguments, closes the currently active menu - if nothing is active + // it closes all menus. If passed an argument, it will search for menus BELOW + _close: function( startMenu ) { + if ( !startMenu ) { + startMenu = this.active ? this.active.parent() : this.element; + } + + startMenu + .find( ".ui-menu" ) + .hide() + .attr( "aria-hidden", "true" ) + .attr( "aria-expanded", "false" ) + .end() + .find( ".ui-state-active" ).not( ".ui-state-focus" ) + .removeClass( "ui-state-active" ); + }, + + _closeOnDocumentClick: function( event ) { + return !$( event.target ).closest( ".ui-menu" ).length; + }, + + _isDivider: function( item ) { + + // Match hyphen, em dash, en dash + return !/[^\-\u2014\u2013\s]/.test( item.text() ); + }, + + collapse: function( event ) { + var newItem = this.active && + this.active.parent().closest( ".ui-menu-item", this.element ); + if ( newItem && newItem.length ) { + this._close(); + this.focus( event, newItem ); + } + }, + + expand: function( event ) { + var newItem = this.active && + this.active + .children( ".ui-menu " ) + .find( this.options.items ) + .first(); + + if ( newItem && newItem.length ) { + this._open( newItem.parent() ); + + // Delay so Firefox will not hide activedescendant change in expanding submenu from AT + this._delay(function() { + this.focus( event, newItem ); + }); + } + }, + + next: function( event ) { + this._move( "next", "first", event ); + }, + + previous: function( event ) { + this._move( "prev", "last", event ); + }, + + isFirstItem: function() { + return this.active && !this.active.prevAll( ".ui-menu-item" ).length; + }, + + isLastItem: function() { + return this.active && !this.active.nextAll( ".ui-menu-item" ).length; + }, + + _move: function( direction, filter, event ) { + var next; + if ( this.active ) { + if ( direction === "first" || direction === "last" ) { + next = this.active + [ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" ) + .eq( -1 ); + } else { + next = this.active + [ direction + "All" ]( ".ui-menu-item" ) + .eq( 0 ); + } + } + if ( !next || !next.length || !this.active ) { + next = this.activeMenu.find( this.options.items )[ filter ](); + } + + this.focus( event, next ); + }, + + nextPage: function( event ) { + var item, base, height; + + if ( !this.active ) { + this.next( event ); + return; + } + if ( this.isLastItem() ) { + return; + } + if ( this._hasScroll() ) { + base = this.active.offset().top; + height = this.element.height(); + this.active.nextAll( ".ui-menu-item" ).each(function() { + item = $( this ); + return item.offset().top - base - height < 0; + }); + + this.focus( event, item ); + } else { + this.focus( event, this.activeMenu.find( this.options.items ) + [ !this.active ? "first" : "last" ]() ); + } + }, + + previousPage: function( event ) { + var item, base, height; + if ( !this.active ) { + this.next( event ); + return; + } + if ( this.isFirstItem() ) { + return; + } + if ( this._hasScroll() ) { + base = this.active.offset().top; + height = this.element.height(); + this.active.prevAll( ".ui-menu-item" ).each(function() { + item = $( this ); + return item.offset().top - base + height > 0; + }); + + this.focus( event, item ); + } else { + this.focus( event, this.activeMenu.find( this.options.items ).first() ); + } + }, + + _hasScroll: function() { + return this.element.outerHeight() < this.element.prop( "scrollHeight" ); + }, + + select: function( event ) { + // TODO: It should never be possible to not have an active item at this + // point, but the tests don't trigger mouseenter before click. + this.active = this.active || $( event.target ).closest( ".ui-menu-item" ); + var ui = { item: this.active }; + if ( !this.active.has( ".ui-menu" ).length ) { + this.collapseAll( event, true ); + } + this._trigger( "select", event, ui ); + }, + + _filterMenuItems: function(character) { + var escapedCharacter = character.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ), + regex = new RegExp( "^" + escapedCharacter, "i" ); + + return this.activeMenu + .find( this.options.items ) + + // Only match on items, not dividers or other content (#10571) + .filter( ".ui-menu-item" ) + .filter(function() { + return regex.test( $.trim( $( this ).text() ) ); + }); + } +}); + + +/*! + * jQuery UI Autocomplete 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/autocomplete/ + */ + + +$.widget( "ui.autocomplete", { + version: "1.11.4", + defaultElement: "<input>", + options: { + appendTo: null, + autoFocus: false, + delay: 300, + minLength: 1, + position: { + my: "left top", + at: "left bottom", + collision: "none" + }, + source: null, + + // callbacks + change: null, + close: null, + focus: null, + open: null, + response: null, + search: null, + select: null + }, + + requestIndex: 0, + pending: 0, + + _create: function() { + // Some browsers only repeat keydown events, not keypress events, + // so we use the suppressKeyPress flag to determine if we've already + // handled the keydown event. #7269 + // Unfortunately the code for & in keypress is the same as the up arrow, + // so we use the suppressKeyPressRepeat flag to avoid handling keypress + // events when we know the keydown event was used to modify the + // search term. #7799 + var suppressKeyPress, suppressKeyPressRepeat, suppressInput, + nodeName = this.element[ 0 ].nodeName.toLowerCase(), + isTextarea = nodeName === "textarea", + isInput = nodeName === "input"; + + this.isMultiLine = + // Textareas are always multi-line + isTextarea ? true : + // Inputs are always single-line, even if inside a contentEditable element + // IE also treats inputs as contentEditable + isInput ? false : + // All other element types are determined by whether or not they're contentEditable + this.element.prop( "isContentEditable" ); + + this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ]; + this.isNewMenu = true; + + this.element + .addClass( "ui-autocomplete-input" ) + .attr( "autocomplete", "off" ); + + this._on( this.element, { + keydown: function( event ) { + if ( this.element.prop( "readOnly" ) ) { + suppressKeyPress = true; + suppressInput = true; + suppressKeyPressRepeat = true; + return; + } + + suppressKeyPress = false; + suppressInput = false; + suppressKeyPressRepeat = false; + var keyCode = $.ui.keyCode; + switch ( event.keyCode ) { + case keyCode.PAGE_UP: + suppressKeyPress = true; + this._move( "previousPage", event ); + break; + case keyCode.PAGE_DOWN: + suppressKeyPress = true; + this._move( "nextPage", event ); + break; + case keyCode.UP: + suppressKeyPress = true; + this._keyEvent( "previous", event ); + break; + case keyCode.DOWN: + suppressKeyPress = true; + this._keyEvent( "next", event ); + break; + case keyCode.ENTER: + // when menu is open and has focus + if ( this.menu.active ) { + // #6055 - Opera still allows the keypress to occur + // which causes forms to submit + suppressKeyPress = true; + event.preventDefault(); + this.menu.select( event ); + } + break; + case keyCode.TAB: + if ( this.menu.active ) { + this.menu.select( event ); + } + break; + case keyCode.ESCAPE: + if ( this.menu.element.is( ":visible" ) ) { + if ( !this.isMultiLine ) { + this._value( this.term ); + } + this.close( event ); + // Different browsers have different default behavior for escape + // Single press can mean undo or clear + // Double press in IE means clear the whole form + event.preventDefault(); + } + break; + default: + suppressKeyPressRepeat = true; + // search timeout should be triggered before the input value is changed + this._searchTimeout( event ); + break; + } + }, + keypress: function( event ) { + if ( suppressKeyPress ) { + suppressKeyPress = false; + if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) { + event.preventDefault(); + } + return; + } + if ( suppressKeyPressRepeat ) { + return; + } + + // replicate some key handlers to allow them to repeat in Firefox and Opera + var keyCode = $.ui.keyCode; + switch ( event.keyCode ) { + case keyCode.PAGE_UP: + this._move( "previousPage", event ); + break; + case keyCode.PAGE_DOWN: + this._move( "nextPage", event ); + break; + case keyCode.UP: + this._keyEvent( "previous", event ); + break; + case keyCode.DOWN: + this._keyEvent( "next", event ); + break; + } + }, + input: function( event ) { + if ( suppressInput ) { + suppressInput = false; + event.preventDefault(); + return; + } + this._searchTimeout( event ); + }, + focus: function() { + this.selectedItem = null; + this.previous = this._value(); + }, + blur: function( event ) { + if ( this.cancelBlur ) { + delete this.cancelBlur; + return; + } + + clearTimeout( this.searching ); + this.close( event ); + this._change( event ); + } + }); + + this._initSource(); + this.menu = $( "<ul>" ) + .addClass( "ui-autocomplete ui-front" ) + .appendTo( this._appendTo() ) + .menu({ + // disable ARIA support, the live region takes care of that + role: null + }) + .hide() + .menu( "instance" ); + + this._on( this.menu.element, { + mousedown: function( event ) { + // prevent moving focus out of the text field + event.preventDefault(); + + // IE doesn't prevent moving focus even with event.preventDefault() + // so we set a flag to know when we should ignore the blur event + this.cancelBlur = true; + this._delay(function() { + delete this.cancelBlur; + }); + + // clicking on the scrollbar causes focus to shift to the body + // but we can't detect a mouseup or a click immediately afterward + // so we have to track the next mousedown and close the menu if + // the user clicks somewhere outside of the autocomplete + var menuElement = this.menu.element[ 0 ]; + if ( !$( event.target ).closest( ".ui-menu-item" ).length ) { + this._delay(function() { + var that = this; + this.document.one( "mousedown", function( event ) { + if ( event.target !== that.element[ 0 ] && + event.target !== menuElement && + !$.contains( menuElement, event.target ) ) { + that.close(); + } + }); + }); + } + }, + menufocus: function( event, ui ) { + var label, item; + // support: Firefox + // Prevent accidental activation of menu items in Firefox (#7024 #9118) + if ( this.isNewMenu ) { + this.isNewMenu = false; + if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) { + this.menu.blur(); + + this.document.one( "mousemove", function() { + $( event.target ).trigger( event.originalEvent ); + }); + + return; + } + } + + item = ui.item.data( "ui-autocomplete-item" ); + if ( false !== this._trigger( "focus", event, { item: item } ) ) { + // use value to match what will end up in the input, if it was a key event + if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) { + this._value( item.value ); + } + } + + // Announce the value in the liveRegion + label = ui.item.attr( "aria-label" ) || item.value; + if ( label && $.trim( label ).length ) { + this.liveRegion.children().hide(); + $( "<div>" ).text( label ).appendTo( this.liveRegion ); + } + }, + menuselect: function( event, ui ) { + var item = ui.item.data( "ui-autocomplete-item" ), + previous = this.previous; + + // only trigger when focus was lost (click on menu) + if ( this.element[ 0 ] !== this.document[ 0 ].activeElement ) { + this.element.focus(); + this.previous = previous; + // #6109 - IE triggers two focus events and the second + // is asynchronous, so we need to reset the previous + // term synchronously and asynchronously :-( + this._delay(function() { + this.previous = previous; + this.selectedItem = item; + }); + } + + if ( false !== this._trigger( "select", event, { item: item } ) ) { + this._value( item.value ); + } + // reset the term after the select event + // this allows custom select handling to work properly + this.term = this._value(); + + this.close( event ); + this.selectedItem = item; + } + }); + + this.liveRegion = $( "<span>", { + role: "status", + "aria-live": "assertive", + "aria-relevant": "additions" + }) + .addClass( "ui-helper-hidden-accessible" ) + .appendTo( this.document[ 0 ].body ); + + // turning off autocomplete prevents the browser from remembering the + // value when navigating through history, so we re-enable autocomplete + // if the page is unloaded before the widget is destroyed. #7790 + this._on( this.window, { + beforeunload: function() { + this.element.removeAttr( "autocomplete" ); + } + }); + }, + + _destroy: function() { + clearTimeout( this.searching ); + this.element + .removeClass( "ui-autocomplete-input" ) + .removeAttr( "autocomplete" ); + this.menu.element.remove(); + this.liveRegion.remove(); + }, + + _setOption: function( key, value ) { + this._super( key, value ); + if ( key === "source" ) { + this._initSource(); + } + if ( key === "appendTo" ) { + this.menu.element.appendTo( this._appendTo() ); + } + if ( key === "disabled" && value && this.xhr ) { + this.xhr.abort(); + } + }, + + _appendTo: function() { + var element = this.options.appendTo; + + if ( element ) { + element = element.jquery || element.nodeType ? + $( element ) : + this.document.find( element ).eq( 0 ); + } + + if ( !element || !element[ 0 ] ) { + element = this.element.closest( ".ui-front" ); + } + + if ( !element.length ) { + element = this.document[ 0 ].body; + } + + return element; + }, + + _initSource: function() { + var array, url, + that = this; + if ( $.isArray( this.options.source ) ) { + array = this.options.source; + this.source = function( request, response ) { + response( $.ui.autocomplete.filter( array, request.term ) ); + }; + } else if ( typeof this.options.source === "string" ) { + url = this.options.source; + this.source = function( request, response ) { + if ( that.xhr ) { + that.xhr.abort(); + } + that.xhr = $.ajax({ + url: url, + data: request, + dataType: "json", + success: function( data ) { + response( data ); + }, + error: function() { + response([]); + } + }); + }; + } else { + this.source = this.options.source; + } + }, + + _searchTimeout: function( event ) { + clearTimeout( this.searching ); + this.searching = this._delay(function() { + + // Search if the value has changed, or if the user retypes the same value (see #7434) + var equalValues = this.term === this._value(), + menuVisible = this.menu.element.is( ":visible" ), + modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey; + + if ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) { + this.selectedItem = null; + this.search( null, event ); + } + }, this.options.delay ); + }, + + search: function( value, event ) { + value = value != null ? value : this._value(); + + // always save the actual value, not the one passed as an argument + this.term = this._value(); + + if ( value.length < this.options.minLength ) { + return this.close( event ); + } + + if ( this._trigger( "search", event ) === false ) { + return; + } + + return this._search( value ); + }, + + _search: function( value ) { + this.pending++; + this.element.addClass( "ui-autocomplete-loading" ); + this.cancelSearch = false; + + this.source( { term: value }, this._response() ); + }, + + _response: function() { + var index = ++this.requestIndex; + + return $.proxy(function( content ) { + if ( index === this.requestIndex ) { + this.__response( content ); + } + + this.pending--; + if ( !this.pending ) { + this.element.removeClass( "ui-autocomplete-loading" ); + } + }, this ); + }, + + __response: function( content ) { + if ( content ) { + content = this._normalize( content ); + } + this._trigger( "response", null, { content: content } ); + if ( !this.options.disabled && content && content.length && !this.cancelSearch ) { + this._suggest( content ); + this._trigger( "open" ); + } else { + // use ._close() instead of .close() so we don't cancel future searches + this._close(); + } + }, + + close: function( event ) { + this.cancelSearch = true; + this._close( event ); + }, + + _close: function( event ) { + if ( this.menu.element.is( ":visible" ) ) { + this.menu.element.hide(); + this.menu.blur(); + this.isNewMenu = true; + this._trigger( "close", event ); + } + }, + + _change: function( event ) { + if ( this.previous !== this._value() ) { + this._trigger( "change", event, { item: this.selectedItem } ); + } + }, + + _normalize: function( items ) { + // assume all items have the right format when the first item is complete + if ( items.length && items[ 0 ].label && items[ 0 ].value ) { + return items; + } + return $.map( items, function( item ) { + if ( typeof item === "string" ) { + return { + label: item, + value: item + }; + } + return $.extend( {}, item, { + label: item.label || item.value, + value: item.value || item.label + }); + }); + }, + + _suggest: function( items ) { + var ul = this.menu.element.empty(); + this._renderMenu( ul, items ); + this.isNewMenu = true; + this.menu.refresh(); + + // size and position menu + ul.show(); + this._resizeMenu(); + ul.position( $.extend({ + of: this.element + }, this.options.position ) ); + + if ( this.options.autoFocus ) { + this.menu.next(); + } + }, + + _resizeMenu: function() { + var ul = this.menu.element; + ul.outerWidth( Math.max( + // Firefox wraps long text (possibly a rounding bug) + // so we add 1px to avoid the wrapping (#7513) + ul.width( "" ).outerWidth() + 1, + this.element.outerWidth() + ) ); + }, + + _renderMenu: function( ul, items ) { + var that = this; + $.each( items, function( index, item ) { + that._renderItemData( ul, item ); + }); + }, + + _renderItemData: function( ul, item ) { + return this._renderItem( ul, item ).data( "ui-autocomplete-item", item ); + }, + + _renderItem: function( ul, item ) { + return $( "<li>" ).text( item.label ).appendTo( ul ); + }, + + _move: function( direction, event ) { + if ( !this.menu.element.is( ":visible" ) ) { + this.search( null, event ); + return; + } + if ( this.menu.isFirstItem() && /^previous/.test( direction ) || + this.menu.isLastItem() && /^next/.test( direction ) ) { + + if ( !this.isMultiLine ) { + this._value( this.term ); + } + + this.menu.blur(); + return; + } + this.menu[ direction ]( event ); + }, + + widget: function() { + return this.menu.element; + }, + + _value: function() { + return this.valueMethod.apply( this.element, arguments ); + }, + + _keyEvent: function( keyEvent, event ) { + if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) { + this._move( keyEvent, event ); + + // prevents moving cursor to beginning/end of the text field in some browsers + event.preventDefault(); + } + } +}); + +$.extend( $.ui.autocomplete, { + escapeRegex: function( value ) { + return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ); + }, + filter: function( array, term ) { + var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), "i" ); + return $.grep( array, function( value ) { + return matcher.test( value.label || value.value || value ); + }); + } +}); + +// live region extension, adding a `messages` option +// NOTE: This is an experimental API. We are still investigating +// a full solution for string manipulation and internationalization. +$.widget( "ui.autocomplete", $.ui.autocomplete, { + options: { + messages: { + noResults: "No search results.", + results: function( amount ) { + return amount + ( amount > 1 ? " results are" : " result is" ) + + " available, use up and down arrow keys to navigate."; + } + } + }, + + __response: function( content ) { + var message; + this._superApply( arguments ); + if ( this.options.disabled || this.cancelSearch ) { + return; + } + if ( content && content.length ) { + message = this.options.messages.results( content.length ); + } else { + message = this.options.messages.noResults; + } + this.liveRegion.children().hide(); + $( "<div>" ).text( message ).appendTo( this.liveRegion ); + } +}); + +var autocomplete = $.ui.autocomplete; + + +/*! + * jQuery UI Button 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/button/ + */ + + +var lastActive, + baseClasses = "ui-button ui-widget ui-state-default ui-corner-all", + typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only", + formResetHandler = function() { + var form = $( this ); + setTimeout(function() { + form.find( ":ui-button" ).button( "refresh" ); + }, 1 ); + }, + radioGroup = function( radio ) { + var name = radio.name, + form = radio.form, + radios = $( [] ); + if ( name ) { + name = name.replace( /'/g, "\\'" ); + if ( form ) { + radios = $( form ).find( "[name='" + name + "'][type=radio]" ); + } else { + radios = $( "[name='" + name + "'][type=radio]", radio.ownerDocument ) + .filter(function() { + return !this.form; + }); + } + } + return radios; + }; + +$.widget( "ui.button", { + version: "1.11.4", + defaultElement: "<button>", + options: { + disabled: null, + text: true, + label: null, + icons: { + primary: null, + secondary: null + } + }, + _create: function() { + this.element.closest( "form" ) + .unbind( "reset" + this.eventNamespace ) + .bind( "reset" + this.eventNamespace, formResetHandler ); + + if ( typeof this.options.disabled !== "boolean" ) { + this.options.disabled = !!this.element.prop( "disabled" ); + } else { + this.element.prop( "disabled", this.options.disabled ); + } + + this._determineButtonType(); + this.hasTitle = !!this.buttonElement.attr( "title" ); + + var that = this, + options = this.options, + toggleButton = this.type === "checkbox" || this.type === "radio", + activeClass = !toggleButton ? "ui-state-active" : ""; + + if ( options.label === null ) { + options.label = (this.type === "input" ? this.buttonElement.val() : this.buttonElement.html()); + } + + this._hoverable( this.buttonElement ); + + this.buttonElement + .addClass( baseClasses ) + .attr( "role", "button" ) + .bind( "mouseenter" + this.eventNamespace, function() { + if ( options.disabled ) { + return; + } + if ( this === lastActive ) { + $( this ).addClass( "ui-state-active" ); + } + }) + .bind( "mouseleave" + this.eventNamespace, function() { + if ( options.disabled ) { + return; + } + $( this ).removeClass( activeClass ); + }) + .bind( "click" + this.eventNamespace, function( event ) { + if ( options.disabled ) { + event.preventDefault(); + event.stopImmediatePropagation(); + } + }); + + // Can't use _focusable() because the element that receives focus + // and the element that gets the ui-state-focus class are different + this._on({ + focus: function() { + this.buttonElement.addClass( "ui-state-focus" ); + }, + blur: function() { + this.buttonElement.removeClass( "ui-state-focus" ); + } + }); + + if ( toggleButton ) { + this.element.bind( "change" + this.eventNamespace, function() { + that.refresh(); + }); + } + + if ( this.type === "checkbox" ) { + this.buttonElement.bind( "click" + this.eventNamespace, function() { + if ( options.disabled ) { + return false; + } + }); + } else if ( this.type === "radio" ) { + this.buttonElement.bind( "click" + this.eventNamespace, function() { + if ( options.disabled ) { + return false; + } + $( this ).addClass( "ui-state-active" ); + that.buttonElement.attr( "aria-pressed", "true" ); + + var radio = that.element[ 0 ]; + radioGroup( radio ) + .not( radio ) + .map(function() { + return $( this ).button( "widget" )[ 0 ]; + }) + .removeClass( "ui-state-active" ) + .attr( "aria-pressed", "false" ); + }); + } else { + this.buttonElement + .bind( "mousedown" + this.eventNamespace, function() { + if ( options.disabled ) { + return false; + } + $( this ).addClass( "ui-state-active" ); + lastActive = this; + that.document.one( "mouseup", function() { + lastActive = null; + }); + }) + .bind( "mouseup" + this.eventNamespace, function() { + if ( options.disabled ) { + return false; + } + $( this ).removeClass( "ui-state-active" ); + }) + .bind( "keydown" + this.eventNamespace, function(event) { + if ( options.disabled ) { + return false; + } + if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) { + $( this ).addClass( "ui-state-active" ); + } + }) + // see #8559, we bind to blur here in case the button element loses + // focus between keydown and keyup, it would be left in an "active" state + .bind( "keyup" + this.eventNamespace + " blur" + this.eventNamespace, function() { + $( this ).removeClass( "ui-state-active" ); + }); + + if ( this.buttonElement.is("a") ) { + this.buttonElement.keyup(function(event) { + if ( event.keyCode === $.ui.keyCode.SPACE ) { + // TODO pass through original event correctly (just as 2nd argument doesn't work) + $( this ).click(); + } + }); + } + } + + this._setOption( "disabled", options.disabled ); + this._resetButton(); + }, + + _determineButtonType: function() { + var ancestor, labelSelector, checked; + + if ( this.element.is("[type=checkbox]") ) { + this.type = "checkbox"; + } else if ( this.element.is("[type=radio]") ) { + this.type = "radio"; + } else if ( this.element.is("input") ) { + this.type = "input"; + } else { + this.type = "button"; + } + + if ( this.type === "checkbox" || this.type === "radio" ) { + // we don't search against the document in case the element + // is disconnected from the DOM + ancestor = this.element.parents().last(); + labelSelector = "label[for='" + this.element.attr("id") + "']"; + this.buttonElement = ancestor.find( labelSelector ); + if ( !this.buttonElement.length ) { + ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings(); + this.buttonElement = ancestor.filter( labelSelector ); + if ( !this.buttonElement.length ) { + this.buttonElement = ancestor.find( labelSelector ); + } + } + this.element.addClass( "ui-helper-hidden-accessible" ); + + checked = this.element.is( ":checked" ); + if ( checked ) { + this.buttonElement.addClass( "ui-state-active" ); + } + this.buttonElement.prop( "aria-pressed", checked ); + } else { + this.buttonElement = this.element; + } + }, + + widget: function() { + return this.buttonElement; + }, + + _destroy: function() { + this.element + .removeClass( "ui-helper-hidden-accessible" ); + this.buttonElement + .removeClass( baseClasses + " ui-state-active " + typeClasses ) + .removeAttr( "role" ) + .removeAttr( "aria-pressed" ) + .html( this.buttonElement.find(".ui-button-text").html() ); + + if ( !this.hasTitle ) { + this.buttonElement.removeAttr( "title" ); + } + }, + + _setOption: function( key, value ) { + this._super( key, value ); + if ( key === "disabled" ) { + this.widget().toggleClass( "ui-state-disabled", !!value ); + this.element.prop( "disabled", !!value ); + if ( value ) { + if ( this.type === "checkbox" || this.type === "radio" ) { + this.buttonElement.removeClass( "ui-state-focus" ); + } else { + this.buttonElement.removeClass( "ui-state-focus ui-state-active" ); + } + } + return; + } + this._resetButton(); + }, + + refresh: function() { + //See #8237 & #8828 + var isDisabled = this.element.is( "input, button" ) ? this.element.is( ":disabled" ) : this.element.hasClass( "ui-button-disabled" ); + + if ( isDisabled !== this.options.disabled ) { + this._setOption( "disabled", isDisabled ); + } + if ( this.type === "radio" ) { + radioGroup( this.element[0] ).each(function() { + if ( $( this ).is( ":checked" ) ) { + $( this ).button( "widget" ) + .addClass( "ui-state-active" ) + .attr( "aria-pressed", "true" ); + } else { + $( this ).button( "widget" ) + .removeClass( "ui-state-active" ) + .attr( "aria-pressed", "false" ); + } + }); + } else if ( this.type === "checkbox" ) { + if ( this.element.is( ":checked" ) ) { + this.buttonElement + .addClass( "ui-state-active" ) + .attr( "aria-pressed", "true" ); + } else { + this.buttonElement + .removeClass( "ui-state-active" ) + .attr( "aria-pressed", "false" ); + } + } + }, + + _resetButton: function() { + if ( this.type === "input" ) { + if ( this.options.label ) { + this.element.val( this.options.label ); + } + return; + } + var buttonElement = this.buttonElement.removeClass( typeClasses ), + buttonText = $( "<span></span>", this.document[0] ) + .addClass( "ui-button-text" ) + .html( this.options.label ) + .appendTo( buttonElement.empty() ) + .text(), + icons = this.options.icons, + multipleIcons = icons.primary && icons.secondary, + buttonClasses = []; + + if ( icons.primary || icons.secondary ) { + if ( this.options.text ) { + buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) ); + } + + if ( icons.primary ) { + buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" ); + } + + if ( icons.secondary ) { + buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" ); + } + + if ( !this.options.text ) { + buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" ); + + if ( !this.hasTitle ) { + buttonElement.attr( "title", $.trim( buttonText ) ); + } + } + } else { + buttonClasses.push( "ui-button-text-only" ); + } + buttonElement.addClass( buttonClasses.join( " " ) ); + } +}); + +$.widget( "ui.buttonset", { + version: "1.11.4", + options: { + items: "button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)" + }, + + _create: function() { + this.element.addClass( "ui-buttonset" ); + }, + + _init: function() { + this.refresh(); + }, + + _setOption: function( key, value ) { + if ( key === "disabled" ) { + this.buttons.button( "option", key, value ); + } + + this._super( key, value ); + }, + + refresh: function() { + var rtl = this.element.css( "direction" ) === "rtl", + allButtons = this.element.find( this.options.items ), + existingButtons = allButtons.filter( ":ui-button" ); + + // Initialize new buttons + allButtons.not( ":ui-button" ).button(); + + // Refresh existing buttons + existingButtons.button( "refresh" ); + + this.buttons = allButtons + .map(function() { + return $( this ).button( "widget" )[ 0 ]; + }) + .removeClass( "ui-corner-all ui-corner-left ui-corner-right" ) + .filter( ":first" ) + .addClass( rtl ? "ui-corner-right" : "ui-corner-left" ) + .end() + .filter( ":last" ) + .addClass( rtl ? "ui-corner-left" : "ui-corner-right" ) + .end() + .end(); + }, + + _destroy: function() { + this.element.removeClass( "ui-buttonset" ); + this.buttons + .map(function() { + return $( this ).button( "widget" )[ 0 ]; + }) + .removeClass( "ui-corner-left ui-corner-right" ) + .end() + .button( "destroy" ); + } +}); + +var button = $.ui.button; + + +/*! + * jQuery UI Datepicker 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/datepicker/ + */ + + +$.extend($.ui, { datepicker: { version: "1.11.4" } }); + +var datepicker_instActive; + +function datepicker_getZindex( elem ) { + var position, value; + while ( elem.length && elem[ 0 ] !== document ) { + // Ignore z-index if position is set to a value where z-index is ignored by the browser + // This makes behavior of this function consistent across browsers + // WebKit always returns auto if the element is positioned + position = elem.css( "position" ); + if ( position === "absolute" || position === "relative" || position === "fixed" ) { + // IE returns 0 when zIndex is not specified + // other browsers return a string + // we ignore the case of nested elements with an explicit value of 0 + // <div style="z-index: -10;"><div style="z-index: 0;"></div></div> + value = parseInt( elem.css( "zIndex" ), 10 ); + if ( !isNaN( value ) && value !== 0 ) { + return value; + } + } + elem = elem.parent(); + } + + return 0; +} +/* Date picker manager. + Use the singleton instance of this class, $.datepicker, to interact with the date picker. + Settings for (groups of) date pickers are maintained in an instance object, + allowing multiple different settings on the same page. */ + +function Datepicker() { + this._curInst = null; // The current instance in use + this._keyEvent = false; // If the last event was a key event + this._disabledInputs = []; // List of date picker inputs that have been disabled + this._datepickerShowing = false; // True if the popup picker is showing , false if not + this._inDialog = false; // True if showing within a "dialog", false if not + this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division + this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class + this._appendClass = "ui-datepicker-append"; // The name of the append marker class + this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class + this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class + this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class + this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class + this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class + this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class + this.regional = []; // Available regional settings, indexed by language code + this.regional[""] = { // Default regional settings + closeText: "Done", // Display text for close link + prevText: "Prev", // Display text for previous month link + nextText: "Next", // Display text for next month link + currentText: "Today", // Display text for current month link + monthNames: ["January","February","March","April","May","June", + "July","August","September","October","November","December"], // Names of months for drop-down and formatting + monthNamesShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], // For formatting + dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], // For formatting + dayNamesShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], // For formatting + dayNamesMin: ["Su","Mo","Tu","We","Th","Fr","Sa"], // Column headings for days starting at Sunday + weekHeader: "Wk", // Column header for week of the year + dateFormat: "mm/dd/yy", // See format options on parseDate + firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ... + isRTL: false, // True if right-to-left language, false if left-to-right + showMonthAfterYear: false, // True if the year select precedes month, false for month then year + yearSuffix: "" // Additional text to append to the year in the month headers + }; + this._defaults = { // Global defaults for all the date picker instances + showOn: "focus", // "focus" for popup on focus, + // "button" for trigger button, or "both" for either + showAnim: "fadeIn", // Name of jQuery animation for popup + showOptions: {}, // Options for enhanced animations + defaultDate: null, // Used when field is blank: actual date, + // +/-number for offset from today, null for today + appendText: "", // Display text following the input box, e.g. showing the format + buttonText: "...", // Text for trigger button + buttonImage: "", // URL for trigger button image + buttonImageOnly: false, // True if the image appears alone, false if it appears on a button + hideIfNoPrevNext: false, // True to hide next/previous month links + // if not applicable, false to just disable them + navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links + gotoCurrent: false, // True if today link goes back to current selection instead + changeMonth: false, // True if month can be selected directly, false if only prev/next + changeYear: false, // True if year can be selected directly, false if only prev/next + yearRange: "c-10:c+10", // Range of years to display in drop-down, + // either relative to today's year (-nn:+nn), relative to currently displayed year + // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n) + showOtherMonths: false, // True to show dates in other months, false to leave blank + selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable + showWeek: false, // True to show week of the year, false to not show it + calculateWeek: this.iso8601Week, // How to calculate the week of the year, + // takes a Date and returns the number of the week for it + shortYearCutoff: "+10", // Short year values < this are in the current century, + // > this are in the previous century, + // string value starting with "+" for current year + value + minDate: null, // The earliest selectable date, or null for no limit + maxDate: null, // The latest selectable date, or null for no limit + duration: "fast", // Duration of display/closure + beforeShowDay: null, // Function that takes a date and returns an array with + // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "", + // [2] = cell title (optional), e.g. $.datepicker.noWeekends + beforeShow: null, // Function that takes an input field and + // returns a set of custom settings for the date picker + onSelect: null, // Define a callback function when a date is selected + onChangeMonthYear: null, // Define a callback function when the month or year is changed + onClose: null, // Define a callback function when the datepicker is closed + numberOfMonths: 1, // Number of months to show at a time + showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0) + stepMonths: 1, // Number of months to step back/forward + stepBigMonths: 12, // Number of months to step back/forward for the big links + altField: "", // Selector for an alternate field to store selected dates into + altFormat: "", // The date format to use for the alternate field + constrainInput: true, // The input is constrained by the current date format + showButtonPanel: false, // True to show button panel, false to not show it + autoSize: false, // True to size the input for the date format, false to leave as is + disabled: false // The initial disabled state + }; + $.extend(this._defaults, this.regional[""]); + this.regional.en = $.extend( true, {}, this.regional[ "" ]); + this.regional[ "en-US" ] = $.extend( true, {}, this.regional.en ); + this.dpDiv = datepicker_bindHover($("<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")); +} + +$.extend(Datepicker.prototype, { + /* Class name added to elements to indicate already configured with a date picker. */ + markerClassName: "hasDatepicker", + + //Keep track of the maximum number of rows displayed (see #7043) + maxRows: 4, + + // TODO rename to "widget" when switching to widget factory + _widgetDatepicker: function() { + return this.dpDiv; + }, + + /* Override the default settings for all instances of the date picker. + * @param settings object - the new settings to use as defaults (anonymous object) + * @return the manager object + */ + setDefaults: function(settings) { + datepicker_extendRemove(this._defaults, settings || {}); + return this; + }, + + /* Attach the date picker to a jQuery selection. + * @param target element - the target input field or division or span + * @param settings object - the new settings to use for this date picker instance (anonymous) + */ + _attachDatepicker: function(target, settings) { + var nodeName, inline, inst; + nodeName = target.nodeName.toLowerCase(); + inline = (nodeName === "div" || nodeName === "span"); + if (!target.id) { + this.uuid += 1; + target.id = "dp" + this.uuid; + } + inst = this._newInst($(target), inline); + inst.settings = $.extend({}, settings || {}); + if (nodeName === "input") { + this._connectDatepicker(target, inst); + } else if (inline) { + this._inlineDatepicker(target, inst); + } + }, + + /* Create a new instance object. */ + _newInst: function(target, inline) { + var id = target[0].id.replace(/([^A-Za-z0-9_\-])/g, "\\\\$1"); // escape jQuery meta chars + return {id: id, input: target, // associated target + selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection + drawMonth: 0, drawYear: 0, // month being drawn + inline: inline, // is datepicker inline or not + dpDiv: (!inline ? this.dpDiv : // presentation div + datepicker_bindHover($("<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")))}; + }, + + /* Attach the date picker to an input field. */ + _connectDatepicker: function(target, inst) { + var input = $(target); + inst.append = $([]); + inst.trigger = $([]); + if (input.hasClass(this.markerClassName)) { + return; + } + this._attachments(input, inst); + input.addClass(this.markerClassName).keydown(this._doKeyDown). + keypress(this._doKeyPress).keyup(this._doKeyUp); + this._autoSize(inst); + $.data(target, "datepicker", inst); + //If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665) + if( inst.settings.disabled ) { + this._disableDatepicker( target ); + } + }, + + /* Make attachments based on settings. */ + _attachments: function(input, inst) { + var showOn, buttonText, buttonImage, + appendText = this._get(inst, "appendText"), + isRTL = this._get(inst, "isRTL"); + + if (inst.append) { + inst.append.remove(); + } + if (appendText) { + inst.append = $("<span class='" + this._appendClass + "'>" + appendText + "</span>"); + input[isRTL ? "before" : "after"](inst.append); + } + + input.unbind("focus", this._showDatepicker); + + if (inst.trigger) { + inst.trigger.remove(); + } + + showOn = this._get(inst, "showOn"); + if (showOn === "focus" || showOn === "both") { // pop-up date picker when in the marked field + input.focus(this._showDatepicker); + } + if (showOn === "button" || showOn === "both") { // pop-up date picker when button clicked + buttonText = this._get(inst, "buttonText"); + buttonImage = this._get(inst, "buttonImage"); + inst.trigger = $(this._get(inst, "buttonImageOnly") ? + $("<img/>").addClass(this._triggerClass). + attr({ src: buttonImage, alt: buttonText, title: buttonText }) : + $("<button type='button'></button>").addClass(this._triggerClass). + html(!buttonImage ? buttonText : $("<img/>").attr( + { src:buttonImage, alt:buttonText, title:buttonText }))); + input[isRTL ? "before" : "after"](inst.trigger); + inst.trigger.click(function() { + if ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0]) { + $.datepicker._hideDatepicker(); + } else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !== input[0]) { + $.datepicker._hideDatepicker(); + $.datepicker._showDatepicker(input[0]); + } else { + $.datepicker._showDatepicker(input[0]); + } + return false; + }); + } + }, + + /* Apply the maximum length for the date format. */ + _autoSize: function(inst) { + if (this._get(inst, "autoSize") && !inst.inline) { + var findMax, max, maxI, i, + date = new Date(2009, 12 - 1, 20), // Ensure double digits + dateFormat = this._get(inst, "dateFormat"); + + if (dateFormat.match(/[DM]/)) { + findMax = function(names) { + max = 0; + maxI = 0; + for (i = 0; i < names.length; i++) { + if (names[i].length > max) { + max = names[i].length; + maxI = i; + } + } + return maxI; + }; + date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ? + "monthNames" : "monthNamesShort")))); + date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ? + "dayNames" : "dayNamesShort"))) + 20 - date.getDay()); + } + inst.input.attr("size", this._formatDate(inst, date).length); + } + }, + + /* Attach an inline date picker to a div. */ + _inlineDatepicker: function(target, inst) { + var divSpan = $(target); + if (divSpan.hasClass(this.markerClassName)) { + return; + } + divSpan.addClass(this.markerClassName).append(inst.dpDiv); + $.data(target, "datepicker", inst); + this._setDate(inst, this._getDefaultDate(inst), true); + this._updateDatepicker(inst); + this._updateAlternate(inst); + //If disabled option is true, disable the datepicker before showing it (see ticket #5665) + if( inst.settings.disabled ) { + this._disableDatepicker( target ); + } + // Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements + // http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height + inst.dpDiv.css( "display", "block" ); + }, + + /* Pop-up the date picker in a "dialog" box. + * @param input element - ignored + * @param date string or Date - the initial date to display + * @param onSelect function - the function to call when a date is selected + * @param settings object - update the dialog date picker instance's settings (anonymous object) + * @param pos int[2] - coordinates for the dialog's position within the screen or + * event - with x/y coordinates or + * leave empty for default (screen centre) + * @return the manager object + */ + _dialogDatepicker: function(input, date, onSelect, settings, pos) { + var id, browserWidth, browserHeight, scrollX, scrollY, + inst = this._dialogInst; // internal instance + + if (!inst) { + this.uuid += 1; + id = "dp" + this.uuid; + this._dialogInput = $("<input type='text' id='" + id + + "' style='position: absolute; top: -100px; width: 0px;'/>"); + this._dialogInput.keydown(this._doKeyDown); + $("body").append(this._dialogInput); + inst = this._dialogInst = this._newInst(this._dialogInput, false); + inst.settings = {}; + $.data(this._dialogInput[0], "datepicker", inst); + } + datepicker_extendRemove(inst.settings, settings || {}); + date = (date && date.constructor === Date ? this._formatDate(inst, date) : date); + this._dialogInput.val(date); + + this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null); + if (!this._pos) { + browserWidth = document.documentElement.clientWidth; + browserHeight = document.documentElement.clientHeight; + scrollX = document.documentElement.scrollLeft || document.body.scrollLeft; + scrollY = document.documentElement.scrollTop || document.body.scrollTop; + this._pos = // should use actual width/height below + [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY]; + } + + // move input on screen for focus, but hidden behind dialog + this._dialogInput.css("left", (this._pos[0] + 20) + "px").css("top", this._pos[1] + "px"); + inst.settings.onSelect = onSelect; + this._inDialog = true; + this.dpDiv.addClass(this._dialogClass); + this._showDatepicker(this._dialogInput[0]); + if ($.blockUI) { + $.blockUI(this.dpDiv); + } + $.data(this._dialogInput[0], "datepicker", inst); + return this; + }, + + /* Detach a datepicker from its control. + * @param target element - the target input field or division or span + */ + _destroyDatepicker: function(target) { + var nodeName, + $target = $(target), + inst = $.data(target, "datepicker"); + + if (!$target.hasClass(this.markerClassName)) { + return; + } + + nodeName = target.nodeName.toLowerCase(); + $.removeData(target, "datepicker"); + if (nodeName === "input") { + inst.append.remove(); + inst.trigger.remove(); + $target.removeClass(this.markerClassName). + unbind("focus", this._showDatepicker). + unbind("keydown", this._doKeyDown). + unbind("keypress", this._doKeyPress). + unbind("keyup", this._doKeyUp); + } else if (nodeName === "div" || nodeName === "span") { + $target.removeClass(this.markerClassName).empty(); + } + + if ( datepicker_instActive === inst ) { + datepicker_instActive = null; + } + }, + + /* Enable the date picker to a jQuery selection. + * @param target element - the target input field or division or span + */ + _enableDatepicker: function(target) { + var nodeName, inline, + $target = $(target), + inst = $.data(target, "datepicker"); + + if (!$target.hasClass(this.markerClassName)) { + return; + } + + nodeName = target.nodeName.toLowerCase(); + if (nodeName === "input") { + target.disabled = false; + inst.trigger.filter("button"). + each(function() { this.disabled = false; }).end(). + filter("img").css({opacity: "1.0", cursor: ""}); + } else if (nodeName === "div" || nodeName === "span") { + inline = $target.children("." + this._inlineClass); + inline.children().removeClass("ui-state-disabled"); + inline.find("select.ui-datepicker-month, select.ui-datepicker-year"). + prop("disabled", false); + } + this._disabledInputs = $.map(this._disabledInputs, + function(value) { return (value === target ? null : value); }); // delete entry + }, + + /* Disable the date picker to a jQuery selection. + * @param target element - the target input field or division or span + */ + _disableDatepicker: function(target) { + var nodeName, inline, + $target = $(target), + inst = $.data(target, "datepicker"); + + if (!$target.hasClass(this.markerClassName)) { + return; + } + + nodeName = target.nodeName.toLowerCase(); + if (nodeName === "input") { + target.disabled = true; + inst.trigger.filter("button"). + each(function() { this.disabled = true; }).end(). + filter("img").css({opacity: "0.5", cursor: "default"}); + } else if (nodeName === "div" || nodeName === "span") { + inline = $target.children("." + this._inlineClass); + inline.children().addClass("ui-state-disabled"); + inline.find("select.ui-datepicker-month, select.ui-datepicker-year"). + prop("disabled", true); + } + this._disabledInputs = $.map(this._disabledInputs, + function(value) { return (value === target ? null : value); }); // delete entry + this._disabledInputs[this._disabledInputs.length] = target; + }, + + /* Is the first field in a jQuery collection disabled as a datepicker? + * @param target element - the target input field or division or span + * @return boolean - true if disabled, false if enabled + */ + _isDisabledDatepicker: function(target) { + if (!target) { + return false; + } + for (var i = 0; i < this._disabledInputs.length; i++) { + if (this._disabledInputs[i] === target) { + return true; + } + } + return false; + }, + + /* Retrieve the instance data for the target control. + * @param target element - the target input field or division or span + * @return object - the associated instance data + * @throws error if a jQuery problem getting data + */ + _getInst: function(target) { + try { + return $.data(target, "datepicker"); + } + catch (err) { + throw "Missing instance data for this datepicker"; + } + }, + + /* Update or retrieve the settings for a date picker attached to an input field or division. + * @param target element - the target input field or division or span + * @param name object - the new settings to update or + * string - the name of the setting to change or retrieve, + * when retrieving also "all" for all instance settings or + * "defaults" for all global defaults + * @param value any - the new value for the setting + * (omit if above is an object or to retrieve a value) + */ + _optionDatepicker: function(target, name, value) { + var settings, date, minDate, maxDate, + inst = this._getInst(target); + + if (arguments.length === 2 && typeof name === "string") { + return (name === "defaults" ? $.extend({}, $.datepicker._defaults) : + (inst ? (name === "all" ? $.extend({}, inst.settings) : + this._get(inst, name)) : null)); + } + + settings = name || {}; + if (typeof name === "string") { + settings = {}; + settings[name] = value; + } + + if (inst) { + if (this._curInst === inst) { + this._hideDatepicker(); + } + + date = this._getDateDatepicker(target, true); + minDate = this._getMinMaxDate(inst, "min"); + maxDate = this._getMinMaxDate(inst, "max"); + datepicker_extendRemove(inst.settings, settings); + // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided + if (minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined) { + inst.settings.minDate = this._formatDate(inst, minDate); + } + if (maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined) { + inst.settings.maxDate = this._formatDate(inst, maxDate); + } + if ( "disabled" in settings ) { + if ( settings.disabled ) { + this._disableDatepicker(target); + } else { + this._enableDatepicker(target); + } + } + this._attachments($(target), inst); + this._autoSize(inst); + this._setDate(inst, date); + this._updateAlternate(inst); + this._updateDatepicker(inst); + } + }, + + // change method deprecated + _changeDatepicker: function(target, name, value) { + this._optionDatepicker(target, name, value); + }, + + /* Redraw the date picker attached to an input field or division. + * @param target element - the target input field or division or span + */ + _refreshDatepicker: function(target) { + var inst = this._getInst(target); + if (inst) { + this._updateDatepicker(inst); + } + }, + + /* Set the dates for a jQuery selection. + * @param target element - the target input field or division or span + * @param date Date - the new date + */ + _setDateDatepicker: function(target, date) { + var inst = this._getInst(target); + if (inst) { + this._setDate(inst, date); + this._updateDatepicker(inst); + this._updateAlternate(inst); + } + }, + + /* Get the date(s) for the first entry in a jQuery selection. + * @param target element - the target input field or division or span + * @param noDefault boolean - true if no default date is to be used + * @return Date - the current date + */ + _getDateDatepicker: function(target, noDefault) { + var inst = this._getInst(target); + if (inst && !inst.inline) { + this._setDateFromField(inst, noDefault); + } + return (inst ? this._getDate(inst) : null); + }, + + /* Handle keystrokes. */ + _doKeyDown: function(event) { + var onSelect, dateStr, sel, + inst = $.datepicker._getInst(event.target), + handled = true, + isRTL = inst.dpDiv.is(".ui-datepicker-rtl"); + + inst._keyEvent = true; + if ($.datepicker._datepickerShowing) { + switch (event.keyCode) { + case 9: $.datepicker._hideDatepicker(); + handled = false; + break; // hide on tab out + case 13: sel = $("td." + $.datepicker._dayOverClass + ":not(." + + $.datepicker._currentClass + ")", inst.dpDiv); + if (sel[0]) { + $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]); + } + + onSelect = $.datepicker._get(inst, "onSelect"); + if (onSelect) { + dateStr = $.datepicker._formatDate(inst); + + // trigger custom callback + onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); + } else { + $.datepicker._hideDatepicker(); + } + + return false; // don't submit the form + case 27: $.datepicker._hideDatepicker(); + break; // hide on escape + case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ? + -$.datepicker._get(inst, "stepBigMonths") : + -$.datepicker._get(inst, "stepMonths")), "M"); + break; // previous month/year on page up/+ ctrl + case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ? + +$.datepicker._get(inst, "stepBigMonths") : + +$.datepicker._get(inst, "stepMonths")), "M"); + break; // next month/year on page down/+ ctrl + case 35: if (event.ctrlKey || event.metaKey) { + $.datepicker._clearDate(event.target); + } + handled = event.ctrlKey || event.metaKey; + break; // clear on ctrl or command +end + case 36: if (event.ctrlKey || event.metaKey) { + $.datepicker._gotoToday(event.target); + } + handled = event.ctrlKey || event.metaKey; + break; // current on ctrl or command +home + case 37: if (event.ctrlKey || event.metaKey) { + $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), "D"); + } + handled = event.ctrlKey || event.metaKey; + // -1 day on ctrl or command +left + if (event.originalEvent.altKey) { + $.datepicker._adjustDate(event.target, (event.ctrlKey ? + -$.datepicker._get(inst, "stepBigMonths") : + -$.datepicker._get(inst, "stepMonths")), "M"); + } + // next month/year on alt +left on Mac + break; + case 38: if (event.ctrlKey || event.metaKey) { + $.datepicker._adjustDate(event.target, -7, "D"); + } + handled = event.ctrlKey || event.metaKey; + break; // -1 week on ctrl or command +up + case 39: if (event.ctrlKey || event.metaKey) { + $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), "D"); + } + handled = event.ctrlKey || event.metaKey; + // +1 day on ctrl or command +right + if (event.originalEvent.altKey) { + $.datepicker._adjustDate(event.target, (event.ctrlKey ? + +$.datepicker._get(inst, "stepBigMonths") : + +$.datepicker._get(inst, "stepMonths")), "M"); + } + // next month/year on alt +right + break; + case 40: if (event.ctrlKey || event.metaKey) { + $.datepicker._adjustDate(event.target, +7, "D"); + } + handled = event.ctrlKey || event.metaKey; + break; // +1 week on ctrl or command +down + default: handled = false; + } + } else if (event.keyCode === 36 && event.ctrlKey) { // display the date picker on ctrl+home + $.datepicker._showDatepicker(this); + } else { + handled = false; + } + + if (handled) { + event.preventDefault(); + event.stopPropagation(); + } + }, + + /* Filter entered characters - based on date format. */ + _doKeyPress: function(event) { + var chars, chr, + inst = $.datepicker._getInst(event.target); + + if ($.datepicker._get(inst, "constrainInput")) { + chars = $.datepicker._possibleChars($.datepicker._get(inst, "dateFormat")); + chr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode); + return event.ctrlKey || event.metaKey || (chr < " " || !chars || chars.indexOf(chr) > -1); + } + }, + + /* Synchronise manual entry and field/alternate field. */ + _doKeyUp: function(event) { + var date, + inst = $.datepicker._getInst(event.target); + + if (inst.input.val() !== inst.lastVal) { + try { + date = $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"), + (inst.input ? inst.input.val() : null), + $.datepicker._getFormatConfig(inst)); + + if (date) { // only if valid + $.datepicker._setDateFromField(inst); + $.datepicker._updateAlternate(inst); + $.datepicker._updateDatepicker(inst); + } + } + catch (err) { + } + } + return true; + }, + + /* Pop-up the date picker for a given input field. + * If false returned from beforeShow event handler do not show. + * @param input element - the input field attached to the date picker or + * event - if triggered by focus + */ + _showDatepicker: function(input) { + input = input.target || input; + if (input.nodeName.toLowerCase() !== "input") { // find from button/image trigger + input = $("input", input.parentNode)[0]; + } + + if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) { // already here + return; + } + + var inst, beforeShow, beforeShowSettings, isFixed, + offset, showAnim, duration; + + inst = $.datepicker._getInst(input); + if ($.datepicker._curInst && $.datepicker._curInst !== inst) { + $.datepicker._curInst.dpDiv.stop(true, true); + if ( inst && $.datepicker._datepickerShowing ) { + $.datepicker._hideDatepicker( $.datepicker._curInst.input[0] ); + } + } + + beforeShow = $.datepicker._get(inst, "beforeShow"); + beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {}; + if(beforeShowSettings === false){ + return; + } + datepicker_extendRemove(inst.settings, beforeShowSettings); + + inst.lastVal = null; + $.datepicker._lastInput = input; + $.datepicker._setDateFromField(inst); + + if ($.datepicker._inDialog) { // hide cursor + input.value = ""; + } + if (!$.datepicker._pos) { // position below input + $.datepicker._pos = $.datepicker._findPos(input); + $.datepicker._pos[1] += input.offsetHeight; // add the height + } + + isFixed = false; + $(input).parents().each(function() { + isFixed |= $(this).css("position") === "fixed"; + return !isFixed; + }); + + offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]}; + $.datepicker._pos = null; + //to avoid flashes on Firefox + inst.dpDiv.empty(); + // determine sizing offscreen + inst.dpDiv.css({position: "absolute", display: "block", top: "-1000px"}); + $.datepicker._updateDatepicker(inst); + // fix width for dynamic number of date pickers + // and adjust position before showing + offset = $.datepicker._checkOffset(inst, offset, isFixed); + inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ? + "static" : (isFixed ? "fixed" : "absolute")), display: "none", + left: offset.left + "px", top: offset.top + "px"}); + + if (!inst.inline) { + showAnim = $.datepicker._get(inst, "showAnim"); + duration = $.datepicker._get(inst, "duration"); + inst.dpDiv.css( "z-index", datepicker_getZindex( $( input ) ) + 1 ); + $.datepicker._datepickerShowing = true; + + if ( $.effects && $.effects.effect[ showAnim ] ) { + inst.dpDiv.show(showAnim, $.datepicker._get(inst, "showOptions"), duration); + } else { + inst.dpDiv[showAnim || "show"](showAnim ? duration : null); + } + + if ( $.datepicker._shouldFocusInput( inst ) ) { + inst.input.focus(); + } + + $.datepicker._curInst = inst; + } + }, + + /* Generate the date picker content. */ + _updateDatepicker: function(inst) { + this.maxRows = 4; //Reset the max number of rows being displayed (see #7043) + datepicker_instActive = inst; // for delegate hover events + inst.dpDiv.empty().append(this._generateHTML(inst)); + this._attachHandlers(inst); + + var origyearshtml, + numMonths = this._getNumberOfMonths(inst), + cols = numMonths[1], + width = 17, + activeCell = inst.dpDiv.find( "." + this._dayOverClass + " a" ); + + if ( activeCell.length > 0 ) { + datepicker_handleMouseover.apply( activeCell.get( 0 ) ); + } + + inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""); + if (cols > 1) { + inst.dpDiv.addClass("ui-datepicker-multi-" + cols).css("width", (width * cols) + "em"); + } + inst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? "add" : "remove") + + "Class"]("ui-datepicker-multi"); + inst.dpDiv[(this._get(inst, "isRTL") ? "add" : "remove") + + "Class"]("ui-datepicker-rtl"); + + if (inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) { + inst.input.focus(); + } + + // deffered render of the years select (to avoid flashes on Firefox) + if( inst.yearshtml ){ + origyearshtml = inst.yearshtml; + setTimeout(function(){ + //assure that inst.yearshtml didn't change. + if( origyearshtml === inst.yearshtml && inst.yearshtml ){ + inst.dpDiv.find("select.ui-datepicker-year:first").replaceWith(inst.yearshtml); + } + origyearshtml = inst.yearshtml = null; + }, 0); + } + }, + + // #6694 - don't focus the input if it's already focused + // this breaks the change event in IE + // Support: IE and jQuery <1.9 + _shouldFocusInput: function( inst ) { + return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" ); + }, + + /* Check positioning to remain on screen. */ + _checkOffset: function(inst, offset, isFixed) { + var dpWidth = inst.dpDiv.outerWidth(), + dpHeight = inst.dpDiv.outerHeight(), + inputWidth = inst.input ? inst.input.outerWidth() : 0, + inputHeight = inst.input ? inst.input.outerHeight() : 0, + viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()), + viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop()); + + offset.left -= (this._get(inst, "isRTL") ? (dpWidth - inputWidth) : 0); + offset.left -= (isFixed && offset.left === inst.input.offset().left) ? $(document).scrollLeft() : 0; + offset.top -= (isFixed && offset.top === (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0; + + // now check if datepicker is showing outside window viewport - move to a better place if so. + offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ? + Math.abs(offset.left + dpWidth - viewWidth) : 0); + offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ? + Math.abs(dpHeight + inputHeight) : 0); + + return offset; + }, + + /* Find an object's position on the screen. */ + _findPos: function(obj) { + var position, + inst = this._getInst(obj), + isRTL = this._get(inst, "isRTL"); + + while (obj && (obj.type === "hidden" || obj.nodeType !== 1 || $.expr.filters.hidden(obj))) { + obj = obj[isRTL ? "previousSibling" : "nextSibling"]; + } + + position = $(obj).offset(); + return [position.left, position.top]; + }, + + /* Hide the date picker from view. + * @param input element - the input field attached to the date picker + */ + _hideDatepicker: function(input) { + var showAnim, duration, postProcess, onClose, + inst = this._curInst; + + if (!inst || (input && inst !== $.data(input, "datepicker"))) { + return; + } + + if (this._datepickerShowing) { + showAnim = this._get(inst, "showAnim"); + duration = this._get(inst, "duration"); + postProcess = function() { + $.datepicker._tidyDialog(inst); + }; + + // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed + if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) { + inst.dpDiv.hide(showAnim, $.datepicker._get(inst, "showOptions"), duration, postProcess); + } else { + inst.dpDiv[(showAnim === "slideDown" ? "slideUp" : + (showAnim === "fadeIn" ? "fadeOut" : "hide"))]((showAnim ? duration : null), postProcess); + } + + if (!showAnim) { + postProcess(); + } + this._datepickerShowing = false; + + onClose = this._get(inst, "onClose"); + if (onClose) { + onClose.apply((inst.input ? inst.input[0] : null), [(inst.input ? inst.input.val() : ""), inst]); + } + + this._lastInput = null; + if (this._inDialog) { + this._dialogInput.css({ position: "absolute", left: "0", top: "-100px" }); + if ($.blockUI) { + $.unblockUI(); + $("body").append(this.dpDiv); + } + } + this._inDialog = false; + } + }, + + /* Tidy up after a dialog display. */ + _tidyDialog: function(inst) { + inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar"); + }, + + /* Close date picker if clicked elsewhere. */ + _checkExternalClick: function(event) { + if (!$.datepicker._curInst) { + return; + } + + var $target = $(event.target), + inst = $.datepicker._getInst($target[0]); + + if ( ( ( $target[0].id !== $.datepicker._mainDivId && + $target.parents("#" + $.datepicker._mainDivId).length === 0 && + !$target.hasClass($.datepicker.markerClassName) && + !$target.closest("." + $.datepicker._triggerClass).length && + $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) || + ( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !== inst ) ) { + $.datepicker._hideDatepicker(); + } + }, + + /* Adjust one of the date sub-fields. */ + _adjustDate: function(id, offset, period) { + var target = $(id), + inst = this._getInst(target[0]); + + if (this._isDisabledDatepicker(target[0])) { + return; + } + this._adjustInstDate(inst, offset + + (period === "M" ? this._get(inst, "showCurrentAtPos") : 0), // undo positioning + period); + this._updateDatepicker(inst); + }, + + /* Action for current link. */ + _gotoToday: function(id) { + var date, + target = $(id), + inst = this._getInst(target[0]); + + if (this._get(inst, "gotoCurrent") && inst.currentDay) { + inst.selectedDay = inst.currentDay; + inst.drawMonth = inst.selectedMonth = inst.currentMonth; + inst.drawYear = inst.selectedYear = inst.currentYear; + } else { + date = new Date(); + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + } + this._notifyChange(inst); + this._adjustDate(target); + }, + + /* Action for selecting a new month/year. */ + _selectMonthYear: function(id, select, period) { + var target = $(id), + inst = this._getInst(target[0]); + + inst["selected" + (period === "M" ? "Month" : "Year")] = + inst["draw" + (period === "M" ? "Month" : "Year")] = + parseInt(select.options[select.selectedIndex].value,10); + + this._notifyChange(inst); + this._adjustDate(target); + }, + + /* Action for selecting a day. */ + _selectDay: function(id, month, year, td) { + var inst, + target = $(id); + + if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) { + return; + } + + inst = this._getInst(target[0]); + inst.selectedDay = inst.currentDay = $("a", td).html(); + inst.selectedMonth = inst.currentMonth = month; + inst.selectedYear = inst.currentYear = year; + this._selectDate(id, this._formatDate(inst, + inst.currentDay, inst.currentMonth, inst.currentYear)); + }, + + /* Erase the input field and hide the date picker. */ + _clearDate: function(id) { + var target = $(id); + this._selectDate(target, ""); + }, + + /* Update the input field with the selected date. */ + _selectDate: function(id, dateStr) { + var onSelect, + target = $(id), + inst = this._getInst(target[0]); + + dateStr = (dateStr != null ? dateStr : this._formatDate(inst)); + if (inst.input) { + inst.input.val(dateStr); + } + this._updateAlternate(inst); + + onSelect = this._get(inst, "onSelect"); + if (onSelect) { + onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback + } else if (inst.input) { + inst.input.trigger("change"); // fire the change event + } + + if (inst.inline){ + this._updateDatepicker(inst); + } else { + this._hideDatepicker(); + this._lastInput = inst.input[0]; + if (typeof(inst.input[0]) !== "object") { + inst.input.focus(); // restore focus + } + this._lastInput = null; + } + }, + + /* Update any alternate field to synchronise with the main field. */ + _updateAlternate: function(inst) { + var altFormat, date, dateStr, + altField = this._get(inst, "altField"); + + if (altField) { // update alternate field too + altFormat = this._get(inst, "altFormat") || this._get(inst, "dateFormat"); + date = this._getDate(inst); + dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst)); + $(altField).each(function() { $(this).val(dateStr); }); + } + }, + + /* Set as beforeShowDay function to prevent selection of weekends. + * @param date Date - the date to customise + * @return [boolean, string] - is this date selectable?, what is its CSS class? + */ + noWeekends: function(date) { + var day = date.getDay(); + return [(day > 0 && day < 6), ""]; + }, + + /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition. + * @param date Date - the date to get the week for + * @return number - the number of the week within the year that contains this date + */ + iso8601Week: function(date) { + var time, + checkDate = new Date(date.getTime()); + + // Find Thursday of this week starting on Monday + checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); + + time = checkDate.getTime(); + checkDate.setMonth(0); // Compare with Jan 1 + checkDate.setDate(1); + return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; + }, + + /* Parse a string value into a date object. + * See formatDate below for the possible formats. + * + * @param format string - the expected format of the date + * @param value string - the date in the above format + * @param settings Object - attributes include: + * shortYearCutoff number - the cutoff year for determining the century (optional) + * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + * dayNames string[7] - names of the days from Sunday (optional) + * monthNamesShort string[12] - abbreviated names of the months (optional) + * monthNames string[12] - names of the months (optional) + * @return Date - the extracted date value or null if value is blank + */ + parseDate: function (format, value, settings) { + if (format == null || value == null) { + throw "Invalid arguments"; + } + + value = (typeof value === "object" ? value.toString() : value + ""); + if (value === "") { + return null; + } + + var iFormat, dim, extra, + iValue = 0, + shortYearCutoffTemp = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff, + shortYearCutoff = (typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp : + new Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10)), + dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort, + dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames, + monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort, + monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames, + year = -1, + month = -1, + day = -1, + doy = -1, + literal = false, + date, + // Check whether a format character is doubled + lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match); + if (matches) { + iFormat++; + } + return matches; + }, + // Extract a number from the string value + getNumber = function(match) { + var isDoubled = lookAhead(match), + size = (match === "@" ? 14 : (match === "!" ? 20 : + (match === "y" && isDoubled ? 4 : (match === "o" ? 3 : 2)))), + minSize = (match === "y" ? size : 1), + digits = new RegExp("^\\d{" + minSize + "," + size + "}"), + num = value.substring(iValue).match(digits); + if (!num) { + throw "Missing number at position " + iValue; + } + iValue += num[0].length; + return parseInt(num[0], 10); + }, + // Extract a name from the string value and convert to an index + getName = function(match, shortNames, longNames) { + var index = -1, + names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) { + return [ [k, v] ]; + }).sort(function (a, b) { + return -(a[1].length - b[1].length); + }); + + $.each(names, function (i, pair) { + var name = pair[1]; + if (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) { + index = pair[0]; + iValue += name.length; + return false; + } + }); + if (index !== -1) { + return index + 1; + } else { + throw "Unknown name at position " + iValue; + } + }, + // Confirm that a literal character matches the string value + checkLiteral = function() { + if (value.charAt(iValue) !== format.charAt(iFormat)) { + throw "Unexpected literal at position " + iValue; + } + iValue++; + }; + + for (iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) { + if (format.charAt(iFormat) === "'" && !lookAhead("'")) { + literal = false; + } else { + checkLiteral(); + } + } else { + switch (format.charAt(iFormat)) { + case "d": + day = getNumber("d"); + break; + case "D": + getName("D", dayNamesShort, dayNames); + break; + case "o": + doy = getNumber("o"); + break; + case "m": + month = getNumber("m"); + break; + case "M": + month = getName("M", monthNamesShort, monthNames); + break; + case "y": + year = getNumber("y"); + break; + case "@": + date = new Date(getNumber("@")); + year = date.getFullYear(); + month = date.getMonth() + 1; + day = date.getDate(); + break; + case "!": + date = new Date((getNumber("!") - this._ticksTo1970) / 10000); + year = date.getFullYear(); + month = date.getMonth() + 1; + day = date.getDate(); + break; + case "'": + if (lookAhead("'")){ + checkLiteral(); + } else { + literal = true; + } + break; + default: + checkLiteral(); + } + } + } + + if (iValue < value.length){ + extra = value.substr(iValue); + if (!/^\s+/.test(extra)) { + throw "Extra/unparsed characters found in date: " + extra; + } + } + + if (year === -1) { + year = new Date().getFullYear(); + } else if (year < 100) { + year += new Date().getFullYear() - new Date().getFullYear() % 100 + + (year <= shortYearCutoff ? 0 : -100); + } + + if (doy > -1) { + month = 1; + day = doy; + do { + dim = this._getDaysInMonth(year, month - 1); + if (day <= dim) { + break; + } + month++; + day -= dim; + } while (true); + } + + date = this._daylightSavingAdjust(new Date(year, month - 1, day)); + if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) { + throw "Invalid date"; // E.g. 31/02/00 + } + return date; + }, + + /* Standard date formats. */ + ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601) + COOKIE: "D, dd M yy", + ISO_8601: "yy-mm-dd", + RFC_822: "D, d M y", + RFC_850: "DD, dd-M-y", + RFC_1036: "D, d M y", + RFC_1123: "D, d M yy", + RFC_2822: "D, d M yy", + RSS: "D, d M y", // RFC 822 + TICKS: "!", + TIMESTAMP: "@", + W3C: "yy-mm-dd", // ISO 8601 + + _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) + + Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000), + + /* Format a date object into a string value. + * The format can be combinations of the following: + * d - day of month (no leading zero) + * dd - day of month (two digit) + * o - day of year (no leading zeros) + * oo - day of year (three digit) + * D - day name short + * DD - day name long + * m - month of year (no leading zero) + * mm - month of year (two digit) + * M - month name short + * MM - month name long + * y - year (two digit) + * yy - year (four digit) + * @ - Unix timestamp (ms since 01/01/1970) + * ! - Windows ticks (100ns since 01/01/0001) + * "..." - literal text + * '' - single quote + * + * @param format string - the desired format of the date + * @param date Date - the date value to format + * @param settings Object - attributes include: + * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + * dayNames string[7] - names of the days from Sunday (optional) + * monthNamesShort string[12] - abbreviated names of the months (optional) + * monthNames string[12] - names of the months (optional) + * @return string - the date in the above format + */ + formatDate: function (format, date, settings) { + if (!date) { + return ""; + } + + var iFormat, + dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort, + dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames, + monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort, + monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames, + // Check whether a format character is doubled + lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match); + if (matches) { + iFormat++; + } + return matches; + }, + // Format a number, with leading zero if necessary + formatNumber = function(match, value, len) { + var num = "" + value; + if (lookAhead(match)) { + while (num.length < len) { + num = "0" + num; + } + } + return num; + }, + // Format a name, short or long as requested + formatName = function(match, value, shortNames, longNames) { + return (lookAhead(match) ? longNames[value] : shortNames[value]); + }, + output = "", + literal = false; + + if (date) { + for (iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) { + if (format.charAt(iFormat) === "'" && !lookAhead("'")) { + literal = false; + } else { + output += format.charAt(iFormat); + } + } else { + switch (format.charAt(iFormat)) { + case "d": + output += formatNumber("d", date.getDate(), 2); + break; + case "D": + output += formatName("D", date.getDay(), dayNamesShort, dayNames); + break; + case "o": + output += formatNumber("o", + Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3); + break; + case "m": + output += formatNumber("m", date.getMonth() + 1, 2); + break; + case "M": + output += formatName("M", date.getMonth(), monthNamesShort, monthNames); + break; + case "y": + output += (lookAhead("y") ? date.getFullYear() : + (date.getYear() % 100 < 10 ? "0" : "") + date.getYear() % 100); + break; + case "@": + output += date.getTime(); + break; + case "!": + output += date.getTime() * 10000 + this._ticksTo1970; + break; + case "'": + if (lookAhead("'")) { + output += "'"; + } else { + literal = true; + } + break; + default: + output += format.charAt(iFormat); + } + } + } + } + return output; + }, + + /* Extract all possible characters from the date format. */ + _possibleChars: function (format) { + var iFormat, + chars = "", + literal = false, + // Check whether a format character is doubled + lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match); + if (matches) { + iFormat++; + } + return matches; + }; + + for (iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) { + if (format.charAt(iFormat) === "'" && !lookAhead("'")) { + literal = false; + } else { + chars += format.charAt(iFormat); + } + } else { + switch (format.charAt(iFormat)) { + case "d": case "m": case "y": case "@": + chars += "0123456789"; + break; + case "D": case "M": + return null; // Accept anything + case "'": + if (lookAhead("'")) { + chars += "'"; + } else { + literal = true; + } + break; + default: + chars += format.charAt(iFormat); + } + } + } + return chars; + }, + + /* Get a setting value, defaulting if necessary. */ + _get: function(inst, name) { + return inst.settings[name] !== undefined ? + inst.settings[name] : this._defaults[name]; + }, + + /* Parse existing date and initialise date picker. */ + _setDateFromField: function(inst, noDefault) { + if (inst.input.val() === inst.lastVal) { + return; + } + + var dateFormat = this._get(inst, "dateFormat"), + dates = inst.lastVal = inst.input ? inst.input.val() : null, + defaultDate = this._getDefaultDate(inst), + date = defaultDate, + settings = this._getFormatConfig(inst); + + try { + date = this.parseDate(dateFormat, dates, settings) || defaultDate; + } catch (event) { + dates = (noDefault ? "" : dates); + } + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + inst.currentDay = (dates ? date.getDate() : 0); + inst.currentMonth = (dates ? date.getMonth() : 0); + inst.currentYear = (dates ? date.getFullYear() : 0); + this._adjustInstDate(inst); + }, + + /* Retrieve the default date shown on opening. */ + _getDefaultDate: function(inst) { + return this._restrictMinMax(inst, + this._determineDate(inst, this._get(inst, "defaultDate"), new Date())); + }, + + /* A date may be specified as an exact value or a relative one. */ + _determineDate: function(inst, date, defaultDate) { + var offsetNumeric = function(offset) { + var date = new Date(); + date.setDate(date.getDate() + offset); + return date; + }, + offsetString = function(offset) { + try { + return $.datepicker.parseDate($.datepicker._get(inst, "dateFormat"), + offset, $.datepicker._getFormatConfig(inst)); + } + catch (e) { + // Ignore + } + + var date = (offset.toLowerCase().match(/^c/) ? + $.datepicker._getDate(inst) : null) || new Date(), + year = date.getFullYear(), + month = date.getMonth(), + day = date.getDate(), + pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g, + matches = pattern.exec(offset); + + while (matches) { + switch (matches[2] || "d") { + case "d" : case "D" : + day += parseInt(matches[1],10); break; + case "w" : case "W" : + day += parseInt(matches[1],10) * 7; break; + case "m" : case "M" : + month += parseInt(matches[1],10); + day = Math.min(day, $.datepicker._getDaysInMonth(year, month)); + break; + case "y": case "Y" : + year += parseInt(matches[1],10); + day = Math.min(day, $.datepicker._getDaysInMonth(year, month)); + break; + } + matches = pattern.exec(offset); + } + return new Date(year, month, day); + }, + newDate = (date == null || date === "" ? defaultDate : (typeof date === "string" ? offsetString(date) : + (typeof date === "number" ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime())))); + + newDate = (newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate); + if (newDate) { + newDate.setHours(0); + newDate.setMinutes(0); + newDate.setSeconds(0); + newDate.setMilliseconds(0); + } + return this._daylightSavingAdjust(newDate); + }, + + /* Handle switch to/from daylight saving. + * Hours may be non-zero on daylight saving cut-over: + * > 12 when midnight changeover, but then cannot generate + * midnight datetime, so jump to 1AM, otherwise reset. + * @param date (Date) the date to check + * @return (Date) the corrected date + */ + _daylightSavingAdjust: function(date) { + if (!date) { + return null; + } + date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0); + return date; + }, + + /* Set the date(s) directly. */ + _setDate: function(inst, date, noChange) { + var clear = !date, + origMonth = inst.selectedMonth, + origYear = inst.selectedYear, + newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date())); + + inst.selectedDay = inst.currentDay = newDate.getDate(); + inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth(); + inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear(); + if ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) && !noChange) { + this._notifyChange(inst); + } + this._adjustInstDate(inst); + if (inst.input) { + inst.input.val(clear ? "" : this._formatDate(inst)); + } + }, + + /* Retrieve the date(s) directly. */ + _getDate: function(inst) { + var startDate = (!inst.currentYear || (inst.input && inst.input.val() === "") ? null : + this._daylightSavingAdjust(new Date( + inst.currentYear, inst.currentMonth, inst.currentDay))); + return startDate; + }, + + /* Attach the onxxx handlers. These are declared statically so + * they work with static code transformers like Caja. + */ + _attachHandlers: function(inst) { + var stepMonths = this._get(inst, "stepMonths"), + id = "#" + inst.id.replace( /\\\\/g, "\\" ); + inst.dpDiv.find("[data-handler]").map(function () { + var handler = { + prev: function () { + $.datepicker._adjustDate(id, -stepMonths, "M"); + }, + next: function () { + $.datepicker._adjustDate(id, +stepMonths, "M"); + }, + hide: function () { + $.datepicker._hideDatepicker(); + }, + today: function () { + $.datepicker._gotoToday(id); + }, + selectDay: function () { + $.datepicker._selectDay(id, +this.getAttribute("data-month"), +this.getAttribute("data-year"), this); + return false; + }, + selectMonth: function () { + $.datepicker._selectMonthYear(id, this, "M"); + return false; + }, + selectYear: function () { + $.datepicker._selectMonthYear(id, this, "Y"); + return false; + } + }; + $(this).bind(this.getAttribute("data-event"), handler[this.getAttribute("data-handler")]); + }); + }, + + /* Generate the HTML for the current state of the date picker. */ + _generateHTML: function(inst) { + var maxDraw, prevText, prev, nextText, next, currentText, gotoDate, + controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin, + monthNames, monthNamesShort, beforeShowDay, showOtherMonths, + selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate, + cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows, + printDate, dRow, tbody, daySettings, otherMonth, unselectable, + tempDate = new Date(), + today = this._daylightSavingAdjust( + new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())), // clear time + isRTL = this._get(inst, "isRTL"), + showButtonPanel = this._get(inst, "showButtonPanel"), + hideIfNoPrevNext = this._get(inst, "hideIfNoPrevNext"), + navigationAsDateFormat = this._get(inst, "navigationAsDateFormat"), + numMonths = this._getNumberOfMonths(inst), + showCurrentAtPos = this._get(inst, "showCurrentAtPos"), + stepMonths = this._get(inst, "stepMonths"), + isMultiMonth = (numMonths[0] !== 1 || numMonths[1] !== 1), + currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) : + new Date(inst.currentYear, inst.currentMonth, inst.currentDay))), + minDate = this._getMinMaxDate(inst, "min"), + maxDate = this._getMinMaxDate(inst, "max"), + drawMonth = inst.drawMonth - showCurrentAtPos, + drawYear = inst.drawYear; + + if (drawMonth < 0) { + drawMonth += 12; + drawYear--; + } + if (maxDate) { + maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(), + maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate())); + maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw); + while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) { + drawMonth--; + if (drawMonth < 0) { + drawMonth = 11; + drawYear--; + } + } + } + inst.drawMonth = drawMonth; + inst.drawYear = drawYear; + + prevText = this._get(inst, "prevText"); + prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)), + this._getFormatConfig(inst))); + + prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ? + "<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'" + + " title='" + prevText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w") + "'>" + prevText + "</span></a>" : + (hideIfNoPrevNext ? "" : "<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+ prevText +"'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "e" : "w") + "'>" + prevText + "</span></a>")); + + nextText = this._get(inst, "nextText"); + nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)), + this._getFormatConfig(inst))); + + next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ? + "<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'" + + " title='" + nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e") + "'>" + nextText + "</span></a>" : + (hideIfNoPrevNext ? "" : "<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+ nextText + "'><span class='ui-icon ui-icon-circle-triangle-" + ( isRTL ? "w" : "e") + "'>" + nextText + "</span></a>")); + + currentText = this._get(inst, "currentText"); + gotoDate = (this._get(inst, "gotoCurrent") && inst.currentDay ? currentDate : today); + currentText = (!navigationAsDateFormat ? currentText : + this.formatDate(currentText, gotoDate, this._getFormatConfig(inst))); + + controls = (!inst.inline ? "<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>" + + this._get(inst, "closeText") + "</button>" : ""); + + buttonPanel = (showButtonPanel) ? "<div class='ui-datepicker-buttonpane ui-widget-content'>" + (isRTL ? controls : "") + + (this._isInRange(inst, gotoDate) ? "<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'" + + ">" + currentText + "</button>" : "") + (isRTL ? "" : controls) + "</div>" : ""; + + firstDay = parseInt(this._get(inst, "firstDay"),10); + firstDay = (isNaN(firstDay) ? 0 : firstDay); + + showWeek = this._get(inst, "showWeek"); + dayNames = this._get(inst, "dayNames"); + dayNamesMin = this._get(inst, "dayNamesMin"); + monthNames = this._get(inst, "monthNames"); + monthNamesShort = this._get(inst, "monthNamesShort"); + beforeShowDay = this._get(inst, "beforeShowDay"); + showOtherMonths = this._get(inst, "showOtherMonths"); + selectOtherMonths = this._get(inst, "selectOtherMonths"); + defaultDate = this._getDefaultDate(inst); + html = ""; + dow; + for (row = 0; row < numMonths[0]; row++) { + group = ""; + this.maxRows = 4; + for (col = 0; col < numMonths[1]; col++) { + selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay)); + cornerClass = " ui-corner-all"; + calender = ""; + if (isMultiMonth) { + calender += "<div class='ui-datepicker-group"; + if (numMonths[1] > 1) { + switch (col) { + case 0: calender += " ui-datepicker-group-first"; + cornerClass = " ui-corner-" + (isRTL ? "right" : "left"); break; + case numMonths[1]-1: calender += " ui-datepicker-group-last"; + cornerClass = " ui-corner-" + (isRTL ? "left" : "right"); break; + default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break; + } + } + calender += "'>"; + } + calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" + + (/all|left/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) : "") + + (/all|right/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) : "") + + this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate, + row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers + "</div><table class='ui-datepicker-calendar'><thead>" + + "<tr>"; + thead = (showWeek ? "<th class='ui-datepicker-week-col'>" + this._get(inst, "weekHeader") + "</th>" : ""); + for (dow = 0; dow < 7; dow++) { // days of the week + day = (dow + firstDay) % 7; + thead += "<th scope='col'" + ((dow + firstDay + 6) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "") + ">" + + "<span title='" + dayNames[day] + "'>" + dayNamesMin[day] + "</span></th>"; + } + calender += thead + "</tr></thead><tbody>"; + daysInMonth = this._getDaysInMonth(drawYear, drawMonth); + if (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) { + inst.selectedDay = Math.min(inst.selectedDay, daysInMonth); + } + leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7; + curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate + numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043) + this.maxRows = numRows; + printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays)); + for (dRow = 0; dRow < numRows; dRow++) { // create date picker rows + calender += "<tr>"; + tbody = (!showWeek ? "" : "<td class='ui-datepicker-week-col'>" + + this._get(inst, "calculateWeek")(printDate) + "</td>"); + for (dow = 0; dow < 7; dow++) { // create date picker days + daySettings = (beforeShowDay ? + beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, ""]); + otherMonth = (printDate.getMonth() !== drawMonth); + unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] || + (minDate && printDate < minDate) || (maxDate && printDate > maxDate); + tbody += "<td class='" + + ((dow + firstDay + 6) % 7 >= 5 ? " ui-datepicker-week-end" : "") + // highlight weekends + (otherMonth ? " ui-datepicker-other-month" : "") + // highlight days from other months + ((printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent) || // user pressed key + (defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime()) ? + // or defaultDate is current printedDate and defaultDate is selectedDate + " " + this._dayOverClass : "") + // highlight selected day + (unselectable ? " " + this._unselectableClass + " ui-state-disabled": "") + // highlight unselectable days + (otherMonth && !showOtherMonths ? "" : " " + daySettings[1] + // highlight custom dates + (printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "") + // highlight selected day + (printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "")) + "'" + // highlight today (if different) + ((!otherMonth || showOtherMonths) && daySettings[2] ? " title='" + daySettings[2].replace(/'/g, "&#39;") + "'" : "") + // cell title + (unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'") + ">" + // actions + (otherMonth && !showOtherMonths ? "&#xa0;" : // display for other months + (unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" + + (printDate.getTime() === today.getTime() ? " ui-state-highlight" : "") + + (printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "") + // highlight selected day + (otherMonth ? " ui-priority-secondary" : "") + // distinguish dates from other months + "' href='#'>" + printDate.getDate() + "</a>")) + "</td>"; // display selectable date + printDate.setDate(printDate.getDate() + 1); + printDate = this._daylightSavingAdjust(printDate); + } + calender += tbody + "</tr>"; + } + drawMonth++; + if (drawMonth > 11) { + drawMonth = 0; + drawYear++; + } + calender += "</tbody></table>" + (isMultiMonth ? "</div>" + + ((numMonths[0] > 0 && col === numMonths[1]-1) ? "<div class='ui-datepicker-row-break'></div>" : "") : ""); + group += calender; + } + html += group; + } + html += buttonPanel; + inst._keyEvent = false; + return html; + }, + + /* Generate the month and year header. */ + _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate, + secondary, monthNames, monthNamesShort) { + + var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear, + changeMonth = this._get(inst, "changeMonth"), + changeYear = this._get(inst, "changeYear"), + showMonthAfterYear = this._get(inst, "showMonthAfterYear"), + html = "<div class='ui-datepicker-title'>", + monthHtml = ""; + + // month selection + if (secondary || !changeMonth) { + monthHtml += "<span class='ui-datepicker-month'>" + monthNames[drawMonth] + "</span>"; + } else { + inMinYear = (minDate && minDate.getFullYear() === drawYear); + inMaxYear = (maxDate && maxDate.getFullYear() === drawYear); + monthHtml += "<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>"; + for ( month = 0; month < 12; month++) { + if ((!inMinYear || month >= minDate.getMonth()) && (!inMaxYear || month <= maxDate.getMonth())) { + monthHtml += "<option value='" + month + "'" + + (month === drawMonth ? " selected='selected'" : "") + + ">" + monthNamesShort[month] + "</option>"; + } + } + monthHtml += "</select>"; + } + + if (!showMonthAfterYear) { + html += monthHtml + (secondary || !(changeMonth && changeYear) ? "&#xa0;" : ""); + } + + // year selection + if ( !inst.yearshtml ) { + inst.yearshtml = ""; + if (secondary || !changeYear) { + html += "<span class='ui-datepicker-year'>" + drawYear + "</span>"; + } else { + // determine range of years to display + years = this._get(inst, "yearRange").split(":"); + thisYear = new Date().getFullYear(); + determineYear = function(value) { + var year = (value.match(/c[+\-].*/) ? drawYear + parseInt(value.substring(1), 10) : + (value.match(/[+\-].*/) ? thisYear + parseInt(value, 10) : + parseInt(value, 10))); + return (isNaN(year) ? thisYear : year); + }; + year = determineYear(years[0]); + endYear = Math.max(year, determineYear(years[1] || "")); + year = (minDate ? Math.max(year, minDate.getFullYear()) : year); + endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear); + inst.yearshtml += "<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>"; + for (; year <= endYear; year++) { + inst.yearshtml += "<option value='" + year + "'" + + (year === drawYear ? " selected='selected'" : "") + + ">" + year + "</option>"; + } + inst.yearshtml += "</select>"; + + html += inst.yearshtml; + inst.yearshtml = null; + } + } + + html += this._get(inst, "yearSuffix"); + if (showMonthAfterYear) { + html += (secondary || !(changeMonth && changeYear) ? "&#xa0;" : "") + monthHtml; + } + html += "</div>"; // Close datepicker_header + return html; + }, + + /* Adjust one of the date sub-fields. */ + _adjustInstDate: function(inst, offset, period) { + var year = inst.drawYear + (period === "Y" ? offset : 0), + month = inst.drawMonth + (period === "M" ? offset : 0), + day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period === "D" ? offset : 0), + date = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day))); + + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + if (period === "M" || period === "Y") { + this._notifyChange(inst); + } + }, + + /* Ensure a date is within any min/max bounds. */ + _restrictMinMax: function(inst, date) { + var minDate = this._getMinMaxDate(inst, "min"), + maxDate = this._getMinMaxDate(inst, "max"), + newDate = (minDate && date < minDate ? minDate : date); + return (maxDate && newDate > maxDate ? maxDate : newDate); + }, + + /* Notify change of month/year. */ + _notifyChange: function(inst) { + var onChange = this._get(inst, "onChangeMonthYear"); + if (onChange) { + onChange.apply((inst.input ? inst.input[0] : null), + [inst.selectedYear, inst.selectedMonth + 1, inst]); + } + }, + + /* Determine the number of months to show. */ + _getNumberOfMonths: function(inst) { + var numMonths = this._get(inst, "numberOfMonths"); + return (numMonths == null ? [1, 1] : (typeof numMonths === "number" ? [1, numMonths] : numMonths)); + }, + + /* Determine the current maximum date - ensure no time components are set. */ + _getMinMaxDate: function(inst, minMax) { + return this._determineDate(inst, this._get(inst, minMax + "Date"), null); + }, + + /* Find the number of days in a given month. */ + _getDaysInMonth: function(year, month) { + return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate(); + }, + + /* Find the day of the week of the first of a month. */ + _getFirstDayOfMonth: function(year, month) { + return new Date(year, month, 1).getDay(); + }, + + /* Determines if we should allow a "next/prev" month display change. */ + _canAdjustMonth: function(inst, offset, curYear, curMonth) { + var numMonths = this._getNumberOfMonths(inst), + date = this._daylightSavingAdjust(new Date(curYear, + curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1)); + + if (offset < 0) { + date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth())); + } + return this._isInRange(inst, date); + }, + + /* Is the given date in the accepted range? */ + _isInRange: function(inst, date) { + var yearSplit, currentYear, + minDate = this._getMinMaxDate(inst, "min"), + maxDate = this._getMinMaxDate(inst, "max"), + minYear = null, + maxYear = null, + years = this._get(inst, "yearRange"); + if (years){ + yearSplit = years.split(":"); + currentYear = new Date().getFullYear(); + minYear = parseInt(yearSplit[0], 10); + maxYear = parseInt(yearSplit[1], 10); + if ( yearSplit[0].match(/[+\-].*/) ) { + minYear += currentYear; + } + if ( yearSplit[1].match(/[+\-].*/) ) { + maxYear += currentYear; + } + } + + return ((!minDate || date.getTime() >= minDate.getTime()) && + (!maxDate || date.getTime() <= maxDate.getTime()) && + (!minYear || date.getFullYear() >= minYear) && + (!maxYear || date.getFullYear() <= maxYear)); + }, + + /* Provide the configuration settings for formatting/parsing. */ + _getFormatConfig: function(inst) { + var shortYearCutoff = this._get(inst, "shortYearCutoff"); + shortYearCutoff = (typeof shortYearCutoff !== "string" ? shortYearCutoff : + new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10)); + return {shortYearCutoff: shortYearCutoff, + dayNamesShort: this._get(inst, "dayNamesShort"), dayNames: this._get(inst, "dayNames"), + monthNamesShort: this._get(inst, "monthNamesShort"), monthNames: this._get(inst, "monthNames")}; + }, + + /* Format the given date for display. */ + _formatDate: function(inst, day, month, year) { + if (!day) { + inst.currentDay = inst.selectedDay; + inst.currentMonth = inst.selectedMonth; + inst.currentYear = inst.selectedYear; + } + var date = (day ? (typeof day === "object" ? day : + this._daylightSavingAdjust(new Date(year, month, day))) : + this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); + return this.formatDate(this._get(inst, "dateFormat"), date, this._getFormatConfig(inst)); + } +}); + +/* + * Bind hover events for datepicker elements. + * Done via delegate so the binding only occurs once in the lifetime of the parent div. + * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker. + */ +function datepicker_bindHover(dpDiv) { + var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a"; + return dpDiv.delegate(selector, "mouseout", function() { + $(this).removeClass("ui-state-hover"); + if (this.className.indexOf("ui-datepicker-prev") !== -1) { + $(this).removeClass("ui-datepicker-prev-hover"); + } + if (this.className.indexOf("ui-datepicker-next") !== -1) { + $(this).removeClass("ui-datepicker-next-hover"); + } + }) + .delegate( selector, "mouseover", datepicker_handleMouseover ); +} + +function datepicker_handleMouseover() { + if (!$.datepicker._isDisabledDatepicker( datepicker_instActive.inline? datepicker_instActive.dpDiv.parent()[0] : datepicker_instActive.input[0])) { + $(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"); + $(this).addClass("ui-state-hover"); + if (this.className.indexOf("ui-datepicker-prev") !== -1) { + $(this).addClass("ui-datepicker-prev-hover"); + } + if (this.className.indexOf("ui-datepicker-next") !== -1) { + $(this).addClass("ui-datepicker-next-hover"); + } + } +} + +/* jQuery extend now ignores nulls! */ +function datepicker_extendRemove(target, props) { + $.extend(target, props); + for (var name in props) { + if (props[name] == null) { + target[name] = props[name]; + } + } + return target; +} + +/* Invoke the datepicker functionality. + @param options string - a command, optionally followed by additional parameters or + Object - settings for attaching new datepicker functionality + @return jQuery object */ +$.fn.datepicker = function(options){ + + /* Verify an empty collection wasn't passed - Fixes #6976 */ + if ( !this.length ) { + return this; + } + + /* Initialise the date picker. */ + if (!$.datepicker.initialized) { + $(document).mousedown($.datepicker._checkExternalClick); + $.datepicker.initialized = true; + } + + /* Append datepicker main container to body if not exist. */ + if ($("#"+$.datepicker._mainDivId).length === 0) { + $("body").append($.datepicker.dpDiv); + } + + var otherArgs = Array.prototype.slice.call(arguments, 1); + if (typeof options === "string" && (options === "isDisabled" || options === "getDate" || options === "widget")) { + return $.datepicker["_" + options + "Datepicker"]. + apply($.datepicker, [this[0]].concat(otherArgs)); + } + if (options === "option" && arguments.length === 2 && typeof arguments[1] === "string") { + return $.datepicker["_" + options + "Datepicker"]. + apply($.datepicker, [this[0]].concat(otherArgs)); + } + return this.each(function() { + typeof options === "string" ? + $.datepicker["_" + options + "Datepicker"]. + apply($.datepicker, [this].concat(otherArgs)) : + $.datepicker._attachDatepicker(this, options); + }); +}; + +$.datepicker = new Datepicker(); // singleton instance +$.datepicker.initialized = false; +$.datepicker.uuid = new Date().getTime(); +$.datepicker.version = "1.11.4"; + +var datepicker = $.datepicker; + + +/*! + * jQuery UI Draggable 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/draggable/ + */ + + +$.widget("ui.draggable", $.ui.mouse, { + version: "1.11.4", + widgetEventPrefix: "drag", + options: { + addClasses: true, + appendTo: "parent", + axis: false, + connectToSortable: false, + containment: false, + cursor: "auto", + cursorAt: false, + grid: false, + handle: false, + helper: "original", + iframeFix: false, + opacity: false, + refreshPositions: false, + revert: false, + revertDuration: 500, + scope: "default", + scroll: true, + scrollSensitivity: 20, + scrollSpeed: 20, + snap: false, + snapMode: "both", + snapTolerance: 20, + stack: false, + zIndex: false, + + // callbacks + drag: null, + start: null, + stop: null + }, + _create: function() { + + if ( this.options.helper === "original" ) { + this._setPositionRelative(); + } + if (this.options.addClasses){ + this.element.addClass("ui-draggable"); + } + if (this.options.disabled){ + this.element.addClass("ui-draggable-disabled"); + } + this._setHandleClassName(); + + this._mouseInit(); + }, + + _setOption: function( key, value ) { + this._super( key, value ); + if ( key === "handle" ) { + this._removeHandleClassName(); + this._setHandleClassName(); + } + }, + + _destroy: function() { + if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) { + this.destroyOnClear = true; + return; + } + this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" ); + this._removeHandleClassName(); + this._mouseDestroy(); + }, + + _mouseCapture: function(event) { + var o = this.options; + + this._blurActiveElement( event ); + + // among others, prevent a drag on a resizable-handle + if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) { + return false; + } + + //Quit if we're not on a valid handle + this.handle = this._getHandle(event); + if (!this.handle) { + return false; + } + + this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix ); + + return true; + + }, + + _blockFrames: function( selector ) { + this.iframeBlocks = this.document.find( selector ).map(function() { + var iframe = $( this ); + + return $( "<div>" ) + .css( "position", "absolute" ) + .appendTo( iframe.parent() ) + .outerWidth( iframe.outerWidth() ) + .outerHeight( iframe.outerHeight() ) + .offset( iframe.offset() )[ 0 ]; + }); + }, + + _unblockFrames: function() { + if ( this.iframeBlocks ) { + this.iframeBlocks.remove(); + delete this.iframeBlocks; + } + }, + + _blurActiveElement: function( event ) { + var document = this.document[ 0 ]; + + // Only need to blur if the event occurred on the draggable itself, see #10527 + if ( !this.handleElement.is( event.target ) ) { + return; + } + + // support: IE9 + // IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe> + try { + + // Support: IE9, IE10 + // If the <body> is blurred, IE will switch windows, see #9520 + if ( document.activeElement && document.activeElement.nodeName.toLowerCase() !== "body" ) { + + // Blur any element that currently has focus, see #4261 + $( document.activeElement ).blur(); + } + } catch ( error ) {} + }, + + _mouseStart: function(event) { + + var o = this.options; + + //Create and append the visible helper + this.helper = this._createHelper(event); + + this.helper.addClass("ui-draggable-dragging"); + + //Cache the helper size + this._cacheHelperProportions(); + + //If ddmanager is used for droppables, set the global draggable + if ($.ui.ddmanager) { + $.ui.ddmanager.current = this; + } + + /* + * - Position generation - + * This block generates everything position related - it's the core of draggables. + */ + + //Cache the margins of the original element + this._cacheMargins(); + + //Store the helper's css position + this.cssPosition = this.helper.css( "position" ); + this.scrollParent = this.helper.scrollParent( true ); + this.offsetParent = this.helper.offsetParent(); + this.hasFixedAncestor = this.helper.parents().filter(function() { + return $( this ).css( "position" ) === "fixed"; + }).length > 0; + + //The element's absolute position on the page minus margins + this.positionAbs = this.element.offset(); + this._refreshOffsets( event ); + + //Generate the original position + this.originalPosition = this.position = this._generatePosition( event, false ); + this.originalPageX = event.pageX; + this.originalPageY = event.pageY; + + //Adjust the mouse offset relative to the helper if "cursorAt" is supplied + (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt)); + + //Set a containment if given in the options + this._setContainment(); + + //Trigger event + callbacks + if (this._trigger("start", event) === false) { + this._clear(); + return false; + } + + //Recache the helper size + this._cacheHelperProportions(); + + //Prepare the droppable offsets + if ($.ui.ddmanager && !o.dropBehaviour) { + $.ui.ddmanager.prepareOffsets(this, event); + } + + // Reset helper's right/bottom css if they're set and set explicit width/height instead + // as this prevents resizing of elements with right/bottom set (see #7772) + this._normalizeRightBottom(); + + this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position + + //If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003) + if ( $.ui.ddmanager ) { + $.ui.ddmanager.dragStart(this, event); + } + + return true; + }, + + _refreshOffsets: function( event ) { + this.offset = { + top: this.positionAbs.top - this.margins.top, + left: this.positionAbs.left - this.margins.left, + scroll: false, + parent: this._getParentOffset(), + relative: this._getRelativeOffset() + }; + + this.offset.click = { + left: event.pageX - this.offset.left, + top: event.pageY - this.offset.top + }; + }, + + _mouseDrag: function(event, noPropagation) { + // reset any necessary cached properties (see #5009) + if ( this.hasFixedAncestor ) { + this.offset.parent = this._getParentOffset(); + } + + //Compute the helpers position + this.position = this._generatePosition( event, true ); + this.positionAbs = this._convertPositionTo("absolute"); + + //Call plugins and callbacks and use the resulting position if something is returned + if (!noPropagation) { + var ui = this._uiHash(); + if (this._trigger("drag", event, ui) === false) { + this._mouseUp({}); + return false; + } + this.position = ui.position; + } + + this.helper[ 0 ].style.left = this.position.left + "px"; + this.helper[ 0 ].style.top = this.position.top + "px"; + + if ($.ui.ddmanager) { + $.ui.ddmanager.drag(this, event); + } + + return false; + }, + + _mouseStop: function(event) { + + //If we are using droppables, inform the manager about the drop + var that = this, + dropped = false; + if ($.ui.ddmanager && !this.options.dropBehaviour) { + dropped = $.ui.ddmanager.drop(this, event); + } + + //if a drop comes from outside (a sortable) + if (this.dropped) { + dropped = this.dropped; + this.dropped = false; + } + + if ((this.options.revert === "invalid" && !dropped) || (this.options.revert === "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) { + $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() { + if (that._trigger("stop", event) !== false) { + that._clear(); + } + }); + } else { + if (this._trigger("stop", event) !== false) { + this._clear(); + } + } + + return false; + }, + + _mouseUp: function( event ) { + this._unblockFrames(); + + //If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003) + if ( $.ui.ddmanager ) { + $.ui.ddmanager.dragStop(this, event); + } + + // Only need to focus if the event occurred on the draggable itself, see #10527 + if ( this.handleElement.is( event.target ) ) { + // The interaction is over; whether or not the click resulted in a drag, focus the element + this.element.focus(); + } + + return $.ui.mouse.prototype._mouseUp.call(this, event); + }, + + cancel: function() { + + if (this.helper.is(".ui-draggable-dragging")) { + this._mouseUp({}); + } else { + this._clear(); + } + + return this; + + }, + + _getHandle: function(event) { + return this.options.handle ? + !!$( event.target ).closest( this.element.find( this.options.handle ) ).length : + true; + }, + + _setHandleClassName: function() { + this.handleElement = this.options.handle ? + this.element.find( this.options.handle ) : this.element; + this.handleElement.addClass( "ui-draggable-handle" ); + }, + + _removeHandleClassName: function() { + this.handleElement.removeClass( "ui-draggable-handle" ); + }, + + _createHelper: function(event) { + + var o = this.options, + helperIsFunction = $.isFunction( o.helper ), + helper = helperIsFunction ? + $( o.helper.apply( this.element[ 0 ], [ event ] ) ) : + ( o.helper === "clone" ? + this.element.clone().removeAttr( "id" ) : + this.element ); + + if (!helper.parents("body").length) { + helper.appendTo((o.appendTo === "parent" ? this.element[0].parentNode : o.appendTo)); + } + + // http://bugs.jqueryui.com/ticket/9446 + // a helper function can return the original element + // which wouldn't have been set to relative in _create + if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) { + this._setPositionRelative(); + } + + if (helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) { + helper.css("position", "absolute"); + } + + return helper; + + }, + + _setPositionRelative: function() { + if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) { + this.element[ 0 ].style.position = "relative"; + } + }, + + _adjustOffsetFromHelper: function(obj) { + if (typeof obj === "string") { + obj = obj.split(" "); + } + if ($.isArray(obj)) { + obj = { left: +obj[0], top: +obj[1] || 0 }; + } + if ("left" in obj) { + this.offset.click.left = obj.left + this.margins.left; + } + if ("right" in obj) { + this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; + } + if ("top" in obj) { + this.offset.click.top = obj.top + this.margins.top; + } + if ("bottom" in obj) { + this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; + } + }, + + _isRootNode: function( element ) { + return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ]; + }, + + _getParentOffset: function() { + + //Get the offsetParent and cache its position + var po = this.offsetParent.offset(), + document = this.document[ 0 ]; + + // This is a special case where we need to modify a offset calculated on start, since the following happened: + // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent + // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that + // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag + if (this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) { + po.left += this.scrollParent.scrollLeft(); + po.top += this.scrollParent.scrollTop(); + } + + if ( this._isRootNode( this.offsetParent[ 0 ] ) ) { + po = { top: 0, left: 0 }; + } + + return { + top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"), 10) || 0), + left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"), 10) || 0) + }; + + }, + + _getRelativeOffset: function() { + if ( this.cssPosition !== "relative" ) { + return { top: 0, left: 0 }; + } + + var p = this.element.position(), + scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ); + + return { + top: p.top - ( parseInt(this.helper.css( "top" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ), + left: p.left - ( parseInt(this.helper.css( "left" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 ) + }; + + }, + + _cacheMargins: function() { + this.margins = { + left: (parseInt(this.element.css("marginLeft"), 10) || 0), + top: (parseInt(this.element.css("marginTop"), 10) || 0), + right: (parseInt(this.element.css("marginRight"), 10) || 0), + bottom: (parseInt(this.element.css("marginBottom"), 10) || 0) + }; + }, + + _cacheHelperProportions: function() { + this.helperProportions = { + width: this.helper.outerWidth(), + height: this.helper.outerHeight() + }; + }, + + _setContainment: function() { + + var isUserScrollable, c, ce, + o = this.options, + document = this.document[ 0 ]; + + this.relativeContainer = null; + + if ( !o.containment ) { + this.containment = null; + return; + } + + if ( o.containment === "window" ) { + this.containment = [ + $( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left, + $( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top, + $( window ).scrollLeft() + $( window ).width() - this.helperProportions.width - this.margins.left, + $( window ).scrollTop() + ( $( window ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top + ]; + return; + } + + if ( o.containment === "document") { + this.containment = [ + 0, + 0, + $( document ).width() - this.helperProportions.width - this.margins.left, + ( $( document ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top + ]; + return; + } + + if ( o.containment.constructor === Array ) { + this.containment = o.containment; + return; + } + + if ( o.containment === "parent" ) { + o.containment = this.helper[ 0 ].parentNode; + } + + c = $( o.containment ); + ce = c[ 0 ]; + + if ( !ce ) { + return; + } + + isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) ); + + this.containment = [ + ( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ), + ( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) + ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ), + ( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) - + ( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) - + ( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) - + this.helperProportions.width - + this.margins.left - + this.margins.right, + ( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) - + ( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) - + ( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) - + this.helperProportions.height - + this.margins.top - + this.margins.bottom + ]; + this.relativeContainer = c; + }, + + _convertPositionTo: function(d, pos) { + + if (!pos) { + pos = this.position; + } + + var mod = d === "absolute" ? 1 : -1, + scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ); + + return { + top: ( + pos.top + // The absolute mouse position + this.offset.relative.top * mod + // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.top * mod - // The offsetParent's offset without borders (offset + border) + ( ( this.cssPosition === "fixed" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod) + ), + left: ( + pos.left + // The absolute mouse position + this.offset.relative.left * mod + // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.left * mod - // The offsetParent's offset without borders (offset + border) + ( ( this.cssPosition === "fixed" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod) + ) + }; + + }, + + _generatePosition: function( event, constrainPosition ) { + + var containment, co, top, left, + o = this.options, + scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ), + pageX = event.pageX, + pageY = event.pageY; + + // Cache the scroll + if ( !scrollIsRootNode || !this.offset.scroll ) { + this.offset.scroll = { + top: this.scrollParent.scrollTop(), + left: this.scrollParent.scrollLeft() + }; + } + + /* + * - Position constraining - + * Constrain the position to a mix of grid, containment. + */ + + // If we are not dragging yet, we won't check for options + if ( constrainPosition ) { + if ( this.containment ) { + if ( this.relativeContainer ){ + co = this.relativeContainer.offset(); + containment = [ + this.containment[ 0 ] + co.left, + this.containment[ 1 ] + co.top, + this.containment[ 2 ] + co.left, + this.containment[ 3 ] + co.top + ]; + } else { + containment = this.containment; + } + + if (event.pageX - this.offset.click.left < containment[0]) { + pageX = containment[0] + this.offset.click.left; + } + if (event.pageY - this.offset.click.top < containment[1]) { + pageY = containment[1] + this.offset.click.top; + } + if (event.pageX - this.offset.click.left > containment[2]) { + pageX = containment[2] + this.offset.click.left; + } + if (event.pageY - this.offset.click.top > containment[3]) { + pageY = containment[3] + this.offset.click.top; + } + } + + if (o.grid) { + //Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950) + top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY; + pageY = containment ? ((top - this.offset.click.top >= containment[1] || top - this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >= containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top; + + left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX; + pageX = containment ? ((left - this.offset.click.left >= containment[0] || left - this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >= containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left; + } + + if ( o.axis === "y" ) { + pageX = this.originalPageX; + } + + if ( o.axis === "x" ) { + pageY = this.originalPageY; + } + } + + return { + top: ( + pageY - // The absolute mouse position + this.offset.click.top - // Click offset (relative to the element) + this.offset.relative.top - // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.top + // The offsetParent's offset without borders (offset + border) + ( this.cssPosition === "fixed" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) + ), + left: ( + pageX - // The absolute mouse position + this.offset.click.left - // Click offset (relative to the element) + this.offset.relative.left - // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.left + // The offsetParent's offset without borders (offset + border) + ( this.cssPosition === "fixed" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) + ) + }; + + }, + + _clear: function() { + this.helper.removeClass("ui-draggable-dragging"); + if (this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) { + this.helper.remove(); + } + this.helper = null; + this.cancelHelperRemoval = false; + if ( this.destroyOnClear ) { + this.destroy(); + } + }, + + _normalizeRightBottom: function() { + if ( this.options.axis !== "y" && this.helper.css( "right" ) !== "auto" ) { + this.helper.width( this.helper.width() ); + this.helper.css( "right", "auto" ); + } + if ( this.options.axis !== "x" && this.helper.css( "bottom" ) !== "auto" ) { + this.helper.height( this.helper.height() ); + this.helper.css( "bottom", "auto" ); + } + }, + + // From now on bulk stuff - mainly helpers + + _trigger: function( type, event, ui ) { + ui = ui || this._uiHash(); + $.ui.plugin.call( this, type, [ event, ui, this ], true ); + + // Absolute position and offset (see #6884 ) have to be recalculated after plugins + if ( /^(drag|start|stop)/.test( type ) ) { + this.positionAbs = this._convertPositionTo( "absolute" ); + ui.offset = this.positionAbs; + } + return $.Widget.prototype._trigger.call( this, type, event, ui ); + }, + + plugins: {}, + + _uiHash: function() { + return { + helper: this.helper, + position: this.position, + originalPosition: this.originalPosition, + offset: this.positionAbs + }; + } + +}); + +$.ui.plugin.add( "draggable", "connectToSortable", { + start: function( event, ui, draggable ) { + var uiSortable = $.extend( {}, ui, { + item: draggable.element + }); + + draggable.sortables = []; + $( draggable.options.connectToSortable ).each(function() { + var sortable = $( this ).sortable( "instance" ); + + if ( sortable && !sortable.options.disabled ) { + draggable.sortables.push( sortable ); + + // refreshPositions is called at drag start to refresh the containerCache + // which is used in drag. This ensures it's initialized and synchronized + // with any changes that might have happened on the page since initialization. + sortable.refreshPositions(); + sortable._trigger("activate", event, uiSortable); + } + }); + }, + stop: function( event, ui, draggable ) { + var uiSortable = $.extend( {}, ui, { + item: draggable.element + }); + + draggable.cancelHelperRemoval = false; + + $.each( draggable.sortables, function() { + var sortable = this; + + if ( sortable.isOver ) { + sortable.isOver = 0; + + // Allow this sortable to handle removing the helper + draggable.cancelHelperRemoval = true; + sortable.cancelHelperRemoval = false; + + // Use _storedCSS To restore properties in the sortable, + // as this also handles revert (#9675) since the draggable + // may have modified them in unexpected ways (#8809) + sortable._storedCSS = { + position: sortable.placeholder.css( "position" ), + top: sortable.placeholder.css( "top" ), + left: sortable.placeholder.css( "left" ) + }; + + sortable._mouseStop(event); + + // Once drag has ended, the sortable should return to using + // its original helper, not the shared helper from draggable + sortable.options.helper = sortable.options._helper; + } else { + // Prevent this Sortable from removing the helper. + // However, don't set the draggable to remove the helper + // either as another connected Sortable may yet handle the removal. + sortable.cancelHelperRemoval = true; + + sortable._trigger( "deactivate", event, uiSortable ); + } + }); + }, + drag: function( event, ui, draggable ) { + $.each( draggable.sortables, function() { + var innermostIntersecting = false, + sortable = this; + + // Copy over variables that sortable's _intersectsWith uses + sortable.positionAbs = draggable.positionAbs; + sortable.helperProportions = draggable.helperProportions; + sortable.offset.click = draggable.offset.click; + + if ( sortable._intersectsWith( sortable.containerCache ) ) { + innermostIntersecting = true; + + $.each( draggable.sortables, function() { + // Copy over variables that sortable's _intersectsWith uses + this.positionAbs = draggable.positionAbs; + this.helperProportions = draggable.helperProportions; + this.offset.click = draggable.offset.click; + + if ( this !== sortable && + this._intersectsWith( this.containerCache ) && + $.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) { + innermostIntersecting = false; + } + + return innermostIntersecting; + }); + } + + if ( innermostIntersecting ) { + // If it intersects, we use a little isOver variable and set it once, + // so that the move-in stuff gets fired only once. + if ( !sortable.isOver ) { + sortable.isOver = 1; + + // Store draggable's parent in case we need to reappend to it later. + draggable._parent = ui.helper.parent(); + + sortable.currentItem = ui.helper + .appendTo( sortable.element ) + .data( "ui-sortable-item", true ); + + // Store helper option to later restore it + sortable.options._helper = sortable.options.helper; + + sortable.options.helper = function() { + return ui.helper[ 0 ]; + }; + + // Fire the start events of the sortable with our passed browser event, + // and our own helper (so it doesn't create a new one) + event.target = sortable.currentItem[ 0 ]; + sortable._mouseCapture( event, true ); + sortable._mouseStart( event, true, true ); + + // Because the browser event is way off the new appended portlet, + // modify necessary variables to reflect the changes + sortable.offset.click.top = draggable.offset.click.top; + sortable.offset.click.left = draggable.offset.click.left; + sortable.offset.parent.left -= draggable.offset.parent.left - + sortable.offset.parent.left; + sortable.offset.parent.top -= draggable.offset.parent.top - + sortable.offset.parent.top; + + draggable._trigger( "toSortable", event ); + + // Inform draggable that the helper is in a valid drop zone, + // used solely in the revert option to handle "valid/invalid". + draggable.dropped = sortable.element; + + // Need to refreshPositions of all sortables in the case that + // adding to one sortable changes the location of the other sortables (#9675) + $.each( draggable.sortables, function() { + this.refreshPositions(); + }); + + // hack so receive/update callbacks work (mostly) + draggable.currentItem = draggable.element; + sortable.fromOutside = draggable; + } + + if ( sortable.currentItem ) { + sortable._mouseDrag( event ); + // Copy the sortable's position because the draggable's can potentially reflect + // a relative position, while sortable is always absolute, which the dragged + // element has now become. (#8809) + ui.position = sortable.position; + } + } else { + // If it doesn't intersect with the sortable, and it intersected before, + // we fake the drag stop of the sortable, but make sure it doesn't remove + // the helper by using cancelHelperRemoval. + if ( sortable.isOver ) { + + sortable.isOver = 0; + sortable.cancelHelperRemoval = true; + + // Calling sortable's mouseStop would trigger a revert, + // so revert must be temporarily false until after mouseStop is called. + sortable.options._revert = sortable.options.revert; + sortable.options.revert = false; + + sortable._trigger( "out", event, sortable._uiHash( sortable ) ); + sortable._mouseStop( event, true ); + + // restore sortable behaviors that were modfied + // when the draggable entered the sortable area (#9481) + sortable.options.revert = sortable.options._revert; + sortable.options.helper = sortable.options._helper; + + if ( sortable.placeholder ) { + sortable.placeholder.remove(); + } + + // Restore and recalculate the draggable's offset considering the sortable + // may have modified them in unexpected ways. (#8809, #10669) + ui.helper.appendTo( draggable._parent ); + draggable._refreshOffsets( event ); + ui.position = draggable._generatePosition( event, true ); + + draggable._trigger( "fromSortable", event ); + + // Inform draggable that the helper is no longer in a valid drop zone + draggable.dropped = false; + + // Need to refreshPositions of all sortables just in case removing + // from one sortable changes the location of other sortables (#9675) + $.each( draggable.sortables, function() { + this.refreshPositions(); + }); + } + } + }); + } +}); + +$.ui.plugin.add("draggable", "cursor", { + start: function( event, ui, instance ) { + var t = $( "body" ), + o = instance.options; + + if (t.css("cursor")) { + o._cursor = t.css("cursor"); + } + t.css("cursor", o.cursor); + }, + stop: function( event, ui, instance ) { + var o = instance.options; + if (o._cursor) { + $("body").css("cursor", o._cursor); + } + } +}); + +$.ui.plugin.add("draggable", "opacity", { + start: function( event, ui, instance ) { + var t = $( ui.helper ), + o = instance.options; + if (t.css("opacity")) { + o._opacity = t.css("opacity"); + } + t.css("opacity", o.opacity); + }, + stop: function( event, ui, instance ) { + var o = instance.options; + if (o._opacity) { + $(ui.helper).css("opacity", o._opacity); + } + } +}); + +$.ui.plugin.add("draggable", "scroll", { + start: function( event, ui, i ) { + if ( !i.scrollParentNotHidden ) { + i.scrollParentNotHidden = i.helper.scrollParent( false ); + } + + if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] && i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) { + i.overflowOffset = i.scrollParentNotHidden.offset(); + } + }, + drag: function( event, ui, i ) { + + var o = i.options, + scrolled = false, + scrollParent = i.scrollParentNotHidden[ 0 ], + document = i.document[ 0 ]; + + if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) { + if ( !o.axis || o.axis !== "x" ) { + if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY < o.scrollSensitivity ) { + scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed; + } else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) { + scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed; + } + } + + if ( !o.axis || o.axis !== "y" ) { + if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX < o.scrollSensitivity ) { + scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed; + } else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) { + scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed; + } + } + + } else { + + if (!o.axis || o.axis !== "x") { + if (event.pageY - $(document).scrollTop() < o.scrollSensitivity) { + scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed); + } else if ($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) { + scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed); + } + } + + if (!o.axis || o.axis !== "y") { + if (event.pageX - $(document).scrollLeft() < o.scrollSensitivity) { + scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed); + } else if ($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) { + scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed); + } + } + + } + + if (scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) { + $.ui.ddmanager.prepareOffsets(i, event); + } + + } +}); + +$.ui.plugin.add("draggable", "snap", { + start: function( event, ui, i ) { + + var o = i.options; + + i.snapElements = []; + + $(o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap).each(function() { + var $t = $(this), + $o = $t.offset(); + if (this !== i.element[0]) { + i.snapElements.push({ + item: this, + width: $t.outerWidth(), height: $t.outerHeight(), + top: $o.top, left: $o.left + }); + } + }); + + }, + drag: function( event, ui, inst ) { + + var ts, bs, ls, rs, l, r, t, b, i, first, + o = inst.options, + d = o.snapTolerance, + x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width, + y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height; + + for (i = inst.snapElements.length - 1; i >= 0; i--){ + + l = inst.snapElements[i].left - inst.margins.left; + r = l + inst.snapElements[i].width; + t = inst.snapElements[i].top - inst.margins.top; + b = t + inst.snapElements[i].height; + + if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains( inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) { + if (inst.snapElements[i].snapping) { + (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item }))); + } + inst.snapElements[i].snapping = false; + continue; + } + + if (o.snapMode !== "inner") { + ts = Math.abs(t - y2) <= d; + bs = Math.abs(b - y1) <= d; + ls = Math.abs(l - x2) <= d; + rs = Math.abs(r - x1) <= d; + if (ts) { + ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top; + } + if (bs) { + ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top; + } + if (ls) { + ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left; + } + if (rs) { + ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left; + } + } + + first = (ts || bs || ls || rs); + + if (o.snapMode !== "outer") { + ts = Math.abs(t - y1) <= d; + bs = Math.abs(b - y2) <= d; + ls = Math.abs(l - x1) <= d; + rs = Math.abs(r - x2) <= d; + if (ts) { + ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top; + } + if (bs) { + ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top; + } + if (ls) { + ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left; + } + if (rs) { + ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left; + } + } + + if (!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) { + (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item }))); + } + inst.snapElements[i].snapping = (ts || bs || ls || rs || first); + + } + + } +}); + +$.ui.plugin.add("draggable", "stack", { + start: function( event, ui, instance ) { + var min, + o = instance.options, + group = $.makeArray($(o.stack)).sort(function(a, b) { + return (parseInt($(a).css("zIndex"), 10) || 0) - (parseInt($(b).css("zIndex"), 10) || 0); + }); + + if (!group.length) { return; } + + min = parseInt($(group[0]).css("zIndex"), 10) || 0; + $(group).each(function(i) { + $(this).css("zIndex", min + i); + }); + this.css("zIndex", (min + group.length)); + } +}); + +$.ui.plugin.add("draggable", "zIndex", { + start: function( event, ui, instance ) { + var t = $( ui.helper ), + o = instance.options; + + if (t.css("zIndex")) { + o._zIndex = t.css("zIndex"); + } + t.css("zIndex", o.zIndex); + }, + stop: function( event, ui, instance ) { + var o = instance.options; + + if (o._zIndex) { + $(ui.helper).css("zIndex", o._zIndex); + } + } +}); + +var draggable = $.ui.draggable; + + +/*! + * jQuery UI Resizable 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/resizable/ + */ + + +$.widget("ui.resizable", $.ui.mouse, { + version: "1.11.4", + widgetEventPrefix: "resize", + options: { + alsoResize: false, + animate: false, + animateDuration: "slow", + animateEasing: "swing", + aspectRatio: false, + autoHide: false, + containment: false, + ghost: false, + grid: false, + handles: "e,s,se", + helper: false, + maxHeight: null, + maxWidth: null, + minHeight: 10, + minWidth: 10, + // See #7960 + zIndex: 90, + + // callbacks + resize: null, + start: null, + stop: null + }, + + _num: function( value ) { + return parseInt( value, 10 ) || 0; + }, + + _isNumber: function( value ) { + return !isNaN( parseInt( value, 10 ) ); + }, + + _hasScroll: function( el, a ) { + + if ( $( el ).css( "overflow" ) === "hidden") { + return false; + } + + var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop", + has = false; + + if ( el[ scroll ] > 0 ) { + return true; + } + + // TODO: determine which cases actually cause this to happen + // if the element doesn't have the scroll set, see if it's possible to + // set the scroll + el[ scroll ] = 1; + has = ( el[ scroll ] > 0 ); + el[ scroll ] = 0; + return has; + }, + + _create: function() { + + var n, i, handle, axis, hname, + that = this, + o = this.options; + this.element.addClass("ui-resizable"); + + $.extend(this, { + _aspectRatio: !!(o.aspectRatio), + aspectRatio: o.aspectRatio, + originalElement: this.element, + _proportionallyResizeElements: [], + _helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null + }); + + // Wrap the element if it cannot hold child nodes + if (this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)) { + + this.element.wrap( + $("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({ + position: this.element.css("position"), + width: this.element.outerWidth(), + height: this.element.outerHeight(), + top: this.element.css("top"), + left: this.element.css("left") + }) + ); + + this.element = this.element.parent().data( + "ui-resizable", this.element.resizable( "instance" ) + ); + + this.elementIsWrapper = true; + + this.element.css({ + marginLeft: this.originalElement.css("marginLeft"), + marginTop: this.originalElement.css("marginTop"), + marginRight: this.originalElement.css("marginRight"), + marginBottom: this.originalElement.css("marginBottom") + }); + this.originalElement.css({ + marginLeft: 0, + marginTop: 0, + marginRight: 0, + marginBottom: 0 + }); + // support: Safari + // Prevent Safari textarea resize + this.originalResizeStyle = this.originalElement.css("resize"); + this.originalElement.css("resize", "none"); + + this._proportionallyResizeElements.push( this.originalElement.css({ + position: "static", + zoom: 1, + display: "block" + }) ); + + // support: IE9 + // avoid IE jump (hard set the margin) + this.originalElement.css({ margin: this.originalElement.css("margin") }); + + this._proportionallyResize(); + } + + this.handles = o.handles || + ( !$(".ui-resizable-handle", this.element).length ? + "e,s,se" : { + n: ".ui-resizable-n", + e: ".ui-resizable-e", + s: ".ui-resizable-s", + w: ".ui-resizable-w", + se: ".ui-resizable-se", + sw: ".ui-resizable-sw", + ne: ".ui-resizable-ne", + nw: ".ui-resizable-nw" + } ); + + this._handles = $(); + if ( this.handles.constructor === String ) { + + if ( this.handles === "all") { + this.handles = "n,e,s,w,se,sw,ne,nw"; + } + + n = this.handles.split(","); + this.handles = {}; + + for (i = 0; i < n.length; i++) { + + handle = $.trim(n[i]); + hname = "ui-resizable-" + handle; + axis = $("<div class='ui-resizable-handle " + hname + "'></div>"); + + axis.css({ zIndex: o.zIndex }); + + // TODO : What's going on here? + if ("se" === handle) { + axis.addClass("ui-icon ui-icon-gripsmall-diagonal-se"); + } + + this.handles[handle] = ".ui-resizable-" + handle; + this.element.append(axis); + } + + } + + this._renderAxis = function(target) { + + var i, axis, padPos, padWrapper; + + target = target || this.element; + + for (i in this.handles) { + + if (this.handles[i].constructor === String) { + this.handles[i] = this.element.children( this.handles[ i ] ).first().show(); + } else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) { + this.handles[ i ] = $( this.handles[ i ] ); + this._on( this.handles[ i ], { "mousedown": that._mouseDown }); + } + + if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)) { + + axis = $(this.handles[i], this.element); + + padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth(); + + padPos = [ "padding", + /ne|nw|n/.test(i) ? "Top" : + /se|sw|s/.test(i) ? "Bottom" : + /^e$/.test(i) ? "Right" : "Left" ].join(""); + + target.css(padPos, padWrapper); + + this._proportionallyResize(); + } + + this._handles = this._handles.add( this.handles[ i ] ); + } + }; + + // TODO: make renderAxis a prototype function + this._renderAxis(this.element); + + this._handles = this._handles.add( this.element.find( ".ui-resizable-handle" ) ); + this._handles.disableSelection(); + + this._handles.mouseover(function() { + if (!that.resizing) { + if (this.className) { + axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i); + } + that.axis = axis && axis[1] ? axis[1] : "se"; + } + }); + + if (o.autoHide) { + this._handles.hide(); + $(this.element) + .addClass("ui-resizable-autohide") + .mouseenter(function() { + if (o.disabled) { + return; + } + $(this).removeClass("ui-resizable-autohide"); + that._handles.show(); + }) + .mouseleave(function() { + if (o.disabled) { + return; + } + if (!that.resizing) { + $(this).addClass("ui-resizable-autohide"); + that._handles.hide(); + } + }); + } + + this._mouseInit(); + }, + + _destroy: function() { + + this._mouseDestroy(); + + var wrapper, + _destroy = function(exp) { + $(exp) + .removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing") + .removeData("resizable") + .removeData("ui-resizable") + .unbind(".resizable") + .find(".ui-resizable-handle") + .remove(); + }; + + // TODO: Unwrap at same DOM position + if (this.elementIsWrapper) { + _destroy(this.element); + wrapper = this.element; + this.originalElement.css({ + position: wrapper.css("position"), + width: wrapper.outerWidth(), + height: wrapper.outerHeight(), + top: wrapper.css("top"), + left: wrapper.css("left") + }).insertAfter( wrapper ); + wrapper.remove(); + } + + this.originalElement.css("resize", this.originalResizeStyle); + _destroy(this.originalElement); + + return this; + }, + + _mouseCapture: function(event) { + var i, handle, + capture = false; + + for (i in this.handles) { + handle = $(this.handles[i])[0]; + if (handle === event.target || $.contains(handle, event.target)) { + capture = true; + } + } + + return !this.options.disabled && capture; + }, + + _mouseStart: function(event) { + + var curleft, curtop, cursor, + o = this.options, + el = this.element; + + this.resizing = true; + + this._renderProxy(); + + curleft = this._num(this.helper.css("left")); + curtop = this._num(this.helper.css("top")); + + if (o.containment) { + curleft += $(o.containment).scrollLeft() || 0; + curtop += $(o.containment).scrollTop() || 0; + } + + this.offset = this.helper.offset(); + this.position = { left: curleft, top: curtop }; + + this.size = this._helper ? { + width: this.helper.width(), + height: this.helper.height() + } : { + width: el.width(), + height: el.height() + }; + + this.originalSize = this._helper ? { + width: el.outerWidth(), + height: el.outerHeight() + } : { + width: el.width(), + height: el.height() + }; + + this.sizeDiff = { + width: el.outerWidth() - el.width(), + height: el.outerHeight() - el.height() + }; + + this.originalPosition = { left: curleft, top: curtop }; + this.originalMousePosition = { left: event.pageX, top: event.pageY }; + + this.aspectRatio = (typeof o.aspectRatio === "number") ? + o.aspectRatio : + ((this.originalSize.width / this.originalSize.height) || 1); + + cursor = $(".ui-resizable-" + this.axis).css("cursor"); + $("body").css("cursor", cursor === "auto" ? this.axis + "-resize" : cursor); + + el.addClass("ui-resizable-resizing"); + this._propagate("start", event); + return true; + }, + + _mouseDrag: function(event) { + + var data, props, + smp = this.originalMousePosition, + a = this.axis, + dx = (event.pageX - smp.left) || 0, + dy = (event.pageY - smp.top) || 0, + trigger = this._change[a]; + + this._updatePrevProperties(); + + if (!trigger) { + return false; + } + + data = trigger.apply(this, [ event, dx, dy ]); + + this._updateVirtualBoundaries(event.shiftKey); + if (this._aspectRatio || event.shiftKey) { + data = this._updateRatio(data, event); + } + + data = this._respectSize(data, event); + + this._updateCache(data); + + this._propagate("resize", event); + + props = this._applyChanges(); + + if ( !this._helper && this._proportionallyResizeElements.length ) { + this._proportionallyResize(); + } + + if ( !$.isEmptyObject( props ) ) { + this._updatePrevProperties(); + this._trigger( "resize", event, this.ui() ); + this._applyChanges(); + } + + return false; + }, + + _mouseStop: function(event) { + + this.resizing = false; + var pr, ista, soffseth, soffsetw, s, left, top, + o = this.options, that = this; + + if (this._helper) { + + pr = this._proportionallyResizeElements; + ista = pr.length && (/textarea/i).test(pr[0].nodeName); + soffseth = ista && this._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height; + soffsetw = ista ? 0 : that.sizeDiff.width; + + s = { + width: (that.helper.width() - soffsetw), + height: (that.helper.height() - soffseth) + }; + left = (parseInt(that.element.css("left"), 10) + + (that.position.left - that.originalPosition.left)) || null; + top = (parseInt(that.element.css("top"), 10) + + (that.position.top - that.originalPosition.top)) || null; + + if (!o.animate) { + this.element.css($.extend(s, { top: top, left: left })); + } + + that.helper.height(that.size.height); + that.helper.width(that.size.width); + + if (this._helper && !o.animate) { + this._proportionallyResize(); + } + } + + $("body").css("cursor", "auto"); + + this.element.removeClass("ui-resizable-resizing"); + + this._propagate("stop", event); + + if (this._helper) { + this.helper.remove(); + } + + return false; + + }, + + _updatePrevProperties: function() { + this.prevPosition = { + top: this.position.top, + left: this.position.left + }; + this.prevSize = { + width: this.size.width, + height: this.size.height + }; + }, + + _applyChanges: function() { + var props = {}; + + if ( this.position.top !== this.prevPosition.top ) { + props.top = this.position.top + "px"; + } + if ( this.position.left !== this.prevPosition.left ) { + props.left = this.position.left + "px"; + } + if ( this.size.width !== this.prevSize.width ) { + props.width = this.size.width + "px"; + } + if ( this.size.height !== this.prevSize.height ) { + props.height = this.size.height + "px"; + } + + this.helper.css( props ); + + return props; + }, + + _updateVirtualBoundaries: function(forceAspectRatio) { + var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b, + o = this.options; + + b = { + minWidth: this._isNumber(o.minWidth) ? o.minWidth : 0, + maxWidth: this._isNumber(o.maxWidth) ? o.maxWidth : Infinity, + minHeight: this._isNumber(o.minHeight) ? o.minHeight : 0, + maxHeight: this._isNumber(o.maxHeight) ? o.maxHeight : Infinity + }; + + if (this._aspectRatio || forceAspectRatio) { + pMinWidth = b.minHeight * this.aspectRatio; + pMinHeight = b.minWidth / this.aspectRatio; + pMaxWidth = b.maxHeight * this.aspectRatio; + pMaxHeight = b.maxWidth / this.aspectRatio; + + if (pMinWidth > b.minWidth) { + b.minWidth = pMinWidth; + } + if (pMinHeight > b.minHeight) { + b.minHeight = pMinHeight; + } + if (pMaxWidth < b.maxWidth) { + b.maxWidth = pMaxWidth; + } + if (pMaxHeight < b.maxHeight) { + b.maxHeight = pMaxHeight; + } + } + this._vBoundaries = b; + }, + + _updateCache: function(data) { + this.offset = this.helper.offset(); + if (this._isNumber(data.left)) { + this.position.left = data.left; + } + if (this._isNumber(data.top)) { + this.position.top = data.top; + } + if (this._isNumber(data.height)) { + this.size.height = data.height; + } + if (this._isNumber(data.width)) { + this.size.width = data.width; + } + }, + + _updateRatio: function( data ) { + + var cpos = this.position, + csize = this.size, + a = this.axis; + + if (this._isNumber(data.height)) { + data.width = (data.height * this.aspectRatio); + } else if (this._isNumber(data.width)) { + data.height = (data.width / this.aspectRatio); + } + + if (a === "sw") { + data.left = cpos.left + (csize.width - data.width); + data.top = null; + } + if (a === "nw") { + data.top = cpos.top + (csize.height - data.height); + data.left = cpos.left + (csize.width - data.width); + } + + return data; + }, + + _respectSize: function( data ) { + + var o = this._vBoundaries, + a = this.axis, + ismaxw = this._isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), + ismaxh = this._isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height), + isminw = this._isNumber(data.width) && o.minWidth && (o.minWidth > data.width), + isminh = this._isNumber(data.height) && o.minHeight && (o.minHeight > data.height), + dw = this.originalPosition.left + this.originalSize.width, + dh = this.position.top + this.size.height, + cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a); + if (isminw) { + data.width = o.minWidth; + } + if (isminh) { + data.height = o.minHeight; + } + if (ismaxw) { + data.width = o.maxWidth; + } + if (ismaxh) { + data.height = o.maxHeight; + } + + if (isminw && cw) { + data.left = dw - o.minWidth; + } + if (ismaxw && cw) { + data.left = dw - o.maxWidth; + } + if (isminh && ch) { + data.top = dh - o.minHeight; + } + if (ismaxh && ch) { + data.top = dh - o.maxHeight; + } + + // Fixing jump error on top/left - bug #2330 + if (!data.width && !data.height && !data.left && data.top) { + data.top = null; + } else if (!data.width && !data.height && !data.top && data.left) { + data.left = null; + } + + return data; + }, + + _getPaddingPlusBorderDimensions: function( element ) { + var i = 0, + widths = [], + borders = [ + element.css( "borderTopWidth" ), + element.css( "borderRightWidth" ), + element.css( "borderBottomWidth" ), + element.css( "borderLeftWidth" ) + ], + paddings = [ + element.css( "paddingTop" ), + element.css( "paddingRight" ), + element.css( "paddingBottom" ), + element.css( "paddingLeft" ) + ]; + + for ( ; i < 4; i++ ) { + widths[ i ] = ( parseInt( borders[ i ], 10 ) || 0 ); + widths[ i ] += ( parseInt( paddings[ i ], 10 ) || 0 ); + } + + return { + height: widths[ 0 ] + widths[ 2 ], + width: widths[ 1 ] + widths[ 3 ] + }; + }, + + _proportionallyResize: function() { + + if (!this._proportionallyResizeElements.length) { + return; + } + + var prel, + i = 0, + element = this.helper || this.element; + + for ( ; i < this._proportionallyResizeElements.length; i++) { + + prel = this._proportionallyResizeElements[i]; + + // TODO: Seems like a bug to cache this.outerDimensions + // considering that we are in a loop. + if (!this.outerDimensions) { + this.outerDimensions = this._getPaddingPlusBorderDimensions( prel ); + } + + prel.css({ + height: (element.height() - this.outerDimensions.height) || 0, + width: (element.width() - this.outerDimensions.width) || 0 + }); + + } + + }, + + _renderProxy: function() { + + var el = this.element, o = this.options; + this.elementOffset = el.offset(); + + if (this._helper) { + + this.helper = this.helper || $("<div style='overflow:hidden;'></div>"); + + this.helper.addClass(this._helper).css({ + width: this.element.outerWidth() - 1, + height: this.element.outerHeight() - 1, + position: "absolute", + left: this.elementOffset.left + "px", + top: this.elementOffset.top + "px", + zIndex: ++o.zIndex //TODO: Don't modify option + }); + + this.helper + .appendTo("body") + .disableSelection(); + + } else { + this.helper = this.element; + } + + }, + + _change: { + e: function(event, dx) { + return { width: this.originalSize.width + dx }; + }, + w: function(event, dx) { + var cs = this.originalSize, sp = this.originalPosition; + return { left: sp.left + dx, width: cs.width - dx }; + }, + n: function(event, dx, dy) { + var cs = this.originalSize, sp = this.originalPosition; + return { top: sp.top + dy, height: cs.height - dy }; + }, + s: function(event, dx, dy) { + return { height: this.originalSize.height + dy }; + }, + se: function(event, dx, dy) { + return $.extend(this._change.s.apply(this, arguments), + this._change.e.apply(this, [ event, dx, dy ])); + }, + sw: function(event, dx, dy) { + return $.extend(this._change.s.apply(this, arguments), + this._change.w.apply(this, [ event, dx, dy ])); + }, + ne: function(event, dx, dy) { + return $.extend(this._change.n.apply(this, arguments), + this._change.e.apply(this, [ event, dx, dy ])); + }, + nw: function(event, dx, dy) { + return $.extend(this._change.n.apply(this, arguments), + this._change.w.apply(this, [ event, dx, dy ])); + } + }, + + _propagate: function(n, event) { + $.ui.plugin.call(this, n, [ event, this.ui() ]); + (n !== "resize" && this._trigger(n, event, this.ui())); + }, + + plugins: {}, + + ui: function() { + return { + originalElement: this.originalElement, + element: this.element, + helper: this.helper, + position: this.position, + size: this.size, + originalSize: this.originalSize, + originalPosition: this.originalPosition + }; + } + +}); + +/* + * Resizable Extensions + */ + +$.ui.plugin.add("resizable", "animate", { + + stop: function( event ) { + var that = $(this).resizable( "instance" ), + o = that.options, + pr = that._proportionallyResizeElements, + ista = pr.length && (/textarea/i).test(pr[0].nodeName), + soffseth = ista && that._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height, + soffsetw = ista ? 0 : that.sizeDiff.width, + style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) }, + left = (parseInt(that.element.css("left"), 10) + + (that.position.left - that.originalPosition.left)) || null, + top = (parseInt(that.element.css("top"), 10) + + (that.position.top - that.originalPosition.top)) || null; + + that.element.animate( + $.extend(style, top && left ? { top: top, left: left } : {}), { + duration: o.animateDuration, + easing: o.animateEasing, + step: function() { + + var data = { + width: parseInt(that.element.css("width"), 10), + height: parseInt(that.element.css("height"), 10), + top: parseInt(that.element.css("top"), 10), + left: parseInt(that.element.css("left"), 10) + }; + + if (pr && pr.length) { + $(pr[0]).css({ width: data.width, height: data.height }); + } + + // propagating resize, and updating values for each animation step + that._updateCache(data); + that._propagate("resize", event); + + } + } + ); + } + +}); + +$.ui.plugin.add( "resizable", "containment", { + + start: function() { + var element, p, co, ch, cw, width, height, + that = $( this ).resizable( "instance" ), + o = that.options, + el = that.element, + oc = o.containment, + ce = ( oc instanceof $ ) ? oc.get( 0 ) : ( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc; + + if ( !ce ) { + return; + } + + that.containerElement = $( ce ); + + if ( /document/.test( oc ) || oc === document ) { + that.containerOffset = { + left: 0, + top: 0 + }; + that.containerPosition = { + left: 0, + top: 0 + }; + + that.parentData = { + element: $( document ), + left: 0, + top: 0, + width: $( document ).width(), + height: $( document ).height() || document.body.parentNode.scrollHeight + }; + } else { + element = $( ce ); + p = []; + $([ "Top", "Right", "Left", "Bottom" ]).each(function( i, name ) { + p[ i ] = that._num( element.css( "padding" + name ) ); + }); + + that.containerOffset = element.offset(); + that.containerPosition = element.position(); + that.containerSize = { + height: ( element.innerHeight() - p[ 3 ] ), + width: ( element.innerWidth() - p[ 1 ] ) + }; + + co = that.containerOffset; + ch = that.containerSize.height; + cw = that.containerSize.width; + width = ( that._hasScroll ( ce, "left" ) ? ce.scrollWidth : cw ); + height = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ; + + that.parentData = { + element: ce, + left: co.left, + top: co.top, + width: width, + height: height + }; + } + }, + + resize: function( event ) { + var woset, hoset, isParent, isOffsetRelative, + that = $( this ).resizable( "instance" ), + o = that.options, + co = that.containerOffset, + cp = that.position, + pRatio = that._aspectRatio || event.shiftKey, + cop = { + top: 0, + left: 0 + }, + ce = that.containerElement, + continueResize = true; + + if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" ) ) ) { + cop = co; + } + + if ( cp.left < ( that._helper ? co.left : 0 ) ) { + that.size.width = that.size.width + + ( that._helper ? + ( that.position.left - co.left ) : + ( that.position.left - cop.left ) ); + + if ( pRatio ) { + that.size.height = that.size.width / that.aspectRatio; + continueResize = false; + } + that.position.left = o.helper ? co.left : 0; + } + + if ( cp.top < ( that._helper ? co.top : 0 ) ) { + that.size.height = that.size.height + + ( that._helper ? + ( that.position.top - co.top ) : + that.position.top ); + + if ( pRatio ) { + that.size.width = that.size.height * that.aspectRatio; + continueResize = false; + } + that.position.top = that._helper ? co.top : 0; + } + + isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 ); + isOffsetRelative = /relative|absolute/.test( that.containerElement.css( "position" ) ); + + if ( isParent && isOffsetRelative ) { + that.offset.left = that.parentData.left + that.position.left; + that.offset.top = that.parentData.top + that.position.top; + } else { + that.offset.left = that.element.offset().left; + that.offset.top = that.element.offset().top; + } + + woset = Math.abs( that.sizeDiff.width + + (that._helper ? + that.offset.left - cop.left : + (that.offset.left - co.left)) ); + + hoset = Math.abs( that.sizeDiff.height + + (that._helper ? + that.offset.top - cop.top : + (that.offset.top - co.top)) ); + + if ( woset + that.size.width >= that.parentData.width ) { + that.size.width = that.parentData.width - woset; + if ( pRatio ) { + that.size.height = that.size.width / that.aspectRatio; + continueResize = false; + } + } + + if ( hoset + that.size.height >= that.parentData.height ) { + that.size.height = that.parentData.height - hoset; + if ( pRatio ) { + that.size.width = that.size.height * that.aspectRatio; + continueResize = false; + } + } + + if ( !continueResize ) { + that.position.left = that.prevPosition.left; + that.position.top = that.prevPosition.top; + that.size.width = that.prevSize.width; + that.size.height = that.prevSize.height; + } + }, + + stop: function() { + var that = $( this ).resizable( "instance" ), + o = that.options, + co = that.containerOffset, + cop = that.containerPosition, + ce = that.containerElement, + helper = $( that.helper ), + ho = helper.offset(), + w = helper.outerWidth() - that.sizeDiff.width, + h = helper.outerHeight() - that.sizeDiff.height; + + if ( that._helper && !o.animate && ( /relative/ ).test( ce.css( "position" ) ) ) { + $( this ).css({ + left: ho.left - cop.left - co.left, + width: w, + height: h + }); + } + + if ( that._helper && !o.animate && ( /static/ ).test( ce.css( "position" ) ) ) { + $( this ).css({ + left: ho.left - cop.left - co.left, + width: w, + height: h + }); + } + } +}); + +$.ui.plugin.add("resizable", "alsoResize", { + + start: function() { + var that = $(this).resizable( "instance" ), + o = that.options; + + $(o.alsoResize).each(function() { + var el = $(this); + el.data("ui-resizable-alsoresize", { + width: parseInt(el.width(), 10), height: parseInt(el.height(), 10), + left: parseInt(el.css("left"), 10), top: parseInt(el.css("top"), 10) + }); + }); + }, + + resize: function(event, ui) { + var that = $(this).resizable( "instance" ), + o = that.options, + os = that.originalSize, + op = that.originalPosition, + delta = { + height: (that.size.height - os.height) || 0, + width: (that.size.width - os.width) || 0, + top: (that.position.top - op.top) || 0, + left: (that.position.left - op.left) || 0 + }; + + $(o.alsoResize).each(function() { + var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style = {}, + css = el.parents(ui.originalElement[0]).length ? + [ "width", "height" ] : + [ "width", "height", "top", "left" ]; + + $.each(css, function(i, prop) { + var sum = (start[prop] || 0) + (delta[prop] || 0); + if (sum && sum >= 0) { + style[prop] = sum || null; + } + }); + + el.css(style); + }); + }, + + stop: function() { + $(this).removeData("resizable-alsoresize"); + } +}); + +$.ui.plugin.add("resizable", "ghost", { + + start: function() { + + var that = $(this).resizable( "instance" ), o = that.options, cs = that.size; + + that.ghost = that.originalElement.clone(); + that.ghost + .css({ + opacity: 0.25, + display: "block", + position: "relative", + height: cs.height, + width: cs.width, + margin: 0, + left: 0, + top: 0 + }) + .addClass("ui-resizable-ghost") + .addClass(typeof o.ghost === "string" ? o.ghost : ""); + + that.ghost.appendTo(that.helper); + + }, + + resize: function() { + var that = $(this).resizable( "instance" ); + if (that.ghost) { + that.ghost.css({ + position: "relative", + height: that.size.height, + width: that.size.width + }); + } + }, + + stop: function() { + var that = $(this).resizable( "instance" ); + if (that.ghost && that.helper) { + that.helper.get(0).removeChild(that.ghost.get(0)); + } + } + +}); + +$.ui.plugin.add("resizable", "grid", { + + resize: function() { + var outerDimensions, + that = $(this).resizable( "instance" ), + o = that.options, + cs = that.size, + os = that.originalSize, + op = that.originalPosition, + a = that.axis, + grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid, + gridX = (grid[0] || 1), + gridY = (grid[1] || 1), + ox = Math.round((cs.width - os.width) / gridX) * gridX, + oy = Math.round((cs.height - os.height) / gridY) * gridY, + newWidth = os.width + ox, + newHeight = os.height + oy, + isMaxWidth = o.maxWidth && (o.maxWidth < newWidth), + isMaxHeight = o.maxHeight && (o.maxHeight < newHeight), + isMinWidth = o.minWidth && (o.minWidth > newWidth), + isMinHeight = o.minHeight && (o.minHeight > newHeight); + + o.grid = grid; + + if (isMinWidth) { + newWidth += gridX; + } + if (isMinHeight) { + newHeight += gridY; + } + if (isMaxWidth) { + newWidth -= gridX; + } + if (isMaxHeight) { + newHeight -= gridY; + } + + if (/^(se|s|e)$/.test(a)) { + that.size.width = newWidth; + that.size.height = newHeight; + } else if (/^(ne)$/.test(a)) { + that.size.width = newWidth; + that.size.height = newHeight; + that.position.top = op.top - oy; + } else if (/^(sw)$/.test(a)) { + that.size.width = newWidth; + that.size.height = newHeight; + that.position.left = op.left - ox; + } else { + if ( newHeight - gridY <= 0 || newWidth - gridX <= 0) { + outerDimensions = that._getPaddingPlusBorderDimensions( this ); + } + + if ( newHeight - gridY > 0 ) { + that.size.height = newHeight; + that.position.top = op.top - oy; + } else { + newHeight = gridY - outerDimensions.height; + that.size.height = newHeight; + that.position.top = op.top + os.height - newHeight; + } + if ( newWidth - gridX > 0 ) { + that.size.width = newWidth; + that.position.left = op.left - ox; + } else { + newWidth = gridX - outerDimensions.width; + that.size.width = newWidth; + that.position.left = op.left + os.width - newWidth; + } + } + } + +}); + +var resizable = $.ui.resizable; + + +/*! + * jQuery UI Dialog 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/dialog/ + */ + + +var dialog = $.widget( "ui.dialog", { + version: "1.11.4", + options: { + appendTo: "body", + autoOpen: true, + buttons: [], + closeOnEscape: true, + closeText: "Close", + dialogClass: "", + draggable: true, + hide: null, + height: "auto", + maxHeight: null, + maxWidth: null, + minHeight: 150, + minWidth: 150, + modal: false, + position: { + my: "center", + at: "center", + of: window, + collision: "fit", + // Ensure the titlebar is always visible + using: function( pos ) { + var topOffset = $( this ).css( pos ).offset().top; + if ( topOffset < 0 ) { + $( this ).css( "top", pos.top - topOffset ); + } + } + }, + resizable: true, + show: null, + title: null, + width: 300, + + // callbacks + beforeClose: null, + close: null, + drag: null, + dragStart: null, + dragStop: null, + focus: null, + open: null, + resize: null, + resizeStart: null, + resizeStop: null + }, + + sizeRelatedOptions: { + buttons: true, + height: true, + maxHeight: true, + maxWidth: true, + minHeight: true, + minWidth: true, + width: true + }, + + resizableRelatedOptions: { + maxHeight: true, + maxWidth: true, + minHeight: true, + minWidth: true + }, + + _create: function() { + this.originalCss = { + display: this.element[ 0 ].style.display, + width: this.element[ 0 ].style.width, + minHeight: this.element[ 0 ].style.minHeight, + maxHeight: this.element[ 0 ].style.maxHeight, + height: this.element[ 0 ].style.height + }; + this.originalPosition = { + parent: this.element.parent(), + index: this.element.parent().children().index( this.element ) + }; + this.originalTitle = this.element.attr( "title" ); + this.options.title = this.options.title || this.originalTitle; + + this._createWrapper(); + + this.element + .show() + .removeAttr( "title" ) + .addClass( "ui-dialog-content ui-widget-content" ) + .appendTo( this.uiDialog ); + + this._createTitlebar(); + this._createButtonPane(); + + if ( this.options.draggable && $.fn.draggable ) { + this._makeDraggable(); + } + if ( this.options.resizable && $.fn.resizable ) { + this._makeResizable(); + } + + this._isOpen = false; + + this._trackFocus(); + }, + + _init: function() { + if ( this.options.autoOpen ) { + this.open(); + } + }, + + _appendTo: function() { + var element = this.options.appendTo; + if ( element && (element.jquery || element.nodeType) ) { + return $( element ); + } + return this.document.find( element || "body" ).eq( 0 ); + }, + + _destroy: function() { + var next, + originalPosition = this.originalPosition; + + this._untrackInstance(); + this._destroyOverlay(); + + this.element + .removeUniqueId() + .removeClass( "ui-dialog-content ui-widget-content" ) + .css( this.originalCss ) + // Without detaching first, the following becomes really slow + .detach(); + + this.uiDialog.stop( true, true ).remove(); + + if ( this.originalTitle ) { + this.element.attr( "title", this.originalTitle ); + } + + next = originalPosition.parent.children().eq( originalPosition.index ); + // Don't try to place the dialog next to itself (#8613) + if ( next.length && next[ 0 ] !== this.element[ 0 ] ) { + next.before( this.element ); + } else { + originalPosition.parent.append( this.element ); + } + }, + + widget: function() { + return this.uiDialog; + }, + + disable: $.noop, + enable: $.noop, + + close: function( event ) { + var activeElement, + that = this; + + if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) { + return; + } + + this._isOpen = false; + this._focusedElement = null; + this._destroyOverlay(); + this._untrackInstance(); + + if ( !this.opener.filter( ":focusable" ).focus().length ) { + + // support: IE9 + // IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe> + try { + activeElement = this.document[ 0 ].activeElement; + + // Support: IE9, IE10 + // If the <body> is blurred, IE will switch windows, see #4520 + if ( activeElement && activeElement.nodeName.toLowerCase() !== "body" ) { + + // Hiding a focused element doesn't trigger blur in WebKit + // so in case we have nothing to focus on, explicitly blur the active element + // https://bugs.webkit.org/show_bug.cgi?id=47182 + $( activeElement ).blur(); + } + } catch ( error ) {} + } + + this._hide( this.uiDialog, this.options.hide, function() { + that._trigger( "close", event ); + }); + }, + + isOpen: function() { + return this._isOpen; + }, + + moveToTop: function() { + this._moveToTop(); + }, + + _moveToTop: function( event, silent ) { + var moved = false, + zIndices = this.uiDialog.siblings( ".ui-front:visible" ).map(function() { + return +$( this ).css( "z-index" ); + }).get(), + zIndexMax = Math.max.apply( null, zIndices ); + + if ( zIndexMax >= +this.uiDialog.css( "z-index" ) ) { + this.uiDialog.css( "z-index", zIndexMax + 1 ); + moved = true; + } + + if ( moved && !silent ) { + this._trigger( "focus", event ); + } + return moved; + }, + + open: function() { + var that = this; + if ( this._isOpen ) { + if ( this._moveToTop() ) { + this._focusTabbable(); + } + return; + } + + this._isOpen = true; + this.opener = $( this.document[ 0 ].activeElement ); + + this._size(); + this._position(); + this._createOverlay(); + this._moveToTop( null, true ); + + // Ensure the overlay is moved to the top with the dialog, but only when + // opening. The overlay shouldn't move after the dialog is open so that + // modeless dialogs opened after the modal dialog stack properly. + if ( this.overlay ) { + this.overlay.css( "z-index", this.uiDialog.css( "z-index" ) - 1 ); + } + + this._show( this.uiDialog, this.options.show, function() { + that._focusTabbable(); + that._trigger( "focus" ); + }); + + // Track the dialog immediately upon openening in case a focus event + // somehow occurs outside of the dialog before an element inside the + // dialog is focused (#10152) + this._makeFocusTarget(); + + this._trigger( "open" ); + }, + + _focusTabbable: function() { + // Set focus to the first match: + // 1. An element that was focused previously + // 2. First element inside the dialog matching [autofocus] + // 3. Tabbable element inside the content element + // 4. Tabbable element inside the buttonpane + // 5. The close button + // 6. The dialog itself + var hasFocus = this._focusedElement; + if ( !hasFocus ) { + hasFocus = this.element.find( "[autofocus]" ); + } + if ( !hasFocus.length ) { + hasFocus = this.element.find( ":tabbable" ); + } + if ( !hasFocus.length ) { + hasFocus = this.uiDialogButtonPane.find( ":tabbable" ); + } + if ( !hasFocus.length ) { + hasFocus = this.uiDialogTitlebarClose.filter( ":tabbable" ); + } + if ( !hasFocus.length ) { + hasFocus = this.uiDialog; + } + hasFocus.eq( 0 ).focus(); + }, + + _keepFocus: function( event ) { + function checkFocus() { + var activeElement = this.document[0].activeElement, + isActive = this.uiDialog[0] === activeElement || + $.contains( this.uiDialog[0], activeElement ); + if ( !isActive ) { + this._focusTabbable(); + } + } + event.preventDefault(); + checkFocus.call( this ); + // support: IE + // IE <= 8 doesn't prevent moving focus even with event.preventDefault() + // so we check again later + this._delay( checkFocus ); + }, + + _createWrapper: function() { + this.uiDialog = $("<div>") + .addClass( "ui-dialog ui-widget ui-widget-content ui-corner-all ui-front " + + this.options.dialogClass ) + .hide() + .attr({ + // Setting tabIndex makes the div focusable + tabIndex: -1, + role: "dialog" + }) + .appendTo( this._appendTo() ); + + this._on( this.uiDialog, { + keydown: function( event ) { + if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode && + event.keyCode === $.ui.keyCode.ESCAPE ) { + event.preventDefault(); + this.close( event ); + return; + } + + // prevent tabbing out of dialogs + if ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) { + return; + } + var tabbables = this.uiDialog.find( ":tabbable" ), + first = tabbables.filter( ":first" ), + last = tabbables.filter( ":last" ); + + if ( ( event.target === last[0] || event.target === this.uiDialog[0] ) && !event.shiftKey ) { + this._delay(function() { + first.focus(); + }); + event.preventDefault(); + } else if ( ( event.target === first[0] || event.target === this.uiDialog[0] ) && event.shiftKey ) { + this._delay(function() { + last.focus(); + }); + event.preventDefault(); + } + }, + mousedown: function( event ) { + if ( this._moveToTop( event ) ) { + this._focusTabbable(); + } + } + }); + + // We assume that any existing aria-describedby attribute means + // that the dialog content is marked up properly + // otherwise we brute force the content as the description + if ( !this.element.find( "[aria-describedby]" ).length ) { + this.uiDialog.attr({ + "aria-describedby": this.element.uniqueId().attr( "id" ) + }); + } + }, + + _createTitlebar: function() { + var uiDialogTitle; + + this.uiDialogTitlebar = $( "<div>" ) + .addClass( "ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix" ) + .prependTo( this.uiDialog ); + this._on( this.uiDialogTitlebar, { + mousedown: function( event ) { + // Don't prevent click on close button (#8838) + // Focusing a dialog that is partially scrolled out of view + // causes the browser to scroll it into view, preventing the click event + if ( !$( event.target ).closest( ".ui-dialog-titlebar-close" ) ) { + // Dialog isn't getting focus when dragging (#8063) + this.uiDialog.focus(); + } + } + }); + + // support: IE + // Use type="button" to prevent enter keypresses in textboxes from closing the + // dialog in IE (#9312) + this.uiDialogTitlebarClose = $( "<button type='button'></button>" ) + .button({ + label: this.options.closeText, + icons: { + primary: "ui-icon-closethick" + }, + text: false + }) + .addClass( "ui-dialog-titlebar-close" ) + .appendTo( this.uiDialogTitlebar ); + this._on( this.uiDialogTitlebarClose, { + click: function( event ) { + event.preventDefault(); + this.close( event ); + } + }); + + uiDialogTitle = $( "<span>" ) + .uniqueId() + .addClass( "ui-dialog-title" ) + .prependTo( this.uiDialogTitlebar ); + this._title( uiDialogTitle ); + + this.uiDialog.attr({ + "aria-labelledby": uiDialogTitle.attr( "id" ) + }); + }, + + _title: function( title ) { + if ( !this.options.title ) { + title.html( "&#160;" ); + } + title.text( this.options.title ); + }, + + _createButtonPane: function() { + this.uiDialogButtonPane = $( "<div>" ) + .addClass( "ui-dialog-buttonpane ui-widget-content ui-helper-clearfix" ); + + this.uiButtonSet = $( "<div>" ) + .addClass( "ui-dialog-buttonset" ) + .appendTo( this.uiDialogButtonPane ); + + this._createButtons(); + }, + + _createButtons: function() { + var that = this, + buttons = this.options.buttons; + + // if we already have a button pane, remove it + this.uiDialogButtonPane.remove(); + this.uiButtonSet.empty(); + + if ( $.isEmptyObject( buttons ) || ($.isArray( buttons ) && !buttons.length) ) { + this.uiDialog.removeClass( "ui-dialog-buttons" ); + return; + } + + $.each( buttons, function( name, props ) { + var click, buttonOptions; + props = $.isFunction( props ) ? + { click: props, text: name } : + props; + // Default to a non-submitting button + props = $.extend( { type: "button" }, props ); + // Change the context for the click callback to be the main element + click = props.click; + props.click = function() { + click.apply( that.element[ 0 ], arguments ); + }; + buttonOptions = { + icons: props.icons, + text: props.showText + }; + delete props.icons; + delete props.showText; + $( "<button></button>", props ) + .button( buttonOptions ) + .appendTo( that.uiButtonSet ); + }); + this.uiDialog.addClass( "ui-dialog-buttons" ); + this.uiDialogButtonPane.appendTo( this.uiDialog ); + }, + + _makeDraggable: function() { + var that = this, + options = this.options; + + function filteredUi( ui ) { + return { + position: ui.position, + offset: ui.offset + }; + } + + this.uiDialog.draggable({ + cancel: ".ui-dialog-content, .ui-dialog-titlebar-close", + handle: ".ui-dialog-titlebar", + containment: "document", + start: function( event, ui ) { + $( this ).addClass( "ui-dialog-dragging" ); + that._blockFrames(); + that._trigger( "dragStart", event, filteredUi( ui ) ); + }, + drag: function( event, ui ) { + that._trigger( "drag", event, filteredUi( ui ) ); + }, + stop: function( event, ui ) { + var left = ui.offset.left - that.document.scrollLeft(), + top = ui.offset.top - that.document.scrollTop(); + + options.position = { + my: "left top", + at: "left" + (left >= 0 ? "+" : "") + left + " " + + "top" + (top >= 0 ? "+" : "") + top, + of: that.window + }; + $( this ).removeClass( "ui-dialog-dragging" ); + that._unblockFrames(); + that._trigger( "dragStop", event, filteredUi( ui ) ); + } + }); + }, + + _makeResizable: function() { + var that = this, + options = this.options, + handles = options.resizable, + // .ui-resizable has position: relative defined in the stylesheet + // but dialogs have to use absolute or fixed positioning + position = this.uiDialog.css("position"), + resizeHandles = typeof handles === "string" ? + handles : + "n,e,s,w,se,sw,ne,nw"; + + function filteredUi( ui ) { + return { + originalPosition: ui.originalPosition, + originalSize: ui.originalSize, + position: ui.position, + size: ui.size + }; + } + + this.uiDialog.resizable({ + cancel: ".ui-dialog-content", + containment: "document", + alsoResize: this.element, + maxWidth: options.maxWidth, + maxHeight: options.maxHeight, + minWidth: options.minWidth, + minHeight: this._minHeight(), + handles: resizeHandles, + start: function( event, ui ) { + $( this ).addClass( "ui-dialog-resizing" ); + that._blockFrames(); + that._trigger( "resizeStart", event, filteredUi( ui ) ); + }, + resize: function( event, ui ) { + that._trigger( "resize", event, filteredUi( ui ) ); + }, + stop: function( event, ui ) { + var offset = that.uiDialog.offset(), + left = offset.left - that.document.scrollLeft(), + top = offset.top - that.document.scrollTop(); + + options.height = that.uiDialog.height(); + options.width = that.uiDialog.width(); + options.position = { + my: "left top", + at: "left" + (left >= 0 ? "+" : "") + left + " " + + "top" + (top >= 0 ? "+" : "") + top, + of: that.window + }; + $( this ).removeClass( "ui-dialog-resizing" ); + that._unblockFrames(); + that._trigger( "resizeStop", event, filteredUi( ui ) ); + } + }) + .css( "position", position ); + }, + + _trackFocus: function() { + this._on( this.widget(), { + focusin: function( event ) { + this._makeFocusTarget(); + this._focusedElement = $( event.target ); + } + }); + }, + + _makeFocusTarget: function() { + this._untrackInstance(); + this._trackingInstances().unshift( this ); + }, + + _untrackInstance: function() { + var instances = this._trackingInstances(), + exists = $.inArray( this, instances ); + if ( exists !== -1 ) { + instances.splice( exists, 1 ); + } + }, + + _trackingInstances: function() { + var instances = this.document.data( "ui-dialog-instances" ); + if ( !instances ) { + instances = []; + this.document.data( "ui-dialog-instances", instances ); + } + return instances; + }, + + _minHeight: function() { + var options = this.options; + + return options.height === "auto" ? + options.minHeight : + Math.min( options.minHeight, options.height ); + }, + + _position: function() { + // Need to show the dialog to get the actual offset in the position plugin + var isVisible = this.uiDialog.is( ":visible" ); + if ( !isVisible ) { + this.uiDialog.show(); + } + this.uiDialog.position( this.options.position ); + if ( !isVisible ) { + this.uiDialog.hide(); + } + }, + + _setOptions: function( options ) { + var that = this, + resize = false, + resizableOptions = {}; + + $.each( options, function( key, value ) { + that._setOption( key, value ); + + if ( key in that.sizeRelatedOptions ) { + resize = true; + } + if ( key in that.resizableRelatedOptions ) { + resizableOptions[ key ] = value; + } + }); + + if ( resize ) { + this._size(); + this._position(); + } + if ( this.uiDialog.is( ":data(ui-resizable)" ) ) { + this.uiDialog.resizable( "option", resizableOptions ); + } + }, + + _setOption: function( key, value ) { + var isDraggable, isResizable, + uiDialog = this.uiDialog; + + if ( key === "dialogClass" ) { + uiDialog + .removeClass( this.options.dialogClass ) + .addClass( value ); + } + + if ( key === "disabled" ) { + return; + } + + this._super( key, value ); + + if ( key === "appendTo" ) { + this.uiDialog.appendTo( this._appendTo() ); + } + + if ( key === "buttons" ) { + this._createButtons(); + } + + if ( key === "closeText" ) { + this.uiDialogTitlebarClose.button({ + // Ensure that we always pass a string + label: "" + value + }); + } + + if ( key === "draggable" ) { + isDraggable = uiDialog.is( ":data(ui-draggable)" ); + if ( isDraggable && !value ) { + uiDialog.draggable( "destroy" ); + } + + if ( !isDraggable && value ) { + this._makeDraggable(); + } + } + + if ( key === "position" ) { + this._position(); + } + + if ( key === "resizable" ) { + // currently resizable, becoming non-resizable + isResizable = uiDialog.is( ":data(ui-resizable)" ); + if ( isResizable && !value ) { + uiDialog.resizable( "destroy" ); + } + + // currently resizable, changing handles + if ( isResizable && typeof value === "string" ) { + uiDialog.resizable( "option", "handles", value ); + } + + // currently non-resizable, becoming resizable + if ( !isResizable && value !== false ) { + this._makeResizable(); + } + } + + if ( key === "title" ) { + this._title( this.uiDialogTitlebar.find( ".ui-dialog-title" ) ); + } + }, + + _size: function() { + // If the user has resized the dialog, the .ui-dialog and .ui-dialog-content + // divs will both have width and height set, so we need to reset them + var nonContentHeight, minContentHeight, maxContentHeight, + options = this.options; + + // Reset content sizing + this.element.show().css({ + width: "auto", + minHeight: 0, + maxHeight: "none", + height: 0 + }); + + if ( options.minWidth > options.width ) { + options.width = options.minWidth; + } + + // reset wrapper sizing + // determine the height of all the non-content elements + nonContentHeight = this.uiDialog.css({ + height: "auto", + width: options.width + }) + .outerHeight(); + minContentHeight = Math.max( 0, options.minHeight - nonContentHeight ); + maxContentHeight = typeof options.maxHeight === "number" ? + Math.max( 0, options.maxHeight - nonContentHeight ) : + "none"; + + if ( options.height === "auto" ) { + this.element.css({ + minHeight: minContentHeight, + maxHeight: maxContentHeight, + height: "auto" + }); + } else { + this.element.height( Math.max( 0, options.height - nonContentHeight ) ); + } + + if ( this.uiDialog.is( ":data(ui-resizable)" ) ) { + this.uiDialog.resizable( "option", "minHeight", this._minHeight() ); + } + }, + + _blockFrames: function() { + this.iframeBlocks = this.document.find( "iframe" ).map(function() { + var iframe = $( this ); + + return $( "<div>" ) + .css({ + position: "absolute", + width: iframe.outerWidth(), + height: iframe.outerHeight() + }) + .appendTo( iframe.parent() ) + .offset( iframe.offset() )[0]; + }); + }, + + _unblockFrames: function() { + if ( this.iframeBlocks ) { + this.iframeBlocks.remove(); + delete this.iframeBlocks; + } + }, + + _allowInteraction: function( event ) { + if ( $( event.target ).closest( ".ui-dialog" ).length ) { + return true; + } + + // TODO: Remove hack when datepicker implements + // the .ui-front logic (#8989) + return !!$( event.target ).closest( ".ui-datepicker" ).length; + }, + + _createOverlay: function() { + if ( !this.options.modal ) { + return; + } + + // We use a delay in case the overlay is created from an + // event that we're going to be cancelling (#2804) + var isOpening = true; + this._delay(function() { + isOpening = false; + }); + + if ( !this.document.data( "ui-dialog-overlays" ) ) { + + // Prevent use of anchors and inputs + // Using _on() for an event handler shared across many instances is + // safe because the dialogs stack and must be closed in reverse order + this._on( this.document, { + focusin: function( event ) { + if ( isOpening ) { + return; + } + + if ( !this._allowInteraction( event ) ) { + event.preventDefault(); + this._trackingInstances()[ 0 ]._focusTabbable(); + } + } + }); + } + + this.overlay = $( "<div>" ) + .addClass( "ui-widget-overlay ui-front" ) + .appendTo( this._appendTo() ); + this._on( this.overlay, { + mousedown: "_keepFocus" + }); + this.document.data( "ui-dialog-overlays", + (this.document.data( "ui-dialog-overlays" ) || 0) + 1 ); + }, + + _destroyOverlay: function() { + if ( !this.options.modal ) { + return; + } + + if ( this.overlay ) { + var overlays = this.document.data( "ui-dialog-overlays" ) - 1; + + if ( !overlays ) { + this.document + .unbind( "focusin" ) + .removeData( "ui-dialog-overlays" ); + } else { + this.document.data( "ui-dialog-overlays", overlays ); + } + + this.overlay.remove(); + this.overlay = null; + } + } +}); + + +/*! + * jQuery UI Droppable 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/droppable/ + */ + + +$.widget( "ui.droppable", { + version: "1.11.4", + widgetEventPrefix: "drop", + options: { + accept: "*", + activeClass: false, + addClasses: true, + greedy: false, + hoverClass: false, + scope: "default", + tolerance: "intersect", + + // callbacks + activate: null, + deactivate: null, + drop: null, + out: null, + over: null + }, + _create: function() { + + var proportions, + o = this.options, + accept = o.accept; + + this.isover = false; + this.isout = true; + + this.accept = $.isFunction( accept ) ? accept : function( d ) { + return d.is( accept ); + }; + + this.proportions = function( /* valueToWrite */ ) { + if ( arguments.length ) { + // Store the droppable's proportions + proportions = arguments[ 0 ]; + } else { + // Retrieve or derive the droppable's proportions + return proportions ? + proportions : + proportions = { + width: this.element[ 0 ].offsetWidth, + height: this.element[ 0 ].offsetHeight + }; + } + }; + + this._addToManager( o.scope ); + + o.addClasses && this.element.addClass( "ui-droppable" ); + + }, + + _addToManager: function( scope ) { + // Add the reference and positions to the manager + $.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || []; + $.ui.ddmanager.droppables[ scope ].push( this ); + }, + + _splice: function( drop ) { + var i = 0; + for ( ; i < drop.length; i++ ) { + if ( drop[ i ] === this ) { + drop.splice( i, 1 ); + } + } + }, + + _destroy: function() { + var drop = $.ui.ddmanager.droppables[ this.options.scope ]; + + this._splice( drop ); + + this.element.removeClass( "ui-droppable ui-droppable-disabled" ); + }, + + _setOption: function( key, value ) { + + if ( key === "accept" ) { + this.accept = $.isFunction( value ) ? value : function( d ) { + return d.is( value ); + }; + } else if ( key === "scope" ) { + var drop = $.ui.ddmanager.droppables[ this.options.scope ]; + + this._splice( drop ); + this._addToManager( value ); + } + + this._super( key, value ); + }, + + _activate: function( event ) { + var draggable = $.ui.ddmanager.current; + if ( this.options.activeClass ) { + this.element.addClass( this.options.activeClass ); + } + if ( draggable ){ + this._trigger( "activate", event, this.ui( draggable ) ); + } + }, + + _deactivate: function( event ) { + var draggable = $.ui.ddmanager.current; + if ( this.options.activeClass ) { + this.element.removeClass( this.options.activeClass ); + } + if ( draggable ){ + this._trigger( "deactivate", event, this.ui( draggable ) ); + } + }, + + _over: function( event ) { + + var draggable = $.ui.ddmanager.current; + + // Bail if draggable and droppable are same element + if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) { + return; + } + + if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) { + if ( this.options.hoverClass ) { + this.element.addClass( this.options.hoverClass ); + } + this._trigger( "over", event, this.ui( draggable ) ); + } + + }, + + _out: function( event ) { + + var draggable = $.ui.ddmanager.current; + + // Bail if draggable and droppable are same element + if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) { + return; + } + + if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) { + if ( this.options.hoverClass ) { + this.element.removeClass( this.options.hoverClass ); + } + this._trigger( "out", event, this.ui( draggable ) ); + } + + }, + + _drop: function( event, custom ) { + + var draggable = custom || $.ui.ddmanager.current, + childrenIntersection = false; + + // Bail if draggable and droppable are same element + if ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) { + return false; + } + + this.element.find( ":data(ui-droppable)" ).not( ".ui-draggable-dragging" ).each(function() { + var inst = $( this ).droppable( "instance" ); + if ( + inst.options.greedy && + !inst.options.disabled && + inst.options.scope === draggable.options.scope && + inst.accept.call( inst.element[ 0 ], ( draggable.currentItem || draggable.element ) ) && + $.ui.intersect( draggable, $.extend( inst, { offset: inst.element.offset() } ), inst.options.tolerance, event ) + ) { childrenIntersection = true; return false; } + }); + if ( childrenIntersection ) { + return false; + } + + if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) { + if ( this.options.activeClass ) { + this.element.removeClass( this.options.activeClass ); + } + if ( this.options.hoverClass ) { + this.element.removeClass( this.options.hoverClass ); + } + this._trigger( "drop", event, this.ui( draggable ) ); + return this.element; + } + + return false; + + }, + + ui: function( c ) { + return { + draggable: ( c.currentItem || c.element ), + helper: c.helper, + position: c.position, + offset: c.positionAbs + }; + } + +}); + +$.ui.intersect = (function() { + function isOverAxis( x, reference, size ) { + return ( x >= reference ) && ( x < ( reference + size ) ); + } + + return function( draggable, droppable, toleranceMode, event ) { + + if ( !droppable.offset ) { + return false; + } + + var x1 = ( draggable.positionAbs || draggable.position.absolute ).left + draggable.margins.left, + y1 = ( draggable.positionAbs || draggable.position.absolute ).top + draggable.margins.top, + x2 = x1 + draggable.helperProportions.width, + y2 = y1 + draggable.helperProportions.height, + l = droppable.offset.left, + t = droppable.offset.top, + r = l + droppable.proportions().width, + b = t + droppable.proportions().height; + + switch ( toleranceMode ) { + case "fit": + return ( l <= x1 && x2 <= r && t <= y1 && y2 <= b ); + case "intersect": + return ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half + x2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half + t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half + y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half + case "pointer": + return isOverAxis( event.pageY, t, droppable.proportions().height ) && isOverAxis( event.pageX, l, droppable.proportions().width ); + case "touch": + return ( + ( y1 >= t && y1 <= b ) || // Top edge touching + ( y2 >= t && y2 <= b ) || // Bottom edge touching + ( y1 < t && y2 > b ) // Surrounded vertically + ) && ( + ( x1 >= l && x1 <= r ) || // Left edge touching + ( x2 >= l && x2 <= r ) || // Right edge touching + ( x1 < l && x2 > r ) // Surrounded horizontally + ); + default: + return false; + } + }; +})(); + +/* + This manager tracks offsets of draggables and droppables +*/ +$.ui.ddmanager = { + current: null, + droppables: { "default": [] }, + prepareOffsets: function( t, event ) { + + var i, j, + m = $.ui.ddmanager.droppables[ t.options.scope ] || [], + type = event ? event.type : null, // workaround for #2317 + list = ( t.currentItem || t.element ).find( ":data(ui-droppable)" ).addBack(); + + droppablesLoop: for ( i = 0; i < m.length; i++ ) { + + // No disabled and non-accepted + if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ], ( t.currentItem || t.element ) ) ) ) { + continue; + } + + // Filter out elements in the current dragged item + for ( j = 0; j < list.length; j++ ) { + if ( list[ j ] === m[ i ].element[ 0 ] ) { + m[ i ].proportions().height = 0; + continue droppablesLoop; + } + } + + m[ i ].visible = m[ i ].element.css( "display" ) !== "none"; + if ( !m[ i ].visible ) { + continue; + } + + // Activate the droppable if used directly from draggables + if ( type === "mousedown" ) { + m[ i ]._activate.call( m[ i ], event ); + } + + m[ i ].offset = m[ i ].element.offset(); + m[ i ].proportions({ width: m[ i ].element[ 0 ].offsetWidth, height: m[ i ].element[ 0 ].offsetHeight }); + + } + + }, + drop: function( draggable, event ) { + + var dropped = false; + // Create a copy of the droppables in case the list changes during the drop (#9116) + $.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() { + + if ( !this.options ) { + return; + } + if ( !this.options.disabled && this.visible && $.ui.intersect( draggable, this, this.options.tolerance, event ) ) { + dropped = this._drop.call( this, event ) || dropped; + } + + if ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) { + this.isout = true; + this.isover = false; + this._deactivate.call( this, event ); + } + + }); + return dropped; + + }, + dragStart: function( draggable, event ) { + // Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003) + draggable.element.parentsUntil( "body" ).bind( "scroll.droppable", function() { + if ( !draggable.options.refreshPositions ) { + $.ui.ddmanager.prepareOffsets( draggable, event ); + } + }); + }, + drag: function( draggable, event ) { + + // If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse. + if ( draggable.options.refreshPositions ) { + $.ui.ddmanager.prepareOffsets( draggable, event ); + } + + // Run through all droppables and check their positions based on specific tolerance options + $.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() { + + if ( this.options.disabled || this.greedyChild || !this.visible ) { + return; + } + + var parentInstance, scope, parent, + intersects = $.ui.intersect( draggable, this, this.options.tolerance, event ), + c = !intersects && this.isover ? "isout" : ( intersects && !this.isover ? "isover" : null ); + if ( !c ) { + return; + } + + if ( this.options.greedy ) { + // find droppable parents with same scope + scope = this.options.scope; + parent = this.element.parents( ":data(ui-droppable)" ).filter(function() { + return $( this ).droppable( "instance" ).options.scope === scope; + }); + + if ( parent.length ) { + parentInstance = $( parent[ 0 ] ).droppable( "instance" ); + parentInstance.greedyChild = ( c === "isover" ); + } + } + + // we just moved into a greedy child + if ( parentInstance && c === "isover" ) { + parentInstance.isover = false; + parentInstance.isout = true; + parentInstance._out.call( parentInstance, event ); + } + + this[ c ] = true; + this[c === "isout" ? "isover" : "isout"] = false; + this[c === "isover" ? "_over" : "_out"].call( this, event ); + + // we just moved out of a greedy child + if ( parentInstance && c === "isout" ) { + parentInstance.isout = false; + parentInstance.isover = true; + parentInstance._over.call( parentInstance, event ); + } + }); + + }, + dragStop: function( draggable, event ) { + draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable" ); + // Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003) + if ( !draggable.options.refreshPositions ) { + $.ui.ddmanager.prepareOffsets( draggable, event ); + } + } +}; + +var droppable = $.ui.droppable; + + +/*! + * jQuery UI Effects 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/category/effects-core/ + */ + + +var dataSpace = "ui-effects-", + + // Create a local jQuery because jQuery Color relies on it and the + // global may not exist with AMD and a custom build (#10199) + jQuery = $; + +$.effects = { + effect: {} +}; + +/*! + * jQuery Color Animations v2.1.2 + * https://github.com/jquery/jquery-color + * + * Copyright 2014 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * Date: Wed Jan 16 08:47:09 2013 -0600 + */ +(function( jQuery, undefined ) { + + var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor", + + // plusequals test for += 100 -= 100 + rplusequals = /^([\-+])=\s*(\d+\.?\d*)/, + // a set of RE's that can match strings and generate color tuples. + stringParsers = [ { + re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, + parse: function( execResult ) { + return [ + execResult[ 1 ], + execResult[ 2 ], + execResult[ 3 ], + execResult[ 4 ] + ]; + } + }, { + re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, + parse: function( execResult ) { + return [ + execResult[ 1 ] * 2.55, + execResult[ 2 ] * 2.55, + execResult[ 3 ] * 2.55, + execResult[ 4 ] + ]; + } + }, { + // this regex ignores A-F because it's compared against an already lowercased string + re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/, + parse: function( execResult ) { + return [ + parseInt( execResult[ 1 ], 16 ), + parseInt( execResult[ 2 ], 16 ), + parseInt( execResult[ 3 ], 16 ) + ]; + } + }, { + // this regex ignores A-F because it's compared against an already lowercased string + re: /#([a-f0-9])([a-f0-9])([a-f0-9])/, + parse: function( execResult ) { + return [ + parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ), + parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ), + parseInt( execResult[ 3 ] + execResult[ 3 ], 16 ) + ]; + } + }, { + re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, + space: "hsla", + parse: function( execResult ) { + return [ + execResult[ 1 ], + execResult[ 2 ] / 100, + execResult[ 3 ] / 100, + execResult[ 4 ] + ]; + } + } ], + + // jQuery.Color( ) + color = jQuery.Color = function( color, green, blue, alpha ) { + return new jQuery.Color.fn.parse( color, green, blue, alpha ); + }, + spaces = { + rgba: { + props: { + red: { + idx: 0, + type: "byte" + }, + green: { + idx: 1, + type: "byte" + }, + blue: { + idx: 2, + type: "byte" + } + } + }, + + hsla: { + props: { + hue: { + idx: 0, + type: "degrees" + }, + saturation: { + idx: 1, + type: "percent" + }, + lightness: { + idx: 2, + type: "percent" + } + } + } + }, + propTypes = { + "byte": { + floor: true, + max: 255 + }, + "percent": { + max: 1 + }, + "degrees": { + mod: 360, + floor: true + } + }, + support = color.support = {}, + + // element for support tests + supportElem = jQuery( "<p>" )[ 0 ], + + // colors = jQuery.Color.names + colors, + + // local aliases of functions called often + each = jQuery.each; + +// determine rgba support immediately +supportElem.style.cssText = "background-color:rgba(1,1,1,.5)"; +support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1; + +// define cache name and alpha properties +// for rgba and hsla spaces +each( spaces, function( spaceName, space ) { + space.cache = "_" + spaceName; + space.props.alpha = { + idx: 3, + type: "percent", + def: 1 + }; +}); + +function clamp( value, prop, allowEmpty ) { + var type = propTypes[ prop.type ] || {}; + + if ( value == null ) { + return (allowEmpty || !prop.def) ? null : prop.def; + } + + // ~~ is an short way of doing floor for positive numbers + value = type.floor ? ~~value : parseFloat( value ); + + // IE will pass in empty strings as value for alpha, + // which will hit this case + if ( isNaN( value ) ) { + return prop.def; + } + + if ( type.mod ) { + // we add mod before modding to make sure that negatives values + // get converted properly: -10 -> 350 + return (value + type.mod) % type.mod; + } + + // for now all property types without mod have min and max + return 0 > value ? 0 : type.max < value ? type.max : value; +} + +function stringParse( string ) { + var inst = color(), + rgba = inst._rgba = []; + + string = string.toLowerCase(); + + each( stringParsers, function( i, parser ) { + var parsed, + match = parser.re.exec( string ), + values = match && parser.parse( match ), + spaceName = parser.space || "rgba"; + + if ( values ) { + parsed = inst[ spaceName ]( values ); + + // if this was an rgba parse the assignment might happen twice + // oh well.... + inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ]; + rgba = inst._rgba = parsed._rgba; + + // exit each( stringParsers ) here because we matched + return false; + } + }); + + // Found a stringParser that handled it + if ( rgba.length ) { + + // if this came from a parsed string, force "transparent" when alpha is 0 + // chrome, (and maybe others) return "transparent" as rgba(0,0,0,0) + if ( rgba.join() === "0,0,0,0" ) { + jQuery.extend( rgba, colors.transparent ); + } + return inst; + } + + // named colors + return colors[ string ]; +} + +color.fn = jQuery.extend( color.prototype, { + parse: function( red, green, blue, alpha ) { + if ( red === undefined ) { + this._rgba = [ null, null, null, null ]; + return this; + } + if ( red.jquery || red.nodeType ) { + red = jQuery( red ).css( green ); + green = undefined; + } + + var inst = this, + type = jQuery.type( red ), + rgba = this._rgba = []; + + // more than 1 argument specified - assume ( red, green, blue, alpha ) + if ( green !== undefined ) { + red = [ red, green, blue, alpha ]; + type = "array"; + } + + if ( type === "string" ) { + return this.parse( stringParse( red ) || colors._default ); + } + + if ( type === "array" ) { + each( spaces.rgba.props, function( key, prop ) { + rgba[ prop.idx ] = clamp( red[ prop.idx ], prop ); + }); + return this; + } + + if ( type === "object" ) { + if ( red instanceof color ) { + each( spaces, function( spaceName, space ) { + if ( red[ space.cache ] ) { + inst[ space.cache ] = red[ space.cache ].slice(); + } + }); + } else { + each( spaces, function( spaceName, space ) { + var cache = space.cache; + each( space.props, function( key, prop ) { + + // if the cache doesn't exist, and we know how to convert + if ( !inst[ cache ] && space.to ) { + + // if the value was null, we don't need to copy it + // if the key was alpha, we don't need to copy it either + if ( key === "alpha" || red[ key ] == null ) { + return; + } + inst[ cache ] = space.to( inst._rgba ); + } + + // this is the only case where we allow nulls for ALL properties. + // call clamp with alwaysAllowEmpty + inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true ); + }); + + // everything defined but alpha? + if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) { + // use the default of 1 + inst[ cache ][ 3 ] = 1; + if ( space.from ) { + inst._rgba = space.from( inst[ cache ] ); + } + } + }); + } + return this; + } + }, + is: function( compare ) { + var is = color( compare ), + same = true, + inst = this; + + each( spaces, function( _, space ) { + var localCache, + isCache = is[ space.cache ]; + if (isCache) { + localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || []; + each( space.props, function( _, prop ) { + if ( isCache[ prop.idx ] != null ) { + same = ( isCache[ prop.idx ] === localCache[ prop.idx ] ); + return same; + } + }); + } + return same; + }); + return same; + }, + _space: function() { + var used = [], + inst = this; + each( spaces, function( spaceName, space ) { + if ( inst[ space.cache ] ) { + used.push( spaceName ); + } + }); + return used.pop(); + }, + transition: function( other, distance ) { + var end = color( other ), + spaceName = end._space(), + space = spaces[ spaceName ], + startColor = this.alpha() === 0 ? color( "transparent" ) : this, + start = startColor[ space.cache ] || space.to( startColor._rgba ), + result = start.slice(); + + end = end[ space.cache ]; + each( space.props, function( key, prop ) { + var index = prop.idx, + startValue = start[ index ], + endValue = end[ index ], + type = propTypes[ prop.type ] || {}; + + // if null, don't override start value + if ( endValue === null ) { + return; + } + // if null - use end + if ( startValue === null ) { + result[ index ] = endValue; + } else { + if ( type.mod ) { + if ( endValue - startValue > type.mod / 2 ) { + startValue += type.mod; + } else if ( startValue - endValue > type.mod / 2 ) { + startValue -= type.mod; + } + } + result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop ); + } + }); + return this[ spaceName ]( result ); + }, + blend: function( opaque ) { + // if we are already opaque - return ourself + if ( this._rgba[ 3 ] === 1 ) { + return this; + } + + var rgb = this._rgba.slice(), + a = rgb.pop(), + blend = color( opaque )._rgba; + + return color( jQuery.map( rgb, function( v, i ) { + return ( 1 - a ) * blend[ i ] + a * v; + })); + }, + toRgbaString: function() { + var prefix = "rgba(", + rgba = jQuery.map( this._rgba, function( v, i ) { + return v == null ? ( i > 2 ? 1 : 0 ) : v; + }); + + if ( rgba[ 3 ] === 1 ) { + rgba.pop(); + prefix = "rgb("; + } + + return prefix + rgba.join() + ")"; + }, + toHslaString: function() { + var prefix = "hsla(", + hsla = jQuery.map( this.hsla(), function( v, i ) { + if ( v == null ) { + v = i > 2 ? 1 : 0; + } + + // catch 1 and 2 + if ( i && i < 3 ) { + v = Math.round( v * 100 ) + "%"; + } + return v; + }); + + if ( hsla[ 3 ] === 1 ) { + hsla.pop(); + prefix = "hsl("; + } + return prefix + hsla.join() + ")"; + }, + toHexString: function( includeAlpha ) { + var rgba = this._rgba.slice(), + alpha = rgba.pop(); + + if ( includeAlpha ) { + rgba.push( ~~( alpha * 255 ) ); + } + + return "#" + jQuery.map( rgba, function( v ) { + + // default to 0 when nulls exist + v = ( v || 0 ).toString( 16 ); + return v.length === 1 ? "0" + v : v; + }).join(""); + }, + toString: function() { + return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString(); + } +}); +color.fn.parse.prototype = color.fn; + +// hsla conversions adapted from: +// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021 + +function hue2rgb( p, q, h ) { + h = ( h + 1 ) % 1; + if ( h * 6 < 1 ) { + return p + ( q - p ) * h * 6; + } + if ( h * 2 < 1) { + return q; + } + if ( h * 3 < 2 ) { + return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6; + } + return p; +} + +spaces.hsla.to = function( rgba ) { + if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) { + return [ null, null, null, rgba[ 3 ] ]; + } + var r = rgba[ 0 ] / 255, + g = rgba[ 1 ] / 255, + b = rgba[ 2 ] / 255, + a = rgba[ 3 ], + max = Math.max( r, g, b ), + min = Math.min( r, g, b ), + diff = max - min, + add = max + min, + l = add * 0.5, + h, s; + + if ( min === max ) { + h = 0; + } else if ( r === max ) { + h = ( 60 * ( g - b ) / diff ) + 360; + } else if ( g === max ) { + h = ( 60 * ( b - r ) / diff ) + 120; + } else { + h = ( 60 * ( r - g ) / diff ) + 240; + } + + // chroma (diff) == 0 means greyscale which, by definition, saturation = 0% + // otherwise, saturation is based on the ratio of chroma (diff) to lightness (add) + if ( diff === 0 ) { + s = 0; + } else if ( l <= 0.5 ) { + s = diff / add; + } else { + s = diff / ( 2 - add ); + } + return [ Math.round(h) % 360, s, l, a == null ? 1 : a ]; +}; + +spaces.hsla.from = function( hsla ) { + if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) { + return [ null, null, null, hsla[ 3 ] ]; + } + var h = hsla[ 0 ] / 360, + s = hsla[ 1 ], + l = hsla[ 2 ], + a = hsla[ 3 ], + q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s, + p = 2 * l - q; + + return [ + Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ), + Math.round( hue2rgb( p, q, h ) * 255 ), + Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ), + a + ]; +}; + +each( spaces, function( spaceName, space ) { + var props = space.props, + cache = space.cache, + to = space.to, + from = space.from; + + // makes rgba() and hsla() + color.fn[ spaceName ] = function( value ) { + + // generate a cache for this space if it doesn't exist + if ( to && !this[ cache ] ) { + this[ cache ] = to( this._rgba ); + } + if ( value === undefined ) { + return this[ cache ].slice(); + } + + var ret, + type = jQuery.type( value ), + arr = ( type === "array" || type === "object" ) ? value : arguments, + local = this[ cache ].slice(); + + each( props, function( key, prop ) { + var val = arr[ type === "object" ? key : prop.idx ]; + if ( val == null ) { + val = local[ prop.idx ]; + } + local[ prop.idx ] = clamp( val, prop ); + }); + + if ( from ) { + ret = color( from( local ) ); + ret[ cache ] = local; + return ret; + } else { + return color( local ); + } + }; + + // makes red() green() blue() alpha() hue() saturation() lightness() + each( props, function( key, prop ) { + // alpha is included in more than one space + if ( color.fn[ key ] ) { + return; + } + color.fn[ key ] = function( value ) { + var vtype = jQuery.type( value ), + fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ), + local = this[ fn ](), + cur = local[ prop.idx ], + match; + + if ( vtype === "undefined" ) { + return cur; + } + + if ( vtype === "function" ) { + value = value.call( this, cur ); + vtype = jQuery.type( value ); + } + if ( value == null && prop.empty ) { + return this; + } + if ( vtype === "string" ) { + match = rplusequals.exec( value ); + if ( match ) { + value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 ); + } + } + local[ prop.idx ] = value; + return this[ fn ]( local ); + }; + }); +}); + +// add cssHook and .fx.step function for each named hook. +// accept a space separated string of properties +color.hook = function( hook ) { + var hooks = hook.split( " " ); + each( hooks, function( i, hook ) { + jQuery.cssHooks[ hook ] = { + set: function( elem, value ) { + var parsed, curElem, + backgroundColor = ""; + + if ( value !== "transparent" && ( jQuery.type( value ) !== "string" || ( parsed = stringParse( value ) ) ) ) { + value = color( parsed || value ); + if ( !support.rgba && value._rgba[ 3 ] !== 1 ) { + curElem = hook === "backgroundColor" ? elem.parentNode : elem; + while ( + (backgroundColor === "" || backgroundColor === "transparent") && + curElem && curElem.style + ) { + try { + backgroundColor = jQuery.css( curElem, "backgroundColor" ); + curElem = curElem.parentNode; + } catch ( e ) { + } + } + + value = value.blend( backgroundColor && backgroundColor !== "transparent" ? + backgroundColor : + "_default" ); + } + + value = value.toRgbaString(); + } + try { + elem.style[ hook ] = value; + } catch ( e ) { + // wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit' + } + } + }; + jQuery.fx.step[ hook ] = function( fx ) { + if ( !fx.colorInit ) { + fx.start = color( fx.elem, hook ); + fx.end = color( fx.end ); + fx.colorInit = true; + } + jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) ); + }; + }); + +}; + +color.hook( stepHooks ); + +jQuery.cssHooks.borderColor = { + expand: function( value ) { + var expanded = {}; + + each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) { + expanded[ "border" + part + "Color" ] = value; + }); + return expanded; + } +}; + +// Basic color names only. +// Usage of any of the other color names requires adding yourself or including +// jquery.color.svg-names.js. +colors = jQuery.Color.names = { + // 4.1. Basic color keywords + aqua: "#00ffff", + black: "#000000", + blue: "#0000ff", + fuchsia: "#ff00ff", + gray: "#808080", + green: "#008000", + lime: "#00ff00", + maroon: "#800000", + navy: "#000080", + olive: "#808000", + purple: "#800080", + red: "#ff0000", + silver: "#c0c0c0", + teal: "#008080", + white: "#ffffff", + yellow: "#ffff00", + + // 4.2.3. "transparent" color keyword + transparent: [ null, null, null, 0 ], + + _default: "#ffffff" +}; + +})( jQuery ); + +/******************************************************************************/ +/****************************** CLASS ANIMATIONS ******************************/ +/******************************************************************************/ +(function() { + +var classAnimationActions = [ "add", "remove", "toggle" ], + shorthandStyles = { + border: 1, + borderBottom: 1, + borderColor: 1, + borderLeft: 1, + borderRight: 1, + borderTop: 1, + borderWidth: 1, + margin: 1, + padding: 1 + }; + +$.each([ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) { + $.fx.step[ prop ] = function( fx ) { + if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) { + jQuery.style( fx.elem, prop, fx.end ); + fx.setAttr = true; + } + }; +}); + +function getElementStyles( elem ) { + var key, len, + style = elem.ownerDocument.defaultView ? + elem.ownerDocument.defaultView.getComputedStyle( elem, null ) : + elem.currentStyle, + styles = {}; + + if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) { + len = style.length; + while ( len-- ) { + key = style[ len ]; + if ( typeof style[ key ] === "string" ) { + styles[ $.camelCase( key ) ] = style[ key ]; + } + } + // support: Opera, IE <9 + } else { + for ( key in style ) { + if ( typeof style[ key ] === "string" ) { + styles[ key ] = style[ key ]; + } + } + } + + return styles; +} + +function styleDifference( oldStyle, newStyle ) { + var diff = {}, + name, value; + + for ( name in newStyle ) { + value = newStyle[ name ]; + if ( oldStyle[ name ] !== value ) { + if ( !shorthandStyles[ name ] ) { + if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) { + diff[ name ] = value; + } + } + } + } + + return diff; +} + +// support: jQuery <1.8 +if ( !$.fn.addBack ) { + $.fn.addBack = function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + }; +} + +$.effects.animateClass = function( value, duration, easing, callback ) { + var o = $.speed( duration, easing, callback ); + + return this.queue( function() { + var animated = $( this ), + baseClass = animated.attr( "class" ) || "", + applyClassChange, + allAnimations = o.children ? animated.find( "*" ).addBack() : animated; + + // map the animated objects to store the original styles. + allAnimations = allAnimations.map(function() { + var el = $( this ); + return { + el: el, + start: getElementStyles( this ) + }; + }); + + // apply class change + applyClassChange = function() { + $.each( classAnimationActions, function(i, action) { + if ( value[ action ] ) { + animated[ action + "Class" ]( value[ action ] ); + } + }); + }; + applyClassChange(); + + // map all animated objects again - calculate new styles and diff + allAnimations = allAnimations.map(function() { + this.end = getElementStyles( this.el[ 0 ] ); + this.diff = styleDifference( this.start, this.end ); + return this; + }); + + // apply original class + animated.attr( "class", baseClass ); + + // map all animated objects again - this time collecting a promise + allAnimations = allAnimations.map(function() { + var styleInfo = this, + dfd = $.Deferred(), + opts = $.extend({}, o, { + queue: false, + complete: function() { + dfd.resolve( styleInfo ); + } + }); + + this.el.animate( this.diff, opts ); + return dfd.promise(); + }); + + // once all animations have completed: + $.when.apply( $, allAnimations.get() ).done(function() { + + // set the final class + applyClassChange(); + + // for each animated element, + // clear all css properties that were animated + $.each( arguments, function() { + var el = this.el; + $.each( this.diff, function(key) { + el.css( key, "" ); + }); + }); + + // this is guarnteed to be there if you use jQuery.speed() + // it also handles dequeuing the next anim... + o.complete.call( animated[ 0 ] ); + }); + }); +}; + +$.fn.extend({ + addClass: (function( orig ) { + return function( classNames, speed, easing, callback ) { + return speed ? + $.effects.animateClass.call( this, + { add: classNames }, speed, easing, callback ) : + orig.apply( this, arguments ); + }; + })( $.fn.addClass ), + + removeClass: (function( orig ) { + return function( classNames, speed, easing, callback ) { + return arguments.length > 1 ? + $.effects.animateClass.call( this, + { remove: classNames }, speed, easing, callback ) : + orig.apply( this, arguments ); + }; + })( $.fn.removeClass ), + + toggleClass: (function( orig ) { + return function( classNames, force, speed, easing, callback ) { + if ( typeof force === "boolean" || force === undefined ) { + if ( !speed ) { + // without speed parameter + return orig.apply( this, arguments ); + } else { + return $.effects.animateClass.call( this, + (force ? { add: classNames } : { remove: classNames }), + speed, easing, callback ); + } + } else { + // without force parameter + return $.effects.animateClass.call( this, + { toggle: classNames }, force, speed, easing ); + } + }; + })( $.fn.toggleClass ), + + switchClass: function( remove, add, speed, easing, callback) { + return $.effects.animateClass.call( this, { + add: add, + remove: remove + }, speed, easing, callback ); + } +}); + +})(); + +/******************************************************************************/ +/*********************************** EFFECTS **********************************/ +/******************************************************************************/ + +(function() { + +$.extend( $.effects, { + version: "1.11.4", + + // Saves a set of properties in a data storage + save: function( element, set ) { + for ( var i = 0; i < set.length; i++ ) { + if ( set[ i ] !== null ) { + element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] ); + } + } + }, + + // Restores a set of previously saved properties from a data storage + restore: function( element, set ) { + var val, i; + for ( i = 0; i < set.length; i++ ) { + if ( set[ i ] !== null ) { + val = element.data( dataSpace + set[ i ] ); + // support: jQuery 1.6.2 + // http://bugs.jquery.com/ticket/9917 + // jQuery 1.6.2 incorrectly returns undefined for any falsy value. + // We can't differentiate between "" and 0 here, so we just assume + // empty string since it's likely to be a more common value... + if ( val === undefined ) { + val = ""; + } + element.css( set[ i ], val ); + } + } + }, + + setMode: function( el, mode ) { + if (mode === "toggle") { + mode = el.is( ":hidden" ) ? "show" : "hide"; + } + return mode; + }, + + // Translates a [top,left] array into a baseline value + // this should be a little more flexible in the future to handle a string & hash + getBaseline: function( origin, original ) { + var y, x; + switch ( origin[ 0 ] ) { + case "top": y = 0; break; + case "middle": y = 0.5; break; + case "bottom": y = 1; break; + default: y = origin[ 0 ] / original.height; + } + switch ( origin[ 1 ] ) { + case "left": x = 0; break; + case "center": x = 0.5; break; + case "right": x = 1; break; + default: x = origin[ 1 ] / original.width; + } + return { + x: x, + y: y + }; + }, + + // Wraps the element around a wrapper that copies position properties + createWrapper: function( element ) { + + // if the element is already wrapped, return it + if ( element.parent().is( ".ui-effects-wrapper" )) { + return element.parent(); + } + + // wrap the element + var props = { + width: element.outerWidth(true), + height: element.outerHeight(true), + "float": element.css( "float" ) + }, + wrapper = $( "<div></div>" ) + .addClass( "ui-effects-wrapper" ) + .css({ + fontSize: "100%", + background: "transparent", + border: "none", + margin: 0, + padding: 0 + }), + // Store the size in case width/height are defined in % - Fixes #5245 + size = { + width: element.width(), + height: element.height() + }, + active = document.activeElement; + + // support: Firefox + // Firefox incorrectly exposes anonymous content + // https://bugzilla.mozilla.org/show_bug.cgi?id=561664 + try { + active.id; + } catch ( e ) { + active = document.body; + } + + element.wrap( wrapper ); + + // Fixes #7595 - Elements lose focus when wrapped. + if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) { + $( active ).focus(); + } + + wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element + + // transfer positioning properties to the wrapper + if ( element.css( "position" ) === "static" ) { + wrapper.css({ position: "relative" }); + element.css({ position: "relative" }); + } else { + $.extend( props, { + position: element.css( "position" ), + zIndex: element.css( "z-index" ) + }); + $.each([ "top", "left", "bottom", "right" ], function(i, pos) { + props[ pos ] = element.css( pos ); + if ( isNaN( parseInt( props[ pos ], 10 ) ) ) { + props[ pos ] = "auto"; + } + }); + element.css({ + position: "relative", + top: 0, + left: 0, + right: "auto", + bottom: "auto" + }); + } + element.css(size); + + return wrapper.css( props ).show(); + }, + + removeWrapper: function( element ) { + var active = document.activeElement; + + if ( element.parent().is( ".ui-effects-wrapper" ) ) { + element.parent().replaceWith( element ); + + // Fixes #7595 - Elements lose focus when wrapped. + if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) { + $( active ).focus(); + } + } + + return element; + }, + + setTransition: function( element, list, factor, value ) { + value = value || {}; + $.each( list, function( i, x ) { + var unit = element.cssUnit( x ); + if ( unit[ 0 ] > 0 ) { + value[ x ] = unit[ 0 ] * factor + unit[ 1 ]; + } + }); + return value; + } +}); + +// return an effect options object for the given parameters: +function _normalizeArguments( effect, options, speed, callback ) { + + // allow passing all options as the first parameter + if ( $.isPlainObject( effect ) ) { + options = effect; + effect = effect.effect; + } + + // convert to an object + effect = { effect: effect }; + + // catch (effect, null, ...) + if ( options == null ) { + options = {}; + } + + // catch (effect, callback) + if ( $.isFunction( options ) ) { + callback = options; + speed = null; + options = {}; + } + + // catch (effect, speed, ?) + if ( typeof options === "number" || $.fx.speeds[ options ] ) { + callback = speed; + speed = options; + options = {}; + } + + // catch (effect, options, callback) + if ( $.isFunction( speed ) ) { + callback = speed; + speed = null; + } + + // add options to effect + if ( options ) { + $.extend( effect, options ); + } + + speed = speed || options.duration; + effect.duration = $.fx.off ? 0 : + typeof speed === "number" ? speed : + speed in $.fx.speeds ? $.fx.speeds[ speed ] : + $.fx.speeds._default; + + effect.complete = callback || options.complete; + + return effect; +} + +function standardAnimationOption( option ) { + // Valid standard speeds (nothing, number, named speed) + if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) { + return true; + } + + // Invalid strings - treat as "normal" speed + if ( typeof option === "string" && !$.effects.effect[ option ] ) { + return true; + } + + // Complete callback + if ( $.isFunction( option ) ) { + return true; + } + + // Options hash (but not naming an effect) + if ( typeof option === "object" && !option.effect ) { + return true; + } + + // Didn't match any standard API + return false; +} + +$.fn.extend({ + effect: function( /* effect, options, speed, callback */ ) { + var args = _normalizeArguments.apply( this, arguments ), + mode = args.mode, + queue = args.queue, + effectMethod = $.effects.effect[ args.effect ]; + + if ( $.fx.off || !effectMethod ) { + // delegate to the original method (e.g., .show()) if possible + if ( mode ) { + return this[ mode ]( args.duration, args.complete ); + } else { + return this.each( function() { + if ( args.complete ) { + args.complete.call( this ); + } + }); + } + } + + function run( next ) { + var elem = $( this ), + complete = args.complete, + mode = args.mode; + + function done() { + if ( $.isFunction( complete ) ) { + complete.call( elem[0] ); + } + if ( $.isFunction( next ) ) { + next(); + } + } + + // If the element already has the correct final state, delegate to + // the core methods so the internal tracking of "olddisplay" works. + if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) { + elem[ mode ](); + done(); + } else { + effectMethod.call( elem[0], args, done ); + } + } + + return queue === false ? this.each( run ) : this.queue( queue || "fx", run ); + }, + + show: (function( orig ) { + return function( option ) { + if ( standardAnimationOption( option ) ) { + return orig.apply( this, arguments ); + } else { + var args = _normalizeArguments.apply( this, arguments ); + args.mode = "show"; + return this.effect.call( this, args ); + } + }; + })( $.fn.show ), + + hide: (function( orig ) { + return function( option ) { + if ( standardAnimationOption( option ) ) { + return orig.apply( this, arguments ); + } else { + var args = _normalizeArguments.apply( this, arguments ); + args.mode = "hide"; + return this.effect.call( this, args ); + } + }; + })( $.fn.hide ), + + toggle: (function( orig ) { + return function( option ) { + if ( standardAnimationOption( option ) || typeof option === "boolean" ) { + return orig.apply( this, arguments ); + } else { + var args = _normalizeArguments.apply( this, arguments ); + args.mode = "toggle"; + return this.effect.call( this, args ); + } + }; + })( $.fn.toggle ), + + // helper functions + cssUnit: function(key) { + var style = this.css( key ), + val = []; + + $.each( [ "em", "px", "%", "pt" ], function( i, unit ) { + if ( style.indexOf( unit ) > 0 ) { + val = [ parseFloat( style ), unit ]; + } + }); + return val; + } +}); + +})(); + +/******************************************************************************/ +/*********************************** EASING ***********************************/ +/******************************************************************************/ + +(function() { + +// based on easing equations from Robert Penner (http://www.robertpenner.com/easing) + +var baseEasings = {}; + +$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) { + baseEasings[ name ] = function( p ) { + return Math.pow( p, i + 2 ); + }; +}); + +$.extend( baseEasings, { + Sine: function( p ) { + return 1 - Math.cos( p * Math.PI / 2 ); + }, + Circ: function( p ) { + return 1 - Math.sqrt( 1 - p * p ); + }, + Elastic: function( p ) { + return p === 0 || p === 1 ? p : + -Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 ); + }, + Back: function( p ) { + return p * p * ( 3 * p - 2 ); + }, + Bounce: function( p ) { + var pow2, + bounce = 4; + + while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {} + return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 ); + } +}); + +$.each( baseEasings, function( name, easeIn ) { + $.easing[ "easeIn" + name ] = easeIn; + $.easing[ "easeOut" + name ] = function( p ) { + return 1 - easeIn( 1 - p ); + }; + $.easing[ "easeInOut" + name ] = function( p ) { + return p < 0.5 ? + easeIn( p * 2 ) / 2 : + 1 - easeIn( p * -2 + 2 ) / 2; + }; +}); + +})(); + +var effect = $.effects; + + +/*! + * jQuery UI Effects Blind 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/blind-effect/ + */ + + +var effectBlind = $.effects.effect.blind = function( o, done ) { + // Create element + var el = $( this ), + rvertical = /up|down|vertical/, + rpositivemotion = /up|left|vertical|horizontal/, + props = [ "position", "top", "bottom", "left", "right", "height", "width" ], + mode = $.effects.setMode( el, o.mode || "hide" ), + direction = o.direction || "up", + vertical = rvertical.test( direction ), + ref = vertical ? "height" : "width", + ref2 = vertical ? "top" : "left", + motion = rpositivemotion.test( direction ), + animation = {}, + show = mode === "show", + wrapper, distance, margin; + + // if already wrapped, the wrapper's properties are my property. #6245 + if ( el.parent().is( ".ui-effects-wrapper" ) ) { + $.effects.save( el.parent(), props ); + } else { + $.effects.save( el, props ); + } + el.show(); + wrapper = $.effects.createWrapper( el ).css({ + overflow: "hidden" + }); + + distance = wrapper[ ref ](); + margin = parseFloat( wrapper.css( ref2 ) ) || 0; + + animation[ ref ] = show ? distance : 0; + if ( !motion ) { + el + .css( vertical ? "bottom" : "right", 0 ) + .css( vertical ? "top" : "left", "auto" ) + .css({ position: "absolute" }); + + animation[ ref2 ] = show ? margin : distance + margin; + } + + // start at 0 if we are showing + if ( show ) { + wrapper.css( ref, 0 ); + if ( !motion ) { + wrapper.css( ref2, margin + distance ); + } + } + + // Animate + wrapper.animate( animation, { + duration: o.duration, + easing: o.easing, + queue: false, + complete: function() { + if ( mode === "hide" ) { + el.hide(); + } + $.effects.restore( el, props ); + $.effects.removeWrapper( el ); + done(); + } + }); +}; + + +/*! + * jQuery UI Effects Bounce 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/bounce-effect/ + */ + + +var effectBounce = $.effects.effect.bounce = function( o, done ) { + var el = $( this ), + props = [ "position", "top", "bottom", "left", "right", "height", "width" ], + + // defaults: + mode = $.effects.setMode( el, o.mode || "effect" ), + hide = mode === "hide", + show = mode === "show", + direction = o.direction || "up", + distance = o.distance, + times = o.times || 5, + + // number of internal animations + anims = times * 2 + ( show || hide ? 1 : 0 ), + speed = o.duration / anims, + easing = o.easing, + + // utility: + ref = ( direction === "up" || direction === "down" ) ? "top" : "left", + motion = ( direction === "up" || direction === "left" ), + i, + upAnim, + downAnim, + + // we will need to re-assemble the queue to stack our animations in place + queue = el.queue(), + queuelen = queue.length; + + // Avoid touching opacity to prevent clearType and PNG issues in IE + if ( show || hide ) { + props.push( "opacity" ); + } + + $.effects.save( el, props ); + el.show(); + $.effects.createWrapper( el ); // Create Wrapper + + // default distance for the BIGGEST bounce is the outer Distance / 3 + if ( !distance ) { + distance = el[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3; + } + + if ( show ) { + downAnim = { opacity: 1 }; + downAnim[ ref ] = 0; + + // if we are showing, force opacity 0 and set the initial position + // then do the "first" animation + el.css( "opacity", 0 ) + .css( ref, motion ? -distance * 2 : distance * 2 ) + .animate( downAnim, speed, easing ); + } + + // start at the smallest distance if we are hiding + if ( hide ) { + distance = distance / Math.pow( 2, times - 1 ); + } + + downAnim = {}; + downAnim[ ref ] = 0; + // Bounces up/down/left/right then back to 0 -- times * 2 animations happen here + for ( i = 0; i < times; i++ ) { + upAnim = {}; + upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance; + + el.animate( upAnim, speed, easing ) + .animate( downAnim, speed, easing ); + + distance = hide ? distance * 2 : distance / 2; + } + + // Last Bounce when Hiding + if ( hide ) { + upAnim = { opacity: 0 }; + upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance; + + el.animate( upAnim, speed, easing ); + } + + el.queue(function() { + if ( hide ) { + el.hide(); + } + $.effects.restore( el, props ); + $.effects.removeWrapper( el ); + done(); + }); + + // inject all the animations we just queued to be first in line (after "inprogress") + if ( queuelen > 1) { + queue.splice.apply( queue, + [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) ); + } + el.dequeue(); + +}; + + +/*! + * jQuery UI Effects Clip 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/clip-effect/ + */ + + +var effectClip = $.effects.effect.clip = function( o, done ) { + // Create element + var el = $( this ), + props = [ "position", "top", "bottom", "left", "right", "height", "width" ], + mode = $.effects.setMode( el, o.mode || "hide" ), + show = mode === "show", + direction = o.direction || "vertical", + vert = direction === "vertical", + size = vert ? "height" : "width", + position = vert ? "top" : "left", + animation = {}, + wrapper, animate, distance; + + // Save & Show + $.effects.save( el, props ); + el.show(); + + // Create Wrapper + wrapper = $.effects.createWrapper( el ).css({ + overflow: "hidden" + }); + animate = ( el[0].tagName === "IMG" ) ? wrapper : el; + distance = animate[ size ](); + + // Shift + if ( show ) { + animate.css( size, 0 ); + animate.css( position, distance / 2 ); + } + + // Create Animation Object: + animation[ size ] = show ? distance : 0; + animation[ position ] = show ? 0 : distance / 2; + + // Animate + animate.animate( animation, { + queue: false, + duration: o.duration, + easing: o.easing, + complete: function() { + if ( !show ) { + el.hide(); + } + $.effects.restore( el, props ); + $.effects.removeWrapper( el ); + done(); + } + }); + +}; + + +/*! + * jQuery UI Effects Drop 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/drop-effect/ + */ + + +var effectDrop = $.effects.effect.drop = function( o, done ) { + + var el = $( this ), + props = [ "position", "top", "bottom", "left", "right", "opacity", "height", "width" ], + mode = $.effects.setMode( el, o.mode || "hide" ), + show = mode === "show", + direction = o.direction || "left", + ref = ( direction === "up" || direction === "down" ) ? "top" : "left", + motion = ( direction === "up" || direction === "left" ) ? "pos" : "neg", + animation = { + opacity: show ? 1 : 0 + }, + distance; + + // Adjust + $.effects.save( el, props ); + el.show(); + $.effects.createWrapper( el ); + + distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ) / 2; + + if ( show ) { + el + .css( "opacity", 0 ) + .css( ref, motion === "pos" ? -distance : distance ); + } + + // Animation + animation[ ref ] = ( show ? + ( motion === "pos" ? "+=" : "-=" ) : + ( motion === "pos" ? "-=" : "+=" ) ) + + distance; + + // Animate + el.animate( animation, { + queue: false, + duration: o.duration, + easing: o.easing, + complete: function() { + if ( mode === "hide" ) { + el.hide(); + } + $.effects.restore( el, props ); + $.effects.removeWrapper( el ); + done(); + } + }); +}; + + +/*! + * jQuery UI Effects Explode 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/explode-effect/ + */ + + +var effectExplode = $.effects.effect.explode = function( o, done ) { + + var rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3, + cells = rows, + el = $( this ), + mode = $.effects.setMode( el, o.mode || "hide" ), + show = mode === "show", + + // show and then visibility:hidden the element before calculating offset + offset = el.show().css( "visibility", "hidden" ).offset(), + + // width and height of a piece + width = Math.ceil( el.outerWidth() / cells ), + height = Math.ceil( el.outerHeight() / rows ), + pieces = [], + + // loop + i, j, left, top, mx, my; + + // children animate complete: + function childComplete() { + pieces.push( this ); + if ( pieces.length === rows * cells ) { + animComplete(); + } + } + + // clone the element for each row and cell. + for ( i = 0; i < rows ; i++ ) { // ===> + top = offset.top + i * height; + my = i - ( rows - 1 ) / 2 ; + + for ( j = 0; j < cells ; j++ ) { // ||| + left = offset.left + j * width; + mx = j - ( cells - 1 ) / 2 ; + + // Create a clone of the now hidden main element that will be absolute positioned + // within a wrapper div off the -left and -top equal to size of our pieces + el + .clone() + .appendTo( "body" ) + .wrap( "<div></div>" ) + .css({ + position: "absolute", + visibility: "visible", + left: -j * width, + top: -i * height + }) + + // select the wrapper - make it overflow: hidden and absolute positioned based on + // where the original was located +left and +top equal to the size of pieces + .parent() + .addClass( "ui-effects-explode" ) + .css({ + position: "absolute", + overflow: "hidden", + width: width, + height: height, + left: left + ( show ? mx * width : 0 ), + top: top + ( show ? my * height : 0 ), + opacity: show ? 0 : 1 + }).animate({ + left: left + ( show ? 0 : mx * width ), + top: top + ( show ? 0 : my * height ), + opacity: show ? 1 : 0 + }, o.duration || 500, o.easing, childComplete ); + } + } + + function animComplete() { + el.css({ + visibility: "visible" + }); + $( pieces ).remove(); + if ( !show ) { + el.hide(); + } + done(); + } +}; + + +/*! + * jQuery UI Effects Fade 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/fade-effect/ + */ + + +var effectFade = $.effects.effect.fade = function( o, done ) { + var el = $( this ), + mode = $.effects.setMode( el, o.mode || "toggle" ); + + el.animate({ + opacity: mode + }, { + queue: false, + duration: o.duration, + easing: o.easing, + complete: done + }); +}; + + +/*! + * jQuery UI Effects Fold 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/fold-effect/ + */ + + +var effectFold = $.effects.effect.fold = function( o, done ) { + + // Create element + var el = $( this ), + props = [ "position", "top", "bottom", "left", "right", "height", "width" ], + mode = $.effects.setMode( el, o.mode || "hide" ), + show = mode === "show", + hide = mode === "hide", + size = o.size || 15, + percent = /([0-9]+)%/.exec( size ), + horizFirst = !!o.horizFirst, + widthFirst = show !== horizFirst, + ref = widthFirst ? [ "width", "height" ] : [ "height", "width" ], + duration = o.duration / 2, + wrapper, distance, + animation1 = {}, + animation2 = {}; + + $.effects.save( el, props ); + el.show(); + + // Create Wrapper + wrapper = $.effects.createWrapper( el ).css({ + overflow: "hidden" + }); + distance = widthFirst ? + [ wrapper.width(), wrapper.height() ] : + [ wrapper.height(), wrapper.width() ]; + + if ( percent ) { + size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ]; + } + if ( show ) { + wrapper.css( horizFirst ? { + height: 0, + width: size + } : { + height: size, + width: 0 + }); + } + + // Animation + animation1[ ref[ 0 ] ] = show ? distance[ 0 ] : size; + animation2[ ref[ 1 ] ] = show ? distance[ 1 ] : 0; + + // Animate + wrapper + .animate( animation1, duration, o.easing ) + .animate( animation2, duration, o.easing, function() { + if ( hide ) { + el.hide(); + } + $.effects.restore( el, props ); + $.effects.removeWrapper( el ); + done(); + }); + +}; + + +/*! + * jQuery UI Effects Highlight 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/highlight-effect/ + */ + + +var effectHighlight = $.effects.effect.highlight = function( o, done ) { + var elem = $( this ), + props = [ "backgroundImage", "backgroundColor", "opacity" ], + mode = $.effects.setMode( elem, o.mode || "show" ), + animation = { + backgroundColor: elem.css( "backgroundColor" ) + }; + + if (mode === "hide") { + animation.opacity = 0; + } + + $.effects.save( elem, props ); + + elem + .show() + .css({ + backgroundImage: "none", + backgroundColor: o.color || "#ffff99" + }) + .animate( animation, { + queue: false, + duration: o.duration, + easing: o.easing, + complete: function() { + if ( mode === "hide" ) { + elem.hide(); + } + $.effects.restore( elem, props ); + done(); + } + }); +}; + + +/*! + * jQuery UI Effects Size 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/size-effect/ + */ + + +var effectSize = $.effects.effect.size = function( o, done ) { + + // Create element + var original, baseline, factor, + el = $( this ), + props0 = [ "position", "top", "bottom", "left", "right", "width", "height", "overflow", "opacity" ], + + // Always restore + props1 = [ "position", "top", "bottom", "left", "right", "overflow", "opacity" ], + + // Copy for children + props2 = [ "width", "height", "overflow" ], + cProps = [ "fontSize" ], + vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ], + hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ], + + // Set options + mode = $.effects.setMode( el, o.mode || "effect" ), + restore = o.restore || mode !== "effect", + scale = o.scale || "both", + origin = o.origin || [ "middle", "center" ], + position = el.css( "position" ), + props = restore ? props0 : props1, + zero = { + height: 0, + width: 0, + outerHeight: 0, + outerWidth: 0 + }; + + if ( mode === "show" ) { + el.show(); + } + original = { + height: el.height(), + width: el.width(), + outerHeight: el.outerHeight(), + outerWidth: el.outerWidth() + }; + + if ( o.mode === "toggle" && mode === "show" ) { + el.from = o.to || zero; + el.to = o.from || original; + } else { + el.from = o.from || ( mode === "show" ? zero : original ); + el.to = o.to || ( mode === "hide" ? zero : original ); + } + + // Set scaling factor + factor = { + from: { + y: el.from.height / original.height, + x: el.from.width / original.width + }, + to: { + y: el.to.height / original.height, + x: el.to.width / original.width + } + }; + + // Scale the css box + if ( scale === "box" || scale === "both" ) { + + // Vertical props scaling + if ( factor.from.y !== factor.to.y ) { + props = props.concat( vProps ); + el.from = $.effects.setTransition( el, vProps, factor.from.y, el.from ); + el.to = $.effects.setTransition( el, vProps, factor.to.y, el.to ); + } + + // Horizontal props scaling + if ( factor.from.x !== factor.to.x ) { + props = props.concat( hProps ); + el.from = $.effects.setTransition( el, hProps, factor.from.x, el.from ); + el.to = $.effects.setTransition( el, hProps, factor.to.x, el.to ); + } + } + + // Scale the content + if ( scale === "content" || scale === "both" ) { + + // Vertical props scaling + if ( factor.from.y !== factor.to.y ) { + props = props.concat( cProps ).concat( props2 ); + el.from = $.effects.setTransition( el, cProps, factor.from.y, el.from ); + el.to = $.effects.setTransition( el, cProps, factor.to.y, el.to ); + } + } + + $.effects.save( el, props ); + el.show(); + $.effects.createWrapper( el ); + el.css( "overflow", "hidden" ).css( el.from ); + + // Adjust + if (origin) { // Calculate baseline shifts + baseline = $.effects.getBaseline( origin, original ); + el.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y; + el.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x; + el.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y; + el.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x; + } + el.css( el.from ); // set top & left + + // Animate + if ( scale === "content" || scale === "both" ) { // Scale the children + + // Add margins/font-size + vProps = vProps.concat([ "marginTop", "marginBottom" ]).concat(cProps); + hProps = hProps.concat([ "marginLeft", "marginRight" ]); + props2 = props0.concat(vProps).concat(hProps); + + el.find( "*[width]" ).each( function() { + var child = $( this ), + c_original = { + height: child.height(), + width: child.width(), + outerHeight: child.outerHeight(), + outerWidth: child.outerWidth() + }; + if (restore) { + $.effects.save(child, props2); + } + + child.from = { + height: c_original.height * factor.from.y, + width: c_original.width * factor.from.x, + outerHeight: c_original.outerHeight * factor.from.y, + outerWidth: c_original.outerWidth * factor.from.x + }; + child.to = { + height: c_original.height * factor.to.y, + width: c_original.width * factor.to.x, + outerHeight: c_original.height * factor.to.y, + outerWidth: c_original.width * factor.to.x + }; + + // Vertical props scaling + if ( factor.from.y !== factor.to.y ) { + child.from = $.effects.setTransition( child, vProps, factor.from.y, child.from ); + child.to = $.effects.setTransition( child, vProps, factor.to.y, child.to ); + } + + // Horizontal props scaling + if ( factor.from.x !== factor.to.x ) { + child.from = $.effects.setTransition( child, hProps, factor.from.x, child.from ); + child.to = $.effects.setTransition( child, hProps, factor.to.x, child.to ); + } + + // Animate children + child.css( child.from ); + child.animate( child.to, o.duration, o.easing, function() { + + // Restore children + if ( restore ) { + $.effects.restore( child, props2 ); + } + }); + }); + } + + // Animate + el.animate( el.to, { + queue: false, + duration: o.duration, + easing: o.easing, + complete: function() { + if ( el.to.opacity === 0 ) { + el.css( "opacity", el.from.opacity ); + } + if ( mode === "hide" ) { + el.hide(); + } + $.effects.restore( el, props ); + if ( !restore ) { + + // we need to calculate our new positioning based on the scaling + if ( position === "static" ) { + el.css({ + position: "relative", + top: el.to.top, + left: el.to.left + }); + } else { + $.each([ "top", "left" ], function( idx, pos ) { + el.css( pos, function( _, str ) { + var val = parseInt( str, 10 ), + toRef = idx ? el.to.left : el.to.top; + + // if original was "auto", recalculate the new value from wrapper + if ( str === "auto" ) { + return toRef + "px"; + } + + return val + toRef + "px"; + }); + }); + } + } + + $.effects.removeWrapper( el ); + done(); + } + }); + +}; + + +/*! + * jQuery UI Effects Scale 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/scale-effect/ + */ + + +var effectScale = $.effects.effect.scale = function( o, done ) { + + // Create element + var el = $( this ), + options = $.extend( true, {}, o ), + mode = $.effects.setMode( el, o.mode || "effect" ), + percent = parseInt( o.percent, 10 ) || + ( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === "hide" ? 0 : 100 ) ), + direction = o.direction || "both", + origin = o.origin, + original = { + height: el.height(), + width: el.width(), + outerHeight: el.outerHeight(), + outerWidth: el.outerWidth() + }, + factor = { + y: direction !== "horizontal" ? (percent / 100) : 1, + x: direction !== "vertical" ? (percent / 100) : 1 + }; + + // We are going to pass this effect to the size effect: + options.effect = "size"; + options.queue = false; + options.complete = done; + + // Set default origin and restore for show/hide + if ( mode !== "effect" ) { + options.origin = origin || [ "middle", "center" ]; + options.restore = true; + } + + options.from = o.from || ( mode === "show" ? { + height: 0, + width: 0, + outerHeight: 0, + outerWidth: 0 + } : original ); + options.to = { + height: original.height * factor.y, + width: original.width * factor.x, + outerHeight: original.outerHeight * factor.y, + outerWidth: original.outerWidth * factor.x + }; + + // Fade option to support puff + if ( options.fade ) { + if ( mode === "show" ) { + options.from.opacity = 0; + options.to.opacity = 1; + } + if ( mode === "hide" ) { + options.from.opacity = 1; + options.to.opacity = 0; + } + } + + // Animate + el.effect( options ); + +}; + + +/*! + * jQuery UI Effects Puff 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/puff-effect/ + */ + + +var effectPuff = $.effects.effect.puff = function( o, done ) { + var elem = $( this ), + mode = $.effects.setMode( elem, o.mode || "hide" ), + hide = mode === "hide", + percent = parseInt( o.percent, 10 ) || 150, + factor = percent / 100, + original = { + height: elem.height(), + width: elem.width(), + outerHeight: elem.outerHeight(), + outerWidth: elem.outerWidth() + }; + + $.extend( o, { + effect: "scale", + queue: false, + fade: true, + mode: mode, + complete: done, + percent: hide ? percent : 100, + from: hide ? + original : + { + height: original.height * factor, + width: original.width * factor, + outerHeight: original.outerHeight * factor, + outerWidth: original.outerWidth * factor + } + }); + + elem.effect( o ); +}; + + +/*! + * jQuery UI Effects Pulsate 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/pulsate-effect/ + */ + + +var effectPulsate = $.effects.effect.pulsate = function( o, done ) { + var elem = $( this ), + mode = $.effects.setMode( elem, o.mode || "show" ), + show = mode === "show", + hide = mode === "hide", + showhide = ( show || mode === "hide" ), + + // showing or hiding leaves of the "last" animation + anims = ( ( o.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ), + duration = o.duration / anims, + animateTo = 0, + queue = elem.queue(), + queuelen = queue.length, + i; + + if ( show || !elem.is(":visible")) { + elem.css( "opacity", 0 ).show(); + animateTo = 1; + } + + // anims - 1 opacity "toggles" + for ( i = 1; i < anims; i++ ) { + elem.animate({ + opacity: animateTo + }, duration, o.easing ); + animateTo = 1 - animateTo; + } + + elem.animate({ + opacity: animateTo + }, duration, o.easing); + + elem.queue(function() { + if ( hide ) { + elem.hide(); + } + done(); + }); + + // We just queued up "anims" animations, we need to put them next in the queue + if ( queuelen > 1 ) { + queue.splice.apply( queue, + [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) ); + } + elem.dequeue(); +}; + + +/*! + * jQuery UI Effects Shake 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/shake-effect/ + */ + + +var effectShake = $.effects.effect.shake = function( o, done ) { + + var el = $( this ), + props = [ "position", "top", "bottom", "left", "right", "height", "width" ], + mode = $.effects.setMode( el, o.mode || "effect" ), + direction = o.direction || "left", + distance = o.distance || 20, + times = o.times || 3, + anims = times * 2 + 1, + speed = Math.round( o.duration / anims ), + ref = (direction === "up" || direction === "down") ? "top" : "left", + positiveMotion = (direction === "up" || direction === "left"), + animation = {}, + animation1 = {}, + animation2 = {}, + i, + + // we will need to re-assemble the queue to stack our animations in place + queue = el.queue(), + queuelen = queue.length; + + $.effects.save( el, props ); + el.show(); + $.effects.createWrapper( el ); + + // Animation + animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance; + animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2; + animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2; + + // Animate + el.animate( animation, speed, o.easing ); + + // Shakes + for ( i = 1; i < times; i++ ) { + el.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing ); + } + el + .animate( animation1, speed, o.easing ) + .animate( animation, speed / 2, o.easing ) + .queue(function() { + if ( mode === "hide" ) { + el.hide(); + } + $.effects.restore( el, props ); + $.effects.removeWrapper( el ); + done(); + }); + + // inject all the animations we just queued to be first in line (after "inprogress") + if ( queuelen > 1) { + queue.splice.apply( queue, + [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) ); + } + el.dequeue(); + +}; + + +/*! + * jQuery UI Effects Slide 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/slide-effect/ + */ + + +var effectSlide = $.effects.effect.slide = function( o, done ) { + + // Create element + var el = $( this ), + props = [ "position", "top", "bottom", "left", "right", "width", "height" ], + mode = $.effects.setMode( el, o.mode || "show" ), + show = mode === "show", + direction = o.direction || "left", + ref = (direction === "up" || direction === "down") ? "top" : "left", + positiveMotion = (direction === "up" || direction === "left"), + distance, + animation = {}; + + // Adjust + $.effects.save( el, props ); + el.show(); + distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ); + + $.effects.createWrapper( el ).css({ + overflow: "hidden" + }); + + if ( show ) { + el.css( ref, positiveMotion ? (isNaN(distance) ? "-" + distance : -distance) : distance ); + } + + // Animation + animation[ ref ] = ( show ? + ( positiveMotion ? "+=" : "-=") : + ( positiveMotion ? "-=" : "+=")) + + distance; + + // Animate + el.animate( animation, { + queue: false, + duration: o.duration, + easing: o.easing, + complete: function() { + if ( mode === "hide" ) { + el.hide(); + } + $.effects.restore( el, props ); + $.effects.removeWrapper( el ); + done(); + } + }); +}; + + +/*! + * jQuery UI Effects Transfer 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/transfer-effect/ + */ + + +var effectTransfer = $.effects.effect.transfer = function( o, done ) { + var elem = $( this ), + target = $( o.to ), + targetFixed = target.css( "position" ) === "fixed", + body = $("body"), + fixTop = targetFixed ? body.scrollTop() : 0, + fixLeft = targetFixed ? body.scrollLeft() : 0, + endPosition = target.offset(), + animation = { + top: endPosition.top - fixTop, + left: endPosition.left - fixLeft, + height: target.innerHeight(), + width: target.innerWidth() + }, + startPosition = elem.offset(), + transfer = $( "<div class='ui-effects-transfer'></div>" ) + .appendTo( document.body ) + .addClass( o.className ) + .css({ + top: startPosition.top - fixTop, + left: startPosition.left - fixLeft, + height: elem.innerHeight(), + width: elem.innerWidth(), + position: targetFixed ? "fixed" : "absolute" + }) + .animate( animation, o.duration, o.easing, function() { + transfer.remove(); + done(); + }); +}; + + +/*! + * jQuery UI Progressbar 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/progressbar/ + */ + + +var progressbar = $.widget( "ui.progressbar", { + version: "1.11.4", + options: { + max: 100, + value: 0, + + change: null, + complete: null + }, + + min: 0, + + _create: function() { + // Constrain initial value + this.oldValue = this.options.value = this._constrainedValue(); + + this.element + .addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" ) + .attr({ + // Only set static values, aria-valuenow and aria-valuemax are + // set inside _refreshValue() + role: "progressbar", + "aria-valuemin": this.min + }); + + this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" ) + .appendTo( this.element ); + + this._refreshValue(); + }, + + _destroy: function() { + this.element + .removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" ) + .removeAttr( "role" ) + .removeAttr( "aria-valuemin" ) + .removeAttr( "aria-valuemax" ) + .removeAttr( "aria-valuenow" ); + + this.valueDiv.remove(); + }, + + value: function( newValue ) { + if ( newValue === undefined ) { + return this.options.value; + } + + this.options.value = this._constrainedValue( newValue ); + this._refreshValue(); + }, + + _constrainedValue: function( newValue ) { + if ( newValue === undefined ) { + newValue = this.options.value; + } + + this.indeterminate = newValue === false; + + // sanitize value + if ( typeof newValue !== "number" ) { + newValue = 0; + } + + return this.indeterminate ? false : + Math.min( this.options.max, Math.max( this.min, newValue ) ); + }, + + _setOptions: function( options ) { + // Ensure "value" option is set after other values (like max) + var value = options.value; + delete options.value; + + this._super( options ); + + this.options.value = this._constrainedValue( value ); + this._refreshValue(); + }, + + _setOption: function( key, value ) { + if ( key === "max" ) { + // Don't allow a max less than min + value = Math.max( this.min, value ); + } + if ( key === "disabled" ) { + this.element + .toggleClass( "ui-state-disabled", !!value ) + .attr( "aria-disabled", value ); + } + this._super( key, value ); + }, + + _percentage: function() { + return this.indeterminate ? 100 : 100 * ( this.options.value - this.min ) / ( this.options.max - this.min ); + }, + + _refreshValue: function() { + var value = this.options.value, + percentage = this._percentage(); + + this.valueDiv + .toggle( this.indeterminate || value > this.min ) + .toggleClass( "ui-corner-right", value === this.options.max ) + .width( percentage.toFixed(0) + "%" ); + + this.element.toggleClass( "ui-progressbar-indeterminate", this.indeterminate ); + + if ( this.indeterminate ) { + this.element.removeAttr( "aria-valuenow" ); + if ( !this.overlayDiv ) { + this.overlayDiv = $( "<div class='ui-progressbar-overlay'></div>" ).appendTo( this.valueDiv ); + } + } else { + this.element.attr({ + "aria-valuemax": this.options.max, + "aria-valuenow": value + }); + if ( this.overlayDiv ) { + this.overlayDiv.remove(); + this.overlayDiv = null; + } + } + + if ( this.oldValue !== value ) { + this.oldValue = value; + this._trigger( "change" ); + } + if ( value === this.options.max ) { + this._trigger( "complete" ); + } + } +}); + + +/*! + * jQuery UI Selectable 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/selectable/ + */ + + +var selectable = $.widget("ui.selectable", $.ui.mouse, { + version: "1.11.4", + options: { + appendTo: "body", + autoRefresh: true, + distance: 0, + filter: "*", + tolerance: "touch", + + // callbacks + selected: null, + selecting: null, + start: null, + stop: null, + unselected: null, + unselecting: null + }, + _create: function() { + var selectees, + that = this; + + this.element.addClass("ui-selectable"); + + this.dragged = false; + + // cache selectee children based on filter + this.refresh = function() { + selectees = $(that.options.filter, that.element[0]); + selectees.addClass("ui-selectee"); + selectees.each(function() { + var $this = $(this), + pos = $this.offset(); + $.data(this, "selectable-item", { + element: this, + $element: $this, + left: pos.left, + top: pos.top, + right: pos.left + $this.outerWidth(), + bottom: pos.top + $this.outerHeight(), + startselected: false, + selected: $this.hasClass("ui-selected"), + selecting: $this.hasClass("ui-selecting"), + unselecting: $this.hasClass("ui-unselecting") + }); + }); + }; + this.refresh(); + + this.selectees = selectees.addClass("ui-selectee"); + + this._mouseInit(); + + this.helper = $("<div class='ui-selectable-helper'></div>"); + }, + + _destroy: function() { + this.selectees + .removeClass("ui-selectee") + .removeData("selectable-item"); + this.element + .removeClass("ui-selectable ui-selectable-disabled"); + this._mouseDestroy(); + }, + + _mouseStart: function(event) { + var that = this, + options = this.options; + + this.opos = [ event.pageX, event.pageY ]; + + if (this.options.disabled) { + return; + } + + this.selectees = $(options.filter, this.element[0]); + + this._trigger("start", event); + + $(options.appendTo).append(this.helper); + // position helper (lasso) + this.helper.css({ + "left": event.pageX, + "top": event.pageY, + "width": 0, + "height": 0 + }); + + if (options.autoRefresh) { + this.refresh(); + } + + this.selectees.filter(".ui-selected").each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.startselected = true; + if (!event.metaKey && !event.ctrlKey) { + selectee.$element.removeClass("ui-selected"); + selectee.selected = false; + selectee.$element.addClass("ui-unselecting"); + selectee.unselecting = true; + // selectable UNSELECTING callback + that._trigger("unselecting", event, { + unselecting: selectee.element + }); + } + }); + + $(event.target).parents().addBack().each(function() { + var doSelect, + selectee = $.data(this, "selectable-item"); + if (selectee) { + doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass("ui-selected"); + selectee.$element + .removeClass(doSelect ? "ui-unselecting" : "ui-selected") + .addClass(doSelect ? "ui-selecting" : "ui-unselecting"); + selectee.unselecting = !doSelect; + selectee.selecting = doSelect; + selectee.selected = doSelect; + // selectable (UN)SELECTING callback + if (doSelect) { + that._trigger("selecting", event, { + selecting: selectee.element + }); + } else { + that._trigger("unselecting", event, { + unselecting: selectee.element + }); + } + return false; + } + }); + + }, + + _mouseDrag: function(event) { + + this.dragged = true; + + if (this.options.disabled) { + return; + } + + var tmp, + that = this, + options = this.options, + x1 = this.opos[0], + y1 = this.opos[1], + x2 = event.pageX, + y2 = event.pageY; + + if (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; } + if (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; } + this.helper.css({ left: x1, top: y1, width: x2 - x1, height: y2 - y1 }); + + this.selectees.each(function() { + var selectee = $.data(this, "selectable-item"), + hit = false; + + //prevent helper from being selected if appendTo: selectable + if (!selectee || selectee.element === that.element[0]) { + return; + } + + if (options.tolerance === "touch") { + hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) ); + } else if (options.tolerance === "fit") { + hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2); + } + + if (hit) { + // SELECT + if (selectee.selected) { + selectee.$element.removeClass("ui-selected"); + selectee.selected = false; + } + if (selectee.unselecting) { + selectee.$element.removeClass("ui-unselecting"); + selectee.unselecting = false; + } + if (!selectee.selecting) { + selectee.$element.addClass("ui-selecting"); + selectee.selecting = true; + // selectable SELECTING callback + that._trigger("selecting", event, { + selecting: selectee.element + }); + } + } else { + // UNSELECT + if (selectee.selecting) { + if ((event.metaKey || event.ctrlKey) && selectee.startselected) { + selectee.$element.removeClass("ui-selecting"); + selectee.selecting = false; + selectee.$element.addClass("ui-selected"); + selectee.selected = true; + } else { + selectee.$element.removeClass("ui-selecting"); + selectee.selecting = false; + if (selectee.startselected) { + selectee.$element.addClass("ui-unselecting"); + selectee.unselecting = true; + } + // selectable UNSELECTING callback + that._trigger("unselecting", event, { + unselecting: selectee.element + }); + } + } + if (selectee.selected) { + if (!event.metaKey && !event.ctrlKey && !selectee.startselected) { + selectee.$element.removeClass("ui-selected"); + selectee.selected = false; + + selectee.$element.addClass("ui-unselecting"); + selectee.unselecting = true; + // selectable UNSELECTING callback + that._trigger("unselecting", event, { + unselecting: selectee.element + }); + } + } + } + }); + + return false; + }, + + _mouseStop: function(event) { + var that = this; + + this.dragged = false; + + $(".ui-unselecting", this.element[0]).each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.$element.removeClass("ui-unselecting"); + selectee.unselecting = false; + selectee.startselected = false; + that._trigger("unselected", event, { + unselected: selectee.element + }); + }); + $(".ui-selecting", this.element[0]).each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.$element.removeClass("ui-selecting").addClass("ui-selected"); + selectee.selecting = false; + selectee.selected = true; + selectee.startselected = true; + that._trigger("selected", event, { + selected: selectee.element + }); + }); + this._trigger("stop", event); + + this.helper.remove(); + + return false; + } + +}); + + +/*! + * jQuery UI Selectmenu 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/selectmenu + */ + + +var selectmenu = $.widget( "ui.selectmenu", { + version: "1.11.4", + defaultElement: "<select>", + options: { + appendTo: null, + disabled: null, + icons: { + button: "ui-icon-triangle-1-s" + }, + position: { + my: "left top", + at: "left bottom", + collision: "none" + }, + width: null, + + // callbacks + change: null, + close: null, + focus: null, + open: null, + select: null + }, + + _create: function() { + var selectmenuId = this.element.uniqueId().attr( "id" ); + this.ids = { + element: selectmenuId, + button: selectmenuId + "-button", + menu: selectmenuId + "-menu" + }; + + this._drawButton(); + this._drawMenu(); + + if ( this.options.disabled ) { + this.disable(); + } + }, + + _drawButton: function() { + var that = this; + + // Associate existing label with the new button + this.label = $( "label[for='" + this.ids.element + "']" ).attr( "for", this.ids.button ); + this._on( this.label, { + click: function( event ) { + this.button.focus(); + event.preventDefault(); + } + }); + + // Hide original select element + this.element.hide(); + + // Create button + this.button = $( "<span>", { + "class": "ui-selectmenu-button ui-widget ui-state-default ui-corner-all", + tabindex: this.options.disabled ? -1 : 0, + id: this.ids.button, + role: "combobox", + "aria-expanded": "false", + "aria-autocomplete": "list", + "aria-owns": this.ids.menu, + "aria-haspopup": "true" + }) + .insertAfter( this.element ); + + $( "<span>", { + "class": "ui-icon " + this.options.icons.button + }) + .prependTo( this.button ); + + this.buttonText = $( "<span>", { + "class": "ui-selectmenu-text" + }) + .appendTo( this.button ); + + this._setText( this.buttonText, this.element.find( "option:selected" ).text() ); + this._resizeButton(); + + this._on( this.button, this._buttonEvents ); + this.button.one( "focusin", function() { + + // Delay rendering the menu items until the button receives focus. + // The menu may have already been rendered via a programmatic open. + if ( !that.menuItems ) { + that._refreshMenu(); + } + }); + this._hoverable( this.button ); + this._focusable( this.button ); + }, + + _drawMenu: function() { + var that = this; + + // Create menu + this.menu = $( "<ul>", { + "aria-hidden": "true", + "aria-labelledby": this.ids.button, + id: this.ids.menu + }); + + // Wrap menu + this.menuWrap = $( "<div>", { + "class": "ui-selectmenu-menu ui-front" + }) + .append( this.menu ) + .appendTo( this._appendTo() ); + + // Initialize menu widget + this.menuInstance = this.menu + .menu({ + role: "listbox", + select: function( event, ui ) { + event.preventDefault(); + + // support: IE8 + // If the item was selected via a click, the text selection + // will be destroyed in IE + that._setSelection(); + + that._select( ui.item.data( "ui-selectmenu-item" ), event ); + }, + focus: function( event, ui ) { + var item = ui.item.data( "ui-selectmenu-item" ); + + // Prevent inital focus from firing and check if its a newly focused item + if ( that.focusIndex != null && item.index !== that.focusIndex ) { + that._trigger( "focus", event, { item: item } ); + if ( !that.isOpen ) { + that._select( item, event ); + } + } + that.focusIndex = item.index; + + that.button.attr( "aria-activedescendant", + that.menuItems.eq( item.index ).attr( "id" ) ); + } + }) + .menu( "instance" ); + + // Adjust menu styles to dropdown + this.menu + .addClass( "ui-corner-bottom" ) + .removeClass( "ui-corner-all" ); + + // Don't close the menu on mouseleave + this.menuInstance._off( this.menu, "mouseleave" ); + + // Cancel the menu's collapseAll on document click + this.menuInstance._closeOnDocumentClick = function() { + return false; + }; + + // Selects often contain empty items, but never contain dividers + this.menuInstance._isDivider = function() { + return false; + }; + }, + + refresh: function() { + this._refreshMenu(); + this._setText( this.buttonText, this._getSelectedItem().text() ); + if ( !this.options.width ) { + this._resizeButton(); + } + }, + + _refreshMenu: function() { + this.menu.empty(); + + var item, + options = this.element.find( "option" ); + + if ( !options.length ) { + return; + } + + this._parseOptions( options ); + this._renderMenu( this.menu, this.items ); + + this.menuInstance.refresh(); + this.menuItems = this.menu.find( "li" ).not( ".ui-selectmenu-optgroup" ); + + item = this._getSelectedItem(); + + // Update the menu to have the correct item focused + this.menuInstance.focus( null, item ); + this._setAria( item.data( "ui-selectmenu-item" ) ); + + // Set disabled state + this._setOption( "disabled", this.element.prop( "disabled" ) ); + }, + + open: function( event ) { + if ( this.options.disabled ) { + return; + } + + // If this is the first time the menu is being opened, render the items + if ( !this.menuItems ) { + this._refreshMenu(); + } else { + + // Menu clears focus on close, reset focus to selected item + this.menu.find( ".ui-state-focus" ).removeClass( "ui-state-focus" ); + this.menuInstance.focus( null, this._getSelectedItem() ); + } + + this.isOpen = true; + this._toggleAttr(); + this._resizeMenu(); + this._position(); + + this._on( this.document, this._documentClick ); + + this._trigger( "open", event ); + }, + + _position: function() { + this.menuWrap.position( $.extend( { of: this.button }, this.options.position ) ); + }, + + close: function( event ) { + if ( !this.isOpen ) { + return; + } + + this.isOpen = false; + this._toggleAttr(); + + this.range = null; + this._off( this.document ); + + this._trigger( "close", event ); + }, + + widget: function() { + return this.button; + }, + + menuWidget: function() { + return this.menu; + }, + + _renderMenu: function( ul, items ) { + var that = this, + currentOptgroup = ""; + + $.each( items, function( index, item ) { + if ( item.optgroup !== currentOptgroup ) { + $( "<li>", { + "class": "ui-selectmenu-optgroup ui-menu-divider" + + ( item.element.parent( "optgroup" ).prop( "disabled" ) ? + " ui-state-disabled" : + "" ), + text: item.optgroup + }) + .appendTo( ul ); + + currentOptgroup = item.optgroup; + } + + that._renderItemData( ul, item ); + }); + }, + + _renderItemData: function( ul, item ) { + return this._renderItem( ul, item ).data( "ui-selectmenu-item", item ); + }, + + _renderItem: function( ul, item ) { + var li = $( "<li>" ); + + if ( item.disabled ) { + li.addClass( "ui-state-disabled" ); + } + this._setText( li, item.label ); + + return li.appendTo( ul ); + }, + + _setText: function( element, value ) { + if ( value ) { + element.text( value ); + } else { + element.html( "&#160;" ); + } + }, + + _move: function( direction, event ) { + var item, next, + filter = ".ui-menu-item"; + + if ( this.isOpen ) { + item = this.menuItems.eq( this.focusIndex ); + } else { + item = this.menuItems.eq( this.element[ 0 ].selectedIndex ); + filter += ":not(.ui-state-disabled)"; + } + + if ( direction === "first" || direction === "last" ) { + next = item[ direction === "first" ? "prevAll" : "nextAll" ]( filter ).eq( -1 ); + } else { + next = item[ direction + "All" ]( filter ).eq( 0 ); + } + + if ( next.length ) { + this.menuInstance.focus( event, next ); + } + }, + + _getSelectedItem: function() { + return this.menuItems.eq( this.element[ 0 ].selectedIndex ); + }, + + _toggle: function( event ) { + this[ this.isOpen ? "close" : "open" ]( event ); + }, + + _setSelection: function() { + var selection; + + if ( !this.range ) { + return; + } + + if ( window.getSelection ) { + selection = window.getSelection(); + selection.removeAllRanges(); + selection.addRange( this.range ); + + // support: IE8 + } else { + this.range.select(); + } + + // support: IE + // Setting the text selection kills the button focus in IE, but + // restoring the focus doesn't kill the selection. + this.button.focus(); + }, + + _documentClick: { + mousedown: function( event ) { + if ( !this.isOpen ) { + return; + } + + if ( !$( event.target ).closest( ".ui-selectmenu-menu, #" + this.ids.button ).length ) { + this.close( event ); + } + } + }, + + _buttonEvents: { + + // Prevent text selection from being reset when interacting with the selectmenu (#10144) + mousedown: function() { + var selection; + + if ( window.getSelection ) { + selection = window.getSelection(); + if ( selection.rangeCount ) { + this.range = selection.getRangeAt( 0 ); + } + + // support: IE8 + } else { + this.range = document.selection.createRange(); + } + }, + + click: function( event ) { + this._setSelection(); + this._toggle( event ); + }, + + keydown: function( event ) { + var preventDefault = true; + switch ( event.keyCode ) { + case $.ui.keyCode.TAB: + case $.ui.keyCode.ESCAPE: + this.close( event ); + preventDefault = false; + break; + case $.ui.keyCode.ENTER: + if ( this.isOpen ) { + this._selectFocusedItem( event ); + } + break; + case $.ui.keyCode.UP: + if ( event.altKey ) { + this._toggle( event ); + } else { + this._move( "prev", event ); + } + break; + case $.ui.keyCode.DOWN: + if ( event.altKey ) { + this._toggle( event ); + } else { + this._move( "next", event ); + } + break; + case $.ui.keyCode.SPACE: + if ( this.isOpen ) { + this._selectFocusedItem( event ); + } else { + this._toggle( event ); + } + break; + case $.ui.keyCode.LEFT: + this._move( "prev", event ); + break; + case $.ui.keyCode.RIGHT: + this._move( "next", event ); + break; + case $.ui.keyCode.HOME: + case $.ui.keyCode.PAGE_UP: + this._move( "first", event ); + break; + case $.ui.keyCode.END: + case $.ui.keyCode.PAGE_DOWN: + this._move( "last", event ); + break; + default: + this.menu.trigger( event ); + preventDefault = false; + } + + if ( preventDefault ) { + event.preventDefault(); + } + } + }, + + _selectFocusedItem: function( event ) { + var item = this.menuItems.eq( this.focusIndex ); + if ( !item.hasClass( "ui-state-disabled" ) ) { + this._select( item.data( "ui-selectmenu-item" ), event ); + } + }, + + _select: function( item, event ) { + var oldIndex = this.element[ 0 ].selectedIndex; + + // Change native select element + this.element[ 0 ].selectedIndex = item.index; + this._setText( this.buttonText, item.label ); + this._setAria( item ); + this._trigger( "select", event, { item: item } ); + + if ( item.index !== oldIndex ) { + this._trigger( "change", event, { item: item } ); + } + + this.close( event ); + }, + + _setAria: function( item ) { + var id = this.menuItems.eq( item.index ).attr( "id" ); + + this.button.attr({ + "aria-labelledby": id, + "aria-activedescendant": id + }); + this.menu.attr( "aria-activedescendant", id ); + }, + + _setOption: function( key, value ) { + if ( key === "icons" ) { + this.button.find( "span.ui-icon" ) + .removeClass( this.options.icons.button ) + .addClass( value.button ); + } + + this._super( key, value ); + + if ( key === "appendTo" ) { + this.menuWrap.appendTo( this._appendTo() ); + } + + if ( key === "disabled" ) { + this.menuInstance.option( "disabled", value ); + this.button + .toggleClass( "ui-state-disabled", value ) + .attr( "aria-disabled", value ); + + this.element.prop( "disabled", value ); + if ( value ) { + this.button.attr( "tabindex", -1 ); + this.close(); + } else { + this.button.attr( "tabindex", 0 ); + } + } + + if ( key === "width" ) { + this._resizeButton(); + } + }, + + _appendTo: function() { + var element = this.options.appendTo; + + if ( element ) { + element = element.jquery || element.nodeType ? + $( element ) : + this.document.find( element ).eq( 0 ); + } + + if ( !element || !element[ 0 ] ) { + element = this.element.closest( ".ui-front" ); + } + + if ( !element.length ) { + element = this.document[ 0 ].body; + } + + return element; + }, + + _toggleAttr: function() { + this.button + .toggleClass( "ui-corner-top", this.isOpen ) + .toggleClass( "ui-corner-all", !this.isOpen ) + .attr( "aria-expanded", this.isOpen ); + this.menuWrap.toggleClass( "ui-selectmenu-open", this.isOpen ); + this.menu.attr( "aria-hidden", !this.isOpen ); + }, + + _resizeButton: function() { + var width = this.options.width; + + if ( !width ) { + width = this.element.show().outerWidth(); + this.element.hide(); + } + + this.button.outerWidth( width ); + }, + + _resizeMenu: function() { + this.menu.outerWidth( Math.max( + this.button.outerWidth(), + + // support: IE10 + // IE10 wraps long text (possibly a rounding bug) + // so we add 1px to avoid the wrapping + this.menu.width( "" ).outerWidth() + 1 + ) ); + }, + + _getCreateOptions: function() { + return { disabled: this.element.prop( "disabled" ) }; + }, + + _parseOptions: function( options ) { + var data = []; + options.each(function( index, item ) { + var option = $( item ), + optgroup = option.parent( "optgroup" ); + data.push({ + element: option, + index: index, + value: option.val(), + label: option.text(), + optgroup: optgroup.attr( "label" ) || "", + disabled: optgroup.prop( "disabled" ) || option.prop( "disabled" ) + }); + }); + this.items = data; + }, + + _destroy: function() { + this.menuWrap.remove(); + this.button.remove(); + this.element.show(); + this.element.removeUniqueId(); + this.label.attr( "for", this.ids.element ); + } +}); + + +/*! + * jQuery UI Slider 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/slider/ + */ + + +var slider = $.widget( "ui.slider", $.ui.mouse, { + version: "1.11.4", + widgetEventPrefix: "slide", + + options: { + animate: false, + distance: 0, + max: 100, + min: 0, + orientation: "horizontal", + range: false, + step: 1, + value: 0, + values: null, + + // callbacks + change: null, + slide: null, + start: null, + stop: null + }, + + // number of pages in a slider + // (how many times can you page up/down to go through the whole range) + numPages: 5, + + _create: function() { + this._keySliding = false; + this._mouseSliding = false; + this._animateOff = true; + this._handleIndex = null; + this._detectOrientation(); + this._mouseInit(); + this._calculateNewMax(); + + this.element + .addClass( "ui-slider" + + " ui-slider-" + this.orientation + + " ui-widget" + + " ui-widget-content" + + " ui-corner-all"); + + this._refresh(); + this._setOption( "disabled", this.options.disabled ); + + this._animateOff = false; + }, + + _refresh: function() { + this._createRange(); + this._createHandles(); + this._setupEvents(); + this._refreshValue(); + }, + + _createHandles: function() { + var i, handleCount, + options = this.options, + existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ), + handle = "<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>", + handles = []; + + handleCount = ( options.values && options.values.length ) || 1; + + if ( existingHandles.length > handleCount ) { + existingHandles.slice( handleCount ).remove(); + existingHandles = existingHandles.slice( 0, handleCount ); + } + + for ( i = existingHandles.length; i < handleCount; i++ ) { + handles.push( handle ); + } + + this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) ); + + this.handle = this.handles.eq( 0 ); + + this.handles.each(function( i ) { + $( this ).data( "ui-slider-handle-index", i ); + }); + }, + + _createRange: function() { + var options = this.options, + classes = ""; + + if ( options.range ) { + if ( options.range === true ) { + if ( !options.values ) { + options.values = [ this._valueMin(), this._valueMin() ]; + } else if ( options.values.length && options.values.length !== 2 ) { + options.values = [ options.values[0], options.values[0] ]; + } else if ( $.isArray( options.values ) ) { + options.values = options.values.slice(0); + } + } + + if ( !this.range || !this.range.length ) { + this.range = $( "<div></div>" ) + .appendTo( this.element ); + + classes = "ui-slider-range" + + // note: this isn't the most fittingly semantic framework class for this element, + // but worked best visually with a variety of themes + " ui-widget-header ui-corner-all"; + } else { + this.range.removeClass( "ui-slider-range-min ui-slider-range-max" ) + // Handle range switching from true to min/max + .css({ + "left": "", + "bottom": "" + }); + } + + this.range.addClass( classes + + ( ( options.range === "min" || options.range === "max" ) ? " ui-slider-range-" + options.range : "" ) ); + } else { + if ( this.range ) { + this.range.remove(); + } + this.range = null; + } + }, + + _setupEvents: function() { + this._off( this.handles ); + this._on( this.handles, this._handleEvents ); + this._hoverable( this.handles ); + this._focusable( this.handles ); + }, + + _destroy: function() { + this.handles.remove(); + if ( this.range ) { + this.range.remove(); + } + + this.element + .removeClass( "ui-slider" + + " ui-slider-horizontal" + + " ui-slider-vertical" + + " ui-widget" + + " ui-widget-content" + + " ui-corner-all" ); + + this._mouseDestroy(); + }, + + _mouseCapture: function( event ) { + var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle, + that = this, + o = this.options; + + if ( o.disabled ) { + return false; + } + + this.elementSize = { + width: this.element.outerWidth(), + height: this.element.outerHeight() + }; + this.elementOffset = this.element.offset(); + + position = { x: event.pageX, y: event.pageY }; + normValue = this._normValueFromMouse( position ); + distance = this._valueMax() - this._valueMin() + 1; + this.handles.each(function( i ) { + var thisDistance = Math.abs( normValue - that.values(i) ); + if (( distance > thisDistance ) || + ( distance === thisDistance && + (i === that._lastChangedValue || that.values(i) === o.min ))) { + distance = thisDistance; + closestHandle = $( this ); + index = i; + } + }); + + allowed = this._start( event, index ); + if ( allowed === false ) { + return false; + } + this._mouseSliding = true; + + this._handleIndex = index; + + closestHandle + .addClass( "ui-state-active" ) + .focus(); + + offset = closestHandle.offset(); + mouseOverHandle = !$( event.target ).parents().addBack().is( ".ui-slider-handle" ); + this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : { + left: event.pageX - offset.left - ( closestHandle.width() / 2 ), + top: event.pageY - offset.top - + ( closestHandle.height() / 2 ) - + ( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) - + ( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) + + ( parseInt( closestHandle.css("marginTop"), 10 ) || 0) + }; + + if ( !this.handles.hasClass( "ui-state-hover" ) ) { + this._slide( event, index, normValue ); + } + this._animateOff = true; + return true; + }, + + _mouseStart: function() { + return true; + }, + + _mouseDrag: function( event ) { + var position = { x: event.pageX, y: event.pageY }, + normValue = this._normValueFromMouse( position ); + + this._slide( event, this._handleIndex, normValue ); + + return false; + }, + + _mouseStop: function( event ) { + this.handles.removeClass( "ui-state-active" ); + this._mouseSliding = false; + + this._stop( event, this._handleIndex ); + this._change( event, this._handleIndex ); + + this._handleIndex = null; + this._clickOffset = null; + this._animateOff = false; + + return false; + }, + + _detectOrientation: function() { + this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal"; + }, + + _normValueFromMouse: function( position ) { + var pixelTotal, + pixelMouse, + percentMouse, + valueTotal, + valueMouse; + + if ( this.orientation === "horizontal" ) { + pixelTotal = this.elementSize.width; + pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 ); + } else { + pixelTotal = this.elementSize.height; + pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 ); + } + + percentMouse = ( pixelMouse / pixelTotal ); + if ( percentMouse > 1 ) { + percentMouse = 1; + } + if ( percentMouse < 0 ) { + percentMouse = 0; + } + if ( this.orientation === "vertical" ) { + percentMouse = 1 - percentMouse; + } + + valueTotal = this._valueMax() - this._valueMin(); + valueMouse = this._valueMin() + percentMouse * valueTotal; + + return this._trimAlignValue( valueMouse ); + }, + + _start: function( event, index ) { + var uiHash = { + handle: this.handles[ index ], + value: this.value() + }; + if ( this.options.values && this.options.values.length ) { + uiHash.value = this.values( index ); + uiHash.values = this.values(); + } + return this._trigger( "start", event, uiHash ); + }, + + _slide: function( event, index, newVal ) { + var otherVal, + newValues, + allowed; + + if ( this.options.values && this.options.values.length ) { + otherVal = this.values( index ? 0 : 1 ); + + if ( ( this.options.values.length === 2 && this.options.range === true ) && + ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) ) + ) { + newVal = otherVal; + } + + if ( newVal !== this.values( index ) ) { + newValues = this.values(); + newValues[ index ] = newVal; + // A slide can be canceled by returning false from the slide callback + allowed = this._trigger( "slide", event, { + handle: this.handles[ index ], + value: newVal, + values: newValues + } ); + otherVal = this.values( index ? 0 : 1 ); + if ( allowed !== false ) { + this.values( index, newVal ); + } + } + } else { + if ( newVal !== this.value() ) { + // A slide can be canceled by returning false from the slide callback + allowed = this._trigger( "slide", event, { + handle: this.handles[ index ], + value: newVal + } ); + if ( allowed !== false ) { + this.value( newVal ); + } + } + } + }, + + _stop: function( event, index ) { + var uiHash = { + handle: this.handles[ index ], + value: this.value() + }; + if ( this.options.values && this.options.values.length ) { + uiHash.value = this.values( index ); + uiHash.values = this.values(); + } + + this._trigger( "stop", event, uiHash ); + }, + + _change: function( event, index ) { + if ( !this._keySliding && !this._mouseSliding ) { + var uiHash = { + handle: this.handles[ index ], + value: this.value() + }; + if ( this.options.values && this.options.values.length ) { + uiHash.value = this.values( index ); + uiHash.values = this.values(); + } + + //store the last changed value index for reference when handles overlap + this._lastChangedValue = index; + + this._trigger( "change", event, uiHash ); + } + }, + + value: function( newValue ) { + if ( arguments.length ) { + this.options.value = this._trimAlignValue( newValue ); + this._refreshValue(); + this._change( null, 0 ); + return; + } + + return this._value(); + }, + + values: function( index, newValue ) { + var vals, + newValues, + i; + + if ( arguments.length > 1 ) { + this.options.values[ index ] = this._trimAlignValue( newValue ); + this._refreshValue(); + this._change( null, index ); + return; + } + + if ( arguments.length ) { + if ( $.isArray( arguments[ 0 ] ) ) { + vals = this.options.values; + newValues = arguments[ 0 ]; + for ( i = 0; i < vals.length; i += 1 ) { + vals[ i ] = this._trimAlignValue( newValues[ i ] ); + this._change( null, i ); + } + this._refreshValue(); + } else { + if ( this.options.values && this.options.values.length ) { + return this._values( index ); + } else { + return this.value(); + } + } + } else { + return this._values(); + } + }, + + _setOption: function( key, value ) { + var i, + valsLength = 0; + + if ( key === "range" && this.options.range === true ) { + if ( value === "min" ) { + this.options.value = this._values( 0 ); + this.options.values = null; + } else if ( value === "max" ) { + this.options.value = this._values( this.options.values.length - 1 ); + this.options.values = null; + } + } + + if ( $.isArray( this.options.values ) ) { + valsLength = this.options.values.length; + } + + if ( key === "disabled" ) { + this.element.toggleClass( "ui-state-disabled", !!value ); + } + + this._super( key, value ); + + switch ( key ) { + case "orientation": + this._detectOrientation(); + this.element + .removeClass( "ui-slider-horizontal ui-slider-vertical" ) + .addClass( "ui-slider-" + this.orientation ); + this._refreshValue(); + + // Reset positioning from previous orientation + this.handles.css( value === "horizontal" ? "bottom" : "left", "" ); + break; + case "value": + this._animateOff = true; + this._refreshValue(); + this._change( null, 0 ); + this._animateOff = false; + break; + case "values": + this._animateOff = true; + this._refreshValue(); + for ( i = 0; i < valsLength; i += 1 ) { + this._change( null, i ); + } + this._animateOff = false; + break; + case "step": + case "min": + case "max": + this._animateOff = true; + this._calculateNewMax(); + this._refreshValue(); + this._animateOff = false; + break; + case "range": + this._animateOff = true; + this._refresh(); + this._animateOff = false; + break; + } + }, + + //internal value getter + // _value() returns value trimmed by min and max, aligned by step + _value: function() { + var val = this.options.value; + val = this._trimAlignValue( val ); + + return val; + }, + + //internal values getter + // _values() returns array of values trimmed by min and max, aligned by step + // _values( index ) returns single value trimmed by min and max, aligned by step + _values: function( index ) { + var val, + vals, + i; + + if ( arguments.length ) { + val = this.options.values[ index ]; + val = this._trimAlignValue( val ); + + return val; + } else if ( this.options.values && this.options.values.length ) { + // .slice() creates a copy of the array + // this copy gets trimmed by min and max and then returned + vals = this.options.values.slice(); + for ( i = 0; i < vals.length; i += 1) { + vals[ i ] = this._trimAlignValue( vals[ i ] ); + } + + return vals; + } else { + return []; + } + }, + + // returns the step-aligned value that val is closest to, between (inclusive) min and max + _trimAlignValue: function( val ) { + if ( val <= this._valueMin() ) { + return this._valueMin(); + } + if ( val >= this._valueMax() ) { + return this._valueMax(); + } + var step = ( this.options.step > 0 ) ? this.options.step : 1, + valModStep = (val - this._valueMin()) % step, + alignValue = val - valModStep; + + if ( Math.abs(valModStep) * 2 >= step ) { + alignValue += ( valModStep > 0 ) ? step : ( -step ); + } + + // Since JavaScript has problems with large floats, round + // the final value to 5 digits after the decimal point (see #4124) + return parseFloat( alignValue.toFixed(5) ); + }, + + _calculateNewMax: function() { + var max = this.options.max, + min = this._valueMin(), + step = this.options.step, + aboveMin = Math.floor( ( +( max - min ).toFixed( this._precision() ) ) / step ) * step; + max = aboveMin + min; + this.max = parseFloat( max.toFixed( this._precision() ) ); + }, + + _precision: function() { + var precision = this._precisionOf( this.options.step ); + if ( this.options.min !== null ) { + precision = Math.max( precision, this._precisionOf( this.options.min ) ); + } + return precision; + }, + + _precisionOf: function( num ) { + var str = num.toString(), + decimal = str.indexOf( "." ); + return decimal === -1 ? 0 : str.length - decimal - 1; + }, + + _valueMin: function() { + return this.options.min; + }, + + _valueMax: function() { + return this.max; + }, + + _refreshValue: function() { + var lastValPercent, valPercent, value, valueMin, valueMax, + oRange = this.options.range, + o = this.options, + that = this, + animate = ( !this._animateOff ) ? o.animate : false, + _set = {}; + + if ( this.options.values && this.options.values.length ) { + this.handles.each(function( i ) { + valPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() - that._valueMin() ) * 100; + _set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%"; + $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate ); + if ( that.options.range === true ) { + if ( that.orientation === "horizontal" ) { + if ( i === 0 ) { + that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate ); + } + if ( i === 1 ) { + that.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } ); + } + } else { + if ( i === 0 ) { + that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate ); + } + if ( i === 1 ) { + that.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } ); + } + } + } + lastValPercent = valPercent; + }); + } else { + value = this.value(); + valueMin = this._valueMin(); + valueMax = this._valueMax(); + valPercent = ( valueMax !== valueMin ) ? + ( value - valueMin ) / ( valueMax - valueMin ) * 100 : + 0; + _set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%"; + this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate ); + + if ( oRange === "min" && this.orientation === "horizontal" ) { + this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate ); + } + if ( oRange === "max" && this.orientation === "horizontal" ) { + this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } ); + } + if ( oRange === "min" && this.orientation === "vertical" ) { + this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate ); + } + if ( oRange === "max" && this.orientation === "vertical" ) { + this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } ); + } + } + }, + + _handleEvents: { + keydown: function( event ) { + var allowed, curVal, newVal, step, + index = $( event.target ).data( "ui-slider-handle-index" ); + + switch ( event.keyCode ) { + case $.ui.keyCode.HOME: + case $.ui.keyCode.END: + case $.ui.keyCode.PAGE_UP: + case $.ui.keyCode.PAGE_DOWN: + case $.ui.keyCode.UP: + case $.ui.keyCode.RIGHT: + case $.ui.keyCode.DOWN: + case $.ui.keyCode.LEFT: + event.preventDefault(); + if ( !this._keySliding ) { + this._keySliding = true; + $( event.target ).addClass( "ui-state-active" ); + allowed = this._start( event, index ); + if ( allowed === false ) { + return; + } + } + break; + } + + step = this.options.step; + if ( this.options.values && this.options.values.length ) { + curVal = newVal = this.values( index ); + } else { + curVal = newVal = this.value(); + } + + switch ( event.keyCode ) { + case $.ui.keyCode.HOME: + newVal = this._valueMin(); + break; + case $.ui.keyCode.END: + newVal = this._valueMax(); + break; + case $.ui.keyCode.PAGE_UP: + newVal = this._trimAlignValue( + curVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages ) + ); + break; + case $.ui.keyCode.PAGE_DOWN: + newVal = this._trimAlignValue( + curVal - ( (this._valueMax() - this._valueMin()) / this.numPages ) ); + break; + case $.ui.keyCode.UP: + case $.ui.keyCode.RIGHT: + if ( curVal === this._valueMax() ) { + return; + } + newVal = this._trimAlignValue( curVal + step ); + break; + case $.ui.keyCode.DOWN: + case $.ui.keyCode.LEFT: + if ( curVal === this._valueMin() ) { + return; + } + newVal = this._trimAlignValue( curVal - step ); + break; + } + + this._slide( event, index, newVal ); + }, + keyup: function( event ) { + var index = $( event.target ).data( "ui-slider-handle-index" ); + + if ( this._keySliding ) { + this._keySliding = false; + this._stop( event, index ); + this._change( event, index ); + $( event.target ).removeClass( "ui-state-active" ); + } + } + } +}); + + +/*! + * jQuery UI Sortable 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/sortable/ + */ + + +var sortable = $.widget("ui.sortable", $.ui.mouse, { + version: "1.11.4", + widgetEventPrefix: "sort", + ready: false, + options: { + appendTo: "parent", + axis: false, + connectWith: false, + containment: false, + cursor: "auto", + cursorAt: false, + dropOnEmpty: true, + forcePlaceholderSize: false, + forceHelperSize: false, + grid: false, + handle: false, + helper: "original", + items: "> *", + opacity: false, + placeholder: false, + revert: false, + scroll: true, + scrollSensitivity: 20, + scrollSpeed: 20, + scope: "default", + tolerance: "intersect", + zIndex: 1000, + + // callbacks + activate: null, + beforeStop: null, + change: null, + deactivate: null, + out: null, + over: null, + receive: null, + remove: null, + sort: null, + start: null, + stop: null, + update: null + }, + + _isOverAxis: function( x, reference, size ) { + return ( x >= reference ) && ( x < ( reference + size ) ); + }, + + _isFloating: function( item ) { + return (/left|right/).test(item.css("float")) || (/inline|table-cell/).test(item.css("display")); + }, + + _create: function() { + this.containerCache = {}; + this.element.addClass("ui-sortable"); + + //Get the items + this.refresh(); + + //Let's determine the parent's offset + this.offset = this.element.offset(); + + //Initialize mouse events for interaction + this._mouseInit(); + + this._setHandleClassName(); + + //We're ready to go + this.ready = true; + + }, + + _setOption: function( key, value ) { + this._super( key, value ); + + if ( key === "handle" ) { + this._setHandleClassName(); + } + }, + + _setHandleClassName: function() { + this.element.find( ".ui-sortable-handle" ).removeClass( "ui-sortable-handle" ); + $.each( this.items, function() { + ( this.instance.options.handle ? + this.item.find( this.instance.options.handle ) : this.item ) + .addClass( "ui-sortable-handle" ); + }); + }, + + _destroy: function() { + this.element + .removeClass( "ui-sortable ui-sortable-disabled" ) + .find( ".ui-sortable-handle" ) + .removeClass( "ui-sortable-handle" ); + this._mouseDestroy(); + + for ( var i = this.items.length - 1; i >= 0; i-- ) { + this.items[i].item.removeData(this.widgetName + "-item"); + } + + return this; + }, + + _mouseCapture: function(event, overrideHandle) { + var currentItem = null, + validHandle = false, + that = this; + + if (this.reverting) { + return false; + } + + if(this.options.disabled || this.options.type === "static") { + return false; + } + + //We have to refresh the items data once first + this._refreshItems(event); + + //Find out if the clicked node (or one of its parents) is a actual item in this.items + $(event.target).parents().each(function() { + if($.data(this, that.widgetName + "-item") === that) { + currentItem = $(this); + return false; + } + }); + if($.data(event.target, that.widgetName + "-item") === that) { + currentItem = $(event.target); + } + + if(!currentItem) { + return false; + } + if(this.options.handle && !overrideHandle) { + $(this.options.handle, currentItem).find("*").addBack().each(function() { + if(this === event.target) { + validHandle = true; + } + }); + if(!validHandle) { + return false; + } + } + + this.currentItem = currentItem; + this._removeCurrentsFromItems(); + return true; + + }, + + _mouseStart: function(event, overrideHandle, noActivation) { + + var i, body, + o = this.options; + + this.currentContainer = this; + + //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture + this.refreshPositions(); + + //Create and append the visible helper + this.helper = this._createHelper(event); + + //Cache the helper size + this._cacheHelperProportions(); + + /* + * - Position generation - + * This block generates everything position related - it's the core of draggables. + */ + + //Cache the margins of the original element + this._cacheMargins(); + + //Get the next scrolling parent + this.scrollParent = this.helper.scrollParent(); + + //The element's absolute position on the page minus margins + this.offset = this.currentItem.offset(); + this.offset = { + top: this.offset.top - this.margins.top, + left: this.offset.left - this.margins.left + }; + + $.extend(this.offset, { + click: { //Where the click happened, relative to the element + left: event.pageX - this.offset.left, + top: event.pageY - this.offset.top + }, + parent: this._getParentOffset(), + relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper + }); + + // Only after we got the offset, we can change the helper's position to absolute + // TODO: Still need to figure out a way to make relative sorting possible + this.helper.css("position", "absolute"); + this.cssPosition = this.helper.css("position"); + + //Generate the original position + this.originalPosition = this._generatePosition(event); + this.originalPageX = event.pageX; + this.originalPageY = event.pageY; + + //Adjust the mouse offset relative to the helper if "cursorAt" is supplied + (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt)); + + //Cache the former DOM position + this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] }; + + //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way + if(this.helper[0] !== this.currentItem[0]) { + this.currentItem.hide(); + } + + //Create the placeholder + this._createPlaceholder(); + + //Set a containment if given in the options + if(o.containment) { + this._setContainment(); + } + + if( o.cursor && o.cursor !== "auto" ) { // cursor option + body = this.document.find( "body" ); + + // support: IE + this.storedCursor = body.css( "cursor" ); + body.css( "cursor", o.cursor ); + + this.storedStylesheet = $( "<style>*{ cursor: "+o.cursor+" !important; }</style>" ).appendTo( body ); + } + + if(o.opacity) { // opacity option + if (this.helper.css("opacity")) { + this._storedOpacity = this.helper.css("opacity"); + } + this.helper.css("opacity", o.opacity); + } + + if(o.zIndex) { // zIndex option + if (this.helper.css("zIndex")) { + this._storedZIndex = this.helper.css("zIndex"); + } + this.helper.css("zIndex", o.zIndex); + } + + //Prepare scrolling + if(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== "HTML") { + this.overflowOffset = this.scrollParent.offset(); + } + + //Call callbacks + this._trigger("start", event, this._uiHash()); + + //Recache the helper size + if(!this._preserveHelperProportions) { + this._cacheHelperProportions(); + } + + + //Post "activate" events to possible containers + if( !noActivation ) { + for ( i = this.containers.length - 1; i >= 0; i-- ) { + this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) ); + } + } + + //Prepare possible droppables + if($.ui.ddmanager) { + $.ui.ddmanager.current = this; + } + + if ($.ui.ddmanager && !o.dropBehaviour) { + $.ui.ddmanager.prepareOffsets(this, event); + } + + this.dragging = true; + + this.helper.addClass("ui-sortable-helper"); + this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position + return true; + + }, + + _mouseDrag: function(event) { + var i, item, itemElement, intersection, + o = this.options, + scrolled = false; + + //Compute the helpers position + this.position = this._generatePosition(event); + this.positionAbs = this._convertPositionTo("absolute"); + + if (!this.lastPositionAbs) { + this.lastPositionAbs = this.positionAbs; + } + + //Do scrolling + if(this.options.scroll) { + if(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== "HTML") { + + if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) { + this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed; + } else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) { + this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed; + } + + if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) { + this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed; + } else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) { + this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed; + } + + } else { + + if(event.pageY - this.document.scrollTop() < o.scrollSensitivity) { + scrolled = this.document.scrollTop(this.document.scrollTop() - o.scrollSpeed); + } else if(this.window.height() - (event.pageY - this.document.scrollTop()) < o.scrollSensitivity) { + scrolled = this.document.scrollTop(this.document.scrollTop() + o.scrollSpeed); + } + + if(event.pageX - this.document.scrollLeft() < o.scrollSensitivity) { + scrolled = this.document.scrollLeft(this.document.scrollLeft() - o.scrollSpeed); + } else if(this.window.width() - (event.pageX - this.document.scrollLeft()) < o.scrollSensitivity) { + scrolled = this.document.scrollLeft(this.document.scrollLeft() + o.scrollSpeed); + } + + } + + if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) { + $.ui.ddmanager.prepareOffsets(this, event); + } + } + + //Regenerate the absolute position used for position checks + this.positionAbs = this._convertPositionTo("absolute"); + + //Set the helper position + if(!this.options.axis || this.options.axis !== "y") { + this.helper[0].style.left = this.position.left+"px"; + } + if(!this.options.axis || this.options.axis !== "x") { + this.helper[0].style.top = this.position.top+"px"; + } + + //Rearrange + for (i = this.items.length - 1; i >= 0; i--) { + + //Cache variables and intersection, continue if no intersection + item = this.items[i]; + itemElement = item.item[0]; + intersection = this._intersectsWithPointer(item); + if (!intersection) { + continue; + } + + // Only put the placeholder inside the current Container, skip all + // items from other containers. This works because when moving + // an item from one container to another the + // currentContainer is switched before the placeholder is moved. + // + // Without this, moving items in "sub-sortables" can cause + // the placeholder to jitter between the outer and inner container. + if (item.instance !== this.currentContainer) { + continue; + } + + // cannot intersect with itself + // no useless actions that have been done before + // no action if the item moved is the parent of the item checked + if (itemElement !== this.currentItem[0] && + this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !== itemElement && + !$.contains(this.placeholder[0], itemElement) && + (this.options.type === "semi-dynamic" ? !$.contains(this.element[0], itemElement) : true) + ) { + + this.direction = intersection === 1 ? "down" : "up"; + + if (this.options.tolerance === "pointer" || this._intersectsWithSides(item)) { + this._rearrange(event, item); + } else { + break; + } + + this._trigger("change", event, this._uiHash()); + break; + } + } + + //Post events to containers + this._contactContainers(event); + + //Interconnect with droppables + if($.ui.ddmanager) { + $.ui.ddmanager.drag(this, event); + } + + //Call callbacks + this._trigger("sort", event, this._uiHash()); + + this.lastPositionAbs = this.positionAbs; + return false; + + }, + + _mouseStop: function(event, noPropagation) { + + if(!event) { + return; + } + + //If we are using droppables, inform the manager about the drop + if ($.ui.ddmanager && !this.options.dropBehaviour) { + $.ui.ddmanager.drop(this, event); + } + + if(this.options.revert) { + var that = this, + cur = this.placeholder.offset(), + axis = this.options.axis, + animation = {}; + + if ( !axis || axis === "x" ) { + animation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollLeft); + } + if ( !axis || axis === "y" ) { + animation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollTop); + } + this.reverting = true; + $(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() { + that._clear(event); + }); + } else { + this._clear(event, noPropagation); + } + + return false; + + }, + + cancel: function() { + + if(this.dragging) { + + this._mouseUp({ target: null }); + + if(this.options.helper === "original") { + this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"); + } else { + this.currentItem.show(); + } + + //Post deactivating events to containers + for (var i = this.containers.length - 1; i >= 0; i--){ + this.containers[i]._trigger("deactivate", null, this._uiHash(this)); + if(this.containers[i].containerCache.over) { + this.containers[i]._trigger("out", null, this._uiHash(this)); + this.containers[i].containerCache.over = 0; + } + } + + } + + if (this.placeholder) { + //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node! + if(this.placeholder[0].parentNode) { + this.placeholder[0].parentNode.removeChild(this.placeholder[0]); + } + if(this.options.helper !== "original" && this.helper && this.helper[0].parentNode) { + this.helper.remove(); + } + + $.extend(this, { + helper: null, + dragging: false, + reverting: false, + _noFinalSort: null + }); + + if(this.domPosition.prev) { + $(this.domPosition.prev).after(this.currentItem); + } else { + $(this.domPosition.parent).prepend(this.currentItem); + } + } + + return this; + + }, + + serialize: function(o) { + + var items = this._getItemsAsjQuery(o && o.connected), + str = []; + o = o || {}; + + $(items).each(function() { + var res = ($(o.item || this).attr(o.attribute || "id") || "").match(o.expression || (/(.+)[\-=_](.+)/)); + if (res) { + str.push((o.key || res[1]+"[]")+"="+(o.key && o.expression ? res[1] : res[2])); + } + }); + + if(!str.length && o.key) { + str.push(o.key + "="); + } + + return str.join("&"); + + }, + + toArray: function(o) { + + var items = this._getItemsAsjQuery(o && o.connected), + ret = []; + + o = o || {}; + + items.each(function() { ret.push($(o.item || this).attr(o.attribute || "id") || ""); }); + return ret; + + }, + + /* Be careful with the following core functions */ + _intersectsWith: function(item) { + + var x1 = this.positionAbs.left, + x2 = x1 + this.helperProportions.width, + y1 = this.positionAbs.top, + y2 = y1 + this.helperProportions.height, + l = item.left, + r = l + item.width, + t = item.top, + b = t + item.height, + dyClick = this.offset.click.top, + dxClick = this.offset.click.left, + isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ), + isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ), + isOverElement = isOverElementHeight && isOverElementWidth; + + if ( this.options.tolerance === "pointer" || + this.options.forcePointerForContainers || + (this.options.tolerance !== "pointer" && this.helperProportions[this.floating ? "width" : "height"] > item[this.floating ? "width" : "height"]) + ) { + return isOverElement; + } else { + + return (l < x1 + (this.helperProportions.width / 2) && // Right Half + x2 - (this.helperProportions.width / 2) < r && // Left Half + t < y1 + (this.helperProportions.height / 2) && // Bottom Half + y2 - (this.helperProportions.height / 2) < b ); // Top Half + + } + }, + + _intersectsWithPointer: function(item) { + + var isOverElementHeight = (this.options.axis === "x") || this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height), + isOverElementWidth = (this.options.axis === "y") || this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width), + isOverElement = isOverElementHeight && isOverElementWidth, + verticalDirection = this._getDragVerticalDirection(), + horizontalDirection = this._getDragHorizontalDirection(); + + if (!isOverElement) { + return false; + } + + return this.floating ? + ( ((horizontalDirection && horizontalDirection === "right") || verticalDirection === "down") ? 2 : 1 ) + : ( verticalDirection && (verticalDirection === "down" ? 2 : 1) ); + + }, + + _intersectsWithSides: function(item) { + + var isOverBottomHalf = this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height), + isOverRightHalf = this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width), + verticalDirection = this._getDragVerticalDirection(), + horizontalDirection = this._getDragHorizontalDirection(); + + if (this.floating && horizontalDirection) { + return ((horizontalDirection === "right" && isOverRightHalf) || (horizontalDirection === "left" && !isOverRightHalf)); + } else { + return verticalDirection && ((verticalDirection === "down" && isOverBottomHalf) || (verticalDirection === "up" && !isOverBottomHalf)); + } + + }, + + _getDragVerticalDirection: function() { + var delta = this.positionAbs.top - this.lastPositionAbs.top; + return delta !== 0 && (delta > 0 ? "down" : "up"); + }, + + _getDragHorizontalDirection: function() { + var delta = this.positionAbs.left - this.lastPositionAbs.left; + return delta !== 0 && (delta > 0 ? "right" : "left"); + }, + + refresh: function(event) { + this._refreshItems(event); + this._setHandleClassName(); + this.refreshPositions(); + return this; + }, + + _connectWith: function() { + var options = this.options; + return options.connectWith.constructor === String ? [options.connectWith] : options.connectWith; + }, + + _getItemsAsjQuery: function(connected) { + + var i, j, cur, inst, + items = [], + queries = [], + connectWith = this._connectWith(); + + if(connectWith && connected) { + for (i = connectWith.length - 1; i >= 0; i--){ + cur = $(connectWith[i], this.document[0]); + for ( j = cur.length - 1; j >= 0; j--){ + inst = $.data(cur[j], this.widgetFullName); + if(inst && inst !== this && !inst.options.disabled) { + queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), inst]); + } + } + } + } + + queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), this]); + + function addItems() { + items.push( this ); + } + for (i = queries.length - 1; i >= 0; i--){ + queries[i][0].each( addItems ); + } + + return $(items); + + }, + + _removeCurrentsFromItems: function() { + + var list = this.currentItem.find(":data(" + this.widgetName + "-item)"); + + this.items = $.grep(this.items, function (item) { + for (var j=0; j < list.length; j++) { + if(list[j] === item.item[0]) { + return false; + } + } + return true; + }); + + }, + + _refreshItems: function(event) { + + this.items = []; + this.containers = [this]; + + var i, j, cur, inst, targetData, _queries, item, queriesLength, + items = this.items, + queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]], + connectWith = this._connectWith(); + + if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down + for (i = connectWith.length - 1; i >= 0; i--){ + cur = $(connectWith[i], this.document[0]); + for (j = cur.length - 1; j >= 0; j--){ + inst = $.data(cur[j], this.widgetFullName); + if(inst && inst !== this && !inst.options.disabled) { + queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]); + this.containers.push(inst); + } + } + } + } + + for (i = queries.length - 1; i >= 0; i--) { + targetData = queries[i][1]; + _queries = queries[i][0]; + + for (j=0, queriesLength = _queries.length; j < queriesLength; j++) { + item = $(_queries[j]); + + item.data(this.widgetName + "-item", targetData); // Data for target checking (mouse manager) + + items.push({ + item: item, + instance: targetData, + width: 0, height: 0, + left: 0, top: 0 + }); + } + } + + }, + + refreshPositions: function(fast) { + + // Determine whether items are being displayed horizontally + this.floating = this.items.length ? + this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) : + false; + + //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change + if(this.offsetParent && this.helper) { + this.offset.parent = this._getParentOffset(); + } + + var i, item, t, p; + + for (i = this.items.length - 1; i >= 0; i--){ + item = this.items[i]; + + //We ignore calculating positions of all connected containers when we're not over them + if(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) { + continue; + } + + t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item; + + if (!fast) { + item.width = t.outerWidth(); + item.height = t.outerHeight(); + } + + p = t.offset(); + item.left = p.left; + item.top = p.top; + } + + if(this.options.custom && this.options.custom.refreshContainers) { + this.options.custom.refreshContainers.call(this); + } else { + for (i = this.containers.length - 1; i >= 0; i--){ + p = this.containers[i].element.offset(); + this.containers[i].containerCache.left = p.left; + this.containers[i].containerCache.top = p.top; + this.containers[i].containerCache.width = this.containers[i].element.outerWidth(); + this.containers[i].containerCache.height = this.containers[i].element.outerHeight(); + } + } + + return this; + }, + + _createPlaceholder: function(that) { + that = that || this; + var className, + o = that.options; + + if(!o.placeholder || o.placeholder.constructor === String) { + className = o.placeholder; + o.placeholder = { + element: function() { + + var nodeName = that.currentItem[0].nodeName.toLowerCase(), + element = $( "<" + nodeName + ">", that.document[0] ) + .addClass(className || that.currentItem[0].className+" ui-sortable-placeholder") + .removeClass("ui-sortable-helper"); + + if ( nodeName === "tbody" ) { + that._createTrPlaceholder( + that.currentItem.find( "tr" ).eq( 0 ), + $( "<tr>", that.document[ 0 ] ).appendTo( element ) + ); + } else if ( nodeName === "tr" ) { + that._createTrPlaceholder( that.currentItem, element ); + } else if ( nodeName === "img" ) { + element.attr( "src", that.currentItem.attr( "src" ) ); + } + + if ( !className ) { + element.css( "visibility", "hidden" ); + } + + return element; + }, + update: function(container, p) { + + // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that + // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified + if(className && !o.forcePlaceholderSize) { + return; + } + + //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item + if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css("paddingTop")||0, 10) - parseInt(that.currentItem.css("paddingBottom")||0, 10)); } + if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css("paddingLeft")||0, 10) - parseInt(that.currentItem.css("paddingRight")||0, 10)); } + } + }; + } + + //Create the placeholder + that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem)); + + //Append it after the actual current item + that.currentItem.after(that.placeholder); + + //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317) + o.placeholder.update(that, that.placeholder); + + }, + + _createTrPlaceholder: function( sourceTr, targetTr ) { + var that = this; + + sourceTr.children().each(function() { + $( "<td>&#160;</td>", that.document[ 0 ] ) + .attr( "colspan", $( this ).attr( "colspan" ) || 1 ) + .appendTo( targetTr ); + }); + }, + + _contactContainers: function(event) { + var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom, floating, axis, + innermostContainer = null, + innermostIndex = null; + + // get innermost container that intersects with item + for (i = this.containers.length - 1; i >= 0; i--) { + + // never consider a container that's located within the item itself + if($.contains(this.currentItem[0], this.containers[i].element[0])) { + continue; + } + + if(this._intersectsWith(this.containers[i].containerCache)) { + + // if we've already found a container and it's more "inner" than this, then continue + if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) { + continue; + } + + innermostContainer = this.containers[i]; + innermostIndex = i; + + } else { + // container doesn't intersect. trigger "out" event if necessary + if(this.containers[i].containerCache.over) { + this.containers[i]._trigger("out", event, this._uiHash(this)); + this.containers[i].containerCache.over = 0; + } + } + + } + + // if no intersecting containers found, return + if(!innermostContainer) { + return; + } + + // move the item into the container if it's not there already + if(this.containers.length === 1) { + if (!this.containers[innermostIndex].containerCache.over) { + this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); + this.containers[innermostIndex].containerCache.over = 1; + } + } else { + + //When entering a new container, we will find the item with the least distance and append our item near it + dist = 10000; + itemWithLeastDistance = null; + floating = innermostContainer.floating || this._isFloating(this.currentItem); + posProperty = floating ? "left" : "top"; + sizeProperty = floating ? "width" : "height"; + axis = floating ? "clientX" : "clientY"; + + for (j = this.items.length - 1; j >= 0; j--) { + if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) { + continue; + } + if(this.items[j].item[0] === this.currentItem[0]) { + continue; + } + + cur = this.items[j].item.offset()[posProperty]; + nearBottom = false; + if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) { + nearBottom = true; + } + + if ( Math.abs( event[ axis ] - cur ) < dist ) { + dist = Math.abs( event[ axis ] - cur ); + itemWithLeastDistance = this.items[ j ]; + this.direction = nearBottom ? "up": "down"; + } + } + + //Check if dropOnEmpty is enabled + if(!itemWithLeastDistance && !this.options.dropOnEmpty) { + return; + } + + if(this.currentContainer === this.containers[innermostIndex]) { + if ( !this.currentContainer.containerCache.over ) { + this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() ); + this.currentContainer.containerCache.over = 1; + } + return; + } + + itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true); + this._trigger("change", event, this._uiHash()); + this.containers[innermostIndex]._trigger("change", event, this._uiHash(this)); + this.currentContainer = this.containers[innermostIndex]; + + //Update the placeholder + this.options.placeholder.update(this.currentContainer, this.placeholder); + + this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); + this.containers[innermostIndex].containerCache.over = 1; + } + + + }, + + _createHelper: function(event) { + + var o = this.options, + helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === "clone" ? this.currentItem.clone() : this.currentItem); + + //Add the helper to the DOM if that didn't happen already + if(!helper.parents("body").length) { + $(o.appendTo !== "parent" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]); + } + + if(helper[0] === this.currentItem[0]) { + this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") }; + } + + if(!helper[0].style.width || o.forceHelperSize) { + helper.width(this.currentItem.width()); + } + if(!helper[0].style.height || o.forceHelperSize) { + helper.height(this.currentItem.height()); + } + + return helper; + + }, + + _adjustOffsetFromHelper: function(obj) { + if (typeof obj === "string") { + obj = obj.split(" "); + } + if ($.isArray(obj)) { + obj = {left: +obj[0], top: +obj[1] || 0}; + } + if ("left" in obj) { + this.offset.click.left = obj.left + this.margins.left; + } + if ("right" in obj) { + this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; + } + if ("top" in obj) { + this.offset.click.top = obj.top + this.margins.top; + } + if ("bottom" in obj) { + this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; + } + }, + + _getParentOffset: function() { + + + //Get the offsetParent and cache its position + this.offsetParent = this.helper.offsetParent(); + var po = this.offsetParent.offset(); + + // This is a special case where we need to modify a offset calculated on start, since the following happened: + // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent + // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that + // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag + if(this.cssPosition === "absolute" && this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) { + po.left += this.scrollParent.scrollLeft(); + po.top += this.scrollParent.scrollTop(); + } + + // This needs to be actually done for all browsers, since pageX/pageY includes this information + // with an ugly IE fix + if( this.offsetParent[0] === this.document[0].body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) { + po = { top: 0, left: 0 }; + } + + return { + top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0), + left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0) + }; + + }, + + _getRelativeOffset: function() { + + if(this.cssPosition === "relative") { + var p = this.currentItem.position(); + return { + top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(), + left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft() + }; + } else { + return { top: 0, left: 0 }; + } + + }, + + _cacheMargins: function() { + this.margins = { + left: (parseInt(this.currentItem.css("marginLeft"),10) || 0), + top: (parseInt(this.currentItem.css("marginTop"),10) || 0) + }; + }, + + _cacheHelperProportions: function() { + this.helperProportions = { + width: this.helper.outerWidth(), + height: this.helper.outerHeight() + }; + }, + + _setContainment: function() { + + var ce, co, over, + o = this.options; + if(o.containment === "parent") { + o.containment = this.helper[0].parentNode; + } + if(o.containment === "document" || o.containment === "window") { + this.containment = [ + 0 - this.offset.relative.left - this.offset.parent.left, + 0 - this.offset.relative.top - this.offset.parent.top, + o.containment === "document" ? this.document.width() : this.window.width() - this.helperProportions.width - this.margins.left, + (o.containment === "document" ? this.document.width() : this.window.height() || this.document[0].body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top + ]; + } + + if(!(/^(document|window|parent)$/).test(o.containment)) { + ce = $(o.containment)[0]; + co = $(o.containment).offset(); + over = ($(ce).css("overflow") !== "hidden"); + + this.containment = [ + co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left, + co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top, + co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left, + co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top + ]; + } + + }, + + _convertPositionTo: function(d, pos) { + + if(!pos) { + pos = this.position; + } + var mod = d === "absolute" ? 1 : -1, + scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, + scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); + + return { + top: ( + pos.top + // The absolute mouse position + this.offset.relative.top * mod + // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.top * mod - // The offsetParent's offset without borders (offset + border) + ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod) + ), + left: ( + pos.left + // The absolute mouse position + this.offset.relative.left * mod + // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.left * mod - // The offsetParent's offset without borders (offset + border) + ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod) + ) + }; + + }, + + _generatePosition: function(event) { + + var top, left, + o = this.options, + pageX = event.pageX, + pageY = event.pageY, + scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); + + // This is another very weird special case that only happens for relative elements: + // 1. If the css position is relative + // 2. and the scroll parent is the document or similar to the offset parent + // we have to refresh the relative offset during the scroll so there are no jumps + if(this.cssPosition === "relative" && !(this.scrollParent[0] !== this.document[0] && this.scrollParent[0] !== this.offsetParent[0])) { + this.offset.relative = this._getRelativeOffset(); + } + + /* + * - Position constraining - + * Constrain the position to a mix of grid, containment. + */ + + if(this.originalPosition) { //If we are not dragging yet, we won't check for options + + if(this.containment) { + if(event.pageX - this.offset.click.left < this.containment[0]) { + pageX = this.containment[0] + this.offset.click.left; + } + if(event.pageY - this.offset.click.top < this.containment[1]) { + pageY = this.containment[1] + this.offset.click.top; + } + if(event.pageX - this.offset.click.left > this.containment[2]) { + pageX = this.containment[2] + this.offset.click.left; + } + if(event.pageY - this.offset.click.top > this.containment[3]) { + pageY = this.containment[3] + this.offset.click.top; + } + } + + if(o.grid) { + top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1]; + pageY = this.containment ? ( (top - this.offset.click.top >= this.containment[1] && top - this.offset.click.top <= this.containment[3]) ? top : ((top - this.offset.click.top >= this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top; + + left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0]; + pageX = this.containment ? ( (left - this.offset.click.left >= this.containment[0] && left - this.offset.click.left <= this.containment[2]) ? left : ((left - this.offset.click.left >= this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left; + } + + } + + return { + top: ( + pageY - // The absolute mouse position + this.offset.click.top - // Click offset (relative to the element) + this.offset.relative.top - // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.top + // The offsetParent's offset without borders (offset + border) + ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) )) + ), + left: ( + pageX - // The absolute mouse position + this.offset.click.left - // Click offset (relative to the element) + this.offset.relative.left - // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.left + // The offsetParent's offset without borders (offset + border) + ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() )) + ) + }; + + }, + + _rearrange: function(event, i, a, hardRefresh) { + + a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === "down" ? i.item[0] : i.item[0].nextSibling)); + + //Various things done here to improve the performance: + // 1. we create a setTimeout, that calls refreshPositions + // 2. on the instance, we have a counter variable, that get's higher after every append + // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same + // 4. this lets only the last addition to the timeout stack through + this.counter = this.counter ? ++this.counter : 1; + var counter = this.counter; + + this._delay(function() { + if(counter === this.counter) { + this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove + } + }); + + }, + + _clear: function(event, noPropagation) { + + this.reverting = false; + // We delay all events that have to be triggered to after the point where the placeholder has been removed and + // everything else normalized again + var i, + delayedTriggers = []; + + // We first have to update the dom position of the actual currentItem + // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088) + if(!this._noFinalSort && this.currentItem.parent().length) { + this.placeholder.before(this.currentItem); + } + this._noFinalSort = null; + + if(this.helper[0] === this.currentItem[0]) { + for(i in this._storedCSS) { + if(this._storedCSS[i] === "auto" || this._storedCSS[i] === "static") { + this._storedCSS[i] = ""; + } + } + this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"); + } else { + this.currentItem.show(); + } + + if(this.fromOutside && !noPropagation) { + delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); }); + } + if((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) { + delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed + } + + // Check if the items Container has Changed and trigger appropriate + // events. + if (this !== this.currentContainer) { + if(!noPropagation) { + delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); }); + delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); }; }).call(this, this.currentContainer)); + delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this)); }; }).call(this, this.currentContainer)); + } + } + + + //Post events to containers + function delayEvent( type, instance, container ) { + return function( event ) { + container._trigger( type, event, instance._uiHash( instance ) ); + }; + } + for (i = this.containers.length - 1; i >= 0; i--){ + if (!noPropagation) { + delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) ); + } + if(this.containers[i].containerCache.over) { + delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) ); + this.containers[i].containerCache.over = 0; + } + } + + //Do what was originally in plugins + if ( this.storedCursor ) { + this.document.find( "body" ).css( "cursor", this.storedCursor ); + this.storedStylesheet.remove(); + } + if(this._storedOpacity) { + this.helper.css("opacity", this._storedOpacity); + } + if(this._storedZIndex) { + this.helper.css("zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex); + } + + this.dragging = false; + + if(!noPropagation) { + this._trigger("beforeStop", event, this._uiHash()); + } + + //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node! + this.placeholder[0].parentNode.removeChild(this.placeholder[0]); + + if ( !this.cancelHelperRemoval ) { + if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) { + this.helper.remove(); + } + this.helper = null; + } + + if(!noPropagation) { + for (i=0; i < delayedTriggers.length; i++) { + delayedTriggers[i].call(this, event); + } //Trigger all delayed events + this._trigger("stop", event, this._uiHash()); + } + + this.fromOutside = false; + return !this.cancelHelperRemoval; + + }, + + _trigger: function() { + if ($.Widget.prototype._trigger.apply(this, arguments) === false) { + this.cancel(); + } + }, + + _uiHash: function(_inst) { + var inst = _inst || this; + return { + helper: inst.helper, + placeholder: inst.placeholder || $([]), + position: inst.position, + originalPosition: inst.originalPosition, + offset: inst.positionAbs, + item: inst.currentItem, + sender: _inst ? _inst.element : null + }; + } + +}); + + +/*! + * jQuery UI Spinner 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/spinner/ + */ + + +function spinner_modifier( fn ) { + return function() { + var previous = this.element.val(); + fn.apply( this, arguments ); + this._refresh(); + if ( previous !== this.element.val() ) { + this._trigger( "change" ); + } + }; +} + +var spinner = $.widget( "ui.spinner", { + version: "1.11.4", + defaultElement: "<input>", + widgetEventPrefix: "spin", + options: { + culture: null, + icons: { + down: "ui-icon-triangle-1-s", + up: "ui-icon-triangle-1-n" + }, + incremental: true, + max: null, + min: null, + numberFormat: null, + page: 10, + step: 1, + + change: null, + spin: null, + start: null, + stop: null + }, + + _create: function() { + // handle string values that need to be parsed + this._setOption( "max", this.options.max ); + this._setOption( "min", this.options.min ); + this._setOption( "step", this.options.step ); + + // Only format if there is a value, prevents the field from being marked + // as invalid in Firefox, see #9573. + if ( this.value() !== "" ) { + // Format the value, but don't constrain. + this._value( this.element.val(), true ); + } + + this._draw(); + this._on( this._events ); + this._refresh(); + + // turning off autocomplete prevents the browser from remembering the + // value when navigating through history, so we re-enable autocomplete + // if the page is unloaded before the widget is destroyed. #7790 + this._on( this.window, { + beforeunload: function() { + this.element.removeAttr( "autocomplete" ); + } + }); + }, + + _getCreateOptions: function() { + var options = {}, + element = this.element; + + $.each( [ "min", "max", "step" ], function( i, option ) { + var value = element.attr( option ); + if ( value !== undefined && value.length ) { + options[ option ] = value; + } + }); + + return options; + }, + + _events: { + keydown: function( event ) { + if ( this._start( event ) && this._keydown( event ) ) { + event.preventDefault(); + } + }, + keyup: "_stop", + focus: function() { + this.previous = this.element.val(); + }, + blur: function( event ) { + if ( this.cancelBlur ) { + delete this.cancelBlur; + return; + } + + this._stop(); + this._refresh(); + if ( this.previous !== this.element.val() ) { + this._trigger( "change", event ); + } + }, + mousewheel: function( event, delta ) { + if ( !delta ) { + return; + } + if ( !this.spinning && !this._start( event ) ) { + return false; + } + + this._spin( (delta > 0 ? 1 : -1) * this.options.step, event ); + clearTimeout( this.mousewheelTimer ); + this.mousewheelTimer = this._delay(function() { + if ( this.spinning ) { + this._stop( event ); + } + }, 100 ); + event.preventDefault(); + }, + "mousedown .ui-spinner-button": function( event ) { + var previous; + + // We never want the buttons to have focus; whenever the user is + // interacting with the spinner, the focus should be on the input. + // If the input is focused then this.previous is properly set from + // when the input first received focus. If the input is not focused + // then we need to set this.previous based on the value before spinning. + previous = this.element[0] === this.document[0].activeElement ? + this.previous : this.element.val(); + function checkFocus() { + var isActive = this.element[0] === this.document[0].activeElement; + if ( !isActive ) { + this.element.focus(); + this.previous = previous; + // support: IE + // IE sets focus asynchronously, so we need to check if focus + // moved off of the input because the user clicked on the button. + this._delay(function() { + this.previous = previous; + }); + } + } + + // ensure focus is on (or stays on) the text field + event.preventDefault(); + checkFocus.call( this ); + + // support: IE + // IE doesn't prevent moving focus even with event.preventDefault() + // so we set a flag to know when we should ignore the blur event + // and check (again) if focus moved off of the input. + this.cancelBlur = true; + this._delay(function() { + delete this.cancelBlur; + checkFocus.call( this ); + }); + + if ( this._start( event ) === false ) { + return; + } + + this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event ); + }, + "mouseup .ui-spinner-button": "_stop", + "mouseenter .ui-spinner-button": function( event ) { + // button will add ui-state-active if mouse was down while mouseleave and kept down + if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) { + return; + } + + if ( this._start( event ) === false ) { + return false; + } + this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event ); + }, + // TODO: do we really want to consider this a stop? + // shouldn't we just stop the repeater and wait until mouseup before + // we trigger the stop event? + "mouseleave .ui-spinner-button": "_stop" + }, + + _draw: function() { + var uiSpinner = this.uiSpinner = this.element + .addClass( "ui-spinner-input" ) + .attr( "autocomplete", "off" ) + .wrap( this._uiSpinnerHtml() ) + .parent() + // add buttons + .append( this._buttonHtml() ); + + this.element.attr( "role", "spinbutton" ); + + // button bindings + this.buttons = uiSpinner.find( ".ui-spinner-button" ) + .attr( "tabIndex", -1 ) + .button() + .removeClass( "ui-corner-all" ); + + // IE 6 doesn't understand height: 50% for the buttons + // unless the wrapper has an explicit height + if ( this.buttons.height() > Math.ceil( uiSpinner.height() * 0.5 ) && + uiSpinner.height() > 0 ) { + uiSpinner.height( uiSpinner.height() ); + } + + // disable spinner if element was already disabled + if ( this.options.disabled ) { + this.disable(); + } + }, + + _keydown: function( event ) { + var options = this.options, + keyCode = $.ui.keyCode; + + switch ( event.keyCode ) { + case keyCode.UP: + this._repeat( null, 1, event ); + return true; + case keyCode.DOWN: + this._repeat( null, -1, event ); + return true; + case keyCode.PAGE_UP: + this._repeat( null, options.page, event ); + return true; + case keyCode.PAGE_DOWN: + this._repeat( null, -options.page, event ); + return true; + } + + return false; + }, + + _uiSpinnerHtml: function() { + return "<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>"; + }, + + _buttonHtml: function() { + return "" + + "<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>" + + "<span class='ui-icon " + this.options.icons.up + "'>&#9650;</span>" + + "</a>" + + "<a class='ui-spinner-button ui-spinner-down ui-corner-br'>" + + "<span class='ui-icon " + this.options.icons.down + "'>&#9660;</span>" + + "</a>"; + }, + + _start: function( event ) { + if ( !this.spinning && this._trigger( "start", event ) === false ) { + return false; + } + + if ( !this.counter ) { + this.counter = 1; + } + this.spinning = true; + return true; + }, + + _repeat: function( i, steps, event ) { + i = i || 500; + + clearTimeout( this.timer ); + this.timer = this._delay(function() { + this._repeat( 40, steps, event ); + }, i ); + + this._spin( steps * this.options.step, event ); + }, + + _spin: function( step, event ) { + var value = this.value() || 0; + + if ( !this.counter ) { + this.counter = 1; + } + + value = this._adjustValue( value + step * this._increment( this.counter ) ); + + if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false) { + this._value( value ); + this.counter++; + } + }, + + _increment: function( i ) { + var incremental = this.options.incremental; + + if ( incremental ) { + return $.isFunction( incremental ) ? + incremental( i ) : + Math.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 ); + } + + return 1; + }, + + _precision: function() { + var precision = this._precisionOf( this.options.step ); + if ( this.options.min !== null ) { + precision = Math.max( precision, this._precisionOf( this.options.min ) ); + } + return precision; + }, + + _precisionOf: function( num ) { + var str = num.toString(), + decimal = str.indexOf( "." ); + return decimal === -1 ? 0 : str.length - decimal - 1; + }, + + _adjustValue: function( value ) { + var base, aboveMin, + options = this.options; + + // make sure we're at a valid step + // - find out where we are relative to the base (min or 0) + base = options.min !== null ? options.min : 0; + aboveMin = value - base; + // - round to the nearest step + aboveMin = Math.round(aboveMin / options.step) * options.step; + // - rounding is based on 0, so adjust back to our base + value = base + aboveMin; + + // fix precision from bad JS floating point math + value = parseFloat( value.toFixed( this._precision() ) ); + + // clamp the value + if ( options.max !== null && value > options.max) { + return options.max; + } + if ( options.min !== null && value < options.min ) { + return options.min; + } + + return value; + }, + + _stop: function( event ) { + if ( !this.spinning ) { + return; + } + + clearTimeout( this.timer ); + clearTimeout( this.mousewheelTimer ); + this.counter = 0; + this.spinning = false; + this._trigger( "stop", event ); + }, + + _setOption: function( key, value ) { + if ( key === "culture" || key === "numberFormat" ) { + var prevValue = this._parse( this.element.val() ); + this.options[ key ] = value; + this.element.val( this._format( prevValue ) ); + return; + } + + if ( key === "max" || key === "min" || key === "step" ) { + if ( typeof value === "string" ) { + value = this._parse( value ); + } + } + if ( key === "icons" ) { + this.buttons.first().find( ".ui-icon" ) + .removeClass( this.options.icons.up ) + .addClass( value.up ); + this.buttons.last().find( ".ui-icon" ) + .removeClass( this.options.icons.down ) + .addClass( value.down ); + } + + this._super( key, value ); + + if ( key === "disabled" ) { + this.widget().toggleClass( "ui-state-disabled", !!value ); + this.element.prop( "disabled", !!value ); + this.buttons.button( value ? "disable" : "enable" ); + } + }, + + _setOptions: spinner_modifier(function( options ) { + this._super( options ); + }), + + _parse: function( val ) { + if ( typeof val === "string" && val !== "" ) { + val = window.Globalize && this.options.numberFormat ? + Globalize.parseFloat( val, 10, this.options.culture ) : +val; + } + return val === "" || isNaN( val ) ? null : val; + }, + + _format: function( value ) { + if ( value === "" ) { + return ""; + } + return window.Globalize && this.options.numberFormat ? + Globalize.format( value, this.options.numberFormat, this.options.culture ) : + value; + }, + + _refresh: function() { + this.element.attr({ + "aria-valuemin": this.options.min, + "aria-valuemax": this.options.max, + // TODO: what should we do with values that can't be parsed? + "aria-valuenow": this._parse( this.element.val() ) + }); + }, + + isValid: function() { + var value = this.value(); + + // null is invalid + if ( value === null ) { + return false; + } + + // if value gets adjusted, it's invalid + return value === this._adjustValue( value ); + }, + + // update the value without triggering change + _value: function( value, allowAny ) { + var parsed; + if ( value !== "" ) { + parsed = this._parse( value ); + if ( parsed !== null ) { + if ( !allowAny ) { + parsed = this._adjustValue( parsed ); + } + value = this._format( parsed ); + } + } + this.element.val( value ); + this._refresh(); + }, + + _destroy: function() { + this.element + .removeClass( "ui-spinner-input" ) + .prop( "disabled", false ) + .removeAttr( "autocomplete" ) + .removeAttr( "role" ) + .removeAttr( "aria-valuemin" ) + .removeAttr( "aria-valuemax" ) + .removeAttr( "aria-valuenow" ); + this.uiSpinner.replaceWith( this.element ); + }, + + stepUp: spinner_modifier(function( steps ) { + this._stepUp( steps ); + }), + _stepUp: function( steps ) { + if ( this._start() ) { + this._spin( (steps || 1) * this.options.step ); + this._stop(); + } + }, + + stepDown: spinner_modifier(function( steps ) { + this._stepDown( steps ); + }), + _stepDown: function( steps ) { + if ( this._start() ) { + this._spin( (steps || 1) * -this.options.step ); + this._stop(); + } + }, + + pageUp: spinner_modifier(function( pages ) { + this._stepUp( (pages || 1) * this.options.page ); + }), + + pageDown: spinner_modifier(function( pages ) { + this._stepDown( (pages || 1) * this.options.page ); + }), + + value: function( newVal ) { + if ( !arguments.length ) { + return this._parse( this.element.val() ); + } + spinner_modifier( this._value ).call( this, newVal ); + }, + + widget: function() { + return this.uiSpinner; + } +}); + + +/*! + * jQuery UI Tabs 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/tabs/ + */ + + +var tabs = $.widget( "ui.tabs", { + version: "1.11.4", + delay: 300, + options: { + active: null, + collapsible: false, + event: "click", + heightStyle: "content", + hide: null, + show: null, + + // callbacks + activate: null, + beforeActivate: null, + beforeLoad: null, + load: null + }, + + _isLocal: (function() { + var rhash = /#.*$/; + + return function( anchor ) { + var anchorUrl, locationUrl; + + // support: IE7 + // IE7 doesn't normalize the href property when set via script (#9317) + anchor = anchor.cloneNode( false ); + + anchorUrl = anchor.href.replace( rhash, "" ); + locationUrl = location.href.replace( rhash, "" ); + + // decoding may throw an error if the URL isn't UTF-8 (#9518) + try { + anchorUrl = decodeURIComponent( anchorUrl ); + } catch ( error ) {} + try { + locationUrl = decodeURIComponent( locationUrl ); + } catch ( error ) {} + + return anchor.hash.length > 1 && anchorUrl === locationUrl; + }; + })(), + + _create: function() { + var that = this, + options = this.options; + + this.running = false; + + this.element + .addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" ) + .toggleClass( "ui-tabs-collapsible", options.collapsible ); + + this._processTabs(); + options.active = this._initialActive(); + + // Take disabling tabs via class attribute from HTML + // into account and update option properly. + if ( $.isArray( options.disabled ) ) { + options.disabled = $.unique( options.disabled.concat( + $.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) { + return that.tabs.index( li ); + }) + ) ).sort(); + } + + // check for length avoids error when initializing empty list + if ( this.options.active !== false && this.anchors.length ) { + this.active = this._findActive( options.active ); + } else { + this.active = $(); + } + + this._refresh(); + + if ( this.active.length ) { + this.load( options.active ); + } + }, + + _initialActive: function() { + var active = this.options.active, + collapsible = this.options.collapsible, + locationHash = location.hash.substring( 1 ); + + if ( active === null ) { + // check the fragment identifier in the URL + if ( locationHash ) { + this.tabs.each(function( i, tab ) { + if ( $( tab ).attr( "aria-controls" ) === locationHash ) { + active = i; + return false; + } + }); + } + + // check for a tab marked active via a class + if ( active === null ) { + active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) ); + } + + // no active tab, set to false + if ( active === null || active === -1 ) { + active = this.tabs.length ? 0 : false; + } + } + + // handle numbers: negative, out of range + if ( active !== false ) { + active = this.tabs.index( this.tabs.eq( active ) ); + if ( active === -1 ) { + active = collapsible ? false : 0; + } + } + + // don't allow collapsible: false and active: false + if ( !collapsible && active === false && this.anchors.length ) { + active = 0; + } + + return active; + }, + + _getCreateEventData: function() { + return { + tab: this.active, + panel: !this.active.length ? $() : this._getPanelForTab( this.active ) + }; + }, + + _tabKeydown: function( event ) { + var focusedTab = $( this.document[0].activeElement ).closest( "li" ), + selectedIndex = this.tabs.index( focusedTab ), + goingForward = true; + + if ( this._handlePageNav( event ) ) { + return; + } + + switch ( event.keyCode ) { + case $.ui.keyCode.RIGHT: + case $.ui.keyCode.DOWN: + selectedIndex++; + break; + case $.ui.keyCode.UP: + case $.ui.keyCode.LEFT: + goingForward = false; + selectedIndex--; + break; + case $.ui.keyCode.END: + selectedIndex = this.anchors.length - 1; + break; + case $.ui.keyCode.HOME: + selectedIndex = 0; + break; + case $.ui.keyCode.SPACE: + // Activate only, no collapsing + event.preventDefault(); + clearTimeout( this.activating ); + this._activate( selectedIndex ); + return; + case $.ui.keyCode.ENTER: + // Toggle (cancel delayed activation, allow collapsing) + event.preventDefault(); + clearTimeout( this.activating ); + // Determine if we should collapse or activate + this._activate( selectedIndex === this.options.active ? false : selectedIndex ); + return; + default: + return; + } + + // Focus the appropriate tab, based on which key was pressed + event.preventDefault(); + clearTimeout( this.activating ); + selectedIndex = this._focusNextTab( selectedIndex, goingForward ); + + // Navigating with control/command key will prevent automatic activation + if ( !event.ctrlKey && !event.metaKey ) { + + // Update aria-selected immediately so that AT think the tab is already selected. + // Otherwise AT may confuse the user by stating that they need to activate the tab, + // but the tab will already be activated by the time the announcement finishes. + focusedTab.attr( "aria-selected", "false" ); + this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" ); + + this.activating = this._delay(function() { + this.option( "active", selectedIndex ); + }, this.delay ); + } + }, + + _panelKeydown: function( event ) { + if ( this._handlePageNav( event ) ) { + return; + } + + // Ctrl+up moves focus to the current tab + if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) { + event.preventDefault(); + this.active.focus(); + } + }, + + // Alt+page up/down moves focus to the previous/next tab (and activates) + _handlePageNav: function( event ) { + if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) { + this._activate( this._focusNextTab( this.options.active - 1, false ) ); + return true; + } + if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) { + this._activate( this._focusNextTab( this.options.active + 1, true ) ); + return true; + } + }, + + _findNextTab: function( index, goingForward ) { + var lastTabIndex = this.tabs.length - 1; + + function constrain() { + if ( index > lastTabIndex ) { + index = 0; + } + if ( index < 0 ) { + index = lastTabIndex; + } + return index; + } + + while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) { + index = goingForward ? index + 1 : index - 1; + } + + return index; + }, + + _focusNextTab: function( index, goingForward ) { + index = this._findNextTab( index, goingForward ); + this.tabs.eq( index ).focus(); + return index; + }, + + _setOption: function( key, value ) { + if ( key === "active" ) { + // _activate() will handle invalid values and update this.options + this._activate( value ); + return; + } + + if ( key === "disabled" ) { + // don't use the widget factory's disabled handling + this._setupDisabled( value ); + return; + } + + this._super( key, value); + + if ( key === "collapsible" ) { + this.element.toggleClass( "ui-tabs-collapsible", value ); + // Setting collapsible: false while collapsed; open first panel + if ( !value && this.options.active === false ) { + this._activate( 0 ); + } + } + + if ( key === "event" ) { + this._setupEvents( value ); + } + + if ( key === "heightStyle" ) { + this._setupHeightStyle( value ); + } + }, + + _sanitizeSelector: function( hash ) { + return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : ""; + }, + + refresh: function() { + var options = this.options, + lis = this.tablist.children( ":has(a[href])" ); + + // get disabled tabs from class attribute from HTML + // this will get converted to a boolean if needed in _refresh() + options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) { + return lis.index( tab ); + }); + + this._processTabs(); + + // was collapsed or no tabs + if ( options.active === false || !this.anchors.length ) { + options.active = false; + this.active = $(); + // was active, but active tab is gone + } else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) { + // all remaining tabs are disabled + if ( this.tabs.length === options.disabled.length ) { + options.active = false; + this.active = $(); + // activate previous tab + } else { + this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) ); + } + // was active, active tab still exists + } else { + // make sure active index is correct + options.active = this.tabs.index( this.active ); + } + + this._refresh(); + }, + + _refresh: function() { + this._setupDisabled( this.options.disabled ); + this._setupEvents( this.options.event ); + this._setupHeightStyle( this.options.heightStyle ); + + this.tabs.not( this.active ).attr({ + "aria-selected": "false", + "aria-expanded": "false", + tabIndex: -1 + }); + this.panels.not( this._getPanelForTab( this.active ) ) + .hide() + .attr({ + "aria-hidden": "true" + }); + + // Make sure one tab is in the tab order + if ( !this.active.length ) { + this.tabs.eq( 0 ).attr( "tabIndex", 0 ); + } else { + this.active + .addClass( "ui-tabs-active ui-state-active" ) + .attr({ + "aria-selected": "true", + "aria-expanded": "true", + tabIndex: 0 + }); + this._getPanelForTab( this.active ) + .show() + .attr({ + "aria-hidden": "false" + }); + } + }, + + _processTabs: function() { + var that = this, + prevTabs = this.tabs, + prevAnchors = this.anchors, + prevPanels = this.panels; + + this.tablist = this._getList() + .addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" ) + .attr( "role", "tablist" ) + + // Prevent users from focusing disabled tabs via click + .delegate( "> li", "mousedown" + this.eventNamespace, function( event ) { + if ( $( this ).is( ".ui-state-disabled" ) ) { + event.preventDefault(); + } + }) + + // support: IE <9 + // Preventing the default action in mousedown doesn't prevent IE + // from focusing the element, so if the anchor gets focused, blur. + // We don't have to worry about focusing the previously focused + // element since clicking on a non-focusable element should focus + // the body anyway. + .delegate( ".ui-tabs-anchor", "focus" + this.eventNamespace, function() { + if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) { + this.blur(); + } + }); + + this.tabs = this.tablist.find( "> li:has(a[href])" ) + .addClass( "ui-state-default ui-corner-top" ) + .attr({ + role: "tab", + tabIndex: -1 + }); + + this.anchors = this.tabs.map(function() { + return $( "a", this )[ 0 ]; + }) + .addClass( "ui-tabs-anchor" ) + .attr({ + role: "presentation", + tabIndex: -1 + }); + + this.panels = $(); + + this.anchors.each(function( i, anchor ) { + var selector, panel, panelId, + anchorId = $( anchor ).uniqueId().attr( "id" ), + tab = $( anchor ).closest( "li" ), + originalAriaControls = tab.attr( "aria-controls" ); + + // inline tab + if ( that._isLocal( anchor ) ) { + selector = anchor.hash; + panelId = selector.substring( 1 ); + panel = that.element.find( that._sanitizeSelector( selector ) ); + // remote tab + } else { + // If the tab doesn't already have aria-controls, + // generate an id by using a throw-away element + panelId = tab.attr( "aria-controls" ) || $( {} ).uniqueId()[ 0 ].id; + selector = "#" + panelId; + panel = that.element.find( selector ); + if ( !panel.length ) { + panel = that._createPanel( panelId ); + panel.insertAfter( that.panels[ i - 1 ] || that.tablist ); + } + panel.attr( "aria-live", "polite" ); + } + + if ( panel.length) { + that.panels = that.panels.add( panel ); + } + if ( originalAriaControls ) { + tab.data( "ui-tabs-aria-controls", originalAriaControls ); + } + tab.attr({ + "aria-controls": panelId, + "aria-labelledby": anchorId + }); + panel.attr( "aria-labelledby", anchorId ); + }); + + this.panels + .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" ) + .attr( "role", "tabpanel" ); + + // Avoid memory leaks (#10056) + if ( prevTabs ) { + this._off( prevTabs.not( this.tabs ) ); + this._off( prevAnchors.not( this.anchors ) ); + this._off( prevPanels.not( this.panels ) ); + } + }, + + // allow overriding how to find the list for rare usage scenarios (#7715) + _getList: function() { + return this.tablist || this.element.find( "ol,ul" ).eq( 0 ); + }, + + _createPanel: function( id ) { + return $( "<div>" ) + .attr( "id", id ) + .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" ) + .data( "ui-tabs-destroy", true ); + }, + + _setupDisabled: function( disabled ) { + if ( $.isArray( disabled ) ) { + if ( !disabled.length ) { + disabled = false; + } else if ( disabled.length === this.anchors.length ) { + disabled = true; + } + } + + // disable tabs + for ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) { + if ( disabled === true || $.inArray( i, disabled ) !== -1 ) { + $( li ) + .addClass( "ui-state-disabled" ) + .attr( "aria-disabled", "true" ); + } else { + $( li ) + .removeClass( "ui-state-disabled" ) + .removeAttr( "aria-disabled" ); + } + } + + this.options.disabled = disabled; + }, + + _setupEvents: function( event ) { + var events = {}; + if ( event ) { + $.each( event.split(" "), function( index, eventName ) { + events[ eventName ] = "_eventHandler"; + }); + } + + this._off( this.anchors.add( this.tabs ).add( this.panels ) ); + // Always prevent the default action, even when disabled + this._on( true, this.anchors, { + click: function( event ) { + event.preventDefault(); + } + }); + this._on( this.anchors, events ); + this._on( this.tabs, { keydown: "_tabKeydown" } ); + this._on( this.panels, { keydown: "_panelKeydown" } ); + + this._focusable( this.tabs ); + this._hoverable( this.tabs ); + }, + + _setupHeightStyle: function( heightStyle ) { + var maxHeight, + parent = this.element.parent(); + + if ( heightStyle === "fill" ) { + maxHeight = parent.height(); + maxHeight -= this.element.outerHeight() - this.element.height(); + + this.element.siblings( ":visible" ).each(function() { + var elem = $( this ), + position = elem.css( "position" ); + + if ( position === "absolute" || position === "fixed" ) { + return; + } + maxHeight -= elem.outerHeight( true ); + }); + + this.element.children().not( this.panels ).each(function() { + maxHeight -= $( this ).outerHeight( true ); + }); + + this.panels.each(function() { + $( this ).height( Math.max( 0, maxHeight - + $( this ).innerHeight() + $( this ).height() ) ); + }) + .css( "overflow", "auto" ); + } else if ( heightStyle === "auto" ) { + maxHeight = 0; + this.panels.each(function() { + maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() ); + }).height( maxHeight ); + } + }, + + _eventHandler: function( event ) { + var options = this.options, + active = this.active, + anchor = $( event.currentTarget ), + tab = anchor.closest( "li" ), + clickedIsActive = tab[ 0 ] === active[ 0 ], + collapsing = clickedIsActive && options.collapsible, + toShow = collapsing ? $() : this._getPanelForTab( tab ), + toHide = !active.length ? $() : this._getPanelForTab( active ), + eventData = { + oldTab: active, + oldPanel: toHide, + newTab: collapsing ? $() : tab, + newPanel: toShow + }; + + event.preventDefault(); + + if ( tab.hasClass( "ui-state-disabled" ) || + // tab is already loading + tab.hasClass( "ui-tabs-loading" ) || + // can't switch durning an animation + this.running || + // click on active header, but not collapsible + ( clickedIsActive && !options.collapsible ) || + // allow canceling activation + ( this._trigger( "beforeActivate", event, eventData ) === false ) ) { + return; + } + + options.active = collapsing ? false : this.tabs.index( tab ); + + this.active = clickedIsActive ? $() : tab; + if ( this.xhr ) { + this.xhr.abort(); + } + + if ( !toHide.length && !toShow.length ) { + $.error( "jQuery UI Tabs: Mismatching fragment identifier." ); + } + + if ( toShow.length ) { + this.load( this.tabs.index( tab ), event ); + } + this._toggle( event, eventData ); + }, + + // handles show/hide for selecting tabs + _toggle: function( event, eventData ) { + var that = this, + toShow = eventData.newPanel, + toHide = eventData.oldPanel; + + this.running = true; + + function complete() { + that.running = false; + that._trigger( "activate", event, eventData ); + } + + function show() { + eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" ); + + if ( toShow.length && that.options.show ) { + that._show( toShow, that.options.show, complete ); + } else { + toShow.show(); + complete(); + } + } + + // start out by hiding, then showing, then completing + if ( toHide.length && this.options.hide ) { + this._hide( toHide, this.options.hide, function() { + eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" ); + show(); + }); + } else { + eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" ); + toHide.hide(); + show(); + } + + toHide.attr( "aria-hidden", "true" ); + eventData.oldTab.attr({ + "aria-selected": "false", + "aria-expanded": "false" + }); + // If we're switching tabs, remove the old tab from the tab order. + // If we're opening from collapsed state, remove the previous tab from the tab order. + // If we're collapsing, then keep the collapsing tab in the tab order. + if ( toShow.length && toHide.length ) { + eventData.oldTab.attr( "tabIndex", -1 ); + } else if ( toShow.length ) { + this.tabs.filter(function() { + return $( this ).attr( "tabIndex" ) === 0; + }) + .attr( "tabIndex", -1 ); + } + + toShow.attr( "aria-hidden", "false" ); + eventData.newTab.attr({ + "aria-selected": "true", + "aria-expanded": "true", + tabIndex: 0 + }); + }, + + _activate: function( index ) { + var anchor, + active = this._findActive( index ); + + // trying to activate the already active panel + if ( active[ 0 ] === this.active[ 0 ] ) { + return; + } + + // trying to collapse, simulate a click on the current active header + if ( !active.length ) { + active = this.active; + } + + anchor = active.find( ".ui-tabs-anchor" )[ 0 ]; + this._eventHandler({ + target: anchor, + currentTarget: anchor, + preventDefault: $.noop + }); + }, + + _findActive: function( index ) { + return index === false ? $() : this.tabs.eq( index ); + }, + + _getIndex: function( index ) { + // meta-function to give users option to provide a href string instead of a numerical index. + if ( typeof index === "string" ) { + index = this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) ); + } + + return index; + }, + + _destroy: function() { + if ( this.xhr ) { + this.xhr.abort(); + } + + this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" ); + + this.tablist + .removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" ) + .removeAttr( "role" ); + + this.anchors + .removeClass( "ui-tabs-anchor" ) + .removeAttr( "role" ) + .removeAttr( "tabIndex" ) + .removeUniqueId(); + + this.tablist.unbind( this.eventNamespace ); + + this.tabs.add( this.panels ).each(function() { + if ( $.data( this, "ui-tabs-destroy" ) ) { + $( this ).remove(); + } else { + $( this ) + .removeClass( "ui-state-default ui-state-active ui-state-disabled " + + "ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel" ) + .removeAttr( "tabIndex" ) + .removeAttr( "aria-live" ) + .removeAttr( "aria-busy" ) + .removeAttr( "aria-selected" ) + .removeAttr( "aria-labelledby" ) + .removeAttr( "aria-hidden" ) + .removeAttr( "aria-expanded" ) + .removeAttr( "role" ); + } + }); + + this.tabs.each(function() { + var li = $( this ), + prev = li.data( "ui-tabs-aria-controls" ); + if ( prev ) { + li + .attr( "aria-controls", prev ) + .removeData( "ui-tabs-aria-controls" ); + } else { + li.removeAttr( "aria-controls" ); + } + }); + + this.panels.show(); + + if ( this.options.heightStyle !== "content" ) { + this.panels.css( "height", "" ); + } + }, + + enable: function( index ) { + var disabled = this.options.disabled; + if ( disabled === false ) { + return; + } + + if ( index === undefined ) { + disabled = false; + } else { + index = this._getIndex( index ); + if ( $.isArray( disabled ) ) { + disabled = $.map( disabled, function( num ) { + return num !== index ? num : null; + }); + } else { + disabled = $.map( this.tabs, function( li, num ) { + return num !== index ? num : null; + }); + } + } + this._setupDisabled( disabled ); + }, + + disable: function( index ) { + var disabled = this.options.disabled; + if ( disabled === true ) { + return; + } + + if ( index === undefined ) { + disabled = true; + } else { + index = this._getIndex( index ); + if ( $.inArray( index, disabled ) !== -1 ) { + return; + } + if ( $.isArray( disabled ) ) { + disabled = $.merge( [ index ], disabled ).sort(); + } else { + disabled = [ index ]; + } + } + this._setupDisabled( disabled ); + }, + + load: function( index, event ) { + index = this._getIndex( index ); + var that = this, + tab = this.tabs.eq( index ), + anchor = tab.find( ".ui-tabs-anchor" ), + panel = this._getPanelForTab( tab ), + eventData = { + tab: tab, + panel: panel + }, + complete = function( jqXHR, status ) { + if ( status === "abort" ) { + that.panels.stop( false, true ); + } + + tab.removeClass( "ui-tabs-loading" ); + panel.removeAttr( "aria-busy" ); + + if ( jqXHR === that.xhr ) { + delete that.xhr; + } + }; + + // not remote + if ( this._isLocal( anchor[ 0 ] ) ) { + return; + } + + this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) ); + + // support: jQuery <1.8 + // jQuery <1.8 returns false if the request is canceled in beforeSend, + // but as of 1.8, $.ajax() always returns a jqXHR object. + if ( this.xhr && this.xhr.statusText !== "canceled" ) { + tab.addClass( "ui-tabs-loading" ); + panel.attr( "aria-busy", "true" ); + + this.xhr + .done(function( response, status, jqXHR ) { + // support: jQuery <1.8 + // http://bugs.jquery.com/ticket/11778 + setTimeout(function() { + panel.html( response ); + that._trigger( "load", event, eventData ); + + complete( jqXHR, status ); + }, 1 ); + }) + .fail(function( jqXHR, status ) { + // support: jQuery <1.8 + // http://bugs.jquery.com/ticket/11778 + setTimeout(function() { + complete( jqXHR, status ); + }, 1 ); + }); + } + }, + + _ajaxSettings: function( anchor, event, eventData ) { + var that = this; + return { + url: anchor.attr( "href" ), + beforeSend: function( jqXHR, settings ) { + return that._trigger( "beforeLoad", event, + $.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) ); + } + }; + }, + + _getPanelForTab: function( tab ) { + var id = $( tab ).attr( "aria-controls" ); + return this.element.find( this._sanitizeSelector( "#" + id ) ); + } +}); + + +/*! + * jQuery UI Tooltip 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/tooltip/ + */ + + +var tooltip = $.widget( "ui.tooltip", { + version: "1.11.4", + options: { + content: function() { + // support: IE<9, Opera in jQuery <1.7 + // .text() can't accept undefined, so coerce to a string + var title = $( this ).attr( "title" ) || ""; + // Escape title, since we're going from an attribute to raw HTML + return $( "<a>" ).text( title ).html(); + }, + hide: true, + // Disabled elements have inconsistent behavior across browsers (#8661) + items: "[title]:not([disabled])", + position: { + my: "left top+15", + at: "left bottom", + collision: "flipfit flip" + }, + show: true, + tooltipClass: null, + track: false, + + // callbacks + close: null, + open: null + }, + + _addDescribedBy: function( elem, id ) { + var describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ ); + describedby.push( id ); + elem + .data( "ui-tooltip-id", id ) + .attr( "aria-describedby", $.trim( describedby.join( " " ) ) ); + }, + + _removeDescribedBy: function( elem ) { + var id = elem.data( "ui-tooltip-id" ), + describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ ), + index = $.inArray( id, describedby ); + + if ( index !== -1 ) { + describedby.splice( index, 1 ); + } + + elem.removeData( "ui-tooltip-id" ); + describedby = $.trim( describedby.join( " " ) ); + if ( describedby ) { + elem.attr( "aria-describedby", describedby ); + } else { + elem.removeAttr( "aria-describedby" ); + } + }, + + _create: function() { + this._on({ + mouseover: "open", + focusin: "open" + }); + + // IDs of generated tooltips, needed for destroy + this.tooltips = {}; + + // IDs of parent tooltips where we removed the title attribute + this.parents = {}; + + if ( this.options.disabled ) { + this._disable(); + } + + // Append the aria-live region so tooltips announce correctly + this.liveRegion = $( "<div>" ) + .attr({ + role: "log", + "aria-live": "assertive", + "aria-relevant": "additions" + }) + .addClass( "ui-helper-hidden-accessible" ) + .appendTo( this.document[ 0 ].body ); + }, + + _setOption: function( key, value ) { + var that = this; + + if ( key === "disabled" ) { + this[ value ? "_disable" : "_enable" ](); + this.options[ key ] = value; + // disable element style changes + return; + } + + this._super( key, value ); + + if ( key === "content" ) { + $.each( this.tooltips, function( id, tooltipData ) { + that._updateContent( tooltipData.element ); + }); + } + }, + + _disable: function() { + var that = this; + + // close open tooltips + $.each( this.tooltips, function( id, tooltipData ) { + var event = $.Event( "blur" ); + event.target = event.currentTarget = tooltipData.element[ 0 ]; + that.close( event, true ); + }); + + // remove title attributes to prevent native tooltips + this.element.find( this.options.items ).addBack().each(function() { + var element = $( this ); + if ( element.is( "[title]" ) ) { + element + .data( "ui-tooltip-title", element.attr( "title" ) ) + .removeAttr( "title" ); + } + }); + }, + + _enable: function() { + // restore title attributes + this.element.find( this.options.items ).addBack().each(function() { + var element = $( this ); + if ( element.data( "ui-tooltip-title" ) ) { + element.attr( "title", element.data( "ui-tooltip-title" ) ); + } + }); + }, + + open: function( event ) { + var that = this, + target = $( event ? event.target : this.element ) + // we need closest here due to mouseover bubbling, + // but always pointing at the same event target + .closest( this.options.items ); + + // No element to show a tooltip for or the tooltip is already open + if ( !target.length || target.data( "ui-tooltip-id" ) ) { + return; + } + + if ( target.attr( "title" ) ) { + target.data( "ui-tooltip-title", target.attr( "title" ) ); + } + + target.data( "ui-tooltip-open", true ); + + // kill parent tooltips, custom or native, for hover + if ( event && event.type === "mouseover" ) { + target.parents().each(function() { + var parent = $( this ), + blurEvent; + if ( parent.data( "ui-tooltip-open" ) ) { + blurEvent = $.Event( "blur" ); + blurEvent.target = blurEvent.currentTarget = this; + that.close( blurEvent, true ); + } + if ( parent.attr( "title" ) ) { + parent.uniqueId(); + that.parents[ this.id ] = { + element: this, + title: parent.attr( "title" ) + }; + parent.attr( "title", "" ); + } + }); + } + + this._registerCloseHandlers( event, target ); + this._updateContent( target, event ); + }, + + _updateContent: function( target, event ) { + var content, + contentOption = this.options.content, + that = this, + eventType = event ? event.type : null; + + if ( typeof contentOption === "string" ) { + return this._open( event, target, contentOption ); + } + + content = contentOption.call( target[0], function( response ) { + + // IE may instantly serve a cached response for ajax requests + // delay this call to _open so the other call to _open runs first + that._delay(function() { + + // Ignore async response if tooltip was closed already + if ( !target.data( "ui-tooltip-open" ) ) { + return; + } + + // jQuery creates a special event for focusin when it doesn't + // exist natively. To improve performance, the native event + // object is reused and the type is changed. Therefore, we can't + // rely on the type being correct after the event finished + // bubbling, so we set it back to the previous value. (#8740) + if ( event ) { + event.type = eventType; + } + this._open( event, target, response ); + }); + }); + if ( content ) { + this._open( event, target, content ); + } + }, + + _open: function( event, target, content ) { + var tooltipData, tooltip, delayedShow, a11yContent, + positionOption = $.extend( {}, this.options.position ); + + if ( !content ) { + return; + } + + // Content can be updated multiple times. If the tooltip already + // exists, then just update the content and bail. + tooltipData = this._find( target ); + if ( tooltipData ) { + tooltipData.tooltip.find( ".ui-tooltip-content" ).html( content ); + return; + } + + // if we have a title, clear it to prevent the native tooltip + // we have to check first to avoid defining a title if none exists + // (we don't want to cause an element to start matching [title]) + // + // We use removeAttr only for key events, to allow IE to export the correct + // accessible attributes. For mouse events, set to empty string to avoid + // native tooltip showing up (happens only when removing inside mouseover). + if ( target.is( "[title]" ) ) { + if ( event && event.type === "mouseover" ) { + target.attr( "title", "" ); + } else { + target.removeAttr( "title" ); + } + } + + tooltipData = this._tooltip( target ); + tooltip = tooltipData.tooltip; + this._addDescribedBy( target, tooltip.attr( "id" ) ); + tooltip.find( ".ui-tooltip-content" ).html( content ); + + // Support: Voiceover on OS X, JAWS on IE <= 9 + // JAWS announces deletions even when aria-relevant="additions" + // Voiceover will sometimes re-read the entire log region's contents from the beginning + this.liveRegion.children().hide(); + if ( content.clone ) { + a11yContent = content.clone(); + a11yContent.removeAttr( "id" ).find( "[id]" ).removeAttr( "id" ); + } else { + a11yContent = content; + } + $( "<div>" ).html( a11yContent ).appendTo( this.liveRegion ); + + function position( event ) { + positionOption.of = event; + if ( tooltip.is( ":hidden" ) ) { + return; + } + tooltip.position( positionOption ); + } + if ( this.options.track && event && /^mouse/.test( event.type ) ) { + this._on( this.document, { + mousemove: position + }); + // trigger once to override element-relative positioning + position( event ); + } else { + tooltip.position( $.extend({ + of: target + }, this.options.position ) ); + } + + tooltip.hide(); + + this._show( tooltip, this.options.show ); + // Handle tracking tooltips that are shown with a delay (#8644). As soon + // as the tooltip is visible, position the tooltip using the most recent + // event. + if ( this.options.show && this.options.show.delay ) { + delayedShow = this.delayedShow = setInterval(function() { + if ( tooltip.is( ":visible" ) ) { + position( positionOption.of ); + clearInterval( delayedShow ); + } + }, $.fx.interval ); + } + + this._trigger( "open", event, { tooltip: tooltip } ); + }, + + _registerCloseHandlers: function( event, target ) { + var events = { + keyup: function( event ) { + if ( event.keyCode === $.ui.keyCode.ESCAPE ) { + var fakeEvent = $.Event(event); + fakeEvent.currentTarget = target[0]; + this.close( fakeEvent, true ); + } + } + }; + + // Only bind remove handler for delegated targets. Non-delegated + // tooltips will handle this in destroy. + if ( target[ 0 ] !== this.element[ 0 ] ) { + events.remove = function() { + this._removeTooltip( this._find( target ).tooltip ); + }; + } + + if ( !event || event.type === "mouseover" ) { + events.mouseleave = "close"; + } + if ( !event || event.type === "focusin" ) { + events.focusout = "close"; + } + this._on( true, target, events ); + }, + + close: function( event ) { + var tooltip, + that = this, + target = $( event ? event.currentTarget : this.element ), + tooltipData = this._find( target ); + + // The tooltip may already be closed + if ( !tooltipData ) { + + // We set ui-tooltip-open immediately upon open (in open()), but only set the + // additional data once there's actually content to show (in _open()). So even if the + // tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in + // the period between open() and _open(). + target.removeData( "ui-tooltip-open" ); + return; + } + + tooltip = tooltipData.tooltip; + + // disabling closes the tooltip, so we need to track when we're closing + // to avoid an infinite loop in case the tooltip becomes disabled on close + if ( tooltipData.closing ) { + return; + } + + // Clear the interval for delayed tracking tooltips + clearInterval( this.delayedShow ); + + // only set title if we had one before (see comment in _open()) + // If the title attribute has changed since open(), don't restore + if ( target.data( "ui-tooltip-title" ) && !target.attr( "title" ) ) { + target.attr( "title", target.data( "ui-tooltip-title" ) ); + } + + this._removeDescribedBy( target ); + + tooltipData.hiding = true; + tooltip.stop( true ); + this._hide( tooltip, this.options.hide, function() { + that._removeTooltip( $( this ) ); + }); + + target.removeData( "ui-tooltip-open" ); + this._off( target, "mouseleave focusout keyup" ); + + // Remove 'remove' binding only on delegated targets + if ( target[ 0 ] !== this.element[ 0 ] ) { + this._off( target, "remove" ); + } + this._off( this.document, "mousemove" ); + + if ( event && event.type === "mouseleave" ) { + $.each( this.parents, function( id, parent ) { + $( parent.element ).attr( "title", parent.title ); + delete that.parents[ id ]; + }); + } + + tooltipData.closing = true; + this._trigger( "close", event, { tooltip: tooltip } ); + if ( !tooltipData.hiding ) { + tooltipData.closing = false; + } + }, + + _tooltip: function( element ) { + var tooltip = $( "<div>" ) + .attr( "role", "tooltip" ) + .addClass( "ui-tooltip ui-widget ui-corner-all ui-widget-content " + + ( this.options.tooltipClass || "" ) ), + id = tooltip.uniqueId().attr( "id" ); + + $( "<div>" ) + .addClass( "ui-tooltip-content" ) + .appendTo( tooltip ); + + tooltip.appendTo( this.document[0].body ); + + return this.tooltips[ id ] = { + element: element, + tooltip: tooltip + }; + }, + + _find: function( target ) { + var id = target.data( "ui-tooltip-id" ); + return id ? this.tooltips[ id ] : null; + }, + + _removeTooltip: function( tooltip ) { + tooltip.remove(); + delete this.tooltips[ tooltip.attr( "id" ) ]; + }, + + _destroy: function() { + var that = this; + + // close open tooltips + $.each( this.tooltips, function( id, tooltipData ) { + // Delegate to close method to handle common cleanup + var event = $.Event( "blur" ), + element = tooltipData.element; + event.target = event.currentTarget = element[ 0 ]; + that.close( event, true ); + + // Remove immediately; destroying an open tooltip doesn't use the + // hide animation + $( "#" + id ).remove(); + + // Restore the title + if ( element.data( "ui-tooltip-title" ) ) { + // If the title attribute has changed since open(), don't restore + if ( !element.attr( "title" ) ) { + element.attr( "title", element.data( "ui-tooltip-title" ) ); + } + element.removeData( "ui-tooltip-title" ); + } + }); + this.liveRegion.remove(); + } +}); + + + +})); \ No newline at end of file diff --git a/theme/bootstrap/plugins/jQueryUI/jquery-ui.min.js b/theme/bootstrap/plugins/jQueryUI/jquery-ui.min.js new file mode 100644 index 0000000..5824d12 --- /dev/null +++ b/theme/bootstrap/plugins/jQueryUI/jquery-ui.min.js @@ -0,0 +1,13 @@ +/*! jQuery UI - v1.11.4 - 2015-03-11 +* http://jqueryui.com +* Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js, menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js, sortable.js, spinner.js, tabs.js, tooltip.js +* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */ + +(function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap='#"+a+"']")[0],!!o&&i(o)):!1):(/^(input|select|textarea|button|object)$/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}function s(e){for(var t,i;e.length&&e[0]!==document;){if(t=e.css("position"),("absolute"===t||"relative"===t||"fixed"===t)&&(i=parseInt(e.css("zIndex"),10),!isNaN(i)&&0!==i))return i;e=e.parent()}return 0}function n(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},e.extend(this._defaults,this.regional[""]),this.regional.en=e.extend(!0,{},this.regional[""]),this.regional["en-US"]=e.extend(!0,{},this.regional.en),this.dpDiv=a(e("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function a(t){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return t.delegate(i,"mouseout",function(){e(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).removeClass("ui-datepicker-next-hover")}).delegate(i,"mouseover",o)}function o(){e.datepicker._isDisabledDatepicker(v.inline?v.dpDiv.parent()[0]:v.input[0])||(e(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),e(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).addClass("ui-datepicker-next-hover"))}function r(t,i){e.extend(t,i);for(var s in i)null==i[s]&&(t[s]=i[s]);return t}function h(e){return function(){var t=this.element.val();e.apply(this,arguments),this._refresh(),t!==this.element.val()&&this._trigger("change")}}e.ui=e.ui||{},e.extend(e.ui,{version:"1.11.4",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({scrollParent:function(t){var i=this.css("position"),s="absolute"===i,n=t?/(auto|scroll|hidden)/:/(auto|scroll)/,a=this.parents().filter(function(){var t=e(this);return s&&"static"===t.css("position")?!1:n.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==i&&a.length?a:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,"tabindex")))},tabbable:function(i){var s=e.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+"px")})},e.fn["outer"+i]=function(t,n){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(e+".ui-disableSelection",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(t){if(void 0!==t)return this.css("zIndex",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var l=0,u=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,"events"),s&&s.remove&&e(n).triggerHandler("remove")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,n=u.call(arguments,1),a=0,o=n.length;o>a;a++)for(i in n[a])s=n[a][i],n[a].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(n){var a="string"==typeof n,o=u.call(arguments,1),r=this;return a?this.each(function(){var i,a=e.data(this,s);return"instance"===n?(r=a,!1):a?e.isFunction(a[n])&&"_"!==n.charAt(0)?(i=a[n].apply(a,o),i!==a&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+n+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+n+"'")}):(o.length&&(n=e.widget.extend.apply(null,[n].concat(o))),this.each(function(){var t=e.data(this,s);t?(t.option(n||{}),t._init&&t._init()):e.data(this,s,new i(n,this))})),r}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=l++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(t,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(i).undelegate(i),this.bindings=e(this.bindings.not(t).get()),this.focusable=e(this.focusable.not(t).get()),this.hoverable=e(this.hoverable.not(t).get())},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget;var d=!1;e(document).mouseup(function(){d=!1}),e.widget("ui.mouse",{version:"1.11.4",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!d){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var i=this,s=1===t.which,n="string"==typeof this.options.cancel&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(t)!==!1,!this._mouseStarted)?(t.preventDefault(),!0):(!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return i._mouseMove(e)},this._mouseUpDelegate=function(e){return i._mouseUp(e)},this.document.bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),d=!0,!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button)return this._mouseUp(t);if(!t.which)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){return this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),d=!1,!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),function(){function t(e,t,i){return[parseFloat(e[0])*(p.test(e[0])?t/100:1),parseFloat(e[1])*(p.test(e[1])?i/100:1)]}function i(t,i){return parseInt(e.css(t,i),10)||0}function s(t){var i=t[0];return 9===i.nodeType?{width:t.width(),height:t.height(),offset:{top:0,left:0}}:e.isWindow(i)?{width:t.width(),height:t.height(),offset:{top:t.scrollTop(),left:t.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:t.outerWidth(),height:t.outerHeight(),offset:t.offset()}}e.ui=e.ui||{};var n,a,o=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,u=/top|center|bottom/,d=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,p=/%$/,f=e.fn.position;e.position={scrollbarWidth:function(){if(void 0!==n)return n;var t,i,s=e("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),a=s.children()[0];return e("body").append(s),t=a.offsetWidth,s.css("overflow","scroll"),i=a.offsetWidth,t===i&&(i=s[0].clientWidth),s.remove(),n=t-i},getScrollInfo:function(t){var i=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),s=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),n="scroll"===i||"auto"===i&&t.width<t.element[0].scrollWidth,a="scroll"===s||"auto"===s&&t.height<t.element[0].scrollHeight;return{width:a?e.position.scrollbarWidth():0,height:n?e.position.scrollbarWidth():0}},getWithinInfo:function(t){var i=e(t||window),s=e.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType;return{element:i,isWindow:s,isDocument:n,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s||n?i.width():i.outerWidth(),height:s||n?i.height():i.outerHeight()}}},e.fn.position=function(n){if(!n||!n.of)return f.apply(this,arguments);n=e.extend({},n);var p,m,g,v,y,b,_=e(n.of),x=e.position.getWithinInfo(n.within),w=e.position.getScrollInfo(x),k=(n.collision||"flip").split(" "),T={};return b=s(_),_[0].preventDefault&&(n.at="left top"),m=b.width,g=b.height,v=b.offset,y=e.extend({},v),e.each(["my","at"],function(){var e,t,i=(n[this]||"").split(" ");1===i.length&&(i=l.test(i[0])?i.concat(["center"]):u.test(i[0])?["center"].concat(i):["center","center"]),i[0]=l.test(i[0])?i[0]:"center",i[1]=u.test(i[1])?i[1]:"center",e=d.exec(i[0]),t=d.exec(i[1]),T[this]=[e?e[0]:0,t?t[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===k.length&&(k[1]=k[0]),"right"===n.at[0]?y.left+=m:"center"===n.at[0]&&(y.left+=m/2),"bottom"===n.at[1]?y.top+=g:"center"===n.at[1]&&(y.top+=g/2),p=t(T.at,m,g),y.left+=p[0],y.top+=p[1],this.each(function(){var s,l,u=e(this),d=u.outerWidth(),c=u.outerHeight(),f=i(this,"marginLeft"),b=i(this,"marginTop"),D=d+f+i(this,"marginRight")+w.width,S=c+b+i(this,"marginBottom")+w.height,M=e.extend({},y),C=t(T.my,u.outerWidth(),u.outerHeight());"right"===n.my[0]?M.left-=d:"center"===n.my[0]&&(M.left-=d/2),"bottom"===n.my[1]?M.top-=c:"center"===n.my[1]&&(M.top-=c/2),M.left+=C[0],M.top+=C[1],a||(M.left=h(M.left),M.top=h(M.top)),s={marginLeft:f,marginTop:b},e.each(["left","top"],function(t,i){e.ui.position[k[t]]&&e.ui.position[k[t]][i](M,{targetWidth:m,targetHeight:g,elemWidth:d,elemHeight:c,collisionPosition:s,collisionWidth:D,collisionHeight:S,offset:[p[0]+C[0],p[1]+C[1]],my:n.my,at:n.at,within:x,elem:u})}),n.using&&(l=function(e){var t=v.left-M.left,i=t+m-d,s=v.top-M.top,a=s+g-c,h={target:{element:_,left:v.left,top:v.top,width:m,height:g},element:{element:u,left:M.left,top:M.top,width:d,height:c},horizontal:0>i?"left":t>0?"right":"center",vertical:0>a?"top":s>0?"bottom":"middle"};d>m&&m>r(t+i)&&(h.horizontal="center"),c>g&&g>r(s+a)&&(h.vertical="middle"),h.important=o(r(t),r(i))>o(r(s),r(a))?"horizontal":"vertical",n.using.call(this,e,h)}),u.offset(e.extend(M,{using:l}))})},e.ui.position={fit:{left:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=e.left-t.collisionPosition.marginLeft,h=n-r,l=r+t.collisionWidth-a-n;t.collisionWidth>a?h>0&&0>=l?(i=e.left+h+t.collisionWidth-a-n,e.left+=h-i):e.left=l>0&&0>=h?n:h>l?n+a-t.collisionWidth:n:h>0?e.left+=h:l>0?e.left-=l:e.left=o(e.left-r,e.left)},top:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollTop:s.offset.top,a=t.within.height,r=e.top-t.collisionPosition.marginTop,h=n-r,l=r+t.collisionHeight-a-n;t.collisionHeight>a?h>0&&0>=l?(i=e.top+h+t.collisionHeight-a-n,e.top+=h-i):e.top=l>0&&0>=h?n:h>l?n+a-t.collisionHeight:n:h>0?e.top+=h:l>0?e.top-=l:e.top=o(e.top-r,e.top)}},flip:{left:function(e,t){var i,s,n=t.within,a=n.offset.left+n.scrollLeft,o=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=e.left-t.collisionPosition.marginLeft,u=l-h,d=l+t.collisionWidth-o-h,c="left"===t.my[0]?-t.elemWidth:"right"===t.my[0]?t.elemWidth:0,p="left"===t.at[0]?t.targetWidth:"right"===t.at[0]?-t.targetWidth:0,f=-2*t.offset[0];0>u?(i=e.left+c+p+f+t.collisionWidth-o-a,(0>i||r(u)>i)&&(e.left+=c+p+f)):d>0&&(s=e.left-t.collisionPosition.marginLeft+c+p+f-h,(s>0||d>r(s))&&(e.left+=c+p+f))},top:function(e,t){var i,s,n=t.within,a=n.offset.top+n.scrollTop,o=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=e.top-t.collisionPosition.marginTop,u=l-h,d=l+t.collisionHeight-o-h,c="top"===t.my[1],p=c?-t.elemHeight:"bottom"===t.my[1]?t.elemHeight:0,f="top"===t.at[1]?t.targetHeight:"bottom"===t.at[1]?-t.targetHeight:0,m=-2*t.offset[1];0>u?(s=e.top+p+f+m+t.collisionHeight-o-a,(0>s||r(u)>s)&&(e.top+=p+f+m)):d>0&&(i=e.top-t.collisionPosition.marginTop+p+f+m-h,(i>0||d>r(i))&&(e.top+=p+f+m))}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments),e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments),e.ui.position.fit.top.apply(this,arguments)}}},function(){var t,i,s,n,o,r=document.getElementsByTagName("body")[0],h=document.createElement("div");t=document.createElement(r?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},r&&e.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)t.style[o]=s[o];t.appendChild(h),i=r||document.documentElement,i.insertBefore(t,i.firstChild),h.style.cssText="position: absolute; left: 10.7432222px;",n=e(h).offset().left,a=n>10&&11>n,t.innerHTML="",i.removeChild(t)}()}(),e.ui.position,e.widget("ui.accordion",{version:"1.11.4",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var t=this.options;this.prevShow=this.prevHide=e(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),t.collapsible||t.active!==!1&&null!=t.active||(t.active=0),this._processPanels(),0>t.active&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():e()}},_createIcons:function(){var t=this.options.icons;t&&(e("<span>").addClass("ui-accordion-header-icon ui-icon "+t.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(t.header).addClass(t.activeHeader),this.headers.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").removeUniqueId(),this._destroyIcons(),e=this.headers.next().removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").css("display","").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&e.css("height","")},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):("event"===e&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(t)),this._super(e,t),"collapsible"!==e||t||this.options.active!==!1||this._activate(0),"icons"===e&&(this._destroyIcons(),t&&this._createIcons()),"disabled"===e&&(this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!t)),void 0)},_keydown:function(t){if(!t.altKey&&!t.ctrlKey){var i=e.ui.keyCode,s=this.headers.length,n=this.headers.index(t.target),a=!1;switch(t.keyCode){case i.RIGHT:case i.DOWN:a=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:a=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(t);break;case i.HOME:a=this.headers[0];break;case i.END:a=this.headers[s-1]}a&&(e(t.target).attr("tabIndex",-1),e(a).attr("tabIndex",0),a.focus(),t.preventDefault())}},_panelKeyDown:function(t){t.keyCode===e.ui.keyCode.UP&&t.ctrlKey&&e(t.currentTarget).prev().focus()},refresh:function(){var t=this.options;this._processPanels(),t.active===!1&&t.collapsible===!0||!this.headers.length?(t.active=!1,this.active=e()):t.active===!1?this._activate(0):this.active.length&&!e.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(t.active=!1,this.active=e()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var e=this.headers,t=this.panels;this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-state-default ui-corner-all"),this.panels=this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide(),t&&(this._off(e.not(this.headers)),this._off(t.not(this.panels)))},_refresh:function(){var t,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(){var t=e(this),i=t.uniqueId().attr("id"),s=t.next(),n=s.uniqueId().attr("id");t.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(t=n.height(),this.element.siblings(":visible").each(function(){var i=e(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(t-=i.outerHeight(!0))}),this.headers.each(function(){t-=e(this).outerHeight(!0)}),this.headers.next().each(function(){e(this).height(Math.max(0,t-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===s&&(t=0,this.headers.next().each(function(){t=Math.max(t,e(this).css("height","").height())}).height(t))},_activate:function(t){var i=this._findActive(t)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return"number"==typeof t?this.headers.eq(t):e()},_setupEvents:function(t){var i={keydown:"_keydown"};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n[0]===s[0],o=a&&i.collapsible,r=o?e():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:o?e():n,newPanel:r};t.preventDefault(),a&&!i.collapsible||this._trigger("beforeActivate",t,l)===!1||(i.active=o?!1:this.headers.index(n),this.active=a?e():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),a||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))},_toggle:function(t){var i=t.newPanel,s=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,t):(s.hide(),i.show(),this._toggleComplete(t)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(e(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(e,t,i){var s,n,a,o=this,r=0,h=e.css("box-sizing"),l=e.length&&(!t.length||e.index()<t.index()),u=this.options.animate||{},d=l&&u.down||u,c=function(){o._toggleComplete(i)};return"number"==typeof d&&(a=d),"string"==typeof d&&(n=d),n=n||d.easing||u.easing,a=a||d.duration||u.duration,t.length?e.length?(s=e.show().outerHeight(),t.animate(this.hideProps,{duration:a,easing:n,step:function(e,t){t.now=Math.round(e)}}),e.hide().animate(this.showProps,{duration:a,easing:n,complete:c,step:function(e,i){i.now=Math.round(e),"height"!==i.prop?"content-box"===h&&(r+=i.now):"content"!==o.options.heightStyle&&(i.now=Math.round(s-t.outerHeight()-r),r=0)}}),void 0):t.animate(this.hideProps,a,n,c):e.animate(this.showProps,a,n,c)},_toggleComplete:function(e){var t=e.oldPanel;t.removeClass("ui-accordion-content-active").prev().removeClass("ui-corner-top").addClass("ui-corner-all"),t.length&&(t.parent()[0].className=t.parent()[0].className),this._trigger("activate",null,e)}}),e.widget("ui.menu",{version:"1.11.4",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},items:"> *",menus:"ul",position:{my:"left-1 top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item":function(e){e.preventDefault()},"click .ui-menu-item":function(t){var i=e(t.target);!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&e(this.document[0].activeElement).closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(t){if(!this.previousFilter){var i=e(t.currentTarget); +i.siblings(".ui-state-active").removeClass("ui-state-active"),this.focus(t,i)}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var i=this.active||this.element.find(this.options.items).eq(0);t||this.focus(e,i)},blur:function(t){this._delay(function(){e.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){this._closeOnDocumentClick(e)&&this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-menu-icons ui-front").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").removeUniqueId().removeClass("ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var t=e(this);t.data("ui-menu-submenu-carat")&&t.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(t){var i,s,n,a,o=!0;switch(t.keyCode){case e.ui.keyCode.PAGE_UP:this.previousPage(t);break;case e.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case e.ui.keyCode.HOME:this._move("first","first",t);break;case e.ui.keyCode.END:this._move("last","last",t);break;case e.ui.keyCode.UP:this.previous(t);break;case e.ui.keyCode.DOWN:this.next(t);break;case e.ui.keyCode.LEFT:this.collapse(t);break;case e.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case e.ui.keyCode.ENTER:case e.ui.keyCode.SPACE:this._activate(t);break;case e.ui.keyCode.ESCAPE:this.collapse(t);break;default:o=!1,s=this.previousFilter||"",n=String.fromCharCode(t.keyCode),a=!1,clearTimeout(this.filterTimer),n===s?a=!0:n=s+n,i=this._filterMenuItems(n),i=a&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(t.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(t,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}o&&t.preventDefault()},_activate:function(e){this.active.is(".ui-state-disabled")||(this.active.is("[aria-haspopup='true']")?this.expand(e):this.select(e))},refresh:function(){var t,i,s=this,n=this.options.icons.submenu,a=this.element.find(this.options.menus);this.element.toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length),a.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-front").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=e(this),i=t.parent(),s=e("<span>").addClass("ui-menu-icon ui-icon "+n).data("ui-menu-submenu-carat",!0);i.attr("aria-haspopup","true").prepend(s),t.attr("aria-labelledby",i.attr("id"))}),t=a.add(this.element),i=t.find(this.options.items),i.not(".ui-menu-item").each(function(){var t=e(this);s._isDivider(t)&&t.addClass("ui-widget-content ui-menu-divider")}),i.not(".ui-menu-item, .ui-menu-divider").addClass("ui-menu-item").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!e.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(e,t){"icons"===e&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(t.submenu),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},focus:function(e,t){var i,s;this.blur(e,e&&"focus"===e.type),this._scrollIntoView(t),this.active=t.first(),s=this.active.addClass("ui-state-focus").removeClass("ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").addClass("ui-state-active"),e&&"keydown"===e.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=t.children(".ui-menu"),i.length&&e&&/^mouse/.test(e.type)&&this._startOpening(i),this.activeMenu=t.parent(),this._trigger("focus",e,{item:t})},_scrollIntoView:function(t){var i,s,n,a,o,r;this._hasScroll()&&(i=parseFloat(e.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(e.css(this.activeMenu[0],"paddingTop"))||0,n=t.offset().top-this.activeMenu.offset().top-i-s,a=this.activeMenu.scrollTop(),o=this.activeMenu.height(),r=t.outerHeight(),0>n?this.activeMenu.scrollTop(a+n):n+r>o&&this.activeMenu.scrollTop(a+n-o+r))},blur:function(e,t){t||clearTimeout(this.timer),this.active&&(this.active.removeClass("ui-state-focus"),this.active=null,this._trigger("blur",e,{item:this.active}))},_startOpening:function(e){clearTimeout(this.timer),"true"===e.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(e)},this.delay))},_open:function(t){var i=e.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(t,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:e(t&&t.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(t),this.activeMenu=s},this.delay)},_close:function(e){e||(e=this.active?this.active.parent():this.element),e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find(".ui-state-active").not(".ui-state-focus").removeClass("ui-state-active")},_closeOnDocumentClick:function(t){return!e(t.target).closest(".ui-menu").length},_isDivider:function(e){return!/[^\-\u2014\u2013\s]/.test(e.text())},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);t&&t.length&&(this._close(),this.focus(e,t))},expand:function(e){var t=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();t&&t.length&&(this._open(t.parent()),this._delay(function(){this.focus(e,t)}))},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(e,t,i){var s;this.active&&(s="first"===e||"last"===e?this.active["first"===e?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[e+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[t]()),this.focus(i,s)},nextPage:function(t){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=e(this),0>i.offset().top-s-n}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(t),void 0)},previousPage:function(t){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=e(this),i.offset().top-s+n>0}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items).first())),void 0):(this.next(t),void 0)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(t){this.active=this.active||e(t.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(t,!0),this._trigger("select",t,i)},_filterMenuItems:function(t){var i=t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&"),s=RegExp("^"+i,"i");return this.activeMenu.find(this.options.items).filter(".ui-menu-item").filter(function(){return s.test(e.trim(e(this).text()))})}}),e.widget("ui.autocomplete",{version:"1.11.4",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var t,i,s,n=this.element[0].nodeName.toLowerCase(),a="textarea"===n,o="input"===n;this.isMultiLine=a?!0:o?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[a||o?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return t=!0,s=!0,i=!0,void 0;t=!1,s=!1,i=!1;var a=e.ui.keyCode;switch(n.keyCode){case a.PAGE_UP:t=!0,this._move("previousPage",n);break;case a.PAGE_DOWN:t=!0,this._move("nextPage",n);break;case a.UP:t=!0,this._keyEvent("previous",n);break;case a.DOWN:t=!0,this._keyEvent("next",n);break;case a.ENTER:this.menu.active&&(t=!0,n.preventDefault(),this.menu.select(n));break;case a.TAB:this.menu.active&&this.menu.select(n);break;case a.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(t)return t=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=e.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(e){return s?(s=!1,e.preventDefault(),void 0):(this._searchTimeout(e),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(e),this._change(e),void 0)}}),this._initSource(),this.menu=e("<ul>").addClass("ui-autocomplete ui-front").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var i=this.menu.element[0];e(t.target).closest(".ui-menu-item").length||this._delay(function(){var t=this;this.document.one("mousedown",function(s){s.target===t.element[0]||s.target===i||e.contains(i,s.target)||t.close()})})},menufocus:function(t,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){e(t.target).trigger(t.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:n})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&e.trim(s).length&&(this.liveRegion.children().hide(),e("<div>").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,t){var i=t.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",e,{item:i})&&this._value(i.value),this.term=this._value(),this.close(e),this.selectedItem=i}}),this.liveRegion=e("<span>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),"source"===e&&this._initSource(),"appendTo"===e&&this.menu.element.appendTo(this._appendTo()),"disabled"===e&&t&&this.xhr&&this.xhr.abort()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_initSource:function(){var t,i,s=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(i,s){s(e.ui.autocomplete.filter(t,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(t,n){s.xhr&&s.xhr.abort(),s.xhr=e.ajax({url:i,data:t,dataType:"json",success:function(e){n(e)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),i=this.menu.element.is(":visible"),s=e.altKey||e.ctrlKey||e.metaKey||e.shiftKey;(!t||t&&!i&&!s)&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){return e=null!=e?e:this._value(),this.term=this._value(),e.length<this.options.minLength?this.close(t):this._trigger("search",t)!==!1?this._search(e):void 0},_search:function(e){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:e},this._response())},_response:function(){var t=++this.requestIndex;return e.proxy(function(e){t===this.requestIndex&&this.__response(e),this.pending--,this.pending||this.element.removeClass("ui-autocomplete-loading")},this)},__response:function(e){e&&(e=this._normalize(e)),this._trigger("response",null,{content:e}),!this.options.disabled&&e&&e.length&&!this.cancelSearch?(this._suggest(e),this._trigger("open")):this._close()},close:function(e){this.cancelSearch=!0,this._close(e)},_close:function(e){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",e))},_change:function(e){this.previous!==this._value()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(t){return t.length&&t[0].label&&t[0].value?t:e.map(t,function(t){return"string"==typeof t?{label:t,value:t}:e.extend({},t,{label:t.label||t.value,value:t.value||t.label})})},_suggest:function(t){var i=this.menu.element.empty();this._renderMenu(i,t),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(e.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(t,i){var s=this;e.each(i,function(e,i){s._renderItemData(t,i)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-autocomplete-item",t)},_renderItem:function(t,i){return e("<li>").text(i.label).appendTo(t)},_move:function(e,t){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[e](t),void 0):(this.search(null,t),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(e,t),t.preventDefault())}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,i){var s=RegExp(e.ui.autocomplete.escapeRegex(i),"i");return e.grep(t,function(e){return s.test(e.label||e.value||e)})}}),e.widget("ui.autocomplete",e.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(e){return e+(e>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(t){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=t&&t.length?this.options.messages.results(t.length):this.options.messages.noResults,this.liveRegion.children().hide(),e("<div>").text(i).appendTo(this.liveRegion))}}),e.ui.autocomplete;var c,p="ui-button ui-widget ui-state-default ui-corner-all",f="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",m=function(){var t=e(this);setTimeout(function(){t.find(":ui-button").button("refresh")},1)},g=function(t){var i=t.name,s=t.form,n=e([]);return i&&(i=i.replace(/'/g,"\\'"),n=s?e(s).find("[name='"+i+"'][type=radio]"):e("[name='"+i+"'][type=radio]",t.ownerDocument).filter(function(){return!this.form})),n};e.widget("ui.button",{version:"1.11.4",defaultElement:"<button>",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset"+this.eventNamespace).bind("reset"+this.eventNamespace,m),"boolean"!=typeof this.options.disabled?this.options.disabled=!!this.element.prop("disabled"):this.element.prop("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var t=this,i=this.options,s="checkbox"===this.type||"radio"===this.type,n=s?"":"ui-state-active";null===i.label&&(i.label="input"===this.type?this.buttonElement.val():this.buttonElement.html()),this._hoverable(this.buttonElement),this.buttonElement.addClass(p).attr("role","button").bind("mouseenter"+this.eventNamespace,function(){i.disabled||this===c&&e(this).addClass("ui-state-active")}).bind("mouseleave"+this.eventNamespace,function(){i.disabled||e(this).removeClass(n)}).bind("click"+this.eventNamespace,function(e){i.disabled&&(e.preventDefault(),e.stopImmediatePropagation())}),this._on({focus:function(){this.buttonElement.addClass("ui-state-focus")},blur:function(){this.buttonElement.removeClass("ui-state-focus")}}),s&&this.element.bind("change"+this.eventNamespace,function(){t.refresh()}),"checkbox"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){return i.disabled?!1:void 0}):"radio"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){if(i.disabled)return!1;e(this).addClass("ui-state-active"),t.buttonElement.attr("aria-pressed","true");var s=t.element[0];g(s).not(s).map(function(){return e(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown"+this.eventNamespace,function(){return i.disabled?!1:(e(this).addClass("ui-state-active"),c=this,t.document.one("mouseup",function(){c=null}),void 0)}).bind("mouseup"+this.eventNamespace,function(){return i.disabled?!1:(e(this).removeClass("ui-state-active"),void 0)}).bind("keydown"+this.eventNamespace,function(t){return i.disabled?!1:((t.keyCode===e.ui.keyCode.SPACE||t.keyCode===e.ui.keyCode.ENTER)&&e(this).addClass("ui-state-active"),void 0)}).bind("keyup"+this.eventNamespace+" blur"+this.eventNamespace,function(){e(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(t){t.keyCode===e.ui.keyCode.SPACE&&e(this).click()})),this._setOption("disabled",i.disabled),this._resetButton()},_determineButtonType:function(){var e,t,i;this.type=this.element.is("[type=checkbox]")?"checkbox":this.element.is("[type=radio]")?"radio":this.element.is("input")?"input":"button","checkbox"===this.type||"radio"===this.type?(e=this.element.parents().last(),t="label[for='"+this.element.attr("id")+"']",this.buttonElement=e.find(t),this.buttonElement.length||(e=e.length?e.siblings():this.element.siblings(),this.buttonElement=e.filter(t),this.buttonElement.length||(this.buttonElement=e.find(t))),this.element.addClass("ui-helper-hidden-accessible"),i=this.element.is(":checked"),i&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.prop("aria-pressed",i)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(p+" ui-state-active "+f).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title")},_setOption:function(e,t){return this._super(e,t),"disabled"===e?(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),t&&("checkbox"===this.type||"radio"===this.type?this.buttonElement.removeClass("ui-state-focus"):this.buttonElement.removeClass("ui-state-focus ui-state-active")),void 0):(this._resetButton(),void 0)},refresh:function(){var t=this.element.is("input, button")?this.element.is(":disabled"):this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOption("disabled",t),"radio"===this.type?g(this.element[0]).each(function(){e(this).is(":checked")?e(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):e(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):"checkbox"===this.type&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if("input"===this.type)return this.options.label&&this.element.val(this.options.label),void 0;var t=this.buttonElement.removeClass(f),i=e("<span></span>",this.document[0]).addClass("ui-button-text").html(this.options.label).appendTo(t.empty()).text(),s=this.options.icons,n=s.primary&&s.secondary,a=[];s.primary||s.secondary?(this.options.text&&a.push("ui-button-text-icon"+(n?"s":s.primary?"-primary":"-secondary")),s.primary&&t.prepend("<span class='ui-button-icon-primary ui-icon "+s.primary+"'></span>"),s.secondary&&t.append("<span class='ui-button-icon-secondary ui-icon "+s.secondary+"'></span>"),this.options.text||(a.push(n?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||t.attr("title",e.trim(i)))):a.push("ui-button-text-only"),t.addClass(a.join(" "))}}),e.widget("ui.buttonset",{version:"1.11.4",options:{items:"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(e,t){"disabled"===e&&this.buttons.button("option",e,t),this._super(e,t)},refresh:function(){var t="rtl"===this.element.css("direction"),i=this.element.find(this.options.items),s=i.filter(":ui-button");i.not(":ui-button").button(),s.button("refresh"),this.buttons=i.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(t?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(t?"ui-corner-left":"ui-corner-right").end().end()},_destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy")}}),e.ui.button,e.extend(e.ui,{datepicker:{version:"1.11.4"}});var v;e.extend(n.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(e){return r(this._defaults,e||{}),this},_attachDatepicker:function(t,i){var s,n,a;s=t.nodeName.toLowerCase(),n="div"===s||"span"===s,t.id||(this.uuid+=1,t.id="dp"+this.uuid),a=this._newInst(e(t),n),a.settings=e.extend({},i||{}),"input"===s?this._connectDatepicker(t,a):n&&this._inlineDatepicker(t,a)},_newInst:function(t,i){var s=t[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:s,input:t,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?a(e("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(t,i){var s=e(t);i.append=e([]),i.trigger=e([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp),this._autoSize(i),e.data(t,"datepicker",i),i.settings.disabled&&this._disableDatepicker(t))},_attachments:function(t,i){var s,n,a,o=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),o&&(i.append=e("<span class='"+this._appendClass+"'>"+o+"</span>"),t[r?"before":"after"](i.append)),t.unbind("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&t.focus(this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),a=this._get(i,"buttonImage"),i.trigger=e(this._get(i,"buttonImageOnly")?e("<img/>").addClass(this._triggerClass).attr({src:a,alt:n,title:n}):e("<button type='button'></button>").addClass(this._triggerClass).html(a?e("<img/>").attr({src:a,alt:n,title:n}):n)),t[r?"before":"after"](i.trigger),i.trigger.click(function(){return e.datepicker._datepickerShowing&&e.datepicker._lastInput===t[0]?e.datepicker._hideDatepicker():e.datepicker._datepickerShowing&&e.datepicker._lastInput!==t[0]?(e.datepicker._hideDatepicker(),e.datepicker._showDatepicker(t[0])):e.datepicker._showDatepicker(t[0]),!1}))},_autoSize:function(e){if(this._get(e,"autoSize")&&!e.inline){var t,i,s,n,a=new Date(2009,11,20),o=this._get(e,"dateFormat");o.match(/[DM]/)&&(t=function(e){for(i=0,s=0,n=0;e.length>n;n++)e[n].length>i&&(i=e[n].length,s=n);return s},a.setMonth(t(this._get(e,o.match(/MM/)?"monthNames":"monthNamesShort"))),a.setDate(t(this._get(e,o.match(/DD/)?"dayNames":"dayNamesShort"))+20-a.getDay())),e.input.attr("size",this._formatDate(e,a).length)}},_inlineDatepicker:function(t,i){var s=e(t);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),e.data(t,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(t),i.dpDiv.css("display","block"))},_dialogDatepicker:function(t,i,s,n,a){var o,h,l,u,d,c=this._dialogInst;return c||(this.uuid+=1,o="dp"+this.uuid,this._dialogInput=e("<input type='text' id='"+o+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.keydown(this._doKeyDown),e("body").append(this._dialogInput),c=this._dialogInst=this._newInst(this._dialogInput,!1),c.settings={},e.data(this._dialogInput[0],"datepicker",c)),r(c.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(c,i):i,this._dialogInput.val(i),this._pos=a?a.length?a:[a.pageX,a.pageY]:null,this._pos||(h=document.documentElement.clientWidth,l=document.documentElement.clientHeight,u=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[h/2-100+u,l/2-150+d]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),c.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),e.blockUI&&e.blockUI(this.dpDiv),e.data(this._dialogInput[0],"datepicker",c),this},_destroyDatepicker:function(t){var i,s=e(t),n=e.data(t,"datepicker");s.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),e.removeData(t,"datepicker"),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty(),v===n&&(v=null))},_enableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!1,a.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}))},_disableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!0,a.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}),this._disabledInputs[this._disabledInputs.length]=t)},_isDisabledDatepicker:function(e){if(!e)return!1;for(var t=0;this._disabledInputs.length>t;t++)if(this._disabledInputs[t]===e)return!0;return!1},_getInst:function(t){try{return e.data(t,"datepicker")}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(t,i,s){var n,a,o,h,l=this._getInst(t);return 2===arguments.length&&"string"==typeof i?"defaults"===i?e.extend({},e.datepicker._defaults):l?"all"===i?e.extend({},l.settings):this._get(l,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),l&&(this._curInst===l&&this._hideDatepicker(),a=this._getDateDatepicker(t,!0),o=this._getMinMaxDate(l,"min"),h=this._getMinMaxDate(l,"max"),r(l.settings,n),null!==o&&void 0!==n.dateFormat&&void 0===n.minDate&&(l.settings.minDate=this._formatDate(l,o)),null!==h&&void 0!==n.dateFormat&&void 0===n.maxDate&&(l.settings.maxDate=this._formatDate(l,h)),"disabled"in n&&(n.disabled?this._disableDatepicker(t):this._enableDatepicker(t)),this._attachments(e(t),l),this._autoSize(l),this._setDate(l,a),this._updateAlternate(l),this._updateDatepicker(l)),void 0)},_changeDatepicker:function(e,t,i){this._optionDatepicker(e,t,i)},_refreshDatepicker:function(e){var t=this._getInst(e);t&&this._updateDatepicker(t)},_setDateDatepicker:function(e,t){var i=this._getInst(e);i&&(this._setDate(i,t),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(e,t){var i=this._getInst(e);return i&&!i.inline&&this._setDateFromField(i,t),i?this._getDate(i):null},_doKeyDown:function(t){var i,s,n,a=e.datepicker._getInst(t.target),o=!0,r=a.dpDiv.is(".ui-datepicker-rtl");if(a._keyEvent=!0,e.datepicker._datepickerShowing)switch(t.keyCode){case 9:e.datepicker._hideDatepicker(),o=!1;break;case 13:return n=e("td."+e.datepicker._dayOverClass+":not(."+e.datepicker._currentClass+")",a.dpDiv),n[0]&&e.datepicker._selectDay(t.target,a.selectedMonth,a.selectedYear,n[0]),i=e.datepicker._get(a,"onSelect"),i?(s=e.datepicker._formatDate(a),i.apply(a.input?a.input[0]:null,[s,a])):e.datepicker._hideDatepicker(),!1;case 27:e.datepicker._hideDatepicker();break;case 33:e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 34:e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 35:(t.ctrlKey||t.metaKey)&&e.datepicker._clearDate(t.target),o=t.ctrlKey||t.metaKey;break;case 36:(t.ctrlKey||t.metaKey)&&e.datepicker._gotoToday(t.target),o=t.ctrlKey||t.metaKey;break;case 37:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?1:-1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 38:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,-7,"D"),o=t.ctrlKey||t.metaKey;break;case 39:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?-1:1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 40:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,7,"D"),o=t.ctrlKey||t.metaKey;break;default:o=!1}else 36===t.keyCode&&t.ctrlKey?e.datepicker._showDatepicker(this):o=!1;o&&(t.preventDefault(),t.stopPropagation())},_doKeyPress:function(t){var i,s,n=e.datepicker._getInst(t.target); +return e.datepicker._get(n,"constrainInput")?(i=e.datepicker._possibleChars(e.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==t.charCode?t.keyCode:t.charCode),t.ctrlKey||t.metaKey||" ">s||!i||i.indexOf(s)>-1):void 0},_doKeyUp:function(t){var i,s=e.datepicker._getInst(t.target);if(s.input.val()!==s.lastVal)try{i=e.datepicker.parseDate(e.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,e.datepicker._getFormatConfig(s)),i&&(e.datepicker._setDateFromField(s),e.datepicker._updateAlternate(s),e.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(t){if(t=t.target||t,"input"!==t.nodeName.toLowerCase()&&(t=e("input",t.parentNode)[0]),!e.datepicker._isDisabledDatepicker(t)&&e.datepicker._lastInput!==t){var i,n,a,o,h,l,u;i=e.datepicker._getInst(t),e.datepicker._curInst&&e.datepicker._curInst!==i&&(e.datepicker._curInst.dpDiv.stop(!0,!0),i&&e.datepicker._datepickerShowing&&e.datepicker._hideDatepicker(e.datepicker._curInst.input[0])),n=e.datepicker._get(i,"beforeShow"),a=n?n.apply(t,[t,i]):{},a!==!1&&(r(i.settings,a),i.lastVal=null,e.datepicker._lastInput=t,e.datepicker._setDateFromField(i),e.datepicker._inDialog&&(t.value=""),e.datepicker._pos||(e.datepicker._pos=e.datepicker._findPos(t),e.datepicker._pos[1]+=t.offsetHeight),o=!1,e(t).parents().each(function(){return o|="fixed"===e(this).css("position"),!o}),h={left:e.datepicker._pos[0],top:e.datepicker._pos[1]},e.datepicker._pos=null,i.dpDiv.empty(),i.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),e.datepicker._updateDatepicker(i),h=e.datepicker._checkOffset(i,h,o),i.dpDiv.css({position:e.datepicker._inDialog&&e.blockUI?"static":o?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"}),i.inline||(l=e.datepicker._get(i,"showAnim"),u=e.datepicker._get(i,"duration"),i.dpDiv.css("z-index",s(e(t))+1),e.datepicker._datepickerShowing=!0,e.effects&&e.effects.effect[l]?i.dpDiv.show(l,e.datepicker._get(i,"showOptions"),u):i.dpDiv[l||"show"](l?u:null),e.datepicker._shouldFocusInput(i)&&i.input.focus(),e.datepicker._curInst=i))}},_updateDatepicker:function(t){this.maxRows=4,v=t,t.dpDiv.empty().append(this._generateHTML(t)),this._attachHandlers(t);var i,s=this._getNumberOfMonths(t),n=s[1],a=17,r=t.dpDiv.find("."+this._dayOverClass+" a");r.length>0&&o.apply(r.get(0)),t.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&t.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),t.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),t.dpDiv[(this._get(t,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),t===e.datepicker._curInst&&e.datepicker._datepickerShowing&&e.datepicker._shouldFocusInput(t)&&t.input.focus(),t.yearshtml&&(i=t.yearshtml,setTimeout(function(){i===t.yearshtml&&t.yearshtml&&t.dpDiv.find("select.ui-datepicker-year:first").replaceWith(t.yearshtml),i=t.yearshtml=null},0))},_shouldFocusInput:function(e){return e.input&&e.input.is(":visible")&&!e.input.is(":disabled")&&!e.input.is(":focus")},_checkOffset:function(t,i,s){var n=t.dpDiv.outerWidth(),a=t.dpDiv.outerHeight(),o=t.input?t.input.outerWidth():0,r=t.input?t.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:e(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:e(document).scrollTop());return i.left-=this._get(t,"isRTL")?n-o:0,i.left-=s&&i.left===t.input.offset().left?e(document).scrollLeft():0,i.top-=s&&i.top===t.input.offset().top+r?e(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+a>l&&l>a?Math.abs(a+r):0),i},_findPos:function(t){for(var i,s=this._getInst(t),n=this._get(s,"isRTL");t&&("hidden"===t.type||1!==t.nodeType||e.expr.filters.hidden(t));)t=t[n?"previousSibling":"nextSibling"];return i=e(t).offset(),[i.left,i.top]},_hideDatepicker:function(t){var i,s,n,a,o=this._curInst;!o||t&&o!==e.data(t,"datepicker")||this._datepickerShowing&&(i=this._get(o,"showAnim"),s=this._get(o,"duration"),n=function(){e.datepicker._tidyDialog(o)},e.effects&&(e.effects.effect[i]||e.effects[i])?o.dpDiv.hide(i,e.datepicker._get(o,"showOptions"),s,n):o.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,a=this._get(o,"onClose"),a&&a.apply(o.input?o.input[0]:null,[o.input?o.input.val():"",o]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),e.blockUI&&(e.unblockUI(),e("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(e){e.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(t){if(e.datepicker._curInst){var i=e(t.target),s=e.datepicker._getInst(i[0]);(i[0].id!==e.datepicker._mainDivId&&0===i.parents("#"+e.datepicker._mainDivId).length&&!i.hasClass(e.datepicker.markerClassName)&&!i.closest("."+e.datepicker._triggerClass).length&&e.datepicker._datepickerShowing&&(!e.datepicker._inDialog||!e.blockUI)||i.hasClass(e.datepicker.markerClassName)&&e.datepicker._curInst!==s)&&e.datepicker._hideDatepicker()}},_adjustDate:function(t,i,s){var n=e(t),a=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(a,i+("M"===s?this._get(a,"showCurrentAtPos"):0),s),this._updateDatepicker(a))},_gotoToday:function(t){var i,s=e(t),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(t,i,s){var n=e(t),a=this._getInst(n[0]);a["selected"+("M"===s?"Month":"Year")]=a["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(a),this._adjustDate(n)},_selectDay:function(t,i,s,n){var a,o=e(t);e(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(o[0])||(a=this._getInst(o[0]),a.selectedDay=a.currentDay=e("a",n).html(),a.selectedMonth=a.currentMonth=i,a.selectedYear=a.currentYear=s,this._selectDate(t,this._formatDate(a,a.currentDay,a.currentMonth,a.currentYear)))},_clearDate:function(t){var i=e(t);this._selectDate(i,"")},_selectDate:function(t,i){var s,n=e(t),a=this._getInst(n[0]);i=null!=i?i:this._formatDate(a),a.input&&a.input.val(i),this._updateAlternate(a),s=this._get(a,"onSelect"),s?s.apply(a.input?a.input[0]:null,[i,a]):a.input&&a.input.trigger("change"),a.inline?this._updateDatepicker(a):(this._hideDatepicker(),this._lastInput=a.input[0],"object"!=typeof a.input[0]&&a.input.focus(),this._lastInput=null)},_updateAlternate:function(t){var i,s,n,a=this._get(t,"altField");a&&(i=this._get(t,"altFormat")||this._get(t,"dateFormat"),s=this._getDate(t),n=this.formatDate(i,s,this._getFormatConfig(t)),e(a).each(function(){e(this).val(n)}))},noWeekends:function(e){var t=e.getDay();return[t>0&&6>t,""]},iso8601Week:function(e){var t,i=new Date(e.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),t=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((t-i)/864e5)/7)+1},parseDate:function(t,i,s){if(null==t||null==i)throw"Invalid arguments";if(i="object"==typeof i?""+i:i+"",""===i)return null;var n,a,o,r,h=0,l=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,u="string"!=typeof l?l:(new Date).getFullYear()%100+parseInt(l,10),d=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,c=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,m=-1,g=-1,v=-1,y=-1,b=!1,_=function(e){var i=t.length>n+1&&t.charAt(n+1)===e;return i&&n++,i},x=function(e){var t=_(e),s="@"===e?14:"!"===e?20:"y"===e&&t?4:"o"===e?3:2,n="y"===e?s:1,a=RegExp("^\\d{"+n+","+s+"}"),o=i.substring(h).match(a);if(!o)throw"Missing number at position "+h;return h+=o[0].length,parseInt(o[0],10)},w=function(t,s,n){var a=-1,o=e.map(_(t)?n:s,function(e,t){return[[t,e]]}).sort(function(e,t){return-(e[1].length-t[1].length)});if(e.each(o,function(e,t){var s=t[1];return i.substr(h,s.length).toLowerCase()===s.toLowerCase()?(a=t[0],h+=s.length,!1):void 0}),-1!==a)return a+1;throw"Unknown name at position "+h},k=function(){if(i.charAt(h)!==t.charAt(n))throw"Unexpected literal at position "+h;h++};for(n=0;t.length>n;n++)if(b)"'"!==t.charAt(n)||_("'")?k():b=!1;else switch(t.charAt(n)){case"d":v=x("d");break;case"D":w("D",d,c);break;case"o":y=x("o");break;case"m":g=x("m");break;case"M":g=w("M",p,f);break;case"y":m=x("y");break;case"@":r=new Date(x("@")),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"!":r=new Date((x("!")-this._ticksTo1970)/1e4),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"'":_("'")?k():b=!0;break;default:k()}if(i.length>h&&(o=i.substr(h),!/^\s+/.test(o)))throw"Extra/unparsed characters found in date: "+o;if(-1===m?m=(new Date).getFullYear():100>m&&(m+=(new Date).getFullYear()-(new Date).getFullYear()%100+(u>=m?0:-100)),y>-1)for(g=1,v=y;;){if(a=this._getDaysInMonth(m,g-1),a>=v)break;g++,v-=a}if(r=this._daylightSavingAdjust(new Date(m,g-1,v)),r.getFullYear()!==m||r.getMonth()+1!==g||r.getDate()!==v)throw"Invalid date";return r},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(e,t,i){if(!t)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,a=(i?i.dayNames:null)||this._defaults.dayNames,o=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(t){var i=e.length>s+1&&e.charAt(s+1)===t;return i&&s++,i},l=function(e,t,i){var s=""+t;if(h(e))for(;i>s.length;)s="0"+s;return s},u=function(e,t,i,s){return h(e)?s[t]:i[t]},d="",c=!1;if(t)for(s=0;e.length>s;s++)if(c)"'"!==e.charAt(s)||h("'")?d+=e.charAt(s):c=!1;else switch(e.charAt(s)){case"d":d+=l("d",t.getDate(),2);break;case"D":d+=u("D",t.getDay(),n,a);break;case"o":d+=l("o",Math.round((new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()-new Date(t.getFullYear(),0,0).getTime())/864e5),3);break;case"m":d+=l("m",t.getMonth()+1,2);break;case"M":d+=u("M",t.getMonth(),o,r);break;case"y":d+=h("y")?t.getFullYear():(10>t.getYear()%100?"0":"")+t.getYear()%100;break;case"@":d+=t.getTime();break;case"!":d+=1e4*t.getTime()+this._ticksTo1970;break;case"'":h("'")?d+="'":c=!0;break;default:d+=e.charAt(s)}return d},_possibleChars:function(e){var t,i="",s=!1,n=function(i){var s=e.length>t+1&&e.charAt(t+1)===i;return s&&t++,s};for(t=0;e.length>t;t++)if(s)"'"!==e.charAt(t)||n("'")?i+=e.charAt(t):s=!1;else switch(e.charAt(t)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=e.charAt(t)}return i},_get:function(e,t){return void 0!==e.settings[t]?e.settings[t]:this._defaults[t]},_setDateFromField:function(e,t){if(e.input.val()!==e.lastVal){var i=this._get(e,"dateFormat"),s=e.lastVal=e.input?e.input.val():null,n=this._getDefaultDate(e),a=n,o=this._getFormatConfig(e);try{a=this.parseDate(i,s,o)||n}catch(r){s=t?"":s}e.selectedDay=a.getDate(),e.drawMonth=e.selectedMonth=a.getMonth(),e.drawYear=e.selectedYear=a.getFullYear(),e.currentDay=s?a.getDate():0,e.currentMonth=s?a.getMonth():0,e.currentYear=s?a.getFullYear():0,this._adjustInstDate(e)}},_getDefaultDate:function(e){return this._restrictMinMax(e,this._determineDate(e,this._get(e,"defaultDate"),new Date))},_determineDate:function(t,i,s){var n=function(e){var t=new Date;return t.setDate(t.getDate()+e),t},a=function(i){try{return e.datepicker.parseDate(e.datepicker._get(t,"dateFormat"),i,e.datepicker._getFormatConfig(t))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?e.datepicker._getDate(t):null)||new Date,a=n.getFullYear(),o=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":o+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o));break;case"y":case"Y":a+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o))}l=h.exec(i)}return new Date(a,o,r)},o=null==i||""===i?s:"string"==typeof i?a(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return o=o&&"Invalid Date"==""+o?s:o,o&&(o.setHours(0),o.setMinutes(0),o.setSeconds(0),o.setMilliseconds(0)),this._daylightSavingAdjust(o)},_daylightSavingAdjust:function(e){return e?(e.setHours(e.getHours()>12?e.getHours()+2:0),e):null},_setDate:function(e,t,i){var s=!t,n=e.selectedMonth,a=e.selectedYear,o=this._restrictMinMax(e,this._determineDate(e,t,new Date));e.selectedDay=e.currentDay=o.getDate(),e.drawMonth=e.selectedMonth=e.currentMonth=o.getMonth(),e.drawYear=e.selectedYear=e.currentYear=o.getFullYear(),n===e.selectedMonth&&a===e.selectedYear||i||this._notifyChange(e),this._adjustInstDate(e),e.input&&e.input.val(s?"":this._formatDate(e))},_getDate:function(e){var t=!e.currentYear||e.input&&""===e.input.val()?null:this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return t},_attachHandlers:function(t){var i=this._get(t,"stepMonths"),s="#"+t.id.replace(/\\\\/g,"\\");t.dpDiv.find("[data-handler]").map(function(){var t={prev:function(){e.datepicker._adjustDate(s,-i,"M")},next:function(){e.datepicker._adjustDate(s,+i,"M")},hide:function(){e.datepicker._hideDatepicker()},today:function(){e.datepicker._gotoToday(s)},selectDay:function(){return e.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return e.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return e.datepicker._selectMonthYear(s,this,"Y"),!1}};e(this).bind(this.getAttribute("data-event"),t[this.getAttribute("data-handler")])})},_generateHTML:function(e){var t,i,s,n,a,o,r,h,l,u,d,c,p,f,m,g,v,y,b,_,x,w,k,T,D,S,M,C,N,A,P,I,H,z,F,E,O,j,W,L=new Date,R=this._daylightSavingAdjust(new Date(L.getFullYear(),L.getMonth(),L.getDate())),Y=this._get(e,"isRTL"),B=this._get(e,"showButtonPanel"),J=this._get(e,"hideIfNoPrevNext"),q=this._get(e,"navigationAsDateFormat"),K=this._getNumberOfMonths(e),V=this._get(e,"showCurrentAtPos"),U=this._get(e,"stepMonths"),Q=1!==K[0]||1!==K[1],G=this._daylightSavingAdjust(e.currentDay?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(9999,9,9)),X=this._getMinMaxDate(e,"min"),$=this._getMinMaxDate(e,"max"),Z=e.drawMonth-V,et=e.drawYear;if(0>Z&&(Z+=12,et--),$)for(t=this._daylightSavingAdjust(new Date($.getFullYear(),$.getMonth()-K[0]*K[1]+1,$.getDate())),t=X&&X>t?X:t;this._daylightSavingAdjust(new Date(et,Z,1))>t;)Z--,0>Z&&(Z=11,et--);for(e.drawMonth=Z,e.drawYear=et,i=this._get(e,"prevText"),i=q?this.formatDate(i,this._daylightSavingAdjust(new Date(et,Z-U,1)),this._getFormatConfig(e)):i,s=this._canAdjustMonth(e,-1,et,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>":J?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(e,"nextText"),n=q?this.formatDate(n,this._daylightSavingAdjust(new Date(et,Z+U,1)),this._getFormatConfig(e)):n,a=this._canAdjustMonth(e,1,et,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>":J?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>",o=this._get(e,"currentText"),r=this._get(e,"gotoCurrent")&&e.currentDay?G:R,o=q?this.formatDate(o,r,this._getFormatConfig(e)):o,h=e.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(e,"closeText")+"</button>",l=B?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(this._isInRange(e,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+o+"</button>":"")+(Y?"":h)+"</div>":"",u=parseInt(this._get(e,"firstDay"),10),u=isNaN(u)?0:u,d=this._get(e,"showWeek"),c=this._get(e,"dayNames"),p=this._get(e,"dayNamesMin"),f=this._get(e,"monthNames"),m=this._get(e,"monthNamesShort"),g=this._get(e,"beforeShowDay"),v=this._get(e,"showOtherMonths"),y=this._get(e,"selectOtherMonths"),b=this._getDefaultDate(e),_="",w=0;K[0]>w;w++){for(k="",this.maxRows=4,T=0;K[1]>T;T++){if(D=this._daylightSavingAdjust(new Date(et,Z,e.selectedDay)),S=" ui-corner-all",M="",Q){if(M+="<div class='ui-datepicker-group",K[1]>1)switch(T){case 0:M+=" ui-datepicker-group-first",S=" ui-corner-"+(Y?"right":"left");break;case K[1]-1:M+=" ui-datepicker-group-last",S=" ui-corner-"+(Y?"left":"right");break;default:M+=" ui-datepicker-group-middle",S=""}M+="'>"}for(M+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+S+"'>"+(/all|left/.test(S)&&0===w?Y?a:s:"")+(/all|right/.test(S)&&0===w?Y?s:a:"")+this._generateMonthYearHeader(e,Z,et,X,$,w>0||T>0,f,m)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",C=d?"<th class='ui-datepicker-week-col'>"+this._get(e,"weekHeader")+"</th>":"",x=0;7>x;x++)N=(x+u)%7,C+="<th scope='col'"+((x+u+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+c[N]+"'>"+p[N]+"</span></th>";for(M+=C+"</tr></thead><tbody>",A=this._getDaysInMonth(et,Z),et===e.selectedYear&&Z===e.selectedMonth&&(e.selectedDay=Math.min(e.selectedDay,A)),P=(this._getFirstDayOfMonth(et,Z)-u+7)%7,I=Math.ceil((P+A)/7),H=Q?this.maxRows>I?this.maxRows:I:I,this.maxRows=H,z=this._daylightSavingAdjust(new Date(et,Z,1-P)),F=0;H>F;F++){for(M+="<tr>",E=d?"<td class='ui-datepicker-week-col'>"+this._get(e,"calculateWeek")(z)+"</td>":"",x=0;7>x;x++)O=g?g.apply(e.input?e.input[0]:null,[z]):[!0,""],j=z.getMonth()!==Z,W=j&&!y||!O[0]||X&&X>z||$&&z>$,E+="<td class='"+((x+u+6)%7>=5?" ui-datepicker-week-end":"")+(j?" ui-datepicker-other-month":"")+(z.getTime()===D.getTime()&&Z===e.selectedMonth&&e._keyEvent||b.getTime()===z.getTime()&&b.getTime()===D.getTime()?" "+this._dayOverClass:"")+(W?" "+this._unselectableClass+" ui-state-disabled":"")+(j&&!v?"":" "+O[1]+(z.getTime()===G.getTime()?" "+this._currentClass:"")+(z.getTime()===R.getTime()?" ui-datepicker-today":""))+"'"+(j&&!v||!O[2]?"":" title='"+O[2].replace(/'/g,"&#39;")+"'")+(W?"":" data-handler='selectDay' data-event='click' data-month='"+z.getMonth()+"' data-year='"+z.getFullYear()+"'")+">"+(j&&!v?"&#xa0;":W?"<span class='ui-state-default'>"+z.getDate()+"</span>":"<a class='ui-state-default"+(z.getTime()===R.getTime()?" ui-state-highlight":"")+(z.getTime()===G.getTime()?" ui-state-active":"")+(j?" ui-priority-secondary":"")+"' href='#'>"+z.getDate()+"</a>")+"</td>",z.setDate(z.getDate()+1),z=this._daylightSavingAdjust(z);M+=E+"</tr>"}Z++,Z>11&&(Z=0,et++),M+="</tbody></table>"+(Q?"</div>"+(K[0]>0&&T===K[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),k+=M}_+=k}return _+=l,e._keyEvent=!1,_},_generateMonthYearHeader:function(e,t,i,s,n,a,o,r){var h,l,u,d,c,p,f,m,g=this._get(e,"changeMonth"),v=this._get(e,"changeYear"),y=this._get(e,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",_="";if(a||!g)_+="<span class='ui-datepicker-month'>"+o[t]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,_+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",u=0;12>u;u++)(!h||u>=s.getMonth())&&(!l||n.getMonth()>=u)&&(_+="<option value='"+u+"'"+(u===t?" selected='selected'":"")+">"+r[u]+"</option>");_+="</select>"}if(y||(b+=_+(!a&&g&&v?"":"&#xa0;")),!e.yearshtml)if(e.yearshtml="",a||!v)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(d=this._get(e,"yearRange").split(":"),c=(new Date).getFullYear(),p=function(e){var t=e.match(/c[+\-].*/)?i+parseInt(e.substring(1),10):e.match(/[+\-].*/)?c+parseInt(e,10):parseInt(e,10);return isNaN(t)?c:t},f=p(d[0]),m=Math.max(f,p(d[1]||"")),f=s?Math.max(f,s.getFullYear()):f,m=n?Math.min(m,n.getFullYear()):m,e.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";m>=f;f++)e.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";e.yearshtml+="</select>",b+=e.yearshtml,e.yearshtml=null}return b+=this._get(e,"yearSuffix"),y&&(b+=(!a&&g&&v?"":"&#xa0;")+_),b+="</div>"},_adjustInstDate:function(e,t,i){var s=e.drawYear+("Y"===i?t:0),n=e.drawMonth+("M"===i?t:0),a=Math.min(e.selectedDay,this._getDaysInMonth(s,n))+("D"===i?t:0),o=this._restrictMinMax(e,this._daylightSavingAdjust(new Date(s,n,a)));e.selectedDay=o.getDate(),e.drawMonth=e.selectedMonth=o.getMonth(),e.drawYear=e.selectedYear=o.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(e)},_restrictMinMax:function(e,t){var i=this._getMinMaxDate(e,"min"),s=this._getMinMaxDate(e,"max"),n=i&&i>t?i:t;return s&&n>s?s:n},_notifyChange:function(e){var t=this._get(e,"onChangeMonthYear");t&&t.apply(e.input?e.input[0]:null,[e.selectedYear,e.selectedMonth+1,e])},_getNumberOfMonths:function(e){var t=this._get(e,"numberOfMonths");return null==t?[1,1]:"number"==typeof t?[1,t]:t},_getMinMaxDate:function(e,t){return this._determineDate(e,this._get(e,t+"Date"),null)},_getDaysInMonth:function(e,t){return 32-this._daylightSavingAdjust(new Date(e,t,32)).getDate()},_getFirstDayOfMonth:function(e,t){return new Date(e,t,1).getDay()},_canAdjustMonth:function(e,t,i,s){var n=this._getNumberOfMonths(e),a=this._daylightSavingAdjust(new Date(i,s+(0>t?t:n[0]*n[1]),1));return 0>t&&a.setDate(this._getDaysInMonth(a.getFullYear(),a.getMonth())),this._isInRange(e,a)},_isInRange:function(e,t){var i,s,n=this._getMinMaxDate(e,"min"),a=this._getMinMaxDate(e,"max"),o=null,r=null,h=this._get(e,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),o=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(o+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||t.getTime()>=n.getTime())&&(!a||t.getTime()<=a.getTime())&&(!o||t.getFullYear()>=o)&&(!r||r>=t.getFullYear())},_getFormatConfig:function(e){var t=this._get(e,"shortYearCutoff");return t="string"!=typeof t?t:(new Date).getFullYear()%100+parseInt(t,10),{shortYearCutoff:t,dayNamesShort:this._get(e,"dayNamesShort"),dayNames:this._get(e,"dayNames"),monthNamesShort:this._get(e,"monthNamesShort"),monthNames:this._get(e,"monthNames")}},_formatDate:function(e,t,i,s){t||(e.currentDay=e.selectedDay,e.currentMonth=e.selectedMonth,e.currentYear=e.selectedYear);var n=t?"object"==typeof t?t:this._daylightSavingAdjust(new Date(s,i,t)):this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return this.formatDate(this._get(e,"dateFormat"),n,this._getFormatConfig(e))}}),e.fn.datepicker=function(t){if(!this.length)return this;e.datepicker.initialized||(e(document).mousedown(e.datepicker._checkExternalClick),e.datepicker.initialized=!0),0===e("#"+e.datepicker._mainDivId).length&&e("body").append(e.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof t||"isDisabled"!==t&&"getDate"!==t&&"widget"!==t?"option"===t&&2===arguments.length&&"string"==typeof arguments[1]?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof t?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this].concat(i)):e.datepicker._attachDatepicker(this,t)}):e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i))},e.datepicker=new n,e.datepicker.initialized=!1,e.datepicker.uuid=(new Date).getTime(),e.datepicker.version="1.11.4",e.datepicker,e.widget("ui.draggable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._setHandleClassName(),this._mouseInit()},_setOption:function(e,t){this._super(e,t),"handle"===e&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(t){var i=this.options;return this._blurActiveElement(t),this.helper||i.disabled||e(t.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(t),this.handle?(this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(t){this.iframeBlocks=this.document.find(t).map(function(){var t=e(this);return e("<div>").css("position","absolute").appendTo(t.parent()).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(t){var i=this.document[0];if(this.handleElement.is(t.target))try{i.activeElement&&"body"!==i.activeElement.nodeName.toLowerCase()&&e(i.activeElement).blur()}catch(s){}},_mouseStart:function(t){var i=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===e(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(t),this.originalPosition=this.position=this._generatePosition(t,!1),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._normalizeRightBottom(),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_refreshOffsets:function(e){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:e.pageX-this.offset.left,top:e.pageY-this.offset.top}},_mouseDrag:function(t,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(t,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",t,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var i=this,s=!1;return e.ui.ddmanager&&!this.options.dropBehaviour&&(s=e.ui.ddmanager.drop(this,t)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",t)!==!1&&i._clear()}):this._trigger("stop",t)!==!1&&this._clear(),!1},_mouseUp:function(t){return this._unblockFrames(),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),this.handleElement.is(t.target)&&this.element.focus(),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){return this.options.handle?!!e(t.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this.handleElement.addClass("ui-draggable-handle")},_removeHandleClassName:function(){this.handleElement.removeClass("ui-draggable-handle")},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper),n=s?e(i.helper.apply(this.element[0],[t])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return n.parents("body").length||n.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css("position"))||n.css("position","absolute"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_isRootNode:function(e){return/(html|body)/i.test(e.tagName)||e===this.document[0]},_getParentOffset:function(){var t=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var e=this.element.position(),t=this._isRootNode(this.scrollParent[0]);return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+(t?0:this.scrollParent.scrollTop()),left:e.left-(parseInt(this.helper.css("left"),10)||0)+(t?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options,a=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,e(window).scrollLeft()+e(window).width()-this.helperProportions.width-this.margins.left,e(window).scrollTop()+(e(window).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,e(a).width()-this.helperProportions.width-this.margins.left,(e(a).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=e(n.containment),s=i[0],s&&(t=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(t?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(t?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0) +},_convertPositionTo:function(e,t){t||(t=this.position);var i="absolute"===e?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:t.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:t.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(e,t){var i,s,n,a,o=this.options,r=this._isRootNode(this.scrollParent[0]),h=e.pageX,l=e.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),t&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,e.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),e.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),e.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),o.grid&&(n=o.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-o.grid[1]:n+o.grid[1]:n,a=o.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,h=i?a-this.offset.click.left>=i[0]||a-this.offset.click.left>i[2]?a:a-this.offset.click.left>=i[0]?a-o.grid[0]:a+o.grid[0]:a),"y"===o.axis&&(h=this.originalPageX),"x"===o.axis&&(l=this.originalPageY)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_normalizeRightBottom:function(){"y"!==this.options.axis&&"auto"!==this.helper.css("right")&&(this.helper.width(this.helper.width()),this.helper.css("right","auto")),"x"!==this.options.axis&&"auto"!==this.helper.css("bottom")&&(this.helper.height(this.helper.height()),this.helper.css("bottom","auto"))},_trigger:function(t,i,s){return s=s||this._uiHash(),e.ui.plugin.call(this,t,[i,s,this],!0),/^(drag|start|stop)/.test(t)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),e.Widget.prototype._trigger.call(this,t,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add("draggable","connectToSortable",{start:function(t,i,s){var n=e.extend({},i,{item:s.element});s.sortables=[],e(s.options.connectToSortable).each(function(){var i=e(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",t,n))})},stop:function(t,i,s){var n=e.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,e.each(s.sortables,function(){var e=this;e.isOver?(e.isOver=0,s.cancelHelperRemoval=!0,e.cancelHelperRemoval=!1,e._storedCSS={position:e.placeholder.css("position"),top:e.placeholder.css("top"),left:e.placeholder.css("left")},e._mouseStop(t),e.options.helper=e.options._helper):(e.cancelHelperRemoval=!0,e._trigger("deactivate",t,n))})},drag:function(t,i,s){e.each(s.sortables,function(){var n=!1,a=this;a.positionAbs=s.positionAbs,a.helperProportions=s.helperProportions,a.offset.click=s.offset.click,a._intersectsWith(a.containerCache)&&(n=!0,e.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==a&&this._intersectsWith(this.containerCache)&&e.contains(a.element[0],this.element[0])&&(n=!1),n})),n?(a.isOver||(a.isOver=1,s._parent=i.helper.parent(),a.currentItem=i.helper.appendTo(a.element).data("ui-sortable-item",!0),a.options._helper=a.options.helper,a.options.helper=function(){return i.helper[0]},t.target=a.currentItem[0],a._mouseCapture(t,!0),a._mouseStart(t,!0,!0),a.offset.click.top=s.offset.click.top,a.offset.click.left=s.offset.click.left,a.offset.parent.left-=s.offset.parent.left-a.offset.parent.left,a.offset.parent.top-=s.offset.parent.top-a.offset.parent.top,s._trigger("toSortable",t),s.dropped=a.element,e.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,a.fromOutside=s),a.currentItem&&(a._mouseDrag(t),i.position=a.position)):a.isOver&&(a.isOver=0,a.cancelHelperRemoval=!0,a.options._revert=a.options.revert,a.options.revert=!1,a._trigger("out",t,a._uiHash(a)),a._mouseStop(t,!0),a.options.revert=a.options._revert,a.options.helper=a.options._helper,a.placeholder&&a.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(t),i.position=s._generatePosition(t,!0),s._trigger("fromSortable",t),s.dropped=!1,e.each(s.sortables,function(){this.refreshPositions()}))})}}),e.ui.plugin.add("draggable","cursor",{start:function(t,i,s){var n=e("body"),a=s.options;n.css("cursor")&&(a._cursor=n.css("cursor")),n.css("cursor",a.cursor)},stop:function(t,i,s){var n=s.options;n._cursor&&e("body").css("cursor",n._cursor)}}),e.ui.plugin.add("draggable","opacity",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("opacity")&&(a._opacity=n.css("opacity")),n.css("opacity",a.opacity)},stop:function(t,i,s){var n=s.options;n._opacity&&e(i.helper).css("opacity",n._opacity)}}),e.ui.plugin.add("draggable","scroll",{start:function(e,t,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(t,i,s){var n=s.options,a=!1,o=s.scrollParentNotHidden[0],r=s.document[0];o!==r&&"HTML"!==o.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+o.offsetHeight-t.pageY<n.scrollSensitivity?o.scrollTop=a=o.scrollTop+n.scrollSpeed:t.pageY-s.overflowOffset.top<n.scrollSensitivity&&(o.scrollTop=a=o.scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+o.offsetWidth-t.pageX<n.scrollSensitivity?o.scrollLeft=a=o.scrollLeft+n.scrollSpeed:t.pageX-s.overflowOffset.left<n.scrollSensitivity&&(o.scrollLeft=a=o.scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(t.pageY-e(r).scrollTop()<n.scrollSensitivity?a=e(r).scrollTop(e(r).scrollTop()-n.scrollSpeed):e(window).height()-(t.pageY-e(r).scrollTop())<n.scrollSensitivity&&(a=e(r).scrollTop(e(r).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(t.pageX-e(r).scrollLeft()<n.scrollSensitivity?a=e(r).scrollLeft(e(r).scrollLeft()-n.scrollSpeed):e(window).width()-(t.pageX-e(r).scrollLeft())<n.scrollSensitivity&&(a=e(r).scrollLeft(e(r).scrollLeft()+n.scrollSpeed)))),a!==!1&&e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(s,t)}}),e.ui.plugin.add("draggable","snap",{start:function(t,i,s){var n=s.options;s.snapElements=[],e(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var t=e(this),i=t.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:t.outerWidth(),height:t.outerHeight(),top:i.top,left:i.left})})},drag:function(t,i,s){var n,a,o,r,h,l,u,d,c,p,f=s.options,m=f.snapTolerance,g=i.offset.left,v=g+s.helperProportions.width,y=i.offset.top,b=y+s.helperProportions.height;for(c=s.snapElements.length-1;c>=0;c--)h=s.snapElements[c].left-s.margins.left,l=h+s.snapElements[c].width,u=s.snapElements[c].top-s.margins.top,d=u+s.snapElements[c].height,h-m>v||g>l+m||u-m>b||y>d+m||!e.contains(s.snapElements[c].item.ownerDocument,s.snapElements[c].item)?(s.snapElements[c].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=!1):("inner"!==f.snapMode&&(n=m>=Math.abs(u-b),a=m>=Math.abs(d-y),o=m>=Math.abs(h-v),r=m>=Math.abs(l-g),n&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left)),p=n||a||o||r,"outer"!==f.snapMode&&(n=m>=Math.abs(u-y),a=m>=Math.abs(d-b),o=m>=Math.abs(h-g),r=m>=Math.abs(l-v),n&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d-s.helperProportions.height,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left)),!s.snapElements[c].snapping&&(n||a||o||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=n||a||o||r||p)}}),e.ui.plugin.add("draggable","stack",{start:function(t,i,s){var n,a=s.options,o=e.makeArray(e(a.stack)).sort(function(t,i){return(parseInt(e(t).css("zIndex"),10)||0)-(parseInt(e(i).css("zIndex"),10)||0)});o.length&&(n=parseInt(e(o[0]).css("zIndex"),10)||0,e(o).each(function(t){e(this).css("zIndex",n+t)}),this.css("zIndex",n+o.length))}}),e.ui.plugin.add("draggable","zIndex",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("zIndex")&&(a._zIndex=n.css("zIndex")),n.css("zIndex",a.zIndex)},stop:function(t,i,s){var n=s.options;n._zIndex&&e(i.helper).css("zIndex",n._zIndex)}}),e.ui.draggable,e.widget("ui.resizable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(e){return parseInt(e,10)||0},_isNumber:function(e){return!isNaN(parseInt(e,10))},_hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return t[s]>0?!0:(t[s]=1,n=t[s]>0,t[s]=0,n)},_create:function(){var t,i,s,n,a,o=this,r=this.options;if(this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(e("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=e(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),t=this.handles.split(","),this.handles={},i=0;t.length>i;i++)s=e.trim(t[i]),a="ui-resizable-"+s,n=e("<div class='ui-resizable-handle "+a+"'></div>"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(t){var i,s,n,a;t=t||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=e(this.handles[i]),this._on(this.handles[i],{mousedown:o._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=e(this.handles[i],this.element),a=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),t.css(n,a),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.mouseover(function(){o.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),o.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(e(this).removeClass("ui-resizable-autohide"),o._handles.show())}).mouseleave(function(){r.disabled||o.resizing||(e(this).addClass("ui-resizable-autohide"),o._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t,i=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),t=this.element,this.originalElement.css({position:t.css("position"),width:t.outerWidth(),height:t.outerHeight(),top:t.css("top"),left:t.css("left")}).insertAfter(t),t.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(t){var i,s,n=!1;for(i in this.handles)s=e(this.handles[i])[0],(s===t.target||e.contains(s,t.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(t){var i,s,n,a=this.options,o=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),a.containment&&(i+=e(a.containment).scrollLeft()||0,s+=e(a.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:o.width(),height:o.height()},this.originalSize=this._helper?{width:o.outerWidth(),height:o.outerHeight()}:{width:o.width(),height:o.height()},this.sizeDiff={width:o.outerWidth()-o.width(),height:o.outerHeight()-o.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof a.aspectRatio?a.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=e(".ui-resizable-"+this.axis).css("cursor"),e("body").css("cursor","auto"===n?this.axis+"-resize":n),o.addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var i,s,n=this.originalMousePosition,a=this.axis,o=t.pageX-n.left||0,r=t.pageY-n.top||0,h=this._change[a];return this._updatePrevProperties(),h?(i=h.apply(this,[t,o,r]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(i=this._updateRatio(i,t)),i=this._respectSize(i,t),this._updateCache(i),this._propagate("resize",t),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),e.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(t){this.resizing=!1;var i,s,n,a,o,r,h,l=this.options,u=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:u.sizeDiff.height,a=s?0:u.sizeDiff.width,o={width:u.helper.width()-a,height:u.helper.height()-n},r=parseInt(u.element.css("left"),10)+(u.position.left-u.originalPosition.left)||null,h=parseInt(u.element.css("top"),10)+(u.position.top-u.originalPosition.top)||null,l.animate||this.element.css(e.extend(o,{top:h,left:r})),u.helper.height(u.size.height),u.helper.width(u.size.width),this._helper&&!l.animate&&this._proportionallyResize()),e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var e={};return this.position.top!==this.prevPosition.top&&(e.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(e.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(e.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(e.height=this.size.height+"px"),this.helper.css(e),e},_updateVirtualBoundaries:function(e){var t,i,s,n,a,o=this.options;a={minWidth:this._isNumber(o.minWidth)?o.minWidth:0,maxWidth:this._isNumber(o.maxWidth)?o.maxWidth:1/0,minHeight:this._isNumber(o.minHeight)?o.minHeight:0,maxHeight:this._isNumber(o.maxHeight)?o.maxHeight:1/0},(this._aspectRatio||e)&&(t=a.minHeight*this.aspectRatio,s=a.minWidth/this.aspectRatio,i=a.maxHeight*this.aspectRatio,n=a.maxWidth/this.aspectRatio,t>a.minWidth&&(a.minWidth=t),s>a.minHeight&&(a.minHeight=s),a.maxWidth>i&&(a.maxWidth=i),a.maxHeight>n&&(a.maxHeight=n)),this._vBoundaries=a},_updateCache:function(e){this.offset=this.helper.offset(),this._isNumber(e.left)&&(this.position.left=e.left),this._isNumber(e.top)&&(this.position.top=e.top),this._isNumber(e.height)&&(this.size.height=e.height),this._isNumber(e.width)&&(this.size.width=e.width)},_updateRatio:function(e){var t=this.position,i=this.size,s=this.axis;return this._isNumber(e.height)?e.width=e.height*this.aspectRatio:this._isNumber(e.width)&&(e.height=e.width/this.aspectRatio),"sw"===s&&(e.left=t.left+(i.width-e.width),e.top=null),"nw"===s&&(e.top=t.top+(i.height-e.height),e.left=t.left+(i.width-e.width)),e},_respectSize:function(e){var t=this._vBoundaries,i=this.axis,s=this._isNumber(e.width)&&t.maxWidth&&t.maxWidth<e.width,n=this._isNumber(e.height)&&t.maxHeight&&t.maxHeight<e.height,a=this._isNumber(e.width)&&t.minWidth&&t.minWidth>e.width,o=this._isNumber(e.height)&&t.minHeight&&t.minHeight>e.height,r=this.originalPosition.left+this.originalSize.width,h=this.position.top+this.size.height,l=/sw|nw|w/.test(i),u=/nw|ne|n/.test(i);return a&&(e.width=t.minWidth),o&&(e.height=t.minHeight),s&&(e.width=t.maxWidth),n&&(e.height=t.maxHeight),a&&l&&(e.left=r-t.minWidth),s&&l&&(e.left=r-t.maxWidth),o&&u&&(e.top=h-t.minHeight),n&&u&&(e.top=h-t.maxHeight),e.width||e.height||e.left||!e.top?e.width||e.height||e.top||!e.left||(e.left=null):e.top=null,e},_getPaddingPlusBorderDimensions:function(e){for(var t=0,i=[],s=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],n=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];4>t;t++)i[t]=parseInt(s[t],10)||0,i[t]+=parseInt(n[t],10)||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var e,t=0,i=this.helper||this.element;this._proportionallyResizeElements.length>t;t++)e=this._proportionallyResizeElements[t],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(e)),e.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var t=this.element,i=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||e("<div style='overflow:hidden;'></div>"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(e,t){return{width:this.originalSize.width+t}},w:function(e,t){var i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(e,t,i){return{height:this.originalSize.height+i}},se:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},sw:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,i,s]))},ne:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},nw:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,i,s]))}},_propagate:function(t,i){e.ui.plugin.call(this,t,[i,this.ui()]),"resize"!==t&&this._trigger(t,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add("resizable","animate",{stop:function(t){var i=e(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,a=n.length&&/textarea/i.test(n[0].nodeName),o=a&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=a?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-o},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,u=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(e.extend(h,u&&l?{top:u,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&e(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(){var t,i,s,n,a,o,r,h=e(this).resizable("instance"),l=h.options,u=h.element,d=l.containment,c=d instanceof e?d.get(0):/parent/.test(d)?u.parent().get(0):d;c&&(h.containerElement=e(c),/document/.test(d)||d===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}):(t=e(c),i=[],e(["Top","Right","Left","Bottom"]).each(function(e,s){i[e]=h._num(t.css("padding"+s))}),h.containerOffset=t.offset(),h.containerPosition=t.position(),h.containerSize={height:t.innerHeight()-i[3],width:t.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,a=h.containerSize.width,o=h._hasScroll(c,"left")?c.scrollWidth:a,r=h._hasScroll(c)?c.scrollHeight:n,h.parentData={element:c,left:s.left,top:s.top,width:o,height:r}))},resize:function(t){var i,s,n,a,o=e(this).resizable("instance"),r=o.options,h=o.containerOffset,l=o.position,u=o._aspectRatio||t.shiftKey,d={top:0,left:0},c=o.containerElement,p=!0;c[0]!==document&&/static/.test(c.css("position"))&&(d=h),l.left<(o._helper?h.left:0)&&(o.size.width=o.size.width+(o._helper?o.position.left-h.left:o.position.left-d.left),u&&(o.size.height=o.size.width/o.aspectRatio,p=!1),o.position.left=r.helper?h.left:0),l.top<(o._helper?h.top:0)&&(o.size.height=o.size.height+(o._helper?o.position.top-h.top:o.position.top),u&&(o.size.width=o.size.height*o.aspectRatio,p=!1),o.position.top=o._helper?h.top:0),n=o.containerElement.get(0)===o.element.parent().get(0),a=/relative|absolute/.test(o.containerElement.css("position")),n&&a?(o.offset.left=o.parentData.left+o.position.left,o.offset.top=o.parentData.top+o.position.top):(o.offset.left=o.element.offset().left,o.offset.top=o.element.offset().top),i=Math.abs(o.sizeDiff.width+(o._helper?o.offset.left-d.left:o.offset.left-h.left)),s=Math.abs(o.sizeDiff.height+(o._helper?o.offset.top-d.top:o.offset.top-h.top)),i+o.size.width>=o.parentData.width&&(o.size.width=o.parentData.width-i,u&&(o.size.height=o.size.width/o.aspectRatio,p=!1)),s+o.size.height>=o.parentData.height&&(o.size.height=o.parentData.height-s,u&&(o.size.width=o.size.height*o.aspectRatio,p=!1)),p||(o.position.left=o.prevPosition.left,o.position.top=o.prevPosition.top,o.size.width=o.prevSize.width,o.size.height=o.prevSize.height)},stop:function(){var t=e(this).resizable("instance"),i=t.options,s=t.containerOffset,n=t.containerPosition,a=t.containerElement,o=e(t.helper),r=o.offset(),h=o.outerWidth()-t.sizeDiff.width,l=o.outerHeight()-t.sizeDiff.height;t._helper&&!i.animate&&/relative/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l}),t._helper&&!i.animate&&/static/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),e.ui.plugin.add("resizable","alsoResize",{start:function(){var t=e(this).resizable("instance"),i=t.options;e(i.alsoResize).each(function(){var t=e(this);t.data("ui-resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})},resize:function(t,i){var s=e(this).resizable("instance"),n=s.options,a=s.originalSize,o=s.originalPosition,r={height:s.size.height-a.height||0,width:s.size.width-a.width||0,top:s.position.top-o.top||0,left:s.position.left-o.left||0};e(n.alsoResize).each(function(){var t=e(this),s=e(this).data("ui-resizable-alsoresize"),n={},a=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(a,function(e,t){var i=(s[t]||0)+(r[t]||0);i&&i>=0&&(n[t]=i||null)}),t.css(n)})},stop:function(){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","ghost",{start:function(){var t=e(this).resizable("instance"),i=t.options,s=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),t.ghost.appendTo(t.helper)},resize:function(){var t=e(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=e(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(){var t,i=e(this).resizable("instance"),s=i.options,n=i.size,a=i.originalSize,o=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,u=h[1]||1,d=Math.round((n.width-a.width)/l)*l,c=Math.round((n.height-a.height)/u)*u,p=a.width+d,f=a.height+c,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,v=s.minWidth&&s.minWidth>p,y=s.minHeight&&s.minHeight>f;s.grid=h,v&&(p+=l),y&&(f+=u),m&&(p-=l),g&&(f-=u),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=o.top-c):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=o.left-d):((0>=f-u||0>=p-l)&&(t=i._getPaddingPlusBorderDimensions(this)),f-u>0?(i.size.height=f,i.position.top=o.top-c):(f=u-t.height,i.size.height=f,i.position.top=o.top+a.height-f),p-l>0?(i.size.width=p,i.position.left=o.left-d):(p=l-t.width,i.size.width=p,i.position.left=o.left+a.width-p))}}),e.ui.resizable,e.widget("ui.dialog",{version:"1.11.4",options:{appendTo:"body",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:"Close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(t){var i=e(this).css(t).offset().top;0>i&&e(this).css("top",t.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),this.options.title=this.options.title||this.originalTitle,this._createWrapper(),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(this.uiDialog),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&e.fn.draggable&&this._makeDraggable(),this.options.resizable&&e.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var t=this.options.appendTo;return t&&(t.jquery||t.nodeType)?e(t):this.document.find(t||"body").eq(0)},_destroy:function(){var e,t=this.originalPosition;this._untrackInstance(),this._destroyOverlay(),this.element.removeUniqueId().removeClass("ui-dialog-content ui-widget-content").css(this.originalCss).detach(),this.uiDialog.stop(!0,!0).remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),e=t.parent.children().eq(t.index),e.length&&e[0]!==this.element[0]?e.before(this.element):t.parent.append(this.element)},widget:function(){return this.uiDialog},disable:e.noop,enable:e.noop,close:function(t){var i,s=this;if(this._isOpen&&this._trigger("beforeClose",t)!==!1){if(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),!this.opener.filter(":focusable").focus().length)try{i=this.document[0].activeElement,i&&"body"!==i.nodeName.toLowerCase()&&e(i).blur()}catch(n){}this._hide(this.uiDialog,this.options.hide,function(){s._trigger("close",t)})}},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(t,i){var s=!1,n=this.uiDialog.siblings(".ui-front:visible").map(function(){return+e(this).css("z-index")}).get(),a=Math.max.apply(null,n);return a>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",a+1),s=!0),s&&!i&&this._trigger("focus",t),s},open:function(){var t=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=e(this.document[0].activeElement),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){t._focusTabbable(),t._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"),void 0)},_focusTabbable:function(){var e=this._focusedElement;e||(e=this.element.find("[autofocus]")),e.length||(e=this.element.find(":tabbable")),e.length||(e=this.uiDialogButtonPane.find(":tabbable")),e.length||(e=this.uiDialogTitlebarClose.filter(":tabbable")),e.length||(e=this.uiDialog),e.eq(0).focus()},_keepFocus:function(t){function i(){var t=this.document[0].activeElement,i=this.uiDialog[0]===t||e.contains(this.uiDialog[0],t);i||this._focusTabbable()}t.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=e("<div>").addClass("ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "+this.options.dialogClass).hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._on(this.uiDialog,{keydown:function(t){if(this.options.closeOnEscape&&!t.isDefaultPrevented()&&t.keyCode&&t.keyCode===e.ui.keyCode.ESCAPE)return t.preventDefault(),this.close(t),void 0; +if(t.keyCode===e.ui.keyCode.TAB&&!t.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");t.target!==n[0]&&t.target!==this.uiDialog[0]||t.shiftKey?t.target!==s[0]&&t.target!==this.uiDialog[0]||!t.shiftKey||(this._delay(function(){n.focus()}),t.preventDefault()):(this._delay(function(){s.focus()}),t.preventDefault())}},mousedown:function(e){this._moveToTop(e)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var t;this.uiDialogTitlebar=e("<div>").addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(this.uiDialog),this._on(this.uiDialogTitlebar,{mousedown:function(t){e(t.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.focus()}}),this.uiDialogTitlebarClose=e("<button type='button'></button>").button({label:this.options.closeText,icons:{primary:"ui-icon-closethick"},text:!1}).addClass("ui-dialog-titlebar-close").appendTo(this.uiDialogTitlebar),this._on(this.uiDialogTitlebarClose,{click:function(e){e.preventDefault(),this.close(e)}}),t=e("<span>").uniqueId().addClass("ui-dialog-title").prependTo(this.uiDialogTitlebar),this._title(t),this.uiDialog.attr({"aria-labelledby":t.attr("id")})},_title:function(e){this.options.title||e.html("&#160;"),e.text(this.options.title)},_createButtonPane:function(){this.uiDialogButtonPane=e("<div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),this.uiButtonSet=e("<div>").addClass("ui-dialog-buttonset").appendTo(this.uiDialogButtonPane),this._createButtons()},_createButtons:function(){var t=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),e.isEmptyObject(i)||e.isArray(i)&&!i.length?(this.uiDialog.removeClass("ui-dialog-buttons"),void 0):(e.each(i,function(i,s){var n,a;s=e.isFunction(s)?{click:s,text:i}:s,s=e.extend({type:"button"},s),n=s.click,s.click=function(){n.apply(t.element[0],arguments)},a={icons:s.icons,text:s.showText},delete s.icons,delete s.showText,e("<button></button>",s).button(a).appendTo(t.uiButtonSet)}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function t(e){return{position:e.position,offset:e.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){e(this).addClass("ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,t(n))},drag:function(e,s){i._trigger("drag",e,t(s))},stop:function(n,a){var o=a.offset.left-i.document.scrollLeft(),r=a.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(o>=0?"+":"")+o+" "+"top"+(r>=0?"+":"")+r,of:i.window},e(this).removeClass("ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,t(a))}})},_makeResizable:function(){function t(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}var i=this,s=this.options,n=s.resizable,a=this.uiDialog.css("position"),o="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:o,start:function(s,n){e(this).addClass("ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,t(n))},resize:function(e,s){i._trigger("resize",e,t(s))},stop:function(n,a){var o=i.uiDialog.offset(),r=o.left-i.document.scrollLeft(),h=o.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(h>=0?"+":"")+h,of:i.window},e(this).removeClass("ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,t(a))}}).css("position",a)},_trackFocus:function(){this._on(this.widget(),{focusin:function(t){this._makeFocusTarget(),this._focusedElement=e(t.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var t=this._trackingInstances(),i=e.inArray(this,t);-1!==i&&t.splice(i,1)},_trackingInstances:function(){var e=this.document.data("ui-dialog-instances");return e||(e=[],this.document.data("ui-dialog-instances",e)),e},_minHeight:function(){var e=this.options;return"auto"===e.height?e.minHeight:Math.min(e.minHeight,e.height)},_position:function(){var e=this.uiDialog.is(":visible");e||this.uiDialog.show(),this.uiDialog.position(this.options.position),e||this.uiDialog.hide()},_setOptions:function(t){var i=this,s=!1,n={};e.each(t,function(e,t){i._setOption(e,t),e in i.sizeRelatedOptions&&(s=!0),e in i.resizableRelatedOptions&&(n[e]=t)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(e,t){var i,s,n=this.uiDialog;"dialogClass"===e&&n.removeClass(this.options.dialogClass).addClass(t),"disabled"!==e&&(this._super(e,t),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:""+t}),"draggable"===e&&(i=n.is(":data(ui-draggable)"),i&&!t&&n.draggable("destroy"),!i&&t&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(s=n.is(":data(ui-resizable)"),s&&!t&&n.resizable("destroy"),s&&"string"==typeof t&&n.resizable("option","handles",t),s||t===!1||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var e,t,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),e=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),t=Math.max(0,s.minHeight-e),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-e):"none","auto"===s.height?this.element.css({minHeight:t,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-e)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var t=e(this);return e("<div>").css({position:"absolute",width:t.outerWidth(),height:t.outerHeight()}).appendTo(t.parent()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(t){return e(t.target).closest(".ui-dialog").length?!0:!!e(t.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var t=!0;this._delay(function(){t=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(e){t||this._allowInteraction(e)||(e.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=e("<div>").addClass("ui-widget-overlay ui-front").appendTo(this._appendTo()),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var e=this.document.data("ui-dialog-overlays")-1;e?this.document.data("ui-dialog-overlays",e):this.document.unbind("focusin").removeData("ui-dialog-overlays"),this.overlay.remove(),this.overlay=null}}}),e.widget("ui.droppable",{version:"1.11.4",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var t,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=e.isFunction(s)?s:function(e){return e.is(s)},this.proportions=function(){return arguments.length?(t=arguments[0],void 0):t?t:t={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this.element.addClass("ui-droppable")},_addToManager:function(t){e.ui.ddmanager.droppables[t]=e.ui.ddmanager.droppables[t]||[],e.ui.ddmanager.droppables[t].push(this)},_splice:function(e){for(var t=0;e.length>t;t++)e[t]===this&&e.splice(t,1)},_destroy:function(){var t=e.ui.ddmanager.droppables[this.options.scope];this._splice(t),this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(t,i){if("accept"===t)this.accept=e.isFunction(i)?i:function(e){return e.is(i)};else if("scope"===t){var s=e.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(t,i)},_activate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger("activate",t,this.ui(i))},_deactivate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger("deactivate",t,this.ui(i))},_over:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",t,this.ui(i)))},_out:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",t,this.ui(i)))},_drop:function(t,i){var s=i||e.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=e(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&e.ui.intersect(s,e.extend(i,{offset:i.element.offset()}),i.options.tolerance,t)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",t,this.ui(s)),this.element):!1):!1},ui:function(e){return{draggable:e.currentItem||e.element,helper:e.helper,position:e.position,offset:e.positionAbs}}}),e.ui.intersect=function(){function e(e,t,i){return e>=t&&t+i>e}return function(t,i,s,n){if(!i.offset)return!1;var a=(t.positionAbs||t.position.absolute).left+t.margins.left,o=(t.positionAbs||t.position.absolute).top+t.margins.top,r=a+t.helperProportions.width,h=o+t.helperProportions.height,l=i.offset.left,u=i.offset.top,d=l+i.proportions().width,c=u+i.proportions().height;switch(s){case"fit":return a>=l&&d>=r&&o>=u&&c>=h;case"intersect":return a+t.helperProportions.width/2>l&&d>r-t.helperProportions.width/2&&o+t.helperProportions.height/2>u&&c>h-t.helperProportions.height/2;case"pointer":return e(n.pageY,u,i.proportions().height)&&e(n.pageX,l,i.proportions().width);case"touch":return(o>=u&&c>=o||h>=u&&c>=h||u>o&&h>c)&&(a>=l&&d>=a||r>=l&&d>=r||l>a&&r>d);default:return!1}}}(),e.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(t,i){var s,n,a=e.ui.ddmanager.droppables[t.options.scope]||[],o=i?i.type:null,r=(t.currentItem||t.element).find(":data(ui-droppable)").addBack();e:for(s=0;a.length>s;s++)if(!(a[s].options.disabled||t&&!a[s].accept.call(a[s].element[0],t.currentItem||t.element))){for(n=0;r.length>n;n++)if(r[n]===a[s].element[0]){a[s].proportions().height=0;continue e}a[s].visible="none"!==a[s].element.css("display"),a[s].visible&&("mousedown"===o&&a[s]._activate.call(a[s],i),a[s].offset=a[s].element.offset(),a[s].proportions({width:a[s].element[0].offsetWidth,height:a[s].element[0].offsetHeight}))}},drop:function(t,i){var s=!1;return e.each((e.ui.ddmanager.droppables[t.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&e.ui.intersect(t,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],t.currentItem||t.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(t,i){t.element.parentsUntil("body").bind("scroll.droppable",function(){t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)})},drag:function(t,i){t.options.refreshPositions&&e.ui.ddmanager.prepareOffsets(t,i),e.each(e.ui.ddmanager.droppables[t.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,a,o=e.ui.intersect(t,this,this.options.tolerance,i),r=!o&&this.isover?"isout":o&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,a=this.element.parents(":data(ui-droppable)").filter(function(){return e(this).droppable("instance").options.scope===n}),a.length&&(s=e(a[0]).droppable("instance"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(t,i){t.element.parentsUntil("body").unbind("scroll.droppable"),t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)}},e.ui.droppable;var y="ui-effects-",b=e;e.effects={effect:{}},function(e,t){function i(e,t,i){var s=d[t.type]||{};return null==e?i||!t.def?null:t.def:(e=s.floor?~~e:parseFloat(e),isNaN(e)?t.def:s.mod?(e+s.mod)%s.mod:0>e?0:e>s.max?s.max:e)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(e,a){var o,r=a.re.exec(i),h=r&&a.parse(r),l=a.space||"rgba";return h?(o=s[l](h),s[u[l].cache]=o[u[l].cache],n=s._rgba=o._rgba,!1):t}),n.length?("0,0,0,0"===n.join()&&e.extend(n,a.transparent),s):a[i]}function n(e,t,i){return i=(i+1)%1,1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+6*(t-e)*(2/3-i):e}var a,o="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[e[1],e[2],e[3],e[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[2.55*e[1],2.55*e[2],2.55*e[3],e[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(e){return[e[1],e[2]/100,e[3]/100,e[4]]}}],l=e.Color=function(t,i,s,n){return new e.Color.fn.parse(t,i,s,n)},u={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},d={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},c=l.support={},p=e("<p>")[0],f=e.each;p.style.cssText="background-color:rgba(1,1,1,.5)",c.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(u,function(e,t){t.cache="_"+e,t.props.alpha={idx:3,type:"percent",def:1}}),l.fn=e.extend(l.prototype,{parse:function(n,o,r,h){if(n===t)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=e(n).css(o),o=t);var d=this,c=e.type(n),p=this._rgba=[];return o!==t&&(n=[n,o,r,h],c="array"),"string"===c?this.parse(s(n)||a._default):"array"===c?(f(u.rgba.props,function(e,t){p[t.idx]=i(n[t.idx],t)}),this):"object"===c?(n instanceof l?f(u,function(e,t){n[t.cache]&&(d[t.cache]=n[t.cache].slice())}):f(u,function(t,s){var a=s.cache;f(s.props,function(e,t){if(!d[a]&&s.to){if("alpha"===e||null==n[e])return;d[a]=s.to(d._rgba)}d[a][t.idx]=i(n[e],t,!0)}),d[a]&&0>e.inArray(null,d[a].slice(0,3))&&(d[a][3]=1,s.from&&(d._rgba=s.from(d[a])))}),this):t},is:function(e){var i=l(e),s=!0,n=this;return f(u,function(e,a){var o,r=i[a.cache];return r&&(o=n[a.cache]||a.to&&a.to(n._rgba)||[],f(a.props,function(e,i){return null!=r[i.idx]?s=r[i.idx]===o[i.idx]:t})),s}),s},_space:function(){var e=[],t=this;return f(u,function(i,s){t[s.cache]&&e.push(i)}),e.pop()},transition:function(e,t){var s=l(e),n=s._space(),a=u[n],o=0===this.alpha()?l("transparent"):this,r=o[a.cache]||a.to(o._rgba),h=r.slice();return s=s[a.cache],f(a.props,function(e,n){var a=n.idx,o=r[a],l=s[a],u=d[n.type]||{};null!==l&&(null===o?h[a]=l:(u.mod&&(l-o>u.mod/2?o+=u.mod:o-l>u.mod/2&&(o-=u.mod)),h[a]=i((l-o)*t+o,n)))}),this[n](h)},blend:function(t){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(t)._rgba;return l(e.map(i,function(e,t){return(1-s)*n[t]+s*e}))},toRgbaString:function(){var t="rgba(",i=e.map(this._rgba,function(e,t){return null==e?t>2?1:0:e});return 1===i[3]&&(i.pop(),t="rgb("),t+i.join()+")"},toHslaString:function(){var t="hsla(",i=e.map(this.hsla(),function(e,t){return null==e&&(e=t>2?1:0),t&&3>t&&(e=Math.round(100*e)+"%"),e});return 1===i[3]&&(i.pop(),t="hsl("),t+i.join()+")"},toHexString:function(t){var i=this._rgba.slice(),s=i.pop();return t&&i.push(~~(255*s)),"#"+e.map(i,function(e){return e=(e||0).toString(16),1===e.length?"0"+e:e}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,u.hsla.to=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t,i,s=e[0]/255,n=e[1]/255,a=e[2]/255,o=e[3],r=Math.max(s,n,a),h=Math.min(s,n,a),l=r-h,u=r+h,d=.5*u;return t=h===r?0:s===r?60*(n-a)/l+360:n===r?60*(a-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=d?l/u:l/(2-u),[Math.round(t)%360,i,d,null==o?1:o]},u.hsla.from=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t=e[0]/360,i=e[1],s=e[2],a=e[3],o=.5>=s?s*(1+i):s+i-s*i,r=2*s-o;return[Math.round(255*n(r,o,t+1/3)),Math.round(255*n(r,o,t)),Math.round(255*n(r,o,t-1/3)),a]},f(u,function(s,n){var a=n.props,o=n.cache,h=n.to,u=n.from;l.fn[s]=function(s){if(h&&!this[o]&&(this[o]=h(this._rgba)),s===t)return this[o].slice();var n,r=e.type(s),d="array"===r||"object"===r?s:arguments,c=this[o].slice();return f(a,function(e,t){var s=d["object"===r?e:t.idx];null==s&&(s=c[t.idx]),c[t.idx]=i(s,t)}),u?(n=l(u(c)),n[o]=c,n):l(c)},f(a,function(t,i){l.fn[t]||(l.fn[t]=function(n){var a,o=e.type(n),h="alpha"===t?this._hsla?"hsla":"rgba":s,l=this[h](),u=l[i.idx];return"undefined"===o?u:("function"===o&&(n=n.call(this,u),o=e.type(n)),null==n&&i.empty?this:("string"===o&&(a=r.exec(n),a&&(n=u+parseFloat(a[2])*("+"===a[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(t){var i=t.split(" ");f(i,function(t,i){e.cssHooks[i]={set:function(t,n){var a,o,r="";if("transparent"!==n&&("string"!==e.type(n)||(a=s(n)))){if(n=l(a||n),!c.rgba&&1!==n._rgba[3]){for(o="backgroundColor"===i?t.parentNode:t;(""===r||"transparent"===r)&&o&&o.style;)try{r=e.css(o,"backgroundColor"),o=o.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{t.style[i]=n}catch(h){}}},e.fx.step[i]=function(t){t.colorInit||(t.start=l(t.elem,i),t.end=l(t.end),t.colorInit=!0),e.cssHooks[i].set(t.elem,t.start.transition(t.end,t.pos))}})},l.hook(o),e.cssHooks.borderColor={expand:function(e){var t={};return f(["Top","Right","Bottom","Left"],function(i,s){t["border"+s+"Color"]=e}),t}},a=e.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(b),function(){function t(t){var i,s,n=t.ownerDocument.defaultView?t.ownerDocument.defaultView.getComputedStyle(t,null):t.currentStyle,a={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(a[e.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(a[i]=n[i]);return a}function i(t,i){var s,a,o={};for(s in i)a=i[s],t[s]!==a&&(n[s]||(e.fx.step[s]||!isNaN(parseFloat(a)))&&(o[s]=a));return o}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};e.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(t,i){e.fx.step[i]=function(e){("none"!==e.end&&!e.setAttr||1===e.pos&&!e.setAttr)&&(b.style(e.elem,i,e.end),e.setAttr=!0)}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e.effects.animateClass=function(n,a,o,r){var h=e.speed(a,o,r);return this.queue(function(){var a,o=e(this),r=o.attr("class")||"",l=h.children?o.find("*").addBack():o;l=l.map(function(){var i=e(this);return{el:i,start:t(this)}}),a=function(){e.each(s,function(e,t){n[t]&&o[t+"Class"](n[t])})},a(),l=l.map(function(){return this.end=t(this.el[0]),this.diff=i(this.start,this.end),this}),o.attr("class",r),l=l.map(function(){var t=this,i=e.Deferred(),s=e.extend({},h,{queue:!1,complete:function(){i.resolve(t)}});return this.el.animate(this.diff,s),i.promise()}),e.when.apply(e,l.get()).done(function(){a(),e.each(arguments,function(){var t=this.el;e.each(this.diff,function(e){t.css(e,"")})}),h.complete.call(o[0])})})},e.fn.extend({addClass:function(t){return function(i,s,n,a){return s?e.effects.animateClass.call(this,{add:i},s,n,a):t.apply(this,arguments)}}(e.fn.addClass),removeClass:function(t){return function(i,s,n,a){return arguments.length>1?e.effects.animateClass.call(this,{remove:i},s,n,a):t.apply(this,arguments)}}(e.fn.removeClass),toggleClass:function(t){return function(i,s,n,a,o){return"boolean"==typeof s||void 0===s?n?e.effects.animateClass.call(this,s?{add:i}:{remove:i},n,a,o):t.apply(this,arguments):e.effects.animateClass.call(this,{toggle:i},s,n,a)}}(e.fn.toggleClass),switchClass:function(t,i,s,n,a){return e.effects.animateClass.call(this,{add:i,remove:t},s,n,a)}})}(),function(){function t(t,i,s,n){return e.isPlainObject(t)&&(i=t,t=t.effect),t={effect:t},null==i&&(i={}),e.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||e.fx.speeds[i])&&(n=s,s=i,i={}),e.isFunction(s)&&(n=s,s=null),i&&e.extend(t,i),s=s||i.duration,t.duration=e.fx.off?0:"number"==typeof s?s:s in e.fx.speeds?e.fx.speeds[s]:e.fx.speeds._default,t.complete=n||i.complete,t}function i(t){return!t||"number"==typeof t||e.fx.speeds[t]?!0:"string"!=typeof t||e.effects.effect[t]?e.isFunction(t)?!0:"object"!=typeof t||t.effect?!1:!0:!0}e.extend(e.effects,{version:"1.11.4",save:function(e,t){for(var i=0;t.length>i;i++)null!==t[i]&&e.data(y+t[i],e[0].style[t[i]])},restore:function(e,t){var i,s;for(s=0;t.length>s;s++)null!==t[s]&&(i=e.data(y+t[s]),void 0===i&&(i=""),e.css(t[s],i))},setMode:function(e,t){return"toggle"===t&&(t=e.is(":hidden")?"show":"hide"),t},getBaseline:function(e,t){var i,s;switch(e[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=e[0]/t.height}switch(e[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=e[1]/t.width}return{x:s,y:i}},createWrapper:function(t){if(t.parent().is(".ui-effects-wrapper"))return t.parent();var i={width:t.outerWidth(!0),height:t.outerHeight(!0),"float":t.css("float")},s=e("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:t.width(),height:t.height()},a=document.activeElement;try{a.id}catch(o){a=document.body}return t.wrap(s),(t[0]===a||e.contains(t[0],a))&&e(a).focus(),s=t.parent(),"static"===t.css("position")?(s.css({position:"relative"}),t.css({position:"relative"})):(e.extend(i,{position:t.css("position"),zIndex:t.css("z-index")}),e.each(["top","left","bottom","right"],function(e,s){i[s]=t.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),t.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),t.css(n),s.css(i).show()},removeWrapper:function(t){var i=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),(t[0]===i||e.contains(t[0],i))&&e(i).focus()),t},setTransition:function(t,i,s,n){return n=n||{},e.each(i,function(e,i){var a=t.cssUnit(i);a[0]>0&&(n[i]=a[0]*s+a[1])}),n}}),e.fn.extend({effect:function(){function i(t){function i(){e.isFunction(a)&&a.call(n[0]),e.isFunction(t)&&t()}var n=e(this),a=s.complete,r=s.mode;(n.is(":hidden")?"hide"===r:"show"===r)?(n[r](),i()):o.call(n[0],s,i)}var s=t.apply(this,arguments),n=s.mode,a=s.queue,o=e.effects.effect[s.effect];return e.fx.off||!o?n?this[n](s.duration,s.complete):this.each(function(){s.complete&&s.complete.call(this)}):a===!1?this.each(i):this.queue(a||"fx",i)},show:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="show",this.effect.call(this,n)}}(e.fn.show),hide:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(e.fn.hide),toggle:function(e){return function(s){if(i(s)||"boolean"==typeof s)return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(e.fn.toggle),cssUnit:function(t){var i=this.css(t),s=[];return e.each(["em","px","%","pt"],function(e,t){i.indexOf(t)>0&&(s=[parseFloat(i),t])}),s}})}(),function(){var t={};e.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,i){t[i]=function(t){return Math.pow(t,e+2)}}),e.extend(t,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)},Elastic:function(e){return 0===e||1===e?e:-Math.pow(2,8*(e-1))*Math.sin((80*(e-1)-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){for(var t,i=4;((t=Math.pow(2,--i))-1)/11>e;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*t-2)/22-e,2)}}),e.each(t,function(t,i){e.easing["easeIn"+t]=i,e.easing["easeOut"+t]=function(e){return 1-i(1-e)},e.easing["easeInOut"+t]=function(e){return.5>e?i(2*e)/2:1-i(-2*e+2)/2}})}(),e.effects,e.effects.effect.blind=function(t,i){var s,n,a,o=e(this),r=/up|down|vertical/,h=/up|left|vertical|horizontal/,l=["position","top","bottom","left","right","height","width"],u=e.effects.setMode(o,t.mode||"hide"),d=t.direction||"up",c=r.test(d),p=c?"height":"width",f=c?"top":"left",m=h.test(d),g={},v="show"===u;o.parent().is(".ui-effects-wrapper")?e.effects.save(o.parent(),l):e.effects.save(o,l),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n=s[p](),a=parseFloat(s.css(f))||0,g[p]=v?n:0,m||(o.css(c?"bottom":"right",0).css(c?"top":"left","auto").css({position:"absolute"}),g[f]=v?a:n+a),v&&(s.css(p,0),m||s.css(f,a+n)),s.animate(g,{duration:t.duration,easing:t.easing,queue:!1,complete:function(){"hide"===u&&o.hide(),e.effects.restore(o,l),e.effects.removeWrapper(o),i()}})},e.effects.effect.bounce=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"effect"),l="hide"===h,u="show"===h,d=t.direction||"up",c=t.distance,p=t.times||5,f=2*p+(u||l?1:0),m=t.duration/f,g=t.easing,v="up"===d||"down"===d?"top":"left",y="up"===d||"left"===d,b=o.queue(),_=b.length;for((u||l)&&r.push("opacity"),e.effects.save(o,r),o.show(),e.effects.createWrapper(o),c||(c=o["top"===v?"outerHeight":"outerWidth"]()/3),u&&(a={opacity:1},a[v]=0,o.css("opacity",0).css(v,y?2*-c:2*c).animate(a,m,g)),l&&(c/=Math.pow(2,p-1)),a={},a[v]=0,s=0;p>s;s++)n={},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g).animate(a,m,g),c=l?2*c:c/2;l&&(n={opacity:0},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g)),o.queue(function(){l&&o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}),_>1&&b.splice.apply(b,[1,0].concat(b.splice(_,f+1))),o.dequeue()},e.effects.effect.clip=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"hide"),l="show"===h,u=t.direction||"vertical",d="vertical"===u,c=d?"height":"width",p=d?"top":"left",f={};e.effects.save(o,r),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n="IMG"===o[0].tagName?s:o,a=n[c](),l&&(n.css(c,0),n.css(p,a/2)),f[c]=l?a:0,f[p]=l?0:a/2,n.animate(f,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){l||o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}})},e.effects.effect.drop=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","opacity","height","width"],o=e.effects.setMode(n,t.mode||"hide"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h?"pos":"neg",d={opacity:r?1:0};e.effects.save(n,a),n.show(),e.effects.createWrapper(n),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0)/2,r&&n.css("opacity",0).css(l,"pos"===u?-s:s),d[l]=(r?"pos"===u?"+=":"-=":"pos"===u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.explode=function(t,i){function s(){b.push(this),b.length===d*c&&n()}function n(){p.css({visibility:"visible"}),e(b).remove(),m||p.hide(),i()}var a,o,r,h,l,u,d=t.pieces?Math.round(Math.sqrt(t.pieces)):3,c=d,p=e(this),f=e.effects.setMode(p,t.mode||"hide"),m="show"===f,g=p.show().css("visibility","hidden").offset(),v=Math.ceil(p.outerWidth()/c),y=Math.ceil(p.outerHeight()/d),b=[];for(a=0;d>a;a++)for(h=g.top+a*y,u=a-(d-1)/2,o=0;c>o;o++)r=g.left+o*v,l=o-(c-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-o*v,top:-a*y}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:v,height:y,left:r+(m?l*v:0),top:h+(m?u*y:0),opacity:m?0:1}).animate({left:r+(m?0:l*v),top:h+(m?0:u*y),opacity:m?1:0},t.duration||500,t.easing,s)},e.effects.effect.fade=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"toggle");s.animate({opacity:n},{queue:!1,duration:t.duration,easing:t.easing,complete:i})},e.effects.effect.fold=function(t,i){var s,n,a=e(this),o=["position","top","bottom","left","right","height","width"],r=e.effects.setMode(a,t.mode||"hide"),h="show"===r,l="hide"===r,u=t.size||15,d=/([0-9]+)%/.exec(u),c=!!t.horizFirst,p=h!==c,f=p?["width","height"]:["height","width"],m=t.duration/2,g={},v={};e.effects.save(a,o),a.show(),s=e.effects.createWrapper(a).css({overflow:"hidden"}),n=p?[s.width(),s.height()]:[s.height(),s.width()],d&&(u=parseInt(d[1],10)/100*n[l?0:1]),h&&s.css(c?{height:0,width:u}:{height:u,width:0}),g[f[0]]=h?n[0]:u,v[f[1]]=h?n[1]:0,s.animate(g,m,t.easing).animate(v,m,t.easing,function(){l&&a.hide(),e.effects.restore(a,o),e.effects.removeWrapper(a),i()})},e.effects.effect.highlight=function(t,i){var s=e(this),n=["backgroundImage","backgroundColor","opacity"],a=e.effects.setMode(s,t.mode||"show"),o={backgroundColor:s.css("backgroundColor")};"hide"===a&&(o.opacity=0),e.effects.save(s,n),s.show().css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(o,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===a&&s.hide(),e.effects.restore(s,n),i()}})},e.effects.effect.size=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","width","height","overflow","opacity"],h=["position","top","bottom","left","right","overflow","opacity"],l=["width","height","overflow"],u=["fontSize"],d=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],c=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=e.effects.setMode(o,t.mode||"effect"),f=t.restore||"effect"!==p,m=t.scale||"both",g=t.origin||["middle","center"],v=o.css("position"),y=f?r:h,b={height:0,width:0,outerHeight:0,outerWidth:0};"show"===p&&o.show(),s={height:o.height(),width:o.width(),outerHeight:o.outerHeight(),outerWidth:o.outerWidth()},"toggle"===t.mode&&"show"===p?(o.from=t.to||b,o.to=t.from||s):(o.from=t.from||("show"===p?b:s),o.to=t.to||("hide"===p?b:s)),a={from:{y:o.from.height/s.height,x:o.from.width/s.width},to:{y:o.to.height/s.height,x:o.to.width/s.width}},("box"===m||"both"===m)&&(a.from.y!==a.to.y&&(y=y.concat(d),o.from=e.effects.setTransition(o,d,a.from.y,o.from),o.to=e.effects.setTransition(o,d,a.to.y,o.to)),a.from.x!==a.to.x&&(y=y.concat(c),o.from=e.effects.setTransition(o,c,a.from.x,o.from),o.to=e.effects.setTransition(o,c,a.to.x,o.to))),("content"===m||"both"===m)&&a.from.y!==a.to.y&&(y=y.concat(u).concat(l),o.from=e.effects.setTransition(o,u,a.from.y,o.from),o.to=e.effects.setTransition(o,u,a.to.y,o.to)),e.effects.save(o,y),o.show(),e.effects.createWrapper(o),o.css("overflow","hidden").css(o.from),g&&(n=e.effects.getBaseline(g,s),o.from.top=(s.outerHeight-o.outerHeight())*n.y,o.from.left=(s.outerWidth-o.outerWidth())*n.x,o.to.top=(s.outerHeight-o.to.outerHeight)*n.y,o.to.left=(s.outerWidth-o.to.outerWidth)*n.x),o.css(o.from),("content"===m||"both"===m)&&(d=d.concat(["marginTop","marginBottom"]).concat(u),c=c.concat(["marginLeft","marginRight"]),l=r.concat(d).concat(c),o.find("*[width]").each(function(){var i=e(this),s={height:i.height(),width:i.width(),outerHeight:i.outerHeight(),outerWidth:i.outerWidth()}; +f&&e.effects.save(i,l),i.from={height:s.height*a.from.y,width:s.width*a.from.x,outerHeight:s.outerHeight*a.from.y,outerWidth:s.outerWidth*a.from.x},i.to={height:s.height*a.to.y,width:s.width*a.to.x,outerHeight:s.height*a.to.y,outerWidth:s.width*a.to.x},a.from.y!==a.to.y&&(i.from=e.effects.setTransition(i,d,a.from.y,i.from),i.to=e.effects.setTransition(i,d,a.to.y,i.to)),a.from.x!==a.to.x&&(i.from=e.effects.setTransition(i,c,a.from.x,i.from),i.to=e.effects.setTransition(i,c,a.to.x,i.to)),i.css(i.from),i.animate(i.to,t.duration,t.easing,function(){f&&e.effects.restore(i,l)})})),o.animate(o.to,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){0===o.to.opacity&&o.css("opacity",o.from.opacity),"hide"===p&&o.hide(),e.effects.restore(o,y),f||("static"===v?o.css({position:"relative",top:o.to.top,left:o.to.left}):e.each(["top","left"],function(e,t){o.css(t,function(t,i){var s=parseInt(i,10),n=e?o.to.left:o.to.top;return"auto"===i?n+"px":s+n+"px"})})),e.effects.removeWrapper(o),i()}})},e.effects.effect.scale=function(t,i){var s=e(this),n=e.extend(!0,{},t),a=e.effects.setMode(s,t.mode||"effect"),o=parseInt(t.percent,10)||(0===parseInt(t.percent,10)?0:"hide"===a?0:100),r=t.direction||"both",h=t.origin,l={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()},u={y:"horizontal"!==r?o/100:1,x:"vertical"!==r?o/100:1};n.effect="size",n.queue=!1,n.complete=i,"effect"!==a&&(n.origin=h||["middle","center"],n.restore=!0),n.from=t.from||("show"===a?{height:0,width:0,outerHeight:0,outerWidth:0}:l),n.to={height:l.height*u.y,width:l.width*u.x,outerHeight:l.outerHeight*u.y,outerWidth:l.outerWidth*u.x},n.fade&&("show"===a&&(n.from.opacity=0,n.to.opacity=1),"hide"===a&&(n.from.opacity=1,n.to.opacity=0)),s.effect(n)},e.effects.effect.puff=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"hide"),a="hide"===n,o=parseInt(t.percent,10)||150,r=o/100,h={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()};e.extend(t,{effect:"scale",queue:!1,fade:!0,mode:n,complete:i,percent:a?o:100,from:a?h:{height:h.height*r,width:h.width*r,outerHeight:h.outerHeight*r,outerWidth:h.outerWidth*r}}),s.effect(t)},e.effects.effect.pulsate=function(t,i){var s,n=e(this),a=e.effects.setMode(n,t.mode||"show"),o="show"===a,r="hide"===a,h=o||"hide"===a,l=2*(t.times||5)+(h?1:0),u=t.duration/l,d=0,c=n.queue(),p=c.length;for((o||!n.is(":visible"))&&(n.css("opacity",0).show(),d=1),s=1;l>s;s++)n.animate({opacity:d},u,t.easing),d=1-d;n.animate({opacity:d},u,t.easing),n.queue(function(){r&&n.hide(),i()}),p>1&&c.splice.apply(c,[1,0].concat(c.splice(p,l+1))),n.dequeue()},e.effects.effect.shake=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","height","width"],o=e.effects.setMode(n,t.mode||"effect"),r=t.direction||"left",h=t.distance||20,l=t.times||3,u=2*l+1,d=Math.round(t.duration/u),c="up"===r||"down"===r?"top":"left",p="up"===r||"left"===r,f={},m={},g={},v=n.queue(),y=v.length;for(e.effects.save(n,a),n.show(),e.effects.createWrapper(n),f[c]=(p?"-=":"+=")+h,m[c]=(p?"+=":"-=")+2*h,g[c]=(p?"-=":"+=")+2*h,n.animate(f,d,t.easing),s=1;l>s;s++)n.animate(m,d,t.easing).animate(g,d,t.easing);n.animate(m,d,t.easing).animate(f,d/2,t.easing).queue(function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}),y>1&&v.splice.apply(v,[1,0].concat(v.splice(y,u+1))),n.dequeue()},e.effects.effect.slide=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","width","height"],o=e.effects.setMode(n,t.mode||"show"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h,d={};e.effects.save(n,a),n.show(),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0),e.effects.createWrapper(n).css({overflow:"hidden"}),r&&n.css(l,u?isNaN(s)?"-"+s:-s:s),d[l]=(r?u?"+=":"-=":u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.transfer=function(t,i){var s=e(this),n=e(t.to),a="fixed"===n.css("position"),o=e("body"),r=a?o.scrollTop():0,h=a?o.scrollLeft():0,l=n.offset(),u={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},d=s.offset(),c=e("<div class='ui-effects-transfer'></div>").appendTo(document.body).addClass(t.className).css({top:d.top-r,left:d.left-h,height:s.innerHeight(),width:s.innerWidth(),position:a?"fixed":"absolute"}).animate(u,t.duration,t.easing,function(){c.remove(),i()})},e.widget("ui.progressbar",{version:"1.11.4",options:{max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min}),this.valueDiv=e("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove()},value:function(e){return void 0===e?this.options.value:(this.options.value=this._constrainedValue(e),this._refreshValue(),void 0)},_constrainedValue:function(e){return void 0===e&&(e=this.options.value),this.indeterminate=e===!1,"number"!=typeof e&&(e=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,e))},_setOptions:function(e){var t=e.value;delete e.value,this._super(e),this.options.value=this._constrainedValue(t),this._refreshValue()},_setOption:function(e,t){"max"===e&&(t=Math.max(this.min,t)),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var t=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||t>this.min).toggleClass("ui-corner-right",t===this.options.max).width(i.toFixed(0)+"%"),this.element.toggleClass("ui-progressbar-indeterminate",this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=e("<div class='ui-progressbar-overlay'></div>").appendTo(this.valueDiv))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":t}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==t&&(this.oldValue=t,this._trigger("change")),t===this.options.max&&this._trigger("complete")}}),e.widget("ui.selectable",e.ui.mouse,{version:"1.11.4",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var t,i=this;this.element.addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){t=e(i.options.filter,i.element[0]),t.addClass("ui-selectee"),t.each(function(){var t=e(this),i=t.offset();e.data(this,"selectable-item",{element:this,$element:t,left:i.left,top:i.top,right:i.left+t.outerWidth(),bottom:i.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=t.addClass("ui-selectee"),this._mouseInit(),this.helper=e("<div class='ui-selectable-helper'></div>")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(t){var i=this,s=this.options;this.opos=[t.pageX,t.pageY],this.options.disabled||(this.selectees=e(s.filter,this.element[0]),this._trigger("start",t),e(s.appendTo).append(this.helper),this.helper.css({left:t.pageX,top:t.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=e.data(this,"selectable-item");s.startselected=!0,t.metaKey||t.ctrlKey||(s.$element.removeClass("ui-selected"),s.selected=!1,s.$element.addClass("ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",t,{unselecting:s.element}))}),e(t.target).parents().addBack().each(function(){var s,n=e.data(this,"selectable-item");return n?(s=!t.metaKey&&!t.ctrlKey||!n.$element.hasClass("ui-selected"),n.$element.removeClass(s?"ui-unselecting":"ui-selected").addClass(s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",t,{selecting:n.element}):i._trigger("unselecting",t,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(t){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,a=this.opos[0],o=this.opos[1],r=t.pageX,h=t.pageY;return a>r&&(i=r,r=a,a=i),o>h&&(i=h,h=o,o=i),this.helper.css({left:a,top:o,width:r-a,height:h-o}),this.selectees.each(function(){var i=e.data(this,"selectable-item"),l=!1;i&&i.element!==s.element[0]&&("touch"===n.tolerance?l=!(i.left>r||a>i.right||i.top>h||o>i.bottom):"fit"===n.tolerance&&(l=i.left>a&&r>i.right&&i.top>o&&h>i.bottom),l?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,s._trigger("selecting",t,{selecting:i.element}))):(i.selecting&&((t.metaKey||t.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",t,{unselecting:i.element}))),i.selected&&(t.metaKey||t.ctrlKey||i.startselected||(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",t,{unselecting:i.element})))))}),!1}},_mouseStop:function(t){var i=this;return this.dragged=!1,e(".ui-unselecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",t,{unselected:s.element})}),e(".ui-selecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-selecting").addClass("ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",t,{selected:s.element})}),this._trigger("stop",t),this.helper.remove(),!1}}),e.widget("ui.selectmenu",{version:"1.11.4",defaultElement:"<select>",options:{appendTo:null,disabled:null,icons:{button:"ui-icon-triangle-1-s"},position:{my:"left top",at:"left bottom",collision:"none"},width:null,change:null,close:null,focus:null,open:null,select:null},_create:function(){var e=this.element.uniqueId().attr("id");this.ids={element:e,button:e+"-button",menu:e+"-menu"},this._drawButton(),this._drawMenu(),this.options.disabled&&this.disable()},_drawButton:function(){var t=this;this.label=e("label[for='"+this.ids.element+"']").attr("for",this.ids.button),this._on(this.label,{click:function(e){this.button.focus(),e.preventDefault()}}),this.element.hide(),this.button=e("<span>",{"class":"ui-selectmenu-button ui-widget ui-state-default ui-corner-all",tabindex:this.options.disabled?-1:0,id:this.ids.button,role:"combobox","aria-expanded":"false","aria-autocomplete":"list","aria-owns":this.ids.menu,"aria-haspopup":"true"}).insertAfter(this.element),e("<span>",{"class":"ui-icon "+this.options.icons.button}).prependTo(this.button),this.buttonText=e("<span>",{"class":"ui-selectmenu-text"}).appendTo(this.button),this._setText(this.buttonText,this.element.find("option:selected").text()),this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one("focusin",function(){t.menuItems||t._refreshMenu()}),this._hoverable(this.button),this._focusable(this.button)},_drawMenu:function(){var t=this;this.menu=e("<ul>",{"aria-hidden":"true","aria-labelledby":this.ids.button,id:this.ids.menu}),this.menuWrap=e("<div>",{"class":"ui-selectmenu-menu ui-front"}).append(this.menu).appendTo(this._appendTo()),this.menuInstance=this.menu.menu({role:"listbox",select:function(e,i){e.preventDefault(),t._setSelection(),t._select(i.item.data("ui-selectmenu-item"),e)},focus:function(e,i){var s=i.item.data("ui-selectmenu-item");null!=t.focusIndex&&s.index!==t.focusIndex&&(t._trigger("focus",e,{item:s}),t.isOpen||t._select(s,e)),t.focusIndex=s.index,t.button.attr("aria-activedescendant",t.menuItems.eq(s.index).attr("id"))}}).menu("instance"),this.menu.addClass("ui-corner-bottom").removeClass("ui-corner-all"),this.menuInstance._off(this.menu,"mouseleave"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this._setText(this.buttonText,this._getSelectedItem().text()),this.options.width||this._resizeButton()},_refreshMenu:function(){this.menu.empty();var e,t=this.element.find("option");t.length&&(this._parseOptions(t),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find("li").not(".ui-selectmenu-optgroup"),e=this._getSelectedItem(),this.menuInstance.focus(null,e),this._setAria(e.data("ui-selectmenu-item")),this._setOption("disabled",this.element.prop("disabled")))},open:function(e){this.options.disabled||(this.menuItems?(this.menu.find(".ui-state-focus").removeClass("ui-state-focus"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger("open",e))},_position:function(){this.menuWrap.position(e.extend({of:this.button},this.options.position))},close:function(e){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this.range=null,this._off(this.document),this._trigger("close",e))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderMenu:function(t,i){var s=this,n="";e.each(i,function(i,a){a.optgroup!==n&&(e("<li>",{"class":"ui-selectmenu-optgroup ui-menu-divider"+(a.element.parent("optgroup").prop("disabled")?" ui-state-disabled":""),text:a.optgroup}).appendTo(t),n=a.optgroup),s._renderItemData(t,a)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-selectmenu-item",t)},_renderItem:function(t,i){var s=e("<li>");return i.disabled&&s.addClass("ui-state-disabled"),this._setText(s,i.label),s.appendTo(t)},_setText:function(e,t){t?e.text(t):e.html("&#160;")},_move:function(e,t){var i,s,n=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex):(i=this.menuItems.eq(this.element[0].selectedIndex),n+=":not(.ui-state-disabled)"),s="first"===e||"last"===e?i["first"===e?"prevAll":"nextAll"](n).eq(-1):i[e+"All"](n).eq(0),s.length&&this.menuInstance.focus(t,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex)},_toggle:function(e){this[this.isOpen?"close":"open"](e)},_setSelection:function(){var e;this.range&&(window.getSelection?(e=window.getSelection(),e.removeAllRanges(),e.addRange(this.range)):this.range.select(),this.button.focus())},_documentClick:{mousedown:function(t){this.isOpen&&(e(t.target).closest(".ui-selectmenu-menu, #"+this.ids.button).length||this.close(t))}},_buttonEvents:{mousedown:function(){var e;window.getSelection?(e=window.getSelection(),e.rangeCount&&(this.range=e.getRangeAt(0))):this.range=document.selection.createRange()},click:function(e){this._setSelection(),this._toggle(e)},keydown:function(t){var i=!0;switch(t.keyCode){case e.ui.keyCode.TAB:case e.ui.keyCode.ESCAPE:this.close(t),i=!1;break;case e.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(t);break;case e.ui.keyCode.UP:t.altKey?this._toggle(t):this._move("prev",t);break;case e.ui.keyCode.DOWN:t.altKey?this._toggle(t):this._move("next",t);break;case e.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(t):this._toggle(t);break;case e.ui.keyCode.LEFT:this._move("prev",t);break;case e.ui.keyCode.RIGHT:this._move("next",t);break;case e.ui.keyCode.HOME:case e.ui.keyCode.PAGE_UP:this._move("first",t);break;case e.ui.keyCode.END:case e.ui.keyCode.PAGE_DOWN:this._move("last",t);break;default:this.menu.trigger(t),i=!1}i&&t.preventDefault()}},_selectFocusedItem:function(e){var t=this.menuItems.eq(this.focusIndex);t.hasClass("ui-state-disabled")||this._select(t.data("ui-selectmenu-item"),e)},_select:function(e,t){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=e.index,this._setText(this.buttonText,e.label),this._setAria(e),this._trigger("select",t,{item:e}),e.index!==i&&this._trigger("change",t,{item:e}),this.close(t)},_setAria:function(e){var t=this.menuItems.eq(e.index).attr("id");this.button.attr({"aria-labelledby":t,"aria-activedescendant":t}),this.menu.attr("aria-activedescendant",t)},_setOption:function(e,t){"icons"===e&&this.button.find("span.ui-icon").removeClass(this.options.icons.button).addClass(t.button),this._super(e,t),"appendTo"===e&&this.menuWrap.appendTo(this._appendTo()),"disabled"===e&&(this.menuInstance.option("disabled",t),this.button.toggleClass("ui-state-disabled",t).attr("aria-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)),"width"===e&&this._resizeButton()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_toggleAttr:function(){this.button.toggleClass("ui-corner-top",this.isOpen).toggleClass("ui-corner-all",!this.isOpen).attr("aria-expanded",this.isOpen),this.menuWrap.toggleClass("ui-selectmenu-open",this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var e=this.options.width;e||(e=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(e)},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){return{disabled:this.element.prop("disabled")}},_parseOptions:function(t){var i=[];t.each(function(t,s){var n=e(s),a=n.parent("optgroup");i.push({element:n,index:t,value:n.val(),label:n.text(),optgroup:a.attr("label")||"",disabled:a.prop("disabled")||n.prop("disabled")})}),this.items=i},_destroy:function(){this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.label.attr("for",this.ids.element)}}),e.widget("ui.slider",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"),this._refresh(),this._setOption("disabled",this.options.disabled),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var t,i,s=this.options,n=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),a="<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>",o=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),t=n.length;i>t;t++)o.push(a);this.handles=n.add(e(o.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.each(function(t){e(this).data("ui-slider-handle-index",t)})},_createRange:function(){var t=this.options,i="";t.range?(t.range===!0&&(t.values?t.values.length&&2!==t.values.length?t.values=[t.values[0],t.values[0]]:e.isArray(t.values)&&(t.values=t.values.slice(0)):t.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?this.range.removeClass("ui-slider-range-min ui-slider-range-max").css({left:"",bottom:""}):(this.range=e("<div></div>").appendTo(this.element),i="ui-slider-range ui-widget-header ui-corner-all"),this.range.addClass(i+("min"===t.range||"max"===t.range?" ui-slider-range-"+t.range:""))):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(t){var i,s,n,a,o,r,h,l,u=this,d=this.options;return d.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:t.pageX,y:t.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var i=Math.abs(s-u.values(t));(n>i||n===i&&(t===u._lastChangedValue||u.values(t)===d.min))&&(n=i,a=e(this),o=t)}),r=this._start(t,o),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=o,a.addClass("ui-state-active").focus(),h=a.offset(),l=!e(t.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:t.pageX-h.left-a.width()/2,top:t.pageY-h.top-a.height()/2-(parseInt(a.css("borderTopWidth"),10)||0)-(parseInt(a.css("borderBottomWidth"),10)||0)+(parseInt(a.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,o,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(e){var t={x:e.pageX,y:e.pageY},i=this._normValueFromMouse(t);return this._slide(e,this._handleIndex,i),!1},_mouseStop:function(e){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(e,this._handleIndex),this._change(e,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(e){var t,i,s,n,a;return"horizontal"===this.orientation?(t=this.elementSize.width,i=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(t=this.elementSize.height,i=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/t,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),a=this._valueMin()+s*n,this._trimAlignValue(a)},_start:function(e,t){var i={handle:this.handles[t],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("start",e,i)},_slide:function(e,t,i){var s,n,a;this.options.values&&this.options.values.length?(s=this.values(t?0:1),2===this.options.values.length&&this.options.range===!0&&(0===t&&i>s||1===t&&s>i)&&(i=s),i!==this.values(t)&&(n=this.values(),n[t]=i,a=this._trigger("slide",e,{handle:this.handles[t],value:i,values:n}),s=this.values(t?0:1),a!==!1&&this.values(t,i))):i!==this.value()&&(a=this._trigger("slide",e,{handle:this.handles[t],value:i}),a!==!1&&this.value(i))},_stop:function(e,t){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("stop",e,i)},_change:function(e,t){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._lastChangedValue=t,this._trigger("change",e,i)}},value:function(e){return arguments.length?(this.options.value=this._trimAlignValue(e),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(t,i){var s,n,a;if(arguments.length>1)return this.options.values[t]=this._trimAlignValue(i),this._refreshValue(),this._change(null,t),void 0;if(!arguments.length)return this._values();if(!e.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(t):this.value();for(s=this.options.values,n=arguments[0],a=0;s.length>a;a+=1)s[a]=this._trimAlignValue(n[a]),this._change(null,a);this._refreshValue()},_setOption:function(t,i){var s,n=0;switch("range"===t&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),e.isArray(this.options.values)&&(n=this.options.values.length),"disabled"===t&&this.element.toggleClass("ui-state-disabled",!!i),this._super(t,i),t){case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue(),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case"step":case"min":case"max":this._animateOff=!0,this._calculateNewMax(),this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_value:function(){var e=this.options.value;return e=this._trimAlignValue(e)},_values:function(e){var t,i,s;if(arguments.length)return t=this.options.values[e],t=this._trimAlignValue(t);if(this.options.values&&this.options.values.length){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(e){if(this._valueMin()>=e)return this._valueMin();if(e>=this._valueMax())return this._valueMax();var t=this.options.step>0?this.options.step:1,i=(e-this._valueMin())%t,s=e-i;return 2*Math.abs(i)>=t&&(s+=i>0?t:-t),parseFloat(s.toFixed(5))},_calculateNewMax:function(){var e=this.options.max,t=this._valueMin(),i=this.options.step,s=Math.floor(+(e-t).toFixed(this._precision())/i)*i;e=s+t,this.max=parseFloat(e.toFixed(this._precision()))},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshValue:function(){var t,i,s,n,a,o=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,u={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),u["horizontal"===h.orientation?"left":"bottom"]=i+"%",e(this).stop(1,1)[l?"animate":"css"](u,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-t+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-t+"%"},{queue:!1,duration:r.animate}))),t=i}):(s=this.value(),n=this._valueMin(),a=this._valueMax(),i=a!==n?100*((s-n)/(a-n)):0,u["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](u,r.animate),"min"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===o&&"horizontal"===this.orientation&&this.range[l?"animate":"css"]({width:100-i+"%"},{queue:!1,duration:r.animate}),"min"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===o&&"vertical"===this.orientation&&this.range[l?"animate":"css"]({height:100-i+"%"},{queue:!1,duration:r.animate}))},_handleEvents:{keydown:function(t){var i,s,n,a,o=e(t.target).data("ui-slider-handle-index");switch(t.keyCode){case e.ui.keyCode.HOME:case e.ui.keyCode.END:case e.ui.keyCode.PAGE_UP:case e.ui.keyCode.PAGE_DOWN:case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(t.preventDefault(),!this._keySliding&&(this._keySliding=!0,e(t.target).addClass("ui-state-active"),i=this._start(t,o),i===!1))return}switch(a=this.options.step,s=n=this.options.values&&this.options.values.length?this.values(o):this.value(),t.keyCode){case e.ui.keyCode.HOME:n=this._valueMin();break;case e.ui.keyCode.END:n=this._valueMax();break;case e.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+a);break;case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-a)}this._slide(t,o,n)},keyup:function(t){var i=e(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,i),this._change(t,i),e(t.target).removeClass("ui-state-active"))}}}),e.widget("ui.sortable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(e,t,i){return e>=t&&t+i>e},_isFloating:function(e){return/left|right/.test(e.css("float"))||/inline|table-cell/.test(e.css("display"))},_create:function(){this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(e,t){this._super(e,t),"handle"===e&&this._setHandleClassName()},_setHandleClassName:function(){this.element.find(".ui-sortable-handle").removeClass("ui-sortable-handle"),e.each(this.items,function(){(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item).addClass("ui-sortable-handle")})},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").find(".ui-sortable-handle").removeClass("ui-sortable-handle"),this._mouseDestroy();for(var e=this.items.length-1;e>=0;e--)this.items[e].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(t,i){var s=null,n=!1,a=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(t),e(t.target).parents().each(function(){return e.data(this,a.widgetName+"-item")===a?(s=e(this),!1):void 0}),e.data(t.target,a.widgetName+"-item")===a&&(s=e(t.target)),s?!this.options.handle||i||(e(this.options.handle,s).find("*").addBack().each(function(){this===t.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(t,i,s){var n,a,o=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(t),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,o.cursorAt&&this._adjustOffsetFromHelper(o.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),o.containment&&this._setContainment(),o.cursor&&"auto"!==o.cursor&&(a=this.document.find("body"),this.storedCursor=a.css("cursor"),a.css("cursor",o.cursor),this.storedStylesheet=e("<style>*{ cursor: "+o.cursor+" !important; }</style>").appendTo(a)),o.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",o.opacity)),o.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",o.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",t,this._uiHash(this)); +return e.ui.ddmanager&&(e.ui.ddmanager.current=this),e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(t),!0},_mouseDrag:function(t){var i,s,n,a,o=this.options,r=!1;for(this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY<o.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+o.scrollSpeed:t.pageY-this.overflowOffset.top<o.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-o.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-t.pageX<o.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+o.scrollSpeed:t.pageX-this.overflowOffset.left<o.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-o.scrollSpeed)):(t.pageY-this.document.scrollTop()<o.scrollSensitivity?r=this.document.scrollTop(this.document.scrollTop()-o.scrollSpeed):this.window.height()-(t.pageY-this.document.scrollTop())<o.scrollSensitivity&&(r=this.document.scrollTop(this.document.scrollTop()+o.scrollSpeed)),t.pageX-this.document.scrollLeft()<o.scrollSensitivity?r=this.document.scrollLeft(this.document.scrollLeft()-o.scrollSpeed):this.window.width()-(t.pageX-this.document.scrollLeft())<o.scrollSensitivity&&(r=this.document.scrollLeft(this.document.scrollLeft()+o.scrollSpeed))),r!==!1&&e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],a=this._intersectsWithPointer(s),a&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===a?"next":"prev"]()[0]!==n&&!e.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!e.contains(this.element[0],n):!0)){if(this.direction=1===a?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(t,s),this._trigger("change",t,this._uiHash());break}return this._contactContainers(t),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),this._trigger("sort",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,i){if(t){if(e.ui.ddmanager&&!this.options.dropBehaviour&&e.ui.ddmanager.drop(this,t),this.options.revert){var s=this,n=this.placeholder.offset(),a=this.options.axis,o={};a&&"x"!==a||(o.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),a&&"y"!==a||(o.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,e(this.helper).animate(o,parseInt(this.options.revert,10)||500,function(){s._clear(t)})}else this._clear(t,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var t=this.containers.length-1;t>=0;t--)this.containers[t]._trigger("deactivate",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger("out",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),e.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?e(this.domPosition.prev).after(this.currentItem):e(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},e(i).each(function(){var i=(e(t.item||this).attr(t.attribute||"id")||"").match(t.expression||/(.+)[\-=_](.+)/);i&&s.push((t.key||i[1]+"[]")+"="+(t.key&&t.expression?i[1]:i[2]))}),!s.length&&t.key&&s.push(t.key+"="),s.join("&")},toArray:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},i.each(function(){s.push(e(t.item||this).attr(t.attribute||"id")||"")}),s},_intersectsWith:function(e){var t=this.positionAbs.left,i=t+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,a=e.left,o=a+e.width,r=e.top,h=r+e.height,l=this.offset.click.top,u=this.offset.click.left,d="x"===this.options.axis||s+l>r&&h>s+l,c="y"===this.options.axis||t+u>a&&o>t+u,p=d&&c;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>e[this.floating?"width":"height"]?p:t+this.helperProportions.width/2>a&&o>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(e){var t="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top,e.height),i="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left,e.width),s=t&&i,n=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return s?this.floating?a&&"right"===a||"down"===n?2:1:n&&("down"===n?2:1):!1},_intersectsWithSides:function(e){var t=this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top+e.height/2,e.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left+e.width/2,e.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&t||"up"===s&&!t)},_getDragVerticalDirection:function(){var e=this.positionAbs.top-this.lastPositionAbs.top;return 0!==e&&(e>0?"down":"up")},_getDragHorizontalDirection:function(){var e=this.positionAbs.left-this.lastPositionAbs.left;return 0!==e&&(e>0?"right":"left")},refresh:function(e){return this._refreshItems(e),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var e=this.options;return e.connectWith.constructor===String?[e.connectWith]:e.connectWith},_getItemsAsjQuery:function(t){function i(){r.push(this)}var s,n,a,o,r=[],h=[],l=this._connectWith();if(l&&t)for(s=l.length-1;s>=0;s--)for(a=e(l[s],this.document[0]),n=a.length-1;n>=0;n--)o=e.data(a[n],this.widgetFullName),o&&o!==this&&!o.options.disabled&&h.push([e.isFunction(o.options.items)?o.options.items.call(o.element):e(o.options.items,o.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),o]);for(h.push([e.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):e(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return e(r)},_removeCurrentsFromItems:function(){var t=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=e.grep(this.items,function(e){for(var i=0;t.length>i;i++)if(t[i]===e.item[0])return!1;return!0})},_refreshItems:function(t){this.items=[],this.containers=[this];var i,s,n,a,o,r,h,l,u=this.items,d=[[e.isFunction(this.options.items)?this.options.items.call(this.element[0],t,{item:this.currentItem}):e(this.options.items,this.element),this]],c=this._connectWith();if(c&&this.ready)for(i=c.length-1;i>=0;i--)for(n=e(c[i],this.document[0]),s=n.length-1;s>=0;s--)a=e.data(n[s],this.widgetFullName),a&&a!==this&&!a.options.disabled&&(d.push([e.isFunction(a.options.items)?a.options.items.call(a.element[0],t,{item:this.currentItem}):e(a.options.items,a.element),a]),this.containers.push(a));for(i=d.length-1;i>=0;i--)for(o=d[i][1],r=d[i][0],s=0,l=r.length;l>s;s++)h=e(r[s]),h.data(this.widgetName+"-item",o),u.push({item:h,instance:o,width:0,height:0,left:0,top:0})},refreshPositions:function(t){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,a;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?e(this.options.toleranceElement,s.item):s.item,t||(s.width=n.outerWidth(),s.height=n.outerHeight()),a=n.offset(),s.left=a.left,s.top=a.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)a=this.containers[i].element.offset(),this.containers[i].containerCache.left=a.left,this.containers[i].containerCache.top=a.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(t){t=t||this;var i,s=t.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=t.currentItem[0].nodeName.toLowerCase(),n=e("<"+s+">",t.document[0]).addClass(i||t.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tbody"===s?t._createTrPlaceholder(t.currentItem.find("tr").eq(0),e("<tr>",t.document[0]).appendTo(n)):"tr"===s?t._createTrPlaceholder(t.currentItem,n):"img"===s&&n.attr("src",t.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(e,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(t.currentItem.innerHeight()-parseInt(t.currentItem.css("paddingTop")||0,10)-parseInt(t.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(t.currentItem.innerWidth()-parseInt(t.currentItem.css("paddingLeft")||0,10)-parseInt(t.currentItem.css("paddingRight")||0,10)))}}),t.placeholder=e(s.placeholder.element.call(t.element,t.currentItem)),t.currentItem.after(t.placeholder),s.placeholder.update(t,t.placeholder)},_createTrPlaceholder:function(t,i){var s=this;t.children().each(function(){e("<td>&#160;</td>",s.document[0]).attr("colspan",e(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(t){var i,s,n,a,o,r,h,l,u,d,c=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!e.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(c&&e.contains(this.containers[i].element[0],c.element[0]))continue;c=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",t,this._uiHash(this)),this.containers[i].containerCache.over=0);if(c)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,a=null,u=c.floating||this._isFloating(this.currentItem),o=u?"left":"top",r=u?"width":"height",d=u?"clientX":"clientY",s=this.items.length-1;s>=0;s--)e.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(h=this.items[s].item.offset()[o],l=!1,t[d]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(t[d]-h)&&(n=Math.abs(t[d]-h),a=this.items[s],this.direction=l?"up":"down"));if(!a&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;a?this._rearrange(t,a,null,!0):this._rearrange(t,null,this.containers[p].element,!0),this._trigger("change",t,this._uiHash()),this.containers[p]._trigger("change",t,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||e("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&e.ui.ie)&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var e=this.currentItem.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.width():this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(t=e(n.containment)[0],i=e(n.containment).offset(),s="hidden"!==e(t).css("overflow"),this.containment=[i.left+(parseInt(e(t).css("borderLeftWidth"),10)||0)+(parseInt(e(t).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(e(t).css("borderTopWidth"),10)||0)+(parseInt(e(t).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(t.scrollWidth,t.offsetWidth):t.offsetWidth)-(parseInt(e(t).css("borderLeftWidth"),10)||0)-(parseInt(e(t).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(t.scrollHeight,t.offsetHeight):t.offsetHeight)-(parseInt(e(t).css("borderTopWidth"),10)||0)-(parseInt(e(t).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(t,i){i||(i=this.position);var s="absolute"===t?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,a=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():a?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():a?0:n.scrollLeft())*s}},_generatePosition:function(t){var i,s,n=this.options,a=t.pageX,o=t.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(t.pageX-this.offset.click.left<this.containment[0]&&(a=this.containment[0]+this.offset.click.left),t.pageY-this.offset.click.top<this.containment[1]&&(o=this.containment[1]+this.offset.click.top),t.pageX-this.offset.click.left>this.containment[2]&&(a=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1],o=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((a-this.originalPageX)/n.grid[0])*n.grid[0],a=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(e,t,i,s){i?i[0].appendChild(this.placeholder[0]):t.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?t.item[0]:t.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(e,t){function i(e,t,i){return function(s){i._trigger(e,s,t._uiHash(t))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!t&&n.push(function(e){this._trigger("receive",e,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||t||n.push(function(e){this._trigger("update",e,this._uiHash())}),this!==this.currentContainer&&(t||(n.push(function(e){this._trigger("remove",e,this._uiHash())}),n.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)t||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,t||this._trigger("beforeStop",e,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!t){for(s=0;n.length>s;s++)n[s].call(this,e);this._trigger("stop",e,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){e.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(t){var i=t||this;return{helper:i.helper,placeholder:i.placeholder||e([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:t?t.element:null}}}),e.widget("ui.spinner",{version:"1.11.4",defaultElement:"<input>",widgetEventPrefix:"spin",options:{culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var t={},i=this.element;return e.each(["min","max","step"],function(e,s){var n=i.attr(s);void 0!==n&&n.length&&(t[s]=n)}),t},_events:{keydown:function(e){this._start(e)&&this._keydown(e)&&e.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",e),void 0)},mousewheel:function(e,t){if(t){if(!this.spinning&&!this._start(e))return!1;this._spin((t>0?1:-1)*this.options.step,e),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(e)},100),e.preventDefault()}},"mousedown .ui-spinner-button":function(t){function i(){var e=this.element[0]===this.document[0].activeElement;e||(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),t.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(t)!==!1&&this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(t){return e(t.currentTarget).hasClass("ui-state-active")?this._start(t)===!1?!1:(this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var e=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this.element.attr("role","spinbutton"),this.buttons=e.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all"),this.buttons.height()>Math.ceil(.5*e.height())&&e.height()>0&&e.height(e.height()),this.options.disabled&&this.disable()},_keydown:function(t){var i=this.options,s=e.ui.keyCode;switch(t.keyCode){case s.UP:return this._repeat(null,1,t),!0;case s.DOWN:return this._repeat(null,-1,t),!0;case s.PAGE_UP:return this._repeat(null,i.page,t),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,t),!0}return!1},_uiSpinnerHtml:function(){return"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>"},_buttonHtml:function(){return"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'><span class='ui-icon "+this.options.icons.up+"'>&#9650;</span>"+"</a>"+"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>"+"<span class='ui-icon "+this.options.icons.down+"'>&#9660;</span>"+"</a>"},_start:function(e){return this.spinning||this._trigger("start",e)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(e,t,i){e=e||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,t,i)},e),this._spin(t*this.options.step,i)},_spin:function(e,t){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+e*this._increment(this.counter)),this.spinning&&this._trigger("spin",t,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(t){var i=this.options.incremental;return i?e.isFunction(i)?i(t):Math.floor(t*t*t/5e4-t*t/500+17*t/200+1):1},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_adjustValue:function(e){var t,i,s=this.options;return t=null!==s.min?s.min:0,i=e-t,i=Math.round(i/s.step)*s.step,e=t+i,e=parseFloat(e.toFixed(this._precision())),null!==s.max&&e>s.max?s.max:null!==s.min&&s.min>e?s.min:e},_stop:function(e){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",e))},_setOption:function(e,t){if("culture"===e||"numberFormat"===e){var i=this._parse(this.element.val());return this.options[e]=t,this.element.val(this._format(i)),void 0}("max"===e||"min"===e||"step"===e)&&"string"==typeof t&&(t=this._parse(t)),"icons"===e&&(this.buttons.first().find(".ui-icon").removeClass(this.options.icons.up).addClass(t.up),this.buttons.last().find(".ui-icon").removeClass(this.options.icons.down).addClass(t.down)),this._super(e,t),"disabled"===e&&(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable"))},_setOptions:h(function(e){this._super(e)}),_parse:function(e){return"string"==typeof e&&""!==e&&(e=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(e,10,this.options.culture):+e),""===e||isNaN(e)?null:e},_format:function(e){return""===e?"":window.Globalize&&this.options.numberFormat?Globalize.format(e,this.options.numberFormat,this.options.culture):e},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var e=this.value();return null===e?!1:e===this._adjustValue(e)},_value:function(e,t){var i;""!==e&&(i=this._parse(e),null!==i&&(t||(i=this._adjustValue(i)),e=this._format(i))),this.element.val(e),this._refresh()},_destroy:function(){this.element.removeClass("ui-spinner-input").prop("disabled",!1).removeAttr("autocomplete").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:h(function(e){this._stepUp(e)}),_stepUp:function(e){this._start()&&(this._spin((e||1)*this.options.step),this._stop())},stepDown:h(function(e){this._stepDown(e)}),_stepDown:function(e){this._start()&&(this._spin((e||1)*-this.options.step),this._stop())},pageUp:h(function(e){this._stepUp((e||1)*this.options.page)}),pageDown:h(function(e){this._stepDown((e||1)*this.options.page)}),value:function(e){return arguments.length?(h(this._value).call(this,e),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),e.widget("ui.tabs",{version:"1.11.4",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var e=/#.*$/;return function(t){var i,s;t=t.cloneNode(!1),i=t.href.replace(e,""),s=location.href.replace(e,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return t.hash.length>1&&i===s}}(),_create:function(){var t=this,i=this.options;this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",i.collapsible),this._processTabs(),i.active=this._initialActive(),e.isArray(i.disabled)&&(i.disabled=e.unique(i.disabled.concat(e.map(this.tabs.filter(".ui-state-disabled"),function(e){return t.tabs.index(e)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):e(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var t=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===t&&(s&&this.tabs.each(function(i,n){return e(n).attr("aria-controls")===s?(t=i,!1):void 0}),null===t&&(t=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===t||-1===t)&&(t=this.tabs.length?0:!1)),t!==!1&&(t=this.tabs.index(this.tabs.eq(t)),-1===t&&(t=i?!1:0)),!i&&t===!1&&this.anchors.length&&(t=0),t},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):e()}},_tabKeydown:function(t){var i=e(this.document[0].activeElement).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(t)){switch(t.keyCode){case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:s++;break;case e.ui.keyCode.UP:case e.ui.keyCode.LEFT:n=!1,s--;break;case e.ui.keyCode.END:s=this.anchors.length-1;break;case e.ui.keyCode.HOME:s=0;break;case e.ui.keyCode.SPACE:return t.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case e.ui.keyCode.ENTER:return t.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}t.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),t.ctrlKey||t.metaKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(t){this._handlePageNav(t)||t.ctrlKey&&t.keyCode===e.ui.keyCode.UP&&(t.preventDefault(),this.active.focus())},_handlePageNav:function(t){return t.altKey&&t.keyCode===e.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):t.altKey&&t.keyCode===e.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(t,i){function s(){return t>n&&(t=0),0>t&&(t=n),t}for(var n=this.tabs.length-1;-1!==e.inArray(s(),this.options.disabled);)t=i?t+1:t-1;return t},_focusNextTab:function(e,t){return e=this._findNextTab(e,t),this.tabs.eq(e).focus(),e},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):"disabled"===e?(this._setupDisabled(t),void 0):(this._super(e,t),"collapsible"===e&&(this.element.toggleClass("ui-tabs-collapsible",t),t||this.options.active!==!1||this._activate(0)),"event"===e&&this._setupEvents(t),"heightStyle"===e&&this._setupHeightStyle(t),void 0)},_sanitizeSelector:function(e){return e?e.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var t=this.options,i=this.tablist.children(":has(a[href])");t.disabled=e.map(i.filter(".ui-state-disabled"),function(e){return i.index(e)}),this._processTabs(),t.active!==!1&&this.anchors.length?this.active.length&&!e.contains(this.tablist[0],this.active[0])?this.tabs.length===t.disabled.length?(t.active=!1,this.active=e()):this._activate(this._findNextTab(Math.max(0,t.active-1),!1)):t.active=this.tabs.index(this.active):(t.active=!1,this.active=e()),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var t=this,i=this.tabs,s=this.anchors,n=this.panels; +this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist").delegate("> li","mousedown"+this.eventNamespace,function(t){e(this).is(".ui-state-disabled")&&t.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){e(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return e("a",this)[0]}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=e(),this.anchors.each(function(i,s){var n,a,o,r=e(s).uniqueId().attr("id"),h=e(s).closest("li"),l=h.attr("aria-controls");t._isLocal(s)?(n=s.hash,o=n.substring(1),a=t.element.find(t._sanitizeSelector(n))):(o=h.attr("aria-controls")||e({}).uniqueId()[0].id,n="#"+o,a=t.element.find(n),a.length||(a=t._createPanel(o),a.insertAfter(t.panels[i-1]||t.tablist)),a.attr("aria-live","polite")),a.length&&(t.panels=t.panels.add(a)),l&&h.data("ui-tabs-aria-controls",l),h.attr({"aria-controls":o,"aria-labelledby":r}),a.attr("aria-labelledby",r)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel"),i&&(this._off(i.not(this.tabs)),this._off(s.not(this.anchors)),this._off(n.not(this.panels)))},_getList:function(){return this.tablist||this.element.find("ol,ul").eq(0)},_createPanel:function(t){return e("<div>").attr("id",t).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(t){e.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1);for(var i,s=0;i=this.tabs[s];s++)t===!0||-1!==e.inArray(s,t)?e(i).addClass("ui-state-disabled").attr("aria-disabled","true"):e(i).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=t},_setupEvents:function(t){var i={};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(e){e.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var i,s=this.element.parent();"fill"===t?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var t=e(this),s=t.css("position");"absolute"!==s&&"fixed"!==s&&(i-=t.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=e(this).outerHeight(!0)}),this.panels.each(function(){e(this).height(Math.max(0,i-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===t&&(i=0,this.panels.each(function(){i=Math.max(i,e(this).height("").height())}).height(i))},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n.closest("li"),o=a[0]===s[0],r=o&&i.collapsible,h=r?e():this._getPanelForTab(a),l=s.length?this._getPanelForTab(s):e(),u={oldTab:s,oldPanel:l,newTab:r?e():a,newPanel:h};t.preventDefault(),a.hasClass("ui-state-disabled")||a.hasClass("ui-tabs-loading")||this.running||o&&!i.collapsible||this._trigger("beforeActivate",t,u)===!1||(i.active=r?!1:this.tabs.index(a),this.active=o?e():a,this.xhr&&this.xhr.abort(),l.length||h.length||e.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(a),t),this._toggle(t,u))},_toggle:function(t,i){function s(){a.running=!1,a._trigger("activate",t,i)}function n(){i.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),o.length&&a.options.show?a._show(o,a.options.show,s):(o.show(),s())}var a=this,o=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),n()}):(i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),o.length&&r.length?i.oldTab.attr("tabIndex",-1):o.length&&this.tabs.filter(function(){return 0===e(this).attr("tabIndex")}).attr("tabIndex",-1),o.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(t){var i,s=this._findActive(t);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return t===!1?e():this.tabs.eq(t)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+e+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeUniqueId(),this.tablist.unbind(this.eventNamespace),this.tabs.add(this.panels).each(function(){e.data(this,"ui-tabs-destroy")?e(this).remove():e(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),this.tabs.each(function(){var t=e(this),i=t.data("ui-tabs-aria-controls");i?t.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):t.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(t){var i=this.options.disabled;i!==!1&&(void 0===t?i=!1:(t=this._getIndex(t),i=e.isArray(i)?e.map(i,function(e){return e!==t?e:null}):e.map(this.tabs,function(e,i){return i!==t?i:null})),this._setupDisabled(i))},disable:function(t){var i=this.options.disabled;if(i!==!0){if(void 0===t)i=!0;else{if(t=this._getIndex(t),-1!==e.inArray(t,i))return;i=e.isArray(i)?e.merge([t],i).sort():[t]}this._setupDisabled(i)}},load:function(t,i){t=this._getIndex(t);var s=this,n=this.tabs.eq(t),a=n.find(".ui-tabs-anchor"),o=this._getPanelForTab(n),r={tab:n,panel:o},h=function(e,t){"abort"===t&&s.panels.stop(!1,!0),n.removeClass("ui-tabs-loading"),o.removeAttr("aria-busy"),e===s.xhr&&delete s.xhr};this._isLocal(a[0])||(this.xhr=e.ajax(this._ajaxSettings(a,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(n.addClass("ui-tabs-loading"),o.attr("aria-busy","true"),this.xhr.done(function(e,t,n){setTimeout(function(){o.html(e),s._trigger("load",i,r),h(n,t)},1)}).fail(function(e,t){setTimeout(function(){h(e,t)},1)})))},_ajaxSettings:function(t,i,s){var n=this;return{url:t.attr("href"),beforeSend:function(t,a){return n._trigger("beforeLoad",i,e.extend({jqXHR:t,ajaxSettings:a},s))}}},_getPanelForTab:function(t){var i=e(t).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),e.widget("ui.tooltip",{version:"1.11.4",options:{content:function(){var t=e(this).attr("title")||"";return e("<a>").text(t).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_addDescribedBy:function(t,i){var s=(t.attr("aria-describedby")||"").split(/\s+/);s.push(i),t.data("ui-tooltip-id",i).attr("aria-describedby",e.trim(s.join(" ")))},_removeDescribedBy:function(t){var i=t.data("ui-tooltip-id"),s=(t.attr("aria-describedby")||"").split(/\s+/),n=e.inArray(i,s);-1!==n&&s.splice(n,1),t.removeData("ui-tooltip-id"),s=e.trim(s.join(" ")),s?t.attr("aria-describedby",s):t.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable(),this.liveRegion=e("<div>").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body)},_setOption:function(t,i){var s=this;return"disabled"===t?(this[i?"_disable":"_enable"](),this.options[t]=i,void 0):(this._super(t,i),"content"===t&&e.each(this.tooltips,function(e,t){s._updateContent(t.element)}),void 0)},_disable:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur");n.target=n.currentTarget=s.element[0],t.close(n,!0)}),this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.is("[title]")&&t.data("ui-tooltip-title",t.attr("title")).removeAttr("title")})},_enable:function(){this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.data("ui-tooltip-title")&&t.attr("title",t.data("ui-tooltip-title"))})},open:function(t){var i=this,s=e(t?t.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),t&&"mouseover"===t.type&&s.parents().each(function(){var t,s=e(this);s.data("ui-tooltip-open")&&(t=e.Event("blur"),t.target=t.currentTarget=this,i.close(t,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._registerCloseHandlers(t,s),this._updateContent(s,t))},_updateContent:function(e,t){var i,s=this.options.content,n=this,a=t?t.type:null;return"string"==typeof s?this._open(t,e,s):(i=s.call(e[0],function(i){n._delay(function(){e.data("ui-tooltip-open")&&(t&&(t.type=a),this._open(t,e,i))})}),i&&this._open(t,e,i),void 0)},_open:function(t,i,s){function n(e){l.of=e,o.is(":hidden")||o.position(l)}var a,o,r,h,l=e.extend({},this.options.position);if(s){if(a=this._find(i))return a.tooltip.find(".ui-tooltip-content").html(s),void 0;i.is("[title]")&&(t&&"mouseover"===t.type?i.attr("title",""):i.removeAttr("title")),a=this._tooltip(i),o=a.tooltip,this._addDescribedBy(i,o.attr("id")),o.find(".ui-tooltip-content").html(s),this.liveRegion.children().hide(),s.clone?(h=s.clone(),h.removeAttr("id").find("[id]").removeAttr("id")):h=s,e("<div>").html(h).appendTo(this.liveRegion),this.options.track&&t&&/^mouse/.test(t.type)?(this._on(this.document,{mousemove:n}),n(t)):o.position(e.extend({of:i},this.options.position)),o.hide(),this._show(o,this.options.show),this.options.show&&this.options.show.delay&&(r=this.delayedShow=setInterval(function(){o.is(":visible")&&(n(l.of),clearInterval(r))},e.fx.interval)),this._trigger("open",t,{tooltip:o})}},_registerCloseHandlers:function(t,i){var s={keyup:function(t){if(t.keyCode===e.ui.keyCode.ESCAPE){var s=e.Event(t);s.currentTarget=i[0],this.close(s,!0)}}};i[0]!==this.element[0]&&(s.remove=function(){this._removeTooltip(this._find(i).tooltip)}),t&&"mouseover"!==t.type||(s.mouseleave="close"),t&&"focusin"!==t.type||(s.focusout="close"),this._on(!0,i,s)},close:function(t){var i,s=this,n=e(t?t.currentTarget:this.element),a=this._find(n);return a?(i=a.tooltip,a.closing||(clearInterval(this.delayedShow),n.data("ui-tooltip-title")&&!n.attr("title")&&n.attr("title",n.data("ui-tooltip-title")),this._removeDescribedBy(n),a.hiding=!0,i.stop(!0),this._hide(i,this.options.hide,function(){s._removeTooltip(e(this))}),n.removeData("ui-tooltip-open"),this._off(n,"mouseleave focusout keyup"),n[0]!==this.element[0]&&this._off(n,"remove"),this._off(this.document,"mousemove"),t&&"mouseleave"===t.type&&e.each(this.parents,function(t,i){e(i.element).attr("title",i.title),delete s.parents[t]}),a.closing=!0,this._trigger("close",t,{tooltip:i}),a.hiding||(a.closing=!1)),void 0):(n.removeData("ui-tooltip-open"),void 0)},_tooltip:function(t){var i=e("<div>").attr("role","tooltip").addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||"")),s=i.uniqueId().attr("id");return e("<div>").addClass("ui-tooltip-content").appendTo(i),i.appendTo(this.document[0].body),this.tooltips[s]={element:t,tooltip:i}},_find:function(e){var t=e.data("ui-tooltip-id");return t?this.tooltips[t]:null},_removeTooltip:function(e){e.remove(),delete this.tooltips[e.attr("id")]},_destroy:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur"),a=s.element;n.target=n.currentTarget=a[0],t.close(n,!0),e("#"+i).remove(),a.data("ui-tooltip-title")&&(a.attr("title")||a.attr("title",a.data("ui-tooltip-title")),a.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}})}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/jvectormap/jquery-jvectormap-1.2.2.css b/theme/bootstrap/plugins/jvectormap/jquery-jvectormap-1.2.2.css new file mode 100644 index 0000000..63e717d --- /dev/null +++ b/theme/bootstrap/plugins/jvectormap/jquery-jvectormap-1.2.2.css @@ -0,0 +1,40 @@ +.jvectormap-label { + position: absolute; + display: none; + border: solid 1px #CDCDCD; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + background: #292929; + color: white; + font-size: 10px!important; + padding: 3px; + z-index: 9999; +} + +.jvectormap-zoomin, .jvectormap-zoomout { + position: absolute; + top: 100%; + margin-top: -25px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; + background: #d2d6de;//rgba(0,0,0,0.4); + padding: 5px; + color: #444; + cursor: pointer; + line-height: 10px; + text-align: center; + font-weight: bold; + box-shadow: 0 1px 2px rgba(0,0,0,0.2); +} + +.jvectormap-zoomin { + left: 100%; + margin-left: -50px; +} + +.jvectormap-zoomout { + left: 100%; + margin-left: -30px; +} \ No newline at end of file diff --git a/theme/bootstrap/plugins/jvectormap/jquery-jvectormap-1.2.2.min.js b/theme/bootstrap/plugins/jvectormap/jquery-jvectormap-1.2.2.min.js new file mode 100644 index 0000000..ea54476 --- /dev/null +++ b/theme/bootstrap/plugins/jvectormap/jquery-jvectormap-1.2.2.min.js @@ -0,0 +1,8 @@ +/** + * jVectorMap version 1.2.2 + * + * Copyright 2011-2013, Kirill Lebedev + * Licensed under the MIT license. + * + */(function(e){var t={set:{colors:1,values:1,backgroundColor:1,scaleColors:1,normalizeFunction:1,focus:1},get:{selectedRegions:1,selectedMarkers:1,mapObject:1,regionName:1}};e.fn.vectorMap=function(e){var n,r,i,n=this.children(".jvectormap-container").data("mapObject");if(e==="addMap")jvm.WorldMap.maps[arguments[1]]=arguments[2];else{if(!(e!=="set"&&e!=="get"||!t[e][arguments[1]]))return r=arguments[1].charAt(0).toUpperCase()+arguments[1].substr(1),n[e+r].apply(n,Array.prototype.slice.call(arguments,2));e=e||{},e.container=this,n=new jvm.WorldMap(e)}return this}})(jQuery),function(e){function r(t){var n=t||window.event,r=[].slice.call(arguments,1),i=0,s=!0,o=0,u=0;return t=e.event.fix(n),t.type="mousewheel",n.wheelDelta&&(i=n.wheelDelta/120),n.detail&&(i=-n.detail/3),u=i,n.axis!==undefined&&n.axis===n.HORIZONTAL_AXIS&&(u=0,o=-1*i),n.wheelDeltaY!==undefined&&(u=n.wheelDeltaY/120),n.wheelDeltaX!==undefined&&(o=-1*n.wheelDeltaX/120),r.unshift(t,i,o,u),(e.event.dispatch||e.event.handle).apply(this,r)}var t=["DOMMouseScroll","mousewheel"];if(e.event.fixHooks)for(var n=t.length;n;)e.event.fixHooks[t[--n]]=e.event.mouseHooks;e.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var e=t.length;e;)this.addEventListener(t[--e],r,!1);else this.onmousewheel=r},teardown:function(){if(this.removeEventListener)for(var e=t.length;e;)this.removeEventListener(t[--e],r,!1);else this.onmousewheel=null}},e.fn.extend({mousewheel:function(e){return e?this.bind("mousewheel",e):this.trigger("mousewheel")},unmousewheel:function(e){return this.unbind("mousewheel",e)}})}(jQuery);var jvm={inherits:function(e,t){function n(){}n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e,e.parentClass=t},mixin:function(e,t){var n;for(n in t.prototype)t.prototype.hasOwnProperty(n)&&(e.prototype[n]=t.prototype[n])},min:function(e){var t=Number.MAX_VALUE,n;if(e instanceof Array)for(n=0;n<e.length;n++)e[n]<t&&(t=e[n]);else for(n in e)e[n]<t&&(t=e[n]);return t},max:function(e){var t=Number.MIN_VALUE,n;if(e instanceof Array)for(n=0;n<e.length;n++)e[n]>t&&(t=e[n]);else for(n in e)e[n]>t&&(t=e[n]);return t},keys:function(e){var t=[],n;for(n in e)t.push(n);return t},values:function(e){var t=[],n,r;for(r=0;r<arguments.length;r++){e=arguments[r];for(n in e)t.push(e[n])}return t}};jvm.$=jQuery,jvm.AbstractElement=function(e,t){this.node=this.createElement(e),this.name=e,this.properties={},t&&this.set(t)},jvm.AbstractElement.prototype.set=function(e,t){var n;if(typeof e=="object")for(n in e)this.properties[n]=e[n],this.applyAttr(n,e[n]);else this.properties[e]=t,this.applyAttr(e,t)},jvm.AbstractElement.prototype.get=function(e){return this.properties[e]},jvm.AbstractElement.prototype.applyAttr=function(e,t){this.node.setAttribute(e,t)},jvm.AbstractElement.prototype.remove=function(){jvm.$(this.node).remove()},jvm.AbstractCanvasElement=function(e,t,n){this.container=e,this.setSize(t,n),this.rootElement=new jvm[this.classPrefix+"GroupElement"],this.node.appendChild(this.rootElement.node),this.container.appendChild(this.node)},jvm.AbstractCanvasElement.prototype.add=function(e,t){t=t||this.rootElement,t.add(e),e.canvas=this},jvm.AbstractCanvasElement.prototype.addPath=function(e,t,n){var r=new jvm[this.classPrefix+"PathElement"](e,t);return this.add(r,n),r},jvm.AbstractCanvasElement.prototype.addCircle=function(e,t,n){var r=new jvm[this.classPrefix+"CircleElement"](e,t);return this.add(r,n),r},jvm.AbstractCanvasElement.prototype.addGroup=function(e){var t=new jvm[this.classPrefix+"GroupElement"];return e?e.node.appendChild(t.node):this.node.appendChild(t.node),t.canvas=this,t},jvm.AbstractShapeElement=function(e,t,n){this.style=n||{},this.style.current={},this.isHovered=!1,this.isSelected=!1,this.updateStyle()},jvm.AbstractShapeElement.prototype.setHovered=function(e){this.isHovered!==e&&(this.isHovered=e,this.updateStyle())},jvm.AbstractShapeElement.prototype.setSelected=function(e){this.isSelected!==e&&(this.isSelected=e,this.updateStyle(),jvm.$(this.node).trigger("selected",[e]))},jvm.AbstractShapeElement.prototype.setStyle=function(e,t){var n={};typeof e=="object"?n=e:n[e]=t,jvm.$.extend(this.style.current,n),this.updateStyle()},jvm.AbstractShapeElement.prototype.updateStyle=function(){var e={};jvm.AbstractShapeElement.mergeStyles(e,this.style.initial),jvm.AbstractShapeElement.mergeStyles(e,this.style.current),this.isHovered&&jvm.AbstractShapeElement.mergeStyles(e,this.style.hover),this.isSelected&&(jvm.AbstractShapeElement.mergeStyles(e,this.style.selected),this.isHovered&&jvm.AbstractShapeElement.mergeStyles(e,this.style.selectedHover)),this.set(e)},jvm.AbstractShapeElement.mergeStyles=function(e,t){var n;t=t||{};for(n in t)t[n]===null?delete e[n]:e[n]=t[n]},jvm.SVGElement=function(e,t){jvm.SVGElement.parentClass.apply(this,arguments)},jvm.inherits(jvm.SVGElement,jvm.AbstractElement),jvm.SVGElement.svgns="http://www.w3.org/2000/svg",jvm.SVGElement.prototype.createElement=function(e){return document.createElementNS(jvm.SVGElement.svgns,e)},jvm.SVGElement.prototype.addClass=function(e){this.node.setAttribute("class",e)},jvm.SVGElement.prototype.getElementCtr=function(e){return jvm["SVG"+e]},jvm.SVGElement.prototype.getBBox=function(){return this.node.getBBox()},jvm.SVGGroupElement=function(){jvm.SVGGroupElement.parentClass.call(this,"g")},jvm.inherits(jvm.SVGGroupElement,jvm.SVGElement),jvm.SVGGroupElement.prototype.add=function(e){this.node.appendChild(e.node)},jvm.SVGCanvasElement=function(e,t,n){this.classPrefix="SVG",jvm.SVGCanvasElement.parentClass.call(this,"svg"),jvm.AbstractCanvasElement.apply(this,arguments)},jvm.inherits(jvm.SVGCanvasElement,jvm.SVGElement),jvm.mixin(jvm.SVGCanvasElement,jvm.AbstractCanvasElement),jvm.SVGCanvasElement.prototype.setSize=function(e,t){this.width=e,this.height=t,this.node.setAttribute("width",e),this.node.setAttribute("height",t)},jvm.SVGCanvasElement.prototype.applyTransformParams=function(e,t,n){this.scale=e,this.transX=t,this.transY=n,this.rootElement.node.setAttribute("transform","scale("+e+") translate("+t+", "+n+")")},jvm.SVGShapeElement=function(e,t,n){jvm.SVGShapeElement.parentClass.call(this,e,t),jvm.AbstractShapeElement.apply(this,arguments)},jvm.inherits(jvm.SVGShapeElement,jvm.SVGElement),jvm.mixin(jvm.SVGShapeElement,jvm.AbstractShapeElement),jvm.SVGPathElement=function(e,t){jvm.SVGPathElement.parentClass.call(this,"path",e,t),this.node.setAttribute("fill-rule","evenodd")},jvm.inherits(jvm.SVGPathElement,jvm.SVGShapeElement),jvm.SVGCircleElement=function(e,t){jvm.SVGCircleElement.parentClass.call(this,"circle",e,t)},jvm.inherits(jvm.SVGCircleElement,jvm.SVGShapeElement),jvm.VMLElement=function(e,t){jvm.VMLElement.VMLInitialized||jvm.VMLElement.initializeVML(),jvm.VMLElement.parentClass.apply(this,arguments)},jvm.inherits(jvm.VMLElement,jvm.AbstractElement),jvm.VMLElement.VMLInitialized=!1,jvm.VMLElement.initializeVML=function(){try{document.namespaces.rvml||document.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),jvm.VMLElement.prototype.createElement=function(e){return document.createElement("<rvml:"+e+' class="rvml">')}}catch(e){jvm.VMLElement.prototype.createElement=function(e){return document.createElement("<"+e+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}document.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)"),jvm.VMLElement.VMLInitialized=!0},jvm.VMLElement.prototype.getElementCtr=function(e){return jvm["VML"+e]},jvm.VMLElement.prototype.addClass=function(e){jvm.$(this.node).addClass(e)},jvm.VMLElement.prototype.applyAttr=function(e,t){this.node[e]=t},jvm.VMLElement.prototype.getBBox=function(){var e=jvm.$(this.node);return{x:e.position().left/this.canvas.scale,y:e.position().top/this.canvas.scale,width:e.width()/this.canvas.scale,height:e.height()/this.canvas.scale}},jvm.VMLGroupElement=function(){jvm.VMLGroupElement.parentClass.call(this,"group"),this.node.style.left="0px",this.node.style.top="0px",this.node.coordorigin="0 0"},jvm.inherits(jvm.VMLGroupElement,jvm.VMLElement),jvm.VMLGroupElement.prototype.add=function(e){this.node.appendChild(e.node)},jvm.VMLCanvasElement=function(e,t,n){this.classPrefix="VML",jvm.VMLCanvasElement.parentClass.call(this,"group"),jvm.AbstractCanvasElement.apply(this,arguments),this.node.style.position="absolute"},jvm.inherits(jvm.VMLCanvasElement,jvm.VMLElement),jvm.mixin(jvm.VMLCanvasElement,jvm.AbstractCanvasElement),jvm.VMLCanvasElement.prototype.setSize=function(e,t){var n,r,i,s;this.width=e,this.height=t,this.node.style.width=e+"px",this.node.style.height=t+"px",this.node.coordsize=e+" "+t,this.node.coordorigin="0 0";if(this.rootElement){n=this.rootElement.node.getElementsByTagName("shape");for(i=0,s=n.length;i<s;i++)n[i].coordsize=e+" "+t,n[i].style.width=e+"px",n[i].style.height=t+"px";r=this.node.getElementsByTagName("group");for(i=0,s=r.length;i<s;i++)r[i].coordsize=e+" "+t,r[i].style.width=e+"px",r[i].style.height=t+"px"}},jvm.VMLCanvasElement.prototype.applyTransformParams=function(e,t,n){this.scale=e,this.transX=t,this.transY=n,this.rootElement.node.coordorigin=this.width-t-this.width/100+","+(this.height-n-this.height/100),this.rootElement.node.coordsize=this.width/e+","+this.height/e},jvm.VMLShapeElement=function(e,t){jvm.VMLShapeElement.parentClass.call(this,e,t),this.fillElement=new jvm.VMLElement("fill"),this.strokeElement=new jvm.VMLElement("stroke"),this.node.appendChild(this.fillElement.node),this.node.appendChild(this.strokeElement.node),this.node.stroked=!1,jvm.AbstractShapeElement.apply(this,arguments)},jvm.inherits(jvm.VMLShapeElement,jvm.VMLElement),jvm.mixin(jvm.VMLShapeElement,jvm.AbstractShapeElement),jvm.VMLShapeElement.prototype.applyAttr=function(e,t){switch(e){case"fill":this.node.fillcolor=t;break;case"fill-opacity":this.fillElement.node.opacity=Math.round(t*100)+"%";break;case"stroke":t==="none"?this.node.stroked=!1:this.node.stroked=!0,this.node.strokecolor=t;break;case"stroke-opacity":this.strokeElement.node.opacity=Math.round(t*100)+"%";break;case"stroke-width":parseInt(t,10)===0?this.node.stroked=!1:this.node.stroked=!0,this.node.strokeweight=t;break;case"d":this.node.path=jvm.VMLPathElement.pathSvgToVml(t);break;default:jvm.VMLShapeElement.parentClass.prototype.applyAttr.apply(this,arguments)}},jvm.VMLPathElement=function(e,t){var n=new jvm.VMLElement("skew");jvm.VMLPathElement.parentClass.call(this,"shape",e,t),this.node.coordorigin="0 0",n.node.on=!0,n.node.matrix="0.01,0,0,0.01,0,0",n.node.offset="0,0",this.node.appendChild(n.node)},jvm.inherits(jvm.VMLPathElement,jvm.VMLShapeElement),jvm.VMLPathElement.prototype.applyAttr=function(e,t){e==="d"?this.node.path=jvm.VMLPathElement.pathSvgToVml(t):jvm.VMLShapeElement.prototype.applyAttr.call(this,e,t)},jvm.VMLPathElement.pathSvgToVml=function(e){var t="",n=0,r=0,i,s;return e=e.replace(/(-?\d+)e(-?\d+)/g,"0"),e.replace(/([MmLlHhVvCcSs])\s*((?:-?\d*(?:\.\d+)?\s*,?\s*)+)/g,function(e,t,o,u){o=o.replace(/(\d)-/g,"$1,-").replace(/^\s+/g,"").replace(/\s+$/g,"").replace(/\s+/g,",").split(","),o[0]||o.shift();for(var a=0,f=o.length;a<f;a++)o[a]=Math.round(100*o[a]);switch(t){case"m":return n+=o[0],r+=o[1],"t"+o.join(",");case"M":return n=o[0],r=o[1],"m"+o.join(",");case"l":return n+=o[0],r+=o[1],"r"+o.join(",");case"L":return n=o[0],r=o[1],"l"+o.join(",");case"h":return n+=o[0],"r"+o[0]+",0";case"H":return n=o[0],"l"+n+","+r;case"v":return r+=o[0],"r0,"+o[0];case"V":return r=o[0],"l"+n+","+r;case"c":return i=n+o[o.length-4],s=r+o[o.length-3],n+=o[o.length-2],r+=o[o.length-1],"v"+o.join(",");case"C":return i=o[o.length-4],s=o[o.length-3],n=o[o.length-2],r=o[o.length-1],"c"+o.join(",");case"s":return o.unshift(r-s),o.unshift(n-i),i=n+o[o.length-4],s=r+o[o.length-3],n+=o[o.length-2],r+=o[o.length-1],"v"+o.join(",");case"S":return o.unshift(r+r-s),o.unshift(n+n-i),i=o[o.length-4],s=o[o.length-3],n=o[o.length-2],r=o[o.length-1],"c"+o.join(",")}return""}).replace(/z/g,"e")},jvm.VMLCircleElement=function(e,t){jvm.VMLCircleElement.parentClass.call(this,"oval",e,t)},jvm.inherits(jvm.VMLCircleElement,jvm.VMLShapeElement),jvm.VMLCircleElement.prototype.applyAttr=function(e,t){switch(e){case"r":this.node.style.width=t*2+"px",this.node.style.height=t*2+"px",this.applyAttr("cx",this.get("cx")||0),this.applyAttr("cy",this.get("cy")||0);break;case"cx":if(!t)return;this.node.style.left=t-(this.get("r")||0)+"px";break;case"cy":if(!t)return;this.node.style.top=t-(this.get("r")||0)+"px";break;default:jvm.VMLCircleElement.parentClass.prototype.applyAttr.call(this,e,t)}},jvm.VectorCanvas=function(e,t,n){return this.mode=window.SVGAngle?"svg":"vml",this.mode=="svg"?this.impl=new jvm.SVGCanvasElement(e,t,n):this.impl=new jvm.VMLCanvasElement(e,t,n),this.impl},jvm.SimpleScale=function(e){this.scale=e},jvm.SimpleScale.prototype.getValue=function(e){return e},jvm.OrdinalScale=function(e){this.scale=e},jvm.OrdinalScale.prototype.getValue=function(e){return this.scale[e]},jvm.NumericScale=function(e,t,n,r){this.scale=[],t=t||"linear",e&&this.setScale(e),t&&this.setNormalizeFunction(t),n&&this.setMin(n),r&&this.setMax(r)},jvm.NumericScale.prototype={setMin:function(e){this.clearMinValue=e,typeof this.normalize=="function"?this.minValue=this.normalize(e):this.minValue=e},setMax:function(e){this.clearMaxValue=e,typeof this.normalize=="function"?this.maxValue=this.normalize(e):this.maxValue=e},setScale:function(e){var t;for(t=0;t<e.length;t++)this.scale[t]=[e[t]]},setNormalizeFunction:function(e){e==="polynomial"?this.normalize=function(e){return Math.pow(e,.2)}:e==="linear"?delete this.normalize:this.normalize=e,this.setMin(this.clearMinValue),this.setMax(this.clearMaxValue)},getValue:function(e){var t=[],n=0,r,i=0,s;typeof this.normalize=="function"&&(e=this.normalize(e));for(i=0;i<this.scale.length-1;i++)r=this.vectorLength(this.vectorSubtract(this.scale[i+1],this.scale[i])),t.push(r),n+=r;s=(this.maxValue-this.minValue)/n;for(i=0;i<t.length;i++)t[i]*=s;i=0,e-=this.minValue;while(e-t[i]>=0)e-=t[i],i++;return i==this.scale.length-1?e=this.vectorToNum(this.scale[i]):e=this.vectorToNum(this.vectorAdd(this.scale[i],this.vectorMult(this.vectorSubtract(this.scale[i+1],this.scale[i]),e/t[i]))),e},vectorToNum:function(e){var t=0,n;for(n=0;n<e.length;n++)t+=Math.round(e[n])*Math.pow(256,e.length-n-1);return t},vectorSubtract:function(e,t){var n=[],r;for(r=0;r<e.length;r++)n[r]=e[r]-t[r];return n},vectorAdd:function(e,t){var n=[],r;for(r=0;r<e.length;r++)n[r]=e[r]+t[r];return n},vectorMult:function(e,t){var n=[],r;for(r=0;r<e.length;r++)n[r]=e[r]*t;return n},vectorLength:function(e){var t=0,n;for(n=0;n<e.length;n++)t+=e[n]*e[n];return Math.sqrt(t)}},jvm.ColorScale=function(e,t,n,r){jvm.ColorScale.parentClass.apply(this,arguments)},jvm.inherits(jvm.ColorScale,jvm.NumericScale),jvm.ColorScale.prototype.setScale=function(e){var t;for(t=0;t<e.length;t++)this.scale[t]=jvm.ColorScale.rgbToArray(e[t])},jvm.ColorScale.prototype.getValue=function(e){return jvm.ColorScale.numToRgb(jvm.ColorScale.parentClass.prototype.getValue.call(this,e))},jvm.ColorScale.arrayToRgb=function(e){var t="#",n,r;for(r=0;r<e.length;r++)n=e[r].toString(16),t+=n.length==1?"0"+n:n;return t},jvm.ColorScale.numToRgb=function(e){e=e.toString(16);while(e.length<6)e="0"+e;return"#"+e},jvm.ColorScale.rgbToArray=function(e){return e=e.substr(1),[parseInt(e.substr(0,2),16),parseInt(e.substr(2,2),16),parseInt(e.substr(4,2),16)]},jvm.DataSeries=function(e,t){var n;e=e||{},e.attribute=e.attribute||"fill",this.elements=t,this.params=e,e.attributes&&this.setAttributes(e.attributes),jvm.$.isArray(e.scale)?(n=e.attribute==="fill"||e.attribute==="stroke"?jvm.ColorScale:jvm.NumericScale,this.scale=new n(e.scale,e.normalizeFunction,e.min,e.max)):e.scale?this.scale=new jvm.OrdinalScale(e.scale):this.scale=new jvm.SimpleScale(e.scale),this.values=e.values||{},this.setValues(this.values)},jvm.DataSeries.prototype={setAttributes:function(e,t){var n=e,r;if(typeof e=="string")this.elements[e]&&this.elements[e].setStyle(this.params.attribute,t);else for(r in n)this.elements[r]&&this.elements[r].element.setStyle(this.params.attribute,n[r])},setValues:function(e){var t=Number.MIN_VALUE,n=Number.MAX_VALUE,r,i,s={};if(this.scale instanceof jvm.OrdinalScale||this.scale instanceof jvm.SimpleScale)for(i in e)e[i]?s[i]=this.scale.getValue(e[i]):s[i]=this.elements[i].element.style.initial[this.params.attribute];else{if(!this.params.min||!this.params.max){for(i in e)r=parseFloat(e[i]),r>t&&(t=e[i]),r<n&&(n=r);this.params.min||this.scale.setMin(n),this.params.max||this.scale.setMax(t),this.params.min=n,this.params.max=t}for(i in e)r=parseFloat(e[i]),isNaN(r)?s[i]=this.elements[i].element.style.initial[this.params.attribute]:s[i]=this.scale.getValue(r)}this.setAttributes(s),jvm.$.extend(this.values,e)},clear:function(){var e,t={};for(e in this.values)this.elements[e]&&(t[e]=this.elements[e].element.style.initial[this.params.attribute]);this.setAttributes(t),this.values={}},setScale:function(e){this.scale.setScale(e),this.values&&this.setValues(this.values)},setNormalizeFunction:function(e){this.scale.setNormalizeFunction(e),this.values&&this.setValues(this.values)}},jvm.Proj={degRad:180/Math.PI,radDeg:Math.PI/180,radius:6381372,sgn:function(e){return e>0?1:e<0?-1:e},mill:function(e,t,n){return{x:this.radius*(t-n)*this.radDeg,y:-this.radius*Math.log(Math.tan((45+.4*e)*this.radDeg))/.8}},mill_inv:function(e,t,n){return{lat:(2.5*Math.atan(Math.exp(.8*t/this.radius))-5*Math.PI/8)*this.degRad,lng:(n*this.radDeg+e/this.radius)*this.degRad}},merc:function(e,t,n){return{x:this.radius*(t-n)*this.radDeg,y:-this.radius*Math.log(Math.tan(Math.PI/4+e*Math.PI/360))}},merc_inv:function(e,t,n){return{lat:(2*Math.atan(Math.exp(t/this.radius))-Math.PI/2)*this.degRad,lng:(n*this.radDeg+e/this.radius)*this.degRad}},aea:function(e,t,n){var r=0,i=n*this.radDeg,s=29.5*this.radDeg,o=45.5*this.radDeg,u=e*this.radDeg,a=t*this.radDeg,f=(Math.sin(s)+Math.sin(o))/2,l=Math.cos(s)*Math.cos(s)+2*f*Math.sin(s),c=f*(a-i),h=Math.sqrt(l-2*f*Math.sin(u))/f,p=Math.sqrt(l-2*f*Math.sin(r))/f;return{x:h*Math.sin(c)*this.radius,y:-(p-h*Math.cos(c))*this.radius}},aea_inv:function(e,t,n){var r=e/this.radius,i=t/this.radius,s=0,o=n*this.radDeg,u=29.5*this.radDeg,a=45.5*this.radDeg,f=(Math.sin(u)+Math.sin(a))/2,l=Math.cos(u)*Math.cos(u)+2*f*Math.sin(u),c=Math.sqrt(l-2*f*Math.sin(s))/f,h=Math.sqrt(r*r+(c-i)*(c-i)),p=Math.atan(r/(c-i));return{lat:Math.asin((l-h*h*f*f)/(2*f))*this.degRad,lng:(o+p/f)*this.degRad}},lcc:function(e,t,n){var r=0,i=n*this.radDeg,s=t*this.radDeg,o=33*this.radDeg,u=45*this.radDeg,a=e*this.radDeg,f=Math.log(Math.cos(o)*(1/Math.cos(u)))/Math.log(Math.tan(Math.PI/4+u/2)*(1/Math.tan(Math.PI/4+o/2))),l=Math.cos(o)*Math.pow(Math.tan(Math.PI/4+o/2),f)/f,c=l*Math.pow(1/Math.tan(Math.PI/4+a/2),f),h=l*Math.pow(1/Math.tan(Math.PI/4+r/2),f);return{x:c*Math.sin(f*(s-i))*this.radius,y:-(h-c*Math.cos(f*(s-i)))*this.radius}},lcc_inv:function(e,t,n){var r=e/this.radius,i=t/this.radius,s=0,o=n*this.radDeg,u=33*this.radDeg,a=45*this.radDeg,f=Math.log(Math.cos(u)*(1/Math.cos(a)))/Math.log(Math.tan(Math.PI/4+a/2)*(1/Math.tan(Math.PI/4+u/2))),l=Math.cos(u)*Math.pow(Math.tan(Math.PI/4+u/2),f)/f,c=l*Math.pow(1/Math.tan(Math.PI/4+s/2),f),h=this.sgn(f)*Math.sqrt(r*r+(c-i)*(c-i)),p=Math.atan(r/(c-i));return{lat:(2*Math.atan(Math.pow(l/h,1/f))-Math.PI/2)*this.degRad,lng:(o+p/f)*this.degRad}}},jvm.WorldMap=function(e){var t=this,n;this.params=jvm.$.extend(!0,{},jvm.WorldMap.defaultParams,e);if(!jvm.WorldMap.maps[this.params.map])throw new Error("Attempt to use map which was not loaded: "+this.params.map);this.mapData=jvm.WorldMap.maps[this.params.map],this.markers={},this.regions={},this.regionsColors={},this.regionsData={},this.container=jvm.$("<div>").css({width:"100%",height:"100%"}).addClass("jvectormap-container"),this.params.container.append(this.container),this.container.data("mapObject",this),this.container.css({position:"relative",overflow:"hidden"}),this.defaultWidth=this.mapData.width,this.defaultHeight=this.mapData.height,this.setBackgroundColor(this.params.backgroundColor),this.onResize=function(){t.setSize()},jvm.$(window).resize(this.onResize);for(n in jvm.WorldMap.apiEvents)this.params[n]&&this.container.bind(jvm.WorldMap.apiEvents[n]+".jvectormap",this.params[n]);this.canvas=new jvm.VectorCanvas(this.container[0],this.width,this.height),"ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch?this.params.bindTouchEvents&&this.bindContainerTouchEvents():this.bindContainerEvents(),this.bindElementEvents(),this.createLabel(),this.params.zoomButtons&&this.bindZoomButtons(),this.createRegions(),this.createMarkers(this.params.markers||{}),this.setSize(),this.params.focusOn&&(typeof this.params.focusOn=="object"?this.setFocus.call(this,this.params.focusOn.scale,this.params.focusOn.x,this.params.focusOn.y):this.setFocus.call(this,this.params.focusOn)),this.params.selectedRegions&&this.setSelectedRegions(this.params.selectedRegions),this.params.selectedMarkers&&this.setSelectedMarkers(this.params.selectedMarkers),this.params.series&&this.createSeries()},jvm.WorldMap.prototype={transX:0,transY:0,scale:1,baseTransX:0,baseTransY:0,baseScale:1,width:0,height:0,setBackgroundColor:function(e){this.container.css("background-color",e)},resize:function(){var e=this.baseScale;this.width/this.height>this.defaultWidth/this.defaultHeight?(this.baseScale=this.height/this.defaultHeight,this.baseTransX=Math.abs(this.width-this.defaultWidth*this.baseScale)/(2*this.baseScale)):(this.baseScale=this.width/this.defaultWidth,this.baseTransY=Math.abs(this.height-this.defaultHeight*this.baseScale)/(2*this.baseScale)),this.scale*=this.baseScale/e,this.transX*=this.baseScale/e,this.transY*=this.baseScale/e},setSize:function(){this.width=this.container.width(),this.height=this.container.height(),this.resize(),this.canvas.setSize(this.width,this.height),this.applyTransform()},reset:function(){var e,t;for(e in this.series)for(t=0;t<this.series[e].length;t++)this.series[e][t].clear();this.scale=this.baseScale,this.transX=this.baseTransX,this.transY=this.baseTransY,this.applyTransform()},applyTransform:function(){var e,t,n,r;this.defaultWidth*this.scale<=this.width?(e=(this.width-this.defaultWidth*this.scale)/(2*this.scale),n=(this.width-this.defaultWidth*this.scale)/(2*this.scale)):(e=0,n=(this.width-this.defaultWidth*this.scale)/this.scale),this.defaultHeight*this.scale<=this.height?(t=(this.height-this.defaultHeight*this.scale)/(2*this.scale),r=(this.height-this.defaultHeight*this.scale)/(2*this.scale)):(t=0,r=(this.height-this.defaultHeight*this.scale)/this.scale),this.transY>t?this.transY=t:this.transY<r&&(this.transY=r),this.transX>e?this.transX=e:this.transX<n&&(this.transX=n),this.canvas.applyTransformParams(this.scale,this.transX,this.transY),this.markers&&this.repositionMarkers(),this.container.trigger("viewportChange",[this.scale/this.baseScale,this.transX,this.transY])},bindContainerEvents:function(){var e=!1,t,n,r=this;this.container.mousemove(function(i){return e&&(r.transX-=(t-i.pageX)/r.scale,r.transY-=(n-i.pageY)/r.scale,r.applyTransform(),t=i.pageX,n=i.pageY),!1}).mousedown(function(r){return e=!0,t=r.pageX,n=r.pageY,!1}),jvm.$("body").mouseup(function(){e=!1}),this.params.zoomOnScroll&&this.container.mousewheel(function(e,t,n,i){var s=jvm.$(r.container).offset(),o=e.pageX-s.left,u=e.pageY-s.top,a=Math.pow(1.3,i);r.label.hide(),r.setScale(r.scale*a,o,u),e.preventDefault()})},bindContainerTouchEvents:function(){var e,t,n=this,r,i,s,o,u,a=function(a){var f=a.originalEvent.touches,l,c,h,p;a.type=="touchstart"&&(u=0),f.length==1?(u==1&&(h=n.transX,p=n.transY,n.transX-=(r-f[0].pageX)/n.scale,n.transY-=(i-f[0].pageY)/n.scale,n.applyTransform(),n.label.hide(),(h!=n.transX||p!=n.transY)&&a.preventDefault()),r=f[0].pageX,i=f[0].pageY):f.length==2&&(u==2?(c=Math.sqrt(Math.pow(f[0].pageX-f[1].pageX,2)+Math.pow(f[0].pageY-f[1].pageY,2))/t,n.setScale(e*c,s,o),n.label.hide(),a.preventDefault()):(l=jvm.$(n.container).offset(),f[0].pageX>f[1].pageX?s=f[1].pageX+(f[0].pageX-f[1].pageX)/2:s=f[0].pageX+(f[1].pageX-f[0].pageX)/2,f[0].pageY>f[1].pageY?o=f[1].pageY+(f[0].pageY-f[1].pageY)/2:o=f[0].pageY+(f[1].pageY-f[0].pageY)/2,s-=l.left,o-=l.top,e=n.scale,t=Math.sqrt(Math.pow(f[0].pageX-f[1].pageX,2)+Math.pow(f[0].pageY-f[1].pageY,2)))),u=f.length};jvm.$(this.container).bind("touchstart",a),jvm.$(this.container).bind("touchmove",a)},bindElementEvents:function(){var e=this,t;this.container.mousemove(function(){t=!0}),this.container.delegate("[class~='jvectormap-element']","mouseover mouseout",function(t){var n=this,r=jvm.$(this).attr("class").baseVal?jvm.$(this).attr("class").baseVal:jvm.$(this).attr("class"),i=r.indexOf("jvectormap-region")===-1?"marker":"region",s=i=="region"?jvm.$(this).attr("data-code"):jvm.$(this).attr("data-index"),o=i=="region"?e.regions[s].element:e.markers[s].element,u=i=="region"?e.mapData.paths[s].name:e.markers[s].config.name||"",a=jvm.$.Event(i+"LabelShow.jvectormap"),f=jvm.$.Event(i+"Over.jvectormap");t.type=="mouseover"?(e.container.trigger(f,[s]),f.isDefaultPrevented()||o.setHovered(!0),e.label.text(u),e.container.trigger(a,[e.label,s]),a.isDefaultPrevented()||(e.label.show(),e.labelWidth=e.label.width(),e.labelHeight=e.label.height())):(o.setHovered(!1),e.label.hide(),e.container.trigger(i+"Out.jvectormap",[s]))}),this.container.delegate("[class~='jvectormap-element']","mousedown",function(e){t=!1}),this.container.delegate("[class~='jvectormap-element']","mouseup",function(n){var r=this,i=jvm.$(this).attr("class").baseVal?jvm.$(this).attr("class").baseVal:jvm.$(this).attr("class"),s=i.indexOf("jvectormap-region")===-1?"marker":"region",o=s=="region"?jvm.$(this).attr("data-code"):jvm.$(this).attr("data-index"),u=jvm.$.Event(s+"Click.jvectormap"),a=s=="region"?e.regions[o].element:e.markers[o].element;if(!t){e.container.trigger(u,[o]);if(s==="region"&&e.params.regionsSelectable||s==="marker"&&e.params.markersSelectable)u.isDefaultPrevented()||(e.params[s+"sSelectableOne"]&&e.clearSelected(s+"s"),a.setSelected(!a.isSelected))}})},bindZoomButtons:function(){var e=this;jvm.$("<div/>").addClass("jvectormap-zoomin").text("+").appendTo(this.container),jvm.$("<div/>").addClass("jvectormap-zoomout").html("&#x2212;").appendTo(this.container),this.container.find(".jvectormap-zoomin").click(function(){e.setScale(e.scale*e.params.zoomStep,e.width/2,e.height/2)}),this.container.find(".jvectormap-zoomout").click(function(){e.setScale(e.scale/e.params.zoomStep,e.width/2,e.height/2)})},createLabel:function(){var e=this;this.label=jvm.$("<div/>").addClass("jvectormap-label").appendTo(jvm.$("body")),this.container.mousemove(function(t){var n=t.pageX-15-e.labelWidth,r=t.pageY-15-e.labelHeight;n<5&&(n=t.pageX+15),r<5&&(r=t.pageY+15),e.label.is(":visible")&&e.label.css({left:n,top:r})})},setScale:function(e,t,n,r){var i,s=jvm.$.Event("zoom.jvectormap");e>this.params.zoomMax*this.baseScale?e=this.params.zoomMax*this.baseScale:e<this.params.zoomMin*this.baseScale&&(e=this.params.zoomMin*this.baseScale),typeof t!="undefined"&&typeof n!="undefined"&&(i=e/this.scale,r?(this.transX=t+this.defaultWidth*(this.width/(this.defaultWidth*e))/2,this.transY=n+this.defaultHeight*(this.height/(this.defaultHeight*e))/2):(this.transX-=(i-1)/e*t,this.transY-=(i-1)/e*n)),this.scale=e,this.applyTransform(),this.container.trigger(s,[e/this.baseScale])},setFocus:function(e,t,n){var r,i,s,o,u;if(jvm.$.isArray(e)||this.regions[e]){jvm.$.isArray(e)?o=e:o=[e];for(u=0;u<o.length;u++)this.regions[o[u]]&&(i=this.regions[o[u]].element.getBBox(),i&&(typeof r=="undefined"?r=i:(s={x:Math.min(r.x,i.x),y:Math.min(r.y,i.y),width:Math.max(r.x+r.width,i.x+i.width)-Math.min(r.x,i.x),height:Math.max(r.y+r.height,i.y+i.height)-Math.min(r.y,i.y)},r=s)));this.setScale(Math.min(this.width/r.width,this.height/r.height),-(r.x+r.width/2),-(r.y+r.height/2),!0)}else e*=this.baseScale,this.setScale(e,-t*this.defaultWidth,-n*this.defaultHeight,!0)},getSelected:function(e){var t,n=[];for(t in this[e])this[e][t].element.isSelected&&n.push(t);return n},getSelectedRegions:function(){return this.getSelected("regions")},getSelectedMarkers:function(){return this.getSelected("markers")},setSelected:function(e,t){var n;typeof t!="object"&&(t=[t]);if(jvm.$.isArray(t))for(n=0;n<t.length;n++)this[e][t[n]].element.setSelected(!0);else for(n in t)this[e][n].element.setSelected(!!t[n])},setSelectedRegions:function(e){this.setSelected("regions",e)},setSelectedMarkers:function(e){this.setSelected("markers",e)},clearSelected:function(e){var t={},n=this.getSelected(e),r;for(r=0;r<n.length;r++)t[n[r]]=!1;this.setSelected(e,t)},clearSelectedRegions:function(){this.clearSelected("regions")},clearSelectedMarkers:function(){this.clearSelected("markers")},getMapObject:function(){return this},getRegionName:function(e){return this.mapData.paths[e].name},createRegions:function(){var e,t,n=this;for(e in this.mapData.paths)t=this.canvas.addPath({d:this.mapData.paths[e].path,"data-code":e},jvm.$.extend(!0,{},this.params.regionStyle)),jvm.$(t.node).bind("selected",function(e,t){n.container.trigger("regionSelected.jvectormap",[jvm.$(this).attr("data-code"),t,n.getSelectedRegions()])}),t.addClass("jvectormap-region jvectormap-element"),this.regions[e]={element:t,config:this.mapData.paths[e]}},createMarkers:function(e){var t,n,r,i,s,o=this;this.markersGroup=this.markersGroup||this.canvas.addGroup();if(jvm.$.isArray(e)){s=e.slice(),e={};for(t=0;t<s.length;t++)e[t]=s[t]}for(t in e)i=e[t]instanceof Array?{latLng:e[t]}:e[t],r=this.getMarkerPosition(i),r!==!1&&(n=this.canvas.addCircle({"data-index":t,cx:r.x,cy:r.y},jvm.$.extend(!0,{},this.params.markerStyle,{initial:i.style||{}}),this.markersGroup),n.addClass("jvectormap-marker jvectormap-element"),jvm.$(n.node).bind("selected",function(e,t){o.container.trigger("markerSelected.jvectormap",[jvm.$(this).attr("data-index"),t,o.getSelectedMarkers()])}),this.markers[t]&&this.removeMarkers([t]),this.markers[t]={element:n,config:i})},repositionMarkers:function(){var e,t;for(e in this.markers)t=this.getMarkerPosition(this.markers[e].config),t!==!1&&this.markers[e].element.setStyle({cx:t.x,cy:t.y})},getMarkerPosition:function(e){return jvm.WorldMap.maps[this.params.map].projection?this.latLngToPoint.apply(this,e.latLng||[0,0]):{x:e.coords[0]*this.scale+this.transX*this.scale,y:e.coords[1]*this.scale+this.transY*this.scale}},addMarker:function(e,t,n){var r={},i=[],s,o,n=n||[];r[e]=t;for(o=0;o<n.length;o++)s={},s[e]=n[o],i.push(s);this.addMarkers(r,i)},addMarkers:function(e,t){var n;t=t||[],this.createMarkers(e);for(n=0;n<t.length;n++)this.series.markers[n].setValues(t[n]||{})},removeMarkers:function(e){var t;for(t=0;t<e.length;t++)this.markers[e[t]].element.remove(),delete this.markers[e[t]]},removeAllMarkers:function(){var e,t=[];for(e in this.markers)t.push(e);this.removeMarkers(t)},latLngToPoint:function(e,t){var n,r=jvm.WorldMap.maps[this.params.map].projection,i=r.centralMeridian,s=this.width-this.baseTransX*2*this.baseScale,o=this.height-this.baseTransY*2*this.baseScale,u,a,f=this.scale/this.baseScale;return t<-180+i&&(t+=360),n=jvm.Proj[r.type](e,t,i),u=this.getInsetForPoint(n.x,n.y),u?(a=u.bbox,n.x=(n.x-a[0].x)/(a[1].x-a[0].x)*u.width*this.scale,n.y=(n.y-a[0].y)/(a[1].y-a[0].y)*u.height*this.scale,{x:n.x+this.transX*this.scale+u.left*this.scale,y:n.y+this.transY*this.scale+u.top*this.scale}):!1},pointToLatLng:function(e,t){var n=jvm.WorldMap.maps[this.params.map].projection,r=n.centralMeridian,i=jvm.WorldMap.maps[this.params.map].insets,s,o,u,a,f;for(s=0;s<i.length;s++){o=i[s],u=o.bbox,a=e-(this.transX*this.scale+o.left*this.scale),f=t-(this.transY*this.scale+o.top*this.scale),a=a/(o.width*this.scale)*(u[1].x-u[0].x)+u[0].x,f=f/(o.height*this.scale)*(u[1].y-u[0].y)+u[0].y;if(a>u[0].x&&a<u[1].x&&f>u[0].y&&f<u[1].y)return jvm.Proj[n.type+"_inv"](a,-f,r)}return!1},getInsetForPoint:function(e,t){var n=jvm.WorldMap.maps[this.params.map].insets,r,i;for(r=0;r<n.length;r++){i=n[r].bbox;if(e>i[0].x&&e<i[1].x&&t>i[0].y&&t<i[1].y)return n[r]}},createSeries:function(){var e,t;this.series={markers:[],regions:[]};for(t in this.params.series)for(e=0;e<this.params.series[t].length;e++)this.series[t][e]=new jvm.DataSeries(this.params.series[t][e],this[t])},remove:function(){this.label.remove(),this.container.remove(),jvm.$(window).unbind("resize",this.onResize)}},jvm.WorldMap.maps={},jvm.WorldMap.defaultParams={map:"world_mill_en",backgroundColor:"#505050",zoomButtons:!0,zoomOnScroll:!0,zoomMax:8,zoomMin:1,zoomStep:1.6,regionsSelectable:!1,markersSelectable:!1,bindTouchEvents:!0,regionStyle:{initial:{fill:"white","fill-opacity":1,stroke:"none","stroke-width":0,"stroke-opacity":1},hover:{"fill-opacity":.8},selected:{fill:"yellow"},selectedHover +:{}},markerStyle:{initial:{fill:"grey",stroke:"#505050","fill-opacity":1,"stroke-width":1,"stroke-opacity":1,r:5},hover:{stroke:"black","stroke-width":2},selected:{fill:"blue"},selectedHover:{}}},jvm.WorldMap.apiEvents={onRegionLabelShow:"regionLabelShow",onRegionOver:"regionOver",onRegionOut:"regionOut",onRegionClick:"regionClick",onRegionSelected:"regionSelected",onMarkerLabelShow:"markerLabelShow",onMarkerOver:"markerOver",onMarkerOut:"markerOut",onMarkerClick:"markerClick",onMarkerSelected:"markerSelected",onViewportChange:"viewportChange"}; \ No newline at end of file diff --git a/theme/bootstrap/plugins/jvectormap/jquery-jvectormap-world-mill-en.js b/theme/bootstrap/plugins/jvectormap/jquery-jvectormap-world-mill-en.js new file mode 100644 index 0000000..89f7783 --- /dev/null +++ b/theme/bootstrap/plugins/jvectormap/jquery-jvectormap-world-mill-en.js @@ -0,0 +1 @@ +$.fn.vectorMap('addMap', 'world_mill_en',{"insets": [{"width": 900.0, "top": 0, "height": 440.7063107441331, "bbox": [{"y": -12671671.123330014, "x": -20004297.151525836}, {"y": 6930392.02513512, "x": 20026572.394749384}], "left": 0}], "paths": {"BD": {"path": "M652.71,228.85l-0.04,1.38l-0.46,-0.21l-0.42,0.3l0.05,0.65l-0.17,-1.37l-0.48,-1.26l-1.08,-1.6l-0.23,-0.13l-2.31,-0.11l-0.31,0.36l0.21,0.98l-0.6,1.11l-0.8,-0.4l-0.37,0.09l-0.23,0.3l-0.54,-0.21l-0.78,-0.19l-0.38,-2.04l-0.83,-1.89l0.4,-1.5l-0.16,-0.35l-1.24,-0.57l0.36,-0.62l1.5,-0.95l0.02,-0.49l-1.62,-1.26l0.64,-1.31l1.7,1.0l0.12,0.04l0.96,0.11l0.19,1.62l0.25,0.26l2.38,0.37l2.32,-0.04l1.06,0.33l-0.92,1.79l-0.97,0.13l-0.23,0.16l-0.77,1.51l0.05,0.35l1.37,1.37l0.5,-0.14l0.35,-1.46l0.24,-0.0l1.24,3.92Z", "name": "Bangladesh"}, "BE": {"path": "M429.28,143.95l1.76,0.25l0.13,-0.01l2.16,-0.64l1.46,1.34l1.26,0.71l-0.23,1.8l-0.44,0.08l-0.24,0.25l-0.2,1.36l-1.8,-1.22l-0.23,-0.05l-1.14,0.23l-1.62,-1.43l-1.15,-1.31l-0.21,-0.1l-0.95,-0.04l-0.21,-0.68l1.66,-0.54Z", "name": "Belgium"}, "BF": {"path": "M413.48,260.21l-1.22,-0.46l-0.13,-0.02l-1.17,0.1l-0.15,0.06l-0.73,0.53l-0.87,-0.41l-0.39,-0.75l-0.13,-0.13l-0.98,-0.48l-0.14,-1.2l0.63,-0.99l0.05,-0.18l-0.05,-0.73l1.9,-2.01l0.08,-0.14l0.35,-1.65l0.49,-0.44l1.05,0.3l0.21,-0.02l1.05,-0.52l0.13,-0.13l0.3,-0.58l1.87,-1.1l0.11,-0.1l0.43,-0.72l2.23,-1.01l1.21,-0.32l0.51,0.4l0.19,0.06l1.25,-0.01l-0.14,0.89l0.01,0.13l0.34,1.16l0.06,0.11l1.35,1.59l0.07,1.13l0.24,0.28l2.64,0.53l-0.05,1.39l-0.42,0.59l-1.11,0.21l-0.22,0.17l-0.46,0.99l-0.69,0.23l-2.12,-0.05l-1.14,-0.2l-0.19,0.03l-0.72,0.36l-1.07,-0.17l-4.35,0.12l-0.29,0.29l-0.06,1.44l0.25,1.45Z", "name": "Burkina Faso"}, "BG": {"path": "M477.63,166.84l0.51,0.9l0.33,0.14l0.9,-0.21l1.91,0.47l3.68,0.16l0.17,-0.05l1.2,-0.75l2.78,-0.67l1.72,1.05l1.02,0.24l-0.97,0.97l-0.91,2.17l0.0,0.24l0.56,1.19l-1.58,-0.3l-0.16,0.01l-2.55,0.95l-0.2,0.28l-0.02,1.23l-1.92,0.24l-1.68,-0.99l-0.27,-0.02l-1.94,0.8l-1.52,-0.07l-0.15,-1.72l-0.12,-0.21l-0.99,-0.76l0.18,-0.18l0.02,-0.39l-0.17,-0.22l0.33,-0.75l0.91,-0.91l0.01,-0.42l-1.16,-1.25l-0.18,-0.89l0.24,-0.27Z", "name": "Bulgaria"}, "BA": {"path": "M468.39,164.66l0.16,0.04l0.43,-0.0l-0.43,0.93l0.06,0.34l1.08,1.06l-0.28,1.09l-0.5,0.13l-0.47,0.28l-0.86,0.74l-0.1,0.16l-0.28,1.29l-1.81,-0.94l-0.9,-1.22l-1.0,-0.73l-1.1,-1.1l-0.55,-0.96l-1.11,-1.3l0.3,-0.75l0.59,0.46l0.42,-0.04l0.46,-0.54l1.0,-0.06l2.11,0.5l1.72,-0.03l1.06,0.64Z", "name": "Bosnia and Herzegovina"}, "BN": {"path": "M707.34,273.57l0.76,-0.72l1.59,-1.03l-0.18,1.93l-0.9,-0.06l-0.28,0.14l-0.31,0.51l-0.68,-0.78Z", "name": "Brunei"}, "BO": {"path": "M263.83,340.79l-0.23,-0.12l-2.86,-0.11l-0.28,0.17l-0.77,1.67l-1.17,-1.51l-0.18,-0.11l-3.28,-0.64l-0.28,0.1l-2.02,2.3l-1.43,0.29l-0.91,-3.35l-1.31,-2.88l0.75,-2.41l-0.09,-0.32l-1.23,-1.03l-0.31,-1.76l-0.05,-0.12l-1.12,-1.6l1.49,-2.62l0.01,-0.28l-1.0,-2.0l0.48,-0.72l0.02,-0.29l-0.37,-0.78l0.87,-1.13l0.06,-0.18l0.05,-2.17l0.12,-1.71l0.5,-0.8l0.01,-0.3l-1.9,-3.58l1.3,0.15l1.34,-0.05l0.23,-0.12l0.51,-0.7l2.12,-0.99l1.31,-0.93l2.81,-0.37l-0.21,1.51l0.01,0.13l0.29,0.91l-0.19,1.64l0.11,0.27l2.72,2.27l0.15,0.07l2.71,0.41l0.92,0.88l0.12,0.07l1.64,0.49l1.0,0.71l0.18,0.06l1.5,-0.02l1.24,0.64l0.1,1.31l0.05,0.14l0.44,0.68l0.02,0.73l-0.44,0.03l-0.27,0.39l0.96,2.99l0.28,0.21l4.43,0.1l-0.28,1.12l0.0,0.15l0.27,1.02l0.15,0.19l1.27,0.67l0.52,1.42l-0.42,1.91l-0.66,1.1l-0.04,0.2l0.21,1.3l-0.19,0.13l-0.01,-0.27l-0.15,-0.24l-2.33,-1.33l-0.14,-0.04l-2.38,-0.03l-4.36,0.76l-0.21,0.16l-1.2,2.29l-0.03,0.13l-0.06,1.37l-0.79,2.53l-0.05,-0.08Z", "name": "Bolivia"}, "JP": {"path": "M781.17,166.78l1.8,0.67l0.28,-0.04l1.38,-1.01l0.43,2.67l-3.44,0.77l-0.18,0.12l-2.04,2.79l-3.71,-1.94l-0.42,0.15l-1.29,3.11l-2.32,0.04l-0.3,-2.63l1.12,-2.1l2.51,-0.16l0.28,-0.25l0.73,-4.22l0.58,-1.9l2.59,2.84l2.0,1.1ZM773.66,187.36l-0.92,2.24l-0.01,0.2l0.4,1.3l-1.18,1.81l-3.06,1.28l-4.35,0.17l-0.19,0.08l-3.4,3.06l-1.36,-0.87l-0.1,-1.95l-0.34,-0.28l-4.35,0.62l-2.99,1.33l-2.87,0.05l-0.28,0.2l0.09,0.33l2.37,1.93l-1.57,4.44l-1.35,0.97l-0.9,-0.79l0.57,-2.32l-0.15,-0.34l-1.5,-0.77l-0.81,-1.53l2.04,-0.75l0.14,-0.1l1.28,-1.72l2.47,-1.43l1.84,-1.92l4.83,-0.82l2.62,0.57l0.33,-0.16l2.45,-4.77l1.38,1.14l0.38,0.0l5.1,-4.02l0.09,-0.11l1.57,-3.57l0.02,-0.16l-0.42,-3.22l0.94,-1.67l2.27,-0.47l1.26,3.82l-0.07,2.23l-2.26,2.86l-0.06,0.19l0.04,2.93ZM757.85,196.18l0.22,0.66l-1.11,1.33l-0.8,-0.7l-0.33,-0.04l-1.28,0.65l-0.14,0.15l-0.54,1.34l-1.17,-0.57l0.02,-1.03l1.2,-1.45l1.24,0.28l0.29,-0.1l0.9,-1.03l1.51,0.5Z", "name": "Japan"}, "BI": {"path": "M494.7,295.83l-0.14,-2.71l-0.04,-0.13l-0.34,-0.62l0.93,0.12l0.3,-0.16l0.67,-1.25l0.9,0.11l0.11,0.76l0.08,0.16l0.46,0.48l0.02,0.56l-0.55,0.48l-0.96,1.29l-0.82,0.82l-0.61,0.07Z", "name": "Burundi"}, "BJ": {"path": "M427.4,268.94l-1.58,0.22l-0.52,-1.45l0.11,-5.73l-0.08,-0.21l-0.43,-0.44l-0.09,-1.13l-0.09,-0.19l-1.52,-1.52l0.24,-1.01l0.7,-0.23l0.18,-0.16l0.45,-0.97l1.07,-0.21l0.19,-0.12l0.53,-0.73l0.73,-0.65l0.68,-0.0l1.69,1.3l-0.08,0.67l0.02,0.14l0.52,1.38l-0.44,0.9l-0.01,0.24l0.2,0.52l-1.1,1.42l-0.76,0.76l-0.08,0.13l-0.47,1.59l0.05,1.69l-0.13,3.79Z", "name": "Benin"}, "BT": {"path": "M650.38,213.78l0.88,0.75l-0.13,1.24l-1.77,0.07l-2.1,-0.18l-1.57,0.4l-2.02,-0.91l-0.02,-0.24l1.54,-1.87l1.18,-0.6l1.67,0.59l1.32,0.08l1.01,0.67Z", "name": "Bhutan"}, "JM": {"path": "M226.67,238.37l1.64,0.23l1.2,0.56l0.11,0.19l-1.25,0.03l-0.14,0.04l-0.65,0.37l-1.24,-0.37l-1.17,-0.77l0.11,-0.22l0.86,-0.15l0.52,0.08Z", "name": "Jamaica"}, "BW": {"path": "M484.91,331.96l0.53,0.52l0.82,1.53l2.83,2.86l0.14,0.08l0.85,0.22l0.03,0.81l0.74,1.66l0.21,0.17l1.87,0.39l1.17,0.87l-3.13,1.71l-2.3,2.01l-0.07,0.1l-0.82,1.74l-0.66,0.88l-1.24,0.19l-0.24,0.2l-0.65,1.98l-1.4,0.55l-1.9,-0.12l-1.2,-0.74l-1.06,-0.32l-0.22,0.02l-1.22,0.62l-0.14,0.14l-0.58,1.21l-1.16,0.79l-1.18,1.13l-1.5,0.23l-0.4,-0.68l0.22,-1.53l-0.04,-0.19l-1.48,-2.54l-0.11,-0.11l-0.53,-0.31l-0.0,-7.25l2.18,-0.08l0.29,-0.3l0.07,-9.0l1.63,-0.08l3.69,-0.86l0.84,0.93l0.38,0.05l1.53,-0.97l0.79,-0.03l1.3,-0.53l0.23,0.1l0.92,1.96Z", "name": "Botswana"}, "BR": {"path": "M259.49,274.87l1.42,0.25l1.97,0.62l0.28,-0.05l0.67,-0.55l1.76,-0.38l2.8,-0.94l0.12,-0.08l0.92,-0.96l0.05,-0.33l-0.15,-0.32l0.73,-0.06l0.36,0.35l-0.27,0.93l0.17,0.36l0.76,0.34l0.44,0.9l-0.58,0.73l-0.06,0.13l-0.4,2.13l0.03,0.19l0.62,1.22l0.17,1.11l0.11,0.19l1.54,1.18l0.15,0.06l1.23,0.12l0.29,-0.15l0.2,-0.36l0.71,-0.11l1.13,-0.44l0.79,-0.63l1.25,0.19l0.65,-0.08l1.32,0.2l0.32,-0.18l0.23,-0.51l-0.05,-0.31l-0.31,-0.37l0.11,-0.31l0.75,0.17l0.13,0.0l1.1,-0.24l1.34,0.5l1.08,0.51l0.33,-0.05l0.67,-0.58l0.27,0.05l0.28,0.57l0.31,0.17l1.2,-0.18l0.17,-0.08l1.03,-1.05l0.76,-1.82l1.39,-2.16l0.49,-0.07l0.52,1.17l1.4,4.37l0.2,0.2l1.14,0.35l0.05,1.39l-1.8,1.97l0.01,0.42l0.78,0.75l0.18,0.08l4.16,0.37l0.08,2.25l0.5,0.22l1.78,-1.54l2.98,0.85l4.07,1.5l1.07,1.28l-0.37,1.23l0.36,0.38l2.83,-0.75l4.8,1.3l3.75,-0.09l3.6,2.02l3.27,2.84l1.93,0.72l2.13,0.11l0.76,0.66l1.22,4.56l-0.96,4.03l-1.22,1.58l-3.52,3.51l-1.63,2.91l-1.75,2.09l-0.5,0.04l-0.26,0.19l-0.72,1.99l0.18,4.76l-0.95,5.56l-0.74,0.96l-0.06,0.15l-0.43,3.39l-2.49,3.34l-0.06,0.13l-0.4,2.56l-1.9,1.07l-0.13,0.16l-0.51,1.38l-2.59,0.0l-3.94,1.01l-1.82,1.19l-2.85,0.81l-3.01,2.17l-2.12,2.65l-0.06,0.13l-0.36,2.0l0.01,0.13l0.4,1.42l-0.45,2.63l-0.53,1.23l-1.76,1.53l-2.76,4.79l-2.16,2.15l-1.69,1.29l-0.09,0.12l-1.12,2.6l-1.3,1.26l-0.45,-1.02l0.99,-1.18l0.01,-0.37l-1.5,-1.95l-1.98,-1.54l-2.58,-1.77l-0.2,-0.05l-0.81,0.07l-2.42,-2.05l-0.25,-0.07l-0.77,0.14l2.75,-3.07l2.8,-2.61l1.67,-1.09l2.11,-1.49l0.13,-0.24l0.05,-2.15l-0.07,-0.2l-1.26,-1.54l-0.35,-0.09l-0.64,0.27l0.3,-0.95l0.34,-1.57l0.01,-1.52l-0.16,-0.26l-0.9,-0.48l-0.27,-0.01l-0.86,0.39l-0.65,-0.08l-0.23,-0.8l-0.23,-2.39l-0.04,-0.12l-0.47,-0.79l-0.14,-0.12l-1.69,-0.71l-0.25,0.01l-0.93,0.47l-2.29,-0.44l0.15,-3.3l-0.03,-0.15l-0.62,-1.22l0.57,-0.39l0.13,-0.3l-0.22,-1.37l0.67,-1.13l0.44,-2.04l-0.01,-0.17l-0.59,-1.61l-0.14,-0.16l-1.25,-0.66l-0.22,-0.82l0.35,-1.41l-0.28,-0.37l-4.59,-0.1l-0.78,-2.41l0.34,-0.02l0.28,-0.31l-0.03,-1.1l-0.05,-0.16l-0.45,-0.68l-0.1,-1.4l-0.16,-0.24l-1.45,-0.76l-0.14,-0.03l-1.48,0.02l-1.04,-0.73l-1.62,-0.48l-0.93,-0.9l-0.16,-0.08l-2.72,-0.41l-2.53,-2.12l0.18,-1.54l-0.01,-0.13l-0.29,-0.91l0.26,-1.83l-0.34,-0.34l-3.28,0.43l-0.14,0.05l-1.3,0.93l-2.16,1.01l-0.12,0.09l-0.47,0.65l-1.12,0.05l-1.84,-0.21l-0.12,0.01l-1.33,0.41l-0.82,-0.21l0.16,-3.6l-0.48,-0.26l-1.97,1.43l-1.96,-0.06l-0.86,-1.23l-0.22,-0.13l-1.23,-0.11l0.34,-0.69l-0.05,-0.33l-1.36,-1.5l-0.92,-2.0l0.45,-0.32l0.13,-0.25l-0.0,-0.87l1.34,-0.64l0.17,-0.32l-0.23,-1.23l0.56,-0.77l0.05,-0.13l0.16,-1.03l2.7,-1.61l2.01,-0.47l0.16,-0.09l0.24,-0.27l2.11,0.11l0.31,-0.25l1.13,-6.87l0.06,-1.12l-0.4,-1.53l-0.1,-0.15l-1.0,-0.82l0.01,-1.45l1.08,-0.32l0.39,0.2l0.44,-0.24l0.08,-0.96l-0.25,-0.32l-1.22,-0.22l-0.02,-1.01l4.57,0.05l0.22,-0.09l0.6,-0.63l0.44,0.5l0.47,1.42l0.45,0.16l0.27,-0.18l1.21,1.16l0.23,0.08l1.95,-0.16l0.23,-0.14l0.43,-0.67l1.76,-0.55l1.05,-0.42l0.18,-0.2l0.25,-0.92l1.65,-0.66l0.18,-0.35l-0.14,-0.53l-0.26,-0.22l-1.91,-0.19l-0.29,-1.33l0.1,-1.64l-0.15,-0.28l-0.44,-0.25Z", "name": "Brazil"}, "BS": {"path": "M227.51,216.69l0.3,0.18l-0.24,1.07l0.03,-1.04l-0.09,-0.21ZM226.5,224.03l-0.13,0.03l-0.54,-1.3l-0.09,-0.12l-0.78,-0.64l0.4,-1.26l0.33,0.05l0.79,2.0l0.01,1.24ZM225.76,216.5l-2.16,0.34l-0.07,-0.41l0.85,-0.16l1.36,0.07l0.02,0.16Z", "name": "The Bahamas"}, "BY": {"path": "M480.08,135.28l2.09,0.02l0.13,-0.03l2.72,-1.3l0.16,-0.19l0.55,-1.83l1.94,-1.06l0.15,-0.31l-0.2,-1.33l1.33,-0.52l2.58,-1.3l2.39,0.8l0.3,0.75l0.37,0.17l1.22,-0.39l2.18,0.75l0.2,1.36l-0.48,0.85l0.01,0.32l1.57,2.26l0.92,0.6l-0.1,0.41l0.19,0.35l1.61,0.57l0.48,0.6l-0.64,0.49l-1.91,-0.11l-0.18,0.05l-0.48,0.32l-0.1,0.39l0.57,1.1l0.51,1.78l-1.79,0.17l-0.18,0.08l-0.77,0.73l-0.09,0.19l-0.13,1.31l-0.75,-0.22l-2.11,0.15l-0.56,-0.66l-0.39,-0.06l-0.8,0.49l-0.79,-0.4l-0.13,-0.03l-1.94,-0.07l-2.76,-0.79l-2.58,-0.27l-1.98,0.07l-0.15,0.05l-1.31,0.86l-0.8,0.09l-0.04,-1.16l-0.03,-0.12l-0.63,-1.28l1.22,-0.56l0.17,-0.27l0.01,-1.35l-0.04,-0.15l-0.66,-1.24l-0.08,-1.12Z", "name": "Belarus"}, "BZ": {"path": "M198.03,239.7l0.28,0.19l0.43,-0.1l0.82,-1.42l0.0,0.07l0.29,0.29l0.16,0.0l-0.02,0.35l-0.39,1.08l0.02,0.25l0.16,0.29l-0.23,0.8l0.04,0.24l0.09,0.14l-0.25,1.12l-0.38,0.53l-0.33,0.06l-0.21,0.15l-0.41,0.74l-0.25,0.0l0.17,-2.58l0.01,-2.2Z", "name": "Belize"}, "RU": {"path": "M688.57,38.85l0.63,2.39l0.44,0.19l2.22,-1.23l7.18,0.07l5.54,2.49l1.85,1.77l-0.55,2.34l-2.64,1.42l-6.57,2.76l-1.95,1.5l0.12,0.53l3.09,0.68l3.69,1.23l0.21,-0.01l1.98,-0.81l1.16,2.84l0.5,0.08l1.03,-1.18l3.86,-0.74l7.79,0.78l0.56,2.05l0.27,0.22l10.47,0.71l0.32,-0.29l0.13,-3.34l4.98,0.8l3.96,-0.02l3.88,2.43l1.06,2.79l-1.38,1.83l0.01,0.38l3.15,3.64l0.1,0.08l3.94,1.86l0.4,-0.14l2.28,-4.56l3.75,1.94l0.22,0.02l4.18,-1.22l4.76,1.4l0.26,-0.04l1.74,-1.23l3.98,0.63l0.32,-0.41l-1.71,-4.1l3.0,-1.86l22.39,3.04l2.06,2.67l0.1,0.08l6.55,3.51l0.17,0.03l10.08,-0.86l4.86,0.73l1.91,1.72l-0.29,3.13l0.18,0.31l3.08,1.26l0.19,0.01l3.32,-0.9l4.37,-0.11l4.78,0.87l4.61,-0.48l4.26,3.82l0.32,0.05l3.1,-1.4l0.12,-0.45l-1.91,-2.67l0.92,-1.64l7.78,1.22l5.22,-0.26l7.12,2.1l9.6,5.22l6.4,4.15l-0.2,2.44l0.14,0.28l1.69,1.04l0.45,-0.31l-0.51,-2.66l6.31,0.58l4.52,3.61l-2.1,1.52l-4.02,0.42l-0.27,0.29l-0.06,3.83l-0.81,0.67l-2.14,-0.11l-1.91,-1.39l-3.19,-1.13l-0.51,-1.63l-0.21,-0.2l-2.54,-0.67l-0.13,-0.0l-2.69,0.5l-1.12,-1.19l0.48,-1.36l-0.38,-0.39l-3.0,0.98l-0.17,0.44l1.02,1.76l-1.27,1.55l-3.09,1.71l-3.15,-0.29l-0.3,0.18l0.07,0.34l2.22,2.1l1.47,3.22l1.15,1.09l0.25,1.41l-0.48,0.76l-4.47,-0.81l-0.17,0.02l-6.97,2.9l-2.2,0.44l-0.11,0.05l-3.83,2.68l-3.63,2.32l-0.1,0.11l-0.76,1.4l-3.3,-2.4l-0.3,-0.03l-6.31,2.85l-0.99,-1.21l-0.4,-0.06l-2.32,1.54l-3.23,-0.49l-0.33,0.2l-0.79,2.39l-2.97,3.51l-0.07,0.21l0.09,1.47l0.22,0.27l2.62,0.74l-0.3,4.7l-2.06,0.12l-0.26,0.2l-1.07,2.94l0.04,0.27l0.83,1.19l-4.03,1.63l-0.18,0.21l-0.83,3.72l-3.55,0.79l-0.23,0.23l-0.73,3.32l-3.22,2.76l-0.76,-1.88l-1.07,-4.88l-1.39,-7.59l1.17,-4.76l2.05,-2.08l0.09,-0.19l0.11,-1.46l3.67,-0.77l0.15,-0.08l4.47,-4.61l4.29,-3.82l4.48,-3.01l0.11,-0.14l2.01,-5.43l-0.31,-0.4l-3.04,0.33l-0.24,0.17l-1.47,3.11l-5.98,3.94l-1.91,-4.36l-0.33,-0.17l-6.46,1.3l-0.15,0.08l-6.27,6.33l-0.01,0.41l1.7,1.87l-5.04,0.87l-3.51,0.34l0.16,-2.32l-0.26,-0.32l-3.89,-0.56l-0.19,0.04l-3.02,1.77l-7.63,-0.63l-8.24,1.1l-0.16,0.07l-8.11,7.09l-9.6,8.31l0.16,0.52l3.79,0.42l1.16,2.03l0.17,0.14l2.43,0.76l0.31,-0.08l1.5,-1.61l2.49,0.2l3.46,3.6l0.08,2.67l-1.91,3.26l-0.04,0.14l-0.21,3.91l-1.11,5.09l-3.73,4.55l-0.87,2.21l-6.73,7.14l-1.59,1.77l-3.23,1.72l-1.38,0.03l-1.48,-1.39l-0.37,-0.03l-3.36,2.22l-0.11,0.14l-0.16,0.42l-0.01,-1.09l1.0,-0.06l0.28,-0.27l0.36,-3.6l-0.61,-2.51l1.85,-0.94l2.94,0.53l0.32,-0.15l1.71,-3.1l0.84,-3.38l0.97,-1.18l1.32,-2.88l-0.34,-0.42l-4.14,0.95l-2.18,1.25l-3.51,-0.0l-0.95,-2.81l-0.1,-0.14l-2.97,-2.3l-0.11,-0.05l-4.19,-1.0l-0.89,-3.08l-0.87,-2.03l-0.95,-1.46l-1.54,-3.37l-0.12,-0.14l-2.27,-1.28l-3.83,-1.02l-3.37,0.1l-3.11,0.61l-0.13,0.06l-2.07,1.69l0.04,0.49l1.23,0.72l0.03,1.53l-1.34,1.05l-2.26,3.51l-0.05,0.17l0.02,1.27l-3.25,1.9l-2.87,-1.17l-0.14,-0.02l-2.86,0.26l-1.22,-1.02l-0.12,-0.06l-1.5,-0.35l-0.23,0.04l-3.62,2.27l-3.24,0.53l-2.28,0.79l-3.08,-0.51l-2.24,0.03l-1.49,-1.61l-2.45,-1.57l-0.11,-0.04l-2.6,-0.43l-3.17,0.43l-2.31,0.59l-3.31,-1.28l-0.45,-2.31l-0.21,-0.23l-2.94,-0.85l-2.26,-0.39l-2.77,-1.36l-0.37,0.09l-2.59,3.45l-0.03,0.32l0.91,1.74l-2.15,2.01l-3.47,-0.79l-2.44,-0.12l-1.59,-1.46l-0.2,-0.08l-2.55,-0.05l-2.12,-0.98l-0.24,-0.01l-3.85,1.57l-4.74,2.79l-2.59,0.55l-0.79,0.21l-1.21,-1.81l-0.29,-0.13l-3.05,0.41l-0.96,-1.25l-0.14,-0.1l-1.65,-0.6l-1.15,-1.82l-0.13,-0.12l-1.38,-0.6l-0.19,-0.02l-3.49,0.82l-3.35,-1.85l-0.38,0.08l-1.08,1.4l-5.36,-8.17l-3.02,-2.52l0.72,-0.85l0.01,-0.38l-0.37,-0.08l-6.22,3.21l-1.98,0.16l0.17,-1.51l-0.2,-0.31l-3.22,-1.17l-0.19,-0.0l-2.3,0.74l-0.72,-3.27l-0.24,-0.23l-4.5,-0.75l-0.21,0.04l-2.2,1.42l-6.21,1.27l-0.11,0.05l-1.16,0.81l-9.3,1.19l-0.18,0.09l-1.15,1.17l-0.02,0.39l1.56,2.01l-2.02,0.74l-0.16,0.42l0.35,0.68l-2.18,1.49l0.02,0.51l3.83,2.16l-0.45,1.13l-3.31,-0.13l-0.25,0.12l-0.57,0.77l-2.97,-1.59l-0.15,-0.04l-3.97,0.07l-0.13,0.03l-2.53,1.32l-2.84,-1.28l-5.52,-2.3l-0.12,-0.02l-3.91,0.09l-0.16,0.05l-5.17,3.6l-0.13,0.21l-0.25,1.89l-2.17,-1.6l-0.44,0.1l-2.0,3.59l0.06,0.37l0.55,0.5l-1.32,2.23l0.04,0.36l2.13,2.17l0.23,0.09l1.7,-0.08l1.42,1.89l-0.23,1.5l0.19,0.32l0.94,0.38l-0.89,1.44l-2.3,0.49l-0.17,0.11l-2.49,3.2l0.0,0.37l2.2,2.81l-0.23,1.93l0.06,0.22l2.56,3.32l-1.27,1.02l-0.4,0.66l-0.8,-0.15l-1.65,-1.75l-0.18,-0.09l-0.66,-0.09l-1.45,-0.64l-0.72,-1.16l-0.18,-0.13l-2.34,-0.63l-0.17,0.0l-1.32,0.41l-0.31,-0.4l-0.12,-0.09l-3.49,-1.48l-3.67,-0.49l-2.1,-0.52l-0.3,0.1l-0.12,0.14l-2.96,-2.4l-2.89,-1.19l-1.69,-1.42l1.27,-0.35l0.16,-0.1l2.08,-2.61l-0.04,-0.41l-1.02,-0.9l3.21,-1.12l0.2,-0.31l-0.07,-0.69l-0.37,-0.26l-1.86,0.42l0.05,-0.86l1.11,-0.76l2.35,-0.23l0.25,-0.19l0.39,-1.07l0.0,-0.19l-0.51,-1.64l0.95,-1.58l0.04,-0.16l-0.03,-0.95l-0.22,-0.28l-3.69,-1.06l-1.43,0.02l-1.45,-1.44l-0.29,-0.08l-1.83,0.49l-2.88,-1.04l0.04,-0.42l-0.04,-0.18l-0.89,-1.43l-0.23,-0.14l-1.77,-0.14l-0.13,-0.66l0.52,-0.56l0.01,-0.4l-1.6,-1.9l-0.27,-0.1l-2.55,0.32l-0.71,-0.16l-0.3,0.1l-0.53,0.63l-0.58,-0.08l-0.56,-1.97l-0.48,-0.94l0.17,-0.11l1.92,0.11l0.2,-0.06l0.97,-0.74l0.05,-0.42l-0.72,-0.91l-0.13,-0.1l-1.43,-0.51l0.09,-0.36l-0.13,-0.33l-0.97,-0.59l-1.43,-2.06l0.44,-0.77l0.04,-0.19l-0.25,-1.64l-0.2,-0.24l-2.45,-0.84l-0.19,-0.0l-1.05,0.34l-0.25,-0.62l-0.18,-0.17l-2.5,-0.84l-0.74,-1.93l-0.21,-1.7l-0.13,-0.21l-0.92,-0.63l0.83,-0.89l0.07,-0.27l-0.71,-3.26l1.69,-2.01l0.03,-0.34l-0.24,-0.41l2.63,-1.9l-0.01,-0.49l-2.31,-1.57l5.08,-4.61l2.33,-2.24l1.01,-2.08l-0.09,-0.37l-3.52,-2.56l0.94,-2.38l-0.04,-0.29l-2.14,-2.86l1.61,-3.35l-0.01,-0.29l-2.81,-4.58l2.19,-3.04l-0.06,-0.42l-3.7,-2.76l0.32,-2.67l1.87,-0.38l4.26,-1.77l2.46,-1.47l3.96,2.58l0.12,0.05l6.81,1.04l9.37,4.87l1.81,1.92l0.15,2.55l-2.61,2.06l-3.95,1.07l-11.1,-3.15l-0.17,0.0l-1.84,0.53l-0.1,0.53l3.97,2.97l0.15,1.77l0.16,4.14l0.19,0.27l3.21,1.22l1.94,1.03l0.44,-0.22l0.32,-1.94l-0.07,-0.25l-1.32,-1.52l1.25,-1.2l5.87,2.45l0.24,-0.01l2.11,-0.98l0.13,-0.42l-1.55,-2.75l5.52,-3.84l2.13,0.22l2.28,1.42l0.43,-0.12l1.46,-2.87l-0.04,-0.33l-1.97,-2.37l1.14,-2.38l-0.02,-0.3l-1.42,-2.07l6.15,1.22l1.14,1.92l-2.74,0.46l-0.25,0.3l0.02,2.36l0.12,0.24l1.97,1.44l0.25,0.05l3.87,-0.91l0.22,-0.23l0.58,-2.55l5.09,-1.98l8.67,-3.69l1.22,0.14l-2.06,2.2l0.18,0.5l3.11,0.45l0.23,-0.07l1.71,-1.41l4.59,-0.12l0.12,-0.03l3.53,-1.72l2.7,2.48l0.42,-0.01l2.85,-2.88l-0.0,-0.43l-2.42,-2.35l1.0,-1.13l7.2,1.31l3.42,1.36l9.06,4.97l0.39,-0.08l1.67,-2.27l-0.04,-0.4l-2.46,-2.23l-0.06,-0.82l-0.26,-0.27l-2.64,-0.38l0.69,-1.76l0.0,-0.22l-1.32,-3.47l-0.07,-1.27l4.52,-4.09l0.08,-0.11l1.6,-4.18l1.67,-0.84l6.33,1.2l0.46,2.31l-2.31,3.67l0.05,0.38l1.49,1.41l0.77,3.04l-0.56,6.05l0.09,0.24l2.62,2.54l-0.99,2.65l-4.87,5.96l0.17,0.48l2.86,0.61l0.31,-0.13l0.94,-1.42l2.67,-1.04l0.18,-0.19l0.64,-2.01l2.11,-1.98l0.05,-0.37l-1.38,-2.32l1.11,-2.74l-0.24,-0.41l-2.53,-0.33l-0.53,-2.16l1.96,-4.42l-0.05,-0.32l-3.03,-3.48l4.21,-2.94l0.12,-0.3l-0.52,-3.04l0.72,-0.06l1.18,2.35l-0.97,4.39l0.2,0.35l2.68,0.84l0.37,-0.38l-1.05,-3.07l3.89,-1.71l5.05,-0.24l4.55,2.62l0.36,-0.05l0.05,-0.36l-2.19,-3.84l-0.23,-4.78l4.07,-0.92l5.98,0.21l5.47,-0.64l0.2,-0.48l-1.88,-2.37l2.65,-2.99l2.75,-0.13l0.12,-0.03l4.82,-2.48l6.56,-0.67l0.23,-0.14l0.76,-1.27l6.33,-0.46l1.97,1.11l0.28,0.01l5.55,-2.71l4.53,0.08l0.29,-0.21l0.67,-2.18l2.29,-2.15l5.75,-2.13l3.48,1.4l-2.7,1.03l-0.19,0.31l0.26,0.26l5.47,0.78ZM871.83,65.73l0.25,-0.15l1.99,0.01l3.3,1.2l-0.08,0.22l-2.41,1.03l-5.73,0.49l-0.31,-1.0l2.99,-1.8ZM797.64,48.44l-2.22,1.51l-3.85,-0.43l-4.35,-1.85l0.42,-1.13l4.42,0.72l5.59,1.17ZM783.82,46.06l-1.71,3.25l-9.05,-0.14l-4.11,1.15l-4.64,-3.04l1.21,-3.13l3.11,-0.91l6.53,0.22l8.66,2.59ZM780.37,145.71l2.28,5.23l-3.09,-0.89l-0.37,0.19l-1.54,4.65l0.04,0.27l2.38,3.17l-0.05,1.4l-1.41,-1.41l-0.46,0.04l-1.23,1.81l-0.33,-1.86l0.28,-3.1l-0.28,-3.41l0.58,-2.46l0.11,-4.39l-0.03,-0.13l-1.44,-3.2l0.21,-4.39l2.19,-1.49l0.09,-0.41l-0.81,-1.3l0.48,-0.21l0.56,1.94l0.86,3.23l-0.05,3.36l1.03,3.35ZM780.16,57.18l-3.4,0.03l-5.06,-0.53l1.97,-1.59l2.95,-0.42l3.35,1.75l0.18,0.77ZM683.84,31.18l-13.29,1.97l4.16,-6.56l1.88,-0.58l1.77,0.34l6.08,3.02l-0.6,1.8ZM670.94,28.02l-5.18,0.65l-6.89,-1.58l-4.03,-2.07l-1.88,-3.98l-0.18,-0.16l-2.8,-0.93l5.91,-3.62l5.25,-1.29l4.73,2.88l5.63,5.44l-0.57,4.66ZM564.37,68.98l-0.85,0.23l-7.93,-0.57l-0.6,-1.84l-0.21,-0.2l-4.34,-1.18l-0.3,-2.08l2.34,-0.92l0.19,-0.29l-0.08,-2.43l4.85,-4.0l-0.12,-0.52l-1.68,-0.43l5.47,-3.94l0.11,-0.33l-0.6,-2.02l5.36,-2.55l8.22,-3.27l8.29,-0.96l4.34,-1.94l4.67,-0.65l1.45,1.72l-1.43,1.37l-8.8,2.52l-7.65,2.42l-7.92,4.84l-3.73,4.75l-3.92,4.58l-0.07,0.23l0.51,3.88l0.11,0.2l4.32,3.39ZM548.86,18.57l-3.28,0.75l-2.25,0.44l-0.22,0.19l-0.3,0.81l-2.67,0.86l-2.27,-1.14l1.2,-1.51l-0.23,-0.49l-3.14,-0.1l2.48,-0.54l3.55,-0.07l0.44,1.36l0.49,0.12l1.4,-1.35l2.2,-0.9l3.13,1.08l-0.54,0.49ZM477.5,133.25l-4.21,0.05l-2.69,-0.34l0.39,-1.03l3.24,-1.06l2.51,0.58l0.85,0.43l-0.2,0.71l-0.0,0.15l0.12,0.52Z", "name": "Russia"}, "RW": {"path": "M497.03,288.12l0.78,1.11l-0.12,1.19l-0.49,0.21l-1.25,-0.15l-0.3,0.16l-0.67,1.24l-1.01,-0.13l0.16,-0.92l0.22,-0.12l0.15,-0.24l0.09,-1.37l0.49,-0.48l0.42,0.18l0.25,-0.01l1.26,-0.65Z", "name": "Rwanda"}, "RS": {"path": "M469.75,168.65l0.21,-0.21l0.36,-1.44l-0.08,-0.29l-1.06,-1.03l0.54,-1.16l-0.28,-0.43l-0.26,0.0l0.55,-0.67l-0.01,-0.39l-0.77,-0.86l-0.45,-0.89l1.56,-0.67l1.39,0.12l1.22,1.1l0.26,0.91l0.16,0.19l1.38,0.66l0.17,1.12l0.14,0.21l1.46,0.9l0.35,-0.03l0.62,-0.54l0.09,0.06l-0.28,0.25l-0.03,0.42l0.29,0.34l-0.44,0.5l-0.07,0.26l0.22,1.12l0.07,0.14l1.02,1.1l-0.81,0.84l-0.42,0.96l0.04,0.3l0.12,0.15l-0.15,0.16l-1.04,0.04l-0.39,0.08l0.33,-0.81l-0.29,-0.41l-0.21,0.01l-0.39,-0.45l-0.13,-0.09l-0.32,-0.11l-0.27,-0.4l-0.14,-0.11l-0.4,-0.16l-0.31,-0.37l-0.34,-0.09l-0.45,0.17l-0.18,0.18l-0.29,0.84l-0.96,-0.65l-0.81,-0.33l-0.32,-0.37l-0.22,-0.18Z", "name": "Republic of Serbia"}, "LT": {"path": "M478.13,133.31l-0.14,-0.63l0.25,-0.88l-0.15,-0.35l-1.17,-0.58l-2.43,-0.57l-0.45,-2.51l2.58,-0.97l4.14,0.22l2.3,-0.32l0.26,0.54l0.22,0.17l1.26,0.22l2.25,1.6l0.19,1.23l-1.87,1.01l-0.14,0.18l-0.54,1.83l-2.54,1.21l-2.18,-0.02l-0.52,-0.91l-0.18,-0.14l-1.11,-0.32Z", "name": "Lithuania"}, "LU": {"path": "M435.95,147.99l0.33,0.49l-0.11,1.07l-0.39,0.04l-0.29,-0.15l0.21,-1.4l0.25,-0.05Z", "name": "Luxembourg"}, "LR": {"path": "M401.37,273.67l-0.32,0.01l-2.48,-1.15l-2.24,-1.89l-2.14,-1.38l-1.47,-1.42l0.44,-0.59l0.05,-0.13l0.12,-0.65l1.07,-1.3l1.08,-1.09l0.52,-0.07l0.43,-0.18l0.84,1.24l-0.15,0.89l0.07,0.25l0.49,0.54l0.22,0.1l0.71,0.01l0.27,-0.16l0.42,-0.83l0.19,0.02l-0.06,0.52l0.23,1.12l-0.5,1.03l0.06,0.35l0.73,0.69l0.14,0.08l0.71,0.15l0.92,0.91l0.06,0.76l-0.17,0.22l-0.06,0.15l-0.17,1.8Z", "name": "Liberia"}, "RO": {"path": "M477.94,155.19l1.02,-0.64l1.49,0.33l1.52,0.01l1.09,0.73l0.32,0.01l0.81,-0.46l1.8,-0.3l0.18,-0.1l0.54,-0.64l0.86,0.0l0.64,0.26l0.71,0.87l0.8,1.35l1.39,1.81l0.07,1.25l-0.26,1.3l0.01,0.15l0.45,1.42l0.15,0.18l1.12,0.57l0.25,0.01l1.05,-0.45l0.86,0.4l0.03,0.43l-0.92,0.51l-0.63,-0.24l-0.4,0.22l-0.64,3.41l-1.12,-0.24l-1.78,-1.09l-0.23,-0.04l-2.95,0.71l-1.25,0.77l-3.55,-0.16l-1.89,-0.47l-0.14,-0.0l-0.75,0.17l-0.61,-1.07l-0.3,-0.36l0.36,-0.32l-0.04,-0.48l-0.62,-0.38l-0.36,0.03l-0.62,0.54l-1.15,-0.71l-0.18,-1.14l-0.17,-0.22l-1.4,-0.67l-0.24,-0.86l-0.09,-0.14l-0.96,-0.87l1.49,-0.44l0.16,-0.11l1.51,-2.14l1.15,-2.09l1.44,-0.63Z", "name": "Romania"}, "GW": {"path": "M383.03,256.73l-1.12,-0.88l-0.14,-0.06l-0.94,-0.15l-0.43,-0.54l0.01,-0.27l-0.13,-0.26l-0.68,-0.48l-0.05,-0.16l0.99,-0.31l0.77,0.08l0.15,-0.02l0.61,-0.26l4.25,0.1l-0.02,0.44l-0.19,0.18l-0.08,0.29l0.17,0.66l-0.17,0.14l-0.44,0.0l-0.16,0.05l-0.57,0.37l-0.66,-0.04l-0.24,0.1l-0.92,1.03Z", "name": "Guinea Bissau"}, "GT": {"path": "M195.13,249.89l-1.05,-0.35l-1.5,-0.04l-1.06,-0.47l-1.19,-0.93l0.04,-0.53l0.27,-0.55l-0.03,-0.31l-0.24,-0.32l1.02,-1.77l3.04,-0.01l0.3,-0.28l0.06,-0.88l-0.19,-0.3l-0.3,-0.11l-0.23,-0.45l-0.11,-0.12l-0.9,-0.58l-0.35,-0.33l0.37,-0.0l0.3,-0.3l0.0,-1.15l4.05,0.02l-0.02,1.74l-0.2,2.89l0.3,0.32l0.67,-0.0l0.75,0.42l0.4,-0.11l-0.62,0.53l-1.17,0.7l-0.13,0.16l-0.18,0.49l0.0,0.21l0.14,0.34l-0.35,0.44l-0.49,0.13l-0.2,0.41l0.03,0.06l-0.27,0.16l-0.86,0.64l-0.12,0.22ZM199.35,245.38l0.07,-0.13l0.05,0.02l-0.13,0.11Z", "name": "Guatemala"}, "GR": {"path": "M487.2,174.55l-0.64,1.54l-0.43,0.24l-1.41,-0.08l-1.28,-0.28l-0.14,0.0l-3.03,0.77l-0.13,0.51l1.39,1.34l-0.78,0.29l-1.2,0.0l-1.23,-1.42l-0.47,0.02l-0.47,0.65l-0.04,0.27l0.56,1.76l0.06,0.11l1.02,1.12l-0.66,0.45l-0.04,0.46l1.39,1.35l1.15,0.79l0.02,1.06l-1.91,-0.63l-0.36,0.42l0.56,1.12l-1.2,0.23l-0.22,0.4l0.8,2.14l-1.15,0.02l-1.89,-1.15l-0.89,-2.19l-0.43,-1.91l-0.05,-0.11l-0.98,-1.35l-1.24,-1.62l-0.13,-0.63l1.07,-1.32l0.06,-0.14l0.13,-0.81l0.68,-0.36l0.16,-0.25l0.03,-0.54l1.4,-0.23l0.12,-0.05l0.87,-0.6l1.26,0.05l0.25,-0.11l0.34,-0.43l0.33,-0.07l1.81,0.08l0.13,-0.02l1.87,-0.77l1.64,0.97l0.19,0.04l2.28,-0.28l0.26,-0.29l0.02,-0.95l0.56,0.36ZM480.44,192.0l1.05,0.74l0.01,0.0l-1.26,-0.23l0.2,-0.51ZM481.76,192.79l1.86,-0.15l1.53,0.17l-0.02,0.19l0.34,0.3l-2.28,0.15l0.01,-0.13l-0.25,-0.31l-1.19,-0.22ZM485.65,193.28l0.65,-0.16l-0.05,0.12l-0.6,0.04Z", "name": "Greece"}, "GQ": {"path": "M444.81,282.04l-0.21,-0.17l0.74,-2.4l3.56,0.05l0.02,2.42l-3.34,-0.02l-0.76,0.13Z", "name": "Equatorial Guinea"}, "GY": {"path": "M271.34,264.25l1.43,0.81l1.44,1.53l0.06,1.19l0.28,0.28l0.84,0.05l2.13,1.92l-0.34,1.93l-1.37,0.59l-0.17,0.34l0.12,0.51l-0.43,1.21l0.03,0.26l1.11,1.82l0.26,0.14l0.56,0.0l0.32,1.29l1.25,1.78l-0.08,0.01l-1.34,-0.21l-0.24,0.06l-0.78,0.64l-1.06,0.41l-0.76,0.1l-0.22,0.15l-0.18,0.32l-0.95,-0.1l-1.38,-1.05l-0.19,-1.13l-0.6,-1.18l0.37,-1.96l0.65,-0.83l0.03,-0.32l-0.57,-1.17l-0.15,-0.14l-0.62,-0.27l0.25,-0.85l-0.08,-0.3l-0.58,-0.58l-0.24,-0.09l-1.15,0.1l-1.41,-1.58l0.48,-0.49l0.09,-0.22l-0.04,-0.92l1.31,-0.34l0.73,-0.52l0.04,-0.44l-0.75,-0.82l0.16,-0.66l1.74,-1.3Z", "name": "Guyana"}, "GE": {"path": "M525.41,174.19l0.26,-0.88l-0.0,-0.17l-0.63,-2.06l-0.1,-0.15l-1.45,-1.12l-0.11,-0.05l-1.31,-0.33l-0.66,-0.69l1.97,0.48l3.65,0.49l3.3,1.41l0.39,0.5l0.33,0.1l1.43,-0.45l2.14,0.58l0.7,1.14l0.13,0.12l1.06,0.47l-0.18,0.11l-0.08,0.43l1.08,1.41l-0.06,0.06l-1.16,-0.15l-1.82,-0.84l-0.31,0.04l-0.55,0.44l-3.29,0.44l-2.32,-1.41l-0.17,-0.04l-2.25,0.12Z", "name": "Georgia"}, "GB": {"path": "M412.82,118.6l-2.31,3.4l-0.0,0.33l0.31,0.13l2.52,-0.49l2.34,0.02l-0.56,2.51l-2.22,3.13l0.22,0.47l2.43,0.21l2.35,4.35l0.17,0.14l1.58,0.51l1.49,3.78l0.73,1.37l0.2,0.15l2.76,0.59l-0.25,1.75l-1.18,0.91l-0.08,0.39l0.87,1.49l-1.96,1.51l-3.31,-0.02l-4.15,0.88l-1.07,-0.59l-0.35,0.04l-1.55,1.44l-2.17,-0.35l-0.22,0.05l-1.61,1.15l-0.78,-0.38l3.31,-3.12l2.18,-0.7l0.21,-0.31l-0.26,-0.27l-3.78,-0.54l-0.48,-0.9l2.3,-0.92l0.13,-0.46l-1.29,-1.71l0.39,-1.83l3.46,0.29l0.32,-0.24l0.37,-1.99l-0.06,-0.24l-1.71,-2.17l-0.18,-0.11l-2.91,-0.58l-0.43,-0.68l0.82,-1.4l-0.03,-0.35l-0.82,-0.97l-0.46,0.01l-0.85,1.05l-0.11,-2.6l-0.05,-0.16l-1.19,-1.7l0.86,-3.53l1.81,-2.75l1.88,0.26l2.38,-0.24ZM406.39,132.84l-1.09,1.92l-1.65,-0.62l-1.26,0.02l0.41,-1.46l0.0,-0.16l-0.42,-1.51l1.62,-0.11l2.39,1.92Z", "name": "United Kingdom"}, "GA": {"path": "M448.76,294.47l-2.38,-2.34l-1.63,-2.04l-1.46,-2.48l0.06,-0.66l0.54,-0.81l0.61,-1.82l0.46,-1.69l0.63,-0.11l3.62,0.03l0.3,-0.3l-0.02,-2.75l0.88,-0.12l1.47,0.32l0.13,0.0l1.39,-0.3l-0.13,0.87l0.03,0.19l0.7,1.29l0.3,0.16l1.74,-0.19l0.36,0.29l-1.01,2.7l0.05,0.29l1.13,1.42l0.25,1.82l-0.3,1.56l-0.64,0.99l-1.93,-0.09l-1.26,-1.13l-0.5,0.17l-0.16,0.91l-1.48,0.27l-0.12,0.05l-0.86,0.63l-0.08,0.39l0.81,1.42l-1.48,1.08Z", "name": "Gabon"}, "GN": {"path": "M399.83,265.31l-0.69,-0.06l-0.3,0.16l-0.43,0.85l-0.39,-0.01l-0.3,-0.33l0.14,-0.87l-0.05,-0.22l-1.05,-1.54l-0.37,-0.11l-0.61,0.27l-0.84,0.12l0.02,-0.54l-0.04,-0.17l-0.35,-0.57l0.07,-0.63l-0.03,-0.17l-0.57,-1.11l-0.7,-0.9l-0.24,-0.12l-2.0,-0.0l-0.19,0.07l-0.51,0.42l-0.6,0.05l-0.21,0.11l-0.43,0.55l-0.3,0.7l-1.04,0.86l-0.91,-1.24l-1.0,-1.02l-0.69,-0.37l-0.52,-0.42l-0.3,-1.11l-0.37,-0.56l-0.1,-0.1l-0.4,-0.23l0.77,-0.85l0.62,0.04l0.18,-0.05l0.58,-0.38l0.46,-0.0l0.19,-0.07l0.39,-0.34l0.1,-0.3l-0.17,-0.67l0.15,-0.14l0.09,-0.2l0.03,-0.57l0.87,0.02l1.76,0.6l0.13,0.01l0.55,-0.06l0.22,-0.13l0.08,-0.12l1.18,0.17l0.17,-0.02l0.09,0.56l0.3,0.25l0.4,-0.0l0.14,-0.03l0.56,-0.29l0.23,0.05l0.63,0.59l0.15,0.07l1.07,0.2l0.24,-0.06l0.65,-0.52l0.77,-0.32l0.55,-0.32l0.3,0.04l0.44,0.45l0.34,0.74l0.84,0.87l-0.35,0.45l-0.06,0.15l-0.1,0.82l0.42,0.31l0.35,-0.16l0.05,0.04l-0.1,0.59l0.09,0.27l0.42,0.4l-0.06,0.02l-0.18,0.21l-0.2,0.86l0.03,0.21l0.56,1.02l0.52,1.71l-0.65,0.21l-0.15,0.12l-0.24,0.35l-0.03,0.28l0.16,0.41l-0.1,0.76l-0.12,0.0Z", "name": "Guinea"}, "GM": {"path": "M379.18,251.48l0.15,-0.55l2.51,-0.07l0.21,-0.09l0.48,-0.52l0.58,-0.03l0.91,0.58l0.16,0.05l0.78,0.01l0.14,-0.03l0.59,-0.31l0.16,0.24l-0.71,0.38l-0.94,-0.04l-1.02,-0.51l-0.3,0.01l-0.86,0.55l-0.37,0.02l-0.14,0.04l-0.53,0.31l-1.81,-0.04Z", "name": "Gambia"}, "GL": {"path": "M304.13,6.6l8.19,-3.63l8.72,0.28l0.19,-0.06l3.12,-2.28l8.75,-0.61l19.94,0.8l14.93,4.75l-3.92,2.01l-9.52,0.27l-13.48,0.6l-0.27,0.2l0.09,0.33l1.26,1.09l0.22,0.07l8.81,-0.67l7.49,2.07l0.19,-0.01l4.68,-1.78l1.76,1.84l-2.59,3.26l-0.01,0.36l0.34,0.11l6.35,-2.2l12.09,-2.32l7.31,1.14l1.17,2.13l-9.9,4.05l-1.43,1.32l-7.91,0.98l-0.26,0.31l0.29,0.29l5.25,0.25l-2.63,3.72l-2.02,3.61l-0.04,0.15l0.08,6.05l0.07,0.19l2.61,3.0l-3.4,0.2l-4.12,1.66l-0.04,0.54l4.5,2.67l0.53,3.9l-2.39,0.42l-0.19,0.48l2.91,3.83l-5.0,0.32l-0.27,0.22l0.12,0.33l2.69,1.84l-0.65,1.35l-3.36,0.71l-3.46,0.01l-0.21,0.51l3.05,3.15l0.02,1.53l-4.54,-1.79l-0.32,0.06l-1.29,1.26l0.11,0.5l3.33,1.15l3.17,2.74l0.85,3.29l-4.0,0.78l-1.83,-1.66l-3.1,-2.64l-0.36,-0.02l-0.13,0.33l0.8,2.92l-2.76,2.26l-0.09,0.33l0.28,0.2l6.59,0.19l2.47,0.18l-5.86,3.38l-6.76,3.43l-7.26,1.48l-2.73,0.02l-0.16,0.05l-2.67,1.72l-3.44,4.42l-5.28,2.86l-1.73,0.18l-3.33,1.01l-3.59,0.96l-0.15,0.1l-2.15,2.52l-0.07,0.19l-0.03,2.76l-1.21,2.49l-4.03,3.1l-0.1,0.33l0.98,2.94l-2.31,6.57l-3.21,0.21l-3.6,-3.0l-0.19,-0.07l-4.9,-0.02l-2.29,-1.97l-1.69,-3.78l-4.31,-4.86l-1.23,-2.52l-0.34,-3.58l-0.08,-0.17l-3.35,-3.67l0.85,-2.92l-0.09,-0.31l-1.5,-1.34l2.33,-4.7l3.67,-1.57l0.15,-0.13l1.02,-1.93l0.52,-3.47l-0.44,-0.31l-2.85,1.57l-1.33,0.64l-2.12,0.59l-2.81,-1.32l-0.15,-2.79l0.88,-2.17l2.09,-0.06l5.07,1.2l0.34,-0.17l-0.11,-0.37l-4.3,-2.9l-2.24,-1.58l-0.25,-0.05l-2.38,0.62l-1.7,-0.93l2.62,-4.1l-0.03,-0.36l-1.51,-1.75l-1.97,-3.3l-3.01,-5.21l-0.1,-0.11l-3.04,-1.85l0.03,-1.94l-0.18,-0.28l-6.82,-3.01l-5.35,-0.38l-6.69,0.21l-6.03,0.37l-2.81,-1.59l-3.84,-2.9l5.94,-1.5l5.01,-0.28l0.28,-0.29l-0.26,-0.31l-10.68,-1.38l-5.38,-2.1l0.27,-1.68l9.3,-2.6l9.18,-2.68l0.19,-0.16l0.97,-2.05l-0.18,-0.42l-6.29,-1.91l1.81,-1.9l8.58,-4.05l3.6,-0.63l0.23,-0.4l-0.92,-2.37l5.59,-1.5l7.66,-0.95l7.58,-0.05l2.65,1.84l0.31,0.02l6.52,-3.29l5.85,2.24l3.55,0.49l5.17,1.95l0.38,-0.16l-0.13,-0.39l-5.77,-3.16l0.29,-2.26Z", "name": "Greenland"}, "KW": {"path": "M540.87,207.81l0.41,0.94l-0.18,0.51l0.0,0.21l0.65,1.66l-1.15,0.05l-0.54,-1.12l-0.24,-0.17l-1.73,-0.2l1.44,-2.06l1.33,0.18Z", "name": "Kuwait"}, "GH": {"path": "M423.16,269.88l-3.58,1.34l-1.41,0.87l-2.13,0.69l-1.91,-0.61l0.09,-0.75l-0.03,-0.17l-1.04,-2.07l0.62,-2.7l1.04,-2.08l0.03,-0.19l-1.0,-5.46l0.05,-1.12l4.04,-0.11l1.08,0.18l0.18,-0.03l0.72,-0.36l0.75,0.13l-0.11,0.48l0.06,0.26l0.98,1.22l-0.0,1.77l0.24,1.99l0.05,0.13l0.55,0.81l-0.52,2.14l0.19,1.37l0.69,1.66l0.38,0.62Z", "name": "Ghana"}, "OM": {"path": "M568.16,231.0l-0.08,0.1l-0.84,1.61l-0.93,-0.11l-0.27,0.11l-0.58,0.73l-0.4,1.32l-0.01,0.14l0.29,1.61l-0.07,0.09l-1.0,-0.01l-0.16,0.04l-1.56,0.97l-0.14,0.2l-0.23,1.17l-0.41,0.4l-1.44,-0.02l-0.17,0.05l-0.98,0.65l-0.13,0.25l0.01,0.87l-0.97,0.57l-1.27,-0.22l-0.19,0.03l-1.63,0.84l-0.88,0.11l-2.55,-5.57l7.2,-2.49l0.19,-0.19l1.67,-5.23l-0.03,-0.25l-1.1,-1.78l0.05,-0.89l0.68,-1.03l0.05,-0.16l0.01,-0.89l0.96,-0.44l0.07,-0.5l-0.32,-0.26l0.16,-1.31l0.85,-0.01l1.03,1.67l0.09,0.09l1.4,0.96l0.11,0.05l1.82,0.34l1.37,0.45l1.75,2.32l0.13,0.1l0.7,0.26l-0.0,0.3l-1.25,2.19l-1.01,0.8ZM561.88,218.47l-0.01,0.02l-0.15,-0.29l0.3,-0.38l-0.14,0.65Z", "name": "Oman"}, "_3": {"path": "M543.2,261.06l-1.07,1.46l-1.65,1.99l-1.91,0.01l-8.08,-2.95l-0.89,-0.84l-0.9,-1.19l-0.81,-1.23l0.44,-0.73l0.76,-1.12l0.49,0.28l0.52,1.05l1.13,1.06l0.2,0.08l1.24,0.01l2.42,-0.65l2.77,-0.31l2.17,-0.78l1.31,-0.19l0.84,-0.43l1.03,-0.06l-0.01,4.54Z", "name": "Somaliland"}, "_2": {"path": "M384.23,230.37l0.07,-0.06l0.28,-0.89l0.99,-1.13l0.07,-0.13l0.8,-3.54l3.4,-2.8l0.09,-0.13l0.76,-2.17l0.07,5.5l-2.07,0.21l-0.24,0.17l-0.61,1.36l-0.02,0.16l0.43,3.46l-4.01,-0.01ZM391.82,218.2l0.07,-0.06l0.75,-1.93l1.86,-0.25l0.94,0.34l1.14,0.0l0.18,-0.06l0.73,-0.56l1.41,-0.08l-0.0,2.72l-7.08,-0.12Z", "name": "Western Sahara"}, "_1": {"path": "M472.71,172.84l-0.07,-0.43l-0.16,-0.22l-0.53,-0.27l-0.38,-0.58l0.3,-0.43l0.51,-0.19l0.18,-0.18l0.3,-0.87l0.12,-0.04l0.22,0.26l0.12,0.09l0.38,0.15l0.28,0.41l0.15,0.12l0.34,0.12l0.43,0.5l0.15,0.07l-0.12,0.3l-0.27,0.32l-0.03,0.18l-0.31,0.06l-1.48,0.47l-0.15,0.17Z", "name": "Kosovo"}, "_0": {"path": "M503.54,192.92l0.09,-0.17l0.41,0.01l-0.08,0.01l-0.42,0.15ZM504.23,192.76l1.02,0.02l0.4,-0.13l-0.09,0.29l0.03,0.08l-0.35,0.16l-0.24,-0.04l-0.06,-0.1l-0.18,-0.17l-0.19,-0.08l-0.33,-0.02Z", "name": "Northern Cyprus"}, "JO": {"path": "M510.26,200.93l0.28,-0.57l2.53,1.0l0.27,-0.02l4.57,-2.77l0.84,2.84l-0.28,0.25l-4.95,1.37l-0.14,0.49l2.24,2.48l-0.5,0.28l-0.13,0.14l-0.35,0.78l-1.76,0.35l-0.2,0.14l-0.57,0.94l-0.94,0.73l-2.45,-0.38l-0.03,-0.12l1.23,-4.32l-0.04,-1.1l0.34,-0.75l0.03,-0.12l0.0,-1.63Z", "name": "Jordan"}, "HR": {"path": "M455.49,162.73l1.53,0.09l0.24,-0.1l0.29,-0.34l0.64,0.38l0.14,0.04l0.98,0.06l0.32,-0.3l-0.01,-0.66l0.67,-0.25l0.19,-0.22l0.21,-1.11l1.72,-0.72l0.65,0.32l1.94,1.37l2.07,0.6l0.22,-0.02l0.67,-0.33l0.47,0.94l0.67,0.76l-0.63,0.77l-0.91,-0.55l-0.16,-0.04l-1.69,0.04l-2.2,-0.51l-1.17,0.07l-0.21,0.11l-0.36,0.42l-0.67,-0.53l-0.46,0.12l-0.52,1.29l0.05,0.31l1.21,1.42l0.58,0.99l1.15,1.14l0.95,0.68l0.92,1.23l0.1,0.09l1.75,0.91l-1.87,-0.89l-1.5,-1.11l-2.23,-0.88l-1.77,-1.9l0.12,-0.06l0.1,-0.47l-1.07,-1.22l-0.04,-0.94l-0.21,-0.27l-1.61,-0.49l-0.35,0.14l-0.53,0.93l-0.41,-0.57l0.04,-0.73Z", "name": "Croatia"}, "HT": {"path": "M237.82,234.68l1.35,0.1l1.95,0.37l0.18,1.15l-0.16,0.83l-0.51,0.37l-0.06,0.44l0.57,0.68l-0.02,0.22l-1.31,-0.35l-1.26,0.17l-1.49,-0.18l-0.15,0.02l-1.03,0.43l-1.02,-0.61l0.09,-0.36l2.04,0.32l1.9,0.21l0.19,-0.05l0.9,-0.58l0.05,-0.47l-1.05,-1.03l0.02,-0.86l-0.23,-0.3l-1.13,-0.29l0.18,-0.23Z", "name": "Haiti"}, "HU": {"path": "M461.96,157.92l0.68,-1.66l-0.03,-0.29l-0.15,-0.22l0.84,-0.0l0.3,-0.26l0.12,-0.84l0.88,0.57l0.98,0.38l0.16,0.01l2.1,-0.39l0.23,-0.21l0.14,-0.45l0.88,-0.1l1.06,-0.43l0.13,0.1l0.28,0.04l1.18,-0.4l0.14,-0.1l0.52,-0.67l0.63,-0.15l2.6,0.95l0.26,-0.03l0.38,-0.23l1.12,0.7l0.1,0.49l-1.31,0.57l-0.14,0.13l-1.18,2.14l-1.44,2.04l-1.85,0.55l-1.51,-0.13l-0.14,0.02l-1.92,0.82l-0.85,0.42l-1.91,-0.55l-1.83,-1.31l-0.74,-0.37l-0.44,-0.97l-0.26,-0.18Z", "name": "Hungary"}, "HN": {"path": "M202.48,251.87l-0.33,-0.62l-0.18,-0.14l-0.5,-0.15l0.13,-0.76l-0.11,-0.28l-0.34,-0.28l-0.6,-0.23l-0.18,-0.01l-0.81,0.22l-0.16,-0.24l-0.72,-0.39l-0.51,-0.48l-0.12,-0.07l-0.31,-0.09l0.24,-0.3l0.04,-0.3l-0.16,-0.4l0.1,-0.28l1.14,-0.69l1.0,-0.86l0.09,0.04l0.3,-0.05l0.47,-0.39l0.49,-0.03l0.14,0.13l0.29,0.06l0.31,-0.1l1.16,0.22l1.24,-0.08l0.81,-0.28l0.29,-0.25l0.63,0.1l0.69,0.18l0.65,-0.06l0.49,-0.2l1.04,0.32l0.38,0.06l0.7,0.44l0.71,0.56l0.92,0.41l0.1,0.11l-0.11,-0.01l-0.23,0.09l-0.3,0.3l-0.76,0.29l-0.58,0.0l-0.15,0.04l-0.45,0.26l-0.31,-0.07l-0.37,-0.34l-0.28,-0.07l-0.26,0.07l-0.18,0.15l-0.23,0.43l-0.04,-0.0l-0.33,0.28l-0.03,0.4l-0.76,0.61l-0.45,0.3l-0.15,0.16l-0.51,-0.36l-0.41,0.06l-0.45,0.56l-0.41,-0.01l-0.59,0.06l-0.27,0.31l0.04,0.96l-0.07,0.0l-0.25,0.16l-0.24,0.45l-0.42,0.06Z", "name": "Honduras"}, "PR": {"path": "M254.95,238.31l1.15,0.21l0.2,0.23l-0.36,0.36l-1.76,-0.01l-1.2,0.07l-0.09,-0.69l0.17,-0.18l1.89,0.01Z", "name": "Puerto Rico"}, "PS": {"path": "M509.66,201.06l-0.0,1.44l-0.29,0.63l-0.59,0.19l0.02,-0.11l0.52,-0.31l-0.02,-0.53l-0.41,-0.2l0.36,-1.28l0.41,0.17Z", "name": "West Bank"}, "PT": {"path": "M398.65,173.6l0.75,-0.63l0.7,-0.3l0.51,1.2l0.28,0.18l1.48,-0.0l0.2,-0.08l0.33,-0.3l1.16,0.08l0.52,1.11l-0.95,0.66l-0.13,0.24l-0.03,2.2l-0.33,0.35l-0.08,0.18l-0.08,1.17l-0.86,0.19l-0.2,0.44l0.93,1.64l-0.64,1.79l0.07,0.31l0.72,0.72l-0.24,0.56l-0.9,1.05l-0.07,0.26l0.17,0.77l-0.73,0.54l-1.18,-0.36l-0.16,-0.0l-0.85,0.21l0.31,-1.81l-0.23,-1.87l-0.23,-0.25l-0.99,-0.24l-0.49,-0.91l0.18,-1.72l0.93,-0.99l0.08,-0.16l0.17,-1.17l0.52,-1.76l-0.04,-1.36l-0.51,-1.14l-0.09,-0.8Z", "name": "Portugal"}, "PY": {"path": "M264.33,341.43l0.93,-2.96l0.07,-1.42l1.1,-2.1l4.19,-0.73l2.22,0.04l2.12,1.21l0.07,0.76l0.7,1.38l-0.16,3.48l0.24,0.31l2.64,0.5l0.19,-0.03l0.9,-0.45l1.47,0.62l0.38,0.64l0.23,2.35l0.3,1.07l0.25,0.21l0.93,0.12l0.16,-0.02l0.8,-0.37l0.61,0.33l-0.0,1.25l-0.33,1.53l-0.5,1.57l-0.39,2.26l-2.14,1.94l-1.85,0.4l-2.74,-0.4l-2.13,-0.62l2.26,-3.75l0.03,-0.24l-0.36,-1.18l-0.17,-0.19l-2.55,-1.03l-3.04,-1.95l-2.07,-0.43l-4.4,-4.12Z", "name": "Paraguay"}, "PA": {"path": "M213.65,263.79l0.18,-0.43l0.02,-0.18l-0.06,-0.28l0.23,-0.18l-0.01,-0.48l-0.4,-0.29l-0.01,-0.62l0.57,-0.13l0.68,0.69l-0.04,0.39l0.26,0.33l1.0,0.11l0.27,-0.1l0.49,0.44l0.24,0.07l1.34,-0.22l1.04,-0.62l1.49,-0.5l0.86,-0.73l0.99,0.11l0.18,0.28l1.35,0.08l1.02,0.4l0.78,0.72l0.71,0.53l-0.1,0.12l-0.05,0.3l0.53,1.34l-0.28,0.44l-0.6,-0.13l-0.36,0.22l-0.2,0.76l-0.41,-0.36l-0.44,-1.12l0.49,-0.53l-0.14,-0.49l-0.51,-0.14l-0.41,-0.72l-0.11,-0.11l-1.25,-0.7l-0.19,-0.04l-1.1,0.16l-0.22,0.15l-0.47,0.81l-0.9,0.56l-0.49,0.08l-0.22,0.17l-0.25,0.52l0.05,0.32l0.93,1.07l-0.41,0.21l-0.29,0.3l-0.81,0.09l-0.36,-1.26l-0.53,-0.1l-0.21,0.28l-0.5,-0.09l-0.44,-0.88l-0.22,-0.16l-0.99,-0.16l-0.61,-0.28l-0.13,-0.03l-1.0,0.0Z", "name": "Panama"}, "PG": {"path": "M808.4,298.6l0.62,0.46l1.19,1.56l1.04,0.77l-0.18,0.37l-0.42,0.15l-0.92,-0.82l-1.05,-1.53l-0.27,-0.96ZM804.09,296.06l-0.3,0.26l-0.36,-1.11l-0.66,-1.06l-2.55,-1.89l-1.42,-0.59l0.17,-0.15l1.16,0.6l0.85,0.55l1.01,0.58l0.97,1.02l0.9,0.76l0.24,1.03ZM796.71,297.99l0.15,0.82l0.34,0.24l1.43,-0.19l0.19,-0.11l0.68,-0.82l1.36,-0.87l0.13,-0.31l-0.21,-1.13l1.04,-0.03l0.3,0.25l-0.04,1.17l-0.74,1.34l-1.17,0.18l-0.22,0.15l-0.35,0.62l-2.51,1.13l-1.21,-0.0l-1.99,-0.71l-1.19,-0.58l0.07,-0.28l1.98,0.32l1.46,-0.2l0.24,-0.21l0.25,-0.79ZM789.24,303.52l0.11,0.15l2.19,1.62l1.6,2.62l0.27,0.14l1.09,-0.06l-0.07,0.77l0.23,0.32l1.23,0.27l-0.14,0.09l0.05,0.53l2.39,0.95l-0.11,0.28l-1.33,0.14l-0.51,-0.55l-0.18,-0.09l-4.59,-0.65l-1.87,-1.55l-1.38,-1.35l-1.28,-2.17l-0.16,-0.13l-3.27,-1.1l-0.19,0.0l-2.12,0.72l-1.58,0.85l-0.15,0.31l0.28,1.63l-1.65,0.73l-1.37,-0.4l-2.3,-0.09l-0.08,-15.65l3.95,1.57l4.58,1.42l1.67,1.25l1.32,1.19l0.36,1.39l0.19,0.21l4.06,1.51l0.39,0.85l-1.9,0.22l-0.25,0.39l0.55,1.68Z", "name": "Papua New Guinea"}, "PE": {"path": "M246.44,329.21l-0.63,1.25l-1.05,0.54l-2.25,-1.33l-0.19,-0.93l-0.16,-0.21l-4.95,-2.58l-4.46,-2.79l-1.87,-1.52l-0.94,-1.91l0.33,-0.6l-0.01,-0.31l-2.11,-3.33l-2.46,-4.66l-2.36,-5.02l-1.04,-1.18l-0.77,-1.81l-0.08,-0.11l-1.95,-1.64l-1.54,-0.88l0.61,-0.85l0.02,-0.31l-1.15,-2.27l0.69,-1.56l1.59,-1.26l0.12,0.42l-0.56,0.47l-0.11,0.25l0.07,0.92l0.36,0.27l0.97,-0.19l0.85,0.23l0.99,1.19l0.41,0.05l1.42,-1.03l0.11,-0.16l0.46,-1.64l1.45,-2.06l2.92,-0.96l0.11,-0.07l2.73,-2.62l0.84,-1.72l0.02,-0.18l-0.3,-1.65l0.28,-0.1l1.49,1.06l0.77,1.14l0.1,0.09l1.08,0.6l1.43,2.55l0.21,0.15l1.86,0.31l0.18,-0.03l1.25,-0.6l0.77,0.37l0.17,0.03l1.4,-0.2l1.57,0.96l-1.45,2.29l0.23,0.46l0.63,0.05l0.66,0.7l-1.51,-0.08l-0.24,0.1l-0.27,0.31l-1.96,0.46l-2.95,1.74l-0.14,0.21l-0.17,1.1l-0.6,0.82l-0.05,0.23l0.21,1.13l-1.31,0.63l-0.17,0.27l0.0,0.91l-0.53,0.37l-0.1,0.37l1.04,2.27l1.31,1.46l-0.44,0.9l0.24,0.43l1.52,0.13l0.87,1.23l0.24,0.13l2.21,0.07l0.18,-0.06l1.55,-1.13l-0.14,3.22l0.23,0.3l1.14,0.29l0.16,-0.0l1.18,-0.36l1.97,3.71l-0.45,0.71l-0.04,0.14l-0.12,1.8l-0.05,2.07l-0.92,1.2l-0.03,0.31l0.38,0.8l-0.48,0.72l-0.02,0.3l1.01,2.02l-1.5,2.64Z", "name": "Peru"}, "PK": {"path": "M609.08,187.76l1.66,1.21l0.71,2.11l0.2,0.19l3.62,1.01l-1.98,1.95l-2.65,0.4l-3.75,-0.68l-0.26,0.08l-1.23,1.22l-0.07,0.31l0.89,2.46l0.88,1.92l0.1,0.12l1.67,1.14l-1.8,1.35l-0.12,0.25l0.04,1.85l-2.35,2.67l-1.59,2.79l-2.5,2.72l-2.76,-0.2l-0.24,0.09l-2.76,2.83l0.04,0.45l1.54,1.13l0.27,1.94l0.09,0.17l1.34,1.29l0.4,1.83l-5.14,-0.01l-0.22,0.09l-1.53,1.63l-1.52,-0.56l-0.76,-1.88l-1.93,-2.03l-0.25,-0.09l-4.6,0.5l-4.05,0.05l-3.1,0.33l0.77,-2.53l3.48,-1.33l0.19,-0.33l-0.21,-1.24l-0.19,-0.23l-1.01,-0.37l-0.06,-2.18l-0.17,-0.26l-2.32,-1.16l-0.96,-1.57l-0.56,-0.65l3.16,1.05l0.14,0.01l2.45,-0.4l1.44,0.33l0.3,-0.1l0.4,-0.47l1.58,0.22l0.14,-0.01l3.25,-1.14l0.2,-0.27l0.08,-2.23l1.23,-1.38l1.73,0.0l0.28,-0.2l0.22,-0.61l1.68,-0.32l0.86,0.24l0.27,-0.05l0.98,-0.78l0.11,-0.26l-0.13,-1.57l0.96,-1.52l1.51,-0.67l0.14,-0.41l-0.74,-1.4l1.86,0.07l0.26,-0.13l0.69,-1.01l0.05,-0.2l-0.09,-0.94l1.14,-1.09l0.09,-0.28l-0.29,-1.41l-0.51,-1.07l1.23,-1.05l2.6,-0.58l2.86,-0.33l1.33,-0.54l1.3,-0.29Z", "name": "Pakistan"}, "PH": {"path": "M737.11,263.82l0.25,1.66l0.14,1.34l-0.54,1.46l-0.64,-1.79l-0.5,-0.1l-1.17,1.28l-0.05,0.32l0.74,1.71l-0.49,0.81l-2.6,-1.28l-0.61,-1.57l0.68,-1.07l-0.07,-0.4l-1.59,-1.19l-0.42,0.06l-0.69,0.91l-1.01,-0.08l-0.21,0.06l-1.58,1.2l-0.17,-0.3l0.87,-1.88l1.48,-0.66l1.18,-0.81l0.71,0.92l0.34,0.1l1.9,-0.69l0.18,-0.18l0.34,-0.94l1.57,-0.06l0.29,-0.32l-0.1,-1.38l1.41,0.83l0.36,2.06ZM734.94,254.42l0.56,2.24l-1.41,-0.49l-0.4,0.3l0.07,0.94l0.51,1.3l-0.54,0.26l-0.08,-1.34l-0.25,-0.28l-0.56,-0.1l-0.23,-0.91l1.03,0.14l0.34,-0.31l-0.03,-0.96l-0.06,-0.18l-1.14,-1.44l1.62,0.04l0.57,0.78ZM724.68,238.33l1.48,0.71l0.33,-0.04l0.44,-0.38l0.05,0.13l-0.37,0.97l0.01,0.23l0.81,1.75l-0.59,1.92l-1.37,0.79l-0.14,0.2l-0.39,2.07l0.01,0.14l0.56,2.04l0.23,0.21l1.33,0.28l0.14,-0.0l1.0,-0.27l2.82,1.28l-0.2,1.16l0.12,0.29l0.66,0.5l-0.13,0.56l-1.54,-0.99l-0.89,-1.29l-0.49,0.0l-0.44,0.65l-1.34,-1.28l-0.26,-0.08l-2.18,0.36l-0.96,-0.44l0.09,-0.72l0.69,-0.57l-0.01,-0.47l-0.75,-0.59l-0.47,0.14l-0.15,0.43l-0.86,-1.02l-0.34,-1.02l-0.07,-1.74l0.49,0.41l0.49,-0.21l0.26,-3.99l0.73,-2.1l1.23,0.0ZM731.12,258.92l-0.82,0.75l-0.83,1.64l-0.52,0.5l-1.17,-1.33l0.36,-0.47l0.62,-0.7l0.07,-0.15l0.24,-1.35l0.73,-0.08l-0.31,1.29l0.16,0.34l0.37,-0.09l1.21,-1.6l-0.12,1.24ZM726.66,255.58l0.85,0.45l0.14,0.03l1.28,-0.0l-0.03,0.62l-1.04,0.96l-1.15,0.55l-0.05,-0.71l0.17,-1.26l-0.01,-0.13l-0.16,-0.51ZM724.92,252.06l-0.45,1.5l-0.7,-0.83l-0.95,-1.43l1.44,0.06l0.67,0.7ZM717.48,261.28l-1.87,1.35l0.21,-0.3l1.81,-1.57l1.5,-1.75l0.97,-1.84l0.23,1.08l-1.56,1.33l-1.29,1.7Z", "name": "Philippines"}, "PL": {"path": "M458.8,144.25l-0.96,-1.98l0.18,-1.06l-0.01,-0.15l-0.62,-1.8l-0.82,-1.11l0.56,-0.73l0.05,-0.28l-0.51,-1.51l1.48,-0.87l3.88,-1.58l3.06,-1.14l2.23,0.52l0.15,0.66l0.29,0.23l2.4,0.04l3.11,0.39l4.56,-0.05l1.12,0.32l0.51,0.89l0.1,1.45l0.03,0.12l0.66,1.23l-0.01,1.08l-1.33,0.61l-0.14,0.41l0.74,1.5l0.07,1.53l1.22,2.79l-0.19,0.66l-1.09,0.33l-0.14,0.09l-2.27,2.72l-0.04,0.31l0.35,0.8l-2.22,-1.16l-0.21,-0.02l-1.72,0.44l-1.1,-0.31l-0.21,0.02l-1.3,0.61l-1.11,-1.02l-0.32,-0.05l-0.81,0.35l-1.15,-1.61l-0.21,-0.12l-1.65,-0.17l-0.19,-0.82l-0.23,-0.23l-1.72,-0.37l-0.34,0.17l-0.25,0.56l-0.88,-0.44l0.12,-0.69l-0.25,-0.35l-1.78,-0.27l-1.08,-0.97Z", "name": "Poland"}, "ZM": {"path": "M502.81,308.32l1.09,1.04l0.58,1.94l-0.39,0.66l-0.5,2.05l-0.0,0.14l0.45,1.95l-0.69,0.77l-0.06,0.11l-0.76,2.37l0.15,0.36l0.62,0.31l-6.85,1.9l-0.22,0.33l0.2,1.54l-1.62,0.3l-0.12,0.05l-1.43,1.02l-0.11,0.15l-0.25,0.73l-0.73,0.17l-0.14,0.08l-2.18,2.12l-1.33,1.6l-0.65,0.05l-0.83,-0.29l-2.75,-0.28l-0.24,-0.1l-0.15,-0.27l-0.99,-0.58l-0.12,-0.04l-1.73,-0.14l-1.88,0.54l-1.5,-1.48l-1.61,-2.01l0.11,-7.73l4.92,0.03l0.29,-0.37l-0.19,-0.79l0.34,-0.86l0.0,-0.21l-0.41,-1.11l0.26,-1.14l-0.01,-0.16l-0.12,-0.36l0.18,0.01l0.1,0.56l0.31,0.25l1.14,-0.06l1.44,0.21l0.76,1.05l0.19,0.12l2.01,0.35l0.19,-0.03l1.24,-0.65l0.44,1.03l0.22,0.18l1.81,0.34l0.85,0.99l1.02,1.39l0.24,0.12l1.92,0.02l0.3,-0.32l-0.21,-2.74l-0.47,-0.23l-0.53,0.36l-1.58,-0.89l-0.51,-0.34l0.29,-2.36l0.44,-2.99l-0.03,-0.18l-0.5,-0.99l0.61,-1.38l0.53,-0.24l3.26,-0.41l0.89,0.23l1.01,0.62l1.04,0.44l1.6,0.43l1.35,0.72Z", "name": "Zambia"}, "EE": {"path": "M482.19,120.88l0.23,-1.68l-0.43,-0.31l-0.75,0.37l-1.34,-1.1l-0.18,-1.75l2.92,-0.95l3.07,-0.53l2.66,0.6l2.48,-0.1l0.18,0.31l-1.65,1.96l-0.06,0.26l0.71,3.25l-0.88,0.94l-1.85,-0.01l-2.08,-1.3l-1.14,-0.47l-0.2,-0.01l-1.69,0.51Z", "name": "Estonia"}, "EG": {"path": "M508.07,208.8l-0.66,1.06l-0.53,2.03l-0.64,1.32l-0.32,0.26l-1.74,-1.85l-1.77,-3.86l-0.48,-0.09l-0.26,0.25l-0.07,0.32l1.04,2.88l1.55,2.76l1.89,4.18l0.94,1.48l0.83,1.54l2.08,2.73l-0.3,0.28l-0.1,0.23l0.08,1.72l0.11,0.22l2.91,2.37l-28.78,0.0l0.0,-19.06l-0.73,-2.2l0.61,-1.59l0.0,-0.2l-0.34,-1.04l0.73,-1.08l3.13,-0.04l2.36,0.72l2.48,0.81l1.15,0.43l0.23,-0.01l1.93,-0.87l1.02,-0.78l2.08,-0.21l1.59,0.31l0.62,1.24l0.52,0.03l0.46,-0.71l1.86,0.59l1.95,0.16l0.17,-0.04l0.92,-0.52l1.48,4.24Z", "name": "Egypt"}, "ZA": {"path": "M467.06,373.27l-0.13,-0.29l0.01,-1.58l-0.02,-0.12l-0.71,-1.64l0.59,-0.37l0.14,-0.26l-0.07,-2.13l-0.05,-0.15l-1.63,-2.58l-1.25,-2.31l-1.71,-3.37l0.88,-0.98l0.7,0.52l0.39,1.08l0.23,0.19l1.1,0.19l1.55,0.51l0.14,0.01l1.35,-0.2l0.11,-0.04l2.24,-1.39l0.14,-0.25l0.0,-9.4l0.16,0.09l1.39,2.38l-0.22,1.53l0.04,0.19l0.56,0.94l0.3,0.14l1.79,-0.27l0.16,-0.08l1.23,-1.18l1.17,-0.79l0.1,-0.12l0.57,-1.19l1.02,-0.52l0.9,0.28l1.16,0.73l0.14,0.05l2.04,0.13l0.13,-0.02l1.6,-0.62l0.18,-0.19l0.63,-1.93l1.18,-0.19l0.19,-0.12l0.78,-1.05l0.81,-1.71l2.18,-1.91l3.44,-1.88l0.89,0.02l1.17,0.43l0.21,-0.0l0.76,-0.29l1.07,0.21l1.15,3.55l0.63,1.82l-0.44,2.9l0.1,0.52l-0.74,-0.29l-0.18,-0.01l-0.72,0.19l-0.21,0.2l-0.22,0.74l-0.66,0.97l-0.05,0.18l0.02,0.93l0.09,0.21l1.49,1.46l0.27,0.08l1.47,-0.29l0.22,-0.18l0.43,-1.01l1.29,0.02l-0.51,1.63l-0.29,2.2l-0.59,1.12l-2.2,1.78l-1.06,1.39l-0.72,1.44l-1.39,1.93l-2.81,2.84l-1.75,1.65l-1.85,1.24l-2.55,1.06l-1.23,0.14l-0.24,0.18l-0.22,0.54l-1.27,-0.35l-0.2,0.01l-1.15,0.5l-2.62,-0.52l-0.12,0.0l-1.46,0.33l-0.98,-0.14l-0.16,0.02l-2.55,1.1l-2.11,0.44l-1.59,1.07l-0.93,0.06l-0.97,-0.92l-0.19,-0.08l-0.72,-0.04l-1.0,-1.16l-0.25,0.05ZM493.72,359.24l-1.12,-0.86l-0.31,-0.03l-1.23,0.59l-1.36,1.07l-1.39,1.78l0.01,0.38l1.88,2.11l0.31,0.09l0.9,-0.27l0.18,-0.15l0.4,-0.77l1.28,-0.39l0.18,-0.16l0.42,-0.88l0.76,-1.32l-0.05,-0.37l-0.87,-0.82Z", "name": "South Africa"}, "EC": {"path": "M220.2,293.48l1.25,-1.76l0.02,-0.31l-0.54,-1.09l-0.5,-0.06l-0.78,0.94l-1.03,-0.75l0.33,-0.46l0.05,-0.23l-0.38,-2.04l0.66,-0.28l0.17,-0.19l0.45,-1.52l0.93,-1.58l0.04,-0.2l-0.13,-0.78l1.19,-0.47l1.57,-0.91l2.35,1.34l0.17,0.04l0.28,-0.02l0.52,0.91l0.21,0.15l2.12,0.35l0.2,-0.03l0.55,-0.31l1.08,0.73l0.97,0.54l0.31,1.67l-0.71,1.49l-2.64,2.54l-2.95,0.97l-0.15,0.11l-1.53,2.18l-0.49,1.68l-1.1,0.8l-0.87,-1.05l-0.15,-0.1l-1.01,-0.27l-0.13,-0.0l-0.7,0.14l-0.03,-0.43l0.6,-0.5l0.1,-0.31l-0.26,-0.91Z", "name": "Ecuador"}, "AL": {"path": "M470.27,171.7l0.38,0.19l0.45,-0.18l0.4,0.61l0.11,0.1l0.46,0.24l0.13,0.87l-0.3,0.95l-0.0,0.17l0.36,1.28l0.12,0.17l0.9,0.63l-0.03,0.44l-0.67,0.35l-0.16,0.22l-0.14,0.88l-0.96,1.18l-0.06,-0.03l-0.04,-0.48l-0.12,-0.22l-1.28,-0.92l-0.19,-1.25l0.2,-1.96l0.33,-0.89l-0.06,-0.3l-0.36,-0.41l-0.13,-0.75l0.66,-0.9Z", "name": "Albania"}, "AO": {"path": "M461.62,299.93l0.55,1.67l0.73,1.54l1.56,2.18l0.28,0.12l1.66,-0.2l0.81,-0.34l1.28,0.33l0.33,-0.14l0.39,-0.67l0.56,-1.3l1.37,-0.09l0.27,-0.21l0.07,-0.23l0.67,-0.01l-0.13,0.53l0.29,0.37l2.74,-0.02l0.04,1.29l0.03,0.13l0.46,0.87l-0.35,1.52l0.18,1.55l0.07,0.16l0.75,0.85l-0.13,2.89l0.41,0.29l0.56,-0.21l1.11,0.05l1.5,-0.37l0.9,0.12l0.18,0.53l-0.27,1.15l0.01,0.17l0.4,1.08l-0.33,0.85l-0.01,0.18l0.12,0.51l-4.83,-0.03l-0.3,0.3l-0.12,8.13l0.07,0.19l1.69,2.1l1.27,1.25l-4.03,0.92l-5.93,-0.36l-1.66,-1.19l-0.18,-0.06l-10.15,0.11l-0.34,0.13l-1.35,-1.05l-0.17,-0.06l-1.62,-0.08l-1.6,0.45l-0.88,0.36l-0.17,-1.2l0.34,-2.19l0.85,-2.32l0.14,-1.13l0.79,-2.24l0.57,-1.0l1.42,-1.64l0.82,-1.15l0.05,-0.13l0.26,-1.88l-0.13,-1.51l-0.07,-0.16l-0.72,-0.87l-1.23,-2.91l0.09,-0.37l0.73,-0.95l0.05,-0.27l-1.27,-4.12l-1.19,-1.54l0.1,-0.2l0.86,-0.28l0.78,0.03l0.83,-0.29l7.12,0.03ZM451.81,298.94l-0.17,0.07l-0.5,-1.42l0.85,-0.92l0.53,-0.29l0.48,0.44l-0.56,0.32l-0.1,0.1l-0.41,0.65l-0.05,0.14l-0.07,0.91Z", "name": "Angola"}, "KZ": {"path": "M598.42,172.08l-1.37,0.54l-3.3,2.09l-0.11,0.12l-1.01,1.97l-0.56,0.01l-0.6,-1.24l-0.26,-0.17l-2.95,-0.09l-0.46,-2.22l-0.29,-0.24l-0.91,-0.02l0.17,-2.72l-0.12,-0.26l-3.0,-2.22l-0.2,-0.06l-4.29,0.24l-2.8,0.42l-2.36,-2.7l-6.4,-3.65l-0.23,-0.03l-6.45,1.83l-0.22,0.29l0.1,10.94l-0.84,0.1l-1.65,-2.21l-0.11,-0.09l-1.69,-0.84l-0.2,-0.02l-2.84,0.63l-0.14,0.07l-0.71,0.64l-0.02,-0.11l0.57,-1.17l0.0,-0.26l-0.48,-1.05l-0.17,-0.16l-2.78,-0.99l-1.08,-2.62l-0.13,-0.15l-1.24,-0.7l-0.04,-0.48l2.07,0.25l0.34,-0.29l0.09,-2.03l1.84,-0.44l2.12,0.45l0.36,-0.25l0.45,-3.04l-0.45,-2.06l-0.31,-0.23l-2.44,0.15l-2.07,-0.75l-0.23,0.01l-2.88,1.38l-2.21,0.62l-0.96,-0.38l0.22,-1.39l-0.06,-0.23l-1.6,-2.12l-0.25,-0.12l-1.72,0.08l-1.87,-1.91l1.33,-2.24l-0.06,-0.38l-0.55,-0.5l1.72,-3.08l2.3,1.7l0.48,-0.2l0.29,-2.26l4.99,-3.48l3.76,-0.08l5.46,2.27l2.96,1.33l0.26,-0.01l2.59,-1.36l3.82,-0.06l3.13,1.67l0.38,-0.09l0.63,-0.85l3.36,0.14l0.29,-0.19l0.63,-1.57l-0.13,-0.37l-3.64,-2.05l2.0,-1.36l0.1,-0.38l-0.32,-0.62l2.09,-0.76l0.13,-0.47l-1.65,-2.13l0.89,-0.91l9.27,-1.18l0.13,-0.05l1.17,-0.82l6.2,-1.27l2.26,-1.43l4.19,0.7l0.74,3.39l0.38,0.22l2.52,-0.81l2.9,1.06l-0.18,1.63l0.32,0.33l2.52,-0.23l5.0,-2.58l0.03,0.39l3.16,2.62l5.57,8.48l0.49,0.02l1.18,-1.53l3.22,1.78l0.21,0.03l3.5,-0.83l1.21,0.52l1.16,1.82l0.15,0.12l1.67,0.61l1.01,1.32l0.28,0.11l3.04,-0.41l1.1,1.64l-1.68,1.89l-1.97,0.28l-0.26,0.29l-0.12,3.09l-1.2,1.23l-4.81,-1.01l-0.35,0.2l-1.77,5.51l-1.14,0.62l-4.92,1.23l-0.2,0.41l2.14,5.06l-1.45,0.67l-0.17,0.31l0.15,1.28l-1.05,-0.3l-1.21,-1.04l-0.17,-0.07l-3.73,-0.32l-4.15,-0.08l-0.92,0.31l-3.46,-1.24l-0.22,0.01l-1.42,0.63l-0.17,0.21l-0.32,1.49l-3.82,-0.97l-0.15,0.0l-1.65,0.43l-0.2,0.17l-0.51,1.21Z", "name": "Kazakhstan"}, "ET": {"path": "M516.0,247.63l1.21,0.92l0.3,0.04l1.3,-0.53l0.46,0.41l0.19,0.08l1.65,0.03l2.05,0.96l0.67,0.88l1.07,0.79l1.0,1.45l0.7,0.68l-0.72,0.92l-0.85,1.19l-0.04,0.25l0.19,0.67l0.04,0.74l0.29,0.28l1.4,0.04l0.55,-0.15l0.23,0.19l-0.41,0.67l0.01,0.32l0.92,1.39l0.93,1.23l0.99,0.94l0.1,0.06l8.19,2.99l1.51,0.01l-6.51,6.95l-3.14,0.11l-0.18,0.06l-2.15,1.71l-1.51,0.04l-0.22,0.1l-0.6,0.69l-1.46,-0.0l-0.93,-0.78l-0.32,-0.04l-2.29,1.05l-0.12,0.1l-0.64,0.9l-1.44,-0.17l-0.51,-0.26l-0.17,-0.03l-0.56,0.07l-0.68,-0.02l-3.1,-2.08l-0.17,-0.05l-1.62,0.0l-0.68,-0.65l0.0,-1.28l-0.21,-0.29l-1.19,-0.38l-1.42,-2.63l-0.13,-0.12l-1.05,-0.53l-0.46,-1.0l-1.27,-1.23l-0.17,-0.08l-1.08,-0.13l0.53,-0.9l1.17,-0.05l0.26,-0.17l0.37,-0.77l0.03,-0.14l-0.03,-2.23l0.7,-2.49l1.08,-0.65l0.14,-0.19l0.24,-1.0l1.03,-1.85l1.47,-1.22l0.09,-0.12l1.02,-2.51l0.36,-1.96l2.62,0.48l0.33,-0.18l0.63,-1.55Z", "name": "Ethiopia"}, "ZW": {"path": "M498.95,341.2l-1.16,-0.23l-0.16,0.01l-0.74,0.28l-1.11,-0.41l-1.02,-0.04l-1.52,-1.13l-0.12,-0.05l-1.79,-0.37l-0.65,-1.46l-0.01,-0.86l-0.22,-0.29l-0.99,-0.26l-2.74,-2.77l-0.77,-1.46l-0.52,-0.5l-0.72,-1.54l2.24,0.23l0.78,0.28l0.12,0.02l0.85,-0.06l0.21,-0.11l1.38,-1.66l2.11,-2.05l0.81,-0.18l0.22,-0.2l0.27,-0.8l1.29,-0.93l1.53,-0.28l0.11,0.66l0.3,0.25l2.02,-0.05l1.04,0.48l0.5,0.59l0.18,0.1l1.13,0.18l1.11,0.7l0.01,3.06l-0.49,1.82l-0.11,1.94l0.03,0.16l0.35,0.68l-0.24,1.3l-0.27,0.17l-0.12,0.15l-0.64,1.83l-2.49,2.8Z", "name": "Zimbabwe"}, "ES": {"path": "M398.67,172.8l0.09,-1.45l-0.06,-0.2l-0.82,-1.05l3.16,-1.96l3.01,0.54l3.33,-0.02l2.64,0.52l2.14,-0.15l3.9,0.1l0.91,1.08l0.14,0.09l4.61,1.38l0.26,-0.04l0.77,-0.55l2.66,1.29l0.17,0.03l2.59,-0.35l0.1,1.28l-2.2,1.85l-3.13,0.62l-0.23,0.23l-0.21,0.92l-1.54,1.68l-0.97,2.4l0.02,0.26l0.85,1.46l-1.27,1.14l-0.09,0.14l-0.5,1.73l-1.73,0.53l-0.15,0.1l-1.68,2.1l-3.03,0.04l-2.38,-0.05l-0.17,0.05l-1.57,1.01l-0.9,1.01l-0.96,-0.19l-0.82,-0.86l-0.69,-1.6l-0.22,-0.18l-2.14,-0.41l-0.13,-0.62l0.83,-0.97l0.39,-0.86l-0.06,-0.33l-0.73,-0.73l0.63,-1.74l-0.02,-0.25l-0.8,-1.41l0.69,-0.15l0.23,-0.27l0.09,-1.29l0.33,-0.36l0.08,-0.2l0.03,-2.16l1.03,-0.72l0.1,-0.37l-0.7,-1.5l-0.25,-0.17l-1.46,-0.11l-0.22,0.07l-0.34,0.3l-1.17,0.0l-0.55,-1.29l-0.39,-0.16l-1.02,0.44l-0.45,0.36Z", "name": "Spain"}, "ER": {"path": "M527.15,253.05l-0.77,-0.74l-1.01,-1.47l-1.14,-0.86l-0.62,-0.84l-0.11,-0.09l-2.18,-1.02l-0.12,-0.03l-1.61,-0.03l-0.52,-0.46l-0.31,-0.05l-1.31,0.54l-1.38,-1.06l-0.46,0.12l-0.69,1.68l-2.49,-0.46l-0.2,-0.76l1.06,-3.69l0.24,-1.65l0.66,-0.66l1.76,-0.4l0.16,-0.1l0.97,-1.13l1.24,2.55l0.68,2.34l0.09,0.14l1.4,1.27l3.39,2.4l1.37,1.43l2.14,2.34l0.94,0.6l-0.32,0.26l-0.85,-0.17Z", "name": "Eritrea"}, "ME": {"path": "M469.05,172.9l-0.57,-0.8l-0.1,-0.09l-0.82,-0.46l0.16,-0.33l0.35,-1.57l0.72,-0.62l0.27,-0.16l0.48,0.38l0.35,0.4l0.12,0.08l0.79,0.32l0.66,0.43l-0.43,0.62l-0.28,0.11l-0.07,-0.25l-0.53,-0.1l-1.09,1.49l-0.05,0.23l0.06,0.32Z", "name": "Montenegro"}, "MD": {"path": "M488.2,153.75l0.14,-0.11l1.49,-0.28l1.75,0.95l1.06,0.14l0.92,0.7l-0.15,0.9l0.15,0.31l0.8,0.46l0.33,1.2l0.09,0.14l0.72,0.66l-0.11,0.28l0.1,0.33l-0.06,0.02l-1.25,-0.08l-0.17,-0.29l-0.39,-0.12l-0.52,0.25l-0.16,0.36l0.13,0.42l-0.6,0.88l-0.43,1.03l-0.22,0.12l-0.32,-1.0l0.25,-1.34l-0.08,-1.38l-0.06,-0.17l-1.43,-1.87l-0.81,-1.36l-0.78,-0.95l-0.12,-0.09l-0.29,-0.12Z", "name": "Moldova"}, "MG": {"path": "M544.77,316.45l0.64,1.04l0.6,1.62l0.4,3.04l0.63,1.21l-0.22,1.07l-0.15,0.26l-0.59,-1.05l-0.52,-0.01l-0.47,0.76l-0.04,0.23l0.46,1.84l-0.19,0.92l-0.61,0.53l-0.1,0.21l-0.16,2.15l-0.97,2.98l-1.24,3.59l-1.55,4.97l-0.96,3.67l-1.08,2.93l-1.94,0.61l-2.05,1.06l-3.2,-1.53l-0.62,-1.26l-0.18,-2.39l-0.87,-2.07l-0.22,-1.8l0.4,-1.69l1.01,-0.4l0.19,-0.28l0.01,-0.79l1.15,-1.91l0.04,-0.11l0.23,-1.66l-0.03,-0.17l-0.57,-1.21l-0.46,-1.58l-0.19,-2.25l0.82,-1.36l0.33,-1.51l1.11,-0.1l1.4,-0.53l0.9,-0.45l1.03,-0.03l0.21,-0.09l1.41,-1.45l2.12,-1.65l0.75,-1.29l0.03,-0.24l-0.17,-0.56l0.53,0.15l0.32,-0.1l1.38,-1.77l0.06,-0.18l0.04,-1.44l0.54,-0.74l0.62,0.77Z", "name": "Madagascar"}, "MA": {"path": "M378.66,230.13l0.07,-0.75l0.93,-0.72l0.82,-1.37l0.04,-0.21l-0.14,-0.8l0.8,-1.74l1.33,-1.61l0.79,-0.4l0.14,-0.15l0.66,-1.55l0.08,-1.46l0.83,-1.52l1.6,-0.94l0.11,-0.11l1.56,-2.71l1.2,-0.99l2.24,-0.29l0.17,-0.08l1.95,-1.83l1.3,-0.77l2.09,-2.28l0.07,-0.26l-0.61,-3.34l0.92,-2.3l0.33,-1.44l1.52,-1.79l2.48,-1.27l1.86,-1.16l0.1,-0.11l1.67,-2.93l0.72,-1.59l1.54,0.01l1.43,1.14l0.21,0.06l2.33,-0.19l2.55,0.62l0.97,0.03l0.83,1.6l0.15,1.71l0.86,2.96l0.09,0.14l0.5,0.45l-0.31,0.73l-3.11,0.44l-0.16,0.07l-1.07,0.97l-1.36,0.23l-0.25,0.28l-0.1,1.85l-2.74,1.02l-0.14,0.11l-0.9,1.3l-1.93,0.69l-2.56,0.44l-4.04,2.01l-0.17,0.27l0.02,2.91l-0.08,0.0l-0.3,0.31l0.05,1.15l-1.25,0.07l-0.16,0.06l-0.73,0.55l-0.98,0.0l-0.85,-0.33l-0.15,-0.02l-2.11,0.29l-0.24,0.19l-0.76,1.95l-0.63,0.16l-0.21,0.19l-1.15,3.29l-3.42,2.81l-0.1,0.17l-0.81,3.57l-0.98,1.12l-0.3,0.85l-5.13,0.19Z", "name": "Morocco"}, "UZ": {"path": "M587.83,186.48l0.06,-1.46l-0.19,-0.29l-3.31,-1.24l-2.57,-1.4l-1.63,-1.38l-2.79,-1.98l-1.2,-2.98l-0.12,-0.14l-0.84,-0.54l-0.18,-0.05l-2.61,0.13l-0.76,-0.48l-0.25,-2.25l-0.17,-0.24l-3.37,-1.6l-0.32,0.04l-2.08,1.73l-2.11,1.02l-0.16,0.35l0.31,1.14l-2.14,0.03l-0.09,-10.68l6.1,-1.74l6.25,3.57l2.36,2.72l0.27,0.1l2.92,-0.44l4.17,-0.23l2.78,2.06l-0.18,2.87l0.29,0.32l0.98,0.02l0.46,2.22l0.28,0.24l3.0,0.09l0.61,1.25l0.28,0.17l0.93,-0.02l0.26,-0.16l1.06,-2.06l3.21,-2.03l1.3,-0.5l0.19,0.08l-1.75,1.62l0.05,0.48l1.85,1.12l0.27,0.02l1.65,-0.69l2.4,1.27l-2.69,1.79l-1.79,-0.27l-0.89,0.06l-0.22,-0.52l0.48,-1.26l-0.34,-0.4l-3.35,0.69l-0.22,0.18l-0.78,1.87l-1.07,1.47l-1.93,-0.13l-0.29,0.16l-0.65,1.29l0.16,0.42l1.69,0.64l0.48,1.91l-1.25,2.6l-1.64,-0.53l-1.18,-0.03Z", "name": "Uzbekistan"}, "MM": {"path": "M670.1,233.39l-1.46,1.11l-1.68,0.11l-0.26,0.19l-1.1,2.7l-0.95,0.42l-0.14,0.42l1.21,2.27l1.61,1.92l0.94,1.55l-0.82,1.99l-0.77,0.42l-0.13,0.39l0.64,1.35l1.62,1.97l0.26,1.32l-0.04,1.15l0.02,0.13l0.92,2.18l-1.3,2.23l-0.79,1.69l-0.1,-0.77l0.74,-1.87l-0.02,-0.26l-0.8,-1.42l0.2,-2.68l-0.06,-0.2l-0.98,-1.27l-0.8,-2.98l-0.45,-3.22l-1.11,-2.22l-0.45,-0.1l-1.64,1.28l-2.74,1.76l-1.26,-0.2l-1.27,-0.49l0.79,-2.93l0.0,-0.14l-0.52,-2.42l-1.93,-2.97l0.26,-0.8l-0.22,-0.39l-1.37,-0.31l-1.65,-1.98l-0.12,-1.5l0.41,0.19l0.42,-0.26l0.05,-1.7l1.08,-0.54l0.16,-0.34l-0.24,-1.0l0.5,-0.79l0.05,-0.15l0.08,-2.35l1.58,0.49l0.36,-0.15l1.12,-2.19l0.15,-1.34l1.35,-2.18l0.04,-0.17l-0.07,-1.35l2.97,-1.71l1.67,0.45l0.38,-0.33l-0.18,-1.46l0.7,-0.4l0.15,-0.32l-0.13,-0.72l0.94,-0.13l0.74,1.41l0.11,0.12l0.95,0.56l0.07,1.89l-0.09,2.08l-2.28,2.15l-0.09,0.19l-0.3,3.15l0.35,0.32l2.37,-0.39l0.53,2.17l0.2,0.21l1.3,0.42l-0.63,1.9l0.14,0.36l1.86,0.99l1.1,0.49l0.24,0.0l1.45,-0.6l0.04,0.51l-2.01,1.6l-0.56,0.96l-1.34,0.56Z", "name": "Myanmar"}, "ML": {"path": "M390.79,248.2l0.67,-0.37l0.14,-0.18l0.36,-1.31l0.51,-0.04l1.68,0.69l0.21,0.0l1.34,-0.48l0.89,0.16l0.3,-0.13l0.29,-0.44l9.89,-0.04l0.29,-0.21l0.56,-1.8l-0.11,-0.33l-0.33,-0.24l-2.37,-22.1l3.41,-0.04l8.37,5.73l8.38,5.68l0.56,1.15l0.14,0.14l1.56,0.75l0.99,0.36l0.03,1.45l0.33,0.29l2.45,-0.22l0.01,5.52l-1.3,1.64l-0.06,0.15l-0.18,1.37l-1.99,0.36l-3.4,0.22l-0.19,0.09l-0.85,0.83l-1.48,0.09l-1.49,0.01l-0.54,-0.43l-0.26,-0.05l-1.38,0.36l-2.39,1.08l-0.13,0.12l-0.44,0.73l-1.88,1.11l-0.11,0.12l-0.3,0.57l-0.86,0.42l-1.1,-0.31l-0.28,0.07l-0.69,0.62l-0.09,0.16l-0.35,1.66l-1.93,2.04l-0.08,0.23l0.05,0.76l-0.63,0.99l-0.04,0.19l0.14,1.23l-0.81,0.29l-0.32,0.17l-0.27,-0.75l-0.39,-0.18l-0.65,0.26l-0.36,-0.04l-0.29,0.14l-0.37,0.6l-1.69,-0.02l-0.63,-0.34l-0.32,0.02l-0.12,0.09l-0.47,-0.45l0.1,-0.6l-0.09,-0.27l-0.31,-0.3l-0.33,-0.05l-0.05,0.02l0.02,-0.21l0.46,-0.59l-0.02,-0.39l-0.99,-1.02l-0.34,-0.74l-0.56,-0.56l-0.17,-0.09l-0.5,-0.07l-0.19,0.04l-0.58,0.35l-0.79,0.33l-0.65,0.51l-0.85,-0.16l-0.63,-0.59l-0.14,-0.07l-0.41,-0.08l-0.2,0.03l-0.59,0.31l-0.07,0.0l-0.1,-0.63l0.11,-0.85l-0.21,-0.98l-0.11,-0.17l-0.86,-0.66l-0.45,-1.34l-0.1,-1.36Z", "name": "Mali"}, "MN": {"path": "M641.06,150.59l2.41,-0.53l4.76,-2.8l3.67,-1.49l2.06,0.96l0.12,0.03l2.5,0.05l1.59,1.45l0.19,0.08l2.47,0.12l3.59,0.81l0.27,-0.07l2.43,-2.28l0.06,-0.36l-0.93,-1.77l2.33,-3.1l2.66,1.3l2.26,0.39l2.75,0.8l0.44,2.3l0.19,0.22l3.56,1.38l0.18,0.01l2.35,-0.6l3.1,-0.42l2.4,0.41l2.37,1.52l1.49,1.63l0.23,0.1l2.29,-0.03l3.13,0.52l0.15,-0.01l2.28,-0.79l3.27,-0.53l0.11,-0.04l3.56,-2.23l1.31,0.31l1.26,1.05l0.22,0.07l2.45,-0.22l-0.98,1.96l-1.77,3.21l-0.01,0.28l0.64,1.31l0.35,0.16l1.35,-0.38l2.4,0.48l0.22,-0.04l1.78,-1.09l1.82,0.92l2.11,2.07l-0.17,0.68l-1.79,-0.31l-3.74,0.45l-1.85,0.96l-1.78,2.01l-3.74,1.18l-2.46,1.61l-2.45,-0.6l-1.42,-0.28l-0.31,0.13l-1.31,1.99l0.0,0.33l0.78,1.15l0.3,0.74l-1.58,0.93l-1.75,1.59l-2.83,1.03l-3.77,0.12l-4.05,1.05l-2.81,1.54l-0.95,-0.8l-0.19,-0.07l-2.96,0.0l-3.64,-1.8l-2.55,-0.48l-3.38,0.41l-5.13,-0.67l-2.66,0.06l-1.35,-1.65l-1.12,-2.78l-0.21,-0.18l-1.5,-0.33l-2.98,-1.89l-0.12,-0.04l-3.37,-0.43l-2.84,-0.51l-0.75,-1.13l0.93,-3.54l-0.04,-0.24l-1.73,-2.55l-0.15,-0.12l-3.52,-1.18l-1.99,-1.61l-0.54,-1.85Z", "name": "Mongolia"}, "MK": {"path": "M472.73,173.87l0.08,0.01l0.32,-0.25l0.08,-0.44l1.29,-0.41l1.37,-0.28l1.03,-0.04l1.06,0.82l0.14,1.59l-0.22,0.04l-0.17,0.11l-0.32,0.4l-1.2,-0.05l-0.18,0.05l-0.9,0.61l-1.45,0.23l-0.85,-0.59l-0.3,-1.09l0.22,-0.71Z", "name": "Macedonia"}, "MW": {"path": "M507.18,313.84l-0.67,1.85l-0.01,0.16l0.7,3.31l0.31,0.24l0.75,-0.03l0.78,0.71l0.99,1.75l0.2,3.03l-0.91,0.45l-0.14,0.15l-0.59,1.38l-1.24,-1.21l-0.17,-1.62l0.49,-1.12l0.02,-0.16l-0.15,-1.03l-0.13,-0.21l-0.99,-0.65l-0.26,-0.03l-0.53,0.18l-1.31,-1.12l-1.15,-0.59l0.66,-2.06l0.75,-0.84l0.07,-0.27l-0.47,-2.04l0.48,-1.94l0.4,-0.65l0.03,-0.24l-0.64,-2.15l-0.08,-0.13l-0.44,-0.42l1.34,0.26l1.25,1.73l0.67,3.3Z", "name": "Malawi"}, "MR": {"path": "M390.54,247.66l-1.48,-1.58l-1.51,-1.88l-0.12,-0.09l-1.64,-0.67l-1.17,-0.74l-0.17,-0.05l-1.4,0.03l-0.12,0.03l-1.14,0.52l-1.15,-0.21l-0.26,0.08l-0.44,0.43l-0.11,-0.72l0.68,-1.29l0.31,-2.43l-0.28,-2.63l-0.29,-1.27l0.24,-1.24l-0.03,-0.2l-0.65,-1.24l-1.19,-1.05l0.32,-0.51l9.64,0.02l0.3,-0.34l-0.46,-3.71l0.51,-1.12l2.17,-0.22l0.27,-0.3l-0.08,-6.5l7.91,0.13l0.31,-0.3l0.01,-3.5l8.17,5.63l-2.89,0.04l-0.29,0.33l2.42,22.56l0.12,0.21l0.26,0.19l-0.43,1.38l-9.83,0.04l-0.25,0.13l-0.27,0.41l-0.77,-0.14l-0.15,0.01l-1.3,0.47l-1.64,-0.67l-0.14,-0.02l-0.79,0.06l-0.27,0.22l-0.39,1.39l-0.53,0.29Z", "name": "Mauritania"}, "UG": {"path": "M500.74,287.17l-2.84,-0.02l-0.92,0.32l-1.37,0.71l-0.29,-0.12l0.02,-1.6l0.54,-0.89l0.04,-0.13l0.14,-1.96l0.49,-1.09l0.91,-1.24l0.97,-0.68l0.8,-0.89l-0.13,-0.49l-0.79,-0.27l0.13,-2.55l0.78,-0.52l1.45,0.51l0.18,0.01l1.97,-0.57l1.72,0.01l0.18,-0.06l1.29,-0.97l0.98,1.44l0.29,1.24l1.05,2.75l-0.84,1.68l-1.94,2.66l-0.06,0.18l0.02,2.36l-4.8,0.18Z", "name": "Uganda"}, "MY": {"path": "M717.6,273.52l-1.51,0.7l-2.13,-0.41l-2.88,-0.0l-0.29,0.21l-0.84,2.77l-0.9,0.82l-0.08,0.12l-1.23,3.34l-1.81,0.47l-2.29,-0.68l-0.14,-0.01l-1.2,0.22l-0.14,0.07l-1.36,1.18l-1.47,-0.17l-0.12,0.01l-1.46,0.46l-1.51,-1.25l-0.24,-0.97l1.26,0.59l0.2,0.02l1.93,-0.47l0.22,-0.22l0.47,-1.98l0.9,-0.4l2.97,-0.54l0.17,-0.09l1.8,-1.98l1.02,-1.32l0.9,1.03l0.48,-0.04l0.43,-0.7l1.02,0.07l0.32,-0.27l0.25,-2.72l1.84,-1.67l1.23,-1.89l0.73,-0.01l1.12,1.11l0.1,0.99l0.18,0.24l1.66,0.71l1.85,0.67l-0.09,0.51l-1.45,0.11l-0.26,0.4l0.35,0.97ZM673.78,269.53l0.17,1.14l0.35,0.25l1.65,-0.3l0.18,-0.11l0.68,-0.86l0.31,0.13l1.41,1.45l0.99,1.59l0.13,1.57l-0.26,1.09l0.0,0.15l0.24,0.84l0.18,1.46l0.11,0.2l0.82,0.64l0.92,2.08l-0.03,0.52l-1.4,0.13l-2.29,-1.79l-2.86,-1.92l-0.27,-1.16l-0.07,-0.13l-1.39,-1.61l-0.33,-1.99l-0.05,-0.12l-0.84,-1.27l0.26,-1.72l-0.03,-0.18l-0.45,-0.87l0.13,-0.13l1.71,0.92Z", "name": "Malaysia"}, "MX": {"path": "M133.41,213.83l0.61,0.09l0.27,-0.09l0.93,-1.01l0.08,-0.18l0.09,-1.22l-0.09,-0.23l-1.93,-1.94l-1.46,-0.77l-2.96,-5.62l-0.86,-2.1l2.44,-0.18l2.68,-0.25l-0.03,0.08l0.17,0.4l3.79,1.35l5.81,1.97l6.96,-0.02l0.3,-0.3l0.0,-0.84l3.91,0.0l0.87,0.93l1.27,0.87l1.44,1.17l0.79,1.37l0.62,1.49l0.12,0.14l1.35,0.85l2.08,0.82l0.35,-0.1l1.49,-2.04l1.81,-0.05l1.63,1.01l1.21,1.8l0.86,1.58l1.47,1.55l0.53,1.82l0.73,1.32l0.14,0.13l1.98,0.84l1.78,0.59l0.61,-0.03l-0.78,1.89l-0.45,1.96l-0.19,3.58l-0.24,1.27l0.01,0.14l0.43,1.43l0.78,1.31l0.49,1.98l0.06,0.12l1.63,1.9l0.61,1.51l0.98,1.28l0.16,0.11l2.58,0.67l0.98,1.02l0.31,0.08l2.17,-0.71l1.91,-0.26l1.87,-0.47l1.67,-0.49l1.59,-1.06l0.11,-0.14l0.6,-1.52l0.22,-2.21l0.35,-0.62l1.58,-0.64l2.59,-0.59l2.18,0.09l1.43,-0.2l0.39,0.36l-0.07,1.02l-1.28,1.48l-0.65,1.68l0.07,0.32l0.33,0.32l-0.79,2.49l-0.28,-0.3l-0.24,-0.09l-1.0,0.08l-0.24,0.15l-0.74,1.28l-0.19,-0.13l-0.28,-0.03l-0.3,0.12l-0.19,0.29l0.0,0.06l-4.34,-0.02l-0.3,0.3l-0.0,1.16l-0.83,0.0l-0.28,0.19l0.08,0.33l0.93,0.86l0.9,0.58l0.24,0.48l0.16,0.15l0.2,0.08l-0.03,0.38l-2.94,0.01l-0.26,0.15l-1.21,2.09l0.02,0.33l0.25,0.33l-0.21,0.44l-0.04,0.22l-2.42,-2.35l-1.36,-0.87l-2.04,-0.67l-0.13,-0.01l-1.4,0.19l-2.07,0.98l-1.14,0.23l-1.72,-0.66l-1.85,-0.48l-2.31,-1.16l-1.92,-0.38l-2.79,-1.18l-2.04,-1.2l-0.6,-0.66l-0.19,-0.1l-1.37,-0.15l-2.45,-0.78l-1.07,-1.18l-2.63,-1.44l-1.2,-1.56l-0.44,-0.93l0.5,-0.15l0.2,-0.39l-0.2,-0.58l0.46,-0.55l0.07,-0.19l0.01,-0.91l-0.06,-0.18l-0.81,-1.13l-0.25,-1.08l-0.86,-1.36l-2.21,-2.63l-2.53,-2.09l-1.2,-1.63l-0.11,-0.09l-2.08,-1.06l-0.34,-0.48l0.35,-1.53l-0.16,-0.34l-1.24,-0.61l-1.39,-1.23l-0.6,-1.81l-0.24,-0.2l-1.25,-0.2l-1.38,-1.35l-1.11,-1.25l-0.1,-0.76l-0.05,-0.13l-1.33,-2.04l-0.85,-2.02l0.04,-0.99l-0.14,-0.27l-1.81,-1.1l-0.2,-0.04l-0.74,0.11l-1.34,-0.72l-0.42,0.16l-0.4,1.12l-0.0,0.19l0.41,1.3l0.24,2.04l0.06,0.15l0.88,1.16l1.84,1.86l0.4,0.61l0.12,0.1l0.27,0.14l0.29,0.82l0.31,0.2l0.2,-0.02l0.43,1.51l0.09,0.14l0.72,0.65l0.51,0.91l1.58,1.4l0.8,2.42l0.77,1.23l0.66,1.19l0.13,1.34l0.28,0.27l1.08,0.08l0.92,1.1l0.83,1.08l-0.03,0.24l-0.88,0.81l-0.13,-0.0l-0.59,-1.42l-0.07,-0.11l-1.67,-1.53l-1.81,-1.28l-1.15,-0.61l0.07,-1.85l-0.38,-1.45l-0.12,-0.17l-2.91,-2.03l-0.39,0.04l-0.11,0.11l-0.42,-0.46l-0.11,-0.08l-1.49,-0.63l-1.09,-1.16Z", "name": "Mexico"}, "VU": {"path": "M839.92,325.66l0.78,0.73l-0.18,0.07l-0.6,-0.8ZM839.13,322.74l0.27,1.36l-0.13,-0.06l-0.21,-0.02l-0.29,0.08l-0.22,-0.43l-0.03,-1.32l0.61,0.4Z", "name": "Vanuatu"}, "FR": {"path": "M444.58,172.63l-0.68,1.92l-0.72,-0.38l-0.51,-1.79l0.43,-0.95l1.15,-0.83l0.33,2.04ZM429.71,147.03l1.77,1.57l0.26,0.07l1.16,-0.23l2.12,1.44l0.56,0.28l0.16,0.03l0.61,-0.06l1.09,0.78l0.13,0.05l3.18,0.53l-1.09,1.94l-0.3,2.16l-0.48,0.38l-1.0,-0.26l-0.37,0.32l0.07,0.66l-1.73,1.68l-0.09,0.21l-0.04,1.42l0.41,0.29l0.96,-0.4l0.67,1.07l-0.09,0.78l0.04,0.19l0.61,0.97l-0.71,0.78l-0.07,0.28l0.65,2.39l0.21,0.21l1.09,0.31l-0.2,0.95l-2.08,1.58l-4.81,-0.8l-0.13,0.01l-3.65,0.99l-0.22,0.24l-0.25,1.6l-2.59,0.35l-2.74,-1.33l-0.31,0.03l-0.79,0.57l-4.38,-1.31l-0.79,-0.94l1.16,-1.64l0.05,-0.15l0.48,-6.17l-0.06,-0.21l-2.58,-3.3l-1.89,-1.65l-0.11,-0.06l-3.64,-1.17l-0.2,-1.88l2.92,-0.63l4.14,0.82l0.35,-0.36l-0.65,-3.0l1.77,1.05l0.27,0.02l5.83,-2.54l0.17,-0.19l0.71,-2.54l1.75,-0.53l0.27,0.88l0.27,0.21l1.04,0.05l1.08,1.23ZM289.1,278.45l-0.85,0.84l-0.88,0.13l-0.25,-0.51l-0.21,-0.16l-0.56,-0.1l-0.25,0.07l-0.63,0.55l-0.62,-0.29l0.5,-0.88l0.21,-1.11l0.42,-1.05l-0.03,-0.28l-0.93,-1.42l-0.18,-1.54l1.13,-1.87l2.42,0.78l2.55,2.04l0.33,0.81l-1.4,2.16l-0.77,1.84Z", "name": "France"}, "FI": {"path": "M492.26,76.42l-0.38,3.12l0.12,0.28l3.6,2.69l-2.14,2.96l-0.01,0.33l2.83,4.61l-1.61,3.36l0.03,0.31l2.15,2.87l-0.96,2.44l0.1,0.35l3.51,2.55l-0.81,1.72l-2.28,2.19l-5.28,4.79l-4.51,0.31l-4.39,1.37l-3.87,0.75l-1.34,-1.89l-0.11,-0.09l-2.23,-1.14l0.53,-3.54l-0.01,-0.14l-1.17,-3.37l1.12,-2.13l2.23,-2.44l5.69,-4.33l1.65,-0.84l0.16,-0.31l-0.26,-1.73l-0.15,-0.22l-3.4,-1.91l-0.77,-1.47l-0.07,-6.45l-0.12,-0.24l-3.91,-2.94l-3.0,-1.92l0.97,-0.76l2.6,2.17l0.21,0.07l3.2,-0.21l2.63,1.03l0.3,-0.05l2.39,-1.94l0.09,-0.13l1.18,-3.12l3.63,-1.42l2.87,1.59l-0.98,2.87Z", "name": "Finland"}, "FJ": {"path": "M869.98,327.07l-1.31,0.44l-0.14,-0.41l0.96,-0.41l0.85,-0.17l1.43,-0.78l-0.16,0.65l-1.64,0.67ZM867.58,329.12l0.54,0.47l-0.31,1.0l-1.32,0.3l-1.13,-0.26l-0.17,-0.78l0.72,-0.66l0.98,0.27l0.25,-0.04l0.43,-0.29Z", "name": "Fiji"}, "FK": {"path": "M268.15,427.89l2.6,-1.73l1.98,0.77l0.31,-0.05l1.32,-1.17l1.58,1.18l-0.54,0.84l-3.1,0.92l-1.0,-1.04l-0.39,-0.04l-1.9,1.35l-0.86,-1.04Z", "name": "Falkland Islands"}, "NI": {"path": "M202.1,252.6l0.23,-0.0l0.12,-0.11l0.68,-0.09l0.22,-0.15l0.23,-0.43l0.2,-0.01l0.28,-0.31l-0.04,-0.97l0.29,-0.03l0.5,0.02l0.25,-0.11l0.37,-0.46l0.51,0.35l0.4,-0.06l0.23,-0.28l0.45,-0.29l0.87,-0.7l0.11,-0.21l0.02,-0.26l0.23,-0.12l0.25,-0.48l0.29,0.27l0.14,0.07l0.5,0.12l0.22,-0.03l0.48,-0.28l0.66,-0.02l0.87,-0.33l0.36,-0.32l0.21,0.01l-0.11,0.48l0.0,0.14l0.22,0.8l-0.54,0.85l-0.27,1.03l-0.09,1.18l0.14,0.72l0.05,0.95l-0.24,0.15l-0.13,0.19l-0.23,1.09l0.0,0.14l0.14,0.53l-0.42,0.53l-0.06,0.24l0.12,0.69l0.08,0.15l0.18,0.19l-0.26,0.23l-0.49,-0.11l-0.35,-0.44l-0.16,-0.1l-0.79,-0.21l-0.23,0.03l-0.45,0.26l-1.51,-0.62l-0.31,0.05l-0.17,0.15l-1.81,-1.62l-0.6,-0.9l-1.04,-0.79l-0.77,-0.71Z", "name": "Nicaragua"}, "NL": {"path": "M436.22,136.65l1.82,0.08l0.36,0.89l-0.6,2.96l-0.53,1.06l-1.32,0.0l-0.3,0.34l0.35,2.89l-0.83,-0.47l-1.56,-1.43l-0.29,-0.07l-2.26,0.67l-1.02,-0.15l0.68,-0.48l0.1,-0.12l2.14,-4.84l3.25,-1.35Z", "name": "Netherlands"}, "NO": {"path": "M491.45,67.31l7.06,3.0l-2.52,0.94l-0.11,0.49l2.43,2.49l-3.82,1.59l-1.48,0.3l0.89,-2.61l-0.14,-0.36l-3.21,-1.78l-0.25,-0.02l-3.89,1.52l-0.17,0.17l-1.2,3.17l-2.19,1.78l-2.53,-0.99l-0.13,-0.02l-3.15,0.21l-2.69,-2.25l-0.38,-0.01l-1.43,1.11l-1.47,0.17l-0.26,0.26l-0.33,2.57l-4.42,-0.65l-0.33,0.22l-0.6,2.19l-2.17,-0.01l-0.27,0.16l-4.15,7.68l-3.88,5.76l-0.0,0.33l0.81,1.23l-0.7,1.27l-2.3,-0.06l-0.28,0.18l-1.63,3.72l-0.02,0.13l0.15,5.17l0.07,0.18l1.51,1.84l-0.79,4.24l-2.04,2.5l-0.92,1.75l-1.39,-1.88l-0.44,-0.05l-4.89,4.21l-3.16,0.81l-3.24,-1.74l-0.86,-3.82l-0.78,-8.6l2.18,-2.36l6.56,-3.28l5.0,-4.16l4.63,-5.74l5.99,-8.09l4.17,-3.23l6.84,-5.49l5.39,-1.92l4.06,0.24l0.23,-0.09l3.72,-3.67l4.51,0.19l4.4,-0.89ZM484.58,19.95l4.42,1.82l-3.25,2.68l-7.14,0.65l-7.16,-0.91l-0.39,-1.37l-0.28,-0.22l-3.48,-0.1l-2.25,-2.15l7.09,-1.48l3.55,1.36l0.28,-0.03l2.42,-1.66l6.18,1.41ZM481.99,33.92l-4.73,1.85l-3.76,-1.06l1.27,-1.02l0.04,-0.43l-1.18,-1.35l4.46,-0.94l0.89,1.83l0.17,0.15l2.83,0.96ZM466.5,23.95l7.64,3.87l-5.63,1.94l-0.19,0.19l-1.35,3.88l-2.08,0.96l-0.16,0.19l-1.14,4.18l-2.71,0.18l-4.94,-2.95l1.95,-1.63l-0.08,-0.51l-3.7,-1.54l-4.79,-4.54l-1.78,-4.01l6.29,-1.88l1.25,1.81l0.25,0.13l3.57,-0.08l0.26,-0.17l0.87,-1.79l3.41,-0.18l3.08,1.94Z", "name": "Norway"}, "NA": {"path": "M461.88,357.98l-1.61,-1.77l-0.94,-1.9l-0.54,-2.58l-0.62,-1.95l-0.83,-4.05l-0.06,-3.13l-0.33,-1.5l-0.07,-0.14l-0.95,-1.06l-1.27,-2.12l-1.3,-3.1l-0.59,-1.71l-1.98,-2.46l-0.13,-1.67l0.99,-0.4l1.44,-0.42l1.48,0.07l1.42,1.11l0.31,0.03l0.32,-0.15l9.99,-0.11l1.66,1.18l0.16,0.06l6.06,0.37l4.69,-1.06l2.01,-0.57l1.5,0.14l0.63,0.37l-1.0,0.41l-0.7,0.01l-0.16,0.05l-1.38,0.88l-0.79,-0.88l-0.29,-0.09l-3.83,0.9l-1.84,0.08l-0.29,0.3l-0.07,8.99l-2.18,0.08l-0.29,0.3l-0.0,17.47l-2.04,1.27l-1.21,0.18l-1.51,-0.49l-0.99,-0.18l-0.36,-1.0l-0.1,-0.14l-0.99,-0.74l-0.4,0.04l-0.98,1.09Z", "name": "Namibia"}, "NC": {"path": "M835.87,338.68l2.06,1.63l1.01,0.94l-0.49,0.32l-1.21,-0.62l-1.76,-1.16l-1.58,-1.36l-1.61,-1.79l-0.16,-0.41l0.54,0.02l1.32,0.83l1.08,0.87l0.79,0.73Z", "name": "New Caledonia"}, "NE": {"path": "M426.67,254.17l0.03,-1.04l-0.24,-0.3l-2.66,-0.53l-0.06,-1.0l-0.07,-0.17l-1.37,-1.62l-0.3,-1.04l0.15,-0.94l1.37,-0.09l0.19,-0.09l0.85,-0.83l3.34,-0.22l2.22,-0.41l0.24,-0.26l0.2,-1.5l1.32,-1.65l0.07,-0.19l-0.01,-5.74l3.4,-1.13l7.24,-5.12l8.46,-4.95l3.76,1.08l1.35,1.39l0.36,0.05l1.39,-0.77l0.55,3.66l0.12,0.2l0.82,0.6l0.03,0.69l0.1,0.21l0.87,0.74l-0.47,0.99l-0.96,5.26l-0.13,3.25l-3.08,2.34l-0.1,0.15l-1.08,3.37l0.08,0.31l0.94,0.86l-0.01,1.51l0.29,0.3l1.25,0.05l-0.14,0.66l-0.51,0.11l-0.24,0.26l-0.06,0.57l-0.04,0.0l-1.59,-2.62l-0.21,-0.14l-0.59,-0.1l-0.23,0.05l-1.83,1.33l-1.79,-0.68l-1.42,-0.17l-0.17,0.03l-0.65,0.32l-1.39,-0.07l-0.19,0.06l-1.4,1.03l-1.12,0.05l-2.97,-1.29l-0.26,0.01l-1.12,0.59l-1.08,-0.04l-0.85,-0.88l-0.11,-0.07l-2.51,-0.95l-0.14,-0.02l-2.69,0.3l-0.16,0.07l-0.65,0.55l-0.1,0.16l-0.34,1.41l-0.69,0.98l-0.05,0.15l-0.13,1.72l-1.47,-1.13l-0.18,-0.06l-0.9,0.01l-0.2,0.08l-0.32,0.28Z", "name": "Niger"}, "NG": {"path": "M442.0,272.7l-2.4,0.83l-0.88,-0.12l-0.19,0.04l-0.89,0.52l-1.78,-0.05l-1.23,-1.44l-0.88,-1.87l-1.77,-1.66l-0.21,-0.08l-3.78,0.03l0.13,-3.75l-0.06,-1.58l0.44,-1.47l0.74,-0.75l1.21,-1.56l0.04,-0.29l-0.22,-0.56l0.44,-0.9l0.01,-0.24l-0.54,-1.44l0.26,-2.97l0.72,-1.06l0.33,-1.37l0.51,-0.43l2.53,-0.28l2.38,0.9l0.89,0.91l0.2,0.09l1.28,0.04l0.15,-0.03l1.06,-0.56l2.9,1.26l0.13,0.02l1.28,-0.06l0.16,-0.06l1.39,-1.02l1.36,0.07l0.15,-0.03l0.64,-0.32l1.22,0.13l1.9,0.73l0.28,-0.04l1.86,-1.35l0.33,0.06l1.62,2.67l0.29,0.14l0.32,-0.04l0.73,0.74l-0.19,0.37l-0.12,0.74l-2.03,1.89l-0.07,0.11l-0.66,1.62l-0.35,1.28l-0.48,0.51l-0.07,0.12l-0.48,1.67l-1.26,0.98l-0.1,0.15l-0.38,1.24l-0.58,1.07l-0.2,0.91l-1.43,0.7l-1.26,-0.93l-0.19,-0.06l-0.95,0.04l-0.2,0.09l-1.41,1.39l-0.61,0.02l-0.26,0.17l-1.19,2.42l-0.61,1.67Z", "name": "Nigeria"}, "NZ": {"path": "M857.9,379.62l1.85,3.1l0.33,0.14l0.22,-0.28l0.04,-1.41l0.57,0.4l0.35,2.06l0.17,0.22l2.02,0.94l1.78,0.26l0.22,-0.06l1.31,-1.01l0.84,0.22l-0.53,2.27l-0.67,1.5l-1.71,-0.05l-0.25,0.12l-0.67,0.89l-0.05,0.23l0.21,1.15l-0.31,0.46l-2.15,3.57l-1.6,0.99l-0.28,-0.51l-0.15,-0.13l-0.72,-0.3l1.27,-2.15l0.01,-0.29l-0.82,-1.63l-0.15,-0.14l-2.5,-1.09l0.05,-0.69l1.67,-0.94l0.15,-0.21l0.42,-2.24l-0.11,-1.95l-0.03,-0.12l-0.97,-1.85l0.05,-0.41l-0.09,-0.25l-1.18,-1.17l-1.94,-2.49l-0.86,-1.64l0.38,-0.09l1.24,1.43l0.12,0.08l1.81,0.68l0.67,2.39ZM853.93,393.55l0.57,1.24l0.44,0.12l1.51,-1.03l0.52,0.91l0.0,1.09l-0.88,1.31l-1.62,2.2l-1.26,1.2l-0.05,0.38l0.64,1.02l-1.4,0.03l-0.14,0.04l-2.14,1.16l-0.14,0.17l-0.67,2.0l-1.38,3.06l-3.07,2.19l-2.12,-0.06l-1.55,-0.99l-0.14,-0.05l-2.53,-0.2l-0.31,-0.84l1.25,-2.15l3.07,-2.97l1.62,-0.59l1.81,-1.17l2.18,-1.63l1.55,-1.65l1.08,-2.18l0.9,-0.72l0.11,-0.17l0.35,-1.56l1.37,-1.07l0.4,0.91Z", "name": "New Zealand"}, "NP": {"path": "M641.26,213.53l-0.14,0.95l0.32,1.64l-0.21,0.78l-1.83,0.04l-2.98,-0.62l-1.86,-0.25l-1.37,-1.3l-0.18,-0.08l-3.38,-0.34l-3.21,-1.49l-2.38,-1.34l-2.16,-0.92l0.84,-2.2l1.51,-1.18l0.89,-0.57l1.83,0.77l2.5,1.76l1.39,0.41l0.78,1.21l0.17,0.13l1.91,0.53l2.0,1.17l2.92,0.66l2.63,0.24Z", "name": "Nepal"}, "CI": {"path": "M413.53,272.08l-0.83,0.02l-1.79,-0.49l-1.64,0.03l-3.04,0.46l-1.73,0.72l-2.4,0.89l-0.12,-0.02l0.16,-1.7l0.19,-0.25l0.06,-0.2l-0.08,-0.99l-0.09,-0.19l-1.06,-1.05l-0.15,-0.08l-0.71,-0.15l-0.51,-0.48l0.45,-0.92l0.02,-0.19l-0.24,-1.16l0.07,-0.43l0.14,-0.0l0.3,-0.26l0.15,-1.1l-0.02,-0.15l-0.13,-0.34l0.09,-0.13l0.83,-0.27l0.19,-0.37l-0.62,-2.02l-0.55,-1.0l0.14,-0.59l0.35,-0.14l0.24,-0.16l0.53,0.29l0.14,0.04l1.93,0.02l0.26,-0.14l0.36,-0.58l0.39,0.01l0.43,-0.17l0.28,0.79l0.43,0.16l0.56,-0.31l0.89,-0.32l0.92,0.45l0.39,0.75l0.14,0.13l1.13,0.53l0.3,-0.03l0.81,-0.59l1.02,-0.08l1.49,0.57l0.62,3.33l-1.03,2.09l-0.65,2.84l0.02,0.2l1.05,2.08l-0.07,0.64Z", "name": "Ivory Coast"}, "CH": {"path": "M444.71,156.27l0.05,0.3l-0.34,0.69l0.13,0.4l1.13,0.58l1.07,0.1l-0.12,0.81l-0.87,0.42l-1.75,-0.37l-0.34,0.18l-0.47,1.1l-0.86,0.07l-0.33,-0.38l-0.41,-0.04l-1.34,1.01l-1.02,0.13l-0.93,-0.58l-0.82,-1.32l-0.37,-0.12l-0.77,0.32l0.02,-0.84l1.74,-1.69l0.09,-0.25l-0.04,-0.38l0.73,0.19l0.26,-0.06l0.6,-0.48l2.02,0.02l0.24,-0.12l0.38,-0.51l2.31,0.84Z", "name": "Switzerland"}, "CO": {"path": "M232.24,284.95l-0.94,-0.52l-1.22,-0.82l-0.31,-0.01l-0.62,0.35l-1.88,-0.31l-0.54,-0.95l-0.29,-0.15l-0.37,0.03l-2.34,-1.33l-0.15,-0.35l0.57,-0.11l0.24,-0.32l-0.1,-1.15l0.46,-0.71l1.11,-0.15l0.21,-0.13l1.05,-1.57l0.95,-1.31l-0.08,-0.43l-0.73,-0.47l0.4,-1.24l0.01,-0.16l-0.53,-2.15l0.44,-0.54l0.06,-0.24l-0.4,-2.13l-0.06,-0.13l-0.93,-1.22l0.21,-0.8l0.52,0.12l0.32,-0.13l0.47,-0.75l0.03,-0.27l-0.52,-1.32l0.09,-0.11l1.14,0.07l0.22,-0.08l1.82,-1.71l0.96,-0.25l0.22,-0.28l0.02,-0.81l0.43,-2.01l1.28,-1.04l1.48,-0.05l0.27,-0.19l0.12,-0.31l1.73,0.19l0.2,-0.05l1.96,-1.28l0.97,-0.56l1.16,-1.16l0.64,0.11l0.43,0.44l-0.31,0.55l-1.49,0.39l-0.19,0.16l-0.6,1.2l-0.97,0.74l-0.73,0.94l-0.06,0.13l-0.3,1.76l-0.68,1.44l0.23,0.43l1.1,0.14l0.27,0.97l0.08,0.13l0.49,0.49l0.17,0.85l-0.27,0.86l-0.01,0.14l0.09,0.53l0.2,0.23l0.52,0.18l0.54,0.79l0.27,0.13l3.18,-0.24l1.31,0.29l1.7,2.08l0.31,0.1l0.96,-0.26l1.75,0.13l1.41,-0.27l0.56,0.27l-0.36,1.07l-0.54,0.81l-0.05,0.13l-0.2,1.8l0.51,1.79l0.07,0.12l0.65,0.68l0.05,0.32l-1.16,1.14l0.05,0.47l0.86,0.52l0.6,0.79l0.31,1.01l-0.7,-0.81l-0.44,-0.01l-0.74,0.77l-4.75,-0.05l-0.3,0.31l0.03,1.57l0.25,0.29l1.2,0.21l-0.02,0.24l-0.1,-0.05l-0.22,-0.02l-1.41,0.41l-0.22,0.29l-0.01,1.82l0.11,0.23l1.04,0.85l0.35,1.3l-0.06,1.02l-1.02,6.26l-0.84,-0.89l-0.19,-0.09l-0.25,-0.02l1.35,-2.13l-0.1,-0.42l-1.92,-1.17l-0.2,-0.04l-1.41,0.2l-0.82,-0.39l-0.26,0.0l-1.29,0.62l-1.63,-0.27l-1.4,-2.5l-0.12,-0.12l-1.1,-0.61l-0.83,-1.2l-1.67,-1.19l-0.27,-0.04l-0.54,0.19Z", "name": "Colombia"}, "CN": {"path": "M740.32,148.94l0.22,0.21l4.3,1.03l2.84,2.2l0.99,2.92l0.28,0.2l3.8,0.0l0.15,-0.04l2.13,-1.24l3.5,-0.8l-1.05,2.29l-0.95,1.13l-0.06,0.12l-0.85,3.41l-1.56,2.81l-2.83,-0.51l-0.19,0.03l-2.15,1.09l-0.15,0.34l0.65,2.59l-0.33,3.3l-1.03,0.07l-0.28,0.3l0.01,0.75l-1.09,-1.2l-0.48,0.05l-0.94,1.6l-3.76,1.26l-0.2,0.36l0.29,1.19l-1.67,-0.08l-1.11,-0.88l-0.42,0.05l-1.69,2.08l-2.71,1.57l-2.04,1.88l-3.42,0.84l-0.11,0.05l-1.8,1.34l-1.54,0.46l0.52,-0.53l0.06,-0.33l-0.44,-0.96l1.84,-1.84l0.02,-0.41l-1.32,-1.56l-0.36,-0.08l-2.23,1.08l-2.83,2.06l-1.52,1.85l-2.32,0.13l-0.2,0.09l-1.28,1.37l-0.03,0.37l1.32,1.97l0.18,0.13l1.83,0.43l0.07,1.08l0.18,0.26l1.98,0.84l0.3,-0.03l2.66,-1.96l2.06,1.04l0.12,0.03l1.4,0.07l0.27,1.0l-3.24,0.73l-0.17,0.11l-1.13,1.5l-2.38,1.4l-0.1,0.1l-1.29,1.99l0.1,0.42l2.6,1.5l0.97,2.72l1.52,2.56l1.66,2.08l-0.03,1.76l-1.4,0.67l-0.15,0.38l0.6,1.47l0.13,0.15l1.29,0.75l-0.35,2.0l-0.58,1.96l-1.22,0.21l-0.2,0.14l-1.83,2.93l-2.02,3.51l-2.29,3.13l-3.4,2.42l-3.42,2.18l-2.75,0.3l-0.15,0.06l-1.32,1.01l-0.68,-0.67l-0.41,-0.01l-1.37,1.27l-3.42,1.28l-2.62,0.4l-0.24,0.21l-0.8,2.57l-0.95,0.11l-0.53,-1.54l0.52,-0.89l-0.19,-0.44l-3.36,-0.84l-0.17,0.01l-1.09,0.4l-2.36,-0.64l-1.0,-0.9l0.35,-1.34l-0.23,-0.37l-2.22,-0.47l-1.15,-0.94l-0.36,-0.02l-2.08,1.37l-2.35,0.29l-1.98,-0.01l-0.13,0.03l-1.32,0.63l-1.28,0.38l-0.21,0.33l0.33,2.65l-0.78,-0.04l-0.14,-0.39l-0.07,-1.04l-0.41,-0.26l-1.72,0.71l-0.96,-0.43l-1.63,-0.86l0.65,-1.95l-0.19,-0.38l-1.43,-0.46l-0.56,-2.27l-0.34,-0.22l-2.26,0.38l0.25,-2.65l2.29,-2.15l0.09,-0.2l0.1,-2.21l-0.07,-2.09l-0.15,-0.25l-1.02,-0.6l-0.8,-1.52l-0.31,-0.16l-1.42,0.2l-2.16,-0.32l0.55,-0.74l0.01,-0.35l-1.17,-1.7l-0.41,-0.08l-1.67,1.07l-1.97,-0.63l-0.25,0.03l-2.89,1.73l-2.26,1.99l-1.82,0.3l-1.0,-0.66l-0.15,-0.05l-1.28,-0.06l-1.75,-0.61l-0.24,0.02l-1.35,0.69l-0.1,0.08l-1.2,1.45l-0.14,-1.41l-0.4,-0.25l-1.46,0.55l-2.83,-0.26l-2.77,-0.61l-1.99,-1.17l-1.91,-0.54l-0.78,-1.21l-0.17,-0.13l-1.36,-0.38l-2.54,-1.79l-2.01,-0.84l-0.28,0.02l-0.89,0.56l-3.31,-1.83l-2.35,-1.67l-0.57,-2.49l1.34,0.28l0.36,-0.28l0.08,-1.42l-0.05,-0.19l-0.93,-1.34l0.24,-2.18l-0.07,-0.22l-2.69,-3.32l-0.15,-0.1l-3.97,-1.11l-0.69,-2.05l-0.11,-0.15l-1.79,-1.3l-0.39,-0.73l-0.36,-1.57l0.08,-1.09l-0.18,-0.3l-1.52,-0.66l-0.22,-0.01l-0.51,0.18l-0.52,-2.21l0.59,-0.55l0.06,-0.35l-0.22,-0.44l2.12,-1.24l1.63,-0.55l2.58,0.39l0.31,-0.16l0.87,-1.75l3.05,-0.34l0.21,-0.12l0.84,-1.12l3.87,-1.59l0.15,-0.14l0.35,-0.68l0.03,-0.17l-0.17,-1.51l1.52,-0.7l0.15,-0.39l-2.12,-5.0l4.62,-1.15l1.35,-0.72l0.14,-0.17l1.72,-5.37l4.7,0.99l0.28,-0.08l1.39,-1.43l0.08,-0.2l0.11,-2.95l1.83,-0.26l0.18,-0.1l1.85,-2.08l0.61,-0.17l0.57,1.97l0.1,0.15l2.2,1.75l3.48,1.17l1.59,2.36l-0.93,3.53l0.04,0.24l0.9,1.35l0.2,0.13l2.98,0.53l3.32,0.43l2.97,1.89l1.49,0.35l1.08,2.67l1.52,1.88l0.24,0.11l2.74,-0.07l5.15,0.67l3.36,-0.41l2.39,0.43l3.67,1.81l0.13,0.03l2.92,-0.0l1.02,0.86l0.34,0.03l2.88,-1.59l3.98,-1.03l3.81,-0.13l3.02,-1.12l1.77,-1.61l1.73,-1.01l0.13,-0.37l-0.41,-1.01l-0.72,-1.07l1.09,-1.66l1.21,0.24l2.57,0.63l0.24,-0.04l2.46,-1.62l3.78,-1.19l0.13,-0.09l1.8,-2.03l1.66,-0.84l3.54,-0.41l1.93,0.35l0.34,-0.22l0.27,-1.12l-0.08,-0.29l-2.27,-2.22l-2.08,-1.07l-0.29,0.01l-1.82,1.12l-2.36,-0.47l-0.14,0.01l-1.18,0.34l-0.46,-0.94l1.69,-3.08l1.1,-2.21l2.75,1.12l0.26,-0.02l3.53,-2.06l0.15,-0.26l-0.02,-1.35l2.18,-3.39l1.35,-1.04l0.12,-0.24l-0.03,-1.85l-0.15,-0.25l-1.0,-0.58l1.68,-1.37l3.01,-0.59l3.25,-0.09l3.67,0.99l2.08,1.18l1.51,3.3l0.95,1.45l0.85,1.99l0.92,3.19ZM697.0,237.37l-1.95,1.12l-1.74,-0.68l-0.06,-1.9l1.08,-1.03l2.62,-0.7l1.23,0.05l0.37,0.65l-1.01,1.08l-0.54,1.4Z", "name": "China"}, "CM": {"path": "M453.76,278.92l-0.26,-0.11l-0.18,-0.02l-1.42,0.31l-1.56,-0.33l-1.17,0.16l-3.7,-0.05l0.3,-1.63l-0.04,-0.21l-0.98,-1.66l-0.15,-0.13l-1.03,-0.38l-0.46,-1.01l-0.13,-0.14l-0.48,-0.27l0.02,-0.46l0.62,-1.72l1.1,-2.25l0.54,-0.02l0.2,-0.09l1.41,-1.39l0.73,-0.03l1.32,0.97l0.31,0.03l1.72,-0.85l0.16,-0.2l0.22,-1.0l0.57,-1.03l0.36,-1.18l1.26,-0.98l0.1,-0.15l0.49,-1.7l0.48,-0.51l0.07,-0.13l0.35,-1.3l0.63,-1.54l2.06,-1.92l0.09,-0.17l0.12,-0.79l0.24,-0.41l-0.04,-0.36l-0.89,-0.91l0.04,-0.45l0.28,-0.06l0.85,1.39l0.16,1.59l-0.09,1.66l0.04,0.17l1.09,1.84l-0.86,-0.02l-0.72,0.17l-1.07,-0.24l-0.34,0.17l-0.54,1.19l0.06,0.34l1.48,1.47l1.06,0.44l0.32,0.94l0.73,1.6l-0.32,0.57l-1.23,2.49l-0.54,0.41l-0.12,0.21l-0.19,1.95l0.24,1.08l-0.18,0.67l0.07,0.28l1.13,1.25l0.24,0.93l0.92,1.29l1.1,0.8l0.1,1.01l0.26,0.73l-0.12,0.93l-1.65,-0.49l-2.02,-0.66l-3.19,-0.11Z", "name": "Cameroon"}, "CL": {"path": "M246.8,429.1l-1.14,0.78l-2.25,1.21l-0.16,0.23l-0.37,2.94l-0.75,0.06l-2.72,-1.07l-2.83,-2.34l-3.06,-1.9l-0.71,-1.92l0.67,-1.84l-0.02,-0.25l-1.22,-2.13l-0.31,-5.41l1.02,-2.95l2.59,-2.4l-0.13,-0.51l-3.32,-0.8l2.06,-2.4l0.07,-0.15l0.79,-4.77l2.44,0.95l0.4,-0.22l1.31,-6.31l-0.16,-0.33l-1.68,-0.8l-0.42,0.21l-0.72,3.47l-1.01,-0.27l0.74,-4.06l0.85,-5.46l1.12,-1.96l0.03,-0.22l-0.71,-2.82l-0.19,-2.94l0.76,-0.07l0.26,-0.2l1.53,-4.62l1.73,-4.52l1.07,-4.2l-0.56,-4.2l0.73,-2.2l0.01,-0.12l-0.29,-3.3l1.46,-3.34l0.45,-5.19l0.8,-5.52l0.78,-5.89l-0.18,-4.33l-0.49,-3.47l1.1,-0.56l0.13,-0.13l0.44,-0.88l0.9,1.29l0.32,1.8l0.1,0.18l1.16,0.97l-0.73,2.33l0.01,0.21l1.33,2.91l0.97,3.6l0.35,0.22l1.57,-0.31l0.16,0.34l-0.79,2.51l-2.61,1.25l-0.17,0.28l0.08,4.36l-0.48,0.79l0.01,0.33l0.6,0.84l-1.62,1.55l-1.67,2.6l-0.89,2.47l-0.02,0.13l0.23,2.56l-1.5,2.76l-0.03,0.21l1.15,4.8l0.11,0.17l0.54,0.42l-0.01,2.37l-1.4,2.7l-0.03,0.15l0.06,2.25l-1.8,1.78l-0.09,0.21l0.02,2.73l0.71,2.63l-1.33,0.94l-0.12,0.17l-0.67,2.64l-0.59,3.03l0.4,3.55l-0.84,0.51l-0.14,0.31l0.58,3.5l0.08,0.16l0.96,0.99l-0.7,1.08l0.11,0.43l1.04,0.55l0.19,0.8l-0.89,0.48l-0.16,0.31l0.26,1.77l-0.89,4.06l-1.31,2.67l-0.03,0.19l0.28,1.53l-0.73,1.88l-1.85,1.37l-0.12,0.26l0.22,3.46l0.06,0.16l0.88,1.19l0.28,0.12l1.32,-0.17l-0.04,2.13l0.04,0.15l1.04,1.95l0.24,0.16l5.94,0.44ZM248.79,430.71l0.0,7.41l0.3,0.3l2.67,0.0l1.01,0.06l-0.54,0.91l-1.99,1.01l-1.13,-0.1l-1.42,-0.27l-1.87,-1.06l-2.57,-0.49l-3.09,-1.9l-2.52,-1.83l-2.65,-2.93l0.93,0.32l3.54,2.29l3.32,1.23l0.34,-0.09l1.29,-1.57l0.83,-2.32l2.11,-1.28l1.43,0.32Z", "name": "Chile"}, "CA": {"path": "M280.14,145.66l-1.66,2.88l0.06,0.37l0.37,0.03l1.5,-1.01l1.17,0.49l-0.64,0.83l0.13,0.46l2.22,0.89l0.28,-0.03l1.02,-0.7l2.09,0.83l-0.69,2.1l0.37,0.38l1.43,-0.45l0.27,1.43l0.74,1.88l-0.95,2.5l-0.88,0.09l-1.34,-0.48l0.49,-2.34l-0.14,-0.32l-0.7,-0.4l-0.36,0.04l-2.81,2.66l-0.63,-0.05l1.2,-1.01l-0.1,-0.52l-2.4,-0.77l-2.79,0.18l-4.65,-0.09l-0.22,-0.54l1.37,-0.99l0.01,-0.48l-0.82,-0.65l1.91,-1.79l2.57,-5.17l1.49,-1.81l2.04,-1.07l0.63,0.08l-0.27,0.51l-1.33,2.07ZM193.92,74.85l-0.01,4.24l0.19,0.28l0.33,-0.07l3.14,-3.22l2.65,2.5l-0.71,3.04l0.06,0.26l2.42,2.88l0.46,0.0l2.66,-3.14l1.83,-3.74l0.03,-0.12l0.13,-4.53l3.23,0.31l3.63,0.64l3.18,2.08l0.13,1.91l-1.79,2.22l-0.0,0.37l1.69,2.2l-0.28,1.8l-4.74,2.84l-3.33,0.62l-2.5,-1.21l-0.41,0.17l-0.73,2.05l-2.39,3.44l-0.74,1.78l-2.78,2.61l-3.48,0.26l-0.17,0.07l-1.98,1.68l-0.1,0.21l-0.15,2.33l-2.68,0.45l-0.17,0.09l-3.1,3.2l-2.75,4.38l-0.99,3.06l-0.14,4.31l0.25,0.31l3.5,0.58l1.07,3.24l1.18,2.76l0.34,0.18l3.43,-0.69l4.55,1.52l2.45,1.32l1.76,1.65l0.12,0.07l3.11,0.96l2.63,1.46l0.13,0.04l4.12,0.2l2.41,0.3l-0.36,2.81l0.8,3.51l1.81,3.78l0.08,0.1l3.73,3.17l0.34,0.03l1.93,-1.08l0.13,-0.15l1.35,-3.44l0.01,-0.18l-1.31,-5.38l-0.08,-0.14l-1.46,-1.5l3.68,-1.51l2.84,-2.46l1.45,-2.55l0.04,-0.17l-0.2,-2.39l-0.04,-0.12l-1.7,-3.07l-2.9,-2.64l2.79,-3.66l0.05,-0.27l-1.08,-3.38l-0.8,-5.75l1.45,-0.75l4.18,1.03l2.6,0.38l0.18,-0.03l1.93,-0.95l2.18,1.23l3.01,2.18l0.73,1.42l0.25,0.16l4.18,0.27l-0.06,2.95l0.83,4.7l0.22,0.24l2.19,0.55l1.75,2.08l0.38,0.07l3.63,-2.03l0.11,-0.11l2.38,-4.06l1.36,-1.43l1.76,3.01l3.26,4.68l2.68,4.19l-0.94,2.09l0.12,0.38l3.31,1.98l2.23,1.98l0.13,0.07l3.94,0.89l1.48,1.02l0.96,2.82l0.22,0.2l1.85,0.43l0.88,1.13l0.17,3.53l-1.68,1.16l-1.76,1.14l-4.08,1.17l-0.11,0.06l-3.08,2.65l-4.11,0.52l-5.35,-0.69l-3.76,-0.02l-2.62,0.23l-0.2,0.1l-2.05,2.29l-3.13,1.41l-0.11,0.08l-3.6,4.24l-2.87,2.92l-0.05,0.36l0.33,0.14l2.13,-0.52l0.15,-0.08l3.98,-4.15l5.16,-2.63l3.58,-0.31l1.82,1.3l-2.09,1.91l-0.09,0.29l0.8,3.46l0.82,2.37l0.15,0.17l3.25,1.56l0.16,0.03l4.14,-0.45l0.21,-0.12l2.03,-2.86l0.11,1.46l0.13,0.22l1.26,0.88l-2.7,1.78l-5.51,1.83l-2.52,1.26l-2.75,2.16l-1.52,-0.18l-0.08,-2.16l4.19,-2.47l0.14,-0.34l-0.3,-0.22l-4.01,0.1l-2.66,0.36l-1.45,-1.56l0.0,-4.16l-0.11,-0.23l-1.11,-0.91l-0.28,-0.05l-1.5,0.48l-0.7,-0.7l-0.45,0.02l-1.91,2.39l-0.8,2.5l-0.82,1.31l-0.95,0.43l-0.77,0.15l-0.23,0.2l-0.18,0.56l-8.2,0.02l-0.13,0.03l-1.19,0.61l-2.95,2.45l-0.78,1.13l-4.6,0.01l-0.12,0.02l-1.13,0.48l-0.13,0.44l0.37,0.55l0.2,0.82l-0.01,0.09l-3.1,1.42l-2.63,0.5l-2.84,1.57l-0.47,0.0l-0.72,-0.4l-0.18,-0.27l0.03,-0.15l0.52,-1.0l1.2,-1.71l0.73,-1.8l0.02,-0.17l-1.03,-5.47l-0.15,-0.21l-2.35,-1.32l0.16,-0.29l-0.05,-0.35l-0.37,-0.38l-0.22,-0.09l-0.56,0.0l-0.35,-0.34l-0.11,-0.65l-0.46,-0.2l-0.39,0.26l-0.2,-0.03l-0.11,-0.33l-0.48,-0.25l-0.21,-0.71l-0.15,-0.18l-3.97,-2.07l-4.8,-2.39l-0.25,-0.01l-2.19,0.89l-0.72,0.03l-3.04,-0.82l-0.14,-0.0l-1.94,0.4l-2.4,-0.98l-2.56,-0.51l-1.7,-0.19l-0.62,-0.44l-0.42,-1.67l-0.3,-0.23l-0.85,0.02l-0.29,0.3l-0.01,0.95l-69.26,-0.01l-4.77,-3.14l-1.78,-1.41l-4.51,-1.38l-1.3,-2.73l0.34,-1.96l-0.17,-0.33l-3.06,-1.37l-0.41,-2.58l-0.11,-0.18l-2.92,-2.4l-0.05,-1.53l1.32,-1.59l0.07,-0.2l-0.07,-2.21l-0.16,-0.26l-4.19,-2.22l-2.52,-4.02l-1.56,-2.6l-0.08,-0.09l-2.28,-1.64l-1.65,-1.48l-1.31,-1.89l-0.38,-0.1l-2.51,1.21l-2.28,1.92l-2.03,-2.22l-1.85,-1.71l-2.44,-1.04l-2.28,-0.12l0.03,-37.72l4.27,0.98l4.0,2.13l2.61,0.4l0.24,-0.07l2.17,-1.81l2.92,-1.33l3.63,0.53l0.18,-0.03l3.72,-1.94l3.89,-1.06l1.6,1.72l0.37,0.06l1.87,-1.04l0.14,-0.19l0.48,-1.83l1.37,0.38l4.18,3.96l0.41,0.0l2.89,-2.62l0.28,2.79l0.37,0.26l3.08,-0.73l0.17,-0.12l0.85,-1.16l2.81,0.24l3.83,1.86l5.86,1.61l3.46,0.75l2.44,-0.26l2.89,1.89l-3.12,1.89l-0.14,0.31l0.24,0.24l4.53,0.92l6.84,-0.5l2.04,-0.71l2.54,2.44l0.39,0.02l2.72,-2.16l-0.01,-0.48l-2.26,-1.61l1.27,-1.16l2.94,-0.19l1.94,-0.42l1.89,0.97l2.49,2.32l0.24,0.08l2.71,-0.33l4.35,1.9l0.17,0.02l3.86,-0.67l3.62,0.1l0.31,-0.33l-0.26,-2.44l1.9,-0.65l3.58,1.36l-0.01,3.84l0.23,0.29l0.34,-0.17l1.51,-3.23l1.81,0.1l0.31,-0.22l1.13,-4.37l-0.08,-0.29l-2.68,-2.73l-2.83,-1.76l0.19,-4.73l2.77,-3.15l3.06,0.69l2.44,1.97l3.24,4.88l-2.05,2.02l0.15,0.51l4.41,0.85ZM265.85,150.7l-0.84,0.04l-3.15,-0.99l-1.77,-1.17l0.19,-0.06l3.17,0.79l2.39,1.27l0.01,0.12ZM249.41,3.71l6.68,0.49l5.34,0.79l4.34,1.6l-0.08,1.24l-5.91,2.56l-6.03,1.21l-2.36,1.38l-0.14,0.34l0.29,0.22l4.37,-0.02l-4.96,3.01l-4.06,1.64l-0.11,0.08l-4.21,4.62l-5.07,0.92l-0.12,0.05l-1.53,1.1l-7.5,0.59l-0.28,0.28l0.24,0.31l2.67,0.54l-1.04,0.6l-0.09,0.44l1.89,2.49l-2.11,1.66l-3.83,1.52l-0.15,0.13l-1.14,2.01l-3.41,1.55l-0.16,0.36l0.35,1.19l0.3,0.22l3.98,-0.19l0.03,0.78l-6.42,2.99l-6.44,-1.41l-7.41,0.79l-3.72,-0.62l-4.48,-0.26l-0.25,-2.0l4.37,-1.13l0.21,-0.38l-1.14,-3.55l1.13,-0.28l6.61,2.29l0.35,-0.12l-0.04,-0.37l-3.41,-3.45l-0.14,-0.08l-3.57,-0.92l1.62,-1.7l4.36,-1.3l0.2,-0.18l0.71,-1.94l-0.12,-0.36l-3.45,-2.15l-0.88,-2.43l6.36,0.23l1.94,0.61l0.23,-0.02l3.91,-2.1l0.15,-0.32l-0.26,-0.24l-5.69,-0.67l-8.69,0.37l-4.3,-1.92l-2.12,-2.39l-2.82,-1.68l-0.44,-1.65l3.41,-1.06l2.93,-0.2l4.91,-0.99l3.69,-2.28l2.93,0.31l2.64,1.68l0.42,-0.1l1.84,-3.23l3.17,-0.96l4.45,-0.69l7.56,-0.26l1.26,0.64l0.18,0.03l7.2,-1.06l10.81,0.8ZM203.94,57.59l0.01,0.32l1.97,2.97l0.51,-0.01l2.26,-3.75l6.05,-1.89l4.08,4.72l-0.36,2.95l0.38,0.33l4.95,-1.36l0.11,-0.05l2.23,-1.77l5.37,2.31l3.32,2.14l0.3,1.89l0.36,0.25l4.48,-1.01l2.49,2.8l0.14,0.09l5.99,1.78l2.09,1.74l2.18,3.83l-4.29,1.91l-0.01,0.54l5.9,2.83l3.95,0.94l3.54,3.84l0.2,0.1l3.58,0.25l-0.67,2.51l-4.18,4.54l-2.84,-1.61l-3.91,-3.95l-0.26,-0.09l-3.24,0.52l-0.25,0.26l-0.32,2.37l0.1,0.26l2.63,2.38l3.42,1.89l0.96,1.0l1.57,3.8l-0.74,2.43l-2.85,-0.96l-6.26,-3.15l-0.38,0.09l0.04,0.39l3.54,3.4l2.55,2.31l0.23,0.78l-6.26,-1.43l-5.33,-2.25l-2.73,-1.73l0.67,-0.86l-0.09,-0.45l-7.38,-4.01l-0.44,0.27l0.03,0.89l-6.85,0.61l-1.8,-1.17l1.43,-2.6l4.56,-0.07l5.15,-0.52l0.23,-0.45l-0.76,-1.34l0.8,-1.89l3.21,-4.06l0.05,-0.29l-0.72,-1.95l-0.97,-1.47l-0.11,-0.1l-3.84,-2.1l-4.53,-1.33l1.09,-0.75l0.05,-0.45l-2.65,-2.75l-0.18,-0.09l-2.12,-0.24l-1.91,-1.47l-0.39,0.02l-1.27,1.25l-4.4,0.56l-9.06,-0.99l-5.28,-1.31l-4.01,-0.67l-1.72,-1.31l2.32,-1.85l0.1,-0.33l-0.28,-0.2l-3.3,-0.02l-0.74,-4.36l1.86,-4.09l2.46,-1.88l5.74,-1.15l-1.5,2.55ZM261.28,159.28l0.19,0.14l1.82,0.42l1.66,-0.05l-0.66,0.68l-0.75,0.16l-3.0,-1.25l-0.46,-0.77l0.51,-0.52l0.68,1.19ZM230.87,84.48l-2.48,0.19l-0.52,-1.74l0.96,-2.17l2.03,-0.53l1.71,1.04l0.02,1.6l-0.22,0.46l-1.5,1.16ZM229.52,58.19l0.14,0.82l-4.99,-0.22l-2.73,0.63l-0.59,-0.23l-2.61,-2.4l0.08,-1.38l0.94,-0.25l5.61,0.51l4.14,2.54ZM222.12,105.0l-0.79,1.63l-0.75,-0.22l-0.52,-0.91l0.04,-0.09l0.84,-1.01l0.74,0.06l0.44,0.55ZM183.77,38.22l2.72,1.65l0.16,0.04l4.83,-0.01l1.92,1.52l-0.51,1.75l0.18,0.36l2.84,1.14l1.56,1.19l0.16,0.06l3.37,0.22l3.65,0.42l4.07,-1.1l5.05,-0.43l3.96,0.35l2.53,1.8l0.48,1.79l-1.37,1.16l-3.6,1.03l-3.22,-0.59l-7.17,0.76l-5.1,0.09l-4.0,-0.6l-6.48,-1.56l-0.81,-2.57l-0.3,-2.49l-0.1,-0.19l-2.51,-2.25l-0.16,-0.07l-5.12,-0.63l-2.61,-1.45l0.75,-1.71l4.88,0.32ZM207.46,91.26l0.42,1.62l0.42,0.19l1.12,-0.55l1.35,0.99l2.74,1.39l2.73,1.2l0.2,1.74l0.35,0.26l1.72,-0.29l1.31,0.97l-1.72,0.96l-3.68,-0.9l-1.34,-1.71l-0.43,-0.04l-2.46,2.1l-3.23,1.85l-0.74,-1.98l-0.31,-0.19l-2.47,0.28l1.49,-1.34l0.1,-0.19l0.32,-3.15l0.79,-3.45l1.34,0.25ZM215.59,102.66l-2.73,2.0l-1.49,-0.08l-0.37,-0.7l1.61,-1.56l3.0,0.03l-0.02,0.3ZM202.79,24.07l0.11,0.12l2.54,1.53l-3.01,1.47l-4.55,4.07l-4.3,0.38l-5.07,-0.68l-2.51,-2.09l0.03,-1.72l1.86,-1.4l0.1,-0.34l-0.29,-0.2l-4.49,0.04l-2.63,-1.79l-1.45,-2.36l1.61,-2.38l1.65,-1.69l2.47,-0.4l0.19,-0.48l-0.72,-0.89l5.1,-0.26l3.1,3.05l0.13,0.07l4.21,1.25l3.99,1.06l1.92,3.65ZM187.5,59.3l-0.15,0.1l-2.59,3.4l-2.5,-0.15l-1.47,-3.92l0.04,-2.24l1.22,-1.92l2.34,-1.26l5.11,0.17l4.28,1.06l-3.36,3.86l-2.9,0.9ZM186.19,48.8l-1.15,1.63l-3.42,-0.35l-2.68,-1.15l1.11,-1.88l3.34,-1.27l2.01,1.63l0.79,1.38ZM185.78,35.41l-0.95,0.13l-4.48,-0.33l-0.4,-0.91l4.5,0.07l1.45,0.82l-0.1,0.21ZM180.76,32.56l-3.43,1.03l-1.85,-1.14l-1.01,-1.92l-0.16,-1.87l2.87,0.2l1.39,0.35l2.75,1.75l-0.55,1.6ZM181.03,76.32l-1.21,1.2l-3.19,-1.26l-0.18,-0.01l-1.92,0.45l-2.88,-1.67l1.84,-1.16l1.6,-1.77l2.45,1.17l1.45,0.77l2.05,2.28ZM169.72,54.76l2.83,0.97l0.14,0.01l4.25,-0.58l0.47,1.01l-2.19,2.16l0.07,0.48l3.61,1.95l-0.41,3.84l-3.87,1.68l-2.23,-0.36l-1.73,-1.75l-6.07,-3.53l0.03,-1.01l4.79,0.55l0.3,-0.16l-0.04,-0.34l-2.55,-2.89l2.59,-2.05ZM174.44,40.56l1.49,1.87l0.07,2.48l-1.07,3.52l-3.87,0.48l-2.41,-0.72l0.05,-2.72l-0.33,-0.3l-3.79,0.36l-0.13,-3.31l2.36,0.14l0.15,-0.03l3.7,-1.74l3.44,0.29l0.31,-0.22l0.03,-0.12ZM170.14,31.5l0.75,1.74l-3.52,-0.52l-4.19,-1.77l-4.65,-0.17l1.65,-1.11l-0.05,-0.52l-2.86,-1.26l-0.13,-1.58l4.52,0.7l6.66,1.99l1.84,2.5ZM134.64,58.08l-1.08,1.93l0.34,0.44l5.44,-1.41l3.37,2.32l0.37,-0.02l2.66,-2.28l2.03,1.38l2.01,4.53l0.53,0.04l1.26,-1.93l0.03,-0.27l-1.67,-4.55l1.82,-0.58l2.36,0.73l2.69,1.84l1.53,4.46l0.77,3.24l0.15,0.19l4.22,2.26l4.32,2.04l-0.21,1.51l-3.87,0.34l-0.19,0.5l1.45,1.54l-0.65,1.23l-4.3,-0.65l-4.4,-1.19l-2.97,0.28l-4.67,1.48l-6.31,0.65l-4.27,0.39l-1.26,-1.91l-0.15,-0.12l-3.42,-1.2l-0.16,-0.01l-2.05,0.45l-2.66,-3.02l1.2,-0.34l3.82,-0.76l3.58,0.19l3.27,-0.78l0.23,-0.29l-0.24,-0.29l-4.84,-1.06l-5.42,0.35l-3.4,-0.09l-0.97,-1.22l5.39,-1.7l0.21,-0.33l-0.3,-0.25l-3.82,0.06l-3.95,-1.1l1.88,-3.13l1.68,-1.81l6.54,-2.84l2.11,0.77ZM158.85,56.58l-1.82,2.62l-3.38,-2.9l0.49,-0.39l3.17,-0.18l1.54,0.86ZM149.71,42.7l1.0,1.87l0.37,0.14l2.17,-0.83l2.33,0.2l0.38,2.16l-1.38,2.17l-8.33,0.76l-6.34,2.15l-3.51,0.1l-0.22,-1.13l4.98,-2.12l0.17,-0.34l-0.31,-0.23l-11.27,0.6l-3.04,-0.78l3.14,-4.57l2.2,-1.35l6.87,1.7l4.4,3.0l0.14,0.05l4.37,0.39l0.27,-0.48l-3.41,-4.68l1.96,-1.62l2.28,0.53l0.79,2.32ZM145.44,29.83l-2.18,0.77l-3.79,-0.0l0.02,-0.31l2.34,-1.5l1.2,0.23l2.42,0.83ZM144.83,34.5l-4.44,1.46l-3.18,-1.48l1.6,-1.36l3.51,-0.53l3.1,0.75l-0.6,1.16ZM119.02,65.87l-6.17,2.07l-1.19,-1.82l-0.13,-0.11l-5.48,-2.32l0.92,-1.7l1.73,-3.44l2.16,-3.15l-0.02,-0.36l-2.09,-2.56l7.84,-0.71l3.59,1.02l6.32,0.27l2.35,1.37l2.25,1.71l-2.68,1.04l-6.21,3.41l-3.1,3.28l-0.08,0.21l0.0,1.81ZM129.66,35.4l-0.3,3.55l-1.77,1.67l-2.34,0.27l-4.62,2.2l-3.89,0.76l-2.83,-0.93l3.85,-3.52l5.04,-3.36l3.75,0.07l3.11,-0.7ZM111.24,152.74l-0.82,0.29l-3.92,-1.39l-0.7,-1.06l-0.12,-0.1l-2.15,-1.09l-0.41,-0.84l-0.2,-0.16l-2.44,-0.56l-0.84,-1.56l0.1,-0.36l2.34,0.64l1.53,0.5l2.28,0.34l0.78,1.04l1.24,1.55l0.09,0.08l2.42,1.3l0.81,1.39ZM88.54,134.82l0.14,0.02l2.0,-0.23l-0.67,3.48l0.06,0.24l1.78,2.22l-0.24,-0.0l-1.4,-1.42l-0.91,-1.53l-1.26,-1.08l-0.42,-1.35l0.09,-0.66l0.82,0.31Z", "name": "Canada"}, "CG": {"path": "M453.66,296.61l-0.9,-0.82l-0.35,-0.04l-0.83,0.48l-0.77,0.83l-1.65,-2.13l1.66,-1.2l0.08,-0.39l-0.81,-1.43l0.59,-0.43l1.62,-0.29l0.24,-0.24l0.1,-0.58l0.94,0.84l0.19,0.08l2.21,0.11l0.27,-0.14l0.81,-1.29l0.32,-1.76l-0.27,-1.96l-0.06,-0.15l-1.08,-1.35l1.02,-2.74l-0.09,-0.34l-0.62,-0.5l-0.22,-0.06l-1.66,0.18l-0.55,-1.03l0.12,-0.73l2.85,0.09l1.98,0.65l2.0,0.59l0.38,-0.25l0.17,-1.3l1.26,-2.24l1.34,-1.19l1.54,0.38l1.35,0.12l-0.11,1.15l-0.74,1.34l-0.5,1.61l-0.31,2.22l0.12,1.41l-0.4,0.9l-0.06,0.88l-0.24,0.67l-1.57,1.15l-1.24,1.41l-1.09,2.43l-0.03,0.13l0.08,1.95l-0.55,0.69l-1.46,1.23l-1.32,1.41l-0.61,-0.29l-0.13,-0.57l-0.29,-0.23l-1.36,-0.02l-0.23,0.1l-0.72,0.81l-0.41,-0.16Z", "name": "Republic of the Congo"}, "CF": {"path": "M459.41,266.56l1.9,-0.17l0.22,-0.12l0.36,-0.5l0.14,0.02l0.55,0.51l0.29,0.07l3.15,-0.96l0.12,-0.07l1.05,-0.97l1.29,-0.87l0.12,-0.33l-0.17,-0.61l0.38,-0.12l2.36,0.15l0.15,-0.03l2.36,-1.17l0.12,-0.1l1.78,-2.72l1.18,-0.96l1.23,-0.34l0.21,0.79l0.07,0.13l1.37,1.5l0.01,0.86l-0.39,1.0l-0.01,0.17l0.16,0.78l0.1,0.17l0.91,0.76l1.89,1.09l1.24,0.92l0.02,0.67l0.12,0.23l1.67,1.3l0.99,1.03l0.61,1.46l0.14,0.15l1.79,0.95l0.2,0.4l-0.44,0.14l-1.54,-0.06l-1.98,-0.26l-0.93,0.22l-0.19,0.14l-0.3,0.48l-0.57,0.05l-0.91,-0.49l-0.26,-0.01l-2.7,1.21l-1.04,-0.23l-0.21,0.03l-0.34,0.19l-0.12,0.13l-0.64,1.3l-1.67,-0.43l-1.77,-0.24l-1.58,-0.91l-2.06,-0.85l-0.27,0.02l-1.42,0.88l-0.97,1.27l-0.06,0.14l-0.19,1.46l-1.3,-0.11l-1.67,-0.42l-0.27,0.07l-1.55,1.41l-0.99,1.76l-0.14,-1.18l-0.13,-0.22l-1.1,-0.78l-0.86,-1.2l-0.2,-0.84l-0.07,-0.13l-1.07,-1.19l0.16,-0.59l0.0,-0.15l-0.24,-1.01l0.18,-1.77l0.5,-0.38l0.09,-0.11l1.18,-2.4Z", "name": "Central African Republic"}, "CD": {"path": "M497.85,276.25l-0.14,2.77l0.2,0.3l0.57,0.19l-0.47,0.52l-1.0,0.71l-0.96,1.31l-0.56,1.22l-0.16,2.04l-0.54,0.89l-0.04,0.15l-0.02,1.76l-0.63,0.61l-0.09,0.2l-0.08,1.33l-0.2,0.11l-0.15,0.21l-0.23,1.37l0.03,0.2l0.6,1.08l0.16,2.96l0.44,2.29l-0.24,1.25l0.01,0.15l0.5,1.46l0.07,0.12l1.41,1.37l1.09,2.56l-0.51,-0.11l-3.45,0.45l-0.67,0.3l-0.15,0.15l-0.71,1.61l0.01,0.26l0.52,1.03l-0.43,2.9l-0.31,2.55l0.13,0.29l0.7,0.46l1.75,0.99l0.31,-0.01l0.26,-0.17l0.15,1.9l-1.44,-0.02l-0.94,-1.28l-0.94,-1.1l-0.17,-0.1l-1.76,-0.33l-0.5,-1.18l-0.42,-0.15l-1.44,0.75l-1.79,-0.32l-0.77,-1.05l-0.2,-0.12l-1.59,-0.23l-0.97,0.04l-0.1,-0.53l-0.27,-0.25l-0.86,-0.06l-1.13,-0.15l-1.62,0.37l-1.04,-0.06l-0.32,0.09l0.11,-2.56l-0.08,-0.21l-0.77,-0.87l-0.17,-1.41l0.36,-1.47l-0.03,-0.21l-0.48,-0.91l-0.04,-1.52l-0.3,-0.29l-2.65,0.02l0.13,-0.53l-0.29,-0.37l-1.28,0.01l-0.28,0.21l-0.07,0.24l-1.35,0.09l-0.26,0.18l-0.62,1.45l-0.25,0.42l-1.17,-0.3l-0.19,0.01l-0.79,0.34l-1.44,0.18l-1.41,-1.96l-0.7,-1.47l-0.61,-1.86l-0.28,-0.21l-7.39,-0.03l-0.92,0.3l-0.78,-0.03l-0.78,0.25l-0.11,-0.25l0.35,-0.15l0.18,-0.26l0.07,-1.02l0.33,-0.52l0.72,-0.42l0.52,0.2l0.33,-0.08l0.76,-0.86l0.99,0.02l0.11,0.48l0.16,0.2l0.94,0.44l0.35,-0.07l1.46,-1.56l1.44,-1.21l0.68,-0.85l0.06,-0.2l-0.08,-1.99l1.04,-2.33l1.1,-1.23l1.62,-1.19l0.11,-0.14l0.29,-0.8l0.08,-0.94l0.38,-0.82l0.03,-0.16l-0.13,-1.38l0.3,-2.16l0.47,-1.51l0.73,-1.31l0.04,-0.12l0.15,-1.51l0.21,-1.66l0.89,-1.16l1.16,-0.7l1.9,0.79l1.69,0.95l1.81,0.24l1.85,0.48l0.35,-0.16l0.71,-1.43l0.16,-0.09l1.03,0.23l0.19,-0.02l2.65,-1.19l0.86,0.46l0.17,0.03l0.81,-0.08l0.23,-0.14l0.31,-0.5l0.75,-0.17l1.83,0.26l1.64,0.06l0.72,-0.21l1.39,1.9l0.16,0.11l1.12,0.3l0.24,-0.04l0.58,-0.36l1.05,0.15l0.15,-0.02l1.15,-0.44l0.47,0.84l0.08,0.09l2.08,1.57Z", "name": "Democratic Republic of the Congo"}, "CZ": {"path": "M463.29,152.22l-0.88,-0.47l-0.18,-0.03l-1.08,0.15l-1.86,-0.94l-0.21,-0.02l-0.88,0.24l-0.13,0.07l-1.25,1.17l-1.63,-0.91l-1.38,-1.36l-1.22,-0.75l-0.24,-1.24l-0.33,-0.75l1.53,-0.6l0.98,-0.84l1.74,-0.62l0.11,-0.07l0.47,-0.47l0.46,0.27l0.24,0.03l0.96,-0.3l1.06,0.95l0.15,0.07l1.57,0.24l-0.1,0.6l0.16,0.32l1.36,0.68l0.41,-0.15l0.28,-0.62l1.29,0.28l0.19,0.84l0.26,0.23l1.73,0.18l0.74,1.02l-0.17,0.0l-0.25,0.13l-0.32,0.49l-0.46,0.11l-0.22,0.23l-0.13,0.57l-0.32,0.1l-0.2,0.22l-0.03,0.14l-0.65,0.25l-1.05,-0.05l-0.28,0.17l-0.22,0.43Z", "name": "Czech Republic"}, "CY": {"path": "M505.03,193.75l-1.51,0.68l-1.0,-0.3l-0.32,-0.63l0.69,-0.06l0.41,0.13l0.19,-0.0l0.62,-0.22l0.31,0.02l0.06,0.22l0.49,0.17l0.06,-0.01Z", "name": "Cyprus"}, "CR": {"path": "M213.0,263.84l-0.98,-0.4l-0.3,-0.31l0.16,-0.24l0.05,-0.21l-0.09,-0.56l-0.1,-0.18l-0.76,-0.65l-0.99,-0.5l-0.74,-0.28l-0.13,-0.58l-0.12,-0.18l-0.66,-0.45l-0.34,-0.0l-0.13,0.31l0.13,0.59l-0.17,0.21l-0.34,-0.42l-0.14,-0.1l-0.7,-0.22l-0.23,-0.34l0.01,-0.62l0.31,-0.74l-0.14,-0.38l-0.3,-0.15l0.47,-0.4l1.48,0.6l0.26,-0.02l0.47,-0.27l0.58,0.15l0.35,0.44l0.17,0.11l0.74,0.17l0.27,-0.07l0.3,-0.27l0.52,1.09l0.97,1.02l0.77,0.71l-0.41,0.1l-0.23,0.3l0.01,1.02l0.12,0.24l0.2,0.14l-0.07,0.05l-0.11,0.3l0.08,0.37l-0.23,0.63Z", "name": "Costa Rica"}, "CU": {"path": "M215.01,226.09l2.08,0.18l1.94,0.03l2.24,0.86l0.95,0.92l0.25,0.08l2.22,-0.28l0.79,0.55l3.68,2.81l0.19,0.06l0.77,-0.03l1.18,0.42l-0.12,0.47l0.27,0.37l1.78,0.1l1.59,0.9l-0.11,0.22l-1.5,0.3l-1.64,0.13l-1.75,-0.2l-2.69,0.19l1.0,-0.86l-0.03,-0.48l-1.02,-0.68l-0.13,-0.05l-1.52,-0.16l-0.74,-0.64l-0.57,-1.42l-0.3,-0.19l-1.36,0.1l-2.23,-0.67l-0.71,-0.52l-0.14,-0.06l-3.2,-0.4l-0.42,-0.25l0.56,-0.39l0.12,-0.33l-0.27,-0.22l-2.46,-0.13l-0.2,0.06l-1.72,1.31l-0.94,0.03l-0.25,0.15l-0.29,0.53l-1.04,0.24l-0.29,-0.07l0.7,-0.43l0.1,-0.11l0.5,-0.87l1.04,-0.54l1.23,-0.49l1.86,-0.25l0.62,-0.28Z", "name": "Cuba"}, "SZ": {"path": "M500.95,353.41l-0.41,0.97l-1.16,0.23l-1.29,-1.26l-0.02,-0.71l0.63,-0.93l0.23,-0.7l0.47,-0.12l1.04,0.4l0.32,1.05l0.2,1.08Z", "name": "Swaziland"}, "SY": {"path": "M510.84,199.83l0.09,-0.11l0.07,-0.2l-0.04,-1.08l0.56,-1.4l1.3,-1.01l0.1,-0.34l-0.41,-1.11l-0.24,-0.19l-0.89,-0.11l-0.2,-1.84l0.55,-1.05l1.3,-1.22l0.09,-0.19l0.09,-1.09l0.39,0.27l0.25,0.04l2.66,-0.77l1.35,0.52l2.06,-0.01l2.93,-1.08l1.35,0.04l2.14,-0.34l-0.83,1.16l-1.31,0.68l-0.16,0.3l0.23,2.03l-0.9,3.25l-5.43,2.87l-4.79,2.91l-2.32,-0.92Z", "name": "Syria"}, "KG": {"path": "M599.04,172.15l0.38,-0.9l1.43,-0.37l4.04,1.02l0.37,-0.23l0.36,-1.64l1.17,-0.52l3.45,1.24l0.2,-0.0l0.86,-0.31l4.09,0.08l3.61,0.31l1.18,1.02l0.11,0.06l1.19,0.34l-0.13,0.26l-3.84,1.58l-0.13,0.1l-0.81,1.08l-3.08,0.34l-0.24,0.16l-0.85,1.7l-2.43,-0.37l-0.14,0.01l-1.79,0.61l-2.39,1.4l-0.12,0.39l0.25,0.49l-0.48,0.45l-4.57,0.43l-3.04,-0.94l-2.45,0.18l0.14,-1.02l2.42,0.44l0.27,-0.08l0.81,-0.81l1.76,0.27l0.21,-0.05l3.21,-2.14l-0.03,-0.51l-2.97,-1.57l-0.26,-0.01l-1.64,0.69l-1.38,-0.84l1.81,-1.67l-0.09,-0.5l-0.46,-0.18Z", "name": "Kyrgyzstan"}, "KE": {"path": "M523.3,287.04l0.06,0.17l1.29,1.8l-1.46,0.84l-0.11,0.11l-0.55,0.93l-0.81,0.16l-0.24,0.24l-0.34,1.69l-0.81,1.06l-0.46,1.58l-0.76,0.63l-3.3,-2.3l-0.16,-1.32l-0.15,-0.23l-9.35,-5.28l-0.02,-2.4l1.92,-2.63l0.91,-1.83l0.01,-0.24l-1.09,-2.86l-0.29,-1.24l-1.09,-1.63l2.93,-2.85l0.92,0.3l0.0,1.19l0.09,0.22l0.86,0.83l0.21,0.08l1.65,0.0l3.09,2.08l0.16,0.05l0.79,0.03l0.54,-0.06l0.58,0.28l1.67,0.2l0.28,-0.12l0.69,-0.98l2.04,-0.94l0.86,0.73l0.19,0.07l1.1,0.0l-1.82,2.36l-0.06,0.18l0.03,9.12Z", "name": "Kenya"}, "SS": {"path": "M505.7,261.39l0.02,1.64l-0.27,0.55l-1.15,0.05l-0.24,0.15l-0.85,1.44l0.22,0.45l1.44,0.17l1.15,1.12l0.42,0.95l0.14,0.15l1.06,0.54l1.33,2.45l-3.06,2.98l-1.44,1.08l-1.75,0.01l-1.92,0.56l-1.5,-0.53l-0.27,0.03l-0.85,0.57l-1.98,-1.5l-0.56,-1.02l-0.37,-0.13l-1.32,0.5l-1.08,-0.15l-0.2,0.04l-0.56,0.35l-0.9,-0.24l-1.44,-1.97l-0.39,-0.77l-0.13,-0.13l-1.78,-0.94l-0.65,-1.5l-1.08,-1.12l-1.57,-1.22l-0.02,-0.68l-0.12,-0.23l-1.37,-1.02l-1.17,-0.68l0.2,-0.08l0.86,-0.48l0.14,-0.18l0.63,-2.22l0.6,-1.02l1.47,-0.28l0.35,0.56l1.29,1.48l0.14,0.09l0.69,0.22l0.22,-0.02l0.83,-0.4l1.58,0.08l0.26,0.39l0.25,0.13l2.49,0.0l0.3,-0.25l0.06,-0.35l1.13,-0.42l0.18,-0.18l0.22,-0.63l0.68,-0.38l1.95,1.37l0.23,0.05l1.29,-0.26l0.19,-0.12l1.23,-1.8l1.36,-1.37l0.08,-0.25l-0.21,-1.52l-0.06,-0.15l-0.25,-0.3l0.94,-0.08l0.26,-0.21l0.1,-0.32l0.6,0.09l-0.25,1.67l0.3,1.83l0.11,0.19l1.22,0.94l0.25,0.73l-0.04,1.2l0.26,0.31l0.09,0.01Z", "name": "South Sudan"}, "SR": {"path": "M278.1,270.26l2.71,0.45l0.31,-0.14l0.19,-0.32l1.82,-0.16l2.25,0.56l-1.09,1.81l-0.04,0.19l0.2,1.72l0.05,0.13l0.9,1.35l-0.39,0.99l-0.21,1.09l-0.48,0.8l-1.2,-0.44l-0.17,-0.01l-1.12,0.24l-0.95,-0.21l-0.35,0.2l-0.25,0.73l0.05,0.29l0.3,0.35l-0.06,0.13l-1.01,-0.15l-1.42,-2.03l-0.32,-1.36l-0.29,-0.23l-0.63,-0.0l-0.95,-1.56l0.41,-1.16l0.01,-0.17l-0.08,-0.35l1.29,-0.56l0.18,-0.22l0.35,-1.97Z", "name": "Suriname"}, "KH": {"path": "M680.28,257.89l-0.93,-1.2l-1.24,-2.56l-0.56,-2.9l1.45,-1.92l3.07,-0.46l2.26,0.35l2.03,0.98l0.38,-0.11l1.0,-1.55l1.86,0.79l0.52,1.51l-0.28,2.82l-4.05,1.88l-0.12,0.45l0.79,1.1l-2.2,0.17l-2.08,0.98l-1.89,-0.33Z", "name": "Cambodia"}, "SV": {"path": "M197.02,248.89l0.18,-0.05l0.59,0.17l0.55,0.51l0.64,0.35l0.06,0.22l0.37,0.21l1.01,-0.28l0.38,0.13l0.16,0.13l-0.14,0.81l-0.18,0.38l-1.22,-0.03l-0.84,-0.23l-1.11,-0.52l-1.31,-0.15l-0.49,-0.38l0.02,-0.08l0.76,-0.57l0.46,-0.27l0.11,-0.35Z", "name": "El Salvador"}, "SK": {"path": "M468.01,150.02l0.05,0.07l0.36,0.1l0.85,-0.37l1.12,1.02l0.33,0.05l1.38,-0.65l1.07,0.3l0.16,0.0l1.69,-0.43l1.95,1.02l-0.51,0.64l-0.45,1.2l-0.32,0.2l-2.55,-0.93l-0.17,-0.01l-0.82,0.2l-0.17,0.11l-0.53,0.68l-0.94,0.32l-0.14,-0.11l-0.29,-0.04l-1.18,0.48l-0.95,0.09l-0.26,0.21l-0.15,0.47l-1.84,0.34l-0.82,-0.31l-1.14,-0.73l-0.2,-0.89l0.42,-0.84l0.91,0.05l0.12,-0.02l0.86,-0.33l0.18,-0.21l0.03,-0.13l0.32,-0.1l0.2,-0.22l0.12,-0.55l0.39,-0.1l0.18,-0.13l0.3,-0.45l0.43,-0.0Z", "name": "Slovakia"}, "KR": {"path": "M737.31,185.72l0.84,0.08l0.27,-0.12l0.89,-1.2l1.63,-0.13l1.1,-0.2l0.21,-0.16l0.12,-0.24l1.86,2.95l0.59,1.79l0.02,3.17l-0.84,1.38l-2.23,0.55l-1.95,1.14l-1.91,0.21l-0.22,-1.21l0.45,-2.07l-0.01,-0.17l-0.99,-2.67l1.54,-0.4l0.17,-0.46l-1.55,-2.24Z", "name": "South Korea"}, "SI": {"path": "M455.77,159.59l1.79,0.21l0.18,-0.04l1.2,-0.68l2.12,-0.08l0.21,-0.1l0.38,-0.42l0.1,0.01l0.28,0.62l-1.71,0.71l-0.18,0.22l-0.21,1.1l-0.71,0.26l-0.2,0.28l0.01,0.55l-0.59,-0.04l-0.79,-0.47l-0.38,0.06l-0.36,0.41l-0.84,-0.05l0.05,-0.15l-0.56,-1.24l0.21,-1.17Z", "name": "Slovenia"}, "KP": {"path": "M747.76,172.02l-0.23,-0.04l-0.26,0.08l-1.09,1.02l-0.78,1.06l-0.06,0.19l0.09,1.95l-1.12,0.57l-0.53,0.58l-0.88,0.82l-1.69,0.51l-1.09,0.79l-0.12,0.22l-0.07,1.17l-0.22,0.25l0.09,0.47l0.96,0.46l1.22,1.1l-0.19,0.37l-0.91,0.16l-1.75,0.14l-0.22,0.12l-0.87,1.18l-0.95,-0.09l-0.3,0.18l-0.97,-0.44l-0.39,0.13l-0.25,0.44l-0.29,0.09l-0.03,-0.2l-0.18,-0.23l-0.62,-0.25l-0.43,-0.29l0.52,-0.97l0.52,-0.3l0.13,-0.38l-0.18,-0.42l0.59,-1.47l0.01,-0.21l-0.16,-0.48l-0.22,-0.2l-1.41,-0.31l-0.82,-0.55l1.74,-1.62l2.73,-1.58l1.62,-1.96l0.96,0.76l0.17,0.06l2.17,0.11l0.31,-0.37l-0.32,-1.31l3.61,-1.21l0.16,-0.13l0.79,-1.34l1.25,1.38Z", "name": "North Korea"}, "SO": {"path": "M543.8,256.48l0.61,-0.05l1.14,-0.37l1.31,-0.25l0.12,-0.05l1.11,-0.81l0.57,-0.0l0.03,0.39l-0.23,1.49l0.01,1.25l-0.52,0.92l-0.7,2.71l-1.19,2.79l-1.54,3.2l-2.13,3.66l-2.12,2.79l-2.92,3.39l-2.47,2.0l-3.76,2.5l-2.33,1.9l-2.77,3.06l-0.61,1.35l-0.28,0.29l-1.22,-1.69l-0.03,-8.92l2.12,-2.76l0.59,-0.68l1.47,-0.04l0.18,-0.06l2.15,-1.71l3.16,-0.11l0.21,-0.09l7.08,-7.55l1.76,-2.12l1.14,-1.57l0.06,-0.18l0.01,-4.67Z", "name": "Somalia"}, "SN": {"path": "M379.28,250.34l-0.95,-1.82l-0.09,-0.1l-0.83,-0.6l0.62,-0.28l0.13,-0.11l1.21,-1.8l0.6,-1.31l0.71,-0.68l1.09,0.2l0.18,-0.02l1.17,-0.53l1.25,-0.03l1.17,0.73l1.59,0.65l1.47,1.83l1.59,1.7l0.12,1.56l0.49,1.46l0.1,0.14l0.85,0.65l0.18,0.82l-0.08,0.57l-0.13,0.05l-1.29,-0.19l-0.29,0.13l-0.11,0.16l-0.35,0.04l-1.83,-0.61l-5.84,-0.13l-0.12,0.02l-0.6,0.26l-0.87,-0.06l-1.01,0.32l-0.26,-1.26l1.9,0.04l0.16,-0.04l0.54,-0.32l0.37,-0.02l0.15,-0.05l0.78,-0.5l0.92,0.46l0.12,0.03l1.09,0.04l0.15,-0.03l1.08,-0.57l0.11,-0.44l-0.51,-0.74l-0.39,-0.1l-0.76,0.39l-0.62,-0.01l-0.92,-0.58l-0.18,-0.05l-0.79,0.04l-0.2,0.09l-0.48,0.51l-2.41,0.06Z", "name": "Senegal"}, "SL": {"path": "M392.19,267.53l-0.44,-0.12l-1.73,-0.97l-1.24,-1.28l-0.4,-0.84l-0.27,-1.65l1.21,-1.0l0.09,-0.12l0.27,-0.66l0.32,-0.41l0.56,-0.05l0.16,-0.07l0.5,-0.41l1.75,0.0l0.59,0.77l0.49,0.96l-0.07,0.64l0.04,0.19l0.36,0.58l-0.03,0.84l0.24,0.2l-0.64,0.65l-1.13,1.37l-0.06,0.14l-0.12,0.66l-0.43,0.58Z", "name": "Sierra Leone"}, "SB": {"path": "M826.74,311.51l0.23,0.29l-0.95,-0.01l-0.39,-0.63l0.65,0.27l0.45,0.09ZM825.01,308.52l-1.18,-1.39l-0.37,-1.06l0.24,0.0l0.82,1.84l0.49,0.6ZM823.21,309.42l-0.44,0.03l-1.43,-0.24l-0.32,-0.24l0.08,-0.5l1.29,0.31l0.72,0.47l0.11,0.18ZM817.9,303.81l2.59,1.44l0.3,0.41l-1.21,-0.66l-1.34,-0.89l-0.34,-0.3ZM813.77,302.4l0.48,0.34l0.1,0.08l-0.33,-0.17l-0.25,-0.25Z", "name": "Solomon Islands"}, "SA": {"path": "M528.24,243.1l-0.2,-0.69l-0.07,-0.12l-0.69,-0.71l-0.18,-0.94l-0.12,-0.19l-1.24,-0.89l-1.28,-2.09l-0.7,-2.08l-0.07,-0.11l-1.73,-1.79l-0.11,-0.07l-1.03,-0.39l-1.57,-2.36l-0.27,-1.72l0.1,-1.53l-0.03,-0.15l-1.44,-2.93l-1.25,-1.13l-1.34,-0.56l-0.72,-1.33l0.11,-0.49l-0.02,-0.2l-0.7,-1.38l-0.08,-0.1l-0.68,-0.56l-0.97,-1.98l-2.8,-4.03l-0.25,-0.13l-0.85,0.01l0.29,-1.11l0.12,-0.97l0.23,-0.81l2.52,0.39l0.23,-0.06l1.08,-0.84l0.6,-0.95l1.78,-0.35l0.22,-0.17l0.37,-0.83l0.74,-0.42l0.08,-0.46l-2.17,-2.4l4.55,-1.26l0.12,-0.06l0.36,-0.32l2.83,0.71l3.67,1.91l7.04,5.5l0.17,0.06l4.64,0.22l2.06,0.24l0.55,1.15l0.28,0.17l1.56,-0.06l0.9,2.15l0.14,0.15l1.14,0.57l0.39,0.85l0.11,0.13l1.59,1.06l0.12,0.91l-0.23,0.83l0.01,0.18l0.32,0.9l0.07,0.11l0.68,0.7l0.33,0.86l0.37,0.65l0.09,0.1l0.76,0.53l0.25,0.04l0.45,-0.12l0.35,0.75l0.1,0.63l0.96,2.68l0.23,0.19l7.53,1.33l0.27,-0.09l0.24,-0.26l0.87,1.41l-1.58,4.96l-7.34,2.54l-7.28,1.02l-2.34,1.17l-0.12,0.1l-1.74,2.63l-0.86,0.32l-0.49,-0.68l-0.28,-0.12l-0.92,0.12l-2.32,-0.25l-0.41,-0.23l-0.15,-0.04l-2.89,0.06l-0.63,0.2l-0.91,-0.59l-0.43,0.11l-0.66,1.27l-0.03,0.21l0.21,0.89l-0.6,0.45Z", "name": "Saudi Arabia"}, "SE": {"path": "M476.42,90.44l-0.15,0.1l-2.43,2.86l-0.07,0.24l0.36,2.31l-3.84,3.1l-4.83,3.38l-0.11,0.15l-1.82,5.45l0.03,0.26l1.78,2.68l2.27,1.99l-2.13,3.88l-2.49,0.82l-0.2,0.24l-0.95,6.05l-1.32,3.09l-2.82,-0.32l-0.3,0.16l-1.34,2.64l-2.48,0.14l-0.76,-3.15l-2.09,-4.04l-1.85,-5.01l1.03,-1.98l2.06,-2.53l0.06,-0.13l0.83,-4.45l-0.06,-0.25l-1.54,-1.86l-0.15,-5.0l1.52,-3.48l2.28,0.06l0.27,-0.16l0.87,-1.59l-0.01,-0.31l-0.8,-1.21l3.79,-5.63l4.07,-7.54l2.23,0.01l0.29,-0.22l0.59,-2.15l4.46,0.66l0.34,-0.26l0.34,-2.64l1.21,-0.14l3.24,2.08l3.78,2.85l0.06,6.37l0.03,0.14l0.67,1.29l-3.95,1.07Z", "name": "Sweden"}, "SD": {"path": "M505.98,259.75l-0.31,-0.9l-0.1,-0.14l-1.2,-0.93l-0.27,-1.66l0.29,-1.83l-0.25,-0.34l-1.16,-0.17l-0.33,0.21l-0.11,0.37l-1.3,0.11l-0.21,0.49l0.55,0.68l0.18,1.29l-1.31,1.33l-1.18,1.72l-1.04,0.21l-2.0,-1.4l-0.32,-0.02l-0.95,0.52l-0.14,0.16l-0.21,0.6l-1.16,0.43l-0.19,0.23l-0.04,0.27l-2.08,0.0l-0.25,-0.39l-0.24,-0.13l-1.81,-0.09l-0.14,0.03l-0.8,0.38l-0.49,-0.16l-1.22,-1.39l-0.42,-0.67l-0.31,-0.14l-1.81,0.35l-0.2,0.14l-0.72,1.24l-0.61,2.14l-0.73,0.4l-0.62,0.22l-0.83,-0.68l-0.12,-0.6l0.38,-0.97l0.01,-1.14l-0.08,-0.2l-1.39,-1.53l-0.25,-0.97l0.03,-0.57l-0.11,-0.25l-0.81,-0.66l-0.03,-1.34l-0.04,-0.14l-0.52,-0.98l-0.31,-0.15l-0.42,0.07l0.12,-0.44l0.63,-1.03l0.03,-0.23l-0.24,-0.88l0.69,-0.66l0.02,-0.41l-0.4,-0.46l0.58,-1.39l1.04,-1.71l1.97,0.16l0.32,-0.3l-0.12,-10.24l0.02,-0.8l2.59,-0.01l0.3,-0.3l0.0,-4.92l29.19,0.0l0.68,2.17l-0.4,0.35l-0.1,0.27l0.36,2.69l0.93,3.15l0.12,0.16l2.05,1.4l-0.99,1.15l-1.75,0.4l-0.15,0.08l-0.79,0.79l-0.08,0.17l-0.24,1.69l-1.07,3.75l-0.0,0.16l0.25,0.96l-0.38,2.1l-0.98,2.41l-1.52,1.3l-1.07,1.94l-0.25,0.99l-1.08,0.64l-0.13,0.18l-0.46,1.65Z", "name": "Sudan"}, "DO": {"path": "M241.7,234.97l0.15,-0.22l1.73,0.01l1.43,0.64l0.15,0.03l0.45,-0.04l0.36,0.74l0.28,0.17l1.02,-0.04l-0.04,0.43l0.27,0.33l1.03,0.09l0.91,0.7l-0.57,0.64l-0.99,-0.47l-0.16,-0.03l-1.11,0.11l-0.79,-0.12l-0.26,0.09l-0.38,0.4l-0.66,0.11l-0.28,-0.45l-0.38,-0.12l-0.83,0.37l-0.14,0.13l-0.85,1.49l-0.27,-0.17l-0.1,-0.58l0.05,-0.67l-0.07,-0.21l-0.44,-0.53l0.35,-0.25l0.12,-0.19l0.19,-1.0l-0.2,-1.4Z", "name": "Dominican Republic"}, "DJ": {"path": "M528.78,253.36l0.34,0.45l-0.06,0.76l-1.26,0.54l-0.05,0.53l0.82,0.53l-0.57,0.83l-0.3,-0.25l-0.27,-0.05l-0.56,0.17l-1.07,-0.03l-0.04,-0.56l-0.16,-0.56l0.76,-1.07l0.76,-0.97l0.89,0.18l0.25,-0.06l0.51,-0.42Z", "name": "Djibouti"}, "DK": {"path": "M452.4,129.07l-1.27,2.39l-2.25,-1.69l-0.26,-1.08l3.15,-1.0l0.63,1.39ZM447.87,126.25l-0.35,0.76l-0.47,-0.24l-0.38,0.09l-1.8,2.53l-0.03,0.29l0.56,1.4l-1.22,0.4l-1.68,-0.41l-0.92,-1.76l-0.07,-3.47l0.38,-0.88l0.62,-0.93l2.07,-0.21l0.19,-0.1l0.84,-0.95l1.5,-0.76l-0.06,1.26l-0.7,1.1l-0.03,0.25l0.3,1.0l0.18,0.19l1.06,0.42Z", "name": "Denmark"}, "DE": {"path": "M445.51,131.69l0.03,0.94l0.21,0.28l2.32,0.74l-0.02,1.0l0.37,0.3l2.55,-0.65l1.36,-0.89l2.63,1.27l1.09,1.01l0.51,1.51l-0.6,0.78l-0.0,0.36l0.88,1.17l0.58,1.68l-0.18,1.08l0.03,0.18l0.87,1.81l-0.66,0.2l-0.55,-0.32l-0.36,0.05l-0.58,0.58l-1.73,0.62l-0.99,0.84l-1.77,0.7l-0.16,0.4l0.42,0.94l0.26,1.34l0.14,0.2l1.25,0.76l1.22,1.2l-0.71,1.2l-0.81,0.37l-0.17,0.32l0.34,1.99l-0.04,0.09l-0.47,-0.39l-0.17,-0.07l-1.2,-0.1l-1.85,0.57l-2.15,-0.13l-0.29,0.18l-0.21,0.5l-0.96,-0.67l-0.24,-0.05l-0.67,0.16l-2.6,-0.94l-0.34,0.1l-0.42,0.57l-1.64,-0.02l0.26,-1.88l1.24,-2.15l-0.21,-0.45l-3.54,-0.58l-0.98,-0.71l0.12,-1.26l-0.05,-0.2l-0.44,-0.64l0.27,-2.18l-0.38,-3.14l1.17,-0.0l0.27,-0.17l0.63,-1.26l0.65,-3.17l-0.02,-0.17l-0.41,-1.0l0.32,-0.47l1.77,-0.16l0.37,0.6l0.47,0.06l1.7,-1.69l0.06,-0.33l-0.55,-1.24l-0.09,-1.51l1.5,0.36l0.16,-0.01l1.22,-0.4Z", "name": "Germany"}, "YE": {"path": "M553.53,242.65l-1.51,0.58l-0.17,0.16l-0.48,1.14l-0.07,0.79l-2.31,1.0l-3.98,1.19l-2.28,1.8l-0.97,0.12l-0.7,-0.14l-0.23,0.05l-1.42,1.03l-1.51,0.47l-2.07,0.13l-0.68,0.15l-0.17,0.1l-0.49,0.6l-0.57,0.16l-0.18,0.13l-0.3,0.49l-1.06,-0.05l-0.13,0.02l-0.73,0.32l-1.48,-0.11l-0.55,-1.26l0.07,-1.32l-0.04,-0.16l-0.39,-0.72l-0.48,-1.85l-0.52,-0.79l0.08,-0.02l0.22,-0.36l-0.23,-1.05l0.24,-0.39l0.04,-0.19l-0.09,-0.95l0.96,-0.72l0.11,-0.31l-0.23,-0.98l0.46,-0.88l0.75,0.49l0.26,0.03l0.63,-0.22l2.76,-0.06l0.5,0.25l2.42,0.26l0.85,-0.11l0.52,0.71l0.35,0.1l1.17,-0.43l0.15,-0.12l1.75,-2.64l2.22,-1.11l6.95,-0.96l2.55,5.58Z", "name": "Yemen"}, "AT": {"path": "M463.17,154.15l-0.14,0.99l-1.15,0.01l-0.24,0.47l0.39,0.56l-0.75,1.84l-0.36,0.4l-2.06,0.07l-0.14,0.04l-1.18,0.67l-1.96,-0.23l-3.43,-0.78l-0.5,-0.97l-0.33,-0.16l-2.47,0.55l-0.2,0.16l-0.18,0.37l-1.27,-0.38l-1.28,-0.09l-0.81,-0.41l0.25,-0.51l0.03,-0.18l-0.05,-0.28l0.35,-0.08l1.16,0.81l0.45,-0.13l0.27,-0.64l2.0,0.12l1.84,-0.57l1.05,0.09l0.71,0.59l0.47,-0.11l0.23,-0.54l0.02,-0.17l-0.32,-1.85l0.69,-0.31l0.13,-0.12l0.73,-1.23l1.61,0.89l0.35,-0.04l1.35,-1.27l0.7,-0.19l1.84,0.93l0.18,0.03l1.08,-0.15l0.81,0.43l-0.07,0.15l-0.02,0.2l0.24,1.06Z", "name": "Austria"}, "DZ": {"path": "M450.58,224.94l-8.31,4.86l-7.23,5.12l-3.46,1.13l-2.42,0.22l-0.02,-1.33l-0.2,-0.28l-1.15,-0.42l-1.45,-0.69l-0.55,-1.13l-0.1,-0.12l-8.45,-5.72l-17.72,-12.17l0.03,-0.38l-0.02,-3.21l3.84,-1.91l2.46,-0.41l2.1,-0.75l0.14,-0.11l0.9,-1.3l2.84,-1.06l0.19,-0.27l0.09,-1.81l1.21,-0.2l0.15,-0.07l1.06,-0.96l3.19,-0.46l0.23,-0.18l0.46,-1.08l-0.08,-0.34l-0.6,-0.54l-0.83,-2.85l-0.18,-1.8l-0.82,-1.57l2.13,-1.37l2.65,-0.49l0.13,-0.05l1.55,-1.15l2.34,-0.85l4.2,-0.51l4.07,-0.23l1.21,0.41l0.23,-0.01l2.3,-1.11l2.52,-0.02l0.94,0.62l0.2,0.05l1.25,-0.13l-0.36,1.03l-0.01,0.14l0.39,2.66l-0.56,2.2l-1.49,1.52l-0.08,0.24l0.22,2.12l0.11,0.2l1.94,1.58l0.02,0.54l0.12,0.23l1.45,1.06l1.04,4.85l0.81,2.42l0.13,1.19l-0.43,2.17l0.17,1.28l-0.31,1.53l0.2,1.56l-0.9,1.02l-0.01,0.38l1.43,1.88l0.09,1.06l0.04,0.13l0.89,1.48l0.37,0.12l1.03,-0.43l1.79,1.12l0.89,1.34Z", "name": "Algeria"}, "US": {"path": "M892.64,99.05l1.16,0.57l0.21,0.02l1.45,-0.38l1.92,0.99l2.17,0.47l-1.65,0.72l-1.75,-0.79l-0.93,-0.7l-0.21,-0.06l-2.11,0.22l-0.35,-0.2l0.09,-0.87ZM183.29,150.37l0.39,1.54l0.12,0.17l0.78,0.55l0.14,0.05l1.74,0.2l2.52,0.5l2.4,0.98l0.17,0.02l1.96,-0.4l3.01,0.81l0.91,-0.02l2.22,-0.88l4.67,2.33l3.86,2.01l0.21,0.71l0.15,0.18l0.33,0.17l-0.02,0.05l0.23,0.43l0.67,0.1l0.21,-0.05l0.1,-0.07l0.05,0.29l0.09,0.16l0.5,0.5l0.21,0.09l0.56,0.0l0.13,0.13l-0.2,0.36l0.12,0.41l2.49,1.39l0.99,5.24l-0.69,1.68l-1.16,1.64l-0.6,1.18l-0.06,0.31l0.04,0.22l0.28,0.43l0.11,0.1l0.85,0.47l0.15,0.04l0.63,0.0l0.14,-0.04l2.87,-1.58l2.6,-0.49l3.28,-1.5l0.17,-0.23l0.04,-0.43l-0.23,-0.93l-0.24,-0.39l0.74,-0.32l4.7,-0.01l0.25,-0.13l0.77,-1.15l2.9,-2.41l1.04,-0.52l8.35,-0.02l0.28,-0.21l0.2,-0.6l0.7,-0.14l1.06,-0.48l0.13,-0.11l0.92,-1.49l0.75,-2.39l1.67,-2.08l0.59,0.6l0.3,0.07l1.52,-0.49l0.88,0.72l-0.0,4.14l0.08,0.2l1.6,1.72l0.31,0.72l-2.42,1.35l-2.55,1.05l-2.64,0.9l-0.14,0.11l-1.33,1.81l-0.44,0.7l-0.05,0.15l-0.03,1.6l0.03,0.14l0.83,1.59l0.24,0.16l0.78,0.06l-1.15,0.33l-1.25,-0.04l-1.83,0.52l-2.51,0.29l-2.17,0.88l-0.17,0.36l0.33,0.22l3.55,-0.54l0.15,0.11l-2.87,0.73l-1.19,0.0l-0.16,-0.33l-0.36,0.06l-0.76,0.82l0.17,0.5l0.42,0.08l-0.45,1.75l-1.4,1.74l-0.04,-0.17l-0.21,-0.22l-0.48,-0.13l-0.77,-0.69l-0.36,-0.03l-0.12,0.34l0.52,1.58l0.09,0.14l0.52,0.43l0.03,0.87l-0.74,1.05l-0.39,0.63l0.05,-0.12l-0.08,-0.34l-1.19,-1.03l-0.28,-2.31l-0.26,-0.26l-0.32,0.19l-0.48,1.27l-0.01,0.19l0.39,1.33l-1.14,-0.31l-0.36,0.18l0.14,0.38l1.57,0.85l0.1,2.58l0.22,0.28l0.55,0.15l0.21,0.81l0.33,2.72l-1.46,1.94l-2.5,0.81l-0.12,0.07l-1.58,1.58l-1.15,0.17l-0.15,0.06l-1.27,1.03l-0.09,0.13l-0.32,0.85l-2.71,1.79l-1.45,1.37l-1.18,1.64l-0.05,0.12l-0.39,1.96l0.0,0.13l0.44,1.91l0.85,2.37l1.1,1.91l0.03,1.2l1.16,3.07l-0.08,1.74l-0.1,0.99l-0.57,1.48l-0.54,0.24l-0.97,-0.26l-0.34,-1.02l-0.12,-0.16l-0.89,-0.58l-2.44,-4.28l-0.34,-0.94l0.49,-1.71l-0.02,-0.21l-0.7,-1.5l-2.0,-2.35l-0.11,-0.08l-0.98,-0.42l-0.25,0.01l-2.42,1.19l-0.26,-0.08l-1.26,-1.29l-1.57,-0.68l-0.16,-0.02l-2.79,0.34l-2.18,-0.3l-1.98,0.19l-1.12,0.45l-0.14,0.44l0.4,0.65l-0.04,1.02l0.09,0.22l0.29,0.3l-0.06,0.05l-0.77,-0.33l-0.26,0.01l-0.87,0.48l-1.64,-0.08l-1.79,-1.39l-0.23,-0.06l-2.11,0.33l-1.75,-0.61l-0.14,-0.01l-1.61,0.2l-2.11,0.64l-0.11,0.06l-2.25,1.99l-2.53,1.21l-1.43,1.38l-0.58,1.22l-0.03,0.12l-0.03,1.86l0.13,1.32l0.3,0.62l-0.46,0.04l-1.71,-0.57l-1.85,-0.79l-0.63,-1.14l-0.54,-1.85l-0.07,-0.12l-1.45,-1.51l-0.86,-1.58l-1.26,-1.87l-0.09,-0.09l-1.76,-1.09l-0.17,-0.04l-2.05,0.05l-0.23,0.12l-1.44,1.97l-1.84,-0.72l-1.19,-0.76l-0.6,-1.45l-0.9,-1.52l-1.49,-1.21l-1.27,-0.87l-0.89,-0.96l-0.22,-0.1l-4.34,-0.0l-0.3,0.3l-0.0,0.84l-6.62,0.02l-5.66,-1.93l-3.48,-1.24l0.11,-0.25l-0.3,-0.42l-3.18,0.3l-2.6,0.2l-0.35,-1.19l-0.08,-0.13l-1.62,-1.61l-0.13,-0.08l-1.02,-0.29l-0.22,-0.66l-0.25,-0.2l-1.31,-0.13l-0.82,-0.7l-0.16,-0.07l-2.25,-0.27l-0.48,-0.34l-0.28,-1.44l-0.07,-0.14l-2.41,-2.84l-2.03,-3.89l0.08,-0.58l-0.1,-0.27l-1.08,-0.94l-1.87,-2.36l-0.33,-2.31l-0.07,-0.15l-1.24,-1.5l0.52,-2.4l-0.09,-2.57l-0.78,-2.3l0.96,-2.83l0.61,-5.66l-0.46,-4.26l-0.79,-2.71l-0.68,-1.4l0.13,-0.26l3.24,0.97l1.28,2.88l0.52,0.06l0.62,-0.84l0.06,-0.22l-0.4,-2.61l-0.74,-2.29l68.9,-0.0l0.3,-0.3l0.01,-0.95l0.32,-0.01ZM32.5,67.43l1.75,1.99l0.41,0.04l1.02,-0.81l3.79,0.25l-0.1,0.72l0.24,0.34l3.83,0.77l2.6,-0.44l5.21,1.41l4.84,0.43l1.9,0.57l0.15,0.01l3.25,-0.71l3.72,1.32l2.52,0.58l-0.03,38.14l0.29,0.3l2.41,0.11l2.34,1.0l1.7,1.59l2.22,2.42l0.42,0.03l2.41,-2.04l2.25,-1.08l1.23,1.76l1.71,1.53l2.24,1.62l1.54,2.56l2.56,4.09l0.11,0.11l4.1,2.17l0.06,1.93l-1.12,1.35l-1.22,-1.14l-2.08,-1.05l-0.68,-2.94l-0.09,-0.16l-3.18,-2.84l-1.32,-3.35l-0.25,-0.19l-2.43,-0.24l-3.93,-0.09l-2.85,-1.02l-5.24,-3.85l-6.77,-2.04l-3.52,0.3l-4.84,-1.7l-2.96,-1.6l-0.23,-0.02l-2.78,0.8l-0.21,0.35l0.46,2.31l-1.11,0.19l-2.9,0.78l-2.24,1.26l-2.42,0.68l-0.29,-1.79l1.07,-3.49l2.54,-1.11l0.12,-0.45l-0.69,-0.96l-0.41,-0.07l-3.19,2.12l-1.76,2.54l-3.57,2.62l-0.03,0.46l1.63,1.59l-2.14,2.38l-2.64,1.49l-2.49,1.09l-0.16,0.17l-0.58,1.48l-3.8,1.79l-0.14,0.14l-0.75,1.57l-2.75,1.41l-1.62,-0.25l-0.16,0.02l-2.35,0.98l-2.54,1.19l-2.06,1.15l-4.05,0.93l-0.1,-0.15l2.45,-1.45l2.49,-1.1l2.61,-1.88l3.03,-0.39l0.19,-0.1l1.2,-1.41l3.43,-2.11l0.61,-0.75l1.81,-1.24l0.13,-0.2l0.42,-2.7l1.24,-2.12l-0.03,-0.35l-0.34,-0.09l-2.73,1.05l-0.67,-0.53l-0.39,0.02l-1.13,1.11l-1.43,-1.62l-0.49,0.06l-0.41,0.8l-0.67,-1.31l-0.42,-0.12l-2.43,1.43l-1.18,-0.0l-0.18,-1.86l0.43,-1.3l-0.09,-0.33l-1.61,-1.33l-0.26,-0.06l-3.11,0.68l-2.0,-1.66l-1.61,-0.85l-0.01,-1.97l-0.11,-0.23l-1.76,-1.48l0.86,-1.96l2.01,-2.13l0.88,-1.94l1.79,-0.25l1.65,0.6l0.31,-0.06l1.91,-1.8l1.67,0.31l0.22,-0.04l1.91,-1.23l0.13,-0.33l-0.47,-1.82l-0.15,-0.19l-1.0,-0.52l1.51,-1.27l0.09,-0.34l-0.29,-0.19l-1.62,0.06l-2.66,0.88l-0.13,0.09l-0.62,0.72l-1.77,-0.8l-0.16,-0.02l-3.48,0.44l-3.5,-0.92l-1.06,-1.61l-2.78,-2.09l3.07,-1.51l5.52,-2.01l1.65,0.0l-0.28,1.73l0.31,0.35l5.29,-0.16l0.23,-0.49l-2.03,-2.59l-0.1,-0.08l-3.03,-1.58l-1.79,-2.12l-2.4,-1.83l-3.18,-1.27l1.13,-1.84l4.28,-0.14l0.15,-0.05l3.16,-2.0l0.13,-0.17l0.57,-2.07l2.43,-2.02l2.42,-0.52l4.67,-1.98l2.22,0.29l0.2,-0.04l3.74,-2.37l3.57,0.91ZM37.66,123.49l-2.31,1.26l-1.04,-0.75l-0.31,-1.35l2.06,-1.16l1.24,-0.51l1.48,0.22l0.76,0.81l-1.89,1.49ZM30.89,233.84l1.2,0.57l0.35,0.3l0.48,0.69l-1.6,0.86l-0.3,0.31l-0.24,-0.14l0.05,-0.54l-0.02,-0.15l-0.36,-0.83l0.05,-0.12l0.39,-0.38l0.07,-0.31l-0.09,-0.27ZM29.06,231.89l0.5,0.14l0.31,0.19l-0.46,0.1l-0.34,-0.43ZM25.02,230.13l0.2,-0.11l0.4,0.47l-0.43,-0.05l-0.17,-0.31ZM21.29,228.68l0.1,-0.07l0.22,0.02l0.02,0.21l-0.02,0.02l-0.32,-0.18ZM6.0,113.33l-1.19,0.45l-1.5,-0.64l-0.94,-0.63l1.76,-0.46l1.71,0.29l0.16,0.98Z", "name": "United States of America"}, "LV": {"path": "M473.99,127.16l0.07,-2.15l1.15,-2.11l2.05,-1.07l1.84,2.48l0.25,0.12l2.01,-0.07l0.29,-0.25l0.45,-2.58l1.85,-0.56l0.98,0.4l2.13,1.33l0.16,0.05l1.97,0.01l1.02,0.7l0.21,1.67l0.71,1.84l-2.44,1.23l-1.36,0.53l-2.28,-1.62l-0.12,-0.05l-1.18,-0.2l-0.28,-0.6l-0.31,-0.17l-2.43,0.35l-4.17,-0.23l-0.12,0.02l-2.45,0.93Z", "name": "Latvia"}, "UY": {"path": "M276.9,363.17l1.3,-0.23l2.4,2.04l0.22,0.07l0.82,-0.07l2.48,1.7l1.93,1.5l1.28,1.67l-0.95,1.14l-0.04,0.31l0.63,1.45l-0.96,1.57l-2.65,1.47l-1.73,-0.53l-0.15,-0.01l-1.25,0.28l-2.22,-1.16l-0.16,-0.03l-1.56,0.08l-1.33,-1.36l0.17,-1.58l0.48,-0.55l0.07,-0.2l-0.02,-2.74l0.66,-2.8l0.57,-2.02Z", "name": "Uruguay"}, "LB": {"path": "M510.44,198.11l-0.48,0.03l-0.26,0.17l-0.15,0.32l-0.21,-0.0l0.72,-1.85l1.19,-1.9l0.74,0.09l0.27,0.73l-1.19,0.93l-0.09,0.13l-0.54,1.36Z", "name": "Lebanon"}, "LA": {"path": "M684.87,248.8l0.61,-0.86l0.05,-0.16l0.11,-2.17l-0.08,-0.22l-1.96,-2.16l-0.15,-2.44l-0.08,-0.18l-1.9,-2.1l-0.19,-0.1l-1.89,-0.18l-0.29,0.15l-0.42,0.76l-1.21,0.06l-0.67,-0.41l-0.31,-0.0l-2.2,1.29l-0.05,-1.77l0.61,-2.7l-0.27,-0.37l-1.44,-0.1l-0.12,-1.31l-0.12,-0.21l-0.87,-0.65l0.38,-0.68l1.76,-1.41l0.08,0.22l0.27,0.2l1.33,0.07l0.31,-0.34l-0.35,-2.75l0.85,-0.25l1.32,1.88l1.11,2.36l0.27,0.17l2.89,0.02l0.78,1.82l-1.32,0.56l-0.12,0.09l-0.72,0.93l0.1,0.45l2.93,1.52l3.62,5.27l1.88,1.78l0.58,1.67l-0.38,2.11l-1.87,-0.79l-0.37,0.11l-0.99,1.54l-1.51,-0.73Z", "name": "Laos"}, "TW": {"path": "M725.6,222.5l-1.5,4.22l-0.82,1.65l-1.01,-1.7l-0.26,-1.8l1.4,-2.48l1.8,-1.81l0.76,0.53l-0.38,1.39Z", "name": "Taiwan"}, "TT": {"path": "M266.35,259.46l0.41,-0.39l0.09,-0.23l-0.04,-0.75l1.14,-0.26l0.2,0.03l-0.07,1.37l-1.73,0.23Z", "name": "Trinidad and Tobago"}, "TR": {"path": "M513.25,175.38l3.63,1.17l0.14,0.01l2.88,-0.45l2.11,0.26l0.18,-0.03l2.9,-1.53l2.51,-0.13l2.25,1.37l0.36,0.88l-0.23,1.36l0.19,0.33l1.81,0.72l0.61,0.53l-1.31,0.64l-0.16,0.34l0.76,3.24l-0.44,0.8l0.01,0.3l1.19,2.02l-0.71,0.29l-0.74,-0.62l-0.15,-0.07l-2.91,-0.37l-0.15,0.02l-1.04,0.43l-2.78,0.44l-1.44,-0.03l-2.83,1.06l-1.95,0.01l-1.28,-0.52l-0.2,-0.01l-2.62,0.76l-0.7,-0.48l-0.47,0.22l-0.13,1.49l-1.01,0.94l-0.58,-0.82l0.79,-0.9l0.04,-0.34l-0.31,-0.15l-1.46,0.23l-2.03,-0.64l-0.3,0.07l-1.65,1.58l-3.58,0.3l-1.94,-1.47l-0.17,-0.06l-2.7,-0.1l-0.28,0.17l-0.51,1.06l-1.47,0.29l-2.32,-1.46l-0.17,-0.05l-2.55,0.05l-1.4,-2.7l-1.72,-1.54l1.11,-2.06l-0.07,-0.37l-1.35,-1.19l2.47,-2.51l3.74,-0.11l0.26,-0.17l0.96,-2.07l4.56,0.38l0.19,-0.05l2.97,-1.92l2.84,-0.83l4.03,-0.06l4.31,2.08ZM488.85,176.8l-1.81,1.38l-0.57,-1.01l0.02,-0.36l0.45,-0.25l0.13,-0.15l0.78,-1.87l-0.11,-0.37l-0.72,-0.47l1.91,-0.71l1.89,0.35l0.25,0.97l0.17,0.2l1.87,0.83l-0.19,0.31l-2.82,0.16l-0.18,0.07l-1.06,0.91Z", "name": "Turkey"}, "LK": {"path": "M625.44,266.07l-0.35,2.4l-0.9,0.61l-1.91,0.5l-1.04,-1.75l-0.43,-3.5l1.0,-3.6l1.34,1.09l1.13,1.72l1.16,2.52Z", "name": "Sri Lanka"}, "TN": {"path": "M444.91,206.18l-0.99,-4.57l-0.12,-0.18l-1.43,-1.04l-0.02,-0.53l-0.11,-0.22l-1.95,-1.59l-0.19,-1.85l1.44,-1.47l0.08,-0.14l0.59,-2.34l-0.38,-2.77l0.44,-1.28l2.52,-1.08l1.41,0.28l-0.06,1.2l0.43,0.28l1.81,-0.9l0.02,0.06l-1.14,1.28l-0.08,0.2l-0.02,1.32l0.11,0.24l0.74,0.6l-0.29,2.18l-1.56,1.35l-0.09,0.32l0.48,1.54l0.28,0.21l1.11,0.04l0.55,1.17l0.15,0.14l0.76,0.35l-0.12,1.79l-1.1,0.72l-0.8,0.91l-1.68,1.04l-0.13,0.32l0.25,1.08l-0.18,0.96l-0.74,0.39Z", "name": "Tunisia"}, "TL": {"path": "M734.21,307.22l0.17,-0.34l1.99,-0.52l1.72,-0.08l0.78,-0.3l0.29,0.1l-0.43,0.32l-2.57,1.09l-1.71,0.59l-0.05,-0.49l-0.19,-0.36Z", "name": "East Timor"}, "TM": {"path": "M553.16,173.51l-0.12,1.0l-0.26,-0.65l0.38,-0.34ZM553.54,173.16l0.13,-0.12l0.43,-0.09l-0.56,0.21ZM555.68,172.6l0.65,-0.14l1.53,0.76l1.71,2.29l0.27,0.12l1.27,-0.14l2.81,-0.04l0.29,-0.38l-0.35,-1.27l1.98,-0.97l1.96,-1.63l3.05,1.44l0.25,2.23l0.14,0.22l0.96,0.61l0.18,0.05l2.61,-0.13l0.68,0.44l1.2,2.97l0.1,0.13l2.85,2.03l1.67,1.41l2.66,1.45l3.13,1.17l-0.05,1.23l-0.36,-0.04l-1.12,-0.73l-0.44,0.14l-0.34,0.89l-1.96,0.52l-0.22,0.23l-0.47,2.17l-1.26,0.78l-1.93,0.42l-0.21,0.18l-0.46,1.14l-1.64,0.33l-2.3,-0.97l-0.2,-2.23l-0.28,-0.27l-1.76,-0.1l-2.78,-2.48l-0.15,-0.07l-1.95,-0.31l-2.82,-1.48l-1.78,-0.27l-0.18,0.03l-1.03,0.51l-1.6,-0.08l-0.22,0.08l-1.72,1.6l-1.83,0.46l-0.39,-1.7l0.36,-3.0l-0.16,-0.3l-1.73,-0.88l0.57,-1.77l-0.25,-0.39l-1.33,-0.14l0.41,-1.85l2.05,0.63l0.21,-0.01l2.2,-0.95l0.09,-0.49l-1.78,-1.75l-0.69,-1.66l-0.07,-0.03Z", "name": "Turkmenistan"}, "TJ": {"path": "M597.99,178.71l-0.23,0.23l-2.57,-0.47l-0.35,0.25l-0.24,1.7l0.32,0.34l2.66,-0.22l3.15,0.95l4.47,-0.42l0.58,2.45l0.39,0.21l0.71,-0.25l1.22,0.53l-0.06,1.01l0.29,1.28l-2.19,-0.0l-1.71,-0.21l-0.23,0.07l-1.51,1.25l-1.05,0.27l-0.77,0.51l-0.71,-0.67l0.22,-2.28l-0.24,-0.32l-0.43,-0.08l0.17,-0.57l-0.16,-0.36l-1.36,-0.66l-0.34,0.05l-1.08,1.01l-0.09,0.15l-0.25,1.09l-0.24,0.26l-1.36,-0.05l-0.27,0.14l-0.65,1.06l-0.58,-0.39l-0.3,-0.02l-1.68,0.86l-0.36,-0.16l1.28,-2.65l0.02,-0.2l-0.54,-2.17l-0.18,-0.21l-1.53,-0.58l0.41,-0.82l1.89,0.13l0.26,-0.12l1.19,-1.63l0.77,-1.82l2.66,-0.55l-0.33,0.87l0.01,0.23l0.36,0.82l0.3,0.18l0.23,-0.02Z", "name": "Tajikistan"}, "LS": {"path": "M493.32,359.69l0.69,0.65l-0.65,1.12l-0.38,0.8l-1.27,0.39l-0.18,0.15l-0.4,0.77l-0.59,0.18l-1.59,-1.78l1.16,-1.5l1.3,-1.02l0.97,-0.46l0.94,0.72Z", "name": "Lesotho"}, "TH": {"path": "M677.42,253.68l-1.7,-0.88l-0.14,-0.03l-1.77,0.04l0.3,-1.64l-0.3,-0.35l-2.21,0.01l-0.3,0.28l-0.2,2.76l-2.15,5.9l-0.02,0.13l0.17,1.83l0.28,0.27l1.45,0.07l0.93,2.1l0.44,2.15l0.08,0.15l1.4,1.44l0.16,0.09l1.43,0.27l1.04,1.05l-0.58,0.73l-1.24,0.22l-0.15,-0.99l-0.15,-0.22l-2.04,-1.1l-0.36,0.06l-0.23,0.23l-0.72,-0.71l-0.41,-1.18l-0.06,-0.11l-1.33,-1.42l-1.22,-1.2l-0.5,0.13l-0.15,0.54l-0.14,-0.41l0.26,-1.48l0.73,-2.38l1.2,-2.57l1.37,-2.35l0.02,-0.27l-0.95,-2.26l0.03,-1.19l-0.29,-1.42l-0.06,-0.13l-1.65,-2.0l-0.46,-0.99l0.62,-0.34l0.13,-0.15l0.92,-2.23l-0.02,-0.27l-1.05,-1.74l-1.57,-1.86l-1.04,-1.96l0.76,-0.34l0.16,-0.16l1.07,-2.63l1.58,-0.1l0.16,-0.06l1.43,-1.11l1.24,-0.52l0.84,0.62l0.13,1.43l0.28,0.27l1.34,0.09l-0.54,2.39l0.05,2.39l0.45,0.25l2.48,-1.45l0.6,0.36l0.17,0.04l1.47,-0.07l0.25,-0.15l0.41,-0.73l1.58,0.15l1.76,1.93l0.15,2.44l0.08,0.18l1.94,2.15l-0.1,1.96l-0.66,0.93l-2.25,-0.34l-3.24,0.49l-0.19,0.12l-1.6,2.12l-0.06,0.24l0.48,2.46Z", "name": "Thailand"}, "TF": {"path": "M593.76,417.73l1.38,0.84l2.15,0.37l0.04,0.31l-0.59,1.24l-3.36,0.19l-0.05,-1.38l0.43,-1.56Z", "name": "French Southern and Antarctic Lands"}, "TG": {"path": "M425.23,269.29l-1.49,0.4l-0.43,-0.68l-0.64,-1.54l-0.18,-1.16l0.54,-2.21l-0.04,-0.24l-0.59,-0.86l-0.23,-1.9l0.0,-1.82l-0.07,-0.19l-0.95,-1.19l0.1,-0.41l1.58,0.04l-0.23,0.97l0.08,0.28l1.55,1.55l0.09,1.13l0.08,0.19l0.42,0.43l-0.11,5.66l0.52,1.53Z", "name": "Togo"}, "TD": {"path": "M457.57,252.46l0.23,-1.08l-0.28,-0.36l-1.32,-0.05l0.0,-1.35l-0.1,-0.22l-0.9,-0.82l0.99,-3.1l3.12,-2.37l0.12,-0.23l0.13,-3.33l0.95,-5.2l0.53,-1.09l-0.07,-0.36l-0.94,-0.81l-0.03,-0.7l-0.12,-0.23l-0.84,-0.61l-0.57,-3.76l2.21,-1.26l19.67,9.88l0.12,9.74l-1.83,-0.15l-0.28,0.14l-1.14,1.89l-0.68,1.62l0.05,0.31l0.33,0.38l-0.61,0.58l-0.08,0.3l0.25,0.93l-0.58,0.95l-0.29,1.01l0.34,0.37l0.67,-0.11l0.39,0.73l0.03,1.4l0.11,0.23l0.8,0.65l-0.01,0.24l-1.38,0.37l-0.11,0.06l-1.27,1.03l-1.83,2.76l-2.21,1.1l-2.34,-0.15l-0.82,0.25l-0.2,0.37l0.19,0.68l-1.16,0.79l-1.01,0.94l-2.92,0.89l-0.5,-0.46l-0.17,-0.08l-0.41,-0.05l-0.28,0.12l-0.38,0.54l-1.36,0.12l0.1,-0.18l0.01,-0.27l-0.78,-1.72l-0.35,-1.03l-0.17,-0.18l-1.03,-0.41l-1.29,-1.28l0.36,-0.78l0.9,0.2l0.14,-0.0l0.67,-0.17l1.36,0.02l0.26,-0.45l-1.32,-2.22l0.09,-1.64l-0.17,-1.68l-0.04,-0.13l-0.93,-1.53Z", "name": "Chad"}, "LY": {"path": "M457.99,226.38l-1.57,0.87l-1.25,-1.28l-0.13,-0.08l-3.85,-1.11l-1.04,-1.57l-0.09,-0.09l-1.98,-1.23l-0.27,-0.02l-0.93,0.39l-0.72,-1.2l-0.09,-1.07l-0.06,-0.16l-1.33,-1.75l0.83,-0.94l0.07,-0.24l-0.21,-1.64l0.31,-1.43l-0.17,-1.29l0.43,-2.26l-0.15,-1.33l-0.73,-2.18l0.99,-0.52l0.16,-0.21l0.22,-1.16l-0.22,-1.06l1.54,-0.95l0.81,-0.92l1.19,-0.78l0.14,-0.23l0.12,-1.76l2.57,0.84l0.16,0.01l0.99,-0.23l2.01,0.45l3.19,1.2l1.12,2.36l0.2,0.16l2.24,0.53l3.5,1.14l2.65,1.36l0.29,-0.01l1.22,-0.71l1.27,-1.32l0.07,-0.29l-0.55,-2.0l0.69,-1.19l1.7,-1.23l1.61,-0.35l3.2,0.54l0.78,1.14l0.24,0.13l0.85,0.01l0.84,0.47l2.35,0.31l0.42,0.63l-0.79,1.16l-0.04,0.26l0.35,1.08l-0.61,1.6l-0.0,0.2l0.73,2.16l0.0,24.24l-2.58,0.01l-0.3,0.29l-0.02,0.62l-19.55,-9.83l-0.28,0.01l-2.53,1.44Z", "name": "Libya"}, "AE": {"path": "M550.59,223.8l0.12,0.08l1.92,-0.41l3.54,0.15l0.23,-0.09l1.71,-1.79l1.86,-1.7l1.31,-1.36l0.26,0.5l0.28,1.72l-0.93,0.01l-0.3,0.26l-0.21,1.73l0.11,0.27l0.08,0.06l-0.7,0.32l-0.17,0.27l-0.01,0.99l-0.68,1.02l-0.05,0.15l-0.06,0.96l-0.32,0.36l-7.19,-1.27l-0.79,-2.22Z", "name": "United Arab Emirates"}, "VE": {"path": "M240.66,256.5l0.65,0.91l-0.03,1.13l-1.05,1.39l-0.03,0.31l0.95,2.0l0.32,0.17l1.08,-0.16l0.24,-0.21l0.56,-1.83l-0.06,-0.29l-0.71,-0.81l-0.1,-1.58l2.9,-0.96l0.19,-0.37l-0.29,-1.02l0.45,-0.41l0.72,1.43l0.26,0.16l1.65,0.04l1.46,1.27l0.08,0.72l0.3,0.27l2.28,0.02l2.55,-0.25l1.34,1.06l0.14,0.06l1.92,0.31l0.2,-0.03l1.4,-0.79l0.15,-0.25l0.02,-0.36l2.82,-0.14l1.17,-0.01l-0.41,0.14l-0.14,0.46l0.86,1.19l0.22,0.12l1.93,0.18l1.73,1.13l0.37,1.9l0.31,0.24l1.21,-0.05l0.52,0.32l-1.63,1.21l-0.11,0.17l-0.22,0.92l0.07,0.27l0.63,0.69l-0.31,0.24l-1.48,0.39l-0.22,0.3l0.04,1.03l-0.59,0.6l-0.01,0.41l1.67,1.87l0.23,0.48l-0.72,0.76l-2.71,0.91l-1.78,0.39l-0.13,0.06l-0.6,0.49l-1.84,-0.58l-1.89,-0.33l-0.18,0.03l-0.47,0.23l-0.02,0.53l0.96,0.56l-0.08,1.58l0.35,1.58l0.26,0.23l1.91,0.19l0.02,0.07l-1.54,0.62l-0.18,0.2l-0.25,0.92l-0.88,0.35l-1.85,0.58l-0.16,0.13l-0.4,0.64l-1.66,0.14l-1.22,-1.18l-0.79,-2.52l-0.67,-0.88l-0.66,-0.43l0.99,-0.98l0.09,-0.26l-0.09,-0.56l-0.08,-0.16l-0.66,-0.69l-0.47,-1.54l0.18,-1.67l0.55,-0.85l0.45,-1.35l-0.15,-0.36l-0.89,-0.43l-0.19,-0.02l-1.39,0.28l-1.76,-0.13l-0.92,0.23l-1.64,-2.01l-0.17,-0.1l-1.54,-0.33l-3.05,0.23l-0.5,-0.73l-0.15,-0.12l-0.45,-0.15l-0.05,-0.28l0.28,-0.86l0.01,-0.15l-0.2,-1.01l-0.08,-0.15l-0.5,-0.5l-0.3,-1.08l-0.25,-0.22l-0.89,-0.12l0.54,-1.18l0.29,-1.73l0.66,-0.85l0.94,-0.7l0.09,-0.11l0.3,-0.6Z", "name": "Venezuela"}, "AF": {"path": "M574.42,192.1l2.24,0.95l0.18,0.02l1.89,-0.38l0.22,-0.18l0.46,-1.14l1.82,-0.4l1.5,-0.91l0.14,-0.19l0.46,-2.12l1.93,-0.51l0.2,-0.18l0.26,-0.68l0.87,0.57l0.13,0.05l0.79,0.09l1.35,0.02l1.83,0.59l0.75,0.34l0.26,-0.01l1.66,-0.85l0.7,0.46l0.42,-0.09l0.72,-1.17l1.32,0.05l0.23,-0.1l0.39,-0.43l0.07,-0.14l0.24,-1.08l0.86,-0.81l0.94,0.46l-0.2,0.64l0.23,0.38l0.49,0.09l-0.21,2.15l0.09,0.25l0.99,0.94l0.38,0.03l0.83,-0.57l1.06,-0.27l0.12,-0.06l1.46,-1.21l1.63,0.2l2.4,0.0l0.17,0.32l-1.12,0.25l-1.23,0.52l-2.86,0.33l-2.69,0.6l-0.13,0.06l-1.46,1.25l-0.07,0.36l0.58,1.18l0.25,1.21l-1.13,1.08l-0.09,0.25l0.09,0.98l-0.53,0.79l-2.22,-0.08l-0.28,0.44l0.83,1.57l-1.3,0.58l-0.13,0.11l-1.06,1.69l-0.05,0.18l0.13,1.51l-0.73,0.58l-0.78,-0.22l-0.14,-0.01l-1.91,0.36l-0.23,0.19l-0.2,0.57l-1.65,-0.0l-0.22,0.1l-1.4,1.56l-0.08,0.19l-0.08,2.13l-2.99,1.05l-1.67,-0.23l-0.27,0.1l-0.39,0.46l-1.43,-0.31l-2.43,0.4l-3.69,-1.23l1.96,-2.15l0.08,-0.24l-0.21,-1.78l-0.23,-0.26l-1.69,-0.42l-0.19,-1.62l-0.77,-2.08l0.98,-1.41l-0.14,-0.45l-0.82,-0.31l0.6,-1.79l0.93,-3.21Z", "name": "Afghanistan"}, "IQ": {"path": "M534.42,190.89l0.13,0.14l1.5,0.78l0.15,1.34l-1.13,0.87l-0.11,0.16l-0.58,2.2l0.04,0.24l1.73,2.67l0.12,0.1l2.99,1.49l1.18,1.94l-0.39,1.89l0.29,0.36l0.5,-0.0l0.02,1.17l0.08,0.2l0.83,0.86l-2.36,-0.29l-0.29,0.13l-1.74,2.49l-4.4,-0.21l-7.03,-5.49l-3.73,-1.94l-2.92,-0.74l-0.89,-3.0l5.33,-2.81l0.15,-0.19l0.95,-3.43l-0.2,-2.0l1.19,-0.61l0.11,-0.09l1.23,-1.73l0.92,-0.38l2.75,0.35l0.81,0.68l0.31,0.05l0.94,-0.38l1.5,3.17Z", "name": "Iraq"}, "IS": {"path": "M384.26,87.96l-0.51,2.35l0.08,0.28l2.61,2.58l-2.99,2.83l-7.16,2.72l-2.08,0.7l-9.51,-1.71l1.89,-1.36l-0.07,-0.53l-4.4,-1.59l3.33,-0.59l0.25,-0.32l-0.11,-1.2l-0.25,-0.27l-4.82,-0.88l1.38,-2.2l3.54,-0.57l3.8,2.74l0.33,0.01l3.68,-2.18l3.02,1.12l0.25,-0.02l4.01,-2.18l3.72,0.27Z", "name": "Iceland"}, "IR": {"path": "M556.2,187.5l2.05,-0.52l0.13,-0.07l1.69,-1.57l1.55,0.08l0.15,-0.03l1.02,-0.5l1.64,0.25l2.82,1.48l1.91,0.3l2.8,2.49l0.18,0.08l1.61,0.09l0.19,2.09l-1.0,3.47l-0.69,2.04l0.18,0.38l0.73,0.28l-0.85,1.22l-0.04,0.28l0.81,2.19l0.19,1.72l0.23,0.26l1.69,0.42l0.17,1.43l-2.18,2.39l-0.01,0.4l1.22,1.42l1.0,1.62l0.12,0.11l2.23,1.11l0.06,2.2l0.2,0.27l1.03,0.38l0.14,0.83l-3.38,1.3l-0.18,0.19l-0.87,2.85l-4.44,-0.76l-2.75,-0.62l-2.64,-0.32l-1.01,-3.11l-0.17,-0.19l-1.2,-0.48l-0.18,-0.01l-1.99,0.51l-2.42,1.25l-2.89,-0.84l-2.48,-2.03l-2.41,-0.79l-1.61,-2.47l-1.84,-3.63l-0.36,-0.15l-1.22,0.4l-1.48,-0.84l-0.37,0.06l-0.72,0.82l-1.08,-1.12l-0.02,-1.35l-0.3,-0.29l-0.43,0.0l0.34,-1.64l-0.04,-0.22l-1.29,-2.11l-0.12,-0.11l-3.0,-1.49l-1.62,-2.49l0.52,-1.98l1.18,-0.92l0.11,-0.27l-0.19,-1.66l-0.16,-0.23l-1.55,-0.81l-1.58,-3.33l-1.3,-2.2l0.41,-0.75l0.03,-0.21l-0.73,-3.12l1.2,-0.59l0.35,0.9l1.26,1.35l0.15,0.09l1.81,0.39l0.91,-0.09l0.15,-0.06l2.9,-2.13l0.7,-0.16l0.48,0.56l-0.75,1.26l0.05,0.37l1.56,1.53l0.28,0.08l0.37,-0.09l0.7,1.89l0.21,0.19l2.31,0.59l1.69,1.4l0.15,0.07l3.66,0.49l3.91,-0.76l0.23,-0.19l0.19,-0.52Z", "name": "Iran"}, "AM": {"path": "M530.51,176.08l2.91,-0.39l0.41,0.63l0.11,0.1l0.66,0.36l-0.32,0.47l0.07,0.41l1.1,0.84l-0.53,0.7l0.06,0.42l1.06,0.8l1.01,0.44l0.04,1.56l-0.44,0.04l-0.88,-1.46l0.01,-0.37l-0.3,-0.31l-0.98,0.01l-0.65,-0.69l-0.26,-0.09l-0.38,0.06l-0.97,-0.82l-1.64,-0.65l0.2,-1.2l-0.02,-0.16l-0.28,-0.69Z", "name": "Armenia"}, "IT": {"path": "M451.68,158.58l0.2,0.16l3.3,0.75l-0.22,1.26l0.02,0.18l0.35,0.78l-1.4,-0.32l-0.21,0.03l-2.04,1.1l-0.16,0.29l0.13,1.47l-0.29,0.82l0.02,0.24l0.82,1.57l0.1,0.11l2.28,1.5l1.29,2.53l2.79,2.43l0.2,0.07l1.83,-0.02l0.31,0.34l-0.46,0.39l0.06,0.5l4.06,1.97l2.06,1.49l0.17,0.36l-0.24,0.53l-1.08,-1.07l-0.15,-0.08l-2.18,-0.49l-0.33,0.15l-1.05,1.91l0.11,0.4l1.63,0.98l-0.22,1.12l-0.84,0.14l-0.22,0.15l-1.27,2.38l-0.54,0.12l0.01,-0.47l0.48,-1.46l0.5,-0.58l0.03,-0.35l-0.97,-1.69l-0.76,-1.48l-0.17,-0.15l-0.94,-0.33l-0.68,-1.18l-0.16,-0.13l-1.53,-0.52l-1.03,-1.14l-0.19,-0.1l-1.78,-0.19l-1.88,-1.3l-2.27,-1.94l-1.64,-1.68l-0.76,-2.94l-0.21,-0.21l-1.22,-0.35l-2.01,-1.0l-0.24,-0.01l-1.15,0.42l-0.11,0.07l-1.38,1.36l-0.5,0.11l0.19,-0.87l-0.21,-0.35l-1.19,-0.34l-0.56,-2.06l0.76,-0.82l0.03,-0.36l-0.68,-1.08l0.04,-0.31l0.68,0.42l0.19,0.04l1.21,-0.15l0.14,-0.06l1.18,-0.89l0.25,0.29l0.25,0.1l1.19,-0.1l0.25,-0.18l0.45,-1.04l1.61,0.34l0.19,-0.02l1.1,-0.53l0.17,-0.22l0.15,-0.95l1.19,0.35l0.35,-0.16l0.23,-0.47l2.11,-0.47l0.45,0.89ZM459.35,184.63l-0.71,1.81l0.0,0.23l0.33,0.79l-0.37,1.03l-1.6,-0.91l-1.33,-0.34l-3.24,-1.36l0.23,-0.99l2.73,0.24l3.95,-0.5ZM443.95,175.91l1.26,1.77l-0.31,3.47l-0.82,-0.13l-0.26,0.08l-0.83,0.79l-0.64,-0.52l-0.1,-3.42l-0.44,-1.34l0.91,0.1l0.21,-0.06l1.01,-0.74Z", "name": "Italy"}, "VN": {"path": "M690.8,230.21l-2.86,1.93l-2.09,2.46l-0.06,0.11l-0.55,1.8l0.04,0.26l4.26,6.1l2.31,1.63l1.46,1.97l1.12,4.62l-0.32,4.3l-1.97,1.57l-2.85,1.62l-2.09,2.14l-2.83,2.13l-0.67,-1.19l0.65,-1.58l-0.09,-0.35l-1.47,-1.14l1.67,-0.79l2.57,-0.18l0.22,-0.47l-0.89,-1.24l3.88,-1.8l0.17,-0.24l0.31,-3.05l-0.01,-0.13l-0.56,-1.63l0.44,-2.48l-0.01,-0.15l-0.63,-1.81l-0.08,-0.12l-1.87,-1.77l-3.64,-5.3l-0.11,-0.1l-2.68,-1.39l0.45,-0.59l1.53,-0.65l0.16,-0.39l-0.97,-2.27l-0.27,-0.18l-2.89,-0.02l-1.04,-2.21l-1.28,-1.83l0.96,-0.46l1.97,0.01l2.43,-0.3l0.13,-0.05l1.95,-1.29l1.04,0.85l0.13,0.06l1.98,0.42l-0.32,1.21l0.09,0.3l1.19,1.07l0.12,0.07l1.88,0.51Z", "name": "Vietnam"}, "AR": {"path": "M258.11,341.34l1.4,1.81l0.51,-0.06l0.89,-1.94l2.51,0.1l0.36,0.49l4.6,4.31l0.15,0.08l1.99,0.39l3.01,1.93l2.5,1.01l0.28,0.91l-2.4,3.97l0.17,0.44l2.57,0.74l2.81,0.41l2.09,-0.44l0.14,-0.07l2.27,-2.06l0.09,-0.17l0.38,-2.2l0.88,-0.36l1.05,1.29l-0.04,1.88l-1.98,1.4l-1.72,1.13l-2.84,2.65l-3.34,3.73l-0.07,0.12l-0.63,2.22l-0.67,2.85l0.02,2.73l-0.47,0.54l-0.07,0.17l-0.36,3.28l0.12,0.27l3.03,2.32l-0.31,1.78l0.11,0.29l1.44,1.15l-0.11,1.17l-2.32,3.57l-3.59,1.51l-4.95,0.6l-2.72,-0.29l-0.32,0.38l0.5,1.67l-0.49,2.13l0.01,0.16l0.4,1.29l-1.27,0.88l-2.41,0.39l-2.33,-1.05l-0.31,0.04l-0.97,0.78l-0.11,0.27l0.35,2.98l0.16,0.23l1.69,0.91l0.31,-0.02l1.08,-0.75l0.46,0.96l-2.1,0.88l-2.01,1.89l-0.09,0.18l-0.36,3.05l-0.51,1.42l-2.16,0.01l-0.19,0.07l-1.96,1.59l-0.1,0.15l-0.72,2.34l0.08,0.31l2.46,2.31l0.13,0.07l2.09,0.56l-0.74,2.45l-2.86,1.75l-0.12,0.14l-1.59,3.71l-2.2,1.24l-0.1,0.09l-1.03,1.54l-0.04,0.23l0.81,3.45l0.06,0.13l1.13,1.32l-2.59,-0.57l-5.89,-0.44l-0.92,-1.73l0.05,-2.4l-0.34,-0.3l-1.49,0.19l-0.72,-0.98l-0.2,-3.21l1.79,-1.33l0.1,-0.13l0.79,-2.04l0.02,-0.16l-0.27,-1.52l1.31,-2.69l0.91,-4.15l-0.23,-1.72l0.91,-0.49l0.15,-0.33l-0.27,-1.16l-0.15,-0.2l-0.87,-0.46l0.65,-1.01l-0.04,-0.37l-1.06,-1.09l-0.54,-3.2l0.83,-0.51l0.14,-0.29l-0.42,-3.6l0.58,-2.98l0.64,-2.5l1.41,-1.0l0.12,-0.32l-0.75,-2.8l-0.01,-2.48l1.81,-1.78l0.09,-0.22l-0.06,-2.3l1.39,-2.69l0.03,-0.14l0.01,-2.58l-0.11,-0.24l-0.57,-0.45l-1.1,-4.59l1.49,-2.73l0.04,-0.17l-0.23,-2.59l0.86,-2.38l1.6,-2.48l1.74,-1.65l0.04,-0.39l-0.64,-0.89l0.42,-0.7l0.04,-0.16l-0.08,-4.26l2.55,-1.23l0.16,-0.18l0.86,-2.75l-0.01,-0.22l-0.22,-0.48l1.84,-2.1l3.0,0.59ZM256.77,438.98l-2.1,0.15l-1.18,-1.14l-0.19,-0.08l-1.53,-0.09l-2.38,-0.0l-0.0,-6.28l0.4,0.65l1.25,2.55l0.11,0.12l3.26,2.07l3.19,0.8l-0.82,1.26Z", "name": "Argentina"}, "AU": {"path": "M705.55,353.06l0.09,0.09l0.37,0.05l0.13,-0.35l-0.57,-1.69l0.48,0.3l0.71,0.99l0.34,0.11l0.2,-0.29l-0.04,-1.37l-0.04,-0.14l-1.22,-2.07l-0.28,-0.9l-0.51,-0.69l0.24,-1.33l0.52,-0.7l0.34,-1.32l0.01,-0.13l-0.25,-1.44l0.51,-0.94l0.1,1.03l0.23,0.26l0.32,-0.14l1.01,-1.72l1.94,-0.84l1.27,-1.14l1.84,-0.92l1.0,-0.18l0.6,0.28l0.26,-0.0l1.94,-0.96l1.48,-0.28l0.19,-0.13l0.32,-0.49l0.51,-0.18l1.42,0.05l2.63,-0.76l0.11,-0.06l1.36,-1.15l0.08,-0.1l0.61,-1.33l1.42,-1.27l0.1,-0.19l0.11,-1.03l0.06,-1.32l1.39,-1.74l0.85,1.79l0.4,0.14l1.07,-0.51l0.11,-0.45l-0.77,-1.05l0.53,-0.84l0.86,0.43l0.43,-0.22l0.29,-1.85l1.29,-1.19l0.6,-0.98l1.16,-0.4l0.2,-0.27l0.02,-0.34l0.74,0.2l0.38,-0.27l0.03,-0.44l1.98,-0.61l1.7,1.08l1.36,1.48l0.22,0.1l1.55,0.02l1.57,0.24l0.33,-0.4l-0.48,-1.27l1.09,-1.86l1.06,-0.63l0.1,-0.42l-0.28,-0.46l0.93,-1.24l1.36,-0.8l1.16,0.27l0.14,0.0l2.1,-0.48l0.23,-0.3l-0.05,-1.3l-0.18,-0.26l-1.08,-0.49l0.44,-0.12l1.52,0.58l1.39,1.06l2.11,0.65l0.19,-0.0l0.59,-0.21l1.44,0.72l0.27,0.0l1.37,-0.68l0.84,0.2l0.26,-0.06l0.37,-0.3l0.82,0.89l-0.56,1.14l-0.84,0.91l-0.75,0.07l-0.26,0.38l0.26,0.9l-0.67,1.15l-0.88,1.24l-0.05,0.25l0.18,0.72l0.12,0.17l1.99,1.42l1.96,0.84l1.25,0.86l1.8,1.51l0.19,0.07l0.63,-0.0l1.15,0.58l0.34,0.7l0.17,0.15l2.39,0.88l0.24,-0.02l1.65,-0.88l0.14,-0.16l0.49,-1.37l0.52,-1.19l0.31,-1.39l0.75,-2.02l0.01,-0.19l-0.33,-1.16l0.16,-0.67l0.0,-0.13l-0.28,-1.41l0.3,-1.78l0.42,-0.45l0.05,-0.33l-0.33,-0.73l0.56,-1.25l0.48,-1.39l0.07,-0.69l0.58,-0.59l0.48,0.84l0.17,1.53l0.17,0.24l0.47,0.23l0.09,0.9l0.05,0.14l0.87,1.23l0.17,1.33l-0.09,0.89l0.03,0.15l0.9,2.0l0.43,0.13l1.38,-0.83l0.71,0.92l1.06,0.88l-0.22,0.96l0.0,0.14l0.53,2.2l0.38,1.3l0.15,0.18l0.52,0.26l0.62,2.01l-0.23,1.27l0.02,0.18l0.81,1.76l0.14,0.14l2.69,1.35l3.21,2.21l-0.2,0.4l0.04,0.34l1.39,1.6l0.95,2.78l0.43,0.16l0.79,-0.46l0.85,0.96l0.39,0.05l0.22,-0.15l0.36,2.33l0.09,0.18l1.78,1.63l1.16,1.01l1.9,2.1l0.67,2.05l0.06,1.47l-0.17,1.64l0.03,0.17l1.16,2.22l-0.14,2.28l-0.43,1.24l-0.68,2.44l0.04,1.63l-0.48,1.92l-1.06,2.43l-1.79,1.32l-0.1,0.12l-0.91,2.15l-0.82,1.37l-0.76,2.47l-0.98,1.46l-0.63,2.14l-0.33,2.02l0.1,0.82l-1.21,0.85l-2.71,0.1l-0.13,0.03l-2.31,1.19l-1.21,1.17l-1.34,1.11l-1.89,-1.18l-1.33,-0.46l0.32,-1.24l-0.4,-0.35l-1.46,0.61l-2.06,1.98l-1.99,-0.73l-1.43,-0.46l-1.45,-0.22l-2.32,-0.81l-1.51,-1.67l-0.45,-2.11l-0.6,-1.5l-0.07,-0.11l-1.23,-1.16l-0.16,-0.08l-1.96,-0.28l0.59,-0.99l0.03,-0.24l-0.61,-2.1l-0.54,-0.08l-1.16,1.85l-1.23,0.29l0.73,-0.88l0.06,-0.12l0.37,-1.57l0.93,-1.33l0.05,-0.2l-0.2,-2.07l-0.53,-0.17l-2.01,2.35l-1.52,0.94l-0.12,0.14l-0.82,1.93l-1.5,-0.9l0.07,-1.32l-0.06,-0.2l-1.57,-2.04l-1.15,-0.92l0.3,-0.41l-0.1,-0.44l-3.21,-1.69l-0.13,-0.03l-1.69,-0.08l-2.35,-1.31l-0.16,-0.04l-4.55,0.27l-3.24,0.99l-2.8,0.91l-2.33,-0.18l-0.17,0.03l-2.63,1.41l-2.14,0.64l-0.2,0.19l-0.47,1.42l-0.8,0.99l-1.99,0.06l-1.55,0.24l-2.27,-0.5l-1.79,0.3l-1.71,0.13l-0.19,0.09l-1.38,1.39l-0.58,-0.1l-0.21,0.04l-1.26,0.8l-1.13,0.85l-1.72,-0.1l-1.6,-0.0l-2.58,-1.76l-1.21,-0.49l0.04,-1.19l1.04,-0.32l0.16,-0.12l0.42,-0.64l0.05,-0.19l-0.09,-0.97l0.3,-2.0l-0.28,-1.64l-1.34,-2.84l-0.39,-1.49l0.1,-1.51l-0.04,-0.17l-0.96,-1.72l-0.06,-0.73l-0.09,-0.19l-1.04,-1.01l-0.3,-2.02l-0.05,-0.12l-1.23,-1.83ZM784.95,393.35l2.39,1.01l0.2,0.01l3.26,-0.96l1.19,0.16l0.16,3.19l-0.78,0.95l-0.07,0.16l-0.19,1.83l-0.43,-0.41l-0.44,0.03l-1.61,1.96l-0.4,-0.12l-1.38,-0.09l-1.43,-2.42l-0.37,-2.03l-1.4,-2.53l0.04,-0.94l1.27,0.2Z", "name": "Australia"}, "IL": {"path": "M509.04,199.22l0.71,0.0l0.27,-0.17l0.15,-0.33l0.19,-0.01l0.02,0.73l-0.27,0.34l0.02,0.08l-0.32,0.62l-0.65,-0.27l-0.41,0.19l-0.52,1.85l0.16,0.35l0.14,0.07l-0.17,0.1l-0.14,0.21l-0.11,0.73l0.39,0.33l0.81,-0.26l0.03,0.64l-0.97,3.43l-1.28,-3.67l0.62,-0.78l-0.03,-0.41l0.58,-1.16l0.5,-2.07l0.27,-0.54Z", "name": "Israel"}, "IN": {"path": "M615.84,192.58l2.4,2.97l-0.24,2.17l0.05,0.2l0.94,1.35l-0.06,0.97l-1.46,-0.3l-0.35,0.36l0.7,3.06l0.12,0.18l2.46,1.75l3.11,1.72l-1.23,0.96l-0.1,0.13l-0.97,2.55l0.16,0.38l2.41,1.02l2.37,1.33l3.27,1.52l3.43,0.37l1.37,1.3l0.17,0.08l1.92,0.25l3.0,0.62l2.15,-0.04l0.28,-0.22l0.29,-1.06l0.0,-0.13l-0.32,-1.66l0.16,-0.94l1.0,-0.37l0.23,2.28l0.18,0.24l2.28,1.02l0.2,0.02l1.52,-0.41l2.06,0.18l2.08,-0.08l0.29,-0.27l0.18,-1.66l-0.1,-0.26l-0.53,-0.44l1.38,-0.23l0.15,-0.07l2.26,-2.0l2.75,-1.65l1.97,0.63l0.25,-0.03l1.54,-0.99l0.89,1.28l-0.72,0.97l0.2,0.48l2.49,0.37l0.11,0.61l-0.69,0.39l-0.15,0.3l0.15,1.22l-1.36,-0.37l-0.23,0.03l-3.24,1.86l-0.15,0.28l0.07,1.44l-1.33,2.16l-0.04,0.13l-0.12,1.24l-0.98,1.91l-1.72,-0.53l-0.39,0.28l-0.09,2.66l-0.52,0.83l-0.04,0.23l0.21,0.89l-0.71,0.36l-1.21,-3.85l-0.29,-0.21l-0.69,0.01l-0.29,0.23l-0.28,1.17l-0.84,-0.84l0.6,-1.17l0.97,-0.13l0.23,-0.16l1.15,-2.25l-0.18,-0.42l-1.54,-0.47l-2.3,0.04l-2.13,-0.33l-0.19,-1.63l-0.26,-0.26l-1.13,-0.13l-1.93,-1.13l-0.42,0.13l-0.88,1.82l0.08,0.37l1.47,1.15l-1.21,0.77l-0.1,0.1l-0.56,0.97l0.13,0.42l1.31,0.61l-0.36,1.35l0.01,0.2l0.85,1.95l0.37,2.05l-0.26,0.68l-1.55,-0.02l-3.09,0.54l-0.25,0.32l0.13,1.84l-1.21,1.4l-3.64,1.79l-2.79,3.04l-1.86,1.61l-2.48,1.68l-0.13,0.25l-0.0,1.0l-1.07,0.55l-2.21,0.9l-1.13,0.13l-0.25,0.19l-0.75,1.96l-0.02,0.15l0.52,3.31l0.13,2.03l-1.03,2.35l-0.03,0.12l-0.01,4.03l-1.02,0.1l-0.23,0.15l-1.14,1.93l0.04,0.36l0.44,0.48l-1.83,0.57l-0.18,0.15l-0.81,1.65l-0.74,0.53l-2.14,-2.12l-1.14,-3.47l-0.96,-2.57l-0.9,-1.26l-1.3,-2.38l-0.61,-3.14l-0.44,-1.62l-2.29,-3.56l-1.03,-4.94l-0.74,-3.29l0.01,-3.12l-0.49,-2.51l-0.41,-0.22l-3.56,1.53l-1.59,-0.28l-2.96,-2.87l0.94,-0.74l0.06,-0.41l-0.74,-1.03l-2.73,-2.1l1.35,-1.43l5.38,0.01l0.29,-0.36l-0.5,-2.29l-0.09,-0.15l-1.33,-1.28l-0.27,-1.96l-0.12,-0.2l-1.36,-1.0l2.42,-2.48l2.77,0.2l0.24,-0.1l2.62,-2.85l1.59,-2.8l2.41,-2.74l0.07,-0.2l-0.04,-1.82l2.01,-1.51l-0.01,-0.49l-1.95,-1.33l-0.83,-1.81l-0.82,-2.27l0.98,-0.97l3.64,0.66l2.89,-0.42l0.17,-0.08l2.18,-2.15Z", "name": "India"}, "TZ": {"path": "M505.77,287.58l0.36,0.23l8.95,5.03l0.15,1.3l0.13,0.21l3.4,2.37l-1.07,2.88l-0.02,0.14l0.15,1.42l0.15,0.23l1.47,0.84l0.05,0.42l-0.66,1.44l-0.02,0.18l0.13,0.72l-0.16,1.16l0.03,0.19l0.87,1.57l1.03,2.48l0.12,0.14l0.53,0.32l-1.59,1.18l-2.64,0.95l-1.45,-0.04l-0.2,0.07l-0.81,0.69l-1.64,0.06l-0.68,0.3l-2.9,-0.69l-1.71,0.17l-0.65,-3.18l-0.05,-0.12l-1.35,-1.88l-0.19,-0.12l-2.41,-0.46l-1.38,-0.74l-1.63,-0.44l-0.96,-0.41l-0.95,-0.58l-1.31,-3.09l-1.47,-1.46l-0.45,-1.31l0.24,-1.34l-0.39,-1.99l0.71,-0.08l0.18,-0.09l0.91,-0.91l0.98,-1.31l0.59,-0.5l0.11,-0.24l-0.02,-0.81l-0.08,-0.2l-0.47,-0.5l-0.1,-0.67l0.51,-0.23l0.18,-0.25l0.14,-1.47l-0.05,-0.2l-0.76,-1.09l0.45,-0.15l2.71,0.03l5.01,-0.19Z", "name": "Tanzania"}, "AZ": {"path": "M539.36,175.66l0.16,0.09l1.11,0.2l0.32,-0.15l0.4,-0.71l1.22,-0.99l1.11,1.33l1.26,2.09l0.22,0.14l1.06,0.13l0.28,0.29l-1.46,0.17l-0.26,0.24l-0.43,2.26l-0.39,0.92l-0.85,0.63l-0.12,0.25l0.06,1.2l-0.22,0.05l-1.28,-1.25l0.74,-1.25l-0.03,-0.35l-0.74,-0.86l-0.3,-0.1l-1.05,0.27l-2.49,1.82l-0.04,-1.46l-0.18,-0.27l-1.09,-0.47l-0.8,-0.6l0.53,-0.7l-0.06,-0.42l-1.11,-0.84l0.34,-0.51l-0.11,-0.43l-0.89,-0.48l-0.33,-0.49l0.25,-0.2l1.78,0.81l1.35,0.18l0.25,-0.09l0.34,-0.35l0.02,-0.39l-1.04,-1.36l0.28,-0.18l0.49,0.07l1.65,1.74ZM533.53,180.16l0.63,0.67l0.22,0.09l0.8,-0.0l0.04,0.31l0.66,1.09l-0.94,-0.21l-1.16,-1.24l-0.25,-0.71Z", "name": "Azerbaijan"}, "IE": {"path": "M405.17,135.35l0.36,2.16l-1.78,2.84l-4.28,1.91l-3.02,-0.43l1.81,-3.13l0.02,-0.26l-1.23,-3.26l3.24,-2.56l1.54,-1.32l0.37,1.33l-0.49,1.77l0.3,0.38l1.49,-0.05l1.68,0.63Z", "name": "Ireland"}, "ID": {"path": "M756.56,287.86l0.69,4.02l0.15,0.21l2.59,1.5l0.39,-0.07l2.05,-2.61l2.75,-1.45l2.09,-0.0l2.08,0.85l1.85,0.89l2.52,0.46l0.08,15.44l-1.72,-1.6l-0.15,-0.07l-2.54,-0.51l-0.29,0.1l-0.53,0.62l-2.53,0.06l0.78,-1.51l1.48,-0.66l0.17,-0.34l-0.65,-2.74l-1.23,-2.19l-0.14,-0.13l-4.85,-2.13l-2.09,-0.23l-3.7,-2.28l-0.41,0.1l-0.67,1.11l-0.63,0.14l-0.41,-0.67l-0.01,-1.01l-0.14,-0.25l-1.39,-0.89l2.05,-0.69l1.73,0.05l0.29,-0.39l-0.21,-0.66l-0.29,-0.21l-3.5,-0.0l-0.9,-1.36l-0.19,-0.13l-2.14,-0.44l-0.65,-0.76l2.86,-0.51l1.28,-0.79l3.75,0.96l0.32,0.76ZM758.01,300.37l-0.79,1.04l-0.14,-1.07l0.4,-0.81l0.29,-0.47l0.24,0.31l-0.0,1.0ZM747.45,292.9l0.48,1.02l-1.45,-0.69l-2.09,-0.21l-1.45,0.16l-1.28,-0.07l0.35,-0.81l2.86,-0.1l2.58,0.68ZM741.15,285.69l-0.16,-0.25l-0.72,-3.08l0.47,-1.86l0.35,-0.38l0.1,0.73l0.25,0.26l1.28,0.19l0.18,0.78l-0.11,1.8l-0.96,-0.18l-0.35,0.22l-0.38,1.52l0.05,0.24ZM741.19,285.75l0.76,0.97l-0.11,0.05l-0.65,-1.02ZM739.18,293.52l-0.61,0.54l-1.44,-0.38l-0.25,-0.55l1.93,-0.09l0.36,0.48ZM728.4,295.87l-0.27,-0.07l-2.26,0.89l-0.37,-0.41l0.27,-0.8l-0.09,-0.33l-1.68,-1.37l0.17,-2.29l-0.42,-0.3l-1.67,0.76l-0.17,0.29l0.21,2.92l0.09,3.34l-1.22,0.28l-0.78,-0.54l0.65,-2.1l0.01,-0.14l-0.39,-2.42l-0.29,-0.25l-0.86,-0.02l-0.63,-1.4l0.99,-1.61l0.35,-1.97l1.24,-3.73l0.49,-0.96l1.95,-1.7l1.86,0.69l3.16,0.35l2.92,-0.1l0.17,-0.06l2.24,-1.65l0.11,0.14l-1.8,2.22l-1.72,0.44l-2.41,-0.48l-4.21,0.13l-2.19,0.36l-0.25,0.24l-0.36,1.9l0.08,0.27l2.24,2.23l0.4,0.02l1.29,-1.08l3.19,-0.58l-0.19,0.06l-1.04,1.4l-2.13,0.94l-0.12,0.45l2.26,3.06l-0.37,0.69l0.03,0.32l1.51,1.95ZM728.48,295.97l0.59,0.76l-0.02,1.37l-1.0,0.55l-0.64,-0.58l1.09,-1.84l-0.02,-0.26ZM728.64,286.95l0.79,-0.14l-0.07,0.39l-0.72,-0.24ZM732.38,310.1l-1.89,0.49l-0.06,-0.06l0.17,-0.64l1.0,-1.42l2.14,-0.87l0.1,0.2l0.04,0.58l-1.49,1.72ZM728.26,305.71l-0.17,0.63l-3.53,0.67l-3.02,-0.28l-0.0,-0.42l1.66,-0.44l1.47,0.71l0.16,0.03l1.75,-0.21l1.69,-0.69ZM722.98,310.33l-0.74,0.03l-2.52,-1.35l1.42,-0.3l1.19,0.7l0.72,0.63l-0.06,0.28ZM716.24,305.63l0.66,0.49l0.22,0.06l1.35,-0.18l0.31,0.53l-4.18,0.77l-0.8,-0.01l0.51,-0.86l1.2,-0.02l0.24,-0.12l0.49,-0.65ZM715.84,280.21l0.09,0.34l2.25,1.86l-2.25,0.22l-0.24,0.17l-0.84,1.71l-0.03,0.15l0.1,2.11l-2.27,1.62l-0.13,0.24l-0.06,2.46l-0.74,2.92l-0.02,-0.05l-0.39,-0.16l-2.62,1.04l-0.86,-1.33l-0.23,-0.14l-1.71,-0.14l-1.19,-0.76l-0.25,-0.03l-2.78,0.84l-0.79,-1.05l-0.26,-0.12l-1.61,0.13l-1.8,-0.25l-0.36,-3.13l-0.15,-0.23l-1.18,-0.65l-1.13,-2.02l-0.33,-2.1l0.27,-2.19l1.05,-1.17l0.28,1.12l0.1,0.16l1.71,1.41l0.28,0.05l1.55,-0.49l1.54,0.17l0.23,-0.07l1.4,-1.21l1.05,-0.19l2.3,0.68l0.16,0.0l2.04,-0.53l0.21,-0.19l1.26,-3.41l0.91,-0.82l0.09,-0.14l0.8,-2.64l2.63,0.0l1.71,0.33l-1.19,1.89l0.02,0.34l1.74,2.24l-0.37,1.0ZM692.67,302.0l0.26,0.19l4.8,0.25l0.28,-0.16l0.44,-0.83l4.29,1.12l0.85,1.52l0.23,0.15l3.71,0.45l2.37,1.15l-2.06,0.69l-2.77,-1.0l-2.25,0.07l-2.57,-0.18l-2.31,-0.45l-2.94,-0.97l-1.84,-0.25l-0.13,0.01l-0.97,0.29l-4.34,-0.98l-0.38,-0.94l-0.25,-0.19l-1.76,-0.14l1.31,-1.84l2.81,0.14l1.97,0.96l0.95,0.19l0.28,0.74ZM685.63,299.27l-2.36,0.04l-2.07,-2.05l-3.17,-2.02l-1.06,-1.5l-1.88,-2.02l-1.22,-1.85l-1.9,-3.49l-2.2,-2.11l-0.71,-2.08l-0.94,-1.99l-0.1,-0.12l-2.21,-1.54l-1.35,-2.17l-1.86,-1.39l-2.53,-2.68l-0.14,-0.81l1.22,0.08l3.76,0.47l2.16,2.4l1.94,1.7l1.37,1.04l2.35,2.67l0.22,0.1l2.44,0.04l1.99,1.62l1.42,2.06l0.09,0.09l1.67,1.0l-0.88,1.8l0.11,0.39l1.44,0.87l0.13,0.04l0.68,0.05l0.41,1.62l0.87,1.4l0.22,0.14l1.71,0.21l1.06,1.38l-0.61,3.04l-0.09,3.6Z", "name": "Indonesia"}, "UA": {"path": "M500.54,141.42l0.9,0.13l0.27,-0.11l0.52,-0.62l0.68,0.13l2.43,-0.3l1.32,1.57l-0.45,0.48l-0.07,0.26l0.21,1.03l0.27,0.24l1.85,0.15l0.76,1.22l-0.05,0.55l0.2,0.31l3.18,1.15l0.18,0.01l1.75,-0.47l1.42,1.41l0.22,0.09l1.42,-0.03l3.44,0.99l0.02,0.65l-0.97,1.62l-0.03,0.24l0.52,1.67l-0.29,0.79l-2.24,0.22l-0.14,0.05l-1.29,0.89l-0.13,0.23l-0.07,1.16l-1.75,0.22l-0.12,0.04l-1.6,0.98l-2.27,0.16l-0.12,0.04l-2.16,1.17l-0.16,0.29l0.15,1.94l0.14,0.23l1.23,0.75l0.18,0.04l2.06,-0.15l-0.22,0.51l-2.67,0.54l-3.27,1.72l-1.0,-0.45l0.45,-1.19l-0.19,-0.39l-2.34,-0.78l0.15,-0.2l2.32,-1.0l0.09,-0.49l-0.73,-0.72l-0.15,-0.08l-3.69,-0.75l-0.14,-0.96l-0.35,-0.25l-2.32,0.39l-0.21,0.15l-0.91,1.7l-1.77,2.1l-0.93,-0.44l-0.24,-0.0l-1.05,0.45l-0.48,-0.25l0.13,-0.07l0.14,-0.15l0.43,-1.04l0.67,-0.97l0.04,-0.26l-0.1,-0.31l0.04,-0.02l0.11,0.19l0.24,0.15l1.48,0.09l0.78,-0.25l0.07,-0.53l-0.27,-0.19l0.09,-0.25l-0.08,-0.33l-0.81,-0.74l-0.34,-1.24l-0.14,-0.18l-0.73,-0.42l0.15,-0.87l-0.11,-0.29l-1.13,-0.86l-0.15,-0.06l-0.97,-0.11l-1.79,-0.97l-0.2,-0.03l-1.66,0.32l-0.13,0.06l-0.52,0.41l-0.95,-0.0l-0.23,0.11l-0.56,0.66l-1.74,0.29l-0.79,0.43l-1.01,-0.68l-0.16,-0.05l-1.57,-0.01l-1.52,-0.35l-0.23,0.04l-0.71,0.45l-0.09,-0.43l-0.13,-0.19l-1.18,-0.74l0.38,-1.02l0.53,-0.64l0.35,0.12l0.37,-0.41l-0.57,-1.29l2.1,-2.5l1.16,-0.36l0.2,-0.2l0.27,-0.92l-0.01,-0.2l-1.1,-2.52l0.79,-0.09l0.13,-0.05l1.3,-0.86l1.83,-0.07l2.48,0.26l2.84,0.8l1.91,0.06l0.88,0.45l0.29,-0.01l0.72,-0.44l0.49,0.58l0.25,0.11l2.2,-0.16l0.94,0.3l0.39,-0.26l0.15,-1.57l0.61,-0.59l2.01,-0.19Z", "name": "Ukraine"}, "QA": {"path": "M548.47,221.47l-0.15,-1.72l0.59,-1.23l0.38,-0.16l0.54,0.6l0.04,1.4l-0.47,1.37l-0.41,0.11l-0.53,-0.37Z", "name": "Qatar"}, "MZ": {"path": "M507.71,314.14l1.65,-0.18l2.96,0.7l0.2,-0.02l0.6,-0.29l1.68,-0.06l0.18,-0.07l0.8,-0.69l1.5,0.02l2.74,-0.98l1.74,-1.27l0.25,0.7l-0.1,2.47l0.31,2.27l0.1,3.97l0.42,1.24l-0.7,1.71l-0.94,1.73l-1.52,1.52l-5.06,2.21l-2.88,2.8l-1.01,0.51l-1.72,1.81l-0.99,0.58l-0.15,0.23l-0.21,1.86l0.04,0.19l1.17,1.95l0.47,1.47l0.03,0.74l0.39,0.28l0.05,-0.01l-0.06,2.13l-0.39,1.19l0.1,0.33l0.42,0.32l-0.28,0.83l-0.95,0.86l-2.03,0.88l-3.08,1.49l-1.1,0.99l-0.09,0.28l0.21,1.13l0.21,0.23l0.38,0.11l-0.14,0.89l-1.39,-0.02l-0.17,-0.94l-0.38,-1.23l-0.2,-0.89l0.44,-2.91l-0.01,-0.14l-0.65,-1.88l-1.15,-3.55l2.52,-2.85l0.68,-1.89l0.29,-0.18l0.14,-0.2l0.28,-1.53l-0.03,-0.19l-0.36,-0.7l0.1,-1.83l0.49,-1.84l-0.01,-3.26l-0.14,-0.25l-1.3,-0.83l-0.11,-0.04l-1.08,-0.17l-0.47,-0.55l-0.1,-0.08l-1.16,-0.54l-0.13,-0.03l-1.83,0.04l-0.32,-2.25l7.19,-1.99l1.32,1.12l0.29,0.06l0.55,-0.19l0.75,0.49l0.11,0.81l-0.49,1.11l-0.02,0.15l0.19,1.81l0.09,0.18l1.63,1.59l0.48,-0.1l0.72,-1.68l0.99,-0.49l0.17,-0.29l-0.21,-3.29l-0.04,-0.13l-1.11,-1.92l-0.9,-0.82l-0.21,-0.08l-0.62,0.03l-0.63,-2.98l0.61,-1.67Z", "name": "Mozambique"}}, "height": 440.7063107441331, "projection": {"type": "mill", "centralMeridian": 11.5}, "width": 900.0}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/knob/jquery.knob.js b/theme/bootstrap/plugins/knob/jquery.knob.js new file mode 100644 index 0000000..5294ffa --- /dev/null +++ b/theme/bootstrap/plugins/knob/jquery.knob.js @@ -0,0 +1,805 @@ +/*!jQuery Knob*/ +/** + * Downward compatible, touchable dial + * + * Version: 1.2.11 + * Requires: jQuery v1.7+ + * + * Copyright (c) 2012 Anthony Terrien + * Under MIT License (http://www.opensource.org/licenses/mit-license.php) + * + * Thanks to vor, eskimoblood, spiffistan, FabrizioC + */ +(function (factory) { + if (typeof exports === 'object') { + // CommonJS + module.exports = factory(require('jquery')); + } else if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else { + // Browser globals + factory(jQuery); + } +}(function ($) { + + /** + * Kontrol library + */ + "use strict"; + + /** + * Definition of globals and core + */ + var k = {}, // kontrol + max = Math.max, + min = Math.min; + + k.c = {}; + k.c.d = $(document); + k.c.t = function (e) { + return e.originalEvent.touches.length - 1; + }; + + /** + * Kontrol Object + * + * Definition of an abstract UI control + * + * Each concrete component must call this one. + * <code> + * k.o.call(this); + * </code> + */ + k.o = function () { + var s = this; + + this.o = null; // array of options + this.$ = null; // jQuery wrapped element + this.i = null; // mixed HTMLInputElement or array of HTMLInputElement + this.g = null; // deprecated 2D graphics context for 'pre-rendering' + this.v = null; // value ; mixed array or integer + this.cv = null; // change value ; not commited value + this.x = 0; // canvas x position + this.y = 0; // canvas y position + this.w = 0; // canvas width + this.h = 0; // canvas height + this.$c = null; // jQuery canvas element + this.c = null; // rendered canvas context + this.t = 0; // touches index + this.isInit = false; + this.fgColor = null; // main color + this.pColor = null; // previous color + this.dH = null; // draw hook + this.cH = null; // change hook + this.eH = null; // cancel hook + this.rH = null; // release hook + this.scale = 1; // scale factor + this.relative = false; + this.relativeWidth = false; + this.relativeHeight = false; + this.$div = null; // component div + + this.run = function () { + var cf = function (e, conf) { + var k; + for (k in conf) { + s.o[k] = conf[k]; + } + s._carve().init(); + s._configure() + ._draw(); + }; + + if (this.$.data('kontroled')) return; + this.$.data('kontroled', true); + + this.extend(); + this.o = $.extend({ + // Config + min: this.$.data('min') !== undefined ? this.$.data('min') : 0, + max: this.$.data('max') !== undefined ? this.$.data('max') : 100, + stopper: true, + readOnly: this.$.data('readonly') || (this.$.attr('readonly') === 'readonly'), + + // UI + cursor: this.$.data('cursor') === true && 30 + || this.$.data('cursor') || 0, + thickness: this.$.data('thickness') + && Math.max(Math.min(this.$.data('thickness'), 1), 0.01) + || 0.35, + lineCap: this.$.data('linecap') || 'butt', + width: this.$.data('width') || 200, + height: this.$.data('height') || 200, + displayInput: this.$.data('displayinput') == null || this.$.data('displayinput'), + displayPrevious: this.$.data('displayprevious'), + fgColor: this.$.data('fgcolor') || '#87CEEB', + inputColor: this.$.data('inputcolor'), + font: this.$.data('font') || 'Arial', + fontWeight: this.$.data('font-weight') || 'bold', + inline: false, + step: this.$.data('step') || 1, + rotation: this.$.data('rotation'), + + // Hooks + draw: null, // function () {} + change: null, // function (value) {} + cancel: null, // function () {} + release: null, // function (value) {} + + // Output formatting, allows to add unit: %, ms ... + format: function(v) { + return v; + }, + parse: function (v) { + return parseFloat(v); + } + }, this.o + ); + + // finalize options + this.o.flip = this.o.rotation === 'anticlockwise' || this.o.rotation === 'acw'; + if (!this.o.inputColor) { + this.o.inputColor = this.o.fgColor; + } + + // routing value + if (this.$.is('fieldset')) { + + // fieldset = array of integer + this.v = {}; + this.i = this.$.find('input'); + this.i.each(function(k) { + var $this = $(this); + s.i[k] = $this; + s.v[k] = s.o.parse($this.val()); + + $this.bind( + 'change blur', + function () { + var val = {}; + val[k] = $this.val(); + s.val(s._validate(val)); + } + ); + }); + this.$.find('legend').remove(); + } else { + + // input = integer + this.i = this.$; + this.v = this.o.parse(this.$.val()); + this.v === '' && (this.v = this.o.min); + this.$.bind( + 'change blur', + function () { + s.val(s._validate(s.o.parse(s.$.val()))); + } + ); + + } + + !this.o.displayInput && this.$.hide(); + + // adds needed DOM elements (canvas, div) + this.$c = $(document.createElement('canvas')).attr({ + width: this.o.width, + height: this.o.height + }); + + // wraps all elements in a div + // add to DOM before Canvas init is triggered + this.$div = $('<div style="' + + (this.o.inline ? 'display:inline;' : '') + + 'width:' + this.o.width + 'px;height:' + this.o.height + 'px;' + + '"></div>'); + + this.$.wrap(this.$div).before(this.$c); + this.$div = this.$.parent(); + + if (typeof G_vmlCanvasManager !== 'undefined') { + G_vmlCanvasManager.initElement(this.$c[0]); + } + + this.c = this.$c[0].getContext ? this.$c[0].getContext('2d') : null; + + if (!this.c) { + throw { + name: "CanvasNotSupportedException", + message: "Canvas not supported. Please use excanvas on IE8.0.", + toString: function(){return this.name + ": " + this.message} + } + } + + // hdpi support + this.scale = (window.devicePixelRatio || 1) / ( + this.c.webkitBackingStorePixelRatio || + this.c.mozBackingStorePixelRatio || + this.c.msBackingStorePixelRatio || + this.c.oBackingStorePixelRatio || + this.c.backingStorePixelRatio || 1 + ); + + // detects relative width / height + this.relativeWidth = this.o.width % 1 !== 0 + && this.o.width.indexOf('%'); + this.relativeHeight = this.o.height % 1 !== 0 + && this.o.height.indexOf('%'); + this.relative = this.relativeWidth || this.relativeHeight; + + // computes size and carves the component + this._carve(); + + // prepares props for transaction + if (this.v instanceof Object) { + this.cv = {}; + this.copy(this.v, this.cv); + } else { + this.cv = this.v; + } + + // binds configure event + this.$ + .bind("configure", cf) + .parent() + .bind("configure", cf); + + // finalize init + this._listen() + ._configure() + ._xy() + .init(); + + this.isInit = true; + + this.$.val(this.o.format(this.v)); + this._draw(); + + return this; + }; + + this._carve = function() { + if (this.relative) { + var w = this.relativeWidth ? + this.$div.parent().width() * + parseInt(this.o.width) / 100 + : this.$div.parent().width(), + h = this.relativeHeight ? + this.$div.parent().height() * + parseInt(this.o.height) / 100 + : this.$div.parent().height(); + + // apply relative + this.w = this.h = Math.min(w, h); + } else { + this.w = this.o.width; + this.h = this.o.height; + } + + // finalize div + this.$div.css({ + 'width': this.w + 'px', + 'height': this.h + 'px' + }); + + // finalize canvas with computed width + this.$c.attr({ + width: this.w, + height: this.h + }); + + // scaling + if (this.scale !== 1) { + this.$c[0].width = this.$c[0].width * this.scale; + this.$c[0].height = this.$c[0].height * this.scale; + this.$c.width(this.w); + this.$c.height(this.h); + } + + return this; + } + + this._draw = function () { + + // canvas pre-rendering + var d = true; + + s.g = s.c; + + s.clear(); + + s.dH && (d = s.dH()); + + d !== false && s.draw(); + }; + + this._touch = function (e) { + var touchMove = function (e) { + var v = s.xy2val( + e.originalEvent.touches[s.t].pageX, + e.originalEvent.touches[s.t].pageY + ); + + if (v == s.cv) return; + + if (s.cH && s.cH(v) === false) return; + + s.change(s._validate(v)); + s._draw(); + }; + + // get touches index + this.t = k.c.t(e); + + // First touch + touchMove(e); + + // Touch events listeners + k.c.d + .bind("touchmove.k", touchMove) + .bind( + "touchend.k", + function () { + k.c.d.unbind('touchmove.k touchend.k'); + s.val(s.cv); + } + ); + + return this; + }; + + this._mouse = function (e) { + var mouseMove = function (e) { + var v = s.xy2val(e.pageX, e.pageY); + + if (v == s.cv) return; + + if (s.cH && (s.cH(v) === false)) return; + + s.change(s._validate(v)); + s._draw(); + }; + + // First click + mouseMove(e); + + // Mouse events listeners + k.c.d + .bind("mousemove.k", mouseMove) + .bind( + // Escape key cancel current change + "keyup.k", + function (e) { + if (e.keyCode === 27) { + k.c.d.unbind("mouseup.k mousemove.k keyup.k"); + + if (s.eH && s.eH() === false) + return; + + s.cancel(); + } + } + ) + .bind( + "mouseup.k", + function (e) { + k.c.d.unbind('mousemove.k mouseup.k keyup.k'); + s.val(s.cv); + } + ); + + return this; + }; + + this._xy = function () { + var o = this.$c.offset(); + this.x = o.left; + this.y = o.top; + + return this; + }; + + this._listen = function () { + if (!this.o.readOnly) { + this.$c + .bind( + "mousedown", + function (e) { + e.preventDefault(); + s._xy()._mouse(e); + } + ) + .bind( + "touchstart", + function (e) { + e.preventDefault(); + s._xy()._touch(e); + } + ); + + this.listen(); + } else { + this.$.attr('readonly', 'readonly'); + } + + if (this.relative) { + $(window).resize(function() { + s._carve().init(); + s._draw(); + }); + } + + return this; + }; + + this._configure = function () { + + // Hooks + if (this.o.draw) this.dH = this.o.draw; + if (this.o.change) this.cH = this.o.change; + if (this.o.cancel) this.eH = this.o.cancel; + if (this.o.release) this.rH = this.o.release; + + if (this.o.displayPrevious) { + this.pColor = this.h2rgba(this.o.fgColor, "0.4"); + this.fgColor = this.h2rgba(this.o.fgColor, "0.6"); + } else { + this.fgColor = this.o.fgColor; + } + + return this; + }; + + this._clear = function () { + this.$c[0].width = this.$c[0].width; + }; + + this._validate = function (v) { + var val = (~~ (((v < 0) ? -0.5 : 0.5) + (v/this.o.step))) * this.o.step; + return Math.round(val * 100) / 100; + }; + + // Abstract methods + this.listen = function () {}; // on start, one time + this.extend = function () {}; // each time configure triggered + this.init = function () {}; // each time configure triggered + this.change = function (v) {}; // on change + this.val = function (v) {}; // on release + this.xy2val = function (x, y) {}; // + this.draw = function () {}; // on change / on release + this.clear = function () { this._clear(); }; + + // Utils + this.h2rgba = function (h, a) { + var rgb; + h = h.substring(1,7) + rgb = [ + parseInt(h.substring(0,2), 16), + parseInt(h.substring(2,4), 16), + parseInt(h.substring(4,6), 16) + ]; + + return "rgba(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + "," + a + ")"; + }; + + this.copy = function (f, t) { + for (var i in f) { + t[i] = f[i]; + } + }; + }; + + + /** + * k.Dial + */ + k.Dial = function () { + k.o.call(this); + + this.startAngle = null; + this.xy = null; + this.radius = null; + this.lineWidth = null; + this.cursorExt = null; + this.w2 = null; + this.PI2 = 2*Math.PI; + + this.extend = function () { + this.o = $.extend({ + bgColor: this.$.data('bgcolor') || '#EEEEEE', + angleOffset: this.$.data('angleoffset') || 0, + angleArc: this.$.data('anglearc') || 360, + inline: true + }, this.o); + }; + + this.val = function (v, triggerRelease) { + if (null != v) { + + // reverse format + v = this.o.parse(v); + + if (triggerRelease !== false + && v != this.v + && this.rH + && this.rH(v) === false) { return; } + + this.cv = this.o.stopper ? max(min(v, this.o.max), this.o.min) : v; + this.v = this.cv; + this.$.val(this.o.format(this.v)); + this._draw(); + } else { + return this.v; + } + }; + + this.xy2val = function (x, y) { + var a, ret; + + a = Math.atan2( + x - (this.x + this.w2), + - (y - this.y - this.w2) + ) - this.angleOffset; + + if (this.o.flip) { + a = this.angleArc - a - this.PI2; + } + + if (this.angleArc != this.PI2 && (a < 0) && (a > -0.5)) { + + // if isset angleArc option, set to min if .5 under min + a = 0; + } else if (a < 0) { + a += this.PI2; + } + + ret = (a * (this.o.max - this.o.min) / this.angleArc) + this.o.min; + + this.o.stopper && (ret = max(min(ret, this.o.max), this.o.min)); + + return ret; + }; + + this.listen = function () { + + // bind MouseWheel + var s = this, mwTimerStop, + mwTimerRelease, + mw = function (e) { + e.preventDefault(); + + var ori = e.originalEvent, + deltaX = ori.detail || ori.wheelDeltaX, + deltaY = ori.detail || ori.wheelDeltaY, + v = s._validate(s.o.parse(s.$.val())) + + ( + deltaX > 0 || deltaY > 0 + ? s.o.step + : deltaX < 0 || deltaY < 0 ? -s.o.step : 0 + ); + + v = max(min(v, s.o.max), s.o.min); + + s.val(v, false); + + if (s.rH) { + // Handle mousewheel stop + clearTimeout(mwTimerStop); + mwTimerStop = setTimeout(function () { + s.rH(v); + mwTimerStop = null; + }, 100); + + // Handle mousewheel releases + if (!mwTimerRelease) { + mwTimerRelease = setTimeout(function () { + if (mwTimerStop) + s.rH(v); + mwTimerRelease = null; + }, 200); + } + } + }, + kval, + to, + m = 1, + kv = { + 37: -s.o.step, + 38: s.o.step, + 39: s.o.step, + 40: -s.o.step + }; + + this.$ + .bind( + "keydown", + function (e) { + var kc = e.keyCode; + + // numpad support + if (kc >= 96 && kc <= 105) { + kc = e.keyCode = kc - 48; + } + + kval = parseInt(String.fromCharCode(kc)); + + if (isNaN(kval)) { + (kc !== 13) // enter + && kc !== 8 // bs + && kc !== 9 // tab + && kc !== 189 // - + && (kc !== 190 + || s.$.val().match(/\./)) // . allowed once + && e.preventDefault(); + + // arrows + if ($.inArray(kc,[37,38,39,40]) > -1) { + e.preventDefault(); + + var v = s.o.parse(s.$.val()) + kv[kc] * m; + s.o.stopper && (v = max(min(v, s.o.max), s.o.min)); + + s.change(s._validate(v)); + s._draw(); + + // long time keydown speed-up + to = window.setTimeout(function () { + m *= 2; + }, 30); + } + } + } + ) + .bind( + "keyup", + function (e) { + if (isNaN(kval)) { + if (to) { + window.clearTimeout(to); + to = null; + m = 1; + s.val(s.$.val()); + } + } else { + // kval postcond + (s.$.val() > s.o.max && s.$.val(s.o.max)) + || (s.$.val() < s.o.min && s.$.val(s.o.min)); + } + } + ); + + this.$c.bind("mousewheel DOMMouseScroll", mw); + this.$.bind("mousewheel DOMMouseScroll", mw) + }; + + this.init = function () { + if (this.v < this.o.min + || this.v > this.o.max) { this.v = this.o.min; } + + this.$.val(this.v); + this.w2 = this.w / 2; + this.cursorExt = this.o.cursor / 100; + this.xy = this.w2 * this.scale; + this.lineWidth = this.xy * this.o.thickness; + this.lineCap = this.o.lineCap; + this.radius = this.xy - this.lineWidth / 2; + + this.o.angleOffset + && (this.o.angleOffset = isNaN(this.o.angleOffset) ? 0 : this.o.angleOffset); + + this.o.angleArc + && (this.o.angleArc = isNaN(this.o.angleArc) ? this.PI2 : this.o.angleArc); + + // deg to rad + this.angleOffset = this.o.angleOffset * Math.PI / 180; + this.angleArc = this.o.angleArc * Math.PI / 180; + + // compute start and end angles + this.startAngle = 1.5 * Math.PI + this.angleOffset; + this.endAngle = 1.5 * Math.PI + this.angleOffset + this.angleArc; + + var s = max( + String(Math.abs(this.o.max)).length, + String(Math.abs(this.o.min)).length, + 2 + ) + 2; + + this.o.displayInput + && this.i.css({ + 'width' : ((this.w / 2 + 4) >> 0) + 'px', + 'height' : ((this.w / 3) >> 0) + 'px', + 'position' : 'absolute', + 'vertical-align' : 'middle', + 'margin-top' : ((this.w / 3) >> 0) + 'px', + 'margin-left' : '-' + ((this.w * 3 / 4 + 2) >> 0) + 'px', + 'border' : 0, + 'background' : 'none', + 'font' : this.o.fontWeight + ' ' + ((this.w / s) >> 0) + 'px ' + this.o.font, + 'text-align' : 'center', + 'color' : this.o.inputColor || this.o.fgColor, + 'padding' : '0px', + '-webkit-appearance': 'none' + }) || this.i.css({ + 'width': '0px', + 'visibility': 'hidden' + }); + }; + + this.change = function (v) { + this.cv = v; + this.$.val(this.o.format(v)); + }; + + this.angle = function (v) { + return (v - this.o.min) * this.angleArc / (this.o.max - this.o.min); + }; + + this.arc = function (v) { + var sa, ea; + v = this.angle(v); + if (this.o.flip) { + sa = this.endAngle + 0.00001; + ea = sa - v - 0.00001; + } else { + sa = this.startAngle - 0.00001; + ea = sa + v + 0.00001; + } + this.o.cursor + && (sa = ea - this.cursorExt) + && (ea = ea + this.cursorExt); + + return { + s: sa, + e: ea, + d: this.o.flip && !this.o.cursor + }; + }; + + this.draw = function () { + var c = this.g, // context + a = this.arc(this.cv), // Arc + pa, // Previous arc + r = 1; + + c.lineWidth = this.lineWidth; + c.lineCap = this.lineCap; + + if (this.o.bgColor !== "none") { + c.beginPath(); + c.strokeStyle = this.o.bgColor; + c.arc(this.xy, this.xy, this.radius, this.endAngle - 0.00001, this.startAngle + 0.00001, true); + c.stroke(); + } + + if (this.o.displayPrevious) { + pa = this.arc(this.v); + c.beginPath(); + c.strokeStyle = this.pColor; + c.arc(this.xy, this.xy, this.radius, pa.s, pa.e, pa.d); + c.stroke(); + r = this.cv == this.v; + } + + c.beginPath(); + c.strokeStyle = r ? this.o.fgColor : this.fgColor ; + c.arc(this.xy, this.xy, this.radius, a.s, a.e, a.d); + c.stroke(); + }; + + this.cancel = function () { + this.val(this.v); + }; + }; + + $.fn.dial = $.fn.knob = function (o) { + return this.each( + function () { + var d = new k.Dial(); + d.o = o; + d.$ = $(this); + d.run(); + } + ).parent(); + }; + +})); diff --git a/theme/bootstrap/plugins/morris/morris.css b/theme/bootstrap/plugins/morris/morris.css new file mode 100644 index 0000000..ed0b490 --- /dev/null +++ b/theme/bootstrap/plugins/morris/morris.css @@ -0,0 +1,2 @@ +.morris-hover{position:absolute;z-index:1090;}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#f9f9f9;background:rgba(0, 0, 0, 0.8);border:solid 2px rgba(0, 0, 0, 0.9);font-weight: 600;font-size:14px;text-align:center;}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:0.25em 0;} +.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:0.1em 0;} diff --git a/theme/bootstrap/plugins/morris/morris.js b/theme/bootstrap/plugins/morris/morris.js new file mode 100644 index 0000000..1664832 --- /dev/null +++ b/theme/bootstrap/plugins/morris/morris.js @@ -0,0 +1,1892 @@ +/* @license +morris.js v0.5.0 +Copyright 2014 Olly Smith All rights reserved. +Licensed under the BSD-2-Clause License. +*/ + + +(function() { + var $, Morris, minutesSpecHelper, secondsSpecHelper, + __slice = [].slice, + __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + Morris = window.Morris = {}; + + $ = jQuery; + + Morris.EventEmitter = (function() { + function EventEmitter() {} + + EventEmitter.prototype.on = function(name, handler) { + if (this.handlers == null) { + this.handlers = {}; + } + if (this.handlers[name] == null) { + this.handlers[name] = []; + } + this.handlers[name].push(handler); + return this; + }; + + EventEmitter.prototype.fire = function() { + var args, handler, name, _i, _len, _ref, _results; + name = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; + if ((this.handlers != null) && (this.handlers[name] != null)) { + _ref = this.handlers[name]; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + handler = _ref[_i]; + _results.push(handler.apply(null, args)); + } + return _results; + } + }; + + return EventEmitter; + + })(); + + Morris.commas = function(num) { + var absnum, intnum, ret, strabsnum; + if (num != null) { + ret = num < 0 ? "-" : ""; + absnum = Math.abs(num); + intnum = Math.floor(absnum).toFixed(0); + ret += intnum.replace(/(?=(?:\d{3})+$)(?!^)/g, ','); + strabsnum = absnum.toString(); + if (strabsnum.length > intnum.length) { + ret += strabsnum.slice(intnum.length); + } + return ret; + } else { + return '-'; + } + }; + + Morris.pad2 = function(number) { + return (number < 10 ? '0' : '') + number; + }; + + Morris.Grid = (function(_super) { + __extends(Grid, _super); + + function Grid(options) { + this.resizeHandler = __bind(this.resizeHandler, this); + var _this = this; + if (typeof options.element === 'string') { + this.el = $(document.getElementById(options.element)); + } else { + this.el = $(options.element); + } + if ((this.el == null) || this.el.length === 0) { + throw new Error("Graph container element not found"); + } + if (this.el.css('position') === 'static') { + this.el.css('position', 'relative'); + } + this.options = $.extend({}, this.gridDefaults, this.defaults || {}, options); + if (typeof this.options.units === 'string') { + this.options.postUnits = options.units; + } + this.raphael = new Raphael(this.el[0]); + this.elementWidth = null; + this.elementHeight = null; + this.dirty = false; + this.selectFrom = null; + if (this.init) { + this.init(); + } + this.setData(this.options.data); + this.el.bind('mousemove', function(evt) { + var left, offset, right, width, x; + offset = _this.el.offset(); + x = evt.pageX - offset.left; + if (_this.selectFrom) { + left = _this.data[_this.hitTest(Math.min(x, _this.selectFrom))]._x; + right = _this.data[_this.hitTest(Math.max(x, _this.selectFrom))]._x; + width = right - left; + return _this.selectionRect.attr({ + x: left, + width: width + }); + } else { + return _this.fire('hovermove', x, evt.pageY - offset.top); + } + }); + this.el.bind('mouseleave', function(evt) { + if (_this.selectFrom) { + _this.selectionRect.hide(); + _this.selectFrom = null; + } + return _this.fire('hoverout'); + }); + this.el.bind('touchstart touchmove touchend', function(evt) { + var offset, touch; + touch = evt.originalEvent.touches[0] || evt.originalEvent.changedTouches[0]; + offset = _this.el.offset(); + return _this.fire('hovermove', touch.pageX - offset.left, touch.pageY - offset.top); + }); + this.el.bind('click', function(evt) { + var offset; + offset = _this.el.offset(); + return _this.fire('gridclick', evt.pageX - offset.left, evt.pageY - offset.top); + }); + if (this.options.rangeSelect) { + this.selectionRect = this.raphael.rect(0, 0, 0, this.el.innerHeight()).attr({ + fill: this.options.rangeSelectColor, + stroke: false + }).toBack().hide(); + this.el.bind('mousedown', function(evt) { + var offset; + offset = _this.el.offset(); + return _this.startRange(evt.pageX - offset.left); + }); + this.el.bind('mouseup', function(evt) { + var offset; + offset = _this.el.offset(); + _this.endRange(evt.pageX - offset.left); + return _this.fire('hovermove', evt.pageX - offset.left, evt.pageY - offset.top); + }); + } + if (this.options.resize) { + $(window).bind('resize', function(evt) { + if (_this.timeoutId != null) { + window.clearTimeout(_this.timeoutId); + } + return _this.timeoutId = window.setTimeout(_this.resizeHandler, 100); + }); + } + this.el.css('-webkit-tap-highlight-color', 'rgba(0,0,0,0)'); + if (this.postInit) { + this.postInit(); + } + } + + Grid.prototype.gridDefaults = { + dateFormat: null, + axes: true, + grid: true, + gridLineColor: '#aaa', + gridStrokeWidth: 0.5, + gridTextColor: '#888', + gridTextSize: 12, + gridTextFamily: 'sans-serif', + gridTextWeight: 'normal', + hideHover: false, + yLabelFormat: null, + xLabelAngle: 0, + numLines: 5, + padding: 25, + parseTime: true, + postUnits: '', + preUnits: '', + ymax: 'auto', + ymin: 'auto 0', + goals: [], + goalStrokeWidth: 1.0, + goalLineColors: ['#666633', '#999966', '#cc6666', '#663333'], + events: [], + eventStrokeWidth: 1.0, + eventLineColors: ['#005a04', '#ccffbb', '#3a5f0b', '#005502'], + rangeSelect: null, + rangeSelectColor: '#eef', + resize: false + }; + + Grid.prototype.setData = function(data, redraw) { + var e, idx, index, maxGoal, minGoal, ret, row, step, total, y, ykey, ymax, ymin, yval, _ref; + if (redraw == null) { + redraw = true; + } + this.options.data = data; + if ((data == null) || data.length === 0) { + this.data = []; + this.raphael.clear(); + if (this.hover != null) { + this.hover.hide(); + } + return; + } + ymax = this.cumulative ? 0 : null; + ymin = this.cumulative ? 0 : null; + if (this.options.goals.length > 0) { + minGoal = Math.min.apply(Math, this.options.goals); + maxGoal = Math.max.apply(Math, this.options.goals); + ymin = ymin != null ? Math.min(ymin, minGoal) : minGoal; + ymax = ymax != null ? Math.max(ymax, maxGoal) : maxGoal; + } + this.data = (function() { + var _i, _len, _results; + _results = []; + for (index = _i = 0, _len = data.length; _i < _len; index = ++_i) { + row = data[index]; + ret = { + src: row + }; + ret.label = row[this.options.xkey]; + if (this.options.parseTime) { + ret.x = Morris.parseDate(ret.label); + if (this.options.dateFormat) { + ret.label = this.options.dateFormat(ret.x); + } else if (typeof ret.label === 'number') { + ret.label = new Date(ret.label).toString(); + } + } else { + ret.x = index; + if (this.options.xLabelFormat) { + ret.label = this.options.xLabelFormat(ret); + } + } + total = 0; + ret.y = (function() { + var _j, _len1, _ref, _results1; + _ref = this.options.ykeys; + _results1 = []; + for (idx = _j = 0, _len1 = _ref.length; _j < _len1; idx = ++_j) { + ykey = _ref[idx]; + yval = row[ykey]; + if (typeof yval === 'string') { + yval = parseFloat(yval); + } + if ((yval != null) && typeof yval !== 'number') { + yval = null; + } + if (yval != null) { + if (this.cumulative) { + total += yval; + } else { + if (ymax != null) { + ymax = Math.max(yval, ymax); + ymin = Math.min(yval, ymin); + } else { + ymax = ymin = yval; + } + } + } + if (this.cumulative && (total != null)) { + ymax = Math.max(total, ymax); + ymin = Math.min(total, ymin); + } + _results1.push(yval); + } + return _results1; + }).call(this); + _results.push(ret); + } + return _results; + }).call(this); + if (this.options.parseTime) { + this.data = this.data.sort(function(a, b) { + return (a.x > b.x) - (b.x > a.x); + }); + } + this.xmin = this.data[0].x; + this.xmax = this.data[this.data.length - 1].x; + this.events = []; + if (this.options.events.length > 0) { + if (this.options.parseTime) { + this.events = (function() { + var _i, _len, _ref, _results; + _ref = this.options.events; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + e = _ref[_i]; + _results.push(Morris.parseDate(e)); + } + return _results; + }).call(this); + } else { + this.events = this.options.events; + } + this.xmax = Math.max(this.xmax, Math.max.apply(Math, this.events)); + this.xmin = Math.min(this.xmin, Math.min.apply(Math, this.events)); + } + if (this.xmin === this.xmax) { + this.xmin -= 1; + this.xmax += 1; + } + this.ymin = this.yboundary('min', ymin); + this.ymax = this.yboundary('max', ymax); + if (this.ymin === this.ymax) { + if (ymin) { + this.ymin -= 1; + } + this.ymax += 1; + } + if (((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'y') || this.options.grid === true) { + if (this.options.ymax === this.gridDefaults.ymax && this.options.ymin === this.gridDefaults.ymin) { + this.grid = this.autoGridLines(this.ymin, this.ymax, this.options.numLines); + this.ymin = Math.min(this.ymin, this.grid[0]); + this.ymax = Math.max(this.ymax, this.grid[this.grid.length - 1]); + } else { + step = (this.ymax - this.ymin) / (this.options.numLines - 1); + this.grid = (function() { + var _i, _ref1, _ref2, _results; + _results = []; + for (y = _i = _ref1 = this.ymin, _ref2 = this.ymax; step > 0 ? _i <= _ref2 : _i >= _ref2; y = _i += step) { + _results.push(y); + } + return _results; + }).call(this); + } + } + this.dirty = true; + if (redraw) { + return this.redraw(); + } + }; + + Grid.prototype.yboundary = function(boundaryType, currentValue) { + var boundaryOption, suggestedValue; + boundaryOption = this.options["y" + boundaryType]; + if (typeof boundaryOption === 'string') { + if (boundaryOption.slice(0, 4) === 'auto') { + if (boundaryOption.length > 5) { + suggestedValue = parseInt(boundaryOption.slice(5), 10); + if (currentValue == null) { + return suggestedValue; + } + return Math[boundaryType](currentValue, suggestedValue); + } else { + if (currentValue != null) { + return currentValue; + } else { + return 0; + } + } + } else { + return parseInt(boundaryOption, 10); + } + } else { + return boundaryOption; + } + }; + + Grid.prototype.autoGridLines = function(ymin, ymax, nlines) { + var gmax, gmin, grid, smag, span, step, unit, y, ymag; + span = ymax - ymin; + ymag = Math.floor(Math.log(span) / Math.log(10)); + unit = Math.pow(10, ymag); + gmin = Math.floor(ymin / unit) * unit; + gmax = Math.ceil(ymax / unit) * unit; + step = (gmax - gmin) / (nlines - 1); + if (unit === 1 && step > 1 && Math.ceil(step) !== step) { + step = Math.ceil(step); + gmax = gmin + step * (nlines - 1); + } + if (gmin < 0 && gmax > 0) { + gmin = Math.floor(ymin / step) * step; + gmax = Math.ceil(ymax / step) * step; + } + if (step < 1) { + smag = Math.floor(Math.log(step) / Math.log(10)); + grid = (function() { + var _i, _results; + _results = []; + for (y = _i = gmin; step > 0 ? _i <= gmax : _i >= gmax; y = _i += step) { + _results.push(parseFloat(y.toFixed(1 - smag))); + } + return _results; + })(); + } else { + grid = (function() { + var _i, _results; + _results = []; + for (y = _i = gmin; step > 0 ? _i <= gmax : _i >= gmax; y = _i += step) { + _results.push(y); + } + return _results; + })(); + } + return grid; + }; + + Grid.prototype._calc = function() { + var bottomOffsets, gridLine, h, i, w, yLabelWidths, _ref, _ref1; + w = this.el.width(); + h = this.el.height(); + if (this.elementWidth !== w || this.elementHeight !== h || this.dirty) { + this.elementWidth = w; + this.elementHeight = h; + this.dirty = false; + this.left = this.options.padding; + this.right = this.elementWidth - this.options.padding; + this.top = this.options.padding; + this.bottom = this.elementHeight - this.options.padding; + if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'y') { + yLabelWidths = (function() { + var _i, _len, _ref1, _results; + _ref1 = this.grid; + _results = []; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + gridLine = _ref1[_i]; + _results.push(this.measureText(this.yAxisFormat(gridLine)).width); + } + return _results; + }).call(this); + this.left += Math.max.apply(Math, yLabelWidths); + } + if ((_ref1 = this.options.axes) === true || _ref1 === 'both' || _ref1 === 'x') { + bottomOffsets = (function() { + var _i, _ref2, _results; + _results = []; + for (i = _i = 0, _ref2 = this.data.length; 0 <= _ref2 ? _i < _ref2 : _i > _ref2; i = 0 <= _ref2 ? ++_i : --_i) { + _results.push(this.measureText(this.data[i].text, -this.options.xLabelAngle).height); + } + return _results; + }).call(this); + this.bottom -= Math.max.apply(Math, bottomOffsets); + } + this.width = Math.max(1, this.right - this.left); + this.height = Math.max(1, this.bottom - this.top); + this.dx = this.width / (this.xmax - this.xmin); + this.dy = this.height / (this.ymax - this.ymin); + if (this.calc) { + return this.calc(); + } + } + }; + + Grid.prototype.transY = function(y) { + return this.bottom - (y - this.ymin) * this.dy; + }; + + Grid.prototype.transX = function(x) { + if (this.data.length === 1) { + return (this.left + this.right) / 2; + } else { + return this.left + (x - this.xmin) * this.dx; + } + }; + + Grid.prototype.redraw = function() { + this.raphael.clear(); + this._calc(); + this.drawGrid(); + this.drawGoals(); + this.drawEvents(); + if (this.draw) { + return this.draw(); + } + }; + + Grid.prototype.measureText = function(text, angle) { + var ret, tt; + if (angle == null) { + angle = 0; + } + tt = this.raphael.text(100, 100, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).rotate(angle); + ret = tt.getBBox(); + tt.remove(); + return ret; + }; + + Grid.prototype.yAxisFormat = function(label) { + return this.yLabelFormat(label); + }; + + Grid.prototype.yLabelFormat = function(label) { + if (typeof this.options.yLabelFormat === 'function') { + return this.options.yLabelFormat(label); + } else { + return "" + this.options.preUnits + (Morris.commas(label)) + this.options.postUnits; + } + }; + + Grid.prototype.drawGrid = function() { + var lineY, y, _i, _len, _ref, _ref1, _ref2, _results; + if (this.options.grid === false && ((_ref = this.options.axes) !== true && _ref !== 'both' && _ref !== 'y')) { + return; + } + _ref1 = this.grid; + _results = []; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + lineY = _ref1[_i]; + y = this.transY(lineY); + if ((_ref2 = this.options.axes) === true || _ref2 === 'both' || _ref2 === 'y') { + this.drawYAxisLabel(this.left - this.options.padding / 2, y, this.yAxisFormat(lineY)); + } + if (this.options.grid) { + _results.push(this.drawGridLine("M" + this.left + "," + y + "H" + (this.left + this.width))); + } else { + _results.push(void 0); + } + } + return _results; + }; + + Grid.prototype.drawGoals = function() { + var color, goal, i, _i, _len, _ref, _results; + _ref = this.options.goals; + _results = []; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + goal = _ref[i]; + color = this.options.goalLineColors[i % this.options.goalLineColors.length]; + _results.push(this.drawGoal(goal, color)); + } + return _results; + }; + + Grid.prototype.drawEvents = function() { + var color, event, i, _i, _len, _ref, _results; + _ref = this.events; + _results = []; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + event = _ref[i]; + color = this.options.eventLineColors[i % this.options.eventLineColors.length]; + _results.push(this.drawEvent(event, color)); + } + return _results; + }; + + Grid.prototype.drawGoal = function(goal, color) { + return this.raphael.path("M" + this.left + "," + (this.transY(goal)) + "H" + this.right).attr('stroke', color).attr('stroke-width', this.options.goalStrokeWidth); + }; + + Grid.prototype.drawEvent = function(event, color) { + return this.raphael.path("M" + (this.transX(event)) + "," + this.bottom + "V" + this.top).attr('stroke', color).attr('stroke-width', this.options.eventStrokeWidth); + }; + + Grid.prototype.drawYAxisLabel = function(xPos, yPos, text) { + return this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor).attr('text-anchor', 'end'); + }; + + Grid.prototype.drawGridLine = function(path) { + return this.raphael.path(path).attr('stroke', this.options.gridLineColor).attr('stroke-width', this.options.gridStrokeWidth); + }; + + Grid.prototype.startRange = function(x) { + this.hover.hide(); + this.selectFrom = x; + return this.selectionRect.attr({ + x: x, + width: 0 + }).show(); + }; + + Grid.prototype.endRange = function(x) { + var end, start; + if (this.selectFrom) { + start = Math.min(this.selectFrom, x); + end = Math.max(this.selectFrom, x); + this.options.rangeSelect.call(this.el, { + start: this.data[this.hitTest(start)].x, + end: this.data[this.hitTest(end)].x + }); + return this.selectFrom = null; + } + }; + + Grid.prototype.resizeHandler = function() { + this.timeoutId = null; + this.raphael.setSize(this.el.width(), this.el.height()); + return this.redraw(); + }; + + return Grid; + + })(Morris.EventEmitter); + + Morris.parseDate = function(date) { + var isecs, m, msecs, n, o, offsetmins, p, q, r, ret, secs; + if (typeof date === 'number') { + return date; + } + m = date.match(/^(\d+) Q(\d)$/); + n = date.match(/^(\d+)-(\d+)$/); + o = date.match(/^(\d+)-(\d+)-(\d+)$/); + p = date.match(/^(\d+) W(\d+)$/); + q = date.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+)(Z|([+-])(\d\d):?(\d\d))?$/); + r = date.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+):(\d+(\.\d+)?)(Z|([+-])(\d\d):?(\d\d))?$/); + if (m) { + return new Date(parseInt(m[1], 10), parseInt(m[2], 10) * 3 - 1, 1).getTime(); + } else if (n) { + return new Date(parseInt(n[1], 10), parseInt(n[2], 10) - 1, 1).getTime(); + } else if (o) { + return new Date(parseInt(o[1], 10), parseInt(o[2], 10) - 1, parseInt(o[3], 10)).getTime(); + } else if (p) { + ret = new Date(parseInt(p[1], 10), 0, 1); + if (ret.getDay() !== 4) { + ret.setMonth(0, 1 + ((4 - ret.getDay()) + 7) % 7); + } + return ret.getTime() + parseInt(p[2], 10) * 604800000; + } else if (q) { + if (!q[6]) { + return new Date(parseInt(q[1], 10), parseInt(q[2], 10) - 1, parseInt(q[3], 10), parseInt(q[4], 10), parseInt(q[5], 10)).getTime(); + } else { + offsetmins = 0; + if (q[6] !== 'Z') { + offsetmins = parseInt(q[8], 10) * 60 + parseInt(q[9], 10); + if (q[7] === '+') { + offsetmins = 0 - offsetmins; + } + } + return Date.UTC(parseInt(q[1], 10), parseInt(q[2], 10) - 1, parseInt(q[3], 10), parseInt(q[4], 10), parseInt(q[5], 10) + offsetmins); + } + } else if (r) { + secs = parseFloat(r[6]); + isecs = Math.floor(secs); + msecs = Math.round((secs - isecs) * 1000); + if (!r[8]) { + return new Date(parseInt(r[1], 10), parseInt(r[2], 10) - 1, parseInt(r[3], 10), parseInt(r[4], 10), parseInt(r[5], 10), isecs, msecs).getTime(); + } else { + offsetmins = 0; + if (r[8] !== 'Z') { + offsetmins = parseInt(r[10], 10) * 60 + parseInt(r[11], 10); + if (r[9] === '+') { + offsetmins = 0 - offsetmins; + } + } + return Date.UTC(parseInt(r[1], 10), parseInt(r[2], 10) - 1, parseInt(r[3], 10), parseInt(r[4], 10), parseInt(r[5], 10) + offsetmins, isecs, msecs); + } + } else { + return new Date(parseInt(date, 10), 0, 1).getTime(); + } + }; + + Morris.Hover = (function() { + Hover.defaults = { + "class": 'morris-hover morris-default-style' + }; + + function Hover(options) { + if (options == null) { + options = {}; + } + this.options = $.extend({}, Morris.Hover.defaults, options); + this.el = $("<div class='" + this.options["class"] + "'></div>"); + this.el.hide(); + this.options.parent.append(this.el); + } + + Hover.prototype.update = function(html, x, y) { + if (!html) { + return this.hide(); + } else { + this.html(html); + this.show(); + return this.moveTo(x, y); + } + }; + + Hover.prototype.html = function(content) { + return this.el.html(content); + }; + + Hover.prototype.moveTo = function(x, y) { + var hoverHeight, hoverWidth, left, parentHeight, parentWidth, top; + parentWidth = this.options.parent.innerWidth(); + parentHeight = this.options.parent.innerHeight(); + hoverWidth = this.el.outerWidth(); + hoverHeight = this.el.outerHeight(); + left = Math.min(Math.max(0, x - hoverWidth / 2), parentWidth - hoverWidth); + if (y != null) { + top = y - hoverHeight - 10; + if (top < 0) { + top = y + 10; + if (top + hoverHeight > parentHeight) { + top = parentHeight / 2 - hoverHeight / 2; + } + } + } else { + top = parentHeight / 2 - hoverHeight / 2; + } + return this.el.css({ + left: left + "px", + top: parseInt(top) + "px" + }); + }; + + Hover.prototype.show = function() { + return this.el.show(); + }; + + Hover.prototype.hide = function() { + return this.el.hide(); + }; + + return Hover; + + })(); + + Morris.Line = (function(_super) { + __extends(Line, _super); + + function Line(options) { + this.hilight = __bind(this.hilight, this); + this.onHoverOut = __bind(this.onHoverOut, this); + this.onHoverMove = __bind(this.onHoverMove, this); + this.onGridClick = __bind(this.onGridClick, this); + if (!(this instanceof Morris.Line)) { + return new Morris.Line(options); + } + Line.__super__.constructor.call(this, options); + } + + Line.prototype.init = function() { + if (this.options.hideHover !== 'always') { + this.hover = new Morris.Hover({ + parent: this.el + }); + this.on('hovermove', this.onHoverMove); + this.on('hoverout', this.onHoverOut); + return this.on('gridclick', this.onGridClick); + } + }; + + Line.prototype.defaults = { + lineWidth: 3, + pointSize: 4, + lineColors: ['#0b62a4', '#7A92A3', '#4da74d', '#afd8f8', '#edc240', '#cb4b4b', '#9440ed'], + pointStrokeWidths: [1], + pointStrokeColors: ['#ffffff'], + pointFillColors: [], + smooth: true, + xLabels: 'auto', + xLabelFormat: null, + xLabelMargin: 24, + hideHover: false + }; + + Line.prototype.calc = function() { + this.calcPoints(); + return this.generatePaths(); + }; + + Line.prototype.calcPoints = function() { + var row, y, _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + row = _ref[_i]; + row._x = this.transX(row.x); + row._y = (function() { + var _j, _len1, _ref1, _results1; + _ref1 = row.y; + _results1 = []; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + y = _ref1[_j]; + if (y != null) { + _results1.push(this.transY(y)); + } else { + _results1.push(y); + } + } + return _results1; + }).call(this); + _results.push(row._ymax = Math.min.apply(Math, [this.bottom].concat((function() { + var _j, _len1, _ref1, _results1; + _ref1 = row._y; + _results1 = []; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + y = _ref1[_j]; + if (y != null) { + _results1.push(y); + } + } + return _results1; + })()))); + } + return _results; + }; + + Line.prototype.hitTest = function(x) { + var index, r, _i, _len, _ref; + if (this.data.length === 0) { + return null; + } + _ref = this.data.slice(1); + for (index = _i = 0, _len = _ref.length; _i < _len; index = ++_i) { + r = _ref[index]; + if (x < (r._x + this.data[index]._x) / 2) { + break; + } + } + return index; + }; + + Line.prototype.onGridClick = function(x, y) { + var index; + index = this.hitTest(x); + return this.fire('click', index, this.data[index].src, x, y); + }; + + Line.prototype.onHoverMove = function(x, y) { + var index; + index = this.hitTest(x); + return this.displayHoverForRow(index); + }; + + Line.prototype.onHoverOut = function() { + if (this.options.hideHover !== false) { + return this.displayHoverForRow(null); + } + }; + + Line.prototype.displayHoverForRow = function(index) { + var _ref; + if (index != null) { + (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(index)); + return this.hilight(index); + } else { + this.hover.hide(); + return this.hilight(); + } + }; + + Line.prototype.hoverContentForRow = function(index) { + var content, j, row, y, _i, _len, _ref; + row = this.data[index]; + content = "<div class='morris-hover-row-label'>" + row.label + "</div>"; + _ref = row.y; + for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) { + y = _ref[j]; + content += "<div class='morris-hover-point' style='color: " + (this.colorFor(row, j, 'label')) + "'>\n " + this.options.labels[j] + ":\n " + (this.yLabelFormat(y)) + "\n</div>"; + } + if (typeof this.options.hoverCallback === 'function') { + content = this.options.hoverCallback(index, this.options, content, row.src); + } + return [content, row._x, row._ymax]; + }; + + Line.prototype.generatePaths = function() { + var coords, i, r, smooth; + return this.paths = (function() { + var _i, _ref, _ref1, _results; + _results = []; + for (i = _i = 0, _ref = this.options.ykeys.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + smooth = typeof this.options.smooth === "boolean" ? this.options.smooth : (_ref1 = this.options.ykeys[i], __indexOf.call(this.options.smooth, _ref1) >= 0); + coords = (function() { + var _j, _len, _ref2, _results1; + _ref2 = this.data; + _results1 = []; + for (_j = 0, _len = _ref2.length; _j < _len; _j++) { + r = _ref2[_j]; + if (r._y[i] !== void 0) { + _results1.push({ + x: r._x, + y: r._y[i] + }); + } + } + return _results1; + }).call(this); + if (coords.length > 1) { + _results.push(Morris.Line.createPath(coords, smooth, this.bottom)); + } else { + _results.push(null); + } + } + return _results; + }).call(this); + }; + + Line.prototype.draw = function() { + var _ref; + if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'x') { + this.drawXAxis(); + } + this.drawSeries(); + if (this.options.hideHover === false) { + return this.displayHoverForRow(this.data.length - 1); + } + }; + + Line.prototype.drawXAxis = function() { + var drawLabel, l, labels, prevAngleMargin, prevLabelMargin, row, ypos, _i, _len, _results, + _this = this; + ypos = this.bottom + this.options.padding / 2; + prevLabelMargin = null; + prevAngleMargin = null; + drawLabel = function(labelText, xpos) { + var label, labelBox, margin, offset, textBox; + label = _this.drawXAxisLabel(_this.transX(xpos), ypos, labelText); + textBox = label.getBBox(); + label.transform("r" + (-_this.options.xLabelAngle)); + labelBox = label.getBBox(); + label.transform("t0," + (labelBox.height / 2) + "..."); + if (_this.options.xLabelAngle !== 0) { + offset = -0.5 * textBox.width * Math.cos(_this.options.xLabelAngle * Math.PI / 180.0); + label.transform("t" + offset + ",0..."); + } + labelBox = label.getBBox(); + if (((prevLabelMargin == null) || prevLabelMargin >= labelBox.x + labelBox.width || (prevAngleMargin != null) && prevAngleMargin >= labelBox.x) && labelBox.x >= 0 && (labelBox.x + labelBox.width) < _this.el.width()) { + if (_this.options.xLabelAngle !== 0) { + margin = 1.25 * _this.options.gridTextSize / Math.sin(_this.options.xLabelAngle * Math.PI / 180.0); + prevAngleMargin = labelBox.x - margin; + } + return prevLabelMargin = labelBox.x - _this.options.xLabelMargin; + } else { + return label.remove(); + } + }; + if (this.options.parseTime) { + if (this.data.length === 1 && this.options.xLabels === 'auto') { + labels = [[this.data[0].label, this.data[0].x]]; + } else { + labels = Morris.labelSeries(this.xmin, this.xmax, this.width, this.options.xLabels, this.options.xLabelFormat); + } + } else { + labels = (function() { + var _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + row = _ref[_i]; + _results.push([row.label, row.x]); + } + return _results; + }).call(this); + } + labels.reverse(); + _results = []; + for (_i = 0, _len = labels.length; _i < _len; _i++) { + l = labels[_i]; + _results.push(drawLabel(l[0], l[1])); + } + return _results; + }; + + Line.prototype.drawSeries = function() { + var i, _i, _j, _ref, _ref1, _results; + this.seriesPoints = []; + for (i = _i = _ref = this.options.ykeys.length - 1; _ref <= 0 ? _i <= 0 : _i >= 0; i = _ref <= 0 ? ++_i : --_i) { + this._drawLineFor(i); + } + _results = []; + for (i = _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; i = _ref1 <= 0 ? ++_j : --_j) { + _results.push(this._drawPointFor(i)); + } + return _results; + }; + + Line.prototype._drawPointFor = function(index) { + var circle, row, _i, _len, _ref, _results; + this.seriesPoints[index] = []; + _ref = this.data; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + row = _ref[_i]; + circle = null; + if (row._y[index] != null) { + circle = this.drawLinePoint(row._x, row._y[index], this.colorFor(row, index, 'point'), index); + } + _results.push(this.seriesPoints[index].push(circle)); + } + return _results; + }; + + Line.prototype._drawLineFor = function(index) { + var path; + path = this.paths[index]; + if (path !== null) { + return this.drawLinePath(path, this.colorFor(null, index, 'line'), index); + } + }; + + Line.createPath = function(coords, smooth, bottom) { + var coord, g, grads, i, ix, lg, path, prevCoord, x1, x2, y1, y2, _i, _len; + path = ""; + if (smooth) { + grads = Morris.Line.gradients(coords); + } + prevCoord = { + y: null + }; + for (i = _i = 0, _len = coords.length; _i < _len; i = ++_i) { + coord = coords[i]; + if (coord.y != null) { + if (prevCoord.y != null) { + if (smooth) { + g = grads[i]; + lg = grads[i - 1]; + ix = (coord.x - prevCoord.x) / 4; + x1 = prevCoord.x + ix; + y1 = Math.min(bottom, prevCoord.y + ix * lg); + x2 = coord.x - ix; + y2 = Math.min(bottom, coord.y - ix * g); + path += "C" + x1 + "," + y1 + "," + x2 + "," + y2 + "," + coord.x + "," + coord.y; + } else { + path += "L" + coord.x + "," + coord.y; + } + } else { + if (!smooth || (grads[i] != null)) { + path += "M" + coord.x + "," + coord.y; + } + } + } + prevCoord = coord; + } + return path; + }; + + Line.gradients = function(coords) { + var coord, grad, i, nextCoord, prevCoord, _i, _len, _results; + grad = function(a, b) { + return (a.y - b.y) / (a.x - b.x); + }; + _results = []; + for (i = _i = 0, _len = coords.length; _i < _len; i = ++_i) { + coord = coords[i]; + if (coord.y != null) { + nextCoord = coords[i + 1] || { + y: null + }; + prevCoord = coords[i - 1] || { + y: null + }; + if ((prevCoord.y != null) && (nextCoord.y != null)) { + _results.push(grad(prevCoord, nextCoord)); + } else if (prevCoord.y != null) { + _results.push(grad(prevCoord, coord)); + } else if (nextCoord.y != null) { + _results.push(grad(coord, nextCoord)); + } else { + _results.push(null); + } + } else { + _results.push(null); + } + } + return _results; + }; + + Line.prototype.hilight = function(index) { + var i, _i, _j, _ref, _ref1; + if (this.prevHilight !== null && this.prevHilight !== index) { + for (i = _i = 0, _ref = this.seriesPoints.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) { + if (this.seriesPoints[i][this.prevHilight]) { + this.seriesPoints[i][this.prevHilight].animate(this.pointShrinkSeries(i)); + } + } + } + if (index !== null && this.prevHilight !== index) { + for (i = _j = 0, _ref1 = this.seriesPoints.length - 1; 0 <= _ref1 ? _j <= _ref1 : _j >= _ref1; i = 0 <= _ref1 ? ++_j : --_j) { + if (this.seriesPoints[i][index]) { + this.seriesPoints[i][index].animate(this.pointGrowSeries(i)); + } + } + } + return this.prevHilight = index; + }; + + Line.prototype.colorFor = function(row, sidx, type) { + if (typeof this.options.lineColors === 'function') { + return this.options.lineColors.call(this, row, sidx, type); + } else if (type === 'point') { + return this.options.pointFillColors[sidx % this.options.pointFillColors.length] || this.options.lineColors[sidx % this.options.lineColors.length]; + } else { + return this.options.lineColors[sidx % this.options.lineColors.length]; + } + }; + + Line.prototype.drawXAxisLabel = function(xPos, yPos, text) { + return this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor); + }; + + Line.prototype.drawLinePath = function(path, lineColor, lineIndex) { + return this.raphael.path(path).attr('stroke', lineColor).attr('stroke-width', this.lineWidthForSeries(lineIndex)); + }; + + Line.prototype.drawLinePoint = function(xPos, yPos, pointColor, lineIndex) { + return this.raphael.circle(xPos, yPos, this.pointSizeForSeries(lineIndex)).attr('fill', pointColor).attr('stroke-width', this.pointStrokeWidthForSeries(lineIndex)).attr('stroke', this.pointStrokeColorForSeries(lineIndex)); + }; + + Line.prototype.pointStrokeWidthForSeries = function(index) { + return this.options.pointStrokeWidths[index % this.options.pointStrokeWidths.length]; + }; + + Line.prototype.pointStrokeColorForSeries = function(index) { + return this.options.pointStrokeColors[index % this.options.pointStrokeColors.length]; + }; + + Line.prototype.lineWidthForSeries = function(index) { + if (this.options.lineWidth instanceof Array) { + return this.options.lineWidth[index % this.options.lineWidth.length]; + } else { + return this.options.lineWidth; + } + }; + + Line.prototype.pointSizeForSeries = function(index) { + if (this.options.pointSize instanceof Array) { + return this.options.pointSize[index % this.options.pointSize.length]; + } else { + return this.options.pointSize; + } + }; + + Line.prototype.pointGrowSeries = function(index) { + return Raphael.animation({ + r: this.pointSizeForSeries(index) + 3 + }, 25, 'linear'); + }; + + Line.prototype.pointShrinkSeries = function(index) { + return Raphael.animation({ + r: this.pointSizeForSeries(index) + }, 25, 'linear'); + }; + + return Line; + + })(Morris.Grid); + + Morris.labelSeries = function(dmin, dmax, pxwidth, specName, xLabelFormat) { + var d, d0, ddensity, name, ret, s, spec, t, _i, _len, _ref; + ddensity = 200 * (dmax - dmin) / pxwidth; + d0 = new Date(dmin); + spec = Morris.LABEL_SPECS[specName]; + if (spec === void 0) { + _ref = Morris.AUTO_LABEL_ORDER; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + name = _ref[_i]; + s = Morris.LABEL_SPECS[name]; + if (ddensity >= s.span) { + spec = s; + break; + } + } + } + if (spec === void 0) { + spec = Morris.LABEL_SPECS["second"]; + } + if (xLabelFormat) { + spec = $.extend({}, spec, { + fmt: xLabelFormat + }); + } + d = spec.start(d0); + ret = []; + while ((t = d.getTime()) <= dmax) { + if (t >= dmin) { + ret.push([spec.fmt(d), t]); + } + spec.incr(d); + } + return ret; + }; + + minutesSpecHelper = function(interval) { + return { + span: interval * 60 * 1000, + start: function(d) { + return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours()); + }, + fmt: function(d) { + return "" + (Morris.pad2(d.getHours())) + ":" + (Morris.pad2(d.getMinutes())); + }, + incr: function(d) { + return d.setUTCMinutes(d.getUTCMinutes() + interval); + } + }; + }; + + secondsSpecHelper = function(interval) { + return { + span: interval * 1000, + start: function(d) { + return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes()); + }, + fmt: function(d) { + return "" + (Morris.pad2(d.getHours())) + ":" + (Morris.pad2(d.getMinutes())) + ":" + (Morris.pad2(d.getSeconds())); + }, + incr: function(d) { + return d.setUTCSeconds(d.getUTCSeconds() + interval); + } + }; + }; + + Morris.LABEL_SPECS = { + "decade": { + span: 172800000000, + start: function(d) { + return new Date(d.getFullYear() - d.getFullYear() % 10, 0, 1); + }, + fmt: function(d) { + return "" + (d.getFullYear()); + }, + incr: function(d) { + return d.setFullYear(d.getFullYear() + 10); + } + }, + "year": { + span: 17280000000, + start: function(d) { + return new Date(d.getFullYear(), 0, 1); + }, + fmt: function(d) { + return "" + (d.getFullYear()); + }, + incr: function(d) { + return d.setFullYear(d.getFullYear() + 1); + } + }, + "month": { + span: 2419200000, + start: function(d) { + return new Date(d.getFullYear(), d.getMonth(), 1); + }, + fmt: function(d) { + return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1)); + }, + incr: function(d) { + return d.setMonth(d.getMonth() + 1); + } + }, + "week": { + span: 604800000, + start: function(d) { + return new Date(d.getFullYear(), d.getMonth(), d.getDate()); + }, + fmt: function(d) { + return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1)) + "-" + (Morris.pad2(d.getDate())); + }, + incr: function(d) { + return d.setDate(d.getDate() + 7); + } + }, + "day": { + span: 86400000, + start: function(d) { + return new Date(d.getFullYear(), d.getMonth(), d.getDate()); + }, + fmt: function(d) { + return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1)) + "-" + (Morris.pad2(d.getDate())); + }, + incr: function(d) { + return d.setDate(d.getDate() + 1); + } + }, + "hour": minutesSpecHelper(60), + "30min": minutesSpecHelper(30), + "15min": minutesSpecHelper(15), + "10min": minutesSpecHelper(10), + "5min": minutesSpecHelper(5), + "minute": minutesSpecHelper(1), + "30sec": secondsSpecHelper(30), + "15sec": secondsSpecHelper(15), + "10sec": secondsSpecHelper(10), + "5sec": secondsSpecHelper(5), + "second": secondsSpecHelper(1) + }; + + Morris.AUTO_LABEL_ORDER = ["decade", "year", "month", "week", "day", "hour", "30min", "15min", "10min", "5min", "minute", "30sec", "15sec", "10sec", "5sec", "second"]; + + Morris.Area = (function(_super) { + var areaDefaults; + + __extends(Area, _super); + + areaDefaults = { + fillOpacity: 'auto', + behaveLikeLine: false + }; + + function Area(options) { + var areaOptions; + if (!(this instanceof Morris.Area)) { + return new Morris.Area(options); + } + areaOptions = $.extend({}, areaDefaults, options); + this.cumulative = !areaOptions.behaveLikeLine; + if (areaOptions.fillOpacity === 'auto') { + areaOptions.fillOpacity = areaOptions.behaveLikeLine ? .8 : 1; + } + Area.__super__.constructor.call(this, areaOptions); + } + + Area.prototype.calcPoints = function() { + var row, total, y, _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + row = _ref[_i]; + row._x = this.transX(row.x); + total = 0; + row._y = (function() { + var _j, _len1, _ref1, _results1; + _ref1 = row.y; + _results1 = []; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + y = _ref1[_j]; + if (this.options.behaveLikeLine) { + _results1.push(this.transY(y)); + } else { + total += y || 0; + _results1.push(this.transY(total)); + } + } + return _results1; + }).call(this); + _results.push(row._ymax = Math.max.apply(Math, row._y)); + } + return _results; + }; + + Area.prototype.drawSeries = function() { + var i, range, _i, _j, _k, _len, _ref, _ref1, _results, _results1, _results2; + this.seriesPoints = []; + if (this.options.behaveLikeLine) { + range = (function() { + _results = []; + for (var _i = 0, _ref = this.options.ykeys.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); } + return _results; + }).apply(this); + } else { + range = (function() { + _results1 = []; + for (var _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; _ref1 <= 0 ? _j++ : _j--){ _results1.push(_j); } + return _results1; + }).apply(this); + } + _results2 = []; + for (_k = 0, _len = range.length; _k < _len; _k++) { + i = range[_k]; + this._drawFillFor(i); + this._drawLineFor(i); + _results2.push(this._drawPointFor(i)); + } + return _results2; + }; + + Area.prototype._drawFillFor = function(index) { + var path; + path = this.paths[index]; + if (path !== null) { + path = path + ("L" + (this.transX(this.xmax)) + "," + this.bottom + "L" + (this.transX(this.xmin)) + "," + this.bottom + "Z"); + return this.drawFilledPath(path, this.fillForSeries(index)); + } + }; + + Area.prototype.fillForSeries = function(i) { + var color; + color = Raphael.rgb2hsl(this.colorFor(this.data[i], i, 'line')); + return Raphael.hsl(color.h, this.options.behaveLikeLine ? color.s * 0.9 : color.s * 0.75, Math.min(0.98, this.options.behaveLikeLine ? color.l * 1.2 : color.l * 1.25)); + }; + + Area.prototype.drawFilledPath = function(path, fill) { + return this.raphael.path(path).attr('fill', fill).attr('fill-opacity', this.options.fillOpacity).attr('stroke', 'none'); + }; + + return Area; + + })(Morris.Line); + + Morris.Bar = (function(_super) { + __extends(Bar, _super); + + function Bar(options) { + this.onHoverOut = __bind(this.onHoverOut, this); + this.onHoverMove = __bind(this.onHoverMove, this); + this.onGridClick = __bind(this.onGridClick, this); + if (!(this instanceof Morris.Bar)) { + return new Morris.Bar(options); + } + Bar.__super__.constructor.call(this, $.extend({}, options, { + parseTime: false + })); + } + + Bar.prototype.init = function() { + this.cumulative = this.options.stacked; + if (this.options.hideHover !== 'always') { + this.hover = new Morris.Hover({ + parent: this.el + }); + this.on('hovermove', this.onHoverMove); + this.on('hoverout', this.onHoverOut); + return this.on('gridclick', this.onGridClick); + } + }; + + Bar.prototype.defaults = { + barSizeRatio: 0.75, + barGap: 3, + barColors: ['#0b62a4', '#7a92a3', '#4da74d', '#afd8f8', '#edc240', '#cb4b4b', '#9440ed'], + barOpacity: 1.0, + barRadius: [0, 0, 0, 0], + xLabelMargin: 50 + }; + + Bar.prototype.calc = function() { + var _ref; + this.calcBars(); + if (this.options.hideHover === false) { + return (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(this.data.length - 1)); + } + }; + + Bar.prototype.calcBars = function() { + var idx, row, y, _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (idx = _i = 0, _len = _ref.length; _i < _len; idx = ++_i) { + row = _ref[idx]; + row._x = this.left + this.width * (idx + 0.5) / this.data.length; + _results.push(row._y = (function() { + var _j, _len1, _ref1, _results1; + _ref1 = row.y; + _results1 = []; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + y = _ref1[_j]; + if (y != null) { + _results1.push(this.transY(y)); + } else { + _results1.push(null); + } + } + return _results1; + }).call(this)); + } + return _results; + }; + + Bar.prototype.draw = function() { + var _ref; + if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'x') { + this.drawXAxis(); + } + return this.drawSeries(); + }; + + Bar.prototype.drawXAxis = function() { + var i, label, labelBox, margin, offset, prevAngleMargin, prevLabelMargin, row, textBox, ypos, _i, _ref, _results; + ypos = this.bottom + (this.options.xAxisLabelTopPadding || this.options.padding / 2); + prevLabelMargin = null; + prevAngleMargin = null; + _results = []; + for (i = _i = 0, _ref = this.data.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + row = this.data[this.data.length - 1 - i]; + label = this.drawXAxisLabel(row._x, ypos, row.label); + textBox = label.getBBox(); + label.transform("r" + (-this.options.xLabelAngle)); + labelBox = label.getBBox(); + label.transform("t0," + (labelBox.height / 2) + "..."); + if (this.options.xLabelAngle !== 0) { + offset = -0.5 * textBox.width * Math.cos(this.options.xLabelAngle * Math.PI / 180.0); + label.transform("t" + offset + ",0..."); + } + if (((prevLabelMargin == null) || prevLabelMargin >= labelBox.x + labelBox.width || (prevAngleMargin != null) && prevAngleMargin >= labelBox.x) && labelBox.x >= 0 && (labelBox.x + labelBox.width) < this.el.width()) { + if (this.options.xLabelAngle !== 0) { + margin = 1.25 * this.options.gridTextSize / Math.sin(this.options.xLabelAngle * Math.PI / 180.0); + prevAngleMargin = labelBox.x - margin; + } + _results.push(prevLabelMargin = labelBox.x - this.options.xLabelMargin); + } else { + _results.push(label.remove()); + } + } + return _results; + }; + + Bar.prototype.drawSeries = function() { + var barWidth, bottom, groupWidth, idx, lastTop, left, leftPadding, numBars, row, sidx, size, spaceLeft, top, ypos, zeroPos; + groupWidth = this.width / this.options.data.length; + numBars = this.options.stacked ? 1 : this.options.ykeys.length; + barWidth = (groupWidth * this.options.barSizeRatio - this.options.barGap * (numBars - 1)) / numBars; + if (this.options.barSize) { + barWidth = Math.min(barWidth, this.options.barSize); + } + spaceLeft = groupWidth - barWidth * numBars - this.options.barGap * (numBars - 1); + leftPadding = spaceLeft / 2; + zeroPos = this.ymin <= 0 && this.ymax >= 0 ? this.transY(0) : null; + return this.bars = (function() { + var _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (idx = _i = 0, _len = _ref.length; _i < _len; idx = ++_i) { + row = _ref[idx]; + lastTop = 0; + _results.push((function() { + var _j, _len1, _ref1, _results1; + _ref1 = row._y; + _results1 = []; + for (sidx = _j = 0, _len1 = _ref1.length; _j < _len1; sidx = ++_j) { + ypos = _ref1[sidx]; + if (ypos !== null) { + if (zeroPos) { + top = Math.min(ypos, zeroPos); + bottom = Math.max(ypos, zeroPos); + } else { + top = ypos; + bottom = this.bottom; + } + left = this.left + idx * groupWidth + leftPadding; + if (!this.options.stacked) { + left += sidx * (barWidth + this.options.barGap); + } + size = bottom - top; + if (this.options.verticalGridCondition && this.options.verticalGridCondition(row.x)) { + this.drawBar(this.left + idx * groupWidth, this.top, groupWidth, Math.abs(this.top - this.bottom), this.options.verticalGridColor, this.options.verticalGridOpacity, this.options.barRadius); + } + if (this.options.stacked) { + top -= lastTop; + } + this.drawBar(left, top, barWidth, size, this.colorFor(row, sidx, 'bar'), this.options.barOpacity, this.options.barRadius); + _results1.push(lastTop += size); + } else { + _results1.push(null); + } + } + return _results1; + }).call(this)); + } + return _results; + }).call(this); + }; + + Bar.prototype.colorFor = function(row, sidx, type) { + var r, s; + if (typeof this.options.barColors === 'function') { + r = { + x: row.x, + y: row.y[sidx], + label: row.label + }; + s = { + index: sidx, + key: this.options.ykeys[sidx], + label: this.options.labels[sidx] + }; + return this.options.barColors.call(this, r, s, type); + } else { + return this.options.barColors[sidx % this.options.barColors.length]; + } + }; + + Bar.prototype.hitTest = function(x) { + if (this.data.length === 0) { + return null; + } + x = Math.max(Math.min(x, this.right), this.left); + return Math.min(this.data.length - 1, Math.floor((x - this.left) / (this.width / this.data.length))); + }; + + Bar.prototype.onGridClick = function(x, y) { + var index; + index = this.hitTest(x); + return this.fire('click', index, this.data[index].src, x, y); + }; + + Bar.prototype.onHoverMove = function(x, y) { + var index, _ref; + index = this.hitTest(x); + return (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(index)); + }; + + Bar.prototype.onHoverOut = function() { + if (this.options.hideHover !== false) { + return this.hover.hide(); + } + }; + + Bar.prototype.hoverContentForRow = function(index) { + var content, j, row, x, y, _i, _len, _ref; + row = this.data[index]; + content = "<div class='morris-hover-row-label'>" + row.label + "</div>"; + _ref = row.y; + for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) { + y = _ref[j]; + content += "<div class='morris-hover-point' style='color: " + (this.colorFor(row, j, 'label')) + "'>\n " + this.options.labels[j] + ":\n " + (this.yLabelFormat(y)) + "\n</div>"; + } + if (typeof this.options.hoverCallback === 'function') { + content = this.options.hoverCallback(index, this.options, content, row.src); + } + x = this.left + (index + 0.5) * this.width / this.data.length; + return [content, x]; + }; + + Bar.prototype.drawXAxisLabel = function(xPos, yPos, text) { + var label; + return label = this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor); + }; + + Bar.prototype.drawBar = function(xPos, yPos, width, height, barColor, opacity, radiusArray) { + var maxRadius, path; + maxRadius = Math.max.apply(Math, radiusArray); + if (maxRadius === 0 || maxRadius > height) { + path = this.raphael.rect(xPos, yPos, width, height); + } else { + path = this.raphael.path(this.roundedRect(xPos, yPos, width, height, radiusArray)); + } + return path.attr('fill', barColor).attr('fill-opacity', opacity).attr('stroke', 'none'); + }; + + Bar.prototype.roundedRect = function(x, y, w, h, r) { + if (r == null) { + r = [0, 0, 0, 0]; + } + return ["M", x, r[0] + y, "Q", x, y, x + r[0], y, "L", x + w - r[1], y, "Q", x + w, y, x + w, y + r[1], "L", x + w, y + h - r[2], "Q", x + w, y + h, x + w - r[2], y + h, "L", x + r[3], y + h, "Q", x, y + h, x, y + h - r[3], "Z"]; + }; + + return Bar; + + })(Morris.Grid); + + Morris.Donut = (function(_super) { + __extends(Donut, _super); + + Donut.prototype.defaults = { + colors: ['#0B62A4', '#3980B5', '#679DC6', '#95BBD7', '#B0CCE1', '#095791', '#095085', '#083E67', '#052C48', '#042135'], + backgroundColor: '#FFFFFF', + labelColor: '#000000', + formatter: Morris.commas, + resize: false + }; + + function Donut(options) { + this.resizeHandler = __bind(this.resizeHandler, this); + this.select = __bind(this.select, this); + this.click = __bind(this.click, this); + var _this = this; + if (!(this instanceof Morris.Donut)) { + return new Morris.Donut(options); + } + this.options = $.extend({}, this.defaults, options); + if (typeof options.element === 'string') { + this.el = $(document.getElementById(options.element)); + } else { + this.el = $(options.element); + } + if (this.el === null || this.el.length === 0) { + throw new Error("Graph placeholder not found."); + } + if (options.data === void 0 || options.data.length === 0) { + return; + } + this.raphael = new Raphael(this.el[0]); + if (this.options.resize) { + $(window).bind('resize', function(evt) { + if (_this.timeoutId != null) { + window.clearTimeout(_this.timeoutId); + } + return _this.timeoutId = window.setTimeout(_this.resizeHandler, 100); + }); + } + this.setData(options.data); + } + + Donut.prototype.redraw = function() { + var C, cx, cy, i, idx, last, max_value, min, next, seg, total, value, w, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _results; + this.raphael.clear(); + cx = this.el.width() / 2; + cy = this.el.height() / 2; + w = (Math.min(cx, cy) - 10) / 3; + total = 0; + _ref = this.values; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + value = _ref[_i]; + total += value; + } + min = 5 / (2 * w); + C = 1.9999 * Math.PI - min * this.data.length; + last = 0; + idx = 0; + this.segments = []; + _ref1 = this.values; + for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) { + value = _ref1[i]; + next = last + min + C * (value / total); + seg = new Morris.DonutSegment(cx, cy, w * 2, w, last, next, this.data[i].color || this.options.colors[idx % this.options.colors.length], this.options.backgroundColor, idx, this.raphael); + seg.render(); + this.segments.push(seg); + seg.on('hover', this.select); + seg.on('click', this.click); + last = next; + idx += 1; + } + this.text1 = this.drawEmptyDonutLabel(cx, cy - 10, this.options.labelColor, 15, 800); + this.text2 = this.drawEmptyDonutLabel(cx, cy + 10, this.options.labelColor, 14); + max_value = Math.max.apply(Math, this.values); + idx = 0; + _ref2 = this.values; + _results = []; + for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { + value = _ref2[_k]; + if (value === max_value) { + this.select(idx); + break; + } + _results.push(idx += 1); + } + return _results; + }; + + Donut.prototype.setData = function(data) { + var row; + this.data = data; + this.values = (function() { + var _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + row = _ref[_i]; + _results.push(parseFloat(row.value)); + } + return _results; + }).call(this); + return this.redraw(); + }; + + Donut.prototype.click = function(idx) { + return this.fire('click', idx, this.data[idx]); + }; + + Donut.prototype.select = function(idx) { + var row, s, segment, _i, _len, _ref; + _ref = this.segments; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + s = _ref[_i]; + s.deselect(); + } + segment = this.segments[idx]; + segment.select(); + row = this.data[idx]; + return this.setLabels(row.label, this.options.formatter(row.value, row)); + }; + + Donut.prototype.setLabels = function(label1, label2) { + var inner, maxHeightBottom, maxHeightTop, maxWidth, text1bbox, text1scale, text2bbox, text2scale; + inner = (Math.min(this.el.width() / 2, this.el.height() / 2) - 10) * 2 / 3; + maxWidth = 1.8 * inner; + maxHeightTop = inner / 2; + maxHeightBottom = inner / 3; + this.text1.attr({ + text: label1, + transform: '' + }); + text1bbox = this.text1.getBBox(); + text1scale = Math.min(maxWidth / text1bbox.width, maxHeightTop / text1bbox.height); + this.text1.attr({ + transform: "S" + text1scale + "," + text1scale + "," + (text1bbox.x + text1bbox.width / 2) + "," + (text1bbox.y + text1bbox.height) + }); + this.text2.attr({ + text: label2, + transform: '' + }); + text2bbox = this.text2.getBBox(); + text2scale = Math.min(maxWidth / text2bbox.width, maxHeightBottom / text2bbox.height); + return this.text2.attr({ + transform: "S" + text2scale + "," + text2scale + "," + (text2bbox.x + text2bbox.width / 2) + "," + text2bbox.y + }); + }; + + Donut.prototype.drawEmptyDonutLabel = function(xPos, yPos, color, fontSize, fontWeight) { + var text; + text = this.raphael.text(xPos, yPos, '').attr('font-size', fontSize).attr('fill', color); + if (fontWeight != null) { + text.attr('font-weight', fontWeight); + } + return text; + }; + + Donut.prototype.resizeHandler = function() { + this.timeoutId = null; + this.raphael.setSize(this.el.width(), this.el.height()); + return this.redraw(); + }; + + return Donut; + + })(Morris.EventEmitter); + + Morris.DonutSegment = (function(_super) { + __extends(DonutSegment, _super); + + function DonutSegment(cx, cy, inner, outer, p0, p1, color, backgroundColor, index, raphael) { + this.cx = cx; + this.cy = cy; + this.inner = inner; + this.outer = outer; + this.color = color; + this.backgroundColor = backgroundColor; + this.index = index; + this.raphael = raphael; + this.deselect = __bind(this.deselect, this); + this.select = __bind(this.select, this); + this.sin_p0 = Math.sin(p0); + this.cos_p0 = Math.cos(p0); + this.sin_p1 = Math.sin(p1); + this.cos_p1 = Math.cos(p1); + this.is_long = (p1 - p0) > Math.PI ? 1 : 0; + this.path = this.calcSegment(this.inner + 3, this.inner + this.outer - 5); + this.selectedPath = this.calcSegment(this.inner + 3, this.inner + this.outer); + this.hilight = this.calcArc(this.inner); + } + + DonutSegment.prototype.calcArcPoints = function(r) { + return [this.cx + r * this.sin_p0, this.cy + r * this.cos_p0, this.cx + r * this.sin_p1, this.cy + r * this.cos_p1]; + }; + + DonutSegment.prototype.calcSegment = function(r1, r2) { + var ix0, ix1, iy0, iy1, ox0, ox1, oy0, oy1, _ref, _ref1; + _ref = this.calcArcPoints(r1), ix0 = _ref[0], iy0 = _ref[1], ix1 = _ref[2], iy1 = _ref[3]; + _ref1 = this.calcArcPoints(r2), ox0 = _ref1[0], oy0 = _ref1[1], ox1 = _ref1[2], oy1 = _ref1[3]; + return ("M" + ix0 + "," + iy0) + ("A" + r1 + "," + r1 + ",0," + this.is_long + ",0," + ix1 + "," + iy1) + ("L" + ox1 + "," + oy1) + ("A" + r2 + "," + r2 + ",0," + this.is_long + ",1," + ox0 + "," + oy0) + "Z"; + }; + + DonutSegment.prototype.calcArc = function(r) { + var ix0, ix1, iy0, iy1, _ref; + _ref = this.calcArcPoints(r), ix0 = _ref[0], iy0 = _ref[1], ix1 = _ref[2], iy1 = _ref[3]; + return ("M" + ix0 + "," + iy0) + ("A" + r + "," + r + ",0," + this.is_long + ",0," + ix1 + "," + iy1); + }; + + DonutSegment.prototype.render = function() { + var _this = this; + this.arc = this.drawDonutArc(this.hilight, this.color); + return this.seg = this.drawDonutSegment(this.path, this.color, this.backgroundColor, function() { + return _this.fire('hover', _this.index); + }, function() { + return _this.fire('click', _this.index); + }); + }; + + DonutSegment.prototype.drawDonutArc = function(path, color) { + return this.raphael.path(path).attr({ + stroke: color, + 'stroke-width': 2, + opacity: 0 + }); + }; + + DonutSegment.prototype.drawDonutSegment = function(path, fillColor, strokeColor, hoverFunction, clickFunction) { + return this.raphael.path(path).attr({ + fill: fillColor, + stroke: strokeColor, + 'stroke-width': 3 + }).hover(hoverFunction).click(clickFunction); + }; + + DonutSegment.prototype.select = function() { + if (!this.selected) { + this.seg.animate({ + path: this.selectedPath + }, 150, '<>'); + this.arc.animate({ + opacity: 1 + }, 150, '<>'); + return this.selected = true; + } + }; + + DonutSegment.prototype.deselect = function() { + if (this.selected) { + this.seg.animate({ + path: this.path + }, 150, '<>'); + this.arc.animate({ + opacity: 0 + }, 150, '<>'); + return this.selected = false; + } + }; + + return DonutSegment; + + })(Morris.EventEmitter); + +}).call(this); \ No newline at end of file diff --git a/theme/bootstrap/plugins/morris/morris.min.js b/theme/bootstrap/plugins/morris/morris.min.js new file mode 100644 index 0000000..c3bda2f --- /dev/null +++ b/theme/bootstrap/plugins/morris/morris.min.js @@ -0,0 +1,7 @@ +/* @license +morris.js v0.5.0 +Copyright 2014 Olly Smith All rights reserved. +Licensed under the BSD-2-Clause License. +*/ +(function(){var a,b,c,d,e=[].slice,f=function(a,b){return function(){return a.apply(b,arguments)}},g={}.hasOwnProperty,h=function(a,b){function c(){this.constructor=a}for(var d in b)g.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},i=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};b=window.Morris={},a=jQuery,b.EventEmitter=function(){function a(){}return a.prototype.on=function(a,b){return null==this.handlers&&(this.handlers={}),null==this.handlers[a]&&(this.handlers[a]=[]),this.handlers[a].push(b),this},a.prototype.fire=function(){var a,b,c,d,f,g,h;if(c=arguments[0],a=2<=arguments.length?e.call(arguments,1):[],null!=this.handlers&&null!=this.handlers[c]){for(g=this.handlers[c],h=[],d=0,f=g.length;f>d;d++)b=g[d],h.push(b.apply(null,a));return h}},a}(),b.commas=function(a){var b,c,d,e;return null!=a?(d=0>a?"-":"",b=Math.abs(a),c=Math.floor(b).toFixed(0),d+=c.replace(/(?=(?:\d{3})+$)(?!^)/g,","),e=b.toString(),e.length>c.length&&(d+=e.slice(c.length)),d):"-"},b.pad2=function(a){return(10>a?"0":"")+a},b.Grid=function(c){function d(b){this.resizeHandler=f(this.resizeHandler,this);var c=this;if(this.el="string"==typeof b.element?a(document.getElementById(b.element)):a(b.element),null==this.el||0===this.el.length)throw new Error("Graph container element not found");"static"===this.el.css("position")&&this.el.css("position","relative"),this.options=a.extend({},this.gridDefaults,this.defaults||{},b),"string"==typeof this.options.units&&(this.options.postUnits=b.units),this.raphael=new Raphael(this.el[0]),this.elementWidth=null,this.elementHeight=null,this.dirty=!1,this.selectFrom=null,this.init&&this.init(),this.setData(this.options.data),this.el.bind("mousemove",function(a){var b,d,e,f,g;return d=c.el.offset(),g=a.pageX-d.left,c.selectFrom?(b=c.data[c.hitTest(Math.min(g,c.selectFrom))]._x,e=c.data[c.hitTest(Math.max(g,c.selectFrom))]._x,f=e-b,c.selectionRect.attr({x:b,width:f})):c.fire("hovermove",g,a.pageY-d.top)}),this.el.bind("mouseleave",function(){return c.selectFrom&&(c.selectionRect.hide(),c.selectFrom=null),c.fire("hoverout")}),this.el.bind("touchstart touchmove touchend",function(a){var b,d;return d=a.originalEvent.touches[0]||a.originalEvent.changedTouches[0],b=c.el.offset(),c.fire("hovermove",d.pageX-b.left,d.pageY-b.top)}),this.el.bind("click",function(a){var b;return b=c.el.offset(),c.fire("gridclick",a.pageX-b.left,a.pageY-b.top)}),this.options.rangeSelect&&(this.selectionRect=this.raphael.rect(0,0,0,this.el.innerHeight()).attr({fill:this.options.rangeSelectColor,stroke:!1}).toBack().hide(),this.el.bind("mousedown",function(a){var b;return b=c.el.offset(),c.startRange(a.pageX-b.left)}),this.el.bind("mouseup",function(a){var b;return b=c.el.offset(),c.endRange(a.pageX-b.left),c.fire("hovermove",a.pageX-b.left,a.pageY-b.top)})),this.options.resize&&a(window).bind("resize",function(){return null!=c.timeoutId&&window.clearTimeout(c.timeoutId),c.timeoutId=window.setTimeout(c.resizeHandler,100)}),this.el.css("-webkit-tap-highlight-color","rgba(0,0,0,0)"),this.postInit&&this.postInit()}return h(d,c),d.prototype.gridDefaults={dateFormat:null,axes:!0,grid:!0,gridLineColor:"#aaa",gridStrokeWidth:.5,gridTextColor:"#888",gridTextSize:12,gridTextFamily:"sans-serif",gridTextWeight:"normal",hideHover:!1,yLabelFormat:null,xLabelAngle:0,numLines:5,padding:25,parseTime:!0,postUnits:"",preUnits:"",ymax:"auto",ymin:"auto 0",goals:[],goalStrokeWidth:1,goalLineColors:["#666633","#999966","#cc6666","#663333"],events:[],eventStrokeWidth:1,eventLineColors:["#005a04","#ccffbb","#3a5f0b","#005502"],rangeSelect:null,rangeSelectColor:"#eef",resize:!1},d.prototype.setData=function(a,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;return null==c&&(c=!0),this.options.data=a,null==a||0===a.length?(this.data=[],this.raphael.clear(),null!=this.hover&&this.hover.hide(),void 0):(o=this.cumulative?0:null,p=this.cumulative?0:null,this.options.goals.length>0&&(h=Math.min.apply(Math,this.options.goals),g=Math.max.apply(Math,this.options.goals),p=null!=p?Math.min(p,h):h,o=null!=o?Math.max(o,g):g),this.data=function(){var c,d,g;for(g=[],f=c=0,d=a.length;d>c;f=++c)j=a[f],i={src:j},i.label=j[this.options.xkey],this.options.parseTime?(i.x=b.parseDate(i.label),this.options.dateFormat?i.label=this.options.dateFormat(i.x):"number"==typeof i.label&&(i.label=new Date(i.label).toString())):(i.x=f,this.options.xLabelFormat&&(i.label=this.options.xLabelFormat(i))),l=0,i.y=function(){var a,b,c,d;for(c=this.options.ykeys,d=[],e=a=0,b=c.length;b>a;e=++a)n=c[e],q=j[n],"string"==typeof q&&(q=parseFloat(q)),null!=q&&"number"!=typeof q&&(q=null),null!=q&&(this.cumulative?l+=q:null!=o?(o=Math.max(q,o),p=Math.min(q,p)):o=p=q),this.cumulative&&null!=l&&(o=Math.max(l,o),p=Math.min(l,p)),d.push(q);return d}.call(this),g.push(i);return g}.call(this),this.options.parseTime&&(this.data=this.data.sort(function(a,b){return(a.x>b.x)-(b.x>a.x)})),this.xmin=this.data[0].x,this.xmax=this.data[this.data.length-1].x,this.events=[],this.options.events.length>0&&(this.events=this.options.parseTime?function(){var a,c,e,f;for(e=this.options.events,f=[],a=0,c=e.length;c>a;a++)d=e[a],f.push(b.parseDate(d));return f}.call(this):this.options.events,this.xmax=Math.max(this.xmax,Math.max.apply(Math,this.events)),this.xmin=Math.min(this.xmin,Math.min.apply(Math,this.events))),this.xmin===this.xmax&&(this.xmin-=1,this.xmax+=1),this.ymin=this.yboundary("min",p),this.ymax=this.yboundary("max",o),this.ymin===this.ymax&&(p&&(this.ymin-=1),this.ymax+=1),((r=this.options.axes)===!0||"both"===r||"y"===r||this.options.grid===!0)&&(this.options.ymax===this.gridDefaults.ymax&&this.options.ymin===this.gridDefaults.ymin?(this.grid=this.autoGridLines(this.ymin,this.ymax,this.options.numLines),this.ymin=Math.min(this.ymin,this.grid[0]),this.ymax=Math.max(this.ymax,this.grid[this.grid.length-1])):(k=(this.ymax-this.ymin)/(this.options.numLines-1),this.grid=function(){var a,b,c,d;for(d=[],m=a=b=this.ymin,c=this.ymax;k>0?c>=a:a>=c;m=a+=k)d.push(m);return d}.call(this))),this.dirty=!0,c?this.redraw():void 0)},d.prototype.yboundary=function(a,b){var c,d;return c=this.options["y"+a],"string"==typeof c?"auto"===c.slice(0,4)?c.length>5?(d=parseInt(c.slice(5),10),null==b?d:Math[a](b,d)):null!=b?b:0:parseInt(c,10):c},d.prototype.autoGridLines=function(a,b,c){var d,e,f,g,h,i,j,k,l;return h=b-a,l=Math.floor(Math.log(h)/Math.log(10)),j=Math.pow(10,l),e=Math.floor(a/j)*j,d=Math.ceil(b/j)*j,i=(d-e)/(c-1),1===j&&i>1&&Math.ceil(i)!==i&&(i=Math.ceil(i),d=e+i*(c-1)),0>e&&d>0&&(e=Math.floor(a/i)*i,d=Math.ceil(b/i)*i),1>i?(g=Math.floor(Math.log(i)/Math.log(10)),f=function(){var a,b;for(b=[],k=a=e;i>0?d>=a:a>=d;k=a+=i)b.push(parseFloat(k.toFixed(1-g)));return b}()):f=function(){var a,b;for(b=[],k=a=e;i>0?d>=a:a>=d;k=a+=i)b.push(k);return b}(),f},d.prototype._calc=function(){var a,b,c,d,e,f,g,h;return e=this.el.width(),c=this.el.height(),(this.elementWidth!==e||this.elementHeight!==c||this.dirty)&&(this.elementWidth=e,this.elementHeight=c,this.dirty=!1,this.left=this.options.padding,this.right=this.elementWidth-this.options.padding,this.top=this.options.padding,this.bottom=this.elementHeight-this.options.padding,((g=this.options.axes)===!0||"both"===g||"y"===g)&&(f=function(){var a,c,d,e;for(d=this.grid,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(this.measureText(this.yAxisFormat(b)).width);return e}.call(this),this.left+=Math.max.apply(Math,f)),((h=this.options.axes)===!0||"both"===h||"x"===h)&&(a=function(){var a,b,c;for(c=[],d=a=0,b=this.data.length;b>=0?b>a:a>b;d=b>=0?++a:--a)c.push(this.measureText(this.data[d].text,-this.options.xLabelAngle).height);return c}.call(this),this.bottom-=Math.max.apply(Math,a)),this.width=Math.max(1,this.right-this.left),this.height=Math.max(1,this.bottom-this.top),this.dx=this.width/(this.xmax-this.xmin),this.dy=this.height/(this.ymax-this.ymin),this.calc)?this.calc():void 0},d.prototype.transY=function(a){return this.bottom-(a-this.ymin)*this.dy},d.prototype.transX=function(a){return 1===this.data.length?(this.left+this.right)/2:this.left+(a-this.xmin)*this.dx},d.prototype.redraw=function(){return this.raphael.clear(),this._calc(),this.drawGrid(),this.drawGoals(),this.drawEvents(),this.draw?this.draw():void 0},d.prototype.measureText=function(a,b){var c,d;return null==b&&(b=0),d=this.raphael.text(100,100,a).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).rotate(b),c=d.getBBox(),d.remove(),c},d.prototype.yAxisFormat=function(a){return this.yLabelFormat(a)},d.prototype.yLabelFormat=function(a){return"function"==typeof this.options.yLabelFormat?this.options.yLabelFormat(a):""+this.options.preUnits+b.commas(a)+this.options.postUnits},d.prototype.drawGrid=function(){var a,b,c,d,e,f,g,h;if(this.options.grid!==!1||(e=this.options.axes)===!0||"both"===e||"y"===e){for(f=this.grid,h=[],c=0,d=f.length;d>c;c++)a=f[c],b=this.transY(a),((g=this.options.axes)===!0||"both"===g||"y"===g)&&this.drawYAxisLabel(this.left-this.options.padding/2,b,this.yAxisFormat(a)),this.options.grid?h.push(this.drawGridLine("M"+this.left+","+b+"H"+(this.left+this.width))):h.push(void 0);return h}},d.prototype.drawGoals=function(){var a,b,c,d,e,f,g;for(f=this.options.goals,g=[],c=d=0,e=f.length;e>d;c=++d)b=f[c],a=this.options.goalLineColors[c%this.options.goalLineColors.length],g.push(this.drawGoal(b,a));return g},d.prototype.drawEvents=function(){var a,b,c,d,e,f,g;for(f=this.events,g=[],c=d=0,e=f.length;e>d;c=++d)b=f[c],a=this.options.eventLineColors[c%this.options.eventLineColors.length],g.push(this.drawEvent(b,a));return g},d.prototype.drawGoal=function(a,b){return this.raphael.path("M"+this.left+","+this.transY(a)+"H"+this.right).attr("stroke",b).attr("stroke-width",this.options.goalStrokeWidth)},d.prototype.drawEvent=function(a,b){return this.raphael.path("M"+this.transX(a)+","+this.bottom+"V"+this.top).attr("stroke",b).attr("stroke-width",this.options.eventStrokeWidth)},d.prototype.drawYAxisLabel=function(a,b,c){return this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor).attr("text-anchor","end")},d.prototype.drawGridLine=function(a){return this.raphael.path(a).attr("stroke",this.options.gridLineColor).attr("stroke-width",this.options.gridStrokeWidth)},d.prototype.startRange=function(a){return this.hover.hide(),this.selectFrom=a,this.selectionRect.attr({x:a,width:0}).show()},d.prototype.endRange=function(a){var b,c;return this.selectFrom?(c=Math.min(this.selectFrom,a),b=Math.max(this.selectFrom,a),this.options.rangeSelect.call(this.el,{start:this.data[this.hitTest(c)].x,end:this.data[this.hitTest(b)].x}),this.selectFrom=null):void 0},d.prototype.resizeHandler=function(){return this.timeoutId=null,this.raphael.setSize(this.el.width(),this.el.height()),this.redraw()},d}(b.EventEmitter),b.parseDate=function(a){var b,c,d,e,f,g,h,i,j,k,l;return"number"==typeof a?a:(c=a.match(/^(\d+) Q(\d)$/),e=a.match(/^(\d+)-(\d+)$/),f=a.match(/^(\d+)-(\d+)-(\d+)$/),h=a.match(/^(\d+) W(\d+)$/),i=a.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+)(Z|([+-])(\d\d):?(\d\d))?$/),j=a.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+):(\d+(\.\d+)?)(Z|([+-])(\d\d):?(\d\d))?$/),c?new Date(parseInt(c[1],10),3*parseInt(c[2],10)-1,1).getTime():e?new Date(parseInt(e[1],10),parseInt(e[2],10)-1,1).getTime():f?new Date(parseInt(f[1],10),parseInt(f[2],10)-1,parseInt(f[3],10)).getTime():h?(k=new Date(parseInt(h[1],10),0,1),4!==k.getDay()&&k.setMonth(0,1+(4-k.getDay()+7)%7),k.getTime()+6048e5*parseInt(h[2],10)):i?i[6]?(g=0,"Z"!==i[6]&&(g=60*parseInt(i[8],10)+parseInt(i[9],10),"+"===i[7]&&(g=0-g)),Date.UTC(parseInt(i[1],10),parseInt(i[2],10)-1,parseInt(i[3],10),parseInt(i[4],10),parseInt(i[5],10)+g)):new Date(parseInt(i[1],10),parseInt(i[2],10)-1,parseInt(i[3],10),parseInt(i[4],10),parseInt(i[5],10)).getTime():j?(l=parseFloat(j[6]),b=Math.floor(l),d=Math.round(1e3*(l-b)),j[8]?(g=0,"Z"!==j[8]&&(g=60*parseInt(j[10],10)+parseInt(j[11],10),"+"===j[9]&&(g=0-g)),Date.UTC(parseInt(j[1],10),parseInt(j[2],10)-1,parseInt(j[3],10),parseInt(j[4],10),parseInt(j[5],10)+g,b,d)):new Date(parseInt(j[1],10),parseInt(j[2],10)-1,parseInt(j[3],10),parseInt(j[4],10),parseInt(j[5],10),b,d).getTime()):new Date(parseInt(a,10),0,1).getTime())},b.Hover=function(){function c(c){null==c&&(c={}),this.options=a.extend({},b.Hover.defaults,c),this.el=a("<div class='"+this.options["class"]+"'></div>"),this.el.hide(),this.options.parent.append(this.el)}return c.defaults={"class":"morris-hover morris-default-style"},c.prototype.update=function(a,b,c){return a?(this.html(a),this.show(),this.moveTo(b,c)):this.hide()},c.prototype.html=function(a){return this.el.html(a)},c.prototype.moveTo=function(a,b){var c,d,e,f,g,h;return g=this.options.parent.innerWidth(),f=this.options.parent.innerHeight(),d=this.el.outerWidth(),c=this.el.outerHeight(),e=Math.min(Math.max(0,a-d/2),g-d),null!=b?(h=b-c-10,0>h&&(h=b+10,h+c>f&&(h=f/2-c/2))):h=f/2-c/2,this.el.css({left:e+"px",top:parseInt(h)+"px"})},c.prototype.show=function(){return this.el.show()},c.prototype.hide=function(){return this.el.hide()},c}(),b.Line=function(a){function c(a){return this.hilight=f(this.hilight,this),this.onHoverOut=f(this.onHoverOut,this),this.onHoverMove=f(this.onHoverMove,this),this.onGridClick=f(this.onGridClick,this),this instanceof b.Line?(c.__super__.constructor.call(this,a),void 0):new b.Line(a)}return h(c,a),c.prototype.init=function(){return"always"!==this.options.hideHover?(this.hover=new b.Hover({parent:this.el}),this.on("hovermove",this.onHoverMove),this.on("hoverout",this.onHoverOut),this.on("gridclick",this.onGridClick)):void 0},c.prototype.defaults={lineWidth:3,pointSize:4,lineColors:["#0b62a4","#7A92A3","#4da74d","#afd8f8","#edc240","#cb4b4b","#9440ed"],pointStrokeWidths:[1],pointStrokeColors:["#ffffff"],pointFillColors:[],smooth:!0,xLabels:"auto",xLabelFormat:null,xLabelMargin:24,hideHover:!1},c.prototype.calc=function(){return this.calcPoints(),this.generatePaths()},c.prototype.calcPoints=function(){var a,b,c,d,e,f;for(e=this.data,f=[],c=0,d=e.length;d>c;c++)a=e[c],a._x=this.transX(a.x),a._y=function(){var c,d,e,f;for(e=a.y,f=[],c=0,d=e.length;d>c;c++)b=e[c],null!=b?f.push(this.transY(b)):f.push(b);return f}.call(this),f.push(a._ymax=Math.min.apply(Math,[this.bottom].concat(function(){var c,d,e,f;for(e=a._y,f=[],c=0,d=e.length;d>c;c++)b=e[c],null!=b&&f.push(b);return f}())));return f},c.prototype.hitTest=function(a){var b,c,d,e,f;if(0===this.data.length)return null;for(f=this.data.slice(1),b=d=0,e=f.length;e>d&&(c=f[b],!(a<(c._x+this.data[b]._x)/2));b=++d);return b},c.prototype.onGridClick=function(a,b){var c;return c=this.hitTest(a),this.fire("click",c,this.data[c].src,a,b)},c.prototype.onHoverMove=function(a){var b;return b=this.hitTest(a),this.displayHoverForRow(b)},c.prototype.onHoverOut=function(){return this.options.hideHover!==!1?this.displayHoverForRow(null):void 0},c.prototype.displayHoverForRow=function(a){var b;return null!=a?((b=this.hover).update.apply(b,this.hoverContentForRow(a)),this.hilight(a)):(this.hover.hide(),this.hilight())},c.prototype.hoverContentForRow=function(a){var b,c,d,e,f,g,h;for(d=this.data[a],b="<div class='morris-hover-row-label'>"+d.label+"</div>",h=d.y,c=f=0,g=h.length;g>f;c=++f)e=h[c],b+="<div class='morris-hover-point' style='color: "+this.colorFor(d,c,"label")+"'>\n "+this.options.labels[c]+":\n "+this.yLabelFormat(e)+"\n</div>";return"function"==typeof this.options.hoverCallback&&(b=this.options.hoverCallback(a,this.options,b,d.src)),[b,d._x,d._ymax]},c.prototype.generatePaths=function(){var a,c,d,e;return this.paths=function(){var f,g,h,j;for(j=[],c=f=0,g=this.options.ykeys.length;g>=0?g>f:f>g;c=g>=0?++f:--f)e="boolean"==typeof this.options.smooth?this.options.smooth:(h=this.options.ykeys[c],i.call(this.options.smooth,h)>=0),a=function(){var a,b,e,f;for(e=this.data,f=[],a=0,b=e.length;b>a;a++)d=e[a],void 0!==d._y[c]&&f.push({x:d._x,y:d._y[c]});return f}.call(this),a.length>1?j.push(b.Line.createPath(a,e,this.bottom)):j.push(null);return j}.call(this)},c.prototype.draw=function(){var a;return((a=this.options.axes)===!0||"both"===a||"x"===a)&&this.drawXAxis(),this.drawSeries(),this.options.hideHover===!1?this.displayHoverForRow(this.data.length-1):void 0},c.prototype.drawXAxis=function(){var a,c,d,e,f,g,h,i,j,k,l=this;for(h=this.bottom+this.options.padding/2,f=null,e=null,a=function(a,b){var c,d,g,i,j;return c=l.drawXAxisLabel(l.transX(b),h,a),j=c.getBBox(),c.transform("r"+-l.options.xLabelAngle),d=c.getBBox(),c.transform("t0,"+d.height/2+"..."),0!==l.options.xLabelAngle&&(i=-.5*j.width*Math.cos(l.options.xLabelAngle*Math.PI/180),c.transform("t"+i+",0...")),d=c.getBBox(),(null==f||f>=d.x+d.width||null!=e&&e>=d.x)&&d.x>=0&&d.x+d.width<l.el.width()?(0!==l.options.xLabelAngle&&(g=1.25*l.options.gridTextSize/Math.sin(l.options.xLabelAngle*Math.PI/180),e=d.x-g),f=d.x-l.options.xLabelMargin):c.remove()},d=this.options.parseTime?1===this.data.length&&"auto"===this.options.xLabels?[[this.data[0].label,this.data[0].x]]:b.labelSeries(this.xmin,this.xmax,this.width,this.options.xLabels,this.options.xLabelFormat):function(){var a,b,c,d;for(c=this.data,d=[],a=0,b=c.length;b>a;a++)g=c[a],d.push([g.label,g.x]);return d}.call(this),d.reverse(),k=[],i=0,j=d.length;j>i;i++)c=d[i],k.push(a(c[0],c[1]));return k},c.prototype.drawSeries=function(){var a,b,c,d,e,f;for(this.seriesPoints=[],a=b=d=this.options.ykeys.length-1;0>=d?0>=b:b>=0;a=0>=d?++b:--b)this._drawLineFor(a);for(f=[],a=c=e=this.options.ykeys.length-1;0>=e?0>=c:c>=0;a=0>=e?++c:--c)f.push(this._drawPointFor(a));return f},c.prototype._drawPointFor=function(a){var b,c,d,e,f,g;for(this.seriesPoints[a]=[],f=this.data,g=[],d=0,e=f.length;e>d;d++)c=f[d],b=null,null!=c._y[a]&&(b=this.drawLinePoint(c._x,c._y[a],this.colorFor(c,a,"point"),a)),g.push(this.seriesPoints[a].push(b));return g},c.prototype._drawLineFor=function(a){var b;return b=this.paths[a],null!==b?this.drawLinePath(b,this.colorFor(null,a,"line"),a):void 0},c.createPath=function(a,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r;for(k="",c&&(g=b.Line.gradients(a)),l={y:null},h=q=0,r=a.length;r>q;h=++q)e=a[h],null!=e.y&&(null!=l.y?c?(f=g[h],j=g[h-1],i=(e.x-l.x)/4,m=l.x+i,o=Math.min(d,l.y+i*j),n=e.x-i,p=Math.min(d,e.y-i*f),k+="C"+m+","+o+","+n+","+p+","+e.x+","+e.y):k+="L"+e.x+","+e.y:c&&null==g[h]||(k+="M"+e.x+","+e.y)),l=e;return k},c.gradients=function(a){var b,c,d,e,f,g,h,i;for(c=function(a,b){return(a.y-b.y)/(a.x-b.x)},i=[],d=g=0,h=a.length;h>g;d=++g)b=a[d],null!=b.y?(e=a[d+1]||{y:null},f=a[d-1]||{y:null},null!=f.y&&null!=e.y?i.push(c(f,e)):null!=f.y?i.push(c(f,b)):null!=e.y?i.push(c(b,e)):i.push(null)):i.push(null);return i},c.prototype.hilight=function(a){var b,c,d,e,f;if(null!==this.prevHilight&&this.prevHilight!==a)for(b=c=0,e=this.seriesPoints.length-1;e>=0?e>=c:c>=e;b=e>=0?++c:--c)this.seriesPoints[b][this.prevHilight]&&this.seriesPoints[b][this.prevHilight].animate(this.pointShrinkSeries(b));if(null!==a&&this.prevHilight!==a)for(b=d=0,f=this.seriesPoints.length-1;f>=0?f>=d:d>=f;b=f>=0?++d:--d)this.seriesPoints[b][a]&&this.seriesPoints[b][a].animate(this.pointGrowSeries(b));return this.prevHilight=a},c.prototype.colorFor=function(a,b,c){return"function"==typeof this.options.lineColors?this.options.lineColors.call(this,a,b,c):"point"===c?this.options.pointFillColors[b%this.options.pointFillColors.length]||this.options.lineColors[b%this.options.lineColors.length]:this.options.lineColors[b%this.options.lineColors.length]},c.prototype.drawXAxisLabel=function(a,b,c){return this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor)},c.prototype.drawLinePath=function(a,b,c){return this.raphael.path(a).attr("stroke",b).attr("stroke-width",this.lineWidthForSeries(c))},c.prototype.drawLinePoint=function(a,b,c,d){return this.raphael.circle(a,b,this.pointSizeForSeries(d)).attr("fill",c).attr("stroke-width",this.pointStrokeWidthForSeries(d)).attr("stroke",this.pointStrokeColorForSeries(d))},c.prototype.pointStrokeWidthForSeries=function(a){return this.options.pointStrokeWidths[a%this.options.pointStrokeWidths.length]},c.prototype.pointStrokeColorForSeries=function(a){return this.options.pointStrokeColors[a%this.options.pointStrokeColors.length]},c.prototype.lineWidthForSeries=function(a){return this.options.lineWidth instanceof Array?this.options.lineWidth[a%this.options.lineWidth.length]:this.options.lineWidth},c.prototype.pointSizeForSeries=function(a){return this.options.pointSize instanceof Array?this.options.pointSize[a%this.options.pointSize.length]:this.options.pointSize},c.prototype.pointGrowSeries=function(a){return Raphael.animation({r:this.pointSizeForSeries(a)+3},25,"linear")},c.prototype.pointShrinkSeries=function(a){return Raphael.animation({r:this.pointSizeForSeries(a)},25,"linear")},c}(b.Grid),b.labelSeries=function(c,d,e,f,g){var h,i,j,k,l,m,n,o,p,q,r;if(j=200*(d-c)/e,i=new Date(c),n=b.LABEL_SPECS[f],void 0===n)for(r=b.AUTO_LABEL_ORDER,p=0,q=r.length;q>p;p++)if(k=r[p],m=b.LABEL_SPECS[k],j>=m.span){n=m;break}for(void 0===n&&(n=b.LABEL_SPECS.second),g&&(n=a.extend({},n,{fmt:g})),h=n.start(i),l=[];(o=h.getTime())<=d;)o>=c&&l.push([n.fmt(h),o]),n.incr(h);return l},c=function(a){return{span:60*a*1e3,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate(),a.getHours())},fmt:function(a){return""+b.pad2(a.getHours())+":"+b.pad2(a.getMinutes())},incr:function(b){return b.setUTCMinutes(b.getUTCMinutes()+a)}}},d=function(a){return{span:1e3*a,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate(),a.getHours(),a.getMinutes())},fmt:function(a){return""+b.pad2(a.getHours())+":"+b.pad2(a.getMinutes())+":"+b.pad2(a.getSeconds())},incr:function(b){return b.setUTCSeconds(b.getUTCSeconds()+a)}}},b.LABEL_SPECS={decade:{span:1728e8,start:function(a){return new Date(a.getFullYear()-a.getFullYear()%10,0,1)},fmt:function(a){return""+a.getFullYear()},incr:function(a){return a.setFullYear(a.getFullYear()+10)}},year:{span:1728e7,start:function(a){return new Date(a.getFullYear(),0,1)},fmt:function(a){return""+a.getFullYear()},incr:function(a){return a.setFullYear(a.getFullYear()+1)}},month:{span:24192e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),1)},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)},incr:function(a){return a.setMonth(a.getMonth()+1)}},week:{span:6048e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate())},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)+"-"+b.pad2(a.getDate())},incr:function(a){return a.setDate(a.getDate()+7)}},day:{span:864e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate())},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)+"-"+b.pad2(a.getDate())},incr:function(a){return a.setDate(a.getDate()+1)}},hour:c(60),"30min":c(30),"15min":c(15),"10min":c(10),"5min":c(5),minute:c(1),"30sec":d(30),"15sec":d(15),"10sec":d(10),"5sec":d(5),second:d(1)},b.AUTO_LABEL_ORDER=["decade","year","month","week","day","hour","30min","15min","10min","5min","minute","30sec","15sec","10sec","5sec","second"],b.Area=function(c){function d(c){var f;return this instanceof b.Area?(f=a.extend({},e,c),this.cumulative=!f.behaveLikeLine,"auto"===f.fillOpacity&&(f.fillOpacity=f.behaveLikeLine?.8:1),d.__super__.constructor.call(this,f),void 0):new b.Area(c)}var e;return h(d,c),e={fillOpacity:"auto",behaveLikeLine:!1},d.prototype.calcPoints=function(){var a,b,c,d,e,f,g;for(f=this.data,g=[],d=0,e=f.length;e>d;d++)a=f[d],a._x=this.transX(a.x),b=0,a._y=function(){var d,e,f,g;for(f=a.y,g=[],d=0,e=f.length;e>d;d++)c=f[d],this.options.behaveLikeLine?g.push(this.transY(c)):(b+=c||0,g.push(this.transY(b)));return g}.call(this),g.push(a._ymax=Math.max.apply(Math,a._y));return g},d.prototype.drawSeries=function(){var a,b,c,d,e,f,g,h;for(this.seriesPoints=[],b=this.options.behaveLikeLine?function(){f=[];for(var a=0,b=this.options.ykeys.length-1;b>=0?b>=a:a>=b;b>=0?a++:a--)f.push(a);return f}.apply(this):function(){g=[];for(var a=e=this.options.ykeys.length-1;0>=e?0>=a:a>=0;0>=e?a++:a--)g.push(a);return g}.apply(this),h=[],c=0,d=b.length;d>c;c++)a=b[c],this._drawFillFor(a),this._drawLineFor(a),h.push(this._drawPointFor(a));return h},d.prototype._drawFillFor=function(a){var b;return b=this.paths[a],null!==b?(b+="L"+this.transX(this.xmax)+","+this.bottom+"L"+this.transX(this.xmin)+","+this.bottom+"Z",this.drawFilledPath(b,this.fillForSeries(a))):void 0},d.prototype.fillForSeries=function(a){var b;return b=Raphael.rgb2hsl(this.colorFor(this.data[a],a,"line")),Raphael.hsl(b.h,this.options.behaveLikeLine?.9*b.s:.75*b.s,Math.min(.98,this.options.behaveLikeLine?1.2*b.l:1.25*b.l))},d.prototype.drawFilledPath=function(a,b){return this.raphael.path(a).attr("fill",b).attr("fill-opacity",this.options.fillOpacity).attr("stroke","none")},d}(b.Line),b.Bar=function(c){function d(c){return this.onHoverOut=f(this.onHoverOut,this),this.onHoverMove=f(this.onHoverMove,this),this.onGridClick=f(this.onGridClick,this),this instanceof b.Bar?(d.__super__.constructor.call(this,a.extend({},c,{parseTime:!1})),void 0):new b.Bar(c)}return h(d,c),d.prototype.init=function(){return this.cumulative=this.options.stacked,"always"!==this.options.hideHover?(this.hover=new b.Hover({parent:this.el}),this.on("hovermove",this.onHoverMove),this.on("hoverout",this.onHoverOut),this.on("gridclick",this.onGridClick)):void 0},d.prototype.defaults={barSizeRatio:.75,barGap:3,barColors:["#0b62a4","#7a92a3","#4da74d","#afd8f8","#edc240","#cb4b4b","#9440ed"],barOpacity:1,barRadius:[0,0,0,0],xLabelMargin:50},d.prototype.calc=function(){var a;return this.calcBars(),this.options.hideHover===!1?(a=this.hover).update.apply(a,this.hoverContentForRow(this.data.length-1)):void 0},d.prototype.calcBars=function(){var a,b,c,d,e,f,g;for(f=this.data,g=[],a=d=0,e=f.length;e>d;a=++d)b=f[a],b._x=this.left+this.width*(a+.5)/this.data.length,g.push(b._y=function(){var a,d,e,f;for(e=b.y,f=[],a=0,d=e.length;d>a;a++)c=e[a],null!=c?f.push(this.transY(c)):f.push(null);return f}.call(this));return g},d.prototype.draw=function(){var a;return((a=this.options.axes)===!0||"both"===a||"x"===a)&&this.drawXAxis(),this.drawSeries()},d.prototype.drawXAxis=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m;for(j=this.bottom+(this.options.xAxisLabelTopPadding||this.options.padding/2),g=null,f=null,m=[],a=k=0,l=this.data.length;l>=0?l>k:k>l;a=l>=0?++k:--k)h=this.data[this.data.length-1-a],b=this.drawXAxisLabel(h._x,j,h.label),i=b.getBBox(),b.transform("r"+-this.options.xLabelAngle),c=b.getBBox(),b.transform("t0,"+c.height/2+"..."),0!==this.options.xLabelAngle&&(e=-.5*i.width*Math.cos(this.options.xLabelAngle*Math.PI/180),b.transform("t"+e+",0...")),(null==g||g>=c.x+c.width||null!=f&&f>=c.x)&&c.x>=0&&c.x+c.width<this.el.width()?(0!==this.options.xLabelAngle&&(d=1.25*this.options.gridTextSize/Math.sin(this.options.xLabelAngle*Math.PI/180),f=c.x-d),m.push(g=c.x-this.options.xLabelMargin)):m.push(b.remove());return m},d.prototype.drawSeries=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o;return c=this.width/this.options.data.length,h=this.options.stacked?1:this.options.ykeys.length,a=(c*this.options.barSizeRatio-this.options.barGap*(h-1))/h,this.options.barSize&&(a=Math.min(a,this.options.barSize)),l=c-a*h-this.options.barGap*(h-1),g=l/2,o=this.ymin<=0&&this.ymax>=0?this.transY(0):null,this.bars=function(){var h,l,p,q;for(p=this.data,q=[],d=h=0,l=p.length;l>h;d=++h)i=p[d],e=0,q.push(function(){var h,l,p,q;for(p=i._y,q=[],j=h=0,l=p.length;l>h;j=++h)n=p[j],null!==n?(o?(m=Math.min(n,o),b=Math.max(n,o)):(m=n,b=this.bottom),f=this.left+d*c+g,this.options.stacked||(f+=j*(a+this.options.barGap)),k=b-m,this.options.verticalGridCondition&&this.options.verticalGridCondition(i.x)&&this.drawBar(this.left+d*c,this.top,c,Math.abs(this.top-this.bottom),this.options.verticalGridColor,this.options.verticalGridOpacity,this.options.barRadius),this.options.stacked&&(m-=e),this.drawBar(f,m,a,k,this.colorFor(i,j,"bar"),this.options.barOpacity,this.options.barRadius),q.push(e+=k)):q.push(null);return q}.call(this));return q}.call(this)},d.prototype.colorFor=function(a,b,c){var d,e;return"function"==typeof this.options.barColors?(d={x:a.x,y:a.y[b],label:a.label},e={index:b,key:this.options.ykeys[b],label:this.options.labels[b]},this.options.barColors.call(this,d,e,c)):this.options.barColors[b%this.options.barColors.length]},d.prototype.hitTest=function(a){return 0===this.data.length?null:(a=Math.max(Math.min(a,this.right),this.left),Math.min(this.data.length-1,Math.floor((a-this.left)/(this.width/this.data.length))))},d.prototype.onGridClick=function(a,b){var c;return c=this.hitTest(a),this.fire("click",c,this.data[c].src,a,b)},d.prototype.onHoverMove=function(a){var b,c;return b=this.hitTest(a),(c=this.hover).update.apply(c,this.hoverContentForRow(b))},d.prototype.onHoverOut=function(){return this.options.hideHover!==!1?this.hover.hide():void 0},d.prototype.hoverContentForRow=function(a){var b,c,d,e,f,g,h,i;for(d=this.data[a],b="<div class='morris-hover-row-label'>"+d.label+"</div>",i=d.y,c=g=0,h=i.length;h>g;c=++g)f=i[c],b+="<div class='morris-hover-point' style='color: "+this.colorFor(d,c,"label")+"'>\n "+this.options.labels[c]+":\n "+this.yLabelFormat(f)+"\n</div>";return"function"==typeof this.options.hoverCallback&&(b=this.options.hoverCallback(a,this.options,b,d.src)),e=this.left+(a+.5)*this.width/this.data.length,[b,e]},d.prototype.drawXAxisLabel=function(a,b,c){var d;return d=this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor)},d.prototype.drawBar=function(a,b,c,d,e,f,g){var h,i;return h=Math.max.apply(Math,g),i=0===h||h>d?this.raphael.rect(a,b,c,d):this.raphael.path(this.roundedRect(a,b,c,d,g)),i.attr("fill",e).attr("fill-opacity",f).attr("stroke","none")},d.prototype.roundedRect=function(a,b,c,d,e){return null==e&&(e=[0,0,0,0]),["M",a,e[0]+b,"Q",a,b,a+e[0],b,"L",a+c-e[1],b,"Q",a+c,b,a+c,b+e[1],"L",a+c,b+d-e[2],"Q",a+c,b+d,a+c-e[2],b+d,"L",a+e[3],b+d,"Q",a,b+d,a,b+d-e[3],"Z"]},d}(b.Grid),b.Donut=function(c){function d(c){this.resizeHandler=f(this.resizeHandler,this),this.select=f(this.select,this),this.click=f(this.click,this);var d=this;if(!(this instanceof b.Donut))return new b.Donut(c);if(this.options=a.extend({},this.defaults,c),this.el="string"==typeof c.element?a(document.getElementById(c.element)):a(c.element),null===this.el||0===this.el.length)throw new Error("Graph placeholder not found.");void 0!==c.data&&0!==c.data.length&&(this.raphael=new Raphael(this.el[0]),this.options.resize&&a(window).bind("resize",function(){return null!=d.timeoutId&&window.clearTimeout(d.timeoutId),d.timeoutId=window.setTimeout(d.resizeHandler,100)}),this.setData(c.data))}return h(d,c),d.prototype.defaults={colors:["#0B62A4","#3980B5","#679DC6","#95BBD7","#B0CCE1","#095791","#095085","#083E67","#052C48","#042135"],backgroundColor:"#FFFFFF",labelColor:"#000000",formatter:b.commas,resize:!1},d.prototype.redraw=function(){var a,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x;for(this.raphael.clear(),c=this.el.width()/2,d=this.el.height()/2,n=(Math.min(c,d)-10)/3,l=0,u=this.values,o=0,r=u.length;r>o;o++)m=u[o],l+=m;for(i=5/(2*n),a=1.9999*Math.PI-i*this.data.length,g=0,f=0,this.segments=[],v=this.values,e=p=0,s=v.length;s>p;e=++p)m=v[e],j=g+i+a*(m/l),k=new b.DonutSegment(c,d,2*n,n,g,j,this.data[e].color||this.options.colors[f%this.options.colors.length],this.options.backgroundColor,f,this.raphael),k.render(),this.segments.push(k),k.on("hover",this.select),k.on("click",this.click),g=j,f+=1;for(this.text1=this.drawEmptyDonutLabel(c,d-10,this.options.labelColor,15,800),this.text2=this.drawEmptyDonutLabel(c,d+10,this.options.labelColor,14),h=Math.max.apply(Math,this.values),f=0,w=this.values,x=[],q=0,t=w.length;t>q;q++){if(m=w[q],m===h){this.select(f); +break}x.push(f+=1)}return x},d.prototype.setData=function(a){var b;return this.data=a,this.values=function(){var a,c,d,e;for(d=this.data,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(parseFloat(b.value));return e}.call(this),this.redraw()},d.prototype.click=function(a){return this.fire("click",a,this.data[a])},d.prototype.select=function(a){var b,c,d,e,f,g;for(g=this.segments,e=0,f=g.length;f>e;e++)c=g[e],c.deselect();return d=this.segments[a],d.select(),b=this.data[a],this.setLabels(b.label,this.options.formatter(b.value,b))},d.prototype.setLabels=function(a,b){var c,d,e,f,g,h,i,j;return c=2*(Math.min(this.el.width()/2,this.el.height()/2)-10)/3,f=1.8*c,e=c/2,d=c/3,this.text1.attr({text:a,transform:""}),g=this.text1.getBBox(),h=Math.min(f/g.width,e/g.height),this.text1.attr({transform:"S"+h+","+h+","+(g.x+g.width/2)+","+(g.y+g.height)}),this.text2.attr({text:b,transform:""}),i=this.text2.getBBox(),j=Math.min(f/i.width,d/i.height),this.text2.attr({transform:"S"+j+","+j+","+(i.x+i.width/2)+","+i.y})},d.prototype.drawEmptyDonutLabel=function(a,b,c,d,e){var f;return f=this.raphael.text(a,b,"").attr("font-size",d).attr("fill",c),null!=e&&f.attr("font-weight",e),f},d.prototype.resizeHandler=function(){return this.timeoutId=null,this.raphael.setSize(this.el.width(),this.el.height()),this.redraw()},d}(b.EventEmitter),b.DonutSegment=function(a){function b(a,b,c,d,e,g,h,i,j,k){this.cx=a,this.cy=b,this.inner=c,this.outer=d,this.color=h,this.backgroundColor=i,this.index=j,this.raphael=k,this.deselect=f(this.deselect,this),this.select=f(this.select,this),this.sin_p0=Math.sin(e),this.cos_p0=Math.cos(e),this.sin_p1=Math.sin(g),this.cos_p1=Math.cos(g),this.is_long=g-e>Math.PI?1:0,this.path=this.calcSegment(this.inner+3,this.inner+this.outer-5),this.selectedPath=this.calcSegment(this.inner+3,this.inner+this.outer),this.hilight=this.calcArc(this.inner)}return h(b,a),b.prototype.calcArcPoints=function(a){return[this.cx+a*this.sin_p0,this.cy+a*this.cos_p0,this.cx+a*this.sin_p1,this.cy+a*this.cos_p1]},b.prototype.calcSegment=function(a,b){var c,d,e,f,g,h,i,j,k,l;return k=this.calcArcPoints(a),c=k[0],e=k[1],d=k[2],f=k[3],l=this.calcArcPoints(b),g=l[0],i=l[1],h=l[2],j=l[3],"M"+c+","+e+("A"+a+","+a+",0,"+this.is_long+",0,"+d+","+f)+("L"+h+","+j)+("A"+b+","+b+",0,"+this.is_long+",1,"+g+","+i)+"Z"},b.prototype.calcArc=function(a){var b,c,d,e,f;return f=this.calcArcPoints(a),b=f[0],d=f[1],c=f[2],e=f[3],"M"+b+","+d+("A"+a+","+a+",0,"+this.is_long+",0,"+c+","+e)},b.prototype.render=function(){var a=this;return this.arc=this.drawDonutArc(this.hilight,this.color),this.seg=this.drawDonutSegment(this.path,this.color,this.backgroundColor,function(){return a.fire("hover",a.index)},function(){return a.fire("click",a.index)})},b.prototype.drawDonutArc=function(a,b){return this.raphael.path(a).attr({stroke:b,"stroke-width":2,opacity:0})},b.prototype.drawDonutSegment=function(a,b,c,d,e){return this.raphael.path(a).attr({fill:b,stroke:c,"stroke-width":3}).hover(d).click(e)},b.prototype.select=function(){return this.selected?void 0:(this.seg.animate({path:this.selectedPath},150,"<>"),this.arc.animate({opacity:1},150,"<>"),this.selected=!0)},b.prototype.deselect=function(){return this.selected?(this.seg.animate({path:this.path},150,"<>"),this.arc.animate({opacity:0},150,"<>"),this.selected=!1):void 0},b}(b.EventEmitter)}).call(this); \ No newline at end of file diff --git a/theme/bootstrap/plugins/pace/pace.js b/theme/bootstrap/plugins/pace/pace.js new file mode 100644 index 0000000..c47d6e5 --- /dev/null +++ b/theme/bootstrap/plugins/pace/pace.js @@ -0,0 +1,2 @@ +/*! pace 1.0.0 */ +(function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X=[].slice,Y={}.hasOwnProperty,Z=function(a,b){function c(){this.constructor=a}for(var d in b)Y.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},$=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};for(u={catchupTime:100,initialRate:.03,minTime:250,ghostTime:100,maxProgressPerFrame:20,easeFactor:1.25,startOnPageLoad:!0,restartOnPushState:!0,restartOnRequestAfter:500,target:"body",elements:{checkInterval:100,selectors:["body"]},eventLag:{minSamples:10,sampleCount:3,lagThreshold:3},ajax:{trackMethods:["GET"],trackWebSockets:!0,ignoreURLs:[]}},C=function(){var a;return null!=(a="undefined"!=typeof performance&&null!==performance&&"function"==typeof performance.now?performance.now():void 0)?a:+new Date},E=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame,t=window.cancelAnimationFrame||window.mozCancelAnimationFrame,null==E&&(E=function(a){return setTimeout(a,50)},t=function(a){return clearTimeout(a)}),G=function(a){var b,c;return b=C(),(c=function(){var d;return d=C()-b,d>=33?(b=C(),a(d,function(){return E(c)})):setTimeout(c,33-d)})()},F=function(){var a,b,c;return c=arguments[0],b=arguments[1],a=3<=arguments.length?X.call(arguments,2):[],"function"==typeof c[b]?c[b].apply(c,a):c[b]},v=function(){var a,b,c,d,e,f,g;for(b=arguments[0],d=2<=arguments.length?X.call(arguments,1):[],f=0,g=d.length;g>f;f++)if(c=d[f])for(a in c)Y.call(c,a)&&(e=c[a],null!=b[a]&&"object"==typeof b[a]&&null!=e&&"object"==typeof e?v(b[a],e):b[a]=e);return b},q=function(a){var b,c,d,e,f;for(c=b=0,e=0,f=a.length;f>e;e++)d=a[e],c+=Math.abs(d),b++;return c/b},x=function(a,b){var c,d,e;if(null==a&&(a="options"),null==b&&(b=!0),e=document.querySelector("[data-pace-"+a+"]")){if(c=e.getAttribute("data-pace-"+a),!b)return c;try{return JSON.parse(c)}catch(f){return d=f,"undefined"!=typeof console&&null!==console?console.error("Error parsing inline pace options",d):void 0}}},g=function(){function a(){}return a.prototype.on=function(a,b,c,d){var e;return null==d&&(d=!1),null==this.bindings&&(this.bindings={}),null==(e=this.bindings)[a]&&(e[a]=[]),this.bindings[a].push({handler:b,ctx:c,once:d})},a.prototype.once=function(a,b,c){return this.on(a,b,c,!0)},a.prototype.off=function(a,b){var c,d,e;if(null!=(null!=(d=this.bindings)?d[a]:void 0)){if(null==b)return delete this.bindings[a];for(c=0,e=[];c<this.bindings[a].length;)e.push(this.bindings[a][c].handler===b?this.bindings[a].splice(c,1):c++);return e}},a.prototype.trigger=function(){var a,b,c,d,e,f,g,h,i;if(c=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],null!=(g=this.bindings)?g[c]:void 0){for(e=0,i=[];e<this.bindings[c].length;)h=this.bindings[c][e],d=h.handler,b=h.ctx,f=h.once,d.apply(null!=b?b:this,a),i.push(f?this.bindings[c].splice(e,1):e++);return i}},a}(),j=window.Pace||{},window.Pace=j,v(j,g.prototype),D=j.options=v({},u,window.paceOptions,x()),U=["ajax","document","eventLag","elements"],Q=0,S=U.length;S>Q;Q++)K=U[Q],D[K]===!0&&(D[K]=u[K]);i=function(a){function b(){return V=b.__super__.constructor.apply(this,arguments)}return Z(b,a),b}(Error),b=function(){function a(){this.progress=0}return a.prototype.getElement=function(){var a;if(null==this.el){if(a=document.querySelector(D.target),!a)throw new i;this.el=document.createElement("div"),this.el.className="pace pace-active",document.body.className=document.body.className.replace(/pace-done/g,""),document.body.className+=" pace-running",this.el.innerHTML='<div class="pace-progress">\n <div class="pace-progress-inner"></div>\n</div>\n<div class="pace-activity"></div>',null!=a.firstChild?a.insertBefore(this.el,a.firstChild):a.appendChild(this.el)}return this.el},a.prototype.finish=function(){var a;return a=this.getElement(),a.className=a.className.replace("pace-active",""),a.className+=" pace-inactive",document.body.className=document.body.className.replace("pace-running",""),document.body.className+=" pace-done"},a.prototype.update=function(a){return this.progress=a,this.render()},a.prototype.destroy=function(){try{this.getElement().parentNode.removeChild(this.getElement())}catch(a){i=a}return this.el=void 0},a.prototype.render=function(){var a,b,c,d,e,f,g;if(null==document.querySelector(D.target))return!1;for(a=this.getElement(),d="translate3d("+this.progress+"%, 0, 0)",g=["webkitTransform","msTransform","transform"],e=0,f=g.length;f>e;e++)b=g[e],a.children[0].style[b]=d;return(!this.lastRenderedProgress||this.lastRenderedProgress|0!==this.progress|0)&&(a.children[0].setAttribute("data-progress-text",""+(0|this.progress)+"%"),this.progress>=100?c="99":(c=this.progress<10?"0":"",c+=0|this.progress),a.children[0].setAttribute("data-progress",""+c)),this.lastRenderedProgress=this.progress},a.prototype.done=function(){return this.progress>=100},a}(),h=function(){function a(){this.bindings={}}return a.prototype.trigger=function(a,b){var c,d,e,f,g;if(null!=this.bindings[a]){for(f=this.bindings[a],g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(c.call(this,b));return g}},a.prototype.on=function(a,b){var c;return null==(c=this.bindings)[a]&&(c[a]=[]),this.bindings[a].push(b)},a}(),P=window.XMLHttpRequest,O=window.XDomainRequest,N=window.WebSocket,w=function(a,b){var c,d,e,f;f=[];for(d in b.prototype)try{e=b.prototype[d],f.push(null==a[d]&&"function"!=typeof e?a[d]=e:void 0)}catch(g){c=g}return f},A=[],j.ignore=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],A.unshift("ignore"),c=b.apply(null,a),A.shift(),c},j.track=function(){var a,b,c;return b=arguments[0],a=2<=arguments.length?X.call(arguments,1):[],A.unshift("track"),c=b.apply(null,a),A.shift(),c},J=function(a){var b;if(null==a&&(a="GET"),"track"===A[0])return"force";if(!A.length&&D.ajax){if("socket"===a&&D.ajax.trackWebSockets)return!0;if(b=a.toUpperCase(),$.call(D.ajax.trackMethods,b)>=0)return!0}return!1},k=function(a){function b(){var a,c=this;b.__super__.constructor.apply(this,arguments),a=function(a){var b;return b=a.open,a.open=function(d,e){return J(d)&&c.trigger("request",{type:d,url:e,request:a}),b.apply(a,arguments)}},window.XMLHttpRequest=function(b){var c;return c=new P(b),a(c),c};try{w(window.XMLHttpRequest,P)}catch(d){}if(null!=O){window.XDomainRequest=function(){var b;return b=new O,a(b),b};try{w(window.XDomainRequest,O)}catch(d){}}if(null!=N&&D.ajax.trackWebSockets){window.WebSocket=function(a,b){var d;return d=null!=b?new N(a,b):new N(a),J("socket")&&c.trigger("request",{type:"socket",url:a,protocols:b,request:d}),d};try{w(window.WebSocket,N)}catch(d){}}}return Z(b,a),b}(h),R=null,y=function(){return null==R&&(R=new k),R},I=function(a){var b,c,d,e;for(e=D.ajax.ignoreURLs,c=0,d=e.length;d>c;c++)if(b=e[c],"string"==typeof b){if(-1!==a.indexOf(b))return!0}else if(b.test(a))return!0;return!1},y().on("request",function(b){var c,d,e,f,g;return f=b.type,e=b.request,g=b.url,I(g)?void 0:j.running||D.restartOnRequestAfter===!1&&"force"!==J(f)?void 0:(d=arguments,c=D.restartOnRequestAfter||0,"boolean"==typeof c&&(c=0),setTimeout(function(){var b,c,g,h,i,k;if(b="socket"===f?e.readyState<2:0<(h=e.readyState)&&4>h){for(j.restart(),i=j.sources,k=[],c=0,g=i.length;g>c;c++){if(K=i[c],K instanceof a){K.watch.apply(K,d);break}k.push(void 0)}return k}},c))}),a=function(){function a(){var a=this;this.elements=[],y().on("request",function(){return a.watch.apply(a,arguments)})}return a.prototype.watch=function(a){var b,c,d,e;return d=a.type,b=a.request,e=a.url,I(e)?void 0:(c="socket"===d?new n(b):new o(b),this.elements.push(c))},a}(),o=function(){function a(a){var b,c,d,e,f,g,h=this;if(this.progress=0,null!=window.ProgressEvent)for(c=null,a.addEventListener("progress",function(a){return h.progress=a.lengthComputable?100*a.loaded/a.total:h.progress+(100-h.progress)/2},!1),g=["load","abort","timeout","error"],d=0,e=g.length;e>d;d++)b=g[d],a.addEventListener(b,function(){return h.progress=100},!1);else f=a.onreadystatechange,a.onreadystatechange=function(){var b;return 0===(b=a.readyState)||4===b?h.progress=100:3===a.readyState&&(h.progress=50),"function"==typeof f?f.apply(null,arguments):void 0}}return a}(),n=function(){function a(a){var b,c,d,e,f=this;for(this.progress=0,e=["error","open"],c=0,d=e.length;d>c;c++)b=e[c],a.addEventListener(b,function(){return f.progress=100},!1)}return a}(),d=function(){function a(a){var b,c,d,f;for(null==a&&(a={}),this.elements=[],null==a.selectors&&(a.selectors=[]),f=a.selectors,c=0,d=f.length;d>c;c++)b=f[c],this.elements.push(new e(b))}return a}(),e=function(){function a(a){this.selector=a,this.progress=0,this.check()}return a.prototype.check=function(){var a=this;return document.querySelector(this.selector)?this.done():setTimeout(function(){return a.check()},D.elements.checkInterval)},a.prototype.done=function(){return this.progress=100},a}(),c=function(){function a(){var a,b,c=this;this.progress=null!=(b=this.states[document.readyState])?b:100,a=document.onreadystatechange,document.onreadystatechange=function(){return null!=c.states[document.readyState]&&(c.progress=c.states[document.readyState]),"function"==typeof a?a.apply(null,arguments):void 0}}return a.prototype.states={loading:0,interactive:50,complete:100},a}(),f=function(){function a(){var a,b,c,d,e,f=this;this.progress=0,a=0,e=[],d=0,c=C(),b=setInterval(function(){var g;return g=C()-c-50,c=C(),e.push(g),e.length>D.eventLag.sampleCount&&e.shift(),a=q(e),++d>=D.eventLag.minSamples&&a<D.eventLag.lagThreshold?(f.progress=100,clearInterval(b)):f.progress=100*(3/(a+3))},50)}return a}(),m=function(){function a(a){this.source=a,this.last=this.sinceLastUpdate=0,this.rate=D.initialRate,this.catchup=0,this.progress=this.lastProgress=0,null!=this.source&&(this.progress=F(this.source,"progress"))}return a.prototype.tick=function(a,b){var c;return null==b&&(b=F(this.source,"progress")),b>=100&&(this.done=!0),b===this.last?this.sinceLastUpdate+=a:(this.sinceLastUpdate&&(this.rate=(b-this.last)/this.sinceLastUpdate),this.catchup=(b-this.progress)/D.catchupTime,this.sinceLastUpdate=0,this.last=b),b>this.progress&&(this.progress+=this.catchup*a),c=1-Math.pow(this.progress/100,D.easeFactor),this.progress+=c*this.rate*a,this.progress=Math.min(this.lastProgress+D.maxProgressPerFrame,this.progress),this.progress=Math.max(0,this.progress),this.progress=Math.min(100,this.progress),this.lastProgress=this.progress,this.progress},a}(),L=null,H=null,r=null,M=null,p=null,s=null,j.running=!1,z=function(){return D.restartOnPushState?j.restart():void 0},null!=window.history.pushState&&(T=window.history.pushState,window.history.pushState=function(){return z(),T.apply(window.history,arguments)}),null!=window.history.replaceState&&(W=window.history.replaceState,window.history.replaceState=function(){return z(),W.apply(window.history,arguments)}),l={ajax:a,elements:d,document:c,eventLag:f},(B=function(){var a,c,d,e,f,g,h,i;for(j.sources=L=[],g=["ajax","elements","document","eventLag"],c=0,e=g.length;e>c;c++)a=g[c],D[a]!==!1&&L.push(new l[a](D[a]));for(i=null!=(h=D.extraSources)?h:[],d=0,f=i.length;f>d;d++)K=i[d],L.push(new K(D));return j.bar=r=new b,H=[],M=new m})(),j.stop=function(){return j.trigger("stop"),j.running=!1,r.destroy(),s=!0,null!=p&&("function"==typeof t&&t(p),p=null),B()},j.restart=function(){return j.trigger("restart"),j.stop(),j.start()},j.go=function(){var a;return j.running=!0,r.render(),a=C(),s=!1,p=G(function(b,c){var d,e,f,g,h,i,k,l,n,o,p,q,t,u,v,w;for(l=100-r.progress,e=p=0,f=!0,i=q=0,u=L.length;u>q;i=++q)for(K=L[i],o=null!=H[i]?H[i]:H[i]=[],h=null!=(w=K.elements)?w:[K],k=t=0,v=h.length;v>t;k=++t)g=h[k],n=null!=o[k]?o[k]:o[k]=new m(g),f&=n.done,n.done||(e++,p+=n.tick(b));return d=p/e,r.update(M.tick(b,d)),r.done()||f||s?(r.update(100),j.trigger("done"),setTimeout(function(){return r.finish(),j.running=!1,j.trigger("hide")},Math.max(D.ghostTime,Math.max(D.minTime-(C()-a),0)))):c()})},j.start=function(a){v(D,a),j.running=!0;try{r.render()}catch(b){i=b}return document.querySelector(".pace")?(j.trigger("start"),j.go()):setTimeout(j.start,50)},"function"==typeof define&&define.amd?define(function(){return j}):"object"==typeof exports?module.exports=j:D.startOnPageLoad&&j.start()}).call(this); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/az.js b/theme/bootstrap/plugins/select2/i18n/az.js new file mode 100644 index 0000000..3ad855a --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/az.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/az",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return t+" simvol silin"},inputTooShort:function(e){var t=e.minimum-e.input.length;return t+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(e){return"Sadəcə "+e.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/bg.js b/theme/bootstrap/plugins/select2/i18n/bg.js new file mode 100644 index 0000000..edad761 --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/bg.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/bg",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Моля въведете с "+t+" по-малко символ";return t>1&&(n+="a"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Моля въведете още "+t+" символ";return t>1&&(n+="a"),n},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(e){var t="Можете да направите до "+e.maximum+" ";return e.maximum>1?t+="избора":t+="избор",t},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/ca.js b/theme/bootstrap/plugins/select2/i18n/ca.js new file mode 100644 index 0000000..3f5db5e --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/ca.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Si us plau, elimina "+t+" car";return t==1?n+="àcter":n+="àcters",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Si us plau, introdueix "+t+" car";return t==1?n+="àcter":n+="àcters",n},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var t="Només es pot seleccionar "+e.maximum+" element";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/cs.js b/theme/bootstrap/plugins/select2/i18n/cs.js new file mode 100644 index 0000000..d5823e9 --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/cs.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/cs",[],function(){function e(e,t){switch(e){case 2:return t?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím zadejte o jeden znak méně":n<=4?"Prosím zadejte o "+e(n,!0)+" znaky méně":"Prosím zadejte o "+n+" znaků méně"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím zadejte ještě jeden znak":n<=4?"Prosím zadejte ještě další "+e(n,!0)+" znaky":"Prosím zadejte ještě dalších "+n+" znaků"},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(t){var n=t.maximum;return n==1?"Můžete zvolit jen jednu položku":n<=4?"Můžete zvolit maximálně "+e(n,!1)+" položky":"Můžete zvolit maximálně "+n+" položek"},noResults:function(){return"Nenalezeny žádné položky"},searching:function(){return"Vyhledávání…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/da.js b/theme/bootstrap/plugins/select2/i18n/da.js new file mode 100644 index 0000000..e9d2531 --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/da.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Angiv venligst "+t+" tegn mindre";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Angiv venligst "+t+" tegn mere";return n},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var t="Du kan kun vælge "+e.maximum+" emne";return e.maximum!=1&&(t+="r"),t},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/de.js b/theme/bootstrap/plugins/select2/i18n/de.js new file mode 100644 index 0000000..2224138 --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/de.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/de",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Bitte "+t+" Zeichen weniger eingeben"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Bitte "+t+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var t="Sie können nur "+e.maximum+" Eintr";return e.maximum===1?t+="ag":t+="äge",t+=" auswählen",t},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/en.js b/theme/bootstrap/plugins/select2/i18n/en.js new file mode 100644 index 0000000..869dfd7 --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/en.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Please delete "+t+" character";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Please enter "+t+" or more characters";return n},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var t="You can only select "+e.maximum+" item";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/es.js b/theme/bootstrap/plugins/select2/i18n/es.js new file mode 100644 index 0000000..f12d3f5 --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/es.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"La carga falló"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor, elimine "+t+" car";return t==1?n+="ácter":n+="acteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Por favor, introduzca "+t+" car";return t==1?n+="ácter":n+="acteres",n},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var t="Sólo puede seleccionar "+e.maximum+" elemento";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/et.js b/theme/bootstrap/plugins/select2/i18n/et.js new file mode 100644 index 0000000..b0603bd --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/et.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" vähem",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" rohkem",n},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var t="Saad vaid "+e.maximum+" tulemus";return e.maximum==1?t+="e":t+="t",t+=" valida",t},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/eu.js b/theme/bootstrap/plugins/select2/i18n/eu.js new file mode 100644 index 0000000..3abb677 --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/eu.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gutxiago",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gehiago",n},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return e.maximum===1?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/fa.js b/theme/bootstrap/plugins/select2/i18n/fa.js new file mode 100644 index 0000000..49abc41 --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/fa.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="لطفاً "+t+" کاراکتر را حذف نمایید";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="لطفاً تعداد "+t+" کاراکتر یا بیشتر وارد نمایید";return n},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(e){var t="شما تنها می‌توانید "+e.maximum+" آیتم را انتخاب نمایید";return t},noResults:function(){return"هیچ نتیجه‌ای یافت نشد"},searching:function(){return"در حال جستجو..."}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/fi.js b/theme/bootstrap/plugins/select2/i18n/fi.js new file mode 100644 index 0000000..fef0d8b --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/fi.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Ole hyvä ja anna "+t+" merkkiä vähemmän"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Ole hyvä ja anna "+t+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(e){return"Voit valita ainoastaan "+e.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/fr.js b/theme/bootstrap/plugins/select2/i18n/fr.js new file mode 100644 index 0000000..4439522 --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/fr.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fr",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Supprimez "+t+" caractère";return t!==1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Saisissez "+t+" caractère";return t!==1&&(n+="s"),n},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){var t="Vous pouvez seulement sélectionner "+e.maximum+" élément";return e.maximum!==1&&(t+="s"),t},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/gl.js b/theme/bootstrap/plugins/select2/i18n/gl.js new file mode 100644 index 0000000..9e593af --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/gl.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/gl",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Engada ";return t===1?n+="un carácter":n+=t+" caracteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Elimine ";return t===1?n+="un carácter":n+=t+" caracteres",n},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){var t="Só pode ";return e.maximum===1?t+="un elemento":t+=e.maximum+" elementos",t},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/he.js b/theme/bootstrap/plugins/select2/i18n/he.js new file mode 100644 index 0000000..c5102c3 --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/he.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"התוצאות לא נטענו בהלכה"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="נא למחוק "+t+" תווים";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="נא להכניס "+t+" תווים או יותר";return n},loadingMore:function(){return"טען תוצאות נוספות…"},maximumSelected:function(e){var t="באפשרותך לבחור רק "+e.maximum+" פריטים";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/hi.js b/theme/bootstrap/plugins/select2/i18n/hi.js new file mode 100644 index 0000000..f8dd58a --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/hi.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" अक्षर को हटा दें";return t>1&&(n=t+" अक्षरों को हटा दें "),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="कृपया "+t+" या अधिक अक्षर दर्ज करें";return n},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(e){var t="आप केवल "+e.maximum+" आइटम का चयन कर सकते हैं";return t},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/hr.js b/theme/bootstrap/plugins/select2/i18n/hr.js new file mode 100644 index 0000000..a783b3f --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/hr.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hr",[],function(){function e(e){var t=" "+e+" znak";return e%10<5&&e%10>0&&(e%100<5||e%100>19)?e%10>1&&(t+="a"):t+="ova",t}return{inputTooLong:function(t){var n=t.input.length-t.maximum;return"Unesite "+e(n)},inputTooShort:function(t){var n=t.minimum-t.input.length;return"Unesite još "+e(n)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(e){return"Maksimalan broj odabranih stavki je "+e.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/hu.js b/theme/bootstrap/plugins/select2/i18n/hu.js new file mode 100644 index 0000000..d13fea2 --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/hu.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Túl hosszú. "+t+" karakterrel több, mint kellene."},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Túl rövid. Még "+t+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/id.js b/theme/bootstrap/plugins/select2/i18n/id.js new file mode 100644 index 0000000..7ffb8db --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/id.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/id",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Hapuskan "+t+" huruf"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Masukkan "+t+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(e){return"Anda hanya dapat memilih "+e.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/is.js b/theme/bootstrap/plugins/select2/i18n/is.js new file mode 100644 index 0000000..588ec1d --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/is.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/is",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vinsamlegast styttið texta um "+t+" staf";return t<=1?n:n+"i"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vinsamlegast skrifið "+t+" staf";return t>1&&(n+="i"),n+=" í viðbót",n},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(e){return"Þú getur aðeins valið "+e.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/it.js b/theme/bootstrap/plugins/select2/i18n/it.js new file mode 100644 index 0000000..0488d3b --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/it.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Per favore cancella "+t+" caratter";return t!==1?n+="i":n+="e",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Per favore inserisci "+t+" o più caratteri";return n},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var t="Puoi selezionare solo "+e.maximum+" element";return e.maximum!==1?t+="i":t+="o",t},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/ko.js b/theme/bootstrap/plugins/select2/i18n/ko.js new file mode 100644 index 0000000..80b5a8b --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/ko.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="너무 깁니다. "+t+" 글자 지워주세요.";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="너무 짧습니다. "+t+" 글자 더 입력해주세요.";return n},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(e){var t="최대 "+e.maximum+"개까지만 선택 가능합니다.";return t},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/lt.js b/theme/bootstrap/plugins/select2/i18n/lt.js new file mode 100644 index 0000000..27cfe36 --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/lt.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lt",[],function(){function e(e,t,n,r){return e%100>9&&e%100<21||e%10===0?e%10>1?n:r:t}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Pašalinkite "+n+" simbol";return r+=e(n,"ių","ius","į"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Įrašykite dar "+n+" simbol";return r+=e(n,"ių","ius","į"),r},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(t){var n="Jūs galite pasirinkti tik "+t.maximum+" element";return n+=e(t.maximum,"ų","us","ą"),n},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/lv.js b/theme/bootstrap/plugins/select2/i18n/lv.js new file mode 100644 index 0000000..b47bc8e --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/lv.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lv",[],function(){function e(e,t,n,r){return e===11?t:e%10===1?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Lūdzu ievadiet par "+n;return r+=" simbol"+e(n,"iem","u","iem"),r+" mazāk"},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Lūdzu ievadiet vēl "+n;return r+=" simbol"+e(n,"us","u","us"),r},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(t){var n="Jūs varat izvēlēties ne vairāk kā "+t.maximum;return n+=" element"+e(t.maximum,"us","u","us"),n},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/mk.js b/theme/bootstrap/plugins/select2/i18n/mk.js new file mode 100644 index 0000000..065a47a --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/mk.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/mk",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Ве молиме внесете "+e.maximum+" помалку карактер";return e.maximum!==1&&(n+="и"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Ве молиме внесете уште "+e.maximum+" карактер";return e.maximum!==1&&(n+="и"),n},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(e){var t="Можете да изберете само "+e.maximum+" ставк";return e.maximum===1?t+="а":t+="и",t},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/nb.js b/theme/bootstrap/plugins/select2/i18n/nb.js new file mode 100644 index 0000000..d7328a2 --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/nb.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nb",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Vennligst fjern "+t+" tegn"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vennligst skriv inn ";return t>1?n+=" flere tegn":n+=" tegn til",n},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/nl.js b/theme/bootstrap/plugins/select2/i18n/nl.js new file mode 100644 index 0000000..b30c81c --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/nl.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Gelieve "+t+" karakters te verwijderen";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Gelieve "+t+" of meer karakters in te voeren";return n},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var t="Er kunnen maar "+e.maximum+" item";return e.maximum!=1&&(t+="s"),t+=" worden geselecteerd",t},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/pl.js b/theme/bootstrap/plugins/select2/i18n/pl.js new file mode 100644 index 0000000..0c0923c --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/pl.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pl",[],function(){var e=["znak","znaki","znaków"],t=["element","elementy","elementów"],n=function(t,n){if(t===1)return n[0];if(t>1&&t<=4)return n[1];if(t>=5)return n[2]};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Usuń "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Podaj przynajmniej "+r+" "+n(r,e)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(e){return"Możesz zaznaczyć tylko "+e.maximum+" "+n(e.maxiumum,t)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/pt-BR.js b/theme/bootstrap/plugins/select2/i18n/pt-BR.js new file mode 100644 index 0000000..2535114 --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/pt-BR.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Apague "+t+" caracter";return t!=1&&(n+="es"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Digite "+t+" ou mais caracteres";return n},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var t="Você só pode selecionar "+e.maximum+" ite";return e.maximum==1?t+="m":t+="ns",t},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/pt.js b/theme/bootstrap/plugins/select2/i18n/pt.js new file mode 100644 index 0000000..6dcc51f --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/pt.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor apague "+t+" ";return n+=t!=1?"caracteres":"carácter",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Introduza "+t+" ou mais caracteres";return n},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var t="Apenas pode seleccionar "+e.maximum+" ";return t+=e.maximum!=1?"itens":"item",t},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/ro.js b/theme/bootstrap/plugins/select2/i18n/ro.js new file mode 100644 index 0000000..61e7f12 --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/ro.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ro",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să introduceți mai puțin de "+t;return n+=" caracter",n!==1&&(n+="e"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vă rugăm să introduceți incă "+t;return n+=" caracter",n!==1&&(n+="e"),n},loadingMore:function(){return"Se încarcă…"},maximumSelected:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",t!==1&&(t+="e"),t},noResults:function(){return"Nu a fost găsit nimic"},searching:function(){return"Căutare…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/ru.js b/theme/bootstrap/plugins/select2/i18n/ru.js new file mode 100644 index 0000000..e082600 --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/ru.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ru",[],function(){function e(e,t,n,r){return e%10<5&&e%10>0&&e%100<5||e%100>20?e%10>1?n:t:r}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Пожалуйста, введите на "+n+" символ";return r+=e(n,"","a","ов"),r+=" меньше",r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Пожалуйста, введите еще хотя бы "+n+" символ";return r+=e(n,"","a","ов"),r},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(t){var n="Вы можете выбрать не более "+t.maximum+" элемент";return n+=e(t.maximum,"","a","ов"),n},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/sk.js b/theme/bootstrap/plugins/select2/i18n/sk.js new file mode 100644 index 0000000..8f92855 --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/sk.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím, zadajte o jeden znak menej":n>=2&&n<=4?"Prosím, zadajte o "+e[n](!0)+" znaky menej":"Prosím, zadajte o "+n+" znakov menej"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím, zadajte ešte jeden znak":n<=4?"Prosím, zadajte ešte ďalšie "+e[n](!0)+" znaky":"Prosím, zadajte ešte ďalších "+n+" znakov"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(t){return t.maximum==1?"Môžete zvoliť len jednu položku":t.maximum>=2&&t.maximum<=4?"Môžete zvoliť najviac "+e[t.maximum](!1)+" položky":"Môžete zvoliť najviac "+t.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/sr.js b/theme/bootstrap/plugins/select2/i18n/sr.js new file mode 100644 index 0000000..5ed6a81 --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/sr.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Obrišite "+n+" simbol";return r+=e(n,"","a","a"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Ukucajte bar još "+n+" simbol";return r+=e(n,"","a","a"),r},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(t){var n="Možete izabrati samo "+t.maximum+" stavk";return n+=e(t.maximum,"u","e","i"),n},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/sv.js b/theme/bootstrap/plugins/select2/i18n/sv.js new file mode 100644 index 0000000..1934e36 --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/sv.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vänligen sudda ut "+t+" tecken";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vänligen skriv in "+t+" eller fler tecken";return n},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(e){var t="Du kan max välja "+e.maximum+" element";return t},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/th.js b/theme/bootstrap/plugins/select2/i18n/th.js new file mode 100644 index 0000000..91c911c --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/th.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/th",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="โปรดลบออก "+t+" ตัวอักษร";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="โปรดพิมพ์เพิ่มอีก "+t+" ตัวอักษร";return n},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(e){var t="คุณสามารถเลือกได้ไม่เกิน "+e.maximum+" รายการ";return t},noResults:function(){return"ม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/tr.js b/theme/bootstrap/plugins/select2/i18n/tr.js new file mode 100644 index 0000000..2d616c8 --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/tr.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/tr",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" karakter daha girmelisiniz";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="En az "+t+" karakter daha girmelisiniz";return n},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(e){var t="Sadece "+e.maximum+" seçim yapabilirsiniz";return t},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/uk.js b/theme/bootstrap/plugins/select2/i18n/uk.js new file mode 100644 index 0000000..ea34a4a --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/uk.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/uk",[],function(){function e(e,t,n,r){return e%100>10&&e%100<15?r:e%10===1?t:e%10>1&&e%10<5?n:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Будь ласка, видаліть "+n+" "+e(t.maximum,"літеру","літери","літер")},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Будь ласка, введіть "+t+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(t){return"Ви можете вибрати лише "+t.maximum+" "+e(t.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/vi.js b/theme/bootstrap/plugins/select2/i18n/vi.js new file mode 100644 index 0000000..5c22a14 --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/vi.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/vi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vui lòng nhập ít hơn "+t+" ký tự";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vui lòng nhập nhiều hơn "+t+' ký tự"';return n},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(e){var t="Chỉ có thể chọn được "+e.maximum+" lựa chọn";return t},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/zh-CN.js b/theme/bootstrap/plugins/select2/i18n/zh-CN.js new file mode 100644 index 0000000..df0ea41 --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/zh-CN.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="请删除"+t+"个字符";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="请再输入至少"+t+"个字符";return n},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(e){var t="最多只能选择"+e.maximum+"个项目";return t},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/i18n/zh-TW.js b/theme/bootstrap/plugins/select2/i18n/zh-TW.js new file mode 100644 index 0000000..017483b --- /dev/null +++ b/theme/bootstrap/plugins/select2/i18n/zh-TW.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */ + +(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="請刪掉"+t+"個字元";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="請再輸入"+t+"個字元";return n},loadingMore:function(){return"載入中…"},maximumSelected:function(e){var t="你只能選擇最多"+e.maximum+"項";return t},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"}}}),{define:e.define,require:e.require}})(); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/select2.css b/theme/bootstrap/plugins/select2/select2.css new file mode 100644 index 0000000..d365213 --- /dev/null +++ b/theme/bootstrap/plugins/select2/select2.css @@ -0,0 +1,431 @@ +.select2-container { + box-sizing: border-box; + display: inline-block; + margin: 0; + position: relative; + vertical-align: middle; } + .select2-container .select2-selection--single { + box-sizing: border-box; + cursor: pointer; + display: block; + height: 28px; + user-select: none; + -webkit-user-select: none; } + .select2-container .select2-selection--single .select2-selection__rendered { + display: block; + padding-left: 8px; + padding-right: 20px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { + padding-right: 8px; + padding-left: 20px; } + .select2-container .select2-selection--multiple { + box-sizing: border-box; + cursor: pointer; + display: block; + min-height: 32px; + user-select: none; + -webkit-user-select: none; } + .select2-container .select2-selection--multiple .select2-selection__rendered { + display: inline-block; + overflow: hidden; + padding-left: 8px; + text-overflow: ellipsis; + white-space: nowrap; } + .select2-container .select2-search--inline { + float: left; } + .select2-container .select2-search--inline .select2-search__field { + box-sizing: border-box; + border: none; + font-size: 100%; + margin-top: 5px; } + .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; } + +.select2-dropdown { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + box-sizing: border-box; + display: block; + position: absolute; + left: -100000px; + width: 100%; + z-index: 1051; } + +.select2-results { + display: block; } + +.select2-results__options { + list-style: none; + margin: 0; + padding: 0; } + +.select2-results__option { + padding: 6px; + user-select: none; + -webkit-user-select: none; } + .select2-results__option[aria-selected] { + cursor: pointer; } + +.select2-container--open .select2-dropdown { + left: 0; } + +.select2-container--open .select2-dropdown--above { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } + +.select2-container--open .select2-dropdown--below { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.select2-search--dropdown { + display: block; + padding: 4px; } + .select2-search--dropdown .select2-search__field { + padding: 4px; + width: 100%; + box-sizing: border-box; } + .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { + -webkit-appearance: none; } + .select2-search--dropdown.select2-search--hide { + display: none; } + +.select2-close-mask { + border: 0; + margin: 0; + padding: 0; + display: block; + position: fixed; + left: 0; + top: 0; + min-height: 100%; + min-width: 100%; + height: auto; + width: auto; + opacity: 0; + z-index: 99; + background-color: #fff; + filter: alpha(opacity=0); } + +.select2-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; } + +.select2-container--default .select2-selection--single { + background-color: #fff; + border: 1px solid #aaa; + border-radius: 4px; } + .select2-container--default .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; } + .select2-container--default .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; } + .select2-container--default .select2-selection--single .select2-selection__placeholder { + color: #999; } + .select2-container--default .select2-selection--single .select2-selection__arrow { + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; } + .select2-container--default .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; } +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; } +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { + left: 1px; + right: auto; } +.select2-container--default.select2-container--disabled .select2-selection--single { + background-color: #eee; + cursor: default; } + .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { + display: none; } +.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; } +.select2-container--default .select2-selection--multiple { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; } + .select2-container--default .select2-selection--multiple .select2-selection__rendered { + box-sizing: border-box; + list-style: none; + margin: 0; + padding: 0 5px; + width: 100%; } + .select2-container--default .select2-selection--multiple .select2-selection__placeholder { + color: #999; + margin-top: 5px; + float: left; } + .select2-container--default .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-top: 5px; + margin-right: 10px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + color: #999; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; } + .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #333; } +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder { + float: right; } +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; } +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; } +.select2-container--default.select2-container--focus .select2-selection--multiple { + border: solid black 1px; + outline: 0; } +.select2-container--default.select2-container--disabled .select2-selection--multiple { + background-color: #eee; + cursor: default; } +.select2-container--default.select2-container--disabled .select2-selection__choice__remove { + display: none; } +.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { + border-top-left-radius: 0; + border-top-right-radius: 0; } +.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } +.select2-container--default .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; } +.select2-container--default .select2-search--inline .select2-search__field { + background: transparent; + border: none; + outline: 0; } +.select2-container--default .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; } +.select2-container--default .select2-results__option[role=group] { + padding: 0; } +.select2-container--default .select2-results__option[aria-disabled=true] { + color: #999; } +.select2-container--default .select2-results__option[aria-selected=true] { + background-color: #ddd; } +.select2-container--default .select2-results__option .select2-results__option { + padding-left: 1em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__group { + padding-left: 0; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option { + margin-left: -1em; + padding-left: 2em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -2em; + padding-left: 3em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3em; + padding-left: 4em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -4em; + padding-left: 5em; } + .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -5em; + padding-left: 6em; } +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: #5897fb; + color: white; } +.select2-container--default .select2-results__group { + cursor: default; + display: block; + padding: 6px; } + +.select2-container--classic .select2-selection--single { + background-color: #f6f6f6; + border: 1px solid #aaa; + border-radius: 4px; + outline: 0; + background-image: -webkit-linear-gradient(top, #ffffff 50%, #eeeeee 100%); + background-image: -o-linear-gradient(top, #ffffff 50%, #eeeeee 100%); + background-image: linear-gradient(to bottom, #ffffff 50%, #eeeeee 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0); } + .select2-container--classic .select2-selection--single:focus { + border: 1px solid #5897fb; } + .select2-container--classic .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: 28px; } + .select2-container--classic .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + margin-right: 10px; } + .select2-container--classic .select2-selection--single .select2-selection__placeholder { + color: #999; } + .select2-container--classic .select2-selection--single .select2-selection__arrow { + background-color: #ddd; + border: none; + border-left: 1px solid #aaa; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + height: 26px; + position: absolute; + top: 1px; + right: 1px; + width: 20px; + background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); + background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); + background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#cccccc', GradientType=0); } + .select2-container--classic .select2-selection--single .select2-selection__arrow b { + border-color: #888 transparent transparent transparent; + border-style: solid; + border-width: 5px 4px 0 4px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; } +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; } +.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { + border: none; + border-right: 1px solid #aaa; + border-radius: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + left: 1px; + right: auto; } +.select2-container--classic.select2-container--open .select2-selection--single { + border: 1px solid #5897fb; } + .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { + background: transparent; + border: none; } + .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #888 transparent; + border-width: 0 4px 5px 4px; } +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; + background-image: -webkit-linear-gradient(top, #ffffff 0%, #eeeeee 50%); + background-image: -o-linear-gradient(top, #ffffff 0%, #eeeeee 50%); + background-image: linear-gradient(to bottom, #ffffff 0%, #eeeeee 50%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0); } +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + background-image: -webkit-linear-gradient(top, #eeeeee 50%, #ffffff 100%); + background-image: -o-linear-gradient(top, #eeeeee 50%, #ffffff 100%); + background-image: linear-gradient(to bottom, #eeeeee 50%, #ffffff 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0); } +.select2-container--classic .select2-selection--multiple { + background-color: white; + border: 1px solid #aaa; + border-radius: 4px; + cursor: text; + outline: 0; } + .select2-container--classic .select2-selection--multiple:focus { + border: 1px solid #5897fb; } + .select2-container--classic .select2-selection--multiple .select2-selection__rendered { + list-style: none; + margin: 0; + padding: 0 5px; } + .select2-container--classic .select2-selection--multiple .select2-selection__clear { + display: none; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice { + background-color: #e4e4e4; + border: 1px solid #aaa; + border-radius: 4px; + cursor: default; + float: left; + margin-right: 5px; + margin-top: 5px; + padding: 0 5px; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { + color: #888; + cursor: pointer; + display: inline-block; + font-weight: bold; + margin-right: 2px; } + .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { + color: #555; } +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + float: right; } +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; } +.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + margin-left: 2px; + margin-right: auto; } +.select2-container--classic.select2-container--open .select2-selection--multiple { + border: 1px solid #5897fb; } +.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { + border-top: none; + border-top-left-radius: 0; + border-top-right-radius: 0; } +.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } +.select2-container--classic .select2-search--dropdown .select2-search__field { + border: 1px solid #aaa; + outline: 0; } +.select2-container--classic .select2-search--inline .select2-search__field { + outline: 0; } +.select2-container--classic .select2-dropdown { + background-color: white; + border: 1px solid transparent; } +.select2-container--classic .select2-dropdown--above { + border-bottom: none; } +.select2-container--classic .select2-dropdown--below { + border-top: none; } +.select2-container--classic .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; } +.select2-container--classic .select2-results__option[role=group] { + padding: 0; } +.select2-container--classic .select2-results__option[aria-disabled=true] { + color: grey; } +.select2-container--classic .select2-results__option--highlighted[aria-selected] { + background-color: #3875d7; + color: white; } +.select2-container--classic .select2-results__group { + cursor: default; + display: block; + padding: 6px; } +.select2-container--classic.select2-container--open .select2-dropdown { + border-color: #5897fb; } diff --git a/theme/bootstrap/plugins/select2/select2.full.js b/theme/bootstrap/plugins/select2/select2.full.js new file mode 100644 index 0000000..dd0e8bc --- /dev/null +++ b/theme/bootstrap/plugins/select2/select2.full.js @@ -0,0 +1,6114 @@ +/*! + * Select2 4.0.0 + * https://select2.github.io + * + * Released under the MIT license + * https://github.com/select2/select2/blob/master/LICENSE.md + */ +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS + factory(require('jquery')); + } else { + // Browser globals + factory(jQuery); + } +}(function (jQuery) { + // This is needed so we can catch the AMD loader configuration and use it + // The inner file should be wrapped (by `banner.start.js`) in a function that + // returns the AMD loader references. + var S2 = +(function () { + // Restore the Select2 AMD loader so it can be used + // Needed mostly in the language files, where the loader is not inserted + if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) { + var S2 = jQuery.fn.select2.amd; + } +var S2;(function () { if (!S2 || !S2.requirejs) { +if (!S2) { S2 = {}; } else { require = S2; } +/** + * @license almond 0.2.9 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved. + * Available via the MIT or new BSD license. + * see: http://github.com/jrburke/almond for details + */ +//Going sloppy to avoid 'use strict' string cost, but strict practices should +//be followed. +/*jslint sloppy: true */ +/*global setTimeout: false */ + +var requirejs, require, define; +(function (undef) { + var main, req, makeMap, handlers, + defined = {}, + waiting = {}, + config = {}, + defining = {}, + hasOwn = Object.prototype.hasOwnProperty, + aps = [].slice, + jsSuffixRegExp = /\.js$/; + + function hasProp(obj, prop) { + return hasOwn.call(obj, prop); + } + + /** + * Given a relative module name, like ./something, normalize it to + * a real name that can be mapped to a path. + * @param {String} name the relative name + * @param {String} baseName a real name that the name arg is relative + * to. + * @returns {String} normalized name + */ + function normalize(name, baseName) { + var nameParts, nameSegment, mapValue, foundMap, lastIndex, + foundI, foundStarMap, starI, i, j, part, + baseParts = baseName && baseName.split("/"), + map = config.map, + starMap = (map && map['*']) || {}; + + //Adjust any relative paths. + if (name && name.charAt(0) === ".") { + //If have a base name, try to normalize against it, + //otherwise, assume it is a top-level require that will + //be relative to baseUrl in the end. + if (baseName) { + //Convert baseName to array, and lop off the last part, + //so that . matches that "directory" and not name of the baseName's + //module. For instance, baseName of "one/two/three", maps to + //"one/two/three.js", but we want the directory, "one/two" for + //this normalization. + baseParts = baseParts.slice(0, baseParts.length - 1); + name = name.split('/'); + lastIndex = name.length - 1; + + // Node .js allowance: + if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { + name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); + } + + name = baseParts.concat(name); + + //start trimDots + for (i = 0; i < name.length; i += 1) { + part = name[i]; + if (part === ".") { + name.splice(i, 1); + i -= 1; + } else if (part === "..") { + if (i === 1 && (name[2] === '..' || name[0] === '..')) { + //End of the line. Keep at least one non-dot + //path segment at the front so it can be mapped + //correctly to disk. Otherwise, there is likely + //no path mapping for a path starting with '..'. + //This can still fail, but catches the most reasonable + //uses of .. + break; + } else if (i > 0) { + name.splice(i - 1, 2); + i -= 2; + } + } + } + //end trimDots + + name = name.join("/"); + } else if (name.indexOf('./') === 0) { + // No baseName, so this is ID is resolved relative + // to baseUrl, pull off the leading dot. + name = name.substring(2); + } + } + + //Apply map config if available. + if ((baseParts || starMap) && map) { + nameParts = name.split('/'); + + for (i = nameParts.length; i > 0; i -= 1) { + nameSegment = nameParts.slice(0, i).join("/"); + + if (baseParts) { + //Find the longest baseName segment match in the config. + //So, do joins on the biggest to smallest lengths of baseParts. + for (j = baseParts.length; j > 0; j -= 1) { + mapValue = map[baseParts.slice(0, j).join('/')]; + + //baseName segment has config, find if it has one for + //this name. + if (mapValue) { + mapValue = mapValue[nameSegment]; + if (mapValue) { + //Match, update name to the new value. + foundMap = mapValue; + foundI = i; + break; + } + } + } + } + + if (foundMap) { + break; + } + + //Check for a star map match, but just hold on to it, + //if there is a shorter segment match later in a matching + //config, then favor over this star map. + if (!foundStarMap && starMap && starMap[nameSegment]) { + foundStarMap = starMap[nameSegment]; + starI = i; + } + } + + if (!foundMap && foundStarMap) { + foundMap = foundStarMap; + foundI = starI; + } + + if (foundMap) { + nameParts.splice(0, foundI, foundMap); + name = nameParts.join('/'); + } + } + + return name; + } + + function makeRequire(relName, forceSync) { + return function () { + //A version of a require function that passes a moduleName + //value for items that may need to + //look up paths relative to the moduleName + return req.apply(undef, aps.call(arguments, 0).concat([relName, forceSync])); + }; + } + + function makeNormalize(relName) { + return function (name) { + return normalize(name, relName); + }; + } + + function makeLoad(depName) { + return function (value) { + defined[depName] = value; + }; + } + + function callDep(name) { + if (hasProp(waiting, name)) { + var args = waiting[name]; + delete waiting[name]; + defining[name] = true; + main.apply(undef, args); + } + + if (!hasProp(defined, name) && !hasProp(defining, name)) { + throw new Error('No ' + name); + } + return defined[name]; + } + + //Turns a plugin!resource to [plugin, resource] + //with the plugin being undefined if the name + //did not have a plugin prefix. + function splitPrefix(name) { + var prefix, + index = name ? name.indexOf('!') : -1; + if (index > -1) { + prefix = name.substring(0, index); + name = name.substring(index + 1, name.length); + } + return [prefix, name]; + } + + /** + * Makes a name map, normalizing the name, and using a plugin + * for normalization if necessary. Grabs a ref to plugin + * too, as an optimization. + */ + makeMap = function (name, relName) { + var plugin, + parts = splitPrefix(name), + prefix = parts[0]; + + name = parts[1]; + + if (prefix) { + prefix = normalize(prefix, relName); + plugin = callDep(prefix); + } + + //Normalize according + if (prefix) { + if (plugin && plugin.normalize) { + name = plugin.normalize(name, makeNormalize(relName)); + } else { + name = normalize(name, relName); + } + } else { + name = normalize(name, relName); + parts = splitPrefix(name); + prefix = parts[0]; + name = parts[1]; + if (prefix) { + plugin = callDep(prefix); + } + } + + //Using ridiculous property names for space reasons + return { + f: prefix ? prefix + '!' + name : name, //fullName + n: name, + pr: prefix, + p: plugin + }; + }; + + function makeConfig(name) { + return function () { + return (config && config.config && config.config[name]) || {}; + }; + } + + handlers = { + require: function (name) { + return makeRequire(name); + }, + exports: function (name) { + var e = defined[name]; + if (typeof e !== 'undefined') { + return e; + } else { + return (defined[name] = {}); + } + }, + module: function (name) { + return { + id: name, + uri: '', + exports: defined[name], + config: makeConfig(name) + }; + } + }; + + main = function (name, deps, callback, relName) { + var cjsModule, depName, ret, map, i, + args = [], + callbackType = typeof callback, + usingExports; + + //Use name if no relName + relName = relName || name; + + //Call the callback to define the module, if necessary. + if (callbackType === 'undefined' || callbackType === 'function') { + //Pull out the defined dependencies and pass the ordered + //values to the callback. + //Default to [require, exports, module] if no deps + deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; + for (i = 0; i < deps.length; i += 1) { + map = makeMap(deps[i], relName); + depName = map.f; + + //Fast path CommonJS standard dependencies. + if (depName === "require") { + args[i] = handlers.require(name); + } else if (depName === "exports") { + //CommonJS module spec 1.1 + args[i] = handlers.exports(name); + usingExports = true; + } else if (depName === "module") { + //CommonJS module spec 1.1 + cjsModule = args[i] = handlers.module(name); + } else if (hasProp(defined, depName) || + hasProp(waiting, depName) || + hasProp(defining, depName)) { + args[i] = callDep(depName); + } else if (map.p) { + map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); + args[i] = defined[depName]; + } else { + throw new Error(name + ' missing ' + depName); + } + } + + ret = callback ? callback.apply(defined[name], args) : undefined; + + if (name) { + //If setting exports via "module" is in play, + //favor that over return value and exports. After that, + //favor a non-undefined return value over exports use. + if (cjsModule && cjsModule.exports !== undef && + cjsModule.exports !== defined[name]) { + defined[name] = cjsModule.exports; + } else if (ret !== undef || !usingExports) { + //Use the return value from the function. + defined[name] = ret; + } + } + } else if (name) { + //May just be an object definition for the module. Only + //worry about defining if have a module name. + defined[name] = callback; + } + }; + + requirejs = require = req = function (deps, callback, relName, forceSync, alt) { + if (typeof deps === "string") { + if (handlers[deps]) { + //callback in this case is really relName + return handlers[deps](callback); + } + //Just return the module wanted. In this scenario, the + //deps arg is the module name, and second arg (if passed) + //is just the relName. + //Normalize module name, if it contains . or .. + return callDep(makeMap(deps, callback).f); + } else if (!deps.splice) { + //deps is a config object, not an array. + config = deps; + if (config.deps) { + req(config.deps, config.callback); + } + if (!callback) { + return; + } + + if (callback.splice) { + //callback is an array, which means it is a dependency list. + //Adjust args if there are dependencies + deps = callback; + callback = relName; + relName = null; + } else { + deps = undef; + } + } + + //Support require(['a']) + callback = callback || function () {}; + + //If relName is a function, it is an errback handler, + //so remove it. + if (typeof relName === 'function') { + relName = forceSync; + forceSync = alt; + } + + //Simulate async callback; + if (forceSync) { + main(undef, deps, callback, relName); + } else { + //Using a non-zero value because of concern for what old browsers + //do, and latest browsers "upgrade" to 4 if lower value is used: + //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout: + //If want a value immediately, use require('id') instead -- something + //that works in almond on the global level, but not guaranteed and + //unlikely to work in other AMD implementations. + setTimeout(function () { + main(undef, deps, callback, relName); + }, 4); + } + + return req; + }; + + /** + * Just drops the config on the floor, but returns req in case + * the config return value is used. + */ + req.config = function (cfg) { + return req(cfg); + }; + + /** + * Expose module registry for debugging and tooling + */ + requirejs._defined = defined; + + define = function (name, deps, callback) { + + //This module may not have dependencies + if (!deps.splice) { + //deps is not an array, so probably means + //an object literal or factory function for + //the value. Adjust args. + callback = deps; + deps = []; + } + + if (!hasProp(defined, name) && !hasProp(waiting, name)) { + waiting[name] = [name, deps, callback]; + } + }; + + define.amd = { + jQuery: true + }; +}()); + +S2.requirejs = requirejs;S2.require = require;S2.define = define; +} +}()); +S2.define("almond", function(){}); + +/* global jQuery:false, $:false */ +S2.define('jquery',[],function () { + var _$ = jQuery || $; + + if (_$ == null && console && console.error) { + console.error( + 'Select2: An instance of jQuery or a jQuery-compatible library was not ' + + 'found. Make sure that you are including jQuery before Select2 on your ' + + 'web page.' + ); + } + + return _$; +}); + +S2.define('select2/utils',[ + 'jquery' +], function ($) { + var Utils = {}; + + Utils.Extend = function (ChildClass, SuperClass) { + var __hasProp = {}.hasOwnProperty; + + function BaseConstructor () { + this.constructor = ChildClass; + } + + for (var key in SuperClass) { + if (__hasProp.call(SuperClass, key)) { + ChildClass[key] = SuperClass[key]; + } + } + + BaseConstructor.prototype = SuperClass.prototype; + ChildClass.prototype = new BaseConstructor(); + ChildClass.__super__ = SuperClass.prototype; + + return ChildClass; + }; + + function getMethods (theClass) { + var proto = theClass.prototype; + + var methods = []; + + for (var methodName in proto) { + var m = proto[methodName]; + + if (typeof m !== 'function') { + continue; + } + + if (methodName === 'constructor') { + continue; + } + + methods.push(methodName); + } + + return methods; + } + + Utils.Decorate = function (SuperClass, DecoratorClass) { + var decoratedMethods = getMethods(DecoratorClass); + var superMethods = getMethods(SuperClass); + + function DecoratedClass () { + var unshift = Array.prototype.unshift; + + var argCount = DecoratorClass.prototype.constructor.length; + + var calledConstructor = SuperClass.prototype.constructor; + + if (argCount > 0) { + unshift.call(arguments, SuperClass.prototype.constructor); + + calledConstructor = DecoratorClass.prototype.constructor; + } + + calledConstructor.apply(this, arguments); + } + + DecoratorClass.displayName = SuperClass.displayName; + + function ctr () { + this.constructor = DecoratedClass; + } + + DecoratedClass.prototype = new ctr(); + + for (var m = 0; m < superMethods.length; m++) { + var superMethod = superMethods[m]; + + DecoratedClass.prototype[superMethod] = + SuperClass.prototype[superMethod]; + } + + var calledMethod = function (methodName) { + // Stub out the original method if it's not decorating an actual method + var originalMethod = function () {}; + + if (methodName in DecoratedClass.prototype) { + originalMethod = DecoratedClass.prototype[methodName]; + } + + var decoratedMethod = DecoratorClass.prototype[methodName]; + + return function () { + var unshift = Array.prototype.unshift; + + unshift.call(arguments, originalMethod); + + return decoratedMethod.apply(this, arguments); + }; + }; + + for (var d = 0; d < decoratedMethods.length; d++) { + var decoratedMethod = decoratedMethods[d]; + + DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod); + } + + return DecoratedClass; + }; + + var Observable = function () { + this.listeners = {}; + }; + + Observable.prototype.on = function (event, callback) { + this.listeners = this.listeners || {}; + + if (event in this.listeners) { + this.listeners[event].push(callback); + } else { + this.listeners[event] = [callback]; + } + }; + + Observable.prototype.trigger = function (event) { + var slice = Array.prototype.slice; + + this.listeners = this.listeners || {}; + + if (event in this.listeners) { + this.invoke(this.listeners[event], slice.call(arguments, 1)); + } + + if ('*' in this.listeners) { + this.invoke(this.listeners['*'], arguments); + } + }; + + Observable.prototype.invoke = function (listeners, params) { + for (var i = 0, len = listeners.length; i < len; i++) { + listeners[i].apply(this, params); + } + }; + + Utils.Observable = Observable; + + Utils.generateChars = function (length) { + var chars = ''; + + for (var i = 0; i < length; i++) { + var randomChar = Math.floor(Math.random() * 36); + chars += randomChar.toString(36); + } + + return chars; + }; + + Utils.bind = function (func, context) { + return function () { + func.apply(context, arguments); + }; + }; + + Utils._convertData = function (data) { + for (var originalKey in data) { + var keys = originalKey.split('-'); + + var dataLevel = data; + + if (keys.length === 1) { + continue; + } + + for (var k = 0; k < keys.length; k++) { + var key = keys[k]; + + // Lowercase the first letter + // By default, dash-separated becomes camelCase + key = key.substring(0, 1).toLowerCase() + key.substring(1); + + if (!(key in dataLevel)) { + dataLevel[key] = {}; + } + + if (k == keys.length - 1) { + dataLevel[key] = data[originalKey]; + } + + dataLevel = dataLevel[key]; + } + + delete data[originalKey]; + } + + return data; + }; + + Utils.hasScroll = function (index, el) { + // Adapted from the function created by @ShadowScripter + // and adapted by @BillBarry on the Stack Exchange Code Review website. + // The original code can be found at + // http://codereview.stackexchange.com/q/13338 + // and was designed to be used with the Sizzle selector engine. + + var $el = $(el); + var overflowX = el.style.overflowX; + var overflowY = el.style.overflowY; + + //Check both x and y declarations + if (overflowX === overflowY && + (overflowY === 'hidden' || overflowY === 'visible')) { + return false; + } + + if (overflowX === 'scroll' || overflowY === 'scroll') { + return true; + } + + return ($el.innerHeight() < el.scrollHeight || + $el.innerWidth() < el.scrollWidth); + }; + + Utils.escapeMarkup = function (markup) { + var replaceMap = { + '\\': '&#92;', + '&': '&amp;', + '<': '&lt;', + '>': '&gt;', + '"': '&quot;', + '\'': '&#39;', + '/': '&#47;' + }; + + // Do not try to escape the markup if it's not a string + if (typeof markup !== 'string') { + return markup; + } + + return String(markup).replace(/[&<>"'\/\\]/g, function (match) { + return replaceMap[match]; + }); + }; + + // Append an array of jQuery nodes to a given element. + Utils.appendMany = function ($element, $nodes) { + // jQuery 1.7.x does not support $.fn.append() with an array + // Fall back to a jQuery object collection using $.fn.add() + if ($.fn.jquery.substr(0, 3) === '1.7') { + var $jqNodes = $(); + + $.map($nodes, function (node) { + $jqNodes = $jqNodes.add(node); + }); + + $nodes = $jqNodes; + } + + $element.append($nodes); + }; + + return Utils; +}); + +S2.define('select2/results',[ + 'jquery', + './utils' +], function ($, Utils) { + function Results ($element, options, dataAdapter) { + this.$element = $element; + this.data = dataAdapter; + this.options = options; + + Results.__super__.constructor.call(this); + } + + Utils.Extend(Results, Utils.Observable); + + Results.prototype.render = function () { + var $results = $( + '<ul class="select2-results__options" role="tree"></ul>' + ); + + if (this.options.get('multiple')) { + $results.attr('aria-multiselectable', 'true'); + } + + this.$results = $results; + + return $results; + }; + + Results.prototype.clear = function () { + this.$results.empty(); + }; + + Results.prototype.displayMessage = function (params) { + var escapeMarkup = this.options.get('escapeMarkup'); + + this.clear(); + this.hideLoading(); + + var $message = $( + '<li role="treeitem" class="select2-results__option"></li>' + ); + + var message = this.options.get('translations').get(params.message); + + $message.append( + escapeMarkup( + message(params.args) + ) + ); + + this.$results.append($message); + }; + + Results.prototype.append = function (data) { + this.hideLoading(); + + var $options = []; + + if (data.results == null || data.results.length === 0) { + if (this.$results.children().length === 0) { + this.trigger('results:message', { + message: 'noResults' + }); + } + + return; + } + + data.results = this.sort(data.results); + + for (var d = 0; d < data.results.length; d++) { + var item = data.results[d]; + + var $option = this.option(item); + + $options.push($option); + } + + this.$results.append($options); + }; + + Results.prototype.position = function ($results, $dropdown) { + var $resultsContainer = $dropdown.find('.select2-results'); + $resultsContainer.append($results); + }; + + Results.prototype.sort = function (data) { + var sorter = this.options.get('sorter'); + + return sorter(data); + }; + + Results.prototype.setClasses = function () { + var self = this; + + this.data.current(function (selected) { + var selectedIds = $.map(selected, function (s) { + return s.id.toString(); + }); + + var $options = self.$results + .find('.select2-results__option[aria-selected]'); + + $options.each(function () { + var $option = $(this); + + var item = $.data(this, 'data'); + + // id needs to be converted to a string when comparing + var id = '' + item.id; + + if ((item.element != null && item.element.selected) || + (item.element == null && $.inArray(id, selectedIds) > -1)) { + $option.attr('aria-selected', 'true'); + } else { + $option.attr('aria-selected', 'false'); + } + }); + + var $selected = $options.filter('[aria-selected=true]'); + + // Check if there are any selected options + if ($selected.length > 0) { + // If there are selected options, highlight the first + $selected.first().trigger('mouseenter'); + } else { + // If there are no selected options, highlight the first option + // in the dropdown + $options.first().trigger('mouseenter'); + } + }); + }; + + Results.prototype.showLoading = function (params) { + this.hideLoading(); + + var loadingMore = this.options.get('translations').get('searching'); + + var loading = { + disabled: true, + loading: true, + text: loadingMore(params) + }; + var $loading = this.option(loading); + $loading.className += ' loading-results'; + + this.$results.prepend($loading); + }; + + Results.prototype.hideLoading = function () { + this.$results.find('.loading-results').remove(); + }; + + Results.prototype.option = function (data) { + var option = document.createElement('li'); + option.className = 'select2-results__option'; + + var attrs = { + 'role': 'treeitem', + 'aria-selected': 'false' + }; + + if (data.disabled) { + delete attrs['aria-selected']; + attrs['aria-disabled'] = 'true'; + } + + if (data.id == null) { + delete attrs['aria-selected']; + } + + if (data._resultId != null) { + option.id = data._resultId; + } + + if (data.title) { + option.title = data.title; + } + + if (data.children) { + attrs.role = 'group'; + attrs['aria-label'] = data.text; + delete attrs['aria-selected']; + } + + for (var attr in attrs) { + var val = attrs[attr]; + + option.setAttribute(attr, val); + } + + if (data.children) { + var $option = $(option); + + var label = document.createElement('strong'); + label.className = 'select2-results__group'; + + var $label = $(label); + this.template(data, label); + + var $children = []; + + for (var c = 0; c < data.children.length; c++) { + var child = data.children[c]; + + var $child = this.option(child); + + $children.push($child); + } + + var $childrenContainer = $('<ul></ul>', { + 'class': 'select2-results__options select2-results__options--nested' + }); + + $childrenContainer.append($children); + + $option.append(label); + $option.append($childrenContainer); + } else { + this.template(data, option); + } + + $.data(option, 'data', data); + + return option; + }; + + Results.prototype.bind = function (container, $container) { + var self = this; + + var id = container.id + '-results'; + + this.$results.attr('id', id); + + container.on('results:all', function (params) { + self.clear(); + self.append(params.data); + + if (container.isOpen()) { + self.setClasses(); + } + }); + + container.on('results:append', function (params) { + self.append(params.data); + + if (container.isOpen()) { + self.setClasses(); + } + }); + + container.on('query', function (params) { + self.showLoading(params); + }); + + container.on('select', function () { + if (!container.isOpen()) { + return; + } + + self.setClasses(); + }); + + container.on('unselect', function () { + if (!container.isOpen()) { + return; + } + + self.setClasses(); + }); + + container.on('open', function () { + // When the dropdown is open, aria-expended="true" + self.$results.attr('aria-expanded', 'true'); + self.$results.attr('aria-hidden', 'false'); + + self.setClasses(); + self.ensureHighlightVisible(); + }); + + container.on('close', function () { + // When the dropdown is closed, aria-expended="false" + self.$results.attr('aria-expanded', 'false'); + self.$results.attr('aria-hidden', 'true'); + self.$results.removeAttr('aria-activedescendant'); + }); + + container.on('results:toggle', function () { + var $highlighted = self.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + $highlighted.trigger('mouseup'); + }); + + container.on('results:select', function () { + var $highlighted = self.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + var data = $highlighted.data('data'); + + if ($highlighted.attr('aria-selected') == 'true') { + self.trigger('close'); + } else { + self.trigger('select', { + data: data + }); + } + }); + + container.on('results:previous', function () { + var $highlighted = self.getHighlightedResults(); + + var $options = self.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + // If we are already at te top, don't move further + if (currentIndex === 0) { + return; + } + + var nextIndex = currentIndex - 1; + + // If none are highlighted, highlight the first + if ($highlighted.length === 0) { + nextIndex = 0; + } + + var $next = $options.eq(nextIndex); + + $next.trigger('mouseenter'); + + var currentOffset = self.$results.offset().top; + var nextTop = $next.offset().top; + var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset); + + if (nextIndex === 0) { + self.$results.scrollTop(0); + } else if (nextTop - currentOffset < 0) { + self.$results.scrollTop(nextOffset); + } + }); + + container.on('results:next', function () { + var $highlighted = self.getHighlightedResults(); + + var $options = self.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + var nextIndex = currentIndex + 1; + + // If we are at the last option, stay there + if (nextIndex >= $options.length) { + return; + } + + var $next = $options.eq(nextIndex); + + $next.trigger('mouseenter'); + + var currentOffset = self.$results.offset().top + + self.$results.outerHeight(false); + var nextBottom = $next.offset().top + $next.outerHeight(false); + var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset; + + if (nextIndex === 0) { + self.$results.scrollTop(0); + } else if (nextBottom > currentOffset) { + self.$results.scrollTop(nextOffset); + } + }); + + container.on('results:focus', function (params) { + params.element.addClass('select2-results__option--highlighted'); + }); + + container.on('results:message', function (params) { + self.displayMessage(params); + }); + + if ($.fn.mousewheel) { + this.$results.on('mousewheel', function (e) { + var top = self.$results.scrollTop(); + + var bottom = ( + self.$results.get(0).scrollHeight - + self.$results.scrollTop() + + e.deltaY + ); + + var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0; + var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height(); + + if (isAtTop) { + self.$results.scrollTop(0); + + e.preventDefault(); + e.stopPropagation(); + } else if (isAtBottom) { + self.$results.scrollTop( + self.$results.get(0).scrollHeight - self.$results.height() + ); + + e.preventDefault(); + e.stopPropagation(); + } + }); + } + + this.$results.on('mouseup', '.select2-results__option[aria-selected]', + function (evt) { + var $this = $(this); + + var data = $this.data('data'); + + if ($this.attr('aria-selected') === 'true') { + if (self.options.get('multiple')) { + self.trigger('unselect', { + originalEvent: evt, + data: data + }); + } else { + self.trigger('close'); + } + + return; + } + + self.trigger('select', { + originalEvent: evt, + data: data + }); + }); + + this.$results.on('mouseenter', '.select2-results__option[aria-selected]', + function (evt) { + var data = $(this).data('data'); + + self.getHighlightedResults() + .removeClass('select2-results__option--highlighted'); + + self.trigger('results:focus', { + data: data, + element: $(this) + }); + }); + }; + + Results.prototype.getHighlightedResults = function () { + var $highlighted = this.$results + .find('.select2-results__option--highlighted'); + + return $highlighted; + }; + + Results.prototype.destroy = function () { + this.$results.remove(); + }; + + Results.prototype.ensureHighlightVisible = function () { + var $highlighted = this.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + var $options = this.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + var currentOffset = this.$results.offset().top; + var nextTop = $highlighted.offset().top; + var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset); + + var offsetDelta = nextTop - currentOffset; + nextOffset -= $highlighted.outerHeight(false) * 2; + + if (currentIndex <= 2) { + this.$results.scrollTop(0); + } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) { + this.$results.scrollTop(nextOffset); + } + }; + + Results.prototype.template = function (result, container) { + var template = this.options.get('templateResult'); + var escapeMarkup = this.options.get('escapeMarkup'); + + var content = template(result); + + if (content == null) { + container.style.display = 'none'; + } else if (typeof content === 'string') { + container.innerHTML = escapeMarkup(content); + } else { + $(container).append(content); + } + }; + + return Results; +}); + +S2.define('select2/keys',[ + +], function () { + var KEYS = { + BACKSPACE: 8, + TAB: 9, + ENTER: 13, + SHIFT: 16, + CTRL: 17, + ALT: 18, + ESC: 27, + SPACE: 32, + PAGE_UP: 33, + PAGE_DOWN: 34, + END: 35, + HOME: 36, + LEFT: 37, + UP: 38, + RIGHT: 39, + DOWN: 40, + DELETE: 46 + }; + + return KEYS; +}); + +S2.define('select2/selection/base',[ + 'jquery', + '../utils', + '../keys' +], function ($, Utils, KEYS) { + function BaseSelection ($element, options) { + this.$element = $element; + this.options = options; + + BaseSelection.__super__.constructor.call(this); + } + + Utils.Extend(BaseSelection, Utils.Observable); + + BaseSelection.prototype.render = function () { + var $selection = $( + '<span class="select2-selection" role="combobox" ' + + 'aria-autocomplete="list" aria-haspopup="true" aria-expanded="false">' + + '</span>' + ); + + this._tabindex = 0; + + if (this.$element.data('old-tabindex') != null) { + this._tabindex = this.$element.data('old-tabindex'); + } else if (this.$element.attr('tabindex') != null) { + this._tabindex = this.$element.attr('tabindex'); + } + + $selection.attr('title', this.$element.attr('title')); + $selection.attr('tabindex', this._tabindex); + + this.$selection = $selection; + + return $selection; + }; + + BaseSelection.prototype.bind = function (container, $container) { + var self = this; + + var id = container.id + '-container'; + var resultsId = container.id + '-results'; + + this.container = container; + + this.$selection.on('focus', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('blur', function (evt) { + self.trigger('blur', evt); + }); + + this.$selection.on('keydown', function (evt) { + self.trigger('keypress', evt); + + if (evt.which === KEYS.SPACE) { + evt.preventDefault(); + } + }); + + container.on('results:focus', function (params) { + self.$selection.attr('aria-activedescendant', params.data._resultId); + }); + + container.on('selection:update', function (params) { + self.update(params.data); + }); + + container.on('open', function () { + // When the dropdown is open, aria-expanded="true" + self.$selection.attr('aria-expanded', 'true'); + self.$selection.attr('aria-owns', resultsId); + + self._attachCloseHandler(container); + }); + + container.on('close', function () { + // When the dropdown is closed, aria-expanded="false" + self.$selection.attr('aria-expanded', 'false'); + self.$selection.removeAttr('aria-activedescendant'); + self.$selection.removeAttr('aria-owns'); + + self.$selection.focus(); + + self._detachCloseHandler(container); + }); + + container.on('enable', function () { + self.$selection.attr('tabindex', self._tabindex); + }); + + container.on('disable', function () { + self.$selection.attr('tabindex', '-1'); + }); + }; + + BaseSelection.prototype._attachCloseHandler = function (container) { + var self = this; + + $(document.body).on('mousedown.select2.' + container.id, function (e) { + var $target = $(e.target); + + var $select = $target.closest('.select2'); + + var $all = $('.select2.select2-container--open'); + + $all.each(function () { + var $this = $(this); + + if (this == $select[0]) { + return; + } + + var $element = $this.data('element'); + + $element.select2('close'); + }); + }); + }; + + BaseSelection.prototype._detachCloseHandler = function (container) { + $(document.body).off('mousedown.select2.' + container.id); + }; + + BaseSelection.prototype.position = function ($selection, $container) { + var $selectionContainer = $container.find('.selection'); + $selectionContainer.append($selection); + }; + + BaseSelection.prototype.destroy = function () { + this._detachCloseHandler(this.container); + }; + + BaseSelection.prototype.update = function (data) { + throw new Error('The `update` method must be defined in child classes.'); + }; + + return BaseSelection; +}); + +S2.define('select2/selection/single',[ + 'jquery', + './base', + '../utils', + '../keys' +], function ($, BaseSelection, Utils, KEYS) { + function SingleSelection () { + SingleSelection.__super__.constructor.apply(this, arguments); + } + + Utils.Extend(SingleSelection, BaseSelection); + + SingleSelection.prototype.render = function () { + var $selection = SingleSelection.__super__.render.call(this); + + $selection.addClass('select2-selection--single'); + + $selection.html( + '<span class="select2-selection__rendered"></span>' + + '<span class="select2-selection__arrow" role="presentation">' + + '<b role="presentation"></b>' + + '</span>' + ); + + return $selection; + }; + + SingleSelection.prototype.bind = function (container, $container) { + var self = this; + + SingleSelection.__super__.bind.apply(this, arguments); + + var id = container.id + '-container'; + + this.$selection.find('.select2-selection__rendered').attr('id', id); + this.$selection.attr('aria-labelledby', id); + + this.$selection.on('mousedown', function (evt) { + // Only respond to left clicks + if (evt.which !== 1) { + return; + } + + self.trigger('toggle', { + originalEvent: evt + }); + }); + + this.$selection.on('focus', function (evt) { + // User focuses on the container + }); + + this.$selection.on('blur', function (evt) { + // User exits the container + }); + + container.on('selection:update', function (params) { + self.update(params.data); + }); + }; + + SingleSelection.prototype.clear = function () { + this.$selection.find('.select2-selection__rendered').empty(); + }; + + SingleSelection.prototype.display = function (data) { + var template = this.options.get('templateSelection'); + var escapeMarkup = this.options.get('escapeMarkup'); + + return escapeMarkup(template(data)); + }; + + SingleSelection.prototype.selectionContainer = function () { + return $('<span></span>'); + }; + + SingleSelection.prototype.update = function (data) { + if (data.length === 0) { + this.clear(); + return; + } + + var selection = data[0]; + + var formatted = this.display(selection); + + var $rendered = this.$selection.find('.select2-selection__rendered'); + $rendered.empty().append(formatted); + $rendered.prop('title', selection.title || selection.text); + }; + + return SingleSelection; +}); + +S2.define('select2/selection/multiple',[ + 'jquery', + './base', + '../utils' +], function ($, BaseSelection, Utils) { + function MultipleSelection ($element, options) { + MultipleSelection.__super__.constructor.apply(this, arguments); + } + + Utils.Extend(MultipleSelection, BaseSelection); + + MultipleSelection.prototype.render = function () { + var $selection = MultipleSelection.__super__.render.call(this); + + $selection.addClass('select2-selection--multiple'); + + $selection.html( + '<ul class="select2-selection__rendered"></ul>' + ); + + return $selection; + }; + + MultipleSelection.prototype.bind = function (container, $container) { + var self = this; + + MultipleSelection.__super__.bind.apply(this, arguments); + + this.$selection.on('click', function (evt) { + self.trigger('toggle', { + originalEvent: evt + }); + }); + + this.$selection.on('click', '.select2-selection__choice__remove', + function (evt) { + var $remove = $(this); + var $selection = $remove.parent(); + + var data = $selection.data('data'); + + self.trigger('unselect', { + originalEvent: evt, + data: data + }); + }); + }; + + MultipleSelection.prototype.clear = function () { + this.$selection.find('.select2-selection__rendered').empty(); + }; + + MultipleSelection.prototype.display = function (data) { + var template = this.options.get('templateSelection'); + var escapeMarkup = this.options.get('escapeMarkup'); + + return escapeMarkup(template(data)); + }; + + MultipleSelection.prototype.selectionContainer = function () { + var $container = $( + '<li class="select2-selection__choice">' + + '<span class="select2-selection__choice__remove" role="presentation">' + + '&times;' + + '</span>' + + '</li>' + ); + + return $container; + }; + + MultipleSelection.prototype.update = function (data) { + this.clear(); + + if (data.length === 0) { + return; + } + + var $selections = []; + + for (var d = 0; d < data.length; d++) { + var selection = data[d]; + + var formatted = this.display(selection); + var $selection = this.selectionContainer(); + + $selection.append(formatted); + $selection.prop('title', selection.title || selection.text); + + $selection.data('data', selection); + + $selections.push($selection); + } + + var $rendered = this.$selection.find('.select2-selection__rendered'); + + Utils.appendMany($rendered, $selections); + }; + + return MultipleSelection; +}); + +S2.define('select2/selection/placeholder',[ + '../utils' +], function (Utils) { + function Placeholder (decorated, $element, options) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options); + } + + Placeholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + Placeholder.prototype.createPlaceholder = function (decorated, placeholder) { + var $placeholder = this.selectionContainer(); + + $placeholder.html(this.display(placeholder)); + $placeholder.addClass('select2-selection__placeholder') + .removeClass('select2-selection__choice'); + + return $placeholder; + }; + + Placeholder.prototype.update = function (decorated, data) { + var singlePlaceholder = ( + data.length == 1 && data[0].id != this.placeholder.id + ); + var multipleSelections = data.length > 1; + + if (multipleSelections || singlePlaceholder) { + return decorated.call(this, data); + } + + this.clear(); + + var $placeholder = this.createPlaceholder(this.placeholder); + + this.$selection.find('.select2-selection__rendered').append($placeholder); + }; + + return Placeholder; +}); + +S2.define('select2/selection/allowClear',[ + 'jquery', + '../keys' +], function ($, KEYS) { + function AllowClear () { } + + AllowClear.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + if (this.placeholder == null) { + if (this.options.get('debug') && window.console && console.error) { + console.error( + 'Select2: The `allowClear` option should be used in combination ' + + 'with the `placeholder` option.' + ); + } + } + + this.$selection.on('mousedown', '.select2-selection__clear', + function (evt) { + self._handleClear(evt); + }); + + container.on('keypress', function (evt) { + self._handleKeyboardClear(evt, container); + }); + }; + + AllowClear.prototype._handleClear = function (_, evt) { + // Ignore the event if it is disabled + if (this.options.get('disabled')) { + return; + } + + var $clear = this.$selection.find('.select2-selection__clear'); + + // Ignore the event if nothing has been selected + if ($clear.length === 0) { + return; + } + + evt.stopPropagation(); + + var data = $clear.data('data'); + + for (var d = 0; d < data.length; d++) { + var unselectData = { + data: data[d] + }; + + // Trigger the `unselect` event, so people can prevent it from being + // cleared. + this.trigger('unselect', unselectData); + + // If the event was prevented, don't clear it out. + if (unselectData.prevented) { + return; + } + } + + this.$element.val(this.placeholder.id).trigger('change'); + + this.trigger('toggle'); + }; + + AllowClear.prototype._handleKeyboardClear = function (_, evt, container) { + if (container.isOpen()) { + return; + } + + if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) { + this._handleClear(evt); + } + }; + + AllowClear.prototype.update = function (decorated, data) { + decorated.call(this, data); + + if (this.$selection.find('.select2-selection__placeholder').length > 0 || + data.length === 0) { + return; + } + + var $remove = $( + '<span class="select2-selection__clear">' + + '&times;' + + '</span>' + ); + $remove.data('data', data); + + this.$selection.find('.select2-selection__rendered').prepend($remove); + }; + + return AllowClear; +}); + +S2.define('select2/selection/search',[ + 'jquery', + '../utils', + '../keys' +], function ($, Utils, KEYS) { + function Search (decorated, $element, options) { + decorated.call(this, $element, options); + } + + Search.prototype.render = function (decorated) { + var $search = $( + '<li class="select2-search select2-search--inline">' + + '<input class="select2-search__field" type="search" tabindex="-1"' + + ' autocomplete="off" autocorrect="off" autocapitalize="off"' + + ' spellcheck="false" role="textbox" />' + + '</li>' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + var $rendered = decorated.call(this); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('open', function () { + self.$search.attr('tabindex', 0); + + self.$search.focus(); + }); + + container.on('close', function () { + self.$search.attr('tabindex', -1); + + self.$search.val(''); + self.$search.focus(); + }); + + container.on('enable', function () { + self.$search.prop('disabled', false); + }); + + container.on('disable', function () { + self.$search.prop('disabled', true); + }); + + this.$selection.on('focusin', '.select2-search--inline', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('focusout', '.select2-search--inline', function (evt) { + self.trigger('blur', evt); + }); + + this.$selection.on('keydown', '.select2-search--inline', function (evt) { + evt.stopPropagation(); + + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + + var key = evt.which; + + if (key === KEYS.BACKSPACE && self.$search.val() === '') { + var $previousChoice = self.$searchContainer + .prev('.select2-selection__choice'); + + if ($previousChoice.length > 0) { + var item = $previousChoice.data('data'); + + self.searchRemoveChoice(item); + + evt.preventDefault(); + } + } + }); + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$selection.on('input', '.select2-search--inline', function (evt) { + // Unbind the duplicated `keyup` event + self.$selection.off('keyup.search'); + }); + + this.$selection.on('keyup.search input', '.select2-search--inline', + function (evt) { + self.handleSearch(evt); + }); + }; + + Search.prototype.createPlaceholder = function (decorated, placeholder) { + this.$search.attr('placeholder', placeholder.text); + }; + + Search.prototype.update = function (decorated, data) { + this.$search.attr('placeholder', ''); + + decorated.call(this, data); + + this.$selection.find('.select2-selection__rendered') + .append(this.$searchContainer); + + this.resizeSearch(); + }; + + Search.prototype.handleSearch = function () { + this.resizeSearch(); + + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.searchRemoveChoice = function (decorated, item) { + this.trigger('unselect', { + data: item + }); + + this.trigger('open'); + + this.$search.val(item.text + ' '); + }; + + Search.prototype.resizeSearch = function () { + this.$search.css('width', '25px'); + + var width = ''; + + if (this.$search.attr('placeholder') !== '') { + width = this.$selection.find('.select2-selection__rendered').innerWidth(); + } else { + var minimumWidth = this.$search.val().length + 1; + + width = (minimumWidth * 0.75) + 'em'; + } + + this.$search.css('width', width); + }; + + return Search; +}); + +S2.define('select2/selection/eventRelay',[ + 'jquery' +], function ($) { + function EventRelay () { } + + EventRelay.prototype.bind = function (decorated, container, $container) { + var self = this; + var relayEvents = [ + 'open', 'opening', + 'close', 'closing', + 'select', 'selecting', + 'unselect', 'unselecting' + ]; + + var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting']; + + decorated.call(this, container, $container); + + container.on('*', function (name, params) { + // Ignore events that should not be relayed + if ($.inArray(name, relayEvents) === -1) { + return; + } + + // The parameters should always be an object + params = params || {}; + + // Generate the jQuery event for the Select2 event + var evt = $.Event('select2:' + name, { + params: params + }); + + self.$element.trigger(evt); + + // Only handle preventable events if it was one + if ($.inArray(name, preventableEvents) === -1) { + return; + } + + params.prevented = evt.isDefaultPrevented(); + }); + }; + + return EventRelay; +}); + +S2.define('select2/translation',[ + 'jquery', + 'require' +], function ($, require) { + function Translation (dict) { + this.dict = dict || {}; + } + + Translation.prototype.all = function () { + return this.dict; + }; + + Translation.prototype.get = function (key) { + return this.dict[key]; + }; + + Translation.prototype.extend = function (translation) { + this.dict = $.extend({}, translation.all(), this.dict); + }; + + // Static functions + + Translation._cache = {}; + + Translation.loadPath = function (path) { + if (!(path in Translation._cache)) { + var translations = require(path); + + Translation._cache[path] = translations; + } + + return new Translation(Translation._cache[path]); + }; + + return Translation; +}); + +S2.define('select2/diacritics',[ + +], function () { + var diacritics = { + '\u24B6': 'A', + '\uFF21': 'A', + '\u00C0': 'A', + '\u00C1': 'A', + '\u00C2': 'A', + '\u1EA6': 'A', + '\u1EA4': 'A', + '\u1EAA': 'A', + '\u1EA8': 'A', + '\u00C3': 'A', + '\u0100': 'A', + '\u0102': 'A', + '\u1EB0': 'A', + '\u1EAE': 'A', + '\u1EB4': 'A', + '\u1EB2': 'A', + '\u0226': 'A', + '\u01E0': 'A', + '\u00C4': 'A', + '\u01DE': 'A', + '\u1EA2': 'A', + '\u00C5': 'A', + '\u01FA': 'A', + '\u01CD': 'A', + '\u0200': 'A', + '\u0202': 'A', + '\u1EA0': 'A', + '\u1EAC': 'A', + '\u1EB6': 'A', + '\u1E00': 'A', + '\u0104': 'A', + '\u023A': 'A', + '\u2C6F': 'A', + '\uA732': 'AA', + '\u00C6': 'AE', + '\u01FC': 'AE', + '\u01E2': 'AE', + '\uA734': 'AO', + '\uA736': 'AU', + '\uA738': 'AV', + '\uA73A': 'AV', + '\uA73C': 'AY', + '\u24B7': 'B', + '\uFF22': 'B', + '\u1E02': 'B', + '\u1E04': 'B', + '\u1E06': 'B', + '\u0243': 'B', + '\u0182': 'B', + '\u0181': 'B', + '\u24B8': 'C', + '\uFF23': 'C', + '\u0106': 'C', + '\u0108': 'C', + '\u010A': 'C', + '\u010C': 'C', + '\u00C7': 'C', + '\u1E08': 'C', + '\u0187': 'C', + '\u023B': 'C', + '\uA73E': 'C', + '\u24B9': 'D', + '\uFF24': 'D', + '\u1E0A': 'D', + '\u010E': 'D', + '\u1E0C': 'D', + '\u1E10': 'D', + '\u1E12': 'D', + '\u1E0E': 'D', + '\u0110': 'D', + '\u018B': 'D', + '\u018A': 'D', + '\u0189': 'D', + '\uA779': 'D', + '\u01F1': 'DZ', + '\u01C4': 'DZ', + '\u01F2': 'Dz', + '\u01C5': 'Dz', + '\u24BA': 'E', + '\uFF25': 'E', + '\u00C8': 'E', + '\u00C9': 'E', + '\u00CA': 'E', + '\u1EC0': 'E', + '\u1EBE': 'E', + '\u1EC4': 'E', + '\u1EC2': 'E', + '\u1EBC': 'E', + '\u0112': 'E', + '\u1E14': 'E', + '\u1E16': 'E', + '\u0114': 'E', + '\u0116': 'E', + '\u00CB': 'E', + '\u1EBA': 'E', + '\u011A': 'E', + '\u0204': 'E', + '\u0206': 'E', + '\u1EB8': 'E', + '\u1EC6': 'E', + '\u0228': 'E', + '\u1E1C': 'E', + '\u0118': 'E', + '\u1E18': 'E', + '\u1E1A': 'E', + '\u0190': 'E', + '\u018E': 'E', + '\u24BB': 'F', + '\uFF26': 'F', + '\u1E1E': 'F', + '\u0191': 'F', + '\uA77B': 'F', + '\u24BC': 'G', + '\uFF27': 'G', + '\u01F4': 'G', + '\u011C': 'G', + '\u1E20': 'G', + '\u011E': 'G', + '\u0120': 'G', + '\u01E6': 'G', + '\u0122': 'G', + '\u01E4': 'G', + '\u0193': 'G', + '\uA7A0': 'G', + '\uA77D': 'G', + '\uA77E': 'G', + '\u24BD': 'H', + '\uFF28': 'H', + '\u0124': 'H', + '\u1E22': 'H', + '\u1E26': 'H', + '\u021E': 'H', + '\u1E24': 'H', + '\u1E28': 'H', + '\u1E2A': 'H', + '\u0126': 'H', + '\u2C67': 'H', + '\u2C75': 'H', + '\uA78D': 'H', + '\u24BE': 'I', + '\uFF29': 'I', + '\u00CC': 'I', + '\u00CD': 'I', + '\u00CE': 'I', + '\u0128': 'I', + '\u012A': 'I', + '\u012C': 'I', + '\u0130': 'I', + '\u00CF': 'I', + '\u1E2E': 'I', + '\u1EC8': 'I', + '\u01CF': 'I', + '\u0208': 'I', + '\u020A': 'I', + '\u1ECA': 'I', + '\u012E': 'I', + '\u1E2C': 'I', + '\u0197': 'I', + '\u24BF': 'J', + '\uFF2A': 'J', + '\u0134': 'J', + '\u0248': 'J', + '\u24C0': 'K', + '\uFF2B': 'K', + '\u1E30': 'K', + '\u01E8': 'K', + '\u1E32': 'K', + '\u0136': 'K', + '\u1E34': 'K', + '\u0198': 'K', + '\u2C69': 'K', + '\uA740': 'K', + '\uA742': 'K', + '\uA744': 'K', + '\uA7A2': 'K', + '\u24C1': 'L', + '\uFF2C': 'L', + '\u013F': 'L', + '\u0139': 'L', + '\u013D': 'L', + '\u1E36': 'L', + '\u1E38': 'L', + '\u013B': 'L', + '\u1E3C': 'L', + '\u1E3A': 'L', + '\u0141': 'L', + '\u023D': 'L', + '\u2C62': 'L', + '\u2C60': 'L', + '\uA748': 'L', + '\uA746': 'L', + '\uA780': 'L', + '\u01C7': 'LJ', + '\u01C8': 'Lj', + '\u24C2': 'M', + '\uFF2D': 'M', + '\u1E3E': 'M', + '\u1E40': 'M', + '\u1E42': 'M', + '\u2C6E': 'M', + '\u019C': 'M', + '\u24C3': 'N', + '\uFF2E': 'N', + '\u01F8': 'N', + '\u0143': 'N', + '\u00D1': 'N', + '\u1E44': 'N', + '\u0147': 'N', + '\u1E46': 'N', + '\u0145': 'N', + '\u1E4A': 'N', + '\u1E48': 'N', + '\u0220': 'N', + '\u019D': 'N', + '\uA790': 'N', + '\uA7A4': 'N', + '\u01CA': 'NJ', + '\u01CB': 'Nj', + '\u24C4': 'O', + '\uFF2F': 'O', + '\u00D2': 'O', + '\u00D3': 'O', + '\u00D4': 'O', + '\u1ED2': 'O', + '\u1ED0': 'O', + '\u1ED6': 'O', + '\u1ED4': 'O', + '\u00D5': 'O', + '\u1E4C': 'O', + '\u022C': 'O', + '\u1E4E': 'O', + '\u014C': 'O', + '\u1E50': 'O', + '\u1E52': 'O', + '\u014E': 'O', + '\u022E': 'O', + '\u0230': 'O', + '\u00D6': 'O', + '\u022A': 'O', + '\u1ECE': 'O', + '\u0150': 'O', + '\u01D1': 'O', + '\u020C': 'O', + '\u020E': 'O', + '\u01A0': 'O', + '\u1EDC': 'O', + '\u1EDA': 'O', + '\u1EE0': 'O', + '\u1EDE': 'O', + '\u1EE2': 'O', + '\u1ECC': 'O', + '\u1ED8': 'O', + '\u01EA': 'O', + '\u01EC': 'O', + '\u00D8': 'O', + '\u01FE': 'O', + '\u0186': 'O', + '\u019F': 'O', + '\uA74A': 'O', + '\uA74C': 'O', + '\u01A2': 'OI', + '\uA74E': 'OO', + '\u0222': 'OU', + '\u24C5': 'P', + '\uFF30': 'P', + '\u1E54': 'P', + '\u1E56': 'P', + '\u01A4': 'P', + '\u2C63': 'P', + '\uA750': 'P', + '\uA752': 'P', + '\uA754': 'P', + '\u24C6': 'Q', + '\uFF31': 'Q', + '\uA756': 'Q', + '\uA758': 'Q', + '\u024A': 'Q', + '\u24C7': 'R', + '\uFF32': 'R', + '\u0154': 'R', + '\u1E58': 'R', + '\u0158': 'R', + '\u0210': 'R', + '\u0212': 'R', + '\u1E5A': 'R', + '\u1E5C': 'R', + '\u0156': 'R', + '\u1E5E': 'R', + '\u024C': 'R', + '\u2C64': 'R', + '\uA75A': 'R', + '\uA7A6': 'R', + '\uA782': 'R', + '\u24C8': 'S', + '\uFF33': 'S', + '\u1E9E': 'S', + '\u015A': 'S', + '\u1E64': 'S', + '\u015C': 'S', + '\u1E60': 'S', + '\u0160': 'S', + '\u1E66': 'S', + '\u1E62': 'S', + '\u1E68': 'S', + '\u0218': 'S', + '\u015E': 'S', + '\u2C7E': 'S', + '\uA7A8': 'S', + '\uA784': 'S', + '\u24C9': 'T', + '\uFF34': 'T', + '\u1E6A': 'T', + '\u0164': 'T', + '\u1E6C': 'T', + '\u021A': 'T', + '\u0162': 'T', + '\u1E70': 'T', + '\u1E6E': 'T', + '\u0166': 'T', + '\u01AC': 'T', + '\u01AE': 'T', + '\u023E': 'T', + '\uA786': 'T', + '\uA728': 'TZ', + '\u24CA': 'U', + '\uFF35': 'U', + '\u00D9': 'U', + '\u00DA': 'U', + '\u00DB': 'U', + '\u0168': 'U', + '\u1E78': 'U', + '\u016A': 'U', + '\u1E7A': 'U', + '\u016C': 'U', + '\u00DC': 'U', + '\u01DB': 'U', + '\u01D7': 'U', + '\u01D5': 'U', + '\u01D9': 'U', + '\u1EE6': 'U', + '\u016E': 'U', + '\u0170': 'U', + '\u01D3': 'U', + '\u0214': 'U', + '\u0216': 'U', + '\u01AF': 'U', + '\u1EEA': 'U', + '\u1EE8': 'U', + '\u1EEE': 'U', + '\u1EEC': 'U', + '\u1EF0': 'U', + '\u1EE4': 'U', + '\u1E72': 'U', + '\u0172': 'U', + '\u1E76': 'U', + '\u1E74': 'U', + '\u0244': 'U', + '\u24CB': 'V', + '\uFF36': 'V', + '\u1E7C': 'V', + '\u1E7E': 'V', + '\u01B2': 'V', + '\uA75E': 'V', + '\u0245': 'V', + '\uA760': 'VY', + '\u24CC': 'W', + '\uFF37': 'W', + '\u1E80': 'W', + '\u1E82': 'W', + '\u0174': 'W', + '\u1E86': 'W', + '\u1E84': 'W', + '\u1E88': 'W', + '\u2C72': 'W', + '\u24CD': 'X', + '\uFF38': 'X', + '\u1E8A': 'X', + '\u1E8C': 'X', + '\u24CE': 'Y', + '\uFF39': 'Y', + '\u1EF2': 'Y', + '\u00DD': 'Y', + '\u0176': 'Y', + '\u1EF8': 'Y', + '\u0232': 'Y', + '\u1E8E': 'Y', + '\u0178': 'Y', + '\u1EF6': 'Y', + '\u1EF4': 'Y', + '\u01B3': 'Y', + '\u024E': 'Y', + '\u1EFE': 'Y', + '\u24CF': 'Z', + '\uFF3A': 'Z', + '\u0179': 'Z', + '\u1E90': 'Z', + '\u017B': 'Z', + '\u017D': 'Z', + '\u1E92': 'Z', + '\u1E94': 'Z', + '\u01B5': 'Z', + '\u0224': 'Z', + '\u2C7F': 'Z', + '\u2C6B': 'Z', + '\uA762': 'Z', + '\u24D0': 'a', + '\uFF41': 'a', + '\u1E9A': 'a', + '\u00E0': 'a', + '\u00E1': 'a', + '\u00E2': 'a', + '\u1EA7': 'a', + '\u1EA5': 'a', + '\u1EAB': 'a', + '\u1EA9': 'a', + '\u00E3': 'a', + '\u0101': 'a', + '\u0103': 'a', + '\u1EB1': 'a', + '\u1EAF': 'a', + '\u1EB5': 'a', + '\u1EB3': 'a', + '\u0227': 'a', + '\u01E1': 'a', + '\u00E4': 'a', + '\u01DF': 'a', + '\u1EA3': 'a', + '\u00E5': 'a', + '\u01FB': 'a', + '\u01CE': 'a', + '\u0201': 'a', + '\u0203': 'a', + '\u1EA1': 'a', + '\u1EAD': 'a', + '\u1EB7': 'a', + '\u1E01': 'a', + '\u0105': 'a', + '\u2C65': 'a', + '\u0250': 'a', + '\uA733': 'aa', + '\u00E6': 'ae', + '\u01FD': 'ae', + '\u01E3': 'ae', + '\uA735': 'ao', + '\uA737': 'au', + '\uA739': 'av', + '\uA73B': 'av', + '\uA73D': 'ay', + '\u24D1': 'b', + '\uFF42': 'b', + '\u1E03': 'b', + '\u1E05': 'b', + '\u1E07': 'b', + '\u0180': 'b', + '\u0183': 'b', + '\u0253': 'b', + '\u24D2': 'c', + '\uFF43': 'c', + '\u0107': 'c', + '\u0109': 'c', + '\u010B': 'c', + '\u010D': 'c', + '\u00E7': 'c', + '\u1E09': 'c', + '\u0188': 'c', + '\u023C': 'c', + '\uA73F': 'c', + '\u2184': 'c', + '\u24D3': 'd', + '\uFF44': 'd', + '\u1E0B': 'd', + '\u010F': 'd', + '\u1E0D': 'd', + '\u1E11': 'd', + '\u1E13': 'd', + '\u1E0F': 'd', + '\u0111': 'd', + '\u018C': 'd', + '\u0256': 'd', + '\u0257': 'd', + '\uA77A': 'd', + '\u01F3': 'dz', + '\u01C6': 'dz', + '\u24D4': 'e', + '\uFF45': 'e', + '\u00E8': 'e', + '\u00E9': 'e', + '\u00EA': 'e', + '\u1EC1': 'e', + '\u1EBF': 'e', + '\u1EC5': 'e', + '\u1EC3': 'e', + '\u1EBD': 'e', + '\u0113': 'e', + '\u1E15': 'e', + '\u1E17': 'e', + '\u0115': 'e', + '\u0117': 'e', + '\u00EB': 'e', + '\u1EBB': 'e', + '\u011B': 'e', + '\u0205': 'e', + '\u0207': 'e', + '\u1EB9': 'e', + '\u1EC7': 'e', + '\u0229': 'e', + '\u1E1D': 'e', + '\u0119': 'e', + '\u1E19': 'e', + '\u1E1B': 'e', + '\u0247': 'e', + '\u025B': 'e', + '\u01DD': 'e', + '\u24D5': 'f', + '\uFF46': 'f', + '\u1E1F': 'f', + '\u0192': 'f', + '\uA77C': 'f', + '\u24D6': 'g', + '\uFF47': 'g', + '\u01F5': 'g', + '\u011D': 'g', + '\u1E21': 'g', + '\u011F': 'g', + '\u0121': 'g', + '\u01E7': 'g', + '\u0123': 'g', + '\u01E5': 'g', + '\u0260': 'g', + '\uA7A1': 'g', + '\u1D79': 'g', + '\uA77F': 'g', + '\u24D7': 'h', + '\uFF48': 'h', + '\u0125': 'h', + '\u1E23': 'h', + '\u1E27': 'h', + '\u021F': 'h', + '\u1E25': 'h', + '\u1E29': 'h', + '\u1E2B': 'h', + '\u1E96': 'h', + '\u0127': 'h', + '\u2C68': 'h', + '\u2C76': 'h', + '\u0265': 'h', + '\u0195': 'hv', + '\u24D8': 'i', + '\uFF49': 'i', + '\u00EC': 'i', + '\u00ED': 'i', + '\u00EE': 'i', + '\u0129': 'i', + '\u012B': 'i', + '\u012D': 'i', + '\u00EF': 'i', + '\u1E2F': 'i', + '\u1EC9': 'i', + '\u01D0': 'i', + '\u0209': 'i', + '\u020B': 'i', + '\u1ECB': 'i', + '\u012F': 'i', + '\u1E2D': 'i', + '\u0268': 'i', + '\u0131': 'i', + '\u24D9': 'j', + '\uFF4A': 'j', + '\u0135': 'j', + '\u01F0': 'j', + '\u0249': 'j', + '\u24DA': 'k', + '\uFF4B': 'k', + '\u1E31': 'k', + '\u01E9': 'k', + '\u1E33': 'k', + '\u0137': 'k', + '\u1E35': 'k', + '\u0199': 'k', + '\u2C6A': 'k', + '\uA741': 'k', + '\uA743': 'k', + '\uA745': 'k', + '\uA7A3': 'k', + '\u24DB': 'l', + '\uFF4C': 'l', + '\u0140': 'l', + '\u013A': 'l', + '\u013E': 'l', + '\u1E37': 'l', + '\u1E39': 'l', + '\u013C': 'l', + '\u1E3D': 'l', + '\u1E3B': 'l', + '\u017F': 'l', + '\u0142': 'l', + '\u019A': 'l', + '\u026B': 'l', + '\u2C61': 'l', + '\uA749': 'l', + '\uA781': 'l', + '\uA747': 'l', + '\u01C9': 'lj', + '\u24DC': 'm', + '\uFF4D': 'm', + '\u1E3F': 'm', + '\u1E41': 'm', + '\u1E43': 'm', + '\u0271': 'm', + '\u026F': 'm', + '\u24DD': 'n', + '\uFF4E': 'n', + '\u01F9': 'n', + '\u0144': 'n', + '\u00F1': 'n', + '\u1E45': 'n', + '\u0148': 'n', + '\u1E47': 'n', + '\u0146': 'n', + '\u1E4B': 'n', + '\u1E49': 'n', + '\u019E': 'n', + '\u0272': 'n', + '\u0149': 'n', + '\uA791': 'n', + '\uA7A5': 'n', + '\u01CC': 'nj', + '\u24DE': 'o', + '\uFF4F': 'o', + '\u00F2': 'o', + '\u00F3': 'o', + '\u00F4': 'o', + '\u1ED3': 'o', + '\u1ED1': 'o', + '\u1ED7': 'o', + '\u1ED5': 'o', + '\u00F5': 'o', + '\u1E4D': 'o', + '\u022D': 'o', + '\u1E4F': 'o', + '\u014D': 'o', + '\u1E51': 'o', + '\u1E53': 'o', + '\u014F': 'o', + '\u022F': 'o', + '\u0231': 'o', + '\u00F6': 'o', + '\u022B': 'o', + '\u1ECF': 'o', + '\u0151': 'o', + '\u01D2': 'o', + '\u020D': 'o', + '\u020F': 'o', + '\u01A1': 'o', + '\u1EDD': 'o', + '\u1EDB': 'o', + '\u1EE1': 'o', + '\u1EDF': 'o', + '\u1EE3': 'o', + '\u1ECD': 'o', + '\u1ED9': 'o', + '\u01EB': 'o', + '\u01ED': 'o', + '\u00F8': 'o', + '\u01FF': 'o', + '\u0254': 'o', + '\uA74B': 'o', + '\uA74D': 'o', + '\u0275': 'o', + '\u01A3': 'oi', + '\u0223': 'ou', + '\uA74F': 'oo', + '\u24DF': 'p', + '\uFF50': 'p', + '\u1E55': 'p', + '\u1E57': 'p', + '\u01A5': 'p', + '\u1D7D': 'p', + '\uA751': 'p', + '\uA753': 'p', + '\uA755': 'p', + '\u24E0': 'q', + '\uFF51': 'q', + '\u024B': 'q', + '\uA757': 'q', + '\uA759': 'q', + '\u24E1': 'r', + '\uFF52': 'r', + '\u0155': 'r', + '\u1E59': 'r', + '\u0159': 'r', + '\u0211': 'r', + '\u0213': 'r', + '\u1E5B': 'r', + '\u1E5D': 'r', + '\u0157': 'r', + '\u1E5F': 'r', + '\u024D': 'r', + '\u027D': 'r', + '\uA75B': 'r', + '\uA7A7': 'r', + '\uA783': 'r', + '\u24E2': 's', + '\uFF53': 's', + '\u00DF': 's', + '\u015B': 's', + '\u1E65': 's', + '\u015D': 's', + '\u1E61': 's', + '\u0161': 's', + '\u1E67': 's', + '\u1E63': 's', + '\u1E69': 's', + '\u0219': 's', + '\u015F': 's', + '\u023F': 's', + '\uA7A9': 's', + '\uA785': 's', + '\u1E9B': 's', + '\u24E3': 't', + '\uFF54': 't', + '\u1E6B': 't', + '\u1E97': 't', + '\u0165': 't', + '\u1E6D': 't', + '\u021B': 't', + '\u0163': 't', + '\u1E71': 't', + '\u1E6F': 't', + '\u0167': 't', + '\u01AD': 't', + '\u0288': 't', + '\u2C66': 't', + '\uA787': 't', + '\uA729': 'tz', + '\u24E4': 'u', + '\uFF55': 'u', + '\u00F9': 'u', + '\u00FA': 'u', + '\u00FB': 'u', + '\u0169': 'u', + '\u1E79': 'u', + '\u016B': 'u', + '\u1E7B': 'u', + '\u016D': 'u', + '\u00FC': 'u', + '\u01DC': 'u', + '\u01D8': 'u', + '\u01D6': 'u', + '\u01DA': 'u', + '\u1EE7': 'u', + '\u016F': 'u', + '\u0171': 'u', + '\u01D4': 'u', + '\u0215': 'u', + '\u0217': 'u', + '\u01B0': 'u', + '\u1EEB': 'u', + '\u1EE9': 'u', + '\u1EEF': 'u', + '\u1EED': 'u', + '\u1EF1': 'u', + '\u1EE5': 'u', + '\u1E73': 'u', + '\u0173': 'u', + '\u1E77': 'u', + '\u1E75': 'u', + '\u0289': 'u', + '\u24E5': 'v', + '\uFF56': 'v', + '\u1E7D': 'v', + '\u1E7F': 'v', + '\u028B': 'v', + '\uA75F': 'v', + '\u028C': 'v', + '\uA761': 'vy', + '\u24E6': 'w', + '\uFF57': 'w', + '\u1E81': 'w', + '\u1E83': 'w', + '\u0175': 'w', + '\u1E87': 'w', + '\u1E85': 'w', + '\u1E98': 'w', + '\u1E89': 'w', + '\u2C73': 'w', + '\u24E7': 'x', + '\uFF58': 'x', + '\u1E8B': 'x', + '\u1E8D': 'x', + '\u24E8': 'y', + '\uFF59': 'y', + '\u1EF3': 'y', + '\u00FD': 'y', + '\u0177': 'y', + '\u1EF9': 'y', + '\u0233': 'y', + '\u1E8F': 'y', + '\u00FF': 'y', + '\u1EF7': 'y', + '\u1E99': 'y', + '\u1EF5': 'y', + '\u01B4': 'y', + '\u024F': 'y', + '\u1EFF': 'y', + '\u24E9': 'z', + '\uFF5A': 'z', + '\u017A': 'z', + '\u1E91': 'z', + '\u017C': 'z', + '\u017E': 'z', + '\u1E93': 'z', + '\u1E95': 'z', + '\u01B6': 'z', + '\u0225': 'z', + '\u0240': 'z', + '\u2C6C': 'z', + '\uA763': 'z', + '\u0386': '\u0391', + '\u0388': '\u0395', + '\u0389': '\u0397', + '\u038A': '\u0399', + '\u03AA': '\u0399', + '\u038C': '\u039F', + '\u038E': '\u03A5', + '\u03AB': '\u03A5', + '\u038F': '\u03A9', + '\u03AC': '\u03B1', + '\u03AD': '\u03B5', + '\u03AE': '\u03B7', + '\u03AF': '\u03B9', + '\u03CA': '\u03B9', + '\u0390': '\u03B9', + '\u03CC': '\u03BF', + '\u03CD': '\u03C5', + '\u03CB': '\u03C5', + '\u03B0': '\u03C5', + '\u03C9': '\u03C9', + '\u03C2': '\u03C3' + }; + + return diacritics; +}); + +S2.define('select2/data/base',[ + '../utils' +], function (Utils) { + function BaseAdapter ($element, options) { + BaseAdapter.__super__.constructor.call(this); + } + + Utils.Extend(BaseAdapter, Utils.Observable); + + BaseAdapter.prototype.current = function (callback) { + throw new Error('The `current` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.query = function (params, callback) { + throw new Error('The `query` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.bind = function (container, $container) { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.destroy = function () { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.generateResultId = function (container, data) { + var id = container.id + '-result-'; + + id += Utils.generateChars(4); + + if (data.id != null) { + id += '-' + data.id.toString(); + } else { + id += '-' + Utils.generateChars(4); + } + return id; + }; + + return BaseAdapter; +}); + +S2.define('select2/data/select',[ + './base', + '../utils', + 'jquery' +], function (BaseAdapter, Utils, $) { + function SelectAdapter ($element, options) { + this.$element = $element; + this.options = options; + + SelectAdapter.__super__.constructor.call(this); + } + + Utils.Extend(SelectAdapter, BaseAdapter); + + SelectAdapter.prototype.current = function (callback) { + var data = []; + var self = this; + + this.$element.find(':selected').each(function () { + var $option = $(this); + + var option = self.item($option); + + data.push(option); + }); + + callback(data); + }; + + SelectAdapter.prototype.select = function (data) { + var self = this; + + data.selected = true; + + // If data.element is a DOM node, use it instead + if ($(data.element).is('option')) { + data.element.selected = true; + + this.$element.trigger('change'); + + return; + } + + if (this.$element.prop('multiple')) { + this.current(function (currentData) { + var val = []; + + data = [data]; + data.push.apply(data, currentData); + + for (var d = 0; d < data.length; d++) { + var id = data[d].id; + + if ($.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + self.$element.trigger('change'); + }); + } else { + var val = data.id; + + this.$element.val(val); + this.$element.trigger('change'); + } + }; + + SelectAdapter.prototype.unselect = function (data) { + var self = this; + + if (!this.$element.prop('multiple')) { + return; + } + + data.selected = false; + + if ($(data.element).is('option')) { + data.element.selected = false; + + this.$element.trigger('change'); + + return; + } + + this.current(function (currentData) { + var val = []; + + for (var d = 0; d < currentData.length; d++) { + var id = currentData[d].id; + + if (id !== data.id && $.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + + self.$element.trigger('change'); + }); + }; + + SelectAdapter.prototype.bind = function (container, $container) { + var self = this; + + this.container = container; + + container.on('select', function (params) { + self.select(params.data); + }); + + container.on('unselect', function (params) { + self.unselect(params.data); + }); + }; + + SelectAdapter.prototype.destroy = function () { + // Remove anything added to child elements + this.$element.find('*').each(function () { + // Remove any custom data set by Select2 + $.removeData(this, 'data'); + }); + }; + + SelectAdapter.prototype.query = function (params, callback) { + var data = []; + var self = this; + + var $options = this.$element.children(); + + $options.each(function () { + var $option = $(this); + + if (!$option.is('option') && !$option.is('optgroup')) { + return; + } + + var option = self.item($option); + + var matches = self.matches(params, option); + + if (matches !== null) { + data.push(matches); + } + }); + + callback({ + results: data + }); + }; + + SelectAdapter.prototype.addOptions = function ($options) { + Utils.appendMany(this.$element, $options); + }; + + SelectAdapter.prototype.option = function (data) { + var option; + + if (data.children) { + option = document.createElement('optgroup'); + option.label = data.text; + } else { + option = document.createElement('option'); + + if (option.textContent !== undefined) { + option.textContent = data.text; + } else { + option.innerText = data.text; + } + } + + if (data.id) { + option.value = data.id; + } + + if (data.disabled) { + option.disabled = true; + } + + if (data.selected) { + option.selected = true; + } + + if (data.title) { + option.title = data.title; + } + + var $option = $(option); + + var normalizedData = this._normalizeItem(data); + normalizedData.element = option; + + // Override the option's data with the combined data + $.data(option, 'data', normalizedData); + + return $option; + }; + + SelectAdapter.prototype.item = function ($option) { + var data = {}; + + data = $.data($option[0], 'data'); + + if (data != null) { + return data; + } + + if ($option.is('option')) { + data = { + id: $option.val(), + text: $option.text(), + disabled: $option.prop('disabled'), + selected: $option.prop('selected'), + title: $option.prop('title') + }; + } else if ($option.is('optgroup')) { + data = { + text: $option.prop('label'), + children: [], + title: $option.prop('title') + }; + + var $children = $option.children('option'); + var children = []; + + for (var c = 0; c < $children.length; c++) { + var $child = $($children[c]); + + var child = this.item($child); + + children.push(child); + } + + data.children = children; + } + + data = this._normalizeItem(data); + data.element = $option[0]; + + $.data($option[0], 'data', data); + + return data; + }; + + SelectAdapter.prototype._normalizeItem = function (item) { + if (!$.isPlainObject(item)) { + item = { + id: item, + text: item + }; + } + + item = $.extend({}, { + text: '' + }, item); + + var defaults = { + selected: false, + disabled: false + }; + + if (item.id != null) { + item.id = item.id.toString(); + } + + if (item.text != null) { + item.text = item.text.toString(); + } + + if (item._resultId == null && item.id && this.container != null) { + item._resultId = this.generateResultId(this.container, item); + } + + return $.extend({}, defaults, item); + }; + + SelectAdapter.prototype.matches = function (params, data) { + var matcher = this.options.get('matcher'); + + return matcher(params, data); + }; + + return SelectAdapter; +}); + +S2.define('select2/data/array',[ + './select', + '../utils', + 'jquery' +], function (SelectAdapter, Utils, $) { + function ArrayAdapter ($element, options) { + var data = options.get('data') || []; + + ArrayAdapter.__super__.constructor.call(this, $element, options); + + this.addOptions(this.convertToOptions(data)); + } + + Utils.Extend(ArrayAdapter, SelectAdapter); + + ArrayAdapter.prototype.select = function (data) { + var $option = this.$element.find('option').filter(function (i, elm) { + return elm.value == data.id.toString(); + }); + + if ($option.length === 0) { + $option = this.option(data); + + this.addOptions($option); + } + + ArrayAdapter.__super__.select.call(this, data); + }; + + ArrayAdapter.prototype.convertToOptions = function (data) { + var self = this; + + var $existing = this.$element.find('option'); + var existingIds = $existing.map(function () { + return self.item($(this)).id; + }).get(); + + var $options = []; + + // Filter out all items except for the one passed in the argument + function onlyItem (item) { + return function () { + return $(this).val() == item.id; + }; + } + + for (var d = 0; d < data.length; d++) { + var item = this._normalizeItem(data[d]); + + // Skip items which were pre-loaded, only merge the data + if ($.inArray(item.id, existingIds) >= 0) { + var $existingOption = $existing.filter(onlyItem(item)); + + var existingData = this.item($existingOption); + var newData = $.extend(true, {}, existingData, item); + + var $newOption = this.option(existingData); + + $existingOption.replaceWith($newOption); + + continue; + } + + var $option = this.option(item); + + if (item.children) { + var $children = this.convertToOptions(item.children); + + Utils.appendMany($option, $children); + } + + $options.push($option); + } + + return $options; + }; + + return ArrayAdapter; +}); + +S2.define('select2/data/ajax',[ + './array', + '../utils', + 'jquery' +], function (ArrayAdapter, Utils, $) { + function AjaxAdapter ($element, options) { + this.ajaxOptions = this._applyDefaults(options.get('ajax')); + + if (this.ajaxOptions.processResults != null) { + this.processResults = this.ajaxOptions.processResults; + } + + ArrayAdapter.__super__.constructor.call(this, $element, options); + } + + Utils.Extend(AjaxAdapter, ArrayAdapter); + + AjaxAdapter.prototype._applyDefaults = function (options) { + var defaults = { + data: function (params) { + return { + q: params.term + }; + }, + transport: function (params, success, failure) { + var $request = $.ajax(params); + + $request.then(success); + $request.fail(failure); + + return $request; + } + }; + + return $.extend({}, defaults, options, true); + }; + + AjaxAdapter.prototype.processResults = function (results) { + return results; + }; + + AjaxAdapter.prototype.query = function (params, callback) { + var matches = []; + var self = this; + + if (this._request != null) { + // JSONP requests cannot always be aborted + if ($.isFunction(this._request.abort)) { + this._request.abort(); + } + + this._request = null; + } + + var options = $.extend({ + type: 'GET' + }, this.ajaxOptions); + + if (typeof options.url === 'function') { + options.url = options.url(params); + } + + if (typeof options.data === 'function') { + options.data = options.data(params); + } + + function request () { + var $request = options.transport(options, function (data) { + var results = self.processResults(data, params); + + if (self.options.get('debug') && window.console && console.error) { + // Check to make sure that the response included a `results` key. + if (!results || !results.results || !$.isArray(results.results)) { + console.error( + 'Select2: The AJAX results did not return an array in the ' + + '`results` key of the response.' + ); + } + } + + callback(results); + }, function () { + // TODO: Handle AJAX errors + }); + + self._request = $request; + } + + if (this.ajaxOptions.delay && params.term !== '') { + if (this._queryTimeout) { + window.clearTimeout(this._queryTimeout); + } + + this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); + } else { + request(); + } + }; + + return AjaxAdapter; +}); + +S2.define('select2/data/tags',[ + 'jquery' +], function ($) { + function Tags (decorated, $element, options) { + var tags = options.get('tags'); + + var createTag = options.get('createTag'); + + if (createTag !== undefined) { + this.createTag = createTag; + } + + decorated.call(this, $element, options); + + if ($.isArray(tags)) { + for (var t = 0; t < tags.length; t++) { + var tag = tags[t]; + var item = this._normalizeItem(tag); + + var $option = this.option(item); + + this.$element.append($option); + } + } + } + + Tags.prototype.query = function (decorated, params, callback) { + var self = this; + + this._removeOldTags(); + + if (params.term == null || params.page != null) { + decorated.call(this, params, callback); + return; + } + + function wrapper (obj, child) { + var data = obj.results; + + for (var i = 0; i < data.length; i++) { + var option = data[i]; + + var checkChildren = ( + option.children != null && + !wrapper({ + results: option.children + }, true) + ); + + var checkText = option.text === params.term; + + if (checkText || checkChildren) { + if (child) { + return false; + } + + obj.data = data; + callback(obj); + + return; + } + } + + if (child) { + return true; + } + + var tag = self.createTag(params); + + if (tag != null) { + var $option = self.option(tag); + $option.attr('data-select2-tag', true); + + self.addOptions([$option]); + + self.insertTag(data, tag); + } + + obj.results = data; + + callback(obj); + } + + decorated.call(this, params, wrapper); + }; + + Tags.prototype.createTag = function (decorated, params) { + var term = $.trim(params.term); + + if (term === '') { + return null; + } + + return { + id: term, + text: term + }; + }; + + Tags.prototype.insertTag = function (_, data, tag) { + data.unshift(tag); + }; + + Tags.prototype._removeOldTags = function (_) { + var tag = this._lastTag; + + var $options = this.$element.find('option[data-select2-tag]'); + + $options.each(function () { + if (this.selected) { + return; + } + + $(this).remove(); + }); + }; + + return Tags; +}); + +S2.define('select2/data/tokenizer',[ + 'jquery' +], function ($) { + function Tokenizer (decorated, $element, options) { + var tokenizer = options.get('tokenizer'); + + if (tokenizer !== undefined) { + this.tokenizer = tokenizer; + } + + decorated.call(this, $element, options); + } + + Tokenizer.prototype.bind = function (decorated, container, $container) { + decorated.call(this, container, $container); + + this.$search = container.dropdown.$search || container.selection.$search || + $container.find('.select2-search__field'); + }; + + Tokenizer.prototype.query = function (decorated, params, callback) { + var self = this; + + function select (data) { + self.select(data); + } + + params.term = params.term || ''; + + var tokenData = this.tokenizer(params, this.options, select); + + if (tokenData.term !== params.term) { + // Replace the search term if we have the search box + if (this.$search.length) { + this.$search.val(tokenData.term); + this.$search.focus(); + } + + params.term = tokenData.term; + } + + decorated.call(this, params, callback); + }; + + Tokenizer.prototype.tokenizer = function (_, params, options, callback) { + var separators = options.get('tokenSeparators') || []; + var term = params.term; + var i = 0; + + var createTag = this.createTag || function (params) { + return { + id: params.term, + text: params.term + }; + }; + + while (i < term.length) { + var termChar = term[i]; + + if ($.inArray(termChar, separators) === -1) { + i++; + + continue; + } + + var part = term.substr(0, i); + var partParams = $.extend({}, params, { + term: part + }); + + var data = createTag(partParams); + + callback(data); + + // Reset the term to not include the tokenized portion + term = term.substr(i + 1) || ''; + i = 0; + } + + return { + term: term + }; + }; + + return Tokenizer; +}); + +S2.define('select2/data/minimumInputLength',[ + +], function () { + function MinimumInputLength (decorated, $e, options) { + this.minimumInputLength = options.get('minimumInputLength'); + + decorated.call(this, $e, options); + } + + MinimumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (params.term.length < this.minimumInputLength) { + this.trigger('results:message', { + message: 'inputTooShort', + args: { + minimum: this.minimumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MinimumInputLength; +}); + +S2.define('select2/data/maximumInputLength',[ + +], function () { + function MaximumInputLength (decorated, $e, options) { + this.maximumInputLength = options.get('maximumInputLength'); + + decorated.call(this, $e, options); + } + + MaximumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (this.maximumInputLength > 0 && + params.term.length > this.maximumInputLength) { + this.trigger('results:message', { + message: 'inputTooLong', + args: { + maximum: this.maximumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MaximumInputLength; +}); + +S2.define('select2/data/maximumSelectionLength',[ + +], function (){ + function MaximumSelectionLength (decorated, $e, options) { + this.maximumSelectionLength = options.get('maximumSelectionLength'); + + decorated.call(this, $e, options); + } + + MaximumSelectionLength.prototype.query = + function (decorated, params, callback) { + var self = this; + + this.current(function (currentData) { + var count = currentData != null ? currentData.length : 0; + if (self.maximumSelectionLength > 0 && + count >= self.maximumSelectionLength) { + self.trigger('results:message', { + message: 'maximumSelected', + args: { + maximum: self.maximumSelectionLength + } + }); + return; + } + decorated.call(self, params, callback); + }); + }; + + return MaximumSelectionLength; +}); + +S2.define('select2/dropdown',[ + 'jquery', + './utils' +], function ($, Utils) { + function Dropdown ($element, options) { + this.$element = $element; + this.options = options; + + Dropdown.__super__.constructor.call(this); + } + + Utils.Extend(Dropdown, Utils.Observable); + + Dropdown.prototype.render = function () { + var $dropdown = $( + '<span class="select2-dropdown">' + + '<span class="select2-results"></span>' + + '</span>' + ); + + $dropdown.attr('dir', this.options.get('dir')); + + this.$dropdown = $dropdown; + + return $dropdown; + }; + + Dropdown.prototype.position = function ($dropdown, $container) { + // Should be implmented in subclasses + }; + + Dropdown.prototype.destroy = function () { + // Remove the dropdown from the DOM + this.$dropdown.remove(); + }; + + return Dropdown; +}); + +S2.define('select2/dropdown/search',[ + 'jquery', + '../utils' +], function ($, Utils) { + function Search () { } + + Search.prototype.render = function (decorated) { + var $rendered = decorated.call(this); + + var $search = $( + '<span class="select2-search select2-search--dropdown">' + + '<input class="select2-search__field" type="search" tabindex="-1"' + + ' autocomplete="off" autocorrect="off" autocapitalize="off"' + + ' spellcheck="false" role="textbox" />' + + '</span>' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + $rendered.prepend($search); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + this.$search.on('keydown', function (evt) { + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + }); + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$search.on('input', function (evt) { + // Unbind the duplicated `keyup` event + $(this).off('keyup'); + }); + + this.$search.on('keyup input', function (evt) { + self.handleSearch(evt); + }); + + container.on('open', function () { + self.$search.attr('tabindex', 0); + + self.$search.focus(); + + window.setTimeout(function () { + self.$search.focus(); + }, 0); + }); + + container.on('close', function () { + self.$search.attr('tabindex', -1); + + self.$search.val(''); + }); + + container.on('results:all', function (params) { + if (params.query.term == null || params.query.term === '') { + var showSearch = self.showSearch(params); + + if (showSearch) { + self.$searchContainer.removeClass('select2-search--hide'); + } else { + self.$searchContainer.addClass('select2-search--hide'); + } + } + }); + }; + + Search.prototype.handleSearch = function (evt) { + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.showSearch = function (_, params) { + return true; + }; + + return Search; +}); + +S2.define('select2/dropdown/hidePlaceholder',[ + +], function () { + function HidePlaceholder (decorated, $element, options, dataAdapter) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options, dataAdapter); + } + + HidePlaceholder.prototype.append = function (decorated, data) { + data.results = this.removePlaceholder(data.results); + + decorated.call(this, data); + }; + + HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + HidePlaceholder.prototype.removePlaceholder = function (_, data) { + var modifiedData = data.slice(0); + + for (var d = data.length - 1; d >= 0; d--) { + var item = data[d]; + + if (this.placeholder.id === item.id) { + modifiedData.splice(d, 1); + } + } + + return modifiedData; + }; + + return HidePlaceholder; +}); + +S2.define('select2/dropdown/infiniteScroll',[ + 'jquery' +], function ($) { + function InfiniteScroll (decorated, $element, options, dataAdapter) { + this.lastParams = {}; + + decorated.call(this, $element, options, dataAdapter); + + this.$loadingMore = this.createLoadingMore(); + this.loading = false; + } + + InfiniteScroll.prototype.append = function (decorated, data) { + this.$loadingMore.remove(); + this.loading = false; + + decorated.call(this, data); + + if (this.showLoadingMore(data)) { + this.$results.append(this.$loadingMore); + } + }; + + InfiniteScroll.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('query', function (params) { + self.lastParams = params; + self.loading = true; + }); + + container.on('query:append', function (params) { + self.lastParams = params; + self.loading = true; + }); + + this.$results.on('scroll', function () { + var isLoadMoreVisible = $.contains( + document.documentElement, + self.$loadingMore[0] + ); + + if (self.loading || !isLoadMoreVisible) { + return; + } + + var currentOffset = self.$results.offset().top + + self.$results.outerHeight(false); + var loadingMoreOffset = self.$loadingMore.offset().top + + self.$loadingMore.outerHeight(false); + + if (currentOffset + 50 >= loadingMoreOffset) { + self.loadMore(); + } + }); + }; + + InfiniteScroll.prototype.loadMore = function () { + this.loading = true; + + var params = $.extend({}, {page: 1}, this.lastParams); + + params.page++; + + this.trigger('query:append', params); + }; + + InfiniteScroll.prototype.showLoadingMore = function (_, data) { + return data.pagination && data.pagination.more; + }; + + InfiniteScroll.prototype.createLoadingMore = function () { + var $option = $( + '<li class="option load-more" role="treeitem"></li>' + ); + + var message = this.options.get('translations').get('loadingMore'); + + $option.html(message(this.lastParams)); + + return $option; + }; + + return InfiniteScroll; +}); + +S2.define('select2/dropdown/attachBody',[ + 'jquery', + '../utils' +], function ($, Utils) { + function AttachBody (decorated, $element, options) { + this.$dropdownParent = options.get('dropdownParent') || document.body; + + decorated.call(this, $element, options); + } + + AttachBody.prototype.bind = function (decorated, container, $container) { + var self = this; + + var setupResultsEvents = false; + + decorated.call(this, container, $container); + + container.on('open', function () { + self._showDropdown(); + self._attachPositioningHandler(container); + + if (!setupResultsEvents) { + setupResultsEvents = true; + + container.on('results:all', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:append', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + } + }); + + container.on('close', function () { + self._hideDropdown(); + self._detachPositioningHandler(container); + }); + + this.$dropdownContainer.on('mousedown', function (evt) { + evt.stopPropagation(); + }); + }; + + AttachBody.prototype.position = function (decorated, $dropdown, $container) { + // Clone all of the container classes + $dropdown.attr('class', $container.attr('class')); + + $dropdown.removeClass('select2'); + $dropdown.addClass('select2-container--open'); + + $dropdown.css({ + position: 'absolute', + top: -999999 + }); + + this.$container = $container; + }; + + AttachBody.prototype.render = function (decorated) { + var $container = $('<span></span>'); + + var $dropdown = decorated.call(this); + $container.append($dropdown); + + this.$dropdownContainer = $container; + + return $container; + }; + + AttachBody.prototype._hideDropdown = function (decorated) { + this.$dropdownContainer.detach(); + }; + + AttachBody.prototype._attachPositioningHandler = function (container) { + var self = this; + + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.each(function () { + $(this).data('select2-scroll-position', { + x: $(this).scrollLeft(), + y: $(this).scrollTop() + }); + }); + + $watchers.on(scrollEvent, function (ev) { + var position = $(this).data('select2-scroll-position'); + $(this).scrollTop(position.y); + }); + + $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, + function (e) { + self._positionDropdown(); + self._resizeDropdown(); + }); + }; + + AttachBody.prototype._detachPositioningHandler = function (container) { + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.off(scrollEvent); + + $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); + }; + + AttachBody.prototype._positionDropdown = function () { + var $window = $(window); + + var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); + var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); + + var newDirection = null; + + var position = this.$container.position(); + var offset = this.$container.offset(); + + offset.bottom = offset.top + this.$container.outerHeight(false); + + var container = { + height: this.$container.outerHeight(false) + }; + + container.top = offset.top; + container.bottom = offset.top + container.height; + + var dropdown = { + height: this.$dropdown.outerHeight(false) + }; + + var viewport = { + top: $window.scrollTop(), + bottom: $window.scrollTop() + $window.height() + }; + + var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); + var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); + + var css = { + left: offset.left, + top: container.bottom + }; + + if (!isCurrentlyAbove && !isCurrentlyBelow) { + newDirection = 'below'; + } + + if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { + newDirection = 'above'; + } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { + newDirection = 'below'; + } + + if (newDirection == 'above' || + (isCurrentlyAbove && newDirection !== 'below')) { + css.top = container.top - dropdown.height; + } + + if (newDirection != null) { + this.$dropdown + .removeClass('select2-dropdown--below select2-dropdown--above') + .addClass('select2-dropdown--' + newDirection); + this.$container + .removeClass('select2-container--below select2-container--above') + .addClass('select2-container--' + newDirection); + } + + this.$dropdownContainer.css(css); + }; + + AttachBody.prototype._resizeDropdown = function () { + this.$dropdownContainer.width(); + + var css = { + width: this.$container.outerWidth(false) + 'px' + }; + + if (this.options.get('dropdownAutoWidth')) { + css.minWidth = css.width; + css.width = 'auto'; + } + + this.$dropdown.css(css); + }; + + AttachBody.prototype._showDropdown = function (decorated) { + this.$dropdownContainer.appendTo(this.$dropdownParent); + + this._positionDropdown(); + this._resizeDropdown(); + }; + + return AttachBody; +}); + +S2.define('select2/dropdown/minimumResultsForSearch',[ + +], function () { + function countResults (data) { + var count = 0; + + for (var d = 0; d < data.length; d++) { + var item = data[d]; + + if (item.children) { + count += countResults(item.children); + } else { + count++; + } + } + + return count; + } + + function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { + this.minimumResultsForSearch = options.get('minimumResultsForSearch'); + + if (this.minimumResultsForSearch < 0) { + this.minimumResultsForSearch = Infinity; + } + + decorated.call(this, $element, options, dataAdapter); + } + + MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { + if (countResults(params.data.results) < this.minimumResultsForSearch) { + return false; + } + + return decorated.call(this, params); + }; + + return MinimumResultsForSearch; +}); + +S2.define('select2/dropdown/selectOnClose',[ + +], function () { + function SelectOnClose () { } + + SelectOnClose.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('close', function () { + self._handleSelectOnClose(); + }); + }; + + SelectOnClose.prototype._handleSelectOnClose = function () { + var $highlightedResults = this.getHighlightedResults(); + + if ($highlightedResults.length < 1) { + return; + } + + this.trigger('select', { + data: $highlightedResults.data('data') + }); + }; + + return SelectOnClose; +}); + +S2.define('select2/dropdown/closeOnSelect',[ + +], function () { + function CloseOnSelect () { } + + CloseOnSelect.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('select', function (evt) { + self._selectTriggered(evt); + }); + + container.on('unselect', function (evt) { + self._selectTriggered(evt); + }); + }; + + CloseOnSelect.prototype._selectTriggered = function (_, evt) { + var originalEvent = evt.originalEvent; + + // Don't close if the control key is being held + if (originalEvent && originalEvent.ctrlKey) { + return; + } + + this.trigger('close'); + }; + + return CloseOnSelect; +}); + +S2.define('select2/i18n/en',[],function () { + // English + return { + errorLoading: function () { + return 'The results could not be loaded.'; + }, + inputTooLong: function (args) { + var overChars = args.input.length - args.maximum; + + var message = 'Please delete ' + overChars + ' character'; + + if (overChars != 1) { + message += 's'; + } + + return message; + }, + inputTooShort: function (args) { + var remainingChars = args.minimum - args.input.length; + + var message = 'Please enter ' + remainingChars + ' or more characters'; + + return message; + }, + loadingMore: function () { + return 'Loading more results…'; + }, + maximumSelected: function (args) { + var message = 'You can only select ' + args.maximum + ' item'; + + if (args.maximum != 1) { + message += 's'; + } + + return message; + }, + noResults: function () { + return 'No results found'; + }, + searching: function () { + return 'Searching…'; + } + }; +}); + +S2.define('select2/defaults',[ + 'jquery', + 'require', + + './results', + + './selection/single', + './selection/multiple', + './selection/placeholder', + './selection/allowClear', + './selection/search', + './selection/eventRelay', + + './utils', + './translation', + './diacritics', + + './data/select', + './data/array', + './data/ajax', + './data/tags', + './data/tokenizer', + './data/minimumInputLength', + './data/maximumInputLength', + './data/maximumSelectionLength', + + './dropdown', + './dropdown/search', + './dropdown/hidePlaceholder', + './dropdown/infiniteScroll', + './dropdown/attachBody', + './dropdown/minimumResultsForSearch', + './dropdown/selectOnClose', + './dropdown/closeOnSelect', + + './i18n/en' +], function ($, require, + + ResultsList, + + SingleSelection, MultipleSelection, Placeholder, AllowClear, + SelectionSearch, EventRelay, + + Utils, Translation, DIACRITICS, + + SelectData, ArrayData, AjaxData, Tags, Tokenizer, + MinimumInputLength, MaximumInputLength, MaximumSelectionLength, + + Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, + AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, + + EnglishTranslation) { + function Defaults () { + this.reset(); + } + + Defaults.prototype.apply = function (options) { + options = $.extend({}, this.defaults, options); + + if (options.dataAdapter == null) { + if (options.ajax != null) { + options.dataAdapter = AjaxData; + } else if (options.data != null) { + options.dataAdapter = ArrayData; + } else { + options.dataAdapter = SelectData; + } + + if (options.minimumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MinimumInputLength + ); + } + + if (options.maximumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumInputLength + ); + } + + if (options.maximumSelectionLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumSelectionLength + ); + } + + if (options.tags) { + options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); + } + + if (options.tokenSeparators != null || options.tokenizer != null) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Tokenizer + ); + } + + if (options.query != null) { + var Query = require(options.amdBase + 'compat/query'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Query + ); + } + + if (options.initSelection != null) { + var InitSelection = require(options.amdBase + 'compat/initSelection'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + InitSelection + ); + } + } + + if (options.resultsAdapter == null) { + options.resultsAdapter = ResultsList; + + if (options.ajax != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + InfiniteScroll + ); + } + + if (options.placeholder != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + HidePlaceholder + ); + } + + if (options.selectOnClose) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + SelectOnClose + ); + } + } + + if (options.dropdownAdapter == null) { + if (options.multiple) { + options.dropdownAdapter = Dropdown; + } else { + var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); + + options.dropdownAdapter = SearchableDropdown; + } + + if (options.minimumResultsForSearch !== 0) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + MinimumResultsForSearch + ); + } + + if (options.closeOnSelect) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + CloseOnSelect + ); + } + + if ( + options.dropdownCssClass != null || + options.dropdownCss != null || + options.adaptDropdownCssClass != null + ) { + var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + DropdownCSS + ); + } + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + AttachBody + ); + } + + if (options.selectionAdapter == null) { + if (options.multiple) { + options.selectionAdapter = MultipleSelection; + } else { + options.selectionAdapter = SingleSelection; + } + + // Add the placeholder mixin if a placeholder was specified + if (options.placeholder != null) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + Placeholder + ); + } + + if (options.allowClear) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + AllowClear + ); + } + + if (options.multiple) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + SelectionSearch + ); + } + + if ( + options.containerCssClass != null || + options.containerCss != null || + options.adaptContainerCssClass != null + ) { + var ContainerCSS = require(options.amdBase + 'compat/containerCss'); + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + ContainerCSS + ); + } + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + EventRelay + ); + } + + if (typeof options.language === 'string') { + // Check if the language is specified with a region + if (options.language.indexOf('-') > 0) { + // Extract the region information if it is included + var languageParts = options.language.split('-'); + var baseLanguage = languageParts[0]; + + options.language = [options.language, baseLanguage]; + } else { + options.language = [options.language]; + } + } + + if ($.isArray(options.language)) { + var languages = new Translation(); + options.language.push('en'); + + var languageNames = options.language; + + for (var l = 0; l < languageNames.length; l++) { + var name = languageNames[l]; + var language = {}; + + try { + // Try to load it with the original name + language = Translation.loadPath(name); + } catch (e) { + try { + // If we couldn't load it, check if it wasn't the full path + name = this.defaults.amdLanguageBase + name; + language = Translation.loadPath(name); + } catch (ex) { + // The translation could not be loaded at all. Sometimes this is + // because of a configuration problem, other times this can be + // because of how Select2 helps load all possible translation files. + if (options.debug && window.console && console.warn) { + console.warn( + 'Select2: The language file for "' + name + '" could not be ' + + 'automatically loaded. A fallback will be used instead.' + ); + } + + continue; + } + } + + languages.extend(language); + } + + options.translations = languages; + } else { + var baseTranslation = Translation.loadPath( + this.defaults.amdLanguageBase + 'en' + ); + var customTranslation = new Translation(options.language); + + customTranslation.extend(baseTranslation); + + options.translations = customTranslation; + } + + return options; + }; + + Defaults.prototype.reset = function () { + function stripDiacritics (text) { + // Used 'uni range + named function' from http://jsperf.com/diacritics/18 + function match(a) { + return DIACRITICS[a] || a; + } + + return text.replace(/[^\u0000-\u007E]/g, match); + } + + function matcher (params, data) { + // Always return the object if there is nothing to compare + if ($.trim(params.term) === '') { + return data; + } + + // Do a recursive check for options with children + if (data.children && data.children.length > 0) { + // Clone the data object if there are children + // This is required as we modify the object to remove any non-matches + var match = $.extend(true, {}, data); + + // Check each child of the option + for (var c = data.children.length - 1; c >= 0; c--) { + var child = data.children[c]; + + var matches = matcher(params, child); + + // If there wasn't a match, remove the object in the array + if (matches == null) { + match.children.splice(c, 1); + } + } + + // If any children matched, return the new object + if (match.children.length > 0) { + return match; + } + + // If there were no matching children, check just the plain object + return matcher(params, match); + } + + var original = stripDiacritics(data.text).toUpperCase(); + var term = stripDiacritics(params.term).toUpperCase(); + + // Check if the text contains the term + if (original.indexOf(term) > -1) { + return data; + } + + // If it doesn't contain the term, don't return anything + return null; + } + + this.defaults = { + amdBase: './', + amdLanguageBase: './i18n/', + closeOnSelect: true, + debug: false, + dropdownAutoWidth: false, + escapeMarkup: Utils.escapeMarkup, + language: EnglishTranslation, + matcher: matcher, + minimumInputLength: 0, + maximumInputLength: 0, + maximumSelectionLength: 0, + minimumResultsForSearch: 0, + selectOnClose: false, + sorter: function (data) { + return data; + }, + templateResult: function (result) { + return result.text; + }, + templateSelection: function (selection) { + return selection.text; + }, + theme: 'default', + width: 'resolve' + }; + }; + + Defaults.prototype.set = function (key, value) { + var camelKey = $.camelCase(key); + + var data = {}; + data[camelKey] = value; + + var convertedData = Utils._convertData(data); + + $.extend(this.defaults, convertedData); + }; + + var defaults = new Defaults(); + + return defaults; +}); + +S2.define('select2/options',[ + 'require', + 'jquery', + './defaults', + './utils' +], function (require, $, Defaults, Utils) { + function Options (options, $element) { + this.options = options; + + if ($element != null) { + this.fromElement($element); + } + + this.options = Defaults.apply(this.options); + + if ($element && $element.is('input')) { + var InputCompat = require(this.get('amdBase') + 'compat/inputData'); + + this.options.dataAdapter = Utils.Decorate( + this.options.dataAdapter, + InputCompat + ); + } + } + + Options.prototype.fromElement = function ($e) { + var excludedData = ['select2']; + + if (this.options.multiple == null) { + this.options.multiple = $e.prop('multiple'); + } + + if (this.options.disabled == null) { + this.options.disabled = $e.prop('disabled'); + } + + if (this.options.language == null) { + if ($e.prop('lang')) { + this.options.language = $e.prop('lang').toLowerCase(); + } else if ($e.closest('[lang]').prop('lang')) { + this.options.language = $e.closest('[lang]').prop('lang'); + } + } + + if (this.options.dir == null) { + if ($e.prop('dir')) { + this.options.dir = $e.prop('dir'); + } else if ($e.closest('[dir]').prop('dir')) { + this.options.dir = $e.closest('[dir]').prop('dir'); + } else { + this.options.dir = 'ltr'; + } + } + + $e.prop('disabled', this.options.disabled); + $e.prop('multiple', this.options.multiple); + + if ($e.data('select2Tags')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-select2-tags` attribute has been changed to ' + + 'use the `data-data` and `data-tags="true"` attributes and will be ' + + 'removed in future versions of Select2.' + ); + } + + $e.data('data', $e.data('select2Tags')); + $e.data('tags', true); + } + + if ($e.data('ajaxUrl')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-ajax-url` attribute has been changed to ' + + '`data-ajax--url` and support for the old attribute will be removed' + + ' in future versions of Select2.' + ); + } + + $e.attr('ajax--url', $e.data('ajaxUrl')); + $e.data('ajax--url', $e.data('ajaxUrl')); + } + + var dataset = {}; + + // Prefer the element's `dataset` attribute if it exists + // jQuery 1.x does not correctly handle data attributes with multiple dashes + if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { + dataset = $.extend(true, {}, $e[0].dataset, $e.data()); + } else { + dataset = $e.data(); + } + + var data = $.extend(true, {}, dataset); + + data = Utils._convertData(data); + + for (var key in data) { + if ($.inArray(key, excludedData) > -1) { + continue; + } + + if ($.isPlainObject(this.options[key])) { + $.extend(this.options[key], data[key]); + } else { + this.options[key] = data[key]; + } + } + + return this; + }; + + Options.prototype.get = function (key) { + return this.options[key]; + }; + + Options.prototype.set = function (key, val) { + this.options[key] = val; + }; + + return Options; +}); + +S2.define('select2/core',[ + 'jquery', + './options', + './utils', + './keys' +], function ($, Options, Utils, KEYS) { + var Select2 = function ($element, options) { + if ($element.data('select2') != null) { + $element.data('select2').destroy(); + } + + this.$element = $element; + + this.id = this._generateId($element); + + options = options || {}; + + this.options = new Options(options, $element); + + Select2.__super__.constructor.call(this); + + // Set up the tabindex + + var tabindex = $element.attr('tabindex') || 0; + $element.data('old-tabindex', tabindex); + $element.attr('tabindex', '-1'); + + // Set up containers and adapters + + var DataAdapter = this.options.get('dataAdapter'); + this.dataAdapter = new DataAdapter($element, this.options); + + var $container = this.render(); + + this._placeContainer($container); + + var SelectionAdapter = this.options.get('selectionAdapter'); + this.selection = new SelectionAdapter($element, this.options); + this.$selection = this.selection.render(); + + this.selection.position(this.$selection, $container); + + var DropdownAdapter = this.options.get('dropdownAdapter'); + this.dropdown = new DropdownAdapter($element, this.options); + this.$dropdown = this.dropdown.render(); + + this.dropdown.position(this.$dropdown, $container); + + var ResultsAdapter = this.options.get('resultsAdapter'); + this.results = new ResultsAdapter($element, this.options, this.dataAdapter); + this.$results = this.results.render(); + + this.results.position(this.$results, this.$dropdown); + + // Bind events + + var self = this; + + // Bind the container to all of the adapters + this._bindAdapters(); + + // Register any DOM event handlers + this._registerDomEvents(); + + // Register any internal event handlers + this._registerDataEvents(); + this._registerSelectionEvents(); + this._registerDropdownEvents(); + this._registerResultsEvents(); + this._registerEvents(); + + // Set the initial state + this.dataAdapter.current(function (initialData) { + self.trigger('selection:update', { + data: initialData + }); + }); + + // Hide the original select + $element.addClass('select2-hidden-accessible'); + $element.attr('aria-hidden', 'true'); + + // Synchronize any monitored attributes + this._syncAttributes(); + + $element.data('select2', this); + }; + + Utils.Extend(Select2, Utils.Observable); + + Select2.prototype._generateId = function ($element) { + var id = ''; + + if ($element.attr('id') != null) { + id = $element.attr('id'); + } else if ($element.attr('name') != null) { + id = $element.attr('name') + '-' + Utils.generateChars(2); + } else { + id = Utils.generateChars(4); + } + + id = 'select2-' + id; + + return id; + }; + + Select2.prototype._placeContainer = function ($container) { + $container.insertAfter(this.$element); + + var width = this._resolveWidth(this.$element, this.options.get('width')); + + if (width != null) { + $container.css('width', width); + } + }; + + Select2.prototype._resolveWidth = function ($element, method) { + var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; + + if (method == 'resolve') { + var styleWidth = this._resolveWidth($element, 'style'); + + if (styleWidth != null) { + return styleWidth; + } + + return this._resolveWidth($element, 'element'); + } + + if (method == 'element') { + var elementWidth = $element.outerWidth(false); + + if (elementWidth <= 0) { + return 'auto'; + } + + return elementWidth + 'px'; + } + + if (method == 'style') { + var style = $element.attr('style'); + + if (typeof(style) !== 'string') { + return null; + } + + var attrs = style.split(';'); + + for (var i = 0, l = attrs.length; i < l; i = i + 1) { + var attr = attrs[i].replace(/\s/g, ''); + var matches = attr.match(WIDTH); + + if (matches !== null && matches.length >= 1) { + return matches[1]; + } + } + + return null; + } + + return method; + }; + + Select2.prototype._bindAdapters = function () { + this.dataAdapter.bind(this, this.$container); + this.selection.bind(this, this.$container); + + this.dropdown.bind(this, this.$container); + this.results.bind(this, this.$container); + }; + + Select2.prototype._registerDomEvents = function () { + var self = this; + + this.$element.on('change.select2', function () { + self.dataAdapter.current(function (data) { + self.trigger('selection:update', { + data: data + }); + }); + }); + + this._sync = Utils.bind(this._syncAttributes, this); + + if (this.$element[0].attachEvent) { + this.$element[0].attachEvent('onpropertychange', this._sync); + } + + var observer = window.MutationObserver || + window.WebKitMutationObserver || + window.MozMutationObserver + ; + + if (observer != null) { + this._observer = new observer(function (mutations) { + $.each(mutations, self._sync); + }); + this._observer.observe(this.$element[0], { + attributes: true, + subtree: false + }); + } else if (this.$element[0].addEventListener) { + this.$element[0].addEventListener('DOMAttrModified', self._sync, false); + } + }; + + Select2.prototype._registerDataEvents = function () { + var self = this; + + this.dataAdapter.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerSelectionEvents = function () { + var self = this; + var nonRelayEvents = ['toggle']; + + this.selection.on('toggle', function () { + self.toggleDropdown(); + }); + + this.selection.on('*', function (name, params) { + if ($.inArray(name, nonRelayEvents) !== -1) { + return; + } + + self.trigger(name, params); + }); + }; + + Select2.prototype._registerDropdownEvents = function () { + var self = this; + + this.dropdown.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerResultsEvents = function () { + var self = this; + + this.results.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerEvents = function () { + var self = this; + + this.on('open', function () { + self.$container.addClass('select2-container--open'); + }); + + this.on('close', function () { + self.$container.removeClass('select2-container--open'); + }); + + this.on('enable', function () { + self.$container.removeClass('select2-container--disabled'); + }); + + this.on('disable', function () { + self.$container.addClass('select2-container--disabled'); + }); + + this.on('focus', function () { + self.$container.addClass('select2-container--focus'); + }); + + this.on('blur', function () { + self.$container.removeClass('select2-container--focus'); + }); + + this.on('query', function (params) { + if (!self.isOpen()) { + self.trigger('open'); + } + + this.dataAdapter.query(params, function (data) { + self.trigger('results:all', { + data: data, + query: params + }); + }); + }); + + this.on('query:append', function (params) { + this.dataAdapter.query(params, function (data) { + self.trigger('results:append', { + data: data, + query: params + }); + }); + }); + + this.on('keypress', function (evt) { + var key = evt.which; + + if (self.isOpen()) { + if (key === KEYS.ENTER) { + self.trigger('results:select'); + + evt.preventDefault(); + } else if ((key === KEYS.SPACE && evt.ctrlKey)) { + self.trigger('results:toggle'); + + evt.preventDefault(); + } else if (key === KEYS.UP) { + self.trigger('results:previous'); + + evt.preventDefault(); + } else if (key === KEYS.DOWN) { + self.trigger('results:next'); + + evt.preventDefault(); + } else if (key === KEYS.ESC || key === KEYS.TAB) { + self.close(); + + evt.preventDefault(); + } + } else { + if (key === KEYS.ENTER || key === KEYS.SPACE || + ((key === KEYS.DOWN || key === KEYS.UP) && evt.altKey)) { + self.open(); + + evt.preventDefault(); + } + } + }); + }; + + Select2.prototype._syncAttributes = function () { + this.options.set('disabled', this.$element.prop('disabled')); + + if (this.options.get('disabled')) { + if (this.isOpen()) { + this.close(); + } + + this.trigger('disable'); + } else { + this.trigger('enable'); + } + }; + + /** + * Override the trigger method to automatically trigger pre-events when + * there are events that can be prevented. + */ + Select2.prototype.trigger = function (name, args) { + var actualTrigger = Select2.__super__.trigger; + var preTriggerMap = { + 'open': 'opening', + 'close': 'closing', + 'select': 'selecting', + 'unselect': 'unselecting' + }; + + if (name in preTriggerMap) { + var preTriggerName = preTriggerMap[name]; + var preTriggerArgs = { + prevented: false, + name: name, + args: args + }; + + actualTrigger.call(this, preTriggerName, preTriggerArgs); + + if (preTriggerArgs.prevented) { + args.prevented = true; + + return; + } + } + + actualTrigger.call(this, name, args); + }; + + Select2.prototype.toggleDropdown = function () { + if (this.options.get('disabled')) { + return; + } + + if (this.isOpen()) { + this.close(); + } else { + this.open(); + } + }; + + Select2.prototype.open = function () { + if (this.isOpen()) { + return; + } + + this.trigger('query', {}); + + this.trigger('open'); + }; + + Select2.prototype.close = function () { + if (!this.isOpen()) { + return; + } + + this.trigger('close'); + }; + + Select2.prototype.isOpen = function () { + return this.$container.hasClass('select2-container--open'); + }; + + Select2.prototype.enable = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("enable")` method has been deprecated and will' + + ' be removed in later Select2 versions. Use $element.prop("disabled")' + + ' instead.' + ); + } + + if (args == null || args.length === 0) { + args = [true]; + } + + var disabled = !args[0]; + + this.$element.prop('disabled', disabled); + }; + + Select2.prototype.data = function () { + if (this.options.get('debug') && + arguments.length > 0 && window.console && console.warn) { + console.warn( + 'Select2: Data can no longer be set using `select2("data")`. You ' + + 'should consider setting the value instead using `$element.val()`.' + ); + } + + var data = []; + + this.dataAdapter.current(function (currentData) { + data = currentData; + }); + + return data; + }; + + Select2.prototype.val = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("val")` method has been deprecated and will be' + + ' removed in later Select2 versions. Use $element.val() instead.' + ); + } + + if (args == null || args.length === 0) { + return this.$element.val(); + } + + var newVal = args[0]; + + if ($.isArray(newVal)) { + newVal = $.map(newVal, function (obj) { + return obj.toString(); + }); + } + + this.$element.val(newVal).trigger('change'); + }; + + Select2.prototype.destroy = function () { + this.$container.remove(); + + if (this.$element[0].detachEvent) { + this.$element[0].detachEvent('onpropertychange', this._sync); + } + + if (this._observer != null) { + this._observer.disconnect(); + this._observer = null; + } else if (this.$element[0].removeEventListener) { + this.$element[0] + .removeEventListener('DOMAttrModified', this._sync, false); + } + + this._sync = null; + + this.$element.off('.select2'); + this.$element.attr('tabindex', this.$element.data('old-tabindex')); + + this.$element.removeClass('select2-hidden-accessible'); + this.$element.attr('aria-hidden', 'false'); + this.$element.removeData('select2'); + + this.dataAdapter.destroy(); + this.selection.destroy(); + this.dropdown.destroy(); + this.results.destroy(); + + this.dataAdapter = null; + this.selection = null; + this.dropdown = null; + this.results = null; + }; + + Select2.prototype.render = function () { + var $container = $( + '<span class="select2 select2-container">' + + '<span class="selection"></span>' + + '<span class="dropdown-wrapper" aria-hidden="true"></span>' + + '</span>' + ); + + $container.attr('dir', this.options.get('dir')); + + this.$container = $container; + + this.$container.addClass('select2-container--' + this.options.get('theme')); + + $container.data('element', this.$element); + + return $container; + }; + + return Select2; +}); + +S2.define('select2/compat/utils',[ + 'jquery' +], function ($) { + function syncCssClasses ($dest, $src, adapter) { + var classes, replacements = [], adapted; + + classes = $.trim($dest.attr('class')); + + if (classes) { + classes = '' + classes; // for IE which returns object + + $(classes.split(/\s+/)).each(function () { + // Save all Select2 classes + if (this.indexOf('select2-') === 0) { + replacements.push(this); + } + }); + } + + classes = $.trim($src.attr('class')); + + if (classes) { + classes = '' + classes; // for IE which returns object + + $(classes.split(/\s+/)).each(function () { + // Only adapt non-Select2 classes + if (this.indexOf('select2-') !== 0) { + adapted = adapter(this); + + if (adapted != null) { + replacements.push(adapted); + } + } + }); + } + + $dest.attr('class', replacements.join(' ')); + } + + return { + syncCssClasses: syncCssClasses + }; +}); + +S2.define('select2/compat/containerCss',[ + 'jquery', + './utils' +], function ($, CompatUtils) { + // No-op CSS adapter that discards all classes by default + function _containerAdapter (clazz) { + return null; + } + + function ContainerCSS () { } + + ContainerCSS.prototype.render = function (decorated) { + var $container = decorated.call(this); + + var containerCssClass = this.options.get('containerCssClass') || ''; + + if ($.isFunction(containerCssClass)) { + containerCssClass = containerCssClass(this.$element); + } + + var containerCssAdapter = this.options.get('adaptContainerCssClass'); + containerCssAdapter = containerCssAdapter || _containerAdapter; + + if (containerCssClass.indexOf(':all:') !== -1) { + containerCssClass = containerCssClass.replace(':all', ''); + + var _cssAdapter = containerCssAdapter; + + containerCssAdapter = function (clazz) { + var adapted = _cssAdapter(clazz); + + if (adapted != null) { + // Append the old one along with the adapted one + return adapted + ' ' + clazz; + } + + return clazz; + }; + } + + var containerCss = this.options.get('containerCss') || {}; + + if ($.isFunction(containerCss)) { + containerCss = containerCss(this.$element); + } + + CompatUtils.syncCssClasses($container, this.$element, containerCssAdapter); + + $container.css(containerCss); + $container.addClass(containerCssClass); + + return $container; + }; + + return ContainerCSS; +}); + +S2.define('select2/compat/dropdownCss',[ + 'jquery', + './utils' +], function ($, CompatUtils) { + // No-op CSS adapter that discards all classes by default + function _dropdownAdapter (clazz) { + return null; + } + + function DropdownCSS () { } + + DropdownCSS.prototype.render = function (decorated) { + var $dropdown = decorated.call(this); + + var dropdownCssClass = this.options.get('dropdownCssClass') || ''; + + if ($.isFunction(dropdownCssClass)) { + dropdownCssClass = dropdownCssClass(this.$element); + } + + var dropdownCssAdapter = this.options.get('adaptDropdownCssClass'); + dropdownCssAdapter = dropdownCssAdapter || _dropdownAdapter; + + if (dropdownCssClass.indexOf(':all:') !== -1) { + dropdownCssClass = dropdownCssClass.replace(':all', ''); + + var _cssAdapter = dropdownCssAdapter; + + dropdownCssAdapter = function (clazz) { + var adapted = _cssAdapter(clazz); + + if (adapted != null) { + // Append the old one along with the adapted one + return adapted + ' ' + clazz; + } + + return clazz; + }; + } + + var dropdownCss = this.options.get('dropdownCss') || {}; + + if ($.isFunction(dropdownCss)) { + dropdownCss = dropdownCss(this.$element); + } + + CompatUtils.syncCssClasses($dropdown, this.$element, dropdownCssAdapter); + + $dropdown.css(dropdownCss); + $dropdown.addClass(dropdownCssClass); + + return $dropdown; + }; + + return DropdownCSS; +}); + +S2.define('select2/compat/initSelection',[ + 'jquery' +], function ($) { + function InitSelection (decorated, $element, options) { + if (options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `initSelection` option has been deprecated in favor' + + ' of a custom data adapter that overrides the `current` method. ' + + 'This method is now called multiple times instead of a single ' + + 'time when the instance is initialized. Support will be removed ' + + 'for the `initSelection` option in future versions of Select2' + ); + } + + this.initSelection = options.get('initSelection'); + this._isInitialized = false; + + decorated.call(this, $element, options); + } + + InitSelection.prototype.current = function (decorated, callback) { + var self = this; + + if (this._isInitialized) { + decorated.call(this, callback); + + return; + } + + this.initSelection.call(null, this.$element, function (data) { + self._isInitialized = true; + + if (!$.isArray(data)) { + data = [data]; + } + + callback(data); + }); + }; + + return InitSelection; +}); + +S2.define('select2/compat/inputData',[ + 'jquery' +], function ($) { + function InputData (decorated, $element, options) { + this._currentData = []; + this._valueSeparator = options.get('valueSeparator') || ','; + + if ($element.prop('type') === 'hidden') { + if (options.get('debug') && console && console.warn) { + console.warn( + 'Select2: Using a hidden input with Select2 is no longer ' + + 'supported and may stop working in the future. It is recommended ' + + 'to use a `<select>` element instead.' + ); + } + } + + decorated.call(this, $element, options); + } + + InputData.prototype.current = function (_, callback) { + function getSelected (data, selectedIds) { + var selected = []; + + if (data.selected || $.inArray(data.id, selectedIds) !== -1) { + data.selected = true; + selected.push(data); + } else { + data.selected = false; + } + + if (data.children) { + selected.push.apply(selected, getSelected(data.children, selectedIds)); + } + + return selected; + } + + var selected = []; + + for (var d = 0; d < this._currentData.length; d++) { + var data = this._currentData[d]; + + selected.push.apply( + selected, + getSelected( + data, + this.$element.val().split( + this._valueSeparator + ) + ) + ); + } + + callback(selected); + }; + + InputData.prototype.select = function (_, data) { + if (!this.options.get('multiple')) { + this.current(function (allData) { + $.map(allData, function (data) { + data.selected = false; + }); + }); + + this.$element.val(data.id); + this.$element.trigger('change'); + } else { + var value = this.$element.val(); + value += this._valueSeparator + data.id; + + this.$element.val(value); + this.$element.trigger('change'); + } + }; + + InputData.prototype.unselect = function (_, data) { + var self = this; + + data.selected = false; + + this.current(function (allData) { + var values = []; + + for (var d = 0; d < allData.length; d++) { + var item = allData[d]; + + if (data.id == item.id) { + continue; + } + + values.push(item.id); + } + + self.$element.val(values.join(self._valueSeparator)); + self.$element.trigger('change'); + }); + }; + + InputData.prototype.query = function (_, params, callback) { + var results = []; + + for (var d = 0; d < this._currentData.length; d++) { + var data = this._currentData[d]; + + var matches = this.matches(params, data); + + if (matches !== null) { + results.push(matches); + } + } + + callback({ + results: results + }); + }; + + InputData.prototype.addOptions = function (_, $options) { + var options = $.map($options, function ($option) { + return $.data($option[0], 'data'); + }); + + this._currentData.push.apply(this._currentData, options); + }; + + return InputData; +}); + +S2.define('select2/compat/matcher',[ + 'jquery' +], function ($) { + function oldMatcher (matcher) { + function wrappedMatcher (params, data) { + var match = $.extend(true, {}, data); + + if (params.term == null || $.trim(params.term) === '') { + return match; + } + + if (data.children) { + for (var c = data.children.length - 1; c >= 0; c--) { + var child = data.children[c]; + + // Check if the child object matches + // The old matcher returned a boolean true or false + var doesMatch = matcher(params.term, child.text, child); + + // If the child didn't match, pop it off + if (!doesMatch) { + match.children.splice(c, 1); + } + } + + if (match.children.length > 0) { + return match; + } + } + + if (matcher(params.term, data.text, data)) { + return match; + } + + return null; + } + + return wrappedMatcher; + } + + return oldMatcher; +}); + +S2.define('select2/compat/query',[ + +], function () { + function Query (decorated, $element, options) { + if (options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `query` option has been deprecated in favor of a ' + + 'custom data adapter that overrides the `query` method. Support ' + + 'will be removed for the `query` option in future versions of ' + + 'Select2.' + ); + } + + decorated.call(this, $element, options); + } + + Query.prototype.query = function (_, params, callback) { + params.callback = callback; + + var query = this.options.get('query'); + + query.call(null, params); + }; + + return Query; +}); + +S2.define('select2/dropdown/attachContainer',[ + +], function () { + function AttachContainer (decorated, $element, options) { + decorated.call(this, $element, options); + } + + AttachContainer.prototype.position = + function (decorated, $dropdown, $container) { + var $dropdownContainer = $container.find('.dropdown-wrapper'); + $dropdownContainer.append($dropdown); + + $dropdown.addClass('select2-dropdown--below'); + $container.addClass('select2-container--below'); + }; + + return AttachContainer; +}); + +S2.define('select2/dropdown/stopPropagation',[ + +], function () { + function StopPropagation () { } + + StopPropagation.prototype.bind = function (decorated, container, $container) { + decorated.call(this, container, $container); + + var stoppedEvents = [ + 'blur', + 'change', + 'click', + 'dblclick', + 'focus', + 'focusin', + 'focusout', + 'input', + 'keydown', + 'keyup', + 'keypress', + 'mousedown', + 'mouseenter', + 'mouseleave', + 'mousemove', + 'mouseover', + 'mouseup', + 'search', + 'touchend', + 'touchstart' + ]; + + this.$dropdown.on(stoppedEvents.join(' '), function (evt) { + evt.stopPropagation(); + }); + }; + + return StopPropagation; +}); + +S2.define('select2/selection/stopPropagation',[ + +], function () { + function StopPropagation () { } + + StopPropagation.prototype.bind = function (decorated, container, $container) { + decorated.call(this, container, $container); + + var stoppedEvents = [ + 'blur', + 'change', + 'click', + 'dblclick', + 'focus', + 'focusin', + 'focusout', + 'input', + 'keydown', + 'keyup', + 'keypress', + 'mousedown', + 'mouseenter', + 'mouseleave', + 'mousemove', + 'mouseover', + 'mouseup', + 'search', + 'touchend', + 'touchstart' + ]; + + this.$selection.on(stoppedEvents.join(' '), function (evt) { + evt.stopPropagation(); + }); + }; + + return StopPropagation; +}); + +S2.define('jquery.select2',[ + 'jquery', + 'require', + + './select2/core', + './select2/defaults' +], function ($, require, Select2, Defaults) { + // Force jQuery.mousewheel to be loaded if it hasn't already + require('jquery.mousewheel'); + + if ($.fn.select2 == null) { + // All methods that should return the element + var thisMethods = ['open', 'close', 'destroy']; + + $.fn.select2 = function (options) { + options = options || {}; + + if (typeof options === 'object') { + this.each(function () { + var instanceOptions = $.extend({}, options, true); + + var instance = new Select2($(this), instanceOptions); + }); + + return this; + } else if (typeof options === 'string') { + var instance = this.data('select2'); + + if (instance == null && window.console && console.error) { + console.error( + 'The select2(\'' + options + '\') method was called on an ' + + 'element that is not using Select2.' + ); + } + + var args = Array.prototype.slice.call(arguments, 1); + + var ret = instance[options](args); + + // Check if we should be returning `this` + if ($.inArray(options, thisMethods) > -1) { + return this; + } + + return ret; + } else { + throw new Error('Invalid arguments for Select2: ' + options); + } + }; + } + + if ($.fn.select2.defaults == null) { + $.fn.select2.defaults = Defaults; + } + + return Select2; +}); + +/*! + * jQuery Mousewheel 3.1.12 + * + * Copyright 2014 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + */ + +(function (factory) { + if ( typeof S2.define === 'function' && S2.define.amd ) { + // AMD. Register as an anonymous module. + S2.define('jquery.mousewheel',['jquery'], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS style for Browserify + module.exports = factory; + } else { + // Browser globals + factory(jQuery); + } +}(function ($) { + + var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'], + toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ? + ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'], + slice = Array.prototype.slice, + nullLowestDeltaTimeout, lowestDelta; + + if ( $.event.fixHooks ) { + for ( var i = toFix.length; i; ) { + $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks; + } + } + + var special = $.event.special.mousewheel = { + version: '3.1.12', + + setup: function() { + if ( this.addEventListener ) { + for ( var i = toBind.length; i; ) { + this.addEventListener( toBind[--i], handler, false ); + } + } else { + this.onmousewheel = handler; + } + // Store the line height and page height for this particular element + $.data(this, 'mousewheel-line-height', special.getLineHeight(this)); + $.data(this, 'mousewheel-page-height', special.getPageHeight(this)); + }, + + teardown: function() { + if ( this.removeEventListener ) { + for ( var i = toBind.length; i; ) { + this.removeEventListener( toBind[--i], handler, false ); + } + } else { + this.onmousewheel = null; + } + // Clean up the data we added to the element + $.removeData(this, 'mousewheel-line-height'); + $.removeData(this, 'mousewheel-page-height'); + }, + + getLineHeight: function(elem) { + var $elem = $(elem), + $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent'](); + if (!$parent.length) { + $parent = $('body'); + } + return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16; + }, + + getPageHeight: function(elem) { + return $(elem).height(); + }, + + settings: { + adjustOldDeltas: true, // see shouldAdjustOldDeltas() below + normalizeOffset: true // calls getBoundingClientRect for each event + } + }; + + $.fn.extend({ + mousewheel: function(fn) { + return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel'); + }, + + unmousewheel: function(fn) { + return this.unbind('mousewheel', fn); + } + }); + + + function handler(event) { + var orgEvent = event || window.event, + args = slice.call(arguments, 1), + delta = 0, + deltaX = 0, + deltaY = 0, + absDelta = 0, + offsetX = 0, + offsetY = 0; + event = $.event.fix(orgEvent); + event.type = 'mousewheel'; + + // Old school scrollwheel delta + if ( 'detail' in orgEvent ) { deltaY = orgEvent.detail * -1; } + if ( 'wheelDelta' in orgEvent ) { deltaY = orgEvent.wheelDelta; } + if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY; } + if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; } + + // Firefox < 17 horizontal scrolling related to DOMMouseScroll event + if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) { + deltaX = deltaY * -1; + deltaY = 0; + } + + // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy + delta = deltaY === 0 ? deltaX : deltaY; + + // New school wheel delta (wheel event) + if ( 'deltaY' in orgEvent ) { + deltaY = orgEvent.deltaY * -1; + delta = deltaY; + } + if ( 'deltaX' in orgEvent ) { + deltaX = orgEvent.deltaX; + if ( deltaY === 0 ) { delta = deltaX * -1; } + } + + // No change actually happened, no reason to go any further + if ( deltaY === 0 && deltaX === 0 ) { return; } + + // Need to convert lines and pages to pixels if we aren't already in pixels + // There are three delta modes: + // * deltaMode 0 is by pixels, nothing to do + // * deltaMode 1 is by lines + // * deltaMode 2 is by pages + if ( orgEvent.deltaMode === 1 ) { + var lineHeight = $.data(this, 'mousewheel-line-height'); + delta *= lineHeight; + deltaY *= lineHeight; + deltaX *= lineHeight; + } else if ( orgEvent.deltaMode === 2 ) { + var pageHeight = $.data(this, 'mousewheel-page-height'); + delta *= pageHeight; + deltaY *= pageHeight; + deltaX *= pageHeight; + } + + // Store lowest absolute delta to normalize the delta values + absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) ); + + if ( !lowestDelta || absDelta < lowestDelta ) { + lowestDelta = absDelta; + + // Adjust older deltas if necessary + if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) { + lowestDelta /= 40; + } + } + + // Adjust older deltas if necessary + if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) { + // Divide all the things by 40! + delta /= 40; + deltaX /= 40; + deltaY /= 40; + } + + // Get a whole, normalized value for the deltas + delta = Math[ delta >= 1 ? 'floor' : 'ceil' ](delta / lowestDelta); + deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta); + deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta); + + // Normalise offsetX and offsetY properties + if ( special.settings.normalizeOffset && this.getBoundingClientRect ) { + var boundingRect = this.getBoundingClientRect(); + offsetX = event.clientX - boundingRect.left; + offsetY = event.clientY - boundingRect.top; + } + + // Add information to the event object + event.deltaX = deltaX; + event.deltaY = deltaY; + event.deltaFactor = lowestDelta; + event.offsetX = offsetX; + event.offsetY = offsetY; + // Go ahead and set deltaMode to 0 since we converted to pixels + // Although this is a little odd since we overwrite the deltaX/Y + // properties with normalized deltas. + event.deltaMode = 0; + + // Add event and delta to the front of the arguments + args.unshift(event, delta, deltaX, deltaY); + + // Clearout lowestDelta after sometime to better + // handle multiple device types that give different + // a different lowestDelta + // Ex: trackpad = 3 and mouse wheel = 120 + if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); } + nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200); + + return ($.event.dispatch || $.event.handle).apply(this, args); + } + + function nullLowestDelta() { + lowestDelta = null; + } + + function shouldAdjustOldDeltas(orgEvent, absDelta) { + // If this is an older event and the delta is divisable by 120, + // then we are assuming that the browser is treating this as an + // older mouse wheel event and that we should divide the deltas + // by 40 to try and get a more usable deltaFactor. + // Side note, this actually impacts the reported scroll distance + // in older browsers and can cause scrolling to be slower than native. + // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false. + return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0; + } + +})); + + // Return the AMD loader configuration so it can be used outside of this file + return { + define: S2.define, + require: S2.require + }; +}()); + + // Autoload the jQuery bindings + // We know that all of the modules exist above this, so we're safe + var select2 = S2.require('jquery.select2'); + + // Hold the AMD module references on the jQuery function that was just loaded + // This allows Select2 to use the internal loader outside of this file, such + // as in the language files. + jQuery.fn.select2.amd = S2; + + // Return the Select2 instance for anyone who is importing it. + return select2; +})); diff --git a/theme/bootstrap/plugins/select2/select2.full.min.js b/theme/bootstrap/plugins/select2/select2.full.min.js new file mode 100644 index 0000000..59d8c1a --- /dev/null +++ b/theme/bootstrap/plugins/select2/select2.full.min.js @@ -0,0 +1,3 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return u.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n=b&&b.split("/"),o=s.map,p=o&&o["*"]||{};if(a&&"."===a.charAt(0))if(b){for(n=n.slice(0,n.length-1),a=a.split("/"),g=a.length-1,s.nodeIdCompat&&w.test(a[g])&&(a[g]=a[g].replace(w,"")),a=n.concat(a),k=0;k<a.length;k+=1)if(m=a[k],"."===m)a.splice(k,1),k-=1;else if(".."===m){if(1===k&&(".."===a[2]||".."===a[0]))break;k>0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}else 0===a.indexOf("./")&&(a=a.substring(2));if((n||p)&&o){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),n)for(l=n.length;l>0;l-=1)if(e=o[n.slice(0,l).join("/")],e&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&p&&p[d]&&(i=p[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){return n.apply(b,v.call(arguments,0).concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){q[a]=b}}function j(a){if(e(r,a)){var c=r[a];delete r[a],t[a]=!0,m.apply(b,c)}if(!e(q,a)&&!e(t,a))throw new Error("No "+a);return q[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return function(){return s&&s.config&&s.config[a]||{}}}var m,n,o,p,q={},r={},s={},t={},u=Object.prototype.hasOwnProperty,v=[].slice,w=/\.js$/;o=function(a,b){var c,d=k(a),e=d[0];return a=d[1],e&&(e=f(e,b),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(b)):f(a,b):(a=f(a,b),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},p={require:function(a){return g(a)},exports:function(a){var b=q[a];return"undefined"!=typeof b?b:q[a]={}},module:function(a){return{id:a,uri:"",exports:q[a],config:l(a)}}},m=function(a,c,d,f){var h,k,l,m,n,s,u=[],v=typeof d;if(f=f||a,"undefined"===v||"function"===v){for(c=!c.length&&d.length?["require","exports","module"]:c,n=0;n<c.length;n+=1)if(m=o(c[n],f),k=m.f,"require"===k)u[n]=p.require(a);else if("exports"===k)u[n]=p.exports(a),s=!0;else if("module"===k)h=u[n]=p.module(a);else if(e(q,k)||e(r,k)||e(t,k))u[n]=j(k);else{if(!m.p)throw new Error(a+" missing "+k);m.p.load(m.n,g(f,!0),i(k),{}),u[n]=q[k]}l=d?d.apply(q[a],u):void 0,a&&(h&&h.exports!==b&&h.exports!==q[a]?q[a]=h.exports:l===b&&s||(q[a]=l))}else a&&(q[a]=d)},a=c=n=function(a,c,d,e,f){if("string"==typeof a)return p[a]?p[a](c):j(o(a,c).f);if(!a.splice){if(s=a,s.deps&&n(s.deps,s.callback),!c)return;c.splice?(a=c,c=d,d=null):a=b}return c=c||function(){},"function"==typeof d&&(d=e,e=f),e?m(b,a,c,d):setTimeout(function(){m(b,a,c,d)},4),n},n.config=function(a){return n(a)},a._defined=q,d=function(a,b,c){b.splice||(c=b,b=[]),e(q,a)||e(r,a)||(r[a]=[a,b,c])},d.amd={jQuery:!0}}(),b.requirejs=a,b.require=c,b.define=d}}(),b.define("almond",function(){}),b.define("jquery",[],function(){var b=a||$;return null==b&&console&&console.error&&console.error("Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page."),b}),b.define("select2/utils",["jquery"],function(a){function b(a){var b=a.prototype,c=[];for(var d in b){var e=b[d];"function"==typeof e&&"constructor"!==d&&c.push(d)}return c}var c={};c.Extend=function(a,b){function c(){this.constructor=a}var d={}.hasOwnProperty;for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},c.Decorate=function(a,c){function d(){var b=Array.prototype.unshift,d=c.prototype.constructor.length,e=a.prototype.constructor;d>0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;h<g.length;h++){var i=g[h];d.prototype[i]=a.prototype[i]}for(var j=(function(a){var b=function(){};a in d.prototype&&(b=d.prototype[a]);var e=c.prototype[a];return function(){var a=Array.prototype.unshift;return a.call(arguments,b),e.apply(this,arguments)}}),k=0;k<f.length;k++){var l=f[k];d.prototype[l]=j(l)}return d};var d=function(){this.listeners={}};return d.prototype.on=function(a,b){this.listeners=this.listeners||{},a in this.listeners?this.listeners[a].push(b):this.listeners[a]=[b]},d.prototype.trigger=function(a){var b=Array.prototype.slice;this.listeners=this.listeners||{},a in this.listeners&&this.invoke(this.listeners[a],b.call(arguments,1)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},d.prototype.invoke=function(a,b){for(var c=0,d=a.length;d>c;c++)a[c].apply(this,b)},c.Observable=d,c.generateChars=function(a){for(var b="",c=0;a>c;c++){var d=Math.floor(36*Math.random());b+=d.toString(36)}return b},c.bind=function(a,b){return function(){a.apply(b,arguments)}},c._convertData=function(a){for(var b in a){var c=b.split("-"),d=a;if(1!==c.length){for(var e=0;e<c.length;e++){var f=c[e];f=f.substring(0,1).toLowerCase()+f.substring(1),f in d||(d[f]={}),e==c.length-1&&(d[f]=a[b]),d=d[f]}delete a[b]}}return a},c.hasScroll=function(b,c){var d=a(c),e=c.style.overflowX,f=c.style.overflowY;return e!==f||"hidden"!==f&&"visible"!==f?"scroll"===e||"scroll"===f?!0:d.innerHeight()<c.scrollHeight||d.innerWidth()<c.scrollWidth:!1},c.escapeMarkup=function(a){var b={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<ul class="select2-results__options" role="tree"></ul>');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a('<li role="treeitem" class="select2-results__option"></li>'),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),this.$results.append(d)},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c<a.results.length;c++){var d=a.results[c],e=this.option(d);b.push(e)}this.$results.append(b)},c.prototype.position=function(a,b){var c=b.find(".select2-results");c.append(a)},c.prototype.sort=function(a){var b=this.options.get("sorter");return b(a)},c.prototype.setClasses=function(){var b=this;this.data.current(function(c){var d=a.map(c,function(a){return a.id.toString()}),e=b.$results.find(".select2-results__option[aria-selected]");e.each(function(){var b=a(this),c=a.data(this,"data"),e=""+c.id;null!=c.element&&c.element.selected||null==c.element&&a.inArray(e,d)>-1?b.attr("aria-selected","true"):b.attr("aria-selected","false")});var f=e.filter("[aria-selected=true]");f.length>0?f.first().trigger("mouseenter"):e.first().trigger("mouseenter")})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(b){var c=document.createElement("li");c.className="select2-results__option";var d={role:"treeitem","aria-selected":"false"};b.disabled&&(delete d["aria-selected"],d["aria-disabled"]="true"),null==b.id&&delete d["aria-selected"],null!=b._resultId&&(c.id=b._resultId),b.title&&(c.title=b.title),b.children&&(d.role="group",d["aria-label"]=b.text,delete d["aria-selected"]);for(var e in d){var f=d[e];c.setAttribute(e,f)}if(b.children){var g=a(c),h=document.createElement("strong");h.className="select2-results__group";{a(h)}this.template(b,h);for(var i=[],j=0;j<b.children.length;j++){var k=b.children[j],l=this.option(k);i.push(l)}var m=a("<ul></ul>",{"class":"select2-results__options select2-results__options--nested"});m.append(i),g.append(h),g.append(m)}else this.template(b,c);return a.data(c,"data",b),c},c.prototype.bind=function(b){var c=this,d=b.id+"-results";this.$results.attr("id",d),b.on("results:all",function(a){c.clear(),c.append(a.data),b.isOpen()&&c.setClasses()}),b.on("results:append",function(a){c.append(a.data),b.isOpen()&&c.setClasses()}),b.on("query",function(a){c.showLoading(a)}),b.on("select",function(){b.isOpen()&&c.setClasses()}),b.on("unselect",function(){b.isOpen()&&c.setClasses()}),b.on("open",function(){c.$results.attr("aria-expanded","true"),c.$results.attr("aria-hidden","false"),c.setClasses(),c.ensureHighlightVisible()}),b.on("close",function(){c.$results.attr("aria-expanded","false"),c.$results.attr("aria-hidden","true"),c.$results.removeAttr("aria-activedescendant")}),b.on("results:toggle",function(){var a=c.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),b.on("results:select",function(){var a=c.getHighlightedResults();if(0!==a.length){var b=a.data("data");"true"==a.attr("aria-selected")?c.trigger("close"):c.trigger("select",{data:b})}}),b.on("results:previous",function(){var a=c.getHighlightedResults(),b=c.$results.find("[aria-selected]"),d=b.index(a);if(0!==d){var e=d-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger("mouseenter");var g=c.$results.offset().top,h=f.offset().top,i=c.$results.scrollTop()+(h-g);0===e?c.$results.scrollTop(0):0>h-g&&c.$results.scrollTop(i)}}),b.on("results:next",function(){var a=c.getHighlightedResults(),b=c.$results.find("[aria-selected]"),d=b.index(a),e=d+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger("mouseenter");var g=c.$results.offset().top+c.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=c.$results.scrollTop()+h-g;0===e?c.$results.scrollTop(0):h>g&&c.$results.scrollTop(i)}}),b.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted")}),b.on("results:message",function(a){c.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=c.$results.scrollTop(),d=c.$results.get(0).scrollHeight-c.$results.scrollTop()+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&d<=c.$results.height();e?(c.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(c.$results.scrollTop(c.$results.get(0).scrollHeight-c.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(b){var d=a(this),e=d.data("data");return"true"===d.attr("aria-selected")?void(c.options.get("multiple")?c.trigger("unselect",{originalEvent:b,data:e}):c.trigger("close")):void c.trigger("select",{originalEvent:b,data:e})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(){var b=a(this).data("data");c.getHighlightedResults().removeClass("select2-results__option--highlighted"),c.trigger("results:focus",{data:b,element:a(this)})})},c.prototype.getHighlightedResults=function(){var a=this.$results.find(".select2-results__option--highlighted");return a},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[aria-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),2>=c?this.$results.scrollTop(0):(g>this.$results.outerHeight()||0>g)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){var a={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46};return a}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('<span class="select2-selection" role="combobox" aria-autocomplete="list" aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),b.attr("title",this.$element.attr("title")),b.attr("tabindex",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a){var b=this,d=(a.id+"-container",a.id+"-results");this.container=a,this.$selection.on("focus",function(a){b.trigger("focus",a)}),this.$selection.on("blur",function(a){b.trigger("blur",a)}),this.$selection.on("keydown",function(a){b.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){b.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){b.update(a.data)}),a.on("open",function(){b.$selection.attr("aria-expanded","true"),b.$selection.attr("aria-owns",d),b._attachCloseHandler(a)}),a.on("close",function(){b.$selection.attr("aria-expanded","false"),b.$selection.removeAttr("aria-activedescendant"),b.$selection.removeAttr("aria-owns"),b.$selection.focus(),b._detachCloseHandler(a)}),a.on("enable",function(){b.$selection.attr("tabindex",b._tabindex)}),a.on("disable",function(){b.$selection.attr("tabindex","-1")})},d.prototype._attachCloseHandler=function(b){a(document.body).on("mousedown.select2."+b.id,function(b){var c=a(b.target),d=c.closest(".select2"),e=a(".select2.select2-container--open");e.each(function(){var b=a(this);if(this!=d[0]){var c=b.data("element");c.select2("close")}})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){var c=b.find(".selection");c.append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c){function d(){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'),a},d.prototype.bind=function(a){var b=this;d.__super__.bind.apply(this,arguments);var c=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",c),this.$selection.attr("aria-labelledby",c),this.$selection.on("mousedown",function(a){1===a.which&&b.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(){}),this.$selection.on("blur",function(){}),a.on("selection:update",function(a){b.update(a.data)})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a){var b=this.options.get("templateSelection"),c=this.options.get("escapeMarkup");return c(b(a))},d.prototype.selectionContainer=function(){return a("<span></span>")},d.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.display(b),d=this.$selection.find(".select2-selection__rendered");d.empty().append(c),d.prop("title",b.title||b.text)},d}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('<ul class="select2-selection__rendered"></ul>'),a},d.prototype.bind=function(){var b=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){b.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(c){var d=a(this),e=d.parent(),f=e.data("data");b.trigger("unselect",{originalEvent:c,data:f})})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a){var b=this.options.get("templateSelection"),c=this.options.get("escapeMarkup");return c(b(a))},d.prototype.selectionContainer=function(){var b=a('<li class="select2-selection__choice"><span class="select2-selection__choice__remove" role="presentation">&times;</span></li>');return b},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d<a.length;d++){var e=a[d],f=this.display(e),g=this.selectionContainer();g.append(f),g.prop("title",e.title||e.text),g.data("data",e),b.push(g)}var h=this.$selection.find(".select2-selection__rendered");c.appendMany(h,b)}},d}),b.define("select2/selection/placeholder",["../utils"],function(){function a(a,b,c){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c)}return a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.createPlaceholder=function(a,b){var c=this.selectionContainer();return c.html(this.display(b)),c.addClass("select2-selection__placeholder").removeClass("select2-selection__choice"),c},a.prototype.update=function(a,b){var c=1==b.length&&b[0].id!=this.placeholder.id,d=b.length>1;if(d||c)return a.call(this,b);this.clear();var e=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(e)},a}),b.define("select2/selection/allowClear",["jquery","../keys"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var c=this.$selection.find(".select2-selection__clear");if(0!==c.length){b.stopPropagation();for(var d=c.data("data"),e=0;e<d.length;e++){var f={data:d[e]};if(this.trigger("unselect",f),f.prevented)return}this.$element.val(this.placeholder.id).trigger("change"),this.trigger("toggle")}}},c.prototype._handleKeyboardClear=function(a,c,d){d.isOpen()||(c.which==b.DELETE||c.which==b.BACKSPACE)&&this._handleClear(c)},c.prototype.update=function(b,c){if(b.call(this,c),!(this.$selection.find(".select2-selection__placeholder").length>0||0===c.length)){var d=a('<span class="select2-selection__clear">&times;</span>');d.data("data",c),this.$selection.find(".select2-selection__rendered").prepend(d)}},c}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('<li class="select2-search select2-search--inline"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" /></li>');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return d},d.prototype.bind=function(a,b,d){var e=this;a.call(this,b,d),b.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus()}),b.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val(""),e.$search.focus()}),b.on("enable",function(){e.$search.prop("disabled",!1)}),b.on("disable",function(){e.$search.prop("disabled",!0)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e.trigger("blur",a)}),this.$selection.on("keydown",".select2-search--inline",function(a){a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented();var b=a.which;if(b===c.BACKSPACE&&""===e.$search.val()){var d=e.$searchContainer.prev(".select2-selection__choice");if(d.length>0){var f=d.data("data");e.searchRemoveChoice(f),a.preventDefault()}}}),this.$selection.on("input",".select2-search--inline",function(){e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input",".select2-search--inline",function(a){e.handleSearch(a)})},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.trigger("open"),this.$search.val(b.text+" ")},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{var b=this.$search.val().length+1;a=.75*b+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){var a={"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"};return a}),b.define("select2/data/base",["../utils"],function(a){function b(){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),d+=null!=c.id?"-"+c.id.toString():"-"+a.generateChars(4)},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f<a.length;f++){var g=a[f].id;-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")});else{var d=a.id;this.$element.val(d),this.$element.trigger("change")}},d.prototype.unselect=function(a){var b=this;if(this.$element.prop("multiple"))return a.selected=!1,c(a.element).is("option")?(a.element.selected=!1,void this.$element.trigger("change")):void this.current(function(d){for(var e=[],f=0;f<d.length;f++){var g=d[f].id;g!==a.id&&-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")})},d.prototype.bind=function(a){var b=this;this.container=a,a.on("select",function(a){b.select(a.data)}),a.on("unselect",function(a){b.unselect(a.data)})},d.prototype.destroy=function(){this.$element.find("*").each(function(){c.removeData(this,"data")})},d.prototype.query=function(a,b){var d=[],e=this,f=this.$element.children();f.each(function(){var b=c(this);if(b.is("option")||b.is("optgroup")){var f=e.item(b),g=e.matches(a,f);null!==g&&d.push(g)}}),b({results:d})},d.prototype.addOptions=function(a){b.appendMany(this.$element,a)},d.prototype.option=function(a){var b;a.children?(b=document.createElement("optgroup"),b.label=a.text):(b=document.createElement("option"),void 0!==b.textContent?b.textContent=a.text:b.innerText=a.text),a.id&&(b.value=a.id),a.disabled&&(b.disabled=!0),a.selected&&(b.selected=!0),a.title&&(b.title=a.title);var d=c(b),e=this._normalizeItem(a);return e.element=b,c.data(b,"data",e),d},d.prototype.item=function(a){var b={}; +if(b=c.data(a[0],"data"),null!=b)return b;if(a.is("option"))b={id:a.val(),text:a.text(),disabled:a.prop("disabled"),selected:a.prop("selected"),title:a.prop("title")};else if(a.is("optgroup")){b={text:a.prop("label"),children:[],title:a.prop("title")};for(var d=a.children("option"),e=[],f=0;f<d.length;f++){var g=c(d[f]),h=this.item(g);e.push(h)}b.children=e}return b=this._normalizeItem(b),b.element=a[0],c.data(a[0],"data",b),b},d.prototype._normalizeItem=function(a){c.isPlainObject(a)||(a={id:a,text:a}),a=c.extend({},{text:""},a);var b={selected:!1,disabled:!1};return null!=a.id&&(a.id=a.id.toString()),null!=a.text&&(a.text=a.text.toString()),null==a._resultId&&a.id&&null!=this.container&&(a._resultId=this.generateResultId(this.container,a)),c.extend({},b,a)},d.prototype.matches=function(a,b){var c=this.options.get("matcher");return c(a,b)},d}),b.define("select2/data/array",["./select","../utils","jquery"],function(a,b,c){function d(a,b){var c=b.get("data")||[];d.__super__.constructor.call(this,a,b),this.addOptions(this.convertToOptions(c))}return b.Extend(d,a),d.prototype.select=function(a){var b=this.$element.find("option").filter(function(b,c){return c.value==a.id.toString()});0===b.length&&(b=this.option(a),this.addOptions(b)),d.__super__.select.call(this,a)},d.prototype.convertToOptions=function(a){function d(a){return function(){return c(this).val()==a.id}}for(var e=this,f=this.$element.find("option"),g=f.map(function(){return e.item(c(this)).id}).get(),h=[],i=0;i<a.length;i++){var j=this._normalizeItem(a[i]);if(c.inArray(j.id,g)>=0){var k=f.filter(d(j)),l=this.item(k),m=(c.extend(!0,{},l,j),this.option(l));k.replaceWith(m)}else{var n=this.option(j);if(j.children){var o=this.convertToOptions(j.children);b.appendMany(n,o)}h.push(n)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(b,c){this.ajaxOptions=this._applyDefaults(c.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),a.__super__.constructor.call(this,b,c)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return{q:a.term}},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url(a)),"function"==typeof f.data&&(f.data=f.data(a)),this.ajaxOptions.delay&&""!==a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");if(void 0!==f&&(this.createTag=f),b.call(this,c,d),a.isArray(e))for(var g=0;g<e.length;g++){var h=e[g],i=this._normalizeItem(h),j=this.option(i);this.$element.append(j)}}return b.prototype.query=function(a,b,c){function d(a,f){for(var g=a.results,h=0;h<g.length;h++){var i=g[h],j=null!=i.children&&!d({results:i.children},!0),k=i.text===b.term;if(k||j)return f?!1:(a.data=g,void c(a))}if(f)return!0;var l=e.createTag(b);if(null!=l){var m=e.option(l);m.attr("data-select2-tag",!0),e.addOptions([m]),e.insertTag(g,l)}a.results=g,c(a)}var e=this;return this._removeOldTags(),null==b.term||null!=b.page?void a.call(this,b,c):void a.call(this,b,d)},b.prototype.createTag=function(b,c){var d=a.trim(c.term);return""===d?null:{id:d,text:d}},b.prototype.insertTag=function(a,b,c){b.unshift(c)},b.prototype._removeOldTags=function(){var b=(this._lastTag,this.$element.find("option[data-select2-tag]"));b.each(function(){this.selected||a(this).remove()})},b}),b.define("select2/data/tokenizer",["jquery"],function(a){function b(a,b,c){var d=c.get("tokenizer");void 0!==d&&(this.tokenizer=d),a.call(this,b,c)}return b.prototype.bind=function(a,b,c){a.call(this,b,c),this.$search=b.dropdown.$search||b.selection.$search||c.find(".select2-search__field")},b.prototype.query=function(a,b,c){function d(a){e.select(a)}var e=this;b.term=b.term||"";var f=this.tokenizer(b,this.options,d);f.term!==b.term&&(this.$search.length&&(this.$search.val(f.term),this.$search.focus()),b.term=f.term),a.call(this,b,c)},b.prototype.tokenizer=function(b,c,d,e){for(var f=d.get("tokenSeparators")||[],g=c.term,h=0,i=this.createTag||function(a){return{id:a.term,text:a.term}};h<g.length;){var j=g[h];if(-1!==a.inArray(j,f)){var k=g.substr(0,h),l=a.extend({},c,{term:k}),m=i(l);e(m),g=g.substr(h+1)||"",h=0}else h++}return{term:g}},b}),b.define("select2/data/minimumInputLength",[],function(){function a(a,b,c){this.minimumInputLength=c.get("minimumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",b.term.length<this.minimumInputLength?void this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumInputLength",[],function(){function a(a,b,c){this.maximumInputLength=c.get("maximumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",this.maximumInputLength>0&&b.term.length>this.maximumInputLength?void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;return d.maximumSelectionLength>0&&f>=d.maximumSelectionLength?void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}}):void a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<span class="select2-dropdown"><span class="select2-results"></span></span>');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.position=function(){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a){function b(){}return b.prototype.render=function(b){var c=b.call(this),d=a('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" /></span>');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val("")}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){var b=e.showSearch(a);b?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},b.prototype.handleSearch=function(){if(!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},b.prototype.showSearch=function(){return!0},b}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){var c=e.$results.offset().top+e.$results.outerHeight(!1),d=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1);c+50>=d&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('<li class="option load-more" role="treeitem"></li>'),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(a,b,c){this.$dropdownParent=c.get("dropdownParent")||document.body,a.call(this,b,c)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a("<span></span>"),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c){var d=this,e="scroll.select2."+c.id,f="resize.select2."+c.id,g="orientationchange.select2."+c.id,h=this.$container.parents().filter(b.hasScroll);h.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),h.on(e,function(){var b=a(this).data("select2-scroll-position");a(this).scrollTop(b.y)}),a(window).on(e+" "+f+" "+g,function(){d._positionDropdown(),d._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c){var d="scroll.select2."+c.id,e="resize.select2."+c.id,f="orientationchange.select2."+c.id,g=this.$container.parents().filter(b.hasScroll);g.off(d),a(window).off(d+" "+e+" "+f)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=(this.$container.position(),this.$container.offset());f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.top<f.top-h.height,k=i.bottom>f.bottom+h.height,l={left:f.left,top:g.bottom};c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){this.$dropdownContainer.width();var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d<b.length;d++){var e=b[d];e.children?c+=a(e.children):c++}return c}function b(a,b,c,d){this.minimumResultsForSearch=c.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),a.call(this,b,c,d)}return b.prototype.showSearch=function(b,c){return a(c.data.results)<this.minimumResultsForSearch?!1:b.call(this,c)},b}),b.define("select2/dropdown/selectOnClose",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("close",function(){d._handleSelectOnClose()})},a.prototype._handleSelectOnClose=function(){var a=this.getHighlightedResults();a.length<1||this.trigger("select",{data:a.data("data")})},a}),b.define("select2/dropdown/closeOnSelect",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("select",function(a){d._selectTriggered(a)}),b.on("unselect",function(a){d._selectTriggered(a)})},a.prototype._selectTriggered=function(a,b){var c=b.originalEvent;c&&c.ctrlKey||this.trigger("close")},a}),b.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(a){var b=a.input.length-a.maximum,c="Please delete "+b+" character";return 1!=b&&(c+="s"),c},inputTooShort:function(a){var b=a.minimum-a.input.length,c="Please enter "+b+" or more characters";return c},loadingMore:function(){return"Loading more results…"},maximumSelected:function(a){var b="You can only select "+a.maximum+" item";return 1!=a.maximum&&(b+="s"),b},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),b.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C){function D(){this.reset()}D.prototype.apply=function(l){if(l=a.extend({},this.defaults,l),null==l.dataAdapter){if(l.dataAdapter=null!=l.ajax?o:null!=l.data?n:m,l.minimumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),(null!=l.tokenSeparators||null!=l.tokenizer)&&(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.selectionAdapter=l.multiple?e:d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L<K.length;L++){var M=K[L],N={};try{N=k.loadPath(M)}catch(O){try{M=this.defaults.amdLanguageBase+M,N=k.loadPath(M)}catch(P){l.debug&&window.console&&console.warn&&console.warn('Select2: The language file for "'+M+'" could not be automatically loaded. A fallback will be used instead.');continue}}J.extend(N)}l.translations=J}else{var Q=k.loadPath(this.defaults.amdLanguageBase+"en"),R=new k(l.language);R.extend(Q),l.translations=R}return l},D.prototype.reset=function(){function b(a){function b(a){return l[a]||a}return a.replace(/[^\u0000-\u007E]/g,b)}function c(d,e){if(""===a.trim(d.term))return e;if(e.children&&e.children.length>0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){var h=e.children[g],i=c(d,h);null==i&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var j=b(e.text).toUpperCase(),k=b(d.term).toUpperCase();return j.indexOf(k)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)};var E=new D;return E}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(this.options.dir=a.prop("dir")?a.prop("dir"):a.closest("[dir]").prop("dir")?a.closest("[dir]").prop("dir"):"ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return 0>=e?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;i>h;h+=1){var j=g[h].replace(/\s/g,""),k=j.match(c);if(null!==k&&k.length>=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this._sync=c.bind(this._syncAttributes,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._sync);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._sync)}),this._observer.observe(this.$element[0],{attributes:!0,subtree:!1})):this.$element[0].addEventListener&&this.$element[0].addEventListener("DOMAttrModified",b._sync,!1)},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("focus",function(){a.$container.addClass("select2-container--focus")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open"),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ENTER?(a.trigger("results:select"),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle"),b.preventDefault()):c===d.UP?(a.trigger("results:previous"),b.preventDefault()):c===d.DOWN?(a.trigger("results:next"),b.preventDefault()):(c===d.ESC||c===d.TAB)&&(a.close(),b.preventDefault()):(c===d.ENTER||c===d.SPACE||(c===d.DOWN||c===d.UP)&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable")):this.trigger("enable")},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||(this.trigger("query",{}),this.trigger("open"))},e.prototype.close=function(){this.isOpen()&&this.trigger("close")},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),(null==a||0===a.length)&&(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._sync),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&this.$element[0].removeEventListener("DOMAttrModified",this._sync,!1),this._sync=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},e.prototype.render=function(){var b=a('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("select2/compat/utils",["jquery"],function(a){function b(b,c,d){var e,f,g=[];e=a.trim(b.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each(function(){0===this.indexOf("select2-")&&g.push(this)})),e=a.trim(c.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each(function(){0!==this.indexOf("select2-")&&(f=d(this),null!=f&&g.push(f))})),b.attr("class",g.join(" "))}return{syncCssClasses:b}}),b.define("select2/compat/containerCss",["jquery","./utils"],function(a,b){function c(){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get("containerCssClass")||"";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get("adaptContainerCssClass");if(g=g||c,-1!==f.indexOf(":all:")){f=f.replace(":all","");var h=g;g=function(a){var b=h(a);return null!=b?b+" "+a:a}}var i=this.options.get("containerCss")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define("select2/compat/dropdownCss",["jquery","./utils"],function(a,b){function c(){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get("dropdownCssClass")||"";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get("adaptDropdownCssClass");if(g=g||c,-1!==f.indexOf(":all:")){f=f.replace(":all","");var h=g;g=function(a){var b=h(a);return null!=b?b+" "+a:a}}var i=this.options.get("dropdownCss")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define("select2/compat/initSelection",["jquery"],function(a){function b(a,b,c){c.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `initSelection` option has been deprecated in favor of a custom data adapter that overrides the `current` method. This method is now called multiple times instead of a single time when the instance is initialized. Support will be removed for the `initSelection` option in future versions of Select2"),this.initSelection=c.get("initSelection"),this._isInitialized=!1,a.call(this,b,c)}return b.prototype.current=function(b,c){var d=this;return this._isInitialized?void b.call(this,c):void this.initSelection.call(null,this.$element,function(b){d._isInitialized=!0,a.isArray(b)||(b=[b]),c(b)})},b}),b.define("select2/compat/inputData",["jquery"],function(a){function b(a,b,c){this._currentData=[],this._valueSeparator=c.get("valueSeparator")||",","hidden"===b.prop("type")&&c.get("debug")&&console&&console.warn&&console.warn("Select2: Using a hidden input with Select2 is no longer supported and may stop working in the future. It is recommended to use a `<select>` element instead."),a.call(this,b,c)}return b.prototype.current=function(b,c){function d(b,c){var e=[];return b.selected||-1!==a.inArray(b.id,c)?(b.selected=!0,e.push(b)):b.selected=!1,b.children&&e.push.apply(e,d(b.children,c)),e}for(var e=[],f=0;f<this._currentData.length;f++){var g=this._currentData[f];e.push.apply(e,d(g,this.$element.val().split(this._valueSeparator)))}c(e)},b.prototype.select=function(b,c){if(this.options.get("multiple")){var d=this.$element.val();d+=this._valueSeparator+c.id,this.$element.val(d),this.$element.trigger("change")}else this.current(function(b){a.map(b,function(a){a.selected=!1})}),this.$element.val(c.id),this.$element.trigger("change")},b.prototype.unselect=function(a,b){var c=this;b.selected=!1,this.current(function(a){for(var d=[],e=0;e<a.length;e++){var f=a[e]; +b.id!=f.id&&d.push(f.id)}c.$element.val(d.join(c._valueSeparator)),c.$element.trigger("change")})},b.prototype.query=function(a,b,c){for(var d=[],e=0;e<this._currentData.length;e++){var f=this._currentData[e],g=this.matches(b,f);null!==g&&d.push(g)}c({results:d})},b.prototype.addOptions=function(b,c){var d=a.map(c,function(b){return a.data(b[0],"data")});this._currentData.push.apply(this._currentData,d)},b}),b.define("select2/compat/matcher",["jquery"],function(a){function b(b){function c(c,d){var e=a.extend(!0,{},d);if(null==c.term||""===a.trim(c.term))return e;if(d.children){for(var f=d.children.length-1;f>=0;f--){var g=d.children[f],h=b(c.term,g.text,g);h||e.children.splice(f,1)}if(e.children.length>0)return e}return b(c.term,d.text,d)?e:null}return c}return b}),b.define("select2/compat/query",[],function(){function a(a,b,c){c.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `query` option has been deprecated in favor of a custom data adapter that overrides the `query` method. Support will be removed for the `query` option in future versions of Select2."),a.call(this,b,c)}return a.prototype.query=function(a,b,c){b.callback=c;var d=this.options.get("query");d.call(null,b)},a}),b.define("select2/dropdown/attachContainer",[],function(){function a(a,b,c){a.call(this,b,c)}return a.prototype.position=function(a,b,c){var d=c.find(".dropdown-wrapper");d.append(b),b.addClass("select2-dropdown--below"),c.addClass("select2-container--below")},a}),b.define("select2/dropdown/stopPropagation",[],function(){function a(){}return a.prototype.bind=function(a,b,c){a.call(this,b,c);var d=["blur","change","click","dblclick","focus","focusin","focusout","input","keydown","keyup","keypress","mousedown","mouseenter","mouseleave","mousemove","mouseover","mouseup","search","touchend","touchstart"];this.$dropdown.on(d.join(" "),function(a){a.stopPropagation()})},a}),b.define("select2/selection/stopPropagation",[],function(){function a(){}return a.prototype.bind=function(a,b,c){a.call(this,b,c);var d=["blur","change","click","dblclick","focus","focusin","focusout","input","keydown","keyup","keypress","mousedown","mouseenter","mouseleave","mousemove","mouseover","mouseup","search","touchend","touchstart"];this.$selection.on(d.join(" "),function(a){a.stopPropagation()})},a}),b.define("jquery.select2",["jquery","require","./select2/core","./select2/defaults"],function(a,b,c,d){if(b("jquery.mousewheel"),null==a.fn.select2){var e=["open","close","destroy"];a.fn.select2=function(b){if(b=b||{},"object"==typeof b)return this.each(function(){{var d=a.extend({},b,!0);new c(a(this),d)}}),this;if("string"==typeof b){var d=this.data("select2");null==d&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2.");var f=Array.prototype.slice.call(arguments,1),g=d[b](f);return a.inArray(b,e)>-1?this:g}throw new Error("Invalid arguments for Select2: "+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),function(c){"function"==typeof b.define&&b.define.amd?b.define("jquery.mousewheel",["jquery"],c):"object"==typeof exports?module.exports=c:c(a)}(function(a){function b(b){var g=b||window.event,h=i.call(arguments,1),j=0,l=0,m=0,n=0,o=0,p=0;if(b=a.event.fix(g),b.type="mousewheel","detail"in g&&(m=-1*g.detail),"wheelDelta"in g&&(m=g.wheelDelta),"wheelDeltaY"in g&&(m=g.wheelDeltaY),"wheelDeltaX"in g&&(l=-1*g.wheelDeltaX),"axis"in g&&g.axis===g.HORIZONTAL_AXIS&&(l=-1*m,m=0),j=0===m?l:m,"deltaY"in g&&(m=-1*g.deltaY,j=m),"deltaX"in g&&(l=g.deltaX,0===m&&(j=-1*l)),0!==m||0!==l){if(1===g.deltaMode){var q=a.data(this,"mousewheel-line-height");j*=q,m*=q,l*=q}else if(2===g.deltaMode){var r=a.data(this,"mousewheel-page-height");j*=r,m*=r,l*=r}if(n=Math.max(Math.abs(m),Math.abs(l)),(!f||f>n)&&(f=n,d(g,n)&&(f/=40)),d(g,n)&&(j/=40,l/=40,m/=40),j=Math[j>=1?"floor":"ceil"](j/f),l=Math[l>=1?"floor":"ceil"](l/f),m=Math[m>=1?"floor":"ceil"](m/f),k.settings.normalizeOffset&&this.getBoundingClientRect){var s=this.getBoundingClientRect();o=b.clientX-s.left,p=b.clientY-s.top}return b.deltaX=l,b.deltaY=m,b.deltaFactor=f,b.offsetX=o,b.offsetY=p,b.deltaMode=0,h.unshift(b,j,l,m),e&&clearTimeout(e),e=setTimeout(c,200),(a.event.dispatch||a.event.handle).apply(this,h)}}function c(){f=null}function d(a,b){return k.settings.adjustOldDeltas&&"mousewheel"===a.type&&b%120===0}var e,f,g=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],h="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],i=Array.prototype.slice;if(a.event.fixHooks)for(var j=g.length;j;)a.event.fixHooks[g[--j]]=a.event.mouseHooks;var k=a.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var c=h.length;c;)this.addEventListener(h[--c],b,!1);else this.onmousewheel=b;a.data(this,"mousewheel-line-height",k.getLineHeight(this)),a.data(this,"mousewheel-page-height",k.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var c=h.length;c;)this.removeEventListener(h[--c],b,!1);else this.onmousewheel=null;a.removeData(this,"mousewheel-line-height"),a.removeData(this,"mousewheel-page-height")},getLineHeight:function(b){var c=a(b),d=c["offsetParent"in a.fn?"offsetParent":"parent"]();return d.length||(d=a("body")),parseInt(d.css("fontSize"),10)||parseInt(c.css("fontSize"),10)||16},getPageHeight:function(b){return a(b).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};a.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,c}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/select2.js b/theme/bootstrap/plugins/select2/select2.js new file mode 100644 index 0000000..fbaca5e --- /dev/null +++ b/theme/bootstrap/plugins/select2/select2.js @@ -0,0 +1,5403 @@ +/*! + * Select2 4.0.0 + * https://select2.github.io + * + * Released under the MIT license + * https://github.com/select2/select2/blob/master/LICENSE.md + */ +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS + factory(require('jquery')); + } else { + // Browser globals + factory(jQuery); + } +}(function (jQuery) { + // This is needed so we can catch the AMD loader configuration and use it + // The inner file should be wrapped (by `banner.start.js`) in a function that + // returns the AMD loader references. + var S2 = +(function () { + // Restore the Select2 AMD loader so it can be used + // Needed mostly in the language files, where the loader is not inserted + if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) { + var S2 = jQuery.fn.select2.amd; + } +var S2;(function () { if (!S2 || !S2.requirejs) { +if (!S2) { S2 = {}; } else { require = S2; } +/** + * @license almond 0.2.9 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved. + * Available via the MIT or new BSD license. + * see: http://github.com/jrburke/almond for details + */ +//Going sloppy to avoid 'use strict' string cost, but strict practices should +//be followed. +/*jslint sloppy: true */ +/*global setTimeout: false */ + +var requirejs, require, define; +(function (undef) { + var main, req, makeMap, handlers, + defined = {}, + waiting = {}, + config = {}, + defining = {}, + hasOwn = Object.prototype.hasOwnProperty, + aps = [].slice, + jsSuffixRegExp = /\.js$/; + + function hasProp(obj, prop) { + return hasOwn.call(obj, prop); + } + + /** + * Given a relative module name, like ./something, normalize it to + * a real name that can be mapped to a path. + * @param {String} name the relative name + * @param {String} baseName a real name that the name arg is relative + * to. + * @returns {String} normalized name + */ + function normalize(name, baseName) { + var nameParts, nameSegment, mapValue, foundMap, lastIndex, + foundI, foundStarMap, starI, i, j, part, + baseParts = baseName && baseName.split("/"), + map = config.map, + starMap = (map && map['*']) || {}; + + //Adjust any relative paths. + if (name && name.charAt(0) === ".") { + //If have a base name, try to normalize against it, + //otherwise, assume it is a top-level require that will + //be relative to baseUrl in the end. + if (baseName) { + //Convert baseName to array, and lop off the last part, + //so that . matches that "directory" and not name of the baseName's + //module. For instance, baseName of "one/two/three", maps to + //"one/two/three.js", but we want the directory, "one/two" for + //this normalization. + baseParts = baseParts.slice(0, baseParts.length - 1); + name = name.split('/'); + lastIndex = name.length - 1; + + // Node .js allowance: + if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { + name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); + } + + name = baseParts.concat(name); + + //start trimDots + for (i = 0; i < name.length; i += 1) { + part = name[i]; + if (part === ".") { + name.splice(i, 1); + i -= 1; + } else if (part === "..") { + if (i === 1 && (name[2] === '..' || name[0] === '..')) { + //End of the line. Keep at least one non-dot + //path segment at the front so it can be mapped + //correctly to disk. Otherwise, there is likely + //no path mapping for a path starting with '..'. + //This can still fail, but catches the most reasonable + //uses of .. + break; + } else if (i > 0) { + name.splice(i - 1, 2); + i -= 2; + } + } + } + //end trimDots + + name = name.join("/"); + } else if (name.indexOf('./') === 0) { + // No baseName, so this is ID is resolved relative + // to baseUrl, pull off the leading dot. + name = name.substring(2); + } + } + + //Apply map config if available. + if ((baseParts || starMap) && map) { + nameParts = name.split('/'); + + for (i = nameParts.length; i > 0; i -= 1) { + nameSegment = nameParts.slice(0, i).join("/"); + + if (baseParts) { + //Find the longest baseName segment match in the config. + //So, do joins on the biggest to smallest lengths of baseParts. + for (j = baseParts.length; j > 0; j -= 1) { + mapValue = map[baseParts.slice(0, j).join('/')]; + + //baseName segment has config, find if it has one for + //this name. + if (mapValue) { + mapValue = mapValue[nameSegment]; + if (mapValue) { + //Match, update name to the new value. + foundMap = mapValue; + foundI = i; + break; + } + } + } + } + + if (foundMap) { + break; + } + + //Check for a star map match, but just hold on to it, + //if there is a shorter segment match later in a matching + //config, then favor over this star map. + if (!foundStarMap && starMap && starMap[nameSegment]) { + foundStarMap = starMap[nameSegment]; + starI = i; + } + } + + if (!foundMap && foundStarMap) { + foundMap = foundStarMap; + foundI = starI; + } + + if (foundMap) { + nameParts.splice(0, foundI, foundMap); + name = nameParts.join('/'); + } + } + + return name; + } + + function makeRequire(relName, forceSync) { + return function () { + //A version of a require function that passes a moduleName + //value for items that may need to + //look up paths relative to the moduleName + return req.apply(undef, aps.call(arguments, 0).concat([relName, forceSync])); + }; + } + + function makeNormalize(relName) { + return function (name) { + return normalize(name, relName); + }; + } + + function makeLoad(depName) { + return function (value) { + defined[depName] = value; + }; + } + + function callDep(name) { + if (hasProp(waiting, name)) { + var args = waiting[name]; + delete waiting[name]; + defining[name] = true; + main.apply(undef, args); + } + + if (!hasProp(defined, name) && !hasProp(defining, name)) { + throw new Error('No ' + name); + } + return defined[name]; + } + + //Turns a plugin!resource to [plugin, resource] + //with the plugin being undefined if the name + //did not have a plugin prefix. + function splitPrefix(name) { + var prefix, + index = name ? name.indexOf('!') : -1; + if (index > -1) { + prefix = name.substring(0, index); + name = name.substring(index + 1, name.length); + } + return [prefix, name]; + } + + /** + * Makes a name map, normalizing the name, and using a plugin + * for normalization if necessary. Grabs a ref to plugin + * too, as an optimization. + */ + makeMap = function (name, relName) { + var plugin, + parts = splitPrefix(name), + prefix = parts[0]; + + name = parts[1]; + + if (prefix) { + prefix = normalize(prefix, relName); + plugin = callDep(prefix); + } + + //Normalize according + if (prefix) { + if (plugin && plugin.normalize) { + name = plugin.normalize(name, makeNormalize(relName)); + } else { + name = normalize(name, relName); + } + } else { + name = normalize(name, relName); + parts = splitPrefix(name); + prefix = parts[0]; + name = parts[1]; + if (prefix) { + plugin = callDep(prefix); + } + } + + //Using ridiculous property names for space reasons + return { + f: prefix ? prefix + '!' + name : name, //fullName + n: name, + pr: prefix, + p: plugin + }; + }; + + function makeConfig(name) { + return function () { + return (config && config.config && config.config[name]) || {}; + }; + } + + handlers = { + require: function (name) { + return makeRequire(name); + }, + exports: function (name) { + var e = defined[name]; + if (typeof e !== 'undefined') { + return e; + } else { + return (defined[name] = {}); + } + }, + module: function (name) { + return { + id: name, + uri: '', + exports: defined[name], + config: makeConfig(name) + }; + } + }; + + main = function (name, deps, callback, relName) { + var cjsModule, depName, ret, map, i, + args = [], + callbackType = typeof callback, + usingExports; + + //Use name if no relName + relName = relName || name; + + //Call the callback to define the module, if necessary. + if (callbackType === 'undefined' || callbackType === 'function') { + //Pull out the defined dependencies and pass the ordered + //values to the callback. + //Default to [require, exports, module] if no deps + deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; + for (i = 0; i < deps.length; i += 1) { + map = makeMap(deps[i], relName); + depName = map.f; + + //Fast path CommonJS standard dependencies. + if (depName === "require") { + args[i] = handlers.require(name); + } else if (depName === "exports") { + //CommonJS module spec 1.1 + args[i] = handlers.exports(name); + usingExports = true; + } else if (depName === "module") { + //CommonJS module spec 1.1 + cjsModule = args[i] = handlers.module(name); + } else if (hasProp(defined, depName) || + hasProp(waiting, depName) || + hasProp(defining, depName)) { + args[i] = callDep(depName); + } else if (map.p) { + map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); + args[i] = defined[depName]; + } else { + throw new Error(name + ' missing ' + depName); + } + } + + ret = callback ? callback.apply(defined[name], args) : undefined; + + if (name) { + //If setting exports via "module" is in play, + //favor that over return value and exports. After that, + //favor a non-undefined return value over exports use. + if (cjsModule && cjsModule.exports !== undef && + cjsModule.exports !== defined[name]) { + defined[name] = cjsModule.exports; + } else if (ret !== undef || !usingExports) { + //Use the return value from the function. + defined[name] = ret; + } + } + } else if (name) { + //May just be an object definition for the module. Only + //worry about defining if have a module name. + defined[name] = callback; + } + }; + + requirejs = require = req = function (deps, callback, relName, forceSync, alt) { + if (typeof deps === "string") { + if (handlers[deps]) { + //callback in this case is really relName + return handlers[deps](callback); + } + //Just return the module wanted. In this scenario, the + //deps arg is the module name, and second arg (if passed) + //is just the relName. + //Normalize module name, if it contains . or .. + return callDep(makeMap(deps, callback).f); + } else if (!deps.splice) { + //deps is a config object, not an array. + config = deps; + if (config.deps) { + req(config.deps, config.callback); + } + if (!callback) { + return; + } + + if (callback.splice) { + //callback is an array, which means it is a dependency list. + //Adjust args if there are dependencies + deps = callback; + callback = relName; + relName = null; + } else { + deps = undef; + } + } + + //Support require(['a']) + callback = callback || function () {}; + + //If relName is a function, it is an errback handler, + //so remove it. + if (typeof relName === 'function') { + relName = forceSync; + forceSync = alt; + } + + //Simulate async callback; + if (forceSync) { + main(undef, deps, callback, relName); + } else { + //Using a non-zero value because of concern for what old browsers + //do, and latest browsers "upgrade" to 4 if lower value is used: + //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout: + //If want a value immediately, use require('id') instead -- something + //that works in almond on the global level, but not guaranteed and + //unlikely to work in other AMD implementations. + setTimeout(function () { + main(undef, deps, callback, relName); + }, 4); + } + + return req; + }; + + /** + * Just drops the config on the floor, but returns req in case + * the config return value is used. + */ + req.config = function (cfg) { + return req(cfg); + }; + + /** + * Expose module registry for debugging and tooling + */ + requirejs._defined = defined; + + define = function (name, deps, callback) { + + //This module may not have dependencies + if (!deps.splice) { + //deps is not an array, so probably means + //an object literal or factory function for + //the value. Adjust args. + callback = deps; + deps = []; + } + + if (!hasProp(defined, name) && !hasProp(waiting, name)) { + waiting[name] = [name, deps, callback]; + } + }; + + define.amd = { + jQuery: true + }; +}()); + +S2.requirejs = requirejs;S2.require = require;S2.define = define; +} +}()); +S2.define("almond", function(){}); + +/* global jQuery:false, $:false */ +S2.define('jquery',[],function () { + var _$ = jQuery || $; + + if (_$ == null && console && console.error) { + console.error( + 'Select2: An instance of jQuery or a jQuery-compatible library was not ' + + 'found. Make sure that you are including jQuery before Select2 on your ' + + 'web page.' + ); + } + + return _$; +}); + +S2.define('select2/utils',[ + 'jquery' +], function ($) { + var Utils = {}; + + Utils.Extend = function (ChildClass, SuperClass) { + var __hasProp = {}.hasOwnProperty; + + function BaseConstructor () { + this.constructor = ChildClass; + } + + for (var key in SuperClass) { + if (__hasProp.call(SuperClass, key)) { + ChildClass[key] = SuperClass[key]; + } + } + + BaseConstructor.prototype = SuperClass.prototype; + ChildClass.prototype = new BaseConstructor(); + ChildClass.__super__ = SuperClass.prototype; + + return ChildClass; + }; + + function getMethods (theClass) { + var proto = theClass.prototype; + + var methods = []; + + for (var methodName in proto) { + var m = proto[methodName]; + + if (typeof m !== 'function') { + continue; + } + + if (methodName === 'constructor') { + continue; + } + + methods.push(methodName); + } + + return methods; + } + + Utils.Decorate = function (SuperClass, DecoratorClass) { + var decoratedMethods = getMethods(DecoratorClass); + var superMethods = getMethods(SuperClass); + + function DecoratedClass () { + var unshift = Array.prototype.unshift; + + var argCount = DecoratorClass.prototype.constructor.length; + + var calledConstructor = SuperClass.prototype.constructor; + + if (argCount > 0) { + unshift.call(arguments, SuperClass.prototype.constructor); + + calledConstructor = DecoratorClass.prototype.constructor; + } + + calledConstructor.apply(this, arguments); + } + + DecoratorClass.displayName = SuperClass.displayName; + + function ctr () { + this.constructor = DecoratedClass; + } + + DecoratedClass.prototype = new ctr(); + + for (var m = 0; m < superMethods.length; m++) { + var superMethod = superMethods[m]; + + DecoratedClass.prototype[superMethod] = + SuperClass.prototype[superMethod]; + } + + var calledMethod = function (methodName) { + // Stub out the original method if it's not decorating an actual method + var originalMethod = function () {}; + + if (methodName in DecoratedClass.prototype) { + originalMethod = DecoratedClass.prototype[methodName]; + } + + var decoratedMethod = DecoratorClass.prototype[methodName]; + + return function () { + var unshift = Array.prototype.unshift; + + unshift.call(arguments, originalMethod); + + return decoratedMethod.apply(this, arguments); + }; + }; + + for (var d = 0; d < decoratedMethods.length; d++) { + var decoratedMethod = decoratedMethods[d]; + + DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod); + } + + return DecoratedClass; + }; + + var Observable = function () { + this.listeners = {}; + }; + + Observable.prototype.on = function (event, callback) { + this.listeners = this.listeners || {}; + + if (event in this.listeners) { + this.listeners[event].push(callback); + } else { + this.listeners[event] = [callback]; + } + }; + + Observable.prototype.trigger = function (event) { + var slice = Array.prototype.slice; + + this.listeners = this.listeners || {}; + + if (event in this.listeners) { + this.invoke(this.listeners[event], slice.call(arguments, 1)); + } + + if ('*' in this.listeners) { + this.invoke(this.listeners['*'], arguments); + } + }; + + Observable.prototype.invoke = function (listeners, params) { + for (var i = 0, len = listeners.length; i < len; i++) { + listeners[i].apply(this, params); + } + }; + + Utils.Observable = Observable; + + Utils.generateChars = function (length) { + var chars = ''; + + for (var i = 0; i < length; i++) { + var randomChar = Math.floor(Math.random() * 36); + chars += randomChar.toString(36); + } + + return chars; + }; + + Utils.bind = function (func, context) { + return function () { + func.apply(context, arguments); + }; + }; + + Utils._convertData = function (data) { + for (var originalKey in data) { + var keys = originalKey.split('-'); + + var dataLevel = data; + + if (keys.length === 1) { + continue; + } + + for (var k = 0; k < keys.length; k++) { + var key = keys[k]; + + // Lowercase the first letter + // By default, dash-separated becomes camelCase + key = key.substring(0, 1).toLowerCase() + key.substring(1); + + if (!(key in dataLevel)) { + dataLevel[key] = {}; + } + + if (k == keys.length - 1) { + dataLevel[key] = data[originalKey]; + } + + dataLevel = dataLevel[key]; + } + + delete data[originalKey]; + } + + return data; + }; + + Utils.hasScroll = function (index, el) { + // Adapted from the function created by @ShadowScripter + // and adapted by @BillBarry on the Stack Exchange Code Review website. + // The original code can be found at + // http://codereview.stackexchange.com/q/13338 + // and was designed to be used with the Sizzle selector engine. + + var $el = $(el); + var overflowX = el.style.overflowX; + var overflowY = el.style.overflowY; + + //Check both x and y declarations + if (overflowX === overflowY && + (overflowY === 'hidden' || overflowY === 'visible')) { + return false; + } + + if (overflowX === 'scroll' || overflowY === 'scroll') { + return true; + } + + return ($el.innerHeight() < el.scrollHeight || + $el.innerWidth() < el.scrollWidth); + }; + + Utils.escapeMarkup = function (markup) { + var replaceMap = { + '\\': '&#92;', + '&': '&amp;', + '<': '&lt;', + '>': '&gt;', + '"': '&quot;', + '\'': '&#39;', + '/': '&#47;' + }; + + // Do not try to escape the markup if it's not a string + if (typeof markup !== 'string') { + return markup; + } + + return String(markup).replace(/[&<>"'\/\\]/g, function (match) { + return replaceMap[match]; + }); + }; + + // Append an array of jQuery nodes to a given element. + Utils.appendMany = function ($element, $nodes) { + // jQuery 1.7.x does not support $.fn.append() with an array + // Fall back to a jQuery object collection using $.fn.add() + if ($.fn.jquery.substr(0, 3) === '1.7') { + var $jqNodes = $(); + + $.map($nodes, function (node) { + $jqNodes = $jqNodes.add(node); + }); + + $nodes = $jqNodes; + } + + $element.append($nodes); + }; + + return Utils; +}); + +S2.define('select2/results',[ + 'jquery', + './utils' +], function ($, Utils) { + function Results ($element, options, dataAdapter) { + this.$element = $element; + this.data = dataAdapter; + this.options = options; + + Results.__super__.constructor.call(this); + } + + Utils.Extend(Results, Utils.Observable); + + Results.prototype.render = function () { + var $results = $( + '<ul class="select2-results__options" role="tree"></ul>' + ); + + if (this.options.get('multiple')) { + $results.attr('aria-multiselectable', 'true'); + } + + this.$results = $results; + + return $results; + }; + + Results.prototype.clear = function () { + this.$results.empty(); + }; + + Results.prototype.displayMessage = function (params) { + var escapeMarkup = this.options.get('escapeMarkup'); + + this.clear(); + this.hideLoading(); + + var $message = $( + '<li role="treeitem" class="select2-results__option"></li>' + ); + + var message = this.options.get('translations').get(params.message); + + $message.append( + escapeMarkup( + message(params.args) + ) + ); + + this.$results.append($message); + }; + + Results.prototype.append = function (data) { + this.hideLoading(); + + var $options = []; + + if (data.results == null || data.results.length === 0) { + if (this.$results.children().length === 0) { + this.trigger('results:message', { + message: 'noResults' + }); + } + + return; + } + + data.results = this.sort(data.results); + + for (var d = 0; d < data.results.length; d++) { + var item = data.results[d]; + + var $option = this.option(item); + + $options.push($option); + } + + this.$results.append($options); + }; + + Results.prototype.position = function ($results, $dropdown) { + var $resultsContainer = $dropdown.find('.select2-results'); + $resultsContainer.append($results); + }; + + Results.prototype.sort = function (data) { + var sorter = this.options.get('sorter'); + + return sorter(data); + }; + + Results.prototype.setClasses = function () { + var self = this; + + this.data.current(function (selected) { + var selectedIds = $.map(selected, function (s) { + return s.id.toString(); + }); + + var $options = self.$results + .find('.select2-results__option[aria-selected]'); + + $options.each(function () { + var $option = $(this); + + var item = $.data(this, 'data'); + + // id needs to be converted to a string when comparing + var id = '' + item.id; + + if ((item.element != null && item.element.selected) || + (item.element == null && $.inArray(id, selectedIds) > -1)) { + $option.attr('aria-selected', 'true'); + } else { + $option.attr('aria-selected', 'false'); + } + }); + + var $selected = $options.filter('[aria-selected=true]'); + + // Check if there are any selected options + if ($selected.length > 0) { + // If there are selected options, highlight the first + $selected.first().trigger('mouseenter'); + } else { + // If there are no selected options, highlight the first option + // in the dropdown + $options.first().trigger('mouseenter'); + } + }); + }; + + Results.prototype.showLoading = function (params) { + this.hideLoading(); + + var loadingMore = this.options.get('translations').get('searching'); + + var loading = { + disabled: true, + loading: true, + text: loadingMore(params) + }; + var $loading = this.option(loading); + $loading.className += ' loading-results'; + + this.$results.prepend($loading); + }; + + Results.prototype.hideLoading = function () { + this.$results.find('.loading-results').remove(); + }; + + Results.prototype.option = function (data) { + var option = document.createElement('li'); + option.className = 'select2-results__option'; + + var attrs = { + 'role': 'treeitem', + 'aria-selected': 'false' + }; + + if (data.disabled) { + delete attrs['aria-selected']; + attrs['aria-disabled'] = 'true'; + } + + if (data.id == null) { + delete attrs['aria-selected']; + } + + if (data._resultId != null) { + option.id = data._resultId; + } + + if (data.title) { + option.title = data.title; + } + + if (data.children) { + attrs.role = 'group'; + attrs['aria-label'] = data.text; + delete attrs['aria-selected']; + } + + for (var attr in attrs) { + var val = attrs[attr]; + + option.setAttribute(attr, val); + } + + if (data.children) { + var $option = $(option); + + var label = document.createElement('strong'); + label.className = 'select2-results__group'; + + var $label = $(label); + this.template(data, label); + + var $children = []; + + for (var c = 0; c < data.children.length; c++) { + var child = data.children[c]; + + var $child = this.option(child); + + $children.push($child); + } + + var $childrenContainer = $('<ul></ul>', { + 'class': 'select2-results__options select2-results__options--nested' + }); + + $childrenContainer.append($children); + + $option.append(label); + $option.append($childrenContainer); + } else { + this.template(data, option); + } + + $.data(option, 'data', data); + + return option; + }; + + Results.prototype.bind = function (container, $container) { + var self = this; + + var id = container.id + '-results'; + + this.$results.attr('id', id); + + container.on('results:all', function (params) { + self.clear(); + self.append(params.data); + + if (container.isOpen()) { + self.setClasses(); + } + }); + + container.on('results:append', function (params) { + self.append(params.data); + + if (container.isOpen()) { + self.setClasses(); + } + }); + + container.on('query', function (params) { + self.showLoading(params); + }); + + container.on('select', function () { + if (!container.isOpen()) { + return; + } + + self.setClasses(); + }); + + container.on('unselect', function () { + if (!container.isOpen()) { + return; + } + + self.setClasses(); + }); + + container.on('open', function () { + // When the dropdown is open, aria-expended="true" + self.$results.attr('aria-expanded', 'true'); + self.$results.attr('aria-hidden', 'false'); + + self.setClasses(); + self.ensureHighlightVisible(); + }); + + container.on('close', function () { + // When the dropdown is closed, aria-expended="false" + self.$results.attr('aria-expanded', 'false'); + self.$results.attr('aria-hidden', 'true'); + self.$results.removeAttr('aria-activedescendant'); + }); + + container.on('results:toggle', function () { + var $highlighted = self.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + $highlighted.trigger('mouseup'); + }); + + container.on('results:select', function () { + var $highlighted = self.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + var data = $highlighted.data('data'); + + if ($highlighted.attr('aria-selected') == 'true') { + self.trigger('close'); + } else { + self.trigger('select', { + data: data + }); + } + }); + + container.on('results:previous', function () { + var $highlighted = self.getHighlightedResults(); + + var $options = self.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + // If we are already at te top, don't move further + if (currentIndex === 0) { + return; + } + + var nextIndex = currentIndex - 1; + + // If none are highlighted, highlight the first + if ($highlighted.length === 0) { + nextIndex = 0; + } + + var $next = $options.eq(nextIndex); + + $next.trigger('mouseenter'); + + var currentOffset = self.$results.offset().top; + var nextTop = $next.offset().top; + var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset); + + if (nextIndex === 0) { + self.$results.scrollTop(0); + } else if (nextTop - currentOffset < 0) { + self.$results.scrollTop(nextOffset); + } + }); + + container.on('results:next', function () { + var $highlighted = self.getHighlightedResults(); + + var $options = self.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + var nextIndex = currentIndex + 1; + + // If we are at the last option, stay there + if (nextIndex >= $options.length) { + return; + } + + var $next = $options.eq(nextIndex); + + $next.trigger('mouseenter'); + + var currentOffset = self.$results.offset().top + + self.$results.outerHeight(false); + var nextBottom = $next.offset().top + $next.outerHeight(false); + var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset; + + if (nextIndex === 0) { + self.$results.scrollTop(0); + } else if (nextBottom > currentOffset) { + self.$results.scrollTop(nextOffset); + } + }); + + container.on('results:focus', function (params) { + params.element.addClass('select2-results__option--highlighted'); + }); + + container.on('results:message', function (params) { + self.displayMessage(params); + }); + + if ($.fn.mousewheel) { + this.$results.on('mousewheel', function (e) { + var top = self.$results.scrollTop(); + + var bottom = ( + self.$results.get(0).scrollHeight - + self.$results.scrollTop() + + e.deltaY + ); + + var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0; + var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height(); + + if (isAtTop) { + self.$results.scrollTop(0); + + e.preventDefault(); + e.stopPropagation(); + } else if (isAtBottom) { + self.$results.scrollTop( + self.$results.get(0).scrollHeight - self.$results.height() + ); + + e.preventDefault(); + e.stopPropagation(); + } + }); + } + + this.$results.on('mouseup', '.select2-results__option[aria-selected]', + function (evt) { + var $this = $(this); + + var data = $this.data('data'); + + if ($this.attr('aria-selected') === 'true') { + if (self.options.get('multiple')) { + self.trigger('unselect', { + originalEvent: evt, + data: data + }); + } else { + self.trigger('close'); + } + + return; + } + + self.trigger('select', { + originalEvent: evt, + data: data + }); + }); + + this.$results.on('mouseenter', '.select2-results__option[aria-selected]', + function (evt) { + var data = $(this).data('data'); + + self.getHighlightedResults() + .removeClass('select2-results__option--highlighted'); + + self.trigger('results:focus', { + data: data, + element: $(this) + }); + }); + }; + + Results.prototype.getHighlightedResults = function () { + var $highlighted = this.$results + .find('.select2-results__option--highlighted'); + + return $highlighted; + }; + + Results.prototype.destroy = function () { + this.$results.remove(); + }; + + Results.prototype.ensureHighlightVisible = function () { + var $highlighted = this.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + var $options = this.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + var currentOffset = this.$results.offset().top; + var nextTop = $highlighted.offset().top; + var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset); + + var offsetDelta = nextTop - currentOffset; + nextOffset -= $highlighted.outerHeight(false) * 2; + + if (currentIndex <= 2) { + this.$results.scrollTop(0); + } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) { + this.$results.scrollTop(nextOffset); + } + }; + + Results.prototype.template = function (result, container) { + var template = this.options.get('templateResult'); + var escapeMarkup = this.options.get('escapeMarkup'); + + var content = template(result); + + if (content == null) { + container.style.display = 'none'; + } else if (typeof content === 'string') { + container.innerHTML = escapeMarkup(content); + } else { + $(container).append(content); + } + }; + + return Results; +}); + +S2.define('select2/keys',[ + +], function () { + var KEYS = { + BACKSPACE: 8, + TAB: 9, + ENTER: 13, + SHIFT: 16, + CTRL: 17, + ALT: 18, + ESC: 27, + SPACE: 32, + PAGE_UP: 33, + PAGE_DOWN: 34, + END: 35, + HOME: 36, + LEFT: 37, + UP: 38, + RIGHT: 39, + DOWN: 40, + DELETE: 46 + }; + + return KEYS; +}); + +S2.define('select2/selection/base',[ + 'jquery', + '../utils', + '../keys' +], function ($, Utils, KEYS) { + function BaseSelection ($element, options) { + this.$element = $element; + this.options = options; + + BaseSelection.__super__.constructor.call(this); + } + + Utils.Extend(BaseSelection, Utils.Observable); + + BaseSelection.prototype.render = function () { + var $selection = $( + '<span class="select2-selection" role="combobox" ' + + 'aria-autocomplete="list" aria-haspopup="true" aria-expanded="false">' + + '</span>' + ); + + this._tabindex = 0; + + if (this.$element.data('old-tabindex') != null) { + this._tabindex = this.$element.data('old-tabindex'); + } else if (this.$element.attr('tabindex') != null) { + this._tabindex = this.$element.attr('tabindex'); + } + + $selection.attr('title', this.$element.attr('title')); + $selection.attr('tabindex', this._tabindex); + + this.$selection = $selection; + + return $selection; + }; + + BaseSelection.prototype.bind = function (container, $container) { + var self = this; + + var id = container.id + '-container'; + var resultsId = container.id + '-results'; + + this.container = container; + + this.$selection.on('focus', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('blur', function (evt) { + self.trigger('blur', evt); + }); + + this.$selection.on('keydown', function (evt) { + self.trigger('keypress', evt); + + if (evt.which === KEYS.SPACE) { + evt.preventDefault(); + } + }); + + container.on('results:focus', function (params) { + self.$selection.attr('aria-activedescendant', params.data._resultId); + }); + + container.on('selection:update', function (params) { + self.update(params.data); + }); + + container.on('open', function () { + // When the dropdown is open, aria-expanded="true" + self.$selection.attr('aria-expanded', 'true'); + self.$selection.attr('aria-owns', resultsId); + + self._attachCloseHandler(container); + }); + + container.on('close', function () { + // When the dropdown is closed, aria-expanded="false" + self.$selection.attr('aria-expanded', 'false'); + self.$selection.removeAttr('aria-activedescendant'); + self.$selection.removeAttr('aria-owns'); + + self.$selection.focus(); + + self._detachCloseHandler(container); + }); + + container.on('enable', function () { + self.$selection.attr('tabindex', self._tabindex); + }); + + container.on('disable', function () { + self.$selection.attr('tabindex', '-1'); + }); + }; + + BaseSelection.prototype._attachCloseHandler = function (container) { + var self = this; + + $(document.body).on('mousedown.select2.' + container.id, function (e) { + var $target = $(e.target); + + var $select = $target.closest('.select2'); + + var $all = $('.select2.select2-container--open'); + + $all.each(function () { + var $this = $(this); + + if (this == $select[0]) { + return; + } + + var $element = $this.data('element'); + + $element.select2('close'); + }); + }); + }; + + BaseSelection.prototype._detachCloseHandler = function (container) { + $(document.body).off('mousedown.select2.' + container.id); + }; + + BaseSelection.prototype.position = function ($selection, $container) { + var $selectionContainer = $container.find('.selection'); + $selectionContainer.append($selection); + }; + + BaseSelection.prototype.destroy = function () { + this._detachCloseHandler(this.container); + }; + + BaseSelection.prototype.update = function (data) { + throw new Error('The `update` method must be defined in child classes.'); + }; + + return BaseSelection; +}); + +S2.define('select2/selection/single',[ + 'jquery', + './base', + '../utils', + '../keys' +], function ($, BaseSelection, Utils, KEYS) { + function SingleSelection () { + SingleSelection.__super__.constructor.apply(this, arguments); + } + + Utils.Extend(SingleSelection, BaseSelection); + + SingleSelection.prototype.render = function () { + var $selection = SingleSelection.__super__.render.call(this); + + $selection.addClass('select2-selection--single'); + + $selection.html( + '<span class="select2-selection__rendered"></span>' + + '<span class="select2-selection__arrow" role="presentation">' + + '<b role="presentation"></b>' + + '</span>' + ); + + return $selection; + }; + + SingleSelection.prototype.bind = function (container, $container) { + var self = this; + + SingleSelection.__super__.bind.apply(this, arguments); + + var id = container.id + '-container'; + + this.$selection.find('.select2-selection__rendered').attr('id', id); + this.$selection.attr('aria-labelledby', id); + + this.$selection.on('mousedown', function (evt) { + // Only respond to left clicks + if (evt.which !== 1) { + return; + } + + self.trigger('toggle', { + originalEvent: evt + }); + }); + + this.$selection.on('focus', function (evt) { + // User focuses on the container + }); + + this.$selection.on('blur', function (evt) { + // User exits the container + }); + + container.on('selection:update', function (params) { + self.update(params.data); + }); + }; + + SingleSelection.prototype.clear = function () { + this.$selection.find('.select2-selection__rendered').empty(); + }; + + SingleSelection.prototype.display = function (data) { + var template = this.options.get('templateSelection'); + var escapeMarkup = this.options.get('escapeMarkup'); + + return escapeMarkup(template(data)); + }; + + SingleSelection.prototype.selectionContainer = function () { + return $('<span></span>'); + }; + + SingleSelection.prototype.update = function (data) { + if (data.length === 0) { + this.clear(); + return; + } + + var selection = data[0]; + + var formatted = this.display(selection); + + var $rendered = this.$selection.find('.select2-selection__rendered'); + $rendered.empty().append(formatted); + $rendered.prop('title', selection.title || selection.text); + }; + + return SingleSelection; +}); + +S2.define('select2/selection/multiple',[ + 'jquery', + './base', + '../utils' +], function ($, BaseSelection, Utils) { + function MultipleSelection ($element, options) { + MultipleSelection.__super__.constructor.apply(this, arguments); + } + + Utils.Extend(MultipleSelection, BaseSelection); + + MultipleSelection.prototype.render = function () { + var $selection = MultipleSelection.__super__.render.call(this); + + $selection.addClass('select2-selection--multiple'); + + $selection.html( + '<ul class="select2-selection__rendered"></ul>' + ); + + return $selection; + }; + + MultipleSelection.prototype.bind = function (container, $container) { + var self = this; + + MultipleSelection.__super__.bind.apply(this, arguments); + + this.$selection.on('click', function (evt) { + self.trigger('toggle', { + originalEvent: evt + }); + }); + + this.$selection.on('click', '.select2-selection__choice__remove', + function (evt) { + var $remove = $(this); + var $selection = $remove.parent(); + + var data = $selection.data('data'); + + self.trigger('unselect', { + originalEvent: evt, + data: data + }); + }); + }; + + MultipleSelection.prototype.clear = function () { + this.$selection.find('.select2-selection__rendered').empty(); + }; + + MultipleSelection.prototype.display = function (data) { + var template = this.options.get('templateSelection'); + var escapeMarkup = this.options.get('escapeMarkup'); + + return escapeMarkup(template(data)); + }; + + MultipleSelection.prototype.selectionContainer = function () { + var $container = $( + '<li class="select2-selection__choice">' + + '<span class="select2-selection__choice__remove" role="presentation">' + + '&times;' + + '</span>' + + '</li>' + ); + + return $container; + }; + + MultipleSelection.prototype.update = function (data) { + this.clear(); + + if (data.length === 0) { + return; + } + + var $selections = []; + + for (var d = 0; d < data.length; d++) { + var selection = data[d]; + + var formatted = this.display(selection); + var $selection = this.selectionContainer(); + + $selection.append(formatted); + $selection.prop('title', selection.title || selection.text); + + $selection.data('data', selection); + + $selections.push($selection); + } + + var $rendered = this.$selection.find('.select2-selection__rendered'); + + Utils.appendMany($rendered, $selections); + }; + + return MultipleSelection; +}); + +S2.define('select2/selection/placeholder',[ + '../utils' +], function (Utils) { + function Placeholder (decorated, $element, options) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options); + } + + Placeholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + Placeholder.prototype.createPlaceholder = function (decorated, placeholder) { + var $placeholder = this.selectionContainer(); + + $placeholder.html(this.display(placeholder)); + $placeholder.addClass('select2-selection__placeholder') + .removeClass('select2-selection__choice'); + + return $placeholder; + }; + + Placeholder.prototype.update = function (decorated, data) { + var singlePlaceholder = ( + data.length == 1 && data[0].id != this.placeholder.id + ); + var multipleSelections = data.length > 1; + + if (multipleSelections || singlePlaceholder) { + return decorated.call(this, data); + } + + this.clear(); + + var $placeholder = this.createPlaceholder(this.placeholder); + + this.$selection.find('.select2-selection__rendered').append($placeholder); + }; + + return Placeholder; +}); + +S2.define('select2/selection/allowClear',[ + 'jquery', + '../keys' +], function ($, KEYS) { + function AllowClear () { } + + AllowClear.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + if (this.placeholder == null) { + if (this.options.get('debug') && window.console && console.error) { + console.error( + 'Select2: The `allowClear` option should be used in combination ' + + 'with the `placeholder` option.' + ); + } + } + + this.$selection.on('mousedown', '.select2-selection__clear', + function (evt) { + self._handleClear(evt); + }); + + container.on('keypress', function (evt) { + self._handleKeyboardClear(evt, container); + }); + }; + + AllowClear.prototype._handleClear = function (_, evt) { + // Ignore the event if it is disabled + if (this.options.get('disabled')) { + return; + } + + var $clear = this.$selection.find('.select2-selection__clear'); + + // Ignore the event if nothing has been selected + if ($clear.length === 0) { + return; + } + + evt.stopPropagation(); + + var data = $clear.data('data'); + + for (var d = 0; d < data.length; d++) { + var unselectData = { + data: data[d] + }; + + // Trigger the `unselect` event, so people can prevent it from being + // cleared. + this.trigger('unselect', unselectData); + + // If the event was prevented, don't clear it out. + if (unselectData.prevented) { + return; + } + } + + this.$element.val(this.placeholder.id).trigger('change'); + + this.trigger('toggle'); + }; + + AllowClear.prototype._handleKeyboardClear = function (_, evt, container) { + if (container.isOpen()) { + return; + } + + if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) { + this._handleClear(evt); + } + }; + + AllowClear.prototype.update = function (decorated, data) { + decorated.call(this, data); + + if (this.$selection.find('.select2-selection__placeholder').length > 0 || + data.length === 0) { + return; + } + + var $remove = $( + '<span class="select2-selection__clear">' + + '&times;' + + '</span>' + ); + $remove.data('data', data); + + this.$selection.find('.select2-selection__rendered').prepend($remove); + }; + + return AllowClear; +}); + +S2.define('select2/selection/search',[ + 'jquery', + '../utils', + '../keys' +], function ($, Utils, KEYS) { + function Search (decorated, $element, options) { + decorated.call(this, $element, options); + } + + Search.prototype.render = function (decorated) { + var $search = $( + '<li class="select2-search select2-search--inline">' + + '<input class="select2-search__field" type="search" tabindex="-1"' + + ' autocomplete="off" autocorrect="off" autocapitalize="off"' + + ' spellcheck="false" role="textbox" />' + + '</li>' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + var $rendered = decorated.call(this); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('open', function () { + self.$search.attr('tabindex', 0); + + self.$search.focus(); + }); + + container.on('close', function () { + self.$search.attr('tabindex', -1); + + self.$search.val(''); + self.$search.focus(); + }); + + container.on('enable', function () { + self.$search.prop('disabled', false); + }); + + container.on('disable', function () { + self.$search.prop('disabled', true); + }); + + this.$selection.on('focusin', '.select2-search--inline', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('focusout', '.select2-search--inline', function (evt) { + self.trigger('blur', evt); + }); + + this.$selection.on('keydown', '.select2-search--inline', function (evt) { + evt.stopPropagation(); + + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + + var key = evt.which; + + if (key === KEYS.BACKSPACE && self.$search.val() === '') { + var $previousChoice = self.$searchContainer + .prev('.select2-selection__choice'); + + if ($previousChoice.length > 0) { + var item = $previousChoice.data('data'); + + self.searchRemoveChoice(item); + + evt.preventDefault(); + } + } + }); + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$selection.on('input', '.select2-search--inline', function (evt) { + // Unbind the duplicated `keyup` event + self.$selection.off('keyup.search'); + }); + + this.$selection.on('keyup.search input', '.select2-search--inline', + function (evt) { + self.handleSearch(evt); + }); + }; + + Search.prototype.createPlaceholder = function (decorated, placeholder) { + this.$search.attr('placeholder', placeholder.text); + }; + + Search.prototype.update = function (decorated, data) { + this.$search.attr('placeholder', ''); + + decorated.call(this, data); + + this.$selection.find('.select2-selection__rendered') + .append(this.$searchContainer); + + this.resizeSearch(); + }; + + Search.prototype.handleSearch = function () { + this.resizeSearch(); + + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.searchRemoveChoice = function (decorated, item) { + this.trigger('unselect', { + data: item + }); + + this.trigger('open'); + + this.$search.val(item.text + ' '); + }; + + Search.prototype.resizeSearch = function () { + this.$search.css('width', '25px'); + + var width = ''; + + if (this.$search.attr('placeholder') !== '') { + width = this.$selection.find('.select2-selection__rendered').innerWidth(); + } else { + var minimumWidth = this.$search.val().length + 1; + + width = (minimumWidth * 0.75) + 'em'; + } + + this.$search.css('width', width); + }; + + return Search; +}); + +S2.define('select2/selection/eventRelay',[ + 'jquery' +], function ($) { + function EventRelay () { } + + EventRelay.prototype.bind = function (decorated, container, $container) { + var self = this; + var relayEvents = [ + 'open', 'opening', + 'close', 'closing', + 'select', 'selecting', + 'unselect', 'unselecting' + ]; + + var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting']; + + decorated.call(this, container, $container); + + container.on('*', function (name, params) { + // Ignore events that should not be relayed + if ($.inArray(name, relayEvents) === -1) { + return; + } + + // The parameters should always be an object + params = params || {}; + + // Generate the jQuery event for the Select2 event + var evt = $.Event('select2:' + name, { + params: params + }); + + self.$element.trigger(evt); + + // Only handle preventable events if it was one + if ($.inArray(name, preventableEvents) === -1) { + return; + } + + params.prevented = evt.isDefaultPrevented(); + }); + }; + + return EventRelay; +}); + +S2.define('select2/translation',[ + 'jquery', + 'require' +], function ($, require) { + function Translation (dict) { + this.dict = dict || {}; + } + + Translation.prototype.all = function () { + return this.dict; + }; + + Translation.prototype.get = function (key) { + return this.dict[key]; + }; + + Translation.prototype.extend = function (translation) { + this.dict = $.extend({}, translation.all(), this.dict); + }; + + // Static functions + + Translation._cache = {}; + + Translation.loadPath = function (path) { + if (!(path in Translation._cache)) { + var translations = require(path); + + Translation._cache[path] = translations; + } + + return new Translation(Translation._cache[path]); + }; + + return Translation; +}); + +S2.define('select2/diacritics',[ + +], function () { + var diacritics = { + '\u24B6': 'A', + '\uFF21': 'A', + '\u00C0': 'A', + '\u00C1': 'A', + '\u00C2': 'A', + '\u1EA6': 'A', + '\u1EA4': 'A', + '\u1EAA': 'A', + '\u1EA8': 'A', + '\u00C3': 'A', + '\u0100': 'A', + '\u0102': 'A', + '\u1EB0': 'A', + '\u1EAE': 'A', + '\u1EB4': 'A', + '\u1EB2': 'A', + '\u0226': 'A', + '\u01E0': 'A', + '\u00C4': 'A', + '\u01DE': 'A', + '\u1EA2': 'A', + '\u00C5': 'A', + '\u01FA': 'A', + '\u01CD': 'A', + '\u0200': 'A', + '\u0202': 'A', + '\u1EA0': 'A', + '\u1EAC': 'A', + '\u1EB6': 'A', + '\u1E00': 'A', + '\u0104': 'A', + '\u023A': 'A', + '\u2C6F': 'A', + '\uA732': 'AA', + '\u00C6': 'AE', + '\u01FC': 'AE', + '\u01E2': 'AE', + '\uA734': 'AO', + '\uA736': 'AU', + '\uA738': 'AV', + '\uA73A': 'AV', + '\uA73C': 'AY', + '\u24B7': 'B', + '\uFF22': 'B', + '\u1E02': 'B', + '\u1E04': 'B', + '\u1E06': 'B', + '\u0243': 'B', + '\u0182': 'B', + '\u0181': 'B', + '\u24B8': 'C', + '\uFF23': 'C', + '\u0106': 'C', + '\u0108': 'C', + '\u010A': 'C', + '\u010C': 'C', + '\u00C7': 'C', + '\u1E08': 'C', + '\u0187': 'C', + '\u023B': 'C', + '\uA73E': 'C', + '\u24B9': 'D', + '\uFF24': 'D', + '\u1E0A': 'D', + '\u010E': 'D', + '\u1E0C': 'D', + '\u1E10': 'D', + '\u1E12': 'D', + '\u1E0E': 'D', + '\u0110': 'D', + '\u018B': 'D', + '\u018A': 'D', + '\u0189': 'D', + '\uA779': 'D', + '\u01F1': 'DZ', + '\u01C4': 'DZ', + '\u01F2': 'Dz', + '\u01C5': 'Dz', + '\u24BA': 'E', + '\uFF25': 'E', + '\u00C8': 'E', + '\u00C9': 'E', + '\u00CA': 'E', + '\u1EC0': 'E', + '\u1EBE': 'E', + '\u1EC4': 'E', + '\u1EC2': 'E', + '\u1EBC': 'E', + '\u0112': 'E', + '\u1E14': 'E', + '\u1E16': 'E', + '\u0114': 'E', + '\u0116': 'E', + '\u00CB': 'E', + '\u1EBA': 'E', + '\u011A': 'E', + '\u0204': 'E', + '\u0206': 'E', + '\u1EB8': 'E', + '\u1EC6': 'E', + '\u0228': 'E', + '\u1E1C': 'E', + '\u0118': 'E', + '\u1E18': 'E', + '\u1E1A': 'E', + '\u0190': 'E', + '\u018E': 'E', + '\u24BB': 'F', + '\uFF26': 'F', + '\u1E1E': 'F', + '\u0191': 'F', + '\uA77B': 'F', + '\u24BC': 'G', + '\uFF27': 'G', + '\u01F4': 'G', + '\u011C': 'G', + '\u1E20': 'G', + '\u011E': 'G', + '\u0120': 'G', + '\u01E6': 'G', + '\u0122': 'G', + '\u01E4': 'G', + '\u0193': 'G', + '\uA7A0': 'G', + '\uA77D': 'G', + '\uA77E': 'G', + '\u24BD': 'H', + '\uFF28': 'H', + '\u0124': 'H', + '\u1E22': 'H', + '\u1E26': 'H', + '\u021E': 'H', + '\u1E24': 'H', + '\u1E28': 'H', + '\u1E2A': 'H', + '\u0126': 'H', + '\u2C67': 'H', + '\u2C75': 'H', + '\uA78D': 'H', + '\u24BE': 'I', + '\uFF29': 'I', + '\u00CC': 'I', + '\u00CD': 'I', + '\u00CE': 'I', + '\u0128': 'I', + '\u012A': 'I', + '\u012C': 'I', + '\u0130': 'I', + '\u00CF': 'I', + '\u1E2E': 'I', + '\u1EC8': 'I', + '\u01CF': 'I', + '\u0208': 'I', + '\u020A': 'I', + '\u1ECA': 'I', + '\u012E': 'I', + '\u1E2C': 'I', + '\u0197': 'I', + '\u24BF': 'J', + '\uFF2A': 'J', + '\u0134': 'J', + '\u0248': 'J', + '\u24C0': 'K', + '\uFF2B': 'K', + '\u1E30': 'K', + '\u01E8': 'K', + '\u1E32': 'K', + '\u0136': 'K', + '\u1E34': 'K', + '\u0198': 'K', + '\u2C69': 'K', + '\uA740': 'K', + '\uA742': 'K', + '\uA744': 'K', + '\uA7A2': 'K', + '\u24C1': 'L', + '\uFF2C': 'L', + '\u013F': 'L', + '\u0139': 'L', + '\u013D': 'L', + '\u1E36': 'L', + '\u1E38': 'L', + '\u013B': 'L', + '\u1E3C': 'L', + '\u1E3A': 'L', + '\u0141': 'L', + '\u023D': 'L', + '\u2C62': 'L', + '\u2C60': 'L', + '\uA748': 'L', + '\uA746': 'L', + '\uA780': 'L', + '\u01C7': 'LJ', + '\u01C8': 'Lj', + '\u24C2': 'M', + '\uFF2D': 'M', + '\u1E3E': 'M', + '\u1E40': 'M', + '\u1E42': 'M', + '\u2C6E': 'M', + '\u019C': 'M', + '\u24C3': 'N', + '\uFF2E': 'N', + '\u01F8': 'N', + '\u0143': 'N', + '\u00D1': 'N', + '\u1E44': 'N', + '\u0147': 'N', + '\u1E46': 'N', + '\u0145': 'N', + '\u1E4A': 'N', + '\u1E48': 'N', + '\u0220': 'N', + '\u019D': 'N', + '\uA790': 'N', + '\uA7A4': 'N', + '\u01CA': 'NJ', + '\u01CB': 'Nj', + '\u24C4': 'O', + '\uFF2F': 'O', + '\u00D2': 'O', + '\u00D3': 'O', + '\u00D4': 'O', + '\u1ED2': 'O', + '\u1ED0': 'O', + '\u1ED6': 'O', + '\u1ED4': 'O', + '\u00D5': 'O', + '\u1E4C': 'O', + '\u022C': 'O', + '\u1E4E': 'O', + '\u014C': 'O', + '\u1E50': 'O', + '\u1E52': 'O', + '\u014E': 'O', + '\u022E': 'O', + '\u0230': 'O', + '\u00D6': 'O', + '\u022A': 'O', + '\u1ECE': 'O', + '\u0150': 'O', + '\u01D1': 'O', + '\u020C': 'O', + '\u020E': 'O', + '\u01A0': 'O', + '\u1EDC': 'O', + '\u1EDA': 'O', + '\u1EE0': 'O', + '\u1EDE': 'O', + '\u1EE2': 'O', + '\u1ECC': 'O', + '\u1ED8': 'O', + '\u01EA': 'O', + '\u01EC': 'O', + '\u00D8': 'O', + '\u01FE': 'O', + '\u0186': 'O', + '\u019F': 'O', + '\uA74A': 'O', + '\uA74C': 'O', + '\u01A2': 'OI', + '\uA74E': 'OO', + '\u0222': 'OU', + '\u24C5': 'P', + '\uFF30': 'P', + '\u1E54': 'P', + '\u1E56': 'P', + '\u01A4': 'P', + '\u2C63': 'P', + '\uA750': 'P', + '\uA752': 'P', + '\uA754': 'P', + '\u24C6': 'Q', + '\uFF31': 'Q', + '\uA756': 'Q', + '\uA758': 'Q', + '\u024A': 'Q', + '\u24C7': 'R', + '\uFF32': 'R', + '\u0154': 'R', + '\u1E58': 'R', + '\u0158': 'R', + '\u0210': 'R', + '\u0212': 'R', + '\u1E5A': 'R', + '\u1E5C': 'R', + '\u0156': 'R', + '\u1E5E': 'R', + '\u024C': 'R', + '\u2C64': 'R', + '\uA75A': 'R', + '\uA7A6': 'R', + '\uA782': 'R', + '\u24C8': 'S', + '\uFF33': 'S', + '\u1E9E': 'S', + '\u015A': 'S', + '\u1E64': 'S', + '\u015C': 'S', + '\u1E60': 'S', + '\u0160': 'S', + '\u1E66': 'S', + '\u1E62': 'S', + '\u1E68': 'S', + '\u0218': 'S', + '\u015E': 'S', + '\u2C7E': 'S', + '\uA7A8': 'S', + '\uA784': 'S', + '\u24C9': 'T', + '\uFF34': 'T', + '\u1E6A': 'T', + '\u0164': 'T', + '\u1E6C': 'T', + '\u021A': 'T', + '\u0162': 'T', + '\u1E70': 'T', + '\u1E6E': 'T', + '\u0166': 'T', + '\u01AC': 'T', + '\u01AE': 'T', + '\u023E': 'T', + '\uA786': 'T', + '\uA728': 'TZ', + '\u24CA': 'U', + '\uFF35': 'U', + '\u00D9': 'U', + '\u00DA': 'U', + '\u00DB': 'U', + '\u0168': 'U', + '\u1E78': 'U', + '\u016A': 'U', + '\u1E7A': 'U', + '\u016C': 'U', + '\u00DC': 'U', + '\u01DB': 'U', + '\u01D7': 'U', + '\u01D5': 'U', + '\u01D9': 'U', + '\u1EE6': 'U', + '\u016E': 'U', + '\u0170': 'U', + '\u01D3': 'U', + '\u0214': 'U', + '\u0216': 'U', + '\u01AF': 'U', + '\u1EEA': 'U', + '\u1EE8': 'U', + '\u1EEE': 'U', + '\u1EEC': 'U', + '\u1EF0': 'U', + '\u1EE4': 'U', + '\u1E72': 'U', + '\u0172': 'U', + '\u1E76': 'U', + '\u1E74': 'U', + '\u0244': 'U', + '\u24CB': 'V', + '\uFF36': 'V', + '\u1E7C': 'V', + '\u1E7E': 'V', + '\u01B2': 'V', + '\uA75E': 'V', + '\u0245': 'V', + '\uA760': 'VY', + '\u24CC': 'W', + '\uFF37': 'W', + '\u1E80': 'W', + '\u1E82': 'W', + '\u0174': 'W', + '\u1E86': 'W', + '\u1E84': 'W', + '\u1E88': 'W', + '\u2C72': 'W', + '\u24CD': 'X', + '\uFF38': 'X', + '\u1E8A': 'X', + '\u1E8C': 'X', + '\u24CE': 'Y', + '\uFF39': 'Y', + '\u1EF2': 'Y', + '\u00DD': 'Y', + '\u0176': 'Y', + '\u1EF8': 'Y', + '\u0232': 'Y', + '\u1E8E': 'Y', + '\u0178': 'Y', + '\u1EF6': 'Y', + '\u1EF4': 'Y', + '\u01B3': 'Y', + '\u024E': 'Y', + '\u1EFE': 'Y', + '\u24CF': 'Z', + '\uFF3A': 'Z', + '\u0179': 'Z', + '\u1E90': 'Z', + '\u017B': 'Z', + '\u017D': 'Z', + '\u1E92': 'Z', + '\u1E94': 'Z', + '\u01B5': 'Z', + '\u0224': 'Z', + '\u2C7F': 'Z', + '\u2C6B': 'Z', + '\uA762': 'Z', + '\u24D0': 'a', + '\uFF41': 'a', + '\u1E9A': 'a', + '\u00E0': 'a', + '\u00E1': 'a', + '\u00E2': 'a', + '\u1EA7': 'a', + '\u1EA5': 'a', + '\u1EAB': 'a', + '\u1EA9': 'a', + '\u00E3': 'a', + '\u0101': 'a', + '\u0103': 'a', + '\u1EB1': 'a', + '\u1EAF': 'a', + '\u1EB5': 'a', + '\u1EB3': 'a', + '\u0227': 'a', + '\u01E1': 'a', + '\u00E4': 'a', + '\u01DF': 'a', + '\u1EA3': 'a', + '\u00E5': 'a', + '\u01FB': 'a', + '\u01CE': 'a', + '\u0201': 'a', + '\u0203': 'a', + '\u1EA1': 'a', + '\u1EAD': 'a', + '\u1EB7': 'a', + '\u1E01': 'a', + '\u0105': 'a', + '\u2C65': 'a', + '\u0250': 'a', + '\uA733': 'aa', + '\u00E6': 'ae', + '\u01FD': 'ae', + '\u01E3': 'ae', + '\uA735': 'ao', + '\uA737': 'au', + '\uA739': 'av', + '\uA73B': 'av', + '\uA73D': 'ay', + '\u24D1': 'b', + '\uFF42': 'b', + '\u1E03': 'b', + '\u1E05': 'b', + '\u1E07': 'b', + '\u0180': 'b', + '\u0183': 'b', + '\u0253': 'b', + '\u24D2': 'c', + '\uFF43': 'c', + '\u0107': 'c', + '\u0109': 'c', + '\u010B': 'c', + '\u010D': 'c', + '\u00E7': 'c', + '\u1E09': 'c', + '\u0188': 'c', + '\u023C': 'c', + '\uA73F': 'c', + '\u2184': 'c', + '\u24D3': 'd', + '\uFF44': 'd', + '\u1E0B': 'd', + '\u010F': 'd', + '\u1E0D': 'd', + '\u1E11': 'd', + '\u1E13': 'd', + '\u1E0F': 'd', + '\u0111': 'd', + '\u018C': 'd', + '\u0256': 'd', + '\u0257': 'd', + '\uA77A': 'd', + '\u01F3': 'dz', + '\u01C6': 'dz', + '\u24D4': 'e', + '\uFF45': 'e', + '\u00E8': 'e', + '\u00E9': 'e', + '\u00EA': 'e', + '\u1EC1': 'e', + '\u1EBF': 'e', + '\u1EC5': 'e', + '\u1EC3': 'e', + '\u1EBD': 'e', + '\u0113': 'e', + '\u1E15': 'e', + '\u1E17': 'e', + '\u0115': 'e', + '\u0117': 'e', + '\u00EB': 'e', + '\u1EBB': 'e', + '\u011B': 'e', + '\u0205': 'e', + '\u0207': 'e', + '\u1EB9': 'e', + '\u1EC7': 'e', + '\u0229': 'e', + '\u1E1D': 'e', + '\u0119': 'e', + '\u1E19': 'e', + '\u1E1B': 'e', + '\u0247': 'e', + '\u025B': 'e', + '\u01DD': 'e', + '\u24D5': 'f', + '\uFF46': 'f', + '\u1E1F': 'f', + '\u0192': 'f', + '\uA77C': 'f', + '\u24D6': 'g', + '\uFF47': 'g', + '\u01F5': 'g', + '\u011D': 'g', + '\u1E21': 'g', + '\u011F': 'g', + '\u0121': 'g', + '\u01E7': 'g', + '\u0123': 'g', + '\u01E5': 'g', + '\u0260': 'g', + '\uA7A1': 'g', + '\u1D79': 'g', + '\uA77F': 'g', + '\u24D7': 'h', + '\uFF48': 'h', + '\u0125': 'h', + '\u1E23': 'h', + '\u1E27': 'h', + '\u021F': 'h', + '\u1E25': 'h', + '\u1E29': 'h', + '\u1E2B': 'h', + '\u1E96': 'h', + '\u0127': 'h', + '\u2C68': 'h', + '\u2C76': 'h', + '\u0265': 'h', + '\u0195': 'hv', + '\u24D8': 'i', + '\uFF49': 'i', + '\u00EC': 'i', + '\u00ED': 'i', + '\u00EE': 'i', + '\u0129': 'i', + '\u012B': 'i', + '\u012D': 'i', + '\u00EF': 'i', + '\u1E2F': 'i', + '\u1EC9': 'i', + '\u01D0': 'i', + '\u0209': 'i', + '\u020B': 'i', + '\u1ECB': 'i', + '\u012F': 'i', + '\u1E2D': 'i', + '\u0268': 'i', + '\u0131': 'i', + '\u24D9': 'j', + '\uFF4A': 'j', + '\u0135': 'j', + '\u01F0': 'j', + '\u0249': 'j', + '\u24DA': 'k', + '\uFF4B': 'k', + '\u1E31': 'k', + '\u01E9': 'k', + '\u1E33': 'k', + '\u0137': 'k', + '\u1E35': 'k', + '\u0199': 'k', + '\u2C6A': 'k', + '\uA741': 'k', + '\uA743': 'k', + '\uA745': 'k', + '\uA7A3': 'k', + '\u24DB': 'l', + '\uFF4C': 'l', + '\u0140': 'l', + '\u013A': 'l', + '\u013E': 'l', + '\u1E37': 'l', + '\u1E39': 'l', + '\u013C': 'l', + '\u1E3D': 'l', + '\u1E3B': 'l', + '\u017F': 'l', + '\u0142': 'l', + '\u019A': 'l', + '\u026B': 'l', + '\u2C61': 'l', + '\uA749': 'l', + '\uA781': 'l', + '\uA747': 'l', + '\u01C9': 'lj', + '\u24DC': 'm', + '\uFF4D': 'm', + '\u1E3F': 'm', + '\u1E41': 'm', + '\u1E43': 'm', + '\u0271': 'm', + '\u026F': 'm', + '\u24DD': 'n', + '\uFF4E': 'n', + '\u01F9': 'n', + '\u0144': 'n', + '\u00F1': 'n', + '\u1E45': 'n', + '\u0148': 'n', + '\u1E47': 'n', + '\u0146': 'n', + '\u1E4B': 'n', + '\u1E49': 'n', + '\u019E': 'n', + '\u0272': 'n', + '\u0149': 'n', + '\uA791': 'n', + '\uA7A5': 'n', + '\u01CC': 'nj', + '\u24DE': 'o', + '\uFF4F': 'o', + '\u00F2': 'o', + '\u00F3': 'o', + '\u00F4': 'o', + '\u1ED3': 'o', + '\u1ED1': 'o', + '\u1ED7': 'o', + '\u1ED5': 'o', + '\u00F5': 'o', + '\u1E4D': 'o', + '\u022D': 'o', + '\u1E4F': 'o', + '\u014D': 'o', + '\u1E51': 'o', + '\u1E53': 'o', + '\u014F': 'o', + '\u022F': 'o', + '\u0231': 'o', + '\u00F6': 'o', + '\u022B': 'o', + '\u1ECF': 'o', + '\u0151': 'o', + '\u01D2': 'o', + '\u020D': 'o', + '\u020F': 'o', + '\u01A1': 'o', + '\u1EDD': 'o', + '\u1EDB': 'o', + '\u1EE1': 'o', + '\u1EDF': 'o', + '\u1EE3': 'o', + '\u1ECD': 'o', + '\u1ED9': 'o', + '\u01EB': 'o', + '\u01ED': 'o', + '\u00F8': 'o', + '\u01FF': 'o', + '\u0254': 'o', + '\uA74B': 'o', + '\uA74D': 'o', + '\u0275': 'o', + '\u01A3': 'oi', + '\u0223': 'ou', + '\uA74F': 'oo', + '\u24DF': 'p', + '\uFF50': 'p', + '\u1E55': 'p', + '\u1E57': 'p', + '\u01A5': 'p', + '\u1D7D': 'p', + '\uA751': 'p', + '\uA753': 'p', + '\uA755': 'p', + '\u24E0': 'q', + '\uFF51': 'q', + '\u024B': 'q', + '\uA757': 'q', + '\uA759': 'q', + '\u24E1': 'r', + '\uFF52': 'r', + '\u0155': 'r', + '\u1E59': 'r', + '\u0159': 'r', + '\u0211': 'r', + '\u0213': 'r', + '\u1E5B': 'r', + '\u1E5D': 'r', + '\u0157': 'r', + '\u1E5F': 'r', + '\u024D': 'r', + '\u027D': 'r', + '\uA75B': 'r', + '\uA7A7': 'r', + '\uA783': 'r', + '\u24E2': 's', + '\uFF53': 's', + '\u00DF': 's', + '\u015B': 's', + '\u1E65': 's', + '\u015D': 's', + '\u1E61': 's', + '\u0161': 's', + '\u1E67': 's', + '\u1E63': 's', + '\u1E69': 's', + '\u0219': 's', + '\u015F': 's', + '\u023F': 's', + '\uA7A9': 's', + '\uA785': 's', + '\u1E9B': 's', + '\u24E3': 't', + '\uFF54': 't', + '\u1E6B': 't', + '\u1E97': 't', + '\u0165': 't', + '\u1E6D': 't', + '\u021B': 't', + '\u0163': 't', + '\u1E71': 't', + '\u1E6F': 't', + '\u0167': 't', + '\u01AD': 't', + '\u0288': 't', + '\u2C66': 't', + '\uA787': 't', + '\uA729': 'tz', + '\u24E4': 'u', + '\uFF55': 'u', + '\u00F9': 'u', + '\u00FA': 'u', + '\u00FB': 'u', + '\u0169': 'u', + '\u1E79': 'u', + '\u016B': 'u', + '\u1E7B': 'u', + '\u016D': 'u', + '\u00FC': 'u', + '\u01DC': 'u', + '\u01D8': 'u', + '\u01D6': 'u', + '\u01DA': 'u', + '\u1EE7': 'u', + '\u016F': 'u', + '\u0171': 'u', + '\u01D4': 'u', + '\u0215': 'u', + '\u0217': 'u', + '\u01B0': 'u', + '\u1EEB': 'u', + '\u1EE9': 'u', + '\u1EEF': 'u', + '\u1EED': 'u', + '\u1EF1': 'u', + '\u1EE5': 'u', + '\u1E73': 'u', + '\u0173': 'u', + '\u1E77': 'u', + '\u1E75': 'u', + '\u0289': 'u', + '\u24E5': 'v', + '\uFF56': 'v', + '\u1E7D': 'v', + '\u1E7F': 'v', + '\u028B': 'v', + '\uA75F': 'v', + '\u028C': 'v', + '\uA761': 'vy', + '\u24E6': 'w', + '\uFF57': 'w', + '\u1E81': 'w', + '\u1E83': 'w', + '\u0175': 'w', + '\u1E87': 'w', + '\u1E85': 'w', + '\u1E98': 'w', + '\u1E89': 'w', + '\u2C73': 'w', + '\u24E7': 'x', + '\uFF58': 'x', + '\u1E8B': 'x', + '\u1E8D': 'x', + '\u24E8': 'y', + '\uFF59': 'y', + '\u1EF3': 'y', + '\u00FD': 'y', + '\u0177': 'y', + '\u1EF9': 'y', + '\u0233': 'y', + '\u1E8F': 'y', + '\u00FF': 'y', + '\u1EF7': 'y', + '\u1E99': 'y', + '\u1EF5': 'y', + '\u01B4': 'y', + '\u024F': 'y', + '\u1EFF': 'y', + '\u24E9': 'z', + '\uFF5A': 'z', + '\u017A': 'z', + '\u1E91': 'z', + '\u017C': 'z', + '\u017E': 'z', + '\u1E93': 'z', + '\u1E95': 'z', + '\u01B6': 'z', + '\u0225': 'z', + '\u0240': 'z', + '\u2C6C': 'z', + '\uA763': 'z', + '\u0386': '\u0391', + '\u0388': '\u0395', + '\u0389': '\u0397', + '\u038A': '\u0399', + '\u03AA': '\u0399', + '\u038C': '\u039F', + '\u038E': '\u03A5', + '\u03AB': '\u03A5', + '\u038F': '\u03A9', + '\u03AC': '\u03B1', + '\u03AD': '\u03B5', + '\u03AE': '\u03B7', + '\u03AF': '\u03B9', + '\u03CA': '\u03B9', + '\u0390': '\u03B9', + '\u03CC': '\u03BF', + '\u03CD': '\u03C5', + '\u03CB': '\u03C5', + '\u03B0': '\u03C5', + '\u03C9': '\u03C9', + '\u03C2': '\u03C3' + }; + + return diacritics; +}); + +S2.define('select2/data/base',[ + '../utils' +], function (Utils) { + function BaseAdapter ($element, options) { + BaseAdapter.__super__.constructor.call(this); + } + + Utils.Extend(BaseAdapter, Utils.Observable); + + BaseAdapter.prototype.current = function (callback) { + throw new Error('The `current` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.query = function (params, callback) { + throw new Error('The `query` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.bind = function (container, $container) { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.destroy = function () { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.generateResultId = function (container, data) { + var id = container.id + '-result-'; + + id += Utils.generateChars(4); + + if (data.id != null) { + id += '-' + data.id.toString(); + } else { + id += '-' + Utils.generateChars(4); + } + return id; + }; + + return BaseAdapter; +}); + +S2.define('select2/data/select',[ + './base', + '../utils', + 'jquery' +], function (BaseAdapter, Utils, $) { + function SelectAdapter ($element, options) { + this.$element = $element; + this.options = options; + + SelectAdapter.__super__.constructor.call(this); + } + + Utils.Extend(SelectAdapter, BaseAdapter); + + SelectAdapter.prototype.current = function (callback) { + var data = []; + var self = this; + + this.$element.find(':selected').each(function () { + var $option = $(this); + + var option = self.item($option); + + data.push(option); + }); + + callback(data); + }; + + SelectAdapter.prototype.select = function (data) { + var self = this; + + data.selected = true; + + // If data.element is a DOM node, use it instead + if ($(data.element).is('option')) { + data.element.selected = true; + + this.$element.trigger('change'); + + return; + } + + if (this.$element.prop('multiple')) { + this.current(function (currentData) { + var val = []; + + data = [data]; + data.push.apply(data, currentData); + + for (var d = 0; d < data.length; d++) { + var id = data[d].id; + + if ($.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + self.$element.trigger('change'); + }); + } else { + var val = data.id; + + this.$element.val(val); + this.$element.trigger('change'); + } + }; + + SelectAdapter.prototype.unselect = function (data) { + var self = this; + + if (!this.$element.prop('multiple')) { + return; + } + + data.selected = false; + + if ($(data.element).is('option')) { + data.element.selected = false; + + this.$element.trigger('change'); + + return; + } + + this.current(function (currentData) { + var val = []; + + for (var d = 0; d < currentData.length; d++) { + var id = currentData[d].id; + + if (id !== data.id && $.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + + self.$element.trigger('change'); + }); + }; + + SelectAdapter.prototype.bind = function (container, $container) { + var self = this; + + this.container = container; + + container.on('select', function (params) { + self.select(params.data); + }); + + container.on('unselect', function (params) { + self.unselect(params.data); + }); + }; + + SelectAdapter.prototype.destroy = function () { + // Remove anything added to child elements + this.$element.find('*').each(function () { + // Remove any custom data set by Select2 + $.removeData(this, 'data'); + }); + }; + + SelectAdapter.prototype.query = function (params, callback) { + var data = []; + var self = this; + + var $options = this.$element.children(); + + $options.each(function () { + var $option = $(this); + + if (!$option.is('option') && !$option.is('optgroup')) { + return; + } + + var option = self.item($option); + + var matches = self.matches(params, option); + + if (matches !== null) { + data.push(matches); + } + }); + + callback({ + results: data + }); + }; + + SelectAdapter.prototype.addOptions = function ($options) { + Utils.appendMany(this.$element, $options); + }; + + SelectAdapter.prototype.option = function (data) { + var option; + + if (data.children) { + option = document.createElement('optgroup'); + option.label = data.text; + } else { + option = document.createElement('option'); + + if (option.textContent !== undefined) { + option.textContent = data.text; + } else { + option.innerText = data.text; + } + } + + if (data.id) { + option.value = data.id; + } + + if (data.disabled) { + option.disabled = true; + } + + if (data.selected) { + option.selected = true; + } + + if (data.title) { + option.title = data.title; + } + + var $option = $(option); + + var normalizedData = this._normalizeItem(data); + normalizedData.element = option; + + // Override the option's data with the combined data + $.data(option, 'data', normalizedData); + + return $option; + }; + + SelectAdapter.prototype.item = function ($option) { + var data = {}; + + data = $.data($option[0], 'data'); + + if (data != null) { + return data; + } + + if ($option.is('option')) { + data = { + id: $option.val(), + text: $option.text(), + disabled: $option.prop('disabled'), + selected: $option.prop('selected'), + title: $option.prop('title') + }; + } else if ($option.is('optgroup')) { + data = { + text: $option.prop('label'), + children: [], + title: $option.prop('title') + }; + + var $children = $option.children('option'); + var children = []; + + for (var c = 0; c < $children.length; c++) { + var $child = $($children[c]); + + var child = this.item($child); + + children.push(child); + } + + data.children = children; + } + + data = this._normalizeItem(data); + data.element = $option[0]; + + $.data($option[0], 'data', data); + + return data; + }; + + SelectAdapter.prototype._normalizeItem = function (item) { + if (!$.isPlainObject(item)) { + item = { + id: item, + text: item + }; + } + + item = $.extend({}, { + text: '' + }, item); + + var defaults = { + selected: false, + disabled: false + }; + + if (item.id != null) { + item.id = item.id.toString(); + } + + if (item.text != null) { + item.text = item.text.toString(); + } + + if (item._resultId == null && item.id && this.container != null) { + item._resultId = this.generateResultId(this.container, item); + } + + return $.extend({}, defaults, item); + }; + + SelectAdapter.prototype.matches = function (params, data) { + var matcher = this.options.get('matcher'); + + return matcher(params, data); + }; + + return SelectAdapter; +}); + +S2.define('select2/data/array',[ + './select', + '../utils', + 'jquery' +], function (SelectAdapter, Utils, $) { + function ArrayAdapter ($element, options) { + var data = options.get('data') || []; + + ArrayAdapter.__super__.constructor.call(this, $element, options); + + this.addOptions(this.convertToOptions(data)); + } + + Utils.Extend(ArrayAdapter, SelectAdapter); + + ArrayAdapter.prototype.select = function (data) { + var $option = this.$element.find('option').filter(function (i, elm) { + return elm.value == data.id.toString(); + }); + + if ($option.length === 0) { + $option = this.option(data); + + this.addOptions($option); + } + + ArrayAdapter.__super__.select.call(this, data); + }; + + ArrayAdapter.prototype.convertToOptions = function (data) { + var self = this; + + var $existing = this.$element.find('option'); + var existingIds = $existing.map(function () { + return self.item($(this)).id; + }).get(); + + var $options = []; + + // Filter out all items except for the one passed in the argument + function onlyItem (item) { + return function () { + return $(this).val() == item.id; + }; + } + + for (var d = 0; d < data.length; d++) { + var item = this._normalizeItem(data[d]); + + // Skip items which were pre-loaded, only merge the data + if ($.inArray(item.id, existingIds) >= 0) { + var $existingOption = $existing.filter(onlyItem(item)); + + var existingData = this.item($existingOption); + var newData = $.extend(true, {}, existingData, item); + + var $newOption = this.option(existingData); + + $existingOption.replaceWith($newOption); + + continue; + } + + var $option = this.option(item); + + if (item.children) { + var $children = this.convertToOptions(item.children); + + Utils.appendMany($option, $children); + } + + $options.push($option); + } + + return $options; + }; + + return ArrayAdapter; +}); + +S2.define('select2/data/ajax',[ + './array', + '../utils', + 'jquery' +], function (ArrayAdapter, Utils, $) { + function AjaxAdapter ($element, options) { + this.ajaxOptions = this._applyDefaults(options.get('ajax')); + + if (this.ajaxOptions.processResults != null) { + this.processResults = this.ajaxOptions.processResults; + } + + ArrayAdapter.__super__.constructor.call(this, $element, options); + } + + Utils.Extend(AjaxAdapter, ArrayAdapter); + + AjaxAdapter.prototype._applyDefaults = function (options) { + var defaults = { + data: function (params) { + return { + q: params.term + }; + }, + transport: function (params, success, failure) { + var $request = $.ajax(params); + + $request.then(success); + $request.fail(failure); + + return $request; + } + }; + + return $.extend({}, defaults, options, true); + }; + + AjaxAdapter.prototype.processResults = function (results) { + return results; + }; + + AjaxAdapter.prototype.query = function (params, callback) { + var matches = []; + var self = this; + + if (this._request != null) { + // JSONP requests cannot always be aborted + if ($.isFunction(this._request.abort)) { + this._request.abort(); + } + + this._request = null; + } + + var options = $.extend({ + type: 'GET' + }, this.ajaxOptions); + + if (typeof options.url === 'function') { + options.url = options.url(params); + } + + if (typeof options.data === 'function') { + options.data = options.data(params); + } + + function request () { + var $request = options.transport(options, function (data) { + var results = self.processResults(data, params); + + if (self.options.get('debug') && window.console && console.error) { + // Check to make sure that the response included a `results` key. + if (!results || !results.results || !$.isArray(results.results)) { + console.error( + 'Select2: The AJAX results did not return an array in the ' + + '`results` key of the response.' + ); + } + } + + callback(results); + }, function () { + // TODO: Handle AJAX errors + }); + + self._request = $request; + } + + if (this.ajaxOptions.delay && params.term !== '') { + if (this._queryTimeout) { + window.clearTimeout(this._queryTimeout); + } + + this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); + } else { + request(); + } + }; + + return AjaxAdapter; +}); + +S2.define('select2/data/tags',[ + 'jquery' +], function ($) { + function Tags (decorated, $element, options) { + var tags = options.get('tags'); + + var createTag = options.get('createTag'); + + if (createTag !== undefined) { + this.createTag = createTag; + } + + decorated.call(this, $element, options); + + if ($.isArray(tags)) { + for (var t = 0; t < tags.length; t++) { + var tag = tags[t]; + var item = this._normalizeItem(tag); + + var $option = this.option(item); + + this.$element.append($option); + } + } + } + + Tags.prototype.query = function (decorated, params, callback) { + var self = this; + + this._removeOldTags(); + + if (params.term == null || params.page != null) { + decorated.call(this, params, callback); + return; + } + + function wrapper (obj, child) { + var data = obj.results; + + for (var i = 0; i < data.length; i++) { + var option = data[i]; + + var checkChildren = ( + option.children != null && + !wrapper({ + results: option.children + }, true) + ); + + var checkText = option.text === params.term; + + if (checkText || checkChildren) { + if (child) { + return false; + } + + obj.data = data; + callback(obj); + + return; + } + } + + if (child) { + return true; + } + + var tag = self.createTag(params); + + if (tag != null) { + var $option = self.option(tag); + $option.attr('data-select2-tag', true); + + self.addOptions([$option]); + + self.insertTag(data, tag); + } + + obj.results = data; + + callback(obj); + } + + decorated.call(this, params, wrapper); + }; + + Tags.prototype.createTag = function (decorated, params) { + var term = $.trim(params.term); + + if (term === '') { + return null; + } + + return { + id: term, + text: term + }; + }; + + Tags.prototype.insertTag = function (_, data, tag) { + data.unshift(tag); + }; + + Tags.prototype._removeOldTags = function (_) { + var tag = this._lastTag; + + var $options = this.$element.find('option[data-select2-tag]'); + + $options.each(function () { + if (this.selected) { + return; + } + + $(this).remove(); + }); + }; + + return Tags; +}); + +S2.define('select2/data/tokenizer',[ + 'jquery' +], function ($) { + function Tokenizer (decorated, $element, options) { + var tokenizer = options.get('tokenizer'); + + if (tokenizer !== undefined) { + this.tokenizer = tokenizer; + } + + decorated.call(this, $element, options); + } + + Tokenizer.prototype.bind = function (decorated, container, $container) { + decorated.call(this, container, $container); + + this.$search = container.dropdown.$search || container.selection.$search || + $container.find('.select2-search__field'); + }; + + Tokenizer.prototype.query = function (decorated, params, callback) { + var self = this; + + function select (data) { + self.select(data); + } + + params.term = params.term || ''; + + var tokenData = this.tokenizer(params, this.options, select); + + if (tokenData.term !== params.term) { + // Replace the search term if we have the search box + if (this.$search.length) { + this.$search.val(tokenData.term); + this.$search.focus(); + } + + params.term = tokenData.term; + } + + decorated.call(this, params, callback); + }; + + Tokenizer.prototype.tokenizer = function (_, params, options, callback) { + var separators = options.get('tokenSeparators') || []; + var term = params.term; + var i = 0; + + var createTag = this.createTag || function (params) { + return { + id: params.term, + text: params.term + }; + }; + + while (i < term.length) { + var termChar = term[i]; + + if ($.inArray(termChar, separators) === -1) { + i++; + + continue; + } + + var part = term.substr(0, i); + var partParams = $.extend({}, params, { + term: part + }); + + var data = createTag(partParams); + + callback(data); + + // Reset the term to not include the tokenized portion + term = term.substr(i + 1) || ''; + i = 0; + } + + return { + term: term + }; + }; + + return Tokenizer; +}); + +S2.define('select2/data/minimumInputLength',[ + +], function () { + function MinimumInputLength (decorated, $e, options) { + this.minimumInputLength = options.get('minimumInputLength'); + + decorated.call(this, $e, options); + } + + MinimumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (params.term.length < this.minimumInputLength) { + this.trigger('results:message', { + message: 'inputTooShort', + args: { + minimum: this.minimumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MinimumInputLength; +}); + +S2.define('select2/data/maximumInputLength',[ + +], function () { + function MaximumInputLength (decorated, $e, options) { + this.maximumInputLength = options.get('maximumInputLength'); + + decorated.call(this, $e, options); + } + + MaximumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (this.maximumInputLength > 0 && + params.term.length > this.maximumInputLength) { + this.trigger('results:message', { + message: 'inputTooLong', + args: { + maximum: this.maximumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MaximumInputLength; +}); + +S2.define('select2/data/maximumSelectionLength',[ + +], function (){ + function MaximumSelectionLength (decorated, $e, options) { + this.maximumSelectionLength = options.get('maximumSelectionLength'); + + decorated.call(this, $e, options); + } + + MaximumSelectionLength.prototype.query = + function (decorated, params, callback) { + var self = this; + + this.current(function (currentData) { + var count = currentData != null ? currentData.length : 0; + if (self.maximumSelectionLength > 0 && + count >= self.maximumSelectionLength) { + self.trigger('results:message', { + message: 'maximumSelected', + args: { + maximum: self.maximumSelectionLength + } + }); + return; + } + decorated.call(self, params, callback); + }); + }; + + return MaximumSelectionLength; +}); + +S2.define('select2/dropdown',[ + 'jquery', + './utils' +], function ($, Utils) { + function Dropdown ($element, options) { + this.$element = $element; + this.options = options; + + Dropdown.__super__.constructor.call(this); + } + + Utils.Extend(Dropdown, Utils.Observable); + + Dropdown.prototype.render = function () { + var $dropdown = $( + '<span class="select2-dropdown">' + + '<span class="select2-results"></span>' + + '</span>' + ); + + $dropdown.attr('dir', this.options.get('dir')); + + this.$dropdown = $dropdown; + + return $dropdown; + }; + + Dropdown.prototype.position = function ($dropdown, $container) { + // Should be implmented in subclasses + }; + + Dropdown.prototype.destroy = function () { + // Remove the dropdown from the DOM + this.$dropdown.remove(); + }; + + return Dropdown; +}); + +S2.define('select2/dropdown/search',[ + 'jquery', + '../utils' +], function ($, Utils) { + function Search () { } + + Search.prototype.render = function (decorated) { + var $rendered = decorated.call(this); + + var $search = $( + '<span class="select2-search select2-search--dropdown">' + + '<input class="select2-search__field" type="search" tabindex="-1"' + + ' autocomplete="off" autocorrect="off" autocapitalize="off"' + + ' spellcheck="false" role="textbox" />' + + '</span>' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + $rendered.prepend($search); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + this.$search.on('keydown', function (evt) { + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + }); + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$search.on('input', function (evt) { + // Unbind the duplicated `keyup` event + $(this).off('keyup'); + }); + + this.$search.on('keyup input', function (evt) { + self.handleSearch(evt); + }); + + container.on('open', function () { + self.$search.attr('tabindex', 0); + + self.$search.focus(); + + window.setTimeout(function () { + self.$search.focus(); + }, 0); + }); + + container.on('close', function () { + self.$search.attr('tabindex', -1); + + self.$search.val(''); + }); + + container.on('results:all', function (params) { + if (params.query.term == null || params.query.term === '') { + var showSearch = self.showSearch(params); + + if (showSearch) { + self.$searchContainer.removeClass('select2-search--hide'); + } else { + self.$searchContainer.addClass('select2-search--hide'); + } + } + }); + }; + + Search.prototype.handleSearch = function (evt) { + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.showSearch = function (_, params) { + return true; + }; + + return Search; +}); + +S2.define('select2/dropdown/hidePlaceholder',[ + +], function () { + function HidePlaceholder (decorated, $element, options, dataAdapter) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options, dataAdapter); + } + + HidePlaceholder.prototype.append = function (decorated, data) { + data.results = this.removePlaceholder(data.results); + + decorated.call(this, data); + }; + + HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + HidePlaceholder.prototype.removePlaceholder = function (_, data) { + var modifiedData = data.slice(0); + + for (var d = data.length - 1; d >= 0; d--) { + var item = data[d]; + + if (this.placeholder.id === item.id) { + modifiedData.splice(d, 1); + } + } + + return modifiedData; + }; + + return HidePlaceholder; +}); + +S2.define('select2/dropdown/infiniteScroll',[ + 'jquery' +], function ($) { + function InfiniteScroll (decorated, $element, options, dataAdapter) { + this.lastParams = {}; + + decorated.call(this, $element, options, dataAdapter); + + this.$loadingMore = this.createLoadingMore(); + this.loading = false; + } + + InfiniteScroll.prototype.append = function (decorated, data) { + this.$loadingMore.remove(); + this.loading = false; + + decorated.call(this, data); + + if (this.showLoadingMore(data)) { + this.$results.append(this.$loadingMore); + } + }; + + InfiniteScroll.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('query', function (params) { + self.lastParams = params; + self.loading = true; + }); + + container.on('query:append', function (params) { + self.lastParams = params; + self.loading = true; + }); + + this.$results.on('scroll', function () { + var isLoadMoreVisible = $.contains( + document.documentElement, + self.$loadingMore[0] + ); + + if (self.loading || !isLoadMoreVisible) { + return; + } + + var currentOffset = self.$results.offset().top + + self.$results.outerHeight(false); + var loadingMoreOffset = self.$loadingMore.offset().top + + self.$loadingMore.outerHeight(false); + + if (currentOffset + 50 >= loadingMoreOffset) { + self.loadMore(); + } + }); + }; + + InfiniteScroll.prototype.loadMore = function () { + this.loading = true; + + var params = $.extend({}, {page: 1}, this.lastParams); + + params.page++; + + this.trigger('query:append', params); + }; + + InfiniteScroll.prototype.showLoadingMore = function (_, data) { + return data.pagination && data.pagination.more; + }; + + InfiniteScroll.prototype.createLoadingMore = function () { + var $option = $( + '<li class="option load-more" role="treeitem"></li>' + ); + + var message = this.options.get('translations').get('loadingMore'); + + $option.html(message(this.lastParams)); + + return $option; + }; + + return InfiniteScroll; +}); + +S2.define('select2/dropdown/attachBody',[ + 'jquery', + '../utils' +], function ($, Utils) { + function AttachBody (decorated, $element, options) { + this.$dropdownParent = options.get('dropdownParent') || document.body; + + decorated.call(this, $element, options); + } + + AttachBody.prototype.bind = function (decorated, container, $container) { + var self = this; + + var setupResultsEvents = false; + + decorated.call(this, container, $container); + + container.on('open', function () { + self._showDropdown(); + self._attachPositioningHandler(container); + + if (!setupResultsEvents) { + setupResultsEvents = true; + + container.on('results:all', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:append', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + } + }); + + container.on('close', function () { + self._hideDropdown(); + self._detachPositioningHandler(container); + }); + + this.$dropdownContainer.on('mousedown', function (evt) { + evt.stopPropagation(); + }); + }; + + AttachBody.prototype.position = function (decorated, $dropdown, $container) { + // Clone all of the container classes + $dropdown.attr('class', $container.attr('class')); + + $dropdown.removeClass('select2'); + $dropdown.addClass('select2-container--open'); + + $dropdown.css({ + position: 'absolute', + top: -999999 + }); + + this.$container = $container; + }; + + AttachBody.prototype.render = function (decorated) { + var $container = $('<span></span>'); + + var $dropdown = decorated.call(this); + $container.append($dropdown); + + this.$dropdownContainer = $container; + + return $container; + }; + + AttachBody.prototype._hideDropdown = function (decorated) { + this.$dropdownContainer.detach(); + }; + + AttachBody.prototype._attachPositioningHandler = function (container) { + var self = this; + + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.each(function () { + $(this).data('select2-scroll-position', { + x: $(this).scrollLeft(), + y: $(this).scrollTop() + }); + }); + + $watchers.on(scrollEvent, function (ev) { + var position = $(this).data('select2-scroll-position'); + $(this).scrollTop(position.y); + }); + + $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, + function (e) { + self._positionDropdown(); + self._resizeDropdown(); + }); + }; + + AttachBody.prototype._detachPositioningHandler = function (container) { + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.off(scrollEvent); + + $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); + }; + + AttachBody.prototype._positionDropdown = function () { + var $window = $(window); + + var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); + var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); + + var newDirection = null; + + var position = this.$container.position(); + var offset = this.$container.offset(); + + offset.bottom = offset.top + this.$container.outerHeight(false); + + var container = { + height: this.$container.outerHeight(false) + }; + + container.top = offset.top; + container.bottom = offset.top + container.height; + + var dropdown = { + height: this.$dropdown.outerHeight(false) + }; + + var viewport = { + top: $window.scrollTop(), + bottom: $window.scrollTop() + $window.height() + }; + + var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); + var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); + + var css = { + left: offset.left, + top: container.bottom + }; + + if (!isCurrentlyAbove && !isCurrentlyBelow) { + newDirection = 'below'; + } + + if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { + newDirection = 'above'; + } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { + newDirection = 'below'; + } + + if (newDirection == 'above' || + (isCurrentlyAbove && newDirection !== 'below')) { + css.top = container.top - dropdown.height; + } + + if (newDirection != null) { + this.$dropdown + .removeClass('select2-dropdown--below select2-dropdown--above') + .addClass('select2-dropdown--' + newDirection); + this.$container + .removeClass('select2-container--below select2-container--above') + .addClass('select2-container--' + newDirection); + } + + this.$dropdownContainer.css(css); + }; + + AttachBody.prototype._resizeDropdown = function () { + this.$dropdownContainer.width(); + + var css = { + width: this.$container.outerWidth(false) + 'px' + }; + + if (this.options.get('dropdownAutoWidth')) { + css.minWidth = css.width; + css.width = 'auto'; + } + + this.$dropdown.css(css); + }; + + AttachBody.prototype._showDropdown = function (decorated) { + this.$dropdownContainer.appendTo(this.$dropdownParent); + + this._positionDropdown(); + this._resizeDropdown(); + }; + + return AttachBody; +}); + +S2.define('select2/dropdown/minimumResultsForSearch',[ + +], function () { + function countResults (data) { + var count = 0; + + for (var d = 0; d < data.length; d++) { + var item = data[d]; + + if (item.children) { + count += countResults(item.children); + } else { + count++; + } + } + + return count; + } + + function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { + this.minimumResultsForSearch = options.get('minimumResultsForSearch'); + + if (this.minimumResultsForSearch < 0) { + this.minimumResultsForSearch = Infinity; + } + + decorated.call(this, $element, options, dataAdapter); + } + + MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { + if (countResults(params.data.results) < this.minimumResultsForSearch) { + return false; + } + + return decorated.call(this, params); + }; + + return MinimumResultsForSearch; +}); + +S2.define('select2/dropdown/selectOnClose',[ + +], function () { + function SelectOnClose () { } + + SelectOnClose.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('close', function () { + self._handleSelectOnClose(); + }); + }; + + SelectOnClose.prototype._handleSelectOnClose = function () { + var $highlightedResults = this.getHighlightedResults(); + + if ($highlightedResults.length < 1) { + return; + } + + this.trigger('select', { + data: $highlightedResults.data('data') + }); + }; + + return SelectOnClose; +}); + +S2.define('select2/dropdown/closeOnSelect',[ + +], function () { + function CloseOnSelect () { } + + CloseOnSelect.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('select', function (evt) { + self._selectTriggered(evt); + }); + + container.on('unselect', function (evt) { + self._selectTriggered(evt); + }); + }; + + CloseOnSelect.prototype._selectTriggered = function (_, evt) { + var originalEvent = evt.originalEvent; + + // Don't close if the control key is being held + if (originalEvent && originalEvent.ctrlKey) { + return; + } + + this.trigger('close'); + }; + + return CloseOnSelect; +}); + +S2.define('select2/i18n/en',[],function () { + // English + return { + errorLoading: function () { + return 'The results could not be loaded.'; + }, + inputTooLong: function (args) { + var overChars = args.input.length - args.maximum; + + var message = 'Please delete ' + overChars + ' character'; + + if (overChars != 1) { + message += 's'; + } + + return message; + }, + inputTooShort: function (args) { + var remainingChars = args.minimum - args.input.length; + + var message = 'Please enter ' + remainingChars + ' or more characters'; + + return message; + }, + loadingMore: function () { + return 'Loading more results…'; + }, + maximumSelected: function (args) { + var message = 'You can only select ' + args.maximum + ' item'; + + if (args.maximum != 1) { + message += 's'; + } + + return message; + }, + noResults: function () { + return 'No results found'; + }, + searching: function () { + return 'Searching…'; + } + }; +}); + +S2.define('select2/defaults',[ + 'jquery', + 'require', + + './results', + + './selection/single', + './selection/multiple', + './selection/placeholder', + './selection/allowClear', + './selection/search', + './selection/eventRelay', + + './utils', + './translation', + './diacritics', + + './data/select', + './data/array', + './data/ajax', + './data/tags', + './data/tokenizer', + './data/minimumInputLength', + './data/maximumInputLength', + './data/maximumSelectionLength', + + './dropdown', + './dropdown/search', + './dropdown/hidePlaceholder', + './dropdown/infiniteScroll', + './dropdown/attachBody', + './dropdown/minimumResultsForSearch', + './dropdown/selectOnClose', + './dropdown/closeOnSelect', + + './i18n/en' +], function ($, require, + + ResultsList, + + SingleSelection, MultipleSelection, Placeholder, AllowClear, + SelectionSearch, EventRelay, + + Utils, Translation, DIACRITICS, + + SelectData, ArrayData, AjaxData, Tags, Tokenizer, + MinimumInputLength, MaximumInputLength, MaximumSelectionLength, + + Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, + AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, + + EnglishTranslation) { + function Defaults () { + this.reset(); + } + + Defaults.prototype.apply = function (options) { + options = $.extend({}, this.defaults, options); + + if (options.dataAdapter == null) { + if (options.ajax != null) { + options.dataAdapter = AjaxData; + } else if (options.data != null) { + options.dataAdapter = ArrayData; + } else { + options.dataAdapter = SelectData; + } + + if (options.minimumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MinimumInputLength + ); + } + + if (options.maximumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumInputLength + ); + } + + if (options.maximumSelectionLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumSelectionLength + ); + } + + if (options.tags) { + options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); + } + + if (options.tokenSeparators != null || options.tokenizer != null) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Tokenizer + ); + } + + if (options.query != null) { + var Query = require(options.amdBase + 'compat/query'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Query + ); + } + + if (options.initSelection != null) { + var InitSelection = require(options.amdBase + 'compat/initSelection'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + InitSelection + ); + } + } + + if (options.resultsAdapter == null) { + options.resultsAdapter = ResultsList; + + if (options.ajax != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + InfiniteScroll + ); + } + + if (options.placeholder != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + HidePlaceholder + ); + } + + if (options.selectOnClose) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + SelectOnClose + ); + } + } + + if (options.dropdownAdapter == null) { + if (options.multiple) { + options.dropdownAdapter = Dropdown; + } else { + var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); + + options.dropdownAdapter = SearchableDropdown; + } + + if (options.minimumResultsForSearch !== 0) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + MinimumResultsForSearch + ); + } + + if (options.closeOnSelect) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + CloseOnSelect + ); + } + + if ( + options.dropdownCssClass != null || + options.dropdownCss != null || + options.adaptDropdownCssClass != null + ) { + var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + DropdownCSS + ); + } + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + AttachBody + ); + } + + if (options.selectionAdapter == null) { + if (options.multiple) { + options.selectionAdapter = MultipleSelection; + } else { + options.selectionAdapter = SingleSelection; + } + + // Add the placeholder mixin if a placeholder was specified + if (options.placeholder != null) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + Placeholder + ); + } + + if (options.allowClear) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + AllowClear + ); + } + + if (options.multiple) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + SelectionSearch + ); + } + + if ( + options.containerCssClass != null || + options.containerCss != null || + options.adaptContainerCssClass != null + ) { + var ContainerCSS = require(options.amdBase + 'compat/containerCss'); + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + ContainerCSS + ); + } + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + EventRelay + ); + } + + if (typeof options.language === 'string') { + // Check if the language is specified with a region + if (options.language.indexOf('-') > 0) { + // Extract the region information if it is included + var languageParts = options.language.split('-'); + var baseLanguage = languageParts[0]; + + options.language = [options.language, baseLanguage]; + } else { + options.language = [options.language]; + } + } + + if ($.isArray(options.language)) { + var languages = new Translation(); + options.language.push('en'); + + var languageNames = options.language; + + for (var l = 0; l < languageNames.length; l++) { + var name = languageNames[l]; + var language = {}; + + try { + // Try to load it with the original name + language = Translation.loadPath(name); + } catch (e) { + try { + // If we couldn't load it, check if it wasn't the full path + name = this.defaults.amdLanguageBase + name; + language = Translation.loadPath(name); + } catch (ex) { + // The translation could not be loaded at all. Sometimes this is + // because of a configuration problem, other times this can be + // because of how Select2 helps load all possible translation files. + if (options.debug && window.console && console.warn) { + console.warn( + 'Select2: The language file for "' + name + '" could not be ' + + 'automatically loaded. A fallback will be used instead.' + ); + } + + continue; + } + } + + languages.extend(language); + } + + options.translations = languages; + } else { + var baseTranslation = Translation.loadPath( + this.defaults.amdLanguageBase + 'en' + ); + var customTranslation = new Translation(options.language); + + customTranslation.extend(baseTranslation); + + options.translations = customTranslation; + } + + return options; + }; + + Defaults.prototype.reset = function () { + function stripDiacritics (text) { + // Used 'uni range + named function' from http://jsperf.com/diacritics/18 + function match(a) { + return DIACRITICS[a] || a; + } + + return text.replace(/[^\u0000-\u007E]/g, match); + } + + function matcher (params, data) { + // Always return the object if there is nothing to compare + if ($.trim(params.term) === '') { + return data; + } + + // Do a recursive check for options with children + if (data.children && data.children.length > 0) { + // Clone the data object if there are children + // This is required as we modify the object to remove any non-matches + var match = $.extend(true, {}, data); + + // Check each child of the option + for (var c = data.children.length - 1; c >= 0; c--) { + var child = data.children[c]; + + var matches = matcher(params, child); + + // If there wasn't a match, remove the object in the array + if (matches == null) { + match.children.splice(c, 1); + } + } + + // If any children matched, return the new object + if (match.children.length > 0) { + return match; + } + + // If there were no matching children, check just the plain object + return matcher(params, match); + } + + var original = stripDiacritics(data.text).toUpperCase(); + var term = stripDiacritics(params.term).toUpperCase(); + + // Check if the text contains the term + if (original.indexOf(term) > -1) { + return data; + } + + // If it doesn't contain the term, don't return anything + return null; + } + + this.defaults = { + amdBase: './', + amdLanguageBase: './i18n/', + closeOnSelect: true, + debug: false, + dropdownAutoWidth: false, + escapeMarkup: Utils.escapeMarkup, + language: EnglishTranslation, + matcher: matcher, + minimumInputLength: 0, + maximumInputLength: 0, + maximumSelectionLength: 0, + minimumResultsForSearch: 0, + selectOnClose: false, + sorter: function (data) { + return data; + }, + templateResult: function (result) { + return result.text; + }, + templateSelection: function (selection) { + return selection.text; + }, + theme: 'default', + width: 'resolve' + }; + }; + + Defaults.prototype.set = function (key, value) { + var camelKey = $.camelCase(key); + + var data = {}; + data[camelKey] = value; + + var convertedData = Utils._convertData(data); + + $.extend(this.defaults, convertedData); + }; + + var defaults = new Defaults(); + + return defaults; +}); + +S2.define('select2/options',[ + 'require', + 'jquery', + './defaults', + './utils' +], function (require, $, Defaults, Utils) { + function Options (options, $element) { + this.options = options; + + if ($element != null) { + this.fromElement($element); + } + + this.options = Defaults.apply(this.options); + + if ($element && $element.is('input')) { + var InputCompat = require(this.get('amdBase') + 'compat/inputData'); + + this.options.dataAdapter = Utils.Decorate( + this.options.dataAdapter, + InputCompat + ); + } + } + + Options.prototype.fromElement = function ($e) { + var excludedData = ['select2']; + + if (this.options.multiple == null) { + this.options.multiple = $e.prop('multiple'); + } + + if (this.options.disabled == null) { + this.options.disabled = $e.prop('disabled'); + } + + if (this.options.language == null) { + if ($e.prop('lang')) { + this.options.language = $e.prop('lang').toLowerCase(); + } else if ($e.closest('[lang]').prop('lang')) { + this.options.language = $e.closest('[lang]').prop('lang'); + } + } + + if (this.options.dir == null) { + if ($e.prop('dir')) { + this.options.dir = $e.prop('dir'); + } else if ($e.closest('[dir]').prop('dir')) { + this.options.dir = $e.closest('[dir]').prop('dir'); + } else { + this.options.dir = 'ltr'; + } + } + + $e.prop('disabled', this.options.disabled); + $e.prop('multiple', this.options.multiple); + + if ($e.data('select2Tags')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-select2-tags` attribute has been changed to ' + + 'use the `data-data` and `data-tags="true"` attributes and will be ' + + 'removed in future versions of Select2.' + ); + } + + $e.data('data', $e.data('select2Tags')); + $e.data('tags', true); + } + + if ($e.data('ajaxUrl')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-ajax-url` attribute has been changed to ' + + '`data-ajax--url` and support for the old attribute will be removed' + + ' in future versions of Select2.' + ); + } + + $e.attr('ajax--url', $e.data('ajaxUrl')); + $e.data('ajax--url', $e.data('ajaxUrl')); + } + + var dataset = {}; + + // Prefer the element's `dataset` attribute if it exists + // jQuery 1.x does not correctly handle data attributes with multiple dashes + if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { + dataset = $.extend(true, {}, $e[0].dataset, $e.data()); + } else { + dataset = $e.data(); + } + + var data = $.extend(true, {}, dataset); + + data = Utils._convertData(data); + + for (var key in data) { + if ($.inArray(key, excludedData) > -1) { + continue; + } + + if ($.isPlainObject(this.options[key])) { + $.extend(this.options[key], data[key]); + } else { + this.options[key] = data[key]; + } + } + + return this; + }; + + Options.prototype.get = function (key) { + return this.options[key]; + }; + + Options.prototype.set = function (key, val) { + this.options[key] = val; + }; + + return Options; +}); + +S2.define('select2/core',[ + 'jquery', + './options', + './utils', + './keys' +], function ($, Options, Utils, KEYS) { + var Select2 = function ($element, options) { + if ($element.data('select2') != null) { + $element.data('select2').destroy(); + } + + this.$element = $element; + + this.id = this._generateId($element); + + options = options || {}; + + this.options = new Options(options, $element); + + Select2.__super__.constructor.call(this); + + // Set up the tabindex + + var tabindex = $element.attr('tabindex') || 0; + $element.data('old-tabindex', tabindex); + $element.attr('tabindex', '-1'); + + // Set up containers and adapters + + var DataAdapter = this.options.get('dataAdapter'); + this.dataAdapter = new DataAdapter($element, this.options); + + var $container = this.render(); + + this._placeContainer($container); + + var SelectionAdapter = this.options.get('selectionAdapter'); + this.selection = new SelectionAdapter($element, this.options); + this.$selection = this.selection.render(); + + this.selection.position(this.$selection, $container); + + var DropdownAdapter = this.options.get('dropdownAdapter'); + this.dropdown = new DropdownAdapter($element, this.options); + this.$dropdown = this.dropdown.render(); + + this.dropdown.position(this.$dropdown, $container); + + var ResultsAdapter = this.options.get('resultsAdapter'); + this.results = new ResultsAdapter($element, this.options, this.dataAdapter); + this.$results = this.results.render(); + + this.results.position(this.$results, this.$dropdown); + + // Bind events + + var self = this; + + // Bind the container to all of the adapters + this._bindAdapters(); + + // Register any DOM event handlers + this._registerDomEvents(); + + // Register any internal event handlers + this._registerDataEvents(); + this._registerSelectionEvents(); + this._registerDropdownEvents(); + this._registerResultsEvents(); + this._registerEvents(); + + // Set the initial state + this.dataAdapter.current(function (initialData) { + self.trigger('selection:update', { + data: initialData + }); + }); + + // Hide the original select + $element.addClass('select2-hidden-accessible'); + $element.attr('aria-hidden', 'true'); + + // Synchronize any monitored attributes + this._syncAttributes(); + + $element.data('select2', this); + }; + + Utils.Extend(Select2, Utils.Observable); + + Select2.prototype._generateId = function ($element) { + var id = ''; + + if ($element.attr('id') != null) { + id = $element.attr('id'); + } else if ($element.attr('name') != null) { + id = $element.attr('name') + '-' + Utils.generateChars(2); + } else { + id = Utils.generateChars(4); + } + + id = 'select2-' + id; + + return id; + }; + + Select2.prototype._placeContainer = function ($container) { + $container.insertAfter(this.$element); + + var width = this._resolveWidth(this.$element, this.options.get('width')); + + if (width != null) { + $container.css('width', width); + } + }; + + Select2.prototype._resolveWidth = function ($element, method) { + var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; + + if (method == 'resolve') { + var styleWidth = this._resolveWidth($element, 'style'); + + if (styleWidth != null) { + return styleWidth; + } + + return this._resolveWidth($element, 'element'); + } + + if (method == 'element') { + var elementWidth = $element.outerWidth(false); + + if (elementWidth <= 0) { + return 'auto'; + } + + return elementWidth + 'px'; + } + + if (method == 'style') { + var style = $element.attr('style'); + + if (typeof(style) !== 'string') { + return null; + } + + var attrs = style.split(';'); + + for (var i = 0, l = attrs.length; i < l; i = i + 1) { + var attr = attrs[i].replace(/\s/g, ''); + var matches = attr.match(WIDTH); + + if (matches !== null && matches.length >= 1) { + return matches[1]; + } + } + + return null; + } + + return method; + }; + + Select2.prototype._bindAdapters = function () { + this.dataAdapter.bind(this, this.$container); + this.selection.bind(this, this.$container); + + this.dropdown.bind(this, this.$container); + this.results.bind(this, this.$container); + }; + + Select2.prototype._registerDomEvents = function () { + var self = this; + + this.$element.on('change.select2', function () { + self.dataAdapter.current(function (data) { + self.trigger('selection:update', { + data: data + }); + }); + }); + + this._sync = Utils.bind(this._syncAttributes, this); + + if (this.$element[0].attachEvent) { + this.$element[0].attachEvent('onpropertychange', this._sync); + } + + var observer = window.MutationObserver || + window.WebKitMutationObserver || + window.MozMutationObserver + ; + + if (observer != null) { + this._observer = new observer(function (mutations) { + $.each(mutations, self._sync); + }); + this._observer.observe(this.$element[0], { + attributes: true, + subtree: false + }); + } else if (this.$element[0].addEventListener) { + this.$element[0].addEventListener('DOMAttrModified', self._sync, false); + } + }; + + Select2.prototype._registerDataEvents = function () { + var self = this; + + this.dataAdapter.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerSelectionEvents = function () { + var self = this; + var nonRelayEvents = ['toggle']; + + this.selection.on('toggle', function () { + self.toggleDropdown(); + }); + + this.selection.on('*', function (name, params) { + if ($.inArray(name, nonRelayEvents) !== -1) { + return; + } + + self.trigger(name, params); + }); + }; + + Select2.prototype._registerDropdownEvents = function () { + var self = this; + + this.dropdown.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerResultsEvents = function () { + var self = this; + + this.results.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerEvents = function () { + var self = this; + + this.on('open', function () { + self.$container.addClass('select2-container--open'); + }); + + this.on('close', function () { + self.$container.removeClass('select2-container--open'); + }); + + this.on('enable', function () { + self.$container.removeClass('select2-container--disabled'); + }); + + this.on('disable', function () { + self.$container.addClass('select2-container--disabled'); + }); + + this.on('focus', function () { + self.$container.addClass('select2-container--focus'); + }); + + this.on('blur', function () { + self.$container.removeClass('select2-container--focus'); + }); + + this.on('query', function (params) { + if (!self.isOpen()) { + self.trigger('open'); + } + + this.dataAdapter.query(params, function (data) { + self.trigger('results:all', { + data: data, + query: params + }); + }); + }); + + this.on('query:append', function (params) { + this.dataAdapter.query(params, function (data) { + self.trigger('results:append', { + data: data, + query: params + }); + }); + }); + + this.on('keypress', function (evt) { + var key = evt.which; + + if (self.isOpen()) { + if (key === KEYS.ENTER) { + self.trigger('results:select'); + + evt.preventDefault(); + } else if ((key === KEYS.SPACE && evt.ctrlKey)) { + self.trigger('results:toggle'); + + evt.preventDefault(); + } else if (key === KEYS.UP) { + self.trigger('results:previous'); + + evt.preventDefault(); + } else if (key === KEYS.DOWN) { + self.trigger('results:next'); + + evt.preventDefault(); + } else if (key === KEYS.ESC || key === KEYS.TAB) { + self.close(); + + evt.preventDefault(); + } + } else { + if (key === KEYS.ENTER || key === KEYS.SPACE || + ((key === KEYS.DOWN || key === KEYS.UP) && evt.altKey)) { + self.open(); + + evt.preventDefault(); + } + } + }); + }; + + Select2.prototype._syncAttributes = function () { + this.options.set('disabled', this.$element.prop('disabled')); + + if (this.options.get('disabled')) { + if (this.isOpen()) { + this.close(); + } + + this.trigger('disable'); + } else { + this.trigger('enable'); + } + }; + + /** + * Override the trigger method to automatically trigger pre-events when + * there are events that can be prevented. + */ + Select2.prototype.trigger = function (name, args) { + var actualTrigger = Select2.__super__.trigger; + var preTriggerMap = { + 'open': 'opening', + 'close': 'closing', + 'select': 'selecting', + 'unselect': 'unselecting' + }; + + if (name in preTriggerMap) { + var preTriggerName = preTriggerMap[name]; + var preTriggerArgs = { + prevented: false, + name: name, + args: args + }; + + actualTrigger.call(this, preTriggerName, preTriggerArgs); + + if (preTriggerArgs.prevented) { + args.prevented = true; + + return; + } + } + + actualTrigger.call(this, name, args); + }; + + Select2.prototype.toggleDropdown = function () { + if (this.options.get('disabled')) { + return; + } + + if (this.isOpen()) { + this.close(); + } else { + this.open(); + } + }; + + Select2.prototype.open = function () { + if (this.isOpen()) { + return; + } + + this.trigger('query', {}); + + this.trigger('open'); + }; + + Select2.prototype.close = function () { + if (!this.isOpen()) { + return; + } + + this.trigger('close'); + }; + + Select2.prototype.isOpen = function () { + return this.$container.hasClass('select2-container--open'); + }; + + Select2.prototype.enable = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("enable")` method has been deprecated and will' + + ' be removed in later Select2 versions. Use $element.prop("disabled")' + + ' instead.' + ); + } + + if (args == null || args.length === 0) { + args = [true]; + } + + var disabled = !args[0]; + + this.$element.prop('disabled', disabled); + }; + + Select2.prototype.data = function () { + if (this.options.get('debug') && + arguments.length > 0 && window.console && console.warn) { + console.warn( + 'Select2: Data can no longer be set using `select2("data")`. You ' + + 'should consider setting the value instead using `$element.val()`.' + ); + } + + var data = []; + + this.dataAdapter.current(function (currentData) { + data = currentData; + }); + + return data; + }; + + Select2.prototype.val = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("val")` method has been deprecated and will be' + + ' removed in later Select2 versions. Use $element.val() instead.' + ); + } + + if (args == null || args.length === 0) { + return this.$element.val(); + } + + var newVal = args[0]; + + if ($.isArray(newVal)) { + newVal = $.map(newVal, function (obj) { + return obj.toString(); + }); + } + + this.$element.val(newVal).trigger('change'); + }; + + Select2.prototype.destroy = function () { + this.$container.remove(); + + if (this.$element[0].detachEvent) { + this.$element[0].detachEvent('onpropertychange', this._sync); + } + + if (this._observer != null) { + this._observer.disconnect(); + this._observer = null; + } else if (this.$element[0].removeEventListener) { + this.$element[0] + .removeEventListener('DOMAttrModified', this._sync, false); + } + + this._sync = null; + + this.$element.off('.select2'); + this.$element.attr('tabindex', this.$element.data('old-tabindex')); + + this.$element.removeClass('select2-hidden-accessible'); + this.$element.attr('aria-hidden', 'false'); + this.$element.removeData('select2'); + + this.dataAdapter.destroy(); + this.selection.destroy(); + this.dropdown.destroy(); + this.results.destroy(); + + this.dataAdapter = null; + this.selection = null; + this.dropdown = null; + this.results = null; + }; + + Select2.prototype.render = function () { + var $container = $( + '<span class="select2 select2-container">' + + '<span class="selection"></span>' + + '<span class="dropdown-wrapper" aria-hidden="true"></span>' + + '</span>' + ); + + $container.attr('dir', this.options.get('dir')); + + this.$container = $container; + + this.$container.addClass('select2-container--' + this.options.get('theme')); + + $container.data('element', this.$element); + + return $container; + }; + + return Select2; +}); + +S2.define('jquery.select2',[ + 'jquery', + 'require', + + './select2/core', + './select2/defaults' +], function ($, require, Select2, Defaults) { + // Force jQuery.mousewheel to be loaded if it hasn't already + require('jquery.mousewheel'); + + if ($.fn.select2 == null) { + // All methods that should return the element + var thisMethods = ['open', 'close', 'destroy']; + + $.fn.select2 = function (options) { + options = options || {}; + + if (typeof options === 'object') { + this.each(function () { + var instanceOptions = $.extend({}, options, true); + + var instance = new Select2($(this), instanceOptions); + }); + + return this; + } else if (typeof options === 'string') { + var instance = this.data('select2'); + + if (instance == null && window.console && console.error) { + console.error( + 'The select2(\'' + options + '\') method was called on an ' + + 'element that is not using Select2.' + ); + } + + var args = Array.prototype.slice.call(arguments, 1); + + var ret = instance[options](args); + + // Check if we should be returning `this` + if ($.inArray(options, thisMethods) > -1) { + return this; + } + + return ret; + } else { + throw new Error('Invalid arguments for Select2: ' + options); + } + }; + } + + if ($.fn.select2.defaults == null) { + $.fn.select2.defaults = Defaults; + } + + return Select2; +}); + +S2.define('jquery.mousewheel',[ + 'jquery' +], function ($) { + // Used to shim jQuery.mousewheel for non-full builds. + return $; +}); + + // Return the AMD loader configuration so it can be used outside of this file + return { + define: S2.define, + require: S2.require + }; +}()); + + // Autoload the jQuery bindings + // We know that all of the modules exist above this, so we're safe + var select2 = S2.require('jquery.select2'); + + // Hold the AMD module references on the jQuery function that was just loaded + // This allows Select2 to use the internal loader outside of this file, such + // as in the language files. + jQuery.fn.select2.amd = S2; + + // Return the Select2 instance for anyone who is importing it. + return select2; +})); diff --git a/theme/bootstrap/plugins/select2/select2.min.css b/theme/bootstrap/plugins/select2/select2.min.css new file mode 100644 index 0000000..c2da051 --- /dev/null +++ b/theme/bootstrap/plugins/select2/select2.min.css @@ -0,0 +1 @@ +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle;}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none;}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px;}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none;}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap;}.select2-container .select2-search--inline{float:left;}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none;}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:0px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051;}.select2-results{display:block;}.select2-results__options{list-style:none;margin:0;padding:0;}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none;}.select2-results__option[aria-selected]{cursor:pointer;}.select2-container--open .select2-dropdown{left:0;}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0;}.select2-search--dropdown{display:block;padding:4px;}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box;}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none;}.select2-search--dropdown.select2-search--hide{display:none;}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0);}.select2-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:px;}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px;}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999;}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px;}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0;}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left;}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto;}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default;}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none;}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px;}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%;}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left;}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px;}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px;}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px;}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333;}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder{float:right;}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto;}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto;}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0;}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default;}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none;}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0;}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0;}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa;}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto;}.select2-container--default .select2-results__option[role=group]{padding:0;}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999;}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd;}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em;}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0;}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em;}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em;}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em;}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em;}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em;}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white;}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px;}.select2-container--classic .select2-selection--single{background-color:#f6f6f6;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #ffffff 50%, #eeeeee 100%);background-image:-o-linear-gradient(top, #ffffff 50%, #eeeeee 100%);background-image:linear-gradient(to bottom, #ffffff 50%, #eeeeee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb;}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px;}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px;}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999;}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%);background-image:-o-linear-gradient(top, #eeeeee 50%, #cccccc 100%);background-image:linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#cccccc', GradientType=0);}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0;}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left;}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto;}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb;}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none;}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px;}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #ffffff 0%, #eeeeee 50%);background-image:-o-linear-gradient(top, #ffffff 0%, #eeeeee 50%);background-image:linear-gradient(to bottom, #ffffff 0%, #eeeeee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eeeeee 50%, #ffffff 100%);background-image:-o-linear-gradient(top, #eeeeee 50%, #ffffff 100%);background-image:linear-gradient(to bottom, #eeeeee 50%, #ffffff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0;}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb;}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px;}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none;}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px;}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px;}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555;}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto;}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto;}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb;}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0;}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0;}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;}.select2-container--classic .select2-dropdown{background-color:white;border:1px solid transparent;}.select2-container--classic .select2-dropdown--above{border-bottom:none;}.select2-container--classic .select2-dropdown--below{border-top:none;}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto;}.select2-container--classic .select2-results__option[role=group]{padding:0;}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey;}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:white;}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px;}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb;} \ No newline at end of file diff --git a/theme/bootstrap/plugins/select2/select2.min.js b/theme/bootstrap/plugins/select2/select2.min.js new file mode 100644 index 0000000..49a988c --- /dev/null +++ b/theme/bootstrap/plugins/select2/select2.min.js @@ -0,0 +1,2 @@ +/*! Select2 4.0.0 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return u.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n=b&&b.split("/"),o=s.map,p=o&&o["*"]||{};if(a&&"."===a.charAt(0))if(b){for(n=n.slice(0,n.length-1),a=a.split("/"),g=a.length-1,s.nodeIdCompat&&w.test(a[g])&&(a[g]=a[g].replace(w,"")),a=n.concat(a),k=0;k<a.length;k+=1)if(m=a[k],"."===m)a.splice(k,1),k-=1;else if(".."===m){if(1===k&&(".."===a[2]||".."===a[0]))break;k>0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}else 0===a.indexOf("./")&&(a=a.substring(2));if((n||p)&&o){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),n)for(l=n.length;l>0;l-=1)if(e=o[n.slice(0,l).join("/")],e&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&p&&p[d]&&(i=p[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){return n.apply(b,v.call(arguments,0).concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){q[a]=b}}function j(a){if(e(r,a)){var c=r[a];delete r[a],t[a]=!0,m.apply(b,c)}if(!e(q,a)&&!e(t,a))throw new Error("No "+a);return q[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return function(){return s&&s.config&&s.config[a]||{}}}var m,n,o,p,q={},r={},s={},t={},u=Object.prototype.hasOwnProperty,v=[].slice,w=/\.js$/;o=function(a,b){var c,d=k(a),e=d[0];return a=d[1],e&&(e=f(e,b),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(b)):f(a,b):(a=f(a,b),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},p={require:function(a){return g(a)},exports:function(a){var b=q[a];return"undefined"!=typeof b?b:q[a]={}},module:function(a){return{id:a,uri:"",exports:q[a],config:l(a)}}},m=function(a,c,d,f){var h,k,l,m,n,s,u=[],v=typeof d;if(f=f||a,"undefined"===v||"function"===v){for(c=!c.length&&d.length?["require","exports","module"]:c,n=0;n<c.length;n+=1)if(m=o(c[n],f),k=m.f,"require"===k)u[n]=p.require(a);else if("exports"===k)u[n]=p.exports(a),s=!0;else if("module"===k)h=u[n]=p.module(a);else if(e(q,k)||e(r,k)||e(t,k))u[n]=j(k);else{if(!m.p)throw new Error(a+" missing "+k);m.p.load(m.n,g(f,!0),i(k),{}),u[n]=q[k]}l=d?d.apply(q[a],u):void 0,a&&(h&&h.exports!==b&&h.exports!==q[a]?q[a]=h.exports:l===b&&s||(q[a]=l))}else a&&(q[a]=d)},a=c=n=function(a,c,d,e,f){if("string"==typeof a)return p[a]?p[a](c):j(o(a,c).f);if(!a.splice){if(s=a,s.deps&&n(s.deps,s.callback),!c)return;c.splice?(a=c,c=d,d=null):a=b}return c=c||function(){},"function"==typeof d&&(d=e,e=f),e?m(b,a,c,d):setTimeout(function(){m(b,a,c,d)},4),n},n.config=function(a){return n(a)},a._defined=q,d=function(a,b,c){b.splice||(c=b,b=[]),e(q,a)||e(r,a)||(r[a]=[a,b,c])},d.amd={jQuery:!0}}(),b.requirejs=a,b.require=c,b.define=d}}(),b.define("almond",function(){}),b.define("jquery",[],function(){var b=a||$;return null==b&&console&&console.error&&console.error("Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page."),b}),b.define("select2/utils",["jquery"],function(a){function b(a){var b=a.prototype,c=[];for(var d in b){var e=b[d];"function"==typeof e&&"constructor"!==d&&c.push(d)}return c}var c={};c.Extend=function(a,b){function c(){this.constructor=a}var d={}.hasOwnProperty;for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},c.Decorate=function(a,c){function d(){var b=Array.prototype.unshift,d=c.prototype.constructor.length,e=a.prototype.constructor;d>0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;h<g.length;h++){var i=g[h];d.prototype[i]=a.prototype[i]}for(var j=(function(a){var b=function(){};a in d.prototype&&(b=d.prototype[a]);var e=c.prototype[a];return function(){var a=Array.prototype.unshift;return a.call(arguments,b),e.apply(this,arguments)}}),k=0;k<f.length;k++){var l=f[k];d.prototype[l]=j(l)}return d};var d=function(){this.listeners={}};return d.prototype.on=function(a,b){this.listeners=this.listeners||{},a in this.listeners?this.listeners[a].push(b):this.listeners[a]=[b]},d.prototype.trigger=function(a){var b=Array.prototype.slice;this.listeners=this.listeners||{},a in this.listeners&&this.invoke(this.listeners[a],b.call(arguments,1)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},d.prototype.invoke=function(a,b){for(var c=0,d=a.length;d>c;c++)a[c].apply(this,b)},c.Observable=d,c.generateChars=function(a){for(var b="",c=0;a>c;c++){var d=Math.floor(36*Math.random());b+=d.toString(36)}return b},c.bind=function(a,b){return function(){a.apply(b,arguments)}},c._convertData=function(a){for(var b in a){var c=b.split("-"),d=a;if(1!==c.length){for(var e=0;e<c.length;e++){var f=c[e];f=f.substring(0,1).toLowerCase()+f.substring(1),f in d||(d[f]={}),e==c.length-1&&(d[f]=a[b]),d=d[f]}delete a[b]}}return a},c.hasScroll=function(b,c){var d=a(c),e=c.style.overflowX,f=c.style.overflowY;return e!==f||"hidden"!==f&&"visible"!==f?"scroll"===e||"scroll"===f?!0:d.innerHeight()<c.scrollHeight||d.innerWidth()<c.scrollWidth:!1},c.escapeMarkup=function(a){var b={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<ul class="select2-results__options" role="tree"></ul>');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a('<li role="treeitem" class="select2-results__option"></li>'),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),this.$results.append(d)},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c<a.results.length;c++){var d=a.results[c],e=this.option(d);b.push(e)}this.$results.append(b)},c.prototype.position=function(a,b){var c=b.find(".select2-results");c.append(a)},c.prototype.sort=function(a){var b=this.options.get("sorter");return b(a)},c.prototype.setClasses=function(){var b=this;this.data.current(function(c){var d=a.map(c,function(a){return a.id.toString()}),e=b.$results.find(".select2-results__option[aria-selected]");e.each(function(){var b=a(this),c=a.data(this,"data"),e=""+c.id;null!=c.element&&c.element.selected||null==c.element&&a.inArray(e,d)>-1?b.attr("aria-selected","true"):b.attr("aria-selected","false")});var f=e.filter("[aria-selected=true]");f.length>0?f.first().trigger("mouseenter"):e.first().trigger("mouseenter")})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(b){var c=document.createElement("li");c.className="select2-results__option";var d={role:"treeitem","aria-selected":"false"};b.disabled&&(delete d["aria-selected"],d["aria-disabled"]="true"),null==b.id&&delete d["aria-selected"],null!=b._resultId&&(c.id=b._resultId),b.title&&(c.title=b.title),b.children&&(d.role="group",d["aria-label"]=b.text,delete d["aria-selected"]);for(var e in d){var f=d[e];c.setAttribute(e,f)}if(b.children){var g=a(c),h=document.createElement("strong");h.className="select2-results__group";{a(h)}this.template(b,h);for(var i=[],j=0;j<b.children.length;j++){var k=b.children[j],l=this.option(k);i.push(l)}var m=a("<ul></ul>",{"class":"select2-results__options select2-results__options--nested"});m.append(i),g.append(h),g.append(m)}else this.template(b,c);return a.data(c,"data",b),c},c.prototype.bind=function(b){var c=this,d=b.id+"-results";this.$results.attr("id",d),b.on("results:all",function(a){c.clear(),c.append(a.data),b.isOpen()&&c.setClasses()}),b.on("results:append",function(a){c.append(a.data),b.isOpen()&&c.setClasses()}),b.on("query",function(a){c.showLoading(a)}),b.on("select",function(){b.isOpen()&&c.setClasses()}),b.on("unselect",function(){b.isOpen()&&c.setClasses()}),b.on("open",function(){c.$results.attr("aria-expanded","true"),c.$results.attr("aria-hidden","false"),c.setClasses(),c.ensureHighlightVisible()}),b.on("close",function(){c.$results.attr("aria-expanded","false"),c.$results.attr("aria-hidden","true"),c.$results.removeAttr("aria-activedescendant")}),b.on("results:toggle",function(){var a=c.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),b.on("results:select",function(){var a=c.getHighlightedResults();if(0!==a.length){var b=a.data("data");"true"==a.attr("aria-selected")?c.trigger("close"):c.trigger("select",{data:b})}}),b.on("results:previous",function(){var a=c.getHighlightedResults(),b=c.$results.find("[aria-selected]"),d=b.index(a);if(0!==d){var e=d-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger("mouseenter");var g=c.$results.offset().top,h=f.offset().top,i=c.$results.scrollTop()+(h-g);0===e?c.$results.scrollTop(0):0>h-g&&c.$results.scrollTop(i)}}),b.on("results:next",function(){var a=c.getHighlightedResults(),b=c.$results.find("[aria-selected]"),d=b.index(a),e=d+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger("mouseenter");var g=c.$results.offset().top+c.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=c.$results.scrollTop()+h-g;0===e?c.$results.scrollTop(0):h>g&&c.$results.scrollTop(i)}}),b.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted")}),b.on("results:message",function(a){c.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=c.$results.scrollTop(),d=c.$results.get(0).scrollHeight-c.$results.scrollTop()+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&d<=c.$results.height();e?(c.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(c.$results.scrollTop(c.$results.get(0).scrollHeight-c.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(b){var d=a(this),e=d.data("data");return"true"===d.attr("aria-selected")?void(c.options.get("multiple")?c.trigger("unselect",{originalEvent:b,data:e}):c.trigger("close")):void c.trigger("select",{originalEvent:b,data:e})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(){var b=a(this).data("data");c.getHighlightedResults().removeClass("select2-results__option--highlighted"),c.trigger("results:focus",{data:b,element:a(this)})})},c.prototype.getHighlightedResults=function(){var a=this.$results.find(".select2-results__option--highlighted");return a},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[aria-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),2>=c?this.$results.scrollTop(0):(g>this.$results.outerHeight()||0>g)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){var a={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46};return a}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('<span class="select2-selection" role="combobox" aria-autocomplete="list" aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),b.attr("title",this.$element.attr("title")),b.attr("tabindex",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a){var b=this,d=(a.id+"-container",a.id+"-results");this.container=a,this.$selection.on("focus",function(a){b.trigger("focus",a)}),this.$selection.on("blur",function(a){b.trigger("blur",a)}),this.$selection.on("keydown",function(a){b.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){b.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){b.update(a.data)}),a.on("open",function(){b.$selection.attr("aria-expanded","true"),b.$selection.attr("aria-owns",d),b._attachCloseHandler(a)}),a.on("close",function(){b.$selection.attr("aria-expanded","false"),b.$selection.removeAttr("aria-activedescendant"),b.$selection.removeAttr("aria-owns"),b.$selection.focus(),b._detachCloseHandler(a)}),a.on("enable",function(){b.$selection.attr("tabindex",b._tabindex)}),a.on("disable",function(){b.$selection.attr("tabindex","-1")})},d.prototype._attachCloseHandler=function(b){a(document.body).on("mousedown.select2."+b.id,function(b){var c=a(b.target),d=c.closest(".select2"),e=a(".select2.select2-container--open");e.each(function(){var b=a(this);if(this!=d[0]){var c=b.data("element");c.select2("close")}})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){var c=b.find(".selection");c.append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c){function d(){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'),a},d.prototype.bind=function(a){var b=this;d.__super__.bind.apply(this,arguments);var c=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",c),this.$selection.attr("aria-labelledby",c),this.$selection.on("mousedown",function(a){1===a.which&&b.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(){}),this.$selection.on("blur",function(){}),a.on("selection:update",function(a){b.update(a.data)})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a){var b=this.options.get("templateSelection"),c=this.options.get("escapeMarkup");return c(b(a))},d.prototype.selectionContainer=function(){return a("<span></span>")},d.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.display(b),d=this.$selection.find(".select2-selection__rendered");d.empty().append(c),d.prop("title",b.title||b.text)},d}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('<ul class="select2-selection__rendered"></ul>'),a},d.prototype.bind=function(){var b=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){b.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(c){var d=a(this),e=d.parent(),f=e.data("data");b.trigger("unselect",{originalEvent:c,data:f})})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a){var b=this.options.get("templateSelection"),c=this.options.get("escapeMarkup");return c(b(a))},d.prototype.selectionContainer=function(){var b=a('<li class="select2-selection__choice"><span class="select2-selection__choice__remove" role="presentation">&times;</span></li>');return b},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d<a.length;d++){var e=a[d],f=this.display(e),g=this.selectionContainer();g.append(f),g.prop("title",e.title||e.text),g.data("data",e),b.push(g)}var h=this.$selection.find(".select2-selection__rendered");c.appendMany(h,b)}},d}),b.define("select2/selection/placeholder",["../utils"],function(){function a(a,b,c){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c)}return a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.createPlaceholder=function(a,b){var c=this.selectionContainer();return c.html(this.display(b)),c.addClass("select2-selection__placeholder").removeClass("select2-selection__choice"),c},a.prototype.update=function(a,b){var c=1==b.length&&b[0].id!=this.placeholder.id,d=b.length>1;if(d||c)return a.call(this,b);this.clear();var e=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(e)},a}),b.define("select2/selection/allowClear",["jquery","../keys"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var c=this.$selection.find(".select2-selection__clear");if(0!==c.length){b.stopPropagation();for(var d=c.data("data"),e=0;e<d.length;e++){var f={data:d[e]};if(this.trigger("unselect",f),f.prevented)return}this.$element.val(this.placeholder.id).trigger("change"),this.trigger("toggle")}}},c.prototype._handleKeyboardClear=function(a,c,d){d.isOpen()||(c.which==b.DELETE||c.which==b.BACKSPACE)&&this._handleClear(c)},c.prototype.update=function(b,c){if(b.call(this,c),!(this.$selection.find(".select2-selection__placeholder").length>0||0===c.length)){var d=a('<span class="select2-selection__clear">&times;</span>');d.data("data",c),this.$selection.find(".select2-selection__rendered").prepend(d)}},c}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('<li class="select2-search select2-search--inline"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" /></li>');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return d},d.prototype.bind=function(a,b,d){var e=this;a.call(this,b,d),b.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus()}),b.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val(""),e.$search.focus()}),b.on("enable",function(){e.$search.prop("disabled",!1)}),b.on("disable",function(){e.$search.prop("disabled",!0)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e.trigger("blur",a)}),this.$selection.on("keydown",".select2-search--inline",function(a){a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented();var b=a.which;if(b===c.BACKSPACE&&""===e.$search.val()){var d=e.$searchContainer.prev(".select2-selection__choice");if(d.length>0){var f=d.data("data");e.searchRemoveChoice(f),a.preventDefault()}}}),this.$selection.on("input",".select2-search--inline",function(){e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input",".select2-search--inline",function(a){e.handleSearch(a)})},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.trigger("open"),this.$search.val(b.text+" ")},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{var b=this.$search.val().length+1;a=.75*b+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){var a={"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"};return a}),b.define("select2/data/base",["../utils"],function(a){function b(){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),d+=null!=c.id?"-"+c.id.toString():"-"+a.generateChars(4)},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f<a.length;f++){var g=a[f].id;-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")});else{var d=a.id;this.$element.val(d),this.$element.trigger("change")}},d.prototype.unselect=function(a){var b=this;if(this.$element.prop("multiple"))return a.selected=!1,c(a.element).is("option")?(a.element.selected=!1,void this.$element.trigger("change")):void this.current(function(d){for(var e=[],f=0;f<d.length;f++){var g=d[f].id;g!==a.id&&-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")})},d.prototype.bind=function(a){var b=this;this.container=a,a.on("select",function(a){b.select(a.data)}),a.on("unselect",function(a){b.unselect(a.data)})},d.prototype.destroy=function(){this.$element.find("*").each(function(){c.removeData(this,"data")})},d.prototype.query=function(a,b){var d=[],e=this,f=this.$element.children();f.each(function(){var b=c(this);if(b.is("option")||b.is("optgroup")){var f=e.item(b),g=e.matches(a,f);null!==g&&d.push(g)}}),b({results:d})},d.prototype.addOptions=function(a){b.appendMany(this.$element,a)},d.prototype.option=function(a){var b;a.children?(b=document.createElement("optgroup"),b.label=a.text):(b=document.createElement("option"),void 0!==b.textContent?b.textContent=a.text:b.innerText=a.text),a.id&&(b.value=a.id),a.disabled&&(b.disabled=!0),a.selected&&(b.selected=!0),a.title&&(b.title=a.title);var d=c(b),e=this._normalizeItem(a);return e.element=b,c.data(b,"data",e),d},d.prototype.item=function(a){var b={}; +if(b=c.data(a[0],"data"),null!=b)return b;if(a.is("option"))b={id:a.val(),text:a.text(),disabled:a.prop("disabled"),selected:a.prop("selected"),title:a.prop("title")};else if(a.is("optgroup")){b={text:a.prop("label"),children:[],title:a.prop("title")};for(var d=a.children("option"),e=[],f=0;f<d.length;f++){var g=c(d[f]),h=this.item(g);e.push(h)}b.children=e}return b=this._normalizeItem(b),b.element=a[0],c.data(a[0],"data",b),b},d.prototype._normalizeItem=function(a){c.isPlainObject(a)||(a={id:a,text:a}),a=c.extend({},{text:""},a);var b={selected:!1,disabled:!1};return null!=a.id&&(a.id=a.id.toString()),null!=a.text&&(a.text=a.text.toString()),null==a._resultId&&a.id&&null!=this.container&&(a._resultId=this.generateResultId(this.container,a)),c.extend({},b,a)},d.prototype.matches=function(a,b){var c=this.options.get("matcher");return c(a,b)},d}),b.define("select2/data/array",["./select","../utils","jquery"],function(a,b,c){function d(a,b){var c=b.get("data")||[];d.__super__.constructor.call(this,a,b),this.addOptions(this.convertToOptions(c))}return b.Extend(d,a),d.prototype.select=function(a){var b=this.$element.find("option").filter(function(b,c){return c.value==a.id.toString()});0===b.length&&(b=this.option(a),this.addOptions(b)),d.__super__.select.call(this,a)},d.prototype.convertToOptions=function(a){function d(a){return function(){return c(this).val()==a.id}}for(var e=this,f=this.$element.find("option"),g=f.map(function(){return e.item(c(this)).id}).get(),h=[],i=0;i<a.length;i++){var j=this._normalizeItem(a[i]);if(c.inArray(j.id,g)>=0){var k=f.filter(d(j)),l=this.item(k),m=(c.extend(!0,{},l,j),this.option(l));k.replaceWith(m)}else{var n=this.option(j);if(j.children){var o=this.convertToOptions(j.children);b.appendMany(n,o)}h.push(n)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(b,c){this.ajaxOptions=this._applyDefaults(c.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),a.__super__.constructor.call(this,b,c)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return{q:a.term}},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url(a)),"function"==typeof f.data&&(f.data=f.data(a)),this.ajaxOptions.delay&&""!==a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");if(void 0!==f&&(this.createTag=f),b.call(this,c,d),a.isArray(e))for(var g=0;g<e.length;g++){var h=e[g],i=this._normalizeItem(h),j=this.option(i);this.$element.append(j)}}return b.prototype.query=function(a,b,c){function d(a,f){for(var g=a.results,h=0;h<g.length;h++){var i=g[h],j=null!=i.children&&!d({results:i.children},!0),k=i.text===b.term;if(k||j)return f?!1:(a.data=g,void c(a))}if(f)return!0;var l=e.createTag(b);if(null!=l){var m=e.option(l);m.attr("data-select2-tag",!0),e.addOptions([m]),e.insertTag(g,l)}a.results=g,c(a)}var e=this;return this._removeOldTags(),null==b.term||null!=b.page?void a.call(this,b,c):void a.call(this,b,d)},b.prototype.createTag=function(b,c){var d=a.trim(c.term);return""===d?null:{id:d,text:d}},b.prototype.insertTag=function(a,b,c){b.unshift(c)},b.prototype._removeOldTags=function(){var b=(this._lastTag,this.$element.find("option[data-select2-tag]"));b.each(function(){this.selected||a(this).remove()})},b}),b.define("select2/data/tokenizer",["jquery"],function(a){function b(a,b,c){var d=c.get("tokenizer");void 0!==d&&(this.tokenizer=d),a.call(this,b,c)}return b.prototype.bind=function(a,b,c){a.call(this,b,c),this.$search=b.dropdown.$search||b.selection.$search||c.find(".select2-search__field")},b.prototype.query=function(a,b,c){function d(a){e.select(a)}var e=this;b.term=b.term||"";var f=this.tokenizer(b,this.options,d);f.term!==b.term&&(this.$search.length&&(this.$search.val(f.term),this.$search.focus()),b.term=f.term),a.call(this,b,c)},b.prototype.tokenizer=function(b,c,d,e){for(var f=d.get("tokenSeparators")||[],g=c.term,h=0,i=this.createTag||function(a){return{id:a.term,text:a.term}};h<g.length;){var j=g[h];if(-1!==a.inArray(j,f)){var k=g.substr(0,h),l=a.extend({},c,{term:k}),m=i(l);e(m),g=g.substr(h+1)||"",h=0}else h++}return{term:g}},b}),b.define("select2/data/minimumInputLength",[],function(){function a(a,b,c){this.minimumInputLength=c.get("minimumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",b.term.length<this.minimumInputLength?void this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumInputLength",[],function(){function a(a,b,c){this.maximumInputLength=c.get("maximumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",this.maximumInputLength>0&&b.term.length>this.maximumInputLength?void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;return d.maximumSelectionLength>0&&f>=d.maximumSelectionLength?void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}}):void a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<span class="select2-dropdown"><span class="select2-results"></span></span>');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.position=function(){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a){function b(){}return b.prototype.render=function(b){var c=b.call(this),d=a('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" /></span>');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val("")}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){var b=e.showSearch(a);b?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},b.prototype.handleSearch=function(){if(!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},b.prototype.showSearch=function(){return!0},b}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){var c=e.$results.offset().top+e.$results.outerHeight(!1),d=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1);c+50>=d&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('<li class="option load-more" role="treeitem"></li>'),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(a,b,c){this.$dropdownParent=c.get("dropdownParent")||document.body,a.call(this,b,c)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a("<span></span>"),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c){var d=this,e="scroll.select2."+c.id,f="resize.select2."+c.id,g="orientationchange.select2."+c.id,h=this.$container.parents().filter(b.hasScroll);h.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),h.on(e,function(){var b=a(this).data("select2-scroll-position");a(this).scrollTop(b.y)}),a(window).on(e+" "+f+" "+g,function(){d._positionDropdown(),d._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c){var d="scroll.select2."+c.id,e="resize.select2."+c.id,f="orientationchange.select2."+c.id,g=this.$container.parents().filter(b.hasScroll);g.off(d),a(window).off(d+" "+e+" "+f)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=(this.$container.position(),this.$container.offset());f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.top<f.top-h.height,k=i.bottom>f.bottom+h.height,l={left:f.left,top:g.bottom};c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){this.$dropdownContainer.width();var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d<b.length;d++){var e=b[d];e.children?c+=a(e.children):c++}return c}function b(a,b,c,d){this.minimumResultsForSearch=c.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),a.call(this,b,c,d)}return b.prototype.showSearch=function(b,c){return a(c.data.results)<this.minimumResultsForSearch?!1:b.call(this,c)},b}),b.define("select2/dropdown/selectOnClose",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("close",function(){d._handleSelectOnClose()})},a.prototype._handleSelectOnClose=function(){var a=this.getHighlightedResults();a.length<1||this.trigger("select",{data:a.data("data")})},a}),b.define("select2/dropdown/closeOnSelect",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("select",function(a){d._selectTriggered(a)}),b.on("unselect",function(a){d._selectTriggered(a)})},a.prototype._selectTriggered=function(a,b){var c=b.originalEvent;c&&c.ctrlKey||this.trigger("close")},a}),b.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(a){var b=a.input.length-a.maximum,c="Please delete "+b+" character";return 1!=b&&(c+="s"),c},inputTooShort:function(a){var b=a.minimum-a.input.length,c="Please enter "+b+" or more characters";return c},loadingMore:function(){return"Loading more results…"},maximumSelected:function(a){var b="You can only select "+a.maximum+" item";return 1!=a.maximum&&(b+="s"),b},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),b.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C){function D(){this.reset()}D.prototype.apply=function(l){if(l=a.extend({},this.defaults,l),null==l.dataAdapter){if(l.dataAdapter=null!=l.ajax?o:null!=l.data?n:m,l.minimumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),(null!=l.tokenSeparators||null!=l.tokenizer)&&(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.selectionAdapter=l.multiple?e:d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L<K.length;L++){var M=K[L],N={};try{N=k.loadPath(M)}catch(O){try{M=this.defaults.amdLanguageBase+M,N=k.loadPath(M)}catch(P){l.debug&&window.console&&console.warn&&console.warn('Select2: The language file for "'+M+'" could not be automatically loaded. A fallback will be used instead.');continue}}J.extend(N)}l.translations=J}else{var Q=k.loadPath(this.defaults.amdLanguageBase+"en"),R=new k(l.language);R.extend(Q),l.translations=R}return l},D.prototype.reset=function(){function b(a){function b(a){return l[a]||a}return a.replace(/[^\u0000-\u007E]/g,b)}function c(d,e){if(""===a.trim(d.term))return e;if(e.children&&e.children.length>0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){var h=e.children[g],i=c(d,h);null==i&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var j=b(e.text).toUpperCase(),k=b(d.term).toUpperCase();return j.indexOf(k)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)};var E=new D;return E}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(this.options.dir=a.prop("dir")?a.prop("dir"):a.closest("[dir]").prop("dir")?a.closest("[dir]").prop("dir"):"ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return 0>=e?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;i>h;h+=1){var j=g[h].replace(/\s/g,""),k=j.match(c);if(null!==k&&k.length>=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this._sync=c.bind(this._syncAttributes,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._sync);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._sync)}),this._observer.observe(this.$element[0],{attributes:!0,subtree:!1})):this.$element[0].addEventListener&&this.$element[0].addEventListener("DOMAttrModified",b._sync,!1)},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("focus",function(){a.$container.addClass("select2-container--focus")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open"),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ENTER?(a.trigger("results:select"),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle"),b.preventDefault()):c===d.UP?(a.trigger("results:previous"),b.preventDefault()):c===d.DOWN?(a.trigger("results:next"),b.preventDefault()):(c===d.ESC||c===d.TAB)&&(a.close(),b.preventDefault()):(c===d.ENTER||c===d.SPACE||(c===d.DOWN||c===d.UP)&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable")):this.trigger("enable")},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||(this.trigger("query",{}),this.trigger("open"))},e.prototype.close=function(){this.isOpen()&&this.trigger("close")},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),(null==a||0===a.length)&&(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._sync),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&this.$element[0].removeEventListener("DOMAttrModified",this._sync,!1),this._sync=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},e.prototype.render=function(){var b=a('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("jquery.select2",["jquery","require","./select2/core","./select2/defaults"],function(a,b,c,d){if(b("jquery.mousewheel"),null==a.fn.select2){var e=["open","close","destroy"];a.fn.select2=function(b){if(b=b||{},"object"==typeof b)return this.each(function(){{var d=a.extend({},b,!0);new c(a(this),d)}}),this;if("string"==typeof b){var d=this.data("select2");null==d&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2.");var f=Array.prototype.slice.call(arguments,1),g=d[b](f);return a.inArray(b,e)>-1?this:g}throw new Error("Invalid arguments for Select2: "+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),b.define("jquery.mousewheel",["jquery"],function(a){return a}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,c}); \ No newline at end of file diff --git a/theme/bootstrap/plugins/slimScroll/jquery.slimscroll.js b/theme/bootstrap/plugins/slimScroll/jquery.slimscroll.js new file mode 100644 index 0000000..e9127d3 --- /dev/null +++ b/theme/bootstrap/plugins/slimScroll/jquery.slimscroll.js @@ -0,0 +1,490 @@ +/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la) + * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) + * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * + * Version: 1.3.3 + * + */ +(function ($) { + + $.fn.extend({ + slimScroll: function (options) { + + var defaults = { + // width in pixels of the visible scroll area + width: 'auto', + // height in pixels of the visible scroll area + height: '250px', + // width in pixels of the scrollbar and rail + size: '7px', + // scrollbar color, accepts any hex/color value + color: '#000', + // scrollbar position - left/right + position: 'right', + // distance in pixels between the side edge and the scrollbar + distance: '1px', + // default scroll position on load - top / bottom / $('selector') + start: 'top', + // sets scrollbar opacity + opacity: .4, + // enables always-on mode for the scrollbar + alwaysVisible: false, + // check if we should hide the scrollbar when user is hovering over + disableFadeOut: false, + // sets visibility of the rail + railVisible: false, + // sets rail color + railColor: '#333', + // sets rail opacity + railOpacity: .2, + // whether we should use jQuery UI Draggable to enable bar dragging + railDraggable: true, + // defautlt CSS class of the slimscroll rail + railClass: 'slimScrollRail', + // defautlt CSS class of the slimscroll bar + barClass: 'slimScrollBar', + // defautlt CSS class of the slimscroll wrapper + wrapperClass: 'slimScrollDiv', + // check if mousewheel should scroll the window if we reach top/bottom + allowPageScroll: false, + // scroll amount applied to each mouse wheel step + wheelStep: 20, + // scroll amount applied when user is using gestures + touchScrollStep: 200, + // sets border radius + borderRadius: '7px', + // sets border radius of the rail + railBorderRadius: '7px' + }; + + var o = $.extend(defaults, options); + + // do it for every element that matches selector + this.each(function () { + + var isOverPanel, isOverBar, isDragg, queueHide, touchDif, + barHeight, percentScroll, lastScroll, + divS = '<div></div>', + minBarHeight = 30, + releaseScroll = false; + + // used in event handlers and for better minification + var me = $(this); + + // ensure we are not binding it again + if (me.parent().hasClass(o.wrapperClass)) + { + // start from last bar position + var offset = me.scrollTop(); + + // find bar and rail + bar = me.parent().find('.' + o.barClass); + rail = me.parent().find('.' + o.railClass); + + getBarHeight(); + + // check if we should scroll existing instance + if ($.isPlainObject(options)) + { + // Pass height: auto to an existing slimscroll object to force a resize after contents have changed + if ('height' in options && options.height == 'auto') { + me.parent().css('height', 'auto'); + me.css('height', 'auto'); + var height = me.parent().parent().height(); + me.parent().css('height', height); + me.css('height', height); + } + + if ('scrollTo' in options) + { + // jump to a static point + offset = parseInt(o.scrollTo); + } + else if ('scrollBy' in options) + { + // jump by value pixels + offset += parseInt(o.scrollBy); + } + else if ('destroy' in options) + { + // remove slimscroll elements + bar.remove(); + rail.remove(); + me.unwrap(); + return; + } + + // scroll content by the given offset + scrollContent(offset, false, true); + } + + return; + } + else if ($.isPlainObject(options)) + { + if ('destroy' in options) + { + return; + } + } + + // optionally set height to the parent's height + o.height = (o.height == 'auto') ? me.parent().height() : o.height; + + // wrap content + var wrapper = $(divS) + .addClass(o.wrapperClass) + .css({ + position: 'relative', + overflow: 'hidden', + width: o.width, + height: o.height + }); + + // update style for the div + me.css({ + overflow: 'hidden', + width: o.width, + height: o.height, + //Fix for IE10 + "-ms-touch-action": "none" + }); + + // create scrollbar rail + var rail = $(divS) + .addClass(o.railClass) + .css({ + width: o.size, + height: '100%', + position: 'absolute', + top: 0, + display: (o.alwaysVisible && o.railVisible) ? 'block' : 'none', + 'border-radius': o.railBorderRadius, + background: o.railColor, + opacity: o.railOpacity, + zIndex: 90 + }); + + // create scrollbar + var bar = $(divS) + .addClass(o.barClass) + .css({ + background: o.color, + width: o.size, + position: 'absolute', + top: 0, + opacity: o.opacity, + display: o.alwaysVisible ? 'block' : 'none', + 'border-radius': o.borderRadius, + BorderRadius: o.borderRadius, + MozBorderRadius: o.borderRadius, + WebkitBorderRadius: o.borderRadius, + zIndex: 99 + }); + + // set position + var posCss = (o.position == 'right') ? {right: o.distance} : {left: o.distance}; + rail.css(posCss); + bar.css(posCss); + + // wrap it + me.wrap(wrapper); + + // append to parent div + me.parent().append(bar); + me.parent().append(rail); + + // make it draggable and no longer dependent on the jqueryUI + if (o.railDraggable) { + bar.bind("mousedown", function (e) { + var $doc = $(document); + isDragg = true; + t = parseFloat(bar.css('top')); + pageY = e.pageY; + + $doc.bind("mousemove.slimscroll", function (e) { + currTop = t + e.pageY - pageY; + bar.css('top', currTop); + scrollContent(0, bar.position().top, false);// scroll content + }); + + $doc.bind("mouseup.slimscroll", function (e) { + isDragg = false; + hideBar(); + $doc.unbind('.slimscroll'); + }); + return false; + }).bind("selectstart.slimscroll", function (e) { + e.stopPropagation(); + e.preventDefault(); + return false; + }); + } + + // on rail over + rail.hover(function () { + showBar(); + }, function () { + hideBar(); + }); + + // on bar over + bar.hover(function () { + isOverBar = true; + }, function () { + isOverBar = false; + }); + + // show on parent mouseover + me.hover(function () { + isOverPanel = true; + showBar(); + hideBar(); + }, function () { + isOverPanel = false; + hideBar(); + }); + + if (window.navigator.msPointerEnabled) { + // support for mobile + me.bind('MSPointerDown', function (e, b) { + if (e.originalEvent.targetTouches.length) + { + // record where touch started + touchDif = e.originalEvent.targetTouches[0].pageY; + } + }); + + me.bind('MSPointerMove', function (e) { + // prevent scrolling the page if necessary + e.originalEvent.preventDefault(); + if (e.originalEvent.targetTouches.length) + { + // see how far user swiped + var diff = (touchDif - e.originalEvent.targetTouches[0].pageY) / o.touchScrollStep; + // scroll content + scrollContent(diff, true); + touchDif = e.originalEvent.targetTouches[0].pageY; + + } + }); + } else { + // support for mobile + me.bind('touchstart', function (e, b) { + if (e.originalEvent.touches.length) + { + // record where touch started + touchDif = e.originalEvent.touches[0].pageY; + } + }); + + me.bind('touchmove', function (e) { + // prevent scrolling the page if necessary + if (!releaseScroll) + { + e.originalEvent.preventDefault(); + } + if (e.originalEvent.touches.length) + { + // see how far user swiped + var diff = (touchDif - e.originalEvent.touches[0].pageY) / o.touchScrollStep; + // scroll content + scrollContent(diff, true); + touchDif = e.originalEvent.touches[0].pageY; + } + }); + } + + // set up initial height + getBarHeight(); + + // check start position + if (o.start === 'bottom') + { + // scroll content to bottom + bar.css({top: me.outerHeight() - bar.outerHeight()}); + scrollContent(0, true); + } + else if (o.start !== 'top') + { + // assume jQuery selector + scrollContent($(o.start).position().top, null, true); + + // make sure bar stays hidden + if (!o.alwaysVisible) { + bar.hide(); + } + } + + // attach scroll events + attachWheel(); + + function _onWheel(e) + { + // use mouse wheel only when mouse is over + if (!isOverPanel) { + return; + } + + var e = e || window.event; + + var delta = 0; + if (e.wheelDelta) { + delta = -e.wheelDelta / 120; + } + if (e.detail) { + delta = e.detail / 3; + } + + var target = e.target || e.srcTarget || e.srcElement; + if ($(target).closest('.' + o.wrapperClass).is(me.parent())) { + // scroll content + scrollContent(delta, true); + } + + // stop window scroll + if (e.preventDefault && !releaseScroll) { + e.preventDefault(); + } + if (!releaseScroll) { + e.returnValue = false; + } + } + + function scrollContent(y, isWheel, isJump) + { + releaseScroll = false; + var delta = y; + var maxTop = me.outerHeight() - bar.outerHeight(); + + if (isWheel) + { + // move bar with mouse wheel + delta = parseInt(bar.css('top')) + y * parseInt(o.wheelStep) / 100 * bar.outerHeight(); + + // move bar, make sure it doesn't go out + delta = Math.min(Math.max(delta, 0), maxTop); + + // if scrolling down, make sure a fractional change to the + // scroll position isn't rounded away when the scrollbar's CSS is set + // this flooring of delta would happened automatically when + // bar.css is set below, but we floor here for clarity + delta = (y > 0) ? Math.ceil(delta) : Math.floor(delta); + + // scroll the scrollbar + bar.css({top: delta + 'px'}); + } + + // calculate actual scroll amount + percentScroll = parseInt(bar.css('top')) / (me.outerHeight() - bar.outerHeight()); + delta = percentScroll * (me[0].scrollHeight - me.outerHeight()); + + if (isJump) + { + delta = y; + var offsetTop = delta / me[0].scrollHeight * me.outerHeight(); + offsetTop = Math.min(Math.max(offsetTop, 0), maxTop); + bar.css({top: offsetTop + 'px'}); + } + + // scroll content + me.scrollTop(delta); + + // fire scrolling event + me.trigger('slimscrolling', ~~delta); + + // ensure bar is visible + showBar(); + + // trigger hide when scroll is stopped + hideBar(); + } + + function attachWheel() + { + if (window.addEventListener) + { + this.addEventListener('DOMMouseScroll', _onWheel, false); + this.addEventListener('mousewheel', _onWheel, false); + } + else + { + document.attachEvent("onmousewheel", _onWheel) + } + } + + function getBarHeight() + { + // calculate scrollbar height and make sure it is not too small + barHeight = Math.max((me.outerHeight() / me[0].scrollHeight) * me.outerHeight(), minBarHeight); + bar.css({height: barHeight + 'px'}); + + // hide scrollbar if content is not long enough + var display = barHeight == me.outerHeight() ? 'none' : 'block'; + bar.css({display: display}); + } + + function showBar() + { + // recalculate bar height + getBarHeight(); + clearTimeout(queueHide); + + // when bar reached top or bottom + if (percentScroll == ~~percentScroll) + { + //release wheel + releaseScroll = o.allowPageScroll; + + // publish approporiate event + if (lastScroll != percentScroll) + { + var msg = (~~percentScroll == 0) ? 'top' : 'bottom'; + me.trigger('slimscroll', msg); + } + } + else + { + releaseScroll = false; + } + lastScroll = percentScroll; + + // show only when required + if (barHeight >= me.outerHeight()) { + //allow window scroll + releaseScroll = true; + return; + } + bar.stop(true, true).fadeIn('fast'); + if (o.railVisible) { + rail.stop(true, true).fadeIn('fast'); + } + } + + function hideBar() + { + // only hide when options allow it + if (!o.alwaysVisible) + { + queueHide = setTimeout(function () { + if (!(o.disableFadeOut && isOverPanel) && !isOverBar && !isDragg) + { + bar.fadeOut('slow'); + rail.fadeOut('slow'); + } + }, 1000); + } + } + + }); + + // maintain chainability + return this; + } + }); + + $.fn.extend({ + slimscroll: $.fn.slimScroll + }); + +})(jQuery); diff --git a/theme/bootstrap/plugins/slimScroll/jquery.slimscroll.min.js b/theme/bootstrap/plugins/slimScroll/jquery.slimscroll.min.js new file mode 100644 index 0000000..298aa1c --- /dev/null +++ b/theme/bootstrap/plugins/slimScroll/jquery.slimscroll.min.js @@ -0,0 +1 @@ +(function($){$.fn.extend({slimScroll:function(options){var defaults={width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:.4,alwaysVisible:false,disableFadeOut:false,railVisible:false,railColor:"#333",railOpacity:.2,railDraggable:true,railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:false,wheelStep:20,touchScrollStep:200,borderRadius:"7px",railBorderRadius:"7px"};var o=$.extend(defaults,options);this.each(function(){var isOverPanel,isOverBar,isDragg,queueHide,touchDif,barHeight,percentScroll,lastScroll,divS="<div></div>",minBarHeight=30,releaseScroll=false;var me=$(this);if(me.parent().hasClass(o.wrapperClass)){var offset=me.scrollTop();bar=me.parent().find("."+o.barClass);rail=me.parent().find("."+o.railClass);getBarHeight();if($.isPlainObject(options)){if("height"in options&&options.height=="auto"){me.parent().css("height","auto");me.css("height","auto");var height=me.parent().parent().height();me.parent().css("height",height);me.css("height",height)}if("scrollTo"in options){offset=parseInt(o.scrollTo)}else if("scrollBy"in options){offset+=parseInt(o.scrollBy)}else if("destroy"in options){bar.remove();rail.remove();me.unwrap();return}scrollContent(offset,false,true)}return}else if($.isPlainObject(options)){if("destroy"in options){return}}o.height=o.height=="auto"?me.parent().height():o.height;var wrapper=$(divS).addClass(o.wrapperClass).css({position:"relative",overflow:"hidden",width:o.width,height:o.height});me.css({overflow:"hidden",width:o.width,height:o.height,"-ms-touch-action":"none"});var rail=$(divS).addClass(o.railClass).css({width:o.size,height:"100%",position:"absolute",top:0,display:o.alwaysVisible&&o.railVisible?"block":"none","border-radius":o.railBorderRadius,background:o.railColor,opacity:o.railOpacity,zIndex:90});var bar=$(divS).addClass(o.barClass).css({background:o.color,width:o.size,position:"absolute",top:0,opacity:o.opacity,display:o.alwaysVisible?"block":"none","border-radius":o.borderRadius,BorderRadius:o.borderRadius,MozBorderRadius:o.borderRadius,WebkitBorderRadius:o.borderRadius,zIndex:99});var posCss=o.position=="right"?{right:o.distance}:{left:o.distance};rail.css(posCss);bar.css(posCss);me.wrap(wrapper);me.parent().append(bar);me.parent().append(rail);if(o.railDraggable){bar.bind("mousedown",function(e){var $doc=$(document);isDragg=true;t=parseFloat(bar.css("top"));pageY=e.pageY;$doc.bind("mousemove.slimscroll",function(e){currTop=t+e.pageY-pageY;bar.css("top",currTop);scrollContent(0,bar.position().top,false)});$doc.bind("mouseup.slimscroll",function(e){isDragg=false;hideBar();$doc.unbind(".slimscroll")});return false}).bind("selectstart.slimscroll",function(e){e.stopPropagation();e.preventDefault();return false})}rail.hover(function(){showBar()},function(){hideBar()});bar.hover(function(){isOverBar=true},function(){isOverBar=false});me.hover(function(){isOverPanel=true;showBar();hideBar()},function(){isOverPanel=false;hideBar()});if(window.navigator.msPointerEnabled){me.bind("MSPointerDown",function(e,b){if(e.originalEvent.targetTouches.length){touchDif=e.originalEvent.targetTouches[0].pageY}});me.bind("MSPointerMove",function(e){e.originalEvent.preventDefault();if(e.originalEvent.targetTouches.length){var diff=(touchDif-e.originalEvent.targetTouches[0].pageY)/o.touchScrollStep;scrollContent(diff,true);touchDif=e.originalEvent.targetTouches[0].pageY}})}else{me.bind("touchstart",function(e,b){if(e.originalEvent.touches.length){touchDif=e.originalEvent.touches[0].pageY}});me.bind("touchmove",function(e){if(!releaseScroll){e.originalEvent.preventDefault()}if(e.originalEvent.touches.length){var diff=(touchDif-e.originalEvent.touches[0].pageY)/o.touchScrollStep;scrollContent(diff,true);touchDif=e.originalEvent.touches[0].pageY}})}getBarHeight();if(o.start==="bottom"){bar.css({top:me.outerHeight()-bar.outerHeight()});scrollContent(0,true)}else if(o.start!=="top"){scrollContent($(o.start).position().top,null,true);if(!o.alwaysVisible){bar.hide()}}attachWheel();function _onWheel(e){if(!isOverPanel){return}var e=e||window.event;var delta=0;if(e.wheelDelta){delta=-e.wheelDelta/120}if(e.detail){delta=e.detail/3}var target=e.target||e.srcTarget||e.srcElement;if($(target).closest("."+o.wrapperClass).is(me.parent())){scrollContent(delta,true)}if(e.preventDefault&&!releaseScroll){e.preventDefault()}if(!releaseScroll){e.returnValue=false}}function scrollContent(y,isWheel,isJump){releaseScroll=false;var delta=y;var maxTop=me.outerHeight()-bar.outerHeight();if(isWheel){delta=parseInt(bar.css("top"))+y*parseInt(o.wheelStep)/100*bar.outerHeight();delta=Math.min(Math.max(delta,0),maxTop);delta=y>0?Math.ceil(delta):Math.floor(delta);bar.css({top:delta+"px"})}percentScroll=parseInt(bar.css("top"))/(me.outerHeight()-bar.outerHeight());delta=percentScroll*(me[0].scrollHeight-me.outerHeight());if(isJump){delta=y;var offsetTop=delta/me[0].scrollHeight*me.outerHeight();offsetTop=Math.min(Math.max(offsetTop,0),maxTop);bar.css({top:offsetTop+"px"})}me.scrollTop(delta);me.trigger("slimscrolling",~~delta);showBar();hideBar()}function attachWheel(){if(window.addEventListener){this.addEventListener("DOMMouseScroll",_onWheel,false);this.addEventListener("mousewheel",_onWheel,false)}else{document.attachEvent("onmousewheel",_onWheel)}}function getBarHeight(){barHeight=Math.max(me.outerHeight()/me[0].scrollHeight*me.outerHeight(),minBarHeight);bar.css({height:barHeight+"px"});var display=barHeight==me.outerHeight()?"none":"block";bar.css({display:display})}function showBar(){getBarHeight();clearTimeout(queueHide);if(percentScroll==~~percentScroll){releaseScroll=o.allowPageScroll;if(lastScroll!=percentScroll){var msg=~~percentScroll==0?"top":"bottom";me.trigger("slimscroll",msg)}}else{releaseScroll=false}lastScroll=percentScroll;if(barHeight>=me.outerHeight()){releaseScroll=true;return}bar.stop(true,true).fadeIn("fast");if(o.railVisible){rail.stop(true,true).fadeIn("fast")}}function hideBar(){if(!o.alwaysVisible){queueHide=setTimeout(function(){if(!(o.disableFadeOut&&isOverPanel)&&!isOverBar&&!isDragg){bar.fadeOut("slow");rail.fadeOut("slow")}},1e3)}}});return this}});$.fn.extend({slimscroll:$.fn.slimScroll})})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/plugins/sparkline/jquery.sparkline.js b/theme/bootstrap/plugins/sparkline/jquery.sparkline.js new file mode 100644 index 0000000..721e03b --- /dev/null +++ b/theme/bootstrap/plugins/sparkline/jquery.sparkline.js @@ -0,0 +1,3054 @@ +/** +* +* jquery.sparkline.js +* +* v2.1.2 +* (c) Splunk, Inc +* Contact: Gareth Watts (gareth@splunk.com) +* http://omnipotent.net/jquery.sparkline/ +* +* Generates inline sparkline charts from data supplied either to the method +* or inline in HTML +* +* Compatible with Internet Explorer 6.0+ and modern browsers equipped with the canvas tag +* (Firefox 2.0+, Safari, Opera, etc) +* +* License: New BSD License +* +* Copyright (c) 2012, Splunk Inc. +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without modification, +* are permitted provided that the following conditions are met: +* +* * Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* * Neither the name of Splunk Inc nor the names of its contributors may +* be used to endorse or promote products derived from this software without +* specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +* +* Usage: +* $(selector).sparkline(values, options) +* +* If values is undefined or set to 'html' then the data values are read from the specified tag: +* <p>Sparkline: <span class="sparkline">1,4,6,6,8,5,3,5</span></p> +* $('.sparkline').sparkline(); +* There must be no spaces in the enclosed data set +* +* Otherwise values must be an array of numbers or null values +* <p>Sparkline: <span id="sparkline1">This text replaced if the browser is compatible</span></p> +* $('#sparkline1').sparkline([1,4,6,6,8,5,3,5]) +* $('#sparkline2').sparkline([1,4,6,null,null,5,3,5]) +* +* Values can also be specified in an HTML comment, or as a values attribute: +* <p>Sparkline: <span class="sparkline"><!--1,4,6,6,8,5,3,5 --></span></p> +* <p>Sparkline: <span class="sparkline" values="1,4,6,6,8,5,3,5"></span></p> +* $('.sparkline').sparkline(); +* +* For line charts, x values can also be specified: +* <p>Sparkline: <span class="sparkline">1:1,2.7:4,3.4:6,5:6,6:8,8.7:5,9:3,10:5</span></p> +* $('#sparkline1').sparkline([ [1,1], [2.7,4], [3.4,6], [5,6], [6,8], [8.7,5], [9,3], [10,5] ]) +* +* By default, options should be passed in as teh second argument to the sparkline function: +* $('.sparkline').sparkline([1,2,3,4], {type: 'bar'}) +* +* Options can also be set by passing them on the tag itself. This feature is disabled by default though +* as there's a slight performance overhead: +* $('.sparkline').sparkline([1,2,3,4], {enableTagOptions: true}) +* <p>Sparkline: <span class="sparkline" sparkType="bar" sparkBarColor="red">loading</span></p> +* Prefix all options supplied as tag attribute with "spark" (configurable by setting tagOptionPrefix) +* +* Supported options: +* lineColor - Color of the line used for the chart +* fillColor - Color used to fill in the chart - Set to '' or false for a transparent chart +* width - Width of the chart - Defaults to 3 times the number of values in pixels +* height - Height of the chart - Defaults to the height of the containing element +* chartRangeMin - Specify the minimum value to use for the Y range of the chart - Defaults to the minimum value supplied +* chartRangeMax - Specify the maximum value to use for the Y range of the chart - Defaults to the maximum value supplied +* chartRangeClip - Clip out of range values to the max/min specified by chartRangeMin and chartRangeMax +* chartRangeMinX - Specify the minimum value to use for the X range of the chart - Defaults to the minimum value supplied +* chartRangeMaxX - Specify the maximum value to use for the X range of the chart - Defaults to the maximum value supplied +* composite - If true then don't erase any existing chart attached to the tag, but draw +* another chart over the top - Note that width and height are ignored if an +* existing chart is detected. +* tagValuesAttribute - Name of tag attribute to check for data values - Defaults to 'values' +* enableTagOptions - Whether to check tags for sparkline options +* tagOptionPrefix - Prefix used for options supplied as tag attributes - Defaults to 'spark' +* disableHiddenCheck - If set to true, then the plugin will assume that charts will never be drawn into a +* hidden dom element, avoding a browser reflow +* disableInteraction - If set to true then all mouseover/click interaction behaviour will be disabled, +* making the plugin perform much like it did in 1.x +* disableTooltips - If set to true then tooltips will be disabled - Defaults to false (tooltips enabled) +* disableHighlight - If set to true then highlighting of selected chart elements on mouseover will be disabled +* defaults to false (highlights enabled) +* highlightLighten - Factor to lighten/darken highlighted chart values by - Defaults to 1.4 for a 40% increase +* tooltipContainer - Specify which DOM element the tooltip should be rendered into - defaults to document.body +* tooltipClassname - Optional CSS classname to apply to tooltips - If not specified then a default style will be applied +* tooltipOffsetX - How many pixels away from the mouse pointer to render the tooltip on the X axis +* tooltipOffsetY - How many pixels away from the mouse pointer to render the tooltip on the r axis +* tooltipFormatter - Optional callback that allows you to override the HTML displayed in the tooltip +* callback is given arguments of (sparkline, options, fields) +* tooltipChartTitle - If specified then the tooltip uses the string specified by this setting as a title +* tooltipFormat - A format string or SPFormat object (or an array thereof for multiple entries) +* to control the format of the tooltip +* tooltipPrefix - A string to prepend to each field displayed in a tooltip +* tooltipSuffix - A string to append to each field displayed in a tooltip +* tooltipSkipNull - If true then null values will not have a tooltip displayed (defaults to true) +* tooltipValueLookups - An object or range map to map field values to tooltip strings +* (eg. to map -1 to "Lost", 0 to "Draw", and 1 to "Win") +* numberFormatter - Optional callback for formatting numbers in tooltips +* numberDigitGroupSep - Character to use for group separator in numbers "1,234" - Defaults to "," +* numberDecimalMark - Character to use for the decimal point when formatting numbers - Defaults to "." +* numberDigitGroupCount - Number of digits between group separator - Defaults to 3 +* +* There are 7 types of sparkline, selected by supplying a "type" option of 'line' (default), +* 'bar', 'tristate', 'bullet', 'discrete', 'pie' or 'box' +* line - Line chart. Options: +* spotColor - Set to '' to not end each line in a circular spot +* minSpotColor - If set, color of spot at minimum value +* maxSpotColor - If set, color of spot at maximum value +* spotRadius - Radius in pixels +* lineWidth - Width of line in pixels +* normalRangeMin +* normalRangeMax - If set draws a filled horizontal bar between these two values marking the "normal" +* or expected range of values +* normalRangeColor - Color to use for the above bar +* drawNormalOnTop - Draw the normal range above the chart fill color if true +* defaultPixelsPerValue - Defaults to 3 pixels of width for each value in the chart +* highlightSpotColor - The color to use for drawing a highlight spot on mouseover - Set to null to disable +* highlightLineColor - The color to use for drawing a highlight line on mouseover - Set to null to disable +* valueSpots - Specify which points to draw spots on, and in which color. Accepts a range map +* +* bar - Bar chart. Options: +* barColor - Color of bars for postive values +* negBarColor - Color of bars for negative values +* zeroColor - Color of bars with zero values +* nullColor - Color of bars with null values - Defaults to omitting the bar entirely +* barWidth - Width of bars in pixels +* colorMap - Optional mappnig of values to colors to override the *BarColor values above +* can be an Array of values to control the color of individual bars or a range map +* to specify colors for individual ranges of values +* barSpacing - Gap between bars in pixels +* zeroAxis - Centers the y-axis around zero if true +* +* tristate - Charts values of win (>0), lose (<0) or draw (=0) +* posBarColor - Color of win values +* negBarColor - Color of lose values +* zeroBarColor - Color of draw values +* barWidth - Width of bars in pixels +* barSpacing - Gap between bars in pixels +* colorMap - Optional mappnig of values to colors to override the *BarColor values above +* can be an Array of values to control the color of individual bars or a range map +* to specify colors for individual ranges of values +* +* discrete - Options: +* lineHeight - Height of each line in pixels - Defaults to 30% of the graph height +* thesholdValue - Values less than this value will be drawn using thresholdColor instead of lineColor +* thresholdColor +* +* bullet - Values for bullet graphs msut be in the order: target, performance, range1, range2, range3, ... +* options: +* targetColor - The color of the vertical target marker +* targetWidth - The width of the target marker in pixels +* performanceColor - The color of the performance measure horizontal bar +* rangeColors - Colors to use for each qualitative range background color +* +* pie - Pie chart. Options: +* sliceColors - An array of colors to use for pie slices +* offset - Angle in degrees to offset the first slice - Try -90 or +90 +* borderWidth - Width of border to draw around the pie chart, in pixels - Defaults to 0 (no border) +* borderColor - Color to use for the pie chart border - Defaults to #000 +* +* box - Box plot. Options: +* raw - Set to true to supply pre-computed plot points as values +* values should be: low_outlier, low_whisker, q1, median, q3, high_whisker, high_outlier +* When set to false you can supply any number of values and the box plot will +* be computed for you. Default is false. +* showOutliers - Set to true (default) to display outliers as circles +* outlierIQR - Interquartile range used to determine outliers. Default 1.5 +* boxLineColor - Outline color of the box +* boxFillColor - Fill color for the box +* whiskerColor - Line color used for whiskers +* outlierLineColor - Outline color of outlier circles +* outlierFillColor - Fill color of the outlier circles +* spotRadius - Radius of outlier circles +* medianColor - Line color of the median line +* target - Draw a target cross hair at the supplied value (default undefined) +* +* +* +* Examples: +* $('#sparkline1').sparkline(myvalues, { lineColor: '#f00', fillColor: false }); +* $('.barsparks').sparkline('html', { type:'bar', height:'40px', barWidth:5 }); +* $('#tristate').sparkline([1,1,-1,1,0,0,-1], { type:'tristate' }): +* $('#discrete').sparkline([1,3,4,5,5,3,4,5], { type:'discrete' }); +* $('#bullet').sparkline([10,12,12,9,7], { type:'bullet' }); +* $('#pie').sparkline([1,1,2], { type:'pie' }); +*/ + +/*jslint regexp: true, browser: true, jquery: true, white: true, nomen: false, plusplus: false, maxerr: 500, indent: 4 */ + +(function(document, Math, undefined) { // performance/minified-size optimization +(function(factory) { + if(typeof define === 'function' && define.amd) { + define(['jquery'], factory); + } else if (jQuery && !jQuery.fn.sparkline) { + factory(jQuery); + } +} +(function($) { + 'use strict'; + + var UNSET_OPTION = {}, + getDefaults, createClass, SPFormat, clipval, quartile, normalizeValue, normalizeValues, + remove, isNumber, all, sum, addCSS, ensureArray, formatNumber, RangeMap, + MouseHandler, Tooltip, barHighlightMixin, + line, bar, tristate, discrete, bullet, pie, box, defaultStyles, initStyles, + VShape, VCanvas_base, VCanvas_canvas, VCanvas_vml, pending, shapeCount = 0; + + /** + * Default configuration settings + */ + getDefaults = function () { + return { + // Settings common to most/all chart types + common: { + type: 'line', + lineColor: '#00f', + fillColor: '#cdf', + defaultPixelsPerValue: 3, + width: 'auto', + height: 'auto', + composite: false, + tagValuesAttribute: 'values', + tagOptionsPrefix: 'spark', + enableTagOptions: false, + enableHighlight: true, + highlightLighten: 1.4, + tooltipSkipNull: true, + tooltipPrefix: '', + tooltipSuffix: '', + disableHiddenCheck: false, + numberFormatter: false, + numberDigitGroupCount: 3, + numberDigitGroupSep: ',', + numberDecimalMark: '.', + disableTooltips: false, + disableInteraction: false + }, + // Defaults for line charts + line: { + spotColor: '#f80', + highlightSpotColor: '#5f5', + highlightLineColor: '#f22', + spotRadius: 1.5, + minSpotColor: '#f80', + maxSpotColor: '#f80', + lineWidth: 1, + normalRangeMin: undefined, + normalRangeMax: undefined, + normalRangeColor: '#ccc', + drawNormalOnTop: false, + chartRangeMin: undefined, + chartRangeMax: undefined, + chartRangeMinX: undefined, + chartRangeMaxX: undefined, + tooltipFormat: new SPFormat('<span style="color: {{color}}">&#9679;</span> {{prefix}}{{y}}{{suffix}}') + }, + // Defaults for bar charts + bar: { + barColor: '#3366cc', + negBarColor: '#f44', + stackedBarColor: ['#3366cc', '#dc3912', '#ff9900', '#109618', '#66aa00', + '#dd4477', '#0099c6', '#990099'], + zeroColor: undefined, + nullColor: undefined, + zeroAxis: true, + barWidth: 4, + barSpacing: 1, + chartRangeMax: undefined, + chartRangeMin: undefined, + chartRangeClip: false, + colorMap: undefined, + tooltipFormat: new SPFormat('<span style="color: {{color}}">&#9679;</span> {{prefix}}{{value}}{{suffix}}') + }, + // Defaults for tristate charts + tristate: { + barWidth: 4, + barSpacing: 1, + posBarColor: '#6f6', + negBarColor: '#f44', + zeroBarColor: '#999', + colorMap: {}, + tooltipFormat: new SPFormat('<span style="color: {{color}}">&#9679;</span> {{value:map}}'), + tooltipValueLookups: { map: { '-1': 'Loss', '0': 'Draw', '1': 'Win' } } + }, + // Defaults for discrete charts + discrete: { + lineHeight: 'auto', + thresholdColor: undefined, + thresholdValue: 0, + chartRangeMax: undefined, + chartRangeMin: undefined, + chartRangeClip: false, + tooltipFormat: new SPFormat('{{prefix}}{{value}}{{suffix}}') + }, + // Defaults for bullet charts + bullet: { + targetColor: '#f33', + targetWidth: 3, // width of the target bar in pixels + performanceColor: '#33f', + rangeColors: ['#d3dafe', '#a8b6ff', '#7f94ff'], + base: undefined, // set this to a number to change the base start number + tooltipFormat: new SPFormat('{{fieldkey:fields}} - {{value}}'), + tooltipValueLookups: { fields: {r: 'Range', p: 'Performance', t: 'Target'} } + }, + // Defaults for pie charts + pie: { + offset: 0, + sliceColors: ['#3366cc', '#dc3912', '#ff9900', '#109618', '#66aa00', + '#dd4477', '#0099c6', '#990099'], + borderWidth: 0, + borderColor: '#000', + tooltipFormat: new SPFormat('<span style="color: {{color}}">&#9679;</span> {{value}} ({{percent.1}}%)') + }, + // Defaults for box plots + box: { + raw: false, + boxLineColor: '#000', + boxFillColor: '#cdf', + whiskerColor: '#000', + outlierLineColor: '#333', + outlierFillColor: '#fff', + medianColor: '#f00', + showOutliers: true, + outlierIQR: 1.5, + spotRadius: 1.5, + target: undefined, + targetColor: '#4a2', + chartRangeMax: undefined, + chartRangeMin: undefined, + tooltipFormat: new SPFormat('{{field:fields}}: {{value}}'), + tooltipFormatFieldlistKey: 'field', + tooltipValueLookups: { fields: { lq: 'Lower Quartile', med: 'Median', + uq: 'Upper Quartile', lo: 'Left Outlier', ro: 'Right Outlier', + lw: 'Left Whisker', rw: 'Right Whisker'} } + } + }; + }; + + // You can have tooltips use a css class other than jqstooltip by specifying tooltipClassname + defaultStyles = '.jqstooltip { ' + + 'position: absolute;' + + 'left: 0px;' + + 'top: 0px;' + + 'visibility: hidden;' + + 'background: rgb(0, 0, 0) transparent;' + + 'background-color: rgba(0,0,0,0.6);' + + 'filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);' + + '-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)";' + + 'color: white;' + + 'font: 10px arial, san serif;' + + 'text-align: left;' + + 'white-space: nowrap;' + + 'padding: 5px;' + + 'border: 1px solid white;' + + 'z-index: 10000;' + + '}' + + '.jqsfield { ' + + 'color: white;' + + 'font: 10px arial, san serif;' + + 'text-align: left;' + + '}'; + + /** + * Utilities + */ + + createClass = function (/* [baseclass, [mixin, ...]], definition */) { + var Class, args; + Class = function () { + this.init.apply(this, arguments); + }; + if (arguments.length > 1) { + if (arguments[0]) { + Class.prototype = $.extend(new arguments[0](), arguments[arguments.length - 1]); + Class._super = arguments[0].prototype; + } else { + Class.prototype = arguments[arguments.length - 1]; + } + if (arguments.length > 2) { + args = Array.prototype.slice.call(arguments, 1, -1); + args.unshift(Class.prototype); + $.extend.apply($, args); + } + } else { + Class.prototype = arguments[0]; + } + Class.prototype.cls = Class; + return Class; + }; + + /** + * Wraps a format string for tooltips + * {{x}} + * {{x.2} + * {{x:months}} + */ + $.SPFormatClass = SPFormat = createClass({ + fre: /\{\{([\w.]+?)(:(.+?))?\}\}/g, + precre: /(\w+)\.(\d+)/, + + init: function (format, fclass) { + this.format = format; + this.fclass = fclass; + }, + + render: function (fieldset, lookups, options) { + var self = this, + fields = fieldset, + match, token, lookupkey, fieldvalue, prec; + return this.format.replace(this.fre, function () { + var lookup; + token = arguments[1]; + lookupkey = arguments[3]; + match = self.precre.exec(token); + if (match) { + prec = match[2]; + token = match[1]; + } else { + prec = false; + } + fieldvalue = fields[token]; + if (fieldvalue === undefined) { + return ''; + } + if (lookupkey && lookups && lookups[lookupkey]) { + lookup = lookups[lookupkey]; + if (lookup.get) { // RangeMap + return lookups[lookupkey].get(fieldvalue) || fieldvalue; + } else { + return lookups[lookupkey][fieldvalue] || fieldvalue; + } + } + if (isNumber(fieldvalue)) { + if (options.get('numberFormatter')) { + fieldvalue = options.get('numberFormatter')(fieldvalue); + } else { + fieldvalue = formatNumber(fieldvalue, prec, + options.get('numberDigitGroupCount'), + options.get('numberDigitGroupSep'), + options.get('numberDecimalMark')); + } + } + return fieldvalue; + }); + } + }); + + // convience method to avoid needing the new operator + $.spformat = function(format, fclass) { + return new SPFormat(format, fclass); + }; + + clipval = function (val, min, max) { + if (val < min) { + return min; + } + if (val > max) { + return max; + } + return val; + }; + + quartile = function (values, q) { + var vl; + if (q === 2) { + vl = Math.floor(values.length / 2); + return values.length % 2 ? values[vl] : (values[vl-1] + values[vl]) / 2; + } else { + if (values.length % 2 ) { // odd + vl = (values.length * q + q) / 4; + return vl % 1 ? (values[Math.floor(vl)] + values[Math.floor(vl) - 1]) / 2 : values[vl-1]; + } else { //even + vl = (values.length * q + 2) / 4; + return vl % 1 ? (values[Math.floor(vl)] + values[Math.floor(vl) - 1]) / 2 : values[vl-1]; + + } + } + }; + + normalizeValue = function (val) { + var nf; + switch (val) { + case 'undefined': + val = undefined; + break; + case 'null': + val = null; + break; + case 'true': + val = true; + break; + case 'false': + val = false; + break; + default: + nf = parseFloat(val); + if (val == nf) { + val = nf; + } + } + return val; + }; + + normalizeValues = function (vals) { + var i, result = []; + for (i = vals.length; i--;) { + result[i] = normalizeValue(vals[i]); + } + return result; + }; + + remove = function (vals, filter) { + var i, vl, result = []; + for (i = 0, vl = vals.length; i < vl; i++) { + if (vals[i] !== filter) { + result.push(vals[i]); + } + } + return result; + }; + + isNumber = function (num) { + return !isNaN(parseFloat(num)) && isFinite(num); + }; + + formatNumber = function (num, prec, groupsize, groupsep, decsep) { + var p, i; + num = (prec === false ? parseFloat(num).toString() : num.toFixed(prec)).split(''); + p = (p = $.inArray('.', num)) < 0 ? num.length : p; + if (p < num.length) { + num[p] = decsep; + } + for (i = p - groupsize; i > 0; i -= groupsize) { + num.splice(i, 0, groupsep); + } + return num.join(''); + }; + + // determine if all values of an array match a value + // returns true if the array is empty + all = function (val, arr, ignoreNull) { + var i; + for (i = arr.length; i--; ) { + if (ignoreNull && arr[i] === null) continue; + if (arr[i] !== val) { + return false; + } + } + return true; + }; + + // sums the numeric values in an array, ignoring other values + sum = function (vals) { + var total = 0, i; + for (i = vals.length; i--;) { + total += typeof vals[i] === 'number' ? vals[i] : 0; + } + return total; + }; + + ensureArray = function (val) { + return $.isArray(val) ? val : [val]; + }; + + // http://paulirish.com/2008/bookmarklet-inject-new-css-rules/ + addCSS = function(css) { + var tag; + //if ('\v' == 'v') /* ie only */ { + if (document.createStyleSheet) { + document.createStyleSheet().cssText = css; + } else { + tag = document.createElement('style'); + tag.type = 'text/css'; + document.getElementsByTagName('head')[0].appendChild(tag); + tag[(typeof document.body.style.WebkitAppearance == 'string') /* webkit only */ ? 'innerText' : 'innerHTML'] = css; + } + }; + + // Provide a cross-browser interface to a few simple drawing primitives + $.fn.simpledraw = function (width, height, useExisting, interact) { + var target, mhandler; + if (useExisting && (target = this.data('_jqs_vcanvas'))) { + return target; + } + + if ($.fn.sparkline.canvas === false) { + // We've already determined that neither Canvas nor VML are available + return false; + + } else if ($.fn.sparkline.canvas === undefined) { + // No function defined yet -- need to see if we support Canvas or VML + var el = document.createElement('canvas'); + if (!!(el.getContext && el.getContext('2d'))) { + // Canvas is available + $.fn.sparkline.canvas = function(width, height, target, interact) { + return new VCanvas_canvas(width, height, target, interact); + }; + } else if (document.namespaces && !document.namespaces.v) { + // VML is available + document.namespaces.add('v', 'urn:schemas-microsoft-com:vml', '#default#VML'); + $.fn.sparkline.canvas = function(width, height, target, interact) { + return new VCanvas_vml(width, height, target); + }; + } else { + // Neither Canvas nor VML are available + $.fn.sparkline.canvas = false; + return false; + } + } + + if (width === undefined) { + width = $(this).innerWidth(); + } + if (height === undefined) { + height = $(this).innerHeight(); + } + + target = $.fn.sparkline.canvas(width, height, this, interact); + + mhandler = $(this).data('_jqs_mhandler'); + if (mhandler) { + mhandler.registerCanvas(target); + } + return target; + }; + + $.fn.cleardraw = function () { + var target = this.data('_jqs_vcanvas'); + if (target) { + target.reset(); + } + }; + + $.RangeMapClass = RangeMap = createClass({ + init: function (map) { + var key, range, rangelist = []; + for (key in map) { + if (map.hasOwnProperty(key) && typeof key === 'string' && key.indexOf(':') > -1) { + range = key.split(':'); + range[0] = range[0].length === 0 ? -Infinity : parseFloat(range[0]); + range[1] = range[1].length === 0 ? Infinity : parseFloat(range[1]); + range[2] = map[key]; + rangelist.push(range); + } + } + this.map = map; + this.rangelist = rangelist || false; + }, + + get: function (value) { + var rangelist = this.rangelist, + i, range, result; + if ((result = this.map[value]) !== undefined) { + return result; + } + if (rangelist) { + for (i = rangelist.length; i--;) { + range = rangelist[i]; + if (range[0] <= value && range[1] >= value) { + return range[2]; + } + } + } + return undefined; + } + }); + + // Convenience function + $.range_map = function(map) { + return new RangeMap(map); + }; + + MouseHandler = createClass({ + init: function (el, options) { + var $el = $(el); + this.$el = $el; + this.options = options; + this.currentPageX = 0; + this.currentPageY = 0; + this.el = el; + this.splist = []; + this.tooltip = null; + this.over = false; + this.displayTooltips = !options.get('disableTooltips'); + this.highlightEnabled = !options.get('disableHighlight'); + }, + + registerSparkline: function (sp) { + this.splist.push(sp); + if (this.over) { + this.updateDisplay(); + } + }, + + registerCanvas: function (canvas) { + var $canvas = $(canvas.canvas); + this.canvas = canvas; + this.$canvas = $canvas; + $canvas.mouseenter($.proxy(this.mouseenter, this)); + $canvas.mouseleave($.proxy(this.mouseleave, this)); + $canvas.click($.proxy(this.mouseclick, this)); + }, + + reset: function (removeTooltip) { + this.splist = []; + if (this.tooltip && removeTooltip) { + this.tooltip.remove(); + this.tooltip = undefined; + } + }, + + mouseclick: function (e) { + var clickEvent = $.Event('sparklineClick'); + clickEvent.originalEvent = e; + clickEvent.sparklines = this.splist; + this.$el.trigger(clickEvent); + }, + + mouseenter: function (e) { + $(document.body).unbind('mousemove.jqs'); + $(document.body).bind('mousemove.jqs', $.proxy(this.mousemove, this)); + this.over = true; + this.currentPageX = e.pageX; + this.currentPageY = e.pageY; + this.currentEl = e.target; + if (!this.tooltip && this.displayTooltips) { + this.tooltip = new Tooltip(this.options); + this.tooltip.updatePosition(e.pageX, e.pageY); + } + this.updateDisplay(); + }, + + mouseleave: function () { + $(document.body).unbind('mousemove.jqs'); + var splist = this.splist, + spcount = splist.length, + needsRefresh = false, + sp, i; + this.over = false; + this.currentEl = null; + + if (this.tooltip) { + this.tooltip.remove(); + this.tooltip = null; + } + + for (i = 0; i < spcount; i++) { + sp = splist[i]; + if (sp.clearRegionHighlight()) { + needsRefresh = true; + } + } + + if (needsRefresh) { + this.canvas.render(); + } + }, + + mousemove: function (e) { + this.currentPageX = e.pageX; + this.currentPageY = e.pageY; + this.currentEl = e.target; + if (this.tooltip) { + this.tooltip.updatePosition(e.pageX, e.pageY); + } + this.updateDisplay(); + }, + + updateDisplay: function () { + var splist = this.splist, + spcount = splist.length, + needsRefresh = false, + offset = this.$canvas.offset(), + localX = this.currentPageX - offset.left, + localY = this.currentPageY - offset.top, + tooltiphtml, sp, i, result, changeEvent; + if (!this.over) { + return; + } + for (i = 0; i < spcount; i++) { + sp = splist[i]; + result = sp.setRegionHighlight(this.currentEl, localX, localY); + if (result) { + needsRefresh = true; + } + } + if (needsRefresh) { + changeEvent = $.Event('sparklineRegionChange'); + changeEvent.sparklines = this.splist; + this.$el.trigger(changeEvent); + if (this.tooltip) { + tooltiphtml = ''; + for (i = 0; i < spcount; i++) { + sp = splist[i]; + tooltiphtml += sp.getCurrentRegionTooltip(); + } + this.tooltip.setContent(tooltiphtml); + } + if (!this.disableHighlight) { + this.canvas.render(); + } + } + if (result === null) { + this.mouseleave(); + } + } + }); + + + Tooltip = createClass({ + sizeStyle: 'position: static !important;' + + 'display: block !important;' + + 'visibility: hidden !important;' + + 'float: left !important;', + + init: function (options) { + var tooltipClassname = options.get('tooltipClassname', 'jqstooltip'), + sizetipStyle = this.sizeStyle, + offset; + this.container = options.get('tooltipContainer') || document.body; + this.tooltipOffsetX = options.get('tooltipOffsetX', 10); + this.tooltipOffsetY = options.get('tooltipOffsetY', 12); + // remove any previous lingering tooltip + $('#jqssizetip').remove(); + $('#jqstooltip').remove(); + this.sizetip = $('<div/>', { + id: 'jqssizetip', + style: sizetipStyle, + 'class': tooltipClassname + }); + this.tooltip = $('<div/>', { + id: 'jqstooltip', + 'class': tooltipClassname + }).appendTo(this.container); + // account for the container's location + offset = this.tooltip.offset(); + this.offsetLeft = offset.left; + this.offsetTop = offset.top; + this.hidden = true; + $(window).unbind('resize.jqs scroll.jqs'); + $(window).bind('resize.jqs scroll.jqs', $.proxy(this.updateWindowDims, this)); + this.updateWindowDims(); + }, + + updateWindowDims: function () { + this.scrollTop = $(window).scrollTop(); + this.scrollLeft = $(window).scrollLeft(); + this.scrollRight = this.scrollLeft + $(window).width(); + this.updatePosition(); + }, + + getSize: function (content) { + this.sizetip.html(content).appendTo(this.container); + this.width = this.sizetip.width() + 1; + this.height = this.sizetip.height(); + this.sizetip.remove(); + }, + + setContent: function (content) { + if (!content) { + this.tooltip.css('visibility', 'hidden'); + this.hidden = true; + return; + } + this.getSize(content); + this.tooltip.html(content) + .css({ + 'width': this.width, + 'height': this.height, + 'visibility': 'visible' + }); + if (this.hidden) { + this.hidden = false; + this.updatePosition(); + } + }, + + updatePosition: function (x, y) { + if (x === undefined) { + if (this.mousex === undefined) { + return; + } + x = this.mousex - this.offsetLeft; + y = this.mousey - this.offsetTop; + + } else { + this.mousex = x = x - this.offsetLeft; + this.mousey = y = y - this.offsetTop; + } + if (!this.height || !this.width || this.hidden) { + return; + } + + y -= this.height + this.tooltipOffsetY; + x += this.tooltipOffsetX; + + if (y < this.scrollTop) { + y = this.scrollTop; + } + if (x < this.scrollLeft) { + x = this.scrollLeft; + } else if (x + this.width > this.scrollRight) { + x = this.scrollRight - this.width; + } + + this.tooltip.css({ + 'left': x, + 'top': y + }); + }, + + remove: function () { + this.tooltip.remove(); + this.sizetip.remove(); + this.sizetip = this.tooltip = undefined; + $(window).unbind('resize.jqs scroll.jqs'); + } + }); + + initStyles = function() { + addCSS(defaultStyles); + }; + + $(initStyles); + + pending = []; + $.fn.sparkline = function (userValues, userOptions) { + return this.each(function () { + var options = new $.fn.sparkline.options(this, userOptions), + $this = $(this), + render, i; + render = function () { + var values, width, height, tmp, mhandler, sp, vals; + if (userValues === 'html' || userValues === undefined) { + vals = this.getAttribute(options.get('tagValuesAttribute')); + if (vals === undefined || vals === null) { + vals = $this.html(); + } + values = vals.replace(/(^\s*<!--)|(-->\s*$)|\s+/g, '').split(','); + } else { + values = userValues; + } + + width = options.get('width') === 'auto' ? values.length * options.get('defaultPixelsPerValue') : options.get('width'); + if (options.get('height') === 'auto') { + if (!options.get('composite') || !$.data(this, '_jqs_vcanvas')) { + // must be a better way to get the line height + tmp = document.createElement('span'); + tmp.innerHTML = 'a'; + $this.html(tmp); + height = $(tmp).innerHeight() || $(tmp).height(); + $(tmp).remove(); + tmp = null; + } + } else { + height = options.get('height'); + } + + if (!options.get('disableInteraction')) { + mhandler = $.data(this, '_jqs_mhandler'); + if (!mhandler) { + mhandler = new MouseHandler(this, options); + $.data(this, '_jqs_mhandler', mhandler); + } else if (!options.get('composite')) { + mhandler.reset(); + } + } else { + mhandler = false; + } + + if (options.get('composite') && !$.data(this, '_jqs_vcanvas')) { + if (!$.data(this, '_jqs_errnotify')) { + alert('Attempted to attach a composite sparkline to an element with no existing sparkline'); + $.data(this, '_jqs_errnotify', true); + } + return; + } + + sp = new $.fn.sparkline[options.get('type')](this, values, options, width, height); + + sp.render(); + + if (mhandler) { + mhandler.registerSparkline(sp); + } + }; + if (($(this).html() && !options.get('disableHiddenCheck') && $(this).is(':hidden')) || !$(this).parents('body').length) { + if (!options.get('composite') && $.data(this, '_jqs_pending')) { + // remove any existing references to the element + for (i = pending.length; i; i--) { + if (pending[i - 1][0] == this) { + pending.splice(i - 1, 1); + } + } + } + pending.push([this, render]); + $.data(this, '_jqs_pending', true); + } else { + render.call(this); + } + }); + }; + + $.fn.sparkline.defaults = getDefaults(); + + + $.sparkline_display_visible = function () { + var el, i, pl; + var done = []; + for (i = 0, pl = pending.length; i < pl; i++) { + el = pending[i][0]; + if ($(el).is(':visible') && !$(el).parents().is(':hidden')) { + pending[i][1].call(el); + $.data(pending[i][0], '_jqs_pending', false); + done.push(i); + } else if (!$(el).closest('html').length && !$.data(el, '_jqs_pending')) { + // element has been inserted and removed from the DOM + // If it was not yet inserted into the dom then the .data request + // will return true. + // removing from the dom causes the data to be removed. + $.data(pending[i][0], '_jqs_pending', false); + done.push(i); + } + } + for (i = done.length; i; i--) { + pending.splice(done[i - 1], 1); + } + }; + + + /** + * User option handler + */ + $.fn.sparkline.options = createClass({ + init: function (tag, userOptions) { + var extendedOptions, defaults, base, tagOptionType; + this.userOptions = userOptions = userOptions || {}; + this.tag = tag; + this.tagValCache = {}; + defaults = $.fn.sparkline.defaults; + base = defaults.common; + this.tagOptionsPrefix = userOptions.enableTagOptions && (userOptions.tagOptionsPrefix || base.tagOptionsPrefix); + + tagOptionType = this.getTagSetting('type'); + if (tagOptionType === UNSET_OPTION) { + extendedOptions = defaults[userOptions.type || base.type]; + } else { + extendedOptions = defaults[tagOptionType]; + } + this.mergedOptions = $.extend({}, base, extendedOptions, userOptions); + }, + + + getTagSetting: function (key) { + var prefix = this.tagOptionsPrefix, + val, i, pairs, keyval; + if (prefix === false || prefix === undefined) { + return UNSET_OPTION; + } + if (this.tagValCache.hasOwnProperty(key)) { + val = this.tagValCache.key; + } else { + val = this.tag.getAttribute(prefix + key); + if (val === undefined || val === null) { + val = UNSET_OPTION; + } else if (val.substr(0, 1) === '[') { + val = val.substr(1, val.length - 2).split(','); + for (i = val.length; i--;) { + val[i] = normalizeValue(val[i].replace(/(^\s*)|(\s*$)/g, '')); + } + } else if (val.substr(0, 1) === '{') { + pairs = val.substr(1, val.length - 2).split(','); + val = {}; + for (i = pairs.length; i--;) { + keyval = pairs[i].split(':', 2); + val[keyval[0].replace(/(^\s*)|(\s*$)/g, '')] = normalizeValue(keyval[1].replace(/(^\s*)|(\s*$)/g, '')); + } + } else { + val = normalizeValue(val); + } + this.tagValCache.key = val; + } + return val; + }, + + get: function (key, defaultval) { + var tagOption = this.getTagSetting(key), + result; + if (tagOption !== UNSET_OPTION) { + return tagOption; + } + return (result = this.mergedOptions[key]) === undefined ? defaultval : result; + } + }); + + + $.fn.sparkline._base = createClass({ + disabled: false, + + init: function (el, values, options, width, height) { + this.el = el; + this.$el = $(el); + this.values = values; + this.options = options; + this.width = width; + this.height = height; + this.currentRegion = undefined; + }, + + /** + * Setup the canvas + */ + initTarget: function () { + var interactive = !this.options.get('disableInteraction'); + if (!(this.target = this.$el.simpledraw(this.width, this.height, this.options.get('composite'), interactive))) { + this.disabled = true; + } else { + this.canvasWidth = this.target.pixelWidth; + this.canvasHeight = this.target.pixelHeight; + } + }, + + /** + * Actually render the chart to the canvas + */ + render: function () { + if (this.disabled) { + this.el.innerHTML = ''; + return false; + } + return true; + }, + + /** + * Return a region id for a given x/y co-ordinate + */ + getRegion: function (x, y) { + }, + + /** + * Highlight an item based on the moused-over x,y co-ordinate + */ + setRegionHighlight: function (el, x, y) { + var currentRegion = this.currentRegion, + highlightEnabled = !this.options.get('disableHighlight'), + newRegion; + if (x > this.canvasWidth || y > this.canvasHeight || x < 0 || y < 0) { + return null; + } + newRegion = this.getRegion(el, x, y); + if (currentRegion !== newRegion) { + if (currentRegion !== undefined && highlightEnabled) { + this.removeHighlight(); + } + this.currentRegion = newRegion; + if (newRegion !== undefined && highlightEnabled) { + this.renderHighlight(); + } + return true; + } + return false; + }, + + /** + * Reset any currently highlighted item + */ + clearRegionHighlight: function () { + if (this.currentRegion !== undefined) { + this.removeHighlight(); + this.currentRegion = undefined; + return true; + } + return false; + }, + + renderHighlight: function () { + this.changeHighlight(true); + }, + + removeHighlight: function () { + this.changeHighlight(false); + }, + + changeHighlight: function (highlight) {}, + + /** + * Fetch the HTML to display as a tooltip + */ + getCurrentRegionTooltip: function () { + var options = this.options, + header = '', + entries = [], + fields, formats, formatlen, fclass, text, i, + showFields, showFieldsKey, newFields, fv, + formatter, format, fieldlen, j; + if (this.currentRegion === undefined) { + return ''; + } + fields = this.getCurrentRegionFields(); + formatter = options.get('tooltipFormatter'); + if (formatter) { + return formatter(this, options, fields); + } + if (options.get('tooltipChartTitle')) { + header += '<div class="jqs jqstitle">' + options.get('tooltipChartTitle') + '</div>\n'; + } + formats = this.options.get('tooltipFormat'); + if (!formats) { + return ''; + } + if (!$.isArray(formats)) { + formats = [formats]; + } + if (!$.isArray(fields)) { + fields = [fields]; + } + showFields = this.options.get('tooltipFormatFieldlist'); + showFieldsKey = this.options.get('tooltipFormatFieldlistKey'); + if (showFields && showFieldsKey) { + // user-selected ordering of fields + newFields = []; + for (i = fields.length; i--;) { + fv = fields[i][showFieldsKey]; + if ((j = $.inArray(fv, showFields)) != -1) { + newFields[j] = fields[i]; + } + } + fields = newFields; + } + formatlen = formats.length; + fieldlen = fields.length; + for (i = 0; i < formatlen; i++) { + format = formats[i]; + if (typeof format === 'string') { + format = new SPFormat(format); + } + fclass = format.fclass || 'jqsfield'; + for (j = 0; j < fieldlen; j++) { + if (!fields[j].isNull || !options.get('tooltipSkipNull')) { + $.extend(fields[j], { + prefix: options.get('tooltipPrefix'), + suffix: options.get('tooltipSuffix') + }); + text = format.render(fields[j], options.get('tooltipValueLookups'), options); + entries.push('<div class="' + fclass + '">' + text + '</div>'); + } + } + } + if (entries.length) { + return header + entries.join('\n'); + } + return ''; + }, + + getCurrentRegionFields: function () {}, + + calcHighlightColor: function (color, options) { + var highlightColor = options.get('highlightColor'), + lighten = options.get('highlightLighten'), + parse, mult, rgbnew, i; + if (highlightColor) { + return highlightColor; + } + if (lighten) { + // extract RGB values + parse = /^#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(color) || /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(color); + if (parse) { + rgbnew = []; + mult = color.length === 4 ? 16 : 1; + for (i = 0; i < 3; i++) { + rgbnew[i] = clipval(Math.round(parseInt(parse[i + 1], 16) * mult * lighten), 0, 255); + } + return 'rgb(' + rgbnew.join(',') + ')'; + } + + } + return color; + } + + }); + + barHighlightMixin = { + changeHighlight: function (highlight) { + var currentRegion = this.currentRegion, + target = this.target, + shapeids = this.regionShapes[currentRegion], + newShapes; + // will be null if the region value was null + if (shapeids) { + newShapes = this.renderRegion(currentRegion, highlight); + if ($.isArray(newShapes) || $.isArray(shapeids)) { + target.replaceWithShapes(shapeids, newShapes); + this.regionShapes[currentRegion] = $.map(newShapes, function (newShape) { + return newShape.id; + }); + } else { + target.replaceWithShape(shapeids, newShapes); + this.regionShapes[currentRegion] = newShapes.id; + } + } + }, + + render: function () { + var values = this.values, + target = this.target, + regionShapes = this.regionShapes, + shapes, ids, i, j; + + if (!this.cls._super.render.call(this)) { + return; + } + for (i = values.length; i--;) { + shapes = this.renderRegion(i); + if (shapes) { + if ($.isArray(shapes)) { + ids = []; + for (j = shapes.length; j--;) { + shapes[j].append(); + ids.push(shapes[j].id); + } + regionShapes[i] = ids; + } else { + shapes.append(); + regionShapes[i] = shapes.id; // store just the shapeid + } + } else { + // null value + regionShapes[i] = null; + } + } + target.render(); + } + }; + + /** + * Line charts + */ + $.fn.sparkline.line = line = createClass($.fn.sparkline._base, { + type: 'line', + + init: function (el, values, options, width, height) { + line._super.init.call(this, el, values, options, width, height); + this.vertices = []; + this.regionMap = []; + this.xvalues = []; + this.yvalues = []; + this.yminmax = []; + this.hightlightSpotId = null; + this.lastShapeId = null; + this.initTarget(); + }, + + getRegion: function (el, x, y) { + var i, + regionMap = this.regionMap; // maps regions to value positions + for (i = regionMap.length; i--;) { + if (regionMap[i] !== null && x >= regionMap[i][0] && x <= regionMap[i][1]) { + return regionMap[i][2]; + } + } + return undefined; + }, + + getCurrentRegionFields: function () { + var currentRegion = this.currentRegion; + return { + isNull: this.yvalues[currentRegion] === null, + x: this.xvalues[currentRegion], + y: this.yvalues[currentRegion], + color: this.options.get('lineColor'), + fillColor: this.options.get('fillColor'), + offset: currentRegion + }; + }, + + renderHighlight: function () { + var currentRegion = this.currentRegion, + target = this.target, + vertex = this.vertices[currentRegion], + options = this.options, + spotRadius = options.get('spotRadius'), + highlightSpotColor = options.get('highlightSpotColor'), + highlightLineColor = options.get('highlightLineColor'), + highlightSpot, highlightLine; + + if (!vertex) { + return; + } + if (spotRadius && highlightSpotColor) { + highlightSpot = target.drawCircle(vertex[0], vertex[1], + spotRadius, undefined, highlightSpotColor); + this.highlightSpotId = highlightSpot.id; + target.insertAfterShape(this.lastShapeId, highlightSpot); + } + if (highlightLineColor) { + highlightLine = target.drawLine(vertex[0], this.canvasTop, vertex[0], + this.canvasTop + this.canvasHeight, highlightLineColor); + this.highlightLineId = highlightLine.id; + target.insertAfterShape(this.lastShapeId, highlightLine); + } + }, + + removeHighlight: function () { + var target = this.target; + if (this.highlightSpotId) { + target.removeShapeId(this.highlightSpotId); + this.highlightSpotId = null; + } + if (this.highlightLineId) { + target.removeShapeId(this.highlightLineId); + this.highlightLineId = null; + } + }, + + scanValues: function () { + var values = this.values, + valcount = values.length, + xvalues = this.xvalues, + yvalues = this.yvalues, + yminmax = this.yminmax, + i, val, isStr, isArray, sp; + for (i = 0; i < valcount; i++) { + val = values[i]; + isStr = typeof(values[i]) === 'string'; + isArray = typeof(values[i]) === 'object' && values[i] instanceof Array; + sp = isStr && values[i].split(':'); + if (isStr && sp.length === 2) { // x:y + xvalues.push(Number(sp[0])); + yvalues.push(Number(sp[1])); + yminmax.push(Number(sp[1])); + } else if (isArray) { + xvalues.push(val[0]); + yvalues.push(val[1]); + yminmax.push(val[1]); + } else { + xvalues.push(i); + if (values[i] === null || values[i] === 'null') { + yvalues.push(null); + } else { + yvalues.push(Number(val)); + yminmax.push(Number(val)); + } + } + } + if (this.options.get('xvalues')) { + xvalues = this.options.get('xvalues'); + } + + this.maxy = this.maxyorg = Math.max.apply(Math, yminmax); + this.miny = this.minyorg = Math.min.apply(Math, yminmax); + + this.maxx = Math.max.apply(Math, xvalues); + this.minx = Math.min.apply(Math, xvalues); + + this.xvalues = xvalues; + this.yvalues = yvalues; + this.yminmax = yminmax; + + }, + + processRangeOptions: function () { + var options = this.options, + normalRangeMin = options.get('normalRangeMin'), + normalRangeMax = options.get('normalRangeMax'); + + if (normalRangeMin !== undefined) { + if (normalRangeMin < this.miny) { + this.miny = normalRangeMin; + } + if (normalRangeMax > this.maxy) { + this.maxy = normalRangeMax; + } + } + if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < this.miny)) { + this.miny = options.get('chartRangeMin'); + } + if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > this.maxy)) { + this.maxy = options.get('chartRangeMax'); + } + if (options.get('chartRangeMinX') !== undefined && (options.get('chartRangeClipX') || options.get('chartRangeMinX') < this.minx)) { + this.minx = options.get('chartRangeMinX'); + } + if (options.get('chartRangeMaxX') !== undefined && (options.get('chartRangeClipX') || options.get('chartRangeMaxX') > this.maxx)) { + this.maxx = options.get('chartRangeMaxX'); + } + + }, + + drawNormalRange: function (canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey) { + var normalRangeMin = this.options.get('normalRangeMin'), + normalRangeMax = this.options.get('normalRangeMax'), + ytop = canvasTop + Math.round(canvasHeight - (canvasHeight * ((normalRangeMax - this.miny) / rangey))), + height = Math.round((canvasHeight * (normalRangeMax - normalRangeMin)) / rangey); + this.target.drawRect(canvasLeft, ytop, canvasWidth, height, undefined, this.options.get('normalRangeColor')).append(); + }, + + render: function () { + var options = this.options, + target = this.target, + canvasWidth = this.canvasWidth, + canvasHeight = this.canvasHeight, + vertices = this.vertices, + spotRadius = options.get('spotRadius'), + regionMap = this.regionMap, + rangex, rangey, yvallast, + canvasTop, canvasLeft, + vertex, path, paths, x, y, xnext, xpos, xposnext, + last, next, yvalcount, lineShapes, fillShapes, plen, + valueSpots, hlSpotsEnabled, color, xvalues, yvalues, i; + + if (!line._super.render.call(this)) { + return; + } + + this.scanValues(); + this.processRangeOptions(); + + xvalues = this.xvalues; + yvalues = this.yvalues; + + if (!this.yminmax.length || this.yvalues.length < 2) { + // empty or all null valuess + return; + } + + canvasTop = canvasLeft = 0; + + rangex = this.maxx - this.minx === 0 ? 1 : this.maxx - this.minx; + rangey = this.maxy - this.miny === 0 ? 1 : this.maxy - this.miny; + yvallast = this.yvalues.length - 1; + + if (spotRadius && (canvasWidth < (spotRadius * 4) || canvasHeight < (spotRadius * 4))) { + spotRadius = 0; + } + if (spotRadius) { + // adjust the canvas size as required so that spots will fit + hlSpotsEnabled = options.get('highlightSpotColor') && !options.get('disableInteraction'); + if (hlSpotsEnabled || options.get('minSpotColor') || (options.get('spotColor') && yvalues[yvallast] === this.miny)) { + canvasHeight -= Math.ceil(spotRadius); + } + if (hlSpotsEnabled || options.get('maxSpotColor') || (options.get('spotColor') && yvalues[yvallast] === this.maxy)) { + canvasHeight -= Math.ceil(spotRadius); + canvasTop += Math.ceil(spotRadius); + } + if (hlSpotsEnabled || + ((options.get('minSpotColor') || options.get('maxSpotColor')) && (yvalues[0] === this.miny || yvalues[0] === this.maxy))) { + canvasLeft += Math.ceil(spotRadius); + canvasWidth -= Math.ceil(spotRadius); + } + if (hlSpotsEnabled || options.get('spotColor') || + (options.get('minSpotColor') || options.get('maxSpotColor') && + (yvalues[yvallast] === this.miny || yvalues[yvallast] === this.maxy))) { + canvasWidth -= Math.ceil(spotRadius); + } + } + + + canvasHeight--; + + if (options.get('normalRangeMin') !== undefined && !options.get('drawNormalOnTop')) { + this.drawNormalRange(canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey); + } + + path = []; + paths = [path]; + last = next = null; + yvalcount = yvalues.length; + for (i = 0; i < yvalcount; i++) { + x = xvalues[i]; + xnext = xvalues[i + 1]; + y = yvalues[i]; + xpos = canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex)); + xposnext = i < yvalcount - 1 ? canvasLeft + Math.round((xnext - this.minx) * (canvasWidth / rangex)) : canvasWidth; + next = xpos + ((xposnext - xpos) / 2); + regionMap[i] = [last || 0, next, i]; + last = next; + if (y === null) { + if (i) { + if (yvalues[i - 1] !== null) { + path = []; + paths.push(path); + } + vertices.push(null); + } + } else { + if (y < this.miny) { + y = this.miny; + } + if (y > this.maxy) { + y = this.maxy; + } + if (!path.length) { + // previous value was null + path.push([xpos, canvasTop + canvasHeight]); + } + vertex = [xpos, canvasTop + Math.round(canvasHeight - (canvasHeight * ((y - this.miny) / rangey)))]; + path.push(vertex); + vertices.push(vertex); + } + } + + lineShapes = []; + fillShapes = []; + plen = paths.length; + for (i = 0; i < plen; i++) { + path = paths[i]; + if (path.length) { + if (options.get('fillColor')) { + path.push([path[path.length - 1][0], (canvasTop + canvasHeight)]); + fillShapes.push(path.slice(0)); + path.pop(); + } + // if there's only a single point in this path, then we want to display it + // as a vertical line which means we keep path[0] as is + if (path.length > 2) { + // else we want the first value + path[0] = [path[0][0], path[1][1]]; + } + lineShapes.push(path); + } + } + + // draw the fill first, then optionally the normal range, then the line on top of that + plen = fillShapes.length; + for (i = 0; i < plen; i++) { + target.drawShape(fillShapes[i], + options.get('fillColor'), options.get('fillColor')).append(); + } + + if (options.get('normalRangeMin') !== undefined && options.get('drawNormalOnTop')) { + this.drawNormalRange(canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey); + } + + plen = lineShapes.length; + for (i = 0; i < plen; i++) { + target.drawShape(lineShapes[i], options.get('lineColor'), undefined, + options.get('lineWidth')).append(); + } + + if (spotRadius && options.get('valueSpots')) { + valueSpots = options.get('valueSpots'); + if (valueSpots.get === undefined) { + valueSpots = new RangeMap(valueSpots); + } + for (i = 0; i < yvalcount; i++) { + color = valueSpots.get(yvalues[i]); + if (color) { + target.drawCircle(canvasLeft + Math.round((xvalues[i] - this.minx) * (canvasWidth / rangex)), + canvasTop + Math.round(canvasHeight - (canvasHeight * ((yvalues[i] - this.miny) / rangey))), + spotRadius, undefined, + color).append(); + } + } + + } + if (spotRadius && options.get('spotColor') && yvalues[yvallast] !== null) { + target.drawCircle(canvasLeft + Math.round((xvalues[xvalues.length - 1] - this.minx) * (canvasWidth / rangex)), + canvasTop + Math.round(canvasHeight - (canvasHeight * ((yvalues[yvallast] - this.miny) / rangey))), + spotRadius, undefined, + options.get('spotColor')).append(); + } + if (this.maxy !== this.minyorg) { + if (spotRadius && options.get('minSpotColor')) { + x = xvalues[$.inArray(this.minyorg, yvalues)]; + target.drawCircle(canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex)), + canvasTop + Math.round(canvasHeight - (canvasHeight * ((this.minyorg - this.miny) / rangey))), + spotRadius, undefined, + options.get('minSpotColor')).append(); + } + if (spotRadius && options.get('maxSpotColor')) { + x = xvalues[$.inArray(this.maxyorg, yvalues)]; + target.drawCircle(canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex)), + canvasTop + Math.round(canvasHeight - (canvasHeight * ((this.maxyorg - this.miny) / rangey))), + spotRadius, undefined, + options.get('maxSpotColor')).append(); + } + } + + this.lastShapeId = target.getLastShapeId(); + this.canvasTop = canvasTop; + target.render(); + } + }); + + /** + * Bar charts + */ + $.fn.sparkline.bar = bar = createClass($.fn.sparkline._base, barHighlightMixin, { + type: 'bar', + + init: function (el, values, options, width, height) { + var barWidth = parseInt(options.get('barWidth'), 10), + barSpacing = parseInt(options.get('barSpacing'), 10), + chartRangeMin = options.get('chartRangeMin'), + chartRangeMax = options.get('chartRangeMax'), + chartRangeClip = options.get('chartRangeClip'), + stackMin = Infinity, + stackMax = -Infinity, + isStackString, groupMin, groupMax, stackRanges, + numValues, i, vlen, range, zeroAxis, xaxisOffset, min, max, clipMin, clipMax, + stacked, vlist, j, slen, svals, val, yoffset, yMaxCalc, canvasHeightEf; + bar._super.init.call(this, el, values, options, width, height); + + // scan values to determine whether to stack bars + for (i = 0, vlen = values.length; i < vlen; i++) { + val = values[i]; + isStackString = typeof(val) === 'string' && val.indexOf(':') > -1; + if (isStackString || $.isArray(val)) { + stacked = true; + if (isStackString) { + val = values[i] = normalizeValues(val.split(':')); + } + val = remove(val, null); // min/max will treat null as zero + groupMin = Math.min.apply(Math, val); + groupMax = Math.max.apply(Math, val); + if (groupMin < stackMin) { + stackMin = groupMin; + } + if (groupMax > stackMax) { + stackMax = groupMax; + } + } + } + + this.stacked = stacked; + this.regionShapes = {}; + this.barWidth = barWidth; + this.barSpacing = barSpacing; + this.totalBarWidth = barWidth + barSpacing; + this.width = width = (values.length * barWidth) + ((values.length - 1) * barSpacing); + + this.initTarget(); + + if (chartRangeClip) { + clipMin = chartRangeMin === undefined ? -Infinity : chartRangeMin; + clipMax = chartRangeMax === undefined ? Infinity : chartRangeMax; + } + + numValues = []; + stackRanges = stacked ? [] : numValues; + var stackTotals = []; + var stackRangesNeg = []; + for (i = 0, vlen = values.length; i < vlen; i++) { + if (stacked) { + vlist = values[i]; + values[i] = svals = []; + stackTotals[i] = 0; + stackRanges[i] = stackRangesNeg[i] = 0; + for (j = 0, slen = vlist.length; j < slen; j++) { + val = svals[j] = chartRangeClip ? clipval(vlist[j], clipMin, clipMax) : vlist[j]; + if (val !== null) { + if (val > 0) { + stackTotals[i] += val; + } + if (stackMin < 0 && stackMax > 0) { + if (val < 0) { + stackRangesNeg[i] += Math.abs(val); + } else { + stackRanges[i] += val; + } + } else { + stackRanges[i] += Math.abs(val - (val < 0 ? stackMax : stackMin)); + } + numValues.push(val); + } + } + } else { + val = chartRangeClip ? clipval(values[i], clipMin, clipMax) : values[i]; + val = values[i] = normalizeValue(val); + if (val !== null) { + numValues.push(val); + } + } + } + this.max = max = Math.max.apply(Math, numValues); + this.min = min = Math.min.apply(Math, numValues); + this.stackMax = stackMax = stacked ? Math.max.apply(Math, stackTotals) : max; + this.stackMin = stackMin = stacked ? Math.min.apply(Math, numValues) : min; + + if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < min)) { + min = options.get('chartRangeMin'); + } + if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > max)) { + max = options.get('chartRangeMax'); + } + + this.zeroAxis = zeroAxis = options.get('zeroAxis', true); + if (min <= 0 && max >= 0 && zeroAxis) { + xaxisOffset = 0; + } else if (zeroAxis == false) { + xaxisOffset = min; + } else if (min > 0) { + xaxisOffset = min; + } else { + xaxisOffset = max; + } + this.xaxisOffset = xaxisOffset; + + range = stacked ? (Math.max.apply(Math, stackRanges) + Math.max.apply(Math, stackRangesNeg)) : max - min; + + // as we plot zero/min values a single pixel line, we add a pixel to all other + // values - Reduce the effective canvas size to suit + this.canvasHeightEf = (zeroAxis && min < 0) ? this.canvasHeight - 2 : this.canvasHeight - 1; + + if (min < xaxisOffset) { + yMaxCalc = (stacked && max >= 0) ? stackMax : max; + yoffset = (yMaxCalc - xaxisOffset) / range * this.canvasHeight; + if (yoffset !== Math.ceil(yoffset)) { + this.canvasHeightEf -= 2; + yoffset = Math.ceil(yoffset); + } + } else { + yoffset = this.canvasHeight; + } + this.yoffset = yoffset; + + if ($.isArray(options.get('colorMap'))) { + this.colorMapByIndex = options.get('colorMap'); + this.colorMapByValue = null; + } else { + this.colorMapByIndex = null; + this.colorMapByValue = options.get('colorMap'); + if (this.colorMapByValue && this.colorMapByValue.get === undefined) { + this.colorMapByValue = new RangeMap(this.colorMapByValue); + } + } + + this.range = range; + }, + + getRegion: function (el, x, y) { + var result = Math.floor(x / this.totalBarWidth); + return (result < 0 || result >= this.values.length) ? undefined : result; + }, + + getCurrentRegionFields: function () { + var currentRegion = this.currentRegion, + values = ensureArray(this.values[currentRegion]), + result = [], + value, i; + for (i = values.length; i--;) { + value = values[i]; + result.push({ + isNull: value === null, + value: value, + color: this.calcColor(i, value, currentRegion), + offset: currentRegion + }); + } + return result; + }, + + calcColor: function (stacknum, value, valuenum) { + var colorMapByIndex = this.colorMapByIndex, + colorMapByValue = this.colorMapByValue, + options = this.options, + color, newColor; + if (this.stacked) { + color = options.get('stackedBarColor'); + } else { + color = (value < 0) ? options.get('negBarColor') : options.get('barColor'); + } + if (value === 0 && options.get('zeroColor') !== undefined) { + color = options.get('zeroColor'); + } + if (colorMapByValue && (newColor = colorMapByValue.get(value))) { + color = newColor; + } else if (colorMapByIndex && colorMapByIndex.length > valuenum) { + color = colorMapByIndex[valuenum]; + } + return $.isArray(color) ? color[stacknum % color.length] : color; + }, + + /** + * Render bar(s) for a region + */ + renderRegion: function (valuenum, highlight) { + var vals = this.values[valuenum], + options = this.options, + xaxisOffset = this.xaxisOffset, + result = [], + range = this.range, + stacked = this.stacked, + target = this.target, + x = valuenum * this.totalBarWidth, + canvasHeightEf = this.canvasHeightEf, + yoffset = this.yoffset, + y, height, color, isNull, yoffsetNeg, i, valcount, val, minPlotted, allMin; + + vals = $.isArray(vals) ? vals : [vals]; + valcount = vals.length; + val = vals[0]; + isNull = all(null, vals); + allMin = all(xaxisOffset, vals, true); + + if (isNull) { + if (options.get('nullColor')) { + color = highlight ? options.get('nullColor') : this.calcHighlightColor(options.get('nullColor'), options); + y = (yoffset > 0) ? yoffset - 1 : yoffset; + return target.drawRect(x, y, this.barWidth - 1, 0, color, color); + } else { + return undefined; + } + } + yoffsetNeg = yoffset; + for (i = 0; i < valcount; i++) { + val = vals[i]; + + if (stacked && val === xaxisOffset) { + if (!allMin || minPlotted) { + continue; + } + minPlotted = true; + } + + if (range > 0) { + height = Math.floor(canvasHeightEf * ((Math.abs(val - xaxisOffset) / range))) + 1; + } else { + height = 1; + } + if (val < xaxisOffset || (val === xaxisOffset && yoffset === 0)) { + y = yoffsetNeg; + yoffsetNeg += height; + } else { + y = yoffset - height; + yoffset -= height; + } + color = this.calcColor(i, val, valuenum); + if (highlight) { + color = this.calcHighlightColor(color, options); + } + result.push(target.drawRect(x, y, this.barWidth - 1, height - 1, color, color)); + } + if (result.length === 1) { + return result[0]; + } + return result; + } + }); + + /** + * Tristate charts + */ + $.fn.sparkline.tristate = tristate = createClass($.fn.sparkline._base, barHighlightMixin, { + type: 'tristate', + + init: function (el, values, options, width, height) { + var barWidth = parseInt(options.get('barWidth'), 10), + barSpacing = parseInt(options.get('barSpacing'), 10); + tristate._super.init.call(this, el, values, options, width, height); + + this.regionShapes = {}; + this.barWidth = barWidth; + this.barSpacing = barSpacing; + this.totalBarWidth = barWidth + barSpacing; + this.values = $.map(values, Number); + this.width = width = (values.length * barWidth) + ((values.length - 1) * barSpacing); + + if ($.isArray(options.get('colorMap'))) { + this.colorMapByIndex = options.get('colorMap'); + this.colorMapByValue = null; + } else { + this.colorMapByIndex = null; + this.colorMapByValue = options.get('colorMap'); + if (this.colorMapByValue && this.colorMapByValue.get === undefined) { + this.colorMapByValue = new RangeMap(this.colorMapByValue); + } + } + this.initTarget(); + }, + + getRegion: function (el, x, y) { + return Math.floor(x / this.totalBarWidth); + }, + + getCurrentRegionFields: function () { + var currentRegion = this.currentRegion; + return { + isNull: this.values[currentRegion] === undefined, + value: this.values[currentRegion], + color: this.calcColor(this.values[currentRegion], currentRegion), + offset: currentRegion + }; + }, + + calcColor: function (value, valuenum) { + var values = this.values, + options = this.options, + colorMapByIndex = this.colorMapByIndex, + colorMapByValue = this.colorMapByValue, + color, newColor; + + if (colorMapByValue && (newColor = colorMapByValue.get(value))) { + color = newColor; + } else if (colorMapByIndex && colorMapByIndex.length > valuenum) { + color = colorMapByIndex[valuenum]; + } else if (values[valuenum] < 0) { + color = options.get('negBarColor'); + } else if (values[valuenum] > 0) { + color = options.get('posBarColor'); + } else { + color = options.get('zeroBarColor'); + } + return color; + }, + + renderRegion: function (valuenum, highlight) { + var values = this.values, + options = this.options, + target = this.target, + canvasHeight, height, halfHeight, + x, y, color; + + canvasHeight = target.pixelHeight; + halfHeight = Math.round(canvasHeight / 2); + + x = valuenum * this.totalBarWidth; + if (values[valuenum] < 0) { + y = halfHeight; + height = halfHeight - 1; + } else if (values[valuenum] > 0) { + y = 0; + height = halfHeight - 1; + } else { + y = halfHeight - 1; + height = 2; + } + color = this.calcColor(values[valuenum], valuenum); + if (color === null) { + return; + } + if (highlight) { + color = this.calcHighlightColor(color, options); + } + return target.drawRect(x, y, this.barWidth - 1, height - 1, color, color); + } + }); + + /** + * Discrete charts + */ + $.fn.sparkline.discrete = discrete = createClass($.fn.sparkline._base, barHighlightMixin, { + type: 'discrete', + + init: function (el, values, options, width, height) { + discrete._super.init.call(this, el, values, options, width, height); + + this.regionShapes = {}; + this.values = values = $.map(values, Number); + this.min = Math.min.apply(Math, values); + this.max = Math.max.apply(Math, values); + this.range = this.max - this.min; + this.width = width = options.get('width') === 'auto' ? values.length * 2 : this.width; + this.interval = Math.floor(width / values.length); + this.itemWidth = width / values.length; + if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < this.min)) { + this.min = options.get('chartRangeMin'); + } + if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > this.max)) { + this.max = options.get('chartRangeMax'); + } + this.initTarget(); + if (this.target) { + this.lineHeight = options.get('lineHeight') === 'auto' ? Math.round(this.canvasHeight * 0.3) : options.get('lineHeight'); + } + }, + + getRegion: function (el, x, y) { + return Math.floor(x / this.itemWidth); + }, + + getCurrentRegionFields: function () { + var currentRegion = this.currentRegion; + return { + isNull: this.values[currentRegion] === undefined, + value: this.values[currentRegion], + offset: currentRegion + }; + }, + + renderRegion: function (valuenum, highlight) { + var values = this.values, + options = this.options, + min = this.min, + max = this.max, + range = this.range, + interval = this.interval, + target = this.target, + canvasHeight = this.canvasHeight, + lineHeight = this.lineHeight, + pheight = canvasHeight - lineHeight, + ytop, val, color, x; + + val = clipval(values[valuenum], min, max); + x = valuenum * interval; + ytop = Math.round(pheight - pheight * ((val - min) / range)); + color = (options.get('thresholdColor') && val < options.get('thresholdValue')) ? options.get('thresholdColor') : options.get('lineColor'); + if (highlight) { + color = this.calcHighlightColor(color, options); + } + return target.drawLine(x, ytop, x, ytop + lineHeight, color); + } + }); + + /** + * Bullet charts + */ + $.fn.sparkline.bullet = bullet = createClass($.fn.sparkline._base, { + type: 'bullet', + + init: function (el, values, options, width, height) { + var min, max, vals; + bullet._super.init.call(this, el, values, options, width, height); + + // values: target, performance, range1, range2, range3 + this.values = values = normalizeValues(values); + // target or performance could be null + vals = values.slice(); + vals[0] = vals[0] === null ? vals[2] : vals[0]; + vals[1] = values[1] === null ? vals[2] : vals[1]; + min = Math.min.apply(Math, values); + max = Math.max.apply(Math, values); + if (options.get('base') === undefined) { + min = min < 0 ? min : 0; + } else { + min = options.get('base'); + } + this.min = min; + this.max = max; + this.range = max - min; + this.shapes = {}; + this.valueShapes = {}; + this.regiondata = {}; + this.width = width = options.get('width') === 'auto' ? '4.0em' : width; + this.target = this.$el.simpledraw(width, height, options.get('composite')); + if (!values.length) { + this.disabled = true; + } + this.initTarget(); + }, + + getRegion: function (el, x, y) { + var shapeid = this.target.getShapeAt(el, x, y); + return (shapeid !== undefined && this.shapes[shapeid] !== undefined) ? this.shapes[shapeid] : undefined; + }, + + getCurrentRegionFields: function () { + var currentRegion = this.currentRegion; + return { + fieldkey: currentRegion.substr(0, 1), + value: this.values[currentRegion.substr(1)], + region: currentRegion + }; + }, + + changeHighlight: function (highlight) { + var currentRegion = this.currentRegion, + shapeid = this.valueShapes[currentRegion], + shape; + delete this.shapes[shapeid]; + switch (currentRegion.substr(0, 1)) { + case 'r': + shape = this.renderRange(currentRegion.substr(1), highlight); + break; + case 'p': + shape = this.renderPerformance(highlight); + break; + case 't': + shape = this.renderTarget(highlight); + break; + } + this.valueShapes[currentRegion] = shape.id; + this.shapes[shape.id] = currentRegion; + this.target.replaceWithShape(shapeid, shape); + }, + + renderRange: function (rn, highlight) { + var rangeval = this.values[rn], + rangewidth = Math.round(this.canvasWidth * ((rangeval - this.min) / this.range)), + color = this.options.get('rangeColors')[rn - 2]; + if (highlight) { + color = this.calcHighlightColor(color, this.options); + } + return this.target.drawRect(0, 0, rangewidth - 1, this.canvasHeight - 1, color, color); + }, + + renderPerformance: function (highlight) { + var perfval = this.values[1], + perfwidth = Math.round(this.canvasWidth * ((perfval - this.min) / this.range)), + color = this.options.get('performanceColor'); + if (highlight) { + color = this.calcHighlightColor(color, this.options); + } + return this.target.drawRect(0, Math.round(this.canvasHeight * 0.3), perfwidth - 1, + Math.round(this.canvasHeight * 0.4) - 1, color, color); + }, + + renderTarget: function (highlight) { + var targetval = this.values[0], + x = Math.round(this.canvasWidth * ((targetval - this.min) / this.range) - (this.options.get('targetWidth') / 2)), + targettop = Math.round(this.canvasHeight * 0.10), + targetheight = this.canvasHeight - (targettop * 2), + color = this.options.get('targetColor'); + if (highlight) { + color = this.calcHighlightColor(color, this.options); + } + return this.target.drawRect(x, targettop, this.options.get('targetWidth') - 1, targetheight - 1, color, color); + }, + + render: function () { + var vlen = this.values.length, + target = this.target, + i, shape; + if (!bullet._super.render.call(this)) { + return; + } + for (i = 2; i < vlen; i++) { + shape = this.renderRange(i).append(); + this.shapes[shape.id] = 'r' + i; + this.valueShapes['r' + i] = shape.id; + } + if (this.values[1] !== null) { + shape = this.renderPerformance().append(); + this.shapes[shape.id] = 'p1'; + this.valueShapes.p1 = shape.id; + } + if (this.values[0] !== null) { + shape = this.renderTarget().append(); + this.shapes[shape.id] = 't0'; + this.valueShapes.t0 = shape.id; + } + target.render(); + } + }); + + /** + * Pie charts + */ + $.fn.sparkline.pie = pie = createClass($.fn.sparkline._base, { + type: 'pie', + + init: function (el, values, options, width, height) { + var total = 0, i; + + pie._super.init.call(this, el, values, options, width, height); + + this.shapes = {}; // map shape ids to value offsets + this.valueShapes = {}; // maps value offsets to shape ids + this.values = values = $.map(values, Number); + + if (options.get('width') === 'auto') { + this.width = this.height; + } + + if (values.length > 0) { + for (i = values.length; i--;) { + total += values[i]; + } + } + this.total = total; + this.initTarget(); + this.radius = Math.floor(Math.min(this.canvasWidth, this.canvasHeight) / 2); + }, + + getRegion: function (el, x, y) { + var shapeid = this.target.getShapeAt(el, x, y); + return (shapeid !== undefined && this.shapes[shapeid] !== undefined) ? this.shapes[shapeid] : undefined; + }, + + getCurrentRegionFields: function () { + var currentRegion = this.currentRegion; + return { + isNull: this.values[currentRegion] === undefined, + value: this.values[currentRegion], + percent: this.values[currentRegion] / this.total * 100, + color: this.options.get('sliceColors')[currentRegion % this.options.get('sliceColors').length], + offset: currentRegion + }; + }, + + changeHighlight: function (highlight) { + var currentRegion = this.currentRegion, + newslice = this.renderSlice(currentRegion, highlight), + shapeid = this.valueShapes[currentRegion]; + delete this.shapes[shapeid]; + this.target.replaceWithShape(shapeid, newslice); + this.valueShapes[currentRegion] = newslice.id; + this.shapes[newslice.id] = currentRegion; + }, + + renderSlice: function (valuenum, highlight) { + var target = this.target, + options = this.options, + radius = this.radius, + borderWidth = options.get('borderWidth'), + offset = options.get('offset'), + circle = 2 * Math.PI, + values = this.values, + total = this.total, + next = offset ? (2*Math.PI)*(offset/360) : 0, + start, end, i, vlen, color; + + vlen = values.length; + for (i = 0; i < vlen; i++) { + start = next; + end = next; + if (total > 0) { // avoid divide by zero + end = next + (circle * (values[i] / total)); + } + if (valuenum === i) { + color = options.get('sliceColors')[i % options.get('sliceColors').length]; + if (highlight) { + color = this.calcHighlightColor(color, options); + } + + return target.drawPieSlice(radius, radius, radius - borderWidth, start, end, undefined, color); + } + next = end; + } + }, + + render: function () { + var target = this.target, + values = this.values, + options = this.options, + radius = this.radius, + borderWidth = options.get('borderWidth'), + shape, i; + + if (!pie._super.render.call(this)) { + return; + } + if (borderWidth) { + target.drawCircle(radius, radius, Math.floor(radius - (borderWidth / 2)), + options.get('borderColor'), undefined, borderWidth).append(); + } + for (i = values.length; i--;) { + if (values[i]) { // don't render zero values + shape = this.renderSlice(i).append(); + this.valueShapes[i] = shape.id; // store just the shapeid + this.shapes[shape.id] = i; + } + } + target.render(); + } + }); + + /** + * Box plots + */ + $.fn.sparkline.box = box = createClass($.fn.sparkline._base, { + type: 'box', + + init: function (el, values, options, width, height) { + box._super.init.call(this, el, values, options, width, height); + this.values = $.map(values, Number); + this.width = options.get('width') === 'auto' ? '4.0em' : width; + this.initTarget(); + if (!this.values.length) { + this.disabled = 1; + } + }, + + /** + * Simulate a single region + */ + getRegion: function () { + return 1; + }, + + getCurrentRegionFields: function () { + var result = [ + { field: 'lq', value: this.quartiles[0] }, + { field: 'med', value: this.quartiles[1] }, + { field: 'uq', value: this.quartiles[2] } + ]; + if (this.loutlier !== undefined) { + result.push({ field: 'lo', value: this.loutlier}); + } + if (this.routlier !== undefined) { + result.push({ field: 'ro', value: this.routlier}); + } + if (this.lwhisker !== undefined) { + result.push({ field: 'lw', value: this.lwhisker}); + } + if (this.rwhisker !== undefined) { + result.push({ field: 'rw', value: this.rwhisker}); + } + return result; + }, + + render: function () { + var target = this.target, + values = this.values, + vlen = values.length, + options = this.options, + canvasWidth = this.canvasWidth, + canvasHeight = this.canvasHeight, + minValue = options.get('chartRangeMin') === undefined ? Math.min.apply(Math, values) : options.get('chartRangeMin'), + maxValue = options.get('chartRangeMax') === undefined ? Math.max.apply(Math, values) : options.get('chartRangeMax'), + canvasLeft = 0, + lwhisker, loutlier, iqr, q1, q2, q3, rwhisker, routlier, i, + size, unitSize; + + if (!box._super.render.call(this)) { + return; + } + + if (options.get('raw')) { + if (options.get('showOutliers') && values.length > 5) { + loutlier = values[0]; + lwhisker = values[1]; + q1 = values[2]; + q2 = values[3]; + q3 = values[4]; + rwhisker = values[5]; + routlier = values[6]; + } else { + lwhisker = values[0]; + q1 = values[1]; + q2 = values[2]; + q3 = values[3]; + rwhisker = values[4]; + } + } else { + values.sort(function (a, b) { return a - b; }); + q1 = quartile(values, 1); + q2 = quartile(values, 2); + q3 = quartile(values, 3); + iqr = q3 - q1; + if (options.get('showOutliers')) { + lwhisker = rwhisker = undefined; + for (i = 0; i < vlen; i++) { + if (lwhisker === undefined && values[i] > q1 - (iqr * options.get('outlierIQR'))) { + lwhisker = values[i]; + } + if (values[i] < q3 + (iqr * options.get('outlierIQR'))) { + rwhisker = values[i]; + } + } + loutlier = values[0]; + routlier = values[vlen - 1]; + } else { + lwhisker = values[0]; + rwhisker = values[vlen - 1]; + } + } + this.quartiles = [q1, q2, q3]; + this.lwhisker = lwhisker; + this.rwhisker = rwhisker; + this.loutlier = loutlier; + this.routlier = routlier; + + unitSize = canvasWidth / (maxValue - minValue + 1); + if (options.get('showOutliers')) { + canvasLeft = Math.ceil(options.get('spotRadius')); + canvasWidth -= 2 * Math.ceil(options.get('spotRadius')); + unitSize = canvasWidth / (maxValue - minValue + 1); + if (loutlier < lwhisker) { + target.drawCircle((loutlier - minValue) * unitSize + canvasLeft, + canvasHeight / 2, + options.get('spotRadius'), + options.get('outlierLineColor'), + options.get('outlierFillColor')).append(); + } + if (routlier > rwhisker) { + target.drawCircle((routlier - minValue) * unitSize + canvasLeft, + canvasHeight / 2, + options.get('spotRadius'), + options.get('outlierLineColor'), + options.get('outlierFillColor')).append(); + } + } + + // box + target.drawRect( + Math.round((q1 - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight * 0.1), + Math.round((q3 - q1) * unitSize), + Math.round(canvasHeight * 0.8), + options.get('boxLineColor'), + options.get('boxFillColor')).append(); + // left whisker + target.drawLine( + Math.round((lwhisker - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight / 2), + Math.round((q1 - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight / 2), + options.get('lineColor')).append(); + target.drawLine( + Math.round((lwhisker - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight / 4), + Math.round((lwhisker - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight - canvasHeight / 4), + options.get('whiskerColor')).append(); + // right whisker + target.drawLine(Math.round((rwhisker - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight / 2), + Math.round((q3 - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight / 2), + options.get('lineColor')).append(); + target.drawLine( + Math.round((rwhisker - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight / 4), + Math.round((rwhisker - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight - canvasHeight / 4), + options.get('whiskerColor')).append(); + // median line + target.drawLine( + Math.round((q2 - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight * 0.1), + Math.round((q2 - minValue) * unitSize + canvasLeft), + Math.round(canvasHeight * 0.9), + options.get('medianColor')).append(); + if (options.get('target')) { + size = Math.ceil(options.get('spotRadius')); + target.drawLine( + Math.round((options.get('target') - minValue) * unitSize + canvasLeft), + Math.round((canvasHeight / 2) - size), + Math.round((options.get('target') - minValue) * unitSize + canvasLeft), + Math.round((canvasHeight / 2) + size), + options.get('targetColor')).append(); + target.drawLine( + Math.round((options.get('target') - minValue) * unitSize + canvasLeft - size), + Math.round(canvasHeight / 2), + Math.round((options.get('target') - minValue) * unitSize + canvasLeft + size), + Math.round(canvasHeight / 2), + options.get('targetColor')).append(); + } + target.render(); + } + }); + + // Setup a very simple "virtual canvas" to make drawing the few shapes we need easier + // This is accessible as $(foo).simpledraw() + + VShape = createClass({ + init: function (target, id, type, args) { + this.target = target; + this.id = id; + this.type = type; + this.args = args; + }, + append: function () { + this.target.appendShape(this); + return this; + } + }); + + VCanvas_base = createClass({ + _pxregex: /(\d+)(px)?\s*$/i, + + init: function (width, height, target) { + if (!width) { + return; + } + this.width = width; + this.height = height; + this.target = target; + this.lastShapeId = null; + if (target[0]) { + target = target[0]; + } + $.data(target, '_jqs_vcanvas', this); + }, + + drawLine: function (x1, y1, x2, y2, lineColor, lineWidth) { + return this.drawShape([[x1, y1], [x2, y2]], lineColor, lineWidth); + }, + + drawShape: function (path, lineColor, fillColor, lineWidth) { + return this._genShape('Shape', [path, lineColor, fillColor, lineWidth]); + }, + + drawCircle: function (x, y, radius, lineColor, fillColor, lineWidth) { + return this._genShape('Circle', [x, y, radius, lineColor, fillColor, lineWidth]); + }, + + drawPieSlice: function (x, y, radius, startAngle, endAngle, lineColor, fillColor) { + return this._genShape('PieSlice', [x, y, radius, startAngle, endAngle, lineColor, fillColor]); + }, + + drawRect: function (x, y, width, height, lineColor, fillColor) { + return this._genShape('Rect', [x, y, width, height, lineColor, fillColor]); + }, + + getElement: function () { + return this.canvas; + }, + + /** + * Return the most recently inserted shape id + */ + getLastShapeId: function () { + return this.lastShapeId; + }, + + /** + * Clear and reset the canvas + */ + reset: function () { + alert('reset not implemented'); + }, + + _insert: function (el, target) { + $(target).html(el); + }, + + /** + * Calculate the pixel dimensions of the canvas + */ + _calculatePixelDims: function (width, height, canvas) { + // XXX This should probably be a configurable option + var match; + match = this._pxregex.exec(height); + if (match) { + this.pixelHeight = match[1]; + } else { + this.pixelHeight = $(canvas).height(); + } + match = this._pxregex.exec(width); + if (match) { + this.pixelWidth = match[1]; + } else { + this.pixelWidth = $(canvas).width(); + } + }, + + /** + * Generate a shape object and id for later rendering + */ + _genShape: function (shapetype, shapeargs) { + var id = shapeCount++; + shapeargs.unshift(id); + return new VShape(this, id, shapetype, shapeargs); + }, + + /** + * Add a shape to the end of the render queue + */ + appendShape: function (shape) { + alert('appendShape not implemented'); + }, + + /** + * Replace one shape with another + */ + replaceWithShape: function (shapeid, shape) { + alert('replaceWithShape not implemented'); + }, + + /** + * Insert one shape after another in the render queue + */ + insertAfterShape: function (shapeid, shape) { + alert('insertAfterShape not implemented'); + }, + + /** + * Remove a shape from the queue + */ + removeShapeId: function (shapeid) { + alert('removeShapeId not implemented'); + }, + + /** + * Find a shape at the specified x/y co-ordinates + */ + getShapeAt: function (el, x, y) { + alert('getShapeAt not implemented'); + }, + + /** + * Render all queued shapes onto the canvas + */ + render: function () { + alert('render not implemented'); + } + }); + + VCanvas_canvas = createClass(VCanvas_base, { + init: function (width, height, target, interact) { + VCanvas_canvas._super.init.call(this, width, height, target); + this.canvas = document.createElement('canvas'); + if (target[0]) { + target = target[0]; + } + $.data(target, '_jqs_vcanvas', this); + $(this.canvas).css({ display: 'inline-block', width: width, height: height, verticalAlign: 'top' }); + this._insert(this.canvas, target); + this._calculatePixelDims(width, height, this.canvas); + this.canvas.width = this.pixelWidth; + this.canvas.height = this.pixelHeight; + this.interact = interact; + this.shapes = {}; + this.shapeseq = []; + this.currentTargetShapeId = undefined; + $(this.canvas).css({width: this.pixelWidth, height: this.pixelHeight}); + }, + + _getContext: function (lineColor, fillColor, lineWidth) { + var context = this.canvas.getContext('2d'); + if (lineColor !== undefined) { + context.strokeStyle = lineColor; + } + context.lineWidth = lineWidth === undefined ? 1 : lineWidth; + if (fillColor !== undefined) { + context.fillStyle = fillColor; + } + return context; + }, + + reset: function () { + var context = this._getContext(); + context.clearRect(0, 0, this.pixelWidth, this.pixelHeight); + this.shapes = {}; + this.shapeseq = []; + this.currentTargetShapeId = undefined; + }, + + _drawShape: function (shapeid, path, lineColor, fillColor, lineWidth) { + var context = this._getContext(lineColor, fillColor, lineWidth), + i, plen; + context.beginPath(); + context.moveTo(path[0][0] + 0.5, path[0][1] + 0.5); + for (i = 1, plen = path.length; i < plen; i++) { + context.lineTo(path[i][0] + 0.5, path[i][1] + 0.5); // the 0.5 offset gives us crisp pixel-width lines + } + if (lineColor !== undefined) { + context.stroke(); + } + if (fillColor !== undefined) { + context.fill(); + } + if (this.targetX !== undefined && this.targetY !== undefined && + context.isPointInPath(this.targetX, this.targetY)) { + this.currentTargetShapeId = shapeid; + } + }, + + _drawCircle: function (shapeid, x, y, radius, lineColor, fillColor, lineWidth) { + var context = this._getContext(lineColor, fillColor, lineWidth); + context.beginPath(); + context.arc(x, y, radius, 0, 2 * Math.PI, false); + if (this.targetX !== undefined && this.targetY !== undefined && + context.isPointInPath(this.targetX, this.targetY)) { + this.currentTargetShapeId = shapeid; + } + if (lineColor !== undefined) { + context.stroke(); + } + if (fillColor !== undefined) { + context.fill(); + } + }, + + _drawPieSlice: function (shapeid, x, y, radius, startAngle, endAngle, lineColor, fillColor) { + var context = this._getContext(lineColor, fillColor); + context.beginPath(); + context.moveTo(x, y); + context.arc(x, y, radius, startAngle, endAngle, false); + context.lineTo(x, y); + context.closePath(); + if (lineColor !== undefined) { + context.stroke(); + } + if (fillColor) { + context.fill(); + } + if (this.targetX !== undefined && this.targetY !== undefined && + context.isPointInPath(this.targetX, this.targetY)) { + this.currentTargetShapeId = shapeid; + } + }, + + _drawRect: function (shapeid, x, y, width, height, lineColor, fillColor) { + return this._drawShape(shapeid, [[x, y], [x + width, y], [x + width, y + height], [x, y + height], [x, y]], lineColor, fillColor); + }, + + appendShape: function (shape) { + this.shapes[shape.id] = shape; + this.shapeseq.push(shape.id); + this.lastShapeId = shape.id; + return shape.id; + }, + + replaceWithShape: function (shapeid, shape) { + var shapeseq = this.shapeseq, + i; + this.shapes[shape.id] = shape; + for (i = shapeseq.length; i--;) { + if (shapeseq[i] == shapeid) { + shapeseq[i] = shape.id; + } + } + delete this.shapes[shapeid]; + }, + + replaceWithShapes: function (shapeids, shapes) { + var shapeseq = this.shapeseq, + shapemap = {}, + sid, i, first; + + for (i = shapeids.length; i--;) { + shapemap[shapeids[i]] = true; + } + for (i = shapeseq.length; i--;) { + sid = shapeseq[i]; + if (shapemap[sid]) { + shapeseq.splice(i, 1); + delete this.shapes[sid]; + first = i; + } + } + for (i = shapes.length; i--;) { + shapeseq.splice(first, 0, shapes[i].id); + this.shapes[shapes[i].id] = shapes[i]; + } + + }, + + insertAfterShape: function (shapeid, shape) { + var shapeseq = this.shapeseq, + i; + for (i = shapeseq.length; i--;) { + if (shapeseq[i] === shapeid) { + shapeseq.splice(i + 1, 0, shape.id); + this.shapes[shape.id] = shape; + return; + } + } + }, + + removeShapeId: function (shapeid) { + var shapeseq = this.shapeseq, + i; + for (i = shapeseq.length; i--;) { + if (shapeseq[i] === shapeid) { + shapeseq.splice(i, 1); + break; + } + } + delete this.shapes[shapeid]; + }, + + getShapeAt: function (el, x, y) { + this.targetX = x; + this.targetY = y; + this.render(); + return this.currentTargetShapeId; + }, + + render: function () { + var shapeseq = this.shapeseq, + shapes = this.shapes, + shapeCount = shapeseq.length, + context = this._getContext(), + shapeid, shape, i; + context.clearRect(0, 0, this.pixelWidth, this.pixelHeight); + for (i = 0; i < shapeCount; i++) { + shapeid = shapeseq[i]; + shape = shapes[shapeid]; + this['_draw' + shape.type].apply(this, shape.args); + } + if (!this.interact) { + // not interactive so no need to keep the shapes array + this.shapes = {}; + this.shapeseq = []; + } + } + + }); + + VCanvas_vml = createClass(VCanvas_base, { + init: function (width, height, target) { + var groupel; + VCanvas_vml._super.init.call(this, width, height, target); + if (target[0]) { + target = target[0]; + } + $.data(target, '_jqs_vcanvas', this); + this.canvas = document.createElement('span'); + $(this.canvas).css({ display: 'inline-block', position: 'relative', overflow: 'hidden', width: width, height: height, margin: '0px', padding: '0px', verticalAlign: 'top'}); + this._insert(this.canvas, target); + this._calculatePixelDims(width, height, this.canvas); + this.canvas.width = this.pixelWidth; + this.canvas.height = this.pixelHeight; + groupel = '<v:group coordorigin="0 0" coordsize="' + this.pixelWidth + ' ' + this.pixelHeight + '"' + + ' style="position:absolute;top:0;left:0;width:' + this.pixelWidth + 'px;height=' + this.pixelHeight + 'px;"></v:group>'; + this.canvas.insertAdjacentHTML('beforeEnd', groupel); + this.group = $(this.canvas).children()[0]; + this.rendered = false; + this.prerender = ''; + }, + + _drawShape: function (shapeid, path, lineColor, fillColor, lineWidth) { + var vpath = [], + initial, stroke, fill, closed, vel, plen, i; + for (i = 0, plen = path.length; i < plen; i++) { + vpath[i] = '' + (path[i][0]) + ',' + (path[i][1]); + } + initial = vpath.splice(0, 1); + lineWidth = lineWidth === undefined ? 1 : lineWidth; + stroke = lineColor === undefined ? ' stroked="false" ' : ' strokeWeight="' + lineWidth + 'px" strokeColor="' + lineColor + '" '; + fill = fillColor === undefined ? ' filled="false"' : ' fillColor="' + fillColor + '" filled="true" '; + closed = vpath[0] === vpath[vpath.length - 1] ? 'x ' : ''; + vel = '<v:shape coordorigin="0 0" coordsize="' + this.pixelWidth + ' ' + this.pixelHeight + '" ' + + ' id="jqsshape' + shapeid + '" ' + + stroke + + fill + + ' style="position:absolute;left:0px;top:0px;height:' + this.pixelHeight + 'px;width:' + this.pixelWidth + 'px;padding:0px;margin:0px;" ' + + ' path="m ' + initial + ' l ' + vpath.join(', ') + ' ' + closed + 'e">' + + ' </v:shape>'; + return vel; + }, + + _drawCircle: function (shapeid, x, y, radius, lineColor, fillColor, lineWidth) { + var stroke, fill, vel; + x -= radius; + y -= radius; + stroke = lineColor === undefined ? ' stroked="false" ' : ' strokeWeight="' + lineWidth + 'px" strokeColor="' + lineColor + '" '; + fill = fillColor === undefined ? ' filled="false"' : ' fillColor="' + fillColor + '" filled="true" '; + vel = '<v:oval ' + + ' id="jqsshape' + shapeid + '" ' + + stroke + + fill + + ' style="position:absolute;top:' + y + 'px; left:' + x + 'px; width:' + (radius * 2) + 'px; height:' + (radius * 2) + 'px"></v:oval>'; + return vel; + + }, + + _drawPieSlice: function (shapeid, x, y, radius, startAngle, endAngle, lineColor, fillColor) { + var vpath, startx, starty, endx, endy, stroke, fill, vel; + if (startAngle === endAngle) { + return ''; // VML seems to have problem when start angle equals end angle. + } + if ((endAngle - startAngle) === (2 * Math.PI)) { + startAngle = 0.0; // VML seems to have a problem when drawing a full circle that doesn't start 0 + endAngle = (2 * Math.PI); + } + + startx = x + Math.round(Math.cos(startAngle) * radius); + starty = y + Math.round(Math.sin(startAngle) * radius); + endx = x + Math.round(Math.cos(endAngle) * radius); + endy = y + Math.round(Math.sin(endAngle) * radius); + + if (startx === endx && starty === endy) { + if ((endAngle - startAngle) < Math.PI) { + // Prevent very small slices from being mistaken as a whole pie + return ''; + } + // essentially going to be the entire circle, so ignore startAngle + startx = endx = x + radius; + starty = endy = y; + } + + if (startx === endx && starty === endy && (endAngle - startAngle) < Math.PI) { + return ''; + } + + vpath = [x - radius, y - radius, x + radius, y + radius, startx, starty, endx, endy]; + stroke = lineColor === undefined ? ' stroked="false" ' : ' strokeWeight="1px" strokeColor="' + lineColor + '" '; + fill = fillColor === undefined ? ' filled="false"' : ' fillColor="' + fillColor + '" filled="true" '; + vel = '<v:shape coordorigin="0 0" coordsize="' + this.pixelWidth + ' ' + this.pixelHeight + '" ' + + ' id="jqsshape' + shapeid + '" ' + + stroke + + fill + + ' style="position:absolute;left:0px;top:0px;height:' + this.pixelHeight + 'px;width:' + this.pixelWidth + 'px;padding:0px;margin:0px;" ' + + ' path="m ' + x + ',' + y + ' wa ' + vpath.join(', ') + ' x e">' + + ' </v:shape>'; + return vel; + }, + + _drawRect: function (shapeid, x, y, width, height, lineColor, fillColor) { + return this._drawShape(shapeid, [[x, y], [x, y + height], [x + width, y + height], [x + width, y], [x, y]], lineColor, fillColor); + }, + + reset: function () { + this.group.innerHTML = ''; + }, + + appendShape: function (shape) { + var vel = this['_draw' + shape.type].apply(this, shape.args); + if (this.rendered) { + this.group.insertAdjacentHTML('beforeEnd', vel); + } else { + this.prerender += vel; + } + this.lastShapeId = shape.id; + return shape.id; + }, + + replaceWithShape: function (shapeid, shape) { + var existing = $('#jqsshape' + shapeid), + vel = this['_draw' + shape.type].apply(this, shape.args); + existing[0].outerHTML = vel; + }, + + replaceWithShapes: function (shapeids, shapes) { + // replace the first shapeid with all the new shapes then toast the remaining old shapes + var existing = $('#jqsshape' + shapeids[0]), + replace = '', + slen = shapes.length, + i; + for (i = 0; i < slen; i++) { + replace += this['_draw' + shapes[i].type].apply(this, shapes[i].args); + } + existing[0].outerHTML = replace; + for (i = 1; i < shapeids.length; i++) { + $('#jqsshape' + shapeids[i]).remove(); + } + }, + + insertAfterShape: function (shapeid, shape) { + var existing = $('#jqsshape' + shapeid), + vel = this['_draw' + shape.type].apply(this, shape.args); + existing[0].insertAdjacentHTML('afterEnd', vel); + }, + + removeShapeId: function (shapeid) { + var existing = $('#jqsshape' + shapeid); + this.group.removeChild(existing[0]); + }, + + getShapeAt: function (el, x, y) { + var shapeid = el.id.substr(8); + return shapeid; + }, + + render: function () { + if (!this.rendered) { + // batch the intial render into a single repaint + this.group.innerHTML = this.prerender; + this.rendered = true; + } + } + }); + +}))}(document, Math)); diff --git a/theme/bootstrap/plugins/sparkline/jquery.sparkline.min.js b/theme/bootstrap/plugins/sparkline/jquery.sparkline.min.js new file mode 100644 index 0000000..fa616bf --- /dev/null +++ b/theme/bootstrap/plugins/sparkline/jquery.sparkline.min.js @@ -0,0 +1,5 @@ +/* jquery.sparkline 2.1.2 - http://omnipotent.net/jquery.sparkline/ +** Licensed under the New BSD License - see above site for details */ + +(function(a,b,c){(function(a){typeof define=="function"&&define.amd?define(["jquery"],a):jQuery&&!jQuery.fn.sparkline&&a(jQuery)})(function(d){"use strict";var e={},f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L=0;f=function(){return{common:{type:"line",lineColor:"#00f",fillColor:"#cdf",defaultPixelsPerValue:3,width:"auto",height:"auto",composite:!1,tagValuesAttribute:"values",tagOptionsPrefix:"spark",enableTagOptions:!1,enableHighlight:!0,highlightLighten:1.4,tooltipSkipNull:!0,tooltipPrefix:"",tooltipSuffix:"",disableHiddenCheck:!1,numberFormatter:!1,numberDigitGroupCount:3,numberDigitGroupSep:",",numberDecimalMark:".",disableTooltips:!1,disableInteraction:!1},line:{spotColor:"#f80",highlightSpotColor:"#5f5",highlightLineColor:"#f22",spotRadius:1.5,minSpotColor:"#f80",maxSpotColor:"#f80",lineWidth:1,normalRangeMin:c,normalRangeMax:c,normalRangeColor:"#ccc",drawNormalOnTop:!1,chartRangeMin:c,chartRangeMax:c,chartRangeMinX:c,chartRangeMaxX:c,tooltipFormat:new h('<span style="color: {{color}}">&#9679;</span> {{prefix}}{{y}}{{suffix}}')},bar:{barColor:"#3366cc",negBarColor:"#f44",stackedBarColor:["#3366cc","#dc3912","#ff9900","#109618","#66aa00","#dd4477","#0099c6","#990099"],zeroColor:c,nullColor:c,zeroAxis:!0,barWidth:4,barSpacing:1,chartRangeMax:c,chartRangeMin:c,chartRangeClip:!1,colorMap:c,tooltipFormat:new h('<span style="color: {{color}}">&#9679;</span> {{prefix}}{{value}}{{suffix}}')},tristate:{barWidth:4,barSpacing:1,posBarColor:"#6f6",negBarColor:"#f44",zeroBarColor:"#999",colorMap:{},tooltipFormat:new h('<span style="color: {{color}}">&#9679;</span> {{value:map}}'),tooltipValueLookups:{map:{"-1":"Loss",0:"Draw",1:"Win"}}},discrete:{lineHeight:"auto",thresholdColor:c,thresholdValue:0,chartRangeMax:c,chartRangeMin:c,chartRangeClip:!1,tooltipFormat:new h("{{prefix}}{{value}}{{suffix}}")},bullet:{targetColor:"#f33",targetWidth:3,performanceColor:"#33f",rangeColors:["#d3dafe","#a8b6ff","#7f94ff"],base:c,tooltipFormat:new h("{{fieldkey:fields}} - {{value}}"),tooltipValueLookups:{fields:{r:"Range",p:"Performance",t:"Target"}}},pie:{offset:0,sliceColors:["#3366cc","#dc3912","#ff9900","#109618","#66aa00","#dd4477","#0099c6","#990099"],borderWidth:0,borderColor:"#000",tooltipFormat:new h('<span style="color: {{color}}">&#9679;</span> {{value}} ({{percent.1}}%)')},box:{raw:!1,boxLineColor:"#000",boxFillColor:"#cdf",whiskerColor:"#000",outlierLineColor:"#333",outlierFillColor:"#fff",medianColor:"#f00",showOutliers:!0,outlierIQR:1.5,spotRadius:1.5,target:c,targetColor:"#4a2",chartRangeMax:c,chartRangeMin:c,tooltipFormat:new h("{{field:fields}}: {{value}}"),tooltipFormatFieldlistKey:"field",tooltipValueLookups:{fields:{lq:"Lower Quartile",med:"Median",uq:"Upper Quartile",lo:"Left Outlier",ro:"Right Outlier",lw:"Left Whisker",rw:"Right Whisker"}}}}},E='.jqstooltip { position: absolute;left: 0px;top: 0px;visibility: hidden;background: rgb(0, 0, 0) transparent;background-color: rgba(0,0,0,0.6);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)";color: white;font: 10px arial, san serif;text-align: left;white-space: nowrap;padding: 5px;border: 1px solid white;z-index: 10000;}.jqsfield { color: white;font: 10px arial, san serif;text-align: left;}',g=function(){var a,b;return a=function(){this.init.apply(this,arguments)},arguments.length>1?(arguments[0]?(a.prototype=d.extend(new arguments[0],arguments[arguments.length-1]),a._super=arguments[0].prototype):a.prototype=arguments[arguments.length-1],arguments.length>2&&(b=Array.prototype.slice.call(arguments,1,-1),b.unshift(a.prototype),d.extend.apply(d,b))):a.prototype=arguments[0],a.prototype.cls=a,a},d.SPFormatClass=h=g({fre:/\{\{([\w.]+?)(:(.+?))?\}\}/g,precre:/(\w+)\.(\d+)/,init:function(a,b){this.format=a,this.fclass=b},render:function(a,b,d){var e=this,f=a,g,h,i,j,k;return this.format.replace(this.fre,function(){var a;return h=arguments[1],i=arguments[3],g=e.precre.exec(h),g?(k=g[2],h=g[1]):k=!1,j=f[h],j===c?"":i&&b&&b[i]?(a=b[i],a.get?b[i].get(j)||j:b[i][j]||j):(n(j)&&(d.get("numberFormatter")?j=d.get("numberFormatter")(j):j=s(j,k,d.get("numberDigitGroupCount"),d.get("numberDigitGroupSep"),d.get("numberDecimalMark"))),j)})}}),d.spformat=function(a,b){return new h(a,b)},i=function(a,b,c){return a<b?b:a>c?c:a},j=function(a,c){var d;return c===2?(d=b.floor(a.length/2),a.length%2?a[d]:(a[d-1]+a[d])/2):a.length%2?(d=(a.length*c+c)/4,d%1?(a[b.floor(d)]+a[b.floor(d)-1])/2:a[d-1]):(d=(a.length*c+2)/4,d%1?(a[b.floor(d)]+a[b.floor(d)-1])/2:a[d-1])},k=function(a){var b;switch(a){case"undefined":a=c;break;case"null":a=null;break;case"true":a=!0;break;case"false":a=!1;break;default:b=parseFloat(a),a==b&&(a=b)}return a},l=function(a){var b,c=[];for(b=a.length;b--;)c[b]=k(a[b]);return c},m=function(a,b){var c,d,e=[];for(c=0,d=a.length;c<d;c++)a[c]!==b&&e.push(a[c]);return e},n=function(a){return!isNaN(parseFloat(a))&&isFinite(a)},s=function(a,b,c,e,f){var g,h;a=(b===!1?parseFloat(a).toString():a.toFixed(b)).split(""),g=(g=d.inArray(".",a))<0?a.length:g,g<a.length&&(a[g]=f);for(h=g-c;h>0;h-=c)a.splice(h,0,e);return a.join("")},o=function(a,b,c){var d;for(d=b.length;d--;){if(c&&b[d]===null)continue;if(b[d]!==a)return!1}return!0},p=function(a){var b=0,c;for(c=a.length;c--;)b+=typeof a[c]=="number"?a[c]:0;return b},r=function(a){return d.isArray(a)?a:[a]},q=function(b){var c;a.createStyleSheet?a.createStyleSheet().cssText=b:(c=a.createElement("style"),c.type="text/css",a.getElementsByTagName("head")[0].appendChild(c),c[typeof a.body.style.WebkitAppearance=="string"?"innerText":"innerHTML"]=b)},d.fn.simpledraw=function(b,e,f,g){var h,i;if(f&&(h=this.data("_jqs_vcanvas")))return h;if(d.fn.sparkline.canvas===!1)return!1;if(d.fn.sparkline.canvas===c){var j=a.createElement("canvas");if(!j.getContext||!j.getContext("2d")){if(!a.namespaces||!!a.namespaces.v)return d.fn.sparkline.canvas=!1,!1;a.namespaces.add("v","urn:schemas-microsoft-com:vml","#default#VML"),d.fn.sparkline.canvas=function(a,b,c,d){return new J(a,b,c)}}else d.fn.sparkline.canvas=function(a,b,c,d){return new I(a,b,c,d)}}return b===c&&(b=d(this).innerWidth()),e===c&&(e=d(this).innerHeight()),h=d.fn.sparkline.canvas(b,e,this,g),i=d(this).data("_jqs_mhandler"),i&&i.registerCanvas(h),h},d.fn.cleardraw=function(){var a=this.data("_jqs_vcanvas");a&&a.reset()},d.RangeMapClass=t=g({init:function(a){var b,c,d=[];for(b in a)a.hasOwnProperty(b)&&typeof b=="string"&&b.indexOf(":")>-1&&(c=b.split(":"),c[0]=c[0].length===0?-Infinity:parseFloat(c[0]),c[1]=c[1].length===0?Infinity:parseFloat(c[1]),c[2]=a[b],d.push(c));this.map=a,this.rangelist=d||!1},get:function(a){var b=this.rangelist,d,e,f;if((f=this.map[a])!==c)return f;if(b)for(d=b.length;d--;){e=b[d];if(e[0]<=a&&e[1]>=a)return e[2]}return c}}),d.range_map=function(a){return new t(a)},u=g({init:function(a,b){var c=d(a);this.$el=c,this.options=b,this.currentPageX=0,this.currentPageY=0,this.el=a,this.splist=[],this.tooltip=null,this.over=!1,this.displayTooltips=!b.get("disableTooltips"),this.highlightEnabled=!b.get("disableHighlight")},registerSparkline:function(a){this.splist.push(a),this.over&&this.updateDisplay()},registerCanvas:function(a){var b=d(a.canvas);this.canvas=a,this.$canvas=b,b.mouseenter(d.proxy(this.mouseenter,this)),b.mouseleave(d.proxy(this.mouseleave,this)),b.click(d.proxy(this.mouseclick,this))},reset:function(a){this.splist=[],this.tooltip&&a&&(this.tooltip.remove(),this.tooltip=c)},mouseclick:function(a){var b=d.Event("sparklineClick");b.originalEvent=a,b.sparklines=this.splist,this.$el.trigger(b)},mouseenter:function(b){d(a.body).unbind("mousemove.jqs"),d(a.body).bind("mousemove.jqs",d.proxy(this.mousemove,this)),this.over=!0,this.currentPageX=b.pageX,this.currentPageY=b.pageY,this.currentEl=b.target,!this.tooltip&&this.displayTooltips&&(this.tooltip=new v(this.options),this.tooltip.updatePosition(b.pageX,b.pageY)),this.updateDisplay()},mouseleave:function(){d(a.body).unbind("mousemove.jqs");var b=this.splist,c=b.length,e=!1,f,g;this.over=!1,this.currentEl=null,this.tooltip&&(this.tooltip.remove(),this.tooltip=null);for(g=0;g<c;g++)f=b[g],f.clearRegionHighlight()&&(e=!0);e&&this.canvas.render()},mousemove:function(a){this.currentPageX=a.pageX,this.currentPageY=a.pageY,this.currentEl=a.target,this.tooltip&&this.tooltip.updatePosition(a.pageX,a.pageY),this.updateDisplay()},updateDisplay:function(){var a=this.splist,b=a.length,c=!1,e=this.$canvas.offset(),f=this.currentPageX-e.left,g=this.currentPageY-e.top,h,i,j,k,l;if(!this.over)return;for(j=0;j<b;j++)i=a[j],k=i.setRegionHighlight(this.currentEl,f,g),k&&(c=!0);if(c){l=d.Event("sparklineRegionChange"),l.sparklines=this.splist,this.$el.trigger(l);if(this.tooltip){h="";for(j=0;j<b;j++)i=a[j],h+=i.getCurrentRegionTooltip();this.tooltip.setContent(h)}this.disableHighlight||this.canvas.render()}k===null&&this.mouseleave()}}),v=g({sizeStyle:"position: static !important;display: block !important;visibility: hidden !important;float: left !important;",init:function(b){var c=b.get("tooltipClassname","jqstooltip"),e=this.sizeStyle,f;this.container=b.get("tooltipContainer")||a.body,this.tooltipOffsetX=b.get("tooltipOffsetX",10),this.tooltipOffsetY=b.get("tooltipOffsetY",12),d("#jqssizetip").remove(),d("#jqstooltip").remove(),this.sizetip=d("<div/>",{id:"jqssizetip",style:e,"class":c}),this.tooltip=d("<div/>",{id:"jqstooltip","class":c}).appendTo(this.container),f=this.tooltip.offset(),this.offsetLeft=f.left,this.offsetTop=f.top,this.hidden=!0,d(window).unbind("resize.jqs scroll.jqs"),d(window).bind("resize.jqs scroll.jqs",d.proxy(this.updateWindowDims,this)),this.updateWindowDims()},updateWindowDims:function(){this.scrollTop=d(window).scrollTop(),this.scrollLeft=d(window).scrollLeft(),this.scrollRight=this.scrollLeft+d(window).width(),this.updatePosition()},getSize:function(a){this.sizetip.html(a).appendTo(this.container),this.width=this.sizetip.width()+1,this.height=this.sizetip.height(),this.sizetip.remove()},setContent:function(a){if(!a){this.tooltip.css("visibility","hidden"),this.hidden=!0;return}this.getSize(a),this.tooltip.html(a).css({width:this.width,height:this.height,visibility:"visible"}),this.hidden&&(this.hidden=!1,this.updatePosition())},updatePosition:function(a,b){if(a===c){if(this.mousex===c)return;a=this.mousex-this.offsetLeft,b=this.mousey-this.offsetTop}else this.mousex=a-=this.offsetLeft,this.mousey=b-=this.offsetTop;if(!this.height||!this.width||this.hidden)return;b-=this.height+this.tooltipOffsetY,a+=this.tooltipOffsetX,b<this.scrollTop&&(b=this.scrollTop),a<this.scrollLeft?a=this.scrollLeft:a+this.width>this.scrollRight&&(a=this.scrollRight-this.width),this.tooltip.css({left:a,top:b})},remove:function(){this.tooltip.remove(),this.sizetip.remove(),this.sizetip=this.tooltip=c,d(window).unbind("resize.jqs scroll.jqs")}}),F=function(){q(E)},d(F),K=[],d.fn.sparkline=function(b,e){return this.each(function(){var f=new d.fn.sparkline.options(this,e),g=d(this),h,i;h=function(){var e,h,i,j,k,l,m;if(b==="html"||b===c){m=this.getAttribute(f.get("tagValuesAttribute"));if(m===c||m===null)m=g.html();e=m.replace(/(^\s*<!--)|(-->\s*$)|\s+/g,"").split(",")}else e=b;h=f.get("width")==="auto"?e.length*f.get("defaultPixelsPerValue"):f.get("width");if(f.get("height")==="auto"){if(!f.get("composite")||!d.data(this,"_jqs_vcanvas"))j=a.createElement("span"),j.innerHTML="a",g.html(j),i=d(j).innerHeight()||d(j).height(),d(j).remove(),j=null}else i=f.get("height");f.get("disableInteraction")?k=!1:(k=d.data(this,"_jqs_mhandler"),k?f.get("composite")||k.reset():(k=new u(this,f),d.data(this,"_jqs_mhandler",k)));if(f.get("composite")&&!d.data(this,"_jqs_vcanvas")){d.data(this,"_jqs_errnotify")||(alert("Attempted to attach a composite sparkline to an element with no existing sparkline"),d.data(this,"_jqs_errnotify",!0));return}l=new(d.fn.sparkline[f.get("type")])(this,e,f,h,i),l.render(),k&&k.registerSparkline(l)};if(d(this).html()&&!f.get("disableHiddenCheck")&&d(this).is(":hidden")||!d(this).parents("body").length){if(!f.get("composite")&&d.data(this,"_jqs_pending"))for(i=K.length;i;i--)K[i-1][0]==this&&K.splice(i-1,1);K.push([this,h]),d.data(this,"_jqs_pending",!0)}else h.call(this)})},d.fn.sparkline.defaults=f(),d.sparkline_display_visible=function(){var a,b,c,e=[];for(b=0,c=K.length;b<c;b++)a=K[b][0],d(a).is(":visible")&&!d(a).parents().is(":hidden")?(K[b][1].call(a),d.data(K[b][0],"_jqs_pending",!1),e.push(b)):!d(a).closest("html").length&&!d.data(a,"_jqs_pending")&&(d.data(K[b][0],"_jqs_pending",!1),e.push(b));for(b=e.length;b;b--)K.splice(e[b-1],1)},d.fn.sparkline.options=g({init:function(a,b){var c,f,g,h;this.userOptions=b=b||{},this.tag=a,this.tagValCache={},f=d.fn.sparkline.defaults,g=f.common,this.tagOptionsPrefix=b.enableTagOptions&&(b.tagOptionsPrefix||g.tagOptionsPrefix),h=this.getTagSetting("type"),h===e?c=f[b.type||g.type]:c=f[h],this.mergedOptions=d.extend({},g,c,b)},getTagSetting:function(a){var b=this.tagOptionsPrefix,d,f,g,h;if(b===!1||b===c)return e;if(this.tagValCache.hasOwnProperty(a))d=this.tagValCache.key;else{d=this.tag.getAttribute(b+a);if(d===c||d===null)d=e;else if(d.substr(0,1)==="["){d=d.substr(1,d.length-2).split(",");for(f=d.length;f--;)d[f]=k(d[f].replace(/(^\s*)|(\s*$)/g,""))}else if(d.substr(0,1)==="{"){g=d.substr(1,d.length-2).split(","),d={};for(f=g.length;f--;)h=g[f].split(":",2),d[h[0].replace(/(^\s*)|(\s*$)/g,"")]=k(h[1].replace(/(^\s*)|(\s*$)/g,""))}else d=k(d);this.tagValCache.key=d}return d},get:function(a,b){var d=this.getTagSetting(a),f;return d!==e?d:(f=this.mergedOptions[a])===c?b:f}}),d.fn.sparkline._base=g({disabled:!1,init:function(a,b,e,f,g){this.el=a,this.$el=d(a),this.values=b,this.options=e,this.width=f,this.height=g,this.currentRegion=c},initTarget:function(){var a=!this.options.get("disableInteraction");(this.target=this.$el.simpledraw(this.width,this.height,this.options.get("composite"),a))?(this.canvasWidth=this.target.pixelWidth,this.canvasHeight=this.target.pixelHeight):this.disabled=!0},render:function(){return this.disabled?(this.el.innerHTML="",!1):!0},getRegion:function(a,b){},setRegionHighlight:function(a,b,d){var e=this.currentRegion,f=!this.options.get("disableHighlight"),g;return b>this.canvasWidth||d>this.canvasHeight||b<0||d<0?null:(g=this.getRegion(a,b,d),e!==g?(e!==c&&f&&this.removeHighlight(),this.currentRegion=g,g!==c&&f&&this.renderHighlight(),!0):!1)},clearRegionHighlight:function(){return this.currentRegion!==c?(this.removeHighlight(),this.currentRegion=c,!0):!1},renderHighlight:function(){this.changeHighlight(!0)},removeHighlight:function(){this.changeHighlight(!1)},changeHighlight:function(a){},getCurrentRegionTooltip:function(){var a=this.options,b="",e=[],f,g,i,j,k,l,m,n,o,p,q,r,s,t;if(this.currentRegion===c)return"";f=this.getCurrentRegionFields(),q=a.get("tooltipFormatter");if(q)return q(this,a,f);a.get("tooltipChartTitle")&&(b+='<div class="jqs jqstitle">'+a.get("tooltipChartTitle")+"</div>\n"),g=this.options.get("tooltipFormat");if(!g)return"";d.isArray(g)||(g=[g]),d.isArray(f)||(f=[f]),m=this.options.get("tooltipFormatFieldlist"),n=this.options.get("tooltipFormatFieldlistKey");if(m&&n){o=[];for(l=f.length;l--;)p=f[l][n],(t=d.inArray(p,m))!=-1&&(o[t]=f[l]);f=o}i=g.length,s=f.length;for(l=0;l<i;l++){r=g[l],typeof r=="string"&&(r=new h(r)),j=r.fclass||"jqsfield";for(t=0;t<s;t++)if(!f[t].isNull||!a.get("tooltipSkipNull"))d.extend(f[t],{prefix:a.get("tooltipPrefix"),suffix:a.get("tooltipSuffix")}),k=r.render(f[t],a.get("tooltipValueLookups"),a),e.push('<div class="'+j+'">'+k+"</div>")}return e.length?b+e.join("\n"):""},getCurrentRegionFields:function(){},calcHighlightColor:function(a,c){var d=c.get("highlightColor"),e=c.get("highlightLighten"),f,g,h,j;if(d)return d;if(e){f=/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(a)||/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(a);if(f){h=[],g=a.length===4?16:1;for(j=0;j<3;j++)h[j]=i(b.round(parseInt(f[j+1],16)*g*e),0,255);return"rgb("+h.join(",")+")"}}return a}}),w={changeHighlight:function(a){var b=this.currentRegion,c=this.target,e=this.regionShapes[b],f;e&&(f=this.renderRegion(b,a),d.isArray(f)||d.isArray(e)?(c.replaceWithShapes(e,f),this.regionShapes[b]=d.map(f,function(a){return a.id})):(c.replaceWithShape(e,f),this.regionShapes[b]=f.id))},render:function(){var a=this.values,b=this.target,c=this.regionShapes,e,f,g,h;if(!this.cls._super.render.call(this))return;for(g=a.length;g--;){e=this.renderRegion(g);if(e)if(d.isArray(e)){f=[];for(h=e.length;h--;)e[h].append(),f.push(e[h].id);c[g]=f}else e.append(),c[g]=e.id;else c[g]=null}b.render()}},d.fn.sparkline.line=x=g(d.fn.sparkline._base,{type:"line",init:function(a,b,c,d,e){x._super.init.call(this,a,b,c,d,e),this.vertices=[],this.regionMap=[],this.xvalues=[],this.yvalues=[],this.yminmax=[],this.hightlightSpotId=null,this.lastShapeId=null,this.initTarget()},getRegion:function(a,b,d){var e,f=this.regionMap;for(e=f.length;e--;)if(f[e]!==null&&b>=f[e][0]&&b<=f[e][1])return f[e][2];return c},getCurrentRegionFields:function(){var a=this.currentRegion;return{isNull:this.yvalues[a]===null,x:this.xvalues[a],y:this.yvalues[a],color:this.options.get("lineColor"),fillColor:this.options.get("fillColor"),offset:a}},renderHighlight:function(){var a=this.currentRegion,b=this.target,d=this.vertices[a],e=this.options,f=e.get("spotRadius"),g=e.get("highlightSpotColor"),h=e.get("highlightLineColor"),i,j;if(!d)return;f&&g&&(i=b.drawCircle(d[0],d[1],f,c,g),this.highlightSpotId=i.id,b.insertAfterShape(this.lastShapeId,i)),h&&(j=b.drawLine(d[0],this.canvasTop,d[0],this.canvasTop+this.canvasHeight,h),this.highlightLineId=j.id,b.insertAfterShape(this.lastShapeId,j))},removeHighlight:function(){var a=this.target;this.highlightSpotId&&(a.removeShapeId(this.highlightSpotId),this.highlightSpotId=null),this.highlightLineId&&(a.removeShapeId(this.highlightLineId),this.highlightLineId=null)},scanValues:function(){var a=this.values,c=a.length,d=this.xvalues,e=this.yvalues,f=this.yminmax,g,h,i,j,k;for(g=0;g<c;g++)h=a[g],i=typeof a[g]=="string",j=typeof a[g]=="object"&&a[g]instanceof Array,k=i&&a[g].split(":"),i&&k.length===2?(d.push(Number(k[0])),e.push(Number(k[1])),f.push(Number(k[1]))):j?(d.push(h[0]),e.push(h[1]),f.push(h[1])):(d.push(g),a[g]===null||a[g]==="null"?e.push(null):(e.push(Number(h)),f.push(Number(h))));this.options.get("xvalues")&&(d=this.options.get("xvalues")),this.maxy=this.maxyorg=b.max.apply(b,f),this.miny=this.minyorg=b.min.apply(b,f),this.maxx=b.max.apply(b,d),this.minx=b.min.apply(b,d),this.xvalues=d,this.yvalues=e,this.yminmax=f},processRangeOptions:function(){var a=this.options,b=a.get("normalRangeMin"),d=a.get("normalRangeMax");b!==c&&(b<this.miny&&(this.miny=b),d>this.maxy&&(this.maxy=d)),a.get("chartRangeMin")!==c&&(a.get("chartRangeClip")||a.get("chartRangeMin")<this.miny)&&(this.miny=a.get("chartRangeMin")),a.get("chartRangeMax")!==c&&(a.get("chartRangeClip")||a.get("chartRangeMax")>this.maxy)&&(this.maxy=a.get("chartRangeMax")),a.get("chartRangeMinX")!==c&&(a.get("chartRangeClipX")||a.get("chartRangeMinX")<this.minx)&&(this.minx=a.get("chartRangeMinX")),a.get("chartRangeMaxX")!==c&&(a.get("chartRangeClipX")||a.get("chartRangeMaxX")>this.maxx)&&(this.maxx=a.get("chartRangeMaxX"))},drawNormalRange:function(a,d,e,f,g){var h=this.options.get("normalRangeMin"),i=this.options.get("normalRangeMax"),j=d+b.round(e-e*((i-this.miny)/g)),k=b.round(e*(i-h)/g);this.target.drawRect(a,j,f,k,c,this.options.get("normalRangeColor")).append()},render:function(){var a=this.options,e=this.target,f=this.canvasWidth,g=this.canvasHeight,h=this.vertices,i=a.get("spotRadius"),j=this.regionMap,k,l,m,n,o,p,q,r,s,u,v,w,y,z,A,B,C,D,E,F,G,H,I,J,K;if(!x._super.render.call(this))return;this.scanValues(),this.processRangeOptions(),I=this.xvalues,J=this.yvalues;if(!this.yminmax.length||this.yvalues.length<2)return;n=o=0,k=this.maxx-this.minx===0?1:this.maxx-this.minx,l=this.maxy-this.miny===0?1:this.maxy-this.miny,m=this.yvalues.length-1,i&&(f<i*4||g<i*4)&&(i=0);if(i){G=a.get("highlightSpotColor")&&!a.get("disableInteraction");if(G||a.get("minSpotColor")||a.get("spotColor")&&J[m]===this.miny)g-=b.ceil(i);if(G||a.get("maxSpotColor")||a.get("spotColor")&&J[m]===this.maxy)g-=b.ceil(i),n+=b.ceil(i);if(G||(a.get("minSpotColor")||a.get("maxSpotColor"))&&(J[0]===this.miny||J[0]===this.maxy))o+=b.ceil(i),f-=b.ceil(i);if(G||a.get("spotColor")||a.get("minSpotColor")||a.get("maxSpotColor")&&(J[m]===this.miny||J[m]===this.maxy))f-=b.ceil(i)}g--,a.get("normalRangeMin")!==c&&!a.get("drawNormalOnTop")&&this.drawNormalRange(o,n,g,f,l),q=[],r=[q],z=A=null,B=J.length;for(K=0;K<B;K++)s=I[K],v=I[K+1],u=J[K],w=o+b.round((s-this.minx)*(f/k)),y=K<B-1?o+b.round((v-this.minx)*(f/k)):f,A=w+(y-w)/2,j[K]=[z||0,A,K],z=A,u===null?K&&(J[K-1]!==null&&(q=[],r.push(q)),h.push(null)):(u<this.miny&&(u=this.miny),u>this.maxy&&(u=this.maxy),q.length||q.push([w,n+g]),p=[w,n+b.round(g-g*((u-this.miny)/l))],q.push(p),h.push(p));C=[],D=[],E=r.length;for(K=0;K<E;K++)q=r[K],q.length&&(a.get("fillColor")&&(q.push([q[q.length-1][0],n+g]),D.push(q.slice(0)),q.pop()),q.length>2&&(q[0]=[q[0][0],q[1][1]]),C.push(q));E=D.length;for(K=0;K<E;K++)e.drawShape(D[K],a.get("fillColor"),a.get("fillColor")).append();a.get("normalRangeMin")!==c&&a.get("drawNormalOnTop")&&this.drawNormalRange(o,n,g,f,l),E=C.length;for(K=0;K<E;K++)e.drawShape(C[K],a.get("lineColor"),c,a.get("lineWidth")).append();if(i&&a.get("valueSpots")){F=a.get("valueSpots"),F.get===c&&(F=new t(F));for(K=0;K<B;K++)H=F.get(J[K]),H&&e.drawCircle(o+b.round((I[K]-this.minx)*(f/k)),n+b.round(g-g*((J[K]-this.miny)/l)),i,c,H).append()}i&&a.get("spotColor")&&J[m]!==null&&e.drawCircle(o+b.round((I[I.length-1]-this.minx)*(f/k)),n+b.round(g-g*((J[m]-this.miny)/l)),i,c,a.get("spotColor")).append(),this.maxy!==this.minyorg&&(i&&a.get("minSpotColor")&&(s=I[d.inArray(this.minyorg,J)],e.drawCircle(o+b.round((s-this.minx)*(f/k)),n+b.round(g-g*((this.minyorg-this.miny)/l)),i,c,a.get("minSpotColor")).append()),i&&a.get("maxSpotColor")&&(s=I[d.inArray(this.maxyorg,J)],e.drawCircle(o+b.round((s-this.minx)*(f/k)),n+b.round(g-g*((this.maxyorg-this.miny)/l)),i,c,a.get("maxSpotColor")).append())),this.lastShapeId=e.getLastShapeId(),this.canvasTop=n,e.render()}}),d.fn.sparkline.bar=y=g(d.fn.sparkline._base,w,{type:"bar",init:function(a,e,f,g,h){var j=parseInt(f.get("barWidth"),10),n=parseInt(f.get("barSpacing"),10),o=f.get("chartRangeMin"),p=f.get("chartRangeMax"),q=f.get("chartRangeClip"),r=Infinity,s=-Infinity,u,v,w,x,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R;y._super.init.call(this,a,e,f,g,h);for(A=0,B=e.length;A<B;A++){O=e[A],u=typeof O=="string"&&O.indexOf(":")>-1;if(u||d.isArray(O))J=!0,u&&(O=e[A]=l(O.split(":"))),O=m(O,null),v=b.min.apply(b,O),w=b.max.apply(b,O),v<r&&(r=v),w>s&&(s=w)}this.stacked=J,this.regionShapes={},this.barWidth=j,this.barSpacing=n,this.totalBarWidth=j+n,this.width=g=e.length*j+(e.length-1)*n,this.initTarget(),q&&(H=o===c?-Infinity:o,I=p===c?Infinity:p),z=[],x=J?[]:z;var S=[],T=[];for(A=0,B=e.length;A<B;A++)if(J){K=e[A],e[A]=N=[],S[A]=0,x[A]=T[A]=0;for(L=0,M=K.length;L<M;L++)O=N[L]=q?i(K[L],H,I):K[L],O!==null&&(O>0&&(S[A]+=O),r<0&&s>0?O<0?T[A]+=b.abs(O):x[A]+=O:x[A]+=b.abs(O-(O<0?s:r)),z.push(O))}else O=q?i(e[A],H,I):e[A],O=e[A]=k(O),O!==null&&z.push(O);this.max=G=b.max.apply(b,z),this.min=F=b.min.apply(b,z),this.stackMax=s=J?b.max.apply(b,S):G,this.stackMin=r=J?b.min.apply(b,z):F,f.get("chartRangeMin")!==c&&(f.get("chartRangeClip")||f.get("chartRangeMin")<F)&&(F=f.get("chartRangeMin")),f.get("chartRangeMax")!==c&&(f.get("chartRangeClip")||f.get("chartRangeMax")>G)&&(G=f.get("chartRangeMax")),this.zeroAxis=D=f.get("zeroAxis",!0),F<=0&&G>=0&&D?E=0:D==0?E=F:F>0?E=F:E=G,this.xaxisOffset=E,C=J?b.max.apply(b,x)+b.max.apply(b,T):G-F,this.canvasHeightEf=D&&F<0?this.canvasHeight-2:this.canvasHeight-1,F<E?(Q=J&&G>=0?s:G,P=(Q-E)/C*this.canvasHeight,P!==b.ceil(P)&&(this.canvasHeightEf-=2,P=b.ceil(P))):P=this.canvasHeight,this.yoffset=P,d.isArray(f.get("colorMap"))?(this.colorMapByIndex=f.get("colorMap"),this.colorMapByValue=null):(this.colorMapByIndex=null,this.colorMapByValue=f.get("colorMap"),this.colorMapByValue&&this.colorMapByValue.get===c&&(this.colorMapByValue=new t(this.colorMapByValue))),this.range=C},getRegion:function(a,d,e){var f=b.floor(d/this.totalBarWidth);return f<0||f>=this.values.length?c:f},getCurrentRegionFields:function(){var a=this.currentRegion,b=r(this.values[a]),c=[],d,e;for(e=b.length;e--;)d=b[e],c.push({isNull:d===null,value:d,color:this.calcColor(e,d,a),offset:a});return c},calcColor:function(a,b,e){var f=this.colorMapByIndex,g=this.colorMapByValue,h=this.options,i,j;return this.stacked?i=h.get("stackedBarColor"):i=b<0?h.get("negBarColor"):h.get("barColor"),b===0&&h.get("zeroColor")!==c&&(i=h.get("zeroColor")),g&&(j=g.get(b))?i=j:f&&f.length>e&&(i=f[e]),d.isArray(i)?i[a%i.length]:i},renderRegion:function(a,e){var f=this.values[a],g=this.options,h=this.xaxisOffset,i=[],j=this.range,k=this.stacked,l=this.target,m=a*this.totalBarWidth,n=this.canvasHeightEf,p=this.yoffset,q,r,s,t,u,v,w,x,y,z;f=d.isArray(f)?f:[f],w=f.length,x=f[0],t=o(null,f),z=o(h,f,!0);if(t)return g.get("nullColor")?(s=e?g.get("nullColor"):this.calcHighlightColor(g.get("nullColor"),g),q=p>0?p-1:p,l.drawRect(m,q,this.barWidth-1,0,s,s)):c;u=p;for(v=0;v<w;v++){x=f[v];if(k&&x===h){if(!z||y)continue;y=!0}j>0?r=b.floor(n*(b.abs(x-h)/j))+1:r=1,x<h||x===h&&p===0?(q=u,u+=r):(q=p-r,p-=r),s=this.calcColor(v,x,a),e&&(s=this.calcHighlightColor(s,g)),i.push(l.drawRect(m,q,this.barWidth-1,r-1,s,s))}return i.length===1?i[0]:i}}),d.fn.sparkline.tristate=z=g(d.fn.sparkline._base,w,{type:"tristate",init:function(a,b,e,f,g){var h=parseInt(e.get("barWidth"),10),i=parseInt(e.get("barSpacing"),10);z._super.init.call(this,a,b,e,f,g),this.regionShapes={},this.barWidth=h,this.barSpacing=i,this.totalBarWidth=h+i,this.values=d.map(b,Number),this.width=f=b.length*h+(b.length-1)*i,d.isArray(e.get("colorMap"))?(this.colorMapByIndex=e.get("colorMap"),this.colorMapByValue=null):(this.colorMapByIndex=null,this.colorMapByValue=e.get("colorMap"),this.colorMapByValue&&this.colorMapByValue.get===c&&(this.colorMapByValue=new t(this.colorMapByValue))),this.initTarget()},getRegion:function(a,c,d){return b.floor(c/this.totalBarWidth)},getCurrentRegionFields:function(){var a=this.currentRegion;return{isNull:this.values[a]===c,value:this.values[a],color:this.calcColor(this.values[a],a),offset:a}},calcColor:function(a,b){var c=this.values,d=this.options,e=this.colorMapByIndex,f=this.colorMapByValue,g,h;return f&&(h=f.get(a))?g=h:e&&e.length>b?g=e[b]:c[b]<0?g=d.get("negBarColor"):c[b]>0?g=d.get("posBarColor"):g=d.get("zeroBarColor"),g},renderRegion:function(a,c){var d=this.values,e=this.options,f=this.target,g,h,i,j,k,l;g=f.pixelHeight,i=b.round(g/2),j=a*this.totalBarWidth,d[a]<0?(k=i,h=i-1):d[a]>0?(k=0,h=i-1):(k=i-1,h=2),l=this.calcColor(d[a],a);if(l===null)return;return c&&(l=this.calcHighlightColor(l,e)),f.drawRect(j,k,this.barWidth-1,h-1,l,l)}}),d.fn.sparkline.discrete=A=g(d.fn.sparkline._base,w,{type:"discrete",init:function(a,e,f,g,h){A._super.init.call(this,a,e,f,g,h),this.regionShapes={},this.values=e=d.map(e,Number),this.min=b.min.apply(b,e),this.max=b.max.apply(b,e),this.range=this.max-this.min,this.width=g=f.get("width")==="auto"?e.length*2:this.width,this.interval=b.floor(g/e.length),this.itemWidth=g/e.length,f.get("chartRangeMin")!==c&&(f.get("chartRangeClip")||f.get("chartRangeMin")<this.min)&&(this.min=f.get("chartRangeMin")),f.get("chartRangeMax")!==c&&(f.get("chartRangeClip")||f.get("chartRangeMax")>this.max)&&(this.max=f.get("chartRangeMax")),this.initTarget(),this.target&&(this.lineHeight=f.get("lineHeight")==="auto"?b.round(this.canvasHeight*.3):f.get("lineHeight"))},getRegion:function(a,c,d){return b.floor(c/this.itemWidth)},getCurrentRegionFields:function(){var a=this.currentRegion;return{isNull:this.values[a]===c,value:this.values[a],offset:a}},renderRegion:function(a,c){var d=this.values,e=this.options,f=this.min,g=this.max,h=this.range,j=this.interval,k=this.target,l=this.canvasHeight,m=this.lineHeight,n=l-m,o,p,q,r;return p=i(d[a],f,g),r=a*j,o=b.round(n-n*((p-f)/h)),q=e.get("thresholdColor")&&p<e.get("thresholdValue")?e.get("thresholdColor"):e.get("lineColor"),c&&(q=this.calcHighlightColor(q,e)),k.drawLine(r,o,r,o+m,q)}}),d.fn.sparkline.bullet=B=g(d.fn.sparkline._base,{type:"bullet",init:function(a,d,e,f,g){var h,i,j;B._super.init.call(this,a,d,e,f,g),this.values=d=l(d),j=d.slice(),j[0]=j[0]===null?j[2]:j[0],j[1]=d[1]===null?j[2]:j[1],h=b.min.apply(b,d),i=b.max.apply(b,d),e.get("base")===c?h=h<0?h:0:h=e.get("base"),this.min=h,this.max=i,this.range=i-h,this.shapes={},this.valueShapes={},this.regiondata={},this.width=f=e.get("width")==="auto"?"4.0em":f,this.target=this.$el.simpledraw(f,g,e.get("composite")),d.length||(this.disabled=!0),this.initTarget()},getRegion:function(a,b,d){var e=this.target.getShapeAt(a,b,d);return e!==c&&this.shapes[e]!==c?this.shapes[e]:c},getCurrentRegionFields:function(){var a=this.currentRegion;return{fieldkey:a.substr(0,1),value:this.values[a.substr(1)],region:a}},changeHighlight:function(a){var b=this.currentRegion,c=this.valueShapes[b],d;delete this.shapes[c];switch(b.substr(0,1)){case"r":d=this.renderRange(b.substr(1),a);break;case"p":d=this.renderPerformance(a);break;case"t":d=this.renderTarget(a)}this.valueShapes[b]=d.id,this.shapes[d.id]=b,this.target.replaceWithShape(c,d)},renderRange:function(a,c){var d=this.values[a],e=b.round(this.canvasWidth*((d-this.min)/this.range)),f=this.options.get("rangeColors")[a-2];return c&&(f=this.calcHighlightColor(f,this.options)),this.target.drawRect(0,0,e-1,this.canvasHeight-1,f,f)},renderPerformance:function(a){var c=this.values[1],d=b.round(this.canvasWidth*((c-this.min)/this.range)),e=this.options.get("performanceColor");return a&&(e=this.calcHighlightColor(e,this.options)),this.target.drawRect(0,b.round(this.canvasHeight*.3),d-1,b.round(this.canvasHeight*.4)-1,e,e)},renderTarget:function(a){var c=this.values[0],d=b.round(this.canvasWidth*((c-this.min)/this.range)-this.options.get("targetWidth")/2),e=b.round(this.canvasHeight*.1),f=this.canvasHeight-e*2,g=this.options.get("targetColor");return a&&(g=this.calcHighlightColor(g,this.options)),this.target.drawRect(d,e,this.options.get("targetWidth")-1,f-1,g,g)},render:function(){var a=this.values.length,b=this.target,c,d;if(!B._super.render.call(this))return;for(c=2;c<a;c++)d=this.renderRange(c).append(),this.shapes[d.id]="r"+c,this.valueShapes["r"+c]=d.id;this.values[1]!==null&&(d=this.renderPerformance().append(),this.shapes[d.id]="p1",this.valueShapes.p1=d.id),this.values[0]!==null&&(d=this.renderTarget().append(),this.shapes[d.id]="t0",this.valueShapes.t0=d.id),b.render()}}),d.fn.sparkline.pie=C=g(d.fn.sparkline._base,{type:"pie",init:function(a,c,e,f,g){var h=0,i;C._super.init.call(this,a,c,e,f,g),this.shapes={},this.valueShapes={},this.values=c=d.map(c,Number),e.get("width")==="auto"&&(this.width=this.height);if(c.length>0)for(i=c.length;i--;)h+=c[i];this.total=h,this.initTarget(),this.radius=b.floor(b.min(this.canvasWidth,this.canvasHeight)/2)},getRegion:function(a,b,d){var e=this.target.getShapeAt(a,b,d);return e!==c&&this.shapes[e]!==c?this.shapes[e]:c},getCurrentRegionFields:function(){var a=this.currentRegion;return{isNull:this.values[a]===c,value:this.values[a],percent:this.values[a]/this.total*100,color:this.options.get("sliceColors")[a%this.options.get("sliceColors").length],offset:a}},changeHighlight:function(a){var b=this.currentRegion,c=this.renderSlice(b,a),d=this.valueShapes[b];delete this.shapes[d],this.target.replaceWithShape(d,c),this.valueShapes[b]=c.id,this.shapes[c.id]=b},renderSlice:function(a,d){var e=this.target,f=this.options,g=this.radius,h=f.get("borderWidth"),i=f.get("offset"),j=2*b.PI,k=this.values,l=this.total,m=i?2*b.PI*(i/360):0,n,o,p,q,r;q=k.length;for(p=0;p<q;p++){n=m,o=m,l>0&&(o=m+j*(k[p]/l));if(a===p)return r=f.get("sliceColors")[p%f.get("sliceColors").length],d&&(r=this.calcHighlightColor(r,f)),e.drawPieSlice(g,g,g-h,n,o,c,r);m=o}},render:function(){var a=this.target,d=this.values,e=this.options,f=this.radius,g=e.get("borderWidth"),h,i;if(!C._super.render.call(this))return;g&&a.drawCircle(f,f,b.floor(f-g/2),e.get("borderColor"),c,g).append();for(i=d.length;i--;)d[i]&&(h=this.renderSlice(i).append(),this.valueShapes[i]=h.id,this.shapes[h.id]=i);a.render()}}),d.fn.sparkline.box=D=g(d.fn.sparkline._base,{type:"box",init:function(a,b,c,e,f){D._super.init.call(this,a,b,c,e,f),this.values=d.map(b,Number),this.width=c.get("width")==="auto"?"4.0em":e,this.initTarget(),this.values.length||(this.disabled=1)},getRegion:function(){return 1},getCurrentRegionFields:function(){var a=[{field:"lq",value:this.quartiles[0]},{field:"med",value:this.quartiles +[1]},{field:"uq",value:this.quartiles[2]}];return this.loutlier!==c&&a.push({field:"lo",value:this.loutlier}),this.routlier!==c&&a.push({field:"ro",value:this.routlier}),this.lwhisker!==c&&a.push({field:"lw",value:this.lwhisker}),this.rwhisker!==c&&a.push({field:"rw",value:this.rwhisker}),a},render:function(){var a=this.target,d=this.values,e=d.length,f=this.options,g=this.canvasWidth,h=this.canvasHeight,i=f.get("chartRangeMin")===c?b.min.apply(b,d):f.get("chartRangeMin"),k=f.get("chartRangeMax")===c?b.max.apply(b,d):f.get("chartRangeMax"),l=0,m,n,o,p,q,r,s,t,u,v,w;if(!D._super.render.call(this))return;if(f.get("raw"))f.get("showOutliers")&&d.length>5?(n=d[0],m=d[1],p=d[2],q=d[3],r=d[4],s=d[5],t=d[6]):(m=d[0],p=d[1],q=d[2],r=d[3],s=d[4]);else{d.sort(function(a,b){return a-b}),p=j(d,1),q=j(d,2),r=j(d,3),o=r-p;if(f.get("showOutliers")){m=s=c;for(u=0;u<e;u++)m===c&&d[u]>p-o*f.get("outlierIQR")&&(m=d[u]),d[u]<r+o*f.get("outlierIQR")&&(s=d[u]);n=d[0],t=d[e-1]}else m=d[0],s=d[e-1]}this.quartiles=[p,q,r],this.lwhisker=m,this.rwhisker=s,this.loutlier=n,this.routlier=t,w=g/(k-i+1),f.get("showOutliers")&&(l=b.ceil(f.get("spotRadius")),g-=2*b.ceil(f.get("spotRadius")),w=g/(k-i+1),n<m&&a.drawCircle((n-i)*w+l,h/2,f.get("spotRadius"),f.get("outlierLineColor"),f.get("outlierFillColor")).append(),t>s&&a.drawCircle((t-i)*w+l,h/2,f.get("spotRadius"),f.get("outlierLineColor"),f.get("outlierFillColor")).append()),a.drawRect(b.round((p-i)*w+l),b.round(h*.1),b.round((r-p)*w),b.round(h*.8),f.get("boxLineColor"),f.get("boxFillColor")).append(),a.drawLine(b.round((m-i)*w+l),b.round(h/2),b.round((p-i)*w+l),b.round(h/2),f.get("lineColor")).append(),a.drawLine(b.round((m-i)*w+l),b.round(h/4),b.round((m-i)*w+l),b.round(h-h/4),f.get("whiskerColor")).append(),a.drawLine(b.round((s-i)*w+l),b.round(h/2),b.round((r-i)*w+l),b.round(h/2),f.get("lineColor")).append(),a.drawLine(b.round((s-i)*w+l),b.round(h/4),b.round((s-i)*w+l),b.round(h-h/4),f.get("whiskerColor")).append(),a.drawLine(b.round((q-i)*w+l),b.round(h*.1),b.round((q-i)*w+l),b.round(h*.9),f.get("medianColor")).append(),f.get("target")&&(v=b.ceil(f.get("spotRadius")),a.drawLine(b.round((f.get("target")-i)*w+l),b.round(h/2-v),b.round((f.get("target")-i)*w+l),b.round(h/2+v),f.get("targetColor")).append(),a.drawLine(b.round((f.get("target")-i)*w+l-v),b.round(h/2),b.round((f.get("target")-i)*w+l+v),b.round(h/2),f.get("targetColor")).append()),a.render()}}),G=g({init:function(a,b,c,d){this.target=a,this.id=b,this.type=c,this.args=d},append:function(){return this.target.appendShape(this),this}}),H=g({_pxregex:/(\d+)(px)?\s*$/i,init:function(a,b,c){if(!a)return;this.width=a,this.height=b,this.target=c,this.lastShapeId=null,c[0]&&(c=c[0]),d.data(c,"_jqs_vcanvas",this)},drawLine:function(a,b,c,d,e,f){return this.drawShape([[a,b],[c,d]],e,f)},drawShape:function(a,b,c,d){return this._genShape("Shape",[a,b,c,d])},drawCircle:function(a,b,c,d,e,f){return this._genShape("Circle",[a,b,c,d,e,f])},drawPieSlice:function(a,b,c,d,e,f,g){return this._genShape("PieSlice",[a,b,c,d,e,f,g])},drawRect:function(a,b,c,d,e,f){return this._genShape("Rect",[a,b,c,d,e,f])},getElement:function(){return this.canvas},getLastShapeId:function(){return this.lastShapeId},reset:function(){alert("reset not implemented")},_insert:function(a,b){d(b).html(a)},_calculatePixelDims:function(a,b,c){var e;e=this._pxregex.exec(b),e?this.pixelHeight=e[1]:this.pixelHeight=d(c).height(),e=this._pxregex.exec(a),e?this.pixelWidth=e[1]:this.pixelWidth=d(c).width()},_genShape:function(a,b){var c=L++;return b.unshift(c),new G(this,c,a,b)},appendShape:function(a){alert("appendShape not implemented")},replaceWithShape:function(a,b){alert("replaceWithShape not implemented")},insertAfterShape:function(a,b){alert("insertAfterShape not implemented")},removeShapeId:function(a){alert("removeShapeId not implemented")},getShapeAt:function(a,b,c){alert("getShapeAt not implemented")},render:function(){alert("render not implemented")}}),I=g(H,{init:function(b,e,f,g){I._super.init.call(this,b,e,f),this.canvas=a.createElement("canvas"),f[0]&&(f=f[0]),d.data(f,"_jqs_vcanvas",this),d(this.canvas).css({display:"inline-block",width:b,height:e,verticalAlign:"top"}),this._insert(this.canvas,f),this._calculatePixelDims(b,e,this.canvas),this.canvas.width=this.pixelWidth,this.canvas.height=this.pixelHeight,this.interact=g,this.shapes={},this.shapeseq=[],this.currentTargetShapeId=c,d(this.canvas).css({width:this.pixelWidth,height:this.pixelHeight})},_getContext:function(a,b,d){var e=this.canvas.getContext("2d");return a!==c&&(e.strokeStyle=a),e.lineWidth=d===c?1:d,b!==c&&(e.fillStyle=b),e},reset:function(){var a=this._getContext();a.clearRect(0,0,this.pixelWidth,this.pixelHeight),this.shapes={},this.shapeseq=[],this.currentTargetShapeId=c},_drawShape:function(a,b,d,e,f){var g=this._getContext(d,e,f),h,i;g.beginPath(),g.moveTo(b[0][0]+.5,b[0][1]+.5);for(h=1,i=b.length;h<i;h++)g.lineTo(b[h][0]+.5,b[h][1]+.5);d!==c&&g.stroke(),e!==c&&g.fill(),this.targetX!==c&&this.targetY!==c&&g.isPointInPath(this.targetX,this.targetY)&&(this.currentTargetShapeId=a)},_drawCircle:function(a,d,e,f,g,h,i){var j=this._getContext(g,h,i);j.beginPath(),j.arc(d,e,f,0,2*b.PI,!1),this.targetX!==c&&this.targetY!==c&&j.isPointInPath(this.targetX,this.targetY)&&(this.currentTargetShapeId=a),g!==c&&j.stroke(),h!==c&&j.fill()},_drawPieSlice:function(a,b,d,e,f,g,h,i){var j=this._getContext(h,i);j.beginPath(),j.moveTo(b,d),j.arc(b,d,e,f,g,!1),j.lineTo(b,d),j.closePath(),h!==c&&j.stroke(),i&&j.fill(),this.targetX!==c&&this.targetY!==c&&j.isPointInPath(this.targetX,this.targetY)&&(this.currentTargetShapeId=a)},_drawRect:function(a,b,c,d,e,f,g){return this._drawShape(a,[[b,c],[b+d,c],[b+d,c+e],[b,c+e],[b,c]],f,g)},appendShape:function(a){return this.shapes[a.id]=a,this.shapeseq.push(a.id),this.lastShapeId=a.id,a.id},replaceWithShape:function(a,b){var c=this.shapeseq,d;this.shapes[b.id]=b;for(d=c.length;d--;)c[d]==a&&(c[d]=b.id);delete this.shapes[a]},replaceWithShapes:function(a,b){var c=this.shapeseq,d={},e,f,g;for(f=a.length;f--;)d[a[f]]=!0;for(f=c.length;f--;)e=c[f],d[e]&&(c.splice(f,1),delete this.shapes[e],g=f);for(f=b.length;f--;)c.splice(g,0,b[f].id),this.shapes[b[f].id]=b[f]},insertAfterShape:function(a,b){var c=this.shapeseq,d;for(d=c.length;d--;)if(c[d]===a){c.splice(d+1,0,b.id),this.shapes[b.id]=b;return}},removeShapeId:function(a){var b=this.shapeseq,c;for(c=b.length;c--;)if(b[c]===a){b.splice(c,1);break}delete this.shapes[a]},getShapeAt:function(a,b,c){return this.targetX=b,this.targetY=c,this.render(),this.currentTargetShapeId},render:function(){var a=this.shapeseq,b=this.shapes,c=a.length,d=this._getContext(),e,f,g;d.clearRect(0,0,this.pixelWidth,this.pixelHeight);for(g=0;g<c;g++)e=a[g],f=b[e],this["_draw"+f.type].apply(this,f.args);this.interact||(this.shapes={},this.shapeseq=[])}}),J=g(H,{init:function(b,c,e){var f;J._super.init.call(this,b,c,e),e[0]&&(e=e[0]),d.data(e,"_jqs_vcanvas",this),this.canvas=a.createElement("span"),d(this.canvas).css({display:"inline-block",position:"relative",overflow:"hidden",width:b,height:c,margin:"0px",padding:"0px",verticalAlign:"top"}),this._insert(this.canvas,e),this._calculatePixelDims(b,c,this.canvas),this.canvas.width=this.pixelWidth,this.canvas.height=this.pixelHeight,f='<v:group coordorigin="0 0" coordsize="'+this.pixelWidth+" "+this.pixelHeight+'"'+' style="position:absolute;top:0;left:0;width:'+this.pixelWidth+"px;height="+this.pixelHeight+'px;"></v:group>',this.canvas.insertAdjacentHTML("beforeEnd",f),this.group=d(this.canvas).children()[0],this.rendered=!1,this.prerender=""},_drawShape:function(a,b,d,e,f){var g=[],h,i,j,k,l,m,n;for(n=0,m=b.length;n<m;n++)g[n]=""+b[n][0]+","+b[n][1];return h=g.splice(0,1),f=f===c?1:f,i=d===c?' stroked="false" ':' strokeWeight="'+f+'px" strokeColor="'+d+'" ',j=e===c?' filled="false"':' fillColor="'+e+'" filled="true" ',k=g[0]===g[g.length-1]?"x ":"",l='<v:shape coordorigin="0 0" coordsize="'+this.pixelWidth+" "+this.pixelHeight+'" '+' id="jqsshape'+a+'" '+i+j+' style="position:absolute;left:0px;top:0px;height:'+this.pixelHeight+"px;width:"+this.pixelWidth+'px;padding:0px;margin:0px;" '+' path="m '+h+" l "+g.join(", ")+" "+k+'e">'+" </v:shape>",l},_drawCircle:function(a,b,d,e,f,g,h){var i,j,k;return b-=e,d-=e,i=f===c?' stroked="false" ':' strokeWeight="'+h+'px" strokeColor="'+f+'" ',j=g===c?' filled="false"':' fillColor="'+g+'" filled="true" ',k='<v:oval id="jqsshape'+a+'" '+i+j+' style="position:absolute;top:'+d+"px; left:"+b+"px; width:"+e*2+"px; height:"+e*2+'px"></v:oval>',k},_drawPieSlice:function(a,d,e,f,g,h,i,j){var k,l,m,n,o,p,q,r;if(g===h)return"";h-g===2*b.PI&&(g=0,h=2*b.PI),l=d+b.round(b.cos(g)*f),m=e+b.round(b.sin(g)*f),n=d+b.round(b.cos(h)*f),o=e+b.round(b.sin(h)*f);if(l===n&&m===o){if(h-g<b.PI)return"";l=n=d+f,m=o=e}return l===n&&m===o&&h-g<b.PI?"":(k=[d-f,e-f,d+f,e+f,l,m,n,o],p=i===c?' stroked="false" ':' strokeWeight="1px" strokeColor="'+i+'" ',q=j===c?' filled="false"':' fillColor="'+j+'" filled="true" ',r='<v:shape coordorigin="0 0" coordsize="'+this.pixelWidth+" "+this.pixelHeight+'" '+' id="jqsshape'+a+'" '+p+q+' style="position:absolute;left:0px;top:0px;height:'+this.pixelHeight+"px;width:"+this.pixelWidth+'px;padding:0px;margin:0px;" '+' path="m '+d+","+e+" wa "+k.join(", ")+' x e">'+" </v:shape>",r)},_drawRect:function(a,b,c,d,e,f,g){return this._drawShape(a,[[b,c],[b,c+e],[b+d,c+e],[b+d,c],[b,c]],f,g)},reset:function(){this.group.innerHTML=""},appendShape:function(a){var b=this["_draw"+a.type].apply(this,a.args);return this.rendered?this.group.insertAdjacentHTML("beforeEnd",b):this.prerender+=b,this.lastShapeId=a.id,a.id},replaceWithShape:function(a,b){var c=d("#jqsshape"+a),e=this["_draw"+b.type].apply(this,b.args);c[0].outerHTML=e},replaceWithShapes:function(a,b){var c=d("#jqsshape"+a[0]),e="",f=b.length,g;for(g=0;g<f;g++)e+=this["_draw"+b[g].type].apply(this,b[g].args);c[0].outerHTML=e;for(g=1;g<a.length;g++)d("#jqsshape"+a[g]).remove()},insertAfterShape:function(a,b){var c=d("#jqsshape"+a),e=this["_draw"+b.type].apply(this,b.args);c[0].insertAdjacentHTML("afterEnd",e)},removeShapeId:function(a){var b=d("#jqsshape"+a);this.group.removeChild(b[0])},getShapeAt:function(a,b,c){var d=a.id.substr(8);return d},render:function(){this.rendered||(this.group.innerHTML=this.prerender,this.rendered=!0)}})})})(document,Math); \ No newline at end of file diff --git a/theme/bootstrap/plugins/timepicker/bootstrap-timepicker.css b/theme/bootstrap/plugins/timepicker/bootstrap-timepicker.css new file mode 100644 index 0000000..873e0c7 --- /dev/null +++ b/theme/bootstrap/plugins/timepicker/bootstrap-timepicker.css @@ -0,0 +1,121 @@ +/*! + * Timepicker Component for Twitter Bootstrap + * + * Copyright 2013 Joris de Wit + * + * Contributors https://github.com/jdewit/bootstrap-timepicker/graphs/contributors + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +.bootstrap-timepicker { + position: relative; +} +.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu { + left: auto; + right: 0; +} +.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:before { + left: auto; + right: 12px; +} +.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:after { + left: auto; + right: 13px; +} +.bootstrap-timepicker .add-on { + cursor: pointer; +} +.bootstrap-timepicker .add-on i { + display: inline-block; + width: 16px; + height: 16px; +} +.bootstrap-timepicker-widget.dropdown-menu { + padding: 2px 3px 2px 2px; +} +.bootstrap-timepicker-widget.dropdown-menu.open { + display: inline-block; +} +.bootstrap-timepicker-widget.dropdown-menu:before { + border-bottom: 7px solid rgba(0, 0, 0, 0.2); + border-left: 7px solid transparent; + border-right: 7px solid transparent; + content: ""; + display: inline-block; + left: 9px; + position: absolute; + top: -7px; +} +.bootstrap-timepicker-widget.dropdown-menu:after { + border-bottom: 6px solid #FFFFFF; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + content: ""; + display: inline-block; + left: 10px; + position: absolute; + top: -6px; +} +.bootstrap-timepicker-widget a.btn, +.bootstrap-timepicker-widget input { + border-radius: 4px; +} +.bootstrap-timepicker-widget table { + width: 100%; + margin: 0; +} +.bootstrap-timepicker-widget table td { + text-align: center; + height: 30px; + margin: 0; + padding: 2px; +} +.bootstrap-timepicker-widget table td:not(.separator) { + min-width: 30px; +} +.bootstrap-timepicker-widget table td span { + width: 100%; +} +.bootstrap-timepicker-widget table td a { + border: 1px transparent solid; + width: 100%; + display: inline-block; + margin: 0; + padding: 8px 0; + outline: 0; + color: #333; +} +.bootstrap-timepicker-widget table td a:hover { + text-decoration: none; + background-color: #eee; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + border-color: #ddd; +} +.bootstrap-timepicker-widget table td a i { + margin-top: 2px; +} +.bootstrap-timepicker-widget table td input { + width: 25px; + margin: 0; + text-align: center; +} +.bootstrap-timepicker-widget .modal-content { + padding: 4px; +} +@media (min-width: 767px) { + .bootstrap-timepicker-widget.modal { + width: 200px; + margin-left: -100px; + } +} +@media (max-width: 767px) { + .bootstrap-timepicker { + width: 100%; + } + .bootstrap-timepicker .dropdown-menu { + width: 100%; + } +} diff --git a/theme/bootstrap/plugins/timepicker/bootstrap-timepicker.js b/theme/bootstrap/plugins/timepicker/bootstrap-timepicker.js new file mode 100644 index 0000000..3068c94 --- /dev/null +++ b/theme/bootstrap/plugins/timepicker/bootstrap-timepicker.js @@ -0,0 +1,903 @@ +//TODO: move arrow styles and button click code into configurable items, with defaults matching the existing code + +/*! +* Timepicker Component for Twitter Bootstrap +* +* Copyright 2013 Joris de Wit +* +* Contributors https://github.com/jdewit/bootstrap-timepicker/graphs/contributors +* +* For the full copyright and license information, please view the LICENSE +* file that was distributed with this source code. +*/ +(function($, window, document, undefined) { + 'use strict'; + + // TIMEPICKER PUBLIC CLASS DEFINITION + var Timepicker = function(element, options) { + this.widget = ''; + this.$element = $(element); + this.defaultTime = options.defaultTime; + this.disableFocus = options.disableFocus; + this.isOpen = options.isOpen; + this.minuteStep = options.minuteStep; + this.modalBackdrop = options.modalBackdrop; + this.secondStep = options.secondStep; + this.showInputs = options.showInputs; + this.showMeridian = options.showMeridian; + this.showSeconds = options.showSeconds; + this.template = options.template; + this.appendWidgetTo = options.appendWidgetTo; + this.upArrowStyle = options.upArrowStyle; + this.downArrowStyle = options.downArrowStyle; + this.containerClass = options.containerClass; + + this._init(); + }; + + Timepicker.prototype = { + + constructor: Timepicker, + + _init: function() { + var self = this; + + if (this.$element.parent().hasClass('input-append') || this.$element.parent().hasClass('input-prepend')) { + if (this.$element.parent('.input-append, .input-prepend').find('.add-on').length) { + this.$element.parent('.input-append, .input-prepend').find('.add-on').on({ + 'click.timepicker': $.proxy(this.showWidget, this) + }); + } else { + this.$element.closest(this.containerClass).find('.add-on').on({ + 'click.timepicker': $.proxy(this.showWidget, this) + }); + } + + this.$element.on({ + 'focus.timepicker': $.proxy(this.highlightUnit, this), + 'click.timepicker': $.proxy(this.highlightUnit, this), + 'keydown.timepicker': $.proxy(this.elementKeydown, this), + 'blur.timepicker': $.proxy(this.blurElement, this) + }); + } else { + if (this.template) { + this.$element.on({ + 'focus.timepicker': $.proxy(this.showWidget, this), + 'click.timepicker': $.proxy(this.showWidget, this), + 'blur.timepicker': $.proxy(this.blurElement, this) + }); + } else { + this.$element.on({ + 'focus.timepicker': $.proxy(this.highlightUnit, this), + 'click.timepicker': $.proxy(this.highlightUnit, this), + 'keydown.timepicker': $.proxy(this.elementKeydown, this), + 'blur.timepicker': $.proxy(this.blurElement, this) + }); + } + } + + if (this.template !== false) { + this.$widget = $(this.getTemplate()).prependTo(this.$element.parents(this.appendWidgetTo)).on('click', $.proxy(this.widgetClick, this)); + } else { + this.$widget = false; + } + + if (this.showInputs && this.$widget !== false) { + this.$widget.find('input').each(function() { + $(this).on({ + 'click.timepicker': function() { $(this).select(); }, + 'keydown.timepicker': $.proxy(self.widgetKeydown, self) + }); + }); + } + + this.setDefaultTime(this.defaultTime); + }, + + blurElement: function() { + this.highlightedUnit = undefined; + this.updateFromElementVal(); + }, + + decrementHour: function() { + if (this.showMeridian) { + if (this.hour === 1) { + this.hour = 12; + } else if (this.hour === 12) { + this.hour--; + + return this.toggleMeridian(); + } else if (this.hour === 0) { + this.hour = 11; + + return this.toggleMeridian(); + } else { + this.hour--; + } + } else { + if (this.hour === 0) { + this.hour = 23; + } else { + this.hour--; + } + } + this.update(); + }, + + decrementMinute: function(step) { + var newVal; + + if (step) { + newVal = this.minute - step; + } else { + newVal = this.minute - this.minuteStep; + } + + if (newVal < 0) { + this.decrementHour(); + this.minute = newVal + 60; + } else { + this.minute = newVal; + } + this.update(); + }, + + decrementSecond: function() { + var newVal = this.second - this.secondStep; + + if (newVal < 0) { + this.decrementMinute(true); + this.second = newVal + 60; + } else { + this.second = newVal; + } + this.update(); + }, + + elementKeydown: function(e) { + switch (e.keyCode) { + case 9: //tab + this.updateFromElementVal(); + + switch (this.highlightedUnit) { + case 'hour': + e.preventDefault(); + this.highlightNextUnit(); + break; + case 'minute': + if (this.showMeridian || this.showSeconds) { + e.preventDefault(); + this.highlightNextUnit(); + } + break; + case 'second': + if (this.showMeridian) { + e.preventDefault(); + this.highlightNextUnit(); + } + break; + } + break; + case 27: // escape + this.updateFromElementVal(); + break; + case 37: // left arrow + e.preventDefault(); + this.highlightPrevUnit(); + this.updateFromElementVal(); + break; + case 38: // up arrow + e.preventDefault(); + switch (this.highlightedUnit) { + case 'hour': + this.incrementHour(); + this.highlightHour(); + break; + case 'minute': + this.incrementMinute(); + this.highlightMinute(); + break; + case 'second': + this.incrementSecond(); + this.highlightSecond(); + break; + case 'meridian': + this.toggleMeridian(); + this.highlightMeridian(); + break; + } + break; + case 39: // right arrow + e.preventDefault(); + this.updateFromElementVal(); + this.highlightNextUnit(); + break; + case 40: // down arrow + e.preventDefault(); + switch (this.highlightedUnit) { + case 'hour': + this.decrementHour(); + this.highlightHour(); + break; + case 'minute': + this.decrementMinute(); + this.highlightMinute(); + break; + case 'second': + this.decrementSecond(); + this.highlightSecond(); + break; + case 'meridian': + this.toggleMeridian(); + this.highlightMeridian(); + break; + } + break; + } + }, + + formatTime: function(hour, minute, second, meridian) { + hour = hour < 10 ? '0' + hour : hour; + minute = minute < 10 ? '0' + minute : minute; + second = second < 10 ? '0' + second : second; + + return hour + ':' + minute + (this.showSeconds ? ':' + second : '') + (this.showMeridian ? ' ' + meridian : ''); + }, + + getCursorPosition: function() { + var input = this.$element.get(0); + + if ('selectionStart' in input) {// Standard-compliant browsers + + return input.selectionStart; + } else if (document.selection) {// IE fix + input.focus(); + var sel = document.selection.createRange(), + selLen = document.selection.createRange().text.length; + + sel.moveStart('character', - input.value.length); + + return sel.text.length - selLen; + } + }, + + getTemplate: function() { + var template, + hourTemplate, + minuteTemplate, + secondTemplate, + meridianTemplate, + templateContent; + + if (this.showInputs) { + hourTemplate = '<input type="text" name="hour" class="bootstrap-timepicker-hour form-control" maxlength="2"/>'; + minuteTemplate = '<input type="text" name="minute" class="bootstrap-timepicker-minute form-control" maxlength="2"/>'; + secondTemplate = '<input type="text" name="second" class="bootstrap-timepicker-second form-control" maxlength="2"/>'; + meridianTemplate = '<input type="text" name="meridian" class="bootstrap-timepicker-meridian form-control" maxlength="2"/>'; + } else { + hourTemplate = '<span class="bootstrap-timepicker-hour"></span>'; + minuteTemplate = '<span class="bootstrap-timepicker-minute"></span>'; + secondTemplate = '<span class="bootstrap-timepicker-second"></span>'; + meridianTemplate = '<span class="bootstrap-timepicker-meridian"></span>'; + } + + templateContent = '<table>'+ + '<tr>'+ + '<td><a href="#" data-action="incrementHour"><i class="' + this.upArrowStyle + '"></i></a></td>'+ + '<td class="separator">&nbsp;</td>'+ + '<td><a href="#" data-action="incrementMinute"><i class="' + this.upArrowStyle + '"></i></a></td>'+ + (this.showSeconds ? + '<td class="separator">&nbsp;</td>'+ + '<td><a href="#" data-action="incrementSecond"><i class="' + this.upArrowStyle + '"></i></a></td>' + : '') + + (this.showMeridian ? + '<td class="separator">&nbsp;</td>'+ + '<td class="meridian-column"><a href="#" data-action="toggleMeridian"><i class="' + this.upArrowStyle + '"></i></a></td>' + : '') + + '</tr>'+ + '<tr>'+ + '<td>'+ hourTemplate +'</td> '+ + '<td class="separator">:</td>'+ + '<td>'+ minuteTemplate +'</td> '+ + (this.showSeconds ? + '<td class="separator">:</td>'+ + '<td>'+ secondTemplate +'</td>' + : '') + + (this.showMeridian ? + '<td class="separator">&nbsp;</td>'+ + '<td>'+ meridianTemplate +'</td>' + : '') + + '</tr>'+ + '<tr>'+ + '<td><a href="#" data-action="decrementHour"><i class="' + this.downArrowStyle + '"></i></a></td>'+ + '<td class="separator"></td>'+ + '<td><a href="#" data-action="decrementMinute"><i class="' + this.downArrowStyle + '"></i></a></td>'+ + (this.showSeconds ? + '<td class="separator">&nbsp;</td>'+ + '<td><a href="#" data-action="decrementSecond"><i class="' + this.downArrowStyle + '"></i></a></td>' + : '') + + (this.showMeridian ? + '<td class="separator">&nbsp;</td>'+ + '<td><a href="#" data-action="toggleMeridian"><i class="' + this.downArrowStyle + '"></i></a></td>' + : '') + + '</tr>'+ + '</table>'; + + switch(this.template) { + case 'modal': + template = '<div class="bootstrap-timepicker-widget modal hide fade in" data-backdrop="'+ (this.modalBackdrop ? 'true' : 'false') +'">'+ + '<div class="modal-header">'+ + '<a href="#" class="close" data-dismiss="modal">×</a>'+ + '<h3>Pick a Time</h3>'+ + '</div>'+ + '<div class="modal-content">'+ + templateContent + + '</div>'+ + '<div class="modal-footer">'+ + '<a href="#" class="btn btn-primary" data-dismiss="modal">OK</a>'+ + '</div>'+ + '</div>'; + break; + case 'dropdown': + template = '<div class="bootstrap-timepicker-widget dropdown-menu">'+ templateContent +'</div>'; + break; + } + + return template; + }, + + getTime: function() { + return this.formatTime(this.hour, this.minute, this.second, this.meridian); + }, + + hideWidget: function() { + if (this.isOpen === false) { + return; + } + + if (this.showInputs) { + this.updateFromWidgetInputs(); + } + + this.$element.trigger({ + 'type': 'hide.timepicker', + 'time': { + 'value': this.getTime(), + 'hours': this.hour, + 'minutes': this.minute, + 'seconds': this.second, + 'meridian': this.meridian + } + }); + + if (this.template === 'modal' && this.$widget.modal) { + this.$widget.modal('hide'); + } else { + this.$widget.removeClass('open'); + } + + $(document).off('mousedown.timepicker'); + + this.isOpen = false; + }, + + highlightUnit: function() { + this.position = this.getCursorPosition(); + if (this.position >= 0 && this.position <= 2) { + this.highlightHour(); + } else if (this.position >= 3 && this.position <= 5) { + this.highlightMinute(); + } else if (this.position >= 6 && this.position <= 8) { + if (this.showSeconds) { + this.highlightSecond(); + } else { + this.highlightMeridian(); + } + } else if (this.position >= 9 && this.position <= 11) { + this.highlightMeridian(); + } + }, + + highlightNextUnit: function() { + switch (this.highlightedUnit) { + case 'hour': + this.highlightMinute(); + break; + case 'minute': + if (this.showSeconds) { + this.highlightSecond(); + } else if (this.showMeridian){ + this.highlightMeridian(); + } else { + this.highlightHour(); + } + break; + case 'second': + if (this.showMeridian) { + this.highlightMeridian(); + } else { + this.highlightHour(); + } + break; + case 'meridian': + this.highlightHour(); + break; + } + }, + + highlightPrevUnit: function() { + switch (this.highlightedUnit) { + case 'hour': + this.highlightMeridian(); + break; + case 'minute': + this.highlightHour(); + break; + case 'second': + this.highlightMinute(); + break; + case 'meridian': + if (this.showSeconds) { + this.highlightSecond(); + } else { + this.highlightMinute(); + } + break; + } + }, + + highlightHour: function() { + var $element = this.$element.get(0); + + this.highlightedUnit = 'hour'; + + if ($element.setSelectionRange) { + setTimeout(function() { + $element.setSelectionRange(0,2); + }, 0); + } + }, + + highlightMinute: function() { + var $element = this.$element.get(0); + + this.highlightedUnit = 'minute'; + + if ($element.setSelectionRange) { + setTimeout(function() { + $element.setSelectionRange(3,5); + }, 0); + } + }, + + highlightSecond: function() { + var $element = this.$element.get(0); + + this.highlightedUnit = 'second'; + + if ($element.setSelectionRange) { + setTimeout(function() { + $element.setSelectionRange(6,8); + }, 0); + } + }, + + highlightMeridian: function() { + var $element = this.$element.get(0); + + this.highlightedUnit = 'meridian'; + + if ($element.setSelectionRange) { + if (this.showSeconds) { + setTimeout(function() { + $element.setSelectionRange(9,11); + }, 0); + } else { + setTimeout(function() { + $element.setSelectionRange(6,8); + }, 0); + } + } + }, + + incrementHour: function() { + if (this.showMeridian) { + if (this.hour === 11) { + this.hour++; + return this.toggleMeridian(); + } else if (this.hour === 12) { + this.hour = 0; + } + } + if (this.hour === 23) { + this.hour = 0; + + return; + } + this.hour++; + this.update(); + }, + + incrementMinute: function(step) { + var newVal; + + if (step) { + newVal = this.minute + step; + } else { + newVal = this.minute + this.minuteStep - (this.minute % this.minuteStep); + } + + if (newVal > 59) { + this.incrementHour(); + this.minute = newVal - 60; + } else { + this.minute = newVal; + } + this.update(); + }, + + incrementSecond: function() { + var newVal = this.second + this.secondStep - (this.second % this.secondStep); + + if (newVal > 59) { + this.incrementMinute(true); + this.second = newVal - 60; + } else { + this.second = newVal; + } + this.update(); + }, + + remove: function() { + $('document').off('.timepicker'); + if (this.$widget) { + this.$widget.remove(); + } + delete this.$element.data().timepicker; + }, + + setDefaultTime: function(defaultTime){ + if (!this.$element.val()) { + if (defaultTime === 'current') { + var dTime = new Date(), + hours = dTime.getHours(), + minutes = Math.floor(dTime.getMinutes() / this.minuteStep) * this.minuteStep, + seconds = Math.floor(dTime.getSeconds() / this.secondStep) * this.secondStep, + meridian = 'AM'; + + if (this.showMeridian) { + if (hours === 0) { + hours = 12; + } else if (hours >= 12) { + if (hours > 12) { + hours = hours - 12; + } + meridian = 'PM'; + } else { + meridian = 'AM'; + } + } + + this.hour = hours; + this.minute = minutes; + this.second = seconds; + this.meridian = meridian; + + this.update(); + + } else if (defaultTime === false) { + this.hour = 0; + this.minute = 0; + this.second = 0; + this.meridian = 'AM'; + } else { + this.setTime(defaultTime); + } + } else { + this.updateFromElementVal(); + } + }, + + setTime: function(time) { + var arr, + timeArray; + + if (this.showMeridian) { + arr = time.split(' '); + timeArray = arr[0].split(':'); + this.meridian = arr[1]; + } else { + timeArray = time.split(':'); + } + + this.hour = parseInt(timeArray[0], 10); + this.minute = parseInt(timeArray[1], 10); + this.second = parseInt(timeArray[2], 10); + + if (isNaN(this.hour)) { + this.hour = 0; + } + if (isNaN(this.minute)) { + this.minute = 0; + } + + if (this.showMeridian) { + if (this.hour > 12) { + this.hour = 12; + } else if (this.hour < 1) { + this.hour = 12; + } + + if (this.meridian === 'am' || this.meridian === 'a') { + this.meridian = 'AM'; + } else if (this.meridian === 'pm' || this.meridian === 'p') { + this.meridian = 'PM'; + } + + if (this.meridian !== 'AM' && this.meridian !== 'PM') { + this.meridian = 'AM'; + } + } else { + if (this.hour >= 24) { + this.hour = 23; + } else if (this.hour < 0) { + this.hour = 0; + } + } + + if (this.minute < 0) { + this.minute = 0; + } else if (this.minute >= 60) { + this.minute = 59; + } + + if (this.showSeconds) { + if (isNaN(this.second)) { + this.second = 0; + } else if (this.second < 0) { + this.second = 0; + } else if (this.second >= 60) { + this.second = 59; + } + } + + this.update(); + }, + + showWidget: function() { + if (this.isOpen) { + return; + } + + if (this.$element.is(':disabled')) { + return; + } + + var self = this; + $(document).on('mousedown.timepicker', function (e) { + // Clicked outside the timepicker, hide it + if ($(e.target).closest('.bootstrap-timepicker-widget').length === 0) { + self.hideWidget(); + } + }); + + this.$element.trigger({ + 'type': 'show.timepicker', + 'time': { + 'value': this.getTime(), + 'hours': this.hour, + 'minutes': this.minute, + 'seconds': this.second, + 'meridian': this.meridian + } + }); + + if (this.disableFocus) { + this.$element.blur(); + } + + this.updateFromElementVal(); + + if (this.template === 'modal' && this.$widget.modal) { + this.$widget.modal('show').on('hidden', $.proxy(this.hideWidget, this)); + } else { + if (this.isOpen === false) { + this.$widget.addClass('open'); + } + } + + this.isOpen = true; + }, + + toggleMeridian: function() { + this.meridian = this.meridian === 'AM' ? 'PM' : 'AM'; + this.update(); + }, + + update: function() { + this.$element.trigger({ + 'type': 'changeTime.timepicker', + 'time': { + 'value': this.getTime(), + 'hours': this.hour, + 'minutes': this.minute, + 'seconds': this.second, + 'meridian': this.meridian + } + }); + + this.updateElement(); + this.updateWidget(); + }, + + updateElement: function() { + this.$element.val(this.getTime()).change(); + }, + + updateFromElementVal: function() { + var val = this.$element.val(); + + if (val) { + this.setTime(val); + } + }, + + updateWidget: function() { + if (this.$widget === false) { + return; + } + + var hour = this.hour < 10 ? '0' + this.hour : this.hour, + minute = this.minute < 10 ? '0' + this.minute : this.minute, + second = this.second < 10 ? '0' + this.second : this.second; + + if (this.showInputs) { + this.$widget.find('input.bootstrap-timepicker-hour').val(hour); + this.$widget.find('input.bootstrap-timepicker-minute').val(minute); + + if (this.showSeconds) { + this.$widget.find('input.bootstrap-timepicker-second').val(second); + } + if (this.showMeridian) { + this.$widget.find('input.bootstrap-timepicker-meridian').val(this.meridian); + } + } else { + this.$widget.find('span.bootstrap-timepicker-hour').text(hour); + this.$widget.find('span.bootstrap-timepicker-minute').text(minute); + + if (this.showSeconds) { + this.$widget.find('span.bootstrap-timepicker-second').text(second); + } + if (this.showMeridian) { + this.$widget.find('span.bootstrap-timepicker-meridian').text(this.meridian); + } + } + }, + + updateFromWidgetInputs: function() { + if (this.$widget === false) { + return; + } + var time = $('input.bootstrap-timepicker-hour', this.$widget).val() + ':' + + $('input.bootstrap-timepicker-minute', this.$widget).val() + + (this.showSeconds ? ':' + $('input.bootstrap-timepicker-second', this.$widget).val() : '') + + (this.showMeridian ? ' ' + $('input.bootstrap-timepicker-meridian', this.$widget).val() : ''); + + this.setTime(time); + }, + + widgetClick: function(e) { + e.stopPropagation(); + e.preventDefault(); + + var action = $(e.target).closest('a').data('action'); + if (action) { + this[action](); + } + }, + + widgetKeydown: function(e) { + var $input = $(e.target).closest('input'), + name = $input.attr('name'); + + switch (e.keyCode) { + case 9: //tab + if (this.showMeridian) { + if (name === 'meridian') { + return this.hideWidget(); + } + } else { + if (this.showSeconds) { + if (name === 'second') { + return this.hideWidget(); + } + } else { + if (name === 'minute') { + return this.hideWidget(); + } + } + } + + this.updateFromWidgetInputs(); + break; + case 27: // escape + this.hideWidget(); + break; + case 38: // up arrow + e.preventDefault(); + switch (name) { + case 'hour': + this.incrementHour(); + break; + case 'minute': + this.incrementMinute(); + break; + case 'second': + this.incrementSecond(); + break; + case 'meridian': + this.toggleMeridian(); + break; + } + break; + case 40: // down arrow + e.preventDefault(); + switch (name) { + case 'hour': + this.decrementHour(); + break; + case 'minute': + this.decrementMinute(); + break; + case 'second': + this.decrementSecond(); + break; + case 'meridian': + this.toggleMeridian(); + break; + } + break; + } + } + }; + + + //TIMEPICKER PLUGIN DEFINITION + $.fn.timepicker = function(option) { + var args = Array.apply(null, arguments); + args.shift(); + return this.each(function() { + var $this = $(this), + data = $this.data('timepicker'), + options = typeof option === 'object' && option; + + if (!data) { + $this.data('timepicker', (data = new Timepicker(this, $.extend({}, $.fn.timepicker.defaults, options, $(this).data())))); + } + + if (typeof option === 'string') { + data[option].apply(data, args); + } + }); + }; + + $.fn.timepicker.defaults = { + defaultTime: 'current', + disableFocus: false, + isOpen: false, + minuteStep: 15, + modalBackdrop: false, + secondStep: 15, + showSeconds: false, + showInputs: true, + showMeridian: true, + template: 'dropdown', + appendWidgetTo: '.bootstrap-timepicker', + upArrowStyle: 'glyphicon glyphicon-chevron-up', + downArrowStyle: 'glyphicon glyphicon-chevron-down', + containerClass: 'bootstrap-timepicker' + }; + + $.fn.timepicker.Constructor = Timepicker; + +})(jQuery, window, document); diff --git a/theme/bootstrap/plugins/timepicker/bootstrap-timepicker.min.css b/theme/bootstrap/plugins/timepicker/bootstrap-timepicker.min.css new file mode 100644 index 0000000..b59d6f7 --- /dev/null +++ b/theme/bootstrap/plugins/timepicker/bootstrap-timepicker.min.css @@ -0,0 +1,10 @@ +/*! + * Timepicker Component for Twitter Bootstrap + * + * Copyright 2013 Joris de Wit + * + * Contributors https://github.com/jdewit/bootstrap-timepicker/graphs/contributors + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */.bootstrap-timepicker{position:relative}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu{left:auto;right:0}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:before{left:auto;right:12px}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:after{left:auto;right:13px}.bootstrap-timepicker .add-on{cursor:pointer}.bootstrap-timepicker .add-on i{display:inline-block;width:16px;height:16px}.bootstrap-timepicker-widget.dropdown-menu{padding:2px 3px 2px 2px}.bootstrap-timepicker-widget.dropdown-menu.open{display:inline-block}.bootstrap-timepicker-widget.dropdown-menu:before{border-bottom:7px solid rgba(0,0,0,0.2);border-left:7px solid transparent;border-right:7px solid transparent;content:"";display:inline-block;left:9px;position:absolute;top:-7px}.bootstrap-timepicker-widget.dropdown-menu:after{border-bottom:6px solid #fff;border-left:6px solid transparent;border-right:6px solid transparent;content:"";display:inline-block;left:10px;position:absolute;top:-6px}.bootstrap-timepicker-widget a.btn,.bootstrap-timepicker-widget input{border-radius:4px}.bootstrap-timepicker-widget table{width:100%;margin:0}.bootstrap-timepicker-widget table td{text-align:center;height:30px;margin:0;padding:2px}.bootstrap-timepicker-widget table td:not(.separator){min-width:30px}.bootstrap-timepicker-widget table td span{width:100%}.bootstrap-timepicker-widget table td a{border:1px transparent solid;width:100%;display:inline-block;margin:0;padding:8px 0;outline:0;color:#333}.bootstrap-timepicker-widget table td a:hover{text-decoration:none;background-color:#eee;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border-color:#ddd}.bootstrap-timepicker-widget table td a i{margin-top:2px}.bootstrap-timepicker-widget table td input{width:25px;margin:0;text-align:center}.bootstrap-timepicker-widget .modal-content{padding:4px}@media(min-width:767px){.bootstrap-timepicker-widget.modal{width:200px;margin-left:-100px}}@media(max-width:767px){.bootstrap-timepicker{width:100%}.bootstrap-timepicker .dropdown-menu{width:100%}} \ No newline at end of file diff --git a/theme/bootstrap/plugins/timepicker/bootstrap-timepicker.min.js b/theme/bootstrap/plugins/timepicker/bootstrap-timepicker.min.js new file mode 100644 index 0000000..3c78d5c --- /dev/null +++ b/theme/bootstrap/plugins/timepicker/bootstrap-timepicker.min.js @@ -0,0 +1,5 @@ +/*! bootstrap-timepicker v0.2.3 +* http://jdewit.github.com/bootstrap-timepicker +* Copyright (c) 2013 Joris de Wit +* MIT License +*/(function(e,t,n,r){"use strict";var i=function(t,n){this.widget="";this.$element=e(t);this.defaultTime=n.defaultTime;this.disableFocus=n.disableFocus;this.isOpen=n.isOpen;this.minuteStep=n.minuteStep;this.modalBackdrop=n.modalBackdrop;this.secondStep=n.secondStep;this.showInputs=n.showInputs;this.showMeridian=n.showMeridian;this.showSeconds=n.showSeconds;this.template=n.template;this.appendWidgetTo=n.appendWidgetTo;this.upArrowStyle=n.upArrowStyle;this.downArrowStyle=n.downArrowStyle;this.containerClass=n.containerClass;this._init()};i.prototype={constructor:i,_init:function(){var t=this;if(this.$element.parent().hasClass("input-append")||this.$element.parent().hasClass("input-prepend")){if(this.$element.parent(".input-append, .input-prepend").find(".add-on").length){this.$element.parent(".input-append, .input-prepend").find(".add-on").on({"click.timepicker":e.proxy(this.showWidget,this)})}else{this.$element.closest(this.containerClass).find(".add-on").on({"click.timepicker":e.proxy(this.showWidget,this)})}this.$element.on({"focus.timepicker":e.proxy(this.highlightUnit,this),"click.timepicker":e.proxy(this.highlightUnit,this),"keydown.timepicker":e.proxy(this.elementKeydown,this),"blur.timepicker":e.proxy(this.blurElement,this)})}else{if(this.template){this.$element.on({"focus.timepicker":e.proxy(this.showWidget,this),"click.timepicker":e.proxy(this.showWidget,this),"blur.timepicker":e.proxy(this.blurElement,this)})}else{this.$element.on({"focus.timepicker":e.proxy(this.highlightUnit,this),"click.timepicker":e.proxy(this.highlightUnit,this),"keydown.timepicker":e.proxy(this.elementKeydown,this),"blur.timepicker":e.proxy(this.blurElement,this)})}}if(this.template!==false){this.$widget=e(this.getTemplate()).prependTo(this.$element.parents(this.appendWidgetTo)).on("click",e.proxy(this.widgetClick,this))}else{this.$widget=false}if(this.showInputs&&this.$widget!==false){this.$widget.find("input").each(function(){e(this).on({"click.timepicker":function(){e(this).select()},"keydown.timepicker":e.proxy(t.widgetKeydown,t)})})}this.setDefaultTime(this.defaultTime)},blurElement:function(){this.highlightedUnit=r;this.updateFromElementVal()},decrementHour:function(){if(this.showMeridian){if(this.hour===1){this.hour=12}else if(this.hour===12){this.hour--;return this.toggleMeridian()}else if(this.hour===0){this.hour=11;return this.toggleMeridian()}else{this.hour--}}else{if(this.hour===0){this.hour=23}else{this.hour--}}this.update()},decrementMinute:function(e){var t;if(e){t=this.minute-e}else{t=this.minute-this.minuteStep}if(t<0){this.decrementHour();this.minute=t+60}else{this.minute=t}this.update()},decrementSecond:function(){var e=this.second-this.secondStep;if(e<0){this.decrementMinute(true);this.second=e+60}else{this.second=e}this.update()},elementKeydown:function(e){switch(e.keyCode){case 9:this.updateFromElementVal();switch(this.highlightedUnit){case"hour":e.preventDefault();this.highlightNextUnit();break;case"minute":if(this.showMeridian||this.showSeconds){e.preventDefault();this.highlightNextUnit()}break;case"second":if(this.showMeridian){e.preventDefault();this.highlightNextUnit()}break}break;case 27:this.updateFromElementVal();break;case 37:e.preventDefault();this.highlightPrevUnit();this.updateFromElementVal();break;case 38:e.preventDefault();switch(this.highlightedUnit){case"hour":this.incrementHour();this.highlightHour();break;case"minute":this.incrementMinute();this.highlightMinute();break;case"second":this.incrementSecond();this.highlightSecond();break;case"meridian":this.toggleMeridian();this.highlightMeridian();break}break;case 39:e.preventDefault();this.updateFromElementVal();this.highlightNextUnit();break;case 40:e.preventDefault();switch(this.highlightedUnit){case"hour":this.decrementHour();this.highlightHour();break;case"minute":this.decrementMinute();this.highlightMinute();break;case"second":this.decrementSecond();this.highlightSecond();break;case"meridian":this.toggleMeridian();this.highlightMeridian();break}break}},formatTime:function(e,t,n,r){e=e<10?"0"+e:e;t=t<10?"0"+t:t;n=n<10?"0"+n:n;return e+":"+t+(this.showSeconds?":"+n:"")+(this.showMeridian?" "+r:"")},getCursorPosition:function(){var e=this.$element.get(0);if("selectionStart"in e){return e.selectionStart}else if(n.selection){e.focus();var t=n.selection.createRange(),r=n.selection.createRange().text.length;t.moveStart("character",-e.value.length);return t.text.length-r}},getTemplate:function(){var e,t,n,r,i,s;if(this.showInputs){t='<input type="text" name="hour" class="bootstrap-timepicker-hour form-control" maxlength="2"/>';n='<input type="text" name="minute" class="bootstrap-timepicker-minute form-control" maxlength="2"/>';r='<input type="text" name="second" class="bootstrap-timepicker-second form-control" maxlength="2"/>';i='<input type="text" name="meridian" class="bootstrap-timepicker-meridian form-control" maxlength="2"/>'}else{t='<span class="bootstrap-timepicker-hour"></span>';n='<span class="bootstrap-timepicker-minute"></span>';r='<span class="bootstrap-timepicker-second"></span>';i='<span class="bootstrap-timepicker-meridian"></span>'}s="<table>"+"<tr>"+'<td><a href="#" data-action="incrementHour"><i class="'+this.upArrowStyle+'"></i></a></td>'+'<td class="separator">&nbsp;</td>'+'<td><a href="#" data-action="incrementMinute"><i class="'+this.upArrowStyle+'"></i></a></td>'+(this.showSeconds?'<td class="separator">&nbsp;</td>'+'<td><a href="#" data-action="incrementSecond"><i class="'+this.upArrowStyle+'"></i></a></td>':"")+(this.showMeridian?'<td class="separator">&nbsp;</td>'+'<td class="meridian-column"><a href="#" data-action="toggleMeridian"><i class="'+this.upArrowStyle+'"></i></a></td>':"")+"</tr>"+"<tr>"+"<td>"+t+"</td> "+'<td class="separator">:</td>'+"<td>"+n+"</td> "+(this.showSeconds?'<td class="separator">:</td>'+"<td>"+r+"</td>":"")+(this.showMeridian?'<td class="separator">&nbsp;</td>'+"<td>"+i+"</td>":"")+"</tr>"+"<tr>"+'<td><a href="#" data-action="decrementHour"><i class="'+this.downArrowStyle+'"></i></a></td>'+'<td class="separator"></td>'+'<td><a href="#" data-action="decrementMinute"><i class="'+this.downArrowStyle+'"></i></a></td>'+(this.showSeconds?'<td class="separator">&nbsp;</td>'+'<td><a href="#" data-action="decrementSecond"><i class="'+this.downArrowStyle+'"></i></a></td>':"")+(this.showMeridian?'<td class="separator">&nbsp;</td>'+'<td><a href="#" data-action="toggleMeridian"><i class="'+this.downArrowStyle+'"></i></a></td>':"")+"</tr>"+"</table>";switch(this.template){case"modal":e='<div class="bootstrap-timepicker-widget modal hide fade in" data-backdrop="'+(this.modalBackdrop?"true":"false")+'">'+'<div class="modal-header">'+'<a href="#" class="close" data-dismiss="modal">×</a>'+"<h3>Pick a Time</h3>"+"</div>"+'<div class="modal-content">'+s+"</div>"+'<div class="modal-footer">'+'<a href="#" class="btn btn-primary" data-dismiss="modal">OK</a>'+"</div>"+"</div>";break;case"dropdown":e='<div class="bootstrap-timepicker-widget dropdown-menu">'+s+"</div>";break}return e},getTime:function(){return this.formatTime(this.hour,this.minute,this.second,this.meridian)},hideWidget:function(){if(this.isOpen===false){return}if(this.showInputs){this.updateFromWidgetInputs()}this.$element.trigger({type:"hide.timepicker",time:{value:this.getTime(),hours:this.hour,minutes:this.minute,seconds:this.second,meridian:this.meridian}});if(this.template==="modal"&&this.$widget.modal){this.$widget.modal("hide")}else{this.$widget.removeClass("open")}e(n).off("mousedown.timepicker");this.isOpen=false},highlightUnit:function(){this.position=this.getCursorPosition();if(this.position>=0&&this.position<=2){this.highlightHour()}else if(this.position>=3&&this.position<=5){this.highlightMinute()}else if(this.position>=6&&this.position<=8){if(this.showSeconds){this.highlightSecond()}else{this.highlightMeridian()}}else if(this.position>=9&&this.position<=11){this.highlightMeridian()}},highlightNextUnit:function(){switch(this.highlightedUnit){case"hour":this.highlightMinute();break;case"minute":if(this.showSeconds){this.highlightSecond()}else if(this.showMeridian){this.highlightMeridian()}else{this.highlightHour()}break;case"second":if(this.showMeridian){this.highlightMeridian()}else{this.highlightHour()}break;case"meridian":this.highlightHour();break}},highlightPrevUnit:function(){switch(this.highlightedUnit){case"hour":this.highlightMeridian();break;case"minute":this.highlightHour();break;case"second":this.highlightMinute();break;case"meridian":if(this.showSeconds){this.highlightSecond()}else{this.highlightMinute()}break}},highlightHour:function(){var e=this.$element.get(0);this.highlightedUnit="hour";if(e.setSelectionRange){setTimeout(function(){e.setSelectionRange(0,2)},0)}},highlightMinute:function(){var e=this.$element.get(0);this.highlightedUnit="minute";if(e.setSelectionRange){setTimeout(function(){e.setSelectionRange(3,5)},0)}},highlightSecond:function(){var e=this.$element.get(0);this.highlightedUnit="second";if(e.setSelectionRange){setTimeout(function(){e.setSelectionRange(6,8)},0)}},highlightMeridian:function(){var e=this.$element.get(0);this.highlightedUnit="meridian";if(e.setSelectionRange){if(this.showSeconds){setTimeout(function(){e.setSelectionRange(9,11)},0)}else{setTimeout(function(){e.setSelectionRange(6,8)},0)}}},incrementHour:function(){if(this.showMeridian){if(this.hour===11){this.hour++;return this.toggleMeridian()}else if(this.hour===12){this.hour=0}}if(this.hour===23){this.hour=0;return}this.hour++;this.update()},incrementMinute:function(e){var t;if(e){t=this.minute+e}else{t=this.minute+this.minuteStep-this.minute%this.minuteStep}if(t>59){this.incrementHour();this.minute=t-60}else{this.minute=t}this.update()},incrementSecond:function(){var e=this.second+this.secondStep-this.second%this.secondStep;if(e>59){this.incrementMinute(true);this.second=e-60}else{this.second=e}this.update()},remove:function(){e("document").off(".timepicker");if(this.$widget){this.$widget.remove()}delete this.$element.data().timepicker},setDefaultTime:function(e){if(!this.$element.val()){if(e==="current"){var t=new Date,n=t.getHours(),r=Math.floor(t.getMinutes()/this.minuteStep)*this.minuteStep,i=Math.floor(t.getSeconds()/this.secondStep)*this.secondStep,s="AM";if(this.showMeridian){if(n===0){n=12}else if(n>=12){if(n>12){n=n-12}s="PM"}else{s="AM"}}this.hour=n;this.minute=r;this.second=i;this.meridian=s;this.update()}else if(e===false){this.hour=0;this.minute=0;this.second=0;this.meridian="AM"}else{this.setTime(e)}}else{this.updateFromElementVal()}},setTime:function(e){var t,n;if(this.showMeridian){t=e.split(" ");n=t[0].split(":");this.meridian=t[1]}else{n=e.split(":")}this.hour=parseInt(n[0],10);this.minute=parseInt(n[1],10);this.second=parseInt(n[2],10);if(isNaN(this.hour)){this.hour=0}if(isNaN(this.minute)){this.minute=0}if(this.showMeridian){if(this.hour>12){this.hour=12}else if(this.hour<1){this.hour=12}if(this.meridian==="am"||this.meridian==="a"){this.meridian="AM"}else if(this.meridian==="pm"||this.meridian==="p"){this.meridian="PM"}if(this.meridian!=="AM"&&this.meridian!=="PM"){this.meridian="AM"}}else{if(this.hour>=24){this.hour=23}else if(this.hour<0){this.hour=0}}if(this.minute<0){this.minute=0}else if(this.minute>=60){this.minute=59}if(this.showSeconds){if(isNaN(this.second)){this.second=0}else if(this.second<0){this.second=0}else if(this.second>=60){this.second=59}}this.update()},showWidget:function(){if(this.isOpen){return}if(this.$element.is(":disabled")){return}var t=this;e(n).on("mousedown.timepicker",function(n){if(e(n.target).closest(".bootstrap-timepicker-widget").length===0){t.hideWidget()}});this.$element.trigger({type:"show.timepicker",time:{value:this.getTime(),hours:this.hour,minutes:this.minute,seconds:this.second,meridian:this.meridian}});if(this.disableFocus){this.$element.blur()}this.updateFromElementVal();if(this.template==="modal"&&this.$widget.modal){this.$widget.modal("show").on("hidden",e.proxy(this.hideWidget,this))}else{if(this.isOpen===false){this.$widget.addClass("open")}}this.isOpen=true},toggleMeridian:function(){this.meridian=this.meridian==="AM"?"PM":"AM";this.update()},update:function(){this.$element.trigger({type:"changeTime.timepicker",time:{value:this.getTime(),hours:this.hour,minutes:this.minute,seconds:this.second,meridian:this.meridian}});this.updateElement();this.updateWidget()},updateElement:function(){this.$element.val(this.getTime()).change()},updateFromElementVal:function(){var e=this.$element.val();if(e){this.setTime(e)}},updateWidget:function(){if(this.$widget===false){return}var e=this.hour<10?"0"+this.hour:this.hour,t=this.minute<10?"0"+this.minute:this.minute,n=this.second<10?"0"+this.second:this.second;if(this.showInputs){this.$widget.find("input.bootstrap-timepicker-hour").val(e);this.$widget.find("input.bootstrap-timepicker-minute").val(t);if(this.showSeconds){this.$widget.find("input.bootstrap-timepicker-second").val(n)}if(this.showMeridian){this.$widget.find("input.bootstrap-timepicker-meridian").val(this.meridian)}}else{this.$widget.find("span.bootstrap-timepicker-hour").text(e);this.$widget.find("span.bootstrap-timepicker-minute").text(t);if(this.showSeconds){this.$widget.find("span.bootstrap-timepicker-second").text(n)}if(this.showMeridian){this.$widget.find("span.bootstrap-timepicker-meridian").text(this.meridian)}}},updateFromWidgetInputs:function(){if(this.$widget===false){return}var t=e("input.bootstrap-timepicker-hour",this.$widget).val()+":"+e("input.bootstrap-timepicker-minute",this.$widget).val()+(this.showSeconds?":"+e("input.bootstrap-timepicker-second",this.$widget).val():"")+(this.showMeridian?" "+e("input.bootstrap-timepicker-meridian",this.$widget).val():"");this.setTime(t)},widgetClick:function(t){t.stopPropagation();t.preventDefault();var n=e(t.target).closest("a").data("action");if(n){this[n]()}},widgetKeydown:function(t){var n=e(t.target).closest("input"),r=n.attr("name");switch(t.keyCode){case 9:if(this.showMeridian){if(r==="meridian"){return this.hideWidget()}}else{if(this.showSeconds){if(r==="second"){return this.hideWidget()}}else{if(r==="minute"){return this.hideWidget()}}}this.updateFromWidgetInputs();break;case 27:this.hideWidget();break;case 38:t.preventDefault();switch(r){case"hour":this.incrementHour();break;case"minute":this.incrementMinute();break;case"second":this.incrementSecond();break;case"meridian":this.toggleMeridian();break}break;case 40:t.preventDefault();switch(r){case"hour":this.decrementHour();break;case"minute":this.decrementMinute();break;case"second":this.decrementSecond();break;case"meridian":this.toggleMeridian();break}break}}};e.fn.timepicker=function(t){var n=Array.apply(null,arguments);n.shift();return this.each(function(){var r=e(this),s=r.data("timepicker"),o=typeof t==="object"&&t;if(!s){r.data("timepicker",s=new i(this,e.extend({},e.fn.timepicker.defaults,o,e(this).data())))}if(typeof t==="string"){s[t].apply(s,n)}})};e.fn.timepicker.defaults={defaultTime:"current",disableFocus:false,isOpen:false,minuteStep:15,modalBackdrop:false,secondStep:15,showSeconds:false,showInputs:true,showMeridian:true,template:"dropdown",appendWidgetTo:".bootstrap-timepicker",upArrowStyle:"glyphicon glyphicon-chevron-up",downArrowStyle:"glyphicon glyphicon-chevron-down",containerClass:"bootstrap-timepicker"};e.fn.timepicker.Constructor=i})(jQuery,window,document) \ No newline at end of file diff --git a/theme/bootstrap/starter.html b/theme/bootstrap/starter.html new file mode 100644 index 0000000..38b09a4 --- /dev/null +++ b/theme/bootstrap/starter.html @@ -0,0 +1,373 @@ +<!DOCTYPE html> +<!-- +This is a starter template page. Use this page to start your new project from +scratch. This page gets rid of all links and provides the needed markup only. +--> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>AdminLTE 2 | Starter</title> + <!-- Tell the browser to be responsive to screen width --> + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + <!-- Bootstrap 3.3.5 --> + <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css"> + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. We have chosen the skin-blue for this starter + page. However, you can choose any other skin. Make sure you + apply the skin class to the body tag so the changes take effect. + --> + <link rel="stylesheet" href="dist/css/skins/skin-blue.min.css"> + + <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> + <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> + <!--[if lt IE 9]> + <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script> + <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> + <![endif]--> + </head> + <!-- + BODY TAG OPTIONS: + ================= + Apply one or more of the following classes to get the + desired effect + |---------------------------------------------------------| + | SKINS | skin-blue | + | | skin-black | + | | skin-purple | + | | skin-yellow | + | | skin-red | + | | skin-green | + |---------------------------------------------------------| + |LAYOUT OPTIONS | fixed | + | | layout-boxed | + | | layout-top-nav | + | | sidebar-collapse | + | | sidebar-mini | + |---------------------------------------------------------| + --> + <body class="hold-transition skin-blue sidebar-mini"> + <div class="wrapper"> + + <!-- Main Header --> + <header class="main-header"> + + <!-- Logo --> + <a href="index2.html" class="logo"> + <!-- mini logo for sidebar mini 50x50 pixels --> + <span class="logo-mini"><b>A</b>LT</span> + <!-- logo for regular state and mobile devices --> + <span class="logo-lg"><b>Admin</b>LTE</span> + </a> + + <!-- Header Navbar --> + <nav class="navbar navbar-static-top" role="navigation"> + <!-- Sidebar toggle button--> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + </a> + <!-- Navbar Right Menu --> + <div class="navbar-custom-menu"> + <ul class="nav navbar-nav"> + <!-- Messages: style can be found in dropdown.less--> + <li class="dropdown messages-menu"> + <!-- Menu toggle button --> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-envelope-o"></i> + <span class="label label-success">4</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 4 messages</li> + <li> + <!-- inner menu: contains the messages --> + <ul class="menu"> + <li><!-- start message --> + <a href="#"> + <div class="pull-left"> + <!-- User Image --> + <img src="dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <!-- Message title and timestamp --> + <h4> + Support Team + <small><i class="fa fa-clock-o"></i> 5 mins</small> + </h4> + <!-- The message --> + <p>Why not buy a new awesome theme?</p> + </a> + </li><!-- end message --> + </ul><!-- /.menu --> + </li> + <li class="footer"><a href="#">See All Messages</a></li> + </ul> + </li><!-- /.messages-menu --> + + <!-- Notifications Menu --> + <li class="dropdown notifications-menu"> + <!-- Menu toggle button --> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-bell-o"></i> + <span class="label label-warning">10</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 10 notifications</li> + <li> + <!-- Inner Menu: contains the notifications --> + <ul class="menu"> + <li><!-- start notification --> + <a href="#"> + <i class="fa fa-users text-aqua"></i> 5 new members joined today + </a> + </li><!-- end notification --> + </ul> + </li> + <li class="footer"><a href="#">View all</a></li> + </ul> + </li> + <!-- Tasks Menu --> + <li class="dropdown tasks-menu"> + <!-- Menu Toggle Button --> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <i class="fa fa-flag-o"></i> + <span class="label label-danger">9</span> + </a> + <ul class="dropdown-menu"> + <li class="header">You have 9 tasks</li> + <li> + <!-- Inner menu: contains the tasks --> + <ul class="menu"> + <li><!-- Task item --> + <a href="#"> + <!-- Task title and progress text --> + <h3> + Design some buttons + <small class="pull-right">20%</small> + </h3> + <!-- The progress bar --> + <div class="progress xs"> + <!-- Change the css width attribute to simulate progress --> + <div class="progress-bar progress-bar-aqua" style="width: 20%" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100"> + <span class="sr-only">20% Complete</span> + </div> + </div> + </a> + </li><!-- end task item --> + </ul> + </li> + <li class="footer"> + <a href="#">View all tasks</a> + </li> + </ul> + </li> + <!-- User Account Menu --> + <li class="dropdown user user-menu"> + <!-- Menu Toggle Button --> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"> + <!-- The user image in the navbar--> + <img src="dist/img/user2-160x160.jpg" class="user-image" alt="User Image"> + <!-- hidden-xs hides the username on small devices so only the image appears. --> + <span class="hidden-xs">Alexander Pierce</span> + </a> + <ul class="dropdown-menu"> + <!-- The user image in the menu --> + <li class="user-header"> + <img src="dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + <p> + Alexander Pierce - Web Developer + <small>Member since Nov. 2012</small> + </p> + </li> + <!-- Menu Body --> + <li class="user-body"> + <div class="col-xs-4 text-center"> + <a href="#">Followers</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Sales</a> + </div> + <div class="col-xs-4 text-center"> + <a href="#">Friends</a> + </div> + </li> + <!-- Menu Footer--> + <li class="user-footer"> + <div class="pull-left"> + <a href="#" class="btn btn-default btn-flat">Profile</a> + </div> + <div class="pull-right"> + <a href="#" class="btn btn-default btn-flat">Sign out</a> + </div> + </li> + </ul> + </li> + <!-- Control Sidebar Toggle Button --> + <li> + <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> + </li> + </ul> + </div> + </nav> + </header> + <!-- Left side column. contains the logo and sidebar --> + <aside class="main-sidebar"> + + <!-- sidebar: style can be found in sidebar.less --> + <section class="sidebar"> + + <!-- Sidebar user panel (optional) --> + <div class="user-panel"> + <div class="pull-left image"> + <img src="dist/img/user2-160x160.jpg" class="img-circle" alt="User Image"> + </div> + <div class="pull-left info"> + <p>Alexander Pierce</p> + <!-- Status --> + <a href="#"><i class="fa fa-circle text-success"></i> Online</a> + </div> + </div> + + <!-- search form (Optional) --> + <form action="#" method="get" class="sidebar-form"> + <div class="input-group"> + <input type="text" name="q" class="form-control" placeholder="Search..."> + <span class="input-group-btn"> + <button type="submit" name="search" id="search-btn" class="btn btn-flat"><i class="fa fa-search"></i></button> + </span> + </div> + </form> + <!-- /.search form --> + + <!-- Sidebar Menu --> + <ul class="sidebar-menu"> + <li class="header">HEADER</li> + <!-- Optionally, you can add icons to the links --> + <li class="active"><a href="#"><i class="fa fa-link"></i> <span>Link</span></a></li> + <li><a href="#"><i class="fa fa-link"></i> <span>Another Link</span></a></li> + <li class="treeview"> + <a href="#"><i class="fa fa-link"></i> <span>Multilevel</span> <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#">Link in level 2</a></li> + <li><a href="#">Link in level 2</a></li> + </ul> + </li> + </ul><!-- /.sidebar-menu --> + </section> + <!-- /.sidebar --> + </aside> + + <!-- Content Wrapper. Contains page content --> + <div class="content-wrapper"> + <!-- Content Header (Page header) --> + <section class="content-header"> + <h1> + Page Header + <small>Optional description</small> + </h1> + <ol class="breadcrumb"> + <li><a href="#"><i class="fa fa-dashboard"></i> Level</a></li> + <li class="active">Here</li> + </ol> + </section> + + <!-- Main content --> + <section class="content"> + + <!-- Your Page Content Here --> + + </section><!-- /.content --> + </div><!-- /.content-wrapper --> + + <!-- Main Footer --> + <footer class="main-footer"> + <!-- To the right --> + <div class="pull-right hidden-xs"> + Anything you want + </div> + <!-- Default to the left --> + <strong>Copyright &copy; 2015 <a href="#">Company</a>.</strong> All rights reserved. + </footer> + + <!-- Control Sidebar --> + <aside class="control-sidebar control-sidebar-dark"> + <!-- Create the tabs --> + <ul class="nav nav-tabs nav-justified control-sidebar-tabs"> + <li class="active"><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li> + <li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li> + </ul> + <!-- Tab panes --> + <div class="tab-content"> + <!-- Home tab content --> + <div class="tab-pane active" id="control-sidebar-home-tab"> + <h3 class="control-sidebar-heading">Recent Activity</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <i class="menu-icon fa fa-birthday-cake bg-red"></i> + <div class="menu-info"> + <h4 class="control-sidebar-subheading">Langdon's Birthday</h4> + <p>Will be 23 on April 24th</p> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + <h3 class="control-sidebar-heading">Tasks Progress</h3> + <ul class="control-sidebar-menu"> + <li> + <a href="javascript::;"> + <h4 class="control-sidebar-subheading"> + Custom Template Design + <span class="label label-danger pull-right">70%</span> + </h4> + <div class="progress progress-xxs"> + <div class="progress-bar progress-bar-danger" style="width: 70%"></div> + </div> + </a> + </li> + </ul><!-- /.control-sidebar-menu --> + + </div><!-- /.tab-pane --> + <!-- Stats tab content --> + <div class="tab-pane" id="control-sidebar-stats-tab">Stats Tab Content</div><!-- /.tab-pane --> + <!-- Settings tab content --> + <div class="tab-pane" id="control-sidebar-settings-tab"> + <form method="post"> + <h3 class="control-sidebar-heading">General Settings</h3> + <div class="form-group"> + <label class="control-sidebar-subheading"> + Report panel usage + <input type="checkbox" class="pull-right" checked> + </label> + <p> + Some information about this general settings option + </p> + </div><!-- /.form-group --> + </form> + </div><!-- /.tab-pane --> + </div> + </aside><!-- /.control-sidebar --> + <!-- Add the sidebar's background. This div must be placed + immediately after the control sidebar --> + <div class="control-sidebar-bg"></div> + </div><!-- ./wrapper --> + + <!-- REQUIRED JS SCRIPTS --> + + <!-- jQuery 2.1.4 --> + <script src="plugins/jQuery/jQuery-2.1.4.min.js"></script> + <!-- Bootstrap 3.3.5 --> + <script src="bootstrap/js/bootstrap.min.js"></script> + <!-- AdminLTE App --> + <script src="dist/js/app.min.js"></script> + + <!-- Optionally, you can add Slimscroll and FastClick plugins. + Both of these plugins are recommended to enhance the + user experience. Slimscroll is required when using the + fixed layout. --> + </body> +</html> diff --git a/theme/bootstrap/views/css/New folder/bootstrap-rtl.css b/theme/bootstrap/views/css/New folder/bootstrap-rtl.css new file mode 100644 index 0000000..33095b1 --- /dev/null +++ b/theme/bootstrap/views/css/New folder/bootstrap-rtl.css @@ -0,0 +1,1536 @@ +/******************************************************************************* + * bootstrap-rtl (Version 3.2.0-rc1) + * Author: Morteza Ansarinia <ansarinia@me.com> (http://github.com/morteza) + * Created on: June 13,2014 + * Project: bootstrap-rtl + * Copyright: See the file "LICENSE.md" for the full license governing this code. + *******************************************************************************/ + +html { + direction: rtl; +} +body { + direction: rtl; +} +.list-unstyled { + padding-right: 0; + padding-left: none; +} +.list-inline { + padding-right: 0; + padding-left: none; + margin-right: -5px; + margin-left: 0; +} +dd { + margin-right: 0; + margin-left: none; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: right; + clear: right; + text-align: left; + } + .dl-horizontal dd { + margin-right: 180px; + margin-left: 0; + } +} +blockquote { + border-right: 5px solid #eeeeee; + border-left: 0; +} +.blockquote-reverse, +blockquote.pull-left { + padding-left: 15px; + padding-right: 0; + border-left: 5px solid #eeeeee; + border-right: 0; + text-align: left; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: right; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + left: 100%; + right: auto; +} +.col-xs-pull-11 { + left: 91.66666667%; + right: auto; +} +.col-xs-pull-10 { + left: 83.33333333%; + right: auto; +} +.col-xs-pull-9 { + left: 75%; + right: auto; +} +.col-xs-pull-8 { + left: 66.66666667%; + right: auto; +} +.col-xs-pull-7 { + left: 58.33333333%; + right: auto; +} +.col-xs-pull-6 { + left: 50%; + right: auto; +} +.col-xs-pull-5 { + left: 41.66666667%; + right: auto; +} +.col-xs-pull-4 { + left: 33.33333333%; + right: auto; +} +.col-xs-pull-3 { + left: 25%; + right: auto; +} +.col-xs-pull-2 { + left: 16.66666667%; + right: auto; +} +.col-xs-pull-1 { + left: 8.33333333%; + right: auto; +} +.col-xs-pull-0 { + left: auto; + right: auto; +} +.col-xs-push-12 { + right: 100%; + left: 0; +} +.col-xs-push-11 { + right: 91.66666667%; + left: 0; +} +.col-xs-push-10 { + right: 83.33333333%; + left: 0; +} +.col-xs-push-9 { + right: 75%; + left: 0; +} +.col-xs-push-8 { + right: 66.66666667%; + left: 0; +} +.col-xs-push-7 { + right: 58.33333333%; + left: 0; +} +.col-xs-push-6 { + right: 50%; + left: 0; +} +.col-xs-push-5 { + right: 41.66666667%; + left: 0; +} +.col-xs-push-4 { + right: 33.33333333%; + left: 0; +} +.col-xs-push-3 { + right: 25%; + left: 0; +} +.col-xs-push-2 { + right: 16.66666667%; + left: 0; +} +.col-xs-push-1 { + right: 8.33333333%; + left: 0; +} +.col-xs-push-0 { + right: auto; + left: 0; +} +.col-xs-offset-12 { + margin-right: 100%; + margin-left: 0; +} +.col-xs-offset-11 { + margin-right: 91.66666667%; + margin-left: 0; +} +.col-xs-offset-10 { + margin-right: 83.33333333%; + margin-left: 0; +} +.col-xs-offset-9 { + margin-right: 75%; + margin-left: 0; +} +.col-xs-offset-8 { + margin-right: 66.66666667%; + margin-left: 0; +} +.col-xs-offset-7 { + margin-right: 58.33333333%; + margin-left: 0; +} +.col-xs-offset-6 { + margin-right: 50%; + margin-left: 0; +} +.col-xs-offset-5 { + margin-right: 41.66666667%; + margin-left: 0; +} +.col-xs-offset-4 { + margin-right: 33.33333333%; + margin-left: 0; +} +.col-xs-offset-3 { + margin-right: 25%; + margin-left: 0; +} +.col-xs-offset-2 { + margin-right: 16.66666667%; + margin-left: 0; +} +.col-xs-offset-1 { + margin-right: 8.33333333%; + margin-left: 0; +} +.col-xs-offset-0 { + margin-right: 0%; + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: right; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + left: 100%; + right: auto; + } + .col-sm-pull-11 { + left: 91.66666667%; + right: auto; + } + .col-sm-pull-10 { + left: 83.33333333%; + right: auto; + } + .col-sm-pull-9 { + left: 75%; + right: auto; + } + .col-sm-pull-8 { + left: 66.66666667%; + right: auto; + } + .col-sm-pull-7 { + left: 58.33333333%; + right: auto; + } + .col-sm-pull-6 { + left: 50%; + right: auto; + } + .col-sm-pull-5 { + left: 41.66666667%; + right: auto; + } + .col-sm-pull-4 { + left: 33.33333333%; + right: auto; + } + .col-sm-pull-3 { + left: 25%; + right: auto; + } + .col-sm-pull-2 { + left: 16.66666667%; + right: auto; + } + .col-sm-pull-1 { + left: 8.33333333%; + right: auto; + } + .col-sm-pull-0 { + left: auto; + right: auto; + } + .col-sm-push-12 { + right: 100%; + left: 0; + } + .col-sm-push-11 { + right: 91.66666667%; + left: 0; + } + .col-sm-push-10 { + right: 83.33333333%; + left: 0; + } + .col-sm-push-9 { + right: 75%; + left: 0; + } + .col-sm-push-8 { + right: 66.66666667%; + left: 0; + } + .col-sm-push-7 { + right: 58.33333333%; + left: 0; + } + .col-sm-push-6 { + right: 50%; + left: 0; + } + .col-sm-push-5 { + right: 41.66666667%; + left: 0; + } + .col-sm-push-4 { + right: 33.33333333%; + left: 0; + } + .col-sm-push-3 { + right: 25%; + left: 0; + } + .col-sm-push-2 { + right: 16.66666667%; + left: 0; + } + .col-sm-push-1 { + right: 8.33333333%; + left: 0; + } + .col-sm-push-0 { + right: auto; + left: 0; + } + .col-sm-offset-12 { + margin-right: 100%; + margin-left: 0; + } + .col-sm-offset-11 { + margin-right: 91.66666667%; + margin-left: 0; + } + .col-sm-offset-10 { + margin-right: 83.33333333%; + margin-left: 0; + } + .col-sm-offset-9 { + margin-right: 75%; + margin-left: 0; + } + .col-sm-offset-8 { + margin-right: 66.66666667%; + margin-left: 0; + } + .col-sm-offset-7 { + margin-right: 58.33333333%; + margin-left: 0; + } + .col-sm-offset-6 { + margin-right: 50%; + margin-left: 0; + } + .col-sm-offset-5 { + margin-right: 41.66666667%; + margin-left: 0; + } + .col-sm-offset-4 { + margin-right: 33.33333333%; + margin-left: 0; + } + .col-sm-offset-3 { + margin-right: 25%; + margin-left: 0; + } + .col-sm-offset-2 { + margin-right: 16.66666667%; + margin-left: 0; + } + .col-sm-offset-1 { + margin-right: 8.33333333%; + margin-left: 0; + } + .col-sm-offset-0 { + margin-right: 0%; + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: right; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + left: 100%; + right: auto; + } + .col-md-pull-11 { + left: 91.66666667%; + right: auto; + } + .col-md-pull-10 { + left: 83.33333333%; + right: auto; + } + .col-md-pull-9 { + left: 75%; + right: auto; + } + .col-md-pull-8 { + left: 66.66666667%; + right: auto; + } + .col-md-pull-7 { + left: 58.33333333%; + right: auto; + } + .col-md-pull-6 { + left: 50%; + right: auto; + } + .col-md-pull-5 { + left: 41.66666667%; + right: auto; + } + .col-md-pull-4 { + left: 33.33333333%; + right: auto; + } + .col-md-pull-3 { + left: 25%; + right: auto; + } + .col-md-pull-2 { + left: 16.66666667%; + right: auto; + } + .col-md-pull-1 { + left: 8.33333333%; + right: auto; + } + .col-md-pull-0 { + left: auto; + right: auto; + } + .col-md-push-12 { + right: 100%; + left: 0; + } + .col-md-push-11 { + right: 91.66666667%; + left: 0; + } + .col-md-push-10 { + right: 83.33333333%; + left: 0; + } + .col-md-push-9 { + right: 75%; + left: 0; + } + .col-md-push-8 { + right: 66.66666667%; + left: 0; + } + .col-md-push-7 { + right: 58.33333333%; + left: 0; + } + .col-md-push-6 { + right: 50%; + left: 0; + } + .col-md-push-5 { + right: 41.66666667%; + left: 0; + } + .col-md-push-4 { + right: 33.33333333%; + left: 0; + } + .col-md-push-3 { + right: 25%; + left: 0; + } + .col-md-push-2 { + right: 16.66666667%; + left: 0; + } + .col-md-push-1 { + right: 8.33333333%; + left: 0; + } + .col-md-push-0 { + right: auto; + left: 0; + } + .col-md-offset-12 { + margin-right: 100%; + margin-left: 0; + } + .col-md-offset-11 { + margin-right: 91.66666667%; + margin-left: 0; + } + .col-md-offset-10 { + margin-right: 83.33333333%; + margin-left: 0; + } + .col-md-offset-9 { + margin-right: 75%; + margin-left: 0; + } + .col-md-offset-8 { + margin-right: 66.66666667%; + margin-left: 0; + } + .col-md-offset-7 { + margin-right: 58.33333333%; + margin-left: 0; + } + .col-md-offset-6 { + margin-right: 50%; + margin-left: 0; + } + .col-md-offset-5 { + margin-right: 41.66666667%; + margin-left: 0; + } + .col-md-offset-4 { + margin-right: 33.33333333%; + margin-left: 0; + } + .col-md-offset-3 { + margin-right: 25%; + margin-left: 0; + } + .col-md-offset-2 { + margin-right: 16.66666667%; + margin-left: 0; + } + .col-md-offset-1 { + margin-right: 8.33333333%; + margin-left: 0; + } + .col-md-offset-0 { + margin-right: 0%; + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: right; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + left: 100%; + right: auto; + } + .col-lg-pull-11 { + left: 91.66666667%; + right: auto; + } + .col-lg-pull-10 { + left: 83.33333333%; + right: auto; + } + .col-lg-pull-9 { + left: 75%; + right: auto; + } + .col-lg-pull-8 { + left: 66.66666667%; + right: auto; + } + .col-lg-pull-7 { + left: 58.33333333%; + right: auto; + } + .col-lg-pull-6 { + left: 50%; + right: auto; + } + .col-lg-pull-5 { + left: 41.66666667%; + right: auto; + } + .col-lg-pull-4 { + left: 33.33333333%; + right: auto; + } + .col-lg-pull-3 { + left: 25%; + right: auto; + } + .col-lg-pull-2 { + left: 16.66666667%; + right: auto; + } + .col-lg-pull-1 { + left: 8.33333333%; + right: auto; + } + .col-lg-pull-0 { + left: auto; + right: auto; + } + .col-lg-push-12 { + right: 100%; + left: 0; + } + .col-lg-push-11 { + right: 91.66666667%; + left: 0; + } + .col-lg-push-10 { + right: 83.33333333%; + left: 0; + } + .col-lg-push-9 { + right: 75%; + left: 0; + } + .col-lg-push-8 { + right: 66.66666667%; + left: 0; + } + .col-lg-push-7 { + right: 58.33333333%; + left: 0; + } + .col-lg-push-6 { + right: 50%; + left: 0; + } + .col-lg-push-5 { + right: 41.66666667%; + left: 0; + } + .col-lg-push-4 { + right: 33.33333333%; + left: 0; + } + .col-lg-push-3 { + right: 25%; + left: 0; + } + .col-lg-push-2 { + right: 16.66666667%; + left: 0; + } + .col-lg-push-1 { + right: 8.33333333%; + left: 0; + } + .col-lg-push-0 { + right: auto; + left: 0; + } + .col-lg-offset-12 { + margin-right: 100%; + margin-left: 0; + } + .col-lg-offset-11 { + margin-right: 91.66666667%; + margin-left: 0; + } + .col-lg-offset-10 { + margin-right: 83.33333333%; + margin-left: 0; + } + .col-lg-offset-9 { + margin-right: 75%; + margin-left: 0; + } + .col-lg-offset-8 { + margin-right: 66.66666667%; + margin-left: 0; + } + .col-lg-offset-7 { + margin-right: 58.33333333%; + margin-left: 0; + } + .col-lg-offset-6 { + margin-right: 50%; + margin-left: 0; + } + .col-lg-offset-5 { + margin-right: 41.66666667%; + margin-left: 0; + } + .col-lg-offset-4 { + margin-right: 33.33333333%; + margin-left: 0; + } + .col-lg-offset-3 { + margin-right: 25%; + margin-left: 0; + } + .col-lg-offset-2 { + margin-right: 16.66666667%; + margin-left: 0; + } + .col-lg-offset-1 { + margin-right: 8.33333333%; + margin-left: 0; + } + .col-lg-offset-0 { + margin-right: 0%; + margin-left: 0; + } +} +th { + text-align: right; +} +@media screen and (max-width: 767px) { + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-right: 0; + border-left: auto; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-left: 0; + border-right: auto; + } +} +.radio label, +.checkbox label { + padding-right: 20px; + padding-left: auto; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + float: right; + margin-right: 20px; + margin-left: 0; +} +.radio-inline, +.checkbox-inline { + padding-right: 20px; + padding-left: 0; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-right: 10px; + margin-left: 0; +} +.has-feedback .form-control { + padding-left: 42.5px; + padding-right: auto; +} +.form-control-feedback { + left: 0; + right: auto; +} +@media (min-width: 768px) { + .form-inline .radio, + .form-inline .checkbox { + padding-right: 0; + padding-left: auto; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + margin-right: 0; + margin-left: auto; + } +} +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: left; + } +} +.form-horizontal .has-feedback .form-control-feedback { + left: 15px; + right: auto; +} +.caret { + margin-right: 2px; + margin-left: 0; +} +.dropdown-menu { + right: 0; + left: auto; + float: left; + text-align: right; +} +.dropdown-menu.pull-left { + left: 0; + float: right; + right: auto; +} +.pull-left > .dropdown-menu { + left: 0; + float: right; + right: auto; +} +.navbar-nav.pull-left > li > .dropdown-menu, +.navbar-nav > li > .dropdown-menu.pull-left { + right: auto; + left: 0; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + float: right; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-right: -1px; + margin-left: 0px; +} +.btn-toolbar { + margin-right: -5px; + margin-left: 0px; +} +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: right; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-right: 5px; + margin-left: 0px; +} +.btn-group > .btn:first-child { + margin-right: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn-group { + float: right; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child > .btn:last-child, +.btn-group > .btn-group:first-child > .dropdown-toggle { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group > .btn-group:last-child > .btn:first-child { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn .caret { + margin-right: 0; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-right: 0; +} +.input-group .form-control { + float: right; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.input-group-addon:first-child { + border-right: 1px solid #cccccc; + border-left: 0px; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.input-group-addon:last-child { + border-left: 1px solid #cccccc; + border-right: 0px; +} +.input-group-btn > .btn + .btn { + margin-right: -1px; + margin-left: auto; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-left: -1px; + margin-right: auto; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + margin-right: -1px; + margin-left: auto; +} +.nav { + padding-right: 0; + padding-left: auto; +} +.nav-tabs > li { + float: right; +} +.nav-tabs > li > a { + margin-left: auto; + margin-right: -2px; + border-radius: 4px 4px 0 0; +} +.nav-pills > li { + float: right; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-right: 2px; + margin-left: auto; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-right: 0; + margin-left: auto; +} +.nav-justified > .dropdown .dropdown-menu { + right: auto; +} +.nav-tabs-justified > li > a { + margin-left: 0; + margin-right: auto; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-radius: 4px 4px 0 0; + } +} +@media (min-width: 768px) { + .navbar-header { + float: right; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; +} +.navbar-brand { + float: right; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-right: -15px; + margin-left: auto; + } +} +.navbar-toggle { + float: left; + margin-left: 15px; + margin-right: auto; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 25px 5px 15px; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: right; + } + .navbar-nav > li { + float: right; + } + .navbar-nav.navbar-right:last-child { + margin-left: -15px; + margin-right: auto; + } + .navbar-nav.navbar-right.flip { + float: left !important; + } + .navbar-nav.navbar-right .dropdown-menu { + left: 0; + right: auto; + } +} +@media (min-width: 768px) { + .navbar-text { + float: right; + } + .navbar-text.navbar-right:last-child { + margin-left: 0; + margin-right: auto; + } +} +.pagination { + padding-right: 0; +} +.pagination > li > a, +.pagination > li > span { + float: right; + margin-right: -1px; + margin-left: 0px; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + margin-right: -1px; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.pager { + padding-right: 0; + padding-left: none; +} +.pager .next > a, +.pager .next > span { + float: left; +} +.pager .previous > a, +.pager .previous > span { + float: right; +} +.nav-pills > li > a > .badge { + margin-left: 0px; + margin-right: 3px; +} +.alert-dismissable { + padding-left: 35px; + padding-right: 15px; +} +.alert-dismissable .close { + top: -2px; + right: 0; + left: 21; +} +.progress-bar { + float: right; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media > .pull-left { + margin-right: 10px; +} +.media > .pull-left.flip { + margin-right: 0; + margin-left: 10px; +} +.media > .pull-right { + margin-left: 10px; +} +.media > .pull-right.flip { + margin-left: 0; + margin-right: 10px; +} +.media-list { + padding-right: 0; + padding-left: auto; + list-style: none; +} +.list-group { + padding-right: 0; + padding-left: none; +} +.list-group-item > .badge { + float: left; +} +.list-group-item > .badge + .badge { + margin-ight: 5px; + margin-left: 0; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-right-radius: 3px; + border-top-left-radius: 0; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-left-radius: 3px; + border-top-right-radius: 0; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; + border-top-right-radius: 0; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; + border-top-left-radius: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-right: 0; + border-left: none; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: none; + border-left: 0; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object { + right: 0; + left: none; +} +.close { + float: left; +} +.modal-footer { + text-align: left; +} +.modal-footer .btn + .btn { + margin-left: 0; + margin-right: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-right: -1px; + margin-left: 0; +} +.modal-footer .btn-block + .btn-block { + margin-right: 0; + margin-left: none; +} +.popover { + right: 0; + left: none; + text-align: right; +} +.popover.top > .arrow { + right: 50%; + left: none; + margin-right: -11px; + margin-left: 0; +} +.popover.top > .arrow:after { + margin-right: -10px; + margin-left: 0; +} +.carousel-inner > .item { + -webkit-transition: 0.6s ease-in-out right; + -o-transition: 0.6s ease-in-out right; + transition: 0.6s ease-in-out right; +} +.carousel-inner > .active { + right: 0; +} +.carousel-inner > .next { + right: 100%; + left: 0; +} +.carousel-inner > .prev { + right: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + right: 0; +} +.carousel-inner > .active.right { + left: -100%; +} +.carousel-inner > .active.left { + right: 100%; +} +.carousel-control { + right: 0; + bottom: 0; +} +.carousel-control.left { + right: auto; + left: 0; + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0%), color-stop(rgba(0, 0, 0, 0.0001) 100%)); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} +.carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0%), color-stop(rgba(0, 0, 0, 0.5) 100%)); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + right: auto; + margin-right: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + left: auto; + margin-left: -10px; +} +.carousel-indicators { + right: 50%; + left: 0; + margin-right: -30%; + margin-left: 0; + padding-left: 0; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: 0; + margin-right: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-left: 0; + margin-right: -15px; + } + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } +} +.pull-right.flip { + float: left !important; +} +.pull-left.flip { + float: right !important; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +/*# sourceMappingURL=bootstrap-rtl.css.map */ \ No newline at end of file diff --git a/theme/bootstrap/views/css/New folder/bootstrap-rtl.min.css b/theme/bootstrap/views/css/New folder/bootstrap-rtl.min.css new file mode 100644 index 0000000..04e881e --- /dev/null +++ b/theme/bootstrap/views/css/New folder/bootstrap-rtl.min.css @@ -0,0 +1,9 @@ +/******************************************************************************* + * bootstrap-rtl (Version 3.2.0-rc1) + * Author: Morteza Ansarinia <ansarinia@me.com> (http://github.com/morteza) + * Created on: June 13,2014 + * Project: bootstrap-rtl + * Copyright: See the file "LICENSE.md" for the full license governing this code. + *******************************************************************************/ + +html{direction:rtl}body{direction:rtl}.list-unstyled{padding-right:0;padding-left:none}.list-inline{padding-right:0;padding-left:none;margin-right:-5px;margin-left:0}dd{margin-right:0;margin-left:none}@media (min-width:768px){.dl-horizontal dt{float:right;clear:right;text-align:left}.dl-horizontal dd{margin-right:180px;margin-left:0}}blockquote{border-right:5px solid #eee;border-left:0}.blockquote-reverse,blockquote.pull-left{padding-left:15px;padding-right:0;border-left:5px solid #eee;border-right:0;text-align:left}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:right}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{left:100%;right:auto}.col-xs-pull-11{left:91.66666667%;right:auto}.col-xs-pull-10{left:83.33333333%;right:auto}.col-xs-pull-9{left:75%;right:auto}.col-xs-pull-8{left:66.66666667%;right:auto}.col-xs-pull-7{left:58.33333333%;right:auto}.col-xs-pull-6{left:50%;right:auto}.col-xs-pull-5{left:41.66666667%;right:auto}.col-xs-pull-4{left:33.33333333%;right:auto}.col-xs-pull-3{left:25%;right:auto}.col-xs-pull-2{left:16.66666667%;right:auto}.col-xs-pull-1{left:8.33333333%;right:auto}.col-xs-pull-0{left:auto;right:auto}.col-xs-push-12{right:100%;left:0}.col-xs-push-11{right:91.66666667%;left:0}.col-xs-push-10{right:83.33333333%;left:0}.col-xs-push-9{right:75%;left:0}.col-xs-push-8{right:66.66666667%;left:0}.col-xs-push-7{right:58.33333333%;left:0}.col-xs-push-6{right:50%;left:0}.col-xs-push-5{right:41.66666667%;left:0}.col-xs-push-4{right:33.33333333%;left:0}.col-xs-push-3{right:25%;left:0}.col-xs-push-2{right:16.66666667%;left:0}.col-xs-push-1{right:8.33333333%;left:0}.col-xs-push-0{right:auto;left:0}.col-xs-offset-12{margin-right:100%;margin-left:0}.col-xs-offset-11{margin-right:91.66666667%;margin-left:0}.col-xs-offset-10{margin-right:83.33333333%;margin-left:0}.col-xs-offset-9{margin-right:75%;margin-left:0}.col-xs-offset-8{margin-right:66.66666667%;margin-left:0}.col-xs-offset-7{margin-right:58.33333333%;margin-left:0}.col-xs-offset-6{margin-right:50%;margin-left:0}.col-xs-offset-5{margin-right:41.66666667%;margin-left:0}.col-xs-offset-4{margin-right:33.33333333%;margin-left:0}.col-xs-offset-3{margin-right:25%;margin-left:0}.col-xs-offset-2{margin-right:16.66666667%;margin-left:0}.col-xs-offset-1{margin-right:8.33333333%;margin-left:0}.col-xs-offset-0{margin-right:0;margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:right}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{left:100%;right:auto}.col-sm-pull-11{left:91.66666667%;right:auto}.col-sm-pull-10{left:83.33333333%;right:auto}.col-sm-pull-9{left:75%;right:auto}.col-sm-pull-8{left:66.66666667%;right:auto}.col-sm-pull-7{left:58.33333333%;right:auto}.col-sm-pull-6{left:50%;right:auto}.col-sm-pull-5{left:41.66666667%;right:auto}.col-sm-pull-4{left:33.33333333%;right:auto}.col-sm-pull-3{left:25%;right:auto}.col-sm-pull-2{left:16.66666667%;right:auto}.col-sm-pull-1{left:8.33333333%;right:auto}.col-sm-pull-0{left:auto;right:auto}.col-sm-push-12{right:100%;left:0}.col-sm-push-11{right:91.66666667%;left:0}.col-sm-push-10{right:83.33333333%;left:0}.col-sm-push-9{right:75%;left:0}.col-sm-push-8{right:66.66666667%;left:0}.col-sm-push-7{right:58.33333333%;left:0}.col-sm-push-6{right:50%;left:0}.col-sm-push-5{right:41.66666667%;left:0}.col-sm-push-4{right:33.33333333%;left:0}.col-sm-push-3{right:25%;left:0}.col-sm-push-2{right:16.66666667%;left:0}.col-sm-push-1{right:8.33333333%;left:0}.col-sm-push-0{right:auto;left:0}.col-sm-offset-12{margin-right:100%;margin-left:0}.col-sm-offset-11{margin-right:91.66666667%;margin-left:0}.col-sm-offset-10{margin-right:83.33333333%;margin-left:0}.col-sm-offset-9{margin-right:75%;margin-left:0}.col-sm-offset-8{margin-right:66.66666667%;margin-left:0}.col-sm-offset-7{margin-right:58.33333333%;margin-left:0}.col-sm-offset-6{margin-right:50%;margin-left:0}.col-sm-offset-5{margin-right:41.66666667%;margin-left:0}.col-sm-offset-4{margin-right:33.33333333%;margin-left:0}.col-sm-offset-3{margin-right:25%;margin-left:0}.col-sm-offset-2{margin-right:16.66666667%;margin-left:0}.col-sm-offset-1{margin-right:8.33333333%;margin-left:0}.col-sm-offset-0{margin-right:0;margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:right}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{left:100%;right:auto}.col-md-pull-11{left:91.66666667%;right:auto}.col-md-pull-10{left:83.33333333%;right:auto}.col-md-pull-9{left:75%;right:auto}.col-md-pull-8{left:66.66666667%;right:auto}.col-md-pull-7{left:58.33333333%;right:auto}.col-md-pull-6{left:50%;right:auto}.col-md-pull-5{left:41.66666667%;right:auto}.col-md-pull-4{left:33.33333333%;right:auto}.col-md-pull-3{left:25%;right:auto}.col-md-pull-2{left:16.66666667%;right:auto}.col-md-pull-1{left:8.33333333%;right:auto}.col-md-pull-0{left:auto;right:auto}.col-md-push-12{right:100%;left:0}.col-md-push-11{right:91.66666667%;left:0}.col-md-push-10{right:83.33333333%;left:0}.col-md-push-9{right:75%;left:0}.col-md-push-8{right:66.66666667%;left:0}.col-md-push-7{right:58.33333333%;left:0}.col-md-push-6{right:50%;left:0}.col-md-push-5{right:41.66666667%;left:0}.col-md-push-4{right:33.33333333%;left:0}.col-md-push-3{right:25%;left:0}.col-md-push-2{right:16.66666667%;left:0}.col-md-push-1{right:8.33333333%;left:0}.col-md-push-0{right:auto;left:0}.col-md-offset-12{margin-right:100%;margin-left:0}.col-md-offset-11{margin-right:91.66666667%;margin-left:0}.col-md-offset-10{margin-right:83.33333333%;margin-left:0}.col-md-offset-9{margin-right:75%;margin-left:0}.col-md-offset-8{margin-right:66.66666667%;margin-left:0}.col-md-offset-7{margin-right:58.33333333%;margin-left:0}.col-md-offset-6{margin-right:50%;margin-left:0}.col-md-offset-5{margin-right:41.66666667%;margin-left:0}.col-md-offset-4{margin-right:33.33333333%;margin-left:0}.col-md-offset-3{margin-right:25%;margin-left:0}.col-md-offset-2{margin-right:16.66666667%;margin-left:0}.col-md-offset-1{margin-right:8.33333333%;margin-left:0}.col-md-offset-0{margin-right:0;margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:right}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{left:100%;right:auto}.col-lg-pull-11{left:91.66666667%;right:auto}.col-lg-pull-10{left:83.33333333%;right:auto}.col-lg-pull-9{left:75%;right:auto}.col-lg-pull-8{left:66.66666667%;right:auto}.col-lg-pull-7{left:58.33333333%;right:auto}.col-lg-pull-6{left:50%;right:auto}.col-lg-pull-5{left:41.66666667%;right:auto}.col-lg-pull-4{left:33.33333333%;right:auto}.col-lg-pull-3{left:25%;right:auto}.col-lg-pull-2{left:16.66666667%;right:auto}.col-lg-pull-1{left:8.33333333%;right:auto}.col-lg-pull-0{left:auto;right:auto}.col-lg-push-12{right:100%;left:0}.col-lg-push-11{right:91.66666667%;left:0}.col-lg-push-10{right:83.33333333%;left:0}.col-lg-push-9{right:75%;left:0}.col-lg-push-8{right:66.66666667%;left:0}.col-lg-push-7{right:58.33333333%;left:0}.col-lg-push-6{right:50%;left:0}.col-lg-push-5{right:41.66666667%;left:0}.col-lg-push-4{right:33.33333333%;left:0}.col-lg-push-3{right:25%;left:0}.col-lg-push-2{right:16.66666667%;left:0}.col-lg-push-1{right:8.33333333%;left:0}.col-lg-push-0{right:auto;left:0}.col-lg-offset-12{margin-right:100%;margin-left:0}.col-lg-offset-11{margin-right:91.66666667%;margin-left:0}.col-lg-offset-10{margin-right:83.33333333%;margin-left:0}.col-lg-offset-9{margin-right:75%;margin-left:0}.col-lg-offset-8{margin-right:66.66666667%;margin-left:0}.col-lg-offset-7{margin-right:58.33333333%;margin-left:0}.col-lg-offset-6{margin-right:50%;margin-left:0}.col-lg-offset-5{margin-right:41.66666667%;margin-left:0}.col-lg-offset-4{margin-right:33.33333333%;margin-left:0}.col-lg-offset-3{margin-right:25%;margin-left:0}.col-lg-offset-2{margin-right:16.66666667%;margin-left:0}.col-lg-offset-1{margin-right:8.33333333%;margin-left:0}.col-lg-offset-0{margin-right:0;margin-left:0}}th{text-align:right}@media screen and (max-width:767px){.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-right:0;border-left:auto}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-left:0;border-right:auto}}.radio label,.checkbox label{padding-right:20px;padding-left:auto}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:right;margin-right:20px;margin-left:0}.radio-inline,.checkbox-inline{padding-right:20px;padding-left:0}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-right:10px;margin-left:0}.has-feedback .form-control{padding-left:42.5px;padding-right:auto}.form-control-feedback{left:0;right:auto}@media (min-width:768px){.form-inline .radio,.form-inline .checkbox{padding-right:0;padding-left:auto}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{margin-right:0;margin-left:auto}}@media (min-width:768px){.form-horizontal .control-label{text-align:left}}.form-horizontal .has-feedback .form-control-feedback{left:15px;right:auto}.caret{margin-right:2px;margin-left:0}.dropdown-menu{right:0;left:auto;float:left;text-align:right}.dropdown-menu.pull-left{left:0;float:right;right:auto}.pull-left>.dropdown-menu{left:0;float:right;right:auto}.navbar-nav.pull-left>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-left{right:auto;left:0}.btn-group>.btn,.btn-group-vertical>.btn{float:right}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-right:-1px;margin-left:0}.btn-toolbar{margin-right:-5px;margin-left:0}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:right}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-right:5px;margin-left:0}.btn-group>.btn:first-child{margin-right:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group{float:right}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-right-radius:0;border-top-right-radius:0}.btn .caret{margin-right:0}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-right:0}.input-group .form-control{float:right}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:first-child{border-right:1px solid #ccc;border-left:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:last-child{border-left:1px solid #ccc;border-right:0}.input-group-btn>.btn+.btn{margin-right:-1px;margin-left:auto}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-left:-1px;margin-right:auto}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-right:-1px;margin-left:auto}.nav{padding-right:0;padding-left:auto}.nav-tabs>li{float:right}.nav-tabs>li>a{margin-left:auto;margin-right:-2px;border-radius:4px 4px 0 0}.nav-pills>li{float:right}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-right:2px;margin-left:auto}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-right:0;margin-left:auto}.nav-justified>.dropdown .dropdown-menu{right:auto}.nav-tabs-justified>li>a{margin-left:0;margin-right:auto}@media (min-width:768px){.nav-tabs-justified>li>a{border-radius:4px 4px 0 0}}@media (min-width:768px){.navbar-header{float:right}}.navbar-collapse{padding-right:15px;padding-left:15px}.navbar-brand{float:right}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-right:-15px;margin-left:auto}}.navbar-toggle{float:left;margin-left:15px;margin-right:auto}@media (max-width:767px){.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 25px 5px 15px}}@media (min-width:768px){.navbar-nav{float:right}.navbar-nav>li{float:right}.navbar-nav.navbar-right:last-child{margin-left:-15px;margin-right:auto}.navbar-nav.navbar-right.flip{float:left!important}.navbar-nav.navbar-right .dropdown-menu{left:0;right:auto}}@media (min-width:768px){.navbar-text{float:right}.navbar-text.navbar-right:last-child{margin-left:0;margin-right:auto}}.pagination{padding-right:0}.pagination>li>a,.pagination>li>span{float:right;margin-right:-1px;margin-left:0}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-left-radius:0;border-top-left-radius:0}.pagination>li:last-child>a,.pagination>li:last-child>span{margin-right:-1px;border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-top-right-radius:0}.pager{padding-right:0;padding-left:none}.pager .next>a,.pager .next>span{float:left}.pager .previous>a,.pager .previous>span{float:right}.nav-pills>li>a>.badge{margin-left:0;margin-right:3px}.alert-dismissable{padding-left:35px;padding-right:15px}.alert-dismissable .close{top:-2px;right:0;left:21}.progress-bar{float:right}.media,.media-body{overflow:hidden;zoom:1}.media>.pull-left{margin-right:10px}.media>.pull-left.flip{margin-right:0;margin-left:10px}.media>.pull-right{margin-left:10px}.media>.pull-right.flip{margin-left:0;margin-right:10px}.media-list{padding-right:0;padding-left:auto;list-style:none}.list-group{padding-right:0;padding-left:none}.list-group-item>.badge{float:left}.list-group-item>.badge+.badge{margin-ight:5px;margin-left:0}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-right-radius:3px;border-top-left-radius:0}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-left-radius:3px;border-top-right-radius:0}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px;border-top-right-radius:0}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px;border-top-left-radius:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-right:0;border-left:none}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:none;border-left:0}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object{right:0;left:none}.close{float:left}.modal-footer{text-align:left}.modal-footer .btn+.btn{margin-left:0;margin-right:5px}.modal-footer .btn-group .btn+.btn{margin-right:-1px;margin-left:0}.modal-footer .btn-block+.btn-block{margin-right:0;margin-left:none}.popover{right:0;left:none;text-align:right}.popover.top>.arrow{right:50%;left:none;margin-right:-11px;margin-left:0}.popover.top>.arrow:after{margin-right:-10px;margin-left:0}.carousel-inner>.item{-webkit-transition:.6s ease-in-out right;-o-transition:.6s ease-in-out right;transition:.6s ease-in-out right}.carousel-inner>.active{right:0}.carousel-inner>.next{right:100%;left:0}.carousel-inner>.prev{right:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{right:0}.carousel-inner>.active.right{left:-100%}.carousel-inner>.active.left{right:100%}.carousel-control{right:0;bottom:0}.carousel-control.left{right:auto;left:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5)0),color-stop(rgba(0,0,0,.0001)100%));background-image:-o-linear-gradient(left,rgba(0,0,0,.5)0,rgba(0,0,0,.0001)100%);background-image:linear-gradient(to right,rgba(0,0,0,.5)0,rgba(0,0,0,.0001)100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001)0),color-stop(rgba(0,0,0,.5)100%));background-image:-o-linear-gradient(left,rgba(0,0,0,.0001)0,rgba(0,0,0,.5)100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001)0,rgba(0,0,0,.5)100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;right:auto;margin-right:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;left:auto;margin-left:-10px}.carousel-indicators{right:50%;left:0;margin-right:-30%;margin-left:0;padding-left:0}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:0;margin-right:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-left:0;margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}}.pull-right.flip{float:left!important}.pull-left.flip{float:right!important}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442} \ No newline at end of file diff --git a/theme/bootstrap/views/css/New folder/bootstrap-theme.css b/theme/bootstrap/views/css/New folder/bootstrap-theme.css new file mode 100644 index 0000000..c19cd5c --- /dev/null +++ b/theme/bootstrap/views/css/New folder/bootstrap-theme.css @@ -0,0 +1,587 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +.btn-default, +.btn-primary, +.btn-success, +.btn-info, +.btn-warning, +.btn-danger { + text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); +} +.btn-default:active, +.btn-primary:active, +.btn-success:active, +.btn-info:active, +.btn-warning:active, +.btn-danger:active, +.btn-default.active, +.btn-primary.active, +.btn-success.active, +.btn-info.active, +.btn-warning.active, +.btn-danger.active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-default.disabled, +.btn-primary.disabled, +.btn-success.disabled, +.btn-info.disabled, +.btn-warning.disabled, +.btn-danger.disabled, +.btn-default[disabled], +.btn-primary[disabled], +.btn-success[disabled], +.btn-info[disabled], +.btn-warning[disabled], +.btn-danger[disabled], +fieldset[disabled] .btn-default, +fieldset[disabled] .btn-primary, +fieldset[disabled] .btn-success, +fieldset[disabled] .btn-info, +fieldset[disabled] .btn-warning, +fieldset[disabled] .btn-danger { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default .badge, +.btn-primary .badge, +.btn-success .badge, +.btn-info .badge, +.btn-warning .badge, +.btn-danger .badge { + text-shadow: none; +} +.btn:active, +.btn.active { + background-image: none; +} +.btn-default { + text-shadow: 0 1px 0 #fff; + background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); + background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #dbdbdb; + border-color: #ccc; +} +.btn-default:hover, +.btn-default:focus { + background-color: #e0e0e0; + background-position: 0 -15px; +} +.btn-default:active, +.btn-default.active { + background-color: #e0e0e0; + border-color: #dbdbdb; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #e0e0e0; + background-image: none; +} +.btn-primary { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); + background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #245580; +} +.btn-primary:hover, +.btn-primary:focus { + background-color: #265a88; + background-position: 0 -15px; +} +.btn-primary:active, +.btn-primary.active { + background-color: #265a88; + border-color: #245580; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #265a88; + background-image: none; +} +.btn-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #3e8f3e; +} +.btn-success:hover, +.btn-success:focus { + background-color: #419641; + background-position: 0 -15px; +} +.btn-success:active, +.btn-success.active { + background-color: #419641; + border-color: #3e8f3e; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #419641; + background-image: none; +} +.btn-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #28a4c9; +} +.btn-info:hover, +.btn-info:focus { + background-color: #2aabd2; + background-position: 0 -15px; +} +.btn-info:active, +.btn-info.active { + background-color: #2aabd2; + border-color: #28a4c9; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #2aabd2; + background-image: none; +} +.btn-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #e38d13; +} +.btn-warning:hover, +.btn-warning:focus { + background-color: #eb9316; + background-position: 0 -15px; +} +.btn-warning:active, +.btn-warning.active { + background-color: #eb9316; + border-color: #e38d13; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #eb9316; + background-image: none; +} +.btn-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #b92c28; +} +.btn-danger:hover, +.btn-danger:focus { + background-color: #c12e2a; + background-position: 0 -15px; +} +.btn-danger:active, +.btn-danger.active { + background-color: #c12e2a; + border-color: #b92c28; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #c12e2a; + background-image: none; +} +.thumbnail, +.img-thumbnail { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + background-color: #e8e8e8; + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + background-color: #2e6da4; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; +} +.navbar-default { + background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); + background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); + background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); +} +.navbar-brand, +.navbar-nav > li > a { + text-shadow: 0 1px 0 rgba(255, 255, 255, .25); +} +.navbar-inverse { + background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); + background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-radius: 4px; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); + background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); +} +.navbar-inverse .navbar-brand, +.navbar-inverse .navbar-nav > li > a { + text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); +} +.navbar-static-top, +.navbar-fixed-top, +.navbar-fixed-bottom { + border-radius: 0; +} +@media (max-width: 767px) { + .navbar .navbar-nav .open .dropdown-menu > .active > a, + .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; + } +} +.alert { + text-shadow: 0 1px 0 rgba(255, 255, 255, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); +} +.alert-success { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); + background-repeat: repeat-x; + border-color: #b2dba1; +} +.alert-info { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); + background-repeat: repeat-x; + border-color: #9acfea; +} +.alert-warning { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); + background-repeat: repeat-x; + border-color: #f5e79e; +} +.alert-danger { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); + background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); + background-repeat: repeat-x; + border-color: #dca7a7; +} +.progress { + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); + background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.list-group { + border-radius: 4px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + text-shadow: 0 -1px 0 #286090; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); + background-repeat: repeat-x; + border-color: #2b669a; +} +.list-group-item.active .badge, +.list-group-item.active:hover .badge, +.list-group-item.active:focus .badge { + text-shadow: none; +} +.panel { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: 0 1px 2px rgba(0, 0, 0, .05); +} +.panel-default > .panel-heading { + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.panel-primary > .panel-heading { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; +} +.panel-success > .panel-heading { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); + background-repeat: repeat-x; +} +.panel-info > .panel-heading { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); + background-repeat: repeat-x; +} +.panel-warning > .panel-heading { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); + background-repeat: repeat-x; +} +.panel-danger > .panel-heading { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); + background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); + background-repeat: repeat-x; +} +.well { + background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; + border-color: #dcdcdc; + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); +} +/*# sourceMappingURL=bootstrap-theme.css.map */ diff --git a/theme/bootstrap/views/css/New folder/bootstrap-theme.css.map b/theme/bootstrap/views/css/New folder/bootstrap-theme.css.map new file mode 100644 index 0000000..7535311 --- /dev/null +++ b/theme/bootstrap/views/css/New folder/bootstrap-theme.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAAA;;;;GAIG;ACeH;;;;;;EAME,yCAAA;EC2CA,4FAAA;EACQ,oFAAA;CFvDT;ACgBC;;;;;;;;;;;;ECsCA,yDAAA;EACQ,iDAAA;CFxCT;ACMC;;;;;;;;;;;;;;;;;;ECiCA,yBAAA;EACQ,iBAAA;CFnBT;AC/BD;;;;;;EAuBI,kBAAA;CDgBH;ACyBC;;EAEE,uBAAA;CDvBH;AC4BD;EErEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;EAuC2C,0BAAA;EAA2B,mBAAA;CDjBvE;ACpBC;;EAEE,0BAAA;EACA,6BAAA;CDsBH;ACnBC;;EAEE,0BAAA;EACA,sBAAA;CDqBH;ACfG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6BL;ACbD;EEtEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8DD;AC5DC;;EAEE,0BAAA;EACA,6BAAA;CD8DH;AC3DC;;EAEE,0BAAA;EACA,sBAAA;CD6DH;ACvDG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqEL;ACpDD;EEvEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CDsGD;ACpGC;;EAEE,0BAAA;EACA,6BAAA;CDsGH;ACnGC;;EAEE,0BAAA;EACA,sBAAA;CDqGH;AC/FG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6GL;AC3FD;EExEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8ID;AC5IC;;EAEE,0BAAA;EACA,6BAAA;CD8IH;AC3IC;;EAEE,0BAAA;EACA,sBAAA;CD6IH;ACvIG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqJL;AClID;EEzEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CDsLD;ACpLC;;EAEE,0BAAA;EACA,6BAAA;CDsLH;ACnLC;;EAEE,0BAAA;EACA,sBAAA;CDqLH;AC/KG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6LL;ACzKD;EE1EI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8ND;AC5NC;;EAEE,0BAAA;EACA,6BAAA;CD8NH;AC3NC;;EAEE,0BAAA;EACA,sBAAA;CD6NH;ACvNG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqOL;AC1MD;;EClCE,mDAAA;EACQ,2CAAA;CFgPT;ACrMD;;EE3FI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF0FF,0BAAA;CD2MD;ACzMD;;;EEhGI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFgGF,0BAAA;CD+MD;ACtMD;EE7GI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ECnBF,oEAAA;EH+HA,mBAAA;ECjEA,4FAAA;EACQ,oFAAA;CF8QT;ACjND;;EE7GI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ED2CF,yDAAA;EACQ,iDAAA;CFwRT;AC9MD;;EAEE,+CAAA;CDgND;AC5MD;EEhII,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ECnBF,oEAAA;EHkJA,mBAAA;CDkND;ACrND;;EEhII,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ED2CF,wDAAA;EACQ,gDAAA;CF+ST;AC/ND;;EAYI,0CAAA;CDuNH;AClND;;;EAGE,iBAAA;CDoND;AC/LD;EAfI;;;IAGE,YAAA;IE7JF,yEAAA;IACA,oEAAA;IACA,8FAAA;IAAA,uEAAA;IACA,4BAAA;IACA,uHAAA;GH+WD;CACF;AC3MD;EACE,8CAAA;EC3HA,2FAAA;EACQ,mFAAA;CFyUT;ACnMD;EEtLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CD+MD;AC1MD;EEvLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CDuND;ACjND;EExLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CD+ND;ACxND;EEzLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CDuOD;ACxND;EEjMI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH4ZH;ACrND;EE3MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHmaH;AC3ND;EE5MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH0aH;ACjOD;EE7MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHibH;ACvOD;EE9MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHwbH;AC7OD;EE/MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH+bH;AChPD;EElLI,8MAAA;EACA,yMAAA;EACA,sMAAA;CHqaH;AC5OD;EACE,mBAAA;EC9KA,mDAAA;EACQ,2CAAA;CF6ZT;AC7OD;;;EAGE,8BAAA;EEnOE,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFiOF,sBAAA;CDmPD;ACxPD;;;EAQI,kBAAA;CDqPH;AC3OD;ECnME,kDAAA;EACQ,0CAAA;CFibT;ACrOD;EE5PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHoeH;AC3OD;EE7PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH2eH;ACjPD;EE9PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHkfH;ACvPD;EE/PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHyfH;AC7PD;EEhQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHggBH;ACnQD;EEjQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHugBH;ACnQD;EExQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFsQF,sBAAA;EC3NA,0FAAA;EACQ,kFAAA;CFqeT","file":"bootstrap-theme.css","sourcesContent":["/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/theme/bootstrap/views/css/New folder/bootstrap-theme.min.css b/theme/bootstrap/views/css/New folder/bootstrap-theme.min.css new file mode 100644 index 0000000..61358b1 --- /dev/null +++ b/theme/bootstrap/views/css/New folder/bootstrap-theme.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} \ No newline at end of file diff --git a/theme/bootstrap/views/css/New folder/bootstrap.css b/theme/bootstrap/views/css/New folder/bootstrap.css new file mode 100644 index 0000000..680e768 --- /dev/null +++ b/theme/bootstrap/views/css/New folder/bootstrap.css @@ -0,0 +1,6800 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +mark { + color: #000; + background: #ff0; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -.5em; +} +sub { + bottom: -.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\2a"; +} +.glyphicon-plus:before { + content: "\2b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover, +a.text-primary:focus { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover, +a.text-success:focus { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover, +a.text-info:focus { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover, +a.text-danger:focus { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: .01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 14.333333px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:focus, +.btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:focus, +.btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:focus, +.btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:focus, +.btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:focus, +.btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eee; +} +.nav > li.disabled > a { + color: #777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 3; + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 2; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item, +button.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +button.list-group-item { + width: 100%; + text-align: left; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +.modal-header { + min-height: 16.42857143px; + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + filter: alpha(opacity=0); + opacity: 0; + + line-break: auto; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + + line-break: auto; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + filter: alpha(opacity=50); + opacity: .5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -10px; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -15px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/theme/bootstrap/views/css/New folder/bootstrap.css.map b/theme/bootstrap/views/css/New folder/bootstrap.css.map new file mode 100644 index 0000000..9f60ed2 --- /dev/null +++ b/theme/bootstrap/views/css/New folder/bootstrap.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,4EAA4E;ACG5E;EACE,wBAAA;EACA,2BAAA;EACA,+BAAA;CDDD;ACQD;EACE,UAAA;CDND;ACmBD;;;;;;;;;;;;;EAaE,eAAA;CDjBD;ACyBD;;;;EAIE,sBAAA;EACA,yBAAA;CDvBD;AC+BD;EACE,cAAA;EACA,UAAA;CD7BD;ACqCD;;EAEE,cAAA;CDnCD;AC6CD;EACE,8BAAA;CD3CD;ACmDD;;EAEE,WAAA;CDjDD;AC2DD;EACE,0BAAA;CDzDD;ACgED;;EAEE,kBAAA;CD9DD;ACqED;EACE,mBAAA;CDnED;AC2ED;EACE,eAAA;EACA,iBAAA;CDzED;ACgFD;EACE,iBAAA;EACA,YAAA;CD9ED;ACqFD;EACE,eAAA;CDnFD;AC0FD;;EAEE,eAAA;EACA,eAAA;EACA,mBAAA;EACA,yBAAA;CDxFD;AC2FD;EACE,YAAA;CDzFD;AC4FD;EACE,gBAAA;CD1FD;ACoGD;EACE,UAAA;CDlGD;ACyGD;EACE,iBAAA;CDvGD;ACiHD;EACE,iBAAA;CD/GD;ACsHD;EACE,gCAAA;KAAA,6BAAA;UAAA,wBAAA;EACA,UAAA;CDpHD;AC2HD;EACE,eAAA;CDzHD;ACgID;;;;EAIE,kCAAA;EACA,eAAA;CD9HD;ACgJD;;;;;EAKE,eAAA;EACA,cAAA;EACA,UAAA;CD9ID;ACqJD;EACE,kBAAA;CDnJD;AC6JD;;EAEE,qBAAA;CD3JD;ACsKD;;;;EAIE,2BAAA;EACA,gBAAA;CDpKD;AC2KD;;EAEE,gBAAA;CDzKD;ACgLD;;EAEE,UAAA;EACA,WAAA;CD9KD;ACsLD;EACE,oBAAA;CDpLD;AC+LD;;EAEE,+BAAA;KAAA,4BAAA;UAAA,uBAAA;EACA,WAAA;CD7LD;ACsMD;;EAEE,aAAA;CDpMD;AC4MD;EACE,8BAAA;EACA,gCAAA;KAAA,6BAAA;UAAA,wBAAA;CD1MD;ACmND;;EAEE,yBAAA;CDjND;ACwND;EACE,0BAAA;EACA,cAAA;EACA,+BAAA;CDtND;AC8ND;EACE,UAAA;EACA,WAAA;CD5ND;ACmOD;EACE,eAAA;CDjOD;ACyOD;EACE,kBAAA;CDvOD;ACiPD;EACE,0BAAA;EACA,kBAAA;CD/OD;ACkPD;;EAEE,WAAA;CDhPD;AACD,qFAAqF;AElFrF;EA7FI;;;IAGI,mCAAA;IACA,uBAAA;IACA,oCAAA;YAAA,4BAAA;IACA,6BAAA;GFkLL;EE/KC;;IAEI,2BAAA;GFiLL;EE9KC;IACI,6BAAA;GFgLL;EE7KC;IACI,8BAAA;GF+KL;EE1KC;;IAEI,YAAA;GF4KL;EEzKC;;IAEI,uBAAA;IACA,yBAAA;GF2KL;EExKC;IACI,4BAAA;GF0KL;EEvKC;;IAEI,yBAAA;GFyKL;EEtKC;IACI,2BAAA;GFwKL;EErKC;;;IAGI,WAAA;IACA,UAAA;GFuKL;EEpKC;;IAEI,wBAAA;GFsKL;EEhKC;IACI,cAAA;GFkKL;EEhKC;;IAGQ,kCAAA;GFiKT;EE9JC;IACI,uBAAA;GFgKL;EE7JC;IACI,qCAAA;GF+JL;EEhKC;;IAKQ,kCAAA;GF+JT;EE5JC;;IAGQ,kCAAA;GF6JT;CACF;AGnPD;EACE,oCAAA;EACA,sDAAA;EACA,gYAAA;CHqPD;AG7OD;EACE,mBAAA;EACA,SAAA;EACA,sBAAA;EACA,oCAAA;EACA,mBAAA;EACA,oBAAA;EACA,eAAA;EACA,oCAAA;EACA,mCAAA;CH+OD;AG3OmC;EAAW,eAAA;CH8O9C;AG7OmC;EAAW,eAAA;CHgP9C;AG9OmC;;EAAW,iBAAA;CHkP9C;AGjPmC;EAAW,iBAAA;CHoP9C;AGnPmC;EAAW,iBAAA;CHsP9C;AGrPmC;EAAW,iBAAA;CHwP9C;AGvPmC;EAAW,iBAAA;CH0P9C;AGzPmC;EAAW,iBAAA;CH4P9C;AG3PmC;EAAW,iBAAA;CH8P9C;AG7PmC;EAAW,iBAAA;CHgQ9C;AG/PmC;EAAW,iBAAA;CHkQ9C;AGjQmC;EAAW,iBAAA;CHoQ9C;AGnQmC;EAAW,iBAAA;CHsQ9C;AGrQmC;EAAW,iBAAA;CHwQ9C;AGvQmC;EAAW,iBAAA;CH0Q9C;AGzQmC;EAAW,iBAAA;CH4Q9C;AG3QmC;EAAW,iBAAA;CH8Q9C;AG7QmC;EAAW,iBAAA;CHgR9C;AG/QmC;EAAW,iBAAA;CHkR9C;AGjRmC;EAAW,iBAAA;CHoR9C;AGnRmC;EAAW,iBAAA;CHsR9C;AGrRmC;EAAW,iBAAA;CHwR9C;AGvRmC;EAAW,iBAAA;CH0R9C;AGzRmC;EAAW,iBAAA;CH4R9C;AG3RmC;EAAW,iBAAA;CH8R9C;AG7RmC;EAAW,iBAAA;CHgS9C;AG/RmC;EAAW,iBAAA;CHkS9C;AGjSmC;EAAW,iBAAA;CHoS9C;AGnSmC;EAAW,iBAAA;CHsS9C;AGrSmC;EAAW,iBAAA;CHwS9C;AGvSmC;EAAW,iBAAA;CH0S9C;AGzSmC;EAAW,iBAAA;CH4S9C;AG3SmC;EAAW,iBAAA;CH8S9C;AG7SmC;EAAW,iBAAA;CHgT9C;AG/SmC;EAAW,iBAAA;CHkT9C;AGjTmC;EAAW,iBAAA;CHoT9C;AGnTmC;EAAW,iBAAA;CHsT9C;AGrTmC;EAAW,iBAAA;CHwT9C;AGvTmC;EAAW,iBAAA;CH0T9C;AGzTmC;EAAW,iBAAA;CH4T9C;AG3TmC;EAAW,iBAAA;CH8T9C;AG7TmC;EAAW,iBAAA;CHgU9C;AG/TmC;EAAW,iBAAA;CHkU9C;AGjUmC;EAAW,iBAAA;CHoU9C;AGnUmC;EAAW,iBAAA;CHsU9C;AGrUmC;EAAW,iBAAA;CHwU9C;AGvUmC;EAAW,iBAAA;CH0U9C;AGzUmC;EAAW,iBAAA;CH4U9C;AG3UmC;EAAW,iBAAA;CH8U9C;AG7UmC;EAAW,iBAAA;CHgV9C;AG/UmC;EAAW,iBAAA;CHkV9C;AGjVmC;EAAW,iBAAA;CHoV9C;AGnVmC;EAAW,iBAAA;CHsV9C;AGrVmC;EAAW,iBAAA;CHwV9C;AGvVmC;EAAW,iBAAA;CH0V9C;AGzVmC;EAAW,iBAAA;CH4V9C;AG3VmC;EAAW,iBAAA;CH8V9C;AG7VmC;EAAW,iBAAA;CHgW9C;AG/VmC;EAAW,iBAAA;CHkW9C;AGjWmC;EAAW,iBAAA;CHoW9C;AGnWmC;EAAW,iBAAA;CHsW9C;AGrWmC;EAAW,iBAAA;CHwW9C;AGvWmC;EAAW,iBAAA;CH0W9C;AGzWmC;EAAW,iBAAA;CH4W9C;AG3WmC;EAAW,iBAAA;CH8W9C;AG7WmC;EAAW,iBAAA;CHgX9C;AG/WmC;EAAW,iBAAA;CHkX9C;AGjXmC;EAAW,iBAAA;CHoX9C;AGnXmC;EAAW,iBAAA;CHsX9C;AGrXmC;EAAW,iBAAA;CHwX9C;AGvXmC;EAAW,iBAAA;CH0X9C;AGzXmC;EAAW,iBAAA;CH4X9C;AG3XmC;EAAW,iBAAA;CH8X9C;AG7XmC;EAAW,iBAAA;CHgY9C;AG/XmC;EAAW,iBAAA;CHkY9C;AGjYmC;EAAW,iBAAA;CHoY9C;AGnYmC;EAAW,iBAAA;CHsY9C;AGrYmC;EAAW,iBAAA;CHwY9C;AGvYmC;EAAW,iBAAA;CH0Y9C;AGzYmC;EAAW,iBAAA;CH4Y9C;AG3YmC;EAAW,iBAAA;CH8Y9C;AG7YmC;EAAW,iBAAA;CHgZ9C;AG/YmC;EAAW,iBAAA;CHkZ9C;AGjZmC;EAAW,iBAAA;CHoZ9C;AGnZmC;EAAW,iBAAA;CHsZ9C;AGrZmC;EAAW,iBAAA;CHwZ9C;AGvZmC;EAAW,iBAAA;CH0Z9C;AGzZmC;EAAW,iBAAA;CH4Z9C;AG3ZmC;EAAW,iBAAA;CH8Z9C;AG7ZmC;EAAW,iBAAA;CHga9C;AG/ZmC;EAAW,iBAAA;CHka9C;AGjamC;EAAW,iBAAA;CHoa9C;AGnamC;EAAW,iBAAA;CHsa9C;AGramC;EAAW,iBAAA;CHwa9C;AGvamC;EAAW,iBAAA;CH0a9C;AGzamC;EAAW,iBAAA;CH4a9C;AG3amC;EAAW,iBAAA;CH8a9C;AG7amC;EAAW,iBAAA;CHgb9C;AG/amC;EAAW,iBAAA;CHkb9C;AGjbmC;EAAW,iBAAA;CHob9C;AGnbmC;EAAW,iBAAA;CHsb9C;AGrbmC;EAAW,iBAAA;CHwb9C;AGvbmC;EAAW,iBAAA;CH0b9C;AGzbmC;EAAW,iBAAA;CH4b9C;AG3bmC;EAAW,iBAAA;CH8b9C;AG7bmC;EAAW,iBAAA;CHgc9C;AG/bmC;EAAW,iBAAA;CHkc9C;AGjcmC;EAAW,iBAAA;CHoc9C;AGncmC;EAAW,iBAAA;CHsc9C;AGrcmC;EAAW,iBAAA;CHwc9C;AGvcmC;EAAW,iBAAA;CH0c9C;AGzcmC;EAAW,iBAAA;CH4c9C;AG3cmC;EAAW,iBAAA;CH8c9C;AG7cmC;EAAW,iBAAA;CHgd9C;AG/cmC;EAAW,iBAAA;CHkd9C;AGjdmC;EAAW,iBAAA;CHod9C;AGndmC;EAAW,iBAAA;CHsd9C;AGrdmC;EAAW,iBAAA;CHwd9C;AGvdmC;EAAW,iBAAA;CH0d9C;AGzdmC;EAAW,iBAAA;CH4d9C;AG3dmC;EAAW,iBAAA;CH8d9C;AG7dmC;EAAW,iBAAA;CHge9C;AG/dmC;EAAW,iBAAA;CHke9C;AGjemC;EAAW,iBAAA;CHoe9C;AGnemC;EAAW,iBAAA;CHse9C;AGremC;EAAW,iBAAA;CHwe9C;AGvemC;EAAW,iBAAA;CH0e9C;AGzemC;EAAW,iBAAA;CH4e9C;AG3emC;EAAW,iBAAA;CH8e9C;AG7emC;EAAW,iBAAA;CHgf9C;AG/emC;EAAW,iBAAA;CHkf9C;AGjfmC;EAAW,iBAAA;CHof9C;AGnfmC;EAAW,iBAAA;CHsf9C;AGrfmC;EAAW,iBAAA;CHwf9C;AGvfmC;EAAW,iBAAA;CH0f9C;AGzfmC;EAAW,iBAAA;CH4f9C;AG3fmC;EAAW,iBAAA;CH8f9C;AG7fmC;EAAW,iBAAA;CHggB9C;AG/fmC;EAAW,iBAAA;CHkgB9C;AGjgBmC;EAAW,iBAAA;CHogB9C;AGngBmC;EAAW,iBAAA;CHsgB9C;AGrgBmC;EAAW,iBAAA;CHwgB9C;AGvgBmC;EAAW,iBAAA;CH0gB9C;AGzgBmC;EAAW,iBAAA;CH4gB9C;AG3gBmC;EAAW,iBAAA;CH8gB9C;AG7gBmC;EAAW,iBAAA;CHghB9C;AG/gBmC;EAAW,iBAAA;CHkhB9C;AGjhBmC;EAAW,iBAAA;CHohB9C;AGnhBmC;EAAW,iBAAA;CHshB9C;AGrhBmC;EAAW,iBAAA;CHwhB9C;AGvhBmC;EAAW,iBAAA;CH0hB9C;AGzhBmC;EAAW,iBAAA;CH4hB9C;AG3hBmC;EAAW,iBAAA;CH8hB9C;AG7hBmC;EAAW,iBAAA;CHgiB9C;AG/hBmC;EAAW,iBAAA;CHkiB9C;AGjiBmC;EAAW,iBAAA;CHoiB9C;AGniBmC;EAAW,iBAAA;CHsiB9C;AGriBmC;EAAW,iBAAA;CHwiB9C;AGviBmC;EAAW,iBAAA;CH0iB9C;AGziBmC;EAAW,iBAAA;CH4iB9C;AG3iBmC;EAAW,iBAAA;CH8iB9C;AG7iBmC;EAAW,iBAAA;CHgjB9C;AG/iBmC;EAAW,iBAAA;CHkjB9C;AGjjBmC;EAAW,iBAAA;CHojB9C;AGnjBmC;EAAW,iBAAA;CHsjB9C;AGrjBmC;EAAW,iBAAA;CHwjB9C;AGvjBmC;EAAW,iBAAA;CH0jB9C;AGzjBmC;EAAW,iBAAA;CH4jB9C;AG3jBmC;EAAW,iBAAA;CH8jB9C;AG7jBmC;EAAW,iBAAA;CHgkB9C;AG/jBmC;EAAW,iBAAA;CHkkB9C;AGjkBmC;EAAW,iBAAA;CHokB9C;AGnkBmC;EAAW,iBAAA;CHskB9C;AGrkBmC;EAAW,iBAAA;CHwkB9C;AGvkBmC;EAAW,iBAAA;CH0kB9C;AGzkBmC;EAAW,iBAAA;CH4kB9C;AG3kBmC;EAAW,iBAAA;CH8kB9C;AG7kBmC;EAAW,iBAAA;CHglB9C;AG/kBmC;EAAW,iBAAA;CHklB9C;AGjlBmC;EAAW,iBAAA;CHolB9C;AGnlBmC;EAAW,iBAAA;CHslB9C;AGrlBmC;EAAW,iBAAA;CHwlB9C;AGvlBmC;EAAW,iBAAA;CH0lB9C;AGzlBmC;EAAW,iBAAA;CH4lB9C;AG3lBmC;EAAW,iBAAA;CH8lB9C;AG7lBmC;EAAW,iBAAA;CHgmB9C;AG/lBmC;EAAW,iBAAA;CHkmB9C;AGjmBmC;EAAW,iBAAA;CHomB9C;AGnmBmC;EAAW,iBAAA;CHsmB9C;AGrmBmC;EAAW,iBAAA;CHwmB9C;AGvmBmC;EAAW,iBAAA;CH0mB9C;AGzmBmC;EAAW,iBAAA;CH4mB9C;AG3mBmC;EAAW,iBAAA;CH8mB9C;AG7mBmC;EAAW,iBAAA;CHgnB9C;AG/mBmC;EAAW,iBAAA;CHknB9C;AGjnBmC;EAAW,iBAAA;CHonB9C;AGnnBmC;EAAW,iBAAA;CHsnB9C;AGrnBmC;EAAW,iBAAA;CHwnB9C;AGvnBmC;EAAW,iBAAA;CH0nB9C;AGznBmC;EAAW,iBAAA;CH4nB9C;AG3nBmC;EAAW,iBAAA;CH8nB9C;AG7nBmC;EAAW,iBAAA;CHgoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AGvoBmC;EAAW,iBAAA;CH0oB9C;AGzoBmC;EAAW,iBAAA;CH4oB9C;AG3oBmC;EAAW,iBAAA;CH8oB9C;AG7oBmC;EAAW,iBAAA;CHgpB9C;AG/oBmC;EAAW,iBAAA;CHkpB9C;AGjpBmC;EAAW,iBAAA;CHopB9C;AGnpBmC;EAAW,iBAAA;CHspB9C;AGrpBmC;EAAW,iBAAA;CHwpB9C;AGvpBmC;EAAW,iBAAA;CH0pB9C;AGzpBmC;EAAW,iBAAA;CH4pB9C;AG3pBmC;EAAW,iBAAA;CH8pB9C;AG7pBmC;EAAW,iBAAA;CHgqB9C;AG/pBmC;EAAW,iBAAA;CHkqB9C;AGjqBmC;EAAW,iBAAA;CHoqB9C;AGnqBmC;EAAW,iBAAA;CHsqB9C;AGrqBmC;EAAW,iBAAA;CHwqB9C;AGvqBmC;EAAW,iBAAA;CH0qB9C;AGzqBmC;EAAW,iBAAA;CH4qB9C;AG3qBmC;EAAW,iBAAA;CH8qB9C;AG7qBmC;EAAW,iBAAA;CHgrB9C;AG/qBmC;EAAW,iBAAA;CHkrB9C;AGjrBmC;EAAW,iBAAA;CHorB9C;AGnrBmC;EAAW,iBAAA;CHsrB9C;AGrrBmC;EAAW,iBAAA;CHwrB9C;AGvrBmC;EAAW,iBAAA;CH0rB9C;AGzrBmC;EAAW,iBAAA;CH4rB9C;AG3rBmC;EAAW,iBAAA;CH8rB9C;AG7rBmC;EAAW,iBAAA;CHgsB9C;AG/rBmC;EAAW,iBAAA;CHksB9C;AGjsBmC;EAAW,iBAAA;CHosB9C;AGnsBmC;EAAW,iBAAA;CHssB9C;AGrsBmC;EAAW,iBAAA;CHwsB9C;AGvsBmC;EAAW,iBAAA;CH0sB9C;AGzsBmC;EAAW,iBAAA;CH4sB9C;AG3sBmC;EAAW,iBAAA;CH8sB9C;AG7sBmC;EAAW,iBAAA;CHgtB9C;AG/sBmC;EAAW,iBAAA;CHktB9C;AGjtBmC;EAAW,iBAAA;CHotB9C;AGntBmC;EAAW,iBAAA;CHstB9C;AGrtBmC;EAAW,iBAAA;CHwtB9C;AGvtBmC;EAAW,iBAAA;CH0tB9C;AGztBmC;EAAW,iBAAA;CH4tB9C;AG3tBmC;EAAW,iBAAA;CH8tB9C;AG7tBmC;EAAW,iBAAA;CHguB9C;AG/tBmC;EAAW,iBAAA;CHkuB9C;AGjuBmC;EAAW,iBAAA;CHouB9C;AGnuBmC;EAAW,iBAAA;CHsuB9C;AGruBmC;EAAW,iBAAA;CHwuB9C;AGvuBmC;EAAW,iBAAA;CH0uB9C;AGzuBmC;EAAW,iBAAA;CH4uB9C;AG3uBmC;EAAW,iBAAA;CH8uB9C;AG7uBmC;EAAW,iBAAA;CHgvB9C;AIthCD;ECgEE,+BAAA;EACG,4BAAA;EACK,uBAAA;CLy9BT;AIxhCD;;EC6DE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL+9BT;AIthCD;EACE,gBAAA;EACA,8CAAA;CJwhCD;AIrhCD;EACE,4DAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,0BAAA;CJuhCD;AInhCD;;;;EAIE,qBAAA;EACA,mBAAA;EACA,qBAAA;CJqhCD;AI/gCD;EACE,eAAA;EACA,sBAAA;CJihCD;AI/gCC;;EAEE,eAAA;EACA,2BAAA;CJihCH;AI9gCC;EErDA,qBAAA;EAEA,2CAAA;EACA,qBAAA;CNqkCD;AIxgCD;EACE,UAAA;CJ0gCD;AIpgCD;EACE,uBAAA;CJsgCD;AIlgCD;;;;;EGvEE,eAAA;EACA,gBAAA;EACA,aAAA;CPglCD;AItgCD;EACE,mBAAA;CJwgCD;AIlgCD;EACE,aAAA;EACA,wBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;EC6FA,yCAAA;EACK,oCAAA;EACG,iCAAA;EEvLR,sBAAA;EACA,gBAAA;EACA,aAAA;CPgmCD;AIlgCD;EACE,mBAAA;CJogCD;AI9/BD;EACE,iBAAA;EACA,oBAAA;EACA,UAAA;EACA,8BAAA;CJggCD;AIx/BD;EACE,mBAAA;EACA,WAAA;EACA,YAAA;EACA,aAAA;EACA,WAAA;EACA,iBAAA;EACA,uBAAA;EACA,UAAA;CJ0/BD;AIl/BC;;EAEE,iBAAA;EACA,YAAA;EACA,aAAA;EACA,UAAA;EACA,kBAAA;EACA,WAAA;CJo/BH;AIz+BD;EACE,gBAAA;CJ2+BD;AQloCD;;;;;;;;;;;;EAEE,qBAAA;EACA,iBAAA;EACA,iBAAA;EACA,eAAA;CR8oCD;AQnpCD;;;;;;;;;;;;;;;;;;;;;;;;EASI,oBAAA;EACA,eAAA;EACA,eAAA;CRoqCH;AQhqCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRqqCD;AQzqCD;;;;;;;;;;;;EAQI,eAAA;CR+qCH;AQ5qCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRirCD;AQrrCD;;;;;;;;;;;;EAQI,eAAA;CR2rCH;AQvrCD;;EAAU,gBAAA;CR2rCT;AQ1rCD;;EAAU,gBAAA;CR8rCT;AQ7rCD;;EAAU,gBAAA;CRisCT;AQhsCD;;EAAU,gBAAA;CRosCT;AQnsCD;;EAAU,gBAAA;CRusCT;AQtsCD;;EAAU,gBAAA;CR0sCT;AQpsCD;EACE,iBAAA;CRssCD;AQnsCD;EACE,oBAAA;EACA,gBAAA;EACA,iBAAA;EACA,iBAAA;CRqsCD;AQhsCD;EAAA;IAFI,gBAAA;GRssCD;CACF;AQ9rCD;;EAEE,eAAA;CRgsCD;AQ7rCD;;EAEE,0BAAA;EACA,cAAA;CR+rCD;AQ3rCD;EAAuB,iBAAA;CR8rCtB;AQ7rCD;EAAuB,kBAAA;CRgsCtB;AQ/rCD;EAAuB,mBAAA;CRksCtB;AQjsCD;EAAuB,oBAAA;CRosCtB;AQnsCD;EAAuB,oBAAA;CRssCtB;AQnsCD;EAAuB,0BAAA;CRssCtB;AQrsCD;EAAuB,0BAAA;CRwsCtB;AQvsCD;EAAuB,2BAAA;CR0sCtB;AQvsCD;EACE,eAAA;CRysCD;AQvsCD;ECrGE,eAAA;CT+yCD;AS9yCC;;EAEE,eAAA;CTgzCH;AQ3sCD;ECxGE,eAAA;CTszCD;ASrzCC;;EAEE,eAAA;CTuzCH;AQ/sCD;EC3GE,eAAA;CT6zCD;AS5zCC;;EAEE,eAAA;CT8zCH;AQntCD;EC9GE,eAAA;CTo0CD;ASn0CC;;EAEE,eAAA;CTq0CH;AQvtCD;ECjHE,eAAA;CT20CD;AS10CC;;EAEE,eAAA;CT40CH;AQvtCD;EAGE,YAAA;EE3HA,0BAAA;CVm1CD;AUl1CC;;EAEE,0BAAA;CVo1CH;AQztCD;EE9HE,0BAAA;CV01CD;AUz1CC;;EAEE,0BAAA;CV21CH;AQ7tCD;EEjIE,0BAAA;CVi2CD;AUh2CC;;EAEE,0BAAA;CVk2CH;AQjuCD;EEpIE,0BAAA;CVw2CD;AUv2CC;;EAEE,0BAAA;CVy2CH;AQruCD;EEvIE,0BAAA;CV+2CD;AU92CC;;EAEE,0BAAA;CVg3CH;AQpuCD;EACE,oBAAA;EACA,oBAAA;EACA,iCAAA;CRsuCD;AQ9tCD;;EAEE,cAAA;EACA,oBAAA;CRguCD;AQnuCD;;;;EAMI,iBAAA;CRmuCH;AQ5tCD;EACE,gBAAA;EACA,iBAAA;CR8tCD;AQ1tCD;EALE,gBAAA;EACA,iBAAA;EAMA,kBAAA;CR6tCD;AQ/tCD;EAKI,sBAAA;EACA,kBAAA;EACA,mBAAA;CR6tCH;AQxtCD;EACE,cAAA;EACA,oBAAA;CR0tCD;AQxtCD;;EAEE,wBAAA;CR0tCD;AQxtCD;EACE,kBAAA;CR0tCD;AQxtCD;EACE,eAAA;CR0tCD;AQjsCD;EAAA;IAVM,YAAA;IACA,aAAA;IACA,YAAA;IACA,kBAAA;IGtNJ,iBAAA;IACA,wBAAA;IACA,oBAAA;GXs6CC;EQ3sCH;IAHM,mBAAA;GRitCH;CACF;AQxsCD;;EAGE,aAAA;EACA,kCAAA;CRysCD;AQvsCD;EACE,eAAA;EA9IqB,0BAAA;CRw1CtB;AQrsCD;EACE,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,+BAAA;CRusCD;AQlsCG;;;EACE,iBAAA;CRssCL;AQhtCD;;;EAmBI,eAAA;EACA,eAAA;EACA,wBAAA;EACA,eAAA;CRksCH;AQhsCG;;;EACE,uBAAA;CRosCL;AQ5rCD;;EAEE,oBAAA;EACA,gBAAA;EACA,gCAAA;EACA,eAAA;EACA,kBAAA;CR8rCD;AQxrCG;;;;;;EAAW,YAAA;CRgsCd;AQ/rCG;;;;;;EACE,uBAAA;CRssCL;AQhsCD;EACE,oBAAA;EACA,mBAAA;EACA,wBAAA;CRksCD;AYx+CD;;;;EAIE,+DAAA;CZ0+CD;AYt+CD;EACE,iBAAA;EACA,eAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;CZw+CD;AYp+CD;EACE,iBAAA;EACA,eAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;EACA,uDAAA;UAAA,+CAAA;CZs+CD;AY5+CD;EASI,WAAA;EACA,gBAAA;EACA,kBAAA;EACA,yBAAA;UAAA,iBAAA;CZs+CH;AYj+CD;EACE,eAAA;EACA,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,sBAAA;EACA,sBAAA;EACA,eAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;CZm+CD;AY9+CD;EAeI,WAAA;EACA,mBAAA;EACA,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,iBAAA;CZk+CH;AY79CD;EACE,kBAAA;EACA,mBAAA;CZ+9CD;AazhDD;ECHE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;Cd+hDD;AazhDC;EAAA;IAFE,aAAA;Gb+hDD;CACF;Aa3hDC;EAAA;IAFE,aAAA;GbiiDD;CACF;Aa7hDD;EAAA;IAFI,cAAA;GbmiDD;CACF;Aa1hDD;ECvBE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;CdojDD;AavhDD;ECvBE,mBAAA;EACA,oBAAA;CdijDD;AejjDG;EACE,mBAAA;EAEA,gBAAA;EAEA,mBAAA;EACA,oBAAA;CfijDL;AejiDG;EACE,YAAA;CfmiDL;Ae5hDC;EACE,YAAA;Cf8hDH;Ae/hDC;EACE,oBAAA;CfiiDH;AeliDC;EACE,oBAAA;CfoiDH;AeriDC;EACE,WAAA;CfuiDH;AexiDC;EACE,oBAAA;Cf0iDH;Ae3iDC;EACE,oBAAA;Cf6iDH;Ae9iDC;EACE,WAAA;CfgjDH;AejjDC;EACE,oBAAA;CfmjDH;AepjDC;EACE,oBAAA;CfsjDH;AevjDC;EACE,WAAA;CfyjDH;Ae1jDC;EACE,oBAAA;Cf4jDH;Ae7jDC;EACE,mBAAA;Cf+jDH;AejjDC;EACE,YAAA;CfmjDH;AepjDC;EACE,oBAAA;CfsjDH;AevjDC;EACE,oBAAA;CfyjDH;Ae1jDC;EACE,WAAA;Cf4jDH;Ae7jDC;EACE,oBAAA;Cf+jDH;AehkDC;EACE,oBAAA;CfkkDH;AenkDC;EACE,WAAA;CfqkDH;AetkDC;EACE,oBAAA;CfwkDH;AezkDC;EACE,oBAAA;Cf2kDH;Ae5kDC;EACE,WAAA;Cf8kDH;Ae/kDC;EACE,oBAAA;CfilDH;AellDC;EACE,mBAAA;CfolDH;AehlDC;EACE,YAAA;CfklDH;AelmDC;EACE,WAAA;CfomDH;AermDC;EACE,mBAAA;CfumDH;AexmDC;EACE,mBAAA;Cf0mDH;Ae3mDC;EACE,UAAA;Cf6mDH;Ae9mDC;EACE,mBAAA;CfgnDH;AejnDC;EACE,mBAAA;CfmnDH;AepnDC;EACE,UAAA;CfsnDH;AevnDC;EACE,mBAAA;CfynDH;Ae1nDC;EACE,mBAAA;Cf4nDH;Ae7nDC;EACE,UAAA;Cf+nDH;AehoDC;EACE,mBAAA;CfkoDH;AenoDC;EACE,kBAAA;CfqoDH;AejoDC;EACE,WAAA;CfmoDH;AernDC;EACE,kBAAA;CfunDH;AexnDC;EACE,0BAAA;Cf0nDH;Ae3nDC;EACE,0BAAA;Cf6nDH;Ae9nDC;EACE,iBAAA;CfgoDH;AejoDC;EACE,0BAAA;CfmoDH;AepoDC;EACE,0BAAA;CfsoDH;AevoDC;EACE,iBAAA;CfyoDH;Ae1oDC;EACE,0BAAA;Cf4oDH;Ae7oDC;EACE,0BAAA;Cf+oDH;AehpDC;EACE,iBAAA;CfkpDH;AenpDC;EACE,0BAAA;CfqpDH;AetpDC;EACE,yBAAA;CfwpDH;AezpDC;EACE,gBAAA;Cf2pDH;Aa3pDD;EElCI;IACE,YAAA;GfgsDH;EezrDD;IACE,YAAA;Gf2rDD;Ee5rDD;IACE,oBAAA;Gf8rDD;Ee/rDD;IACE,oBAAA;GfisDD;EelsDD;IACE,WAAA;GfosDD;EersDD;IACE,oBAAA;GfusDD;EexsDD;IACE,oBAAA;Gf0sDD;Ee3sDD;IACE,WAAA;Gf6sDD;Ee9sDD;IACE,oBAAA;GfgtDD;EejtDD;IACE,oBAAA;GfmtDD;EeptDD;IACE,WAAA;GfstDD;EevtDD;IACE,oBAAA;GfytDD;Ee1tDD;IACE,mBAAA;Gf4tDD;Ee9sDD;IACE,YAAA;GfgtDD;EejtDD;IACE,oBAAA;GfmtDD;EeptDD;IACE,oBAAA;GfstDD;EevtDD;IACE,WAAA;GfytDD;Ee1tDD;IACE,oBAAA;Gf4tDD;Ee7tDD;IACE,oBAAA;Gf+tDD;EehuDD;IACE,WAAA;GfkuDD;EenuDD;IACE,oBAAA;GfquDD;EetuDD;IACE,oBAAA;GfwuDD;EezuDD;IACE,WAAA;Gf2uDD;Ee5uDD;IACE,oBAAA;Gf8uDD;Ee/uDD;IACE,mBAAA;GfivDD;Ee7uDD;IACE,YAAA;Gf+uDD;Ee/vDD;IACE,WAAA;GfiwDD;EelwDD;IACE,mBAAA;GfowDD;EerwDD;IACE,mBAAA;GfuwDD;EexwDD;IACE,UAAA;Gf0wDD;Ee3wDD;IACE,mBAAA;Gf6wDD;Ee9wDD;IACE,mBAAA;GfgxDD;EejxDD;IACE,UAAA;GfmxDD;EepxDD;IACE,mBAAA;GfsxDD;EevxDD;IACE,mBAAA;GfyxDD;Ee1xDD;IACE,UAAA;Gf4xDD;Ee7xDD;IACE,mBAAA;Gf+xDD;EehyDD;IACE,kBAAA;GfkyDD;Ee9xDD;IACE,WAAA;GfgyDD;EelxDD;IACE,kBAAA;GfoxDD;EerxDD;IACE,0BAAA;GfuxDD;EexxDD;IACE,0BAAA;Gf0xDD;Ee3xDD;IACE,iBAAA;Gf6xDD;Ee9xDD;IACE,0BAAA;GfgyDD;EejyDD;IACE,0BAAA;GfmyDD;EepyDD;IACE,iBAAA;GfsyDD;EevyDD;IACE,0BAAA;GfyyDD;Ee1yDD;IACE,0BAAA;Gf4yDD;Ee7yDD;IACE,iBAAA;Gf+yDD;EehzDD;IACE,0BAAA;GfkzDD;EenzDD;IACE,yBAAA;GfqzDD;EetzDD;IACE,gBAAA;GfwzDD;CACF;AahzDD;EE3CI;IACE,YAAA;Gf81DH;Eev1DD;IACE,YAAA;Gfy1DD;Ee11DD;IACE,oBAAA;Gf41DD;Ee71DD;IACE,oBAAA;Gf+1DD;Eeh2DD;IACE,WAAA;Gfk2DD;Een2DD;IACE,oBAAA;Gfq2DD;Eet2DD;IACE,oBAAA;Gfw2DD;Eez2DD;IACE,WAAA;Gf22DD;Ee52DD;IACE,oBAAA;Gf82DD;Ee/2DD;IACE,oBAAA;Gfi3DD;Eel3DD;IACE,WAAA;Gfo3DD;Eer3DD;IACE,oBAAA;Gfu3DD;Eex3DD;IACE,mBAAA;Gf03DD;Ee52DD;IACE,YAAA;Gf82DD;Ee/2DD;IACE,oBAAA;Gfi3DD;Eel3DD;IACE,oBAAA;Gfo3DD;Eer3DD;IACE,WAAA;Gfu3DD;Eex3DD;IACE,oBAAA;Gf03DD;Ee33DD;IACE,oBAAA;Gf63DD;Ee93DD;IACE,WAAA;Gfg4DD;Eej4DD;IACE,oBAAA;Gfm4DD;Eep4DD;IACE,oBAAA;Gfs4DD;Eev4DD;IACE,WAAA;Gfy4DD;Ee14DD;IACE,oBAAA;Gf44DD;Ee74DD;IACE,mBAAA;Gf+4DD;Ee34DD;IACE,YAAA;Gf64DD;Ee75DD;IACE,WAAA;Gf+5DD;Eeh6DD;IACE,mBAAA;Gfk6DD;Een6DD;IACE,mBAAA;Gfq6DD;Eet6DD;IACE,UAAA;Gfw6DD;Eez6DD;IACE,mBAAA;Gf26DD;Ee56DD;IACE,mBAAA;Gf86DD;Ee/6DD;IACE,UAAA;Gfi7DD;Eel7DD;IACE,mBAAA;Gfo7DD;Eer7DD;IACE,mBAAA;Gfu7DD;Eex7DD;IACE,UAAA;Gf07DD;Ee37DD;IACE,mBAAA;Gf67DD;Ee97DD;IACE,kBAAA;Gfg8DD;Ee57DD;IACE,WAAA;Gf87DD;Eeh7DD;IACE,kBAAA;Gfk7DD;Een7DD;IACE,0BAAA;Gfq7DD;Eet7DD;IACE,0BAAA;Gfw7DD;Eez7DD;IACE,iBAAA;Gf27DD;Ee57DD;IACE,0BAAA;Gf87DD;Ee/7DD;IACE,0BAAA;Gfi8DD;Eel8DD;IACE,iBAAA;Gfo8DD;Eer8DD;IACE,0BAAA;Gfu8DD;Eex8DD;IACE,0BAAA;Gf08DD;Ee38DD;IACE,iBAAA;Gf68DD;Ee98DD;IACE,0BAAA;Gfg9DD;Eej9DD;IACE,yBAAA;Gfm9DD;Eep9DD;IACE,gBAAA;Gfs9DD;CACF;Aa38DD;EE9CI;IACE,YAAA;Gf4/DH;Eer/DD;IACE,YAAA;Gfu/DD;Eex/DD;IACE,oBAAA;Gf0/DD;Ee3/DD;IACE,oBAAA;Gf6/DD;Ee9/DD;IACE,WAAA;GfggED;EejgED;IACE,oBAAA;GfmgED;EepgED;IACE,oBAAA;GfsgED;EevgED;IACE,WAAA;GfygED;Ee1gED;IACE,oBAAA;Gf4gED;Ee7gED;IACE,oBAAA;Gf+gED;EehhED;IACE,WAAA;GfkhED;EenhED;IACE,oBAAA;GfqhED;EethED;IACE,mBAAA;GfwhED;Ee1gED;IACE,YAAA;Gf4gED;Ee7gED;IACE,oBAAA;Gf+gED;EehhED;IACE,oBAAA;GfkhED;EenhED;IACE,WAAA;GfqhED;EethED;IACE,oBAAA;GfwhED;EezhED;IACE,oBAAA;Gf2hED;Ee5hED;IACE,WAAA;Gf8hED;Ee/hED;IACE,oBAAA;GfiiED;EeliED;IACE,oBAAA;GfoiED;EeriED;IACE,WAAA;GfuiED;EexiED;IACE,oBAAA;Gf0iED;Ee3iED;IACE,mBAAA;Gf6iED;EeziED;IACE,YAAA;Gf2iED;Ee3jED;IACE,WAAA;Gf6jED;Ee9jED;IACE,mBAAA;GfgkED;EejkED;IACE,mBAAA;GfmkED;EepkED;IACE,UAAA;GfskED;EevkED;IACE,mBAAA;GfykED;Ee1kED;IACE,mBAAA;Gf4kED;Ee7kED;IACE,UAAA;Gf+kED;EehlED;IACE,mBAAA;GfklED;EenlED;IACE,mBAAA;GfqlED;EetlED;IACE,UAAA;GfwlED;EezlED;IACE,mBAAA;Gf2lED;Ee5lED;IACE,kBAAA;Gf8lED;Ee1lED;IACE,WAAA;Gf4lED;Ee9kED;IACE,kBAAA;GfglED;EejlED;IACE,0BAAA;GfmlED;EeplED;IACE,0BAAA;GfslED;EevlED;IACE,iBAAA;GfylED;Ee1lED;IACE,0BAAA;Gf4lED;Ee7lED;IACE,0BAAA;Gf+lED;EehmED;IACE,iBAAA;GfkmED;EenmED;IACE,0BAAA;GfqmED;EetmED;IACE,0BAAA;GfwmED;EezmED;IACE,iBAAA;Gf2mED;Ee5mED;IACE,0BAAA;Gf8mED;Ee/mED;IACE,yBAAA;GfinED;EelnED;IACE,gBAAA;GfonED;CACF;AgBxrED;EACE,8BAAA;ChB0rED;AgBxrED;EACE,iBAAA;EACA,oBAAA;EACA,eAAA;EACA,iBAAA;ChB0rED;AgBxrED;EACE,iBAAA;ChB0rED;AgBprED;EACE,YAAA;EACA,gBAAA;EACA,oBAAA;ChBsrED;AgBzrED;;;;;;EAWQ,aAAA;EACA,wBAAA;EACA,oBAAA;EACA,8BAAA;ChBsrEP;AgBpsED;EAoBI,uBAAA;EACA,iCAAA;ChBmrEH;AgBxsED;;;;;;EA8BQ,cAAA;ChBkrEP;AgBhtED;EAoCI,8BAAA;ChB+qEH;AgBntED;EAyCI,0BAAA;ChB6qEH;AgBtqED;;;;;;EAOQ,aAAA;ChBuqEP;AgB5pED;EACE,0BAAA;ChB8pED;AgB/pED;;;;;;EAQQ,0BAAA;ChB+pEP;AgBvqED;;EAeM,yBAAA;ChB4pEL;AgBlpED;EAEI,0BAAA;ChBmpEH;AgB1oED;EAEI,0BAAA;ChB2oEH;AgBloED;EACE,iBAAA;EACA,YAAA;EACA,sBAAA;ChBooED;AgB/nEG;;EACE,iBAAA;EACA,YAAA;EACA,oBAAA;ChBkoEL;AiB9wEC;;;;;;;;;;;;EAOI,0BAAA;CjBqxEL;AiB/wEC;;;;;EAMI,0BAAA;CjBgxEL;AiBnyEC;;;;;;;;;;;;EAOI,0BAAA;CjB0yEL;AiBpyEC;;;;;EAMI,0BAAA;CjBqyEL;AiBxzEC;;;;;;;;;;;;EAOI,0BAAA;CjB+zEL;AiBzzEC;;;;;EAMI,0BAAA;CjB0zEL;AiB70EC;;;;;;;;;;;;EAOI,0BAAA;CjBo1EL;AiB90EC;;;;;EAMI,0BAAA;CjB+0EL;AiBl2EC;;;;;;;;;;;;EAOI,0BAAA;CjBy2EL;AiBn2EC;;;;;EAMI,0BAAA;CjBo2EL;AgBltED;EACE,iBAAA;EACA,kBAAA;ChBotED;AgBvpED;EAAA;IA1DI,YAAA;IACA,oBAAA;IACA,mBAAA;IACA,6CAAA;IACA,0BAAA;GhBqtED;EgB/pEH;IAlDM,iBAAA;GhBotEH;EgBlqEH;;;;;;IAzCY,oBAAA;GhBmtET;EgB1qEH;IAjCM,UAAA;GhB8sEH;EgB7qEH;;;;;;IAxBY,eAAA;GhB6sET;EgBrrEH;;;;;;IApBY,gBAAA;GhBitET;EgB7rEH;;;;IAPY,iBAAA;GhB0sET;CACF;AkBp6ED;EACE,WAAA;EACA,UAAA;EACA,UAAA;EAIA,aAAA;ClBm6ED;AkBh6ED;EACE,eAAA;EACA,YAAA;EACA,WAAA;EACA,oBAAA;EACA,gBAAA;EACA,qBAAA;EACA,eAAA;EACA,UAAA;EACA,iCAAA;ClBk6ED;AkB/5ED;EACE,sBAAA;EACA,gBAAA;EACA,mBAAA;EACA,kBAAA;ClBi6ED;AkBt5ED;Eb4BE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL63ET;AkBt5ED;;EAEE,gBAAA;EACA,mBAAA;EACA,oBAAA;ClBw5ED;AkBr5ED;EACE,eAAA;ClBu5ED;AkBn5ED;EACE,eAAA;EACA,YAAA;ClBq5ED;AkBj5ED;;EAEE,aAAA;ClBm5ED;AkB/4ED;;;EZvEE,qBAAA;EAEA,2CAAA;EACA,qBAAA;CN09ED;AkB/4ED;EACE,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;ClBi5ED;AkBv3ED;EACE,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,0BAAA;EACA,uBAAA;EACA,0BAAA;EACA,mBAAA;EbxDA,yDAAA;EACQ,iDAAA;EAyHR,uFAAA;EACK,0EAAA;EACG,uEAAA;CL0zET;AmBl8EC;EACE,sBAAA;EACA,WAAA;EdUF,uFAAA;EACQ,+EAAA;CL27ET;AK15EC;EACE,eAAA;EACA,WAAA;CL45EH;AK15EC;EAA0B,eAAA;CL65E3B;AK55EC;EAAgC,eAAA;CL+5EjC;AkB/3EC;;;EAGE,0BAAA;EACA,WAAA;ClBi4EH;AkB93EC;;EAEE,oBAAA;ClBg4EH;AkB53EC;EACE,aAAA;ClB83EH;AkBl3ED;EACE,yBAAA;ClBo3ED;AkB50ED;EAtBI;;;;IACE,kBAAA;GlBw2EH;EkBr2EC;;;;;;;;IAEE,kBAAA;GlB62EH;EkB12EC;;;;;;;;IAEE,kBAAA;GlBk3EH;CACF;AkBx2ED;EACE,oBAAA;ClB02ED;AkBl2ED;;EAEE,mBAAA;EACA,eAAA;EACA,iBAAA;EACA,oBAAA;ClBo2ED;AkBz2ED;;EAQI,iBAAA;EACA,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,gBAAA;ClBq2EH;AkBl2ED;;;;EAIE,mBAAA;EACA,mBAAA;EACA,mBAAA;ClBo2ED;AkBj2ED;;EAEE,iBAAA;ClBm2ED;AkB/1ED;;EAEE,mBAAA;EACA,sBAAA;EACA,mBAAA;EACA,iBAAA;EACA,uBAAA;EACA,oBAAA;EACA,gBAAA;ClBi2ED;AkB/1ED;;EAEE,cAAA;EACA,kBAAA;ClBi2ED;AkBx1EC;;;;;;EAGE,oBAAA;ClB61EH;AkBv1EC;;;;EAEE,oBAAA;ClB21EH;AkBr1EC;;;;EAGI,oBAAA;ClBw1EL;AkB70ED;EAEE,iBAAA;EACA,oBAAA;EAEA,iBAAA;EACA,iBAAA;ClB60ED;AkB30EC;;EAEE,gBAAA;EACA,iBAAA;ClB60EH;AkBh0ED;EC7PE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnBgkFD;AmB9jFC;EACE,aAAA;EACA,kBAAA;CnBgkFH;AmB7jFC;;EAEE,aAAA;CnB+jFH;AkB50ED;EAEI,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;ClB60EH;AkBn1ED;EASI,aAAA;EACA,kBAAA;ClB60EH;AkBv1ED;;EAcI,aAAA;ClB60EH;AkB31ED;EAiBI,aAAA;EACA,iBAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;ClB60EH;AkBz0ED;ECzRE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnBqmFD;AmBnmFC;EACE,aAAA;EACA,kBAAA;CnBqmFH;AmBlmFC;;EAEE,aAAA;CnBomFH;AkBr1ED;EAEI,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;ClBs1EH;AkB51ED;EASI,aAAA;EACA,kBAAA;ClBs1EH;AkBh2ED;;EAcI,aAAA;ClBs1EH;AkBp2ED;EAiBI,aAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;ClBs1EH;AkB70ED;EAEE,mBAAA;ClB80ED;AkBh1ED;EAMI,sBAAA;ClB60EH;AkBz0ED;EACE,mBAAA;EACA,OAAA;EACA,SAAA;EACA,WAAA;EACA,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,mBAAA;EACA,qBAAA;ClB20ED;AkBz0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClB20ED;AkBz0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClB20ED;AkBv0ED;;;;;;;;;;ECpZI,eAAA;CnBuuFH;AkBn1ED;EChZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLwrFT;AmBtuFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL6rFT;AkB71ED;ECtYI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBsuFH;AkBl2ED;EChYI,eAAA;CnBquFH;AkBl2ED;;;;;;;;;;ECvZI,eAAA;CnBqwFH;AkB92ED;ECnZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLstFT;AmBpwFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL2tFT;AkBx3ED;ECzYI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBowFH;AkB73ED;ECnYI,eAAA;CnBmwFH;AkB73ED;;;;;;;;;;EC1ZI,eAAA;CnBmyFH;AkBz4ED;ECtZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLovFT;AmBlyFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CLyvFT;AkBn5ED;EC5YI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBkyFH;AkBx5ED;ECtYI,eAAA;CnBiyFH;AkBp5EC;EACG,UAAA;ClBs5EJ;AkBp5EC;EACG,OAAA;ClBs5EJ;AkB54ED;EACE,eAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;ClB84ED;AkB3zED;EAAA;IA9DM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlB63EH;EkBj0EH;IAvDM,sBAAA;IACA,YAAA;IACA,uBAAA;GlB23EH;EkBt0EH;IAhDM,sBAAA;GlBy3EH;EkBz0EH;IA5CM,sBAAA;IACA,uBAAA;GlBw3EH;EkB70EH;;;IAtCQ,YAAA;GlBw3EL;EkBl1EH;IAhCM,YAAA;GlBq3EH;EkBr1EH;IA5BM,iBAAA;IACA,uBAAA;GlBo3EH;EkBz1EH;;IApBM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlBi3EH;EkBh2EH;;IAdQ,gBAAA;GlBk3EL;EkBp2EH;;IATM,mBAAA;IACA,eAAA;GlBi3EH;EkBz2EH;IAHM,OAAA;GlB+2EH;CACF;AkBr2ED;;;;EASI,cAAA;EACA,iBAAA;EACA,iBAAA;ClBk2EH;AkB72ED;;EAiBI,iBAAA;ClBg2EH;AkBj3ED;EJhhBE,mBAAA;EACA,oBAAA;Cdo4FD;AkB90EC;EAAA;IAVI,kBAAA;IACA,iBAAA;IACA,iBAAA;GlB41EH;CACF;AkB53ED;EAwCI,YAAA;ClBu1EH;AkBz0EC;EAAA;IAJM,yBAAA;IACA,gBAAA;GlBi1EL;CACF;AkBv0EC;EAAA;IAJM,iBAAA;IACA,gBAAA;GlB+0EL;CACF;AoBl6FD;EACE,sBAAA;EACA,iBAAA;EACA,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,+BAAA;MAAA,2BAAA;EACA,gBAAA;EACA,uBAAA;EACA,8BAAA;EACA,oBAAA;EC6CA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,mBAAA;EhB4JA,0BAAA;EACG,uBAAA;EACC,sBAAA;EACI,kBAAA;CL6tFT;AoBr6FG;;;;;;EdrBF,qBAAA;EAEA,2CAAA;EACA,qBAAA;CNi8FD;AoBz6FC;;;EAGE,eAAA;EACA,sBAAA;CpB26FH;AoBx6FC;;EAEE,WAAA;EACA,uBAAA;Ef2BF,yDAAA;EACQ,iDAAA;CLg5FT;AoBx6FC;;;EAGE,oBAAA;EE7CF,cAAA;EAGA,0BAAA;EjB8DA,yBAAA;EACQ,iBAAA;CLy5FT;AoBx6FG;;EAEE,qBAAA;CpB06FL;AoBj6FD;EC3DE,eAAA;EACA,0BAAA;EACA,sBAAA;CrB+9FD;AqB79FC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB+9FP;AqB79FC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB+9FP;AqB79FC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB+9FP;AqB79FG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBq+FT;AqBl+FC;;;EAGE,uBAAA;CrBo+FH;AqB/9FG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrB6+FT;AoB/9FD;ECTI,eAAA;EACA,0BAAA;CrB2+FH;AoBh+FD;EC9DE,eAAA;EACA,0BAAA;EACA,sBAAA;CrBiiGD;AqB/hGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBiiGP;AqB/hGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBiiGP;AqB/hGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBiiGP;AqB/hGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBuiGT;AqBpiGC;;;EAGE,uBAAA;CrBsiGH;AqBjiGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrB+iGT;AoB9hGD;ECZI,eAAA;EACA,0BAAA;CrB6iGH;AoB9hGD;EClEE,eAAA;EACA,0BAAA;EACA,sBAAA;CrBmmGD;AqBjmGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBmmGP;AqBjmGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBmmGP;AqBjmGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBmmGP;AqBjmGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBymGT;AqBtmGC;;;EAGE,uBAAA;CrBwmGH;AqBnmGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrBinGT;AoB5lGD;EChBI,eAAA;EACA,0BAAA;CrB+mGH;AoB5lGD;ECtEE,eAAA;EACA,0BAAA;EACA,sBAAA;CrBqqGD;AqBnqGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBqqGP;AqBnqGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBqqGP;AqBnqGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBqqGP;AqBnqGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB2qGT;AqBxqGC;;;EAGE,uBAAA;CrB0qGH;AqBrqGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrBmrGT;AoB1pGD;ECpBI,eAAA;EACA,0BAAA;CrBirGH;AoB1pGD;EC1EE,eAAA;EACA,0BAAA;EACA,sBAAA;CrBuuGD;AqBruGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBuuGP;AqBruGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBuuGP;AqBruGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrBuuGP;AqBruGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB6uGT;AqB1uGC;;;EAGE,uBAAA;CrB4uGH;AqBvuGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrBqvGT;AoBxtGD;ECxBI,eAAA;EACA,0BAAA;CrBmvGH;AoBxtGD;EC9EE,eAAA;EACA,0BAAA;EACA,sBAAA;CrByyGD;AqBvyGC;;EAEE,eAAA;EACA,0BAAA;EACI,sBAAA;CrByyGP;AqBvyGC;EACE,eAAA;EACA,0BAAA;EACI,sBAAA;CrByyGP;AqBvyGC;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrByyGP;AqBvyGG;;;;;;;;;EAGE,eAAA;EACA,0BAAA;EACI,sBAAA;CrB+yGT;AqB5yGC;;;EAGE,uBAAA;CrB8yGH;AqBzyGG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACI,sBAAA;CrBuzGT;AoBtxGD;EC5BI,eAAA;EACA,0BAAA;CrBqzGH;AoBjxGD;EACE,eAAA;EACA,oBAAA;EACA,iBAAA;CpBmxGD;AoBjxGC;;;;;EAKE,8BAAA;EfnCF,yBAAA;EACQ,iBAAA;CLuzGT;AoBlxGC;;;;EAIE,0BAAA;CpBoxGH;AoBlxGC;;EAEE,eAAA;EACA,2BAAA;EACA,8BAAA;CpBoxGH;AoBhxGG;;;;EAEE,eAAA;EACA,sBAAA;CpBoxGL;AoB3wGD;;ECrEE,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CrBo1GD;AoB9wGD;;ECzEE,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrB21GD;AoBjxGD;;EC7EE,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrBk2GD;AoBhxGD;EACE,eAAA;EACA,YAAA;CpBkxGD;AoB9wGD;EACE,gBAAA;CpBgxGD;AoBzwGC;;;EACE,YAAA;CpB6wGH;AuBv6GD;EACE,WAAA;ElBoLA,yCAAA;EACK,oCAAA;EACG,iCAAA;CLsvGT;AuB16GC;EACE,WAAA;CvB46GH;AuBx6GD;EACE,cAAA;CvB06GD;AuBx6GC;EAAY,eAAA;CvB26Gb;AuB16GC;EAAY,mBAAA;CvB66Gb;AuB56GC;EAAY,yBAAA;CvB+6Gb;AuB56GD;EACE,mBAAA;EACA,UAAA;EACA,iBAAA;ElBuKA,gDAAA;EACQ,2CAAA;KAAA,wCAAA;EAOR,mCAAA;EACQ,8BAAA;KAAA,2BAAA;EAGR,yCAAA;EACQ,oCAAA;KAAA,iCAAA;CLgwGT;AwB18GD;EACE,sBAAA;EACA,SAAA;EACA,UAAA;EACA,iBAAA;EACA,uBAAA;EACA,uBAAA;EACA,yBAAA;EACA,oCAAA;EACA,mCAAA;CxB48GD;AwBx8GD;;EAEE,mBAAA;CxB08GD;AwBt8GD;EACE,WAAA;CxBw8GD;AwBp8GD;EACE,mBAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,YAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,0BAAA;EACA,0BAAA;EACA,sCAAA;EACA,mBAAA;EnBsBA,oDAAA;EACQ,4CAAA;EmBrBR,qCAAA;UAAA,6BAAA;CxBu8GD;AwBl8GC;EACE,SAAA;EACA,WAAA;CxBo8GH;AwB79GD;ECzBE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBy/GD;AwBn+GD;EAmCI,eAAA;EACA,kBAAA;EACA,YAAA;EACA,oBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxBm8GH;AwB77GC;;EAEE,sBAAA;EACA,eAAA;EACA,0BAAA;CxB+7GH;AwBz7GC;;;EAGE,eAAA;EACA,sBAAA;EACA,WAAA;EACA,0BAAA;CxB27GH;AwBl7GC;;;EAGE,eAAA;CxBo7GH;AwBh7GC;;EAEE,sBAAA;EACA,8BAAA;EACA,uBAAA;EE3GF,oEAAA;EF6GE,oBAAA;CxBk7GH;AwB76GD;EAGI,eAAA;CxB66GH;AwBh7GD;EAQI,WAAA;CxB26GH;AwBn6GD;EACE,WAAA;EACA,SAAA;CxBq6GD;AwB75GD;EACE,QAAA;EACA,YAAA;CxB+5GD;AwB35GD;EACE,eAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxB65GD;AwBz5GD;EACE,gBAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,OAAA;EACA,aAAA;CxB25GD;AwBv5GD;EACE,SAAA;EACA,WAAA;CxBy5GD;AwBj5GD;;EAII,cAAA;EACA,0BAAA;EACA,4BAAA;EACA,YAAA;CxBi5GH;AwBx5GD;;EAWI,UAAA;EACA,aAAA;EACA,mBAAA;CxBi5GH;AwB53GD;EAXE;IApEA,WAAA;IACA,SAAA;GxB+8GC;EwB54GD;IA1DA,QAAA;IACA,YAAA;GxBy8GC;CACF;A2BzlHD;;EAEE,mBAAA;EACA,sBAAA;EACA,uBAAA;C3B2lHD;A2B/lHD;;EAMI,mBAAA;EACA,YAAA;C3B6lHH;A2B3lHG;;;;;;;;EAIE,WAAA;C3BimHL;A2B3lHD;;;;EAKI,kBAAA;C3B4lHH;A2BvlHD;EACE,kBAAA;C3BylHD;A2B1lHD;;;EAOI,YAAA;C3BwlHH;A2B/lHD;;;EAYI,iBAAA;C3BwlHH;A2BplHD;EACE,iBAAA;C3BslHD;A2BllHD;EACE,eAAA;C3BolHD;A2BnlHC;EClDA,8BAAA;EACG,2BAAA;C5BwoHJ;A2BllHD;;EC/CE,6BAAA;EACG,0BAAA;C5BqoHJ;A2BjlHD;EACE,YAAA;C3BmlHD;A2BjlHD;EACE,iBAAA;C3BmlHD;A2BjlHD;;ECnEE,8BAAA;EACG,2BAAA;C5BwpHJ;A2BhlHD;ECjEE,6BAAA;EACG,0BAAA;C5BopHJ;A2B/kHD;;EAEE,WAAA;C3BilHD;A2BhkHD;EACE,kBAAA;EACA,mBAAA;C3BkkHD;A2BhkHD;EACE,mBAAA;EACA,oBAAA;C3BkkHD;A2B7jHD;EtB/CE,yDAAA;EACQ,iDAAA;CL+mHT;A2B7jHC;EtBnDA,yBAAA;EACQ,iBAAA;CLmnHT;A2B1jHD;EACE,eAAA;C3B4jHD;A2BzjHD;EACE,wBAAA;EACA,uBAAA;C3B2jHD;A2BxjHD;EACE,wBAAA;C3B0jHD;A2BnjHD;;;EAII,eAAA;EACA,YAAA;EACA,YAAA;EACA,gBAAA;C3BojHH;A2B3jHD;EAcM,YAAA;C3BgjHL;A2B9jHD;;;;EAsBI,iBAAA;EACA,eAAA;C3B8iHH;A2BziHC;EACE,iBAAA;C3B2iHH;A2BziHC;EACE,6BAAA;ECpKF,8BAAA;EACC,6BAAA;C5BgtHF;A2B1iHC;EACE,+BAAA;EChLF,2BAAA;EACC,0BAAA;C5B6tHF;A2B1iHD;EACE,iBAAA;C3B4iHD;A2B1iHD;;EC/KE,8BAAA;EACC,6BAAA;C5B6tHF;A2BziHD;EC7LE,2BAAA;EACC,0BAAA;C5ByuHF;A2BriHD;EACE,eAAA;EACA,YAAA;EACA,oBAAA;EACA,0BAAA;C3BuiHD;A2B3iHD;;EAOI,YAAA;EACA,oBAAA;EACA,UAAA;C3BwiHH;A2BjjHD;EAYI,YAAA;C3BwiHH;A2BpjHD;EAgBI,WAAA;C3BuiHH;A2BthHD;;;;EAKM,mBAAA;EACA,uBAAA;EACA,qBAAA;C3BuhHL;A6BjwHD;EACE,mBAAA;EACA,eAAA;EACA,0BAAA;C7BmwHD;A6BhwHC;EACE,YAAA;EACA,gBAAA;EACA,iBAAA;C7BkwHH;A6B3wHD;EAeI,mBAAA;EACA,WAAA;EAKA,YAAA;EAEA,YAAA;EACA,iBAAA;C7B0vHH;A6BjvHD;;;EV8BE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnBwtHD;AmBttHC;;;EACE,aAAA;EACA,kBAAA;CnB0tHH;AmBvtHC;;;;;;EAEE,aAAA;CnB6tHH;A6BnwHD;;;EVyBE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnB+uHD;AmB7uHC;;;EACE,aAAA;EACA,kBAAA;CnBivHH;AmB9uHC;;;;;;EAEE,aAAA;CnBovHH;A6BjxHD;;;EAGE,oBAAA;C7BmxHD;A6BjxHC;;;EACE,iBAAA;C7BqxHH;A6BjxHD;;EAEE,UAAA;EACA,oBAAA;EACA,uBAAA;C7BmxHD;A6B9wHD;EACE,kBAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;EACA,eAAA;EACA,mBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;C7BgxHD;A6B7wHC;EACE,kBAAA;EACA,gBAAA;EACA,mBAAA;C7B+wHH;A6B7wHC;EACE,mBAAA;EACA,gBAAA;EACA,mBAAA;C7B+wHH;A6BnyHD;;EA0BI,cAAA;C7B6wHH;A6BxwHD;;;;;;;EDhGE,8BAAA;EACG,2BAAA;C5Bi3HJ;A6BzwHD;EACE,gBAAA;C7B2wHD;A6BzwHD;;;;;;;EDpGE,6BAAA;EACG,0BAAA;C5Bs3HJ;A6B1wHD;EACE,eAAA;C7B4wHD;A6BvwHD;EACE,mBAAA;EAGA,aAAA;EACA,oBAAA;C7BuwHD;A6B5wHD;EAUI,mBAAA;C7BqwHH;A6B/wHD;EAYM,kBAAA;C7BswHL;A6BnwHG;;;EAGE,WAAA;C7BqwHL;A6BhwHC;;EAGI,mBAAA;C7BiwHL;A6B9vHC;;EAGI,WAAA;EACA,kBAAA;C7B+vHL;A8B15HD;EACE,iBAAA;EACA,gBAAA;EACA,iBAAA;C9B45HD;A8B/5HD;EAOI,mBAAA;EACA,eAAA;C9B25HH;A8Bn6HD;EAWM,mBAAA;EACA,eAAA;EACA,mBAAA;C9B25HL;A8B15HK;;EAEE,sBAAA;EACA,0BAAA;C9B45HP;A8Bv5HG;EACE,eAAA;C9By5HL;A8Bv5HK;;EAEE,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,oBAAA;C9By5HP;A8Bl5HG;;;EAGE,0BAAA;EACA,sBAAA;C9Bo5HL;A8B77HD;ELHE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBm8HD;A8Bn8HD;EA0DI,gBAAA;C9B44HH;A8Bn4HD;EACE,iCAAA;C9Bq4HD;A8Bt4HD;EAGI,YAAA;EAEA,oBAAA;C9Bq4HH;A8B14HD;EASM,kBAAA;EACA,wBAAA;EACA,8BAAA;EACA,2BAAA;C9Bo4HL;A8Bn4HK;EACE,sCAAA;C9Bq4HP;A8B/3HK;;;EAGE,eAAA;EACA,0BAAA;EACA,0BAAA;EACA,iCAAA;EACA,gBAAA;C9Bi4HP;A8B53HC;EAqDA,YAAA;EA8BA,iBAAA;C9B6yHD;A8Bh4HC;EAwDE,YAAA;C9B20HH;A8Bn4HC;EA0DI,mBAAA;EACA,mBAAA;C9B40HL;A8Bv4HC;EAgEE,UAAA;EACA,WAAA;C9B00HH;A8B9zHD;EAAA;IAPM,oBAAA;IACA,UAAA;G9By0HH;E8Bn0HH;IAJQ,iBAAA;G9B00HL;CACF;A8Bp5HC;EAuFE,gBAAA;EACA,mBAAA;C9Bg0HH;A8Bx5HC;;;EA8FE,0BAAA;C9B+zHH;A8BjzHD;EAAA;IATM,iCAAA;IACA,2BAAA;G9B8zHH;E8BtzHH;;;IAHM,6BAAA;G9B8zHH;CACF;A8B/5HD;EAEI,YAAA;C9Bg6HH;A8Bl6HD;EAMM,mBAAA;C9B+5HL;A8Br6HD;EASM,iBAAA;C9B+5HL;A8B15HK;;;EAGE,eAAA;EACA,0BAAA;C9B45HP;A8Bp5HD;EAEI,YAAA;C9Bq5HH;A8Bv5HD;EAIM,gBAAA;EACA,eAAA;C9Bs5HL;A8B14HD;EACE,YAAA;C9B44HD;A8B74HD;EAII,YAAA;C9B44HH;A8Bh5HD;EAMM,mBAAA;EACA,mBAAA;C9B64HL;A8Bp5HD;EAYI,UAAA;EACA,WAAA;C9B24HH;A8B/3HD;EAAA;IAPM,oBAAA;IACA,UAAA;G9B04HH;E8Bp4HH;IAJQ,iBAAA;G9B24HL;CACF;A8Bn4HD;EACE,iBAAA;C9Bq4HD;A8Bt4HD;EAKI,gBAAA;EACA,mBAAA;C9Bo4HH;A8B14HD;;;EAYI,0BAAA;C9Bm4HH;A8Br3HD;EAAA;IATM,iCAAA;IACA,2BAAA;G9Bk4HH;E8B13HH;;;IAHM,6BAAA;G9Bk4HH;CACF;A8Bz3HD;EAEI,cAAA;C9B03HH;A8B53HD;EAKI,eAAA;C9B03HH;A8Bj3HD;EAEE,iBAAA;EF3OA,2BAAA;EACC,0BAAA;C5B8lIF;A+BxlID;EACE,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,8BAAA;C/B0lID;A+BllID;EAAA;IAFI,mBAAA;G/BwlID;CACF;A+BzkID;EAAA;IAFI,YAAA;G/B+kID;CACF;A+BjkID;EACE,oBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,2DAAA;UAAA,mDAAA;EAEA,kCAAA;C/BkkID;A+BhkIC;EACE,iBAAA;C/BkkIH;A+BtiID;EAAA;IAxBI,YAAA;IACA,cAAA;IACA,yBAAA;YAAA,iBAAA;G/BkkID;E+BhkIC;IACE,0BAAA;IACA,wBAAA;IACA,kBAAA;IACA,6BAAA;G/BkkIH;E+B/jIC;IACE,oBAAA;G/BikIH;E+B5jIC;;;IAGE,gBAAA;IACA,iBAAA;G/B8jIH;CACF;A+B1jID;;EAGI,kBAAA;C/B2jIH;A+BtjIC;EAAA;;IAFI,kBAAA;G/B6jIH;CACF;A+BpjID;;;;EAII,oBAAA;EACA,mBAAA;C/BsjIH;A+BhjIC;EAAA;;;;IAHI,gBAAA;IACA,eAAA;G/B0jIH;CACF;A+B9iID;EACE,cAAA;EACA,sBAAA;C/BgjID;A+B3iID;EAAA;IAFI,iBAAA;G/BijID;CACF;A+B7iID;;EAEE,gBAAA;EACA,SAAA;EACA,QAAA;EACA,cAAA;C/B+iID;A+BziID;EAAA;;IAFI,iBAAA;G/BgjID;CACF;A+B9iID;EACE,OAAA;EACA,sBAAA;C/BgjID;A+B9iID;EACE,UAAA;EACA,iBAAA;EACA,sBAAA;C/BgjID;A+B1iID;EACE,YAAA;EACA,mBAAA;EACA,gBAAA;EACA,kBAAA;EACA,aAAA;C/B4iID;A+B1iIC;;EAEE,sBAAA;C/B4iIH;A+BrjID;EAaI,eAAA;C/B2iIH;A+BliID;EALI;;IAEE,mBAAA;G/B0iIH;CACF;A+BhiID;EACE,mBAAA;EACA,aAAA;EACA,mBAAA;EACA,kBAAA;EC9LA,gBAAA;EACA,mBAAA;ED+LA,8BAAA;EACA,uBAAA;EACA,8BAAA;EACA,mBAAA;C/BmiID;A+B/hIC;EACE,WAAA;C/BiiIH;A+B/iID;EAmBI,eAAA;EACA,YAAA;EACA,YAAA;EACA,mBAAA;C/B+hIH;A+BrjID;EAyBI,gBAAA;C/B+hIH;A+BzhID;EAAA;IAFI,cAAA;G/B+hID;CACF;A+BthID;EACE,oBAAA;C/BwhID;A+BzhID;EAII,kBAAA;EACA,qBAAA;EACA,kBAAA;C/BwhIH;A+B5/HC;EAAA;IAtBI,iBAAA;IACA,YAAA;IACA,YAAA;IACA,cAAA;IACA,8BAAA;IACA,UAAA;IACA,yBAAA;YAAA,iBAAA;G/BshIH;E+BtgID;;IAbM,2BAAA;G/BuhIL;E+B1gID;IAVM,kBAAA;G/BuhIL;E+BthIK;;IAEE,uBAAA;G/BwhIP;CACF;A+BtgID;EAAA;IAXI,YAAA;IACA,UAAA;G/BqhID;E+B3gIH;IAPM,YAAA;G/BqhIH;E+B9gIH;IALQ,kBAAA;IACA,qBAAA;G/BshIL;CACF;A+B3gID;EACE,mBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,qCAAA;E1B9NA,6FAAA;EACQ,qFAAA;E2B/DR,gBAAA;EACA,mBAAA;ChC4yID;AkB5xHD;EAAA;IA9DM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlB81HH;EkBlyHH;IAvDM,sBAAA;IACA,YAAA;IACA,uBAAA;GlB41HH;EkBvyHH;IAhDM,sBAAA;GlB01HH;EkB1yHH;IA5CM,sBAAA;IACA,uBAAA;GlBy1HH;EkB9yHH;;;IAtCQ,YAAA;GlBy1HL;EkBnzHH;IAhCM,YAAA;GlBs1HH;EkBtzHH;IA5BM,iBAAA;IACA,uBAAA;GlBq1HH;EkB1zHH;;IApBM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlBk1HH;EkBj0HH;;IAdQ,gBAAA;GlBm1HL;EkBr0HH;;IATM,mBAAA;IACA,eAAA;GlBk1HH;EkB10HH;IAHM,OAAA;GlBg1HH;CACF;A+BpjIC;EAAA;IANI,mBAAA;G/B8jIH;E+B5jIG;IACE,iBAAA;G/B8jIL;CACF;A+B7iID;EAAA;IARI,YAAA;IACA,UAAA;IACA,eAAA;IACA,gBAAA;IACA,eAAA;IACA,kBAAA;I1BzPF,yBAAA;IACQ,iBAAA;GLmzIP;CACF;A+BnjID;EACE,cAAA;EHpUA,2BAAA;EACC,0BAAA;C5B03IF;A+BnjID;EACE,iBAAA;EHzUA,6BAAA;EACC,4BAAA;EAOD,8BAAA;EACC,6BAAA;C5By3IF;A+B/iID;EChVE,gBAAA;EACA,mBAAA;ChCk4ID;A+BhjIC;ECnVA,iBAAA;EACA,oBAAA;ChCs4ID;A+BjjIC;ECtVA,iBAAA;EACA,oBAAA;ChC04ID;A+B3iID;EChWE,iBAAA;EACA,oBAAA;ChC84ID;A+BviID;EAAA;IAJI,YAAA;IACA,kBAAA;IACA,mBAAA;G/B+iID;CACF;A+BlhID;EAhBE;IExWA,uBAAA;GjC84IC;E+BriID;IE5WA,wBAAA;IF8WE,oBAAA;G/BuiID;E+BziID;IAKI,gBAAA;G/BuiIH;CACF;A+B9hID;EACE,0BAAA;EACA,sBAAA;C/BgiID;A+BliID;EAKI,eAAA;C/BgiIH;A+B/hIG;;EAEE,eAAA;EACA,8BAAA;C/BiiIL;A+B1iID;EAcI,eAAA;C/B+hIH;A+B7iID;EAmBM,eAAA;C/B6hIL;A+B3hIK;;EAEE,eAAA;EACA,8BAAA;C/B6hIP;A+BzhIK;;;EAGE,eAAA;EACA,0BAAA;C/B2hIP;A+BvhIK;;;EAGE,eAAA;EACA,8BAAA;C/ByhIP;A+BjkID;EA8CI,sBAAA;C/BshIH;A+BrhIG;;EAEE,0BAAA;C/BuhIL;A+BxkID;EAoDM,0BAAA;C/BuhIL;A+B3kID;;EA0DI,sBAAA;C/BqhIH;A+B9gIK;;;EAGE,0BAAA;EACA,eAAA;C/BghIP;A+B/+HC;EAAA;IAzBQ,eAAA;G/B4gIP;E+B3gIO;;IAEE,eAAA;IACA,8BAAA;G/B6gIT;E+BzgIO;;;IAGE,eAAA;IACA,0BAAA;G/B2gIT;E+BvgIO;;;IAGE,eAAA;IACA,8BAAA;G/BygIT;CACF;A+B3mID;EA8GI,eAAA;C/BggIH;A+B//HG;EACE,eAAA;C/BigIL;A+BjnID;EAqHI,eAAA;C/B+/HH;A+B9/HG;;EAEE,eAAA;C/BggIL;A+B5/HK;;;;EAEE,eAAA;C/BggIP;A+Bx/HD;EACE,0BAAA;EACA,sBAAA;C/B0/HD;A+B5/HD;EAKI,eAAA;C/B0/HH;A+Bz/HG;;EAEE,eAAA;EACA,8BAAA;C/B2/HL;A+BpgID;EAcI,eAAA;C/By/HH;A+BvgID;EAmBM,eAAA;C/Bu/HL;A+Br/HK;;EAEE,eAAA;EACA,8BAAA;C/Bu/HP;A+Bn/HK;;;EAGE,eAAA;EACA,0BAAA;C/Bq/HP;A+Bj/HK;;;EAGE,eAAA;EACA,8BAAA;C/Bm/HP;A+B3hID;EA+CI,sBAAA;C/B++HH;A+B9+HG;;EAEE,0BAAA;C/Bg/HL;A+BliID;EAqDM,0BAAA;C/Bg/HL;A+BriID;;EA2DI,sBAAA;C/B8+HH;A+Bx+HK;;;EAGE,0BAAA;EACA,eAAA;C/B0+HP;A+Bn8HC;EAAA;IA/BQ,sBAAA;G/Bs+HP;E+Bv8HD;IA5BQ,0BAAA;G/Bs+HP;E+B18HD;IAzBQ,eAAA;G/Bs+HP;E+Br+HO;;IAEE,eAAA;IACA,8BAAA;G/Bu+HT;E+Bn+HO;;;IAGE,eAAA;IACA,0BAAA;G/Bq+HT;E+Bj+HO;;;IAGE,eAAA;IACA,8BAAA;G/Bm+HT;CACF;A+B3kID;EA+GI,eAAA;C/B+9HH;A+B99HG;EACE,eAAA;C/Bg+HL;A+BjlID;EAsHI,eAAA;C/B89HH;A+B79HG;;EAEE,eAAA;C/B+9HL;A+B39HK;;;;EAEE,eAAA;C/B+9HP;AkCzmJD;EACE,kBAAA;EACA,oBAAA;EACA,iBAAA;EACA,0BAAA;EACA,mBAAA;ClC2mJD;AkChnJD;EAQI,sBAAA;ClC2mJH;AkCnnJD;EAWM,kBAAA;EACA,eAAA;EACA,eAAA;ClC2mJL;AkCxnJD;EAkBI,eAAA;ClCymJH;AmC7nJD;EACE,sBAAA;EACA,gBAAA;EACA,eAAA;EACA,mBAAA;CnC+nJD;AmCnoJD;EAOI,gBAAA;CnC+nJH;AmCtoJD;;EAUM,mBAAA;EACA,YAAA;EACA,kBAAA;EACA,wBAAA;EACA,sBAAA;EACA,eAAA;EACA,0BAAA;EACA,0BAAA;EACA,kBAAA;CnCgoJL;AmC9nJG;;EAGI,eAAA;EPXN,+BAAA;EACG,4BAAA;C5B2oJJ;AmC7nJG;;EPvBF,gCAAA;EACG,6BAAA;C5BwpJJ;AmCxnJG;;;;EAEE,WAAA;EACA,eAAA;EACA,0BAAA;EACA,sBAAA;CnC4nJL;AmCtnJG;;;;;;EAGE,WAAA;EACA,eAAA;EACA,0BAAA;EACA,sBAAA;EACA,gBAAA;CnC2nJL;AmClrJD;;;;;;EAkEM,eAAA;EACA,0BAAA;EACA,sBAAA;EACA,oBAAA;CnCwnJL;AmC/mJD;;EC3EM,mBAAA;EACA,gBAAA;EACA,uBAAA;CpC8rJL;AoC5rJG;;ERKF,+BAAA;EACG,4BAAA;C5B2rJJ;AoC3rJG;;ERTF,gCAAA;EACG,6BAAA;C5BwsJJ;AmC1nJD;;EChFM,kBAAA;EACA,gBAAA;EACA,iBAAA;CpC8sJL;AoC5sJG;;ERKF,+BAAA;EACG,4BAAA;C5B2sJJ;AoC3sJG;;ERTF,gCAAA;EACG,6BAAA;C5BwtJJ;AqC3tJD;EACE,gBAAA;EACA,eAAA;EACA,iBAAA;EACA,mBAAA;CrC6tJD;AqCjuJD;EAOI,gBAAA;CrC6tJH;AqCpuJD;;EAUM,sBAAA;EACA,kBAAA;EACA,0BAAA;EACA,0BAAA;EACA,oBAAA;CrC8tJL;AqC5uJD;;EAmBM,sBAAA;EACA,0BAAA;CrC6tJL;AqCjvJD;;EA2BM,aAAA;CrC0tJL;AqCrvJD;;EAkCM,YAAA;CrCutJL;AqCzvJD;;;;EA2CM,eAAA;EACA,0BAAA;EACA,oBAAA;CrCotJL;AsClwJD;EACE,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,kBAAA;EACA,eAAA;EACA,eAAA;EACA,mBAAA;EACA,oBAAA;EACA,yBAAA;EACA,qBAAA;CtCowJD;AsChwJG;;EAEE,eAAA;EACA,sBAAA;EACA,gBAAA;CtCkwJL;AsC7vJC;EACE,cAAA;CtC+vJH;AsC3vJC;EACE,mBAAA;EACA,UAAA;CtC6vJH;AsCtvJD;ECtCE,0BAAA;CvC+xJD;AuC5xJG;;EAEE,0BAAA;CvC8xJL;AsCzvJD;EC1CE,0BAAA;CvCsyJD;AuCnyJG;;EAEE,0BAAA;CvCqyJL;AsC5vJD;EC9CE,0BAAA;CvC6yJD;AuC1yJG;;EAEE,0BAAA;CvC4yJL;AsC/vJD;EClDE,0BAAA;CvCozJD;AuCjzJG;;EAEE,0BAAA;CvCmzJL;AsClwJD;ECtDE,0BAAA;CvC2zJD;AuCxzJG;;EAEE,0BAAA;CvC0zJL;AsCrwJD;EC1DE,0BAAA;CvCk0JD;AuC/zJG;;EAEE,0BAAA;CvCi0JL;AwCn0JD;EACE,sBAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,kBAAA;EACA,eAAA;EACA,eAAA;EACA,uBAAA;EACA,oBAAA;EACA,mBAAA;EACA,0BAAA;EACA,oBAAA;CxCq0JD;AwCl0JC;EACE,cAAA;CxCo0JH;AwCh0JC;EACE,mBAAA;EACA,UAAA;CxCk0JH;AwC/zJC;;EAEE,OAAA;EACA,iBAAA;CxCi0JH;AwC5zJG;;EAEE,eAAA;EACA,sBAAA;EACA,gBAAA;CxC8zJL;AwCzzJC;;EAEE,eAAA;EACA,0BAAA;CxC2zJH;AwCxzJC;EACE,aAAA;CxC0zJH;AwCvzJC;EACE,kBAAA;CxCyzJH;AwCtzJC;EACE,iBAAA;CxCwzJH;AyCl3JD;EACE,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,eAAA;EACA,0BAAA;CzCo3JD;AyCz3JD;;EASI,eAAA;CzCo3JH;AyC73JD;EAaI,oBAAA;EACA,gBAAA;EACA,iBAAA;CzCm3JH;AyCl4JD;EAmBI,0BAAA;CzCk3JH;AyC/2JC;;EAEE,mBAAA;CzCi3JH;AyCz4JD;EA4BI,gBAAA;CzCg3JH;AyC91JD;EAAA;IAdI,kBAAA;IACA,qBAAA;GzCg3JD;EyC92JC;;IAEE,mBAAA;IACA,oBAAA;GzCg3JH;EyCx2JH;;IAHM,gBAAA;GzC+2JH;CACF;A0C15JD;EACE,eAAA;EACA,aAAA;EACA,oBAAA;EACA,wBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;ErCiLA,4CAAA;EACK,uCAAA;EACG,oCAAA;CL4uJT;A0Ct6JD;;EAaI,kBAAA;EACA,mBAAA;C1C65JH;A0Cz5JC;;;EAGE,sBAAA;C1C25JH;A0Ch7JD;EA0BI,aAAA;EACA,eAAA;C1Cy5JH;A2Cl7JD;EACE,cAAA;EACA,oBAAA;EACA,8BAAA;EACA,mBAAA;C3Co7JD;A2Cx7JD;EAQI,cAAA;EAEA,eAAA;C3Ck7JH;A2C57JD;EAeI,kBAAA;C3Cg7JH;A2C/7JD;;EAqBI,iBAAA;C3C86JH;A2Cn8JD;EAyBI,gBAAA;C3C66JH;A2Cr6JD;;EAEE,oBAAA;C3Cu6JD;A2Cz6JD;;EAMI,mBAAA;EACA,UAAA;EACA,aAAA;EACA,eAAA;C3Cu6JH;A2C/5JD;ECvDE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Cy9JD;A2Cp6JD;EClDI,0BAAA;C5Cy9JH;A2Cv6JD;EC/CI,eAAA;C5Cy9JH;A2Ct6JD;EC3DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Co+JD;A2C36JD;ECtDI,0BAAA;C5Co+JH;A2C96JD;ECnDI,eAAA;C5Co+JH;A2C76JD;EC/DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C++JD;A2Cl7JD;EC1DI,0BAAA;C5C++JH;A2Cr7JD;ECvDI,eAAA;C5C++JH;A2Cp7JD;ECnEE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C0/JD;A2Cz7JD;EC9DI,0BAAA;C5C0/JH;A2C57JD;EC3DI,eAAA;C5C0/JH;A6C5/JD;EACE;IAAQ,4BAAA;G7C+/JP;E6C9/JD;IAAQ,yBAAA;G7CigKP;CACF;A6C9/JD;EACE;IAAQ,4BAAA;G7CigKP;E6ChgKD;IAAQ,yBAAA;G7CmgKP;CACF;A6CtgKD;EACE;IAAQ,4BAAA;G7CigKP;E6ChgKD;IAAQ,yBAAA;G7CmgKP;CACF;A6C5/JD;EACE,iBAAA;EACA,aAAA;EACA,oBAAA;EACA,0BAAA;EACA,mBAAA;ExCsCA,uDAAA;EACQ,+CAAA;CLy9JT;A6C3/JD;EACE,YAAA;EACA,UAAA;EACA,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,eAAA;EACA,mBAAA;EACA,0BAAA;ExCyBA,uDAAA;EACQ,+CAAA;EAyHR,oCAAA;EACK,+BAAA;EACG,4BAAA;CL62JT;A6Cx/JD;;ECCI,8MAAA;EACA,yMAAA;EACA,sMAAA;EDAF,mCAAA;UAAA,2BAAA;C7C4/JD;A6Cr/JD;;ExC5CE,2DAAA;EACK,sDAAA;EACG,mDAAA;CLqiKT;A6Cl/JD;EErEE,0BAAA;C/C0jKD;A+CvjKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C0gKH;A6Ct/JD;EEzEE,0BAAA;C/CkkKD;A+C/jKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9CkhKH;A6C1/JD;EE7EE,0BAAA;C/C0kKD;A+CvkKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C0hKH;A6C9/JD;EEjFE,0BAAA;C/CklKD;A+C/kKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9CkiKH;AgD1lKD;EAEE,iBAAA;ChD2lKD;AgDzlKC;EACE,cAAA;ChD2lKH;AgDvlKD;;EAEE,QAAA;EACA,iBAAA;ChDylKD;AgDtlKD;EACE,eAAA;ChDwlKD;AgDrlKD;EACE,eAAA;ChDulKD;AgDplKC;EACE,gBAAA;ChDslKH;AgDllKD;;EAEE,mBAAA;ChDolKD;AgDjlKD;;EAEE,oBAAA;ChDmlKD;AgDhlKD;;;EAGE,oBAAA;EACA,oBAAA;ChDklKD;AgD/kKD;EACE,uBAAA;ChDilKD;AgD9kKD;EACE,uBAAA;ChDglKD;AgD5kKD;EACE,cAAA;EACA,mBAAA;ChD8kKD;AgDxkKD;EACE,gBAAA;EACA,iBAAA;ChD0kKD;AiDjoKD;EAEE,oBAAA;EACA,gBAAA;CjDkoKD;AiD1nKD;EACE,mBAAA;EACA,eAAA;EACA,mBAAA;EAEA,oBAAA;EACA,0BAAA;EACA,0BAAA;CjD2nKD;AiDxnKC;ErB3BA,6BAAA;EACC,4BAAA;C5BspKF;AiDznKC;EACE,iBAAA;ErBvBF,gCAAA;EACC,+BAAA;C5BmpKF;AiDlnKD;;EAEE,eAAA;CjDonKD;AiDtnKD;;EAKI,eAAA;CjDqnKH;AiDjnKC;;;;EAEE,sBAAA;EACA,eAAA;EACA,0BAAA;CjDqnKH;AiDjnKD;EACE,YAAA;EACA,iBAAA;CjDmnKD;AiD9mKC;;;EAGE,0BAAA;EACA,eAAA;EACA,oBAAA;CjDgnKH;AiDrnKC;;;EASI,eAAA;CjDinKL;AiD1nKC;;;EAYI,eAAA;CjDmnKL;AiD9mKC;;;EAGE,WAAA;EACA,eAAA;EACA,0BAAA;EACA,sBAAA;CjDgnKH;AiDtnKC;;;;;;;;;EAYI,eAAA;CjDqnKL;AiDjoKC;;;EAeI,eAAA;CjDunKL;AkDztKC;EACE,eAAA;EACA,0BAAA;ClD2tKH;AkDztKG;;EAEE,eAAA;ClD2tKL;AkD7tKG;;EAKI,eAAA;ClD4tKP;AkDztKK;;;;EAEE,eAAA;EACA,0BAAA;ClD6tKP;AkD3tKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDguKP;AkDtvKC;EACE,eAAA;EACA,0BAAA;ClDwvKH;AkDtvKG;;EAEE,eAAA;ClDwvKL;AkD1vKG;;EAKI,eAAA;ClDyvKP;AkDtvKK;;;;EAEE,eAAA;EACA,0BAAA;ClD0vKP;AkDxvKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD6vKP;AkDnxKC;EACE,eAAA;EACA,0BAAA;ClDqxKH;AkDnxKG;;EAEE,eAAA;ClDqxKL;AkDvxKG;;EAKI,eAAA;ClDsxKP;AkDnxKK;;;;EAEE,eAAA;EACA,0BAAA;ClDuxKP;AkDrxKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD0xKP;AkDhzKC;EACE,eAAA;EACA,0BAAA;ClDkzKH;AkDhzKG;;EAEE,eAAA;ClDkzKL;AkDpzKG;;EAKI,eAAA;ClDmzKP;AkDhzKK;;;;EAEE,eAAA;EACA,0BAAA;ClDozKP;AkDlzKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDuzKP;AiDttKD;EACE,cAAA;EACA,mBAAA;CjDwtKD;AiDttKD;EACE,iBAAA;EACA,iBAAA;CjDwtKD;AmDl1KD;EACE,oBAAA;EACA,0BAAA;EACA,8BAAA;EACA,mBAAA;E9C0DA,kDAAA;EACQ,0CAAA;CL2xKT;AmDj1KD;EACE,cAAA;CnDm1KD;AmD90KD;EACE,mBAAA;EACA,qCAAA;EvBpBA,6BAAA;EACC,4BAAA;C5Bq2KF;AmDp1KD;EAMI,eAAA;CnDi1KH;AmD50KD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,eAAA;CnD80KD;AmDl1KD;;;;;EAWI,eAAA;CnD80KH;AmDz0KD;EACE,mBAAA;EACA,0BAAA;EACA,8BAAA;EvBxCA,gCAAA;EACC,+BAAA;C5Bo3KF;AmDn0KD;;EAGI,iBAAA;CnDo0KH;AmDv0KD;;EAMM,oBAAA;EACA,iBAAA;CnDq0KL;AmDj0KG;;EAEI,cAAA;EvBvEN,6BAAA;EACC,4BAAA;C5B24KF;AmD/zKG;;EAEI,iBAAA;EvBvEN,gCAAA;EACC,+BAAA;C5By4KF;AmDx1KD;EvB1DE,2BAAA;EACC,0BAAA;C5Bq5KF;AmD3zKD;EAEI,oBAAA;CnD4zKH;AmDzzKD;EACE,oBAAA;CnD2zKD;AmDnzKD;;;EAII,iBAAA;CnDozKH;AmDxzKD;;;EAOM,mBAAA;EACA,oBAAA;CnDszKL;AmD9zKD;;EvBzGE,6BAAA;EACC,4BAAA;C5B26KF;AmDn0KD;;;;EAmBQ,4BAAA;EACA,6BAAA;CnDszKP;AmD10KD;;;;;;;;EAwBU,4BAAA;CnD4zKT;AmDp1KD;;;;;;;;EA4BU,6BAAA;CnDk0KT;AmD91KD;;EvBjGE,gCAAA;EACC,+BAAA;C5Bm8KF;AmDn2KD;;;;EAyCQ,+BAAA;EACA,gCAAA;CnDg0KP;AmD12KD;;;;;;;;EA8CU,+BAAA;CnDs0KT;AmDp3KD;;;;;;;;EAkDU,gCAAA;CnD40KT;AmD93KD;;;;EA2DI,8BAAA;CnDy0KH;AmDp4KD;;EA+DI,cAAA;CnDy0KH;AmDx4KD;;EAmEI,UAAA;CnDy0KH;AmD54KD;;;;;;;;;;;;EA0EU,eAAA;CnDg1KT;AmD15KD;;;;;;;;;;;;EA8EU,gBAAA;CnD01KT;AmDx6KD;;;;;;;;EAuFU,iBAAA;CnD21KT;AmDl7KD;;;;;;;;EAgGU,iBAAA;CnD41KT;AmD57KD;EAsGI,UAAA;EACA,iBAAA;CnDy1KH;AmD/0KD;EACE,oBAAA;CnDi1KD;AmDl1KD;EAKI,iBAAA;EACA,mBAAA;CnDg1KH;AmDt1KD;EASM,gBAAA;CnDg1KL;AmDz1KD;EAcI,iBAAA;CnD80KH;AmD51KD;;EAkBM,8BAAA;CnD80KL;AmDh2KD;EAuBI,cAAA;CnD40KH;AmDn2KD;EAyBM,iCAAA;CnD60KL;AmDt0KD;EC1PE,sBAAA;CpDmkLD;AoDjkLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDmkLH;AoDtkLC;EAMI,0BAAA;CpDmkLL;AoDzkLC;EASI,eAAA;EACA,0BAAA;CpDmkLL;AoDhkLC;EAEI,6BAAA;CpDikLL;AmDr1KD;EC7PE,sBAAA;CpDqlLD;AoDnlLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDqlLH;AoDxlLC;EAMI,0BAAA;CpDqlLL;AoD3lLC;EASI,eAAA;EACA,0BAAA;CpDqlLL;AoDllLC;EAEI,6BAAA;CpDmlLL;AmDp2KD;EChQE,sBAAA;CpDumLD;AoDrmLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDumLH;AoD1mLC;EAMI,0BAAA;CpDumLL;AoD7mLC;EASI,eAAA;EACA,0BAAA;CpDumLL;AoDpmLC;EAEI,6BAAA;CpDqmLL;AmDn3KD;ECnQE,sBAAA;CpDynLD;AoDvnLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDynLH;AoD5nLC;EAMI,0BAAA;CpDynLL;AoD/nLC;EASI,eAAA;EACA,0BAAA;CpDynLL;AoDtnLC;EAEI,6BAAA;CpDunLL;AmDl4KD;ECtQE,sBAAA;CpD2oLD;AoDzoLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD2oLH;AoD9oLC;EAMI,0BAAA;CpD2oLL;AoDjpLC;EASI,eAAA;EACA,0BAAA;CpD2oLL;AoDxoLC;EAEI,6BAAA;CpDyoLL;AmDj5KD;ECzQE,sBAAA;CpD6pLD;AoD3pLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD6pLH;AoDhqLC;EAMI,0BAAA;CpD6pLL;AoDnqLC;EASI,eAAA;EACA,0BAAA;CpD6pLL;AoD1pLC;EAEI,6BAAA;CpD2pLL;AqD3qLD;EACE,mBAAA;EACA,eAAA;EACA,UAAA;EACA,WAAA;EACA,iBAAA;CrD6qLD;AqDlrLD;;;;;EAYI,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,aAAA;EACA,YAAA;EACA,UAAA;CrD6qLH;AqDxqLD;EACE,uBAAA;CrD0qLD;AqDtqLD;EACE,oBAAA;CrDwqLD;AsDnsLD;EACE,iBAAA;EACA,cAAA;EACA,oBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;EjDwDA,wDAAA;EACQ,gDAAA;CL8oLT;AsD7sLD;EASI,mBAAA;EACA,kCAAA;CtDusLH;AsDlsLD;EACE,cAAA;EACA,mBAAA;CtDosLD;AsDlsLD;EACE,aAAA;EACA,mBAAA;CtDosLD;AuD1tLD;EACE,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,eAAA;EACA,eAAA;EACA,6BAAA;EjCRA,aAAA;EAGA,0BAAA;CtBmuLD;AuD3tLC;;EAEE,eAAA;EACA,sBAAA;EACA,gBAAA;EjCfF,aAAA;EAGA,0BAAA;CtB2uLD;AuDvtLC;EACE,WAAA;EACA,gBAAA;EACA,wBAAA;EACA,UAAA;EACA,yBAAA;CvDytLH;AwD9uLD;EACE,iBAAA;CxDgvLD;AwD5uLD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,kCAAA;EAIA,WAAA;CxD2uLD;AwDxuLC;EnD+GA,sCAAA;EACI,kCAAA;EACC,iCAAA;EACG,8BAAA;EAkER,oDAAA;EAEK,0CAAA;EACG,oCAAA;CL2jLT;AwD9uLC;EnD2GA,mCAAA;EACI,+BAAA;EACC,8BAAA;EACG,2BAAA;CLsoLT;AwDlvLD;EACE,mBAAA;EACA,iBAAA;CxDovLD;AwDhvLD;EACE,mBAAA;EACA,YAAA;EACA,aAAA;CxDkvLD;AwD9uLD;EACE,mBAAA;EACA,0BAAA;EACA,0BAAA;EACA,qCAAA;EACA,mBAAA;EnDaA,iDAAA;EACQ,yCAAA;EmDZR,qCAAA;UAAA,6BAAA;EAEA,WAAA;CxDgvLD;AwD5uLD;EACE,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,0BAAA;CxD8uLD;AwD5uLC;ElCrEA,WAAA;EAGA,yBAAA;CtBkzLD;AwD/uLC;ElCtEA,aAAA;EAGA,0BAAA;CtBszLD;AwD9uLD;EACE,cAAA;EACA,iCAAA;EACA,0BAAA;CxDgvLD;AwD7uLD;EACE,iBAAA;CxD+uLD;AwD3uLD;EACE,UAAA;EACA,wBAAA;CxD6uLD;AwDxuLD;EACE,mBAAA;EACA,cAAA;CxD0uLD;AwDtuLD;EACE,cAAA;EACA,kBAAA;EACA,8BAAA;CxDwuLD;AwD3uLD;EAQI,iBAAA;EACA,iBAAA;CxDsuLH;AwD/uLD;EAaI,kBAAA;CxDquLH;AwDlvLD;EAiBI,eAAA;CxDouLH;AwD/tLD;EACE,mBAAA;EACA,aAAA;EACA,YAAA;EACA,aAAA;EACA,iBAAA;CxDiuLD;AwD/sLD;EAZE;IACE,aAAA;IACA,kBAAA;GxD8tLD;EwD5tLD;InDvEA,kDAAA;IACQ,0CAAA;GLsyLP;EwD3tLD;IAAY,aAAA;GxD8tLX;CACF;AwDztLD;EAFE;IAAY,aAAA;GxD+tLX;CACF;AyD92LD;EACE,mBAAA;EACA,cAAA;EACA,eAAA;ECRA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;EDHA,gBAAA;EnCVA,WAAA;EAGA,yBAAA;CtBq4LD;AyD13LC;EnCdA,aAAA;EAGA,0BAAA;CtBy4LD;AyD73LC;EAAW,iBAAA;EAAmB,eAAA;CzDi4L/B;AyDh4LC;EAAW,iBAAA;EAAmB,eAAA;CzDo4L/B;AyDn4LC;EAAW,gBAAA;EAAmB,eAAA;CzDu4L/B;AyDt4LC;EAAW,kBAAA;EAAmB,eAAA;CzD04L/B;AyDt4LD;EACE,iBAAA;EACA,iBAAA;EACA,eAAA;EACA,mBAAA;EACA,0BAAA;EACA,mBAAA;CzDw4LD;AyDp4LD;EACE,mBAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;CzDs4LD;AyDl4LC;EACE,UAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,0BAAA;CzDo4LH;AyDl4LC;EACE,UAAA;EACA,WAAA;EACA,oBAAA;EACA,wBAAA;EACA,0BAAA;CzDo4LH;AyDl4LC;EACE,UAAA;EACA,UAAA;EACA,oBAAA;EACA,wBAAA;EACA,0BAAA;CzDo4LH;AyDl4LC;EACE,SAAA;EACA,QAAA;EACA,iBAAA;EACA,4BAAA;EACA,4BAAA;CzDo4LH;AyDl4LC;EACE,SAAA;EACA,SAAA;EACA,iBAAA;EACA,4BAAA;EACA,2BAAA;CzDo4LH;AyDl4LC;EACE,OAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,6BAAA;CzDo4LH;AyDl4LC;EACE,OAAA;EACA,WAAA;EACA,iBAAA;EACA,wBAAA;EACA,6BAAA;CzDo4LH;AyDl4LC;EACE,OAAA;EACA,UAAA;EACA,iBAAA;EACA,wBAAA;EACA,6BAAA;CzDo4LH;A2Dj+LD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,iBAAA;EACA,aAAA;EDXA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;ECAA,gBAAA;EAEA,0BAAA;EACA,qCAAA;UAAA,6BAAA;EACA,0BAAA;EACA,qCAAA;EACA,mBAAA;EtD8CA,kDAAA;EACQ,0CAAA;CLi8LT;A2D5+LC;EAAY,kBAAA;C3D++Lb;A2D9+LC;EAAY,kBAAA;C3Di/Lb;A2Dh/LC;EAAY,iBAAA;C3Dm/Lb;A2Dl/LC;EAAY,mBAAA;C3Dq/Lb;A2Dl/LD;EACE,UAAA;EACA,kBAAA;EACA,gBAAA;EACA,0BAAA;EACA,iCAAA;EACA,2BAAA;C3Do/LD;A2Dj/LD;EACE,kBAAA;C3Dm/LD;A2D3+LC;;EAEE,mBAAA;EACA,eAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;C3D6+LH;A2D1+LD;EACE,mBAAA;C3D4+LD;A2D1+LD;EACE,mBAAA;EACA,YAAA;C3D4+LD;A2Dx+LC;EACE,UAAA;EACA,mBAAA;EACA,uBAAA;EACA,0BAAA;EACA,sCAAA;EACA,cAAA;C3D0+LH;A2Dz+LG;EACE,aAAA;EACA,YAAA;EACA,mBAAA;EACA,uBAAA;EACA,0BAAA;C3D2+LL;A2Dx+LC;EACE,SAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,4BAAA;EACA,wCAAA;C3D0+LH;A2Dz+LG;EACE,aAAA;EACA,UAAA;EACA,cAAA;EACA,qBAAA;EACA,4BAAA;C3D2+LL;A2Dx+LC;EACE,UAAA;EACA,mBAAA;EACA,oBAAA;EACA,6BAAA;EACA,yCAAA;EACA,WAAA;C3D0+LH;A2Dz+LG;EACE,aAAA;EACA,SAAA;EACA,mBAAA;EACA,oBAAA;EACA,6BAAA;C3D2+LL;A2Dv+LC;EACE,SAAA;EACA,aAAA;EACA,kBAAA;EACA,sBAAA;EACA,2BAAA;EACA,uCAAA;C3Dy+LH;A2Dx+LG;EACE,aAAA;EACA,WAAA;EACA,sBAAA;EACA,2BAAA;EACA,cAAA;C3D0+LL;A4DnmMD;EACE,mBAAA;C5DqmMD;A4DlmMD;EACE,mBAAA;EACA,iBAAA;EACA,YAAA;C5DomMD;A4DvmMD;EAMI,cAAA;EACA,mBAAA;EvD6KF,0CAAA;EACK,qCAAA;EACG,kCAAA;CLw7LT;A4D9mMD;;EAcM,eAAA;C5DomML;A4D1kMC;EAAA;IvDiKA,uDAAA;IAEK,6CAAA;IACG,uCAAA;IA7JR,oCAAA;IAEQ,4BAAA;IA+GR,4BAAA;IAEQ,oBAAA;GL69LP;E4DxmMG;;IvDmHJ,2CAAA;IACQ,mCAAA;IuDjHF,QAAA;G5D2mML;E4DzmMG;;IvD8GJ,4CAAA;IACQ,oCAAA;IuD5GF,QAAA;G5D4mML;E4D1mMG;;;IvDyGJ,wCAAA;IACQ,gCAAA;IuDtGF,QAAA;G5D6mML;CACF;A4DnpMD;;;EA6CI,eAAA;C5D2mMH;A4DxpMD;EAiDI,QAAA;C5D0mMH;A4D3pMD;;EAsDI,mBAAA;EACA,OAAA;EACA,YAAA;C5DymMH;A4DjqMD;EA4DI,WAAA;C5DwmMH;A4DpqMD;EA+DI,YAAA;C5DwmMH;A4DvqMD;;EAmEI,QAAA;C5DwmMH;A4D3qMD;EAuEI,YAAA;C5DumMH;A4D9qMD;EA0EI,WAAA;C5DumMH;A4D/lMD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EtC9FA,aAAA;EAGA,0BAAA;EsC6FA,gBAAA;EACA,eAAA;EACA,mBAAA;EACA,0CAAA;C5DkmMD;A4D7lMC;EdlGE,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9CksMH;A4DjmMC;EACE,WAAA;EACA,SAAA;EdvGA,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9C2sMH;A4DnmMC;;EAEE,WAAA;EACA,eAAA;EACA,sBAAA;EtCtHF,aAAA;EAGA,0BAAA;CtB0tMD;A4DpoMD;;;;EAsCI,mBAAA;EACA,SAAA;EACA,kBAAA;EACA,WAAA;EACA,sBAAA;C5DomMH;A4D9oMD;;EA8CI,UAAA;EACA,mBAAA;C5DomMH;A4DnpMD;;EAmDI,WAAA;EACA,oBAAA;C5DomMH;A4DxpMD;;EAwDI,YAAA;EACA,aAAA;EACA,eAAA;EACA,mBAAA;C5DomMH;A4D/lMG;EACE,iBAAA;C5DimML;A4D7lMG;EACE,iBAAA;C5D+lML;A4DrlMD;EACE,mBAAA;EACA,aAAA;EACA,UAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;C5DulMD;A4DhmMD;EAYI,sBAAA;EACA,YAAA;EACA,aAAA;EACA,YAAA;EACA,oBAAA;EACA,0BAAA;EACA,oBAAA;EACA,gBAAA;EAWA,0BAAA;EACA,mCAAA;C5D6kMH;A4D5mMD;EAkCI,UAAA;EACA,YAAA;EACA,aAAA;EACA,0BAAA;C5D6kMH;A4DtkMD;EACE,mBAAA;EACA,UAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,eAAA;EACA,mBAAA;EACA,0CAAA;C5DwkMD;A4DvkMC;EACE,kBAAA;C5DykMH;A4DhiMD;EAhCE;;;;IAKI,YAAA;IACA,aAAA;IACA,kBAAA;IACA,gBAAA;G5DkkMH;E4D1kMD;;IAYI,mBAAA;G5DkkMH;E4D9kMD;;IAgBI,oBAAA;G5DkkMH;E4D7jMD;IACE,UAAA;IACA,WAAA;IACA,qBAAA;G5D+jMD;E4D3jMD;IACE,aAAA;G5D6jMD;CACF;A6D3zMC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE,aAAA;EACA,eAAA;C7Dy1MH;A6Dv1MC;;;;;;;;;;;;;;;EACE,YAAA;C7Du2MH;AiC/2MD;E6BRE,eAAA;EACA,kBAAA;EACA,mBAAA;C9D03MD;AiCj3MD;EACE,wBAAA;CjCm3MD;AiCj3MD;EACE,uBAAA;CjCm3MD;AiC32MD;EACE,yBAAA;CjC62MD;AiC32MD;EACE,0BAAA;CjC62MD;AiC32MD;EACE,mBAAA;CjC62MD;AiC32MD;E8BzBE,YAAA;EACA,mBAAA;EACA,kBAAA;EACA,8BAAA;EACA,UAAA;C/Du4MD;AiCz2MD;EACE,yBAAA;CjC22MD;AiCp2MD;EACE,gBAAA;CjCs2MD;AgEv4MD;EACE,oBAAA;ChEy4MD;AgEn4MD;;;;ECdE,yBAAA;CjEu5MD;AgEl4MD;;;;;;;;;;;;EAYE,yBAAA;ChEo4MD;AgE73MD;EAAA;IChDE,0BAAA;GjEi7MC;EiEh7MD;IAAU,0BAAA;GjEm7MT;EiEl7MD;IAAU,8BAAA;GjEq7MT;EiEp7MD;;IACU,+BAAA;GjEu7MT;CACF;AgEv4MD;EAAA;IAFI,0BAAA;GhE64MD;CACF;AgEv4MD;EAAA;IAFI,2BAAA;GhE64MD;CACF;AgEv4MD;EAAA;IAFI,iCAAA;GhE64MD;CACF;AgEt4MD;EAAA;ICrEE,0BAAA;GjE+8MC;EiE98MD;IAAU,0BAAA;GjEi9MT;EiEh9MD;IAAU,8BAAA;GjEm9MT;EiEl9MD;;IACU,+BAAA;GjEq9MT;CACF;AgEh5MD;EAAA;IAFI,0BAAA;GhEs5MD;CACF;AgEh5MD;EAAA;IAFI,2BAAA;GhEs5MD;CACF;AgEh5MD;EAAA;IAFI,iCAAA;GhEs5MD;CACF;AgE/4MD;EAAA;IC1FE,0BAAA;GjE6+MC;EiE5+MD;IAAU,0BAAA;GjE++MT;EiE9+MD;IAAU,8BAAA;GjEi/MT;EiEh/MD;;IACU,+BAAA;GjEm/MT;CACF;AgEz5MD;EAAA;IAFI,0BAAA;GhE+5MD;CACF;AgEz5MD;EAAA;IAFI,2BAAA;GhE+5MD;CACF;AgEz5MD;EAAA;IAFI,iCAAA;GhE+5MD;CACF;AgEx5MD;EAAA;IC/GE,0BAAA;GjE2gNC;EiE1gND;IAAU,0BAAA;GjE6gNT;EiE5gND;IAAU,8BAAA;GjE+gNT;EiE9gND;;IACU,+BAAA;GjEihNT;CACF;AgEl6MD;EAAA;IAFI,0BAAA;GhEw6MD;CACF;AgEl6MD;EAAA;IAFI,2BAAA;GhEw6MD;CACF;AgEl6MD;EAAA;IAFI,iCAAA;GhEw6MD;CACF;AgEj6MD;EAAA;IC5HE,yBAAA;GjEiiNC;CACF;AgEj6MD;EAAA;ICjIE,yBAAA;GjEsiNC;CACF;AgEj6MD;EAAA;ICtIE,yBAAA;GjE2iNC;CACF;AgEj6MD;EAAA;IC3IE,yBAAA;GjEgjNC;CACF;AgE95MD;ECnJE,yBAAA;CjEojND;AgE35MD;EAAA;ICjKE,0BAAA;GjEgkNC;EiE/jND;IAAU,0BAAA;GjEkkNT;EiEjkND;IAAU,8BAAA;GjEokNT;EiEnkND;;IACU,+BAAA;GjEskNT;CACF;AgEz6MD;EACE,yBAAA;ChE26MD;AgEt6MD;EAAA;IAFI,0BAAA;GhE46MD;CACF;AgE16MD;EACE,yBAAA;ChE46MD;AgEv6MD;EAAA;IAFI,2BAAA;GhE66MD;CACF;AgE36MD;EACE,yBAAA;ChE66MD;AgEx6MD;EAAA;IAFI,iCAAA;GhE86MD;CACF;AgEv6MD;EAAA;ICpLE,yBAAA;GjE+lNC;CACF","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\2a\";\n}\n.glyphicon-plus:before {\n content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #ffffff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #ffffff;\n background-color: #333333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #dddddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #dddddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #dddddd;\n}\n.table .table {\n background-color: #ffffff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #dddddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #ffffff;\n background-image: none;\n border: 1px solid #cccccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 14.333333px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333333;\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default .badge {\n color: #ffffff;\n background-color: #333333;\n}\n.btn-primary {\n color: #ffffff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #ffffff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #ffffff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #ffffff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #ffffff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.btn-success {\n color: #ffffff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #ffffff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #ffffff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #ffffff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #ffffff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #ffffff;\n}\n.btn-info {\n color: #ffffff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #ffffff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #ffffff;\n}\n.btn-warning {\n color: #ffffff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #ffffff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #ffffff;\n}\n.btn-danger {\n color: #ffffff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #ffffff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #ffffff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #ffffff;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #ffffff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-bottom-left-radius: 4px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #dddddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #dddddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #ffffff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #dddddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #dddddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777777;\n}\n.navbar-default .navbar-link:hover {\n color: #333333;\n}\n.navbar-default .btn-link {\n color: #777777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #cccccc;\n}\n.navbar-inverse {\n background-color: #222222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #ffffff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #ffffff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #ffffff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #ffffff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #cccccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 3;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #dddddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #ffffff;\n border-color: #dddddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #ffffff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #ffffff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #ffffff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #ffffff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #ffffff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #dddddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #dddddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #dddddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #dddddd;\n}\n.panel-default {\n border-color: #dddddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #dddddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #dddddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #dddddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #ffffff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #ffffff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000000;\n text-shadow: 0 1px 0 #ffffff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #ffffff;\n border: 1px solid #999999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n min-height: 16.42857143px;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #ffffff;\n text-align: center;\n background-color: #000000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #ffffff;\n background-clip: padding-box;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #ffffff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #ffffff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #ffffff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #ffffff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #ffffff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #ffffff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #ffffff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -15px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -15px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\2a\"; } }\n.glyphicon-plus { &:before { content: \"\\2b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @grid-float-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n }\n\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848\n//\n// Note that as of 8.3, iOS doesn't support `datetime` or `week`.\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"],\n input[type=\"time\"],\n input[type=\"datetime-local\"],\n input[type=\"month\"] {\n &.form-control {\n line-height: @input-height-base;\n }\n\n &.input-sm,\n .input-group-sm & {\n line-height: @input-height-small;\n }\n\n &.input-lg,\n .input-group-lg & {\n line-height: @input-height-large;\n }\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: @form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n &[disabled],\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n &.disabled,\n fieldset[disabled] & {\n label {\n cursor: @cursor-disabled;\n }\n }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n // Size it appropriately next to real form controls\n padding-top: (@padding-base-vertical + 1);\n padding-bottom: (@padding-base-vertical + 1);\n // Remove default margin from `p`\n margin-bottom: 0;\n min-height: (@line-height-computed + @font-size-base);\n\n &.input-lg,\n &.input-sm {\n padding-left: 0;\n padding-right: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n.input-sm {\n .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n}\n.form-group-sm {\n .form-control {\n height: @input-height-small;\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n border-radius: @input-border-radius-small;\n }\n select.form-control {\n height: @input-height-small;\n line-height: @input-height-small;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: @input-height-small;\n min-height: (@line-height-computed + @font-size-small);\n padding: (@padding-small-vertical + 1) @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n }\n}\n\n.input-lg {\n .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n}\n.form-group-lg {\n .form-control {\n height: @input-height-large;\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n border-radius: @input-border-radius-large;\n }\n select.form-control {\n height: @input-height-large;\n line-height: @input-height-large;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: @input-height-large;\n min-height: (@line-height-computed + @font-size-large);\n padding: (@padding-large-vertical + 1) @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n }\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n // Enable absolute positioning\n position: relative;\n\n // Ensure icons don't overlap text\n .form-control {\n padding-right: (@input-height-base * 1.25);\n }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2; // Ensure icon is above input groups\n display: block;\n width: @input-height-base;\n height: @input-height-base;\n line-height: @input-height-base;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: @input-height-large;\n height: @input-height-large;\n line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: @input-height-small;\n height: @input-height-small;\n line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n & ~ .form-control-feedback {\n top: (@line-height-computed + 5); // Height of the `label` and its margin\n }\n &.sr-only ~ .form-control-feedback {\n top: 0;\n }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n display: block; // account for any element using help-block\n margin-top: 5px;\n margin-bottom: 10px;\n color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n // Kick in the inline\n @media (min-width: @screen-sm-min) {\n // Inline-block all the things for \"inline\"\n .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // In navbar-form, allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-static {\n display: inline-block;\n }\n\n .input-group {\n display: inline-table;\n vertical-align: middle;\n\n .input-group-addon,\n .input-group-btn,\n .form-control {\n width: auto;\n }\n }\n\n // Input groups need that 100% width though\n .input-group > .form-control {\n width: 100%;\n }\n\n .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .radio,\n .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n\n label {\n padding-left: 0;\n }\n }\n .radio input[type=\"radio\"],\n .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n\n // Re-override the feedback icon.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n // Consistent vertical alignment of radios and checkboxes\n //\n // Labels also get some reset styles, but that is scoped to a media query below.\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n // Account for padding we're adding to ensure the alignment and of help text\n // and other content below items\n .radio,\n .checkbox {\n min-height: (@line-height-computed + (@padding-base-vertical + 1));\n }\n\n // Make form groups behave like rows\n .form-group {\n .make-row();\n }\n\n // Reset spacing and right align labels, but scope to media queries so that\n // labels on narrow viewports stack the same as a default form example.\n @media (min-width: @screen-sm-min) {\n .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n right: floor((@grid-gutter-width / 2));\n }\n\n // Form group sizes\n //\n // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n // inputs and labels within a `.form-group`.\n .form-group-lg {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: ((@padding-large-vertical * @line-height-large) + 1);\n font-size: @font-size-large;\n }\n }\n }\n .form-group-sm {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-small-vertical + 1);\n font-size: @font-size-small;\n }\n }\n }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline,\n &.radio label,\n &.checkbox label,\n &.radio-inline label,\n &.checkbox-inline label {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n .opacity(.65);\n .box-shadow(none);\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `<a>` elements\n }\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 25%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n border-color: darken(@border, 25%);\n }\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base dashed;\n border-top: @caret-width-base solid ~\"\\9\"; // IE8\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base dashed;\n border-bottom: @caret-width-base solid ~\"\\9\"; // IE8\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n border-top-right-radius: @btn-border-radius-base;\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n border-bottom-left-radius: @btn-border-radius-base;\n .border-top-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @border-radius-base;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 3;\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding-top: @jumbotron-padding;\n padding-bottom: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: @jumbotron-heading-font-size;\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n\n // Fix collapse in webkit from max-width: 100% and display: table-cell.\n &.img-thumbnail {\n max-width: none;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a&,\n button& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n > .panel-heading + .panel-collapse > .list-group {\n .list-group-item:first-child {\n .border-top-radius(0);\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: @panel-body-padding;\n padding-right: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n border-bottom-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-small;\n\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n",".reset-text() {\n font-family: @font-family-base;\n // We deliberately do NOT reset font-size.\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: @line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-base;\n\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n .transition-transform(~'0.6s ease-in-out');\n .backface-visibility(~'hidden');\n .perspective(1000px);\n\n &.next,\n &.active.right {\n .translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n .translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n .translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: -15px;\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: -15px;\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table !important; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]} \ No newline at end of file diff --git a/theme/bootstrap/views/css/New folder/bootstrap.min.css b/theme/bootstrap/views/css/New folder/bootstrap.min.css new file mode 100644 index 0000000..d65c66b --- /dev/null +++ b/theme/bootstrap/views/css/New folder/bootstrap.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:3;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/theme/bootstrap/views/css/New folder/sb-admin-rtl.css b/theme/bootstrap/views/css/New folder/sb-admin-rtl.css new file mode 100644 index 0000000..50119bd --- /dev/null +++ b/theme/bootstrap/views/css/New folder/sb-admin-rtl.css @@ -0,0 +1,5 @@ + +@media (min-width: 768px){ + #wrapper {padding-right: 225px; padding-left: 0;} + .side-nav{right: 0;left: auto;} +} \ No newline at end of file diff --git a/theme/bootstrap/views/css/New folder/sb-admin.css b/theme/bootstrap/views/css/New folder/sb-admin.css new file mode 100644 index 0000000..0df3b3f --- /dev/null +++ b/theme/bootstrap/views/css/New folder/sb-admin.css @@ -0,0 +1,227 @@ +/*! + * Start Bootstrap - SB Admin Bootstrap Admin Template (http://startbootstrap.com) + * Code licensed under the Apache License v2.0. + * For details, see http://www.apache.org/licenses/LICENSE-2.0. + */ + +/* Global Styles */ + +body { + margin-top: 100px; + background-color: #222; +} + +@media(min-width:768px) { + body { + margin-top: 50px; + } +} + +#wrapper { + padding-left: 0; +} + +#page-wrapper { + width: 100%; + padding: 0; + background-color: #fff; +} + +.huge { + font-size: 50px; + line-height: normal; +} + +@media(min-width:768px) { + #wrapper { + padding-left: 225px; + } + + #page-wrapper { + padding: 10px; + } +} + +/* Top Navigation */ + +.top-nav { + padding: 0 15px; +} + +.top-nav>li { + display: inline-block; + float: left; +} + +.top-nav>li>a { + padding-top: 15px; + padding-bottom: 15px; + line-height: 20px; + color: #999; +} + +.top-nav>li>a:hover, +.top-nav>li>a:focus, +.top-nav>.open>a, +.top-nav>.open>a:hover, +.top-nav>.open>a:focus { + color: #fff; + background-color: #000; +} + +.top-nav>.open>.dropdown-menu { + float: left; + position: absolute; + margin-top: 0; + border: 1px solid rgba(0,0,0,.15); + border-top-left-radius: 0; + border-top-right-radius: 0; + background-color: #fff; + -webkit-box-shadow: 0 6px 12px rgba(0,0,0,.175); + box-shadow: 0 6px 12px rgba(0,0,0,.175); +} + +.top-nav>.open>.dropdown-menu>li>a { + white-space: normal; +} + +ul.message-dropdown { + padding: 0; + max-height: 250px; + overflow-x: hidden; + overflow-y: auto; +} + +li.message-preview { + width: 275px; + border-bottom: 1px solid rgba(0,0,0,.15); +} + +li.message-preview>a { + padding-top: 15px; + padding-bottom: 15px; +} + +li.message-footer { + margin: 5px 0; +} + +ul.alert-dropdown { + width: 200px; +} + +/* Side Navigation */ + +@media(min-width:768px) { + .side-nav { + position: fixed; + top: 51px; + left: 225px; + width: 225px; + margin-left: -225px; + border: none; + border-radius: 0; + overflow-y: auto; + background-color: #222; + bottom: 0; + overflow-x: hidden; + padding-bottom: 40px; + } + + .side-nav>li>a { + width: 225px; + } + + .side-nav li a:hover, + .side-nav li a:focus { + outline: none; + background-color: #000 !important; + } +} + +.side-nav>li>ul { + padding: 0; +} + +.side-nav>li>ul>li>a { + display: block; + padding: 10px 15px 10px 38px; + text-decoration: none; + color: #999; +} + +.side-nav>li>ul>li>a:hover { + color: #fff; +} + +/* Flot Chart Containers */ + +.flot-chart { + display: block; + height: 400px; +} + +.flot-chart-content { + width: 100%; + height: 100%; +} + +/* Custom Colored Panels */ + +.huge { + font-size: 40px; +} + +.panel-green { + border-color: #5cb85c; +} + +.panel-green > .panel-heading { + border-color: #5cb85c; + color: #fff; + background-color: #5cb85c; +} + +.panel-green > a { + color: #5cb85c; +} + +.panel-green > a:hover { + color: #3d8b3d; +} + +.panel-red { + border-color: #d9534f; +} + +.panel-red > .panel-heading { + border-color: #d9534f; + color: #fff; + background-color: #d9534f; +} + +.panel-red > a { + color: #d9534f; +} + +.panel-red > a:hover { + color: #b52b27; +} + +.panel-yellow { + border-color: #f0ad4e; +} + +.panel-yellow > .panel-heading { + border-color: #f0ad4e; + color: #fff; + background-color: #f0ad4e; +} + +.panel-yellow > a { + color: #f0ad4e; +} + +.panel-yellow > a:hover { + color: #df8a13; +} \ No newline at end of file diff --git a/theme/bootstrap/views/css/New folder/styles.css b/theme/bootstrap/views/css/New folder/styles.css new file mode 100644 index 0000000..f6a42d2 --- /dev/null +++ b/theme/bootstrap/views/css/New folder/styles.css @@ -0,0 +1,3 @@ +#page { + padding-top: 60px; +} \ No newline at end of file diff --git a/theme/bootstrap/views/css/bootstrap-rtl.css b/theme/bootstrap/views/css/bootstrap-rtl.css new file mode 100644 index 0000000..33095b1 --- /dev/null +++ b/theme/bootstrap/views/css/bootstrap-rtl.css @@ -0,0 +1,1536 @@ +/******************************************************************************* + * bootstrap-rtl (Version 3.2.0-rc1) + * Author: Morteza Ansarinia <ansarinia@me.com> (http://github.com/morteza) + * Created on: June 13,2014 + * Project: bootstrap-rtl + * Copyright: See the file "LICENSE.md" for the full license governing this code. + *******************************************************************************/ + +html { + direction: rtl; +} +body { + direction: rtl; +} +.list-unstyled { + padding-right: 0; + padding-left: none; +} +.list-inline { + padding-right: 0; + padding-left: none; + margin-right: -5px; + margin-left: 0; +} +dd { + margin-right: 0; + margin-left: none; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: right; + clear: right; + text-align: left; + } + .dl-horizontal dd { + margin-right: 180px; + margin-left: 0; + } +} +blockquote { + border-right: 5px solid #eeeeee; + border-left: 0; +} +.blockquote-reverse, +blockquote.pull-left { + padding-left: 15px; + padding-right: 0; + border-left: 5px solid #eeeeee; + border-right: 0; + text-align: left; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: right; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + left: 100%; + right: auto; +} +.col-xs-pull-11 { + left: 91.66666667%; + right: auto; +} +.col-xs-pull-10 { + left: 83.33333333%; + right: auto; +} +.col-xs-pull-9 { + left: 75%; + right: auto; +} +.col-xs-pull-8 { + left: 66.66666667%; + right: auto; +} +.col-xs-pull-7 { + left: 58.33333333%; + right: auto; +} +.col-xs-pull-6 { + left: 50%; + right: auto; +} +.col-xs-pull-5 { + left: 41.66666667%; + right: auto; +} +.col-xs-pull-4 { + left: 33.33333333%; + right: auto; +} +.col-xs-pull-3 { + left: 25%; + right: auto; +} +.col-xs-pull-2 { + left: 16.66666667%; + right: auto; +} +.col-xs-pull-1 { + left: 8.33333333%; + right: auto; +} +.col-xs-pull-0 { + left: auto; + right: auto; +} +.col-xs-push-12 { + right: 100%; + left: 0; +} +.col-xs-push-11 { + right: 91.66666667%; + left: 0; +} +.col-xs-push-10 { + right: 83.33333333%; + left: 0; +} +.col-xs-push-9 { + right: 75%; + left: 0; +} +.col-xs-push-8 { + right: 66.66666667%; + left: 0; +} +.col-xs-push-7 { + right: 58.33333333%; + left: 0; +} +.col-xs-push-6 { + right: 50%; + left: 0; +} +.col-xs-push-5 { + right: 41.66666667%; + left: 0; +} +.col-xs-push-4 { + right: 33.33333333%; + left: 0; +} +.col-xs-push-3 { + right: 25%; + left: 0; +} +.col-xs-push-2 { + right: 16.66666667%; + left: 0; +} +.col-xs-push-1 { + right: 8.33333333%; + left: 0; +} +.col-xs-push-0 { + right: auto; + left: 0; +} +.col-xs-offset-12 { + margin-right: 100%; + margin-left: 0; +} +.col-xs-offset-11 { + margin-right: 91.66666667%; + margin-left: 0; +} +.col-xs-offset-10 { + margin-right: 83.33333333%; + margin-left: 0; +} +.col-xs-offset-9 { + margin-right: 75%; + margin-left: 0; +} +.col-xs-offset-8 { + margin-right: 66.66666667%; + margin-left: 0; +} +.col-xs-offset-7 { + margin-right: 58.33333333%; + margin-left: 0; +} +.col-xs-offset-6 { + margin-right: 50%; + margin-left: 0; +} +.col-xs-offset-5 { + margin-right: 41.66666667%; + margin-left: 0; +} +.col-xs-offset-4 { + margin-right: 33.33333333%; + margin-left: 0; +} +.col-xs-offset-3 { + margin-right: 25%; + margin-left: 0; +} +.col-xs-offset-2 { + margin-right: 16.66666667%; + margin-left: 0; +} +.col-xs-offset-1 { + margin-right: 8.33333333%; + margin-left: 0; +} +.col-xs-offset-0 { + margin-right: 0%; + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: right; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + left: 100%; + right: auto; + } + .col-sm-pull-11 { + left: 91.66666667%; + right: auto; + } + .col-sm-pull-10 { + left: 83.33333333%; + right: auto; + } + .col-sm-pull-9 { + left: 75%; + right: auto; + } + .col-sm-pull-8 { + left: 66.66666667%; + right: auto; + } + .col-sm-pull-7 { + left: 58.33333333%; + right: auto; + } + .col-sm-pull-6 { + left: 50%; + right: auto; + } + .col-sm-pull-5 { + left: 41.66666667%; + right: auto; + } + .col-sm-pull-4 { + left: 33.33333333%; + right: auto; + } + .col-sm-pull-3 { + left: 25%; + right: auto; + } + .col-sm-pull-2 { + left: 16.66666667%; + right: auto; + } + .col-sm-pull-1 { + left: 8.33333333%; + right: auto; + } + .col-sm-pull-0 { + left: auto; + right: auto; + } + .col-sm-push-12 { + right: 100%; + left: 0; + } + .col-sm-push-11 { + right: 91.66666667%; + left: 0; + } + .col-sm-push-10 { + right: 83.33333333%; + left: 0; + } + .col-sm-push-9 { + right: 75%; + left: 0; + } + .col-sm-push-8 { + right: 66.66666667%; + left: 0; + } + .col-sm-push-7 { + right: 58.33333333%; + left: 0; + } + .col-sm-push-6 { + right: 50%; + left: 0; + } + .col-sm-push-5 { + right: 41.66666667%; + left: 0; + } + .col-sm-push-4 { + right: 33.33333333%; + left: 0; + } + .col-sm-push-3 { + right: 25%; + left: 0; + } + .col-sm-push-2 { + right: 16.66666667%; + left: 0; + } + .col-sm-push-1 { + right: 8.33333333%; + left: 0; + } + .col-sm-push-0 { + right: auto; + left: 0; + } + .col-sm-offset-12 { + margin-right: 100%; + margin-left: 0; + } + .col-sm-offset-11 { + margin-right: 91.66666667%; + margin-left: 0; + } + .col-sm-offset-10 { + margin-right: 83.33333333%; + margin-left: 0; + } + .col-sm-offset-9 { + margin-right: 75%; + margin-left: 0; + } + .col-sm-offset-8 { + margin-right: 66.66666667%; + margin-left: 0; + } + .col-sm-offset-7 { + margin-right: 58.33333333%; + margin-left: 0; + } + .col-sm-offset-6 { + margin-right: 50%; + margin-left: 0; + } + .col-sm-offset-5 { + margin-right: 41.66666667%; + margin-left: 0; + } + .col-sm-offset-4 { + margin-right: 33.33333333%; + margin-left: 0; + } + .col-sm-offset-3 { + margin-right: 25%; + margin-left: 0; + } + .col-sm-offset-2 { + margin-right: 16.66666667%; + margin-left: 0; + } + .col-sm-offset-1 { + margin-right: 8.33333333%; + margin-left: 0; + } + .col-sm-offset-0 { + margin-right: 0%; + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: right; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + left: 100%; + right: auto; + } + .col-md-pull-11 { + left: 91.66666667%; + right: auto; + } + .col-md-pull-10 { + left: 83.33333333%; + right: auto; + } + .col-md-pull-9 { + left: 75%; + right: auto; + } + .col-md-pull-8 { + left: 66.66666667%; + right: auto; + } + .col-md-pull-7 { + left: 58.33333333%; + right: auto; + } + .col-md-pull-6 { + left: 50%; + right: auto; + } + .col-md-pull-5 { + left: 41.66666667%; + right: auto; + } + .col-md-pull-4 { + left: 33.33333333%; + right: auto; + } + .col-md-pull-3 { + left: 25%; + right: auto; + } + .col-md-pull-2 { + left: 16.66666667%; + right: auto; + } + .col-md-pull-1 { + left: 8.33333333%; + right: auto; + } + .col-md-pull-0 { + left: auto; + right: auto; + } + .col-md-push-12 { + right: 100%; + left: 0; + } + .col-md-push-11 { + right: 91.66666667%; + left: 0; + } + .col-md-push-10 { + right: 83.33333333%; + left: 0; + } + .col-md-push-9 { + right: 75%; + left: 0; + } + .col-md-push-8 { + right: 66.66666667%; + left: 0; + } + .col-md-push-7 { + right: 58.33333333%; + left: 0; + } + .col-md-push-6 { + right: 50%; + left: 0; + } + .col-md-push-5 { + right: 41.66666667%; + left: 0; + } + .col-md-push-4 { + right: 33.33333333%; + left: 0; + } + .col-md-push-3 { + right: 25%; + left: 0; + } + .col-md-push-2 { + right: 16.66666667%; + left: 0; + } + .col-md-push-1 { + right: 8.33333333%; + left: 0; + } + .col-md-push-0 { + right: auto; + left: 0; + } + .col-md-offset-12 { + margin-right: 100%; + margin-left: 0; + } + .col-md-offset-11 { + margin-right: 91.66666667%; + margin-left: 0; + } + .col-md-offset-10 { + margin-right: 83.33333333%; + margin-left: 0; + } + .col-md-offset-9 { + margin-right: 75%; + margin-left: 0; + } + .col-md-offset-8 { + margin-right: 66.66666667%; + margin-left: 0; + } + .col-md-offset-7 { + margin-right: 58.33333333%; + margin-left: 0; + } + .col-md-offset-6 { + margin-right: 50%; + margin-left: 0; + } + .col-md-offset-5 { + margin-right: 41.66666667%; + margin-left: 0; + } + .col-md-offset-4 { + margin-right: 33.33333333%; + margin-left: 0; + } + .col-md-offset-3 { + margin-right: 25%; + margin-left: 0; + } + .col-md-offset-2 { + margin-right: 16.66666667%; + margin-left: 0; + } + .col-md-offset-1 { + margin-right: 8.33333333%; + margin-left: 0; + } + .col-md-offset-0 { + margin-right: 0%; + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: right; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + left: 100%; + right: auto; + } + .col-lg-pull-11 { + left: 91.66666667%; + right: auto; + } + .col-lg-pull-10 { + left: 83.33333333%; + right: auto; + } + .col-lg-pull-9 { + left: 75%; + right: auto; + } + .col-lg-pull-8 { + left: 66.66666667%; + right: auto; + } + .col-lg-pull-7 { + left: 58.33333333%; + right: auto; + } + .col-lg-pull-6 { + left: 50%; + right: auto; + } + .col-lg-pull-5 { + left: 41.66666667%; + right: auto; + } + .col-lg-pull-4 { + left: 33.33333333%; + right: auto; + } + .col-lg-pull-3 { + left: 25%; + right: auto; + } + .col-lg-pull-2 { + left: 16.66666667%; + right: auto; + } + .col-lg-pull-1 { + left: 8.33333333%; + right: auto; + } + .col-lg-pull-0 { + left: auto; + right: auto; + } + .col-lg-push-12 { + right: 100%; + left: 0; + } + .col-lg-push-11 { + right: 91.66666667%; + left: 0; + } + .col-lg-push-10 { + right: 83.33333333%; + left: 0; + } + .col-lg-push-9 { + right: 75%; + left: 0; + } + .col-lg-push-8 { + right: 66.66666667%; + left: 0; + } + .col-lg-push-7 { + right: 58.33333333%; + left: 0; + } + .col-lg-push-6 { + right: 50%; + left: 0; + } + .col-lg-push-5 { + right: 41.66666667%; + left: 0; + } + .col-lg-push-4 { + right: 33.33333333%; + left: 0; + } + .col-lg-push-3 { + right: 25%; + left: 0; + } + .col-lg-push-2 { + right: 16.66666667%; + left: 0; + } + .col-lg-push-1 { + right: 8.33333333%; + left: 0; + } + .col-lg-push-0 { + right: auto; + left: 0; + } + .col-lg-offset-12 { + margin-right: 100%; + margin-left: 0; + } + .col-lg-offset-11 { + margin-right: 91.66666667%; + margin-left: 0; + } + .col-lg-offset-10 { + margin-right: 83.33333333%; + margin-left: 0; + } + .col-lg-offset-9 { + margin-right: 75%; + margin-left: 0; + } + .col-lg-offset-8 { + margin-right: 66.66666667%; + margin-left: 0; + } + .col-lg-offset-7 { + margin-right: 58.33333333%; + margin-left: 0; + } + .col-lg-offset-6 { + margin-right: 50%; + margin-left: 0; + } + .col-lg-offset-5 { + margin-right: 41.66666667%; + margin-left: 0; + } + .col-lg-offset-4 { + margin-right: 33.33333333%; + margin-left: 0; + } + .col-lg-offset-3 { + margin-right: 25%; + margin-left: 0; + } + .col-lg-offset-2 { + margin-right: 16.66666667%; + margin-left: 0; + } + .col-lg-offset-1 { + margin-right: 8.33333333%; + margin-left: 0; + } + .col-lg-offset-0 { + margin-right: 0%; + margin-left: 0; + } +} +th { + text-align: right; +} +@media screen and (max-width: 767px) { + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-right: 0; + border-left: auto; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-left: 0; + border-right: auto; + } +} +.radio label, +.checkbox label { + padding-right: 20px; + padding-left: auto; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + float: right; + margin-right: 20px; + margin-left: 0; +} +.radio-inline, +.checkbox-inline { + padding-right: 20px; + padding-left: 0; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-right: 10px; + margin-left: 0; +} +.has-feedback .form-control { + padding-left: 42.5px; + padding-right: auto; +} +.form-control-feedback { + left: 0; + right: auto; +} +@media (min-width: 768px) { + .form-inline .radio, + .form-inline .checkbox { + padding-right: 0; + padding-left: auto; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + margin-right: 0; + margin-left: auto; + } +} +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: left; + } +} +.form-horizontal .has-feedback .form-control-feedback { + left: 15px; + right: auto; +} +.caret { + margin-right: 2px; + margin-left: 0; +} +.dropdown-menu { + right: 0; + left: auto; + float: left; + text-align: right; +} +.dropdown-menu.pull-left { + left: 0; + float: right; + right: auto; +} +.pull-left > .dropdown-menu { + left: 0; + float: right; + right: auto; +} +.navbar-nav.pull-left > li > .dropdown-menu, +.navbar-nav > li > .dropdown-menu.pull-left { + right: auto; + left: 0; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + float: right; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-right: -1px; + margin-left: 0px; +} +.btn-toolbar { + margin-right: -5px; + margin-left: 0px; +} +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: right; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-right: 5px; + margin-left: 0px; +} +.btn-group > .btn:first-child { + margin-right: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn-group { + float: right; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child > .btn:last-child, +.btn-group > .btn-group:first-child > .dropdown-toggle { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group > .btn-group:last-child > .btn:first-child { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn .caret { + margin-right: 0; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-right: 0; +} +.input-group .form-control { + float: right; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.input-group-addon:first-child { + border-right: 1px solid #cccccc; + border-left: 0px; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.input-group-addon:last-child { + border-left: 1px solid #cccccc; + border-right: 0px; +} +.input-group-btn > .btn + .btn { + margin-right: -1px; + margin-left: auto; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-left: -1px; + margin-right: auto; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + margin-right: -1px; + margin-left: auto; +} +.nav { + padding-right: 0; + padding-left: auto; +} +.nav-tabs > li { + float: right; +} +.nav-tabs > li > a { + margin-left: auto; + margin-right: -2px; + border-radius: 4px 4px 0 0; +} +.nav-pills > li { + float: right; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-right: 2px; + margin-left: auto; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-right: 0; + margin-left: auto; +} +.nav-justified > .dropdown .dropdown-menu { + right: auto; +} +.nav-tabs-justified > li > a { + margin-left: 0; + margin-right: auto; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-radius: 4px 4px 0 0; + } +} +@media (min-width: 768px) { + .navbar-header { + float: right; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; +} +.navbar-brand { + float: right; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-right: -15px; + margin-left: auto; + } +} +.navbar-toggle { + float: left; + margin-left: 15px; + margin-right: auto; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 25px 5px 15px; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: right; + } + .navbar-nav > li { + float: right; + } + .navbar-nav.navbar-right:last-child { + margin-left: -15px; + margin-right: auto; + } + .navbar-nav.navbar-right.flip { + float: left !important; + } + .navbar-nav.navbar-right .dropdown-menu { + left: 0; + right: auto; + } +} +@media (min-width: 768px) { + .navbar-text { + float: right; + } + .navbar-text.navbar-right:last-child { + margin-left: 0; + margin-right: auto; + } +} +.pagination { + padding-right: 0; +} +.pagination > li > a, +.pagination > li > span { + float: right; + margin-right: -1px; + margin-left: 0px; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + margin-right: -1px; + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.pager { + padding-right: 0; + padding-left: none; +} +.pager .next > a, +.pager .next > span { + float: left; +} +.pager .previous > a, +.pager .previous > span { + float: right; +} +.nav-pills > li > a > .badge { + margin-left: 0px; + margin-right: 3px; +} +.alert-dismissable { + padding-left: 35px; + padding-right: 15px; +} +.alert-dismissable .close { + top: -2px; + right: 0; + left: 21; +} +.progress-bar { + float: right; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media > .pull-left { + margin-right: 10px; +} +.media > .pull-left.flip { + margin-right: 0; + margin-left: 10px; +} +.media > .pull-right { + margin-left: 10px; +} +.media > .pull-right.flip { + margin-left: 0; + margin-right: 10px; +} +.media-list { + padding-right: 0; + padding-left: auto; + list-style: none; +} +.list-group { + padding-right: 0; + padding-left: none; +} +.list-group-item > .badge { + float: left; +} +.list-group-item > .badge + .badge { + margin-ight: 5px; + margin-left: 0; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-right-radius: 3px; + border-top-left-radius: 0; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-left-radius: 3px; + border-top-right-radius: 0; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; + border-top-right-radius: 0; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; + border-top-left-radius: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-right: 0; + border-left: none; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: none; + border-left: 0; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object { + right: 0; + left: none; +} +.close { + float: left; +} +.modal-footer { + text-align: left; +} +.modal-footer .btn + .btn { + margin-left: 0; + margin-right: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-right: -1px; + margin-left: 0; +} +.modal-footer .btn-block + .btn-block { + margin-right: 0; + margin-left: none; +} +.popover { + right: 0; + left: none; + text-align: right; +} +.popover.top > .arrow { + right: 50%; + left: none; + margin-right: -11px; + margin-left: 0; +} +.popover.top > .arrow:after { + margin-right: -10px; + margin-left: 0; +} +.carousel-inner > .item { + -webkit-transition: 0.6s ease-in-out right; + -o-transition: 0.6s ease-in-out right; + transition: 0.6s ease-in-out right; +} +.carousel-inner > .active { + right: 0; +} +.carousel-inner > .next { + right: 100%; + left: 0; +} +.carousel-inner > .prev { + right: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + right: 0; +} +.carousel-inner > .active.right { + left: -100%; +} +.carousel-inner > .active.left { + right: 100%; +} +.carousel-control { + right: 0; + bottom: 0; +} +.carousel-control.left { + right: auto; + left: 0; + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0%), color-stop(rgba(0, 0, 0, 0.0001) 100%)); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} +.carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0%), color-stop(rgba(0, 0, 0, 0.5) 100%)); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + right: auto; + margin-right: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + left: auto; + margin-left: -10px; +} +.carousel-indicators { + right: 50%; + left: 0; + margin-right: -30%; + margin-left: 0; + padding-left: 0; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: 0; + margin-right: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-left: 0; + margin-right: -15px; + } + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } +} +.pull-right.flip { + float: left !important; +} +.pull-left.flip { + float: right !important; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +/*# sourceMappingURL=bootstrap-rtl.css.map */ \ No newline at end of file diff --git a/theme/bootstrap/views/css/bootstrap-rtl.min.css b/theme/bootstrap/views/css/bootstrap-rtl.min.css new file mode 100644 index 0000000..04e881e --- /dev/null +++ b/theme/bootstrap/views/css/bootstrap-rtl.min.css @@ -0,0 +1,9 @@ +/******************************************************************************* + * bootstrap-rtl (Version 3.2.0-rc1) + * Author: Morteza Ansarinia <ansarinia@me.com> (http://github.com/morteza) + * Created on: June 13,2014 + * Project: bootstrap-rtl + * Copyright: See the file "LICENSE.md" for the full license governing this code. + *******************************************************************************/ + +html{direction:rtl}body{direction:rtl}.list-unstyled{padding-right:0;padding-left:none}.list-inline{padding-right:0;padding-left:none;margin-right:-5px;margin-left:0}dd{margin-right:0;margin-left:none}@media (min-width:768px){.dl-horizontal dt{float:right;clear:right;text-align:left}.dl-horizontal dd{margin-right:180px;margin-left:0}}blockquote{border-right:5px solid #eee;border-left:0}.blockquote-reverse,blockquote.pull-left{padding-left:15px;padding-right:0;border-left:5px solid #eee;border-right:0;text-align:left}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:right}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{left:100%;right:auto}.col-xs-pull-11{left:91.66666667%;right:auto}.col-xs-pull-10{left:83.33333333%;right:auto}.col-xs-pull-9{left:75%;right:auto}.col-xs-pull-8{left:66.66666667%;right:auto}.col-xs-pull-7{left:58.33333333%;right:auto}.col-xs-pull-6{left:50%;right:auto}.col-xs-pull-5{left:41.66666667%;right:auto}.col-xs-pull-4{left:33.33333333%;right:auto}.col-xs-pull-3{left:25%;right:auto}.col-xs-pull-2{left:16.66666667%;right:auto}.col-xs-pull-1{left:8.33333333%;right:auto}.col-xs-pull-0{left:auto;right:auto}.col-xs-push-12{right:100%;left:0}.col-xs-push-11{right:91.66666667%;left:0}.col-xs-push-10{right:83.33333333%;left:0}.col-xs-push-9{right:75%;left:0}.col-xs-push-8{right:66.66666667%;left:0}.col-xs-push-7{right:58.33333333%;left:0}.col-xs-push-6{right:50%;left:0}.col-xs-push-5{right:41.66666667%;left:0}.col-xs-push-4{right:33.33333333%;left:0}.col-xs-push-3{right:25%;left:0}.col-xs-push-2{right:16.66666667%;left:0}.col-xs-push-1{right:8.33333333%;left:0}.col-xs-push-0{right:auto;left:0}.col-xs-offset-12{margin-right:100%;margin-left:0}.col-xs-offset-11{margin-right:91.66666667%;margin-left:0}.col-xs-offset-10{margin-right:83.33333333%;margin-left:0}.col-xs-offset-9{margin-right:75%;margin-left:0}.col-xs-offset-8{margin-right:66.66666667%;margin-left:0}.col-xs-offset-7{margin-right:58.33333333%;margin-left:0}.col-xs-offset-6{margin-right:50%;margin-left:0}.col-xs-offset-5{margin-right:41.66666667%;margin-left:0}.col-xs-offset-4{margin-right:33.33333333%;margin-left:0}.col-xs-offset-3{margin-right:25%;margin-left:0}.col-xs-offset-2{margin-right:16.66666667%;margin-left:0}.col-xs-offset-1{margin-right:8.33333333%;margin-left:0}.col-xs-offset-0{margin-right:0;margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:right}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{left:100%;right:auto}.col-sm-pull-11{left:91.66666667%;right:auto}.col-sm-pull-10{left:83.33333333%;right:auto}.col-sm-pull-9{left:75%;right:auto}.col-sm-pull-8{left:66.66666667%;right:auto}.col-sm-pull-7{left:58.33333333%;right:auto}.col-sm-pull-6{left:50%;right:auto}.col-sm-pull-5{left:41.66666667%;right:auto}.col-sm-pull-4{left:33.33333333%;right:auto}.col-sm-pull-3{left:25%;right:auto}.col-sm-pull-2{left:16.66666667%;right:auto}.col-sm-pull-1{left:8.33333333%;right:auto}.col-sm-pull-0{left:auto;right:auto}.col-sm-push-12{right:100%;left:0}.col-sm-push-11{right:91.66666667%;left:0}.col-sm-push-10{right:83.33333333%;left:0}.col-sm-push-9{right:75%;left:0}.col-sm-push-8{right:66.66666667%;left:0}.col-sm-push-7{right:58.33333333%;left:0}.col-sm-push-6{right:50%;left:0}.col-sm-push-5{right:41.66666667%;left:0}.col-sm-push-4{right:33.33333333%;left:0}.col-sm-push-3{right:25%;left:0}.col-sm-push-2{right:16.66666667%;left:0}.col-sm-push-1{right:8.33333333%;left:0}.col-sm-push-0{right:auto;left:0}.col-sm-offset-12{margin-right:100%;margin-left:0}.col-sm-offset-11{margin-right:91.66666667%;margin-left:0}.col-sm-offset-10{margin-right:83.33333333%;margin-left:0}.col-sm-offset-9{margin-right:75%;margin-left:0}.col-sm-offset-8{margin-right:66.66666667%;margin-left:0}.col-sm-offset-7{margin-right:58.33333333%;margin-left:0}.col-sm-offset-6{margin-right:50%;margin-left:0}.col-sm-offset-5{margin-right:41.66666667%;margin-left:0}.col-sm-offset-4{margin-right:33.33333333%;margin-left:0}.col-sm-offset-3{margin-right:25%;margin-left:0}.col-sm-offset-2{margin-right:16.66666667%;margin-left:0}.col-sm-offset-1{margin-right:8.33333333%;margin-left:0}.col-sm-offset-0{margin-right:0;margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:right}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{left:100%;right:auto}.col-md-pull-11{left:91.66666667%;right:auto}.col-md-pull-10{left:83.33333333%;right:auto}.col-md-pull-9{left:75%;right:auto}.col-md-pull-8{left:66.66666667%;right:auto}.col-md-pull-7{left:58.33333333%;right:auto}.col-md-pull-6{left:50%;right:auto}.col-md-pull-5{left:41.66666667%;right:auto}.col-md-pull-4{left:33.33333333%;right:auto}.col-md-pull-3{left:25%;right:auto}.col-md-pull-2{left:16.66666667%;right:auto}.col-md-pull-1{left:8.33333333%;right:auto}.col-md-pull-0{left:auto;right:auto}.col-md-push-12{right:100%;left:0}.col-md-push-11{right:91.66666667%;left:0}.col-md-push-10{right:83.33333333%;left:0}.col-md-push-9{right:75%;left:0}.col-md-push-8{right:66.66666667%;left:0}.col-md-push-7{right:58.33333333%;left:0}.col-md-push-6{right:50%;left:0}.col-md-push-5{right:41.66666667%;left:0}.col-md-push-4{right:33.33333333%;left:0}.col-md-push-3{right:25%;left:0}.col-md-push-2{right:16.66666667%;left:0}.col-md-push-1{right:8.33333333%;left:0}.col-md-push-0{right:auto;left:0}.col-md-offset-12{margin-right:100%;margin-left:0}.col-md-offset-11{margin-right:91.66666667%;margin-left:0}.col-md-offset-10{margin-right:83.33333333%;margin-left:0}.col-md-offset-9{margin-right:75%;margin-left:0}.col-md-offset-8{margin-right:66.66666667%;margin-left:0}.col-md-offset-7{margin-right:58.33333333%;margin-left:0}.col-md-offset-6{margin-right:50%;margin-left:0}.col-md-offset-5{margin-right:41.66666667%;margin-left:0}.col-md-offset-4{margin-right:33.33333333%;margin-left:0}.col-md-offset-3{margin-right:25%;margin-left:0}.col-md-offset-2{margin-right:16.66666667%;margin-left:0}.col-md-offset-1{margin-right:8.33333333%;margin-left:0}.col-md-offset-0{margin-right:0;margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:right}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{left:100%;right:auto}.col-lg-pull-11{left:91.66666667%;right:auto}.col-lg-pull-10{left:83.33333333%;right:auto}.col-lg-pull-9{left:75%;right:auto}.col-lg-pull-8{left:66.66666667%;right:auto}.col-lg-pull-7{left:58.33333333%;right:auto}.col-lg-pull-6{left:50%;right:auto}.col-lg-pull-5{left:41.66666667%;right:auto}.col-lg-pull-4{left:33.33333333%;right:auto}.col-lg-pull-3{left:25%;right:auto}.col-lg-pull-2{left:16.66666667%;right:auto}.col-lg-pull-1{left:8.33333333%;right:auto}.col-lg-pull-0{left:auto;right:auto}.col-lg-push-12{right:100%;left:0}.col-lg-push-11{right:91.66666667%;left:0}.col-lg-push-10{right:83.33333333%;left:0}.col-lg-push-9{right:75%;left:0}.col-lg-push-8{right:66.66666667%;left:0}.col-lg-push-7{right:58.33333333%;left:0}.col-lg-push-6{right:50%;left:0}.col-lg-push-5{right:41.66666667%;left:0}.col-lg-push-4{right:33.33333333%;left:0}.col-lg-push-3{right:25%;left:0}.col-lg-push-2{right:16.66666667%;left:0}.col-lg-push-1{right:8.33333333%;left:0}.col-lg-push-0{right:auto;left:0}.col-lg-offset-12{margin-right:100%;margin-left:0}.col-lg-offset-11{margin-right:91.66666667%;margin-left:0}.col-lg-offset-10{margin-right:83.33333333%;margin-left:0}.col-lg-offset-9{margin-right:75%;margin-left:0}.col-lg-offset-8{margin-right:66.66666667%;margin-left:0}.col-lg-offset-7{margin-right:58.33333333%;margin-left:0}.col-lg-offset-6{margin-right:50%;margin-left:0}.col-lg-offset-5{margin-right:41.66666667%;margin-left:0}.col-lg-offset-4{margin-right:33.33333333%;margin-left:0}.col-lg-offset-3{margin-right:25%;margin-left:0}.col-lg-offset-2{margin-right:16.66666667%;margin-left:0}.col-lg-offset-1{margin-right:8.33333333%;margin-left:0}.col-lg-offset-0{margin-right:0;margin-left:0}}th{text-align:right}@media screen and (max-width:767px){.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-right:0;border-left:auto}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-left:0;border-right:auto}}.radio label,.checkbox label{padding-right:20px;padding-left:auto}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:right;margin-right:20px;margin-left:0}.radio-inline,.checkbox-inline{padding-right:20px;padding-left:0}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-right:10px;margin-left:0}.has-feedback .form-control{padding-left:42.5px;padding-right:auto}.form-control-feedback{left:0;right:auto}@media (min-width:768px){.form-inline .radio,.form-inline .checkbox{padding-right:0;padding-left:auto}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{margin-right:0;margin-left:auto}}@media (min-width:768px){.form-horizontal .control-label{text-align:left}}.form-horizontal .has-feedback .form-control-feedback{left:15px;right:auto}.caret{margin-right:2px;margin-left:0}.dropdown-menu{right:0;left:auto;float:left;text-align:right}.dropdown-menu.pull-left{left:0;float:right;right:auto}.pull-left>.dropdown-menu{left:0;float:right;right:auto}.navbar-nav.pull-left>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-left{right:auto;left:0}.btn-group>.btn,.btn-group-vertical>.btn{float:right}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-right:-1px;margin-left:0}.btn-toolbar{margin-right:-5px;margin-left:0}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:right}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-right:5px;margin-left:0}.btn-group>.btn:first-child{margin-right:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group{float:right}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-right-radius:0;border-top-right-radius:0}.btn .caret{margin-right:0}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-right:0}.input-group .form-control{float:right}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:first-child{border-right:1px solid #ccc;border-left:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:last-child{border-left:1px solid #ccc;border-right:0}.input-group-btn>.btn+.btn{margin-right:-1px;margin-left:auto}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-left:-1px;margin-right:auto}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-right:-1px;margin-left:auto}.nav{padding-right:0;padding-left:auto}.nav-tabs>li{float:right}.nav-tabs>li>a{margin-left:auto;margin-right:-2px;border-radius:4px 4px 0 0}.nav-pills>li{float:right}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-right:2px;margin-left:auto}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-right:0;margin-left:auto}.nav-justified>.dropdown .dropdown-menu{right:auto}.nav-tabs-justified>li>a{margin-left:0;margin-right:auto}@media (min-width:768px){.nav-tabs-justified>li>a{border-radius:4px 4px 0 0}}@media (min-width:768px){.navbar-header{float:right}}.navbar-collapse{padding-right:15px;padding-left:15px}.navbar-brand{float:right}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-right:-15px;margin-left:auto}}.navbar-toggle{float:left;margin-left:15px;margin-right:auto}@media (max-width:767px){.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 25px 5px 15px}}@media (min-width:768px){.navbar-nav{float:right}.navbar-nav>li{float:right}.navbar-nav.navbar-right:last-child{margin-left:-15px;margin-right:auto}.navbar-nav.navbar-right.flip{float:left!important}.navbar-nav.navbar-right .dropdown-menu{left:0;right:auto}}@media (min-width:768px){.navbar-text{float:right}.navbar-text.navbar-right:last-child{margin-left:0;margin-right:auto}}.pagination{padding-right:0}.pagination>li>a,.pagination>li>span{float:right;margin-right:-1px;margin-left:0}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-left-radius:0;border-top-left-radius:0}.pagination>li:last-child>a,.pagination>li:last-child>span{margin-right:-1px;border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-top-right-radius:0}.pager{padding-right:0;padding-left:none}.pager .next>a,.pager .next>span{float:left}.pager .previous>a,.pager .previous>span{float:right}.nav-pills>li>a>.badge{margin-left:0;margin-right:3px}.alert-dismissable{padding-left:35px;padding-right:15px}.alert-dismissable .close{top:-2px;right:0;left:21}.progress-bar{float:right}.media,.media-body{overflow:hidden;zoom:1}.media>.pull-left{margin-right:10px}.media>.pull-left.flip{margin-right:0;margin-left:10px}.media>.pull-right{margin-left:10px}.media>.pull-right.flip{margin-left:0;margin-right:10px}.media-list{padding-right:0;padding-left:auto;list-style:none}.list-group{padding-right:0;padding-left:none}.list-group-item>.badge{float:left}.list-group-item>.badge+.badge{margin-ight:5px;margin-left:0}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-right-radius:3px;border-top-left-radius:0}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-left-radius:3px;border-top-right-radius:0}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px;border-top-right-radius:0}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px;border-top-left-radius:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-right:0;border-left:none}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:none;border-left:0}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object{right:0;left:none}.close{float:left}.modal-footer{text-align:left}.modal-footer .btn+.btn{margin-left:0;margin-right:5px}.modal-footer .btn-group .btn+.btn{margin-right:-1px;margin-left:0}.modal-footer .btn-block+.btn-block{margin-right:0;margin-left:none}.popover{right:0;left:none;text-align:right}.popover.top>.arrow{right:50%;left:none;margin-right:-11px;margin-left:0}.popover.top>.arrow:after{margin-right:-10px;margin-left:0}.carousel-inner>.item{-webkit-transition:.6s ease-in-out right;-o-transition:.6s ease-in-out right;transition:.6s ease-in-out right}.carousel-inner>.active{right:0}.carousel-inner>.next{right:100%;left:0}.carousel-inner>.prev{right:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{right:0}.carousel-inner>.active.right{left:-100%}.carousel-inner>.active.left{right:100%}.carousel-control{right:0;bottom:0}.carousel-control.left{right:auto;left:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5)0),color-stop(rgba(0,0,0,.0001)100%));background-image:-o-linear-gradient(left,rgba(0,0,0,.5)0,rgba(0,0,0,.0001)100%);background-image:linear-gradient(to right,rgba(0,0,0,.5)0,rgba(0,0,0,.0001)100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001)0),color-stop(rgba(0,0,0,.5)100%));background-image:-o-linear-gradient(left,rgba(0,0,0,.0001)0,rgba(0,0,0,.5)100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001)0,rgba(0,0,0,.5)100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;right:auto;margin-right:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;left:auto;margin-left:-10px}.carousel-indicators{right:50%;left:0;margin-right:-30%;margin-left:0;padding-left:0}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:0;margin-right:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-left:0;margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}}.pull-right.flip{float:left!important}.pull-left.flip{float:right!important}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442} \ No newline at end of file diff --git a/theme/bootstrap/views/css/bootstrap.css b/theme/bootstrap/views/css/bootstrap.css new file mode 100644 index 0000000..fb15e3d --- /dev/null +++ b/theme/bootstrap/views/css/bootstrap.css @@ -0,0 +1,6584 @@ +/*! + * Bootstrap v3.3.4 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +mark { + color: #000; + background: #ff0; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -.5em; +} +sub { + bottom: -.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + select { + background: #fff !important; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\2a"; +} +.glyphicon-plus:before { + content: "\2b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: .01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"], + input[type="time"], + input[type="datetime-local"], + input[type="month"] { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.form-group-sm .form-control { + height: 30px; + line-height: 30px; +} +textarea.form-group-sm .form-control, +select[multiple].form-group-sm .form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.form-group-lg .form-control { + height: 46px; + line-height: 46px; +} +textarea.form-group-lg .form-control, +select[multiple].form-group-lg .form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 14.333333px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + pointer-events: none; + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:hover, +.btn-default:focus, +.btn-default.focus, +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary.focus, +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:hover, +.btn-success:focus, +.btn-success.focus, +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:hover, +.btn-info:focus, +.btn-info.focus, +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:hover, +.btn-warning:focus, +.btn-warning.focus, +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:hover, +.btn-danger:focus, +.btn-danger.focus, +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px solid; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eee; +} +.nav > li.disabled > a { + color: #777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 2; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + background-color: #777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding: 30px 15px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding: 48px 0; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +a.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +a.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +a.list-group-item-success.active:hover, +a.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +a.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +a.list-group-item-info.active:hover, +a.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +a.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +a.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +.modal-header { + min-height: 16.42857143px; + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-weight: normal; + line-height: 1.4; + filter: alpha(opacity=0); + opacity: 0; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + text-decoration: none; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000; + perspective: 1000; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + filter: alpha(opacity=50); + opacity: .5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -15px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/theme/bootstrap/views/css/bootstrap.min.css b/theme/bootstrap/views/css/bootstrap.min.css new file mode 100644 index 0000000..cd1c616 --- /dev/null +++ b/theme/bootstrap/views/css/bootstrap.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.4 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px \9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.form-group-sm .form-control{height:30px;line-height:30px}select[multiple].form-group-sm .form-control,textarea.form-group-sm .form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:5px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.form-group-lg .form-control{height:46px;line-height:46px}select[multiple].form-group-lg .form-control,textarea.form-group-lg .form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:10px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success.focus,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info.focus,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning.focus,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger.focus,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px)and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px 15px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding:48px 0}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.4;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:1.42857143;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000;perspective:1000}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px)and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px)and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px)and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px)and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/theme/bootstrap/views/css/plugins/morris.css b/theme/bootstrap/views/css/plugins/morris.css new file mode 100644 index 0000000..209f091 --- /dev/null +++ b/theme/bootstrap/views/css/plugins/morris.css @@ -0,0 +1,2 @@ +.morris-hover{position:absolute;z-index:1000}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#666;background:rgba(255,255,255,0.8);border:solid 2px rgba(230,230,230,0.8);font-family:sans-serif;font-size:12px;text-align:center}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:0.25em 0} +.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:0.1em 0} diff --git a/theme/bootstrap/views/css/sb-admin-rtl.css b/theme/bootstrap/views/css/sb-admin-rtl.css new file mode 100644 index 0000000..50119bd --- /dev/null +++ b/theme/bootstrap/views/css/sb-admin-rtl.css @@ -0,0 +1,5 @@ + +@media (min-width: 768px){ + #wrapper {padding-right: 225px; padding-left: 0;} + .side-nav{right: 0;left: auto;} +} \ No newline at end of file diff --git a/theme/bootstrap/views/css/sb-admin.css b/theme/bootstrap/views/css/sb-admin.css new file mode 100644 index 0000000..0df3b3f --- /dev/null +++ b/theme/bootstrap/views/css/sb-admin.css @@ -0,0 +1,227 @@ +/*! + * Start Bootstrap - SB Admin Bootstrap Admin Template (http://startbootstrap.com) + * Code licensed under the Apache License v2.0. + * For details, see http://www.apache.org/licenses/LICENSE-2.0. + */ + +/* Global Styles */ + +body { + margin-top: 100px; + background-color: #222; +} + +@media(min-width:768px) { + body { + margin-top: 50px; + } +} + +#wrapper { + padding-left: 0; +} + +#page-wrapper { + width: 100%; + padding: 0; + background-color: #fff; +} + +.huge { + font-size: 50px; + line-height: normal; +} + +@media(min-width:768px) { + #wrapper { + padding-left: 225px; + } + + #page-wrapper { + padding: 10px; + } +} + +/* Top Navigation */ + +.top-nav { + padding: 0 15px; +} + +.top-nav>li { + display: inline-block; + float: left; +} + +.top-nav>li>a { + padding-top: 15px; + padding-bottom: 15px; + line-height: 20px; + color: #999; +} + +.top-nav>li>a:hover, +.top-nav>li>a:focus, +.top-nav>.open>a, +.top-nav>.open>a:hover, +.top-nav>.open>a:focus { + color: #fff; + background-color: #000; +} + +.top-nav>.open>.dropdown-menu { + float: left; + position: absolute; + margin-top: 0; + border: 1px solid rgba(0,0,0,.15); + border-top-left-radius: 0; + border-top-right-radius: 0; + background-color: #fff; + -webkit-box-shadow: 0 6px 12px rgba(0,0,0,.175); + box-shadow: 0 6px 12px rgba(0,0,0,.175); +} + +.top-nav>.open>.dropdown-menu>li>a { + white-space: normal; +} + +ul.message-dropdown { + padding: 0; + max-height: 250px; + overflow-x: hidden; + overflow-y: auto; +} + +li.message-preview { + width: 275px; + border-bottom: 1px solid rgba(0,0,0,.15); +} + +li.message-preview>a { + padding-top: 15px; + padding-bottom: 15px; +} + +li.message-footer { + margin: 5px 0; +} + +ul.alert-dropdown { + width: 200px; +} + +/* Side Navigation */ + +@media(min-width:768px) { + .side-nav { + position: fixed; + top: 51px; + left: 225px; + width: 225px; + margin-left: -225px; + border: none; + border-radius: 0; + overflow-y: auto; + background-color: #222; + bottom: 0; + overflow-x: hidden; + padding-bottom: 40px; + } + + .side-nav>li>a { + width: 225px; + } + + .side-nav li a:hover, + .side-nav li a:focus { + outline: none; + background-color: #000 !important; + } +} + +.side-nav>li>ul { + padding: 0; +} + +.side-nav>li>ul>li>a { + display: block; + padding: 10px 15px 10px 38px; + text-decoration: none; + color: #999; +} + +.side-nav>li>ul>li>a:hover { + color: #fff; +} + +/* Flot Chart Containers */ + +.flot-chart { + display: block; + height: 400px; +} + +.flot-chart-content { + width: 100%; + height: 100%; +} + +/* Custom Colored Panels */ + +.huge { + font-size: 40px; +} + +.panel-green { + border-color: #5cb85c; +} + +.panel-green > .panel-heading { + border-color: #5cb85c; + color: #fff; + background-color: #5cb85c; +} + +.panel-green > a { + color: #5cb85c; +} + +.panel-green > a:hover { + color: #3d8b3d; +} + +.panel-red { + border-color: #d9534f; +} + +.panel-red > .panel-heading { + border-color: #d9534f; + color: #fff; + background-color: #d9534f; +} + +.panel-red > a { + color: #d9534f; +} + +.panel-red > a:hover { + color: #b52b27; +} + +.panel-yellow { + border-color: #f0ad4e; +} + +.panel-yellow > .panel-heading { + border-color: #f0ad4e; + color: #fff; + background-color: #f0ad4e; +} + +.panel-yellow > a { + color: #f0ad4e; +} + +.panel-yellow > a:hover { + color: #df8a13; +} \ No newline at end of file diff --git a/theme/bootstrap/views/css/styles.css b/theme/bootstrap/views/css/styles.css new file mode 100644 index 0000000..f6a42d2 --- /dev/null +++ b/theme/bootstrap/views/css/styles.css @@ -0,0 +1,3 @@ +#page { + padding-top: 60px; +} \ No newline at end of file diff --git a/theme/bootstrap/views/font-awesome/css/font-awesome.css b/theme/bootstrap/views/font-awesome/css/font-awesome.css new file mode 100644 index 0000000..4040b3c --- /dev/null +++ b/theme/bootstrap/views/font-awesome/css/font-awesome.css @@ -0,0 +1,1672 @@ +/*! + * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.2.0'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.28571429em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.85714286em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fa-rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-desc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-asc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} +.fa-space-shuttle:before { + content: "\f197"; +} +.fa-slack:before { + content: "\f198"; +} +.fa-envelope-square:before { + content: "\f199"; +} +.fa-wordpress:before { + content: "\f19a"; +} +.fa-openid:before { + content: "\f19b"; +} +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: "\f19c"; +} +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: "\f19d"; +} +.fa-yahoo:before { + content: "\f19e"; +} +.fa-google:before { + content: "\f1a0"; +} +.fa-reddit:before { + content: "\f1a1"; +} +.fa-reddit-square:before { + content: "\f1a2"; +} +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} +.fa-stumbleupon:before { + content: "\f1a4"; +} +.fa-delicious:before { + content: "\f1a5"; +} +.fa-digg:before { + content: "\f1a6"; +} +.fa-pied-piper:before { + content: "\f1a7"; +} +.fa-pied-piper-alt:before { + content: "\f1a8"; +} +.fa-drupal:before { + content: "\f1a9"; +} +.fa-joomla:before { + content: "\f1aa"; +} +.fa-language:before { + content: "\f1ab"; +} +.fa-fax:before { + content: "\f1ac"; +} +.fa-building:before { + content: "\f1ad"; +} +.fa-child:before { + content: "\f1ae"; +} +.fa-paw:before { + content: "\f1b0"; +} +.fa-spoon:before { + content: "\f1b1"; +} +.fa-cube:before { + content: "\f1b2"; +} +.fa-cubes:before { + content: "\f1b3"; +} +.fa-behance:before { + content: "\f1b4"; +} +.fa-behance-square:before { + content: "\f1b5"; +} +.fa-steam:before { + content: "\f1b6"; +} +.fa-steam-square:before { + content: "\f1b7"; +} +.fa-recycle:before { + content: "\f1b8"; +} +.fa-automobile:before, +.fa-car:before { + content: "\f1b9"; +} +.fa-cab:before, +.fa-taxi:before { + content: "\f1ba"; +} +.fa-tree:before { + content: "\f1bb"; +} +.fa-spotify:before { + content: "\f1bc"; +} +.fa-deviantart:before { + content: "\f1bd"; +} +.fa-soundcloud:before { + content: "\f1be"; +} +.fa-database:before { + content: "\f1c0"; +} +.fa-file-pdf-o:before { + content: "\f1c1"; +} +.fa-file-word-o:before { + content: "\f1c2"; +} +.fa-file-excel-o:before { + content: "\f1c3"; +} +.fa-file-powerpoint-o:before { + content: "\f1c4"; +} +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: "\f1c5"; +} +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: "\f1c6"; +} +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: "\f1c7"; +} +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: "\f1c8"; +} +.fa-file-code-o:before { + content: "\f1c9"; +} +.fa-vine:before { + content: "\f1ca"; +} +.fa-codepen:before { + content: "\f1cb"; +} +.fa-jsfiddle:before { + content: "\f1cc"; +} +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: "\f1cd"; +} +.fa-circle-o-notch:before { + content: "\f1ce"; +} +.fa-ra:before, +.fa-rebel:before { + content: "\f1d0"; +} +.fa-ge:before, +.fa-empire:before { + content: "\f1d1"; +} +.fa-git-square:before { + content: "\f1d2"; +} +.fa-git:before { + content: "\f1d3"; +} +.fa-hacker-news:before { + content: "\f1d4"; +} +.fa-tencent-weibo:before { + content: "\f1d5"; +} +.fa-qq:before { + content: "\f1d6"; +} +.fa-wechat:before, +.fa-weixin:before { + content: "\f1d7"; +} +.fa-send:before, +.fa-paper-plane:before { + content: "\f1d8"; +} +.fa-send-o:before, +.fa-paper-plane-o:before { + content: "\f1d9"; +} +.fa-history:before { + content: "\f1da"; +} +.fa-circle-thin:before { + content: "\f1db"; +} +.fa-header:before { + content: "\f1dc"; +} +.fa-paragraph:before { + content: "\f1dd"; +} +.fa-sliders:before { + content: "\f1de"; +} +.fa-share-alt:before { + content: "\f1e0"; +} +.fa-share-alt-square:before { + content: "\f1e1"; +} +.fa-bomb:before { + content: "\f1e2"; +} +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: "\f1e3"; +} +.fa-tty:before { + content: "\f1e4"; +} +.fa-binoculars:before { + content: "\f1e5"; +} +.fa-plug:before { + content: "\f1e6"; +} +.fa-slideshare:before { + content: "\f1e7"; +} +.fa-twitch:before { + content: "\f1e8"; +} +.fa-yelp:before { + content: "\f1e9"; +} +.fa-newspaper-o:before { + content: "\f1ea"; +} +.fa-wifi:before { + content: "\f1eb"; +} +.fa-calculator:before { + content: "\f1ec"; +} +.fa-paypal:before { + content: "\f1ed"; +} +.fa-google-wallet:before { + content: "\f1ee"; +} +.fa-cc-visa:before { + content: "\f1f0"; +} +.fa-cc-mastercard:before { + content: "\f1f1"; +} +.fa-cc-discover:before { + content: "\f1f2"; +} +.fa-cc-amex:before { + content: "\f1f3"; +} +.fa-cc-paypal:before { + content: "\f1f4"; +} +.fa-cc-stripe:before { + content: "\f1f5"; +} +.fa-bell-slash:before { + content: "\f1f6"; +} +.fa-bell-slash-o:before { + content: "\f1f7"; +} +.fa-trash:before { + content: "\f1f8"; +} +.fa-copyright:before { + content: "\f1f9"; +} +.fa-at:before { + content: "\f1fa"; +} +.fa-eyedropper:before { + content: "\f1fb"; +} +.fa-paint-brush:before { + content: "\f1fc"; +} +.fa-birthday-cake:before { + content: "\f1fd"; +} +.fa-area-chart:before { + content: "\f1fe"; +} +.fa-pie-chart:before { + content: "\f200"; +} +.fa-line-chart:before { + content: "\f201"; +} +.fa-lastfm:before { + content: "\f202"; +} +.fa-lastfm-square:before { + content: "\f203"; +} +.fa-toggle-off:before { + content: "\f204"; +} +.fa-toggle-on:before { + content: "\f205"; +} +.fa-bicycle:before { + content: "\f206"; +} +.fa-bus:before { + content: "\f207"; +} +.fa-ioxhost:before { + content: "\f208"; +} +.fa-angellist:before { + content: "\f209"; +} +.fa-cc:before { + content: "\f20a"; +} +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: "\f20b"; +} +.fa-meanpath:before { + content: "\f20c"; +} diff --git a/theme/bootstrap/views/font-awesome/css/font-awesome.min.css b/theme/bootstrap/views/font-awesome/css/font-awesome.min.css new file mode 100644 index 0000000..ec53d4d --- /dev/null +++ b/theme/bootstrap/views/font-awesome/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"} \ No newline at end of file diff --git a/theme/bootstrap/views/font-awesome/fonts/FontAwesome.otf b/theme/bootstrap/views/font-awesome/fonts/FontAwesome.otf new file mode 100644 index 0000000..81c9ad9 Binary files /dev/null and b/theme/bootstrap/views/font-awesome/fonts/FontAwesome.otf differ diff --git a/theme/bootstrap/views/font-awesome/fonts/fontawesome-webfont.eot b/theme/bootstrap/views/font-awesome/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..84677bc Binary files /dev/null and b/theme/bootstrap/views/font-awesome/fonts/fontawesome-webfont.eot differ diff --git a/theme/bootstrap/views/font-awesome/fonts/fontawesome-webfont.svg b/theme/bootstrap/views/font-awesome/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..d907b25 --- /dev/null +++ b/theme/bootstrap/views/font-awesome/fonts/fontawesome-webfont.svg @@ -0,0 +1,520 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata></metadata> +<defs> +<font id="fontawesomeregular" horiz-adv-x="1536" > +<font-face units-per-em="1792" ascent="1536" descent="-256" /> +<missing-glyph horiz-adv-x="448" /> +<glyph unicode=" " horiz-adv-x="448" /> +<glyph unicode="&#x09;" horiz-adv-x="448" /> +<glyph unicode="&#xa0;" horiz-adv-x="448" /> +<glyph unicode="&#xa8;" horiz-adv-x="1792" /> +<glyph unicode="&#xa9;" horiz-adv-x="1792" /> +<glyph unicode="&#xae;" horiz-adv-x="1792" /> +<glyph unicode="&#xb4;" horiz-adv-x="1792" /> +<glyph unicode="&#xc6;" horiz-adv-x="1792" /> +<glyph unicode="&#xd8;" horiz-adv-x="1792" /> +<glyph unicode="&#x2000;" horiz-adv-x="768" /> +<glyph unicode="&#x2001;" horiz-adv-x="1537" /> +<glyph unicode="&#x2002;" horiz-adv-x="768" /> +<glyph unicode="&#x2003;" horiz-adv-x="1537" /> +<glyph unicode="&#x2004;" horiz-adv-x="512" /> +<glyph unicode="&#x2005;" horiz-adv-x="384" /> +<glyph unicode="&#x2006;" horiz-adv-x="256" /> +<glyph unicode="&#x2007;" horiz-adv-x="256" /> +<glyph unicode="&#x2008;" horiz-adv-x="192" /> +<glyph unicode="&#x2009;" horiz-adv-x="307" /> +<glyph unicode="&#x200a;" horiz-adv-x="85" /> +<glyph unicode="&#x202f;" horiz-adv-x="307" /> +<glyph unicode="&#x205f;" horiz-adv-x="384" /> +<glyph unicode="&#x2122;" horiz-adv-x="1792" /> +<glyph unicode="&#x221e;" horiz-adv-x="1792" /> +<glyph unicode="&#x2260;" horiz-adv-x="1792" /> +<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" /> +<glyph unicode="&#xf000;" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" /> +<glyph unicode="&#xf001;" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" /> +<glyph unicode="&#xf002;" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> +<glyph unicode="&#xf003;" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" /> +<glyph unicode="&#xf004;" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" /> +<glyph unicode="&#xf005;" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" /> +<glyph unicode="&#xf006;" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" /> +<glyph unicode="&#xf007;" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" /> +<glyph unicode="&#xf008;" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> +<glyph unicode="&#xf009;" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> +<glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" /> +<glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" /> +<glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" /> +<glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" /> +<glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" /> +<glyph unicode="&#xf010;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " /> +<glyph unicode="&#xf011;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" /> +<glyph unicode="&#xf012;" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf013;" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" /> +<glyph unicode="&#xf014;" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf015;" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" /> +<glyph unicode="&#xf016;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z " /> +<glyph unicode="&#xf017;" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf018;" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" /> +<glyph unicode="&#xf019;" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" /> +<glyph unicode="&#xf01a;" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf01b;" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf01c;" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" /> +<glyph unicode="&#xf01d;" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf01e;" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" /> +<glyph unicode="&#xf021;" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" /> +<glyph unicode="&#xf022;" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" /> +<glyph unicode="&#xf023;" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" /> +<glyph unicode="&#xf024;" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf025;" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" /> +<glyph unicode="&#xf026;" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" /> +<glyph unicode="&#xf027;" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" /> +<glyph unicode="&#xf028;" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" /> +<glyph unicode="&#xf029;" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" /> +<glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" /> +<glyph unicode="&#xf02b;" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" /> +<glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" /> +<glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" /> +<glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" /> +<glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" /> +<glyph unicode="&#xf030;" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" /> +<glyph unicode="&#xf031;" horiz-adv-x="1664" d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57 q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5 q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" /> +<glyph unicode="&#xf032;" horiz-adv-x="1408" d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142 q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5 t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68.5 -0.5t67.5 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5 t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" /> +<glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q6 2 81.5 21.5t111.5 37.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" /> +<glyph unicode="&#xf034;" horiz-adv-x="1792" d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2 t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5 q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" /> +<glyph unicode="&#xf035;" d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1 t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5 t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49 t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" /> +<glyph unicode="&#xf036;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf037;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf038;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf039;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" /> +<glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> +<glyph unicode="&#xf040;" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" /> +<glyph unicode="&#xf041;" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" /> +<glyph unicode="&#xf042;" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf043;" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" /> +<glyph unicode="&#xf044;" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" /> +<glyph unicode="&#xf045;" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" /> +<glyph unicode="&#xf046;" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" /> +<glyph unicode="&#xf047;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" /> +<glyph unicode="&#xf048;" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" /> +<glyph unicode="&#xf049;" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" /> +<glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" /> +<glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" /> +<glyph unicode="&#xf04c;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf04d;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" /> +<glyph unicode="&#xf050;" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" /> +<glyph unicode="&#xf051;" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" /> +<glyph unicode="&#xf052;" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" /> +<glyph unicode="&#xf053;" horiz-adv-x="1280" d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" /> +<glyph unicode="&#xf054;" horiz-adv-x="1280" d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" /> +<glyph unicode="&#xf055;" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf056;" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" /> +<glyph unicode="&#xf057;" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf058;" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf059;" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf05a;" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf05b;" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf05c;" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf05d;" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf05e;" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" /> +<glyph unicode="&#xf060;" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" /> +<glyph unicode="&#xf061;" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" /> +<glyph unicode="&#xf062;" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" /> +<glyph unicode="&#xf063;" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" /> +<glyph unicode="&#xf064;" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" /> +<glyph unicode="&#xf065;" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf066;" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" /> +<glyph unicode="&#xf067;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" /> +<glyph unicode="&#xf068;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" /> +<glyph unicode="&#xf069;" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" /> +<glyph unicode="&#xf06a;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" /> +<glyph unicode="&#xf06b;" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" /> +<glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" /> +<glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" /> +<glyph unicode="&#xf070;" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " /> +<glyph unicode="&#xf071;" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" /> +<glyph unicode="&#xf072;" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" /> +<glyph unicode="&#xf073;" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> +<glyph unicode="&#xf074;" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" /> +<glyph unicode="&#xf075;" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" /> +<glyph unicode="&#xf076;" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf077;" horiz-adv-x="1792" d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" /> +<glyph unicode="&#xf078;" horiz-adv-x="1792" d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" /> +<glyph unicode="&#xf079;" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " /> +<glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5 l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5 t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> +<glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" /> +<glyph unicode="&#xf07d;" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" /> +<glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" /> +<glyph unicode="&#xf080;" horiz-adv-x="2048" d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" /> +<glyph unicode="&#xf081;" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf082;" d="M1536 160q0 -119 -84.5 -203.5t-203.5 -84.5h-192v608h203l30 224h-233v143q0 54 28 83t96 29l132 1v207q-96 9 -180 9q-136 0 -218 -80.5t-82 -225.5v-166h-224v-224h224v-608h-544q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 q119 0 203.5 -84.5t84.5 -203.5v-960z" /> +<glyph unicode="&#xf083;" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" /> +<glyph unicode="&#xf084;" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" /> +<glyph unicode="&#xf085;" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" /> +<glyph unicode="&#xf086;" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" /> +<glyph unicode="&#xf087;" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" /> +<glyph unicode="&#xf088;" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" /> +<glyph unicode="&#xf089;" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" /> +<glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" /> +<glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" /> +<glyph unicode="&#xf08c;" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" /> +<glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf090;" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf091;" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" /> +<glyph unicode="&#xf092;" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf093;" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" /> +<glyph unicode="&#xf094;" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" /> +<glyph unicode="&#xf095;" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" /> +<glyph unicode="&#xf096;" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf097;" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" /> +<glyph unicode="&#xf098;" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf099;" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" /> +<glyph unicode="&#xf09a;" horiz-adv-x="1024" d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" /> +<glyph unicode="&#xf09b;" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" /> +<glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" /> +<glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" /> +<glyph unicode="&#xf0a0;" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" /> +<glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" /> +<glyph unicode="&#xf0a2;" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5 t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" /> +<glyph unicode="&#xf0a3;" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" /> +<glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" /> +<glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" /> +<glyph unicode="&#xf0a6;" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" /> +<glyph unicode="&#xf0a7;" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" /> +<glyph unicode="&#xf0a8;" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf0a9;" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf0aa;" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf0ab;" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf0ac;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" /> +<glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" /> +<glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" /> +<glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" /> +<glyph unicode="&#xf0b2;" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " /> +<glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" /> +<glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" /> +<glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " /> +<glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" /> +<glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" /> +<glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" /> +<glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" /> +<glyph unicode="&#xf0c7;" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" /> +<glyph unicode="&#xf0c8;" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf0c9;" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" /> +<glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" /> +<glyph unicode="&#xf0cd;" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" /> +<glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" /> +<glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" /> +<glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf0d2;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf0d3;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" /> +<glyph unicode="&#xf0d4;" d="M829 318q0 -76 -58.5 -112.5t-139.5 -36.5q-41 0 -80.5 9.5t-75.5 28.5t-58 53t-22 78q0 46 25 80t65.5 51.5t82 25t84.5 7.5q20 0 31 -2q2 -1 23 -16.5t26 -19t23 -18t24.5 -22t19 -22.5t17 -26t9 -26.5t4.5 -31.5zM755 863q0 -60 -33 -99.5t-92 -39.5q-53 0 -93 42.5 t-57.5 96.5t-17.5 106q0 61 32 104t92 43q53 0 93.5 -45t58 -101t17.5 -107zM861 1120l88 64h-265q-85 0 -161 -32t-127.5 -98t-51.5 -153q0 -93 64.5 -154.5t158.5 -61.5q22 0 43 3q-13 -29 -13 -54q0 -44 40 -94q-175 -12 -257 -63q-47 -29 -75.5 -73t-28.5 -95 q0 -43 18.5 -77.5t48.5 -56.5t69 -37t77.5 -21t76.5 -6q60 0 120.5 15.5t113.5 46t86 82.5t33 117q0 49 -20 89.5t-49 66.5t-58 47.5t-49 44t-20 44.5t15.5 42.5t37.5 39.5t44 42t37.5 59.5t15.5 82.5q0 60 -22.5 99.5t-72.5 90.5h83zM1152 672h128v64h-128v128h-64v-128 h-128v-64h128v-160h64v160zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M735 740q0 -36 32 -70.5t77.5 -68t90.5 -73.5t77 -104t32 -142q0 -90 -48 -173q-72 -122 -211 -179.5t-298 -57.5q-132 0 -246.5 41.5t-171.5 137.5q-37 60 -37 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 42 -47.5 74t-15.5 73q0 36 21 85q-46 -4 -68 -4 q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q77 66 182.5 98t217.5 32h418l-138 -88h-131q74 -63 112 -133t38 -160q0 -72 -24.5 -129.5t-59 -93t-69.5 -65t-59.5 -61.5t-24.5 -66zM589 836q38 0 78 16.5t66 43.5q53 57 53 159q0 58 -17 125t-48.5 129.5 t-84.5 103.5t-117 41q-42 0 -82.5 -19.5t-65.5 -52.5q-47 -59 -47 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26zM591 -37q58 0 111.5 13t99 39t73 73t27.5 109q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -48 2 q-53 0 -105 -7t-107.5 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -70 35 -123.5t91.5 -83t119 -44t127.5 -14.5zM1401 839h213v-108h-213v-219h-105v219h-212v108h212v217h105v-217z" /> +<glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> +<glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" /> +<glyph unicode="&#xf0da;" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" /> +<glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" /> +<glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> +<glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" /> +<glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" /> +<glyph unicode="&#xf0e1;" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" /> +<glyph unicode="&#xf0e2;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" /> +<glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" /> +<glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> +<glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" /> +<glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" /> +<glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" /> +<glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" /> +<glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" /> +<glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" /> +<glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" /> +<glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" /> +<glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" /> +<glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" /> +<glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" /> +<glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" /> +<glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" /> +<glyph unicode="&#xf0f3;" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5 t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" /> +<glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" /> +<glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf0f6;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704 q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" /> +<glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" /> +<glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" /> +<glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" /> +<glyph unicode="&#xf0fd;" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf0fe;" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf100;" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" /> +<glyph unicode="&#xf101;" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> +<glyph unicode="&#xf102;" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> +<glyph unicode="&#xf103;" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> +<glyph unicode="&#xf104;" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> +<glyph unicode="&#xf105;" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> +<glyph unicode="&#xf106;" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" /> +<glyph unicode="&#xf107;" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" /> +<glyph unicode="&#xf108;" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" /> +<glyph unicode="&#xf109;" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" /> +<glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" /> +<glyph unicode="&#xf10b;" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" /> +<glyph unicode="&#xf10c;" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" /> +<glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" /> +<glyph unicode="&#xf110;" horiz-adv-x="1568" d="M496 192q0 -60 -42.5 -102t-101.5 -42q-60 0 -102 42t-42 102t42 102t102 42q59 0 101.5 -42t42.5 -102zM928 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -66 -47 -113t-113 -47t-113 47t-47 113 t47 113t113 47t113 -47t47 -113zM1360 192q0 -46 -33 -79t-79 -33t-79 33t-33 79t33 79t79 33t79 -33t33 -79zM528 1088q0 -73 -51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5t51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5zM992 1280q0 -80 -56 -136t-136 -56 t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1536 640q0 -40 -28 -68t-68 -28t-68 28t-28 68t28 68t68 28t68 -28t28 -68zM1328 1088q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5z" /> +<glyph unicode="&#xf111;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf112;" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" /> +<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" /> +<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> +<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " /> +<glyph unicode="&#xf116;" horiz-adv-x="1792" /> +<glyph unicode="&#xf117;" horiz-adv-x="1792" /> +<glyph unicode="&#xf118;" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf119;" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf11a;" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" /> +<glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" /> +<glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" /> +<glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" /> +<glyph unicode="&#xf120;" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" /> +<glyph unicode="&#xf121;" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" /> +<glyph unicode="&#xf122;" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" /> +<glyph unicode="&#xf123;" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" /> +<glyph unicode="&#xf124;" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" /> +<glyph unicode="&#xf125;" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf126;" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" /> +<glyph unicode="&#xf127;" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" /> +<glyph unicode="&#xf128;" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" /> +<glyph unicode="&#xf129;" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf12a;" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" /> +<glyph unicode="&#xf12b;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" /> +<glyph unicode="&#xf12c;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" /> +<glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" /> +<glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" /> +<glyph unicode="&#xf130;" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" /> +<glyph unicode="&#xf131;" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" /> +<glyph unicode="&#xf132;" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf133;" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> +<glyph unicode="&#xf134;" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" /> +<glyph unicode="&#xf135;" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" /> +<glyph unicode="&#xf136;" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" /> +<glyph unicode="&#xf137;" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf138;" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf139;" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf13a;" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" /> +<glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" /> +<glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" /> +<glyph unicode="&#xf140;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf141;" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" /> +<glyph unicode="&#xf142;" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" /> +<glyph unicode="&#xf143;" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf144;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" /> +<glyph unicode="&#xf145;" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" /> +<glyph unicode="&#xf146;" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" /> +<glyph unicode="&#xf147;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf148;" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" /> +<glyph unicode="&#xf149;" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" /> +<glyph unicode="&#xf14a;" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf14b;" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf14c;" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf14d;" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf14e;" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf150;" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf151;" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf152;" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf153;" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" /> +<glyph unicode="&#xf154;" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" /> +<glyph unicode="&#xf155;" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" /> +<glyph unicode="&#xf156;" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf157;" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" /> +<glyph unicode="&#xf158;" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" /> +<glyph unicode="&#xf159;" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" /> +<glyph unicode="&#xf15b;" d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" /> +<glyph unicode="&#xf15c;" d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" /> +<glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" /> +<glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" /> +<glyph unicode="&#xf160;" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf161;" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf162;" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" /> +<glyph unicode="&#xf163;" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" /> +<glyph unicode="&#xf164;" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" /> +<glyph unicode="&#xf165;" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" /> +<glyph unicode="&#xf166;" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf167;" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" /> +<glyph unicode="&#xf168;" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" /> +<glyph unicode="&#xf169;" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" /> +<glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" /> +<glyph unicode="&#xf16c;" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" /> +<glyph unicode="&#xf16d;" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" /> +<glyph unicode="&#xf16e;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" /> +<glyph unicode="&#xf170;" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf171;" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" /> +<glyph unicode="&#xf172;" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf173;" horiz-adv-x="1024" d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14 q78 2 134 29z" /> +<glyph unicode="&#xf174;" d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf175;" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" /> +<glyph unicode="&#xf176;" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" /> +<glyph unicode="&#xf177;" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf178;" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" /> +<glyph unicode="&#xf179;" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" /> +<glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" /> +<glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" /> +<glyph unicode="&#xf17c;" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" /> +<glyph unicode="&#xf17d;" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf17e;" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" /> +<glyph unicode="&#xf180;" horiz-adv-x="1280" d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324 l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" /> +<glyph unicode="&#xf181;" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf182;" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> +<glyph unicode="&#xf183;" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> +<glyph unicode="&#xf184;" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf185;" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" /> +<glyph unicode="&#xf186;" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" /> +<glyph unicode="&#xf187;" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" /> +<glyph unicode="&#xf188;" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" /> +<glyph unicode="&#xf189;" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" /> +<glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" /> +<glyph unicode="&#xf18b;" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" /> +<glyph unicode="&#xf18c;" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" /> +<glyph unicode="&#xf18d;" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " /> +<glyph unicode="&#xf18e;" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf190;" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf191;" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf192;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf193;" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 16 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" /> +<glyph unicode="&#xf194;" d="M1254 899q16 85 -21 132q-52 65 -187 45q-17 -3 -41 -12.5t-57.5 -30.5t-64.5 -48.5t-59.5 -70t-44.5 -91.5q80 7 113.5 -16t26.5 -99q-5 -52 -52 -143q-43 -78 -71 -99q-44 -32 -87 14q-23 24 -37.5 64.5t-19 73t-10 84t-8.5 71.5q-23 129 -34 164q-12 37 -35.5 69 t-50.5 40q-57 16 -127 -25q-54 -32 -136.5 -106t-122.5 -102v-7q16 -8 25.5 -26t21.5 -20q21 -3 54.5 8.5t58 10.5t41.5 -30q11 -18 18.5 -38.5t15 -48t12.5 -40.5q17 -46 53 -187q36 -146 57 -197q42 -99 103 -125q43 -12 85 -1.5t76 31.5q131 77 250 237 q104 139 172.5 292.5t82.5 226.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf195;" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf196;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf197;" horiz-adv-x="2176" d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40 t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29 q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" /> +<glyph unicode="&#xf198;" horiz-adv-x="1664" d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9 q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102 t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" /> +<glyph unicode="&#xf199;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69 q-46 32 -141.5 92.5t-142.5 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13 t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" /> +<glyph unicode="&#xf19a;" horiz-adv-x="1792" d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5 t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21 t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286 t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273 t273 -182.5t331.5 -68z" /> +<glyph unicode="&#xf19b;" horiz-adv-x="1792" d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" /> +<glyph unicode="&#xf19c;" horiz-adv-x="2048" d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64 q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" /> +<glyph unicode="&#xf19d;" horiz-adv-x="2304" d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433 q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" /> +<glyph unicode="&#xf19e;" d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q43 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0 q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" /> +<glyph unicode="&#xf1a0;" horiz-adv-x="1280" d="M981 197q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -49 2q-53 0 -104.5 -7t-107 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -56 23.5 -102t61 -75.5t87 -50t100 -29t101.5 -8.5q58 0 111.5 13t99 39t73 73t27.5 109zM864 1055 q0 59 -17 125.5t-48 129t-84 103.5t-117 41q-42 0 -82.5 -19.5t-66.5 -52.5q-46 -59 -46 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26q37 0 77.5 16.5t65.5 43.5q53 56 53 159zM752 1536h417l-137 -88h-132q75 -63 113 -133t38 -160q0 -72 -24.5 -129.5 t-59.5 -93t-69.5 -65t-59 -61.5t-24.5 -66q0 -36 32 -70.5t77 -68t90.5 -73.5t77.5 -104t32 -142q0 -91 -49 -173q-71 -122 -209.5 -179.5t-298.5 -57.5q-132 0 -246.5 41.5t-172.5 137.5q-36 59 -36 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 41 -47.5 73.5 t-15.5 73.5q0 40 21 85q-46 -4 -68 -4q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q76 66 182 98t218 32z" /> +<glyph unicode="&#xf1a1;" horiz-adv-x="1984" d="M831 572q0 -56 -40.5 -96t-96.5 -40q-57 0 -98 40t-41 96q0 57 41.5 98t97.5 41t96.5 -41t40.5 -98zM1292 711q56 0 96.5 -41t40.5 -98q0 -56 -40.5 -96t-96.5 -40q-57 0 -98 40t-41 96q0 57 41.5 98t97.5 41zM1984 722q0 -62 -31 -114t-83 -82q5 -33 5 -61 q0 -121 -68.5 -230.5t-197.5 -193.5q-125 -82 -285.5 -125.5t-335.5 -43.5q-176 0 -336.5 43.5t-284.5 125.5q-129 84 -197.5 193t-68.5 231q0 29 5 66q-48 31 -77 81.5t-29 109.5q0 94 66 160t160 66q83 0 148 -55q248 158 592 164l134 423q4 14 17.5 21.5t28.5 4.5 l347 -82q22 50 68.5 81t102.5 31q77 0 131.5 -54.5t54.5 -131.5t-54.5 -132t-131.5 -55q-76 0 -130.5 54t-55.5 131l-315 74l-116 -366q327 -14 560 -166q64 58 151 58q94 0 160 -66t66 -160zM1664 1459q-45 0 -77 -32t-32 -77t32 -77t77 -32t77 32t32 77t-32 77t-77 32z M77 722q0 -67 51 -111q49 131 180 235q-36 25 -82 25q-62 0 -105.5 -43.5t-43.5 -105.5zM1567 105q112 73 171.5 166t59.5 194t-59.5 193.5t-171.5 165.5q-116 75 -265.5 115.5t-313.5 40.5t-313.5 -40.5t-265.5 -115.5q-112 -73 -171.5 -165.5t-59.5 -193.5t59.5 -194 t171.5 -166q116 -75 265.5 -115.5t313.5 -40.5t313.5 40.5t265.5 115.5zM1850 605q57 46 57 117q0 62 -43.5 105.5t-105.5 43.5q-49 0 -86 -28q131 -105 178 -238zM1258 237q11 11 27 11t27 -11t11 -27.5t-11 -27.5q-99 -99 -319 -99h-2q-220 0 -319 99q-11 11 -11 27.5 t11 27.5t27 11t27 -11q77 -77 265 -77h2q188 0 265 77z" /> +<glyph unicode="&#xf1a2;" d="M950 393q7 7 17.5 7t17.5 -7t7 -18t-7 -18q-65 -64 -208 -64h-1h-1q-143 0 -207 64q-8 7 -8 18t8 18q7 7 17.5 7t17.5 -7q49 -51 172 -51h1h1q122 0 173 51zM671 613q0 -37 -26 -64t-63 -27t-63 27t-26 64t26 63t63 26t63 -26t26 -63zM1214 1049q-29 0 -50 21t-21 50 q0 30 21 51t50 21q30 0 51 -21t21 -51q0 -29 -21 -50t-51 -21zM1216 1408q132 0 226 -94t94 -227v-894q0 -133 -94 -227t-226 -94h-896q-132 0 -226 94t-94 227v894q0 133 94 227t226 94h896zM1321 596q35 14 57 45.5t22 70.5q0 51 -36 87.5t-87 36.5q-60 0 -98 -48 q-151 107 -375 115l83 265l206 -49q1 -50 36.5 -85t84.5 -35q50 0 86 35.5t36 85.5t-36 86t-86 36q-36 0 -66 -20.5t-45 -53.5l-227 54q-9 2 -17.5 -2.5t-11.5 -14.5l-95 -302q-224 -4 -381 -113q-36 43 -93 43q-51 0 -87 -36.5t-36 -87.5q0 -37 19.5 -67.5t52.5 -45.5 q-7 -25 -7 -54q0 -98 74 -181.5t201.5 -132t278.5 -48.5q150 0 277.5 48.5t201.5 132t74 181.5q0 27 -6 54zM971 702q37 0 63 -26t26 -63t-26 -64t-63 -27t-63 27t-26 64t26 63t63 26z" /> +<glyph unicode="&#xf1a3;" d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150 v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103 t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf1a4;" horiz-adv-x="1920" d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328 v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" /> +<glyph unicode="&#xf1a5;" d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" /> +<glyph unicode="&#xf1a6;" horiz-adv-x="2048" d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123 v-369h123z" /> +<glyph unicode="&#xf1a7;" d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101 v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf1a8;" horiz-adv-x="2038" d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14 q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24 q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33 q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5 t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43 q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5 t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13 t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" /> +<glyph unicode="&#xf1a9;" d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10 q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14 q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14 t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44 q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" /> +<glyph unicode="&#xf1aa;" d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5 t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5 q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126 t135.5 51q85 0 145 -60.5t60 -145.5z" /> +<glyph unicode="&#xf1ab;" d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5 q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28 q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11 q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q106 35 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5 q20 0 20 -21v-418z" /> +<glyph unicode="&#xf1ac;" horiz-adv-x="1792" d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48 l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23 t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128 q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128 q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" /> +<glyph unicode="&#xf1ad;" d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9 t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9 t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" /> +<glyph unicode="&#xf1ae;" horiz-adv-x="1280" d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68t68 28t68 -28l228 -228h368l228 228q28 28 68 28t68 -28t28 -68t-28 -68zM864 1152q0 -93 -65.5 -158.5 t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" /> +<glyph unicode="&#xf1b0;" horiz-adv-x="1664" d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5 q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819 q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5 t100.5 134t141.5 55.5z" /> +<glyph unicode="&#xf1b1;" horiz-adv-x="768" d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" /> +<glyph unicode="&#xf1b2;" horiz-adv-x="1792" d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z " /> +<glyph unicode="&#xf1b3;" horiz-adv-x="2304" d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67 t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-5 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70 v-400l434 -186q36 -16 57 -48t21 -70z" /> +<glyph unicode="&#xf1b4;" horiz-adv-x="2048" d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658 q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204 q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" /> +<glyph unicode="&#xf1b5;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5 t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217 t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" /> +<glyph unicode="&#xf1b6;" horiz-adv-x="1792" d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5 q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89 q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" /> +<glyph unicode="&#xf1b7;" d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5 q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5 q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z " /> +<glyph unicode="&#xf1b8;" horiz-adv-x="1792" d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188 l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5 t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1 q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" /> +<glyph unicode="&#xf1b9;" horiz-adv-x="2048" d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384 q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5 l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" /> +<glyph unicode="&#xf1ba;" horiz-adv-x="2048" d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5 t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" /> +<glyph unicode="&#xf1bb;" d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384 q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" /> +<glyph unicode="&#xf1bc;" d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64 q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37 q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf1bd;" d="M1397 1408q58 0 98.5 -40.5t40.5 -98.5v-1258q0 -58 -40.5 -98.5t-98.5 -40.5h-1258q-58 0 -98.5 40.5t-40.5 98.5v1258q0 58 40.5 98.5t98.5 40.5h1258zM1465 11v1258q0 28 -20 48t-48 20h-1258q-28 0 -48 -20t-20 -48v-1258q0 -28 20 -48t48 -20h1258q28 0 48 20t20 48 zM694 749l188 -387l533 145v-496q0 -7 -5.5 -12.5t-12.5 -5.5h-1258q-7 0 -12.5 5.5t-5.5 12.5v141l711 195l-212 439q4 1 12 2.5t12 1.5q170 32 303.5 21.5t221 -46t143.5 -94.5q27 -28 -25 -42q-64 -16 -256 -62l-97 198q-111 7 -240 -16zM1397 1287q7 0 12.5 -5.5 t5.5 -12.5v-428q-85 30 -188 52q-294 64 -645 12l-18 -3l-65 134h-233l85 -190q-132 -51 -230 -137v560q0 7 5.5 12.5t12.5 5.5h1258zM286 387q-14 -3 -26 4.5t-14 21.5q-24 203 166 305l129 -270z" /> +<glyph unicode="&#xf1be;" horiz-adv-x="2304" d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11 q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245 q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785 l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242 q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236q0 -11 -8 -19 t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786q-13 2 -22 11t-9 22v899 q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" /> +<glyph unicode="&#xf1c0;" d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127 t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5 t-103 128v128q0 69 103 128t280 93.5t385 34.5z" /> +<glyph unicode="&#xf1c1;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197 q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8 q-1 1 -1 2t-0.5 1.5t-0.5 1.5q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" /> +<glyph unicode="&#xf1c2;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4l-3 21q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5t-3.5 -21.5l-4 -21h-4l-2 21 q-2 26 -7 46l-99 438h90v107h-300z" /> +<glyph unicode="&#xf1c3;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107 h-290v-107h68l189 -272l-194 -283h-68z" /> +<glyph unicode="&#xf1c4;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" /> +<glyph unicode="&#xf1c5;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" /> +<glyph unicode="&#xf1c6;" d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400 v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79 q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" /> +<glyph unicode="&#xf1c7;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5 q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" /> +<glyph unicode="&#xf1c8;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" /> +<glyph unicode="&#xf1c9;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243 l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" /> +<glyph unicode="&#xf1ca;" d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406 q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" /> +<glyph unicode="&#xf1cb;" horiz-adv-x="1792" d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546 q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" /> +<glyph unicode="&#xf1cc;" horiz-adv-x="2048" d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94 q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55 t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97q14 -16 29.5 -34t34.5 -40t29 -34q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5 t-85 -189.5z" /> +<glyph unicode="&#xf1cd;" horiz-adv-x="1792" d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194 q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5 t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" /> +<glyph unicode="&#xf1ce;" horiz-adv-x="1792" d="M1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348q0 222 101 414.5t276.5 317t390.5 155.5v-260q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 q0 230 -145.5 406t-366.5 221v260q215 -31 390.5 -155.5t276.5 -317t101 -414.5z" /> +<glyph unicode="&#xf1d0;" horiz-adv-x="1792" d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170 t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136 q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" /> +<glyph unicode="&#xf1d1;" horiz-adv-x="1792" d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251 l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162 q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33 q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5 t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" /> +<glyph unicode="&#xf1d2;" d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85 q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392 q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072 q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf1d3;" horiz-adv-x="1792" d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58 q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47 q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171 v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" /> +<glyph unicode="&#xf1d4;" d="M825 547l343 588h-150q-21 -39 -63.5 -118.5t-68 -128.5t-59.5 -118.5t-60 -128.5h-3q-21 48 -44.5 97t-52 105.5t-46.5 92t-54 104.5t-49 95h-150l323 -589v-435h134v436zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf1d5;" horiz-adv-x="1280" d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5 t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153 t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" /> +<glyph unicode="&#xf1d6;" horiz-adv-x="1792" d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5 q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20 t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5 t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" /> +<glyph unicode="&#xf1d7;" horiz-adv-x="2048" d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25 q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5 q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109 q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" /> +<glyph unicode="&#xf1d8;" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" /> +<glyph unicode="&#xf1d9;" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137 l863 639l-478 -797z" /> +<glyph unicode="&#xf1da;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23 t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf1db;" d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf1dc;" horiz-adv-x="1792" d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15 t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2 t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5 q0 -26 -12 -48t-36 -22z" /> +<glyph unicode="&#xf1dd;" horiz-adv-x="1280" d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179 q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" /> +<glyph unicode="&#xf1de;" d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256 q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" /> +<glyph unicode="&#xf1e0;" d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5 t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" /> +<glyph unicode="&#xf1e1;" d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5 t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf1e2;" horiz-adv-x="1792" d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5 t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91 q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9 t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" /> +<glyph unicode="&#xf1e3;" horiz-adv-x="1792" d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323 l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" /> +<glyph unicode="&#xf1e4;" horiz-adv-x="1792" d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23 zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5 t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" /> +<glyph unicode="&#xf1e5;" horiz-adv-x="1792" d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf1e6;" horiz-adv-x="1792" d="M1755 1083q37 -37 37 -90t-37 -91l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234l401 400 q38 37 91 37t90 -37z" /> +<glyph unicode="&#xf1e7;" horiz-adv-x="1792" d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5 t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q3 -2 11 -7 t11 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" /> +<glyph unicode="&#xf1e8;" horiz-adv-x="1792" d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" /> +<glyph unicode="&#xf1e9;" d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36 q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q70 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5 t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87 q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" /> +<glyph unicode="&#xf1ea;" horiz-adv-x="2048" d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19 t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" /> +<glyph unicode="&#xf1eb;" horiz-adv-x="2048" d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121 q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" /> +<glyph unicode="&#xf1ec;" horiz-adv-x="1792" d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38 h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" /> +<glyph unicode="&#xf1ed;" horiz-adv-x="1792" d="M1112 1090q0 159 -237 159h-70q-32 0 -59.5 -21.5t-34.5 -52.5l-63 -276q-2 -5 -2 -16q0 -24 17 -39.5t41 -15.5h53q69 0 128.5 13t112.5 41t83.5 81.5t30.5 126.5zM1716 938q0 -265 -220 -428q-219 -161 -612 -161h-61q-32 0 -59 -21.5t-34 -52.5l-73 -316 q-8 -36 -40.5 -61.5t-69.5 -25.5h-213q-31 0 -53 20t-22 51q0 10 13 65h151q34 0 64 23.5t38 56.5l73 316q8 33 37.5 57t63.5 24h61q390 0 607 160t217 421q0 129 -51 207q183 -92 183 -335zM1533 1123q0 -264 -221 -428q-218 -161 -612 -161h-60q-32 0 -59.5 -22t-34.5 -53 l-73 -315q-8 -36 -40 -61.5t-69 -25.5h-214q-31 0 -52.5 19.5t-21.5 51.5q0 8 2 20l300 1301q8 36 40.5 61.5t69.5 25.5h444q68 0 125 -4t120.5 -15t113.5 -30t96.5 -50.5t77.5 -74t49.5 -103.5t18.5 -136z" /> +<glyph unicode="&#xf1ee;" horiz-adv-x="1792" d="M602 949q19 -61 31 -123.5t17 -141.5t-14 -159t-62 -145q-21 81 -67 157t-95.5 127t-99 90.5t-78.5 57.5t-33 19q-62 34 -81.5 100t14.5 128t101 81.5t129 -14.5q138 -83 238 -177zM927 1236q11 -25 20.5 -46t36.5 -100.5t42.5 -150.5t25.5 -179.5t0 -205.5t-47.5 -209.5 t-105.5 -208.5q-51 -72 -138 -72q-54 0 -98 31q-57 40 -69 109t28 127q60 85 81 195t13 199.5t-32 180.5t-39 128t-22 52q-31 63 -8.5 129.5t85.5 97.5q34 17 75 17q47 0 88.5 -25t63.5 -69zM1248 567q-17 -160 -72 -311q-17 131 -63 246q25 174 -5 361q-27 178 -94 342 q114 -90 212 -211q9 -37 15 -80q26 -179 7 -347zM1520 1440q9 -17 23.5 -49.5t43.5 -117.5t50.5 -178t34 -227.5t5 -269t-47 -300t-112.5 -323.5q-22 -48 -66 -75.5t-95 -27.5q-39 0 -74 16q-67 31 -92.5 100t4.5 136q58 126 90 257.5t37.5 239.5t-3.5 213.5t-26.5 180.5 t-38.5 138.5t-32.5 90t-15.5 32.5q-34 65 -11.5 135.5t87.5 104.5q37 20 81 20q49 0 91.5 -25.5t66.5 -70.5z" /> +<glyph unicode="&#xf1f0;" horiz-adv-x="2304" d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27 q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128 q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> +<glyph unicode="&#xf1f1;" horiz-adv-x="2304" d="M671 603h-13q-47 0 -47 -32q0 -22 20 -22q17 0 28 15t12 39zM1066 639h62v3q1 4 0.5 6.5t-1 7t-2 8t-4.5 6.5t-7.5 5t-11.5 2q-28 0 -36 -38zM1606 603h-12q-48 0 -48 -32q0 -22 20 -22q17 0 28 15t12 39zM1925 629q0 41 -30 41q-19 0 -31 -20t-12 -51q0 -42 28 -42 q20 0 32.5 20t12.5 52zM480 770h87l-44 -262h-56l32 201l-71 -201h-39l-4 200l-34 -200h-53l44 262h81l2 -163zM733 663q0 -6 -4 -42q-16 -101 -17 -113h-47l1 22q-20 -26 -58 -26q-23 0 -37.5 16t-14.5 42q0 39 26 60.5t73 21.5q14 0 23 -1q0 3 0.5 5.5t1 4.5t0.5 3 q0 20 -36 20q-29 0 -59 -10q0 4 7 48q38 11 67 11q74 0 74 -62zM889 721l-8 -49q-22 3 -41 3q-27 0 -27 -17q0 -8 4.5 -12t21.5 -11q40 -19 40 -60q0 -72 -87 -71q-34 0 -58 6q0 2 7 49q29 -8 51 -8q32 0 32 19q0 7 -4.5 11.5t-21.5 12.5q-43 20 -43 59q0 72 84 72 q30 0 50 -4zM977 721h28l-7 -52h-29q-2 -17 -6.5 -40.5t-7 -38.5t-2.5 -18q0 -16 19 -16q8 0 16 2l-8 -47q-21 -7 -40 -7q-43 0 -45 47q0 12 8 56q3 20 25 146h55zM1180 648q0 -23 -7 -52h-111q-3 -22 10 -33t38 -11q30 0 58 14l-9 -54q-30 -8 -57 -8q-95 0 -95 95 q0 55 27.5 90.5t69.5 35.5q35 0 55.5 -21t20.5 -56zM1319 722q-13 -23 -22 -62q-22 2 -31 -24t-25 -128h-56l3 14q22 130 29 199h51l-3 -33q14 21 25.5 29.5t28.5 4.5zM1506 763l-9 -57q-28 14 -50 14q-31 0 -51 -27.5t-20 -70.5q0 -30 13.5 -47t38.5 -17q21 0 48 13 l-10 -59q-28 -8 -50 -8q-45 0 -71.5 30.5t-26.5 82.5q0 70 35.5 114.5t91.5 44.5q26 0 61 -13zM1668 663q0 -18 -4 -42q-13 -79 -17 -113h-46l1 22q-20 -26 -59 -26q-23 0 -37 16t-14 42q0 39 25.5 60.5t72.5 21.5q15 0 23 -1q2 7 2 13q0 20 -36 20q-29 0 -59 -10q0 4 8 48 q38 11 67 11q73 0 73 -62zM1809 722q-14 -24 -21 -62q-23 2 -31.5 -23t-25.5 -129h-56l3 14q19 104 29 199h52q0 -11 -4 -33q15 21 26.5 29.5t27.5 4.5zM1950 770h56l-43 -262h-53l3 19q-23 -23 -52 -23q-31 0 -49.5 24t-18.5 64q0 53 27.5 92t64.5 39q31 0 53 -29z M2061 640q0 148 -72.5 273t-198 198t-273.5 73q-181 0 -328 -110q127 -116 171 -284h-50q-44 150 -158 253q-114 -103 -158 -253h-50q44 168 171 284q-147 110 -328 110q-148 0 -273.5 -73t-198 -198t-72.5 -273t72.5 -273t198 -198t273.5 -73q181 0 328 110 q-120 111 -165 264h50q46 -138 152 -233q106 95 152 233h50q-45 -153 -165 -264q147 -110 328 -110q148 0 273.5 73t198 198t72.5 273zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> +<glyph unicode="&#xf1f2;" horiz-adv-x="2304" d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42 q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604 v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569 q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73 t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" /> +<glyph unicode="&#xf1f3;" horiz-adv-x="2304" d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260 l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279 v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040 q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168 q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5 t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21 h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5 t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" /> +<glyph unicode="&#xf1f4;" horiz-adv-x="2304" d="M322 689h-15q-19 0 -19 18q0 28 19 85q5 15 15 19.5t28 4.5q77 0 77 -49q0 -41 -30.5 -59.5t-74.5 -18.5zM664 528q-47 0 -47 29q0 62 123 62l3 -3q-5 -88 -79 -88zM1438 687h-15q-19 0 -19 19q0 28 19 85q5 15 14.5 19t28.5 4q77 0 77 -49q0 -41 -30.5 -59.5 t-74.5 -18.5zM1780 527q-47 0 -47 30q0 62 123 62l3 -3q-5 -89 -79 -89zM373 894h-128q-8 0 -14.5 -4t-8.5 -7.5t-7 -12.5q-3 -7 -45 -190t-42 -192q0 -7 5.5 -12.5t13.5 -5.5h62q25 0 32.5 34.5l15 69t32.5 34.5q47 0 87.5 7.5t80.5 24.5t63.5 52.5t23.5 84.5 q0 36 -14.5 61t-41 36.5t-53.5 15.5t-62 4zM719 798q-38 0 -74 -6q-2 0 -8.5 -1t-9 -1.5l-7.5 -1.5t-7.5 -2t-6.5 -3t-6.5 -4t-5 -5t-4.5 -7t-4 -9q-9 -29 -9 -39t9 -10q5 0 21.5 5t19.5 6q30 8 58 8q74 0 74 -36q0 -11 -10 -14q-8 -2 -18 -3t-21.5 -1.5t-17.5 -1.5 q-38 -4 -64.5 -10t-56.5 -19.5t-45.5 -39t-15.5 -62.5q0 -38 26 -59.5t64 -21.5q24 0 45.5 6.5t33 13t38.5 23.5q-3 -7 -3 -15t5.5 -13.5t12.5 -5.5h56q1 1 7 3.5t7.5 3.5t5 3.5t5 5.5t2.5 8l45 194q4 13 4 30q0 81 -145 81zM1247 793h-74q-22 0 -39 -23q-5 -7 -29.5 -51 t-46.5 -81.5t-26 -38.5l-5 4q0 77 -27 166q-1 5 -3.5 8.5t-6 6.5t-6.5 5t-8.5 3t-8.5 1.5t-9.5 1t-9 0.5h-10h-8.5q-38 0 -38 -21l1 -5q5 -53 25 -151t25 -143q2 -16 2 -24q0 -19 -30.5 -61.5t-30.5 -58.5q0 -13 40 -13q61 0 76 25l245 415q10 20 10 26q0 9 -8 9zM1489 892 h-129q-18 0 -29 -23q-6 -13 -46.5 -191.5t-40.5 -190.5q0 -20 43 -20h7.5h9h9t9.5 1t8.5 2t8.5 3t6.5 4.5t5.5 6t3 8.5l21 91q2 10 10.5 17t19.5 7q47 0 87.5 7t80.5 24.5t63.5 52.5t23.5 84q0 36 -14.5 61t-41 36.5t-53.5 15.5t-62 4zM1835 798q-26 0 -74 -6 q-38 -6 -48 -16q-7 -8 -11 -19q-8 -24 -8 -39q0 -10 8 -10q1 0 41 12q30 8 58 8q74 0 74 -36q0 -12 -10 -14q-4 -1 -57 -7q-38 -4 -64.5 -10t-56.5 -19.5t-45.5 -39t-15.5 -62.5t26 -58.5t64 -21.5q24 0 45 6t34 13t38 24q-3 -15 -3 -16q0 -5 2 -8.5t6.5 -5.5t8 -3.5 t10.5 -2t9.5 -0.5h9.5h8q42 0 48 25l45 194q3 15 3 31q0 81 -145 81zM2157 889h-55q-25 0 -33 -40q-10 -44 -36.5 -167t-42.5 -190v-5q0 -16 16 -18h1h57q10 0 18.5 6.5t10.5 16.5l83 374h-1l1 5q0 7 -5.5 12.5t-13.5 5.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048 q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> +<glyph unicode="&#xf1f5;" horiz-adv-x="2304" d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109 q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118 q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151 q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31 q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" /> +<glyph unicode="&#xf1f6;" horiz-adv-x="2048" d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5 l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5 l418 363q10 8 23.5 7t21.5 -11z" /> +<glyph unicode="&#xf1f7;" horiz-adv-x="2048" d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128 q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161 q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" /> +<glyph unicode="&#xf1f8;" horiz-adv-x="1408" d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704 q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167 q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf1f9;" d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5 t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf1fa;" d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53 q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24 t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61 t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" /> +<glyph unicode="&#xf1fb;" horiz-adv-x="1792" d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10 t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" /> +<glyph unicode="&#xf1fc;" horiz-adv-x="1792" d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5 t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" /> +<glyph unicode="&#xf1fd;" horiz-adv-x="1792" d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11t55.5 -11t52.5 -38q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5t47 37.5 q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-35 0 -55.5 11t-52.5 38q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38t-58 27 t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448h256v448 h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51 t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" /> +<glyph unicode="&#xf1fe;" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" /> +<glyph unicode="&#xf200;" horiz-adv-x="1792" d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" /> +<glyph unicode="&#xf201;" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9 t9 -23z" /> +<glyph unicode="&#xf202;" horiz-adv-x="1792" d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20 q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50 t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1 q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" /> +<glyph unicode="&#xf203;" d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73 q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110 q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" /> +<glyph unicode="&#xf204;" horiz-adv-x="2048" d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5 t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5 t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" /> +<glyph unicode="&#xf205;" horiz-adv-x="2048" d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5 t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" /> +<glyph unicode="&#xf206;" horiz-adv-x="2304" d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94 q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469 q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400 q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" /> +<glyph unicode="&#xf207;" d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5 h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" /> +<glyph unicode="&#xf208;" horiz-adv-x="2048" d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327 q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5 q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" /> +<glyph unicode="&#xf209;" horiz-adv-x="1280" d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q18 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119 t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5 t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14 q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88 q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5 t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" /> +<glyph unicode="&#xf20a;" horiz-adv-x="2048" d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206 q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307 t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14 t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" /> +<glyph unicode="&#xf20b;" d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5 t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" /> +<glyph unicode="&#xf20c;" d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55 q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410 q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" /> +<glyph unicode="&#xf20d;" horiz-adv-x="1792" /> +<glyph unicode="&#xf20e;" horiz-adv-x="1792" /> +<glyph unicode="&#xf500;" horiz-adv-x="1792" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/theme/bootstrap/views/font-awesome/fonts/fontawesome-webfont.ttf b/theme/bootstrap/views/font-awesome/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..96a3639 Binary files /dev/null and b/theme/bootstrap/views/font-awesome/fonts/fontawesome-webfont.ttf differ diff --git a/theme/bootstrap/views/font-awesome/fonts/fontawesome-webfont.woff b/theme/bootstrap/views/font-awesome/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..628b6a5 Binary files /dev/null and b/theme/bootstrap/views/font-awesome/fonts/fontawesome-webfont.woff differ diff --git a/theme/bootstrap/views/font-awesome/less/bordered-pulled.less b/theme/bootstrap/views/font-awesome/less/bordered-pulled.less new file mode 100644 index 0000000..0c90eb5 --- /dev/null +++ b/theme/bootstrap/views/font-awesome/less/bordered-pulled.less @@ -0,0 +1,16 @@ +// Bordered & Pulled +// ------------------------- + +.@{fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em @fa-border-color; + border-radius: .1em; +} + +.pull-right { float: right; } +.pull-left { float: left; } + +.@{fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/theme/bootstrap/views/font-awesome/less/core.less b/theme/bootstrap/views/font-awesome/less/core.less new file mode 100644 index 0000000..01d1910 --- /dev/null +++ b/theme/bootstrap/views/font-awesome/less/core.less @@ -0,0 +1,11 @@ +// Base Class Definition +// ------------------------- + +.@{fa-css-prefix} { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/theme/bootstrap/views/font-awesome/less/fixed-width.less b/theme/bootstrap/views/font-awesome/less/fixed-width.less new file mode 100644 index 0000000..110289f --- /dev/null +++ b/theme/bootstrap/views/font-awesome/less/fixed-width.less @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.@{fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/theme/bootstrap/views/font-awesome/less/font-awesome.less b/theme/bootstrap/views/font-awesome/less/font-awesome.less new file mode 100644 index 0000000..195fd46 --- /dev/null +++ b/theme/bootstrap/views/font-awesome/less/font-awesome.less @@ -0,0 +1,17 @@ +/*! + * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables.less"; +@import "mixins.less"; +@import "path.less"; +@import "core.less"; +@import "larger.less"; +@import "fixed-width.less"; +@import "list.less"; +@import "bordered-pulled.less"; +@import "spinning.less"; +@import "rotated-flipped.less"; +@import "stacked.less"; +@import "icons.less"; diff --git a/theme/bootstrap/views/font-awesome/less/icons.less b/theme/bootstrap/views/font-awesome/less/icons.less new file mode 100644 index 0000000..b5c26c7 --- /dev/null +++ b/theme/bootstrap/views/font-awesome/less/icons.less @@ -0,0 +1,552 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.@{fa-css-prefix}-glass:before { content: @fa-var-glass; } +.@{fa-css-prefix}-music:before { content: @fa-var-music; } +.@{fa-css-prefix}-search:before { content: @fa-var-search; } +.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; } +.@{fa-css-prefix}-heart:before { content: @fa-var-heart; } +.@{fa-css-prefix}-star:before { content: @fa-var-star; } +.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; } +.@{fa-css-prefix}-user:before { content: @fa-var-user; } +.@{fa-css-prefix}-film:before { content: @fa-var-film; } +.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; } +.@{fa-css-prefix}-th:before { content: @fa-var-th; } +.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; } +.@{fa-css-prefix}-check:before { content: @fa-var-check; } +.@{fa-css-prefix}-remove:before, +.@{fa-css-prefix}-close:before, +.@{fa-css-prefix}-times:before { content: @fa-var-times; } +.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; } +.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; } +.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; } +.@{fa-css-prefix}-signal:before { content: @fa-var-signal; } +.@{fa-css-prefix}-gear:before, +.@{fa-css-prefix}-cog:before { content: @fa-var-cog; } +.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; } +.@{fa-css-prefix}-home:before { content: @fa-var-home; } +.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; } +.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; } +.@{fa-css-prefix}-road:before { content: @fa-var-road; } +.@{fa-css-prefix}-download:before { content: @fa-var-download; } +.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; } +.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; } +.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; } +.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; } +.@{fa-css-prefix}-rotate-right:before, +.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; } +.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; } +.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; } +.@{fa-css-prefix}-lock:before { content: @fa-var-lock; } +.@{fa-css-prefix}-flag:before { content: @fa-var-flag; } +.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; } +.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; } +.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; } +.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; } +.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; } +.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; } +.@{fa-css-prefix}-tag:before { content: @fa-var-tag; } +.@{fa-css-prefix}-tags:before { content: @fa-var-tags; } +.@{fa-css-prefix}-book:before { content: @fa-var-book; } +.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; } +.@{fa-css-prefix}-print:before { content: @fa-var-print; } +.@{fa-css-prefix}-camera:before { content: @fa-var-camera; } +.@{fa-css-prefix}-font:before { content: @fa-var-font; } +.@{fa-css-prefix}-bold:before { content: @fa-var-bold; } +.@{fa-css-prefix}-italic:before { content: @fa-var-italic; } +.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; } +.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; } +.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; } +.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; } +.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; } +.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; } +.@{fa-css-prefix}-list:before { content: @fa-var-list; } +.@{fa-css-prefix}-dedent:before, +.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; } +.@{fa-css-prefix}-indent:before { content: @fa-var-indent; } +.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; } +.@{fa-css-prefix}-photo:before, +.@{fa-css-prefix}-image:before, +.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; } +.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; } +.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; } +.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; } +.@{fa-css-prefix}-tint:before { content: @fa-var-tint; } +.@{fa-css-prefix}-edit:before, +.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; } +.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; } +.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; } +.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; } +.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; } +.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; } +.@{fa-css-prefix}-backward:before { content: @fa-var-backward; } +.@{fa-css-prefix}-play:before { content: @fa-var-play; } +.@{fa-css-prefix}-pause:before { content: @fa-var-pause; } +.@{fa-css-prefix}-stop:before { content: @fa-var-stop; } +.@{fa-css-prefix}-forward:before { content: @fa-var-forward; } +.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; } +.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; } +.@{fa-css-prefix}-eject:before { content: @fa-var-eject; } +.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; } +.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; } +.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; } +.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; } +.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; } +.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; } +.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; } +.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; } +.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; } +.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; } +.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; } +.@{fa-css-prefix}-ban:before { content: @fa-var-ban; } +.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; } +.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; } +.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; } +.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; } +.@{fa-css-prefix}-mail-forward:before, +.@{fa-css-prefix}-share:before { content: @fa-var-share; } +.@{fa-css-prefix}-expand:before { content: @fa-var-expand; } +.@{fa-css-prefix}-compress:before { content: @fa-var-compress; } +.@{fa-css-prefix}-plus:before { content: @fa-var-plus; } +.@{fa-css-prefix}-minus:before { content: @fa-var-minus; } +.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; } +.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; } +.@{fa-css-prefix}-gift:before { content: @fa-var-gift; } +.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; } +.@{fa-css-prefix}-fire:before { content: @fa-var-fire; } +.@{fa-css-prefix}-eye:before { content: @fa-var-eye; } +.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; } +.@{fa-css-prefix}-warning:before, +.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; } +.@{fa-css-prefix}-plane:before { content: @fa-var-plane; } +.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; } +.@{fa-css-prefix}-random:before { content: @fa-var-random; } +.@{fa-css-prefix}-comment:before { content: @fa-var-comment; } +.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; } +.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; } +.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; } +.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; } +.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; } +.@{fa-css-prefix}-folder:before { content: @fa-var-folder; } +.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; } +.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; } +.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; } +.@{fa-css-prefix}-bar-chart-o:before, +.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; } +.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; } +.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; } +.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; } +.@{fa-css-prefix}-key:before { content: @fa-var-key; } +.@{fa-css-prefix}-gears:before, +.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; } +.@{fa-css-prefix}-comments:before { content: @fa-var-comments; } +.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; } +.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; } +.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; } +.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; } +.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; } +.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; } +.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; } +.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; } +.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; } +.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; } +.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; } +.@{fa-css-prefix}-upload:before { content: @fa-var-upload; } +.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; } +.@{fa-css-prefix}-phone:before { content: @fa-var-phone; } +.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; } +.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; } +.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; } +.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; } +.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; } +.@{fa-css-prefix}-github:before { content: @fa-var-github; } +.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; } +.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; } +.@{fa-css-prefix}-rss:before { content: @fa-var-rss; } +.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; } +.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; } +.@{fa-css-prefix}-bell:before { content: @fa-var-bell; } +.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; } +.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; } +.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; } +.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; } +.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; } +.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; } +.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; } +.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; } +.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; } +.@{fa-css-prefix}-globe:before { content: @fa-var-globe; } +.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; } +.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; } +.@{fa-css-prefix}-filter:before { content: @fa-var-filter; } +.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; } +.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; } +.@{fa-css-prefix}-group:before, +.@{fa-css-prefix}-users:before { content: @fa-var-users; } +.@{fa-css-prefix}-chain:before, +.@{fa-css-prefix}-link:before { content: @fa-var-link; } +.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; } +.@{fa-css-prefix}-flask:before { content: @fa-var-flask; } +.@{fa-css-prefix}-cut:before, +.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; } +.@{fa-css-prefix}-copy:before, +.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; } +.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; } +.@{fa-css-prefix}-save:before, +.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; } +.@{fa-css-prefix}-square:before { content: @fa-var-square; } +.@{fa-css-prefix}-navicon:before, +.@{fa-css-prefix}-reorder:before, +.@{fa-css-prefix}-bars:before { content: @fa-var-bars; } +.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; } +.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; } +.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; } +.@{fa-css-prefix}-underline:before { content: @fa-var-underline; } +.@{fa-css-prefix}-table:before { content: @fa-var-table; } +.@{fa-css-prefix}-magic:before { content: @fa-var-magic; } +.@{fa-css-prefix}-truck:before { content: @fa-var-truck; } +.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; } +.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; } +.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; } +.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; } +.@{fa-css-prefix}-money:before { content: @fa-var-money; } +.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; } +.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; } +.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; } +.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; } +.@{fa-css-prefix}-columns:before { content: @fa-var-columns; } +.@{fa-css-prefix}-unsorted:before, +.@{fa-css-prefix}-sort:before { content: @fa-var-sort; } +.@{fa-css-prefix}-sort-down:before, +.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; } +.@{fa-css-prefix}-sort-up:before, +.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; } +.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; } +.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; } +.@{fa-css-prefix}-rotate-left:before, +.@{fa-css-prefix}-undo:before { content: @fa-var-undo; } +.@{fa-css-prefix}-legal:before, +.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; } +.@{fa-css-prefix}-dashboard:before, +.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; } +.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; } +.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; } +.@{fa-css-prefix}-flash:before, +.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; } +.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; } +.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; } +.@{fa-css-prefix}-paste:before, +.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; } +.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; } +.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; } +.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; } +.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; } +.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; } +.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; } +.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; } +.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; } +.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; } +.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; } +.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; } +.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; } +.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; } +.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; } +.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; } +.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; } +.@{fa-css-prefix}-beer:before { content: @fa-var-beer; } +.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; } +.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; } +.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; } +.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; } +.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; } +.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; } +.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; } +.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; } +.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; } +.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; } +.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; } +.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; } +.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; } +.@{fa-css-prefix}-mobile-phone:before, +.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; } +.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; } +.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; } +.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; } +.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; } +.@{fa-css-prefix}-circle:before { content: @fa-var-circle; } +.@{fa-css-prefix}-mail-reply:before, +.@{fa-css-prefix}-reply:before { content: @fa-var-reply; } +.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; } +.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; } +.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; } +.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; } +.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; } +.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; } +.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; } +.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; } +.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; } +.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; } +.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; } +.@{fa-css-prefix}-code:before { content: @fa-var-code; } +.@{fa-css-prefix}-mail-reply-all:before, +.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; } +.@{fa-css-prefix}-star-half-empty:before, +.@{fa-css-prefix}-star-half-full:before, +.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; } +.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; } +.@{fa-css-prefix}-crop:before { content: @fa-var-crop; } +.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; } +.@{fa-css-prefix}-unlink:before, +.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; } +.@{fa-css-prefix}-question:before { content: @fa-var-question; } +.@{fa-css-prefix}-info:before { content: @fa-var-info; } +.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; } +.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; } +.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; } +.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; } +.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; } +.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; } +.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; } +.@{fa-css-prefix}-shield:before { content: @fa-var-shield; } +.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; } +.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; } +.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; } +.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; } +.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; } +.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; } +.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; } +.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; } +.@{fa-css-prefix}-html5:before { content: @fa-var-html5; } +.@{fa-css-prefix}-css3:before { content: @fa-var-css3; } +.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; } +.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; } +.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; } +.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; } +.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; } +.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; } +.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; } +.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; } +.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; } +.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; } +.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; } +.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; } +.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; } +.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; } +.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; } +.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; } +.@{fa-css-prefix}-compass:before { content: @fa-var-compass; } +.@{fa-css-prefix}-toggle-down:before, +.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; } +.@{fa-css-prefix}-toggle-up:before, +.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; } +.@{fa-css-prefix}-toggle-right:before, +.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; } +.@{fa-css-prefix}-euro:before, +.@{fa-css-prefix}-eur:before { content: @fa-var-eur; } +.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; } +.@{fa-css-prefix}-dollar:before, +.@{fa-css-prefix}-usd:before { content: @fa-var-usd; } +.@{fa-css-prefix}-rupee:before, +.@{fa-css-prefix}-inr:before { content: @fa-var-inr; } +.@{fa-css-prefix}-cny:before, +.@{fa-css-prefix}-rmb:before, +.@{fa-css-prefix}-yen:before, +.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; } +.@{fa-css-prefix}-ruble:before, +.@{fa-css-prefix}-rouble:before, +.@{fa-css-prefix}-rub:before { content: @fa-var-rub; } +.@{fa-css-prefix}-won:before, +.@{fa-css-prefix}-krw:before { content: @fa-var-krw; } +.@{fa-css-prefix}-bitcoin:before, +.@{fa-css-prefix}-btc:before { content: @fa-var-btc; } +.@{fa-css-prefix}-file:before { content: @fa-var-file; } +.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; } +.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; } +.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; } +.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; } +.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; } +.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; } +.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; } +.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; } +.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; } +.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; } +.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; } +.@{fa-css-prefix}-xing:before { content: @fa-var-xing; } +.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; } +.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; } +.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; } +.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; } +.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; } +.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; } +.@{fa-css-prefix}-adn:before { content: @fa-var-adn; } +.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; } +.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; } +.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; } +.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; } +.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; } +.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; } +.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; } +.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; } +.@{fa-css-prefix}-apple:before { content: @fa-var-apple; } +.@{fa-css-prefix}-windows:before { content: @fa-var-windows; } +.@{fa-css-prefix}-android:before { content: @fa-var-android; } +.@{fa-css-prefix}-linux:before { content: @fa-var-linux; } +.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; } +.@{fa-css-prefix}-skype:before { content: @fa-var-skype; } +.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; } +.@{fa-css-prefix}-trello:before { content: @fa-var-trello; } +.@{fa-css-prefix}-female:before { content: @fa-var-female; } +.@{fa-css-prefix}-male:before { content: @fa-var-male; } +.@{fa-css-prefix}-gittip:before { content: @fa-var-gittip; } +.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; } +.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; } +.@{fa-css-prefix}-archive:before { content: @fa-var-archive; } +.@{fa-css-prefix}-bug:before { content: @fa-var-bug; } +.@{fa-css-prefix}-vk:before { content: @fa-var-vk; } +.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; } +.@{fa-css-prefix}-renren:before { content: @fa-var-renren; } +.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; } +.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; } +.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; } +.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; } +.@{fa-css-prefix}-toggle-left:before, +.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; } +.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; } +.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; } +.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; } +.@{fa-css-prefix}-turkish-lira:before, +.@{fa-css-prefix}-try:before { content: @fa-var-try; } +.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; } +.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; } +.@{fa-css-prefix}-slack:before { content: @fa-var-slack; } +.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; } +.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; } +.@{fa-css-prefix}-openid:before { content: @fa-var-openid; } +.@{fa-css-prefix}-institution:before, +.@{fa-css-prefix}-bank:before, +.@{fa-css-prefix}-university:before { content: @fa-var-university; } +.@{fa-css-prefix}-mortar-board:before, +.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; } +.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; } +.@{fa-css-prefix}-google:before { content: @fa-var-google; } +.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; } +.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; } +.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; } +.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; } +.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; } +.@{fa-css-prefix}-digg:before { content: @fa-var-digg; } +.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; } +.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; } +.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; } +.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; } +.@{fa-css-prefix}-language:before { content: @fa-var-language; } +.@{fa-css-prefix}-fax:before { content: @fa-var-fax; } +.@{fa-css-prefix}-building:before { content: @fa-var-building; } +.@{fa-css-prefix}-child:before { content: @fa-var-child; } +.@{fa-css-prefix}-paw:before { content: @fa-var-paw; } +.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; } +.@{fa-css-prefix}-cube:before { content: @fa-var-cube; } +.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; } +.@{fa-css-prefix}-behance:before { content: @fa-var-behance; } +.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; } +.@{fa-css-prefix}-steam:before { content: @fa-var-steam; } +.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; } +.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; } +.@{fa-css-prefix}-automobile:before, +.@{fa-css-prefix}-car:before { content: @fa-var-car; } +.@{fa-css-prefix}-cab:before, +.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; } +.@{fa-css-prefix}-tree:before { content: @fa-var-tree; } +.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; } +.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; } +.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; } +.@{fa-css-prefix}-database:before { content: @fa-var-database; } +.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; } +.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; } +.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; } +.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; } +.@{fa-css-prefix}-file-photo-o:before, +.@{fa-css-prefix}-file-picture-o:before, +.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; } +.@{fa-css-prefix}-file-zip-o:before, +.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; } +.@{fa-css-prefix}-file-sound-o:before, +.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; } +.@{fa-css-prefix}-file-movie-o:before, +.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; } +.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; } +.@{fa-css-prefix}-vine:before { content: @fa-var-vine; } +.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; } +.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; } +.@{fa-css-prefix}-life-bouy:before, +.@{fa-css-prefix}-life-buoy:before, +.@{fa-css-prefix}-life-saver:before, +.@{fa-css-prefix}-support:before, +.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; } +.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; } +.@{fa-css-prefix}-ra:before, +.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; } +.@{fa-css-prefix}-ge:before, +.@{fa-css-prefix}-empire:before { content: @fa-var-empire; } +.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; } +.@{fa-css-prefix}-git:before { content: @fa-var-git; } +.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; } +.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; } +.@{fa-css-prefix}-qq:before { content: @fa-var-qq; } +.@{fa-css-prefix}-wechat:before, +.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; } +.@{fa-css-prefix}-send:before, +.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; } +.@{fa-css-prefix}-send-o:before, +.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; } +.@{fa-css-prefix}-history:before { content: @fa-var-history; } +.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; } +.@{fa-css-prefix}-header:before { content: @fa-var-header; } +.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; } +.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; } +.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; } +.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; } +.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; } +.@{fa-css-prefix}-soccer-ball-o:before, +.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; } +.@{fa-css-prefix}-tty:before { content: @fa-var-tty; } +.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; } +.@{fa-css-prefix}-plug:before { content: @fa-var-plug; } +.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; } +.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; } +.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; } +.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; } +.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; } +.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; } +.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; } +.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; } +.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; } +.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; } +.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; } +.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; } +.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; } +.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; } +.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; } +.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; } +.@{fa-css-prefix}-trash:before { content: @fa-var-trash; } +.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; } +.@{fa-css-prefix}-at:before { content: @fa-var-at; } +.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; } +.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; } +.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; } +.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; } +.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; } +.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; } +.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; } +.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; } +.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; } +.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; } +.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; } +.@{fa-css-prefix}-bus:before { content: @fa-var-bus; } +.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; } +.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; } +.@{fa-css-prefix}-cc:before { content: @fa-var-cc; } +.@{fa-css-prefix}-shekel:before, +.@{fa-css-prefix}-sheqel:before, +.@{fa-css-prefix}-ils:before { content: @fa-var-ils; } +.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; } diff --git a/theme/bootstrap/views/font-awesome/less/larger.less b/theme/bootstrap/views/font-awesome/less/larger.less new file mode 100644 index 0000000..c9d6467 --- /dev/null +++ b/theme/bootstrap/views/font-awesome/less/larger.less @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.@{fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.@{fa-css-prefix}-2x { font-size: 2em; } +.@{fa-css-prefix}-3x { font-size: 3em; } +.@{fa-css-prefix}-4x { font-size: 4em; } +.@{fa-css-prefix}-5x { font-size: 5em; } diff --git a/theme/bootstrap/views/font-awesome/less/list.less b/theme/bootstrap/views/font-awesome/less/list.less new file mode 100644 index 0000000..0b44038 --- /dev/null +++ b/theme/bootstrap/views/font-awesome/less/list.less @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.@{fa-css-prefix}-ul { + padding-left: 0; + margin-left: @fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.@{fa-css-prefix}-li { + position: absolute; + left: -@fa-li-width; + width: @fa-li-width; + top: (2em / 14); + text-align: center; + &.@{fa-css-prefix}-lg { + left: (-@fa-li-width + (4em / 14)); + } +} diff --git a/theme/bootstrap/views/font-awesome/less/mixins.less b/theme/bootstrap/views/font-awesome/less/mixins.less new file mode 100644 index 0000000..b7bfadc --- /dev/null +++ b/theme/bootstrap/views/font-awesome/less/mixins.less @@ -0,0 +1,25 @@ +// Mixins +// -------------------------- + +.fa-icon() { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.fa-icon-rotate(@degrees, @rotation) { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation); + -webkit-transform: rotate(@degrees); + -ms-transform: rotate(@degrees); + transform: rotate(@degrees); +} + +.fa-icon-flip(@horiz, @vert, @rotation) { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1); + -webkit-transform: scale(@horiz, @vert); + -ms-transform: scale(@horiz, @vert); + transform: scale(@horiz, @vert); +} diff --git a/theme/bootstrap/views/font-awesome/less/path.less b/theme/bootstrap/views/font-awesome/less/path.less new file mode 100644 index 0000000..c5a6912 --- /dev/null +++ b/theme/bootstrap/views/font-awesome/less/path.less @@ -0,0 +1,14 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); + src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), + url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), + url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), + url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); +// src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/theme/bootstrap/views/font-awesome/less/rotated-flipped.less b/theme/bootstrap/views/font-awesome/less/rotated-flipped.less new file mode 100644 index 0000000..f6ba814 --- /dev/null +++ b/theme/bootstrap/views/font-awesome/less/rotated-flipped.less @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } +.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } +.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } + +.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } +.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .@{fa-css-prefix}-rotate-90, +:root .@{fa-css-prefix}-rotate-180, +:root .@{fa-css-prefix}-rotate-270, +:root .@{fa-css-prefix}-flip-horizontal, +:root .@{fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/theme/bootstrap/views/font-awesome/less/spinning.less b/theme/bootstrap/views/font-awesome/less/spinning.less new file mode 100644 index 0000000..6e1564e --- /dev/null +++ b/theme/bootstrap/views/font-awesome/less/spinning.less @@ -0,0 +1,29 @@ +// Spinning Icons +// -------------------------- + +.@{fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} diff --git a/theme/bootstrap/views/font-awesome/less/stacked.less b/theme/bootstrap/views/font-awesome/less/stacked.less new file mode 100644 index 0000000..fc53fb0 --- /dev/null +++ b/theme/bootstrap/views/font-awesome/less/stacked.less @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.@{fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.@{fa-css-prefix}-stack-1x { line-height: inherit; } +.@{fa-css-prefix}-stack-2x { font-size: 2em; } +.@{fa-css-prefix}-inverse { color: @fa-inverse; } diff --git a/theme/bootstrap/views/font-awesome/less/variables.less b/theme/bootstrap/views/font-awesome/less/variables.less new file mode 100644 index 0000000..ccf939d --- /dev/null +++ b/theme/bootstrap/views/font-awesome/less/variables.less @@ -0,0 +1,561 @@ +// Variables +// -------------------------- + +@fa-font-path: "../fonts"; +//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts"; // for referencing Bootstrap CDN font files directly +@fa-css-prefix: fa; +@fa-version: "4.2.0"; +@fa-border-color: #eee; +@fa-inverse: #fff; +@fa-li-width: (30em / 14); + +@fa-var-adjust: "\f042"; +@fa-var-adn: "\f170"; +@fa-var-align-center: "\f037"; +@fa-var-align-justify: "\f039"; +@fa-var-align-left: "\f036"; +@fa-var-align-right: "\f038"; +@fa-var-ambulance: "\f0f9"; +@fa-var-anchor: "\f13d"; +@fa-var-android: "\f17b"; +@fa-var-angellist: "\f209"; +@fa-var-angle-double-down: "\f103"; +@fa-var-angle-double-left: "\f100"; +@fa-var-angle-double-right: "\f101"; +@fa-var-angle-double-up: "\f102"; +@fa-var-angle-down: "\f107"; +@fa-var-angle-left: "\f104"; +@fa-var-angle-right: "\f105"; +@fa-var-angle-up: "\f106"; +@fa-var-apple: "\f179"; +@fa-var-archive: "\f187"; +@fa-var-area-chart: "\f1fe"; +@fa-var-arrow-circle-down: "\f0ab"; +@fa-var-arrow-circle-left: "\f0a8"; +@fa-var-arrow-circle-o-down: "\f01a"; +@fa-var-arrow-circle-o-left: "\f190"; +@fa-var-arrow-circle-o-right: "\f18e"; +@fa-var-arrow-circle-o-up: "\f01b"; +@fa-var-arrow-circle-right: "\f0a9"; +@fa-var-arrow-circle-up: "\f0aa"; +@fa-var-arrow-down: "\f063"; +@fa-var-arrow-left: "\f060"; +@fa-var-arrow-right: "\f061"; +@fa-var-arrow-up: "\f062"; +@fa-var-arrows: "\f047"; +@fa-var-arrows-alt: "\f0b2"; +@fa-var-arrows-h: "\f07e"; +@fa-var-arrows-v: "\f07d"; +@fa-var-asterisk: "\f069"; +@fa-var-at: "\f1fa"; +@fa-var-automobile: "\f1b9"; +@fa-var-backward: "\f04a"; +@fa-var-ban: "\f05e"; +@fa-var-bank: "\f19c"; +@fa-var-bar-chart: "\f080"; +@fa-var-bar-chart-o: "\f080"; +@fa-var-barcode: "\f02a"; +@fa-var-bars: "\f0c9"; +@fa-var-beer: "\f0fc"; +@fa-var-behance: "\f1b4"; +@fa-var-behance-square: "\f1b5"; +@fa-var-bell: "\f0f3"; +@fa-var-bell-o: "\f0a2"; +@fa-var-bell-slash: "\f1f6"; +@fa-var-bell-slash-o: "\f1f7"; +@fa-var-bicycle: "\f206"; +@fa-var-binoculars: "\f1e5"; +@fa-var-birthday-cake: "\f1fd"; +@fa-var-bitbucket: "\f171"; +@fa-var-bitbucket-square: "\f172"; +@fa-var-bitcoin: "\f15a"; +@fa-var-bold: "\f032"; +@fa-var-bolt: "\f0e7"; +@fa-var-bomb: "\f1e2"; +@fa-var-book: "\f02d"; +@fa-var-bookmark: "\f02e"; +@fa-var-bookmark-o: "\f097"; +@fa-var-briefcase: "\f0b1"; +@fa-var-btc: "\f15a"; +@fa-var-bug: "\f188"; +@fa-var-building: "\f1ad"; +@fa-var-building-o: "\f0f7"; +@fa-var-bullhorn: "\f0a1"; +@fa-var-bullseye: "\f140"; +@fa-var-bus: "\f207"; +@fa-var-cab: "\f1ba"; +@fa-var-calculator: "\f1ec"; +@fa-var-calendar: "\f073"; +@fa-var-calendar-o: "\f133"; +@fa-var-camera: "\f030"; +@fa-var-camera-retro: "\f083"; +@fa-var-car: "\f1b9"; +@fa-var-caret-down: "\f0d7"; +@fa-var-caret-left: "\f0d9"; +@fa-var-caret-right: "\f0da"; +@fa-var-caret-square-o-down: "\f150"; +@fa-var-caret-square-o-left: "\f191"; +@fa-var-caret-square-o-right: "\f152"; +@fa-var-caret-square-o-up: "\f151"; +@fa-var-caret-up: "\f0d8"; +@fa-var-cc: "\f20a"; +@fa-var-cc-amex: "\f1f3"; +@fa-var-cc-discover: "\f1f2"; +@fa-var-cc-mastercard: "\f1f1"; +@fa-var-cc-paypal: "\f1f4"; +@fa-var-cc-stripe: "\f1f5"; +@fa-var-cc-visa: "\f1f0"; +@fa-var-certificate: "\f0a3"; +@fa-var-chain: "\f0c1"; +@fa-var-chain-broken: "\f127"; +@fa-var-check: "\f00c"; +@fa-var-check-circle: "\f058"; +@fa-var-check-circle-o: "\f05d"; +@fa-var-check-square: "\f14a"; +@fa-var-check-square-o: "\f046"; +@fa-var-chevron-circle-down: "\f13a"; +@fa-var-chevron-circle-left: "\f137"; +@fa-var-chevron-circle-right: "\f138"; +@fa-var-chevron-circle-up: "\f139"; +@fa-var-chevron-down: "\f078"; +@fa-var-chevron-left: "\f053"; +@fa-var-chevron-right: "\f054"; +@fa-var-chevron-up: "\f077"; +@fa-var-child: "\f1ae"; +@fa-var-circle: "\f111"; +@fa-var-circle-o: "\f10c"; +@fa-var-circle-o-notch: "\f1ce"; +@fa-var-circle-thin: "\f1db"; +@fa-var-clipboard: "\f0ea"; +@fa-var-clock-o: "\f017"; +@fa-var-close: "\f00d"; +@fa-var-cloud: "\f0c2"; +@fa-var-cloud-download: "\f0ed"; +@fa-var-cloud-upload: "\f0ee"; +@fa-var-cny: "\f157"; +@fa-var-code: "\f121"; +@fa-var-code-fork: "\f126"; +@fa-var-codepen: "\f1cb"; +@fa-var-coffee: "\f0f4"; +@fa-var-cog: "\f013"; +@fa-var-cogs: "\f085"; +@fa-var-columns: "\f0db"; +@fa-var-comment: "\f075"; +@fa-var-comment-o: "\f0e5"; +@fa-var-comments: "\f086"; +@fa-var-comments-o: "\f0e6"; +@fa-var-compass: "\f14e"; +@fa-var-compress: "\f066"; +@fa-var-copy: "\f0c5"; +@fa-var-copyright: "\f1f9"; +@fa-var-credit-card: "\f09d"; +@fa-var-crop: "\f125"; +@fa-var-crosshairs: "\f05b"; +@fa-var-css3: "\f13c"; +@fa-var-cube: "\f1b2"; +@fa-var-cubes: "\f1b3"; +@fa-var-cut: "\f0c4"; +@fa-var-cutlery: "\f0f5"; +@fa-var-dashboard: "\f0e4"; +@fa-var-database: "\f1c0"; +@fa-var-dedent: "\f03b"; +@fa-var-delicious: "\f1a5"; +@fa-var-desktop: "\f108"; +@fa-var-deviantart: "\f1bd"; +@fa-var-digg: "\f1a6"; +@fa-var-dollar: "\f155"; +@fa-var-dot-circle-o: "\f192"; +@fa-var-download: "\f019"; +@fa-var-dribbble: "\f17d"; +@fa-var-dropbox: "\f16b"; +@fa-var-drupal: "\f1a9"; +@fa-var-edit: "\f044"; +@fa-var-eject: "\f052"; +@fa-var-ellipsis-h: "\f141"; +@fa-var-ellipsis-v: "\f142"; +@fa-var-empire: "\f1d1"; +@fa-var-envelope: "\f0e0"; +@fa-var-envelope-o: "\f003"; +@fa-var-envelope-square: "\f199"; +@fa-var-eraser: "\f12d"; +@fa-var-eur: "\f153"; +@fa-var-euro: "\f153"; +@fa-var-exchange: "\f0ec"; +@fa-var-exclamation: "\f12a"; +@fa-var-exclamation-circle: "\f06a"; +@fa-var-exclamation-triangle: "\f071"; +@fa-var-expand: "\f065"; +@fa-var-external-link: "\f08e"; +@fa-var-external-link-square: "\f14c"; +@fa-var-eye: "\f06e"; +@fa-var-eye-slash: "\f070"; +@fa-var-eyedropper: "\f1fb"; +@fa-var-facebook: "\f09a"; +@fa-var-facebook-square: "\f082"; +@fa-var-fast-backward: "\f049"; +@fa-var-fast-forward: "\f050"; +@fa-var-fax: "\f1ac"; +@fa-var-female: "\f182"; +@fa-var-fighter-jet: "\f0fb"; +@fa-var-file: "\f15b"; +@fa-var-file-archive-o: "\f1c6"; +@fa-var-file-audio-o: "\f1c7"; +@fa-var-file-code-o: "\f1c9"; +@fa-var-file-excel-o: "\f1c3"; +@fa-var-file-image-o: "\f1c5"; +@fa-var-file-movie-o: "\f1c8"; +@fa-var-file-o: "\f016"; +@fa-var-file-pdf-o: "\f1c1"; +@fa-var-file-photo-o: "\f1c5"; +@fa-var-file-picture-o: "\f1c5"; +@fa-var-file-powerpoint-o: "\f1c4"; +@fa-var-file-sound-o: "\f1c7"; +@fa-var-file-text: "\f15c"; +@fa-var-file-text-o: "\f0f6"; +@fa-var-file-video-o: "\f1c8"; +@fa-var-file-word-o: "\f1c2"; +@fa-var-file-zip-o: "\f1c6"; +@fa-var-files-o: "\f0c5"; +@fa-var-film: "\f008"; +@fa-var-filter: "\f0b0"; +@fa-var-fire: "\f06d"; +@fa-var-fire-extinguisher: "\f134"; +@fa-var-flag: "\f024"; +@fa-var-flag-checkered: "\f11e"; +@fa-var-flag-o: "\f11d"; +@fa-var-flash: "\f0e7"; +@fa-var-flask: "\f0c3"; +@fa-var-flickr: "\f16e"; +@fa-var-floppy-o: "\f0c7"; +@fa-var-folder: "\f07b"; +@fa-var-folder-o: "\f114"; +@fa-var-folder-open: "\f07c"; +@fa-var-folder-open-o: "\f115"; +@fa-var-font: "\f031"; +@fa-var-forward: "\f04e"; +@fa-var-foursquare: "\f180"; +@fa-var-frown-o: "\f119"; +@fa-var-futbol-o: "\f1e3"; +@fa-var-gamepad: "\f11b"; +@fa-var-gavel: "\f0e3"; +@fa-var-gbp: "\f154"; +@fa-var-ge: "\f1d1"; +@fa-var-gear: "\f013"; +@fa-var-gears: "\f085"; +@fa-var-gift: "\f06b"; +@fa-var-git: "\f1d3"; +@fa-var-git-square: "\f1d2"; +@fa-var-github: "\f09b"; +@fa-var-github-alt: "\f113"; +@fa-var-github-square: "\f092"; +@fa-var-gittip: "\f184"; +@fa-var-glass: "\f000"; +@fa-var-globe: "\f0ac"; +@fa-var-google: "\f1a0"; +@fa-var-google-plus: "\f0d5"; +@fa-var-google-plus-square: "\f0d4"; +@fa-var-google-wallet: "\f1ee"; +@fa-var-graduation-cap: "\f19d"; +@fa-var-group: "\f0c0"; +@fa-var-h-square: "\f0fd"; +@fa-var-hacker-news: "\f1d4"; +@fa-var-hand-o-down: "\f0a7"; +@fa-var-hand-o-left: "\f0a5"; +@fa-var-hand-o-right: "\f0a4"; +@fa-var-hand-o-up: "\f0a6"; +@fa-var-hdd-o: "\f0a0"; +@fa-var-header: "\f1dc"; +@fa-var-headphones: "\f025"; +@fa-var-heart: "\f004"; +@fa-var-heart-o: "\f08a"; +@fa-var-history: "\f1da"; +@fa-var-home: "\f015"; +@fa-var-hospital-o: "\f0f8"; +@fa-var-html5: "\f13b"; +@fa-var-ils: "\f20b"; +@fa-var-image: "\f03e"; +@fa-var-inbox: "\f01c"; +@fa-var-indent: "\f03c"; +@fa-var-info: "\f129"; +@fa-var-info-circle: "\f05a"; +@fa-var-inr: "\f156"; +@fa-var-instagram: "\f16d"; +@fa-var-institution: "\f19c"; +@fa-var-ioxhost: "\f208"; +@fa-var-italic: "\f033"; +@fa-var-joomla: "\f1aa"; +@fa-var-jpy: "\f157"; +@fa-var-jsfiddle: "\f1cc"; +@fa-var-key: "\f084"; +@fa-var-keyboard-o: "\f11c"; +@fa-var-krw: "\f159"; +@fa-var-language: "\f1ab"; +@fa-var-laptop: "\f109"; +@fa-var-lastfm: "\f202"; +@fa-var-lastfm-square: "\f203"; +@fa-var-leaf: "\f06c"; +@fa-var-legal: "\f0e3"; +@fa-var-lemon-o: "\f094"; +@fa-var-level-down: "\f149"; +@fa-var-level-up: "\f148"; +@fa-var-life-bouy: "\f1cd"; +@fa-var-life-buoy: "\f1cd"; +@fa-var-life-ring: "\f1cd"; +@fa-var-life-saver: "\f1cd"; +@fa-var-lightbulb-o: "\f0eb"; +@fa-var-line-chart: "\f201"; +@fa-var-link: "\f0c1"; +@fa-var-linkedin: "\f0e1"; +@fa-var-linkedin-square: "\f08c"; +@fa-var-linux: "\f17c"; +@fa-var-list: "\f03a"; +@fa-var-list-alt: "\f022"; +@fa-var-list-ol: "\f0cb"; +@fa-var-list-ul: "\f0ca"; +@fa-var-location-arrow: "\f124"; +@fa-var-lock: "\f023"; +@fa-var-long-arrow-down: "\f175"; +@fa-var-long-arrow-left: "\f177"; +@fa-var-long-arrow-right: "\f178"; +@fa-var-long-arrow-up: "\f176"; +@fa-var-magic: "\f0d0"; +@fa-var-magnet: "\f076"; +@fa-var-mail-forward: "\f064"; +@fa-var-mail-reply: "\f112"; +@fa-var-mail-reply-all: "\f122"; +@fa-var-male: "\f183"; +@fa-var-map-marker: "\f041"; +@fa-var-maxcdn: "\f136"; +@fa-var-meanpath: "\f20c"; +@fa-var-medkit: "\f0fa"; +@fa-var-meh-o: "\f11a"; +@fa-var-microphone: "\f130"; +@fa-var-microphone-slash: "\f131"; +@fa-var-minus: "\f068"; +@fa-var-minus-circle: "\f056"; +@fa-var-minus-square: "\f146"; +@fa-var-minus-square-o: "\f147"; +@fa-var-mobile: "\f10b"; +@fa-var-mobile-phone: "\f10b"; +@fa-var-money: "\f0d6"; +@fa-var-moon-o: "\f186"; +@fa-var-mortar-board: "\f19d"; +@fa-var-music: "\f001"; +@fa-var-navicon: "\f0c9"; +@fa-var-newspaper-o: "\f1ea"; +@fa-var-openid: "\f19b"; +@fa-var-outdent: "\f03b"; +@fa-var-pagelines: "\f18c"; +@fa-var-paint-brush: "\f1fc"; +@fa-var-paper-plane: "\f1d8"; +@fa-var-paper-plane-o: "\f1d9"; +@fa-var-paperclip: "\f0c6"; +@fa-var-paragraph: "\f1dd"; +@fa-var-paste: "\f0ea"; +@fa-var-pause: "\f04c"; +@fa-var-paw: "\f1b0"; +@fa-var-paypal: "\f1ed"; +@fa-var-pencil: "\f040"; +@fa-var-pencil-square: "\f14b"; +@fa-var-pencil-square-o: "\f044"; +@fa-var-phone: "\f095"; +@fa-var-phone-square: "\f098"; +@fa-var-photo: "\f03e"; +@fa-var-picture-o: "\f03e"; +@fa-var-pie-chart: "\f200"; +@fa-var-pied-piper: "\f1a7"; +@fa-var-pied-piper-alt: "\f1a8"; +@fa-var-pinterest: "\f0d2"; +@fa-var-pinterest-square: "\f0d3"; +@fa-var-plane: "\f072"; +@fa-var-play: "\f04b"; +@fa-var-play-circle: "\f144"; +@fa-var-play-circle-o: "\f01d"; +@fa-var-plug: "\f1e6"; +@fa-var-plus: "\f067"; +@fa-var-plus-circle: "\f055"; +@fa-var-plus-square: "\f0fe"; +@fa-var-plus-square-o: "\f196"; +@fa-var-power-off: "\f011"; +@fa-var-print: "\f02f"; +@fa-var-puzzle-piece: "\f12e"; +@fa-var-qq: "\f1d6"; +@fa-var-qrcode: "\f029"; +@fa-var-question: "\f128"; +@fa-var-question-circle: "\f059"; +@fa-var-quote-left: "\f10d"; +@fa-var-quote-right: "\f10e"; +@fa-var-ra: "\f1d0"; +@fa-var-random: "\f074"; +@fa-var-rebel: "\f1d0"; +@fa-var-recycle: "\f1b8"; +@fa-var-reddit: "\f1a1"; +@fa-var-reddit-square: "\f1a2"; +@fa-var-refresh: "\f021"; +@fa-var-remove: "\f00d"; +@fa-var-renren: "\f18b"; +@fa-var-reorder: "\f0c9"; +@fa-var-repeat: "\f01e"; +@fa-var-reply: "\f112"; +@fa-var-reply-all: "\f122"; +@fa-var-retweet: "\f079"; +@fa-var-rmb: "\f157"; +@fa-var-road: "\f018"; +@fa-var-rocket: "\f135"; +@fa-var-rotate-left: "\f0e2"; +@fa-var-rotate-right: "\f01e"; +@fa-var-rouble: "\f158"; +@fa-var-rss: "\f09e"; +@fa-var-rss-square: "\f143"; +@fa-var-rub: "\f158"; +@fa-var-ruble: "\f158"; +@fa-var-rupee: "\f156"; +@fa-var-save: "\f0c7"; +@fa-var-scissors: "\f0c4"; +@fa-var-search: "\f002"; +@fa-var-search-minus: "\f010"; +@fa-var-search-plus: "\f00e"; +@fa-var-send: "\f1d8"; +@fa-var-send-o: "\f1d9"; +@fa-var-share: "\f064"; +@fa-var-share-alt: "\f1e0"; +@fa-var-share-alt-square: "\f1e1"; +@fa-var-share-square: "\f14d"; +@fa-var-share-square-o: "\f045"; +@fa-var-shekel: "\f20b"; +@fa-var-sheqel: "\f20b"; +@fa-var-shield: "\f132"; +@fa-var-shopping-cart: "\f07a"; +@fa-var-sign-in: "\f090"; +@fa-var-sign-out: "\f08b"; +@fa-var-signal: "\f012"; +@fa-var-sitemap: "\f0e8"; +@fa-var-skype: "\f17e"; +@fa-var-slack: "\f198"; +@fa-var-sliders: "\f1de"; +@fa-var-slideshare: "\f1e7"; +@fa-var-smile-o: "\f118"; +@fa-var-soccer-ball-o: "\f1e3"; +@fa-var-sort: "\f0dc"; +@fa-var-sort-alpha-asc: "\f15d"; +@fa-var-sort-alpha-desc: "\f15e"; +@fa-var-sort-amount-asc: "\f160"; +@fa-var-sort-amount-desc: "\f161"; +@fa-var-sort-asc: "\f0de"; +@fa-var-sort-desc: "\f0dd"; +@fa-var-sort-down: "\f0dd"; +@fa-var-sort-numeric-asc: "\f162"; +@fa-var-sort-numeric-desc: "\f163"; +@fa-var-sort-up: "\f0de"; +@fa-var-soundcloud: "\f1be"; +@fa-var-space-shuttle: "\f197"; +@fa-var-spinner: "\f110"; +@fa-var-spoon: "\f1b1"; +@fa-var-spotify: "\f1bc"; +@fa-var-square: "\f0c8"; +@fa-var-square-o: "\f096"; +@fa-var-stack-exchange: "\f18d"; +@fa-var-stack-overflow: "\f16c"; +@fa-var-star: "\f005"; +@fa-var-star-half: "\f089"; +@fa-var-star-half-empty: "\f123"; +@fa-var-star-half-full: "\f123"; +@fa-var-star-half-o: "\f123"; +@fa-var-star-o: "\f006"; +@fa-var-steam: "\f1b6"; +@fa-var-steam-square: "\f1b7"; +@fa-var-step-backward: "\f048"; +@fa-var-step-forward: "\f051"; +@fa-var-stethoscope: "\f0f1"; +@fa-var-stop: "\f04d"; +@fa-var-strikethrough: "\f0cc"; +@fa-var-stumbleupon: "\f1a4"; +@fa-var-stumbleupon-circle: "\f1a3"; +@fa-var-subscript: "\f12c"; +@fa-var-suitcase: "\f0f2"; +@fa-var-sun-o: "\f185"; +@fa-var-superscript: "\f12b"; +@fa-var-support: "\f1cd"; +@fa-var-table: "\f0ce"; +@fa-var-tablet: "\f10a"; +@fa-var-tachometer: "\f0e4"; +@fa-var-tag: "\f02b"; +@fa-var-tags: "\f02c"; +@fa-var-tasks: "\f0ae"; +@fa-var-taxi: "\f1ba"; +@fa-var-tencent-weibo: "\f1d5"; +@fa-var-terminal: "\f120"; +@fa-var-text-height: "\f034"; +@fa-var-text-width: "\f035"; +@fa-var-th: "\f00a"; +@fa-var-th-large: "\f009"; +@fa-var-th-list: "\f00b"; +@fa-var-thumb-tack: "\f08d"; +@fa-var-thumbs-down: "\f165"; +@fa-var-thumbs-o-down: "\f088"; +@fa-var-thumbs-o-up: "\f087"; +@fa-var-thumbs-up: "\f164"; +@fa-var-ticket: "\f145"; +@fa-var-times: "\f00d"; +@fa-var-times-circle: "\f057"; +@fa-var-times-circle-o: "\f05c"; +@fa-var-tint: "\f043"; +@fa-var-toggle-down: "\f150"; +@fa-var-toggle-left: "\f191"; +@fa-var-toggle-off: "\f204"; +@fa-var-toggle-on: "\f205"; +@fa-var-toggle-right: "\f152"; +@fa-var-toggle-up: "\f151"; +@fa-var-trash: "\f1f8"; +@fa-var-trash-o: "\f014"; +@fa-var-tree: "\f1bb"; +@fa-var-trello: "\f181"; +@fa-var-trophy: "\f091"; +@fa-var-truck: "\f0d1"; +@fa-var-try: "\f195"; +@fa-var-tty: "\f1e4"; +@fa-var-tumblr: "\f173"; +@fa-var-tumblr-square: "\f174"; +@fa-var-turkish-lira: "\f195"; +@fa-var-twitch: "\f1e8"; +@fa-var-twitter: "\f099"; +@fa-var-twitter-square: "\f081"; +@fa-var-umbrella: "\f0e9"; +@fa-var-underline: "\f0cd"; +@fa-var-undo: "\f0e2"; +@fa-var-university: "\f19c"; +@fa-var-unlink: "\f127"; +@fa-var-unlock: "\f09c"; +@fa-var-unlock-alt: "\f13e"; +@fa-var-unsorted: "\f0dc"; +@fa-var-upload: "\f093"; +@fa-var-usd: "\f155"; +@fa-var-user: "\f007"; +@fa-var-user-md: "\f0f0"; +@fa-var-users: "\f0c0"; +@fa-var-video-camera: "\f03d"; +@fa-var-vimeo-square: "\f194"; +@fa-var-vine: "\f1ca"; +@fa-var-vk: "\f189"; +@fa-var-volume-down: "\f027"; +@fa-var-volume-off: "\f026"; +@fa-var-volume-up: "\f028"; +@fa-var-warning: "\f071"; +@fa-var-wechat: "\f1d7"; +@fa-var-weibo: "\f18a"; +@fa-var-weixin: "\f1d7"; +@fa-var-wheelchair: "\f193"; +@fa-var-wifi: "\f1eb"; +@fa-var-windows: "\f17a"; +@fa-var-won: "\f159"; +@fa-var-wordpress: "\f19a"; +@fa-var-wrench: "\f0ad"; +@fa-var-xing: "\f168"; +@fa-var-xing-square: "\f169"; +@fa-var-yahoo: "\f19e"; +@fa-var-yelp: "\f1e9"; +@fa-var-yen: "\f157"; +@fa-var-youtube: "\f167"; +@fa-var-youtube-play: "\f16a"; +@fa-var-youtube-square: "\f166"; + diff --git a/theme/bootstrap/views/font-awesome/scss/_bordered-pulled.scss b/theme/bootstrap/views/font-awesome/scss/_bordered-pulled.scss new file mode 100644 index 0000000..9d3fdf3 --- /dev/null +++ b/theme/bootstrap/views/font-awesome/scss/_bordered-pulled.scss @@ -0,0 +1,16 @@ +// Bordered & Pulled +// ------------------------- + +.#{$fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em $fa-border-color; + border-radius: .1em; +} + +.pull-right { float: right; } +.pull-left { float: left; } + +.#{$fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/theme/bootstrap/views/font-awesome/scss/_core.scss b/theme/bootstrap/views/font-awesome/scss/_core.scss new file mode 100644 index 0000000..ca46d37 --- /dev/null +++ b/theme/bootstrap/views/font-awesome/scss/_core.scss @@ -0,0 +1,11 @@ +// Base Class Definition +// ------------------------- + +.#{$fa-css-prefix} { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/theme/bootstrap/views/font-awesome/scss/_fixed-width.scss b/theme/bootstrap/views/font-awesome/scss/_fixed-width.scss new file mode 100644 index 0000000..b221c98 --- /dev/null +++ b/theme/bootstrap/views/font-awesome/scss/_fixed-width.scss @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.#{$fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/theme/bootstrap/views/font-awesome/scss/_icons.scss b/theme/bootstrap/views/font-awesome/scss/_icons.scss new file mode 100644 index 0000000..8dc2939 --- /dev/null +++ b/theme/bootstrap/views/font-awesome/scss/_icons.scss @@ -0,0 +1,552 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } +.#{$fa-css-prefix}-music:before { content: $fa-var-music; } +.#{$fa-css-prefix}-search:before { content: $fa-var-search; } +.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } +.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } +.#{$fa-css-prefix}-star:before { content: $fa-var-star; } +.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } +.#{$fa-css-prefix}-user:before { content: $fa-var-user; } +.#{$fa-css-prefix}-film:before { content: $fa-var-film; } +.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } +.#{$fa-css-prefix}-th:before { content: $fa-var-th; } +.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } +.#{$fa-css-prefix}-check:before { content: $fa-var-check; } +.#{$fa-css-prefix}-remove:before, +.#{$fa-css-prefix}-close:before, +.#{$fa-css-prefix}-times:before { content: $fa-var-times; } +.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } +.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } +.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } +.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } +.#{$fa-css-prefix}-gear:before, +.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } +.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } +.#{$fa-css-prefix}-home:before { content: $fa-var-home; } +.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } +.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } +.#{$fa-css-prefix}-road:before { content: $fa-var-road; } +.#{$fa-css-prefix}-download:before { content: $fa-var-download; } +.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } +.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } +.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } +.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } +.#{$fa-css-prefix}-rotate-right:before, +.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } +.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } +.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } +.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } +.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } +.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } +.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } +.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } +.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } +.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } +.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } +.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } +.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } +.#{$fa-css-prefix}-book:before { content: $fa-var-book; } +.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } +.#{$fa-css-prefix}-print:before { content: $fa-var-print; } +.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } +.#{$fa-css-prefix}-font:before { content: $fa-var-font; } +.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } +.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } +.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } +.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } +.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } +.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } +.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } +.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } +.#{$fa-css-prefix}-list:before { content: $fa-var-list; } +.#{$fa-css-prefix}-dedent:before, +.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } +.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } +.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } +.#{$fa-css-prefix}-photo:before, +.#{$fa-css-prefix}-image:before, +.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } +.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } +.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } +.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } +.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } +.#{$fa-css-prefix}-edit:before, +.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } +.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } +.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } +.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } +.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } +.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } +.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } +.#{$fa-css-prefix}-play:before { content: $fa-var-play; } +.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } +.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } +.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } +.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } +.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } +.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } +.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } +.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } +.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } +.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } +.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } +.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } +.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } +.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } +.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } +.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } +.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } +.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } +.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } +.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } +.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } +.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } +.#{$fa-css-prefix}-mail-forward:before, +.#{$fa-css-prefix}-share:before { content: $fa-var-share; } +.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } +.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } +.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } +.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } +.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } +.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } +.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } +.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } +.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } +.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } +.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } +.#{$fa-css-prefix}-warning:before, +.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } +.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } +.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } +.#{$fa-css-prefix}-random:before { content: $fa-var-random; } +.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } +.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } +.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } +.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } +.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } +.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } +.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } +.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } +.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } +.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } +.#{$fa-css-prefix}-bar-chart-o:before, +.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } +.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } +.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } +.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } +.#{$fa-css-prefix}-key:before { content: $fa-var-key; } +.#{$fa-css-prefix}-gears:before, +.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } +.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } +.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } +.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } +.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } +.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } +.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } +.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } +.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } +.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } +.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } +.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } +.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } +.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } +.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } +.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } +.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } +.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } +.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } +.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } +.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } +.#{$fa-css-prefix}-github:before { content: $fa-var-github; } +.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } +.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } +.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } +.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } +.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } +.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } +.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } +.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } +.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } +.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } +.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } +.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } +.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } +.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } +.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } +.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } +.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } +.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } +.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } +.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } +.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } +.#{$fa-css-prefix}-group:before, +.#{$fa-css-prefix}-users:before { content: $fa-var-users; } +.#{$fa-css-prefix}-chain:before, +.#{$fa-css-prefix}-link:before { content: $fa-var-link; } +.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } +.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } +.#{$fa-css-prefix}-cut:before, +.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } +.#{$fa-css-prefix}-copy:before, +.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } +.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } +.#{$fa-css-prefix}-save:before, +.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } +.#{$fa-css-prefix}-square:before { content: $fa-var-square; } +.#{$fa-css-prefix}-navicon:before, +.#{$fa-css-prefix}-reorder:before, +.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } +.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } +.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } +.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } +.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } +.#{$fa-css-prefix}-table:before { content: $fa-var-table; } +.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } +.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } +.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } +.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } +.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } +.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } +.#{$fa-css-prefix}-money:before { content: $fa-var-money; } +.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } +.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } +.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } +.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } +.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } +.#{$fa-css-prefix}-unsorted:before, +.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } +.#{$fa-css-prefix}-sort-down:before, +.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } +.#{$fa-css-prefix}-sort-up:before, +.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } +.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } +.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } +.#{$fa-css-prefix}-rotate-left:before, +.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } +.#{$fa-css-prefix}-legal:before, +.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } +.#{$fa-css-prefix}-dashboard:before, +.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } +.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } +.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } +.#{$fa-css-prefix}-flash:before, +.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } +.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } +.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } +.#{$fa-css-prefix}-paste:before, +.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } +.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } +.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } +.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } +.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } +.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } +.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } +.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } +.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } +.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } +.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } +.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } +.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } +.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } +.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } +.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } +.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } +.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } +.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } +.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } +.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } +.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } +.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } +.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } +.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } +.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } +.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } +.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } +.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } +.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } +.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } +.#{$fa-css-prefix}-mobile-phone:before, +.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } +.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } +.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } +.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } +.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } +.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } +.#{$fa-css-prefix}-mail-reply:before, +.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } +.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } +.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } +.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } +.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } +.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } +.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } +.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } +.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } +.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } +.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } +.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } +.#{$fa-css-prefix}-code:before { content: $fa-var-code; } +.#{$fa-css-prefix}-mail-reply-all:before, +.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } +.#{$fa-css-prefix}-star-half-empty:before, +.#{$fa-css-prefix}-star-half-full:before, +.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } +.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } +.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } +.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } +.#{$fa-css-prefix}-unlink:before, +.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } +.#{$fa-css-prefix}-question:before { content: $fa-var-question; } +.#{$fa-css-prefix}-info:before { content: $fa-var-info; } +.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } +.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } +.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } +.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } +.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } +.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } +.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } +.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } +.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } +.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } +.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } +.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } +.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } +.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } +.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } +.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } +.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } +.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } +.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } +.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } +.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } +.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } +.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } +.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } +.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } +.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } +.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } +.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } +.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } +.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } +.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } +.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } +.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } +.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } +.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } +.#{$fa-css-prefix}-toggle-down:before, +.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } +.#{$fa-css-prefix}-toggle-up:before, +.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } +.#{$fa-css-prefix}-toggle-right:before, +.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } +.#{$fa-css-prefix}-euro:before, +.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } +.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } +.#{$fa-css-prefix}-dollar:before, +.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } +.#{$fa-css-prefix}-rupee:before, +.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } +.#{$fa-css-prefix}-cny:before, +.#{$fa-css-prefix}-rmb:before, +.#{$fa-css-prefix}-yen:before, +.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } +.#{$fa-css-prefix}-ruble:before, +.#{$fa-css-prefix}-rouble:before, +.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } +.#{$fa-css-prefix}-won:before, +.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } +.#{$fa-css-prefix}-bitcoin:before, +.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } +.#{$fa-css-prefix}-file:before { content: $fa-var-file; } +.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } +.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } +.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } +.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } +.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } +.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } +.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } +.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } +.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } +.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } +.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } +.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } +.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } +.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } +.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } +.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } +.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } +.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } +.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } +.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } +.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } +.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } +.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } +.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } +.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } +.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } +.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } +.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } +.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } +.#{$fa-css-prefix}-android:before { content: $fa-var-android; } +.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } +.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } +.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } +.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } +.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } +.#{$fa-css-prefix}-female:before { content: $fa-var-female; } +.#{$fa-css-prefix}-male:before { content: $fa-var-male; } +.#{$fa-css-prefix}-gittip:before { content: $fa-var-gittip; } +.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } +.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } +.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } +.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } +.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } +.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } +.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } +.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } +.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } +.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } +.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } +.#{$fa-css-prefix}-toggle-left:before, +.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } +.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } +.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } +.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } +.#{$fa-css-prefix}-turkish-lira:before, +.#{$fa-css-prefix}-try:before { content: $fa-var-try; } +.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } +.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } +.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } +.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } +.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } +.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } +.#{$fa-css-prefix}-institution:before, +.#{$fa-css-prefix}-bank:before, +.#{$fa-css-prefix}-university:before { content: $fa-var-university; } +.#{$fa-css-prefix}-mortar-board:before, +.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } +.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } +.#{$fa-css-prefix}-google:before { content: $fa-var-google; } +.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } +.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } +.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } +.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } +.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } +.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } +.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } +.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } +.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } +.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } +.#{$fa-css-prefix}-language:before { content: $fa-var-language; } +.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } +.#{$fa-css-prefix}-building:before { content: $fa-var-building; } +.#{$fa-css-prefix}-child:before { content: $fa-var-child; } +.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } +.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } +.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } +.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } +.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } +.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } +.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } +.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } +.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } +.#{$fa-css-prefix}-automobile:before, +.#{$fa-css-prefix}-car:before { content: $fa-var-car; } +.#{$fa-css-prefix}-cab:before, +.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } +.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } +.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } +.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } +.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } +.#{$fa-css-prefix}-database:before { content: $fa-var-database; } +.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } +.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } +.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } +.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } +.#{$fa-css-prefix}-file-photo-o:before, +.#{$fa-css-prefix}-file-picture-o:before, +.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } +.#{$fa-css-prefix}-file-zip-o:before, +.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } +.#{$fa-css-prefix}-file-sound-o:before, +.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } +.#{$fa-css-prefix}-file-movie-o:before, +.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } +.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } +.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } +.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } +.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } +.#{$fa-css-prefix}-life-bouy:before, +.#{$fa-css-prefix}-life-buoy:before, +.#{$fa-css-prefix}-life-saver:before, +.#{$fa-css-prefix}-support:before, +.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } +.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } +.#{$fa-css-prefix}-ra:before, +.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } +.#{$fa-css-prefix}-ge:before, +.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } +.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } +.#{$fa-css-prefix}-git:before { content: $fa-var-git; } +.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } +.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } +.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } +.#{$fa-css-prefix}-wechat:before, +.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } +.#{$fa-css-prefix}-send:before, +.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } +.#{$fa-css-prefix}-send-o:before, +.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } +.#{$fa-css-prefix}-history:before { content: $fa-var-history; } +.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } +.#{$fa-css-prefix}-header:before { content: $fa-var-header; } +.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } +.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } +.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } +.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } +.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } +.#{$fa-css-prefix}-soccer-ball-o:before, +.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } +.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } +.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } +.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } +.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } +.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } +.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } +.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } +.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } +.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } +.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } +.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } +.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } +.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } +.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } +.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } +.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } +.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } +.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } +.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } +.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } +.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } +.#{$fa-css-prefix}-at:before { content: $fa-var-at; } +.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } +.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } +.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } +.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } +.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } +.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } +.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } +.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } +.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } +.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } +.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } +.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } +.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } +.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } +.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } +.#{$fa-css-prefix}-shekel:before, +.#{$fa-css-prefix}-sheqel:before, +.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } +.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } diff --git a/theme/bootstrap/views/font-awesome/scss/_larger.scss b/theme/bootstrap/views/font-awesome/scss/_larger.scss new file mode 100644 index 0000000..41e9a81 --- /dev/null +++ b/theme/bootstrap/views/font-awesome/scss/_larger.scss @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.#{$fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.#{$fa-css-prefix}-2x { font-size: 2em; } +.#{$fa-css-prefix}-3x { font-size: 3em; } +.#{$fa-css-prefix}-4x { font-size: 4em; } +.#{$fa-css-prefix}-5x { font-size: 5em; } diff --git a/theme/bootstrap/views/font-awesome/scss/_list.scss b/theme/bootstrap/views/font-awesome/scss/_list.scss new file mode 100644 index 0000000..7d1e4d5 --- /dev/null +++ b/theme/bootstrap/views/font-awesome/scss/_list.scss @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.#{$fa-css-prefix}-ul { + padding-left: 0; + margin-left: $fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.#{$fa-css-prefix}-li { + position: absolute; + left: -$fa-li-width; + width: $fa-li-width; + top: (2em / 14); + text-align: center; + &.#{$fa-css-prefix}-lg { + left: -$fa-li-width + (4em / 14); + } +} diff --git a/theme/bootstrap/views/font-awesome/scss/_mixins.scss b/theme/bootstrap/views/font-awesome/scss/_mixins.scss new file mode 100644 index 0000000..a139dfb --- /dev/null +++ b/theme/bootstrap/views/font-awesome/scss/_mixins.scss @@ -0,0 +1,25 @@ +// Mixins +// -------------------------- + +@mixin fa-icon() { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +@mixin fa-icon-rotate($degrees, $rotation) { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); + -webkit-transform: rotate($degrees); + -ms-transform: rotate($degrees); + transform: rotate($degrees); +} + +@mixin fa-icon-flip($horiz, $vert, $rotation) { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); + -webkit-transform: scale($horiz, $vert); + -ms-transform: scale($horiz, $vert); + transform: scale($horiz, $vert); +} diff --git a/theme/bootstrap/views/font-awesome/scss/_path.scss b/theme/bootstrap/views/font-awesome/scss/_path.scss new file mode 100644 index 0000000..fd21c35 --- /dev/null +++ b/theme/bootstrap/views/font-awesome/scss/_path.scss @@ -0,0 +1,14 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); + src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), + url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), + url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), + url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); + //src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/theme/bootstrap/views/font-awesome/scss/_rotated-flipped.scss b/theme/bootstrap/views/font-awesome/scss/_rotated-flipped.scss new file mode 100644 index 0000000..a3558fd --- /dev/null +++ b/theme/bootstrap/views/font-awesome/scss/_rotated-flipped.scss @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } +.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } +.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } + +.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } +.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .#{$fa-css-prefix}-rotate-90, +:root .#{$fa-css-prefix}-rotate-180, +:root .#{$fa-css-prefix}-rotate-270, +:root .#{$fa-css-prefix}-flip-horizontal, +:root .#{$fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/theme/bootstrap/views/font-awesome/scss/_spinning.scss b/theme/bootstrap/views/font-awesome/scss/_spinning.scss new file mode 100644 index 0000000..002c5d5 --- /dev/null +++ b/theme/bootstrap/views/font-awesome/scss/_spinning.scss @@ -0,0 +1,29 @@ +// Spinning Icons +// -------------------------- + +.#{$fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} diff --git a/theme/bootstrap/views/font-awesome/scss/_stacked.scss b/theme/bootstrap/views/font-awesome/scss/_stacked.scss new file mode 100644 index 0000000..aef7403 --- /dev/null +++ b/theme/bootstrap/views/font-awesome/scss/_stacked.scss @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.#{$fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.#{$fa-css-prefix}-stack-1x { line-height: inherit; } +.#{$fa-css-prefix}-stack-2x { font-size: 2em; } +.#{$fa-css-prefix}-inverse { color: $fa-inverse; } diff --git a/theme/bootstrap/views/font-awesome/scss/_variables.scss b/theme/bootstrap/views/font-awesome/scss/_variables.scss new file mode 100644 index 0000000..669c307 --- /dev/null +++ b/theme/bootstrap/views/font-awesome/scss/_variables.scss @@ -0,0 +1,561 @@ +// Variables +// -------------------------- + +$fa-font-path: "../fonts" !default; +//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts" !default; // for referencing Bootstrap CDN font files directly +$fa-css-prefix: fa !default; +$fa-version: "4.2.0" !default; +$fa-border-color: #eee !default; +$fa-inverse: #fff !default; +$fa-li-width: (30em / 14) !default; + +$fa-var-adjust: "\f042"; +$fa-var-adn: "\f170"; +$fa-var-align-center: "\f037"; +$fa-var-align-justify: "\f039"; +$fa-var-align-left: "\f036"; +$fa-var-align-right: "\f038"; +$fa-var-ambulance: "\f0f9"; +$fa-var-anchor: "\f13d"; +$fa-var-android: "\f17b"; +$fa-var-angellist: "\f209"; +$fa-var-angle-double-down: "\f103"; +$fa-var-angle-double-left: "\f100"; +$fa-var-angle-double-right: "\f101"; +$fa-var-angle-double-up: "\f102"; +$fa-var-angle-down: "\f107"; +$fa-var-angle-left: "\f104"; +$fa-var-angle-right: "\f105"; +$fa-var-angle-up: "\f106"; +$fa-var-apple: "\f179"; +$fa-var-archive: "\f187"; +$fa-var-area-chart: "\f1fe"; +$fa-var-arrow-circle-down: "\f0ab"; +$fa-var-arrow-circle-left: "\f0a8"; +$fa-var-arrow-circle-o-down: "\f01a"; +$fa-var-arrow-circle-o-left: "\f190"; +$fa-var-arrow-circle-o-right: "\f18e"; +$fa-var-arrow-circle-o-up: "\f01b"; +$fa-var-arrow-circle-right: "\f0a9"; +$fa-var-arrow-circle-up: "\f0aa"; +$fa-var-arrow-down: "\f063"; +$fa-var-arrow-left: "\f060"; +$fa-var-arrow-right: "\f061"; +$fa-var-arrow-up: "\f062"; +$fa-var-arrows: "\f047"; +$fa-var-arrows-alt: "\f0b2"; +$fa-var-arrows-h: "\f07e"; +$fa-var-arrows-v: "\f07d"; +$fa-var-asterisk: "\f069"; +$fa-var-at: "\f1fa"; +$fa-var-automobile: "\f1b9"; +$fa-var-backward: "\f04a"; +$fa-var-ban: "\f05e"; +$fa-var-bank: "\f19c"; +$fa-var-bar-chart: "\f080"; +$fa-var-bar-chart-o: "\f080"; +$fa-var-barcode: "\f02a"; +$fa-var-bars: "\f0c9"; +$fa-var-beer: "\f0fc"; +$fa-var-behance: "\f1b4"; +$fa-var-behance-square: "\f1b5"; +$fa-var-bell: "\f0f3"; +$fa-var-bell-o: "\f0a2"; +$fa-var-bell-slash: "\f1f6"; +$fa-var-bell-slash-o: "\f1f7"; +$fa-var-bicycle: "\f206"; +$fa-var-binoculars: "\f1e5"; +$fa-var-birthday-cake: "\f1fd"; +$fa-var-bitbucket: "\f171"; +$fa-var-bitbucket-square: "\f172"; +$fa-var-bitcoin: "\f15a"; +$fa-var-bold: "\f032"; +$fa-var-bolt: "\f0e7"; +$fa-var-bomb: "\f1e2"; +$fa-var-book: "\f02d"; +$fa-var-bookmark: "\f02e"; +$fa-var-bookmark-o: "\f097"; +$fa-var-briefcase: "\f0b1"; +$fa-var-btc: "\f15a"; +$fa-var-bug: "\f188"; +$fa-var-building: "\f1ad"; +$fa-var-building-o: "\f0f7"; +$fa-var-bullhorn: "\f0a1"; +$fa-var-bullseye: "\f140"; +$fa-var-bus: "\f207"; +$fa-var-cab: "\f1ba"; +$fa-var-calculator: "\f1ec"; +$fa-var-calendar: "\f073"; +$fa-var-calendar-o: "\f133"; +$fa-var-camera: "\f030"; +$fa-var-camera-retro: "\f083"; +$fa-var-car: "\f1b9"; +$fa-var-caret-down: "\f0d7"; +$fa-var-caret-left: "\f0d9"; +$fa-var-caret-right: "\f0da"; +$fa-var-caret-square-o-down: "\f150"; +$fa-var-caret-square-o-left: "\f191"; +$fa-var-caret-square-o-right: "\f152"; +$fa-var-caret-square-o-up: "\f151"; +$fa-var-caret-up: "\f0d8"; +$fa-var-cc: "\f20a"; +$fa-var-cc-amex: "\f1f3"; +$fa-var-cc-discover: "\f1f2"; +$fa-var-cc-mastercard: "\f1f1"; +$fa-var-cc-paypal: "\f1f4"; +$fa-var-cc-stripe: "\f1f5"; +$fa-var-cc-visa: "\f1f0"; +$fa-var-certificate: "\f0a3"; +$fa-var-chain: "\f0c1"; +$fa-var-chain-broken: "\f127"; +$fa-var-check: "\f00c"; +$fa-var-check-circle: "\f058"; +$fa-var-check-circle-o: "\f05d"; +$fa-var-check-square: "\f14a"; +$fa-var-check-square-o: "\f046"; +$fa-var-chevron-circle-down: "\f13a"; +$fa-var-chevron-circle-left: "\f137"; +$fa-var-chevron-circle-right: "\f138"; +$fa-var-chevron-circle-up: "\f139"; +$fa-var-chevron-down: "\f078"; +$fa-var-chevron-left: "\f053"; +$fa-var-chevron-right: "\f054"; +$fa-var-chevron-up: "\f077"; +$fa-var-child: "\f1ae"; +$fa-var-circle: "\f111"; +$fa-var-circle-o: "\f10c"; +$fa-var-circle-o-notch: "\f1ce"; +$fa-var-circle-thin: "\f1db"; +$fa-var-clipboard: "\f0ea"; +$fa-var-clock-o: "\f017"; +$fa-var-close: "\f00d"; +$fa-var-cloud: "\f0c2"; +$fa-var-cloud-download: "\f0ed"; +$fa-var-cloud-upload: "\f0ee"; +$fa-var-cny: "\f157"; +$fa-var-code: "\f121"; +$fa-var-code-fork: "\f126"; +$fa-var-codepen: "\f1cb"; +$fa-var-coffee: "\f0f4"; +$fa-var-cog: "\f013"; +$fa-var-cogs: "\f085"; +$fa-var-columns: "\f0db"; +$fa-var-comment: "\f075"; +$fa-var-comment-o: "\f0e5"; +$fa-var-comments: "\f086"; +$fa-var-comments-o: "\f0e6"; +$fa-var-compass: "\f14e"; +$fa-var-compress: "\f066"; +$fa-var-copy: "\f0c5"; +$fa-var-copyright: "\f1f9"; +$fa-var-credit-card: "\f09d"; +$fa-var-crop: "\f125"; +$fa-var-crosshairs: "\f05b"; +$fa-var-css3: "\f13c"; +$fa-var-cube: "\f1b2"; +$fa-var-cubes: "\f1b3"; +$fa-var-cut: "\f0c4"; +$fa-var-cutlery: "\f0f5"; +$fa-var-dashboard: "\f0e4"; +$fa-var-database: "\f1c0"; +$fa-var-dedent: "\f03b"; +$fa-var-delicious: "\f1a5"; +$fa-var-desktop: "\f108"; +$fa-var-deviantart: "\f1bd"; +$fa-var-digg: "\f1a6"; +$fa-var-dollar: "\f155"; +$fa-var-dot-circle-o: "\f192"; +$fa-var-download: "\f019"; +$fa-var-dribbble: "\f17d"; +$fa-var-dropbox: "\f16b"; +$fa-var-drupal: "\f1a9"; +$fa-var-edit: "\f044"; +$fa-var-eject: "\f052"; +$fa-var-ellipsis-h: "\f141"; +$fa-var-ellipsis-v: "\f142"; +$fa-var-empire: "\f1d1"; +$fa-var-envelope: "\f0e0"; +$fa-var-envelope-o: "\f003"; +$fa-var-envelope-square: "\f199"; +$fa-var-eraser: "\f12d"; +$fa-var-eur: "\f153"; +$fa-var-euro: "\f153"; +$fa-var-exchange: "\f0ec"; +$fa-var-exclamation: "\f12a"; +$fa-var-exclamation-circle: "\f06a"; +$fa-var-exclamation-triangle: "\f071"; +$fa-var-expand: "\f065"; +$fa-var-external-link: "\f08e"; +$fa-var-external-link-square: "\f14c"; +$fa-var-eye: "\f06e"; +$fa-var-eye-slash: "\f070"; +$fa-var-eyedropper: "\f1fb"; +$fa-var-facebook: "\f09a"; +$fa-var-facebook-square: "\f082"; +$fa-var-fast-backward: "\f049"; +$fa-var-fast-forward: "\f050"; +$fa-var-fax: "\f1ac"; +$fa-var-female: "\f182"; +$fa-var-fighter-jet: "\f0fb"; +$fa-var-file: "\f15b"; +$fa-var-file-archive-o: "\f1c6"; +$fa-var-file-audio-o: "\f1c7"; +$fa-var-file-code-o: "\f1c9"; +$fa-var-file-excel-o: "\f1c3"; +$fa-var-file-image-o: "\f1c5"; +$fa-var-file-movie-o: "\f1c8"; +$fa-var-file-o: "\f016"; +$fa-var-file-pdf-o: "\f1c1"; +$fa-var-file-photo-o: "\f1c5"; +$fa-var-file-picture-o: "\f1c5"; +$fa-var-file-powerpoint-o: "\f1c4"; +$fa-var-file-sound-o: "\f1c7"; +$fa-var-file-text: "\f15c"; +$fa-var-file-text-o: "\f0f6"; +$fa-var-file-video-o: "\f1c8"; +$fa-var-file-word-o: "\f1c2"; +$fa-var-file-zip-o: "\f1c6"; +$fa-var-files-o: "\f0c5"; +$fa-var-film: "\f008"; +$fa-var-filter: "\f0b0"; +$fa-var-fire: "\f06d"; +$fa-var-fire-extinguisher: "\f134"; +$fa-var-flag: "\f024"; +$fa-var-flag-checkered: "\f11e"; +$fa-var-flag-o: "\f11d"; +$fa-var-flash: "\f0e7"; +$fa-var-flask: "\f0c3"; +$fa-var-flickr: "\f16e"; +$fa-var-floppy-o: "\f0c7"; +$fa-var-folder: "\f07b"; +$fa-var-folder-o: "\f114"; +$fa-var-folder-open: "\f07c"; +$fa-var-folder-open-o: "\f115"; +$fa-var-font: "\f031"; +$fa-var-forward: "\f04e"; +$fa-var-foursquare: "\f180"; +$fa-var-frown-o: "\f119"; +$fa-var-futbol-o: "\f1e3"; +$fa-var-gamepad: "\f11b"; +$fa-var-gavel: "\f0e3"; +$fa-var-gbp: "\f154"; +$fa-var-ge: "\f1d1"; +$fa-var-gear: "\f013"; +$fa-var-gears: "\f085"; +$fa-var-gift: "\f06b"; +$fa-var-git: "\f1d3"; +$fa-var-git-square: "\f1d2"; +$fa-var-github: "\f09b"; +$fa-var-github-alt: "\f113"; +$fa-var-github-square: "\f092"; +$fa-var-gittip: "\f184"; +$fa-var-glass: "\f000"; +$fa-var-globe: "\f0ac"; +$fa-var-google: "\f1a0"; +$fa-var-google-plus: "\f0d5"; +$fa-var-google-plus-square: "\f0d4"; +$fa-var-google-wallet: "\f1ee"; +$fa-var-graduation-cap: "\f19d"; +$fa-var-group: "\f0c0"; +$fa-var-h-square: "\f0fd"; +$fa-var-hacker-news: "\f1d4"; +$fa-var-hand-o-down: "\f0a7"; +$fa-var-hand-o-left: "\f0a5"; +$fa-var-hand-o-right: "\f0a4"; +$fa-var-hand-o-up: "\f0a6"; +$fa-var-hdd-o: "\f0a0"; +$fa-var-header: "\f1dc"; +$fa-var-headphones: "\f025"; +$fa-var-heart: "\f004"; +$fa-var-heart-o: "\f08a"; +$fa-var-history: "\f1da"; +$fa-var-home: "\f015"; +$fa-var-hospital-o: "\f0f8"; +$fa-var-html5: "\f13b"; +$fa-var-ils: "\f20b"; +$fa-var-image: "\f03e"; +$fa-var-inbox: "\f01c"; +$fa-var-indent: "\f03c"; +$fa-var-info: "\f129"; +$fa-var-info-circle: "\f05a"; +$fa-var-inr: "\f156"; +$fa-var-instagram: "\f16d"; +$fa-var-institution: "\f19c"; +$fa-var-ioxhost: "\f208"; +$fa-var-italic: "\f033"; +$fa-var-joomla: "\f1aa"; +$fa-var-jpy: "\f157"; +$fa-var-jsfiddle: "\f1cc"; +$fa-var-key: "\f084"; +$fa-var-keyboard-o: "\f11c"; +$fa-var-krw: "\f159"; +$fa-var-language: "\f1ab"; +$fa-var-laptop: "\f109"; +$fa-var-lastfm: "\f202"; +$fa-var-lastfm-square: "\f203"; +$fa-var-leaf: "\f06c"; +$fa-var-legal: "\f0e3"; +$fa-var-lemon-o: "\f094"; +$fa-var-level-down: "\f149"; +$fa-var-level-up: "\f148"; +$fa-var-life-bouy: "\f1cd"; +$fa-var-life-buoy: "\f1cd"; +$fa-var-life-ring: "\f1cd"; +$fa-var-life-saver: "\f1cd"; +$fa-var-lightbulb-o: "\f0eb"; +$fa-var-line-chart: "\f201"; +$fa-var-link: "\f0c1"; +$fa-var-linkedin: "\f0e1"; +$fa-var-linkedin-square: "\f08c"; +$fa-var-linux: "\f17c"; +$fa-var-list: "\f03a"; +$fa-var-list-alt: "\f022"; +$fa-var-list-ol: "\f0cb"; +$fa-var-list-ul: "\f0ca"; +$fa-var-location-arrow: "\f124"; +$fa-var-lock: "\f023"; +$fa-var-long-arrow-down: "\f175"; +$fa-var-long-arrow-left: "\f177"; +$fa-var-long-arrow-right: "\f178"; +$fa-var-long-arrow-up: "\f176"; +$fa-var-magic: "\f0d0"; +$fa-var-magnet: "\f076"; +$fa-var-mail-forward: "\f064"; +$fa-var-mail-reply: "\f112"; +$fa-var-mail-reply-all: "\f122"; +$fa-var-male: "\f183"; +$fa-var-map-marker: "\f041"; +$fa-var-maxcdn: "\f136"; +$fa-var-meanpath: "\f20c"; +$fa-var-medkit: "\f0fa"; +$fa-var-meh-o: "\f11a"; +$fa-var-microphone: "\f130"; +$fa-var-microphone-slash: "\f131"; +$fa-var-minus: "\f068"; +$fa-var-minus-circle: "\f056"; +$fa-var-minus-square: "\f146"; +$fa-var-minus-square-o: "\f147"; +$fa-var-mobile: "\f10b"; +$fa-var-mobile-phone: "\f10b"; +$fa-var-money: "\f0d6"; +$fa-var-moon-o: "\f186"; +$fa-var-mortar-board: "\f19d"; +$fa-var-music: "\f001"; +$fa-var-navicon: "\f0c9"; +$fa-var-newspaper-o: "\f1ea"; +$fa-var-openid: "\f19b"; +$fa-var-outdent: "\f03b"; +$fa-var-pagelines: "\f18c"; +$fa-var-paint-brush: "\f1fc"; +$fa-var-paper-plane: "\f1d8"; +$fa-var-paper-plane-o: "\f1d9"; +$fa-var-paperclip: "\f0c6"; +$fa-var-paragraph: "\f1dd"; +$fa-var-paste: "\f0ea"; +$fa-var-pause: "\f04c"; +$fa-var-paw: "\f1b0"; +$fa-var-paypal: "\f1ed"; +$fa-var-pencil: "\f040"; +$fa-var-pencil-square: "\f14b"; +$fa-var-pencil-square-o: "\f044"; +$fa-var-phone: "\f095"; +$fa-var-phone-square: "\f098"; +$fa-var-photo: "\f03e"; +$fa-var-picture-o: "\f03e"; +$fa-var-pie-chart: "\f200"; +$fa-var-pied-piper: "\f1a7"; +$fa-var-pied-piper-alt: "\f1a8"; +$fa-var-pinterest: "\f0d2"; +$fa-var-pinterest-square: "\f0d3"; +$fa-var-plane: "\f072"; +$fa-var-play: "\f04b"; +$fa-var-play-circle: "\f144"; +$fa-var-play-circle-o: "\f01d"; +$fa-var-plug: "\f1e6"; +$fa-var-plus: "\f067"; +$fa-var-plus-circle: "\f055"; +$fa-var-plus-square: "\f0fe"; +$fa-var-plus-square-o: "\f196"; +$fa-var-power-off: "\f011"; +$fa-var-print: "\f02f"; +$fa-var-puzzle-piece: "\f12e"; +$fa-var-qq: "\f1d6"; +$fa-var-qrcode: "\f029"; +$fa-var-question: "\f128"; +$fa-var-question-circle: "\f059"; +$fa-var-quote-left: "\f10d"; +$fa-var-quote-right: "\f10e"; +$fa-var-ra: "\f1d0"; +$fa-var-random: "\f074"; +$fa-var-rebel: "\f1d0"; +$fa-var-recycle: "\f1b8"; +$fa-var-reddit: "\f1a1"; +$fa-var-reddit-square: "\f1a2"; +$fa-var-refresh: "\f021"; +$fa-var-remove: "\f00d"; +$fa-var-renren: "\f18b"; +$fa-var-reorder: "\f0c9"; +$fa-var-repeat: "\f01e"; +$fa-var-reply: "\f112"; +$fa-var-reply-all: "\f122"; +$fa-var-retweet: "\f079"; +$fa-var-rmb: "\f157"; +$fa-var-road: "\f018"; +$fa-var-rocket: "\f135"; +$fa-var-rotate-left: "\f0e2"; +$fa-var-rotate-right: "\f01e"; +$fa-var-rouble: "\f158"; +$fa-var-rss: "\f09e"; +$fa-var-rss-square: "\f143"; +$fa-var-rub: "\f158"; +$fa-var-ruble: "\f158"; +$fa-var-rupee: "\f156"; +$fa-var-save: "\f0c7"; +$fa-var-scissors: "\f0c4"; +$fa-var-search: "\f002"; +$fa-var-search-minus: "\f010"; +$fa-var-search-plus: "\f00e"; +$fa-var-send: "\f1d8"; +$fa-var-send-o: "\f1d9"; +$fa-var-share: "\f064"; +$fa-var-share-alt: "\f1e0"; +$fa-var-share-alt-square: "\f1e1"; +$fa-var-share-square: "\f14d"; +$fa-var-share-square-o: "\f045"; +$fa-var-shekel: "\f20b"; +$fa-var-sheqel: "\f20b"; +$fa-var-shield: "\f132"; +$fa-var-shopping-cart: "\f07a"; +$fa-var-sign-in: "\f090"; +$fa-var-sign-out: "\f08b"; +$fa-var-signal: "\f012"; +$fa-var-sitemap: "\f0e8"; +$fa-var-skype: "\f17e"; +$fa-var-slack: "\f198"; +$fa-var-sliders: "\f1de"; +$fa-var-slideshare: "\f1e7"; +$fa-var-smile-o: "\f118"; +$fa-var-soccer-ball-o: "\f1e3"; +$fa-var-sort: "\f0dc"; +$fa-var-sort-alpha-asc: "\f15d"; +$fa-var-sort-alpha-desc: "\f15e"; +$fa-var-sort-amount-asc: "\f160"; +$fa-var-sort-amount-desc: "\f161"; +$fa-var-sort-asc: "\f0de"; +$fa-var-sort-desc: "\f0dd"; +$fa-var-sort-down: "\f0dd"; +$fa-var-sort-numeric-asc: "\f162"; +$fa-var-sort-numeric-desc: "\f163"; +$fa-var-sort-up: "\f0de"; +$fa-var-soundcloud: "\f1be"; +$fa-var-space-shuttle: "\f197"; +$fa-var-spinner: "\f110"; +$fa-var-spoon: "\f1b1"; +$fa-var-spotify: "\f1bc"; +$fa-var-square: "\f0c8"; +$fa-var-square-o: "\f096"; +$fa-var-stack-exchange: "\f18d"; +$fa-var-stack-overflow: "\f16c"; +$fa-var-star: "\f005"; +$fa-var-star-half: "\f089"; +$fa-var-star-half-empty: "\f123"; +$fa-var-star-half-full: "\f123"; +$fa-var-star-half-o: "\f123"; +$fa-var-star-o: "\f006"; +$fa-var-steam: "\f1b6"; +$fa-var-steam-square: "\f1b7"; +$fa-var-step-backward: "\f048"; +$fa-var-step-forward: "\f051"; +$fa-var-stethoscope: "\f0f1"; +$fa-var-stop: "\f04d"; +$fa-var-strikethrough: "\f0cc"; +$fa-var-stumbleupon: "\f1a4"; +$fa-var-stumbleupon-circle: "\f1a3"; +$fa-var-subscript: "\f12c"; +$fa-var-suitcase: "\f0f2"; +$fa-var-sun-o: "\f185"; +$fa-var-superscript: "\f12b"; +$fa-var-support: "\f1cd"; +$fa-var-table: "\f0ce"; +$fa-var-tablet: "\f10a"; +$fa-var-tachometer: "\f0e4"; +$fa-var-tag: "\f02b"; +$fa-var-tags: "\f02c"; +$fa-var-tasks: "\f0ae"; +$fa-var-taxi: "\f1ba"; +$fa-var-tencent-weibo: "\f1d5"; +$fa-var-terminal: "\f120"; +$fa-var-text-height: "\f034"; +$fa-var-text-width: "\f035"; +$fa-var-th: "\f00a"; +$fa-var-th-large: "\f009"; +$fa-var-th-list: "\f00b"; +$fa-var-thumb-tack: "\f08d"; +$fa-var-thumbs-down: "\f165"; +$fa-var-thumbs-o-down: "\f088"; +$fa-var-thumbs-o-up: "\f087"; +$fa-var-thumbs-up: "\f164"; +$fa-var-ticket: "\f145"; +$fa-var-times: "\f00d"; +$fa-var-times-circle: "\f057"; +$fa-var-times-circle-o: "\f05c"; +$fa-var-tint: "\f043"; +$fa-var-toggle-down: "\f150"; +$fa-var-toggle-left: "\f191"; +$fa-var-toggle-off: "\f204"; +$fa-var-toggle-on: "\f205"; +$fa-var-toggle-right: "\f152"; +$fa-var-toggle-up: "\f151"; +$fa-var-trash: "\f1f8"; +$fa-var-trash-o: "\f014"; +$fa-var-tree: "\f1bb"; +$fa-var-trello: "\f181"; +$fa-var-trophy: "\f091"; +$fa-var-truck: "\f0d1"; +$fa-var-try: "\f195"; +$fa-var-tty: "\f1e4"; +$fa-var-tumblr: "\f173"; +$fa-var-tumblr-square: "\f174"; +$fa-var-turkish-lira: "\f195"; +$fa-var-twitch: "\f1e8"; +$fa-var-twitter: "\f099"; +$fa-var-twitter-square: "\f081"; +$fa-var-umbrella: "\f0e9"; +$fa-var-underline: "\f0cd"; +$fa-var-undo: "\f0e2"; +$fa-var-university: "\f19c"; +$fa-var-unlink: "\f127"; +$fa-var-unlock: "\f09c"; +$fa-var-unlock-alt: "\f13e"; +$fa-var-unsorted: "\f0dc"; +$fa-var-upload: "\f093"; +$fa-var-usd: "\f155"; +$fa-var-user: "\f007"; +$fa-var-user-md: "\f0f0"; +$fa-var-users: "\f0c0"; +$fa-var-video-camera: "\f03d"; +$fa-var-vimeo-square: "\f194"; +$fa-var-vine: "\f1ca"; +$fa-var-vk: "\f189"; +$fa-var-volume-down: "\f027"; +$fa-var-volume-off: "\f026"; +$fa-var-volume-up: "\f028"; +$fa-var-warning: "\f071"; +$fa-var-wechat: "\f1d7"; +$fa-var-weibo: "\f18a"; +$fa-var-weixin: "\f1d7"; +$fa-var-wheelchair: "\f193"; +$fa-var-wifi: "\f1eb"; +$fa-var-windows: "\f17a"; +$fa-var-won: "\f159"; +$fa-var-wordpress: "\f19a"; +$fa-var-wrench: "\f0ad"; +$fa-var-xing: "\f168"; +$fa-var-xing-square: "\f169"; +$fa-var-yahoo: "\f19e"; +$fa-var-yelp: "\f1e9"; +$fa-var-yen: "\f157"; +$fa-var-youtube: "\f167"; +$fa-var-youtube-play: "\f16a"; +$fa-var-youtube-square: "\f166"; + diff --git a/theme/bootstrap/views/font-awesome/scss/font-awesome.scss b/theme/bootstrap/views/font-awesome/scss/font-awesome.scss new file mode 100644 index 0000000..f300c09 --- /dev/null +++ b/theme/bootstrap/views/font-awesome/scss/font-awesome.scss @@ -0,0 +1,17 @@ +/*! + * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables"; +@import "mixins"; +@import "path"; +@import "core"; +@import "larger"; +@import "fixed-width"; +@import "list"; +@import "bordered-pulled"; +@import "spinning"; +@import "rotated-flipped"; +@import "stacked"; +@import "icons"; diff --git a/theme/bootstrap/views/fonts/glyphicons-halflings-regular.eot b/theme/bootstrap/views/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000..b93a495 Binary files /dev/null and b/theme/bootstrap/views/fonts/glyphicons-halflings-regular.eot differ diff --git a/theme/bootstrap/views/fonts/glyphicons-halflings-regular.svg b/theme/bootstrap/views/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000..94fb549 --- /dev/null +++ b/theme/bootstrap/views/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,288 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata></metadata> +<defs> +<font id="glyphicons_halflingsregular" horiz-adv-x="1200" > +<font-face units-per-em="1200" ascent="960" descent="-240" /> +<missing-glyph horiz-adv-x="500" /> +<glyph horiz-adv-x="0" /> +<glyph horiz-adv-x="400" /> +<glyph unicode=" " /> +<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" /> +<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xa0;" /> +<glyph unicode="&#xa5;" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" /> +<glyph unicode="&#x2000;" horiz-adv-x="650" /> +<glyph unicode="&#x2001;" horiz-adv-x="1300" /> +<glyph unicode="&#x2002;" horiz-adv-x="650" /> +<glyph unicode="&#x2003;" horiz-adv-x="1300" /> +<glyph unicode="&#x2004;" horiz-adv-x="433" /> +<glyph unicode="&#x2005;" horiz-adv-x="325" /> +<glyph unicode="&#x2006;" horiz-adv-x="216" /> +<glyph unicode="&#x2007;" horiz-adv-x="216" /> +<glyph unicode="&#x2008;" horiz-adv-x="162" /> +<glyph unicode="&#x2009;" horiz-adv-x="260" /> +<glyph unicode="&#x200a;" horiz-adv-x="72" /> +<glyph unicode="&#x202f;" horiz-adv-x="260" /> +<glyph unicode="&#x205f;" horiz-adv-x="325" /> +<glyph unicode="&#x20ac;" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" /> +<glyph unicode="&#x20bd;" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" /> +<glyph unicode="&#x2212;" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#x231b;" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" /> +<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" /> +<glyph unicode="&#x2601;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" /> +<glyph unicode="&#x26fa;" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " /> +<glyph unicode="&#x2709;" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" /> +<glyph unicode="&#x270f;" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" /> +<glyph unicode="&#xe001;" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" /> +<glyph unicode="&#xe002;" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" /> +<glyph unicode="&#xe003;" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" /> +<glyph unicode="&#xe005;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" /> +<glyph unicode="&#xe006;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" /> +<glyph unicode="&#xe007;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" /> +<glyph unicode="&#xe008;" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" /> +<glyph unicode="&#xe009;" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" /> +<glyph unicode="&#xe010;" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe011;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" /> +<glyph unicode="&#xe012;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe013;" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" /> +<glyph unicode="&#xe014;" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" /> +<glyph unicode="&#xe015;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe016;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe017;" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" /> +<glyph unicode="&#xe018;" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe019;" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" /> +<glyph unicode="&#xe020;" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" /> +<glyph unicode="&#xe021;" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" /> +<glyph unicode="&#xe022;" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" /> +<glyph unicode="&#xe023;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe024;" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" /> +<glyph unicode="&#xe025;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe026;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " /> +<glyph unicode="&#xe027;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" /> +<glyph unicode="&#xe028;" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" /> +<glyph unicode="&#xe029;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" /> +<glyph unicode="&#xe030;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" /> +<glyph unicode="&#xe031;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" /> +<glyph unicode="&#xe032;" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe033;" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" /> +<glyph unicode="&#xe034;" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" /> +<glyph unicode="&#xe035;" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" /> +<glyph unicode="&#xe036;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" /> +<glyph unicode="&#xe037;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" /> +<glyph unicode="&#xe038;" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" /> +<glyph unicode="&#xe039;" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" /> +<glyph unicode="&#xe040;" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" /> +<glyph unicode="&#xe041;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" /> +<glyph unicode="&#xe042;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" /> +<glyph unicode="&#xe043;" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" /> +<glyph unicode="&#xe044;" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe045;" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" /> +<glyph unicode="&#xe046;" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" /> +<glyph unicode="&#xe047;" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" /> +<glyph unicode="&#xe048;" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" /> +<glyph unicode="&#xe049;" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" /> +<glyph unicode="&#xe050;" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" /> +<glyph unicode="&#xe051;" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" /> +<glyph unicode="&#xe052;" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe053;" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe054;" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" /> +<glyph unicode="&#xe055;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe056;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe057;" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe058;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe059;" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" /> +<glyph unicode="&#xe060;" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" /> +<glyph unicode="&#xe062;" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" /> +<glyph unicode="&#xe063;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" /> +<glyph unicode="&#xe064;" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" /> +<glyph unicode="&#xe065;" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" /> +<glyph unicode="&#xe066;" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" /> +<glyph unicode="&#xe067;" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" /> +<glyph unicode="&#xe068;" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" /> +<glyph unicode="&#xe069;" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe070;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe071;" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" /> +<glyph unicode="&#xe072;" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" /> +<glyph unicode="&#xe073;" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe074;" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" /> +<glyph unicode="&#xe075;" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" /> +<glyph unicode="&#xe076;" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe077;" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe078;" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe079;" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" /> +<glyph unicode="&#xe080;" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" /> +<glyph unicode="&#xe081;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" /> +<glyph unicode="&#xe082;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" /> +<glyph unicode="&#xe083;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" /> +<glyph unicode="&#xe084;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" /> +<glyph unicode="&#xe085;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" /> +<glyph unicode="&#xe086;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" /> +<glyph unicode="&#xe087;" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" /> +<glyph unicode="&#xe088;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" /> +<glyph unicode="&#xe089;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" /> +<glyph unicode="&#xe090;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" /> +<glyph unicode="&#xe091;" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" /> +<glyph unicode="&#xe092;" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" /> +<glyph unicode="&#xe093;" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" /> +<glyph unicode="&#xe094;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe095;" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" /> +<glyph unicode="&#xe096;" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" /> +<glyph unicode="&#xe097;" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" /> +<glyph unicode="&#xe101;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" /> +<glyph unicode="&#xe102;" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" /> +<glyph unicode="&#xe103;" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" /> +<glyph unicode="&#xe104;" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" /> +<glyph unicode="&#xe105;" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" /> +<glyph unicode="&#xe106;" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" /> +<glyph unicode="&#xe107;" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" /> +<glyph unicode="&#xe108;" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" /> +<glyph unicode="&#xe109;" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" /> +<glyph unicode="&#xe110;" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" /> +<glyph unicode="&#xe111;" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" /> +<glyph unicode="&#xe112;" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" /> +<glyph unicode="&#xe113;" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" /> +<glyph unicode="&#xe114;" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" /> +<glyph unicode="&#xe115;" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> +<glyph unicode="&#xe116;" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" /> +<glyph unicode="&#xe117;" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" /> +<glyph unicode="&#xe118;" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" /> +<glyph unicode="&#xe119;" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> +<glyph unicode="&#xe120;" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" /> +<glyph unicode="&#xe121;" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" /> +<glyph unicode="&#xe122;" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" /> +<glyph unicode="&#xe123;" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" /> +<glyph unicode="&#xe124;" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" /> +<glyph unicode="&#xe125;" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe126;" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" /> +<glyph unicode="&#xe127;" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe128;" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe129;" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe130;" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" /> +<glyph unicode="&#xe131;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" /> +<glyph unicode="&#xe132;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" /> +<glyph unicode="&#xe133;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" /> +<glyph unicode="&#xe134;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" /> +<glyph unicode="&#xe135;" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" /> +<glyph unicode="&#xe136;" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" /> +<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " /> +<glyph unicode="&#xe138;" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" /> +<glyph unicode="&#xe139;" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" /> +<glyph unicode="&#xe140;" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" /> +<glyph unicode="&#xe141;" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" /> +<glyph unicode="&#xe142;" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" /> +<glyph unicode="&#xe143;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" /> +<glyph unicode="&#xe144;" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" /> +<glyph unicode="&#xe145;" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" /> +<glyph unicode="&#xe146;" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" /> +<glyph unicode="&#xe148;" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" /> +<glyph unicode="&#xe149;" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" /> +<glyph unicode="&#xe150;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> +<glyph unicode="&#xe151;" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " /> +<glyph unicode="&#xe152;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " /> +<glyph unicode="&#xe153;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" /> +<glyph unicode="&#xe154;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" /> +<glyph unicode="&#xe155;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" /> +<glyph unicode="&#xe156;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" /> +<glyph unicode="&#xe157;" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" /> +<glyph unicode="&#xe158;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" /> +<glyph unicode="&#xe159;" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" /> +<glyph unicode="&#xe160;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" /> +<glyph unicode="&#xe161;" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" /> +<glyph unicode="&#xe162;" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" /> +<glyph unicode="&#xe163;" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" /> +<glyph unicode="&#xe164;" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" /> +<glyph unicode="&#xe165;" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" /> +<glyph unicode="&#xe166;" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" /> +<glyph unicode="&#xe167;" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" /> +<glyph unicode="&#xe168;" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" /> +<glyph unicode="&#xe169;" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" /> +<glyph unicode="&#xe170;" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" /> +<glyph unicode="&#xe171;" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" /> +<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" /> +<glyph unicode="&#xe173;" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" /> +<glyph unicode="&#xe174;" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" /> +<glyph unicode="&#xe175;" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe176;" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" /> +<glyph unicode="&#xe177;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" /> +<glyph unicode="&#xe178;" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" /> +<glyph unicode="&#xe179;" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" /> +<glyph unicode="&#xe180;" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" /> +<glyph unicode="&#xe181;" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" /> +<glyph unicode="&#xe182;" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" /> +<glyph unicode="&#xe183;" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" /> +<glyph unicode="&#xe184;" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe185;" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " /> +<glyph unicode="&#xe186;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" /> +<glyph unicode="&#xe187;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" /> +<glyph unicode="&#xe188;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" /> +<glyph unicode="&#xe189;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" /> +<glyph unicode="&#xe190;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" /> +<glyph unicode="&#xe191;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" /> +<glyph unicode="&#xe192;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" /> +<glyph unicode="&#xe193;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" /> +<glyph unicode="&#xe194;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" /> +<glyph unicode="&#xe195;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" /> +<glyph unicode="&#xe197;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe198;" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" /> +<glyph unicode="&#xe199;" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" /> +<glyph unicode="&#xe200;" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" /> +<glyph unicode="&#xe201;" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" /> +<glyph unicode="&#xe202;" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" /> +<glyph unicode="&#xe203;" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" /> +<glyph unicode="&#xe204;" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" /> +<glyph unicode="&#xe205;" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" /> +<glyph unicode="&#xe206;" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" /> +<glyph unicode="&#xe209;" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" /> +<glyph unicode="&#xe210;" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe211;" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe212;" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe213;" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe214;" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe215;" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe216;" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" /> +<glyph unicode="&#xe218;" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" /> +<glyph unicode="&#xe219;" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" /> +<glyph unicode="&#xe221;" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe223;" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" /> +<glyph unicode="&#xe224;" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " /> +<glyph unicode="&#xe225;" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" /> +<glyph unicode="&#xe226;" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" /> +<glyph unicode="&#xe227;" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" /> +<glyph unicode="&#xe230;" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" /> +<glyph unicode="&#xe231;" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" /> +<glyph unicode="&#xe232;" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" /> +<glyph unicode="&#xe233;" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" /> +<glyph unicode="&#xe234;" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" /> +<glyph unicode="&#xe235;" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" /> +<glyph unicode="&#xe236;" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe237;" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" /> +<glyph unicode="&#xe238;" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe239;" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" /> +<glyph unicode="&#xe240;" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" /> +<glyph unicode="&#xe241;" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" /> +<glyph unicode="&#xe242;" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" /> +<glyph unicode="&#xe243;" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" /> +<glyph unicode="&#xe244;" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" /> +<glyph unicode="&#xe245;" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" /> +<glyph unicode="&#xe246;" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" /> +<glyph unicode="&#xe247;" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe248;" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" /> +<glyph unicode="&#xe249;" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe250;" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" /> +<glyph unicode="&#xe251;" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" /> +<glyph unicode="&#xe252;" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" /> +<glyph unicode="&#xe253;" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" /> +<glyph unicode="&#xe254;" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" /> +<glyph unicode="&#xe255;" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" /> +<glyph unicode="&#xe256;" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" /> +<glyph unicode="&#xe257;" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" /> +<glyph unicode="&#xe258;" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" /> +<glyph unicode="&#xe259;" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" /> +<glyph unicode="&#xe260;" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" /> +<glyph unicode="&#xf8ff;" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" /> +<glyph unicode="&#x1f511;" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" /> +<glyph unicode="&#x1f6aa;" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/theme/bootstrap/views/fonts/glyphicons-halflings-regular.ttf b/theme/bootstrap/views/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000..1413fc6 Binary files /dev/null and b/theme/bootstrap/views/fonts/glyphicons-halflings-regular.ttf differ diff --git a/theme/bootstrap/views/fonts/glyphicons-halflings-regular.woff b/theme/bootstrap/views/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000..9e61285 Binary files /dev/null and b/theme/bootstrap/views/fonts/glyphicons-halflings-regular.woff differ diff --git a/theme/bootstrap/views/fonts/glyphicons-halflings-regular.woff2 b/theme/bootstrap/views/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000..64539b5 Binary files /dev/null and b/theme/bootstrap/views/fonts/glyphicons-halflings-regular.woff2 differ diff --git a/theme/bootstrap/views/js/New folder/bootstrap.js b/theme/bootstrap/views/js/New folder/bootstrap.js new file mode 100644 index 0000000..5debfd7 --- /dev/null +++ b/theme/bootstrap/views/js/New folder/bootstrap.js @@ -0,0 +1,2363 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under the MIT license + */ + +if (typeof jQuery === 'undefined') { + throw new Error('Bootstrap\'s JavaScript requires jQuery') +} + ++function ($) { + 'use strict'; + var version = $.fn.jquery.split(' ')[0].split('.') + if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) { + throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher') + } +}(jQuery); + +/* ======================================================================== + * Bootstrap: transition.js v3.3.5 + * http://getbootstrap.com/javascript/#transitions + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + WebkitTransition : 'webkitTransitionEnd', + MozTransition : 'transitionend', + OTransition : 'oTransitionEnd otransitionend', + transition : 'transitionend' + } + + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return { end: transEndEventNames[name] } + } + } + + return false // explicit for ie8 ( ._.) + } + + // http://blog.alexmaccaw.com/css-transitions + $.fn.emulateTransitionEnd = function (duration) { + var called = false + var $el = this + $(this).one('bsTransitionEnd', function () { called = true }) + var callback = function () { if (!called) $($el).trigger($.support.transition.end) } + setTimeout(callback, duration) + return this + } + + $(function () { + $.support.transition = transitionEnd() + + if (!$.support.transition) return + + $.event.special.bsTransitionEnd = { + bindType: $.support.transition.end, + delegateType: $.support.transition.end, + handle: function (e) { + if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) + } + } + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: alert.js v3.3.5 + * http://getbootstrap.com/javascript/#alerts + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.VERSION = '3.3.5' + + Alert.TRANSITION_DURATION = 150 + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.closest('.alert') + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + // detach from parent, fire event then clean up data + $parent.detach().trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one('bsTransitionEnd', removeElement) + .emulateTransitionEnd(Alert.TRANSITION_DURATION) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.alert + + $.fn.alert = Plugin + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: button.js v3.3.5 + * http://getbootstrap.com/javascript/#buttons + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + this.isLoading = false + } + + Button.VERSION = '3.3.5' + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state += 'Text' + + if (data.resetText == null) $el.data('resetText', $el[val]()) + + // push to event loop to allow forms to submit + setTimeout($.proxy(function () { + $el[val](data[state] == null ? this.options[state] : data[state]) + + if (state == 'loadingText') { + this.isLoading = true + $el.addClass(d).attr(d, d) + } else if (this.isLoading) { + this.isLoading = false + $el.removeClass(d).removeAttr(d) + } + }, this), 0) + } + + Button.prototype.toggle = function () { + var changed = true + var $parent = this.$element.closest('[data-toggle="buttons"]') + + if ($parent.length) { + var $input = this.$element.find('input') + if ($input.prop('type') == 'radio') { + if ($input.prop('checked')) changed = false + $parent.find('.active').removeClass('active') + this.$element.addClass('active') + } else if ($input.prop('type') == 'checkbox') { + if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false + this.$element.toggleClass('active') + } + $input.prop('checked', this.$element.hasClass('active')) + if (changed) $input.trigger('change') + } else { + this.$element.attr('aria-pressed', !this.$element.hasClass('active')) + this.$element.toggleClass('active') + } + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + var old = $.fn.button + + $.fn.button = Plugin + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document) + .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + Plugin.call($btn, 'toggle') + if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault() + }) + .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: carousel.js v3.3.5 + * http://getbootstrap.com/javascript/#carousel + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = null + this.sliding = null + this.interval = null + this.$active = null + this.$items = null + + this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) + + this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element + .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) + .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) + } + + Carousel.VERSION = '3.3.5' + + Carousel.TRANSITION_DURATION = 600 + + Carousel.DEFAULTS = { + interval: 5000, + pause: 'hover', + wrap: true, + keyboard: true + } + + Carousel.prototype.keydown = function (e) { + if (/input|textarea/i.test(e.target.tagName)) return + switch (e.which) { + case 37: this.prev(); break + case 39: this.next(); break + default: return + } + + e.preventDefault() + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getItemIndex = function (item) { + this.$items = item.parent().children('.item') + return this.$items.index(item || this.$active) + } + + Carousel.prototype.getItemForDirection = function (direction, active) { + var activeIndex = this.getItemIndex(active) + var willWrap = (direction == 'prev' && activeIndex === 0) + || (direction == 'next' && activeIndex == (this.$items.length - 1)) + if (willWrap && !this.options.wrap) return active + var delta = direction == 'prev' ? -1 : 1 + var itemIndex = (activeIndex + delta) % this.$items.length + return this.$items.eq(itemIndex) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || this.getItemForDirection(type, $active) + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var that = this + + if ($next.hasClass('active')) return (this.sliding = false) + + var relatedTarget = $next[0] + var slideEvent = $.Event('slide.bs.carousel', { + relatedTarget: relatedTarget, + direction: direction + }) + this.$element.trigger(slideEvent) + if (slideEvent.isDefaultPrevented()) return + + this.sliding = true + + isCycling && this.pause() + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) + $nextIndicator && $nextIndicator.addClass('active') + } + + var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" + if ($.support.transition && this.$element.hasClass('slide')) { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one('bsTransitionEnd', function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { + that.$element.trigger(slidEvent) + }, 0) + }) + .emulateTransitionEnd(Carousel.TRANSITION_DURATION) + } else { + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger(slidEvent) + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + var old = $.fn.carousel + + $.fn.carousel = Plugin + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + var clickHandler = function (e) { + var href + var $this = $(this) + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 + if (!$target.hasClass('carousel')) return + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + Plugin.call($target, options) + + if (slideIndex) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + } + + $(document) + .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) + .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + Plugin.call($carousel, $carousel.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: collapse.js v3.3.5 + * http://getbootstrap.com/javascript/#collapse + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + + '[data-toggle="collapse"][data-target="#' + element.id + '"]') + this.transitioning = null + + if (this.options.parent) { + this.$parent = this.getParent() + } else { + this.addAriaAndCollapsedClass(this.$element, this.$trigger) + } + + if (this.options.toggle) this.toggle() + } + + Collapse.VERSION = '3.3.5' + + Collapse.TRANSITION_DURATION = 350 + + Collapse.DEFAULTS = { + toggle: true + } + + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var activesData + var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') + + if (actives && actives.length) { + activesData = actives.data('bs.collapse') + if (activesData && activesData.transitioning) return + } + + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + if (actives && actives.length) { + Plugin.call(actives, 'hide') + activesData || actives.data('bs.collapse', null) + } + + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + .addClass('collapsing')[dimension](0) + .attr('aria-expanded', true) + + this.$trigger + .removeClass('collapsed') + .attr('aria-expanded', true) + + this.transitioning = 1 + + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('collapse in')[dimension]('') + this.transitioning = 0 + this.$element + .trigger('shown.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + var scrollSize = $.camelCase(['scroll', dimension].join('-')) + + this.$element + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) + } + + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var dimension = this.dimension() + + this.$element[dimension](this.$element[dimension]())[0].offsetHeight + + this.$element + .addClass('collapsing') + .removeClass('collapse in') + .attr('aria-expanded', false) + + this.$trigger + .addClass('collapsed') + .attr('aria-expanded', false) + + this.transitioning = 1 + + var complete = function () { + this.transitioning = 0 + this.$element + .removeClass('collapsing') + .addClass('collapse') + .trigger('hidden.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + this.$element + [dimension](0) + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION) + } + + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + Collapse.prototype.getParent = function () { + return $(this.options.parent) + .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') + .each($.proxy(function (i, element) { + var $element = $(element) + this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) + }, this)) + .end() + } + + Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { + var isOpen = $element.hasClass('in') + + $element.attr('aria-expanded', isOpen) + $trigger + .toggleClass('collapsed', !isOpen) + .attr('aria-expanded', isOpen) + } + + function getTargetFromTrigger($trigger) { + var href + var target = $trigger.attr('data-target') + || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 + + return $(target) + } + + + // COLLAPSE PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.collapse + + $.fn.collapse = Plugin + $.fn.collapse.Constructor = Collapse + + + // COLLAPSE NO CONFLICT + // ==================== + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + // COLLAPSE DATA-API + // ================= + + $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { + var $this = $(this) + + if (!$this.attr('data-target')) e.preventDefault() + + var $target = getTargetFromTrigger($this) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + + Plugin.call($target, option) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.3.5 + * http://getbootstrap.com/javascript/#dropdowns + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle="dropdown"]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.VERSION = '3.3.5' + + function getParent($this) { + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = selector && $(selector) + + return $parent && $parent.length ? $parent : $this.parent() + } + + function clearMenus(e) { + if (e && e.which === 3) return + $(backdrop).remove() + $(toggle).each(function () { + var $this = $(this) + var $parent = getParent($this) + var relatedTarget = { relatedTarget: this } + + if (!$parent.hasClass('open')) return + + if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return + + $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this.attr('aria-expanded', 'false') + $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget) + }) + } + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we use a backdrop because click events don't delegate + $(document.createElement('div')) + .addClass('dropdown-backdrop') + .insertAfter($(this)) + .on('click', clearMenus) + } + + var relatedTarget = { relatedTarget: this } + $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this + .trigger('focus') + .attr('aria-expanded', 'true') + + $parent + .toggleClass('open') + .trigger('shown.bs.dropdown', relatedTarget) + } + + return false + } + + Dropdown.prototype.keydown = function (e) { + if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return + + var $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + if (!isActive && e.which != 27 || isActive && e.which == 27) { + if (e.which == 27) $parent.find(toggle).trigger('focus') + return $this.trigger('click') + } + + var desc = ' li:not(.disabled):visible a' + var $items = $parent.find('.dropdown-menu' + desc) + + if (!$items.length) return + + var index = $items.index(e.target) + + if (e.which == 38 && index > 0) index-- // up + if (e.which == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items.eq(index).trigger('focus') + } + + + // DROPDOWN PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.dropdown') + + if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.dropdown + + $.fn.dropdown = Plugin + $.fn.dropdown.Constructor = Dropdown + + + // DROPDOWN NO CONFLICT + // ==================== + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + // APPLY TO STANDARD DROPDOWN ELEMENTS + // =================================== + + $(document) + .on('click.bs.dropdown.data-api', clearMenus) + .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) + .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: modal.js v3.3.5 + * http://getbootstrap.com/javascript/#modals + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // MODAL CLASS DEFINITION + // ====================== + + var Modal = function (element, options) { + this.options = options + this.$body = $(document.body) + this.$element = $(element) + this.$dialog = this.$element.find('.modal-dialog') + this.$backdrop = null + this.isShown = null + this.originalBodyPad = null + this.scrollbarWidth = 0 + this.ignoreBackdropClick = false + + if (this.options.remote) { + this.$element + .find('.modal-content') + .load(this.options.remote, $.proxy(function () { + this.$element.trigger('loaded.bs.modal') + }, this)) + } + } + + Modal.VERSION = '3.3.5' + + Modal.TRANSITION_DURATION = 300 + Modal.BACKDROP_TRANSITION_DURATION = 150 + + Modal.DEFAULTS = { + backdrop: true, + keyboard: true, + show: true + } + + Modal.prototype.toggle = function (_relatedTarget) { + return this.isShown ? this.hide() : this.show(_relatedTarget) + } + + Modal.prototype.show = function (_relatedTarget) { + var that = this + var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.checkScrollbar() + this.setScrollbar() + this.$body.addClass('modal-open') + + this.escape() + this.resize() + + this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) + + this.$dialog.on('mousedown.dismiss.bs.modal', function () { + that.$element.one('mouseup.dismiss.bs.modal', function (e) { + if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true + }) + }) + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(that.$body) // don't move modals dom position + } + + that.$element + .show() + .scrollTop(0) + + that.adjustDialog() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element.addClass('in') + + that.enforceFocus() + + var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) + + transition ? + that.$dialog // wait for modal to slide in + .one('bsTransitionEnd', function () { + that.$element.trigger('focus').trigger(e) + }) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + that.$element.trigger('focus').trigger(e) + }) + } + + Modal.prototype.hide = function (e) { + if (e) e.preventDefault() + + e = $.Event('hide.bs.modal') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + this.resize() + + $(document).off('focusin.bs.modal') + + this.$element + .removeClass('in') + .off('click.dismiss.bs.modal') + .off('mouseup.dismiss.bs.modal') + + this.$dialog.off('mousedown.dismiss.bs.modal') + + $.support.transition && this.$element.hasClass('fade') ? + this.$element + .one('bsTransitionEnd', $.proxy(this.hideModal, this)) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + this.hideModal() + } + + Modal.prototype.enforceFocus = function () { + $(document) + .off('focusin.bs.modal') // guard against infinite focus loop + .on('focusin.bs.modal', $.proxy(function (e) { + if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { + this.$element.trigger('focus') + } + }, this)) + } + + Modal.prototype.escape = function () { + if (this.isShown && this.options.keyboard) { + this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { + e.which == 27 && this.hide() + }, this)) + } else if (!this.isShown) { + this.$element.off('keydown.dismiss.bs.modal') + } + } + + Modal.prototype.resize = function () { + if (this.isShown) { + $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) + } else { + $(window).off('resize.bs.modal') + } + } + + Modal.prototype.hideModal = function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.$body.removeClass('modal-open') + that.resetAdjustments() + that.resetScrollbar() + that.$element.trigger('hidden.bs.modal') + }) + } + + Modal.prototype.removeBackdrop = function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + Modal.prototype.backdrop = function (callback) { + var that = this + var animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $(document.createElement('div')) + .addClass('modal-backdrop ' + animate) + .appendTo(this.$body) + + this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { + if (this.ignoreBackdropClick) { + this.ignoreBackdropClick = false + return + } + if (e.target !== e.currentTarget) return + this.options.backdrop == 'static' + ? this.$element[0].focus() + : this.hide() + }, this)) + + if (doAnimate) this.$backdrop[0].offsetWidth // force reflow + + this.$backdrop.addClass('in') + + if (!callback) return + + doAnimate ? + this.$backdrop + .one('bsTransitionEnd', callback) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callback() + + } else if (!this.isShown && this.$backdrop) { + this.$backdrop.removeClass('in') + + var callbackRemove = function () { + that.removeBackdrop() + callback && callback() + } + $.support.transition && this.$element.hasClass('fade') ? + this.$backdrop + .one('bsTransitionEnd', callbackRemove) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callbackRemove() + + } else if (callback) { + callback() + } + } + + // these following methods are used to handle overflowing modals + + Modal.prototype.handleUpdate = function () { + this.adjustDialog() + } + + Modal.prototype.adjustDialog = function () { + var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight + + this.$element.css({ + paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', + paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' + }) + } + + Modal.prototype.resetAdjustments = function () { + this.$element.css({ + paddingLeft: '', + paddingRight: '' + }) + } + + Modal.prototype.checkScrollbar = function () { + var fullWindowWidth = window.innerWidth + if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 + var documentElementRect = document.documentElement.getBoundingClientRect() + fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) + } + this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth + this.scrollbarWidth = this.measureScrollbar() + } + + Modal.prototype.setScrollbar = function () { + var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) + this.originalBodyPad = document.body.style.paddingRight || '' + if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) + } + + Modal.prototype.resetScrollbar = function () { + this.$body.css('padding-right', this.originalBodyPad) + } + + Modal.prototype.measureScrollbar = function () { // thx walsh + var scrollDiv = document.createElement('div') + scrollDiv.className = 'modal-scrollbar-measure' + this.$body.append(scrollDiv) + var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth + this.$body[0].removeChild(scrollDiv) + return scrollbarWidth + } + + + // MODAL PLUGIN DEFINITION + // ======================= + + function Plugin(option, _relatedTarget) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.modal') + var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('bs.modal', (data = new Modal(this, options))) + if (typeof option == 'string') data[option](_relatedTarget) + else if (options.show) data.show(_relatedTarget) + }) + } + + var old = $.fn.modal + + $.fn.modal = Plugin + $.fn.modal.Constructor = Modal + + + // MODAL NO CONFLICT + // ================= + + $.fn.modal.noConflict = function () { + $.fn.modal = old + return this + } + + + // MODAL DATA-API + // ============== + + $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { + var $this = $(this) + var href = $this.attr('href') + var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 + var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) + + if ($this.is('a')) e.preventDefault() + + $target.one('show.bs.modal', function (showEvent) { + if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown + $target.one('hidden.bs.modal', function () { + $this.is(':visible') && $this.trigger('focus') + }) + }) + Plugin.call($target, option, this) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tooltip.js v3.3.5 + * http://getbootstrap.com/javascript/#tooltip + * Inspired by the original jQuery.tipsy by Jason Frame + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TOOLTIP PUBLIC CLASS DEFINITION + // =============================== + + var Tooltip = function (element, options) { + this.type = null + this.options = null + this.enabled = null + this.timeout = null + this.hoverState = null + this.$element = null + this.inState = null + + this.init('tooltip', element, options) + } + + Tooltip.VERSION = '3.3.5' + + Tooltip.TRANSITION_DURATION = 150 + + Tooltip.DEFAULTS = { + animation: true, + placement: 'top', + selector: false, + template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + container: false, + viewport: { + selector: 'body', + padding: 0 + } + } + + Tooltip.prototype.init = function (type, element, options) { + this.enabled = true + this.type = type + this.$element = $(element) + this.options = this.getOptions(options) + this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) + this.inState = { click: false, hover: false, focus: false } + + if (this.$element[0] instanceof document.constructor && !this.options.selector) { + throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') + } + + var triggers = this.options.trigger.split(' ') + + for (var i = triggers.length; i--;) { + var trigger = triggers[i] + + if (trigger == 'click') { + this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) + } else if (trigger != 'manual') { + var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' + var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' + + this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) + this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) + } + } + + this.options.selector ? + (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : + this.fixTitle() + } + + Tooltip.prototype.getDefaults = function () { + return Tooltip.DEFAULTS + } + + Tooltip.prototype.getOptions = function (options) { + options = $.extend({}, this.getDefaults(), this.$element.data(), options) + + if (options.delay && typeof options.delay == 'number') { + options.delay = { + show: options.delay, + hide: options.delay + } + } + + return options + } + + Tooltip.prototype.getDelegateOptions = function () { + var options = {} + var defaults = this.getDefaults() + + this._options && $.each(this._options, function (key, value) { + if (defaults[key] != value) options[key] = value + }) + + return options + } + + Tooltip.prototype.enter = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true + } + + if (self.tip().hasClass('in') || self.hoverState == 'in') { + self.hoverState = 'in' + return + } + + clearTimeout(self.timeout) + + self.hoverState = 'in' + + if (!self.options.delay || !self.options.delay.show) return self.show() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'in') self.show() + }, self.options.delay.show) + } + + Tooltip.prototype.isInStateTrue = function () { + for (var key in this.inState) { + if (this.inState[key]) return true + } + + return false + } + + Tooltip.prototype.leave = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false + } + + if (self.isInStateTrue()) return + + clearTimeout(self.timeout) + + self.hoverState = 'out' + + if (!self.options.delay || !self.options.delay.hide) return self.hide() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'out') self.hide() + }, self.options.delay.hide) + } + + Tooltip.prototype.show = function () { + var e = $.Event('show.bs.' + this.type) + + if (this.hasContent() && this.enabled) { + this.$element.trigger(e) + + var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) + if (e.isDefaultPrevented() || !inDom) return + var that = this + + var $tip = this.tip() + + var tipId = this.getUID(this.type) + + this.setContent() + $tip.attr('id', tipId) + this.$element.attr('aria-describedby', tipId) + + if (this.options.animation) $tip.addClass('fade') + + var placement = typeof this.options.placement == 'function' ? + this.options.placement.call(this, $tip[0], this.$element[0]) : + this.options.placement + + var autoToken = /\s?auto?\s?/i + var autoPlace = autoToken.test(placement) + if (autoPlace) placement = placement.replace(autoToken, '') || 'top' + + $tip + .detach() + .css({ top: 0, left: 0, display: 'block' }) + .addClass(placement) + .data('bs.' + this.type, this) + + this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) + this.$element.trigger('inserted.bs.' + this.type) + + var pos = this.getPosition() + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (autoPlace) { + var orgPlacement = placement + var viewportDim = this.getPosition(this.$viewport) + + placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : + placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : + placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : + placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : + placement + + $tip + .removeClass(orgPlacement) + .addClass(placement) + } + + var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) + + this.applyPlacement(calculatedOffset, placement) + + var complete = function () { + var prevHoverState = that.hoverState + that.$element.trigger('shown.bs.' + that.type) + that.hoverState = null + + if (prevHoverState == 'out') that.leave(that) + } + + $.support.transition && this.$tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + } + } + + Tooltip.prototype.applyPlacement = function (offset, placement) { + var $tip = this.tip() + var width = $tip[0].offsetWidth + var height = $tip[0].offsetHeight + + // manually read margins because getBoundingClientRect includes difference + var marginTop = parseInt($tip.css('margin-top'), 10) + var marginLeft = parseInt($tip.css('margin-left'), 10) + + // we must check for NaN for ie 8/9 + if (isNaN(marginTop)) marginTop = 0 + if (isNaN(marginLeft)) marginLeft = 0 + + offset.top += marginTop + offset.left += marginLeft + + // $.fn.offset doesn't round pixel values + // so we use setOffset directly with our own function B-0 + $.offset.setOffset($tip[0], $.extend({ + using: function (props) { + $tip.css({ + top: Math.round(props.top), + left: Math.round(props.left) + }) + } + }, offset), 0) + + $tip.addClass('in') + + // check to see if placing tip in new offset caused the tip to resize itself + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (placement == 'top' && actualHeight != height) { + offset.top = offset.top + height - actualHeight + } + + var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) + + if (delta.left) offset.left += delta.left + else offset.top += delta.top + + var isVertical = /top|bottom/.test(placement) + var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight + var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' + + $tip.offset(offset) + this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) + } + + Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { + this.arrow() + .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') + .css(isVertical ? 'top' : 'left', '') + } + + Tooltip.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + + $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) + $tip.removeClass('fade in top bottom left right') + } + + Tooltip.prototype.hide = function (callback) { + var that = this + var $tip = $(this.$tip) + var e = $.Event('hide.bs.' + this.type) + + function complete() { + if (that.hoverState != 'in') $tip.detach() + that.$element + .removeAttr('aria-describedby') + .trigger('hidden.bs.' + that.type) + callback && callback() + } + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + $tip.removeClass('in') + + $.support.transition && $tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + + this.hoverState = null + + return this + } + + Tooltip.prototype.fixTitle = function () { + var $e = this.$element + if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { + $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') + } + } + + Tooltip.prototype.hasContent = function () { + return this.getTitle() + } + + Tooltip.prototype.getPosition = function ($element) { + $element = $element || this.$element + + var el = $element[0] + var isBody = el.tagName == 'BODY' + + var elRect = el.getBoundingClientRect() + if (elRect.width == null) { + // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 + elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) + } + var elOffset = isBody ? { top: 0, left: 0 } : $element.offset() + var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } + var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null + + return $.extend({}, elRect, scroll, outerDims, elOffset) + } + + Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { + return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : + /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } + + } + + Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { + var delta = { top: 0, left: 0 } + if (!this.$viewport) return delta + + var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 + var viewportDimensions = this.getPosition(this.$viewport) + + if (/right|left/.test(placement)) { + var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll + var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight + if (topEdgeOffset < viewportDimensions.top) { // top overflow + delta.top = viewportDimensions.top - topEdgeOffset + } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow + delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset + } + } else { + var leftEdgeOffset = pos.left - viewportPadding + var rightEdgeOffset = pos.left + viewportPadding + actualWidth + if (leftEdgeOffset < viewportDimensions.left) { // left overflow + delta.left = viewportDimensions.left - leftEdgeOffset + } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow + delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset + } + } + + return delta + } + + Tooltip.prototype.getTitle = function () { + var title + var $e = this.$element + var o = this.options + + title = $e.attr('data-original-title') + || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) + + return title + } + + Tooltip.prototype.getUID = function (prefix) { + do prefix += ~~(Math.random() * 1000000) + while (document.getElementById(prefix)) + return prefix + } + + Tooltip.prototype.tip = function () { + if (!this.$tip) { + this.$tip = $(this.options.template) + if (this.$tip.length != 1) { + throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') + } + } + return this.$tip + } + + Tooltip.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) + } + + Tooltip.prototype.enable = function () { + this.enabled = true + } + + Tooltip.prototype.disable = function () { + this.enabled = false + } + + Tooltip.prototype.toggleEnabled = function () { + this.enabled = !this.enabled + } + + Tooltip.prototype.toggle = function (e) { + var self = this + if (e) { + self = $(e.currentTarget).data('bs.' + this.type) + if (!self) { + self = new this.constructor(e.currentTarget, this.getDelegateOptions()) + $(e.currentTarget).data('bs.' + this.type, self) + } + } + + if (e) { + self.inState.click = !self.inState.click + if (self.isInStateTrue()) self.enter(self) + else self.leave(self) + } else { + self.tip().hasClass('in') ? self.leave(self) : self.enter(self) + } + } + + Tooltip.prototype.destroy = function () { + var that = this + clearTimeout(this.timeout) + this.hide(function () { + that.$element.off('.' + that.type).removeData('bs.' + that.type) + if (that.$tip) { + that.$tip.detach() + } + that.$tip = null + that.$arrow = null + that.$viewport = null + }) + } + + + // TOOLTIP PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tooltip') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tooltip + + $.fn.tooltip = Plugin + $.fn.tooltip.Constructor = Tooltip + + + // TOOLTIP NO CONFLICT + // =================== + + $.fn.tooltip.noConflict = function () { + $.fn.tooltip = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: popover.js v3.3.5 + * http://getbootstrap.com/javascript/#popovers + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // POPOVER PUBLIC CLASS DEFINITION + // =============================== + + var Popover = function (element, options) { + this.init('popover', element, options) + } + + if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') + + Popover.VERSION = '3.3.5' + + Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { + placement: 'right', + trigger: 'click', + content: '', + template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>' + }) + + + // NOTE: POPOVER EXTENDS tooltip.js + // ================================ + + Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) + + Popover.prototype.constructor = Popover + + Popover.prototype.getDefaults = function () { + return Popover.DEFAULTS + } + + Popover.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + var content = this.getContent() + + $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) + $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events + this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' + ](content) + + $tip.removeClass('fade top bottom left right in') + + // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do + // this manually by checking the contents. + if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() + } + + Popover.prototype.hasContent = function () { + return this.getTitle() || this.getContent() + } + + Popover.prototype.getContent = function () { + var $e = this.$element + var o = this.options + + return $e.attr('data-content') + || (typeof o.content == 'function' ? + o.content.call($e[0]) : + o.content) + } + + Popover.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.arrow')) + } + + + // POPOVER PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.popover') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.popover', (data = new Popover(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.popover + + $.fn.popover = Plugin + $.fn.popover.Constructor = Popover + + + // POPOVER NO CONFLICT + // =================== + + $.fn.popover.noConflict = function () { + $.fn.popover = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: scrollspy.js v3.3.5 + * http://getbootstrap.com/javascript/#scrollspy + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // SCROLLSPY CLASS DEFINITION + // ========================== + + function ScrollSpy(element, options) { + this.$body = $(document.body) + this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) + this.options = $.extend({}, ScrollSpy.DEFAULTS, options) + this.selector = (this.options.target || '') + ' .nav li > a' + this.offsets = [] + this.targets = [] + this.activeTarget = null + this.scrollHeight = 0 + + this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) + this.refresh() + this.process() + } + + ScrollSpy.VERSION = '3.3.5' + + ScrollSpy.DEFAULTS = { + offset: 10 + } + + ScrollSpy.prototype.getScrollHeight = function () { + return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) + } + + ScrollSpy.prototype.refresh = function () { + var that = this + var offsetMethod = 'offset' + var offsetBase = 0 + + this.offsets = [] + this.targets = [] + this.scrollHeight = this.getScrollHeight() + + if (!$.isWindow(this.$scrollElement[0])) { + offsetMethod = 'position' + offsetBase = this.$scrollElement.scrollTop() + } + + this.$body + .find(this.selector) + .map(function () { + var $el = $(this) + var href = $el.data('target') || $el.attr('href') + var $href = /^#./.test(href) && $(href) + + return ($href + && $href.length + && $href.is(':visible') + && [[$href[offsetMethod]().top + offsetBase, href]]) || null + }) + .sort(function (a, b) { return a[0] - b[0] }) + .each(function () { + that.offsets.push(this[0]) + that.targets.push(this[1]) + }) + } + + ScrollSpy.prototype.process = function () { + var scrollTop = this.$scrollElement.scrollTop() + this.options.offset + var scrollHeight = this.getScrollHeight() + var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() + var offsets = this.offsets + var targets = this.targets + var activeTarget = this.activeTarget + var i + + if (this.scrollHeight != scrollHeight) { + this.refresh() + } + + if (scrollTop >= maxScroll) { + return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) + } + + if (activeTarget && scrollTop < offsets[0]) { + this.activeTarget = null + return this.clear() + } + + for (i = offsets.length; i--;) { + activeTarget != targets[i] + && scrollTop >= offsets[i] + && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) + && this.activate(targets[i]) + } + } + + ScrollSpy.prototype.activate = function (target) { + this.activeTarget = target + + this.clear() + + var selector = this.selector + + '[data-target="' + target + '"],' + + this.selector + '[href="' + target + '"]' + + var active = $(selector) + .parents('li') + .addClass('active') + + if (active.parent('.dropdown-menu').length) { + active = active + .closest('li.dropdown') + .addClass('active') + } + + active.trigger('activate.bs.scrollspy') + } + + ScrollSpy.prototype.clear = function () { + $(this.selector) + .parentsUntil(this.options.target, '.active') + .removeClass('active') + } + + + // SCROLLSPY PLUGIN DEFINITION + // =========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.scrollspy') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.scrollspy + + $.fn.scrollspy = Plugin + $.fn.scrollspy.Constructor = ScrollSpy + + + // SCROLLSPY NO CONFLICT + // ===================== + + $.fn.scrollspy.noConflict = function () { + $.fn.scrollspy = old + return this + } + + + // SCROLLSPY DATA-API + // ================== + + $(window).on('load.bs.scrollspy.data-api', function () { + $('[data-spy="scroll"]').each(function () { + var $spy = $(this) + Plugin.call($spy, $spy.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tab.js v3.3.5 + * http://getbootstrap.com/javascript/#tabs + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TAB CLASS DEFINITION + // ==================== + + var Tab = function (element) { + // jscs:disable requireDollarBeforejQueryAssignment + this.element = $(element) + // jscs:enable requireDollarBeforejQueryAssignment + } + + Tab.VERSION = '3.3.5' + + Tab.TRANSITION_DURATION = 150 + + Tab.prototype.show = function () { + var $this = this.element + var $ul = $this.closest('ul:not(.dropdown-menu)') + var selector = $this.data('target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + if ($this.parent('li').hasClass('active')) return + + var $previous = $ul.find('.active:last a') + var hideEvent = $.Event('hide.bs.tab', { + relatedTarget: $this[0] + }) + var showEvent = $.Event('show.bs.tab', { + relatedTarget: $previous[0] + }) + + $previous.trigger(hideEvent) + $this.trigger(showEvent) + + if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return + + var $target = $(selector) + + this.activate($this.closest('li'), $ul) + this.activate($target, $target.parent(), function () { + $previous.trigger({ + type: 'hidden.bs.tab', + relatedTarget: $this[0] + }) + $this.trigger({ + type: 'shown.bs.tab', + relatedTarget: $previous[0] + }) + }) + } + + Tab.prototype.activate = function (element, container, callback) { + var $active = container.find('> .active') + var transition = callback + && $.support.transition + && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', false) + + element + .addClass('active') + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + + if (transition) { + element[0].offsetWidth // reflow for transition + element.addClass('in') + } else { + element.removeClass('fade') + } + + if (element.parent('.dropdown-menu').length) { + element + .closest('li.dropdown') + .addClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + } + + callback && callback() + } + + $active.length && transition ? + $active + .one('bsTransitionEnd', next) + .emulateTransitionEnd(Tab.TRANSITION_DURATION) : + next() + + $active.removeClass('in') + } + + + // TAB PLUGIN DEFINITION + // ===================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tab') + + if (!data) $this.data('bs.tab', (data = new Tab(this))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tab + + $.fn.tab = Plugin + $.fn.tab.Constructor = Tab + + + // TAB NO CONFLICT + // =============== + + $.fn.tab.noConflict = function () { + $.fn.tab = old + return this + } + + + // TAB DATA-API + // ============ + + var clickHandler = function (e) { + e.preventDefault() + Plugin.call($(this), 'show') + } + + $(document) + .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) + .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: affix.js v3.3.5 + * http://getbootstrap.com/javascript/#affix + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // AFFIX CLASS DEFINITION + // ====================== + + var Affix = function (element, options) { + this.options = $.extend({}, Affix.DEFAULTS, options) + + this.$target = $(this.options.target) + .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) + .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) + + this.$element = $(element) + this.affixed = null + this.unpin = null + this.pinnedOffset = null + + this.checkPosition() + } + + Affix.VERSION = '3.3.5' + + Affix.RESET = 'affix affix-top affix-bottom' + + Affix.DEFAULTS = { + offset: 0, + target: window + } + + Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + var targetHeight = this.$target.height() + + if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false + + if (this.affixed == 'bottom') { + if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' + return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' + } + + var initializing = this.affixed == null + var colliderTop = initializing ? scrollTop : position.top + var colliderHeight = initializing ? targetHeight : height + + if (offsetTop != null && scrollTop <= offsetTop) return 'top' + if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' + + return false + } + + Affix.prototype.getPinnedOffset = function () { + if (this.pinnedOffset) return this.pinnedOffset + this.$element.removeClass(Affix.RESET).addClass('affix') + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + return (this.pinnedOffset = position.top - scrollTop) + } + + Affix.prototype.checkPositionWithEventLoop = function () { + setTimeout($.proxy(this.checkPosition, this), 1) + } + + Affix.prototype.checkPosition = function () { + if (!this.$element.is(':visible')) return + + var height = this.$element.height() + var offset = this.options.offset + var offsetTop = offset.top + var offsetBottom = offset.bottom + var scrollHeight = Math.max($(document).height(), $(document.body).height()) + + if (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) + + var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) + + if (this.affixed != affix) { + if (this.unpin != null) this.$element.css('top', '') + + var affixType = 'affix' + (affix ? '-' + affix : '') + var e = $.Event(affixType + '.bs.affix') + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + this.affixed = affix + this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null + + this.$element + .removeClass(Affix.RESET) + .addClass(affixType) + .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') + } + + if (affix == 'bottom') { + this.$element.offset({ + top: scrollHeight - height - offsetBottom + }) + } + } + + + // AFFIX PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.affix') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.affix', (data = new Affix(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.affix + + $.fn.affix = Plugin + $.fn.affix.Constructor = Affix + + + // AFFIX NO CONFLICT + // ================= + + $.fn.affix.noConflict = function () { + $.fn.affix = old + return this + } + + + // AFFIX DATA-API + // ============== + + $(window).on('load', function () { + $('[data-spy="affix"]').each(function () { + var $spy = $(this) + var data = $spy.data() + + data.offset = data.offset || {} + + if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom + if (data.offsetTop != null) data.offset.top = data.offsetTop + + Plugin.call($spy, data) + }) + }) + +}(jQuery); diff --git a/theme/bootstrap/views/js/New folder/bootstrap.min.js b/theme/bootstrap/views/js/New folder/bootstrap.min.js new file mode 100644 index 0000000..133aeec --- /dev/null +++ b/theme/bootstrap/views/js/New folder/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.5 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.5",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.5",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.5",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.5",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.5",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.5",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in"),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+e).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",a,b)};c.VERSION="3.3.5",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-m<o.top?"bottom":"right"==h&&k.right+l>o.width?"left":"left"==h&&k.left-l<o.left?"right":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.5",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.5",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")), +d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.5",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.5",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/views/js/New folder/jquery.js b/theme/bootstrap/views/js/New folder/jquery.js new file mode 100644 index 0000000..d1608e3 --- /dev/null +++ b/theme/bootstrap/views/js/New folder/jquery.js @@ -0,0 +1,4 @@ +/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=lb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=mb(b);function pb(){}pb.prototype=d.filters=d.pseudos,d.setFilters=new pb,g=fb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fb.error(a):z(a,i).slice(0)};function qb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h; +if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==cb()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===cb()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ab:bb):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:bb,isPropagationStopped:bb,isImmediatePropagationStopped:bb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ab,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ab,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ab,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=bb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=bb),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function db(a){var b=eb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var eb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fb=/ jQuery\d+="(?:null|\d+)"/g,gb=new RegExp("<(?:"+eb+")[\\s/>]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/<tbody/i,lb=/<|&#?\w+;/,mb=/<(?:script|style|link)/i,nb=/checked\s*(?:[^=]|=\s*.checked.)/i,ob=/^$|\/(?:java|ecma)script/i,pb=/^true\/(.*)/,qb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,rb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?"<table>"!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.detach()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e)}m.Tween=Zb,Zb.prototype={constructor:Zb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px") +},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$b=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_b||(_b=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_b),_b=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSetAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contenteditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.ActiveXObject&&m(a).on("unload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m}); \ No newline at end of file diff --git a/theme/bootstrap/views/js/New folder/npm.js b/theme/bootstrap/views/js/New folder/npm.js new file mode 100644 index 0000000..bf6aa80 --- /dev/null +++ b/theme/bootstrap/views/js/New folder/npm.js @@ -0,0 +1,13 @@ +// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. +require('../../js/transition.js') +require('../../js/alert.js') +require('../../js/button.js') +require('../../js/carousel.js') +require('../../js/collapse.js') +require('../../js/dropdown.js') +require('../../js/modal.js') +require('../../js/tooltip.js') +require('../../js/popover.js') +require('../../js/scrollspy.js') +require('../../js/tab.js') +require('../../js/affix.js') \ No newline at end of file diff --git a/theme/bootstrap/views/js/New folder/plugins/flot/excanvas.min.js b/theme/bootstrap/views/js/New folder/plugins/flot/excanvas.min.js new file mode 100644 index 0000000..12c74f7 --- /dev/null +++ b/theme/bootstrap/views/js/New folder/plugins/flot/excanvas.min.js @@ -0,0 +1 @@ +if(!document.createElement("canvas").getContext){(function(){var z=Math;var K=z.round;var J=z.sin;var U=z.cos;var b=z.abs;var k=z.sqrt;var D=10;var F=D/2;function T(){return this.context_||(this.context_=new W(this))}var O=Array.prototype.slice;function G(i,j,m){var Z=O.call(arguments,2);return function(){return i.apply(j,Z.concat(O.call(arguments)))}}function AD(Z){return String(Z).replace(/&/g,"&amp;").replace(/"/g,"&quot;")}function r(i){if(!i.namespaces.g_vml_){i.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML")}if(!i.namespaces.g_o_){i.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML")}if(!i.styleSheets.ex_canvas_){var Z=i.createStyleSheet();Z.owningElement.id="ex_canvas_";Z.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}r(document);var E={init:function(Z){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var i=Z||document;i.createElement("canvas");i.attachEvent("onreadystatechange",G(this.init_,this,i))}},init_:function(m){var j=m.getElementsByTagName("canvas");for(var Z=0;Z<j.length;Z++){this.initElement(j[Z])}},initElement:function(i){if(!i.getContext){i.getContext=T;r(i.ownerDocument);i.innerHTML="";i.attachEvent("onpropertychange",S);i.attachEvent("onresize",w);var Z=i.attributes;if(Z.width&&Z.width.specified){i.style.width=Z.width.nodeValue+"px"}else{i.width=i.clientWidth}if(Z.height&&Z.height.specified){i.style.height=Z.height.nodeValue+"px"}else{i.height=i.clientHeight}}return i}};function S(i){var Z=i.srcElement;switch(i.propertyName){case"width":Z.getContext().clearRect();Z.style.width=Z.attributes.width.nodeValue+"px";Z.firstChild.style.width=Z.clientWidth+"px";break;case"height":Z.getContext().clearRect();Z.style.height=Z.attributes.height.nodeValue+"px";Z.firstChild.style.height=Z.clientHeight+"px";break}}function w(i){var Z=i.srcElement;if(Z.firstChild){Z.firstChild.style.width=Z.clientWidth+"px";Z.firstChild.style.height=Z.clientHeight+"px"}}E.init();var I=[];for(var AC=0;AC<16;AC++){for(var AB=0;AB<16;AB++){I[AC*16+AB]=AC.toString(16)+AB.toString(16)}}function V(){return[[1,0,0],[0,1,0],[0,0,1]]}function d(m,j){var i=V();for(var Z=0;Z<3;Z++){for(var AF=0;AF<3;AF++){var p=0;for(var AE=0;AE<3;AE++){p+=m[Z][AE]*j[AE][AF]}i[Z][AF]=p}}return i}function Q(i,Z){Z.fillStyle=i.fillStyle;Z.lineCap=i.lineCap;Z.lineJoin=i.lineJoin;Z.lineWidth=i.lineWidth;Z.miterLimit=i.miterLimit;Z.shadowBlur=i.shadowBlur;Z.shadowColor=i.shadowColor;Z.shadowOffsetX=i.shadowOffsetX;Z.shadowOffsetY=i.shadowOffsetY;Z.strokeStyle=i.strokeStyle;Z.globalAlpha=i.globalAlpha;Z.font=i.font;Z.textAlign=i.textAlign;Z.textBaseline=i.textBaseline;Z.arcScaleX_=i.arcScaleX_;Z.arcScaleY_=i.arcScaleY_;Z.lineScale_=i.lineScale_}var B={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"};function g(i){var m=i.indexOf("(",3);var Z=i.indexOf(")",m+1);var j=i.substring(m+1,Z).split(",");if(j.length==4&&i.substr(3,1)=="a"){alpha=Number(j[3])}else{j[3]=1}return j}function C(Z){return parseFloat(Z)/100}function N(i,j,Z){return Math.min(Z,Math.max(j,i))}function c(AF){var j,i,Z;h=parseFloat(AF[0])/360%360;if(h<0){h++}s=N(C(AF[1]),0,1);l=N(C(AF[2]),0,1);if(s==0){j=i=Z=l}else{var m=l<0.5?l*(1+s):l+s-l*s;var AE=2*l-m;j=A(AE,m,h+1/3);i=A(AE,m,h);Z=A(AE,m,h-1/3)}return"#"+I[Math.floor(j*255)]+I[Math.floor(i*255)]+I[Math.floor(Z*255)]}function A(i,Z,j){if(j<0){j++}if(j>1){j--}if(6*j<1){return i+(Z-i)*6*j}else{if(2*j<1){return Z}else{if(3*j<2){return i+(Z-i)*(2/3-j)*6}else{return i}}}}function Y(Z){var AE,p=1;Z=String(Z);if(Z.charAt(0)=="#"){AE=Z}else{if(/^rgb/.test(Z)){var m=g(Z);var AE="#",AF;for(var j=0;j<3;j++){if(m[j].indexOf("%")!=-1){AF=Math.floor(C(m[j])*255)}else{AF=Number(m[j])}AE+=I[N(AF,0,255)]}p=m[3]}else{if(/^hsl/.test(Z)){var m=g(Z);AE=c(m);p=m[3]}else{AE=B[Z]||Z}}}return{color:AE,alpha:p}}var L={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var f={};function X(Z){if(f[Z]){return f[Z]}var m=document.createElement("div");var j=m.style;try{j.font=Z}catch(i){}return f[Z]={style:j.fontStyle||L.style,variant:j.fontVariant||L.variant,weight:j.fontWeight||L.weight,size:j.fontSize||L.size,family:j.fontFamily||L.family}}function P(j,i){var Z={};for(var AF in j){Z[AF]=j[AF]}var AE=parseFloat(i.currentStyle.fontSize),m=parseFloat(j.size);if(typeof j.size=="number"){Z.size=j.size}else{if(j.size.indexOf("px")!=-1){Z.size=m}else{if(j.size.indexOf("em")!=-1){Z.size=AE*m}else{if(j.size.indexOf("%")!=-1){Z.size=(AE/100)*m}else{if(j.size.indexOf("pt")!=-1){Z.size=m/0.75}else{Z.size=AE}}}}}Z.size*=0.981;return Z}function AA(Z){return Z.style+" "+Z.variant+" "+Z.weight+" "+Z.size+"px "+Z.family}function t(Z){switch(Z){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function W(i){this.m_=V();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=D*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var Z=i.ownerDocument.createElement("div");Z.style.width=i.clientWidth+"px";Z.style.height=i.clientHeight+"px";Z.style.overflow="hidden";Z.style.position="absolute";i.appendChild(Z);this.element_=Z;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var M=W.prototype;M.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};M.beginPath=function(){this.currentPath_=[]};M.moveTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"moveTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.lineTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"lineTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.bezierCurveTo=function(j,i,AI,AH,AG,AE){var Z=this.getCoords_(AG,AE);var AF=this.getCoords_(j,i);var m=this.getCoords_(AI,AH);e(this,AF,m,Z)};function e(Z,m,j,i){Z.currentPath_.push({type:"bezierCurveTo",cp1x:m.x,cp1y:m.y,cp2x:j.x,cp2y:j.y,x:i.x,y:i.y});Z.currentX_=i.x;Z.currentY_=i.y}M.quadraticCurveTo=function(AG,j,i,Z){var AF=this.getCoords_(AG,j);var AE=this.getCoords_(i,Z);var AH={x:this.currentX_+2/3*(AF.x-this.currentX_),y:this.currentY_+2/3*(AF.y-this.currentY_)};var m={x:AH.x+(AE.x-this.currentX_)/3,y:AH.y+(AE.y-this.currentY_)/3};e(this,AH,m,AE)};M.arc=function(AJ,AH,AI,AE,i,j){AI*=D;var AN=j?"at":"wa";var AK=AJ+U(AE)*AI-F;var AM=AH+J(AE)*AI-F;var Z=AJ+U(i)*AI-F;var AL=AH+J(i)*AI-F;if(AK==Z&&!j){AK+=0.125}var m=this.getCoords_(AJ,AH);var AG=this.getCoords_(AK,AM);var AF=this.getCoords_(Z,AL);this.currentPath_.push({type:AN,x:m.x,y:m.y,radius:AI,xStart:AG.x,yStart:AG.y,xEnd:AF.x,yEnd:AF.y})};M.rect=function(j,i,Z,m){this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath()};M.strokeRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.stroke();this.currentPath_=p};M.fillRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.fill();this.currentPath_=p};M.createLinearGradient=function(i,m,Z,j){var p=new v("gradient");p.x0_=i;p.y0_=m;p.x1_=Z;p.y1_=j;return p};M.createRadialGradient=function(m,AE,j,i,p,Z){var AF=new v("gradientradial");AF.x0_=m;AF.y0_=AE;AF.r0_=j;AF.x1_=i;AF.y1_=p;AF.r1_=Z;return AF};M.drawImage=function(AO,j){var AH,AF,AJ,AV,AM,AK,AQ,AX;var AI=AO.runtimeStyle.width;var AN=AO.runtimeStyle.height;AO.runtimeStyle.width="auto";AO.runtimeStyle.height="auto";var AG=AO.width;var AT=AO.height;AO.runtimeStyle.width=AI;AO.runtimeStyle.height=AN;if(arguments.length==3){AH=arguments[1];AF=arguments[2];AM=AK=0;AQ=AJ=AG;AX=AV=AT}else{if(arguments.length==5){AH=arguments[1];AF=arguments[2];AJ=arguments[3];AV=arguments[4];AM=AK=0;AQ=AG;AX=AT}else{if(arguments.length==9){AM=arguments[1];AK=arguments[2];AQ=arguments[3];AX=arguments[4];AH=arguments[5];AF=arguments[6];AJ=arguments[7];AV=arguments[8]}else{throw Error("Invalid number of arguments")}}}var AW=this.getCoords_(AH,AF);var m=AQ/2;var i=AX/2;var AU=[];var Z=10;var AE=10;AU.push(" <g_vml_:group",' coordsize="',D*Z,",",D*AE,'"',' coordorigin="0,0"',' style="width:',Z,"px;height:",AE,"px;position:absolute;");if(this.m_[0][0]!=1||this.m_[0][1]||this.m_[1][1]!=1||this.m_[1][0]){var p=[];p.push("M11=",this.m_[0][0],",","M12=",this.m_[1][0],",","M21=",this.m_[0][1],",","M22=",this.m_[1][1],",","Dx=",K(AW.x/D),",","Dy=",K(AW.y/D),"");var AS=AW;var AR=this.getCoords_(AH+AJ,AF);var AP=this.getCoords_(AH,AF+AV);var AL=this.getCoords_(AH+AJ,AF+AV);AS.x=z.max(AS.x,AR.x,AP.x,AL.x);AS.y=z.max(AS.y,AR.y,AP.y,AL.y);AU.push("padding:0 ",K(AS.x/D),"px ",K(AS.y/D),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",p.join(""),", sizingmethod='clip');")}else{AU.push("top:",K(AW.y/D),"px;left:",K(AW.x/D),"px;")}AU.push(' ">','<g_vml_:image src="',AO.src,'"',' style="width:',D*AJ,"px;"," height:",D*AV,'px"',' cropleft="',AM/AG,'"',' croptop="',AK/AT,'"',' cropright="',(AG-AM-AQ)/AG,'"',' cropbottom="',(AT-AK-AX)/AT,'"'," />","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",AU.join(""))};M.stroke=function(AM){var m=10;var AN=10;var AE=5000;var AG={x:null,y:null};var AL={x:null,y:null};for(var AH=0;AH<this.currentPath_.length;AH+=AE){var AK=[];var AF=false;AK.push("<g_vml_:shape",' filled="',!!AM,'"',' style="position:absolute;width:',m,"px;height:",AN,'px;"',' coordorigin="0,0"',' coordsize="',D*m,",",D*AN,'"',' stroked="',!AM,'"',' path="');var AO=false;for(var AI=AH;AI<Math.min(AH+AE,this.currentPath_.length);AI++){if(AI%AE==0&&AI>0){AK.push(" m ",K(this.currentPath_[AI-1].x),",",K(this.currentPath_[AI-1].y))}var Z=this.currentPath_[AI];var AJ;switch(Z.type){case"moveTo":AJ=Z;AK.push(" m ",K(Z.x),",",K(Z.y));break;case"lineTo":AK.push(" l ",K(Z.x),",",K(Z.y));break;case"close":AK.push(" x ");Z=null;break;case"bezierCurveTo":AK.push(" c ",K(Z.cp1x),",",K(Z.cp1y),",",K(Z.cp2x),",",K(Z.cp2y),",",K(Z.x),",",K(Z.y));break;case"at":case"wa":AK.push(" ",Z.type," ",K(Z.x-this.arcScaleX_*Z.radius),",",K(Z.y-this.arcScaleY_*Z.radius)," ",K(Z.x+this.arcScaleX_*Z.radius),",",K(Z.y+this.arcScaleY_*Z.radius)," ",K(Z.xStart),",",K(Z.yStart)," ",K(Z.xEnd),",",K(Z.yEnd));break}if(Z){if(AG.x==null||Z.x<AG.x){AG.x=Z.x}if(AL.x==null||Z.x>AL.x){AL.x=Z.x}if(AG.y==null||Z.y<AG.y){AG.y=Z.y}if(AL.y==null||Z.y>AL.y){AL.y=Z.y}}}AK.push(' ">');if(!AM){R(this,AK)}else{a(this,AK,AG,AL)}AK.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",AK.join(""))}};function R(j,AE){var i=Y(j.strokeStyle);var m=i.color;var p=i.alpha*j.globalAlpha;var Z=j.lineScale_*j.lineWidth;if(Z<1){p*=Z}AE.push("<g_vml_:stroke",' opacity="',p,'"',' joinstyle="',j.lineJoin,'"',' miterlimit="',j.miterLimit,'"',' endcap="',t(j.lineCap),'"',' weight="',Z,'px"',' color="',m,'" />')}function a(AO,AG,Ah,AP){var AH=AO.fillStyle;var AY=AO.arcScaleX_;var AX=AO.arcScaleY_;var Z=AP.x-Ah.x;var m=AP.y-Ah.y;if(AH instanceof v){var AL=0;var Ac={x:0,y:0};var AU=0;var AK=1;if(AH.type_=="gradient"){var AJ=AH.x0_/AY;var j=AH.y0_/AX;var AI=AH.x1_/AY;var Aj=AH.y1_/AX;var Ag=AO.getCoords_(AJ,j);var Af=AO.getCoords_(AI,Aj);var AE=Af.x-Ag.x;var p=Af.y-Ag.y;AL=Math.atan2(AE,p)*180/Math.PI;if(AL<0){AL+=360}if(AL<0.000001){AL=0}}else{var Ag=AO.getCoords_(AH.x0_,AH.y0_);Ac={x:(Ag.x-Ah.x)/Z,y:(Ag.y-Ah.y)/m};Z/=AY*D;m/=AX*D;var Aa=z.max(Z,m);AU=2*AH.r0_/Aa;AK=2*AH.r1_/Aa-AU}var AS=AH.colors_;AS.sort(function(Ak,i){return Ak.offset-i.offset});var AN=AS.length;var AR=AS[0].color;var AQ=AS[AN-1].color;var AW=AS[0].alpha*AO.globalAlpha;var AV=AS[AN-1].alpha*AO.globalAlpha;var Ab=[];for(var Ae=0;Ae<AN;Ae++){var AM=AS[Ae];Ab.push(AM.offset*AK+AU+" "+AM.color)}AG.push('<g_vml_:fill type="',AH.type_,'"',' method="none" focus="100%"',' color="',AR,'"',' color2="',AQ,'"',' colors="',Ab.join(","),'"',' opacity="',AV,'"',' g_o_:opacity2="',AW,'"',' angle="',AL,'"',' focusposition="',Ac.x,",",Ac.y,'" />')}else{if(AH instanceof u){if(Z&&m){var AF=-Ah.x;var AZ=-Ah.y;AG.push("<g_vml_:fill",' position="',AF/Z*AY*AY,",",AZ/m*AX*AX,'"',' type="tile"',' src="',AH.src_,'" />')}}else{var Ai=Y(AO.fillStyle);var AT=Ai.color;var Ad=Ai.alpha*AO.globalAlpha;AG.push('<g_vml_:fill color="',AT,'" opacity="',Ad,'" />')}}}M.fill=function(){this.stroke(true)};M.closePath=function(){this.currentPath_.push({type:"close"})};M.getCoords_=function(j,i){var Z=this.m_;return{x:D*(j*Z[0][0]+i*Z[1][0]+Z[2][0])-F,y:D*(j*Z[0][1]+i*Z[1][1]+Z[2][1])-F}};M.save=function(){var Z={};Q(this,Z);this.aStack_.push(Z);this.mStack_.push(this.m_);this.m_=d(V(),this.m_)};M.restore=function(){if(this.aStack_.length){Q(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function H(Z){return isFinite(Z[0][0])&&isFinite(Z[0][1])&&isFinite(Z[1][0])&&isFinite(Z[1][1])&&isFinite(Z[2][0])&&isFinite(Z[2][1])}function y(i,Z,j){if(!H(Z)){return }i.m_=Z;if(j){var p=Z[0][0]*Z[1][1]-Z[0][1]*Z[1][0];i.lineScale_=k(b(p))}}M.translate=function(j,i){var Z=[[1,0,0],[0,1,0],[j,i,1]];y(this,d(Z,this.m_),false)};M.rotate=function(i){var m=U(i);var j=J(i);var Z=[[m,j,0],[-j,m,0],[0,0,1]];y(this,d(Z,this.m_),false)};M.scale=function(j,i){this.arcScaleX_*=j;this.arcScaleY_*=i;var Z=[[j,0,0],[0,i,0],[0,0,1]];y(this,d(Z,this.m_),true)};M.transform=function(p,m,AF,AE,i,Z){var j=[[p,m,0],[AF,AE,0],[i,Z,1]];y(this,d(j,this.m_),true)};M.setTransform=function(AE,p,AG,AF,j,i){var Z=[[AE,p,0],[AG,AF,0],[j,i,1]];y(this,Z,true)};M.drawText_=function(AK,AI,AH,AN,AG){var AM=this.m_,AQ=1000,i=0,AP=AQ,AF={x:0,y:0},AE=[];var Z=P(X(this.font),this.element_);var j=AA(Z);var AR=this.element_.currentStyle;var p=this.textAlign.toLowerCase();switch(p){case"left":case"center":case"right":break;case"end":p=AR.direction=="ltr"?"right":"left";break;case"start":p=AR.direction=="rtl"?"right":"left";break;default:p="left"}switch(this.textBaseline){case"hanging":case"top":AF.y=Z.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":AF.y=-Z.size/2.25;break}switch(p){case"right":i=AQ;AP=0.05;break;case"center":i=AP=AQ/2;break}var AO=this.getCoords_(AI+AF.x,AH+AF.y);AE.push('<g_vml_:line from="',-i,' 0" to="',AP,' 0.05" ',' coordsize="100 100" coordorigin="0 0"',' filled="',!AG,'" stroked="',!!AG,'" style="position:absolute;width:1px;height:1px;">');if(AG){R(this,AE)}else{a(this,AE,{x:-i,y:0},{x:AP,y:Z.size})}var AL=AM[0][0].toFixed(3)+","+AM[1][0].toFixed(3)+","+AM[0][1].toFixed(3)+","+AM[1][1].toFixed(3)+",0,0";var AJ=K(AO.x/D)+","+K(AO.y/D);AE.push('<g_vml_:skew on="t" matrix="',AL,'" ',' offset="',AJ,'" origin="',i,' 0" />','<g_vml_:path textpathok="true" />','<g_vml_:textpath on="true" string="',AD(AK),'" style="v-text-align:',p,";font:",AD(j),'" /></g_vml_:line>');this.element_.insertAdjacentHTML("beforeEnd",AE.join(""))};M.fillText=function(j,Z,m,i){this.drawText_(j,Z,m,i,false)};M.strokeText=function(j,Z,m,i){this.drawText_(j,Z,m,i,true)};M.measureText=function(j){if(!this.textMeasureEl_){var Z='<span style="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;"></span>';this.element_.insertAdjacentHTML("beforeEnd",Z);this.textMeasureEl_=this.element_.lastChild}var i=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(i.createTextNode(j));return{width:this.textMeasureEl_.offsetWidth}};M.clip=function(){};M.arcTo=function(){};M.createPattern=function(i,Z){return new u(i,Z)};function v(Z){this.type_=Z;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}v.prototype.addColorStop=function(i,Z){Z=Y(Z);this.colors_.push({offset:i,color:Z.color,alpha:Z.alpha})};function u(i,Z){q(i);switch(Z){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=Z;break;default:n("SYNTAX_ERR")}this.src_=i.src;this.width_=i.width;this.height_=i.height}function n(Z){throw new o(Z)}function q(Z){if(!Z||Z.nodeType!=1||Z.tagName!="IMG"){n("TYPE_MISMATCH_ERR")}if(Z.readyState!="complete"){n("INVALID_STATE_ERR")}}function o(Z){this.code=this[Z];this.message=Z+": DOM Exception "+this.code}var x=o.prototype=new Error;x.INDEX_SIZE_ERR=1;x.DOMSTRING_SIZE_ERR=2;x.HIERARCHY_REQUEST_ERR=3;x.WRONG_DOCUMENT_ERR=4;x.INVALID_CHARACTER_ERR=5;x.NO_DATA_ALLOWED_ERR=6;x.NO_MODIFICATION_ALLOWED_ERR=7;x.NOT_FOUND_ERR=8;x.NOT_SUPPORTED_ERR=9;x.INUSE_ATTRIBUTE_ERR=10;x.INVALID_STATE_ERR=11;x.SYNTAX_ERR=12;x.INVALID_MODIFICATION_ERR=13;x.NAMESPACE_ERR=14;x.INVALID_ACCESS_ERR=15;x.VALIDATION_ERR=16;x.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=E;CanvasRenderingContext2D=W;CanvasGradient=v;CanvasPattern=u;DOMException=o})()}; \ No newline at end of file diff --git a/theme/bootstrap/views/js/New folder/plugins/flot/flot-data.js b/theme/bootstrap/views/js/New folder/plugins/flot/flot-data.js new file mode 100644 index 0000000..b6d68fc --- /dev/null +++ b/theme/bootstrap/views/js/New folder/plugins/flot/flot-data.js @@ -0,0 +1,1244 @@ +// Flot Charts sample data for SB Admin template + +// Flot Line Chart with Tooltips +$(document).ready(function() { + console.log("document ready"); + var offset = 0; + plot(); + + function plot() { + var sin = [], + cos = []; + for (var i = 0; i < 12; i += 0.2) { + sin.push([i, Math.sin(i + offset)]); + cos.push([i, Math.cos(i + offset)]); + } + + var options = { + series: { + lines: { + show: true + }, + points: { + show: true + } + }, + grid: { + hoverable: true //IMPORTANT! this is needed for tooltip to work + }, + yaxis: { + min: -1.2, + max: 1.2 + }, + tooltip: true, + tooltipOpts: { + content: "'%s' of %x.1 is %y.4", + shifts: { + x: -60, + y: 25 + } + } + }; + + var plotObj = $.plot($("#flot-line-chart"), [{ + data: sin, + label: "sin(x)" + }, { + data: cos, + label: "cos(x)" + }], + options); + } +}); + +// Flot Pie Chart with Tooltips +$(function() { + + var data = [{ + label: "Series 0", + data: 1 + }, { + label: "Series 1", + data: 3 + }, { + label: "Series 2", + data: 9 + }, { + label: "Series 3", + data: 20 + }]; + + var plotObj = $.plot($("#flot-pie-chart"), data, { + series: { + pie: { + show: true + } + }, + grid: { + hoverable: true + }, + tooltip: true, + tooltipOpts: { + content: "%p.0%, %s", // show percentages, rounding to 2 decimal places + shifts: { + x: 20, + y: 0 + }, + defaultTheme: false + } + }); + +}); + +// Flot Line Charts - Multiple Axes - With Data +$(function() { + var oilprices = [ + [1167692400000, 61.05], + [1167778800000, 58.32], + [1167865200000, 57.35], + [1167951600000, 56.31], + [1168210800000, 55.55], + [1168297200000, 55.64], + [1168383600000, 54.02], + [1168470000000, 51.88], + [1168556400000, 52.99], + [1168815600000, 52.99], + [1168902000000, 51.21], + [1168988400000, 52.24], + [1169074800000, 50.48], + [1169161200000, 51.99], + [1169420400000, 51.13], + [1169506800000, 55.04], + [1169593200000, 55.37], + [1169679600000, 54.23], + [1169766000000, 55.42], + [1170025200000, 54.01], + [1170111600000, 56.97], + [1170198000000, 58.14], + [1170284400000, 58.14], + [1170370800000, 59.02], + [1170630000000, 58.74], + [1170716400000, 58.88], + [1170802800000, 57.71], + [1170889200000, 59.71], + [1170975600000, 59.89], + [1171234800000, 57.81], + [1171321200000, 59.06], + [1171407600000, 58.00], + [1171494000000, 57.99], + [1171580400000, 59.39], + [1171839600000, 59.39], + [1171926000000, 58.07], + [1172012400000, 60.07], + [1172098800000, 61.14], + [1172444400000, 61.39], + [1172530800000, 61.46], + [1172617200000, 61.79], + [1172703600000, 62.00], + [1172790000000, 60.07], + [1173135600000, 60.69], + [1173222000000, 61.82], + [1173308400000, 60.05], + [1173654000000, 58.91], + [1173740400000, 57.93], + [1173826800000, 58.16], + [1173913200000, 57.55], + [1173999600000, 57.11], + [1174258800000, 56.59], + [1174345200000, 59.61], + [1174518000000, 61.69], + [1174604400000, 62.28], + [1174860000000, 62.91], + [1174946400000, 62.93], + [1175032800000, 64.03], + [1175119200000, 66.03], + [1175205600000, 65.87], + [1175464800000, 64.64], + [1175637600000, 64.38], + [1175724000000, 64.28], + [1175810400000, 64.28], + [1176069600000, 61.51], + [1176156000000, 61.89], + [1176242400000, 62.01], + [1176328800000, 63.85], + [1176415200000, 63.63], + [1176674400000, 63.61], + [1176760800000, 63.10], + [1176847200000, 63.13], + [1176933600000, 61.83], + [1177020000000, 63.38], + [1177279200000, 64.58], + [1177452000000, 65.84], + [1177538400000, 65.06], + [1177624800000, 66.46], + [1177884000000, 64.40], + [1178056800000, 63.68], + [1178143200000, 63.19], + [1178229600000, 61.93], + [1178488800000, 61.47], + [1178575200000, 61.55], + [1178748000000, 61.81], + [1178834400000, 62.37], + [1179093600000, 62.46], + [1179180000000, 63.17], + [1179266400000, 62.55], + [1179352800000, 64.94], + [1179698400000, 66.27], + [1179784800000, 65.50], + [1179871200000, 65.77], + [1179957600000, 64.18], + [1180044000000, 65.20], + [1180389600000, 63.15], + [1180476000000, 63.49], + [1180562400000, 65.08], + [1180908000000, 66.30], + [1180994400000, 65.96], + [1181167200000, 66.93], + [1181253600000, 65.98], + [1181599200000, 65.35], + [1181685600000, 66.26], + [1181858400000, 68.00], + [1182117600000, 69.09], + [1182204000000, 69.10], + [1182290400000, 68.19], + [1182376800000, 68.19], + [1182463200000, 69.14], + [1182722400000, 68.19], + [1182808800000, 67.77], + [1182895200000, 68.97], + [1182981600000, 69.57], + [1183068000000, 70.68], + [1183327200000, 71.09], + [1183413600000, 70.92], + [1183586400000, 71.81], + [1183672800000, 72.81], + [1183932000000, 72.19], + [1184018400000, 72.56], + [1184191200000, 72.50], + [1184277600000, 74.15], + [1184623200000, 75.05], + [1184796000000, 75.92], + [1184882400000, 75.57], + [1185141600000, 74.89], + [1185228000000, 73.56], + [1185314400000, 75.57], + [1185400800000, 74.95], + [1185487200000, 76.83], + [1185832800000, 78.21], + [1185919200000, 76.53], + [1186005600000, 76.86], + [1186092000000, 76.00], + [1186437600000, 71.59], + [1186696800000, 71.47], + [1186956000000, 71.62], + [1187042400000, 71.00], + [1187301600000, 71.98], + [1187560800000, 71.12], + [1187647200000, 69.47], + [1187733600000, 69.26], + [1187820000000, 69.83], + [1187906400000, 71.09], + [1188165600000, 71.73], + [1188338400000, 73.36], + [1188511200000, 74.04], + [1188856800000, 76.30], + [1189116000000, 77.49], + [1189461600000, 78.23], + [1189548000000, 79.91], + [1189634400000, 80.09], + [1189720800000, 79.10], + [1189980000000, 80.57], + [1190066400000, 81.93], + [1190239200000, 83.32], + [1190325600000, 81.62], + [1190584800000, 80.95], + [1190671200000, 79.53], + [1190757600000, 80.30], + [1190844000000, 82.88], + [1190930400000, 81.66], + [1191189600000, 80.24], + [1191276000000, 80.05], + [1191362400000, 79.94], + [1191448800000, 81.44], + [1191535200000, 81.22], + [1191794400000, 79.02], + [1191880800000, 80.26], + [1191967200000, 80.30], + [1192053600000, 83.08], + [1192140000000, 83.69], + [1192399200000, 86.13], + [1192485600000, 87.61], + [1192572000000, 87.40], + [1192658400000, 89.47], + [1192744800000, 88.60], + [1193004000000, 87.56], + [1193090400000, 87.56], + [1193176800000, 87.10], + [1193263200000, 91.86], + [1193612400000, 93.53], + [1193698800000, 94.53], + [1193871600000, 95.93], + [1194217200000, 93.98], + [1194303600000, 96.37], + [1194476400000, 95.46], + [1194562800000, 96.32], + [1195081200000, 93.43], + [1195167600000, 95.10], + [1195426800000, 94.64], + [1195513200000, 95.10], + [1196031600000, 97.70], + [1196118000000, 94.42], + [1196204400000, 90.62], + [1196290800000, 91.01], + [1196377200000, 88.71], + [1196636400000, 88.32], + [1196809200000, 90.23], + [1196982000000, 88.28], + [1197241200000, 87.86], + [1197327600000, 90.02], + [1197414000000, 92.25], + [1197586800000, 90.63], + [1197846000000, 90.63], + [1197932400000, 90.49], + [1198018800000, 91.24], + [1198105200000, 91.06], + [1198191600000, 90.49], + [1198710000000, 96.62], + [1198796400000, 96.00], + [1199142000000, 99.62], + [1199314800000, 99.18], + [1199401200000, 95.09], + [1199660400000, 96.33], + [1199833200000, 95.67], + [1200351600000, 91.90], + [1200438000000, 90.84], + [1200524400000, 90.13], + [1200610800000, 90.57], + [1200956400000, 89.21], + [1201042800000, 86.99], + [1201129200000, 89.85], + [1201474800000, 90.99], + [1201561200000, 91.64], + [1201647600000, 92.33], + [1201734000000, 91.75], + [1202079600000, 90.02], + [1202166000000, 88.41], + [1202252400000, 87.14], + [1202338800000, 88.11], + [1202425200000, 91.77], + [1202770800000, 92.78], + [1202857200000, 93.27], + [1202943600000, 95.46], + [1203030000000, 95.46], + [1203289200000, 101.74], + [1203462000000, 98.81], + [1203894000000, 100.88], + [1204066800000, 99.64], + [1204153200000, 102.59], + [1204239600000, 101.84], + [1204498800000, 99.52], + [1204585200000, 99.52], + [1204671600000, 104.52], + [1204758000000, 105.47], + [1204844400000, 105.15], + [1205103600000, 108.75], + [1205276400000, 109.92], + [1205362800000, 110.33], + [1205449200000, 110.21], + [1205708400000, 105.68], + [1205967600000, 101.84], + [1206313200000, 100.86], + [1206399600000, 101.22], + [1206486000000, 105.90], + [1206572400000, 107.58], + [1206658800000, 105.62], + [1206914400000, 101.58], + [1207000800000, 100.98], + [1207173600000, 103.83], + [1207260000000, 106.23], + [1207605600000, 108.50], + [1207778400000, 110.11], + [1207864800000, 110.14], + [1208210400000, 113.79], + [1208296800000, 114.93], + [1208383200000, 114.86], + [1208728800000, 117.48], + [1208815200000, 118.30], + [1208988000000, 116.06], + [1209074400000, 118.52], + [1209333600000, 118.75], + [1209420000000, 113.46], + [1209592800000, 112.52], + [1210024800000, 121.84], + [1210111200000, 123.53], + [1210197600000, 123.69], + [1210543200000, 124.23], + [1210629600000, 125.80], + [1210716000000, 126.29], + [1211148000000, 127.05], + [1211320800000, 129.07], + [1211493600000, 132.19], + [1211839200000, 128.85], + [1212357600000, 127.76], + [1212703200000, 138.54], + [1212962400000, 136.80], + [1213135200000, 136.38], + [1213308000000, 134.86], + [1213653600000, 134.01], + [1213740000000, 136.68], + [1213912800000, 135.65], + [1214172000000, 134.62], + [1214258400000, 134.62], + [1214344800000, 134.62], + [1214431200000, 139.64], + [1214517600000, 140.21], + [1214776800000, 140.00], + [1214863200000, 140.97], + [1214949600000, 143.57], + [1215036000000, 145.29], + [1215381600000, 141.37], + [1215468000000, 136.04], + [1215727200000, 146.40], + [1215986400000, 145.18], + [1216072800000, 138.74], + [1216159200000, 134.60], + [1216245600000, 129.29], + [1216332000000, 130.65], + [1216677600000, 127.95], + [1216850400000, 127.95], + [1217282400000, 122.19], + [1217455200000, 124.08], + [1217541600000, 125.10], + [1217800800000, 121.41], + [1217887200000, 119.17], + [1217973600000, 118.58], + [1218060000000, 120.02], + [1218405600000, 114.45], + [1218492000000, 113.01], + [1218578400000, 116.00], + [1218751200000, 113.77], + [1219010400000, 112.87], + [1219096800000, 114.53], + [1219269600000, 114.98], + [1219356000000, 114.98], + [1219701600000, 116.27], + [1219788000000, 118.15], + [1219874400000, 115.59], + [1219960800000, 115.46], + [1220306400000, 109.71], + [1220392800000, 109.35], + [1220565600000, 106.23], + [1220824800000, 106.34] + ]; + var exchangerates = [ + [1167606000000, 0.7580], + [1167692400000, 0.7580], + [1167778800000, 0.75470], + [1167865200000, 0.75490], + [1167951600000, 0.76130], + [1168038000000, 0.76550], + [1168124400000, 0.76930], + [1168210800000, 0.76940], + [1168297200000, 0.76880], + [1168383600000, 0.76780], + [1168470000000, 0.77080], + [1168556400000, 0.77270], + [1168642800000, 0.77490], + [1168729200000, 0.77410], + [1168815600000, 0.77410], + [1168902000000, 0.77320], + [1168988400000, 0.77270], + [1169074800000, 0.77370], + [1169161200000, 0.77240], + [1169247600000, 0.77120], + [1169334000000, 0.7720], + [1169420400000, 0.77210], + [1169506800000, 0.77170], + [1169593200000, 0.77040], + [1169679600000, 0.7690], + [1169766000000, 0.77110], + [1169852400000, 0.7740], + [1169938800000, 0.77450], + [1170025200000, 0.77450], + [1170111600000, 0.7740], + [1170198000000, 0.77160], + [1170284400000, 0.77130], + [1170370800000, 0.76780], + [1170457200000, 0.76880], + [1170543600000, 0.77180], + [1170630000000, 0.77180], + [1170716400000, 0.77280], + [1170802800000, 0.77290], + [1170889200000, 0.76980], + [1170975600000, 0.76850], + [1171062000000, 0.76810], + [1171148400000, 0.7690], + [1171234800000, 0.7690], + [1171321200000, 0.76980], + [1171407600000, 0.76990], + [1171494000000, 0.76510], + [1171580400000, 0.76130], + [1171666800000, 0.76160], + [1171753200000, 0.76140], + [1171839600000, 0.76140], + [1171926000000, 0.76070], + [1172012400000, 0.76020], + [1172098800000, 0.76110], + [1172185200000, 0.76220], + [1172271600000, 0.76150], + [1172358000000, 0.75980], + [1172444400000, 0.75980], + [1172530800000, 0.75920], + [1172617200000, 0.75730], + [1172703600000, 0.75660], + [1172790000000, 0.75670], + [1172876400000, 0.75910], + [1172962800000, 0.75820], + [1173049200000, 0.75850], + [1173135600000, 0.76130], + [1173222000000, 0.76310], + [1173308400000, 0.76150], + [1173394800000, 0.760], + [1173481200000, 0.76130], + [1173567600000, 0.76270], + [1173654000000, 0.76270], + [1173740400000, 0.76080], + [1173826800000, 0.75830], + [1173913200000, 0.75750], + [1173999600000, 0.75620], + [1174086000000, 0.7520], + [1174172400000, 0.75120], + [1174258800000, 0.75120], + [1174345200000, 0.75170], + [1174431600000, 0.7520], + [1174518000000, 0.75110], + [1174604400000, 0.7480], + [1174690800000, 0.75090], + [1174777200000, 0.75310], + [1174860000000, 0.75310], + [1174946400000, 0.75270], + [1175032800000, 0.74980], + [1175119200000, 0.74930], + [1175205600000, 0.75040], + [1175292000000, 0.750], + [1175378400000, 0.74910], + [1175464800000, 0.74910], + [1175551200000, 0.74850], + [1175637600000, 0.74840], + [1175724000000, 0.74920], + [1175810400000, 0.74710], + [1175896800000, 0.74590], + [1175983200000, 0.74770], + [1176069600000, 0.74770], + [1176156000000, 0.74830], + [1176242400000, 0.74580], + [1176328800000, 0.74480], + [1176415200000, 0.7430], + [1176501600000, 0.73990], + [1176588000000, 0.73950], + [1176674400000, 0.73950], + [1176760800000, 0.73780], + [1176847200000, 0.73820], + [1176933600000, 0.73620], + [1177020000000, 0.73550], + [1177106400000, 0.73480], + [1177192800000, 0.73610], + [1177279200000, 0.73610], + [1177365600000, 0.73650], + [1177452000000, 0.73620], + [1177538400000, 0.73310], + [1177624800000, 0.73390], + [1177711200000, 0.73440], + [1177797600000, 0.73270], + [1177884000000, 0.73270], + [1177970400000, 0.73360], + [1178056800000, 0.73330], + [1178143200000, 0.73590], + [1178229600000, 0.73590], + [1178316000000, 0.73720], + [1178402400000, 0.7360], + [1178488800000, 0.7360], + [1178575200000, 0.7350], + [1178661600000, 0.73650], + [1178748000000, 0.73840], + [1178834400000, 0.73950], + [1178920800000, 0.74130], + [1179007200000, 0.73970], + [1179093600000, 0.73960], + [1179180000000, 0.73850], + [1179266400000, 0.73780], + [1179352800000, 0.73660], + [1179439200000, 0.740], + [1179525600000, 0.74110], + [1179612000000, 0.74060], + [1179698400000, 0.74050], + [1179784800000, 0.74140], + [1179871200000, 0.74310], + [1179957600000, 0.74310], + [1180044000000, 0.74380], + [1180130400000, 0.74430], + [1180216800000, 0.74430], + [1180303200000, 0.74430], + [1180389600000, 0.74340], + [1180476000000, 0.74290], + [1180562400000, 0.74420], + [1180648800000, 0.7440], + [1180735200000, 0.74390], + [1180821600000, 0.74370], + [1180908000000, 0.74370], + [1180994400000, 0.74290], + [1181080800000, 0.74030], + [1181167200000, 0.73990], + [1181253600000, 0.74180], + [1181340000000, 0.74680], + [1181426400000, 0.7480], + [1181512800000, 0.7480], + [1181599200000, 0.7490], + [1181685600000, 0.74940], + [1181772000000, 0.75220], + [1181858400000, 0.75150], + [1181944800000, 0.75020], + [1182031200000, 0.74720], + [1182117600000, 0.74720], + [1182204000000, 0.74620], + [1182290400000, 0.74550], + [1182376800000, 0.74490], + [1182463200000, 0.74670], + [1182549600000, 0.74580], + [1182636000000, 0.74270], + [1182722400000, 0.74270], + [1182808800000, 0.7430], + [1182895200000, 0.74290], + [1182981600000, 0.7440], + [1183068000000, 0.7430], + [1183154400000, 0.74220], + [1183240800000, 0.73880], + [1183327200000, 0.73880], + [1183413600000, 0.73690], + [1183500000000, 0.73450], + [1183586400000, 0.73450], + [1183672800000, 0.73450], + [1183759200000, 0.73520], + [1183845600000, 0.73410], + [1183932000000, 0.73410], + [1184018400000, 0.7340], + [1184104800000, 0.73240], + [1184191200000, 0.72720], + [1184277600000, 0.72640], + [1184364000000, 0.72550], + [1184450400000, 0.72580], + [1184536800000, 0.72580], + [1184623200000, 0.72560], + [1184709600000, 0.72570], + [1184796000000, 0.72470], + [1184882400000, 0.72430], + [1184968800000, 0.72440], + [1185055200000, 0.72350], + [1185141600000, 0.72350], + [1185228000000, 0.72350], + [1185314400000, 0.72350], + [1185400800000, 0.72620], + [1185487200000, 0.72880], + [1185573600000, 0.73010], + [1185660000000, 0.73370], + [1185746400000, 0.73370], + [1185832800000, 0.73240], + [1185919200000, 0.72970], + [1186005600000, 0.73170], + [1186092000000, 0.73150], + [1186178400000, 0.72880], + [1186264800000, 0.72630], + [1186351200000, 0.72630], + [1186437600000, 0.72420], + [1186524000000, 0.72530], + [1186610400000, 0.72640], + [1186696800000, 0.7270], + [1186783200000, 0.73120], + [1186869600000, 0.73050], + [1186956000000, 0.73050], + [1187042400000, 0.73180], + [1187128800000, 0.73580], + [1187215200000, 0.74090], + [1187301600000, 0.74540], + [1187388000000, 0.74370], + [1187474400000, 0.74240], + [1187560800000, 0.74240], + [1187647200000, 0.74150], + [1187733600000, 0.74190], + [1187820000000, 0.74140], + [1187906400000, 0.73770], + [1187992800000, 0.73550], + [1188079200000, 0.73150], + [1188165600000, 0.73150], + [1188252000000, 0.7320], + [1188338400000, 0.73320], + [1188424800000, 0.73460], + [1188511200000, 0.73280], + [1188597600000, 0.73230], + [1188684000000, 0.7340], + [1188770400000, 0.7340], + [1188856800000, 0.73360], + [1188943200000, 0.73510], + [1189029600000, 0.73460], + [1189116000000, 0.73210], + [1189202400000, 0.72940], + [1189288800000, 0.72660], + [1189375200000, 0.72660], + [1189461600000, 0.72540], + [1189548000000, 0.72420], + [1189634400000, 0.72130], + [1189720800000, 0.71970], + [1189807200000, 0.72090], + [1189893600000, 0.7210], + [1189980000000, 0.7210], + [1190066400000, 0.7210], + [1190152800000, 0.72090], + [1190239200000, 0.71590], + [1190325600000, 0.71330], + [1190412000000, 0.71050], + [1190498400000, 0.70990], + [1190584800000, 0.70990], + [1190671200000, 0.70930], + [1190757600000, 0.70930], + [1190844000000, 0.70760], + [1190930400000, 0.7070], + [1191016800000, 0.70490], + [1191103200000, 0.70120], + [1191189600000, 0.70110], + [1191276000000, 0.70190], + [1191362400000, 0.70460], + [1191448800000, 0.70630], + [1191535200000, 0.70890], + [1191621600000, 0.70770], + [1191708000000, 0.70770], + [1191794400000, 0.70770], + [1191880800000, 0.70910], + [1191967200000, 0.71180], + [1192053600000, 0.70790], + [1192140000000, 0.70530], + [1192226400000, 0.7050], + [1192312800000, 0.70550], + [1192399200000, 0.70550], + [1192485600000, 0.70450], + [1192572000000, 0.70510], + [1192658400000, 0.70510], + [1192744800000, 0.70170], + [1192831200000, 0.70], + [1192917600000, 0.69950], + [1193004000000, 0.69940], + [1193090400000, 0.70140], + [1193176800000, 0.70360], + [1193263200000, 0.70210], + [1193349600000, 0.70020], + [1193436000000, 0.69670], + [1193522400000, 0.6950], + [1193612400000, 0.6950], + [1193698800000, 0.69390], + [1193785200000, 0.6940], + [1193871600000, 0.69220], + [1193958000000, 0.69190], + [1194044400000, 0.69140], + [1194130800000, 0.68940], + [1194217200000, 0.68910], + [1194303600000, 0.69040], + [1194390000000, 0.6890], + [1194476400000, 0.68340], + [1194562800000, 0.68230], + [1194649200000, 0.68070], + [1194735600000, 0.68150], + [1194822000000, 0.68150], + [1194908400000, 0.68470], + [1194994800000, 0.68590], + [1195081200000, 0.68220], + [1195167600000, 0.68270], + [1195254000000, 0.68370], + [1195340400000, 0.68230], + [1195426800000, 0.68220], + [1195513200000, 0.68220], + [1195599600000, 0.67920], + [1195686000000, 0.67460], + [1195772400000, 0.67350], + [1195858800000, 0.67310], + [1195945200000, 0.67420], + [1196031600000, 0.67440], + [1196118000000, 0.67390], + [1196204400000, 0.67310], + [1196290800000, 0.67610], + [1196377200000, 0.67610], + [1196463600000, 0.67850], + [1196550000000, 0.68180], + [1196636400000, 0.68360], + [1196722800000, 0.68230], + [1196809200000, 0.68050], + [1196895600000, 0.67930], + [1196982000000, 0.68490], + [1197068400000, 0.68330], + [1197154800000, 0.68250], + [1197241200000, 0.68250], + [1197327600000, 0.68160], + [1197414000000, 0.67990], + [1197500400000, 0.68130], + [1197586800000, 0.68090], + [1197673200000, 0.68680], + [1197759600000, 0.69330], + [1197846000000, 0.69330], + [1197932400000, 0.69450], + [1198018800000, 0.69440], + [1198105200000, 0.69460], + [1198191600000, 0.69640], + [1198278000000, 0.69650], + [1198364400000, 0.69560], + [1198450800000, 0.69560], + [1198537200000, 0.6950], + [1198623600000, 0.69480], + [1198710000000, 0.69280], + [1198796400000, 0.68870], + [1198882800000, 0.68240], + [1198969200000, 0.67940], + [1199055600000, 0.67940], + [1199142000000, 0.68030], + [1199228400000, 0.68550], + [1199314800000, 0.68240], + [1199401200000, 0.67910], + [1199487600000, 0.67830], + [1199574000000, 0.67850], + [1199660400000, 0.67850], + [1199746800000, 0.67970], + [1199833200000, 0.680], + [1199919600000, 0.68030], + [1200006000000, 0.68050], + [1200092400000, 0.6760], + [1200178800000, 0.6770], + [1200265200000, 0.6770], + [1200351600000, 0.67360], + [1200438000000, 0.67260], + [1200524400000, 0.67640], + [1200610800000, 0.68210], + [1200697200000, 0.68310], + [1200783600000, 0.68420], + [1200870000000, 0.68420], + [1200956400000, 0.68870], + [1201042800000, 0.69030], + [1201129200000, 0.68480], + [1201215600000, 0.68240], + [1201302000000, 0.67880], + [1201388400000, 0.68140], + [1201474800000, 0.68140], + [1201561200000, 0.67970], + [1201647600000, 0.67690], + [1201734000000, 0.67650], + [1201820400000, 0.67330], + [1201906800000, 0.67290], + [1201993200000, 0.67580], + [1202079600000, 0.67580], + [1202166000000, 0.6750], + [1202252400000, 0.6780], + [1202338800000, 0.68330], + [1202425200000, 0.68560], + [1202511600000, 0.69030], + [1202598000000, 0.68960], + [1202684400000, 0.68960], + [1202770800000, 0.68820], + [1202857200000, 0.68790], + [1202943600000, 0.68620], + [1203030000000, 0.68520], + [1203116400000, 0.68230], + [1203202800000, 0.68130], + [1203289200000, 0.68130], + [1203375600000, 0.68220], + [1203462000000, 0.68020], + [1203548400000, 0.68020], + [1203634800000, 0.67840], + [1203721200000, 0.67480], + [1203807600000, 0.67470], + [1203894000000, 0.67470], + [1203980400000, 0.67480], + [1204066800000, 0.67330], + [1204153200000, 0.6650], + [1204239600000, 0.66110], + [1204326000000, 0.65830], + [1204412400000, 0.6590], + [1204498800000, 0.6590], + [1204585200000, 0.65810], + [1204671600000, 0.65780], + [1204758000000, 0.65740], + [1204844400000, 0.65320], + [1204930800000, 0.65020], + [1205017200000, 0.65140], + [1205103600000, 0.65140], + [1205190000000, 0.65070], + [1205276400000, 0.6510], + [1205362800000, 0.64890], + [1205449200000, 0.64240], + [1205535600000, 0.64060], + [1205622000000, 0.63820], + [1205708400000, 0.63820], + [1205794800000, 0.63410], + [1205881200000, 0.63440], + [1205967600000, 0.63780], + [1206054000000, 0.64390], + [1206140400000, 0.64780], + [1206226800000, 0.64810], + [1206313200000, 0.64810], + [1206399600000, 0.64940], + [1206486000000, 0.64380], + [1206572400000, 0.63770], + [1206658800000, 0.63290], + [1206745200000, 0.63360], + [1206831600000, 0.63330], + [1206914400000, 0.63330], + [1207000800000, 0.6330], + [1207087200000, 0.63710], + [1207173600000, 0.64030], + [1207260000000, 0.63960], + [1207346400000, 0.63640], + [1207432800000, 0.63560], + [1207519200000, 0.63560], + [1207605600000, 0.63680], + [1207692000000, 0.63570], + [1207778400000, 0.63540], + [1207864800000, 0.6320], + [1207951200000, 0.63320], + [1208037600000, 0.63280], + [1208124000000, 0.63310], + [1208210400000, 0.63420], + [1208296800000, 0.63210], + [1208383200000, 0.63020], + [1208469600000, 0.62780], + [1208556000000, 0.63080], + [1208642400000, 0.63240], + [1208728800000, 0.63240], + [1208815200000, 0.63070], + [1208901600000, 0.62770], + [1208988000000, 0.62690], + [1209074400000, 0.63350], + [1209160800000, 0.63920], + [1209247200000, 0.640], + [1209333600000, 0.64010], + [1209420000000, 0.63960], + [1209506400000, 0.64070], + [1209592800000, 0.64230], + [1209679200000, 0.64290], + [1209765600000, 0.64720], + [1209852000000, 0.64850], + [1209938400000, 0.64860], + [1210024800000, 0.64670], + [1210111200000, 0.64440], + [1210197600000, 0.64670], + [1210284000000, 0.65090], + [1210370400000, 0.64780], + [1210456800000, 0.64610], + [1210543200000, 0.64610], + [1210629600000, 0.64680], + [1210716000000, 0.64490], + [1210802400000, 0.6470], + [1210888800000, 0.64610], + [1210975200000, 0.64520], + [1211061600000, 0.64220], + [1211148000000, 0.64220], + [1211234400000, 0.64250], + [1211320800000, 0.64140], + [1211407200000, 0.63660], + [1211493600000, 0.63460], + [1211580000000, 0.6350], + [1211666400000, 0.63460], + [1211752800000, 0.63460], + [1211839200000, 0.63430], + [1211925600000, 0.63460], + [1212012000000, 0.63790], + [1212098400000, 0.64160], + [1212184800000, 0.64420], + [1212271200000, 0.64310], + [1212357600000, 0.64310], + [1212444000000, 0.64350], + [1212530400000, 0.6440], + [1212616800000, 0.64730], + [1212703200000, 0.64690], + [1212789600000, 0.63860], + [1212876000000, 0.63560], + [1212962400000, 0.6340], + [1213048800000, 0.63460], + [1213135200000, 0.6430], + [1213221600000, 0.64520], + [1213308000000, 0.64670], + [1213394400000, 0.65060], + [1213480800000, 0.65040], + [1213567200000, 0.65030], + [1213653600000, 0.64810], + [1213740000000, 0.64510], + [1213826400000, 0.6450], + [1213912800000, 0.64410], + [1213999200000, 0.64140], + [1214085600000, 0.64090], + [1214172000000, 0.64090], + [1214258400000, 0.64280], + [1214344800000, 0.64310], + [1214431200000, 0.64180], + [1214517600000, 0.63710], + [1214604000000, 0.63490], + [1214690400000, 0.63330], + [1214776800000, 0.63340], + [1214863200000, 0.63380], + [1214949600000, 0.63420], + [1215036000000, 0.6320], + [1215122400000, 0.63180], + [1215208800000, 0.6370], + [1215295200000, 0.63680], + [1215381600000, 0.63680], + [1215468000000, 0.63830], + [1215554400000, 0.63710], + [1215640800000, 0.63710], + [1215727200000, 0.63550], + [1215813600000, 0.6320], + [1215900000000, 0.62770], + [1215986400000, 0.62760], + [1216072800000, 0.62910], + [1216159200000, 0.62740], + [1216245600000, 0.62930], + [1216332000000, 0.63110], + [1216418400000, 0.6310], + [1216504800000, 0.63120], + [1216591200000, 0.63120], + [1216677600000, 0.63040], + [1216764000000, 0.62940], + [1216850400000, 0.63480], + [1216936800000, 0.63780], + [1217023200000, 0.63680], + [1217109600000, 0.63680], + [1217196000000, 0.63680], + [1217282400000, 0.6360], + [1217368800000, 0.6370], + [1217455200000, 0.64180], + [1217541600000, 0.64110], + [1217628000000, 0.64350], + [1217714400000, 0.64270], + [1217800800000, 0.64270], + [1217887200000, 0.64190], + [1217973600000, 0.64460], + [1218060000000, 0.64680], + [1218146400000, 0.64870], + [1218232800000, 0.65940], + [1218319200000, 0.66660], + [1218405600000, 0.66660], + [1218492000000, 0.66780], + [1218578400000, 0.67120], + [1218664800000, 0.67050], + [1218751200000, 0.67180], + [1218837600000, 0.67840], + [1218924000000, 0.68110], + [1219010400000, 0.68110], + [1219096800000, 0.67940], + [1219183200000, 0.68040], + [1219269600000, 0.67810], + [1219356000000, 0.67560], + [1219442400000, 0.67350], + [1219528800000, 0.67630], + [1219615200000, 0.67620], + [1219701600000, 0.67770], + [1219788000000, 0.68150], + [1219874400000, 0.68020], + [1219960800000, 0.6780], + [1220047200000, 0.67960], + [1220133600000, 0.68170], + [1220220000000, 0.68170], + [1220306400000, 0.68320], + [1220392800000, 0.68770], + [1220479200000, 0.69120], + [1220565600000, 0.69140], + [1220652000000, 0.70090], + [1220738400000, 0.70120], + [1220824800000, 0.7010], + [1220911200000, 0.70050] + ]; + + function euroFormatter(v, axis) { + return v.toFixed(axis.tickDecimals) + "€"; + } + + function doPlot(position) { + $.plot($("#flot-multiple-axes-chart"), [{ + data: oilprices, + label: "Oil price ($)" + }, { + data: exchangerates, + label: "USD/EUR exchange rate", + yaxis: 2 + }], { + xaxes: [{ + mode: 'time' + }], + yaxes: [{ + min: 0 + }, { + // align if we are to the right + alignTicksWithAxis: position == "right" ? 1 : null, + position: position, + tickFormatter: euroFormatter + }], + legend: { + position: 'sw' + }, + grid: { + hoverable: true //IMPORTANT! this is needed for tooltip to work + }, + tooltip: true, + tooltipOpts: { + content: "%s for %x was %y", + xDateFormat: "%y-%0m-%0d", + + onHover: function(flotItem, $tooltipEl) { + // console.log(flotItem, $tooltipEl); + } + } + + }); + } + + doPlot("right"); + + $("button").click(function() { + doPlot($(this).text()); + }); +}); + +// Flot Chart Dynamic Chart + +$(function() { + + var container = $("#flot-moving-line-chart"); + + // Determine how many data points to keep based on the placeholder's initial size; + // this gives us a nice high-res plot while avoiding more than one point per pixel. + + var maximum = container.outerWidth() / 2 || 300; + + // + + var data = []; + + function getRandomData() { + + if (data.length) { + data = data.slice(1); + } + + while (data.length < maximum) { + var previous = data.length ? data[data.length - 1] : 50; + var y = previous + Math.random() * 10 - 5; + data.push(y < 0 ? 0 : y > 100 ? 100 : y); + } + + // zip the generated y values with the x values + + var res = []; + for (var i = 0; i < data.length; ++i) { + res.push([i, data[i]]) + } + + return res; + } + + // + + series = [{ + data: getRandomData(), + lines: { + fill: true + } + }]; + + // + + var plot = $.plot(container, series, { + grid: { + borderWidth: 1, + minBorderMargin: 20, + labelMargin: 10, + backgroundColor: { + colors: ["#fff", "#e4f4f4"] + }, + margin: { + top: 8, + bottom: 20, + left: 20 + }, + markings: function(axes) { + var markings = []; + var xaxis = axes.xaxis; + for (var x = Math.floor(xaxis.min); x < xaxis.max; x += xaxis.tickSize * 2) { + markings.push({ + xaxis: { + from: x, + to: x + xaxis.tickSize + }, + color: "rgba(232, 232, 255, 0.2)" + }); + } + return markings; + } + }, + xaxis: { + tickFormatter: function() { + return ""; + } + }, + yaxis: { + min: 0, + max: 110 + }, + legend: { + show: true + } + }); + + // Update the random dataset at 25FPS for a smoothly-animating chart + + setInterval(function updateRandom() { + series[0].data = getRandomData(); + plot.setData(series); + plot.draw(); + }, 40); + +}); + +// Flot Chart Bar Graph + +$(function() { + + var barOptions = { + series: { + bars: { + show: true, + barWidth: 43200000 + } + }, + xaxis: { + mode: "time", + timeformat: "%m/%d", + minTickSize: [1, "day"] + }, + grid: { + hoverable: true + }, + legend: { + show: false + }, + tooltip: true, + tooltipOpts: { + content: "x: %x, y: %y" + } + }; + var barData = { + label: "bar", + data: [ + [1354521600000, 1000], + [1355040000000, 2000], + [1355223600000, 3000], + [1355306400000, 4000], + [1355487300000, 5000], + [1355571900000, 6000] + ] + }; + $.plot($("#flot-bar-chart"), [barData], barOptions); + +}); diff --git a/theme/bootstrap/views/js/New folder/plugins/flot/jquery.flot.js b/theme/bootstrap/views/js/New folder/plugins/flot/jquery.flot.js new file mode 100644 index 0000000..aabc544 --- /dev/null +++ b/theme/bootstrap/views/js/New folder/plugins/flot/jquery.flot.js @@ -0,0 +1,2599 @@ +/*! Javascript plotting library for jQuery, v. 0.7. + * + * Released under the MIT license by IOLA, December 2007. + * + */ + +// first an inline dependency, jquery.colorhelpers.js, we inline it here +// for convenience + +/* Plugin for jQuery for working with colors. + * + * Version 1.1. + * + * Inspiration from jQuery color animation plugin by John Resig. + * + * Released under the MIT license by Ole Laursen, October 2009. + * + * Examples: + * + * $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString() + * var c = $.color.extract($("#mydiv"), 'background-color'); + * console.log(c.r, c.g, c.b, c.a); + * $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)" + * + * Note that .scale() and .add() return the same modified object + * instead of making a new one. + * + * V. 1.1: Fix error handling so e.g. parsing an empty string does + * produce a color rather than just crashing. + */ +(function(B){B.color={};B.color.make=function(F,E,C,D){var G={};G.r=F||0;G.g=E||0;G.b=C||0;G.a=D!=null?D:1;G.add=function(J,I){for(var H=0;H<J.length;++H){G[J.charAt(H)]+=I}return G.normalize()};G.scale=function(J,I){for(var H=0;H<J.length;++H){G[J.charAt(H)]*=I}return G.normalize()};G.toString=function(){if(G.a>=1){return"rgb("+[G.r,G.g,G.b].join(",")+")"}else{return"rgba("+[G.r,G.g,G.b,G.a].join(",")+")"}};G.normalize=function(){function H(J,K,I){return K<J?J:(K>I?I:K)}G.r=H(0,parseInt(G.r),255);G.g=H(0,parseInt(G.g),255);G.b=H(0,parseInt(G.b),255);G.a=H(0,G.a,1);return G};G.clone=function(){return B.color.make(G.r,G.b,G.g,G.a)};return G.normalize()};B.color.extract=function(D,C){var E;do{E=D.css(C).toLowerCase();if(E!=""&&E!="transparent"){break}D=D.parent()}while(!B.nodeName(D.get(0),"body"));if(E=="rgba(0, 0, 0, 0)"){E="transparent"}return B.color.parse(E)};B.color.parse=function(F){var E,C=B.color.make;if(E=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10))}if(E=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10),parseFloat(E[4]))}if(E=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55)}if(E=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55,parseFloat(E[4]))}if(E=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(F)){return C(parseInt(E[1],16),parseInt(E[2],16),parseInt(E[3],16))}if(E=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(F)){return C(parseInt(E[1]+E[1],16),parseInt(E[2]+E[2],16),parseInt(E[3]+E[3],16))}var D=B.trim(F).toLowerCase();if(D=="transparent"){return C(255,255,255,0)}else{E=A[D]||[0,0,0];return C(E[0],E[1],E[2])}};var A={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery); + +// the actual Flot code +(function($) { + function Plot(placeholder, data_, options_, plugins) { + // data is on the form: + // [ series1, series2 ... ] + // where series is either just the data as [ [x1, y1], [x2, y2], ... ] + // or { data: [ [x1, y1], [x2, y2], ... ], label: "some label", ... } + + var series = [], + options = { + // the color theme used for graphs + colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"], + legend: { + show: true, + noColumns: 1, // number of colums in legend table + labelFormatter: null, // fn: string -> string + labelBoxBorderColor: "#ccc", // border color for the little label boxes + container: null, // container (as jQuery object) to put legend in, null means default on top of graph + position: "ne", // position of default legend container within plot + margin: 5, // distance from grid edge to default legend container within plot + backgroundColor: null, // null means auto-detect + backgroundOpacity: 0.85 // set to 0 to avoid background + }, + xaxis: { + show: null, // null = auto-detect, true = always, false = never + position: "bottom", // or "top" + mode: null, // null or "time" + color: null, // base color, labels, ticks + tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)" + transform: null, // null or f: number -> number to transform axis + inverseTransform: null, // if transform is set, this should be the inverse function + min: null, // min. value to show, null means set automatically + max: null, // max. value to show, null means set automatically + autoscaleMargin: null, // margin in % to add if auto-setting min/max + ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks + tickFormatter: null, // fn: number -> string + labelWidth: null, // size of tick labels in pixels + labelHeight: null, + reserveSpace: null, // whether to reserve space even if axis isn't shown + tickLength: null, // size in pixels of ticks, or "full" for whole line + alignTicksWithAxis: null, // axis number or null for no sync + + // mode specific options + tickDecimals: null, // no. of decimals, null means auto + tickSize: null, // number or [number, "unit"] + minTickSize: null, // number or [number, "unit"] + monthNames: null, // list of names of months + timeformat: null, // format string to use + twelveHourClock: false // 12 or 24 time in time mode + }, + yaxis: { + autoscaleMargin: 0.02, + position: "left" // or "right" + }, + xaxes: [], + yaxes: [], + series: { + points: { + show: false, + radius: 3, + lineWidth: 2, // in pixels + fill: true, + fillColor: "#ffffff", + symbol: "circle" // or callback + }, + lines: { + // we don't put in show: false so we can see + // whether lines were actively disabled + lineWidth: 2, // in pixels + fill: false, + fillColor: null, + steps: false + }, + bars: { + show: false, + lineWidth: 2, // in pixels + barWidth: 1, // in units of the x axis + fill: true, + fillColor: null, + align: "left", // or "center" + horizontal: false + }, + shadowSize: 3 + }, + grid: { + show: true, + aboveData: false, + color: "#545454", // primary color used for outline and labels + backgroundColor: null, // null for transparent, else color + borderColor: null, // set if different from the grid color + tickColor: null, // color for the ticks, e.g. "rgba(0,0,0,0.15)" + labelMargin: 5, // in pixels + axisMargin: 8, // in pixels + borderWidth: 2, // in pixels + minBorderMargin: null, // in pixels, null means taken from points radius + markings: null, // array of ranges or fn: axes -> array of ranges + markingsColor: "#f4f4f4", + markingsLineWidth: 2, + // interactive stuff + clickable: false, + hoverable: false, + autoHighlight: true, // highlight in case mouse is near + mouseActiveRadius: 10 // how far the mouse can be away to activate an item + }, + hooks: {} + }, + canvas = null, // the canvas for the plot itself + overlay = null, // canvas for interactive stuff on top of plot + eventHolder = null, // jQuery object that events should be bound to + ctx = null, octx = null, + xaxes = [], yaxes = [], + plotOffset = { left: 0, right: 0, top: 0, bottom: 0}, + canvasWidth = 0, canvasHeight = 0, + plotWidth = 0, plotHeight = 0, + hooks = { + processOptions: [], + processRawData: [], + processDatapoints: [], + drawSeries: [], + draw: [], + bindEvents: [], + drawOverlay: [], + shutdown: [] + }, + plot = this; + + // public functions + plot.setData = setData; + plot.setupGrid = setupGrid; + plot.draw = draw; + plot.getPlaceholder = function() { return placeholder; }; + plot.getCanvas = function() { return canvas; }; + plot.getPlotOffset = function() { return plotOffset; }; + plot.width = function () { return plotWidth; }; + plot.height = function () { return plotHeight; }; + plot.offset = function () { + var o = eventHolder.offset(); + o.left += plotOffset.left; + o.top += plotOffset.top; + return o; + }; + plot.getData = function () { return series; }; + plot.getAxes = function () { + var res = {}, i; + $.each(xaxes.concat(yaxes), function (_, axis) { + if (axis) + res[axis.direction + (axis.n != 1 ? axis.n : "") + "axis"] = axis; + }); + return res; + }; + plot.getXAxes = function () { return xaxes; }; + plot.getYAxes = function () { return yaxes; }; + plot.c2p = canvasToAxisCoords; + plot.p2c = axisToCanvasCoords; + plot.getOptions = function () { return options; }; + plot.highlight = highlight; + plot.unhighlight = unhighlight; + plot.triggerRedrawOverlay = triggerRedrawOverlay; + plot.pointOffset = function(point) { + return { + left: parseInt(xaxes[axisNumber(point, "x") - 1].p2c(+point.x) + plotOffset.left), + top: parseInt(yaxes[axisNumber(point, "y") - 1].p2c(+point.y) + plotOffset.top) + }; + }; + plot.shutdown = shutdown; + plot.resize = function () { + getCanvasDimensions(); + resizeCanvas(canvas); + resizeCanvas(overlay); + }; + + // public attributes + plot.hooks = hooks; + + // initialize + initPlugins(plot); + parseOptions(options_); + setupCanvases(); + setData(data_); + setupGrid(); + draw(); + bindEvents(); + + + function executeHooks(hook, args) { + args = [plot].concat(args); + for (var i = 0; i < hook.length; ++i) + hook[i].apply(this, args); + } + + function initPlugins() { + for (var i = 0; i < plugins.length; ++i) { + var p = plugins[i]; + p.init(plot); + if (p.options) + $.extend(true, options, p.options); + } + } + + function parseOptions(opts) { + var i; + + $.extend(true, options, opts); + + if (options.xaxis.color == null) + options.xaxis.color = options.grid.color; + if (options.yaxis.color == null) + options.yaxis.color = options.grid.color; + + if (options.xaxis.tickColor == null) // backwards-compatibility + options.xaxis.tickColor = options.grid.tickColor; + if (options.yaxis.tickColor == null) // backwards-compatibility + options.yaxis.tickColor = options.grid.tickColor; + + if (options.grid.borderColor == null) + options.grid.borderColor = options.grid.color; + if (options.grid.tickColor == null) + options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString(); + + // fill in defaults in axes, copy at least always the + // first as the rest of the code assumes it'll be there + for (i = 0; i < Math.max(1, options.xaxes.length); ++i) + options.xaxes[i] = $.extend(true, {}, options.xaxis, options.xaxes[i]); + for (i = 0; i < Math.max(1, options.yaxes.length); ++i) + options.yaxes[i] = $.extend(true, {}, options.yaxis, options.yaxes[i]); + + // backwards compatibility, to be removed in future + if (options.xaxis.noTicks && options.xaxis.ticks == null) + options.xaxis.ticks = options.xaxis.noTicks; + if (options.yaxis.noTicks && options.yaxis.ticks == null) + options.yaxis.ticks = options.yaxis.noTicks; + if (options.x2axis) { + options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis); + options.xaxes[1].position = "top"; + } + if (options.y2axis) { + options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis); + options.yaxes[1].position = "right"; + } + if (options.grid.coloredAreas) + options.grid.markings = options.grid.coloredAreas; + if (options.grid.coloredAreasColor) + options.grid.markingsColor = options.grid.coloredAreasColor; + if (options.lines) + $.extend(true, options.series.lines, options.lines); + if (options.points) + $.extend(true, options.series.points, options.points); + if (options.bars) + $.extend(true, options.series.bars, options.bars); + if (options.shadowSize != null) + options.series.shadowSize = options.shadowSize; + + // save options on axes for future reference + for (i = 0; i < options.xaxes.length; ++i) + getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i]; + for (i = 0; i < options.yaxes.length; ++i) + getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i]; + + // add hooks from options + for (var n in hooks) + if (options.hooks[n] && options.hooks[n].length) + hooks[n] = hooks[n].concat(options.hooks[n]); + + executeHooks(hooks.processOptions, [options]); + } + + function setData(d) { + series = parseData(d); + fillInSeriesOptions(); + processData(); + } + + function parseData(d) { + var res = []; + for (var i = 0; i < d.length; ++i) { + var s = $.extend(true, {}, options.series); + + if (d[i].data != null) { + s.data = d[i].data; // move the data instead of deep-copy + delete d[i].data; + + $.extend(true, s, d[i]); + + d[i].data = s.data; + } + else + s.data = d[i]; + res.push(s); + } + + return res; + } + + function axisNumber(obj, coord) { + var a = obj[coord + "axis"]; + if (typeof a == "object") // if we got a real axis, extract number + a = a.n; + if (typeof a != "number") + a = 1; // default to first axis + return a; + } + + function allAxes() { + // return flat array without annoying null entries + return $.grep(xaxes.concat(yaxes), function (a) { return a; }); + } + + function canvasToAxisCoords(pos) { + // return an object with x/y corresponding to all used axes + var res = {}, i, axis; + for (i = 0; i < xaxes.length; ++i) { + axis = xaxes[i]; + if (axis && axis.used) + res["x" + axis.n] = axis.c2p(pos.left); + } + + for (i = 0; i < yaxes.length; ++i) { + axis = yaxes[i]; + if (axis && axis.used) + res["y" + axis.n] = axis.c2p(pos.top); + } + + if (res.x1 !== undefined) + res.x = res.x1; + if (res.y1 !== undefined) + res.y = res.y1; + + return res; + } + + function axisToCanvasCoords(pos) { + // get canvas coords from the first pair of x/y found in pos + var res = {}, i, axis, key; + + for (i = 0; i < xaxes.length; ++i) { + axis = xaxes[i]; + if (axis && axis.used) { + key = "x" + axis.n; + if (pos[key] == null && axis.n == 1) + key = "x"; + + if (pos[key] != null) { + res.left = axis.p2c(pos[key]); + break; + } + } + } + + for (i = 0; i < yaxes.length; ++i) { + axis = yaxes[i]; + if (axis && axis.used) { + key = "y" + axis.n; + if (pos[key] == null && axis.n == 1) + key = "y"; + + if (pos[key] != null) { + res.top = axis.p2c(pos[key]); + break; + } + } + } + + return res; + } + + function getOrCreateAxis(axes, number) { + if (!axes[number - 1]) + axes[number - 1] = { + n: number, // save the number for future reference + direction: axes == xaxes ? "x" : "y", + options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis) + }; + + return axes[number - 1]; + } + + function fillInSeriesOptions() { + var i; + + // collect what we already got of colors + var neededColors = series.length, + usedColors = [], + assignedColors = []; + for (i = 0; i < series.length; ++i) { + var sc = series[i].color; + if (sc != null) { + --neededColors; + if (typeof sc == "number") + assignedColors.push(sc); + else + usedColors.push($.color.parse(series[i].color)); + } + } + + // we might need to generate more colors if higher indices + // are assigned + for (i = 0; i < assignedColors.length; ++i) { + neededColors = Math.max(neededColors, assignedColors[i] + 1); + } + + // produce colors as needed + var colors = [], variation = 0; + i = 0; + while (colors.length < neededColors) { + var c; + if (options.colors.length == i) // check degenerate case + c = $.color.make(100, 100, 100); + else + c = $.color.parse(options.colors[i]); + + // vary color if needed + var sign = variation % 2 == 1 ? -1 : 1; + c.scale('rgb', 1 + sign * Math.ceil(variation / 2) * 0.2) + + // FIXME: if we're getting to close to something else, + // we should probably skip this one + colors.push(c); + + ++i; + if (i >= options.colors.length) { + i = 0; + ++variation; + } + } + + // fill in the options + var colori = 0, s; + for (i = 0; i < series.length; ++i) { + s = series[i]; + + // assign colors + if (s.color == null) { + s.color = colors[colori].toString(); + ++colori; + } + else if (typeof s.color == "number") + s.color = colors[s.color].toString(); + + // turn on lines automatically in case nothing is set + if (s.lines.show == null) { + var v, show = true; + for (v in s) + if (s[v] && s[v].show) { + show = false; + break; + } + if (show) + s.lines.show = true; + } + + // setup axes + s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, "x")); + s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, "y")); + } + } + + function processData() { + var topSentry = Number.POSITIVE_INFINITY, + bottomSentry = Number.NEGATIVE_INFINITY, + fakeInfinity = Number.MAX_VALUE, + i, j, k, m, length, + s, points, ps, x, y, axis, val, f, p; + + function updateAxis(axis, min, max) { + if (min < axis.datamin && min != -fakeInfinity) + axis.datamin = min; + if (max > axis.datamax && max != fakeInfinity) + axis.datamax = max; + } + + $.each(allAxes(), function (_, axis) { + // init axis + axis.datamin = topSentry; + axis.datamax = bottomSentry; + axis.used = false; + }); + + for (i = 0; i < series.length; ++i) { + s = series[i]; + s.datapoints = { points: [] }; + + executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]); + } + + // first pass: clean and copy data + for (i = 0; i < series.length; ++i) { + s = series[i]; + + var data = s.data, format = s.datapoints.format; + + if (!format) { + format = []; + // find out how to copy + format.push({ x: true, number: true, required: true }); + format.push({ y: true, number: true, required: true }); + + if (s.bars.show || (s.lines.show && s.lines.fill)) { + format.push({ y: true, number: true, required: false, defaultValue: 0 }); + if (s.bars.horizontal) { + delete format[format.length - 1].y; + format[format.length - 1].x = true; + } + } + + s.datapoints.format = format; + } + + if (s.datapoints.pointsize != null) + continue; // already filled in + + s.datapoints.pointsize = format.length; + + ps = s.datapoints.pointsize; + points = s.datapoints.points; + + insertSteps = s.lines.show && s.lines.steps; + s.xaxis.used = s.yaxis.used = true; + + for (j = k = 0; j < data.length; ++j, k += ps) { + p = data[j]; + + var nullify = p == null; + if (!nullify) { + for (m = 0; m < ps; ++m) { + val = p[m]; + f = format[m]; + + if (f) { + if (f.number && val != null) { + val = +val; // convert to number + if (isNaN(val)) + val = null; + else if (val == Infinity) + val = fakeInfinity; + else if (val == -Infinity) + val = -fakeInfinity; + } + + if (val == null) { + if (f.required) + nullify = true; + + if (f.defaultValue != null) + val = f.defaultValue; + } + } + + points[k + m] = val; + } + } + + if (nullify) { + for (m = 0; m < ps; ++m) { + val = points[k + m]; + if (val != null) { + f = format[m]; + // extract min/max info + if (f.x) + updateAxis(s.xaxis, val, val); + if (f.y) + updateAxis(s.yaxis, val, val); + } + points[k + m] = null; + } + } + else { + // a little bit of line specific stuff that + // perhaps shouldn't be here, but lacking + // better means... + if (insertSteps && k > 0 + && points[k - ps] != null + && points[k - ps] != points[k] + && points[k - ps + 1] != points[k + 1]) { + // copy the point to make room for a middle point + for (m = 0; m < ps; ++m) + points[k + ps + m] = points[k + m]; + + // middle point has same y + points[k + 1] = points[k - ps + 1]; + + // we've added a point, better reflect that + k += ps; + } + } + } + } + + // give the hooks a chance to run + for (i = 0; i < series.length; ++i) { + s = series[i]; + + executeHooks(hooks.processDatapoints, [ s, s.datapoints]); + } + + // second pass: find datamax/datamin for auto-scaling + for (i = 0; i < series.length; ++i) { + s = series[i]; + points = s.datapoints.points, + ps = s.datapoints.pointsize; + + var xmin = topSentry, ymin = topSentry, + xmax = bottomSentry, ymax = bottomSentry; + + for (j = 0; j < points.length; j += ps) { + if (points[j] == null) + continue; + + for (m = 0; m < ps; ++m) { + val = points[j + m]; + f = format[m]; + if (!f || val == fakeInfinity || val == -fakeInfinity) + continue; + + if (f.x) { + if (val < xmin) + xmin = val; + if (val > xmax) + xmax = val; + } + if (f.y) { + if (val < ymin) + ymin = val; + if (val > ymax) + ymax = val; + } + } + } + + if (s.bars.show) { + // make sure we got room for the bar on the dancing floor + var delta = s.bars.align == "left" ? 0 : -s.bars.barWidth/2; + if (s.bars.horizontal) { + ymin += delta; + ymax += delta + s.bars.barWidth; + } + else { + xmin += delta; + xmax += delta + s.bars.barWidth; + } + } + + updateAxis(s.xaxis, xmin, xmax); + updateAxis(s.yaxis, ymin, ymax); + } + + $.each(allAxes(), function (_, axis) { + if (axis.datamin == topSentry) + axis.datamin = null; + if (axis.datamax == bottomSentry) + axis.datamax = null; + }); + } + + function makeCanvas(skipPositioning, cls) { + var c = document.createElement('canvas'); + c.className = cls; + c.width = canvasWidth; + c.height = canvasHeight; + + if (!skipPositioning) + $(c).css({ position: 'absolute', left: 0, top: 0 }); + + $(c).appendTo(placeholder); + + if (!c.getContext) // excanvas hack + c = window.G_vmlCanvasManager.initElement(c); + + // used for resetting in case we get replotted + c.getContext("2d").save(); + + return c; + } + + function getCanvasDimensions() { + canvasWidth = placeholder.width(); + canvasHeight = placeholder.height(); + + if (canvasWidth <= 0 || canvasHeight <= 0) + throw "Invalid dimensions for plot, width = " + canvasWidth + ", height = " + canvasHeight; + } + + function resizeCanvas(c) { + // resizing should reset the state (excanvas seems to be + // buggy though) + if (c.width != canvasWidth) + c.width = canvasWidth; + + if (c.height != canvasHeight) + c.height = canvasHeight; + + // so try to get back to the initial state (even if it's + // gone now, this should be safe according to the spec) + var cctx = c.getContext("2d"); + cctx.restore(); + + // and save again + cctx.save(); + } + + function setupCanvases() { + var reused, + existingCanvas = placeholder.children("canvas.base"), + existingOverlay = placeholder.children("canvas.overlay"); + + if (existingCanvas.length == 0 || existingOverlay == 0) { + // init everything + + placeholder.html(""); // make sure placeholder is clear + + placeholder.css({ padding: 0 }); // padding messes up the positioning + + if (placeholder.css("position") == 'static') + placeholder.css("position", "relative"); // for positioning labels and overlay + + getCanvasDimensions(); + + canvas = makeCanvas(true, "base"); + overlay = makeCanvas(false, "overlay"); // overlay canvas for interactive features + + reused = false; + } + else { + // reuse existing elements + + canvas = existingCanvas.get(0); + overlay = existingOverlay.get(0); + + reused = true; + } + + ctx = canvas.getContext("2d"); + octx = overlay.getContext("2d"); + + // we include the canvas in the event holder too, because IE 7 + // sometimes has trouble with the stacking order + eventHolder = $([overlay, canvas]); + + if (reused) { + // run shutdown in the old plot object + placeholder.data("plot").shutdown(); + + // reset reused canvases + plot.resize(); + + // make sure overlay pixels are cleared (canvas is cleared when we redraw) + octx.clearRect(0, 0, canvasWidth, canvasHeight); + + // then whack any remaining obvious garbage left + eventHolder.unbind(); + placeholder.children().not([canvas, overlay]).remove(); + } + + // save in case we get replotted + placeholder.data("plot", plot); + } + + function bindEvents() { + // bind events + if (options.grid.hoverable) { + eventHolder.mousemove(onMouseMove); + eventHolder.mouseleave(onMouseLeave); + } + + if (options.grid.clickable) + eventHolder.click(onClick); + + executeHooks(hooks.bindEvents, [eventHolder]); + } + + function shutdown() { + if (redrawTimeout) + clearTimeout(redrawTimeout); + + eventHolder.unbind("mousemove", onMouseMove); + eventHolder.unbind("mouseleave", onMouseLeave); + eventHolder.unbind("click", onClick); + + executeHooks(hooks.shutdown, [eventHolder]); + } + + function setTransformationHelpers(axis) { + // set helper functions on the axis, assumes plot area + // has been computed already + + function identity(x) { return x; } + + var s, m, t = axis.options.transform || identity, + it = axis.options.inverseTransform; + + // precompute how much the axis is scaling a point + // in canvas space + if (axis.direction == "x") { + s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min)); + m = Math.min(t(axis.max), t(axis.min)); + } + else { + s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min)); + s = -s; + m = Math.max(t(axis.max), t(axis.min)); + } + + // data point to canvas coordinate + if (t == identity) // slight optimization + axis.p2c = function (p) { return (p - m) * s; }; + else + axis.p2c = function (p) { return (t(p) - m) * s; }; + // canvas coordinate to data point + if (!it) + axis.c2p = function (c) { return m + c / s; }; + else + axis.c2p = function (c) { return it(m + c / s); }; + } + + function measureTickLabels(axis) { + var opts = axis.options, i, ticks = axis.ticks || [], labels = [], + l, w = opts.labelWidth, h = opts.labelHeight, dummyDiv; + + function makeDummyDiv(labels, width) { + return $('<div style="position:absolute;top:-10000px;' + width + 'font-size:smaller">' + + '<div class="' + axis.direction + 'Axis ' + axis.direction + axis.n + 'Axis">' + + labels.join("") + '</div></div>') + .appendTo(placeholder); + } + + if (axis.direction == "x") { + // to avoid measuring the widths of the labels (it's slow), we + // construct fixed-size boxes and put the labels inside + // them, we don't need the exact figures and the + // fixed-size box content is easy to center + if (w == null) + w = Math.floor(canvasWidth / (ticks.length > 0 ? ticks.length : 1)); + + // measure x label heights + if (h == null) { + labels = []; + for (i = 0; i < ticks.length; ++i) { + l = ticks[i].label; + if (l) + labels.push('<div class="tickLabel" style="float:left;width:' + w + 'px">' + l + '</div>'); + } + + if (labels.length > 0) { + // stick them all in the same div and measure + // collective height + labels.push('<div style="clear:left"></div>'); + dummyDiv = makeDummyDiv(labels, "width:10000px;"); + h = dummyDiv.height(); + dummyDiv.remove(); + } + } + } + else if (w == null || h == null) { + // calculate y label dimensions + for (i = 0; i < ticks.length; ++i) { + l = ticks[i].label; + if (l) + labels.push('<div class="tickLabel">' + l + '</div>'); + } + + if (labels.length > 0) { + dummyDiv = makeDummyDiv(labels, ""); + if (w == null) + w = dummyDiv.children().width(); + if (h == null) + h = dummyDiv.find("div.tickLabel").height(); + dummyDiv.remove(); + } + } + + if (w == null) + w = 0; + if (h == null) + h = 0; + + axis.labelWidth = w; + axis.labelHeight = h; + } + + function allocateAxisBoxFirstPhase(axis) { + // find the bounding box of the axis by looking at label + // widths/heights and ticks, make room by diminishing the + // plotOffset + + var lw = axis.labelWidth, + lh = axis.labelHeight, + pos = axis.options.position, + tickLength = axis.options.tickLength, + axismargin = options.grid.axisMargin, + padding = options.grid.labelMargin, + all = axis.direction == "x" ? xaxes : yaxes, + index; + + // determine axis margin + var samePosition = $.grep(all, function (a) { + return a && a.options.position == pos && a.reserveSpace; + }); + if ($.inArray(axis, samePosition) == samePosition.length - 1) + axismargin = 0; // outermost + + // determine tick length - if we're innermost, we can use "full" + if (tickLength == null) + tickLength = "full"; + + var sameDirection = $.grep(all, function (a) { + return a && a.reserveSpace; + }); + + var innermost = $.inArray(axis, sameDirection) == 0; + if (!innermost && tickLength == "full") + tickLength = 5; + + if (!isNaN(+tickLength)) + padding += +tickLength; + + // compute box + if (axis.direction == "x") { + lh += padding; + + if (pos == "bottom") { + plotOffset.bottom += lh + axismargin; + axis.box = { top: canvasHeight - plotOffset.bottom, height: lh }; + } + else { + axis.box = { top: plotOffset.top + axismargin, height: lh }; + plotOffset.top += lh + axismargin; + } + } + else { + lw += padding; + + if (pos == "left") { + axis.box = { left: plotOffset.left + axismargin, width: lw }; + plotOffset.left += lw + axismargin; + } + else { + plotOffset.right += lw + axismargin; + axis.box = { left: canvasWidth - plotOffset.right, width: lw }; + } + } + + // save for future reference + axis.position = pos; + axis.tickLength = tickLength; + axis.box.padding = padding; + axis.innermost = innermost; + } + + function allocateAxisBoxSecondPhase(axis) { + // set remaining bounding box coordinates + if (axis.direction == "x") { + axis.box.left = plotOffset.left; + axis.box.width = plotWidth; + } + else { + axis.box.top = plotOffset.top; + axis.box.height = plotHeight; + } + } + + function setupGrid() { + var i, axes = allAxes(); + + // first calculate the plot and axis box dimensions + + $.each(axes, function (_, axis) { + axis.show = axis.options.show; + if (axis.show == null) + axis.show = axis.used; // by default an axis is visible if it's got data + + axis.reserveSpace = axis.show || axis.options.reserveSpace; + + setRange(axis); + }); + + allocatedAxes = $.grep(axes, function (axis) { return axis.reserveSpace; }); + + plotOffset.left = plotOffset.right = plotOffset.top = plotOffset.bottom = 0; + if (options.grid.show) { + $.each(allocatedAxes, function (_, axis) { + // make the ticks + setupTickGeneration(axis); + setTicks(axis); + snapRangeToTicks(axis, axis.ticks); + + // find labelWidth/Height for axis + measureTickLabels(axis); + }); + + // with all dimensions in house, we can compute the + // axis boxes, start from the outside (reverse order) + for (i = allocatedAxes.length - 1; i >= 0; --i) + allocateAxisBoxFirstPhase(allocatedAxes[i]); + + // make sure we've got enough space for things that + // might stick out + var minMargin = options.grid.minBorderMargin; + if (minMargin == null) { + minMargin = 0; + for (i = 0; i < series.length; ++i) + minMargin = Math.max(minMargin, series[i].points.radius + series[i].points.lineWidth/2); + } + + for (var a in plotOffset) { + plotOffset[a] += options.grid.borderWidth; + plotOffset[a] = Math.max(minMargin, plotOffset[a]); + } + } + + plotWidth = canvasWidth - plotOffset.left - plotOffset.right; + plotHeight = canvasHeight - plotOffset.bottom - plotOffset.top; + + // now we got the proper plotWidth/Height, we can compute the scaling + $.each(axes, function (_, axis) { + setTransformationHelpers(axis); + }); + + if (options.grid.show) { + $.each(allocatedAxes, function (_, axis) { + allocateAxisBoxSecondPhase(axis); + }); + + insertAxisLabels(); + } + + insertLegend(); + } + + function setRange(axis) { + var opts = axis.options, + min = +(opts.min != null ? opts.min : axis.datamin), + max = +(opts.max != null ? opts.max : axis.datamax), + delta = max - min; + + if (delta == 0.0) { + // degenerate case + var widen = max == 0 ? 1 : 0.01; + + if (opts.min == null) + min -= widen; + // always widen max if we couldn't widen min to ensure we + // don't fall into min == max which doesn't work + if (opts.max == null || opts.min != null) + max += widen; + } + else { + // consider autoscaling + var margin = opts.autoscaleMargin; + if (margin != null) { + if (opts.min == null) { + min -= delta * margin; + // make sure we don't go below zero if all values + // are positive + if (min < 0 && axis.datamin != null && axis.datamin >= 0) + min = 0; + } + if (opts.max == null) { + max += delta * margin; + if (max > 0 && axis.datamax != null && axis.datamax <= 0) + max = 0; + } + } + } + axis.min = min; + axis.max = max; + } + + function setupTickGeneration(axis) { + var opts = axis.options; + + // estimate number of ticks + var noTicks; + if (typeof opts.ticks == "number" && opts.ticks > 0) + noTicks = opts.ticks; + else + // heuristic based on the model a*sqrt(x) fitted to + // some data points that seemed reasonable + noTicks = 0.3 * Math.sqrt(axis.direction == "x" ? canvasWidth : canvasHeight); + + var delta = (axis.max - axis.min) / noTicks, + size, generator, unit, formatter, i, magn, norm; + + if (opts.mode == "time") { + // pretty handling of time + + // map of app. size of time units in milliseconds + var timeUnitSize = { + "second": 1000, + "minute": 60 * 1000, + "hour": 60 * 60 * 1000, + "day": 24 * 60 * 60 * 1000, + "month": 30 * 24 * 60 * 60 * 1000, + "year": 365.2425 * 24 * 60 * 60 * 1000 + }; + + + // the allowed tick sizes, after 1 year we use + // an integer algorithm + var spec = [ + [1, "second"], [2, "second"], [5, "second"], [10, "second"], + [30, "second"], + [1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"], + [30, "minute"], + [1, "hour"], [2, "hour"], [4, "hour"], + [8, "hour"], [12, "hour"], + [1, "day"], [2, "day"], [3, "day"], + [0.25, "month"], [0.5, "month"], [1, "month"], + [2, "month"], [3, "month"], [6, "month"], + [1, "year"] + ]; + + var minSize = 0; + if (opts.minTickSize != null) { + if (typeof opts.tickSize == "number") + minSize = opts.tickSize; + else + minSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]]; + } + + for (var i = 0; i < spec.length - 1; ++i) + if (delta < (spec[i][0] * timeUnitSize[spec[i][1]] + + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2 + && spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) + break; + size = spec[i][0]; + unit = spec[i][1]; + + // special-case the possibility of several years + if (unit == "year") { + magn = Math.pow(10, Math.floor(Math.log(delta / timeUnitSize.year) / Math.LN10)); + norm = (delta / timeUnitSize.year) / magn; + if (norm < 1.5) + size = 1; + else if (norm < 3) + size = 2; + else if (norm < 7.5) + size = 5; + else + size = 10; + + size *= magn; + } + + axis.tickSize = opts.tickSize || [size, unit]; + + generator = function(axis) { + var ticks = [], + tickSize = axis.tickSize[0], unit = axis.tickSize[1], + d = new Date(axis.min); + + var step = tickSize * timeUnitSize[unit]; + + if (unit == "second") + d.setUTCSeconds(floorInBase(d.getUTCSeconds(), tickSize)); + if (unit == "minute") + d.setUTCMinutes(floorInBase(d.getUTCMinutes(), tickSize)); + if (unit == "hour") + d.setUTCHours(floorInBase(d.getUTCHours(), tickSize)); + if (unit == "month") + d.setUTCMonth(floorInBase(d.getUTCMonth(), tickSize)); + if (unit == "year") + d.setUTCFullYear(floorInBase(d.getUTCFullYear(), tickSize)); + + // reset smaller components + d.setUTCMilliseconds(0); + if (step >= timeUnitSize.minute) + d.setUTCSeconds(0); + if (step >= timeUnitSize.hour) + d.setUTCMinutes(0); + if (step >= timeUnitSize.day) + d.setUTCHours(0); + if (step >= timeUnitSize.day * 4) + d.setUTCDate(1); + if (step >= timeUnitSize.year) + d.setUTCMonth(0); + + + var carry = 0, v = Number.NaN, prev; + do { + prev = v; + v = d.getTime(); + ticks.push(v); + if (unit == "month") { + if (tickSize < 1) { + // a bit complicated - we'll divide the month + // up but we need to take care of fractions + // so we don't end up in the middle of a day + d.setUTCDate(1); + var start = d.getTime(); + d.setUTCMonth(d.getUTCMonth() + 1); + var end = d.getTime(); + d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize); + carry = d.getUTCHours(); + d.setUTCHours(0); + } + else + d.setUTCMonth(d.getUTCMonth() + tickSize); + } + else if (unit == "year") { + d.setUTCFullYear(d.getUTCFullYear() + tickSize); + } + else + d.setTime(v + step); + } while (v < axis.max && v != prev); + + return ticks; + }; + + formatter = function (v, axis) { + var d = new Date(v); + + // first check global format + if (opts.timeformat != null) + return $.plot.formatDate(d, opts.timeformat, opts.monthNames); + + var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]]; + var span = axis.max - axis.min; + var suffix = (opts.twelveHourClock) ? " %p" : ""; + + if (t < timeUnitSize.minute) + fmt = "%h:%M:%S" + suffix; + else if (t < timeUnitSize.day) { + if (span < 2 * timeUnitSize.day) + fmt = "%h:%M" + suffix; + else + fmt = "%b %d %h:%M" + suffix; + } + else if (t < timeUnitSize.month) + fmt = "%b %d"; + else if (t < timeUnitSize.year) { + if (span < timeUnitSize.year) + fmt = "%b"; + else + fmt = "%b %y"; + } + else + fmt = "%y"; + + return $.plot.formatDate(d, fmt, opts.monthNames); + }; + } + else { + // pretty rounding of base-10 numbers + var maxDec = opts.tickDecimals; + var dec = -Math.floor(Math.log(delta) / Math.LN10); + if (maxDec != null && dec > maxDec) + dec = maxDec; + + magn = Math.pow(10, -dec); + norm = delta / magn; // norm is between 1.0 and 10.0 + + if (norm < 1.5) + size = 1; + else if (norm < 3) { + size = 2; + // special case for 2.5, requires an extra decimal + if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) { + size = 2.5; + ++dec; + } + } + else if (norm < 7.5) + size = 5; + else + size = 10; + + size *= magn; + + if (opts.minTickSize != null && size < opts.minTickSize) + size = opts.minTickSize; + + axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec); + axis.tickSize = opts.tickSize || size; + + generator = function (axis) { + var ticks = []; + + // spew out all possible ticks + var start = floorInBase(axis.min, axis.tickSize), + i = 0, v = Number.NaN, prev; + do { + prev = v; + v = start + i * axis.tickSize; + ticks.push(v); + ++i; + } while (v < axis.max && v != prev); + return ticks; + }; + + formatter = function (v, axis) { + return v.toFixed(axis.tickDecimals); + }; + } + + if (opts.alignTicksWithAxis != null) { + var otherAxis = (axis.direction == "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1]; + if (otherAxis && otherAxis.used && otherAxis != axis) { + // consider snapping min/max to outermost nice ticks + var niceTicks = generator(axis); + if (niceTicks.length > 0) { + if (opts.min == null) + axis.min = Math.min(axis.min, niceTicks[0]); + if (opts.max == null && niceTicks.length > 1) + axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]); + } + + generator = function (axis) { + // copy ticks, scaled to this axis + var ticks = [], v, i; + for (i = 0; i < otherAxis.ticks.length; ++i) { + v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min); + v = axis.min + v * (axis.max - axis.min); + ticks.push(v); + } + return ticks; + }; + + // we might need an extra decimal since forced + // ticks don't necessarily fit naturally + if (axis.mode != "time" && opts.tickDecimals == null) { + var extraDec = Math.max(0, -Math.floor(Math.log(delta) / Math.LN10) + 1), + ts = generator(axis); + + // only proceed if the tick interval rounded + // with an extra decimal doesn't give us a + // zero at end + if (!(ts.length > 1 && /\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec)))) + axis.tickDecimals = extraDec; + } + } + } + + axis.tickGenerator = generator; + if ($.isFunction(opts.tickFormatter)) + axis.tickFormatter = function (v, axis) { return "" + opts.tickFormatter(v, axis); }; + else + axis.tickFormatter = formatter; + } + + function setTicks(axis) { + var oticks = axis.options.ticks, ticks = []; + if (oticks == null || (typeof oticks == "number" && oticks > 0)) + ticks = axis.tickGenerator(axis); + else if (oticks) { + if ($.isFunction(oticks)) + // generate the ticks + ticks = oticks({ min: axis.min, max: axis.max }); + else + ticks = oticks; + } + + // clean up/labelify the supplied ticks, copy them over + var i, v; + axis.ticks = []; + for (i = 0; i < ticks.length; ++i) { + var label = null; + var t = ticks[i]; + if (typeof t == "object") { + v = +t[0]; + if (t.length > 1) + label = t[1]; + } + else + v = +t; + if (label == null) + label = axis.tickFormatter(v, axis); + if (!isNaN(v)) + axis.ticks.push({ v: v, label: label }); + } + } + + function snapRangeToTicks(axis, ticks) { + if (axis.options.autoscaleMargin && ticks.length > 0) { + // snap to ticks + if (axis.options.min == null) + axis.min = Math.min(axis.min, ticks[0].v); + if (axis.options.max == null && ticks.length > 1) + axis.max = Math.max(axis.max, ticks[ticks.length - 1].v); + } + } + + function draw() { + ctx.clearRect(0, 0, canvasWidth, canvasHeight); + + var grid = options.grid; + + // draw background, if any + if (grid.show && grid.backgroundColor) + drawBackground(); + + if (grid.show && !grid.aboveData) + drawGrid(); + + for (var i = 0; i < series.length; ++i) { + executeHooks(hooks.drawSeries, [ctx, series[i]]); + drawSeries(series[i]); + } + + executeHooks(hooks.draw, [ctx]); + + if (grid.show && grid.aboveData) + drawGrid(); + } + + function extractRange(ranges, coord) { + var axis, from, to, key, axes = allAxes(); + + for (i = 0; i < axes.length; ++i) { + axis = axes[i]; + if (axis.direction == coord) { + key = coord + axis.n + "axis"; + if (!ranges[key] && axis.n == 1) + key = coord + "axis"; // support x1axis as xaxis + if (ranges[key]) { + from = ranges[key].from; + to = ranges[key].to; + break; + } + } + } + + // backwards-compat stuff - to be removed in future + if (!ranges[key]) { + axis = coord == "x" ? xaxes[0] : yaxes[0]; + from = ranges[coord + "1"]; + to = ranges[coord + "2"]; + } + + // auto-reverse as an added bonus + if (from != null && to != null && from > to) { + var tmp = from; + from = to; + to = tmp; + } + + return { from: from, to: to, axis: axis }; + } + + function drawBackground() { + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)"); + ctx.fillRect(0, 0, plotWidth, plotHeight); + ctx.restore(); + } + + function drawGrid() { + var i; + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + // draw markings + var markings = options.grid.markings; + if (markings) { + if ($.isFunction(markings)) { + var axes = plot.getAxes(); + // xmin etc. is backwards compatibility, to be + // removed in the future + axes.xmin = axes.xaxis.min; + axes.xmax = axes.xaxis.max; + axes.ymin = axes.yaxis.min; + axes.ymax = axes.yaxis.max; + + markings = markings(axes); + } + + for (i = 0; i < markings.length; ++i) { + var m = markings[i], + xrange = extractRange(m, "x"), + yrange = extractRange(m, "y"); + + // fill in missing + if (xrange.from == null) + xrange.from = xrange.axis.min; + if (xrange.to == null) + xrange.to = xrange.axis.max; + if (yrange.from == null) + yrange.from = yrange.axis.min; + if (yrange.to == null) + yrange.to = yrange.axis.max; + + // clip + if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max || + yrange.to < yrange.axis.min || yrange.from > yrange.axis.max) + continue; + + xrange.from = Math.max(xrange.from, xrange.axis.min); + xrange.to = Math.min(xrange.to, xrange.axis.max); + yrange.from = Math.max(yrange.from, yrange.axis.min); + yrange.to = Math.min(yrange.to, yrange.axis.max); + + if (xrange.from == xrange.to && yrange.from == yrange.to) + continue; + + // then draw + xrange.from = xrange.axis.p2c(xrange.from); + xrange.to = xrange.axis.p2c(xrange.to); + yrange.from = yrange.axis.p2c(yrange.from); + yrange.to = yrange.axis.p2c(yrange.to); + + if (xrange.from == xrange.to || yrange.from == yrange.to) { + // draw line + ctx.beginPath(); + ctx.strokeStyle = m.color || options.grid.markingsColor; + ctx.lineWidth = m.lineWidth || options.grid.markingsLineWidth; + ctx.moveTo(xrange.from, yrange.from); + ctx.lineTo(xrange.to, yrange.to); + ctx.stroke(); + } + else { + // fill area + ctx.fillStyle = m.color || options.grid.markingsColor; + ctx.fillRect(xrange.from, yrange.to, + xrange.to - xrange.from, + yrange.from - yrange.to); + } + } + } + + // draw the ticks + var axes = allAxes(), bw = options.grid.borderWidth; + + for (var j = 0; j < axes.length; ++j) { + var axis = axes[j], box = axis.box, + t = axis.tickLength, x, y, xoff, yoff; + if (!axis.show || axis.ticks.length == 0) + continue + + ctx.strokeStyle = axis.options.tickColor || $.color.parse(axis.options.color).scale('a', 0.22).toString(); + ctx.lineWidth = 1; + + // find the edges + if (axis.direction == "x") { + x = 0; + if (t == "full") + y = (axis.position == "top" ? 0 : plotHeight); + else + y = box.top - plotOffset.top + (axis.position == "top" ? box.height : 0); + } + else { + y = 0; + if (t == "full") + x = (axis.position == "left" ? 0 : plotWidth); + else + x = box.left - plotOffset.left + (axis.position == "left" ? box.width : 0); + } + + // draw tick bar + if (!axis.innermost) { + ctx.beginPath(); + xoff = yoff = 0; + if (axis.direction == "x") + xoff = plotWidth; + else + yoff = plotHeight; + + if (ctx.lineWidth == 1) { + x = Math.floor(x) + 0.5; + y = Math.floor(y) + 0.5; + } + + ctx.moveTo(x, y); + ctx.lineTo(x + xoff, y + yoff); + ctx.stroke(); + } + + // draw ticks + ctx.beginPath(); + for (i = 0; i < axis.ticks.length; ++i) { + var v = axis.ticks[i].v; + + xoff = yoff = 0; + + if (v < axis.min || v > axis.max + // skip those lying on the axes if we got a border + || (t == "full" && bw > 0 + && (v == axis.min || v == axis.max))) + continue; + + if (axis.direction == "x") { + x = axis.p2c(v); + yoff = t == "full" ? -plotHeight : t; + + if (axis.position == "top") + yoff = -yoff; + } + else { + y = axis.p2c(v); + xoff = t == "full" ? -plotWidth : t; + + if (axis.position == "left") + xoff = -xoff; + } + + if (ctx.lineWidth == 1) { + if (axis.direction == "x") + x = Math.floor(x) + 0.5; + else + y = Math.floor(y) + 0.5; + } + + ctx.moveTo(x, y); + ctx.lineTo(x + xoff, y + yoff); + } + + ctx.stroke(); + } + + + // draw border + if (bw) { + ctx.lineWidth = bw; + ctx.strokeStyle = options.grid.borderColor; + ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw); + } + + ctx.restore(); + } + + function insertAxisLabels() { + placeholder.find(".tickLabels").remove(); + + var html = ['<div class="tickLabels" style="font-size:smaller">']; + + var axes = allAxes(); + for (var j = 0; j < axes.length; ++j) { + var axis = axes[j], box = axis.box; + if (!axis.show) + continue; + //debug: html.push('<div style="position:absolute;opacity:0.10;background-color:red;left:' + box.left + 'px;top:' + box.top + 'px;width:' + box.width + 'px;height:' + box.height + 'px"></div>') + html.push('<div class="' + axis.direction + 'Axis ' + axis.direction + axis.n + 'Axis" style="color:' + axis.options.color + '">'); + for (var i = 0; i < axis.ticks.length; ++i) { + var tick = axis.ticks[i]; + if (!tick.label || tick.v < axis.min || tick.v > axis.max) + continue; + + var pos = {}, align; + + if (axis.direction == "x") { + align = "center"; + pos.left = Math.round(plotOffset.left + axis.p2c(tick.v) - axis.labelWidth/2); + if (axis.position == "bottom") + pos.top = box.top + box.padding; + else + pos.bottom = canvasHeight - (box.top + box.height - box.padding); + } + else { + pos.top = Math.round(plotOffset.top + axis.p2c(tick.v) - axis.labelHeight/2); + if (axis.position == "left") { + pos.right = canvasWidth - (box.left + box.width - box.padding) + align = "right"; + } + else { + pos.left = box.left + box.padding; + align = "left"; + } + } + + pos.width = axis.labelWidth; + + var style = ["position:absolute", "text-align:" + align ]; + for (var a in pos) + style.push(a + ":" + pos[a] + "px") + + html.push('<div class="tickLabel" style="' + style.join(';') + '">' + tick.label + '</div>'); + } + html.push('</div>'); + } + + html.push('</div>'); + + placeholder.append(html.join("")); + } + + function drawSeries(series) { + if (series.lines.show) + drawSeriesLines(series); + if (series.bars.show) + drawSeriesBars(series); + if (series.points.show) + drawSeriesPoints(series); + } + + function drawSeriesLines(series) { + function plotLine(datapoints, xoffset, yoffset, axisx, axisy) { + var points = datapoints.points, + ps = datapoints.pointsize, + prevx = null, prevy = null; + + ctx.beginPath(); + for (var i = ps; i < points.length; i += ps) { + var x1 = points[i - ps], y1 = points[i - ps + 1], + x2 = points[i], y2 = points[i + 1]; + + if (x1 == null || x2 == null) + continue; + + // clip with ymin + if (y1 <= y2 && y1 < axisy.min) { + if (y2 < axisy.min) + continue; // line segment is outside + // compute new intersection point + x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.min; + } + else if (y2 <= y1 && y2 < axisy.min) { + if (y1 < axisy.min) + continue; + x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.min; + } + + // clip with ymax + if (y1 >= y2 && y1 > axisy.max) { + if (y2 > axisy.max) + continue; + x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.max; + } + else if (y2 >= y1 && y2 > axisy.max) { + if (y1 > axisy.max) + continue; + x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.max; + } + + // clip with xmin + if (x1 <= x2 && x1 < axisx.min) { + if (x2 < axisx.min) + continue; + y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.min; + } + else if (x2 <= x1 && x2 < axisx.min) { + if (x1 < axisx.min) + continue; + y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.min; + } + + // clip with xmax + if (x1 >= x2 && x1 > axisx.max) { + if (x2 > axisx.max) + continue; + y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.max; + } + else if (x2 >= x1 && x2 > axisx.max) { + if (x1 > axisx.max) + continue; + y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.max; + } + + if (x1 != prevx || y1 != prevy) + ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset); + + prevx = x2; + prevy = y2; + ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset); + } + ctx.stroke(); + } + + function plotLineArea(datapoints, axisx, axisy) { + var points = datapoints.points, + ps = datapoints.pointsize, + bottom = Math.min(Math.max(0, axisy.min), axisy.max), + i = 0, top, areaOpen = false, + ypos = 1, segmentStart = 0, segmentEnd = 0; + + // we process each segment in two turns, first forward + // direction to sketch out top, then once we hit the + // end we go backwards to sketch the bottom + while (true) { + if (ps > 0 && i > points.length + ps) + break; + + i += ps; // ps is negative if going backwards + + var x1 = points[i - ps], + y1 = points[i - ps + ypos], + x2 = points[i], y2 = points[i + ypos]; + + if (areaOpen) { + if (ps > 0 && x1 != null && x2 == null) { + // at turning point + segmentEnd = i; + ps = -ps; + ypos = 2; + continue; + } + + if (ps < 0 && i == segmentStart + ps) { + // done with the reverse sweep + ctx.fill(); + areaOpen = false; + ps = -ps; + ypos = 1; + i = segmentStart = segmentEnd + ps; + continue; + } + } + + if (x1 == null || x2 == null) + continue; + + // clip x values + + // clip with xmin + if (x1 <= x2 && x1 < axisx.min) { + if (x2 < axisx.min) + continue; + y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.min; + } + else if (x2 <= x1 && x2 < axisx.min) { + if (x1 < axisx.min) + continue; + y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.min; + } + + // clip with xmax + if (x1 >= x2 && x1 > axisx.max) { + if (x2 > axisx.max) + continue; + y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.max; + } + else if (x2 >= x1 && x2 > axisx.max) { + if (x1 > axisx.max) + continue; + y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.max; + } + + if (!areaOpen) { + // open area + ctx.beginPath(); + ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom)); + areaOpen = true; + } + + // now first check the case where both is outside + if (y1 >= axisy.max && y2 >= axisy.max) { + ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max)); + continue; + } + else if (y1 <= axisy.min && y2 <= axisy.min) { + ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min)); + continue; + } + + // else it's a bit more complicated, there might + // be a flat maxed out rectangle first, then a + // triangular cutout or reverse; to find these + // keep track of the current x values + var x1old = x1, x2old = x2; + + // clip the y values, without shortcutting, we + // go through all cases in turn + + // clip with ymin + if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) { + x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.min; + } + else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) { + x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.min; + } + + // clip with ymax + if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) { + x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.max; + } + else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) { + x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.max; + } + + // if the x value was changed we got a rectangle + // to fill + if (x1 != x1old) { + ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1)); + // it goes to (x1, y1), but we fill that below + } + + // fill triangular section, this sometimes result + // in redundant points if (x1, y1) hasn't changed + // from previous line to, but we just ignore that + ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); + + // fill the other rectangle if it's there + if (x2 != x2old) { + ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); + ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2)); + } + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + ctx.lineJoin = "round"; + + var lw = series.lines.lineWidth, + sw = series.shadowSize; + // FIXME: consider another form of shadow when filling is turned on + if (lw > 0 && sw > 0) { + // draw shadow as a thick and thin line with transparency + ctx.lineWidth = sw; + ctx.strokeStyle = "rgba(0,0,0,0.1)"; + // position shadow at angle from the mid of line + var angle = Math.PI/18; + plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis); + ctx.lineWidth = sw/2; + plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis); + } + + ctx.lineWidth = lw; + ctx.strokeStyle = series.color; + var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight); + if (fillStyle) { + ctx.fillStyle = fillStyle; + plotLineArea(series.datapoints, series.xaxis, series.yaxis); + } + + if (lw > 0) + plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis); + ctx.restore(); + } + + function drawSeriesPoints(series) { + function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) { + var points = datapoints.points, ps = datapoints.pointsize; + + for (var i = 0; i < points.length; i += ps) { + var x = points[i], y = points[i + 1]; + if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) + continue; + + ctx.beginPath(); + x = axisx.p2c(x); + y = axisy.p2c(y) + offset; + if (symbol == "circle") + ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false); + else + symbol(ctx, x, y, radius, shadow); + ctx.closePath(); + + if (fillStyle) { + ctx.fillStyle = fillStyle; + ctx.fill(); + } + ctx.stroke(); + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + var lw = series.points.lineWidth, + sw = series.shadowSize, + radius = series.points.radius, + symbol = series.points.symbol; + if (lw > 0 && sw > 0) { + // draw shadow in two steps + var w = sw / 2; + ctx.lineWidth = w; + ctx.strokeStyle = "rgba(0,0,0,0.1)"; + plotPoints(series.datapoints, radius, null, w + w/2, true, + series.xaxis, series.yaxis, symbol); + + ctx.strokeStyle = "rgba(0,0,0,0.2)"; + plotPoints(series.datapoints, radius, null, w/2, true, + series.xaxis, series.yaxis, symbol); + } + + ctx.lineWidth = lw; + ctx.strokeStyle = series.color; + plotPoints(series.datapoints, radius, + getFillStyle(series.points, series.color), 0, false, + series.xaxis, series.yaxis, symbol); + ctx.restore(); + } + + function drawBar(x, y, b, barLeft, barRight, offset, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) { + var left, right, bottom, top, + drawLeft, drawRight, drawTop, drawBottom, + tmp; + + // in horizontal mode, we start the bar from the left + // instead of from the bottom so it appears to be + // horizontal rather than vertical + if (horizontal) { + drawBottom = drawRight = drawTop = true; + drawLeft = false; + left = b; + right = x; + top = y + barLeft; + bottom = y + barRight; + + // account for negative bars + if (right < left) { + tmp = right; + right = left; + left = tmp; + drawLeft = true; + drawRight = false; + } + } + else { + drawLeft = drawRight = drawTop = true; + drawBottom = false; + left = x + barLeft; + right = x + barRight; + bottom = b; + top = y; + + // account for negative bars + if (top < bottom) { + tmp = top; + top = bottom; + bottom = tmp; + drawBottom = true; + drawTop = false; + } + } + + // clip + if (right < axisx.min || left > axisx.max || + top < axisy.min || bottom > axisy.max) + return; + + if (left < axisx.min) { + left = axisx.min; + drawLeft = false; + } + + if (right > axisx.max) { + right = axisx.max; + drawRight = false; + } + + if (bottom < axisy.min) { + bottom = axisy.min; + drawBottom = false; + } + + if (top > axisy.max) { + top = axisy.max; + drawTop = false; + } + + left = axisx.p2c(left); + bottom = axisy.p2c(bottom); + right = axisx.p2c(right); + top = axisy.p2c(top); + + // fill the bar + if (fillStyleCallback) { + c.beginPath(); + c.moveTo(left, bottom); + c.lineTo(left, top); + c.lineTo(right, top); + c.lineTo(right, bottom); + c.fillStyle = fillStyleCallback(bottom, top); + c.fill(); + } + + // draw outline + if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) { + c.beginPath(); + + // FIXME: inline moveTo is buggy with excanvas + c.moveTo(left, bottom + offset); + if (drawLeft) + c.lineTo(left, top + offset); + else + c.moveTo(left, top + offset); + if (drawTop) + c.lineTo(right, top + offset); + else + c.moveTo(right, top + offset); + if (drawRight) + c.lineTo(right, bottom + offset); + else + c.moveTo(right, bottom + offset); + if (drawBottom) + c.lineTo(left, bottom + offset); + else + c.moveTo(left, bottom + offset); + c.stroke(); + } + } + + function drawSeriesBars(series) { + function plotBars(datapoints, barLeft, barRight, offset, fillStyleCallback, axisx, axisy) { + var points = datapoints.points, ps = datapoints.pointsize; + + for (var i = 0; i < points.length; i += ps) { + if (points[i] == null) + continue; + drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, offset, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth); + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + // FIXME: figure out a way to add shadows (for instance along the right edge) + ctx.lineWidth = series.bars.lineWidth; + ctx.strokeStyle = series.color; + var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2; + var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null; + plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, 0, fillStyleCallback, series.xaxis, series.yaxis); + ctx.restore(); + } + + function getFillStyle(filloptions, seriesColor, bottom, top) { + var fill = filloptions.fill; + if (!fill) + return null; + + if (filloptions.fillColor) + return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor); + + var c = $.color.parse(seriesColor); + c.a = typeof fill == "number" ? fill : 0.4; + c.normalize(); + return c.toString(); + } + + function insertLegend() { + placeholder.find(".legend").remove(); + + if (!options.legend.show) + return; + + var fragments = [], rowStarted = false, + lf = options.legend.labelFormatter, s, label; + for (var i = 0; i < series.length; ++i) { + s = series[i]; + label = s.label; + if (!label) + continue; + + if (i % options.legend.noColumns == 0) { + if (rowStarted) + fragments.push('</tr>'); + fragments.push('<tr>'); + rowStarted = true; + } + + if (lf) + label = lf(label, s); + + fragments.push( + '<td class="legendColorBox"><div style="border:1px solid ' + options.legend.labelBoxBorderColor + ';padding:1px"><div style="width:4px;height:0;border:5px solid ' + s.color + ';overflow:hidden"></div></div></td>' + + '<td class="legendLabel">' + label + '</td>'); + } + if (rowStarted) + fragments.push('</tr>'); + + if (fragments.length == 0) + return; + + var table = '<table style="font-size:smaller;color:' + options.grid.color + '">' + fragments.join("") + '</table>'; + if (options.legend.container != null) + $(options.legend.container).html(table); + else { + var pos = "", + p = options.legend.position, + m = options.legend.margin; + if (m[0] == null) + m = [m, m]; + if (p.charAt(0) == "n") + pos += 'top:' + (m[1] + plotOffset.top) + 'px;'; + else if (p.charAt(0) == "s") + pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;'; + if (p.charAt(1) == "e") + pos += 'right:' + (m[0] + plotOffset.right) + 'px;'; + else if (p.charAt(1) == "w") + pos += 'left:' + (m[0] + plotOffset.left) + 'px;'; + var legend = $('<div class="legend">' + table.replace('style="', 'style="position:absolute;' + pos +';') + '</div>').appendTo(placeholder); + if (options.legend.backgroundOpacity != 0.0) { + // put in the transparent background + // separately to avoid blended labels and + // label boxes + var c = options.legend.backgroundColor; + if (c == null) { + c = options.grid.backgroundColor; + if (c && typeof c == "string") + c = $.color.parse(c); + else + c = $.color.extract(legend, 'background-color'); + c.a = 1; + c = c.toString(); + } + var div = legend.children(); + $('<div style="position:absolute;width:' + div.width() + 'px;height:' + div.height() + 'px;' + pos +'background-color:' + c + ';"> </div>').prependTo(legend).css('opacity', options.legend.backgroundOpacity); + } + } + } + + + // interactive features + + var highlights = [], + redrawTimeout = null; + + // returns the data item the mouse is over, or null if none is found + function findNearbyItem(mouseX, mouseY, seriesFilter) { + var maxDistance = options.grid.mouseActiveRadius, + smallestDistance = maxDistance * maxDistance + 1, + item = null, foundPoint = false, i, j; + + for (i = series.length - 1; i >= 0; --i) { + if (!seriesFilter(series[i])) + continue; + + var s = series[i], + axisx = s.xaxis, + axisy = s.yaxis, + points = s.datapoints.points, + ps = s.datapoints.pointsize, + mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster + my = axisy.c2p(mouseY), + maxx = maxDistance / axisx.scale, + maxy = maxDistance / axisy.scale; + + // with inverse transforms, we can't use the maxx/maxy + // optimization, sadly + if (axisx.options.inverseTransform) + maxx = Number.MAX_VALUE; + if (axisy.options.inverseTransform) + maxy = Number.MAX_VALUE; + + if (s.lines.show || s.points.show) { + for (j = 0; j < points.length; j += ps) { + var x = points[j], y = points[j + 1]; + if (x == null) + continue; + + // For points and lines, the cursor must be within a + // certain distance to the data point + if (x - mx > maxx || x - mx < -maxx || + y - my > maxy || y - my < -maxy) + continue; + + // We have to calculate distances in pixels, not in + // data units, because the scales of the axes may be different + var dx = Math.abs(axisx.p2c(x) - mouseX), + dy = Math.abs(axisy.p2c(y) - mouseY), + dist = dx * dx + dy * dy; // we save the sqrt + + // use <= to ensure last point takes precedence + // (last generally means on top of) + if (dist < smallestDistance) { + smallestDistance = dist; + item = [i, j / ps]; + } + } + } + + if (s.bars.show && !item) { // no other point can be nearby + var barLeft = s.bars.align == "left" ? 0 : -s.bars.barWidth/2, + barRight = barLeft + s.bars.barWidth; + + for (j = 0; j < points.length; j += ps) { + var x = points[j], y = points[j + 1], b = points[j + 2]; + if (x == null) + continue; + + // for a bar graph, the cursor must be inside the bar + if (series[i].bars.horizontal ? + (mx <= Math.max(b, x) && mx >= Math.min(b, x) && + my >= y + barLeft && my <= y + barRight) : + (mx >= x + barLeft && mx <= x + barRight && + my >= Math.min(b, y) && my <= Math.max(b, y))) + item = [i, j / ps]; + } + } + } + + if (item) { + i = item[0]; + j = item[1]; + ps = series[i].datapoints.pointsize; + + return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps), + dataIndex: j, + series: series[i], + seriesIndex: i }; + } + + return null; + } + + function onMouseMove(e) { + if (options.grid.hoverable) + triggerClickHoverEvent("plothover", e, + function (s) { return s["hoverable"] != false; }); + } + + function onMouseLeave(e) { + if (options.grid.hoverable) + triggerClickHoverEvent("plothover", e, + function (s) { return false; }); + } + + function onClick(e) { + triggerClickHoverEvent("plotclick", e, + function (s) { return s["clickable"] != false; }); + } + + // trigger click or hover event (they send the same parameters + // so we share their code) + function triggerClickHoverEvent(eventname, event, seriesFilter) { + var offset = eventHolder.offset(), + canvasX = event.pageX - offset.left - plotOffset.left, + canvasY = event.pageY - offset.top - plotOffset.top, + pos = canvasToAxisCoords({ left: canvasX, top: canvasY }); + + pos.pageX = event.pageX; + pos.pageY = event.pageY; + + var item = findNearbyItem(canvasX, canvasY, seriesFilter); + + if (item) { + // fill in mouse pos for any listeners out there + item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left); + item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top); + } + + if (options.grid.autoHighlight) { + // clear auto-highlights + for (var i = 0; i < highlights.length; ++i) { + var h = highlights[i]; + if (h.auto == eventname && + !(item && h.series == item.series && + h.point[0] == item.datapoint[0] && + h.point[1] == item.datapoint[1])) + unhighlight(h.series, h.point); + } + + if (item) + highlight(item.series, item.datapoint, eventname); + } + + placeholder.trigger(eventname, [ pos, item ]); + } + + function triggerRedrawOverlay() { + if (!redrawTimeout) + redrawTimeout = setTimeout(drawOverlay, 30); + } + + function drawOverlay() { + redrawTimeout = null; + + // draw highlights + octx.save(); + octx.clearRect(0, 0, canvasWidth, canvasHeight); + octx.translate(plotOffset.left, plotOffset.top); + + var i, hi; + for (i = 0; i < highlights.length; ++i) { + hi = highlights[i]; + + if (hi.series.bars.show) + drawBarHighlight(hi.series, hi.point); + else + drawPointHighlight(hi.series, hi.point); + } + octx.restore(); + + executeHooks(hooks.drawOverlay, [octx]); + } + + function highlight(s, point, auto) { + if (typeof s == "number") + s = series[s]; + + if (typeof point == "number") { + var ps = s.datapoints.pointsize; + point = s.datapoints.points.slice(ps * point, ps * (point + 1)); + } + + var i = indexOfHighlight(s, point); + if (i == -1) { + highlights.push({ series: s, point: point, auto: auto }); + + triggerRedrawOverlay(); + } + else if (!auto) + highlights[i].auto = false; + } + + function unhighlight(s, point) { + if (s == null && point == null) { + highlights = []; + triggerRedrawOverlay(); + } + + if (typeof s == "number") + s = series[s]; + + if (typeof point == "number") + point = s.data[point]; + + var i = indexOfHighlight(s, point); + if (i != -1) { + highlights.splice(i, 1); + + triggerRedrawOverlay(); + } + } + + function indexOfHighlight(s, p) { + for (var i = 0; i < highlights.length; ++i) { + var h = highlights[i]; + if (h.series == s && h.point[0] == p[0] + && h.point[1] == p[1]) + return i; + } + return -1; + } + + function drawPointHighlight(series, point) { + var x = point[0], y = point[1], + axisx = series.xaxis, axisy = series.yaxis; + + if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) + return; + + var pointRadius = series.points.radius + series.points.lineWidth / 2; + octx.lineWidth = pointRadius; + octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString(); + var radius = 1.5 * pointRadius, + x = axisx.p2c(x), + y = axisy.p2c(y); + + octx.beginPath(); + if (series.points.symbol == "circle") + octx.arc(x, y, radius, 0, 2 * Math.PI, false); + else + series.points.symbol(octx, x, y, radius, false); + octx.closePath(); + octx.stroke(); + } + + function drawBarHighlight(series, point) { + octx.lineWidth = series.bars.lineWidth; + octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString(); + var fillStyle = $.color.parse(series.color).scale('a', 0.5).toString(); + var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2; + drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth, + 0, function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth); + } + + function getColorOrGradient(spec, bottom, top, defaultColor) { + if (typeof spec == "string") + return spec; + else { + // assume this is a gradient spec; IE currently only + // supports a simple vertical gradient properly, so that's + // what we support too + var gradient = ctx.createLinearGradient(0, top, 0, bottom); + + for (var i = 0, l = spec.colors.length; i < l; ++i) { + var c = spec.colors[i]; + if (typeof c != "string") { + var co = $.color.parse(defaultColor); + if (c.brightness != null) + co = co.scale('rgb', c.brightness) + if (c.opacity != null) + co.a *= c.opacity; + c = co.toString(); + } + gradient.addColorStop(i / (l - 1), c); + } + + return gradient; + } + } + } + + $.plot = function(placeholder, data, options) { + //var t0 = new Date(); + var plot = new Plot($(placeholder), data, options, $.plot.plugins); + //(window.console ? console.log : alert)("time used (msecs): " + ((new Date()).getTime() - t0.getTime())); + return plot; + }; + + $.plot.version = "0.7"; + + $.plot.plugins = []; + + // returns a string with the date d formatted according to fmt + $.plot.formatDate = function(d, fmt, monthNames) { + var leftPad = function(n) { + n = "" + n; + return n.length == 1 ? "0" + n : n; + }; + + var r = []; + var escape = false, padNext = false; + var hours = d.getUTCHours(); + var isAM = hours < 12; + if (monthNames == null) + monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + + if (fmt.search(/%p|%P/) != -1) { + if (hours > 12) { + hours = hours - 12; + } else if (hours == 0) { + hours = 12; + } + } + for (var i = 0; i < fmt.length; ++i) { + var c = fmt.charAt(i); + + if (escape) { + switch (c) { + case 'h': c = "" + hours; break; + case 'H': c = leftPad(hours); break; + case 'M': c = leftPad(d.getUTCMinutes()); break; + case 'S': c = leftPad(d.getUTCSeconds()); break; + case 'd': c = "" + d.getUTCDate(); break; + case 'm': c = "" + (d.getUTCMonth() + 1); break; + case 'y': c = "" + d.getUTCFullYear(); break; + case 'b': c = "" + monthNames[d.getUTCMonth()]; break; + case 'p': c = (isAM) ? ("" + "am") : ("" + "pm"); break; + case 'P': c = (isAM) ? ("" + "AM") : ("" + "PM"); break; + case '0': c = ""; padNext = true; break; + } + if (c && padNext) { + c = leftPad(c); + padNext = false; + } + r.push(c); + if (!padNext) + escape = false; + } + else { + if (c == "%") + escape = true; + else + r.push(c); + } + } + return r.join(""); + }; + + // round to nearby lower multiple of base + function floorInBase(n, base) { + return base * Math.floor(n / base); + } + +})(jQuery); diff --git a/theme/bootstrap/views/js/New folder/plugins/flot/jquery.flot.pie.js b/theme/bootstrap/views/js/New folder/plugins/flot/jquery.flot.pie.js new file mode 100644 index 0000000..b46c03c --- /dev/null +++ b/theme/bootstrap/views/js/New folder/plugins/flot/jquery.flot.pie.js @@ -0,0 +1,750 @@ +/* +Flot plugin for rendering pie charts. The plugin assumes the data is +coming is as a single data value for each series, and each of those +values is a positive value or zero (negative numbers don't make +any sense and will cause strange effects). The data values do +NOT need to be passed in as percentage values because it +internally calculates the total and percentages. + +* Created by Brian Medendorp, June 2009 +* Updated November 2009 with contributions from: btburnett3, Anthony Aragues and Xavi Ivars + +* Changes: + 2009-10-22: lineJoin set to round + 2009-10-23: IE full circle fix, donut + 2009-11-11: Added basic hover from btburnett3 - does not work in IE, and center is off in Chrome and Opera + 2009-11-17: Added IE hover capability submitted by Anthony Aragues + 2009-11-18: Added bug fix submitted by Xavi Ivars (issues with arrays when other JS libraries are included as well) + + +Available options are: +series: { + pie: { + show: true/false + radius: 0-1 for percentage of fullsize, or a specified pixel length, or 'auto' + innerRadius: 0-1 for percentage of fullsize or a specified pixel length, for creating a donut effect + startAngle: 0-2 factor of PI used for starting angle (in radians) i.e 3/2 starts at the top, 0 and 2 have the same result + tilt: 0-1 for percentage to tilt the pie, where 1 is no tilt, and 0 is completely flat (nothing will show) + offset: { + top: integer value to move the pie up or down + left: integer value to move the pie left or right, or 'auto' + }, + stroke: { + color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#FFF') + width: integer pixel width of the stroke + }, + label: { + show: true/false, or 'auto' + formatter: a user-defined function that modifies the text/style of the label text + radius: 0-1 for percentage of fullsize, or a specified pixel length + background: { + color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#000') + opacity: 0-1 + }, + threshold: 0-1 for the percentage value at which to hide labels (if they're too small) + }, + combine: { + threshold: 0-1 for the percentage value at which to combine slices (if they're too small) + color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#CCC'), if null, the plugin will automatically use the color of the first slice to be combined + label: any text value of what the combined slice should be labeled + } + highlight: { + opacity: 0-1 + } + } +} + +More detail and specific examples can be found in the included HTML file. + +*/ + +(function ($) +{ + function init(plot) // this is the "body" of the plugin + { + var canvas = null; + var target = null; + var maxRadius = null; + var centerLeft = null; + var centerTop = null; + var total = 0; + var redraw = true; + var redrawAttempts = 10; + var shrink = 0.95; + var legendWidth = 0; + var processed = false; + var raw = false; + + // interactive variables + var highlights = []; + + // add hook to determine if pie plugin in enabled, and then perform necessary operations + plot.hooks.processOptions.push(checkPieEnabled); + plot.hooks.bindEvents.push(bindEvents); + + // check to see if the pie plugin is enabled + function checkPieEnabled(plot, options) + { + if (options.series.pie.show) + { + //disable grid + options.grid.show = false; + + // set labels.show + if (options.series.pie.label.show=='auto') + if (options.legend.show) + options.series.pie.label.show = false; + else + options.series.pie.label.show = true; + + // set radius + if (options.series.pie.radius=='auto') + if (options.series.pie.label.show) + options.series.pie.radius = 3/4; + else + options.series.pie.radius = 1; + + // ensure sane tilt + if (options.series.pie.tilt>1) + options.series.pie.tilt=1; + if (options.series.pie.tilt<0) + options.series.pie.tilt=0; + + // add processData hook to do transformations on the data + plot.hooks.processDatapoints.push(processDatapoints); + plot.hooks.drawOverlay.push(drawOverlay); + + // add draw hook + plot.hooks.draw.push(draw); + } + } + + // bind hoverable events + function bindEvents(plot, eventHolder) + { + var options = plot.getOptions(); + + if (options.series.pie.show && options.grid.hoverable) + eventHolder.unbind('mousemove').mousemove(onMouseMove); + + if (options.series.pie.show && options.grid.clickable) + eventHolder.unbind('click').click(onClick); + } + + + // debugging function that prints out an object + function alertObject(obj) + { + var msg = ''; + function traverse(obj, depth) + { + if (!depth) + depth = 0; + for (var i = 0; i < obj.length; ++i) + { + for (var j=0; j<depth; j++) + msg += '\t'; + + if( typeof obj[i] == "object") + { // its an object + msg += ''+i+':\n'; + traverse(obj[i], depth+1); + } + else + { // its a value + msg += ''+i+': '+obj[i]+'\n'; + } + } + } + traverse(obj); + alert(msg); + } + + function calcTotal(data) + { + for (var i = 0; i < data.length; ++i) + { + var item = parseFloat(data[i].data[0][1]); + if (item) + total += item; + } + } + + function processDatapoints(plot, series, data, datapoints) + { + if (!processed) + { + processed = true; + + canvas = plot.getCanvas(); + target = $(canvas).parent(); + options = plot.getOptions(); + + plot.setData(combine(plot.getData())); + } + } + + function setupPie() + { + legendWidth = target.children().filter('.legend').children().width(); + + // calculate maximum radius and center point + maxRadius = Math.min(canvas.width,(canvas.height/options.series.pie.tilt))/2; + centerTop = (canvas.height/2)+options.series.pie.offset.top; + centerLeft = (canvas.width/2); + + if (options.series.pie.offset.left=='auto') + if (options.legend.position.match('w')) + centerLeft += legendWidth/2; + else + centerLeft -= legendWidth/2; + else + centerLeft += options.series.pie.offset.left; + + if (centerLeft<maxRadius) + centerLeft = maxRadius; + else if (centerLeft>canvas.width-maxRadius) + centerLeft = canvas.width-maxRadius; + } + + function fixData(data) + { + for (var i = 0; i < data.length; ++i) + { + if (typeof(data[i].data)=='number') + data[i].data = [[1,data[i].data]]; + else if (typeof(data[i].data)=='undefined' || typeof(data[i].data[0])=='undefined') + { + if (typeof(data[i].data)!='undefined' && typeof(data[i].data.label)!='undefined') + data[i].label = data[i].data.label; // fix weirdness coming from flot + data[i].data = [[1,0]]; + + } + } + return data; + } + + function combine(data) + { + data = fixData(data); + calcTotal(data); + var combined = 0; + var numCombined = 0; + var color = options.series.pie.combine.color; + + var newdata = []; + for (var i = 0; i < data.length; ++i) + { + // make sure its a number + data[i].data[0][1] = parseFloat(data[i].data[0][1]); + if (!data[i].data[0][1]) + data[i].data[0][1] = 0; + + if (data[i].data[0][1]/total<=options.series.pie.combine.threshold) + { + combined += data[i].data[0][1]; + numCombined++; + if (!color) + color = data[i].color; + } + else + { + newdata.push({ + data: [[1,data[i].data[0][1]]], + color: data[i].color, + label: data[i].label, + angle: (data[i].data[0][1]*(Math.PI*2))/total, + percent: (data[i].data[0][1]/total*100) + }); + } + } + if (numCombined>0) + newdata.push({ + data: [[1,combined]], + color: color, + label: options.series.pie.combine.label, + angle: (combined*(Math.PI*2))/total, + percent: (combined/total*100) + }); + return newdata; + } + + function draw(plot, newCtx) + { + if (!target) return; // if no series were passed + ctx = newCtx; + + setupPie(); + var slices = plot.getData(); + + var attempts = 0; + while (redraw && attempts<redrawAttempts) + { + redraw = false; + if (attempts>0) + maxRadius *= shrink; + attempts += 1; + clear(); + if (options.series.pie.tilt<=0.8) + drawShadow(); + drawPie(); + } + if (attempts >= redrawAttempts) { + clear(); + target.prepend('<div class="error">Could not draw pie with labels contained inside canvas</div>'); + } + + if ( plot.setSeries && plot.insertLegend ) + { + plot.setSeries(slices); + plot.insertLegend(); + } + + // we're actually done at this point, just defining internal functions at this point + + function clear() + { + ctx.clearRect(0,0,canvas.width,canvas.height); + target.children().filter('.pieLabel, .pieLabelBackground').remove(); + } + + function drawShadow() + { + var shadowLeft = 5; + var shadowTop = 15; + var edge = 10; + var alpha = 0.02; + + // set radius + if (options.series.pie.radius>1) + var radius = options.series.pie.radius; + else + var radius = maxRadius * options.series.pie.radius; + + if (radius>=(canvas.width/2)-shadowLeft || radius*options.series.pie.tilt>=(canvas.height/2)-shadowTop || radius<=edge) + return; // shadow would be outside canvas, so don't draw it + + ctx.save(); + ctx.translate(shadowLeft,shadowTop); + ctx.globalAlpha = alpha; + ctx.fillStyle = '#000'; + + // center and rotate to starting position + ctx.translate(centerLeft,centerTop); + ctx.scale(1, options.series.pie.tilt); + + //radius -= edge; + for (var i=1; i<=edge; i++) + { + ctx.beginPath(); + ctx.arc(0,0,radius,0,Math.PI*2,false); + ctx.fill(); + radius -= i; + } + + ctx.restore(); + } + + function drawPie() + { + startAngle = Math.PI*options.series.pie.startAngle; + + // set radius + if (options.series.pie.radius>1) + var radius = options.series.pie.radius; + else + var radius = maxRadius * options.series.pie.radius; + + // center and rotate to starting position + ctx.save(); + ctx.translate(centerLeft,centerTop); + ctx.scale(1, options.series.pie.tilt); + //ctx.rotate(startAngle); // start at top; -- This doesn't work properly in Opera + + // draw slices + ctx.save(); + var currentAngle = startAngle; + for (var i = 0; i < slices.length; ++i) + { + slices[i].startAngle = currentAngle; + drawSlice(slices[i].angle, slices[i].color, true); + } + ctx.restore(); + + // draw slice outlines + ctx.save(); + ctx.lineWidth = options.series.pie.stroke.width; + currentAngle = startAngle; + for (var i = 0; i < slices.length; ++i) + drawSlice(slices[i].angle, options.series.pie.stroke.color, false); + ctx.restore(); + + // draw donut hole + drawDonutHole(ctx); + + // draw labels + if (options.series.pie.label.show) + drawLabels(); + + // restore to original state + ctx.restore(); + + function drawSlice(angle, color, fill) + { + if (angle<=0) + return; + + if (fill) + ctx.fillStyle = color; + else + { + ctx.strokeStyle = color; + ctx.lineJoin = 'round'; + } + + ctx.beginPath(); + if (Math.abs(angle - Math.PI*2) > 0.000000001) + ctx.moveTo(0,0); // Center of the pie + else if ($.browser.msie) + angle -= 0.0001; + //ctx.arc(0,0,radius,0,angle,false); // This doesn't work properly in Opera + ctx.arc(0,0,radius,currentAngle,currentAngle+angle,false); + ctx.closePath(); + //ctx.rotate(angle); // This doesn't work properly in Opera + currentAngle += angle; + + if (fill) + ctx.fill(); + else + ctx.stroke(); + } + + function drawLabels() + { + var currentAngle = startAngle; + + // set radius + if (options.series.pie.label.radius>1) + var radius = options.series.pie.label.radius; + else + var radius = maxRadius * options.series.pie.label.radius; + + for (var i = 0; i < slices.length; ++i) + { + if (slices[i].percent >= options.series.pie.label.threshold*100) + drawLabel(slices[i], currentAngle, i); + currentAngle += slices[i].angle; + } + + function drawLabel(slice, startAngle, index) + { + if (slice.data[0][1]==0) + return; + + // format label text + var lf = options.legend.labelFormatter, text, plf = options.series.pie.label.formatter; + if (lf) + text = lf(slice.label, slice); + else + text = slice.label; + if (plf) + text = plf(text, slice); + + var halfAngle = ((startAngle+slice.angle) + startAngle)/2; + var x = centerLeft + Math.round(Math.cos(halfAngle) * radius); + var y = centerTop + Math.round(Math.sin(halfAngle) * radius) * options.series.pie.tilt; + + var html = '<span class="pieLabel" id="pieLabel'+index+'" style="position:absolute;top:' + y + 'px;left:' + x + 'px;">' + text + "</span>"; + target.append(html); + var label = target.children('#pieLabel'+index); + var labelTop = (y - label.height()/2); + var labelLeft = (x - label.width()/2); + label.css('top', labelTop); + label.css('left', labelLeft); + + // check to make sure that the label is not outside the canvas + if (0-labelTop>0 || 0-labelLeft>0 || canvas.height-(labelTop+label.height())<0 || canvas.width-(labelLeft+label.width())<0) + redraw = true; + + if (options.series.pie.label.background.opacity != 0) { + // put in the transparent background separately to avoid blended labels and label boxes + var c = options.series.pie.label.background.color; + if (c == null) { + c = slice.color; + } + var pos = 'top:'+labelTop+'px;left:'+labelLeft+'px;'; + $('<div class="pieLabelBackground" style="position:absolute;width:' + label.width() + 'px;height:' + label.height() + 'px;' + pos +'background-color:' + c + ';"> </div>').insertBefore(label).css('opacity', options.series.pie.label.background.opacity); + } + } // end individual label function + } // end drawLabels function + } // end drawPie function + } // end draw function + + // Placed here because it needs to be accessed from multiple locations + function drawDonutHole(layer) + { + // draw donut hole + if(options.series.pie.innerRadius > 0) + { + // subtract the center + layer.save(); + innerRadius = options.series.pie.innerRadius > 1 ? options.series.pie.innerRadius : maxRadius * options.series.pie.innerRadius; + layer.globalCompositeOperation = 'destination-out'; // this does not work with excanvas, but it will fall back to using the stroke color + layer.beginPath(); + layer.fillStyle = options.series.pie.stroke.color; + layer.arc(0,0,innerRadius,0,Math.PI*2,false); + layer.fill(); + layer.closePath(); + layer.restore(); + + // add inner stroke + layer.save(); + layer.beginPath(); + layer.strokeStyle = options.series.pie.stroke.color; + layer.arc(0,0,innerRadius,0,Math.PI*2,false); + layer.stroke(); + layer.closePath(); + layer.restore(); + // TODO: add extra shadow inside hole (with a mask) if the pie is tilted. + } + } + + //-- Additional Interactive related functions -- + + function isPointInPoly(poly, pt) + { + for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i) + ((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || (poly[j][1] <= pt[1] && pt[1]< poly[i][1])) + && (pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0]) + && (c = !c); + return c; + } + + function findNearbySlice(mouseX, mouseY) + { + var slices = plot.getData(), + options = plot.getOptions(), + radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; + + for (var i = 0; i < slices.length; ++i) + { + var s = slices[i]; + + if(s.pie.show) + { + ctx.save(); + ctx.beginPath(); + ctx.moveTo(0,0); // Center of the pie + //ctx.scale(1, options.series.pie.tilt); // this actually seems to break everything when here. + ctx.arc(0,0,radius,s.startAngle,s.startAngle+s.angle,false); + ctx.closePath(); + x = mouseX-centerLeft; + y = mouseY-centerTop; + if(ctx.isPointInPath) + { + if (ctx.isPointInPath(mouseX-centerLeft, mouseY-centerTop)) + { + //alert('found slice!'); + ctx.restore(); + return {datapoint: [s.percent, s.data], dataIndex: 0, series: s, seriesIndex: i}; + } + } + else + { + // excanvas for IE doesn;t support isPointInPath, this is a workaround. + p1X = (radius * Math.cos(s.startAngle)); + p1Y = (radius * Math.sin(s.startAngle)); + p2X = (radius * Math.cos(s.startAngle+(s.angle/4))); + p2Y = (radius * Math.sin(s.startAngle+(s.angle/4))); + p3X = (radius * Math.cos(s.startAngle+(s.angle/2))); + p3Y = (radius * Math.sin(s.startAngle+(s.angle/2))); + p4X = (radius * Math.cos(s.startAngle+(s.angle/1.5))); + p4Y = (radius * Math.sin(s.startAngle+(s.angle/1.5))); + p5X = (radius * Math.cos(s.startAngle+s.angle)); + p5Y = (radius * Math.sin(s.startAngle+s.angle)); + arrPoly = [[0,0],[p1X,p1Y],[p2X,p2Y],[p3X,p3Y],[p4X,p4Y],[p5X,p5Y]]; + arrPoint = [x,y]; + // TODO: perhaps do some mathmatical trickery here with the Y-coordinate to compensate for pie tilt? + if(isPointInPoly(arrPoly, arrPoint)) + { + ctx.restore(); + return {datapoint: [s.percent, s.data], dataIndex: 0, series: s, seriesIndex: i}; + } + } + ctx.restore(); + } + } + + return null; + } + + function onMouseMove(e) + { + triggerClickHoverEvent('plothover', e); + } + + function onClick(e) + { + triggerClickHoverEvent('plotclick', e); + } + + // trigger click or hover event (they send the same parameters so we share their code) + function triggerClickHoverEvent(eventname, e) + { + var offset = plot.offset(), + canvasX = parseInt(e.pageX - offset.left), + canvasY = parseInt(e.pageY - offset.top), + item = findNearbySlice(canvasX, canvasY); + + if (options.grid.autoHighlight) + { + // clear auto-highlights + for (var i = 0; i < highlights.length; ++i) + { + var h = highlights[i]; + if (h.auto == eventname && !(item && h.series == item.series)) + unhighlight(h.series); + } + } + + // highlight the slice + if (item) + highlight(item.series, eventname); + + // trigger any hover bind events + var pos = { pageX: e.pageX, pageY: e.pageY }; + target.trigger(eventname, [ pos, item ]); + } + + function highlight(s, auto) + { + if (typeof s == "number") + s = series[s]; + + var i = indexOfHighlight(s); + if (i == -1) + { + highlights.push({ series: s, auto: auto }); + plot.triggerRedrawOverlay(); + } + else if (!auto) + highlights[i].auto = false; + } + + function unhighlight(s) + { + if (s == null) + { + highlights = []; + plot.triggerRedrawOverlay(); + } + + if (typeof s == "number") + s = series[s]; + + var i = indexOfHighlight(s); + if (i != -1) + { + highlights.splice(i, 1); + plot.triggerRedrawOverlay(); + } + } + + function indexOfHighlight(s) + { + for (var i = 0; i < highlights.length; ++i) + { + var h = highlights[i]; + if (h.series == s) + return i; + } + return -1; + } + + function drawOverlay(plot, octx) + { + //alert(options.series.pie.radius); + var options = plot.getOptions(); + //alert(options.series.pie.radius); + + var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; + + octx.save(); + octx.translate(centerLeft, centerTop); + octx.scale(1, options.series.pie.tilt); + + for (i = 0; i < highlights.length; ++i) + drawHighlight(highlights[i].series); + + drawDonutHole(octx); + + octx.restore(); + + function drawHighlight(series) + { + if (series.angle < 0) return; + + //octx.fillStyle = parseColor(options.series.pie.highlight.color).scale(null, null, null, options.series.pie.highlight.opacity).toString(); + octx.fillStyle = "rgba(255, 255, 255, "+options.series.pie.highlight.opacity+")"; // this is temporary until we have access to parseColor + + octx.beginPath(); + if (Math.abs(series.angle - Math.PI*2) > 0.000000001) + octx.moveTo(0,0); // Center of the pie + octx.arc(0,0,radius,series.startAngle,series.startAngle+series.angle,false); + octx.closePath(); + octx.fill(); + } + + } + + } // end init (plugin body) + + // define pie specific options and their default values + var options = { + series: { + pie: { + show: false, + radius: 'auto', // actual radius of the visible pie (based on full calculated radius if <=1, or hard pixel value) + innerRadius:0, /* for donut */ + startAngle: 3/2, + tilt: 1, + offset: { + top: 0, + left: 'auto' + }, + stroke: { + color: '#FFF', + width: 1 + }, + label: { + show: 'auto', + formatter: function(label, slice){ + return '<div style="font-size:x-small;text-align:center;padding:2px;color:'+slice.color+';">'+label+'<br/>'+Math.round(slice.percent)+'%</div>'; + }, // formatter function + radius: 1, // radius at which to place the labels (based on full calculated radius if <=1, or hard pixel value) + background: { + color: null, + opacity: 0 + }, + threshold: 0 // percentage at which to hide the label (i.e. the slice is too narrow) + }, + combine: { + threshold: -1, // percentage at which to combine little slices into one larger slice + color: null, // color to give the new slice (auto-generated if null) + label: 'Other' // label to give the new slice + }, + highlight: { + //color: '#FFF', // will add this functionality once parseColor is available + opacity: 0.5 + } + } + } + }; + + $.plot.plugins.push({ + init: init, + options: options, + name: "pie", + version: "1.0" + }); +})(jQuery); diff --git a/theme/bootstrap/views/js/New folder/plugins/flot/jquery.flot.resize.js b/theme/bootstrap/views/js/New folder/plugins/flot/jquery.flot.resize.js new file mode 100644 index 0000000..1178425 --- /dev/null +++ b/theme/bootstrap/views/js/New folder/plugins/flot/jquery.flot.resize.js @@ -0,0 +1,60 @@ +/* Flot plugin for automatically redrawing plots as the placeholder resizes. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +It works by listening for changes on the placeholder div (through the jQuery +resize event plugin) - if the size changes, it will redraw the plot. + +There are no options. If you need to disable the plugin for some plots, you +can just fix the size of their placeholders. + +*/ + +/* Inline dependency: + * jQuery resize event - v1.1 - 3/14/2010 + * http://benalman.com/projects/jquery-resize-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ + +(function($,h,c){var a=$([]),e=$.resize=$.extend($.resize,{}),i,k="setTimeout",j="resize",d=j+"-special-event",b="delay",f="throttleWindow";e[b]=250;e[f]=true;$.event.special[j]={setup:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.add(l);$.data(this,d,{w:l.width(),h:l.height()});if(a.length===1){g()}},teardown:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.not(l);l.removeData(d);if(!a.length){clearTimeout(i)}},add:function(l){if(!e[f]&&this[k]){return false}var n;function m(s,o,p){var q=$(this),r=$.data(this,d);r.w=o!==c?o:q.width();r.h=p!==c?p:q.height();n.apply(this,arguments)}if($.isFunction(l)){n=l;return m}else{n=l.handler;l.handler=m}}};function g(){i=h[k](function(){a.each(function(){var n=$(this),m=n.width(),l=n.height(),o=$.data(this,d);if(m!==o.w||l!==o.h){n.trigger(j,[o.w=m,o.h=l])}});g()},e[b])}})(jQuery,this); + +(function ($) { + var options = { }; // no options + + function init(plot) { + function onResize() { + var placeholder = plot.getPlaceholder(); + + // somebody might have hidden us and we can't plot + // when we don't have the dimensions + if (placeholder.width() == 0 || placeholder.height() == 0) + return; + + plot.resize(); + plot.setupGrid(); + plot.draw(); + } + + function bindEvents(plot, eventHolder) { + plot.getPlaceholder().resize(onResize); + } + + function shutdown(plot, eventHolder) { + plot.getPlaceholder().unbind("resize", onResize); + } + + plot.hooks.bindEvents.push(bindEvents); + plot.hooks.shutdown.push(shutdown); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'resize', + version: '1.0' + }); +})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/views/js/New folder/plugins/flot/jquery.flot.tooltip.min.js b/theme/bootstrap/views/js/New folder/plugins/flot/jquery.flot.tooltip.min.js new file mode 100644 index 0000000..09e3bbf --- /dev/null +++ b/theme/bootstrap/views/js/New folder/plugins/flot/jquery.flot.tooltip.min.js @@ -0,0 +1,12 @@ +/* + * jquery.flot.tooltip + * + * description: easy-to-use tooltips for Flot charts + * version: 0.6.2 + * author: Krzysztof Urbas @krzysu [myviews.pl] + * website: https://github.com/krzysu/flot.tooltip + * + * build on 2013-09-30 + * released under MIT License, 2012 +*/ +(function(t){var o={tooltip:!1,tooltipOpts:{content:"%s | X: %x | Y: %y",xDateFormat:null,yDateFormat:null,shifts:{x:10,y:20},defaultTheme:!0,onHover:function(){}}},i=function(t){this.tipPosition={x:0,y:0},this.init(t)};i.prototype.init=function(o){function i(t){var o={};o.x=t.pageX,o.y=t.pageY,s.updateTooltipPosition(o)}function e(t,o,i){var e=s.getDomElement();if(i){var n;n=s.stringFormat(s.tooltipOptions.content,i),e.html(n),s.updateTooltipPosition({x:o.pageX,y:o.pageY}),e.css({left:s.tipPosition.x+s.tooltipOptions.shifts.x,top:s.tipPosition.y+s.tooltipOptions.shifts.y}).show(),"function"==typeof s.tooltipOptions.onHover&&s.tooltipOptions.onHover(i,e)}else e.hide().html("")}var s=this;o.hooks.bindEvents.push(function(o,n){s.plotOptions=o.getOptions(),s.plotOptions.tooltip!==!1&&void 0!==s.plotOptions.tooltip&&(s.tooltipOptions=s.plotOptions.tooltipOpts,s.getDomElement(),t(o.getPlaceholder()).bind("plothover",e),t(n).bind("mousemove",i))}),o.hooks.shutdown.push(function(o,s){t(o.getPlaceholder()).unbind("plothover",e),t(s).unbind("mousemove",i)})},i.prototype.getDomElement=function(){var o;return t("#flotTip").length>0?o=t("#flotTip"):(o=t("<div />").attr("id","flotTip"),o.appendTo("body").hide().css({position:"absolute"}),this.tooltipOptions.defaultTheme&&o.css({background:"#fff","z-index":"100",padding:"0.4em 0.6em","border-radius":"0.5em","font-size":"0.8em",border:"1px solid #111",display:"none","white-space":"nowrap"})),o},i.prototype.updateTooltipPosition=function(o){var i=t("#flotTip").outerWidth()+this.tooltipOptions.shifts.x,e=t("#flotTip").outerHeight()+this.tooltipOptions.shifts.y;o.x-t(window).scrollLeft()>t(window).innerWidth()-i&&(o.x-=i),o.y-t(window).scrollTop()>t(window).innerHeight()-e&&(o.y-=e),this.tipPosition.x=o.x,this.tipPosition.y=o.y},i.prototype.stringFormat=function(t,o){var i=/%p\.{0,1}(\d{0,})/,e=/%s/,s=/%x\.{0,1}(?:\d{0,})/,n=/%y\.{0,1}(?:\d{0,})/;return"function"==typeof t&&(t=t(o.series.label,o.series.data[o.dataIndex][0],o.series.data[o.dataIndex][1],o)),o.series.percent!==void 0&&(t=this.adjustValPrecision(i,t,o.series.percent)),o.series.label!==void 0&&(t=t.replace(e,o.series.label)),this.isTimeMode("xaxis",o)&&this.isXDateFormat(o)&&(t=t.replace(s,this.timestampToDate(o.series.data[o.dataIndex][0],this.tooltipOptions.xDateFormat))),this.isTimeMode("yaxis",o)&&this.isYDateFormat(o)&&(t=t.replace(n,this.timestampToDate(o.series.data[o.dataIndex][1],this.tooltipOptions.yDateFormat))),"number"==typeof o.series.data[o.dataIndex][0]&&(t=this.adjustValPrecision(s,t,o.series.data[o.dataIndex][0])),"number"==typeof o.series.data[o.dataIndex][1]&&(t=this.adjustValPrecision(n,t,o.series.data[o.dataIndex][1])),o.series.xaxis.tickFormatter!==void 0&&(t=t.replace(s,o.series.xaxis.tickFormatter(o.series.data[o.dataIndex][0],o.series.xaxis))),o.series.yaxis.tickFormatter!==void 0&&(t=t.replace(n,o.series.yaxis.tickFormatter(o.series.data[o.dataIndex][1],o.series.yaxis))),t},i.prototype.isTimeMode=function(t,o){return o.series[t].options.mode!==void 0&&"time"===o.series[t].options.mode},i.prototype.isXDateFormat=function(){return this.tooltipOptions.xDateFormat!==void 0&&null!==this.tooltipOptions.xDateFormat},i.prototype.isYDateFormat=function(){return this.tooltipOptions.yDateFormat!==void 0&&null!==this.tooltipOptions.yDateFormat},i.prototype.timestampToDate=function(o,i){var e=new Date(o);return t.plot.formatDate(e,i)},i.prototype.adjustValPrecision=function(t,o,i){var e,s=o.match(t);return null!==s&&""!==RegExp.$1&&(e=RegExp.$1,i=i.toFixed(e),o=o.replace(t,i)),o};var e=function(t){new i(t)};t.plot.plugins.push({init:e,options:o,name:"tooltip",version:"0.6.1"})})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/views/js/New folder/plugins/morris/morris-data.js b/theme/bootstrap/views/js/New folder/plugins/morris/morris-data.js new file mode 100644 index 0000000..f9dcb05 --- /dev/null +++ b/theme/bootstrap/views/js/New folder/plugins/morris/morris-data.js @@ -0,0 +1,227 @@ +// Morris.js Charts sample data for SB Admin template + +$(function() { + + // Area Chart + Morris.Area({ + element: 'morris-area-chart', + data: [{ + period: '2010 Q1', + iphone: 2666, + ipad: null, + itouch: 2647 + }, { + period: '2010 Q2', + iphone: 2778, + ipad: 2294, + itouch: 2441 + }, { + period: '2010 Q3', + iphone: 4912, + ipad: 1969, + itouch: 2501 + }, { + period: '2010 Q4', + iphone: 3767, + ipad: 3597, + itouch: 5689 + }, { + period: '2011 Q1', + iphone: 6810, + ipad: 1914, + itouch: 2293 + }, { + period: '2011 Q2', + iphone: 5670, + ipad: 4293, + itouch: 1881 + }, { + period: '2011 Q3', + iphone: 4820, + ipad: 3795, + itouch: 1588 + }, { + period: '2011 Q4', + iphone: 15073, + ipad: 5967, + itouch: 5175 + }, { + period: '2012 Q1', + iphone: 10687, + ipad: 4460, + itouch: 2028 + }, { + period: '2012 Q2', + iphone: 8432, + ipad: 5713, + itouch: 1791 + }], + xkey: 'period', + ykeys: ['iphone', 'ipad', 'itouch'], + labels: ['iPhone', 'iPad', 'iPod Touch'], + pointSize: 2, + hideHover: 'auto', + resize: true + }); + + // Donut Chart + Morris.Donut({ + element: 'morris-donut-chart', + data: [{ + label: "Download Sales", + value: 12 + }, { + label: "In-Store Sales", + value: 30 + }, { + label: "Mail-Order Sales", + value: 20 + }], + resize: true + }); + + // Line Chart + Morris.Line({ + // ID of the element in which to draw the chart. + element: 'morris-line-chart', + // Chart data records -- each entry in this array corresponds to a point on + // the chart. + data: [{ + d: '2012-10-01', + visits: 802 + }, { + d: '2012-10-02', + visits: 783 + }, { + d: '2012-10-03', + visits: 820 + }, { + d: '2012-10-04', + visits: 839 + }, { + d: '2012-10-05', + visits: 792 + }, { + d: '2012-10-06', + visits: 859 + }, { + d: '2012-10-07', + visits: 790 + }, { + d: '2012-10-08', + visits: 1680 + }, { + d: '2012-10-09', + visits: 1592 + }, { + d: '2012-10-10', + visits: 1420 + }, { + d: '2012-10-11', + visits: 882 + }, { + d: '2012-10-12', + visits: 889 + }, { + d: '2012-10-13', + visits: 819 + }, { + d: '2012-10-14', + visits: 849 + }, { + d: '2012-10-15', + visits: 870 + }, { + d: '2012-10-16', + visits: 1063 + }, { + d: '2012-10-17', + visits: 1192 + }, { + d: '2012-10-18', + visits: 1224 + }, { + d: '2012-10-19', + visits: 1329 + }, { + d: '2012-10-20', + visits: 1329 + }, { + d: '2012-10-21', + visits: 1239 + }, { + d: '2012-10-22', + visits: 1190 + }, { + d: '2012-10-23', + visits: 1312 + }, { + d: '2012-10-24', + visits: 1293 + }, { + d: '2012-10-25', + visits: 1283 + }, { + d: '2012-10-26', + visits: 1248 + }, { + d: '2012-10-27', + visits: 1323 + }, { + d: '2012-10-28', + visits: 1390 + }, { + d: '2012-10-29', + visits: 1420 + }, { + d: '2012-10-30', + visits: 1529 + }, { + d: '2012-10-31', + visits: 1892 + }, ], + // The name of the data record attribute that contains x-visitss. + xkey: 'd', + // A list of names of data record attributes that contain y-visitss. + ykeys: ['visits'], + // Labels for the ykeys -- will be displayed when you hover over the + // chart. + labels: ['Visits'], + // Disables line smoothing + smooth: false, + resize: true + }); + + // Bar Chart + Morris.Bar({ + element: 'morris-bar-chart', + data: [{ + device: 'iPhone', + geekbench: 136 + }, { + device: 'iPhone 3G', + geekbench: 137 + }, { + device: 'iPhone 3GS', + geekbench: 275 + }, { + device: 'iPhone 4', + geekbench: 380 + }, { + device: 'iPhone 4S', + geekbench: 655 + }, { + device: 'iPhone 5', + geekbench: 1571 + }], + xkey: 'device', + ykeys: ['geekbench'], + labels: ['Geekbench'], + barRatio: 0.4, + xLabelAngle: 35, + hideHover: 'auto', + resize: true + }); + + +}); diff --git a/theme/bootstrap/views/js/New folder/plugins/morris/morris.js b/theme/bootstrap/views/js/New folder/plugins/morris/morris.js new file mode 100644 index 0000000..3a1a830 --- /dev/null +++ b/theme/bootstrap/views/js/New folder/plugins/morris/morris.js @@ -0,0 +1,1892 @@ +/* @license +morris.js v0.5.0 +Copyright 2014 Olly Smith All rights reserved. +Licensed under the BSD-2-Clause License. +*/ + + +(function() { + var $, Morris, minutesSpecHelper, secondsSpecHelper, + __slice = [].slice, + __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + Morris = window.Morris = {}; + + $ = jQuery; + + Morris.EventEmitter = (function() { + function EventEmitter() {} + + EventEmitter.prototype.on = function(name, handler) { + if (this.handlers == null) { + this.handlers = {}; + } + if (this.handlers[name] == null) { + this.handlers[name] = []; + } + this.handlers[name].push(handler); + return this; + }; + + EventEmitter.prototype.fire = function() { + var args, handler, name, _i, _len, _ref, _results; + name = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; + if ((this.handlers != null) && (this.handlers[name] != null)) { + _ref = this.handlers[name]; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + handler = _ref[_i]; + _results.push(handler.apply(null, args)); + } + return _results; + } + }; + + return EventEmitter; + + })(); + + Morris.commas = function(num) { + var absnum, intnum, ret, strabsnum; + if (num != null) { + ret = num < 0 ? "-" : ""; + absnum = Math.abs(num); + intnum = Math.floor(absnum).toFixed(0); + ret += intnum.replace(/(?=(?:\d{3})+$)(?!^)/g, ','); + strabsnum = absnum.toString(); + if (strabsnum.length > intnum.length) { + ret += strabsnum.slice(intnum.length); + } + return ret; + } else { + return '-'; + } + }; + + Morris.pad2 = function(number) { + return (number < 10 ? '0' : '') + number; + }; + + Morris.Grid = (function(_super) { + __extends(Grid, _super); + + function Grid(options) { + this.resizeHandler = __bind(this.resizeHandler, this); + var _this = this; + if (typeof options.element === 'string') { + this.el = $(document.getElementById(options.element)); + } else { + this.el = $(options.element); + } + if ((this.el == null) || this.el.length === 0) { + throw new Error("Graph container element not found"); + } + if (this.el.css('position') === 'static') { + this.el.css('position', 'relative'); + } + this.options = $.extend({}, this.gridDefaults, this.defaults || {}, options); + if (typeof this.options.units === 'string') { + this.options.postUnits = options.units; + } + this.raphael = new Raphael(this.el[0]); + this.elementWidth = null; + this.elementHeight = null; + this.dirty = false; + this.selectFrom = null; + if (this.init) { + this.init(); + } + this.setData(this.options.data); + this.el.bind('mousemove', function(evt) { + var left, offset, right, width, x; + offset = _this.el.offset(); + x = evt.pageX - offset.left; + if (_this.selectFrom) { + left = _this.data[_this.hitTest(Math.min(x, _this.selectFrom))]._x; + right = _this.data[_this.hitTest(Math.max(x, _this.selectFrom))]._x; + width = right - left; + return _this.selectionRect.attr({ + x: left, + width: width + }); + } else { + return _this.fire('hovermove', x, evt.pageY - offset.top); + } + }); + this.el.bind('mouseleave', function(evt) { + if (_this.selectFrom) { + _this.selectionRect.hide(); + _this.selectFrom = null; + } + return _this.fire('hoverout'); + }); + this.el.bind('touchstart touchmove touchend', function(evt) { + var offset, touch; + touch = evt.originalEvent.touches[0] || evt.originalEvent.changedTouches[0]; + offset = _this.el.offset(); + return _this.fire('hovermove', touch.pageX - offset.left, touch.pageY - offset.top); + }); + this.el.bind('click', function(evt) { + var offset; + offset = _this.el.offset(); + return _this.fire('gridclick', evt.pageX - offset.left, evt.pageY - offset.top); + }); + if (this.options.rangeSelect) { + this.selectionRect = this.raphael.rect(0, 0, 0, this.el.innerHeight()).attr({ + fill: this.options.rangeSelectColor, + stroke: false + }).toBack().hide(); + this.el.bind('mousedown', function(evt) { + var offset; + offset = _this.el.offset(); + return _this.startRange(evt.pageX - offset.left); + }); + this.el.bind('mouseup', function(evt) { + var offset; + offset = _this.el.offset(); + _this.endRange(evt.pageX - offset.left); + return _this.fire('hovermove', evt.pageX - offset.left, evt.pageY - offset.top); + }); + } + if (this.options.resize) { + $(window).bind('resize', function(evt) { + if (_this.timeoutId != null) { + window.clearTimeout(_this.timeoutId); + } + return _this.timeoutId = window.setTimeout(_this.resizeHandler, 100); + }); + } + this.el.css('-webkit-tap-highlight-color', 'rgba(0,0,0,0)'); + if (this.postInit) { + this.postInit(); + } + } + + Grid.prototype.gridDefaults = { + dateFormat: null, + axes: true, + grid: true, + gridLineColor: '#aaa', + gridStrokeWidth: 0.5, + gridTextColor: '#888', + gridTextSize: 12, + gridTextFamily: 'sans-serif', + gridTextWeight: 'normal', + hideHover: false, + yLabelFormat: null, + xLabelAngle: 0, + numLines: 5, + padding: 25, + parseTime: true, + postUnits: '', + preUnits: '', + ymax: 'auto', + ymin: 'auto 0', + goals: [], + goalStrokeWidth: 1.0, + goalLineColors: ['#666633', '#999966', '#cc6666', '#663333'], + events: [], + eventStrokeWidth: 1.0, + eventLineColors: ['#005a04', '#ccffbb', '#3a5f0b', '#005502'], + rangeSelect: null, + rangeSelectColor: '#eef', + resize: false + }; + + Grid.prototype.setData = function(data, redraw) { + var e, idx, index, maxGoal, minGoal, ret, row, step, total, y, ykey, ymax, ymin, yval, _ref; + if (redraw == null) { + redraw = true; + } + this.options.data = data; + if ((data == null) || data.length === 0) { + this.data = []; + this.raphael.clear(); + if (this.hover != null) { + this.hover.hide(); + } + return; + } + ymax = this.cumulative ? 0 : null; + ymin = this.cumulative ? 0 : null; + if (this.options.goals.length > 0) { + minGoal = Math.min.apply(Math, this.options.goals); + maxGoal = Math.max.apply(Math, this.options.goals); + ymin = ymin != null ? Math.min(ymin, minGoal) : minGoal; + ymax = ymax != null ? Math.max(ymax, maxGoal) : maxGoal; + } + this.data = (function() { + var _i, _len, _results; + _results = []; + for (index = _i = 0, _len = data.length; _i < _len; index = ++_i) { + row = data[index]; + ret = { + src: row + }; + ret.label = row[this.options.xkey]; + if (this.options.parseTime) { + ret.x = Morris.parseDate(ret.label); + if (this.options.dateFormat) { + ret.label = this.options.dateFormat(ret.x); + } else if (typeof ret.label === 'number') { + ret.label = new Date(ret.label).toString(); + } + } else { + ret.x = index; + if (this.options.xLabelFormat) { + ret.label = this.options.xLabelFormat(ret); + } + } + total = 0; + ret.y = (function() { + var _j, _len1, _ref, _results1; + _ref = this.options.ykeys; + _results1 = []; + for (idx = _j = 0, _len1 = _ref.length; _j < _len1; idx = ++_j) { + ykey = _ref[idx]; + yval = row[ykey]; + if (typeof yval === 'string') { + yval = parseFloat(yval); + } + if ((yval != null) && typeof yval !== 'number') { + yval = null; + } + if (yval != null) { + if (this.cumulative) { + total += yval; + } else { + if (ymax != null) { + ymax = Math.max(yval, ymax); + ymin = Math.min(yval, ymin); + } else { + ymax = ymin = yval; + } + } + } + if (this.cumulative && (total != null)) { + ymax = Math.max(total, ymax); + ymin = Math.min(total, ymin); + } + _results1.push(yval); + } + return _results1; + }).call(this); + _results.push(ret); + } + return _results; + }).call(this); + if (this.options.parseTime) { + this.data = this.data.sort(function(a, b) { + return (a.x > b.x) - (b.x > a.x); + }); + } + this.xmin = this.data[0].x; + this.xmax = this.data[this.data.length - 1].x; + this.events = []; + if (this.options.events.length > 0) { + if (this.options.parseTime) { + this.events = (function() { + var _i, _len, _ref, _results; + _ref = this.options.events; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + e = _ref[_i]; + _results.push(Morris.parseDate(e)); + } + return _results; + }).call(this); + } else { + this.events = this.options.events; + } + this.xmax = Math.max(this.xmax, Math.max.apply(Math, this.events)); + this.xmin = Math.min(this.xmin, Math.min.apply(Math, this.events)); + } + if (this.xmin === this.xmax) { + this.xmin -= 1; + this.xmax += 1; + } + this.ymin = this.yboundary('min', ymin); + this.ymax = this.yboundary('max', ymax); + if (this.ymin === this.ymax) { + if (ymin) { + this.ymin -= 1; + } + this.ymax += 1; + } + if (((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'y') || this.options.grid === true) { + if (this.options.ymax === this.gridDefaults.ymax && this.options.ymin === this.gridDefaults.ymin) { + this.grid = this.autoGridLines(this.ymin, this.ymax, this.options.numLines); + this.ymin = Math.min(this.ymin, this.grid[0]); + this.ymax = Math.max(this.ymax, this.grid[this.grid.length - 1]); + } else { + step = (this.ymax - this.ymin) / (this.options.numLines - 1); + this.grid = (function() { + var _i, _ref1, _ref2, _results; + _results = []; + for (y = _i = _ref1 = this.ymin, _ref2 = this.ymax; step > 0 ? _i <= _ref2 : _i >= _ref2; y = _i += step) { + _results.push(y); + } + return _results; + }).call(this); + } + } + this.dirty = true; + if (redraw) { + return this.redraw(); + } + }; + + Grid.prototype.yboundary = function(boundaryType, currentValue) { + var boundaryOption, suggestedValue; + boundaryOption = this.options["y" + boundaryType]; + if (typeof boundaryOption === 'string') { + if (boundaryOption.slice(0, 4) === 'auto') { + if (boundaryOption.length > 5) { + suggestedValue = parseInt(boundaryOption.slice(5), 10); + if (currentValue == null) { + return suggestedValue; + } + return Math[boundaryType](currentValue, suggestedValue); + } else { + if (currentValue != null) { + return currentValue; + } else { + return 0; + } + } + } else { + return parseInt(boundaryOption, 10); + } + } else { + return boundaryOption; + } + }; + + Grid.prototype.autoGridLines = function(ymin, ymax, nlines) { + var gmax, gmin, grid, smag, span, step, unit, y, ymag; + span = ymax - ymin; + ymag = Math.floor(Math.log(span) / Math.log(10)); + unit = Math.pow(10, ymag); + gmin = Math.floor(ymin / unit) * unit; + gmax = Math.ceil(ymax / unit) * unit; + step = (gmax - gmin) / (nlines - 1); + if (unit === 1 && step > 1 && Math.ceil(step) !== step) { + step = Math.ceil(step); + gmax = gmin + step * (nlines - 1); + } + if (gmin < 0 && gmax > 0) { + gmin = Math.floor(ymin / step) * step; + gmax = Math.ceil(ymax / step) * step; + } + if (step < 1) { + smag = Math.floor(Math.log(step) / Math.log(10)); + grid = (function() { + var _i, _results; + _results = []; + for (y = _i = gmin; step > 0 ? _i <= gmax : _i >= gmax; y = _i += step) { + _results.push(parseFloat(y.toFixed(1 - smag))); + } + return _results; + })(); + } else { + grid = (function() { + var _i, _results; + _results = []; + for (y = _i = gmin; step > 0 ? _i <= gmax : _i >= gmax; y = _i += step) { + _results.push(y); + } + return _results; + })(); + } + return grid; + }; + + Grid.prototype._calc = function() { + var bottomOffsets, gridLine, h, i, w, yLabelWidths, _ref, _ref1; + w = this.el.width(); + h = this.el.height(); + if (this.elementWidth !== w || this.elementHeight !== h || this.dirty) { + this.elementWidth = w; + this.elementHeight = h; + this.dirty = false; + this.left = this.options.padding; + this.right = this.elementWidth - this.options.padding; + this.top = this.options.padding; + this.bottom = this.elementHeight - this.options.padding; + if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'y') { + yLabelWidths = (function() { + var _i, _len, _ref1, _results; + _ref1 = this.grid; + _results = []; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + gridLine = _ref1[_i]; + _results.push(this.measureText(this.yAxisFormat(gridLine)).width); + } + return _results; + }).call(this); + this.left += Math.max.apply(Math, yLabelWidths); + } + if ((_ref1 = this.options.axes) === true || _ref1 === 'both' || _ref1 === 'x') { + bottomOffsets = (function() { + var _i, _ref2, _results; + _results = []; + for (i = _i = 0, _ref2 = this.data.length; 0 <= _ref2 ? _i < _ref2 : _i > _ref2; i = 0 <= _ref2 ? ++_i : --_i) { + _results.push(this.measureText(this.data[i].text, -this.options.xLabelAngle).height); + } + return _results; + }).call(this); + this.bottom -= Math.max.apply(Math, bottomOffsets); + } + this.width = Math.max(1, this.right - this.left); + this.height = Math.max(1, this.bottom - this.top); + this.dx = this.width / (this.xmax - this.xmin); + this.dy = this.height / (this.ymax - this.ymin); + if (this.calc) { + return this.calc(); + } + } + }; + + Grid.prototype.transY = function(y) { + return this.bottom - (y - this.ymin) * this.dy; + }; + + Grid.prototype.transX = function(x) { + if (this.data.length === 1) { + return (this.left + this.right) / 2; + } else { + return this.left + (x - this.xmin) * this.dx; + } + }; + + Grid.prototype.redraw = function() { + this.raphael.clear(); + this._calc(); + this.drawGrid(); + this.drawGoals(); + this.drawEvents(); + if (this.draw) { + return this.draw(); + } + }; + + Grid.prototype.measureText = function(text, angle) { + var ret, tt; + if (angle == null) { + angle = 0; + } + tt = this.raphael.text(100, 100, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).rotate(angle); + ret = tt.getBBox(); + tt.remove(); + return ret; + }; + + Grid.prototype.yAxisFormat = function(label) { + return this.yLabelFormat(label); + }; + + Grid.prototype.yLabelFormat = function(label) { + if (typeof this.options.yLabelFormat === 'function') { + return this.options.yLabelFormat(label); + } else { + return "" + this.options.preUnits + (Morris.commas(label)) + this.options.postUnits; + } + }; + + Grid.prototype.drawGrid = function() { + var lineY, y, _i, _len, _ref, _ref1, _ref2, _results; + if (this.options.grid === false && ((_ref = this.options.axes) !== true && _ref !== 'both' && _ref !== 'y')) { + return; + } + _ref1 = this.grid; + _results = []; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + lineY = _ref1[_i]; + y = this.transY(lineY); + if ((_ref2 = this.options.axes) === true || _ref2 === 'both' || _ref2 === 'y') { + this.drawYAxisLabel(this.left - this.options.padding / 2, y, this.yAxisFormat(lineY)); + } + if (this.options.grid) { + _results.push(this.drawGridLine("M" + this.left + "," + y + "H" + (this.left + this.width))); + } else { + _results.push(void 0); + } + } + return _results; + }; + + Grid.prototype.drawGoals = function() { + var color, goal, i, _i, _len, _ref, _results; + _ref = this.options.goals; + _results = []; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + goal = _ref[i]; + color = this.options.goalLineColors[i % this.options.goalLineColors.length]; + _results.push(this.drawGoal(goal, color)); + } + return _results; + }; + + Grid.prototype.drawEvents = function() { + var color, event, i, _i, _len, _ref, _results; + _ref = this.events; + _results = []; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + event = _ref[i]; + color = this.options.eventLineColors[i % this.options.eventLineColors.length]; + _results.push(this.drawEvent(event, color)); + } + return _results; + }; + + Grid.prototype.drawGoal = function(goal, color) { + return this.raphael.path("M" + this.left + "," + (this.transY(goal)) + "H" + this.right).attr('stroke', color).attr('stroke-width', this.options.goalStrokeWidth); + }; + + Grid.prototype.drawEvent = function(event, color) { + return this.raphael.path("M" + (this.transX(event)) + "," + this.bottom + "V" + this.top).attr('stroke', color).attr('stroke-width', this.options.eventStrokeWidth); + }; + + Grid.prototype.drawYAxisLabel = function(xPos, yPos, text) { + return this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor).attr('text-anchor', 'end'); + }; + + Grid.prototype.drawGridLine = function(path) { + return this.raphael.path(path).attr('stroke', this.options.gridLineColor).attr('stroke-width', this.options.gridStrokeWidth); + }; + + Grid.prototype.startRange = function(x) { + this.hover.hide(); + this.selectFrom = x; + return this.selectionRect.attr({ + x: x, + width: 0 + }).show(); + }; + + Grid.prototype.endRange = function(x) { + var end, start; + if (this.selectFrom) { + start = Math.min(this.selectFrom, x); + end = Math.max(this.selectFrom, x); + this.options.rangeSelect.call(this.el, { + start: this.data[this.hitTest(start)].x, + end: this.data[this.hitTest(end)].x + }); + return this.selectFrom = null; + } + }; + + Grid.prototype.resizeHandler = function() { + this.timeoutId = null; + this.raphael.setSize(this.el.width(), this.el.height()); + return this.redraw(); + }; + + return Grid; + + })(Morris.EventEmitter); + + Morris.parseDate = function(date) { + var isecs, m, msecs, n, o, offsetmins, p, q, r, ret, secs; + if (typeof date === 'number') { + return date; + } + m = date.match(/^(\d+) Q(\d)$/); + n = date.match(/^(\d+)-(\d+)$/); + o = date.match(/^(\d+)-(\d+)-(\d+)$/); + p = date.match(/^(\d+) W(\d+)$/); + q = date.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+)(Z|([+-])(\d\d):?(\d\d))?$/); + r = date.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+):(\d+(\.\d+)?)(Z|([+-])(\d\d):?(\d\d))?$/); + if (m) { + return new Date(parseInt(m[1], 10), parseInt(m[2], 10) * 3 - 1, 1).getTime(); + } else if (n) { + return new Date(parseInt(n[1], 10), parseInt(n[2], 10) - 1, 1).getTime(); + } else if (o) { + return new Date(parseInt(o[1], 10), parseInt(o[2], 10) - 1, parseInt(o[3], 10)).getTime(); + } else if (p) { + ret = new Date(parseInt(p[1], 10), 0, 1); + if (ret.getDay() !== 4) { + ret.setMonth(0, 1 + ((4 - ret.getDay()) + 7) % 7); + } + return ret.getTime() + parseInt(p[2], 10) * 604800000; + } else if (q) { + if (!q[6]) { + return new Date(parseInt(q[1], 10), parseInt(q[2], 10) - 1, parseInt(q[3], 10), parseInt(q[4], 10), parseInt(q[5], 10)).getTime(); + } else { + offsetmins = 0; + if (q[6] !== 'Z') { + offsetmins = parseInt(q[8], 10) * 60 + parseInt(q[9], 10); + if (q[7] === '+') { + offsetmins = 0 - offsetmins; + } + } + return Date.UTC(parseInt(q[1], 10), parseInt(q[2], 10) - 1, parseInt(q[3], 10), parseInt(q[4], 10), parseInt(q[5], 10) + offsetmins); + } + } else if (r) { + secs = parseFloat(r[6]); + isecs = Math.floor(secs); + msecs = Math.round((secs - isecs) * 1000); + if (!r[8]) { + return new Date(parseInt(r[1], 10), parseInt(r[2], 10) - 1, parseInt(r[3], 10), parseInt(r[4], 10), parseInt(r[5], 10), isecs, msecs).getTime(); + } else { + offsetmins = 0; + if (r[8] !== 'Z') { + offsetmins = parseInt(r[10], 10) * 60 + parseInt(r[11], 10); + if (r[9] === '+') { + offsetmins = 0 - offsetmins; + } + } + return Date.UTC(parseInt(r[1], 10), parseInt(r[2], 10) - 1, parseInt(r[3], 10), parseInt(r[4], 10), parseInt(r[5], 10) + offsetmins, isecs, msecs); + } + } else { + return new Date(parseInt(date, 10), 0, 1).getTime(); + } + }; + + Morris.Hover = (function() { + Hover.defaults = { + "class": 'morris-hover morris-default-style' + }; + + function Hover(options) { + if (options == null) { + options = {}; + } + this.options = $.extend({}, Morris.Hover.defaults, options); + this.el = $("<div class='" + this.options["class"] + "'></div>"); + this.el.hide(); + this.options.parent.append(this.el); + } + + Hover.prototype.update = function(html, x, y) { + if (!html) { + return this.hide(); + } else { + this.html(html); + this.show(); + return this.moveTo(x, y); + } + }; + + Hover.prototype.html = function(content) { + return this.el.html(content); + }; + + Hover.prototype.moveTo = function(x, y) { + var hoverHeight, hoverWidth, left, parentHeight, parentWidth, top; + parentWidth = this.options.parent.innerWidth(); + parentHeight = this.options.parent.innerHeight(); + hoverWidth = this.el.outerWidth(); + hoverHeight = this.el.outerHeight(); + left = Math.min(Math.max(0, x - hoverWidth / 2), parentWidth - hoverWidth); + if (y != null) { + top = y - hoverHeight - 10; + if (top < 0) { + top = y + 10; + if (top + hoverHeight > parentHeight) { + top = parentHeight / 2 - hoverHeight / 2; + } + } + } else { + top = parentHeight / 2 - hoverHeight / 2; + } + return this.el.css({ + left: left + "px", + top: parseInt(top) + "px" + }); + }; + + Hover.prototype.show = function() { + return this.el.show(); + }; + + Hover.prototype.hide = function() { + return this.el.hide(); + }; + + return Hover; + + })(); + + Morris.Line = (function(_super) { + __extends(Line, _super); + + function Line(options) { + this.hilight = __bind(this.hilight, this); + this.onHoverOut = __bind(this.onHoverOut, this); + this.onHoverMove = __bind(this.onHoverMove, this); + this.onGridClick = __bind(this.onGridClick, this); + if (!(this instanceof Morris.Line)) { + return new Morris.Line(options); + } + Line.__super__.constructor.call(this, options); + } + + Line.prototype.init = function() { + if (this.options.hideHover !== 'always') { + this.hover = new Morris.Hover({ + parent: this.el + }); + this.on('hovermove', this.onHoverMove); + this.on('hoverout', this.onHoverOut); + return this.on('gridclick', this.onGridClick); + } + }; + + Line.prototype.defaults = { + lineWidth: 3, + pointSize: 4, + lineColors: ['#0b62a4', '#7A92A3', '#4da74d', '#afd8f8', '#edc240', '#cb4b4b', '#9440ed'], + pointStrokeWidths: [1], + pointStrokeColors: ['#ffffff'], + pointFillColors: [], + smooth: true, + xLabels: 'auto', + xLabelFormat: null, + xLabelMargin: 24, + hideHover: false + }; + + Line.prototype.calc = function() { + this.calcPoints(); + return this.generatePaths(); + }; + + Line.prototype.calcPoints = function() { + var row, y, _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + row = _ref[_i]; + row._x = this.transX(row.x); + row._y = (function() { + var _j, _len1, _ref1, _results1; + _ref1 = row.y; + _results1 = []; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + y = _ref1[_j]; + if (y != null) { + _results1.push(this.transY(y)); + } else { + _results1.push(y); + } + } + return _results1; + }).call(this); + _results.push(row._ymax = Math.min.apply(Math, [this.bottom].concat((function() { + var _j, _len1, _ref1, _results1; + _ref1 = row._y; + _results1 = []; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + y = _ref1[_j]; + if (y != null) { + _results1.push(y); + } + } + return _results1; + })()))); + } + return _results; + }; + + Line.prototype.hitTest = function(x) { + var index, r, _i, _len, _ref; + if (this.data.length === 0) { + return null; + } + _ref = this.data.slice(1); + for (index = _i = 0, _len = _ref.length; _i < _len; index = ++_i) { + r = _ref[index]; + if (x < (r._x + this.data[index]._x) / 2) { + break; + } + } + return index; + }; + + Line.prototype.onGridClick = function(x, y) { + var index; + index = this.hitTest(x); + return this.fire('click', index, this.data[index].src, x, y); + }; + + Line.prototype.onHoverMove = function(x, y) { + var index; + index = this.hitTest(x); + return this.displayHoverForRow(index); + }; + + Line.prototype.onHoverOut = function() { + if (this.options.hideHover !== false) { + return this.displayHoverForRow(null); + } + }; + + Line.prototype.displayHoverForRow = function(index) { + var _ref; + if (index != null) { + (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(index)); + return this.hilight(index); + } else { + this.hover.hide(); + return this.hilight(); + } + }; + + Line.prototype.hoverContentForRow = function(index) { + var content, j, row, y, _i, _len, _ref; + row = this.data[index]; + content = "<div class='morris-hover-row-label'>" + row.label + "</div>"; + _ref = row.y; + for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) { + y = _ref[j]; + content += "<div class='morris-hover-point' style='color: " + (this.colorFor(row, j, 'label')) + "'>\n " + this.options.labels[j] + ":\n " + (this.yLabelFormat(y)) + "\n</div>"; + } + if (typeof this.options.hoverCallback === 'function') { + content = this.options.hoverCallback(index, this.options, content, row.src); + } + return [content, row._x, row._ymax]; + }; + + Line.prototype.generatePaths = function() { + var coords, i, r, smooth; + return this.paths = (function() { + var _i, _ref, _ref1, _results; + _results = []; + for (i = _i = 0, _ref = this.options.ykeys.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + smooth = typeof this.options.smooth === "boolean" ? this.options.smooth : (_ref1 = this.options.ykeys[i], __indexOf.call(this.options.smooth, _ref1) >= 0); + coords = (function() { + var _j, _len, _ref2, _results1; + _ref2 = this.data; + _results1 = []; + for (_j = 0, _len = _ref2.length; _j < _len; _j++) { + r = _ref2[_j]; + if (r._y[i] !== void 0) { + _results1.push({ + x: r._x, + y: r._y[i] + }); + } + } + return _results1; + }).call(this); + if (coords.length > 1) { + _results.push(Morris.Line.createPath(coords, smooth, this.bottom)); + } else { + _results.push(null); + } + } + return _results; + }).call(this); + }; + + Line.prototype.draw = function() { + var _ref; + if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'x') { + this.drawXAxis(); + } + this.drawSeries(); + if (this.options.hideHover === false) { + return this.displayHoverForRow(this.data.length - 1); + } + }; + + Line.prototype.drawXAxis = function() { + var drawLabel, l, labels, prevAngleMargin, prevLabelMargin, row, ypos, _i, _len, _results, + _this = this; + ypos = this.bottom + this.options.padding / 2; + prevLabelMargin = null; + prevAngleMargin = null; + drawLabel = function(labelText, xpos) { + var label, labelBox, margin, offset, textBox; + label = _this.drawXAxisLabel(_this.transX(xpos), ypos, labelText); + textBox = label.getBBox(); + label.transform("r" + (-_this.options.xLabelAngle)); + labelBox = label.getBBox(); + label.transform("t0," + (labelBox.height / 2) + "..."); + if (_this.options.xLabelAngle !== 0) { + offset = -0.5 * textBox.width * Math.cos(_this.options.xLabelAngle * Math.PI / 180.0); + label.transform("t" + offset + ",0..."); + } + labelBox = label.getBBox(); + if (((prevLabelMargin == null) || prevLabelMargin >= labelBox.x + labelBox.width || (prevAngleMargin != null) && prevAngleMargin >= labelBox.x) && labelBox.x >= 0 && (labelBox.x + labelBox.width) < _this.el.width()) { + if (_this.options.xLabelAngle !== 0) { + margin = 1.25 * _this.options.gridTextSize / Math.sin(_this.options.xLabelAngle * Math.PI / 180.0); + prevAngleMargin = labelBox.x - margin; + } + return prevLabelMargin = labelBox.x - _this.options.xLabelMargin; + } else { + return label.remove(); + } + }; + if (this.options.parseTime) { + if (this.data.length === 1 && this.options.xLabels === 'auto') { + labels = [[this.data[0].label, this.data[0].x]]; + } else { + labels = Morris.labelSeries(this.xmin, this.xmax, this.width, this.options.xLabels, this.options.xLabelFormat); + } + } else { + labels = (function() { + var _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + row = _ref[_i]; + _results.push([row.label, row.x]); + } + return _results; + }).call(this); + } + labels.reverse(); + _results = []; + for (_i = 0, _len = labels.length; _i < _len; _i++) { + l = labels[_i]; + _results.push(drawLabel(l[0], l[1])); + } + return _results; + }; + + Line.prototype.drawSeries = function() { + var i, _i, _j, _ref, _ref1, _results; + this.seriesPoints = []; + for (i = _i = _ref = this.options.ykeys.length - 1; _ref <= 0 ? _i <= 0 : _i >= 0; i = _ref <= 0 ? ++_i : --_i) { + this._drawLineFor(i); + } + _results = []; + for (i = _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; i = _ref1 <= 0 ? ++_j : --_j) { + _results.push(this._drawPointFor(i)); + } + return _results; + }; + + Line.prototype._drawPointFor = function(index) { + var circle, row, _i, _len, _ref, _results; + this.seriesPoints[index] = []; + _ref = this.data; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + row = _ref[_i]; + circle = null; + if (row._y[index] != null) { + circle = this.drawLinePoint(row._x, row._y[index], this.colorFor(row, index, 'point'), index); + } + _results.push(this.seriesPoints[index].push(circle)); + } + return _results; + }; + + Line.prototype._drawLineFor = function(index) { + var path; + path = this.paths[index]; + if (path !== null) { + return this.drawLinePath(path, this.colorFor(null, index, 'line'), index); + } + }; + + Line.createPath = function(coords, smooth, bottom) { + var coord, g, grads, i, ix, lg, path, prevCoord, x1, x2, y1, y2, _i, _len; + path = ""; + if (smooth) { + grads = Morris.Line.gradients(coords); + } + prevCoord = { + y: null + }; + for (i = _i = 0, _len = coords.length; _i < _len; i = ++_i) { + coord = coords[i]; + if (coord.y != null) { + if (prevCoord.y != null) { + if (smooth) { + g = grads[i]; + lg = grads[i - 1]; + ix = (coord.x - prevCoord.x) / 4; + x1 = prevCoord.x + ix; + y1 = Math.min(bottom, prevCoord.y + ix * lg); + x2 = coord.x - ix; + y2 = Math.min(bottom, coord.y - ix * g); + path += "C" + x1 + "," + y1 + "," + x2 + "," + y2 + "," + coord.x + "," + coord.y; + } else { + path += "L" + coord.x + "," + coord.y; + } + } else { + if (!smooth || (grads[i] != null)) { + path += "M" + coord.x + "," + coord.y; + } + } + } + prevCoord = coord; + } + return path; + }; + + Line.gradients = function(coords) { + var coord, grad, i, nextCoord, prevCoord, _i, _len, _results; + grad = function(a, b) { + return (a.y - b.y) / (a.x - b.x); + }; + _results = []; + for (i = _i = 0, _len = coords.length; _i < _len; i = ++_i) { + coord = coords[i]; + if (coord.y != null) { + nextCoord = coords[i + 1] || { + y: null + }; + prevCoord = coords[i - 1] || { + y: null + }; + if ((prevCoord.y != null) && (nextCoord.y != null)) { + _results.push(grad(prevCoord, nextCoord)); + } else if (prevCoord.y != null) { + _results.push(grad(prevCoord, coord)); + } else if (nextCoord.y != null) { + _results.push(grad(coord, nextCoord)); + } else { + _results.push(null); + } + } else { + _results.push(null); + } + } + return _results; + }; + + Line.prototype.hilight = function(index) { + var i, _i, _j, _ref, _ref1; + if (this.prevHilight !== null && this.prevHilight !== index) { + for (i = _i = 0, _ref = this.seriesPoints.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) { + if (this.seriesPoints[i][this.prevHilight]) { + this.seriesPoints[i][this.prevHilight].animate(this.pointShrinkSeries(i)); + } + } + } + if (index !== null && this.prevHilight !== index) { + for (i = _j = 0, _ref1 = this.seriesPoints.length - 1; 0 <= _ref1 ? _j <= _ref1 : _j >= _ref1; i = 0 <= _ref1 ? ++_j : --_j) { + if (this.seriesPoints[i][index]) { + this.seriesPoints[i][index].animate(this.pointGrowSeries(i)); + } + } + } + return this.prevHilight = index; + }; + + Line.prototype.colorFor = function(row, sidx, type) { + if (typeof this.options.lineColors === 'function') { + return this.options.lineColors.call(this, row, sidx, type); + } else if (type === 'point') { + return this.options.pointFillColors[sidx % this.options.pointFillColors.length] || this.options.lineColors[sidx % this.options.lineColors.length]; + } else { + return this.options.lineColors[sidx % this.options.lineColors.length]; + } + }; + + Line.prototype.drawXAxisLabel = function(xPos, yPos, text) { + return this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor); + }; + + Line.prototype.drawLinePath = function(path, lineColor, lineIndex) { + return this.raphael.path(path).attr('stroke', lineColor).attr('stroke-width', this.lineWidthForSeries(lineIndex)); + }; + + Line.prototype.drawLinePoint = function(xPos, yPos, pointColor, lineIndex) { + return this.raphael.circle(xPos, yPos, this.pointSizeForSeries(lineIndex)).attr('fill', pointColor).attr('stroke-width', this.pointStrokeWidthForSeries(lineIndex)).attr('stroke', this.pointStrokeColorForSeries(lineIndex)); + }; + + Line.prototype.pointStrokeWidthForSeries = function(index) { + return this.options.pointStrokeWidths[index % this.options.pointStrokeWidths.length]; + }; + + Line.prototype.pointStrokeColorForSeries = function(index) { + return this.options.pointStrokeColors[index % this.options.pointStrokeColors.length]; + }; + + Line.prototype.lineWidthForSeries = function(index) { + if (this.options.lineWidth instanceof Array) { + return this.options.lineWidth[index % this.options.lineWidth.length]; + } else { + return this.options.lineWidth; + } + }; + + Line.prototype.pointSizeForSeries = function(index) { + if (this.options.pointSize instanceof Array) { + return this.options.pointSize[index % this.options.pointSize.length]; + } else { + return this.options.pointSize; + } + }; + + Line.prototype.pointGrowSeries = function(index) { + return Raphael.animation({ + r: this.pointSizeForSeries(index) + 3 + }, 25, 'linear'); + }; + + Line.prototype.pointShrinkSeries = function(index) { + return Raphael.animation({ + r: this.pointSizeForSeries(index) + }, 25, 'linear'); + }; + + return Line; + + })(Morris.Grid); + + Morris.labelSeries = function(dmin, dmax, pxwidth, specName, xLabelFormat) { + var d, d0, ddensity, name, ret, s, spec, t, _i, _len, _ref; + ddensity = 200 * (dmax - dmin) / pxwidth; + d0 = new Date(dmin); + spec = Morris.LABEL_SPECS[specName]; + if (spec === void 0) { + _ref = Morris.AUTO_LABEL_ORDER; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + name = _ref[_i]; + s = Morris.LABEL_SPECS[name]; + if (ddensity >= s.span) { + spec = s; + break; + } + } + } + if (spec === void 0) { + spec = Morris.LABEL_SPECS["second"]; + } + if (xLabelFormat) { + spec = $.extend({}, spec, { + fmt: xLabelFormat + }); + } + d = spec.start(d0); + ret = []; + while ((t = d.getTime()) <= dmax) { + if (t >= dmin) { + ret.push([spec.fmt(d), t]); + } + spec.incr(d); + } + return ret; + }; + + minutesSpecHelper = function(interval) { + return { + span: interval * 60 * 1000, + start: function(d) { + return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours()); + }, + fmt: function(d) { + return "" + (Morris.pad2(d.getHours())) + ":" + (Morris.pad2(d.getMinutes())); + }, + incr: function(d) { + return d.setUTCMinutes(d.getUTCMinutes() + interval); + } + }; + }; + + secondsSpecHelper = function(interval) { + return { + span: interval * 1000, + start: function(d) { + return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes()); + }, + fmt: function(d) { + return "" + (Morris.pad2(d.getHours())) + ":" + (Morris.pad2(d.getMinutes())) + ":" + (Morris.pad2(d.getSeconds())); + }, + incr: function(d) { + return d.setUTCSeconds(d.getUTCSeconds() + interval); + } + }; + }; + + Morris.LABEL_SPECS = { + "decade": { + span: 172800000000, + start: function(d) { + return new Date(d.getFullYear() - d.getFullYear() % 10, 0, 1); + }, + fmt: function(d) { + return "" + (d.getFullYear()); + }, + incr: function(d) { + return d.setFullYear(d.getFullYear() + 10); + } + }, + "year": { + span: 17280000000, + start: function(d) { + return new Date(d.getFullYear(), 0, 1); + }, + fmt: function(d) { + return "" + (d.getFullYear()); + }, + incr: function(d) { + return d.setFullYear(d.getFullYear() + 1); + } + }, + "month": { + span: 2419200000, + start: function(d) { + return new Date(d.getFullYear(), d.getMonth(), 1); + }, + fmt: function(d) { + return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1)); + }, + incr: function(d) { + return d.setMonth(d.getMonth() + 1); + } + }, + "week": { + span: 604800000, + start: function(d) { + return new Date(d.getFullYear(), d.getMonth(), d.getDate()); + }, + fmt: function(d) { + return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1)) + "-" + (Morris.pad2(d.getDate())); + }, + incr: function(d) { + return d.setDate(d.getDate() + 7); + } + }, + "day": { + span: 86400000, + start: function(d) { + return new Date(d.getFullYear(), d.getMonth(), d.getDate()); + }, + fmt: function(d) { + return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1)) + "-" + (Morris.pad2(d.getDate())); + }, + incr: function(d) { + return d.setDate(d.getDate() + 1); + } + }, + "hour": minutesSpecHelper(60), + "30min": minutesSpecHelper(30), + "15min": minutesSpecHelper(15), + "10min": minutesSpecHelper(10), + "5min": minutesSpecHelper(5), + "minute": minutesSpecHelper(1), + "30sec": secondsSpecHelper(30), + "15sec": secondsSpecHelper(15), + "10sec": secondsSpecHelper(10), + "5sec": secondsSpecHelper(5), + "second": secondsSpecHelper(1) + }; + + Morris.AUTO_LABEL_ORDER = ["decade", "year", "month", "week", "day", "hour", "30min", "15min", "10min", "5min", "minute", "30sec", "15sec", "10sec", "5sec", "second"]; + + Morris.Area = (function(_super) { + var areaDefaults; + + __extends(Area, _super); + + areaDefaults = { + fillOpacity: 'auto', + behaveLikeLine: false + }; + + function Area(options) { + var areaOptions; + if (!(this instanceof Morris.Area)) { + return new Morris.Area(options); + } + areaOptions = $.extend({}, areaDefaults, options); + this.cumulative = !areaOptions.behaveLikeLine; + if (areaOptions.fillOpacity === 'auto') { + areaOptions.fillOpacity = areaOptions.behaveLikeLine ? .8 : 1; + } + Area.__super__.constructor.call(this, areaOptions); + } + + Area.prototype.calcPoints = function() { + var row, total, y, _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + row = _ref[_i]; + row._x = this.transX(row.x); + total = 0; + row._y = (function() { + var _j, _len1, _ref1, _results1; + _ref1 = row.y; + _results1 = []; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + y = _ref1[_j]; + if (this.options.behaveLikeLine) { + _results1.push(this.transY(y)); + } else { + total += y || 0; + _results1.push(this.transY(total)); + } + } + return _results1; + }).call(this); + _results.push(row._ymax = Math.max.apply(Math, row._y)); + } + return _results; + }; + + Area.prototype.drawSeries = function() { + var i, range, _i, _j, _k, _len, _ref, _ref1, _results, _results1, _results2; + this.seriesPoints = []; + if (this.options.behaveLikeLine) { + range = (function() { + _results = []; + for (var _i = 0, _ref = this.options.ykeys.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); } + return _results; + }).apply(this); + } else { + range = (function() { + _results1 = []; + for (var _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; _ref1 <= 0 ? _j++ : _j--){ _results1.push(_j); } + return _results1; + }).apply(this); + } + _results2 = []; + for (_k = 0, _len = range.length; _k < _len; _k++) { + i = range[_k]; + this._drawFillFor(i); + this._drawLineFor(i); + _results2.push(this._drawPointFor(i)); + } + return _results2; + }; + + Area.prototype._drawFillFor = function(index) { + var path; + path = this.paths[index]; + if (path !== null) { + path = path + ("L" + (this.transX(this.xmax)) + "," + this.bottom + "L" + (this.transX(this.xmin)) + "," + this.bottom + "Z"); + return this.drawFilledPath(path, this.fillForSeries(index)); + } + }; + + Area.prototype.fillForSeries = function(i) { + var color; + color = Raphael.rgb2hsl(this.colorFor(this.data[i], i, 'line')); + return Raphael.hsl(color.h, this.options.behaveLikeLine ? color.s * 0.9 : color.s * 0.75, Math.min(0.98, this.options.behaveLikeLine ? color.l * 1.2 : color.l * 1.25)); + }; + + Area.prototype.drawFilledPath = function(path, fill) { + return this.raphael.path(path).attr('fill', fill).attr('fill-opacity', this.options.fillOpacity).attr('stroke', 'none'); + }; + + return Area; + + })(Morris.Line); + + Morris.Bar = (function(_super) { + __extends(Bar, _super); + + function Bar(options) { + this.onHoverOut = __bind(this.onHoverOut, this); + this.onHoverMove = __bind(this.onHoverMove, this); + this.onGridClick = __bind(this.onGridClick, this); + if (!(this instanceof Morris.Bar)) { + return new Morris.Bar(options); + } + Bar.__super__.constructor.call(this, $.extend({}, options, { + parseTime: false + })); + } + + Bar.prototype.init = function() { + this.cumulative = this.options.stacked; + if (this.options.hideHover !== 'always') { + this.hover = new Morris.Hover({ + parent: this.el + }); + this.on('hovermove', this.onHoverMove); + this.on('hoverout', this.onHoverOut); + return this.on('gridclick', this.onGridClick); + } + }; + + Bar.prototype.defaults = { + barSizeRatio: 0.75, + barGap: 3, + barColors: ['#0b62a4', '#7a92a3', '#4da74d', '#afd8f8', '#edc240', '#cb4b4b', '#9440ed'], + barOpacity: 1.0, + barRadius: [0, 0, 0, 0], + xLabelMargin: 50 + }; + + Bar.prototype.calc = function() { + var _ref; + this.calcBars(); + if (this.options.hideHover === false) { + return (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(this.data.length - 1)); + } + }; + + Bar.prototype.calcBars = function() { + var idx, row, y, _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (idx = _i = 0, _len = _ref.length; _i < _len; idx = ++_i) { + row = _ref[idx]; + row._x = this.left + this.width * (idx + 0.5) / this.data.length; + _results.push(row._y = (function() { + var _j, _len1, _ref1, _results1; + _ref1 = row.y; + _results1 = []; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + y = _ref1[_j]; + if (y != null) { + _results1.push(this.transY(y)); + } else { + _results1.push(null); + } + } + return _results1; + }).call(this)); + } + return _results; + }; + + Bar.prototype.draw = function() { + var _ref; + if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'x') { + this.drawXAxis(); + } + return this.drawSeries(); + }; + + Bar.prototype.drawXAxis = function() { + var i, label, labelBox, margin, offset, prevAngleMargin, prevLabelMargin, row, textBox, ypos, _i, _ref, _results; + ypos = this.bottom + (this.options.xAxisLabelTopPadding || this.options.padding / 2); + prevLabelMargin = null; + prevAngleMargin = null; + _results = []; + for (i = _i = 0, _ref = this.data.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + row = this.data[this.data.length - 1 - i]; + label = this.drawXAxisLabel(row._x, ypos, row.label); + textBox = label.getBBox(); + label.transform("r" + (-this.options.xLabelAngle)); + labelBox = label.getBBox(); + label.transform("t0," + (labelBox.height / 2) + "..."); + if (this.options.xLabelAngle !== 0) { + offset = -0.5 * textBox.width * Math.cos(this.options.xLabelAngle * Math.PI / 180.0); + label.transform("t" + offset + ",0..."); + } + if (((prevLabelMargin == null) || prevLabelMargin >= labelBox.x + labelBox.width || (prevAngleMargin != null) && prevAngleMargin >= labelBox.x) && labelBox.x >= 0 && (labelBox.x + labelBox.width) < this.el.width()) { + if (this.options.xLabelAngle !== 0) { + margin = 1.25 * this.options.gridTextSize / Math.sin(this.options.xLabelAngle * Math.PI / 180.0); + prevAngleMargin = labelBox.x - margin; + } + _results.push(prevLabelMargin = labelBox.x - this.options.xLabelMargin); + } else { + _results.push(label.remove()); + } + } + return _results; + }; + + Bar.prototype.drawSeries = function() { + var barWidth, bottom, groupWidth, idx, lastTop, left, leftPadding, numBars, row, sidx, size, spaceLeft, top, ypos, zeroPos; + groupWidth = this.width / this.options.data.length; + numBars = this.options.stacked ? 1 : this.options.ykeys.length; + barWidth = (groupWidth * this.options.barSizeRatio - this.options.barGap * (numBars - 1)) / numBars; + if (this.options.barSize) { + barWidth = Math.min(barWidth, this.options.barSize); + } + spaceLeft = groupWidth - barWidth * numBars - this.options.barGap * (numBars - 1); + leftPadding = spaceLeft / 2; + zeroPos = this.ymin <= 0 && this.ymax >= 0 ? this.transY(0) : null; + return this.bars = (function() { + var _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (idx = _i = 0, _len = _ref.length; _i < _len; idx = ++_i) { + row = _ref[idx]; + lastTop = 0; + _results.push((function() { + var _j, _len1, _ref1, _results1; + _ref1 = row._y; + _results1 = []; + for (sidx = _j = 0, _len1 = _ref1.length; _j < _len1; sidx = ++_j) { + ypos = _ref1[sidx]; + if (ypos !== null) { + if (zeroPos) { + top = Math.min(ypos, zeroPos); + bottom = Math.max(ypos, zeroPos); + } else { + top = ypos; + bottom = this.bottom; + } + left = this.left + idx * groupWidth + leftPadding; + if (!this.options.stacked) { + left += sidx * (barWidth + this.options.barGap); + } + size = bottom - top; + if (this.options.verticalGridCondition && this.options.verticalGridCondition(row.x)) { + this.drawBar(this.left + idx * groupWidth, this.top, groupWidth, Math.abs(this.top - this.bottom), this.options.verticalGridColor, this.options.verticalGridOpacity, this.options.barRadius); + } + if (this.options.stacked) { + top -= lastTop; + } + this.drawBar(left, top, barWidth, size, this.colorFor(row, sidx, 'bar'), this.options.barOpacity, this.options.barRadius); + _results1.push(lastTop += size); + } else { + _results1.push(null); + } + } + return _results1; + }).call(this)); + } + return _results; + }).call(this); + }; + + Bar.prototype.colorFor = function(row, sidx, type) { + var r, s; + if (typeof this.options.barColors === 'function') { + r = { + x: row.x, + y: row.y[sidx], + label: row.label + }; + s = { + index: sidx, + key: this.options.ykeys[sidx], + label: this.options.labels[sidx] + }; + return this.options.barColors.call(this, r, s, type); + } else { + return this.options.barColors[sidx % this.options.barColors.length]; + } + }; + + Bar.prototype.hitTest = function(x) { + if (this.data.length === 0) { + return null; + } + x = Math.max(Math.min(x, this.right), this.left); + return Math.min(this.data.length - 1, Math.floor((x - this.left) / (this.width / this.data.length))); + }; + + Bar.prototype.onGridClick = function(x, y) { + var index; + index = this.hitTest(x); + return this.fire('click', index, this.data[index].src, x, y); + }; + + Bar.prototype.onHoverMove = function(x, y) { + var index, _ref; + index = this.hitTest(x); + return (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(index)); + }; + + Bar.prototype.onHoverOut = function() { + if (this.options.hideHover !== false) { + return this.hover.hide(); + } + }; + + Bar.prototype.hoverContentForRow = function(index) { + var content, j, row, x, y, _i, _len, _ref; + row = this.data[index]; + content = "<div class='morris-hover-row-label'>" + row.label + "</div>"; + _ref = row.y; + for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) { + y = _ref[j]; + content += "<div class='morris-hover-point' style='color: " + (this.colorFor(row, j, 'label')) + "'>\n " + this.options.labels[j] + ":\n " + (this.yLabelFormat(y)) + "\n</div>"; + } + if (typeof this.options.hoverCallback === 'function') { + content = this.options.hoverCallback(index, this.options, content, row.src); + } + x = this.left + (index + 0.5) * this.width / this.data.length; + return [content, x]; + }; + + Bar.prototype.drawXAxisLabel = function(xPos, yPos, text) { + var label; + return label = this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor); + }; + + Bar.prototype.drawBar = function(xPos, yPos, width, height, barColor, opacity, radiusArray) { + var maxRadius, path; + maxRadius = Math.max.apply(Math, radiusArray); + if (maxRadius === 0 || maxRadius > height) { + path = this.raphael.rect(xPos, yPos, width, height); + } else { + path = this.raphael.path(this.roundedRect(xPos, yPos, width, height, radiusArray)); + } + return path.attr('fill', barColor).attr('fill-opacity', opacity).attr('stroke', 'none'); + }; + + Bar.prototype.roundedRect = function(x, y, w, h, r) { + if (r == null) { + r = [0, 0, 0, 0]; + } + return ["M", x, r[0] + y, "Q", x, y, x + r[0], y, "L", x + w - r[1], y, "Q", x + w, y, x + w, y + r[1], "L", x + w, y + h - r[2], "Q", x + w, y + h, x + w - r[2], y + h, "L", x + r[3], y + h, "Q", x, y + h, x, y + h - r[3], "Z"]; + }; + + return Bar; + + })(Morris.Grid); + + Morris.Donut = (function(_super) { + __extends(Donut, _super); + + Donut.prototype.defaults = { + colors: ['#0B62A4', '#3980B5', '#679DC6', '#95BBD7', '#B0CCE1', '#095791', '#095085', '#083E67', '#052C48', '#042135'], + backgroundColor: '#FFFFFF', + labelColor: '#000000', + formatter: Morris.commas, + resize: false + }; + + function Donut(options) { + this.resizeHandler = __bind(this.resizeHandler, this); + this.select = __bind(this.select, this); + this.click = __bind(this.click, this); + var _this = this; + if (!(this instanceof Morris.Donut)) { + return new Morris.Donut(options); + } + this.options = $.extend({}, this.defaults, options); + if (typeof options.element === 'string') { + this.el = $(document.getElementById(options.element)); + } else { + this.el = $(options.element); + } + if (this.el === null || this.el.length === 0) { + throw new Error("Graph placeholder not found."); + } + if (options.data === void 0 || options.data.length === 0) { + return; + } + this.raphael = new Raphael(this.el[0]); + if (this.options.resize) { + $(window).bind('resize', function(evt) { + if (_this.timeoutId != null) { + window.clearTimeout(_this.timeoutId); + } + return _this.timeoutId = window.setTimeout(_this.resizeHandler, 100); + }); + } + this.setData(options.data); + } + + Donut.prototype.redraw = function() { + var C, cx, cy, i, idx, last, max_value, min, next, seg, total, value, w, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _results; + this.raphael.clear(); + cx = this.el.width() / 2; + cy = this.el.height() / 2; + w = (Math.min(cx, cy) - 10) / 3; + total = 0; + _ref = this.values; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + value = _ref[_i]; + total += value; + } + min = 5 / (2 * w); + C = 1.9999 * Math.PI - min * this.data.length; + last = 0; + idx = 0; + this.segments = []; + _ref1 = this.values; + for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) { + value = _ref1[i]; + next = last + min + C * (value / total); + seg = new Morris.DonutSegment(cx, cy, w * 2, w, last, next, this.data[i].color || this.options.colors[idx % this.options.colors.length], this.options.backgroundColor, idx, this.raphael); + seg.render(); + this.segments.push(seg); + seg.on('hover', this.select); + seg.on('click', this.click); + last = next; + idx += 1; + } + this.text1 = this.drawEmptyDonutLabel(cx, cy - 10, this.options.labelColor, 15, 800); + this.text2 = this.drawEmptyDonutLabel(cx, cy + 10, this.options.labelColor, 14); + max_value = Math.max.apply(Math, this.values); + idx = 0; + _ref2 = this.values; + _results = []; + for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { + value = _ref2[_k]; + if (value === max_value) { + this.select(idx); + break; + } + _results.push(idx += 1); + } + return _results; + }; + + Donut.prototype.setData = function(data) { + var row; + this.data = data; + this.values = (function() { + var _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + row = _ref[_i]; + _results.push(parseFloat(row.value)); + } + return _results; + }).call(this); + return this.redraw(); + }; + + Donut.prototype.click = function(idx) { + return this.fire('click', idx, this.data[idx]); + }; + + Donut.prototype.select = function(idx) { + var row, s, segment, _i, _len, _ref; + _ref = this.segments; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + s = _ref[_i]; + s.deselect(); + } + segment = this.segments[idx]; + segment.select(); + row = this.data[idx]; + return this.setLabels(row.label, this.options.formatter(row.value, row)); + }; + + Donut.prototype.setLabels = function(label1, label2) { + var inner, maxHeightBottom, maxHeightTop, maxWidth, text1bbox, text1scale, text2bbox, text2scale; + inner = (Math.min(this.el.width() / 2, this.el.height() / 2) - 10) * 2 / 3; + maxWidth = 1.8 * inner; + maxHeightTop = inner / 2; + maxHeightBottom = inner / 3; + this.text1.attr({ + text: label1, + transform: '' + }); + text1bbox = this.text1.getBBox(); + text1scale = Math.min(maxWidth / text1bbox.width, maxHeightTop / text1bbox.height); + this.text1.attr({ + transform: "S" + text1scale + "," + text1scale + "," + (text1bbox.x + text1bbox.width / 2) + "," + (text1bbox.y + text1bbox.height) + }); + this.text2.attr({ + text: label2, + transform: '' + }); + text2bbox = this.text2.getBBox(); + text2scale = Math.min(maxWidth / text2bbox.width, maxHeightBottom / text2bbox.height); + return this.text2.attr({ + transform: "S" + text2scale + "," + text2scale + "," + (text2bbox.x + text2bbox.width / 2) + "," + text2bbox.y + }); + }; + + Donut.prototype.drawEmptyDonutLabel = function(xPos, yPos, color, fontSize, fontWeight) { + var text; + text = this.raphael.text(xPos, yPos, '').attr('font-size', fontSize).attr('fill', color); + if (fontWeight != null) { + text.attr('font-weight', fontWeight); + } + return text; + }; + + Donut.prototype.resizeHandler = function() { + this.timeoutId = null; + this.raphael.setSize(this.el.width(), this.el.height()); + return this.redraw(); + }; + + return Donut; + + })(Morris.EventEmitter); + + Morris.DonutSegment = (function(_super) { + __extends(DonutSegment, _super); + + function DonutSegment(cx, cy, inner, outer, p0, p1, color, backgroundColor, index, raphael) { + this.cx = cx; + this.cy = cy; + this.inner = inner; + this.outer = outer; + this.color = color; + this.backgroundColor = backgroundColor; + this.index = index; + this.raphael = raphael; + this.deselect = __bind(this.deselect, this); + this.select = __bind(this.select, this); + this.sin_p0 = Math.sin(p0); + this.cos_p0 = Math.cos(p0); + this.sin_p1 = Math.sin(p1); + this.cos_p1 = Math.cos(p1); + this.is_long = (p1 - p0) > Math.PI ? 1 : 0; + this.path = this.calcSegment(this.inner + 3, this.inner + this.outer - 5); + this.selectedPath = this.calcSegment(this.inner + 3, this.inner + this.outer); + this.hilight = this.calcArc(this.inner); + } + + DonutSegment.prototype.calcArcPoints = function(r) { + return [this.cx + r * this.sin_p0, this.cy + r * this.cos_p0, this.cx + r * this.sin_p1, this.cy + r * this.cos_p1]; + }; + + DonutSegment.prototype.calcSegment = function(r1, r2) { + var ix0, ix1, iy0, iy1, ox0, ox1, oy0, oy1, _ref, _ref1; + _ref = this.calcArcPoints(r1), ix0 = _ref[0], iy0 = _ref[1], ix1 = _ref[2], iy1 = _ref[3]; + _ref1 = this.calcArcPoints(r2), ox0 = _ref1[0], oy0 = _ref1[1], ox1 = _ref1[2], oy1 = _ref1[3]; + return ("M" + ix0 + "," + iy0) + ("A" + r1 + "," + r1 + ",0," + this.is_long + ",0," + ix1 + "," + iy1) + ("L" + ox1 + "," + oy1) + ("A" + r2 + "," + r2 + ",0," + this.is_long + ",1," + ox0 + "," + oy0) + "Z"; + }; + + DonutSegment.prototype.calcArc = function(r) { + var ix0, ix1, iy0, iy1, _ref; + _ref = this.calcArcPoints(r), ix0 = _ref[0], iy0 = _ref[1], ix1 = _ref[2], iy1 = _ref[3]; + return ("M" + ix0 + "," + iy0) + ("A" + r + "," + r + ",0," + this.is_long + ",0," + ix1 + "," + iy1); + }; + + DonutSegment.prototype.render = function() { + var _this = this; + this.arc = this.drawDonutArc(this.hilight, this.color); + return this.seg = this.drawDonutSegment(this.path, this.color, this.backgroundColor, function() { + return _this.fire('hover', _this.index); + }, function() { + return _this.fire('click', _this.index); + }); + }; + + DonutSegment.prototype.drawDonutArc = function(path, color) { + return this.raphael.path(path).attr({ + stroke: color, + 'stroke-width': 2, + opacity: 0 + }); + }; + + DonutSegment.prototype.drawDonutSegment = function(path, fillColor, strokeColor, hoverFunction, clickFunction) { + return this.raphael.path(path).attr({ + fill: fillColor, + stroke: strokeColor, + 'stroke-width': 3 + }).hover(hoverFunction).click(clickFunction); + }; + + DonutSegment.prototype.select = function() { + if (!this.selected) { + this.seg.animate({ + path: this.selectedPath + }, 150, '<>'); + this.arc.animate({ + opacity: 1 + }, 150, '<>'); + return this.selected = true; + } + }; + + DonutSegment.prototype.deselect = function() { + if (this.selected) { + this.seg.animate({ + path: this.path + }, 150, '<>'); + this.arc.animate({ + opacity: 0 + }, 150, '<>'); + return this.selected = false; + } + }; + + return DonutSegment; + + })(Morris.EventEmitter); + +}).call(this); diff --git a/theme/bootstrap/views/js/New folder/plugins/morris/morris.min.js b/theme/bootstrap/views/js/New folder/plugins/morris/morris.min.js new file mode 100644 index 0000000..c3bda2f --- /dev/null +++ b/theme/bootstrap/views/js/New folder/plugins/morris/morris.min.js @@ -0,0 +1,7 @@ +/* @license +morris.js v0.5.0 +Copyright 2014 Olly Smith All rights reserved. +Licensed under the BSD-2-Clause License. +*/ +(function(){var a,b,c,d,e=[].slice,f=function(a,b){return function(){return a.apply(b,arguments)}},g={}.hasOwnProperty,h=function(a,b){function c(){this.constructor=a}for(var d in b)g.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},i=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};b=window.Morris={},a=jQuery,b.EventEmitter=function(){function a(){}return a.prototype.on=function(a,b){return null==this.handlers&&(this.handlers={}),null==this.handlers[a]&&(this.handlers[a]=[]),this.handlers[a].push(b),this},a.prototype.fire=function(){var a,b,c,d,f,g,h;if(c=arguments[0],a=2<=arguments.length?e.call(arguments,1):[],null!=this.handlers&&null!=this.handlers[c]){for(g=this.handlers[c],h=[],d=0,f=g.length;f>d;d++)b=g[d],h.push(b.apply(null,a));return h}},a}(),b.commas=function(a){var b,c,d,e;return null!=a?(d=0>a?"-":"",b=Math.abs(a),c=Math.floor(b).toFixed(0),d+=c.replace(/(?=(?:\d{3})+$)(?!^)/g,","),e=b.toString(),e.length>c.length&&(d+=e.slice(c.length)),d):"-"},b.pad2=function(a){return(10>a?"0":"")+a},b.Grid=function(c){function d(b){this.resizeHandler=f(this.resizeHandler,this);var c=this;if(this.el="string"==typeof b.element?a(document.getElementById(b.element)):a(b.element),null==this.el||0===this.el.length)throw new Error("Graph container element not found");"static"===this.el.css("position")&&this.el.css("position","relative"),this.options=a.extend({},this.gridDefaults,this.defaults||{},b),"string"==typeof this.options.units&&(this.options.postUnits=b.units),this.raphael=new Raphael(this.el[0]),this.elementWidth=null,this.elementHeight=null,this.dirty=!1,this.selectFrom=null,this.init&&this.init(),this.setData(this.options.data),this.el.bind("mousemove",function(a){var b,d,e,f,g;return d=c.el.offset(),g=a.pageX-d.left,c.selectFrom?(b=c.data[c.hitTest(Math.min(g,c.selectFrom))]._x,e=c.data[c.hitTest(Math.max(g,c.selectFrom))]._x,f=e-b,c.selectionRect.attr({x:b,width:f})):c.fire("hovermove",g,a.pageY-d.top)}),this.el.bind("mouseleave",function(){return c.selectFrom&&(c.selectionRect.hide(),c.selectFrom=null),c.fire("hoverout")}),this.el.bind("touchstart touchmove touchend",function(a){var b,d;return d=a.originalEvent.touches[0]||a.originalEvent.changedTouches[0],b=c.el.offset(),c.fire("hovermove",d.pageX-b.left,d.pageY-b.top)}),this.el.bind("click",function(a){var b;return b=c.el.offset(),c.fire("gridclick",a.pageX-b.left,a.pageY-b.top)}),this.options.rangeSelect&&(this.selectionRect=this.raphael.rect(0,0,0,this.el.innerHeight()).attr({fill:this.options.rangeSelectColor,stroke:!1}).toBack().hide(),this.el.bind("mousedown",function(a){var b;return b=c.el.offset(),c.startRange(a.pageX-b.left)}),this.el.bind("mouseup",function(a){var b;return b=c.el.offset(),c.endRange(a.pageX-b.left),c.fire("hovermove",a.pageX-b.left,a.pageY-b.top)})),this.options.resize&&a(window).bind("resize",function(){return null!=c.timeoutId&&window.clearTimeout(c.timeoutId),c.timeoutId=window.setTimeout(c.resizeHandler,100)}),this.el.css("-webkit-tap-highlight-color","rgba(0,0,0,0)"),this.postInit&&this.postInit()}return h(d,c),d.prototype.gridDefaults={dateFormat:null,axes:!0,grid:!0,gridLineColor:"#aaa",gridStrokeWidth:.5,gridTextColor:"#888",gridTextSize:12,gridTextFamily:"sans-serif",gridTextWeight:"normal",hideHover:!1,yLabelFormat:null,xLabelAngle:0,numLines:5,padding:25,parseTime:!0,postUnits:"",preUnits:"",ymax:"auto",ymin:"auto 0",goals:[],goalStrokeWidth:1,goalLineColors:["#666633","#999966","#cc6666","#663333"],events:[],eventStrokeWidth:1,eventLineColors:["#005a04","#ccffbb","#3a5f0b","#005502"],rangeSelect:null,rangeSelectColor:"#eef",resize:!1},d.prototype.setData=function(a,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;return null==c&&(c=!0),this.options.data=a,null==a||0===a.length?(this.data=[],this.raphael.clear(),null!=this.hover&&this.hover.hide(),void 0):(o=this.cumulative?0:null,p=this.cumulative?0:null,this.options.goals.length>0&&(h=Math.min.apply(Math,this.options.goals),g=Math.max.apply(Math,this.options.goals),p=null!=p?Math.min(p,h):h,o=null!=o?Math.max(o,g):g),this.data=function(){var c,d,g;for(g=[],f=c=0,d=a.length;d>c;f=++c)j=a[f],i={src:j},i.label=j[this.options.xkey],this.options.parseTime?(i.x=b.parseDate(i.label),this.options.dateFormat?i.label=this.options.dateFormat(i.x):"number"==typeof i.label&&(i.label=new Date(i.label).toString())):(i.x=f,this.options.xLabelFormat&&(i.label=this.options.xLabelFormat(i))),l=0,i.y=function(){var a,b,c,d;for(c=this.options.ykeys,d=[],e=a=0,b=c.length;b>a;e=++a)n=c[e],q=j[n],"string"==typeof q&&(q=parseFloat(q)),null!=q&&"number"!=typeof q&&(q=null),null!=q&&(this.cumulative?l+=q:null!=o?(o=Math.max(q,o),p=Math.min(q,p)):o=p=q),this.cumulative&&null!=l&&(o=Math.max(l,o),p=Math.min(l,p)),d.push(q);return d}.call(this),g.push(i);return g}.call(this),this.options.parseTime&&(this.data=this.data.sort(function(a,b){return(a.x>b.x)-(b.x>a.x)})),this.xmin=this.data[0].x,this.xmax=this.data[this.data.length-1].x,this.events=[],this.options.events.length>0&&(this.events=this.options.parseTime?function(){var a,c,e,f;for(e=this.options.events,f=[],a=0,c=e.length;c>a;a++)d=e[a],f.push(b.parseDate(d));return f}.call(this):this.options.events,this.xmax=Math.max(this.xmax,Math.max.apply(Math,this.events)),this.xmin=Math.min(this.xmin,Math.min.apply(Math,this.events))),this.xmin===this.xmax&&(this.xmin-=1,this.xmax+=1),this.ymin=this.yboundary("min",p),this.ymax=this.yboundary("max",o),this.ymin===this.ymax&&(p&&(this.ymin-=1),this.ymax+=1),((r=this.options.axes)===!0||"both"===r||"y"===r||this.options.grid===!0)&&(this.options.ymax===this.gridDefaults.ymax&&this.options.ymin===this.gridDefaults.ymin?(this.grid=this.autoGridLines(this.ymin,this.ymax,this.options.numLines),this.ymin=Math.min(this.ymin,this.grid[0]),this.ymax=Math.max(this.ymax,this.grid[this.grid.length-1])):(k=(this.ymax-this.ymin)/(this.options.numLines-1),this.grid=function(){var a,b,c,d;for(d=[],m=a=b=this.ymin,c=this.ymax;k>0?c>=a:a>=c;m=a+=k)d.push(m);return d}.call(this))),this.dirty=!0,c?this.redraw():void 0)},d.prototype.yboundary=function(a,b){var c,d;return c=this.options["y"+a],"string"==typeof c?"auto"===c.slice(0,4)?c.length>5?(d=parseInt(c.slice(5),10),null==b?d:Math[a](b,d)):null!=b?b:0:parseInt(c,10):c},d.prototype.autoGridLines=function(a,b,c){var d,e,f,g,h,i,j,k,l;return h=b-a,l=Math.floor(Math.log(h)/Math.log(10)),j=Math.pow(10,l),e=Math.floor(a/j)*j,d=Math.ceil(b/j)*j,i=(d-e)/(c-1),1===j&&i>1&&Math.ceil(i)!==i&&(i=Math.ceil(i),d=e+i*(c-1)),0>e&&d>0&&(e=Math.floor(a/i)*i,d=Math.ceil(b/i)*i),1>i?(g=Math.floor(Math.log(i)/Math.log(10)),f=function(){var a,b;for(b=[],k=a=e;i>0?d>=a:a>=d;k=a+=i)b.push(parseFloat(k.toFixed(1-g)));return b}()):f=function(){var a,b;for(b=[],k=a=e;i>0?d>=a:a>=d;k=a+=i)b.push(k);return b}(),f},d.prototype._calc=function(){var a,b,c,d,e,f,g,h;return e=this.el.width(),c=this.el.height(),(this.elementWidth!==e||this.elementHeight!==c||this.dirty)&&(this.elementWidth=e,this.elementHeight=c,this.dirty=!1,this.left=this.options.padding,this.right=this.elementWidth-this.options.padding,this.top=this.options.padding,this.bottom=this.elementHeight-this.options.padding,((g=this.options.axes)===!0||"both"===g||"y"===g)&&(f=function(){var a,c,d,e;for(d=this.grid,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(this.measureText(this.yAxisFormat(b)).width);return e}.call(this),this.left+=Math.max.apply(Math,f)),((h=this.options.axes)===!0||"both"===h||"x"===h)&&(a=function(){var a,b,c;for(c=[],d=a=0,b=this.data.length;b>=0?b>a:a>b;d=b>=0?++a:--a)c.push(this.measureText(this.data[d].text,-this.options.xLabelAngle).height);return c}.call(this),this.bottom-=Math.max.apply(Math,a)),this.width=Math.max(1,this.right-this.left),this.height=Math.max(1,this.bottom-this.top),this.dx=this.width/(this.xmax-this.xmin),this.dy=this.height/(this.ymax-this.ymin),this.calc)?this.calc():void 0},d.prototype.transY=function(a){return this.bottom-(a-this.ymin)*this.dy},d.prototype.transX=function(a){return 1===this.data.length?(this.left+this.right)/2:this.left+(a-this.xmin)*this.dx},d.prototype.redraw=function(){return this.raphael.clear(),this._calc(),this.drawGrid(),this.drawGoals(),this.drawEvents(),this.draw?this.draw():void 0},d.prototype.measureText=function(a,b){var c,d;return null==b&&(b=0),d=this.raphael.text(100,100,a).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).rotate(b),c=d.getBBox(),d.remove(),c},d.prototype.yAxisFormat=function(a){return this.yLabelFormat(a)},d.prototype.yLabelFormat=function(a){return"function"==typeof this.options.yLabelFormat?this.options.yLabelFormat(a):""+this.options.preUnits+b.commas(a)+this.options.postUnits},d.prototype.drawGrid=function(){var a,b,c,d,e,f,g,h;if(this.options.grid!==!1||(e=this.options.axes)===!0||"both"===e||"y"===e){for(f=this.grid,h=[],c=0,d=f.length;d>c;c++)a=f[c],b=this.transY(a),((g=this.options.axes)===!0||"both"===g||"y"===g)&&this.drawYAxisLabel(this.left-this.options.padding/2,b,this.yAxisFormat(a)),this.options.grid?h.push(this.drawGridLine("M"+this.left+","+b+"H"+(this.left+this.width))):h.push(void 0);return h}},d.prototype.drawGoals=function(){var a,b,c,d,e,f,g;for(f=this.options.goals,g=[],c=d=0,e=f.length;e>d;c=++d)b=f[c],a=this.options.goalLineColors[c%this.options.goalLineColors.length],g.push(this.drawGoal(b,a));return g},d.prototype.drawEvents=function(){var a,b,c,d,e,f,g;for(f=this.events,g=[],c=d=0,e=f.length;e>d;c=++d)b=f[c],a=this.options.eventLineColors[c%this.options.eventLineColors.length],g.push(this.drawEvent(b,a));return g},d.prototype.drawGoal=function(a,b){return this.raphael.path("M"+this.left+","+this.transY(a)+"H"+this.right).attr("stroke",b).attr("stroke-width",this.options.goalStrokeWidth)},d.prototype.drawEvent=function(a,b){return this.raphael.path("M"+this.transX(a)+","+this.bottom+"V"+this.top).attr("stroke",b).attr("stroke-width",this.options.eventStrokeWidth)},d.prototype.drawYAxisLabel=function(a,b,c){return this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor).attr("text-anchor","end")},d.prototype.drawGridLine=function(a){return this.raphael.path(a).attr("stroke",this.options.gridLineColor).attr("stroke-width",this.options.gridStrokeWidth)},d.prototype.startRange=function(a){return this.hover.hide(),this.selectFrom=a,this.selectionRect.attr({x:a,width:0}).show()},d.prototype.endRange=function(a){var b,c;return this.selectFrom?(c=Math.min(this.selectFrom,a),b=Math.max(this.selectFrom,a),this.options.rangeSelect.call(this.el,{start:this.data[this.hitTest(c)].x,end:this.data[this.hitTest(b)].x}),this.selectFrom=null):void 0},d.prototype.resizeHandler=function(){return this.timeoutId=null,this.raphael.setSize(this.el.width(),this.el.height()),this.redraw()},d}(b.EventEmitter),b.parseDate=function(a){var b,c,d,e,f,g,h,i,j,k,l;return"number"==typeof a?a:(c=a.match(/^(\d+) Q(\d)$/),e=a.match(/^(\d+)-(\d+)$/),f=a.match(/^(\d+)-(\d+)-(\d+)$/),h=a.match(/^(\d+) W(\d+)$/),i=a.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+)(Z|([+-])(\d\d):?(\d\d))?$/),j=a.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+):(\d+(\.\d+)?)(Z|([+-])(\d\d):?(\d\d))?$/),c?new Date(parseInt(c[1],10),3*parseInt(c[2],10)-1,1).getTime():e?new Date(parseInt(e[1],10),parseInt(e[2],10)-1,1).getTime():f?new Date(parseInt(f[1],10),parseInt(f[2],10)-1,parseInt(f[3],10)).getTime():h?(k=new Date(parseInt(h[1],10),0,1),4!==k.getDay()&&k.setMonth(0,1+(4-k.getDay()+7)%7),k.getTime()+6048e5*parseInt(h[2],10)):i?i[6]?(g=0,"Z"!==i[6]&&(g=60*parseInt(i[8],10)+parseInt(i[9],10),"+"===i[7]&&(g=0-g)),Date.UTC(parseInt(i[1],10),parseInt(i[2],10)-1,parseInt(i[3],10),parseInt(i[4],10),parseInt(i[5],10)+g)):new Date(parseInt(i[1],10),parseInt(i[2],10)-1,parseInt(i[3],10),parseInt(i[4],10),parseInt(i[5],10)).getTime():j?(l=parseFloat(j[6]),b=Math.floor(l),d=Math.round(1e3*(l-b)),j[8]?(g=0,"Z"!==j[8]&&(g=60*parseInt(j[10],10)+parseInt(j[11],10),"+"===j[9]&&(g=0-g)),Date.UTC(parseInt(j[1],10),parseInt(j[2],10)-1,parseInt(j[3],10),parseInt(j[4],10),parseInt(j[5],10)+g,b,d)):new Date(parseInt(j[1],10),parseInt(j[2],10)-1,parseInt(j[3],10),parseInt(j[4],10),parseInt(j[5],10),b,d).getTime()):new Date(parseInt(a,10),0,1).getTime())},b.Hover=function(){function c(c){null==c&&(c={}),this.options=a.extend({},b.Hover.defaults,c),this.el=a("<div class='"+this.options["class"]+"'></div>"),this.el.hide(),this.options.parent.append(this.el)}return c.defaults={"class":"morris-hover morris-default-style"},c.prototype.update=function(a,b,c){return a?(this.html(a),this.show(),this.moveTo(b,c)):this.hide()},c.prototype.html=function(a){return this.el.html(a)},c.prototype.moveTo=function(a,b){var c,d,e,f,g,h;return g=this.options.parent.innerWidth(),f=this.options.parent.innerHeight(),d=this.el.outerWidth(),c=this.el.outerHeight(),e=Math.min(Math.max(0,a-d/2),g-d),null!=b?(h=b-c-10,0>h&&(h=b+10,h+c>f&&(h=f/2-c/2))):h=f/2-c/2,this.el.css({left:e+"px",top:parseInt(h)+"px"})},c.prototype.show=function(){return this.el.show()},c.prototype.hide=function(){return this.el.hide()},c}(),b.Line=function(a){function c(a){return this.hilight=f(this.hilight,this),this.onHoverOut=f(this.onHoverOut,this),this.onHoverMove=f(this.onHoverMove,this),this.onGridClick=f(this.onGridClick,this),this instanceof b.Line?(c.__super__.constructor.call(this,a),void 0):new b.Line(a)}return h(c,a),c.prototype.init=function(){return"always"!==this.options.hideHover?(this.hover=new b.Hover({parent:this.el}),this.on("hovermove",this.onHoverMove),this.on("hoverout",this.onHoverOut),this.on("gridclick",this.onGridClick)):void 0},c.prototype.defaults={lineWidth:3,pointSize:4,lineColors:["#0b62a4","#7A92A3","#4da74d","#afd8f8","#edc240","#cb4b4b","#9440ed"],pointStrokeWidths:[1],pointStrokeColors:["#ffffff"],pointFillColors:[],smooth:!0,xLabels:"auto",xLabelFormat:null,xLabelMargin:24,hideHover:!1},c.prototype.calc=function(){return this.calcPoints(),this.generatePaths()},c.prototype.calcPoints=function(){var a,b,c,d,e,f;for(e=this.data,f=[],c=0,d=e.length;d>c;c++)a=e[c],a._x=this.transX(a.x),a._y=function(){var c,d,e,f;for(e=a.y,f=[],c=0,d=e.length;d>c;c++)b=e[c],null!=b?f.push(this.transY(b)):f.push(b);return f}.call(this),f.push(a._ymax=Math.min.apply(Math,[this.bottom].concat(function(){var c,d,e,f;for(e=a._y,f=[],c=0,d=e.length;d>c;c++)b=e[c],null!=b&&f.push(b);return f}())));return f},c.prototype.hitTest=function(a){var b,c,d,e,f;if(0===this.data.length)return null;for(f=this.data.slice(1),b=d=0,e=f.length;e>d&&(c=f[b],!(a<(c._x+this.data[b]._x)/2));b=++d);return b},c.prototype.onGridClick=function(a,b){var c;return c=this.hitTest(a),this.fire("click",c,this.data[c].src,a,b)},c.prototype.onHoverMove=function(a){var b;return b=this.hitTest(a),this.displayHoverForRow(b)},c.prototype.onHoverOut=function(){return this.options.hideHover!==!1?this.displayHoverForRow(null):void 0},c.prototype.displayHoverForRow=function(a){var b;return null!=a?((b=this.hover).update.apply(b,this.hoverContentForRow(a)),this.hilight(a)):(this.hover.hide(),this.hilight())},c.prototype.hoverContentForRow=function(a){var b,c,d,e,f,g,h;for(d=this.data[a],b="<div class='morris-hover-row-label'>"+d.label+"</div>",h=d.y,c=f=0,g=h.length;g>f;c=++f)e=h[c],b+="<div class='morris-hover-point' style='color: "+this.colorFor(d,c,"label")+"'>\n "+this.options.labels[c]+":\n "+this.yLabelFormat(e)+"\n</div>";return"function"==typeof this.options.hoverCallback&&(b=this.options.hoverCallback(a,this.options,b,d.src)),[b,d._x,d._ymax]},c.prototype.generatePaths=function(){var a,c,d,e;return this.paths=function(){var f,g,h,j;for(j=[],c=f=0,g=this.options.ykeys.length;g>=0?g>f:f>g;c=g>=0?++f:--f)e="boolean"==typeof this.options.smooth?this.options.smooth:(h=this.options.ykeys[c],i.call(this.options.smooth,h)>=0),a=function(){var a,b,e,f;for(e=this.data,f=[],a=0,b=e.length;b>a;a++)d=e[a],void 0!==d._y[c]&&f.push({x:d._x,y:d._y[c]});return f}.call(this),a.length>1?j.push(b.Line.createPath(a,e,this.bottom)):j.push(null);return j}.call(this)},c.prototype.draw=function(){var a;return((a=this.options.axes)===!0||"both"===a||"x"===a)&&this.drawXAxis(),this.drawSeries(),this.options.hideHover===!1?this.displayHoverForRow(this.data.length-1):void 0},c.prototype.drawXAxis=function(){var a,c,d,e,f,g,h,i,j,k,l=this;for(h=this.bottom+this.options.padding/2,f=null,e=null,a=function(a,b){var c,d,g,i,j;return c=l.drawXAxisLabel(l.transX(b),h,a),j=c.getBBox(),c.transform("r"+-l.options.xLabelAngle),d=c.getBBox(),c.transform("t0,"+d.height/2+"..."),0!==l.options.xLabelAngle&&(i=-.5*j.width*Math.cos(l.options.xLabelAngle*Math.PI/180),c.transform("t"+i+",0...")),d=c.getBBox(),(null==f||f>=d.x+d.width||null!=e&&e>=d.x)&&d.x>=0&&d.x+d.width<l.el.width()?(0!==l.options.xLabelAngle&&(g=1.25*l.options.gridTextSize/Math.sin(l.options.xLabelAngle*Math.PI/180),e=d.x-g),f=d.x-l.options.xLabelMargin):c.remove()},d=this.options.parseTime?1===this.data.length&&"auto"===this.options.xLabels?[[this.data[0].label,this.data[0].x]]:b.labelSeries(this.xmin,this.xmax,this.width,this.options.xLabels,this.options.xLabelFormat):function(){var a,b,c,d;for(c=this.data,d=[],a=0,b=c.length;b>a;a++)g=c[a],d.push([g.label,g.x]);return d}.call(this),d.reverse(),k=[],i=0,j=d.length;j>i;i++)c=d[i],k.push(a(c[0],c[1]));return k},c.prototype.drawSeries=function(){var a,b,c,d,e,f;for(this.seriesPoints=[],a=b=d=this.options.ykeys.length-1;0>=d?0>=b:b>=0;a=0>=d?++b:--b)this._drawLineFor(a);for(f=[],a=c=e=this.options.ykeys.length-1;0>=e?0>=c:c>=0;a=0>=e?++c:--c)f.push(this._drawPointFor(a));return f},c.prototype._drawPointFor=function(a){var b,c,d,e,f,g;for(this.seriesPoints[a]=[],f=this.data,g=[],d=0,e=f.length;e>d;d++)c=f[d],b=null,null!=c._y[a]&&(b=this.drawLinePoint(c._x,c._y[a],this.colorFor(c,a,"point"),a)),g.push(this.seriesPoints[a].push(b));return g},c.prototype._drawLineFor=function(a){var b;return b=this.paths[a],null!==b?this.drawLinePath(b,this.colorFor(null,a,"line"),a):void 0},c.createPath=function(a,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r;for(k="",c&&(g=b.Line.gradients(a)),l={y:null},h=q=0,r=a.length;r>q;h=++q)e=a[h],null!=e.y&&(null!=l.y?c?(f=g[h],j=g[h-1],i=(e.x-l.x)/4,m=l.x+i,o=Math.min(d,l.y+i*j),n=e.x-i,p=Math.min(d,e.y-i*f),k+="C"+m+","+o+","+n+","+p+","+e.x+","+e.y):k+="L"+e.x+","+e.y:c&&null==g[h]||(k+="M"+e.x+","+e.y)),l=e;return k},c.gradients=function(a){var b,c,d,e,f,g,h,i;for(c=function(a,b){return(a.y-b.y)/(a.x-b.x)},i=[],d=g=0,h=a.length;h>g;d=++g)b=a[d],null!=b.y?(e=a[d+1]||{y:null},f=a[d-1]||{y:null},null!=f.y&&null!=e.y?i.push(c(f,e)):null!=f.y?i.push(c(f,b)):null!=e.y?i.push(c(b,e)):i.push(null)):i.push(null);return i},c.prototype.hilight=function(a){var b,c,d,e,f;if(null!==this.prevHilight&&this.prevHilight!==a)for(b=c=0,e=this.seriesPoints.length-1;e>=0?e>=c:c>=e;b=e>=0?++c:--c)this.seriesPoints[b][this.prevHilight]&&this.seriesPoints[b][this.prevHilight].animate(this.pointShrinkSeries(b));if(null!==a&&this.prevHilight!==a)for(b=d=0,f=this.seriesPoints.length-1;f>=0?f>=d:d>=f;b=f>=0?++d:--d)this.seriesPoints[b][a]&&this.seriesPoints[b][a].animate(this.pointGrowSeries(b));return this.prevHilight=a},c.prototype.colorFor=function(a,b,c){return"function"==typeof this.options.lineColors?this.options.lineColors.call(this,a,b,c):"point"===c?this.options.pointFillColors[b%this.options.pointFillColors.length]||this.options.lineColors[b%this.options.lineColors.length]:this.options.lineColors[b%this.options.lineColors.length]},c.prototype.drawXAxisLabel=function(a,b,c){return this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor)},c.prototype.drawLinePath=function(a,b,c){return this.raphael.path(a).attr("stroke",b).attr("stroke-width",this.lineWidthForSeries(c))},c.prototype.drawLinePoint=function(a,b,c,d){return this.raphael.circle(a,b,this.pointSizeForSeries(d)).attr("fill",c).attr("stroke-width",this.pointStrokeWidthForSeries(d)).attr("stroke",this.pointStrokeColorForSeries(d))},c.prototype.pointStrokeWidthForSeries=function(a){return this.options.pointStrokeWidths[a%this.options.pointStrokeWidths.length]},c.prototype.pointStrokeColorForSeries=function(a){return this.options.pointStrokeColors[a%this.options.pointStrokeColors.length]},c.prototype.lineWidthForSeries=function(a){return this.options.lineWidth instanceof Array?this.options.lineWidth[a%this.options.lineWidth.length]:this.options.lineWidth},c.prototype.pointSizeForSeries=function(a){return this.options.pointSize instanceof Array?this.options.pointSize[a%this.options.pointSize.length]:this.options.pointSize},c.prototype.pointGrowSeries=function(a){return Raphael.animation({r:this.pointSizeForSeries(a)+3},25,"linear")},c.prototype.pointShrinkSeries=function(a){return Raphael.animation({r:this.pointSizeForSeries(a)},25,"linear")},c}(b.Grid),b.labelSeries=function(c,d,e,f,g){var h,i,j,k,l,m,n,o,p,q,r;if(j=200*(d-c)/e,i=new Date(c),n=b.LABEL_SPECS[f],void 0===n)for(r=b.AUTO_LABEL_ORDER,p=0,q=r.length;q>p;p++)if(k=r[p],m=b.LABEL_SPECS[k],j>=m.span){n=m;break}for(void 0===n&&(n=b.LABEL_SPECS.second),g&&(n=a.extend({},n,{fmt:g})),h=n.start(i),l=[];(o=h.getTime())<=d;)o>=c&&l.push([n.fmt(h),o]),n.incr(h);return l},c=function(a){return{span:60*a*1e3,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate(),a.getHours())},fmt:function(a){return""+b.pad2(a.getHours())+":"+b.pad2(a.getMinutes())},incr:function(b){return b.setUTCMinutes(b.getUTCMinutes()+a)}}},d=function(a){return{span:1e3*a,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate(),a.getHours(),a.getMinutes())},fmt:function(a){return""+b.pad2(a.getHours())+":"+b.pad2(a.getMinutes())+":"+b.pad2(a.getSeconds())},incr:function(b){return b.setUTCSeconds(b.getUTCSeconds()+a)}}},b.LABEL_SPECS={decade:{span:1728e8,start:function(a){return new Date(a.getFullYear()-a.getFullYear()%10,0,1)},fmt:function(a){return""+a.getFullYear()},incr:function(a){return a.setFullYear(a.getFullYear()+10)}},year:{span:1728e7,start:function(a){return new Date(a.getFullYear(),0,1)},fmt:function(a){return""+a.getFullYear()},incr:function(a){return a.setFullYear(a.getFullYear()+1)}},month:{span:24192e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),1)},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)},incr:function(a){return a.setMonth(a.getMonth()+1)}},week:{span:6048e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate())},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)+"-"+b.pad2(a.getDate())},incr:function(a){return a.setDate(a.getDate()+7)}},day:{span:864e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate())},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)+"-"+b.pad2(a.getDate())},incr:function(a){return a.setDate(a.getDate()+1)}},hour:c(60),"30min":c(30),"15min":c(15),"10min":c(10),"5min":c(5),minute:c(1),"30sec":d(30),"15sec":d(15),"10sec":d(10),"5sec":d(5),second:d(1)},b.AUTO_LABEL_ORDER=["decade","year","month","week","day","hour","30min","15min","10min","5min","minute","30sec","15sec","10sec","5sec","second"],b.Area=function(c){function d(c){var f;return this instanceof b.Area?(f=a.extend({},e,c),this.cumulative=!f.behaveLikeLine,"auto"===f.fillOpacity&&(f.fillOpacity=f.behaveLikeLine?.8:1),d.__super__.constructor.call(this,f),void 0):new b.Area(c)}var e;return h(d,c),e={fillOpacity:"auto",behaveLikeLine:!1},d.prototype.calcPoints=function(){var a,b,c,d,e,f,g;for(f=this.data,g=[],d=0,e=f.length;e>d;d++)a=f[d],a._x=this.transX(a.x),b=0,a._y=function(){var d,e,f,g;for(f=a.y,g=[],d=0,e=f.length;e>d;d++)c=f[d],this.options.behaveLikeLine?g.push(this.transY(c)):(b+=c||0,g.push(this.transY(b)));return g}.call(this),g.push(a._ymax=Math.max.apply(Math,a._y));return g},d.prototype.drawSeries=function(){var a,b,c,d,e,f,g,h;for(this.seriesPoints=[],b=this.options.behaveLikeLine?function(){f=[];for(var a=0,b=this.options.ykeys.length-1;b>=0?b>=a:a>=b;b>=0?a++:a--)f.push(a);return f}.apply(this):function(){g=[];for(var a=e=this.options.ykeys.length-1;0>=e?0>=a:a>=0;0>=e?a++:a--)g.push(a);return g}.apply(this),h=[],c=0,d=b.length;d>c;c++)a=b[c],this._drawFillFor(a),this._drawLineFor(a),h.push(this._drawPointFor(a));return h},d.prototype._drawFillFor=function(a){var b;return b=this.paths[a],null!==b?(b+="L"+this.transX(this.xmax)+","+this.bottom+"L"+this.transX(this.xmin)+","+this.bottom+"Z",this.drawFilledPath(b,this.fillForSeries(a))):void 0},d.prototype.fillForSeries=function(a){var b;return b=Raphael.rgb2hsl(this.colorFor(this.data[a],a,"line")),Raphael.hsl(b.h,this.options.behaveLikeLine?.9*b.s:.75*b.s,Math.min(.98,this.options.behaveLikeLine?1.2*b.l:1.25*b.l))},d.prototype.drawFilledPath=function(a,b){return this.raphael.path(a).attr("fill",b).attr("fill-opacity",this.options.fillOpacity).attr("stroke","none")},d}(b.Line),b.Bar=function(c){function d(c){return this.onHoverOut=f(this.onHoverOut,this),this.onHoverMove=f(this.onHoverMove,this),this.onGridClick=f(this.onGridClick,this),this instanceof b.Bar?(d.__super__.constructor.call(this,a.extend({},c,{parseTime:!1})),void 0):new b.Bar(c)}return h(d,c),d.prototype.init=function(){return this.cumulative=this.options.stacked,"always"!==this.options.hideHover?(this.hover=new b.Hover({parent:this.el}),this.on("hovermove",this.onHoverMove),this.on("hoverout",this.onHoverOut),this.on("gridclick",this.onGridClick)):void 0},d.prototype.defaults={barSizeRatio:.75,barGap:3,barColors:["#0b62a4","#7a92a3","#4da74d","#afd8f8","#edc240","#cb4b4b","#9440ed"],barOpacity:1,barRadius:[0,0,0,0],xLabelMargin:50},d.prototype.calc=function(){var a;return this.calcBars(),this.options.hideHover===!1?(a=this.hover).update.apply(a,this.hoverContentForRow(this.data.length-1)):void 0},d.prototype.calcBars=function(){var a,b,c,d,e,f,g;for(f=this.data,g=[],a=d=0,e=f.length;e>d;a=++d)b=f[a],b._x=this.left+this.width*(a+.5)/this.data.length,g.push(b._y=function(){var a,d,e,f;for(e=b.y,f=[],a=0,d=e.length;d>a;a++)c=e[a],null!=c?f.push(this.transY(c)):f.push(null);return f}.call(this));return g},d.prototype.draw=function(){var a;return((a=this.options.axes)===!0||"both"===a||"x"===a)&&this.drawXAxis(),this.drawSeries()},d.prototype.drawXAxis=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m;for(j=this.bottom+(this.options.xAxisLabelTopPadding||this.options.padding/2),g=null,f=null,m=[],a=k=0,l=this.data.length;l>=0?l>k:k>l;a=l>=0?++k:--k)h=this.data[this.data.length-1-a],b=this.drawXAxisLabel(h._x,j,h.label),i=b.getBBox(),b.transform("r"+-this.options.xLabelAngle),c=b.getBBox(),b.transform("t0,"+c.height/2+"..."),0!==this.options.xLabelAngle&&(e=-.5*i.width*Math.cos(this.options.xLabelAngle*Math.PI/180),b.transform("t"+e+",0...")),(null==g||g>=c.x+c.width||null!=f&&f>=c.x)&&c.x>=0&&c.x+c.width<this.el.width()?(0!==this.options.xLabelAngle&&(d=1.25*this.options.gridTextSize/Math.sin(this.options.xLabelAngle*Math.PI/180),f=c.x-d),m.push(g=c.x-this.options.xLabelMargin)):m.push(b.remove());return m},d.prototype.drawSeries=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o;return c=this.width/this.options.data.length,h=this.options.stacked?1:this.options.ykeys.length,a=(c*this.options.barSizeRatio-this.options.barGap*(h-1))/h,this.options.barSize&&(a=Math.min(a,this.options.barSize)),l=c-a*h-this.options.barGap*(h-1),g=l/2,o=this.ymin<=0&&this.ymax>=0?this.transY(0):null,this.bars=function(){var h,l,p,q;for(p=this.data,q=[],d=h=0,l=p.length;l>h;d=++h)i=p[d],e=0,q.push(function(){var h,l,p,q;for(p=i._y,q=[],j=h=0,l=p.length;l>h;j=++h)n=p[j],null!==n?(o?(m=Math.min(n,o),b=Math.max(n,o)):(m=n,b=this.bottom),f=this.left+d*c+g,this.options.stacked||(f+=j*(a+this.options.barGap)),k=b-m,this.options.verticalGridCondition&&this.options.verticalGridCondition(i.x)&&this.drawBar(this.left+d*c,this.top,c,Math.abs(this.top-this.bottom),this.options.verticalGridColor,this.options.verticalGridOpacity,this.options.barRadius),this.options.stacked&&(m-=e),this.drawBar(f,m,a,k,this.colorFor(i,j,"bar"),this.options.barOpacity,this.options.barRadius),q.push(e+=k)):q.push(null);return q}.call(this));return q}.call(this)},d.prototype.colorFor=function(a,b,c){var d,e;return"function"==typeof this.options.barColors?(d={x:a.x,y:a.y[b],label:a.label},e={index:b,key:this.options.ykeys[b],label:this.options.labels[b]},this.options.barColors.call(this,d,e,c)):this.options.barColors[b%this.options.barColors.length]},d.prototype.hitTest=function(a){return 0===this.data.length?null:(a=Math.max(Math.min(a,this.right),this.left),Math.min(this.data.length-1,Math.floor((a-this.left)/(this.width/this.data.length))))},d.prototype.onGridClick=function(a,b){var c;return c=this.hitTest(a),this.fire("click",c,this.data[c].src,a,b)},d.prototype.onHoverMove=function(a){var b,c;return b=this.hitTest(a),(c=this.hover).update.apply(c,this.hoverContentForRow(b))},d.prototype.onHoverOut=function(){return this.options.hideHover!==!1?this.hover.hide():void 0},d.prototype.hoverContentForRow=function(a){var b,c,d,e,f,g,h,i;for(d=this.data[a],b="<div class='morris-hover-row-label'>"+d.label+"</div>",i=d.y,c=g=0,h=i.length;h>g;c=++g)f=i[c],b+="<div class='morris-hover-point' style='color: "+this.colorFor(d,c,"label")+"'>\n "+this.options.labels[c]+":\n "+this.yLabelFormat(f)+"\n</div>";return"function"==typeof this.options.hoverCallback&&(b=this.options.hoverCallback(a,this.options,b,d.src)),e=this.left+(a+.5)*this.width/this.data.length,[b,e]},d.prototype.drawXAxisLabel=function(a,b,c){var d;return d=this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor)},d.prototype.drawBar=function(a,b,c,d,e,f,g){var h,i;return h=Math.max.apply(Math,g),i=0===h||h>d?this.raphael.rect(a,b,c,d):this.raphael.path(this.roundedRect(a,b,c,d,g)),i.attr("fill",e).attr("fill-opacity",f).attr("stroke","none")},d.prototype.roundedRect=function(a,b,c,d,e){return null==e&&(e=[0,0,0,0]),["M",a,e[0]+b,"Q",a,b,a+e[0],b,"L",a+c-e[1],b,"Q",a+c,b,a+c,b+e[1],"L",a+c,b+d-e[2],"Q",a+c,b+d,a+c-e[2],b+d,"L",a+e[3],b+d,"Q",a,b+d,a,b+d-e[3],"Z"]},d}(b.Grid),b.Donut=function(c){function d(c){this.resizeHandler=f(this.resizeHandler,this),this.select=f(this.select,this),this.click=f(this.click,this);var d=this;if(!(this instanceof b.Donut))return new b.Donut(c);if(this.options=a.extend({},this.defaults,c),this.el="string"==typeof c.element?a(document.getElementById(c.element)):a(c.element),null===this.el||0===this.el.length)throw new Error("Graph placeholder not found.");void 0!==c.data&&0!==c.data.length&&(this.raphael=new Raphael(this.el[0]),this.options.resize&&a(window).bind("resize",function(){return null!=d.timeoutId&&window.clearTimeout(d.timeoutId),d.timeoutId=window.setTimeout(d.resizeHandler,100)}),this.setData(c.data))}return h(d,c),d.prototype.defaults={colors:["#0B62A4","#3980B5","#679DC6","#95BBD7","#B0CCE1","#095791","#095085","#083E67","#052C48","#042135"],backgroundColor:"#FFFFFF",labelColor:"#000000",formatter:b.commas,resize:!1},d.prototype.redraw=function(){var a,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x;for(this.raphael.clear(),c=this.el.width()/2,d=this.el.height()/2,n=(Math.min(c,d)-10)/3,l=0,u=this.values,o=0,r=u.length;r>o;o++)m=u[o],l+=m;for(i=5/(2*n),a=1.9999*Math.PI-i*this.data.length,g=0,f=0,this.segments=[],v=this.values,e=p=0,s=v.length;s>p;e=++p)m=v[e],j=g+i+a*(m/l),k=new b.DonutSegment(c,d,2*n,n,g,j,this.data[e].color||this.options.colors[f%this.options.colors.length],this.options.backgroundColor,f,this.raphael),k.render(),this.segments.push(k),k.on("hover",this.select),k.on("click",this.click),g=j,f+=1;for(this.text1=this.drawEmptyDonutLabel(c,d-10,this.options.labelColor,15,800),this.text2=this.drawEmptyDonutLabel(c,d+10,this.options.labelColor,14),h=Math.max.apply(Math,this.values),f=0,w=this.values,x=[],q=0,t=w.length;t>q;q++){if(m=w[q],m===h){this.select(f); +break}x.push(f+=1)}return x},d.prototype.setData=function(a){var b;return this.data=a,this.values=function(){var a,c,d,e;for(d=this.data,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(parseFloat(b.value));return e}.call(this),this.redraw()},d.prototype.click=function(a){return this.fire("click",a,this.data[a])},d.prototype.select=function(a){var b,c,d,e,f,g;for(g=this.segments,e=0,f=g.length;f>e;e++)c=g[e],c.deselect();return d=this.segments[a],d.select(),b=this.data[a],this.setLabels(b.label,this.options.formatter(b.value,b))},d.prototype.setLabels=function(a,b){var c,d,e,f,g,h,i,j;return c=2*(Math.min(this.el.width()/2,this.el.height()/2)-10)/3,f=1.8*c,e=c/2,d=c/3,this.text1.attr({text:a,transform:""}),g=this.text1.getBBox(),h=Math.min(f/g.width,e/g.height),this.text1.attr({transform:"S"+h+","+h+","+(g.x+g.width/2)+","+(g.y+g.height)}),this.text2.attr({text:b,transform:""}),i=this.text2.getBBox(),j=Math.min(f/i.width,d/i.height),this.text2.attr({transform:"S"+j+","+j+","+(i.x+i.width/2)+","+i.y})},d.prototype.drawEmptyDonutLabel=function(a,b,c,d,e){var f;return f=this.raphael.text(a,b,"").attr("font-size",d).attr("fill",c),null!=e&&f.attr("font-weight",e),f},d.prototype.resizeHandler=function(){return this.timeoutId=null,this.raphael.setSize(this.el.width(),this.el.height()),this.redraw()},d}(b.EventEmitter),b.DonutSegment=function(a){function b(a,b,c,d,e,g,h,i,j,k){this.cx=a,this.cy=b,this.inner=c,this.outer=d,this.color=h,this.backgroundColor=i,this.index=j,this.raphael=k,this.deselect=f(this.deselect,this),this.select=f(this.select,this),this.sin_p0=Math.sin(e),this.cos_p0=Math.cos(e),this.sin_p1=Math.sin(g),this.cos_p1=Math.cos(g),this.is_long=g-e>Math.PI?1:0,this.path=this.calcSegment(this.inner+3,this.inner+this.outer-5),this.selectedPath=this.calcSegment(this.inner+3,this.inner+this.outer),this.hilight=this.calcArc(this.inner)}return h(b,a),b.prototype.calcArcPoints=function(a){return[this.cx+a*this.sin_p0,this.cy+a*this.cos_p0,this.cx+a*this.sin_p1,this.cy+a*this.cos_p1]},b.prototype.calcSegment=function(a,b){var c,d,e,f,g,h,i,j,k,l;return k=this.calcArcPoints(a),c=k[0],e=k[1],d=k[2],f=k[3],l=this.calcArcPoints(b),g=l[0],i=l[1],h=l[2],j=l[3],"M"+c+","+e+("A"+a+","+a+",0,"+this.is_long+",0,"+d+","+f)+("L"+h+","+j)+("A"+b+","+b+",0,"+this.is_long+",1,"+g+","+i)+"Z"},b.prototype.calcArc=function(a){var b,c,d,e,f;return f=this.calcArcPoints(a),b=f[0],d=f[1],c=f[2],e=f[3],"M"+b+","+d+("A"+a+","+a+",0,"+this.is_long+",0,"+c+","+e)},b.prototype.render=function(){var a=this;return this.arc=this.drawDonutArc(this.hilight,this.color),this.seg=this.drawDonutSegment(this.path,this.color,this.backgroundColor,function(){return a.fire("hover",a.index)},function(){return a.fire("click",a.index)})},b.prototype.drawDonutArc=function(a,b){return this.raphael.path(a).attr({stroke:b,"stroke-width":2,opacity:0})},b.prototype.drawDonutSegment=function(a,b,c,d,e){return this.raphael.path(a).attr({fill:b,stroke:c,"stroke-width":3}).hover(d).click(e)},b.prototype.select=function(){return this.selected?void 0:(this.seg.animate({path:this.selectedPath},150,"<>"),this.arc.animate({opacity:1},150,"<>"),this.selected=!0)},b.prototype.deselect=function(){return this.selected?(this.seg.animate({path:this.path},150,"<>"),this.arc.animate({opacity:0},150,"<>"),this.selected=!1):void 0},b}(b.EventEmitter)}).call(this); \ No newline at end of file diff --git a/theme/bootstrap/views/js/New folder/plugins/morris/raphael.min.js b/theme/bootstrap/views/js/New folder/plugins/morris/raphael.min.js new file mode 100644 index 0000000..b40a005 --- /dev/null +++ b/theme/bootstrap/views/js/New folder/plugins/morris/raphael.min.js @@ -0,0 +1,11 @@ +// ┌────────────────────────────────────────────────────────────────────┐ \\ +// │ Raphaël 2.1.2 - JavaScript Vector Library │ \\ +// ├────────────────────────────────────────────────────────────────────┤ \\ +// │ Copyright © 2008-2012 Dmitry Baranovskiy (http://raphaeljs.com) │ \\ +// │ Copyright © 2008-2012 Sencha Labs (http://sencha.com) │ \\ +// ├────────────────────────────────────────────────────────────────────┤ \\ +// │ Licensed under the MIT (http://raphaeljs.com/license.html) license.│ \\ +// └────────────────────────────────────────────────────────────────────┘ \\ +!function(a){var b,c,d="0.4.2",e="hasOwnProperty",f=/[\.\/]/,g="*",h=function(){},i=function(a,b){return a-b},j={n:{}},k=function(a,d){a=String(a);var e,f=c,g=Array.prototype.slice.call(arguments,2),h=k.listeners(a),j=0,l=[],m={},n=[],o=b;b=a,c=0;for(var p=0,q=h.length;q>p;p++)"zIndex"in h[p]&&(l.push(h[p].zIndex),h[p].zIndex<0&&(m[h[p].zIndex]=h[p]));for(l.sort(i);l[j]<0;)if(e=m[l[j++]],n.push(e.apply(d,g)),c)return c=f,n;for(p=0;q>p;p++)if(e=h[p],"zIndex"in e)if(e.zIndex==l[j]){if(n.push(e.apply(d,g)),c)break;do if(j++,e=m[l[j]],e&&n.push(e.apply(d,g)),c)break;while(e)}else m[e.zIndex]=e;else if(n.push(e.apply(d,g)),c)break;return c=f,b=o,n.length?n:null};k._events=j,k.listeners=function(a){var b,c,d,e,h,i,k,l,m=a.split(f),n=j,o=[n],p=[];for(e=0,h=m.length;h>e;e++){for(l=[],i=0,k=o.length;k>i;i++)for(n=o[i].n,c=[n[m[e]],n[g]],d=2;d--;)b=c[d],b&&(l.push(b),p=p.concat(b.f||[]));o=l}return p},k.on=function(a,b){if(a=String(a),"function"!=typeof b)return function(){};for(var c=a.split(f),d=j,e=0,g=c.length;g>e;e++)d=d.n,d=d.hasOwnProperty(c[e])&&d[c[e]]||(d[c[e]]={n:{}});for(d.f=d.f||[],e=0,g=d.f.length;g>e;e++)if(d.f[e]==b)return h;return d.f.push(b),function(a){+a==+a&&(b.zIndex=+a)}},k.f=function(a){var b=[].slice.call(arguments,1);return function(){k.apply(null,[a,null].concat(b).concat([].slice.call(arguments,0)))}},k.stop=function(){c=1},k.nt=function(a){return a?new RegExp("(?:\\.|\\/|^)"+a+"(?:\\.|\\/|$)").test(b):b},k.nts=function(){return b.split(f)},k.off=k.unbind=function(a,b){if(!a)return k._events=j={n:{}},void 0;var c,d,h,i,l,m,n,o=a.split(f),p=[j];for(i=0,l=o.length;l>i;i++)for(m=0;m<p.length;m+=h.length-2){if(h=[m,1],c=p[m].n,o[i]!=g)c[o[i]]&&h.push(c[o[i]]);else for(d in c)c[e](d)&&h.push(c[d]);p.splice.apply(p,h)}for(i=0,l=p.length;l>i;i++)for(c=p[i];c.n;){if(b){if(c.f){for(m=0,n=c.f.length;n>m;m++)if(c.f[m]==b){c.f.splice(m,1);break}!c.f.length&&delete c.f}for(d in c.n)if(c.n[e](d)&&c.n[d].f){var q=c.n[d].f;for(m=0,n=q.length;n>m;m++)if(q[m]==b){q.splice(m,1);break}!q.length&&delete c.n[d].f}}else{delete c.f;for(d in c.n)c.n[e](d)&&c.n[d].f&&delete c.n[d].f}c=c.n}},k.once=function(a,b){var c=function(){return k.unbind(a,c),b.apply(this,arguments)};return k.on(a,c)},k.version=d,k.toString=function(){return"You are running Eve "+d},"undefined"!=typeof module&&module.exports?module.exports=k:"undefined"!=typeof define?define("eve",[],function(){return k}):a.eve=k}(this),function(a,b){"function"==typeof define&&define.amd?define(["eve"],function(c){return b(a,c)}):b(a,a.eve)}(this,function(a,b){function c(a){if(c.is(a,"function"))return u?a():b.on("raphael.DOMload",a);if(c.is(a,V))return c._engine.create[D](c,a.splice(0,3+c.is(a[0],T))).add(a);var d=Array.prototype.slice.call(arguments,0);if(c.is(d[d.length-1],"function")){var e=d.pop();return u?e.call(c._engine.create[D](c,d)):b.on("raphael.DOMload",function(){e.call(c._engine.create[D](c,d))})}return c._engine.create[D](c,arguments)}function d(a){if("function"==typeof a||Object(a)!==a)return a;var b=new a.constructor;for(var c in a)a[z](c)&&(b[c]=d(a[c]));return b}function e(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return a.push(a.splice(c,1)[0])}function f(a,b,c){function d(){var f=Array.prototype.slice.call(arguments,0),g=f.join("␀"),h=d.cache=d.cache||{},i=d.count=d.count||[];return h[z](g)?(e(i,g),c?c(h[g]):h[g]):(i.length>=1e3&&delete h[i.shift()],i.push(g),h[g]=a[D](b,f),c?c(h[g]):h[g])}return d}function g(){return this.hex}function h(a,b){for(var c=[],d=0,e=a.length;e-2*!b>d;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push(["C",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])}return c}function i(a,b,c,d,e){var f=-3*b+9*c-9*d+3*e,g=a*f+6*b-12*c+6*d;return a*g-3*b+3*c}function j(a,b,c,d,e,f,g,h,j){null==j&&(j=1),j=j>1?1:0>j?0:j;for(var k=j/2,l=12,m=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],n=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],o=0,p=0;l>p;p++){var q=k*m[p]+k,r=i(q,a,c,e,g),s=i(q,b,d,f,h),t=r*r+s*s;o+=n[p]*N.sqrt(t)}return k*o}function k(a,b,c,d,e,f,g,h,i){if(!(0>i||j(a,b,c,d,e,f,g,h)<i)){var k,l=1,m=l/2,n=l-m,o=.01;for(k=j(a,b,c,d,e,f,g,h,n);Q(k-i)>o;)m/=2,n+=(i>k?1:-1)*m,k=j(a,b,c,d,e,f,g,h,n);return n}}function l(a,b,c,d,e,f,g,h){if(!(O(a,c)<P(e,g)||P(a,c)>O(e,g)||O(b,d)<P(f,h)||P(b,d)>O(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(k){var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(!(n<+P(a,c).toFixed(2)||n>+O(a,c).toFixed(2)||n<+P(e,g).toFixed(2)||n>+O(e,g).toFixed(2)||o<+P(b,d).toFixed(2)||o>+O(b,d).toFixed(2)||o<+P(f,h).toFixed(2)||o>+O(f,h).toFixed(2)))return{x:l,y:m}}}}function m(a,b,d){var e=c.bezierBBox(a),f=c.bezierBBox(b);if(!c.isBBoxIntersect(e,f))return d?0:[];for(var g=j.apply(0,a),h=j.apply(0,b),i=O(~~(g/5),1),k=O(~~(h/5),1),m=[],n=[],o={},p=d?0:[],q=0;i+1>q;q++){var r=c.findDotsAtSegment.apply(c,a.concat(q/i));m.push({x:r.x,y:r.y,t:q/i})}for(q=0;k+1>q;q++)r=c.findDotsAtSegment.apply(c,b.concat(q/k)),n.push({x:r.x,y:r.y,t:q/k});for(q=0;i>q;q++)for(var s=0;k>s;s++){var t=m[q],u=m[q+1],v=n[s],w=n[s+1],x=Q(u.x-t.x)<.001?"y":"x",y=Q(w.x-v.x)<.001?"y":"x",z=l(t.x,t.y,u.x,u.y,v.x,v.y,w.x,w.y);if(z){if(o[z.x.toFixed(4)]==z.y.toFixed(4))continue;o[z.x.toFixed(4)]=z.y.toFixed(4);var A=t.t+Q((z[x]-t[x])/(u[x]-t[x]))*(u.t-t.t),B=v.t+Q((z[y]-v[y])/(w[y]-v[y]))*(w.t-v.t);A>=0&&1.001>=A&&B>=0&&1.001>=B&&(d?p++:p.push({x:z.x,y:z.y,t1:P(A,1),t2:P(B,1)}))}}return p}function n(a,b,d){a=c._path2curve(a),b=c._path2curve(b);for(var e,f,g,h,i,j,k,l,n,o,p=d?0:[],q=0,r=a.length;r>q;q++){var s=a[q];if("M"==s[0])e=i=s[1],f=j=s[2];else{"C"==s[0]?(n=[e,f].concat(s.slice(1)),e=n[6],f=n[7]):(n=[e,f,e,f,i,j,i,j],e=i,f=j);for(var t=0,u=b.length;u>t;t++){var v=b[t];if("M"==v[0])g=k=v[1],h=l=v[2];else{"C"==v[0]?(o=[g,h].concat(v.slice(1)),g=o[6],h=o[7]):(o=[g,h,g,h,k,l,k,l],g=k,h=l);var w=m(n,o,d);if(d)p+=w;else{for(var x=0,y=w.length;y>x;x++)w[x].segment1=q,w[x].segment2=t,w[x].bez1=n,w[x].bez2=o;p=p.concat(w)}}}}}return p}function o(a,b,c,d,e,f){null!=a?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function p(){return this.x+H+this.y+H+this.width+" × "+this.height}function q(a,b,c,d,e,f){function g(a){return((l*a+k)*a+j)*a}function h(a,b){var c=i(a,b);return((o*c+n)*c+m)*c}function i(a,b){var c,d,e,f,h,i;for(e=a,i=0;8>i;i++){if(f=g(e)-a,Q(f)<b)return e;if(h=(3*l*e+2*k)*e+j,Q(h)<1e-6)break;e-=f/h}if(c=0,d=1,e=a,c>e)return c;if(e>d)return d;for(;d>c;){if(f=g(e),Q(f-a)<b)return e;a>f?c=e:d=e,e=(d-c)/2+c}return e}var j=3*b,k=3*(d-b)-j,l=1-j-k,m=3*c,n=3*(e-c)-m,o=1-m-n;return h(a,1/(200*f))}function r(a,b){var c=[],d={};if(this.ms=b,this.times=1,a){for(var e in a)a[z](e)&&(d[_(e)]=a[e],c.push(_(e)));c.sort(lb)}this.anim=d,this.top=c[c.length-1],this.percents=c}function s(a,d,e,f,g,h){e=_(e);var i,j,k,l,m,n,p=a.ms,r={},s={},t={};if(f)for(v=0,x=ic.length;x>v;v++){var u=ic[v];if(u.el.id==d.id&&u.anim==a){u.percent!=e?(ic.splice(v,1),k=1):j=u,d.attr(u.totalOrigin);break}}else f=+s;for(var v=0,x=a.percents.length;x>v;v++){if(a.percents[v]==e||a.percents[v]>f*a.top){e=a.percents[v],m=a.percents[v-1]||0,p=p/a.top*(e-m),l=a.percents[v+1],i=a.anim[e];break}f&&d.attr(a.anim[a.percents[v]])}if(i){if(j)j.initstatus=f,j.start=new Date-j.ms*f;else{for(var y in i)if(i[z](y)&&(db[z](y)||d.paper.customAttributes[z](y)))switch(r[y]=d.attr(y),null==r[y]&&(r[y]=cb[y]),s[y]=i[y],db[y]){case T:t[y]=(s[y]-r[y])/p;break;case"colour":r[y]=c.getRGB(r[y]);var A=c.getRGB(s[y]);t[y]={r:(A.r-r[y].r)/p,g:(A.g-r[y].g)/p,b:(A.b-r[y].b)/p};break;case"path":var B=Kb(r[y],s[y]),C=B[1];for(r[y]=B[0],t[y]=[],v=0,x=r[y].length;x>v;v++){t[y][v]=[0];for(var D=1,F=r[y][v].length;F>D;D++)t[y][v][D]=(C[v][D]-r[y][v][D])/p}break;case"transform":var G=d._,H=Pb(G[y],s[y]);if(H)for(r[y]=H.from,s[y]=H.to,t[y]=[],t[y].real=!0,v=0,x=r[y].length;x>v;v++)for(t[y][v]=[r[y][v][0]],D=1,F=r[y][v].length;F>D;D++)t[y][v][D]=(s[y][v][D]-r[y][v][D])/p;else{var K=d.matrix||new o,L={_:{transform:G.transform},getBBox:function(){return d.getBBox(1)}};r[y]=[K.a,K.b,K.c,K.d,K.e,K.f],Nb(L,s[y]),s[y]=L._.transform,t[y]=[(L.matrix.a-K.a)/p,(L.matrix.b-K.b)/p,(L.matrix.c-K.c)/p,(L.matrix.d-K.d)/p,(L.matrix.e-K.e)/p,(L.matrix.f-K.f)/p]}break;case"csv":var M=I(i[y])[J](w),N=I(r[y])[J](w);if("clip-rect"==y)for(r[y]=N,t[y]=[],v=N.length;v--;)t[y][v]=(M[v]-r[y][v])/p;s[y]=M;break;default:for(M=[][E](i[y]),N=[][E](r[y]),t[y]=[],v=d.paper.customAttributes[y].length;v--;)t[y][v]=((M[v]||0)-(N[v]||0))/p}var O=i.easing,P=c.easing_formulas[O];if(!P)if(P=I(O).match(Z),P&&5==P.length){var Q=P;P=function(a){return q(a,+Q[1],+Q[2],+Q[3],+Q[4],p)}}else P=nb;if(n=i.start||a.start||+new Date,u={anim:a,percent:e,timestamp:n,start:n+(a.del||0),status:0,initstatus:f||0,stop:!1,ms:p,easing:P,from:r,diff:t,to:s,el:d,callback:i.callback,prev:m,next:l,repeat:h||a.times,origin:d.attr(),totalOrigin:g},ic.push(u),f&&!j&&!k&&(u.stop=!0,u.start=new Date-p*f,1==ic.length))return kc();k&&(u.start=new Date-u.ms*f),1==ic.length&&jc(kc)}b("raphael.anim.start."+d.id,d,a)}}function t(a){for(var b=0;b<ic.length;b++)ic[b].el.paper==a&&ic.splice(b--,1)}c.version="2.1.2",c.eve=b;var u,v,w=/[, ]+/,x={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},y=/\{(\d+)\}/g,z="hasOwnProperty",A={doc:document,win:a},B={was:Object.prototype[z].call(A.win,"Raphael"),is:A.win.Raphael},C=function(){this.ca=this.customAttributes={}},D="apply",E="concat",F="ontouchstart"in A.win||A.win.DocumentTouch&&A.doc instanceof DocumentTouch,G="",H=" ",I=String,J="split",K="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[J](H),L={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},M=I.prototype.toLowerCase,N=Math,O=N.max,P=N.min,Q=N.abs,R=N.pow,S=N.PI,T="number",U="string",V="array",W=Object.prototype.toString,X=(c._ISURL=/^url\(['"]?([^\)]+?)['"]?\)$/i,/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i),Y={NaN:1,Infinity:1,"-Infinity":1},Z=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,$=N.round,_=parseFloat,ab=parseInt,bb=I.prototype.toUpperCase,cb=c._availableAttrs={"arrow-end":"none","arrow-start":"none",blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/","letter-spacing":0,opacity:1,path:"M0,0",r:0,rx:0,ry:0,src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",transform:"",width:0,x:0,y:0},db=c._availableAnimAttrs={blur:T,"clip-rect":"csv",cx:T,cy:T,fill:"colour","fill-opacity":T,"font-size":T,height:T,opacity:T,path:"path",r:T,rx:T,ry:T,stroke:"colour","stroke-opacity":T,"stroke-width":T,transform:"transform",width:T,x:T,y:T},eb=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/,fb={hs:1,rg:1},gb=/,?([achlmqrstvxz]),?/gi,hb=/([achlmrqstvz])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,ib=/([rstm])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,jb=/(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/gi,kb=(c._radial_gradient=/^r(?:\(([^,]+?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*([^\)]+?)\))?/,{}),lb=function(a,b){return _(a)-_(b)},mb=function(){},nb=function(a){return a},ob=c._rectPath=function(a,b,c,d,e){return e?[["M",a+e,b],["l",c-2*e,0],["a",e,e,0,0,1,e,e],["l",0,d-2*e],["a",e,e,0,0,1,-e,e],["l",2*e-c,0],["a",e,e,0,0,1,-e,-e],["l",0,2*e-d],["a",e,e,0,0,1,e,-e],["z"]]:[["M",a,b],["l",c,0],["l",0,d],["l",-c,0],["z"]]},pb=function(a,b,c,d){return null==d&&(d=c),[["M",a,b],["m",0,-d],["a",c,d,0,1,1,0,2*d],["a",c,d,0,1,1,0,-2*d],["z"]]},qb=c._getPath={path:function(a){return a.attr("path")},circle:function(a){var b=a.attrs;return pb(b.cx,b.cy,b.r)},ellipse:function(a){var b=a.attrs;return pb(b.cx,b.cy,b.rx,b.ry)},rect:function(a){var b=a.attrs;return ob(b.x,b.y,b.width,b.height,b.r)},image:function(a){var b=a.attrs;return ob(b.x,b.y,b.width,b.height)},text:function(a){var b=a._getBBox();return ob(b.x,b.y,b.width,b.height)},set:function(a){var b=a._getBBox();return ob(b.x,b.y,b.width,b.height)}},rb=c.mapPath=function(a,b){if(!b)return a;var c,d,e,f,g,h,i;for(a=Kb(a),e=0,g=a.length;g>e;e++)for(i=a[e],f=1,h=i.length;h>f;f+=2)c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d;return a};if(c._g=A,c.type=A.win.SVGAngle||A.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML","VML"==c.type){var sb,tb=A.doc.createElement("div");if(tb.innerHTML='<v:shape adj="1"/>',sb=tb.firstChild,sb.style.behavior="url(#default#VML)",!sb||"object"!=typeof sb.adj)return c.type=G;tb=null}c.svg=!(c.vml="VML"==c.type),c._Paper=C,c.fn=v=C.prototype=c.prototype,c._id=0,c._oid=0,c.is=function(a,b){return b=M.call(b),"finite"==b?!Y[z](+a):"array"==b?a instanceof Array:"null"==b&&null===a||b==typeof a&&null!==a||"object"==b&&a===Object(a)||"array"==b&&Array.isArray&&Array.isArray(a)||W.call(a).slice(8,-1).toLowerCase()==b},c.angle=function(a,b,d,e,f,g){if(null==f){var h=a-d,i=b-e;return h||i?(180+180*N.atan2(-i,-h)/S+360)%360:0}return c.angle(a,b,f,g)-c.angle(d,e,f,g)},c.rad=function(a){return a%360*S/180},c.deg=function(a){return 180*a/S%360},c.snapTo=function(a,b,d){if(d=c.is(d,"finite")?d:10,c.is(a,V)){for(var e=a.length;e--;)if(Q(a[e]-b)<=d)return a[e]}else{a=+a;var f=b%a;if(d>f)return b-f;if(f>a-d)return b-f+a}return b},c.createUUID=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=0|16*N.random(),c="x"==a?b:8|3&b;return c.toString(16)}),c.setWindow=function(a){b("raphael.setWindow",c,A.win,a),A.win=a,A.doc=A.win.document,c._engine.initWin&&c._engine.initWin(A.win)};var ub=function(a){if(c.vml){var b,d=/^\s+|\s+$/g;try{var e=new ActiveXObject("htmlfile");e.write("<body>"),e.close(),b=e.body}catch(g){b=createPopup().document.body}var h=b.createTextRange();ub=f(function(a){try{b.style.color=I(a).replace(d,G);var c=h.queryCommandValue("ForeColor");return c=(255&c)<<16|65280&c|(16711680&c)>>>16,"#"+("000000"+c.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=A.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",A.doc.body.appendChild(i),ub=f(function(a){return i.style.color=a,A.doc.defaultView.getComputedStyle(i,G).getPropertyValue("color")})}return ub(a)},vb=function(){return"hsb("+[this.h,this.s,this.b]+")"},wb=function(){return"hsl("+[this.h,this.s,this.l]+")"},xb=function(){return this.hex},yb=function(a,b,d){if(null==b&&c.is(a,"object")&&"r"in a&&"g"in a&&"b"in a&&(d=a.b,b=a.g,a=a.r),null==b&&c.is(a,U)){var e=c.getRGB(a);a=e.r,b=e.g,d=e.b}return(a>1||b>1||d>1)&&(a/=255,b/=255,d/=255),[a,b,d]},zb=function(a,b,d,e){a*=255,b*=255,d*=255;var f={r:a,g:b,b:d,hex:c.rgb(a,b,d),toString:xb};return c.is(e,"finite")&&(f.opacity=e),f};c.color=function(a){var b;return c.is(a,"object")&&"h"in a&&"s"in a&&"b"in a?(b=c.hsb2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.hex=b.hex):c.is(a,"object")&&"h"in a&&"s"in a&&"l"in a?(b=c.hsl2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.hex=b.hex):(c.is(a,"string")&&(a=c.getRGB(a)),c.is(a,"object")&&"r"in a&&"g"in a&&"b"in a?(b=c.rgb2hsl(a),a.h=b.h,a.s=b.s,a.l=b.l,b=c.rgb2hsb(a),a.v=b.b):(a={hex:"none"},a.r=a.g=a.b=a.h=a.s=a.v=a.l=-1)),a.toString=xb,a},c.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,a=a.h,d=a.o),a*=360;var e,f,g,h,i;return a=a%360/60,i=c*b,h=i*(1-Q(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],zb(e,f,g,d)},c.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h),(a>1||b>1||c>1)&&(a/=360,b/=100,c/=100),a*=360;var e,f,g,h,i;return a=a%360/60,i=2*b*(.5>c?c:1-c),h=i*(1-Q(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],zb(e,f,g,d)},c.rgb2hsb=function(a,b,c){c=yb(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;return f=O(a,b,c),g=f-P(a,b,c),d=0==g?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=60*((d+360)%6)/360,e=0==g?0:g/f,{h:d,s:e,b:f,toString:vb}},c.rgb2hsl=function(a,b,c){c=yb(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;return g=O(a,b,c),h=P(a,b,c),i=g-h,d=0==i?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=60*((d+360)%6)/360,f=(g+h)/2,e=0==i?0:.5>f?i/(2*f):i/(2-2*f),{h:d,s:e,l:f,toString:wb}},c._path2string=function(){return this.join(",").replace(gb,"$1")},c._preload=function(a,b){var c=A.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top:-9999em",c.onload=function(){b.call(this),this.onload=null,A.doc.body.removeChild(this)},c.onerror=function(){A.doc.body.removeChild(this)},A.doc.body.appendChild(c),c.src=a},c.getRGB=f(function(a){if(!a||(a=I(a)).indexOf("-")+1)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:g};if("none"==a)return{r:-1,g:-1,b:-1,hex:"none",toString:g};!(fb[z](a.toLowerCase().substring(0,2))||"#"==a.charAt())&&(a=ub(a));var b,d,e,f,h,i,j=a.match(X);return j?(j[2]&&(e=ab(j[2].substring(5),16),d=ab(j[2].substring(3,5),16),b=ab(j[2].substring(1,3),16)),j[3]&&(e=ab((h=j[3].charAt(3))+h,16),d=ab((h=j[3].charAt(2))+h,16),b=ab((h=j[3].charAt(1))+h,16)),j[4]&&(i=j[4][J](eb),b=_(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),"rgba"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&"%"==i[3].slice(-1)&&(f/=100)),j[5]?(i=j[5][J](eb),b=_(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(b/=360),"hsba"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&"%"==i[3].slice(-1)&&(f/=100),c.hsb2rgb(b,d,e,f)):j[6]?(i=j[6][J](eb),b=_(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(b/=360),"hsla"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&"%"==i[3].slice(-1)&&(f/=100),c.hsl2rgb(b,d,e,f)):(j={r:b,g:d,b:e,toString:g},j.hex="#"+(16777216|e|d<<8|b<<16).toString(16).slice(1),c.is(f,"finite")&&(j.opacity=f),j)):{r:-1,g:-1,b:-1,hex:"none",error:1,toString:g}},c),c.hsb=f(function(a,b,d){return c.hsb2rgb(a,b,d).hex}),c.hsl=f(function(a,b,d){return c.hsl2rgb(a,b,d).hex}),c.rgb=f(function(a,b,c){return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),c.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);return b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b})),c.hex},c.getColor.reset=function(){delete this.start},c.parsePathString=function(a){if(!a)return null;var b=Ab(a);if(b.arr)return Cb(b.arr);var d={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},e=[];return c.is(a,V)&&c.is(a[0],V)&&(e=Cb(a)),e.length||I(a).replace(hb,function(a,b,c){var f=[],g=b.toLowerCase();if(c.replace(jb,function(a,b){b&&f.push(+b)}),"m"==g&&f.length>2&&(e.push([b][E](f.splice(0,2))),g="l",b="m"==b?"l":"L"),"r"==g)e.push([b][E](f));else for(;f.length>=d[g]&&(e.push([b][E](f.splice(0,d[g]))),d[g]););}),e.toString=c._path2string,b.arr=Cb(e),e},c.parseTransformString=f(function(a){if(!a)return null;var b=[];return c.is(a,V)&&c.is(a[0],V)&&(b=Cb(a)),b.length||I(a).replace(ib,function(a,c,d){var e=[];M.call(c),d.replace(jb,function(a,b){b&&e.push(+b)}),b.push([c][E](e))}),b.toString=c._path2string,b});var Ab=function(a){var b=Ab.ps=Ab.ps||{};return b[a]?b[a].sleep=100:b[a]={sleep:100},setTimeout(function(){for(var c in b)b[z](c)&&c!=a&&(b[c].sleep--,!b[c].sleep&&delete b[c])}),b[a]};c.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=R(j,3),l=R(j,2),m=i*i,n=m*i,o=k*a+3*l*i*c+3*j*i*i*e+n*g,p=k*b+3*l*i*d+3*j*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,w=j*e+i*g,x=j*f+i*h,y=90-180*N.atan2(q-s,r-t)/S;return(q>s||t>r)&&(y+=180),{x:o,y:p,m:{x:q,y:r},n:{x:s,y:t},start:{x:u,y:v},end:{x:w,y:x},alpha:y}},c.bezierBBox=function(a,b,d,e,f,g,h,i){c.is(a,"array")||(a=[a,b,d,e,f,g,h,i]);var j=Jb.apply(null,a);return{x:j.min.x,y:j.min.y,x2:j.max.x,y2:j.max.y,width:j.max.x-j.min.x,height:j.max.y-j.min.y}},c.isPointInsideBBox=function(a,b,c){return b>=a.x&&b<=a.x2&&c>=a.y&&c<=a.y2},c.isBBoxIntersect=function(a,b){var d=c.isPointInsideBBox;return d(b,a.x,a.y)||d(b,a.x2,a.y)||d(b,a.x,a.y2)||d(b,a.x2,a.y2)||d(a,b.x,b.y)||d(a,b.x2,b.y)||d(a,b.x,b.y2)||d(a,b.x2,b.y2)||(a.x<b.x2&&a.x>b.x||b.x<a.x2&&b.x>a.x)&&(a.y<b.y2&&a.y>b.y||b.y<a.y2&&b.y>a.y)},c.pathIntersection=function(a,b){return n(a,b)},c.pathIntersectionNumber=function(a,b){return n(a,b,1)},c.isPointInsidePath=function(a,b,d){var e=c.pathBBox(a);return c.isPointInsideBBox(e,b,d)&&1==n(a,[["M",b,d],["H",e.x2+10]],1)%2},c._removedFactory=function(a){return function(){b("raphael.log",null,"Raphaël: you are calling to method “"+a+"” of removed object",a)}};var Bb=c.pathBBox=function(a){var b=Ab(a);if(b.bbox)return d(b.bbox);if(!a)return{x:0,y:0,width:0,height:0,x2:0,y2:0};a=Kb(a);for(var c,e=0,f=0,g=[],h=[],i=0,j=a.length;j>i;i++)if(c=a[i],"M"==c[0])e=c[1],f=c[2],g.push(e),h.push(f);else{var k=Jb(e,f,c[1],c[2],c[3],c[4],c[5],c[6]);g=g[E](k.min.x,k.max.x),h=h[E](k.min.y,k.max.y),e=c[5],f=c[6]}var l=P[D](0,g),m=P[D](0,h),n=O[D](0,g),o=O[D](0,h),p=n-l,q=o-m,r={x:l,y:m,x2:n,y2:o,width:p,height:q,cx:l+p/2,cy:m+q/2};return b.bbox=d(r),r},Cb=function(a){var b=d(a);return b.toString=c._path2string,b},Db=c._pathToRelative=function(a){var b=Ab(a);if(b.rel)return Cb(b.rel);c.is(a,V)&&c.is(a&&a[0],V)||(a=c.parsePathString(a));var d=[],e=0,f=0,g=0,h=0,i=0;"M"==a[0][0]&&(e=a[0][1],f=a[0][2],g=e,h=f,i++,d.push(["M",e,f]));for(var j=i,k=a.length;k>j;j++){var l=d[j]=[],m=a[j];if(m[0]!=M.call(m[0]))switch(l[0]=M.call(m[0]),l[0]){case"a":l[1]=m[1],l[2]=m[2],l[3]=m[3],l[4]=m[4],l[5]=m[5],l[6]=+(m[6]-e).toFixed(3),l[7]=+(m[7]-f).toFixed(3);break;case"v":l[1]=+(m[1]-f).toFixed(3);break;case"m":g=m[1],h=m[2];default:for(var n=1,o=m.length;o>n;n++)l[n]=+(m[n]-(n%2?e:f)).toFixed(3)}else{l=d[j]=[],"m"==m[0]&&(g=m[1]+e,h=m[2]+f);for(var p=0,q=m.length;q>p;p++)d[j][p]=m[p]}var r=d[j].length;switch(d[j][0]){case"z":e=g,f=h;break;case"h":e+=+d[j][r-1];break;case"v":f+=+d[j][r-1];break;default:e+=+d[j][r-2],f+=+d[j][r-1]}}return d.toString=c._path2string,b.rel=Cb(d),d},Eb=c._pathToAbsolute=function(a){var b=Ab(a);if(b.abs)return Cb(b.abs);if(c.is(a,V)&&c.is(a&&a[0],V)||(a=c.parsePathString(a)),!a||!a.length)return[["M",0,0]];var d=[],e=0,f=0,g=0,i=0,j=0;"M"==a[0][0]&&(e=+a[0][1],f=+a[0][2],g=e,i=f,j++,d[0]=["M",e,f]);for(var k,l,m=3==a.length&&"M"==a[0][0]&&"R"==a[1][0].toUpperCase()&&"Z"==a[2][0].toUpperCase(),n=j,o=a.length;o>n;n++){if(d.push(k=[]),l=a[n],l[0]!=bb.call(l[0]))switch(k[0]=bb.call(l[0]),k[0]){case"A":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]+e),k[7]=+(l[7]+f);break;case"V":k[1]=+l[1]+f;break;case"H":k[1]=+l[1]+e;break;case"R":for(var p=[e,f][E](l.slice(1)),q=2,r=p.length;r>q;q++)p[q]=+p[q]+e,p[++q]=+p[q]+f;d.pop(),d=d[E](h(p,m));break;case"M":g=+l[1]+e,i=+l[2]+f;default:for(q=1,r=l.length;r>q;q++)k[q]=+l[q]+(q%2?e:f)}else if("R"==l[0])p=[e,f][E](l.slice(1)),d.pop(),d=d[E](h(p,m)),k=["R"][E](l.slice(-2));else for(var s=0,t=l.length;t>s;s++)k[s]=l[s];switch(k[0]){case"Z":e=g,f=i;break;case"H":e=k[1];break;case"V":f=k[1];break;case"M":g=k[k.length-2],i=k[k.length-1];default:e=k[k.length-2],f=k[k.length-1]}}return d.toString=c._path2string,b.abs=Cb(d),d},Fb=function(a,b,c,d){return[a,b,c,d,c,d]},Gb=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},Hb=function(a,b,c,d,e,g,h,i,j,k){var l,m=120*S/180,n=S/180*(+e||0),o=[],p=f(function(a,b,c){var d=a*N.cos(c)-b*N.sin(c),e=a*N.sin(c)+b*N.cos(c);return{x:d,y:e}});if(k)y=k[0],z=k[1],w=k[2],x=k[3];else{l=p(a,b,-n),a=l.x,b=l.y,l=p(i,j,-n),i=l.x,j=l.y;var q=(N.cos(S/180*e),N.sin(S/180*e),(a-i)/2),r=(b-j)/2,s=q*q/(c*c)+r*r/(d*d);s>1&&(s=N.sqrt(s),c=s*c,d=s*d);var t=c*c,u=d*d,v=(g==h?-1:1)*N.sqrt(Q((t*u-t*r*r-u*q*q)/(t*r*r+u*q*q))),w=v*c*r/d+(a+i)/2,x=v*-d*q/c+(b+j)/2,y=N.asin(((b-x)/d).toFixed(9)),z=N.asin(((j-x)/d).toFixed(9));y=w>a?S-y:y,z=w>i?S-z:z,0>y&&(y=2*S+y),0>z&&(z=2*S+z),h&&y>z&&(y-=2*S),!h&&z>y&&(z-=2*S)}var A=z-y;if(Q(A)>m){var B=z,C=i,D=j;z=y+m*(h&&z>y?1:-1),i=w+c*N.cos(z),j=x+d*N.sin(z),o=Hb(i,j,c,d,e,0,h,C,D,[z,B,w,x])}A=z-y;var F=N.cos(y),G=N.sin(y),H=N.cos(z),I=N.sin(z),K=N.tan(A/4),L=4/3*c*K,M=4/3*d*K,O=[a,b],P=[a+L*G,b-M*F],R=[i+L*I,j-M*H],T=[i,j];if(P[0]=2*O[0]-P[0],P[1]=2*O[1]-P[1],k)return[P,R,T][E](o);o=[P,R,T][E](o).join()[J](",");for(var U=[],V=0,W=o.length;W>V;V++)U[V]=V%2?p(o[V-1],o[V],n).y:p(o[V],o[V+1],n).x;return U},Ib=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:R(j,3)*a+3*R(j,2)*i*c+3*j*i*i*e+R(i,3)*g,y:R(j,3)*b+3*R(j,2)*i*d+3*j*i*i*f+R(i,3)*h}},Jb=f(function(a,b,c,d,e,f,g,h){var i,j=e-2*c+a-(g-2*e+c),k=2*(c-a)-2*(e-c),l=a-c,m=(-k+N.sqrt(k*k-4*j*l))/2/j,n=(-k-N.sqrt(k*k-4*j*l))/2/j,o=[b,h],p=[a,g];return Q(m)>"1e12"&&(m=.5),Q(n)>"1e12"&&(n=.5),m>0&&1>m&&(i=Ib(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ib(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),j=f-2*d+b-(h-2*f+d),k=2*(d-b)-2*(f-d),l=b-d,m=(-k+N.sqrt(k*k-4*j*l))/2/j,n=(-k-N.sqrt(k*k-4*j*l))/2/j,Q(m)>"1e12"&&(m=.5),Q(n)>"1e12"&&(n=.5),m>0&&1>m&&(i=Ib(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ib(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),{min:{x:P[D](0,p),y:P[D](0,o)},max:{x:O[D](0,p),y:O[D](0,o)}}}),Kb=c._path2curve=f(function(a,b){var c=!b&&Ab(a);if(!b&&c.curve)return Cb(c.curve);for(var d=Eb(a),e=b&&Eb(b),f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},h=(function(a,b,c){var d,e;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];switch(!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null),a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][E](Hb[D](0,[b.x,b.y][E](a.slice(1))));break;case"S":"C"==c||"S"==c?(d=2*b.x-b.bx,e=2*b.y-b.by):(d=b.x,e=b.y),a=["C",d,e][E](a.slice(1));break;case"T":"Q"==c||"T"==c?(b.qx=2*b.x-b.qx,b.qy=2*b.y-b.qy):(b.qx=b.x,b.qy=b.y),a=["C"][E](Gb(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][E](Gb(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][E](Fb(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][E](Fb(b.x,b.y,a[1],b.y));break;case"V":a=["C"][E](Fb(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][E](Fb(b.x,b.y,b.X,b.Y))}return a}),i=function(a,b){if(a[b].length>7){a[b].shift();for(var c=a[b];c.length;)a.splice(b++,0,["C"][E](c.splice(0,6)));a.splice(b,1),l=O(d.length,e&&e.length||0)}},j=function(a,b,c,f,g){a&&b&&"M"==a[g][0]&&"M"!=b[g][0]&&(b.splice(g,0,["M",f.x,f.y]),c.bx=0,c.by=0,c.x=a[g][1],c.y=a[g][2],l=O(d.length,e&&e.length||0))},k=0,l=O(d.length,e&&e.length||0);l>k;k++){d[k]=h(d[k],f),i(d,k),e&&(e[k]=h(e[k],g)),e&&i(e,k),j(d,e,f,g,k),j(e,d,g,f,k);var m=d[k],n=e&&e[k],o=m.length,p=e&&n.length;f.x=m[o-2],f.y=m[o-1],f.bx=_(m[o-4])||f.x,f.by=_(m[o-3])||f.y,g.bx=e&&(_(n[p-4])||g.x),g.by=e&&(_(n[p-3])||g.y),g.x=e&&n[p-2],g.y=e&&n[p-1]}return e||(c.curve=Cb(d)),e?[d,e]:d},null,Cb),Lb=(c._parseDots=f(function(a){for(var b=[],d=0,e=a.length;e>d;d++){var f={},g=a[d].match(/^([^:]*):?([\d\.]*)/);if(f.color=c.getRGB(g[1]),f.color.error)return null;f.color=f.color.hex,g[2]&&(f.offset=g[2]+"%"),b.push(f)}for(d=1,e=b.length-1;e>d;d++)if(!b[d].offset){for(var h=_(b[d-1].offset||0),i=0,j=d+1;e>j;j++)if(b[j].offset){i=b[j].offset;break}i||(i=100,j=e),i=_(i);for(var k=(i-h)/(j-d+1);j>d;d++)h+=k,b[d].offset=h+"%"}return b}),c._tear=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)}),Mb=(c._tofront=function(a,b){b.top!==a&&(Lb(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},c._toback=function(a,b){b.bottom!==a&&(Lb(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},c._insertafter=function(a,b,c){Lb(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},c._insertbefore=function(a,b,c){Lb(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},c.toMatrix=function(a,b){var c=Bb(a),d={_:{transform:G},getBBox:function(){return c}};return Nb(d,b),d.matrix}),Nb=(c.transformPath=function(a,b){return rb(a,Mb(a,b))},c._extractTransform=function(a,b){if(null==b)return a._.transform;b=I(b).replace(/\.{3}|\u2026/g,a._.transform||G);var d=c.parseTransformString(b),e=0,f=0,g=0,h=1,i=1,j=a._,k=new o;if(j.transform=d||[],d)for(var l=0,m=d.length;m>l;l++){var n,p,q,r,s,t=d[l],u=t.length,v=I(t[0]).toLowerCase(),w=t[0]!=v,x=w?k.invert():0;"t"==v&&3==u?w?(n=x.x(0,0),p=x.y(0,0),q=x.x(t[1],t[2]),r=x.y(t[1],t[2]),k.translate(q-n,r-p)):k.translate(t[1],t[2]):"r"==v?2==u?(s=s||a.getBBox(1),k.rotate(t[1],s.x+s.width/2,s.y+s.height/2),e+=t[1]):4==u&&(w?(q=x.x(t[2],t[3]),r=x.y(t[2],t[3]),k.rotate(t[1],q,r)):k.rotate(t[1],t[2],t[3]),e+=t[1]):"s"==v?2==u||3==u?(s=s||a.getBBox(1),k.scale(t[1],t[u-1],s.x+s.width/2,s.y+s.height/2),h*=t[1],i*=t[u-1]):5==u&&(w?(q=x.x(t[3],t[4]),r=x.y(t[3],t[4]),k.scale(t[1],t[2],q,r)):k.scale(t[1],t[2],t[3],t[4]),h*=t[1],i*=t[2]):"m"==v&&7==u&&k.add(t[1],t[2],t[3],t[4],t[5],t[6]),j.dirtyT=1,a.matrix=k}a.matrix=k,j.sx=h,j.sy=i,j.deg=e,j.dx=f=k.e,j.dy=g=k.f,1==h&&1==i&&!e&&j.bbox?(j.bbox.x+=+f,j.bbox.y+=+g):j.dirtyT=1}),Ob=function(a){var b=a[0];switch(b.toLowerCase()){case"t":return[b,0,0];case"m":return[b,1,0,0,1,0,0];case"r":return 4==a.length?[b,0,a[2],a[3]]:[b,0];case"s":return 5==a.length?[b,1,1,a[3],a[4]]:3==a.length?[b,1,1]:[b,1]}},Pb=c._equaliseTransform=function(a,b){b=I(b).replace(/\.{3}|\u2026/g,a),a=c.parseTransformString(a)||[],b=c.parseTransformString(b)||[];for(var d,e,f,g,h=O(a.length,b.length),i=[],j=[],k=0;h>k;k++){if(f=a[k]||Ob(b[k]),g=b[k]||Ob(f),f[0]!=g[0]||"r"==f[0].toLowerCase()&&(f[2]!=g[2]||f[3]!=g[3])||"s"==f[0].toLowerCase()&&(f[3]!=g[3]||f[4]!=g[4]))return;for(i[k]=[],j[k]=[],d=0,e=O(f.length,g.length);e>d;d++)d in f&&(i[k][d]=f[d]),d in g&&(j[k][d]=g[d]) +}return{from:i,to:j}};c._getContainer=function(a,b,d,e){var f;return f=null!=e||c.is(a,"object")?a:A.doc.getElementById(a),null!=f?f.tagName?null==b?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:b,height:d}:{container:1,x:a,y:b,width:d,height:e}:void 0},c.pathToRelative=Db,c._engine={},c.path2curve=Kb,c.matrix=function(a,b,c,d,e,f){return new o(a,b,c,d,e,f)},function(a){function b(a){return a[0]*a[0]+a[1]*a[1]}function d(a){var c=N.sqrt(b(a));a[0]&&(a[0]/=c),a[1]&&(a[1]/=c)}a.add=function(a,b,c,d,e,f){var g,h,i,j,k=[[],[],[]],l=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],m=[[a,c,e],[b,d,f],[0,0,1]];for(a&&a instanceof o&&(m=[[a.a,a.c,a.e],[a.b,a.d,a.f],[0,0,1]]),g=0;3>g;g++)for(h=0;3>h;h++){for(j=0,i=0;3>i;i++)j+=l[g][i]*m[i][h];k[g][h]=j}this.a=k[0][0],this.b=k[1][0],this.c=k[0][1],this.d=k[1][1],this.e=k[0][2],this.f=k[1][2]},a.invert=function(){var a=this,b=a.a*a.d-a.b*a.c;return new o(a.d/b,-a.b/b,-a.c/b,a.a/b,(a.c*a.f-a.d*a.e)/b,(a.b*a.e-a.a*a.f)/b)},a.clone=function(){return new o(this.a,this.b,this.c,this.d,this.e,this.f)},a.translate=function(a,b){this.add(1,0,0,1,a,b)},a.scale=function(a,b,c,d){null==b&&(b=a),(c||d)&&this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),(c||d)&&this.add(1,0,0,1,-c,-d)},a.rotate=function(a,b,d){a=c.rad(a),b=b||0,d=d||0;var e=+N.cos(a).toFixed(9),f=+N.sin(a).toFixed(9);this.add(e,f,-f,e,b,d),this.add(1,0,0,1,-b,-d)},a.x=function(a,b){return a*this.a+b*this.c+this.e},a.y=function(a,b){return a*this.b+b*this.d+this.f},a.get=function(a){return+this[I.fromCharCode(97+a)].toFixed(4)},a.toString=function(){return c.svg?"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},a.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0)+", M12="+this.get(2)+", M21="+this.get(1)+", M22="+this.get(3)+", Dx="+this.get(4)+", Dy="+this.get(5)+", sizingmethod='auto expand')"},a.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},a.split=function(){var a={};a.dx=this.e,a.dy=this.f;var e=[[this.a,this.c],[this.b,this.d]];a.scalex=N.sqrt(b(e[0])),d(e[0]),a.shear=e[0][0]*e[1][0]+e[0][1]*e[1][1],e[1]=[e[1][0]-e[0][0]*a.shear,e[1][1]-e[0][1]*a.shear],a.scaley=N.sqrt(b(e[1])),d(e[1]),a.shear/=a.scaley;var f=-e[0][1],g=e[1][1];return 0>g?(a.rotate=c.deg(N.acos(g)),0>f&&(a.rotate=360-a.rotate)):a.rotate=c.deg(N.asin(f)),a.isSimple=!(+a.shear.toFixed(9)||a.scalex.toFixed(9)!=a.scaley.toFixed(9)&&a.rotate),a.isSuperSimple=!+a.shear.toFixed(9)&&a.scalex.toFixed(9)==a.scaley.toFixed(9)&&!a.rotate,a.noRotation=!+a.shear.toFixed(9)&&!a.rotate,a},a.toTransformString=function(a){var b=a||this[J]();return b.isSimple?(b.scalex=+b.scalex.toFixed(4),b.scaley=+b.scaley.toFixed(4),b.rotate=+b.rotate.toFixed(4),(b.dx||b.dy?"t"+[b.dx,b.dy]:G)+(1!=b.scalex||1!=b.scaley?"s"+[b.scalex,b.scaley,0,0]:G)+(b.rotate?"r"+[b.rotate,0,0]:G)):"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(o.prototype);var Qb=navigator.userAgent.match(/Version\/(.*?)\s/)||navigator.userAgent.match(/Chrome\/(\d+)/);v.safari="Apple Computer, Inc."==navigator.vendor&&(Qb&&Qb[1]<4||"iP"==navigator.platform.slice(0,2))||"Google Inc."==navigator.vendor&&Qb&&Qb[1]<8?function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});setTimeout(function(){a.remove()})}:mb;for(var Rb=function(){this.returnValue=!1},Sb=function(){return this.originalEvent.preventDefault()},Tb=function(){this.cancelBubble=!0},Ub=function(){return this.originalEvent.stopPropagation()},Vb=function(a){var b=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,c=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft;return{x:a.clientX+c,y:a.clientY+b}},Wb=function(){return A.doc.addEventListener?function(a,b,c,d){var e=function(a){var b=Vb(a);return c.call(d,a,b.x,b.y)};if(a.addEventListener(b,e,!1),F&&L[b]){var f=function(b){for(var e=Vb(b),f=b,g=0,h=b.targetTouches&&b.targetTouches.length;h>g;g++)if(b.targetTouches[g].target==a){b=b.targetTouches[g],b.originalEvent=f,b.preventDefault=Sb,b.stopPropagation=Ub;break}return c.call(d,b,e.x,e.y)};a.addEventListener(L[b],f,!1)}return function(){return a.removeEventListener(b,e,!1),F&&L[b]&&a.removeEventListener(L[b],e,!1),!0}}:A.doc.attachEvent?function(a,b,c,d){var e=function(a){a=a||A.win.event;var b=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,e=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft,f=a.clientX+e,g=a.clientY+b;return a.preventDefault=a.preventDefault||Rb,a.stopPropagation=a.stopPropagation||Tb,c.call(d,a,f,g)};a.attachEvent("on"+b,e);var f=function(){return a.detachEvent("on"+b,e),!0};return f}:void 0}(),Xb=[],Yb=function(a){for(var c,d=a.clientX,e=a.clientY,f=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,g=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft,h=Xb.length;h--;){if(c=Xb[h],F&&a.touches){for(var i,j=a.touches.length;j--;)if(i=a.touches[j],i.identifier==c.el._drag.id){d=i.clientX,e=i.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}else a.preventDefault();var k,l=c.el.node,m=l.nextSibling,n=l.parentNode,o=l.style.display;A.win.opera&&n.removeChild(l),l.style.display="none",k=c.el.paper.getElementByPoint(d,e),l.style.display=o,A.win.opera&&(m?n.insertBefore(l,m):n.appendChild(l)),k&&b("raphael.drag.over."+c.el.id,c.el,k),d+=g,e+=f,b("raphael.drag.move."+c.el.id,c.move_scope||c.el,d-c.el._drag.x,e-c.el._drag.y,d,e,a)}},Zb=function(a){c.unmousemove(Yb).unmouseup(Zb);for(var d,e=Xb.length;e--;)d=Xb[e],d.el._drag={},b("raphael.drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,a);Xb=[]},$b=c.el={},_b=K.length;_b--;)!function(a){c[a]=$b[a]=function(b,d){return c.is(b,"function")&&(this.events=this.events||[],this.events.push({name:a,f:b,unbind:Wb(this.shape||this.node||A.doc,a,b,d||this)})),this},c["un"+a]=$b["un"+a]=function(b){for(var d=this.events||[],e=d.length;e--;)d[e].name!=a||!c.is(b,"undefined")&&d[e].f!=b||(d[e].unbind(),d.splice(e,1),!d.length&&delete this.events);return this}}(K[_b]);$b.data=function(a,d){var e=kb[this.id]=kb[this.id]||{};if(0==arguments.length)return e;if(1==arguments.length){if(c.is(a,"object")){for(var f in a)a[z](f)&&this.data(f,a[f]);return this}return b("raphael.data.get."+this.id,this,e[a],a),e[a]}return e[a]=d,b("raphael.data.set."+this.id,this,d,a),this},$b.removeData=function(a){return null==a?kb[this.id]={}:kb[this.id]&&delete kb[this.id][a],this},$b.getData=function(){return d(kb[this.id]||{})},$b.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},$b.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var ac=[];$b.drag=function(a,d,e,f,g,h){function i(i){(i.originalEvent||i).preventDefault();var j=i.clientX,k=i.clientY,l=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,m=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft;if(this._drag.id=i.identifier,F&&i.touches)for(var n,o=i.touches.length;o--;)if(n=i.touches[o],this._drag.id=n.identifier,n.identifier==this._drag.id){j=n.clientX,k=n.clientY;break}this._drag.x=j+m,this._drag.y=k+l,!Xb.length&&c.mousemove(Yb).mouseup(Zb),Xb.push({el:this,move_scope:f,start_scope:g,end_scope:h}),d&&b.on("raphael.drag.start."+this.id,d),a&&b.on("raphael.drag.move."+this.id,a),e&&b.on("raphael.drag.end."+this.id,e),b("raphael.drag.start."+this.id,g||f||this,i.clientX+m,i.clientY+l,i)}return this._drag={},ac.push({el:this,start:i}),this.mousedown(i),this},$b.onDragOver=function(a){a?b.on("raphael.drag.over."+this.id,a):b.unbind("raphael.drag.over."+this.id)},$b.undrag=function(){for(var a=ac.length;a--;)ac[a].el==this&&(this.unmousedown(ac[a].start),ac.splice(a,1),b.unbind("raphael.drag.*."+this.id));!ac.length&&c.unmousemove(Yb).unmouseup(Zb),Xb=[]},v.circle=function(a,b,d){var e=c._engine.circle(this,a||0,b||0,d||0);return this.__set__&&this.__set__.push(e),e},v.rect=function(a,b,d,e,f){var g=c._engine.rect(this,a||0,b||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},v.ellipse=function(a,b,d,e){var f=c._engine.ellipse(this,a||0,b||0,d||0,e||0);return this.__set__&&this.__set__.push(f),f},v.path=function(a){a&&!c.is(a,U)&&!c.is(a[0],V)&&(a+=G);var b=c._engine.path(c.format[D](c,arguments),this);return this.__set__&&this.__set__.push(b),b},v.image=function(a,b,d,e,f){var g=c._engine.image(this,a||"about:blank",b||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},v.text=function(a,b,d){var e=c._engine.text(this,a||0,b||0,I(d));return this.__set__&&this.__set__.push(e),e},v.set=function(a){!c.is(a,"array")&&(a=Array.prototype.splice.call(arguments,0,arguments.length));var b=new mc(a);return this.__set__&&this.__set__.push(b),b.paper=this,b.type="set",b},v.setStart=function(a){this.__set__=a||this.set()},v.setFinish=function(){var a=this.__set__;return delete this.__set__,a},v.setSize=function(a,b){return c._engine.setSize.call(this,a,b)},v.setViewBox=function(a,b,d,e,f){return c._engine.setViewBox.call(this,a,b,d,e,f)},v.top=v.bottom=null,v.raphael=c;var bc=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,g=e.clientLeft||d.clientLeft||0,h=b.top+(A.win.pageYOffset||e.scrollTop||d.scrollTop)-f,i=b.left+(A.win.pageXOffset||e.scrollLeft||d.scrollLeft)-g;return{y:h,x:i}};v.getElementByPoint=function(a,b){var c=this,d=c.canvas,e=A.doc.elementFromPoint(a,b);if(A.win.opera&&"svg"==e.tagName){var f=bc(d),g=d.createSVGRect();g.x=a-f.x,g.y=b-f.y,g.width=g.height=1;var h=d.getIntersectionList(g,null);h.length&&(e=h[h.length-1])}if(!e)return null;for(;e.parentNode&&e!=d.parentNode&&!e.raphael;)e=e.parentNode;return e==c.canvas.parentNode&&(e=d),e=e&&e.raphael?c.getById(e.raphaelid):null},v.getElementsByBBox=function(a){var b=this.set();return this.forEach(function(d){c.isBBoxIntersect(d.getBBox(),a)&&b.push(d)}),b},v.getById=function(a){for(var b=this.bottom;b;){if(b.id==a)return b;b=b.next}return null},v.forEach=function(a,b){for(var c=this.bottom;c;){if(a.call(b,c)===!1)return this;c=c.next}return this},v.getElementsByPoint=function(a,b){var c=this.set();return this.forEach(function(d){d.isPointInside(a,b)&&c.push(d)}),c},$b.isPointInside=function(a,b){var d=this.realPath=qb[this.type](this);return this.attr("transform")&&this.attr("transform").length&&(d=c.transformPath(d,this.attr("transform"))),c.isPointInsidePath(d,a,b)},$b.getBBox=function(a){if(this.removed)return{};var b=this._;return a?((b.dirty||!b.bboxwt)&&(this.realPath=qb[this.type](this),b.bboxwt=Bb(this.realPath),b.bboxwt.toString=p,b.dirty=0),b.bboxwt):((b.dirty||b.dirtyT||!b.bbox)&&((b.dirty||!this.realPath)&&(b.bboxwt=0,this.realPath=qb[this.type](this)),b.bbox=Bb(rb(this.realPath,this.matrix)),b.bbox.toString=p,b.dirty=b.dirtyT=0),b.bbox)},$b.clone=function(){if(this.removed)return null;var a=this.paper[this.type]().attr(this.attr());return this.__set__&&this.__set__.push(a),a},$b.glow=function(a){if("text"==this.type)return null;a=a||{};var b={width:(a.width||10)+(+this.attr("stroke-width")||1),fill:a.fill||!1,opacity:a.opacity||.5,offsetx:a.offsetx||0,offsety:a.offsety||0,color:a.color||"#000"},c=b.width/2,d=this.paper,e=d.set(),f=this.realPath||qb[this.type](this);f=this.matrix?rb(f,this.matrix):f;for(var g=1;c+1>g;g++)e.push(d.path(f).attr({stroke:b.color,fill:b.fill?b.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(b.width/c*g).toFixed(3),opacity:+(b.opacity/c).toFixed(3)}));return e.insertBefore(this).translate(b.offsetx,b.offsety)};var cc=function(a,b,d,e,f,g,h,i,l){return null==l?j(a,b,d,e,f,g,h,i):c.findDotsAtSegment(a,b,d,e,f,g,h,i,k(a,b,d,e,f,g,h,i,l))},dc=function(a,b){return function(d,e,f){d=Kb(d);for(var g,h,i,j,k,l="",m={},n=0,o=0,p=d.length;p>o;o++){if(i=d[o],"M"==i[0])g=+i[1],h=+i[2];else{if(j=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6]),n+j>e){if(b&&!m.start){if(k=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),l+=["C"+k.start.x,k.start.y,k.m.x,k.m.y,k.x,k.y],f)return l;m.start=l,l=["M"+k.x,k.y+"C"+k.n.x,k.n.y,k.end.x,k.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!a&&!b)return k=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),{x:k.x,y:k.y,alpha:k.alpha}}n+=j,g=+i[5],h=+i[6]}l+=i.shift()+i}return m.end=l,k=a?n:b?m:c.findDotsAtSegment(g,h,i[0],i[1],i[2],i[3],i[4],i[5],1),k.alpha&&(k={x:k.x,y:k.y,alpha:k.alpha}),k}},ec=dc(1),fc=dc(),gc=dc(0,1);c.getTotalLength=ec,c.getPointAtLength=fc,c.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return gc(a,b).end;var d=gc(a,c,1);return b?gc(d,b).end:d},$b.getTotalLength=function(){var a=this.getPath();if(a)return this.node.getTotalLength?this.node.getTotalLength():ec(a)},$b.getPointAtLength=function(a){var b=this.getPath();if(b)return fc(b,a)},$b.getPath=function(){var a,b=c._getPath[this.type];if("text"!=this.type&&"set"!=this.type)return b&&(a=b(this)),a},$b.getSubpath=function(a,b){var d=this.getPath();if(d)return c.getSubpath(d,a,b)};var hc=c.easing_formulas={linear:function(a){return a},"<":function(a){return R(a,1.7)},">":function(a){return R(a,.48)},"<>":function(a){var b=.48-a/1.04,c=N.sqrt(.1734+b*b),d=c-b,e=R(Q(d),1/3)*(0>d?-1:1),f=-c-b,g=R(Q(f),1/3)*(0>f?-1:1),h=e+g+.5;return 3*(1-h)*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a-=1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){return a==!!a?a:R(2,-10*a)*N.sin((a-.075)*2*S/.3)+1},bounce:function(a){var b,c=7.5625,d=2.75;return 1/d>a?b=c*a*a:2/d>a?(a-=1.5/d,b=c*a*a+.75):2.5/d>a?(a-=2.25/d,b=c*a*a+.9375):(a-=2.625/d,b=c*a*a+.984375),b}};hc.easeIn=hc["ease-in"]=hc["<"],hc.easeOut=hc["ease-out"]=hc[">"],hc.easeInOut=hc["ease-in-out"]=hc["<>"],hc["back-in"]=hc.backIn,hc["back-out"]=hc.backOut;var ic=[],jc=a.requestAnimationFrame||a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame||a.msRequestAnimationFrame||function(a){setTimeout(a,16)},kc=function(){for(var a=+new Date,d=0;d<ic.length;d++){var e=ic[d];if(!e.el.removed&&!e.paused){var f,g,h=a-e.start,i=e.ms,j=e.easing,k=e.from,l=e.diff,m=e.to,n=(e.t,e.el),o={},p={};if(e.initstatus?(h=(e.initstatus*e.anim.top-e.prev)/(e.percent-e.prev)*i,e.status=e.initstatus,delete e.initstatus,e.stop&&ic.splice(d--,1)):e.status=(e.prev+(e.percent-e.prev)*(h/i))/e.anim.top,!(0>h))if(i>h){var q=j(h/i);for(var r in k)if(k[z](r)){switch(db[r]){case T:f=+k[r]+q*i*l[r];break;case"colour":f="rgb("+[lc($(k[r].r+q*i*l[r].r)),lc($(k[r].g+q*i*l[r].g)),lc($(k[r].b+q*i*l[r].b))].join(",")+")";break;case"path":f=[];for(var t=0,u=k[r].length;u>t;t++){f[t]=[k[r][t][0]];for(var v=1,w=k[r][t].length;w>v;v++)f[t][v]=+k[r][t][v]+q*i*l[r][t][v];f[t]=f[t].join(H)}f=f.join(H);break;case"transform":if(l[r].real)for(f=[],t=0,u=k[r].length;u>t;t++)for(f[t]=[k[r][t][0]],v=1,w=k[r][t].length;w>v;v++)f[t][v]=k[r][t][v]+q*i*l[r][t][v];else{var x=function(a){return+k[r][a]+q*i*l[r][a]};f=[["m",x(0),x(1),x(2),x(3),x(4),x(5)]]}break;case"csv":if("clip-rect"==r)for(f=[],t=4;t--;)f[t]=+k[r][t]+q*i*l[r][t];break;default:var y=[][E](k[r]);for(f=[],t=n.paper.customAttributes[r].length;t--;)f[t]=+y[t]+q*i*l[r][t]}o[r]=f}n.attr(o),function(a,c,d){setTimeout(function(){b("raphael.anim.frame."+a,c,d)})}(n.id,n,e.anim)}else{if(function(a,d,e){setTimeout(function(){b("raphael.anim.frame."+d.id,d,e),b("raphael.anim.finish."+d.id,d,e),c.is(a,"function")&&a.call(d)})}(e.callback,n,e.anim),n.attr(m),ic.splice(d--,1),e.repeat>1&&!e.next){for(g in m)m[z](g)&&(p[g]=e.totalOrigin[g]);e.el.attr(p),s(e.anim,e.el,e.anim.percents[0],null,e.totalOrigin,e.repeat-1)}e.next&&!e.stop&&s(e.anim,e.el,e.next,null,e.totalOrigin,e.repeat)}}}c.svg&&n&&n.paper&&n.paper.safari(),ic.length&&jc(kc)},lc=function(a){return a>255?255:0>a?0:a};$b.animateWith=function(a,b,d,e,f,g){var h=this;if(h.removed)return g&&g.call(h),h;var i=d instanceof r?d:c.animation(d,e,f,g);s(i,h,i.percents[0],null,h.attr());for(var j=0,k=ic.length;k>j;j++)if(ic[j].anim==b&&ic[j].el==a){ic[k-1].start=ic[j].start;break}return h},$b.onAnimation=function(a){return a?b.on("raphael.anim.frame."+this.id,a):b.unbind("raphael.anim.frame."+this.id),this},r.prototype.delay=function(a){var b=new r(this.anim,this.ms);return b.times=this.times,b.del=+a||0,b},r.prototype.repeat=function(a){var b=new r(this.anim,this.ms);return b.del=this.del,b.times=N.floor(O(a,0))||1,b},c.animation=function(a,b,d,e){if(a instanceof r)return a;(c.is(d,"function")||!d)&&(e=e||d||null,d=null),a=Object(a),b=+b||0;var f,g,h={};for(g in a)a[z](g)&&_(g)!=g&&_(g)+"%"!=g&&(f=!0,h[g]=a[g]);return f?(d&&(h.easing=d),e&&(h.callback=e),new r({100:h},b)):new r(a,b)},$b.animate=function(a,b,d,e){var f=this;if(f.removed)return e&&e.call(f),f;var g=a instanceof r?a:c.animation(a,b,d,e);return s(g,f,g.percents[0],null,f.attr()),f},$b.setTime=function(a,b){return a&&null!=b&&this.status(a,P(b,a.ms)/a.ms),this},$b.status=function(a,b){var c,d,e=[],f=0;if(null!=b)return s(a,this,-1,P(b,1)),this;for(c=ic.length;c>f;f++)if(d=ic[f],d.el.id==this.id&&(!a||d.anim==a)){if(a)return d.status;e.push({anim:d.anim,status:d.status})}return a?0:e},$b.pause=function(a){for(var c=0;c<ic.length;c++)ic[c].el.id!=this.id||a&&ic[c].anim!=a||b("raphael.anim.pause."+this.id,this,ic[c].anim)!==!1&&(ic[c].paused=!0);return this},$b.resume=function(a){for(var c=0;c<ic.length;c++)if(ic[c].el.id==this.id&&(!a||ic[c].anim==a)){var d=ic[c];b("raphael.anim.resume."+this.id,this,d.anim)!==!1&&(delete d.paused,this.status(d.anim,d.status))}return this},$b.stop=function(a){for(var c=0;c<ic.length;c++)ic[c].el.id!=this.id||a&&ic[c].anim!=a||b("raphael.anim.stop."+this.id,this,ic[c].anim)!==!1&&ic.splice(c--,1);return this},b.on("raphael.remove",t),b.on("raphael.clear",t),$b.toString=function(){return"Raphaël’s object"};var mc=function(a){if(this.items=[],this.length=0,this.type="set",a)for(var b=0,c=a.length;c>b;b++)!a[b]||a[b].constructor!=$b.constructor&&a[b].constructor!=mc||(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},nc=mc.prototype;nc.push=function(){for(var a,b,c=0,d=arguments.length;d>c;c++)a=arguments[c],!a||a.constructor!=$b.constructor&&a.constructor!=mc||(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},nc.pop=function(){return this.length&&delete this[this.length--],this.items.pop()},nc.forEach=function(a,b){for(var c=0,d=this.items.length;d>c;c++)if(a.call(b,this.items[c],c)===!1)return this;return this};for(var oc in $b)$b[z](oc)&&(nc[oc]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a][D](c,b)})}}(oc));return nc.attr=function(a,b){if(a&&c.is(a,V)&&c.is(a[0],"object"))for(var d=0,e=a.length;e>d;d++)this.items[d].attr(a[d]);else for(var f=0,g=this.items.length;g>f;f++)this.items[f].attr(a,b);return this},nc.clear=function(){for(;this.length;)this.pop()},nc.splice=function(a,b){a=0>a?O(this.length+a,0):a,b=O(0,P(this.length-a,b));var c,d=[],e=[],f=[];for(c=2;c<arguments.length;c++)f.push(arguments[c]);for(c=0;b>c;c++)e.push(this[a+c]);for(;c<this.length-a;c++)d.push(this[a+c]);var g=f.length;for(c=0;c<g+d.length;c++)this.items[a+c]=this[a+c]=g>c?f[c]:d[c-g];for(c=this.items.length=this.length-=b-g;this[c];)delete this[c++];return new mc(e)},nc.exclude=function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]==a)return this.splice(b,1),!0},nc.animate=function(a,b,d,e){(c.is(d,"function")||!d)&&(e=d||null);var f,g,h=this.items.length,i=h,j=this;if(!h)return this;e&&(g=function(){!--h&&e.call(j)}),d=c.is(d,U)?d:g;var k=c.animation(a,b,d,g);for(f=this.items[--i].animate(k);i--;)this.items[i]&&!this.items[i].removed&&this.items[i].animateWith(f,k,k),this.items[i]&&!this.items[i].removed||h--;return this},nc.insertAfter=function(a){for(var b=this.items.length;b--;)this.items[b].insertAfter(a);return this},nc.getBBox=function(){for(var a=[],b=[],c=[],d=[],e=this.items.length;e--;)if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)}return a=P[D](0,a),b=P[D](0,b),c=O[D](0,c),d=O[D](0,d),{x:a,y:b,x2:c,y2:d,width:c-a,height:d-b}},nc.clone=function(a){a=this.paper.set();for(var b=0,c=this.items.length;c>b;b++)a.push(this.items[b].clone());return a},nc.toString=function(){return"Raphaël‘s set"},nc.glow=function(a){var b=this.paper.set();return this.forEach(function(c){var d=c.glow(a);null!=d&&d.forEach(function(a){b.push(a)})}),b},nc.isPointInside=function(a,b){var c=!1;return this.forEach(function(d){return d.isPointInside(a,b)?(console.log("runned"),c=!0,!1):void 0}),c},c.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[z](d)&&(b.face[d]=a.face[d]);if(this.fonts[c]?this.fonts[c].push(b):this.fonts[c]=[b],!a.svg){b.face["units-per-em"]=ab(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[z](e)){var f=a.glyphs[e];if(b.glyphs[e]={w:f.w,k:{},d:f.d&&"M"+f.d.replace(/[mlcxtrv]/g,function(a){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[a]||"M"})+"z"},f.k)for(var g in f.k)f[z](g)&&(b.glyphs[e].k[g]=f.k[g])}}return a},v.getFont=function(a,b,d,e){if(e=e||"normal",d=d||"normal",b=+b||{normal:400,bold:700,lighter:300,bolder:800}[b]||400,c.fonts){var f=c.fonts[a];if(!f){var g=new RegExp("(^|\\s)"+a.replace(/[^\w\d\s+!~.:_-]/g,G)+"(\\s|$)","i");for(var h in c.fonts)if(c.fonts[z](h)&&g.test(h)){f=c.fonts[h];break}}var i;if(f)for(var j=0,k=f.length;k>j&&(i=f[j],i.face["font-weight"]!=b||i.face["font-style"]!=d&&i.face["font-style"]||i.face["font-stretch"]!=e);j++);return i}},v.print=function(a,b,d,e,f,g,h,i){g=g||"middle",h=O(P(h||0,1),-1),i=O(P(i||1,3),1);var j,k=I(d)[J](G),l=0,m=0,n=G;if(c.is(e,"string")&&(e=this.getFont(e)),e){j=(f||16)/e.face["units-per-em"];for(var o=e.face.bbox[J](w),p=+o[0],q=o[3]-o[1],r=0,s=+o[1]+("baseline"==g?q+ +e.face.descent:q/2),t=0,u=k.length;u>t;t++){if("\n"==k[t])l=0,x=0,m=0,r+=q*i;else{var v=m&&e.glyphs[k[t-1]]||{},x=e.glyphs[k[t]];l+=m?(v.w||e.w)+(v.k&&v.k[k[t]]||0)+e.w*h:0,m=1}x&&x.d&&(n+=c.transformPath(x.d,["t",l*j,r*j,"s",j,j,p,s,"t",(a-p)/j,(b-s)/j]))}}return this.path(n).attr({fill:"#000",stroke:"none"})},v.add=function(a){if(c.is(a,"array"))for(var b,d=this.set(),e=0,f=a.length;f>e;e++)b=a[e]||{},x[z](b.type)&&d.push(this[b.type]().attr(b));return d},c.format=function(a,b){var d=c.is(b,V)?[0][E](b):arguments;return a&&c.is(a,U)&&d.length-1&&(a=a.replace(y,function(a,b){return null==d[++b]?G:d[b]})),a||G},c.fullfill=function(){var a=/\{([^\}]+)\}/g,b=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,c=function(a,c,d){var e=d;return c.replace(b,function(a,b,c,d,f){b=b||d,e&&(b in e&&(e=e[b]),"function"==typeof e&&f&&(e=e()))}),e=(null==e||e==d?a:e)+""};return function(b,d){return String(b).replace(a,function(a,b){return c(a,b,d)})}}(),c.ninja=function(){return B.was?A.win.Raphael=B.is:delete Raphael,c},c.st=nc,function(a,b,d){function e(){/in/.test(a.readyState)?setTimeout(e,9):c.eve("raphael.DOMload")}null==a.readyState&&a.addEventListener&&(a.addEventListener(b,d=function(){a.removeEventListener(b,d,!1),a.readyState="complete"},!1),a.readyState="loading"),e()}(document,"DOMContentLoaded"),b.on("raphael.DOMload",function(){u=!0}),function(){if(c.svg){var a="hasOwnProperty",b=String,d=parseFloat,e=parseInt,f=Math,g=f.max,h=f.abs,i=f.pow,j=/[, ]+/,k=c.eve,l="",m=" ",n="http://www.w3.org/1999/xlink",o={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},p={};c.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var q=function(d,e){if(e){"string"==typeof d&&(d=q(d));for(var f in e)e[a](f)&&("xlink:"==f.substring(0,6)?d.setAttributeNS(n,f.substring(6),b(e[f])):d.setAttribute(f,b(e[f])))}else d=c._g.doc.createElementNS("http://www.w3.org/2000/svg",d),d.style&&(d.style.webkitTapHighlightColor="rgba(0,0,0,0)");return d},r=function(a,e){var j="linear",k=a.id+e,m=.5,n=.5,o=a.node,p=a.paper,r=o.style,s=c._g.doc.getElementById(k);if(!s){if(e=b(e).replace(c._radial_gradient,function(a,b,c){if(j="radial",b&&c){m=d(b),n=d(c);var e=2*(n>.5)-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&.5!=n&&(n=n.toFixed(5)-1e-5*e)}return l}),e=e.split(/\s*\-\s*/),"linear"==j){var t=e.shift();if(t=-d(t),isNaN(t))return null;var u=[0,0,f.cos(c.rad(t)),f.sin(c.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)}var w=c._parseDots(e);if(!w)return null;if(k=k.replace(/[\(\)\s,\xb0#]/g,"_"),a.gradient&&k!=a.gradient.id&&(p.defs.removeChild(a.gradient),delete a.gradient),!a.gradient){s=q(j+"Gradient",{id:k}),a.gradient=s,q(s,"radial"==j?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:a.matrix.invert()}),p.defs.appendChild(s);for(var x=0,y=w.length;y>x;x++)s.appendChild(q("stop",{offset:w[x].offset?w[x].offset:x?"100%":"0%","stop-color":w[x].color||"#fff"}))}}return q(o,{fill:"url(#"+k+")",opacity:1,"fill-opacity":1}),r.fill=l,r.opacity=1,r.fillOpacity=1,1},s=function(a){var b=a.getBBox(1);q(a.pattern,{patternTransform:a.matrix.invert()+" translate("+b.x+","+b.y+")"})},t=function(d,e,f){if("path"==d.type){for(var g,h,i,j,k,m=b(e).toLowerCase().split("-"),n=d.paper,r=f?"end":"start",s=d.node,t=d.attrs,u=t["stroke-width"],v=m.length,w="classic",x=3,y=3,z=5;v--;)switch(m[v]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":w=m[v];break;case"wide":y=5;break;case"narrow":y=2;break;case"long":x=5;break;case"short":x=2}if("open"==w?(x+=2,y+=2,z+=2,i=1,j=f?4:1,k={fill:"none",stroke:t.stroke}):(j=i=x/2,k={fill:t.stroke,stroke:"none"}),d._.arrows?f?(d._.arrows.endPath&&p[d._.arrows.endPath]--,d._.arrows.endMarker&&p[d._.arrows.endMarker]--):(d._.arrows.startPath&&p[d._.arrows.startPath]--,d._.arrows.startMarker&&p[d._.arrows.startMarker]--):d._.arrows={},"none"!=w){var A="raphael-marker-"+w,B="raphael-marker-"+r+w+x+y;c._g.doc.getElementById(A)?p[A]++:(n.defs.appendChild(q(q("path"),{"stroke-linecap":"round",d:o[w],id:A})),p[A]=1);var C,D=c._g.doc.getElementById(B);D?(p[B]++,C=D.getElementsByTagName("use")[0]):(D=q(q("marker"),{id:B,markerHeight:y,markerWidth:x,orient:"auto",refX:j,refY:y/2}),C=q(q("use"),{"xlink:href":"#"+A,transform:(f?"rotate(180 "+x/2+" "+y/2+") ":l)+"scale("+x/z+","+y/z+")","stroke-width":(1/((x/z+y/z)/2)).toFixed(4)}),D.appendChild(C),n.defs.appendChild(D),p[B]=1),q(C,k);var E=i*("diamond"!=w&&"oval"!=w);f?(g=d._.arrows.startdx*u||0,h=c.getTotalLength(t.path)-E*u):(g=E*u,h=c.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),k={},k["marker-"+r]="url(#"+B+")",(h||g)&&(k.d=c.getSubpath(t.path,g,h)),q(s,k),d._.arrows[r+"Path"]=A,d._.arrows[r+"Marker"]=B,d._.arrows[r+"dx"]=E,d._.arrows[r+"Type"]=w,d._.arrows[r+"String"]=e}else f?(g=d._.arrows.startdx*u||0,h=c.getTotalLength(t.path)-g):(g=0,h=c.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),d._.arrows[r+"Path"]&&q(s,{d:c.getSubpath(t.path,g,h)}),delete d._.arrows[r+"Path"],delete d._.arrows[r+"Marker"],delete d._.arrows[r+"dx"],delete d._.arrows[r+"Type"],delete d._.arrows[r+"String"];for(k in p)if(p[a](k)&&!p[k]){var F=c._g.doc.getElementById(k);F&&F.parentNode.removeChild(F)}}},u={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},v=function(a,c,d){if(c=u[b(c).toLowerCase()]){for(var e=a.attrs["stroke-width"]||"1",f={round:e,square:e,butt:0}[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],h=c.length;h--;)g[h]=c[h]*e+(h%2?1:-1)*f;q(a.node,{"stroke-dasharray":g.join(",")})}},w=function(d,f){var i=d.node,k=d.attrs,m=i.style.visibility;i.style.visibility="hidden";for(var o in f)if(f[a](o)){if(!c._availableAttrs[a](o))continue;var p=f[o];switch(k[o]=p,o){case"blur":d.blur(p);break;case"href":case"title":var u=q("title"),w=c._g.doc.createTextNode(p);u.appendChild(w),i.appendChild(u);break;case"target":var x=i.parentNode;if("a"!=x.tagName.toLowerCase()){var u=q("a");x.insertBefore(u,i),u.appendChild(i),x=u}"target"==o?x.setAttributeNS(n,"show","blank"==p?"new":p):x.setAttributeNS(n,o,p);break;case"cursor":i.style.cursor=p;break;case"transform":d.transform(p);break;case"arrow-start":t(d,p);break;case"arrow-end":t(d,p,1);break;case"clip-rect":var z=b(p).split(j);if(4==z.length){d.clip&&d.clip.parentNode.parentNode.removeChild(d.clip.parentNode);var A=q("clipPath"),B=q("rect");A.id=c.createUUID(),q(B,{x:z[0],y:z[1],width:z[2],height:z[3]}),A.appendChild(B),d.paper.defs.appendChild(A),q(i,{"clip-path":"url(#"+A.id+")"}),d.clip=B}if(!p){var C=i.getAttribute("clip-path");if(C){var D=c._g.doc.getElementById(C.replace(/(^url\(#|\)$)/g,l));D&&D.parentNode.removeChild(D),q(i,{"clip-path":l}),delete d.clip}}break;case"path":"path"==d.type&&(q(i,{d:p?k.path=c._pathToAbsolute(p):"M0,0"}),d._.dirty=1,d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1)));break;case"width":if(i.setAttribute(o,p),d._.dirty=1,!k.fx)break;o="x",p=k.x;case"x":k.fx&&(p=-k.x-(k.width||0));case"rx":if("rx"==o&&"rect"==d.type)break;case"cx":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"height":if(i.setAttribute(o,p),d._.dirty=1,!k.fy)break;o="y",p=k.y;case"y":k.fy&&(p=-k.y-(k.height||0));case"ry":if("ry"==o&&"rect"==d.type)break;case"cy":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"r":"rect"==d.type?q(i,{rx:p,ry:p}):i.setAttribute(o,p),d._.dirty=1;break;case"src":"image"==d.type&&i.setAttributeNS(n,"href",p);break;case"stroke-width":(1!=d._.sx||1!=d._.sy)&&(p/=g(h(d._.sx),h(d._.sy))||1),d.paper._vbSize&&(p*=d.paper._vbSize),i.setAttribute(o,p),k["stroke-dasharray"]&&v(d,k["stroke-dasharray"],f),d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"stroke-dasharray":v(d,p,f);break;case"fill":var E=b(p).match(c._ISURL);if(E){A=q("pattern");var F=q("image");A.id=c.createUUID(),q(A,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),q(F,{x:0,y:0,"xlink:href":E[1]}),A.appendChild(F),function(a){c._preload(E[1],function(){var b=this.offsetWidth,c=this.offsetHeight;q(a,{width:b,height:c}),q(F,{width:b,height:c}),d.paper.safari()})}(A),d.paper.defs.appendChild(A),q(i,{fill:"url(#"+A.id+")"}),d.pattern=A,d.pattern&&s(d);break}var G=c.getRGB(p);if(G.error){if(("circle"==d.type||"ellipse"==d.type||"r"!=b(p).charAt())&&r(d,p)){if("opacity"in k||"fill-opacity"in k){var H=c._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l));if(H){var I=H.getElementsByTagName("stop");q(I[I.length-1],{"stop-opacity":("opacity"in k?k.opacity:1)*("fill-opacity"in k?k["fill-opacity"]:1)})}}k.gradient=p,k.fill="none";break}}else delete f.gradient,delete k.gradient,!c.is(k.opacity,"undefined")&&c.is(f.opacity,"undefined")&&q(i,{opacity:k.opacity}),!c.is(k["fill-opacity"],"undefined")&&c.is(f["fill-opacity"],"undefined")&&q(i,{"fill-opacity":k["fill-opacity"]});G[a]("opacity")&&q(i,{"fill-opacity":G.opacity>1?G.opacity/100:G.opacity});case"stroke":G=c.getRGB(p),i.setAttribute(o,G.hex),"stroke"==o&&G[a]("opacity")&&q(i,{"stroke-opacity":G.opacity>1?G.opacity/100:G.opacity}),"stroke"==o&&d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"gradient":("circle"==d.type||"ellipse"==d.type||"r"!=b(p).charAt())&&r(d,p);break;case"opacity":k.gradient&&!k[a]("stroke-opacity")&&q(i,{"stroke-opacity":p>1?p/100:p});case"fill-opacity":if(k.gradient){H=c._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l)),H&&(I=H.getElementsByTagName("stop"),q(I[I.length-1],{"stop-opacity":p}));break}default:"font-size"==o&&(p=e(p,10)+"px");var J=o.replace(/(\-.)/g,function(a){return a.substring(1).toUpperCase()});i.style[J]=p,d._.dirty=1,i.setAttribute(o,p)}}y(d,f),i.style.visibility=m},x=1.2,y=function(d,f){if("text"==d.type&&(f[a]("text")||f[a]("font")||f[a]("font-size")||f[a]("x")||f[a]("y"))){var g=d.attrs,h=d.node,i=h.firstChild?e(c._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue("font-size"),10):10; +if(f[a]("text")){for(g.text=f.text;h.firstChild;)h.removeChild(h.firstChild);for(var j,k=b(f.text).split("\n"),m=[],n=0,o=k.length;o>n;n++)j=q("tspan"),n&&q(j,{dy:i*x,x:g.x}),j.appendChild(c._g.doc.createTextNode(k[n])),h.appendChild(j),m[n]=j}else for(m=h.getElementsByTagName("tspan"),n=0,o=m.length;o>n;n++)n?q(m[n],{dy:i*x,x:g.x}):q(m[0],{dy:0});q(h,{x:g.x,y:g.y}),d._.dirty=1;var p=d._getBBox(),r=g.y-(p.y+p.height/2);r&&c.is(r,"finite")&&q(m[0],{dy:r})}},z=function(a,b){this[0]=this.node=a,a.raphael=!0,this.id=c._oid++,a.raphaelid=this.id,this.matrix=c.matrix(),this.realPath=null,this.paper=b,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!b.bottom&&(b.bottom=this),this.prev=b.top,b.top&&(b.top.next=this),b.top=this,this.next=null},A=c.el;z.prototype=A,A.constructor=z,c._engine.path=function(a,b){var c=q("path");b.canvas&&b.canvas.appendChild(c);var d=new z(c,b);return d.type="path",w(d,{fill:"none",stroke:"#000",path:a}),d},A.rotate=function(a,c,e){if(this.removed)return this;if(a=b(a).split(j),a.length-1&&(c=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(c=e),null==c||null==e){var f=this.getBBox(1);c=f.x+f.width/2,e=f.y+f.height/2}return this.transform(this._.transform.concat([["r",a,c,e]])),this},A.scale=function(a,c,e,f){if(this.removed)return this;if(a=b(a).split(j),a.length-1&&(c=d(a[1]),e=d(a[2]),f=d(a[3])),a=d(a[0]),null==c&&(c=a),null==f&&(e=f),null==e||null==f)var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,c,e,f]])),this},A.translate=function(a,c){return this.removed?this:(a=b(a).split(j),a.length-1&&(c=d(a[1])),a=d(a[0])||0,c=+c||0,this.transform(this._.transform.concat([["t",a,c]])),this)},A.transform=function(b){var d=this._;if(null==b)return d.transform;if(c._extractTransform(this,b),this.clip&&q(this.clip,{transform:this.matrix.invert()}),this.pattern&&s(this),this.node&&q(this.node,{transform:this.matrix}),1!=d.sx||1!=d.sy){var e=this.attrs[a]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":e})}return this},A.hide=function(){return!this.removed&&this.paper.safari(this.node.style.display="none"),this},A.show=function(){return!this.removed&&this.paper.safari(this.node.style.display=""),this},A.remove=function(){if(!this.removed&&this.node.parentNode){var a=this.paper;a.__set__&&a.__set__.exclude(this),k.unbind("raphael.*.*."+this.id),this.gradient&&a.defs.removeChild(this.gradient),c._tear(this,a),"a"==this.node.parentNode.tagName.toLowerCase()?this.node.parentNode.parentNode.removeChild(this.node.parentNode):this.node.parentNode.removeChild(this.node);for(var b in this)this[b]="function"==typeof this[b]?c._removedFactory(b):null;this.removed=!0}},A._getBBox=function(){if("none"==this.node.style.display){this.show();var a=!0}var b={};try{b=this.node.getBBox()}catch(c){}finally{b=b||{}}return a&&this.hide(),b},A.attr=function(b,d){if(this.removed)return this;if(null==b){var e={};for(var f in this.attrs)this.attrs[a](f)&&(e[f]=this.attrs[f]);return e.gradient&&"none"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e}if(null==d&&c.is(b,"string")){if("fill"==b&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;if("transform"==b)return this._.transform;for(var g=b.split(j),h={},i=0,l=g.length;l>i;i++)b=g[i],h[b]=b in this.attrs?this.attrs[b]:c.is(this.paper.customAttributes[b],"function")?this.paper.customAttributes[b].def:c._availableAttrs[b];return l-1?h:h[g[0]]}if(null==d&&c.is(b,"array")){for(h={},i=0,l=b.length;l>i;i++)h[b[i]]=this.attr(b[i]);return h}if(null!=d){var m={};m[b]=d}else null!=b&&c.is(b,"object")&&(m=b);for(var n in m)k("raphael.attr."+n+"."+this.id,this,m[n]);for(n in this.paper.customAttributes)if(this.paper.customAttributes[a](n)&&m[a](n)&&c.is(this.paper.customAttributes[n],"function")){var o=this.paper.customAttributes[n].apply(this,[].concat(m[n]));this.attrs[n]=m[n];for(var p in o)o[a](p)&&(m[p]=o[p])}return w(this,m),this},A.toFront=function(){if(this.removed)return this;"a"==this.node.parentNode.tagName.toLowerCase()?this.node.parentNode.parentNode.appendChild(this.node.parentNode):this.node.parentNode.appendChild(this.node);var a=this.paper;return a.top!=this&&c._tofront(this,a),this},A.toBack=function(){if(this.removed)return this;var a=this.node.parentNode;return"a"==a.tagName.toLowerCase()?a.parentNode.insertBefore(this.node.parentNode,this.node.parentNode.parentNode.firstChild):a.firstChild!=this.node&&a.insertBefore(this.node,this.node.parentNode.firstChild),c._toback(this,this.paper),this.paper,this},A.insertAfter=function(a){if(this.removed)return this;var b=a.node||a[a.length-1].node;return b.nextSibling?b.parentNode.insertBefore(this.node,b.nextSibling):b.parentNode.appendChild(this.node),c._insertafter(this,a,this.paper),this},A.insertBefore=function(a){if(this.removed)return this;var b=a.node||a[0].node;return b.parentNode.insertBefore(this.node,b),c._insertbefore(this,a,this.paper),this},A.blur=function(a){var b=this;if(0!==+a){var d=q("filter"),e=q("feGaussianBlur");b.attrs.blur=a,d.id=c.createUUID(),q(e,{stdDeviation:+a||1.5}),d.appendChild(e),b.paper.defs.appendChild(d),b._blur=d,q(b.node,{filter:"url(#"+d.id+")"})}else b._blur&&(b._blur.parentNode.removeChild(b._blur),delete b._blur,delete b.attrs.blur),b.node.removeAttribute("filter");return b},c._engine.circle=function(a,b,c,d){var e=q("circle");a.canvas&&a.canvas.appendChild(e);var f=new z(e,a);return f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"},f.type="circle",q(e,f.attrs),f},c._engine.rect=function(a,b,c,d,e,f){var g=q("rect");a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);return h.attrs={x:b,y:c,width:d,height:e,r:f||0,rx:f||0,ry:f||0,fill:"none",stroke:"#000"},h.type="rect",q(g,h.attrs),h},c._engine.ellipse=function(a,b,c,d,e){var f=q("ellipse");a.canvas&&a.canvas.appendChild(f);var g=new z(f,a);return g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"},g.type="ellipse",q(f,g.attrs),g},c._engine.image=function(a,b,c,d,e,f){var g=q("image");q(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"}),g.setAttributeNS(n,"href",b),a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);return h.attrs={x:c,y:d,width:e,height:f,src:b},h.type="image",h},c._engine.text=function(a,b,d,e){var f=q("text");a.canvas&&a.canvas.appendChild(f);var g=new z(f,a);return g.attrs={x:b,y:d,"text-anchor":"middle",text:e,font:c._availableAttrs.font,stroke:"none",fill:"#000"},g.type="text",w(g,g.attrs),g},c._engine.setSize=function(a,b){return this.width=a||this.width,this.height=b||this.height,this.canvas.setAttribute("width",this.width),this.canvas.setAttribute("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox),this},c._engine.create=function(){var a=c._getContainer.apply(0,arguments),b=a&&a.container,d=a.x,e=a.y,f=a.width,g=a.height;if(!b)throw new Error("SVG container not found.");var h,i=q("svg"),j="overflow:hidden;";return d=d||0,e=e||0,f=f||512,g=g||342,q(i,{height:g,version:1.1,width:f,xmlns:"http://www.w3.org/2000/svg"}),1==b?(i.style.cssText=j+"position:absolute;left:"+d+"px;top:"+e+"px",c._g.doc.body.appendChild(i),h=1):(i.style.cssText=j+"position:relative",b.firstChild?b.insertBefore(i,b.firstChild):b.appendChild(i)),b=new c._Paper,b.width=f,b.height=g,b.canvas=i,b.clear(),b._left=b._top=0,h&&(b.renderfix=function(){}),b.renderfix(),b},c._engine.setViewBox=function(a,b,c,d,e){k("raphael.setViewBox",this,this._viewBox,[a,b,c,d,e]);var f,h,i=g(c/this.width,d/this.height),j=this.top,l=e?"meet":"xMinYMin";for(null==a?(this._vbSize&&(i=1),delete this._vbSize,f="0 0 "+this.width+m+this.height):(this._vbSize=i,f=a+m+b+m+c+m+d),q(this.canvas,{viewBox:f,preserveAspectRatio:l});i&&j;)h="stroke-width"in j.attrs?j.attrs["stroke-width"]:1,j.attr({"stroke-width":h}),j._.dirty=1,j._.dirtyT=1,j=j.prev;return this._viewBox=[a,b,c,d,!!e],this},c.prototype.renderfix=function(){var a,b=this.canvas,c=b.style;try{a=b.getScreenCTM()||b.createSVGMatrix()}catch(d){a=b.createSVGMatrix()}var e=-a.e%1,f=-a.f%1;(e||f)&&(e&&(this._left=(this._left+e)%1,c.left=this._left+"px"),f&&(this._top=(this._top+f)%1,c.top=this._top+"px"))},c.prototype.clear=function(){c.eve("raphael.clear",this);for(var a=this.canvas;a.firstChild;)a.removeChild(a.firstChild);this.bottom=this.top=null,(this.desc=q("desc")).appendChild(c._g.doc.createTextNode("Created with Raphaël "+c.version)),a.appendChild(this.desc),a.appendChild(this.defs=q("defs"))},c.prototype.remove=function(){k("raphael.remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]="function"==typeof this[a]?c._removedFactory(a):null};var B=c.st;for(var C in A)A[a](C)&&!B[a](C)&&(B[C]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(C))}}(),function(){if(c.vml){var a="hasOwnProperty",b=String,d=parseFloat,e=Math,f=e.round,g=e.max,h=e.min,i=e.abs,j="fill",k=/[, ]+/,l=c.eve,m=" progid:DXImageTransform.Microsoft",n=" ",o="",p={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},q=/([clmz]),?([^clmz]*)/gi,r=/ progid:\S+Blur\([^\)]+\)/g,s=/-?[^,\s-]+/g,t="position:absolute;left:0;top:0;width:1px;height:1px",u=21600,v={path:1,rect:1,image:1},w={circle:1,ellipse:1},x=function(a){var d=/[ahqstv]/gi,e=c._pathToAbsolute;if(b(a).match(d)&&(e=c._path2curve),d=/[clmz]/g,e==c._pathToAbsolute&&!b(a).match(d)){var g=b(a).replace(q,function(a,b,c){var d=[],e="m"==b.toLowerCase(),g=p[b];return c.replace(s,function(a){e&&2==d.length&&(g+=d+p["m"==b?"l":"L"],d=[]),d.push(f(a*u))}),g+d});return g}var h,i,j=e(a);g=[];for(var k=0,l=j.length;l>k;k++){h=j[k],i=j[k][0].toLowerCase(),"z"==i&&(i="x");for(var m=1,r=h.length;r>m;m++)i+=f(h[m]*u)+(m!=r-1?",":o);g.push(i)}return g.join(n)},y=function(a,b,d){var e=c.matrix();return e.rotate(-a,.5,.5),{dx:e.x(b,d),dy:e.y(b,d)}},z=function(a,b,c,d,e,f){var g=a._,h=a.matrix,k=g.fillpos,l=a.node,m=l.style,o=1,p="",q=u/b,r=u/c;if(m.visibility="hidden",b&&c){if(l.coordsize=i(q)+n+i(r),m.rotation=f*(0>b*c?-1:1),f){var s=y(f,d,e);d=s.dx,e=s.dy}if(0>b&&(p+="x"),0>c&&(p+=" y")&&(o=-1),m.flip=p,l.coordorigin=d*-q+n+e*-r,k||g.fillsize){var t=l.getElementsByTagName(j);t=t&&t[0],l.removeChild(t),k&&(s=y(f,h.x(k[0],k[1]),h.y(k[0],k[1])),t.position=s.dx*o+n+s.dy*o),g.fillsize&&(t.size=g.fillsize[0]*i(b)+n+g.fillsize[1]*i(c)),l.appendChild(t)}m.visibility="visible"}};c.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};var A=function(a,c,d){for(var e=b(c).toLowerCase().split("-"),f=d?"end":"start",g=e.length,h="classic",i="medium",j="medium";g--;)switch(e[g]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":h=e[g];break;case"wide":case"narrow":j=e[g];break;case"long":case"short":i=e[g]}var k=a.node.getElementsByTagName("stroke")[0];k[f+"arrow"]=h,k[f+"arrowlength"]=i,k[f+"arrowwidth"]=j},B=function(e,i){e.attrs=e.attrs||{};var l=e.node,m=e.attrs,p=l.style,q=v[e.type]&&(i.x!=m.x||i.y!=m.y||i.width!=m.width||i.height!=m.height||i.cx!=m.cx||i.cy!=m.cy||i.rx!=m.rx||i.ry!=m.ry||i.r!=m.r),r=w[e.type]&&(m.cx!=i.cx||m.cy!=i.cy||m.r!=i.r||m.rx!=i.rx||m.ry!=i.ry),s=e;for(var t in i)i[a](t)&&(m[t]=i[t]);if(q&&(m.path=c._getPath[e.type](e),e._.dirty=1),i.href&&(l.href=i.href),i.title&&(l.title=i.title),i.target&&(l.target=i.target),i.cursor&&(p.cursor=i.cursor),"blur"in i&&e.blur(i.blur),(i.path&&"path"==e.type||q)&&(l.path=x(~b(m.path).toLowerCase().indexOf("r")?c._pathToAbsolute(m.path):m.path),"image"==e.type&&(e._.fillpos=[m.x,m.y],e._.fillsize=[m.width,m.height],z(e,1,1,0,0,0))),"transform"in i&&e.transform(i.transform),r){var y=+m.cx,B=+m.cy,D=+m.rx||+m.r||0,E=+m.ry||+m.r||0;l.path=c.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",f((y-D)*u),f((B-E)*u),f((y+D)*u),f((B+E)*u),f(y*u)),e._.dirty=1}if("clip-rect"in i){var G=b(i["clip-rect"]).split(k);if(4==G.length){G[2]=+G[2]+ +G[0],G[3]=+G[3]+ +G[1];var H=l.clipRect||c._g.doc.createElement("div"),I=H.style;I.clip=c.format("rect({1}px {2}px {3}px {0}px)",G),l.clipRect||(I.position="absolute",I.top=0,I.left=0,I.width=e.paper.width+"px",I.height=e.paper.height+"px",l.parentNode.insertBefore(H,l),H.appendChild(l),l.clipRect=H)}i["clip-rect"]||l.clipRect&&(l.clipRect.style.clip="auto")}if(e.textpath){var J=e.textpath.style;i.font&&(J.font=i.font),i["font-family"]&&(J.fontFamily='"'+i["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,o)+'"'),i["font-size"]&&(J.fontSize=i["font-size"]),i["font-weight"]&&(J.fontWeight=i["font-weight"]),i["font-style"]&&(J.fontStyle=i["font-style"])}if("arrow-start"in i&&A(s,i["arrow-start"]),"arrow-end"in i&&A(s,i["arrow-end"],1),null!=i.opacity||null!=i["stroke-width"]||null!=i.fill||null!=i.src||null!=i.stroke||null!=i["stroke-width"]||null!=i["stroke-opacity"]||null!=i["fill-opacity"]||null!=i["stroke-dasharray"]||null!=i["stroke-miterlimit"]||null!=i["stroke-linejoin"]||null!=i["stroke-linecap"]){var K=l.getElementsByTagName(j),L=!1;if(K=K&&K[0],!K&&(L=K=F(j)),"image"==e.type&&i.src&&(K.src=i.src),i.fill&&(K.on=!0),(null==K.on||"none"==i.fill||null===i.fill)&&(K.on=!1),K.on&&i.fill){var M=b(i.fill).match(c._ISURL);if(M){K.parentNode==l&&l.removeChild(K),K.rotate=!0,K.src=M[1],K.type="tile";var N=e.getBBox(1);K.position=N.x+n+N.y,e._.fillpos=[N.x,N.y],c._preload(M[1],function(){e._.fillsize=[this.offsetWidth,this.offsetHeight]})}else K.color=c.getRGB(i.fill).hex,K.src=o,K.type="solid",c.getRGB(i.fill).error&&(s.type in{circle:1,ellipse:1}||"r"!=b(i.fill).charAt())&&C(s,i.fill,K)&&(m.fill="none",m.gradient=i.fill,K.rotate=!1)}if("fill-opacity"in i||"opacity"in i){var O=((+m["fill-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+c.getRGB(i.fill).o+1||2)-1);O=h(g(O,0),1),K.opacity=O,K.src&&(K.color="none")}l.appendChild(K);var P=l.getElementsByTagName("stroke")&&l.getElementsByTagName("stroke")[0],Q=!1;!P&&(Q=P=F("stroke")),(i.stroke&&"none"!=i.stroke||i["stroke-width"]||null!=i["stroke-opacity"]||i["stroke-dasharray"]||i["stroke-miterlimit"]||i["stroke-linejoin"]||i["stroke-linecap"])&&(P.on=!0),("none"==i.stroke||null===i.stroke||null==P.on||0==i.stroke||0==i["stroke-width"])&&(P.on=!1);var R=c.getRGB(i.stroke);P.on&&i.stroke&&(P.color=R.hex),O=((+m["stroke-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+R.o+1||2)-1);var S=.75*(d(i["stroke-width"])||1);if(O=h(g(O,0),1),null==i["stroke-width"]&&(S=m["stroke-width"]),i["stroke-width"]&&(P.weight=S),S&&1>S&&(O*=S)&&(P.weight=1),P.opacity=O,i["stroke-linejoin"]&&(P.joinstyle=i["stroke-linejoin"]||"miter"),P.miterlimit=i["stroke-miterlimit"]||8,i["stroke-linecap"]&&(P.endcap="butt"==i["stroke-linecap"]?"flat":"square"==i["stroke-linecap"]?"square":"round"),i["stroke-dasharray"]){var T={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};P.dashstyle=T[a](i["stroke-dasharray"])?T[i["stroke-dasharray"]]:o}Q&&l.appendChild(P)}if("text"==s.type){s.paper.canvas.style.display=o;var U=s.paper.span,V=100,W=m.font&&m.font.match(/\d+(?:\.\d*)?(?=px)/);p=U.style,m.font&&(p.font=m.font),m["font-family"]&&(p.fontFamily=m["font-family"]),m["font-weight"]&&(p.fontWeight=m["font-weight"]),m["font-style"]&&(p.fontStyle=m["font-style"]),W=d(m["font-size"]||W&&W[0])||10,p.fontSize=W*V+"px",s.textpath.string&&(U.innerHTML=b(s.textpath.string).replace(/</g,"&#60;").replace(/&/g,"&#38;").replace(/\n/g,"<br>"));var X=U.getBoundingClientRect();s.W=m.w=(X.right-X.left)/V,s.H=m.h=(X.bottom-X.top)/V,s.X=m.x,s.Y=m.y+s.H/2,("x"in i||"y"in i)&&(s.path.v=c.format("m{0},{1}l{2},{1}",f(m.x*u),f(m.y*u),f(m.x*u)+1));for(var Y=["x","y","text","font","font-family","font-weight","font-style","font-size"],Z=0,$=Y.length;$>Z;Z++)if(Y[Z]in i){s._.dirty=1;break}switch(m["text-anchor"]){case"start":s.textpath.style["v-text-align"]="left",s.bbx=s.W/2;break;case"end":s.textpath.style["v-text-align"]="right",s.bbx=-s.W/2;break;default:s.textpath.style["v-text-align"]="center",s.bbx=0}s.textpath.style["v-text-kern"]=!0}},C=function(a,f,g){a.attrs=a.attrs||{};var h=(a.attrs,Math.pow),i="linear",j=".5 .5";if(a.attrs.gradient=f,f=b(f).replace(c._radial_gradient,function(a,b,c){return i="radial",b&&c&&(b=d(b),c=d(c),h(b-.5,2)+h(c-.5,2)>.25&&(c=e.sqrt(.25-h(b-.5,2))*(2*(c>.5)-1)+.5),j=b+n+c),o}),f=f.split(/\s*\-\s*/),"linear"==i){var k=f.shift();if(k=-d(k),isNaN(k))return null}var l=c._parseDots(f);if(!l)return null;if(a=a.shape||a.node,l.length){a.removeChild(g),g.on=!0,g.method="none",g.color=l[0].color,g.color2=l[l.length-1].color;for(var m=[],p=0,q=l.length;q>p;p++)l[p].offset&&m.push(l[p].offset+n+l[p].color);g.colors=m.length?m.join():"0% "+g.color,"radial"==i?(g.type="gradientTitle",g.focus="100%",g.focussize="0 0",g.focusposition=j,g.angle=0):(g.type="gradient",g.angle=(270-k)%360),a.appendChild(g)}return 1},D=function(a,b){this[0]=this.node=a,a.raphael=!0,this.id=c._oid++,a.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=b,this.matrix=c.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!b.bottom&&(b.bottom=this),this.prev=b.top,b.top&&(b.top.next=this),b.top=this,this.next=null},E=c.el;D.prototype=E,E.constructor=D,E.transform=function(a){if(null==a)return this._.transform;var d,e=this.paper._viewBoxShift,f=e?"s"+[e.scale,e.scale]+"-1-1t"+[e.dx,e.dy]:o;e&&(d=a=b(a).replace(/\.{3}|\u2026/g,this._.transform||o)),c._extractTransform(this,f+a);var g,h=this.matrix.clone(),i=this.skew,j=this.node,k=~b(this.attrs.fill).indexOf("-"),l=!b(this.attrs.fill).indexOf("url(");if(h.translate(1,1),l||k||"image"==this.type)if(i.matrix="1 0 0 1",i.offset="0 0",g=h.split(),k&&g.noRotation||!g.isSimple){j.style.filter=h.toFilter();var m=this.getBBox(),p=this.getBBox(1),q=m.x-p.x,r=m.y-p.y;j.coordorigin=q*-u+n+r*-u,z(this,1,1,q,r,0)}else j.style.filter=o,z(this,g.scalex,g.scaley,g.dx,g.dy,g.rotate);else j.style.filter=o,i.matrix=b(h),i.offset=h.offset();return d&&(this._.transform=d),this},E.rotate=function(a,c,e){if(this.removed)return this;if(null!=a){if(a=b(a).split(k),a.length-1&&(c=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(c=e),null==c||null==e){var f=this.getBBox(1);c=f.x+f.width/2,e=f.y+f.height/2}return this._.dirtyT=1,this.transform(this._.transform.concat([["r",a,c,e]])),this}},E.translate=function(a,c){return this.removed?this:(a=b(a).split(k),a.length-1&&(c=d(a[1])),a=d(a[0])||0,c=+c||0,this._.bbox&&(this._.bbox.x+=a,this._.bbox.y+=c),this.transform(this._.transform.concat([["t",a,c]])),this)},E.scale=function(a,c,e,f){if(this.removed)return this;if(a=b(a).split(k),a.length-1&&(c=d(a[1]),e=d(a[2]),f=d(a[3]),isNaN(e)&&(e=null),isNaN(f)&&(f=null)),a=d(a[0]),null==c&&(c=a),null==f&&(e=f),null==e||null==f)var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,c,e,f]])),this._.dirtyT=1,this},E.hide=function(){return!this.removed&&(this.node.style.display="none"),this},E.show=function(){return!this.removed&&(this.node.style.display=o),this},E._getBBox=function(){return this.removed?{}:{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},E.remove=function(){if(!this.removed&&this.node.parentNode){this.paper.__set__&&this.paper.__set__.exclude(this),c.eve.unbind("raphael.*.*."+this.id),c._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var a in this)this[a]="function"==typeof this[a]?c._removedFactory(a):null;this.removed=!0}},E.attr=function(b,d){if(this.removed)return this;if(null==b){var e={};for(var f in this.attrs)this.attrs[a](f)&&(e[f]=this.attrs[f]);return e.gradient&&"none"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e}if(null==d&&c.is(b,"string")){if(b==j&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;for(var g=b.split(k),h={},i=0,m=g.length;m>i;i++)b=g[i],h[b]=b in this.attrs?this.attrs[b]:c.is(this.paper.customAttributes[b],"function")?this.paper.customAttributes[b].def:c._availableAttrs[b];return m-1?h:h[g[0]]}if(this.attrs&&null==d&&c.is(b,"array")){for(h={},i=0,m=b.length;m>i;i++)h[b[i]]=this.attr(b[i]);return h}var n;null!=d&&(n={},n[b]=d),null==d&&c.is(b,"object")&&(n=b);for(var o in n)l("raphael.attr."+o+"."+this.id,this,n[o]);if(n){for(o in this.paper.customAttributes)if(this.paper.customAttributes[a](o)&&n[a](o)&&c.is(this.paper.customAttributes[o],"function")){var p=this.paper.customAttributes[o].apply(this,[].concat(n[o]));this.attrs[o]=n[o];for(var q in p)p[a](q)&&(n[q]=p[q])}n.text&&"text"==this.type&&(this.textpath.string=n.text),B(this,n)}return this},E.toFront=function(){return!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&c._tofront(this,this.paper),this},E.toBack=function(){return this.removed?this:(this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),c._toback(this,this.paper)),this)},E.insertAfter=function(a){return this.removed?this:(a.constructor==c.st.constructor&&(a=a[a.length-1]),a.node.nextSibling?a.node.parentNode.insertBefore(this.node,a.node.nextSibling):a.node.parentNode.appendChild(this.node),c._insertafter(this,a,this.paper),this)},E.insertBefore=function(a){return this.removed?this:(a.constructor==c.st.constructor&&(a=a[0]),a.node.parentNode.insertBefore(this.node,a.node),c._insertbefore(this,a,this.paper),this)},E.blur=function(a){var b=this.node.runtimeStyle,d=b.filter;return d=d.replace(r,o),0!==+a?(this.attrs.blur=a,b.filter=d+n+m+".Blur(pixelradius="+(+a||1.5)+")",b.margin=c.format("-{0}px 0 0 -{0}px",f(+a||1.5))):(b.filter=d,b.margin=0,delete this.attrs.blur),this},c._engine.path=function(a,b){var c=F("shape");c.style.cssText=t,c.coordsize=u+n+u,c.coordorigin=b.coordorigin;var d=new D(c,b),e={fill:"none",stroke:"#000"};a&&(e.path=a),d.type="path",d.path=[],d.Path=o,B(d,e),b.canvas.appendChild(c);var f=F("skew");return f.on=!0,c.appendChild(f),d.skew=f,d.transform(o),d},c._engine.rect=function(a,b,d,e,f,g){var h=c._rectPath(b,d,e,f,g),i=a.path(h),j=i.attrs;return i.X=j.x=b,i.Y=j.y=d,i.W=j.width=e,i.H=j.height=f,j.r=g,j.path=h,i.type="rect",i},c._engine.ellipse=function(a,b,c,d,e){var f=a.path();return f.attrs,f.X=b-d,f.Y=c-e,f.W=2*d,f.H=2*e,f.type="ellipse",B(f,{cx:b,cy:c,rx:d,ry:e}),f},c._engine.circle=function(a,b,c,d){var e=a.path();return e.attrs,e.X=b-d,e.Y=c-d,e.W=e.H=2*d,e.type="circle",B(e,{cx:b,cy:c,r:d}),e},c._engine.image=function(a,b,d,e,f,g){var h=c._rectPath(d,e,f,g),i=a.path(h).attr({stroke:"none"}),k=i.attrs,l=i.node,m=l.getElementsByTagName(j)[0];return k.src=b,i.X=k.x=d,i.Y=k.y=e,i.W=k.width=f,i.H=k.height=g,k.path=h,i.type="image",m.parentNode==l&&l.removeChild(m),m.rotate=!0,m.src=b,m.type="tile",i._.fillpos=[d,e],i._.fillsize=[f,g],l.appendChild(m),z(i,1,1,0,0,0),i},c._engine.text=function(a,d,e,g){var h=F("shape"),i=F("path"),j=F("textpath");d=d||0,e=e||0,g=g||"",i.v=c.format("m{0},{1}l{2},{1}",f(d*u),f(e*u),f(d*u)+1),i.textpathok=!0,j.string=b(g),j.on=!0,h.style.cssText=t,h.coordsize=u+n+u,h.coordorigin="0 0";var k=new D(h,a),l={fill:"#000",stroke:"none",font:c._availableAttrs.font,text:g};k.shape=h,k.path=i,k.textpath=j,k.type="text",k.attrs.text=b(g),k.attrs.x=d,k.attrs.y=e,k.attrs.w=1,k.attrs.h=1,B(k,l),h.appendChild(j),h.appendChild(i),a.canvas.appendChild(h);var m=F("skew");return m.on=!0,h.appendChild(m),k.skew=m,k.transform(o),k},c._engine.setSize=function(a,b){var d=this.canvas.style;return this.width=a,this.height=b,a==+a&&(a+="px"),b==+b&&(b+="px"),d.width=a,d.height=b,d.clip="rect(0 "+a+" "+b+" 0)",this._viewBox&&c._engine.setViewBox.apply(this,this._viewBox),this},c._engine.setViewBox=function(a,b,d,e,f){c.eve("raphael.setViewBox",this,this._viewBox,[a,b,d,e,f]);var h,i,j=this.width,k=this.height,l=1/g(d/j,e/k);return f&&(h=k/e,i=j/d,j>d*h&&(a-=(j-d*h)/2/h),k>e*i&&(b-=(k-e*i)/2/i)),this._viewBox=[a,b,d,e,!!f],this._viewBoxShift={dx:-a,dy:-b,scale:l},this.forEach(function(a){a.transform("...")}),this};var F;c._engine.initWin=function(a){var b=a.document;b.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!b.namespaces.rvml&&b.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),F=function(a){return b.createElement("<rvml:"+a+' class="rvml">')}}catch(c){F=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},c._engine.initWin(c._g.win),c._engine.create=function(){var a=c._getContainer.apply(0,arguments),b=a.container,d=a.height,e=a.width,f=a.x,g=a.y;if(!b)throw new Error("VML container not found.");var h=new c._Paper,i=h.canvas=c._g.doc.createElement("div"),j=i.style;return f=f||0,g=g||0,e=e||512,d=d||342,h.width=e,h.height=d,e==+e&&(e+="px"),d==+d&&(d+="px"),h.coordsize=1e3*u+n+1e3*u,h.coordorigin="0 0",h.span=c._g.doc.createElement("span"),h.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",i.appendChild(h.span),j.cssText=c.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",e,d),1==b?(c._g.doc.body.appendChild(i),j.left=f+"px",j.top=g+"px",j.position="absolute"):b.firstChild?b.insertBefore(i,b.firstChild):b.appendChild(i),h.renderfix=function(){},h},c.prototype.clear=function(){c.eve("raphael.clear",this),this.canvas.innerHTML=o,this.span=c._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},c.prototype.remove=function(){c.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]="function"==typeof this[a]?c._removedFactory(a):null;return!0};var G=c.st;for(var H in E)E[a](H)&&!G[a](H)&&(G[H]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(H))}}(),B.was?A.win.Raphael=c:Raphael=c,c}); \ No newline at end of file diff --git a/theme/bootstrap/views/js/bootstrap.js b/theme/bootstrap/views/js/bootstrap.js new file mode 100644 index 0000000..1c88b71 --- /dev/null +++ b/theme/bootstrap/views/js/bootstrap.js @@ -0,0 +1,2317 @@ +/*! + * Bootstrap v3.3.4 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +if (typeof jQuery === 'undefined') { + throw new Error('Bootstrap\'s JavaScript requires jQuery') +} + ++function ($) { + 'use strict'; + var version = $.fn.jquery.split(' ')[0].split('.') + if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) { + throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher') + } +}(jQuery); + +/* ======================================================================== + * Bootstrap: transition.js v3.3.4 + * http://getbootstrap.com/javascript/#transitions + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + WebkitTransition : 'webkitTransitionEnd', + MozTransition : 'transitionend', + OTransition : 'oTransitionEnd otransitionend', + transition : 'transitionend' + } + + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return { end: transEndEventNames[name] } + } + } + + return false // explicit for ie8 ( ._.) + } + + // http://blog.alexmaccaw.com/css-transitions + $.fn.emulateTransitionEnd = function (duration) { + var called = false + var $el = this + $(this).one('bsTransitionEnd', function () { called = true }) + var callback = function () { if (!called) $($el).trigger($.support.transition.end) } + setTimeout(callback, duration) + return this + } + + $(function () { + $.support.transition = transitionEnd() + + if (!$.support.transition) return + + $.event.special.bsTransitionEnd = { + bindType: $.support.transition.end, + delegateType: $.support.transition.end, + handle: function (e) { + if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) + } + } + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: alert.js v3.3.4 + * http://getbootstrap.com/javascript/#alerts + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.VERSION = '3.3.4' + + Alert.TRANSITION_DURATION = 150 + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.closest('.alert') + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + // detach from parent, fire event then clean up data + $parent.detach().trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one('bsTransitionEnd', removeElement) + .emulateTransitionEnd(Alert.TRANSITION_DURATION) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.alert + + $.fn.alert = Plugin + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: button.js v3.3.4 + * http://getbootstrap.com/javascript/#buttons + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + this.isLoading = false + } + + Button.VERSION = '3.3.4' + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state = state + 'Text' + + if (data.resetText == null) $el.data('resetText', $el[val]()) + + // push to event loop to allow forms to submit + setTimeout($.proxy(function () { + $el[val](data[state] == null ? this.options[state] : data[state]) + + if (state == 'loadingText') { + this.isLoading = true + $el.addClass(d).attr(d, d) + } else if (this.isLoading) { + this.isLoading = false + $el.removeClass(d).removeAttr(d) + } + }, this), 0) + } + + Button.prototype.toggle = function () { + var changed = true + var $parent = this.$element.closest('[data-toggle="buttons"]') + + if ($parent.length) { + var $input = this.$element.find('input') + if ($input.prop('type') == 'radio') { + if ($input.prop('checked') && this.$element.hasClass('active')) changed = false + else $parent.find('.active').removeClass('active') + } + if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') + } else { + this.$element.attr('aria-pressed', !this.$element.hasClass('active')) + } + + if (changed) this.$element.toggleClass('active') + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + var old = $.fn.button + + $.fn.button = Plugin + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document) + .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + Plugin.call($btn, 'toggle') + e.preventDefault() + }) + .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: carousel.js v3.3.4 + * http://getbootstrap.com/javascript/#carousel + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = null + this.sliding = null + this.interval = null + this.$active = null + this.$items = null + + this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) + + this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element + .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) + .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) + } + + Carousel.VERSION = '3.3.4' + + Carousel.TRANSITION_DURATION = 600 + + Carousel.DEFAULTS = { + interval: 5000, + pause: 'hover', + wrap: true, + keyboard: true + } + + Carousel.prototype.keydown = function (e) { + if (/input|textarea/i.test(e.target.tagName)) return + switch (e.which) { + case 37: this.prev(); break + case 39: this.next(); break + default: return + } + + e.preventDefault() + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getItemIndex = function (item) { + this.$items = item.parent().children('.item') + return this.$items.index(item || this.$active) + } + + Carousel.prototype.getItemForDirection = function (direction, active) { + var activeIndex = this.getItemIndex(active) + var willWrap = (direction == 'prev' && activeIndex === 0) + || (direction == 'next' && activeIndex == (this.$items.length - 1)) + if (willWrap && !this.options.wrap) return active + var delta = direction == 'prev' ? -1 : 1 + var itemIndex = (activeIndex + delta) % this.$items.length + return this.$items.eq(itemIndex) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || this.getItemForDirection(type, $active) + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var that = this + + if ($next.hasClass('active')) return (this.sliding = false) + + var relatedTarget = $next[0] + var slideEvent = $.Event('slide.bs.carousel', { + relatedTarget: relatedTarget, + direction: direction + }) + this.$element.trigger(slideEvent) + if (slideEvent.isDefaultPrevented()) return + + this.sliding = true + + isCycling && this.pause() + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) + $nextIndicator && $nextIndicator.addClass('active') + } + + var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" + if ($.support.transition && this.$element.hasClass('slide')) { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one('bsTransitionEnd', function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { + that.$element.trigger(slidEvent) + }, 0) + }) + .emulateTransitionEnd(Carousel.TRANSITION_DURATION) + } else { + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger(slidEvent) + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + var old = $.fn.carousel + + $.fn.carousel = Plugin + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + var clickHandler = function (e) { + var href + var $this = $(this) + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 + if (!$target.hasClass('carousel')) return + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + Plugin.call($target, options) + + if (slideIndex) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + } + + $(document) + .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) + .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + Plugin.call($carousel, $carousel.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: collapse.js v3.3.4 + * http://getbootstrap.com/javascript/#collapse + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + + '[data-toggle="collapse"][data-target="#' + element.id + '"]') + this.transitioning = null + + if (this.options.parent) { + this.$parent = this.getParent() + } else { + this.addAriaAndCollapsedClass(this.$element, this.$trigger) + } + + if (this.options.toggle) this.toggle() + } + + Collapse.VERSION = '3.3.4' + + Collapse.TRANSITION_DURATION = 350 + + Collapse.DEFAULTS = { + toggle: true + } + + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var activesData + var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') + + if (actives && actives.length) { + activesData = actives.data('bs.collapse') + if (activesData && activesData.transitioning) return + } + + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + if (actives && actives.length) { + Plugin.call(actives, 'hide') + activesData || actives.data('bs.collapse', null) + } + + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + .addClass('collapsing')[dimension](0) + .attr('aria-expanded', true) + + this.$trigger + .removeClass('collapsed') + .attr('aria-expanded', true) + + this.transitioning = 1 + + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('collapse in')[dimension]('') + this.transitioning = 0 + this.$element + .trigger('shown.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + var scrollSize = $.camelCase(['scroll', dimension].join('-')) + + this.$element + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) + } + + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var dimension = this.dimension() + + this.$element[dimension](this.$element[dimension]())[0].offsetHeight + + this.$element + .addClass('collapsing') + .removeClass('collapse in') + .attr('aria-expanded', false) + + this.$trigger + .addClass('collapsed') + .attr('aria-expanded', false) + + this.transitioning = 1 + + var complete = function () { + this.transitioning = 0 + this.$element + .removeClass('collapsing') + .addClass('collapse') + .trigger('hidden.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + this.$element + [dimension](0) + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION) + } + + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + Collapse.prototype.getParent = function () { + return $(this.options.parent) + .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') + .each($.proxy(function (i, element) { + var $element = $(element) + this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) + }, this)) + .end() + } + + Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { + var isOpen = $element.hasClass('in') + + $element.attr('aria-expanded', isOpen) + $trigger + .toggleClass('collapsed', !isOpen) + .attr('aria-expanded', isOpen) + } + + function getTargetFromTrigger($trigger) { + var href + var target = $trigger.attr('data-target') + || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 + + return $(target) + } + + + // COLLAPSE PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.collapse + + $.fn.collapse = Plugin + $.fn.collapse.Constructor = Collapse + + + // COLLAPSE NO CONFLICT + // ==================== + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + // COLLAPSE DATA-API + // ================= + + $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { + var $this = $(this) + + if (!$this.attr('data-target')) e.preventDefault() + + var $target = getTargetFromTrigger($this) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + + Plugin.call($target, option) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.3.4 + * http://getbootstrap.com/javascript/#dropdowns + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle="dropdown"]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.VERSION = '3.3.4' + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we use a backdrop because click events don't delegate + $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus) + } + + var relatedTarget = { relatedTarget: this } + $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this + .trigger('focus') + .attr('aria-expanded', 'true') + + $parent + .toggleClass('open') + .trigger('shown.bs.dropdown', relatedTarget) + } + + return false + } + + Dropdown.prototype.keydown = function (e) { + if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return + + var $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + if ((!isActive && e.which != 27) || (isActive && e.which == 27)) { + if (e.which == 27) $parent.find(toggle).trigger('focus') + return $this.trigger('click') + } + + var desc = ' li:not(.disabled):visible a' + var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc) + + if (!$items.length) return + + var index = $items.index(e.target) + + if (e.which == 38 && index > 0) index-- // up + if (e.which == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items.eq(index).trigger('focus') + } + + function clearMenus(e) { + if (e && e.which === 3) return + $(backdrop).remove() + $(toggle).each(function () { + var $this = $(this) + var $parent = getParent($this) + var relatedTarget = { relatedTarget: this } + + if (!$parent.hasClass('open')) return + + $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this.attr('aria-expanded', 'false') + $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget) + }) + } + + function getParent($this) { + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = selector && $(selector) + + return $parent && $parent.length ? $parent : $this.parent() + } + + + // DROPDOWN PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.dropdown') + + if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.dropdown + + $.fn.dropdown = Plugin + $.fn.dropdown.Constructor = Dropdown + + + // DROPDOWN NO CONFLICT + // ==================== + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + // APPLY TO STANDARD DROPDOWN ELEMENTS + // =================================== + + $(document) + .on('click.bs.dropdown.data-api', clearMenus) + .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) + .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '[role="menu"]', Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '[role="listbox"]', Dropdown.prototype.keydown) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: modal.js v3.3.4 + * http://getbootstrap.com/javascript/#modals + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // MODAL CLASS DEFINITION + // ====================== + + var Modal = function (element, options) { + this.options = options + this.$body = $(document.body) + this.$element = $(element) + this.$dialog = this.$element.find('.modal-dialog') + this.$backdrop = null + this.isShown = null + this.originalBodyPad = null + this.scrollbarWidth = 0 + this.ignoreBackdropClick = false + + if (this.options.remote) { + this.$element + .find('.modal-content') + .load(this.options.remote, $.proxy(function () { + this.$element.trigger('loaded.bs.modal') + }, this)) + } + } + + Modal.VERSION = '3.3.4' + + Modal.TRANSITION_DURATION = 300 + Modal.BACKDROP_TRANSITION_DURATION = 150 + + Modal.DEFAULTS = { + backdrop: true, + keyboard: true, + show: true + } + + Modal.prototype.toggle = function (_relatedTarget) { + return this.isShown ? this.hide() : this.show(_relatedTarget) + } + + Modal.prototype.show = function (_relatedTarget) { + var that = this + var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.checkScrollbar() + this.setScrollbar() + this.$body.addClass('modal-open') + + this.escape() + this.resize() + + this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) + + this.$dialog.on('mousedown.dismiss.bs.modal', function () { + that.$element.one('mouseup.dismiss.bs.modal', function (e) { + if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true + }) + }) + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(that.$body) // don't move modals dom position + } + + that.$element + .show() + .scrollTop(0) + + that.adjustDialog() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element + .addClass('in') + .attr('aria-hidden', false) + + that.enforceFocus() + + var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) + + transition ? + that.$dialog // wait for modal to slide in + .one('bsTransitionEnd', function () { + that.$element.trigger('focus').trigger(e) + }) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + that.$element.trigger('focus').trigger(e) + }) + } + + Modal.prototype.hide = function (e) { + if (e) e.preventDefault() + + e = $.Event('hide.bs.modal') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + this.resize() + + $(document).off('focusin.bs.modal') + + this.$element + .removeClass('in') + .attr('aria-hidden', true) + .off('click.dismiss.bs.modal') + .off('mouseup.dismiss.bs.modal') + + this.$dialog.off('mousedown.dismiss.bs.modal') + + $.support.transition && this.$element.hasClass('fade') ? + this.$element + .one('bsTransitionEnd', $.proxy(this.hideModal, this)) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + this.hideModal() + } + + Modal.prototype.enforceFocus = function () { + $(document) + .off('focusin.bs.modal') // guard against infinite focus loop + .on('focusin.bs.modal', $.proxy(function (e) { + if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { + this.$element.trigger('focus') + } + }, this)) + } + + Modal.prototype.escape = function () { + if (this.isShown && this.options.keyboard) { + this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { + e.which == 27 && this.hide() + }, this)) + } else if (!this.isShown) { + this.$element.off('keydown.dismiss.bs.modal') + } + } + + Modal.prototype.resize = function () { + if (this.isShown) { + $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) + } else { + $(window).off('resize.bs.modal') + } + } + + Modal.prototype.hideModal = function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.$body.removeClass('modal-open') + that.resetAdjustments() + that.resetScrollbar() + that.$element.trigger('hidden.bs.modal') + }) + } + + Modal.prototype.removeBackdrop = function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + Modal.prototype.backdrop = function (callback) { + var that = this + var animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') + .appendTo(this.$body) + + this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { + if (this.ignoreBackdropClick) { + this.ignoreBackdropClick = false + return + } + if (e.target !== e.currentTarget) return + this.options.backdrop == 'static' + ? this.$element[0].focus() + : this.hide() + }, this)) + + if (doAnimate) this.$backdrop[0].offsetWidth // force reflow + + this.$backdrop.addClass('in') + + if (!callback) return + + doAnimate ? + this.$backdrop + .one('bsTransitionEnd', callback) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callback() + + } else if (!this.isShown && this.$backdrop) { + this.$backdrop.removeClass('in') + + var callbackRemove = function () { + that.removeBackdrop() + callback && callback() + } + $.support.transition && this.$element.hasClass('fade') ? + this.$backdrop + .one('bsTransitionEnd', callbackRemove) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callbackRemove() + + } else if (callback) { + callback() + } + } + + // these following methods are used to handle overflowing modals + + Modal.prototype.handleUpdate = function () { + this.adjustDialog() + } + + Modal.prototype.adjustDialog = function () { + var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight + + this.$element.css({ + paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', + paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' + }) + } + + Modal.prototype.resetAdjustments = function () { + this.$element.css({ + paddingLeft: '', + paddingRight: '' + }) + } + + Modal.prototype.checkScrollbar = function () { + var fullWindowWidth = window.innerWidth + if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 + var documentElementRect = document.documentElement.getBoundingClientRect() + fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) + } + this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth + this.scrollbarWidth = this.measureScrollbar() + } + + Modal.prototype.setScrollbar = function () { + var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) + this.originalBodyPad = document.body.style.paddingRight || '' + if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) + } + + Modal.prototype.resetScrollbar = function () { + this.$body.css('padding-right', this.originalBodyPad) + } + + Modal.prototype.measureScrollbar = function () { // thx walsh + var scrollDiv = document.createElement('div') + scrollDiv.className = 'modal-scrollbar-measure' + this.$body.append(scrollDiv) + var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth + this.$body[0].removeChild(scrollDiv) + return scrollbarWidth + } + + + // MODAL PLUGIN DEFINITION + // ======================= + + function Plugin(option, _relatedTarget) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.modal') + var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('bs.modal', (data = new Modal(this, options))) + if (typeof option == 'string') data[option](_relatedTarget) + else if (options.show) data.show(_relatedTarget) + }) + } + + var old = $.fn.modal + + $.fn.modal = Plugin + $.fn.modal.Constructor = Modal + + + // MODAL NO CONFLICT + // ================= + + $.fn.modal.noConflict = function () { + $.fn.modal = old + return this + } + + + // MODAL DATA-API + // ============== + + $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { + var $this = $(this) + var href = $this.attr('href') + var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 + var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) + + if ($this.is('a')) e.preventDefault() + + $target.one('show.bs.modal', function (showEvent) { + if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown + $target.one('hidden.bs.modal', function () { + $this.is(':visible') && $this.trigger('focus') + }) + }) + Plugin.call($target, option, this) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tooltip.js v3.3.4 + * http://getbootstrap.com/javascript/#tooltip + * Inspired by the original jQuery.tipsy by Jason Frame + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TOOLTIP PUBLIC CLASS DEFINITION + // =============================== + + var Tooltip = function (element, options) { + this.type = null + this.options = null + this.enabled = null + this.timeout = null + this.hoverState = null + this.$element = null + + this.init('tooltip', element, options) + } + + Tooltip.VERSION = '3.3.4' + + Tooltip.TRANSITION_DURATION = 150 + + Tooltip.DEFAULTS = { + animation: true, + placement: 'top', + selector: false, + template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + container: false, + viewport: { + selector: 'body', + padding: 0 + } + } + + Tooltip.prototype.init = function (type, element, options) { + this.enabled = true + this.type = type + this.$element = $(element) + this.options = this.getOptions(options) + this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport) + + if (this.$element[0] instanceof document.constructor && !this.options.selector) { + throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') + } + + var triggers = this.options.trigger.split(' ') + + for (var i = triggers.length; i--;) { + var trigger = triggers[i] + + if (trigger == 'click') { + this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) + } else if (trigger != 'manual') { + var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' + var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' + + this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) + this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) + } + } + + this.options.selector ? + (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : + this.fixTitle() + } + + Tooltip.prototype.getDefaults = function () { + return Tooltip.DEFAULTS + } + + Tooltip.prototype.getOptions = function (options) { + options = $.extend({}, this.getDefaults(), this.$element.data(), options) + + if (options.delay && typeof options.delay == 'number') { + options.delay = { + show: options.delay, + hide: options.delay + } + } + + return options + } + + Tooltip.prototype.getDelegateOptions = function () { + var options = {} + var defaults = this.getDefaults() + + this._options && $.each(this._options, function (key, value) { + if (defaults[key] != value) options[key] = value + }) + + return options + } + + Tooltip.prototype.enter = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (self && self.$tip && self.$tip.is(':visible')) { + self.hoverState = 'in' + return + } + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + clearTimeout(self.timeout) + + self.hoverState = 'in' + + if (!self.options.delay || !self.options.delay.show) return self.show() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'in') self.show() + }, self.options.delay.show) + } + + Tooltip.prototype.leave = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + clearTimeout(self.timeout) + + self.hoverState = 'out' + + if (!self.options.delay || !self.options.delay.hide) return self.hide() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'out') self.hide() + }, self.options.delay.hide) + } + + Tooltip.prototype.show = function () { + var e = $.Event('show.bs.' + this.type) + + if (this.hasContent() && this.enabled) { + this.$element.trigger(e) + + var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) + if (e.isDefaultPrevented() || !inDom) return + var that = this + + var $tip = this.tip() + + var tipId = this.getUID(this.type) + + this.setContent() + $tip.attr('id', tipId) + this.$element.attr('aria-describedby', tipId) + + if (this.options.animation) $tip.addClass('fade') + + var placement = typeof this.options.placement == 'function' ? + this.options.placement.call(this, $tip[0], this.$element[0]) : + this.options.placement + + var autoToken = /\s?auto?\s?/i + var autoPlace = autoToken.test(placement) + if (autoPlace) placement = placement.replace(autoToken, '') || 'top' + + $tip + .detach() + .css({ top: 0, left: 0, display: 'block' }) + .addClass(placement) + .data('bs.' + this.type, this) + + this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) + + var pos = this.getPosition() + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (autoPlace) { + var orgPlacement = placement + var $container = this.options.container ? $(this.options.container) : this.$element.parent() + var containerDim = this.getPosition($container) + + placement = placement == 'bottom' && pos.bottom + actualHeight > containerDim.bottom ? 'top' : + placement == 'top' && pos.top - actualHeight < containerDim.top ? 'bottom' : + placement == 'right' && pos.right + actualWidth > containerDim.width ? 'left' : + placement == 'left' && pos.left - actualWidth < containerDim.left ? 'right' : + placement + + $tip + .removeClass(orgPlacement) + .addClass(placement) + } + + var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) + + this.applyPlacement(calculatedOffset, placement) + + var complete = function () { + var prevHoverState = that.hoverState + that.$element.trigger('shown.bs.' + that.type) + that.hoverState = null + + if (prevHoverState == 'out') that.leave(that) + } + + $.support.transition && this.$tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + } + } + + Tooltip.prototype.applyPlacement = function (offset, placement) { + var $tip = this.tip() + var width = $tip[0].offsetWidth + var height = $tip[0].offsetHeight + + // manually read margins because getBoundingClientRect includes difference + var marginTop = parseInt($tip.css('margin-top'), 10) + var marginLeft = parseInt($tip.css('margin-left'), 10) + + // we must check for NaN for ie 8/9 + if (isNaN(marginTop)) marginTop = 0 + if (isNaN(marginLeft)) marginLeft = 0 + + offset.top = offset.top + marginTop + offset.left = offset.left + marginLeft + + // $.fn.offset doesn't round pixel values + // so we use setOffset directly with our own function B-0 + $.offset.setOffset($tip[0], $.extend({ + using: function (props) { + $tip.css({ + top: Math.round(props.top), + left: Math.round(props.left) + }) + } + }, offset), 0) + + $tip.addClass('in') + + // check to see if placing tip in new offset caused the tip to resize itself + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (placement == 'top' && actualHeight != height) { + offset.top = offset.top + height - actualHeight + } + + var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) + + if (delta.left) offset.left += delta.left + else offset.top += delta.top + + var isVertical = /top|bottom/.test(placement) + var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight + var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' + + $tip.offset(offset) + this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) + } + + Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { + this.arrow() + .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') + .css(isVertical ? 'top' : 'left', '') + } + + Tooltip.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + + $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) + $tip.removeClass('fade in top bottom left right') + } + + Tooltip.prototype.hide = function (callback) { + var that = this + var $tip = $(this.$tip) + var e = $.Event('hide.bs.' + this.type) + + function complete() { + if (that.hoverState != 'in') $tip.detach() + that.$element + .removeAttr('aria-describedby') + .trigger('hidden.bs.' + that.type) + callback && callback() + } + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + $tip.removeClass('in') + + $.support.transition && $tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + + this.hoverState = null + + return this + } + + Tooltip.prototype.fixTitle = function () { + var $e = this.$element + if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') { + $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') + } + } + + Tooltip.prototype.hasContent = function () { + return this.getTitle() + } + + Tooltip.prototype.getPosition = function ($element) { + $element = $element || this.$element + + var el = $element[0] + var isBody = el.tagName == 'BODY' + + var elRect = el.getBoundingClientRect() + if (elRect.width == null) { + // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 + elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) + } + var elOffset = isBody ? { top: 0, left: 0 } : $element.offset() + var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } + var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null + + return $.extend({}, elRect, scroll, outerDims, elOffset) + } + + Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { + return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : + /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } + + } + + Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { + var delta = { top: 0, left: 0 } + if (!this.$viewport) return delta + + var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 + var viewportDimensions = this.getPosition(this.$viewport) + + if (/right|left/.test(placement)) { + var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll + var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight + if (topEdgeOffset < viewportDimensions.top) { // top overflow + delta.top = viewportDimensions.top - topEdgeOffset + } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow + delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset + } + } else { + var leftEdgeOffset = pos.left - viewportPadding + var rightEdgeOffset = pos.left + viewportPadding + actualWidth + if (leftEdgeOffset < viewportDimensions.left) { // left overflow + delta.left = viewportDimensions.left - leftEdgeOffset + } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow + delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset + } + } + + return delta + } + + Tooltip.prototype.getTitle = function () { + var title + var $e = this.$element + var o = this.options + + title = $e.attr('data-original-title') + || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) + + return title + } + + Tooltip.prototype.getUID = function (prefix) { + do prefix += ~~(Math.random() * 1000000) + while (document.getElementById(prefix)) + return prefix + } + + Tooltip.prototype.tip = function () { + return (this.$tip = this.$tip || $(this.options.template)) + } + + Tooltip.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) + } + + Tooltip.prototype.enable = function () { + this.enabled = true + } + + Tooltip.prototype.disable = function () { + this.enabled = false + } + + Tooltip.prototype.toggleEnabled = function () { + this.enabled = !this.enabled + } + + Tooltip.prototype.toggle = function (e) { + var self = this + if (e) { + self = $(e.currentTarget).data('bs.' + this.type) + if (!self) { + self = new this.constructor(e.currentTarget, this.getDelegateOptions()) + $(e.currentTarget).data('bs.' + this.type, self) + } + } + + self.tip().hasClass('in') ? self.leave(self) : self.enter(self) + } + + Tooltip.prototype.destroy = function () { + var that = this + clearTimeout(this.timeout) + this.hide(function () { + that.$element.off('.' + that.type).removeData('bs.' + that.type) + }) + } + + + // TOOLTIP PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tooltip') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tooltip + + $.fn.tooltip = Plugin + $.fn.tooltip.Constructor = Tooltip + + + // TOOLTIP NO CONFLICT + // =================== + + $.fn.tooltip.noConflict = function () { + $.fn.tooltip = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: popover.js v3.3.4 + * http://getbootstrap.com/javascript/#popovers + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // POPOVER PUBLIC CLASS DEFINITION + // =============================== + + var Popover = function (element, options) { + this.init('popover', element, options) + } + + if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') + + Popover.VERSION = '3.3.4' + + Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { + placement: 'right', + trigger: 'click', + content: '', + template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>' + }) + + + // NOTE: POPOVER EXTENDS tooltip.js + // ================================ + + Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) + + Popover.prototype.constructor = Popover + + Popover.prototype.getDefaults = function () { + return Popover.DEFAULTS + } + + Popover.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + var content = this.getContent() + + $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) + $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events + this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' + ](content) + + $tip.removeClass('fade top bottom left right in') + + // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do + // this manually by checking the contents. + if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() + } + + Popover.prototype.hasContent = function () { + return this.getTitle() || this.getContent() + } + + Popover.prototype.getContent = function () { + var $e = this.$element + var o = this.options + + return $e.attr('data-content') + || (typeof o.content == 'function' ? + o.content.call($e[0]) : + o.content) + } + + Popover.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.arrow')) + } + + + // POPOVER PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.popover') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.popover', (data = new Popover(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.popover + + $.fn.popover = Plugin + $.fn.popover.Constructor = Popover + + + // POPOVER NO CONFLICT + // =================== + + $.fn.popover.noConflict = function () { + $.fn.popover = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: scrollspy.js v3.3.4 + * http://getbootstrap.com/javascript/#scrollspy + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // SCROLLSPY CLASS DEFINITION + // ========================== + + function ScrollSpy(element, options) { + this.$body = $(document.body) + this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) + this.options = $.extend({}, ScrollSpy.DEFAULTS, options) + this.selector = (this.options.target || '') + ' .nav li > a' + this.offsets = [] + this.targets = [] + this.activeTarget = null + this.scrollHeight = 0 + + this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) + this.refresh() + this.process() + } + + ScrollSpy.VERSION = '3.3.4' + + ScrollSpy.DEFAULTS = { + offset: 10 + } + + ScrollSpy.prototype.getScrollHeight = function () { + return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) + } + + ScrollSpy.prototype.refresh = function () { + var that = this + var offsetMethod = 'offset' + var offsetBase = 0 + + this.offsets = [] + this.targets = [] + this.scrollHeight = this.getScrollHeight() + + if (!$.isWindow(this.$scrollElement[0])) { + offsetMethod = 'position' + offsetBase = this.$scrollElement.scrollTop() + } + + this.$body + .find(this.selector) + .map(function () { + var $el = $(this) + var href = $el.data('target') || $el.attr('href') + var $href = /^#./.test(href) && $(href) + + return ($href + && $href.length + && $href.is(':visible') + && [[$href[offsetMethod]().top + offsetBase, href]]) || null + }) + .sort(function (a, b) { return a[0] - b[0] }) + .each(function () { + that.offsets.push(this[0]) + that.targets.push(this[1]) + }) + } + + ScrollSpy.prototype.process = function () { + var scrollTop = this.$scrollElement.scrollTop() + this.options.offset + var scrollHeight = this.getScrollHeight() + var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() + var offsets = this.offsets + var targets = this.targets + var activeTarget = this.activeTarget + var i + + if (this.scrollHeight != scrollHeight) { + this.refresh() + } + + if (scrollTop >= maxScroll) { + return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) + } + + if (activeTarget && scrollTop < offsets[0]) { + this.activeTarget = null + return this.clear() + } + + for (i = offsets.length; i--;) { + activeTarget != targets[i] + && scrollTop >= offsets[i] + && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) + && this.activate(targets[i]) + } + } + + ScrollSpy.prototype.activate = function (target) { + this.activeTarget = target + + this.clear() + + var selector = this.selector + + '[data-target="' + target + '"],' + + this.selector + '[href="' + target + '"]' + + var active = $(selector) + .parents('li') + .addClass('active') + + if (active.parent('.dropdown-menu').length) { + active = active + .closest('li.dropdown') + .addClass('active') + } + + active.trigger('activate.bs.scrollspy') + } + + ScrollSpy.prototype.clear = function () { + $(this.selector) + .parentsUntil(this.options.target, '.active') + .removeClass('active') + } + + + // SCROLLSPY PLUGIN DEFINITION + // =========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.scrollspy') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.scrollspy + + $.fn.scrollspy = Plugin + $.fn.scrollspy.Constructor = ScrollSpy + + + // SCROLLSPY NO CONFLICT + // ===================== + + $.fn.scrollspy.noConflict = function () { + $.fn.scrollspy = old + return this + } + + + // SCROLLSPY DATA-API + // ================== + + $(window).on('load.bs.scrollspy.data-api', function () { + $('[data-spy="scroll"]').each(function () { + var $spy = $(this) + Plugin.call($spy, $spy.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tab.js v3.3.4 + * http://getbootstrap.com/javascript/#tabs + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TAB CLASS DEFINITION + // ==================== + + var Tab = function (element) { + this.element = $(element) + } + + Tab.VERSION = '3.3.4' + + Tab.TRANSITION_DURATION = 150 + + Tab.prototype.show = function () { + var $this = this.element + var $ul = $this.closest('ul:not(.dropdown-menu)') + var selector = $this.data('target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + if ($this.parent('li').hasClass('active')) return + + var $previous = $ul.find('.active:last a') + var hideEvent = $.Event('hide.bs.tab', { + relatedTarget: $this[0] + }) + var showEvent = $.Event('show.bs.tab', { + relatedTarget: $previous[0] + }) + + $previous.trigger(hideEvent) + $this.trigger(showEvent) + + if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return + + var $target = $(selector) + + this.activate($this.closest('li'), $ul) + this.activate($target, $target.parent(), function () { + $previous.trigger({ + type: 'hidden.bs.tab', + relatedTarget: $this[0] + }) + $this.trigger({ + type: 'shown.bs.tab', + relatedTarget: $previous[0] + }) + }) + } + + Tab.prototype.activate = function (element, container, callback) { + var $active = container.find('> .active') + var transition = callback + && $.support.transition + && (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length) + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', false) + + element + .addClass('active') + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + + if (transition) { + element[0].offsetWidth // reflow for transition + element.addClass('in') + } else { + element.removeClass('fade') + } + + if (element.parent('.dropdown-menu').length) { + element + .closest('li.dropdown') + .addClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + } + + callback && callback() + } + + $active.length && transition ? + $active + .one('bsTransitionEnd', next) + .emulateTransitionEnd(Tab.TRANSITION_DURATION) : + next() + + $active.removeClass('in') + } + + + // TAB PLUGIN DEFINITION + // ===================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tab') + + if (!data) $this.data('bs.tab', (data = new Tab(this))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tab + + $.fn.tab = Plugin + $.fn.tab.Constructor = Tab + + + // TAB NO CONFLICT + // =============== + + $.fn.tab.noConflict = function () { + $.fn.tab = old + return this + } + + + // TAB DATA-API + // ============ + + var clickHandler = function (e) { + e.preventDefault() + Plugin.call($(this), 'show') + } + + $(document) + .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) + .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: affix.js v3.3.4 + * http://getbootstrap.com/javascript/#affix + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // AFFIX CLASS DEFINITION + // ====================== + + var Affix = function (element, options) { + this.options = $.extend({}, Affix.DEFAULTS, options) + + this.$target = $(this.options.target) + .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) + .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) + + this.$element = $(element) + this.affixed = null + this.unpin = null + this.pinnedOffset = null + + this.checkPosition() + } + + Affix.VERSION = '3.3.4' + + Affix.RESET = 'affix affix-top affix-bottom' + + Affix.DEFAULTS = { + offset: 0, + target: window + } + + Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + var targetHeight = this.$target.height() + + if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false + + if (this.affixed == 'bottom') { + if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' + return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' + } + + var initializing = this.affixed == null + var colliderTop = initializing ? scrollTop : position.top + var colliderHeight = initializing ? targetHeight : height + + if (offsetTop != null && scrollTop <= offsetTop) return 'top' + if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' + + return false + } + + Affix.prototype.getPinnedOffset = function () { + if (this.pinnedOffset) return this.pinnedOffset + this.$element.removeClass(Affix.RESET).addClass('affix') + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + return (this.pinnedOffset = position.top - scrollTop) + } + + Affix.prototype.checkPositionWithEventLoop = function () { + setTimeout($.proxy(this.checkPosition, this), 1) + } + + Affix.prototype.checkPosition = function () { + if (!this.$element.is(':visible')) return + + var height = this.$element.height() + var offset = this.options.offset + var offsetTop = offset.top + var offsetBottom = offset.bottom + var scrollHeight = $(document.body).height() + + if (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) + + var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) + + if (this.affixed != affix) { + if (this.unpin != null) this.$element.css('top', '') + + var affixType = 'affix' + (affix ? '-' + affix : '') + var e = $.Event(affixType + '.bs.affix') + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + this.affixed = affix + this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null + + this.$element + .removeClass(Affix.RESET) + .addClass(affixType) + .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') + } + + if (affix == 'bottom') { + this.$element.offset({ + top: scrollHeight - height - offsetBottom + }) + } + } + + + // AFFIX PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.affix') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.affix', (data = new Affix(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.affix + + $.fn.affix = Plugin + $.fn.affix.Constructor = Affix + + + // AFFIX NO CONFLICT + // ================= + + $.fn.affix.noConflict = function () { + $.fn.affix = old + return this + } + + + // AFFIX DATA-API + // ============== + + $(window).on('load', function () { + $('[data-spy="affix"]').each(function () { + var $spy = $(this) + var data = $spy.data() + + data.offset = data.offset || {} + + if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom + if (data.offsetTop != null) data.offset.top = data.offsetTop + + Plugin.call($spy, data) + }) + }) + +}(jQuery); diff --git a/theme/bootstrap/views/js/bootstrap.min.js b/theme/bootstrap/views/js/bootstrap.min.js new file mode 100644 index 0000000..c8f82e5 --- /dev/null +++ b/theme/bootstrap/views/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.4 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.4",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.4",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.4",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.4",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27|32)/.test(b.which)&&!/input|textarea/i.test(b.target.tagName)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g&&27!=b.which||g&&27==b.which)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(b.target);38==b.which&&j>0&&j--,40==b.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="menu"]',g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in").attr("aria-hidden",!1),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a('<div class="modal-backdrop '+e+'" />').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.3.4",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport),this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-m<p.top?"bottom":"right"==h&&k.right+l>p.width?"left":"left"==h&&k.left-l<p.left?"right":h,f.removeClass(n).addClass(h)}var q=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(q,h);var r=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",r).emulateTransitionEnd(c.TRANSITION_DURATION):r()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.4",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.4",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.4",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){ +var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.4",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a(document.body).height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/views/js/jquery.js b/theme/bootstrap/views/js/jquery.js new file mode 100644 index 0000000..d1608e3 --- /dev/null +++ b/theme/bootstrap/views/js/jquery.js @@ -0,0 +1,4 @@ +/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="<select msallowclip=''><option selected=''></option></select>",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=lb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=mb(b);function pb(){}pb.prototype=d.filters=d.pseudos,d.setFilters=new pb,g=fb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fb.error(a):z(a,i).slice(0)};function qb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h; +if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==cb()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===cb()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ab:bb):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:bb,isPropagationStopped:bb,isImmediatePropagationStopped:bb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ab,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ab,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ab,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=bb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=bb),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function db(a){var b=eb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var eb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fb=/ jQuery\d+="(?:null|\d+)"/g,gb=new RegExp("<(?:"+eb+")[\\s/>]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/<tbody/i,lb=/<|&#?\w+;/,mb=/<(?:script|style|link)/i,nb=/checked\s*(?:[^=]|=\s*.checked.)/i,ob=/^$|\/(?:java|ecma)script/i,pb=/^true\/(.*)/,qb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,rb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?"<table>"!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.detach()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e)}m.Tween=Zb,Zb.prototype={constructor:Zb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px") +},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$b=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_b||(_b=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_b),_b=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSetAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contenteditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.ActiveXObject&&m(a).on("unload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m}); \ No newline at end of file diff --git a/theme/bootstrap/views/js/plugins/flot/excanvas.min.js b/theme/bootstrap/views/js/plugins/flot/excanvas.min.js new file mode 100644 index 0000000..12c74f7 --- /dev/null +++ b/theme/bootstrap/views/js/plugins/flot/excanvas.min.js @@ -0,0 +1 @@ +if(!document.createElement("canvas").getContext){(function(){var z=Math;var K=z.round;var J=z.sin;var U=z.cos;var b=z.abs;var k=z.sqrt;var D=10;var F=D/2;function T(){return this.context_||(this.context_=new W(this))}var O=Array.prototype.slice;function G(i,j,m){var Z=O.call(arguments,2);return function(){return i.apply(j,Z.concat(O.call(arguments)))}}function AD(Z){return String(Z).replace(/&/g,"&amp;").replace(/"/g,"&quot;")}function r(i){if(!i.namespaces.g_vml_){i.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML")}if(!i.namespaces.g_o_){i.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML")}if(!i.styleSheets.ex_canvas_){var Z=i.createStyleSheet();Z.owningElement.id="ex_canvas_";Z.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}r(document);var E={init:function(Z){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var i=Z||document;i.createElement("canvas");i.attachEvent("onreadystatechange",G(this.init_,this,i))}},init_:function(m){var j=m.getElementsByTagName("canvas");for(var Z=0;Z<j.length;Z++){this.initElement(j[Z])}},initElement:function(i){if(!i.getContext){i.getContext=T;r(i.ownerDocument);i.innerHTML="";i.attachEvent("onpropertychange",S);i.attachEvent("onresize",w);var Z=i.attributes;if(Z.width&&Z.width.specified){i.style.width=Z.width.nodeValue+"px"}else{i.width=i.clientWidth}if(Z.height&&Z.height.specified){i.style.height=Z.height.nodeValue+"px"}else{i.height=i.clientHeight}}return i}};function S(i){var Z=i.srcElement;switch(i.propertyName){case"width":Z.getContext().clearRect();Z.style.width=Z.attributes.width.nodeValue+"px";Z.firstChild.style.width=Z.clientWidth+"px";break;case"height":Z.getContext().clearRect();Z.style.height=Z.attributes.height.nodeValue+"px";Z.firstChild.style.height=Z.clientHeight+"px";break}}function w(i){var Z=i.srcElement;if(Z.firstChild){Z.firstChild.style.width=Z.clientWidth+"px";Z.firstChild.style.height=Z.clientHeight+"px"}}E.init();var I=[];for(var AC=0;AC<16;AC++){for(var AB=0;AB<16;AB++){I[AC*16+AB]=AC.toString(16)+AB.toString(16)}}function V(){return[[1,0,0],[0,1,0],[0,0,1]]}function d(m,j){var i=V();for(var Z=0;Z<3;Z++){for(var AF=0;AF<3;AF++){var p=0;for(var AE=0;AE<3;AE++){p+=m[Z][AE]*j[AE][AF]}i[Z][AF]=p}}return i}function Q(i,Z){Z.fillStyle=i.fillStyle;Z.lineCap=i.lineCap;Z.lineJoin=i.lineJoin;Z.lineWidth=i.lineWidth;Z.miterLimit=i.miterLimit;Z.shadowBlur=i.shadowBlur;Z.shadowColor=i.shadowColor;Z.shadowOffsetX=i.shadowOffsetX;Z.shadowOffsetY=i.shadowOffsetY;Z.strokeStyle=i.strokeStyle;Z.globalAlpha=i.globalAlpha;Z.font=i.font;Z.textAlign=i.textAlign;Z.textBaseline=i.textBaseline;Z.arcScaleX_=i.arcScaleX_;Z.arcScaleY_=i.arcScaleY_;Z.lineScale_=i.lineScale_}var B={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldenrod:"#EEE8AA",palegreen:"#98FB98",paleturquoise:"#AFEEEE",palevioletred:"#DB7093",papayawhip:"#FFEFD5",peachpuff:"#FFDAB9",peru:"#CD853F",pink:"#FFC0CB",plum:"#DDA0DD",powderblue:"#B0E0E6",rosybrown:"#BC8F8F",royalblue:"#4169E1",saddlebrown:"#8B4513",salmon:"#FA8072",sandybrown:"#F4A460",seagreen:"#2E8B57",seashell:"#FFF5EE",sienna:"#A0522D",skyblue:"#87CEEB",slateblue:"#6A5ACD",slategray:"#708090",slategrey:"#708090",snow:"#FFFAFA",springgreen:"#00FF7F",steelblue:"#4682B4",tan:"#D2B48C",thistle:"#D8BFD8",tomato:"#FF6347",turquoise:"#40E0D0",violet:"#EE82EE",wheat:"#F5DEB3",whitesmoke:"#F5F5F5",yellowgreen:"#9ACD32"};function g(i){var m=i.indexOf("(",3);var Z=i.indexOf(")",m+1);var j=i.substring(m+1,Z).split(",");if(j.length==4&&i.substr(3,1)=="a"){alpha=Number(j[3])}else{j[3]=1}return j}function C(Z){return parseFloat(Z)/100}function N(i,j,Z){return Math.min(Z,Math.max(j,i))}function c(AF){var j,i,Z;h=parseFloat(AF[0])/360%360;if(h<0){h++}s=N(C(AF[1]),0,1);l=N(C(AF[2]),0,1);if(s==0){j=i=Z=l}else{var m=l<0.5?l*(1+s):l+s-l*s;var AE=2*l-m;j=A(AE,m,h+1/3);i=A(AE,m,h);Z=A(AE,m,h-1/3)}return"#"+I[Math.floor(j*255)]+I[Math.floor(i*255)]+I[Math.floor(Z*255)]}function A(i,Z,j){if(j<0){j++}if(j>1){j--}if(6*j<1){return i+(Z-i)*6*j}else{if(2*j<1){return Z}else{if(3*j<2){return i+(Z-i)*(2/3-j)*6}else{return i}}}}function Y(Z){var AE,p=1;Z=String(Z);if(Z.charAt(0)=="#"){AE=Z}else{if(/^rgb/.test(Z)){var m=g(Z);var AE="#",AF;for(var j=0;j<3;j++){if(m[j].indexOf("%")!=-1){AF=Math.floor(C(m[j])*255)}else{AF=Number(m[j])}AE+=I[N(AF,0,255)]}p=m[3]}else{if(/^hsl/.test(Z)){var m=g(Z);AE=c(m);p=m[3]}else{AE=B[Z]||Z}}}return{color:AE,alpha:p}}var L={style:"normal",variant:"normal",weight:"normal",size:10,family:"sans-serif"};var f={};function X(Z){if(f[Z]){return f[Z]}var m=document.createElement("div");var j=m.style;try{j.font=Z}catch(i){}return f[Z]={style:j.fontStyle||L.style,variant:j.fontVariant||L.variant,weight:j.fontWeight||L.weight,size:j.fontSize||L.size,family:j.fontFamily||L.family}}function P(j,i){var Z={};for(var AF in j){Z[AF]=j[AF]}var AE=parseFloat(i.currentStyle.fontSize),m=parseFloat(j.size);if(typeof j.size=="number"){Z.size=j.size}else{if(j.size.indexOf("px")!=-1){Z.size=m}else{if(j.size.indexOf("em")!=-1){Z.size=AE*m}else{if(j.size.indexOf("%")!=-1){Z.size=(AE/100)*m}else{if(j.size.indexOf("pt")!=-1){Z.size=m/0.75}else{Z.size=AE}}}}}Z.size*=0.981;return Z}function AA(Z){return Z.style+" "+Z.variant+" "+Z.weight+" "+Z.size+"px "+Z.family}function t(Z){switch(Z){case"butt":return"flat";case"round":return"round";case"square":default:return"square"}}function W(i){this.m_=V();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=D*1;this.globalAlpha=1;this.font="10px sans-serif";this.textAlign="left";this.textBaseline="alphabetic";this.canvas=i;var Z=i.ownerDocument.createElement("div");Z.style.width=i.clientWidth+"px";Z.style.height=i.clientHeight+"px";Z.style.overflow="hidden";Z.style.position="absolute";i.appendChild(Z);this.element_=Z;this.arcScaleX_=1;this.arcScaleY_=1;this.lineScale_=1}var M=W.prototype;M.clearRect=function(){if(this.textMeasureEl_){this.textMeasureEl_.removeNode(true);this.textMeasureEl_=null}this.element_.innerHTML=""};M.beginPath=function(){this.currentPath_=[]};M.moveTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"moveTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.lineTo=function(i,Z){var j=this.getCoords_(i,Z);this.currentPath_.push({type:"lineTo",x:j.x,y:j.y});this.currentX_=j.x;this.currentY_=j.y};M.bezierCurveTo=function(j,i,AI,AH,AG,AE){var Z=this.getCoords_(AG,AE);var AF=this.getCoords_(j,i);var m=this.getCoords_(AI,AH);e(this,AF,m,Z)};function e(Z,m,j,i){Z.currentPath_.push({type:"bezierCurveTo",cp1x:m.x,cp1y:m.y,cp2x:j.x,cp2y:j.y,x:i.x,y:i.y});Z.currentX_=i.x;Z.currentY_=i.y}M.quadraticCurveTo=function(AG,j,i,Z){var AF=this.getCoords_(AG,j);var AE=this.getCoords_(i,Z);var AH={x:this.currentX_+2/3*(AF.x-this.currentX_),y:this.currentY_+2/3*(AF.y-this.currentY_)};var m={x:AH.x+(AE.x-this.currentX_)/3,y:AH.y+(AE.y-this.currentY_)/3};e(this,AH,m,AE)};M.arc=function(AJ,AH,AI,AE,i,j){AI*=D;var AN=j?"at":"wa";var AK=AJ+U(AE)*AI-F;var AM=AH+J(AE)*AI-F;var Z=AJ+U(i)*AI-F;var AL=AH+J(i)*AI-F;if(AK==Z&&!j){AK+=0.125}var m=this.getCoords_(AJ,AH);var AG=this.getCoords_(AK,AM);var AF=this.getCoords_(Z,AL);this.currentPath_.push({type:AN,x:m.x,y:m.y,radius:AI,xStart:AG.x,yStart:AG.y,xEnd:AF.x,yEnd:AF.y})};M.rect=function(j,i,Z,m){this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath()};M.strokeRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.stroke();this.currentPath_=p};M.fillRect=function(j,i,Z,m){var p=this.currentPath_;this.beginPath();this.moveTo(j,i);this.lineTo(j+Z,i);this.lineTo(j+Z,i+m);this.lineTo(j,i+m);this.closePath();this.fill();this.currentPath_=p};M.createLinearGradient=function(i,m,Z,j){var p=new v("gradient");p.x0_=i;p.y0_=m;p.x1_=Z;p.y1_=j;return p};M.createRadialGradient=function(m,AE,j,i,p,Z){var AF=new v("gradientradial");AF.x0_=m;AF.y0_=AE;AF.r0_=j;AF.x1_=i;AF.y1_=p;AF.r1_=Z;return AF};M.drawImage=function(AO,j){var AH,AF,AJ,AV,AM,AK,AQ,AX;var AI=AO.runtimeStyle.width;var AN=AO.runtimeStyle.height;AO.runtimeStyle.width="auto";AO.runtimeStyle.height="auto";var AG=AO.width;var AT=AO.height;AO.runtimeStyle.width=AI;AO.runtimeStyle.height=AN;if(arguments.length==3){AH=arguments[1];AF=arguments[2];AM=AK=0;AQ=AJ=AG;AX=AV=AT}else{if(arguments.length==5){AH=arguments[1];AF=arguments[2];AJ=arguments[3];AV=arguments[4];AM=AK=0;AQ=AG;AX=AT}else{if(arguments.length==9){AM=arguments[1];AK=arguments[2];AQ=arguments[3];AX=arguments[4];AH=arguments[5];AF=arguments[6];AJ=arguments[7];AV=arguments[8]}else{throw Error("Invalid number of arguments")}}}var AW=this.getCoords_(AH,AF);var m=AQ/2;var i=AX/2;var AU=[];var Z=10;var AE=10;AU.push(" <g_vml_:group",' coordsize="',D*Z,",",D*AE,'"',' coordorigin="0,0"',' style="width:',Z,"px;height:",AE,"px;position:absolute;");if(this.m_[0][0]!=1||this.m_[0][1]||this.m_[1][1]!=1||this.m_[1][0]){var p=[];p.push("M11=",this.m_[0][0],",","M12=",this.m_[1][0],",","M21=",this.m_[0][1],",","M22=",this.m_[1][1],",","Dx=",K(AW.x/D),",","Dy=",K(AW.y/D),"");var AS=AW;var AR=this.getCoords_(AH+AJ,AF);var AP=this.getCoords_(AH,AF+AV);var AL=this.getCoords_(AH+AJ,AF+AV);AS.x=z.max(AS.x,AR.x,AP.x,AL.x);AS.y=z.max(AS.y,AR.y,AP.y,AL.y);AU.push("padding:0 ",K(AS.x/D),"px ",K(AS.y/D),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",p.join(""),", sizingmethod='clip');")}else{AU.push("top:",K(AW.y/D),"px;left:",K(AW.x/D),"px;")}AU.push(' ">','<g_vml_:image src="',AO.src,'"',' style="width:',D*AJ,"px;"," height:",D*AV,'px"',' cropleft="',AM/AG,'"',' croptop="',AK/AT,'"',' cropright="',(AG-AM-AQ)/AG,'"',' cropbottom="',(AT-AK-AX)/AT,'"'," />","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",AU.join(""))};M.stroke=function(AM){var m=10;var AN=10;var AE=5000;var AG={x:null,y:null};var AL={x:null,y:null};for(var AH=0;AH<this.currentPath_.length;AH+=AE){var AK=[];var AF=false;AK.push("<g_vml_:shape",' filled="',!!AM,'"',' style="position:absolute;width:',m,"px;height:",AN,'px;"',' coordorigin="0,0"',' coordsize="',D*m,",",D*AN,'"',' stroked="',!AM,'"',' path="');var AO=false;for(var AI=AH;AI<Math.min(AH+AE,this.currentPath_.length);AI++){if(AI%AE==0&&AI>0){AK.push(" m ",K(this.currentPath_[AI-1].x),",",K(this.currentPath_[AI-1].y))}var Z=this.currentPath_[AI];var AJ;switch(Z.type){case"moveTo":AJ=Z;AK.push(" m ",K(Z.x),",",K(Z.y));break;case"lineTo":AK.push(" l ",K(Z.x),",",K(Z.y));break;case"close":AK.push(" x ");Z=null;break;case"bezierCurveTo":AK.push(" c ",K(Z.cp1x),",",K(Z.cp1y),",",K(Z.cp2x),",",K(Z.cp2y),",",K(Z.x),",",K(Z.y));break;case"at":case"wa":AK.push(" ",Z.type," ",K(Z.x-this.arcScaleX_*Z.radius),",",K(Z.y-this.arcScaleY_*Z.radius)," ",K(Z.x+this.arcScaleX_*Z.radius),",",K(Z.y+this.arcScaleY_*Z.radius)," ",K(Z.xStart),",",K(Z.yStart)," ",K(Z.xEnd),",",K(Z.yEnd));break}if(Z){if(AG.x==null||Z.x<AG.x){AG.x=Z.x}if(AL.x==null||Z.x>AL.x){AL.x=Z.x}if(AG.y==null||Z.y<AG.y){AG.y=Z.y}if(AL.y==null||Z.y>AL.y){AL.y=Z.y}}}AK.push(' ">');if(!AM){R(this,AK)}else{a(this,AK,AG,AL)}AK.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",AK.join(""))}};function R(j,AE){var i=Y(j.strokeStyle);var m=i.color;var p=i.alpha*j.globalAlpha;var Z=j.lineScale_*j.lineWidth;if(Z<1){p*=Z}AE.push("<g_vml_:stroke",' opacity="',p,'"',' joinstyle="',j.lineJoin,'"',' miterlimit="',j.miterLimit,'"',' endcap="',t(j.lineCap),'"',' weight="',Z,'px"',' color="',m,'" />')}function a(AO,AG,Ah,AP){var AH=AO.fillStyle;var AY=AO.arcScaleX_;var AX=AO.arcScaleY_;var Z=AP.x-Ah.x;var m=AP.y-Ah.y;if(AH instanceof v){var AL=0;var Ac={x:0,y:0};var AU=0;var AK=1;if(AH.type_=="gradient"){var AJ=AH.x0_/AY;var j=AH.y0_/AX;var AI=AH.x1_/AY;var Aj=AH.y1_/AX;var Ag=AO.getCoords_(AJ,j);var Af=AO.getCoords_(AI,Aj);var AE=Af.x-Ag.x;var p=Af.y-Ag.y;AL=Math.atan2(AE,p)*180/Math.PI;if(AL<0){AL+=360}if(AL<0.000001){AL=0}}else{var Ag=AO.getCoords_(AH.x0_,AH.y0_);Ac={x:(Ag.x-Ah.x)/Z,y:(Ag.y-Ah.y)/m};Z/=AY*D;m/=AX*D;var Aa=z.max(Z,m);AU=2*AH.r0_/Aa;AK=2*AH.r1_/Aa-AU}var AS=AH.colors_;AS.sort(function(Ak,i){return Ak.offset-i.offset});var AN=AS.length;var AR=AS[0].color;var AQ=AS[AN-1].color;var AW=AS[0].alpha*AO.globalAlpha;var AV=AS[AN-1].alpha*AO.globalAlpha;var Ab=[];for(var Ae=0;Ae<AN;Ae++){var AM=AS[Ae];Ab.push(AM.offset*AK+AU+" "+AM.color)}AG.push('<g_vml_:fill type="',AH.type_,'"',' method="none" focus="100%"',' color="',AR,'"',' color2="',AQ,'"',' colors="',Ab.join(","),'"',' opacity="',AV,'"',' g_o_:opacity2="',AW,'"',' angle="',AL,'"',' focusposition="',Ac.x,",",Ac.y,'" />')}else{if(AH instanceof u){if(Z&&m){var AF=-Ah.x;var AZ=-Ah.y;AG.push("<g_vml_:fill",' position="',AF/Z*AY*AY,",",AZ/m*AX*AX,'"',' type="tile"',' src="',AH.src_,'" />')}}else{var Ai=Y(AO.fillStyle);var AT=Ai.color;var Ad=Ai.alpha*AO.globalAlpha;AG.push('<g_vml_:fill color="',AT,'" opacity="',Ad,'" />')}}}M.fill=function(){this.stroke(true)};M.closePath=function(){this.currentPath_.push({type:"close"})};M.getCoords_=function(j,i){var Z=this.m_;return{x:D*(j*Z[0][0]+i*Z[1][0]+Z[2][0])-F,y:D*(j*Z[0][1]+i*Z[1][1]+Z[2][1])-F}};M.save=function(){var Z={};Q(this,Z);this.aStack_.push(Z);this.mStack_.push(this.m_);this.m_=d(V(),this.m_)};M.restore=function(){if(this.aStack_.length){Q(this.aStack_.pop(),this);this.m_=this.mStack_.pop()}};function H(Z){return isFinite(Z[0][0])&&isFinite(Z[0][1])&&isFinite(Z[1][0])&&isFinite(Z[1][1])&&isFinite(Z[2][0])&&isFinite(Z[2][1])}function y(i,Z,j){if(!H(Z)){return }i.m_=Z;if(j){var p=Z[0][0]*Z[1][1]-Z[0][1]*Z[1][0];i.lineScale_=k(b(p))}}M.translate=function(j,i){var Z=[[1,0,0],[0,1,0],[j,i,1]];y(this,d(Z,this.m_),false)};M.rotate=function(i){var m=U(i);var j=J(i);var Z=[[m,j,0],[-j,m,0],[0,0,1]];y(this,d(Z,this.m_),false)};M.scale=function(j,i){this.arcScaleX_*=j;this.arcScaleY_*=i;var Z=[[j,0,0],[0,i,0],[0,0,1]];y(this,d(Z,this.m_),true)};M.transform=function(p,m,AF,AE,i,Z){var j=[[p,m,0],[AF,AE,0],[i,Z,1]];y(this,d(j,this.m_),true)};M.setTransform=function(AE,p,AG,AF,j,i){var Z=[[AE,p,0],[AG,AF,0],[j,i,1]];y(this,Z,true)};M.drawText_=function(AK,AI,AH,AN,AG){var AM=this.m_,AQ=1000,i=0,AP=AQ,AF={x:0,y:0},AE=[];var Z=P(X(this.font),this.element_);var j=AA(Z);var AR=this.element_.currentStyle;var p=this.textAlign.toLowerCase();switch(p){case"left":case"center":case"right":break;case"end":p=AR.direction=="ltr"?"right":"left";break;case"start":p=AR.direction=="rtl"?"right":"left";break;default:p="left"}switch(this.textBaseline){case"hanging":case"top":AF.y=Z.size/1.75;break;case"middle":break;default:case null:case"alphabetic":case"ideographic":case"bottom":AF.y=-Z.size/2.25;break}switch(p){case"right":i=AQ;AP=0.05;break;case"center":i=AP=AQ/2;break}var AO=this.getCoords_(AI+AF.x,AH+AF.y);AE.push('<g_vml_:line from="',-i,' 0" to="',AP,' 0.05" ',' coordsize="100 100" coordorigin="0 0"',' filled="',!AG,'" stroked="',!!AG,'" style="position:absolute;width:1px;height:1px;">');if(AG){R(this,AE)}else{a(this,AE,{x:-i,y:0},{x:AP,y:Z.size})}var AL=AM[0][0].toFixed(3)+","+AM[1][0].toFixed(3)+","+AM[0][1].toFixed(3)+","+AM[1][1].toFixed(3)+",0,0";var AJ=K(AO.x/D)+","+K(AO.y/D);AE.push('<g_vml_:skew on="t" matrix="',AL,'" ',' offset="',AJ,'" origin="',i,' 0" />','<g_vml_:path textpathok="true" />','<g_vml_:textpath on="true" string="',AD(AK),'" style="v-text-align:',p,";font:",AD(j),'" /></g_vml_:line>');this.element_.insertAdjacentHTML("beforeEnd",AE.join(""))};M.fillText=function(j,Z,m,i){this.drawText_(j,Z,m,i,false)};M.strokeText=function(j,Z,m,i){this.drawText_(j,Z,m,i,true)};M.measureText=function(j){if(!this.textMeasureEl_){var Z='<span style="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;"></span>';this.element_.insertAdjacentHTML("beforeEnd",Z);this.textMeasureEl_=this.element_.lastChild}var i=this.element_.ownerDocument;this.textMeasureEl_.innerHTML="";this.textMeasureEl_.style.font=this.font;this.textMeasureEl_.appendChild(i.createTextNode(j));return{width:this.textMeasureEl_.offsetWidth}};M.clip=function(){};M.arcTo=function(){};M.createPattern=function(i,Z){return new u(i,Z)};function v(Z){this.type_=Z;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}v.prototype.addColorStop=function(i,Z){Z=Y(Z);this.colors_.push({offset:i,color:Z.color,alpha:Z.alpha})};function u(i,Z){q(i);switch(Z){case"repeat":case null:case"":this.repetition_="repeat";break;case"repeat-x":case"repeat-y":case"no-repeat":this.repetition_=Z;break;default:n("SYNTAX_ERR")}this.src_=i.src;this.width_=i.width;this.height_=i.height}function n(Z){throw new o(Z)}function q(Z){if(!Z||Z.nodeType!=1||Z.tagName!="IMG"){n("TYPE_MISMATCH_ERR")}if(Z.readyState!="complete"){n("INVALID_STATE_ERR")}}function o(Z){this.code=this[Z];this.message=Z+": DOM Exception "+this.code}var x=o.prototype=new Error;x.INDEX_SIZE_ERR=1;x.DOMSTRING_SIZE_ERR=2;x.HIERARCHY_REQUEST_ERR=3;x.WRONG_DOCUMENT_ERR=4;x.INVALID_CHARACTER_ERR=5;x.NO_DATA_ALLOWED_ERR=6;x.NO_MODIFICATION_ALLOWED_ERR=7;x.NOT_FOUND_ERR=8;x.NOT_SUPPORTED_ERR=9;x.INUSE_ATTRIBUTE_ERR=10;x.INVALID_STATE_ERR=11;x.SYNTAX_ERR=12;x.INVALID_MODIFICATION_ERR=13;x.NAMESPACE_ERR=14;x.INVALID_ACCESS_ERR=15;x.VALIDATION_ERR=16;x.TYPE_MISMATCH_ERR=17;G_vmlCanvasManager=E;CanvasRenderingContext2D=W;CanvasGradient=v;CanvasPattern=u;DOMException=o})()}; \ No newline at end of file diff --git a/theme/bootstrap/views/js/plugins/flot/flot-data.js b/theme/bootstrap/views/js/plugins/flot/flot-data.js new file mode 100644 index 0000000..b6d68fc --- /dev/null +++ b/theme/bootstrap/views/js/plugins/flot/flot-data.js @@ -0,0 +1,1244 @@ +// Flot Charts sample data for SB Admin template + +// Flot Line Chart with Tooltips +$(document).ready(function() { + console.log("document ready"); + var offset = 0; + plot(); + + function plot() { + var sin = [], + cos = []; + for (var i = 0; i < 12; i += 0.2) { + sin.push([i, Math.sin(i + offset)]); + cos.push([i, Math.cos(i + offset)]); + } + + var options = { + series: { + lines: { + show: true + }, + points: { + show: true + } + }, + grid: { + hoverable: true //IMPORTANT! this is needed for tooltip to work + }, + yaxis: { + min: -1.2, + max: 1.2 + }, + tooltip: true, + tooltipOpts: { + content: "'%s' of %x.1 is %y.4", + shifts: { + x: -60, + y: 25 + } + } + }; + + var plotObj = $.plot($("#flot-line-chart"), [{ + data: sin, + label: "sin(x)" + }, { + data: cos, + label: "cos(x)" + }], + options); + } +}); + +// Flot Pie Chart with Tooltips +$(function() { + + var data = [{ + label: "Series 0", + data: 1 + }, { + label: "Series 1", + data: 3 + }, { + label: "Series 2", + data: 9 + }, { + label: "Series 3", + data: 20 + }]; + + var plotObj = $.plot($("#flot-pie-chart"), data, { + series: { + pie: { + show: true + } + }, + grid: { + hoverable: true + }, + tooltip: true, + tooltipOpts: { + content: "%p.0%, %s", // show percentages, rounding to 2 decimal places + shifts: { + x: 20, + y: 0 + }, + defaultTheme: false + } + }); + +}); + +// Flot Line Charts - Multiple Axes - With Data +$(function() { + var oilprices = [ + [1167692400000, 61.05], + [1167778800000, 58.32], + [1167865200000, 57.35], + [1167951600000, 56.31], + [1168210800000, 55.55], + [1168297200000, 55.64], + [1168383600000, 54.02], + [1168470000000, 51.88], + [1168556400000, 52.99], + [1168815600000, 52.99], + [1168902000000, 51.21], + [1168988400000, 52.24], + [1169074800000, 50.48], + [1169161200000, 51.99], + [1169420400000, 51.13], + [1169506800000, 55.04], + [1169593200000, 55.37], + [1169679600000, 54.23], + [1169766000000, 55.42], + [1170025200000, 54.01], + [1170111600000, 56.97], + [1170198000000, 58.14], + [1170284400000, 58.14], + [1170370800000, 59.02], + [1170630000000, 58.74], + [1170716400000, 58.88], + [1170802800000, 57.71], + [1170889200000, 59.71], + [1170975600000, 59.89], + [1171234800000, 57.81], + [1171321200000, 59.06], + [1171407600000, 58.00], + [1171494000000, 57.99], + [1171580400000, 59.39], + [1171839600000, 59.39], + [1171926000000, 58.07], + [1172012400000, 60.07], + [1172098800000, 61.14], + [1172444400000, 61.39], + [1172530800000, 61.46], + [1172617200000, 61.79], + [1172703600000, 62.00], + [1172790000000, 60.07], + [1173135600000, 60.69], + [1173222000000, 61.82], + [1173308400000, 60.05], + [1173654000000, 58.91], + [1173740400000, 57.93], + [1173826800000, 58.16], + [1173913200000, 57.55], + [1173999600000, 57.11], + [1174258800000, 56.59], + [1174345200000, 59.61], + [1174518000000, 61.69], + [1174604400000, 62.28], + [1174860000000, 62.91], + [1174946400000, 62.93], + [1175032800000, 64.03], + [1175119200000, 66.03], + [1175205600000, 65.87], + [1175464800000, 64.64], + [1175637600000, 64.38], + [1175724000000, 64.28], + [1175810400000, 64.28], + [1176069600000, 61.51], + [1176156000000, 61.89], + [1176242400000, 62.01], + [1176328800000, 63.85], + [1176415200000, 63.63], + [1176674400000, 63.61], + [1176760800000, 63.10], + [1176847200000, 63.13], + [1176933600000, 61.83], + [1177020000000, 63.38], + [1177279200000, 64.58], + [1177452000000, 65.84], + [1177538400000, 65.06], + [1177624800000, 66.46], + [1177884000000, 64.40], + [1178056800000, 63.68], + [1178143200000, 63.19], + [1178229600000, 61.93], + [1178488800000, 61.47], + [1178575200000, 61.55], + [1178748000000, 61.81], + [1178834400000, 62.37], + [1179093600000, 62.46], + [1179180000000, 63.17], + [1179266400000, 62.55], + [1179352800000, 64.94], + [1179698400000, 66.27], + [1179784800000, 65.50], + [1179871200000, 65.77], + [1179957600000, 64.18], + [1180044000000, 65.20], + [1180389600000, 63.15], + [1180476000000, 63.49], + [1180562400000, 65.08], + [1180908000000, 66.30], + [1180994400000, 65.96], + [1181167200000, 66.93], + [1181253600000, 65.98], + [1181599200000, 65.35], + [1181685600000, 66.26], + [1181858400000, 68.00], + [1182117600000, 69.09], + [1182204000000, 69.10], + [1182290400000, 68.19], + [1182376800000, 68.19], + [1182463200000, 69.14], + [1182722400000, 68.19], + [1182808800000, 67.77], + [1182895200000, 68.97], + [1182981600000, 69.57], + [1183068000000, 70.68], + [1183327200000, 71.09], + [1183413600000, 70.92], + [1183586400000, 71.81], + [1183672800000, 72.81], + [1183932000000, 72.19], + [1184018400000, 72.56], + [1184191200000, 72.50], + [1184277600000, 74.15], + [1184623200000, 75.05], + [1184796000000, 75.92], + [1184882400000, 75.57], + [1185141600000, 74.89], + [1185228000000, 73.56], + [1185314400000, 75.57], + [1185400800000, 74.95], + [1185487200000, 76.83], + [1185832800000, 78.21], + [1185919200000, 76.53], + [1186005600000, 76.86], + [1186092000000, 76.00], + [1186437600000, 71.59], + [1186696800000, 71.47], + [1186956000000, 71.62], + [1187042400000, 71.00], + [1187301600000, 71.98], + [1187560800000, 71.12], + [1187647200000, 69.47], + [1187733600000, 69.26], + [1187820000000, 69.83], + [1187906400000, 71.09], + [1188165600000, 71.73], + [1188338400000, 73.36], + [1188511200000, 74.04], + [1188856800000, 76.30], + [1189116000000, 77.49], + [1189461600000, 78.23], + [1189548000000, 79.91], + [1189634400000, 80.09], + [1189720800000, 79.10], + [1189980000000, 80.57], + [1190066400000, 81.93], + [1190239200000, 83.32], + [1190325600000, 81.62], + [1190584800000, 80.95], + [1190671200000, 79.53], + [1190757600000, 80.30], + [1190844000000, 82.88], + [1190930400000, 81.66], + [1191189600000, 80.24], + [1191276000000, 80.05], + [1191362400000, 79.94], + [1191448800000, 81.44], + [1191535200000, 81.22], + [1191794400000, 79.02], + [1191880800000, 80.26], + [1191967200000, 80.30], + [1192053600000, 83.08], + [1192140000000, 83.69], + [1192399200000, 86.13], + [1192485600000, 87.61], + [1192572000000, 87.40], + [1192658400000, 89.47], + [1192744800000, 88.60], + [1193004000000, 87.56], + [1193090400000, 87.56], + [1193176800000, 87.10], + [1193263200000, 91.86], + [1193612400000, 93.53], + [1193698800000, 94.53], + [1193871600000, 95.93], + [1194217200000, 93.98], + [1194303600000, 96.37], + [1194476400000, 95.46], + [1194562800000, 96.32], + [1195081200000, 93.43], + [1195167600000, 95.10], + [1195426800000, 94.64], + [1195513200000, 95.10], + [1196031600000, 97.70], + [1196118000000, 94.42], + [1196204400000, 90.62], + [1196290800000, 91.01], + [1196377200000, 88.71], + [1196636400000, 88.32], + [1196809200000, 90.23], + [1196982000000, 88.28], + [1197241200000, 87.86], + [1197327600000, 90.02], + [1197414000000, 92.25], + [1197586800000, 90.63], + [1197846000000, 90.63], + [1197932400000, 90.49], + [1198018800000, 91.24], + [1198105200000, 91.06], + [1198191600000, 90.49], + [1198710000000, 96.62], + [1198796400000, 96.00], + [1199142000000, 99.62], + [1199314800000, 99.18], + [1199401200000, 95.09], + [1199660400000, 96.33], + [1199833200000, 95.67], + [1200351600000, 91.90], + [1200438000000, 90.84], + [1200524400000, 90.13], + [1200610800000, 90.57], + [1200956400000, 89.21], + [1201042800000, 86.99], + [1201129200000, 89.85], + [1201474800000, 90.99], + [1201561200000, 91.64], + [1201647600000, 92.33], + [1201734000000, 91.75], + [1202079600000, 90.02], + [1202166000000, 88.41], + [1202252400000, 87.14], + [1202338800000, 88.11], + [1202425200000, 91.77], + [1202770800000, 92.78], + [1202857200000, 93.27], + [1202943600000, 95.46], + [1203030000000, 95.46], + [1203289200000, 101.74], + [1203462000000, 98.81], + [1203894000000, 100.88], + [1204066800000, 99.64], + [1204153200000, 102.59], + [1204239600000, 101.84], + [1204498800000, 99.52], + [1204585200000, 99.52], + [1204671600000, 104.52], + [1204758000000, 105.47], + [1204844400000, 105.15], + [1205103600000, 108.75], + [1205276400000, 109.92], + [1205362800000, 110.33], + [1205449200000, 110.21], + [1205708400000, 105.68], + [1205967600000, 101.84], + [1206313200000, 100.86], + [1206399600000, 101.22], + [1206486000000, 105.90], + [1206572400000, 107.58], + [1206658800000, 105.62], + [1206914400000, 101.58], + [1207000800000, 100.98], + [1207173600000, 103.83], + [1207260000000, 106.23], + [1207605600000, 108.50], + [1207778400000, 110.11], + [1207864800000, 110.14], + [1208210400000, 113.79], + [1208296800000, 114.93], + [1208383200000, 114.86], + [1208728800000, 117.48], + [1208815200000, 118.30], + [1208988000000, 116.06], + [1209074400000, 118.52], + [1209333600000, 118.75], + [1209420000000, 113.46], + [1209592800000, 112.52], + [1210024800000, 121.84], + [1210111200000, 123.53], + [1210197600000, 123.69], + [1210543200000, 124.23], + [1210629600000, 125.80], + [1210716000000, 126.29], + [1211148000000, 127.05], + [1211320800000, 129.07], + [1211493600000, 132.19], + [1211839200000, 128.85], + [1212357600000, 127.76], + [1212703200000, 138.54], + [1212962400000, 136.80], + [1213135200000, 136.38], + [1213308000000, 134.86], + [1213653600000, 134.01], + [1213740000000, 136.68], + [1213912800000, 135.65], + [1214172000000, 134.62], + [1214258400000, 134.62], + [1214344800000, 134.62], + [1214431200000, 139.64], + [1214517600000, 140.21], + [1214776800000, 140.00], + [1214863200000, 140.97], + [1214949600000, 143.57], + [1215036000000, 145.29], + [1215381600000, 141.37], + [1215468000000, 136.04], + [1215727200000, 146.40], + [1215986400000, 145.18], + [1216072800000, 138.74], + [1216159200000, 134.60], + [1216245600000, 129.29], + [1216332000000, 130.65], + [1216677600000, 127.95], + [1216850400000, 127.95], + [1217282400000, 122.19], + [1217455200000, 124.08], + [1217541600000, 125.10], + [1217800800000, 121.41], + [1217887200000, 119.17], + [1217973600000, 118.58], + [1218060000000, 120.02], + [1218405600000, 114.45], + [1218492000000, 113.01], + [1218578400000, 116.00], + [1218751200000, 113.77], + [1219010400000, 112.87], + [1219096800000, 114.53], + [1219269600000, 114.98], + [1219356000000, 114.98], + [1219701600000, 116.27], + [1219788000000, 118.15], + [1219874400000, 115.59], + [1219960800000, 115.46], + [1220306400000, 109.71], + [1220392800000, 109.35], + [1220565600000, 106.23], + [1220824800000, 106.34] + ]; + var exchangerates = [ + [1167606000000, 0.7580], + [1167692400000, 0.7580], + [1167778800000, 0.75470], + [1167865200000, 0.75490], + [1167951600000, 0.76130], + [1168038000000, 0.76550], + [1168124400000, 0.76930], + [1168210800000, 0.76940], + [1168297200000, 0.76880], + [1168383600000, 0.76780], + [1168470000000, 0.77080], + [1168556400000, 0.77270], + [1168642800000, 0.77490], + [1168729200000, 0.77410], + [1168815600000, 0.77410], + [1168902000000, 0.77320], + [1168988400000, 0.77270], + [1169074800000, 0.77370], + [1169161200000, 0.77240], + [1169247600000, 0.77120], + [1169334000000, 0.7720], + [1169420400000, 0.77210], + [1169506800000, 0.77170], + [1169593200000, 0.77040], + [1169679600000, 0.7690], + [1169766000000, 0.77110], + [1169852400000, 0.7740], + [1169938800000, 0.77450], + [1170025200000, 0.77450], + [1170111600000, 0.7740], + [1170198000000, 0.77160], + [1170284400000, 0.77130], + [1170370800000, 0.76780], + [1170457200000, 0.76880], + [1170543600000, 0.77180], + [1170630000000, 0.77180], + [1170716400000, 0.77280], + [1170802800000, 0.77290], + [1170889200000, 0.76980], + [1170975600000, 0.76850], + [1171062000000, 0.76810], + [1171148400000, 0.7690], + [1171234800000, 0.7690], + [1171321200000, 0.76980], + [1171407600000, 0.76990], + [1171494000000, 0.76510], + [1171580400000, 0.76130], + [1171666800000, 0.76160], + [1171753200000, 0.76140], + [1171839600000, 0.76140], + [1171926000000, 0.76070], + [1172012400000, 0.76020], + [1172098800000, 0.76110], + [1172185200000, 0.76220], + [1172271600000, 0.76150], + [1172358000000, 0.75980], + [1172444400000, 0.75980], + [1172530800000, 0.75920], + [1172617200000, 0.75730], + [1172703600000, 0.75660], + [1172790000000, 0.75670], + [1172876400000, 0.75910], + [1172962800000, 0.75820], + [1173049200000, 0.75850], + [1173135600000, 0.76130], + [1173222000000, 0.76310], + [1173308400000, 0.76150], + [1173394800000, 0.760], + [1173481200000, 0.76130], + [1173567600000, 0.76270], + [1173654000000, 0.76270], + [1173740400000, 0.76080], + [1173826800000, 0.75830], + [1173913200000, 0.75750], + [1173999600000, 0.75620], + [1174086000000, 0.7520], + [1174172400000, 0.75120], + [1174258800000, 0.75120], + [1174345200000, 0.75170], + [1174431600000, 0.7520], + [1174518000000, 0.75110], + [1174604400000, 0.7480], + [1174690800000, 0.75090], + [1174777200000, 0.75310], + [1174860000000, 0.75310], + [1174946400000, 0.75270], + [1175032800000, 0.74980], + [1175119200000, 0.74930], + [1175205600000, 0.75040], + [1175292000000, 0.750], + [1175378400000, 0.74910], + [1175464800000, 0.74910], + [1175551200000, 0.74850], + [1175637600000, 0.74840], + [1175724000000, 0.74920], + [1175810400000, 0.74710], + [1175896800000, 0.74590], + [1175983200000, 0.74770], + [1176069600000, 0.74770], + [1176156000000, 0.74830], + [1176242400000, 0.74580], + [1176328800000, 0.74480], + [1176415200000, 0.7430], + [1176501600000, 0.73990], + [1176588000000, 0.73950], + [1176674400000, 0.73950], + [1176760800000, 0.73780], + [1176847200000, 0.73820], + [1176933600000, 0.73620], + [1177020000000, 0.73550], + [1177106400000, 0.73480], + [1177192800000, 0.73610], + [1177279200000, 0.73610], + [1177365600000, 0.73650], + [1177452000000, 0.73620], + [1177538400000, 0.73310], + [1177624800000, 0.73390], + [1177711200000, 0.73440], + [1177797600000, 0.73270], + [1177884000000, 0.73270], + [1177970400000, 0.73360], + [1178056800000, 0.73330], + [1178143200000, 0.73590], + [1178229600000, 0.73590], + [1178316000000, 0.73720], + [1178402400000, 0.7360], + [1178488800000, 0.7360], + [1178575200000, 0.7350], + [1178661600000, 0.73650], + [1178748000000, 0.73840], + [1178834400000, 0.73950], + [1178920800000, 0.74130], + [1179007200000, 0.73970], + [1179093600000, 0.73960], + [1179180000000, 0.73850], + [1179266400000, 0.73780], + [1179352800000, 0.73660], + [1179439200000, 0.740], + [1179525600000, 0.74110], + [1179612000000, 0.74060], + [1179698400000, 0.74050], + [1179784800000, 0.74140], + [1179871200000, 0.74310], + [1179957600000, 0.74310], + [1180044000000, 0.74380], + [1180130400000, 0.74430], + [1180216800000, 0.74430], + [1180303200000, 0.74430], + [1180389600000, 0.74340], + [1180476000000, 0.74290], + [1180562400000, 0.74420], + [1180648800000, 0.7440], + [1180735200000, 0.74390], + [1180821600000, 0.74370], + [1180908000000, 0.74370], + [1180994400000, 0.74290], + [1181080800000, 0.74030], + [1181167200000, 0.73990], + [1181253600000, 0.74180], + [1181340000000, 0.74680], + [1181426400000, 0.7480], + [1181512800000, 0.7480], + [1181599200000, 0.7490], + [1181685600000, 0.74940], + [1181772000000, 0.75220], + [1181858400000, 0.75150], + [1181944800000, 0.75020], + [1182031200000, 0.74720], + [1182117600000, 0.74720], + [1182204000000, 0.74620], + [1182290400000, 0.74550], + [1182376800000, 0.74490], + [1182463200000, 0.74670], + [1182549600000, 0.74580], + [1182636000000, 0.74270], + [1182722400000, 0.74270], + [1182808800000, 0.7430], + [1182895200000, 0.74290], + [1182981600000, 0.7440], + [1183068000000, 0.7430], + [1183154400000, 0.74220], + [1183240800000, 0.73880], + [1183327200000, 0.73880], + [1183413600000, 0.73690], + [1183500000000, 0.73450], + [1183586400000, 0.73450], + [1183672800000, 0.73450], + [1183759200000, 0.73520], + [1183845600000, 0.73410], + [1183932000000, 0.73410], + [1184018400000, 0.7340], + [1184104800000, 0.73240], + [1184191200000, 0.72720], + [1184277600000, 0.72640], + [1184364000000, 0.72550], + [1184450400000, 0.72580], + [1184536800000, 0.72580], + [1184623200000, 0.72560], + [1184709600000, 0.72570], + [1184796000000, 0.72470], + [1184882400000, 0.72430], + [1184968800000, 0.72440], + [1185055200000, 0.72350], + [1185141600000, 0.72350], + [1185228000000, 0.72350], + [1185314400000, 0.72350], + [1185400800000, 0.72620], + [1185487200000, 0.72880], + [1185573600000, 0.73010], + [1185660000000, 0.73370], + [1185746400000, 0.73370], + [1185832800000, 0.73240], + [1185919200000, 0.72970], + [1186005600000, 0.73170], + [1186092000000, 0.73150], + [1186178400000, 0.72880], + [1186264800000, 0.72630], + [1186351200000, 0.72630], + [1186437600000, 0.72420], + [1186524000000, 0.72530], + [1186610400000, 0.72640], + [1186696800000, 0.7270], + [1186783200000, 0.73120], + [1186869600000, 0.73050], + [1186956000000, 0.73050], + [1187042400000, 0.73180], + [1187128800000, 0.73580], + [1187215200000, 0.74090], + [1187301600000, 0.74540], + [1187388000000, 0.74370], + [1187474400000, 0.74240], + [1187560800000, 0.74240], + [1187647200000, 0.74150], + [1187733600000, 0.74190], + [1187820000000, 0.74140], + [1187906400000, 0.73770], + [1187992800000, 0.73550], + [1188079200000, 0.73150], + [1188165600000, 0.73150], + [1188252000000, 0.7320], + [1188338400000, 0.73320], + [1188424800000, 0.73460], + [1188511200000, 0.73280], + [1188597600000, 0.73230], + [1188684000000, 0.7340], + [1188770400000, 0.7340], + [1188856800000, 0.73360], + [1188943200000, 0.73510], + [1189029600000, 0.73460], + [1189116000000, 0.73210], + [1189202400000, 0.72940], + [1189288800000, 0.72660], + [1189375200000, 0.72660], + [1189461600000, 0.72540], + [1189548000000, 0.72420], + [1189634400000, 0.72130], + [1189720800000, 0.71970], + [1189807200000, 0.72090], + [1189893600000, 0.7210], + [1189980000000, 0.7210], + [1190066400000, 0.7210], + [1190152800000, 0.72090], + [1190239200000, 0.71590], + [1190325600000, 0.71330], + [1190412000000, 0.71050], + [1190498400000, 0.70990], + [1190584800000, 0.70990], + [1190671200000, 0.70930], + [1190757600000, 0.70930], + [1190844000000, 0.70760], + [1190930400000, 0.7070], + [1191016800000, 0.70490], + [1191103200000, 0.70120], + [1191189600000, 0.70110], + [1191276000000, 0.70190], + [1191362400000, 0.70460], + [1191448800000, 0.70630], + [1191535200000, 0.70890], + [1191621600000, 0.70770], + [1191708000000, 0.70770], + [1191794400000, 0.70770], + [1191880800000, 0.70910], + [1191967200000, 0.71180], + [1192053600000, 0.70790], + [1192140000000, 0.70530], + [1192226400000, 0.7050], + [1192312800000, 0.70550], + [1192399200000, 0.70550], + [1192485600000, 0.70450], + [1192572000000, 0.70510], + [1192658400000, 0.70510], + [1192744800000, 0.70170], + [1192831200000, 0.70], + [1192917600000, 0.69950], + [1193004000000, 0.69940], + [1193090400000, 0.70140], + [1193176800000, 0.70360], + [1193263200000, 0.70210], + [1193349600000, 0.70020], + [1193436000000, 0.69670], + [1193522400000, 0.6950], + [1193612400000, 0.6950], + [1193698800000, 0.69390], + [1193785200000, 0.6940], + [1193871600000, 0.69220], + [1193958000000, 0.69190], + [1194044400000, 0.69140], + [1194130800000, 0.68940], + [1194217200000, 0.68910], + [1194303600000, 0.69040], + [1194390000000, 0.6890], + [1194476400000, 0.68340], + [1194562800000, 0.68230], + [1194649200000, 0.68070], + [1194735600000, 0.68150], + [1194822000000, 0.68150], + [1194908400000, 0.68470], + [1194994800000, 0.68590], + [1195081200000, 0.68220], + [1195167600000, 0.68270], + [1195254000000, 0.68370], + [1195340400000, 0.68230], + [1195426800000, 0.68220], + [1195513200000, 0.68220], + [1195599600000, 0.67920], + [1195686000000, 0.67460], + [1195772400000, 0.67350], + [1195858800000, 0.67310], + [1195945200000, 0.67420], + [1196031600000, 0.67440], + [1196118000000, 0.67390], + [1196204400000, 0.67310], + [1196290800000, 0.67610], + [1196377200000, 0.67610], + [1196463600000, 0.67850], + [1196550000000, 0.68180], + [1196636400000, 0.68360], + [1196722800000, 0.68230], + [1196809200000, 0.68050], + [1196895600000, 0.67930], + [1196982000000, 0.68490], + [1197068400000, 0.68330], + [1197154800000, 0.68250], + [1197241200000, 0.68250], + [1197327600000, 0.68160], + [1197414000000, 0.67990], + [1197500400000, 0.68130], + [1197586800000, 0.68090], + [1197673200000, 0.68680], + [1197759600000, 0.69330], + [1197846000000, 0.69330], + [1197932400000, 0.69450], + [1198018800000, 0.69440], + [1198105200000, 0.69460], + [1198191600000, 0.69640], + [1198278000000, 0.69650], + [1198364400000, 0.69560], + [1198450800000, 0.69560], + [1198537200000, 0.6950], + [1198623600000, 0.69480], + [1198710000000, 0.69280], + [1198796400000, 0.68870], + [1198882800000, 0.68240], + [1198969200000, 0.67940], + [1199055600000, 0.67940], + [1199142000000, 0.68030], + [1199228400000, 0.68550], + [1199314800000, 0.68240], + [1199401200000, 0.67910], + [1199487600000, 0.67830], + [1199574000000, 0.67850], + [1199660400000, 0.67850], + [1199746800000, 0.67970], + [1199833200000, 0.680], + [1199919600000, 0.68030], + [1200006000000, 0.68050], + [1200092400000, 0.6760], + [1200178800000, 0.6770], + [1200265200000, 0.6770], + [1200351600000, 0.67360], + [1200438000000, 0.67260], + [1200524400000, 0.67640], + [1200610800000, 0.68210], + [1200697200000, 0.68310], + [1200783600000, 0.68420], + [1200870000000, 0.68420], + [1200956400000, 0.68870], + [1201042800000, 0.69030], + [1201129200000, 0.68480], + [1201215600000, 0.68240], + [1201302000000, 0.67880], + [1201388400000, 0.68140], + [1201474800000, 0.68140], + [1201561200000, 0.67970], + [1201647600000, 0.67690], + [1201734000000, 0.67650], + [1201820400000, 0.67330], + [1201906800000, 0.67290], + [1201993200000, 0.67580], + [1202079600000, 0.67580], + [1202166000000, 0.6750], + [1202252400000, 0.6780], + [1202338800000, 0.68330], + [1202425200000, 0.68560], + [1202511600000, 0.69030], + [1202598000000, 0.68960], + [1202684400000, 0.68960], + [1202770800000, 0.68820], + [1202857200000, 0.68790], + [1202943600000, 0.68620], + [1203030000000, 0.68520], + [1203116400000, 0.68230], + [1203202800000, 0.68130], + [1203289200000, 0.68130], + [1203375600000, 0.68220], + [1203462000000, 0.68020], + [1203548400000, 0.68020], + [1203634800000, 0.67840], + [1203721200000, 0.67480], + [1203807600000, 0.67470], + [1203894000000, 0.67470], + [1203980400000, 0.67480], + [1204066800000, 0.67330], + [1204153200000, 0.6650], + [1204239600000, 0.66110], + [1204326000000, 0.65830], + [1204412400000, 0.6590], + [1204498800000, 0.6590], + [1204585200000, 0.65810], + [1204671600000, 0.65780], + [1204758000000, 0.65740], + [1204844400000, 0.65320], + [1204930800000, 0.65020], + [1205017200000, 0.65140], + [1205103600000, 0.65140], + [1205190000000, 0.65070], + [1205276400000, 0.6510], + [1205362800000, 0.64890], + [1205449200000, 0.64240], + [1205535600000, 0.64060], + [1205622000000, 0.63820], + [1205708400000, 0.63820], + [1205794800000, 0.63410], + [1205881200000, 0.63440], + [1205967600000, 0.63780], + [1206054000000, 0.64390], + [1206140400000, 0.64780], + [1206226800000, 0.64810], + [1206313200000, 0.64810], + [1206399600000, 0.64940], + [1206486000000, 0.64380], + [1206572400000, 0.63770], + [1206658800000, 0.63290], + [1206745200000, 0.63360], + [1206831600000, 0.63330], + [1206914400000, 0.63330], + [1207000800000, 0.6330], + [1207087200000, 0.63710], + [1207173600000, 0.64030], + [1207260000000, 0.63960], + [1207346400000, 0.63640], + [1207432800000, 0.63560], + [1207519200000, 0.63560], + [1207605600000, 0.63680], + [1207692000000, 0.63570], + [1207778400000, 0.63540], + [1207864800000, 0.6320], + [1207951200000, 0.63320], + [1208037600000, 0.63280], + [1208124000000, 0.63310], + [1208210400000, 0.63420], + [1208296800000, 0.63210], + [1208383200000, 0.63020], + [1208469600000, 0.62780], + [1208556000000, 0.63080], + [1208642400000, 0.63240], + [1208728800000, 0.63240], + [1208815200000, 0.63070], + [1208901600000, 0.62770], + [1208988000000, 0.62690], + [1209074400000, 0.63350], + [1209160800000, 0.63920], + [1209247200000, 0.640], + [1209333600000, 0.64010], + [1209420000000, 0.63960], + [1209506400000, 0.64070], + [1209592800000, 0.64230], + [1209679200000, 0.64290], + [1209765600000, 0.64720], + [1209852000000, 0.64850], + [1209938400000, 0.64860], + [1210024800000, 0.64670], + [1210111200000, 0.64440], + [1210197600000, 0.64670], + [1210284000000, 0.65090], + [1210370400000, 0.64780], + [1210456800000, 0.64610], + [1210543200000, 0.64610], + [1210629600000, 0.64680], + [1210716000000, 0.64490], + [1210802400000, 0.6470], + [1210888800000, 0.64610], + [1210975200000, 0.64520], + [1211061600000, 0.64220], + [1211148000000, 0.64220], + [1211234400000, 0.64250], + [1211320800000, 0.64140], + [1211407200000, 0.63660], + [1211493600000, 0.63460], + [1211580000000, 0.6350], + [1211666400000, 0.63460], + [1211752800000, 0.63460], + [1211839200000, 0.63430], + [1211925600000, 0.63460], + [1212012000000, 0.63790], + [1212098400000, 0.64160], + [1212184800000, 0.64420], + [1212271200000, 0.64310], + [1212357600000, 0.64310], + [1212444000000, 0.64350], + [1212530400000, 0.6440], + [1212616800000, 0.64730], + [1212703200000, 0.64690], + [1212789600000, 0.63860], + [1212876000000, 0.63560], + [1212962400000, 0.6340], + [1213048800000, 0.63460], + [1213135200000, 0.6430], + [1213221600000, 0.64520], + [1213308000000, 0.64670], + [1213394400000, 0.65060], + [1213480800000, 0.65040], + [1213567200000, 0.65030], + [1213653600000, 0.64810], + [1213740000000, 0.64510], + [1213826400000, 0.6450], + [1213912800000, 0.64410], + [1213999200000, 0.64140], + [1214085600000, 0.64090], + [1214172000000, 0.64090], + [1214258400000, 0.64280], + [1214344800000, 0.64310], + [1214431200000, 0.64180], + [1214517600000, 0.63710], + [1214604000000, 0.63490], + [1214690400000, 0.63330], + [1214776800000, 0.63340], + [1214863200000, 0.63380], + [1214949600000, 0.63420], + [1215036000000, 0.6320], + [1215122400000, 0.63180], + [1215208800000, 0.6370], + [1215295200000, 0.63680], + [1215381600000, 0.63680], + [1215468000000, 0.63830], + [1215554400000, 0.63710], + [1215640800000, 0.63710], + [1215727200000, 0.63550], + [1215813600000, 0.6320], + [1215900000000, 0.62770], + [1215986400000, 0.62760], + [1216072800000, 0.62910], + [1216159200000, 0.62740], + [1216245600000, 0.62930], + [1216332000000, 0.63110], + [1216418400000, 0.6310], + [1216504800000, 0.63120], + [1216591200000, 0.63120], + [1216677600000, 0.63040], + [1216764000000, 0.62940], + [1216850400000, 0.63480], + [1216936800000, 0.63780], + [1217023200000, 0.63680], + [1217109600000, 0.63680], + [1217196000000, 0.63680], + [1217282400000, 0.6360], + [1217368800000, 0.6370], + [1217455200000, 0.64180], + [1217541600000, 0.64110], + [1217628000000, 0.64350], + [1217714400000, 0.64270], + [1217800800000, 0.64270], + [1217887200000, 0.64190], + [1217973600000, 0.64460], + [1218060000000, 0.64680], + [1218146400000, 0.64870], + [1218232800000, 0.65940], + [1218319200000, 0.66660], + [1218405600000, 0.66660], + [1218492000000, 0.66780], + [1218578400000, 0.67120], + [1218664800000, 0.67050], + [1218751200000, 0.67180], + [1218837600000, 0.67840], + [1218924000000, 0.68110], + [1219010400000, 0.68110], + [1219096800000, 0.67940], + [1219183200000, 0.68040], + [1219269600000, 0.67810], + [1219356000000, 0.67560], + [1219442400000, 0.67350], + [1219528800000, 0.67630], + [1219615200000, 0.67620], + [1219701600000, 0.67770], + [1219788000000, 0.68150], + [1219874400000, 0.68020], + [1219960800000, 0.6780], + [1220047200000, 0.67960], + [1220133600000, 0.68170], + [1220220000000, 0.68170], + [1220306400000, 0.68320], + [1220392800000, 0.68770], + [1220479200000, 0.69120], + [1220565600000, 0.69140], + [1220652000000, 0.70090], + [1220738400000, 0.70120], + [1220824800000, 0.7010], + [1220911200000, 0.70050] + ]; + + function euroFormatter(v, axis) { + return v.toFixed(axis.tickDecimals) + "€"; + } + + function doPlot(position) { + $.plot($("#flot-multiple-axes-chart"), [{ + data: oilprices, + label: "Oil price ($)" + }, { + data: exchangerates, + label: "USD/EUR exchange rate", + yaxis: 2 + }], { + xaxes: [{ + mode: 'time' + }], + yaxes: [{ + min: 0 + }, { + // align if we are to the right + alignTicksWithAxis: position == "right" ? 1 : null, + position: position, + tickFormatter: euroFormatter + }], + legend: { + position: 'sw' + }, + grid: { + hoverable: true //IMPORTANT! this is needed for tooltip to work + }, + tooltip: true, + tooltipOpts: { + content: "%s for %x was %y", + xDateFormat: "%y-%0m-%0d", + + onHover: function(flotItem, $tooltipEl) { + // console.log(flotItem, $tooltipEl); + } + } + + }); + } + + doPlot("right"); + + $("button").click(function() { + doPlot($(this).text()); + }); +}); + +// Flot Chart Dynamic Chart + +$(function() { + + var container = $("#flot-moving-line-chart"); + + // Determine how many data points to keep based on the placeholder's initial size; + // this gives us a nice high-res plot while avoiding more than one point per pixel. + + var maximum = container.outerWidth() / 2 || 300; + + // + + var data = []; + + function getRandomData() { + + if (data.length) { + data = data.slice(1); + } + + while (data.length < maximum) { + var previous = data.length ? data[data.length - 1] : 50; + var y = previous + Math.random() * 10 - 5; + data.push(y < 0 ? 0 : y > 100 ? 100 : y); + } + + // zip the generated y values with the x values + + var res = []; + for (var i = 0; i < data.length; ++i) { + res.push([i, data[i]]) + } + + return res; + } + + // + + series = [{ + data: getRandomData(), + lines: { + fill: true + } + }]; + + // + + var plot = $.plot(container, series, { + grid: { + borderWidth: 1, + minBorderMargin: 20, + labelMargin: 10, + backgroundColor: { + colors: ["#fff", "#e4f4f4"] + }, + margin: { + top: 8, + bottom: 20, + left: 20 + }, + markings: function(axes) { + var markings = []; + var xaxis = axes.xaxis; + for (var x = Math.floor(xaxis.min); x < xaxis.max; x += xaxis.tickSize * 2) { + markings.push({ + xaxis: { + from: x, + to: x + xaxis.tickSize + }, + color: "rgba(232, 232, 255, 0.2)" + }); + } + return markings; + } + }, + xaxis: { + tickFormatter: function() { + return ""; + } + }, + yaxis: { + min: 0, + max: 110 + }, + legend: { + show: true + } + }); + + // Update the random dataset at 25FPS for a smoothly-animating chart + + setInterval(function updateRandom() { + series[0].data = getRandomData(); + plot.setData(series); + plot.draw(); + }, 40); + +}); + +// Flot Chart Bar Graph + +$(function() { + + var barOptions = { + series: { + bars: { + show: true, + barWidth: 43200000 + } + }, + xaxis: { + mode: "time", + timeformat: "%m/%d", + minTickSize: [1, "day"] + }, + grid: { + hoverable: true + }, + legend: { + show: false + }, + tooltip: true, + tooltipOpts: { + content: "x: %x, y: %y" + } + }; + var barData = { + label: "bar", + data: [ + [1354521600000, 1000], + [1355040000000, 2000], + [1355223600000, 3000], + [1355306400000, 4000], + [1355487300000, 5000], + [1355571900000, 6000] + ] + }; + $.plot($("#flot-bar-chart"), [barData], barOptions); + +}); diff --git a/theme/bootstrap/views/js/plugins/flot/jquery.flot.js b/theme/bootstrap/views/js/plugins/flot/jquery.flot.js new file mode 100644 index 0000000..aabc544 --- /dev/null +++ b/theme/bootstrap/views/js/plugins/flot/jquery.flot.js @@ -0,0 +1,2599 @@ +/*! Javascript plotting library for jQuery, v. 0.7. + * + * Released under the MIT license by IOLA, December 2007. + * + */ + +// first an inline dependency, jquery.colorhelpers.js, we inline it here +// for convenience + +/* Plugin for jQuery for working with colors. + * + * Version 1.1. + * + * Inspiration from jQuery color animation plugin by John Resig. + * + * Released under the MIT license by Ole Laursen, October 2009. + * + * Examples: + * + * $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString() + * var c = $.color.extract($("#mydiv"), 'background-color'); + * console.log(c.r, c.g, c.b, c.a); + * $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)" + * + * Note that .scale() and .add() return the same modified object + * instead of making a new one. + * + * V. 1.1: Fix error handling so e.g. parsing an empty string does + * produce a color rather than just crashing. + */ +(function(B){B.color={};B.color.make=function(F,E,C,D){var G={};G.r=F||0;G.g=E||0;G.b=C||0;G.a=D!=null?D:1;G.add=function(J,I){for(var H=0;H<J.length;++H){G[J.charAt(H)]+=I}return G.normalize()};G.scale=function(J,I){for(var H=0;H<J.length;++H){G[J.charAt(H)]*=I}return G.normalize()};G.toString=function(){if(G.a>=1){return"rgb("+[G.r,G.g,G.b].join(",")+")"}else{return"rgba("+[G.r,G.g,G.b,G.a].join(",")+")"}};G.normalize=function(){function H(J,K,I){return K<J?J:(K>I?I:K)}G.r=H(0,parseInt(G.r),255);G.g=H(0,parseInt(G.g),255);G.b=H(0,parseInt(G.b),255);G.a=H(0,G.a,1);return G};G.clone=function(){return B.color.make(G.r,G.b,G.g,G.a)};return G.normalize()};B.color.extract=function(D,C){var E;do{E=D.css(C).toLowerCase();if(E!=""&&E!="transparent"){break}D=D.parent()}while(!B.nodeName(D.get(0),"body"));if(E=="rgba(0, 0, 0, 0)"){E="transparent"}return B.color.parse(E)};B.color.parse=function(F){var E,C=B.color.make;if(E=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10))}if(E=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(F)){return C(parseInt(E[1],10),parseInt(E[2],10),parseInt(E[3],10),parseFloat(E[4]))}if(E=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55)}if(E=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(F)){return C(parseFloat(E[1])*2.55,parseFloat(E[2])*2.55,parseFloat(E[3])*2.55,parseFloat(E[4]))}if(E=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(F)){return C(parseInt(E[1],16),parseInt(E[2],16),parseInt(E[3],16))}if(E=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(F)){return C(parseInt(E[1]+E[1],16),parseInt(E[2]+E[2],16),parseInt(E[3]+E[3],16))}var D=B.trim(F).toLowerCase();if(D=="transparent"){return C(255,255,255,0)}else{E=A[D]||[0,0,0];return C(E[0],E[1],E[2])}};var A={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery); + +// the actual Flot code +(function($) { + function Plot(placeholder, data_, options_, plugins) { + // data is on the form: + // [ series1, series2 ... ] + // where series is either just the data as [ [x1, y1], [x2, y2], ... ] + // or { data: [ [x1, y1], [x2, y2], ... ], label: "some label", ... } + + var series = [], + options = { + // the color theme used for graphs + colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"], + legend: { + show: true, + noColumns: 1, // number of colums in legend table + labelFormatter: null, // fn: string -> string + labelBoxBorderColor: "#ccc", // border color for the little label boxes + container: null, // container (as jQuery object) to put legend in, null means default on top of graph + position: "ne", // position of default legend container within plot + margin: 5, // distance from grid edge to default legend container within plot + backgroundColor: null, // null means auto-detect + backgroundOpacity: 0.85 // set to 0 to avoid background + }, + xaxis: { + show: null, // null = auto-detect, true = always, false = never + position: "bottom", // or "top" + mode: null, // null or "time" + color: null, // base color, labels, ticks + tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)" + transform: null, // null or f: number -> number to transform axis + inverseTransform: null, // if transform is set, this should be the inverse function + min: null, // min. value to show, null means set automatically + max: null, // max. value to show, null means set automatically + autoscaleMargin: null, // margin in % to add if auto-setting min/max + ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks + tickFormatter: null, // fn: number -> string + labelWidth: null, // size of tick labels in pixels + labelHeight: null, + reserveSpace: null, // whether to reserve space even if axis isn't shown + tickLength: null, // size in pixels of ticks, or "full" for whole line + alignTicksWithAxis: null, // axis number or null for no sync + + // mode specific options + tickDecimals: null, // no. of decimals, null means auto + tickSize: null, // number or [number, "unit"] + minTickSize: null, // number or [number, "unit"] + monthNames: null, // list of names of months + timeformat: null, // format string to use + twelveHourClock: false // 12 or 24 time in time mode + }, + yaxis: { + autoscaleMargin: 0.02, + position: "left" // or "right" + }, + xaxes: [], + yaxes: [], + series: { + points: { + show: false, + radius: 3, + lineWidth: 2, // in pixels + fill: true, + fillColor: "#ffffff", + symbol: "circle" // or callback + }, + lines: { + // we don't put in show: false so we can see + // whether lines were actively disabled + lineWidth: 2, // in pixels + fill: false, + fillColor: null, + steps: false + }, + bars: { + show: false, + lineWidth: 2, // in pixels + barWidth: 1, // in units of the x axis + fill: true, + fillColor: null, + align: "left", // or "center" + horizontal: false + }, + shadowSize: 3 + }, + grid: { + show: true, + aboveData: false, + color: "#545454", // primary color used for outline and labels + backgroundColor: null, // null for transparent, else color + borderColor: null, // set if different from the grid color + tickColor: null, // color for the ticks, e.g. "rgba(0,0,0,0.15)" + labelMargin: 5, // in pixels + axisMargin: 8, // in pixels + borderWidth: 2, // in pixels + minBorderMargin: null, // in pixels, null means taken from points radius + markings: null, // array of ranges or fn: axes -> array of ranges + markingsColor: "#f4f4f4", + markingsLineWidth: 2, + // interactive stuff + clickable: false, + hoverable: false, + autoHighlight: true, // highlight in case mouse is near + mouseActiveRadius: 10 // how far the mouse can be away to activate an item + }, + hooks: {} + }, + canvas = null, // the canvas for the plot itself + overlay = null, // canvas for interactive stuff on top of plot + eventHolder = null, // jQuery object that events should be bound to + ctx = null, octx = null, + xaxes = [], yaxes = [], + plotOffset = { left: 0, right: 0, top: 0, bottom: 0}, + canvasWidth = 0, canvasHeight = 0, + plotWidth = 0, plotHeight = 0, + hooks = { + processOptions: [], + processRawData: [], + processDatapoints: [], + drawSeries: [], + draw: [], + bindEvents: [], + drawOverlay: [], + shutdown: [] + }, + plot = this; + + // public functions + plot.setData = setData; + plot.setupGrid = setupGrid; + plot.draw = draw; + plot.getPlaceholder = function() { return placeholder; }; + plot.getCanvas = function() { return canvas; }; + plot.getPlotOffset = function() { return plotOffset; }; + plot.width = function () { return plotWidth; }; + plot.height = function () { return plotHeight; }; + plot.offset = function () { + var o = eventHolder.offset(); + o.left += plotOffset.left; + o.top += plotOffset.top; + return o; + }; + plot.getData = function () { return series; }; + plot.getAxes = function () { + var res = {}, i; + $.each(xaxes.concat(yaxes), function (_, axis) { + if (axis) + res[axis.direction + (axis.n != 1 ? axis.n : "") + "axis"] = axis; + }); + return res; + }; + plot.getXAxes = function () { return xaxes; }; + plot.getYAxes = function () { return yaxes; }; + plot.c2p = canvasToAxisCoords; + plot.p2c = axisToCanvasCoords; + plot.getOptions = function () { return options; }; + plot.highlight = highlight; + plot.unhighlight = unhighlight; + plot.triggerRedrawOverlay = triggerRedrawOverlay; + plot.pointOffset = function(point) { + return { + left: parseInt(xaxes[axisNumber(point, "x") - 1].p2c(+point.x) + plotOffset.left), + top: parseInt(yaxes[axisNumber(point, "y") - 1].p2c(+point.y) + plotOffset.top) + }; + }; + plot.shutdown = shutdown; + plot.resize = function () { + getCanvasDimensions(); + resizeCanvas(canvas); + resizeCanvas(overlay); + }; + + // public attributes + plot.hooks = hooks; + + // initialize + initPlugins(plot); + parseOptions(options_); + setupCanvases(); + setData(data_); + setupGrid(); + draw(); + bindEvents(); + + + function executeHooks(hook, args) { + args = [plot].concat(args); + for (var i = 0; i < hook.length; ++i) + hook[i].apply(this, args); + } + + function initPlugins() { + for (var i = 0; i < plugins.length; ++i) { + var p = plugins[i]; + p.init(plot); + if (p.options) + $.extend(true, options, p.options); + } + } + + function parseOptions(opts) { + var i; + + $.extend(true, options, opts); + + if (options.xaxis.color == null) + options.xaxis.color = options.grid.color; + if (options.yaxis.color == null) + options.yaxis.color = options.grid.color; + + if (options.xaxis.tickColor == null) // backwards-compatibility + options.xaxis.tickColor = options.grid.tickColor; + if (options.yaxis.tickColor == null) // backwards-compatibility + options.yaxis.tickColor = options.grid.tickColor; + + if (options.grid.borderColor == null) + options.grid.borderColor = options.grid.color; + if (options.grid.tickColor == null) + options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString(); + + // fill in defaults in axes, copy at least always the + // first as the rest of the code assumes it'll be there + for (i = 0; i < Math.max(1, options.xaxes.length); ++i) + options.xaxes[i] = $.extend(true, {}, options.xaxis, options.xaxes[i]); + for (i = 0; i < Math.max(1, options.yaxes.length); ++i) + options.yaxes[i] = $.extend(true, {}, options.yaxis, options.yaxes[i]); + + // backwards compatibility, to be removed in future + if (options.xaxis.noTicks && options.xaxis.ticks == null) + options.xaxis.ticks = options.xaxis.noTicks; + if (options.yaxis.noTicks && options.yaxis.ticks == null) + options.yaxis.ticks = options.yaxis.noTicks; + if (options.x2axis) { + options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis); + options.xaxes[1].position = "top"; + } + if (options.y2axis) { + options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis); + options.yaxes[1].position = "right"; + } + if (options.grid.coloredAreas) + options.grid.markings = options.grid.coloredAreas; + if (options.grid.coloredAreasColor) + options.grid.markingsColor = options.grid.coloredAreasColor; + if (options.lines) + $.extend(true, options.series.lines, options.lines); + if (options.points) + $.extend(true, options.series.points, options.points); + if (options.bars) + $.extend(true, options.series.bars, options.bars); + if (options.shadowSize != null) + options.series.shadowSize = options.shadowSize; + + // save options on axes for future reference + for (i = 0; i < options.xaxes.length; ++i) + getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i]; + for (i = 0; i < options.yaxes.length; ++i) + getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i]; + + // add hooks from options + for (var n in hooks) + if (options.hooks[n] && options.hooks[n].length) + hooks[n] = hooks[n].concat(options.hooks[n]); + + executeHooks(hooks.processOptions, [options]); + } + + function setData(d) { + series = parseData(d); + fillInSeriesOptions(); + processData(); + } + + function parseData(d) { + var res = []; + for (var i = 0; i < d.length; ++i) { + var s = $.extend(true, {}, options.series); + + if (d[i].data != null) { + s.data = d[i].data; // move the data instead of deep-copy + delete d[i].data; + + $.extend(true, s, d[i]); + + d[i].data = s.data; + } + else + s.data = d[i]; + res.push(s); + } + + return res; + } + + function axisNumber(obj, coord) { + var a = obj[coord + "axis"]; + if (typeof a == "object") // if we got a real axis, extract number + a = a.n; + if (typeof a != "number") + a = 1; // default to first axis + return a; + } + + function allAxes() { + // return flat array without annoying null entries + return $.grep(xaxes.concat(yaxes), function (a) { return a; }); + } + + function canvasToAxisCoords(pos) { + // return an object with x/y corresponding to all used axes + var res = {}, i, axis; + for (i = 0; i < xaxes.length; ++i) { + axis = xaxes[i]; + if (axis && axis.used) + res["x" + axis.n] = axis.c2p(pos.left); + } + + for (i = 0; i < yaxes.length; ++i) { + axis = yaxes[i]; + if (axis && axis.used) + res["y" + axis.n] = axis.c2p(pos.top); + } + + if (res.x1 !== undefined) + res.x = res.x1; + if (res.y1 !== undefined) + res.y = res.y1; + + return res; + } + + function axisToCanvasCoords(pos) { + // get canvas coords from the first pair of x/y found in pos + var res = {}, i, axis, key; + + for (i = 0; i < xaxes.length; ++i) { + axis = xaxes[i]; + if (axis && axis.used) { + key = "x" + axis.n; + if (pos[key] == null && axis.n == 1) + key = "x"; + + if (pos[key] != null) { + res.left = axis.p2c(pos[key]); + break; + } + } + } + + for (i = 0; i < yaxes.length; ++i) { + axis = yaxes[i]; + if (axis && axis.used) { + key = "y" + axis.n; + if (pos[key] == null && axis.n == 1) + key = "y"; + + if (pos[key] != null) { + res.top = axis.p2c(pos[key]); + break; + } + } + } + + return res; + } + + function getOrCreateAxis(axes, number) { + if (!axes[number - 1]) + axes[number - 1] = { + n: number, // save the number for future reference + direction: axes == xaxes ? "x" : "y", + options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis) + }; + + return axes[number - 1]; + } + + function fillInSeriesOptions() { + var i; + + // collect what we already got of colors + var neededColors = series.length, + usedColors = [], + assignedColors = []; + for (i = 0; i < series.length; ++i) { + var sc = series[i].color; + if (sc != null) { + --neededColors; + if (typeof sc == "number") + assignedColors.push(sc); + else + usedColors.push($.color.parse(series[i].color)); + } + } + + // we might need to generate more colors if higher indices + // are assigned + for (i = 0; i < assignedColors.length; ++i) { + neededColors = Math.max(neededColors, assignedColors[i] + 1); + } + + // produce colors as needed + var colors = [], variation = 0; + i = 0; + while (colors.length < neededColors) { + var c; + if (options.colors.length == i) // check degenerate case + c = $.color.make(100, 100, 100); + else + c = $.color.parse(options.colors[i]); + + // vary color if needed + var sign = variation % 2 == 1 ? -1 : 1; + c.scale('rgb', 1 + sign * Math.ceil(variation / 2) * 0.2) + + // FIXME: if we're getting to close to something else, + // we should probably skip this one + colors.push(c); + + ++i; + if (i >= options.colors.length) { + i = 0; + ++variation; + } + } + + // fill in the options + var colori = 0, s; + for (i = 0; i < series.length; ++i) { + s = series[i]; + + // assign colors + if (s.color == null) { + s.color = colors[colori].toString(); + ++colori; + } + else if (typeof s.color == "number") + s.color = colors[s.color].toString(); + + // turn on lines automatically in case nothing is set + if (s.lines.show == null) { + var v, show = true; + for (v in s) + if (s[v] && s[v].show) { + show = false; + break; + } + if (show) + s.lines.show = true; + } + + // setup axes + s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, "x")); + s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, "y")); + } + } + + function processData() { + var topSentry = Number.POSITIVE_INFINITY, + bottomSentry = Number.NEGATIVE_INFINITY, + fakeInfinity = Number.MAX_VALUE, + i, j, k, m, length, + s, points, ps, x, y, axis, val, f, p; + + function updateAxis(axis, min, max) { + if (min < axis.datamin && min != -fakeInfinity) + axis.datamin = min; + if (max > axis.datamax && max != fakeInfinity) + axis.datamax = max; + } + + $.each(allAxes(), function (_, axis) { + // init axis + axis.datamin = topSentry; + axis.datamax = bottomSentry; + axis.used = false; + }); + + for (i = 0; i < series.length; ++i) { + s = series[i]; + s.datapoints = { points: [] }; + + executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]); + } + + // first pass: clean and copy data + for (i = 0; i < series.length; ++i) { + s = series[i]; + + var data = s.data, format = s.datapoints.format; + + if (!format) { + format = []; + // find out how to copy + format.push({ x: true, number: true, required: true }); + format.push({ y: true, number: true, required: true }); + + if (s.bars.show || (s.lines.show && s.lines.fill)) { + format.push({ y: true, number: true, required: false, defaultValue: 0 }); + if (s.bars.horizontal) { + delete format[format.length - 1].y; + format[format.length - 1].x = true; + } + } + + s.datapoints.format = format; + } + + if (s.datapoints.pointsize != null) + continue; // already filled in + + s.datapoints.pointsize = format.length; + + ps = s.datapoints.pointsize; + points = s.datapoints.points; + + insertSteps = s.lines.show && s.lines.steps; + s.xaxis.used = s.yaxis.used = true; + + for (j = k = 0; j < data.length; ++j, k += ps) { + p = data[j]; + + var nullify = p == null; + if (!nullify) { + for (m = 0; m < ps; ++m) { + val = p[m]; + f = format[m]; + + if (f) { + if (f.number && val != null) { + val = +val; // convert to number + if (isNaN(val)) + val = null; + else if (val == Infinity) + val = fakeInfinity; + else if (val == -Infinity) + val = -fakeInfinity; + } + + if (val == null) { + if (f.required) + nullify = true; + + if (f.defaultValue != null) + val = f.defaultValue; + } + } + + points[k + m] = val; + } + } + + if (nullify) { + for (m = 0; m < ps; ++m) { + val = points[k + m]; + if (val != null) { + f = format[m]; + // extract min/max info + if (f.x) + updateAxis(s.xaxis, val, val); + if (f.y) + updateAxis(s.yaxis, val, val); + } + points[k + m] = null; + } + } + else { + // a little bit of line specific stuff that + // perhaps shouldn't be here, but lacking + // better means... + if (insertSteps && k > 0 + && points[k - ps] != null + && points[k - ps] != points[k] + && points[k - ps + 1] != points[k + 1]) { + // copy the point to make room for a middle point + for (m = 0; m < ps; ++m) + points[k + ps + m] = points[k + m]; + + // middle point has same y + points[k + 1] = points[k - ps + 1]; + + // we've added a point, better reflect that + k += ps; + } + } + } + } + + // give the hooks a chance to run + for (i = 0; i < series.length; ++i) { + s = series[i]; + + executeHooks(hooks.processDatapoints, [ s, s.datapoints]); + } + + // second pass: find datamax/datamin for auto-scaling + for (i = 0; i < series.length; ++i) { + s = series[i]; + points = s.datapoints.points, + ps = s.datapoints.pointsize; + + var xmin = topSentry, ymin = topSentry, + xmax = bottomSentry, ymax = bottomSentry; + + for (j = 0; j < points.length; j += ps) { + if (points[j] == null) + continue; + + for (m = 0; m < ps; ++m) { + val = points[j + m]; + f = format[m]; + if (!f || val == fakeInfinity || val == -fakeInfinity) + continue; + + if (f.x) { + if (val < xmin) + xmin = val; + if (val > xmax) + xmax = val; + } + if (f.y) { + if (val < ymin) + ymin = val; + if (val > ymax) + ymax = val; + } + } + } + + if (s.bars.show) { + // make sure we got room for the bar on the dancing floor + var delta = s.bars.align == "left" ? 0 : -s.bars.barWidth/2; + if (s.bars.horizontal) { + ymin += delta; + ymax += delta + s.bars.barWidth; + } + else { + xmin += delta; + xmax += delta + s.bars.barWidth; + } + } + + updateAxis(s.xaxis, xmin, xmax); + updateAxis(s.yaxis, ymin, ymax); + } + + $.each(allAxes(), function (_, axis) { + if (axis.datamin == topSentry) + axis.datamin = null; + if (axis.datamax == bottomSentry) + axis.datamax = null; + }); + } + + function makeCanvas(skipPositioning, cls) { + var c = document.createElement('canvas'); + c.className = cls; + c.width = canvasWidth; + c.height = canvasHeight; + + if (!skipPositioning) + $(c).css({ position: 'absolute', left: 0, top: 0 }); + + $(c).appendTo(placeholder); + + if (!c.getContext) // excanvas hack + c = window.G_vmlCanvasManager.initElement(c); + + // used for resetting in case we get replotted + c.getContext("2d").save(); + + return c; + } + + function getCanvasDimensions() { + canvasWidth = placeholder.width(); + canvasHeight = placeholder.height(); + + if (canvasWidth <= 0 || canvasHeight <= 0) + throw "Invalid dimensions for plot, width = " + canvasWidth + ", height = " + canvasHeight; + } + + function resizeCanvas(c) { + // resizing should reset the state (excanvas seems to be + // buggy though) + if (c.width != canvasWidth) + c.width = canvasWidth; + + if (c.height != canvasHeight) + c.height = canvasHeight; + + // so try to get back to the initial state (even if it's + // gone now, this should be safe according to the spec) + var cctx = c.getContext("2d"); + cctx.restore(); + + // and save again + cctx.save(); + } + + function setupCanvases() { + var reused, + existingCanvas = placeholder.children("canvas.base"), + existingOverlay = placeholder.children("canvas.overlay"); + + if (existingCanvas.length == 0 || existingOverlay == 0) { + // init everything + + placeholder.html(""); // make sure placeholder is clear + + placeholder.css({ padding: 0 }); // padding messes up the positioning + + if (placeholder.css("position") == 'static') + placeholder.css("position", "relative"); // for positioning labels and overlay + + getCanvasDimensions(); + + canvas = makeCanvas(true, "base"); + overlay = makeCanvas(false, "overlay"); // overlay canvas for interactive features + + reused = false; + } + else { + // reuse existing elements + + canvas = existingCanvas.get(0); + overlay = existingOverlay.get(0); + + reused = true; + } + + ctx = canvas.getContext("2d"); + octx = overlay.getContext("2d"); + + // we include the canvas in the event holder too, because IE 7 + // sometimes has trouble with the stacking order + eventHolder = $([overlay, canvas]); + + if (reused) { + // run shutdown in the old plot object + placeholder.data("plot").shutdown(); + + // reset reused canvases + plot.resize(); + + // make sure overlay pixels are cleared (canvas is cleared when we redraw) + octx.clearRect(0, 0, canvasWidth, canvasHeight); + + // then whack any remaining obvious garbage left + eventHolder.unbind(); + placeholder.children().not([canvas, overlay]).remove(); + } + + // save in case we get replotted + placeholder.data("plot", plot); + } + + function bindEvents() { + // bind events + if (options.grid.hoverable) { + eventHolder.mousemove(onMouseMove); + eventHolder.mouseleave(onMouseLeave); + } + + if (options.grid.clickable) + eventHolder.click(onClick); + + executeHooks(hooks.bindEvents, [eventHolder]); + } + + function shutdown() { + if (redrawTimeout) + clearTimeout(redrawTimeout); + + eventHolder.unbind("mousemove", onMouseMove); + eventHolder.unbind("mouseleave", onMouseLeave); + eventHolder.unbind("click", onClick); + + executeHooks(hooks.shutdown, [eventHolder]); + } + + function setTransformationHelpers(axis) { + // set helper functions on the axis, assumes plot area + // has been computed already + + function identity(x) { return x; } + + var s, m, t = axis.options.transform || identity, + it = axis.options.inverseTransform; + + // precompute how much the axis is scaling a point + // in canvas space + if (axis.direction == "x") { + s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min)); + m = Math.min(t(axis.max), t(axis.min)); + } + else { + s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min)); + s = -s; + m = Math.max(t(axis.max), t(axis.min)); + } + + // data point to canvas coordinate + if (t == identity) // slight optimization + axis.p2c = function (p) { return (p - m) * s; }; + else + axis.p2c = function (p) { return (t(p) - m) * s; }; + // canvas coordinate to data point + if (!it) + axis.c2p = function (c) { return m + c / s; }; + else + axis.c2p = function (c) { return it(m + c / s); }; + } + + function measureTickLabels(axis) { + var opts = axis.options, i, ticks = axis.ticks || [], labels = [], + l, w = opts.labelWidth, h = opts.labelHeight, dummyDiv; + + function makeDummyDiv(labels, width) { + return $('<div style="position:absolute;top:-10000px;' + width + 'font-size:smaller">' + + '<div class="' + axis.direction + 'Axis ' + axis.direction + axis.n + 'Axis">' + + labels.join("") + '</div></div>') + .appendTo(placeholder); + } + + if (axis.direction == "x") { + // to avoid measuring the widths of the labels (it's slow), we + // construct fixed-size boxes and put the labels inside + // them, we don't need the exact figures and the + // fixed-size box content is easy to center + if (w == null) + w = Math.floor(canvasWidth / (ticks.length > 0 ? ticks.length : 1)); + + // measure x label heights + if (h == null) { + labels = []; + for (i = 0; i < ticks.length; ++i) { + l = ticks[i].label; + if (l) + labels.push('<div class="tickLabel" style="float:left;width:' + w + 'px">' + l + '</div>'); + } + + if (labels.length > 0) { + // stick them all in the same div and measure + // collective height + labels.push('<div style="clear:left"></div>'); + dummyDiv = makeDummyDiv(labels, "width:10000px;"); + h = dummyDiv.height(); + dummyDiv.remove(); + } + } + } + else if (w == null || h == null) { + // calculate y label dimensions + for (i = 0; i < ticks.length; ++i) { + l = ticks[i].label; + if (l) + labels.push('<div class="tickLabel">' + l + '</div>'); + } + + if (labels.length > 0) { + dummyDiv = makeDummyDiv(labels, ""); + if (w == null) + w = dummyDiv.children().width(); + if (h == null) + h = dummyDiv.find("div.tickLabel").height(); + dummyDiv.remove(); + } + } + + if (w == null) + w = 0; + if (h == null) + h = 0; + + axis.labelWidth = w; + axis.labelHeight = h; + } + + function allocateAxisBoxFirstPhase(axis) { + // find the bounding box of the axis by looking at label + // widths/heights and ticks, make room by diminishing the + // plotOffset + + var lw = axis.labelWidth, + lh = axis.labelHeight, + pos = axis.options.position, + tickLength = axis.options.tickLength, + axismargin = options.grid.axisMargin, + padding = options.grid.labelMargin, + all = axis.direction == "x" ? xaxes : yaxes, + index; + + // determine axis margin + var samePosition = $.grep(all, function (a) { + return a && a.options.position == pos && a.reserveSpace; + }); + if ($.inArray(axis, samePosition) == samePosition.length - 1) + axismargin = 0; // outermost + + // determine tick length - if we're innermost, we can use "full" + if (tickLength == null) + tickLength = "full"; + + var sameDirection = $.grep(all, function (a) { + return a && a.reserveSpace; + }); + + var innermost = $.inArray(axis, sameDirection) == 0; + if (!innermost && tickLength == "full") + tickLength = 5; + + if (!isNaN(+tickLength)) + padding += +tickLength; + + // compute box + if (axis.direction == "x") { + lh += padding; + + if (pos == "bottom") { + plotOffset.bottom += lh + axismargin; + axis.box = { top: canvasHeight - plotOffset.bottom, height: lh }; + } + else { + axis.box = { top: plotOffset.top + axismargin, height: lh }; + plotOffset.top += lh + axismargin; + } + } + else { + lw += padding; + + if (pos == "left") { + axis.box = { left: plotOffset.left + axismargin, width: lw }; + plotOffset.left += lw + axismargin; + } + else { + plotOffset.right += lw + axismargin; + axis.box = { left: canvasWidth - plotOffset.right, width: lw }; + } + } + + // save for future reference + axis.position = pos; + axis.tickLength = tickLength; + axis.box.padding = padding; + axis.innermost = innermost; + } + + function allocateAxisBoxSecondPhase(axis) { + // set remaining bounding box coordinates + if (axis.direction == "x") { + axis.box.left = plotOffset.left; + axis.box.width = plotWidth; + } + else { + axis.box.top = plotOffset.top; + axis.box.height = plotHeight; + } + } + + function setupGrid() { + var i, axes = allAxes(); + + // first calculate the plot and axis box dimensions + + $.each(axes, function (_, axis) { + axis.show = axis.options.show; + if (axis.show == null) + axis.show = axis.used; // by default an axis is visible if it's got data + + axis.reserveSpace = axis.show || axis.options.reserveSpace; + + setRange(axis); + }); + + allocatedAxes = $.grep(axes, function (axis) { return axis.reserveSpace; }); + + plotOffset.left = plotOffset.right = plotOffset.top = plotOffset.bottom = 0; + if (options.grid.show) { + $.each(allocatedAxes, function (_, axis) { + // make the ticks + setupTickGeneration(axis); + setTicks(axis); + snapRangeToTicks(axis, axis.ticks); + + // find labelWidth/Height for axis + measureTickLabels(axis); + }); + + // with all dimensions in house, we can compute the + // axis boxes, start from the outside (reverse order) + for (i = allocatedAxes.length - 1; i >= 0; --i) + allocateAxisBoxFirstPhase(allocatedAxes[i]); + + // make sure we've got enough space for things that + // might stick out + var minMargin = options.grid.minBorderMargin; + if (minMargin == null) { + minMargin = 0; + for (i = 0; i < series.length; ++i) + minMargin = Math.max(minMargin, series[i].points.radius + series[i].points.lineWidth/2); + } + + for (var a in plotOffset) { + plotOffset[a] += options.grid.borderWidth; + plotOffset[a] = Math.max(minMargin, plotOffset[a]); + } + } + + plotWidth = canvasWidth - plotOffset.left - plotOffset.right; + plotHeight = canvasHeight - plotOffset.bottom - plotOffset.top; + + // now we got the proper plotWidth/Height, we can compute the scaling + $.each(axes, function (_, axis) { + setTransformationHelpers(axis); + }); + + if (options.grid.show) { + $.each(allocatedAxes, function (_, axis) { + allocateAxisBoxSecondPhase(axis); + }); + + insertAxisLabels(); + } + + insertLegend(); + } + + function setRange(axis) { + var opts = axis.options, + min = +(opts.min != null ? opts.min : axis.datamin), + max = +(opts.max != null ? opts.max : axis.datamax), + delta = max - min; + + if (delta == 0.0) { + // degenerate case + var widen = max == 0 ? 1 : 0.01; + + if (opts.min == null) + min -= widen; + // always widen max if we couldn't widen min to ensure we + // don't fall into min == max which doesn't work + if (opts.max == null || opts.min != null) + max += widen; + } + else { + // consider autoscaling + var margin = opts.autoscaleMargin; + if (margin != null) { + if (opts.min == null) { + min -= delta * margin; + // make sure we don't go below zero if all values + // are positive + if (min < 0 && axis.datamin != null && axis.datamin >= 0) + min = 0; + } + if (opts.max == null) { + max += delta * margin; + if (max > 0 && axis.datamax != null && axis.datamax <= 0) + max = 0; + } + } + } + axis.min = min; + axis.max = max; + } + + function setupTickGeneration(axis) { + var opts = axis.options; + + // estimate number of ticks + var noTicks; + if (typeof opts.ticks == "number" && opts.ticks > 0) + noTicks = opts.ticks; + else + // heuristic based on the model a*sqrt(x) fitted to + // some data points that seemed reasonable + noTicks = 0.3 * Math.sqrt(axis.direction == "x" ? canvasWidth : canvasHeight); + + var delta = (axis.max - axis.min) / noTicks, + size, generator, unit, formatter, i, magn, norm; + + if (opts.mode == "time") { + // pretty handling of time + + // map of app. size of time units in milliseconds + var timeUnitSize = { + "second": 1000, + "minute": 60 * 1000, + "hour": 60 * 60 * 1000, + "day": 24 * 60 * 60 * 1000, + "month": 30 * 24 * 60 * 60 * 1000, + "year": 365.2425 * 24 * 60 * 60 * 1000 + }; + + + // the allowed tick sizes, after 1 year we use + // an integer algorithm + var spec = [ + [1, "second"], [2, "second"], [5, "second"], [10, "second"], + [30, "second"], + [1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"], + [30, "minute"], + [1, "hour"], [2, "hour"], [4, "hour"], + [8, "hour"], [12, "hour"], + [1, "day"], [2, "day"], [3, "day"], + [0.25, "month"], [0.5, "month"], [1, "month"], + [2, "month"], [3, "month"], [6, "month"], + [1, "year"] + ]; + + var minSize = 0; + if (opts.minTickSize != null) { + if (typeof opts.tickSize == "number") + minSize = opts.tickSize; + else + minSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]]; + } + + for (var i = 0; i < spec.length - 1; ++i) + if (delta < (spec[i][0] * timeUnitSize[spec[i][1]] + + spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2 + && spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) + break; + size = spec[i][0]; + unit = spec[i][1]; + + // special-case the possibility of several years + if (unit == "year") { + magn = Math.pow(10, Math.floor(Math.log(delta / timeUnitSize.year) / Math.LN10)); + norm = (delta / timeUnitSize.year) / magn; + if (norm < 1.5) + size = 1; + else if (norm < 3) + size = 2; + else if (norm < 7.5) + size = 5; + else + size = 10; + + size *= magn; + } + + axis.tickSize = opts.tickSize || [size, unit]; + + generator = function(axis) { + var ticks = [], + tickSize = axis.tickSize[0], unit = axis.tickSize[1], + d = new Date(axis.min); + + var step = tickSize * timeUnitSize[unit]; + + if (unit == "second") + d.setUTCSeconds(floorInBase(d.getUTCSeconds(), tickSize)); + if (unit == "minute") + d.setUTCMinutes(floorInBase(d.getUTCMinutes(), tickSize)); + if (unit == "hour") + d.setUTCHours(floorInBase(d.getUTCHours(), tickSize)); + if (unit == "month") + d.setUTCMonth(floorInBase(d.getUTCMonth(), tickSize)); + if (unit == "year") + d.setUTCFullYear(floorInBase(d.getUTCFullYear(), tickSize)); + + // reset smaller components + d.setUTCMilliseconds(0); + if (step >= timeUnitSize.minute) + d.setUTCSeconds(0); + if (step >= timeUnitSize.hour) + d.setUTCMinutes(0); + if (step >= timeUnitSize.day) + d.setUTCHours(0); + if (step >= timeUnitSize.day * 4) + d.setUTCDate(1); + if (step >= timeUnitSize.year) + d.setUTCMonth(0); + + + var carry = 0, v = Number.NaN, prev; + do { + prev = v; + v = d.getTime(); + ticks.push(v); + if (unit == "month") { + if (tickSize < 1) { + // a bit complicated - we'll divide the month + // up but we need to take care of fractions + // so we don't end up in the middle of a day + d.setUTCDate(1); + var start = d.getTime(); + d.setUTCMonth(d.getUTCMonth() + 1); + var end = d.getTime(); + d.setTime(v + carry * timeUnitSize.hour + (end - start) * tickSize); + carry = d.getUTCHours(); + d.setUTCHours(0); + } + else + d.setUTCMonth(d.getUTCMonth() + tickSize); + } + else if (unit == "year") { + d.setUTCFullYear(d.getUTCFullYear() + tickSize); + } + else + d.setTime(v + step); + } while (v < axis.max && v != prev); + + return ticks; + }; + + formatter = function (v, axis) { + var d = new Date(v); + + // first check global format + if (opts.timeformat != null) + return $.plot.formatDate(d, opts.timeformat, opts.monthNames); + + var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]]; + var span = axis.max - axis.min; + var suffix = (opts.twelveHourClock) ? " %p" : ""; + + if (t < timeUnitSize.minute) + fmt = "%h:%M:%S" + suffix; + else if (t < timeUnitSize.day) { + if (span < 2 * timeUnitSize.day) + fmt = "%h:%M" + suffix; + else + fmt = "%b %d %h:%M" + suffix; + } + else if (t < timeUnitSize.month) + fmt = "%b %d"; + else if (t < timeUnitSize.year) { + if (span < timeUnitSize.year) + fmt = "%b"; + else + fmt = "%b %y"; + } + else + fmt = "%y"; + + return $.plot.formatDate(d, fmt, opts.monthNames); + }; + } + else { + // pretty rounding of base-10 numbers + var maxDec = opts.tickDecimals; + var dec = -Math.floor(Math.log(delta) / Math.LN10); + if (maxDec != null && dec > maxDec) + dec = maxDec; + + magn = Math.pow(10, -dec); + norm = delta / magn; // norm is between 1.0 and 10.0 + + if (norm < 1.5) + size = 1; + else if (norm < 3) { + size = 2; + // special case for 2.5, requires an extra decimal + if (norm > 2.25 && (maxDec == null || dec + 1 <= maxDec)) { + size = 2.5; + ++dec; + } + } + else if (norm < 7.5) + size = 5; + else + size = 10; + + size *= magn; + + if (opts.minTickSize != null && size < opts.minTickSize) + size = opts.minTickSize; + + axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec); + axis.tickSize = opts.tickSize || size; + + generator = function (axis) { + var ticks = []; + + // spew out all possible ticks + var start = floorInBase(axis.min, axis.tickSize), + i = 0, v = Number.NaN, prev; + do { + prev = v; + v = start + i * axis.tickSize; + ticks.push(v); + ++i; + } while (v < axis.max && v != prev); + return ticks; + }; + + formatter = function (v, axis) { + return v.toFixed(axis.tickDecimals); + }; + } + + if (opts.alignTicksWithAxis != null) { + var otherAxis = (axis.direction == "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1]; + if (otherAxis && otherAxis.used && otherAxis != axis) { + // consider snapping min/max to outermost nice ticks + var niceTicks = generator(axis); + if (niceTicks.length > 0) { + if (opts.min == null) + axis.min = Math.min(axis.min, niceTicks[0]); + if (opts.max == null && niceTicks.length > 1) + axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]); + } + + generator = function (axis) { + // copy ticks, scaled to this axis + var ticks = [], v, i; + for (i = 0; i < otherAxis.ticks.length; ++i) { + v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min); + v = axis.min + v * (axis.max - axis.min); + ticks.push(v); + } + return ticks; + }; + + // we might need an extra decimal since forced + // ticks don't necessarily fit naturally + if (axis.mode != "time" && opts.tickDecimals == null) { + var extraDec = Math.max(0, -Math.floor(Math.log(delta) / Math.LN10) + 1), + ts = generator(axis); + + // only proceed if the tick interval rounded + // with an extra decimal doesn't give us a + // zero at end + if (!(ts.length > 1 && /\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec)))) + axis.tickDecimals = extraDec; + } + } + } + + axis.tickGenerator = generator; + if ($.isFunction(opts.tickFormatter)) + axis.tickFormatter = function (v, axis) { return "" + opts.tickFormatter(v, axis); }; + else + axis.tickFormatter = formatter; + } + + function setTicks(axis) { + var oticks = axis.options.ticks, ticks = []; + if (oticks == null || (typeof oticks == "number" && oticks > 0)) + ticks = axis.tickGenerator(axis); + else if (oticks) { + if ($.isFunction(oticks)) + // generate the ticks + ticks = oticks({ min: axis.min, max: axis.max }); + else + ticks = oticks; + } + + // clean up/labelify the supplied ticks, copy them over + var i, v; + axis.ticks = []; + for (i = 0; i < ticks.length; ++i) { + var label = null; + var t = ticks[i]; + if (typeof t == "object") { + v = +t[0]; + if (t.length > 1) + label = t[1]; + } + else + v = +t; + if (label == null) + label = axis.tickFormatter(v, axis); + if (!isNaN(v)) + axis.ticks.push({ v: v, label: label }); + } + } + + function snapRangeToTicks(axis, ticks) { + if (axis.options.autoscaleMargin && ticks.length > 0) { + // snap to ticks + if (axis.options.min == null) + axis.min = Math.min(axis.min, ticks[0].v); + if (axis.options.max == null && ticks.length > 1) + axis.max = Math.max(axis.max, ticks[ticks.length - 1].v); + } + } + + function draw() { + ctx.clearRect(0, 0, canvasWidth, canvasHeight); + + var grid = options.grid; + + // draw background, if any + if (grid.show && grid.backgroundColor) + drawBackground(); + + if (grid.show && !grid.aboveData) + drawGrid(); + + for (var i = 0; i < series.length; ++i) { + executeHooks(hooks.drawSeries, [ctx, series[i]]); + drawSeries(series[i]); + } + + executeHooks(hooks.draw, [ctx]); + + if (grid.show && grid.aboveData) + drawGrid(); + } + + function extractRange(ranges, coord) { + var axis, from, to, key, axes = allAxes(); + + for (i = 0; i < axes.length; ++i) { + axis = axes[i]; + if (axis.direction == coord) { + key = coord + axis.n + "axis"; + if (!ranges[key] && axis.n == 1) + key = coord + "axis"; // support x1axis as xaxis + if (ranges[key]) { + from = ranges[key].from; + to = ranges[key].to; + break; + } + } + } + + // backwards-compat stuff - to be removed in future + if (!ranges[key]) { + axis = coord == "x" ? xaxes[0] : yaxes[0]; + from = ranges[coord + "1"]; + to = ranges[coord + "2"]; + } + + // auto-reverse as an added bonus + if (from != null && to != null && from > to) { + var tmp = from; + from = to; + to = tmp; + } + + return { from: from, to: to, axis: axis }; + } + + function drawBackground() { + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)"); + ctx.fillRect(0, 0, plotWidth, plotHeight); + ctx.restore(); + } + + function drawGrid() { + var i; + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + // draw markings + var markings = options.grid.markings; + if (markings) { + if ($.isFunction(markings)) { + var axes = plot.getAxes(); + // xmin etc. is backwards compatibility, to be + // removed in the future + axes.xmin = axes.xaxis.min; + axes.xmax = axes.xaxis.max; + axes.ymin = axes.yaxis.min; + axes.ymax = axes.yaxis.max; + + markings = markings(axes); + } + + for (i = 0; i < markings.length; ++i) { + var m = markings[i], + xrange = extractRange(m, "x"), + yrange = extractRange(m, "y"); + + // fill in missing + if (xrange.from == null) + xrange.from = xrange.axis.min; + if (xrange.to == null) + xrange.to = xrange.axis.max; + if (yrange.from == null) + yrange.from = yrange.axis.min; + if (yrange.to == null) + yrange.to = yrange.axis.max; + + // clip + if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max || + yrange.to < yrange.axis.min || yrange.from > yrange.axis.max) + continue; + + xrange.from = Math.max(xrange.from, xrange.axis.min); + xrange.to = Math.min(xrange.to, xrange.axis.max); + yrange.from = Math.max(yrange.from, yrange.axis.min); + yrange.to = Math.min(yrange.to, yrange.axis.max); + + if (xrange.from == xrange.to && yrange.from == yrange.to) + continue; + + // then draw + xrange.from = xrange.axis.p2c(xrange.from); + xrange.to = xrange.axis.p2c(xrange.to); + yrange.from = yrange.axis.p2c(yrange.from); + yrange.to = yrange.axis.p2c(yrange.to); + + if (xrange.from == xrange.to || yrange.from == yrange.to) { + // draw line + ctx.beginPath(); + ctx.strokeStyle = m.color || options.grid.markingsColor; + ctx.lineWidth = m.lineWidth || options.grid.markingsLineWidth; + ctx.moveTo(xrange.from, yrange.from); + ctx.lineTo(xrange.to, yrange.to); + ctx.stroke(); + } + else { + // fill area + ctx.fillStyle = m.color || options.grid.markingsColor; + ctx.fillRect(xrange.from, yrange.to, + xrange.to - xrange.from, + yrange.from - yrange.to); + } + } + } + + // draw the ticks + var axes = allAxes(), bw = options.grid.borderWidth; + + for (var j = 0; j < axes.length; ++j) { + var axis = axes[j], box = axis.box, + t = axis.tickLength, x, y, xoff, yoff; + if (!axis.show || axis.ticks.length == 0) + continue + + ctx.strokeStyle = axis.options.tickColor || $.color.parse(axis.options.color).scale('a', 0.22).toString(); + ctx.lineWidth = 1; + + // find the edges + if (axis.direction == "x") { + x = 0; + if (t == "full") + y = (axis.position == "top" ? 0 : plotHeight); + else + y = box.top - plotOffset.top + (axis.position == "top" ? box.height : 0); + } + else { + y = 0; + if (t == "full") + x = (axis.position == "left" ? 0 : plotWidth); + else + x = box.left - plotOffset.left + (axis.position == "left" ? box.width : 0); + } + + // draw tick bar + if (!axis.innermost) { + ctx.beginPath(); + xoff = yoff = 0; + if (axis.direction == "x") + xoff = plotWidth; + else + yoff = plotHeight; + + if (ctx.lineWidth == 1) { + x = Math.floor(x) + 0.5; + y = Math.floor(y) + 0.5; + } + + ctx.moveTo(x, y); + ctx.lineTo(x + xoff, y + yoff); + ctx.stroke(); + } + + // draw ticks + ctx.beginPath(); + for (i = 0; i < axis.ticks.length; ++i) { + var v = axis.ticks[i].v; + + xoff = yoff = 0; + + if (v < axis.min || v > axis.max + // skip those lying on the axes if we got a border + || (t == "full" && bw > 0 + && (v == axis.min || v == axis.max))) + continue; + + if (axis.direction == "x") { + x = axis.p2c(v); + yoff = t == "full" ? -plotHeight : t; + + if (axis.position == "top") + yoff = -yoff; + } + else { + y = axis.p2c(v); + xoff = t == "full" ? -plotWidth : t; + + if (axis.position == "left") + xoff = -xoff; + } + + if (ctx.lineWidth == 1) { + if (axis.direction == "x") + x = Math.floor(x) + 0.5; + else + y = Math.floor(y) + 0.5; + } + + ctx.moveTo(x, y); + ctx.lineTo(x + xoff, y + yoff); + } + + ctx.stroke(); + } + + + // draw border + if (bw) { + ctx.lineWidth = bw; + ctx.strokeStyle = options.grid.borderColor; + ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw); + } + + ctx.restore(); + } + + function insertAxisLabels() { + placeholder.find(".tickLabels").remove(); + + var html = ['<div class="tickLabels" style="font-size:smaller">']; + + var axes = allAxes(); + for (var j = 0; j < axes.length; ++j) { + var axis = axes[j], box = axis.box; + if (!axis.show) + continue; + //debug: html.push('<div style="position:absolute;opacity:0.10;background-color:red;left:' + box.left + 'px;top:' + box.top + 'px;width:' + box.width + 'px;height:' + box.height + 'px"></div>') + html.push('<div class="' + axis.direction + 'Axis ' + axis.direction + axis.n + 'Axis" style="color:' + axis.options.color + '">'); + for (var i = 0; i < axis.ticks.length; ++i) { + var tick = axis.ticks[i]; + if (!tick.label || tick.v < axis.min || tick.v > axis.max) + continue; + + var pos = {}, align; + + if (axis.direction == "x") { + align = "center"; + pos.left = Math.round(plotOffset.left + axis.p2c(tick.v) - axis.labelWidth/2); + if (axis.position == "bottom") + pos.top = box.top + box.padding; + else + pos.bottom = canvasHeight - (box.top + box.height - box.padding); + } + else { + pos.top = Math.round(plotOffset.top + axis.p2c(tick.v) - axis.labelHeight/2); + if (axis.position == "left") { + pos.right = canvasWidth - (box.left + box.width - box.padding) + align = "right"; + } + else { + pos.left = box.left + box.padding; + align = "left"; + } + } + + pos.width = axis.labelWidth; + + var style = ["position:absolute", "text-align:" + align ]; + for (var a in pos) + style.push(a + ":" + pos[a] + "px") + + html.push('<div class="tickLabel" style="' + style.join(';') + '">' + tick.label + '</div>'); + } + html.push('</div>'); + } + + html.push('</div>'); + + placeholder.append(html.join("")); + } + + function drawSeries(series) { + if (series.lines.show) + drawSeriesLines(series); + if (series.bars.show) + drawSeriesBars(series); + if (series.points.show) + drawSeriesPoints(series); + } + + function drawSeriesLines(series) { + function plotLine(datapoints, xoffset, yoffset, axisx, axisy) { + var points = datapoints.points, + ps = datapoints.pointsize, + prevx = null, prevy = null; + + ctx.beginPath(); + for (var i = ps; i < points.length; i += ps) { + var x1 = points[i - ps], y1 = points[i - ps + 1], + x2 = points[i], y2 = points[i + 1]; + + if (x1 == null || x2 == null) + continue; + + // clip with ymin + if (y1 <= y2 && y1 < axisy.min) { + if (y2 < axisy.min) + continue; // line segment is outside + // compute new intersection point + x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.min; + } + else if (y2 <= y1 && y2 < axisy.min) { + if (y1 < axisy.min) + continue; + x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.min; + } + + // clip with ymax + if (y1 >= y2 && y1 > axisy.max) { + if (y2 > axisy.max) + continue; + x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.max; + } + else if (y2 >= y1 && y2 > axisy.max) { + if (y1 > axisy.max) + continue; + x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.max; + } + + // clip with xmin + if (x1 <= x2 && x1 < axisx.min) { + if (x2 < axisx.min) + continue; + y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.min; + } + else if (x2 <= x1 && x2 < axisx.min) { + if (x1 < axisx.min) + continue; + y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.min; + } + + // clip with xmax + if (x1 >= x2 && x1 > axisx.max) { + if (x2 > axisx.max) + continue; + y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.max; + } + else if (x2 >= x1 && x2 > axisx.max) { + if (x1 > axisx.max) + continue; + y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.max; + } + + if (x1 != prevx || y1 != prevy) + ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset); + + prevx = x2; + prevy = y2; + ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset); + } + ctx.stroke(); + } + + function plotLineArea(datapoints, axisx, axisy) { + var points = datapoints.points, + ps = datapoints.pointsize, + bottom = Math.min(Math.max(0, axisy.min), axisy.max), + i = 0, top, areaOpen = false, + ypos = 1, segmentStart = 0, segmentEnd = 0; + + // we process each segment in two turns, first forward + // direction to sketch out top, then once we hit the + // end we go backwards to sketch the bottom + while (true) { + if (ps > 0 && i > points.length + ps) + break; + + i += ps; // ps is negative if going backwards + + var x1 = points[i - ps], + y1 = points[i - ps + ypos], + x2 = points[i], y2 = points[i + ypos]; + + if (areaOpen) { + if (ps > 0 && x1 != null && x2 == null) { + // at turning point + segmentEnd = i; + ps = -ps; + ypos = 2; + continue; + } + + if (ps < 0 && i == segmentStart + ps) { + // done with the reverse sweep + ctx.fill(); + areaOpen = false; + ps = -ps; + ypos = 1; + i = segmentStart = segmentEnd + ps; + continue; + } + } + + if (x1 == null || x2 == null) + continue; + + // clip x values + + // clip with xmin + if (x1 <= x2 && x1 < axisx.min) { + if (x2 < axisx.min) + continue; + y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.min; + } + else if (x2 <= x1 && x2 < axisx.min) { + if (x1 < axisx.min) + continue; + y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.min; + } + + // clip with xmax + if (x1 >= x2 && x1 > axisx.max) { + if (x2 > axisx.max) + continue; + y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x1 = axisx.max; + } + else if (x2 >= x1 && x2 > axisx.max) { + if (x1 > axisx.max) + continue; + y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; + x2 = axisx.max; + } + + if (!areaOpen) { + // open area + ctx.beginPath(); + ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom)); + areaOpen = true; + } + + // now first check the case where both is outside + if (y1 >= axisy.max && y2 >= axisy.max) { + ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max)); + continue; + } + else if (y1 <= axisy.min && y2 <= axisy.min) { + ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min)); + continue; + } + + // else it's a bit more complicated, there might + // be a flat maxed out rectangle first, then a + // triangular cutout or reverse; to find these + // keep track of the current x values + var x1old = x1, x2old = x2; + + // clip the y values, without shortcutting, we + // go through all cases in turn + + // clip with ymin + if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) { + x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.min; + } + else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) { + x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.min; + } + + // clip with ymax + if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) { + x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y1 = axisy.max; + } + else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) { + x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; + y2 = axisy.max; + } + + // if the x value was changed we got a rectangle + // to fill + if (x1 != x1old) { + ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1)); + // it goes to (x1, y1), but we fill that below + } + + // fill triangular section, this sometimes result + // in redundant points if (x1, y1) hasn't changed + // from previous line to, but we just ignore that + ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1)); + ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); + + // fill the other rectangle if it's there + if (x2 != x2old) { + ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); + ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2)); + } + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + ctx.lineJoin = "round"; + + var lw = series.lines.lineWidth, + sw = series.shadowSize; + // FIXME: consider another form of shadow when filling is turned on + if (lw > 0 && sw > 0) { + // draw shadow as a thick and thin line with transparency + ctx.lineWidth = sw; + ctx.strokeStyle = "rgba(0,0,0,0.1)"; + // position shadow at angle from the mid of line + var angle = Math.PI/18; + plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis); + ctx.lineWidth = sw/2; + plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis); + } + + ctx.lineWidth = lw; + ctx.strokeStyle = series.color; + var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight); + if (fillStyle) { + ctx.fillStyle = fillStyle; + plotLineArea(series.datapoints, series.xaxis, series.yaxis); + } + + if (lw > 0) + plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis); + ctx.restore(); + } + + function drawSeriesPoints(series) { + function plotPoints(datapoints, radius, fillStyle, offset, shadow, axisx, axisy, symbol) { + var points = datapoints.points, ps = datapoints.pointsize; + + for (var i = 0; i < points.length; i += ps) { + var x = points[i], y = points[i + 1]; + if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) + continue; + + ctx.beginPath(); + x = axisx.p2c(x); + y = axisy.p2c(y) + offset; + if (symbol == "circle") + ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false); + else + symbol(ctx, x, y, radius, shadow); + ctx.closePath(); + + if (fillStyle) { + ctx.fillStyle = fillStyle; + ctx.fill(); + } + ctx.stroke(); + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + var lw = series.points.lineWidth, + sw = series.shadowSize, + radius = series.points.radius, + symbol = series.points.symbol; + if (lw > 0 && sw > 0) { + // draw shadow in two steps + var w = sw / 2; + ctx.lineWidth = w; + ctx.strokeStyle = "rgba(0,0,0,0.1)"; + plotPoints(series.datapoints, radius, null, w + w/2, true, + series.xaxis, series.yaxis, symbol); + + ctx.strokeStyle = "rgba(0,0,0,0.2)"; + plotPoints(series.datapoints, radius, null, w/2, true, + series.xaxis, series.yaxis, symbol); + } + + ctx.lineWidth = lw; + ctx.strokeStyle = series.color; + plotPoints(series.datapoints, radius, + getFillStyle(series.points, series.color), 0, false, + series.xaxis, series.yaxis, symbol); + ctx.restore(); + } + + function drawBar(x, y, b, barLeft, barRight, offset, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) { + var left, right, bottom, top, + drawLeft, drawRight, drawTop, drawBottom, + tmp; + + // in horizontal mode, we start the bar from the left + // instead of from the bottom so it appears to be + // horizontal rather than vertical + if (horizontal) { + drawBottom = drawRight = drawTop = true; + drawLeft = false; + left = b; + right = x; + top = y + barLeft; + bottom = y + barRight; + + // account for negative bars + if (right < left) { + tmp = right; + right = left; + left = tmp; + drawLeft = true; + drawRight = false; + } + } + else { + drawLeft = drawRight = drawTop = true; + drawBottom = false; + left = x + barLeft; + right = x + barRight; + bottom = b; + top = y; + + // account for negative bars + if (top < bottom) { + tmp = top; + top = bottom; + bottom = tmp; + drawBottom = true; + drawTop = false; + } + } + + // clip + if (right < axisx.min || left > axisx.max || + top < axisy.min || bottom > axisy.max) + return; + + if (left < axisx.min) { + left = axisx.min; + drawLeft = false; + } + + if (right > axisx.max) { + right = axisx.max; + drawRight = false; + } + + if (bottom < axisy.min) { + bottom = axisy.min; + drawBottom = false; + } + + if (top > axisy.max) { + top = axisy.max; + drawTop = false; + } + + left = axisx.p2c(left); + bottom = axisy.p2c(bottom); + right = axisx.p2c(right); + top = axisy.p2c(top); + + // fill the bar + if (fillStyleCallback) { + c.beginPath(); + c.moveTo(left, bottom); + c.lineTo(left, top); + c.lineTo(right, top); + c.lineTo(right, bottom); + c.fillStyle = fillStyleCallback(bottom, top); + c.fill(); + } + + // draw outline + if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) { + c.beginPath(); + + // FIXME: inline moveTo is buggy with excanvas + c.moveTo(left, bottom + offset); + if (drawLeft) + c.lineTo(left, top + offset); + else + c.moveTo(left, top + offset); + if (drawTop) + c.lineTo(right, top + offset); + else + c.moveTo(right, top + offset); + if (drawRight) + c.lineTo(right, bottom + offset); + else + c.moveTo(right, bottom + offset); + if (drawBottom) + c.lineTo(left, bottom + offset); + else + c.moveTo(left, bottom + offset); + c.stroke(); + } + } + + function drawSeriesBars(series) { + function plotBars(datapoints, barLeft, barRight, offset, fillStyleCallback, axisx, axisy) { + var points = datapoints.points, ps = datapoints.pointsize; + + for (var i = 0; i < points.length; i += ps) { + if (points[i] == null) + continue; + drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, offset, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth); + } + } + + ctx.save(); + ctx.translate(plotOffset.left, plotOffset.top); + + // FIXME: figure out a way to add shadows (for instance along the right edge) + ctx.lineWidth = series.bars.lineWidth; + ctx.strokeStyle = series.color; + var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2; + var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null; + plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, 0, fillStyleCallback, series.xaxis, series.yaxis); + ctx.restore(); + } + + function getFillStyle(filloptions, seriesColor, bottom, top) { + var fill = filloptions.fill; + if (!fill) + return null; + + if (filloptions.fillColor) + return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor); + + var c = $.color.parse(seriesColor); + c.a = typeof fill == "number" ? fill : 0.4; + c.normalize(); + return c.toString(); + } + + function insertLegend() { + placeholder.find(".legend").remove(); + + if (!options.legend.show) + return; + + var fragments = [], rowStarted = false, + lf = options.legend.labelFormatter, s, label; + for (var i = 0; i < series.length; ++i) { + s = series[i]; + label = s.label; + if (!label) + continue; + + if (i % options.legend.noColumns == 0) { + if (rowStarted) + fragments.push('</tr>'); + fragments.push('<tr>'); + rowStarted = true; + } + + if (lf) + label = lf(label, s); + + fragments.push( + '<td class="legendColorBox"><div style="border:1px solid ' + options.legend.labelBoxBorderColor + ';padding:1px"><div style="width:4px;height:0;border:5px solid ' + s.color + ';overflow:hidden"></div></div></td>' + + '<td class="legendLabel">' + label + '</td>'); + } + if (rowStarted) + fragments.push('</tr>'); + + if (fragments.length == 0) + return; + + var table = '<table style="font-size:smaller;color:' + options.grid.color + '">' + fragments.join("") + '</table>'; + if (options.legend.container != null) + $(options.legend.container).html(table); + else { + var pos = "", + p = options.legend.position, + m = options.legend.margin; + if (m[0] == null) + m = [m, m]; + if (p.charAt(0) == "n") + pos += 'top:' + (m[1] + plotOffset.top) + 'px;'; + else if (p.charAt(0) == "s") + pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;'; + if (p.charAt(1) == "e") + pos += 'right:' + (m[0] + plotOffset.right) + 'px;'; + else if (p.charAt(1) == "w") + pos += 'left:' + (m[0] + plotOffset.left) + 'px;'; + var legend = $('<div class="legend">' + table.replace('style="', 'style="position:absolute;' + pos +';') + '</div>').appendTo(placeholder); + if (options.legend.backgroundOpacity != 0.0) { + // put in the transparent background + // separately to avoid blended labels and + // label boxes + var c = options.legend.backgroundColor; + if (c == null) { + c = options.grid.backgroundColor; + if (c && typeof c == "string") + c = $.color.parse(c); + else + c = $.color.extract(legend, 'background-color'); + c.a = 1; + c = c.toString(); + } + var div = legend.children(); + $('<div style="position:absolute;width:' + div.width() + 'px;height:' + div.height() + 'px;' + pos +'background-color:' + c + ';"> </div>').prependTo(legend).css('opacity', options.legend.backgroundOpacity); + } + } + } + + + // interactive features + + var highlights = [], + redrawTimeout = null; + + // returns the data item the mouse is over, or null if none is found + function findNearbyItem(mouseX, mouseY, seriesFilter) { + var maxDistance = options.grid.mouseActiveRadius, + smallestDistance = maxDistance * maxDistance + 1, + item = null, foundPoint = false, i, j; + + for (i = series.length - 1; i >= 0; --i) { + if (!seriesFilter(series[i])) + continue; + + var s = series[i], + axisx = s.xaxis, + axisy = s.yaxis, + points = s.datapoints.points, + ps = s.datapoints.pointsize, + mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster + my = axisy.c2p(mouseY), + maxx = maxDistance / axisx.scale, + maxy = maxDistance / axisy.scale; + + // with inverse transforms, we can't use the maxx/maxy + // optimization, sadly + if (axisx.options.inverseTransform) + maxx = Number.MAX_VALUE; + if (axisy.options.inverseTransform) + maxy = Number.MAX_VALUE; + + if (s.lines.show || s.points.show) { + for (j = 0; j < points.length; j += ps) { + var x = points[j], y = points[j + 1]; + if (x == null) + continue; + + // For points and lines, the cursor must be within a + // certain distance to the data point + if (x - mx > maxx || x - mx < -maxx || + y - my > maxy || y - my < -maxy) + continue; + + // We have to calculate distances in pixels, not in + // data units, because the scales of the axes may be different + var dx = Math.abs(axisx.p2c(x) - mouseX), + dy = Math.abs(axisy.p2c(y) - mouseY), + dist = dx * dx + dy * dy; // we save the sqrt + + // use <= to ensure last point takes precedence + // (last generally means on top of) + if (dist < smallestDistance) { + smallestDistance = dist; + item = [i, j / ps]; + } + } + } + + if (s.bars.show && !item) { // no other point can be nearby + var barLeft = s.bars.align == "left" ? 0 : -s.bars.barWidth/2, + barRight = barLeft + s.bars.barWidth; + + for (j = 0; j < points.length; j += ps) { + var x = points[j], y = points[j + 1], b = points[j + 2]; + if (x == null) + continue; + + // for a bar graph, the cursor must be inside the bar + if (series[i].bars.horizontal ? + (mx <= Math.max(b, x) && mx >= Math.min(b, x) && + my >= y + barLeft && my <= y + barRight) : + (mx >= x + barLeft && mx <= x + barRight && + my >= Math.min(b, y) && my <= Math.max(b, y))) + item = [i, j / ps]; + } + } + } + + if (item) { + i = item[0]; + j = item[1]; + ps = series[i].datapoints.pointsize; + + return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps), + dataIndex: j, + series: series[i], + seriesIndex: i }; + } + + return null; + } + + function onMouseMove(e) { + if (options.grid.hoverable) + triggerClickHoverEvent("plothover", e, + function (s) { return s["hoverable"] != false; }); + } + + function onMouseLeave(e) { + if (options.grid.hoverable) + triggerClickHoverEvent("plothover", e, + function (s) { return false; }); + } + + function onClick(e) { + triggerClickHoverEvent("plotclick", e, + function (s) { return s["clickable"] != false; }); + } + + // trigger click or hover event (they send the same parameters + // so we share their code) + function triggerClickHoverEvent(eventname, event, seriesFilter) { + var offset = eventHolder.offset(), + canvasX = event.pageX - offset.left - plotOffset.left, + canvasY = event.pageY - offset.top - plotOffset.top, + pos = canvasToAxisCoords({ left: canvasX, top: canvasY }); + + pos.pageX = event.pageX; + pos.pageY = event.pageY; + + var item = findNearbyItem(canvasX, canvasY, seriesFilter); + + if (item) { + // fill in mouse pos for any listeners out there + item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left + plotOffset.left); + item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top + plotOffset.top); + } + + if (options.grid.autoHighlight) { + // clear auto-highlights + for (var i = 0; i < highlights.length; ++i) { + var h = highlights[i]; + if (h.auto == eventname && + !(item && h.series == item.series && + h.point[0] == item.datapoint[0] && + h.point[1] == item.datapoint[1])) + unhighlight(h.series, h.point); + } + + if (item) + highlight(item.series, item.datapoint, eventname); + } + + placeholder.trigger(eventname, [ pos, item ]); + } + + function triggerRedrawOverlay() { + if (!redrawTimeout) + redrawTimeout = setTimeout(drawOverlay, 30); + } + + function drawOverlay() { + redrawTimeout = null; + + // draw highlights + octx.save(); + octx.clearRect(0, 0, canvasWidth, canvasHeight); + octx.translate(plotOffset.left, plotOffset.top); + + var i, hi; + for (i = 0; i < highlights.length; ++i) { + hi = highlights[i]; + + if (hi.series.bars.show) + drawBarHighlight(hi.series, hi.point); + else + drawPointHighlight(hi.series, hi.point); + } + octx.restore(); + + executeHooks(hooks.drawOverlay, [octx]); + } + + function highlight(s, point, auto) { + if (typeof s == "number") + s = series[s]; + + if (typeof point == "number") { + var ps = s.datapoints.pointsize; + point = s.datapoints.points.slice(ps * point, ps * (point + 1)); + } + + var i = indexOfHighlight(s, point); + if (i == -1) { + highlights.push({ series: s, point: point, auto: auto }); + + triggerRedrawOverlay(); + } + else if (!auto) + highlights[i].auto = false; + } + + function unhighlight(s, point) { + if (s == null && point == null) { + highlights = []; + triggerRedrawOverlay(); + } + + if (typeof s == "number") + s = series[s]; + + if (typeof point == "number") + point = s.data[point]; + + var i = indexOfHighlight(s, point); + if (i != -1) { + highlights.splice(i, 1); + + triggerRedrawOverlay(); + } + } + + function indexOfHighlight(s, p) { + for (var i = 0; i < highlights.length; ++i) { + var h = highlights[i]; + if (h.series == s && h.point[0] == p[0] + && h.point[1] == p[1]) + return i; + } + return -1; + } + + function drawPointHighlight(series, point) { + var x = point[0], y = point[1], + axisx = series.xaxis, axisy = series.yaxis; + + if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) + return; + + var pointRadius = series.points.radius + series.points.lineWidth / 2; + octx.lineWidth = pointRadius; + octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString(); + var radius = 1.5 * pointRadius, + x = axisx.p2c(x), + y = axisy.p2c(y); + + octx.beginPath(); + if (series.points.symbol == "circle") + octx.arc(x, y, radius, 0, 2 * Math.PI, false); + else + series.points.symbol(octx, x, y, radius, false); + octx.closePath(); + octx.stroke(); + } + + function drawBarHighlight(series, point) { + octx.lineWidth = series.bars.lineWidth; + octx.strokeStyle = $.color.parse(series.color).scale('a', 0.5).toString(); + var fillStyle = $.color.parse(series.color).scale('a', 0.5).toString(); + var barLeft = series.bars.align == "left" ? 0 : -series.bars.barWidth/2; + drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth, + 0, function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth); + } + + function getColorOrGradient(spec, bottom, top, defaultColor) { + if (typeof spec == "string") + return spec; + else { + // assume this is a gradient spec; IE currently only + // supports a simple vertical gradient properly, so that's + // what we support too + var gradient = ctx.createLinearGradient(0, top, 0, bottom); + + for (var i = 0, l = spec.colors.length; i < l; ++i) { + var c = spec.colors[i]; + if (typeof c != "string") { + var co = $.color.parse(defaultColor); + if (c.brightness != null) + co = co.scale('rgb', c.brightness) + if (c.opacity != null) + co.a *= c.opacity; + c = co.toString(); + } + gradient.addColorStop(i / (l - 1), c); + } + + return gradient; + } + } + } + + $.plot = function(placeholder, data, options) { + //var t0 = new Date(); + var plot = new Plot($(placeholder), data, options, $.plot.plugins); + //(window.console ? console.log : alert)("time used (msecs): " + ((new Date()).getTime() - t0.getTime())); + return plot; + }; + + $.plot.version = "0.7"; + + $.plot.plugins = []; + + // returns a string with the date d formatted according to fmt + $.plot.formatDate = function(d, fmt, monthNames) { + var leftPad = function(n) { + n = "" + n; + return n.length == 1 ? "0" + n : n; + }; + + var r = []; + var escape = false, padNext = false; + var hours = d.getUTCHours(); + var isAM = hours < 12; + if (monthNames == null) + monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + + if (fmt.search(/%p|%P/) != -1) { + if (hours > 12) { + hours = hours - 12; + } else if (hours == 0) { + hours = 12; + } + } + for (var i = 0; i < fmt.length; ++i) { + var c = fmt.charAt(i); + + if (escape) { + switch (c) { + case 'h': c = "" + hours; break; + case 'H': c = leftPad(hours); break; + case 'M': c = leftPad(d.getUTCMinutes()); break; + case 'S': c = leftPad(d.getUTCSeconds()); break; + case 'd': c = "" + d.getUTCDate(); break; + case 'm': c = "" + (d.getUTCMonth() + 1); break; + case 'y': c = "" + d.getUTCFullYear(); break; + case 'b': c = "" + monthNames[d.getUTCMonth()]; break; + case 'p': c = (isAM) ? ("" + "am") : ("" + "pm"); break; + case 'P': c = (isAM) ? ("" + "AM") : ("" + "PM"); break; + case '0': c = ""; padNext = true; break; + } + if (c && padNext) { + c = leftPad(c); + padNext = false; + } + r.push(c); + if (!padNext) + escape = false; + } + else { + if (c == "%") + escape = true; + else + r.push(c); + } + } + return r.join(""); + }; + + // round to nearby lower multiple of base + function floorInBase(n, base) { + return base * Math.floor(n / base); + } + +})(jQuery); diff --git a/theme/bootstrap/views/js/plugins/flot/jquery.flot.pie.js b/theme/bootstrap/views/js/plugins/flot/jquery.flot.pie.js new file mode 100644 index 0000000..b46c03c --- /dev/null +++ b/theme/bootstrap/views/js/plugins/flot/jquery.flot.pie.js @@ -0,0 +1,750 @@ +/* +Flot plugin for rendering pie charts. The plugin assumes the data is +coming is as a single data value for each series, and each of those +values is a positive value or zero (negative numbers don't make +any sense and will cause strange effects). The data values do +NOT need to be passed in as percentage values because it +internally calculates the total and percentages. + +* Created by Brian Medendorp, June 2009 +* Updated November 2009 with contributions from: btburnett3, Anthony Aragues and Xavi Ivars + +* Changes: + 2009-10-22: lineJoin set to round + 2009-10-23: IE full circle fix, donut + 2009-11-11: Added basic hover from btburnett3 - does not work in IE, and center is off in Chrome and Opera + 2009-11-17: Added IE hover capability submitted by Anthony Aragues + 2009-11-18: Added bug fix submitted by Xavi Ivars (issues with arrays when other JS libraries are included as well) + + +Available options are: +series: { + pie: { + show: true/false + radius: 0-1 for percentage of fullsize, or a specified pixel length, or 'auto' + innerRadius: 0-1 for percentage of fullsize or a specified pixel length, for creating a donut effect + startAngle: 0-2 factor of PI used for starting angle (in radians) i.e 3/2 starts at the top, 0 and 2 have the same result + tilt: 0-1 for percentage to tilt the pie, where 1 is no tilt, and 0 is completely flat (nothing will show) + offset: { + top: integer value to move the pie up or down + left: integer value to move the pie left or right, or 'auto' + }, + stroke: { + color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#FFF') + width: integer pixel width of the stroke + }, + label: { + show: true/false, or 'auto' + formatter: a user-defined function that modifies the text/style of the label text + radius: 0-1 for percentage of fullsize, or a specified pixel length + background: { + color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#000') + opacity: 0-1 + }, + threshold: 0-1 for the percentage value at which to hide labels (if they're too small) + }, + combine: { + threshold: 0-1 for the percentage value at which to combine slices (if they're too small) + color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#CCC'), if null, the plugin will automatically use the color of the first slice to be combined + label: any text value of what the combined slice should be labeled + } + highlight: { + opacity: 0-1 + } + } +} + +More detail and specific examples can be found in the included HTML file. + +*/ + +(function ($) +{ + function init(plot) // this is the "body" of the plugin + { + var canvas = null; + var target = null; + var maxRadius = null; + var centerLeft = null; + var centerTop = null; + var total = 0; + var redraw = true; + var redrawAttempts = 10; + var shrink = 0.95; + var legendWidth = 0; + var processed = false; + var raw = false; + + // interactive variables + var highlights = []; + + // add hook to determine if pie plugin in enabled, and then perform necessary operations + plot.hooks.processOptions.push(checkPieEnabled); + plot.hooks.bindEvents.push(bindEvents); + + // check to see if the pie plugin is enabled + function checkPieEnabled(plot, options) + { + if (options.series.pie.show) + { + //disable grid + options.grid.show = false; + + // set labels.show + if (options.series.pie.label.show=='auto') + if (options.legend.show) + options.series.pie.label.show = false; + else + options.series.pie.label.show = true; + + // set radius + if (options.series.pie.radius=='auto') + if (options.series.pie.label.show) + options.series.pie.radius = 3/4; + else + options.series.pie.radius = 1; + + // ensure sane tilt + if (options.series.pie.tilt>1) + options.series.pie.tilt=1; + if (options.series.pie.tilt<0) + options.series.pie.tilt=0; + + // add processData hook to do transformations on the data + plot.hooks.processDatapoints.push(processDatapoints); + plot.hooks.drawOverlay.push(drawOverlay); + + // add draw hook + plot.hooks.draw.push(draw); + } + } + + // bind hoverable events + function bindEvents(plot, eventHolder) + { + var options = plot.getOptions(); + + if (options.series.pie.show && options.grid.hoverable) + eventHolder.unbind('mousemove').mousemove(onMouseMove); + + if (options.series.pie.show && options.grid.clickable) + eventHolder.unbind('click').click(onClick); + } + + + // debugging function that prints out an object + function alertObject(obj) + { + var msg = ''; + function traverse(obj, depth) + { + if (!depth) + depth = 0; + for (var i = 0; i < obj.length; ++i) + { + for (var j=0; j<depth; j++) + msg += '\t'; + + if( typeof obj[i] == "object") + { // its an object + msg += ''+i+':\n'; + traverse(obj[i], depth+1); + } + else + { // its a value + msg += ''+i+': '+obj[i]+'\n'; + } + } + } + traverse(obj); + alert(msg); + } + + function calcTotal(data) + { + for (var i = 0; i < data.length; ++i) + { + var item = parseFloat(data[i].data[0][1]); + if (item) + total += item; + } + } + + function processDatapoints(plot, series, data, datapoints) + { + if (!processed) + { + processed = true; + + canvas = plot.getCanvas(); + target = $(canvas).parent(); + options = plot.getOptions(); + + plot.setData(combine(plot.getData())); + } + } + + function setupPie() + { + legendWidth = target.children().filter('.legend').children().width(); + + // calculate maximum radius and center point + maxRadius = Math.min(canvas.width,(canvas.height/options.series.pie.tilt))/2; + centerTop = (canvas.height/2)+options.series.pie.offset.top; + centerLeft = (canvas.width/2); + + if (options.series.pie.offset.left=='auto') + if (options.legend.position.match('w')) + centerLeft += legendWidth/2; + else + centerLeft -= legendWidth/2; + else + centerLeft += options.series.pie.offset.left; + + if (centerLeft<maxRadius) + centerLeft = maxRadius; + else if (centerLeft>canvas.width-maxRadius) + centerLeft = canvas.width-maxRadius; + } + + function fixData(data) + { + for (var i = 0; i < data.length; ++i) + { + if (typeof(data[i].data)=='number') + data[i].data = [[1,data[i].data]]; + else if (typeof(data[i].data)=='undefined' || typeof(data[i].data[0])=='undefined') + { + if (typeof(data[i].data)!='undefined' && typeof(data[i].data.label)!='undefined') + data[i].label = data[i].data.label; // fix weirdness coming from flot + data[i].data = [[1,0]]; + + } + } + return data; + } + + function combine(data) + { + data = fixData(data); + calcTotal(data); + var combined = 0; + var numCombined = 0; + var color = options.series.pie.combine.color; + + var newdata = []; + for (var i = 0; i < data.length; ++i) + { + // make sure its a number + data[i].data[0][1] = parseFloat(data[i].data[0][1]); + if (!data[i].data[0][1]) + data[i].data[0][1] = 0; + + if (data[i].data[0][1]/total<=options.series.pie.combine.threshold) + { + combined += data[i].data[0][1]; + numCombined++; + if (!color) + color = data[i].color; + } + else + { + newdata.push({ + data: [[1,data[i].data[0][1]]], + color: data[i].color, + label: data[i].label, + angle: (data[i].data[0][1]*(Math.PI*2))/total, + percent: (data[i].data[0][1]/total*100) + }); + } + } + if (numCombined>0) + newdata.push({ + data: [[1,combined]], + color: color, + label: options.series.pie.combine.label, + angle: (combined*(Math.PI*2))/total, + percent: (combined/total*100) + }); + return newdata; + } + + function draw(plot, newCtx) + { + if (!target) return; // if no series were passed + ctx = newCtx; + + setupPie(); + var slices = plot.getData(); + + var attempts = 0; + while (redraw && attempts<redrawAttempts) + { + redraw = false; + if (attempts>0) + maxRadius *= shrink; + attempts += 1; + clear(); + if (options.series.pie.tilt<=0.8) + drawShadow(); + drawPie(); + } + if (attempts >= redrawAttempts) { + clear(); + target.prepend('<div class="error">Could not draw pie with labels contained inside canvas</div>'); + } + + if ( plot.setSeries && plot.insertLegend ) + { + plot.setSeries(slices); + plot.insertLegend(); + } + + // we're actually done at this point, just defining internal functions at this point + + function clear() + { + ctx.clearRect(0,0,canvas.width,canvas.height); + target.children().filter('.pieLabel, .pieLabelBackground').remove(); + } + + function drawShadow() + { + var shadowLeft = 5; + var shadowTop = 15; + var edge = 10; + var alpha = 0.02; + + // set radius + if (options.series.pie.radius>1) + var radius = options.series.pie.radius; + else + var radius = maxRadius * options.series.pie.radius; + + if (radius>=(canvas.width/2)-shadowLeft || radius*options.series.pie.tilt>=(canvas.height/2)-shadowTop || radius<=edge) + return; // shadow would be outside canvas, so don't draw it + + ctx.save(); + ctx.translate(shadowLeft,shadowTop); + ctx.globalAlpha = alpha; + ctx.fillStyle = '#000'; + + // center and rotate to starting position + ctx.translate(centerLeft,centerTop); + ctx.scale(1, options.series.pie.tilt); + + //radius -= edge; + for (var i=1; i<=edge; i++) + { + ctx.beginPath(); + ctx.arc(0,0,radius,0,Math.PI*2,false); + ctx.fill(); + radius -= i; + } + + ctx.restore(); + } + + function drawPie() + { + startAngle = Math.PI*options.series.pie.startAngle; + + // set radius + if (options.series.pie.radius>1) + var radius = options.series.pie.radius; + else + var radius = maxRadius * options.series.pie.radius; + + // center and rotate to starting position + ctx.save(); + ctx.translate(centerLeft,centerTop); + ctx.scale(1, options.series.pie.tilt); + //ctx.rotate(startAngle); // start at top; -- This doesn't work properly in Opera + + // draw slices + ctx.save(); + var currentAngle = startAngle; + for (var i = 0; i < slices.length; ++i) + { + slices[i].startAngle = currentAngle; + drawSlice(slices[i].angle, slices[i].color, true); + } + ctx.restore(); + + // draw slice outlines + ctx.save(); + ctx.lineWidth = options.series.pie.stroke.width; + currentAngle = startAngle; + for (var i = 0; i < slices.length; ++i) + drawSlice(slices[i].angle, options.series.pie.stroke.color, false); + ctx.restore(); + + // draw donut hole + drawDonutHole(ctx); + + // draw labels + if (options.series.pie.label.show) + drawLabels(); + + // restore to original state + ctx.restore(); + + function drawSlice(angle, color, fill) + { + if (angle<=0) + return; + + if (fill) + ctx.fillStyle = color; + else + { + ctx.strokeStyle = color; + ctx.lineJoin = 'round'; + } + + ctx.beginPath(); + if (Math.abs(angle - Math.PI*2) > 0.000000001) + ctx.moveTo(0,0); // Center of the pie + else if ($.browser.msie) + angle -= 0.0001; + //ctx.arc(0,0,radius,0,angle,false); // This doesn't work properly in Opera + ctx.arc(0,0,radius,currentAngle,currentAngle+angle,false); + ctx.closePath(); + //ctx.rotate(angle); // This doesn't work properly in Opera + currentAngle += angle; + + if (fill) + ctx.fill(); + else + ctx.stroke(); + } + + function drawLabels() + { + var currentAngle = startAngle; + + // set radius + if (options.series.pie.label.radius>1) + var radius = options.series.pie.label.radius; + else + var radius = maxRadius * options.series.pie.label.radius; + + for (var i = 0; i < slices.length; ++i) + { + if (slices[i].percent >= options.series.pie.label.threshold*100) + drawLabel(slices[i], currentAngle, i); + currentAngle += slices[i].angle; + } + + function drawLabel(slice, startAngle, index) + { + if (slice.data[0][1]==0) + return; + + // format label text + var lf = options.legend.labelFormatter, text, plf = options.series.pie.label.formatter; + if (lf) + text = lf(slice.label, slice); + else + text = slice.label; + if (plf) + text = plf(text, slice); + + var halfAngle = ((startAngle+slice.angle) + startAngle)/2; + var x = centerLeft + Math.round(Math.cos(halfAngle) * radius); + var y = centerTop + Math.round(Math.sin(halfAngle) * radius) * options.series.pie.tilt; + + var html = '<span class="pieLabel" id="pieLabel'+index+'" style="position:absolute;top:' + y + 'px;left:' + x + 'px;">' + text + "</span>"; + target.append(html); + var label = target.children('#pieLabel'+index); + var labelTop = (y - label.height()/2); + var labelLeft = (x - label.width()/2); + label.css('top', labelTop); + label.css('left', labelLeft); + + // check to make sure that the label is not outside the canvas + if (0-labelTop>0 || 0-labelLeft>0 || canvas.height-(labelTop+label.height())<0 || canvas.width-(labelLeft+label.width())<0) + redraw = true; + + if (options.series.pie.label.background.opacity != 0) { + // put in the transparent background separately to avoid blended labels and label boxes + var c = options.series.pie.label.background.color; + if (c == null) { + c = slice.color; + } + var pos = 'top:'+labelTop+'px;left:'+labelLeft+'px;'; + $('<div class="pieLabelBackground" style="position:absolute;width:' + label.width() + 'px;height:' + label.height() + 'px;' + pos +'background-color:' + c + ';"> </div>').insertBefore(label).css('opacity', options.series.pie.label.background.opacity); + } + } // end individual label function + } // end drawLabels function + } // end drawPie function + } // end draw function + + // Placed here because it needs to be accessed from multiple locations + function drawDonutHole(layer) + { + // draw donut hole + if(options.series.pie.innerRadius > 0) + { + // subtract the center + layer.save(); + innerRadius = options.series.pie.innerRadius > 1 ? options.series.pie.innerRadius : maxRadius * options.series.pie.innerRadius; + layer.globalCompositeOperation = 'destination-out'; // this does not work with excanvas, but it will fall back to using the stroke color + layer.beginPath(); + layer.fillStyle = options.series.pie.stroke.color; + layer.arc(0,0,innerRadius,0,Math.PI*2,false); + layer.fill(); + layer.closePath(); + layer.restore(); + + // add inner stroke + layer.save(); + layer.beginPath(); + layer.strokeStyle = options.series.pie.stroke.color; + layer.arc(0,0,innerRadius,0,Math.PI*2,false); + layer.stroke(); + layer.closePath(); + layer.restore(); + // TODO: add extra shadow inside hole (with a mask) if the pie is tilted. + } + } + + //-- Additional Interactive related functions -- + + function isPointInPoly(poly, pt) + { + for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i) + ((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || (poly[j][1] <= pt[1] && pt[1]< poly[i][1])) + && (pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0]) + && (c = !c); + return c; + } + + function findNearbySlice(mouseX, mouseY) + { + var slices = plot.getData(), + options = plot.getOptions(), + radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; + + for (var i = 0; i < slices.length; ++i) + { + var s = slices[i]; + + if(s.pie.show) + { + ctx.save(); + ctx.beginPath(); + ctx.moveTo(0,0); // Center of the pie + //ctx.scale(1, options.series.pie.tilt); // this actually seems to break everything when here. + ctx.arc(0,0,radius,s.startAngle,s.startAngle+s.angle,false); + ctx.closePath(); + x = mouseX-centerLeft; + y = mouseY-centerTop; + if(ctx.isPointInPath) + { + if (ctx.isPointInPath(mouseX-centerLeft, mouseY-centerTop)) + { + //alert('found slice!'); + ctx.restore(); + return {datapoint: [s.percent, s.data], dataIndex: 0, series: s, seriesIndex: i}; + } + } + else + { + // excanvas for IE doesn;t support isPointInPath, this is a workaround. + p1X = (radius * Math.cos(s.startAngle)); + p1Y = (radius * Math.sin(s.startAngle)); + p2X = (radius * Math.cos(s.startAngle+(s.angle/4))); + p2Y = (radius * Math.sin(s.startAngle+(s.angle/4))); + p3X = (radius * Math.cos(s.startAngle+(s.angle/2))); + p3Y = (radius * Math.sin(s.startAngle+(s.angle/2))); + p4X = (radius * Math.cos(s.startAngle+(s.angle/1.5))); + p4Y = (radius * Math.sin(s.startAngle+(s.angle/1.5))); + p5X = (radius * Math.cos(s.startAngle+s.angle)); + p5Y = (radius * Math.sin(s.startAngle+s.angle)); + arrPoly = [[0,0],[p1X,p1Y],[p2X,p2Y],[p3X,p3Y],[p4X,p4Y],[p5X,p5Y]]; + arrPoint = [x,y]; + // TODO: perhaps do some mathmatical trickery here with the Y-coordinate to compensate for pie tilt? + if(isPointInPoly(arrPoly, arrPoint)) + { + ctx.restore(); + return {datapoint: [s.percent, s.data], dataIndex: 0, series: s, seriesIndex: i}; + } + } + ctx.restore(); + } + } + + return null; + } + + function onMouseMove(e) + { + triggerClickHoverEvent('plothover', e); + } + + function onClick(e) + { + triggerClickHoverEvent('plotclick', e); + } + + // trigger click or hover event (they send the same parameters so we share their code) + function triggerClickHoverEvent(eventname, e) + { + var offset = plot.offset(), + canvasX = parseInt(e.pageX - offset.left), + canvasY = parseInt(e.pageY - offset.top), + item = findNearbySlice(canvasX, canvasY); + + if (options.grid.autoHighlight) + { + // clear auto-highlights + for (var i = 0; i < highlights.length; ++i) + { + var h = highlights[i]; + if (h.auto == eventname && !(item && h.series == item.series)) + unhighlight(h.series); + } + } + + // highlight the slice + if (item) + highlight(item.series, eventname); + + // trigger any hover bind events + var pos = { pageX: e.pageX, pageY: e.pageY }; + target.trigger(eventname, [ pos, item ]); + } + + function highlight(s, auto) + { + if (typeof s == "number") + s = series[s]; + + var i = indexOfHighlight(s); + if (i == -1) + { + highlights.push({ series: s, auto: auto }); + plot.triggerRedrawOverlay(); + } + else if (!auto) + highlights[i].auto = false; + } + + function unhighlight(s) + { + if (s == null) + { + highlights = []; + plot.triggerRedrawOverlay(); + } + + if (typeof s == "number") + s = series[s]; + + var i = indexOfHighlight(s); + if (i != -1) + { + highlights.splice(i, 1); + plot.triggerRedrawOverlay(); + } + } + + function indexOfHighlight(s) + { + for (var i = 0; i < highlights.length; ++i) + { + var h = highlights[i]; + if (h.series == s) + return i; + } + return -1; + } + + function drawOverlay(plot, octx) + { + //alert(options.series.pie.radius); + var options = plot.getOptions(); + //alert(options.series.pie.radius); + + var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; + + octx.save(); + octx.translate(centerLeft, centerTop); + octx.scale(1, options.series.pie.tilt); + + for (i = 0; i < highlights.length; ++i) + drawHighlight(highlights[i].series); + + drawDonutHole(octx); + + octx.restore(); + + function drawHighlight(series) + { + if (series.angle < 0) return; + + //octx.fillStyle = parseColor(options.series.pie.highlight.color).scale(null, null, null, options.series.pie.highlight.opacity).toString(); + octx.fillStyle = "rgba(255, 255, 255, "+options.series.pie.highlight.opacity+")"; // this is temporary until we have access to parseColor + + octx.beginPath(); + if (Math.abs(series.angle - Math.PI*2) > 0.000000001) + octx.moveTo(0,0); // Center of the pie + octx.arc(0,0,radius,series.startAngle,series.startAngle+series.angle,false); + octx.closePath(); + octx.fill(); + } + + } + + } // end init (plugin body) + + // define pie specific options and their default values + var options = { + series: { + pie: { + show: false, + radius: 'auto', // actual radius of the visible pie (based on full calculated radius if <=1, or hard pixel value) + innerRadius:0, /* for donut */ + startAngle: 3/2, + tilt: 1, + offset: { + top: 0, + left: 'auto' + }, + stroke: { + color: '#FFF', + width: 1 + }, + label: { + show: 'auto', + formatter: function(label, slice){ + return '<div style="font-size:x-small;text-align:center;padding:2px;color:'+slice.color+';">'+label+'<br/>'+Math.round(slice.percent)+'%</div>'; + }, // formatter function + radius: 1, // radius at which to place the labels (based on full calculated radius if <=1, or hard pixel value) + background: { + color: null, + opacity: 0 + }, + threshold: 0 // percentage at which to hide the label (i.e. the slice is too narrow) + }, + combine: { + threshold: -1, // percentage at which to combine little slices into one larger slice + color: null, // color to give the new slice (auto-generated if null) + label: 'Other' // label to give the new slice + }, + highlight: { + //color: '#FFF', // will add this functionality once parseColor is available + opacity: 0.5 + } + } + } + }; + + $.plot.plugins.push({ + init: init, + options: options, + name: "pie", + version: "1.0" + }); +})(jQuery); diff --git a/theme/bootstrap/views/js/plugins/flot/jquery.flot.resize.js b/theme/bootstrap/views/js/plugins/flot/jquery.flot.resize.js new file mode 100644 index 0000000..1178425 --- /dev/null +++ b/theme/bootstrap/views/js/plugins/flot/jquery.flot.resize.js @@ -0,0 +1,60 @@ +/* Flot plugin for automatically redrawing plots as the placeholder resizes. + +Copyright (c) 2007-2013 IOLA and Ole Laursen. +Licensed under the MIT license. + +It works by listening for changes on the placeholder div (through the jQuery +resize event plugin) - if the size changes, it will redraw the plot. + +There are no options. If you need to disable the plugin for some plots, you +can just fix the size of their placeholders. + +*/ + +/* Inline dependency: + * jQuery resize event - v1.1 - 3/14/2010 + * http://benalman.com/projects/jquery-resize-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ + +(function($,h,c){var a=$([]),e=$.resize=$.extend($.resize,{}),i,k="setTimeout",j="resize",d=j+"-special-event",b="delay",f="throttleWindow";e[b]=250;e[f]=true;$.event.special[j]={setup:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.add(l);$.data(this,d,{w:l.width(),h:l.height()});if(a.length===1){g()}},teardown:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.not(l);l.removeData(d);if(!a.length){clearTimeout(i)}},add:function(l){if(!e[f]&&this[k]){return false}var n;function m(s,o,p){var q=$(this),r=$.data(this,d);r.w=o!==c?o:q.width();r.h=p!==c?p:q.height();n.apply(this,arguments)}if($.isFunction(l)){n=l;return m}else{n=l.handler;l.handler=m}}};function g(){i=h[k](function(){a.each(function(){var n=$(this),m=n.width(),l=n.height(),o=$.data(this,d);if(m!==o.w||l!==o.h){n.trigger(j,[o.w=m,o.h=l])}});g()},e[b])}})(jQuery,this); + +(function ($) { + var options = { }; // no options + + function init(plot) { + function onResize() { + var placeholder = plot.getPlaceholder(); + + // somebody might have hidden us and we can't plot + // when we don't have the dimensions + if (placeholder.width() == 0 || placeholder.height() == 0) + return; + + plot.resize(); + plot.setupGrid(); + plot.draw(); + } + + function bindEvents(plot, eventHolder) { + plot.getPlaceholder().resize(onResize); + } + + function shutdown(plot, eventHolder) { + plot.getPlaceholder().unbind("resize", onResize); + } + + plot.hooks.bindEvents.push(bindEvents); + plot.hooks.shutdown.push(shutdown); + } + + $.plot.plugins.push({ + init: init, + options: options, + name: 'resize', + version: '1.0' + }); +})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/views/js/plugins/flot/jquery.flot.tooltip.min.js b/theme/bootstrap/views/js/plugins/flot/jquery.flot.tooltip.min.js new file mode 100644 index 0000000..09e3bbf --- /dev/null +++ b/theme/bootstrap/views/js/plugins/flot/jquery.flot.tooltip.min.js @@ -0,0 +1,12 @@ +/* + * jquery.flot.tooltip + * + * description: easy-to-use tooltips for Flot charts + * version: 0.6.2 + * author: Krzysztof Urbas @krzysu [myviews.pl] + * website: https://github.com/krzysu/flot.tooltip + * + * build on 2013-09-30 + * released under MIT License, 2012 +*/ +(function(t){var o={tooltip:!1,tooltipOpts:{content:"%s | X: %x | Y: %y",xDateFormat:null,yDateFormat:null,shifts:{x:10,y:20},defaultTheme:!0,onHover:function(){}}},i=function(t){this.tipPosition={x:0,y:0},this.init(t)};i.prototype.init=function(o){function i(t){var o={};o.x=t.pageX,o.y=t.pageY,s.updateTooltipPosition(o)}function e(t,o,i){var e=s.getDomElement();if(i){var n;n=s.stringFormat(s.tooltipOptions.content,i),e.html(n),s.updateTooltipPosition({x:o.pageX,y:o.pageY}),e.css({left:s.tipPosition.x+s.tooltipOptions.shifts.x,top:s.tipPosition.y+s.tooltipOptions.shifts.y}).show(),"function"==typeof s.tooltipOptions.onHover&&s.tooltipOptions.onHover(i,e)}else e.hide().html("")}var s=this;o.hooks.bindEvents.push(function(o,n){s.plotOptions=o.getOptions(),s.plotOptions.tooltip!==!1&&void 0!==s.plotOptions.tooltip&&(s.tooltipOptions=s.plotOptions.tooltipOpts,s.getDomElement(),t(o.getPlaceholder()).bind("plothover",e),t(n).bind("mousemove",i))}),o.hooks.shutdown.push(function(o,s){t(o.getPlaceholder()).unbind("plothover",e),t(s).unbind("mousemove",i)})},i.prototype.getDomElement=function(){var o;return t("#flotTip").length>0?o=t("#flotTip"):(o=t("<div />").attr("id","flotTip"),o.appendTo("body").hide().css({position:"absolute"}),this.tooltipOptions.defaultTheme&&o.css({background:"#fff","z-index":"100",padding:"0.4em 0.6em","border-radius":"0.5em","font-size":"0.8em",border:"1px solid #111",display:"none","white-space":"nowrap"})),o},i.prototype.updateTooltipPosition=function(o){var i=t("#flotTip").outerWidth()+this.tooltipOptions.shifts.x,e=t("#flotTip").outerHeight()+this.tooltipOptions.shifts.y;o.x-t(window).scrollLeft()>t(window).innerWidth()-i&&(o.x-=i),o.y-t(window).scrollTop()>t(window).innerHeight()-e&&(o.y-=e),this.tipPosition.x=o.x,this.tipPosition.y=o.y},i.prototype.stringFormat=function(t,o){var i=/%p\.{0,1}(\d{0,})/,e=/%s/,s=/%x\.{0,1}(?:\d{0,})/,n=/%y\.{0,1}(?:\d{0,})/;return"function"==typeof t&&(t=t(o.series.label,o.series.data[o.dataIndex][0],o.series.data[o.dataIndex][1],o)),o.series.percent!==void 0&&(t=this.adjustValPrecision(i,t,o.series.percent)),o.series.label!==void 0&&(t=t.replace(e,o.series.label)),this.isTimeMode("xaxis",o)&&this.isXDateFormat(o)&&(t=t.replace(s,this.timestampToDate(o.series.data[o.dataIndex][0],this.tooltipOptions.xDateFormat))),this.isTimeMode("yaxis",o)&&this.isYDateFormat(o)&&(t=t.replace(n,this.timestampToDate(o.series.data[o.dataIndex][1],this.tooltipOptions.yDateFormat))),"number"==typeof o.series.data[o.dataIndex][0]&&(t=this.adjustValPrecision(s,t,o.series.data[o.dataIndex][0])),"number"==typeof o.series.data[o.dataIndex][1]&&(t=this.adjustValPrecision(n,t,o.series.data[o.dataIndex][1])),o.series.xaxis.tickFormatter!==void 0&&(t=t.replace(s,o.series.xaxis.tickFormatter(o.series.data[o.dataIndex][0],o.series.xaxis))),o.series.yaxis.tickFormatter!==void 0&&(t=t.replace(n,o.series.yaxis.tickFormatter(o.series.data[o.dataIndex][1],o.series.yaxis))),t},i.prototype.isTimeMode=function(t,o){return o.series[t].options.mode!==void 0&&"time"===o.series[t].options.mode},i.prototype.isXDateFormat=function(){return this.tooltipOptions.xDateFormat!==void 0&&null!==this.tooltipOptions.xDateFormat},i.prototype.isYDateFormat=function(){return this.tooltipOptions.yDateFormat!==void 0&&null!==this.tooltipOptions.yDateFormat},i.prototype.timestampToDate=function(o,i){var e=new Date(o);return t.plot.formatDate(e,i)},i.prototype.adjustValPrecision=function(t,o,i){var e,s=o.match(t);return null!==s&&""!==RegExp.$1&&(e=RegExp.$1,i=i.toFixed(e),o=o.replace(t,i)),o};var e=function(t){new i(t)};t.plot.plugins.push({init:e,options:o,name:"tooltip",version:"0.6.1"})})(jQuery); \ No newline at end of file diff --git a/theme/bootstrap/views/js/plugins/morris/morris-data.js b/theme/bootstrap/views/js/plugins/morris/morris-data.js new file mode 100644 index 0000000..f9dcb05 --- /dev/null +++ b/theme/bootstrap/views/js/plugins/morris/morris-data.js @@ -0,0 +1,227 @@ +// Morris.js Charts sample data for SB Admin template + +$(function() { + + // Area Chart + Morris.Area({ + element: 'morris-area-chart', + data: [{ + period: '2010 Q1', + iphone: 2666, + ipad: null, + itouch: 2647 + }, { + period: '2010 Q2', + iphone: 2778, + ipad: 2294, + itouch: 2441 + }, { + period: '2010 Q3', + iphone: 4912, + ipad: 1969, + itouch: 2501 + }, { + period: '2010 Q4', + iphone: 3767, + ipad: 3597, + itouch: 5689 + }, { + period: '2011 Q1', + iphone: 6810, + ipad: 1914, + itouch: 2293 + }, { + period: '2011 Q2', + iphone: 5670, + ipad: 4293, + itouch: 1881 + }, { + period: '2011 Q3', + iphone: 4820, + ipad: 3795, + itouch: 1588 + }, { + period: '2011 Q4', + iphone: 15073, + ipad: 5967, + itouch: 5175 + }, { + period: '2012 Q1', + iphone: 10687, + ipad: 4460, + itouch: 2028 + }, { + period: '2012 Q2', + iphone: 8432, + ipad: 5713, + itouch: 1791 + }], + xkey: 'period', + ykeys: ['iphone', 'ipad', 'itouch'], + labels: ['iPhone', 'iPad', 'iPod Touch'], + pointSize: 2, + hideHover: 'auto', + resize: true + }); + + // Donut Chart + Morris.Donut({ + element: 'morris-donut-chart', + data: [{ + label: "Download Sales", + value: 12 + }, { + label: "In-Store Sales", + value: 30 + }, { + label: "Mail-Order Sales", + value: 20 + }], + resize: true + }); + + // Line Chart + Morris.Line({ + // ID of the element in which to draw the chart. + element: 'morris-line-chart', + // Chart data records -- each entry in this array corresponds to a point on + // the chart. + data: [{ + d: '2012-10-01', + visits: 802 + }, { + d: '2012-10-02', + visits: 783 + }, { + d: '2012-10-03', + visits: 820 + }, { + d: '2012-10-04', + visits: 839 + }, { + d: '2012-10-05', + visits: 792 + }, { + d: '2012-10-06', + visits: 859 + }, { + d: '2012-10-07', + visits: 790 + }, { + d: '2012-10-08', + visits: 1680 + }, { + d: '2012-10-09', + visits: 1592 + }, { + d: '2012-10-10', + visits: 1420 + }, { + d: '2012-10-11', + visits: 882 + }, { + d: '2012-10-12', + visits: 889 + }, { + d: '2012-10-13', + visits: 819 + }, { + d: '2012-10-14', + visits: 849 + }, { + d: '2012-10-15', + visits: 870 + }, { + d: '2012-10-16', + visits: 1063 + }, { + d: '2012-10-17', + visits: 1192 + }, { + d: '2012-10-18', + visits: 1224 + }, { + d: '2012-10-19', + visits: 1329 + }, { + d: '2012-10-20', + visits: 1329 + }, { + d: '2012-10-21', + visits: 1239 + }, { + d: '2012-10-22', + visits: 1190 + }, { + d: '2012-10-23', + visits: 1312 + }, { + d: '2012-10-24', + visits: 1293 + }, { + d: '2012-10-25', + visits: 1283 + }, { + d: '2012-10-26', + visits: 1248 + }, { + d: '2012-10-27', + visits: 1323 + }, { + d: '2012-10-28', + visits: 1390 + }, { + d: '2012-10-29', + visits: 1420 + }, { + d: '2012-10-30', + visits: 1529 + }, { + d: '2012-10-31', + visits: 1892 + }, ], + // The name of the data record attribute that contains x-visitss. + xkey: 'd', + // A list of names of data record attributes that contain y-visitss. + ykeys: ['visits'], + // Labels for the ykeys -- will be displayed when you hover over the + // chart. + labels: ['Visits'], + // Disables line smoothing + smooth: false, + resize: true + }); + + // Bar Chart + Morris.Bar({ + element: 'morris-bar-chart', + data: [{ + device: 'iPhone', + geekbench: 136 + }, { + device: 'iPhone 3G', + geekbench: 137 + }, { + device: 'iPhone 3GS', + geekbench: 275 + }, { + device: 'iPhone 4', + geekbench: 380 + }, { + device: 'iPhone 4S', + geekbench: 655 + }, { + device: 'iPhone 5', + geekbench: 1571 + }], + xkey: 'device', + ykeys: ['geekbench'], + labels: ['Geekbench'], + barRatio: 0.4, + xLabelAngle: 35, + hideHover: 'auto', + resize: true + }); + + +}); diff --git a/theme/bootstrap/views/js/plugins/morris/morris.js b/theme/bootstrap/views/js/plugins/morris/morris.js new file mode 100644 index 0000000..3a1a830 --- /dev/null +++ b/theme/bootstrap/views/js/plugins/morris/morris.js @@ -0,0 +1,1892 @@ +/* @license +morris.js v0.5.0 +Copyright 2014 Olly Smith All rights reserved. +Licensed under the BSD-2-Clause License. +*/ + + +(function() { + var $, Morris, minutesSpecHelper, secondsSpecHelper, + __slice = [].slice, + __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + __hasProp = {}.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; + + Morris = window.Morris = {}; + + $ = jQuery; + + Morris.EventEmitter = (function() { + function EventEmitter() {} + + EventEmitter.prototype.on = function(name, handler) { + if (this.handlers == null) { + this.handlers = {}; + } + if (this.handlers[name] == null) { + this.handlers[name] = []; + } + this.handlers[name].push(handler); + return this; + }; + + EventEmitter.prototype.fire = function() { + var args, handler, name, _i, _len, _ref, _results; + name = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; + if ((this.handlers != null) && (this.handlers[name] != null)) { + _ref = this.handlers[name]; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + handler = _ref[_i]; + _results.push(handler.apply(null, args)); + } + return _results; + } + }; + + return EventEmitter; + + })(); + + Morris.commas = function(num) { + var absnum, intnum, ret, strabsnum; + if (num != null) { + ret = num < 0 ? "-" : ""; + absnum = Math.abs(num); + intnum = Math.floor(absnum).toFixed(0); + ret += intnum.replace(/(?=(?:\d{3})+$)(?!^)/g, ','); + strabsnum = absnum.toString(); + if (strabsnum.length > intnum.length) { + ret += strabsnum.slice(intnum.length); + } + return ret; + } else { + return '-'; + } + }; + + Morris.pad2 = function(number) { + return (number < 10 ? '0' : '') + number; + }; + + Morris.Grid = (function(_super) { + __extends(Grid, _super); + + function Grid(options) { + this.resizeHandler = __bind(this.resizeHandler, this); + var _this = this; + if (typeof options.element === 'string') { + this.el = $(document.getElementById(options.element)); + } else { + this.el = $(options.element); + } + if ((this.el == null) || this.el.length === 0) { + throw new Error("Graph container element not found"); + } + if (this.el.css('position') === 'static') { + this.el.css('position', 'relative'); + } + this.options = $.extend({}, this.gridDefaults, this.defaults || {}, options); + if (typeof this.options.units === 'string') { + this.options.postUnits = options.units; + } + this.raphael = new Raphael(this.el[0]); + this.elementWidth = null; + this.elementHeight = null; + this.dirty = false; + this.selectFrom = null; + if (this.init) { + this.init(); + } + this.setData(this.options.data); + this.el.bind('mousemove', function(evt) { + var left, offset, right, width, x; + offset = _this.el.offset(); + x = evt.pageX - offset.left; + if (_this.selectFrom) { + left = _this.data[_this.hitTest(Math.min(x, _this.selectFrom))]._x; + right = _this.data[_this.hitTest(Math.max(x, _this.selectFrom))]._x; + width = right - left; + return _this.selectionRect.attr({ + x: left, + width: width + }); + } else { + return _this.fire('hovermove', x, evt.pageY - offset.top); + } + }); + this.el.bind('mouseleave', function(evt) { + if (_this.selectFrom) { + _this.selectionRect.hide(); + _this.selectFrom = null; + } + return _this.fire('hoverout'); + }); + this.el.bind('touchstart touchmove touchend', function(evt) { + var offset, touch; + touch = evt.originalEvent.touches[0] || evt.originalEvent.changedTouches[0]; + offset = _this.el.offset(); + return _this.fire('hovermove', touch.pageX - offset.left, touch.pageY - offset.top); + }); + this.el.bind('click', function(evt) { + var offset; + offset = _this.el.offset(); + return _this.fire('gridclick', evt.pageX - offset.left, evt.pageY - offset.top); + }); + if (this.options.rangeSelect) { + this.selectionRect = this.raphael.rect(0, 0, 0, this.el.innerHeight()).attr({ + fill: this.options.rangeSelectColor, + stroke: false + }).toBack().hide(); + this.el.bind('mousedown', function(evt) { + var offset; + offset = _this.el.offset(); + return _this.startRange(evt.pageX - offset.left); + }); + this.el.bind('mouseup', function(evt) { + var offset; + offset = _this.el.offset(); + _this.endRange(evt.pageX - offset.left); + return _this.fire('hovermove', evt.pageX - offset.left, evt.pageY - offset.top); + }); + } + if (this.options.resize) { + $(window).bind('resize', function(evt) { + if (_this.timeoutId != null) { + window.clearTimeout(_this.timeoutId); + } + return _this.timeoutId = window.setTimeout(_this.resizeHandler, 100); + }); + } + this.el.css('-webkit-tap-highlight-color', 'rgba(0,0,0,0)'); + if (this.postInit) { + this.postInit(); + } + } + + Grid.prototype.gridDefaults = { + dateFormat: null, + axes: true, + grid: true, + gridLineColor: '#aaa', + gridStrokeWidth: 0.5, + gridTextColor: '#888', + gridTextSize: 12, + gridTextFamily: 'sans-serif', + gridTextWeight: 'normal', + hideHover: false, + yLabelFormat: null, + xLabelAngle: 0, + numLines: 5, + padding: 25, + parseTime: true, + postUnits: '', + preUnits: '', + ymax: 'auto', + ymin: 'auto 0', + goals: [], + goalStrokeWidth: 1.0, + goalLineColors: ['#666633', '#999966', '#cc6666', '#663333'], + events: [], + eventStrokeWidth: 1.0, + eventLineColors: ['#005a04', '#ccffbb', '#3a5f0b', '#005502'], + rangeSelect: null, + rangeSelectColor: '#eef', + resize: false + }; + + Grid.prototype.setData = function(data, redraw) { + var e, idx, index, maxGoal, minGoal, ret, row, step, total, y, ykey, ymax, ymin, yval, _ref; + if (redraw == null) { + redraw = true; + } + this.options.data = data; + if ((data == null) || data.length === 0) { + this.data = []; + this.raphael.clear(); + if (this.hover != null) { + this.hover.hide(); + } + return; + } + ymax = this.cumulative ? 0 : null; + ymin = this.cumulative ? 0 : null; + if (this.options.goals.length > 0) { + minGoal = Math.min.apply(Math, this.options.goals); + maxGoal = Math.max.apply(Math, this.options.goals); + ymin = ymin != null ? Math.min(ymin, minGoal) : minGoal; + ymax = ymax != null ? Math.max(ymax, maxGoal) : maxGoal; + } + this.data = (function() { + var _i, _len, _results; + _results = []; + for (index = _i = 0, _len = data.length; _i < _len; index = ++_i) { + row = data[index]; + ret = { + src: row + }; + ret.label = row[this.options.xkey]; + if (this.options.parseTime) { + ret.x = Morris.parseDate(ret.label); + if (this.options.dateFormat) { + ret.label = this.options.dateFormat(ret.x); + } else if (typeof ret.label === 'number') { + ret.label = new Date(ret.label).toString(); + } + } else { + ret.x = index; + if (this.options.xLabelFormat) { + ret.label = this.options.xLabelFormat(ret); + } + } + total = 0; + ret.y = (function() { + var _j, _len1, _ref, _results1; + _ref = this.options.ykeys; + _results1 = []; + for (idx = _j = 0, _len1 = _ref.length; _j < _len1; idx = ++_j) { + ykey = _ref[idx]; + yval = row[ykey]; + if (typeof yval === 'string') { + yval = parseFloat(yval); + } + if ((yval != null) && typeof yval !== 'number') { + yval = null; + } + if (yval != null) { + if (this.cumulative) { + total += yval; + } else { + if (ymax != null) { + ymax = Math.max(yval, ymax); + ymin = Math.min(yval, ymin); + } else { + ymax = ymin = yval; + } + } + } + if (this.cumulative && (total != null)) { + ymax = Math.max(total, ymax); + ymin = Math.min(total, ymin); + } + _results1.push(yval); + } + return _results1; + }).call(this); + _results.push(ret); + } + return _results; + }).call(this); + if (this.options.parseTime) { + this.data = this.data.sort(function(a, b) { + return (a.x > b.x) - (b.x > a.x); + }); + } + this.xmin = this.data[0].x; + this.xmax = this.data[this.data.length - 1].x; + this.events = []; + if (this.options.events.length > 0) { + if (this.options.parseTime) { + this.events = (function() { + var _i, _len, _ref, _results; + _ref = this.options.events; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + e = _ref[_i]; + _results.push(Morris.parseDate(e)); + } + return _results; + }).call(this); + } else { + this.events = this.options.events; + } + this.xmax = Math.max(this.xmax, Math.max.apply(Math, this.events)); + this.xmin = Math.min(this.xmin, Math.min.apply(Math, this.events)); + } + if (this.xmin === this.xmax) { + this.xmin -= 1; + this.xmax += 1; + } + this.ymin = this.yboundary('min', ymin); + this.ymax = this.yboundary('max', ymax); + if (this.ymin === this.ymax) { + if (ymin) { + this.ymin -= 1; + } + this.ymax += 1; + } + if (((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'y') || this.options.grid === true) { + if (this.options.ymax === this.gridDefaults.ymax && this.options.ymin === this.gridDefaults.ymin) { + this.grid = this.autoGridLines(this.ymin, this.ymax, this.options.numLines); + this.ymin = Math.min(this.ymin, this.grid[0]); + this.ymax = Math.max(this.ymax, this.grid[this.grid.length - 1]); + } else { + step = (this.ymax - this.ymin) / (this.options.numLines - 1); + this.grid = (function() { + var _i, _ref1, _ref2, _results; + _results = []; + for (y = _i = _ref1 = this.ymin, _ref2 = this.ymax; step > 0 ? _i <= _ref2 : _i >= _ref2; y = _i += step) { + _results.push(y); + } + return _results; + }).call(this); + } + } + this.dirty = true; + if (redraw) { + return this.redraw(); + } + }; + + Grid.prototype.yboundary = function(boundaryType, currentValue) { + var boundaryOption, suggestedValue; + boundaryOption = this.options["y" + boundaryType]; + if (typeof boundaryOption === 'string') { + if (boundaryOption.slice(0, 4) === 'auto') { + if (boundaryOption.length > 5) { + suggestedValue = parseInt(boundaryOption.slice(5), 10); + if (currentValue == null) { + return suggestedValue; + } + return Math[boundaryType](currentValue, suggestedValue); + } else { + if (currentValue != null) { + return currentValue; + } else { + return 0; + } + } + } else { + return parseInt(boundaryOption, 10); + } + } else { + return boundaryOption; + } + }; + + Grid.prototype.autoGridLines = function(ymin, ymax, nlines) { + var gmax, gmin, grid, smag, span, step, unit, y, ymag; + span = ymax - ymin; + ymag = Math.floor(Math.log(span) / Math.log(10)); + unit = Math.pow(10, ymag); + gmin = Math.floor(ymin / unit) * unit; + gmax = Math.ceil(ymax / unit) * unit; + step = (gmax - gmin) / (nlines - 1); + if (unit === 1 && step > 1 && Math.ceil(step) !== step) { + step = Math.ceil(step); + gmax = gmin + step * (nlines - 1); + } + if (gmin < 0 && gmax > 0) { + gmin = Math.floor(ymin / step) * step; + gmax = Math.ceil(ymax / step) * step; + } + if (step < 1) { + smag = Math.floor(Math.log(step) / Math.log(10)); + grid = (function() { + var _i, _results; + _results = []; + for (y = _i = gmin; step > 0 ? _i <= gmax : _i >= gmax; y = _i += step) { + _results.push(parseFloat(y.toFixed(1 - smag))); + } + return _results; + })(); + } else { + grid = (function() { + var _i, _results; + _results = []; + for (y = _i = gmin; step > 0 ? _i <= gmax : _i >= gmax; y = _i += step) { + _results.push(y); + } + return _results; + })(); + } + return grid; + }; + + Grid.prototype._calc = function() { + var bottomOffsets, gridLine, h, i, w, yLabelWidths, _ref, _ref1; + w = this.el.width(); + h = this.el.height(); + if (this.elementWidth !== w || this.elementHeight !== h || this.dirty) { + this.elementWidth = w; + this.elementHeight = h; + this.dirty = false; + this.left = this.options.padding; + this.right = this.elementWidth - this.options.padding; + this.top = this.options.padding; + this.bottom = this.elementHeight - this.options.padding; + if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'y') { + yLabelWidths = (function() { + var _i, _len, _ref1, _results; + _ref1 = this.grid; + _results = []; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + gridLine = _ref1[_i]; + _results.push(this.measureText(this.yAxisFormat(gridLine)).width); + } + return _results; + }).call(this); + this.left += Math.max.apply(Math, yLabelWidths); + } + if ((_ref1 = this.options.axes) === true || _ref1 === 'both' || _ref1 === 'x') { + bottomOffsets = (function() { + var _i, _ref2, _results; + _results = []; + for (i = _i = 0, _ref2 = this.data.length; 0 <= _ref2 ? _i < _ref2 : _i > _ref2; i = 0 <= _ref2 ? ++_i : --_i) { + _results.push(this.measureText(this.data[i].text, -this.options.xLabelAngle).height); + } + return _results; + }).call(this); + this.bottom -= Math.max.apply(Math, bottomOffsets); + } + this.width = Math.max(1, this.right - this.left); + this.height = Math.max(1, this.bottom - this.top); + this.dx = this.width / (this.xmax - this.xmin); + this.dy = this.height / (this.ymax - this.ymin); + if (this.calc) { + return this.calc(); + } + } + }; + + Grid.prototype.transY = function(y) { + return this.bottom - (y - this.ymin) * this.dy; + }; + + Grid.prototype.transX = function(x) { + if (this.data.length === 1) { + return (this.left + this.right) / 2; + } else { + return this.left + (x - this.xmin) * this.dx; + } + }; + + Grid.prototype.redraw = function() { + this.raphael.clear(); + this._calc(); + this.drawGrid(); + this.drawGoals(); + this.drawEvents(); + if (this.draw) { + return this.draw(); + } + }; + + Grid.prototype.measureText = function(text, angle) { + var ret, tt; + if (angle == null) { + angle = 0; + } + tt = this.raphael.text(100, 100, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).rotate(angle); + ret = tt.getBBox(); + tt.remove(); + return ret; + }; + + Grid.prototype.yAxisFormat = function(label) { + return this.yLabelFormat(label); + }; + + Grid.prototype.yLabelFormat = function(label) { + if (typeof this.options.yLabelFormat === 'function') { + return this.options.yLabelFormat(label); + } else { + return "" + this.options.preUnits + (Morris.commas(label)) + this.options.postUnits; + } + }; + + Grid.prototype.drawGrid = function() { + var lineY, y, _i, _len, _ref, _ref1, _ref2, _results; + if (this.options.grid === false && ((_ref = this.options.axes) !== true && _ref !== 'both' && _ref !== 'y')) { + return; + } + _ref1 = this.grid; + _results = []; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + lineY = _ref1[_i]; + y = this.transY(lineY); + if ((_ref2 = this.options.axes) === true || _ref2 === 'both' || _ref2 === 'y') { + this.drawYAxisLabel(this.left - this.options.padding / 2, y, this.yAxisFormat(lineY)); + } + if (this.options.grid) { + _results.push(this.drawGridLine("M" + this.left + "," + y + "H" + (this.left + this.width))); + } else { + _results.push(void 0); + } + } + return _results; + }; + + Grid.prototype.drawGoals = function() { + var color, goal, i, _i, _len, _ref, _results; + _ref = this.options.goals; + _results = []; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + goal = _ref[i]; + color = this.options.goalLineColors[i % this.options.goalLineColors.length]; + _results.push(this.drawGoal(goal, color)); + } + return _results; + }; + + Grid.prototype.drawEvents = function() { + var color, event, i, _i, _len, _ref, _results; + _ref = this.events; + _results = []; + for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { + event = _ref[i]; + color = this.options.eventLineColors[i % this.options.eventLineColors.length]; + _results.push(this.drawEvent(event, color)); + } + return _results; + }; + + Grid.prototype.drawGoal = function(goal, color) { + return this.raphael.path("M" + this.left + "," + (this.transY(goal)) + "H" + this.right).attr('stroke', color).attr('stroke-width', this.options.goalStrokeWidth); + }; + + Grid.prototype.drawEvent = function(event, color) { + return this.raphael.path("M" + (this.transX(event)) + "," + this.bottom + "V" + this.top).attr('stroke', color).attr('stroke-width', this.options.eventStrokeWidth); + }; + + Grid.prototype.drawYAxisLabel = function(xPos, yPos, text) { + return this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor).attr('text-anchor', 'end'); + }; + + Grid.prototype.drawGridLine = function(path) { + return this.raphael.path(path).attr('stroke', this.options.gridLineColor).attr('stroke-width', this.options.gridStrokeWidth); + }; + + Grid.prototype.startRange = function(x) { + this.hover.hide(); + this.selectFrom = x; + return this.selectionRect.attr({ + x: x, + width: 0 + }).show(); + }; + + Grid.prototype.endRange = function(x) { + var end, start; + if (this.selectFrom) { + start = Math.min(this.selectFrom, x); + end = Math.max(this.selectFrom, x); + this.options.rangeSelect.call(this.el, { + start: this.data[this.hitTest(start)].x, + end: this.data[this.hitTest(end)].x + }); + return this.selectFrom = null; + } + }; + + Grid.prototype.resizeHandler = function() { + this.timeoutId = null; + this.raphael.setSize(this.el.width(), this.el.height()); + return this.redraw(); + }; + + return Grid; + + })(Morris.EventEmitter); + + Morris.parseDate = function(date) { + var isecs, m, msecs, n, o, offsetmins, p, q, r, ret, secs; + if (typeof date === 'number') { + return date; + } + m = date.match(/^(\d+) Q(\d)$/); + n = date.match(/^(\d+)-(\d+)$/); + o = date.match(/^(\d+)-(\d+)-(\d+)$/); + p = date.match(/^(\d+) W(\d+)$/); + q = date.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+)(Z|([+-])(\d\d):?(\d\d))?$/); + r = date.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+):(\d+(\.\d+)?)(Z|([+-])(\d\d):?(\d\d))?$/); + if (m) { + return new Date(parseInt(m[1], 10), parseInt(m[2], 10) * 3 - 1, 1).getTime(); + } else if (n) { + return new Date(parseInt(n[1], 10), parseInt(n[2], 10) - 1, 1).getTime(); + } else if (o) { + return new Date(parseInt(o[1], 10), parseInt(o[2], 10) - 1, parseInt(o[3], 10)).getTime(); + } else if (p) { + ret = new Date(parseInt(p[1], 10), 0, 1); + if (ret.getDay() !== 4) { + ret.setMonth(0, 1 + ((4 - ret.getDay()) + 7) % 7); + } + return ret.getTime() + parseInt(p[2], 10) * 604800000; + } else if (q) { + if (!q[6]) { + return new Date(parseInt(q[1], 10), parseInt(q[2], 10) - 1, parseInt(q[3], 10), parseInt(q[4], 10), parseInt(q[5], 10)).getTime(); + } else { + offsetmins = 0; + if (q[6] !== 'Z') { + offsetmins = parseInt(q[8], 10) * 60 + parseInt(q[9], 10); + if (q[7] === '+') { + offsetmins = 0 - offsetmins; + } + } + return Date.UTC(parseInt(q[1], 10), parseInt(q[2], 10) - 1, parseInt(q[3], 10), parseInt(q[4], 10), parseInt(q[5], 10) + offsetmins); + } + } else if (r) { + secs = parseFloat(r[6]); + isecs = Math.floor(secs); + msecs = Math.round((secs - isecs) * 1000); + if (!r[8]) { + return new Date(parseInt(r[1], 10), parseInt(r[2], 10) - 1, parseInt(r[3], 10), parseInt(r[4], 10), parseInt(r[5], 10), isecs, msecs).getTime(); + } else { + offsetmins = 0; + if (r[8] !== 'Z') { + offsetmins = parseInt(r[10], 10) * 60 + parseInt(r[11], 10); + if (r[9] === '+') { + offsetmins = 0 - offsetmins; + } + } + return Date.UTC(parseInt(r[1], 10), parseInt(r[2], 10) - 1, parseInt(r[3], 10), parseInt(r[4], 10), parseInt(r[5], 10) + offsetmins, isecs, msecs); + } + } else { + return new Date(parseInt(date, 10), 0, 1).getTime(); + } + }; + + Morris.Hover = (function() { + Hover.defaults = { + "class": 'morris-hover morris-default-style' + }; + + function Hover(options) { + if (options == null) { + options = {}; + } + this.options = $.extend({}, Morris.Hover.defaults, options); + this.el = $("<div class='" + this.options["class"] + "'></div>"); + this.el.hide(); + this.options.parent.append(this.el); + } + + Hover.prototype.update = function(html, x, y) { + if (!html) { + return this.hide(); + } else { + this.html(html); + this.show(); + return this.moveTo(x, y); + } + }; + + Hover.prototype.html = function(content) { + return this.el.html(content); + }; + + Hover.prototype.moveTo = function(x, y) { + var hoverHeight, hoverWidth, left, parentHeight, parentWidth, top; + parentWidth = this.options.parent.innerWidth(); + parentHeight = this.options.parent.innerHeight(); + hoverWidth = this.el.outerWidth(); + hoverHeight = this.el.outerHeight(); + left = Math.min(Math.max(0, x - hoverWidth / 2), parentWidth - hoverWidth); + if (y != null) { + top = y - hoverHeight - 10; + if (top < 0) { + top = y + 10; + if (top + hoverHeight > parentHeight) { + top = parentHeight / 2 - hoverHeight / 2; + } + } + } else { + top = parentHeight / 2 - hoverHeight / 2; + } + return this.el.css({ + left: left + "px", + top: parseInt(top) + "px" + }); + }; + + Hover.prototype.show = function() { + return this.el.show(); + }; + + Hover.prototype.hide = function() { + return this.el.hide(); + }; + + return Hover; + + })(); + + Morris.Line = (function(_super) { + __extends(Line, _super); + + function Line(options) { + this.hilight = __bind(this.hilight, this); + this.onHoverOut = __bind(this.onHoverOut, this); + this.onHoverMove = __bind(this.onHoverMove, this); + this.onGridClick = __bind(this.onGridClick, this); + if (!(this instanceof Morris.Line)) { + return new Morris.Line(options); + } + Line.__super__.constructor.call(this, options); + } + + Line.prototype.init = function() { + if (this.options.hideHover !== 'always') { + this.hover = new Morris.Hover({ + parent: this.el + }); + this.on('hovermove', this.onHoverMove); + this.on('hoverout', this.onHoverOut); + return this.on('gridclick', this.onGridClick); + } + }; + + Line.prototype.defaults = { + lineWidth: 3, + pointSize: 4, + lineColors: ['#0b62a4', '#7A92A3', '#4da74d', '#afd8f8', '#edc240', '#cb4b4b', '#9440ed'], + pointStrokeWidths: [1], + pointStrokeColors: ['#ffffff'], + pointFillColors: [], + smooth: true, + xLabels: 'auto', + xLabelFormat: null, + xLabelMargin: 24, + hideHover: false + }; + + Line.prototype.calc = function() { + this.calcPoints(); + return this.generatePaths(); + }; + + Line.prototype.calcPoints = function() { + var row, y, _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + row = _ref[_i]; + row._x = this.transX(row.x); + row._y = (function() { + var _j, _len1, _ref1, _results1; + _ref1 = row.y; + _results1 = []; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + y = _ref1[_j]; + if (y != null) { + _results1.push(this.transY(y)); + } else { + _results1.push(y); + } + } + return _results1; + }).call(this); + _results.push(row._ymax = Math.min.apply(Math, [this.bottom].concat((function() { + var _j, _len1, _ref1, _results1; + _ref1 = row._y; + _results1 = []; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + y = _ref1[_j]; + if (y != null) { + _results1.push(y); + } + } + return _results1; + })()))); + } + return _results; + }; + + Line.prototype.hitTest = function(x) { + var index, r, _i, _len, _ref; + if (this.data.length === 0) { + return null; + } + _ref = this.data.slice(1); + for (index = _i = 0, _len = _ref.length; _i < _len; index = ++_i) { + r = _ref[index]; + if (x < (r._x + this.data[index]._x) / 2) { + break; + } + } + return index; + }; + + Line.prototype.onGridClick = function(x, y) { + var index; + index = this.hitTest(x); + return this.fire('click', index, this.data[index].src, x, y); + }; + + Line.prototype.onHoverMove = function(x, y) { + var index; + index = this.hitTest(x); + return this.displayHoverForRow(index); + }; + + Line.prototype.onHoverOut = function() { + if (this.options.hideHover !== false) { + return this.displayHoverForRow(null); + } + }; + + Line.prototype.displayHoverForRow = function(index) { + var _ref; + if (index != null) { + (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(index)); + return this.hilight(index); + } else { + this.hover.hide(); + return this.hilight(); + } + }; + + Line.prototype.hoverContentForRow = function(index) { + var content, j, row, y, _i, _len, _ref; + row = this.data[index]; + content = "<div class='morris-hover-row-label'>" + row.label + "</div>"; + _ref = row.y; + for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) { + y = _ref[j]; + content += "<div class='morris-hover-point' style='color: " + (this.colorFor(row, j, 'label')) + "'>\n " + this.options.labels[j] + ":\n " + (this.yLabelFormat(y)) + "\n</div>"; + } + if (typeof this.options.hoverCallback === 'function') { + content = this.options.hoverCallback(index, this.options, content, row.src); + } + return [content, row._x, row._ymax]; + }; + + Line.prototype.generatePaths = function() { + var coords, i, r, smooth; + return this.paths = (function() { + var _i, _ref, _ref1, _results; + _results = []; + for (i = _i = 0, _ref = this.options.ykeys.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + smooth = typeof this.options.smooth === "boolean" ? this.options.smooth : (_ref1 = this.options.ykeys[i], __indexOf.call(this.options.smooth, _ref1) >= 0); + coords = (function() { + var _j, _len, _ref2, _results1; + _ref2 = this.data; + _results1 = []; + for (_j = 0, _len = _ref2.length; _j < _len; _j++) { + r = _ref2[_j]; + if (r._y[i] !== void 0) { + _results1.push({ + x: r._x, + y: r._y[i] + }); + } + } + return _results1; + }).call(this); + if (coords.length > 1) { + _results.push(Morris.Line.createPath(coords, smooth, this.bottom)); + } else { + _results.push(null); + } + } + return _results; + }).call(this); + }; + + Line.prototype.draw = function() { + var _ref; + if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'x') { + this.drawXAxis(); + } + this.drawSeries(); + if (this.options.hideHover === false) { + return this.displayHoverForRow(this.data.length - 1); + } + }; + + Line.prototype.drawXAxis = function() { + var drawLabel, l, labels, prevAngleMargin, prevLabelMargin, row, ypos, _i, _len, _results, + _this = this; + ypos = this.bottom + this.options.padding / 2; + prevLabelMargin = null; + prevAngleMargin = null; + drawLabel = function(labelText, xpos) { + var label, labelBox, margin, offset, textBox; + label = _this.drawXAxisLabel(_this.transX(xpos), ypos, labelText); + textBox = label.getBBox(); + label.transform("r" + (-_this.options.xLabelAngle)); + labelBox = label.getBBox(); + label.transform("t0," + (labelBox.height / 2) + "..."); + if (_this.options.xLabelAngle !== 0) { + offset = -0.5 * textBox.width * Math.cos(_this.options.xLabelAngle * Math.PI / 180.0); + label.transform("t" + offset + ",0..."); + } + labelBox = label.getBBox(); + if (((prevLabelMargin == null) || prevLabelMargin >= labelBox.x + labelBox.width || (prevAngleMargin != null) && prevAngleMargin >= labelBox.x) && labelBox.x >= 0 && (labelBox.x + labelBox.width) < _this.el.width()) { + if (_this.options.xLabelAngle !== 0) { + margin = 1.25 * _this.options.gridTextSize / Math.sin(_this.options.xLabelAngle * Math.PI / 180.0); + prevAngleMargin = labelBox.x - margin; + } + return prevLabelMargin = labelBox.x - _this.options.xLabelMargin; + } else { + return label.remove(); + } + }; + if (this.options.parseTime) { + if (this.data.length === 1 && this.options.xLabels === 'auto') { + labels = [[this.data[0].label, this.data[0].x]]; + } else { + labels = Morris.labelSeries(this.xmin, this.xmax, this.width, this.options.xLabels, this.options.xLabelFormat); + } + } else { + labels = (function() { + var _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + row = _ref[_i]; + _results.push([row.label, row.x]); + } + return _results; + }).call(this); + } + labels.reverse(); + _results = []; + for (_i = 0, _len = labels.length; _i < _len; _i++) { + l = labels[_i]; + _results.push(drawLabel(l[0], l[1])); + } + return _results; + }; + + Line.prototype.drawSeries = function() { + var i, _i, _j, _ref, _ref1, _results; + this.seriesPoints = []; + for (i = _i = _ref = this.options.ykeys.length - 1; _ref <= 0 ? _i <= 0 : _i >= 0; i = _ref <= 0 ? ++_i : --_i) { + this._drawLineFor(i); + } + _results = []; + for (i = _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; i = _ref1 <= 0 ? ++_j : --_j) { + _results.push(this._drawPointFor(i)); + } + return _results; + }; + + Line.prototype._drawPointFor = function(index) { + var circle, row, _i, _len, _ref, _results; + this.seriesPoints[index] = []; + _ref = this.data; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + row = _ref[_i]; + circle = null; + if (row._y[index] != null) { + circle = this.drawLinePoint(row._x, row._y[index], this.colorFor(row, index, 'point'), index); + } + _results.push(this.seriesPoints[index].push(circle)); + } + return _results; + }; + + Line.prototype._drawLineFor = function(index) { + var path; + path = this.paths[index]; + if (path !== null) { + return this.drawLinePath(path, this.colorFor(null, index, 'line'), index); + } + }; + + Line.createPath = function(coords, smooth, bottom) { + var coord, g, grads, i, ix, lg, path, prevCoord, x1, x2, y1, y2, _i, _len; + path = ""; + if (smooth) { + grads = Morris.Line.gradients(coords); + } + prevCoord = { + y: null + }; + for (i = _i = 0, _len = coords.length; _i < _len; i = ++_i) { + coord = coords[i]; + if (coord.y != null) { + if (prevCoord.y != null) { + if (smooth) { + g = grads[i]; + lg = grads[i - 1]; + ix = (coord.x - prevCoord.x) / 4; + x1 = prevCoord.x + ix; + y1 = Math.min(bottom, prevCoord.y + ix * lg); + x2 = coord.x - ix; + y2 = Math.min(bottom, coord.y - ix * g); + path += "C" + x1 + "," + y1 + "," + x2 + "," + y2 + "," + coord.x + "," + coord.y; + } else { + path += "L" + coord.x + "," + coord.y; + } + } else { + if (!smooth || (grads[i] != null)) { + path += "M" + coord.x + "," + coord.y; + } + } + } + prevCoord = coord; + } + return path; + }; + + Line.gradients = function(coords) { + var coord, grad, i, nextCoord, prevCoord, _i, _len, _results; + grad = function(a, b) { + return (a.y - b.y) / (a.x - b.x); + }; + _results = []; + for (i = _i = 0, _len = coords.length; _i < _len; i = ++_i) { + coord = coords[i]; + if (coord.y != null) { + nextCoord = coords[i + 1] || { + y: null + }; + prevCoord = coords[i - 1] || { + y: null + }; + if ((prevCoord.y != null) && (nextCoord.y != null)) { + _results.push(grad(prevCoord, nextCoord)); + } else if (prevCoord.y != null) { + _results.push(grad(prevCoord, coord)); + } else if (nextCoord.y != null) { + _results.push(grad(coord, nextCoord)); + } else { + _results.push(null); + } + } else { + _results.push(null); + } + } + return _results; + }; + + Line.prototype.hilight = function(index) { + var i, _i, _j, _ref, _ref1; + if (this.prevHilight !== null && this.prevHilight !== index) { + for (i = _i = 0, _ref = this.seriesPoints.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) { + if (this.seriesPoints[i][this.prevHilight]) { + this.seriesPoints[i][this.prevHilight].animate(this.pointShrinkSeries(i)); + } + } + } + if (index !== null && this.prevHilight !== index) { + for (i = _j = 0, _ref1 = this.seriesPoints.length - 1; 0 <= _ref1 ? _j <= _ref1 : _j >= _ref1; i = 0 <= _ref1 ? ++_j : --_j) { + if (this.seriesPoints[i][index]) { + this.seriesPoints[i][index].animate(this.pointGrowSeries(i)); + } + } + } + return this.prevHilight = index; + }; + + Line.prototype.colorFor = function(row, sidx, type) { + if (typeof this.options.lineColors === 'function') { + return this.options.lineColors.call(this, row, sidx, type); + } else if (type === 'point') { + return this.options.pointFillColors[sidx % this.options.pointFillColors.length] || this.options.lineColors[sidx % this.options.lineColors.length]; + } else { + return this.options.lineColors[sidx % this.options.lineColors.length]; + } + }; + + Line.prototype.drawXAxisLabel = function(xPos, yPos, text) { + return this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor); + }; + + Line.prototype.drawLinePath = function(path, lineColor, lineIndex) { + return this.raphael.path(path).attr('stroke', lineColor).attr('stroke-width', this.lineWidthForSeries(lineIndex)); + }; + + Line.prototype.drawLinePoint = function(xPos, yPos, pointColor, lineIndex) { + return this.raphael.circle(xPos, yPos, this.pointSizeForSeries(lineIndex)).attr('fill', pointColor).attr('stroke-width', this.pointStrokeWidthForSeries(lineIndex)).attr('stroke', this.pointStrokeColorForSeries(lineIndex)); + }; + + Line.prototype.pointStrokeWidthForSeries = function(index) { + return this.options.pointStrokeWidths[index % this.options.pointStrokeWidths.length]; + }; + + Line.prototype.pointStrokeColorForSeries = function(index) { + return this.options.pointStrokeColors[index % this.options.pointStrokeColors.length]; + }; + + Line.prototype.lineWidthForSeries = function(index) { + if (this.options.lineWidth instanceof Array) { + return this.options.lineWidth[index % this.options.lineWidth.length]; + } else { + return this.options.lineWidth; + } + }; + + Line.prototype.pointSizeForSeries = function(index) { + if (this.options.pointSize instanceof Array) { + return this.options.pointSize[index % this.options.pointSize.length]; + } else { + return this.options.pointSize; + } + }; + + Line.prototype.pointGrowSeries = function(index) { + return Raphael.animation({ + r: this.pointSizeForSeries(index) + 3 + }, 25, 'linear'); + }; + + Line.prototype.pointShrinkSeries = function(index) { + return Raphael.animation({ + r: this.pointSizeForSeries(index) + }, 25, 'linear'); + }; + + return Line; + + })(Morris.Grid); + + Morris.labelSeries = function(dmin, dmax, pxwidth, specName, xLabelFormat) { + var d, d0, ddensity, name, ret, s, spec, t, _i, _len, _ref; + ddensity = 200 * (dmax - dmin) / pxwidth; + d0 = new Date(dmin); + spec = Morris.LABEL_SPECS[specName]; + if (spec === void 0) { + _ref = Morris.AUTO_LABEL_ORDER; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + name = _ref[_i]; + s = Morris.LABEL_SPECS[name]; + if (ddensity >= s.span) { + spec = s; + break; + } + } + } + if (spec === void 0) { + spec = Morris.LABEL_SPECS["second"]; + } + if (xLabelFormat) { + spec = $.extend({}, spec, { + fmt: xLabelFormat + }); + } + d = spec.start(d0); + ret = []; + while ((t = d.getTime()) <= dmax) { + if (t >= dmin) { + ret.push([spec.fmt(d), t]); + } + spec.incr(d); + } + return ret; + }; + + minutesSpecHelper = function(interval) { + return { + span: interval * 60 * 1000, + start: function(d) { + return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours()); + }, + fmt: function(d) { + return "" + (Morris.pad2(d.getHours())) + ":" + (Morris.pad2(d.getMinutes())); + }, + incr: function(d) { + return d.setUTCMinutes(d.getUTCMinutes() + interval); + } + }; + }; + + secondsSpecHelper = function(interval) { + return { + span: interval * 1000, + start: function(d) { + return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes()); + }, + fmt: function(d) { + return "" + (Morris.pad2(d.getHours())) + ":" + (Morris.pad2(d.getMinutes())) + ":" + (Morris.pad2(d.getSeconds())); + }, + incr: function(d) { + return d.setUTCSeconds(d.getUTCSeconds() + interval); + } + }; + }; + + Morris.LABEL_SPECS = { + "decade": { + span: 172800000000, + start: function(d) { + return new Date(d.getFullYear() - d.getFullYear() % 10, 0, 1); + }, + fmt: function(d) { + return "" + (d.getFullYear()); + }, + incr: function(d) { + return d.setFullYear(d.getFullYear() + 10); + } + }, + "year": { + span: 17280000000, + start: function(d) { + return new Date(d.getFullYear(), 0, 1); + }, + fmt: function(d) { + return "" + (d.getFullYear()); + }, + incr: function(d) { + return d.setFullYear(d.getFullYear() + 1); + } + }, + "month": { + span: 2419200000, + start: function(d) { + return new Date(d.getFullYear(), d.getMonth(), 1); + }, + fmt: function(d) { + return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1)); + }, + incr: function(d) { + return d.setMonth(d.getMonth() + 1); + } + }, + "week": { + span: 604800000, + start: function(d) { + return new Date(d.getFullYear(), d.getMonth(), d.getDate()); + }, + fmt: function(d) { + return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1)) + "-" + (Morris.pad2(d.getDate())); + }, + incr: function(d) { + return d.setDate(d.getDate() + 7); + } + }, + "day": { + span: 86400000, + start: function(d) { + return new Date(d.getFullYear(), d.getMonth(), d.getDate()); + }, + fmt: function(d) { + return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1)) + "-" + (Morris.pad2(d.getDate())); + }, + incr: function(d) { + return d.setDate(d.getDate() + 1); + } + }, + "hour": minutesSpecHelper(60), + "30min": minutesSpecHelper(30), + "15min": minutesSpecHelper(15), + "10min": minutesSpecHelper(10), + "5min": minutesSpecHelper(5), + "minute": minutesSpecHelper(1), + "30sec": secondsSpecHelper(30), + "15sec": secondsSpecHelper(15), + "10sec": secondsSpecHelper(10), + "5sec": secondsSpecHelper(5), + "second": secondsSpecHelper(1) + }; + + Morris.AUTO_LABEL_ORDER = ["decade", "year", "month", "week", "day", "hour", "30min", "15min", "10min", "5min", "minute", "30sec", "15sec", "10sec", "5sec", "second"]; + + Morris.Area = (function(_super) { + var areaDefaults; + + __extends(Area, _super); + + areaDefaults = { + fillOpacity: 'auto', + behaveLikeLine: false + }; + + function Area(options) { + var areaOptions; + if (!(this instanceof Morris.Area)) { + return new Morris.Area(options); + } + areaOptions = $.extend({}, areaDefaults, options); + this.cumulative = !areaOptions.behaveLikeLine; + if (areaOptions.fillOpacity === 'auto') { + areaOptions.fillOpacity = areaOptions.behaveLikeLine ? .8 : 1; + } + Area.__super__.constructor.call(this, areaOptions); + } + + Area.prototype.calcPoints = function() { + var row, total, y, _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + row = _ref[_i]; + row._x = this.transX(row.x); + total = 0; + row._y = (function() { + var _j, _len1, _ref1, _results1; + _ref1 = row.y; + _results1 = []; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + y = _ref1[_j]; + if (this.options.behaveLikeLine) { + _results1.push(this.transY(y)); + } else { + total += y || 0; + _results1.push(this.transY(total)); + } + } + return _results1; + }).call(this); + _results.push(row._ymax = Math.max.apply(Math, row._y)); + } + return _results; + }; + + Area.prototype.drawSeries = function() { + var i, range, _i, _j, _k, _len, _ref, _ref1, _results, _results1, _results2; + this.seriesPoints = []; + if (this.options.behaveLikeLine) { + range = (function() { + _results = []; + for (var _i = 0, _ref = this.options.ykeys.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); } + return _results; + }).apply(this); + } else { + range = (function() { + _results1 = []; + for (var _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; _ref1 <= 0 ? _j++ : _j--){ _results1.push(_j); } + return _results1; + }).apply(this); + } + _results2 = []; + for (_k = 0, _len = range.length; _k < _len; _k++) { + i = range[_k]; + this._drawFillFor(i); + this._drawLineFor(i); + _results2.push(this._drawPointFor(i)); + } + return _results2; + }; + + Area.prototype._drawFillFor = function(index) { + var path; + path = this.paths[index]; + if (path !== null) { + path = path + ("L" + (this.transX(this.xmax)) + "," + this.bottom + "L" + (this.transX(this.xmin)) + "," + this.bottom + "Z"); + return this.drawFilledPath(path, this.fillForSeries(index)); + } + }; + + Area.prototype.fillForSeries = function(i) { + var color; + color = Raphael.rgb2hsl(this.colorFor(this.data[i], i, 'line')); + return Raphael.hsl(color.h, this.options.behaveLikeLine ? color.s * 0.9 : color.s * 0.75, Math.min(0.98, this.options.behaveLikeLine ? color.l * 1.2 : color.l * 1.25)); + }; + + Area.prototype.drawFilledPath = function(path, fill) { + return this.raphael.path(path).attr('fill', fill).attr('fill-opacity', this.options.fillOpacity).attr('stroke', 'none'); + }; + + return Area; + + })(Morris.Line); + + Morris.Bar = (function(_super) { + __extends(Bar, _super); + + function Bar(options) { + this.onHoverOut = __bind(this.onHoverOut, this); + this.onHoverMove = __bind(this.onHoverMove, this); + this.onGridClick = __bind(this.onGridClick, this); + if (!(this instanceof Morris.Bar)) { + return new Morris.Bar(options); + } + Bar.__super__.constructor.call(this, $.extend({}, options, { + parseTime: false + })); + } + + Bar.prototype.init = function() { + this.cumulative = this.options.stacked; + if (this.options.hideHover !== 'always') { + this.hover = new Morris.Hover({ + parent: this.el + }); + this.on('hovermove', this.onHoverMove); + this.on('hoverout', this.onHoverOut); + return this.on('gridclick', this.onGridClick); + } + }; + + Bar.prototype.defaults = { + barSizeRatio: 0.75, + barGap: 3, + barColors: ['#0b62a4', '#7a92a3', '#4da74d', '#afd8f8', '#edc240', '#cb4b4b', '#9440ed'], + barOpacity: 1.0, + barRadius: [0, 0, 0, 0], + xLabelMargin: 50 + }; + + Bar.prototype.calc = function() { + var _ref; + this.calcBars(); + if (this.options.hideHover === false) { + return (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(this.data.length - 1)); + } + }; + + Bar.prototype.calcBars = function() { + var idx, row, y, _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (idx = _i = 0, _len = _ref.length; _i < _len; idx = ++_i) { + row = _ref[idx]; + row._x = this.left + this.width * (idx + 0.5) / this.data.length; + _results.push(row._y = (function() { + var _j, _len1, _ref1, _results1; + _ref1 = row.y; + _results1 = []; + for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { + y = _ref1[_j]; + if (y != null) { + _results1.push(this.transY(y)); + } else { + _results1.push(null); + } + } + return _results1; + }).call(this)); + } + return _results; + }; + + Bar.prototype.draw = function() { + var _ref; + if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'x') { + this.drawXAxis(); + } + return this.drawSeries(); + }; + + Bar.prototype.drawXAxis = function() { + var i, label, labelBox, margin, offset, prevAngleMargin, prevLabelMargin, row, textBox, ypos, _i, _ref, _results; + ypos = this.bottom + (this.options.xAxisLabelTopPadding || this.options.padding / 2); + prevLabelMargin = null; + prevAngleMargin = null; + _results = []; + for (i = _i = 0, _ref = this.data.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { + row = this.data[this.data.length - 1 - i]; + label = this.drawXAxisLabel(row._x, ypos, row.label); + textBox = label.getBBox(); + label.transform("r" + (-this.options.xLabelAngle)); + labelBox = label.getBBox(); + label.transform("t0," + (labelBox.height / 2) + "..."); + if (this.options.xLabelAngle !== 0) { + offset = -0.5 * textBox.width * Math.cos(this.options.xLabelAngle * Math.PI / 180.0); + label.transform("t" + offset + ",0..."); + } + if (((prevLabelMargin == null) || prevLabelMargin >= labelBox.x + labelBox.width || (prevAngleMargin != null) && prevAngleMargin >= labelBox.x) && labelBox.x >= 0 && (labelBox.x + labelBox.width) < this.el.width()) { + if (this.options.xLabelAngle !== 0) { + margin = 1.25 * this.options.gridTextSize / Math.sin(this.options.xLabelAngle * Math.PI / 180.0); + prevAngleMargin = labelBox.x - margin; + } + _results.push(prevLabelMargin = labelBox.x - this.options.xLabelMargin); + } else { + _results.push(label.remove()); + } + } + return _results; + }; + + Bar.prototype.drawSeries = function() { + var barWidth, bottom, groupWidth, idx, lastTop, left, leftPadding, numBars, row, sidx, size, spaceLeft, top, ypos, zeroPos; + groupWidth = this.width / this.options.data.length; + numBars = this.options.stacked ? 1 : this.options.ykeys.length; + barWidth = (groupWidth * this.options.barSizeRatio - this.options.barGap * (numBars - 1)) / numBars; + if (this.options.barSize) { + barWidth = Math.min(barWidth, this.options.barSize); + } + spaceLeft = groupWidth - barWidth * numBars - this.options.barGap * (numBars - 1); + leftPadding = spaceLeft / 2; + zeroPos = this.ymin <= 0 && this.ymax >= 0 ? this.transY(0) : null; + return this.bars = (function() { + var _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (idx = _i = 0, _len = _ref.length; _i < _len; idx = ++_i) { + row = _ref[idx]; + lastTop = 0; + _results.push((function() { + var _j, _len1, _ref1, _results1; + _ref1 = row._y; + _results1 = []; + for (sidx = _j = 0, _len1 = _ref1.length; _j < _len1; sidx = ++_j) { + ypos = _ref1[sidx]; + if (ypos !== null) { + if (zeroPos) { + top = Math.min(ypos, zeroPos); + bottom = Math.max(ypos, zeroPos); + } else { + top = ypos; + bottom = this.bottom; + } + left = this.left + idx * groupWidth + leftPadding; + if (!this.options.stacked) { + left += sidx * (barWidth + this.options.barGap); + } + size = bottom - top; + if (this.options.verticalGridCondition && this.options.verticalGridCondition(row.x)) { + this.drawBar(this.left + idx * groupWidth, this.top, groupWidth, Math.abs(this.top - this.bottom), this.options.verticalGridColor, this.options.verticalGridOpacity, this.options.barRadius); + } + if (this.options.stacked) { + top -= lastTop; + } + this.drawBar(left, top, barWidth, size, this.colorFor(row, sidx, 'bar'), this.options.barOpacity, this.options.barRadius); + _results1.push(lastTop += size); + } else { + _results1.push(null); + } + } + return _results1; + }).call(this)); + } + return _results; + }).call(this); + }; + + Bar.prototype.colorFor = function(row, sidx, type) { + var r, s; + if (typeof this.options.barColors === 'function') { + r = { + x: row.x, + y: row.y[sidx], + label: row.label + }; + s = { + index: sidx, + key: this.options.ykeys[sidx], + label: this.options.labels[sidx] + }; + return this.options.barColors.call(this, r, s, type); + } else { + return this.options.barColors[sidx % this.options.barColors.length]; + } + }; + + Bar.prototype.hitTest = function(x) { + if (this.data.length === 0) { + return null; + } + x = Math.max(Math.min(x, this.right), this.left); + return Math.min(this.data.length - 1, Math.floor((x - this.left) / (this.width / this.data.length))); + }; + + Bar.prototype.onGridClick = function(x, y) { + var index; + index = this.hitTest(x); + return this.fire('click', index, this.data[index].src, x, y); + }; + + Bar.prototype.onHoverMove = function(x, y) { + var index, _ref; + index = this.hitTest(x); + return (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(index)); + }; + + Bar.prototype.onHoverOut = function() { + if (this.options.hideHover !== false) { + return this.hover.hide(); + } + }; + + Bar.prototype.hoverContentForRow = function(index) { + var content, j, row, x, y, _i, _len, _ref; + row = this.data[index]; + content = "<div class='morris-hover-row-label'>" + row.label + "</div>"; + _ref = row.y; + for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) { + y = _ref[j]; + content += "<div class='morris-hover-point' style='color: " + (this.colorFor(row, j, 'label')) + "'>\n " + this.options.labels[j] + ":\n " + (this.yLabelFormat(y)) + "\n</div>"; + } + if (typeof this.options.hoverCallback === 'function') { + content = this.options.hoverCallback(index, this.options, content, row.src); + } + x = this.left + (index + 0.5) * this.width / this.data.length; + return [content, x]; + }; + + Bar.prototype.drawXAxisLabel = function(xPos, yPos, text) { + var label; + return label = this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor); + }; + + Bar.prototype.drawBar = function(xPos, yPos, width, height, barColor, opacity, radiusArray) { + var maxRadius, path; + maxRadius = Math.max.apply(Math, radiusArray); + if (maxRadius === 0 || maxRadius > height) { + path = this.raphael.rect(xPos, yPos, width, height); + } else { + path = this.raphael.path(this.roundedRect(xPos, yPos, width, height, radiusArray)); + } + return path.attr('fill', barColor).attr('fill-opacity', opacity).attr('stroke', 'none'); + }; + + Bar.prototype.roundedRect = function(x, y, w, h, r) { + if (r == null) { + r = [0, 0, 0, 0]; + } + return ["M", x, r[0] + y, "Q", x, y, x + r[0], y, "L", x + w - r[1], y, "Q", x + w, y, x + w, y + r[1], "L", x + w, y + h - r[2], "Q", x + w, y + h, x + w - r[2], y + h, "L", x + r[3], y + h, "Q", x, y + h, x, y + h - r[3], "Z"]; + }; + + return Bar; + + })(Morris.Grid); + + Morris.Donut = (function(_super) { + __extends(Donut, _super); + + Donut.prototype.defaults = { + colors: ['#0B62A4', '#3980B5', '#679DC6', '#95BBD7', '#B0CCE1', '#095791', '#095085', '#083E67', '#052C48', '#042135'], + backgroundColor: '#FFFFFF', + labelColor: '#000000', + formatter: Morris.commas, + resize: false + }; + + function Donut(options) { + this.resizeHandler = __bind(this.resizeHandler, this); + this.select = __bind(this.select, this); + this.click = __bind(this.click, this); + var _this = this; + if (!(this instanceof Morris.Donut)) { + return new Morris.Donut(options); + } + this.options = $.extend({}, this.defaults, options); + if (typeof options.element === 'string') { + this.el = $(document.getElementById(options.element)); + } else { + this.el = $(options.element); + } + if (this.el === null || this.el.length === 0) { + throw new Error("Graph placeholder not found."); + } + if (options.data === void 0 || options.data.length === 0) { + return; + } + this.raphael = new Raphael(this.el[0]); + if (this.options.resize) { + $(window).bind('resize', function(evt) { + if (_this.timeoutId != null) { + window.clearTimeout(_this.timeoutId); + } + return _this.timeoutId = window.setTimeout(_this.resizeHandler, 100); + }); + } + this.setData(options.data); + } + + Donut.prototype.redraw = function() { + var C, cx, cy, i, idx, last, max_value, min, next, seg, total, value, w, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _results; + this.raphael.clear(); + cx = this.el.width() / 2; + cy = this.el.height() / 2; + w = (Math.min(cx, cy) - 10) / 3; + total = 0; + _ref = this.values; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + value = _ref[_i]; + total += value; + } + min = 5 / (2 * w); + C = 1.9999 * Math.PI - min * this.data.length; + last = 0; + idx = 0; + this.segments = []; + _ref1 = this.values; + for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) { + value = _ref1[i]; + next = last + min + C * (value / total); + seg = new Morris.DonutSegment(cx, cy, w * 2, w, last, next, this.data[i].color || this.options.colors[idx % this.options.colors.length], this.options.backgroundColor, idx, this.raphael); + seg.render(); + this.segments.push(seg); + seg.on('hover', this.select); + seg.on('click', this.click); + last = next; + idx += 1; + } + this.text1 = this.drawEmptyDonutLabel(cx, cy - 10, this.options.labelColor, 15, 800); + this.text2 = this.drawEmptyDonutLabel(cx, cy + 10, this.options.labelColor, 14); + max_value = Math.max.apply(Math, this.values); + idx = 0; + _ref2 = this.values; + _results = []; + for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { + value = _ref2[_k]; + if (value === max_value) { + this.select(idx); + break; + } + _results.push(idx += 1); + } + return _results; + }; + + Donut.prototype.setData = function(data) { + var row; + this.data = data; + this.values = (function() { + var _i, _len, _ref, _results; + _ref = this.data; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + row = _ref[_i]; + _results.push(parseFloat(row.value)); + } + return _results; + }).call(this); + return this.redraw(); + }; + + Donut.prototype.click = function(idx) { + return this.fire('click', idx, this.data[idx]); + }; + + Donut.prototype.select = function(idx) { + var row, s, segment, _i, _len, _ref; + _ref = this.segments; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + s = _ref[_i]; + s.deselect(); + } + segment = this.segments[idx]; + segment.select(); + row = this.data[idx]; + return this.setLabels(row.label, this.options.formatter(row.value, row)); + }; + + Donut.prototype.setLabels = function(label1, label2) { + var inner, maxHeightBottom, maxHeightTop, maxWidth, text1bbox, text1scale, text2bbox, text2scale; + inner = (Math.min(this.el.width() / 2, this.el.height() / 2) - 10) * 2 / 3; + maxWidth = 1.8 * inner; + maxHeightTop = inner / 2; + maxHeightBottom = inner / 3; + this.text1.attr({ + text: label1, + transform: '' + }); + text1bbox = this.text1.getBBox(); + text1scale = Math.min(maxWidth / text1bbox.width, maxHeightTop / text1bbox.height); + this.text1.attr({ + transform: "S" + text1scale + "," + text1scale + "," + (text1bbox.x + text1bbox.width / 2) + "," + (text1bbox.y + text1bbox.height) + }); + this.text2.attr({ + text: label2, + transform: '' + }); + text2bbox = this.text2.getBBox(); + text2scale = Math.min(maxWidth / text2bbox.width, maxHeightBottom / text2bbox.height); + return this.text2.attr({ + transform: "S" + text2scale + "," + text2scale + "," + (text2bbox.x + text2bbox.width / 2) + "," + text2bbox.y + }); + }; + + Donut.prototype.drawEmptyDonutLabel = function(xPos, yPos, color, fontSize, fontWeight) { + var text; + text = this.raphael.text(xPos, yPos, '').attr('font-size', fontSize).attr('fill', color); + if (fontWeight != null) { + text.attr('font-weight', fontWeight); + } + return text; + }; + + Donut.prototype.resizeHandler = function() { + this.timeoutId = null; + this.raphael.setSize(this.el.width(), this.el.height()); + return this.redraw(); + }; + + return Donut; + + })(Morris.EventEmitter); + + Morris.DonutSegment = (function(_super) { + __extends(DonutSegment, _super); + + function DonutSegment(cx, cy, inner, outer, p0, p1, color, backgroundColor, index, raphael) { + this.cx = cx; + this.cy = cy; + this.inner = inner; + this.outer = outer; + this.color = color; + this.backgroundColor = backgroundColor; + this.index = index; + this.raphael = raphael; + this.deselect = __bind(this.deselect, this); + this.select = __bind(this.select, this); + this.sin_p0 = Math.sin(p0); + this.cos_p0 = Math.cos(p0); + this.sin_p1 = Math.sin(p1); + this.cos_p1 = Math.cos(p1); + this.is_long = (p1 - p0) > Math.PI ? 1 : 0; + this.path = this.calcSegment(this.inner + 3, this.inner + this.outer - 5); + this.selectedPath = this.calcSegment(this.inner + 3, this.inner + this.outer); + this.hilight = this.calcArc(this.inner); + } + + DonutSegment.prototype.calcArcPoints = function(r) { + return [this.cx + r * this.sin_p0, this.cy + r * this.cos_p0, this.cx + r * this.sin_p1, this.cy + r * this.cos_p1]; + }; + + DonutSegment.prototype.calcSegment = function(r1, r2) { + var ix0, ix1, iy0, iy1, ox0, ox1, oy0, oy1, _ref, _ref1; + _ref = this.calcArcPoints(r1), ix0 = _ref[0], iy0 = _ref[1], ix1 = _ref[2], iy1 = _ref[3]; + _ref1 = this.calcArcPoints(r2), ox0 = _ref1[0], oy0 = _ref1[1], ox1 = _ref1[2], oy1 = _ref1[3]; + return ("M" + ix0 + "," + iy0) + ("A" + r1 + "," + r1 + ",0," + this.is_long + ",0," + ix1 + "," + iy1) + ("L" + ox1 + "," + oy1) + ("A" + r2 + "," + r2 + ",0," + this.is_long + ",1," + ox0 + "," + oy0) + "Z"; + }; + + DonutSegment.prototype.calcArc = function(r) { + var ix0, ix1, iy0, iy1, _ref; + _ref = this.calcArcPoints(r), ix0 = _ref[0], iy0 = _ref[1], ix1 = _ref[2], iy1 = _ref[3]; + return ("M" + ix0 + "," + iy0) + ("A" + r + "," + r + ",0," + this.is_long + ",0," + ix1 + "," + iy1); + }; + + DonutSegment.prototype.render = function() { + var _this = this; + this.arc = this.drawDonutArc(this.hilight, this.color); + return this.seg = this.drawDonutSegment(this.path, this.color, this.backgroundColor, function() { + return _this.fire('hover', _this.index); + }, function() { + return _this.fire('click', _this.index); + }); + }; + + DonutSegment.prototype.drawDonutArc = function(path, color) { + return this.raphael.path(path).attr({ + stroke: color, + 'stroke-width': 2, + opacity: 0 + }); + }; + + DonutSegment.prototype.drawDonutSegment = function(path, fillColor, strokeColor, hoverFunction, clickFunction) { + return this.raphael.path(path).attr({ + fill: fillColor, + stroke: strokeColor, + 'stroke-width': 3 + }).hover(hoverFunction).click(clickFunction); + }; + + DonutSegment.prototype.select = function() { + if (!this.selected) { + this.seg.animate({ + path: this.selectedPath + }, 150, '<>'); + this.arc.animate({ + opacity: 1 + }, 150, '<>'); + return this.selected = true; + } + }; + + DonutSegment.prototype.deselect = function() { + if (this.selected) { + this.seg.animate({ + path: this.path + }, 150, '<>'); + this.arc.animate({ + opacity: 0 + }, 150, '<>'); + return this.selected = false; + } + }; + + return DonutSegment; + + })(Morris.EventEmitter); + +}).call(this); diff --git a/theme/bootstrap/views/js/plugins/morris/morris.min.js b/theme/bootstrap/views/js/plugins/morris/morris.min.js new file mode 100644 index 0000000..c3bda2f --- /dev/null +++ b/theme/bootstrap/views/js/plugins/morris/morris.min.js @@ -0,0 +1,7 @@ +/* @license +morris.js v0.5.0 +Copyright 2014 Olly Smith All rights reserved. +Licensed under the BSD-2-Clause License. +*/ +(function(){var a,b,c,d,e=[].slice,f=function(a,b){return function(){return a.apply(b,arguments)}},g={}.hasOwnProperty,h=function(a,b){function c(){this.constructor=a}for(var d in b)g.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},i=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};b=window.Morris={},a=jQuery,b.EventEmitter=function(){function a(){}return a.prototype.on=function(a,b){return null==this.handlers&&(this.handlers={}),null==this.handlers[a]&&(this.handlers[a]=[]),this.handlers[a].push(b),this},a.prototype.fire=function(){var a,b,c,d,f,g,h;if(c=arguments[0],a=2<=arguments.length?e.call(arguments,1):[],null!=this.handlers&&null!=this.handlers[c]){for(g=this.handlers[c],h=[],d=0,f=g.length;f>d;d++)b=g[d],h.push(b.apply(null,a));return h}},a}(),b.commas=function(a){var b,c,d,e;return null!=a?(d=0>a?"-":"",b=Math.abs(a),c=Math.floor(b).toFixed(0),d+=c.replace(/(?=(?:\d{3})+$)(?!^)/g,","),e=b.toString(),e.length>c.length&&(d+=e.slice(c.length)),d):"-"},b.pad2=function(a){return(10>a?"0":"")+a},b.Grid=function(c){function d(b){this.resizeHandler=f(this.resizeHandler,this);var c=this;if(this.el="string"==typeof b.element?a(document.getElementById(b.element)):a(b.element),null==this.el||0===this.el.length)throw new Error("Graph container element not found");"static"===this.el.css("position")&&this.el.css("position","relative"),this.options=a.extend({},this.gridDefaults,this.defaults||{},b),"string"==typeof this.options.units&&(this.options.postUnits=b.units),this.raphael=new Raphael(this.el[0]),this.elementWidth=null,this.elementHeight=null,this.dirty=!1,this.selectFrom=null,this.init&&this.init(),this.setData(this.options.data),this.el.bind("mousemove",function(a){var b,d,e,f,g;return d=c.el.offset(),g=a.pageX-d.left,c.selectFrom?(b=c.data[c.hitTest(Math.min(g,c.selectFrom))]._x,e=c.data[c.hitTest(Math.max(g,c.selectFrom))]._x,f=e-b,c.selectionRect.attr({x:b,width:f})):c.fire("hovermove",g,a.pageY-d.top)}),this.el.bind("mouseleave",function(){return c.selectFrom&&(c.selectionRect.hide(),c.selectFrom=null),c.fire("hoverout")}),this.el.bind("touchstart touchmove touchend",function(a){var b,d;return d=a.originalEvent.touches[0]||a.originalEvent.changedTouches[0],b=c.el.offset(),c.fire("hovermove",d.pageX-b.left,d.pageY-b.top)}),this.el.bind("click",function(a){var b;return b=c.el.offset(),c.fire("gridclick",a.pageX-b.left,a.pageY-b.top)}),this.options.rangeSelect&&(this.selectionRect=this.raphael.rect(0,0,0,this.el.innerHeight()).attr({fill:this.options.rangeSelectColor,stroke:!1}).toBack().hide(),this.el.bind("mousedown",function(a){var b;return b=c.el.offset(),c.startRange(a.pageX-b.left)}),this.el.bind("mouseup",function(a){var b;return b=c.el.offset(),c.endRange(a.pageX-b.left),c.fire("hovermove",a.pageX-b.left,a.pageY-b.top)})),this.options.resize&&a(window).bind("resize",function(){return null!=c.timeoutId&&window.clearTimeout(c.timeoutId),c.timeoutId=window.setTimeout(c.resizeHandler,100)}),this.el.css("-webkit-tap-highlight-color","rgba(0,0,0,0)"),this.postInit&&this.postInit()}return h(d,c),d.prototype.gridDefaults={dateFormat:null,axes:!0,grid:!0,gridLineColor:"#aaa",gridStrokeWidth:.5,gridTextColor:"#888",gridTextSize:12,gridTextFamily:"sans-serif",gridTextWeight:"normal",hideHover:!1,yLabelFormat:null,xLabelAngle:0,numLines:5,padding:25,parseTime:!0,postUnits:"",preUnits:"",ymax:"auto",ymin:"auto 0",goals:[],goalStrokeWidth:1,goalLineColors:["#666633","#999966","#cc6666","#663333"],events:[],eventStrokeWidth:1,eventLineColors:["#005a04","#ccffbb","#3a5f0b","#005502"],rangeSelect:null,rangeSelectColor:"#eef",resize:!1},d.prototype.setData=function(a,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;return null==c&&(c=!0),this.options.data=a,null==a||0===a.length?(this.data=[],this.raphael.clear(),null!=this.hover&&this.hover.hide(),void 0):(o=this.cumulative?0:null,p=this.cumulative?0:null,this.options.goals.length>0&&(h=Math.min.apply(Math,this.options.goals),g=Math.max.apply(Math,this.options.goals),p=null!=p?Math.min(p,h):h,o=null!=o?Math.max(o,g):g),this.data=function(){var c,d,g;for(g=[],f=c=0,d=a.length;d>c;f=++c)j=a[f],i={src:j},i.label=j[this.options.xkey],this.options.parseTime?(i.x=b.parseDate(i.label),this.options.dateFormat?i.label=this.options.dateFormat(i.x):"number"==typeof i.label&&(i.label=new Date(i.label).toString())):(i.x=f,this.options.xLabelFormat&&(i.label=this.options.xLabelFormat(i))),l=0,i.y=function(){var a,b,c,d;for(c=this.options.ykeys,d=[],e=a=0,b=c.length;b>a;e=++a)n=c[e],q=j[n],"string"==typeof q&&(q=parseFloat(q)),null!=q&&"number"!=typeof q&&(q=null),null!=q&&(this.cumulative?l+=q:null!=o?(o=Math.max(q,o),p=Math.min(q,p)):o=p=q),this.cumulative&&null!=l&&(o=Math.max(l,o),p=Math.min(l,p)),d.push(q);return d}.call(this),g.push(i);return g}.call(this),this.options.parseTime&&(this.data=this.data.sort(function(a,b){return(a.x>b.x)-(b.x>a.x)})),this.xmin=this.data[0].x,this.xmax=this.data[this.data.length-1].x,this.events=[],this.options.events.length>0&&(this.events=this.options.parseTime?function(){var a,c,e,f;for(e=this.options.events,f=[],a=0,c=e.length;c>a;a++)d=e[a],f.push(b.parseDate(d));return f}.call(this):this.options.events,this.xmax=Math.max(this.xmax,Math.max.apply(Math,this.events)),this.xmin=Math.min(this.xmin,Math.min.apply(Math,this.events))),this.xmin===this.xmax&&(this.xmin-=1,this.xmax+=1),this.ymin=this.yboundary("min",p),this.ymax=this.yboundary("max",o),this.ymin===this.ymax&&(p&&(this.ymin-=1),this.ymax+=1),((r=this.options.axes)===!0||"both"===r||"y"===r||this.options.grid===!0)&&(this.options.ymax===this.gridDefaults.ymax&&this.options.ymin===this.gridDefaults.ymin?(this.grid=this.autoGridLines(this.ymin,this.ymax,this.options.numLines),this.ymin=Math.min(this.ymin,this.grid[0]),this.ymax=Math.max(this.ymax,this.grid[this.grid.length-1])):(k=(this.ymax-this.ymin)/(this.options.numLines-1),this.grid=function(){var a,b,c,d;for(d=[],m=a=b=this.ymin,c=this.ymax;k>0?c>=a:a>=c;m=a+=k)d.push(m);return d}.call(this))),this.dirty=!0,c?this.redraw():void 0)},d.prototype.yboundary=function(a,b){var c,d;return c=this.options["y"+a],"string"==typeof c?"auto"===c.slice(0,4)?c.length>5?(d=parseInt(c.slice(5),10),null==b?d:Math[a](b,d)):null!=b?b:0:parseInt(c,10):c},d.prototype.autoGridLines=function(a,b,c){var d,e,f,g,h,i,j,k,l;return h=b-a,l=Math.floor(Math.log(h)/Math.log(10)),j=Math.pow(10,l),e=Math.floor(a/j)*j,d=Math.ceil(b/j)*j,i=(d-e)/(c-1),1===j&&i>1&&Math.ceil(i)!==i&&(i=Math.ceil(i),d=e+i*(c-1)),0>e&&d>0&&(e=Math.floor(a/i)*i,d=Math.ceil(b/i)*i),1>i?(g=Math.floor(Math.log(i)/Math.log(10)),f=function(){var a,b;for(b=[],k=a=e;i>0?d>=a:a>=d;k=a+=i)b.push(parseFloat(k.toFixed(1-g)));return b}()):f=function(){var a,b;for(b=[],k=a=e;i>0?d>=a:a>=d;k=a+=i)b.push(k);return b}(),f},d.prototype._calc=function(){var a,b,c,d,e,f,g,h;return e=this.el.width(),c=this.el.height(),(this.elementWidth!==e||this.elementHeight!==c||this.dirty)&&(this.elementWidth=e,this.elementHeight=c,this.dirty=!1,this.left=this.options.padding,this.right=this.elementWidth-this.options.padding,this.top=this.options.padding,this.bottom=this.elementHeight-this.options.padding,((g=this.options.axes)===!0||"both"===g||"y"===g)&&(f=function(){var a,c,d,e;for(d=this.grid,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(this.measureText(this.yAxisFormat(b)).width);return e}.call(this),this.left+=Math.max.apply(Math,f)),((h=this.options.axes)===!0||"both"===h||"x"===h)&&(a=function(){var a,b,c;for(c=[],d=a=0,b=this.data.length;b>=0?b>a:a>b;d=b>=0?++a:--a)c.push(this.measureText(this.data[d].text,-this.options.xLabelAngle).height);return c}.call(this),this.bottom-=Math.max.apply(Math,a)),this.width=Math.max(1,this.right-this.left),this.height=Math.max(1,this.bottom-this.top),this.dx=this.width/(this.xmax-this.xmin),this.dy=this.height/(this.ymax-this.ymin),this.calc)?this.calc():void 0},d.prototype.transY=function(a){return this.bottom-(a-this.ymin)*this.dy},d.prototype.transX=function(a){return 1===this.data.length?(this.left+this.right)/2:this.left+(a-this.xmin)*this.dx},d.prototype.redraw=function(){return this.raphael.clear(),this._calc(),this.drawGrid(),this.drawGoals(),this.drawEvents(),this.draw?this.draw():void 0},d.prototype.measureText=function(a,b){var c,d;return null==b&&(b=0),d=this.raphael.text(100,100,a).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).rotate(b),c=d.getBBox(),d.remove(),c},d.prototype.yAxisFormat=function(a){return this.yLabelFormat(a)},d.prototype.yLabelFormat=function(a){return"function"==typeof this.options.yLabelFormat?this.options.yLabelFormat(a):""+this.options.preUnits+b.commas(a)+this.options.postUnits},d.prototype.drawGrid=function(){var a,b,c,d,e,f,g,h;if(this.options.grid!==!1||(e=this.options.axes)===!0||"both"===e||"y"===e){for(f=this.grid,h=[],c=0,d=f.length;d>c;c++)a=f[c],b=this.transY(a),((g=this.options.axes)===!0||"both"===g||"y"===g)&&this.drawYAxisLabel(this.left-this.options.padding/2,b,this.yAxisFormat(a)),this.options.grid?h.push(this.drawGridLine("M"+this.left+","+b+"H"+(this.left+this.width))):h.push(void 0);return h}},d.prototype.drawGoals=function(){var a,b,c,d,e,f,g;for(f=this.options.goals,g=[],c=d=0,e=f.length;e>d;c=++d)b=f[c],a=this.options.goalLineColors[c%this.options.goalLineColors.length],g.push(this.drawGoal(b,a));return g},d.prototype.drawEvents=function(){var a,b,c,d,e,f,g;for(f=this.events,g=[],c=d=0,e=f.length;e>d;c=++d)b=f[c],a=this.options.eventLineColors[c%this.options.eventLineColors.length],g.push(this.drawEvent(b,a));return g},d.prototype.drawGoal=function(a,b){return this.raphael.path("M"+this.left+","+this.transY(a)+"H"+this.right).attr("stroke",b).attr("stroke-width",this.options.goalStrokeWidth)},d.prototype.drawEvent=function(a,b){return this.raphael.path("M"+this.transX(a)+","+this.bottom+"V"+this.top).attr("stroke",b).attr("stroke-width",this.options.eventStrokeWidth)},d.prototype.drawYAxisLabel=function(a,b,c){return this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor).attr("text-anchor","end")},d.prototype.drawGridLine=function(a){return this.raphael.path(a).attr("stroke",this.options.gridLineColor).attr("stroke-width",this.options.gridStrokeWidth)},d.prototype.startRange=function(a){return this.hover.hide(),this.selectFrom=a,this.selectionRect.attr({x:a,width:0}).show()},d.prototype.endRange=function(a){var b,c;return this.selectFrom?(c=Math.min(this.selectFrom,a),b=Math.max(this.selectFrom,a),this.options.rangeSelect.call(this.el,{start:this.data[this.hitTest(c)].x,end:this.data[this.hitTest(b)].x}),this.selectFrom=null):void 0},d.prototype.resizeHandler=function(){return this.timeoutId=null,this.raphael.setSize(this.el.width(),this.el.height()),this.redraw()},d}(b.EventEmitter),b.parseDate=function(a){var b,c,d,e,f,g,h,i,j,k,l;return"number"==typeof a?a:(c=a.match(/^(\d+) Q(\d)$/),e=a.match(/^(\d+)-(\d+)$/),f=a.match(/^(\d+)-(\d+)-(\d+)$/),h=a.match(/^(\d+) W(\d+)$/),i=a.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+)(Z|([+-])(\d\d):?(\d\d))?$/),j=a.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+):(\d+(\.\d+)?)(Z|([+-])(\d\d):?(\d\d))?$/),c?new Date(parseInt(c[1],10),3*parseInt(c[2],10)-1,1).getTime():e?new Date(parseInt(e[1],10),parseInt(e[2],10)-1,1).getTime():f?new Date(parseInt(f[1],10),parseInt(f[2],10)-1,parseInt(f[3],10)).getTime():h?(k=new Date(parseInt(h[1],10),0,1),4!==k.getDay()&&k.setMonth(0,1+(4-k.getDay()+7)%7),k.getTime()+6048e5*parseInt(h[2],10)):i?i[6]?(g=0,"Z"!==i[6]&&(g=60*parseInt(i[8],10)+parseInt(i[9],10),"+"===i[7]&&(g=0-g)),Date.UTC(parseInt(i[1],10),parseInt(i[2],10)-1,parseInt(i[3],10),parseInt(i[4],10),parseInt(i[5],10)+g)):new Date(parseInt(i[1],10),parseInt(i[2],10)-1,parseInt(i[3],10),parseInt(i[4],10),parseInt(i[5],10)).getTime():j?(l=parseFloat(j[6]),b=Math.floor(l),d=Math.round(1e3*(l-b)),j[8]?(g=0,"Z"!==j[8]&&(g=60*parseInt(j[10],10)+parseInt(j[11],10),"+"===j[9]&&(g=0-g)),Date.UTC(parseInt(j[1],10),parseInt(j[2],10)-1,parseInt(j[3],10),parseInt(j[4],10),parseInt(j[5],10)+g,b,d)):new Date(parseInt(j[1],10),parseInt(j[2],10)-1,parseInt(j[3],10),parseInt(j[4],10),parseInt(j[5],10),b,d).getTime()):new Date(parseInt(a,10),0,1).getTime())},b.Hover=function(){function c(c){null==c&&(c={}),this.options=a.extend({},b.Hover.defaults,c),this.el=a("<div class='"+this.options["class"]+"'></div>"),this.el.hide(),this.options.parent.append(this.el)}return c.defaults={"class":"morris-hover morris-default-style"},c.prototype.update=function(a,b,c){return a?(this.html(a),this.show(),this.moveTo(b,c)):this.hide()},c.prototype.html=function(a){return this.el.html(a)},c.prototype.moveTo=function(a,b){var c,d,e,f,g,h;return g=this.options.parent.innerWidth(),f=this.options.parent.innerHeight(),d=this.el.outerWidth(),c=this.el.outerHeight(),e=Math.min(Math.max(0,a-d/2),g-d),null!=b?(h=b-c-10,0>h&&(h=b+10,h+c>f&&(h=f/2-c/2))):h=f/2-c/2,this.el.css({left:e+"px",top:parseInt(h)+"px"})},c.prototype.show=function(){return this.el.show()},c.prototype.hide=function(){return this.el.hide()},c}(),b.Line=function(a){function c(a){return this.hilight=f(this.hilight,this),this.onHoverOut=f(this.onHoverOut,this),this.onHoverMove=f(this.onHoverMove,this),this.onGridClick=f(this.onGridClick,this),this instanceof b.Line?(c.__super__.constructor.call(this,a),void 0):new b.Line(a)}return h(c,a),c.prototype.init=function(){return"always"!==this.options.hideHover?(this.hover=new b.Hover({parent:this.el}),this.on("hovermove",this.onHoverMove),this.on("hoverout",this.onHoverOut),this.on("gridclick",this.onGridClick)):void 0},c.prototype.defaults={lineWidth:3,pointSize:4,lineColors:["#0b62a4","#7A92A3","#4da74d","#afd8f8","#edc240","#cb4b4b","#9440ed"],pointStrokeWidths:[1],pointStrokeColors:["#ffffff"],pointFillColors:[],smooth:!0,xLabels:"auto",xLabelFormat:null,xLabelMargin:24,hideHover:!1},c.prototype.calc=function(){return this.calcPoints(),this.generatePaths()},c.prototype.calcPoints=function(){var a,b,c,d,e,f;for(e=this.data,f=[],c=0,d=e.length;d>c;c++)a=e[c],a._x=this.transX(a.x),a._y=function(){var c,d,e,f;for(e=a.y,f=[],c=0,d=e.length;d>c;c++)b=e[c],null!=b?f.push(this.transY(b)):f.push(b);return f}.call(this),f.push(a._ymax=Math.min.apply(Math,[this.bottom].concat(function(){var c,d,e,f;for(e=a._y,f=[],c=0,d=e.length;d>c;c++)b=e[c],null!=b&&f.push(b);return f}())));return f},c.prototype.hitTest=function(a){var b,c,d,e,f;if(0===this.data.length)return null;for(f=this.data.slice(1),b=d=0,e=f.length;e>d&&(c=f[b],!(a<(c._x+this.data[b]._x)/2));b=++d);return b},c.prototype.onGridClick=function(a,b){var c;return c=this.hitTest(a),this.fire("click",c,this.data[c].src,a,b)},c.prototype.onHoverMove=function(a){var b;return b=this.hitTest(a),this.displayHoverForRow(b)},c.prototype.onHoverOut=function(){return this.options.hideHover!==!1?this.displayHoverForRow(null):void 0},c.prototype.displayHoverForRow=function(a){var b;return null!=a?((b=this.hover).update.apply(b,this.hoverContentForRow(a)),this.hilight(a)):(this.hover.hide(),this.hilight())},c.prototype.hoverContentForRow=function(a){var b,c,d,e,f,g,h;for(d=this.data[a],b="<div class='morris-hover-row-label'>"+d.label+"</div>",h=d.y,c=f=0,g=h.length;g>f;c=++f)e=h[c],b+="<div class='morris-hover-point' style='color: "+this.colorFor(d,c,"label")+"'>\n "+this.options.labels[c]+":\n "+this.yLabelFormat(e)+"\n</div>";return"function"==typeof this.options.hoverCallback&&(b=this.options.hoverCallback(a,this.options,b,d.src)),[b,d._x,d._ymax]},c.prototype.generatePaths=function(){var a,c,d,e;return this.paths=function(){var f,g,h,j;for(j=[],c=f=0,g=this.options.ykeys.length;g>=0?g>f:f>g;c=g>=0?++f:--f)e="boolean"==typeof this.options.smooth?this.options.smooth:(h=this.options.ykeys[c],i.call(this.options.smooth,h)>=0),a=function(){var a,b,e,f;for(e=this.data,f=[],a=0,b=e.length;b>a;a++)d=e[a],void 0!==d._y[c]&&f.push({x:d._x,y:d._y[c]});return f}.call(this),a.length>1?j.push(b.Line.createPath(a,e,this.bottom)):j.push(null);return j}.call(this)},c.prototype.draw=function(){var a;return((a=this.options.axes)===!0||"both"===a||"x"===a)&&this.drawXAxis(),this.drawSeries(),this.options.hideHover===!1?this.displayHoverForRow(this.data.length-1):void 0},c.prototype.drawXAxis=function(){var a,c,d,e,f,g,h,i,j,k,l=this;for(h=this.bottom+this.options.padding/2,f=null,e=null,a=function(a,b){var c,d,g,i,j;return c=l.drawXAxisLabel(l.transX(b),h,a),j=c.getBBox(),c.transform("r"+-l.options.xLabelAngle),d=c.getBBox(),c.transform("t0,"+d.height/2+"..."),0!==l.options.xLabelAngle&&(i=-.5*j.width*Math.cos(l.options.xLabelAngle*Math.PI/180),c.transform("t"+i+",0...")),d=c.getBBox(),(null==f||f>=d.x+d.width||null!=e&&e>=d.x)&&d.x>=0&&d.x+d.width<l.el.width()?(0!==l.options.xLabelAngle&&(g=1.25*l.options.gridTextSize/Math.sin(l.options.xLabelAngle*Math.PI/180),e=d.x-g),f=d.x-l.options.xLabelMargin):c.remove()},d=this.options.parseTime?1===this.data.length&&"auto"===this.options.xLabels?[[this.data[0].label,this.data[0].x]]:b.labelSeries(this.xmin,this.xmax,this.width,this.options.xLabels,this.options.xLabelFormat):function(){var a,b,c,d;for(c=this.data,d=[],a=0,b=c.length;b>a;a++)g=c[a],d.push([g.label,g.x]);return d}.call(this),d.reverse(),k=[],i=0,j=d.length;j>i;i++)c=d[i],k.push(a(c[0],c[1]));return k},c.prototype.drawSeries=function(){var a,b,c,d,e,f;for(this.seriesPoints=[],a=b=d=this.options.ykeys.length-1;0>=d?0>=b:b>=0;a=0>=d?++b:--b)this._drawLineFor(a);for(f=[],a=c=e=this.options.ykeys.length-1;0>=e?0>=c:c>=0;a=0>=e?++c:--c)f.push(this._drawPointFor(a));return f},c.prototype._drawPointFor=function(a){var b,c,d,e,f,g;for(this.seriesPoints[a]=[],f=this.data,g=[],d=0,e=f.length;e>d;d++)c=f[d],b=null,null!=c._y[a]&&(b=this.drawLinePoint(c._x,c._y[a],this.colorFor(c,a,"point"),a)),g.push(this.seriesPoints[a].push(b));return g},c.prototype._drawLineFor=function(a){var b;return b=this.paths[a],null!==b?this.drawLinePath(b,this.colorFor(null,a,"line"),a):void 0},c.createPath=function(a,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r;for(k="",c&&(g=b.Line.gradients(a)),l={y:null},h=q=0,r=a.length;r>q;h=++q)e=a[h],null!=e.y&&(null!=l.y?c?(f=g[h],j=g[h-1],i=(e.x-l.x)/4,m=l.x+i,o=Math.min(d,l.y+i*j),n=e.x-i,p=Math.min(d,e.y-i*f),k+="C"+m+","+o+","+n+","+p+","+e.x+","+e.y):k+="L"+e.x+","+e.y:c&&null==g[h]||(k+="M"+e.x+","+e.y)),l=e;return k},c.gradients=function(a){var b,c,d,e,f,g,h,i;for(c=function(a,b){return(a.y-b.y)/(a.x-b.x)},i=[],d=g=0,h=a.length;h>g;d=++g)b=a[d],null!=b.y?(e=a[d+1]||{y:null},f=a[d-1]||{y:null},null!=f.y&&null!=e.y?i.push(c(f,e)):null!=f.y?i.push(c(f,b)):null!=e.y?i.push(c(b,e)):i.push(null)):i.push(null);return i},c.prototype.hilight=function(a){var b,c,d,e,f;if(null!==this.prevHilight&&this.prevHilight!==a)for(b=c=0,e=this.seriesPoints.length-1;e>=0?e>=c:c>=e;b=e>=0?++c:--c)this.seriesPoints[b][this.prevHilight]&&this.seriesPoints[b][this.prevHilight].animate(this.pointShrinkSeries(b));if(null!==a&&this.prevHilight!==a)for(b=d=0,f=this.seriesPoints.length-1;f>=0?f>=d:d>=f;b=f>=0?++d:--d)this.seriesPoints[b][a]&&this.seriesPoints[b][a].animate(this.pointGrowSeries(b));return this.prevHilight=a},c.prototype.colorFor=function(a,b,c){return"function"==typeof this.options.lineColors?this.options.lineColors.call(this,a,b,c):"point"===c?this.options.pointFillColors[b%this.options.pointFillColors.length]||this.options.lineColors[b%this.options.lineColors.length]:this.options.lineColors[b%this.options.lineColors.length]},c.prototype.drawXAxisLabel=function(a,b,c){return this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor)},c.prototype.drawLinePath=function(a,b,c){return this.raphael.path(a).attr("stroke",b).attr("stroke-width",this.lineWidthForSeries(c))},c.prototype.drawLinePoint=function(a,b,c,d){return this.raphael.circle(a,b,this.pointSizeForSeries(d)).attr("fill",c).attr("stroke-width",this.pointStrokeWidthForSeries(d)).attr("stroke",this.pointStrokeColorForSeries(d))},c.prototype.pointStrokeWidthForSeries=function(a){return this.options.pointStrokeWidths[a%this.options.pointStrokeWidths.length]},c.prototype.pointStrokeColorForSeries=function(a){return this.options.pointStrokeColors[a%this.options.pointStrokeColors.length]},c.prototype.lineWidthForSeries=function(a){return this.options.lineWidth instanceof Array?this.options.lineWidth[a%this.options.lineWidth.length]:this.options.lineWidth},c.prototype.pointSizeForSeries=function(a){return this.options.pointSize instanceof Array?this.options.pointSize[a%this.options.pointSize.length]:this.options.pointSize},c.prototype.pointGrowSeries=function(a){return Raphael.animation({r:this.pointSizeForSeries(a)+3},25,"linear")},c.prototype.pointShrinkSeries=function(a){return Raphael.animation({r:this.pointSizeForSeries(a)},25,"linear")},c}(b.Grid),b.labelSeries=function(c,d,e,f,g){var h,i,j,k,l,m,n,o,p,q,r;if(j=200*(d-c)/e,i=new Date(c),n=b.LABEL_SPECS[f],void 0===n)for(r=b.AUTO_LABEL_ORDER,p=0,q=r.length;q>p;p++)if(k=r[p],m=b.LABEL_SPECS[k],j>=m.span){n=m;break}for(void 0===n&&(n=b.LABEL_SPECS.second),g&&(n=a.extend({},n,{fmt:g})),h=n.start(i),l=[];(o=h.getTime())<=d;)o>=c&&l.push([n.fmt(h),o]),n.incr(h);return l},c=function(a){return{span:60*a*1e3,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate(),a.getHours())},fmt:function(a){return""+b.pad2(a.getHours())+":"+b.pad2(a.getMinutes())},incr:function(b){return b.setUTCMinutes(b.getUTCMinutes()+a)}}},d=function(a){return{span:1e3*a,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate(),a.getHours(),a.getMinutes())},fmt:function(a){return""+b.pad2(a.getHours())+":"+b.pad2(a.getMinutes())+":"+b.pad2(a.getSeconds())},incr:function(b){return b.setUTCSeconds(b.getUTCSeconds()+a)}}},b.LABEL_SPECS={decade:{span:1728e8,start:function(a){return new Date(a.getFullYear()-a.getFullYear()%10,0,1)},fmt:function(a){return""+a.getFullYear()},incr:function(a){return a.setFullYear(a.getFullYear()+10)}},year:{span:1728e7,start:function(a){return new Date(a.getFullYear(),0,1)},fmt:function(a){return""+a.getFullYear()},incr:function(a){return a.setFullYear(a.getFullYear()+1)}},month:{span:24192e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),1)},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)},incr:function(a){return a.setMonth(a.getMonth()+1)}},week:{span:6048e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate())},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)+"-"+b.pad2(a.getDate())},incr:function(a){return a.setDate(a.getDate()+7)}},day:{span:864e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate())},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)+"-"+b.pad2(a.getDate())},incr:function(a){return a.setDate(a.getDate()+1)}},hour:c(60),"30min":c(30),"15min":c(15),"10min":c(10),"5min":c(5),minute:c(1),"30sec":d(30),"15sec":d(15),"10sec":d(10),"5sec":d(5),second:d(1)},b.AUTO_LABEL_ORDER=["decade","year","month","week","day","hour","30min","15min","10min","5min","minute","30sec","15sec","10sec","5sec","second"],b.Area=function(c){function d(c){var f;return this instanceof b.Area?(f=a.extend({},e,c),this.cumulative=!f.behaveLikeLine,"auto"===f.fillOpacity&&(f.fillOpacity=f.behaveLikeLine?.8:1),d.__super__.constructor.call(this,f),void 0):new b.Area(c)}var e;return h(d,c),e={fillOpacity:"auto",behaveLikeLine:!1},d.prototype.calcPoints=function(){var a,b,c,d,e,f,g;for(f=this.data,g=[],d=0,e=f.length;e>d;d++)a=f[d],a._x=this.transX(a.x),b=0,a._y=function(){var d,e,f,g;for(f=a.y,g=[],d=0,e=f.length;e>d;d++)c=f[d],this.options.behaveLikeLine?g.push(this.transY(c)):(b+=c||0,g.push(this.transY(b)));return g}.call(this),g.push(a._ymax=Math.max.apply(Math,a._y));return g},d.prototype.drawSeries=function(){var a,b,c,d,e,f,g,h;for(this.seriesPoints=[],b=this.options.behaveLikeLine?function(){f=[];for(var a=0,b=this.options.ykeys.length-1;b>=0?b>=a:a>=b;b>=0?a++:a--)f.push(a);return f}.apply(this):function(){g=[];for(var a=e=this.options.ykeys.length-1;0>=e?0>=a:a>=0;0>=e?a++:a--)g.push(a);return g}.apply(this),h=[],c=0,d=b.length;d>c;c++)a=b[c],this._drawFillFor(a),this._drawLineFor(a),h.push(this._drawPointFor(a));return h},d.prototype._drawFillFor=function(a){var b;return b=this.paths[a],null!==b?(b+="L"+this.transX(this.xmax)+","+this.bottom+"L"+this.transX(this.xmin)+","+this.bottom+"Z",this.drawFilledPath(b,this.fillForSeries(a))):void 0},d.prototype.fillForSeries=function(a){var b;return b=Raphael.rgb2hsl(this.colorFor(this.data[a],a,"line")),Raphael.hsl(b.h,this.options.behaveLikeLine?.9*b.s:.75*b.s,Math.min(.98,this.options.behaveLikeLine?1.2*b.l:1.25*b.l))},d.prototype.drawFilledPath=function(a,b){return this.raphael.path(a).attr("fill",b).attr("fill-opacity",this.options.fillOpacity).attr("stroke","none")},d}(b.Line),b.Bar=function(c){function d(c){return this.onHoverOut=f(this.onHoverOut,this),this.onHoverMove=f(this.onHoverMove,this),this.onGridClick=f(this.onGridClick,this),this instanceof b.Bar?(d.__super__.constructor.call(this,a.extend({},c,{parseTime:!1})),void 0):new b.Bar(c)}return h(d,c),d.prototype.init=function(){return this.cumulative=this.options.stacked,"always"!==this.options.hideHover?(this.hover=new b.Hover({parent:this.el}),this.on("hovermove",this.onHoverMove),this.on("hoverout",this.onHoverOut),this.on("gridclick",this.onGridClick)):void 0},d.prototype.defaults={barSizeRatio:.75,barGap:3,barColors:["#0b62a4","#7a92a3","#4da74d","#afd8f8","#edc240","#cb4b4b","#9440ed"],barOpacity:1,barRadius:[0,0,0,0],xLabelMargin:50},d.prototype.calc=function(){var a;return this.calcBars(),this.options.hideHover===!1?(a=this.hover).update.apply(a,this.hoverContentForRow(this.data.length-1)):void 0},d.prototype.calcBars=function(){var a,b,c,d,e,f,g;for(f=this.data,g=[],a=d=0,e=f.length;e>d;a=++d)b=f[a],b._x=this.left+this.width*(a+.5)/this.data.length,g.push(b._y=function(){var a,d,e,f;for(e=b.y,f=[],a=0,d=e.length;d>a;a++)c=e[a],null!=c?f.push(this.transY(c)):f.push(null);return f}.call(this));return g},d.prototype.draw=function(){var a;return((a=this.options.axes)===!0||"both"===a||"x"===a)&&this.drawXAxis(),this.drawSeries()},d.prototype.drawXAxis=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m;for(j=this.bottom+(this.options.xAxisLabelTopPadding||this.options.padding/2),g=null,f=null,m=[],a=k=0,l=this.data.length;l>=0?l>k:k>l;a=l>=0?++k:--k)h=this.data[this.data.length-1-a],b=this.drawXAxisLabel(h._x,j,h.label),i=b.getBBox(),b.transform("r"+-this.options.xLabelAngle),c=b.getBBox(),b.transform("t0,"+c.height/2+"..."),0!==this.options.xLabelAngle&&(e=-.5*i.width*Math.cos(this.options.xLabelAngle*Math.PI/180),b.transform("t"+e+",0...")),(null==g||g>=c.x+c.width||null!=f&&f>=c.x)&&c.x>=0&&c.x+c.width<this.el.width()?(0!==this.options.xLabelAngle&&(d=1.25*this.options.gridTextSize/Math.sin(this.options.xLabelAngle*Math.PI/180),f=c.x-d),m.push(g=c.x-this.options.xLabelMargin)):m.push(b.remove());return m},d.prototype.drawSeries=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o;return c=this.width/this.options.data.length,h=this.options.stacked?1:this.options.ykeys.length,a=(c*this.options.barSizeRatio-this.options.barGap*(h-1))/h,this.options.barSize&&(a=Math.min(a,this.options.barSize)),l=c-a*h-this.options.barGap*(h-1),g=l/2,o=this.ymin<=0&&this.ymax>=0?this.transY(0):null,this.bars=function(){var h,l,p,q;for(p=this.data,q=[],d=h=0,l=p.length;l>h;d=++h)i=p[d],e=0,q.push(function(){var h,l,p,q;for(p=i._y,q=[],j=h=0,l=p.length;l>h;j=++h)n=p[j],null!==n?(o?(m=Math.min(n,o),b=Math.max(n,o)):(m=n,b=this.bottom),f=this.left+d*c+g,this.options.stacked||(f+=j*(a+this.options.barGap)),k=b-m,this.options.verticalGridCondition&&this.options.verticalGridCondition(i.x)&&this.drawBar(this.left+d*c,this.top,c,Math.abs(this.top-this.bottom),this.options.verticalGridColor,this.options.verticalGridOpacity,this.options.barRadius),this.options.stacked&&(m-=e),this.drawBar(f,m,a,k,this.colorFor(i,j,"bar"),this.options.barOpacity,this.options.barRadius),q.push(e+=k)):q.push(null);return q}.call(this));return q}.call(this)},d.prototype.colorFor=function(a,b,c){var d,e;return"function"==typeof this.options.barColors?(d={x:a.x,y:a.y[b],label:a.label},e={index:b,key:this.options.ykeys[b],label:this.options.labels[b]},this.options.barColors.call(this,d,e,c)):this.options.barColors[b%this.options.barColors.length]},d.prototype.hitTest=function(a){return 0===this.data.length?null:(a=Math.max(Math.min(a,this.right),this.left),Math.min(this.data.length-1,Math.floor((a-this.left)/(this.width/this.data.length))))},d.prototype.onGridClick=function(a,b){var c;return c=this.hitTest(a),this.fire("click",c,this.data[c].src,a,b)},d.prototype.onHoverMove=function(a){var b,c;return b=this.hitTest(a),(c=this.hover).update.apply(c,this.hoverContentForRow(b))},d.prototype.onHoverOut=function(){return this.options.hideHover!==!1?this.hover.hide():void 0},d.prototype.hoverContentForRow=function(a){var b,c,d,e,f,g,h,i;for(d=this.data[a],b="<div class='morris-hover-row-label'>"+d.label+"</div>",i=d.y,c=g=0,h=i.length;h>g;c=++g)f=i[c],b+="<div class='morris-hover-point' style='color: "+this.colorFor(d,c,"label")+"'>\n "+this.options.labels[c]+":\n "+this.yLabelFormat(f)+"\n</div>";return"function"==typeof this.options.hoverCallback&&(b=this.options.hoverCallback(a,this.options,b,d.src)),e=this.left+(a+.5)*this.width/this.data.length,[b,e]},d.prototype.drawXAxisLabel=function(a,b,c){var d;return d=this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor)},d.prototype.drawBar=function(a,b,c,d,e,f,g){var h,i;return h=Math.max.apply(Math,g),i=0===h||h>d?this.raphael.rect(a,b,c,d):this.raphael.path(this.roundedRect(a,b,c,d,g)),i.attr("fill",e).attr("fill-opacity",f).attr("stroke","none")},d.prototype.roundedRect=function(a,b,c,d,e){return null==e&&(e=[0,0,0,0]),["M",a,e[0]+b,"Q",a,b,a+e[0],b,"L",a+c-e[1],b,"Q",a+c,b,a+c,b+e[1],"L",a+c,b+d-e[2],"Q",a+c,b+d,a+c-e[2],b+d,"L",a+e[3],b+d,"Q",a,b+d,a,b+d-e[3],"Z"]},d}(b.Grid),b.Donut=function(c){function d(c){this.resizeHandler=f(this.resizeHandler,this),this.select=f(this.select,this),this.click=f(this.click,this);var d=this;if(!(this instanceof b.Donut))return new b.Donut(c);if(this.options=a.extend({},this.defaults,c),this.el="string"==typeof c.element?a(document.getElementById(c.element)):a(c.element),null===this.el||0===this.el.length)throw new Error("Graph placeholder not found.");void 0!==c.data&&0!==c.data.length&&(this.raphael=new Raphael(this.el[0]),this.options.resize&&a(window).bind("resize",function(){return null!=d.timeoutId&&window.clearTimeout(d.timeoutId),d.timeoutId=window.setTimeout(d.resizeHandler,100)}),this.setData(c.data))}return h(d,c),d.prototype.defaults={colors:["#0B62A4","#3980B5","#679DC6","#95BBD7","#B0CCE1","#095791","#095085","#083E67","#052C48","#042135"],backgroundColor:"#FFFFFF",labelColor:"#000000",formatter:b.commas,resize:!1},d.prototype.redraw=function(){var a,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x;for(this.raphael.clear(),c=this.el.width()/2,d=this.el.height()/2,n=(Math.min(c,d)-10)/3,l=0,u=this.values,o=0,r=u.length;r>o;o++)m=u[o],l+=m;for(i=5/(2*n),a=1.9999*Math.PI-i*this.data.length,g=0,f=0,this.segments=[],v=this.values,e=p=0,s=v.length;s>p;e=++p)m=v[e],j=g+i+a*(m/l),k=new b.DonutSegment(c,d,2*n,n,g,j,this.data[e].color||this.options.colors[f%this.options.colors.length],this.options.backgroundColor,f,this.raphael),k.render(),this.segments.push(k),k.on("hover",this.select),k.on("click",this.click),g=j,f+=1;for(this.text1=this.drawEmptyDonutLabel(c,d-10,this.options.labelColor,15,800),this.text2=this.drawEmptyDonutLabel(c,d+10,this.options.labelColor,14),h=Math.max.apply(Math,this.values),f=0,w=this.values,x=[],q=0,t=w.length;t>q;q++){if(m=w[q],m===h){this.select(f); +break}x.push(f+=1)}return x},d.prototype.setData=function(a){var b;return this.data=a,this.values=function(){var a,c,d,e;for(d=this.data,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(parseFloat(b.value));return e}.call(this),this.redraw()},d.prototype.click=function(a){return this.fire("click",a,this.data[a])},d.prototype.select=function(a){var b,c,d,e,f,g;for(g=this.segments,e=0,f=g.length;f>e;e++)c=g[e],c.deselect();return d=this.segments[a],d.select(),b=this.data[a],this.setLabels(b.label,this.options.formatter(b.value,b))},d.prototype.setLabels=function(a,b){var c,d,e,f,g,h,i,j;return c=2*(Math.min(this.el.width()/2,this.el.height()/2)-10)/3,f=1.8*c,e=c/2,d=c/3,this.text1.attr({text:a,transform:""}),g=this.text1.getBBox(),h=Math.min(f/g.width,e/g.height),this.text1.attr({transform:"S"+h+","+h+","+(g.x+g.width/2)+","+(g.y+g.height)}),this.text2.attr({text:b,transform:""}),i=this.text2.getBBox(),j=Math.min(f/i.width,d/i.height),this.text2.attr({transform:"S"+j+","+j+","+(i.x+i.width/2)+","+i.y})},d.prototype.drawEmptyDonutLabel=function(a,b,c,d,e){var f;return f=this.raphael.text(a,b,"").attr("font-size",d).attr("fill",c),null!=e&&f.attr("font-weight",e),f},d.prototype.resizeHandler=function(){return this.timeoutId=null,this.raphael.setSize(this.el.width(),this.el.height()),this.redraw()},d}(b.EventEmitter),b.DonutSegment=function(a){function b(a,b,c,d,e,g,h,i,j,k){this.cx=a,this.cy=b,this.inner=c,this.outer=d,this.color=h,this.backgroundColor=i,this.index=j,this.raphael=k,this.deselect=f(this.deselect,this),this.select=f(this.select,this),this.sin_p0=Math.sin(e),this.cos_p0=Math.cos(e),this.sin_p1=Math.sin(g),this.cos_p1=Math.cos(g),this.is_long=g-e>Math.PI?1:0,this.path=this.calcSegment(this.inner+3,this.inner+this.outer-5),this.selectedPath=this.calcSegment(this.inner+3,this.inner+this.outer),this.hilight=this.calcArc(this.inner)}return h(b,a),b.prototype.calcArcPoints=function(a){return[this.cx+a*this.sin_p0,this.cy+a*this.cos_p0,this.cx+a*this.sin_p1,this.cy+a*this.cos_p1]},b.prototype.calcSegment=function(a,b){var c,d,e,f,g,h,i,j,k,l;return k=this.calcArcPoints(a),c=k[0],e=k[1],d=k[2],f=k[3],l=this.calcArcPoints(b),g=l[0],i=l[1],h=l[2],j=l[3],"M"+c+","+e+("A"+a+","+a+",0,"+this.is_long+",0,"+d+","+f)+("L"+h+","+j)+("A"+b+","+b+",0,"+this.is_long+",1,"+g+","+i)+"Z"},b.prototype.calcArc=function(a){var b,c,d,e,f;return f=this.calcArcPoints(a),b=f[0],d=f[1],c=f[2],e=f[3],"M"+b+","+d+("A"+a+","+a+",0,"+this.is_long+",0,"+c+","+e)},b.prototype.render=function(){var a=this;return this.arc=this.drawDonutArc(this.hilight,this.color),this.seg=this.drawDonutSegment(this.path,this.color,this.backgroundColor,function(){return a.fire("hover",a.index)},function(){return a.fire("click",a.index)})},b.prototype.drawDonutArc=function(a,b){return this.raphael.path(a).attr({stroke:b,"stroke-width":2,opacity:0})},b.prototype.drawDonutSegment=function(a,b,c,d,e){return this.raphael.path(a).attr({fill:b,stroke:c,"stroke-width":3}).hover(d).click(e)},b.prototype.select=function(){return this.selected?void 0:(this.seg.animate({path:this.selectedPath},150,"<>"),this.arc.animate({opacity:1},150,"<>"),this.selected=!0)},b.prototype.deselect=function(){return this.selected?(this.seg.animate({path:this.path},150,"<>"),this.arc.animate({opacity:0},150,"<>"),this.selected=!1):void 0},b}(b.EventEmitter)}).call(this); \ No newline at end of file diff --git a/theme/bootstrap/views/js/plugins/morris/raphael.min.js b/theme/bootstrap/views/js/plugins/morris/raphael.min.js new file mode 100644 index 0000000..b40a005 --- /dev/null +++ b/theme/bootstrap/views/js/plugins/morris/raphael.min.js @@ -0,0 +1,11 @@ +// ┌────────────────────────────────────────────────────────────────────┐ \\ +// │ Raphaël 2.1.2 - JavaScript Vector Library │ \\ +// ├────────────────────────────────────────────────────────────────────┤ \\ +// │ Copyright © 2008-2012 Dmitry Baranovskiy (http://raphaeljs.com) │ \\ +// │ Copyright © 2008-2012 Sencha Labs (http://sencha.com) │ \\ +// ├────────────────────────────────────────────────────────────────────┤ \\ +// │ Licensed under the MIT (http://raphaeljs.com/license.html) license.│ \\ +// └────────────────────────────────────────────────────────────────────┘ \\ +!function(a){var b,c,d="0.4.2",e="hasOwnProperty",f=/[\.\/]/,g="*",h=function(){},i=function(a,b){return a-b},j={n:{}},k=function(a,d){a=String(a);var e,f=c,g=Array.prototype.slice.call(arguments,2),h=k.listeners(a),j=0,l=[],m={},n=[],o=b;b=a,c=0;for(var p=0,q=h.length;q>p;p++)"zIndex"in h[p]&&(l.push(h[p].zIndex),h[p].zIndex<0&&(m[h[p].zIndex]=h[p]));for(l.sort(i);l[j]<0;)if(e=m[l[j++]],n.push(e.apply(d,g)),c)return c=f,n;for(p=0;q>p;p++)if(e=h[p],"zIndex"in e)if(e.zIndex==l[j]){if(n.push(e.apply(d,g)),c)break;do if(j++,e=m[l[j]],e&&n.push(e.apply(d,g)),c)break;while(e)}else m[e.zIndex]=e;else if(n.push(e.apply(d,g)),c)break;return c=f,b=o,n.length?n:null};k._events=j,k.listeners=function(a){var b,c,d,e,h,i,k,l,m=a.split(f),n=j,o=[n],p=[];for(e=0,h=m.length;h>e;e++){for(l=[],i=0,k=o.length;k>i;i++)for(n=o[i].n,c=[n[m[e]],n[g]],d=2;d--;)b=c[d],b&&(l.push(b),p=p.concat(b.f||[]));o=l}return p},k.on=function(a,b){if(a=String(a),"function"!=typeof b)return function(){};for(var c=a.split(f),d=j,e=0,g=c.length;g>e;e++)d=d.n,d=d.hasOwnProperty(c[e])&&d[c[e]]||(d[c[e]]={n:{}});for(d.f=d.f||[],e=0,g=d.f.length;g>e;e++)if(d.f[e]==b)return h;return d.f.push(b),function(a){+a==+a&&(b.zIndex=+a)}},k.f=function(a){var b=[].slice.call(arguments,1);return function(){k.apply(null,[a,null].concat(b).concat([].slice.call(arguments,0)))}},k.stop=function(){c=1},k.nt=function(a){return a?new RegExp("(?:\\.|\\/|^)"+a+"(?:\\.|\\/|$)").test(b):b},k.nts=function(){return b.split(f)},k.off=k.unbind=function(a,b){if(!a)return k._events=j={n:{}},void 0;var c,d,h,i,l,m,n,o=a.split(f),p=[j];for(i=0,l=o.length;l>i;i++)for(m=0;m<p.length;m+=h.length-2){if(h=[m,1],c=p[m].n,o[i]!=g)c[o[i]]&&h.push(c[o[i]]);else for(d in c)c[e](d)&&h.push(c[d]);p.splice.apply(p,h)}for(i=0,l=p.length;l>i;i++)for(c=p[i];c.n;){if(b){if(c.f){for(m=0,n=c.f.length;n>m;m++)if(c.f[m]==b){c.f.splice(m,1);break}!c.f.length&&delete c.f}for(d in c.n)if(c.n[e](d)&&c.n[d].f){var q=c.n[d].f;for(m=0,n=q.length;n>m;m++)if(q[m]==b){q.splice(m,1);break}!q.length&&delete c.n[d].f}}else{delete c.f;for(d in c.n)c.n[e](d)&&c.n[d].f&&delete c.n[d].f}c=c.n}},k.once=function(a,b){var c=function(){return k.unbind(a,c),b.apply(this,arguments)};return k.on(a,c)},k.version=d,k.toString=function(){return"You are running Eve "+d},"undefined"!=typeof module&&module.exports?module.exports=k:"undefined"!=typeof define?define("eve",[],function(){return k}):a.eve=k}(this),function(a,b){"function"==typeof define&&define.amd?define(["eve"],function(c){return b(a,c)}):b(a,a.eve)}(this,function(a,b){function c(a){if(c.is(a,"function"))return u?a():b.on("raphael.DOMload",a);if(c.is(a,V))return c._engine.create[D](c,a.splice(0,3+c.is(a[0],T))).add(a);var d=Array.prototype.slice.call(arguments,0);if(c.is(d[d.length-1],"function")){var e=d.pop();return u?e.call(c._engine.create[D](c,d)):b.on("raphael.DOMload",function(){e.call(c._engine.create[D](c,d))})}return c._engine.create[D](c,arguments)}function d(a){if("function"==typeof a||Object(a)!==a)return a;var b=new a.constructor;for(var c in a)a[z](c)&&(b[c]=d(a[c]));return b}function e(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return a.push(a.splice(c,1)[0])}function f(a,b,c){function d(){var f=Array.prototype.slice.call(arguments,0),g=f.join("␀"),h=d.cache=d.cache||{},i=d.count=d.count||[];return h[z](g)?(e(i,g),c?c(h[g]):h[g]):(i.length>=1e3&&delete h[i.shift()],i.push(g),h[g]=a[D](b,f),c?c(h[g]):h[g])}return d}function g(){return this.hex}function h(a,b){for(var c=[],d=0,e=a.length;e-2*!b>d;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push(["C",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])}return c}function i(a,b,c,d,e){var f=-3*b+9*c-9*d+3*e,g=a*f+6*b-12*c+6*d;return a*g-3*b+3*c}function j(a,b,c,d,e,f,g,h,j){null==j&&(j=1),j=j>1?1:0>j?0:j;for(var k=j/2,l=12,m=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],n=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],o=0,p=0;l>p;p++){var q=k*m[p]+k,r=i(q,a,c,e,g),s=i(q,b,d,f,h),t=r*r+s*s;o+=n[p]*N.sqrt(t)}return k*o}function k(a,b,c,d,e,f,g,h,i){if(!(0>i||j(a,b,c,d,e,f,g,h)<i)){var k,l=1,m=l/2,n=l-m,o=.01;for(k=j(a,b,c,d,e,f,g,h,n);Q(k-i)>o;)m/=2,n+=(i>k?1:-1)*m,k=j(a,b,c,d,e,f,g,h,n);return n}}function l(a,b,c,d,e,f,g,h){if(!(O(a,c)<P(e,g)||P(a,c)>O(e,g)||O(b,d)<P(f,h)||P(b,d)>O(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(k){var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(!(n<+P(a,c).toFixed(2)||n>+O(a,c).toFixed(2)||n<+P(e,g).toFixed(2)||n>+O(e,g).toFixed(2)||o<+P(b,d).toFixed(2)||o>+O(b,d).toFixed(2)||o<+P(f,h).toFixed(2)||o>+O(f,h).toFixed(2)))return{x:l,y:m}}}}function m(a,b,d){var e=c.bezierBBox(a),f=c.bezierBBox(b);if(!c.isBBoxIntersect(e,f))return d?0:[];for(var g=j.apply(0,a),h=j.apply(0,b),i=O(~~(g/5),1),k=O(~~(h/5),1),m=[],n=[],o={},p=d?0:[],q=0;i+1>q;q++){var r=c.findDotsAtSegment.apply(c,a.concat(q/i));m.push({x:r.x,y:r.y,t:q/i})}for(q=0;k+1>q;q++)r=c.findDotsAtSegment.apply(c,b.concat(q/k)),n.push({x:r.x,y:r.y,t:q/k});for(q=0;i>q;q++)for(var s=0;k>s;s++){var t=m[q],u=m[q+1],v=n[s],w=n[s+1],x=Q(u.x-t.x)<.001?"y":"x",y=Q(w.x-v.x)<.001?"y":"x",z=l(t.x,t.y,u.x,u.y,v.x,v.y,w.x,w.y);if(z){if(o[z.x.toFixed(4)]==z.y.toFixed(4))continue;o[z.x.toFixed(4)]=z.y.toFixed(4);var A=t.t+Q((z[x]-t[x])/(u[x]-t[x]))*(u.t-t.t),B=v.t+Q((z[y]-v[y])/(w[y]-v[y]))*(w.t-v.t);A>=0&&1.001>=A&&B>=0&&1.001>=B&&(d?p++:p.push({x:z.x,y:z.y,t1:P(A,1),t2:P(B,1)}))}}return p}function n(a,b,d){a=c._path2curve(a),b=c._path2curve(b);for(var e,f,g,h,i,j,k,l,n,o,p=d?0:[],q=0,r=a.length;r>q;q++){var s=a[q];if("M"==s[0])e=i=s[1],f=j=s[2];else{"C"==s[0]?(n=[e,f].concat(s.slice(1)),e=n[6],f=n[7]):(n=[e,f,e,f,i,j,i,j],e=i,f=j);for(var t=0,u=b.length;u>t;t++){var v=b[t];if("M"==v[0])g=k=v[1],h=l=v[2];else{"C"==v[0]?(o=[g,h].concat(v.slice(1)),g=o[6],h=o[7]):(o=[g,h,g,h,k,l,k,l],g=k,h=l);var w=m(n,o,d);if(d)p+=w;else{for(var x=0,y=w.length;y>x;x++)w[x].segment1=q,w[x].segment2=t,w[x].bez1=n,w[x].bez2=o;p=p.concat(w)}}}}}return p}function o(a,b,c,d,e,f){null!=a?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function p(){return this.x+H+this.y+H+this.width+" × "+this.height}function q(a,b,c,d,e,f){function g(a){return((l*a+k)*a+j)*a}function h(a,b){var c=i(a,b);return((o*c+n)*c+m)*c}function i(a,b){var c,d,e,f,h,i;for(e=a,i=0;8>i;i++){if(f=g(e)-a,Q(f)<b)return e;if(h=(3*l*e+2*k)*e+j,Q(h)<1e-6)break;e-=f/h}if(c=0,d=1,e=a,c>e)return c;if(e>d)return d;for(;d>c;){if(f=g(e),Q(f-a)<b)return e;a>f?c=e:d=e,e=(d-c)/2+c}return e}var j=3*b,k=3*(d-b)-j,l=1-j-k,m=3*c,n=3*(e-c)-m,o=1-m-n;return h(a,1/(200*f))}function r(a,b){var c=[],d={};if(this.ms=b,this.times=1,a){for(var e in a)a[z](e)&&(d[_(e)]=a[e],c.push(_(e)));c.sort(lb)}this.anim=d,this.top=c[c.length-1],this.percents=c}function s(a,d,e,f,g,h){e=_(e);var i,j,k,l,m,n,p=a.ms,r={},s={},t={};if(f)for(v=0,x=ic.length;x>v;v++){var u=ic[v];if(u.el.id==d.id&&u.anim==a){u.percent!=e?(ic.splice(v,1),k=1):j=u,d.attr(u.totalOrigin);break}}else f=+s;for(var v=0,x=a.percents.length;x>v;v++){if(a.percents[v]==e||a.percents[v]>f*a.top){e=a.percents[v],m=a.percents[v-1]||0,p=p/a.top*(e-m),l=a.percents[v+1],i=a.anim[e];break}f&&d.attr(a.anim[a.percents[v]])}if(i){if(j)j.initstatus=f,j.start=new Date-j.ms*f;else{for(var y in i)if(i[z](y)&&(db[z](y)||d.paper.customAttributes[z](y)))switch(r[y]=d.attr(y),null==r[y]&&(r[y]=cb[y]),s[y]=i[y],db[y]){case T:t[y]=(s[y]-r[y])/p;break;case"colour":r[y]=c.getRGB(r[y]);var A=c.getRGB(s[y]);t[y]={r:(A.r-r[y].r)/p,g:(A.g-r[y].g)/p,b:(A.b-r[y].b)/p};break;case"path":var B=Kb(r[y],s[y]),C=B[1];for(r[y]=B[0],t[y]=[],v=0,x=r[y].length;x>v;v++){t[y][v]=[0];for(var D=1,F=r[y][v].length;F>D;D++)t[y][v][D]=(C[v][D]-r[y][v][D])/p}break;case"transform":var G=d._,H=Pb(G[y],s[y]);if(H)for(r[y]=H.from,s[y]=H.to,t[y]=[],t[y].real=!0,v=0,x=r[y].length;x>v;v++)for(t[y][v]=[r[y][v][0]],D=1,F=r[y][v].length;F>D;D++)t[y][v][D]=(s[y][v][D]-r[y][v][D])/p;else{var K=d.matrix||new o,L={_:{transform:G.transform},getBBox:function(){return d.getBBox(1)}};r[y]=[K.a,K.b,K.c,K.d,K.e,K.f],Nb(L,s[y]),s[y]=L._.transform,t[y]=[(L.matrix.a-K.a)/p,(L.matrix.b-K.b)/p,(L.matrix.c-K.c)/p,(L.matrix.d-K.d)/p,(L.matrix.e-K.e)/p,(L.matrix.f-K.f)/p]}break;case"csv":var M=I(i[y])[J](w),N=I(r[y])[J](w);if("clip-rect"==y)for(r[y]=N,t[y]=[],v=N.length;v--;)t[y][v]=(M[v]-r[y][v])/p;s[y]=M;break;default:for(M=[][E](i[y]),N=[][E](r[y]),t[y]=[],v=d.paper.customAttributes[y].length;v--;)t[y][v]=((M[v]||0)-(N[v]||0))/p}var O=i.easing,P=c.easing_formulas[O];if(!P)if(P=I(O).match(Z),P&&5==P.length){var Q=P;P=function(a){return q(a,+Q[1],+Q[2],+Q[3],+Q[4],p)}}else P=nb;if(n=i.start||a.start||+new Date,u={anim:a,percent:e,timestamp:n,start:n+(a.del||0),status:0,initstatus:f||0,stop:!1,ms:p,easing:P,from:r,diff:t,to:s,el:d,callback:i.callback,prev:m,next:l,repeat:h||a.times,origin:d.attr(),totalOrigin:g},ic.push(u),f&&!j&&!k&&(u.stop=!0,u.start=new Date-p*f,1==ic.length))return kc();k&&(u.start=new Date-u.ms*f),1==ic.length&&jc(kc)}b("raphael.anim.start."+d.id,d,a)}}function t(a){for(var b=0;b<ic.length;b++)ic[b].el.paper==a&&ic.splice(b--,1)}c.version="2.1.2",c.eve=b;var u,v,w=/[, ]+/,x={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},y=/\{(\d+)\}/g,z="hasOwnProperty",A={doc:document,win:a},B={was:Object.prototype[z].call(A.win,"Raphael"),is:A.win.Raphael},C=function(){this.ca=this.customAttributes={}},D="apply",E="concat",F="ontouchstart"in A.win||A.win.DocumentTouch&&A.doc instanceof DocumentTouch,G="",H=" ",I=String,J="split",K="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[J](H),L={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},M=I.prototype.toLowerCase,N=Math,O=N.max,P=N.min,Q=N.abs,R=N.pow,S=N.PI,T="number",U="string",V="array",W=Object.prototype.toString,X=(c._ISURL=/^url\(['"]?([^\)]+?)['"]?\)$/i,/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i),Y={NaN:1,Infinity:1,"-Infinity":1},Z=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,$=N.round,_=parseFloat,ab=parseInt,bb=I.prototype.toUpperCase,cb=c._availableAttrs={"arrow-end":"none","arrow-start":"none",blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/","letter-spacing":0,opacity:1,path:"M0,0",r:0,rx:0,ry:0,src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",transform:"",width:0,x:0,y:0},db=c._availableAnimAttrs={blur:T,"clip-rect":"csv",cx:T,cy:T,fill:"colour","fill-opacity":T,"font-size":T,height:T,opacity:T,path:"path",r:T,rx:T,ry:T,stroke:"colour","stroke-opacity":T,"stroke-width":T,transform:"transform",width:T,x:T,y:T},eb=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/,fb={hs:1,rg:1},gb=/,?([achlmqrstvxz]),?/gi,hb=/([achlmrqstvz])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,ib=/([rstm])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,jb=/(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/gi,kb=(c._radial_gradient=/^r(?:\(([^,]+?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*([^\)]+?)\))?/,{}),lb=function(a,b){return _(a)-_(b)},mb=function(){},nb=function(a){return a},ob=c._rectPath=function(a,b,c,d,e){return e?[["M",a+e,b],["l",c-2*e,0],["a",e,e,0,0,1,e,e],["l",0,d-2*e],["a",e,e,0,0,1,-e,e],["l",2*e-c,0],["a",e,e,0,0,1,-e,-e],["l",0,2*e-d],["a",e,e,0,0,1,e,-e],["z"]]:[["M",a,b],["l",c,0],["l",0,d],["l",-c,0],["z"]]},pb=function(a,b,c,d){return null==d&&(d=c),[["M",a,b],["m",0,-d],["a",c,d,0,1,1,0,2*d],["a",c,d,0,1,1,0,-2*d],["z"]]},qb=c._getPath={path:function(a){return a.attr("path")},circle:function(a){var b=a.attrs;return pb(b.cx,b.cy,b.r)},ellipse:function(a){var b=a.attrs;return pb(b.cx,b.cy,b.rx,b.ry)},rect:function(a){var b=a.attrs;return ob(b.x,b.y,b.width,b.height,b.r)},image:function(a){var b=a.attrs;return ob(b.x,b.y,b.width,b.height)},text:function(a){var b=a._getBBox();return ob(b.x,b.y,b.width,b.height)},set:function(a){var b=a._getBBox();return ob(b.x,b.y,b.width,b.height)}},rb=c.mapPath=function(a,b){if(!b)return a;var c,d,e,f,g,h,i;for(a=Kb(a),e=0,g=a.length;g>e;e++)for(i=a[e],f=1,h=i.length;h>f;f+=2)c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d;return a};if(c._g=A,c.type=A.win.SVGAngle||A.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML","VML"==c.type){var sb,tb=A.doc.createElement("div");if(tb.innerHTML='<v:shape adj="1"/>',sb=tb.firstChild,sb.style.behavior="url(#default#VML)",!sb||"object"!=typeof sb.adj)return c.type=G;tb=null}c.svg=!(c.vml="VML"==c.type),c._Paper=C,c.fn=v=C.prototype=c.prototype,c._id=0,c._oid=0,c.is=function(a,b){return b=M.call(b),"finite"==b?!Y[z](+a):"array"==b?a instanceof Array:"null"==b&&null===a||b==typeof a&&null!==a||"object"==b&&a===Object(a)||"array"==b&&Array.isArray&&Array.isArray(a)||W.call(a).slice(8,-1).toLowerCase()==b},c.angle=function(a,b,d,e,f,g){if(null==f){var h=a-d,i=b-e;return h||i?(180+180*N.atan2(-i,-h)/S+360)%360:0}return c.angle(a,b,f,g)-c.angle(d,e,f,g)},c.rad=function(a){return a%360*S/180},c.deg=function(a){return 180*a/S%360},c.snapTo=function(a,b,d){if(d=c.is(d,"finite")?d:10,c.is(a,V)){for(var e=a.length;e--;)if(Q(a[e]-b)<=d)return a[e]}else{a=+a;var f=b%a;if(d>f)return b-f;if(f>a-d)return b-f+a}return b},c.createUUID=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=0|16*N.random(),c="x"==a?b:8|3&b;return c.toString(16)}),c.setWindow=function(a){b("raphael.setWindow",c,A.win,a),A.win=a,A.doc=A.win.document,c._engine.initWin&&c._engine.initWin(A.win)};var ub=function(a){if(c.vml){var b,d=/^\s+|\s+$/g;try{var e=new ActiveXObject("htmlfile");e.write("<body>"),e.close(),b=e.body}catch(g){b=createPopup().document.body}var h=b.createTextRange();ub=f(function(a){try{b.style.color=I(a).replace(d,G);var c=h.queryCommandValue("ForeColor");return c=(255&c)<<16|65280&c|(16711680&c)>>>16,"#"+("000000"+c.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=A.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",A.doc.body.appendChild(i),ub=f(function(a){return i.style.color=a,A.doc.defaultView.getComputedStyle(i,G).getPropertyValue("color")})}return ub(a)},vb=function(){return"hsb("+[this.h,this.s,this.b]+")"},wb=function(){return"hsl("+[this.h,this.s,this.l]+")"},xb=function(){return this.hex},yb=function(a,b,d){if(null==b&&c.is(a,"object")&&"r"in a&&"g"in a&&"b"in a&&(d=a.b,b=a.g,a=a.r),null==b&&c.is(a,U)){var e=c.getRGB(a);a=e.r,b=e.g,d=e.b}return(a>1||b>1||d>1)&&(a/=255,b/=255,d/=255),[a,b,d]},zb=function(a,b,d,e){a*=255,b*=255,d*=255;var f={r:a,g:b,b:d,hex:c.rgb(a,b,d),toString:xb};return c.is(e,"finite")&&(f.opacity=e),f};c.color=function(a){var b;return c.is(a,"object")&&"h"in a&&"s"in a&&"b"in a?(b=c.hsb2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.hex=b.hex):c.is(a,"object")&&"h"in a&&"s"in a&&"l"in a?(b=c.hsl2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.hex=b.hex):(c.is(a,"string")&&(a=c.getRGB(a)),c.is(a,"object")&&"r"in a&&"g"in a&&"b"in a?(b=c.rgb2hsl(a),a.h=b.h,a.s=b.s,a.l=b.l,b=c.rgb2hsb(a),a.v=b.b):(a={hex:"none"},a.r=a.g=a.b=a.h=a.s=a.v=a.l=-1)),a.toString=xb,a},c.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,a=a.h,d=a.o),a*=360;var e,f,g,h,i;return a=a%360/60,i=c*b,h=i*(1-Q(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],zb(e,f,g,d)},c.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h),(a>1||b>1||c>1)&&(a/=360,b/=100,c/=100),a*=360;var e,f,g,h,i;return a=a%360/60,i=2*b*(.5>c?c:1-c),h=i*(1-Q(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],zb(e,f,g,d)},c.rgb2hsb=function(a,b,c){c=yb(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;return f=O(a,b,c),g=f-P(a,b,c),d=0==g?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=60*((d+360)%6)/360,e=0==g?0:g/f,{h:d,s:e,b:f,toString:vb}},c.rgb2hsl=function(a,b,c){c=yb(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;return g=O(a,b,c),h=P(a,b,c),i=g-h,d=0==i?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=60*((d+360)%6)/360,f=(g+h)/2,e=0==i?0:.5>f?i/(2*f):i/(2-2*f),{h:d,s:e,l:f,toString:wb}},c._path2string=function(){return this.join(",").replace(gb,"$1")},c._preload=function(a,b){var c=A.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top:-9999em",c.onload=function(){b.call(this),this.onload=null,A.doc.body.removeChild(this)},c.onerror=function(){A.doc.body.removeChild(this)},A.doc.body.appendChild(c),c.src=a},c.getRGB=f(function(a){if(!a||(a=I(a)).indexOf("-")+1)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:g};if("none"==a)return{r:-1,g:-1,b:-1,hex:"none",toString:g};!(fb[z](a.toLowerCase().substring(0,2))||"#"==a.charAt())&&(a=ub(a));var b,d,e,f,h,i,j=a.match(X);return j?(j[2]&&(e=ab(j[2].substring(5),16),d=ab(j[2].substring(3,5),16),b=ab(j[2].substring(1,3),16)),j[3]&&(e=ab((h=j[3].charAt(3))+h,16),d=ab((h=j[3].charAt(2))+h,16),b=ab((h=j[3].charAt(1))+h,16)),j[4]&&(i=j[4][J](eb),b=_(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),"rgba"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&"%"==i[3].slice(-1)&&(f/=100)),j[5]?(i=j[5][J](eb),b=_(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(b/=360),"hsba"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&"%"==i[3].slice(-1)&&(f/=100),c.hsb2rgb(b,d,e,f)):j[6]?(i=j[6][J](eb),b=_(i[0]),"%"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),"%"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),"%"==i[2].slice(-1)&&(e*=2.55),("deg"==i[0].slice(-3)||"°"==i[0].slice(-1))&&(b/=360),"hsla"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&"%"==i[3].slice(-1)&&(f/=100),c.hsl2rgb(b,d,e,f)):(j={r:b,g:d,b:e,toString:g},j.hex="#"+(16777216|e|d<<8|b<<16).toString(16).slice(1),c.is(f,"finite")&&(j.opacity=f),j)):{r:-1,g:-1,b:-1,hex:"none",error:1,toString:g}},c),c.hsb=f(function(a,b,d){return c.hsb2rgb(a,b,d).hex}),c.hsl=f(function(a,b,d){return c.hsl2rgb(a,b,d).hex}),c.rgb=f(function(a,b,c){return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),c.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);return b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b})),c.hex},c.getColor.reset=function(){delete this.start},c.parsePathString=function(a){if(!a)return null;var b=Ab(a);if(b.arr)return Cb(b.arr);var d={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},e=[];return c.is(a,V)&&c.is(a[0],V)&&(e=Cb(a)),e.length||I(a).replace(hb,function(a,b,c){var f=[],g=b.toLowerCase();if(c.replace(jb,function(a,b){b&&f.push(+b)}),"m"==g&&f.length>2&&(e.push([b][E](f.splice(0,2))),g="l",b="m"==b?"l":"L"),"r"==g)e.push([b][E](f));else for(;f.length>=d[g]&&(e.push([b][E](f.splice(0,d[g]))),d[g]););}),e.toString=c._path2string,b.arr=Cb(e),e},c.parseTransformString=f(function(a){if(!a)return null;var b=[];return c.is(a,V)&&c.is(a[0],V)&&(b=Cb(a)),b.length||I(a).replace(ib,function(a,c,d){var e=[];M.call(c),d.replace(jb,function(a,b){b&&e.push(+b)}),b.push([c][E](e))}),b.toString=c._path2string,b});var Ab=function(a){var b=Ab.ps=Ab.ps||{};return b[a]?b[a].sleep=100:b[a]={sleep:100},setTimeout(function(){for(var c in b)b[z](c)&&c!=a&&(b[c].sleep--,!b[c].sleep&&delete b[c])}),b[a]};c.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=R(j,3),l=R(j,2),m=i*i,n=m*i,o=k*a+3*l*i*c+3*j*i*i*e+n*g,p=k*b+3*l*i*d+3*j*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,w=j*e+i*g,x=j*f+i*h,y=90-180*N.atan2(q-s,r-t)/S;return(q>s||t>r)&&(y+=180),{x:o,y:p,m:{x:q,y:r},n:{x:s,y:t},start:{x:u,y:v},end:{x:w,y:x},alpha:y}},c.bezierBBox=function(a,b,d,e,f,g,h,i){c.is(a,"array")||(a=[a,b,d,e,f,g,h,i]);var j=Jb.apply(null,a);return{x:j.min.x,y:j.min.y,x2:j.max.x,y2:j.max.y,width:j.max.x-j.min.x,height:j.max.y-j.min.y}},c.isPointInsideBBox=function(a,b,c){return b>=a.x&&b<=a.x2&&c>=a.y&&c<=a.y2},c.isBBoxIntersect=function(a,b){var d=c.isPointInsideBBox;return d(b,a.x,a.y)||d(b,a.x2,a.y)||d(b,a.x,a.y2)||d(b,a.x2,a.y2)||d(a,b.x,b.y)||d(a,b.x2,b.y)||d(a,b.x,b.y2)||d(a,b.x2,b.y2)||(a.x<b.x2&&a.x>b.x||b.x<a.x2&&b.x>a.x)&&(a.y<b.y2&&a.y>b.y||b.y<a.y2&&b.y>a.y)},c.pathIntersection=function(a,b){return n(a,b)},c.pathIntersectionNumber=function(a,b){return n(a,b,1)},c.isPointInsidePath=function(a,b,d){var e=c.pathBBox(a);return c.isPointInsideBBox(e,b,d)&&1==n(a,[["M",b,d],["H",e.x2+10]],1)%2},c._removedFactory=function(a){return function(){b("raphael.log",null,"Raphaël: you are calling to method “"+a+"” of removed object",a)}};var Bb=c.pathBBox=function(a){var b=Ab(a);if(b.bbox)return d(b.bbox);if(!a)return{x:0,y:0,width:0,height:0,x2:0,y2:0};a=Kb(a);for(var c,e=0,f=0,g=[],h=[],i=0,j=a.length;j>i;i++)if(c=a[i],"M"==c[0])e=c[1],f=c[2],g.push(e),h.push(f);else{var k=Jb(e,f,c[1],c[2],c[3],c[4],c[5],c[6]);g=g[E](k.min.x,k.max.x),h=h[E](k.min.y,k.max.y),e=c[5],f=c[6]}var l=P[D](0,g),m=P[D](0,h),n=O[D](0,g),o=O[D](0,h),p=n-l,q=o-m,r={x:l,y:m,x2:n,y2:o,width:p,height:q,cx:l+p/2,cy:m+q/2};return b.bbox=d(r),r},Cb=function(a){var b=d(a);return b.toString=c._path2string,b},Db=c._pathToRelative=function(a){var b=Ab(a);if(b.rel)return Cb(b.rel);c.is(a,V)&&c.is(a&&a[0],V)||(a=c.parsePathString(a));var d=[],e=0,f=0,g=0,h=0,i=0;"M"==a[0][0]&&(e=a[0][1],f=a[0][2],g=e,h=f,i++,d.push(["M",e,f]));for(var j=i,k=a.length;k>j;j++){var l=d[j]=[],m=a[j];if(m[0]!=M.call(m[0]))switch(l[0]=M.call(m[0]),l[0]){case"a":l[1]=m[1],l[2]=m[2],l[3]=m[3],l[4]=m[4],l[5]=m[5],l[6]=+(m[6]-e).toFixed(3),l[7]=+(m[7]-f).toFixed(3);break;case"v":l[1]=+(m[1]-f).toFixed(3);break;case"m":g=m[1],h=m[2];default:for(var n=1,o=m.length;o>n;n++)l[n]=+(m[n]-(n%2?e:f)).toFixed(3)}else{l=d[j]=[],"m"==m[0]&&(g=m[1]+e,h=m[2]+f);for(var p=0,q=m.length;q>p;p++)d[j][p]=m[p]}var r=d[j].length;switch(d[j][0]){case"z":e=g,f=h;break;case"h":e+=+d[j][r-1];break;case"v":f+=+d[j][r-1];break;default:e+=+d[j][r-2],f+=+d[j][r-1]}}return d.toString=c._path2string,b.rel=Cb(d),d},Eb=c._pathToAbsolute=function(a){var b=Ab(a);if(b.abs)return Cb(b.abs);if(c.is(a,V)&&c.is(a&&a[0],V)||(a=c.parsePathString(a)),!a||!a.length)return[["M",0,0]];var d=[],e=0,f=0,g=0,i=0,j=0;"M"==a[0][0]&&(e=+a[0][1],f=+a[0][2],g=e,i=f,j++,d[0]=["M",e,f]);for(var k,l,m=3==a.length&&"M"==a[0][0]&&"R"==a[1][0].toUpperCase()&&"Z"==a[2][0].toUpperCase(),n=j,o=a.length;o>n;n++){if(d.push(k=[]),l=a[n],l[0]!=bb.call(l[0]))switch(k[0]=bb.call(l[0]),k[0]){case"A":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]+e),k[7]=+(l[7]+f);break;case"V":k[1]=+l[1]+f;break;case"H":k[1]=+l[1]+e;break;case"R":for(var p=[e,f][E](l.slice(1)),q=2,r=p.length;r>q;q++)p[q]=+p[q]+e,p[++q]=+p[q]+f;d.pop(),d=d[E](h(p,m));break;case"M":g=+l[1]+e,i=+l[2]+f;default:for(q=1,r=l.length;r>q;q++)k[q]=+l[q]+(q%2?e:f)}else if("R"==l[0])p=[e,f][E](l.slice(1)),d.pop(),d=d[E](h(p,m)),k=["R"][E](l.slice(-2));else for(var s=0,t=l.length;t>s;s++)k[s]=l[s];switch(k[0]){case"Z":e=g,f=i;break;case"H":e=k[1];break;case"V":f=k[1];break;case"M":g=k[k.length-2],i=k[k.length-1];default:e=k[k.length-2],f=k[k.length-1]}}return d.toString=c._path2string,b.abs=Cb(d),d},Fb=function(a,b,c,d){return[a,b,c,d,c,d]},Gb=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},Hb=function(a,b,c,d,e,g,h,i,j,k){var l,m=120*S/180,n=S/180*(+e||0),o=[],p=f(function(a,b,c){var d=a*N.cos(c)-b*N.sin(c),e=a*N.sin(c)+b*N.cos(c);return{x:d,y:e}});if(k)y=k[0],z=k[1],w=k[2],x=k[3];else{l=p(a,b,-n),a=l.x,b=l.y,l=p(i,j,-n),i=l.x,j=l.y;var q=(N.cos(S/180*e),N.sin(S/180*e),(a-i)/2),r=(b-j)/2,s=q*q/(c*c)+r*r/(d*d);s>1&&(s=N.sqrt(s),c=s*c,d=s*d);var t=c*c,u=d*d,v=(g==h?-1:1)*N.sqrt(Q((t*u-t*r*r-u*q*q)/(t*r*r+u*q*q))),w=v*c*r/d+(a+i)/2,x=v*-d*q/c+(b+j)/2,y=N.asin(((b-x)/d).toFixed(9)),z=N.asin(((j-x)/d).toFixed(9));y=w>a?S-y:y,z=w>i?S-z:z,0>y&&(y=2*S+y),0>z&&(z=2*S+z),h&&y>z&&(y-=2*S),!h&&z>y&&(z-=2*S)}var A=z-y;if(Q(A)>m){var B=z,C=i,D=j;z=y+m*(h&&z>y?1:-1),i=w+c*N.cos(z),j=x+d*N.sin(z),o=Hb(i,j,c,d,e,0,h,C,D,[z,B,w,x])}A=z-y;var F=N.cos(y),G=N.sin(y),H=N.cos(z),I=N.sin(z),K=N.tan(A/4),L=4/3*c*K,M=4/3*d*K,O=[a,b],P=[a+L*G,b-M*F],R=[i+L*I,j-M*H],T=[i,j];if(P[0]=2*O[0]-P[0],P[1]=2*O[1]-P[1],k)return[P,R,T][E](o);o=[P,R,T][E](o).join()[J](",");for(var U=[],V=0,W=o.length;W>V;V++)U[V]=V%2?p(o[V-1],o[V],n).y:p(o[V],o[V+1],n).x;return U},Ib=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:R(j,3)*a+3*R(j,2)*i*c+3*j*i*i*e+R(i,3)*g,y:R(j,3)*b+3*R(j,2)*i*d+3*j*i*i*f+R(i,3)*h}},Jb=f(function(a,b,c,d,e,f,g,h){var i,j=e-2*c+a-(g-2*e+c),k=2*(c-a)-2*(e-c),l=a-c,m=(-k+N.sqrt(k*k-4*j*l))/2/j,n=(-k-N.sqrt(k*k-4*j*l))/2/j,o=[b,h],p=[a,g];return Q(m)>"1e12"&&(m=.5),Q(n)>"1e12"&&(n=.5),m>0&&1>m&&(i=Ib(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ib(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),j=f-2*d+b-(h-2*f+d),k=2*(d-b)-2*(f-d),l=b-d,m=(-k+N.sqrt(k*k-4*j*l))/2/j,n=(-k-N.sqrt(k*k-4*j*l))/2/j,Q(m)>"1e12"&&(m=.5),Q(n)>"1e12"&&(n=.5),m>0&&1>m&&(i=Ib(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ib(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),{min:{x:P[D](0,p),y:P[D](0,o)},max:{x:O[D](0,p),y:O[D](0,o)}}}),Kb=c._path2curve=f(function(a,b){var c=!b&&Ab(a);if(!b&&c.curve)return Cb(c.curve);for(var d=Eb(a),e=b&&Eb(b),f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},h=(function(a,b,c){var d,e;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];switch(!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null),a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][E](Hb[D](0,[b.x,b.y][E](a.slice(1))));break;case"S":"C"==c||"S"==c?(d=2*b.x-b.bx,e=2*b.y-b.by):(d=b.x,e=b.y),a=["C",d,e][E](a.slice(1));break;case"T":"Q"==c||"T"==c?(b.qx=2*b.x-b.qx,b.qy=2*b.y-b.qy):(b.qx=b.x,b.qy=b.y),a=["C"][E](Gb(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][E](Gb(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][E](Fb(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][E](Fb(b.x,b.y,a[1],b.y));break;case"V":a=["C"][E](Fb(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][E](Fb(b.x,b.y,b.X,b.Y))}return a}),i=function(a,b){if(a[b].length>7){a[b].shift();for(var c=a[b];c.length;)a.splice(b++,0,["C"][E](c.splice(0,6)));a.splice(b,1),l=O(d.length,e&&e.length||0)}},j=function(a,b,c,f,g){a&&b&&"M"==a[g][0]&&"M"!=b[g][0]&&(b.splice(g,0,["M",f.x,f.y]),c.bx=0,c.by=0,c.x=a[g][1],c.y=a[g][2],l=O(d.length,e&&e.length||0))},k=0,l=O(d.length,e&&e.length||0);l>k;k++){d[k]=h(d[k],f),i(d,k),e&&(e[k]=h(e[k],g)),e&&i(e,k),j(d,e,f,g,k),j(e,d,g,f,k);var m=d[k],n=e&&e[k],o=m.length,p=e&&n.length;f.x=m[o-2],f.y=m[o-1],f.bx=_(m[o-4])||f.x,f.by=_(m[o-3])||f.y,g.bx=e&&(_(n[p-4])||g.x),g.by=e&&(_(n[p-3])||g.y),g.x=e&&n[p-2],g.y=e&&n[p-1]}return e||(c.curve=Cb(d)),e?[d,e]:d},null,Cb),Lb=(c._parseDots=f(function(a){for(var b=[],d=0,e=a.length;e>d;d++){var f={},g=a[d].match(/^([^:]*):?([\d\.]*)/);if(f.color=c.getRGB(g[1]),f.color.error)return null;f.color=f.color.hex,g[2]&&(f.offset=g[2]+"%"),b.push(f)}for(d=1,e=b.length-1;e>d;d++)if(!b[d].offset){for(var h=_(b[d-1].offset||0),i=0,j=d+1;e>j;j++)if(b[j].offset){i=b[j].offset;break}i||(i=100,j=e),i=_(i);for(var k=(i-h)/(j-d+1);j>d;d++)h+=k,b[d].offset=h+"%"}return b}),c._tear=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)}),Mb=(c._tofront=function(a,b){b.top!==a&&(Lb(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},c._toback=function(a,b){b.bottom!==a&&(Lb(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},c._insertafter=function(a,b,c){Lb(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},c._insertbefore=function(a,b,c){Lb(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},c.toMatrix=function(a,b){var c=Bb(a),d={_:{transform:G},getBBox:function(){return c}};return Nb(d,b),d.matrix}),Nb=(c.transformPath=function(a,b){return rb(a,Mb(a,b))},c._extractTransform=function(a,b){if(null==b)return a._.transform;b=I(b).replace(/\.{3}|\u2026/g,a._.transform||G);var d=c.parseTransformString(b),e=0,f=0,g=0,h=1,i=1,j=a._,k=new o;if(j.transform=d||[],d)for(var l=0,m=d.length;m>l;l++){var n,p,q,r,s,t=d[l],u=t.length,v=I(t[0]).toLowerCase(),w=t[0]!=v,x=w?k.invert():0;"t"==v&&3==u?w?(n=x.x(0,0),p=x.y(0,0),q=x.x(t[1],t[2]),r=x.y(t[1],t[2]),k.translate(q-n,r-p)):k.translate(t[1],t[2]):"r"==v?2==u?(s=s||a.getBBox(1),k.rotate(t[1],s.x+s.width/2,s.y+s.height/2),e+=t[1]):4==u&&(w?(q=x.x(t[2],t[3]),r=x.y(t[2],t[3]),k.rotate(t[1],q,r)):k.rotate(t[1],t[2],t[3]),e+=t[1]):"s"==v?2==u||3==u?(s=s||a.getBBox(1),k.scale(t[1],t[u-1],s.x+s.width/2,s.y+s.height/2),h*=t[1],i*=t[u-1]):5==u&&(w?(q=x.x(t[3],t[4]),r=x.y(t[3],t[4]),k.scale(t[1],t[2],q,r)):k.scale(t[1],t[2],t[3],t[4]),h*=t[1],i*=t[2]):"m"==v&&7==u&&k.add(t[1],t[2],t[3],t[4],t[5],t[6]),j.dirtyT=1,a.matrix=k}a.matrix=k,j.sx=h,j.sy=i,j.deg=e,j.dx=f=k.e,j.dy=g=k.f,1==h&&1==i&&!e&&j.bbox?(j.bbox.x+=+f,j.bbox.y+=+g):j.dirtyT=1}),Ob=function(a){var b=a[0];switch(b.toLowerCase()){case"t":return[b,0,0];case"m":return[b,1,0,0,1,0,0];case"r":return 4==a.length?[b,0,a[2],a[3]]:[b,0];case"s":return 5==a.length?[b,1,1,a[3],a[4]]:3==a.length?[b,1,1]:[b,1]}},Pb=c._equaliseTransform=function(a,b){b=I(b).replace(/\.{3}|\u2026/g,a),a=c.parseTransformString(a)||[],b=c.parseTransformString(b)||[];for(var d,e,f,g,h=O(a.length,b.length),i=[],j=[],k=0;h>k;k++){if(f=a[k]||Ob(b[k]),g=b[k]||Ob(f),f[0]!=g[0]||"r"==f[0].toLowerCase()&&(f[2]!=g[2]||f[3]!=g[3])||"s"==f[0].toLowerCase()&&(f[3]!=g[3]||f[4]!=g[4]))return;for(i[k]=[],j[k]=[],d=0,e=O(f.length,g.length);e>d;d++)d in f&&(i[k][d]=f[d]),d in g&&(j[k][d]=g[d]) +}return{from:i,to:j}};c._getContainer=function(a,b,d,e){var f;return f=null!=e||c.is(a,"object")?a:A.doc.getElementById(a),null!=f?f.tagName?null==b?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:b,height:d}:{container:1,x:a,y:b,width:d,height:e}:void 0},c.pathToRelative=Db,c._engine={},c.path2curve=Kb,c.matrix=function(a,b,c,d,e,f){return new o(a,b,c,d,e,f)},function(a){function b(a){return a[0]*a[0]+a[1]*a[1]}function d(a){var c=N.sqrt(b(a));a[0]&&(a[0]/=c),a[1]&&(a[1]/=c)}a.add=function(a,b,c,d,e,f){var g,h,i,j,k=[[],[],[]],l=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],m=[[a,c,e],[b,d,f],[0,0,1]];for(a&&a instanceof o&&(m=[[a.a,a.c,a.e],[a.b,a.d,a.f],[0,0,1]]),g=0;3>g;g++)for(h=0;3>h;h++){for(j=0,i=0;3>i;i++)j+=l[g][i]*m[i][h];k[g][h]=j}this.a=k[0][0],this.b=k[1][0],this.c=k[0][1],this.d=k[1][1],this.e=k[0][2],this.f=k[1][2]},a.invert=function(){var a=this,b=a.a*a.d-a.b*a.c;return new o(a.d/b,-a.b/b,-a.c/b,a.a/b,(a.c*a.f-a.d*a.e)/b,(a.b*a.e-a.a*a.f)/b)},a.clone=function(){return new o(this.a,this.b,this.c,this.d,this.e,this.f)},a.translate=function(a,b){this.add(1,0,0,1,a,b)},a.scale=function(a,b,c,d){null==b&&(b=a),(c||d)&&this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),(c||d)&&this.add(1,0,0,1,-c,-d)},a.rotate=function(a,b,d){a=c.rad(a),b=b||0,d=d||0;var e=+N.cos(a).toFixed(9),f=+N.sin(a).toFixed(9);this.add(e,f,-f,e,b,d),this.add(1,0,0,1,-b,-d)},a.x=function(a,b){return a*this.a+b*this.c+this.e},a.y=function(a,b){return a*this.b+b*this.d+this.f},a.get=function(a){return+this[I.fromCharCode(97+a)].toFixed(4)},a.toString=function(){return c.svg?"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},a.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0)+", M12="+this.get(2)+", M21="+this.get(1)+", M22="+this.get(3)+", Dx="+this.get(4)+", Dy="+this.get(5)+", sizingmethod='auto expand')"},a.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},a.split=function(){var a={};a.dx=this.e,a.dy=this.f;var e=[[this.a,this.c],[this.b,this.d]];a.scalex=N.sqrt(b(e[0])),d(e[0]),a.shear=e[0][0]*e[1][0]+e[0][1]*e[1][1],e[1]=[e[1][0]-e[0][0]*a.shear,e[1][1]-e[0][1]*a.shear],a.scaley=N.sqrt(b(e[1])),d(e[1]),a.shear/=a.scaley;var f=-e[0][1],g=e[1][1];return 0>g?(a.rotate=c.deg(N.acos(g)),0>f&&(a.rotate=360-a.rotate)):a.rotate=c.deg(N.asin(f)),a.isSimple=!(+a.shear.toFixed(9)||a.scalex.toFixed(9)!=a.scaley.toFixed(9)&&a.rotate),a.isSuperSimple=!+a.shear.toFixed(9)&&a.scalex.toFixed(9)==a.scaley.toFixed(9)&&!a.rotate,a.noRotation=!+a.shear.toFixed(9)&&!a.rotate,a},a.toTransformString=function(a){var b=a||this[J]();return b.isSimple?(b.scalex=+b.scalex.toFixed(4),b.scaley=+b.scaley.toFixed(4),b.rotate=+b.rotate.toFixed(4),(b.dx||b.dy?"t"+[b.dx,b.dy]:G)+(1!=b.scalex||1!=b.scaley?"s"+[b.scalex,b.scaley,0,0]:G)+(b.rotate?"r"+[b.rotate,0,0]:G)):"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(o.prototype);var Qb=navigator.userAgent.match(/Version\/(.*?)\s/)||navigator.userAgent.match(/Chrome\/(\d+)/);v.safari="Apple Computer, Inc."==navigator.vendor&&(Qb&&Qb[1]<4||"iP"==navigator.platform.slice(0,2))||"Google Inc."==navigator.vendor&&Qb&&Qb[1]<8?function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});setTimeout(function(){a.remove()})}:mb;for(var Rb=function(){this.returnValue=!1},Sb=function(){return this.originalEvent.preventDefault()},Tb=function(){this.cancelBubble=!0},Ub=function(){return this.originalEvent.stopPropagation()},Vb=function(a){var b=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,c=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft;return{x:a.clientX+c,y:a.clientY+b}},Wb=function(){return A.doc.addEventListener?function(a,b,c,d){var e=function(a){var b=Vb(a);return c.call(d,a,b.x,b.y)};if(a.addEventListener(b,e,!1),F&&L[b]){var f=function(b){for(var e=Vb(b),f=b,g=0,h=b.targetTouches&&b.targetTouches.length;h>g;g++)if(b.targetTouches[g].target==a){b=b.targetTouches[g],b.originalEvent=f,b.preventDefault=Sb,b.stopPropagation=Ub;break}return c.call(d,b,e.x,e.y)};a.addEventListener(L[b],f,!1)}return function(){return a.removeEventListener(b,e,!1),F&&L[b]&&a.removeEventListener(L[b],e,!1),!0}}:A.doc.attachEvent?function(a,b,c,d){var e=function(a){a=a||A.win.event;var b=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,e=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft,f=a.clientX+e,g=a.clientY+b;return a.preventDefault=a.preventDefault||Rb,a.stopPropagation=a.stopPropagation||Tb,c.call(d,a,f,g)};a.attachEvent("on"+b,e);var f=function(){return a.detachEvent("on"+b,e),!0};return f}:void 0}(),Xb=[],Yb=function(a){for(var c,d=a.clientX,e=a.clientY,f=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,g=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft,h=Xb.length;h--;){if(c=Xb[h],F&&a.touches){for(var i,j=a.touches.length;j--;)if(i=a.touches[j],i.identifier==c.el._drag.id){d=i.clientX,e=i.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}else a.preventDefault();var k,l=c.el.node,m=l.nextSibling,n=l.parentNode,o=l.style.display;A.win.opera&&n.removeChild(l),l.style.display="none",k=c.el.paper.getElementByPoint(d,e),l.style.display=o,A.win.opera&&(m?n.insertBefore(l,m):n.appendChild(l)),k&&b("raphael.drag.over."+c.el.id,c.el,k),d+=g,e+=f,b("raphael.drag.move."+c.el.id,c.move_scope||c.el,d-c.el._drag.x,e-c.el._drag.y,d,e,a)}},Zb=function(a){c.unmousemove(Yb).unmouseup(Zb);for(var d,e=Xb.length;e--;)d=Xb[e],d.el._drag={},b("raphael.drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,a);Xb=[]},$b=c.el={},_b=K.length;_b--;)!function(a){c[a]=$b[a]=function(b,d){return c.is(b,"function")&&(this.events=this.events||[],this.events.push({name:a,f:b,unbind:Wb(this.shape||this.node||A.doc,a,b,d||this)})),this},c["un"+a]=$b["un"+a]=function(b){for(var d=this.events||[],e=d.length;e--;)d[e].name!=a||!c.is(b,"undefined")&&d[e].f!=b||(d[e].unbind(),d.splice(e,1),!d.length&&delete this.events);return this}}(K[_b]);$b.data=function(a,d){var e=kb[this.id]=kb[this.id]||{};if(0==arguments.length)return e;if(1==arguments.length){if(c.is(a,"object")){for(var f in a)a[z](f)&&this.data(f,a[f]);return this}return b("raphael.data.get."+this.id,this,e[a],a),e[a]}return e[a]=d,b("raphael.data.set."+this.id,this,d,a),this},$b.removeData=function(a){return null==a?kb[this.id]={}:kb[this.id]&&delete kb[this.id][a],this},$b.getData=function(){return d(kb[this.id]||{})},$b.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},$b.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var ac=[];$b.drag=function(a,d,e,f,g,h){function i(i){(i.originalEvent||i).preventDefault();var j=i.clientX,k=i.clientY,l=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,m=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft;if(this._drag.id=i.identifier,F&&i.touches)for(var n,o=i.touches.length;o--;)if(n=i.touches[o],this._drag.id=n.identifier,n.identifier==this._drag.id){j=n.clientX,k=n.clientY;break}this._drag.x=j+m,this._drag.y=k+l,!Xb.length&&c.mousemove(Yb).mouseup(Zb),Xb.push({el:this,move_scope:f,start_scope:g,end_scope:h}),d&&b.on("raphael.drag.start."+this.id,d),a&&b.on("raphael.drag.move."+this.id,a),e&&b.on("raphael.drag.end."+this.id,e),b("raphael.drag.start."+this.id,g||f||this,i.clientX+m,i.clientY+l,i)}return this._drag={},ac.push({el:this,start:i}),this.mousedown(i),this},$b.onDragOver=function(a){a?b.on("raphael.drag.over."+this.id,a):b.unbind("raphael.drag.over."+this.id)},$b.undrag=function(){for(var a=ac.length;a--;)ac[a].el==this&&(this.unmousedown(ac[a].start),ac.splice(a,1),b.unbind("raphael.drag.*."+this.id));!ac.length&&c.unmousemove(Yb).unmouseup(Zb),Xb=[]},v.circle=function(a,b,d){var e=c._engine.circle(this,a||0,b||0,d||0);return this.__set__&&this.__set__.push(e),e},v.rect=function(a,b,d,e,f){var g=c._engine.rect(this,a||0,b||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},v.ellipse=function(a,b,d,e){var f=c._engine.ellipse(this,a||0,b||0,d||0,e||0);return this.__set__&&this.__set__.push(f),f},v.path=function(a){a&&!c.is(a,U)&&!c.is(a[0],V)&&(a+=G);var b=c._engine.path(c.format[D](c,arguments),this);return this.__set__&&this.__set__.push(b),b},v.image=function(a,b,d,e,f){var g=c._engine.image(this,a||"about:blank",b||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},v.text=function(a,b,d){var e=c._engine.text(this,a||0,b||0,I(d));return this.__set__&&this.__set__.push(e),e},v.set=function(a){!c.is(a,"array")&&(a=Array.prototype.splice.call(arguments,0,arguments.length));var b=new mc(a);return this.__set__&&this.__set__.push(b),b.paper=this,b.type="set",b},v.setStart=function(a){this.__set__=a||this.set()},v.setFinish=function(){var a=this.__set__;return delete this.__set__,a},v.setSize=function(a,b){return c._engine.setSize.call(this,a,b)},v.setViewBox=function(a,b,d,e,f){return c._engine.setViewBox.call(this,a,b,d,e,f)},v.top=v.bottom=null,v.raphael=c;var bc=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,g=e.clientLeft||d.clientLeft||0,h=b.top+(A.win.pageYOffset||e.scrollTop||d.scrollTop)-f,i=b.left+(A.win.pageXOffset||e.scrollLeft||d.scrollLeft)-g;return{y:h,x:i}};v.getElementByPoint=function(a,b){var c=this,d=c.canvas,e=A.doc.elementFromPoint(a,b);if(A.win.opera&&"svg"==e.tagName){var f=bc(d),g=d.createSVGRect();g.x=a-f.x,g.y=b-f.y,g.width=g.height=1;var h=d.getIntersectionList(g,null);h.length&&(e=h[h.length-1])}if(!e)return null;for(;e.parentNode&&e!=d.parentNode&&!e.raphael;)e=e.parentNode;return e==c.canvas.parentNode&&(e=d),e=e&&e.raphael?c.getById(e.raphaelid):null},v.getElementsByBBox=function(a){var b=this.set();return this.forEach(function(d){c.isBBoxIntersect(d.getBBox(),a)&&b.push(d)}),b},v.getById=function(a){for(var b=this.bottom;b;){if(b.id==a)return b;b=b.next}return null},v.forEach=function(a,b){for(var c=this.bottom;c;){if(a.call(b,c)===!1)return this;c=c.next}return this},v.getElementsByPoint=function(a,b){var c=this.set();return this.forEach(function(d){d.isPointInside(a,b)&&c.push(d)}),c},$b.isPointInside=function(a,b){var d=this.realPath=qb[this.type](this);return this.attr("transform")&&this.attr("transform").length&&(d=c.transformPath(d,this.attr("transform"))),c.isPointInsidePath(d,a,b)},$b.getBBox=function(a){if(this.removed)return{};var b=this._;return a?((b.dirty||!b.bboxwt)&&(this.realPath=qb[this.type](this),b.bboxwt=Bb(this.realPath),b.bboxwt.toString=p,b.dirty=0),b.bboxwt):((b.dirty||b.dirtyT||!b.bbox)&&((b.dirty||!this.realPath)&&(b.bboxwt=0,this.realPath=qb[this.type](this)),b.bbox=Bb(rb(this.realPath,this.matrix)),b.bbox.toString=p,b.dirty=b.dirtyT=0),b.bbox)},$b.clone=function(){if(this.removed)return null;var a=this.paper[this.type]().attr(this.attr());return this.__set__&&this.__set__.push(a),a},$b.glow=function(a){if("text"==this.type)return null;a=a||{};var b={width:(a.width||10)+(+this.attr("stroke-width")||1),fill:a.fill||!1,opacity:a.opacity||.5,offsetx:a.offsetx||0,offsety:a.offsety||0,color:a.color||"#000"},c=b.width/2,d=this.paper,e=d.set(),f=this.realPath||qb[this.type](this);f=this.matrix?rb(f,this.matrix):f;for(var g=1;c+1>g;g++)e.push(d.path(f).attr({stroke:b.color,fill:b.fill?b.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(b.width/c*g).toFixed(3),opacity:+(b.opacity/c).toFixed(3)}));return e.insertBefore(this).translate(b.offsetx,b.offsety)};var cc=function(a,b,d,e,f,g,h,i,l){return null==l?j(a,b,d,e,f,g,h,i):c.findDotsAtSegment(a,b,d,e,f,g,h,i,k(a,b,d,e,f,g,h,i,l))},dc=function(a,b){return function(d,e,f){d=Kb(d);for(var g,h,i,j,k,l="",m={},n=0,o=0,p=d.length;p>o;o++){if(i=d[o],"M"==i[0])g=+i[1],h=+i[2];else{if(j=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6]),n+j>e){if(b&&!m.start){if(k=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),l+=["C"+k.start.x,k.start.y,k.m.x,k.m.y,k.x,k.y],f)return l;m.start=l,l=["M"+k.x,k.y+"C"+k.n.x,k.n.y,k.end.x,k.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!a&&!b)return k=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),{x:k.x,y:k.y,alpha:k.alpha}}n+=j,g=+i[5],h=+i[6]}l+=i.shift()+i}return m.end=l,k=a?n:b?m:c.findDotsAtSegment(g,h,i[0],i[1],i[2],i[3],i[4],i[5],1),k.alpha&&(k={x:k.x,y:k.y,alpha:k.alpha}),k}},ec=dc(1),fc=dc(),gc=dc(0,1);c.getTotalLength=ec,c.getPointAtLength=fc,c.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return gc(a,b).end;var d=gc(a,c,1);return b?gc(d,b).end:d},$b.getTotalLength=function(){var a=this.getPath();if(a)return this.node.getTotalLength?this.node.getTotalLength():ec(a)},$b.getPointAtLength=function(a){var b=this.getPath();if(b)return fc(b,a)},$b.getPath=function(){var a,b=c._getPath[this.type];if("text"!=this.type&&"set"!=this.type)return b&&(a=b(this)),a},$b.getSubpath=function(a,b){var d=this.getPath();if(d)return c.getSubpath(d,a,b)};var hc=c.easing_formulas={linear:function(a){return a},"<":function(a){return R(a,1.7)},">":function(a){return R(a,.48)},"<>":function(a){var b=.48-a/1.04,c=N.sqrt(.1734+b*b),d=c-b,e=R(Q(d),1/3)*(0>d?-1:1),f=-c-b,g=R(Q(f),1/3)*(0>f?-1:1),h=e+g+.5;return 3*(1-h)*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a-=1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){return a==!!a?a:R(2,-10*a)*N.sin((a-.075)*2*S/.3)+1},bounce:function(a){var b,c=7.5625,d=2.75;return 1/d>a?b=c*a*a:2/d>a?(a-=1.5/d,b=c*a*a+.75):2.5/d>a?(a-=2.25/d,b=c*a*a+.9375):(a-=2.625/d,b=c*a*a+.984375),b}};hc.easeIn=hc["ease-in"]=hc["<"],hc.easeOut=hc["ease-out"]=hc[">"],hc.easeInOut=hc["ease-in-out"]=hc["<>"],hc["back-in"]=hc.backIn,hc["back-out"]=hc.backOut;var ic=[],jc=a.requestAnimationFrame||a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame||a.msRequestAnimationFrame||function(a){setTimeout(a,16)},kc=function(){for(var a=+new Date,d=0;d<ic.length;d++){var e=ic[d];if(!e.el.removed&&!e.paused){var f,g,h=a-e.start,i=e.ms,j=e.easing,k=e.from,l=e.diff,m=e.to,n=(e.t,e.el),o={},p={};if(e.initstatus?(h=(e.initstatus*e.anim.top-e.prev)/(e.percent-e.prev)*i,e.status=e.initstatus,delete e.initstatus,e.stop&&ic.splice(d--,1)):e.status=(e.prev+(e.percent-e.prev)*(h/i))/e.anim.top,!(0>h))if(i>h){var q=j(h/i);for(var r in k)if(k[z](r)){switch(db[r]){case T:f=+k[r]+q*i*l[r];break;case"colour":f="rgb("+[lc($(k[r].r+q*i*l[r].r)),lc($(k[r].g+q*i*l[r].g)),lc($(k[r].b+q*i*l[r].b))].join(",")+")";break;case"path":f=[];for(var t=0,u=k[r].length;u>t;t++){f[t]=[k[r][t][0]];for(var v=1,w=k[r][t].length;w>v;v++)f[t][v]=+k[r][t][v]+q*i*l[r][t][v];f[t]=f[t].join(H)}f=f.join(H);break;case"transform":if(l[r].real)for(f=[],t=0,u=k[r].length;u>t;t++)for(f[t]=[k[r][t][0]],v=1,w=k[r][t].length;w>v;v++)f[t][v]=k[r][t][v]+q*i*l[r][t][v];else{var x=function(a){return+k[r][a]+q*i*l[r][a]};f=[["m",x(0),x(1),x(2),x(3),x(4),x(5)]]}break;case"csv":if("clip-rect"==r)for(f=[],t=4;t--;)f[t]=+k[r][t]+q*i*l[r][t];break;default:var y=[][E](k[r]);for(f=[],t=n.paper.customAttributes[r].length;t--;)f[t]=+y[t]+q*i*l[r][t]}o[r]=f}n.attr(o),function(a,c,d){setTimeout(function(){b("raphael.anim.frame."+a,c,d)})}(n.id,n,e.anim)}else{if(function(a,d,e){setTimeout(function(){b("raphael.anim.frame."+d.id,d,e),b("raphael.anim.finish."+d.id,d,e),c.is(a,"function")&&a.call(d)})}(e.callback,n,e.anim),n.attr(m),ic.splice(d--,1),e.repeat>1&&!e.next){for(g in m)m[z](g)&&(p[g]=e.totalOrigin[g]);e.el.attr(p),s(e.anim,e.el,e.anim.percents[0],null,e.totalOrigin,e.repeat-1)}e.next&&!e.stop&&s(e.anim,e.el,e.next,null,e.totalOrigin,e.repeat)}}}c.svg&&n&&n.paper&&n.paper.safari(),ic.length&&jc(kc)},lc=function(a){return a>255?255:0>a?0:a};$b.animateWith=function(a,b,d,e,f,g){var h=this;if(h.removed)return g&&g.call(h),h;var i=d instanceof r?d:c.animation(d,e,f,g);s(i,h,i.percents[0],null,h.attr());for(var j=0,k=ic.length;k>j;j++)if(ic[j].anim==b&&ic[j].el==a){ic[k-1].start=ic[j].start;break}return h},$b.onAnimation=function(a){return a?b.on("raphael.anim.frame."+this.id,a):b.unbind("raphael.anim.frame."+this.id),this},r.prototype.delay=function(a){var b=new r(this.anim,this.ms);return b.times=this.times,b.del=+a||0,b},r.prototype.repeat=function(a){var b=new r(this.anim,this.ms);return b.del=this.del,b.times=N.floor(O(a,0))||1,b},c.animation=function(a,b,d,e){if(a instanceof r)return a;(c.is(d,"function")||!d)&&(e=e||d||null,d=null),a=Object(a),b=+b||0;var f,g,h={};for(g in a)a[z](g)&&_(g)!=g&&_(g)+"%"!=g&&(f=!0,h[g]=a[g]);return f?(d&&(h.easing=d),e&&(h.callback=e),new r({100:h},b)):new r(a,b)},$b.animate=function(a,b,d,e){var f=this;if(f.removed)return e&&e.call(f),f;var g=a instanceof r?a:c.animation(a,b,d,e);return s(g,f,g.percents[0],null,f.attr()),f},$b.setTime=function(a,b){return a&&null!=b&&this.status(a,P(b,a.ms)/a.ms),this},$b.status=function(a,b){var c,d,e=[],f=0;if(null!=b)return s(a,this,-1,P(b,1)),this;for(c=ic.length;c>f;f++)if(d=ic[f],d.el.id==this.id&&(!a||d.anim==a)){if(a)return d.status;e.push({anim:d.anim,status:d.status})}return a?0:e},$b.pause=function(a){for(var c=0;c<ic.length;c++)ic[c].el.id!=this.id||a&&ic[c].anim!=a||b("raphael.anim.pause."+this.id,this,ic[c].anim)!==!1&&(ic[c].paused=!0);return this},$b.resume=function(a){for(var c=0;c<ic.length;c++)if(ic[c].el.id==this.id&&(!a||ic[c].anim==a)){var d=ic[c];b("raphael.anim.resume."+this.id,this,d.anim)!==!1&&(delete d.paused,this.status(d.anim,d.status))}return this},$b.stop=function(a){for(var c=0;c<ic.length;c++)ic[c].el.id!=this.id||a&&ic[c].anim!=a||b("raphael.anim.stop."+this.id,this,ic[c].anim)!==!1&&ic.splice(c--,1);return this},b.on("raphael.remove",t),b.on("raphael.clear",t),$b.toString=function(){return"Raphaël’s object"};var mc=function(a){if(this.items=[],this.length=0,this.type="set",a)for(var b=0,c=a.length;c>b;b++)!a[b]||a[b].constructor!=$b.constructor&&a[b].constructor!=mc||(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},nc=mc.prototype;nc.push=function(){for(var a,b,c=0,d=arguments.length;d>c;c++)a=arguments[c],!a||a.constructor!=$b.constructor&&a.constructor!=mc||(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},nc.pop=function(){return this.length&&delete this[this.length--],this.items.pop()},nc.forEach=function(a,b){for(var c=0,d=this.items.length;d>c;c++)if(a.call(b,this.items[c],c)===!1)return this;return this};for(var oc in $b)$b[z](oc)&&(nc[oc]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a][D](c,b)})}}(oc));return nc.attr=function(a,b){if(a&&c.is(a,V)&&c.is(a[0],"object"))for(var d=0,e=a.length;e>d;d++)this.items[d].attr(a[d]);else for(var f=0,g=this.items.length;g>f;f++)this.items[f].attr(a,b);return this},nc.clear=function(){for(;this.length;)this.pop()},nc.splice=function(a,b){a=0>a?O(this.length+a,0):a,b=O(0,P(this.length-a,b));var c,d=[],e=[],f=[];for(c=2;c<arguments.length;c++)f.push(arguments[c]);for(c=0;b>c;c++)e.push(this[a+c]);for(;c<this.length-a;c++)d.push(this[a+c]);var g=f.length;for(c=0;c<g+d.length;c++)this.items[a+c]=this[a+c]=g>c?f[c]:d[c-g];for(c=this.items.length=this.length-=b-g;this[c];)delete this[c++];return new mc(e)},nc.exclude=function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]==a)return this.splice(b,1),!0},nc.animate=function(a,b,d,e){(c.is(d,"function")||!d)&&(e=d||null);var f,g,h=this.items.length,i=h,j=this;if(!h)return this;e&&(g=function(){!--h&&e.call(j)}),d=c.is(d,U)?d:g;var k=c.animation(a,b,d,g);for(f=this.items[--i].animate(k);i--;)this.items[i]&&!this.items[i].removed&&this.items[i].animateWith(f,k,k),this.items[i]&&!this.items[i].removed||h--;return this},nc.insertAfter=function(a){for(var b=this.items.length;b--;)this.items[b].insertAfter(a);return this},nc.getBBox=function(){for(var a=[],b=[],c=[],d=[],e=this.items.length;e--;)if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)}return a=P[D](0,a),b=P[D](0,b),c=O[D](0,c),d=O[D](0,d),{x:a,y:b,x2:c,y2:d,width:c-a,height:d-b}},nc.clone=function(a){a=this.paper.set();for(var b=0,c=this.items.length;c>b;b++)a.push(this.items[b].clone());return a},nc.toString=function(){return"Raphaël‘s set"},nc.glow=function(a){var b=this.paper.set();return this.forEach(function(c){var d=c.glow(a);null!=d&&d.forEach(function(a){b.push(a)})}),b},nc.isPointInside=function(a,b){var c=!1;return this.forEach(function(d){return d.isPointInside(a,b)?(console.log("runned"),c=!0,!1):void 0}),c},c.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[z](d)&&(b.face[d]=a.face[d]);if(this.fonts[c]?this.fonts[c].push(b):this.fonts[c]=[b],!a.svg){b.face["units-per-em"]=ab(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[z](e)){var f=a.glyphs[e];if(b.glyphs[e]={w:f.w,k:{},d:f.d&&"M"+f.d.replace(/[mlcxtrv]/g,function(a){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[a]||"M"})+"z"},f.k)for(var g in f.k)f[z](g)&&(b.glyphs[e].k[g]=f.k[g])}}return a},v.getFont=function(a,b,d,e){if(e=e||"normal",d=d||"normal",b=+b||{normal:400,bold:700,lighter:300,bolder:800}[b]||400,c.fonts){var f=c.fonts[a];if(!f){var g=new RegExp("(^|\\s)"+a.replace(/[^\w\d\s+!~.:_-]/g,G)+"(\\s|$)","i");for(var h in c.fonts)if(c.fonts[z](h)&&g.test(h)){f=c.fonts[h];break}}var i;if(f)for(var j=0,k=f.length;k>j&&(i=f[j],i.face["font-weight"]!=b||i.face["font-style"]!=d&&i.face["font-style"]||i.face["font-stretch"]!=e);j++);return i}},v.print=function(a,b,d,e,f,g,h,i){g=g||"middle",h=O(P(h||0,1),-1),i=O(P(i||1,3),1);var j,k=I(d)[J](G),l=0,m=0,n=G;if(c.is(e,"string")&&(e=this.getFont(e)),e){j=(f||16)/e.face["units-per-em"];for(var o=e.face.bbox[J](w),p=+o[0],q=o[3]-o[1],r=0,s=+o[1]+("baseline"==g?q+ +e.face.descent:q/2),t=0,u=k.length;u>t;t++){if("\n"==k[t])l=0,x=0,m=0,r+=q*i;else{var v=m&&e.glyphs[k[t-1]]||{},x=e.glyphs[k[t]];l+=m?(v.w||e.w)+(v.k&&v.k[k[t]]||0)+e.w*h:0,m=1}x&&x.d&&(n+=c.transformPath(x.d,["t",l*j,r*j,"s",j,j,p,s,"t",(a-p)/j,(b-s)/j]))}}return this.path(n).attr({fill:"#000",stroke:"none"})},v.add=function(a){if(c.is(a,"array"))for(var b,d=this.set(),e=0,f=a.length;f>e;e++)b=a[e]||{},x[z](b.type)&&d.push(this[b.type]().attr(b));return d},c.format=function(a,b){var d=c.is(b,V)?[0][E](b):arguments;return a&&c.is(a,U)&&d.length-1&&(a=a.replace(y,function(a,b){return null==d[++b]?G:d[b]})),a||G},c.fullfill=function(){var a=/\{([^\}]+)\}/g,b=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,c=function(a,c,d){var e=d;return c.replace(b,function(a,b,c,d,f){b=b||d,e&&(b in e&&(e=e[b]),"function"==typeof e&&f&&(e=e()))}),e=(null==e||e==d?a:e)+""};return function(b,d){return String(b).replace(a,function(a,b){return c(a,b,d)})}}(),c.ninja=function(){return B.was?A.win.Raphael=B.is:delete Raphael,c},c.st=nc,function(a,b,d){function e(){/in/.test(a.readyState)?setTimeout(e,9):c.eve("raphael.DOMload")}null==a.readyState&&a.addEventListener&&(a.addEventListener(b,d=function(){a.removeEventListener(b,d,!1),a.readyState="complete"},!1),a.readyState="loading"),e()}(document,"DOMContentLoaded"),b.on("raphael.DOMload",function(){u=!0}),function(){if(c.svg){var a="hasOwnProperty",b=String,d=parseFloat,e=parseInt,f=Math,g=f.max,h=f.abs,i=f.pow,j=/[, ]+/,k=c.eve,l="",m=" ",n="http://www.w3.org/1999/xlink",o={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},p={};c.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var q=function(d,e){if(e){"string"==typeof d&&(d=q(d));for(var f in e)e[a](f)&&("xlink:"==f.substring(0,6)?d.setAttributeNS(n,f.substring(6),b(e[f])):d.setAttribute(f,b(e[f])))}else d=c._g.doc.createElementNS("http://www.w3.org/2000/svg",d),d.style&&(d.style.webkitTapHighlightColor="rgba(0,0,0,0)");return d},r=function(a,e){var j="linear",k=a.id+e,m=.5,n=.5,o=a.node,p=a.paper,r=o.style,s=c._g.doc.getElementById(k);if(!s){if(e=b(e).replace(c._radial_gradient,function(a,b,c){if(j="radial",b&&c){m=d(b),n=d(c);var e=2*(n>.5)-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&.5!=n&&(n=n.toFixed(5)-1e-5*e)}return l}),e=e.split(/\s*\-\s*/),"linear"==j){var t=e.shift();if(t=-d(t),isNaN(t))return null;var u=[0,0,f.cos(c.rad(t)),f.sin(c.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)}var w=c._parseDots(e);if(!w)return null;if(k=k.replace(/[\(\)\s,\xb0#]/g,"_"),a.gradient&&k!=a.gradient.id&&(p.defs.removeChild(a.gradient),delete a.gradient),!a.gradient){s=q(j+"Gradient",{id:k}),a.gradient=s,q(s,"radial"==j?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:a.matrix.invert()}),p.defs.appendChild(s);for(var x=0,y=w.length;y>x;x++)s.appendChild(q("stop",{offset:w[x].offset?w[x].offset:x?"100%":"0%","stop-color":w[x].color||"#fff"}))}}return q(o,{fill:"url(#"+k+")",opacity:1,"fill-opacity":1}),r.fill=l,r.opacity=1,r.fillOpacity=1,1},s=function(a){var b=a.getBBox(1);q(a.pattern,{patternTransform:a.matrix.invert()+" translate("+b.x+","+b.y+")"})},t=function(d,e,f){if("path"==d.type){for(var g,h,i,j,k,m=b(e).toLowerCase().split("-"),n=d.paper,r=f?"end":"start",s=d.node,t=d.attrs,u=t["stroke-width"],v=m.length,w="classic",x=3,y=3,z=5;v--;)switch(m[v]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":w=m[v];break;case"wide":y=5;break;case"narrow":y=2;break;case"long":x=5;break;case"short":x=2}if("open"==w?(x+=2,y+=2,z+=2,i=1,j=f?4:1,k={fill:"none",stroke:t.stroke}):(j=i=x/2,k={fill:t.stroke,stroke:"none"}),d._.arrows?f?(d._.arrows.endPath&&p[d._.arrows.endPath]--,d._.arrows.endMarker&&p[d._.arrows.endMarker]--):(d._.arrows.startPath&&p[d._.arrows.startPath]--,d._.arrows.startMarker&&p[d._.arrows.startMarker]--):d._.arrows={},"none"!=w){var A="raphael-marker-"+w,B="raphael-marker-"+r+w+x+y;c._g.doc.getElementById(A)?p[A]++:(n.defs.appendChild(q(q("path"),{"stroke-linecap":"round",d:o[w],id:A})),p[A]=1);var C,D=c._g.doc.getElementById(B);D?(p[B]++,C=D.getElementsByTagName("use")[0]):(D=q(q("marker"),{id:B,markerHeight:y,markerWidth:x,orient:"auto",refX:j,refY:y/2}),C=q(q("use"),{"xlink:href":"#"+A,transform:(f?"rotate(180 "+x/2+" "+y/2+") ":l)+"scale("+x/z+","+y/z+")","stroke-width":(1/((x/z+y/z)/2)).toFixed(4)}),D.appendChild(C),n.defs.appendChild(D),p[B]=1),q(C,k);var E=i*("diamond"!=w&&"oval"!=w);f?(g=d._.arrows.startdx*u||0,h=c.getTotalLength(t.path)-E*u):(g=E*u,h=c.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),k={},k["marker-"+r]="url(#"+B+")",(h||g)&&(k.d=c.getSubpath(t.path,g,h)),q(s,k),d._.arrows[r+"Path"]=A,d._.arrows[r+"Marker"]=B,d._.arrows[r+"dx"]=E,d._.arrows[r+"Type"]=w,d._.arrows[r+"String"]=e}else f?(g=d._.arrows.startdx*u||0,h=c.getTotalLength(t.path)-g):(g=0,h=c.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),d._.arrows[r+"Path"]&&q(s,{d:c.getSubpath(t.path,g,h)}),delete d._.arrows[r+"Path"],delete d._.arrows[r+"Marker"],delete d._.arrows[r+"dx"],delete d._.arrows[r+"Type"],delete d._.arrows[r+"String"];for(k in p)if(p[a](k)&&!p[k]){var F=c._g.doc.getElementById(k);F&&F.parentNode.removeChild(F)}}},u={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},v=function(a,c,d){if(c=u[b(c).toLowerCase()]){for(var e=a.attrs["stroke-width"]||"1",f={round:e,square:e,butt:0}[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],h=c.length;h--;)g[h]=c[h]*e+(h%2?1:-1)*f;q(a.node,{"stroke-dasharray":g.join(",")})}},w=function(d,f){var i=d.node,k=d.attrs,m=i.style.visibility;i.style.visibility="hidden";for(var o in f)if(f[a](o)){if(!c._availableAttrs[a](o))continue;var p=f[o];switch(k[o]=p,o){case"blur":d.blur(p);break;case"href":case"title":var u=q("title"),w=c._g.doc.createTextNode(p);u.appendChild(w),i.appendChild(u);break;case"target":var x=i.parentNode;if("a"!=x.tagName.toLowerCase()){var u=q("a");x.insertBefore(u,i),u.appendChild(i),x=u}"target"==o?x.setAttributeNS(n,"show","blank"==p?"new":p):x.setAttributeNS(n,o,p);break;case"cursor":i.style.cursor=p;break;case"transform":d.transform(p);break;case"arrow-start":t(d,p);break;case"arrow-end":t(d,p,1);break;case"clip-rect":var z=b(p).split(j);if(4==z.length){d.clip&&d.clip.parentNode.parentNode.removeChild(d.clip.parentNode);var A=q("clipPath"),B=q("rect");A.id=c.createUUID(),q(B,{x:z[0],y:z[1],width:z[2],height:z[3]}),A.appendChild(B),d.paper.defs.appendChild(A),q(i,{"clip-path":"url(#"+A.id+")"}),d.clip=B}if(!p){var C=i.getAttribute("clip-path");if(C){var D=c._g.doc.getElementById(C.replace(/(^url\(#|\)$)/g,l));D&&D.parentNode.removeChild(D),q(i,{"clip-path":l}),delete d.clip}}break;case"path":"path"==d.type&&(q(i,{d:p?k.path=c._pathToAbsolute(p):"M0,0"}),d._.dirty=1,d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1)));break;case"width":if(i.setAttribute(o,p),d._.dirty=1,!k.fx)break;o="x",p=k.x;case"x":k.fx&&(p=-k.x-(k.width||0));case"rx":if("rx"==o&&"rect"==d.type)break;case"cx":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"height":if(i.setAttribute(o,p),d._.dirty=1,!k.fy)break;o="y",p=k.y;case"y":k.fy&&(p=-k.y-(k.height||0));case"ry":if("ry"==o&&"rect"==d.type)break;case"cy":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"r":"rect"==d.type?q(i,{rx:p,ry:p}):i.setAttribute(o,p),d._.dirty=1;break;case"src":"image"==d.type&&i.setAttributeNS(n,"href",p);break;case"stroke-width":(1!=d._.sx||1!=d._.sy)&&(p/=g(h(d._.sx),h(d._.sy))||1),d.paper._vbSize&&(p*=d.paper._vbSize),i.setAttribute(o,p),k["stroke-dasharray"]&&v(d,k["stroke-dasharray"],f),d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"stroke-dasharray":v(d,p,f);break;case"fill":var E=b(p).match(c._ISURL);if(E){A=q("pattern");var F=q("image");A.id=c.createUUID(),q(A,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),q(F,{x:0,y:0,"xlink:href":E[1]}),A.appendChild(F),function(a){c._preload(E[1],function(){var b=this.offsetWidth,c=this.offsetHeight;q(a,{width:b,height:c}),q(F,{width:b,height:c}),d.paper.safari()})}(A),d.paper.defs.appendChild(A),q(i,{fill:"url(#"+A.id+")"}),d.pattern=A,d.pattern&&s(d);break}var G=c.getRGB(p);if(G.error){if(("circle"==d.type||"ellipse"==d.type||"r"!=b(p).charAt())&&r(d,p)){if("opacity"in k||"fill-opacity"in k){var H=c._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l));if(H){var I=H.getElementsByTagName("stop");q(I[I.length-1],{"stop-opacity":("opacity"in k?k.opacity:1)*("fill-opacity"in k?k["fill-opacity"]:1)})}}k.gradient=p,k.fill="none";break}}else delete f.gradient,delete k.gradient,!c.is(k.opacity,"undefined")&&c.is(f.opacity,"undefined")&&q(i,{opacity:k.opacity}),!c.is(k["fill-opacity"],"undefined")&&c.is(f["fill-opacity"],"undefined")&&q(i,{"fill-opacity":k["fill-opacity"]});G[a]("opacity")&&q(i,{"fill-opacity":G.opacity>1?G.opacity/100:G.opacity});case"stroke":G=c.getRGB(p),i.setAttribute(o,G.hex),"stroke"==o&&G[a]("opacity")&&q(i,{"stroke-opacity":G.opacity>1?G.opacity/100:G.opacity}),"stroke"==o&&d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"gradient":("circle"==d.type||"ellipse"==d.type||"r"!=b(p).charAt())&&r(d,p);break;case"opacity":k.gradient&&!k[a]("stroke-opacity")&&q(i,{"stroke-opacity":p>1?p/100:p});case"fill-opacity":if(k.gradient){H=c._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l)),H&&(I=H.getElementsByTagName("stop"),q(I[I.length-1],{"stop-opacity":p}));break}default:"font-size"==o&&(p=e(p,10)+"px");var J=o.replace(/(\-.)/g,function(a){return a.substring(1).toUpperCase()});i.style[J]=p,d._.dirty=1,i.setAttribute(o,p)}}y(d,f),i.style.visibility=m},x=1.2,y=function(d,f){if("text"==d.type&&(f[a]("text")||f[a]("font")||f[a]("font-size")||f[a]("x")||f[a]("y"))){var g=d.attrs,h=d.node,i=h.firstChild?e(c._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue("font-size"),10):10; +if(f[a]("text")){for(g.text=f.text;h.firstChild;)h.removeChild(h.firstChild);for(var j,k=b(f.text).split("\n"),m=[],n=0,o=k.length;o>n;n++)j=q("tspan"),n&&q(j,{dy:i*x,x:g.x}),j.appendChild(c._g.doc.createTextNode(k[n])),h.appendChild(j),m[n]=j}else for(m=h.getElementsByTagName("tspan"),n=0,o=m.length;o>n;n++)n?q(m[n],{dy:i*x,x:g.x}):q(m[0],{dy:0});q(h,{x:g.x,y:g.y}),d._.dirty=1;var p=d._getBBox(),r=g.y-(p.y+p.height/2);r&&c.is(r,"finite")&&q(m[0],{dy:r})}},z=function(a,b){this[0]=this.node=a,a.raphael=!0,this.id=c._oid++,a.raphaelid=this.id,this.matrix=c.matrix(),this.realPath=null,this.paper=b,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!b.bottom&&(b.bottom=this),this.prev=b.top,b.top&&(b.top.next=this),b.top=this,this.next=null},A=c.el;z.prototype=A,A.constructor=z,c._engine.path=function(a,b){var c=q("path");b.canvas&&b.canvas.appendChild(c);var d=new z(c,b);return d.type="path",w(d,{fill:"none",stroke:"#000",path:a}),d},A.rotate=function(a,c,e){if(this.removed)return this;if(a=b(a).split(j),a.length-1&&(c=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(c=e),null==c||null==e){var f=this.getBBox(1);c=f.x+f.width/2,e=f.y+f.height/2}return this.transform(this._.transform.concat([["r",a,c,e]])),this},A.scale=function(a,c,e,f){if(this.removed)return this;if(a=b(a).split(j),a.length-1&&(c=d(a[1]),e=d(a[2]),f=d(a[3])),a=d(a[0]),null==c&&(c=a),null==f&&(e=f),null==e||null==f)var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,c,e,f]])),this},A.translate=function(a,c){return this.removed?this:(a=b(a).split(j),a.length-1&&(c=d(a[1])),a=d(a[0])||0,c=+c||0,this.transform(this._.transform.concat([["t",a,c]])),this)},A.transform=function(b){var d=this._;if(null==b)return d.transform;if(c._extractTransform(this,b),this.clip&&q(this.clip,{transform:this.matrix.invert()}),this.pattern&&s(this),this.node&&q(this.node,{transform:this.matrix}),1!=d.sx||1!=d.sy){var e=this.attrs[a]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":e})}return this},A.hide=function(){return!this.removed&&this.paper.safari(this.node.style.display="none"),this},A.show=function(){return!this.removed&&this.paper.safari(this.node.style.display=""),this},A.remove=function(){if(!this.removed&&this.node.parentNode){var a=this.paper;a.__set__&&a.__set__.exclude(this),k.unbind("raphael.*.*."+this.id),this.gradient&&a.defs.removeChild(this.gradient),c._tear(this,a),"a"==this.node.parentNode.tagName.toLowerCase()?this.node.parentNode.parentNode.removeChild(this.node.parentNode):this.node.parentNode.removeChild(this.node);for(var b in this)this[b]="function"==typeof this[b]?c._removedFactory(b):null;this.removed=!0}},A._getBBox=function(){if("none"==this.node.style.display){this.show();var a=!0}var b={};try{b=this.node.getBBox()}catch(c){}finally{b=b||{}}return a&&this.hide(),b},A.attr=function(b,d){if(this.removed)return this;if(null==b){var e={};for(var f in this.attrs)this.attrs[a](f)&&(e[f]=this.attrs[f]);return e.gradient&&"none"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e}if(null==d&&c.is(b,"string")){if("fill"==b&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;if("transform"==b)return this._.transform;for(var g=b.split(j),h={},i=0,l=g.length;l>i;i++)b=g[i],h[b]=b in this.attrs?this.attrs[b]:c.is(this.paper.customAttributes[b],"function")?this.paper.customAttributes[b].def:c._availableAttrs[b];return l-1?h:h[g[0]]}if(null==d&&c.is(b,"array")){for(h={},i=0,l=b.length;l>i;i++)h[b[i]]=this.attr(b[i]);return h}if(null!=d){var m={};m[b]=d}else null!=b&&c.is(b,"object")&&(m=b);for(var n in m)k("raphael.attr."+n+"."+this.id,this,m[n]);for(n in this.paper.customAttributes)if(this.paper.customAttributes[a](n)&&m[a](n)&&c.is(this.paper.customAttributes[n],"function")){var o=this.paper.customAttributes[n].apply(this,[].concat(m[n]));this.attrs[n]=m[n];for(var p in o)o[a](p)&&(m[p]=o[p])}return w(this,m),this},A.toFront=function(){if(this.removed)return this;"a"==this.node.parentNode.tagName.toLowerCase()?this.node.parentNode.parentNode.appendChild(this.node.parentNode):this.node.parentNode.appendChild(this.node);var a=this.paper;return a.top!=this&&c._tofront(this,a),this},A.toBack=function(){if(this.removed)return this;var a=this.node.parentNode;return"a"==a.tagName.toLowerCase()?a.parentNode.insertBefore(this.node.parentNode,this.node.parentNode.parentNode.firstChild):a.firstChild!=this.node&&a.insertBefore(this.node,this.node.parentNode.firstChild),c._toback(this,this.paper),this.paper,this},A.insertAfter=function(a){if(this.removed)return this;var b=a.node||a[a.length-1].node;return b.nextSibling?b.parentNode.insertBefore(this.node,b.nextSibling):b.parentNode.appendChild(this.node),c._insertafter(this,a,this.paper),this},A.insertBefore=function(a){if(this.removed)return this;var b=a.node||a[0].node;return b.parentNode.insertBefore(this.node,b),c._insertbefore(this,a,this.paper),this},A.blur=function(a){var b=this;if(0!==+a){var d=q("filter"),e=q("feGaussianBlur");b.attrs.blur=a,d.id=c.createUUID(),q(e,{stdDeviation:+a||1.5}),d.appendChild(e),b.paper.defs.appendChild(d),b._blur=d,q(b.node,{filter:"url(#"+d.id+")"})}else b._blur&&(b._blur.parentNode.removeChild(b._blur),delete b._blur,delete b.attrs.blur),b.node.removeAttribute("filter");return b},c._engine.circle=function(a,b,c,d){var e=q("circle");a.canvas&&a.canvas.appendChild(e);var f=new z(e,a);return f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"},f.type="circle",q(e,f.attrs),f},c._engine.rect=function(a,b,c,d,e,f){var g=q("rect");a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);return h.attrs={x:b,y:c,width:d,height:e,r:f||0,rx:f||0,ry:f||0,fill:"none",stroke:"#000"},h.type="rect",q(g,h.attrs),h},c._engine.ellipse=function(a,b,c,d,e){var f=q("ellipse");a.canvas&&a.canvas.appendChild(f);var g=new z(f,a);return g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"},g.type="ellipse",q(f,g.attrs),g},c._engine.image=function(a,b,c,d,e,f){var g=q("image");q(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"}),g.setAttributeNS(n,"href",b),a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);return h.attrs={x:c,y:d,width:e,height:f,src:b},h.type="image",h},c._engine.text=function(a,b,d,e){var f=q("text");a.canvas&&a.canvas.appendChild(f);var g=new z(f,a);return g.attrs={x:b,y:d,"text-anchor":"middle",text:e,font:c._availableAttrs.font,stroke:"none",fill:"#000"},g.type="text",w(g,g.attrs),g},c._engine.setSize=function(a,b){return this.width=a||this.width,this.height=b||this.height,this.canvas.setAttribute("width",this.width),this.canvas.setAttribute("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox),this},c._engine.create=function(){var a=c._getContainer.apply(0,arguments),b=a&&a.container,d=a.x,e=a.y,f=a.width,g=a.height;if(!b)throw new Error("SVG container not found.");var h,i=q("svg"),j="overflow:hidden;";return d=d||0,e=e||0,f=f||512,g=g||342,q(i,{height:g,version:1.1,width:f,xmlns:"http://www.w3.org/2000/svg"}),1==b?(i.style.cssText=j+"position:absolute;left:"+d+"px;top:"+e+"px",c._g.doc.body.appendChild(i),h=1):(i.style.cssText=j+"position:relative",b.firstChild?b.insertBefore(i,b.firstChild):b.appendChild(i)),b=new c._Paper,b.width=f,b.height=g,b.canvas=i,b.clear(),b._left=b._top=0,h&&(b.renderfix=function(){}),b.renderfix(),b},c._engine.setViewBox=function(a,b,c,d,e){k("raphael.setViewBox",this,this._viewBox,[a,b,c,d,e]);var f,h,i=g(c/this.width,d/this.height),j=this.top,l=e?"meet":"xMinYMin";for(null==a?(this._vbSize&&(i=1),delete this._vbSize,f="0 0 "+this.width+m+this.height):(this._vbSize=i,f=a+m+b+m+c+m+d),q(this.canvas,{viewBox:f,preserveAspectRatio:l});i&&j;)h="stroke-width"in j.attrs?j.attrs["stroke-width"]:1,j.attr({"stroke-width":h}),j._.dirty=1,j._.dirtyT=1,j=j.prev;return this._viewBox=[a,b,c,d,!!e],this},c.prototype.renderfix=function(){var a,b=this.canvas,c=b.style;try{a=b.getScreenCTM()||b.createSVGMatrix()}catch(d){a=b.createSVGMatrix()}var e=-a.e%1,f=-a.f%1;(e||f)&&(e&&(this._left=(this._left+e)%1,c.left=this._left+"px"),f&&(this._top=(this._top+f)%1,c.top=this._top+"px"))},c.prototype.clear=function(){c.eve("raphael.clear",this);for(var a=this.canvas;a.firstChild;)a.removeChild(a.firstChild);this.bottom=this.top=null,(this.desc=q("desc")).appendChild(c._g.doc.createTextNode("Created with Raphaël "+c.version)),a.appendChild(this.desc),a.appendChild(this.defs=q("defs"))},c.prototype.remove=function(){k("raphael.remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]="function"==typeof this[a]?c._removedFactory(a):null};var B=c.st;for(var C in A)A[a](C)&&!B[a](C)&&(B[C]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(C))}}(),function(){if(c.vml){var a="hasOwnProperty",b=String,d=parseFloat,e=Math,f=e.round,g=e.max,h=e.min,i=e.abs,j="fill",k=/[, ]+/,l=c.eve,m=" progid:DXImageTransform.Microsoft",n=" ",o="",p={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},q=/([clmz]),?([^clmz]*)/gi,r=/ progid:\S+Blur\([^\)]+\)/g,s=/-?[^,\s-]+/g,t="position:absolute;left:0;top:0;width:1px;height:1px",u=21600,v={path:1,rect:1,image:1},w={circle:1,ellipse:1},x=function(a){var d=/[ahqstv]/gi,e=c._pathToAbsolute;if(b(a).match(d)&&(e=c._path2curve),d=/[clmz]/g,e==c._pathToAbsolute&&!b(a).match(d)){var g=b(a).replace(q,function(a,b,c){var d=[],e="m"==b.toLowerCase(),g=p[b];return c.replace(s,function(a){e&&2==d.length&&(g+=d+p["m"==b?"l":"L"],d=[]),d.push(f(a*u))}),g+d});return g}var h,i,j=e(a);g=[];for(var k=0,l=j.length;l>k;k++){h=j[k],i=j[k][0].toLowerCase(),"z"==i&&(i="x");for(var m=1,r=h.length;r>m;m++)i+=f(h[m]*u)+(m!=r-1?",":o);g.push(i)}return g.join(n)},y=function(a,b,d){var e=c.matrix();return e.rotate(-a,.5,.5),{dx:e.x(b,d),dy:e.y(b,d)}},z=function(a,b,c,d,e,f){var g=a._,h=a.matrix,k=g.fillpos,l=a.node,m=l.style,o=1,p="",q=u/b,r=u/c;if(m.visibility="hidden",b&&c){if(l.coordsize=i(q)+n+i(r),m.rotation=f*(0>b*c?-1:1),f){var s=y(f,d,e);d=s.dx,e=s.dy}if(0>b&&(p+="x"),0>c&&(p+=" y")&&(o=-1),m.flip=p,l.coordorigin=d*-q+n+e*-r,k||g.fillsize){var t=l.getElementsByTagName(j);t=t&&t[0],l.removeChild(t),k&&(s=y(f,h.x(k[0],k[1]),h.y(k[0],k[1])),t.position=s.dx*o+n+s.dy*o),g.fillsize&&(t.size=g.fillsize[0]*i(b)+n+g.fillsize[1]*i(c)),l.appendChild(t)}m.visibility="visible"}};c.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};var A=function(a,c,d){for(var e=b(c).toLowerCase().split("-"),f=d?"end":"start",g=e.length,h="classic",i="medium",j="medium";g--;)switch(e[g]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":h=e[g];break;case"wide":case"narrow":j=e[g];break;case"long":case"short":i=e[g]}var k=a.node.getElementsByTagName("stroke")[0];k[f+"arrow"]=h,k[f+"arrowlength"]=i,k[f+"arrowwidth"]=j},B=function(e,i){e.attrs=e.attrs||{};var l=e.node,m=e.attrs,p=l.style,q=v[e.type]&&(i.x!=m.x||i.y!=m.y||i.width!=m.width||i.height!=m.height||i.cx!=m.cx||i.cy!=m.cy||i.rx!=m.rx||i.ry!=m.ry||i.r!=m.r),r=w[e.type]&&(m.cx!=i.cx||m.cy!=i.cy||m.r!=i.r||m.rx!=i.rx||m.ry!=i.ry),s=e;for(var t in i)i[a](t)&&(m[t]=i[t]);if(q&&(m.path=c._getPath[e.type](e),e._.dirty=1),i.href&&(l.href=i.href),i.title&&(l.title=i.title),i.target&&(l.target=i.target),i.cursor&&(p.cursor=i.cursor),"blur"in i&&e.blur(i.blur),(i.path&&"path"==e.type||q)&&(l.path=x(~b(m.path).toLowerCase().indexOf("r")?c._pathToAbsolute(m.path):m.path),"image"==e.type&&(e._.fillpos=[m.x,m.y],e._.fillsize=[m.width,m.height],z(e,1,1,0,0,0))),"transform"in i&&e.transform(i.transform),r){var y=+m.cx,B=+m.cy,D=+m.rx||+m.r||0,E=+m.ry||+m.r||0;l.path=c.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",f((y-D)*u),f((B-E)*u),f((y+D)*u),f((B+E)*u),f(y*u)),e._.dirty=1}if("clip-rect"in i){var G=b(i["clip-rect"]).split(k);if(4==G.length){G[2]=+G[2]+ +G[0],G[3]=+G[3]+ +G[1];var H=l.clipRect||c._g.doc.createElement("div"),I=H.style;I.clip=c.format("rect({1}px {2}px {3}px {0}px)",G),l.clipRect||(I.position="absolute",I.top=0,I.left=0,I.width=e.paper.width+"px",I.height=e.paper.height+"px",l.parentNode.insertBefore(H,l),H.appendChild(l),l.clipRect=H)}i["clip-rect"]||l.clipRect&&(l.clipRect.style.clip="auto")}if(e.textpath){var J=e.textpath.style;i.font&&(J.font=i.font),i["font-family"]&&(J.fontFamily='"'+i["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,o)+'"'),i["font-size"]&&(J.fontSize=i["font-size"]),i["font-weight"]&&(J.fontWeight=i["font-weight"]),i["font-style"]&&(J.fontStyle=i["font-style"])}if("arrow-start"in i&&A(s,i["arrow-start"]),"arrow-end"in i&&A(s,i["arrow-end"],1),null!=i.opacity||null!=i["stroke-width"]||null!=i.fill||null!=i.src||null!=i.stroke||null!=i["stroke-width"]||null!=i["stroke-opacity"]||null!=i["fill-opacity"]||null!=i["stroke-dasharray"]||null!=i["stroke-miterlimit"]||null!=i["stroke-linejoin"]||null!=i["stroke-linecap"]){var K=l.getElementsByTagName(j),L=!1;if(K=K&&K[0],!K&&(L=K=F(j)),"image"==e.type&&i.src&&(K.src=i.src),i.fill&&(K.on=!0),(null==K.on||"none"==i.fill||null===i.fill)&&(K.on=!1),K.on&&i.fill){var M=b(i.fill).match(c._ISURL);if(M){K.parentNode==l&&l.removeChild(K),K.rotate=!0,K.src=M[1],K.type="tile";var N=e.getBBox(1);K.position=N.x+n+N.y,e._.fillpos=[N.x,N.y],c._preload(M[1],function(){e._.fillsize=[this.offsetWidth,this.offsetHeight]})}else K.color=c.getRGB(i.fill).hex,K.src=o,K.type="solid",c.getRGB(i.fill).error&&(s.type in{circle:1,ellipse:1}||"r"!=b(i.fill).charAt())&&C(s,i.fill,K)&&(m.fill="none",m.gradient=i.fill,K.rotate=!1)}if("fill-opacity"in i||"opacity"in i){var O=((+m["fill-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+c.getRGB(i.fill).o+1||2)-1);O=h(g(O,0),1),K.opacity=O,K.src&&(K.color="none")}l.appendChild(K);var P=l.getElementsByTagName("stroke")&&l.getElementsByTagName("stroke")[0],Q=!1;!P&&(Q=P=F("stroke")),(i.stroke&&"none"!=i.stroke||i["stroke-width"]||null!=i["stroke-opacity"]||i["stroke-dasharray"]||i["stroke-miterlimit"]||i["stroke-linejoin"]||i["stroke-linecap"])&&(P.on=!0),("none"==i.stroke||null===i.stroke||null==P.on||0==i.stroke||0==i["stroke-width"])&&(P.on=!1);var R=c.getRGB(i.stroke);P.on&&i.stroke&&(P.color=R.hex),O=((+m["stroke-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+R.o+1||2)-1);var S=.75*(d(i["stroke-width"])||1);if(O=h(g(O,0),1),null==i["stroke-width"]&&(S=m["stroke-width"]),i["stroke-width"]&&(P.weight=S),S&&1>S&&(O*=S)&&(P.weight=1),P.opacity=O,i["stroke-linejoin"]&&(P.joinstyle=i["stroke-linejoin"]||"miter"),P.miterlimit=i["stroke-miterlimit"]||8,i["stroke-linecap"]&&(P.endcap="butt"==i["stroke-linecap"]?"flat":"square"==i["stroke-linecap"]?"square":"round"),i["stroke-dasharray"]){var T={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};P.dashstyle=T[a](i["stroke-dasharray"])?T[i["stroke-dasharray"]]:o}Q&&l.appendChild(P)}if("text"==s.type){s.paper.canvas.style.display=o;var U=s.paper.span,V=100,W=m.font&&m.font.match(/\d+(?:\.\d*)?(?=px)/);p=U.style,m.font&&(p.font=m.font),m["font-family"]&&(p.fontFamily=m["font-family"]),m["font-weight"]&&(p.fontWeight=m["font-weight"]),m["font-style"]&&(p.fontStyle=m["font-style"]),W=d(m["font-size"]||W&&W[0])||10,p.fontSize=W*V+"px",s.textpath.string&&(U.innerHTML=b(s.textpath.string).replace(/</g,"&#60;").replace(/&/g,"&#38;").replace(/\n/g,"<br>"));var X=U.getBoundingClientRect();s.W=m.w=(X.right-X.left)/V,s.H=m.h=(X.bottom-X.top)/V,s.X=m.x,s.Y=m.y+s.H/2,("x"in i||"y"in i)&&(s.path.v=c.format("m{0},{1}l{2},{1}",f(m.x*u),f(m.y*u),f(m.x*u)+1));for(var Y=["x","y","text","font","font-family","font-weight","font-style","font-size"],Z=0,$=Y.length;$>Z;Z++)if(Y[Z]in i){s._.dirty=1;break}switch(m["text-anchor"]){case"start":s.textpath.style["v-text-align"]="left",s.bbx=s.W/2;break;case"end":s.textpath.style["v-text-align"]="right",s.bbx=-s.W/2;break;default:s.textpath.style["v-text-align"]="center",s.bbx=0}s.textpath.style["v-text-kern"]=!0}},C=function(a,f,g){a.attrs=a.attrs||{};var h=(a.attrs,Math.pow),i="linear",j=".5 .5";if(a.attrs.gradient=f,f=b(f).replace(c._radial_gradient,function(a,b,c){return i="radial",b&&c&&(b=d(b),c=d(c),h(b-.5,2)+h(c-.5,2)>.25&&(c=e.sqrt(.25-h(b-.5,2))*(2*(c>.5)-1)+.5),j=b+n+c),o}),f=f.split(/\s*\-\s*/),"linear"==i){var k=f.shift();if(k=-d(k),isNaN(k))return null}var l=c._parseDots(f);if(!l)return null;if(a=a.shape||a.node,l.length){a.removeChild(g),g.on=!0,g.method="none",g.color=l[0].color,g.color2=l[l.length-1].color;for(var m=[],p=0,q=l.length;q>p;p++)l[p].offset&&m.push(l[p].offset+n+l[p].color);g.colors=m.length?m.join():"0% "+g.color,"radial"==i?(g.type="gradientTitle",g.focus="100%",g.focussize="0 0",g.focusposition=j,g.angle=0):(g.type="gradient",g.angle=(270-k)%360),a.appendChild(g)}return 1},D=function(a,b){this[0]=this.node=a,a.raphael=!0,this.id=c._oid++,a.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=b,this.matrix=c.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!b.bottom&&(b.bottom=this),this.prev=b.top,b.top&&(b.top.next=this),b.top=this,this.next=null},E=c.el;D.prototype=E,E.constructor=D,E.transform=function(a){if(null==a)return this._.transform;var d,e=this.paper._viewBoxShift,f=e?"s"+[e.scale,e.scale]+"-1-1t"+[e.dx,e.dy]:o;e&&(d=a=b(a).replace(/\.{3}|\u2026/g,this._.transform||o)),c._extractTransform(this,f+a);var g,h=this.matrix.clone(),i=this.skew,j=this.node,k=~b(this.attrs.fill).indexOf("-"),l=!b(this.attrs.fill).indexOf("url(");if(h.translate(1,1),l||k||"image"==this.type)if(i.matrix="1 0 0 1",i.offset="0 0",g=h.split(),k&&g.noRotation||!g.isSimple){j.style.filter=h.toFilter();var m=this.getBBox(),p=this.getBBox(1),q=m.x-p.x,r=m.y-p.y;j.coordorigin=q*-u+n+r*-u,z(this,1,1,q,r,0)}else j.style.filter=o,z(this,g.scalex,g.scaley,g.dx,g.dy,g.rotate);else j.style.filter=o,i.matrix=b(h),i.offset=h.offset();return d&&(this._.transform=d),this},E.rotate=function(a,c,e){if(this.removed)return this;if(null!=a){if(a=b(a).split(k),a.length-1&&(c=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(c=e),null==c||null==e){var f=this.getBBox(1);c=f.x+f.width/2,e=f.y+f.height/2}return this._.dirtyT=1,this.transform(this._.transform.concat([["r",a,c,e]])),this}},E.translate=function(a,c){return this.removed?this:(a=b(a).split(k),a.length-1&&(c=d(a[1])),a=d(a[0])||0,c=+c||0,this._.bbox&&(this._.bbox.x+=a,this._.bbox.y+=c),this.transform(this._.transform.concat([["t",a,c]])),this)},E.scale=function(a,c,e,f){if(this.removed)return this;if(a=b(a).split(k),a.length-1&&(c=d(a[1]),e=d(a[2]),f=d(a[3]),isNaN(e)&&(e=null),isNaN(f)&&(f=null)),a=d(a[0]),null==c&&(c=a),null==f&&(e=f),null==e||null==f)var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,c,e,f]])),this._.dirtyT=1,this},E.hide=function(){return!this.removed&&(this.node.style.display="none"),this},E.show=function(){return!this.removed&&(this.node.style.display=o),this},E._getBBox=function(){return this.removed?{}:{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},E.remove=function(){if(!this.removed&&this.node.parentNode){this.paper.__set__&&this.paper.__set__.exclude(this),c.eve.unbind("raphael.*.*."+this.id),c._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var a in this)this[a]="function"==typeof this[a]?c._removedFactory(a):null;this.removed=!0}},E.attr=function(b,d){if(this.removed)return this;if(null==b){var e={};for(var f in this.attrs)this.attrs[a](f)&&(e[f]=this.attrs[f]);return e.gradient&&"none"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e}if(null==d&&c.is(b,"string")){if(b==j&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;for(var g=b.split(k),h={},i=0,m=g.length;m>i;i++)b=g[i],h[b]=b in this.attrs?this.attrs[b]:c.is(this.paper.customAttributes[b],"function")?this.paper.customAttributes[b].def:c._availableAttrs[b];return m-1?h:h[g[0]]}if(this.attrs&&null==d&&c.is(b,"array")){for(h={},i=0,m=b.length;m>i;i++)h[b[i]]=this.attr(b[i]);return h}var n;null!=d&&(n={},n[b]=d),null==d&&c.is(b,"object")&&(n=b);for(var o in n)l("raphael.attr."+o+"."+this.id,this,n[o]);if(n){for(o in this.paper.customAttributes)if(this.paper.customAttributes[a](o)&&n[a](o)&&c.is(this.paper.customAttributes[o],"function")){var p=this.paper.customAttributes[o].apply(this,[].concat(n[o]));this.attrs[o]=n[o];for(var q in p)p[a](q)&&(n[q]=p[q])}n.text&&"text"==this.type&&(this.textpath.string=n.text),B(this,n)}return this},E.toFront=function(){return!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&c._tofront(this,this.paper),this},E.toBack=function(){return this.removed?this:(this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),c._toback(this,this.paper)),this)},E.insertAfter=function(a){return this.removed?this:(a.constructor==c.st.constructor&&(a=a[a.length-1]),a.node.nextSibling?a.node.parentNode.insertBefore(this.node,a.node.nextSibling):a.node.parentNode.appendChild(this.node),c._insertafter(this,a,this.paper),this)},E.insertBefore=function(a){return this.removed?this:(a.constructor==c.st.constructor&&(a=a[0]),a.node.parentNode.insertBefore(this.node,a.node),c._insertbefore(this,a,this.paper),this)},E.blur=function(a){var b=this.node.runtimeStyle,d=b.filter;return d=d.replace(r,o),0!==+a?(this.attrs.blur=a,b.filter=d+n+m+".Blur(pixelradius="+(+a||1.5)+")",b.margin=c.format("-{0}px 0 0 -{0}px",f(+a||1.5))):(b.filter=d,b.margin=0,delete this.attrs.blur),this},c._engine.path=function(a,b){var c=F("shape");c.style.cssText=t,c.coordsize=u+n+u,c.coordorigin=b.coordorigin;var d=new D(c,b),e={fill:"none",stroke:"#000"};a&&(e.path=a),d.type="path",d.path=[],d.Path=o,B(d,e),b.canvas.appendChild(c);var f=F("skew");return f.on=!0,c.appendChild(f),d.skew=f,d.transform(o),d},c._engine.rect=function(a,b,d,e,f,g){var h=c._rectPath(b,d,e,f,g),i=a.path(h),j=i.attrs;return i.X=j.x=b,i.Y=j.y=d,i.W=j.width=e,i.H=j.height=f,j.r=g,j.path=h,i.type="rect",i},c._engine.ellipse=function(a,b,c,d,e){var f=a.path();return f.attrs,f.X=b-d,f.Y=c-e,f.W=2*d,f.H=2*e,f.type="ellipse",B(f,{cx:b,cy:c,rx:d,ry:e}),f},c._engine.circle=function(a,b,c,d){var e=a.path();return e.attrs,e.X=b-d,e.Y=c-d,e.W=e.H=2*d,e.type="circle",B(e,{cx:b,cy:c,r:d}),e},c._engine.image=function(a,b,d,e,f,g){var h=c._rectPath(d,e,f,g),i=a.path(h).attr({stroke:"none"}),k=i.attrs,l=i.node,m=l.getElementsByTagName(j)[0];return k.src=b,i.X=k.x=d,i.Y=k.y=e,i.W=k.width=f,i.H=k.height=g,k.path=h,i.type="image",m.parentNode==l&&l.removeChild(m),m.rotate=!0,m.src=b,m.type="tile",i._.fillpos=[d,e],i._.fillsize=[f,g],l.appendChild(m),z(i,1,1,0,0,0),i},c._engine.text=function(a,d,e,g){var h=F("shape"),i=F("path"),j=F("textpath");d=d||0,e=e||0,g=g||"",i.v=c.format("m{0},{1}l{2},{1}",f(d*u),f(e*u),f(d*u)+1),i.textpathok=!0,j.string=b(g),j.on=!0,h.style.cssText=t,h.coordsize=u+n+u,h.coordorigin="0 0";var k=new D(h,a),l={fill:"#000",stroke:"none",font:c._availableAttrs.font,text:g};k.shape=h,k.path=i,k.textpath=j,k.type="text",k.attrs.text=b(g),k.attrs.x=d,k.attrs.y=e,k.attrs.w=1,k.attrs.h=1,B(k,l),h.appendChild(j),h.appendChild(i),a.canvas.appendChild(h);var m=F("skew");return m.on=!0,h.appendChild(m),k.skew=m,k.transform(o),k},c._engine.setSize=function(a,b){var d=this.canvas.style;return this.width=a,this.height=b,a==+a&&(a+="px"),b==+b&&(b+="px"),d.width=a,d.height=b,d.clip="rect(0 "+a+" "+b+" 0)",this._viewBox&&c._engine.setViewBox.apply(this,this._viewBox),this},c._engine.setViewBox=function(a,b,d,e,f){c.eve("raphael.setViewBox",this,this._viewBox,[a,b,d,e,f]);var h,i,j=this.width,k=this.height,l=1/g(d/j,e/k);return f&&(h=k/e,i=j/d,j>d*h&&(a-=(j-d*h)/2/h),k>e*i&&(b-=(k-e*i)/2/i)),this._viewBox=[a,b,d,e,!!f],this._viewBoxShift={dx:-a,dy:-b,scale:l},this.forEach(function(a){a.transform("...")}),this};var F;c._engine.initWin=function(a){var b=a.document;b.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!b.namespaces.rvml&&b.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),F=function(a){return b.createElement("<rvml:"+a+' class="rvml">')}}catch(c){F=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},c._engine.initWin(c._g.win),c._engine.create=function(){var a=c._getContainer.apply(0,arguments),b=a.container,d=a.height,e=a.width,f=a.x,g=a.y;if(!b)throw new Error("VML container not found.");var h=new c._Paper,i=h.canvas=c._g.doc.createElement("div"),j=i.style;return f=f||0,g=g||0,e=e||512,d=d||342,h.width=e,h.height=d,e==+e&&(e+="px"),d==+d&&(d+="px"),h.coordsize=1e3*u+n+1e3*u,h.coordorigin="0 0",h.span=c._g.doc.createElement("span"),h.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",i.appendChild(h.span),j.cssText=c.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",e,d),1==b?(c._g.doc.body.appendChild(i),j.left=f+"px",j.top=g+"px",j.position="absolute"):b.firstChild?b.insertBefore(i,b.firstChild):b.appendChild(i),h.renderfix=function(){},h},c.prototype.clear=function(){c.eve("raphael.clear",this),this.canvas.innerHTML=o,this.span=c._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},c.prototype.remove=function(){c.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]="function"==typeof this[a]?c._removedFactory(a):null;return!0};var G=c.st;for(var H in E)E[a](H)&&!G[a](H)&&(G[H]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(H))}}(),B.was?A.win.Raphael=c:Raphael=c,c}); \ No newline at end of file diff --git a/theme/bootstrap/views/layouts/column2.php b/theme/bootstrap/views/layouts/column2.php new file mode 100644 index 0000000..7453e44 --- /dev/null +++ b/theme/bootstrap/views/layouts/column2.php @@ -0,0 +1,24 @@ +<?php /* @var $this Controller */ ?> +<?php $this->beginContent('//layouts/main'); ?> +<div class=""> + <div class="span9"> + <div id="content"> + <?php echo $content; ?> + </div><!-- content --> + </div> + <div class="span2"> + <div id="sidebar"> + <?php + $this->beginWidget('zii.widgets.CPortlet', array( + 'title'=>'Operations', + )); + $this->widget('bootstrap.widgets.TbMenu', array( + 'items'=>$this->menu, + 'htmlOptions'=>array('class'=>'operations'), + )); + $this->endWidget(); + ?> + </div><!-- sidebar --> + </div> +</div> +<?php $this->endContent(); ?> \ No newline at end of file diff --git a/theme/bootstrap/views/layouts/main.php b/theme/bootstrap/views/layouts/main.php new file mode 100644 index 0000000..da75f37 --- /dev/null +++ b/theme/bootstrap/views/layouts/main.php @@ -0,0 +1,156 @@ +<?php /* @var $this Controller */ ?> +<?php Yii::app()->bootstrap->register(); ?> +<!DOCTYPE html> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <meta name="language" content="en" /> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + + <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"> + + <!-- Font Awesome --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> + <!-- Ionicons --> + <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> + <!-- Theme style --> + <link rel="stylesheet" href="<?php echo Yii::app()->theme->baseUrl; ?>/dist/css/AdminLTE.min.css"> + <!-- AdminLTE Skins. Choose a skin from the css/skins + folder instead of downloading all of them to reduce the load. --> + <link rel="stylesheet" href="<?php echo Yii::app()->theme->baseUrl; ?>/dist/css/skins/_all-skins.min.css"> + <!-- iCheck --> + + + +</head> + +<body class="hold-transition skin-blue sidebar-mini"> + <div id="wrapper"> + <header class="main-header"> + <a href="#" class="logo"> + <span class="logo-mini"><b>S</b>SKM</span> + <span class="logo-lg"><b>SIM </b>SKM</span> + </a> + <nav class="navbar navbar-static-top" role="navigation"> + <a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"> + <span class="sr-only">Toggle navigation</span> + </a> + </nav> + </header> + <aside class="main-sidebar"> + <section class="sidebar"> + <ul class="sidebar-menu"> + <li class="header">MAIN NAVIGATION</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-home"></i> <span>HOME</span></i> + </a> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-laptop"></i> + <span>MASTER USER</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="<?php echo Yii::app()->request->baseUrl; ?>/index.php/tipeuser/admin"><i class="fa fa-circle-o"></i> TIPER USER</a></li> + <li><a href="pages/UI/icons.html"><i class="fa fa-circle-o"></i> USER</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-database"></i> <span>MASTER SKM</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <li><a href="pages/forms/general.html"><i class="fa fa-circle-o"></i> KOMPETENSI</a></li> + <li><a href="pages/forms/advanced.html"><i class="fa fa-circle-o"></i> LEVEL</a></li> + </ul> + </li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-users"></i> <span>JABATAN</span> + </a> + </li> +<!-- START ESELON --> + <li class="header">ESELON</li> + <li class="treeview"> + <a href="#"> + <i class="fa fa-share"></i> <span>Multilevel</span> + <i class="fa fa-angle-left pull-right"></i> + </a> + <ul class="treeview-menu"> + <!--li><a href="#"><i class="fa fa-circle-o"></i> Level One</a></li--!> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Dinas Kominfo <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <!--li><a href="#"><i class="fa fa-circle-o"></i> Level Two</a></li--!> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Eselon II <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i> Kepala Dinas Kominfo</a></li> + </ul> + </li> + <li> + <a href="#"><i class="fa fa-circle-o"></i> Eselon III <i class="fa fa-angle-left pull-right"></i></a> + <ul class="treeview-menu"> + <li><a href="#"><i class="fa fa-circle-o"></i><span data-toggle="tooltip" data-original-title="Kepala Bidang Pos dan Telekomunikasi"> Kabid </span></a> + </li> + <li><a href="#"><i class="fa fa-circle-o"></i> Sekretaris Dinas</a></li> + <li><a href="#"><i class="fa fa-circle-o"></i> Kepala Bidang Informasi</a></li> + </ul> + </li> + </ul> + </li> + </ul> + </li> +<!-- END ESELON --> + </ul> + </section> + <!-- /.sidebar --> + </aside> +<?php + $this->widget('bootstrap.widgets.TbNavbar',array( + 'items'=>array( + array( + 'class'=>'bootstrap.widgets.TbMenu', + 'items'=>array( + array('label'=>'HOME', 'url'=>array('/site/index')), + array('label'=>'ABOUT', 'url'=>array('/site/page', 'view'=>'about')), + array('label'=>'CONTACT', 'url'=>array('/site/contact')), + array('label'=>'LOGIN', 'url'=>array('/site/login'), 'visible'=>Yii::app()->user->isGuest), + array('label'=>'LOGUOT ('.Yii::app()->user->name.')', 'url'=>array('/site/logout'), 'visible'=>!Yii::app()->user->isGuest) + ), + ), + ), + )); +?> + <div class="content-wrapper"> + <section class="content"> + <div class="box box-default"> + <div class="box-body"> + <?php if(isset($this->breadcrumbs)):?> + <?php $this->widget('bootstrap.widgets.TbBreadcrumbs', array( + 'links'=>$this->breadcrumbs, + )); ?><!-- breadcrumbs --> + <?php endif?> + <?php echo $content; ?> + <div class="clear"></div> + </div> + </div> + </section> + </div> + <footer class="main-footer"> + <div class="pull-right hidden-xs"> + <b>Version</b> 0.0.1 + </div> + </footer> + </div> + + + <!-- AdminLTE App --> + <script src="<?php echo Yii::app()->theme->baseUrl; ?>/dist/js/app.min.js"></script> + +</body> +</html> diff --git a/theme/bootstrap/views/site/contact.php b/theme/bootstrap/views/site/contact.php new file mode 100644 index 0000000..788fa8b --- /dev/null +++ b/theme/bootstrap/views/site/contact.php @@ -0,0 +1,67 @@ +<?php +/* @var $this SiteController */ +/* @var $model ContactForm */ +/* @var $form TbActiveForm */ + +$this->pageTitle=Yii::app()->name . ' - Contact Us'; +$this->breadcrumbs=array( + 'Contact', +); +?> + +<h1>Contact Us</h1> + +<?php if(Yii::app()->user->hasFlash('contact')): ?> + + <?php $this->widget('bootstrap.widgets.TbAlert', array( + 'alerts'=>array('contact'), + )); ?> + +<?php else: ?> + +<p> +If you have business inquiries or other questions, please fill out the following form to contact us. Thank you. +</p> + +<div class="form"> + +<?php $form=$this->beginWidget('bootstrap.widgets.TbActiveForm', array( + 'id'=>'contact-form', + 'type'=>'horizontal', + 'enableClientValidation'=>true, + 'clientOptions'=>array( + 'validateOnSubmit'=>true, + ), +)); ?> + + <p class="note">Fields with <span class="required">*</span> are required.</p> + + <?php echo $form->errorSummary($model); ?> + + <?php echo $form->textFieldRow($model,'name'); ?> + + <?php echo $form->textFieldRow($model,'email'); ?> + + <?php echo $form->textFieldRow($model,'subject',array('size'=>60,'maxlength'=>128)); ?> + + <?php echo $form->textAreaRow($model,'body',array('rows'=>6, 'class'=>'span8')); ?> + + <?php if(CCaptcha::checkRequirements()): ?> + <?php echo $form->captchaRow($model,'verifyCode',array( + 'hint'=>'Please enter the letters as they are shown in the image above.<br/>Letters are not case-sensitive.', + )); ?> + <?php endif; ?> + + <div class="form-actions"> + <?php $this->widget('bootstrap.widgets.TbButton',array( + 'buttonType'=>'submit', + 'type'=>'primary', + 'label'=>'Submit', + )); ?> + </div> + +<?php $this->endWidget(); ?> + +</div><!-- form --> + +<?php endif; ?> \ No newline at end of file diff --git a/theme/bootstrap/views/site/index.php b/theme/bootstrap/views/site/index.php new file mode 100644 index 0000000..7aab995 --- /dev/null +++ b/theme/bootstrap/views/site/index.php @@ -0,0 +1,25 @@ +<?php +/* @var $this SiteController */ + +$this->pageTitle=Yii::app()->name; +?> + +<?php $this->beginWidget('bootstrap.widgets.TbHeroUnit',array( + 'heading'=>'Welcome to '.CHtml::encode(Yii::app()->name), +)); ?> + +<p>Congratulations! You have successfully created your Yii application.</p> + +<?php $this->endWidget(); ?> + +<p>You may change the content of this page by modifying the following two files:</p> + +<ul> + <li>View file: <code><?php echo __FILE__; ?></code></li> + <li>Layout file: <code><?php echo $this->getLayoutFile('main'); ?></code></li> +</ul> + +<p>For more details on how to further develop this application, please read + the <a href="http://www.yiiframework.com/doc/">documentation</a>. + Feel free to ask in the <a href="http://www.yiiframework.com/forum/">forum</a>, + should you have any questions.</p> diff --git a/theme/bootstrap/views/site/login.php b/theme/bootstrap/views/site/login.php new file mode 100644 index 0000000..1757376 --- /dev/null +++ b/theme/bootstrap/views/site/login.php @@ -0,0 +1,47 @@ +<?php +/* @var $this SiteController */ +/* @var $model LoginForm */ +/* @var $form CActiveForm */ + +$this->pageTitle=Yii::app()->name . ' - Login'; +$this->breadcrumbs=array( + 'Login', +); +?> + +<h1>Login</h1> + +<p>Please fill out the following form with your login credentials:</p> + +<div class="form"> + +<?php $form=$this->beginWidget('bootstrap.widgets.TbActiveForm', array( + 'id'=>'login-form', + 'type'=>'horizontal', + 'enableClientValidation'=>true, + 'clientOptions'=>array( + 'validateOnSubmit'=>true, + ), +)); ?> + + <p class="note">Fields with <span class="required">*</span> are required.</p> + + <?php echo $form->textFieldRow($model,'username'); ?> + + <?php echo $form->passwordFieldRow($model,'password',array( + 'hint'=>'Hint: You may login with <kbd>demo</kbd>/<kbd>demo</kbd> or <kbd>admin</kbd>/<kbd>admin</kbd>', + )); ?> + + <?php echo $form->checkBoxRow($model,'rememberMe'); ?> + + <div class="form-actions"> + <?php $this->widget('bootstrap.widgets.TbButton', array( + 'buttonType'=>'submit', + 'type'=>'primary', + 'label'=>'Login', + )); ?> + </div> + +<?php $this->endWidget(); ?> + +</div><!-- form --> diff --git a/user_guide/changelog.html b/user_guide/changelog.html new file mode 100644 index 0000000..5a81bcf --- /dev/null +++ b/user_guide/changelog.html @@ -0,0 +1,1636 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<style type='text/css' media='all'>@import url('userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='userguide.css' /> + +<script type="text/javascript" src="./nav/nav.js"></script> +<script type="text/javascript" src="./nav/prototype.lite.js"></script> +<script type="text/javascript" src="./nav/moo.fx.js"></script> +<script type="text/javascript" src="./nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Change Log : CodeIgniter User Guide</title> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('./');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="./images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="./toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Change Log +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Change Log</h1> + + +<h2>Version 2.2.6</h2> +<p>Release Date: October 31, 2015</p> + +<ul> + <li><b>Security</b> + <ul> + <li>Fixed an XSS attack vector in <a href="libraries/security.html">Security Library</a> method <samp>xss_clean()</samp>.</li> + <li>Changed <a href="libraries/config.html">Config Library</a> method <samp>base_url()</samp> to fallback to ``$_SERVER['SERVER_ADDR']`` in order to avoid Host header injections.</li> + <li>Changed <a href="helpers/captcha_helper.html">CAPTCHA Helper</a> to try to use the operating system's PRNG first.</a> + </ul> + </li> +</ul> + +<h2>Version 2.2.5</h2> +<p>Release Date: October 8, 2015</p> + +<ul> + <li><b>Security</b> + <ul> + <li>Fixed a number of XSS attack vectors in <a href="libraries/security.html">Security Library</a> method <samp>xss_clean()</samp> (thanks to Frans Rosén from <a href="https://detectify.com/">Detectify</a>).</li> + </ul> + </li> +</ul> + +<h2>Version 2.2.4</h2> +<p>Release Date: August 20, 2015</p> + +<ul> + <li><b>Security</b> + <ul> + <li>Fixed an SQL injection vulnerability in <a href="database/active_record.html">Active Record</a> method <samp>offset()</samp>.</li> + </ul> + </li> +</ul> + +<h2>Version 2.2.3</h2> +<p>Release Date: July 14, 2015</p> + +<ul> + <li><b>Security</b> + <ul> + <li>Removed a fallback to <samp>mysql_escape_string()</samp> in the 'mysql' database driver (<samp>escape_str()</samp> method) when there's no active database connection.</li> + </ul> + </li> +</ul> + +<h2>Version 2.2.2</h2> +<p>Release Date: April 15, 2015</p> + +<ul> + <li><b>Security</b> + <ul> + <li>Added HTTP "Host" header character validation to prevent cache poisoning attacks when <kbd>base_url</kbd> auto-detection is used.</li> + <li>Added <kbd>FSCommand</kbd> and <kbd>seekSegmentTime</kbd> to the "evil attributes" list in <samp>CI_Security::xss_clean()</samp>.</li> + </ul> + </li> +</ul> + +<h3>Bug fixes:</h3> +<ul> + <li>Fixed a bug (#3665) - <samp>CI_Security::entity_decode()</samp> triggered warnings under some circumstances.</li> +</ul> + +<h2>Version 2.2.1</h2> +<p>Release Date: January 22, 2015</p> + +<ul> + <li>General Changes + <ul> + <li>Improved security in <kbd>xss_clean()</kbd>.</li> + <li>Updated timezones in <a href="helpers/date_helper.html">Date Helper</a>.</li> + </ul> + </li> +</ul> + +<h3>Bug fixes:</h3> +<ul> + <li>Fixed a bug (#3094) - <samp>CI_Input::_clean_input_data()</samp> breaks encrypted session cookies.</li> + <li>Fixed a bug (#2268) - <samp>CI_Security::xss_clean()</samp> didn't properly match JavaScript events.</li> + <li>Fixed a bug (#3309) - <samp>CI_Security::xss_clean()</samp> used an overly-invasive pattern to strip JS event handlers.</li> + <li>Fixed a bug (#2771) - <samp>CI_Security::xss_clean()</samp> didn't take into account HTML5 entities.</li> + <li>Fixed a bug (#73) - <samp>CI_Security::sanitize_filename()</samp> could be tricked by an XSS attack.</li> + <li>Fixed a bug (#2681) - <samp>CI_Security::entity_decode()</samp> used the PREG_REPLACE_EVAL flag, which is deprecated since PHP 5.5.</li> + <li>Fixed a bug (#3302) - Internal function <samp>get_config()</samp> triggered an E_NOTICE message on PHP 5.6.</li> + <li>Fixed a bug (#2508) - <a href="libraries/config.html">Config Library</a> didn't properly detect if the current request is via HTTPS.</li> + <li>Fixed a bug (#3314) - SQLSRV <a href="database/index.html">Database driver</a>'s method <samp>count_all()</samp> didn't escape the supplied table name.</li> + <li>Fixed a bug (#3404) - MySQLi <a href="database/index.html">Database driver</a>'s method <samp>escape_str()</samp> had a wrong fallback to <samp>mysql_escape_string()</samp> when there was no active connection.</li> + <li>Fixed a bug in the <a href="libraries/sessions.html">Session Library</a> where session ID regeneration occurred during AJAX requests.</li> +</ul> + +<h2>Version 2.2.0</h2> +<p>Release Date: June 5, 2014</p> + +<ul> + <li>General Changes + <ul> + <li><b>Security:</b> The <samp>xor_encode()</samp> method in the Encrypt Class has been removed. The Encrypt Class now requires the Mcrypt extension to be installed.</li> + <li><b>Security:</b> The <a href="libraries/sessions.html">Session Library</a> now uses HMAC authentication instead of a simple MD5 checksum.</li> + </ul> + </li> +</ul> + +<h3>Bug fixes for 2.2.0:</h3> +<ul> + <li>Fixed an edge case (#2583) in the <a href="libraries/email.html">Email Library</a> where <a href="http://www.hardened-php.net/suhosin/">Suhosin</a> blocked messages sent via <samp>mail()</samp> due to trailing newspaces in headers.</li> + <li>Fixed a bug (#696) - make <samp>oci_execute()</samp> calls inside <samp>num_rows()</samp> non-committing, since they are only there to reset which row is next in line for oci_fetch calls and thus don't need to be committed.</li> + <li>Fixed a bug (#2689) - <a href="database/forge.html">Database Forge Class</a> methods <samp>create_table()</samp>, <samp>drop_table()</samp> and <samp>rename_table()</samp> produced broken SQL for tge 'sqlsrv' driver.</li> + <li>Fixed a bug (#2427) - PDO <a href="database/index.html">Database driver</a> didn't properly check for query failures.</li> + <li>Fixed a bug in the <a href="libraries/sessions.html">Session Library</a> where authentication was not performed for encrypted cookies.</li> +</ul> + +<h2>Version 2.1.4</h2> +<p>Release Date: July 8, 2013</p> + +<ul> + <li>General Changes + <ul> + <li>Improved security in <kbd>xss_clean()</kbd>.</li> + </ul> + </li> +</ul> + +<h3>Bug fixes for 2.1.4:</h3> +<ul> + <li>Fixed a bug (#1936) - <a href="libraries/migration.html">Migrations Library</a> method <samp>latest()</samp> had a typo when retrieving language values.</li> + <li>Fixed a bug (#2021) - <a href="libraries/migration.html">Migrations Library</a> configuration file was mistakenly using Windows style line feeds.</li> + <li>Fixed a bug (#1273) - <a href="database/active_record.html">Active Record</a> method <samp>set_update_batch()</samp> was using the incorrect variables and would cause an error.</li> + <li>Fixed a bug (#2337) - <a href="libraries/email.html">Email Library</a> method <samp>print_debugger()</samp> was not using <samp>htmlspecialchars()</samp> when being shown in the browser.</li> +</ul> + + +<h2>Version 2.1.3</h2> +<p>Release Date: October 8, 2012</p> + +<h3>Bug fixes for 2.1.3:</h3> +<ul> + <li>Fixed a bug (#1543) - <a href="libraries/caching.html#file">File-based Caching</a> method <samp>get_metadata()</samp> used a non-existent array key to look for the TTL value.</li> + <li>Fixed a bug (#1314) - <a href="libraries/session.html">Session Library</a> method <samp>sess_destroy()</samp> didn't destroy the userdata array.</li> + <li>Fixed a bug where the <a href="libraries/profiler.html">Profiler Library</a> issued an E_WARNING error if <a href="libraries/session.html">Session</a> userdata contains objects.</li> + <li>Fixed a bug (#1699) - <a href="libraries/migration.html">Migration Library</a> ignored the <samp>$config['migration_path']</samp> setting.</li> + <li>Fixed a bug (#227) - <a href="libraries/input.html">Input Library</a> allowed unconditional spoofing of HTTP clients' IP addresses through the HTTP_CLIENT_IP header.</li> + <li>Fixed a bug (#907) - <a href="libraries/input.html">Input Library</a> ignored HTTP_X_CLUSTER_CLIENT_IP and HTTP_X_CLIENT_IP headers when checking for proxies.</li> + <li>Fixed a bug (#940) - <samp>csrf_verify()</samp> used to set the CSRF cookie while processing a POST request with no actual POST data, which resulted in validating a request that should be considered invalid.</li> + <li>Fixed a bug in the <a href="libraries/security.html">Security Library</a> where a CSRF cookie was created even if <samp>$config['csrf_protection']</samp> is set tot FALSE.</li> + <li>Fixed a bug (#1715) - <a href="libraries/input.html">Input Library</a> triggered <samp>csrf_verify()</samp> on CLI requests.</li> +</ul> + +<h2>Version 2.1.2</h2> +<p>Release Date: June 29, 2012</p> + +<ul> + <li>General Changes + <ul> + <li>Improved security in <kbd>xss_clean()</kbd>.</li> + </ul> + </li> +</ul> + +<h2>Version 2.1.1</h2> +<p>Release Date: June 12, 2012</p> + +<ul> + <li>General Changes + <ul> + <li>Fixed support for docx, xlsx files in mimes.php.</li> + </ul> + </li> + <li>Libraries + <ul> + <li>Further improved MIME type detection in the <a href="libraries/file_uploading.html">File Uploading Library</a>.</li> + <li>Added support for IPv6 to the <a href="libraries/input.html">Input Library</a>.</li> + <li>Added support for the IP format parameter to the <a href="libraries/form_validation.html">Form Validation Library</a>.</li> + </ul> + </li> + <li>Helpers + <ul> + <li><samp>url_title()</samp> performance and output improved. You can now use any string as the word delimiter. Backwards compatible with 'dash' or 'underscore' as words delimiters.</li> + </ul> + </li> +</ul> + +<h3>Bug fixes for 2.1.1</h3> +<ul> + <li>Fixed a bug (#697) - A wrong array key was used in the Upload library to check for mime-types.</li> + <li>Fixed a bug - form_open() compared $action against site_url() instead of base_url()</li> + <li>Fixed a bug - CI_Upload::_file_mime_type() could've failed if mime_content_type() is used for the detection and returns FALSE.</li> + <li>Fixed a bug (#538) - Windows paths were ignored when using the <a href="libraries/image_lib.html">Image Manipulation Class</a> to create a new file.</li> + <li>Fixed a bug - When database caching was enabled, $this->db->query() checked the cache before binding variables which resulted in cached queries never being found.</li> + <li>Fixed a bug - CSRF cookie value was allowed to be any (non-empty) string before being written to the output, making code injection a risk.</li> + <li>Fixed a bug (#726) - PDO put a 'dbname' argument in it's connection string regardless of the database platform in use, which made it impossible to use SQLite.</li> + <li>Fixed a bug - CI_DB_pdo_result::num_rows() was not returning properly value with SELECT queries, cause it was relying on PDOStatement::rowCount().</li> + <li>Fixed a bug (#1059) - CI_Image_lib::clear() was not correctly clearing all necessary object properties, namely width and height.</li> +</ul> + + +<h2>Version 2.1.0</h2> +<p>Release Date: November 14, 2011</p> + +<ul> + <li>General Changes + <ul> + <li>Fixed a potential parameter injection flaw in the <a href="libraries/security.html">Security Library</a> and strengthened the XSS filter for HTML5 vulnerabilites.</li> + <li>Callback validation rules can now accept parameters like any other validation rule.</li> + <li>Added html_escape() to the <a href="general/common_functions.html">Common functions</a> to escape HTML output for preventing XSS easliy.</li> + </ul> + </li> + <li>Helpers + <ul> + <li>Added <samp>increment_string()</samp> to <a href="helpers/string_helper.html">String Helper</a> to turn "foo" into "foo-1" or "foo-1" into "foo-2".</li> + <li>Altered form helper - made action on form_open_multipart helper function call optional. Fixes (#65)</li> + <li><samp>url_title()</samp> will now trim extra dashes from beginning and end.</li> + <li>Improved speed of <a href="helpers/string_helper.html">String Helper</a>'s <b>random_string()</b> method</li> + </ul> + </li> + <li>Database + <ul> + <li>Added a <a href="http://www.cubrid.org/" target="_blank">CUBRID</a> driver to the <a href="libraries/database.html">Database driver</a>. Thanks to the CUBRID team for supplying this patch.</li> + <li>Added a <a href="http://www.php.net/manual/en/intro.pdo.php" target="_blank">PDO</a> driver to the <a href="libraries/database.html">Database driver</a>.</li> + <li>Typecast limit and offset in the <a href="database/queries.html">Database driver</a> to integers to avoid possible injection.</li> + <li>Added additional option 'none' for the optional third argument for <kbd>$this->db->like()</kbd> in the <a href="database/active_record.html">Database driver</a>. + </li> + <li>Added <kbd>$this->db->insert_batch()</kbd> support to the OCI8 (Oracle) driver.</li> + </ul> + </li> + <li>Libraries + <ul> + <li>Changed <kbd>$this->cart->insert()</kbd> in the <a href="libraries/cart.html">Cart library</a> to return the Row ID if a single item was inserted successfully.</li> + <li>Added support to set an optional parameter in your callback rules of validation using the <a href="libraries/form_validation.html">Form Validation library</a>.</li> + <li>Added a <a href="libraries/migration.html">Migration library</a> to assist with applying incremental updates to your database schema.</li> + <li>Driver children can be located in any package path.</li> + <li>Added <samp>is_unique</samp> to the <a href="libraries/form_validation.html">Form Validation library</a>.</li> + <li>Added <kbd>$config['use_page_numbers']</kbd> to the <a href="libraries/pagination.html">Pagination library</a>, which enables real page numbers in the URI.</li> + <li>Added TLS and SSL Encryption for SMTP.</li> + </ul> + </li> + <li>Core + <ul> + <li>Changed private functions in <a href="libraries/cart.html">URI library</a> to protected so <kdb>MY_URI</kdb> can override them.</li> + <li>Removed <samp>CI_CORE</samp> boolean constant from CodeIgniter.php (there are no longer different Reactor and Core versions).</li> + </ul> + </li> +</ul> + +<h3>Bug fixes for 2.1.0</h3> +<ul> + <li>Fixed #378 Robots identified as regular browsers by the <a href="libraries/user_agent.html">User Agent class</a>.</li> + <li>If a config class was loaded first then a library with the same name is loaded, the config would be ignored.</li> + <li>Fixed a bug (Reactor #19) where 1) the 404_override route was being ignored in some cases, and 2) auto-loaded libraries were not available to the 404_override controller when a controller existed but the requested method did not.</li> + <li>Fixed a bug (Reactor #89) where MySQL export would fail if the table had hyphens or other non alphanumeric/underscore characters.</li> + <li>Fixed a bug (#200) where MySQL queries would be malformed after calling <kbd>$this->db->count_all()</kbd> then <kdb>$this->db->get()</kdb></li> + <li>Fixed bug #105 that stopped query errors from being logged unless database debugging was enabled</li> + <li>Fixed a bug (#160) - Removed unneeded array copy in the file cache driver.</li> + <li>Fixed a bug (#150) - <samp>field_data()</samp> now correctly returns column length.</li> + <li>Fixed a bug (#8) - <samp>load_class()</samp> now looks for core classes in <samp>APPPATH</samp> first, allowing them to be replaced.</li> + <li>Fixed a bug (#24) - ODBC database driver called incorrect parent in __construct().</li> + <li>Fixed a bug (#85) - OCI8 (Oracle) database <kbd>escape_str()</kbd> function did not escape correct.</li> + <li>Fixed a bug (#344) - Using schema found in <a href="libraries/sessions.html">Saving Session Data to a Database</a>, system would throw error "user_data does not have a default value" when deleting then creating a session.</li> + <li>Fixed a bug (#112) - OCI8 (Oracle) driver didn't pass the configured database character set when connecting.</li> + <li>Fixed a bug (#182) - OCI8 (Oracle) driver used to re-execute the statement whenever num_rows() is called.</li> + <li>Fixed a bug (#82) - WHERE clause field names in the DB <kbd>update_string()</kbd> method were not escaped, resulting in failed queries in some cases.</li> + <li>Fixed a bug (#89) - Fix a variable type mismatch in DB <kbd>display_error()</kbd> where an array is expected, but a string could be set instead.</li> + <li>Fixed a bug (#467) - Suppress warnings generated from <kbd>get_magic_quotes_gpc()</kbd> (deprecated in PHP 5.4)</li> + <li>Fixed a bug (#484) - First time <kbd>_csrf_set_hash()</kbd> is called, hash is never set to the cookie (in Security.php).</li> + <li>Fixed a bug (#60) - Added <kbd>_file_mime_type()</kbd> method to the <a href="libraries/file_uploading.html">File Uploading Library</a> in order to fix a possible MIME-type injection (also fixes bug #394).</li> + <li>Fixed a bug (#537) - Support for all wav type in browser.</li> + <li>Fixed a bug (#576) - Using <kbd>ini_get()</kbd> function to detect if apc is enabled or not.</li> + <li>Fixed invalid date time format in <a href="helpers/date_helper.html">Date helper</a> and <a href="libraries/xmlrpc.html">XMLRPC library</a>.</li> +</ul> + +<h2>Version 2.0.3</h2> +<p>Release Date: August 20, 2011</p> + +<ul> + <li>Security + <ul> + <li>An improvement was made to the MySQL and MySQLi drivers to prevent exposing a potential vector for SQL injection on sites using multi-byte character sets in the database client connection. <p>An incompatibility in PHP versions &lt; 5.2.3 and MySQL &lt; 5.0.7 with <em>mysql_set_charset()</em> creates a situation where using multi-byte character sets on these environments may potentially expose a SQL injection attack vector. Latin-1, UTF-8, and other "low ASCII" character sets are unaffected on all environments.</p> <p class="critical">If you are running or considering running a multi-byte character set for your database connection, please pay close attention to the server environment you are deploying on to ensure you are not vulnerable.</p></li> + </ul> + </li> + <li>General Changes + <ul> + <li>Fixed a bug where there was a misspelling within a code comment in the index.php file.</li> + <li>Added Session Class userdata to the output profiler. Additionally, added a show/hide toggle on HTTP Headers, Session Data and Config Variables.</li> + <li>Removed internal usage of the <samp>EXT</samp> constant.</li> + <li>Visual updates to the welcome_message view file and default error templates. Thanks to <a href="https://bitbucket.org/danijelb">danijelb</a> for the pull request.</li> + <li>Added "application/x-csv" to mimes.php.</li> + <li>Fixed a bug where <a href="libraries/email.html">Email library</a> attachments with a "." in the name would using invalid MIME-types.</li> + <li>Callback validation rules can now accept parameters like any other validation rule.</li> + </ul> + </li> + <li>Helpers + <ul> + <li>Added an optional third parameter to <samp>heading()</samp> which allows adding html attributes to the rendered heading tag.</li> + <li><kbd>form_open()</kbd> now only adds a hidden (Cross-site Reference Forgery) protection field when the form's action is internal and is set to the post method. (Reactor #165)</li> + <li>Re-worked <samp>plural()</samp> and <samp>singular()</samp> functions in the <a href="helpers/inflector_helper.html">Inflector helper</a> to support considerably more words.</li> + </ul> + </li> + <li>Libraries + <ul> + <li>Altered Session to use a longer match against the user_agent string. See upgrade notes if using database sessions.</li> + <li>Added <kbd>is_unique</kbd> to the <a href="libraries/form_validation.html">Form Validation library</a>.</li> + <li>Added <kbd>$this->db->set_dbprefix()</kbd> to the <a href="database/queries.html">Database Driver</a>.</li> + <li>Changed <kbd>$this->cart->insert()</kbd> in the <a href="libraries/cart.html">Cart Library</a> to return the Row ID if a single item was inserted successfully.</li> + <li>Added <kbd>$this->load->get_var()</kbd> to the <a href="libraries/loader.html">Loader library</a> to retrieve global vars set with <kbd>$this->load->view()</kbd> and <kbd>$this->load->vars()</kbd>.</li> + <li>Changed <kbd>$this->db->having()</kbd> to insert quotes using escape() rather than escape_str().</li> + </ul> + </li> +</ul> + +<h3>Bug fixes for 2.0.3</h3> +<ul> + <li>Added ENVIRONMENT to reserved constants. (Reactor #196)</li> + <li>Changed server check to ensure SCRIPT_NAME is defined. (Reactor #57)</li> + <li>Removed <samp>APPPATH.'third_party'</samp> from the packages autoloader to negate needless file stats if no packages exist or if the developer does not load any other packages by default.</li> + <li>Fixed a bug (Reactor #231) where Sessions Library database table example SQL did not contain an index on last_activity. See <a href="installation/upgrade_203.html">Upgrade Notes</a>.</li> + <li>Fixed a bug (Reactor #229) where the Sessions Library example SQL in the documentation contained incorrect SQL.</li> + <li>Fixed a bug (Core #340) where when passing in the second parameter to $this->db->select(), column names in subsequent queries would not be properly escaped.</li> + <li>Fixed issue #199 - Attributes passed as string does not include a space between it and the opening tag.</li> + <li>Fixed a bug where the method <kbd>$this->cart->total_items()</kbd> from <a href="libraries/cart.html">Cart Library</a> now returns the sum of the quantity of all items in the cart instead of your total count.</li> + <li>Fixed a bug where not setting 'null' when adding fields in db_forge for mysql and mysqli drivers would default to NULL instead of NOT NULL as the docs suggest.</li> + <li>Fixed a bug where using <kbd>$this->db->select_max()</kdb>, <kbd>$this->db->select_min()</kdb>, etc could throw notices. Thanks to w43l for the patch.</li> + <li>Replace checks for STDIN with php_sapi_name() == 'cli' which on the whole is more reliable. This should get parameters in crontab working.</li> +</ul> + +<h2>Version 2.0.2</h2> +<p>Release Date: April 7, 2011<br /> +Hg Tag: v2.0.2</p> + +<ul> + <li>General changes + <ul> + <li>The <a href="./libraries/security.html">Security library</a> was moved to the core and is now loaded automatically. Please remove your loading calls.</li> + <li>The CI_SHA class is now deprecated. All supported versions of PHP provide a <kbd>sha1()</kbd> function.</li> + <li><kbd>constants.php</kbd> will now be loaded from the environment folder if available.</li> + <li>Added language key error logging</li> + <li>Made Environment Support optional. Comment out or delete the constant to stop environment checks.</li> + <li>Added Environment Support for Hooks.</li> + <li>Added CI_ Prefix to the <a href="libraries/caching.html">Cache driver</a>.</li> + <li>Added <a href="./general/cli.html">CLI usage</a> documentation.</li> + </ul> + </li> + <li>Helpers + <ul> + <li>Removed the previously deprecated <kbd>dohash()</kbd> from the <a href="./helpers/security_helper.html">Security helper</a>; use <kbd>do_hash()</kbd> instead.</li> + <li>Changed the 'plural' function so that it doesn't ruin the captalization of your string. It also take into consideration acronyms which are all caps.</li> + </ul> + </li> + <li>Database + <ul> + <li><kbd>$this->db->count_all_results()</kbd> will now return an integer instead of a string.</li> + </ul> + </li> +</ul> + +<h3>Bug fixes for 2.0.2</h3> +<ul> + <li>Fixed a bug (Reactor #145) where the Output Library had parse_exec_vars set to protected.</li> + <li>Fixed a bug (Reactor #80) where is_really_writable would create an empty file when on Windows or with safe_mode enabled.</li> + <li>Fixed various bugs with User Guide.</li> + <li>Added is_cli_request() method to documentation for <a href="libraries/input.html">Input class</a>.</li> + <li>Added form_validation_lang entries for <kbd>decimal</kbd>, <kbd>less_than</kbd> and <kbd>greater_than</kbd>.</li> + <li><a href="https://bitbucket.org/ellislab/codeigniter-reactor/issue/153/escape-str-bug-in-mssql-driver">Fixed issue #153</a> Escape Str Bug in MSSQL driver.</li> + <li><a href="https://bitbucket.org/ellislab/codeigniter-reactor/issue/172/bug-in-chrome-and-form_open-in-201">Fixed issue #172</a> Google Chrome 11 posts incorrectly when action is empty.</li> + +</ul> + +<h2>Version 2.0.1</h2> +<p>Release Date: March 15, 2011<br /> +Hg Tag: v2.0.1</p> + +<ul> + <li>General changes + <ul> + <li>Added <kbd>$config['cookie_secure']</kbd> to the config file to allow requiring a secure (HTTPS) in order to set cookies.</li> + <li>Added the constant <kbd>CI_CORE</kbd> to help differentiate between Core: TRUE and Reactor: FALSE.</li> + <li>Added an <kbd>ENVIRONMENT</kbd> constant in index.php, which affects PHP error reporting settings, and optionally, + which configuration files are loaded (see below). Read more on the <a href="general/environments.html">Handling Environments</a> page.</li> + <li>Added support for <a href="libraries/config.html#environments">environment-specific</a> configuration files.</li> + </ul> + </li> + <li>Libraries + <ul> + <li>Added <kbd>decimal</kbd>, <kbd>less_than</kbd> and <kbd>greater_than</kbd> rules to the <a href="libraries/form_validation.html">Form validation Class</a>.</li> + <li><a href="libraries/input.html">Input Class</a> methods <kbd>post()</kbd> and <kbd>get()</kbd> will now return a full array if the first argument is not provided.</li> + <li>Secure cookies can now be made with the <kbd>set_cookie()</kbd> helper and <a href="libraries/input.html">Input Class</a> method.</li> + <li>Added <kbd>set_content_type()</kbd> to <a href="libraries/output.html">Output Class</a> to set the output <kbd>Content-Type</kbd> HTTP header based on a MIME Type or a config/mimes.php array key.</li> + <li><a href="libraries/output.html">Output Class</a> will now support method chaining.</li> + </ul> + </li> + <li>Helpers + <ul> + <li>Changed the logic for <kbd>form_open()</kbd> in <a href="helpers/form_helper.html">Form helper</a>. If no value is passed it will submit to the current URL.</li> + </ul> + </li> +</ul> + +<h3>Bug fixes for 2.0.1</h3> +<ul> + <li>CLI requests can now be run from any folder, not just when CD'ed next to index.php.</li> + <li>Fixed issue #41: Added audio/mp3 mime type to mp3.</li> + <li>Fixed a bug (Core #329) where the file caching driver referenced the incorrect cache directory.</li> + <li>Fixed a bug (Reactor #69) where the SHA1 library was named incorrectly.</li> +</ul> + +<h2>Version 2.0.0</h2> +<p>Release Date: January 28, 2011<br /> +Hg Tag: v2.0.0</p> + +<ul> + <li>General changes + <ul> + <li>PHP 4 support is removed. CodeIgniter now requires PHP 5.1.6.</li> + <li>Scaffolding, having been deprecated for a number of versions, has been removed.</li> + <li>Plugins have been removed, in favor of Helpers. The CAPTCHA plugin has been converted to a Helper and <a href="./helpers/captcha_helper.html">documented</a>. The JavaScript calendar plugin was removed due to the ready availability of great JavaScript calendars, particularly with jQuery.</li> + <li>Added new special Library type: <a href="./general/drivers.html">Drivers</a>.</li> + <li>Added full query-string support. See the config file for details.</li> + <li>Moved the application folder outside of the system folder.</li> + <li>Moved system/cache and system/logs directories to the application directory.</li> + <li>Added routing overrides to the main index.php file, enabling the normal routing to be overridden on a per "index" file basis.</li> + <li>Added the ability to set config values (or override config values) directly from data set in the main index.php file. This allows a single application to be used with multiple front controllers, each having its own config values.</li> + <li>Added <kbd>$config['directory_trigger']</kbd> to the config file so that a controller sub-directory can be specified when running _GET strings instead of URI segments.</li> + <li>Added ability to set "Package" paths - specific paths where the Loader and Config classes should try to look first for a requested file. This allows distribution of sub-applications with their own libraries, models, config files, etc. in a single "package" directory. See the <a href="libraries/loader.html">Loader class</a> documentation for more details.</li> + <li>In-development code is now hosted at <a href="http://bitbucket.org/ellislab/codeigniter-reactor/">BitBucket</a>.</li> + <li>Removed the deprecated Validation Class.</li> + <li>Added CI_ Prefix to all core classes.</li> + <li>Package paths can now be set in application/config/autoload.php.</li> + <li><a href="libraries/file_uploading.html">Upload library</a> file_name can now be set without an extension, the extension will be taken from the uploaded file instead of the given name.</li> + <li>In <a href="database/forge.html">Database Forge</a> the name can be omitted from $this->dbforge->modify_column()'s 2nd param if you aren't changing the name.</li> + <li><kbd>$config['base_url']</kbd> is now empty by default and will guess what it should be.</li> + <li>Enabled full Command Line Interface compatibility with <kbd>config['uri_protocol'] = 'CLI';</kbd>.</li> + </ul> + <li>Libraries + <ul> + <li>Added a <a href="libraries/caching.html">Cache driver</a> with APC, memcached, and file-based support.</li> + <li>Added <var>$prefix</var>, <var>$suffix</var> and <var>$first_url</var> properties to <a href="./libraries/pagination.html">Pagination library</a>.</li> + <li>Added the ability to suppress first, previous, next, last, and page links by setting their values to FALSE in the <a href="./libraries/pagination.html">Pagination library</a>.</li> + <li>Added <a href="./libraries/security.html">Security library</a>, which now contains the <dfn>xss_clean</dfn> function, <dfn>filename_security</dfn> function and other security related functions.</li> + <li>Added CSRF (Cross-site Reference Forgery) protection to the <a href="./libraries/security.html">Security library</a>.</li> + <li>Added <var>$parse_exec_vars</var> property to Output library.</li> + <li>Added ability to enable / disable individual sections of the <a href="general/profiling.html">Profiler</a></li> + <li>Added a wildcard option <kbd>$config['allowed_types'] = '*'</kbd> to the <a href="./libraries/file_uploading.html">File Uploading Class</a>.</li> + <li>Added an 'object' config variable to the XML-RPC Server library so that one can specify the object to look for requested methods, instead of assuming it is in the $CI superobject.</li> + <li>Added "is_object" into the list of unit tests capable of being run.</li> + <li>Table library will generate an empty cell with a blank string, or NULL value.</li> + <li>Added ability to set tag attributes for individual cells in the Table library</li> + <li>Added a <kbd>parse_string()</kbd> method to the <a href="libraries/parser.html">Parser Class</a>.</li> + <li>Added HTTP headers and Config information to the <a href="general/profiling.html">Profiler</a> output.</li> + <li>Added Chrome and Flock to the list of detectable browsers by <kbd>browser()</kbd> in the <a href="libraries/user_agent.html">User Agent Class</a>.</li> + <li>The <a href="libraries/unit_testing.html">Unit Test Class</a> now has an optional "notes" field available to it, and allows for discrete display of test result items using <kbd>$this->unit->set_test_items()</kbd>.</li> + <li>Added a <kbd>$xss_clean</kbd> class variable to the XMLRPC library, enabling control over the use of the Security library's <kbd>xss_clean()</kbd> method.</li> + <li>Added a <kbd>download()</kbd> method to the <a href="libraries/ftp.html">FTP library</a></li> + <li>Changed <kbd>do_xss_clean()</kbd> to return FALSE if the uploaded file fails XSS checks.</li> + <li>Added stripslashes() and trim()ing of double quotes from $_FILES type value to standardize input in Upload library.</li> + <li>Added a second parameter (boolean) to <kbd>$this->zip->read_dir('/path/to/directory', FALSE)</kbd> to remove the preceding trail of empty folders when creating a Zip archive. This example would contain a zip with "directory" and all of its contents.</li> + <li>Added ability in the Image Library to handle PNG transparency for resize operations when using the GD lib.</li> + <li>Modified the Session class to prevent use if no encryption key is set in the config file.</li> + <li>Added a new config item to the Session class <kbd>sess_expire_on_close</kbd> to allow sessions to auto-expire when the browser window is closed.</li> + <li>Improved performance of the Encryption library on servers where Mcrypt is available.</li> + <li>Changed the default encryption mode in the Encryption library to CBC.</li> + <li>Added an <kbd>encode_from_legacy()</kbd> method to provide a way to transition encrypted data from CodeIgniter 1.x to CodeIgniter 2.x. + Please see the <a href="./installation/upgrade_200.html">upgrade instructions</a> for details.</li> + <li>Altered Form_Validation library to allow for method chaining on <kbd>set_rules()</kbd>, <kbd>set_message()</kbd> and <kbd>set_error_delimiters()</kbd> functions.</li> + <li>Altered Email Library to allow for method chaining.</li> + <li>Added <kbd>request_headers()</kbd>, <kbd>get_request_header()</kbd> and <kbd>is_ajax_request()</kbd> to the input class.</li> + <li>Altered <a href="libraries/user_agent.html">User agent library</a> so that <kbd>is_browser()</kbd>, <kbd>is_mobile()</kbd> and <kbd>is_robot()</kbd> can optionally check for a specific browser or mobile device.</li> + <li>Altered <a href="libraries/input.html">Input library</a> so that <kbd>post()</kbd> and <kbd>get()</kbd> will return all POST and GET items (respectively) if there are no parameters passed in.</li> + </ul> + </li> + <li>Database + <ul> + <li><a href="./database/configuration.html">database configuration</a>.</li> + <li>Added <kbd>autoinit</kbd> value to <a href="./database/configuration.html">database configuration</a>.</li> + <li>Added <kbd>stricton</kbd> value to <a href="./database/configuration.html">database configuration</a>.</li> + <li>Added <kbd>database_exists()</kbd> to the <a href="database/utilities.html">Database Utilities Class</a>.</li> + <li>Semantic change to db->version() function to allow a list of exceptions for databases with functions to return version string instead of specially formed SQL queries. Currently this list only includes Oracle and SQLite.</li> + <li>Fixed a bug where driver specific table identifier protection could lead to malformed queries in the <kbd>field_data()</kbd> functions.</li> + <li>Fixed a bug where an undefined class variable was referenced in database drivers.</li> + <li>Modified the database errors to show the filename and line number of the problematic query.</li> + <li>Removed the following deprecated functions: orwhere, orlike, groupby, orhaving, orderby, getwhere.</li> + <li>Removed deprecated _drop_database() and _create_database() functions from the db utility drivers.</li> + <li>Improved dbforge create_table() function for the Postgres driver.</li> + </ul> + </li> + <li>Helpers + <ul> + <li>Added <kbd>convert_accented_characters()</kbd> function to <a href="./helpers/text_helper.html">text helper</a>.</li> + <li>Added accept-charset to the list of inserted attributes of <kbd>form_open()</kbd> in the <a href="helpers/form_helper.html">Form Helper</a>.</li> + <li>Deprecated the <kbd>dohash()</kbd> function in favour of <kbd>do_hash()</kbd> for naming consistency.</li> + <li>Non-backwards compatible change made to <kbd>get_dir_file_info()</kbd> in the <a href="helpers/file_helper.html">File Helper</a>. No longer recurses + by default so as to encourage responsible use (this function can cause server performance issues when used without caution).</li> + <li>Modified the second parameter of <kbd>directory_map()</kbd> in the <a href="helpers/directory_helper.html">Directory Helper</a> to accept an integer to specify recursion depth.</li> + <li>Modified <kbd>delete_files()</kbd> in the <a href="helpers/file_helper.html">File Helper</a> to return FALSE on failure.</li> + <li>Added an optional second parameter to <kbd>byte_format()</kbd> in the <a href="helpers/number_helper.html">Number Helper</a> to allow for decimal precision.</li> + <li>Added alpha, and sha1 string types to <kbd>random_string()</kbd> in the <a href="helpers/string_helper.html">String Helper</a>.</li> + <li>Modified <kbd>prep_url()</kbd> so as to not prepend http:// if the supplied string already has a scheme.</li> + <li>Modified <kbd>get_file_info</kbd> in the file helper, changing filectime() to filemtime() for dates.</li> + <li>Modified <kbd>smiley_js()</kbd> to add optional third parameter to return only the javascript with no script tags.</li> + <li>The <kbd>img()</kbd> function of the <a href="./helpers/html_helper.html">HTML helper</a> will now generate an empty string as an alt attribute if one is not provided.</li> + <li>If CSRF is enabled in the application config file, <kbd>form_open()</kbd> will automatically insert it as a hidden field.</li> + <li>Added <kbd>sanitize_filename()</kbd> into the <a href="./helpers/security_helper.html">Security helper</a>.</li> + <li>Added <kbd>ellipsize()</kbd> to the <a href="./helpers/text_helper.html">Text Helper</a></li> + <li>Added <kbd>elements()</kbd> to the <a href="./helpers/array_helper.html">Array Helper</a></li> + </ul> + </li> + <li>Other Changes + <ul> + <li>Added an optional second parameter to <kbd>show_404()</kbd> to disable logging.</li> + <li>Updated loader to automatically apply the sub-class prefix as an option when loading classes. Class names can be prefixed with the standard "CI_" or the same prefix as the subclass prefix, or no prefix at all.</li> + <li>Increased randomness with <kbd>is_really_writable()</kbd> to avoid file collisions when hundreds or thousands of requests occur at once.</li> + <li>Switched some DIR_WRITE_MODE constant uses to FILE_WRITE_MODE where files and not directories are being operated on.</li> + <li><kbd>get_mime_by_extension()</kbd> is now case insensitive.</li> + <li>Added "default" to the list <a href="general/reserved_names.html">Reserved Names</a>.</li> + <li>Added 'application/x-msdownload' for .exe files and ''application/x-gzip-compressed' for .tgz files to config/mimes.php.</li> + <li>Updated the output library to no longer compress output or send content-length headers if the server runs with zlib.output_compression enabled.</li> + <li>Eliminated a call to is_really_writable() on each request unless it is really needed (Output caching)</li> + <li>Documented <kbd>append_output()</kbd> in the <a href="libraries/output.html">Output Class</a>.</li> + <li>Documented a second argument in the <kbd>decode()</kbd> function for the <a href="libraries/encryption.html">Encryption Class</a>.</li> + <li>Documented db->close().</li> + <li>Updated the router to support a default route with any number of segments.</li> + <li>Moved _remove_invisible_characters() function from the <a href="libraries/security.html">Security Library</a> to <a href="general/common_functions.html">common functions.</a></li> + <li>Added audio/mpeg3 as a valid mime type for MP3.</li> + </ul> + </li> +</ul> + +<h3>Bug fixes for 2.0.0</h3> +<ul> + <li>Fixed a bug where you could not change the User-Agent when sending email.</li> + <li>Fixed a bug where the Output class would send incorrect cached output for controllers implementing their own <dfn>_output()</dfn> method.</li> + <li>Fixed a bug where a failed query would not have a saved query execution time causing errors in the Profiler</li> + <li>Fixed a bug that was writing log entries when multiple identical helpers and plugins were loaded.</li> + <li>Fixed assorted user guide typos or examples (#10693, #8951, #7825, #8660, #7883, #6771, #10656).</li> + <li>Fixed a language key in the profiler: "profiler_no_memory_usage" to "profiler_no_memory".</li> + <li>Fixed an error in the Zip library that didn't allow downloading on PHP 4 servers.</li> + <li>Fixed a bug in the Form Validation library where fields passed as rule parameters were not being translated (#9132)</li> + <li>Modified inflector helper to properly pluralize words that end in 'ch' or 'sh'</li> + <li>Fixed a bug in xss_clean() that was not allowing hyphens in query strings of submitted URLs.</li> + <li>Fixed bugs in get_dir_file_info() and get_file_info() in the File Helper with recursion, and file paths on Windows.</li> + <li>Fixed a bug where Active Record override parameter would not let you disable Active Record if it was enabled in your database config file.</li> + <li>Fixed a bug in reduce_double_slashes() in the String Helper to properly remove duplicate leading slashes (#7585)</li> + <li>Fixed a bug in values_parsing() of the XML-RPC library which prevented NULL variables typed as 'string' from being handled properly.</li> + <li>Fixed a bug were form_open_multipart() didn't accept string attribute arguments (#10930).</li> + <li>Fixed a bug (#10470) where <kdb>get_mime_by_extension()</kbd> was case sensitive.</li> + <li>Fixed a bug where some error messages for the SQLite and Oracle drivers would not display.</li> + <li>Fixed a bug where files created with the Zip Library would result in file creation dates of 1980.</li> + <li>Fixed a bug in the Session library that would result in PHP error when attempting to store values with objects.</li> + <li>Fixed a bug where extending the Controller class would result in a fatal PHP error.</li> + <li>Fixed a PHP Strict Standards Error in the index.php file.</li> + <li>Fixed a bug where getimagesize() was being needlessly checked on non-image files in is_allowed_type().</li> + <li>Fixed a bug in the Encryption library where an empty key was not triggering an error.</li> + <li>Fixed a bug in the Email library where CC and BCC recipients were not reset when using the clear() method (#109).</li> + <li>Fixed a bug in the URL Helper where prep_url() could cause a PHP error on PHP versions &lt; 5.1.2.</li> + <li>Added a log message in core/output if the cache directory config value was not found.</li> + <li>Fixed a bug where multiple libraries could not be loaded by passing an array to load-&gt;library()</li> + <li>Fixed a bug in the html helper where too much white space was rendered between the src and alt tags in the img() function.</li> + <li>Fixed a bug in the profilers _compile_queries() function.</li> + <li>Fixed a bug in the date helper where the DATE_ISO8601 variable was returning an incorrectly formatted date string.</li> +</ul> + +<h2>Version 1.7.2</h2> +<p>Release Date: September 11, 2009<br /> +Hg Tag: v1.7.2</p> + +<ul> + <li>Libraries + <ul> + <li>Added a new <a href="libraries/cart.html">Cart Class</a>.</li> + <li>Added the ability to pass $config['file_name'] for the <a href="libraries/file_uploading.html">File Uploading Class</a> and rename the uploaded file.</li> + <li>Changed order of listed user-agents so Safari would more accurately report itself. (#6844)</li> + </ul> + </li> + <li>Database + <ul> + <li>Switched from using gettype() in escape() to is_* methods, since future PHP versions might change its output.</li> + <li>Updated all database drivers to handle arrays in escape_str()</li> + <li>Added escape_like_str() method for escaping strings to be used in LIKE conditions</li> + <li>Updated Active Record to utilize the new LIKE escaping mechanism.</li> + <li>Added reconnect() method to DB drivers to try to keep alive / reestablish a connection after a long idle.</li> + <li>Modified MSSQL driver to use mssql_get_last_message() for error messages.</li> + </ul> + </li> + <li>Helpers + <ul> + <li>Added <kbd>form_multiselect()</kbd> to the <a href="helpers/form_helper.html">Form helper</a>.</li> + <li>Modified <kbd>form_hidden()</kbd> in the <a href="helpers/form_helper.html">Form helper</a> to accept multi-dimensional arrays.</li> + <li>Modified <kbd>form_prep()</kbd> in the <a href="helpers/form_helper.html">Form helper</a> to keep track of prepped fields to avoid multiple prep/mutation from subsequent calls which can occur when using Form Validation + and form helper functions to output form fields.</li> + <li>Modified <kbd>directory_map()</kbd> in the <a href="helpers/directory_helper.html">Directory helper</a> to allow the inclusion of hidden files, and to return FALSE on failure to read directory.</li> + <li>Modified the <a href="helpers/smiley_helper.html">Smiley helper</a> to work with multiple fields and insert the smiley at the last known cursor position.</li> + </ul> + </li> + <li>General + <ul> + <li>Compatible with PHP 5.3.0</li> + <li>Modified <a href="general/errors.html">show_error()</a> to allow sending of HTTP server response codes.</li> + <li>Modified <a href="general/errors.html">show_404()</a> to send 404 status code, removing non-CGI compatible header() statement from error_404.php template.</li> + <li>Added set_status_header() to the <a href="general/common_functions.html">Common functions<a> to allow use when the Output class is unavailable.</li> + <li>Added is_php() to <a href="general/common_functions.html">Common functions</a> to facilitate PHP version comparisons.</p> + <li>Added 2 CodeIgniter "cheatsheets" (thanks to DesignFellow.com for this contribution).</li> + </ul> + </li> +</ul> + +<h3>Bug fixes for 1.7.2</h3> +<ul> + <li>Fixed assorted user guide typos or examples (#6743, #7214, #7516, #7287, #7852, #8224, #8324, #8349).</li> + <li>Fixed a bug in the Form Validation library where multiple callbacks weren't working (#6110)</li> + <li>doctype helper default value was missing a "1".</li> + <li>Fixed a bug in the language class when outputting an error for an unfound file.</li> + <li>Fixed a bug in the Calendar library where the shortname was output for "May".</li> + <li>Fixed a bug with ORIG_PATH_INFO that was allowing URIs of just a slash through.</li> + <li>Fixed a fatal error in the Oracle and ODBC drivers (#6752)</li> + <li>Fixed a bug where xml_from_result() was checking for a nonexistent method.</li> + <li>Fixed a bug where Database Forge's add_column and modify_column were not looping through when sent multiple fields.</li> + <li>Fixed a bug where the File Helper was using '/' instead of the DIRECTORY_SEPARATOR constant.</li> + <li>Fixed a bug to prevent PHP errors when attempting to use sendmail on servers that have manually disabled the PHP popen() function.</li> + <li>Fixed a bug that would cause PHP errors in XML-RPC data if the PHP data type did not match the specified XML-RPC type.</li> + <li>Fixed a bug in the XML-RPC class with parsing dateTime.iso8601 data types.</li> + <li>Fixed a case sensitive string replacement in xss_clean()</li> + <li>Fixed a bug in form_textarea() where form data was not prepped correctly.</li> + <li>Fixed a bug in form_prep() causing it to not preserve entities in the user's original input when called back into a form element</li> + <li>Fixed a bug in _protect_identifiers() where the swap prefix ($swap_pre) was not being observed.</li> + <li>Fixed a bug where the 400 status header sent with the 'disallowed URI characters' was not compatible with CGI environments.</li> + <li>Fixed a bug in the typography class where heading tags could have paragraph tags inserted when using auto_typography().</li> +</ul> + +<h2>Version 1.7.1</h2> +<p>Release Date: February 10, 2009<br /> +Hg Tag: 1.7.1</p> + +<ul> + <li>Libraries + <ul> + <li>Fixed an arbitrary script execution security flaw (#6068) in the Form Validation library (thanks to hkk)</li> + <li>Changed default current page indicator in the Pagination library to use &lt;strong&gt; instead of &lt;b&gt;</li> + <li>A "HTTP/1.1 400 Bad Request" header is now sent when disallowed characters are encountered.</li> + <li>Added &lt;big&gt;, &lt;small&gt;, &lt;q&gt;, and &lt;tt&gt; to the Typography parser's inline elements.</li> + <li>Added more accurate error reporting for the Email library when using sendmail.</li> + <li>Removed a strict type check from the <kbd>rotate()</kbd> function of the <a href="libraries/image_lib.html">Image Manipulation Class</a>.</li> + <li>Added enhanced error checking in file saving in the Image library when using the GD lib.</li> + <li>Added an additional newline between multipart email headers and the MIME message text for better compatibility with a variety of MUAs.</li> + <li>Made modest improvements to efficiency and accuracy of explode_name() in the Image lib.</li> + </ul> + </li> + <li>Database + <ul> + <li>Added where_in to the list of expected arguments received by <kbd>delete()</kbd>.</li> + </ul> + </li> + <li>Helpers + <ul> + <li>Added the ability to have optgroups in <kbd>form_dropdown()</kbd> within the <a href="helpers/form_helper.html">form helper</a>.</li> + <li>Added a doctype() function to the <a href="helpers/html_helper.html">HTML helper</a>.</li> + <li>Added ability to force lowercase for <kbd>url_title()</kbd> in the <a href="helpers/url_helper.html">URL helper</a>.</li> + <li>Changed the default "type" of <kbd>form_button()</kbd> to "button" from "submit" in the <a href="helpers/form_helper.html">form helper</a>.</li> + <li>Changed redirect() in the URL helper to allow redirections to URLs outside of the CI site.</li> + <li>Updated get_cookie() to try to fetch the cookie using the global cookie prefix if the requested cookie name doesn't exist.</li> + </ul> + </li> + <li>Other Changes + <ul> + <li>Improved security in <kbd>xss_clean()</kbd> to help prevent attacks targeting Internet Explorer.</li> + <li>Added 'application/msexcel' to config/mimes.php for .xls files.</li> + <li>Added 'proxy_ips' config item to whitelist reverse proxy servers from which to trust the HTTP_X_FORWARDED_FOR header to + to determine the visitor's IP address.</li> + <li>Improved accuracy of Upload::is_allowed_filetype() for images (#6715)</li> + </ul> + </li> +</ul> + +<h3>Bug fixes for 1.7.1</h3> +<ul> + <li>Database + <ul> + <li>Fixed a bug when doing 'random' on order_by() (#5706).</li> + <li>Fixed a bug where adding a primary key through Forge could fail (#5731).</li> + <li>Fixed a bug when using DB cache on multiple databases (#5737).</li> + <li>Fixed a bug where TRUNCATE was not considered a "write" query (#6619).</li> + <li>Fixed a bug where csv_from_result() was checking for a nonexistent method.</li> + <li>Fixed a bug _protect_identifiers() where it was improperly removing all pipe symbols from items</li> + </ul> + </li> + <li>Fixed assorted user guide typos or examples (#5998, #6093, #6259, #6339, #6432, #6521).</li> + <li>Fixed a bug in the MySQLi driver when no port is specified</li> + <li>Fixed a bug (#5702), in which the field label was not being fetched properly, when "matching" one field to another.</li> + <li>Fixed a bug in which identifers were not being escaped properly when reserved characters were used.</li> + <li>Fixed a bug with the regular expression used to protect submitted paragraph tags in auto typography.</li> + <li>Fixed a bug where double dashes within tag attributes were being converted to em dash entities.</li> + <li>Fixed a bug where double spaces within tag attributes were being converted to non-breaking space entities.</li> + <li>Fixed some accuracy issues with curly quotes in Typography::format_characters()</li> + <li>Changed a few docblock comments to reflect actual return values.</li> + <li>Fixed a bug with high ascii characters in subject and from email headers.</li> + <li>Fixed a bug in xss_clean() where whitespace following a validated character entity would not be preserved.</li> + <li>Fixed a bug where HTML comments and &lt;pre&gt; tags were being parsed in Typography::auto_typography().</li> + <li>Fixed a bug with non-breaking space cleanup in Typography::auto_typography().</li> + <li>Fixed a bug in database escaping where a compound statement (ie: SUM()) wasn't handled correctly with database prefixes.</li> + <li>Fixed a bug when an opening quote is preceded by a paragraph tag and immediately followed by another tag.</li> + <li>Fixed a bug in the Text Helper affecting some locales where word_censor() would not work on words beginning or ending with an accented character.</li> + <li>Fixed a bug in the Text Helper character limiter where the provided limit intersects the last word of the string.</li> + <li>Fixed a bug (#6342) with plural() in the Inflection helper with words ending in "y".</li> + <li>Fixed bug (#6517) where Routed URI segments returned by URI::rsegment() method were incorrect for the default controller.</li> + <li>Fixed a bug (#6706) in the Security Helper where xss_clean() was using a deprecated second argument.</li> + <li>Fixed a bug in the URL helper url_title() function where trailing periods were allowed at the end of a URL.</li> + <li>Fixed a bug (#6669) in the Email class when CRLF's are used for the newline character with headers when used with the "mail" protocol.</li> + <li>Fixed a bug (#6500) where URI::A_filter_uri() was exit()ing an error instead of using show_error().</li> + <li>Fixed a bug (#6592) in the File Helper where get_dir_file_info() where recursion was not occurring properly.</li> + <li>Tweaked Typography::auto_typography() for some edge-cases.</li> +</ul> + + +<h2>Version 1.7</h2> +<p>Release Date: October 23, 2008<br /> +Hg Tag: 1.7.0</p> + +<ul> + <li>Libraries + <ul> + <li>Added a new <a href="libraries/form_validation.html">Form Validation Class</a>. It simplifies setting rules and field names, supports arrays as field names, allows groups of validation rules to be saved in a config file, and adds some helper functions for use in view files. <strong>Please note that the old Validation class is now deprecated</strong>. We will leave it in the library folder for some time so that existing applications that use it will not break, but you are encouraged to migrate to the new version.</li> + <li>Updated the <a href="libraries/sessions.html">Sessions class</a> so that any custom data being saved gets stored to a database rather than the session cookie (assuming you are using a database to store session data), permitting much more data to be saved.</li> + <li>Added the ability to store libraries in subdirectories within either the main "libraries" or the local application "libraries" folder. Please see the <a href="libraries/loader.html">Loader class</a> for more info.</li> + <li>Added the ability to assign library objects to your own variable names when you use <kbd>$this->load->library()</kbd>. Please see the <a href="libraries/loader.html">Loader class</a> for more info.</li> + <li>Added controller class/method info to <a href="general/profiling.html">Profiler class</a> and support for multiple database connections.</li> + <li>Improved the "auto typography" feature and moved it out of the helper into its own <a href="libraries/typography.html">Typography Class</a>.</li> + <li>Improved performance and accuracy of <kbd>xss_clean()</kbd>, including reduction of false positives on image/file tests.</li> + <li>Improved <a href="./libraries/parser.html">Parser class</a> to allow multiple calls to the parse() function. The output of each is appended in the output.</li> + <li>Added <dfn>max_filename</dfn> option to set a file name length limit in the <a href="libraries/file_uploading.html">File Upload Class</a>.</li> + <li>Added <dfn>set_status_header()</dfn> function to <a href="libraries/output.html">Output class</a>.</li> + <li>Modified <a href="libraries/pagination.html">Pagination</a> class to only output the "First" link when the link for page one would not be shown.</li> + <li>Added support for mb_strlen in the <a href="libraries/form_validation.html">Form Validation</a> class so that multi-byte languages will calculate string lengths properly.</li> + </ul> + </li> + <li>Database + <ul> + <li>Improved Active Record class to allow full path column and table names: hostname.database.table.column. Also improved the alias handling.</li> + <li>Improved how table and column names are escaped and prefixed. It now honors full path names when adding prefixes and escaping.</li> + <li>Added Active Record caching feature to "update" and "delete" functions.</li> + <li>Added removal of non-printing control characters in <kbd>escape_str()</kbd> of DB drivers that do not have native PHP escaping mechanisms (mssql, oci8, odbc), to avoid potential SQL errors, and possible sources of SQL injection.</li> + <li>Added port support to MySQL, MySQLi, and MS SQL database drivers.</li> + <li>Added driver name variable in each DB driver, based on bug report #4436.</li> + </ul> + </li> + <li>Helpers + <ul> + <li>Added several new "setting" functions to the <a href="helpers/form_helper.html">Form helper</a> that allow POST data to be retrieved and set into forms. These are intended to be used on their own, or with the new <a href="libraries/form_validation.html">Form Validation Class</a>.</li> + <li>Added <kbd>current_url()</kbd> and uri_segments() to <a href="helpers/url_helper.html">URL helper</a>.</li> + <li>Altered <kbd>auto_link()</kbd> in the <a href="helpers/url_helper.html">URL helper</a> so that email addresses with "+" included will be linked.</li> + <li>Added <kbd>meta()</kbd> function to <a href="helpers/html_helper.html">HTML helper</a>.</li> + <li>Improved accuracy of calculations in <a href="helpers/number_helper.html">Number helper</a>.</li> + <li>Removed added newlines ("\n") from most form and html helper functions.</li> + <li>Tightened up validation in the <a href="helpers/date_helper.html">Date helper</a> function <kbd>human_to_unix()</kbd>, and eliminated the POSIX regex.</li> + <li>Updated <a href="helpers/date_helper.html">Date helper</a> to match the world's current time zones and offsets.</li> + <li>Modified url_title() in the <a href="helpers/url_helper.html">URL helper</a> to remove characters and digits that are part of + character entities, to allow dashes, underscores, and periods regardless of the $separator, and to allow uppercase characters.</li> + <li>Added support for arbitrary attributes in anchor_popup() of the <a href="helpers/url_helper.html">URL helper</a>.</li> + </ul> + </li> + <li>Other Changes + <ul> + <li>Added <a href="./general/styleguide.html">PHP Style Guide</a> to docs.</li> + <li>Added sanitization in <kbd>xss_clean()</kbd> for a deprecated HTML tag that could be abused in user input in Internet Explorer.</li> + <li>Added a few openxml document mime types, and an additional mobile agent to mimes.php and user_agents.php respectively.</li> + <li>Added a file lock check during caching, before trying to write to the file.</li> + <li>Modified Cookie key cleaning to unset a few troublesome key names that can be present in certain environments, preventing CI from halting execution.</li> + <li>Changed the output of the profiler to use style attribute rather than clear, and added the id "codeigniter_profiler" to the container div.</li> + </ul> + </li> +</ul> + +<h3>Bug fixes for 1.7.0</h3> +<ul> + <li>Fixed bug in <kbd>xss_clean()</kbd> that could remove some desirable tag attributes.</li> + <li>Fixed assorted user guide typos or examples (#4807, #4812, #4840, #4862, #4864, #4899, #4930, #5006, #5071, #5158, #5229, #5254, #5351).</li> + <li>Fixed an edit from 1.6.3 that made the $robots array in user_agents.php go poof.</li> + <li>Fixed a bug in the <a href="libraries/email.html">Email library</a> with quoted-printable encoding improperly encoding space and tab characters.</li> + <li>Modified XSS sanitization to no longer add semicolons after &amp;[single letter], such as in M&amp;M's, B&amp;B, etc.</li> + <li>Modified XSS sanitization to no longer strip XHTML image tags of closing slashes.</li> + <li>Fixed a bug in the Session class when database sessions are used where upon session update all userdata would be errantly written to the session cookie.</li> + <li>Fixed a bug (#4536) in backups with the MySQL driver where some legacy code was causing certain characters to be double escaped.</li> + <li>Fixed a routing bug (#4661) that occurred when the default route pointed to a subfolder.</li> + <li>Fixed the spelling of "Dhaka" in the <kbd>timezone_menu()</kbd> function of the <a href="helpers/date_helper.html">Date helper.</a></li> + <li>Fixed the spelling of "raspberry" in config/smileys.php.</li> + <li>Fixed incorrect parenthesis in <kbd>form_open()</kbd> function (#5135).</li> + <li>Fixed a bug that was ignoring case when comparing controller methods (#4560).</li> + <li>Fixed a bug (#4615) that was not setting SMTP authorization settings when using the initialize function.</li> + <li>Fixed a bug in <kbd>highlight_code()</kbd> in the <a href="helpers/text_helper.html">Text helper</a> that would leave a stray &lt;/span&gt; in certain cases.</li> + <li>Fixed Oracle bug (#3306) that was preventing multiple queries in one action.</li> + <li>Fixed ODBC bug that was ignoring connection params due to its use of a constructor.</li> + <li>Fixed a DB driver bug with num_rows() that would cause an error with the Oracle driver.</li> + <li>Fixed MS SQL bug (#4915). Added brackets around database name in MS SQL driver when selecting the database, in the event that reserved characters are used in the name.</li> + <li>Fixed a DB caching bug (4718) in which the path was incorrect when no URI segments were present.</li> + <li>Fixed Image_lib class bug #4562. A path was not defined for NetPBM.</li> + <li>Fixed Image_lib class bug #4532. When cropping an image with identical height/width settings on output, a copy is made.</li> + <li>Fixed DB_driver bug (4900), in which a database error was not being logged correctly.</li> + <li>Fixed DB backup bug in which field names were not being escaped.</li> + <li>Fixed a DB Active Record caching bug in which multiple calls to cached data were not being honored.</li> + <li>Fixed a bug in the Session class that was disallowing slashes in the serialized array.</li> + <li>Fixed a Form Validation bug in which the "isset" error message was being trigged by the "required" rule.</li> + <li>Fixed a spelling error in a Loader error message.</li> + <li>Fixed a bug (5050) with IP validation with empty segments.</li> + <li>Fixed a bug in which the parser was being greedy if multiple identical sets of tags were encountered.</li> +</ul> + +<h2>Version 1.6.3</h2> +<p>Release Date: June 26, 2008<br /> +Hg Tag: v1.6.3</p> + +<p>Version 1.6.3 is a security and maintenance release and is recommended for all users.</p> +<ul> + <li>Database + <ul> + <li>Modified MySQL/MySQLi Forge class to give explicit names to keys</li> + <li>Added ability to set multiple column non-primary keys to the <a href="database/forge.html">Forge class</a></li> + <li>Added ability to set additional database config values in <a href="database/connecting.html">DSN connections</a> via the query string.</li> + </ul> + </li> + <li>Libraries + <ul> + <li>Set the mime type check in the <a href="libraries/file_uploading.html">Upload class</a> to reference the global mimes variable.</li> + <li>Added support for query strings to the <a href="libraries/pagination.html">Pagination class</a>, automatically detected or explicitly declared.</li> + <li>Added <kbd>get_post()</kbd> to the <a href="libraries/input.html">Input class</a>.</li> + <li>Documented <kbd>get()</kbd> in the <a href="libraries/input.html">Input class</a>.</li> + <li>Added the ability to automatically output language items as form labels in the <a href="libraries/language.html">Language class</a>.</li> + </ul> + </li> + <li>Helpers + <ul> + <li>Added a <a href="helpers/language_helper.html">Language helper</a>.</li> + <li>Added a <a href="helpers/number_helper.html">Number helper</a>.</li> + <li><a href="helpers/form_helper.html">Form helper</a> refactored to allow <kbd>form_open()</kbd> and <kbd>form_fieldset()</kbd> to accept arrays or strings as arguments.</li> + </ul> + </li> + <li>Other changes + <ul> + <li>Improved security in <kbd>xss_clean()</kbd>.</li> + <li>Removed an unused Router reference in <kbd>_display_cache()</kbd>.</li> + <li>Added ability to <a href="libraries/input.html">use xss_clean() to test images</a> for XSS, useful for upload security.</li> + <li>Considerably expanded list of mobile user-agents in config/user_agents.php.</li> + <li>Charset information in the userguide has been moved above title for internationalization purposes (#4614).</li> + <li>Added &quot;Using Associative Arrays In a Request Parameter&quot; example to the <a href="libraries/xmlrpc.html">XMLRPC userguide page</a>.</li> + <li>Removed maxlength and size as automatically added attributes of form_input() in the <a href="helpers/form_helper.html">form helper</a>.</li> + <li>Documented the language file use of <kbd>byte_format()</kbd> in the <a href="helpers/number_helper.html">number helper</a>.</li> + </ul> + </li> +</ul> + + +<h3>Bug fixes for 1.6.3</h3> + +<ul> + <li>Added a language key for valid_emails in validation_lang.php.</li> + <li>Amended fixes for bug (#3419) with parsing DSN database connections.</li> + <li>Moved the <kbd>_has_operators()</kbd> function (#4535) into DB_driver from DB_active_rec.</li> + <li>Fixed a syntax error in upload_lang.php.</li> + <li>Fixed a bug (#4542) with a regular expression in the Image library.</li> + <li>Fixed a bug (#4561) where <kbd>orhaving()</kbd> wasn't properly passing values.</li> + <li>Removed some unused variables from the code (#4563).</li> + <li>Fixed a bug where <kbd>having()</kbd> was not adding an = into the statement (#4568).</li> + <li>Fixed assorted user guide typos or examples (#4574, #4706).</li> + <li>Added quoted-printable headers to Email class when the multi-part override is used.</li> + <li>Fixed a double opening &lt;p&gt; tag in the index pages of each system directory.</li> +</ul> + +<h2>Version 1.6.2</h2> +<p>Release Date: May 13, 2008<br /> +Hg Tag: 1.6.2</p> +<ul> + <li>Active Record + <ul> + <li>Added the ability to prevent escaping in <kbd>having()</kbd> clauses.</li> + <li>Added <kbd>rename_table()</kbd> into <a href="./database/forge.html">DBForge</a>.</li> + <li>Fixed a bug that wasn't allowing escaping to be turned off if the value of a query was NULL.</li> + <li>DB Forge is now assigned to any models that exist after loading (#3457).</li> + </ul> + </li> + <li>Database + <ul> + <li>Added <a href="./database/transactions.html">Strict Mode</a> to database transactions.</li> + <li>Escape behaviour in where() clauses has changed; values in those with the &quot;FALSE&quot; argument are no longer escaped (ie: quoted).</li> + </ul> + </li> + <li>Config + <ul> + <li>Added 'application/vnd.ms-powerpoint' to list of mime types.</li> + <li>Added 'audio/mpg' to list of mime types.</li> + <li>Added new user-modifiable file constants.php containing file mode and fopen constants.</li> + <li>Added the ability to set CRLF settings via config in the <a href="libraries/email.html">Email</a> class.</li> + </ul> + </li> + <li>Libraries + <ul> + <li>Added increased security for filename handling in the Upload library.</li> + <li>Added increased security for sessions for client-side data tampering.</li> + <li>The MySQLi forge class is now in sync with MySQL forge. </li> + <li>Added the ability to set CRLF settings via config in the <a href="libraries/email.html">Email</a> class.</li> + <li><a href="libraries/unit_testing.html">Unit Testing</a> results are now colour coded, and a change was made to the default template of results.</li> + <li>Added a valid_emails rule to the Validation class.</li> + <li>The <a href="libraries/zip.html">Zip class</a> now exits within <kbd>download()</kbd>.</li> + <li>The <a href="libraries/zip.html">Zip class</a> has undergone a substantial re-write for speed and clarity (thanks stanleyxu for the hard work and code contribution in bug report #3425!)</li> + </ul> + </li> + <li>Helpers + <ul> + <li>Added a <a href="helpers/compatibility_helper.html">Compatibility Helper</a> for using some common PHP 5 functions safely in applications that might run on PHP 4 servers (thanks Seppo for the hard work and code contribution!)</li> + <li>Added <kbd>form_button()</kbd> in the <a href="helpers/form_helper.html">Form helper</a>.</li> + <li>Changed the <kbd>radio()</kbd> and <kbd>checkbox()</kbd> functions to default to not checked by default.</li> + <li>Added the ability to include an optional HTTP Response Code in the <kbd>redirect()</kbd> function of the <a href="helpers/url_helper.html">URL Helper</a>.</li> + <li>Modified <kbd>img()</kbd> in the <a href="helpers/html_helper.html">HTML Helper</a> to remove an unneeded space (#4208).</li> + <li>Modified <kbd>anchor()</kbd> in the <a href="helpers/url_helper.html">URL helper</a> to no longer add a default title= attribute (#4209).</li> + <li>The <a href="helpers/download_helper.html">Download helper</a> now exits within <kbd>force_download()</kbd>.</li> + <li>Added <kbd>get_dir_file_info()</kbd>, <kbd>get_file_info()</kbd>, and <kbd>get_mime_by_extension()</kbd> to the <a href="helpers/file_helper.html">File Helper</a>.</li> + <li>Added <kbd>symbolic_permissions()</kbd> and <kbd>octal_permissions()</kbd> to the <a href='helpers/file_helper.html'>File helper</a>.</li> + </ul> + </li> + <li>Plugins + <ul> + <li>Modified captcha generation to first look for the function imagecreatetruecolor, and fallback to imagecreate if it isn't available (#4226).</li> + </ul> + </li> + <li>Other + Changes + <ul> + <li>Added ability for <a href="libraries/input.html">xss_clean()</a> to accept arrays.</li> + <li>Removed closing PHP tags from all PHP files to avoid accidental output and potential 'cannot modify headers' errors.</li> + <li>Removed &quot;scripts&quot; from the auto-load search path. Scripts were deprecated + in Version 1.4.1 (September 21, 2006). If you still need to use them for legacy reasons, they must now be manually loaded in each Controller.</li> + <li>Added a <a href="general/reserved_names.html">Reserved Names</a> page to the userguide, and migrated reserved controller names into it.</li> + <li>Added a <a href="general/common_functions.html">Common Functions</a> page to the userguide for globally available functions.</li> + <li>Improved security and performance of xss_clean().</li> + </ul> + </li> + </ul> + +<h3>Bugfixes for 1.6.2</h3> +<ul> + <li>Fixed a bug where SET queries were not being handled as "write" queries.</li> + <li>Fixed a bug (#3191) with ORIG_PATH_INFO URI parsing.</li> + <li>Fixed a bug in DB Forge, when inserting an id field (#3456).</li> + <li>Fixed a bug in the table library that could cause identically constructed rows to be dropped (#3459).</li> + <li>Fixed DB Driver and MySQLi result driver checking for resources instead of objects (#3461).</li> + <li>Fixed an AR_caching error where it wasn't tracking table aliases (#3463).</li> + <li>Fixed a bug in AR compiling, where select statements with arguments got incorrectly escaped (#3478).</li> + <li>Fixed an incorrect documentation of $this-&gt;load-&gt;language (#3520).</li> + <li>Fixed bugs (#3523, #4350) in get_filenames() with recursion and problems with Windows when $include_path is used.</li> + <li>Fixed a bug (#4153) in the XML-RPC class preventing dateTime.iso8601 from being used.</li> + <li>Fixed an AR bug with or_where_not_in() (#4171).</li> + <li>Fixed a bug with <a href="libraries/input.html">xss_clean()</a> that would add semicolons to GET URI variable strings.</li> + <li>Fixed a bug (#4206) in the Directory Helper where the directory resource was not being closed, and minor improvements.</li> + <li>Fixed a bug in the FTP library where delete_dir() was not working recursively (#4215).</li> + <li>Fixed a Validation bug when set_rules() is used with a non-array field name and rule (#4220).</li> + <li>Fixed a bug (#4223) where DB caching would not work for returned DB objects or multiple DB connections.</li> + <li>Fixed a bug in the Upload library that might output the same error twice (#4390).</li> + <li>Fixed an AR bug when joining with a table alias and table prefix (#4400).</li> + <li>Fixed a bug in the DB class testing the $params argument.</li> + <li>Fixed a bug in the Table library where the integer 0 in cell data would be displayed as a blank cell.</li> + <li>Fixed a bug in <kbd>link_tag()</kbd> of the <a href="helpers/url_helper.html">URL helper</a> where a key was passed instead of a value.</li> + <li>Fixed a bug in DB_result::row() that prevented it from returning individual fields with MySQL NULL values.</li> + <li>Fixed a bug where SMTP emails were not having dot transformation performed on lines that begin with a dot.</li> + <li>Fixed a bug in display_error() in the DB driver that was instantiating new Language and Exception objects, and not using the error heading.</li> + <li>Fixed a bug (#4413) where a URI containing slashes only e.g. 'http://example.com/index.php?//' would result in PHP errors</li> + <li>Fixed an array to string conversion error in the Validation library (#4425)</li> + <li>Fixed bug (#4451, #4299, #4339) where failed transactions will not rollback when debug mode is enabled.</li> + <li>Fixed a bug (#4506) with overlay_watermark() in the Image library preventing support for PNG-24s with alpha transparency</li> + <li>Fixed assorted user guide typos (#3453, #4364, #4379, #4399, #4408, #4412, #4448, #4488).</li> + </ul> + +<h2>Version 1.6.1</h2> +<p>Release Date: February 12, 2008<br /> +Hg Tag: 1.6.1</p> +<ul> + <li>Active Record + <ul> + <li>Added <a href="./database/active_record.html#caching">Active Record Caching</a>.</li> + <li>Made Active Record fully database-prefix aware.</li> + </ul> + </li> + <li>Database drivers + <ul> + <li>Added support for setting client character set and collation for MySQLi.</li> + </ul> + </li> + <li>Core Changes + <ul> + <li>Modified <kbd>xss_clean()</kbd> to be more intelligent with its handling of URL encoded strings.</li> + <li>Added $_SERVER, $_FILES, $_ENV, and $_SESSION to sanitization of globals.</li> + <li>Added a <a href="./helpers/path_helper.html">Path Helper</a>.</li> + <li>Simplified <kbd>_reindex_segments()</kbd> in the URI class.</li> + <li>Escaped the '-' in the default 'permitted_uri_chars' config item, to prevent errors if developers just try to add additional characters to the end of the default expression.</li> + <li>Modified method calling to controllers to show a 404 when a private or protected method is accessed via a URL.</li> + <li>Modified framework initiated 404s to log the controller and method for invalid requests.</li> + </ul> + </li> + <li>Helpers + <ul> + <li>Modified <kbd>get_filenames()</kbd> in the File Helper to return FALSE if the $source_dir is not readable.</li> + </ul> + </li> +</ul> + + +<h3>Bugfixes for 1.6.1</h3> +<ul> + <li>Deprecated is_numeric as a validation rule. Use of numeric and integer are preferred.</li> + <li>Fixed bug (#3379) in DBForge with SQLite for table creation.</li> + <li>Made Active Record fully database prefix aware (#3384).</li> + <li>Fixed a bug where DBForge was outputting invalid SQL in Postgres by adding brackets around the tables in FROM.</li> + <li>Changed the behaviour of Active Record's update() to make the WHERE clause optional (#3395).</li> + <li>Fixed a bug (#3396) where certain POST variables would cause a PHP warning.</li> + <li>Fixed a bug in query binding (#3402).</li> + <li>Changed order of SQL keywords in the Profiler $highlight array so OR would not be highlighted before ORDER BY.</li> + <li>Fixed a bug (#3404) where the MySQLi driver was testing if $this->conn_id was a resource instead of an object.</li> + <li>Fixed a bug (#3419) connecting to a database via a DSN string.</li> + <li>Fixed a bug (#3445) where the routed segment array was not re-indexed to begin with 1 when the default controller is used.</li> + <li>Fixed assorted user guide typos.</li> +</ul> + + + +<h2>Version 1.6.0</h2> +<p>Release Date: January 30, 2008 </p> +<ul> + <li>DBForge + <ul> + <li>Added <a href="./database/forge.html">DBForge</a> to the database tools.</li> + <li>Moved <kbd>create_database()</kbd> and <kbd>drop_database()</kbd> into <a href="./database/forge.html">DBForge</a>.</li> + <li>Added <kbd>add_field()</kbd>, <kbd>add_key()</kbd>, <kbd>create_table()</kbd>, <kbd>drop_table()</kbd>, <kbd>add_column()</kbd>, <kbd>drop_column()</kbd>, <kbd>modify_column()</kbd> into <a href="./database/forge.html">DBForge</a>.</li> + </ul> + </li> + + <li>Active Record + <ul> + <li>Added <kbd>protect_identifiers()</kbd> in <a href="./database/active_record.html">Active Record</a>.</li> + <li>All AR queries are backticked if appropriate to the database.</li> + <li>Added <kbd>where_in()</kbd>, <kbd>or_where_in()</kbd>, <kbd>where_not_in()</kbd>, <kbd>or_where_not_in()</kbd>, <kbd>not_like()</kbd> and <kbd>or_not_like()</kbd> to <a href="./database/active_record.html">Active Record</a>.</li> + <li>Added support for <kbd>limit()</kbd> into <kbd>update()</kbd> and <kbd>delete()</kbd> statements in <a href="./database/active_record.html">Active Record</a>.</li> + <li>Added <kbd>empty_table()</kbd> and <kbd>truncate_table()</kbd> to <a href="./database/active_record.html">Active Record</a>.</li> + <li>Added the ability to pass an array of tables to the <kbd>delete()</kbd> statement in <a href="./database/active_record.html">Active Record</a>.</li> + <li>Added <kbd>count_all_results()</kbd> function to <a href="./database/active_record.html">Active Record</a>.</li> + <li>Added <kbd>select_max()</kbd>, <kbd>select_min()</kbd>, <kbd>select_avg()</kbd> and <kbd>select_sum()</kbd> to <a href="./database/active_record.html">Active Record</a>.</li> + <li>Added the ability to use aliases with joins in <a href="./database/active_record.html">Active Record</a>.</li> + <li>Added a third parameter to Active Record's <kbd>like()</kbd> clause to control where the wildcard goes. </li> + <li>Added a third parameter to <kbd>set()</kbd> in <a href="./database/active_record.html">Active Record</a> that withholds escaping data.</li> + <li>Changed the behaviour of variables submitted to the where() clause with no values to auto set &quot;IS NULL&quot;</li> + </ul> + </li> + + <li>Other Database Related + <ul> + <li>MySQL driver now requires MySQL 4.1+</li> + <li>Added $this->DB->save_queries variable to DB driver, enabling queries to get saved or not. Previously they were always saved.</li> + <li>Added $this->db->dbprefix() to manually add database prefixes.</li> + <li>Added 'random' as an <kbd>order_by()</kbd> option , and removed &quot;rand()&quot; as a listed option as it was MySQL only.</li> + <li>Added a check for NULL fields in the MySQL database backup utility.</li> + <li>Added &quot;constrain_by_prefix&quot; parameter to db-&gt;list_table() function. If set to TRUE it will limit the result to only table names with the current prefix.</li> + <li>Deprecated from Active Record; <kbd>getwhere()</kbd> for <kbd>get_where()</kbd>; <kbd>groupby()</kbd> for <kbd>group_by()</kbd>; <kbd>havingor()</kbd> for <kbd>having_or()</kbd>; <kbd>orderby()</kbd> for <kbd>order_by</kbd>; <kbd>orwhere()</kbd> for <kbd>or_where()</kbd>; and <kbd>orlike()</kbd> for <kbd>or_like()</kbd>.</li> + <li>Modified <kbd>csv_from_result()</kbd> to output CSV data more in the spirit of basic rules of RFC 4180.</li> + <li>Added 'char_set' and 'dbcollat' database configuration settings, to explicitly set the client communication properly.</li> + <li>Removed 'active_r' configuration setting and replaced with a global $active_record setting, which is more + in harmony with the global nature of the behavior (#1834).</li> + </ul> + </li> + + <li>Core changes + <ul> + <li>Added ability to load multiple views, whose content will be appended to the output in the order loaded.</li> + <li>Added the ability to <a href="./general/autoloader.html">auto-load</a> <a href="./general/models.html">Models</a>.</li> + <li>Reorganized the URI and Routes classes for better clarity.</li> + <li>Added Compat.php to allow function overrides for older versions of PHP or PHP environments missing certain extensions / libraries</li> + <li>Added memory usage, GET, URI string data, and individual query execution time to Profiler output.</li> + <li>Deprecated Scaffolding.</li> + <li>Added is_really_writable() to Common.php to provide a cross-platform reliable method of testing file/folder writability.</li> + </ul> + </li> + + <li>Libraries + <ul> + <li>Changed the load protocol of Models to allow for extension.</li> + <li>Strengthened the Encryption library to help protect against man in the middle attacks when MCRYPT_MODE_CBC mode is used.</li> + <li>Added Flashdata variables, session_id regeneration and configurable session update times to the <a href="./libraries/sessions.html">Session class.</a></li> + <li>Removed 'last_visit' from the Session class.</li> + <li>Added a language entry for valid_ip validation error.</li> + <li>Modified prep_for_form() in the Validation class to accept arrays, adding support for POST array validation (via callbacks only)</li> + <li>Added an &quot;integer&quot; rule into the Validation library.</li> + <li>Added valid_base64() to the Validation library.</li> + <li>Documented clear() in the <a href="../libraries/image_lib.html">Image Processing</a> library.</li> + <li>Changed the behaviour of custom callbacks so that they no longer trigger the &quot;required&quot; rule. </li> + <li>Modified Upload class $_FILES error messages to be more precise.</li> + <li>Moved the safe mode and auth checks for the Email library into the constructor. </li> + <li>Modified variable names in _ci_load() method of Loader class to avoid conflicts with view variables.</li> + <li>Added a few additional mime type variations for CSV.</li> + <li>Enabled the 'system' methods for the XML-RPC Server library, except for 'system.multicall' which is still disabled.</li> + </ul> + </li> + + <li>Helpers &amp; Plugins + <ul> + <li>Added link_tag() to the <a href="./helpers/html_helper.html">HTML helper.</a></li> + <li>Added img() to the <a href="./helpers/html_helper.html">HTML helper.</a></li> + <li>Added ability to <a href="./general/helpers.html">"extend" Helpers</a>.</li> + <li>Added an <a href="./helpers/email_helper.html">email helper</a> into core helpers.</li> + <li>Added <kbd>strip_quotes()</kbd> function to <a href="./helpers/string_helper.html">string helper</a>.</li> + <li>Added <kbd>reduce_multiples()</kbd> function to <a href="./helpers/string_helper.html">string helper</a>.</li> + <li>Added <kbd>quotes_to_entities()</kbd> function to <a href="./helpers/string_helper.html">string helper</a>.</li> + <li>Added <kbd>form_fieldset()</kbd>, <kbd>form_fieldset_close()</kbd>, <kbd>form_label()</kbd>, and <kbd>form_reset()</kbd> function to <a href="./helpers/form_helper.html">form helper</a>.</li> + <li>Added support for external urls in <kbd>form_open()</kbd>.</li> + <li>Removed support for db_backup in MySQLi due to incompatible functions.</li> + <li>Javascript Calendar plugin now uses the months and days from the calendar language file, instead of hard-coded values, internationalizing it.</li> + </ul> + </li> + + + <li>Documentation Changes + <ul> + <li>Added <a href="./doc_style/index.html">Writing Documentation</a> section for the community to use in writing their own documentation.</li> + <li>Added titles to all user manual pages.</li> + <li>Added attributes into &lt;html&gt; of userguide for valid html.</li> + <li>Added <a href="http://codeigniter.com/user_guide/libraries/zip.html">Zip Encoding Class</a> to the table of contents of the userguide.</li> + <li>Moved part of the userguide menu javascript to an external file.</li> + <li>Documented <kbd>distinct()</kbd> in <a href="./database/active_record.html">Active Record</a>. </li> + <li>Documented the <kbd>timezones()</kbd> function in the <a href="./helpers/date_helper.html">Date Helper</a>.</li> + <li>Documented unset_userdata in the <a href="./libraries/sessions.html">Session class</a>.</li> + <li>Documented 2 config options to the <a href="./database/configuration.html">Database configuration</a> page.</li> + </ul> + </li> +</ul> + +<h3>Bug fixes for Version 1.6.0</h3> + +<ul> + <li>Fixed a bug (#1813) preventing using $CI->db in the same application with returned database objects.</li> + <li>Fixed a bug (#1842) where the $this->uri->rsegments array would not include the 'index' method if routed to the controller without an implicit method.</li> + <li>Fixed a bug (#1872) where word_limiter() was not retaining whitespace.</li> + <li>Fixed a bug (#1890) in csv_from_result() where content that included the delimiter would break the file.</li> + <li>Fixed a bug (#2542)in the clean_email() method of the Email class to allow for non-numeric / non-sequential array keys.</li> + <li>Fixed a bug (#2545) in <kbd>_html_entity_decode_callback()</kbd> when 'global_xss_filtering' is enabled.</li> + <li>Fixed a bug (#2668) in the <a href="./libraries/parser.html">parser class</a> where numeric data was ignored.</li> + <li>Fixed a bug (#2679) where the &quot;previous&quot; pagination link would get drawn on the first page.</li> + <li>Fixed a bug (#2702) in _object_to_array that broke some types of inserts and updates.</li> + <li>Fixed a bug (#2732) in the SQLite driver for PHP 4.</li> + <li>Fixed a bug (#2754) in Pagination to scan for non-positive num_links.</li> + <li>Fixed a bug (#2762) in the <a href="./libraries/sessions.html">Session library</a> where user agent matching would fail on user agents ending with a space. </li> + <li>Fixed a bug (#2784) $field_names[] vs $Ffield_names[] in postgres and sqlite drivers.</li> + <li>Fixed a bug (#2810) in the typography helper causing extraneous paragraph tags when string contains tags.</li> + <li>Fixed a bug (#2849) where arguments passed to a subfolder controller method would be incorrectly shifted, dropping the 3rd segment value.</li> + <li>Fixed a bug (#2858) which referenced a wrong variable in the Image class.</li> + <li>Fixed a bug (#2875)when loading plugin files as _plugin. and not _pi.</li> + <li>Fixed a bug (#2912) in <kbd>get_filenames()</kbd> in the <a href="./helpers/file_helper.html">File Helper </a>where the array wasn't cleared after each call.</li> + <li>Fixed a bug (#2974) in <kbd>highlight_phrase()</kbd> that caused an error with slashes.</li> + <li>Fixed a bug (#3003) in the Encryption Library to support modes other than MCRYPT_MODE_ECB</li> + <li>Fixed a bug (#3015) in the <a href="./libraries/user_agent.html">User Agent library</a> where more then 2 languages where not reported with languages().</li> + <li>Fixed a bug (#3017) in the <a href="./libraries/email.html">Email</a> library where some timezones were calculated incorrectly. </li> + <li>Fixed a bug (#3024) in which master_dim wasn't getting reset by clear() in the Image library.</li> + <li>Fixed a bug (#3156) in Text Helper highlight_code() causing PHP tags to be handled incorrectly.</li> + <li>Fixed a bug (#3166) that prevented num_rows from working in Oracle.</li> + <li>Fixed a bug (#3175) preventing certain libraries from working properly when autoloaded in PHP 4.</li> + <li>Fixed a bug (#3267) in the Typography Helper where unordered list was listed &quot;un.</li> + <li>Fixed a bug (#3268) where the Router could leave '/' as the path.</li> + <li>Fixed a bug (#3279) where the Email class was sending the wrong Content-Transfer-Encoding for some character sets.</li> + <li>Fixed a bug (#3284) where the rsegment array would not be set properly if the requested URI contained more segments than the routed URI.</li> + <li>Removed extraneous load of $CFG in _display_cache() of the Output class (#3285).</li> + <li>Removed an extraneous call to loading models (#3286).</li> + <li>Fixed a bug (#3310) with sanitization of globals in the Input class that could unset CI's global variables.</li> + <li>Fixed a bug (#3314) which would cause the top level path to be deleted in delete_files() of the File helper.</li> + <li>Fixed a bug (#3328) where the smiley helper might return an undefined variable.</li> + <li>Fixed a bug (#3330) in the FTP class where a comparison wasn't getting made.</li> + <li>Removed an unused parameter from Profiler (#3332).</li> + <li>Fixed a bug in database driver where num_rows property wasn't getting updated.</li> + <li>Fixed a bug in the <a href="./libraries/file_uploading.html">upload library</a> when allowed_files wasn't defined.</li> + <li>Fixed a bug in <kbd>word_wrap()</kbd> of the Text Helper that incorrectly referenced an object. </li> + <li>Fixed a bug in Validation where <kbd>valid_ip()</kbd> wasn't called properly.</li> + <li>Fixed a bug in Validation where individual error messages for checkboxes wasn't supported.</li> + <li>Fixed a bug in captcha calling an invalid PHP function.</li> + <li>Fixed a bug in the cookie helper "set_cookie" function. It was not honoring the config settings.</li> + <li>Fixed a bug that was making validation callbacks required even when not set as such.</li> + <li>Fixed a bug in the XML-RPC library so if a type is specified, a more intelligent decision is made as to the default type.</li> + <li>Fixed an example of comma-separated emails in the email library documentation.</li> + <li>Fixed an example in the Calendar library for Showing Next/Previous Month Links.</li> + <li>Fixed a typo in the database language file.</li> + <li>Fixed a typo in the image language file &quot;suppor&quot; to &quot;support&quot;.</li> + <li>Fixed an example for XML RPC.</li> + <li>Fixed an example of <kbd>accept_charset()</kbd> in the <a href="./libraries/user_agent.html">User Agent Library</a>.</li> + <li>Fixed a typo in the docblock comments that had CodeIgniter spelled CodeIgnitor.</li> + <li>Fixed a typo in the <a href="./helpers/string_helper.html">String Helper</a> (uniquid changed to uniqid).</li> + <li>Fixed typos in the email Language class (email_attachment_unredable, email_filed_smtp_login), and FTP Class (ftp_unable_to_remame).</li> + <li>Added a stripslashes() into the Upload Library.</li> + <li>Fixed a series of grammatical and spelling errors in the language files.</li> + <li>Fixed assorted user guide typos.</li> +</ul> +<h2>Version 1.5.4</h2> +<p>Release Date: July 12, 2007 </p> +<ul> + <li>Added <a href="./libraries/language.html">custom Language files</a> to the <a href="./general/autoloader.html">autoload</a> options. </li> + <li>Added stripslashes() to the _clean_input_data() function in the <a href="./libraries/input.html">Input class</a> when magic quotes is on so that data will always be un-slashed within the framework.</li> + <li>Added array to string into the <a href="general/profiling.html">profiler</a>.</li> + <li>Added some additional mime types in application/config/mimes.php.</li> + <li>Added filename_security() method to <a href="./libraries/input.html">Input library</a>.</li> + <li>Added some additional arguments to the <a href="./helpers/inflector_helper.html">Inflection helper</a> singular() to compensate for words ending in "s". Also added a force parameter to pluralize().</li> + <li>Added $config['charset'] to the config file. Default value is 'UTF-8', used in some string handling functions.</li> + <li>Fixed MSSQL insert_id().</li> + <li>Fixed a logic error in the DB trans_status() function. It was incorrectly returning TRUE on failure and FALSE on success.</li> + <li>Fixed a bug that was allowing multiple load attempts on extended classes.</li> + <li>Fixed a bug in the bootstrap file that was incorrectly attempting to discern the full server path even when it was explicity set by the user.</li> + <li>Fixed a bug in the escape_str() function in the MySQL driver.</li> + <li>Fixed a typo in the <a href="./libraries/calendar.html">Calendar library </a> </li> + <li>Fixed a typo in rpcs.php library</li> + <li>Fixed a bug in the <a href="./libraries/zip.html">Zip library</a>, providing PC Zip file compatibility with Mac OS X</li> + <li>Fixed a bug in router that was ignoring the scaffolding route for optimization </li> + <li>Fixed an IP validation bug.</li> + <li>Fixed a bug in display of POST keys in the <a href="./general/profiling.html">Profiler</a> output</li> + <li>Fixed a bug in display of queries with characters that would be interpreted as HTML in the <a href="./general/profiling.html">Profiler</a> output</li> + <li>Fixed a bug in display of Email class print debugger with characters that would be interpreted as HTML in the debugging output</li> + <li>Fixed a bug in the Content-Transfer-Encoding of HTML emails with the quoted-printable MIME type</li> + <li>Fixed a bug where one could unset certain PHP superglobals by setting them via GET or POST data</li> + <li>Fixed an undefined function error in the insert_id() function of the PostgreSQL driver</li> + <li>Fixed various doc typos. </li> + <li>Documented two functions from the <a href="./helpers/string_helper.html">String helper </a> that were missing from the user guide: trim_slashes() and reduce_double_slashes().</li> + <li>Docs now validate to XHTML 1 transitional</li> + <li>Updated the XSS Filtering to take into account the IE expression() ability and improved certain deletions to prevent possible exploits</li> + <li>Modified the Router so that when Query Strings are Enabled, the controller trigger and function trigger values are sanitized for filename include security.</li> + <li>Modified the is_image() method in the Upload library to take into account Windows IE 6/7 eccentricities when dealing with MIMEs</li> + <li>Modified XSS Cleaning routine to be more performance friendly and compatible with PHP 5.2's new PCRE backtrack and recursion limits.</li> + <li>Modified the <a href="./helpers/url_helper.html">URL Helper</a> to type cast the $title as a string in case a numeric value is supplied</li> + <li>Modified Form Helper form_dropdown() to type cast the keys and values of the options array as strings, allowing numeric values to be properly set as 'selected'</li> + <li>Deprecated the use if <kbd>is_numeric()</kbd> in various places since it allows periods. Due to compatibility problems with <kbd>ctype_digit()</kbd>, making it unreliable in some installations, the following regular expression was used instead: <kbd>preg_match("/[^0-9]/", $n)</kbd></li> + <li>Deprecated: APPVER has been deprecated and replaced with CI_VERSION for clarity. </li> +</ul> +<h2>Version 1.5.3</h2> +<p>Release Date: April 15, 2007 </p> +<ul> + <li>Added array to string into the profiler </li> + <li>Code Igniter references updated to CodeIgniter </li> + <li>pMachine references updated to EllisLab </li> + <li>Fixed a bug in the repeater function of <a href="./helpers/string_helper.html">string helper</a>. </li> + <li>Fixed a bug in ODBC driver </li> + <li>Fixed a bug in result_array() that was returning an empty array when no result is produced.</li> + <li>Fixed a bug in the redirect function of the <a href="./helpers/url_helper.html">url helper</a>. </li> + <li>Fixed an undefined variable in Loader </li> + <li>Fixed a version bug in the Postgres driver </li> + <li>Fixed a bug in the textarea function of the form helper for use with strings</li> + <li>Fixed doc typos. </li> +</ul> +<h2>Version 1.5.2</h2> +<p>Release Date: February 13, 2007 </p> +<ul> + <li>Added <a href="./installation/downloads.html#svn">subversion information</a> to the <a href="./installation/downloads.html">downloads</a> page. </li> + <li>Added support for captions in the <a href="./libraries/table.html">Table Library</a> </li> + <li>Fixed a bug in the <a href="./helpers/download_helper.html">download_helper</a> that was causing Internet Explorer to load rather than download </li> + <li>Fixed a bug in the Active Record Join function that was not taking table prefixes into consideration.</li> + <li>Removed unescaped variables in error messages of Input and Router classes</li> + <li>Fixed a bug in the Loader that was causing errors on Libraries loaded twice. A debug message is now silently made in the log. </li> + <li>Fixed a bug in the <a href="./helpers/form_helper.html">form helper</a> that gave textarea a value attribute </li> + <li>Fixed a bug in the <a href="./libraries/image_lib.php">Image Library</a> that was ignoring resizing the same size image </li> + <li>Fixed some doc typos.</li> +</ul> + + +<h2>Version 1.5.1</h2> +<p>Release Date: November 23, 2006</p> +<ul> + <li>Added support for submitting arrays of libraries in the $this-&gt;load-&gt;library function.</li> + <li>Added support for naming custom library files in lower or uppercase.</li> + <li>Fixed a bug related to output buffering.</li> + <li>Fixed a bug in the active record class that was not resetting query data after a completed query.</li> + <li>Fixed a bug that was suppressing errors in controllers.</li> + <li>Fixed a problem that can cause a loop to occur when the config file is missing.</li> + <li>Fixed a bug that occurred when multiple models were loaded with the third parameter set to TRUE.</li> + <li>Fixed an oversight that was not unsetting globals properly in the input sanitize function.</li> + <li>Fixed some bugs in the Oracle DB driver.</li> + <li>Fixed an incorrectly named variable in the MySQLi result driver.</li> + <li>Fixed some doc typos.</li> +</ul> +<h2>Version 1.5.0.1</h2> +<p>Release Date: October 31, 2006</p> +<ul> +<li>Fixed a problem in which duplicate attempts to load helpers and classes were not being stopped.</li> +<li>Fixed a bug in the word_wrap() helper function.</li> +<li>Fixed an invalid color Hex number in the Profiler class.</li> +<li>Fixed a corrupted image in the user guide.</li> +</ul> + + + +<h2>Version 1.5.0</h2> +<p>Release Date: October 30, 2006</p> + +<ul> +<li>Added <a href="./database/utilities.html">DB utility class</a>, permitting DB backups, CVS or XML files from DB results, and various other functions.</li> +<li>Added <a href="./database/caching.html">Database Caching Class</a>.</li> +<li>Added <a href="./database/transactions.html">transaction support</a> to the database classes.</li> +<li>Added <a href="./general/profiling.html">Profiler Class</a> which generates a report of Benchmark execution times, queries, and POST data at the bottom of your pages.</li> +<li>Added <a href="./libraries/user_agent.html">User Agent Library</a> which allows browsers, robots, and mobile devises to be identified.</li> +<li>Added <a href="./libraries/table.html">HTML Table Class</a> , enabling tables to be generated from arrays or database results.</li> +<li>Added <a href="./libraries/zip.html">Zip Encoding Library</a>.</li> +<li>Added <a href="./libraries/ftp.html">FTP Library</a>.</li> +<li>Added the ability to <a href="./general/creating_libraries.html">extend libraries</a> and <a href="./general/core_classes.html">extend core classes</a>, in addition to being able to replace them.</li> +<li>Added support for storing <a href="./general/models.html">models within sub-folders</a>.</li> +<li>Added <a href="./helpers/download_helper.html">Download Helper</a>.</li> +<li>Added <a href="./database/queries.html">simple_query()</a> function to the database classes</li> +<li>Added <a href="./helpers/date_helper.html">standard_date()</a> function to the Date Helper.</li> +<li>Added <a href="./database/results.html">$query->free_result()</a> to database class.</li> +<li>Added <a href="./database/fields.html">$query->list_fields()</a> function to database class</li> +<li>Added <a href="./database/helpers.html">$this->db->platform()</a> function</li> +<li>Added new <a href="./helpers/file_helper.html">File Helper</a>: get_filenames()</li> +<li>Added new helper: <a href="./helpers/smiley_helper.html">Smiley Helper</a></li> +<li>Added support for &lt;ul> and &lt;ol> lists in the <a href="./helpers/html_helper.html">HTML Helper</a></li> +<li>Added the ability to rewrite <a href="./general/alternative_php.html">short tags</a> on-the-fly, converting them to standard PHP statements, for those servers that do not support short tags. This allows the cleaner syntax to be used regardless of whether it's supported by the server.</li> +<li>Added the ability to <a href="./general/managing_apps.html">rename or relocate the "application" folder</a>.</li> +<li>Added more thorough initialization in the upload class so that all class variables are reset.</li> +<li>Added "is_numeric" to validation, which uses the native PHP is_numeric function.</li> +<li>Improved the URI handler to make it more reliable when the $config['uri_protocol'] item is set to AUTO.</li> +<li>Moved most of the functions in the Controller class into the Loader class, allowing fewer reserved function names for controllers when running under PHP 5.</li> +<li>Updated the DB Result class to return an empty array when $query->result() doesn't produce a result.</li> +<li>Updated the <dfn>input->cookie()</dfn> and <dfn>input->post()</dfn> functions in <a href="./libraries/input.html">Input Class</a> to permit arrays contained cookies that are arrays to be run through the XSS filter.</li> +<li>Documented three functions from the <a href="./libraries/validation.html">Validation class</a> that were missing from the user guide: set_select(), set_radio(), and set_checkbox().</li> +<li>Fixed a bug in the Email class related to SMTP Helo data.</li> +<li>Fixed a bug in the word wrapping helper and function in the email class.</li> +<li>Fixed a bug in the validation class.</li> +<li>Fixed a bug in the typography helper that was incorrectly wrapping block level elements in paragraph tags.</li> +<li>Fixed a problem in the form_prep() function that was double encoding entities.</li> +<li>Fixed a bug that affects some versions of PHP when output buffering is nested.</li> +<li>Fixed a bug that caused CI to stop working when the PHP magic __get() or __set() functions were used within models or controllers.</li> +<li>Fixed a pagination bug that was permitting negative values in the URL.</li> +<li>Fixed an oversight in which the Loader class was not allowed to be extended.</li> +<li>Changed <dfn>_get_config()</dfn> to <dfn>get_config()</dfn> since the function is not a private one.</li> +<li><strong>Deprecated "init" folder</strong>. Initialization happens automatically now. <a href="./general/creating_libraries.html">Please see documentation</a>.</li> +<li><strong>Deprecated</strong> $this->db->field_names() USE $this->db->list_fields()</li> +<li><strong>Deprecated</strong> the <dfn>$config['log_errors']</dfn> item from the config.php file. Instead, <dfn>$config['log_threshold']</dfn> can be set to "0" to turn it off.</li> +</ul> + + + + +<h2>Version 1.4.1</h2> +<p>Release Date: September 21, 2006</p> + +<ul> +<li>Added a new feature that passes URI segments directly to your function calls as parameters. See the <a href="./general/controllers.html">Controllers</a> page for more info.</li> +<li>Added support for a function named <dfn>_output()</dfn>, which when used in your controllers will received the final rendered output from the output class. More info in the <a href="controllers.html">Controllers</a> page.</li> +<li>Added several new functions in the <a href="./libraries/uri.html">URI Class</a> to let you retrieve and manipulate URI segments that have been re-routed using the <a href="routing.html">URI Routing</a> feature. Previously, the URI class did not permit you to access any re-routed URI segments, but now it does.</li> +<li>Added <a href="./libraries/output.html">$this->output->set_header()</a> function, which allows you to set server headers.</li> +<li>Updated plugins, helpers, and language classes to allow your <dfn>application</dfn> folder to contain its own plugins, helpers, and language folders. Previously they were always treated as global for your entire installation. If your application folder contains any of these resources they will be used <em>instead</em> the global ones.</li> +<li>Added <a href="./helpers/inflector_helper.html">Inflector helper</a>.</li> +<li>Added <dfn>element()</dfn> function in the <a href="./helpers/array_helper.html">array helper</a>.</li> +<li>Added <dfn>RAND()</dfn> to active record <dfn>orderby()</dfn> function.</li> +<li>Added <dfn>delete_cookie()</dfn> and <dfn>get_cookie()</dfn> to <a href="./helpers/cookie_helper.html">Cookie helper</a>, even though the input class has a cookie fetching function.</li> +<li>Added Oracle database driver (still undergoing testing so it might have some bugs).</li> +<li>Added the ability to combine pseudo-variables and php variables in the template parser class.</li> +<li>Added output compression option to the config file.</li> +<li>Removed the is_numeric test from the db->escape() function.</li> +<li>Fixed a MySQLi bug that was causing error messages not to contain proper error data.</li> +<li>Fixed a bug in the email class which was causing it to ignore explicitly set alternative headers.</li> +<li>Fixed a bug that was causing a PHP error when the Exceptions class was called within the get_config() function since it was causing problems.</li> +<li>Fixed an oversight in the cookie helper in which the config file cookie settings were not being honored.</li> +<li>Fixed an oversight in the upload class. An item mentioned in the 1.4 changelog was missing.</li> +<li>Added some code to allow email attachments to be reset when sending batches of email.</li> +<li>Deprecated the <dfn>application/scripts</dfn> folder. It will continue to work for legacy users, but it is recommended that you create your own +<a href="./general/libraries.html">libraries</a> or <a href="./general/models.html">models</a> instead. It was originally added before CI had user libraries or models, but it's not needed anymore.</li> +<li>Deprecated the <dfn>$autoload['core']</dfn> item from the <kbd>autoload.php</kbd> file. Instead, please now use: <kbd>$autoload['libraries']</kbd></li> +<li>Deprecated the following database functions: $this->db->smart_escape_str() and $this->db->fields().</li> +</ul> + + + +<h2>Version 1.4.0</h2> +<p>Release Date: September 17, 2006</p> + +<ul> +<li>Added <a href="./general/hooks.html">Hooks</a> feature, enabling you to tap into and modify the inner workings of the framework without hacking the core files.</li> +<li>Added the ability to organize controller files <a href="./general/controllers.html">into sub-folders</a>. Kudos to Marco for suggesting this (and the next two) feature.</li> +<li>Added regular expressions support for <a href="./general/routing.html">routing rules</a>.</li> +<li>Added the ability to <a href="./general/controllers.html">remap function calls</a> within your controllers.</li> +<li>Added the ability to <a href="./general/core_classes.html">replace core system classes</a> with your own classes.</li> +<li>Added support for % character in URL.</li> +<li>Added the ability to supply full URLs using the <a href="./helpers/url_helper.html">anchor()</a> helper function.</li> +<li>Added mode parameter to <a href="./helpers/file_helper.html">file_write()</a> helper.</li> +<li>Added support for changing the port number in the <a href="./database/configuration.html">Postgres driver</a>.</li> +<li>Moved the list of "allowed URI characters" out of the Router class and into the config file.</li> +<li>Moved the MIME type array out of the Upload class and into its own file in the applications/config/ folder.</li> +<li>Updated the Upload class to allow the upload field name to be set when calling <a href="./libraries/file_uploading.html">do_upload()</a>.</li> +<li>Updated the <a href="./libraries/config.html">Config Library</a> to be able to load config files silently, and to be able to assign config files to their own index (to avoid collisions if you use multiple config files).</li> +<li>Updated the URI Protocol code to allow more options so that URLs will work more reliably in different environments.</li> +<li>Updated the <dfn>form_open()</dfn> helper to allow the GET method to be used.</li> +<li>Updated the MySQLi <dfn>execute()</dfn> function with some code to help prevent lost connection errors.</li> +<li>Updated the SQLite Driver to check for object support before attempting to return results as objects. If unsupported it returns an array.</li> +<li>Updated the Models loader function to allow multiple loads of the same model.</li> +<li>Updated the MS SQL driver so that single quotes are escaped.</li> +<li>Updated the Postgres and ODBC drivers for better compatibility.</li> +<li>Removed a strtolower() call that was changing URL segments to lower case.</li> +<li>Removed some references that were interfering with PHP 4.4.1 compatibility.</li> +<li>Removed backticks from Postgres class since these are not needed.</li> +<li>Renamed <dfn>display()</dfn> to <dfn>_display()</dfn> in the Output class to make it clear that it's a private function.</li> +<li>Deprecated the hash() function due to a naming conflict with a native PHP function with the same name. Please use <kbd>dohash()</kbd> instead.</li> +<li>Fixed an bug that was preventing the input class from unsetting GET variables.</li> +<li>Fixed a router bug that was making it too greedy when matching end segments.</li> +<li>Fixed a bug that was preventing multiple discrete database calls.</li> +<li>Fixed a bug in which loading a language file was producing a "file contains no data" message.</li> +<li>Fixed a session bug caused by the XSS Filtering feature inadvertently changing the case of certain words.</li> +<li>Fixed some missing prefixes when using the database prefix feature.</li> +<li>Fixed a typo in the Calendar class (cal_november).</li> +<li>Fixed a bug in the <dfn>form_checkbox()</dfn> helper.</li> +<li>Fixed a bug that was allowing the second segment of the URI to be identical to the class name.</li> +<li>Fixed an evaluation bug in the database initialization function.</li> +<li>Fixed a minor bug in one of the error messages in the language class.</li> +<li>Fixed a bug in the date helper <dfn>timespan</dfn> function.</li> +<li>Fixed an undefined variable in the DB Driver class.</li> +<li>Fixed a bug in which dollar signs used as binding replacement values in the DB class would be treated as RegEx back-references.</li> +<li>Fixed a bug in the <dfn>set_hash()</dfn> function which was preventing MD5 from being used.</li> +<li>Fixed a couple bugs in the Unit Testing class.</li> +<li>Fixed an incorrectly named variable in the Validation class.</li> +<li>Fixed an incorrectly named variable in the URI class.</li> +<li>Fixed a bug in the config class that was preventing the base URL from being called properly.</li> +<li>Fixed a bug in the validation class that was not permitting callbacks if the form field was empty.</li> +<li>Fixed a problem that was preventing scaffolding from working properly with MySQLi.</li> +<li>Fixed some MS SQL bugs.</li> +<li>Fixed some doc typos.</li> +</ul> + + + +<h2>Version 1.3.3</h2> +<p>Release Date: June 1, 2006</p> + +<ul> + +<li>Models do <strong>not</strong> connect automatically to the database as of this version. <a href="./general/models.html">More info here</a>.</li> +<li>Updated the Sessions class to utilize the active record class when running session related queries. Previously the queries assumed MySQL syntax.</li> +<li>Updated alternator() function to re-initialize when called with no arguments, allowing multiple calls.</li> +<li>Fixed a bug in the active record "having" function.</li> +<li>Fixed a problem in the validation class which was making checkboxes be ignored when required.</li> +<li>Fixed a bug in the word_limiter() helper function. It was cutting off the fist word.</li> +<li>Fixed a bug in the xss_clean function due to a PHP bug that affects some versions of html_entity_decode.</li> +<li>Fixed a validation bug that was preventing rules from being set twice in one controller.</li> +<li>Fixed a calendar bug that was not letting it use dynamically loaded languages.</li> +<li>Fixed a bug in the active record class when using WHERE clauses with LIKE</li> +<li>Fixed a bug in the hash() security helper.</li> +<li>Fixed some typos.</li> +</ul> + + + + +<h2>Version 1.3.2</h2> +<p>Release Date: April 17, 2006</p> + +<ul> +<li>Changed the behavior of the validation class such that if a "required" rule is NOT explicitly stated for a field then all other tests get ignored.</li> +<li>Fixed a bug in the Controller class that was causing it to look in the local "init" folder instead of the main system one.</li> +<li>Fixed a bug in the init_pagination file. The $config item was not being set correctly.</li> +<li>Fixed a bug in the auto typography helper that was causing inconsistent behavior.</li> +<li>Fixed a couple bugs in the Model class.</li> +<li>Fixed some documentation typos and errata.</li> +</ul> + + + +<h2>Version 1.3.1</h2> +<p>Release Date: April 11, 2006</p> + +<ul> +<li>Added a <a href="./libraries/unit_testing.html">Unit Testing Library</a>.</li> +<li>Added the ability to pass objects to the <strong>insert()</strong> and <strong>update()</strong> database functions. +This feature enables you to (among other things) use your <a href="./general/models.html">Model class</a> variables to run queries with. See the Models page for details.</li> +<li>Added the ability to pass objects to the <a href="./general/views.html">view loading function</a>: $this->load->view('my_view', <var>$object</var>);</li> +<li>Added <kbd>getwhere</kbd> function to <a href="./database/active_record.html">Active Record class</a>.</li> +<li>Added <kbd>count_all</kbd> function to <a href="./database/active_record.html">Active Record class</a>.</li> +<li>Added language file for scaffolding and fixed a scaffolding bug that occurs when there are no rows in the specified table.</li> +<li>Added <a href="./database/queries.html">$this->db->last_query()</a>, which allows you to view your last query that was run.</li> +<li>Added a new mime type to the upload class for better compatibility.</li> +<li>Changed how cache files are read to prevent PHP errors if the cache file contains an XML tag, which PHP wants to interpret as a short tag.</li> +<li>Fixed a bug in a couple of the active record functions (where and orderby).</li> +<li>Fixed a bug in the image library when realpath() returns false.</li> +<li>Fixed a bug in the Models that was preventing libraries from being used within them.</li> +<li>Fixed a bug in the "exact_length" function of the validation class.</li> +<li>Fixed some typos in the user guide</li> +</ul> + + +<h2>Version 1.3</h2> +<p>Release Date: April 3, 2006</p> + +<ul> +<li>Added support for <a href="models.html">Models</a>.</li> +<li>Redesigned the database libraries to support additional RDBMs (Postgres, MySQLi, etc.).</li> +<li>Redesigned the <a href="./database/active_record.html">Active Record class</a> to enable more varied types of queries with simpler syntax, and advanced features like JOINs.</li> +<li>Added a feature to the database class that lets you run <a href="./database/call_function.html">custom function calls</a>.</li> +<li>Added support for <a href="controllers.html">private functions</a> in your controllers. Any controller function name that starts with an underscore will not be served by a URI request.</li> +<li>Added the ability to pass your own initialization parameters to your <a href="creating_libraries.html">custom core libraries</a> when using $this->load->library()</li> +<li>Added support for running standard <a href="urls.html">query string URLs</a>. These can be optionally enabled in your config file.</li> +<li>Added the ability to <a href="urls.html">specify a "suffix"</a>, which will be appended to your URLs. For example, you could add .html to your URLs, making them appear static. This feature is enabled in your config file.</li> +<li>Added a new error template for use with native PHP errors.</li> +<li>Added "alternator" function in the <a href="./helpers/string_helper.html">string helpers</a>.</li> +<li>Removed slashing from the input class. After much debate we decided to kill this feature.</li> +<li>Change the commenting style in the scripts to the PEAR standard so that IDEs and tools like phpDocumenter can harvest the comments.</li> +<li>Added better class and function name-spacing to avoid collisions with user developed classes. All CodeIgniter classes are now prefixed with <dfn>CI_</dfn> and +all controller methods are prefixed with <dfn>_ci</dfn> to avoid controller collisions. A list of reserved function names can be <a href="controllers.html">found here</a>.</li> +<li>Redesigned how the "CI" super object is referenced, depending on whether PHP 4 or 5 is being run, since PHP 5 allows a more graceful way to manage objects that utilizes a bit less resources.</li> +<li>Deprecated: <var>$this->db->use_table()</var> has been deprecated. Please read the <a href="./database/active_record.html">Active Record</a> page for information.</li> +<li>Deprecated: <var>$this->db->smart_escape_str()</var> has been deprecated. Please use this instead: <var>$this->db->escape()</var></li> +<li>Fixed a bug in the exception handler which was preventing some PHP errors from showing up.</li> +<li>Fixed a typo in the URI class. $this->total_segment() should be plural: $this->total_segments()</li> +<li>Fixed some typos in the default calendar template</li> +<li>Fixed some typos in the user guide</li> +</ul> + + + + + + + + +<h2>Version 1.2</h2> +<p>Release Date: March 21, 2006</p> + +<ul> +<li>Redesigned some internal aspects of the framework to resolve scoping problems that surfaced during the beta tests. The problem was most notable when instantiating classes in your constructors, particularly if those classes in turn did work in their constructors.</li> +<li>Added a global function named <a href="ancillary_classes.html">get_instance()</a> allowing the main CodeIgniter object to be accessible throughout your own classes.</li> +<li>Added new <a href="./helpers/file_helper.html">File Helper</a>: delete_files()</li> +<li>Added new <a href="./helpers/url_helper.html">URL Helpers</a>: base_url(), index_page()</li> +<li>Added the ability to create your own <a href="creating_libraries.html">core libraries</a> and store them in your local application directory.</li> +<li>Added an <kbd>overwrite</kbd> option to the <a href="./libraries/file_uploading.html">Upload class</a>, enabling files to be overwritten rather than having the file name appended.</li> +<li>Added Javascript Calendar plugin.</li> +<li>Added search feature to user guide. Note: This is done using Google, which at the time of this writing has not crawled all the pages of the docs.</li> +<li>Updated the parser class so that it allows tag pars within other tag pairs.</li> +<li>Fixed a bug in the DB "where" function.</li> +<li>Fixed a bug that was preventing custom config files to be auto-loaded.</li> +<li>Fixed a bug in the mysql class bind feature that prevented question marks in the replacement data.</li> +<li>Fixed some bugs in the xss_clean function</li> +</ul> + + + + + +<h2>Version Beta 1.1</h2> +<p>Release Date: March 10, 2006</p> + +<ul> +<li>Added a <a href="./libraries/calendar.html">Calendaring class</a>.</li> +<li>Added support for running <a href="managing_apps.html">multiple applications</a> that share a common CodeIgniter backend.</li> +<li>Moved the "uri protocol" variable from the index.php file into the config.php file</li> +<li>Fixed a problem that was preventing certain function calls from working within constructors.</li> +<li>Fixed a problem that was preventing the $this->load->library function from working in constructors.</li> +<li>Fixed a bug that occurred when the session class was loaded using the auto-load routine.</li> +<li>Fixed a bug that can happen with PHP versions that do not support the E_STRICT constant</li> +<li>Fixed a data type error in the form_radio function (form helper)</li> +<li>Fixed a bug that was preventing the xss_clean function from being called from the validation class.</li> +<li>Fixed the cookie related config names, which were incorrectly specified as $conf rather than $config</li> +<li>Fixed a pagination problem in the scaffolding.</li> +<li>Fixed a bug in the mysql class "where" function.</li> +<li>Fixed a regex problem in some code that trimmed duplicate slashes.</li> +<li>Fixed a bug in the br() function in the HTML helper</li> +<li>Fixed a syntax mistake in the form_dropdown function in the Form Helper.</li> +<li>Removed the "style" attributes form the form helpers.</li> +<li>Updated the documentation. Added "next/previous" links to each page and fixed various typos.</li> +</ul> + +<h2>Version Beta 1.0 </h2> +<p>Release Date: February 28, 2006</p> +<p>First publicly released version.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="license.html">License Agreement</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="./general/credits.html">Credits</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> diff --git a/user_guide/database/active_record.html b/user_guide/database/active_record.html new file mode 100644 index 0000000..36fe7fb --- /dev/null +++ b/user_guide/database/active_record.html @@ -0,0 +1,820 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Active Record : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +<a href="index.html">Database Library</a> &nbsp;&#8250;&nbsp; +Active Record +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + +<!-- START CONTENT --> +<div id="content"> + +<h1>Active Record Class</h1> + +<p>CodeIgniter uses a modified version of the Active Record Database Pattern. +This pattern allows information to be retrieved, inserted, and updated in your database with minimal scripting. +In some cases only one or two lines of code are necessary to perform a database action. +CodeIgniter does not require that each database table be its own class file. It instead provides a more simplified interface.</p> + +<p>Beyond simplicity, a major benefit to using the Active Record features is that it allows you to create database independent applications, since the query syntax +is generated by each database adapter. It also allows for safer queries, since the values are escaped automatically by the system.</p> + +<p class="important"><strong>Note:</strong> If you intend to write your own queries you can disable this class in your database config file, allowing the core database library and adapter to utilize fewer resources.<br /></p> + +<ul> +<li><a href="#select">Selecting Data</a></li> +<li><a href="#insert">Inserting Data</a></li> +<li><a href="#update">Updating Data</a></li> +<li><a href="#delete">Deleting Data</a></li> +<li><a href="#chaining">Method Chaining</a></li> +<li><a href="#caching">Active Record Caching</a></li> +</ul> + +<h1><a name="select">&nbsp;</a>Selecting Data</h1> + +<p>The following functions allow you to build SQL <strong>SELECT</strong> statements.</p> + + +<h2>$this->db->get();</h2> + +<p>Runs the selection query and returns the result. Can be used by itself to retrieve all records from a table:</p> + +<code>$query = $this->db->get('mytable');<br /> +<br /> +// Produces: SELECT * FROM mytable</code> + +<p>The second and third parameters enable you to set a limit and offset clause:</p> + +<code>$query = $this->db->get('mytable', 10, 20);<br /> +<br /> +// Produces: SELECT * FROM mytable LIMIT 20, 10 (in MySQL. Other databases have slightly different syntax)</code> + +<p>You'll notice that the above function is assigned to a variable named <kbd>$query</kbd>, which can be used to show the results:</p> + +<code>$query = $this->db->get('mytable');<br /> +<br /> +foreach ($query->result() as $row)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo $row->title;<br /> +}</code> + +<p>Please visit the <a href="results.html">result functions</a> page for a full discussion regarding result generation.</p> + + +<h2>$this->db->get_where();</h2> + +<p>Identical to the above function except that it permits you to add a "where" clause in the second parameter, +instead of using the db->where() function:</p> + +<code>$query = $this->db->get_where('mytable', array('id' => $id), $limit, $offset);</code> + +<p>Please read the about the where function below for more information.</p> +<p class="important">Note: get_where() was formerly known as getwhere(), which has been removed</p> + +<h2>$this->db->select();</h2> +<p>Permits you to write the SELECT portion of your query:</p> +<p><code> +$this->db->select('title, content, date');<br /> +<br /> +$query = $this->db->get('mytable');<br /> +<br /> +// Produces: SELECT title, content, date FROM mytable</code></p> +<p class="important"><strong>Note:</strong> If you are selecting all (*) from a table you do not need to use this function. When omitted, CodeIgniter assumes you wish to SELECT *</p> + +<p>$this-&gt;db-&gt;select() accepts an optional second parameter. If you set it to FALSE, CodeIgniter will not try to protect your field or table names with backticks. This is useful if you need a compound select statement.</p> +<p><code>$this-&gt;db-&gt;select('(SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4') AS amount_paid', FALSE); <br /> +$query = $this-&gt;db-&gt;get('mytable');<br /> +</code></p> +<h2>$this->db->select_max();</h2> +<p>Writes a "SELECT MAX(field)" portion for your query. You can optionally include a second parameter to rename the resulting field.</p> +<p><code> +$this->db->select_max('age');<br /> +$query = $this->db->get('members');<br /> + +// Produces: SELECT MAX(age) as age FROM members<br /> +<br /> +$this-&gt;db-&gt;select_max('age', 'member_age');<br /> +$query = $this-&gt;db-&gt;get('members');<br /> +// Produces: SELECT MAX(age) as member_age FROM members</code></p> + +<h2>$this->db->select_min();</h2> +<p>Writes a "SELECT MIN(field)" portion for your query. As with <dfn>select_max()</dfn>, You can optionally include a second parameter to rename the resulting field.</p> +<p><code> +$this->db->select_min('age');<br /> +$query = $this->db->get('members');<br /> +// Produces: SELECT MIN(age) as age FROM members</code></p> + +<h2>$this->db->select_avg();</h2> +<p>Writes a "SELECT AVG(field)" portion for your query. As with <dfn>select_max()</dfn>, You can optionally include a second parameter to rename the resulting field.</p> +<p><code> +$this->db->select_avg('age');<br /> +$query = $this->db->get('members');<br /> +// Produces: SELECT AVG(age) as age FROM members</code></p> + +<h2>$this->db->select_sum();</h2> +<p>Writes a "SELECT SUM(field)" portion for your query. As with <dfn>select_max()</dfn>, You can optionally include a second parameter to rename the resulting field.</p> +<p><code> +$this->db->select_sum('age');<br /> +$query = $this->db->get('members');<br /> +// Produces: SELECT SUM(age) as age FROM members</code></p> + +<h2>$this->db->from();</h2> + +<p>Permits you to write the FROM portion of your query:</p> + +<code> +$this->db->select('title, content, date');<br /> +$this->db->from('mytable');<br /> +<br /> +$query = $this->db->get();<br /> +<br /> +// Produces: SELECT title, content, date FROM mytable</code> + +<p class="important">Note: As shown earlier, the FROM portion of your query can be specified in the <dfn>$this->db->get()</dfn> function, so use whichever method +you prefer.</p> + +<h2>$this->db->join();</h2> + +<p>Permits you to write the JOIN portion of your query:</p> + +<code> +$this->db->select('*');<br /> +$this->db->from('blogs');<br /> +$this->db->join('comments', 'comments.id = blogs.id');<br /> +<br /> +$query = $this->db->get();<br /> +<br /> +// Produces: <br /> +// SELECT * FROM blogs<br /> +// JOIN comments ON comments.id = blogs.id<br /> +</code> + +<p>Multiple function calls can be made if you need several joins in one query.</p> + +<p>If you need a specific type of JOIN you can specify it via the third parameter of the function. +Options are: left, right, outer, inner, left outer, and right outer.</p> + +<code> +$this->db->join('comments', 'comments.id = blogs.id', <strong>'left'</strong>);<br /> +<br /> +// Produces: LEFT JOIN comments ON comments.id = blogs.id</code> + + + + + +<h2>$this->db->where();</h2> +<p>This function enables you to set <strong>WHERE</strong> clauses using one of four methods:</p> + +<p class="important"><strong>Note:</strong> All values passed to this function are escaped automatically, producing safer queries.</p> + +<ol> + <li><strong>Simple key/value method:</strong> + + <code>$this->db->where('name', $name); + <br /><br />// Produces: WHERE name = 'Joe' </code> + + <p>Notice that the equal sign is added for you.</p> + + <p>If you use multiple function calls they will be chained together with <var>AND</var> between them:</p> + + <code>$this->db->where('name', $name);<br /> + $this->db->where('title', $title);<br /> + $this->db->where('status', $status); + <br /><br />// WHERE name = 'Joe' AND title = 'boss' AND status = 'active' </code> </li> + + <li><strong>Custom key/value method:</strong> + + <p>You can include an operator in the first parameter in order to control the comparison:</p> + + <code>$this->db->where('name !=', $name);<br /> + $this->db->where('id <', $id); + <br /><br />// Produces: WHERE name != 'Joe' AND id < 45 </code> </li> + <li><strong>Associative array method:</strong> + + + <code> + $array = array('name' => $name, 'title' => $title, 'status' => $status);<br /><br /> + + $this->db->where($array); + <br /><br />// Produces: WHERE name = 'Joe' AND title = 'boss' AND status = 'active' </code> + + <p>You can include your own operators using this method as well:</p> + + <code> + $array = array('name !=' => $name, 'id <' => $id, 'date >' => $date);<br /><br /> + + $this->db->where($array);</code> </li> + <li><strong>Custom string:</strong> + + <p>You can write your own clauses manually:</p> + + <code> + $where = "name='Joe' AND status='boss' OR status='active'";<br /><br /> + $this->db->where($where);</code></li> + </ol> + + +<p>$this-&gt;db-&gt;where() accepts an optional third parameter. If you set it to FALSE, CodeIgniter will not try to protect your field or table names with backticks.</p> +<p><code> $this-&gt;db-&gt;where('MATCH (field) AGAINST (&quot;value&quot;)', NULL, FALSE);<br /> +</code></p> +<h2>$this->db->or_where();</h2> +<p>This function is identical to the one above, except that multiple instances are joined by OR:</p> + +<code> +$this->db->where('name !=', $name);<br /> +$this->db->or_where('id >', $id); +<br /> +<br />// Produces: WHERE name != 'Joe' OR id > 50</code> + +<p class="important">Note: or_where() was formerly known as orwhere(), which has been removed.</p> + + +<h2>$this->db->where_in();</h2> +<p>Generates a WHERE field IN ('item', 'item') SQL query joined with AND if appropriate</p> +<p><code> + $names = array('Frank', 'Todd', 'James');<br /> + $this->db->where_in('username', $names);<br /> + // Produces: WHERE username IN ('Frank', 'Todd', 'James')</code></p> + +<h2>$this->db->or_where_in();</h2> +<p>Generates a WHERE field IN ('item', 'item') SQL query joined with OR if appropriate</p> +<p><code> + $names = array('Frank', 'Todd', 'James');<br /> + $this->db->or_where_in('username', $names);<br /> + // Produces: OR username IN ('Frank', 'Todd', 'James')</code></p> + +<h2>$this->db->where_not_in();</h2> +<p>Generates a WHERE field NOT IN ('item', 'item') SQL query joined with AND if appropriate</p> +<p><code> + $names = array('Frank', 'Todd', 'James');<br /> + $this->db->where_not_in('username', $names);<br /> + // Produces: WHERE username NOT IN ('Frank', 'Todd', 'James')</code></p> + +<h2>$this->db->or_where_not_in();</h2> +<p>Generates a WHERE field NOT IN ('item', 'item') SQL query joined with OR if appropriate</p> +<p><code> + $names = array('Frank', 'Todd', 'James');<br /> + $this->db->or_where_not_in('username', $names);<br /> + // Produces: OR username NOT IN ('Frank', 'Todd', 'James')</code></p> + +<h2>$this->db->like();</h2> +<p>This function enables you to generate <strong>LIKE</strong> clauses, useful for doing searches.</p> + +<p class="important"><strong>Note:</strong> All values passed to this function are escaped automatically.</p> + + +<ol> + <li><strong>Simple key/value method:</strong> + + <code>$this->db->like('title', 'match'); + <br /><br />// Produces: WHERE title LIKE '%match%' </code> + + <p>If you use multiple function calls they will be chained together with <var>AND</var> between them:</p> + + <code>$this->db->like('title', 'match');<br /> + $this->db->like('body', 'match'); + <br /><br /> + // WHERE title LIKE '%match%' AND body LIKE '%match%</code> + If you want to control where the wildcard (%) is placed, you can use an optional third argument. Your options are 'before', 'after' and 'both' (which is the default). + <code>$this->db->like('title', 'match', 'before'); + <br /> + // Produces: WHERE title LIKE '%match' <br /> + <br /> + $this-&gt;db-&gt;like('title', 'match', 'after'); <br /> +// Produces: WHERE title LIKE 'match%' <br /> +<br /> + $this-&gt;db-&gt;like('title', 'match', 'both'); <br /> +// Produces: WHERE title LIKE '%match%' </code> </li> + +If you do not want to use the wildcard (%) you can pass to the optional third argument the option 'none'. + +<code> + $this-&gt;db-&gt;like('title', 'match', 'none'); <br /> +// Produces: WHERE title LIKE 'match' +</code> + + <li><strong>Associative array method:</strong> + + <code> + $array = array('title' => $match, 'page1' => $match, 'page2' => $match);<br /><br /> + + $this->db->like($array); + <br /><br />// WHERE title LIKE '%match%' AND page1 LIKE '%match%' AND page2 LIKE '%match%'</code></li> + </ol> + + +<h2>$this->db->or_like();</h2> +<p>This function is identical to the one above, except that multiple instances are joined by OR:</p> + +<code> +$this->db->like('title', 'match');<br /> +$this->db->or_like('body', $match); +<br /> +<br />// WHERE title LIKE '%match%' OR body LIKE '%match%'</code> + + + + +<p class="important">Note: or_like() was formerly known as orlike(), which has been removed.</p> +<h2>$this-&gt;db-&gt;not_like();</h2> +<p>This function is identical to <strong>like()</strong>, except that it generates NOT LIKE statements:</p> +<code> $this-&gt;db-&gt;not_like('title', 'match');<br /> +<br /> +// WHERE title NOT LIKE '%match%</code> +<h2>$this-&gt;db-&gt;or_not_like();</h2> +<p>This function is identical to <strong>not_like()</strong>, except that multiple instances are joined by OR:</p> +<code> $this-&gt;db-&gt;like('title', 'match');<br /> +$this-&gt;db-&gt;or_not_like('body', 'match'); <br /> +<br /> +// WHERE title LIKE '%match% OR body NOT LIKE '%match%'</code> +<h2>$this->db->group_by();</h2> +<p>Permits you to write the GROUP BY portion of your query:</p> + +<code>$this->db->group_by("title"); +<br /><br />// Produces: GROUP BY title +</code> + +<p>You can also pass an array of multiple values as well:</p> + +<code>$this->db->group_by(array("title", "date")); +<br /> +<br />// Produces: GROUP BY title, date</code> + +<p class="important">Note: group_by() was formerly known as groupby(), which has been removed. </p> + +<h2> $this-&gt;db-&gt;distinct();<br /> +</h2> +<p>Adds the &quot;DISTINCT&quot; keyword to a query</p> +<p><code>$this-&gt;db-&gt;distinct();<br /> + $this-&gt;db-&gt;get('table');<br /> + <br /> + // Produces: SELECT DISTINCT * FROM table</code></p> +<h2>$this->db->having();</h2> +<p>Permits you to write the HAVING portion of your query. There are 2 possible syntaxes, 1 argument or 2:</p> + +<code>$this->db->having('user_id = 45'); +<br /> +// Produces: HAVING user_id = 45<br /> +<br /> +$this-&gt;db-&gt;having('user_id', 45); <br /> +// Produces: HAVING user_id = 45<br /> +<br /> +</code> + +<p>You can also pass an array of multiple values as well:</p> + + +<p><code>$this->db->having(array('title =' => 'My Title', 'id <' => $id)); <br /> + <br /> + // Produces: HAVING title = 'My Title', id < 45</code></p> +<p>If you are using a database that CodeIgniter escapes queries for, you can prevent escaping content by passing an optional third argument, and setting it to FALSE.</p> +<p><code>$this-&gt;db-&gt;having('user_id', 45); <br /> +// Produces: HAVING `user_id` = 45 in some databases such as MySQL + <br /> + $this-&gt;db-&gt;having('user_id', 45, FALSE); <br /> +// Produces: HAVING user_id = 45</code></p> +<h2>$this-&gt;db-&gt;or_having();</h2> +<p>Identical to having(), only separates multiple clauses with &quot;OR&quot;.</p> +<h2>$this->db->order_by();</h2> +<p>Lets you set an ORDER BY clause. The first parameter contains the name of the column you would like to order by. +The second parameter lets you set the direction of the result. Options are <kbd>asc</kbd> or <kbd>desc</kbd>, or <kbd>random</kbd>. </p> + +<code>$this->db->order_by("title", "desc"); +<br /> +<br />// Produces: ORDER BY title DESC +</code> + +<p>You can also pass your own string in the first parameter:</p> + +<code>$this->db->order_by('title desc, name asc'); +<br /> +<br />// Produces: ORDER BY title DESC, name ASC +</code> + +<p>Or multiple function calls can be made if you need multiple fields.</p> + +<p><code>$this->db->order_by("title", "desc");<br /> + $this->db->order_by("name", "asc"); <br /> + <br /> + // Produces: ORDER BY title DESC, name ASC + </code></p> +<p class="important">Note: order_by() was formerly known as orderby(), which has been removed.</p> +<p class="important">Note: random ordering is not currently supported in Oracle or MSSQL drivers. These will default to 'ASC'.</p> +<h2>$this->db->limit();</h2> +<p>Lets you limit the number of rows you would like returned by the query:</p> + +<code> +$this->db->limit(10);<br /> +<br /> +// Produces: LIMIT 10</code> + + +<p>The second parameter lets you set a result offset.</p> + +<code> +$this->db->limit(10, 20);<br /> +<br /> +// Produces: LIMIT 20, 10 (in MySQL. Other databases have slightly different syntax)</code> + + +<h2>$this->db->count_all_results();</h2> + +<p>Permits you to determine the number of rows in a particular Active Record query. Queries will accept Active Record restrictors such as where(), or_where(), like(), or_like(), etc. Example:</p> +<code>echo $this->db->count_all_results('<var>my_table</var>');<br /> + +// Produces an integer, like 25<br /> +<br /> +$this-&gt;db-&gt;like('title', 'match');<br /> +$this-&gt;db-&gt;from('<var>my_table</var>');<br /> +echo $this-&gt;db-&gt;count_all_results();<br /> +// Produces an integer, like 17 </code> + +<h2>$this->db->count_all();</h2> + +<p>Permits you to determine the number of rows in a particular table. Submit the table name in the first parameter. Example:</p> + +<code>echo $this->db->count_all('<var>my_table</var>');<br /> +<br /> +// Produces an integer, like 25</code> + + + +<a name="insert">&nbsp;</a> +<h1>Inserting Data</h1> + +<h2>$this->db->insert();</h2> +<p>Generates an insert string based on the data you supply, and runs the query. You can either pass an +<strong>array</strong> or an <strong>object</strong> to the function. Here is an example using an array:</p> + +<code> +$data = array(<br /> +&nbsp;&nbsp;&nbsp;'title' => 'My title' ,<br /> +&nbsp;&nbsp;&nbsp;'name' => 'My Name' ,<br /> +&nbsp;&nbsp;&nbsp;'date' => 'My date'<br /> +);<br /> +<br /> +$this->db->insert('mytable', $data); +<br /><br /> +// Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')</code> + +<p>The first parameter will contain the table name, the second is an associative array of values.</p> + +<p>Here is an example using an object:</p> + +<code> +/*<br /> +&nbsp;&nbsp;&nbsp;&nbsp;class Myclass {<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var $title = 'My Title';<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var $content = 'My Content';<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var $date = 'My Date';<br /> +&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +*/<br /> +<br /> +$object = new Myclass;<br /> +<br /> +$this->db->insert('mytable', $object); +<br /><br /> +// Produces: INSERT INTO mytable (title, content, date) VALUES ('My Title', 'My Content', 'My Date')</code> + +<p>The first parameter will contain the table name, the second is an object.</p> + +<p class="important"><strong>Note:</strong> All values are escaped automatically producing safer queries.</p> + +<h2>$this->db->insert_batch();</h2> +<p>Generates an insert string based on the data you supply, and runs the query. You can either pass an +<strong>array</strong> or an <strong>object</strong> to the function. Here is an example using an array:</p> + +<code> +$data = array(<br/> +&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'title' => 'My title' ,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name' => 'My Name' ,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'date' => 'My date'<br /> +&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'title' => 'Another title' ,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name' => 'Another Name' ,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'date' => 'Another date'<br /> +&nbsp;&nbsp;&nbsp;)<br/> +);<br /> +<br /> +$this->db->insert_batch('mytable', $data); +<br /><br /> +// Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date'), ('Another title', 'Another name', 'Another date')</code> + +<p>The first parameter will contain the table name, the second is an associative array of values.</p> + +<p class="important"><strong>Note:</strong> All values are escaped automatically producing safer queries.</p> + + + +<h2>$this->db->set();</h2> +<p>This function enables you to set values for <dfn>inserts</dfn> or <dfn>updates</dfn>.</p> + +<p><strong>It can be used instead of passing a data array directly to the insert or update functions:</strong> </p> + +<code>$this->db->set('name', $name); +<br /> +$this->db->insert('mytable'); +<br /><br /> +// Produces: INSERT INTO mytable (name) VALUES ('{$name}')</code> + +<p>If you use multiple function called they will be assembled properly based on whether you are doing an insert or an update:</p> + +<code>$this-&gt;db-&gt;set('name', $name);<br /> +$this-&gt;db-&gt;set('title', $title);<br /> +$this-&gt;db-&gt;set('status', $status);<br /> +$this-&gt;db-&gt;insert('mytable'); </code> +<p><strong>set()</strong> will also accept an optional third parameter ($escape), that will prevent data from being escaped if set to FALSE. To illustrate the difference, here is set() used both with and without the escape parameter.</p> +<p><code>$this-&gt;db-&gt;set('field', 'field+1', FALSE);<br /> + $this-&gt;db-&gt;insert('mytable'); <br /> + // gives INSERT INTO mytable (field) VALUES (field+1)<br /> + <br /> + $this-&gt;db-&gt;set('field', 'field+1');<br /> + $this-&gt;db-&gt;insert('mytable'); <br /> + // gives INSERT INTO mytable (field) VALUES ('field+1')</code></p> +<p>You can also pass an associative array to this function:</p> +<code> +$array = array('name' => $name, 'title' => $title, 'status' => $status);<br /><br /> + +$this->db->set($array);<br /> +$this->db->insert('mytable'); +</code> + +<p>Or an object:</p> + + +<code> +/*<br /> +&nbsp;&nbsp;&nbsp;&nbsp;class Myclass {<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var $title = 'My Title';<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var $content = 'My Content';<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var $date = 'My Date';<br /> +&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +*/<br /> +<br /> +$object = new Myclass;<br /> +<br /> +$this->db->set($object);<br /> +$this->db->insert('mytable'); +</code> + + + +<a name="update">&nbsp;</a> +<h1>Updating Data</h1> + +<h2>$this->db->update();</h2> +<p>Generates an update string and runs the query based on the data you supply. You can pass an +<strong>array</strong> or an <strong>object</strong> to the function. Here is an example using +an array:</p> + +<code> +$data = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'title' => $title,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name' => $name,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'date' => $date<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +$this->db->where('id', $id);<br /> +$this->db->update('mytable', $data); +<br /><br /> +// Produces:<br /> +// UPDATE mytable <br /> +// SET title = '{$title}', name = '{$name}', date = '{$date}'<br /> +// WHERE id = $id</code> + +<p>Or you can supply an object:</p> + +<code> +/*<br /> +&nbsp;&nbsp;&nbsp;&nbsp;class Myclass {<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var $title = 'My Title';<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var $content = 'My Content';<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var $date = 'My Date';<br /> +&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +*/<br /> +<br /> +$object = new Myclass;<br /> +<br /> +$this->db->where('id', $id);<br /> +$this->db->update('mytable', $object); +<br /> +<br /> +// Produces:<br /> +// UPDATE mytable <br /> +// SET title = '{$title}', name = '{$name}', date = '{$date}'<br /> +// WHERE id = $id</code> + + + +<p class="important"><strong>Note:</strong> All values are escaped automatically producing safer queries.</p> + +<p>You'll notice the use of the <dfn>$this->db->where()</dfn> function, enabling you to set the WHERE clause. +You can optionally pass this information directly into the update function as a string:</p> + +<code>$this->db->update('mytable', $data, "id = 4");</code> + +<p>Or as an array:</p> + +<code>$this->db->update('mytable', $data, array('id' => $id));</code> + +<p>You may also use the <dfn>$this->db->set()</dfn> function described above when performing updates.</p> + +<h2>$this->db->update_batch();</h2> +<p>Generates an update string based on the data you supply, and runs the query. You can either pass an +<strong>array</strong> or an <strong>object</strong> to the function. Here is an example using an array:</p> + +<code> +$data = array(<br/> +&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'title' => 'My title' ,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name' => 'My Name 2' ,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'date' => 'My date 2'<br /> +&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'title' => 'Another title' ,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name' => 'Another Name 2' ,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'date' => 'Another date 2'<br /> +&nbsp;&nbsp;&nbsp;)<br/> +);<br /> +<br /> +$this->db->update_batch('mytable', $data, 'title'); +<br /><br /> +// Produces: <br /> +// UPDATE `mytable` SET `name` = CASE<br /> +// WHEN `title` = 'My title' THEN 'My Name 2'<br /> +// WHEN `title` = 'Another title' THEN 'Another Name 2'<br /> +// ELSE `name` END,<br /> +// `date` = CASE <br /> +// WHEN `title` = 'My title' THEN 'My date 2'<br /> +// WHEN `title` = 'Another title' THEN 'Another date 2'<br /> +// ELSE `date` END<br /> +// WHERE `title` IN ('My title','Another title')</code> + +<p>The first parameter will contain the table name, the second is an associative array of values, the third parameter is the where key.</p> + +<p class="important"><strong>Note:</strong> All values are escaped automatically producing safer queries.</p> + + +<a name="delete">&nbsp;</a> +<h1>Deleting Data</h1> + + + +<h2>$this->db->delete();</h2> +<p>Generates a delete SQL string and runs the query.</p> + +<code> +$this->db->delete('mytable', array('id' => $id)); +<br /><br /> +// Produces:<br /> +// DELETE FROM mytable <br /> +// WHERE id = $id</code> + +<p>The first parameter is the table name, the second is the where clause. You can also use the <dfn>where()</dfn> or <dfn>or_where()</dfn> functions instead of passing +the data to the second parameter of the function:</p> + +<p><code> $this->db->where('id', $id);<br /> + $this->db->delete('mytable'); <br /> + <br /> + // Produces:<br /> + // DELETE FROM mytable <br /> + // WHERE id = $id</code></p> +<p>An array of table names can be passed into delete() if you would like to delete data from more than 1 table.</p> +<p><code>$tables = array('table1', 'table2', 'table3');<br /> +$this-&gt;db-&gt;where('id', '5');<br /> +$this-&gt;db-&gt;delete($tables);</code></p> +<p>If you want to delete all data from a table, you can use the <dfn>truncate()</dfn> function, or <dfn>empty_table()</dfn>.</p> +<h2>$this-&gt;db-&gt;empty_table();</h2> +<p>Generates a delete SQL string and runs the query.<code> $this-&gt;db-&gt;empty_table('mytable'); <br /> + <br /> +// Produces<br /> +// DELETE FROM mytable</code></p> +<h2>$this-&gt;db-&gt;truncate();</h2> +<p>Generates a truncate SQL string and runs the query.</p> +<code> $this-&gt;db-&gt;from('mytable'); <br /> +$this-&gt;db-&gt;truncate(); <br /> +// or <br /> +$this-&gt;db-&gt;truncate('mytable'); <br /> +<br /> +// Produce:<br /> +// TRUNCATE mytable <br /> +</code> +<p class="important"><strong>Note:</strong> If the TRUNCATE command isn't available, truncate() will execute as &quot;DELETE FROM table&quot;.</p> + +<h1><a name="chaining">&nbsp;</a>Method Chaining</h1> + +<p>Method chaining allows you to simplify your syntax by connecting multiple functions. Consider this example:</p> + +<code> +<dfn>$this->db</dfn><kbd>-></kbd><var>select</var>('title')<kbd>-></kbd><var>from</var>('mytable')<kbd>-></kbd><var>where</var>('id', $id)<kbd>-></kbd><var>limit</var>(10, 20);<br /> +<br /> +$query = $this->db->get();</code> + +<p>&nbsp;</p> + +<h1><a name="caching">&nbsp;</a>Active Record Caching</h1> + +<p>While not &quot;true&quot; caching, Active Record enables you to save (or &quot;cache&quot;) certain parts of your queries for reuse at a later point in your script's execution. Normally, when an Active Record call is completed, all stored information is reset for the next call. With caching, you can prevent this reset, and reuse information easily.</p> + +<p>Cached calls are cumulative. If you make 2 cached select() calls, and then 2 uncached select() calls, this will result in 4 select() calls. There are three Caching functions available:</p> + +<h2>$this-&gt;db-&gt;start_cache()</h2> + +<p>This function must be called to begin caching. All Active Record queries of the correct type (see below for supported queries) are stored for later use.</p> + +<h2>$this-&gt;db-&gt;stop_cache()</h2> + +<p>This function can be called to stop caching.</p> + +<h2>$this-&gt;db-&gt;flush_cache()</h2> + +<p>This function deletes all items from the Active Record cache.</p> + +<p>Here's a usage example:</p> + +<p><code>$this-&gt;db-&gt;start_cache();<br /> +$this-&gt;db-&gt;select('field1');<br /> +$this-&gt;db-&gt;stop_cache();<br /><br /> +$this-&gt;db-&gt;get('tablename');<br /> +<br /> +//Generates: SELECT `field1` FROM (`tablename`)<br /> +<br /> +$this-&gt;db-&gt;select('field2');<br /> +$this-&gt;db-&gt;get('tablename');<br /> +<br /> +//Generates: SELECT `field1`, `field2` FROM (`tablename`)<br /> +<br /> +$this-&gt;db-&gt;flush_cache();<br /> +<br /> +$this-&gt;db-&gt;select('field2');<br /> +$this-&gt;db-&gt;get('tablename');<br /> +<br /> +//Generates: SELECT `field2` FROM (`tablename`)</code></p> + +<p class="important"> <strong>Note:</strong> The following statements can be cached: select, from, join, where, like, group_by, having, order_by, set</p> +<p>&nbsp;</p> +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="helpers.html">Query Helper Functions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="transactions.html">Transactions</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/database/caching.html b/user_guide/database/caching.html new file mode 100644 index 0000000..ae215e6 --- /dev/null +++ b/user_guide/database/caching.html @@ -0,0 +1,220 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Database Caching Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +<a href="index.html">Database Library</a> &nbsp;&#8250;&nbsp; +Database Caching Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Database Caching Class</h1> + +<p>The Database Caching Class permits you to cache your queries as text files for reduced database load.</p> + +<p class="important"><strong>Important:</strong>&nbsp; This class is initialized automatically by the database driver +when caching is enabled. Do NOT load this class manually.<br /><br /> + +<strong>Also note:</strong>&nbsp; Not all query result functions are available when you use caching. Please read this page carefully.</p> + +<h2>Enabling Caching</h2> + +<p>Caching is enabled in three steps:</p> + +<ul> +<li>Create a writable directory on your server where the cache files can be stored.</li> +<li>Set the path to your cache folder in your <dfn>application/config/database.php</dfn> file.</li> +<li>Enable the caching feature, either globally by setting the preference in your <dfn>application/config/database.php</dfn> file, or manually as described below.</li> +</ul> + +<p>Once enabled, caching will happen automatically whenever a page is loaded that contains database queries.</p> + + +<h2>How Does Caching Work?</h2> + +<p>CodeIgniter's query caching system happens dynamically when your pages are viewed. +When caching is enabled, the first time a web page is loaded, the query result object will +be serialized and stored in a text file on your server. The next time the page is loaded the cache file will be used instead of +accessing your database. Your database usage can effectively be reduced to zero for any pages that have been cached.</p> + +<p>Only <dfn>read-type</dfn> (SELECT) queries can be cached, since these are the only type of queries that produce a result. +<dfn>Write-type</dfn> (INSERT, UPDATE, etc.) queries, since they don't generate a result, will not be cached by the system.</p> + +<p>Cache files DO NOT expire. Any queries that have been cached will remain cached until you delete them. The caching system +permits you clear caches associated with individual pages, or you can delete the entire collection of cache files. +Typically you'll want to use the housekeeping functions described below to delete cache files after certain +events take place, like when you've added new information to your database.</p> + +<h2>Will Caching Improve Your Site's Performance?</h2> + +<p>Getting a performance gain as a result of caching depends on many factors. +If you have a highly optimized database under very little load, you probably won't see a performance boost. +If your database is under heavy use you probably will see an improved response, assuming your file-system is not +overly taxed. Remember that caching simply changes how your information is retrieved, shifting it from being a database +operation to a file-system one.</p> + +<p>In some clustered server environments, for example, caching may be detrimental since file-system operations are so intense. +On single servers in shared environments, caching will probably be beneficial. Unfortunately there is no +single answer to the question of whether you should cache your database. It really depends on your situation.</p> + +<h2>How are Cache Files Stored?</h2> + +<p>CodeIgniter places the result of EACH query into its own cache file. Sets of cache files are further organized into +sub-folders corresponding to your controller functions. To be precise, the sub-folders are named identically to the +first two segments of your URI (the controller class name and function name).</p> + +<p>For example, let's say you have a controller called <dfn>blog</dfn> with a function called <dfn>comments</dfn> that +contains three queries. The caching system will create a cache folder +called <kbd>blog+comments</kbd>, into which it will write three cache files.</p> + +<p>If you use dynamic queries that change based on information in your URI (when using pagination, for example), each instance of +the query will produce its own cache file. It's possible, therefore, to end up with many times more cache files than you have +queries.</p> + + +<h2>Managing your Cache Files</h2> + +<p>Since cache files do not expire, you'll need to build deletion routines into your application. For example, let's say you have a blog +that allows user commenting. Whenever a new comment is submitted you'll want to delete the cache files associated with the +controller function that serves up your comments. You'll find two delete functions described below that help you +clear data.</p> + + +<h2>Not All Database Functions Work with Caching</h2> + +<p>Lastly, we need to point out that the result object that is cached is a simplified version of the full result object. For that reason, +some of the query result functions are not available for use.</p> + +<p>The following functions <kbd>ARE NOT</kbd> available when using a cached result object:</p> + +<ul> +<li>num_fields()</li> +<li>field_names()</li> +<li>field_data()</li> +<li>free_result()</li> +</ul> + +<p>Also, the two database resources (result_id and conn_id) are not available when caching, since result resources only +pertain to run-time operations.</p> + + +<br /> + +<h1>Function Reference</h1> + + + +<h2>$this->db->cache_on()&nbsp; / &nbsp; $this->db->cache_off()</h2> + +<p>Manually enables/disables caching. This can be useful if you want to +keep certain queries from being cached. Example:</p> + +<code> +// Turn caching on<br /> +$this->db->cache_on();<br /> +$query = $this->db->query("SELECT * FROM mytable");<br /> +<br /> +// Turn caching off for this one query<br /> +$this->db->cache_off();<br /> +$query = $this->db->query("SELECT * FROM members WHERE member_id = '$current_user'");<br /> +<br /> +// Turn caching back on<br /> +$this->db->cache_on();<br /> +$query = $this->db->query("SELECT * FROM another_table"); +</code> + + +<h2>$this->db->cache_delete()</h2> + +<p>Deletes the cache files associated with a particular page. This is useful if you need to clear caching after you update your database.</p> + +<p>The caching system saves your cache files to folders that correspond to the URI of the page you are viewing. For example, if you are viewing +a page at <dfn>example.com/index.php/blog/comments</dfn>, the caching system will put all cache files associated with it in a folder +called <dfn>blog+comments</dfn>. To delete those particular cache files you will use:</p> + +<code>$this->db->cache_delete('blog', 'comments');</code> + +<p>If you do not use any parameters the current URI will be used when determining what should be cleared.</p> + + +<h2>$this->db->cache_delete_all()</h2> + +<p>Clears all existing cache files. Example:</p> + +<code>$this->db->cache_delete_all();</code> + + + + + + + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="call_function.html">Custom Function Calls</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="forge.html">Database manipulation with Database Forge</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/database/call_function.html b/user_guide/database/call_function.html new file mode 100644 index 0000000..95fa7e1 --- /dev/null +++ b/user_guide/database/call_function.html @@ -0,0 +1,118 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Custom Function Calls : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +<a href="index.html">Database Library</a> &nbsp;&#8250;&nbsp; +Custom Function Calls +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Custom Function Calls</h1> + +<h2>$this->db->call_function();</h2> + +<p>This function enables you to call PHP database functions that are not natively included in CodeIgniter, in a platform independent manner. +For example, lets say you want to call the <dfn>mysql_get_client_info()</dfn> function, which is <strong>not</strong> natively supported +by CodeIgniter. You could do so like this: +</p> + +<code>$this->db->call_function('<var>get_client_info</var>');</code> + +<p>You must supply the name of the function, <strong>without</strong> the <var>mysql_</var> prefix, in the first parameter. The prefix is added +automatically based on which database driver is currently being used. This permits you to run the same function on different database platforms. +Obviously not all function calls are identical between platforms, so there are limits to how useful this function can be in terms of portability.</p> + +<p>Any parameters needed by the function you are calling will be added to the second parameter.</p> + +<code>$this->db->call_function('<var>some_function</var>', $param1, $param2, etc..);</code> + + +<p>Often, you will either need to supply a database connection ID or a database result ID. The connection ID can be accessed using:</p> + +<code>$this->db->conn_id;</code> + +<p>The result ID can be accessed from within your result object, like this:</p> + +<code>$query = $this->db->query("SOME QUERY");<br /> +<br /> +<var>$query->result_id;</var></code> + + + + + + + + + + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="fields.html">Field MetaData</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="caching.html">Query Caching</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/database/configuration.html b/user_guide/database/configuration.html new file mode 100644 index 0000000..4a7ed6f --- /dev/null +++ b/user_guide/database/configuration.html @@ -0,0 +1,164 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Database Configuration : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +<a href="index.html">Database Library</a> &nbsp;&#8250;&nbsp; +Configuration +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Database Configuration</h1> + +<p>CodeIgniter has a config file that lets you store your database connection values (username, password, database name, etc.). +The config file is located at <samp>application/config/database.php</samp>. You can also set database connection values for specific <a href="../libraries/config.html">environments</a> by placing <strong>database.php</strong> it the respective environment config folder.</p> + +<p>The config settings are stored in a multi-dimensional array with this prototype:</p> + +<code>$db['default']['hostname'] = "localhost";<br /> +$db['default']['username'] = "root";<br /> +$db['default']['password'] = "";<br /> +$db['default']['database'] = "database_name";<br /> +$db['default']['dbdriver'] = "mysql";<br /> +$db['default']['dbprefix'] = "";<br /> +$db['default']['pconnect'] = TRUE;<br /> +$db['default']['db_debug'] = FALSE;<br /> +$db['default']['cache_on'] = FALSE;<br /> +$db['default']['cachedir'] = &quot;&quot;;<br /> +$db['default']['char_set'] = "utf8";<br /> +$db['default']['dbcollat'] = "utf8_general_ci";<br /> +$db['default']['swap_pre'] = "";<br /> +$db['default']['autoinit'] = TRUE;<br /> +$db['default']['stricton'] = FALSE;</code> + +<p>The reason we use a multi-dimensional array rather than a more simple one is to permit you to optionally store +multiple sets of connection values. If, for example, you run multiple environments (development, production, test, etc.) +under a single installation, you can set up a connection group for each, then switch between groups as needed. +For example, to set up a "test" environment you would do this:</p> + +<code>$db['test']['hostname'] = "localhost";<br /> +$db['test']['username'] = "root";<br /> +$db['test']['password'] = "";<br /> +$db['test']['database'] = "database_name";<br /> +$db['test']['dbdriver'] = "mysql";<br /> +$db['test']['dbprefix'] = "";<br /> +$db['test']['pconnect'] = TRUE;<br /> +$db['test']['db_debug'] = FALSE;<br /> +$db['test']['cache_on'] = FALSE;<br /> +$db['test']['cachedir'] = &quot;&quot;;<br /> +$db['test']['char_set'] = "utf8";<br /> +$db['test']['dbcollat'] = "utf8_general_ci";<br /> +$db['test']['swap_pre'] = "";<br /> +$db['test']['autoinit'] = TRUE;<br /> +$db['test']['stricton'] = FALSE;</code> + + +<p>Then, to globally tell the system to use that group you would set this variable located in the config file:</p> + +<code>$active_group = "test";</code> + +<p>Note: The name "test" is arbitrary. It can be anything you want. By default we've used the word "default" +for the primary connection, but it too can be renamed to something more relevant to your project.</p> + +<h3>Active Record</h3> + +<p>The <a href="active_record.html">Active Record Class</a> is globally enabled or disabled by setting the $active_record variable in the database configuration file to TRUE/FALSE (boolean). If you are not using the active record class, setting it to FALSE will utilize fewer resources when the database classes are initialized.</p> + +<code>$active_record = TRUE;</code> + +<p class="important"><strong>Note:</strong> that some CodeIgniter classes such as Sessions require Active Records be enabled to access certain functionality.</p> + +<h3>Explanation of Values:</h3> + +<ul> +<li><strong>hostname</strong> - The hostname of your database server. Often this is "localhost".</li> +<li><strong>username</strong> - The username used to connect to the database.</li> +<li><strong>password</strong> - The password used to connect to the database.</li> +<li><strong>database</strong> - The name of the database you want to connect to.</li> +<li><strong>dbdriver</strong> - The database type. ie: mysql, postgres, odbc, etc. Must be specified in lower case.</li> +<li><strong>dbprefix</strong> - An optional table prefix which will added to the table name when running <a href="active_record.html">Active Record</a> queries. This permits multiple CodeIgniter installations to share one database.</li> +<li><strong>pconnect</strong> - TRUE/FALSE (boolean) - Whether to use a persistent connection.</li> +<li><strong>db_debug</strong> - TRUE/FALSE (boolean) - Whether database errors should be displayed.</li> +<li><strong>cache_on</strong> - TRUE/FALSE (boolean) - Whether database query caching is enabled, see also <a href="caching.html">Database Caching Class</a>.</li> +<li><strong>cachedir</strong> - The absolute server path to your database query cache directory.</li> +<li><strong>char_set</strong> - The character set used in communicating with the database.</li> +<li><strong>dbcollat</strong> - The character collation used in communicating with the database. <p class="important"><strong>Note:</strong> For MySQL and MySQLi databases, this setting is only used as a backup if your server is running PHP &lt; 5.2.3 or MySQL &lt; 5.0.7 (and in table creation queries made with DB Forge). There is an incompatibility in PHP with mysql_real_escape_string() which can make your site vulnerable to SQL injection if you are using a multi-byte character set and are running versions lower than these. Sites using Latin-1 or UTF-8 database character set and collation are unaffected.</p></li> +<li><strong>swap_pre</strong> - A default table prefix that should be swapped with <var>dbprefix</var>. This is useful for distributed applications where you might run manually written queries, and need the prefix to still be customizable by the end user.</li> +<li><strong>autoinit</strong> - Whether or not to automatically connect to the database when the library loads. If set to false, the connection will take place prior to executing the first query.</li> +<li><strong>stricton</strong> - TRUE/FALSE (boolean) - Whether to force "Strict Mode" connections, good for ensuring strict SQL while developing an application.</li> +<li><strong>port</strong> - The database port number. To use this value you have to add a line to the database config array.<code>$db['default']['port'] = 5432;</code> +</ul> + +<p class="important"><strong>Note:</strong> Depending on what database platform you are using (MySQL, Postgres, etc.) +not all values will be needed. For example, when using SQLite you will not need to supply a username or password, and +the database name will be the path to your database file. The information above assumes you are using MySQL.</p> + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="examples.html">Quick Start: Usage Examples</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="connecting.html">Connecting to your Database</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/database/connecting.html b/user_guide/database/connecting.html new file mode 100644 index 0000000..a6477fa --- /dev/null +++ b/user_guide/database/connecting.html @@ -0,0 +1,188 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Connecting to your Database : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +<a href="index.html">Database Library</a> &nbsp;&#8250;&nbsp; +Connecting +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Connecting to your Database</h1> + +<p>There are two ways to connect to a database:</p> + +<h2>Automatically Connecting</h2> + +<p>The "auto connect" feature will load and instantiate the database class with every page load. +To enable "auto connecting", add the word <var>database</var> to the library array, as indicated in the following file:</p> + +<p><kbd>application/config/autoload.php</kbd></p> + +<h2>Manually Connecting</h2> + +<p>If only some of your pages require database connectivity you can manually connect to your database by adding this +line of code in any function where it is needed, or in your class constructor to make the database +available globally in that class.</p> + +<code>$this->load->database();</code> + +<p class="important">If the above function does <strong>not</strong> contain any information in the first parameter it will connect +to the group specified in your database config file. For most people, this is the preferred method of use.</p> + +<h3>Available Parameters</h3> + +<ol> + <li>The database connection values, passed either as an array or a DSN string.</li> + <li>TRUE/FALSE (boolean). Whether to return the connection ID (see Connecting to Multiple Databases below).</li> + <li>TRUE/FALSE (boolean). Whether to enable the Active Record class. Set to TRUE by default.</li> +</ol> + + +<h3>Manually Connecting to a Database</h3> + +<p>The first parameter of this function can <strong>optionally</strong> be used to specify a particular database group +from your config file, or you can even submit connection values for a database that is not specified in your config file. +Examples:</p> + +<p>To choose a specific group from your config file you can do this:</p> + +<code>$this->load->database('<samp>group_name</samp>');</code> + +<p>Where <samp>group_name</samp> is the name of the connection group from your config file.</p> + + +<p>To connect manually to a desired database you can pass an array of values:</p> + +<code>$config['hostname'] = "localhost";<br /> +$config['username'] = "myusername";<br /> +$config['password'] = "mypassword";<br /> +$config['database'] = "mydatabase";<br /> +$config['dbdriver'] = "mysql";<br /> +$config['dbprefix'] = "";<br /> +$config['pconnect'] = FALSE;<br /> +$config['db_debug'] = TRUE;<br /> +$config['cache_on'] = FALSE;<br /> +$config['cachedir'] = "";<br /> +$config['char_set'] = "utf8";<br /> +$config['dbcollat'] = "utf8_general_ci";<br /> +<br /> +$this->load->database(<samp>$config</samp>);</code> + +<p>For information on each of these values please see the <a href="configuration.html">configuration page</a>.</p> + +<p>Or you can submit your database values as a Data Source Name. DSNs must have this prototype:</p> + +<code>$dsn = 'dbdriver://username:password@hostname/database';<br /> +<br /> +$this->load->database(<samp>$dsn</samp>);</code> + +<p>To override default config values when connecting with a DSN string, add the config variables as a query string.</p> + +<code>$dsn = 'dbdriver://username:password@hostname/database?char_set=utf8&amp;dbcollat=utf8_general_ci&amp;cache_on=true&amp;cachedir=/path/to/cache';<br /> +<br /> +$this->load->database(<samp>$dsn</samp>);</code> + +<h2>Connecting to Multiple Databases</h2> + +<p>If you need to connect to more than one database simultaneously you can do so as follows:</p> + + +<code>$DB1 = $this->load->database('group_one', TRUE);<br /> +$DB2 = $this->load->database('group_two', TRUE); +</code> + +<p>Note: Change the words "group_one" and "group_two" to the specific group names you are connecting to (or +you can pass the connection values as indicated above).</p> + +<p>By setting the second parameter to TRUE (boolean) the function will return the database object.</p> + +<div class="important"> +<p>When you connect this way, you will use your object name to issue commands rather than the syntax used throughout this guide. In other words, rather than issuing commands with:</p> + +<p>$this->db->query();<br />$this->db->result();<br /> etc...</p> + +<p>You will instead use:</p> + +<p>$DB1->query();<br />$DB1->result();<br /> etc...</p> + +</div> + +<h2>Reconnecting / Keeping the Connection Alive</h2> + +<p>If the database server's idle timeout is exceeded while you're doing some heavy PHP lifting (processing an image, for instance), you should consider pinging the server by using the <dfn>reconnect()</dfn> method before sending further queries, which can gracefully keep the connection alive or re-establish it.</p> + +<code>$this->db->reconnect();</code> + +<h2>Manually closing the Connection</h2> + +<p>While CodeIgniter intelligently takes care of closing your database connections, you can explicitly close the connection.</p> + +<code>$this->db->close();</code> +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="configuration.html">Database Configuration</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="queries.html">Queries</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/database/examples.html b/user_guide/database/examples.html new file mode 100644 index 0000000..3873d8f --- /dev/null +++ b/user_guide/database/examples.html @@ -0,0 +1,217 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Database Quick Start : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +<a href="index.html">Database Library</a> &nbsp;&#8250;&nbsp; +Database Example Code +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Database Quick Start: Example Code</h1> + +<p>The following page contains example code showing how the database class is used. For complete details please +read the individual pages describing each function.</p> + + +<h2>Initializing the Database Class</h2> + +<p>The following code loads and initializes the database class based on your <a href="configuration.html">configuration</a> settings:</p> + +<code>$this->load->database();</code> + +<p>Once loaded the class is ready to be used as described below.</p> + +<p>Note: If all your pages require database access you can connect automatically. See the <a href="connecting.html">connecting</a> page for details.</p> + + +<h2>Standard Query With Multiple Results (Object Version)</h2> + +<code>$query = $this->db->query('SELECT name, title, email FROM my_table');<br /> +<br /> +foreach ($query->result() as $row)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo $row->title;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo $row->name;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo $row->email;<br /> +}<br /> +<br /> +echo 'Total Results: ' . $query->num_rows(); +</code> + +<p>The above <dfn>result()</dfn> function returns an array of <strong>objects</strong>. Example: $row->title</p> + + +<h2>Standard Query With Multiple Results (Array Version)</h2> + +<code>$query = $this->db->query('SELECT name, title, email FROM my_table');<br /> +<br /> +foreach ($query->result_array() as $row)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo $row['title'];<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo $row['name'];<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo $row['email'];<br /> +}</code> + +<p>The above <dfn>result_array()</dfn> function returns an array of standard array indexes. Example: $row['title']</p> + + +<h2>Testing for Results</h2> + +<p>If you run queries that might <strong>not</strong> produce a result, you are encouraged to test for a result first +using the <dfn>num_rows()</dfn> function:</p> + +<code> +$query = $this->db->query("YOUR QUERY");<br /> +<br /> +if ($query->num_rows() > 0)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;foreach ($query->result() as $row)<br /> +&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo $row->title;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo $row->name;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo $row->body;<br /> +&nbsp;&nbsp;&nbsp;}<br /> +} +</code> + + + + +<h2>Standard Query With Single Result</h2> + +<code>$query = $this->db->query('SELECT name FROM my_table LIMIT 1');<br /> +<br /> +$row = $query->row();<br /> +echo $row->name;<br /> +</code> + +<p>The above <dfn>row()</dfn> function returns an <strong>object</strong>. Example: $row->name</p> + + +<h2>Standard Query With Single Result (Array version)</h2> + +<code>$query = $this->db->query('SELECT name FROM my_table LIMIT 1');<br /> +<br /> +$row = $query->row_array();<br /> +echo $row['name'];<br /> +</code> + +<p>The above <dfn>row_array()</dfn> function returns an <strong>array</strong>. Example: $row['name']</p> + + +<h2>Standard Insert</h2> + +<code> +$sql = "INSERT INTO mytable (title, name) <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VALUES (".$this->db->escape($title).", ".$this->db->escape($name).")";<br /> +<br /> +$this->db->query($sql);<br /> +<br /> +echo $this->db->affected_rows(); +</code> + + + + +<h2>Active Record Query</h2> + +<p>The <a href="active_record.html">Active Record Pattern</a> gives you a simplified means of retrieving data:</p> + +<code> +$query = $this->db->get('table_name');<br /> +<br /> +foreach ($query->result() as $row)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo $row->title;<br /> +}</code> + +<p>The above <dfn>get()</dfn> function retrieves all the results from the supplied table. +The <a href="active_record.html">Active Record</a> class contains a full compliment of functions +for working with data.</p> + + +<h2>Active Record Insert</h2> + +<code> +$data = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'title' => $title,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name' => $name,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'date' => $date<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +$this->db->insert('mytable', $data); +<br /><br /> +// Produces: INSERT INTO mytable (title, name, date) VALUES ('{$title}', '{$name}', '{$date}')</code> + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Database Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="configuration.html">Database Configuration</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/database/fields.html b/user_guide/database/fields.html new file mode 100644 index 0000000..edff8f2 --- /dev/null +++ b/user_guide/database/fields.html @@ -0,0 +1,163 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Field Data : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +<a href="index.html">Database Library</a> &nbsp;&#8250;&nbsp; +Field Names +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Field Data</h1> + + +<h2>$this->db->list_fields()</h2> +<p>Returns an array containing the field names. This query can be called two ways:</p> + + +<p>1. You can supply the table name and call it from the <dfn>$this->db-></dfn> object:</p> + +<code> +$fields = $this->db->list_fields('table_name');<br /><br /> + +foreach ($fields as $field)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;echo $field;<br /> +} +</code> + +<p>2. You can gather the field names associated with any query you run by calling the function +from your query result object:</p> + +<code> +$query = $this->db->query('SELECT * FROM some_table'); +<br /><br /> + +foreach ($query->list_fields() as $field)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;echo $field;<br /> +} +</code> + + +<h2>$this->db->field_exists()</h2> + +<p>Sometimes it's helpful to know whether a particular field exists before performing an action. +Returns a boolean TRUE/FALSE. Usage example:</p> + +<code> +if ($this->db->field_exists('field_name', 'table_name'))<br /> +{<br /> +&nbsp;&nbsp; // some code...<br /> +} +</code> + +<p>Note: Replace <em>field_name</em> with the name of the column you are looking for, and replace +<em>table_name</em> with the name of the table you are looking for.</p> + + +<h2>$this->db->field_data()</h2> +<p>Returns an array of objects containing field information.</p> +<p>Sometimes it's helpful to gather the field names or other metadata, like the column type, max length, etc.</p> + + +<p class="important">Note: Not all databases provide meta-data.</p> + +<p>Usage example:</p> + +<code> +$fields = $this->db->field_data('table_name');<br /><br /> + +foreach ($fields as $field)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;echo $field->name;<br /> +&nbsp;&nbsp;&nbsp;echo $field->type;<br /> +&nbsp;&nbsp;&nbsp;echo $field->max_length;<br /> +&nbsp;&nbsp;&nbsp;echo $field->primary_key;<br /> +} +</code> + +<p>If you have run a query already you can use the result object instead of supplying the table name:</p> + +<code> +$query = $this->db->query("YOUR QUERY");<br /> +$fields = $query->field_data(); +</code> + + +<p>The following data is available from this function if supported by your database:</p> + +<ul> +<li>name - column name</li> +<li>max_length - maximum length of the column</li> +<li>primary_key - 1 if the column is a primary key</li> +<li>type - the type of the column</li> +</ul> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="table_data.html"> Table Data</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="call_function.html">Custom Function Calls</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/database/forge.html b/user_guide/database/forge.html new file mode 100644 index 0000000..ddeab9d --- /dev/null +++ b/user_guide/database/forge.html @@ -0,0 +1,234 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Database Forge Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +<a href="index.html">Database Library</a> &nbsp;&#8250;&nbsp; +Database Forge Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Database Forge Class</h1> + +<p>The Database Forge Class contains functions that help you manage your database.</p> + +<h3>Table of Contents</h3> + +<ul> +<li><a href="#init">Initializing the Forge Class</a></li> +<li><a href="#create">Creating a Database</a></li> +<li><a href="#drop">Dropping a Database</a></li> +<li><a href="#add_field">Adding Fields</a></li> +<li><a href="#add_key">Adding Keys</a></li> +<li><a href="#create_table">Creating a Table</a></li> +<li><a href="#drop_table">Dropping a Table</a></li> +<li><a href="#rename_table">Renaming a Table</a></li> +<li><a href="#modifying_tables">Modifying a Table</a></li> +</ul> + + +<h2><a name="init"></a>Initializing the Forge Class</h2> + +<p class="important"><strong>Important:</strong>&nbsp; In order to initialize the Forge class, your database driver must +already be running, since the forge class relies on it.</p> + +<p>Load the Forge Class as follows:</p> + +<code>$this->load->dbforge()</code> + +<p>Once initialized you will access the functions using the <dfn>$this->dbforge</dfn> object:</p> + +<code>$this->dbforge->some_function()</code> +<h2><a name="create"></a>$this->dbforge->create_database('db_name')</h2> + +<p>Permits you to create the database specified in the first parameter. Returns TRUE/FALSE based on success or failure:</p> + +<code>if ($this->dbforge->create_database('my_db'))<br /> +{<br /> +&nbsp;&nbsp;&nbsp; echo 'Database created!';<br /> +}</code> + + + + +<h2><a name="drop"></a>$this->dbforge->drop_database('db_name')</h2> + +<p>Permits you to drop the database specified in the first parameter. Returns TRUE/FALSE based on success or failure:</p> + +<code>if ($this->dbforge->drop_database('my_db'))<br /> +{<br /> +&nbsp;&nbsp;&nbsp; echo 'Database deleted!';<br /> +}</code> + + +<h1>Creating and Dropping Tables</h1> +<p>There are several things you may wish to do when creating tables. Add fields, add keys to the table, alter columns. CodeIgniter provides a mechanism for this.</p> +<h2><a name="add_field" id="add_field"></a>Adding fields</h2> +<p>Fields are created via an associative array. Within the array you must include a 'type' key that relates to the datatype of the field. For example, INT, VARCHAR, TEXT, etc. Many datatypes (for example VARCHAR) also require a 'constraint' key.</p> +<p><code>$fields = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'users' =&gt; array(<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt; 'VARCHAR',<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'constraint' =&gt; '100',<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> + <br /> +// will translate to &quot;users VARCHAR(100)&quot; when the field is added.</code></p> +<p>Additionally, the following key/values can be used:</p> +<ul> + <li>unsigned/true : to generate &quot;UNSIGNED&quot; in the field definition.</li> + <li>default/value : to generate a default value in the field definition.</li> + <li>null/true : to generate &quot;NULL&quot; in the field definition. Without this, the field will default to &quot;NOT NULL&quot;.</li> + <li>auto_increment/true : generates an auto_increment flag on the field. Note that the field type must be a type that supports this, such as integer.</li> + </ul> +<p><code>$fields = array(<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'blog_id' =&gt; array(<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt; 'INT',<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'constraint' =&gt; 5, <br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'unsigned' =&gt; TRUE,<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'auto_increment' =&gt; TRUE<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'blog_title' =&gt; array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt; 'VARCHAR',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'constraint' =&gt; '100',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'blog_author' =&gt; array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt;'VARCHAR',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'constraint' =&gt; '100',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'default' =&gt; 'King of Town',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'blog_description' =&gt; array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt; 'TEXT',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'null' =&gt; TRUE,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +</code></p> +<p>After the fields have been defined, they can be added using <dfn>$this-&gt;dbforge-&gt;add_field($fields);</dfn> followed by a call to the <dfn>create_table()</dfn> function.</p> +<h3>$this-&gt;dbforge-&gt;add_field()</h3> +<p>The add fields function will accept the above array.</p> +<h3>Passing strings as fields</h3> +<p>If you know exactly how you want a field to be created, you can pass the string into the field definitions with add_field()</p> +<p><code>$this-&gt;dbforge-&gt;add_field(&quot;label varchar(100) NOT NULL DEFAULT 'default label'&quot;);</code></p> +<p class="important">Note: Multiple calls to <dfn>add_field()</dfn> are cumulative.</p> +<h3>Creating an id field</h3> +<p>There is a special exception for creating id fields. A field with type id will automatically be assinged as an INT(9) auto_incrementing Primary Key.</p> +<p><code>$this-&gt;dbforge-&gt;add_field('id');<br /> + // gives id INT(9) NOT NULL AUTO_INCREMENT</code></p> +<h2><a name="add_key" id="add_key"></a>Adding Keys</h2> +<p>Generally speaking, you'll want your table to have Keys. This is accomplished with <dfn>$this-&gt;dbforge-&gt;add_key('field')</dfn>. An optional second parameter set to TRUE will make it a primary key. Note that <dfn>add_key()</dfn> must be followed by a call to <dfn>create_table()</dfn>.</p> +<p>Multiple column non-primary keys must be sent as an array. Sample output below is for MySQL.</p> +<p><code>$this-&gt;dbforge-&gt;add_key('blog_id', TRUE);<br /> + // gives PRIMARY KEY `blog_id` (`blog_id`)<br /> + <br /> + $this-&gt;dbforge-&gt;add_key('blog_id', TRUE);<br /> + $this-&gt;dbforge-&gt;add_key('site_id', TRUE);<br /> + // gives PRIMARY KEY `blog_id_site_id` (`blog_id`, `site_id`)<br /> + <br /> + $this-&gt;dbforge-&gt;add_key('blog_name');<br /> + // gives KEY `blog_name` (`blog_name`)<br /> + <br /> + $this-&gt;dbforge-&gt;add_key(array('blog_name', 'blog_label'));<br /> + // gives KEY `blog_name_blog_label` (`blog_name`, `blog_label`)</code></p> +<h2><a name="create_table" id="create_table"></a>Creating a table</h2> +<p>After fields and keys have been declared, you can create a new table with</p> +<p><code>$this-&gt;dbforge-&gt;create_table('table_name');<br /> +// gives CREATE TABLE table_name</code></p> +<p>An optional second parameter set to TRUE adds an &quot;IF NOT EXISTS&quot; clause into the definition</p> +<p><code>$this-&gt;dbforge-&gt;create_table('table_name', TRUE);<br /> +// gives CREATE TABLE IF NOT EXISTS table_name</code></p> +<h2><a name="drop_table" id="drop_table"></a>Dropping a table</h2> +<p>Executes a DROP TABLE sql</p> +<p><code>$this-&gt;dbforge-&gt;drop_table('table_name');<br /> + // gives DROP TABLE IF EXISTS table_name</code></p> +<h2><a name="rename_table" id="rename_table"></a>Renaming a table</h2> +<p>Executes a TABLE rename</p> +<p><code>$this-&gt;dbforge-&gt;rename_table('old_table_name', 'new_table_name');<br /> + // gives ALTER TABLE old_table_name RENAME TO new_table_name</code></p> +<h1><a name="modifying_tables" id="modifying_tables"></a>Modifying Tables</h1> +<h2>$this-&gt;dbforge-&gt;add_column()</h2> +<p>The add_column() function is used to modify an existing table. It accepts the same field array as above, and can be used for an unlimited number of additional fields.</p> +<p><code>$fields = array(<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'preferences' =&gt; array('type' =&gt; 'TEXT')<br /> +);<br /> +$this-&gt;dbforge-&gt;add_column('table_name', $fields);<br /> +<br /> +// gives ALTER TABLE table_name ADD preferences TEXT</code></p> +<h2>$this-&gt;dbforge-&gt;drop_column()</h2> +<p>Used to remove a column from a table. </p> +<p><code>$this-&gt;dbforge-&gt;drop_column('table_name', 'column_to_drop');</code></p> +<h2>$this-&gt;dbforge-&gt;modify_column()</h2> +<p>The usage of this function is identical to add_column(), except it alters an existing column rather than adding a new one. In order to change the name you can add a &quot;name&quot; key into the field defining array.</p> +<p><code>$fields = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'old_name' =&gt; array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name' =&gt; 'new_name',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt; 'TEXT',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +);<br /> +$this-&gt;dbforge-&gt;modify_column('table_name', $fields);<br /> + <br /> + // gives ALTER TABLE table_name CHANGE old_name new_name TEXT </code></p> +<p>&nbsp;</p> +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="caching.html">DB Caching Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="utilities.html">Database Utilities Class</a><a href="../libraries/email.html"></a></p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/database/helpers.html b/user_guide/database/helpers.html new file mode 100644 index 0000000..0e8bc8a --- /dev/null +++ b/user_guide/database/helpers.html @@ -0,0 +1,151 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Query Helper Functions : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +<a href="index.html">Database Library</a> &nbsp;&#8250;&nbsp; +Query Helpers +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + + + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Query Helper Functions</h1> + + +<h2>$this->db->insert_id()</h2> +<p>The insert ID number when performing database inserts.</p> + +<h2>$this->db->affected_rows()</h2> +<p>Displays the number of affected rows, when doing "write" type queries (insert, update, etc.).</p> +<p>Note: In MySQL "DELETE FROM TABLE" returns 0 affected rows. The database class has a small hack that allows it to return the +correct number of affected rows. By default this hack is enabled but it can be turned off in the database driver file.</p> + + +<h2>$this->db->count_all();</h2> +<p>Permits you to determine the number of rows in a particular table. Submit the table name in the first parameter. Example:</p> +<code>echo $this->db->count_all('<var>my_table</var>');<br /> +<br /> +// Produces an integer, like 25 +</code> + + +<h2>$this->db->platform()</h2> +<p>Outputs the database platform you are running (MySQL, MS SQL, Postgres, etc...):</p> +<code>echo $this->db->platform();</code> + + +<h2>$this->db->version()</h2> +<p>Outputs the database version you are running:</p> +<code>echo $this->db->version();</code> + + +<h2>$this->db->last_query();</h2> +<p>Returns the last query that was run (the query string, not the result). Example:</p> + +<code>$str = $this->db->last_query();<br /> +<br /> +// Produces: SELECT * FROM sometable.... +</code> + + +<p>The following two functions help simplify the process of writing database INSERTs and UPDATEs.</p> + + +<h2>$this->db->insert_string(); </h2> +<p>This function simplifies the process of writing database inserts. It returns a correctly formatted SQL insert string. Example:</p> + +<code>$data = array('name' => $name, 'email' => $email, 'url' => $url);<br /> +<br /> +$str = $this->db->insert_string('table_name', $data); +</code> + +<p>The first parameter is the table name, the second is an associative array with the data to be inserted. The above example produces:</p> +<code>INSERT INTO table_name (name, email, url) VALUES ('Rick', 'rick@example.com', 'example.com')</code> + +<p class="important">Note: Values are automatically escaped, producing safer queries.</p> + + + +<h2>$this->db->update_string(); </h2> +<p>This function simplifies the process of writing database updates. It returns a correctly formatted SQL update string. Example:</p> + +<code>$data = array('name' => $name, 'email' => $email, 'url' => $url);<br /> +<br /> +$where = "author_id = 1 AND status = 'active'"; +<br /><br /> +$str = $this->db->update_string('table_name', $data, $where); +</code> + +<p>The first parameter is the table name, the second is an associative array with the data to be updated, and the third parameter is the "where" clause. The above example produces:</p> +<code> UPDATE table_name SET name = 'Rick', email = 'rick@example.com', url = 'example.com' WHERE author_id = 1 AND status = 'active'</code> + +<p class="important">Note: Values are automatically escaped, producing safer queries.</p> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="results.html">Query Results</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="active_record.html">Active Record Pattern</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/database/index.html b/user_guide/database/index.html new file mode 100644 index 0000000..0420b02 --- /dev/null +++ b/user_guide/database/index.html @@ -0,0 +1,99 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>The Database Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Database Library +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>The Database Class</h1> + +<p>CodeIgniter comes with a full-featured and very fast abstracted database class that supports both traditional +structures and Active Record patterns. The database functions offer clear, simple syntax.</p> + + <ul> + <li><a href="examples.html">Quick Start: Usage Examples</a></li> + <li><a href="configuration.html">Database Configuration</a></li> + <li><a href="connecting.html">Connecting to a Database</a></li> + <li><a href="queries.html">Running Queries</a></li> + <li><a href="results.html">Generating Query Results</a></li> + <li><a href="helpers.html">Query Helper Functions</a></li> + <li><a href="active_record.html">Active Record Class</a></li> + <li><a href="transactions.html">Transactions</a></li> + <li><a href="table_data.html">Table MetaData</a></li> + <li><a href="fields.html">Field MetaData</a></li> + <li><a href="call_function.html">Custom Function Calls</a></li> + <li><a href="caching.html">Query Caching</a></li> + <li><a href="forge.html">Database manipulation with Database Forge</a></li> + <li><a href="utilities.html">Database Utilities Class</a></li> + </ul> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="../libraries/caching.html">Caching Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="examples.html">Quick Start: Usage Examples</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/database/queries.html b/user_guide/database/queries.html new file mode 100644 index 0000000..0158756 --- /dev/null +++ b/user_guide/database/queries.html @@ -0,0 +1,160 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Queries : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +<a href="index.html">Database Library</a> &nbsp;&#8250;&nbsp; +Queries +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + + + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Queries</h1> + +<h2>$this->db->query();</h2> + +<p>To submit a query, use the following function:</p> + +<code>$this->db->query('YOUR QUERY HERE');</code> + +<p>The <dfn>query()</dfn> function returns a database result <strong>object</strong> when "read" type queries are run, +which you can use to <a href="results.html">show your results</a>. When "write" type queries are run it simply returns TRUE or FALSE +depending on success or failure. When retrieving data you will typically assign the query to your own variable, like this:</p> + +<code><var>$query</var> = $this->db->query('YOUR QUERY HERE');</code> + +<h2>$this->db->simple_query();</h2> + +<p>This is a simplified version of the <dfn>$this->db->query()</dfn> function. It ONLY returns TRUE/FALSE on success or failure. +It DOES NOT return a database result set, nor does it set the query timer, or compile bind data, or store your query for debugging. +It simply lets you submit a query. Most users will rarely use this function.</p> + + +<h1>Working with Database prefixes manually</h1> +<p>If you have configured a database prefix and would like to prepend it to a table name for use in a native SQL query for example, then you can use the following:</p> +<p><code>$this-&gt;db-&gt;dbprefix('tablename');<br /> +// outputs prefix_tablename</code></p> + +<p>If for any reason you would like to change the prefix programatically without needing to create a new connection, you can use this method:</p> +<p><code>$this-&gt;db-&gt;set_dbprefix('newprefix');<br /><br /> +$this-&gt;db-&gt;dbprefix('tablename');<br /> +// outputs newprefix_tablename</code></p> + + +<h1>Protecting identifiers</h1> +<p>In many databases it is advisable to protect table and field names - for example with backticks in MySQL. <strong>Active Record queries are automatically protected</strong>, however if you need to manually protect an identifier you can use:</p> +<p><code>$this-&gt;db-&gt;protect_identifiers('table_name');</code></p> + +<p class="important">Although Active Record will try its best to properly quote any field and table names that you feed it, note that it is NOT designed to work with arbitrary user input. DO NOT feed it with unsanitized user data.</p> + +<p>This function will also add a table prefix to your table, assuming you have a prefix specified in your database config file. To enable the prefixing set <kbd>TRUE</kbd> (boolen) via the second parameter:</p> +<p><code>$this-&gt;db-&gt;protect_identifiers('table_name', <kbd>TRUE</kbd>);</code></p> + + +<h1>Escaping Queries</h1> +<p>It's a very good security practice to escape your data before submitting it into your database. +CodeIgniter has three methods that help you do this:</p> + +<ol> +<li><strong>$this->db->escape()</strong> This function determines the data type so that it +can escape only string data. It also automatically adds single quotes around the data so you don't have to: + +<code>$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";</code></li> + +<li><strong>$this->db->escape_str()</strong> This function escapes the data passed to it, regardless of type. +Most of the time you'll use the above function rather than this one. Use the function like this: + +<code>$sql = "INSERT INTO table (title) VALUES('".$this->db->escape_str($title)."')";</code></li> + +<li><strong>$this->db->escape_like_str()</strong> This method should be used when strings are to be used in LIKE +conditions so that LIKE wildcards ('%', '_') in the string are also properly escaped. + +<code>$search = '20% raise';<br /> +$sql = "SELECT id FROM table WHERE column LIKE '%".$this->db->escape_like_str($search)."%'";</code></li> + +</ol> + + +<h1>Query Bindings</h1> + + +<p>Bindings enable you to simplify your query syntax by letting the system put the queries together for you. Consider the following example:</p> + +<code> +$sql = "SELECT * FROM some_table WHERE id = <var>?</var> AND status = <var>?</var> AND author = <var>?</var>"; +<br /><br /> +$this->db->query($sql, array(3, 'live', 'Rick')); +</code> + +<p>The question marks in the query are automatically replaced with the values in the array in the second parameter of the query function.</p> +<p class="important">The secondary benefit of using binds is that the values are automatically escaped, producing safer queries. You don't have to remember to manually escape data; the engine does it automatically for you.</p> + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="connecting.html">Connecting to your Database</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="results.html">Query Results</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/database/results.html b/user_guide/database/results.html new file mode 100644 index 0000000..27c8765 --- /dev/null +++ b/user_guide/database/results.html @@ -0,0 +1,259 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Generating Query Results : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +<a href="index.html">Database Library</a> &nbsp;&#8250;&nbsp; +Query Results +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + + +<h1>Generating Query Results</h1> + + +<p>There are several ways to generate query results:</p> + + <h2>result()</h2> + + <p>This function returns the query result as an array of <strong>objects</strong>, or <strong>an empty array</strong> on failure. + + Typically you'll use this in a foreach loop, like this:</p> + + <code> + $query = $this->db->query("YOUR QUERY");<br /> + <br /> + foreach ($query->result() as $row)<br /> + {<br /> + &nbsp;&nbsp;&nbsp;echo $row->title;<br /> + &nbsp;&nbsp;&nbsp;echo $row->name;<br /> + &nbsp;&nbsp;&nbsp;echo $row->body;<br /> + }</code> + + <p>The above <dfn>function</dfn> is an alias of <dfn>result_object()</dfn>.</p> + + <p>If you run queries that might <strong>not</strong> produce a result, you are encouraged to test the result first:</p> + + <code> + $query = $this->db->query("YOUR QUERY");<br /> + <br /> + if ($query->num_rows() > 0)<br /> + {<br /> + &nbsp;&nbsp;&nbsp;foreach ($query->result() as $row)<br /> + &nbsp;&nbsp;&nbsp;{<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo $row->title;<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo $row->name;<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo $row->body;<br /> + &nbsp;&nbsp;&nbsp;}<br /> + } + </code> + + <p>You can also pass a string to result() which represents a class to instantiate for each result object (note: this class must be loaded)</p> + + <code> + $query = $this->db->query("SELECT * FROM users;");<br /> + <br /> + foreach ($query->result('User') as $row)<br /> + {<br /> + &nbsp;&nbsp;&nbsp;echo $row->name; // call attributes<br /> + &nbsp;&nbsp;&nbsp;echo $row->reverse_name(); // or methods defined on the 'User' class<br /> + } + </code> + + <h2>result_array()</h2> + + <p>This function returns the query result as a pure array, or an empty array when no result is produced. Typically you'll use this in a foreach loop, like this:</p> + <code> + $query = $this->db->query("YOUR QUERY");<br /> + <br /> + foreach ($query->result_array() as $row)<br /> + {<br /> + &nbsp;&nbsp;&nbsp;echo $row['title'];<br /> + &nbsp;&nbsp;&nbsp;echo $row['name'];<br /> + &nbsp;&nbsp;&nbsp;echo $row['body'];<br /> + }</code> + + + <h2>row()</h2> + + <p>This function returns a single result row. If your query has more than one row, it returns only the first row. + The result is returned as an <strong>object</strong>. Here's a usage example:</p> + <code> + $query = $this->db->query("YOUR QUERY");<br /> + <br /> + if ($query->num_rows() > 0)<br /> + {<br /> + &nbsp;&nbsp;&nbsp;$row = $query->row(); + <br /><br /> + &nbsp;&nbsp;&nbsp;echo $row->title;<br /> + &nbsp;&nbsp;&nbsp;echo $row->name;<br /> + &nbsp;&nbsp;&nbsp;echo $row->body;<br /> + } + </code> + + <p>If you want a specific row returned you can submit the row number as a digit in the first parameter:</p> + + <code>$row = $query->row(<dfn>5</dfn>);</code> + + <p>You can also add a second String parameter, which is the name of a class to instantiate the row with:</p> + + <code> + $query = $this->db->query("SELECT * FROM users LIMIT 1;");<br /> + <br /> + $query->row(0, 'User')<br /> + echo $row->name; // call attributes<br /> + echo $row->reverse_name(); // or methods defined on the 'User' class<br /> + </code> + + <h2>row_array()</h2> + + <p>Identical to the above <var>row()</var> function, except it returns an array. Example:</p> + + <code> + $query = $this->db->query("YOUR QUERY");<br /> + <br /> + if ($query->num_rows() > 0)<br /> + {<br /> + &nbsp;&nbsp;&nbsp;$row = $query->row_array(); + <br /><br /> + &nbsp;&nbsp;&nbsp;echo $row['title'];<br /> + &nbsp;&nbsp;&nbsp;echo $row['name'];<br /> + &nbsp;&nbsp;&nbsp;echo $row['body'];<br /> + } + </code> + + + <p>If you want a specific row returned you can submit the row number as a digit in the first parameter:</p> + + <code>$row = $query->row_array(<dfn>5</dfn>);</code> + + + <p>In addition, you can walk forward/backwards/first/last through your results using these variations:</p> + +<p> + <strong>$row = $query->first_row()</strong><br /> + <strong>$row = $query->last_row()</strong><br /> + <strong>$row = $query->next_row()</strong><br /> + <strong>$row = $query->previous_row()</strong> +</p> + +<p>By default they return an object unless you put the word "array" in the parameter:</p> + +<p> + <strong>$row = $query->first_row('array')</strong><br /> + <strong>$row = $query->last_row('array')</strong><br /> + <strong>$row = $query->next_row('array')</strong><br /> + <strong>$row = $query->previous_row('array')</strong> +</p> + + + +<h1>Result Helper Functions</h1> + + +<h2>$query->num_rows()</h2> +<p>The number of rows returned by the query. Note: In this example, <dfn>$query</dfn> is the variable that the query result object is assigned to:</p> + +<code>$query = $this->db->query('SELECT * FROM my_table');<br /><br /> +echo $query->num_rows(); +</code> + +<h2>$query->num_fields()</h2> +<p>The number of FIELDS (columns) returned by the query. Make sure to call the function using your query result object:</p> + +<code>$query = $this->db->query('SELECT * FROM my_table');<br /><br /> +echo $query->num_fields(); +</code> + + + +<h2>$query->free_result()</h2> +<p>It frees the memory associated with the result and deletes the result resource ID. Normally PHP frees its memory automatically at the end of script +execution. However, if you are running a lot of queries in a particular script you might want to free the result after each query result has been +generated in order to cut down on memory consumptions. Example: +</p> + +<code>$query = $this->db->query('SELECT title FROM my_table');<br /><br /> +foreach ($query->result() as $row)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;echo $row->title;<br /> +}<br /> +$query->free_result(); // The $query result object will no longer be available<br /> +<br /> +$query2 = $this->db->query('SELECT name FROM some_table');<br /><br /> +$row = $query2->row();<br /> +echo $row->name;<br /> +$query2->free_result(); // The $query2 result object will no longer be available +</code> + + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="queries.html">Queries</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="helpers.html">Query Helper Functions</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/database/table_data.html b/user_guide/database/table_data.html new file mode 100644 index 0000000..f3040f4 --- /dev/null +++ b/user_guide/database/table_data.html @@ -0,0 +1,113 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Table Data : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +<a href="index.html">Database Library</a> &nbsp;&#8250;&nbsp; +Table Data +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + + +<h1>Table Data</h1> + +<p>These functions let you fetch table information.</p> + +<h2>$this->db->list_tables();</h2> + +<p>Returns an array containing the names of all the tables in the database you are currently connected to. Example:</p> + +<code>$tables = $this->db->list_tables();<br /> +<br /> +foreach ($tables as $table)<br /> +{<br /> +&nbsp;&nbsp; echo $table;<br /> +} +</code> + + +<h2>$this->db->table_exists();</h2> + +<p>Sometimes it's helpful to know whether a particular table exists before running an operation on it. +Returns a boolean TRUE/FALSE. Usage example:</p> + +<code> +if ($this->db->table_exists('table_name'))<br /> +{<br /> +&nbsp;&nbsp; // some code...<br /> +} +</code> + +<p>Note: Replace <em>table_name</em> with the name of the table you are looking for.</p> + + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="transactions.html"> Transactions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="fields.html"> Field Metadata</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/database/transactions.html b/user_guide/database/transactions.html new file mode 100644 index 0000000..6bcd3eb --- /dev/null +++ b/user_guide/database/transactions.html @@ -0,0 +1,200 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Transactions : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +<a href="index.html">Database Library</a> &nbsp;&#8250;&nbsp; +Transactions +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Transactions</h1> + +<p>CodeIgniter's database abstraction allows you to use <dfn>transactions</dfn> with databases that support transaction-safe table types. In MySQL, you'll need +to be running InnoDB or BDB table types rather than the more common MyISAM. Most other database platforms support transactions natively.</p> + +<p>If you are not familiar with +transactions we recommend you find a good online resource to learn about them for your particular database. The information below assumes you +have a basic understanding of transactions. +</p> + +<h2>CodeIgniter's Approach to Transactions</h2> + +<p>CodeIgniter utilizes an approach to transactions that is very similar to the process used by the popular database class ADODB. We've chosen that approach +because it greatly simplifies the process of running transactions. In most cases all that is required are two lines of code.</p> + +<p>Traditionally, transactions have required a fair amount of work to implement since they demand that you to keep track of your queries +and determine whether to <dfn>commit</dfn> or <dfn>rollback</dfn> based on the success or failure of your queries. This is particularly cumbersome with +nested queries. In contrast, +we've implemented a smart transaction system that does all this for you automatically (you can also manage your transactions manually if you choose to, +but there's really no benefit).</p> + +<h2>Running Transactions</h2> + +<p>To run your queries using transactions you will use the <dfn>$this->db->trans_start()</dfn> and <dfn>$this->db->trans_complete()</dfn> functions as follows:</p> + +<code> +<kbd>$this->db->trans_start();</kbd><br /> +$this->db->query('AN SQL QUERY...');<br /> +$this->db->query('ANOTHER QUERY...');<br /> +$this->db->query('AND YET ANOTHER QUERY...');<br /> +<kbd>$this->db->trans_complete();</kbd> +</code> + +<p>You can run as many queries as you want between the start/complete functions and they will all be committed or rolled back based on success or failure +of any given query.</p> + + +<h2>Strict Mode</h2> + +<p>By default CodeIgniter runs all transactions in <dfn>Strict Mode</dfn>. When strict mode is enabled, if you are running multiple groups of +transactions, if one group fails all groups will be rolled back. If strict mode is disabled, each group is treated independently, meaning +a failure of one group will not affect any others.</p> + +<p>Strict Mode can be disabled as follows:</p> + +<code>$this->db->trans_strict(FALSE);</code> + + +<h2>Managing Errors</h2> + +<p>If you have error reporting enabled in your <dfn>config/database.php</dfn> file you'll see a standard error message if the commit was unsuccessful. If debugging is turned off, you can +manage your own errors like this:</p> + +<code> +$this->db->trans_start();<br /> +$this->db->query('AN SQL QUERY...');<br /> +$this->db->query('ANOTHER QUERY...');<br /> +$this->db->trans_complete();<br /> +<br /> +if (<kbd>$this->db->trans_status()</kbd> === FALSE)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;// generate an error... or use the log_message() function to log your error<br /> +} +</code> + + +<h2>Enabling Transactions</h2> + +<p>Transactions are enabled automatically the moment you use <dfn>$this->db->trans_start()</dfn>. If you would like to disable transactions you +can do so using <dfn>$this->db->trans_off()</dfn>:</p> + +<code> +<kbd>$this->db->trans_off()</kbd><br /><br /> + +$this->db->trans_start();<br /> +$this->db->query('AN SQL QUERY...');<br /> +$this->db->trans_complete(); +</code> + +<p class="important">When transactions are disabled, your queries will be auto-commited, just as they are when running queries without transactions.</p> + + +<h2>Test Mode</h2> + +<p>You can optionally put the transaction system into "test mode", which will cause your queries to be rolled back -- even if the queries produce a valid result. +To use test mode simply set the first parameter in the <dfn>$this->db->trans_start()</dfn> function to <samp>TRUE</samp>:</p> + +<code> +$this->db->trans_start(<samp>TRUE</samp>); // Query will be rolled back<br /> +$this->db->query('AN SQL QUERY...');<br /> +$this->db->trans_complete(); +</code> + + +<h2>Running Transactions Manually</h2> + +<p>If you would like to run transactions manually you can do so as follows:</p> + +<code> +$this->db->trans_begin();<br /><br /> + +$this->db->query('AN SQL QUERY...');<br /> +$this->db->query('ANOTHER QUERY...');<br /> +$this->db->query('AND YET ANOTHER QUERY...');<br /> + +<br /> + +if ($this->db->trans_status() === FALSE)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$this->db->trans_rollback();<br /> +}<br /> +else<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$this->db->trans_commit();<br /> +}<br /> +</code> + +<p class="important"><strong>Note:</strong> Make sure to use <kbd>$this->db->trans_begin()</kbd> when running manual transactions, <strong>NOT</strong> +<dfn>$this->db->trans_start()</dfn>.</p> + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp; <a href="fields.html">Field MetaData</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="table_data.html">Table Metadata</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/database/utilities.html b/user_guide/database/utilities.html new file mode 100644 index 0000000..79b53e0 --- /dev/null +++ b/user_guide/database/utilities.html @@ -0,0 +1,314 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Database Utility Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +<a href="index.html">Database Library</a> &nbsp;&#8250;&nbsp; +Database Utility Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Database Utility Class</h1> + +<p>The Database Utility Class contains functions that help you manage your database.</p> + +<h3>Table of Contents</h3> + +<ul> +<li><a href="#init">Initializing the Utility Class</a></li> +<li><a href="#list">Listing your Databases</a></li> +<li><a href="#exists">Checking for a specific Database</a></li> +<li><a href="#opttb">Optimizing your Tables</a></li> +<li><a href="#repair">Repairing your Databases</a></li> +<li><a href="#optdb">Optimizing your Database</a></li> +<li><a href="#csv">CSV Files from a Database Result</a></li> +<li><a href="#xml">XML Files from a Database Result</a></li> +<li><a href="#backup">Backing up your Database</a></li> +</ul> + + + +<h2><a name="init"></a>Initializing the Utility Class</h2> + +<p class="important"><strong>Important:</strong>&nbsp; In order to initialize the Utility class, your database driver must +already be running, since the utilities class relies on it.</p> + +<p>Load the Utility Class as follows:</p> + +<code>$this->load->dbutil()</code> + +<p>Once initialized you will access the functions using the <dfn>$this->dbutil</dfn> object:</p> + +<code>$this->dbutil->some_function()</code> + +<h2><a name="list"></a>$this->dbutil->list_databases()</h2> +<p>Returns an array of database names:</p> + +<code> +$dbs = $this->dbutil->list_databases();<br /> +<br /> +foreach ($dbs as $db)<br /> +{<br /> +&nbsp;&nbsp;&nbsp; echo $db;<br /> +}</code> + + +<h2><a name="exists"></a>$this->dbutil->database_exists();</h2> + +<p>Sometimes it's helpful to know whether a particular database exists. +Returns a boolean TRUE/FALSE. Usage example:</p> + +<code> +if ($this->dbutil->database_exists('database_name'))<br /> +{<br /> +&nbsp;&nbsp; // some code...<br /> +} +</code> + +<p>Note: Replace <em>database_name</em> with the name of the table you are looking for. This function is case sensitive.</p> + + + +<h2><a name="opttb"></a>$this->dbutil->optimize_table('table_name');</h2> + +<p class="important"><strong>Note:</strong>&nbsp; This features is only available for MySQL/MySQLi databases.</p> + + +<p>Permits you to optimize a table using the table name specified in the first parameter. Returns TRUE/FALSE based on success or failure:</p> + +<code> +if ($this->dbutil->optimize_table('table_name'))<br /> +{<br /> +&nbsp;&nbsp;&nbsp; echo 'Success!';<br /> +} +</code> + +<p><strong>Note:</strong> Not all database platforms support table optimization.</p> + + +<h2><a name="repair"></a>$this->dbutil->repair_table('table_name');</h2> + +<p class="important"><strong>Note:</strong>&nbsp; This features is only available for MySQL/MySQLi databases.</p> + + +<p>Permits you to repair a table using the table name specified in the first parameter. Returns TRUE/FALSE based on success or failure:</p> + +<code> +if ($this->dbutil->repair_table('table_name'))<br /> +{<br /> +&nbsp;&nbsp;&nbsp; echo 'Success!';<br /> +} +</code> + +<p><strong>Note:</strong> Not all database platforms support table repairs.</p> + + +<h2><a name="optdb"></a>$this->dbutil->optimize_database();</h2> + +<p class="important"><strong>Note:</strong>&nbsp; This features is only available for MySQL/MySQLi databases.</p> + +<p>Permits you to optimize the database your DB class is currently connected to. Returns an array containing the DB status messages or FALSE on failure.</p> + +<code> +$result = $this->dbutil->optimize_database();<br /> +<br /> +if ($result !== FALSE)<br /> +{<br /> +&nbsp;&nbsp;&nbsp; print_r($result);<br /> +} +</code> + +<p><strong>Note:</strong> Not all database platforms support table optimization.</p> + + +<h2><a name="csv"></a>$this->dbutil->csv_from_result($db_result)</h2> + +<p>Permits you to generate a CSV file from a query result. The first parameter of the function must contain the result object from your query. +Example:</p> + +<code> +$this->load->dbutil();<br /> +<br /> +$query = $this->db->query("SELECT * FROM mytable");<br /> +<br /> +echo $this->dbutil->csv_from_result($query); +</code> + +<p>The second and third parameters allows you to +set the delimiter and newline character. By default tabs are used as the delimiter and "\n" is used as a new line. Example:</p> + +<code> +$delimiter = ",";<br /> +$newline = "\r\n";<br /> +<br /> +echo $this->dbutil->csv_from_result($query, $delimiter, $newline); +</code> + +<p><strong>Important:</strong>&nbsp; This function will NOT write the CSV file for you. It simply creates the CSV layout. +If you need to write the file use the <a href="../helpers/file_helper.html">File Helper</a>.</p> + + +<h2><a name="xml"></a>$this->dbutil->xml_from_result($db_result)</h2> + +<p>Permits you to generate an XML file from a query result. The first parameter expects a query result object, the second +may contain an optional array of config parameters. Example:</p> + +<code> +$this->load->dbutil();<br /> +<br /> +$query = $this->db->query("SELECT * FROM mytable");<br /> +<br /> +$config = array (<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'root'&nbsp;&nbsp;&nbsp; => 'root',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'element' => 'element', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'newline' => "\n", <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'tab'&nbsp;&nbsp;&nbsp;&nbsp;=> "\t"<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +echo $this->dbutil->xml_from_result($query, $config); +</code> + +<p><strong>Important:</strong>&nbsp; This function will NOT write the XML file for you. It simply creates the XML layout. +If you need to write the file use the <a href="../helpers/file_helper.html">File Helper</a>.</p> + + +<h2><a name="backup"></a>$this->dbutil->backup()</h2> + +<p>Permits you to backup your full database or individual tables. The backup data can be compressed in either Zip or Gzip format.</p> + +<p class="important"><strong>Note:</strong>&nbsp; This features is only available for MySQL databases.</p> + +<p>Note: Due to the limited execution time and memory available to PHP, backing up very large +databases may not be possible. If your database is very large you might need to backup directly from your SQL server +via the command line, or have your server admin do it for you if you do not have root privileges.</p> + +<h3>Usage Example</h3> + +<code> +<dfn>// Load the DB utility class</dfn><br /> +$this->load->dbutil();<br /><br /> + +<dfn>// Backup your entire database and assign it to a variable</dfn><br /> +$backup =& $this->dbutil->backup(); + +<br /><br /> +<dfn>// Load the file helper and write the file to your server</dfn><br /> +$this->load->helper('file');<br /> +write_file('/path/to/mybackup.gz', $backup); + +<br /><br /> +<dfn>// Load the download helper and send the file to your desktop</dfn><br /> +$this->load->helper('download');<br /> +force_download('mybackup.gz', $backup); +</code> + +<h3>Setting Backup Preferences</h3> + +<p>Backup preferences are set by submitting an array of values to the first parameter of the backup function. Example:</p> + +<code>$prefs = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'tables'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> array('table1', 'table2'),&nbsp;&nbsp;// Array of tables to backup.<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'ignore'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> array(),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// List of tables to omit from the backup<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'format'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> 'txt',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// gzip, zip, txt<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'filename'&nbsp;&nbsp;&nbsp;&nbsp;=> 'mybackup.sql',&nbsp;&nbsp;&nbsp;&nbsp;// File name - NEEDED ONLY WITH ZIP FILES<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'add_drop'&nbsp;&nbsp;&nbsp;&nbsp;=> TRUE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Whether to add DROP TABLE statements to backup file<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'add_insert'&nbsp;&nbsp;=> TRUE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Whether to add INSERT data to backup file<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'newline'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> "\n"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Newline character used in backup file<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +$this->dbutil->backup($prefs); +</code> + + +<h3>Description of Backup Preferences</h3> + +<table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder"> +<tr> +<th>Preference</th> +<th>Default&nbsp;Value</th> +<th>Options</th> +<th>Description</th> +</tr><tr> +<td class="td"><strong>tables</strong></td><td class="td">empty array</td><td class="td">None</td><td class="td">An array of tables you want backed up. If left blank all tables will be exported.</td> +</tr><tr> +<td class="td"><strong>ignore</strong></td><td class="td">empty array</td><td class="td">None</td><td class="td">An array of tables you want the backup routine to ignore.</td> +</tr><tr> +<td class="td"><strong>format</strong></td><td class="td">gzip</td><td class="td">gzip, zip, txt</td><td class="td">The file format of the export file.</td> +</tr><tr> +<td class="td"><strong>filename</strong></td><td class="td">the current date/time</td><td class="td">None</td><td class="td">The name of the backed-up file. The name is needed only if you are using zip compression.</td> +</tr><tr> +<td class="td"><strong>add_drop</strong></td><td class="td">TRUE</td><td class="td">TRUE/FALSE</td><td class="td">Whether to include DROP TABLE statements in your SQL export file.</td> +</tr><tr> +<td class="td"><strong>add_insert</strong></td><td class="td">TRUE</td><td class="td">TRUE/FALSE</td><td class="td">Whether to include INSERT statements in your SQL export file.</td> +</tr><tr> +<td class="td"><strong>newline</strong></td><td class="td">"\n"</td><td class="td">"\n", "\r", "\r\n"</td><td class="td">Type of newline to use in your SQL export file.</td> + +</tr> +</table> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="forge.html">DB Forge Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="../libraries/javascript.html">Javascript Class</a></p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/doc_style/index.html b/user_guide/doc_style/index.html new file mode 100644 index 0000000..1ad3561 --- /dev/null +++ b/user_guide/doc_style/index.html @@ -0,0 +1,87 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Writing Documentation : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Writing Documentation +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Writing Documentation</h1> + +<p>To help facilitate a consistent, easy-to-read documentation style for CodeIgniter projects, EllisLab is making the markup and CSS from the CodeIgniter user guide freely available to the community for their use. For your convenience, a template file has been created that includes the primary blocks of markup used with brief samples.</p> + +<h2>Files</h2> + +<ul> + <li><a href="../userguide.css">Stylesheet</a></li> + <li><a href="./template.html">Page Template</a></li> +</ul> + + +</div> +<!-- END CONTENT --> + + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="../general/styleguide.html">PHP Style Guide</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="../libraries/benchmark.html">Benchmarking Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/doc_style/template.html b/user_guide/doc_style/template.html new file mode 100644 index 0000000..53e5d39 --- /dev/null +++ b/user_guide/doc_style/template.html @@ -0,0 +1,128 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter Project Documentation Template</title> + +<style type='text/css' media='all'>@import url('./userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"></div></div> +<div id="nav2"><a name="top">&nbsp;</a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>Project Title</h1></td> +<td id="breadcrumb_right"><a href="#">Right Breadcrumb</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://example.com/">Project Home</a> &nbsp;&#8250;&nbsp; +<a href="#">User Guide Home</a> &nbsp;&#8250;&nbsp; +Foo Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="example.com/user_guide/" />Search Project User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Foo Class</h1> + +<p>Brief description of Foo Class. If it extends a native CodeIgniter class, please link to the class in the CodeIgniter documents here.</p> + +<p class="important"><strong>Important:</strong>&nbsp; This is an important note with <kbd>EMPHASIS</kbd>.</p> + +<p>Features:</p> + +<ul> + <li>Foo</li> + <li>Bar</li> +</ul> + +<h2>Usage Heading</h2> + +<p>Within a text string, <var>highlight variables</var> using <var>&lt;var&gt;&lt;/var&gt;</var> tags, and <dfn>highlight code</dfn> using the <dfn>&lt;dfn&gt;&lt;/dfn&gt;</dfn> tags.</p> + +<h3>Sub-heading</h3> + +<p>Put code examples within <dfn>&lt;code&gt;&lt;/code&gt;</dfn> tags:</p> + +<code> + $this->load->library('foo');<br /> + <br /> + $this->foo->bar('bat'); +</code> + + +<h2>Table Preferences</h2> + +<p>Use tables where appropriate for long lists of preferences.</p> + + +<table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder"> +<tr> + <th>Preference</th> + <th>Default&nbsp;Value</th> + <th>Options</th> + <th>Description</th> +</tr> +<tr> + <td class="td"><strong>foo</strong></td> + <td class="td">Foo</td> + <td class="td">None</td> + <td class="td">Description of foo.</td> +</tr> +<tr> + <td class="td"><strong>bar</strong></td> + <td class="td">Bar</td> + <td class="td">bat, bag, or bak</td> + <td class="td">Description of bar.</td> +</tr> +</table> + +<h2>Foo Function Reference</h2> + +<h3>$this->foo->bar()</h3> +<p>Description</p> +<code>$this->foo->bar('<var>baz</var>')</code> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="#">Previous Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="#">Next Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/alternative_php.html b/user_guide/general/alternative_php.html new file mode 100644 index 0000000..f8fcc36 --- /dev/null +++ b/user_guide/general/alternative_php.html @@ -0,0 +1,147 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Alternate PHP Syntax for View Files : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Alternate PHP Syntax +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Alternate PHP Syntax for View Files</h1> + +<p>If you do not utilize CodeIgniter's <a href="../libraries/parser.html">template engine</a>, you'll be using pure PHP +in your View files. To minimize the PHP code in these files, and to make it easier to identify the code blocks it is recommended that you use +PHPs alternative syntax for control structures and short tag echo statements. If you are not familiar with this syntax, it allows you to eliminate the braces from your code, +and eliminate "echo" statements.</p> + +<h2>Automatic Short Tag Support</h2> + +<p><strong>Note:</strong> If you find that the syntax described in this page does not work on your server it might +be that "short tags" are disabled in your PHP ini file. CodeIgniter will optionally rewrite short tags on-the-fly, +allowing you to use that syntax even if your server doesn't support it. This feature can be enabled in your +<dfn>config/config.php</dfn> file.</p> + +<p class="important">Please note that if you do use this feature, if PHP errors are encountered +in your <strong>view files</strong>, the error message and line number will not be accurately shown. Instead, all errors +will be shown as <kbd>eval()</kbd> errors.</p> + + +<h2>Alternative Echos</h2> + +<p>Normally to echo, or print out a variable you would do this:</p> + +<code>&lt;?php echo $variable; ?></code> + +<p>With the alternative syntax you can instead do it this way:</p> + +<code>&lt;?=$variable?></code> + + + +<h2>Alternative Control Structures</h2> + +<p>Controls structures, like <var>if</var>, <var>for</var>, <var>foreach</var>, and <var>while</var> can be +written in a simplified format as well. Here is an example using foreach:</p> + +<code> +&lt;ul><br /> +<br /> +<var>&lt;?php foreach ($todo as $item): ?></var><br /> +<br /> +&lt;li><var>&lt;?=$item?></var>&lt;/li><br /> +<br /> +<var>&lt;?php endforeach; ?></var><br /> +<br /> +&lt;/ul></code> + +<p>Notice that there are no braces. Instead, the end brace is replaced with <var>endforeach</var>. +Each of the control structures listed above has a similar closing syntax: +<var>endif</var>, <var>endfor</var>, <var>endforeach</var>, and <var>endwhile</var></p> + +<p>Also notice that instead of using a semicolon after each structure (except the last one), there is a colon. This is +important!</p> + +<p>Here is another example, using if/elseif/else. Notice the colons:</p> + + +<code><var>&lt;?php if ($username == 'sally'): ?></var><br /> +<br /> +&nbsp;&nbsp;&nbsp;&lt;h3>Hi Sally&lt;/h3><br /> +<br /> +<var>&lt;?php elseif ($username == 'joe'): ?></var><br /> +<br /> +&nbsp;&nbsp;&nbsp;&lt;h3>Hi Joe&lt;/h3><br /> +<br /> +<var>&lt;?php else: ?></var><br /> +<br /> +&nbsp;&nbsp;&nbsp;&lt;h3>Hi unknown user&lt;/h3><br /> +<br /> +<var>&lt;?php endif; ?></var></code> + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="managing_apps.html">Managing Applications</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="security.html">Security</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/ancillary_classes.html b/user_guide/general/ancillary_classes.html new file mode 100644 index 0000000..7808b82 --- /dev/null +++ b/user_guide/general/ancillary_classes.html @@ -0,0 +1,117 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Creating Ancillary Classes : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Creating Ancillary Classes +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Creating Ancillary Classes</h1> + +<p>In some cases you may want to develop classes that exist apart from your controllers but have the ability to +utilize all of CodeIgniter's resources. This is easily possible as you'll see.</p> + +<h2>get_instance()</h2> + + +<p><strong>Any class that you instantiate within your controller functions can access CodeIgniter's native resources</strong> simply by using the <kbd>get_instance()</kbd> function. +This function returns the main CodeIgniter object.</p> + +<p>Normally, to call any of the available CodeIgniter functions requires you to use the <kbd>$this</kbd> construct:</p> + +<code> +<strong>$this</strong>->load->helper('url');<br /> +<strong>$this</strong>->load->library('session');<br /> +<strong>$this</strong>->config->item('base_url');<br /> +etc. +</code> + +<p><kbd>$this</kbd>, however, only works within your controllers, your models, or your views. +If you would like to use CodeIgniter's classes from within your own custom classes you can do so as follows:</p> + + +<p>First, assign the CodeIgniter object to a variable:</p> + +<code>$CI =& get_instance();</code> + +<p>Once you've assigned the object to a variable, you'll use that variable <em>instead</em> of <kbd>$this</kbd>:</p> + +<code> +$CI =& get_instance();<br /><br /> +$CI->load->helper('url');<br /> +$CI->load->library('session');<br /> +$CI->config->item('base_url');<br /> +etc. +</code> + +<p class="important"><strong>Note:</strong> You'll notice that the above get_instance() function is being passed by reference: +<br /><br /> +<var>$CI =& get_instance();</var> +<br /><br /> +This is very important. Assigning by reference allows you to use the original CodeIgniter object rather than creating a copy of it.</p> +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="creating_libraries.html">Creating Core Libraries</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="autoloader.html">Auto-loading Resources</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/autoloader.html b/user_guide/general/autoloader.html new file mode 100644 index 0000000..2b86b33 --- /dev/null +++ b/user_guide/general/autoloader.html @@ -0,0 +1,100 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Auto-loading Resources : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Auto-loading Resources +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Auto-loading Resources</h1> + +<p>CodeIgniter comes with an "Auto-load" feature that permits libraries, helpers, and models to be initialized +automatically every time the system runs. If you need certain resources globally throughout your application you should +consider auto-loading them for convenience.</p> + +<p>The following items can be loaded automatically:</p> + +<ul> +<li>Core classes found in the "libraries" folder</li> +<li>Helper files found in the "helpers" folder</li> +<li>Custom config files found in the "config" folder</li> +<li>Language files found in the "system/language" folder </li> +<li>Models found in the &quot;models&quot; folder</li> +</ul> + +<p>To autoload resources, open the <var>application/config/autoload.php</var> file and add the item you want +loaded to the <samp>autoload</samp> array. You'll find instructions in that file corresponding to each +type of item.</p> + +<p class="important"><strong>Note:</strong> Do not include the file extension (.php) when adding items to the autoload array.</p> + + + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="hooks.html">Hooks - Extending the Core</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="common_functions.html">Common Functions</a></p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/caching.html b/user_guide/general/caching.html new file mode 100644 index 0000000..9581fad --- /dev/null +++ b/user_guide/general/caching.html @@ -0,0 +1,115 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Web Page Caching : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Page Caching +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Web Page Caching</h1> + +<p>CodeIgniter lets you cache your pages in order to achieve maximum performance.</p> + +<p>Although CodeIgniter is quite fast, the amount of dynamic information you display in your pages will correlate directly to the +server resources, memory, and processing cycles utilized, which affect your page load speeds. +By caching your pages, since they are saved in their fully rendered state, you can achieve performance that nears that of static web pages.</p> + + +<h2>How Does Caching Work?</h2> + +<p>Caching can be enabled on a per-page basis, and you can set the length of time that a page should remain cached before being refreshed. +When a page is loaded for the first time, the cache file will be written to your <dfn>application/cache</dfn> folder. On subsequent page loads the cache file will be retrieved +and sent to the requesting user's browser. If it has expired, it will be deleted and refreshed before being sent to the browser.</p> + +<p>Note: The Benchmark tag is not cached so you can still view your page load speed when caching is enabled.</p> + +<h2>Enabling Caching</h2> + +<p>To enable caching, put the following tag in any of your controller functions:</p> + +<code>$this->output->cache(<var>n</var>);</code> + +<p>Where <var>n</var> is the number of <strong>minutes</strong> you wish the page to remain cached between refreshes.</p> + +<p>The above tag can go anywhere within a function. It is not affected by the order that it appears, so place it wherever it seems +most logical to you. Once the tag is in place, your pages will begin being cached.</p> + +<p class="important"><strong>Warning:</strong> Because of the way CodeIgniter stores content for output, caching will only work if you are generating display for your controller with a <a href="./views.html">view</a>.</p> +<p class="important"><strong>Note:</strong> Before the cache files can be written you must set the file permissions on your +<dfn>application/cache</dfn> folder such that it is writable.</p> + +<h2>Deleting Caches</h2> + +<p>If you no longer wish to cache a file you can remove the caching tag and it will no longer be refreshed when it expires. Note: +Removing the tag will not delete the cache immediately. It will have to expire normally. If you need to remove it earlier you +will need to manually delete it from your cache folder.</p> + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="errors.html">Error Handling</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="profiling.html">Profiling Your Application</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/cli.html b/user_guide/general/cli.html new file mode 100644 index 0000000..3f62e6f --- /dev/null +++ b/user_guide/general/cli.html @@ -0,0 +1,150 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Running via the CLI : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Running via the CLI +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Running via the CLI</h1> + +<p> + As well as calling an applications <a href="./controllers.html">Controllers</a> via the URL in a browser they can also be loaded via the command-line interface (CLI). +</p> + + +<ul> +<li><a href="#what">What is the CLI?</a></li> +<li><a href="#why">Why use this method?</a></li> +<li><a href="#how">How does it work?</a></li> +</ul> + + +<a name="what"></a> +<h2>What is the CLI?</h2> + +<p><dfn>The command-line interface is a text-based method of interacting with computers.</dfn> For more information, check the <a href="http://en.wikipedia.org/wiki/Command-line_interface">Wikipedia article</a>.</p> + +<a name="why"></a> + +<h2>Why run via the command-line?</h2> + +<p> + There are many reasons for running CodeIgniter from the command-line, but they are not always obvious.</p> + +<ul> + <li>Run your cron-jobs without needing to use wget or curl</li> + <li>Make your cron-jobs inaccessible from being loaded in the URL by checking for <kbd>$this->input->is_cli_request()</kbd></li> + <li>Make interactive "tasks" that can do things like set permissions, prune cache folders, run backups, etc.</li> + <li>Integrate with other applications in other languages. For example, a random C++ script could call one command and run code in your models!</li> +</ul> + +<a name="how"></a> +<h2>Let's try it:&nbsp; Hello World!</h2> + +<p>Let's create a simple controller so you can see it in action. Using your text editor, create a file called <dfn>tools.php</dfn>, and put the following code in it:</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="10"> +&lt;?php +class Tools extends CI_Controller { + + public function message($to = 'World') + { + echo "Hello {$to}!".PHP_EOL; + } +} +?&gt; +</textarea> + +<p>Then save the file to your <dfn>application/controllers/</dfn> folder.</p> + +<p>Now normally you would visit the your site using a URL similar to this:</p> + +<code>example.com/index.php/<var>tools</var>/<var>message</var>/<var>to</var></code> + +<p>Instead, we are going to open Terminal in Mac/Linux or go to Run > "cmd" in Windows and navigate to our CodeIgniter project.</p> + +<blockquote> + $ cd /path/to/project;<br/> + $ php index.php tools message +</blockquote> + +<p>If you did it right, you should see <samp>Hello World!</samp>.</p> + +<blockquote> + $ php index.php tools message "John Smith" +</blockquote> + +<p>Here we are passing it a argument in the same way that URL parameters work. "John Smith" is passed as a argument and output is: <samp>Hello John Smith!</samp>.</p> + +<h2>That's it!</h2> + +<p>That, in a nutshell, is all there is to know about controllers on the command line. Remember that this is just a normal controller, so routing and _remap works fine.</p> + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="urls.html">CodeIgniter URLs</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="reserved_names.html">Reserved Names</a></p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> diff --git a/user_guide/general/common_functions.html b/user_guide/general/common_functions.html new file mode 100644 index 0000000..3ade98f --- /dev/null +++ b/user_guide/general/common_functions.html @@ -0,0 +1,127 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Common Functions : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Auto-loading Resources +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Common Functions</h1> + +<p>CodeIgniter uses a few functions for its operation that are globally defined, and are available to you at any point. These do not require loading any libraries or helpers.</p> + +<h2>is_php('<var>version_number</var>')</h2> + +<p>is_php() determines of the PHP version being used is greater than the supplied <var>version_number</var>.</p> + +<code>if (is_php('5.3.0'))<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$str = quoted_printable_encode($str);<br /> +}</code> + +<p>Returns boolean <kbd>TRUE</kbd> if the installed version of PHP is equal to or greater than the supplied version number. Returns <kbd>FALSE</kbd> if the installed version of PHP is lower than the supplied version number.</p> + + +<h2>is_really_writable('<var>path/to/file</var>')</h2> + +<p>is_writable() returns TRUE on Windows servers when you really can't write to the file as the OS reports to PHP as FALSE only if the read-only attribute is marked. This function determines if a file is actually writable by attempting to write to it first. Generally only recommended on platforms where this information may be unreliable.</p> + +<code>if (is_really_writable('file.txt'))<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;I could write to this if I wanted to&quot;;<br /> +}<br /> +else<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;File is not writable&quot;;<br /> +}</code> + +<h2>config_item('<var>item_key</var>')</h2> +<p>The <a href="../libraries/config.html">Config library</a> is the preferred way of accessing configuration information, however config_item() can be used to retrieve single keys. See Config library documentation for more information.</p> + +<h2>show_error('<var>message</var>'), show_404('<var>page</var>'), log_message('<var>level</var>', '<samp>message</samp>')</h2> +<p>These are each outlined on the <a href="errors.html">Error Handling</a> page.</p> + +<h2>set_status_header(<var>code</var>, '<var>text</var>');</h2> + +<p>Permits you to manually set a server status header. Example:</p> + +<code>set_status_header(401);<br /> +// Sets the header as: Unauthorized</code> + +<p><a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html">See here</a> for a full list of headers.</p> + + +<h2>remove_invisible_characters(<var>$str</var>)</h2> +<p>This function prevents inserting null characters between ascii characters, like Java\0script.</p> + + +<h2>html_escape(<var>$mixed</var>)</h2> +<p>This function provides short cut for htmlspecialchars() function. It accepts string and array. To prevent Cross Site Scripting (XSS), it is very useful.</p> + +</div> + + +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="autoloader.html">Auto-loading Resources</a><a href="hooks.html"></a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="routing.html">URI Routing</a></p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/controllers.html b/user_guide/general/controllers.html new file mode 100644 index 0000000..2d65002 --- /dev/null +++ b/user_guide/general/controllers.html @@ -0,0 +1,388 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Controllers : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Controllers +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Controllers</h1> + +<p>Controllers are the heart of your application, as they determine how HTTP requests should be handled.</p> + + +<ul> +<li><a href="#what">What is a Controller?</a></li> +<li><a href="#hello">Hello World</a></li> +<li><a href="#functions">Functions</a></li> +<li><a href="#passinguri">Passing URI Segments to Your Functions</a></li> +<li><a href="#default">Defining a Default Controller</a></li> +<li><a href="#remapping">Remapping Function Calls</a></li> +<li><a href="#output">Controlling Output Data</a></li> +<li><a href="#private">Private Functions</a></li> +<li><a href="#subfolders">Organizing Controllers into Sub-folders</a></li> +<li><a href="#constructors">Class Constructors</a></li> +<li><a href="#reserved">Reserved Function Names</a></li> +</ul> + + +<a name="what"></a> +<h2>What is a Controller?</h2> + +<p><dfn>A Controller is simply a class file that is named in a way that can be associated with a URI.</dfn></p> + +<p>Consider this URI:</p> + +<code>example.com/index.php/<var>blog</var>/</code> + +<p>In the above example, CodeIgniter would attempt to find a controller named <dfn>blog.php</dfn> and load it.</p> + +<p><strong>When a controller's name matches the first segment of a URI, it will be loaded.</strong></p> + +<a name="hello"></a> +<h2>Let's try it:&nbsp; Hello World!</h2> + +<p>Let's create a simple controller so you can see it in action. Using your text editor, create a file called <dfn>blog.php</dfn>, and put the following code in it:</p> + + +<textarea class="textarea" style="width:100%" cols="50" rows="10"> +&lt;?php +class Blog extends CI_Controller { + + public function index() + { + echo 'Hello World!'; + } +} +?&gt; +</textarea> + + + +<p>Then save the file to your <dfn>application/controllers/</dfn> folder.</p> + +<p>Now visit the your site using a URL similar to this:</p> + +<code>example.com/index.php/<var>blog</var>/</code> + +<p>If you did it right, you should see <samp>Hello World!</samp>.</p> + +<p>Note: Class names must start with an uppercase letter. In other words, this is valid:</p> + +<code>&lt;?php<br /> +class <var>Blog</var> extends CI_Controller {<br /> +<br /> +}<br /> +?&gt;</code> + +<p>This is <strong>not</strong> valid:</p> + +<code>&lt;?php<br /> +class <var>blog</var> extends CI_Controller {<br /> +<br /> +}<br /> +?&gt;</code> + +<p>Also, always make sure your controller <dfn>extends</dfn> the parent controller class so that it can inherit all its functions.</p> + + + +<a name="functions"></a> +<h2>Functions</h2> + +<p>In the above example the function name is <dfn>index()</dfn>. The "index" function is always loaded by default if the +<strong>second segment</strong> of the URI is empty. Another way to show your "Hello World" message would be this:</p> + +<code>example.com/index.php/<var>blog</var>/<samp>index</samp>/</code> + +<p><strong>The second segment of the URI determines which function in the controller gets called.</strong></p> + +<p>Let's try it. Add a new function to your controller:</p> + + +<textarea class="textarea" style="width:100%" cols="50" rows="15"> +&lt;?php +class Blog extends CI_Controller { + + public function index() + { + echo 'Hello World!'; + } + + public function comments() + { + echo 'Look at this!'; + } +} +?&gt; +</textarea> + +<p>Now load the following URL to see the <dfn>comment</dfn> function:</p> + +<code>example.com/index.php/<var>blog</var>/<samp>comments</samp>/</code> + +<p>You should see your new message.</p> + +<a name="passinguri"></a> +<h2>Passing URI Segments to your Functions</h2> + +<p>If your URI contains more then two segments they will be passed to your function as parameters.</p> + +<p>For example, lets say you have a URI like this:</p> + +<code>example.com/index.php/<var>products</var>/<samp>shoes</samp>/<kbd>sandals</kbd>/<dfn>123</dfn></code> + +<p>Your function will be passed URI segments 3 and 4 ("sandals" and "123"):</p> + +<code> +&lt;?php<br /> +class Products extends CI_Controller {<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;public function shoes($sandals, $id)<br /> +&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo $sandals;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo $id;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +}<br /> +?&gt; +</code> + +<p class="important"><strong>Important:</strong>&nbsp; If you are using the <a href="routing.html">URI Routing</a> feature, the segments +passed to your function will be the re-routed ones.</p> + + +<a name="default"></a> +<h2>Defining a Default Controller</h2> + +<p>CodeIgniter can be told to load a default controller when a URI is not present, +as will be the case when only your site root URL is requested. To specify a default controller, open +your <dfn>application/config/routes.php</dfn> file and set this variable:</p> + +<code>$route['default_controller'] = '<var>Blog</var>';</code> + +<p>Where <var>Blog</var> is the name of the controller class you want used. If you now load your main index.php file without +specifying any URI segments you'll see your Hello World message by default.</p> + + + +<a name="remapping"></a> +<h2>Remapping Function Calls</h2> + +<p>As noted above, the second segment of the URI typically determines which function in the controller gets called. +CodeIgniter permits you to override this behavior through the use of the <kbd>_remap()</kbd> function:</p> + +<code>public function _remap()<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;// Some code here...<br /> +}</code> + +<p class="important"><strong>Important:</strong>&nbsp; If your controller contains a function named <kbd>_remap()</kbd>, it will <strong>always</strong> +get called regardless of what your URI contains. It overrides the normal behavior in which the URI determines which function is called, +allowing you to define your own function routing rules.</p> + +<p>The overridden function call (typically the second segment of the URI) will be passed as a parameter to the <kbd>_remap()</kbd> function:</p> + +<code>public function _remap(<var>$method</var>)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;if ($method == 'some_method')<br /> +&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->$method();<br /> +&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +&nbsp;&nbsp;&nbsp;&nbsp;else<br /> +&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->default_method();<br /> +&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +}</code> + +<p>Any extra segments after the method name are passed into <kbd>_remap()</kbd> as an optional second parameter. This array can be used in combination with PHP's <a href="http://php.net/call_user_func_array">call_user_func_array</a> to emulate CodeIgniter's default behavior.</p> + +<code>public function _remap($method, $params = array())<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$method = 'process_'.$method;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;if (method_exists($this, $method))<br /> +&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return call_user_func_array(array($this, $method), $params);<br /> +&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +&nbsp;&nbsp;&nbsp;&nbsp;show_404();<br /> +}</code> + + +<a name="output"></a> +<h2>Processing Output</h2> + +<p>CodeIgniter has an output class that takes care of sending your final rendered data to the web browser automatically. More information on this can be found in the +<a href="views.html">Views</a> and <a href="../libraries/output.html">Output class</a> pages. In some cases, however, you might want to +post-process the finalized data in some way and send it to the browser yourself. CodeIgniter permits you to +add a function named <dfn>_output()</dfn> to your controller that will receive the finalized output data.</p> + +<p><strong>Important:</strong>&nbsp; If your controller contains a function named <kbd>_output()</kbd>, it will <strong>always</strong> +be called by the output class instead of echoing the finalized data directly. The first parameter of the function will contain the finalized output.</p> + +<p>Here is an example:</p> + +<code> +public function _output($output)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo $output;<br /> +}</code> + +<p class="important">Please note that your <dfn>_output()</dfn> function will receive the data in its finalized state. Benchmark and memory usage data will be rendered, +cache files written (if you have caching enabled), and headers will be sent (if you use that <a href="../libraries/output.html">feature</a>) +before it is handed off to the _output() function.<br /> +<br /> +To have your controller's output cached properly, its <dfn>_output()</dfn> method can use:<br /> + +<code>if ($this-&gt;output-&gt;cache_expiration &gt; 0)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;output-&gt;_write_cache($output);<br /> +}</code> + +If you are using this feature the page execution timer and memory usage stats might not be perfectly accurate +since they will not take into acccount any further processing you do. For an alternate way to control output <em>before</em> any of the final processing is done, please see +the available methods in the <a href="../libraries/output.html">Output Class</a>.</p> + +<a name="private"></a> +<h2>Private Functions</h2> + + +<p>In some cases you may want certain functions hidden from public access. To make a function private, simply add an +underscore as the name prefix and it will not be served via a URL request. For example, if you were to have a function like this:</p> + +<code> +private function _utility()<br /> +{<br /> +&nbsp;&nbsp;// some code<br /> +}</code> + +<p>Trying to access it via the URL, like this, will not work:</p> + +<code>example.com/index.php/<var>blog</var>/<samp>_utility</samp>/</code> + + + +<a name="subfolders"></a> +<h2>Organizing Your Controllers into Sub-folders</h2> + +<p>If you are building a large application you might find it convenient to organize your controllers into sub-folders. CodeIgniter permits you to do this.</p> + +<p>Simply create folders within your <dfn>application/controllers</dfn> directory and place your controller classes within them.</p> + +<p><strong>Note:</strong>&nbsp; When using this feature the first segment of your URI must specify the folder. For example, lets say you have a controller +located here:</p> + +<code>application/controllers/<kbd>products</kbd>/shoes.php</code> + +<p>To call the above controller your URI will look something like this:</p> + +<code>example.com/index.php/products/shoes/show/123</code> + +<p>Each of your sub-folders may contain a default controller which will be +called if the URL contains only the sub-folder. Simply name your default controller as specified in your +<dfn>application/config/routes.php</dfn> file</p> + + +<p>CodeIgniter also permits you to remap your URIs using its <a href="routing.html">URI Routing</a> feature.</p> + + +<h2><a name="constructors"></a>Class Constructors</h2> + + +<p>If you intend to use a constructor in any of your Controllers, you <strong>MUST</strong> place the following line of code in it:</p> + +<code>parent::__construct();</code> + +<p>The reason this line is necessary is because your local constructor will be overriding the one in the parent controller class so we need to manually call it.</p> + +<code> +&lt;?php<br /> +class <kbd>Blog</kbd> extends CI_Controller {<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public function <kbd>__construct()</kbd><br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<var>parent::__construct();</var><br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Your own constructor code<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +}<br /> +?&gt;</code> + +<p>Constructors are useful if you need to set some default values, or run a default process when your class is instantiated. +Constructors can't return a value, but they can do some default work.</p> + +<a name="reserved"></a> +<h2>Reserved Function Names</h2> + +<p>Since your controller classes will extend the main application controller you +must be careful not to name your functions identically to the ones used by that class, otherwise your local functions +will override them. See <a href="reserved_names.html">Reserved Names</a> for a full list.</p> + +<h2>That's it!</h2> + +<p>That, in a nutshell, is all there is to know about controllers.</p> + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="urls.html">CodeIgniter URLs</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="reserved_names.html">Reserved Names</a></p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/core_classes.html b/user_guide/general/core_classes.html new file mode 100644 index 0000000..1ef3196 --- /dev/null +++ b/user_guide/general/core_classes.html @@ -0,0 +1,186 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Creating Core System Classes : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Creating Core System Classes +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Creating Core System Classes</h1> + +<p>Every time CodeIgniter runs there are several base classes that are initialized automatically as part of the core framework. +It is possible, however, to swap any of the core system classes with your own versions or even extend the core versions.</p> + +<p><strong>Most users will never have any need to do this, +but the option to replace or extend them does exist for those who would like to significantly alter the CodeIgniter core.</strong> +</p> + +<p class="important"><strong>Note:</strong>&nbsp; Messing with a core system class has a lot of implications, so make sure you +know what you are doing before attempting it.</p> + + +<h2>System Class List</h2> + +<p>The following is a list of the core system files that are invoked every time CodeIgniter runs:</p> + +<ul> +<li>Benchmark</li> +<li>Config</li> +<li>Controller</li> +<li>Exceptions</li> +<li>Hooks</li> +<li>Input</li> +<li>Language</li> +<li>Loader</li> +<li>Log</li> +<li>Output</li> +<li>Router</li> +<li>URI</li> +<li>Utf8</li> +</ul> + +<h2>Replacing Core Classes</h2> + +<p>To use one of your own system classes instead of a default one simply place your version inside your local <dfn>application/core</dfn> directory:</p> + +<code>application/core/<dfn>some-class.php</dfn></code> + +<p>If this directory does not exist you can create it.</p> + +<p>Any file named identically to one from the list above will be used instead of the one normally used.</p> + +<p>Please note that your class must use <kbd>CI</kbd> as a prefix. For example, if your file is named <kbd>Input.php</kbd> the class will be named:</p> + +<code> +class CI_Input {<br /><br /> + +} +</code> + + + +<h2>Extending Core Class</h2> + +<p>If all you need to do is add some functionality to an existing library - perhaps add a function or two - then +it's overkill to replace the entire library with your version. In this case it's better to simply extend the class. +Extending a class is nearly identical to replacing a class with a couple exceptions:</p> + +<ul> +<li>The class declaration must extend the parent class.</li> +<li>Your new class name and filename must be prefixed with <kbd>MY_</kbd> (this item is configurable. See below.).</li> +</ul> + +<p>For example, to extend the native <kbd>Input</kbd> class you'll create a file named <dfn>application/core/</dfn><kbd>MY_Input.php</kbd>, and declare your class with:</p> + +<code> +class MY_Input extends CI_Input {<br /><br /> + +}</code> + +<p>Note: If you need to use a constructor in your class make sure you extend the parent constructor:</p> + +<code> +class MY_Input extends CI_Input {<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;function __construct()<br /> +&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent::__construct();<br /> +&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +}</code> + +<p class="important"><strong>Tip:</strong>&nbsp; Any functions in your class that are named identically to the functions in the parent class will be used instead of the native ones +(this is known as "method overriding"). +This allows you to substantially alter the CodeIgniter core.</p> + +<p>If you are extending the Controller core class, then be sure to extend your new class in your application controller's constructors.</p> + +<code>class Welcome extends MY_Controller {<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;function __construct()<br /> +&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent::__construct();<br /> +&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;function index()<br /> +&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->load->view('welcome_message');<br /> +&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +}</code> + +<h3>Setting Your Own Prefix</h3> + +<p>To set your own sub-class prefix, open your <dfn>application/config/config.php</dfn> file and look for this item:</p> + +<code>$config['subclass_prefix'] = 'MY_';</code> + +<p>Please note that all native CodeIgniter libraries are prefixed with <kbd>CI_</kbd> so DO NOT use that as your prefix.</p> + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="creating_libraries.html">Creating Your Own Libraries</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="hooks.html">Hooks - Extending the Core</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/creating_drivers.html b/user_guide/general/creating_drivers.html new file mode 100644 index 0000000..0751aea --- /dev/null +++ b/user_guide/general/creating_drivers.html @@ -0,0 +1,100 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Creating Drivers : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Creating Drivers +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Creating Drivers</h1> + +<h2>Driver Directory and File Structure</h2> + +<p>Sample driver directory and file structure layout:</p> + +<ul> + <li>/application/libraries/Driver_name + <ul> + <li>Driver_name.php</li> + <li>drivers + <ul> + <li>Driver_name_subclass_1.php</li> + <li>Driver_name_subclass_2.php</li> + <li>Driver_name_subclass_3.php</li> + </ul> + </li> + </ul> + </li> +</ul> + +<p class="important"><strong>NOTE:</strong> In order to maintain compatibility on case-sensitive file systems, the <samp>Driver_name</samp> directory must be <var>ucfirst()</var></p> + +<!-- @todo write this! --> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="drivers.html">Using CodeIgniter Drivers</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="core_classes.html">Creating Core System Classes</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/creating_libraries.html b/user_guide/general/creating_libraries.html new file mode 100644 index 0000000..598e9af --- /dev/null +++ b/user_guide/general/creating_libraries.html @@ -0,0 +1,293 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Creating Libraries : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Creating Libraries +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Creating Libraries</h1> + +<p>When we use the term "Libraries" we are normally referring to the classes that are located in the <kbd>libraries</kbd> +directory and described in the Class Reference of this user guide. In this case, however, we will instead describe how you can create +your own libraries within your <dfn>application/libraries</dfn> directory in order to maintain separation between your local resources +and the global framework resources.</p> + +<p>As an added bonus, CodeIgniter permits your libraries to <kbd>extend</kbd> native classes if you simply need to add some functionality +to an existing library. Or you can even replace native libraries just by placing identically named versions in your <dfn>application/libraries</dfn> folder.</p> + +<p>In summary:</p> + +<ul> +<li>You can create entirely new libraries.</li> +<li>You can extend native libraries.</li> +<li>You can replace native libraries.</li> +</ul> + +<p>The page below explains these three concepts in detail.</p> + +<p class="important"><strong>Note:</strong> The Database classes can not be extended or replaced with your own classes. All other classes are able to be replaced/extended.</p> + + +<h2>Storage</h2> + +<p>Your library classes should be placed within your <dfn>application/libraries</dfn> folder, as this is where CodeIgniter will look for them when +they are initialized.</p> + + +<h2>Naming Conventions</h2> + +<ul> +<li>File names must be capitalized. For example:&nbsp; <dfn>Myclass.php</dfn></li> +<li>Class declarations must be capitalized. For example:&nbsp; <kbd>class Myclass</kbd></li> +<li>Class names and file names must match.</li> +</ul> + + +<h2>The Class File</h2> + +<p>Classes should have this basic prototype (Note: We are using the name <kbd>Someclass</kbd> purely as an example):</p> + +<code>&lt;?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); +<br /><br /> +class Someclass {<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;public function some_function()<br /> +&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +}<br /><br /> +/* End of file Someclass.php */</code> + + +<h2>Using Your Class</h2> + +<p>From within any of your <a href="controllers.html">Controller</a> functions you can initialize your class using the standard:</p> + +<code>$this->load->library('<kbd>someclass</kbd>');</code> + +<p>Where <em>someclass</em> is the file name, without the ".php" file extension. You can submit the file name capitalized or lower case. +CodeIgniter doesn't care.</p> + +<p>Once loaded you can access your class using the <kbd>lower case</kbd> version:</p> + +<code>$this-><kbd>someclass</kbd>->some_function();&nbsp; // Object instances will always be lower case +</code> + + + +<h2>Passing Parameters When Initializing Your Class</h2> + +<p>In the library loading function you can dynamically pass data as an array via the second parameter and it will be passed to your class +constructor:</p> + +<code> +$params = array('type' => 'large', 'color' => 'red');<br /> +<br /> +$this->load->library('Someclass', <kbd>$params</kbd>);</code> + +<p>If you use this feature you must set up your class constructor to expect data:</p> + +<code>&lt;?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');<br /> +<br /> +class Someclass {<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;public function __construct($params)<br /> +&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Do something with $params<br /> +&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +}<br /><br /> +?&gt;</code> + +<p class="important">You can also pass parameters stored in a config file. Simply create a config file named identically to the class <kbd>file name</kbd> +and store it in your <dfn>application/config/</dfn> folder. Note that if you dynamically pass parameters as described above, +the config file option will not be available.</p> + + + + + + + +<h2>Utilizing CodeIgniter Resources within Your Library</h2> + + +<p>To access CodeIgniter's native resources within your library use the <kbd>get_instance()</kbd> function. +This function returns the CodeIgniter super object.</p> + +<p>Normally from within your controller functions you will call any of the available CodeIgniter functions using the <kbd>$this</kbd> construct:</p> + +<code> +<strong>$this</strong>->load->helper('url');<br /> +<strong>$this</strong>->load->library('session');<br /> +<strong>$this</strong>->config->item('base_url');<br /> +etc. +</code> + +<p><kbd>$this</kbd>, however, only works directly within your controllers, your models, or your views. +If you would like to use CodeIgniter's classes from within your own custom classes you can do so as follows:</p> + + +<p>First, assign the CodeIgniter object to a variable:</p> + +<code>$CI =&amp; get_instance();</code> + +<p>Once you've assigned the object to a variable, you'll use that variable <em>instead</em> of <kbd>$this</kbd>:</p> + +<code> +$CI =&amp; get_instance();<br /> +<br /> +$CI->load->helper('url');<br /> +$CI->load->library('session');<br /> +$CI->config->item('base_url');<br /> +etc. +</code> + +<p class="important"><strong>Note:</strong> You'll notice that the above get_instance() function is being passed by reference: +<br /><br /> +<var>$CI =&amp; get_instance();</var> +<br /> +<br /> +<kbd>This is very important.</kbd> Assigning by reference allows you to use the original CodeIgniter object rather than creating a copy of it.</p> + + +<h2>Replacing Native Libraries with Your Versions</h2> + +<p>Simply by naming your class files identically to a native library will cause CodeIgniter to use it instead of the native one. To use this +feature you must name the file and the class declaration exactly the same as the native library. For example, to replace the native <kbd>Email</kbd> library +you'll create a file named <dfn>application/libraries/Email.php</dfn>, and declare your class with:</p> + +<code> +class CI_Email {<br /><br /> + +}</code> + +<p>Note that most native classes are prefixed with <kbd>CI_</kbd>.</p> + +<p>To load your library you'll see the standard loading function:</p> + +<code>$this->load->library('<kbd>email</kbd>');</code> + +<p class="important"><strong>Note:</strong> At this time the Database classes can not be replaced with your own versions.</p> + + +<h2>Extending Native Libraries</h2> + +<p>If all you need to do is add some functionality to an existing library - perhaps add a function or two - then +it's overkill to replace the entire library with your version. In this case it's better to simply extend the class. +Extending a class is nearly identical to replacing a class with a couple exceptions:</p> + +<ul> +<li>The class declaration must extend the parent class.</li> +<li>Your new class name and filename must be prefixed with <kbd>MY_</kbd> (this item is configurable. See below.).</li> +</ul> + +<p>For example, to extend the native <kbd>Email</kbd> class you'll create a file named <dfn>application/libraries/</dfn><kbd>MY_Email.php</kbd>, and declare your class with:</p> + +<code> +class MY_Email extends CI_Email {<br /><br /> + +}</code> + +<p>Note: If you need to use a constructor in your class make sure you extend the parent constructor:</p> + + +<code> +class MY_Email extends CI_Email {<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;public function __construct()<br /> +&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent::__construct();<br /> +&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +}</code> + + +<h3>Loading Your Sub-class</h3> + +<p>To load your sub-class you'll use the standard syntax normally used. DO NOT include your prefix. For example, +to load the example above, which extends the Email class, you will use:</p> + +<code>$this->load->library('<kbd>email</kbd>');</code> + +<p>Once loaded you will use the class variable as you normally would for the class you are extending. In the case of +the email class all calls will use:</p> + + +<code>$this-><kbd>email</kbd>->some_function();</code> + + +<h3>Setting Your Own Prefix</h3> + +<p>To set your own sub-class prefix, open your <dfn>application/config/config.php</dfn> file and look for this item:</p> + +<code>$config['subclass_prefix'] = 'MY_';</code> + +<p>Please note that all native CodeIgniter libraries are prefixed with <kbd>CI_</kbd> so DO NOT use that as your prefix.</p> + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="libraries.html">Using CodeIgniter Libraries</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="drivers.html">Using CodeIgniter Drivers</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/credits.html b/user_guide/general/credits.html new file mode 100644 index 0000000..fce87b3 --- /dev/null +++ b/user_guide/general/credits.html @@ -0,0 +1,92 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Credits : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Credits +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Credits</h1> + +<p>CodeIgniter was originally developed by <a href="http://www.ellislab.com/">Rick Ellis</a> (CEO of +<a href="http://ellislab.com/">EllisLab, Inc.</a>). The framework was written for performance in the real +world, with many of the class libraries, helpers, and sub-systems borrowed from the code-base of +<a href="http://www.expressionengine.com/">ExpressionEngine</a>.</p> + +<p>It was, for years, developed and maintained by EllisLab, the ExpressionEngine +Development Team and a group of community members called the Reactor Team.</p> + +In 2014, CodeIgniter was acquired by the <a href="http://bcit.ca/">British Columbia Institute of Technology</a> +and was then officially announced as a community-maintaned project.</p> + +<p>Bleeding edge development is spearheaded by the handpicked contributors of the Reactor Team.</p> + +<p>A hat tip goes to Ruby on Rails for inspiring us to create a PHP framework, and for +bringing frameworks into the general consciousness of the web community.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="../changelog.html">Change Log</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="../installation/downloads.html">Downloading CodeIgniter</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/drivers.html b/user_guide/general/drivers.html new file mode 100644 index 0000000..6fd5e72 --- /dev/null +++ b/user_guide/general/drivers.html @@ -0,0 +1,104 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Using CodeIgniter Drivers : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Using CodeIgniter Drivers +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Using CodeIgniter Drivers</h1> + + +<p>Drivers are a special type of Library that has a parent class and any number of potential child classes. Child classes have access to the parent class, but not their siblings. Drivers provide an elegant syntax in your <a href="controllers.html">controllers</a> for libraries that benefit from or require being broken down into discrete classes.</p> + +<p>Drivers are found in the <dfn>system/libraries</dfn> folder, in their own folder which is identically named to the parent library class. Also inside that folder is a subfolder named <kbd>drivers</kbd>, which contains all of the possible child class files.</p> + +<p>To use a driver you will initialize it within a controller using the following initialization function:</p> + +<code>$this->load->driver('<var>class name</var>'); </code> + +<p>Where <var>class name</var> is the name of the driver class you want to invoke. For example, to load a driver named "Some Parent" you would do this:</p> + +<code>$this->load->driver('<var>some_parent</var>');</code> + +<p>Methods of that class can then be invoked with:</p> + +<code>$this->some_parent->some_method();</code> + +<p>The child classes, the drivers themselves, can then be called directly through the parent class, without initializing them:</p> + +<code>$this->some_parent->child_one->some_method();<br /> +$this->some_parent->child_two->another_method();</code> + +<h2>Creating Your Own Drivers</h2> + +<p>Please read the section of the user guide that discusses how to <a href="creating_drivers.html">create your own drivers</a>.</p> + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="creating_libraries.html">Creating Libraries</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="creating_drivers.html">Creating Drivers</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/environments.html b/user_guide/general/environments.html new file mode 100644 index 0000000..e288842 --- /dev/null +++ b/user_guide/general/environments.html @@ -0,0 +1,126 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Handling Multiple Environments : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Handling Multiple Environments +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Handling Multiple Environments</h1> + +<p> + Developers often desire different system behavior depending on whether + an application is running in a development or production + environment. For example, verbose error output is something that would + be useful while developing an application, but it may also pose a security issue when "live". +</p> + +<h2>The ENVIRONMENT Constant</h2> + +<p> + By default, CodeIgniter comes with the environment constant set to + '<kbd>development</kbd>'. At the top of index.php, you will see: +</p> + +<code> +define('<var>ENVIRONMENT</var>', '<var>development</var>'); +</code> + +<p> + In addition to affecting some basic framework behavior (see the next section), + you may use this constant in your own development to differentiate + between which environment you are running in. +</p> + +<h2>Effects On Default Framework Behavior</h2> + +<p> + There are some places in the CodeIgniter system where the <kbd>ENVIRONMENT</kbd> + constant is used. This section describes how default framework behavior is + affected. +</p> + +<h3>Error Reporting</h3> + +<p> + Setting the <kbd>ENVIRONMENT</kbd> constant to a value of '<kbd>development</kbd>' will + cause all PHP errors to be rendered to the browser when they occur. Conversely, + setting the constant to '<kbd>production</kbd>' will disable all error output. Disabling + error reporting in production is a <a href="security.html">good security practice</a>. +</p> + +<h3>Configuration Files</h3> + +<p> + Optionally, you can have CodeIgniter load environment-specific + configuration files. This may be useful for managing things like differing API keys + across multiple environments. This is described in more detail in the + environment section of the <a href="../libraries/config.html#environments">Config Class</a> documentation. +</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="managing_apps.html">Managing Applications</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="alternative_php.html">Alternative PHP Syntax</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/errors.html b/user_guide/general/errors.html new file mode 100644 index 0000000..5e29186 --- /dev/null +++ b/user_guide/general/errors.html @@ -0,0 +1,140 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Error Handling : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Error Handling +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Error Handling</h1> + +<p>CodeIgniter lets you build error reporting into your applications using the functions described below. +In addition, it has an error logging class that permits error and debugging messages to be saved as text files.</p> + +<p class="important"><strong>Note:</strong> By default, CodeIgniter displays all PHP errors. You might +wish to change this behavior once your development is complete. You'll find the <dfn>error_reporting()</dfn> +function located at the top of your main index.php file. Disabling error reporting will NOT prevent log files +from being written if there are errors.</p> + +<p>Unlike most systems in CodeIgniter, the error functions are simple procedural interfaces that are available +globally throughout the application. This approach permits error messages to get triggered without having to worry +about class/function scoping.</p> + +<p>The following functions let you generate errors:</p> + +<h2>show_error('<var>message</var>' [, int <var>$status_code</var>= 500 ] )</h2> +<p>This function will display the error message supplied to it using the following error template:</p> +<p><dfn>application/errors/</dfn><kbd>error_general.php</kbd></p> +<p>The optional parameter $status_code determines what HTTP status code should be sent with the error.</p> + +<h2>show_404('<var>page</var>' [, '<var>log_error</var>'])</h2> +<p>This function will display the 404 error message supplied to it using the following error template:</p> +<p><dfn>application/errors/</dfn><kbd>error_404.php</kbd></p> + +<p>The function expects the string passed to it to be the file path to the page that isn't found. +Note that CodeIgniter automatically shows 404 messages if controllers are not found.</p> + +<p>CodeIgniter automatically logs any show_404() calls. Setting the optional second parameter to FALSE will skip logging.</p> + + +<h2>log_message('<var>level</var>', '<samp>message</samp>')</h2> + +<p>This function lets you write messages to your log files. You must supply one of three "levels" +in the first parameter, indicating what type of message it is (debug, error, info), with the message +itself in the second parameter. Example:</p> + +<code> +if ($some_var == "")<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;log_message('error', 'Some variable did not contain a value.');<br /> +}<br /> +else<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;log_message('debug', 'Some variable was correctly set');<br /> +}<br /> +<br /> +log_message('info', 'The purpose of some variable is to provide some value.');<br /> +</code> + +<p>There are three message types:</p> + +<ol> +<li>Error Messages. These are actual errors, such as PHP errors or user errors.</li> +<li>Debug Messages. These are messages that assist in debugging. For example, if a class has been initialized, you could log this as debugging info.</li> +<li>Informational Messages. These are the lowest priority messages, simply giving information regarding some process. CodeIgniter doesn't natively generate any info messages but you may want to in your application.</li> +</ol> + + +<p class="important"><strong>Note:</strong> In order for the log file to actually be written, the + "logs" folder must be writable. In addition, you must set the "threshold" for logging in <dfn>application/config/config.php</dfn>. +You might, for example, only want error messages to be logged, and not the other two types. +If you set it to zero logging will be disabled.</p> + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="routing.html">URI Routing</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="caching.html">Page Caching</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/helpers.html b/user_guide/general/helpers.html new file mode 100644 index 0000000..ad2aeee --- /dev/null +++ b/user_guide/general/helpers.html @@ -0,0 +1,185 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Helper Functions : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Helper Functions +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Helper Functions</h1> + +<p>Helpers, as the name suggests, help you with tasks. Each helper file is simply a collection of functions in a particular +category. There are <dfn>URL Helpers</dfn>, that assist in creating links, there are <dfn>Form Helpers</dfn> +that help you create form elements, <dfn>Text Helpers</dfn> perform various text formatting routines, +<dfn>Cookie Helpers</dfn> set and read cookies, <dfn>File Helpers</dfn> help you deal with files, etc. +</p> + +<p>Unlike most other systems in CodeIgniter, Helpers are not written in an Object Oriented format. They are simple, procedural functions. +Each helper function performs one specific task, with no dependence on other functions.</p> + +<p>CodeIgniter does not load Helper Files by default, so the first step in using +a Helper is to load it. Once loaded, it becomes globally available in your <a href="../general/controllers.html">controller</a> and <a href="../general/views.html">views</a>.</p> + +<p>Helpers are typically stored in your <dfn>system/helpers</dfn>, or <dfn>application/helpers </dfn>directory. CodeIgniter will look first in your <dfn>application/helpers</dfn> +directory. If the directory does not exist or the specified helper is not located there CI will instead look in your global +<dfn>system/helpers</dfn> folder.</p> + + +<h2>Loading a Helper</h2> + +<p>Loading a helper file is quite simple using the following function:</p> + +<code>$this->load->helper('<var>name</var>');</code> + +<p>Where <var>name</var> is the file name of the helper, without the .php file extension or the "helper" part.</p> + +<p>For example, to load the <dfn>URL Helper</dfn> file, which is named <var>url_helper.php</var>, you would do this:</p> + +<code>$this->load->helper('<var>url</var>');</code> + +<p>A helper can be loaded anywhere within your controller functions (or even within your View files, although that's not a good practice), +as long as you load it before you use it. You can load your helpers in your controller constructor so that they become available +automatically in any function, or you can load a helper in a specific function that needs it.</p> + +<p class="important">Note: The Helper loading function above does not return a value, so don't try to assign it to a variable. Just use it as shown.</p> + + +<h2>Loading Multiple Helpers</h2> + +<p>If you need to load more than one helper you can specify them in an array, like this:</p> + +<code>$this->load->helper( <samp>array(</samp>'<var>helper1</var>', '<var>helper2</var>', '<var>helper3</var>'<samp>)</samp> );</code> + +<h2>Auto-loading Helpers</h2> + +<p>If you find that you need a particular helper globally throughout your application, you can tell CodeIgniter to auto-load it during system initialization. +This is done by opening the <var>application/config/autoload.php</var> file and adding the helper to the autoload array.</p> + + +<h2>Using a Helper</h2> + +<p>Once you've loaded the Helper File containing the function you intend to use, you'll call it the way you would a standard PHP function.</p> + +<p>For example, to create a link using the <dfn>anchor()</dfn> function in one of your view files you would do this:</p> + +<code>&lt;?php echo anchor('blog/comments', 'Click Here');?&gt;</code> + +<p>Where "Click Here" is the name of the link, and "blog/comments" is the URI to the controller/function you wish to link to.</p> + +<h2>"Extending" Helpers</h2> + +<p>To "extend" Helpers, create a file in your <dfn>application/helpers/</dfn> folder with an identical name to the existing Helper, but prefixed with <kbd>MY_</kbd> (this item is configurable. See below.).</p> + +<p>If all you need to do is add some functionality to an existing helper - perhaps add a function or two, or change how a particular + helper function operates - then it's overkill to replace the entire helper with your version. In this case it's better to simply + "extend" the Helper. The term "extend" is used loosely since Helper functions are procedural and discrete and cannot be extended + in the traditional programmatic sense. Under the hood, this gives you the ability to add to the functions a Helper provides, + or to modify how the native Helper functions operate.</p> + +<p>For example, to extend the native <kbd>Array Helper</kbd> you'll create a file named <dfn>application/helpers/</dfn><kbd>MY_array_helper.php</kbd>, and add or override functions:</p> + +<code> +// any_in_array() is not in the Array Helper, so it defines a new function<br /> +function any_in_array($needle, $haystack)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$needle = (is_array($needle)) ? $needle : array($needle);<br /> + <br /> +&nbsp;&nbsp;&nbsp;&nbsp;foreach ($needle as $item)<br /> +&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (in_array($item, $haystack))<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /> + <br /> +&nbsp;&nbsp;&nbsp;&nbsp;return FALSE;<br /> +}<br /> +<br /> +// random_element() is included in Array Helper, so it overrides the native function<br /> +function random_element($array)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;shuffle($array);<br /> +&nbsp;&nbsp;&nbsp;&nbsp;return array_pop($array);<br /> +}<br /> +</code> + +<h3>Setting Your Own Prefix</h3> + +<p>The filename prefix for "extending" Helpers is the same used to extend libraries and Core classes. To set your own prefix, open your <dfn>application/config/config.php</dfn> file and look for this item:</p> + +<code>$config['subclass_prefix'] = 'MY_';</code> + +<p>Please note that all native CodeIgniter libraries are prefixed with <kbd>CI_</kbd> so DO NOT use that as your prefix.</p> + + +<h2>Now What?</h2> + +<p>In the Table of Contents you'll find a list of all the available Helper Files. Browse each one to see what they do.</p> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="models.html">Models</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="libraries.html">Using Libraries</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/hooks.html b/user_guide/general/hooks.html new file mode 100644 index 0000000..e910ec0 --- /dev/null +++ b/user_guide/general/hooks.html @@ -0,0 +1,165 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Hooks : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Hooks - Extending the Framework Core +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Hooks - Extending the Framework Core</h1> + +<p>CodeIgniter's Hooks feature provides a means to tap into and modify the inner workings of the framework without hacking the core files. +When CodeIgniter runs it follows a specific execution process, diagramed in the <a href="../overview/appflow.html">Application Flow</a> page. +There may be instances, however, where you'd like to cause some action to take place at a particular stage in the execution process. +For example, you might want to run a script right before your controllers get loaded, or right after, or you might want to trigger one of +your own scripts in some other location. +</p> + +<h2>Enabling Hooks</h2> + +<p>The hooks feature can be globally enabled/disabled by setting the following item in the <kbd>application/config/config.php</kbd> file:</p> + +<code>$config['enable_hooks'] = TRUE;</code> + + +<h2>Defining a Hook</h2> + +<p>Hooks are defined in <dfn>application/config/hooks.php</dfn> file. Each hook is specified as an array with this prototype:</p> + +<code> +$hook['pre_controller'] = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'class'&nbsp;&nbsp;&nbsp;&nbsp;=> 'MyClass',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'function' => 'Myfunction',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'filename' => 'Myclass.php',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'filepath' => 'hooks',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'params'&nbsp;&nbsp;&nbsp;=> array('beer', 'wine', 'snacks')<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);</code> + +<p><strong>Notes:</strong><br />The array index correlates to the name of the particular hook point you want to +use. In the above example the hook point is <kbd>pre_controller</kbd>. A list of hook points is found below. +The following items should be defined in your associative hook array:</p> + +<ul> +<li><strong>class</strong>&nbsp; The name of the class you wish to invoke. If you prefer to use a procedural function instead of a class, leave this item blank.</li> +<li><strong>function</strong>&nbsp; The function name you wish to call.</li> +<li><strong>filename</strong>&nbsp; The file name containing your class/function.</li> +<li><strong>filepath</strong>&nbsp; The name of the directory containing your script. Note: Your script must be located in a directory INSIDE your <kbd>application</kbd> folder, so the file path is relative to that folder. For example, if your script is located in <dfn>application/hooks</dfn>, you will simply use <samp>hooks</samp> as your filepath. If your script is located in <dfn>application/hooks/utilities</dfn> you will use <samp>hooks/utilities</samp> as your filepath. No trailing slash.</li> +<li><strong>params</strong>&nbsp; Any parameters you wish to pass to your script. This item is optional.</li> +</ul> + + +<h2>Multiple Calls to the Same Hook</h2> + +<p>If want to use the same hook point with more then one script, simply make your array declaration multi-dimensional, like this:</p> + +<code> +$hook['pre_controller']<kbd>[]</kbd> = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'class'&nbsp;&nbsp;&nbsp;&nbsp;=> 'MyClass',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'function' => 'Myfunction',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'filename' => 'Myclass.php',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'filepath' => 'hooks',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'params'&nbsp;&nbsp;&nbsp;=> array('beer', 'wine', 'snacks')<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +$hook['pre_controller']<kbd>[]</kbd> = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'class'&nbsp;&nbsp;&nbsp;&nbsp;=> 'MyOtherClass',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'function' => 'MyOtherfunction',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'filename' => 'Myotherclass.php',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'filepath' => 'hooks',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'params'&nbsp;&nbsp;&nbsp;=> array('red', 'yellow', 'blue')<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);</code> + +<p>Notice the brackets after each array index:</p> + +<code>$hook['pre_controller']<kbd>[]</kbd></code> + +<p>This permits you to have the same hook point with multiple scripts. The order you define your array will be the execution order.</p> + + +<h2>Hook Points</h2> + +<p>The following is a list of available hook points.</p> + +<ul> + <li><strong>pre_system</strong><br /> + Called very early during system execution. Only the benchmark and hooks class have been loaded at this point. No routing or other processes have happened.</li> + <li><strong>pre_controller</strong><br /> + Called immediately prior to any of your controllers being called. All base classes, routing, and security checks have been done.</li> + <li><strong>post_controller_constructor</strong><br /> + Called immediately after your controller is instantiated, but prior to any method calls happening.</li> + <li><strong>post_controller</strong><br /> + Called immediately after your controller is fully executed.</li> + <li><strong>display_override</strong><br /> + Overrides the <dfn>_display()</dfn> function, used to send the finalized page to the web browser at the end of system execution. This permits you to + use your own display methodology. Note that you will need to reference the CI superobject with <dfn>$this->CI =&amp; get_instance()</dfn> and then the finalized data will be available by calling <dfn>$this->CI->output->get_output()</dfn></li> + <li><strong>cache_override</strong><br /> + Enables you to call your own function instead of the <dfn>_display_cache()</dfn> function in the output class. This permits you to use your own cache display mechanism.</li> + <li><strong>post_system</strong><br /> + Called after the final rendered page is sent to the browser, at the end of system execution after the finalized data is sent to the browser.</li> + </ul> +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="core_classes.html">Creating Core Classes</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="autoloader.html">Auto-loading Resources</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/libraries.html b/user_guide/general/libraries.html new file mode 100644 index 0000000..9f570ea --- /dev/null +++ b/user_guide/general/libraries.html @@ -0,0 +1,98 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Using CodeIgniter Libraries : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Using CodeIgniter Libraries +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Using CodeIgniter Libraries</h1> + + +<p>All of the available libraries are located in your <dfn>system/libraries</dfn> folder. +In most cases, to use one of these classes involves initializing it within a <a href="controllers.html">controller</a> using the following initialization function:</p> + +<code>$this->load->library('<var>class name</var>'); </code> + +<p>Where <var>class name</var> is the name of the class you want to invoke. For example, to load the form validation class you would do this:</p> + +<code>$this->load->library('<var>form_validation</var>'); </code> + +<p>Once initialized you can use it as indicated in the user guide page corresponding to that class.</p> + +<p>Additionally, multiple libraries can be loaded at the same time by passing an array of libraries to the load function.</p> + +<code>$this->load->library(array('<var>email</var>', '<var>table</var>'));</code> + +<h2>Creating Your Own Libraries</h2> + +<p>Please read the section of the user guide that discusses how to <a href="creating_libraries.html">create your own libraries</a></p> + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="helpers.html">Helpers</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="creating_libraries.html">Creating Libraries</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/managing_apps.html b/user_guide/general/managing_apps.html new file mode 100644 index 0000000..1def9b8 --- /dev/null +++ b/user_guide/general/managing_apps.html @@ -0,0 +1,133 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Managing your Applications : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Managing your Applications +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Managing your Applications</h1> + +<p>By default it is assumed that you only intend to use CodeIgniter to manage one application, which you will build in your +<dfn>application/</dfn> directory. It is possible, however, to have multiple sets of applications that share a single +CodeIgniter installation, or even to rename or relocate your <dfn>application</dfn> folder.</p> + +<h2>Renaming the Application Folder</h2> + +<p>If you would like to rename your <dfn>application</dfn> folder you may do so as long as you open your main <kbd>index.php</kbd> +file and set its name using the <samp>$application_folder</samp> variable:</p> + +<code>$application_folder = "application";</code> + +<h2>Relocating your Application Folder</h2> + +<p>It is possible to move your <dfn>application</dfn> folder to a different location on your server than your <kbd>system</kbd> folder. +To do so open your main <kbd>index.php</kbd> and set a <em>full server path</em> in the <samp>$application_folder</samp> variable.</p> + + +<code>$application_folder = "/Path/to/your/application";</code> + + +<h2>Running Multiple Applications with one CodeIgniter Installation</h2> + +<p>If you would like to share a common CodeIgniter installation to manage several different applications simply +put all of the directories located inside your <kbd>application</kbd> folder into their +own sub-folder.</p> + +<p>For example, let's say you want to create two applications, "foo" and "bar". You could structure your +application folders like this:</p> + +<code>applications/<var>foo</var>/<br /> +applications/<var>foo</var>/config/<br /> +applications/<var>foo</var>/controllers/<br /> +applications/<var>foo</var>/errors/<br /> +applications/<var>foo</var>/libraries/<br /> +applications/<var>foo</var>/models/<br /> +applications/<var>foo</var>/views/<br /> +applications/<samp>bar</samp>/<br /> +applications/<samp>bar</samp>/config/<br /> +applications/<samp>bar</samp>/controllers/<br /> +applications/<samp>bar</samp>/errors/<br /> +applications/<samp>bar</samp>/libraries/<br /> +applications/<samp>bar</samp>/models/<br /> +applications/<samp>bar</samp>/views/</code> + + +<p>To select a particular application for use requires that you open your main <kbd>index.php</kbd> file and set the <dfn>$application_folder</dfn> +variable. For example, to select the "foo" application for use you would do this:</p> + +<code>$application_folder = "applications/foo";</code> + +<p class="important"><strong>Note:</strong>&nbsp; Each of your applications will need its own <dfn>index.php</dfn> file which +calls the desired application. The index.php file can be named anything you want.</p> + + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="profiling.html">Profiling Your Application</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="alternative_php.html">Alternative PHP Syntax</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/models.html b/user_guide/general/models.html new file mode 100644 index 0000000..8f423de --- /dev/null +++ b/user_guide/general/models.html @@ -0,0 +1,251 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Models : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Models +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Models</h1> + +<p>Models are <strong>optionally</strong> available for those who want to use a more traditional MVC approach.</p> + + + +<ul> +<li><a href="#what">What is a Model?</a></li> +<li><a href="#anatomy">Anatomy of a Model</a></li> +<li><a href="#loading">Loading a Model</a></li> +<li><a href="#auto_load_model">Auto-Loading a Model</a> </li> +<li><a href="#conn">Connecting to your Database</a></li> +</ul> + + + +<h2><a name="what"></a>What is a Model?</h2> + +<p>Models are PHP classes that are designed to work with information in your database. For example, let's say +you use CodeIgniter to manage a blog. You might have a model class that contains functions to insert, update, and +retrieve your blog data. Here is an example of what such a model class might look like:</p> + +<code> +class&nbsp;Blogmodel&nbsp;extends&nbsp;CI_Model&nbsp;{<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;var $title&nbsp;&nbsp; = '';<br /> +&nbsp;&nbsp;&nbsp;&nbsp;var $content = '';<br /> +&nbsp;&nbsp;&nbsp;&nbsp;var $date&nbsp;&nbsp;&nbsp; = '';<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;__construct()<br /> +&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Call the Model constructor<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent::__construct();<br /> +&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +&nbsp;&nbsp;&nbsp;&nbsp;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;get_last_ten_entries()<br /> +&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$query = $this->db->get('entries', 10);<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $query->result();<br /> +&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;insert_entry()<br /> +&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->title&nbsp;&nbsp; = $_POST['title']; // please read the below note<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->content = $_POST['content'];<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->date&nbsp;&nbsp;&nbsp; = time();<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->db->insert('entries',&nbsp;$this);<br /> +&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;update_entry()<br /> +&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->title&nbsp;&nbsp; = $_POST['title'];<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->content = $_POST['content'];<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->date&nbsp;&nbsp;&nbsp; = time();<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->db->update('entries',&nbsp;$this, array('id' => $_POST['id']));<br /> +&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +<br /> +}</code> + +<p>Note: The functions in the above example use the <a href="../database/active_record.html">Active Record</a> database functions.</p> +<p class="important"><strong>Note:</strong> For the sake of simplicity in this example we're using $_POST directly. This is generally bad practice, and a more common approach would be to use the <a href="../libraries/input.html">Input Class</a> $this-&gt;input-&gt;post('title')</p> +<h2><a name="anatomy"></a>Anatomy of a Model</h2> + +<p>Model classes are stored in your <dfn>application/models/</dfn> folder. They can be nested within sub-folders if you +want this type of organization.</p> + +<p>The basic prototype for a model class is this:</p> + + +<code> +class&nbsp;<var>Model_name</var>&nbsp;extends&nbsp;CI_Model&nbsp;{<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;<var>__construct</var>()<br /> +&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent::__construct();<br /> +&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +}</code> + +<p>Where <var>Model_name</var> is the name of your class. Class names <strong>must</strong> have the first letter capitalized with the rest of the name lowercase. +Make sure your class extends the base Model class.</p> + +<p>The file name will be a lower case version of your class name. For example, if your class is this:</p> + +<code> +class&nbsp;<var>User_model</var>&nbsp;extends&nbsp;CI_Model&nbsp;{<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;<var>__construct</var>()<br /> +&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent::__construct();<br /> +&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +}</code> + +<p>Your file will be this:</p> + +<code>application/models/<var>user_model.php</var></code> + + + +<h2><a name="loading"></a>Loading a Model</h2> + +<p>Your models will typically be loaded and called from within your <a href="controllers.html">controller</a> functions. +To load a model you will use the following function:</p> + +<code>$this->load->model('<var>Model_name</var>');</code> + +<p>If your model is located in a sub-folder, include the relative path from your models folder. For example, if +you have a model located at <dfn>application/models/blog/queries.php</dfn> you'll load it using:</p> + +<code>$this->load->model('<var>blog/queries</var>');</code> + + +<p>Once loaded, you will access your model functions using an object with the same name as your class:</p> + +<code> +$this->load->model('<var>Model_name</var>');<br /> +<br /> +$this-><var>Model_name</var>->function(); +</code> + +<p>If you would like your model assigned to a different object name you can specify it via the second parameter of the loading +function:</p> + + +<code> +$this->load->model('<var>Model_name</var>', '<kbd>fubar</kbd>');<br /> +<br /> +$this-><kbd>fubar</kbd>->function(); +</code> + +<p>Here is an example of a controller, that loads a model, then serves a view:</p> + +<code> +class&nbsp;Blog_controller&nbsp;extends&nbsp;CI_Controller&nbsp;{<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;blog()<br /> +&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->load->model('Blog');<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data['query'] = $this->Blog->get_last_ten_entries();<br /><br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->load->view('blog', $data);<br /> +&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +}</code> + +<h2><a name="auto_load_model" id="auto_load_model"></a>Auto-loading Models</h2> +<p>If you find that you need a particular model globally throughout your application, you can tell CodeIgniter to auto-load it during system initialization. This is done by opening the application/config/autoload.php file and adding the model to the autoload array.</p> + + +<h2><a name="conn"></a>Connecting to your Database</h2> + +<p>When a model is loaded it does <strong>NOT</strong> connect automatically to your database. The following options for connecting are available to you:</p> + +<ul> +<li>You can connect using the standard database methods <a href="../database/connecting.html">described here</a>, either from within your Controller class or your Model class.</li> +<li>You can tell the model loading function to auto-connect by passing <kbd>TRUE</kbd> (boolean) via the third parameter, +and connectivity settings, as defined in your database config file will be used: + + <code>$this->load->model('<var>Model_name</var>', '', <kbd>TRUE</kbd>);</code> + </li> + + +<li>You can manually pass database connectivity settings via the third parameter: + + + <code>$config['hostname'] = "localhost";<br /> + $config['username'] = "myusername";<br /> + $config['password'] = "mypassword";<br /> + $config['database'] = "mydatabase";<br /> + $config['dbdriver'] = "mysql";<br /> + $config['dbprefix'] = "";<br /> + $config['pconnect'] = FALSE;<br /> + $config['db_debug'] = TRUE;<br /> + <br /> + $this->load->model('<var>Model_name</var>', '', <kbd>$config</kbd>);</code></li> +</ul> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="views.html">Views</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="helpers.html">Helpers</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/profiling.html b/user_guide/general/profiling.html new file mode 100644 index 0000000..015192e --- /dev/null +++ b/user_guide/general/profiling.html @@ -0,0 +1,181 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Profiling Your Application : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Profiling Your Application +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Profiling Your Application</h1> + +<p>The Profiler Class will display benchmark results, queries you have run, and $_POST data at the bottom of your pages. +This information can be useful during development in order to help with debugging and optimization.</p> + + +<h2>Initializing the Class</h2> + +<p class="important"><strong>Important:</strong>&nbsp; This class does <kbd>NOT</kbd> need to be initialized. It is loaded automatically by the +<a href="../libraries/output.html">Output Class</a> if profiling is enabled as shown below.</p> + +<h2>Enabling the Profiler</h2> + + <p>To enable the profiler place the following function anywhere within your <a href="controllers.html">Controller</a> functions:</p> + <code>$this->output->enable_profiler(TRUE);</code> + + <p>When enabled a report will be generated and inserted at the bottom of your pages.</p> + + <p>To disable the profiler you will use:</p> + <code>$this->output->enable_profiler(FALSE);</code> + + +<h2>Setting Benchmark Points</h2> + + <p>In order for the Profiler to compile and display your benchmark data you must name your mark points using specific syntax.</p> + + <p>Please read the information on setting Benchmark points in <a href="../libraries/benchmark.html">Benchmark Class</a> page.</p> + + +<h2>Enabling and Disabling Profiler Sections</h2> + + <p>Each section of Profiler data can be enabled or disabled by setting a corresponding config variable to <var>TRUE</var> or <var>FALSE</var>. This can be done one of two ways. First, you can set application wide defaults with the <dfn>application/config/profiler.php</dfn> config file.</p> + + <code>$config['config']&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= FALSE;<br /> + $config['queries']&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= FALSE;<br /></code> + + <p>In your controllers, you can override the defaults and config file values by calling the <kbd>set_profiler_sections()</kbd> method of the <a href="../libraries/output.html">Output class</a>:</p> + + <code>$sections = array(<br /> + &nbsp;&nbsp;&nbsp;&nbsp;'config' &nbsp;=> TRUE,<br /> + &nbsp;&nbsp;&nbsp;&nbsp;'queries' => TRUE<br /> + &nbsp;&nbsp;&nbsp;&nbsp;);<br /> + <br /> + $this->output->set_profiler_sections($sections);</code> + + <p>Available sections and the array key used to access them are described in the table below.</p> + + <table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder"> + <tr> + <th>Key</th> + <th>Description</th> + <th>Default</th> + </tr> + <tr> + <td class="td"><strong>benchmarks</strong></td> + <td class="td">Elapsed time of Benchmark points and total execution time</td> + <td class="td">TRUE</td> + </tr> + <tr> + <td class="td"><strong>config</strong></td> + <td class="td">CodeIgniter Config variables</td> + <td class="td">TRUE</td> + </tr> + <tr> + <td class="td"><strong>controller_info</strong></td> + <td class="td">The Controller class and method requested</td> + <td class="td">TRUE</td> + </tr> + <tr> + <td class="td"><strong>get</strong></td> + <td class="td">Any GET data passed in the request</td> + <td class="td">TRUE</td> + </tr> + <tr> + <td class="td"><strong>http_headers</strong></td> + <td class="td">The HTTP headers for the current request</td> + <td class="td">TRUE</td> + </tr> + <tr> + <td class="td"><strong>memory_usage</strong></td> + <td class="td">Amount of memory consumed by the current request, in bytes</td> + <td class="td">TRUE</td> + </tr> + <tr> + <td class="td"><strong>post</strong></td> + <td class="td">Any POST data passed in the request</td> + <td class="td">TRUE</td> + </tr> + <tr> + <td class="td"><strong>queries</strong></td> + <td class="td">Listing of all database queries executed, including execution time</td> + <td class="td">TRUE</td> + </tr> + <tr> + <td class="td"><strong>uri_string</strong></td> + <td class="td">The URI of the current request</td> + <td class="td">TRUE</td> + </tr> + <tr> + <td class="td"><strong>query_toggle_count</strong></td> + <td class="td">The number of queries after which the query block will default to hidden.</td> + <td class="td">25</td> + </tr> + </table> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="caching.html">Caching</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="managing_apps.html">Managing Applications</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/quick_reference.html b/user_guide/general/quick_reference.html new file mode 100644 index 0000000..f3ee077 --- /dev/null +++ b/user_guide/general/quick_reference.html @@ -0,0 +1,77 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Quick Reference Chart : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Quick Reference Chart +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Quick Reference Chart</h1> + +<p>For a PDF version of this chart, <a href="http://ellislab.com/asset/ci_download_files/ci_quick_ref.pdf">click here</a>.</p> + +<p><img src="../images/ci_quick_ref.png" width="763" height="994" border="0" /></p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/requirements.html b/user_guide/general/requirements.html new file mode 100644 index 0000000..0bd12f1 --- /dev/null +++ b/user_guide/general/requirements.html @@ -0,0 +1,82 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Server Requirements : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Server Requirements +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Server Requirements</h1> + +<ul> + <li><a href="http://www.php.net/">PHP</a> version 5.1.6 or newer.</li> + <li>A Database is required for most web application programming. Current supported databases are MySQL (4.1+), MySQLi, MS SQL, Postgres, Oracle, SQLite, and ODBC.</li> +</ul> + + + +</div> +<!-- END CONTENT --> + + + +<div id="footer"> +<p> +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="../license.html">License Agreement</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/reserved_names.html b/user_guide/general/reserved_names.html new file mode 100644 index 0000000..6ae5414 --- /dev/null +++ b/user_guide/general/reserved_names.html @@ -0,0 +1,128 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Reserved Names : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Controllers +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Reserved Names</h1> + +<p>In order to help out, CodeIgniter uses a series of functions and names in its operation. Because of this, some names cannot be used by a developer. Following is a list of reserved names that cannot be used.</p> +<h3>Controller names</h3> +<p>Since your controller classes will extend the main application controller you +must be careful not to name your functions identically to the ones used by that class, otherwise your local functions +will override them. The following +is a list of reserved names. Do not name your controller any of these:</p> +<ul> + <li>Controller</li> + <li>CI_Base</li> + <li>_ci_initialize</li> + <li>Default</li> + <li>index</li> +</ul> +<h3>Functions</h3> +<ul> + <li>is_really_writable()</li> + <li>load_class()</li> + <li>get_config()</li> + <li>config_item()</li> + <li>show_error()</li> + <li>show_404()</li> + <li>log_message()</li> + <li>_exception_handler()</li> + <li>get_instance()</li> + </ul> +<h3>Variables</h3> +<ul> + <li>$config</li> + <li>$mimes</li> + <li>$lang</li> +</ul> +<h3>Constants</h3> +<ul> + <li>ENVIRONMENT</li> + <li>EXT</li> + <li>FCPATH</li> + <li>SELF</li> + <li>BASEPATH</li> + <li>APPPATH</li> + <li>CI_VERSION</li> + <li>FILE_READ_MODE</li> + <li>FILE_WRITE_MODE</li> + <li>DIR_READ_MODE</li> + <li>DIR_WRITE_MODE</li> + <li>FOPEN_READ</li> + <li>FOPEN_READ_WRITE</li> + <li>FOPEN_WRITE_CREATE_DESTRUCTIVE</li> + <li>FOPEN_READ_WRITE_CREATE_DESTRUCTIVE</li> + <li>FOPEN_WRITE_CREATE</li> + <li>FOPEN_READ_WRITE_CREATE</li> + <li>FOPEN_WRITE_CREATE_STRICT</li> + <li>FOPEN_READ_WRITE_CREATE_STRICT</li> +</ul> +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="controllers.html">Controllers</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="views.html">Views</a></p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/routing.html b/user_guide/general/routing.html new file mode 100644 index 0000000..95825b1 --- /dev/null +++ b/user_guide/general/routing.html @@ -0,0 +1,171 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>URI Routing : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +URI Routing +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>URI Routing</h1> + +<p>Typically there is a one-to-one relationship between a URL string and its corresponding controller class/method. +The segments in a URI normally follow this pattern:</p> + +<code>example.com/<dfn>class</dfn>/<samp>function</samp>/<var>id</var>/</code> + +<p>In some instances, however, you may want to remap this relationship so that a different class/function can be called +instead of the one corresponding to the URL.</p> + +<p>For example, lets say you want your URLs to have this prototype:</p> + +<p> +example.com/product/1/<br /> +example.com/product/2/<br /> +example.com/product/3/<br /> +example.com/product/4/ +</p> + +<p>Normally the second segment of the URL is reserved for the function name, but in the example above it instead has a product ID. +To overcome this, CodeIgniter allows you to remap the URI handler.</p> + + +<h2>Setting your own routing rules</h2> + +<p>Routing rules are defined in your <var>application/config/routes.php</var> file. In it you'll see an array called <dfn>$route</dfn> that +permits you to specify your own routing criteria. Routes can either be specified using <dfn>wildcards</dfn> or <dfn>Regular Expressions</dfn></p> + + +<h2>Wildcards</h2> + +<p>A typical wildcard route might look something like this:</p> + +<code>$route['product/:num'] = "catalog/product_lookup";</code> + +<p>In a route, the array key contains the URI to be matched, while the array value contains the destination it should be re-routed to. +In the above example, if the literal word "product" is found in the first segment of the URL, and a number is found in the second segment, +the "catalog" class and the "product_lookup" method are instead used.</p> + +<p>You can match literal values or you can use two wildcard types:</p> + +<p><strong>(:num)</strong> will match a segment containing only numbers.<br /> +<strong>(:any)</strong> will match a segment containing any character. +</p> + +<p class="important"><strong>Note:</strong> Routes will run in the order they are defined. +Higher routes will always take precedence over lower ones.</p> + +<h2>Examples</h2> + +<p>Here are a few routing examples:</p> + +<code>$route['journals'] = "blogs";</code> +<p>A URL containing the word "journals" in the first segment will be remapped to the "blogs" class.</p> + +<code>$route['blog/joe'] = "blogs/users/34";</code> +<p>A URL containing the segments blog/joe will be remapped to the "blogs" class and the "users" method. The ID will be set to "34".</p> + +<code>$route['product/(:any)'] = "catalog/product_lookup";</code> +<p>A URL with "product" as the first segment, and anything in the second will be remapped to the "catalog" class and the "product_lookup" method.</p> + +<code>$route['product/(:num)'] = "catalog/product_lookup_by_id/$1";</code> +<p>A URL with "product" as the first segment, and a number in the second will be remapped to the "catalog" class and the "product_lookup_by_id" method passing in the match as a variable to the function.</p> + +<p class="important"><strong>Important:</strong> Do not use leading/trailing slashes.</p> + +<h2>Regular Expressions</h2> + +<p>If you prefer you can use regular expressions to define your routing rules. Any valid regular expression is allowed, as are back-references.</p> + +<p class="important"><strong>Note:</strong>&nbsp; If you use back-references you must use the dollar syntax rather than the double backslash syntax.</p> + +<p>A typical RegEx route might look something like this:</p> + +<code>$route['products/([a-z]+)/(\d+)'] = "$1/id_$2";</code> + +<p>In the above example, a URI similar to <dfn>products/shirts/123</dfn> would instead call the <dfn>shirts</dfn> controller class and the <dfn>id_123</dfn> function.</p> + +<p>You can also mix and match wildcards with regular expressions.</p> + +<h2>Reserved Routes</h2> + +<p>There are two reserved routes:</p> + +<code>$route['default_controller'] = 'welcome';</code> + +<p>This route indicates which controller class should be loaded if the URI contains no data, which will be the case +when people load your root URL. In the above example, the "welcome" class would be loaded. You +are encouraged to always have a default route otherwise a 404 page will appear by default.</p> + +<code>$route['404_override'] = '';</code> + +<p>This route indicates which controller class should be loaded if the requested controller is not found. It will override the default 404 +error page. It won't affect to the <samp>show_404()</samp> function, which will continue loading the default <dfn>error_404.php</dfn> file at <var>application/errors/error_404.php</var>.</p> + +<p class="important"><strong>Important:</strong>&nbsp; The reserved routes must come before any wildcard or regular expression routes.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="common_functions.html">Common Functions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="errors.html">Error Handling</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/security.html b/user_guide/general/security.html new file mode 100644 index 0000000..4f7b9a3 --- /dev/null +++ b/user_guide/general/security.html @@ -0,0 +1,164 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Security : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Security +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Security</h1> + +<p>This page describes some "best practices" regarding web security, and details +CodeIgniter's internal security features.</p> + + +<h2>URI Security</h2> + +<p>CodeIgniter is fairly restrictive regarding which characters it allows in your URI strings in order to help +minimize the possibility that malicious data can be passed to your application. URIs may only contain the following: +</p> + +<ul> +<li>Alpha-numeric text</li> +<li>Tilde: ~ </li> +<li>Period: .</li> +<li>Colon: :</li> +<li>Underscore: _</li> +<li>Dash: -</li> +</ul> + +<h2>Register_globals</h2> + +<p>During system initialization all global variables are unset, except those found in the $_GET, $_POST, and $_COOKIE arrays. The unsetting +routine is effectively the same as register_globals = off.</p> + +<a name="error_reporting"></a> +<h2>error_reporting</h2> + +<p> + In production environments, it is typically desirable to disable PHP's + error reporting by setting the internal error_reporting flag to a value of 0. This disables native PHP + errors from being rendered as output, which may potentially contain + sensitive information. +</p> + +<p> + Setting CodeIgniter's <kbd>ENVIRONMENT</kbd> constant in index.php to a + value of '<kbd>production</kbd>' will turn off these errors. In development + mode, it is recommended that a value of '<kbd>development</kbd>' is used. + More information about differentiating between environments can be found + on the <a href="environments.html">Handling Environments</a> page. +</p> + +<h2>magic_quotes_runtime</h2> + +<p>The magic_quotes_runtime directive is turned off during system initialization so that you don't have to remove slashes when +retrieving data from your database.</p> + +<h1>Best Practices</h1> + +<p>Before accepting any data into your application, whether it be POST data from a form submission, COOKIE data, URI data, +XML-RPC data, or even data from the SERVER array, you are encouraged to practice this three step approach:</p> + +<ol> +<li>Filter the data as if it were tainted.</li> +<li>Validate the data to ensure it conforms to the correct type, length, size, etc. (sometimes this step can replace step one)</li> +<li>Escape the data before submitting it into your database.</li> +</ol> + +<p>CodeIgniter provides the following functions to assist in this process:</p> + +<ul> + +<li><h2>XSS Filtering</h2> + +<p>CodeIgniter comes with a Cross Site Scripting filter. This filter looks for commonly +used techniques to embed malicious Javascript into your data, or other types of code that attempt to hijack cookies +or do other malicious things. The XSS Filter is described <a href="../libraries/security.html">here</a>. +</p> +</li> + +<li><h2>Validate the data</h2> + +<p>CodeIgniter has a <a href="../libraries/form_validation.html">Form Validation Class</a> that assists you in validating, filtering, and prepping +your data.</p> +</li> + +<li><h2>Escape all data before database insertion</h2> + +<p>Never insert information into your database without escaping it. Please see the section that discusses +<a href="../database/queries.html">queries</a> for more information.</p> + +</li> + +</ul> + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="alternative_php.html">Alternative PHP</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="styleguide.html">PHP Style Guide</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/styleguide.html b/user_guide/general/styleguide.html new file mode 100644 index 0000000..82b2a9c --- /dev/null +++ b/user_guide/general/styleguide.html @@ -0,0 +1,679 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Style Guide : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<style type="text/css" media="screen"> + code { + white-space: pre; + } +</style> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Style Guide +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>General Style and Syntax</h1> + +<p>The following page describes the use of coding rules adhered to when developing CodeIgniter.</p> + + +<h2>Table of Contents</h2> +<ul class="minitoc"> + <li><a href="#file_format">File Format</a></li> + <li><a href="#php_closing_tag">PHP Closing Tag</a></li> + <li><a href="#class_and_method_naming">Class and Method Naming</a></li> + <li><a href="#variable_names">Variable Names</a></li> + <li><a href="#commenting">Commenting</a></li> + <li><a href="#constants">Constants</a></li> + <li><a href="#true_false_and_null">TRUE, FALSE, and NULL</a></li> + <li><a href="#logical_operators">Logical Operators</a></li> + <li><a href="#comparing_return_values_and_typecasting">Comparing Return Values and Typecasting</a></li> + <li><a href="#debugging_code">Debugging Code</a></li> + <li><a href="#whitespace_in_files">Whitespace in Files</a></li> + <li><a href="#compatibility">Compatibility</a></li> + <li><a href="#class_and_file_names_using_common_words">Class and File Names using Common Words</a></li> + <li><a href="#database_table_names">Database Table Names</a></li> + <li><a href="#one_file_per_class">One File per Class</a></li> + <li><a href="#whitespace">Whitespace</a></li> + <li><a href="#line_breaks">Line Breaks</a></li> + <li><a href="#code_indenting">Code Indenting</a></li> + <li><a href="#bracket_spacing">Bracket and Parenthetic Spacing</li> + <li><a href="#localized_text">Localized Text</a></li> + <li><a href="#private_methods_and_variables">Private Methods and Variables</a></li> + <li><a href="#php_errors">PHP Errors</a></li> + <li><a href="#short_open_tags">Short Open Tags</a></li> + <li><a href="#one_statement_per_line">One Statement Per Line</a></li> + <li><a href="#strings">Strings</a></li> + <li><a href="#sql_queries">SQL Queries</a></li> + <li><a href="#default_function_arguments">Default Function Arguments</a></li> +</ul> + +<li> + + <h2><a name="file_format"></a>File Format</h2> + <div class="guidelineDetails"> + <p>Files should be saved with Unicode (UTF-8) encoding. The <abbr title="Byte Order Mark">BOM</abbr> + should <em>not</em> be used. Unlike UTF-16 and UTF-32, there's no byte order to indicate in + a UTF-8 encoded file, and the <abbr title="Byte Order Mark">BOM</abbr> can have a negative side effect in PHP of sending output, + preventing the application from being able to set its own headers. Unix line endings should + be used (LF).</p> + + <p>Here is how to apply these settings in some of the more common text editors. Instructions for your + text editor may vary; check your text editor's documentation.</p> + + <h5>TextMate</h5> + + <ol> + <li>Open the Application Preferences</li> + <li>Click Advanced, and then the "Saving" tab</li> + <li>In "File Encoding", select "UTF-8 (recommended)"</li> + <li>In "Line Endings", select "LF (recommended)"</li> + <li><em>Optional:</em> Check "Use for existing files as well" if you wish to modify the line + endings of files you open to your new preference.</li> + </ol> + + <h5>BBEdit</h5> + + <ol> + <li>Open the Application Preferences</li> + <li>Select "Text Encodings" on the left.</li> + <li>In "Default text encoding for new documents", select "Unicode (UTF-8, no BOM)"</li> + <li><em>Optional:</em> In "If file's encoding can't be guessed, use", select + "Unicode (UTF-8, no BOM)"</li> + <li>Select "Text Files" on the left.</li> + <li>In "Default line breaks", select "Mac OS X and Unix (LF)"</li> + </ol> + </div> + + <h2><a name="php_closing_tag"></a>PHP Closing Tag</h2> + <div class="guidelineDetails"> + <p>The PHP closing tag on a PHP document <strong>?&gt;</strong> is optional to the PHP parser. However, if used, any whitespace following the closing tag, whether introduced + by the developer, user, or an FTP application, can cause unwanted output, PHP errors, or if the latter are suppressed, blank pages. For this reason, all PHP files should + <strong>OMIT</strong> the closing PHP tag, and instead use a comment block to mark the end of file and it's location relative to the application root. + This allows you to still identify a file as being complete and not truncated.</p> +<code><strong>INCORRECT</strong>: +&lt;?php + +echo "Here's my code!"; + +?&gt; + +<strong>CORRECT</strong>: +&lt;?php + +echo "Here's my code!"; + +/* End of file myfile.php */ +/* Location: ./system/modules/mymodule/myfile.php */ +</code> + </div> + + + <h2><a name="class_and_method_naming"></a>Class and Method Naming</h2> + <div class="guidelineDetails"> + <p>Class names should always start with an uppercase letter. Multiple words should be separated with an underscore, and not CamelCased. All other class methods should be entirely lowercased and named to clearly indicate their function, preferably including a verb. Try to avoid overly long and verbose names.</p> + + <code><strong>INCORRECT</strong>: +class superclass +class SuperClass + +<strong>CORRECT</strong>: +class Super_class</code> + + + <code>class Super_class { + + function __construct() + { + + } +}</code> + + <p>Examples of improper and proper method naming:</p> + + <code><strong>INCORRECT</strong>: +function fileproperties() // not descriptive and needs underscore separator +function fileProperties() // not descriptive and uses CamelCase +function getfileproperties() // Better! But still missing underscore separator +function getFileProperties() // uses CamelCase +function get_the_file_properties_from_the_file() // wordy + +<strong>CORRECT</strong>: +function get_file_properties() // descriptive, underscore separator, and all lowercase letters</code> + + </div> + + + <h2><a name="variable_names"></a>Variable Names</h2> + <div class="guidelineDetails"> + <p>The guidelines for variable naming is very similar to that used for class methods. Namely, variables should contain only lowercase letters, use underscore separators, and be reasonably named to indicate their purpose and contents. Very short, non-word variables should only be used as iterators in for() loops.</p> +<code><strong>INCORRECT</strong>: +$j = &apos;foo&apos;; // single letter variables should only be used in for() loops +$Str // contains uppercase letters +$bufferedText // uses CamelCasing, and could be shortened without losing semantic meaning +$groupid // multiple words, needs underscore separator +$name_of_last_city_used // too long + +<strong>CORRECT</strong>: +for ($j = 0; $j &lt; 10; $j++) +$str +$buffer +$group_id +$last_city +</code> + </div> + + + <h2><a name="commenting"></a>Commenting</h2> + <div class="guidelineDetails"> + <p>In general, code should be commented prolifically. It not only helps describe the flow and intent of the code for less experienced programmers, but can prove invaluable when returning to your own code months down the line. There is not a required format for comments, but the following are recommended.</p> + + <p><a href="http://manual.phpdoc.org/HTMLSmartyConverter/HandS/phpDocumentor/tutorial_phpDocumentor.howto.pkg.html#basics.docblock">DocBlock</a> style comments preceding class and method declarations so they can be picked up by IDEs:</p> + +<code>/** + * Super Class + * + * @package Package Name + * @subpackage Subpackage + * @category Category + * @author Author Name + * @link http://example.com + */ +class Super_class {</code> + +<code>/** + * Encodes string for use in XML + * + * @access public + * @param string + * @return string + */ +function xml_encode($str)</code> + + <p>Use single line comments within code, leaving a blank line between large comment blocks and code.</p> + +<code>// break up the string by newlines +$parts = explode("\n", $str); + +// A longer comment that needs to give greater detail on what is +// occurring and why can use multiple single-line comments. Try to +// keep the width reasonable, around 70 characters is the easiest to +// read. Don't hesitate to link to permanent external resources +// that may provide greater detail: +// +// http://example.com/information_about_something/in_particular/ + +$parts = $this->foo($parts); +</code> + </div> + + + <h2><a name="constants"></a>Constants</h2> + <div class="guidelineDetails"> + <p>Constants follow the same guidelines as do variables, except constants should always be fully uppercase. <em>Always use CodeIgniter constants when appropriate, i.e. SLASH, LD, RD, PATH_CACHE, etc.</em></p> +<code><strong>INCORRECT</strong>: +myConstant // missing underscore separator and not fully uppercase +N // no single-letter constants +S_C_VER // not descriptive +$str = str_replace('{foo}', 'bar', $str); // should use LD and RD constants + +<strong>CORRECT</strong>: +MY_CONSTANT +NEWLINE +SUPER_CLASS_VERSION +$str = str_replace(LD.'foo'.RD, 'bar', $str); +</code> + </div> + + + <h2><a name="true_false_and_null"></a>TRUE, FALSE, and NULL</h2> + <div class="guidelineDetails"> + <p><strong>TRUE</strong>, <strong>FALSE</strong>, and <strong>NULL</strong> keywords should always be fully uppercase.</p> +<code><strong>INCORRECT</strong>: +if ($foo == true) +$bar = false; +function foo($bar = null) + +<strong>CORRECT</strong>: +if ($foo == TRUE) +$bar = FALSE; +function foo($bar = NULL)</code> + </div> + + + + <h2><a name="logical_operators"></a>Logical Operators</h2> + <div class="guidelineDetails"> + <p>Use of <strong>||</strong> is discouraged as its clarity on some output devices is low (looking like the number 11 for instance). + <strong>&amp;&amp;</strong> is preferred over <strong>AND</strong> but either are acceptable, and a space should always precede and follow <strong>!</strong>.</p> +<code><strong>INCORRECT</strong>: +if ($foo || $bar) +if ($foo AND $bar) // okay but not recommended for common syntax highlighting applications +if (!$foo) +if (! is_array($foo)) + +<strong>CORRECT</strong>: +if ($foo OR $bar) +if ($foo && $bar) // recommended +if ( ! $foo) +if ( ! is_array($foo)) +</code> + </div> + + + + <h2><a name="comparing_return_values_and_typecasting"></a>Comparing Return Values and Typecasting</h2> + <div class="guidelineDetails"> + <p>Some PHP functions return FALSE on failure, but may also have a valid return value of "" or 0, which would evaluate to FALSE in loose comparisons. Be explicit by comparing the variable type when using these return values in conditionals to ensure the return value is indeed what you expect, and not a value that has an equivalent loose-type evaluation.</p> + <p>Use the same stringency in returning and checking your own variables. Use <strong>===</strong> and <strong>!==</strong> as necessary. + +<code><strong>INCORRECT</strong>: +// If 'foo' is at the beginning of the string, strpos will return a 0, +// resulting in this conditional evaluating as TRUE +if (strpos($str, 'foo') == FALSE) + +<strong>CORRECT</strong>: +if (strpos($str, 'foo') === FALSE) +</code> + +<code><strong>INCORRECT</strong>: +function build_string($str = "") +{ + if ($str == "") // uh-oh! What if FALSE or the integer 0 is passed as an argument? + { + + } +} + +<strong>CORRECT</strong>: +function build_string($str = "") +{ + if ($str === "") + { + + } +}</code> + + <p>See also information regarding <a href="http://us3.php.net/manual/en/language.types.type-juggling.php#language.types.typecasting">typecasting</a>, which can be quite useful. Typecasting has a slightly different effect which may be desirable. When casting a variable as a string, for instance, NULL and boolean FALSE variables become empty strings, 0 (and other numbers) become strings of digits, and boolean TRUE becomes "1":</p> + +<code>$str = (string) $str; // cast $str as a string</code> + + </div> + + + <h2><a name="debugging_code"></a>Debugging Code</h2> + <div class="guidelineDetails"> + <p>No debugging code can be left in place for submitted add-ons unless it is commented out, i.e. no var_dump(), print_r(), die(), and exit() calls that were used while creating the add-on, unless they are commented out.</p> + +<code>// print_r($foo);</code> + </div> + + + + <h2><a name="whitespace_in_files"></a>Whitespace in Files</h2> + <div class="guidelineDetails"> + <p>No whitespace can precede the opening PHP tag or follow the closing PHP tag. Output is buffered, so whitespace in your files can cause output to begin before CodeIgniter outputs its content, leading to errors and an inability for CodeIgniter to send proper headers. In the examples below, select the text with your mouse to reveal the incorrect whitespace.</p> + + <p><strong>INCORRECT</strong>:</p> +<code> +&lt;?php + // ...there is whitespace and a linebreak above the opening PHP tag + // as well as whitespace after the closing PHP tag +?&gt; +</code> + <p><strong>CORRECT</strong>:</p> +<code>&lt;?php + // this sample has no whitespace before or after the opening and closing PHP tags +?&gt;</code> + + </div> + + + <h2><a name="compatibility"></a>Compatibility</h2> + <div class="guidelineDetails"> + <p>Unless specifically mentioned in your add-on's documentation, all code must be compatible with PHP version 5.1+. Additionally, do not use PHP functions that require non-default libraries to be installed unless your code contains an alternative method when the function is not available, or you implicitly document that your add-on requires said PHP libraries.</p> + </div> + + + + <h2><a name="class_and_file_names_using_common_words"></a>Class and File Names using Common Words</h2> + <div class="guidelineDetails"> + <p>When your class or filename is a common word, or might quite likely be identically named in another PHP script, provide a unique prefix to help prevent collision. Always realize that your end users may be running other add-ons or third party PHP scripts. Choose a prefix that is unique to your identity as a developer or company.</p> + +<code><strong>INCORRECT</strong>: +class Email pi.email.php +class Xml ext.xml.php +class Import mod.import.php + +<strong>CORRECT</strong>: +class Pre_email pi.pre_email.php +class Pre_xml ext.pre_xml.php +class Pre_import mod.pre_import.php +</code> + </div> + + + <h2><a name="database_table_names"></a>Database Table Names</h2> + <div class="guidelineDetails"> + <p>Any tables that your add-on might use must use the 'exp_' prefix, followed by a prefix uniquely identifying you as the developer or company, and then a short descriptive table name. You do not need to be concerned about the database prefix being used on the user's installation, as CodeIgniter's database class will automatically convert 'exp_' to what is actually being used.</p> + +<code><strong>INCORRECT</strong>: +email_addresses // missing both prefixes +pre_email_addresses // missing exp_ prefix +exp_email_addresses // missing unique prefix + +<strong>CORRECT</strong>: +exp_pre_email_addresses +</code> + + <p class="important"><strong>NOTE:</strong> Be mindful that MySQL has a limit of 64 characters for table names. This should not be an issue as table names that would exceed this would likely have unreasonable names. For instance, the following table name exceeds this limitation by one character. Silly, no? <strong>exp_pre_email_addresses_of_registered_users_in_seattle_washington</strong> + </div> + + + + <h2><a name="one_file_per_class"></a>One File per Class</h2> + <div class="guidelineDetails"> + <p>Use separate files for each class your add-on uses, unless the classes are <em>closely related</em>. An example of CodeIgniter files that contains multiple classes is the Database class file, which contains both the DB class and the DB_Cache class, and the Magpie plugin, which contains both the Magpie and Snoopy classes.</p> + </div> + + + + <h2><a name="whitespace"></a>Whitespace</h2> + <div class="guidelineDetails"> + <p>Use tabs for whitespace in your code, not spaces. This may seem like a small thing, but using tabs instead of whitespace allows the developer looking at your code to have indentation at levels that they prefer and customize in whatever application they use. And as a side benefit, it results in (slightly) more compact files, storing one tab character versus, say, four space characters.</p> + </div> + + + + <h2><a name="line_breaks"></a>Line Breaks</h2> + <div class="guidelineDetails"> + <p>Files must be saved with Unix line breaks. This is more of an issue for developers who work in Windows, but in any case ensure that your text editor is setup to save files with Unix line breaks.</p> + </div> + + + + <h2><a name="code_indenting"></a>Code Indenting</h2> + <div class="guidelineDetails"> + <p>Use Allman style indenting. With the exception of Class declarations, braces are always placed on a line by themselves, and indented at the same level as the control statement that "owns" them.</p> + +<code><strong>INCORRECT</strong>: +function foo($bar) { + // ... +} + +foreach ($arr as $key => $val) { + // ... +} + +if ($foo == $bar) { + // ... +} else { + // ... +} + +for ($i = 0; $i &lt; 10; $i++) + { + for ($j = 0; $j &lt; 10; $j++) + { + // ... + } + } + +<strong>CORRECT</strong>: +function foo($bar) +{ + // ... +} + +foreach ($arr as $key => $val) +{ + // ... +} + +if ($foo == $bar) +{ + // ... +} +else +{ + // ... +} + +for ($i = 0; $i &lt; 10; $i++) +{ + for ($j = 0; $j &lt; 10; $j++) + { + // ... + } +}</code> + </div> + + + <h2><a name="bracket_spacing"></a>Bracket and Parenthetic Spacing</h2> + <div class="guidelineDetails"> + <p>In general, parenthesis and brackets should not use any additional spaces. The exception is that a space should always follow PHP control structures that accept arguments with parenthesis (declare, do-while, elseif, for, foreach, if, switch, while), to help distinguish them from functions and increase readability.</p> + +<code>INCORRECT: +$arr[ $foo ] = 'foo'; + +CORRECT: +$arr[$foo] = 'foo'; // no spaces around array keys + + +INCORRECT: +function foo ( $bar ) +{ + +} + +CORRECT: +function foo($bar) // no spaces around parenthesis in function declarations +{ + +} + + +INCORRECT: +foreach( $query->result() as $row ) + +CORRECT: +foreach ($query->result() as $row) // single space following PHP control structures, but not in interior parenthesis +</code> + </div> + + + + <h2><a name="localized_text"></a>Localized Text</h2> + <div class="guidelineDetails"> + <p>Any text that is output in the control panel should use language variables in your lang file to allow localization.</p> + +<code>INCORRECT: +return "Invalid Selection"; + +CORRECT: +return $this->lang->line('invalid_selection');</code> + </div> + + + + <h2><a name="private_methods_and_variables"></a>Private Methods and Variables</h2> + <div class="guidelineDetails"> + <p>Methods and variables that are only accessed internally by your class, such as utility and helper functions that your public methods use for code abstraction, should be prefixed with an underscore.</p> + +<code>convert_text() // public method +_convert_text() // private method</code> + </div> + + + + <h2><a name="php_errors"></a>PHP Errors</h2> + <div class="guidelineDetails"> + <p>Code must run error free and not rely on warnings and notices to be hidden to meet this requirement. For instance, never access a variable that you did not set yourself (such as $_POST array keys) without first checking to see that it isset().</p> + + <p>Make sure that while developing your add-on, error reporting is enabled for ALL users, and that display_errors is enabled in the PHP environment. You can check this setting with:</p> + +<code>if (ini_get('display_errors') == 1) +{ + exit "Enabled"; +}</code> + + <p>On some servers where display_errors is disabled, and you do not have the ability to change this in the php.ini, you can often enable it with:</p> + +<code>ini_set('display_errors', 1);</code> + + <p class="important"><strong>NOTE:</strong> Setting the <a href="http://us.php.net/manual/en/ref.errorfunc.php#ini.display-errors">display_errors</a> setting with ini_set() at runtime is not identical to having it enabled in the PHP environment. Namely, it will not have any effect if the script has fatal errors</p> + </div> + + + + <h2><a name="short_open_tags"></a>Short Open Tags</h2> + <div class="guidelineDetails"> + <p>Always use full PHP opening tags, in case a server does not have short_open_tag enabled.</p> + +<code><strong>INCORRECT</strong>: +&lt;? echo $foo; ?&gt; + +&lt;?=$foo?&gt; + +<strong>CORRECT</strong>: +&lt;?php echo $foo; ?&gt;</code> + </div> + + + + <h2><a name="one_statement_per_line"></a>One Statement Per Line</h2> + <div class="guidelineDetails"> + <p>Never combine statements on one line.</p> + +<code><strong>INCORRECT</strong>: +$foo = 'this'; $bar = 'that'; $bat = str_replace($foo, $bar, $bag); + +<strong>CORRECT</strong>: +$foo = 'this'; +$bar = 'that'; +$bat = str_replace($foo, $bar, $bag); +</code> + </div> + + + + <h2><a name="strings"></a>Strings</h2> + <div class="guidelineDetails"> + <p>Always use single quoted strings unless you need variables parsed, and in cases where you do need variables parsed, use braces to prevent greedy token parsing. You may also use double-quoted strings if the string contains single quotes, so you do not have to use escape characters.</p> + +<code><strong>INCORRECT</strong>: +"My String" // no variable parsing, so no use for double quotes +"My string $foo" // needs braces +'SELECT foo FROM bar WHERE baz = \'bag\'' // ugly + +<strong>CORRECT</strong>: +'My String' +"My string {$foo}" +"SELECT foo FROM bar WHERE baz = 'bag'"</code> + </div> + + + + <h2><a name="sql_queries"></a>SQL Queries</h2> + <div class="guidelineDetails"> + <p>MySQL keywords are always capitalized: SELECT, INSERT, UPDATE, WHERE, AS, JOIN, ON, IN, etc.</p> + + <p>Break up long queries into multiple lines for legibility, preferably breaking for each clause.</p> + +<code><strong>INCORRECT</strong>: +// keywords are lowercase and query is too long for +// a single line (... indicates continuation of line) +$query = $this->db->query("select foo, bar, baz, foofoo, foobar as raboof, foobaz from exp_pre_email_addresses +...where foo != 'oof' and baz != 'zab' order by foobaz limit 5, 100"); + +<strong>CORRECT</strong>: +$query = $this->db->query("SELECT foo, bar, baz, foofoo, foobar AS raboof, foobaz + FROM exp_pre_email_addresses + WHERE foo != 'oof' + AND baz != 'zab' + ORDER BY foobaz + LIMIT 5, 100");</code> + </div> + + + + <h2><a name="default_function_arguments"></a>Default Function Arguments</h2> + <div class="guidelineDetails"> + <p>Whenever appropriate, provide function argument defaults, which helps prevent PHP errors with mistaken calls and provides common fallback values which can save a few lines of code. Example:</p> + +<code>function foo($bar = '', $baz = FALSE)</code> + </div> + + + +</div> + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="security.html">Security</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="../doc_style/index.html">Writing Documentation</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/urls.html b/user_guide/general/urls.html new file mode 100644 index 0000000..bea0a5e --- /dev/null +++ b/user_guide/general/urls.html @@ -0,0 +1,151 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter URLs : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +URLS +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>CodeIgniter URLs</h1> + +<p>By default, URLs in CodeIgniter are designed to be search-engine and human friendly. Rather than using the standard "query string" +approach to URLs that is synonymous with dynamic systems, CodeIgniter uses a <strong>segment-based</strong> approach:</p> + +<code>example.com/<var>news</var>/<dfn>article</dfn>/<samp>my_article</samp></code> + +<p class="important"><strong>Note:</strong> Query string URLs can be optionally enabled, as described below.</p> + +<h2>URI Segments</h2> + +<p>The segments in the URL, in following with the Model-View-Controller approach, usually represent:</p> + +<code>example.com/<var>class</var>/<dfn>function</dfn>/<samp>ID</samp></code> + +<ol> +<li>The first segment represents the controller <strong>class</strong> that should be invoked.</li> +<li>The second segment represents the class <strong>function</strong>, or method, that should be called.</li> +<li>The third, and any additional segments, represent the ID and any variables that will be passed to the controller.</li> +</ol> + +<p>The <a href="../libraries/uri.html">URI Class</a> and the <a href="../helpers/url_helper.html">URL Helper</a> +contain functions that make it easy to work with your URI data. In addition, your URLs can be remapped using the +<a href="routing.html">URI Routing</a> feature for more flexibility.</p> + + + +<h2>Removing the index.php file</h2> + +<p>By default, the <strong>index.php</strong> file will be included in your URLs:</p> + +<code>example.com/<var>index.php</var>/news/article/my_article</code> + +<p>You can easily remove this file by using a .htaccess file with some simple rules. Here is an example + of such a file, using the "negative" method in which everything is redirected except the specified items:</p> + +<code>RewriteEngine on<br /> +RewriteCond $1 !^(index\.php|images|robots\.txt)<br /> +RewriteRule ^(.*)$ /index.php/$1 [L]</code> + +<p>In the above example, any HTTP request other than those for index.php, images, and robots.txt is treated as +a request for your index.php file.</p> + + +<h2>Adding a URL Suffix</h2> + +<p>In your <dfn>config/config.php</dfn> file you can specify a suffix that will be added to all URLs generated +by CodeIgniter. For example, if a URL is this:</p> + +<code>example.com/index.php/products/view/shoes</code> + +<p>You can optionally add a suffix, like <kbd>.html</kbd>, making the page appear to be of a certain type:</p> + +<code>example.com/index.php/products/view/shoes.html</code> + + +<h2>Enabling Query Strings</h2> + +<p>In some cases you might prefer to use query strings URLs:</p> + +<code>index.php?c=products&amp;m=view&amp;id=345</code> + +<p>CodeIgniter optionally supports this capability, which can be enabled in your <dfn>application/config.php</dfn> file. If you +open your config file you'll see these items:</p> + +<code>$config['enable_query_strings'] = FALSE;<br /> +$config['controller_trigger'] = 'c';<br /> +$config['function_trigger'] = 'm';</code> + +<p>If you change "enable_query_strings" to TRUE this feature will become active. Your controllers and functions will then +be accessible using the "trigger" words you've set to invoke your controllers and methods:</p> + +<code>index.php?c=controller&amp;m=method</code> + +<p class="important"><strong>Please note:</strong> If you are using query strings you will have to build your own URLs, rather than utilizing +the URL helpers (and other helpers that generate URLs, like some of the form helpers) as these are designed to work with +segment based URLs.</p> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="controllers.html">Controllers</a></p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/general/views.html b/user_guide/general/views.html new file mode 100644 index 0000000..340d31d --- /dev/null +++ b/user_guide/general/views.html @@ -0,0 +1,274 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Views : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Views +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Views</h1> + +<p>A <dfn>view</dfn> is simply a web page, or a page fragment, like a header, footer, sidebar, etc. +In fact, views can flexibly be embedded within other views (within other views, etc., etc.) if you need this type +of hierarchy.</p> + +<p>Views are never called directly, they must be loaded by a <a href="controllers.html">controller</a>. Remember that in an MVC framework, the Controller acts as the +traffic cop, so it is responsible for fetching a particular view. If you have not read the <a href="controllers.html">Controllers</a> page +you should do so before continuing.</p> + +<p>Using the example controller you created in the <a href="controllers.html">controller</a> page, let's add a view to it.</p> + +<h2>Creating a View</h2> + +<p>Using your text editor, create a file called <dfn>blogview.php</dfn>, and put this in it:</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="10"> +&lt;html> +&lt;head> +&lt;title>My Blog&lt;/title> +&lt;/head> +&lt;body> + &lt;h1>Welcome to my Blog!&lt;/h1> +&lt;/body> +&lt;/html> +</textarea> + +<p>Then save the file in your <dfn>application/views/</dfn> folder.</p> + +<h2>Loading a View</h2> + +<p>To load a particular view file you will use the following function:</p> + +<code>$this->load->view('<var>name</var>');</code> + +<p>Where <var>name</var> is the name of your view file. Note: The .php file extension does not need to be specified unless you use something other than <kbd>.php</kbd>.</p> + + +<p>Now, open the controller file you made earlier called <dfn>blog.php</dfn>, and replace the echo statement with the view loading function:</p> + + +<textarea class="textarea" style="width:100%" cols="50" rows="10"> +&lt;?php +class Blog extends CI_Controller { + + function index() + { + $this->load->view('blogview'); + } +} +?&gt; +</textarea> + + +<p>If you visit your site using the URL you did earlier you should see your new view. The URL was similar to this:</p> + +<code>example.com/index.php/<var>blog</var>/</code> + +<h2>Loading multiple views</h2> +<p>CodeIgniter will intelligently handle multiple calls to $this-&gt;load-&gt;view from within a controller. If more than one call happens they will be appended together. For example, you may wish to have a header view, a menu view, a content view, and a footer view. That might look something like this:</p> +<p><code>&lt;?php<br /> +<br /> +class Page extends CI_Controller {<br /><br /> + + &nbsp;&nbsp;&nbsp;function index()<br /> +&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data['page_title'] = 'Your title';<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;load-&gt;view('header');<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;load-&gt;view('menu');<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;load-&gt;view('content', $data);<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;load-&gt;view('footer');<br /> +&nbsp;&nbsp;&nbsp;}<br /> +<br /> +}<br /> + ?&gt;</code></p> +<p>In the example above, we are using &quot;dynamically added data&quot;, which you will see below.</p> +<h2>Storing Views within Sub-folders</h2> +<p>Your view files can also be stored within sub-folders if you prefer that type of organization. When doing so you will need +to include the folder name loading the view. Example:</p> + +<code>$this->load->view('<kbd>folder_name</kbd>/<var>file_name</var>');</code> + + +<h2>Adding Dynamic Data to the View</h2> + +<p>Data is passed from the controller to the view by way of an <strong>array</strong> or an <strong>object</strong> in the second +parameter of the view loading function. Here is an example using an array:</p> + +<code>$data = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'title' => 'My Title',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'heading' => 'My Heading',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'message' => 'My Message'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +$this->load->view('blogview', <var>$data</var>);</code> + +<p>And here's an example using an object:</p> + +<code>$data = new Someclass();<br /> +$this->load->view('blogview', <var>$data</var>);</code> + +<p>Note: If you use an object, the class variables will be turned into array elements.</p> + + +<p>Let's try it with your controller file. Open it add this code:</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="14"> +&lt;?php +class Blog extends CI_Controller { + + function index() + { + $data['title'] = "My Real Title"; + $data['heading'] = "My Real Heading"; + + $this->load->view('blogview', $data); + } +} +?&gt; +</textarea> + + +<p>Now open your view file and change the text to variables that correspond to the array keys in your data:</p> + + +<textarea class="textarea" style="width:100%" cols="50" rows="10"> +&lt;html> +&lt;head> +&lt;title>&lt;?php echo $title;?>&lt;/title> +&lt;/head> +&lt;body> + &lt;h1>&lt;?php echo $heading;?>&lt;/h1> +&lt;/body> +&lt;/html> +</textarea> + +<p>Then load the page at the URL you've been using and you should see the variables replaced.</p> + +<h2>Creating Loops</h2> + +<p>The data array you pass to your view files is not limited to simple variables. You can +pass multi dimensional arrays, which can be looped to generate multiple rows. For example, if you +pull data from your database it will typically be in the form of a multi-dimensional array.</p> + +<p>Here's a simple example. Add this to your controller:</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="17"> +&lt;?php +class Blog extends CI_Controller { + + function index() + { + $data['todo_list'] = array('Clean House', 'Call Mom', 'Run Errands'); + + $data['title'] = "My Real Title"; + $data['heading'] = "My Real Heading"; + + $this->load->view('blogview', $data); + } +} +?&gt; +</textarea> + + +<p>Now open your view file and create a loop:</p> + + +<textarea class="textarea" style="width:100%" cols="50" rows="24"> +&lt;html> +&lt;head> +&lt;title>&lt;?php echo $title;?>&lt;/title> +&lt;/head> +&lt;body> +&lt;h1>&lt;?php echo $heading;?>&lt;/h1> + +&lt;h3>My Todo List&lt;/h3> + +&lt;ul> +&lt;?php foreach ($todo_list as $item):?> + +&lt;li>&lt;?php echo $item;?>&lt;/li> + +&lt;?php endforeach;?> +&lt;/ul> + +&lt;/body> +&lt;/html> +</textarea> +<p><strong>Note:</strong> You'll notice that in the example above we are using PHP's alternative syntax. If you +are not familiar with it you can read about it <a href="alternative_php.html">here</a>.</p> + +<h2>Returning views as data</h2> + +<p>There is a third <strong>optional</strong> parameter lets you change the behavior of the function so that it returns data as a string +rather than sending it to your browser. This can be useful if you want to process the data in some way. If you +set the parameter to <kbd>true</kbd> (boolean) it will return data. The default behavior is <kbd>false</kbd>, which sends it +to your browser. Remember to assign it to a variable if you want the data returned:</p> + +<code>$string = $this->load->view('<var>myfile</var>', '', <kbd>true</kbd>);</code> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="reserved_names.html">Reserved Names</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="models.html">Models</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/helpers/array_helper.html b/user_guide/helpers/array_helper.html new file mode 100644 index 0000000..788c5f2 --- /dev/null +++ b/user_guide/helpers/array_helper.html @@ -0,0 +1,170 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Array Helper : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Array Helper +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Array Helper</h1> + +<p>The Array Helper file contains functions that assist in working with arrays.</p> + + +<h2>Loading this Helper</h2> + +<p>This helper is loaded using the following code:</p> +<code>$this->load->helper('array');</code> + +<p>The following functions are available:</p> + +<h2>element()</h2> + +<p>Lets you fetch an item from an array. The function tests whether the array index is set and whether it has a value. If +a value exists it is returned. If a value does not exist it returns FALSE, or whatever you've specified as the default value via the third parameter. Example:</p> + +<code> +$array = array('color' => 'red', 'shape' => 'round', 'size' => '');<br /> +<br /> +// returns "red"<br /> +echo element('color', $array);<br /> +<br /> +// returns NULL<br /> +echo element('size', $array, NULL); +</code> + + +<h2>random_element()</h2> + +<p>Takes an array as input and returns a random element from it. Usage example:</p> + +<code>$quotes = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"I find that the harder I work, the more luck I seem to have. - Thomas Jefferson",<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Don't stay in bed, unless you can make money in bed. - George Burns",<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"We didn't lose the game; we just ran out of time. - Vince Lombardi",<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"If everything seems under control, you're not going fast enough. - Mario Andretti",<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Reality is merely an illusion, albeit a very persistent one. - Albert Einstein",<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Chance favors the prepared mind - Louis Pasteur"<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +echo random_element($quotes);</code> + + +<h2>elements()</h2> + +<p>Lets you fetch a number of items from an array. The function tests whether each of the array indices is set. If an index does not exist +it is set to FALSE, or whatever you've specified as the default value via the third parameter. Example:</p> + +<code> +$array = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'color' => 'red',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'shape' => 'round',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'radius' => '10',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'diameter' => '20'<br /> +);<br /> +<br /> +$my_shape = elements(array('color', 'shape', 'height'), $array);<br /> +</code> + +<p>The above will return the following array:</p> + +<code> +array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'color' => 'red',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'shape' => 'round',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'height' => FALSE<br /> +); +</code> + +<p>You can set the third parameter to any default value you like:</p> + +<code> +$my_shape = elements(array('color', 'shape', 'height'), $array, NULL);<br /> +</code> + +<p>The above will return the following array:</p> + +<code> +array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'color' => 'red',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'shape' => 'round',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'height' => NULL<br /> +); +</code> + +<p>This is useful when sending the <kbd>$_POST</kbd> array to one of your Models. This prevents users from +sending additional POST data to be entered into your tables:</p> + +<code> +$this->load->model('post_model');<br /> +<br /> +$this->post_model->update(elements(array('id', 'title', 'content'), $_POST)); +</code> + +<p>This ensures that only the id, title and content fields are sent to be updated.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp; <a href="../libraries/javascript.html">Javascript Class</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="captcha_helper.html">CAPTCHA Helper</a></p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/helpers/captcha_helper.html b/user_guide/helpers/captcha_helper.html new file mode 100644 index 0000000..c43bb77 --- /dev/null +++ b/user_guide/helpers/captcha_helper.html @@ -0,0 +1,195 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CAPTCHA Helper : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +CAPTCHA Helper +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>CAPTCHA Helper</h1> + +<p>The CAPTCHA Helper file contains functions that assist in creating CAPTCHA images.</p> + + +<h2>Loading this Helper</h2> + +<p>This helper is loaded using the following code:</p> +<code>$this->load->helper('captcha');</code> + +<p>The following functions are available:</p> + +<h2>create_captcha(<var>$data</var>)</h2> + +<p>Takes an array of information to generate the CAPTCHA as input and creates the image to your specifications, returning an array of associative data about the image.</p> + +<code>[array]<br /> +(<br /> +&nbsp;&nbsp;'image' => IMAGE TAG<br /> +&nbsp;&nbsp;'time' => TIMESTAMP (in microtime)<br /> +&nbsp;&nbsp;'word' => CAPTCHA WORD<br /> +)</code> + + <p>The "image" is the actual image tag: +<code>&lt;img src=&quot;http://example.com/captcha/12345.jpg&quot; width=&quot;140&quot; height=&quot;50&quot; /&gt;</code></p> + + <p>The "time" is the micro timestamp used as the image name without the file + extension. It will be a number like this: 1139612155.3422</p> + + <p>The "word" is the word that appears in the captcha image, which if not + supplied to the function, will be a random string.</p> + + <h3>Using the CAPTCHA helper</h3> + + <p>Once loaded you can generate a captcha like this:</p> + +<code>$vals = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'word' => 'Random word',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'img_path' => './captcha/',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'img_url' => 'http://example.com/captcha/',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'font_path' => './path/to/fonts/texb.ttf',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'img_width' => '150',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'img_height' => 30,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'expiration' => 7200<br /> +&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +$cap = create_captcha($vals);<br /> +echo $cap['image'];</code> + + <ul> + <li>The captcha function requires the GD image library.</li> + <li>Only the img_path and img_url are required.</li> + <li>If a "word" is not supplied, the function will generate a random + ASCII string. You might put together your own word library that + you can draw randomly from.</li> + <li>If you do not specify a path to a TRUE TYPE font, the native ugly GD + font will be used.</li> + <li>The "captcha" folder must be writable (666, or 777)</li> + <li>The "expiration" (in seconds) signifies how long an image will + remain in the captcha folder before it will be deleted. The default + is two hours.</li> + </ul> + + <h3>Adding a Database</h3> + + <p>In order for the captcha function to prevent someone from submitting, you will need + to add the information returned from <kbd>create_captcha()</kbd> function to your database. + Then, when the data from the form is submitted by the user you will need to verify + that the data exists in the database and has not expired.</p> + + <p>Here is a table prototype:</p> + +<code>CREATE TABLE captcha (<br /> +&nbsp;captcha_id bigint(13) unsigned NOT NULL auto_increment,<br /> +&nbsp;captcha_time int(10) unsigned NOT NULL,<br /> +&nbsp;ip_address varchar(16) default '0' NOT NULL,<br /> +&nbsp;word varchar(20) NOT NULL,<br /> +&nbsp;PRIMARY KEY `captcha_id` (`captcha_id`),<br /> +&nbsp;KEY `word` (`word`)<br /> +);</code> + + <p>Here is an example of usage with a database. On the page where the CAPTCHA will be shown you'll have something like this:</p> + +<code>$this-&gt;load-&gt;helper(&#x27;captcha&#x27;);<br /> +$vals = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&#x27;img_path&#x27; =&gt; &#x27;./captcha/&#x27;,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&#x27;img_url&#x27; =&gt; &#x27;http://example.com/captcha/&#x27;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +$cap = create_captcha($vals);<br /> +<br /> +$data = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&#x27;captcha_time&#x27; =&gt; $cap[&#x27;time&#x27;],<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&#x27;ip_address&#x27; =&gt; $this-&gt;input-&gt;ip_address(),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&#x27;word&#x27; =&gt; $cap[&#x27;word&#x27;]<br /> +&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +$query = $this-&gt;db-&gt;insert_string(&#x27;captcha&#x27;, $data);<br /> +$this-&gt;db-&gt;query($query);<br /> +<br /> +echo &#x27;Submit the word you see below:&#x27;;<br /> +echo $cap[&#x27;image&#x27;];<br /> +echo &#x27;&lt;input type=&quot;text&quot; name=&quot;captcha&quot; value=&quot;&quot; /&gt;&#x27;;</code> + + <p>Then, on the page that accepts the submission you'll have something like this:</p> + +<code>// First, delete old captchas<br /> +$expiration = time()-7200; // Two hour limit<br /> +$this-&gt;db-&gt;query(&quot;DELETE FROM captcha WHERE captcha_time &lt; &quot;.$expiration); <br /> +<br /> +// Then see if a captcha exists:<br /> +$sql = &quot;SELECT COUNT(*) AS count FROM captcha WHERE word = ? AND ip_address = ? AND captcha_time &gt; ?&quot;;<br /> +$binds = array($_POST[&#x27;captcha&#x27;], $this-&gt;input-&gt;ip_address(), $expiration);<br /> +$query = $this-&gt;db-&gt;query($sql, $binds);<br /> +$row = $query-&gt;row();<br /> +<br /> +if ($row-&gt;count == 0)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;You must submit the word that appears in the image&quot;;<br /> +}</code> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="array_helper.html">Array Helper</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="cookie_helper.html">Cookie Helper</a></p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/helpers/cookie_helper.html b/user_guide/helpers/cookie_helper.html new file mode 100644 index 0000000..fa1bc52 --- /dev/null +++ b/user_guide/helpers/cookie_helper.html @@ -0,0 +1,107 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Cookie Helper : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Cookie Helper +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Cookie Helper</h1> + +<p>The Cookie Helper file contains functions that assist in working with cookies.</p> + + +<h2>Loading this Helper</h2> + +<p>This helper is loaded using the following code:</p> +<code>$this->load->helper('cookie');</code> + +<p>The following functions are available:</p> + +<h2>set_cookie()</h2> + +<p>This helper function gives you view file friendly syntax to set browser cookies. Refer to the <a href="../libraries/input.html">Input class</a> for a description of use, as this function is an alias to $this->input->set_cookie().</p> + +<h2>get_cookie()</h2> + +<p>This helper function gives you view file friendly syntax to get browser cookies. Refer to the <a href="../libraries/input.html">Input class</a> for a description of use, as this function is an alias to $this->input->cookie().</p> + + +<h2>delete_cookie()</h2> + +<p>Lets you delete a cookie. Unless you've set a custom path or other values, only the name of the cookie is needed:</p> + +<code>delete_cookie("name");</code> + +<p>This function is otherwise identical to <dfn>set_cookie()</dfn>, except that it does not have the value and expiration parameters. You can submit an array +of values in the first parameter or you can set discrete parameters.</p> + +<code>delete_cookie($name, $domain, $path, $prefix)</code> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="captcha_helper.html">CAPTCHA Helper</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="date_helper.html">Date Helper</a></p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/helpers/date_helper.html b/user_guide/helpers/date_helper.html new file mode 100644 index 0000000..408a1d8 --- /dev/null +++ b/user_guide/helpers/date_helper.html @@ -0,0 +1,408 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Date Helper : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Date Helper +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Date Helper</h1> + +<p>The Date Helper file contains functions that help you work with dates.</p> + + +<h2>Loading this Helper</h2> + +<p>This helper is loaded using the following code:</p> +<code>$this->load->helper('date');</code> + + +<p>The following functions are available:</p> + +<h2>now()</h2> + +<p>Returns the current time as a Unix timestamp, referenced either to your server's local time or GMT, based on the "time reference" +setting in your config file. If you do not intend to set your master time reference to GMT (which you'll typically do if you +run a site that lets each user set their own timezone settings) there is no benefit to using this function over PHP's time() function. +</p> + + + + +<h2>mdate()</h2> + +<p>This function is identical to PHPs <a href="http://www.php.net/date">date()</a> function, except that it lets you +use MySQL style date codes, where each code letter is preceded with a percent sign: %Y %m %d etc.</p> + +<p>The benefit of doing dates this way is that you don't have to worry about escaping any characters that +are not date codes, as you would normally have to do with the date() function. Example:</p> + +<code>$datestring = "Year: %Y Month: %m Day: %d - %h:%i %a";<br /> +$time = time();<br /> +<br /> +echo mdate($datestring, $time);</code> + +<p>If a timestamp is not included in the second parameter the current time will be used.</p> + + +<h2>standard_date()</h2> + +<p>Lets you generate a date string in one of several standardized formats. Example:</p> + +<code> +$format = 'DATE_RFC822';<br /> +$time = time();<br /> +<br /> +echo standard_date($format, $time); +</code> + +<p>The first parameter must contain the format, the second parameter must contain the date as a Unix timestamp.</p> + +<p>Supported formats:</p> + +<table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder"> + <tr> + <th>Constant</th> + <th>Description</th> + <th>Example</th> + </tr> + <tr> + <td>DATE_ATOM</td> + <td>Atom</td> + <td>2005-08-15T16:13:03+0000</td> + </tr> + <tr> + <td>DATE_COOKIE</td> + <td>HTTP Cookies</td> + <td>Sun, 14 Aug 2005 16:13:03 UTC</td> + </tr> + <tr> + <td>DATE_ISO8601</td> + <td>ISO-8601</td> + <td>2005-08-14T16:13:03+00:00</td> + </tr> + <tr> + <td>DATE_RFC822</td> + <td>RFC 822</td> + <td>Sun, 14 Aug 05 16:13:03 UTC</td> + </tr> + <tr> + <td>DATE_RFC850</td> + <td>RFC 850</td> + <td>Sunday, 14-Aug-05 16:13:03 UTC</td> + </tr> + <tr> + <td>DATE_RFC1036</td> + <td>RFC 1036</td> + <td>Sunday, 14-Aug-05 16:13:03 UTC</td> + </tr> + <tr> + <td>DATE_RFC1123</td> + <td>RFC 1123</td> + <td>Sun, 14 Aug 2005 16:13:03 UTC</td> + </tr> + <tr> + <td>DATE_RFC2822</td> + <td>RFC 2822</td> + <td>Sun, 14 Aug 2005 16:13:03 +0000</td> + </tr> + <tr> + <td>DATE_RSS</td> + <td>RSS</td> + <td>Sun, 14 Aug 2005 16:13:03 UTC</td> + </tr> + <tr> + <td>DATE_W3C</td> + <td>World Wide Web Consortium</td> + <td>2005-08-14T16:13:03+0000</td> + </tr> +</table> + +<h2>local_to_gmt()</h2> + +<p>Takes a Unix timestamp as input and returns it as GMT. Example:</p> + +<code>$now = time();<br /> +<br /> +$gmt = local_to_gmt($now);</code> + + +<h2>gmt_to_local()</h2> + +<p>Takes a Unix timestamp (referenced to GMT) as input, and converts it to a localized timestamp based on the +timezone and Daylight Saving time submitted. Example:</p> + +<code> +$timestamp = '1140153693';<br /> +$timezone = 'UM8';<br /> +$daylight_saving = TRUE;<br /> +<br /> +echo gmt_to_local($timestamp, $timezone, $daylight_saving);</code> + +<p><strong>Note:</strong> For a list of timezones see the reference at the bottom of this page.</p> + +<h2>mysql_to_unix()</h2> + +<p>Takes a MySQL Timestamp as input and returns it as Unix. Example:</p> + +<code>$mysql = '20061124092345';<br /> +<br /> +$unix = mysql_to_unix($mysql);</code> + + +<h2>unix_to_human()</h2> + +<p>Takes a Unix timestamp as input and returns it in a human readable format with this prototype:</p> + +<code>YYYY-MM-DD HH:MM:SS AM/PM</code> + +<p>This can be useful if you need to display a date in a form field for submission.</p> + +<p>The time can be formatted with or without seconds, and it can be set to European or US format. If only +the timestamp is submitted it will return the time without seconds formatted for the U.S. Examples:</p> + +<code>$now = time();<br /> +<br /> +echo unix_to_human($now); // U.S. time, no seconds<br /> +<br /> +echo unix_to_human($now, TRUE, 'us'); // U.S. time with seconds<br /> +<br /> +echo unix_to_human($now, TRUE, 'eu'); // Euro time with seconds</code> + + +<h2>human_to_unix()</h2> + +<p>The opposite of the above function. Takes a "human" time as input and returns it as Unix. This function is +useful if you accept "human" formatted dates submitted via a form. Returns FALSE (boolean) if +the date string passed to it is not formatted as indicated above. Example:</p> + +<code>$now = time();<br /> +<br /> +$human = unix_to_human($now);<br /> +<br /> +$unix = human_to_unix($human);</code> + + + + + +<h2>timespan()</h2> + +<p>Formats a unix timestamp so that is appears similar to this:</p> + +<code>1 Year, 10 Months, 2 Weeks, 5 Days, 10 Hours, 16 Minutes</code> + +<p>The first parameter must contain a Unix timestamp. The second parameter must contain a +timestamp that is greater that the first timestamp. If the second parameter empty, the current time will be used. The most common purpose +for this function is to show how much time has elapsed from some point in time in the past to now. Example:</p> + +<code>$post_date = '1079621429';<br /> +$now = time();<br /> +<br /> +echo timespan($post_date, $now);</code> + +<p class="important"><strong>Note:</strong> The text generated by this function is found in the following language file: language/&lt;your_lang&gt;/date_lang.php</p> + + +<h2>days_in_month()</h2> + +<p>Returns the number of days in a given month/year. Takes leap years into account. Example:</p> +<code>echo days_in_month(06, 2005);</code> + +<p>If the second parameter is empty, the current year will be used.</p> +<h2>timezones()</h2> +<p> Takes a timezone reference (for a list of valid timezones, see the &quot;Timezone Reference&quot; below) and returns the number of hours offset from UTC.</p> +<p><code>echo timezones('UM5');</code></p> +<p>This function is useful when used with timezone_menu(). </p> +<h2>timezone_menu()</h2> +<p>Generates a pull-down menu of timezones, like this one:</p> + +<form action="#"> +<select name="timezones"> +<option value='UM12'>(UTC - 12:00) Enitwetok, Kwajalien</option> +<option value='UM11'>(UTC - 11:00) Nome, Midway Island, Samoa</option> +<option value='UM10'>(UTC - 10:00) Hawaii</option> +<option value='UM9'>(UTC - 9:00) Alaska</option> +<option value='UM8'>(UTC - 8:00) Pacific Time</option> +<option value='UM7'>(UTC - 7:00) Mountain Time</option> +<option value='UM6'>(UTC - 6:00) Central Time, Mexico City</option> +<option value='UM5'>(UTC - 5:00) Eastern Time, Bogota, Lima, Quito</option> +<option value='UM4'>(UTC - 4:00) Atlantic Time, Caracas, La Paz</option> +<option value='UM25'>(UTC - 3:30) Newfoundland</option> +<option value='UM3'>(UTC - 3:00) Brazil, Buenos Aires, Georgetown, Falkland Is.</option> +<option value='UM2'>(UTC - 2:00) Mid-Atlantic, Ascention Is., St Helena</option> +<option value='UM1'>(UTC - 1:00) Azores, Cape Verde Islands</option> +<option value='UTC' selected='selected'>(UTC) Casablanca, Dublin, Edinburgh, London, Lisbon, Monrovia</option> +<option value='UP1'>(UTC + 1:00) Berlin, Brussels, Copenhagen, Madrid, Paris, Rome</option> +<option value='UP2'>(UTC + 2:00) Kaliningrad, South Africa, Warsaw</option> +<option value='UP3'>(UTC + 3:00) Baghdad, Riyadh, Moscow, Nairobi</option> +<option value='UP25'>(UTC + 3:30) Tehran</option> +<option value='UP4'>(UTC + 4:00) Adu Dhabi, Baku, Muscat, Tbilisi</option> +<option value='UP35'>(UTC + 4:30) Kabul</option> +<option value='UP5'>(UTC + 5:00) Islamabad, Karachi, Tashkent</option> +<option value='UP45'>(UTC + 5:30) Bombay, Calcutta, Madras, New Delhi</option> +<option value='UP6'>(UTC + 6:00) Almaty, Colomba, Dhaka</option> +<option value='UP7'>(UTC + 7:00) Bangkok, Hanoi, Jakarta</option> +<option value='UP8'>(UTC + 8:00) Beijing, Hong Kong, Perth, Singapore, Taipei</option> +<option value='UP9'>(UTC + 9:00) Osaka, Sapporo, Seoul, Tokyo, Yakutsk</option> +<option value='UP85'>(UTC + 9:30) Adelaide, Darwin</option> +<option value='UP10'>(UTC + 10:00) Melbourne, Papua New Guinea, Sydney, Vladivostok</option> +<option value='UP11'>(UTC + 11:00) Srednekolymsk, New Caledonia, Solomon Islands</option> +<option value='UP12'>(UTC + 12:00) Auckland, Wellington, Fiji, Marshall Island</option> +</select> +</form> + +<p>This menu is useful if you run a membership site in which your users are allowed to set their local timezone value.</p> + +<p>The first parameter lets you set the "selected" state of the menu. For example, to set Pacific time as the default you will do this:</p> + +<code>echo timezone_menu('UM8');</code> + +<p>Please see the timezone reference below to see the values of this menu.</p> + +<p>The second parameter lets you set a CSS class name for the menu.</p> + +<p class="important"><strong>Note:</strong> The text contained in the menu is found in the following language file: language/&lt;your_lang&gt;/date_lang.php</p> + + + +<h2>Timezone Reference</h2> + +<p>The following table indicates each timezone and its location.</p> + +<table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder"> +<tr> +<th>Time Zone</th> +<th>Location</th> +</tr><tr> + +<td class="td">UM12</td><td class="td">(UTC - 12:00) Enitwetok, Kwajalien</td> +</tr><tr> +<td class="td">UM11</td><td class="td">(UTC - 11:00) Nome, Midway Island, Samoa</td> +</tr><tr> +<td class="td">UM10</td><td class="td">(UTC - 10:00) Hawaii</td> +</tr><tr> +<td class="td">UM9</td><td class="td">(UTC - 9:00) Alaska</td> +</tr><tr> +<td class="td">UM8</td><td class="td">(UTC - 8:00) Pacific Time</td> +</tr><tr> +<td class="td">UM7</td><td class="td">(UTC - 7:00) Mountain Time</td> +</tr><tr> +<td class="td">UM6</td><td class="td">(UTC - 6:00) Central Time, Mexico City</td> +</tr><tr> +<td class="td">UM5</td><td class="td">(UTC - 5:00) Eastern Time, Bogota, Lima, Quito</td> +</tr><tr> +<td class="td">UM4</td><td class="td">(UTC - 4:00) Atlantic Time, Caracas, La Paz</td> +</tr><tr> +<td class="td">UM25</td><td class="td">(UTC - 3:30) Newfoundland</td> +</tr><tr> +<td class="td">UM3</td><td class="td">(UTC - 3:00) Brazil, Buenos Aires, Georgetown, Falkland Is.</td> +</tr><tr> +<td class="td">UM2</td><td class="td">(UTC - 2:00) Mid-Atlantic, Ascention Is., St Helena</td> +</tr><tr> +<td class="td">UM1</td><td class="td">(UTC - 1:00) Azores, Cape Verde Islands</td> +</tr><tr> +<td class="td">UTC</td><td class="td">(UTC) Casablanca, Dublin, Edinburgh, London, Lisbon, Monrovia</td> +</tr><tr> +<td class="td">UP1</td><td class="td">(UTC + 1:00) Berlin, Brussels, Copenhagen, Madrid, Paris, Rome</td> +</tr><tr> +<td class="td">UP2</td><td class="td">(UTC + 2:00) Kaliningrad, South Africa, Warsaw</td> +</tr><tr> +<td class="td">UP3</td><td class="td">(UTC + 3:00) Baghdad, Riyadh, Moscow, Nairobi</td> +</tr><tr> +<td class="td">UP25</td><td class="td">(UTC + 3:30) Tehran</td> +</tr><tr> +<td class="td">UP4</td><td class="td">(UTC + 4:00) Adu Dhabi, Baku, Muscat, Tbilisi</td> +</tr><tr> +<td class="td">UP35</td><td class="td">(UTC + 4:30) Kabul</td> +</tr><tr> +<td class="td">UP5</td><td class="td">(UTC + 5:00) Islamabad, Karachi, Tashkent</td> +</tr><tr> +<td class="td">UP45</td><td class="td">(UTC + 5:30) Bombay, Calcutta, Madras, New Delhi</td> +</tr><tr> +<td class="td">UP6</td><td class="td">(UTC + 6:00) Almaty, Colomba, Dhaka</td> +</tr><tr> +<td class="td">UP7</td><td class="td">(UTC + 7:00) Bangkok, Hanoi, Jakarta</td> +</tr><tr> +<td class="td">UP8</td><td class="td">(UTC + 8:00) Beijing, Hong Kong, Perth, Singapore, Taipei</td> +</tr><tr> +<td class="td">UP9</td><td class="td">(UTC + 9:00) Osaka, Sapporo, Seoul, Tokyo, Yakutsk</td> +</tr><tr> +<td class="td">UP85</td><td class="td">(UTC + 9:30) Adelaide, Darwin</td> +</tr><tr> +<td class="td">UP10</td><td class="td">(UTC + 10:00) Melbourne, Papua New Guinea, Sydney, Vladivostok</td> +</tr><tr> +<td class="td">UP11</td><td class="td">(UTC + 11:00) Srednekolymsk, New Caledonia, Solomon Islands</td> +</tr><tr> +<td class="td">UP12</td><td class="td">(UTC + 12:00) Auckland, Wellington, Fiji, Marshall Island</td> +</tr> +</table> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="cookie_helper.html">Cookie Helper</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="directory_helper.html">Directory Helper</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/helpers/directory_helper.html b/user_guide/helpers/directory_helper.html new file mode 100644 index 0000000..44abe37 --- /dev/null +++ b/user_guide/helpers/directory_helper.html @@ -0,0 +1,143 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Directory Helper : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> + +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Directory Helper +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Directory Helper</h1> + +<p>The Directory Helper file contains functions that assist in working with directories.</p> + + +<h2>Loading this Helper</h2> + +<p>This helper is loaded using the following code:</p> +<code>$this->load->helper('directory');</code> + +<p>The following functions are available:</p> + +<h2>directory_map('<var>source directory</var>')</h2> + +<p>This function reads the directory path specified in the first parameter +and builds an array representation of it and all its contained files. Example:</p> + +<code>$map = directory_map('./mydirectory/');</code> + +<p class="important"><strong>Note:</strong> Paths are almost always relative to your main index.php file.</p> + +<p>Sub-folders contained within the directory will be mapped as well. If you wish to control the recursion depth, +you can do so using the second parameter (integer). A depth of 1 will only map the top level directory:</p> + +<code>$map = directory_map('./mydirectory/', 1);</code> + +<p>By default, hidden files will not be included in the returned array. To override this behavior, +you may set a third parameter to <var>true</var> (boolean):</p> + +<code>$map = directory_map('./mydirectory/', FALSE, TRUE);</code> + +<p>Each folder name will be an array index, while its contained files will be numerically indexed. +Here is an example of a typical array:</p> + +<code>Array<br /> +(<br /> +&nbsp;&nbsp;&nbsp;[libraries] => Array<br /> +&nbsp;&nbsp;&nbsp;(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0] => benchmark.html<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[1] => config.html<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[database] => Array<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[0] => active_record.html<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[1] => binds.html<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[2] => configuration.html<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[3] => connecting.html<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[4] => examples.html<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[5] => fields.html<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[6] => index.html<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[7] => queries.html<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[2] => email.html<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[3] => file_uploading.html<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[4] => image_lib.html<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[5] => input.html<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[6] => language.html<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[7] => loader.html<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[8] => pagination.html<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[9] => uri.html<br /> +)</code> + + + + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="date_helper.html">Date Helper</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="download_helper.html">Download Helper</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/helpers/download_helper.html b/user_guide/helpers/download_helper.html new file mode 100644 index 0000000..eeb704c --- /dev/null +++ b/user_guide/helpers/download_helper.html @@ -0,0 +1,112 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Download Helper : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> + +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Download Helper +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Download Helper</h1> + +<p>The Download Helper lets you download data to your desktop.</p> + + +<h2>Loading this Helper</h2> + +<p>This helper is loaded using the following code:</p> +<code>$this->load->helper('download');</code> + +<p>The following functions are available:</p> + +<h2>force_download('<var>filename</var>', '<var>data</var>')</h2> + +<p>Generates server headers which force data to be downloaded to your desktop. Useful with file downloads. +The first parameter is the <strong>name you want the downloaded file to be named</strong>, the second parameter is the file data. +Example:</p> + +<code> +$data = 'Here is some text!';<br /> +$name = 'mytext.txt';<br /> +<br /> +force_download($name, $data); +</code> + +<p>If you want to download an existing file from your server you'll need to read the file into a string:</p> + +<code> +$data = file_get_contents("/path/to/photo.jpg"); // Read the file's contents<br /> +$name = 'myphoto.jpg';<br /> +<br /> +force_download($name, $data); +</code> + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="directory_helper.html">Directory Helper</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="email_helper.html">Email Helper</a></p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/helpers/email_helper.html b/user_guide/helpers/email_helper.html new file mode 100644 index 0000000..91b0ba4 --- /dev/null +++ b/user_guide/helpers/email_helper.html @@ -0,0 +1,102 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Email Helper : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> + +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Email Helper +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Email Helper</h1> + +<p>The Email Helper provides some assistive functions for working with Email. For a more robust email solution, see CodeIgniter's <a href="../libraries/email.html">Email Class</a>.</p> + +<h2>Loading this Helper</h2> + +<p>This helper is loaded using the following code:</p> +<p><code>$this->load->helper('email');</code></p> + +<p>The following functions are available:</p> + +<h2>valid_email('<var>email</var>')</h2> + +<p>Checks if an email is a correctly formatted email. Note that is doesn't actually prove the email will recieve mail, simply that it is a validly formed address.</p> +<p>It returns TRUE/FALSE</p> +<code> $this-&gt;load-&gt;helper('email');<br /> +<br /> +if (valid_email('email@somesite.com'))<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo 'email is valid';<br /> +}<br /> +else<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo 'email is not valid';<br /> +}</code> +<h2>send_email('<var>recipient</var>', '<var>subject</var>', '<var>message</var>')</h2> +<p>Sends an email using PHP's native <a href="http://www.php.net/function.mail">mail()</a> function. For a more robust email solution, see CodeIgniter's <a href="../libraries/email.html">Email Class</a>.</p> +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="download_helper.html">Download Helper</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="file_helper.html">File Helper</a></p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/helpers/file_helper.html b/user_guide/helpers/file_helper.html new file mode 100644 index 0000000..69f0d8c --- /dev/null +++ b/user_guide/helpers/file_helper.html @@ -0,0 +1,179 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>File Helper : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +File Helper +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>File Helper</h1> + +<p>The File Helper file contains functions that assist in working with files.</p> + + +<h2>Loading this Helper</h2> + +<p>This helper is loaded using the following code:</p> +<code>$this->load->helper('file');</code> + +<p>The following functions are available:</p> + +<h2>read_file('<var>path</var>')</h2> + +<p>Returns the data contained in the file specified in the path. Example:</p> + +<code>$string = read_file('./path/to/file.php');</code> + +<p>The path can be a relative or full server path. Returns FALSE (boolean) on failure.</p> + +<p class="important"><strong>Note:</strong> The path is relative to your main site index.php file, NOT your controller or view files. +CodeIgniter uses a front controller so paths are always relative to the main site index.</p> + +<p>If your server is running an open_basedir restriction this function +might not work if you are trying to access a file above the calling script.</p> + +<h2>write_file('<var>path</var>', <kbd>$data</kbd>)</h2> + +<p>Writes data to the file specified in the path. If the file does not exist the function will create it. Example:</p> + +<code> +$data = 'Some file data';<br /> +<br /> +if ( ! write_file('./path/to/file.php', $data))<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp; echo 'Unable to write the file';<br /> +}<br /> +else<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp; echo 'File written!';<br /> +}</code> + +<p>You can optionally set the write mode via the third parameter:</p> + +<code>write_file('./path/to/file.php', $data, <var>'r+'</var>);</code> + +<p>The default mode is <kbd>wb</kbd>. Please see the <a href="http://php.net/fopen">PHP user guide</a> for mode options.</p> + +<p>Note: In order for this function to write data to a file its file permissions must be set such that it is writable (666, 777, etc.). +If the file does not already exist, the directory containing it must be writable.</p> + +<p class="important"><strong>Note:</strong> The path is relative to your main site index.php file, NOT your controller or view files. +CodeIgniter uses a front controller so paths are always relative to the main site index.</p> + +<h2>delete_files('<var>path</var>')</h2> + +<p>Deletes ALL files contained in the supplied path. Example:</p> +<code>delete_files('./path/to/directory/');</code> + +<p>If the second parameter is set to <kbd>true</kbd>, any directories contained within the supplied root path will be deleted as well. Example:</p> + +<code>delete_files('./path/to/directory/', TRUE);</code> + +<p class="important"><strong>Note:</strong> The files must be writable or owned by the system in order to be deleted.</p> + +<h2>get_filenames('<var>path/to/directory/</var>')</h2> + +<p>Takes a server path as input and returns an array containing the names of all files contained within it. The file path +can optionally be added to the file names by setting the second parameter to TRUE.</p> + +<h2>get_dir_file_info('<var>path/to/directory/</var>', <kbd>$top_level_only</kbd> = TRUE)</h2> + +<p>Reads the specified directory and builds an array containing the filenames, filesize, dates, and permissions. Sub-folders contained within the specified path are only read if forced + by sending the second parameter, <kbd>$top_level_only</kbd> to <samp>FALSE</samp>, as this can be an intensive operation.</p> + +<h2>get_file_info('<var>path/to/file</var>', <kbd>$file_information</kbd>)</h2> + +<p>Given a file and path, returns the name, path, size, date modified. Second parameter allows you to explicitly declare what information you want returned; options are: name, server_path, size, date, readable, writable, executable, fileperms. Returns FALSE if the file cannot be found.</p> + +<p class="important"><strong>Note:</strong> The &quot;writable&quot; uses the PHP function is_writable() which is known to have issues on the IIS webserver. Consider using fileperms instead, which returns information from PHP's fileperms() function.</p> +<h2>get_mime_by_extension('<var>file</var>')</h2> + +<p>Translates a file extension into a mime type based on config/mimes.php. Returns FALSE if it can't determine the type, or open the mime config file.</p> +<p> +<code>$file = &quot;somefile.png&quot;;<br /> +echo $file . ' is has a mime type of ' . get_mime_by_extension($file);</code> +</p> +<p class="critical"><strong>Note:</strong> This is not an accurate way of determining file mime types, and is here strictly as a convenience. It should not be used for security.</p> + +<h2>symbolic_permissions(<kbd>$perms</kbd>)</h2> + +<p>Takes numeric permissions (such as is returned by <kbd>fileperms()</kbd> and returns standard symbolic notation of file permissions.</p> + +<code>echo symbolic_permissions(fileperms('./index.php'));<br /> +<br /> +// -rw-r--r--</code> + +<h2>octal_permissions(<kbd>$perms</kbd>)</h2> + +<p>Takes numeric permissions (such as is returned by <kbd>fileperms()</kbd> and returns a three character octal notation of file permissions.</p> + +<code>echo octal_permissions(fileperms('./index.php'));<br /> +<br /> +// 644</code> + +</div> + +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="email_helper.html">Email Helper</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="form_helper.html">Form Helper</a></p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/helpers/form_helper.html b/user_guide/helpers/form_helper.html new file mode 100644 index 0000000..5fb6f6b --- /dev/null +++ b/user_guide/helpers/form_helper.html @@ -0,0 +1,484 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Form Helper : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Form Helper +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Form Helper</h1> + +<p>The Form Helper file contains functions that assist in working with forms.</p> + + +<h2>Loading this Helper</h2> + +<p>This helper is loaded using the following code:</p> +<code>$this->load->helper('form');</code> + +<p>The following functions are available:</p> + + + +<h2>form_open()</h2> + +<p>Creates an opening form tag with a base URL <strong>built from your config preferences</strong>. It will optionally let you +add form attributes and hidden input fields, and will always add the attribute <kbd>accept-charset</kbd> based on the charset value in your config file.</p> + +<p>The main benefit of using this tag rather than hard coding your own HTML is that it permits your site to be more portable +in the event your URLs ever change.</p> + +<p>Here's a simple example:</p> + +<code>echo form_open('email/send');</code> + +<p>The above example would create a form that points to your base URL plus the "email/send" URI segments, like this:</p> + +<code>&lt;form method="post" accept-charset="utf-8" action="http:/example.com/index.php/email/send" /></code> + +<h4>Adding Attributes</h4> + +<p>Attributes can be added by passing an associative array to the second parameter, like this:</p> + +<code> +$attributes = array('class' => 'email', 'id' => 'myform');<br /> +<br /> +echo form_open('email/send', $attributes);</code> + +<p>The above example would create a form similar to this:</p> + +<code>&lt;form method="post" accept-charset="utf-8" action="http:/example.com/index.php/email/send" &nbsp;class="email" &nbsp;id="myform" /></code> + +<h4>Adding Hidden Input Fields</h4> + +<p>Hidden fields can be added by passing an associative array to the third parameter, like this:</p> + +<code> +$hidden = array('username' => 'Joe', 'member_id' => '234');<br /> +<br /> +echo form_open('email/send', '', $hidden);</code> + +<p>The above example would create a form similar to this:</p> + +<code>&lt;form method="post" accept-charset="utf-8" action="http:/example.com/index.php/email/send"><br /> +&lt;input type="hidden" name="username" value="Joe" /><br /> +&lt;input type="hidden" name="member_id" value="234" /></code> + + +<h2>form_open_multipart()</h2> + +<p>This function is absolutely identical to the <dfn>form_open()</dfn> tag above except that it adds a multipart attribute, +which is necessary if you would like to use the form to upload files with.</p> + +<h2>form_hidden()</h2> + +<p>Lets you generate hidden input fields. You can either submit a name/value string to create one field:</p> + +<code>form_hidden('username', 'johndoe');<br /> +<br /> +// Would produce:<br /><br /> +&lt;input type="hidden" name="username" value="johndoe" /></code> + +<p>Or you can submit an associative array to create multiple fields:</p> + +<code>$data = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name'&nbsp;&nbsp;=> 'John Doe',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'email' => 'john@example.com',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'url'&nbsp;&nbsp;&nbsp;=> 'http://example.com'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +echo form_hidden($data);<br /> +<br /> +// Would produce:<br /><br /> +&lt;input type="hidden" name="name" value="John Doe" /><br /> +&lt;input type="hidden" name="email" value="john@example.com" /><br /> +&lt;input type="hidden" name="url" value="http://example.com" /></code> + + + + +<h2>form_input()</h2> + +<p>Lets you generate a standard text input field. You can minimally pass the field name and value in the first +and second parameter:</p> + +<code>echo form_input('username', 'johndoe');</code> + +<p>Or you can pass an associative array containing any data you wish your form to contain:</p> + +<code>$data = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> 'username',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'id'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> 'username',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'value'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> 'johndoe',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'maxlength'&nbsp;&nbsp;&nbsp;=> '100',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'size'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> '50',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'style'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; => 'width:50%',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +echo form_input($data);<br /> +<br /> +// Would produce:<br /><br /> +&lt;input type="text" name="username" id="username" value="johndoe" maxlength="100" size="50" style="width:50%" /></code> + +<p>If you would like your form to contain some additional data, like Javascript, you can pass it as a string in the +third parameter:</p> + +<code>$js = 'onClick="some_function()"';<br /> +<br /> +echo form_input('username', 'johndoe', $js);</code> + +<h2>form_password()</h2> + +<p>This function is identical in all respects to the <dfn>form_input()</dfn> function above +except that is sets it as a "password" type.</p> + +<h2>form_upload()</h2> + +<p>This function is identical in all respects to the <dfn>form_input()</dfn> function above +except that is sets it as a "file" type, allowing it to be used to upload files.</p> + +<h2>form_textarea()</h2> + +<p>This function is identical in all respects to the <dfn>form_input()</dfn> function above +except that it generates a "textarea" type. Note: Instead of the "maxlength" and "size" attributes in the above +example, you will instead specify "rows" and "cols".</p> + + +<h2>form_dropdown()</h2> + +<p>Lets you create a standard drop-down field. The first parameter will contain the name of the field, +the second parameter will contain an associative array of options, and the third parameter will contain the +value you wish to be selected. You can also pass an array of multiple items through the third parameter, and CodeIgniter will create a multiple select for you. Example:</p> + +<code>$options = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'small'&nbsp;&nbsp;=> 'Small Shirt',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'med'&nbsp;&nbsp;&nbsp;&nbsp;=> 'Medium Shirt',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'large'&nbsp;&nbsp; => 'Large Shirt',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'xlarge' => 'Extra Large Shirt',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +$shirts_on_sale = array('small', 'large');<br /> +<br /> +echo form_dropdown('shirts', $options, 'large');<br /> +<br /> +// Would produce:<br /> +<br /> +&lt;select name=&quot;shirts&quot;&gt;<br /> +&lt;option value=&quot;small&quot;&gt;Small Shirt&lt;/option&gt;<br /> +&lt;option value=&quot;med&quot;&gt;Medium Shirt&lt;/option&gt;<br /> +&lt;option value=&quot;large&quot; selected=&quot;selected&quot;&gt;Large Shirt&lt;/option&gt;<br /> +&lt;option value=&quot;xlarge&quot;&gt;Extra Large Shirt&lt;/option&gt;<br /> +&lt;/select&gt;<br /> +<br /> +echo form_dropdown('shirts', $options, $shirts_on_sale);<br /> +<br /> +// Would produce:<br /> +<br /> +&lt;select name=&quot;shirts&quot; multiple=&quot;multiple&quot;&gt;<br /> +&lt;option value=&quot;small&quot; selected=&quot;selected&quot;&gt;Small Shirt&lt;/option&gt;<br /> +&lt;option value=&quot;med&quot;&gt;Medium Shirt&lt;/option&gt;<br /> +&lt;option value=&quot;large&quot; selected=&quot;selected&quot;&gt;Large Shirt&lt;/option&gt;<br /> +&lt;option value=&quot;xlarge&quot;&gt;Extra Large Shirt&lt;/option&gt;<br /> +&lt;/select&gt;</code> + + +<p>If you would like the opening &lt;select> to contain additional data, like an <kbd>id</kbd> attribute or JavaScript, you can pass it as a string in the +fourth parameter:</p> + +<code>$js = 'id="shirts" onChange="some_function();"';<br /> +<br /> +echo form_dropdown('shirts', $options, 'large', $js);</code> + +<p>If the array passed as $options is a multidimensional array, form_dropdown() will produce an &lt;optgroup&gt; with the array key as the label.</p> + +<h2>form_multiselect()</h2> + +<p>Lets you create a standard multiselect field. The first parameter will contain the name of the field, +the second parameter will contain an associative array of options, and the third parameter will contain the +value or values you wish to be selected. The parameter usage is identical to using <kbd>form_dropdown()</kbd> above, +except of course that the name of the field will need to use POST array syntax, e.g. <samp>foo[]</samp>.</p> + + +<h2>form_fieldset()</h2> + +<p>Lets you generate fieldset/legend fields.</p> +<code>echo form_fieldset('Address Information');<br /> +echo &quot;&lt;p&gt;fieldset content here&lt;/p&gt;\n&quot;;<br /> +echo form_fieldset_close(); +<br /> +<br /> +// Produces<br /> +&lt;fieldset&gt; +<br /> +&lt;legend&gt;Address Information&lt;/legend&gt; +<br /> +&lt;p&gt;form content here&lt;/p&gt; +<br /> +&lt;/fieldset&gt;</code> +<p>Similar to other functions, you can submit an associative array in the second parameter if you prefer to set additional attributes. </p> +<p><code>$attributes = array('id' =&gt; 'address_info', 'class' =&gt; 'address_info');<br /> + echo form_fieldset('Address Information', $attributes);<br /> +echo &quot;&lt;p&gt;fieldset content here&lt;/p&gt;\n&quot;;<br /> +echo form_fieldset_close(); <br /> +<br /> +// Produces<br /> +&lt;fieldset id=&quot;address_info&quot; class=&quot;address_info&quot;&gt; <br /> +&lt;legend&gt;Address Information&lt;/legend&gt; <br /> +&lt;p&gt;form content here&lt;/p&gt; <br /> +&lt;/fieldset&gt;</code></p> +<h2>form_fieldset_close()</h2> +<p>Produces a closing &lt;/fieldset&gt; tag. The only advantage to using this function is it permits you to pass data to it + which will be added below the tag. For example:</p> +<code>$string = &quot;&lt;/div&gt;&lt;/div&gt;&quot;;<br /> +<br /> +echo form_fieldset_close($string);<br /> +<br /> +// Would produce:<br /> +&lt;/fieldset&gt;<br /> +&lt;/div&gt;&lt;/div&gt;</code> +<h2>form_checkbox()</h2> +<p>Lets you generate a checkbox field. Simple example:</p> +<code>echo form_checkbox('newsletter', 'accept', TRUE);<br /> +<br /> +// Would produce:<br /> +<br /> +&lt;input type=&quot;checkbox&quot; name=&quot;newsletter&quot; value=&quot;accept&quot; checked=&quot;checked&quot; /&gt;</code> +<p>The third parameter contains a boolean TRUE/FALSE to determine whether the box should be checked or not.</p> +<p>Similar to the other form functions in this helper, you can also pass an array of attributes to the function:</p> + +<code>$data = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'name'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> 'newsletter',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'id'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> 'newsletter',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'value'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> 'accept',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'checked'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> TRUE,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'style'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; => 'margin:10px',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +echo form_checkbox($data);<br /> +<br /> +// Would produce:<br /><br /> +&lt;input type="checkbox" name="newsletter" id="newsletter" value="accept" checked="checked" style="margin:10px" /></code> + +<p>As with other functions, if you would like the tag to contain additional data, like JavaScript, you can pass it as a string in the +fourth parameter:</p> + +<code>$js = 'onClick="some_function()"';<br /> +<br /> + echo form_checkbox('newsletter', 'accept', TRUE, $js)</code> + + +<h2>form_radio()</h2> +<p>This function is identical in all respects to the <dfn>form_checkbox()</dfn> function above except that is sets it as a "radio" type.</p> + + +<h2>form_submit()</h2> + +<p>Lets you generate a standard submit button. Simple example:</p> +<code>echo form_submit('mysubmit', 'Submit Post!');<br /> +<br /> +// Would produce:<br /> +<br /> +&lt;input type=&quot;submit&quot; name=&quot;mysubmit&quot; value=&quot;Submit Post!&quot; /&gt;</code> +<p>Similar to other functions, you can submit an associative array in the first parameter if you prefer to set your own attributes. + The third parameter lets you add extra data to your form, like JavaScript.</p> +<h2>form_label()</h2> +<p>Lets you generate a &lt;label&gt;. Simple example:</p> +<code>echo form_label('What is your Name', 'username');<br /> +<br /> +// Would produce: +<br /> +&lt;label for=&quot;username&quot;&gt;What is your Name&lt;/label&gt;</code> +<p>Similar to other functions, you can submit an associative array in the third parameter if you prefer to set additional attributes. </p> +<p><code>$attributes = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'class' =&gt; 'mycustomclass',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'style' =&gt; 'color: #000;',<br /> +);<br /> + echo form_label('What is your Name', 'username', $attributes);<br /> + <br /> +// Would produce: <br /> +&lt;label for=&quot;username&quot; class=&quot;mycustomclass&quot; style=&quot;color: #000;&quot;&gt;What is your Name&lt;/label&gt;</code></p> +<h2>form_reset()</h2> + +<p>Lets you generate a standard reset button. Use is identical to <dfn>form_submit()</dfn>.</p> + +<h2>form_button()</h2> + +<p>Lets you generate a standard button element. You can minimally pass the button name and content in the first and second parameter:</p> +<code> +echo form_button('name','content');<br /> +<br /> +// Would produce<br /> +&lt;button name="name" type="button"&gt;Content&lt;/button&gt; +</code> + +Or you can pass an associative array containing any data you wish your form to contain: +<code> +$data = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'name' => 'button',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'id' => 'button',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'value' => 'true',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'type' => 'reset',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'content' => 'Reset'<br /> +);<br /> +<br /> +echo form_button($data);<br /> +<br /> +// Would produce:<br /> +&lt;button name="button" id="button" value="true" type="reset"&gt;Reset&lt;/button&gt; +</code> + +If you would like your form to contain some additional data, like JavaScript, you can pass it as a string in the third parameter: +<code> +$js = 'onClick="some_function()"';<br /><br /> +echo form_button('mybutton', 'Click Me', $js); +</code> + + +<h2>form_close()</h2> + +<p>Produces a closing &lt;/form> tag. The only advantage to using this function is it permits you to pass data to it +which will be added below the tag. For example:</p> + +<code>$string = "&lt;/div>&lt;/div>";<br /> +<br /> +echo form_close($string);<br /> +<br /> +// Would produce:<br /> +<br /> +&lt;/form><br /> +&lt;/div>&lt;/div></code> + + + + + +<h2>form_prep()</h2> + +<p>Allows you to safely use HTML and characters such as quotes within form elements without breaking out of the form. Consider this example:</p> + +<code>$string = 'Here is a string containing <strong>"quoted"</strong> text.';<br /> +<br /> +&lt;input type="text" name="myform" value="<var>$string</var>" /></code> + +<p>Since the above string contains a set of quotes it will cause the form to break. +The form_prep function converts HTML so that it can be used safely:</p> + +<code>&lt;input type="text" name="myform" value="<var>&lt;?php echo form_prep($string); ?></var>" /></code> + +<p class="important"><strong>Note:</strong> If you use any of the form helper functions listed in this page the form +values will be prepped automatically, so there is no need to call this function. Use it only if you are +creating your own form elements.</p> + + +<h2>set_value()</h2> + +<p>Permits you to set the value of an input form or textarea. You must supply the field name via the first parameter of the function. +The second (optional) parameter allows you to set a default value for the form. Example:</p> + +<code>&lt;input type="text" name="quantity" value="<dfn>&lt;?php echo set_value('quantity', '0'); ?></dfn>" size="50" /></code> + +<p>The above form will show "0" when loaded for the first time.</p> + +<h2>set_select()</h2> + +<p>If you use a <dfn>&lt;select></dfn> menu, this function permits you to display the menu item that was selected. The first parameter +must contain the name of the select menu, the second parameter must contain the value of +each item, and the third (optional) parameter lets you set an item as the default (use boolean TRUE/FALSE).</p> + +<p>Example:</p> + +<code> +&lt;select name="myselect"><br /> +&lt;option value="one" <dfn>&lt;?php echo set_select('myselect', 'one', TRUE); ?></dfn> >One&lt;/option><br /> +&lt;option value="two" <dfn>&lt;?php echo set_select('myselect', 'two'); ?></dfn> >Two&lt;/option><br /> +&lt;option value="three" <dfn>&lt;?php echo set_select('myselect', 'three'); ?></dfn> >Three&lt;/option><br /> +&lt;/select> +</code> + + +<h2>set_checkbox()</h2> + +<p>Permits you to display a checkbox in the state it was submitted. The first parameter +must contain the name of the checkbox, the second parameter must contain its value, and the third (optional) parameter lets you set an item as the default (use boolean TRUE/FALSE). Example:</p> + +<code>&lt;input type="checkbox" name="mycheck" value="1" <dfn>&lt;?php echo set_checkbox('mycheck', '1'); ?></dfn> /><br /> +&lt;input type="checkbox" name="mycheck" value="2" <dfn>&lt;?php echo set_checkbox('mycheck', '2'); ?></dfn> /></code> + + +<h2>set_radio()</h2> + +<p>Permits you to display radio buttons in the state they were submitted. This function is identical to the <strong>set_checkbox()</strong> function above.</p> + +<code>&lt;input type="radio" name="myradio" value="1" <dfn>&lt;?php echo set_radio('myradio', '1', TRUE); ?></dfn> /><br /> +&lt;input type="radio" name="myradio" value="2" <dfn>&lt;?php echo set_radio('myradio', '2'); ?></dfn> /></code> + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="file_helper.html">File Helper</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="html_helper.html">HTML Helper</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/helpers/html_helper.html b/user_guide/helpers/html_helper.html new file mode 100644 index 0000000..a2626f7 --- /dev/null +++ b/user_guide/helpers/html_helper.html @@ -0,0 +1,390 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>HTML Helper : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +HTML Helper +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>HTML Helper</h1> + +<p>The HTML Helper file contains functions that assist in working with HTML.</p> + +<ul> + <li><a href="#br">br()</a></li> + <li><a href="#heading">heading()</a></li> + <li><a href="#img">img()</a></li> + <li><a href="#link_tag">link_tag()</a></li> + <li><a href="#nbs">nbs()</a></li> + <li><a href="#ol_and_ul">ol() and ul()</a></li> + <li><a href="#meta">meta()</a></li> + <li><a href="#doctype">doctype()</a></li> +</ul> + +<h2>Loading this Helper</h2> + +<p>This helper is loaded using the following code:</p> +<code>$this->load->helper('html');</code> + +<p>The following functions are available:</p> + +<h2><a name="br"></a>br()</h2> +<p>Generates line break tags (&lt;br />) based on the number you submit. Example:</p> +<code>echo br(3);</code> +<p>The above would produce: &lt;br />&lt;br />&lt;br /></p> + +<h2><a name="heading"></a>heading()</h2> +<p>Lets you create HTML &lt;h1> tags. The first parameter will contain the data, the +second the size of the heading. Example:</p> +<code>echo heading('Welcome!', 3);</code> +<p>The above would produce: &lt;h3>Welcome!&lt;/h3></p> + +<p>Additionally, in order to add attributes to the heading tag such as HTML classes, ids or inline styles, a third parameter is available.</p> +<code>echo heading('Welcome!', 3, 'class="pink"')</code> +<p>The above code produces: &lt;h3 class="pink">Welcome!<&lt;h3></p> + + +<h2><a name="img"></a>img()</h2> +<p>Lets you create HTML &lt;img /&gt; tags. The first parameter contains the image source. Example:</p> +<code>echo img('images/picture.jpg');<br /> +// gives &lt;img src=&quot;http://site.com/images/picture.jpg&quot; /&gt;</code> +<p>There is an optional second parameter that is a TRUE/FALSE value that specifics if the src should have the page specified by $config['index_page'] added to the address it creates. Presumably, this would be if you were using a media controller.</p> +<p><code>echo img('images/picture.jpg', TRUE);<br /> +// gives &lt;img src=&quot;http://site.com/index.php/images/picture.jpg&quot; alt=&quot;&quot; /&gt;</code></p> +<p>Additionally, an associative array can be passed to the img() function for complete control over all attributes and values. If an alt attribute is not provided, CodeIgniter will generate an empty string.</p> +<p><code> $image_properties = array(<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'src' =&gt; 'images/picture.jpg',<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'alt' =&gt; 'Me, demonstrating how to eat 4 slices of pizza at one time',<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'class' =&gt; 'post_images',<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'width' =&gt; '200',<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'height' =&gt; '200',<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'title' =&gt; 'That was quite a night',<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rel' =&gt; 'lightbox',<br /> + );<br /> + <br /> + img($image_properties);<br /> + // &lt;img src=&quot;http://site.com/index.php/images/picture.jpg&quot; alt=&quot;Me, demonstrating how to eat 4 slices of pizza at one time&quot; class=&quot;post_images&quot; width=&quot;200&quot; height=&quot;200&quot; title=&quot;That was quite a night&quot; rel=&quot;lightbox&quot; /&gt;</code></p> + +<h2><a name="link_tag"></a>link_tag()</h2> +<p>Lets you create HTML &lt;link /> tags. This is useful for stylesheet links, as well as other links. The parameters are href, with optional rel, type, title, media and index_page. index_page is a TRUE/FALSE value that specifics if the href should have the page specified by $config['index_page'] added to the address it creates.<code> +echo link_tag('css/mystyles.css');<br /> +// gives &lt;link href=&quot;http://site.com/css/mystyles.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;</code></p> +<p>Further examples:</p> + +<code> + echo link_tag('favicon.ico', 'shortcut icon', 'image/ico');<br /> + // &lt;link href=&quot;http://site.com/favicon.ico&quot; rel=&quot;shortcut icon&quot; type=&quot;image/ico&quot; /&gt; + <br /> + <br /> + echo link_tag('feed', 'alternate', 'application/rss+xml', 'My RSS Feed');<br /> + // &lt;link href=&quot;http://site.com/feed&quot; rel=&quot;alternate&quot; type=&quot;application/rss+xml&quot; title=&quot;My RSS Feed&quot; /&gt; </code> +<p>Additionally, an associative array can be passed to the link() function for complete control over all attributes and values.</p> +<p><code> + $link = array(<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'href' =&gt; 'css/printer.css',<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rel' =&gt; 'stylesheet',<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'type' =&gt; 'text/css',<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'media' =&gt; 'print'<br /> + );<br /> + <br /> + echo link_tag($link);<br /> + // &lt;link href=&quot;http://site.com/css/printer.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;print&quot; /&gt;</code></p> + +<h2><a name="nbs"></a>nbs()</h2> +<p>Generates non-breaking spaces (&amp;nbsp;) based on the number you submit. Example:</p> +<code>echo nbs(3);</code> +<p>The above would produce: &amp;nbsp;&amp;nbsp;&amp;nbsp;</p> + +<h2><a name="ol_and_ul"></a>ol()&nbsp; and&nbsp; ul()</h2> + +<p>Permits you to generate ordered or unordered HTML lists from simple or multi-dimensional arrays. Example:</p> + +<code> +$this->load->helper('html');<br /> +<br /> +$list = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'red', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'blue', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'green',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'yellow'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +$attributes = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'class' => 'boldlist',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'id'&nbsp;&nbsp;&nbsp;&nbsp;=> 'mylist'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +echo ul($list, $attributes);<br /> +</code> + +<p>The above code will produce this:</p> + +<code> +&lt;ul&nbsp;class="boldlist"&nbsp;id="mylist"><br /> +&nbsp;&nbsp;&lt;li>red&lt;/li><br /> +&nbsp;&nbsp;&lt;li>blue&lt;/li><br /> +&nbsp;&nbsp;&lt;li>green&lt;/li><br /> +&nbsp;&nbsp;&lt;li>yellow&lt;/li><br /> +&lt;/ul> +</code> + +<p>Here is a more complex example, using a multi-dimensional array:</p> + +<code> +$this->load->helper('html');<br /> +<br /> +$attributes = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'class' => 'boldlist',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'id'&nbsp;&nbsp;&nbsp;&nbsp;=> 'mylist'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +$list = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'colors' => array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'red',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'blue',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'green'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'shapes' => array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'round', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'square',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'circles' => array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'ellipse', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'oval', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'sphere'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'moods'&nbsp;&nbsp;&nbsp;&nbsp;=> array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'happy', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'upset' => array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'defeated' => array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'dejected',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'disheartened',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'depressed'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'annoyed',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'cross',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'angry'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +<br /> +echo ul($list, $attributes);</code> + +<p>The above code will produce this:</p> + +<code> +&lt;ul&nbsp;class="boldlist"&nbsp;id="mylist"&gt;<br /> +&nbsp;&nbsp;&lt;li&gt;colors<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&lt;ul&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;red&lt;/li&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;blue&lt;/li&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;green&lt;/li&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ul&gt;<br /> +&nbsp;&nbsp;&lt;/li&gt;<br /> +&nbsp;&nbsp;&lt;li&gt;shapes<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&lt;ul&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;round&lt;/li&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;suare&lt;/li&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;circles<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ul&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;elipse&lt;/li&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;oval&lt;/li&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;sphere&lt;/li&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ul&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/li&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ul&gt;<br /> +&nbsp;&nbsp;&lt;/li&gt;<br /> +&nbsp;&nbsp;&lt;li&gt;moods<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&lt;ul&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;happy&lt;/li&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;upset<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ul&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;defeated<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ul&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;dejected&lt;/li&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;disheartened&lt;/li&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;depressed&lt;/li&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ul&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/li&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;annoyed&lt;/li&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;cross&lt;/li&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;angry&lt;/li&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ul&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/li&gt;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ul&gt;<br /> +&nbsp;&nbsp;&lt;/li&gt;<br /> +&lt;/ul&gt; +</code> + + + +<h2><a name="meta"></a>meta()</h2> + +<p>Helps you generate meta tags. You can pass strings to the function, or simple arrays, or multidimensional ones. Examples:</p> + +<code> +echo meta('description', 'My Great site');<br /> +// Generates: &lt;meta name="description" content="My Great Site" /><br /> +<br /><br /> + +echo meta('Content-type', 'text/html; charset=utf-8', 'equiv'); // Note the third parameter. Can be "equiv" or "name"<br /> +// Generates: &lt;meta http-equiv="Content-type" content="text/html; charset=utf-8" /><br /> + +<br /><br /> + +echo meta(array('name' => 'robots', 'content' => 'no-cache'));<br /> +// Generates: &lt;meta name="robots" content="no-cache" /><br /> + +<br /><br /> + +$meta = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array('name' => 'robots', 'content' => 'no-cache'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array('name' => 'description', 'content' => 'My Great Site'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array('name' => 'keywords', 'content' => 'love, passion, intrigue, deception'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array('name' => 'robots', 'content' => 'no-cache'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array('name' => 'Content-type', 'content' => 'text/html; charset=utf-8', 'type' => 'equiv')<br /> +&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +echo meta($meta); +<br /> +// Generates: <br /> +// &lt;meta name="robots" content="no-cache" /><br /> +// &lt;meta name="description" content="My Great Site" /><br /> +// &lt;meta name="keywords" content="love, passion, intrigue, deception" /><br /> +// &lt;meta name="robots" content="no-cache" /><br /> +// &lt;meta http-equiv="Content-type" content="text/html; charset=utf-8" /> +</code> + + +<h2><a name="doctype"></a>doctype()</h2> + +<p>Helps you generate document type declarations, or DTD's. XHTML 1.0 Strict is used by default, but many doctypes are available.</p> + +<code> +echo doctype();<br /> +// &lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;<br /> +<br /> +echo doctype('html4-trans');<br /> +// &lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt; +</code> + +<p>The following is a list of doctype choices. These are configurable, and pulled from <samp>application/config/doctypes.php</samp></p> + +<table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder"> + <tr> + <th>Doctype</th> + <th>Option</th> + <th>Result</th> + </tr> + <tr> + <td class="td">XHTML 1.1</td> + <td class="td">doctype('xhtml11')</td> + <td class="td">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"&gt;</td> + </tr> + <tr> + <td class="td">XHTML 1.0 Strict</td> + <td class="td">doctype('xhtml1-strict')</td> + <td class="td">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;</td> + </tr> + <tr> + <td class="td">XHTML 1.0 Transitional</td> + <td class="td">doctype('xhtml1-trans')</td> + <td class="td">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;</td> + </tr> + <tr> + <td class="td">XHTML 1.0 Frameset</td> + <td class="td">doctype('xhtml1-frame')</td> + <td class="td">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"&gt;</td> + </tr> + <tr> + <td class="td">HTML 5</td> + <td class="td">doctype('html5')</td> + <td class="td">&lt;!DOCTYPE html&gt;</td> + </tr> + <tr> + <td class="td">HTML 4 Strict</td> + <td class="td">doctype('html4-strict')</td> + <td class="td">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;</td> + </tr> + <tr> + <td class="td">HTML 4 Transitional</td> + <td class="td">doctype('html4-trans')</td> + <td class="td">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;</td> + </tr> + <tr> + <td class="td">HTML 4 Frameset</td> + <td class="td">doctype('html4-frame')</td> + <td class="td">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd"&gt;</td> + </tr> +</table> + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="form_helper.html">Form Helper</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="path_helper.html"> Path Helper</a></p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/helpers/inflector_helper.html b/user_guide/helpers/inflector_helper.html new file mode 100644 index 0000000..19ec7a3 --- /dev/null +++ b/user_guide/helpers/inflector_helper.html @@ -0,0 +1,151 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Inflector Helper : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Inflector Helper +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Inflector Helper</h1> + +<p>The Inflector Helper file contains functions that permits you to change words to plural, singular, camel case, etc.</p> + + +<h2>Loading this Helper</h2> + +<p>This helper is loaded using the following code:</p> +<code>$this->load->helper('inflector');</code> + +<p>The following functions are available:</p> + + +<h2>singular()</h2> + +<p>Changes a plural word to singular. Example:</p> + +<code> +$word = "dogs";<br /> +echo singular($word); // Returns "dog" +</code> + + +<h2>plural()</h2> + +<p>Changes a singular word to plural. Example:</p> + +<code> +$word = "dog";<br /> +echo plural($word); // Returns "dogs" +</code> + + +<p>To force a word to end with &quot;es&quot; use a second &quot;true&quot; argument. </p> +<code> $word = &quot;pass&quot;;<br /> +echo plural($word, TRUE); // Returns &quot;passes&quot; </code> + +<h2>camelize()</h2> +<p>Changes a string of words separated by spaces or underscores to camel case. Example:</p> + +<code> +$word = "my_dog_spot";<br /> +echo camelize($word); // Returns "myDogSpot" +</code> + + +<h2>underscore()</h2> + +<p>Takes multiple words separated by spaces and underscores them. Example:</p> + +<code> +$word = "my dog spot";<br /> +echo underscore($word); // Returns "my_dog_spot" +</code> + + +<h2>humanize()</h2> + +<p>Takes multiple words separated by underscores and adds spaces between them. Each word is capitalized. Example:</p> + +<code> +$word = "my_dog_spot";<br /> +echo humanize($word); // Returns "My Dog Spot" +</code> + + + + + + + + + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="html_helper.html"> HTML Helper</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="number_helper.html">Number Helper</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/helpers/language_helper.html b/user_guide/helpers/language_helper.html new file mode 100644 index 0000000..2c00d7b --- /dev/null +++ b/user_guide/helpers/language_helper.html @@ -0,0 +1,98 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Language Helper : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> + +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Language Helper +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Language Helper</h1> + +<p>The Language Helper file contains functions that assist in working with language files.</p> + + +<h2>Loading this Helper</h2> + +<p>This helper is loaded using the following code:</p> +<code>$this->load->helper('language');</code> + +<p>The following functions are available:</p> + +<h2>lang('<var>language line</var>', '<var>element id</var>')</h2> + +<p>This function returns a line of text from a loaded language file with simplified syntax + that may be more desirable for view files than calling <kbd>$this-&gt;lang-&gt;line()</kbd>. + The optional second parameter will also output a form label for you. Example:</p> + +<code>echo lang('<samp>language_key</samp>', '<samp>form_item_id</samp>');<br /> +// becomes &lt;label for="form_item_id"&gt;language_key&lt;/label&gt;</code> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="date_helper.html">Date Helper</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="download_helper.html">Download Helper</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/helpers/number_helper.html b/user_guide/helpers/number_helper.html new file mode 100644 index 0000000..7ba831a --- /dev/null +++ b/user_guide/helpers/number_helper.html @@ -0,0 +1,113 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Number Helper : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Number Helper +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Number Helper</h1> + +<p>The Number Helper file contains functions that help you work with numeric data.</p> + + +<h2>Loading this Helper</h2> + +<p>This helper is loaded using the following code:</p> +<code>$this->load->helper('number');</code> + +<p>The following functions are available:</p> + + +<h2>byte_format()</h2> + +<p>Formats a numbers as bytes, based on size, and adds the appropriate suffix. Examples:</p> + +<code> +echo byte_format(456); // Returns 456 Bytes<br /> +echo byte_format(4567); // Returns 4.5 KB<br /> +echo byte_format(45678); // Returns 44.6 KB<br /> +echo byte_format(456789); // Returns 447.8 KB<br /> +echo byte_format(3456789); // Returns 3.3 MB<br /> +echo byte_format(12345678912345); // Returns 1.8 GB<br /> +echo byte_format(123456789123456789); // Returns 11,228.3 TB +</code> + +<p>An optional second parameter allows you to set the precision of the result.</p> + +<code> +echo byte_format(45678, 2); // Returns 44.61 KB +</code> + +<p class="important"> +<strong>Note:</strong> +The text generated by this function is found in the following language file: language/<your_lang>/number_lang.php +</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="inflector_helper.html">Inflector Helper</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="path_helper.html">Path Helper</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/helpers/path_helper.html b/user_guide/helpers/path_helper.html new file mode 100644 index 0000000..779d33f --- /dev/null +++ b/user_guide/helpers/path_helper.html @@ -0,0 +1,106 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Path Helper : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Path Helper +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Path Helper</h1> + +<p>The Path Helper file contains functions that permits you to work with file paths on the server.</p> + + +<h2>Loading this Helper</h2> + +<p>This helper is loaded using the following code:</p> +<code>$this->load->helper('path');</code> + +<p>The following functions are available:</p> + + +<h2>set_realpath()</h2> + +<p>Checks to see if the path exists. This function will return a server path without symbolic links or relative directory structures. An optional second argument will cause an error to be triggered if the path cannot be resolved.</p> + +<code>$directory = '/etc/passwd';<br /> +echo set_realpath($directory);<br /> +// returns &quot;/etc/passwd&quot;<br /> +<br /> +$non_existent_directory = '/path/to/nowhere';<br /> +echo set_realpath($non_existent_directory, TRUE);<br /> +// returns an <strong>error</strong>, as the path could not be resolved +<br /><br /> +echo set_realpath($non_existent_directory, FALSE);<br /> +// returns &quot;/path/to/nowhere&quot; + + + +</code> +<h2>&nbsp;</h2> +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="number_helper.html">Number Helper</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="security_helper.html">Security Helper</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/helpers/security_helper.html b/user_guide/helpers/security_helper.html new file mode 100644 index 0000000..cc8200b --- /dev/null +++ b/user_guide/helpers/security_helper.html @@ -0,0 +1,132 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Security Helper : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Security Helper +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Security Helper</h1> + +<p>The Security Helper file contains security related functions.</p> + + +<h2>Loading this Helper</h2> + +<p>This helper is loaded using the following code:</p> +<code>$this->load->helper('security');</code> + +<p>The following functions are available:</p> + + +<h2>xss_clean()</h2> + +<p>Provides Cross Site Script Hack filtering. This function is an alias to the one in the +<a href="../libraries/input.html">Input class</a>. More info can be found there.</p> + + +<h2>sanitize_filename()</h2> + +<p>Provides protection against directory traversal. This function is an alias to the one in the +<a href="../libraries/security.html">Security class</a>. More info can be found there.</p> + + +<h2>do_hash()</h2> + +<p>Permits you to create SHA1 or MD5 one way hashes suitable for encrypting passwords. Will create SHA1 by default. Examples:</p> + +<code> +$str = do_hash($str); // SHA1<br /> +<br /> +$str = do_hash($str, 'md5'); // MD5 +</code> + +<p class="important"><strong>Note:</strong> This function was formerly named <kbd>dohash()</kbd>, which has been deprecated in favour of <kbd>do_hash()</kbd>.</p> + + + +<h2>strip_image_tags()</h2> + +<p>This is a security function that will strip image tags from a string. It leaves the image URL as plain text.</p> + +<code>$string = strip_image_tags($string);</code> + + +<h2>encode_php_tags()</h2> + +<p>This is a security function that converts PHP tags to entities. Note: If you use the XSS filtering function it does this automatically.</p> + +<code>$string = encode_php_tags($string);</code> + + + + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="path_helper.html"> Path Helper</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="smiley_helper.html">Smiley Helper</a></p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/helpers/smiley_helper.html b/user_guide/helpers/smiley_helper.html new file mode 100644 index 0000000..116c329 --- /dev/null +++ b/user_guide/helpers/smiley_helper.html @@ -0,0 +1,215 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Smiley Helper : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Smiley Helper +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Smiley Helper</h1> + +<p>The Smiley Helper file contains functions that let you manage smileys (emoticons).</p> + + +<h2>Loading this Helper</h2> + +<p>This helper is loaded using the following code:</p> +<code>$this->load->helper('smiley');</code> + +<h2>Overview</h2> + +<p>The Smiley helper has a renderer that takes plain text simileys, like <dfn>:-)</dfn> and turns +them into a image representation, like <img src="../images/smile.gif" width="19" height="19" border="0" alt="smile!" /></p> + +<p>It also lets you display a set of smiley images that when clicked will be inserted into a form field. +For example, if you have a blog that allows user commenting you can show the smileys next to the comment form. +Your users can click a desired smiley and with the help of some JavaScript it will be placed into the form field.</p> + + + +<h2>Clickable Smileys Tutorial</h2> + +<p>Here is an example demonstrating how you might create a set of clickable smileys next to a form field. This example +requires that you first download and install the smiley images, then create a controller and the View as described.</p> + +<p class="important"><strong>Important:</strong> Before you begin, please <a href="http://ellislab.com/asset/ci_download_files/smileys.zip">download the smiley images</a> and put them in +a publicly accessible place on your server. This helper also assumes you have the smiley replacement array located at +<dfn>application/config/smileys.php</dfn></p> + + +<h3>The Controller</h3> + +<p>In your <dfn>application/controllers/</dfn> folder, create a file called <kbd>smileys.php</kbd> and place the code below in it.</p> + +<p><strong>Important:</strong> Change the URL in the <dfn>get_clickable_smileys()</dfn> function below so that it points to +your <dfn>smiley</dfn> folder.</p> + +<p>You'll notice that in addition to the smiley helper we are using the <a href="../libraries/table.html">Table Class</a>.</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="25"> +&lt;?php + +class Smileys extends CI_Controller { + + function __construct() + { + parent::__construct(); + } + + function index() + { + $this->load->helper('smiley'); + $this->load->library('table'); + + $image_array = get_clickable_smileys('http://example.com/images/smileys/', 'comments'); + + $col_array = $this->table->make_columns($image_array, 8); + + $data['smiley_table'] = $this->table->generate($col_array); + + $this->load->view('smiley_view', $data); + } + +} +?&gt; +</textarea> + +<p>In your <dfn>application/views/</dfn> folder, create a file called <kbd>smiley_view.php</kbd> and place this code in it:</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="20"> +&lt;html> +&lt;head> +&lt;title>Smileys&lt;/title> + +&lt;?php echo smiley_js(); ?> + +&lt;/head> +&lt;body> + +&lt;form name="blog"> +&lt;textarea name="comments" id="comments" cols="40" rows="4">&lt;/textarea> +&lt;/form> + +&lt;p>Click to insert a smiley!&lt;/p> + +&lt;?php echo $smiley_table; ?> + +&lt;/body> +&lt;/html> +</textarea> + + +<p>When you have created the above controller and view, load it by visiting <dfn>http://www.example.com/index.php/smileys/</dfn></p> + + +<h3>Field Aliases</h3> + +<p>When making changes to a view it can be inconvenient to have the field id in the controller. To work around this, +you can give your smiley links a generic name that will be tied to a specific id in your view.</p> +<code>$image_array = get_smiley_links("http://example.com/images/smileys/", "comment_textarea_alias");</code> + +<p>To map the alias to the field id, pass them both into the smiley_js function:</p> +<code>$image_array = smiley_js("comment_textarea_alias", "comments");</code> + + +<h1>Function Reference</h1> + +<h2>get_clickable_smileys()</h2> + +<p>Returns an array containing your smiley images wrapped in a clickable link. You must supply the URL to your smiley folder +and a field id or field alias.</p> + +<code>$image_array = get_smiley_links("http://example.com/images/smileys/", "comment");</code> +<p class="important">Note: Usage of this function without the second parameter, in combination with js_insert_smiley has been deprecated.</p> + + +<h2>smiley_js()</h2> + +<p>Generates the JavaScript that allows the images to be clicked and inserted into a form field. +If you supplied an alias instead of an id when generating your smiley links, you need to pass the +alias and corresponding form id into the function. +This function is designed to be placed into the &lt;head&gt; area of your web page.</p> + +<code>&lt;?php echo smiley_js(); ?&gt;</code> +<p class="important">Note: This function replaces js_insert_smiley, which has been deprecated.</p> + + +<h2>parse_smileys()</h2> + +<p>Takes a string of text as input and replaces any contained plain text smileys into the image +equivalent. The first parameter must contain your string, the second must contain the URL to your smiley folder:</p> + +<code> +$str = 'Here are some simileys: :-) ;-)'; + +$str = parse_smileys($str, "http://example.com/images/smileys/"); + +echo $str; +</code> +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="security_helper.html">Security Helper</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="string_helper.html">String Helper</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/helpers/string_helper.html b/user_guide/helpers/string_helper.html new file mode 100644 index 0000000..6aa83ee --- /dev/null +++ b/user_guide/helpers/string_helper.html @@ -0,0 +1,189 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>String Helper : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +String Helper +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>String Helper</h1> + +<p>The String Helper file contains functions that assist in working with strings.</p> + + +<h2>Loading this Helper</h2> + +<p>This helper is loaded using the following code:</p> +<code>$this->load->helper('string');</code> + +<p>The following functions are available:</p> + +<h2>random_string()</h2> + +<p>Generates a random string based on the type and length you specify. Useful for creating passwords or generating random hashes.</p> + +<p>The first parameter specifies the type of string, the second parameter specifies the length. The following choices are available:</p> + + alpha, alunum, numeric, nozero, unique, md5, encrypt and sha1 +<ul> + <li><strong>alpha</strong>:&nbsp; A string with lower and uppercase letters only.</li> + <li><strong>alnum</strong>:&nbsp; Alpha-numeric string with lower and uppercase characters.</li> + <li><strong>numeric</strong>:&nbsp; Numeric string.</li> + <li><strong>nozero</strong>:&nbsp; Numeric string with no zeros.</li> + <li><strong>unique</strong>:&nbsp; Encrypted with MD5 and uniqid(). Note: The length parameter is not available for this type. + Returns a fixed length 32 character string.</li> + <li><strong>sha1</strong>:&nbsp; An encrypted random number based on <kbd>do_hash()</kbd> from the <a href="security_helper.html">security helper</a>.</li> +</ul> + +<p>Usage example:</p> + +<code>echo random_string('alnum', 16);</code> + + +<h2>increment_string()</h2> + +<p>Increments a string by appending a number to it or increasing the number. Useful for creating "copies" or a file or duplicating database content which has unique titles or slugs.</p> + +<p>Usage example:</p> + +<code>echo increment_string('file', '_'); // "file_1"<br/> +echo increment_string('file', '-', 2); // "file-2"<br/> +echo increment_string('file-4'); // "file-5"<br/></code> + + +<h2>alternator()</h2> + +<p>Allows two or more items to be alternated between, when cycling through a loop. Example:</p> + +<code>for ($i = 0; $i < 10; $i++)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo alternator('string one', 'string two');<br /> +}<br /> +</code> + +<p>You can add as many parameters as you want, and with each iteration of your loop the next item will be returned.</p> + +<code>for ($i = 0; $i < 10; $i++)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo alternator('one', 'two', 'three', 'four', 'five');<br /> +}<br /> +</code> + +<p><strong>Note:</strong> To use multiple separate calls to this function simply call the function with no arguments to re-initialize.</p> + + + +<h2>repeater()</h2> +<p>Generates repeating copies of the data you submit. Example:</p> +<code>$string = "\n";<br /> +echo repeater($string, 30);</code> + +<p>The above would generate 30 newlines.</p> +<h2>reduce_double_slashes()</h2> +<p>Converts double slashes in a string to a single slash, except those found in http://. Example: </p> +<code>$string = &quot;http://example.com//index.php&quot;;<br /> +echo reduce_double_slashes($string); // results in &quot;http://example.com/index.php&quot;</code> +<h2>trim_slashes()</h2> +<p>Removes any leading/trailing slashes from a string. Example:<br /> + <br /> + <code>$string = &quot;/this/that/theother/&quot;;<br /> +echo trim_slashes($string); // results in this/that/theother</code></p> + + +<h2>reduce_multiples()</h2> +<p>Reduces multiple instances of a particular character occuring directly after each other. Example:</p> +<code> +$string="Fred, Bill,, Joe, Jimmy";<br /> +$string=reduce_multiples($string,","); //results in "Fred, Bill, Joe, Jimmy" +</code> +<p>The function accepts the following parameters: +<code>reduce_multiples(string: text to search in, string: character to reduce, boolean: whether to remove the character from the front and end of the string)</code> + +The first parameter contains the string in which you want to reduce the multiplies. The second parameter contains the character you want to have reduced. +The third parameter is FALSE by default; if set to TRUE it will remove occurences of the character at the beginning and the end of the string. Example: + +<code> +$string=",Fred, Bill,, Joe, Jimmy,";<br /> +$string=reduce_multiples($string, ", ", TRUE); //results in "Fred, Bill, Joe, Jimmy" +</code> +</p> + +<h2>quotes_to_entities()</h2> +<p>Converts single and double quotes in a string to the corresponding HTML entities. Example:</p> +<code>$string="Joe's \"dinner\"";<br /> +$string=quotes_to_entities($string); //results in "Joe&amp;#39;s &amp;quot;dinner&amp;quot;" +</code> + +<h2>strip_quotes()</h2> +<p>Removes single and double quotes from a string. Example:</p> +<code>$string="Joe's \"dinner\"";<br /> +$string=strip_quotes($string); //results in "Joes dinner" +</code> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="smiley_helper.html">Smiley Helper</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="text_helper.html">Text Helper</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/helpers/text_helper.html b/user_guide/helpers/text_helper.html new file mode 100644 index 0000000..2d30365 --- /dev/null +++ b/user_guide/helpers/text_helper.html @@ -0,0 +1,211 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Text Helper : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Text Helper +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Text Helper</h1> + +<p>The Text Helper file contains functions that assist in working with text.</p> + + +<h2>Loading this Helper</h2> + +<p>This helper is loaded using the following code:</p> +<code>$this->load->helper('text');</code> + +<p>The following functions are available:</p> + + +<h2>word_limiter()</h2> + +<p>Truncates a string to the number of <strong>words</strong> specified. Example:</p> + +<code> +$string = "Here is a nice text string consisting of eleven words.";<br /> +<br /> +$string = word_limiter($string, 4);<br /><br /> + +// Returns: Here is a nice&#8230; +</code> + +<p>The third parameter is an optional suffix added to the string. By default it adds an ellipsis.</p> + + +<h2>character_limiter()</h2> + +<p>Truncates a string to the number of <strong>characters</strong> specified. It maintains the integrity +of words so the character count may be slightly more or less then what you specify. Example:</p> + +<code> +$string = "Here is a nice text string consisting of eleven words.";<br /> +<br /> +$string = character_limiter($string, 20);<br /><br /> + +// Returns: Here is a nice text string&#8230; +</code> + +<p>The third parameter is an optional suffix added to the string, if undeclared this helper uses an ellipsis.</p> + + + +<h2>ascii_to_entities()</h2> + +<p>Converts ASCII values to character entities, including high ASCII and MS Word characters that can cause problems when used in a web page, +so that they can be shown consistently regardless of browser settings or stored reliably in a database. +There is some dependence on your server's supported character sets, so it may not be 100% reliable in all cases, but for the most +part it should correctly identify characters outside the normal range (like accented characters). Example:</p> + +<code>$string = ascii_to_entities($string);</code> + + +<h2>entities_to_ascii()</h2> + +<p>This function does the opposite of the previous one; it turns character entities back into ASCII.</p> + +<h2>convert_accented_characters()</h2> + +<p>Transliterates high ASCII characters to low ASCII equivalents, useful when non-English characters need to be used where only standard ASCII characters are safely used, for instance, in URLs.</p> + +<code>$string = convert_accented_characters($string);</code> + +<p>This function uses a companion config file <dfn>application/config/foreign_chars.php</dfn> to define the to and from array for transliteration.</p> + +<h2>word_censor()</h2> + +<p>Enables you to censor words within a text string. The first parameter will contain the original string. The +second will contain an array of words which you disallow. The third (optional) parameter can contain a replacement value +for the words. If not specified they are replaced with pound signs: ####. Example:</p> + +<code> +$disallowed = array('darn', 'shucks', 'golly', 'phooey');<br /> +<br /> +$string = word_censor($string, $disallowed, 'Beep!');</code> + + +<h2>highlight_code()</h2> + +<p>Colorizes a string of code (PHP, HTML, etc.). Example:</p> + +<code>$string = highlight_code($string);</code> + +<p>The function uses PHP's highlight_string() function, so the colors used are the ones specified in your php.ini file.</p> + + +<h2>highlight_phrase()</h2> + +<p>Will highlight a phrase within a text string. The first parameter will contain the original string, the second will +contain the phrase you wish to highlight. The third and fourth parameters will contain the opening/closing HTML tags +you would like the phrase wrapped in. Example:</p> + +<code> +$string = "Here is a nice text string about nothing in particular.";<br /> +<br /> +$string = highlight_phrase($string, "nice text", '&lt;span style="color:#990000">', '&lt;/span>'); +</code> + +<p>The above text returns:</p> + +<p>Here is a <span style="color:#990000">nice text</span> string about nothing in particular.</p> + + + +<h2>word_wrap()</h2> + +<p>Wraps text at the specified <strong>character</strong> count while maintaining complete words. Example:</p> + +<code>$string = "Here is a simple string of text that will help us demonstrate this function.";<br /> +<br /> +echo word_wrap($string, 25);<br /> +<br /> +// Would produce:<br /> +<br /> +Here is a simple string<br /> +of text that will help<br /> +us demonstrate this<br /> +function</code> + +<h2>ellipsize()</h2> + +<p>This function will strip tags from a string, split it at a defined maximum length, and insert an ellipsis.</p> +<p>The first parameter is the string to ellipsize, the second is the number of characters in the final string. The third parameter is where in the string the ellipsis should appear from 0 - 1, left to right. For example. a value of 1 will place the ellipsis at the right of the string, .5 in the middle, and 0 at the left.</p> +<p>An optional forth parameter is the kind of ellipsis. By default, <samp>&amp;hellip;</samp> will be inserted.</p> + +<code>$str = 'this_string_is_entirely_too_long_and_might_break_my_design.jpg';<br /> +<br /> +echo ellipsize($str, 32, .5);</code> + +Produces: + +<code>this_string_is_e&hellip;ak_my_design.jpg</code> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="string_helper.html">String Helper</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="typography_helper.html">Typography Helper</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/helpers/typography_helper.html b/user_guide/helpers/typography_helper.html new file mode 100644 index 0000000..613c6dc --- /dev/null +++ b/user_guide/helpers/typography_helper.html @@ -0,0 +1,112 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Typography Helper : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Typography Helper +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Typography Helper</h1> + +<p>The Typography Helper file contains functions that help your format text in semantically relevant ways.</p> + + +<h2>Loading this Helper</h2> + +<p>This helper is loaded using the following code:</p> +<code>$this->load->helper('typography');</code> + +<p>The following functions are available:</p> + + +<h2>auto_typography()</h2> + +<p>Formats text so that it is semantically and typographically correct HTML. Please see the <a href="../libraries/typography.html">Typography Class</a> for more info.</p> + +<p>Usage example:</p> + +<code>$string = auto_typography($string);</code> + +<p><strong>Note:</strong> Typographic formatting can be processor intensive, particularly if you have a lot of content being formatted. +If you choose to use this function you may want to consider +<a href="../general/caching.html">caching</a> your pages.</p> + + +<h2>nl2br_except_pre()</h2> + +<p>Converts newlines to &lt;br /&gt; tags unless they appear within &lt;pre&gt; tags. +This function is identical to the native PHP <dfn>nl2br()</dfn> function, except that it ignores &lt;pre&gt; tags.</p> + +<p>Usage example:</p> + +<code>$string = nl2br_except_pre($string);</code> + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="text_helper.html">Text Helper</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="url_helper.html">URL Helper</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/helpers/url_helper.html b/user_guide/helpers/url_helper.html new file mode 100644 index 0000000..9559e29 --- /dev/null +++ b/user_guide/helpers/url_helper.html @@ -0,0 +1,302 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>URL Helper : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +URL Helper +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>URL Helper</h1> + +<p>The URL Helper file contains functions that assist in working with URLs.</p> + + +<h2>Loading this Helper</h2> + +<p>This helper is loaded using the following code:</p> +<code>$this->load->helper('url');</code> + +<p>The following functions are available:</p> + +<h2>site_url()</h2> + +<p>Returns your site URL, as specified in your config file. The index.php file (or whatever you have set as your +site <dfn>index_page</dfn> in your config file) will be added to the URL, as will any URI segments you pass to the function, and the <dfn>url_suffix</dfn> as set in your config file.</p> + +<p>You are encouraged to use this function any time you need to generate a local URL so that your pages become more portable +in the event your URL changes.</p> + +<p>Segments can be optionally passed to the function as a string or an array. Here is a string example:</p> + +<code>echo site_url("news/local/123");</code> + +<p>The above example would return something like: http://example.com/index.php/news/local/123</p> + +<p>Here is an example of segments passed as an array:</p> + +<code> +$segments = array('news', 'local', '123');<br /> +<br /> +echo site_url($segments);</code> + + +<h2>base_url()</h2> +<p>Returns your site base URL, as specified in your config file. Example:</p> +<code>echo base_url();</code> + +<p>This function returns the same thing as site_url, without the <dfn>index_page</dfn> or <dfn>url_suffix</dfn> being appended.</p> + +<p>Also like site_url, you can supply segments as a string or an array. Here is a string example:</p> + +<code>echo base_url("blog/post/123");</code> + +<p>The above example would return something like: http://example.com/blog/post/123</p> + +<p>This is useful because unlike site_url(), you can supply a string to a file, such as an image or stylesheet. For example:</p> + +<code>echo base_url("images/icons/edit.png");</code> + +<p>This would give you something like: http://example.com/images/icons/edit.png</p> + + +<h2>current_url()</h2> +<p>Returns the full URL (including segments) of the page being currently viewed.</p> + + +<h2>uri_string()</h2> +<p>Returns the URI segments of any page that contains this function. For example, if your URL was this:</p> +<code>http://some-site.com/blog/comments/123</code> + +<p>The function would return:</p> +<code>/blog/comments/123</code> + + +<h2>index_page()</h2> +<p>Returns your site "index" page, as specified in your config file. Example:</p> +<code>echo index_page();</code> + + + +<h2>anchor()</h2> + +<p>Creates a standard HTML anchor link based on your local site URL:</p> + +<code>&lt;a href="http://example.com">Click Here&lt;/a></code> + +<p>The tag has three optional parameters:</p> + +<code>anchor(<var>uri segments</var>, <var>text</var>, <var>attributes</var>)</code> + +<p>The first parameter can contain any segments you wish appended to the URL. As with the <dfn>site_url()</dfn> function above, +segments can be a string or an array.</p> + +<p><strong>Note:</strong>&nbsp; If you are building links that are internal to your application do not include the base URL (http://...). This +will be added automatically from the information specified in your config file. Include only the URI segments you wish appended to the URL.</p> + +<p>The second segment is the text you would like the link to say. If you leave it blank, the URL will be used.</p> + +<p>The third parameter can contain a list of attributes you would like added to the link. The attributes can be a simple string or an associative array.</p> + +<p>Here are some examples:</p> + +<code>echo anchor('news/local/123', 'My News', 'title="News title"');</code> + +<p>Would produce: &lt;a href="http://example.com/index.php/news/local/123" title="News title">My News&lt;/a></p> + +<code>echo anchor('news/local/123', 'My News', array('title' => 'The best news!'));</code> + +<p>Would produce: &lt;a href="http://example.com/index.php/news/local/123" title="The best news!">My News&lt;/a></p> + + +<h2>anchor_popup()</h2> + +<p>Nearly identical to the <dfn>anchor()</dfn> function except that it opens the URL in a new window. + +You can specify JavaScript window attributes in the third parameter to control how the window is opened. If +the third parameter is not set it will simply open a new window with your own browser settings. Here is an example +with attributes:</p> + +<code> + +$atts = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'width'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> '800',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'height'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> '600',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'scrollbars' => 'yes',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'status'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> 'yes',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'resizable'&nbsp;&nbsp;=> 'yes',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'screenx'&nbsp;&nbsp;&nbsp;&nbsp;=> '0',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'screeny'&nbsp;&nbsp;&nbsp;&nbsp;=> '0'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +echo anchor_popup('news/local/123', 'Click Me!', $atts);</code> + +<p>Note: The above attributes are the function defaults so you only need to set the ones that are different from what you need. +If you want the function to use all of its defaults simply pass an empty array in the third parameter:</p> + +<code>echo anchor_popup('news/local/123', 'Click Me!', array());</code> + + +<h2>mailto()</h2> + +<p>Creates a standard HTML email link. Usage example:</p> + +<code>echo mailto('me@my-site.com', 'Click Here to Contact Me');</code> + +<p>As with the <dfn>anchor()</dfn> tab above, you can set attributes using the third parameter.</p> + + +<h2>safe_mailto()</h2> + +<p>Identical to the above function except it writes an obfuscated version of the mailto tag using ordinal numbers +written with JavaScript to help prevent the email address from being harvested by spam bots.</p> + + +<h2>auto_link()</h2> + +<p>Automatically turns URLs and email addresses contained in a string into links. Example:</p> + +<code>$string = auto_link($string);</code> + +<p>The second parameter determines whether URLs and emails are converted or just one or the other. Default behavior is both +if the parameter is not specified. Email links are encoded as safe_mailto() as shown above.</p> + +<p>Converts only URLs:</p> +<code>$string = auto_link($string, 'url');</code> + +<p>Converts only Email addresses:</p> +<code>$string = auto_link($string, 'email');</code> + +<p>The third parameter determines whether links are shown in a new window. The value can be TRUE or FALSE (boolean):</p> +<code>$string = auto_link($string, 'both', TRUE);</code> + + +<h2>url_title()</h2> +<p>Takes a string as input and creates a human-friendly URL string. This is useful if, for example, you have a blog +in which you'd like to use the title of your entries in the URL. Example:</p> + +<code>$title = "What's wrong with CSS?";<br /> +<br /> +$url_title = url_title($title);<br /> +<br /> +// Produces: Whats-wrong-with-CSS +</code> + + +<p>The second parameter determines the word delimiter. By default dashes are used.</p> + +<code>$title = "What's wrong with CSS?";<br /> +<br /> +$url_title = url_title($title, '_');<br /> +<br /> +// Produces: Whats_wrong_with_CSS +</code> + +<p>The third parameter determines whether or not lowercase characters are forced. By default they are not. Options are boolean <dfn>TRUE</dfn>/<dfn>FALSE</dfn>:</p> + +<code>$title = "What's wrong with CSS?";<br /> +<br /> +$url_title = url_title($title, '_', TRUE);<br /> +<br /> +// Produces: whats_wrong_with_css +</code> + +<h3>prep_url()</h3> +<p>This function will add <kbd>http://</kbd> in the event that a scheme is missing from a URL. Pass the URL string to the function like this:</p> +<code> +$url = "example.com";<br /><br /> +$url = prep_url($url);</code> + + + + +<h2>redirect()</h2> + +<p>Does a "header redirect" to the URI specified. If you specify the full site URL that link will be build, but for local links simply providing the URI segments +to the controller you want to direct to will create the link. The function will build the URL based on your config file values.</p> + +<p>The optional second parameter allows you to choose between the "location" +method (default) or the "refresh" method. Location is faster, but on Windows servers it can sometimes be a problem. The optional third parameter allows you to send a specific HTTP Response Code - this could be used for example to create 301 redirects for search engine purposes. The default Response Code is 302. The third parameter is <em>only</em> available with 'location' redirects, and not 'refresh'. Examples:</p> + +<code>if ($logged_in == FALSE)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redirect('/login/form/', 'refresh');<br /> +}<br /> +<br /> +// with 301 redirect<br /> +redirect('/article/13', 'location', 301);</code> + +<p class="important"><strong>Note:</strong> In order for this function to work it must be used before anything is outputted +to the browser since it utilizes server headers.<br /> +<strong>Note:</strong> For very fine grained control over headers, you should use the <a href="../libraries/output.html">Output Library</a>'s set_header() function.</p> + + + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="typography_helper.html">Typography Helper</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="xml_helper.html">XML Helper</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/helpers/xml_helper.html b/user_guide/helpers/xml_helper.html new file mode 100644 index 0000000..997c67e --- /dev/null +++ b/user_guide/helpers/xml_helper.html @@ -0,0 +1,105 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>XML Helper : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +XML Helper +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>XML Helper</h1> + +<p>The XML Helper file contains functions that assist in working with XML data.</p> + + +<h2>Loading this Helper</h2> + +<p>This helper is loaded using the following code:</p> +<code>$this->load->helper('xml');</code> + +<p>The following functions are available:</p> + +<h2>xml_convert('<var>string</var>')</h2> + +<p>Takes a string as input and converts the following reserved XML characters to entities:</p> + +<p> +Ampersands: &amp;<br /> +Less then and greater than characters: &lt; &gt;<br /> +Single and double quotes: ' &nbsp;"<br /> +Dashes: -</p> + +<p>This function ignores ampersands if they are part of existing character entities. Example:</p> + +<code>$string = xml_convert($string);</code> + + + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="url_helper.html">URL Helper</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/images/appflowchart.gif b/user_guide/images/appflowchart.gif new file mode 100644 index 0000000..4328e48 Binary files /dev/null and b/user_guide/images/appflowchart.gif differ diff --git a/user_guide/images/arrow.gif b/user_guide/images/arrow.gif new file mode 100644 index 0000000..9e9c79a Binary files /dev/null and b/user_guide/images/arrow.gif differ diff --git a/user_guide/images/ci_logo.jpg b/user_guide/images/ci_logo.jpg new file mode 100644 index 0000000..3ae0eee Binary files /dev/null and b/user_guide/images/ci_logo.jpg differ diff --git a/user_guide/images/ci_logo_flame.jpg b/user_guide/images/ci_logo_flame.jpg new file mode 100644 index 0000000..17e9c58 Binary files /dev/null and b/user_guide/images/ci_logo_flame.jpg differ diff --git a/user_guide/images/ci_quick_ref.png b/user_guide/images/ci_quick_ref.png new file mode 100644 index 0000000..c07d6b4 Binary files /dev/null and b/user_guide/images/ci_quick_ref.png differ diff --git a/user_guide/images/codeigniter_1.7.1_helper_reference.pdf b/user_guide/images/codeigniter_1.7.1_helper_reference.pdf new file mode 100644 index 0000000..85af7c8 Binary files /dev/null and b/user_guide/images/codeigniter_1.7.1_helper_reference.pdf differ diff --git a/user_guide/images/codeigniter_1.7.1_helper_reference.png b/user_guide/images/codeigniter_1.7.1_helper_reference.png new file mode 100644 index 0000000..15a7c15 Binary files /dev/null and b/user_guide/images/codeigniter_1.7.1_helper_reference.png differ diff --git a/user_guide/images/codeigniter_1.7.1_library_reference.pdf b/user_guide/images/codeigniter_1.7.1_library_reference.pdf new file mode 100644 index 0000000..13cb360 Binary files /dev/null and b/user_guide/images/codeigniter_1.7.1_library_reference.pdf differ diff --git a/user_guide/images/codeigniter_1.7.1_library_reference.png b/user_guide/images/codeigniter_1.7.1_library_reference.png new file mode 100644 index 0000000..7f054f9 Binary files /dev/null and b/user_guide/images/codeigniter_1.7.1_library_reference.png differ diff --git a/user_guide/images/file.gif b/user_guide/images/file.gif new file mode 100644 index 0000000..8141e03 Binary files /dev/null and b/user_guide/images/file.gif differ diff --git a/user_guide/images/folder.gif b/user_guide/images/folder.gif new file mode 100644 index 0000000..fef31a6 Binary files /dev/null and b/user_guide/images/folder.gif differ diff --git a/user_guide/images/nav_bg_darker.jpg b/user_guide/images/nav_bg_darker.jpg new file mode 100644 index 0000000..816efad Binary files /dev/null and b/user_guide/images/nav_bg_darker.jpg differ diff --git a/user_guide/images/nav_separator_darker.jpg b/user_guide/images/nav_separator_darker.jpg new file mode 100644 index 0000000..a09bd5a Binary files /dev/null and b/user_guide/images/nav_separator_darker.jpg differ diff --git a/user_guide/images/nav_toggle_darker.jpg b/user_guide/images/nav_toggle_darker.jpg new file mode 100644 index 0000000..eff33de Binary files /dev/null and b/user_guide/images/nav_toggle_darker.jpg differ diff --git a/user_guide/images/reactor-bullet.png b/user_guide/images/reactor-bullet.png new file mode 100644 index 0000000..89c8129 Binary files /dev/null and b/user_guide/images/reactor-bullet.png differ diff --git a/user_guide/images/smile.gif b/user_guide/images/smile.gif new file mode 100644 index 0000000..bf09225 Binary files /dev/null and b/user_guide/images/smile.gif differ diff --git a/user_guide/images/transparent.gif b/user_guide/images/transparent.gif new file mode 100644 index 0000000..b740647 Binary files /dev/null and b/user_guide/images/transparent.gif differ diff --git a/user_guide/index.html b/user_guide/index.html new file mode 100644 index 0000000..892fbc8 --- /dev/null +++ b/user_guide/index.html @@ -0,0 +1,98 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Welcome to CodeIgniter : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='userguide.css' /> + +<script type="text/javascript" src="nav/nav.js"></script> +<script type="text/javascript" src="nav/prototype.lite.js"></script> +<script type="text/javascript" src="nav/moo.fx.js"></script> +<script type="text/javascript" src="nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('null');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; CodeIgniter User Guide +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> + + + +<br clear="all" /> + +<div class="center"><img src="images/ci_logo_flame.jpg" width="150" height="164" border="0" alt="CodeIgniter" /></div> + + +<!-- START CONTENT --> +<div id="content"> + + + +<h2>Welcome to CodeIgniter</h2> + +<p>CodeIgniter is an Application Development Framework - a toolkit - for people who build web sites using PHP. +Its goal is to enable you to develop projects much faster than you could if you were writing code +from scratch, by providing a rich set of libraries for commonly needed tasks, as well as a simple interface and +logical structure to access these libraries. CodeIgniter lets you creatively focus on your project by +minimizing the amount of code needed for a given task.</p> + + +<h2>Who is CodeIgniter For?</h2> + +<p>CodeIgniter is right for you if:</p> + +<ul> +<li>You want a framework with a small footprint.</li> +<li>You need exceptional performance.</li> +<li>You need broad compatibility with standard hosting accounts that run a variety of PHP versions and configurations.</li> +<li>You want a framework that requires nearly zero configuration.</li> +<li>You want a framework that does not require you to use the command line.</li> +<li>You want a framework that does not require you to adhere to restrictive coding rules.</li> +<li>You do not want to be forced to learn a templating language (although a template parser is optionally available if you desire one).</li> +<li>You eschew complexity, favoring simple solutions.</li> +<li>You need clear, thorough documentation.</li> +</ul> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p><a href="#top">Top of Page</a></p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + + + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/downloads.html b/user_guide/installation/downloads.html new file mode 100644 index 0000000..f310175 --- /dev/null +++ b/user_guide/installation/downloads.html @@ -0,0 +1,103 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Downloading CodeIgniter : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Downloading CodeIgniter +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Downloading CodeIgniter</h1> + +<ul> + <li><a href="https://github.com/bcit-ci/CodeIgniter/archive/2.2.6.zip">CodeIgniter V 2.2.6</a> (Current version)</li> + <li><a href="https://github.com/bcit-ci/CodeIgniter/archive/2.2.5.zip">CodeIgniter V 2.2.5</a></li> + <li><a href="https://github.com/bcit-ci/CodeIgniter/archive/2.2.4.zip">CodeIgniter V 2.2.4</a></li> + <li><a href="https://github.com/bcit-ci/CodeIgniter/archive/2.2.3.zip">CodeIgniter V 2.2.3</a></li> + <li><a href="https://github.com/bcit-ci/CodeIgniter/archive/2.2.2.zip">CodeIgniter V 2.2.2</a></li> + <li><a href="https://github.com/bcit-ci/CodeIgniter/archive/2.2.1.zip">CodeIgniter V 2.2.1</a></li> + <li><a href="https://github.com/bcit-ci/CodeIgniter/archive/2.2.0.zip">CodeIgniter V 2.2.0</a></li> + <li><a href="https://github.com/bcit-ci/CodeIgniter/archive/2.1.4.zip">CodeIgniter V 2.1.4</a></li> + <li><a href="https://github.com/bcit-ci/CodeIgniter/archive/2.1.3.zip">CodeIgniter V 2.1.3</a></li> + <li><a href="https://github.com/bcit-ci/CodeIgniter/archive/2.1.2.zip">CodeIgniter V 2.1.2</a></li> + <li><a href="https://github.com/bcit-ci/CodeIgniter/archive/2.1.1.zip">CodeIgniter V 2.1.1</a></li> + <li><a href="https://github.com/bcit-ci/CodeIgniter/archive/v2.1.0.zip">CodeIgniter V 2.1.0</a></li> +</ul> + + + + +<h1 id="git">Git Server</h1> +<p><a href="http://git-scm.com/about">Git</a> is a distributed version control system.</p> + +<p>Public Git access is available at <a href="https://github.com/bcit-ci/CodeIgniter">GitHub</a>. + Please note that while every effort is made to keep this code base functional, we cannot guarantee the functionality of code taken + from the tip.</p> + +<p>Beginning with version 2.0.3, stable tags are also available via GitHub, simply select the version from the Tags dropdown.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="../general/credits.html">Credits</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="../installation/index.html">Installation Instructions</a> +</p> +<p><a href="http://codeigniter.com/">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/index.html b/user_guide/installation/index.html new file mode 100644 index 0000000..86f06b3 --- /dev/null +++ b/user_guide/installation/index.html @@ -0,0 +1,108 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Installation Instructions : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Installation Instructions +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Installation Instructions</h1> + +<p>CodeIgniter is installed in four steps:</p> + +<ol> +<li>Unzip the package.</li> +<li>Upload the CodeIgniter folders and files to your server. Normally the index.php file will be at your root.</li> +<li>Open the <dfn>application/config/config.php</dfn> file with a text editor and set your base URL. If you intend to use encryption or sessions, set your encryption key.</li> +<li>If you intend to use a database, open the <dfn>application/config/database.php</dfn> file with a text editor and set your database settings.</li> +</ol> + +<p>If you wish to increase security by hiding the location of your CodeIgniter files you can rename the <dfn>system</dfn> and <dfn>application</dfn> folders +to something more private. If you do rename them, you must open your main <kbd>index.php</kbd> file and set the <samp>$system_folder</samp> and <samp>$application_folder</samp> +variables at the top of the file with the new name you've chosen.</p> + +<p>For the best security, both the <dfn>system</dfn> and any <dfn>application</dfn> folders should be placed above web root so that they are not directly accessible via a browser. By default, .htaccess files are included in each folder to help prevent direct access, but it is best to remove them from public access entirely in case the web server configuration changes or doesn't abide by the .htaccess.</p> + +<p>After moving them, open your main <kdb>index.php</kbd> file and set the <samp>$system_folder</samp> and <samp>$application_folder</samp> variables, preferably with a full path, e.g. '<dfn>/www/MyUser/system</dfn>'.</p> + +<p> + One additional measure to take in production environments is to disable + PHP error reporting and any other development-only functionality. In CodeIgniter, + this can be done by setting the <kbd>ENVIRONMENT</kbd> constant, which is + more fully described on the <a href="../general/security.html">security page</a>. +</p> + +<p>That's it!</p> + +<p>If you're new to CodeIgniter, please read the <a href="../overview/getting_started.html">Getting Started</a> section of the User Guide to begin learning how +to build dynamic PHP applications. Enjoy!</p> + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="../general/credits.html">Credits</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="upgrading.html">Upgrading from a Previous Version</a> +</p> + +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/troubleshooting.html b/user_guide/installation/troubleshooting.html new file mode 100644 index 0000000..deb238a --- /dev/null +++ b/user_guide/installation/troubleshooting.html @@ -0,0 +1,90 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Troubleshooting : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Trouble Shooting +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Troubleshooting</h1> + +<p>If you find that no matter what you put in your URL only your default page is loading, it might be that your server +does not support the PATH_INFO variable needed to serve search-engine friendly URLs. + +As a first step, open your <dfn>application/config/config.php</dfn> file and look for the <kbd>URI Protocol</kbd> +information. It will recommend that you try a couple alternate settings. If it still doesn't work after you've tried this you'll need +to force CodeIgniter to add a question mark to your URLs. To do this open your <kbd>application/config/config.php</kbd> file and change this:</p> + +<code>$config['index_page'] = "index.php";</code> + +<p>To this:</p> + +<code>$config['index_page'] = "index.php?";</code> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="upgrading.html">Upgrading from a Previous Version</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="../overview/at_a_glance.html">CodeIgniter at a Glance</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_120.html b/user_guide/installation/upgrade_120.html new file mode 100644 index 0000000..42cc257 --- /dev/null +++ b/user_guide/installation/upgrade_120.html @@ -0,0 +1,92 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from Beta 1.1 to Final 1.2 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading From Beta 1.0 to Final 1.2</h1> + +<p>To upgrade to Version 1.2 please replace the following directories with the new versions:</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +<ul> +<li>drivers</li> +<li>helpers</li> +<li>init</li> +<li>language</li> +<li>libraries</li> +<li>plugins</li> +<li>scaffolding</li> +</ul> + +<p>Please also replace your local copy of the user guide with the new version.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_130.html b/user_guide/installation/upgrade_130.html new file mode 100644 index 0000000..3bf4b63 --- /dev/null +++ b/user_guide/installation/upgrade_130.html @@ -0,0 +1,203 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 1.2 to 1.3 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 1.2 to 1.3</h1> + +<p class="important"><strong>Note:</strong> The instructions on this page assume you are running version 1.2. If you +have not upgraded to that version please do so first.</p> + + +<p>Before performing an update you should take your site offline by replacing the index.php file +with a static one.</p> + + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace the following directories in your "system" folder with the new versions:</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +<ul> +<li>application/<strong>models</strong>/&nbsp;&nbsp; (new for 1.3)</li> +<li>codeigniter&nbsp;&nbsp; (new for 1.3)</li> +<li>drivers</li> +<li>helpers</li> +<li>init</li> +<li>language</li> +<li>libraries</li> +<li>plugins</li> +<li>scaffolding</li> +</ul> + + +<h2>Step 2: Update your error files</h2> + +<p>Version 1.3 contains two new error templates located in <dfn>application/errors</dfn>, and for naming consistency the other error templates have +been renamed.</p> + +<p>If you <strong>have not</strong> customized any of the error templates simply +replace this folder:</p> + +<ul> +<li>application/errors/</li> +</ul> + +<p>If you <strong>have</strong> customized your error templates, rename them as follows:</p> + + +<ul> +<li>404.php&nbsp;&nbsp; =&nbsp; error_404.php</li> +<li>error.php&nbsp;&nbsp; =&nbsp; error_general.php</li> +<li>error_db.php&nbsp;&nbsp; (new)</li> +<li>error_php.php&nbsp;&nbsp; (new)</li> +</ul> + + +<h2>Step 3: Update your index.php file</h2> + +<p>Please open your main <dfn>index.php</dfn> file (located at your root). At the very bottom of the file, change this:</p> + +<code>require_once BASEPATH.'libraries/Front_controller'.EXT;</code> + +<p>To this:</p> + +<code>require_once BASEPATH.'codeigniter/CodeIgniter'.EXT;</code> + + +<h2>Step 4: Update your config.php file</h2> + +<p>Open your <dfn>application/config/config.php</dfn> file and add these new items:</p> + +<pre> +/* +|------------------------------------------------ +| URL suffix +|------------------------------------------------ +| +| This option allows you to add a suffix to all URLs. +| For example, if a URL is this: +| +| example.com/index.php/products/view/shoes +| +| You can optionally add a suffix, like ".html", +| making the page appear to be of a certain type: +| +| example.com/index.php/products/view/shoes.html +| +*/ +$config['url_suffix'] = ""; + + +/* +|------------------------------------------------ +| Enable Query Strings +|------------------------------------------------ +| +| By default CodeIgniter uses search-engine and +| human-friendly segment based URLs: +| +| example.com/who/what/where/ +| +| You can optionally enable standard query string +| based URLs: +| +| example.com?who=me&what=something&where=here +| +| Options are: TRUE or FALSE (boolean) +| +| The two other items let you set the query string "words" +| that will invoke your controllers and functions: +| example.com/index.php?c=controller&m=function +| +*/ +$config['enable_query_strings'] = FALSE; +$config['controller_trigger'] = 'c'; +$config['function_trigger'] = 'm'; +</pre> + + +<h2>Step 5: Update your database.php file</h2> + +<p>Open your <dfn>application/config/database.php</dfn> file and add these new items:</p> + +<pre> +$db['default']['dbprefix'] = ""; +$db['default']['active_r'] = TRUE; +</pre> + + +<h2>Step 6: Update your user guide</h2> + +<p>Please also replace your local copy of the user guide with the new version.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_131.html b/user_guide/installation/upgrade_131.html new file mode 100644 index 0000000..3e21854 --- /dev/null +++ b/user_guide/installation/upgrade_131.html @@ -0,0 +1,102 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 1.3 to 1.3.1 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 1.3 to 1.3.1</h1> + +<p class="important"><strong>Note:</strong> The instructions on this page assume you are running version 1.3. If you +have not upgraded to that version please do so first.</p> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + + + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace the following directories in your "system" folder with the new versions:</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +<ul> +<li>drivers</li> +<li>init/init_unit_test.php (new for 1.3.1)</li> +<li>language/</li> +<li>libraries</li> +<li>scaffolding</li> +</ul> + + +<h2>Step 2: Update your user guide</h2> + +<p>Please also replace your local copy of the user guide with the new version.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_132.html b/user_guide/installation/upgrade_132.html new file mode 100644 index 0000000..c7ad009 --- /dev/null +++ b/user_guide/installation/upgrade_132.html @@ -0,0 +1,100 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 1.3.1 to 1.3.2 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 1.3.1 to 1.3.2</h1> + +<p class="important"><strong>Note:</strong> The instructions on this page assume you are running version 1.3.1. If you +have not upgraded to that version please do so first.</p> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + + + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace the following directories in your "system" folder with the new versions:</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +<ul> +<li>drivers</li> +<li>init</li> +<li>libraries</li> +</ul> + + +<h2>Step 2: Update your user guide</h2> + +<p>Please also replace your local copy of the user guide with the new version.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_133.html b/user_guide/installation/upgrade_133.html new file mode 100644 index 0000000..564adc0 --- /dev/null +++ b/user_guide/installation/upgrade_133.html @@ -0,0 +1,112 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 1.3.2 to 1.3.3 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 1.3.2 to 1.3.3</h1> + +<p class="important"><strong>Note:</strong> The instructions on this page assume you are running version 1.3.2. If you +have not upgraded to that version please do so first.</p> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + + + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace the following directories in your "system" folder with the new versions:</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +<ul> +<li>codeigniter</li> +<li>drivers</li> +<li>helpers</li> +<li>init</li> +<li>libraries</li> +</ul> + + +<h2>Step 2: Update your Models</h2> + +<p>If you are <strong>NOT</strong> using CodeIgniter's <a href="../general/models.html">Models</a> feature disregard this step.</p> + +<p>As of version 1.3.3, CodeIgniter does <strong>not</strong> connect automatically to your database when a model is loaded. This +allows you greater flexibility in determining which databases you would like used with your models. If your application is not connecting +to your database prior to a model being loaded you will have to update your code. There are several options for connecting, +<a href="../general/models.html">as described here</a>.</p> + + +<h2>Step 3: Update your user guide</h2> + +<p>Please also replace your local copy of the user guide with the new version.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_140.html b/user_guide/installation/upgrade_140.html new file mode 100644 index 0000000..3eab689 --- /dev/null +++ b/user_guide/installation/upgrade_140.html @@ -0,0 +1,145 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 1.3.3 to 1.4.0 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 1.3.3 to 1.4.0</h1> + +<p class="important"><strong>Note:</strong> The instructions on this page assume you are running version 1.3.3. If you +have not upgraded to that version please do so first.</p> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + + + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace the following directories in your "system" folder with the new versions:</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +<ul> +<li>application/config/<strong>hooks.php</strong></li> +<li>application/config/<strong>mimes.php</strong></li> +<li>codeigniter</li> +<li>drivers</li> +<li>helpers</li> +<li>init</li> +<li>language</li> +<li>libraries</li> +<li>scaffolding</li> +</ul> + + +<h2>Step 2: Update your config.php file</h2> + +<p>Open your <dfn>application/config/config.php</dfn> file and add these new items:</p> + +<pre> + +/* +|-------------------------------------------------------------------------- +| Enable/Disable System Hooks +|-------------------------------------------------------------------------- +| +| If you would like to use the "hooks" feature you must enable it by +| setting this variable to TRUE (boolean). See the user guide for details. +| +*/ +$config['enable_hooks'] = FALSE; + + +/* +|-------------------------------------------------------------------------- +| Allowed URL Characters +|-------------------------------------------------------------------------- +| +| This lets you specify which characters are permitted within your URLs. +| When someone tries to submit a URL with disallowed characters they will +| get a warning message. +| +| As a security measure you are STRONGLY encouraged to restrict URLs to +| as few characters as possible. By default only these are allowed: a-z 0-9~%.:_- +| +| Leave blank to allow all characters -- but only if you are insane. +| +| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!! +| +*/ +$config['permitted_uri_chars'] = 'a-z 0-9~%.:_-'; +</pre> + + +<h2>Step 3: Update your user guide</h2> + +<p>Please also replace your local copy of the user guide with the new version.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_141.html b/user_guide/installation/upgrade_141.html new file mode 100644 index 0000000..0c2cd94 --- /dev/null +++ b/user_guide/installation/upgrade_141.html @@ -0,0 +1,148 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 1.4.0 to 1.4.1 </td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 1.4.0 to 1.4.1</h1> + +<p class="important"><strong>Note:</strong> The instructions on this page assume you are running version 1.4.0. If you +have not upgraded to that version please do so first.</p> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + + + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace the following directories in your "system" folder with the new versions:</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +<ul> +<li>codeigniter</li> +<li>drivers</li> +<li>helpers</li> +<li>libraries</li> +</ul> + + +<h2>Step 2: Update your config.php file</h2> + +<p>Open your <dfn>application/config/config.php</dfn> file and add this new item:</p> + +<pre> + +/* +|-------------------------------------------------------------------------- +| Output Compression +|-------------------------------------------------------------------------- +| +| Enables Gzip output compression for faster page loads. When enabled, +| the output class will test whether your server supports Gzip. +| Even if it does, however, not all browsers support compression +| so enable only if you are reasonably sure your visitors can handle it. +| +| VERY IMPORTANT: If you are getting a blank page when compression is enabled it +| means you are prematurely outputting something to your browser. It could +| even be a line of whitespace at the end of one of your scripts. For +| compression to work, nothing can be sent before the output buffer is called +| by the output class. Do not "echo" any values with compression enabled. +| +*/ +$config['compress_output'] = FALSE; + +</pre> + + + +<h2>Step 3: Rename an Autoload Item</h2> + +<p>Open the following file: <dfn>application/config/autoload.php</dfn></p> + +<p>Find this array item:</p> + +<code>$autoload['core'] = array();</code> + +<p>And rename it to this:</p> + +<code>$autoload['libraries'] = array();</code> + +<p>This change was made to improve clarity since some users were not sure that their own libraries could be auto-loaded.</p> + + + + + + +<h2>Step 4: Update your user guide</h2> + +<p>Please also replace your local copy of the user guide with the new version.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_150.html b/user_guide/installation/upgrade_150.html new file mode 100644 index 0000000..52c1845 --- /dev/null +++ b/user_guide/installation/upgrade_150.html @@ -0,0 +1,178 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 1.4.1 to 1.5.0 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 1.4.1 to 1.5.0</h1> + +<p class="important"><strong>Note:</strong> The instructions on this page assume you are running version 1.4.1. If you +have not upgraded to that version please do so first.</p> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + + + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace these files and directories in your "system" folder with the new versions:</p> + +<ul> + +<li><dfn>application/config/user_agents.php</dfn> (new file for 1.5)</li> +<li><dfn>application/config/smileys.php</dfn> (new file for 1.5)</li> +<li><dfn>codeigniter/</dfn></li> +<li><dfn>database/</dfn> (new folder for 1.5. Replaces the "drivers" folder)</li> +<li><dfn>helpers/</dfn></li> +<li><dfn>language/</dfn></li> +<li><dfn>libraries/</dfn></li> +<li><dfn>scaffolding/</dfn></li> +</ul> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + + +<h2>Step 2: Update your database.php file</h2> + +<p>Open your <dfn>application/config/database.php</dfn> file and add these new items:</p> + +<pre> +$db['default']['cache_on'] = FALSE; +$db['default']['cachedir'] = ''; +</pre> + + + +<h2>Step 3: Update your config.php file</h2> + +<p>Open your <dfn>application/config/config.php</dfn> file and <kbd>ADD</kbd> these new items:</p> + +<pre> +/* +|-------------------------------------------------------------------------- +| Class Extension Prefix +|-------------------------------------------------------------------------- +| +| This item allows you to set the filename/classname prefix when extending +| native libraries. For more information please see the user guide: +| +| http://codeigniter.com/user_guide/general/core_classes.html +| http://codeigniter.com/user_guide/general/creating_libraries.html +| +*/ +$config['subclass_prefix'] = 'MY_'; + +/* +|-------------------------------------------------------------------------- +| Rewrite PHP Short Tags +|-------------------------------------------------------------------------- +| +| If your PHP installation does not have short tag support enabled CI +| can rewrite the tags on-the-fly, enabling you to utilize that syntax +| in your view files. Options are TRUE or FALSE (boolean) +| +*/ +$config['rewrite_short_tags'] = FALSE; +</pre> + +<p>In that same file <kbd>REMOVE</kbd> this item:</p> + + +<pre> +/* +|-------------------------------------------------------------------------- +| Enable/Disable Error Logging +|-------------------------------------------------------------------------- +| +| If you would like errors or debug messages logged set this variable to +| TRUE (boolean). Note: You must set the file permissions on the "logs" folder +| such that it is writable. +| +*/ +$config['log_errors'] = FALSE; +</pre> + +<p>Error logging is now disabled simply by setting the threshold to zero.</p> + + + +<h2>Step 4: Update your main index.php file</h2> + +<p>If you are running a stock <dfn>index.php</dfn> file simply replace your version with the new one.</p> + +<p>If your <dfn>index.php</dfn> file has internal modifications, please add your modifications to the new file and use it.</p> + + + +<h2>Step 5: Update your user guide</h2> + +<p>Please also replace your local copy of the user guide with the new version.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_152.html b/user_guide/installation/upgrade_152.html new file mode 100644 index 0000000..ebe9095 --- /dev/null +++ b/user_guide/installation/upgrade_152.html @@ -0,0 +1,111 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 1.5.0 to 1.5.2 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 1.5.0 to 1.5.2</h1> + +<p class="important"><strong>Note:</strong> The instructions on this page assume you are running version 1.5.0 or 1.5.1. If you +have not upgraded to that version please do so first.</p> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + + + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace these files and directories in your "system" folder with the new versions:</p> + +<ul> + +<li><dfn>system/helpers/download_helper.php</dfn></li> +<li><dfn>system/helpers/form_helper.php</dfn></li> +<li><dfn>system/libraries/Table.php</dfn></li> +<li><dfn>system/libraries/User_agent.php</dfn></li> +<li><dfn>system/libraries/Exceptions.php</dfn></li> +<li><dfn>system/libraries/Input.php</dfn></li> +<li><dfn>system/libraries/Router.php</dfn></li> +<li><dfn>system/libraries/Loader.php</dfn></li> +<li><dfn>system/libraries/Image_lib.php</dfn></li> +<li><dfn>system/language/english/unit_test_lang.php</dfn></li> +<li><dfn>system/database/DB_active_rec.php</dfn></li> +<li><dfn> system/database/drivers/mysqli/mysqli_driver.php</dfn></li> +<li><dfn>codeigniter/</dfn></li> +</ul> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + + +<h2>Step 2: Update your user guide</h2> + +<p>Please also replace your local copy of the user guide with the new version.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_153.html b/user_guide/installation/upgrade_153.html new file mode 100644 index 0000000..d14cb1c --- /dev/null +++ b/user_guide/installation/upgrade_153.html @@ -0,0 +1,100 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp;Upgrading from 1.5.2 to 1.5.3 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 1.5.2 to 1.5.3</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + + + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace these files and directories in your "system" folder with the new versions:</p> + +<ul> + +<li><dfn>system/database/drivers</dfn></li> +<li><dfn>system/helpers</dfn></li> +<li><dfn>system/libraries/Input.php</dfn></li> +<li><dfn>system/libraries/Loader.php</dfn></li> +<li><dfn>system/libraries/Profiler.php</dfn></li> +<li><dfn>system/libraries/Table.php</dfn></li> +</ul> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + + +<h2>Step 2: Update your user guide</h2> + +<p>Please also replace your local copy of the user guide with the new version.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_154.html b/user_guide/installation/upgrade_154.html new file mode 100644 index 0000000..b0c3019 --- /dev/null +++ b/user_guide/installation/upgrade_154.html @@ -0,0 +1,116 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 1.5.3 to 1.5.4 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 1.5.3 to 1.5.4 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 1.5.3 to 1.5.4</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + + + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace these files and directories in your "system" folder with the new versions:</p> + +<ul> + +<li><dfn>application/config/mimes.php</dfn></li> +<li><dfn>system/codeigniter</dfn></li> +<li><dfn>system/database</dfn></li> +<li><dfn>system/helpers</dfn></li> +<li><dfn>system/libraries</dfn></li> +<li><dfn>system/plugins</dfn></li> +</ul> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +<h2>Step 2: Add charset to your config.php </h2> +<p>Add the following to application/config/config.php</p> +<code>/*<br /> + |--------------------------------------------------------------------------<br /> + | Default Character Set<br /> + |--------------------------------------------------------------------------<br /> + |<br /> + | This determines which character set is used by default in various methods<br /> + | that require a character set to be provided.<br /> + |<br /> + */<br /> + $config['charset'] = &quot;UTF-8&quot;;</code> + +<h2>Step 3: Autoloading language files </h2> +<p>If you want to autoload any language files, add this line to application/config/autoload.php</p> +<code>$autoload['language'] = array();</code> + +<h2>Step 4: Update your user guide</h2> +<p>Please also replace your local copy of the user guide with the new version.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_160.html b/user_guide/installation/upgrade_160.html new file mode 100644 index 0000000..117f6d9 --- /dev/null +++ b/user_guide/installation/upgrade_160.html @@ -0,0 +1,125 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 1.5.4 to 1.6.0 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 1.5.4 to 1.6.0 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 1.5.4 to 1.6.0</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + + + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace these files and directories in your "system" folder with the new versions:</p> + +<ul> + +<li><dfn>system/codeigniter</dfn></li> +<li><dfn>system/database</dfn></li> +<li><dfn>system/helpers</dfn></li> +<li><dfn>system/libraries</dfn></li> +<li><dfn>system/plugins</dfn></li> +<li><dfn>system/language</dfn></li> +</ul> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +<h2>Step 2: Add time_to_update to your config.php </h2> +<p>Add the following to application/config/config.php with the other session configuration options</p> +<p><code>$config['sess_time_to_update'] = 300;</code></p> +<h2>Step 3: Add $autoload['model']</h2> +<p>Add the following to application/config/autoload.php</p> +<p><code> /*<br /> + | -------------------------------------------------------------------<br /> + | Auto-load Model files<br /> + | -------------------------------------------------------------------<br /> + | Prototype:<br /> + |<br /> + | $autoload['model'] = array('my_model');<br /> + |<br /> + */<br /> + <br /> + $autoload['model'] = array();</code></p> +<h2>Step 4: Add to your database.php </h2> +<p>Make the following changes to your application/config/database.php file:</p> +<p>Add the following variable above the database configuration options, with <dfn>$active_group</dfn></p> +<p><code>$active_record = TRUE;</code></p> +<p>Remove the following from your database configuration options</p> +<p><code>$db['default']['active_r'] = TRUE;</code></p> +<p>Add the following to your database configuration options</p> +<p><code>$db['default']['char_set'] = &quot;utf8&quot;;<br /> +$db['default']['dbcollat'] = &quot;utf8_general_ci&quot;;</code></p> + +<h2>Step 5: Update your user guide</h2> +<p>Please also replace your local copy of the user guide with the new version.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_161.html b/user_guide/installation/upgrade_161.html new file mode 100644 index 0000000..cee4fdb --- /dev/null +++ b/user_guide/installation/upgrade_161.html @@ -0,0 +1,98 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 1.6.0 to 1.6.1 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 1.6.0 to 1.6.1 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 1.6.0 to 1.6.1</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + + + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace these files and directories in your "system" folder with the new versions:</p> + +<ul> + +<li><dfn>system/codeigniter</dfn></li> +<li><dfn>system/database</dfn></li> +<li><dfn>system/helpers</dfn></li> +<li><dfn>system/language</dfn></li> +<li><dfn>system/libraries</dfn></li> +</ul> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +<h2>Step 2: Update your user guide</h2> +<p>Please also replace your local copy of the user guide with the new version.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_162.html b/user_guide/installation/upgrade_162.html new file mode 100644 index 0000000..aff23d4 --- /dev/null +++ b/user_guide/installation/upgrade_162.html @@ -0,0 +1,106 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 1.6.1 to 1.6.2 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 1.6.1 to 1.6.2 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 1.6.1 to 1.6.2</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + + + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace these files and directories in your "system" folder with the new versions:</p> + +<ul> + +<li><dfn>system/codeigniter</dfn></li> +<li><dfn>system/database</dfn></li> +<li><dfn>system/helpers</dfn></li> +<li><dfn>system/language</dfn></li> +<li><dfn>system/libraries</dfn></li> +</ul> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + + +<h2>Step 2: Encryption Key</h2> +<p>If you are using sessions, open up application/config/config.php and verify you've set an encryption key.</p> + +<h2>Step 3: Constants File</h2> +<p>Copy /application/config/constants.php to your installation, and modify if necessary.</p> +<h2>Step 4: Mimes File</h2> +<p>Replace /application/config/mimes.php with the dowloaded version. If you've added custom mime types, you'll need to re-add them.</p> +<h2>Step 5: Update your user guide</h2> +<p>Please also replace your local copy of the user guide with the new version.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_163.html b/user_guide/installation/upgrade_163.html new file mode 100644 index 0000000..143d6db --- /dev/null +++ b/user_guide/installation/upgrade_163.html @@ -0,0 +1,99 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 1.6.2 to 1.6.3 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 1.6.2 to 1.6.3 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 1.6.2 to 1.6.3</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + + + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace these files and directories in your "system" folder with the new versions:</p> + +<ul> + +<li><dfn>system/codeigniter</dfn></li> +<li><dfn>system/database</dfn></li> +<li><dfn>system/helpers</dfn></li> +<li><dfn>system/language</dfn></li> +<li><dfn>system/libraries</dfn></li> +</ul> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + + +<h2>Step 2: Update your user guide</h2> +<p>Please also replace your local copy of the user guide with the new version.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_170.html b/user_guide/installation/upgrade_170.html new file mode 100644 index 0000000..2b7d8da --- /dev/null +++ b/user_guide/installation/upgrade_170.html @@ -0,0 +1,121 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 1.6.3 to 1.7.0 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 1.6.3 to 1.7.0 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 1.6.3 to 1.7.0</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + + + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace these files and directories in your "system" folder with the new versions:</p> + +<ul> + +<li><dfn>system/codeigniter</dfn></li> +<li><dfn>system/database</dfn></li> +<li><dfn>system/helpers</dfn></li> +<li><dfn>system/language</dfn></li> +<li><dfn>system/libraries</dfn></li> +</ul> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + + +<h2>Step 2: Update your Session Table</h2> + +<p>If you are using the Session class in your application, AND if you are storing session data to a database, you must add a new column named <dfn>user_data</dfn> to your session table. +Here is an example of what this column might look like for MySQL:</p> + +<code>user_data text NOT NULL</code> + +<p>To add this column you will run a query similar to this:</p> + +<code>ALTER TABLE `ci_sessions` ADD `user_data` text NOT NULL</code> + +<p>You'll find more information regarding the new Session functionality in the <a href="../libraries/sessions.html">Session class</a> page.</p> + + +<h2>Step 3: Update your Validation Syntax</h2> + +<p>This is an <strong>optional</strong>, but recommended step, for people currently using the Validation class. CI 1.7 introduces a new <a href="../libraries/form_validation.html">Form Validation class</a>, which +deprecates the old Validation library. We have left the old one in place so that existing applications that use it will not break, but you are encouraged to +migrate to the new version as soon as possible. Please read the user guide carefully as the new library works a little differently, and has several new features.</p> + + + +<h2>Step 4: Update your user guide</h2> +<p>Please replace your local copy of the user guide with the new version, including the image files.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_171.html b/user_guide/installation/upgrade_171.html new file mode 100644 index 0000000..ec220f3 --- /dev/null +++ b/user_guide/installation/upgrade_171.html @@ -0,0 +1,98 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 1.7.0 to 1.7.1 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 1.7.0 to 1.7.1 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 1.7.0 to 1.7.1</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + + + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace these files and directories in your "system" folder with the new versions:</p> + +<ul> + +<li><dfn>system/codeigniter</dfn></li> +<li><dfn>system/database</dfn></li> +<li><dfn>system/helpers</dfn></li> +<li><dfn>system/language</dfn></li> +<li><dfn>system/libraries</dfn></li> +</ul> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +<h2>Step 2: Update your user guide</h2> +<p>Please replace your local copy of the user guide with the new version, including the image files.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_172.html b/user_guide/installation/upgrade_172.html new file mode 100644 index 0000000..eb3dfcb --- /dev/null +++ b/user_guide/installation/upgrade_172.html @@ -0,0 +1,109 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 1.7.1 to 1.7.2 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 1.7.1 to 1.7.2 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 1.7.1 to 1.7.2</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + + + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace these files and directories in your "system" folder with the new versions:</p> + +<ul> + +<li><dfn>system/codeigniter</dfn></li> +<li><dfn>system/database</dfn></li> +<li><dfn>system/helpers</dfn></li> +<li><dfn>system/language</dfn></li> +<li><dfn>system/libraries</dfn></li> +<li><dfn>index.php</dfn></li> +</ul> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +<h2>Step 2: Remove header() from 404 error template</h2> +<p>If you are using header() in your 404 error template, such as the case with the default <samp>error_404.php</samp> template shown below, remove that line of code.</p> + +<code>&lt;?php header(&quot;HTTP/1.1 404 Not Found&quot;); ?&gt;</code> + +<p>404 status headers are now properly handled in the show_404() method itself.</p> + +<h2>Step 3: Confirm your system_path</h2> +<p>In your updated index.php file, confirm that the <dfn>$system_path</dfn> variable is set to your application's system folder.</p> + +<h2>Step 4: Update your user guide</h2> +<p>Please replace your local copy of the user guide with the new version, including the image files.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_200.html b/user_guide/installation/upgrade_200.html new file mode 100644 index 0000000..5610b02 --- /dev/null +++ b/user_guide/installation/upgrade_200.html @@ -0,0 +1,131 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 1.7.2 to 2.0.0 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 1.7.2 to 2.0.0 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 1.7.2 to 2.0.0</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + + + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace all files and directories in your "system" folder <strong>except</strong> your <kbd>application</kbd> folder.</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +<h2>Step 2: Adjust get_dir_file_info() where necessary</h2> + +<p>Version 2.0.0 brings a non-backwards compatible change to <kbd>get_dir_file_info()</kbd> in the <a href="../helpers/file_helper.html">File Helper</a>. Non-backwards compatible changes are extremely rare + in CodeIgniter, but this one we feel was warranted due to how easy it was to create serious server performance issues. If you <em>need</em> + recursiveness where you are using this helper function, change such instances, setting the second parameter, <kbd>$top_level_only</kbd> to FALSE:</p> + +<code>get_dir_file_info('/path/to/directory', <kbd>FALSE</kbd>);</code> + +</p> + +<h2>Step 3: Convert your Plugins to Helpers</h2> + +<p>2.0.0 gets rid of the "Plugin" system as their functionality was identical to Helpers, but non-extensible. You will need to rename your plugin files from <var>filename_pi.php</var> to <var>filename_helper.php</var>, move them to your <kbd>helpers</kbd> folder, and change all instances of: + + <code>$this->load->plugin('foo');</code> + +to + + <code>$this->load->helper('foo');</code> + +</p> + +<h2>Step 4: Update stored encrypted data</h2> + +<p class="important"><strong>Note:</strong> If your application does not use the Encryption library, does not store Encrypted data permanently, or is on an environment that does not support Mcrypt, you may skip this step.</p> + +<p>The Encryption library has had a number of improvements, some for encryption strength and some for performance, that has an unavoidable consequence of + making it no longer possible to decode encrypted data produced by the original version of this library. To help with the transition, a new method has + been added, <kbd>encode_from_legacy()</kbd> that will decode the data with the original algorithm and return a re-encoded string using the improved methods. + This will enable you to easily replace stale encrypted data with fresh in your applications, either on the fly or en masse.</p> + +<p>Please read <a href="../libraries/encryption.html#legacy">how to use this method</a> in the Encryption library documentation.</p> + +<h2>Step 5: Remove loading calls for the compatibility helper.</h2> +<p>The compatibility helper has been removed from the CodeIgniter core. All methods in it should be natively available in supported PHP versions.</p> + +<h2>Step 6: Update Class extension</h2> +<p>All core classes are now prefixed with <kbd>CI_</kbd>. Update Models and Controllers to extend CI_Model and CI_Controller, respectively.</p> + +<h2>Step 7: Update Parent Constructor calls</h2> +<p>All native CodeIgniter classes now use the PHP 5 <kbd>__construct()</kbd> convention. Please update extended libraries to call <kbd>parent::__construct()</kbd>.</p> + +<h2>Step 8: Update your user guide</h2> +<p>Please replace your local copy of the user guide with the new version, including the image files.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_201.html b/user_guide/installation/upgrade_201.html new file mode 100644 index 0000000..c07b031 --- /dev/null +++ b/user_guide/installation/upgrade_201.html @@ -0,0 +1,105 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 2.0.0 to 2.0.1 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 2.0.0 to 2.0.1 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 2.0.0 to 2.0.1</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + + +<h2>Step 2: Replace config/mimes.php</h2> + +<p>This config file has been updated to contain more mime types, please copy it to <kbd>application/config/mimes.php</kbd>.</p> + + +<h2>Step 3: Check for forms posting to default controller</h2> + +<p> + The default behavior for <kbd>form_open()</kbd> when called with no parameters used to be to post to the default controller, but it will now just leave an empty action="" meaning the form will submit to the current URL. + If submitting to the default controller was the expected behavior it will need to be changed from: +</p> + +<code>echo form_open(); //&lt;form action="" method="post" accept-charset="utf-8"></code> + +<p>to use either a / or <kbd>base_url()</kbd>:</p> + +<code>echo form_open('/'); //&lt;form action="http://example.com/index.php/" method="post" accept-charset="utf-8"><br/> +echo form_open(base_url()); //&lt;form action="http://example.com/" method="post" accept-charset="utf-8"></code> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_202.html b/user_guide/installation/upgrade_202.html new file mode 100644 index 0000000..0e89c4b --- /dev/null +++ b/user_guide/installation/upgrade_202.html @@ -0,0 +1,97 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 2.0.1 to 2.0.2 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 2.0.1 to 2.0.2 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 2.0.1 to 2.0.2</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + + +<h2>Step 2: Remove loading calls for the Security Library</h2> + +<p>Security has been moved to the core and is now always loaded automatically. Make sure you remove any loading calls as they will result in PHP errors.</p> + + +<h2>Step 3: Move MY_Security</h2> + +<p>If you are overriding or extending the Security library, you will need to move it to <kbd>application/core</kbd>.</p> + +<p><samp>csrf_token_name</samp> and <samp>csrf_hash</samp> have changed to protected class properties. Please use <samp>security->get_csrf_hash()</samp> and <samp>security->get_csrf_token_name()</samp> to access those values.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_203.html b/user_guide/installation/upgrade_203.html new file mode 100644 index 0000000..0c3bc6a --- /dev/null +++ b/user_guide/installation/upgrade_203.html @@ -0,0 +1,121 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 2.0.2 to 2.0.3 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 2.0.2 to 2.0.3 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 2.0.2 to 2.0.3</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +<h2>Step 2: Update your main index.php file</h2> + +<p>If you are running a stock <dfn>index.php</dfn> file simply replace your version with the new one.</p> + +<p>If your <dfn>index.php</dfn> file has internal modifications, please add your modifications to the new file and use it.</p> + +<h2>Step 3: Replace config/user_agents.php</h2> + +<p>This config file has been updated to contain more user agent types, please copy it to <kbd>application/config/user_agents.php</kbd>.</p> + +<h2>Step 4: Change references of the EXT constant to ".php"</h2> +<p class="important"><strong>Note:</strong> The EXT Constant has been marked as deprecated, but has not been removed from the application. You are encouraged to make the changes sooner rather than later.</p> + +<h2>Step 5: Remove APPPATH.'third_party' from autoload.php</h2> + +<p>Open application/autoload.php, and look for the following:</p> + +<code>$autoload['packages'] = array(APPPATH.'third_party');</code> + +<p>If you have not chosen to load any additional packages, that line can be changed to:</p> +<code>$autoload['packages'] = array();</code> + +<p>Which should provide for nominal performance gains if not autoloading packages.</p> + +<h2>Update Sessions Database Tables</h2> + +<p>If you are using database sessions with the CI Session Library, please update your <samp>ci_sessions</samp> database table as follows:</p> + +<code> + CREATE INDEX last_activity_idx ON ci_sessions(last_activity); + ALTER TABLE ci_sessions MODIFY user_agent VARCHAR(120); +</code> + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_210.html b/user_guide/installation/upgrade_210.html new file mode 100644 index 0000000..a37eb6e --- /dev/null +++ b/user_guide/installation/upgrade_210.html @@ -0,0 +1,89 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 2.0.3 to 2.1.0 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 2.0.3 to 2.1.0 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 2.0.3 to 2.1.0</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +<h2>Step 2: Replace config/user_agents.php</h2> + +<p>This config file has been updated to contain more user agent types, please copy it to <kbd>application/config/user_agents.php</kbd>.</p> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_211.html b/user_guide/installation/upgrade_211.html new file mode 100644 index 0000000..5837f2f --- /dev/null +++ b/user_guide/installation/upgrade_211.html @@ -0,0 +1,94 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 2.1.0 to 2.1.1 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 2.1.0 to 2.1.1 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 2.1.0 to 2.1.1</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +<h2>Step 2: Replace config/mimes.php</h2> + +<p>This config file has been updated to contain more user mime-types, please copy it to <kbd>application/config/mimes.php</kbd>.</p> + +<h2>Step 3: Update your IP address tables:</h2> + +<p>This upgrade adds support for IPv6 IP addresses. In order to store them, you need to enlarge your <var>ip_address</var> columns to 45 characters. For example, CodeIgniter's session table will need to change:</p> + +<code>ALTER TABLE ci_sessions CHANGE ip_address ip_address varchar(45) default '0' NOT NULL</code> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_212.html b/user_guide/installation/upgrade_212.html new file mode 100644 index 0000000..2871691 --- /dev/null +++ b/user_guide/installation/upgrade_212.html @@ -0,0 +1,84 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 2.1.1 to 2.1.2 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 2.1.1 to 2.1.2 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 2.1.1 to 2.1.2</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_213.html b/user_guide/installation/upgrade_213.html new file mode 100644 index 0000000..45c47de --- /dev/null +++ b/user_guide/installation/upgrade_213.html @@ -0,0 +1,84 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 2.1.2 to 2.1.3 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 2.1.2 to 2.1.3 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 2.1.2 to 2.1.3</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_214.html b/user_guide/installation/upgrade_214.html new file mode 100644 index 0000000..0fed297 --- /dev/null +++ b/user_guide/installation/upgrade_214.html @@ -0,0 +1,84 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 2.1.3 to 2.1.4 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 2.1.3 to 2.1.4 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 2.1.3 to 2.1.4</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_220.html b/user_guide/installation/upgrade_220.html new file mode 100644 index 0000000..2ec45d8 --- /dev/null +++ b/user_guide/installation/upgrade_220.html @@ -0,0 +1,86 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 2.1.4 to 2.2.0 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 2.1.4 to 2.2.0 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 2.1.4 to 2.2.0</h1> + +<p class="important"><strong>Note:</strong> The Encryption Class now requires the Mcrypt extension. If you were previously using the Encrypt Class without Mcrypt this is a breaking change, you must install the Mcrypt extension in order to upgrade. For information on installing Mcrypt please see the PHP <a href="http://php.net/manual/en/mcrypt.setup.php">documentation</a>.</p> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_221.html b/user_guide/installation/upgrade_221.html new file mode 100644 index 0000000..a562a1e --- /dev/null +++ b/user_guide/installation/upgrade_221.html @@ -0,0 +1,84 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 2.2.0 to 2.2.1 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 2.2.0 to 2.2.1 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 2.2.0 to 2.2.1</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_222.html b/user_guide/installation/upgrade_222.html new file mode 100644 index 0000000..87ff46d --- /dev/null +++ b/user_guide/installation/upgrade_222.html @@ -0,0 +1,84 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 2.2.1 to 2.2.2 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 2.2.1 to 2.2.2 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 2.2.1 to 2.2.2</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_223.html b/user_guide/installation/upgrade_223.html new file mode 100644 index 0000000..c558b56 --- /dev/null +++ b/user_guide/installation/upgrade_223.html @@ -0,0 +1,84 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 2.2.2 to 2.2.3 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 2.2.2 to 2.2.3 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 2.2.2 to 2.2.3</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_224.html b/user_guide/installation/upgrade_224.html new file mode 100644 index 0000000..1c54954 --- /dev/null +++ b/user_guide/installation/upgrade_224.html @@ -0,0 +1,84 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 2.2.3 to 2.2.4 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 2.2.3 to 2.2.4 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 2.2.3 to 2.2.4</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_225.html b/user_guide/installation/upgrade_225.html new file mode 100644 index 0000000..1aa7754 --- /dev/null +++ b/user_guide/installation/upgrade_225.html @@ -0,0 +1,84 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 2.2.4 to 2.2.5 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 2.2.4 to 2.2.5 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 2.2.4 to 2.2.5</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_226.html b/user_guide/installation/upgrade_226.html new file mode 100644 index 0000000..f48f7c4 --- /dev/null +++ b/user_guide/installation/upgrade_226.html @@ -0,0 +1,127 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading from 2.2.4 to 2.2.5 : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from 2.2.5 to 2.2.6 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading from 2.2.5 to 2.2.6</h1> + +<p>Before performing an update you should take your site offline by replacing the index.php file with a static one.</p> + +<h2>Step 1: Update your CodeIgniter files</h2> + +<p>Replace all files and directories in your "system" folder and replace your index.php file. If any modifications were made to your index.php they will need to be made fresh in this new one.</p> + +<p class="important"><strong>Note:</strong> If you have any custom developed files in these folders please make copies of them first.</p> + +<h1>Step 2: Make sure your 'base_url' configuration value is not empty</h1> + +<p>When <samp>$config['base_url']</samp> is not set, CodeIgniter tries to automatically +detect what your website's base URL is. This is done purely for convenience +when you are starting development of a new application.</p> + +<p>Auto-detection is never reliable and also has security implications, which +is why you should <b>always</b> have it manually configured!</p> + +<p>One of the changes in CodeIgniter 2.2.6 is how this auto-detection works, +and more specifically it now falls back to the server's IP address instead +of the hostname requested by the client. Therefore, if you've ever relied +on auto-detection, it will change how your website works now.</p> + +<p>In case you need to allow e.g. multiple domains, or both http:// and +https:// prefixes to be dynamically used depending on the request, +remember that application/config/config.php is still a PHP script, in +which you can create this logic with a few lines of code. For example::</p> + +<pre> + $allowed_domains = array('domain1.tld', 'domain2.tld'); + $default_domain = 'domain1.tld'; + + if (in_array($_SERVER['HTTP_HOST'], $allowed_domains, TRUE)) + { + $domain = $_SERVER['HTTP_HOST']; + } + else + { + $domain = $default_domain; + } + + if ( ! empty($_SERVER['HTTPS'])) + { + $config['base_url'] = 'https://'.$domain; + } + else + { + $config['base_url'] = 'http://'.$domain; + } +</pre> +</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrade_b11.html b/user_guide/installation/upgrade_b11.html new file mode 100644 index 0000000..df488fb --- /dev/null +++ b/user_guide/installation/upgrade_b11.html @@ -0,0 +1,144 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from Beta 1.0 to Beta 1.1 +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading From Beta 1.0 to Beta 1.1</h1> + +<p>To upgrade to Beta 1.1 please perform the following steps:</p> + +<h2>Step 1: Replace your index file</h2> + +<p>Replace your main <kbd>index.php</kbd> file with the new index.php file. Note: If you have renamed your "system" folder you will need to edit this info in the new file.</p> + +<h2>Step 2: Relocate your config folder</h2> + +<p>This version of CodeIgniter now permits multiple sets of "applications" to all share a common set of backend files. In order to enable +each application to have its own configuration values, the <kbd>config</kbd> directory must now reside +inside of your <dfn>application</dfn> folder, so please move it there.</p> + + +<h2>Step 3: Replace directories</h2> + +<p>Replace the following directories with the new versions:</p> + +<ul> +<li>drivers</li> +<li>helpers</li> +<li>init</li> +<li>libraries</li> +<li>scaffolding</li> +</ul> + + +<h2>Step 4: Add the calendar language file</h2> + +<p>There is a new language file corresponding to the new calendaring class which must be added to your language folder. Add +the following item to your version: <dfn>language/english/calendar_lang.php</dfn></p> + + +<h2>Step 5: Edit your config file</h2> + +<p>The original <kbd>application/config/config.php</kbd> file has a typo in it Open the file and look for the items related to cookies:</p> + +<code>$conf['cookie_prefix'] = "";<br /> +$conf['cookie_domain'] = "";<br /> +$conf['cookie_path'] = "/";</code> + +<p>Change the array name from <kbd>$conf</kbd> to <kbd>$config</kbd>, like this:</p> + +<code>$config['cookie_prefix'] = "";<br /> +$config['cookie_domain'] = "";<br /> +$config['cookie_path'] = "/";</code> + +<p>Lastly, add the following new item to the config file (and edit the option if needed):</p> + +<code><br /> +/*<br /> +|------------------------------------------------<br /> +| URI PROTOCOL<br /> +|------------------------------------------------<br /> +|<br /> +| This item determines which server global <br /> +| should be used to retrieve the URI string. The <br /> +| default setting of "auto" works for most servers.<br /> +| If your links do not seem to work, try one of <br /> +| the other delicious flavors:<br /> +| <br /> +| 'auto' Default - auto detects<br /> +| 'path_info' Uses the PATH_INFO <br /> +| 'query_string' Uses the QUERY_STRING<br /> +*/<br /> +<br /> +$config['uri_protocol'] = "auto";</code> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/installation/upgrading.html b/user_guide/installation/upgrading.html new file mode 100644 index 0000000..7d38f97 --- /dev/null +++ b/user_guide/installation/upgrading.html @@ -0,0 +1,117 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Upgrading From a Previous Version : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Upgrading from a Previous Version +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Upgrading From a Previous Version</h1> + +<p>Please read the upgrade notes corresponding to the version you are upgrading from.</p> + +<ul> + <li><a href="upgrade_226.html">Upgrading from 2.2.5 to 2.2.6</a></li> + <li><a href="upgrade_225.html">Upgrading from 2.2.4 to 2.2.5</a></li> + <li><a href="upgrade_224.html">Upgrading from 2.2.3 to 2.2.4</a></li> + <li><a href="upgrade_223.html">Upgrading from 2.2.2 to 2.2.3</a></li> + <li><a href="upgrade_222.html">Upgrading from 2.2.1 to 2.2.2</a></li> + <li><a href="upgrade_221.html">Upgrading from 2.2.0 to 2.2.1</a></li> + <li><a href="upgrade_220.html">Upgrading from 2.1.4 to 2.2.0</a></li> + <li><a href="upgrade_214.html">Upgrading from 2.1.3 to 2.1.4</a></li> + <li><a href="upgrade_213.html">Upgrading from 2.1.2 to 2.1.3</a></li> + <li><a href="upgrade_212.html">Upgrading from 2.1.1 to 2.1.2</a></li> + <li><a href="upgrade_211.html">Upgrading from 2.1.0 to 2.1.1</a></li> + <li><a href="upgrade_210.html">Upgrading from 2.0.3 to 2.1.0</a></li> + <li><a href="upgrade_203.html">Upgrading from 2.0.2 to 2.0.3</a></li> + <li><a href="upgrade_202.html">Upgrading from 2.0.1 to 2.0.2</a></li> + <li><a href="upgrade_201.html">Upgrading from 2.0 to 2.0.1</a></li> + <li><a href="upgrade_200.html">Upgrading from 1.7.2 to 2.0</a></li> + <li><a href="upgrade_172.html">Upgrading from 1.7.1 to 1.7.2</a></li> + <li><a href="upgrade_171.html">Upgrading from 1.7.0 to 1.7.1</a></li> + <li><a href="upgrade_170.html">Upgrading from 1.6.3 to 1.7.0</a></li> + <li><a href="upgrade_163.html">Upgrading from 1.6.2 to 1.6.3</a></li> + <li><a href="upgrade_162.html">Upgrading from 1.6.1 to 1.6.2</a></li> + <li><a href="upgrade_161.html">Upgrading from 1.6.0 to 1.6.1</a></li> + <li><a href="upgrade_160.html">Upgrading from 1.5.4 to 1.6.0</a></li> + <li><a href="upgrade_154.html">Upgrading from 1.5.3 to 1.5.4</a></li> + <li><a href="upgrade_153.html">Upgrading from 1.5.2 to 1.5.3</a></li> + <li><a href="upgrade_152.html">Upgrading from 1.5.0 or 1.5.1 to 1.5.2</a></li> + <li><a href="upgrade_150.html">Upgrading from 1.4.1 to 1.5.0</a></li> + <li><a href="upgrade_141.html">Upgrading from 1.4.0 to 1.4.1</a></li> + <li><a href="upgrade_140.html">Upgrading from 1.3.3 to 1.4.0</a></li> + <li><a href="upgrade_133.html">Upgrading from 1.3.2 to 1.3.3</a></li> + <li><a href="upgrade_132.html">Upgrading from 1.3.1 to 1.3.2</a></li> + <li><a href="upgrade_131.html">Upgrading from 1.3 to 1.3.1</a></li> + <li><a href="upgrade_130.html">Upgrading from 1.2 to 1.3</a></li> + <li><a href="upgrade_120.html">Upgrading from 1.1 to 1.2</a></li> + <li><a href="upgrade_b11.html">Upgrading from Beta 1.0 to Beta 1.1</a></li> +</ul> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Installation Instructions</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="troubleshooting.html">Troubleshooting</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/benchmark.html b/user_guide/libraries/benchmark.html new file mode 100644 index 0000000..dc34867 --- /dev/null +++ b/user_guide/libraries/benchmark.html @@ -0,0 +1,198 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Benchmarking Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Benchmarking Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Benchmarking Class</h1> + +<p>CodeIgniter has a Benchmarking class that is always active, enabling the time difference between any +two marked points to be calculated.</p> + +<p class="important"><strong>Note:</strong> This class is initialized automatically by the system so there is no need to do it manually.</p> + + +<p>In addition, the benchmark is always started the moment the framework is +invoked, and ended by the output class right before sending the final view to the browser, enabling a very accurate +timing of the entire system execution to be shown.</p> + + +<h3>Table of Contents</h3> + +<ul> +<li><a href="#using">Using the Benchmark Class</a></li> +<li><a href="#profiler">Profiling Your Benchmark Points</a></li> +<li><a href="#execution">Displaying Total Execution Time</a></li> +<li><a href="#memory">Displaying Memory Consumption</a></li> +</ul> + + + +<a name="using"></a> +<h2>Using the Benchmark Class</h2> + +<p>The Benchmark class can be used within your <a href="../general/controllers.html">controllers</a>, <a href="../general/views.html">views</a>, or your <a href="../general/models.html">models</a>. The process for usage is this:</p> + +<ol> +<li>Mark a start point</li> +<li>Mark an end point</li> +<li>Run the "elapsed time" function to view the results</li> +</ol> + +<p>Here's an example using real code:</p> + +<code>$this->benchmark->mark('code_start');<br /> +<br /> +// Some code happens here<br /> +<br /> +$this->benchmark->mark('code_end');<br /> +<br /> +echo $this->benchmark->elapsed_time('code_start', 'code_end');</code> + +<p class="important"><strong>Note:</strong> The words "code_start" and "code_end" are arbitrary. They are simply words used to set two markers. You can +use any words you want, and you can set multiple sets of markers. Consider this example:</p> + +<code>$this->benchmark->mark('dog');<br /> +<br /> +// Some code happens here<br /> +<br /> +$this->benchmark->mark('cat');<br /> +<br /> +// More code happens here<br /> +<br /> +$this->benchmark->mark('bird');<br /> +<br /> +echo $this->benchmark->elapsed_time('dog', 'cat');<br /> +echo $this->benchmark->elapsed_time('cat', 'bird');<br /> +echo $this->benchmark->elapsed_time('dog', 'bird');</code> + + +<a name="profiler"></a> +<h2>Profiling Your Benchmark Points</h2> + +<p>If you want your benchmark data to be available to the +<a href="../general/profiling.html">Profiler</a> all of your marked points must be set up in pairs, and +each mark point name must end with <kbd>_start</kbd> and <kbd>_end</kbd>. +Each pair of points must otherwise be named identically. Example:</p> + +<code> +$this->benchmark->mark('my_mark<kbd>_start</kbd>');<br /> +<br /> +// Some code happens here...<br /> +<br /> +$this->benchmark->mark('my_mark<kbd>_end</kbd>'); +<br /><br /> + +$this->benchmark->mark('another_mark<kbd>_start</kbd>');<br /> +<br /> +// Some more code happens here...<br /> +<br /> +$this->benchmark->mark('another_mark<kbd>_end</kbd>'); +</code> + +<p>Please read the <a href="../general/profiling.html">Profiler page</a> for more information.</p> + + +<a name="execution"></a> +<h2>Displaying Total Execution Time</h2> + +<p>If you would like to display the total elapsed time from the moment CodeIgniter starts to the moment the final output +is sent to the browser, simply place this in one of your view templates:</p> + +<code>&lt;?php echo $this->benchmark->elapsed_time();?&gt;</code> + +<p>You'll notice that it's the same function used in the examples above to calculate the time between two point, except you are +<strong>not</strong> using any parameters. When the parameters are absent, CodeIgniter does not stop the benchmark until right before the final +output is sent to the browser. It doesn't matter where you use the function call, the timer will continue to run until the very end.</p> + +<p>An alternate way to show your elapsed time in your view files is to use this pseudo-variable, if you prefer not to use the pure PHP:</p> +<code>{elapsed_time}</code> + +<p class="important"><strong>Note:</strong> If you want to benchmark anything within your controller +functions you must set your own start/end points.</p> + +<a name="memory"></a> +<h2>Displaying Memory Consumption</h2> + +<p>If your PHP installation is configured with --enable-memory-limit, you can display the amount of memory consumed by the entire +system using the following code in one of your view file:</p> + +<code>&lt;?php echo $this->benchmark->memory_usage();?&gt;</code> +<p>Note: This function can only be used in your view files. The consumption will reflect the total memory used by the entire app.</p> + +<p>An alternate way to show your memory usage in your view files is to use this pseudo-variable, if you prefer not to use the pure PHP:</p> +<code>{memory_usage}</code> + + + + +</div> +<!-- END CONTENT --> + + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="../doc_style/index.html">Writing Documentaion</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="calendar.html">Calendar Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/caching.html b/user_guide/libraries/caching.html new file mode 100644 index 0000000..f828704 --- /dev/null +++ b/user_guide/libraries/caching.html @@ -0,0 +1,193 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Caching Driver : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +<a href="../general/drivers.html">Drivers</a> &nbsp;&#8250;&nbsp; +Caching Driver +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Caching Driver</h1> + +<p>CodeIgniter features wrappers around some of the most popular forms of fast and dynamic caching. All but file-based caching require specific server requirements, and a Fatal Exception will be thrown if server requirements are not met.</p> + +<h2>Table of Contents</h2> +<ul> + <li><a href="#example_usage" title="Example Usage">Example Usage</a></li> + <li><a href="#function_reference" title="Function Reference">Function Reference</a></li> +</ul> + +<h3>Available Drivers</h3> +<ul> + <li><a href="#apc" title="APC Cache">Alternative PHP Cache (APC) Caching</a></li> + <li><a href="#file" title="File Caching">File-based Caching</a></li> + <li><a href="#memcached" title="Memcached">Memcached Caching</a></li> + <li><a href="#dummy" title="Dummy Caching">Dummy Cache</a></li> +</ul> + +<h2 id="example_usage">Example Usage</h2> + +<p>The following example will load the cache driver, specify <a href="#apc" title="APC">APC</a> as the driver to use, and fall back to file-based caching if APC is not available in the hosting environment.</p> + +<code> +$this->load->driver('cache', array('adapter' => 'apc', 'backup' => 'file'));<br /> +<br /> +if ( ! $foo = $this->cache->get('foo'))<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo 'Saving to the cache!&lt;br />';<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$foo = 'foobarbaz!';<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Save into the cache for 5 minutes<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->cache->save('foo', $foo, 300);<br /> +}<br /> +<br /> +echo $foo; +</code> + +<h1 id="function_reference">Function Reference</h1> + +<h2>is_supported(<var>driver</var>['string'])</h2> + +<p>This function is automatically called when accessing drivers via <samp>$this->cache->get()</samp>. However, if the individual drivers are used, make sure to call this function to ensure the driver is supported in the hosting environment.</p> + +<code> +if ($this->cache->apc->is_supported())<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($data = $this->cache->apc->get('my_cache'))<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// do things.<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +} +</code> + +<h2>get(<var>id</var>['string'])</h2> + +<p>This function will attempt to fetch an item from the cache store. If the item does not exist, the function will return <samp>FALSE</samp>.</p> +<code>$foo = $this->cache->get('my_cached_item');</code> + +<h2>save(<var>id</var>['string'], <var>data</var>['mixed'], <var>ttl</var>['int'])</h2> + +<p>This function will save an item to the cache store. If saving fails, the function will return <samp>FALSE</samp>.</p> +<p>The optional third parameter (Time To Live) defaults to 60 seconds.</p> +<code>$this->cache->save('cache_item_id', 'data_to_cache');</code> + +<h2>delete(<var>id</var>['string'])</h2> + +<p>This function will delete a specific item from the cache store. If item deletion fails, the function will return <samp>FALSE</samp>.</p> +<code>$this->cache->delete('cache_item_id');</code> + +<h2>clean()</h2> + +<p>This function will 'clean' the entire cache. If the deletion of the cache files fails, the function will return <samp>FALSE</samp>.</p> + +<code>$this->cache->clean();</code> + +<h2>cache_info()</h2> + +<p>This function will return information on the entire cache.</p> + +<code>var_dump($this->cache->cache_info());</code> + +<h2>get_metadata(<var>id</var>['string'])</h2> + +<p>This function will return detailed information on a specific item in the cache.</p> + +<code>var_dump($this->cache->get_metadata('my_cached_item'));</code> + +<h1>Drivers</h1> + +<h2 id="apc">Alternative PHP Cache (APC) Caching</h2> + +<p>All of the functions listed above can be accessed without passing a specific adapter to the driver loader as follows:</p> +<code>$this->load->driver('cache');<br /> + $this->cache->apc->save('foo', 'bar', 10);</code> +<p>For more information on APC, please see <a href="http://php.net/apc">http://php.net/apc</a></p> + +<h2 id="file">File-based Caching</h2> + +<p>Unlike caching from the Output Class, the driver file-based caching allows for pieces of view files to be cached. Use this with care, and make sure to benchmark your application, as a point can come where disk I/O will negate positive gains by caching.</p> + +<p>All of the functions listed above can be accessed without passing a specific adapter to the driver loader as follows:</p> +<code>$this->load->driver('cache');<br /> + $this->cache->file->save('foo', 'bar', 10);</code> + +<h2 id="memcached">Memcached Caching</h2> + +<p>Multiple Memcached servers can be specified in the memcached.php configuration file, located in the <samp>application/config/</samp> directory. + +<p>All of the functions listed above can be accessed without passing a specific adapter to the driver loader as follows:</p> +<code>$this->load->driver('cache');<br /> + $this->cache->memcached->save('foo', 'bar', 10);</code> + +<p>For more information on Memcached, please see <a href="http://php.net/memcached">http://php.net/memcached</a></p> + +<h2 id="dummy">Dummy Cache</h2> + +<p>This is a caching backend that will always 'miss.' It stores no data, but lets you keep your caching code in place in environments that don't support your chosen cache.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="zip.html">Zip Encoding Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="../database/index.html">Database Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/calendar.html b/user_guide/libraries/calendar.html new file mode 100644 index 0000000..bb5aaff --- /dev/null +++ b/user_guide/libraries/calendar.html @@ -0,0 +1,249 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Calendaring Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Calendaring Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + + + +<h1>Calendaring Class</h1> + +<p>The Calendar class enables you to dynamically create calendars. Your calendars can be formatted through the use of a calendar +template, allowing 100% control over every aspect of its design. In addition, you can pass data to your calendar cells.</p> + +<h2>Initializing the Class</h2> + +<p>Like most other classes in CodeIgniter, the Calendar class is initialized in your controller using the <dfn>$this->load->library</dfn> function:</p> + +<code>$this->load->library('calendar');</code> +<p>Once loaded, the Calendar object will be available using: <dfn>$this->calendar</dfn></p> + + +<h2>Displaying a Calendar</h2> + +<p>Here is a very simple example showing how you can display a calendar:</p> + +<code>$this->load->library('calendar');<br /> +<br /> +echo $this->calendar->generate();</code> + +<p>The above code will generate a calendar for the current month/year based on your server time. +To show a calendar for a specific month and year you will pass this information to the calendar generating function:</p> + +<code>$this->load->library('calendar');<br /> +<br /> +echo $this->calendar->generate(<kbd>2006</kbd>, <kbd>6</kbd>);</code> + +<p>The above code will generate a calendar showing the month of June in 2006. The first parameter specifies the year, the second parameter specifies the month.</p> + +<h2>Passing Data to your Calendar Cells</h2> + +<p>To add data to your calendar cells involves creating an associative array in which the keys correspond to the days +you wish to populate and the array value contains the data. The array is passed to the third parameter of the calendar +generating function. Consider this example:</p> + +<code>$this->load->library('calendar');<br /> +<br /> +$data = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp; => 'http://example.com/news/article/2006/03/',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7&nbsp; => 'http://example.com/news/article/2006/07/',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;13 => 'http://example.com/news/article/2006/13/',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;26 => 'http://example.com/news/article/2006/26/'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +echo $this->calendar->generate(<kbd>2006</kbd>, <kbd>6</kbd>, <var>$data</var>);</code> + +<p>Using the above example, day numbers 3, 7, 13, and 26 will become links pointing to the URLs you've provided.</p> + +<p class="important"><strong>Note:</strong> By default it is assumed that your array will contain links. +In the section that explains the calendar template below you'll see how you can customize +how data passed to your cells is handled so you can pass different types of information.</p> + + +<h2>Setting Display Preferences</h2> + +<p>There are seven preferences you can set to control various aspects of the calendar. Preferences are set by passing an +array of preferences in the second parameter of the loading function. Here is an example:</p> + + +<code> +$prefs = array (<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'start_day'&nbsp;&nbsp;&nbsp; => 'saturday',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'month_type'&nbsp;&nbsp; => 'long',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'day_type'&nbsp;&nbsp;&nbsp;&nbsp; => 'short'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +$this->load->library('calendar', $prefs);<br /> +<br /> +echo $this->calendar->generate();</code> + +<p>The above code would start the calendar on saturday, use the "long" month heading, and the "short" day names. More information +regarding preferences below.</p> + + + + +<table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder"> +<tr> +<th>Preference</th> +<th>Default&nbsp;Value</th> +<th>Options</th> +<th>Description</th> +</tr><tr> +<td class="td"><strong>template</strong></td><td class="td">None</td><td class="td">None</td><td class="td">A string containing your calendar template. See the template section below.</td> +</tr><tr> +<td class="td"><strong>local_time</strong></td><td class="td">time()</td><td class="td">None</td><td class="td">A Unix timestamp corresponding to the current time.</td> +</tr><tr> +<td class="td"><strong>start_day</strong></td><td class="td">sunday</td><td class="td">Any week day (sunday, monday, tuesday, etc.)</td><td class="td">Sets the day of the week the calendar should start on.</td> +</tr><tr> +<td class="td"><strong>month_type</strong></td><td class="td">long</td><td class="td">long, short</td><td class="td">Determines what version of the month name to use in the header. long = January, short = Jan.</td> +</tr><tr> +<td class="td"><strong>day_type</strong></td><td class="td">abr</td><td class="td">long, short, abr</td><td class="td">Determines what version of the weekday names to use in the column headers. long = Sunday, short = Sun, abr = Su.</td> +</tr><tr> +<td class="td"><strong>show_next_prev</strong></td><td class="td">FALSE</td><td class="td">TRUE/FALSE (boolean)</td><td class="td">Determines whether to display links allowing you to toggle to next/previous months. See information on this feature below.</td> +</tr><tr> +<td class="td"><strong>next_prev_url</strong></td><td class="td">None</td><td class="td">A URL</td><td class="td">Sets the basepath used in the next/previous calendar links.</td> +</tr> +</table> + + + +<h2>Showing Next/Previous Month Links</h2> + +<p>To allow your calendar to dynamically increment/decrement via the next/previous links requires that you set up your calendar +code similar to this example:</p> + + +<code>$prefs = array (<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'show_next_prev'&nbsp;&nbsp;=> TRUE,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'next_prev_url'&nbsp;&nbsp; => 'http://example.com/index.php/calendar/show/'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +$this-&gt;load-&gt;library('calendar', $prefs);<br /> +<br /> +echo $this->calendar->generate(<var>$this->uri->segment(3)</var>, <var>$this->uri->segment(4)</var>);</code> + +<p>You'll notice a few things about the above example:</p> + +<ul> +<li>You must set the "show_next_prev" to TRUE.</li> +<li>You must supply the URL to the controller containing your calendar in the "next_prev_url" preference.</li> +<li>You must supply the "year" and "month" to the calendar generating function via the URI segments where they appear (Note: The calendar class automatically adds the year/month to the base URL you provide.).</li> +</ul> + + + +<h2>Creating a Calendar Template</h2> + +<p>By creating a calendar template you have 100% control over the design of your calendar. Each component of your +calendar will be placed within a pair of pseudo-variables as shown here:</p> + + +<code> +$prefs['template'] = '<br /><br /> +&nbsp;&nbsp;&nbsp;<dfn>{table_open}</dfn><var>&lt;table border="0" cellpadding="0" cellspacing="0"></var><dfn>{/table_open}</dfn><br /> +<br /> +&nbsp;&nbsp;&nbsp;<dfn>{heading_row_start}</dfn><var>&lt;tr></var><dfn>{/heading_row_start}</dfn><br /> +<br /> +&nbsp;&nbsp;&nbsp;<dfn>{heading_previous_cell}</dfn><var>&lt;th>&lt;a href="</var><kbd>{previous_url}</kbd><var>">&amp;lt;&amp;lt;&lt;/a>&lt;/th></var><dfn>{/heading_previous_cell}</dfn><br /> +&nbsp;&nbsp;&nbsp;<dfn>{heading_title_cell}</dfn><var>&lt;th colspan="</var><kbd>{colspan}</kbd><var>"></var><kbd>{heading}</kbd><var>&lt;/th></var><dfn>{/heading_title_cell}</dfn><br /> +&nbsp;&nbsp;&nbsp;<dfn>{heading_next_cell}</dfn><var>&lt;th>&lt;a href="</var><kbd>{next_url}</kbd><var>">&amp;gt;&amp;gt;&lt;/a>&lt;/th></var><dfn>{/heading_next_cell}</dfn><br /> +<br /> +&nbsp;&nbsp;&nbsp;<dfn>{heading_row_end}</dfn><var>&lt;/tr></var><dfn>{/heading_row_end}</dfn><br /> +<br /> +&nbsp;&nbsp;&nbsp;<dfn>{week_row_start}</dfn><var>&lt;tr></var><dfn>{/week_row_start}</dfn><br /> +&nbsp;&nbsp;&nbsp;<dfn>{week_day_cell}</dfn><var>&lt;td></var><dfn>{week_day}</dfn><var>&lt;/td></var><dfn>{/week_day_cell}</dfn><br /> +&nbsp;&nbsp;&nbsp;<dfn>{week_row_end}</dfn><var>&lt;/tr></var><dfn>{/week_row_end}</dfn><br /> +<br /> +&nbsp;&nbsp;&nbsp;<dfn>{cal_row_start}</dfn><var>&lt;tr></var><dfn>{/cal_row_start}</dfn><br /> +&nbsp;&nbsp;&nbsp;<dfn>{cal_cell_start}</dfn><var>&lt;td></var><dfn>{/cal_cell_start}</dfn><br /> +<br /> +&nbsp;&nbsp;&nbsp;<dfn>{cal_cell_content}</dfn><var>&lt;a href="</var><kbd>{content}</kbd><var>"></var><kbd>{day}</kbd><var>&lt;/a></var><dfn>{/cal_cell_content}</dfn><br /> +&nbsp;&nbsp;&nbsp;<dfn>{cal_cell_content_today}</dfn><var>&lt;div class="highlight">&lt;a href="</var><kbd>{content}</kbd><var>"></var><kbd>{day}</kbd><var>&lt;/a>&lt;/div></var><dfn>{/cal_cell_content_today}</dfn><br /> +<br /> +&nbsp;&nbsp;&nbsp;<dfn>{cal_cell_no_content}</dfn><var></var><kbd>{day}</kbd><var></var><dfn>{/cal_cell_no_content}</dfn><br /> +&nbsp;&nbsp;&nbsp;<dfn>{cal_cell_no_content_today}</dfn><var>&lt;div class="highlight"></var><kbd>{day}</kbd><var>&lt;/div></var><dfn>{/cal_cell_no_content_today}</dfn><br /> +<br /> +&nbsp;&nbsp;&nbsp;<dfn>{cal_cell_blank}</dfn><var>&amp;nbsp;</var><dfn>{/cal_cell_blank}</dfn><br /> +<br /> +&nbsp;&nbsp;&nbsp;<dfn>{cal_cell_end}</dfn><var>&lt;/td></var><dfn>{/cal_cell_end}</dfn><br /> +&nbsp;&nbsp;&nbsp;<dfn>{cal_row_end}</dfn><var>&lt;/tr></var><dfn>{/cal_row_end}</dfn><br /> +<br /> +&nbsp;&nbsp;&nbsp;<dfn>{table_close}</dfn><var>&lt;/table></var><dfn>{/table_close}</dfn><br /> +';<br /> +<br /> +$this->load->library('calendar', $prefs);<br /> +<br /> +echo $this->calendar->generate();</code> + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="benchmark.html">Benchmark Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="cart.html">Cart Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/cart.html b/user_guide/libraries/cart.html new file mode 100644 index 0000000..2f3983a --- /dev/null +++ b/user_guide/libraries/cart.html @@ -0,0 +1,346 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Shopping Cart Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Shopping Cart Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Shopping Cart Class</h1> + +<p>The Cart Class permits items to be added to a session that stays active while a user is browsing your site. +These items can be retrieved and displayed in a standard "shopping cart" format, allowing the user to update the quantity or remove items from the cart.</p> + +<p>Please note that the Cart Class ONLY provides the core "cart" functionality. It does not provide shipping, credit card authorization, or other processing components.</p> + + +<h2>Initializing the Shopping Cart Class</h2> + +<p><strong>Important:</strong> The Cart class utilizes CodeIgniter's +<a href="sessions.html">Session Class</a> to save the cart information to a database, so before using the Cart class you must set up a database table +as indicated in the <a href="sessions.html">Session Documentation</a> , and set the session preferences in your <kbd>application/config/config.php</kbd> file to utilize a database.</p> + +<p>To initialize the Shopping Cart Class in your controller constructor, use the <dfn>$this->load->library</dfn> function:</p> + +<code>$this->load->library('cart');</code> +<p>Once loaded, the Cart object will be available using: <dfn>$this->cart</dfn></p> + +<p class="important"><strong>Note:</strong> The Cart Class will load and initialize the Session Class automatically, so unless you are using sessions elsewhere in your application, you do not need to load the Session class.</p> + +<h2>Adding an Item to The Cart</h2> + +<p>To add an item to the shopping cart, simply pass an array with the product information to the <dfn>$this->cart->insert()</dfn> function, as shown below:</p> + +<code> +$data = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'id'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; => 'sku_123ABC',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'qty'&nbsp;&nbsp;&nbsp;&nbsp; => 1,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'price'&nbsp;&nbsp; => 39.95,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name'&nbsp;&nbsp;&nbsp; => 'T-Shirt',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'options' => array('Size' => 'L', 'Color' => 'Red')<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> + +$this->cart->insert($data); + +</code> + +<p class="important"><strong>Important:</strong> The first four array indexes above (<dfn>id</dfn>, <dfn>qty</dfn>, <dfn>price</dfn>, and <dfn>name</dfn>) are <strong>required</strong>. +If you omit any of them the data will not be saved to the cart. The fifth index (<dfn>options</dfn>) is optional. +It is intended to be used in cases where your product has options associated with it. Use an array for options, as shown above.</p> + +<p>The five reserved indexes are:</p> + +<ul> +<li><strong>id</strong> - Each product in your store must have a unique identifier. Typically this will be an "sku" or other such identifier.</li> +<li><strong>qty</strong> - The quantity being purchased. +<li><strong>price</strong> - The price of the item. +<li><strong>name</strong> - The name of the item. +<li><strong>options</strong> - Any additional attributes that are needed to identify the product. These must be passed via an array. +</ul> + +<p>In addition to the five indexes above, there are two reserved words: <dfn>rowid</dfn> and <dfn>subtotal</dfn>. These are used internally by the Cart class, so +please do NOT use those words as index names when inserting data into the cart.</p> + +<p>Your array may contain additional data. Anything you include in your array will be stored in the session. However, it is best to standardize your data among all your products in order to make displaying the information in a table easier.</p> + +<p>The insert() method will return the $rowid if you successfully insert a single item.</p> + + +<h2>Adding Multiple Items to The Cart</h2> + +<p>By using a multi-dimensional array, as shown below, it is possible to add multiple products to the cart in one action. This is useful in cases where you wish to allow people to select from among several items on the same page.</p> + + +<code> +$data = array(<br /> + +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'id'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; => 'sku_123ABC',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'qty'&nbsp;&nbsp;&nbsp;&nbsp; => 1,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'price'&nbsp;&nbsp; => 39.95,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name'&nbsp;&nbsp;&nbsp; => 'T-Shirt',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'options' => array('Size' => 'L', 'Color' => 'Red')<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> + +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'id'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; => 'sku_567ZYX',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'qty'&nbsp;&nbsp;&nbsp;&nbsp; => 1,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'price'&nbsp;&nbsp; => 9.95,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name'&nbsp;&nbsp;&nbsp; => 'Coffee Mug'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> + +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'id'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; => 'sku_965QRS',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'qty'&nbsp;&nbsp;&nbsp;&nbsp; => 1,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'price'&nbsp;&nbsp; => 29.95,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name'&nbsp;&nbsp;&nbsp; => 'Shot Glass'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br /> + +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> + +$this->cart->insert($data); + +</code> + + + + +<h2>Displaying the Cart</h2> + +<p>To display the cart you will create a <a href="../general/views.html">view file</a> with code similar to the one shown below.</p> + +<p>Please note that this example uses the <a href="../helpers/form_helper.html">form helper</a>.</p> + + +<textarea class="textarea" style="width:100%" cols="50" rows="55"> +&lt;?php echo form_open('path/to/controller/update/function'); ?> + +&lt;table cellpadding="6" cellspacing="1" style="width:100%" border="0"> + +&lt;tr> + &lt;th>QTY&lt;/th> + &lt;th>Item Description&lt;/th> + &lt;th style="text-align:right">Item Price&lt;/th> + &lt;th style="text-align:right">Sub-Total&lt;/th> +&lt;/tr> + +&lt;?php $i = 1; ?> + +&lt;?php foreach ($this->cart->contents() as $items): ?> + + &lt;?php echo form_hidden($i.'[rowid]', $items['rowid']); ?> + + &lt;tr> + &lt;td>&lt;?php echo form_input(array('name' => $i.'[qty]', 'value' => $items['qty'], 'maxlength' => '3', 'size' => '5')); ?>&lt;/td> + &lt;td> + &lt;?php echo $items['name']; ?> + + &lt;?php if ($this->cart->has_options($items['rowid']) == TRUE): ?> + + &lt;p> + &lt;?php foreach ($this->cart->product_options($items['rowid']) as $option_name => $option_value): ?> + + &lt;strong>&lt;?php echo $option_name; ?>:&lt;/strong> &lt;?php echo $option_value; ?>&lt;br /> + + &lt;?php endforeach; ?> + &lt;/p> + + &lt;?php endif; ?> + + &lt;/td> + &lt;td style="text-align:right">&lt;?php echo $this->cart->format_number($items['price']); ?>&lt;/td> + &lt;td style="text-align:right">$&lt;?php echo $this->cart->format_number($items['subtotal']); ?>&lt;/td> + &lt;/tr> + +&lt;?php $i++; ?> + +&lt;?php endforeach; ?> + +&lt;tr> + &lt;td colspan="2">&nbsp;&lt;/td> + &lt;td class="right">&lt;strong>Total&lt;/strong>&lt;/td> + &lt;td class="right">$&lt;?php echo $this->cart->format_number($this->cart->total()); ?>&lt;/td> +&lt;/tr> + +&lt;/table> + +&lt;p>&lt;?php echo form_submit('', 'Update your Cart'); ?>&lt;/p> +</textarea> + + + + +<h2>Updating The Cart</h2> + +<p>To update the information in your cart, you must pass an array containing the <kbd>Row ID</kbd> and quantity to the <dfn>$this->cart->update()</dfn> function:</p> + +<p class="important"><strong>Note:</strong> If the quantity is set to zero, the item will be removed from the cart.</p> + +<code> +$data = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rowid' => 'b99ccdf16028f015540f341130b6d8ec',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'qty'&nbsp;&nbsp; => 3<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> + +$this->cart->update($data); +<br /><br /> +// Or a multi-dimensional array<br /><br /> +$data = array(<br /> + +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rowid'&nbsp;&nbsp; => 'b99ccdf16028f015540f341130b6d8ec',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'qty'&nbsp;&nbsp;&nbsp;&nbsp; => 3<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> + +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rowid'&nbsp;&nbsp; => 'xw82g9q3r495893iajdh473990rikw23',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'qty'&nbsp;&nbsp;&nbsp;&nbsp; => 4<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> + +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rowid'&nbsp;&nbsp; => 'fh4kdkkkaoe30njgoe92rkdkkobec333',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'qty'&nbsp;&nbsp;&nbsp;&nbsp; => 2<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br /> + +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> + +$this->cart->update($data); + + + + +</code> + +<p><strong>What is a Row ID?</strong>&nbsp; The <kbd>row ID</kbd> is a unique identifier that is generated by the cart code when an item is added to the cart. The reason a +unique ID is created is so that identical products with different options can be managed by the cart.</p> + +<p>For example, let's say someone buys two identical t-shirts (same product ID), but in different sizes. The product ID (and other attributes) will be +identical for both sizes because it's the same shirt. The only difference will be the size. The cart must therefore have a means of identifying this +difference so that the two sizes of shirts can be managed independently. It does so by creating a unique "row ID" based on the product ID and any options associated with it.</p> + +<p>In nearly all cases, updating the cart will be something the user does via the "view cart" page, so as a developer, it is unlikely that you will ever have to concern yourself +with the "row ID", other then making sure your "view cart" page contains this information in a hidden form field, and making sure it gets passed to the update +function when the update form is submitted. Please examine the construction of the "view cart" page above for more information.</p> + + + +<p>&nbsp;<br /></p> + + +<h1>Function Reference</h1> + +<h2>$this->cart->insert();</h2> + +<p>Permits you to add items to the shopping cart, as outlined above.</p> + + +<h2>$this->cart->update();</h2> + +<p>Permits you to update items in the shopping cart, as outlined above.</p> + + +<h2>$this->cart->total();</h2> + +<p>Displays the total amount in the cart.</p> + + +<h2>$this->cart->total_items();</h2> + +<p>Displays the total number of items in the cart.</p> + + +<h2>$this->cart->contents();</h2> + +<p>Returns an array containing everything in the cart.</p> + + + +<h2>$this->cart->has_options(rowid);</h2> + +<p>Returns TRUE (boolean) if a particular row in the cart contains options. This function is designed to be used in a loop with <dfn>$this->cart->contents()</dfn>, since you must pass the <kbd>rowid</kbd> to this function, as shown in the <dfn>Displaying the Cart</dfn> example above.</p> + + +<h2>$this->cart->product_options(rowid);</h2> + +<p>Returns an array of options for a particular product. This function is designed to be used in a loop with <dfn>$this->cart->contents()</dfn>, since you must pass the <kbd>rowid</kbd> to this function, as shown in the <dfn>Displaying the Cart</dfn> example above.</p> + + + +<h2>$this->cart->destroy();</h2> + +<p>Permits you to destroy the cart. This function will likely be called when you are finished processing the customer's order.</p> + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="calendar.html">Calendar Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="config.html">Config Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/config.html b/user_guide/libraries/config.html new file mode 100644 index 0000000..93fbe31 --- /dev/null +++ b/user_guide/libraries/config.html @@ -0,0 +1,222 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Config Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Config Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Config Class</h1> + +<p>The Config class provides a means to retrieve configuration preferences. These preferences can +come from the default config file (<samp>application/config/config.php</samp>) or from your own custom config files.</p> + +<p class="important"><strong>Note:</strong> This class is initialized automatically by the system so there is no need to do it manually.</p> + + +<h2>Anatomy of a Config File</h2> + +<p>By default, CodeIgniter has one primary config file, located at <samp>application/config/config.php</samp>. If you open the file using +your text editor you'll see that config items are stored in an array called <var>$config</var>.</p> + +<p>You can add your own config items to +this file, or if you prefer to keep your configuration items separate (assuming you even need config items), +simply create your own file and save it in <dfn>config</dfn> folder.</p> + +<p><strong>Note:</strong> If you do create your own config files use the same format as the primary one, storing your items in +an array called <var>$config</var>. CodeIgniter will intelligently manage these files so there will be no conflict even though +the array has the same name (assuming an array index is not named the same as another).</p> + +<h2>Loading a Config File</h2> + +<p><strong>Note:</strong> CodeIgniter automatically loads the primary config file (<samp>application/config/config.php</samp>), +so you will only need to load a config file if you have created your own.</p> + +<p>There are two ways to load a config file:</p> + +<ol><li><strong>Manual Loading</strong> + +<p>To load one of your custom config files you will use the following function within the <a href="../general/controllers.html">controller</a> that needs it:</p> + +<code>$this->config->load('<var>filename</var>');</code> + +<p>Where <var>filename</var> is the name of your config file, without the .php file extension.</p> + +<p>If you need to load multiple config files normally they will be merged into one master config array. Name collisions can occur, however, if +you have identically named array indexes in different config files. To avoid collisions you can set the second parameter to <kbd>TRUE</kbd> +and each config file will be stored in an array index corresponding to the name of the config file. Example:</p> + +<code> +// Stored in an array with this prototype: $this->config['blog_settings'] = $config<br /> +$this->config->load('<var>blog_settings</var>', <kbd>TRUE</kbd>);</code> + +<p>Please see the section entitled <dfn>Fetching Config Items</dfn> below to learn how to retrieve config items set this way.</p> + +<p>The third parameter allows you to suppress errors in the event that a config file does not exist:</p> + +<code>$this->config->load('<var>blog_settings</var>', <dfn>FALSE</dfn>, <kbd>TRUE</kbd>);</code> + +</li> +<li><strong>Auto-loading</strong> + +<p>If you find that you need a particular config file globally, you can have it loaded automatically by the system. To do this, +open the <strong>autoload.php</strong> file, located at <samp>application/config/autoload.php</samp>, and add your config file as +indicated in the file.</p> +</li> +</ol> + + +<h2>Fetching Config Items</h2> + +<p>To retrieve an item from your config file, use the following function:</p> + +<code>$this->config->item('<var>item name</var>');</code> + +<p>Where <var>item name</var> is the $config array index you want to retrieve. For example, to fetch your language choice you'll do this:</p> + +<code>$lang = $this->config->item('language');</code> + +<p>The function returns FALSE (boolean) if the item you are trying to fetch does not exist.</p> + +<p>If you are using the second parameter of the <kbd>$this->config->load</kbd> function in order to assign your config items to a specific index +you can retrieve it by specifying the index name in the second parameter of the <kbd>$this->config->item()</kbd> function. Example:</p> + +<code> +// Loads a config file named blog_settings.php and assigns it to an index named "blog_settings"<br /> +$this->config->load('<var>blog_settings</var>', <kbd>TRUE</kbd>);<br /><br /> + +// Retrieve a config item named site_name contained within the blog_settings array<br /> +$site_name = $this->config->item('<dfn>site_name</dfn>', '<var>blog_settings</var>');<br /><br /> + +// An alternate way to specify the same item:<br /> +$blog_config = $this->config->item('<var>blog_settings</var>');<br /> +$site_name = $blog_config['site_name'];</code> + +<h2>Setting a Config Item</h2> + +<p>If you would like to dynamically set a config item or change an existing one, you can do so using:</p> + +<code>$this->config->set_item('<var>item_name</var>', '<var>item_value</var>');</code> + +<p>Where <var>item_name</var> is the $config array index you want to change, and <var>item_value</var> is its value.</p> + +<a name="environments"></a> +<h2>Environments</h2> + +<p> + You may load different configuration files depending on the current environment. + The <kbd>ENVIRONMENT</kbd> constant is defined in index.php, and is described + in detail in the <a href="../general/environments.html">Handling Environments</a> + section. +</p> + +<p> + To create an environment-specific configuration file, + create or copy a configuration file in application/config/{ENVIRONMENT}/{FILENAME}.php +</p> + +<p>For example, to create a production-only config.php, you would:</p> + +<ol> + <li>Create the directory application/config/production/</li> + <li>Copy your existing config.php into the above directory</li> + <li>Edit application/config/production/config.php so it contains your production settings</li> +</ol> + +<p> + When you set the <kbd>ENVIRONMENT</kbd> constant to 'production', the settings + for your new production-only config.php will be loaded. +</p> + +<p>You can place the following configuration files in environment-specific folders:</p> + +<ul> +<li>Default CodeIgniter configuration files</li> +<li>Your own custom configuration files</li> +</ul> + +<p><strong>Note:</strong> CodeIgniter always tries to load the configuration files for the current environment first. If the file does not exist, the global config file (i.e., the one in <samp>application/config/</samp>) is loaded. This means you are not obligated to place <strong>all</strong> of your configuration files in an environment folder &minus; only the files that change per environment.</p> + +<h2>Helper Functions</h2> + +<p>The config class has the following helper functions:</p> + +<h2>$this->config->site_url();</h2> +<p>This function retrieves the URL to your site, along with the "index" value you've specified in the config file.</p> + +<h2>$this->config->base_url();</h2> +<p>This function retrieves the URL to your site, plus an optional path such as to a stylesheet or image.</p> + +<p>The two functions above are normally accessed via the corresponding functions in the <a href="../helpers/url_helper.html">URL Helper.</a></p> + +<h2>$this->config->system_url();</h2> +<p>This function retrieves the URL to your <dfn>system folder</dfn>.</p> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="calendar.html">Calendaring Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="../database/index.html">Database Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/email.html b/user_guide/libraries/email.html new file mode 100644 index 0000000..e75e69c --- /dev/null +++ b/user_guide/libraries/email.html @@ -0,0 +1,307 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Email Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Email Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Email Class</h1> + +<p>CodeIgniter's robust Email Class supports the following features:</p> + + +<ul> +<li>Multiple Protocols: Mail, Sendmail, and SMTP</li> +<li>Multiple recipients</li> +<li>CC and BCCs</li> +<li>HTML or Plaintext email</li> +<li>Attachments</li> +<li>Word wrapping</li> +<li>Priorities</li> +<li>BCC Batch Mode, enabling large email lists to be broken into small BCC batches.</li> +<li>Email Debugging tools</li> +</ul> + + +<h2>Sending Email</h2> + +<p>Sending email is not only simple, but you can configure it on the fly or set your preferences in a config file.</p> + +<p>Here is a basic example demonstrating how you might send email. Note: This example assumes you are sending the email from one of your +<a href="../general/controllers.html">controllers</a>.</p> + +<code>$this->load->library('email');<br /> +<br /> +$this->email->from('your@example.com', 'Your Name');<br /> +$this->email->to('someone@example.com'); <br /> +$this->email->cc('another@another-example.com'); <br /> +$this->email->bcc('them@their-example.com'); <br /> +<br /> +$this->email->subject('Email Test');<br /> +$this->email->message('Testing the email class.'); <br /> +<br /> +$this->email->send();<br /> +<br /> +echo $this->email->print_debugger();</code> + + + + +<h2>Setting Email Preferences</h2> + +<p>There are 17 different preferences available to tailor how your email messages are sent. You can either set them manually +as described here, or automatically via preferences stored in your config file, described below:</p> + +<p>Preferences are set by passing an array of preference values to the email <dfn>initialize</dfn> function. Here is an example of how you might set some preferences:</p> + +<code>$config['protocol'] = 'sendmail';<br /> +$config['mailpath'] = '/usr/sbin/sendmail';<br /> +$config['charset'] = 'iso-8859-1';<br /> +$config['wordwrap'] = TRUE;<br /> +<br /> +$this->email->initialize($config);</code> + +<p><strong>Note:</strong> Most of the preferences have default values that will be used if you do not set them.</p + +><h3>Setting Email Preferences in a Config File</h3> + +<p>If you prefer not to set preferences using the above method, you can instead put them into a config file. +Simply create a new file called the <var>email.php</var>, add the <var>$config</var> +array in that file. Then save the file at <var>config/email.php</var> and it will be used automatically. You +will NOT need to use the <dfn>$this->email->initialize()</dfn> function if you save your preferences in a config file.</p> + + + + +<h2>Email Preferences</h2> + +<p>The following is a list of all the preferences that can be set when sending email.</p> + + +<table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder"> +<tr> +<th>Preference</th> +<th>Default&nbsp;Value</th> +<th>Options</th> +<th>Description</th> +</tr><tr> +<td class="td"><strong>useragent</strong></td><td class="td">CodeIgniter</td><td class="td">None</td><td class="td">The "user agent".</td> +</tr><tr> +<td class="td"><strong>protocol</strong></td><td class="td">mail</td><td class="td">mail, sendmail, or smtp</td><td class="td">The mail sending protocol.</td> +</tr><tr> +<td class="td"><strong>mailpath</strong></td><td class="td">/usr/sbin/sendmail</td><td class="td">None</td><td class="td">The server path to Sendmail.</td> +</tr><tr> +<td class="td"><strong>smtp_host</strong></td><td class="td">No Default</td><td class="td">None</td><td class="td">SMTP Server Address.</td> +</tr><tr> +<td class="td"><strong>smtp_user</strong></td><td class="td">No Default</td><td class="td">None</td><td class="td">SMTP Username.</td> +</tr><tr> +<td class="td"><strong>smtp_pass</strong></td><td class="td">No Default</td><td class="td">None</td><td class="td">SMTP Password.</td> +</tr><tr> +<td class="td"><strong>smtp_port</strong></td><td class="td">25</td><td class="td">None</td><td class="td">SMTP Port.</td> +</tr><tr> +<td class="td"><strong>smtp_timeout</strong></td><td class="td">5</td><td class="td">None</td><td class="td">SMTP Timeout (in seconds).</td> +</tr><tr> +<td class="td"><strong>wordwrap</strong></td><td class="td">TRUE</td><td class="td">TRUE or FALSE (boolean)</td><td class="td">Enable word-wrap.</td> +</tr><tr> +<td class="td"><strong>wrapchars</strong></td><td class="td">76</td><td class="td"> </td><td class="td">Character count to wrap at.</td> +</tr><tr> +<td class="td"><strong>mailtype</strong></td><td class="td">text</td><td class="td">text or html</td><td class="td">Type of mail. If you send HTML email you must send it as a complete web page. Make sure you don't have any relative links or relative image paths otherwise they will not work.</td> +</tr><tr> +<td class="td"><strong>charset</strong></td><td class="td">utf-8</td><td class="td"></td><td class="td">Character set (utf-8, iso-8859-1, etc.).</td> +</tr><tr> +<td class="td"><strong>validate</strong></td><td class="td">FALSE</td><td class="td">TRUE or FALSE (boolean)</td><td class="td">Whether to validate the email address.</td> +</tr><tr> +<td class="td"><strong>priority</strong></td><td class="td">3</td><td class="td">1, 2, 3, 4, 5</td><td class="td">Email Priority. 1 = highest. 5 = lowest. 3 = normal.</td> +</tr> +<tr> + <td class="td"><strong>crlf</strong></td> + <td class="td">\n</td> + <td class="td">&quot;\r\n&quot; or &quot;\n&quot; or &quot;\r&quot;</td> + <td class="td">Newline character. (Use &quot;\r\n&quot; to comply with RFC 822).</td> +</tr> +<tr> +<td class="td"><strong>newline</strong></td><td class="td">\n</td> +<td class="td">"\r\n" or "\n" or &quot;\r&quot;</td><td class="td">Newline character. (Use "\r\n" to comply with RFC 822).</td> +</tr><tr> +<td class="td"><strong>bcc_batch_mode</strong></td><td class="td">FALSE</td><td class="td">TRUE or FALSE (boolean)</td><td class="td">Enable BCC Batch Mode.</td> +</tr><tr> +<td class="td"><strong>bcc_batch_size</strong></td><td class="td">200</td><td class="td">None</td><td class="td">Number of emails in each BCC batch.</td> +</tr> +</table> + + +<h2>Email Function Reference</h2> + +<h3>$this->email->from()</h3> +<p>Sets the email address and name of the person sending the email:</p> +<code>$this->email->from('<var>you@example.com</var>', '<var>Your Name</var>');</code> + +<h3>$this->email->reply_to()</h3> +<p>Sets the reply-to address. If the information is not provided the information in the "from" function is used. Example:</p> +<code>$this->email->reply_to('<var>you@example.com</var>', '<var>Your Name</var>');</code> + + +<h3>$this->email->to()</h3> +<p>Sets the email address(s) of the recipient(s). Can be a single email, a comma-delimited list or an array:</p> + +<code>$this->email->to('<var>someone@example.com</var>');</code> +<code>$this->email->to('<var>one@example.com</var>, <var>two@example.com</var>, <var>three@example.com</var>');</code> + +<code>$list = array('<var>one@example.com</var>', '<var>two@example.com</var>', '<var>three@example.com</var>');<br /> +<br /> +$this->email->to(<var>$list</var>);</code> + +<h3>$this->email->cc()</h3> +<p>Sets the CC email address(s). Just like the "to", can be a single email, a comma-delimited list or an array.</p> + +<h3>$this->email->bcc()</h3> +<p>Sets the BCC email address(s). Just like the "to", can be a single email, a comma-delimited list or an array.</p> + + +<h3>$this->email->subject()</h3> +<p>Sets the email subject:</p> +<code>$this->email->subject('<var>This is my subject</var>');</code> + +<h3>$this->email->message()</h3> +<p>Sets the email message body:</p> +<code>$this->email->message('<var>This is my message</var>');</code> + +<h3>$this->email->set_alt_message()</h3> +<p>Sets the alternative email message body:</p> +<code>$this->email->set_alt_message('<var>This is the alternative message</var>');</code> + +<p>This is an optional message string which can be used if you send HTML formatted email. It lets you specify an alternative +message with no HTML formatting which is added to the header string for people who do not accept HTML email. +If you do not set your own message CodeIgniter will extract the message from your HTML email and strip the tags.</p> + + + +<h3>$this->email->clear()</h3> +<p>Initializes all the email variables to an empty state. This function is intended for use if you run the email sending function +in a loop, permitting the data to be reset between cycles.</p> +<code>foreach ($list as $name => $address)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$this->email->clear();<br /><br /> + +&nbsp;&nbsp;&nbsp;&nbsp;$this->email->to($address);<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$this->email->from('your@example.com');<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$this->email->subject('Here is your info '.$name);<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$this->email->message('Hi '.$name.' Here is the info you requested.');<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$this->email->send();<br /> +}</code> + +<p>If you set the parameter to TRUE any attachments will be cleared as well:</p> + +<code>$this->email->clear(TRUE);</code> + + +<h3>$this->email->send()</h3> +<p>The Email sending function. Returns boolean TRUE or FALSE based on success or failure, enabling it to be used +conditionally:</p> + +<code>if ( ! $this->email->send())<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;// Generate error<br /> +}</code> + + +<h3>$this->email->attach()</h3> +<p>Enables you to send an attachment. Put the file path/name in the first parameter. Note: Use a file path, not a URL. +For multiple attachments use the function multiple times. For example:</p> + +<code>$this->email->attach('/path/to/photo1.jpg');<br /> +$this->email->attach('/path/to/photo2.jpg');<br /> +$this->email->attach('/path/to/photo3.jpg');<br /> +<br /> +$this->email->send();</code> + + +<h3>$this->email->print_debugger()</h3> +<p>Returns a string containing any server messages, the email headers, and the email messsage. Useful for debugging.</p> + + +<h2>Overriding Word Wrapping</h2> + +<p>If you have word wrapping enabled (recommended to comply with RFC 822) and you have a very long link in your email it can +get wrapped too, causing it to become un-clickable by the person receiving it. CodeIgniter lets you manually override +word wrapping within part of your message like this:</p> + +<code>The text of your email that<br /> +gets wrapped normally.<br /> +<br /> +<var>{unwrap}</var>http://example.com/a_long_link_that_should_not_be_wrapped.html<var>{/unwrap}</var><br /> +<br /> +More text that will be<br /> +wrapped normally.</code> + +<p>Place the item you do not want word-wrapped between: <var>{unwrap}</var> <var>{/unwrap}</var></p> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="../database/index.html">Database Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="encryption.html">Encryption Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/encryption.html b/user_guide/libraries/encryption.html new file mode 100644 index 0000000..e7b159c --- /dev/null +++ b/user_guide/libraries/encryption.html @@ -0,0 +1,221 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Encryption Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Encryption Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Encryption Class</h1> + +<p>The Encryption Class provides two-way data encryption. It is encrypted using +the Mcrypt library. The Encryption Class requires the Mcrypt extension to run.</p> + + +<h2>Setting your Key</h2> + +<p>A <em>key</em> is a piece of information that controls the cryptographic process and permits an encrypted string to be decoded. +In fact, the key you chose will provide the <strong>only</strong> means to decode data that was encrypted with that key, +so not only must you choose the key carefully, you must never change it if you intend use it for persistent data.</p> + +<p>It goes without saying that you should guard your key carefully. +Should someone gain access to your key, the data will be easily decoded. If your server is not totally under your control +it's impossible to ensure key security so you may want to think carefully before using it for anything +that requires high security, like storing credit card numbers.</p> + +<p>To take maximum advantage of the encryption algorithm, your key should be 32 characters in length (128 bits). +The key should be as random a string as you can concoct, with numbers and uppercase and lowercase letters. +Your key should <strong>not</strong> be a simple text string. In order to be cryptographically secure it +needs to be as random as possible.</p> + +<p>Your key can be either stored in your <dfn>application/config/config.php</dfn>, or you can design your own +storage mechanism and pass the key dynamically when encoding/decoding.</p> + +<p>To save your key to your <dfn>application/config/config.php</dfn>, open the file and set:</p> +<code>$config['encryption_key'] = "YOUR KEY";</code> + + +<h2>Message Length</h2> + +<p>It's important for you to know that the encoded messages the encryption function generates will be approximately 2.6 times longer than the original +message. For example, if you encrypt the string "my super secret data", which is 21 characters in length, you'll end up +with an encoded string that is roughly 55 characters (we say "roughly" because the encoded string length increments in +64 bit clusters, so it's not exactly linear). Keep this information in mind when selecting your data storage mechanism. Cookies, +for example, can only hold 4K of information.</p> + + +<h2>Initializing the Class</h2> + +<p>Like most other classes in CodeIgniter, the Encryption class is initialized in your controller using the <dfn>$this->load->library</dfn> function:</p> + +<code>$this->load->library('encrypt');</code> +<p>Once loaded, the Encrypt library object will be available using: <dfn>$this->encrypt</dfn></p> + + +<h2>$this->encrypt->encode()</h2> + +<p>Performs the data encryption and returns it as a string. Example:</p> +<code> +$msg = 'My secret message';<br /> +<br /> +$encrypted_string = $this->encrypt->encode($msg);</code> + +<p>You can optionally pass your encryption key via the second parameter if you don't want to use the one in your config file:</p> + +<code> +$msg = 'My secret message';<br /> +$key = 'super-secret-key';<br /> +<br /> +$encrypted_string = $this->encrypt->encode($msg, $key);</code> + + +<h2>$this->encrypt->decode()</h2> + +<p>Decrypts an encoded string. Example:</p> + +<code> +$encrypted_string = 'APANtByIGI1BpVXZTJgcsAG8GZl8pdwwa84';<br /> +<br /> +$plaintext_string = $this->encrypt->decode($encrypted_string);</code> + +<p>You can optionally pass your encryption key via the second parameter if you don't want to use the one in your config file:</p> + +<code> +$msg = 'My secret message';<br /> +$key = 'super-secret-key';<br /> +<br /> +$encrypted_string = $this->encrypt->decode($msg, $key);</code> + + +<h2>$this->encrypt->set_cipher();</h2> + +<p>Permits you to set an Mcrypt cipher. By default it uses <samp>MCRYPT_RIJNDAEL_256</samp>. Example:</p> +<code>$this->encrypt->set_cipher(MCRYPT_BLOWFISH);</code> +<p>Please visit php.net for a list of <a href="http://php.net/mcrypt">available ciphers</a>.</p> + +<p>If you'd like to manually test whether your server supports Mcrypt you can use:</p> +<code>echo ( ! function_exists('mcrypt_encrypt')) ? 'Nope' : 'Yup';</code> + + +<h2>$this->encrypt->set_mode();</h2> + +<p>Permits you to set an Mcrypt mode. By default it uses <samp>MCRYPT_MODE_CBC</samp>. Example:</p> +<code>$this->encrypt->set_mode(MCRYPT_MODE_CFB);</code> +<p>Please visit php.net for a list of <a href="http://php.net/mcrypt">available modes</a>.</p> + + +<h2>$this->encrypt->sha1();</h2> +<p>SHA1 encoding function. Provide a string and it will return a 160 bit one way hash. Note: SHA1, just like MD5 is non-decodable. Example:</p> +<code>$hash = $this->encrypt->sha1('Some string');</code> + +<p>Many PHP installations have SHA1 support by default so if all you need is to encode a hash it's simpler to use the native +function:</p> + +<code>$hash = sha1('Some string');</code> + +<p>If your server does not support SHA1 you can use the provided function.</p> + +<h2 id="legacy">$this->encrypt->encode_from_legacy(<kbd>$orig_data</kbd>, <kbd>$legacy_mode</kbd> = MCRYPT_MODE_ECB, <kbd>$key</kbd> = '');</h2> +<p>Enables you to re-encode data that was originally encrypted with CodeIgniter 1.x to be compatible with the Encryption library in CodeIgniter 2.x. It is only + necessary to use this method if you have encrypted data stored permanently such as in a file or database and are on a server that supports Mcrypt. "Light" use encryption + such as encrypted session data or transitory encrypted flashdata require no intervention on your part. However, existing encrypted Sessions will be + destroyed since data encrypted prior to 2.x will not be decoded.</p> + +<p class="important"><strong>Why only a method to re-encode the data instead of maintaining legacy methods for both encoding and decoding?</strong> The algorithms in + the Encryption library have improved in CodeIgniter 2.x both for performance and security, and we do not wish to encourage continued use of the older methods. + You can of course extend the Encryption library if you wish and replace the new methods with the old and retain seamless compatibility with CodeIgniter 1.x + encrypted data, but this a decision that a developer should make cautiously and deliberately, if at all.</p> + +<code>$new_data = $this->encrypt->encode_from_legacy(<kbd>$old_encrypted_string</kbd>);</code> + +<table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder"> +<tr> + <th>Parameter</th> + <th>Default</th> + <th>Description</th> +</tr> +<tr> + <td class="td"><strong>$orig_data</strong></td> + <td class="td">n/a</td> + <td class="td">The original encrypted data from CodeIgniter 1.x's Encryption library</td> +</tr> +<tr> + <td class="td"><strong>$legacy_mode</strong></td> + <td class="td">MCRYPT_MODE_ECB</td> + <td class="td">The Mcrypt mode that was used to generate the original encrypted data. CodeIgniter 1.x's default was MCRYPT_MODE_ECB, and it will + assume that to be the case unless overridden by this parameter.</td> +</tr> +<tr> + <td class="td"><strong>$key</strong></td> + <td class="td">n/a</td> + <td class="td">The encryption key. This it typically specified in your config file as outlined above.</td> +</tr> +</table> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="email.html">Email Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="file_uploading.html">File Uploading Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/file_uploading.html b/user_guide/libraries/file_uploading.html new file mode 100644 index 0000000..1a5ae7a --- /dev/null +++ b/user_guide/libraries/file_uploading.html @@ -0,0 +1,451 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>File Uploading Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +File Uploading Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>File Uploading Class</h1> + +<p>CodeIgniter's File Uploading Class permits files to be uploaded. You can set various +preferences, restricting the type and size of the files.</p> + + +<h2>The Process</h2> + +<p>Uploading a file involves the following general process:</p> + + +<ul> +<li>An upload form is displayed, allowing a user to select a file and upload it.</li> +<li>When the form is submitted, the file is uploaded to the destination you specify.</li> +<li>Along the way, the file is validated to make sure it is allowed to be uploaded based on the preferences you set.</li> +<li>Once uploaded, the user will be shown a success message.</li> +</ul> + +<p>To demonstrate this process here is brief tutorial. Afterward you'll find reference information.</p> + +<h2>Creating the Upload Form</h2> + + + +<p>Using a text editor, create a form called <dfn>upload_form.php</dfn>. In it, place this code and save it to your <samp>applications/views/</samp> +folder:</p> + + +<textarea class="textarea" style="width:100%" cols="50" rows="23"> +&lt;html> +&lt;head> +&lt;title>Upload Form&lt;/title> +&lt;/head> +&lt;body> + +&lt;?php echo $error;?> + +&lt;?php echo form_open_multipart('upload/do_upload');?> + +&lt;input type="file" name="userfile" size="20" /> + +&lt;br />&lt;br /> + +&lt;input type="submit" value="upload" /> + +&lt;/form> + +&lt;/body> +&lt;/html></textarea> + +<p>You'll notice we are using a form helper to create the opening form tag. File uploads require a multipart form, so the helper +creates the proper syntax for you. You'll also notice we have an $error variable. This is so we can show error messages in the event +the user does something wrong.</p> + + +<h2>The Success Page</h2> + +<p>Using a text editor, create a form called <dfn>upload_success.php</dfn>. +In it, place this code and save it to your <samp>applications/views/</samp> folder:</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="20">&lt;html> +&lt;head> +&lt;title>Upload Form&lt;/title> +&lt;/head> +&lt;body> + +&lt;h3>Your file was successfully uploaded!&lt;/h3> + +&lt;ul> +&lt;?php foreach ($upload_data as $item => $value):?> +&lt;li>&lt;?php echo $item;?>: &lt;?php echo $value;?>&lt;/li> +&lt;?php endforeach; ?> +&lt;/ul> + +&lt;p>&lt;?php echo anchor('upload', 'Upload Another File!'); ?>&lt;/p> + +&lt;/body> +&lt;/html></textarea> + + +<h2>The Controller</h2> + +<p>Using a text editor, create a controller called <dfn>upload.php</dfn>. In it, place this code and save it to your <samp>applications/controllers/</samp> +folder:</p> + + +<textarea class="textarea" style="width:100%" cols="50" rows="43">&lt;?php + +class Upload extends CI_Controller { + + function __construct() + { + parent::__construct(); + $this->load->helper(array('form', 'url')); + } + + function index() + { + $this->load->view('upload_form', array('error' => ' ' )); + } + + function do_upload() + { + $config['upload_path'] = './uploads/'; + $config['allowed_types'] = 'gif|jpg|png'; + $config['max_size'] = '100'; + $config['max_width'] = '1024'; + $config['max_height'] = '768'; + + $this->load->library('upload', $config); + + if ( ! $this->upload->do_upload()) + { + $error = array('error' => $this->upload->display_errors()); + + $this->load->view('upload_form', $error); + } + else + { + $data = array('upload_data' => $this->upload->data()); + + $this->load->view('upload_success', $data); + } + } +} +?&gt;</textarea> + + +<h2>The Upload Folder</h2> + +<p>You'll need a destination folder for your uploaded images. Create a folder at the root of your CodeIgniter installation called +<dfn>uploads</dfn> and set its file permissions to 777.</p> + + +<h2>Try it!</h2> + +<p>To try your form, visit your site using a URL similar to this one:</p> + +<code>example.com/index.php/<var>upload</var>/</code> + +<p>You should see an upload form. Try uploading an image file (either a jpg, gif, or png). If the path in your +controller is correct it should work.</p> + + +<p>&nbsp;</p> + +<h1>Reference Guide</h1> + + +<h2>Initializing the Upload Class</h2> + +<p>Like most other classes in CodeIgniter, the Upload class is initialized in your controller using the <dfn>$this->load->library</dfn> function:</p> + +<code>$this->load->library('upload');</code> +<p>Once the Upload class is loaded, the object will be available using: <dfn>$this->upload</dfn></p> + + +<h2>Setting Preferences</h2> + +<p>Similar to other libraries, you'll control what is allowed to be upload based on your preferences. In the controller you +built above you set the following preferences:</p> + +<code>$config['upload_path'] = './uploads/';<br /> +$config['allowed_types'] = 'gif|jpg|png';<br /> +$config['max_size'] = '100';<br /> +$config['max_width'] = '1024';<br /> +$config['max_height'] = '768';<br /> +<br /> +$this->load->library('upload', $config);<br /><br /> + +// Alternately you can set preferences by calling the initialize function. Useful if you auto-load the class:<br /> +$this->upload->initialize($config);</code> + +<p>The above preferences should be fairly self-explanatory. Below is a table describing all available preferences.</p> + + +<h2>Preferences</h2> + +<p>The following preferences are available. The default value indicates what will be used if you do not specify that preference.</p> + +<table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder"> +<tr> +<th>Preference</th> +<th>Default&nbsp;Value</th> +<th>Options</th> +<th>Description</th> +</tr> + +<tr> +<td class="td"><strong>upload_path</strong></td> +<td class="td">None</td> +<td class="td">None</td> +<td class="td">The path to the folder where the upload should be placed. The folder must be writable and the path can be absolute or relative.</td> +</tr> + +<tr> +<td class="td"><strong>allowed_types</strong></td> +<td class="td">None</td> +<td class="td">None</td> +<td class="td">The mime types corresponding to the types of files you allow to be uploaded. Usually the file extension can be used as the mime type. Separate multiple types with a pipe.</td> +</tr> + + +<tr> +<td class="td"><strong>file_name</strong></td> +<td class="td">None</td> +<td class="td">Desired file name</td> +<td class="td"> + <p>If set CodeIgniter will rename the uploaded file to this name. The extension provided in the file name must also be an allowed file type.</p> +</td> +</tr> + +<tr> +<td class="td"><strong>overwrite</strong></td> +<td class="td">FALSE</td> +<td class="td">TRUE/FALSE (boolean)</td> +<td class="td">If set to true, if a file with the same name as the one you are uploading exists, it will be overwritten. If set to false, a number will be appended to the filename if another with the same name exists.</td> +</tr> + + +<tr> +<td class="td"><strong>max_size</strong></td> +<td class="td">0</td> +<td class="td">None</td> +<td class="td">The maximum size (in kilobytes) that the file can be. Set to zero for no limit. Note: Most PHP installations have their own limit, as specified in the php.ini file. Usually 2 MB (or 2048 KB) by default.</td> +</tr> + +<tr> +<td class="td"><strong>max_width</strong></td> +<td class="td">0</td> +<td class="td">None</td> +<td class="td">The maximum width (in pixels) that the file can be. Set to zero for no limit.</td> +</tr> + +<tr> +<td class="td"><strong>max_height</strong></td> +<td class="td">0</td> +<td class="td">None</td> +<td class="td">The maximum height (in pixels) that the file can be. Set to zero for no limit.</td> +</tr> + +<tr> +<td class="td"><strong>max_filename</strong></td> +<td class="td">0</td> +<td class="td">None</td> +<td class="td">The maximum length that a file name can be. Set to zero for no limit.</td> +</tr> + +<tr> +<td class="td"><strong>encrypt_name</strong></td> +<td class="td">FALSE</td> +<td class="td">TRUE/FALSE (boolean)</td> +<td class="td">If set to TRUE the file name will be converted to a random encrypted string. This can be useful if you would like the file saved with a name that can not be discerned by the person uploading it.</td> +</tr> + +<tr> +<td class="td"><strong>remove_spaces</strong></td> +<td class="td">TRUE</td> +<td class="td">TRUE/FALSE (boolean)</td> +<td class="td">If set to TRUE, any spaces in the file name will be converted to underscores. This is recommended.</td> +</tr> +</table> + + +<h2>Setting preferences in a config file</h2> + +<p>If you prefer not to set preferences using the above method, you can instead put them into a config file. +Simply create a new file called the <var>upload.php</var>, add the <var>$config</var> +array in that file. Then save the file in: <var>config/upload.php</var> and it will be used automatically. You +will NOT need to use the <dfn>$this->upload->initialize</dfn> function if you save your preferences in a config file.</p> + + +<h2>Function Reference</h2> + +<p>The following functions are available</p> + + +<h2>$this->upload->do_upload()</h2> + +<p>Performs the upload based on the preferences you've set. Note: By default the upload routine expects the file to come from a form field +called <dfn>userfile</dfn>, and the form must be a "multipart type:</p> + +<code>&lt;form method="post" action="some_action" enctype="multipart/form-data" /></code> + +<p>If you would like to set your own field name simply pass its value to the <dfn>do_upload</dfn> function:</p> + +<code> +$field_name = "some_field_name";<br /> +$this->upload->do_upload($field_name)</code> + + +<h2>$this->upload->display_errors()</h2> + +<p>Retrieves any error messages if the <dfn>do_upload()</dfn> function returned false. The function does not echo automatically, it +returns the data so you can assign it however you need.</p> + +<h3>Formatting Errors</h3> +<p>By default the above function wraps any errors within &lt;p> tags. You can set your own delimiters like this:</p> + +<code>$this->upload->display_errors('<var>&lt;p></var>', '<var>&lt;/p></var>');</code> + +<h2>$this->upload->data()</h2> + +<p>This is a helper function that returns an array containing all of the data related to the file you uploaded. +Here is the array prototype:</p> + +<code>Array<br /> +(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;[file_name]&nbsp;&nbsp;&nbsp;&nbsp;=> mypic.jpg<br /> +&nbsp;&nbsp;&nbsp;&nbsp;[file_type]&nbsp;&nbsp;&nbsp;&nbsp;=> image/jpeg<br /> +&nbsp;&nbsp;&nbsp;&nbsp;[file_path]&nbsp;&nbsp;&nbsp;&nbsp;=> /path/to/your/upload/<br /> +&nbsp;&nbsp;&nbsp;&nbsp;[full_path]&nbsp;&nbsp;&nbsp;&nbsp;=> /path/to/your/upload/jpg.jpg<br /> +&nbsp;&nbsp;&nbsp;&nbsp;[raw_name]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> mypic<br /> +&nbsp;&nbsp;&nbsp;&nbsp;[orig_name]&nbsp;&nbsp;&nbsp;&nbsp;=> mypic.jpg<br /> +&nbsp;&nbsp;&nbsp;&nbsp;[client_name]&nbsp;&nbsp;=> mypic.jpg<br /> +&nbsp;&nbsp;&nbsp;&nbsp;[file_ext]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> .jpg<br /> +&nbsp;&nbsp;&nbsp;&nbsp;[file_size]&nbsp;&nbsp;&nbsp;&nbsp;=> 22.2<br /> +&nbsp;&nbsp;&nbsp;&nbsp;[is_image]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> 1<br /> +&nbsp;&nbsp;&nbsp;&nbsp;[image_width]&nbsp;&nbsp;=> 800<br /> +&nbsp;&nbsp;&nbsp;&nbsp;[image_height] => 600<br /> +&nbsp;&nbsp;&nbsp;&nbsp;[image_type]&nbsp;&nbsp;&nbsp;=> jpeg<br /> +&nbsp;&nbsp;&nbsp;&nbsp;[image_size_str] => width="800" height="200"<br /> +)</code> + +<h3>Explanation</h3> + +<p>Here is an explanation of the above array items.</p> + +<table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder"> +<tr><th>Item</th><th>Description</th></tr> + +<tr><td class="td"><strong>file_name</strong></td> +<td class="td">The name of the file that was uploaded including the file extension.</td></tr> + +<tr><td class="td"><strong>file_type</strong></td> +<td class="td">The file's Mime type</td></tr> + +<tr><td class="td"><strong>file_path</strong></td> +<td class="td">The absolute server path to the file</td></tr> + +<tr><td class="td"><strong>full_path</strong></td> +<td class="td">The absolute server path including the file name</td></tr> + +<tr><td class="td"><strong>raw_name</strong></td> +<td class="td">The file name without the extension</td></tr> + +<tr><td class="td"><strong>orig_name</strong></td> +<td class="td">The original file name. This is only useful if you use the encrypted name option.</td></tr> + +<tr><td class="td"><strong>client_name</strong></td> +<td class="td">The file name as supplied by the client user agent, prior to any file name preparation or incrementing.</td></tr> + +<tr><td class="td"><strong>file_ext</strong></td> +<td class="td">The file extension with period</td></tr> + +<tr><td class="td"><strong>file_size</strong></td> +<td class="td">The file size in kilobytes</td></tr> + +<tr><td class="td"><strong>is_image</strong></td> +<td class="td">Whether the file is an image or not. 1 = image. 0 = not.</td></tr> + +<tr><td class="td"><strong>image_width</strong></td> +<td class="td">Image width.</td></tr> + +<tr><td class="td"><strong>image_height</strong></td> +<td class="td">Image height</td></tr> + +<tr><td class="td"><strong>image_type</strong></td> +<td class="td">Image type. Typically the file extension without the period.</td></tr> + +<tr><td class="td"><strong>image_size_str</strong></td> +<td class="td">A string containing the width and height. Useful to put into an image tag.</td></tr> + + +</table> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="encryption.html">Encryption Helper</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="form_validation.html">Form Validation Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/form_validation.html b/user_guide/libraries/form_validation.html new file mode 100644 index 0000000..b7f2beb --- /dev/null +++ b/user_guide/libraries/form_validation.html @@ -0,0 +1,1250 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Form Validation : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Form Validation +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Form Validation</h1> + +<p>CodeIgniter provides a comprehensive form validation and data prepping class that helps minimize the amount of code you'll write.</p> + +<ul> +<li><a href="#overview">Overview</a></li> +<li><a href="#tutorial">Form Validation Tutorial</a> + + <ul> + <li><a href="#theform">The Form</a></li> + <li><a href="#thesuccesspage">The Success Page</a></li> + <li><a href="#thecontroller">The Controller</a></li> + <li><a href="#validationrules">Setting Validation Rules</a></li> + <li><a href="#validationrulesasarray">Setting Validation Rules Using an Array</a></li> + <li><a href="#cascadingrules">Cascading Rules</a></li> + <li><a href="#preppingdata">Prepping Data</a></li> + <li><a href="#repopulatingform">Re-populating the Form</a></li> + <li><a href="#callbacks">Callbacks</a></li> + <li><a href="#settingerrors">Setting Error Messages</a></li> + <li><a href="#errordelimiters">Changing the Error Delimiters</a></li> + <li><a href="#translatingfn">Translating Field Names</a></li> + <li><a href="#individualerrors">Showing Errors Individually</a></li> + <li><a href="#savingtoconfig">Saving Sets of Validation Rules to a Config File</a></li> + <li><a href="#arraysasfields">Using Arrays as Field Names</a></li> + </ul> +</li> +<li><a href="#rulereference">Rule Reference</a></li> +<li><a href="#preppingreference">Prepping Reference</a></li> +<li><a href="#functionreference">Function Reference</a></li> +<li><a href="#helperreference">Helper Reference</a></li> + +</ul> + + + + + + +<p>&nbsp;</p> + +<a name="overview"></a> +<h1>Overview</h1> + + +<p>Before explaining CodeIgniter's approach to data validation, let's describe the ideal scenario:</p> + +<ol> +<li>A form is displayed.</li> +<li>You fill it in and submit it.</li> +<li>If you submitted something invalid, or perhaps missed a required item, the form is redisplayed containing your data +along with an error message describing the problem.</li> +<li>This process continues until you have submitted a valid form.</li> +</ol> + +<p>On the receiving end, the script must:</p> + +<ol> +<li>Check for required data.</li> +<li>Verify that the data is of the correct type, and meets the correct criteria. For example, if a username is submitted +it must be validated to contain only permitted characters. It must be of a minimum length, +and not exceed a maximum length. The username can't be someone else's existing username, or perhaps even a reserved word. Etc.</li> +<li>Sanitize the data for security.</li> +<li>Pre-format the data if needed (Does the data need to be trimmed? HTML encoded? Etc.)</li> +<li>Prep the data for insertion in the database.</li> +</ol> + + +<p>Although there is nothing terribly complex about the above process, it usually requires a significant +amount of code, and to display error messages, various control structures are usually placed within the form HTML. +Form validation, while simple to create, is generally very messy and tedious to implement.</p> + +<p>&nbsp;</p> + + +<a name="tutorial"></a> +<h1>Form Validation Tutorial</h1> + +<p>What follows is a "hands on" tutorial for implementing CodeIgniters Form Validation.</p> + + +<p>In order to implement form validation you'll need three things:</p> + +<ol> +<li>A <a href="../general/views.html">View</a> file containing a form.</li> +<li>A View file containing a "success" message to be displayed upon successful submission.</li> +<li>A <a href="../general/controllers.html">controller</a> function to receive and process the submitted data.</li> +</ol> + +<p>Let's create those three things, using a member sign-up form as the example.</p> + + + +<a name="theform"></a> + +<h2>The Form</h2> + +<p>Using a text editor, create a form called <dfn>myform.php</dfn>. In it, place this code and save it to your <samp>applications/views/</samp> +folder:</p> + + +<textarea class="textarea" style="width:100%" cols="50" rows="30">&lt;html> +&lt;head> +&lt;title>My Form&lt;/title> +&lt;/head> +&lt;body> + +&lt;?php echo validation_errors(); ?> + +&lt;?php echo form_open('form'); ?> + +&lt;h5>Username&lt;/h5> +&lt;input type="text" name="username" value="" size="50" /> + +&lt;h5>Password&lt;/h5> +&lt;input type="text" name="password" value="" size="50" /> + +&lt;h5>Password Confirm&lt;/h5> +&lt;input type="text" name="passconf" value="" size="50" /> + +&lt;h5>Email Address&lt;/h5> +&lt;input type="text" name="email" value="" size="50" /> + +&lt;div>&lt;input type="submit" value="Submit" />&lt;/div> + +&lt;/form> + +&lt;/body> +&lt;/html> +</textarea> + + + + +<a name="thesuccesspage"></a> +<h2>The Success Page</h2> + + +<p>Using a text editor, create a form called <dfn>formsuccess.php</dfn>. In it, place this code and save it to your <samp>applications/views/</samp> +folder:</p> + + +<textarea class="textarea" style="width:100%" cols="50" rows="14"> +&lt;html> +&lt;head> +&lt;title>My Form&lt;/title> +&lt;/head> +&lt;body> + +&lt;h3>Your form was successfully submitted!&lt;/h3> + +&lt;p>&lt;?php echo anchor('form', 'Try it again!'); ?>&lt;/p> + +&lt;/body> +&lt;/html> +</textarea> + + + +<a name="thecontroller"></a> +<h2>The Controller</h2> + +<p>Using a text editor, create a controller called <dfn>form.php</dfn>. In it, place this code and save it to your <samp>applications/controllers/</samp> +folder:</p> + + +<textarea class="textarea" style="width:100%" cols="50" rows="21">&lt;?php + +class Form extends CI_Controller { + + function index() + { + $this->load->helper(array('form', 'url')); + + $this->load->library('form_validation'); + + if ($this->form_validation->run() == FALSE) + { + $this->load->view('myform'); + } + else + { + $this->load->view('formsuccess'); + } + } +} +?></textarea> + + +<h2>Try it!</h2> + +<p>To try your form, visit your site using a URL similar to this one:</p> + +<code>example.com/index.php/<var>form</var>/</code> + +<p><dfn>If you submit the form you should simply see the form reload. That's because you haven't set up any validation +rules yet.</dfn></p> + +<p><strong>Since you haven't told the Form Validation class to validate anything yet, it returns <kbd>FALSE</kbd> (boolean false) by default. The <samp>run()</samp> +function only returns <kbd>TRUE</kbd> if it has successfully applied your rules without any of them failing.</strong></p> + + +<h2>Explanation</h2> + +<p>You'll notice several things about the above pages:</p> + +<p>The <dfn>form</dfn> (myform.php) is a standard web form with a couple exceptions:</p> + +<ol> +<li>It uses a <dfn>form helper</dfn> to create the form opening. +Technically, this isn't necessary. You could create the form using standard HTML. However, the benefit of using the helper +is that it generates the action URL for you, based on the URL in your config file. This makes your application more portable in the event your URLs change.</li> + +<li>At the top of the form you'll notice the following function call: +<code>&lt;?php echo validation_errors(); ?&gt;</code> + +<p>This function will return any error messages sent back by the validator. If there are no messages it returns an empty string.</p> +</li> +</ol> + +<p>The <dfn>controller</dfn> (form.php) has one function: <dfn>index()</dfn>. This function initializes the validation class and +loads the <var>form helper</var> and <var>URL helper</var> used by your view files. It also <samp>runs</samp> +the validation routine. Based on +whether the validation was successful it either presents the form or the success page.</p> + + + + +<a name="validationrules"></a> + +<h2>Setting Validation Rules</h2> + +<p>CodeIgniter lets you set as many validation rules as you need for a given field, cascading them in order, and it even lets you prep and pre-process the field data +at the same time. To set validation rules you will use the <dfn>set_rules()</dfn> function:</p> + +<code>$this->form_validation->set_rules();</code> + +<p>The above function takes <strong>three</strong> parameters as input:</p> + +<ol> + <li>The field name - the exact name you've given the form field.</li> + <li>A "human" name for this field, which will be inserted into the error message. For example, if your field is named "user" you might give it a human name of "Username". <strong>Note:</strong> If you would like the field name to be stored in a language file, please see <a href="#translatingfn">Translating Field Names</a>.</li> + <li>The validation rules for this form field.</li> +</ol> + + +<p><br />Here is an example. In your <dfn>controller</dfn> (form.php), add this code just below the validation initialization function:</p> + +<code> +$this->form_validation->set_rules('username', 'Username', 'required');<br /> +$this->form_validation->set_rules('password', 'Password', 'required');<br /> +$this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');<br /> +$this->form_validation->set_rules('email', 'Email', 'required');<br /> +</code> + +<p>Your controller should now look like this:</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="28">&lt;?php + +class Form extends CI_Controller { + + function index() + { + $this->load->helper(array('form', 'url')); + + $this->load->library('form_validation'); + + $this->form_validation->set_rules('username', 'Username', 'required'); + $this->form_validation->set_rules('password', 'Password', 'required'); + $this->form_validation->set_rules('passconf', 'Password Confirmation', 'required'); + $this->form_validation->set_rules('email', 'Email', 'required'); + + if ($this->form_validation->run() == FALSE) + { + $this->load->view('myform'); + } + else + { + $this->load->view('formsuccess'); + } + } +} +?></textarea> + +<p><dfn>Now submit the form with the fields blank and you should see the error messages. +If you submit the form with all the fields populated you'll see your success page.</dfn></p> + +<p class="important"><strong>Note:</strong> The form fields are not yet being re-populated with the data when +there is an error. We'll get to that shortly.</p> + + + + +<a name="validationrulesasarray"></a> +<h2>Setting Rules Using an Array</h2> + +<p>Before moving on it should be noted that the rule setting function can be passed an array if you prefer to set all your rules in one action. +If you use this approach you must name your array keys as indicated:</p> + +<code> +$config = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field'&nbsp;&nbsp;&nbsp;=> 'username', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label'&nbsp;&nbsp;&nbsp;=> 'Username', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rules'&nbsp;&nbsp;&nbsp;=> 'required'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field'&nbsp;&nbsp;&nbsp;=> 'password', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label'&nbsp;&nbsp;&nbsp;=> 'Password', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rules'&nbsp;&nbsp;&nbsp;=> 'required'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field'&nbsp;&nbsp;&nbsp;=> 'passconf', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label'&nbsp;&nbsp;&nbsp;=> 'Password Confirmation', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rules'&nbsp;&nbsp;&nbsp;=> 'required'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),&nbsp;&nbsp;&nbsp;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field'&nbsp;&nbsp;&nbsp;=> 'email', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label'&nbsp;&nbsp;&nbsp;=> 'Email', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rules'&nbsp;&nbsp;&nbsp;=> 'required'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +$this->form_validation->set_rules($config); +</code> + + + + + + +<a name="cascadingrules"></a> +<h2>Cascading Rules</h2> + +<p>CodeIgniter lets you pipe multiple rules together. Let's try it. Change your rules in the third parameter of rule setting function, like this:</p> + +<code> +$this->form_validation->set_rules('username', 'Username', 'required|min_length[5]|max_length[12]|is_unique[users.username]');<br /> +$this->form_validation->set_rules('password', 'Password', 'required|matches[passconf]');<br /> +$this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');<br /> +$this->form_validation->set_rules('email', 'Email', 'required|valid_email|is_unique[users.email]');<br /> +</code> + +<p>The above code sets the following rules:</p> + +<ol> +<li>The username field be no shorter than 5 characters and no longer than 12.</li> +<li>The password field must match the password confirmation field.</li> +<li>The email field must contain a valid email address.</li> +</ol> + +<p>Give it a try! Submit your form without the proper data and you'll see new error messages that correspond to your new rules. +There are numerous rules available which you can read about in the validation reference.</p> + + + +<a name="preppingdata"></a> +<h2>Prepping Data</h2> + +<p>In addition to the validation functions like the ones we used above, you can also prep your data in various ways. +For example, you can set up rules like this:</p> + +<code> +$this->form_validation->set_rules('username', 'Username', '<kbd>trim</kbd>|required|min_length[5]|max_length[12]');<br /> +$this->form_validation->set_rules('password', 'Password', '<kbd>trim</kbd>|required|min_length[8]|matches[passconf]');<br /> +$this->form_validation->set_rules('passconf', 'Password Confirmation', '<kbd>trim</kbd>|required');<br /> +$this->form_validation->set_rules('email', 'Email', '<kbd>trim</kbd>|required|valid_email');<br /> +</code> + + +<p>In the above example, we are "trimming" the fields, checking for length where necessary +and making sure that both password fields match.</p> + +<p><strong>Any native PHP function that accepts one parameter can be used as a rule, like <dfn>htmlspecialchars()</dfn>, +<dfn>trim()</dfn>, etc.</strong></p> + +<p><strong>Note:</strong> You will generally want to use the prepping functions <strong>after</strong> +the validation rules so if there is an error, the original data will be shown in the form.</p> + + + + +<a name="repopulatingform"></a> +<h2>Re-populating the form</h2> + +<p>Thus far we have only been dealing with errors. It's time to repopulate the form field with the submitted data. CodeIgniter offers several helper functions +that permit you to do this. The one you will use most commonly is:</p> + +<code>set_value('field name')</code> + + +<p>Open your <dfn>myform.php</dfn> view file and update the <strong>value</strong> in each field using the <dfn>set_value()</dfn> function:</p> + +<p><strong>Don't forget to include each field name in the <dfn>set_value()</dfn> functions!</strong></p> + + +<textarea class="textarea" style="width:100%" cols="50" rows="30"> +&lt;html> +&lt;head> +&lt;title>My Form&lt;/title> +&lt;/head> +&lt;body> + +&lt;?php echo validation_errors(); ?> + +&lt;?php echo form_open('form'); ?> + +&lt;h5>Username&lt;/h5> +&lt;input type="text" name="username" value="&lt;?php echo set_value('username'); ?>" size="50" /> + +&lt;h5>Password&lt;/h5> +&lt;input type="text" name="password" value="&lt;?php echo set_value('password'); ?>" size="50" /> + +&lt;h5>Password Confirm&lt;/h5> +&lt;input type="text" name="passconf" value="&lt;?php echo set_value('passconf'); ?>" size="50" /> + +&lt;h5>Email Address&lt;/h5> +&lt;input type="text" name="email" value="&lt;?php echo set_value('email'); ?>" size="50" /> + +&lt;div>&lt;input type="submit" value="Submit" />&lt;/div> + +&lt;/form> + +&lt;/body> +&lt;/html> +</textarea> + + +<p><dfn>Now reload your page and submit the form so that it triggers an error. Your form fields should now be re-populated</dfn></p> + +<p class="important"><strong>Note:</strong> The <a href="#functionreference">Function Reference</a> section below contains functions that +permit you to re-populate &lt;select> menus, radio buttons, and checkboxes.</p> + + +<p><strong>Important Note:</strong> If you use an array as the name of a form field, you must supply it as an array to the function. Example:</p> + +<code>&lt;input type="text" name="<kbd>colors[]</kbd>" value="&lt;?php echo set_value('<kbd>colors[]</kbd>'); ?>" size="50" /></code> + +<p>For more info please see the <a href="#arraysasfields">Using Arrays as Field Names</a> section below.</p> + + + + + +<a name="callbacks"></a> +<h2>Callbacks: Your own Validation Functions</h2> + +<p>The validation system supports callbacks to your own validation functions. This permits you to extend the validation class +to meet your needs. For example, if you need to run a database query to see if the user is choosing a unique username, you can +create a callback function that does that. Let's create a example of this.</p> + +<p>In your controller, change the "username" rule to this:</p> + +<code>$this->form_validation->set_rules('username', 'Username', '<kbd>callback_username_check</kbd>');</code> + +<p>Then add a new function called <dfn>username_check</dfn> to your controller. Here's how your controller should now look:</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="40">&lt;?php + +class Form extends CI_Controller { + + public function index() + { + $this->load->helper(array('form', 'url')); + + $this->load->library('form_validation'); + + $this->form_validation->set_rules('username', 'Username', 'callback_username_check'); + $this->form_validation->set_rules('password', 'Password', 'required'); + $this->form_validation->set_rules('passconf', 'Password Confirmation', 'required'); + $this->form_validation->set_rules('email', 'Email', 'required|is_unique[users.email]'); + + if ($this->form_validation->run() == FALSE) + { + $this->load->view('myform'); + } + else + { + $this->load->view('formsuccess'); + } + } + + public function username_check($str) + { + if ($str == 'test') + { + $this->form_validation->set_message('username_check', 'The %s field can not be the word "test"'); + return FALSE; + } + else + { + return TRUE; + } + } + +} +?></textarea> + +<p><dfn>Reload your form and submit it with the word "test" as the username. You can see that the form field data was passed to your +callback function for you to process.</dfn></p> + +<p>To invoke a callback just put the function name in a rule, with "callback_" as the rule <strong>prefix</strong>. If you need +to receive an extra parameter in your callback function, just add it normally after the function name between square brackets, +as in: "callback_foo<strong>[bar]</strong>", then it will be passed as the second argument of your callback function.</p> + +<p><strong>Note:</strong> You can also process the form data that is passed to your callback and return it. If your callback returns anything other than a boolean TRUE/FALSE +it is assumed that the data is your newly processed form data.</p> + +<a name="settingerrors"></a> +<h2>Setting Error Messages</h2> + + +<p>All of the native error messages are located in the following language file: <dfn>language/english/form_validation_lang.php</dfn></p> + +<p>To set your own custom message you can either edit that file, or use the following function:</p> + +<code>$this->form_validation->set_message('<var>rule</var>', '<var>Error Message</var>');</code> + +<p>Where <var>rule</var> corresponds to the name of a particular rule, and <var>Error Message</var> is the text you would like displayed.</p> + +<p>If you include <dfn>%s</dfn> in your error string, it will be replaced with the "human" name you used for your field when you set your rules.</p> + +<p>In the "callback" example above, the error message was set by passing the name of the function:</p> + +<code>$this->form_validation->set_message('username_check')</code> + +<p>You can also override any error message found in the language file. For example, to change the message for the "required" rule you will do this:</p> + +<code>$this->form_validation->set_message('required', 'Your custom message here');</code> + + + +<a name="translatingfn"></a> +<h2>Translating Field Names</h2> + +<p>If you would like to store the "human" name you passed to the <dfn>set_rules()</dfn> function in a language file, and therefore make the name able to be translated, here's how:</p> + +<p>First, prefix your "human" name with <dfn>lang:</dfn>, as in this example:</p> + +<code> +$this->form_validation->set_rules('first_name', '<kbd>lang:</kbd>first_name', 'required');<br /> +</code> + +<p>Then, store the name in one of your language file arrays (without the prefix):</p> + +<code>$lang['first_name'] = 'First Name';</code> + +<p><strong>Note:</strong> If you store your array item in a language file that is not loaded automatically by CI, you'll need to remember to load it in your controller using:</p> + +<code>$this->lang->load('file_name');</code> + +<p>See the <a href="language.html">Language Class</a> page for more info regarding language files.</p> + + +<a name="errordelimiters"></a> +<h2>Changing the Error Delimiters</h2> + +<p>By default, the Form Validation class adds a paragraph tag (&lt;p&gt;) around each error message shown. You can either change these delimiters globally or +individually.</p> + +<ol> + +<li><strong>Changing delimiters Globally</strong> + +<p>To globally change the error delimiters, in your controller function, just after loading the Form Validation class, add this:</p> + +<code>$this->form_validation->set_error_delimiters('<kbd>&lt;div class="error"></kbd>', '<kbd>&lt;/div></kbd>');</code> + +<p>In this example, we've switched to using div tags.</p> + +</li> + +<li><strong>Changing delimiters Individually</strong> + +<p>Each of the two error generating functions shown in this tutorial can be supplied their own delimiters as follows:</p> + +<code>&lt;?php echo form_error('field name', '<kbd>&lt;div class="error"></kbd>', '<kbd>&lt;/div></kbd>'); ?></code> + +<p>Or:</p> + +<code>&lt;?php echo validation_errors('<kbd>&lt;div class="error"></kbd>', '<kbd>&lt;/div></kbd>'); ?></code> + +</li> +</ol> + + + + +<a name="individualerrors"></a> +<h2>Showing Errors Individually</h2> + +<p>If you prefer to show an error message next to each form field, rather than as a list, you can use the <dfn>form_error()</dfn> function.</p> + +<p>Try it! Change your form so that it looks like this:</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="18"> +&lt;h5>Username&lt;/h5> +&lt;?php echo form_error('username'); ?> +&lt;input type="text" name="username" value="&lt;?php echo set_value('username'); ?>" size="50" /> + +&lt;h5>Password&lt;/h5> +&lt;?php echo form_error('password'); ?> +&lt;input type="text" name="password" value="&lt;?php echo set_value('password'); ?>" size="50" /> + +&lt;h5>Password Confirm&lt;/h5> +&lt;?php echo form_error('passconf'); ?> +&lt;input type="text" name="passconf" value="&lt;?php echo set_value('passconf'); ?>" size="50" /> + +&lt;h5>Email Address&lt;/h5> +&lt;?php echo form_error('email'); ?> +&lt;input type="text" name="email" value="&lt;?php echo set_value('email'); ?>" size="50" /> +</textarea> + +<p>If there are no errors, nothing will be shown. If there is an error, the message will appear.</p> + +<p><strong>Important Note:</strong> If you use an array as the name of a form field, you must supply it as an array to the function. Example:</p> + +<code>&lt;?php echo form_error('<kbd>options[size]</kbd>'); ?><br /> +&lt;input type="text" name="<kbd>options[size]</kbd>" value="&lt;?php echo set_value("<kbd>options[size]</kbd>"); ?>" size="50" /> +</code> + +<p>For more info please see the <a href="#arraysasfields">Using Arrays as Field Names</a> section below.</p> + + + + +<p>&nbsp;</p> + + +<a name="savingtoconfig"></a> +<h1>Saving Sets of Validation Rules to a Config File</h1> + +<p>A nice feature of the Form Validation class is that it permits you to store all your validation rules for your entire application in a config file. You +can organize these rules into "groups". These groups can either be loaded automatically when a matching controller/function is called, or +you can manually call each set as needed.</p> + +<h3>How to save your rules</h3> + +<p>To store your validation rules, simply create a file named <kbd>form_validation.php</kbd> in your <dfn>application/config/</dfn> folder. +In that file you will place an array named <kbd>$config</kbd> with your rules. As shown earlier, the validation array will have this prototype:</p> + +<code> +$config = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field'&nbsp;&nbsp;&nbsp;=> 'username', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label'&nbsp;&nbsp;&nbsp;=> 'Username', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rules'&nbsp;&nbsp;&nbsp;=> 'required'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field'&nbsp;&nbsp;&nbsp;=> 'password', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label'&nbsp;&nbsp;&nbsp;=> 'Password', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rules'&nbsp;&nbsp;&nbsp;=> 'required'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field'&nbsp;&nbsp;&nbsp;=> 'passconf', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label'&nbsp;&nbsp;&nbsp;=> 'Password Confirmation', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rules'&nbsp;&nbsp;&nbsp;=> 'required'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),&nbsp;&nbsp;&nbsp;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field'&nbsp;&nbsp;&nbsp;=> 'email', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label'&nbsp;&nbsp;&nbsp;=> 'Email', <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rules'&nbsp;&nbsp;&nbsp;=> 'required'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +</code> + +<p><dfn>Your validation rule file will be loaded automatically and used when you call the run() function.</dfn></p> + +<p class="important">Please note that you MUST name your array $config.</p> + +<h3>Creating Sets of Rules</h3> + +<p>In order to organize your rules into "sets" requires that you place them into "sub arrays". Consider the following example, showing two sets of rules. +We've arbitrarily called these two rules "signup" and "email". You can name your rules anything you want:</p> + + +<code>$config = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'<kbd>signup</kbd>' => array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field' => 'username',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' => 'Username',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rules' => 'required'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field' => 'password',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' => 'Password',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rules' => 'required'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field' => 'passconf',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' => 'PasswordConfirmation',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rules' => 'required'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field' => 'email',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' => 'Email',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rules' => 'required'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'<kbd>email</kbd>' => array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field' => 'emailaddress',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' => 'EmailAddress',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rules' => 'required|valid_email'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field' => 'name',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' => 'Name',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rules' => 'required|alpha'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field' => 'title',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' => 'Title',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rules' => 'required'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field' => 'message',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' => 'MessageBody',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rules' => 'required'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +</code> + + +<h3>Calling a Specific Rule Group</h3> + +<p>In order to call a specific group you will pass its name to the <kbd>run()</kbd> function. For example, to call the <kbd>signup</kbd> rule you will do this:</p> + +<code> +if ($this->form_validation->run('<kbd>signup</kbd>') == FALSE)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;$this->load->view('myform');<br /> +}<br /> +else<br /> +{<br /> +&nbsp;&nbsp;&nbsp;$this->load->view('formsuccess');<br /> +}<br /> +</code> + + + +<h3>Associating a Controller Function with a Rule Group</h3> + +<p>An alternate (and more automatic) method of calling a rule group is to name it according to the controller class/function you intend to use it with. For example, let's say you +have a controller named <kbd>Member</kbd> and a function named <kbd>signup</kbd>. Here's what your class might look like:</p> + +<code> +&lt;?php<br /><br /> +class <kbd>Member</kbd> extends CI_Controller {<br /> +<br /> +&nbsp;&nbsp;&nbsp;function <kbd>signup</kbd>()<br /> +&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->load->library('form_validation');<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($this->form_validation->run() == FALSE)<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->load->view('myform');<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->load->view('formsuccess');<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +&nbsp;&nbsp;&nbsp;}<br /> +}<br /> +?></code> + +<p>In your validation config file, you will name your rule group <kbd>member/signup</kbd>:</p> + + +<code>$config = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'<kbd>member/signup</kbd>' => array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field' => 'username',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' => 'Username',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rules' => 'required'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field' => 'password',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' => 'Password',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rules' => 'required'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field' => 'passconf',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' => 'PasswordConfirmation',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rules' => 'required'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'field' => 'email',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'label' => 'Email',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'rules' => 'required'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +</code> + +<p><dfn>When a rule group is named identically to a controller class/function it will be used automatically when the run() function is invoked from that class/function.</dfn></p> + +<p>&nbsp;</p> + + +<a name="arraysasfields"></a> +<h1>Using Arrays as Field Names</h1> + +<p>The Form Validation class supports the use of arrays as field names. Consider this example:</p> + +<code>&lt;input type="text" name="<kbd>options[]</kbd>" value="" size="50" /></code> + +<p>If you do use an array as a field name, you must use the EXACT array name in the <a href="#helperreference">Helper Functions</a> that require the field name, +and as your Validation Rule field name.</p> + +<p>For example, to set a rule for the above field you would use:</p> + +<code>$this->form_validation->set_rules('<kbd>options[]</kbd>', 'Options', 'required');</code> + +<p>Or, to show an error for the above field you would use:</p> + +<code>&lt;?php echo form_error('<kbd>options[]</kbd>'); ?></code> + +<p>Or to re-populate the field you would use:</p> + +<code>&lt;input type="text" name="<kbd>options[]</kbd>" value="<kbd>&lt;?php echo set_value('<kbd>options[]</kbd>'); ?></kbd>" size="50" /></code> + +<p>You can use multidimensional arrays as field names as well. For example:</p> + +<code>&lt;input type="text" name="<kbd>options[size]</kbd>" value="" size="50" /></code> + +<p>Or even:</p> + +<code>&lt;input type="text" name="<kbd>sports[nba][basketball]</kbd>" value="" size="50" /></code> + +<p>As with our first example, you must use the exact array name in the helper functions:</p> + +<code>&lt;?php echo form_error('<kbd>sports[nba][basketball]</kbd>'); ?></code> + +<p>If you are using checkboxes (or other fields) that have multiple options, don't forget to leave an empty bracket after each option, so that all selections will be added to the +POST array:</p> + +<code> +&lt;input type="checkbox" name="<kbd>options[]</kbd>" value="red" /><br /> +&lt;input type="checkbox" name="<kbd>options[]</kbd>" value="blue" /><br /> +&lt;input type="checkbox" name="<kbd>options[]</kbd>" value="green" /> +</code> + +<p>Or if you use a multidimensional array:</p> + +<code> +&lt;input type="checkbox" name="<kbd>options[color][]</kbd>" value="red" /><br /> +&lt;input type="checkbox" name="<kbd>options[color][]</kbd>" value="blue" /><br /> +&lt;input type="checkbox" name="<kbd>options[color][]</kbd>" value="green" /> +</code> + +<p>When you use a helper function you'll include the bracket as well:</p> + +<code>&lt;?php echo form_error('<kbd>options[color][]</kbd>'); ?></code> + + + + +<p>&nbsp;</p> + + +<a name="rulereference"></a> +<h1>Rule Reference</h1> + +<p>The following is a list of all the native rules that are available to use:</p> + + +<table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder"> + <tr> + <th>Rule</th> + <th>Parameter</th> + <th>Description</th> + <th>Example</th> + </tr> + + <tr> + <td class="td"><strong>required</strong></td> + <td class="td">No</td> + <td class="td">Returns FALSE if the form element is empty.</td> + <td class="td">&nbsp;</td> + </tr> + + <tr> + <td class="td"><strong>matches</strong></td> + <td class="td">Yes</td> + <td class="td">Returns FALSE if the form element does not match the one in the parameter.</td> + <td class="td">matches[form_item]</td> + </tr> + + <tr> + <td class="td"><strong>is_unique</strong></td> + <td class="td">Yes</td> + <td class="td">Returns FALSE if the form element is not unique to the table and field name in the parameter.</td> + <td class="td">is_unique[table.field]</td> + </tr> + + <tr> + <td class="td"><strong>min_length</strong></td> + <td class="td">Yes</td> + <td class="td">Returns FALSE if the form element is shorter then the parameter value.</td> + <td class="td">min_length[6]</td> + </tr> + + <tr> + <td class="td"><strong>max_length</strong></td> + <td class="td">Yes</td> + <td class="td">Returns FALSE if the form element is longer then the parameter value.</td> + <td class="td">max_length[12]</td> + </tr> + + <tr> + <td class="td"><strong>exact_length</strong></td> + <td class="td">Yes</td> + <td class="td">Returns FALSE if the form element is not exactly the parameter value.</td> + <td class="td">exact_length[8]</td> + </tr> + + <tr> + <td class="td"><strong>greater_than</strong></td> + <td class="td">Yes</td> + <td class="td">Returns FALSE if the form element is less than the parameter value or not numeric.</td> + <td class="td">greater_than[8]</td> + </tr> + + <tr> + <td class="td"><strong>less_than</strong></td> + <td class="td">Yes</td> + <td class="td">Returns FALSE if the form element is greater than the parameter value or not numeric.</td> + <td class="td">less_than[8]</td> + </tr> + + <tr> + <td class="td"><strong>alpha</strong></td> + <td class="td">No</td> + <td class="td">Returns FALSE if the form element contains anything other than alphabetical characters.</td> + <td class="td">&nbsp;</td> + </tr> + + <tr> + <td class="td"><strong>alpha_numeric</strong></td> + <td class="td">No</td> + <td class="td">Returns FALSE if the form element contains anything other than alpha-numeric characters.</td> + <td class="td">&nbsp;</td> + </tr> + + <tr> + <td class="td"><strong>alpha_dash</strong></td> + <td class="td">No</td> + <td class="td">Returns FALSE if the form element contains anything other than alpha-numeric characters, underscores or dashes.</td> + <td class="td">&nbsp;</td> + </tr> + + <tr> + <td class="td"><strong>numeric</strong></td> + <td class="td">No</td> + <td class="td">Returns FALSE if the form element contains anything other than numeric characters.</td> + <td class="td">&nbsp;</td> + </tr> + + <tr> + <td class="td"><strong>integer</strong></td> + <td class="td">No</td> + <td class="td">Returns FALSE if the form element contains anything other than an integer.</td> + <td class="td">&nbsp;</td> + </tr> + + <tr> + <td class="td"><strong>decimal</strong></td> + <td class="td">No</td> + <td class="td">Returns FALSE if the form element contains anything other than a decimal number.</td> + <td class="td">&nbsp;</td> + </tr> + + <tr> + <td class="td"><strong>is_natural</strong></td> + <td class="td">No</td> + <td class="td">Returns FALSE if the form element contains anything other than a natural number: 0, 1, 2, 3, etc.</td> + <td class="td">&nbsp;</td> + </tr> + + <tr> + <td class="td"><strong>is_natural_no_zero</strong></td> + <td class="td">No</td> + <td class="td">Returns FALSE if the form element contains anything other than a natural number, but not zero: 1, 2, 3, etc.</td> + <td class="td">&nbsp;</td> + </tr> + + <tr> + <td class="td"><strong>valid_email</strong></td> + <td class="td">No</td> + <td class="td">Returns FALSE if the form element does not contain a valid email address.</td> + <td class="td">&nbsp;</td> + </tr> + + <tr> + <td class="td"><strong>valid_emails</strong></td> + <td class="td">No</td> + <td class="td">Returns FALSE if any value provided in a comma separated list is not a valid email.</td> + <td class="td">&nbsp;</td> + </tr> + + <tr> + <td class="td"><strong>valid_ip</strong></td> + <td class="td">No</td> + <td class="td">Returns FALSE if the supplied IP is not valid. Accepts an optional parameter of "IPv4" or "IPv6" to specify an IP format.</td> + <td class="td">&nbsp;</td> + </tr> + + <tr> + <td class="td"><strong>valid_base64</strong></td> + <td class="td">No</td> + <td class="td">Returns FALSE if the supplied string contains anything other than valid Base64 characters.</td> + <td class="td">&nbsp;</td> + </tr> + + +</table> + +<p><strong>Note:</strong> These rules can also be called as discrete functions. For example:</p> + +<code>$this->form_validation->required($string);</code> + +<p class="important"><strong>Note:</strong> You can also use any native PHP functions that permit one parameter.</p> + + + +<p>&nbsp;</p> + +<a name="preppingreference"></a> +<h1>Prepping Reference</h1> + +<p>The following is a list of all the prepping functions that are available to use:</p> + + + +<table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder"> + <tr> + <th>Name</th> + <th>Parameter</th> + <th>Description</th> + </tr><tr> + + <td class="td"><strong>xss_clean</strong></td> + <td class="td">No</td> + <td class="td">Runs the data through the XSS filtering function, described in the <a href="input.html">Input Class</a> page.</td> + </tr><tr> + + <td class="td"><strong>prep_for_form</strong></td> + <td class="td">No</td> + <td class="td">Converts special characters so that HTML data can be shown in a form field without breaking it.</td> + </tr><tr> + + <td class="td"><strong>prep_url</strong></td> + <td class="td">No</td> + <td class="td">Adds "http://" to URLs if missing.</td> + </tr><tr> + + <td class="td"><strong>strip_image_tags</strong></td> + <td class="td">No</td> + <td class="td">Strips the HTML from image tags leaving the raw URL.</td> + </tr><tr> + + <td class="td"><strong>encode_php_tags</strong></td> + <td class="td">No</td> + <td class="td">Converts PHP tags to entities.</td> + </tr> + +</table> + +<p class="important"><strong>Note:</strong> You can also use any native PHP functions that permit one parameter, +like <kbd>trim</kbd>, <kbd>htmlspecialchars</kbd>, <kbd>urldecode</kbd>, etc.</p> + + + + + + + +<p>&nbsp;</p> + +<a name="functionreference"></a> +<h1>Function Reference</h1> + +<p>The following functions are intended for use in your controller functions.</p> + +<h2>$this->form_validation->set_rules();</h2> + +<p>Permits you to set validation rules, as described in the tutorial sections above:</p> + +<ul> +<li><a href="#validationrules">Setting Validation Rules</a></li> +<li><a href="#savingtoconfig">Saving Groups of Validation Rules to a Config File</a></li> +</ul> + + +<h2>$this->form_validation->run();</h2> + +<p>Runs the validation routines. Returns boolean TRUE on success and FALSE on failure. You can optionally pass the name of the validation +group via the function, as described in: <a href="#savingtoconfig">Saving Groups of Validation Rules to a Config File</a>.</p> + + +<h2>$this->form_validation->set_message();</h2> + +<p>Permits you to set custom error messages. See <a href="#settingerrors">Setting Error Messages</a> above.</p> + + +<p>&nbsp;</p> + +<a name="helperreference"></a> +<h1>Helper Reference</h1> + +<p>The following helper functions are available for use in the view files containing your forms. Note that these are procedural functions, so they +<strong>do not</strong> require you to prepend them with $this->form_validation.</p> + +<h2>form_error()</h2> + +<p>Shows an individual error message associated with the field name supplied to the function. Example:</p> + +<code>&lt;?php echo form_error('username'); ?></code> + +<p>The error delimiters can be optionally specified. See the <a href="#errordelimiters">Changing the Error Delimiters</a> section above.</p> + + + +<h2>validation_errors()</h2> +<p>Shows all error messages as a string: Example:</p> + +<code>&lt;?php echo validation_errors(); ?></code> + +<p>The error delimiters can be optionally specified. See the <a href="#errordelimiters">Changing the Error Delimiters</a> section above.</p> + + + +<h2>set_value()</h2> + +<p>Permits you to set the value of an input form or textarea. You must supply the field name via the first parameter of the function. +The second (optional) parameter allows you to set a default value for the form. Example:</p> + +<code>&lt;input type="text" name="quantity" value="<dfn>&lt;?php echo set_value('quantity', '0'); ?></dfn>" size="50" /></code> + +<p>The above form will show "0" when loaded for the first time.</p> + +<h2>set_select()</h2> + +<p>If you use a <dfn>&lt;select></dfn> menu, this function permits you to display the menu item that was selected. The first parameter +must contain the name of the select menu, the second parameter must contain the value of +each item, and the third (optional) parameter lets you set an item as the default (use boolean TRUE/FALSE).</p> + +<p>Example:</p> + +<code> +&lt;select name="myselect"><br /> +&lt;option value="one" <dfn>&lt;?php echo set_select('myselect', 'one', TRUE); ?></dfn> >One&lt;/option><br /> +&lt;option value="two" <dfn>&lt;?php echo set_select('myselect', 'two'); ?></dfn> >Two&lt;/option><br /> +&lt;option value="three" <dfn>&lt;?php echo set_select('myselect', 'three'); ?></dfn> >Three&lt;/option><br /> +&lt;/select> +</code> + + +<h2>set_checkbox()</h2> + +<p>Permits you to display a checkbox in the state it was submitted. The first parameter +must contain the name of the checkbox, the second parameter must contain its value, and the third (optional) parameter lets you set an item as the default (use boolean TRUE/FALSE). Example:</p> + +<code>&lt;input type="checkbox" name="mycheck[]" value="1" <dfn>&lt;?php echo set_checkbox('mycheck[]', '1'); ?></dfn> /><br /> +&lt;input type="checkbox" name="mycheck[]" value="2" <dfn>&lt;?php echo set_checkbox('mycheck[]', '2'); ?></dfn> /></code> + + +<h2>set_radio()</h2> + +<p>Permits you to display radio buttons in the state they were submitted. This function is identical to the <strong>set_checkbox()</strong> function above.</p> + +<code>&lt;input type="radio" name="myradio" value="1" <dfn>&lt;?php echo set_radio('myradio', '1', TRUE); ?></dfn> /><br /> +&lt;input type="radio" name="myradio" value="2" <dfn>&lt;?php echo set_radio('myradio', '2'); ?></dfn> /></code> + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="file_uploading.html">File Uploading Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="ftp.html">FTP Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/ftp.html b/user_guide/libraries/ftp.html new file mode 100644 index 0000000..95d9e36 --- /dev/null +++ b/user_guide/libraries/ftp.html @@ -0,0 +1,315 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>FTP Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +FTP Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>FTP Class</h1> + +<p>CodeIgniter's FTP Class permits files to be transfered to a remote server. Remote files can also be moved, renamed, +and deleted. The FTP class also includes a "mirroring" function that permits an entire local directory to be recreated remotely via FTP.</p> + +<p class="important"><strong>Note:</strong>&nbsp; SFTP and SSL FTP protocols are not supported, only standard FTP.</p> + +<h2>Initializing the Class</h2> + +<p>Like most other classes in CodeIgniter, the FTP class is initialized in your controller using the <dfn>$this->load->library</dfn> function:</p> + +<code>$this->load->library('ftp');</code> +<p>Once loaded, the FTP object will be available using: <dfn>$this->ftp</dfn></p> + + +<h2>Usage Examples</h2> + +<p>In this example a connection is opened to the FTP server, and a local file is read and uploaded in ASCII mode. The +file permissions are set to 755.</p> + +<code> +$this->load->library('ftp');<br /> +<br /> +$config['hostname'] = 'ftp.example.com';<br /> +$config['username'] = 'your-username';<br /> +$config['password'] = 'your-password';<br /> +$config['debug'] = TRUE;<br /> +<br /> +$this->ftp->connect($config);<br /> +<br /> +$this->ftp->upload('/local/path/to/myfile.html', '/public_html/myfile.html', 'ascii', 0775);<br /> +<br /> +$this->ftp->close(); + +</code> + + +<p>In this example a list of files is retrieved from the server.</p> + +<code> +$this->load->library('ftp');<br /> +<br /> +$config['hostname'] = 'ftp.example.com';<br /> +$config['username'] = 'your-username';<br /> +$config['password'] = 'your-password';<br /> +$config['debug'] = TRUE;<br /> +<br /> +$this->ftp->connect($config);<br /> +<br /> +$list = $this->ftp->list_files('/public_html/');<br /> +<br /> +print_r($list);<br /> +<br /> +$this->ftp->close(); +</code> + +<p>In this example a local directory is mirrored on the server.</p> + + +<code> +$this->load->library('ftp');<br /> +<br /> +$config['hostname'] = 'ftp.example.com';<br /> +$config['username'] = 'your-username';<br /> +$config['password'] = 'your-password';<br /> +$config['debug'] = TRUE;<br /> +<br /> +$this->ftp->connect($config);<br /> +<br /> +$this->ftp->mirror('/path/to/myfolder/', '/public_html/myfolder/');<br /> +<br /> +$this->ftp->close(); +</code> + + +<h1>Function Reference</h1> + +<h2>$this->ftp->connect()</h2> + +<p>Connects and logs into to the FTP server. Connection preferences are set by passing an array +to the function, or you can store them in a config file.</p> + + +<p>Here is an example showing how you set preferences manually:</p> + +<code> +$this->load->library('ftp');<br /> +<br /> +$config['hostname'] = 'ftp.example.com';<br /> +$config['username'] = 'your-username';<br /> +$config['password'] = 'your-password';<br /> +$config['port']&nbsp;&nbsp;&nbsp;&nbsp; = 21;<br /> +$config['passive']&nbsp;&nbsp;= FALSE;<br /> +$config['debug']&nbsp;&nbsp;&nbsp;&nbsp;= TRUE;<br /> +<br /> +$this->ftp->connect($config);<br /> +</code> + +<h3>Setting FTP Preferences in a Config File</h3> + +<p>If you prefer you can store your FTP preferences in a config file. +Simply create a new file called the <var>ftp.php</var>, add the <var>$config</var> +array in that file. Then save the file at <var>config/ftp.php</var> and it will be used automatically.</p> + +<h3>Available connection options:</h3> + + +<ul> +<li><strong>hostname</strong> - the FTP hostname. Usually something like:&nbsp; <dfn>ftp.example.com</dfn></li> +<li><strong>username</strong> - the FTP username.</li> +<li><strong>password</strong> - the FTP password.</li> +<li><strong>port</strong> - The port number. Set to <dfn>21</dfn> by default.</li> +<li><strong>debug</strong> - <kbd>TRUE/FALSE</kbd> (boolean). Whether to enable debugging to display error messages.</li> +<li><strong>passive</strong> - <kbd>TRUE/FALSE</kbd> (boolean). Whether to use passive mode. Passive is set automatically by default.</li> +</ul> + + + +<h2>$this->ftp->upload()</h2> + +<p>Uploads a file to your server. You must supply the local path and the remote path, and you can optionally set the mode and permissions. +Example:</p> + + +<code>$this->ftp->upload('/local/path/to/myfile.html', '/public_html/myfile.html', 'ascii', 0775);</code> + +<p><strong>Mode options are:</strong>&nbsp; <kbd>ascii</kbd>, <kbd>binary</kbd>, and <kbd>auto</kbd> (the default). If +<kbd>auto</kbd> is used it will base the mode on the file extension of the source file.</p> + +<p>Permissions can be passed as an <kbd>octal</kbd> value in the fourth parameter.</p> + +<h2>$this->ftp->download()</h2> + +<p>Downloads a file from your server. You must supply the remote path and the local path, and you can optionally set the mode. +Example:</p> + +<code>$this->ftp->download('/public_html/myfile.html', '/local/path/to/myfile.html', 'ascii');</code> + +<p><strong>Mode options are:</strong>&nbsp; <kbd>ascii</kbd>, <kbd>binary</kbd>, and <kbd>auto</kbd> (the default). If +<kbd>auto</kbd> is used it will base the mode on the file extension of the source file.</p> + +<p>Returns FALSE if the download does not execute successfully (including if PHP does not have permission to write the local file)</p> + + +<h2>$this->ftp->rename()</h2> +<p>Permits you to rename a file. Supply the source file name/path and the new file name/path.</p> + +<code> +// Renames green.html to blue.html<br /> +$this->ftp->rename('/public_html/foo/green.html', '/public_html/foo/blue.html'); +</code> + +<h2>$this->ftp->move()</h2> +<p>Lets you move a file. Supply the source and destination paths:</p> + +<code> +// Moves blog.html from "joe" to "fred"<br /> +$this->ftp->move('/public_html/joe/blog.html', '/public_html/fred/blog.html'); +</code> + +<p>Note: if the destination file name is different the file will be renamed.</p> + + +<h2>$this->ftp->delete_file()</h2> +<p>Lets you delete a file. Supply the source path with the file name.</p> + +<code> +$this->ftp->delete_file('/public_html/joe/blog.html'); +</code> + + +<h2>$this->ftp->delete_dir()</h2> +<p>Lets you delete a directory and everything it contains. Supply the source path to the directory with a trailing slash.</p> + +<p class="important"><strong>Important</strong>&nbsp; Be VERY careful with this function. It will recursively delete +<b>everything</b> within the supplied path, including sub-folders and all files. Make absolutely sure your path is correct. +Try using the <kbd>list_files()</kbd> function first to verify that your path is correct.</p> + +<code> +$this->ftp->delete_dir('/public_html/path/to/folder/'); +</code> + + + +<h2>$this->ftp->list_files()</h2> +<p>Permits you to retrieve a list of files on your server returned as an <dfn>array</dfn>. You must supply +the path to the desired directory.</p> + +<code> +$list = $this->ftp->list_files('/public_html/');<br /> +<br /> +print_r($list); +</code> + + +<h2>$this->ftp->mirror()</h2> + +<p>Recursively reads a local folder and everything it contains (including sub-folders) and creates a +mirror via FTP based on it. Whatever the directory structure of the original file path will be recreated on the server. +You must supply a source path and a destination path:</p> + +<code> +$this->ftp->mirror('/path/to/myfolder/', '/public_html/myfolder/'); +</code> + + + +<h2>$this->ftp->mkdir()</h2> + +<p>Lets you create a directory on your server. Supply the path ending in the folder name you wish to create, with a trailing slash. +Permissions can be set by passed an <kbd>octal</kbd> value in the second parameter.</p> + +<code> +// Creates a folder named "bar"<br /> +$this->ftp->mkdir('/public_html/foo/bar/', DIR_WRITE_MODE); +</code> + + +<h2>$this->ftp->chmod()</h2> + +<p>Permits you to set file permissions. Supply the path to the file or folder you wish to alter permissions on:</p> + +<code> +// Chmod "bar" to 777<br /> +$this->ftp->chmod('/public_html/foo/bar/', DIR_WRITE_MODE); +</code> + + + + +<h2>$this->ftp->close();</h2> +<p>Closes the connection to your server. It's recommended that you use this when you are finished uploading.</p> + + + + + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="form_validation.html">Form Validation Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="table.html">HTML Table Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/image_lib.html b/user_guide/libraries/image_lib.html new file mode 100644 index 0000000..2f714bc --- /dev/null +++ b/user_guide/libraries/image_lib.html @@ -0,0 +1,667 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Image Manipulation Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Image Manipulation Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Image Manipulation Class</h1> + +<p>CodeIgniter's Image Manipulation class lets you perform the following actions:</p> + +<ul> +<li>Image Resizing</li> +<li>Thumbnail Creation</li> +<li>Image Cropping</li> +<li>Image Rotating</li> +<li>Image Watermarking</li> +</ul> + +<p>All three major image libraries are supported: GD/GD2, NetPBM, and ImageMagick</p> + +<p class="important"><strong>Note:</strong> Watermarking is only available using the GD/GD2 library. +In addition, even though other libraries are supported, GD is required in +order for the script to calculate the image properties. The image processing, however, will be performed with the +library you specify.</p> + + +<h2>Initializing the Class</h2> + +<p>Like most other classes in CodeIgniter, the image class is initialized in your controller +using the <dfn>$this->load-&gt;library</dfn> function:</p> +<code>$this->load->library('image_lib');</code> + +<p>Once the library is loaded it will be ready for use. The image library object you will use to call all functions is: <dfn>$this->image_lib</dfn></p> + + +<h2>Processing an Image</h2> + +<p>Regardless of the type of processing you would like to perform (resizing, cropping, rotation, or watermarking), the general process is +identical. You will set some preferences corresponding to the action you intend to perform, then +call one of four available processing functions. For example, to create an image thumbnail you'll do this:</p> + +<code>$config['image_library'] = 'gd2';<br /> +$config['source_image'] = '/path/to/image/mypic.jpg';<br /> +$config['create_thumb'] = TRUE;<br /> +$config['maintain_ratio'] = TRUE;<br /> +$config['width'] = 75;<br /> +$config['height'] = 50;<br /> +<br /> +$this->load->library('image_lib', $config); +<br /> +<br /> +$this->image_lib->resize();</code> + +<p>The above code tells the <dfn>image_resize</dfn> function to look for an image called <em>mypic.jpg</em> +located in the <dfn>source_image</dfn> folder, then create a thumbnail that is 75 X 50 pixels using the GD2 <dfn>image_library</dfn>. +Since the <dfn>maintain_ratio</dfn> option is enabled, the thumb will be as close to the target <dfn>width</dfn> and +<dfn>height</dfn> as possible while preserving the original aspect ratio. The thumbnail will be called <em>mypic_thumb.jpg</em> +</p> + +<p class="important"><strong>Note:</strong> In order for the image class to be allowed to do any processing, the +folder containing the image files must have write permissions.</p> + +<p class="important"><strong>Note:</strong> Image processing can require a considerable amount of server memory for some operations. If you are experiencing out of memory errors while processing images you may need to limit their maximum size, and/or adjust PHP memory limits.</p> + +<h2>Processing Functions</h2> + +<p>There are four available processing functions:</p> + +<ul> +<li>$this->image_lib->resize()</li> +<li>$this->image_lib->crop()</li> +<li>$this->image_lib->rotate()</li> +<li>$this->image_lib->watermark()</li> +<li>$this-&gt;image_lib-&gt;clear()</li> +</ul> + +<p>These functions return boolean TRUE upon success and FALSE for failure. If they fail you can retrieve the +error message using this function:</p> + +<code>echo $this->image_lib->display_errors();</code> + +<p>A good practice is use the processing function conditionally, showing an error upon failure, like this:</p> + +<code>if ( ! $this->image_lib->resize())<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo $this->image_lib->display_errors();<br /> +}</code> + +<p>Note: You can optionally specify the HTML formatting to be applied to the errors, by submitting the opening/closing +tags in the function, like this:</p> + +<code>$this->image_lib->display_errors('<var>&lt;p></var>', '<var>&lt;/p></var>');</code> + + +<h2>Preferences</h2> + +<p>The preferences described below allow you to tailor the image processing to suit your needs.</p> + +<p>Note that not all preferences are available for every +function. For example, the x/y axis preferences are only available for image cropping. Likewise, the width and height +preferences have no effect on cropping. The "availability" column indicates which functions support a given preference.</p> + +<p>Availability Legend:</p> + +<ul> +<li><var>R</var> - Image Resizing</li> +<li><var>C</var> - Image Cropping</li> +<li><var>X</var> - Image Rotation</li> +<li><var>W</var> - Image Watermarking</li> + +</ul> + + + + + +<table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder"> +<tr> +<th>Preference</th> +<th>Default&nbsp;Value</th> +<th>Options</th> +<th>Description</th> +<th>Availability</th> +</tr> + +<tr> +<td class="td"><strong>image_library</strong></td> +<td class="td">GD2</td> +<td class="td">GD, GD2, ImageMagick, NetPBM</td> +<td class="td">Sets the image library to be used.</td> +<td class="td">R, C, X, W</td> +</tr> + +<tr> +<td class="td"><strong>library_path</strong></td> +<td class="td">None</td> +<td class="td">None</td> +<td class="td">Sets the server path to your ImageMagick or NetPBM library. If you use either of those libraries you must supply the path.</td> +<td class="td">R, C, X</td> +</tr> + +<tr> +<td class="td"><strong>source_image</strong></td> +<td class="td">None</td> +<td class="td">None</td> +<td class="td">Sets the source image name/path. The path must be a relative or absolute server path, not a URL.</td> +<td class="td">R, C, S, W</td> +</tr> + +<tr> +<td class="td"><strong>dynamic_output</strong></td> +<td class="td">FALSE</td> +<td class="td">TRUE/FALSE (boolean)</td> +<td class="td">Determines whether the new image file should be written to disk or generated dynamically. Note: If you choose the dynamic setting, only one image can be shown at a time, and it can't be positioned on the page. It simply outputs the raw image dynamically to your browser, along with image headers.</td> +<td class="td">R, C, X, W</td> +</tr> + + +<tr> +<td class="td"><strong>quality</strong></td> +<td class="td">90%</td> +<td class="td">1 - 100%</td> +<td class="td">Sets the quality of the image. The higher the quality the larger the file size.</td> +<td class="td">R, C, X, W</td> +</tr> + + +<tr> +<td class="td"><strong>new_image</strong></td> +<td class="td">None</td> +<td class="td">None</td> +<td class="td">Sets the destination image name/path. You'll use this preference when creating an image copy. The path must be a relative or absolute server path, not a URL.</td> +<td class="td">R, C, X, W</td> +</tr> + +<tr> +<td class="td"><strong>width</strong></td> +<td class="td">None</td> +<td class="td">None</td> +<td class="td">Sets the width you would like the image set to.</td> +<td class="td">R, C </td> +</tr> + +<tr> +<td class="td"><strong>height</strong></td> +<td class="td">None</td> +<td class="td">None</td> +<td class="td">Sets the height you would like the image set to.</td> +<td class="td">R, C </td> +</tr> + +<tr> +<td class="td"><strong>create_thumb</strong></td> +<td class="td">FALSE</td> +<td class="td">TRUE/FALSE (boolean)</td> +<td class="td">Tells the image processing function to create a thumb.</td> +<td class="td">R</td> +</tr> + +<tr> +<td class="td"><strong>thumb_marker</strong></td> +<td class="td">_thumb</td> +<td class="td">None</td> +<td class="td">Specifies the thumbnail indicator. It will be inserted just before the file extension, so mypic.jpg would become mypic_thumb.jpg</td> +<td class="td">R</td> +</tr> + +<tr> +<td class="td"><strong>maintain_ratio</strong></td> +<td class="td">TRUE</td> +<td class="td">TRUE/FALSE (boolean)</td> +<td class="td">Specifies whether to maintain the original aspect ratio when resizing or use hard values.</td> +<td class="td">R, C</td> +</tr> + + +<tr> +<td class="td"><strong>master_dim</strong></td> +<td class="td">auto</td> +<td class="td">auto, width, height</td> +<td class="td">Specifies what to use as the master axis when resizing or creating thumbs. For example, let's say you want to resize an image to 100 X 75 pixels. If the source image size does not allow perfect resizing to those dimensions, this setting determines which axis should be used as the hard value. "auto" sets the axis automatically based on whether the image is taller then wider, or vice versa.</td> +<td class="td">R</td> +</tr> + + + + +<tr> +<td class="td"><strong>rotation_angle</strong></td> +<td class="td">None</td> +<td class="td">90, 180, 270, vrt, hor</td> +<td class="td">Specifies the angle of rotation when rotating images. Note that PHP rotates counter-clockwise, so a 90 degree rotation to the right must be specified as 270.</td> +<td class="td">X</td> +</tr> + +<tr> +<td class="td"><strong>x_axis</strong></td> +<td class="td">None</td> +<td class="td">None</td> +<td class="td">Sets the X coordinate in pixels for image cropping. For example, a setting of 30 will crop an image 30 pixels from the left.</td> +<td class="td">C</td> +</tr> +<tr> +<td class="td"><strong>y_axis</strong></td> +<td class="td">None</td> +<td class="td">None</td> +<td class="td">Sets the Y coordinate in pixels for image cropping. For example, a setting of 30 will crop an image 30 pixels from the top.</td> +<td class="td">C</td> +</tr> + +</table> + + +<h2>Setting preferences in a config file</h2> + +<p>If you prefer not to set preferences using the above method, you can instead put them into a config file. +Simply create a new file called <var>image_lib.php</var>, add the <var>$config</var> +array in that file. Then save the file in: <var>config/image_lib.php</var> and it will be used automatically. You +will NOT need to use the <dfn>$this->image_lib->initialize</dfn> function if you save your preferences in a config file.</p> + + +<h2>$this->image_lib->resize()</h2> + +<p>The image resizing function lets you resize the original image, create a copy (with or without resizing), +or create a thumbnail image.</p> + +<p>For practical purposes there is no difference between creating a copy and creating +a thumbnail except a thumb will have the thumbnail marker as part of the name (ie, mypic_thumb.jpg).</p> + +<p>All preferences listed in the table above are available for this function except these three: rotation_angle, x_axis, and y_axis.</p> + +<h3>Creating a Thumbnail</h3> + +<p>The resizing function will create a thumbnail file (and preserve the original) if you set this preference to TRUE:</p> + +<code>$config['create_thumb'] = TRUE;</code> + +<p>This single preference determines whether a thumbnail is created or not.</p> + +<h3>Creating a Copy</h3> + +<p>The resizing function will create a copy of the image file (and preserve the original) if you set +a path and/or a new filename using this preference:</p> + +<code>$config['new_image'] = '/path/to/new_image.jpg';</code> + +<p>Notes regarding this preference:</p> +<ul> +<li>If only the new image name is specified it will be placed in the same folder as the original</li> +<li>If only the path is specified, the new image will be placed in the destination with the same name as the original.</li> +<li>If both the path and image name are specified it will placed in its own destination and given the new name.</li> +</ul> + + +<h3>Resizing the Original Image</h3> + +<p>If neither of the two preferences listed above (create_thumb, and new_image) are used, the resizing function will instead +target the original image for processing.</p> + + +<h2>$this->image_lib->crop()</h2> + +<p>The cropping function works nearly identically to the resizing function except it requires that you set +preferences for the X and Y axis (in pixels) specifying where to crop, like this:</p> + +<code>$config['x_axis'] = '100';<br /> +$config['y_axis'] = '40';</code> + +<p>All preferences listed in the table above are available for this function except these: rotation_angle, width, height, create_thumb, new_image.</p> + +<p>Here's an example showing how you might crop an image:</p> + +<code>$config['image_library'] = 'imagemagick';<br /> +$config['library_path'] = '/usr/X11R6/bin/';<br /> +$config['source_image'] = '/path/to/image/mypic.jpg';<br /> +$config['x_axis'] = '100';<br /> +$config['y_axis'] = '60';<br /> +<br /> +$this->image_lib->initialize($config); +<br /> +<br /> +if ( ! $this->image_lib->crop())<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo $this->image_lib->display_errors();<br /> +}</code> + + +<p>Note: Without a visual interface it is difficult to crop images, so this function is not very useful +unless you intend to build such an interface. That's exactly what we did using for the photo +gallery module in ExpressionEngine, the CMS we develop. We added a JavaScript UI that lets the cropping +area be selected.</p> + +<h2>$this->image_lib->rotate()</h2> + +<p>The image rotation function requires that the angle of rotation be set via its preference:</p> + +<code>$config['rotation_angle'] = '90';</code> + +<p>There are 5 rotation options:</p> + +<ol> +<li>90 - rotates counter-clockwise by 90 degrees.</li> +<li>180 - rotates counter-clockwise by 180 degrees.</li> +<li>270 - rotates counter-clockwise by 270 degrees.</li> +<li>hor - flips the image horizontally.</li> +<li>vrt - flips the image vertically.</li> +</ol> + +<p>Here's an example showing how you might rotate an image:</p> + +<code>$config['image_library'] = 'netpbm';<br /> +$config['library_path'] = '/usr/bin/';<br /> +$config['source_image'] = '/path/to/image/mypic.jpg';<br /> +$config['rotation_angle'] = 'hor';<br /> +<br /> +$this->image_lib->initialize($config); +<br /> +<br /> +if ( ! $this->image_lib->rotate())<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo $this->image_lib->display_errors();<br /> +}</code> + + + +<h2>$this-&gt;image_lib-&gt;clear()</h2> +<p>The clear function resets all of the values used when processing an image. You will want to call this if you are processing images in a loop.</p> +<p><code>$this-&gt;image_lib-&gt;clear();</code></p> +<p>&nbsp;</p> +<h1>Image Watermarking</h1> + +<p>The Watermarking feature requires the GD/GD2 library.</p> + + +<h2>Two Types of Watermarking</h2> + +<p>There are two types of watermarking that you can use:</p> + +<ul> +<li><strong>Text</strong>: The watermark message will be generating using text, either with a True Type font that you specify, or +using the native text output that the GD library supports. If you use the True Type version your GD installation +must be compiled with True Type support (most are, but not all).</li> + +<li><strong>Overlay</strong>: The watermark message will be generated by overlaying an image (usually a transparent PNG or GIF) +containing your watermark over the source image.</li> + +</ul> + + +<h2>Watermarking an Image</h2> + +<p>Just as with the other functions (resizing, cropping, and rotating) the general process for watermarking +involves setting the preferences corresponding to the action you intend to perform, then +calling the watermark function. Here is an example:</p> + +<code> +$config['source_image'] = '/path/to/image/mypic.jpg';<br /> +$config['wm_text'] = 'Copyright 2006 - John Doe';<br /> +$config['wm_type'] = 'text';<br /> +$config['wm_font_path'] = './system/fonts/texb.ttf';<br /> +$config['wm_font_size'] = '16';<br /> +$config['wm_font_color'] = 'ffffff';<br /> +$config['wm_vrt_alignment'] = 'bottom';<br /> +$config['wm_hor_alignment'] = 'center';<br /> +$config['wm_padding'] = '20';<br /> +<br /> +$this->image_lib->initialize($config); +<br /> +<br /> +$this->image_lib->watermark();</code> + + +<p>The above example will use a 16 pixel True Type font to create the text "Copyright 2006 - John Doe". The watermark +will be positioned at the bottom/center of the image, 20 pixels from the bottom of the image.</p> + +<p class="important"><strong>Note:</strong> In order for the image class to be allowed to do any processing, the image file must have &quot;write&quot; file permissions. For example, 777.</p> + + +<h2>Watermarking Preferences</h2> + +<p>This table shown the preferences that are available for both types of watermarking (text or overlay)</p> + +<table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder"> +<tr> +<th>Preference</th> +<th>Default&nbsp;Value</th> +<th>Options</th> +<th>Description</th> +</tr> + +<tr> +<td class="td"><strong>wm_type</strong></td> +<td class="td">text</td> +<td class="td">text, overlay</td> +<td class="td">Sets the type of watermarking that should be used.</td> +</tr> + +<tr> +<td class="td"><strong>source_image</strong></td> +<td class="td">None</td> +<td class="td">None</td> +<td class="td">Sets the source image name/path. The path must be a relative or absolute server path, not a URL.</td> +</tr> + +<tr> +<td class="td"><strong>dynamic_output</strong></td> +<td class="td">FALSE</td> +<td class="td">TRUE/FALSE (boolean)</td> +<td class="td">Determines whether the new image file should be written to disk or generated dynamically. Note: If you choose the dynamic setting, only one image can be shown at a time, and it can't be positioned on the page. It simply outputs the raw image dynamically to your browser, along with image headers.</td> +</tr> + +<tr> +<td class="td"><strong>quality</strong></td> +<td class="td">90%</td> +<td class="td">1 - 100%</td> +<td class="td">Sets the quality of the image. The higher the quality the larger the file size.</td> +</tr> + +<tr> +<td class="td"><strong>padding</strong></td> +<td class="td">None</td> +<td class="td">A number</td> +<td class="td">The amount of padding, set in pixels, that will be applied to the watermark to set it away from the edge of your images.</td> +</tr> + +<tr> +<td class="td"><strong>wm_vrt_alignment</strong></td> +<td class="td">bottom</td> +<td class="td">top, middle, bottom</td> +<td class="td">Sets the vertical alignment for the watermark image.</td> +</tr> + +<tr> +<td class="td"><strong>wm_hor_alignment</strong></td> +<td class="td">center</td> +<td class="td">left, center, right</td> +<td class="td">Sets the horizontal alignment for the watermark image.</td> +</tr> + +<tr> +<td class="td"><strong>wm_hor_offset</strong></td> +<td class="td">None</td> +<td class="td">None</td> +<td class="td">You may specify a horizontal offset (in pixels) to apply to the watermark position. The offset normally moves the watermark to the right, except if you have your alignment set to "right" then your offset value will move the watermark toward the left of the image.</td> +</tr> + +<tr> +<td class="td"><strong>wm_vrt_offset</strong></td> +<td class="td">None</td> +<td class="td">None</td> +<td class="td">You may specify a vertical offset (in pixels) to apply to the watermark position. The offset normally moves the watermark down, except if you have your alignment set to "bottom" then your offset value will move the watermark toward the top of the image.</td> +</tr> + +</table> + + + +<h3>Text Preferences</h3> +<p>This table shown the preferences that are available for the text type of watermarking.</p> + + +<table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder"> +<tr> +<th>Preference</th> +<th>Default&nbsp;Value</th> +<th>Options</th> +<th>Description</th> +</tr> + +<tr> +<td class="td"><strong>wm_text</strong></td> +<td class="td">None</td> +<td class="td">None</td> +<td class="td">The text you would like shown as the watermark. Typically this will be a copyright notice.</td> +</tr> + +<tr> +<td class="td"><strong>wm_font_path</strong></td> +<td class="td">None</td> +<td class="td">None</td> +<td class="td">The server path to the True Type Font you would like to use. If you do not use this option, the native GD font will be used.</td> +</tr> + +<tr> +<td class="td"><strong>wm_font_size</strong></td> +<td class="td">16</td> +<td class="td">None</td> +<td class="td">The size of the text. Note: If you are not using the True Type option above, the number is set using a range of 1 - 5. Otherwise, you can use any valid pixel size for the font you're using.</td> +</tr> + +<tr> +<td class="td"><strong>wm_font_color</strong></td> +<td class="td">ffffff</td> +<td class="td">None</td> +<td class="td">The font color, specified in hex. Note, you must use the full 6 character hex value (ie, 993300), rather than the three character abbreviated version (ie fff).</td> +</tr> + + +<tr> +<td class="td"><strong>wm_shadow_color</strong></td> +<td class="td">None</td> +<td class="td">None</td> +<td class="td">The color of the drop shadow, specified in hex. If you leave this blank a drop shadow will not be used. Note, you must use the full 6 character hex value (ie, 993300), rather than the three character abbreviated version (ie fff).</td> +</tr> + +<tr> +<td class="td"><strong>wm_shadow_distance</strong></td> +<td class="td">3</td> +<td class="td">None</td> +<td class="td">The distance (in pixels) from the font that the drop shadow should appear.</td> +</tr> + +</table> + + + + +<h3>Overlay Preferences</h3> +<p>This table shown the preferences that are available for the overlay type of watermarking.</p> + + +<table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder"> +<tr> +<th>Preference</th> +<th>Default&nbsp;Value</th> +<th>Options</th> +<th>Description</th> +</tr> + +<tr> +<td class="td"><strong>wm_overlay_path</strong></td> +<td class="td">None</td> +<td class="td">None</td> +<td class="td">The server path to the image you wish to use as your watermark. Required only if you are using the overlay method.</td> +</tr> + +<tr> +<td class="td"><strong>wm_opacity</strong></td> +<td class="td">50</td> +<td class="td">1 - 100</td> +<td class="td">Image opacity. You may specify the opacity (i.e. transparency) of your watermark image. This allows the watermark to be faint and not completely obscure the details from the original image behind it. A 50% opacity is typical.</td> +</tr> + +<tr> +<td class="td"><strong>wm_x_transp</strong></td> +<td class="td">4</td> +<td class="td">A number</td> +<td class="td">If your watermark image is a PNG or GIF image, you may specify a color on the image to be "transparent". This setting (along with the next) will allow you to specify that color. This works by specifying the "X" and "Y" coordinate pixel (measured from the upper left) within the image that corresponds to a pixel representative of the color you want to be transparent.</td> +</tr> + +<tr> +<td class="td"><strong>wm_y_transp</strong></td> +<td class="td">4</td> +<td class="td">A number</td> +<td class="td">Along with the previous setting, this allows you to specify the coordinate to a pixel representative of the color you want to be transparent.</td> +</tr> +</table> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="table.html">HTML Table Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="input.html">Input Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/input.html b/user_guide/libraries/input.html new file mode 100644 index 0000000..1a7087e --- /dev/null +++ b/user_guide/libraries/input.html @@ -0,0 +1,295 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Input Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Input Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Input Class</h1> + +<p>The Input Class serves two purposes:</p> + +<ol> +<li>It pre-processes global input data for security.</li> +<li>It provides some helper functions for fetching input data and pre-processing it.</li> +</ol> + +<p class="important"><strong>Note:</strong> This class is initialized automatically by the system so there is no need to do it manually.</p> + + +<h2>Security Filtering</h2> + +<p>The security filtering function is called automatically when a new <a href="../general/controllers.html">controller</a> is invoked. It does the following:</p> + +<ul> +<li>If $config['allow_get_array'] is FALSE(default is TRUE), destroys the global GET array.</li> +<li>Destroys all global variables in the event register_globals is turned on.</li> +<li>Filters the GET/POST/COOKIE array keys, permitting only alpha-numeric (and a few other) characters.</li> +<li>Provides XSS (Cross-site Scripting Hacks) filtering. This can be enabled globally, or upon request.</li> +<li>Standardizes newline characters to \n(In Windows \r\n)</li> +</ul> + + +<h2>XSS Filtering</h2> + +<p>The Input class has the ability to filter input automatically to prevent cross-site scripting attacks. If you want the filter to run automatically every time it encounters POST or COOKIE data you can enable it by opening your +<kbd>application/config/config.php</kbd> file and setting this:</p> + +<code>$config['global_xss_filtering'] = TRUE;</code> + +<p>Please refer to the <a href="security.html">Security class</a> documentation for information on using XSS Filtering in your application.</p> + + +<h2>Using POST, COOKIE, or SERVER Data</h2> + +<p>CodeIgniter comes with three helper functions that let you fetch POST, COOKIE or SERVER items. The main advantage of using the provided +functions rather than fetching an item directly ($_POST['something']) is that the functions will check to see if the item is set and +return false (boolean) if not. This lets you conveniently use data without having to test whether an item exists first. +In other words, normally you might do something like this:</p> + +<code> +if ( ! isset($_POST['something']))<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$something = FALSE;<br /> +}<br /> +else<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$something = $_POST['something'];<br /> +}</code> + +<p>With CodeIgniter's built in functions you can simply do this:</p> + +<code>$something = $this->input->post('something');</code> + +<p>The three functions are:</p> + +<ul> +<li>$this->input->post()</li> +<li>$this->input->cookie()</li> +<li>$this->input->server()</li> +</ul> + +<h2>$this->input->post()</h2> + +<p>The first parameter will contain the name of the POST item you are looking for:</p> + +<code>$this->input->post('some_data');</code> + +<p>The function returns FALSE (boolean) if the item you are attempting to retrieve does not exist.</p> + +<p>The second optional parameter lets you run the data through the XSS filter. It's enabled by setting the second parameter to boolean TRUE;</p> + +<code>$this->input->post('some_data', TRUE);</code> + +<p>To return an array of all POST items call without any parameters.</p> +<p>To return all POST items and pass them through the XSS filter set the first parameter NULL while setting the second parameter to boolean;</p> +<p>The function returns FALSE (boolean) if there are no items in the POST.</p> + +<code> + $this->input->post(NULL, TRUE); // returns all POST items with XSS filter + <br /> + $this->input->post(); // returns all POST items without XSS filter +</code> + +<h2>$this->input->get()</h2> + +<p>This function is identical to the post function, only it fetches get data:</p> + +<code>$this->input->get('some_data', TRUE);</code> + +<p>To return an array of all GET items call without any parameters.</p> +<p>To return all GET items and pass them through the XSS filter set the first parameter NULL while setting the second parameter to boolean;</p> +<p>The function returns FALSE (boolean) if there are no items in the GET.</p> + +<code> + $this->input->get(NULL, TRUE); // returns all GET items with XSS filter + <br /> + $this->input->get(); // returns all GET items without XSS filtering +</code> + +<h2>$this->input->get_post()</h2> + +<p>This function will search through both the post and get streams for data, looking first in post, and then in get:</p> + +<code>$this->input->get_post('some_data', TRUE);</code> + +<h2>$this->input->cookie()</h2> + +<p>This function is identical to the post function, only it fetches cookie data:</p> + +<code>$this->input->cookie('some_data', TRUE);</code> + +<h2>$this->input->server()</h2> + +<p>This function is identical to the above functions, only it fetches server data:</p> + +<code>$this->input->server('some_data');</code> + + +<h2>$this->input->set_cookie()</h2> + +<p>Sets a cookie containing the values you specify. There are two ways to pass information to this function so that a cookie can be set: +Array Method, and Discrete Parameters:</p> + +<h4>Array Method</h4> + +<p>Using this method, an associative array is passed to the first parameter:</p> + +<code>$cookie = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'name'&nbsp;&nbsp;&nbsp;=> 'The Cookie Name',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'value'&nbsp;&nbsp;=> 'The Value',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'expire' => '86500',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'domain' => '.some-domain.com',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'path'&nbsp;&nbsp;&nbsp;=> '/',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'prefix' => 'myprefix_',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'secure' => TRUE<br /> +);<br /> +<br /> +$this->input->set_cookie($cookie); +</code> + +<p><strong>Notes:</strong></p> + +<p>Only the name and value are required. To delete a cookie set it with the expiration blank.</p> + +<p>The expiration is set in <strong>seconds</strong>, which will be added to the current time. Do not include the time, but rather only the +number of seconds from <em>now</em> that you wish the cookie to be valid. If the expiration is set to +zero the cookie will only last as long as the browser is open.</p> +<p>For site-wide cookies regardless of how your site is requested, add your URL to the <strong>domain</strong> starting with a period, like this: .your-domain.com</p> +<p>The path is usually not needed since the function sets a root path.</p> +<p>The prefix is only needed if you need to avoid name collisions with other identically named cookies for your server.</p> +<p>The secure boolean is only needed if you want to make it a secure cookie by setting it to TRUE.</p> + +<h4>Discrete Parameters</h4> + +<p>If you prefer, you can set the cookie by passing data using individual parameters:</p> + +<code>$this->input->set_cookie($name, $value, $expire, $domain, $path, $prefix, $secure);</code> + +<h2>$this->input->cookie()</h2> + +<p>Lets you fetch a cookie. The first parameter will contain the name of the cookie you are looking for (including any prefixes):</p> + +<code>cookie('some_cookie');</code> + +<p>The function returns FALSE (boolean) if the item you are attempting to retrieve does not exist.</p> + +<p>The second optional parameter lets you run the data through the XSS filter. It's enabled by setting the second parameter to boolean TRUE;</p> + +<p><code>cookie('some_cookie', TRUE);</code></p> + + +<h2>$this->input->ip_address()</h2> +<p>Returns the IP address for the current user. If the IP address is not valid, the function will return an IP of: 0.0.0.0</p> +<code>echo $this->input->ip_address();</code> + + +<h2>$this->input->valid_ip(<var>$ip</var>)</h2> + +<p>Takes an IP address as input and returns TRUE or FALSE (boolean) if it is valid or not. Note: The $this->input->ip_address() function above +validates the IP automatically.</p> + +<code>if ( ! $this-&gt;input-&gt;valid_ip($ip))<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp; echo 'Not Valid';<br /> +}<br /> +else<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp; echo 'Valid';<br /> +}</code> +<p>Accepts an optional second string parameter of "IPv4" or "IPv6" to specify an IP format. The default checks for both formats.</p> + +<h2>$this->input->user_agent()</h2> +<p>Returns the user agent (web browser) being used by the current user. Returns FALSE if it's not available.</p> +<code>echo $this->input->user_agent();</code> +<p>See the <a href="user_agent.html">User Agent Class</a> for methods which extract information from the user agent string.</p> + +<h2>$this->input->request_headers()</h2> +<p>Useful if running in a non-Apache environment where <a href="http://php.net/apache_request_headers">apache_request_headers()</a> will not be supported. Returns an array of headers.</p> + +<code>$headers = $this->input->request_headers();</code> + +<h2>$this->input->get_request_header();</h2> +<p>Returns a single member of the request headers array.</p> + +<code>$this->input->get_request_header('some-header', TRUE);</code> + + +<h2>$this->input->is_ajax_request()</h2> +<p>Checks to see if the <var>HTTP_X_REQUESTED_WITH</var> server header has been set, and returns a boolean response.</p> + + +<h2>$this->input->is_cli_request()</h2> +<p>Checks to see if the <var>STDIN</var> constant is set, which is a failsafe way to see if PHP is being run on the command line.</p> + +<code>$this->input->is_cli_request()</code> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="image_lib.html">Image Manipulation Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="loader.html">Loader Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/javascript.html b/user_guide/libraries/javascript.html new file mode 100644 index 0000000..b6b108f --- /dev/null +++ b/user_guide/libraries/javascript.html @@ -0,0 +1,247 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<title>JavaScript Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="153" height="44" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +<a href="../general/drivers.html">Drivers</a> &nbsp;&#8250;&nbsp; +JavaScript Driver +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<p class="important"><strong>Note:</strong> This driver is experimental. Its feature set and implementation may change in future releases.</p><br> + +<h1>Javascript Class</h1> +<p>CodeIgniter provides a library to help you with certain common functions that you may want to use with Javascript. Please note that CodeIgniter does not require the jQuery library to run, and that any scripting library will work equally well. The jQuery library is simply presented as a convenience if you choose to use it.</p> +<h2>Initializing the Class</h2> +<p>To initialize the Javascript class manually in your controller constructor, use the <dfn>$this-&gt;load-&gt;library</dfn> function. Currently, the only available library is jQuery, which will automatically be loaded like this:</p> + +<code>$this-&gt;load-&gt;library('javascript');</code> + +<p>The Javascript class also accepts parameters, <dfn>js_library_driver (string) default 'jquery'</dfn> and <dfn>autoload (bool) default TRUE</dfn>. You may override the defaults if you wish by sending an associative array:</p> + +<code>$this-&gt;load-&gt;library('javascript', array('js_library_driver' =&gt; 'scripto', 'autoload' =&gt; FALSE));</code> + +<p>Again, presently only 'jquery' is available. You may wish to set <dfn>autoload</dfn> to FALSE, though, if you do not want the jQuery library to automatically include a script tag for the main jQuery script file. This is useful if you are loading it from a location outside of CodeIgniter, or already have the script tag in your markup.</p> + +<p>Once loaded, the jQuery library object will be available using: <dfn>$this-&gt;javascript</dfn></p> +<h2>Setup and Configuration</h2> +<h3>Set these variables in your view</h3> +<p>As a Javascript library, your files must be available to your application.</p> +<p>As Javascript is a client side language, the library must be able to write content into your final output. This generally means a view. You'll need to include the following variables in the &lt;head&gt; sections of your output.</p> +<p><code>&lt;?php echo $library_src;?&gt;<br /> +&lt;?php echo $script_head;?&gt; +</code></p> +<p>$library_src, is where the actual library file will be loaded, as well as any subsequent plugin script calls; $script_head is where specific events, functions and other commands will be rendered.</p> +<h3>Set the path to the librarys with config items</h3> +<p>There are some configuration items in Javascript library. These can either be set in application/config.php, within its own config/javascript.php file, or within any controller usings the set_item() function. </p> +<p>An image to be used as an &quot;ajax loader&quot;, or progress indicator. Without one, the simple text message of &quot;loading&quot; will appear when Ajax calls need to be made.</p> +<p><code>$config['javascript_location'] = 'http://localhost/codeigniter/themes/js/jquery/';<br /> + $config['javascript_ajax_img'] = 'images/ajax-loader.gif';</code></p> +<p>If you keep your files in the same directories they were downloaded from, then you need not set this configuration items.</p> + +<h2>The jQuery Class</h2> + +<p>To initialize the jQuery class manually in your controller constructor, use the <dfn>$this-&gt;load-&gt;library</dfn> function:</p> + +<code>$this-&gt;load-&gt;library('jquery');</code> + +<p>You may send an optional parameter to determine whether or not a script tag for the main jQuery file will be automatically included when loading the library. It will be created by default. To prevent this, load the library as follows:</p> + +<code>$this-&gt;load-&gt;library('jquery', FALSE);</code> + +<p>Once loaded, the jQuery library object will be available using: <dfn>$this-&gt;jquery</dfn></p> + +<h2>jQuery Events</h2> + +<p>Events are set using the following syntax.</p> + +<p><code>$this-&gt;jquery-&gt;event('element_path', code_to_run());</code></p> + +<p>In the above example:</p> + +<ul> + <li>&quot;event&quot; is any of blur, change, click, dblclick, error, focus, hover, keydown, keyup, load, mousedown, mouseup, mouseover, mouseup, resize, scroll, or unload.</li> + <li>&quot;element_path&quot; is any valid <a href="http://docs.jquery.com/Selectors">jQuery selector</a>. Due to jQuery's unique selector syntax, this is usually an element id, or CSS selector. For example &quot;#notice_area&quot; would effect &lt;div id=&quot;notice_area&quot;&gt;, and &quot;#content a.notice&quot; would effect all anchors with a class of &quot;notice&quot; in the div with id &quot;content&quot;.</li> + <li>&quot;code_to_run()&quot; is script your write yourself, or an action such as an effect from the jQuery library below.</li> + </ul> + +<h2>Effects</h2> + +<p>The query library supports a powerful <a href="http://docs.jquery.com/Effects">Effects</a> repertoire. Before an effect can be used, it must be loaded:</p> + +<p><code>$this->jquery->effect([optional path] plugin name); +// for example +$this->jquery->effect('bounce'); +</code></p> + +<h3>hide() / show()</h3> + +<p>Each of this functions will affect the visibility of an item on your page. hide() will set an item invisible, show() will reveal it.</p> +<p><code>$this-&gt;jquery-&gt;hide(target, optional speed, optional extra information);<br /> + $this-&gt;jquery-&gt;show(target, optional speed, optional extra information);</code></p> + +<ul> + <li>&quot;target&quot; will be any valid jQuery selector or selectors.</li> + <li>&quot;speed&quot; is optional, and is set to either slow, normal, fast, or alternatively a number of milliseconds.</li> + <li>&quot;extra information&quot; is optional, and could include a callback, or other additional information.</li> +</ul> + +<h3>toggle()</h3> + +<p>toggle() will change the visibility of an item to the opposite of its current state, hiding visible elements, and revealing hidden ones.</p> +<p><code>$this-&gt;jquery-&gt;toggle(target);</code></p> +<ul> + <li>&quot;target&quot; will be any valid jQuery selector or selectors.</li> +</ul> + +<h3>animate()</h3> + +<p><code> $this-&gt;jquery-&gt;animate(target, parameters, optional speed, optional extra information);</code></p> +<ul> + <li>&quot;target&quot; will be any valid jQuery selector or selectors.</li> + <li>&quot;parameters&quot; in jQuery would generally include a series of CSS properties that you wish to change.</li> + <li>&quot;speed&quot; is optional, and is set to either slow, normal, fast, or alternatively a number of milliseconds.</li> + <li>&quot;extra information&quot; is optional, and could include a callback, or other additional information.</li> +</ul> +<p>For a full summary, see <a href="http://docs.jquery.com/Effects/animate">http://docs.jquery.com/Effects/animate</a></p> +<p>Here is an example of an animate() called on a div with an id of &quot;note&quot;, and triggered by a click using the jQuery library's click() event.</p> +<p><code> $params = array(<br /> + 'height' =&gt; 80,<br /> + 'width' =&gt; '50%',<br /> + 'marginLeft' =&gt; 125<br /> +);<br /> +$this-&gt;jquery-&gt;click('#trigger', $this-&gt;jquery-&gt;animate('#note', $params, normal));</code></p> + +<h3>fadeIn() / fadeOut()</h3> + +<p><code>$this-&gt;jquery-&gt;fadeIn(target, optional speed, optional extra information);<br /> + $this-&gt;jquery-&gt;fadeOut(target, optional speed, optional extra information);</code></p> +<ul> + <li>&quot;target&quot; will be any valid jQuery selector or selectors.</li> + <li>&quot;speed&quot; is optional, and is set to either slow, normal, fast, or alternatively a number of milliseconds.</li> + <li>&quot;extra information&quot; is optional, and could include a callback, or other additional information.</li> +</ul> + +<h3>toggleClass()</h3> + +<p>This function will add or remove a CSS class to its target.</p> +<p><code>$this-&gt;jquery-&gt;toggleClass(target, class)</code></p> +<ul> + <li>&quot;target&quot; will be any valid jQuery selector or selectors.</li> + <li>&quot;class&quot; is any CSS classname. Note that this class must be defined and available in a CSS that is already loaded.</li> + </ul> + +<h3>fadeIn() / fadeOut()</h3> + +<p>These effects cause an element(s) to disappear or reappear over time.</p> +<p><code>$this-&gt;jquery-&gt;fadeIn(target, optional speed, optional extra information);<br /> + $this-&gt;jquery-&gt;fadeOut(target, optional speed, optional extra information);</code></p> +<ul> + <li>&quot;target&quot; will be any valid jQuery selector or selectors.</li> + <li>&quot;speed&quot; is optional, and is set to either slow, normal, fast, or alternatively a number of milliseconds.</li> + <li>&quot;extra information&quot; is optional, and could include a callback, or other additional information.</li> +</ul> + +<h3>slideUp() / slideDown() / slideToggle()</h3> + +<p>These effects cause an element(s) to slide.</p> +<p><code>$this-&gt;jquery-&gt;slideUp(target, optional speed, optional extra information);<br /> + $this-&gt;jquery-&gt;slideDown(target, optional speed, optional extra information);<br /> +$this-&gt;jquery-&gt;slideToggle(target, optional speed, optional extra information);</code></p> +<ul> + <li>&quot;target&quot; will be any valid jQuery selector or selectors.</li> + <li>&quot;speed&quot; is optional, and is set to either slow, normal, fast, or alternatively a number of milliseconds.</li> + <li>&quot;extra information&quot; is optional, and could include a callback, or other additional information.</li> +</ul> + +<h2>Plugins</h2> + +<p> + +<p>Some select jQuery plugins are made available using this library.</p> + +<h3>corner()</h3> +<p>Used to add distinct corners to page elements. For full details see <a href="http://www.malsup.com/jquery/corner/">http://www.malsup.com/jquery/corner/</a></p> +<p><code>$this-&gt;jquery-&gt;corner(target, corner_style);</code></p> +<ul> + <li>&quot;target&quot; will be any valid jQuery selector or selectors.</li> + <li>&quot;corner_style&quot; is optional, and can be set to any valid style such as round, sharp, bevel, bite, dog, etc. Individual corners can be set by following the style with a space and using &quot;tl&quot; (top left), &quot;tr&quot; (top right), &quot;bl&quot; (bottom left), or &quot;br&quot; (bottom right).</li> +</ul> +<p><code>$this-&gt;jquery-&gt;corner(&quot;#note&quot;, &quot;cool tl br&quot;);</code></p> + +<h3>tablesorter()</h3> + +<p>description to come</p> + +<h3>modal()</h3> + +<p>description to come</p> + +<h3>calendar()</h3> + +<p>description to come</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="../database/index.html">Database Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="../helpers/array_helper.html">Array Helper</a></p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/language.html b/user_guide/libraries/language.html new file mode 100644 index 0000000..1360383 --- /dev/null +++ b/user_guide/libraries/language.html @@ -0,0 +1,137 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Language Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Language Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Language Class</h1> + +<p>The Language Class provides functions to retrieve language files and lines of text for purposes of internationalization.</p> + +<p>In your CodeIgniter system folder you'll find one called <dfn>language</dfn> containing sets of language files. You can create +your own language files as needed in order to display error and other messages in other languages.</p> + +<p>Language files are typically stored in your <dfn>system/language</dfn> directory. Alternately you can create a folder called <kbd>language</kbd> inside +your <kbd>application</kbd> folder and store them there. CodeIgniter will look first in your <dfn>application/language</dfn> +directory. If the directory does not exist or the specified language is not located there CI will instead look in your global +<dfn>system/language</dfn> folder.</p> + +<p class="important"><strong>Note:</strong>&nbsp; Each language should be stored in its own folder. For example, the English files are located at: +<dfn>system/language/english</dfn></p> + + + +<h2>Creating Language Files</h2> + +<p>Language files must be named with <kbd>_lang.php</kbd> as the file extension. For example, let's say you want to create a file +containing error messages. You might name it: <kbd>error_lang.php</kbd></p> + +<p>Within the file you will assign each line of text to an array called <var>$lang</var> with this prototype:</p> + +<code>$lang['language_key'] = "The actual message to be shown";</code> + +<p><strong>Note:</strong> It's a good practice to use a common prefix for all messages in a given file to avoid collisions with +similarly named items in other files. For example, if you are creating error messages you might prefix them with <var>error_</var></p> + +<code>$lang['<var>error</var>_email_missing'] = "You must submit an email address";<br /> +$lang['<var>error</var>_url_missing'] = "You must submit a URL";<br /> +$lang['<var>error</var>_username_missing'] = "You must submit a username";</code> + + +<h2>Loading A Language File</h2> + +<p>In order to fetch a line from a particular file you must load the file first. Loading a language file is done with the following code:</p> + +<code>$this->lang->load('<samp>filename</samp>', '<dfn>language</dfn>');</code> + +<p>Where <samp>filename</samp> is the name of the file you wish to load (without the file extension), and <dfn>language</dfn> +is the language set containing it (ie, english). If the second parameter is missing, the default language set in your +<kbd>application/config/config.php</kbd> file will be used.</p> + + +<h2>Fetching a Line of Text</h2> + +<p>Once your desired language file is loaded you can access any line of text using this function:</p> + +<code>$this->lang->line('<samp>language_key</samp>');</code> + +<p>Where <samp>language_key</samp> is the array key corresponding to the line you wish to show.</p> + +<p>Note: This function simply returns the line. It does not echo it for you.</p> + +<h3>Using language lines as form labels</h3> + +<p class="important">This feature has been deprecated from the language library and moved to the <kbd>lang()</kbd> function of the <a href="../helpers/language_helper.html">Language helper</a>.</p> + +<h2>Auto-loading Languages</h2> +<p>If you find that you need a particular language globally throughout your application, you can tell CodeIgniter to <a href="../general/autoloader.html">auto-load</a> it during system initialization. This is done by opening the application/config/autoload.php file and adding the language(s) to the autoload array.</p> +<p>&nbsp;</p> +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="loader.html">Loader Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="output.html">Output Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/loader.html b/user_guide/libraries/loader.html new file mode 100644 index 0000000..a11910f --- /dev/null +++ b/user_guide/libraries/loader.html @@ -0,0 +1,273 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Loader Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Loader Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Loader Class</h1> + +<p>Loader, as the name suggests, is used to load elements. These elements can be libraries (classes) <a href="../general/views.html">View files</a>, +<a href="../general/helpers.html">Helpers</a>, <a href="../general/models.html">Models</a>, or your own files.</p> + +<p class="important"><strong>Note:</strong> This class is initialized automatically by the system so there is no need to do it manually.</p> + +<p>The following functions are available in this class:</p> + + +<h2>$this->load->library('<var>class_name</var>', <samp>$config</samp>, <kbd>'object name'</kbd>)</h2> + + +<p>This function is used to load core classes. Where <var>class_name</var> is the name of the class you want to load. +Note: We use the terms "class" and "library" interchangeably.</p> + +<p>For example, if you would like to send email with CodeIgniter, the first step is to load the email class within your controller:</p> + +<code>$this->load->library('email');</code> + +<p>Once loaded, the library will be ready for use, using <kbd>$this->email-></kbd><samp><em>some_function</em>()</samp>.</p> + +<p>Library files can be stored in subdirectories within the main "libraries" folder, or within your personal <dfn>application/libraries</dfn> folder. +To load a file located in a subdirectory, simply include the path, relative to the "libraries" folder. +For example, if you have file located at:</p> + +<code>libraries/flavors/chocolate.php</code> + +<p>You will load it using:</p> + +<code>$this->load->library('flavors/chocolate');</code> + +<p>You may nest the file in as many subdirectories as you want.</p> + +<p>Additionally, multiple libraries can be loaded at the same time by passing an array of libraries to the load function.</p> + +<code>$this->load->library(array('<var>email</var>', '<var>table</var>'));</code> + +<h3>Setting options</h3> + +<p>The second (optional) parameter allows you to optionally pass configuration setting. You will typically pass these as an array:</p> + +<code> +$config = array (<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'mailtype' => 'html',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'charset'&nbsp; => 'utf-8,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'priority' => '1'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +$this->load->library('email', $config);</code> + +<p>Config options can usually also be set via a config file. Each library is explained in detail in its own page, so please read the information regarding each one you would like to use.</p> + +<p>Please take note, when multiple libraries are supplied in an array for the first parameter, each will receive the same parameter information.</p> + +<h3>Assigning a Library to a different object name</h3> + +<p>If the third (optional) parameter is blank, the library will usually be assigned to an object with the same name as the library. For example, if the library is named <dfn>Session</dfn>, it +will be assigned to a variable named <dfn>$this->session</dfn>.</p> + +<p>If you prefer to set your own class names you can pass its value to the third parameter:</p> + +<code>$this->load->library('session', '', 'my_session');<br /><br /> + +// Session class is now accessed using:<br /><br /> + +$this->my_session + +</code> + +<p>Please take note, when multiple libraries are supplied in an array for the first parameter, this parameter is discarded.</p> + + +<h2>$this->load->view('<var>file_name</var>', <samp>$data</samp>, <kbd>true/false</kbd>)</h2> + +<p>This function is used to load your View files. If you haven't read the <a href="../general/views.html">Views</a> section of the +user guide it is recommended that you do since it shows you how this function is typically used.</p> + +<p>The first parameter is required. It is the name of the view file you would like to load. &nbsp;Note: The .php file extension does not need to be specified unless you use something other than <kbd>.php</kbd>.</p> + +<p>The second <strong>optional</strong> parameter can take +an associative array or an object as input, which it runs through the PHP <a href="http://www.php.net/extract">extract</a> function to +convert to variables that can be used in your view files. Again, read the <a href="../general/views.html">Views</a> page to learn +how this might be useful.</p> + +<p>The third <strong>optional</strong> parameter lets you change the behavior of the function so that it returns data as a string +rather than sending it to your browser. This can be useful if you want to process the data in some way. If you +set the parameter to <kbd>true</kbd> (boolean) it will return data. The default behavior is <kbd>false</kbd>, which sends it +to your browser. Remember to assign it to a variable if you want the data returned:</p> + +<code>$string = $this->load->view('<var>myfile</var>', '', <kbd>true</kbd>);</code> + + +<h2>$this-&gt;load-&gt;model('<var>Model_name</var>');</h2> +<p><code>$this-&gt;load-&gt;model('<var>Model_name</var>');</code></p> +<p>If your model is located in a sub-folder, include the relative path from your models folder. For example, if you have a model located at application/models/blog/queries.php you'll load it using:</p> +<p><code>$this-&gt;load-&gt;model('<var>blog/queries</var>');</code></p> +<p>If you would like your model assigned to a different object name you can specify it via the second parameter of the loading + function:</p> +<code> $this-&gt;load-&gt;model('<var>Model_name</var>', '<kbd>fubar</kbd>');<br /> +<br /> +$this-&gt;<kbd>fubar</kbd>-&gt;function();</code> +<h2>$this->load->database('<var>options</var>', <kbd>true/false</kbd>)</h2> +<p>This function lets you load the database class. The two parameters are <strong>optional</strong>. Please see the +<a href="../database/index.html">database</a> section for more info.</p> + + + + +<h2>$this->load->vars(<samp>$array</samp>)</h2> + +<p>This function takes an associative array as input and generates variables using the PHP <a href="http://www.php.net/extract">extract</a> function. +This function produces the same result as using the second parameter of the <dfn>$this->load->view()</dfn> function above. The reason you might +want to use this function independently is if you would like to set some global variables in the constructor of your controller +and have them become available in any view file loaded from any function. You can have multiple calls to this function. The data get cached +and merged into one array for conversion to variables. +</p> + + +<h2>$this->load->get_var(<samp>$key</samp>)</h2> + +<p>This function checks the associative array of variables available to your views. This is useful if for any reason a var is set in a library or another controller method using $this->load->vars(). +</p> + + +<h2>$this->load->helper('<var>file_name</var>')</h2> +<p>This function loads helper files, where <var>file_name</var> is the name of the file, without the <kbd>_helper.php</kbd> extension.</p> + + +<h2>$this->load->file('<var>filepath/filename</var>', <kbd>true/false</kbd>)</h2> +<p>This is a generic file loading function. Supply the filepath and name in the first parameter and it will open and read the file. +By default the data is sent to your browser, just like a View file, but if you set the second parameter to <kbd>true</kbd> (boolean) +it will instead return the data as a string.</p> + + +<h2>$this->load->language('<var>file_name</var>')</h2> +<p>This function is an alias of the <a href="language.html">language loading function</a>: $this->lang->load()</p> + +<h2>$this->load->config('<var>file_name</var>')</h2> +<p>This function is an alias of the <a href="config.html">config file loading function</a>: $this->config->load()</p> + + +<h2>Application "Packages"</h2> + +<p>An application package allows for the easy distribution of complete sets of resources in a single directory, complete with its own libraries, models, helpers, config, and language files. It is recommended that these packages be placed in the <dfn>application/third_party</dfn> folder. Below is a sample map of an package directory</p> + + +<h2>Sample Package "Foo Bar" Directory Map</h2> + +<p>The following is an example of a directory for an application package named "Foo Bar".</p> + +<code>/application/third_party/foo_bar<br /> +<br /> +config/<br /> +helpers/<br /> +language/<br /> +libraries/<br /> +models/<br /> +</code> + +<p>Whatever the purpose of the "Foo Bar" application package, it has its own config files, helpers, language files, libraries, and models. To use these resources in your controllers, you first need to tell the Loader that you are going to be loading resources from a package, by adding the package path.</p> + +<h3>$this->load->add_package_path()</h3> + +<p>Adding a package path instructs the Loader class to prepend a given path for subsequent requests for resources. As an example, the "Foo Bar" application package above has a library named <dfn>Foo_bar.php</dfn>. In our controller, we'd do the following:</p> + +<code>$this->load->add_package_path(<var>APPPATH</var>.'third_party/<var>foo_bar</var>/');<br /> +$this->load->library('foo_bar');</code> + +<h3>$this->load->remove_package_path()</h3> + +<p>When your controller is finished using resources from an application package, and particularly if you have other application packages you want to work with, you may wish to remove the package path so the Loader no longer looks in that folder for resources. To remove the last path added, simply call the method with no parameters.</p> + +<h3>$this->load->remove_package_path()</h3> + +<p>Or to remove a specific package path, specify the same path previously given to <kbd>add_package_path() for a package.</kbd>:</p> + +<code>$this->load->remove_package_path(<var>APPPATH</var>.'third_party/<var>foo_bar</var>/');</code> + +<h3>Package view files</h3> + +<p>By Default, package view files paths are set when <samp>add_package_path()</samp> is called. View paths are looped through, and once a match is encountered that view is loaded.</p> +<p>In this instance, it is possible for view naming collisions within packages to occur, and possibly the incorrect package being loaded. To ensure against this, set an optional second parameter of <var>FALSE</var> when calling <samp>add_package_path()</samp>.</p> + +<code> +$this->load->add_package_path(APPPATH.'my_app', TRUE);<br> +$this->load->view('my_app_index'); // Loads<br> +$this->load->view('welcome_message'); // Will not load the default welcome_message b/c the second param to add_package_path is TRUE<br> +<br> +// Reset things<br> +$this->load->remove_package_path(APPPATH.'my_app');<br> +<br> +// Again without the second parameter:<br> +$this->load->add_package_path(APPPATH.'my_app', TRUE);<br> +$this->load->view('my_app_index'); // Loads<br> +$this->load->view('welcome_message'); // Loads<br> +</code> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="input.html">Input Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="language.html">Language Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/migration.html b/user_guide/libraries/migration.html new file mode 100644 index 0000000..1564226 --- /dev/null +++ b/user_guide/libraries/migration.html @@ -0,0 +1,176 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Migration Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='CodeIgniter Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Migration Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Migration Class</h1> + +<p>Migrations are a convenient way for you to alter your database in a structured and organized manner. You could edit fragments of SQL by hand but you would then be responsible for telling other developers that they need to go and run them. You’d also have to keep track of which changes need to be run against the production machines next time you deploy.</p> + +<p>The database table <var>migration</var> tracks which migrations have already been run so all you have to do is update your application files and call <dfn>$this->migrate->current()</dfn> to work out which migrations should be run. The current version is found in <var>config/migration.php</var>.</p> + +<h2>Create a Migration</h2> + +<p>This will be the first migration for a new site which has a blog. All migrations go in the folder <var>application/migrations/</var> and have names such as: <kbd>001_add_blog.php</kbd>.</p> + +<pre> +defined('BASEPATH') OR exit('No direct script access allowed'); + +class Migration_Add_blog extends CI_Migration { + + public function up() + { + $this->dbforge->add_field(array( + 'blog_id' => array( + 'type' => 'INT', + 'constraint' => 5, + 'unsigned' => TRUE, + 'auto_increment' => TRUE + ), + 'blog_title' => array( + 'type' => 'VARCHAR', + 'constraint' => '100', + ), + 'blog_description' => array( + 'type' => 'TEXT', + 'null' => TRUE, + ), + )); + + $this->dbforge->create_table('blog'); + } + + public function down() + { + $this->dbforge->drop_table('blog'); + } +</pre> + +<p>Then in <var>application/config/migration.php</var> set <dfn>$config['migration_version'] = 1;</dfn>. + +<h2>Usage Example</h2> + +<p>In this example some simple code is placed in <var>application/controllers/migrate.php</var> to update the schema.</p> + +<pre> +$this->load->library('migration'); + +if ( ! $this->migration->current()) +{ + show_error($this->migration->error_string()); +} +</pre> + + +<h1>Function Reference</h1> + +<h2>$this->migration->current()</h2> + +<p>The current migration is whatever is set for <dfn>$config['migration_version']</dfn> in <var>application/config/migration.php</var>.</p> + + +<h2>$this->migration->latest()</h2> + +<p>This works much the same way as current() but instead of looking for the <dfn>$config['migration_version']</dfn> the Migration class will use the very newest migration found in the filesystem.</p> + +<h2>$this->migration->version()</h2> + +<p>Version can be used to roll back changes or step forwards programmatically to specific versions. It works just like current but ignores <dfn>$config['migration_version']</dfn>.</p> + +<pre> +$this->load->library('migration'); + +$this->migration->version(5); +</pre> + +<h2>Migration Preferences</h2> + +<p>The following is a list of all the config options for migrations.</p> + + +<table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder"> +<tr> +<th>Preference</th> +<th>Default&nbsp;Value</th> +<th>Options</th> +<th>Description</th> +</tr><tr> +<td class="td"><strong>migration_enabled</strong></td><td class="td">FALSE</td><td class="td">TRUE / FALSE</td><td class="td">Enable or disable migrations.</td> +</tr><tr> +<td class="td"><strong>migration_version</strong></td><td class="td">0</td><td class="td">None</td><td class="td">The current version your database should use.</td> +</tr><tr> +<td class="td"><strong>migration_path</strong></td><td class="td">APPPATH.'migrations/'</td><td class="td">None</td><td class="td">The path to your migrations folder.</td> +</tr> +</table> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="form_validation.html">Form Validation Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="table.html">HTML Table Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/output.html b/user_guide/libraries/output.html new file mode 100644 index 0000000..726fbdc --- /dev/null +++ b/user_guide/libraries/output.html @@ -0,0 +1,177 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Output Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Output Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Output Class</h1> + +<p>The Output class is a small class with one main function: To send the finalized web page to the requesting browser. It is +also responsible for <a href="../general/caching.html">caching</a> your web pages, if you use that feature.</p> + +<p class="important"><strong>Note:</strong> This class is initialized automatically by the system so there is no need to do it manually.</p> + +<p>Under normal circumstances you won't even notice the Output class since it works transparently without your intervention. +For example, when you use the <a href="../libraries/loader.html">Loader</a> class to load a view file, it's automatically +passed to the Output class, which will be called automatically by CodeIgniter at the end of system execution. +It is possible, however, for you to manually intervene with the output if you need to, using either of the two following functions:</p> + +<h2>$this->output->set_output();</h2> + +<p>Permits you to manually set the final output string. Usage example:</p> + +<code>$this->output->set_output($data);</code> + +<p><strong>Important:</strong> If you do set your output manually, it must be the last thing done in the function you call it from. +For example, if you build a page in one of your controller functions, don't set the output until the end.</p> + + +<h2>$this->output->set_content_type();</h2> + +<p>Permits you to set the mime-type of your page so you can serve JSON data, JPEG's, XML, etc easily.</p> + +<code>$this->output<br/> +&nbsp;&nbsp;&nbsp;&nbsp;->set_content_type('application/json')<br/> +&nbsp;&nbsp;&nbsp;&nbsp;->set_output(json_encode(array('foo' => 'bar')));<br/> +<br/> +$this->output<br/> +&nbsp;&nbsp;&nbsp;&nbsp;->set_content_type('jpeg') // You could also use ".jpeg" which will have the full stop removed before looking in config/mimes.php<br/> +&nbsp;&nbsp;&nbsp;&nbsp;->set_output(file_get_contents('files/something.jpg'));</code> + +<p><strong>Important:</strong> Make sure any non-mime string you pass to this method exists in config/mimes.php or it will have no effect.</p> + + +<h2>$this->output->get_output();</h2> + +<p>Permits you to manually retrieve any output that has been sent for storage in the output class. Usage example:</p> +<code>$string = $this->output->get_output();</code> + +<p>Note that data will only be retrievable from this function if it has been previously sent to the output class by one of the +CodeIgniter functions like <var>$this->load->view()</var>.</p> + + +<h2>$this->output->append_output();</h2> + +<p>Appends data onto the output string. Usage example:</p> + +<code>$this->output->append_output($data);</code> + + + +<h2>$this->output->set_header();</h2> + +<p>Permits you to manually set server headers, which the output class will send for you when outputting the final rendered display. Example:</p> + +<code> +$this->output->set_header("HTTP/1.0 200 OK");<br /> +$this->output->set_header("HTTP/1.1 200 OK");<br /> +$this->output->set_header('Last-Modified: '.gmdate('D, d M Y H:i:s', $last_update).' GMT');<br /> +$this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate");<br /> +$this->output->set_header("Cache-Control: post-check=0, pre-check=0");<br /> +$this->output->set_header("Pragma: no-cache"); </code> + + +<h2>$this->output->set_status_header(<var>code</var>, '<var>text</var>');</h2> + +<p>Permits you to manually set a server status header. Example:</p> + +<code>$this->output->set_status_header('401');<br /> +// Sets the header as: Unauthorized</code> + +<p><a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html">See here</a> for a full list of headers.</p> + +<h2>$this->output->enable_profiler();</h2> + +<p>Permits you to enable/disable the <a href="../general/profiling.html">Profiler</a>, which will display benchmark and other data +at the bottom of your pages for debugging and optimization purposes.</p> + +<p>To enable the profiler place the following function anywhere within your <a href="../general/controllers.html">Controller</a> functions:</p> +<code>$this->output->enable_profiler(TRUE);</code> + +<p>When enabled a report will be generated and inserted at the bottom of your pages.</p> + +<p>To disable the profiler you will use:</p> +<code>$this->output->enable_profiler(FALSE);</code> + +<h2>$this->output->set_profiler_sections();</h2> + +<p>Permits you to enable/disable specific sections of the Profiler when enabled. Please refer to the <a href="../general/profiling.html">Profiler</a> documentation for further information.</p> + +<h2>$this->output->cache();</h2> +<p>The CodeIgniter output library also controls caching. For more information, please see the <a href="../general/caching.html">caching documentation</a>.</p> + +<h2>Parsing Execution Variables</h2> + + <p>CodeIgniter will parse the pseudo-variables <var>{elapsed_time}</var> and <var>{memory_usage}</var> in your output by default. To disable this, set the <var>$parse_exec_vars</var> class property to <var>FALSE</var> in your controller. + + <code>$this->output->parse_exec_vars = FALSE;</code> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="language.html">Language Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="pagination.html">Pagination Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/pagination.html b/user_guide/libraries/pagination.html new file mode 100644 index 0000000..04e150a --- /dev/null +++ b/user_guide/libraries/pagination.html @@ -0,0 +1,233 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Pagination Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Pagination Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Pagination Class</h1> + +<p>CodeIgniter's Pagination class is very easy to use, and it is 100% customizable, either dynamically or via stored preferences.</p> + +<p>If you are not familiar with the term "pagination", it refers to links that allows you to navigate from page to page, like this:</p> + +<code><a href="#">&laquo; First</a>&nbsp;&nbsp;<a href="#">&lt;</a>&nbsp;<a href="#">1</a>&nbsp;<a href="#">2</a>&nbsp;<b>3</b>&nbsp;<a href="#">4</a>&nbsp;<a href="#">5</a>&nbsp;<a href="#">&gt;</a>&nbsp;&nbsp;<a href="#">Last &raquo;</a></code> + +<h2>Example</h2> + +<p>Here is a simple example showing how to create pagination in one of your <a href="../general/controllers.html">controller</a> functions:</p> + +<code> +$this->load->library('pagination');<br /><br /> +$config['base_url'] = 'http://example.com/index.php/test/page/';<br /> +$config['total_rows'] = 200;<br /> +$config['per_page'] = 20; +<br /><br /> +$this->pagination->initialize($config); + +<br /><br /> +echo $this->pagination->create_links();</code> + +<h3>Notes:</h3> + +<p>The <var>$config</var> array contains your configuration variables. It is passed to the <dfn>$this->pagination->initialize</dfn> function as shown above. Although there are some twenty items you can configure, at +minimum you need the three shown. Here is a description of what those items represent:</p> + +<ul> + <li><strong>base_url</strong> This is the full URL to the controller class/function containing your pagination. In the example + above, it is pointing to a controller called "Test" and a function called "page". Keep in mind that you can + <a href="../general/routing.html">re-route your URI</a> if you need a different structure.</li> + <li><strong>total_rows</strong> This number represents the total rows in the result set you are creating pagination for. + Typically this number will be the total rows that your database query returned. + </li> + <li><strong>per_page</strong> The number of items you intend to show per page. In the above example, you would be showing 20 items per page.</li> +</ul> + +<p>The <var>create_links()</var> function returns an empty string when there is no pagination to show.</p> + + +<h3>Setting preferences in a config file</h3> + +<p>If you prefer not to set preferences using the above method, you can instead put them into a config file. +Simply create a new file called <var>pagination.php</var>, add the <var>$config</var> +array in that file. Then save the file in: <var>config/pagination.php</var> and it will be used automatically. You +will NOT need to use the <dfn>$this->pagination->initialize</dfn> function if you save your preferences in a config file.</p> + + +<h2>Customizing the Pagination</h2> + +<p>The following is a list of all the preferences you can pass to the initialization function to tailor the display.</p> + + +<h4>$config['uri_segment'] = 3;</h4> + +<p>The pagination function automatically determines which segment of your URI contains the page number. If you need +something different you can specify it.</p> + +<h4>$config['num_links'] = 2;</h4> + +<p>The number of &quot;digit&quot; links you would like before and after the selected page number. For example, the number 2 + will place two digits on either side, as in the example links at the very top of this page.</p> + +<h4>$config['use_page_numbers'] = TRUE;</h4> +<p>By default, the URI segment will use the starting index for the items you are paginating. If you prefer to show the the actual page number, set this to TRUE.</p> + +<h4>$config['page_query_string'] = TRUE;</h4> +<p>By default, the pagination library assume you are using <a href="../general/urls.html">URI Segments</a>, and constructs your links something like</p> +<p><code>http://example.com/index.php/test/page/20</code></p> +<p>If you have $config['enable_query_strings'] set to TRUE your links will automatically be re-written using Query Strings. This option can also be explictly set. Using $config['page_query_string'] set to TRUE, the pagination link will become.</p> +<p><code>http://example.com/index.php?c=test&amp;m=page&amp;per_page=20</code></p> +<p>Note that &quot;per_page&quot; is the default query string passed, however can be configured using $config['query_string_segment'] = 'your_string'</p> +<h2>Adding Enclosing Markup</h2> + +<p>If you would like to surround the entire pagination with some markup you can do it with these two prefs:</p> + +<h4>$config['full_tag_open'] = '&lt;p>';</h4> +<p>The opening tag placed on the left side of the entire result.</p> + +<h4>$config['full_tag_close'] = '&lt;/p>';</h4> +<p>The closing tag placed on the right side of the entire result.</p> + + +<h2>Customizing the First Link</h2> + +<h4>$config['first_link'] = 'First';</h4> +<p>The text you would like shown in the "first" link on the left. If you do not want this link rendered, you can set its value to FALSE.</p> + +<h4>$config['first_tag_open'] = '&lt;div>';</h4> +<p>The opening tag for the "first" link.</p> + +<h4>$config['first_tag_close'] = '&lt;/div>';</h4> +<p>The closing tag for the "first" link.</p> + +<h2>Customizing the Last Link</h2> + +<h4>$config['last_link'] = 'Last';</h4> +<p>The text you would like shown in the "last" link on the right. If you do not want this link rendered, you can set its value to FALSE.</p> + +<h4>$config['last_tag_open'] = '&lt;div>';</h4> +<p>The opening tag for the "last" link.</p> + +<h4>$config['last_tag_close'] = '&lt;/div>';</h4> +<p>The closing tag for the "last" link.</p> + +<h2>Customizing the "Next" Link</h2> + +<h4>$config['next_link'] = '&amp;gt;';</h4> +<p>The text you would like shown in the "next" page link. If you do not want this link rendered, you can set its value to FALSE.</p> + +<h4>$config['next_tag_open'] = '&lt;div>';</h4> +<p>The opening tag for the "next" link.</p> + +<h4>$config['next_tag_close'] = '&lt;/div>';</h4> +<p>The closing tag for the "next" link.</p> + +<h2>Customizing the "Previous" Link</h2> + +<h4>$config['prev_link'] = '&amp;lt;';</h4> +<p>The text you would like shown in the "previous" page link. If you do not want this link rendered, you can set its value to FALSE.</p> + +<h4>$config['prev_tag_open'] = '&lt;div>';</h4> +<p>The opening tag for the "previous" link.</p> + +<h4>$config['prev_tag_close'] = '&lt;/div>';</h4> +<p>The closing tag for the "previous" link.</p> + +<h2>Customizing the "Current Page" Link</h2> + +<h4>$config['cur_tag_open'] = '&lt;b>';</h4> +<p>The opening tag for the "current" link.</p> + +<h4>$config['cur_tag_close'] = '&lt;/b>';</h4> +<p>The closing tag for the "current" link.</p> + + +<h2>Customizing the "Digit" Link</h2> + +<h4>$config['num_tag_open'] = '&lt;div>';</h4> +<p>The opening tag for the "digit" link.</p> + +<h4>$config['num_tag_close'] = '&lt;/div>';</h4> +<p>The closing tag for the "digit" link.</p> + +<h2>Hiding the Pages</h2> + +<p>If you wanted to not list the specific pages (for example, you only want "next" and "previous" links), you can suppress their rendering by adding:</p> + +<code> +$config['display_pages'] = FALSE; +</code> + + +<h2>Adding a class to every anchor</h2> + +<p>If you want to add a class attribute to every link rendered by the pagination class, you can set the config "anchor_class" equal to the classname you want.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="output.html">Output Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="sessions.html">Session Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/parser.html b/user_guide/libraries/parser.html new file mode 100644 index 0000000..3193df0 --- /dev/null +++ b/user_guide/libraries/parser.html @@ -0,0 +1,212 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Template Parser Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Template Parser Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + + + +<h1>Template Parser Class</h1> + +<p>The Template Parser Class enables you to parse pseudo-variables contained within your view files. It can parse simple +variables or variable tag pairs. If you've never used a template engine, pseudo-variables look like this:</p> + +<code>&lt;html&gt;<br /> +&lt;head&gt;<br /> +&lt;title&gt;<kbd>{blog_title}</kbd>&lt;/title&gt;<br /> +&lt;/head&gt;<br /> +&lt;body&gt;<br /> +<br /> +&lt;h3&gt;<kbd>{blog_heading}</kbd>&lt;/h3&gt;<br /> +<br /> +<kbd>{blog_entries}</kbd><br /> +&lt;h5&gt;<kbd>{title}</kbd>&lt;/h5&gt;<br /> +&lt;p&gt;<kbd>{body}</kbd>&lt;/p&gt;<br /> +<kbd>{/blog_entries}</kbd><br /> + +&lt;/body&gt;<br /> +&lt;/html&gt;</code> + +<p>These variables are not actual PHP variables, but rather plain text representations that allow you to eliminate +PHP from your templates (view files).</p> + +<p class="important"><strong>Note:</strong> CodeIgniter does <strong>not</strong> require you to use this class +since using pure PHP in your view pages lets them run a little faster. However, some developers prefer to use a template engine if +they work with designers who they feel would find some confusion working with PHP.</p> + +<p><strong>Also Note:</strong> The Template Parser Class is <strong>not</strong> a +full-blown template parsing solution. We've kept it very lean on purpose in order to maintain maximum performance.</p> + + +<h2>Initializing the Class</h2> + +<p>Like most other classes in CodeIgniter, the Parser class is initialized in your controller using the <dfn>$this->load->library</dfn> function:</p> + +<code>$this->load->library('parser');</code> +<p>Once loaded, the Parser library object will be available using: <dfn>$this->parser</dfn></p> + + +<p>The following functions are available in this library:</p> + +<h2>$this->parser->parse()</h2> + +<p>This method accepts a template name and data array as input, and it generates a parsed version. Example:</p> + +<code>$this->load->library('parser');<br /> +<br /> +$data = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'blog_title' => 'My Blog Title',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'blog_heading' => 'My Blog Heading'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +$this->parser->parse('blog_template', $data);</code> + +<p>The first parameter contains the name of the <a href="../general/views.html">view file</a> (in this example the file would be called blog_template.php), +and the second parameter contains an associative array of data to be replaced in the template. In the above example, the +template would contain two variables: {blog_title} and {blog_heading}</p> + +<p>There is no need to "echo" or do something with the data returned by <dfn>$this->parser->parse()</dfn>. It is automatically +passed to the output class to be sent to the browser. However, if you do want the data returned instead of sent to the output class you can +pass TRUE (boolean) to the third parameter:</p> + +<code>$string = $this->parser->parse('blog_template', $data, TRUE);</code> + +<h2>$this->parser->parse_string()</h2> + +<p>This method works exactly like parse(), only accepts a string as the first parameter in place of a view file.</p> + + +<h2>Variable Pairs</h2> + +<p>The above example code allows simple variables to be replaced. What if you would like an entire block of variables to be +repeated, with each iteration containing new values? Consider the template example we showed at the top of the page:</p> + +<code>&lt;html&gt;<br /> +&lt;head&gt;<br /> +&lt;title&gt;<kbd>{blog_title}</kbd>&lt;/title&gt;<br /> +&lt;/head&gt;<br /> +&lt;body&gt;<br /> +<br /> +&lt;h3&gt;<kbd>{blog_heading}</kbd>&lt;/h3&gt;<br /> +<br /> +<kbd>{blog_entries}</kbd><br /> +&lt;h5&gt;<kbd>{title}</kbd>&lt;/h5&gt;<br /> +&lt;p&gt;<kbd>{body}</kbd>&lt;/p&gt;<br /> +<kbd>{/blog_entries}</kbd><br /> + +&lt;/body&gt;<br /> +&lt;/html&gt;</code> + +<p>In the above code you'll notice a pair of variables: <kbd>{blog_entries}</kbd> data... <kbd>{/blog_entries}</kbd>. +In a case like this, the entire chunk of data between these pairs would be repeated multiple times, corresponding +to the number of rows in a result.</p> + +<p>Parsing variable pairs is done using the identical code shown above to parse single variables, +except, you will add a multi-dimensional array corresponding to your variable pair data. +Consider this example:</p> + + +<code>$this->load->library('parser');<br /> +<br /> +$data = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'blog_title'&nbsp;&nbsp; => 'My Blog Title',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'blog_heading' => 'My Blog Heading',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'blog_entries' => array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array('title' => 'Title 1', 'body' => 'Body 1'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array('title' => 'Title 2', 'body' => 'Body 2'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array('title' => 'Title 3', 'body' => 'Body 3'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array('title' => 'Title 4', 'body' => 'Body 4'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array('title' => 'Title 5', 'body' => 'Body 5')<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +$this->parser->parse('blog_template', $data);</code> + +<p>If your "pair" data is coming from a database result, which is already a multi-dimensional array, you can simply +use the database result_array() function:</p> + +<code> +$query = $this->db->query("SELECT * FROM blog");<br /> +<br /> +$this->load->library('parser');<br /> +<br /> +$data = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'blog_title'&nbsp;&nbsp; => 'My Blog Title',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'blog_heading' => 'My Blog Heading',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'blog_entries' => $query->result_array()<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +$this->parser->parse('blog_template', $data);</code> + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="trackback.html">Trackback Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="typography.html">Typography</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/security.html b/user_guide/libraries/security.html new file mode 100644 index 0000000..7f1db40 --- /dev/null +++ b/user_guide/libraries/security.html @@ -0,0 +1,135 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Security Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Security Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Security Class</h1> + +<p>The Security Class contains methods that help you create a secure application, processing input data for security.</p> + +<h2>XSS Filtering</h2> + +<p>CodeIgniter comes with a Cross Site Scripting Hack prevention filter which can either run automatically to filter +all POST and COOKIE data that is encountered, or you can run it on a per item basis. By default it does <strong>not</strong> +run globally since it requires a bit of processing overhead, and since you may not need it in all cases.</p> + +<p>The XSS filter looks for commonly used techniques to trigger Javascript or other types of code that attempt to hijack cookies +or do other malicious things. If anything disallowed is encountered it is rendered safe by converting the data to character entities.</p> + +<p> +Note: This function should only be used to deal with data upon submission. It's not something that should be used for general runtime processing since it requires a fair amount of processing overhead.</p> + + +<p>To filter data through the XSS filter use this function:</p> + +<h2>$this->security->xss_clean()</h2> + +<p>Here is an usage example:</p> + +<code>$data = $this->security->xss_clean($data);</code> + +<p>If you want the filter to run automatically every time it encounters POST or COOKIE data you can enable it by opening your +<kbd>application/config/config.php</kbd> file and setting this:</p> + +<code>$config['global_xss_filtering'] = TRUE;</code> + +<p>Note: If you use the form validation class, it gives you the option of XSS filtering as well.</p> + +<p>An optional second parameter, <dfn>is_image</dfn>, allows this function to be used to test images for potential XSS attacks, useful for file upload security. When this second parameter is set to <dfn>TRUE</dfn>, instead of returning an altered string, the function returns TRUE if the image is safe, and FALSE if it contained potentially malicious information that a browser may attempt to execute.</p> + +<code>if ($this->security->xss_clean($file, TRUE) === FALSE)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;// file failed the XSS test<br /> +}</code> + + +<h2>$this->security->sanitize_filename()</h2> + +<p>When accepting filenames from user input, it is best to sanitize them to prevent directory traversal and other security related issues. To do so, use the <dfn>sanitize_filename()</dfn> method of the Security class. Here is an example:</p> + +<code>$filename = $this->security->sanitize_filename($this->input->post('filename'));</code> + +<p>If it is acceptable for the user input to include relative paths, e.g. <kbd>file/in/some/approved/folder.txt</kbd>, you can set the second optional parameter, + <samp>$relative_path</samp> to TRUE.</p> + +<code>$filename = $this->security->sanitize_filename($this->input->post('filename'), TRUE);</code> + +<!-- @todo write docs for CSRF methods --> + +<h2>Cross-site request forgery (CSRF)</h2> + +<p>You can enable csrf protection by opening your <kbd>application/config/config.php</kbd> file and setting this:</p> +<code>$config['csrf_protection'] = TRUE;</code> + +<p>If you use the <a href="../helpers/form_helper.html">form helper</a> the <var>form_open()</var> function will automatically insert a hidden csrf field in your forms.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="pagination.html">Pagination Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="sessions.html">Session Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/sessions.html b/user_guide/libraries/sessions.html new file mode 100644 index 0000000..27a9675 --- /dev/null +++ b/user_guide/libraries/sessions.html @@ -0,0 +1,343 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Session Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Session Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Session Class</h1> + +<p>The Session class permits you maintain a user's "state" and track their activity while they browse your site. +The Session class stores session information for each user as serialized (and optionally encrypted) data in a cookie. +It can also store the session data in a database table for added security, as this permits the session ID in the +user's cookie to be matched against the stored session ID. By default only the cookie is saved. If you choose to +use the database option you'll need to create the session table as indicated below. +</p> + +<p class="important"><strong>Note:</strong> The Session class does <strong>not</strong> utilize native PHP sessions. It +generates its own session data, offering more flexibility for developers.</p> + +<p class="important"><strong>Note:</strong> Even if you are not using encrypted sessions, you must set +an <a href="./encryption.html">encryption key</a> in your config file which is used to aid in preventing session data manipulation.</p> + +<p class="important"><strong>Note:</strong> The Session class relies on the Encryption class, so you must have Mcrypt extension installed</p> + +<h2>Initializing a Session</h2> + +<p>Sessions will typically run globally with each page load, so the session class must either be +<a href="../general/libraries.html">initialized</a> in your +<a href="../general/controllers.html">controller</a> constructors, or it can be +<a href="../general/autoloader.html">auto-loaded</a> by the system. +For the most part the session class will run unattended in the background, so simply initializing the class +will cause it to read, create, and update sessions.</p> + + +<p>To initialize the Session class manually in your controller constructor, use the <dfn>$this->load->library</dfn> function:</p> + +<code>$this->load->library('session');</code> +<p>Once loaded, the Sessions library object will be available using: <dfn>$this->session</dfn></p> + + +<h2>How do Sessions work?</h2> + +<p>When a page is loaded, the session class will check to see if valid session data exists in the user's session cookie. +If sessions data does <strong>not</strong> exist (or if it has expired) a new session will be created and saved in the cookie. +If a session does exist, its information will be updated and the cookie will be updated. With each update, the session_id will be regenerated.</p> + +<p>It's important for you to understand that once initialized, the Session class runs automatically. There is nothing +you need to do to cause the above behavior to happen. You can, as you'll see below, work with session data or +even add your own data to a user's session, but the process of reading, writing, and updating a session is automatic.</p> + + +<h2>What is Session Data?</h2> + +<p>A <em>session</em>, as far as CodeIgniter is concerned, is simply an array containing the following information:</p> + +<ul> +<li>The user's unique Session ID (this is a statistically random string with very strong entropy, hashed with MD5 for portability, and regenerated (by default) every five minutes)</li> +<li>The user's IP Address</li> +<li>The user's User Agent data (the first 120 characters of the browser data string)</li> +<li>The "last activity" time stamp.</li> +</ul> + +<p>The above data is stored in a cookie as a serialized array with this prototype:</p> + +<code>[array]<br /> +(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'session_id'&nbsp;&nbsp;&nbsp;&nbsp;=> random hash,<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'ip_address'&nbsp;&nbsp;&nbsp;&nbsp;=> 'string - user IP address',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'user_agent'&nbsp;&nbsp;&nbsp;&nbsp;=> 'string - user agent data',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'last_activity' => timestamp<br /> +)</code> + +<p>If you have the encryption option enabled, the serialized array will be encrypted before being stored in the cookie, +making the data highly secure and impervious to being read or altered by someone. More info regarding encryption +can be <a href="encryption.html">found here</a>, although the Session class will take care of initializing +and encrypting the data automatically.</p> + +<p>Note: Session cookies are only updated every five minutes by default to reduce processor load. If you repeatedly reload a page +you'll notice that the "last activity" time only updates if five minutes or more has passed since the last time +the cookie was written. This time is configurable by changing the $config['sess_time_to_update'] line in your system/config/config.php file.</p> + +<h2>Retrieving Session Data</h2> + +<p>Any piece of information from the session array is available using the following function:</p> + +<code>$this->session->userdata('<samp>item</samp>');</code> + +<p>Where <samp>item</samp> is the array index corresponding to the item you wish to fetch. For example, to fetch the session ID you +will do this:</p> + +<code>$session_id = $this->session->userdata('<samp>session_id</samp>');</code> + +<p><strong>Note:</strong> The function returns FALSE (boolean) if the item you are trying to access does not exist.</p> + + +<h2>Adding Custom Session Data</h2> + +<p>A useful aspect of the session array is that you can add your own data to it and it will be stored in the user's cookie. +Why would you want to do this? Here's one example:</p> + +<p>Let's say a particular user logs into your site. Once authenticated, +you could add their username and email address to the session cookie, making that data globally available to you without +having to run a database query when you need it.</p> + +<p>To add your data to the session array involves passing an array containing your new data to this function:</p> + +<code>$this->session->set_userdata(<samp>$array</samp>);</code> + +<p>Where <samp>$array</samp> is an associative array containing your new data. Here's an example:</p> + + +<p><code>$newdata = array(<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'username'&nbsp; => 'johndoe',<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'email'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> 'johndoe@some-site.com',<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'logged_in' => TRUE<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> + <br /> + $this->session->set_userdata(<samp>$newdata</samp>);</code></p> +<p>If you want to add userdata one value at a time, set_userdata() also supports this syntax. </p> +<p><code>$this-&gt;session-&gt;set_userdata('some_name', 'some_value');</code></p> +<p class="important"><strong>Note:</strong> Cookies can only hold 4KB of data, so be careful not to exceed the capacity. The +encryption process in particular produces a longer data string than the original so keep careful track of how much data you are storing.</p> + +<h2>Retrieving All Session Data</h2> +<p>An array of all userdata can be retrieved as follows:</p> +<code>$this-&gt;session-&gt;all_userdata()</code> + +<p>And returns an associative array like the following:</p> + +<pre> +Array +( + [session_id] => 4a5a5dca22728fb0a84364eeb405b601 + [ip_address] => 127.0.0.1 + [user_agent] => Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; + [last_activity] => 1303142623 +) +</pre> + + +<h2>Removing Session Data</h2> +<p>Just as set_userdata() can be used to add information into a session, unset_userdata() can be used to remove it, by passing the session key. For example, if you wanted to remove 'some_name' from your session information: </p> +<p><code>$this-&gt;session-&gt;unset_userdata('some_name');</code></p> +<p>This function can also be passed an associative array of items to unset.</p> +<p><code>$array_items = array('username' => '', 'email' => '');<br /> +<br /> +$this-&gt;session-&gt;unset_userdata(<samp>$array_items</samp>);</code></p> +<h2>Flashdata</h2> +<p>CodeIgniter supports &quot;flashdata&quot;, or session data that will only be available for the next server request, and are then automatically cleared. These can be very useful, and are typically used for informational or status messages (for example: &quot;record 2 deleted&quot;).</p> +<p>Note: Flash variables are prefaced with &quot;flash_&quot; so avoid this prefix in your own session names.</p> +<p>To add flashdata:</p> +<p><code>$this-&gt;session-&gt;set_flashdata('item', 'value');</code></p> +<p>You can also pass an array to set_flashdata(), in the same manner as set_userdata(). </p> +<p>To read a flashdata variable:</p> +<p><code>$this-&gt;session-&gt;flashdata('item');</code></p> +<p>If you find that you need to preserve a flashdata variable through an additional request, you can do so using the keep_flashdata() function.</p> +<p><code>$this-&gt;session-&gt;keep_flashdata('item');</code></p> +<h2>Saving Session Data to a Database</h2> +<p>While the session data array stored in the user's cookie contains a Session ID, +unless you store session data in a database there is no way to validate it. For some applications that require little or no +security, session ID validation may not be needed, but if your application requires security, validation is mandatory. Otherwise, an old session +could be restored by a user modifying their cookies.</p> + +<p>When session data is available in a database, every time a valid session is found in the user's cookie, a database +query is performed to match it. If the session ID does not match, the session is destroyed. Session IDs can never +be updated, they can only be generated when a new session is created.</p> + + +<p>In order to store sessions, you must first create a database table for this purpose. Here is the basic +prototype (for MySQL) required by the session class:</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="10"> +CREATE TABLE IF NOT EXISTS `ci_sessions` ( + session_id varchar(40) DEFAULT '0' NOT NULL, + ip_address varchar(45) DEFAULT '0' NOT NULL, + user_agent varchar(120) NOT NULL, + last_activity int(10) unsigned DEFAULT 0 NOT NULL, + user_data text NOT NULL, + PRIMARY KEY (session_id), + KEY `last_activity_idx` (`last_activity`) +); +</textarea> + +<p><strong>Note:</strong> By default the table is called <dfn>ci_sessions</dfn>, but you can name it anything you want +as long as you update the <kbd>application/config/config.php</kbd> file so that it contains the name you have chosen. +Once you have created your database table you can enable the database option in your config.php file as follows:</p> + +<code>$config['sess_use_database'] = TRUE;</code> + +<p>Once enabled, the Session class will store session data in the DB.</p> + +<p>Make sure you've specified the table name in your config file as well:</p> + +<code>$config['sess_table_name'] = 'ci_sessions';</code> + +<p class="important"><strong>Note:</strong> The Session class has built-in garbage collection which clears out expired sessions so you +do not need to write your own routine to do it.</p> + + +<h2>Destroying a Session </h2> +<p>To clear the current session: </p> +<code>$this-&gt;session-&gt;sess_destroy();</code> +<p class="important"><strong>Note:</strong> This function should be the last one called, and even flash variables will no longer be available. If you only want some items destroyed and not all, use <dfn>unset_userdata()</dfn>.</p> + + + +<h2>Session Preferences</h2> +<p>You'll find the following Session related preferences in your <kbd>application/config/config.php</kbd> file:</p> + + +<table cellpadding="0" cellspacing="1" border="0" style="width:100%" class="tableborder"> +<tr> + <th>Preference</th> + <th>Default</th> + <th>Options</th> + <th>Description</th> +</tr> +<tr> + <td class="td"><strong>sess_cookie_name</strong></td> + <td class="td">ci_session</td> + <td class="td">None</td> + <td class="td">The name you want the session cookie saved as.</td> +</tr> +<tr> + <td class="td"><strong>sess_expiration</strong></td> + <td class="td">7200</td> + <td class="td">None</td> + <td class="td">The number of seconds you would like the session to last. The default value is 2 hours (7200 seconds). If you would like a non-expiring session set the value to zero: 0</td> +</tr> +<tr> + <td class="td"><strong>sess_expire_on_close</strong></td> + <td class="td">FALSE</td> + <td class="td">TRUE/FALSE (boolean)</td> + <td class="td">Whether to cause the session to expire automatically when the browser window is closed.</td> +</tr> +<tr> + <td class="td"><strong>sess_encrypt_cookie</strong></td> + <td class="td">FALSE</td> + <td class="td">TRUE/FALSE (boolean)</td> + <td class="td">Whether to encrypt the session data.</td> +</tr> +<tr> + <td class="td"><strong>sess_use_database</strong></td> + <td class="td">FALSE</td> + <td class="td">TRUE/FALSE (boolean)</td> + <td class="td">Whether to save the session data to a database. You must create the table before enabling this option.</td> +</tr> +<tr> + <td class="td"><strong>sess_table_name</strong></td> + <td class="td">ci_sessions</td> + <td class="td">Any valid SQL table name</td> + <td class="td">The name of the session database table.</td> +</tr> +<tr> + <td class="td"><strong>sess_time_to_update</strong></td> + <td class="td">300</td> + <td class="td">Time in seconds</td> + <td class="td">This options controls how often the session class will regenerate itself and create a new session id.</td> +</tr> +<tr> + <td class="td"><strong>sess_match_ip</strong></td> + <td class="td">FALSE</td> + <td class="td">TRUE/FALSE (boolean)</td> + <td class="td">Whether to match the user's IP address when reading the session data. Note that some ISPs dynamically + changes the IP, so if you want a non-expiring session you will likely set this to FALSE.</td> +</tr> +<tr> + <td class="td"><strong>sess_match_useragent</strong></td> + <td class="td">TRUE</td> + <td class="td">TRUE/FALSE (boolean)</td> + <td class="td">Whether to match the User Agent when reading the session data.</td> +</tr> +</table> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="security.html">Security Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="trackback.html">Trackback Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/table.html b/user_guide/libraries/table.html new file mode 100644 index 0000000..b15d83a --- /dev/null +++ b/user_guide/libraries/table.html @@ -0,0 +1,315 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<title>CodeIgniter User Guide : HTML Table Class</title> + +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="153" height="44" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +HTML Table Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>HTML Table Class</h1> + +<p>The Table Class provides functions that enable you to auto-generate HTML tables from arrays or database result sets.</p> + +<h2>Initializing the Class</h2> + +<p>Like most other classes in CodeIgniter, the Table class is initialized in your controller using the <dfn>$this->load->library</dfn> function:</p> + +<code>$this->load->library('table');</code> +<p>Once loaded, the Table library object will be available using: <dfn>$this->table</dfn></p> + + +<h2>Examples</h2> + +<p>Here is an example showing how you can create a table from a multi-dimensional array. +Note that the first array index will become the table heading (or you can set your own headings using the +<dfn>set_heading()</dfn> function described in the function reference below).</p> + +<code> +$this->load->library('table');<br /> +<br /> +$data = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array('Name', 'Color', 'Size'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array('Fred', 'Blue', 'Small'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array('Mary', 'Red', 'Large'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array('John', 'Green', 'Medium') <br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +echo $this->table->generate($data); +</code> + +<p>Here is an example of a table created from a database query result. The table class will automatically generate the +headings based on the table names (or you can set your own headings using the <dfn>set_heading()</dfn> function described +in the function reference below).</p> + +<code> +$this->load->library('table');<br /> +<br /> +$query = $this->db->query("SELECT * FROM my_table");<br /> +<br /> +echo $this->table->generate($query); +</code> + + +<p>Here is an example showing how you might create a table using discrete parameters:</p> + +<code> +$this->load->library('table');<br /> +<br /> +$this->table->set_heading('Name', 'Color', 'Size');<br /> +<br /> +$this->table->add_row('Fred', 'Blue', 'Small');<br /> +$this->table->add_row('Mary', 'Red', 'Large');<br /> +$this->table->add_row('John', 'Green', 'Medium');<br /> +<br /> +echo $this->table->generate(); +</code> + +<p>Here is the same example, except instead of individual parameters, arrays are used:</p> + +<code> +$this->load->library('table');<br /> +<br /> +$this->table->set_heading(array('Name', 'Color', 'Size'));<br /> +<br /> +$this->table->add_row(array('Fred', 'Blue', 'Small'));<br /> +$this->table->add_row(array('Mary', 'Red', 'Large'));<br /> +$this->table->add_row(array('John', 'Green', 'Medium'));<br /> +<br /> +echo $this->table->generate(); +</code> + + +<h2>Changing the Look of Your Table</h2> + +<p>The Table Class permits you to set a table template with which you can specify the design of your layout. Here is the template +prototype:</p> + +<code> +$tmpl = array (<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'table_open'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> '&lt;table border="0" cellpadding="4" cellspacing="0">',<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'heading_row_start'&nbsp;&nbsp;&nbsp;=> '&lt;tr>',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'heading_row_end'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> '&lt;/tr>',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'heading_cell_start'&nbsp;&nbsp;=> '&lt;th>',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'heading_cell_end'&nbsp;&nbsp;&nbsp;&nbsp;=> '&lt;/th>',<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'row_start'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> '&lt;tr>',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'row_end'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> '&lt;/tr>',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'cell_start'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> '&lt;td>',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'cell_end'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> '&lt;/td>',<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'row_alt_start'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> '&lt;tr>',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'row_alt_end'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> '&lt;/tr>',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'cell_alt_start'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> '&lt;td>',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'cell_alt_end'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> '&lt;/td>',<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'table_close'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> '&lt;/table>'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> + +<br /> +$this->table->set_template($tmpl); +</code> + +<p class="important"><strong>Note:</strong>&nbsp; You'll notice there are two sets of "row" blocks in the template. These permit you to create alternating row colors or design elements that alternate with each +iteration of the row data.</p> + +<p>You are NOT required to submit a complete template. If you only need to change parts of the layout you can simply submit those elements. +In this example, only the table opening tag is being changed:</p> + +<code> +$tmpl = array ( 'table_open'&nbsp;&nbsp;=> '&lt;table border="1" cellpadding="2" cellspacing="1" class="mytable">' );<br /> + +<br /> +$this->table->set_template($tmpl); +</code> + +<br /> +<h1>Function Reference</h1> + +<h2>$this->table->generate()</h2> +<p>Returns a string containing the generated table. Accepts an optional parameter which can be an array or a database result object.</p> + +<h2>$this->table->set_caption()</h2> + +<p>Permits you to add a caption to the table.</p> + +<code>$this->table->set_caption('Colors');</code> + +<h2>$this->table->set_heading()</h2> + +<p>Permits you to set the table heading. You can submit an array or discrete params:</p> + +<code>$this->table->set_heading('Name', 'Color', 'Size');</code> +<code>$this->table->set_heading(array('Name', 'Color', 'Size'));</code> + +<h2>$this->table->add_row()</h2> + +<p>Permits you to add a row to your table. You can submit an array or discrete params:</p> + +<code>$this->table->add_row('Blue', 'Red', 'Green');</code> +<code>$this->table->add_row(array('Blue', 'Red', 'Green'));</code> + +<p>If you would like to set an individual cell's tag attributes, you can use an associative array for that cell. The associative key <dfn>'data'</dfn> defines the cell's data. Any other key =&gt; val pairs are added as <dfn>key='val'</dfn> attributes to the tag:</p> + +<code>$cell = array('data' => 'Blue', 'class' => 'highlight', 'colspan' => 2);<br /> +$this->table->add_row($cell, 'Red', 'Green');<br /> +<br /> +// generates<br /> +// &lt;td class='highlight' colspan='2'&gt;Blue&lt;/td&gt;&lt;td&gt;Red&lt;/td&gt;&lt;td&gt;Green&lt;/td&gt; +</code> + +<h2>$this->table->make_columns()</h2> + +<p>This function takes a one-dimensional array as input and creates +a multi-dimensional array with a depth equal to the number of +columns desired. This allows a single array with many elements to be +displayed in a table that has a fixed column count. Consider this example:</p> + +<code> +$list = array('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve');<br /> +<br /> +$new_list = $this->table->make_columns($list, 3);<br /> +<br /> +$this->table->generate($new_list);<br /> +<br /> +// Generates a table with this prototype<br /> +<br /> +&lt;table border="0" cellpadding="4" cellspacing="0"&gt;<br /> +&lt;tr&gt;<br /> +&lt;td&gt;one&lt;/td&gt;&lt;td&gt;two&lt;/td&gt;&lt;td&gt;three&lt;/td&gt;<br /> +&lt;/tr&gt;&lt;tr&gt;<br /> +&lt;td&gt;four&lt;/td&gt;&lt;td&gt;five&lt;/td&gt;&lt;td&gt;six&lt;/td&gt;<br /> +&lt;/tr&gt;&lt;tr&gt;<br /> +&lt;td&gt;seven&lt;/td&gt;&lt;td&gt;eight&lt;/td&gt;&lt;td&gt;nine&lt;/td&gt;<br /> +&lt;/tr&gt;&lt;tr&gt;<br /> +&lt;td&gt;ten&lt;/td&gt;&lt;td&gt;eleven&lt;/td&gt;&lt;td&gt;twelve&lt;/td&gt;&lt;/tr&gt;<br /> +&lt;/table&gt;</code> + + + +<h2>$this->table->set_template()</h2> + +<p>Permits you to set your template. You can submit a full or partial template.</p> + +<code> +$tmpl = array ( 'table_open'&nbsp;&nbsp;=> '&lt;table border="1" cellpadding="2" cellspacing="1" class="mytable">' );<br /> + +<br /> +$this->table->set_template($tmpl); +</code> + + +<h2>$this->table->set_empty()</h2> + +<p>Let's you set a default value for use in any table cells that are empty. You might, for example, set a non-breaking space:</p> + +<code> +$this->table->set_empty("&amp;nbsp;"); +</code> + +<h2>$this->table->clear()</h2> + +<p>Lets you clear the table heading and row data. If you need to show multiple tables with different data you should +to call this function after each table has been generated to empty the previous table information. Example:</p> + +<code> +$this->load->library('table');<br /> +<br /> +$this->table->set_heading('Name', 'Color', 'Size');<br /> +$this->table->add_row('Fred', 'Blue', 'Small');<br /> +$this->table->add_row('Mary', 'Red', 'Large');<br /> +$this->table->add_row('John', 'Green', 'Medium');<br /> +<br /> +echo $this->table->generate();<br /> +<br /> +<kbd>$this->table->clear();</kbd><br /> +<br /> +$this->table->set_heading('Name', 'Day', 'Delivery');<br /> +$this->table->add_row('Fred', 'Wednesday', 'Express');<br /> +$this->table->add_row('Mary', 'Monday', 'Air');<br /> +$this->table->add_row('John', 'Saturday', 'Overnight');<br /> +<br /> +echo $this->table->generate(); +</code> + +<h2>$this->table->function</h2> + +<p>Allows you to specify a native PHP function or a valid function array object to be applied to all cell data.</p> + +<code>$this->load->library('table');<br /> +<br /> +$this->table->set_heading('Name', 'Color', 'Size');<br /> +$this->table->add_row('Fred', '&lt;strong&gt;Blue&lt;/strong&gt;', 'Small');<br /> +<br /> +$this->table->function = 'htmlspecialchars';<br /> +echo $this->table->generate();<br /> +</code> + +<p>In the above example, all cell data would be ran through PHP's <dfn>htmlspecialchars()</dfn> function, resulting in:</p> + +<code>&lt;td&gt;Fred&lt;/td&gt;&lt;td&gt;&amp;lt;strong&amp;gt;Blue&amp;lt;/strong&amp;gt;&lt;/td&gt;&lt;td&gt;Small&lt;/td&gt;</code> +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;<a href="ftp.html">&nbsp;FTP Class</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="image_lib.html">Image Manipulation Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/trackback.html b/user_guide/libraries/trackback.html new file mode 100644 index 0000000..68e0a52 --- /dev/null +++ b/user_guide/libraries/trackback.html @@ -0,0 +1,246 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Trackback Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Trackback Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Trackback Class</h1> + +<p>The Trackback Class provides functions that enable you to send and receive Trackback data.</p> + + +<p>If you are not familiar with Trackbacks you'll find more information <a href="http://en.wikipedia.org/wiki/Trackback">here</a>.</p> + +<h2>Initializing the Class</h2> + +<p>Like most other classes in CodeIgniter, the Trackback class is initialized in your controller using the <dfn>$this->load->library</dfn> function:</p> + +<code>$this->load->library('trackback');</code> +<p>Once loaded, the Trackback library object will be available using: <dfn>$this->trackback</dfn></p> + + +<h2>Sending Trackbacks</h2> + +<p>A Trackback can be sent from any of your controller functions using code similar to this example:</p> + +<code>$this->load->library('trackback');<br /> +<br /> +$tb_data = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'ping_url'&nbsp;&nbsp;=> 'http://example.com/trackback/456',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'url'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> 'http://www.my-example.com/blog/entry/123',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'title'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> 'The Title of My Entry',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'excerpt'&nbsp;&nbsp;&nbsp;=> 'The entry content.',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'blog_name' => 'My Blog Name',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'charset'&nbsp;&nbsp;&nbsp;=> 'utf-8'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +if ( ! $this->trackback->send($tb_data))<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo $this->trackback->display_errors();<br /> +}<br /> +else<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo 'Trackback was sent!';<br /> +}</code> + +<p>Description of array data:</p> + +<ul> +<li><strong>ping_url</strong> - The URL of the site you are sending the Trackback to. You can send Trackbacks to multiple URLs by separating each URL with a comma.</li> +<li><strong>url</strong> - The URL to YOUR site where the weblog entry can be seen.</li> +<li><strong>title</strong> - The title of your weblog entry.</li> +<li><strong>excerpt</strong> - The content of your weblog entry. Note: the Trackback class will automatically send only the first 500 characters of your entry. It will also strip all HTML.</li> +<li><strong>blog_name</strong> - The name of your weblog.</li> +<li><strong>charset</strong> - The character encoding your weblog is written in. If omitted, UTF-8 will be used.</li> +</ul> + +<p>The Trackback sending function returns TRUE/FALSE (boolean) on success or failure. If it fails, you can retrieve the error message using:</p> + +<code>$this->trackback->display_errors();</code> + + +<h2>Receiving Trackbacks</h2> + +<p>Before you can receive Trackbacks you must create a weblog. If you don't have a blog yet there's no point in continuing.</p> + +<p>Receiving Trackbacks is a little more complex than sending them, only because you will need a database table in which to store them, +and you will need to validate the incoming trackback data. You are encouraged to implement a thorough validation process to +guard against spam and duplicate data. You may also want to limit the number of Trackbacks you allow from a particular IP within +a given span of time to further curtail spam. The process of receiving a Trackback is quite simple; +the validation is what takes most of the effort.</p> + +<h2>Your Ping URL</h2> + +<p>In order to accept Trackbacks you must display a Trackback URL next to each one of your weblog entries. This will be the URL +that people will use to send you Trackbacks (we will refer to this as your "Ping URL").</p> + +<p>Your Ping URL must point to a controller function where your Trackback receiving code is located, and the URL +must contain the ID number for each particular entry, so that when the Trackback is received you'll be +able to associate it with a particular entry.</p> + +<p>For example, if your controller class is called <dfn>Trackback</dfn>, and the receiving function is called <dfn>receive</dfn>, your +Ping URLs will look something like this:</p> + +<code>http://example.com/index.php/trackback/receive/<samp>entry_id</samp></code> + +<p>Where <samp>entry_id</samp> represents the individual ID number for each of your entries.</p> + + +<h2>Creating a Trackback Table</h2> + +<p>Before you can receive Trackbacks you must create a table in which to store them. Here is a basic prototype for such a table:</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="13"> +CREATE TABLE trackbacks ( + tb_id int(10) unsigned NOT NULL auto_increment, + entry_id int(10) unsigned NOT NULL default 0, + url varchar(200) NOT NULL, + title varchar(100) NOT NULL, + excerpt text NOT NULL, + blog_name varchar(100) NOT NULL, + tb_date int(10) NOT NULL, + ip_address varchar(16) NOT NULL, + PRIMARY KEY `tb_id` (`tb_id`), + KEY `entry_id` (`entry_id`) +);</textarea> + + +<p>The Trackback specification only requires four pieces of information to be sent in a Trackback (url, title, excerpt, blog_name), +but to make the data more useful we've added a few more fields in the above table schema (date, IP address, etc.).</p> + +<h2>Processing a Trackback</h2> + +<p>Here is an example showing how you will receive and process a Trackback. The following +code is intended for use within the controller function where you expect to receive Trackbacks.</p> + +<code>$this->load->library('trackback');<br /> +$this->load->database();<br /> +<br /> +if ($this->uri->segment(3) == FALSE)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$this->trackback->send_error("Unable to determine the entry ID");<br /> +}<br /> +<br /> +if ( ! $this->trackback->receive())<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$this->trackback->send_error("The Trackback did not contain valid data");<br /> +}<br /> +<br /> +$data = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'tb_id'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> '',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'entry_id'&nbsp;&nbsp;&nbsp;=> $this->uri->segment(3),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'url'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> $this->trackback->data('url'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'title'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=> $this->trackback->data('title'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'excerpt'&nbsp;&nbsp;&nbsp;&nbsp;=> $this->trackback->data('excerpt'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'blog_name'&nbsp;&nbsp;=> $this->trackback->data('blog_name'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'tb_date'&nbsp;&nbsp;&nbsp;&nbsp;=> time(),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'ip_address' => $this->input->ip_address()<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +$sql = $this->db->insert_string('trackbacks', $data);<br /> +$this->db->query($sql);<br /> +<br /> +$this->trackback->send_success();</code> + +<h4>Notes:</h4> + +<p>The entry ID number is expected in the third segment of your URL. This is based on the URI example we gave earlier:</p> + +<code>http://example.com/index.php/trackback/receive/<samp>entry_id</samp></code> + +<p>Notice the entry_id is in the third URI segment, which you can retrieve using:</p> + +<code>$this->uri->segment(3);</code> + +<p>In our Trackback receiving code above, if the third segment is missing, we will issue an error. Without a valid entry ID, there's no +reason to continue.</p> + +<p>The <dfn>$this->trackback->receive()</dfn> function is simply a validation function that looks at the incoming data +and makes sure it contains the four pieces of data that are required (url, title, excerpt, blog_name). +It returns TRUE on success and FALSE on failure. If it fails you will issue an error message.</p> + +<p>The incoming Trackback data can be retrieved using this function:</p> + +<code>$this->trackback->data('<var>item</var>')</code> + +<p>Where <var>item</var> represents one of these four pieces of info: url, title, excerpt, or blog_name</p> + +<p>If the Trackback data is successfully received, you will issue a success message using:</p> + +<code>$this->trackback->send_success();</code> + +<p class="important"><strong>Note:</strong> The above code contains no data validation, which you are encouraged to add.</p> + + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="sessions.html">Session Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="parser.html">Template Parser Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/typography.html b/user_guide/libraries/typography.html new file mode 100644 index 0000000..5890caf --- /dev/null +++ b/user_guide/libraries/typography.html @@ -0,0 +1,160 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Typography Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Typography Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Typography Class</h1> + +<p>The Typography Class provides functions that help you format text.</p> + + +<h2>Initializing the Class</h2> + +<p>Like most other classes in CodeIgniter, the Typography class is initialized in your controller using the <dfn>$this->load->library</dfn> function:</p> + +<code>$this->load->library('typography');</code> +<p>Once loaded, the Typography library object will be available using: <dfn>$this->typography</dfn></p> + + +<h2>auto_typography()</h2> + +<p>Formats text so that it is semantically and typographically correct HTML. Takes a string as input and returns it with +the following formatting:</p> + +<ul> +<li>Surrounds paragraphs within &lt;p&gt;&lt;/p&gt; (looks for double line breaks to identify paragraphs).</li> +<li>Single line breaks are converted to &lt;br /&gt;, except those that appear within &lt;pre&gt; tags.</li> +<li>Block level elements, like &lt;div&gt; tags, are not wrapped within paragraphs, but their contained text is if it contains paragraphs.</li> +<li>Quotes are converted to correctly facing curly quote entities, except those that appear within tags.</li> +<li>Apostrophes are converted to curly apostrophe entities.</li> +<li>Double dashes (either like -- this or like--this) are converted to em&#8212;dashes.</li> +<li>Three consecutive periods either preceding or following a word are converted to ellipsis&#8230;</li> +<li>Double spaces following sentences are converted to non-breaking spaces to mimic double spacing.</li> +</ul> + +<p>Usage example:</p> + +<code>$string = $this->typography->auto_typography($string);</code> + +<h3>Parameters</h3> + +<p>There is one optional parameters that determines whether the parser should reduce more then two consecutive line breaks down to two. Use boolean <kbd>TRUE</kbd> or <kbd>FALSE</kbd>.</p> + +<p>By default the parser does not reduce line breaks. In other words, if no parameters are submitted, it is the same as doing this:</p> + +<code>$string = $this->typography->auto_typography($string, <kbd>FALSE</kbd>);</code> + + +<p class="important"><strong>Note:</strong> Typographic formatting can be processor intensive, particularly if you have a lot of content being formatted. +If you choose to use this function you may want to consider +<a href="../general/caching.html">caching</a> your pages.</p> + + + +<h2>format_characters()</h2> + +<p>This function is similar to the <dfn>auto_typography</dfn> function above, except that it only does character conversion:</p> + +<ul> +<li>Quotes are converted to correctly facing curly quote entities, except those that appear within tags.</li> +<li>Apostrophes are converted to curly apostrophe entities.</li> +<li>Double dashes (either like -- this or like--this) are converted to em&#8212;dashes.</li> +<li>Three consecutive periods either preceding or following a word are converted to ellipsis&#8230;</li> +<li>Double spaces following sentences are converted to non-breaking spaces to mimic double spacing.</li> +</ul> + +<p>Usage example:</p> + +<code>$string = $this->typography->format_characters($string);</code> + + +<h2>nl2br_except_pre()</h2> + +<p>Converts newlines to &lt;br /&gt; tags unless they appear within &lt;pre&gt; tags. +This function is identical to the native PHP <dfn>nl2br()</dfn> function, except that it ignores &lt;pre&gt; tags.</p> + +<p>Usage example:</p> + +<code>$string = $this->typography->nl2br_except_pre($string);</code> + +<h2>protect_braced_quotes</h2> + +<p>When using the Typography library in conjunction with the Template Parser library it can often be desirable to protect single + and double quotes within curly braces. To enable this, set the <kbd>protect_braced_quotes</kbd> class property to <samp>TRUE</samp>.</p> + +<p>Usage example:</p> + +<code>$this->load->library('typography');<br /> +$this->typography->protect_braced_quotes = TRUE; +</code> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="parser.html">Template Parser</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="unit_testing.html">Unit Testing Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/unit_testing.html b/user_guide/libraries/unit_testing.html new file mode 100644 index 0000000..a91323b --- /dev/null +++ b/user_guide/libraries/unit_testing.html @@ -0,0 +1,226 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Unit Testing Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Unit Testing Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Unit Testing Class</h1> + +<p>Unit testing is an approach to software development in which tests are written for each function in your application. +If you are not familiar with the concept you might do a little googling on the subject.</p> + +<p>CodeIgniter's Unit Test class is quite simple, consisting of an evaluation function and two result functions. +It's not intended to be a full-blown test suite but rather a simple mechanism to evaluate your code +to determine if it is producing the correct data type and result. +</p> + + +<h2>Initializing the Class</h2> + +<p>Like most other classes in CodeIgniter, the Unit Test class is initialized in your controller using the <dfn>$this->load->library</dfn> function:</p> + +<code>$this->load->library('unit_test');</code> +<p>Once loaded, the Unit Test object will be available using: <dfn>$this->unit</dfn></p> + + +<h2>Running Tests</h2> + +<p>Running a test involves supplying a test and an expected result to the following function:</p> + +<h2>$this->unit->run( <var>test</var>, <var>expected result</var>, '<var>test name</var>', '<var>notes</var>');</h2> + +<p>Where <var>test</var> is the result of the code you wish to test, <var>expected result</var> is the data type you expect, +<var>test name</var> is an optional name you can give your test, and <var>notes</var> are optional notes. Example:</p> + +<code>$test = 1 + 1;<br /> +<br /> +$expected_result = 2;<br /> +<br /> +$test_name = 'Adds one plus one';<br /> +<br /> +$this->unit->run($test, $expected_result, $test_name);</code> + +<p>The expected result you supply can either be a literal match, or a data type match. Here's an example of a literal:</p> + +<code>$this->unit->run('Foo', 'Foo');</code> + +<p>Here is an example of a data type match:</p> + +<code>$this->unit->run('Foo', 'is_string');</code> + +<p>Notice the use of "is_string" in the second parameter? This tells the function to evaluate whether your test is producing a string +as the result. Here is a list of allowed comparison types:</p> + +<ul> +<li>is_object</li> +<li>is_string</li> +<li>is_bool</li> +<li>is_true</li> +<li>is_false</li> +<li>is_int</li> +<li>is_numeric</li> +<li>is_float</li> +<li>is_double</li> +<li>is_array</li> +<li>is_null</li> +</ul> + + +<h2>Generating Reports</h2> + +<p>You can either display results after each test, or your can run several tests and generate a report at the end. +To show a report directly simply echo or return the <var>run</var> function:</p> + +<code>echo $this->unit->run($test, $expected_result);</code> + +<p>To run a full report of all tests, use this:</p> + +<code>echo $this->unit->report();</code> + +<p>The report will be formatted in an HTML table for viewing. If you prefer the raw data you can retrieve an array using:</p> + +<code>echo $this->unit->result();</code> + + +<h2>Strict Mode</h2> + +<p>By default the unit test class evaluates literal matches loosely. Consider this example:</p> + +<code>$this->unit->run(1, TRUE);</code> + +<p>The test is evaluating an integer, but the expected result is a boolean. PHP, however, due to it's loose data-typing +will evaluate the above code as TRUE using a normal equality test:</p> + +<code>if (1 == TRUE) echo 'This evaluates as true';</code> + +<p>If you prefer, you can put the unit test class in to strict mode, which will compare the data type as well as the value:</p> + +<code>if (1 === TRUE) echo 'This evaluates as FALSE';</code> + +<p>To enable strict mode use this:</p> + +<code>$this->unit->use_strict(TRUE);</code> + +<h2>Enabling/Disabling Unit Testing</h2> + +<p>If you would like to leave some testing in place in your scripts, but not have it run unless you need it, you can disable +unit testing using:</p> + +<code>$this->unit->active(FALSE)</code> + +<h2>Unit Test Display</h2> + +<p>When your unit test results display, the following items show by default:</p> + +<ul> + <li>Test Name (test_name)</li> + <li>Test Datatype (test_datatype)</li> + <li>Expected Datatype (res_datatype)</li> + <li>Result (result)</li> + <li>File Name (file)</li> + <li>Line Number (line)</li> + <li>Any notes you entered for the test (notes)</li> +</ul> + +You can customize which of these items get displayed by using <kbd>$this->unit->set_items()</kbd>. For example, if you only wanted the test name and the result displayed:</p> + +<h3>Customizing displayed tests</h3> + +<code> + $this->unit->set_test_items(array('test_name', 'result')); +</code> + +<h3>Creating a Template</h3> + +<p>If you would like your test results formatted differently then the default you can set your own template. Here is an +example of a simple template. Note the required pseudo-variables:</p> + +<code> +$str = '<br /> +&lt;table border="0" cellpadding="4" cellspacing="1"><br /> +&nbsp;&nbsp;&nbsp;&nbsp;<kbd>{rows}</kbd><br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr><br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td><kbd>{item}</kbd>&lt;/td><br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td><kbd>{result}</kbd>&lt;/td><br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr><br /> +&nbsp;&nbsp;&nbsp;&nbsp;<kbd>{/rows}</kbd><br /> +&lt;/table>';<br /> +<br /> +$this->unit->set_template($str); +</code> + +<p class="important"><strong>Note:</strong> Your template must be declared <strong>before</strong> running the unit test process.</p> + + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="typography.html">Typography Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="uri.html">URI Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/uri.html b/user_guide/libraries/uri.html new file mode 100644 index 0000000..ee0da5f --- /dev/null +++ b/user_guide/libraries/uri.html @@ -0,0 +1,252 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>URI Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +URI Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>URI Class</h1> + +<p>The URI Class provides functions that help you retrieve information from your URI strings. If you use URI routing, you can +also retrieve information about the re-routed segments.</p> + +<p class="important"><strong>Note:</strong> This class is initialized automatically by the system so there is no need to do it manually.</p> + +<h2>$this->uri->segment(<var>n</var>)</h2> + +<p>Permits you to retrieve a specific segment. Where <var>n</var> is the segment number you wish to retrieve. +Segments are numbered from left to right. For example, if your full URL is this:</p> + +<code>http://example.com/index.php/news/local/metro/crime_is_up</code> + +<p>The segment numbers would be this:</p> + +<ol> +<li>news</li> +<li>local</li> +<li>metro</li> +<li>crime_is_up</li> +</ol> + +<p>By default the function returns FALSE (boolean) if the segment does not exist. There is an optional second parameter that +permits you to set your own default value if the segment is missing. +For example, this would tell the function to return the number zero in the event of failure:</p> + +<code>$product_id = $this->uri->segment(3, 0);</code> + +<p>It helps avoid having to write code like this:</p> + +<code>if ($this->uri->segment(3) === FALSE)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$product_id = 0;<br /> +}<br /> +else<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$product_id = $this->uri->segment(3);<br /> +}<br /> +</code> + +<h2>$this->uri->rsegment(<var>n</var>)</h2> + +<p>This function is identical to the previous one, except that it lets you retrieve a specific segment from your +re-routed URI in the event you are using CodeIgniter's <a href="../general/routing.html">URI Routing</a> feature.</p> + + +<h2>$this->uri->slash_segment(<var>n</var>)</h2> + +<p>This function is almost identical to <dfn>$this->uri->segment()</dfn>, except it adds a trailing and/or leading slash based on the second +parameter. If the parameter is not used, a trailing slash added. Examples:</p> + +<code>$this->uri->slash_segment(<var>3</var>);<br /> +$this->uri->slash_segment(<var>3</var>, 'leading');<br /> +$this->uri->slash_segment(<var>3</var>, 'both');</code> + +<p>Returns:</p> + +<ol> +<li>segment/</li> +<li>/segment</li> +<li>/segment/</li> +</ol> + + +<h2>$this->uri->slash_rsegment(<var>n</var>)</h2> + +<p>This function is identical to the previous one, except that it lets you add slashes a specific segment from your +re-routed URI in the event you are using CodeIgniter's <a href="../general/routing.html">URI Routing</a> feature.</p> + + + +<h2>$this->uri->uri_to_assoc(<var>n</var>)</h2> + +<p>This function lets you turn URI segments into and associative array of key/value pairs. Consider this URI:</p> + +<code>index.php/user/search/name/joe/location/UK/gender/male</code> + +<p>Using this function you can turn the URI into an associative array with this prototype:</p> + +<code>[array]<br /> +(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'name' => 'joe'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'location' => 'UK'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;'gender' => 'male'<br /> +)</code> + +<p>The first parameter of the function lets you set an offset. By default it is set to <kbd>3</kbd> since your +URI will normally contain a controller/function in the first and second segments. Example:</p> + +<code> +$array = $this->uri->uri_to_assoc(3);<br /> +<br /> +echo $array['name']; +</code> + + +<p>The second parameter lets you set default key names, so that the array returned by the function will always contain expected indexes, even if missing from the URI. Example:</p> + +<code> +$default = array('name', 'gender', 'location', 'type', 'sort');<br /> +<br /> +$array = $this->uri->uri_to_assoc(3, $default);</code> + +<p>If the URI does not contain a value in your default, an array index will be set to that name, with a value of FALSE.</p> + +<p>Lastly, if a corresponding value is not found for a given key (if there is an odd number of URI segments) the value will be set to FALSE (boolean).</p> + + +<h2>$this->uri->ruri_to_assoc(<var>n</var>)</h2> + +<p>This function is identical to the previous one, except that it creates an associative array using the +re-routed URI in the event you are using CodeIgniter's <a href="../general/routing.html">URI Routing</a> feature.</p> + + +<h2>$this->uri->assoc_to_uri()</h2> + +<p>Takes an associative array as input and generates a URI string from it. The array keys will be included in the string. Example:</p> + +<code>$array = array('product' => 'shoes', 'size' => 'large', 'color' => 'red');<br /> +<br /> +$str = $this->uri->assoc_to_uri($array);<br /> +<br /> +// Produces: product/shoes/size/large/color/red +</code> + + +<h2>$this->uri->uri_string()</h2> + +<p>Returns a string with the complete URI. For example, if this is your full URL:</p> + +<code>http://example.com/index.php/news/local/345</code> + +<p>The function would return this:</p> + +<code>news/local/345</code> + + +<h2>$this->uri->ruri_string()</h2> + +<p>This function is identical to the previous one, except that it returns the +re-routed URI in the event you are using CodeIgniter's <a href="../general/routing.html">URI Routing</a> feature.</p> + + + +<h2>$this->uri->total_segments()</h2> + +<p>Returns the total number of segments.</p> + + +<h2>$this->uri->total_rsegments()</h2> + +<p>This function is identical to the previous one, except that it returns the total number of segments in your +re-routed URI in the event you are using CodeIgniter's <a href="../general/routing.html">URI Routing</a> feature.</p> + + + +<h2>$this->uri->segment_array()</h2> + +<p>Returns an array containing the URI segments. For example:</p> + +<code> +$segs = $this->uri->segment_array();<br /> +<br /> +foreach ($segs as $segment)<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo $segment;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo '&lt;br />';<br /> +}</code> + +<h2>$this->uri->rsegment_array()</h2> + +<p>This function is identical to the previous one, except that it returns the array of segments in your +re-routed URI in the event you are using CodeIgniter's <a href="../general/routing.html">URI Routing</a> feature.</p> + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="unit_testing.html">Unit Testing Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="user_agent.html">User Agent Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/user_agent.html b/user_guide/libraries/user_agent.html new file mode 100644 index 0000000..665e217 --- /dev/null +++ b/user_guide/libraries/user_agent.html @@ -0,0 +1,226 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>User Agent Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +User Agent Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>User Agent Class</h1> + +<p>The User Agent Class provides functions that help identify information about the browser, mobile device, or robot visiting your site. +In addition you can get referrer information as well as language and supported character-set information.</p> + +<h2>Initializing the Class</h2> + +<p>Like most other classes in CodeIgniter, the User Agent class is initialized in your controller using the <dfn>$this->load->library</dfn> function:</p> + +<code>$this->load->library('user_agent');</code> +<p>Once loaded, the object will be available using: <dfn>$this->agent</dfn></p> + +<h2>User Agent Definitions</h2> + +<p>The user agent name definitions are located in a config file located at: <dfn>application/config/user_agents.php</dfn>. You may add items to the +various user agent arrays if needed.</p> + +<h2>Example</h2> + +<p>When the User Agent class is initialized it will attempt to determine whether the user agent browsing your site is +a web browser, a mobile device, or a robot. It will also gather the platform information if it is available.</p> + + +<code> +$this->load->library('user_agent');<br /> +<br /> +if ($this->agent->is_browser())<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$agent = $this->agent->browser().' '.$this->agent->version();<br /> +}<br /> +elseif ($this->agent->is_robot())<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$agent = $this->agent->robot();<br /> +}<br /> +elseif ($this->agent->is_mobile())<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$agent = $this->agent->mobile();<br /> +}<br /> +else<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$agent = 'Unidentified User Agent';<br /> +}<br /> +<br /> +echo $agent;<br /> +<br /> +echo $this->agent->platform(); // Platform info (Windows, Linux, Mac, etc.) +</code> + + +<h1>Function Reference</h1> + + +<h2>$this->agent->is_browser()</h2> +<p>Returns TRUE/FALSE (boolean) if the user agent is a known web browser.</p> + +<code> if ($this->agent->is_browser('Safari'))<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo 'You are using Safari.';<br /> +}<br /> +else if ($this->agent->is_browser())<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo 'You are using a browser.';<br /> +}</code> + +<p class="important"><strong>Note:</strong>&nbsp; The string "Safari" in this example is an array key in the list of browser definitions. +You can find this list in <dfn>application/config/user_agents.php</dfn> if you want to add new browsers or change the stings.</p> + +<h2>$this->agent->is_mobile()</h2> +<p>Returns TRUE/FALSE (boolean) if the user agent is a known mobile device.</p> + +<code> if ($this->agent->is_mobile('iphone'))<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$this->load->view('iphone/home');<br /> +}<br /> +else if ($this->agent->is_mobile())<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$this->load->view('mobile/home');<br /> +}<br/> +else<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;$this->load->view('web/home');<br /> +}</code> + +<h2>$this->agent->is_robot()</h2> +<p>Returns TRUE/FALSE (boolean) if the user agent is a known robot.</p> + +<p class="important"><strong>Note:</strong>&nbsp; The user agent library only contains the most common robot +definitions. It is not a complete list of bots. There are hundreds of them so searching for each one would not be +very efficient. If you find that some bots that commonly visit your site are missing from the list you can add them to your +<dfn>application/config/user_agents.php</dfn> file.</p> + +<h2>$this->agent->is_referral()</h2> +<p>Returns TRUE/FALSE (boolean) if the user agent was referred from another site.</p> + + +<h2>$this->agent->browser()</h2> +<p>Returns a string containing the name of the web browser viewing your site.</p> + +<h2>$this->agent->version()</h2> +<p>Returns a string containing the version number of the web browser viewing your site.</p> + +<h2>$this->agent->mobile()</h2> +<p>Returns a string containing the name of the mobile device viewing your site.</p> + +<h2>$this->agent->robot()</h2> +<p>Returns a string containing the name of the robot viewing your site.</p> + +<h2>$this->agent->platform()</h2> +<p>Returns a string containing the platform viewing your site (Linux, Windows, OS X, etc.).</p> + +<h2>$this->agent->referrer()</h2> +<p>The referrer, if the user agent was referred from another site. Typically you'll test for this as follows:</p> + +<code> if ($this->agent->is_referral())<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo $this->agent->referrer();<br /> +}</code> + + +<h2>$this->agent->agent_string()</h2> +<p>Returns a string containing the full user agent string. Typically it will be something like this:</p> + +<code>Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.0.4) Gecko/20060613 Camino/1.0.2</code> + + +<h2>$this->agent->accept_lang()</h2> +<p>Lets you determine if the user agent accepts a particular language. Example:</p> + +<code>if ($this->agent->accept_lang('en'))<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo 'You accept English!';<br /> +}</code> + +<p class="important"><strong>Note:</strong> This function is not typically very reliable +since some browsers do not provide language info, and even among those that do, it is not always accurate. </p> + + + +<h2>$this->agent->accept_charset()</h2> +<p>Lets you determine if the user agent accepts a particular character set. Example:</p> + +<code>if ($this->agent->accept_charset('utf-8'))<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo 'You browser supports UTF-8!';<br /> +}</code> + +<p class="important"><strong>Note:</strong> This function is not typically very reliable +since some browsers do not provide character-set info, and even among those that do, it is not always accurate. </p> + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="uri.html">URI Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="xmlrpc.html">XML-RPC Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/xmlrpc.html b/user_guide/libraries/xmlrpc.html new file mode 100644 index 0000000..062b22d --- /dev/null +++ b/user_guide/libraries/xmlrpc.html @@ -0,0 +1,519 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>XML-RPC and XML-RPC Server Classes : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +XML-RPC and XML-RPC Server Classes +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>XML-RPC and XML-RPC Server Classes</h1> + + +<p>CodeIgniter's XML-RPC classes permit you to send requests to another server, or set up +your own XML-RPC server to receive requests.</p> + + +<h2>What is XML-RPC?</h2> + +<p>Quite simply it is a way for two computers to communicate over the internet using XML. +One computer, which we will call the <dfn>client</dfn>, sends an XML-RPC <strong>request</strong> to +another computer, which we will call the <dfn>server</dfn>. Once the server receives and processes the request it +will send back a <strong>response</strong> to the client.</p> + +<p>For example, using the MetaWeblog API, an XML-RPC Client (usually a desktop publishing tool) will +send a request to an XML-RPC Server running on your site. This request might be a new weblog entry +being sent for publication, or it could be a request for an existing entry for editing. + +When the XML-RPC Server receives this request it will examine it to determine which class/method should be called to process the request. +Once processed, the server will then send back a response message.</p> + +<p>For detailed specifications, you can visit the <a href="http://www.xmlrpc.com/">XML-RPC</a> site.</p> + +<h2>Initializing the Class</h2> + +<p>Like most other classes in CodeIgniter, the XML-RPC and XML-RPCS classes are initialized in your controller using the <dfn>$this->load->library</dfn> function:</p> + +<p>To load the XML-RPC class you will use:</p> +<code>$this->load->library('xmlrpc');</code> +<p>Once loaded, the xml-rpc library object will be available using: <dfn>$this->xmlrpc</dfn></p> + +<p>To load the XML-RPC Server class you will use:</p> +<code> +$this->load->library('xmlrpc');<br /> +$this->load->library('xmlrpcs'); +</code> +<p>Once loaded, the xml-rpcs library object will be available using: <dfn>$this->xmlrpcs</dfn></p> + +<p class="important"><strong>Note:</strong>&nbsp; When using the XML-RPC Server class you must load BOTH the XML-RPC class and the XML-RPC Server class.</p> + + + +<h2>Sending XML-RPC Requests</h2> + +<p>To send a request to an XML-RPC server you must specify the following information:</p> + +<ul> +<li>The URL of the server</li> +<li>The method on the server you wish to call</li> +<li>The <em>request</em> data (explained below).</li> +</ul> + +<p>Here is a basic example that sends a simple Weblogs.com ping to the <a href="http://pingomatic.com/">Ping-o-Matic</a></p> + + +<code>$this->load->library('xmlrpc');<br /> +<br /> +$this->xmlrpc->server('http://rpc.pingomatic.com/', 80);<br /> +$this->xmlrpc->method('weblogUpdates.ping');<br /> + +<br /> +$request = array('My Photoblog', 'http://www.my-site.com/photoblog/');<br /> +$this->xmlrpc->request($request);<br /> +<br /> +if ( ! $this->xmlrpc->send_request())<br /> +{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;echo $this-&gt;xmlrpc->display_error();<br /> +}</code> + +<h3>Explanation</h3> + +<p>The above code initializes the XML-RPC class, sets the server URL and method to be called (weblogUpdates.ping). The +request (in this case, the title and URL of your site) is placed into an array for transportation, and +compiled using the request() function. +Lastly, the full request is sent. If the <dfn>send_request()</dfn> method returns false we will display the error message +sent back from the XML-RPC Server.</p> + +<h2>Anatomy of a Request</h2> + +<p>An XML-RPC <dfn>request</dfn> is simply the data you are sending to the XML-RPC server. Each piece of data in a request +is referred to as a <dfn>request parameter</dfn>. The above example has two parameters: +The URL and title of your site. When the XML-RPC server receives your request, it will look for parameters it requires.</p> + +<p>Request parameters must be placed into an array for transportation, and each parameter can be one +of seven data types (strings, numbers, dates, etc.). If your parameters are something other than strings +you will have to include the data type in the request array.</p> + +<p>Here is an example of a simple array with three parameters:</p> + +<code>$request = array('John', 'Doe', 'www.some-site.com');<br /> +$this->xmlrpc->request($request);</code> + +<p>If you use data types other than strings, or if you have several different data types, you will place +each parameter into its own array, with the data type in the second position:</p> + +<code> +$request = array (<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array('John', 'string'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array('Doe', 'string'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(FALSE, 'boolean'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(12345, 'int')<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;); +<br /> +$this->xmlrpc->request($request);</code> + +The <a href="#datatypes">Data Types</a> section below has a full list of data types. + + + +<h2>Creating an XML-RPC Server</h2> + +<p>An XML-RPC Server acts as a traffic cop of sorts, waiting for incoming requests and redirecting them to the +appropriate functions for processing.</p> + +<p>To create your own XML-RPC server involves initializing the XML-RPC Server class in your controller where you expect the incoming +request to appear, then setting up an array with mapping instructions so that incoming requests can be sent to the appropriate +class and method for processing.</p> + +<p>Here is an example to illustrate:</p> + +<code> +$this->load->library('xmlrpc');<br /> +$this->load->library('xmlrpcs');<br /> +<br /> +$config['functions']['<var>new_post</var>'] = array('function' => '<dfn>My_blog.new_entry</dfn>'),<br /> +$config['functions']['<var>update_post</var>'] = array('function' => '<dfn>My_blog.update_entry</dfn>');<br /> +$config['object'] = $this;<br /> +<br /> +$this->xmlrpcs->initialize($config);<br /> +$this->xmlrpcs->serve();</code> + +<p>The above example contains an array specifying two method requests that the Server allows. +The allowed methods are on the left side of the array. When either of those are received, they will be mapped to the class and method on the right.</p> + +<p>The '<var>object</var>' key is a special key that you pass an instantiated class object with, which is necessary when the method you are mapping to is not + part of the CodeIgniter super object.</p> + +<p>In other words, if an XML-RPC Client sends a request for the <var>new_post</var> method, your +server will load the <dfn>My_blog</dfn> class and call the <dfn>new_entry</dfn> function. +If the request is for the <var>update_post</var> method, your +server will load the <dfn>My_blog</dfn> class and call the <dfn>update_entry</dfn> function.</p> + +<p>The function names in the above example are arbitrary. You'll decide what they should be called on your server, +or if you are using standardized APIs, like the Blogger or MetaWeblog API, you'll use their function names.</p> + +<p>There are two additional configuration keys you may make use of when initializing the server class: <var>debug</var> can be set to TRUE in order to enable debugging, and <var>xss_clean</var> may be set to FALSE to prevent sending data through the Security library's xss_clean function. + +<h2>Processing Server Requests</h2> + +<p>When the XML-RPC Server receives a request and loads the class/method for processing, it will pass +an object to that method containing the data sent by the client.</p> + +<p>Using the above example, if the <var>new_post</var> method is requested, the server will expect a class +to exist with this prototype:</p> + +<code>class <kbd>My_blog</kbd> extends CI_Controller {<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;function <kbd>new_post</kbd>(<var>$request</var>)<br /> +&nbsp;&nbsp;&nbsp;&nbsp;{<br /> + <br /> +&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +} +</code> + +<p>The <var>$request</var> variable is an object compiled by the Server, which contains the data sent by the XML-RPC Client. +Using this object you will have access to the <em>request parameters</em> enabling you to process the request. When +you are done you will send a <dfn>Response</dfn> back to the Client.</p> + +<p>Below is a real-world example, using the Blogger API. One of the methods in the Blogger API is <dfn>getUserInfo()</dfn>. +Using this method, an XML-RPC Client can send the Server a username and password, in return the Server sends +back information about that particular user (nickname, user ID, email address, etc.). Here is how the processing +function might look:</p> + + +<code>class <kbd>My_blog</kbd> extends CI_Controller {<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;function <kbd>getUserInfo</kbd>(<var>$request</var>)<br /> +&nbsp;&nbsp;&nbsp;&nbsp;{<br /> + +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$username = 'smitty';<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$password = 'secretsmittypass';<br /><br /> + +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this->load->library('xmlrpc');<br /> +&nbsp;&nbsp;&nbsp;&nbsp;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$parameters&nbsp;=&nbsp;$request->output_parameters();<br /> +&nbsp;&nbsp;&nbsp;&nbsp;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($parameters['1'] != $username AND $parameters['2'] != $password)<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this->xmlrpc->send_error_message('100',&nbsp;'Invalid&nbsp;Access');<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +&nbsp;&nbsp;&nbsp;&nbsp;<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$response&nbsp;=&nbsp;array(array('nickname'&nbsp;&nbsp;=>&nbsp;array('Smitty','string'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'userid'&nbsp;&nbsp;&nbsp;&nbsp;=>&nbsp;array('99','string'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'url'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=>&nbsp;array('http://yoursite.com','string'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'email'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=>&nbsp;array('jsmith@yoursite.com','string'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'lastname'&nbsp;&nbsp;=>&nbsp;array('Smith','string'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'firstname'&nbsp;=>&nbsp;array('John','string')<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'struct');<br /> +<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $this->xmlrpc->send_response($response);<br /> +&nbsp;&nbsp;&nbsp;&nbsp;}<br /> +} +</code> + +<h3>Notes:</h3> +<p>The <dfn>output_parameters()</dfn> function retrieves an indexed array corresponding to the request parameters sent by the client. +In the above example, the output parameters will be the username and password.</p> + +<p>If the username and password sent by the client were not valid, and error message is returned using <dfn>send_error_message()</dfn>.</p> + +<p>If the operation was successful, the client will be sent back a response array containing the user's info.</p> + + +<h2>Formatting a Response</h2> + +<p>Similar to <em>Requests</em>, <em>Responses</em> must be formatted as an array. However, unlike requests, a response is an array +<strong>that contains a single item</strong>. This item can be an array with several additional arrays, but there +can be only one primary array index. In other words, the basic prototype is this:</p> + +<code>$response = array('Response data', 'array');</code> + +<p>Responses, however, usually contain multiple pieces of information. In order to accomplish this we must put the response into its own +array so that the primary array continues to contain a single piece of data. Here's an example showing how this might be accomplished:</p> + +<code> +$response = array (<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'first_name' => array('John', 'string'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'last_name' => array('Doe', 'string'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'member_id' => array(123435, 'int'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'todo_list' => array(array('clean house', 'call mom', 'water plants'), 'array'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'struct'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;); +</code> + +<p class="important">Notice that the above array is formatted as a <dfn>struct</dfn>. This is the most common data type for responses.</p> + +<p>As with Requests, a response can be one of the seven data types listed in the <a href="#datatypes">Data Types</a> section.</p> + + +<h2>Sending an Error Response</h2> + +<p>If you need to send the client an error response you will use the following:</p> + +<code>return $this->xmlrpc->send_error_message('123', 'Requested data not available');</code> + +<p>The first parameter is the error number while the second parameter is the error message.</p> + + + + + + +<h2>Creating Your Own Client and Server</h2> + +<p>To help you understand everything we've covered thus far, let's create a couple controllers that act as +XML-RPC Client and Server. You'll use the Client to send a request to the Server and receive a response.</p> + +<h3>The Client</h3> + +<p>Using a text editor, create a controller called <dfn>xmlrpc_client.php</dfn>. +In it, place this code and save it to your <samp>applications/controllers/</samp> folder:</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="32">&lt;?php + +class Xmlrpc_client extends CI_Controller { + + function index() + { + $this->load->helper('url'); + $server_url = site_url('xmlrpc_server'); + + $this->load->library('xmlrpc'); + + $this->xmlrpc->server($server_url, 80); + $this->xmlrpc->method('Greetings'); + + $request = array('How is it going?'); + $this->xmlrpc->request($request); + + if ( ! $this->xmlrpc->send_request()) + { + echo $this->xmlrpc->display_error(); + } + else + { + echo '<pre>'; + print_r($this->xmlrpc->display_response()); + echo '</pre>'; + } + } +} +?></textarea> + +<p>Note: In the above code we are using a "url helper". You can find more information in the <a href="../general/helpers.html">Helpers Functions</a> page.</p> + +<h3>The Server</h3> + +<p>Using a text editor, create a controller called <dfn>xmlrpc_server.php</dfn>. +In it, place this code and save it to your <samp>applications/controllers/</samp> folder:</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="30">&lt;?php + +class Xmlrpc_server extends CI_Controller { + + function index() + { + $this->load->library('xmlrpc'); + $this->load->library('xmlrpcs'); + + $config['functions']['Greetings'] = array('function' => 'Xmlrpc_server.process'); + + $this->xmlrpcs->initialize($config); + $this->xmlrpcs->serve(); + } + + + function process($request) + { + $parameters = $request->output_parameters(); + + $response = array( + array( + 'you_said' => $parameters['0'], + 'i_respond' => 'Not bad at all.'), + 'struct'); + + return $this->xmlrpc->send_response($response); + } +} +?></textarea> + +<h3>Try it!</h3> + +<p>Now visit the your site using a URL similar to this:</p> +<code>example.com/index.php/<var>xmlrpc_client</var>/</code> + +<p>You should now see the message you sent to the server, and its response back to you.</p> + +<p>The client you created sends a message ("How's is going?") to the server, along with a request for the "Greetings" method. +The Server receives the request and maps it to the "process" function, where a response is sent back.</p> + +<h2>Using Associative Arrays In a Request Parameter</h2> + +<p>If you wish to use an associative array in your method parameters you will need to use a struct datatype:</p> + +<code>$request = array(<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Param 0<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'name'=&gt;'John'<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'struct'<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Param 1<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'size'=&gt;'large',<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'shape'=&gt;'round'<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ),<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'struct'<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br /> + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> + $this-&gt;xmlrpc-&gt;request($request);</code> + +<p>You can retrieve the associative array when processing the request in the Server.</p> + +<code>$parameters = $request-&gt;output_parameters();<br /> + $name = $parameters['0']['name'];<br /> + $size = $parameters['1']['size'];<br /> + $size = $parameters['1']['shape']; </code> + +<h1>XML-RPC Function Reference</h1> + +<h2>$this->xmlrpc->server()</h2> +<p>Sets the URL and port number of the server to which a request is to be sent:</p> +<code>$this->xmlrpc->server('http://www.sometimes.com/pings.php', 80);</code> + +<h2>$this->xmlrpc->timeout()</h2> +<p>Set a time out period (in seconds) after which the request will be canceled:</p> +<code>$this->xmlrpc->timeout(6);</code> + +<h2>$this->xmlrpc->method()</h2> +<p>Sets the method that will be requested from the XML-RPC server:</p> +<code>$this->xmlrpc->method('<var>method</var>');</code> + +<p>Where <var>method</var> is the name of the method.</p> + +<h2>$this->xmlrpc->request()</h2> +<p>Takes an array of data and builds request to be sent to XML-RPC server:</p> +<code>$request = array(array('My Photoblog', 'string'), 'http://www.yoursite.com/photoblog/');<br /> +$this->xmlrpc->request($request);</code> + +<h2>$this->xmlrpc->send_request()</h2> +<p>The request sending function. Returns boolean TRUE or FALSE based on success for failure, enabling it to be used conditionally.</p> + +<h2>$this->xmlrpc->set_debug(TRUE);</h2> +<p>Enables debugging, which will display a variety of information and error data helpful during development.</p> + + +<h2>$this->xmlrpc->display_error()</h2> +<p>Returns an error message as a string if your request failed for some reason.</p> +<code>echo $this->xmlrpc->display_error();</code> + +<h2>$this->xmlrpc->display_response()</h2> +<p>Returns the response from the remote server once request is received. The response will typically be an associative array.</p> +<code>$this->xmlrpc->display_response();</code> + +<h2>$this->xmlrpc->send_error_message()</h2> +<p>This function lets you send an error message from your server to the client. First parameter is the error number while the second parameter +is the error message.</p> +<code>return $this->xmlrpc->send_error_message('123', 'Requested data not available');</code> + +<h2>$this->xmlrpc->send_response()</h2> +<p>Lets you send the response from your server to the client. An array of valid data values must be sent with this method.</p> +<code>$response = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'flerror' => array(FALSE, 'boolean'),<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'message' => "Thanks for the ping!"<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'struct');<br /> +return $this->xmlrpc->send_response($response);</code> + + +<a name="datatypes"></a> +<h2>Data Types</h2> + +<p>According to the <a href="http://www.xmlrpc.com/spec">XML-RPC spec</a> there are seven types +of values that you can send via XML-RPC:</p> + +<ul> +<li><em>int</em> or <em>i4</em></li> +<li><em>boolean</em></li> +<li><em>string</em></li> +<li><em>double</em></li> +<li><em>dateTime.iso8601</em></li> +<li><em>base64</em></li> +<li><em>struct</em> (contains array of values)</li> +<li><em>array</em> (contains array of values)</li> +</ul> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="user_agent.html">User Agent Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="zip.html">Zip Encoding Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/libraries/zip.html b/user_guide/libraries/zip.html new file mode 100644 index 0000000..f4bd832 --- /dev/null +++ b/user_guide/libraries/zip.html @@ -0,0 +1,288 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Zip Encoding Class : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Zip Encoding Class +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Zip Encoding Class</h1> +<p>CodeIgniter's Zip Encoding Class classes permit you to create Zip archives. Archives can be downloaded to your +desktop or saved to a directory.</p> + + +<h2>Initializing the Class</h2> +<p>Like most other classes in CodeIgniter, the Zip class is initialized in your controller using the <dfn>$this->load->library</dfn> function:</p> + +<code>$this->load->library('zip');</code> +<p>Once loaded, the Zip library object will be available using: <dfn>$this->zip</dfn></p> + + +<h2>Usage Example</h2> + +<p>This example demonstrates how to compress a file, save it to a folder on your server, and download it to your desktop.</p> + +<code> +$name = 'mydata1.txt';<br /> +$data = 'A Data String!';<br /> +<br /> +$this->zip->add_data($name, $data);<br /> +<br /> +// Write the zip file to a folder on your server. Name it "my_backup.zip"<br /> +$this->zip->archive('/path/to/directory/my_backup.zip'); +<br /><br /> + // Download the file to your desktop. Name it "my_backup.zip"<br /> +$this->zip->download('my_backup.zip'); +</code> + +<h1>Function Reference</h1> + +<h2>$this->zip->add_data()</h2> + +<p>Permits you to add data to the Zip archive. The first parameter must contain the name you would like +given to the file, the second parameter must contain the file data as a string:</p> + +<code> +$name = 'my_bio.txt';<br /> +$data = 'I was born in an elevator...';<br /> +<br /> +$this->zip->add_data($name, $data); +</code> + +<p>You are allowed multiple calls to this function in order to +add several files to your archive. Example:</p> + +<code> +$name = 'mydata1.txt';<br /> +$data = 'A Data String!';<br /> +$this->zip->add_data($name, $data);<br /> +<br /> +$name = 'mydata2.txt';<br /> +$data = 'Another Data String!';<br /> +$this->zip->add_data($name, $data);<br /> +</code> + +<p>Or you can pass multiple files using an array:</p> + +<code> +$data = array(<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'mydata1.txt' => 'A Data String!',<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'mydata2.txt' => 'Another Data String!'<br /> +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br /> +<br /> +$this->zip->add_data($data);<br /> +<br /> +$this->zip->download('my_backup.zip'); +</code> + +<p>If you would like your compressed data organized into sub-folders, include the path as part of the filename:</p> + +<code> +$name = '<kbd>personal/</kbd>my_bio.txt';<br /> +$data = 'I was born in an elevator...';<br /> +<br /> +$this->zip->add_data($name, $data); +</code> + +<p>The above example will place <dfn>my_bio.txt</dfn> inside a folder called <kbd>personal</kbd>.</p> + + +<h2>$this->zip->add_dir()</h2> + +<p>Permits you to add a directory. Usually this function is unnecessary since you can place your data into folders when +using <dfn>$this->zip->add_data()</dfn>, but if you would like to create an empty folder you can do so. Example:</p> + +<code>$this->zip->add_dir('myfolder'); // Creates a folder called "myfolder"</code> + + + +<h2>$this->zip->read_file()</h2> + +<p>Permits you to compress a file that already exists somewhere on your server. Supply a file path and the zip class will +read it and add it to the archive:</p> + +<code> +$path = '/path/to/photo.jpg';<br /><br /> +$this->zip->read_file($path); +<br /><br /> + // Download the file to your desktop. Name it "my_backup.zip"<br /> +$this->zip->download('my_backup.zip'); +</code> + +<p>If you would like the Zip archive to maintain the directory structure of the file in it, pass <kbd>TRUE</kbd> (boolean) in the +second parameter. Example:</p> + + +<code> +$path = '/path/to/photo.jpg';<br /><br /> +$this->zip->read_file($path, <kbd>TRUE</kbd>); +<br /><br /> + // Download the file to your desktop. Name it "my_backup.zip"<br /> +$this->zip->download('my_backup.zip'); +</code> + +<p>In the above example, <dfn>photo.jpg</dfn> will be placed inside two folders: <kbd>path/to/</kbd></p> + + + +<h2>$this->zip->read_dir()</h2> + +<p>Permits you to compress a folder (and its contents) that already exists somewhere on your server. Supply a file path to the +directory and the zip class will recursively read it and recreate it as a Zip archive. All files contained within the +supplied path will be encoded, as will any sub-folders contained within it. Example:</p> + +<code> +$path = '/path/to/your/directory/';<br /><br /> +$this->zip->read_dir($path); +<br /><br /> + // Download the file to your desktop. Name it "my_backup.zip"<br /> +$this->zip->download('my_backup.zip'); +</code> + +<p>By default the Zip archive will place all directories listed in the first parameter inside the zip. If you want the tree preceding the target folder to be ignored +you can pass <kbd>FALSE</kbd> (boolean) in the second parameter. Example:</p> + +<code> +$path = '/path/to/your/directory/';<br /><br /> +$this->zip->read_dir($path, FALSE); +</code> + +<p>This will create a ZIP with the folder "directory" inside, then all sub-folders stored correctly inside that, but will not include the folders <samp>/path/to/your</samp>.</p> + + + + +<h2>$this->zip->archive()</h2> + +<p>Writes the Zip-encoded file to a directory on your server. Submit a valid server path ending in the file name. Make sure the +directory is writable (666 or 777 is usually OK). Example:</p> + +<code>$this->zip->archive('/path/to/folder/myarchive.zip'); // Creates a file named myarchive.zip</code> + + +<h2>$this->zip->download()</h2> + +<p>Causes the Zip file to be downloaded from your server. The function must be passed the name you would like the zip file called. +Example:</p> + +<code>$this->zip->download('latest_stuff.zip'); // File will be named "latest_stuff.zip"</code> + +<p class="important"><strong>Note:</strong>&nbsp; Do not display any data in the controller in which you call this function since it sends various server headers +that cause the download to happen and the file to be treated as binary.</p> + + +<h2>$this->zip->get_zip()</h2> + +<p>Returns the Zip-compressed file data. Generally you will not need this function unless you want to do something unique with the data. +Example:</p> + +<code> +$name = 'my_bio.txt';<br /> +$data = 'I was born in an elevator...';<br /> +<br /> +$this->zip->add_data($name, $data);<br /><br /> + +$zip_file = $this->zip->get_zip(); +</code> + + +<h2>$this->zip->clear_data()</h2> + +<p>The Zip class caches your zip data so that it doesn't need to recompile the Zip archive for each function you use above. +If, however, you need to create multiple Zips, each with different data, you can clear the cache between calls. Example:</p> + +<code> +$name = 'my_bio.txt';<br /> +$data = 'I was born in an elevator...';<br /> +<br /> +$this->zip->add_data($name, $data);<br /> +$zip_file = $this->zip->get_zip();<br /> +<br /> +<kbd>$this->zip->clear_data();</kbd> +<br /><br /> + +$name = 'photo.jpg';<br /> +$this->zip->read_file("/path/to/photo.jpg"); // Read the file's contents<br /> +<br /><br /> +$this->zip->download('myphotos.zip'); +</code> + + + + + + + + + + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="xmlrpc.html"> XML-RPC Class</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="caching.html">Caching Class</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/license.html b/user_guide/license.html new file mode 100644 index 0000000..124f792 --- /dev/null +++ b/user_guide/license.html @@ -0,0 +1,108 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter License Agreement : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='userguide.css' /> + +<script type="text/javascript" src="nav/nav.js"></script> +<script type="text/javascript" src="nav/prototype.lite.js"></script> +<script type="text/javascript" src="nav/moo.fx.js"></script> +<script type="text/javascript" src="nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('null');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> + +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +License Agreement +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + + + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>CodeIgniter License Agreement</h1> + +<p>Copyright (c) 2008 - 2014, EllisLab, Inc.<br /> +Copyright (c) 2014 - 2015, British Columbia Institute of Technology<br /> +All rights reserved.</p> + +<p>This license is a legal agreement between you and the British Columbia Institute of Technology for the use of CodeIgniter Software (the "Software"). By obtaining the Software you agree to comply with the terms and conditions of this license.</p> + +<h2>Permitted Use</h2> +<p>You are permitted to use, copy, modify, and distribute the Software and its documentation, with or without modification, for any purpose, provided that the following conditions are met:</p> + +<ol> +<li>A copy of this license agreement must be included with the distribution.</li> +<li>Redistributions of source code must retain the above copyright notice in all source code files.</li> +<li>Redistributions in binary form must reproduce the above copyright notice in the documentation and/or other materials provided with the distribution.</li> +<li>Any files that have been modified must carry notices stating the nature of the change and the names of those who changed them.</li> +<li>Products derived from the Software must include an acknowledgment that they are derived from CodeIgniter in their documentation and/or other materials provided with the distribution.</li> +<li>Products derived from the Software may not be called "CodeIgniter", nor may "CodeIgniter" appear in their name, without prior written permission from British Columbia Institute of Technology.</li> +</ol> + +<h2>Indemnity</h2> +<p>You agree to indemnify and hold harmless the authors of the Software and any contributors for any direct, indirect, incidental, or consequential third-party claims, actions or suits, as well as any related expenses, liabilities, damages, settlements or fees arising from your use or misuse of the Software, or a violation of any terms of this license.</p> + +<h2>Disclaimer of Warranty</h2> +<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF QUALITY, PERFORMANCE, NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.</p> + +<h2>Limitations of Liability</h2> +<p>YOU ASSUME ALL RISK ASSOCIATED WITH THE INSTALLATION AND USE OF THE SOFTWARE. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS OF THE SOFTWARE BE LIABLE FOR CLAIMS, DAMAGES OR OTHER LIABILITY ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE. LICENSE HOLDERS ARE SOLELY RESPONSIBLE FOR DETERMINING THE APPROPRIATENESS OF USE AND ASSUME ALL RISKS ASSOCIATED WITH ITS USE, INCLUDING BUT NOT LIMITED TO THE RISKS OF PROGRAM ERRORS, DAMAGE TO EQUIPMENT, LOSS OF DATA OR SOFTWARE PROGRAMS, OR UNAVAILABILITY OR INTERRUPTION OF OPERATIONS.</p> + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="general/requirements.html">Server Requirements</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="changelog.html">Change Log</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/nav/hacks.txt b/user_guide/nav/hacks.txt new file mode 100644 index 0000000..8c17f00 --- /dev/null +++ b/user_guide/nav/hacks.txt @@ -0,0 +1,10 @@ +I did the following hack in moo.fx.js: + +At line 79 in the toggle: function() function, I added: + +document.getElementById('nav').style.display = 'block'; + +-- Rick Ellis + + +Also removed fx.Opacity and fx.Height from moo.fx.js -- Pascal \ No newline at end of file diff --git a/user_guide/nav/moo.fx.js b/user_guide/nav/moo.fx.js new file mode 100644 index 0000000..256371d --- /dev/null +++ b/user_guide/nav/moo.fx.js @@ -0,0 +1,83 @@ +/* +moo.fx, simple effects library built with prototype.js (http://prototype.conio.net). +by Valerio Proietti (http://mad4milk.net) MIT-style LICENSE. +for more info (http://moofx.mad4milk.net). +10/24/2005 +v(1.0.2) +*/ + +//base +var fx = new Object(); +fx.Base = function(){}; +fx.Base.prototype = { + setOptions: function(options) { + this.options = { + duration: 500, + onComplete: '' + } + Object.extend(this.options, options || {}); + }, + + go: function() { + this.duration = this.options.duration; + this.startTime = (new Date).getTime(); + this.timer = setInterval (this.step.bind(this), 13); + }, + + step: function() { + var time = (new Date).getTime(); + var Tpos = (time - this.startTime) / (this.duration); + if (time >= this.duration+this.startTime) { + this.now = this.to; + clearInterval (this.timer); + this.timer = null; + if (this.options.onComplete) setTimeout(this.options.onComplete.bind(this), 10); + } + else { + this.now = ((-Math.cos(Tpos*Math.PI)/2) + 0.5) * (this.to-this.from) + this.from; + //this time-position, sinoidal transition thing is from script.aculo.us + } + this.increase(); + }, + + custom: function(from, to) { + if (this.timer != null) return; + this.from = from; + this.to = to; + this.go(); + }, + + hide: function() { + this.now = 0; + this.increase(); + }, + + clearTimer: function() { + clearInterval(this.timer); + this.timer = null; + } +} + +//stretchers +fx.Layout = Class.create(); +fx.Layout.prototype = Object.extend(new fx.Base(), { + initialize: function(el, options) { + this.el = $(el); + this.el.style.overflow = "hidden"; + this.el.iniWidth = this.el.offsetWidth; + this.el.iniHeight = this.el.offsetHeight; + this.setOptions(options); + } +}); + +fx.Height = Class.create(); +Object.extend(Object.extend(fx.Height.prototype, fx.Layout.prototype), { + increase: function() { + this.el.style.height = this.now + "px"; + }, + + toggle: function() { + if (this.el.offsetHeight > 0) this.custom(this.el.offsetHeight, 0); + else this.custom(0, this.el.scrollHeight); + } +}); diff --git a/user_guide/nav/nav.js b/user_guide/nav/nav.js new file mode 100644 index 0000000..f468224 --- /dev/null +++ b/user_guide/nav/nav.js @@ -0,0 +1,156 @@ +function create_menu(basepath) +{ + var base = (basepath == 'null') ? '' : basepath; + + document.write( + '<table cellpadding="0" cellspaceing="0" border="0" style="width:98%"><tr>' + + '<td class="td" valign="top">' + + + '<ul>' + + '<li><a href="'+base+'index.html">User Guide Home</a></li>' + + '<li><a href="'+base+'toc.html">Table of Contents Page</a></li>' + + '</ul>' + + + '<h3>Basic Info</h3>' + + '<ul>' + + '<li><a href="'+base+'general/requirements.html">Server Requirements</a></li>' + + '<li><a href="'+base+'license.html">License Agreement</a></li>' + + '<li><a href="'+base+'changelog.html">Change Log</a></li>' + + '<li><a href="'+base+'general/credits.html">Credits</a></li>' + + '</ul>' + + + '<h3>Installation</h3>' + + '<ul>' + + '<li><a href="'+base+'installation/downloads.html">Downloading CodeIgniter</a></li>' + + '<li><a href="'+base+'installation/index.html">Installation Instructions</a></li>' + + '<li><a href="'+base+'installation/upgrading.html">Upgrading from a Previous Version</a></li>' + + '<li><a href="'+base+'installation/troubleshooting.html">Troubleshooting</a></li>' + + '</ul>' + + + '<h3>Introduction</h3>' + + '<ul>' + + '<li><a href="'+base+'overview/getting_started.html">Getting Started</a></li>' + + '<li><a href="'+base+'overview/at_a_glance.html">CodeIgniter at a Glance</a></li>' + + '<li><a href="'+base+'overview/cheatsheets.html">CodeIgniter Cheatsheets</a></li>' + + '<li><a href="'+base+'overview/features.html">Supported Features</a></li>' + + '<li><a href="'+base+'overview/appflow.html">Application Flow Chart</a></li>' + + '<li><a href="'+base+'overview/mvc.html">Model-View-Controller</a></li>' + + '<li><a href="'+base+'overview/goals.html">Architectural Goals</a></li>' + + '</ul>' + + + '<h3>Tutorial</h3>' + + '<ul>' + + '<li><a href="'+base+'tutorial/index.html">Introduction</a></li>' + + '<li><a href="'+base+'tutorial/static_pages.html">Static pages</a></li>' + + '<li><a href="'+base+'tutorial/news_section.html">News section</a></li>' + + '<li><a href="'+base+'tutorial/create_news_items.html">Create news items</a></li>' + + '<li><a href="'+base+'tutorial/conclusion.html">Conclusion</a></li>' + + '</ul>' + + + '</td><td class="td_sep" valign="top">' + + + '<h3>General Topics</h3>' + + '<ul>' + + '<li><a href="'+base+'general/urls.html">CodeIgniter URLs</a></li>' + + '<li><a href="'+base+'general/controllers.html">Controllers</a></li>' + + '<li><a href="'+base+'general/reserved_names.html">Reserved Names</a></li>' + + '<li><a href="'+base+'general/views.html">Views</a></li>' + + '<li><a href="'+base+'general/models.html">Models</a></li>' + + '<li><a href="'+base+'general/helpers.html">Helpers</a></li>' + + '<li><a href="'+base+'general/libraries.html">Using CodeIgniter Libraries</a></li>' + + '<li><a href="'+base+'general/creating_libraries.html">Creating Your Own Libraries</a></li>' + + '<li><a href="'+base+'general/drivers.html">Using CodeIgniter Drivers</a></li>' + + '<li><a href="'+base+'general/creating_drivers.html">Creating Your Own Drivers</a></li>' + + '<li><a href="'+base+'general/core_classes.html">Creating Core Classes</a></li>' + + '<li><a href="'+base+'general/hooks.html">Hooks - Extending the Core</a></li>' + + '<li><a href="'+base+'general/autoloader.html">Auto-loading Resources</a></li>' + + '<li><a href="'+base+'general/common_functions.html">Common Functions</a></li>' + + '<li><a href="'+base+'general/routing.html">URI Routing</a></li>' + + '<li><a href="'+base+'general/errors.html">Error Handling</a></li>' + + '<li><a href="'+base+'general/caching.html">Caching</a></li>' + + '<li><a href="'+base+'general/profiling.html">Profiling Your Application</a></li>' + + '<li><a href="'+base+'general/cli.html">Running via the CLI</a></li>' + + '<li><a href="'+base+'general/managing_apps.html">Managing Applications</a></li>' + + '<li><a href="'+base+'general/environments.html">Handling Multiple Environments</a></li>' + + '<li><a href="'+base+'general/alternative_php.html">Alternative PHP Syntax</a></li>' + + '<li><a href="'+base+'general/security.html">Security</a></li>' + + '<li><a href="'+base+'general/styleguide.html">PHP Style Guide</a></li>' + + '<li><a href="'+base+'doc_style/index.html">Writing Documentation</a></li>' + + '</ul>' + + + '<h3>Additional Resources</h3>' + + '<ul>' + + '<li><a href="http://forum.codeigniter.com/">Community Forums</a></li>' + + '<li><a href="https://github.com/bcit-ci/CodeIgniter/wiki">Community Wiki</a></li>' + + '</ul>' + + + '</td><td class="td_sep" valign="top">' + + + '<h3>Class Reference</h3>' + + '<ul>' + + '<li><a href="'+base+'libraries/benchmark.html">Benchmarking Class</a></li>' + + '<li><a href="'+base+'libraries/calendar.html">Calendar Class</a></li>' + + '<li><a href="'+base+'libraries/cart.html">Cart Class</a></li>' + + '<li><a href="'+base+'libraries/config.html">Config Class</a></li>' + + '<li><a href="'+base+'libraries/email.html">Email Class</a></li>' + + '<li><a href="'+base+'libraries/encryption.html">Encryption Class</a></li>' + + '<li><a href="'+base+'libraries/file_uploading.html">File Uploading Class</a></li>' + + '<li><a href="'+base+'libraries/form_validation.html">Form Validation Class</a></li>' + + '<li><a href="'+base+'libraries/ftp.html">FTP Class</a></li>' + + '<li><a href="'+base+'libraries/table.html">HTML Table Class</a></li>' + + '<li><a href="'+base+'libraries/image_lib.html">Image Manipulation Class</a></li>' + + '<li><a href="'+base+'libraries/input.html">Input Class</a></li>' + + '<li><a href="'+base+'libraries/javascript.html">Javascript Class</a></li>' + + '<li><a href="'+base+'libraries/loader.html">Loader Class</a></li>' + + '<li><a href="'+base+'libraries/language.html">Language Class</a></li>' + + '<li><a href="'+base+'libraries/migration.html">Migration Class</a></li>' + + '<li><a href="'+base+'libraries/output.html">Output Class</a></li>' + + '<li><a href="'+base+'libraries/pagination.html">Pagination Class</a></li>' + + '<li><a href="'+base+'libraries/security.html">Security Class</a></li>' + + '<li><a href="'+base+'libraries/sessions.html">Session Class</a></li>' + + '<li><a href="'+base+'libraries/trackback.html">Trackback Class</a></li>' + + '<li><a href="'+base+'libraries/parser.html">Template Parser Class</a></li>' + + '<li><a href="'+base+'libraries/typography.html">Typography Class</a></li>' + + '<li><a href="'+base+'libraries/unit_testing.html">Unit Testing Class</a></li>' + + '<li><a href="'+base+'libraries/uri.html">URI Class</a></li>' + + '<li><a href="'+base+'libraries/user_agent.html">User Agent Class</a></li>' + + '<li><a href="'+base+'libraries/xmlrpc.html">XML-RPC Class</a></li>' + + '<li><a href="'+base+'libraries/zip.html">Zip Encoding Class</a></li>' + + '</ul>' + + + '</td><td class="td_sep" valign="top">' + + + '<h3>Driver Reference</h3>' + + '<ul>' + + '<li><a href="'+base+'libraries/caching.html">Caching Class</a></li>' + + '<li><a href="'+base+'database/index.html">Database Class</a></li>' + + '<li><a href="'+base+'libraries/javascript.html">Javascript Class</a></li>' + + '</ul>' + + + '<h3>Helper Reference</h3>' + + '<ul>' + + '<li><a href="'+base+'helpers/array_helper.html">Array Helper</a></li>' + + '<li><a href="'+base+'helpers/captcha_helper.html">CAPTCHA Helper</a></li>' + + '<li><a href="'+base+'helpers/cookie_helper.html">Cookie Helper</a></li>' + + '<li><a href="'+base+'helpers/date_helper.html">Date Helper</a></li>' + + '<li><a href="'+base+'helpers/directory_helper.html">Directory Helper</a></li>' + + '<li><a href="'+base+'helpers/download_helper.html">Download Helper</a></li>' + + '<li><a href="'+base+'helpers/email_helper.html">Email Helper</a></li>' + + '<li><a href="'+base+'helpers/file_helper.html">File Helper</a></li>' + + '<li><a href="'+base+'helpers/form_helper.html">Form Helper</a></li>' + + '<li><a href="'+base+'helpers/html_helper.html">HTML Helper</a></li>' + + '<li><a href="'+base+'helpers/inflector_helper.html">Inflector Helper</a></li>' + + '<li><a href="'+base+'helpers/language_helper.html">Language Helper</a></li>' + + '<li><a href="'+base+'helpers/number_helper.html">Number Helper</a></li>' + + '<li><a href="'+base+'helpers/path_helper.html">Path Helper</a></li>' + + '<li><a href="'+base+'helpers/security_helper.html">Security Helper</a></li>' + + '<li><a href="'+base+'helpers/smiley_helper.html">Smiley Helper</a></li>' + + '<li><a href="'+base+'helpers/string_helper.html">String Helper</a></li>' + + '<li><a href="'+base+'helpers/text_helper.html">Text Helper</a></li>' + + '<li><a href="'+base+'helpers/typography_helper.html">Typography Helper</a></li>' + + '<li><a href="'+base+'helpers/url_helper.html">URL Helper</a></li>' + + '<li><a href="'+base+'helpers/xml_helper.html">XML Helper</a></li>' + + '</ul>' + + + '</td></tr></table>'); +} \ No newline at end of file diff --git a/user_guide/nav/prototype.lite.js b/user_guide/nav/prototype.lite.js new file mode 100644 index 0000000..e6c3622 --- /dev/null +++ b/user_guide/nav/prototype.lite.js @@ -0,0 +1,127 @@ +/* Prototype JavaScript framework + * (c) 2005 Sam Stephenson <sam@conio.net> + * + * Prototype is freely distributable under the terms of an MIT-style license. + * + * For details, see the Prototype web site: http://prototype.conio.net/ + * +/*--------------------------------------------------------------------------*/ + + +//note: this is a stripped down version of prototype, to be used with moo.fx by mad4milk (http://moofx.mad4milk.net). + +var Class = { + create: function() { + return function() { + this.initialize.apply(this, arguments); + } + } +} + +Object.extend = function(destination, source) { + for (property in source) { + destination[property] = source[property]; + } + return destination; +} + +Function.prototype.bind = function(object) { + var __method = this; + return function() { + return __method.apply(object, arguments); + } +} + +function $() { + var elements = new Array(); + + for (var i = 0; i < arguments.length; i++) { + var element = arguments[i]; + if (typeof element == 'string') + element = document.getElementById(element); + + if (arguments.length == 1) + return element; + + elements.push(element); + } + + return elements; +} + +//------------------------- + +document.getElementsByClassName = function(className) { + var children = document.getElementsByTagName('*') || document.all; + var elements = new Array(); + + for (var i = 0; i < children.length; i++) { + var child = children[i]; + var classNames = child.className.split(' '); + for (var j = 0; j < classNames.length; j++) { + if (classNames[j] == className) { + elements.push(child); + break; + } + } + } + + return elements; +} + +//------------------------- + +if (!window.Element) { + var Element = new Object(); +} + +Object.extend(Element, { + remove: function(element) { + element = $(element); + element.parentNode.removeChild(element); + }, + + hasClassName: function(element, className) { + element = $(element); + if (!element) + return; + var a = element.className.split(' '); + for (var i = 0; i < a.length; i++) { + if (a[i] == className) + return true; + } + return false; + }, + + addClassName: function(element, className) { + element = $(element); + Element.removeClassName(element, className); + element.className += ' ' + className; + }, + + removeClassName: function(element, className) { + element = $(element); + if (!element) + return; + var newClassName = ''; + var a = element.className.split(' '); + for (var i = 0; i < a.length; i++) { + if (a[i] != className) { + if (i > 0) + newClassName += ' '; + newClassName += a[i]; + } + } + element.className = newClassName; + }, + + // removes whitespace-only text node children + cleanWhitespace: function(element) { + element = $(element); + for (var i = 0; i < element.childNodes.length; i++) { + var node = element.childNodes[i]; + if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) + Element.remove(node); + } + } +}); \ No newline at end of file diff --git a/user_guide/nav/user_guide_menu.js b/user_guide/nav/user_guide_menu.js new file mode 100644 index 0000000..ce5d077 --- /dev/null +++ b/user_guide/nav/user_guide_menu.js @@ -0,0 +1,4 @@ +window.onload = function() { + myHeight = new fx.Height('nav', {duration: 400}); + myHeight.hide(); +} \ No newline at end of file diff --git a/user_guide/overview/appflow.html b/user_guide/overview/appflow.html new file mode 100644 index 0000000..a19503e --- /dev/null +++ b/user_guide/overview/appflow.html @@ -0,0 +1,95 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Application Flow Chart : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Appflow +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Application Flow Chart</h1> + +<p>The following graphic illustrates how data flows throughout the system:</p> + +<div><img src="../images/appflowchart.gif" width="769" height="212" alt="CodeIgniter application flow"></div> + + +<ol> +<li>The index.php serves as the front controller, initializing the base resources needed to run CodeIgniter.</li> +<li>The Router examines the HTTP request to determine what should be done with it.</li> +<li>If a cache file exists, it is sent directly to the browser, bypassing the normal system execution.</li> +<li>Security. Before the application controller is loaded, the HTTP request and any user submitted data is filtered for security.</li> +<li>The Controller loads the model, core libraries, helpers, and any other resources needed to process the specific request.</li> +<li>The finalized View is rendered then sent to the web browser to be seen. If caching is enabled, the view is cached first so +that on subsequent requests it can be served.</li> +</ol> + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="features.html">CodeIgniter Features</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="mvc.html">Model-View-Controller</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/overview/at_a_glance.html b/user_guide/overview/at_a_glance.html new file mode 100644 index 0000000..1fa9ab5 --- /dev/null +++ b/user_guide/overview/at_a_glance.html @@ -0,0 +1,162 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter at a Glance : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +What is CodeIgniter? +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>CodeIgniter at a Glance</h1> + + +<h2>CodeIgniter is an Application Framework</h2> + +<p>CodeIgniter is a toolkit for people who build web applications using PHP. Its goal is to enable you to develop projects much faster than you could if you were writing code +from scratch, by providing a rich set of libraries for commonly needed tasks, as well as a simple interface and +logical structure to access these libraries. CodeIgniter lets you creatively focus on your project by +minimizing the amount of code needed for a given task.</p> + +<h2>CodeIgniter is Free</h2> +<p>CodeIgniter is licensed under an Apache/BSD-style open source license so you can use it however you please. +For more information please read the <a href="../license.html">license agreement</a>.</p> + +<h2>CodeIgniter is Light Weight</h2> +<p>Truly light weight. The core system requires only a few very small libraries. This is in stark contrast to many frameworks that require significantly more resources. +Additional libraries are loaded dynamically upon request, based on your needs for a given process, so the base system +is very lean and quite fast. +</p> + +<h2>CodeIgniter is Fast</h2> +<p>Really fast. We challenge you to find a framework that has better performance than CodeIgniter.</p> + + +<h2>CodeIgniter Uses M-V-C</h2> +<p>CodeIgniter uses the Model-View-Controller approach, which allows great separation between logic and presentation. +This is particularly good for projects in which designers are working with your template files, as the code these file contain will be minimized. We describe MVC in more detail on its own page.</p> + +<h2>CodeIgniter Generates Clean URLs</h2> +<p>The URLs generated by CodeIgniter are clean and search-engine friendly. Rather than using the standard "query string" +approach to URLs that is synonymous with dynamic systems, CodeIgniter uses a segment-based approach:</p> + +<code>example.com/<var>news</var>/<dfn>article</dfn>/<samp>345</samp></code> + +<p>Note: By default the index.php file is included in the URL but it can be removed using a simple .htaccess file.</p> + +<h2>CodeIgniter Packs a Punch</h2> +<p>CodeIgniter comes with full-range of libraries that enable the most commonly needed web development tasks, +like accessing a database, sending email, validating form data, maintaining sessions, manipulating images, working with XML-RPC data and +much more.</p> + +<h2>CodeIgniter is Extensible</h2> +<p>The system can be easily extended through the use of your own libraries, helpers, or through class extensions or system hooks.</p> + + +<h2>CodeIgniter Does Not Require a Template Engine</h2> +<p>Although CodeIgniter <em>does</em> come with a simple template parser that can be optionally used, it does not force you to use one. + +Template engines simply can not match the performance of native PHP, and the syntax that must be learned to use a template +engine is usually only marginally easier than learning the basics of PHP. Consider this block of PHP code:</p> + +<code>&lt;ul><br /> +<br /> +&lt;?php foreach ($addressbook as $name):?><br /> +<br /> +&lt;li>&lt;?=$name?>&lt;/li><br /> +<br /> +&lt;?php endforeach; ?><br /> +<br /> +&lt;/ul></code> + +<p>Contrast this with the pseudo-code used by a template engine:</p> + +<code>&lt;ul><br /> +<br /> +{foreach from=$addressbook item="name"}<br /> +<br /> +&lt;li>{$name}&lt;/li><br /> +<br /> +{/foreach}<br /> +<br /> +&lt;/ul></code> + +<p>Yes, the template engine example is a bit cleaner, but it comes at the price of performance, as the pseudo-code must be converted +back into PHP to run. Since one of our goals is <em>maximum performance</em>, we opted to not require the use of a template engine.</p> + + +<h2>CodeIgniter is Thoroughly Documented</h2> +<p>Programmers love to code and hate to write documentation. We're no different, of course, but +since documentation is <strong>as important</strong> as the code itself, +we are committed to doing it. Our source code is extremely clean and well commented as well.</p> + + +<h2>CodeIgniter has a Friendly Community of Users</h2> + +<p>Our growing community of users can be seen actively participating in our <a href="http://forum.codeigniter.com/">Community Forums</a>.</p> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="getting_started.html">Getting Started</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="cheatsheets.html">CodeIgniter Cheatsheets</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/overview/cheatsheets.html b/user_guide/overview/cheatsheets.html new file mode 100644 index 0000000..44a2502 --- /dev/null +++ b/user_guide/overview/cheatsheets.html @@ -0,0 +1,83 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter Cheatsheets : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +CodeIgniter Cheatsheets +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>CodeIgniter Cheatsheets</h1> + +<h2>Library Reference</h2> + +<div><a href="../images/codeigniter_1.7.1_library_reference.pdf"><img src="../images/codeigniter_1.7.1_library_reference.png" width="600" height="195" border="0" alt="CodeIgniter Library Reference" /></a></div> + +<h2>Helpers Reference</h2> +<div><a href="../images/codeigniter_1.7.1_helper_reference.pdf"><img src="../images/codeigniter_1.7.1_helper_reference.png" width="600" height="196" border="0" alt="CodeIgniter Library Reference" /></a></div> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="at_a_glance.html">CodeIgniter at a Glance</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="features.html">CodeIgniter Features</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/overview/features.html b/user_guide/overview/features.html new file mode 100644 index 0000000..93db8b8 --- /dev/null +++ b/user_guide/overview/features.html @@ -0,0 +1,118 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter Features : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Features +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>CodeIgniter Features</h1> + +<p>Features in and of themselves are a very poor way to judge an application since they tell you nothing +about the user experience, or how intuitively or intelligently it is designed. Features +don't reveal anything about the quality of the code, or the performance, or the attention to detail, or security practices. +The only way to really judge an app is to try it and get to know the code. <a href="../installation/">Installing</a> +CodeIgniter is child's play so we encourage you to do just that. In the mean time here's a list of CodeIgniter's main features.</p> + +<ul> +<li>Model-View-Controller Based System</li> +<li>Extremely Light Weight</li> +<li>Full Featured database classes with support for several platforms.</li> +<li>Active Record Database Support</li> +<li>Form and Data Validation</li> +<li>Security and XSS Filtering</li> +<li>Session Management</li> +<li>Email Sending Class. Supports Attachments, HTML/Text email, multiple protocols (sendmail, SMTP, and Mail) and more.</li> +<li>Image Manipulation Library (cropping, resizing, rotating, etc.). Supports GD, ImageMagick, and NetPBM</li> +<li>File Uploading Class</li> +<li>FTP Class</li> +<li>Localization</li> +<li>Pagination</li> +<li>Data Encryption</li> +<li>Benchmarking</li> +<li>Full Page Caching</li> +<li>Error Logging</li> +<li>Application Profiling</li> +<li>Calendaring Class</li> +<li>User Agent Class</li> +<li>Zip Encoding Class</li> +<li>Template Engine Class</li> +<li>Trackback Class</li> +<li>XML-RPC Library</li> +<li>Unit Testing Class</li> +<li>Search-engine Friendly URLs</li> +<li>Flexible URI Routing</li> +<li>Support for Hooks and Class Extensions</li> +<li>Large library of "helper" functions</li> +</ul> + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="cheatsheets.html">CodeIgniter Cheatsheets</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="appflow.html">Application Flow Chart</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/overview/getting_started.html b/user_guide/overview/getting_started.html new file mode 100644 index 0000000..9eb4f4b --- /dev/null +++ b/user_guide/overview/getting_started.html @@ -0,0 +1,92 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Getting Started With CodeIgniter : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Getting Started +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>Getting Started With CodeIgniter</h1> + +<p>Any software application requires some effort to learn. We've done our best to minimize the learning +curve while making the process as enjoyable as possible. +</p> + +<p>The first step is to <a href="../installation/index.html">install</a> CodeIgniter, then read +all the topics in the <strong>Introduction</strong> section of the Table of Contents.</p> + +<p>Next, read each of the <strong>General Topics</strong> pages in order. +Each topic builds on the previous one, and includes code examples that you are encouraged to try.</p> + +<p>Once you understand the basics you'll be ready to explore the <strong>Class Reference</strong> and +<strong>Helper Reference</strong> pages to learn to utilize the native libraries and helper files.</p> + +<p>Feel free to take advantage of our <a href="http://forum.codeigniter.com/">Community Forums</a> +if you have questions or problems, and +our <a href="https://github.com/bcit-ci/CodeIgniter/wiki">Wiki</a> to see code examples posted by other users.</p> + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="at_a_glance.html">CodeIgniter At a Glance</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/overview/goals.html b/user_guide/overview/goals.html new file mode 100644 index 0000000..3e857ff --- /dev/null +++ b/user_guide/overview/goals.html @@ -0,0 +1,98 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Design and Architectural Goals : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Goals +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + + +<h2>Design and Architectural Goals</h2> + +<p>Our goal for CodeIgniter is <dfn>maximum performance, capability, and flexibility in the smallest, lightest possible package</dfn>.</p> + +<p>To meet this goal we are committed to benchmarking, re-factoring, and simplifying at every step of the development process, +rejecting anything that doesn't further the stated objective.</p> + +<p>From a technical and architectural standpoint, CodeIgniter was created with the following objectives:</p> + +<ul> +<li><strong>Dynamic Instantiation.</strong> In CodeIgniter, components are loaded and routines executed only when requested, rather than globally. No assumptions are made by the system regarding what may be needed beyond the minimal core resources, so the system is very light-weight by default. The events, as triggered by the HTTP request, and the controllers and views you design will determine what is invoked.</li> +<li><strong>Loose Coupling.</strong> Coupling is the degree to which components of a system rely on each other. The less components depend on each other the more reusable and flexible the system becomes. Our goal was a very loosely coupled system.</li> +<li><strong>Component Singularity.</strong> Singularity is the degree to which components have a narrowly focused purpose. In CodeIgniter, each class and its functions are highly autonomous in order to allow maximum usefulness.</li> +</ul> + +<p>CodeIgniter is a dynamically instantiated, loosely coupled system with high component singularity. It strives for simplicity, flexibility, and high performance in a small footprint package.</p> + + + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="mvc.html">Model-View-Controller</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="./getting_started.html">Getting Started</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/overview/index.html b/user_guide/overview/index.html new file mode 100644 index 0000000..a691a61 --- /dev/null +++ b/user_guide/overview/index.html @@ -0,0 +1,84 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter Overview : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Introduction +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + +<h1>CodeIgniter Overview</h1> + +<p>The following pages describe the broad concepts behind CodeIgniter:</p> + + <ul> + <li><a href="at_a_glance.html">CodeIgniter at a Glance</a></li> + <li><a href="features.html">Supported Features</a></li> + <li><a href="appflow.html">Application Flow Chart</a></li> + <li><a href="mvc.html">Introduction to the Model-View-Controller</a></li> + <li><a href="goals.html">Design and Architectural Goals</a></li> + <li><a href="package.html">Package Description</a></li> + </ul> + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p><a href="#top">Top of Page</a> &nbsp;&middot;&nbsp; <a href="../index.html">User Guide Home</a></p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/overview/mvc.html b/user_guide/overview/mvc.html new file mode 100644 index 0000000..3641fc9 --- /dev/null +++ b/user_guide/overview/mvc.html @@ -0,0 +1,100 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Model-View-Controller : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +MVC +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Model-View-Controller</h1> + +<p>CodeIgniter is based on the Model-View-Controller development pattern. + +MVC is a software approach that separates application logic from presentation. In practice, it permits your web pages to contain minimal scripting since the presentation is separate from the PHP scripting.</p> + +<ul> +<li>The <strong>Model</strong> represents your data structures. Typically your model classes will contain functions that help you +retrieve, insert, and update information in your database.</li> +<li>The <strong>View</strong> is the information that is being presented to a user. A View will normally be a web page, but +in CodeIgniter, a view can also be a page fragment like a header or footer. It can also be an RSS page, or any other type of "page".</li> +<li>The <strong>Controller</strong> serves as an <em>intermediary</em> between the Model, the View, +and any other resources needed to process the HTTP request and generate a web page.</li> + +</ul> + +<p>CodeIgniter has a fairly loose approach to MVC since Models are not required. +If you don't need the added separation, or find that maintaining models requires more complexity than you +want, you can ignore them and build your application minimally using Controllers and Views. CodeIgniter also +enables you to incorporate your own existing scripts, or even develop core libraries for the system, + enabling you to work in a way that makes the most sense to you.</p> + + + + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="appflow.html">Application Flow Chart</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="goals.html">Architectural Goals</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/toc.html b/user_guide/toc.html new file mode 100644 index 0000000..28d84d5 --- /dev/null +++ b/user_guide/toc.html @@ -0,0 +1,229 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>Table of Contents : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='userguide.css' /> + +<script type="text/javascript" src="nav/nav.js"></script> +<script type="text/javascript" src="nav/prototype.lite.js"></script> +<script type="text/javascript" src="nav/moo.fx.js"></script> +<script type="text/javascript" src="nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('null');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> + +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Table of Contents +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Table of Contents</h1> + +<table cellpadding="0" cellspacing="10" border="0" width="100%"> +<tr> +<td valign="top" width="25%"> + +<h3>Basic Info</h3> +<ul> + <li><a href="./general/requirements.html">Server Requirements</a></li> + <li><a href="license.html">License Agreement</a></li> + <li><a href="changelog.html">Change Log</a></li> + <li><a href="./general/credits.html">Credits</a></li> +</ul> + +<h3>Installation</h3> +<ul> + <li><a href="./installation/downloads.html">Downloading CodeIgniter </a></li> + <li><a href="./installation/index.html">Installation Instructions</a></li> + <li><a href="./installation/upgrading.html">Upgrading from a Previous Version</a></li> + <li><a href="./installation/troubleshooting.html">Troubleshooting</a></li> +</ul> + +<h3>Introduction</h3> +<ul> + <li><a href="./overview/getting_started.html">Getting Started</a></li> + <li><a href="./overview/at_a_glance.html">CodeIgniter at a Glance</a></li> + <li><a href="./overview/cheatsheets.html">CodeIgniter Cheatsheets</a></li> + <li><a href="./overview/features.html">Supported Features</a></li> + <li><a href="./overview/appflow.html">Application Flow Chart</a></li> + <li><a href="./overview/mvc.html">Model-View-Controller</a></li> + <li><a href="./overview/goals.html">Architectural Goals</a></li> +</ul> + +<h3>Tutorial</h3> +<ul> + <li><a href="./tutorial/index.html">Introduction</a></li> + <li><a href="./tutorial/static_pages.html">Static pages</a></li> + <li><a href="./tutorial/news_section.html">News section</a></li> + <li><a href="./tutorial/create_news_items.html">Create news items</a></li> + <li><a href="./tutorial/conclusion.html">Conclusion</a></li> +</ul> + +</td> +<td valign="top" width="25%"> + +<h3>General Topics</h3> +<ul> + <li><a href="./general/urls.html">CodeIgniter URLs</a></li> + <li><a href="./general/controllers.html">Controllers</a></li> + <li><a href="./general/reserved_names.html">Reserved Names</a></li> + <li><a href="./general/views.html">Views</a></li> + <li><a href="./general/models.html">Models</a></li> + <li><a href="./general/helpers.html">Helpers</a></li> + <li><a href="./general/libraries.html">Using CodeIgniter Libraries</a></li> + <li><a href="./general/creating_libraries.html">Creating Your Own Libraries</a></li> + <li><a href="./general/drivers.html">Using CodeIgniter Drivers</a></li> + <li><a href="./general/creating_drivers.html">Creating Your Own Drivers</a></li> + <li><a href="./general/core_classes.html">Creating Core Classes</a></li> + <li><a href="./general/hooks.html">Hooks - Extending the Core</a></li> + <li><a href="./general/autoloader.html">Auto-loading Resources</a></li> + <li><a href="./general/common_functions.html">Common Functions</a></li> + <li><a href="./general/routing.html">URI Routing</a></li> + <li><a href="./general/errors.html">Error Handling</a></li> + <li><a href="./general/caching.html">Caching</a></li> + <li><a href="./general/profiling.html">Profiling Your Application</a></li> + <li><a href="./general/cli.html">Running via the CLI</a></li> + <li><a href="./general/managing_apps.html">Managing Applications</a></li> + <li><a href="./general/environments.html">Handling Multiple Environments</a></li> + <li><a href="./general/alternative_php.html">Alternative PHP Syntax</a></li> + <li><a href="./general/security.html">Security</a></li> + <li><a href="./general/styleguide.html">PHP Style Guide</a></li> + <li><a href="./doc_style/index.html">Writing Documentation</a></li> +</ul> + +<h3>Additional Resources</h3> + +<ul> +<li><a href="http://forum.codeigniter.com/">Community Forums</a></li> +<li><a href="https://github.com/bcit-ci/CodeIgniter/wiki">Community Wiki</a></li> +</ul> + +</td> +<td valign="top" width="25%"> + +<h3>Class Reference</h3> +<ul> +<li><a href="./libraries/benchmark.html">Benchmarking Class</a></li> +<li><a href="./libraries/calendar.html">Calendar Class</a></li> +<li><a href="./libraries/cart.html">Cart Class</a></li> +<li><a href="./libraries/config.html">Config Class</a></li> +<li><a href="./libraries/email.html">Email Class</a></li> +<li><a href="./libraries/encryption.html">Encryption Class</a></li> +<li><a href="./libraries/file_uploading.html">File Uploading Class</a></li> +<li><a href="./libraries/form_validation.html">Form Validation Class</a></li> +<li><a href="./libraries/ftp.html">FTP Class</a></li> +<li><a href="./libraries/table.html">HTML Table Class</a></li> +<li><a href="./libraries/image_lib.html">Image Manipulation Class</a></li> +<li><a href="./libraries/input.html">Input Class</a></li> +<li><a href="./libraries/javascript.html">Javascript Class</a></li> +<li><a href="./libraries/loader.html">Loader Class</a></li> +<li><a href="./libraries/language.html">Language Class</a></li> +<li><a href="./libraries/migration.html">Migration Class</a></li> +<li><a href="./libraries/output.html">Output Class</a></li> +<li><a href="./libraries/pagination.html">Pagination Class</a></li> +<li><a href="./libraries/security.html">Security Class</a></li> +<li><a href="./libraries/sessions.html">Session Class</a></li> +<li><a href="./libraries/trackback.html">Trackback Class</a></li> +<li><a href="./libraries/parser.html">Template Parser Class</a></li> +<li><a href="./libraries/typography.html">Typography Class</a></li> +<li><a href="./libraries/unit_testing.html">Unit Testing Class</a></li> +<li><a href="./libraries/uri.html">URI Class</a></li> +<li><a href="./libraries/user_agent.html">User Agent Class</a></li> +<li><a href="./libraries/xmlrpc.html">XML-RPC Class</a></li> +<li><a href="./libraries/zip.html">Zip Encoding Class</a></li> +</ul> + + +</td> +<td valign="top" width="25%"> + +<h3>Driver Reference</h3> +<ul> +<li><a href="./libraries/caching.html">Caching Class</a></li> +<li><a href="./database/index.html">Database Class</a></li> +<li><a href="./libraries/javascript.html">Javascript Class</a></li> +</ul> + +<h3>Helper Reference</h3> +<ul> +<li><a href="./helpers/array_helper.html">Array Helper</a></li> +<li><a href="./helpers/captcha_helper.html">CAPTCHA Helper</a></li> +<li><a href="./helpers/cookie_helper.html">Cookie Helper</a></li> +<li><a href="./helpers/date_helper.html">Date Helper</a></li> +<li><a href="./helpers/directory_helper.html">Directory Helper</a></li> +<li><a href="./helpers/download_helper.html">Download Helper</a></li> +<li><a href="./helpers/email_helper.html">Email Helper</a></li> +<li><a href="./helpers/file_helper.html">File Helper</a></li> +<li><a href="./helpers/form_helper.html">Form Helper</a></li> +<li><a href="./helpers/html_helper.html">HTML Helper</a></li> +<li><a href="./helpers/inflector_helper.html">Inflector Helper</a></li> +<li><a href="./helpers/language_helper.html">Language Helper</a></li> +<li><a href="./helpers/number_helper.html">Number Helper</a></li> +<li><a href="./helpers/path_helper.html">Path Helper</a></li> +<li><a href="./helpers/security_helper.html">Security Helper</a></li> +<li><a href="./helpers/smiley_helper.html">Smiley Helper</a></li> +<li><a href="./helpers/string_helper.html">String Helper</a></li> +<li><a href="./helpers/text_helper.html">Text Helper</a></li> +<li><a href="./helpers/typography_helper.html">Typography Helper</a></li> +<li><a href="./helpers/url_helper.html">URL Helper</a></li> +<li><a href="./helpers/xml_helper.html">XML Helper</a></li> +</ul> + + + + +</td> +</tr> +</table> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p><a href="#top">Top of Page</a></p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + + +</body> +</html> \ No newline at end of file diff --git a/user_guide/tutorial/conclusion.html b/user_guide/tutorial/conclusion.html new file mode 100644 index 0000000..5d65c65 --- /dev/null +++ b/user_guide/tutorial/conclusion.html @@ -0,0 +1,91 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter Features : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +<a href="index.html">Tutorial</a> &nbsp;&#8250;&nbsp; +Conclusion +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Tutorial - Conclusion</h1> + +<p>This tutorial did not cover all of the things you might expect of a full-fledged content management system, but it introduced you to the more important topics of routing, writing controllers, and models. We hope this tutorial gave you an insight into some of CodeIgniter's basic design patterns, which you can expand upon.</p> + +<p>Now that you've completed this tutorial, we recommend you check out the rest of the documentation. CodeIgniter is often praised because of its comprehensive documentation. Use this to your advantage and read the "Introduction" and "General Topics" sections thoroughly. You should read the class and helper references when needed.</p> + +<p>Every intermediate PHP programmer should be able to get the hang of CodeIgniter within a few days.</p> + +<p>If you still have questions about the framework or your own CodeIgniter code, you can:</p> +<ul> + <li>Check out our <a href="http://forum.codeigniter.com/">forums</a></li> + <li>Visit our <a href="http://www.codeigniter.com/irc">IRC chatroom</a></li> + <li>Explore the <a href="https://github.com/bcit-ci/CodeIgniter/wiki">Wiki</a></li> +</ul> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="create_news_items.html">Create news items</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="../general/urls.html">CodeIgniter URLs</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/tutorial/create_news_items.html b/user_guide/tutorial/create_news_items.html new file mode 100644 index 0000000..7093fb4 --- /dev/null +++ b/user_guide/tutorial/create_news_items.html @@ -0,0 +1,179 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter Features : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +<a href="index.html">Tutorial</a> &nbsp;&#8250;&nbsp; +Create news items +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Tutorial - Create news items</h1> + +<p>You now know how you can read data from a database using CodeIgnite, but you haven't written any information to the database yet. In this section you'll expand your news controller and model created earlier to include this functionality.</p> + +<h2>Create a form</h2> + +<p>To input data into the database you need to create a form where you can input the information to be stored. This means you'll be needing a form with two fields, one for the title and one for the text. You'll derive the slug from our title in the model. Create the new view at <dfn>application/views/news/create.php</dfn>.</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="16"> +<h2>Create a news item</h2> + +&lt;?php echo validation_errors(); ?> + +&lt;?php echo form_open('news/create') ?> + + <label for="title">Title</label> + <input type="input" name="title" /><br /> + + <label for="text">Text</label> + <textarea name="text">&lt;/textarea><br /> + + <input type="submit" name="submit" value="Create news item" /> + +&lt;/form> +</textarea> + +<p>There are only two things here that probably look unfamiliar to you: the <dfn>form_open()</dfn> function and the <dfn>validation_errors()</dfn> function.</p> + +<p>The first function is provided by the <a href="../helpers/form_helper.html">form helper</a> and renders the form element and adds extra functionality, like adding a hidden <a href="../libraries/security.html">CSFR prevention field</a>. The latter is used to report errors related to form validation.</p> + +<p>Go back to your news controller. You're going to do two things here, check whether the form was submitted and whether the submitted data passed the validation rules. You'll use the <a href="../libraries/form_validation.html">form validation</a> library to do this.</p> + +<pre> +public function create() +{ + $this->load->helper('form'); + $this->load->library('form_validation'); + + $data['title'] = 'Create a news item'; + + $this->form_validation->set_rules('title', 'Title', 'required'); + $this->form_validation->set_rules('text', 'text', 'required'); + + if ($this->form_validation->run() === FALSE) + { + $this->load->view('templates/header', $data); + $this->load->view('news/create'); + $this->load->view('templates/footer'); + + } + else + { + $this->news_model->set_news(); + $this->load->view('news/success'); + } +} +</pre> + +<p>The code above adds a lot of functionality. The first few lines load the form helper and the form validation library. After that, rules for the form validation are set. The <var>set_rules()</var> method takes three arguments; the name of the input field, the name to be used in error messages, and the rule. In this case the title and text fields are required.</p> + +<p>CodeIgniter has a powerful form validation library as demonstrated above. You can read <a href="../libraries/form_validation.html">more about this library here</a>.</p> + +<p>Continuing down, you can see a condition that checks whether the form validation ran successfully. If it did not, the form is displayed, if it was submitted <strong>and</strong> passed all the rules, the model is called. After this, a view is loaded to display a success message. Create a view at <dfn>application/views/news/success.php</dfn> and write a success message.</p> + +<h2>Model</h2> + +<p>The only thing that remains is writing a method that writes the data to the database. You'll use the Active Record class to insert the information and use the input library to get the posted data. Open up the model created earlier and add the following:</p> + +<pre> +public function set_news() +{ + $this->load->helper('url'); + + $slug = url_title($this->input->post('title'), 'dash', TRUE); + + $data = array( + 'title' => $this->input->post('title'), + 'slug' => $slug, + 'text' => $this->input->post('text') + ); + + return $this->db->insert('news', $data); +} +</pre> + +<p>This new method takes care of inserting the news item into the database. The third line contains a new function, <dfn>url_title()</dfn>. This function - provided by the <a href="../helpers/url_helper.html">URL helper</a> - strips down the string you pass it, replacing all spaces by dashes (-) and makes sure everything is in lowercase characters. This leaves you with a nice slug, perfect for creating URIs.</p> + +<p>Let's continue with preparing the record that is going to be inserted later, inside the <var>$data</var> array. Each element corresponds with a column in the database table created earlier. You might notice a new method here, namely the <dfn>post()</dfn> method from the <a href="../libraries/input.html">input library</a>. This method makes sure the data is sanitized, protecting you from nasty attacks from others. The input library is loaded by default. At last, you insert our <var>$data</var> array into our database.</p> + +<h2>Routing</h2> + +<p>Before you can start adding news items into your CodeIgniter application you have to add an extra rule to <dfn>config/routes.php</dfn> file. Make sure your file contains the following. This makes sure CodeIgniter sees 'create' as a method instead of a news item's slug.</p> + +<pre> +$route['news/create'] = 'news/create'; +$route['news/(:any)'] = 'news/view/$1'; +$route['news'] = 'news'; +$route['(:any)'] = 'pages/view/$1'; +$route['default_controller'] = 'pages/view'; +</pre> + +<p>Now point your browser to your local development environment where you installed CodeIgniter and add <dfn>index.php/news/create</dfn> to the URL. Congratulations, you just created your first CodeIgniter application! Add some news and check out the different pages you made.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="news_section.html">News section</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="conclusion.html">Conclusion</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/tutorial/hard_coded_pages.html b/user_guide/tutorial/hard_coded_pages.html new file mode 100644 index 0000000..0d2d2d8 --- /dev/null +++ b/user_guide/tutorial/hard_coded_pages.html @@ -0,0 +1,158 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter Features : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +Features +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Tutorial - Hard coded pages</h1> + +<p>The first thing we're going to do is setting up a controller to handle our hard coded pages. A controller is a class with a collection of methods that represent the different actions you can perform on a certain object. In our case, we want to be able to view a page.</p> + +<p class="important"><strong>Note:</strong> This tutorial assumes you've downloaded CodeIgniter and installed the framework in your development environment.</p> + +<p>Create a file at <dfn>application/controllers/pages.php</dfn> with the following code.</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="9"> +&lt;?php +class Pages extends CI_Controller { + + public function view($page = 'home') + { + + } +} +</textarea> + +<p>If you're familiar with PHP classes you see that we create a Pages class with a view method that accepts one parameter, <var>$page</var>. Another interesting observation is that the Pages class is extending the CI_Controller class. This means that the new Pages class can access the methods and variables defined in the CI_Controller class. When you look at this class in <dfn>system/core/controller.php</dfn> you can see this class is doing something really important; assigning an instance from the CodeIgniter super object to the <var>$this</var> object. In most of your code, <var>$this</var> is the object you will use to interact with the framework.</p> + +<p>Now we've created our first method, it is time to do some basic templating. For this tutorial, we will be creating two views to acts as our footer and header. Let's create our header at <dfn>application/views/templates/header.php</dfn> and ad the following code.</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="8"> +<html> +<head> + <title><?php echo $title ?> - CodeIgniter 2 Tutorial</title> +</head> +<body> + <h1>CodeIgniter 2 Tutorial</h1> + +</textarea> + +<p>Our header doesn't do anything exciting. It contains the basic HTML code that we will want to display before loading the main view. You can also see that we echo the <var>$title</var> variable, which we didn't define. We will set this variable in the Pages controller a bit later. Let's go ahead and create a footer at <dfn>application/views/templates/footer.php</dfn> that includes the following code.</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="4"> +<strong>&copy; 2011</strong> +</body> +</html> +</textarea> + +<h2>Adding logic to the controller</h2> + +<p>Now we've set up the basics so we can finally do some real programming. Earlier we set up our controller with a view method. Because we don't want to write a separate method for every page, we made the view method accept one parameter, the name of the page. These hard coded pages will be located in <dfn>application/views/pages/</dfn>. Create two files in this directory named <dfn>home.php</dfn> and <dfn>about.php</dfn> and put in some HTML content.</p> + +<p>In order to load these pages we'll have to check whether these page actually exists. When the page does exist, we load the view for that pages, including the header and footer and display it to the user. If it doesn't, we show a "404 Page not found" error.</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="16"> +public function view($page = 'home') +{ + + if ( ! file_exists('application/views/pages/' . $page . EXT)) + { + show_404(); + } + + $data['title'] = ucfirst($page); + + $this->load->view('templates/header', $data); + $this->load->view('pages/'.$page); + $this->load->view('templates/footer'); +} +</textarea> + +<p>The first thing we do is checking whether the page we're looking for does actually exist. We use PHP's native file_exists() to do this check and pass the path where the file is supposed to be. Next is the function show_404(), a CodeIgniter function that renders the default error page and sets the appropriate HTTP headers.</p> + +<p>In the header template you saw we were using the <var>$title</var> variable to customize our page title. This is where we define the title, but instead of assigning the value to a variable, we assign it to the title element in the <var>$data</var> array. The last thing we need to do is loading the views in the order we want them to be displayed. We also pass the <var>$data</var> array to the header view to make its elements available in the header view file.<p> + +<h2>Routing</h2> + +<p>Actually, our controller is already functioning. Point your browser to <dfn>index.php/pages/view</dfn> to see your homepage. When you visit <dfn>index.php/pages/view/about</dfn> you will see the about page, again including your header and footer. Now we're going to get rid of the pages/view part in our URI. As you may have seen, CodeIgniter does its routing by the class, method and parameter, separated by slashes.</p> + +<p>Open the routing file located at <dfn>application/config/routes.php</dfn> and add the following two lines. Remove all other code that sets any element in the <var>$route</var> array.</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="3"> +$route['(:any)'] = 'pages/view/$1'; +$route['default_controller'] = 'pages/view'; +</textarea> + +<p>CodeIgniter reads its routing rules from top to bottom and routes the request to the first matching rule. These routes are stored in the <var>$route</var> array where the keys represent the incoming request and the value the path to the method, as described above.</p> + +<p>The first rule in our <var>$routes</var> array matches every request - using the wildcard operator <dfn>(:any)</dfn> - and passes the value to the view method of the pages class we created earlier. The default controller route makes sure every request to the root goes to the view method as well, which has the first parameter set to 'home' by default.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="cheatsheets.html">CodeIgniter Cheatsheets</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="appflow.html">Application Flow Chart</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/tutorial/index.html b/user_guide/tutorial/index.html new file mode 100644 index 0000000..234beee --- /dev/null +++ b/user_guide/tutorial/index.html @@ -0,0 +1,101 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter Features : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +<a href="index.html">Tutorial</a> &nbsp;&#8250;&nbsp; +Introduction +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Tutorial &minus; Introduction</h1> + +<p>This tutorial is intended to introduce you to the CodeIgniter framework and the basic principles of MVC architecture. It will show you how a basic CodeIgniter application is constructed in step-by-step fashion.</p> + +<p>In this tutorial, you will be creating a <strong>basic news application</strong>. You will begin by writing the code that can load static pages. Next, you will create a news section that reads news items from a database. Finally, you'll add a form to create news items in the database.</p> + +<p>This tutorial will primarily focus on:</p> +<ul> +<li>Model-View-Controller basics</li> +<li>Routing basics</li> +<li>Form validation</li> +<li>Performing basic database queries using &quot;Active Record&quot;</li> +</ul> + +<p>The entire tutorial is split up over several pages, each explaining a small part of the functionality of the CodeIgniter framework. You'll go through the following pages:</p> +<ul> +<li>Introduction, this page, which gives you an overview of what to expect.</li> +<li><a href="static_pages.html">Static pages</a>, which will teach you the basics of controllers, views and routing.</li> +<li><a href="news_section.html">News section</a>, where you'll start using models and will be doing some basic database operations.</li> +<li><a href="create_news_items.html">Create news items</a>, which will introduce more advanced database operations and form validation.</li> +<li><a href="conclusion.html">Conclusion</a>, which will give you some pointers on further reading and other resources.</li> +</ul> + +<p>Enjoy your exploration of the CodeIgniter framework.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="../overview/goals.html">Goals</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="static_pages.html">Static pages</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/tutorial/news_section.html b/user_guide/tutorial/news_section.html new file mode 100644 index 0000000..1fe331d --- /dev/null +++ b/user_guide/tutorial/news_section.html @@ -0,0 +1,230 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter Features : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +<a href="index.html">Tutorial</a> &nbsp;&#8250;&nbsp; +News section +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Tutorial &minus; News section</h1> + +<p>In the last section, we went over some basic concepts of the framework by writing a class that includes static pages. We cleaned up the URI by adding custom routing rules. Now it's time to introduce dynamic content and start using a database.</p> + +<h2>Setting up your model</h2> + +<p>Instead of writing database operations right in the controller, queries should be placed in a model, so they can easily be reused later. Models are the place where you retrieve, insert, and update information in your database or other data stores. They represent your data.</p> + +<p>Open up the <dfn>application/models</dfn> directory and create a new file called <dfn>news_model.php</dfn> and add the following code. Make sure you've configured your database properly as described <a href="../database/configuration.html">here</a>.</p> + +<pre> +&lt;?php +class News_model extends CI_Model { + + public function __construct() + { + $this->load->database(); + } +} +</pre> + +<p>This code looks similar to the controller code that was used earlier. It creates a new model by extending CI_Model and loads the database library. This will make the database class available through the <var>$this->db</var> object.</p> + +<p>Before querying the database, a database schema has to be created. Connect to your database and run the SQL command below. Also add some seed records.</p> + +<pre> +CREATE TABLE news ( + id int(11) NOT NULL AUTO_INCREMENT, + title varchar(128) NOT NULL, + slug varchar(128) NOT NULL, + text text NOT NULL, + PRIMARY KEY (id), + KEY slug (slug) +); +</pre> + +<p>Now that the database and a model have been set up, you'll need a method to get all of our posts from our database. To do this, the database abstraction layer that is included with CodeIgniter — <a href="../database/active_record.html">Active Record</a> — is used. This makes it possible to write your 'queries' once and make them work on <a href="../general/requirements.html">all supported database systems</a>. Add the following code to your model.</p> + +<pre> +public function get_news($slug = FALSE) +{ + if ($slug === FALSE) + { + $query = $this->db->get('news'); + return $query->result_array(); + } + + $query = $this->db->get_where('news', array('slug' => $slug)); + return $query->row_array(); +} +</pre> + +<p>With this code you can perform two different queries. You can get all news records, or get a news item by its <a href="#" title="a URL friendly version of a string">slug</a>. You might have noticed that the <var>$slug</var> variable wasn't sanitized before running the query; Active Record does this for you.</p> + +<h2>Display the news</h2> + +<p>Now that the queries are written, the model should be tied to the views that are going to display the news items to the user. This could be done in our pages controller created earlier, but for the sake of clarity, a new "news" controller is defined. Create the new controller at <dfn>application/controllers/news.php</dfn>.</p> + +<pre> +&lt;?php +class News extends CI_Controller { + + public function __construct() + { + parent::__construct(); + $this->load->model('news_model'); + } + + public function index() + { + $data['news'] = $this->news_model->get_news(); + } + + public function view($slug) + { + $data['news'] = $this->news_model->get_news($slug); + } +} +</pre> + +<p>Looking at the code, you may see some similarity with the files we created earlier. First, the "__construct" method: it calls the constructor of its parent class (<dfn>CI_Controller</dfn>) and loads the model, so it can be used in all other methods in this controller.</p> + +<p>Next, there are two methods to view all news items and one for a specific news item. You can see that the <var>$slug</var> variable is passed to the model's method in the second method. The model is using this slug to identify the news item to be returned.</p> + +<p>Now the data is retrieved by the controller through our model, but nothing is displayed yet. The next thing to do is passing this data to the views.</p> + +<pre> +public function index() +{ + $data['news'] = $this->news_model->get_news(); + $data['title'] = 'News archive'; + + $this->load->view('templates/header', $data); + $this->load->view('news/index', $data); + $this->load->view('templates/footer'); +} +</pre> + +<p>The code above gets all news records from the model and assigns it to a variable. The value for the title is also assigned to the <var>$data['title']</var> element and all data is passed to the views. You now need to create a view to render the news items. Create <dfn>application/views/news/index.php</dfn> and add the next piece of code.</p> + +<pre> +&lt;?php foreach ($news as $news_item): ?&gt; + + &lt;h2&gt;&lt;?php echo $news_item['title'] ?&gt;&lt;/h2&gt; + &lt;div class="main"&gt; + &lt;?php echo $news_item['text'] ?&gt; + &lt;/div&gt; + &lt;p&gt;&lt;a href="news/&lt;?php echo $news_item['slug'] ?&gt;"&gt;View article&lt;/a&gt;&lt;/p&gt; + +&lt;?php endforeach ?&gt; +</pre> + +<p>Here, each news item is looped and displayed to the user. You can see we wrote our template in PHP mixed with HTML. If you prefer to use a template language, you can use CodeIgniter's <a href="../libraries/parser.html">Template Parser</a> class or a third party parser.</p> + +<p>The news overview page is now done, but a page to display individual news items is still absent. The model created earlier is made in such way that it can easily be used for this functionality. You only need to add some code to the controller and create a new view. Go back to the news controller and add the following lines to the file.</p> + +<pre> +public function view($slug) +{ + $data['news_item'] = $this->news_model->get_news($slug); + + if (empty($data['news_item'])) + { + show_404(); + } + + $data['title'] = $data['news_item']['title']; + + $this->load->view('templates/header', $data); + $this->load->view('news/view', $data); + $this->load->view('templates/footer'); +} +</pre> + +<p>Instead of calling the <var>get_news()</var> method without a parameter, the <var>$slug</var> variable is passed, so it will return the specific news item. The only things left to do is create the corresponding view at <dfn>application/views/news/view.php</dfn>. Put the following code in this file.</p> + +<pre> +&lt;?php +echo '&lt;h2&gt;'.$news_item['title'].'&lt;/h2&gt;'; +echo $news_item['text']; +</pre> + +<h2>Routing</h2> +<p>Because of the wildcard routing rule created earlier, you need need an extra route to view the controller that you just made. Modify your routing file (<dfn>application/config/routes.php</dfn>) so it looks as follows. This makes sure the requests reaches the news controller instead of going directly to the pages controller. The first line routes URI's with a slug to the view method in the news controller.</p> + +<pre> +$route['news/(:any)'] = 'news/view/$1'; +$route['news'] = 'news'; +$route['(:any)'] = 'pages/view/$1'; +$route['default_controller'] = 'pages/view'; +</pre> + +<p>Point your browser to your document root, followed by <dfn>index.php/news</dfn> and watch your news page.</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="static_pages.html">Static pages</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="create_news_items.html">Create news items</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/tutorial/static_pages.html b/user_guide/tutorial/static_pages.html new file mode 100644 index 0000000..69b73f8 --- /dev/null +++ b/user_guide/tutorial/static_pages.html @@ -0,0 +1,206 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<title>CodeIgniter Features : CodeIgniter User Guide</title> + +<style type='text/css' media='all'>@import url('../userguide.css');</style> +<link rel='stylesheet' type='text/css' media='all' href='../userguide.css' /> + +<script type="text/javascript" src="../nav/nav.js"></script> +<script type="text/javascript" src="../nav/prototype.lite.js"></script> +<script type="text/javascript" src="../nav/moo.fx.js"></script> +<script type="text/javascript" src="../nav/user_guide_menu.js"></script> + +<meta http-equiv='expires' content='-1' /> +<meta http-equiv= 'pragma' content='no-cache' /> +<meta name='robots' content='all' /> +<meta name='author' content='ExpressionEngine Dev Team' /> +<meta name='description' content='CodeIgniter User Guide' /> + +</head> +<body> + +<!-- START NAVIGATION --> +<div id="nav"><div id="nav_inner"><script type="text/javascript">create_menu('../');</script></div></div> +<div id="nav2"><a name="top"></a><a href="javascript:void(0);" onclick="myHeight.toggle();"><img src="../images/nav_toggle_darker.jpg" width="154" height="43" border="0" title="Toggle Table of Contents" alt="Toggle Table of Contents" /></a></div> +<div id="masthead"> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td><h1>CodeIgniter User Guide Version 2.2.6</h1></td> +<td id="breadcrumb_right"><a href="../toc.html">Table of Contents Page</a></td> +</tr> +</table> +</div> +<!-- END NAVIGATION --> + + +<!-- START BREADCRUMB --> +<table cellpadding="0" cellspacing="0" border="0" style="width:100%"> +<tr> +<td id="breadcrumb"> +<a href="http://codeigniter.com/">CodeIgniter Home</a> &nbsp;&#8250;&nbsp; +<a href="../index.html">User Guide Home</a> &nbsp;&#8250;&nbsp; +<a href="index.html">Tutorial</a> &nbsp;&#8250;&nbsp; +Static pages +</td> +<td id="searchbox"><form method="get" action="http://www.google.com/search"><input type="hidden" name="as_sitesearch" id="as_sitesearch" value="codeigniter.com/user_guide/" />Search User Guide&nbsp; <input type="text" class="input" style="width:200px;" name="q" id="q" size="31" maxlength="255" value="" />&nbsp;<input type="submit" class="submit" name="sa" value="Go" /></form></td> +</tr> +</table> +<!-- END BREADCRUMB --> + +<br clear="all" /> + + +<!-- START CONTENT --> +<div id="content"> + + +<h1>Tutorial &minus; Static pages</h1> + +<p class="important"><strong>Note:</strong> This tutorial assumes you've downloaded CodeIgniter and <a href="../installation/index.html">installed the framework</a> in your development environment.</p> + +<p>The first thing you're going to do is set up a <strong>controller</strong> to handle static pages. +A controller is simply a class that helps delegate work. It is the glue of your +web application.</p> + +<p>For example, when a call is made to: <code>http://example.com/news/latest/10</code> We might imagine +that there is a controller named &quot;news&quot;. The method being called on news +would be &quot;latest&quot;. The news method's job could be to grab 10 +news items, and render them on the page. Very often in MVC, you'll see URL +patterns that match: <code>http://example.com/[controller-class]/[controller-method]/[arguments]</code> +As URL schemes become more complex, this may change. But for now, this is all we will need to know.</p> + +<p>Create a file at <dfn>application/controllers/pages.php</dfn> with the following code.</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="10"> +&lt;?php + +class Pages extends CI_Controller { + + public function view($page = 'home') + { + + } +} +</textarea> + +<p>You have created a class named &quot;pages&quot;, with a view method that accepts one argument named <var>$page</var>. +The pages class is extending the CI_Controller class. +This means that the new pages class can access the methods and variables defined in the CI_Controller class +(<dfn>system/core/Controller.php</dfn>).</p> + +<p>The <strong>controller is what will become the center of every request</strong> to your web application. +In very technical CodeIgniter discussions, it may be referred to as the <em>super object</em>. +Like any php class, you refer to it within your controllers as <var>$this</var>. +Referring to <var>$this</var> is how you will load libraries, views, and generally +command the framework.</p> + +<p>Now you've created your first method, it's time to make some basic page templates. +We will be creating two &quot;views&quot; (page templates) that act as our page footer and header.</p> + +<p>Create the header at <dfn>application/views/templates/header.php</dfn> and add the following code.</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="8"> +<html> +<head> + <title><?php echo $title ?> - CodeIgniter 2 Tutorial</title> +</head> +<body> + <h1>CodeIgniter 2 Tutorial</h1> + +</textarea> + +<p>The header contains the basic HTML code that you'll want to display before loading the main view, together with a heading. +It will also output the <var>$title</var> variable, which we'll define later in the controller. +Now create a footer at <dfn>application/views/templates/footer.php</dfn> that includes the following code:</p> + +<textarea class="textarea" style="width:100%" cols="50" rows="4"> +<strong>&#38;copy; 2011</strong> +</body> +</html> +</textarea> + +<h2>Adding logic to the controller</h2> + +<p>Earlier you set up a controller with a view() method. The method accepts one parameter, which is the name of the page to be loaded. +The static page templates will be located in the <dfn>application/views/pages/</dfn> directory.</p> + +<p>In that directory, create two files named <dfn>home.php</dfn> and <dfn>about.php</dfn>. +Within those files, type some text &minus; anything you'd like &minus; and save them. +If you like to be particularly un-original, try &quot;Hello World!&quot;.</p> + +<p>In order to load those pages, you'll have to check whether the requested page actually exists:</p> + +<pre> +public function view($page = 'home') +{ + + if ( ! file_exists(APPPATH.'/views/pages/'.$page.'.php')) + { + // Whoops, we don't have a page for that! + show_404(); + } + + $data['title'] = ucfirst($page); // Capitalize the first letter + + $this->load->view('templates/header', $data); + $this->load->view('pages/'.$page, $data); + $this->load->view('templates/footer', $data); + +} +</pre> + +<p>Now, when the page does exist, it is loaded, including the header and footer, and displayed to the user. If the page doesn't exist, a "404 Page not found" error is shown.</p> + +<p>The first line in this method checks whether the page actually exists. PHP's native <var>file_exists()</var> function is used to check whether the file is where it's expected to be. <var>show_404()</var> is a built-in CodeIgniter function that renders the default error page.</p> + +<p>In the header template, the <var>$title</var> variable was used to customize the page title. The value of title is defined in this method, but instead of assigning the value to a variable, it is assigned to the title element in the <var>$data</var> array.</p> + +<p>The last thing that has to be done is loading the views in the order they should be displayed. +The second parameter in the <var>view()</var> method is used to pass values to the view. Each value in the <var>$data</var> array is assigned to a variable with the name of its key. So the value of <var>$data['title']</var> in the controller is equivalent to $title in the view.<p> + +<h2>Routing</h2> + +<p>The controller is now functioning! Point your browser to <dfn>[your-site-url]index.php/pages/view</dfn> to see your page. When you visit <dfn>index.php/pages/view/about</dfn> you'll see the about page, again including the header and footer.</p> + +<p>Using custom routing rules, you have the power to map any URI to any controller and method, and break free from the normal convention: +<code>http://example.com/[controller-class]/[controller-method]/[arguments]</code></p> + +<p>Let's do that. Open the routing file located at <dfn>application/config/routes.php</dfn> and add the following two lines. Remove all other code that sets any element in the <var>$route</var> array.</p> + +<pre> +$route['default_controller'] = 'pages/view'; +$route['(:any)'] = 'pages/view/$1'; +</pre> + +<p>CodeIgniter reads its routing rules from top to bottom and routes the request to the first matching rule. Each rule is a regular expression +(left-side) mapped to a controller and method name separated by slashes (right-side). +When a request comes in, CodeIgniter looks for the first match, and calls the appropriate controller and method, possibly with arguments.</p> + +<p>More information about routing can be found in the URI Routing <a href="../general/routing.html">documentation</a>.</p> + +<p>Here, the second rule in the <var>$routes</var> array matches <strong>any</strong> request using the wildcard string <dfn>(:any)</dfn>. +and passes the parameter to the view() method of the pages class.</p> + +<p>Now visit <dfn>index.php/about</dfn>. Did it get routed correctly to the <var>view()</var> method +in the pages controller? Awesome!</p> + +</div> +<!-- END CONTENT --> + + +<div id="footer"> +<p> +Previous Topic:&nbsp;&nbsp;<a href="index.html">Introduction</a> +&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="#top">Top of Page</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +<a href="../index.html">User Guide Home</a>&nbsp;&nbsp;&nbsp;&middot;&nbsp;&nbsp; +Next Topic:&nbsp;&nbsp;<a href="news_section.html">News section</a> +</p> +<p><a href="http://codeigniter.com">CodeIgniter</a> &nbsp;&middot;&nbsp; Copyright &#169; 2006 - 2014 &nbsp;&middot;&nbsp; <a href="http://ellislab.com/">EllisLab, Inc.</a> &nbsp;&middot;&nbsp; Copyright &#169; 2014 - 2015 &nbsp;&middot;&nbsp; <a href="http://bcit.ca/">British Columbia Institute of Technology</a></p> +</div> + +</body> +</html> \ No newline at end of file diff --git a/user_guide/userguide.css b/user_guide/userguide.css new file mode 100644 index 0000000..f93ff0d --- /dev/null +++ b/user_guide/userguide.css @@ -0,0 +1,415 @@ +body { + margin: 0; + padding: 0; + font-family: Lucida Grande, Verdana, Geneva, Sans-serif; + font-size: 14px; + color: #333; + background-color: #fff; +} + +a { + color: #0134c5; + background-color: transparent; + text-decoration: none; + font-weight: normal; + outline-style: none; +} +a:visited { + color: #0134c5; + background-color: transparent; + text-decoration: none; + outline-style: none; +} +a:hover { + color: #000; + text-decoration: none; + background-color: transparent; + outline-style: none; +} + +#breadcrumb { + float: left; + background-color: transparent; + margin: 10px 0 0 42px; + padding: 0; + font-size: 10px; + color: #666; +} +#breadcrumb_right { + float: right; + width: 175px; + background-color: transparent; + padding: 8px 8px 3px 0; + text-align: right; + font-size: 10px; + color: #666; +} +#nav { + background-color: #494949; + margin: 0; + padding: 0; +} +#nav2 { + background: #fff url(images/nav_bg_darker.jpg) repeat-x left top; + padding: 0 310px 0 0; + margin: 0; + text-align: right; +} +#nav_inner { + background-color: transparent; + padding: 8px 12px 0 20px; + margin: 0; + font-family: Lucida Grande, Verdana, Geneva, Sans-serif; + font-size: 11px; +} + +#nav_inner h3 { + font-size: 12px; + color: #fff; + margin: 0; + padding: 0; +} + +#nav_inner .td_sep { + background: transparent url(images/nav_separator_darker.jpg) repeat-y left top; + width: 25%; + padding: 0 0 0 20px; +} +#nav_inner .td { + width: 25%; +} +#nav_inner p { + color: #eee; + background-color: transparent; + padding:0; + margin: 0 0 10px 0; +} +#nav_inner ul { + list-style-image: url(images/arrow.gif); + padding: 0 0 0 18px; + margin: 8px 0 12px 0; +} +#nav_inner li { + padding: 0; + margin: 0 0 4px 0; +} + +#nav_inner a { + color: #eee; + background-color: transparent; + text-decoration: none; + font-weight: normal; + outline-style: none; +} + +#nav_inner a:visited { + color: #eee; + background-color: transparent; + text-decoration: none; + outline-style: none; +} + +#nav_inner a:hover { + color: #ccc; + text-decoration: none; + background-color: transparent; + outline-style: none; +} + +#masthead { + margin: 0 40px 0 35px; + padding: 0 0 0 6px; + border-bottom: 1px solid #999; +} + +#masthead h1 { +background-color: transparent; +color: #e13300; +font-size: 18px; +font-weight: normal; +margin: 0; +padding: 0 0 6px 0; +} + +#searchbox { + background-color: transparent; + padding: 6px 40px 0 0; + text-align: right; + font-size: 10px; + color: #666; +} + +#img_welcome { + border-bottom: 1px solid #D0D0D0; + margin: 0 40px 0 40px; + padding: 0; + text-align: center; +} + +#content { + margin: 20px 40px 0 40px; + padding: 0; +} + +#content p { + margin: 12px 20px 12px 0; +} + +#content h1 { +color: #e13300; +border-bottom: 1px solid #666; +background-color: transparent; +font-weight: normal; +font-size: 24px; +margin: 0 0 20px 0; +padding: 3px 0 7px 3px; +} + +#content h2 { + background-color: transparent; + border-bottom: 1px solid #999; + color: #000; + font-size: 18px; + font-weight: bold; + margin: 28px 0 16px 0; + padding: 5px 0 6px 0; +} + +#content h3 { + background-color: transparent; + color: #333; + font-size: 16px; + font-weight: bold; + margin: 16px 0 15px 0; + padding: 0 0 0 0; +} + +#content h4 { + background-color: transparent; + color: #444; + font-size: 14px; + font-weight: bold; + margin: 22px 0 0 0; + padding: 0 0 0 0; +} + +#content img { + margin: auto; + padding: 0; +} + +#content code { + font-family: Monaco, Verdana, Sans-serif; + font-size: 12px; + background-color: #f9f9f9; + border: 1px solid #D0D0D0; + color: #002166; + display: block; + margin: 14px 0 14px 0; + padding: 12px 10px 12px 10px; +} + +#content pre { + font-family: Monaco, Verdana, Sans-serif; + font-size: 12px; + background-color: #f9f9f9; + border: 1px solid #D0D0D0; + color: #002166; + display: block; + margin: 14px 0 14px 0; + padding: 12px 10px 12px 10px; +} + +#content .path { + background-color: #EBF3EC; + border: 1px solid #99BC99; + color: #005702; + text-align: center; + margin: 0 0 14px 0; + padding: 5px 10px 5px 8px; +} + +#content dfn { + font-family: Lucida Grande, Verdana, Geneva, Sans-serif; + color: #00620C; + font-weight: bold; + font-style: normal; +} +#content var { + font-family: Lucida Grande, Verdana, Geneva, Sans-serif; + color: #8F5B00; + font-weight: bold; + font-style: normal; +} +#content samp { + font-family: Lucida Grande, Verdana, Geneva, Sans-serif; + color: #480091; + font-weight: bold; + font-style: normal; +} +#content kbd { + font-family: Lucida Grande, Verdana, Geneva, Sans-serif; + color: #A70000; + font-weight: bold; + font-style: normal; +} + +#content ul { + list-style-image: url(images/arrow.gif); + margin: 10px 0 12px 0; +} + +li.reactor { + list-style-image: url(images/reactor-bullet.png); +} +#content li { + margin-bottom: 9px; +} + +#content li p { + margin-left: 0; + margin-right: 0; +} + +#content .tableborder { + border: 1px solid #999; +} +#content th { + font-weight: bold; + text-align: left; + font-size: 12px; + background-color: #666; + color: #fff; + padding: 4px; +} + +#content .td { + font-weight: normal; + font-size: 12px; + padding: 6px; + background-color: #f3f3f3; +} + +#content .tdpackage { + font-weight: normal; + font-size: 12px; +} + +#content .important { + background: #FBE6F2; + border: 1px solid #D893A1; + color: #333; + margin: 10px 0 5px 0; + padding: 10px; +} + +#content .important p { + margin: 6px 0 8px 0; + padding: 0; +} + +#content .important .leftpad { + margin: 6px 0 8px 0; + padding-left: 20px; +} + +#content .critical { + background: #FBE6F2; + border: 1px solid #E68F8F; + color: #333; + margin: 10px 0 5px 0; + padding: 10px; +} + +#content .critical p { + margin: 5px 0 6px 0; + padding: 0; +} + + +#footer { +background-color: transparent; +font-size: 10px; +padding: 16px 0 15px 0; +margin: 20px 0 0 0; +text-align: center; +} + +#footer p { + font-size: 10px; + color: #999; + text-align: center; +} +#footer address { + font-style: normal; +} + +.center { + text-align: center; +} + +img { + padding:0; + border: 0; + margin: 0; +} + +.nopad { + padding:0; + border: 0; + margin: 0; +} + + +form { + margin: 0; + padding: 0; +} + +.input { + font-family: Lucida Grande, Verdana, Geneva, Sans-serif; + font-size: 11px; + color: #333; + border: 1px solid #B3B4BD; + width: 100%; + font-size: 11px; + height: 1.5em; + padding: 0; + margin: 0; +} + +.textarea { + font-family: Lucida Grande, Verdana, Geneva, Sans-serif; + font-size: 14px; + color: #143270; + background-color: #f9f9f9; + border: 1px solid #B3B4BD; + width: 100%; + padding: 6px; + margin: 0; +} + +.select { + background-color: #fff; + font-size: 11px; + font-weight: normal; + color: #333; + padding: 0; + margin: 0 0 3px 0; +} + +.checkbox { + background-color: transparent; + padding: 0; + border: 0; +} + +.submit { + background-color: #000; + color: #fff; + font-weight: normal; + font-size: 10px; + border: 1px solid #fff; + margin: 0; + padding: 1px 5px 2px 5px; +} \ No newline at end of file